xymon-4.3.28/0000775000076400007640000000000013037531515013215 5ustar rpmbuildrpmbuildxymon-4.3.28/lib/0000775000076400007640000000000013037531514013762 5ustar rpmbuildrpmbuildxymon-4.3.28/lib/osdefs.c0000664000076400007640000000227511615341300015407 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* Compatibility definitions for various OS's */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #include #include #include #include "osdefs.h" #ifndef HAVE_SNPRINTF int snprintf(char *str, size_t size, const char *format, ...) { va_list args; va_start(args, format); return vsprintf(str, format, args); } #endif #ifndef HAVE_VSNPRINTF int vsnprintf(char *str, size_t size, const char *format, va_list args) { return vsprintf(str, format, args); } #endif xymon-4.3.28/lib/sha1.c0000664000076400007640000002004411535462534014770 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This file is part of the Xymon monitor library, but was taken from the */ /* "mutt" source archive and adapted for use in Xymon. According to the */ /* copyright notice in the "mutt" version, this file is public domain. */ /*----------------------------------------------------------------------------*/ /* SHA-1 in C By Steve Reid , with small changes to make it fit into mutt by Thomas Roessler . 100% Public Domain. Test Vectors (from FIPS PUB 180-1) "abc" A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 A million repetitions of "a" 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F */ #include typedef unsigned int uint32_t; typedef struct { uint32_t state[5]; uint32_t count[2]; unsigned char buffer[64]; } SHA1_CTX; #if !defined(XYMON_BIG_ENDIAN) && !defined(XYMON_LITTLE_ENDIAN) #error "Endianness is UNDEFINED" #endif #define SHA1HANDSOFF #define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) /* blk0() and blk() perform the initial expand. */ /* I got the idea of expanding during the round function from SSLeay */ #ifdef XYMON_BIG_ENDIAN # define blk0(i) block->l[i] #else # define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \ |(rol(block->l[i],8)&0x00FF00FF)) #endif #define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \ ^block->l[(i+2)&15]^block->l[i&15],1)) /* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ #define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30); #define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); #define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); #define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); #define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); /* Hash a single 512-bit block. This is the core of the algorithm. */ static void SHA1Transform(uint32_t state[5], const unsigned char buffer[64]) { uint32_t a, b, c, d, e; typedef union { unsigned char c[64]; uint32_t l[16]; } CHAR64LONG16; #ifdef SHA1HANDSOFF CHAR64LONG16 block[1]; /* use array to appear as a pointer */ memcpy(block, buffer, 64); #else /* The following had better never be used because it causes the * pointer-to-const buffer to be cast into a pointer to non-const. * And the result is written through. I threw a "const" in, hoping * this will cause a diagnostic. */ CHAR64LONG16* block = (const CHAR64LONG16*)buffer; #endif /* Copy context->state[] to working vars */ a = state[0]; b = state[1]; c = state[2]; d = state[3]; e = state[4]; /* 4 rounds of 20 operations each. Loop unrolled. */ R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79); /* Add the working vars back into context.state[] */ state[0] += a; state[1] += b; state[2] += c; state[3] += d; state[4] += e; /* Wipe variables */ a = b = c = d = e = 0; #ifdef SHA1HANDSOFF memset(block, '\0', sizeof(block)); #endif } /* SHA1Init - Initialize new context */ static void SHA1Init(SHA1_CTX* context) { /* SHA1 initialization constants */ context->state[0] = 0x67452301; context->state[1] = 0xEFCDAB89; context->state[2] = 0x98BADCFE; context->state[3] = 0x10325476; context->state[4] = 0xC3D2E1F0; context->count[0] = context->count[1] = 0; } /* Run your data through this. */ static void SHA1Update(SHA1_CTX* context, const unsigned char* data, uint32_t len) { uint32_t i; uint32_t j; j = context->count[0]; if ((context->count[0] += len << 3) < j) context->count[1]++; context->count[1] += (len>>29); j = (j >> 3) & 63; if ((j + len) > 63) { memcpy(&context->buffer[j], data, (i = 64-j)); SHA1Transform(context->state, context->buffer); for ( ; i + 63 < len; i += 64) { SHA1Transform(context->state, &data[i]); } j = 0; } else i = 0; memcpy(&context->buffer[j], &data[i], len - i); } /* Add padding and return the message digest. */ static void SHA1Final(unsigned char digest[20], SHA1_CTX* context) { unsigned i; unsigned char finalcount[8]; unsigned char c; #if 0 /* untested "improvement" by DHR */ /* Convert context->count to a sequence of bytes * in finalcount. Second element first, but * big-endian order within element. * But we do it all backwards. */ unsigned char *fcp = &finalcount[8]; for (i = 0; i < 2; i++) { uint32_t t = context->count[i]; int j; for (j = 0; j < 4; t >>= 8, j++) *--fcp = (unsigned char) t } #else for (i = 0; i < 8; i++) { finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)] >> ((3-(i & 3)) * 8) ) & 255); /* Endian independent */ } #endif c = 0200; SHA1Update(context, &c, 1); while ((context->count[0] & 504) != 448) { c = 0000; SHA1Update(context, &c, 1); } SHA1Update(context, finalcount, 8); /* Should cause a SHA1Transform() */ for (i = 0; i < 20; i++) { digest[i] = (unsigned char) ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255); } /* Wipe variables */ memset(context, '0', sizeof(*context)); memset(&finalcount, '\0', sizeof(finalcount)); } /* * Not part of the original file. Added for use with Xymon, * to avoid namespace-pollution when compiled with OpenSSL. */ int mySHA1_Size(void) { return sizeof(SHA1_CTX); } void mySHA1_Init(void* context) { SHA1Init((SHA1_CTX *)context); } void mySHA1_Update(void* context, const unsigned char* data, uint32_t len) { SHA1Update((SHA1_CTX *)context, data, len); } void mySHA1_Final(unsigned char digest[20], void* context) { SHA1Final(digest, (SHA1_CTX *)context); } #ifdef STANDALONE #include #include #include int main(int argc, char *argv[]) { FILE *fd; int n; unsigned char buf[8192]; void *context; unsigned char digest[20]; int i; fd = fopen(argv[1], "r"); if (fd == NULL) return 1; context = (void *)malloc(mySHA1_Size()); mySHA1_Init(context); while ((n = fread(buf, 1, sizeof(buf), fd)) > 0) mySHA1_Update(context, buf, n); fclose(fd); mySHA1_Final(digest, context); for (i=0; (i < sizeof(digest)); i++) { printf("%02x", digest[i]); } printf("\n"); return 0; } #endif xymon-4.3.28/lib/rmdconst.h0000664000076400007640000002162511535462534016000 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This file is part of the Xymon monitor library, but was taken from the */ /* FreeBSD sources. It was originally written by Eric Young, and is NOT */ /* licensed under the GPL. Please adhere the original copyright notice below. */ /*----------------------------------------------------------------------------*/ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ #define KL0 0x00000000L #define KL1 0x5A827999L #define KL2 0x6ED9EBA1L #define KL3 0x8F1BBCDCL #define KL4 0xA953FD4EL #define KR0 0x50A28BE6L #define KR1 0x5C4DD124L #define KR2 0x6D703EF3L #define KR3 0x7A6D76E9L #define KR4 0x00000000L #define WL00 0 #define SL00 11 #define WL01 1 #define SL01 14 #define WL02 2 #define SL02 15 #define WL03 3 #define SL03 12 #define WL04 4 #define SL04 5 #define WL05 5 #define SL05 8 #define WL06 6 #define SL06 7 #define WL07 7 #define SL07 9 #define WL08 8 #define SL08 11 #define WL09 9 #define SL09 13 #define WL10 10 #define SL10 14 #define WL11 11 #define SL11 15 #define WL12 12 #define SL12 6 #define WL13 13 #define SL13 7 #define WL14 14 #define SL14 9 #define WL15 15 #define SL15 8 #define WL16 7 #define SL16 7 #define WL17 4 #define SL17 6 #define WL18 13 #define SL18 8 #define WL19 1 #define SL19 13 #define WL20 10 #define SL20 11 #define WL21 6 #define SL21 9 #define WL22 15 #define SL22 7 #define WL23 3 #define SL23 15 #define WL24 12 #define SL24 7 #define WL25 0 #define SL25 12 #define WL26 9 #define SL26 15 #define WL27 5 #define SL27 9 #define WL28 2 #define SL28 11 #define WL29 14 #define SL29 7 #define WL30 11 #define SL30 13 #define WL31 8 #define SL31 12 #define WL32 3 #define SL32 11 #define WL33 10 #define SL33 13 #define WL34 14 #define SL34 6 #define WL35 4 #define SL35 7 #define WL36 9 #define SL36 14 #define WL37 15 #define SL37 9 #define WL38 8 #define SL38 13 #define WL39 1 #define SL39 15 #define WL40 2 #define SL40 14 #define WL41 7 #define SL41 8 #define WL42 0 #define SL42 13 #define WL43 6 #define SL43 6 #define WL44 13 #define SL44 5 #define WL45 11 #define SL45 12 #define WL46 5 #define SL46 7 #define WL47 12 #define SL47 5 #define WL48 1 #define SL48 11 #define WL49 9 #define SL49 12 #define WL50 11 #define SL50 14 #define WL51 10 #define SL51 15 #define WL52 0 #define SL52 14 #define WL53 8 #define SL53 15 #define WL54 12 #define SL54 9 #define WL55 4 #define SL55 8 #define WL56 13 #define SL56 9 #define WL57 3 #define SL57 14 #define WL58 7 #define SL58 5 #define WL59 15 #define SL59 6 #define WL60 14 #define SL60 8 #define WL61 5 #define SL61 6 #define WL62 6 #define SL62 5 #define WL63 2 #define SL63 12 #define WL64 4 #define SL64 9 #define WL65 0 #define SL65 15 #define WL66 5 #define SL66 5 #define WL67 9 #define SL67 11 #define WL68 7 #define SL68 6 #define WL69 12 #define SL69 8 #define WL70 2 #define SL70 13 #define WL71 10 #define SL71 12 #define WL72 14 #define SL72 5 #define WL73 1 #define SL73 12 #define WL74 3 #define SL74 13 #define WL75 8 #define SL75 14 #define WL76 11 #define SL76 11 #define WL77 6 #define SL77 8 #define WL78 15 #define SL78 5 #define WL79 13 #define SL79 6 #define WR00 5 #define SR00 8 #define WR01 14 #define SR01 9 #define WR02 7 #define SR02 9 #define WR03 0 #define SR03 11 #define WR04 9 #define SR04 13 #define WR05 2 #define SR05 15 #define WR06 11 #define SR06 15 #define WR07 4 #define SR07 5 #define WR08 13 #define SR08 7 #define WR09 6 #define SR09 7 #define WR10 15 #define SR10 8 #define WR11 8 #define SR11 11 #define WR12 1 #define SR12 14 #define WR13 10 #define SR13 14 #define WR14 3 #define SR14 12 #define WR15 12 #define SR15 6 #define WR16 6 #define SR16 9 #define WR17 11 #define SR17 13 #define WR18 3 #define SR18 15 #define WR19 7 #define SR19 7 #define WR20 0 #define SR20 12 #define WR21 13 #define SR21 8 #define WR22 5 #define SR22 9 #define WR23 10 #define SR23 11 #define WR24 14 #define SR24 7 #define WR25 15 #define SR25 7 #define WR26 8 #define SR26 12 #define WR27 12 #define SR27 7 #define WR28 4 #define SR28 6 #define WR29 9 #define SR29 15 #define WR30 1 #define SR30 13 #define WR31 2 #define SR31 11 #define WR32 15 #define SR32 9 #define WR33 5 #define SR33 7 #define WR34 1 #define SR34 15 #define WR35 3 #define SR35 11 #define WR36 7 #define SR36 8 #define WR37 14 #define SR37 6 #define WR38 6 #define SR38 6 #define WR39 9 #define SR39 14 #define WR40 11 #define SR40 12 #define WR41 8 #define SR41 13 #define WR42 12 #define SR42 5 #define WR43 2 #define SR43 14 #define WR44 10 #define SR44 13 #define WR45 0 #define SR45 13 #define WR46 4 #define SR46 7 #define WR47 13 #define SR47 5 #define WR48 8 #define SR48 15 #define WR49 6 #define SR49 5 #define WR50 4 #define SR50 8 #define WR51 1 #define SR51 11 #define WR52 3 #define SR52 14 #define WR53 11 #define SR53 14 #define WR54 15 #define SR54 6 #define WR55 0 #define SR55 14 #define WR56 5 #define SR56 6 #define WR57 12 #define SR57 9 #define WR58 2 #define SR58 12 #define WR59 13 #define SR59 9 #define WR60 9 #define SR60 12 #define WR61 7 #define SR61 5 #define WR62 10 #define SR62 15 #define WR63 14 #define SR63 8 #define WR64 12 #define SR64 8 #define WR65 15 #define SR65 5 #define WR66 10 #define SR66 12 #define WR67 4 #define SR67 9 #define WR68 1 #define SR68 12 #define WR69 5 #define SR69 5 #define WR70 8 #define SR70 14 #define WR71 7 #define SR71 6 #define WR72 6 #define SR72 8 #define WR73 2 #define SR73 13 #define WR74 13 #define SR74 6 #define WR75 14 #define SR75 5 #define WR76 0 #define SR76 15 #define WR77 3 #define SR77 13 #define WR78 9 #define SR78 11 #define WR79 11 #define SR79 11 xymon-4.3.28/lib/notifylog.h0000664000076400007640000000203111615341300016131 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __NOTIFYLOG_H_ #define __NOTIFYLOG_H_ extern void do_notifylog(FILE *output, int maxcount, int maxminutes, char *fromtime, char *totime, char *pagematch, char *expagematch, char *hostmatch, char *exhostmatch, char *testmatch, char *extestmatch, char *rcptmatch, char *exrcptmatch); #endif xymon-4.3.28/lib/availability.c0000664000076400007640000004322312603243142016577 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This file contains code to calculate availability percentages and do */ /* SLA calculations. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: availability.c 7678 2015-10-01 14:42:42Z jccleaver $"; #include #include #include #include #include #include #include "libxymon.h" typedef struct { int dow; time_t start, end; } reptime_t; static reptime_t reptimes[10]; static int reptimecnt = 0; replog_t *reploghead = NULL; char *durationstr(time_t duration) { static char dur[100]; char dhelp[100]; if (duration <= 0) { strcpy(dur, "none"); } else { dur[0] = '\0'; if (duration > 86400) { sprintf(dhelp, "%u days ", (unsigned int)(duration / 86400)); duration %= 86400; strcpy(dur, dhelp); } sprintf(dhelp, "%u:%02u:%02u", (unsigned int)(duration / 3600), (unsigned int)((duration % 3600) / 60), (unsigned int)(duration % 60)); strcat(dur, dhelp); } return dur; } static time_t secs(int hour, int minute, int sec) { return (hour*3600 + minute*60 + sec); } static void build_reportspecs(char *reporttime) { /* Timespec: W:HHMM:HHMM */ char *spec, *timespec; int dow, start, end; int found; reptimecnt = 0; spec = strchr(reporttime, '='); timespec = strdup(spec ? (spec+1) : reporttime); spec = strtok(timespec, ","); while (spec) { if (*spec == '*') { dow = -1; found = sscanf(spec+1, ":%d:%d", &start, &end); } else if ((*spec == 'W') || (*spec == 'w')) { dow = -2; found = sscanf(spec+1, ":%d:%d", &start, &end); } else { found = sscanf(spec, "%d:%d:%d", &dow, &start, &end); } if (found < 2) { errprintf("build_reportspecs: Found too few items in %s\n", spec); } reptimes[reptimecnt].dow = dow; reptimes[reptimecnt].start = secs((start / 100), (start % 100), 0); reptimes[reptimecnt].end = secs((end / 100), (end % 100), 0); reptimecnt++; spec = strtok(NULL, ","); } xfree(timespec); } static unsigned long reportduration_oneday(int eventdow, time_t eventstart, time_t eventend) { int i; unsigned long result = 0; for (i=0; (i= 1) && (eventdow <= 5)) ) { if ((reptimes[i].start > eventend) || (reptimes[i].end < eventstart)) { /* Outside our window */ } else { time_t winstart, winend; winstart = ((eventstart < reptimes[i].start) ? reptimes[i].start : eventstart); winend = ((eventend > reptimes[i].end) ? reptimes[i].end : eventend); result += (winend - winstart); } } } return result; } static unsigned long reportingduration(time_t eventstart, time_t eventduration) { struct tm start, end; time_t eventend; unsigned long result; memcpy(&start, localtime(&eventstart), sizeof(start)); eventend = eventstart + eventduration; memcpy(&end, localtime(&eventend), sizeof(end)); if ((start.tm_mday == end.tm_mday) && (start.tm_mon == end.tm_mon) && (start.tm_year == end.tm_year)) result = reportduration_oneday(start.tm_wday, secs(start.tm_hour, start.tm_min, start.tm_sec), secs(end.tm_hour, end.tm_min, end.tm_sec)); else { int fulldays = (eventduration - (86400-secs(start.tm_hour, start.tm_min, start.tm_sec))) / 86400; int curdow = (start.tm_wday == 6) ? 0 : (start.tm_wday+1); result = reportduration_oneday(start.tm_wday, secs(start.tm_hour, start.tm_min, start.tm_sec), 86400); while (fulldays) { result += reportduration_oneday(curdow, 0, 86400); curdow = (curdow == 6) ? 0 : (curdow+1); fulldays--; } result += reportduration_oneday(curdow, 0, secs(end.tm_hour, end.tm_min, end.tm_sec)); } return result; } static char *parse_histlogfile(char *hostname, char *servicename, char *timespec) { char cause[MAX_LINE_LEN]; char fn[PATH_MAX]; char *p; FILE *fd; char l[MAX_LINE_LEN]; int causefull = 0; cause[0] = '\0'; sprintf(fn, "%s/%s", xgetenv("XYMONHISTLOGS"), commafy(hostname)); for (p = strrchr(fn, '/'); (*p); p++) if (*p == ',') *p = '_'; sprintf(p, "/%s/%s", servicename, timespec); dbgprintf("Looking at history logfile %s\n", fn); fd = fopen(fn, "r"); if (fd != NULL) { while (!causefull && fgets(l, sizeof(l), fd)) { p = strchr(l, '\n'); if (p) *p = '\0'; if ((l[0] == '&') && (strncmp(l, "&green", 6) != 0)) { p = skipwhitespace(skipword(l)); if ((strlen(cause) + strlen(p) + strlen("
\n") + 1) < sizeof(cause)) { strcat(cause, p); strcat(cause, "
\n"); } else causefull = 1; } } #if 1 if (strlen(cause) == 0) { strcpy(cause, "See detailed log"); } #else /* What is this code supposed to do ? The sscanf seemingly never succeeds */ /* storner, 2006-06-02 */ if (strlen(cause) == 0) { int offset; rewind(fd); if (fgets(l, sizeof(l), fd)) { p = strchr(l, '\n'); if (p) *p = '\0'; if (sscanf(l, "%*s %*s %*s %*s %*s %*s %*s %n", &offset) == 1) { strncpy(cause, l+offset, sizeof(cause)); } else { errprintf("Scan of file %s failed, l='%s'\n", fn, l); } cause[sizeof(cause)-1] = '\0'; } } #endif if (causefull) { cause[sizeof(cause) - strlen(" [Truncated]") - 1] = '\0'; strcat(cause, " [Truncated]"); } fclose(fd); } else { strcpy(cause, "No historical status available"); } return strdup(cause); } static char *get_historyline(char *buf, int bufsize, FILE *fd, int *err, char *colstr, unsigned int *start, unsigned int *duration, int *scanres) { int ok; do { ok = 1; if (fgets(buf, bufsize, fd) == NULL) { return NULL; } if (strlen(buf) < 25) { ok = 0; *err += 1; dbgprintf("Bad history line (short): %s\n", buf); continue; } *scanres = sscanf(buf+25, "%s %u %u", colstr, start, duration); if (*scanres < 2) { ok = 0; *err += 1; dbgprintf("Bad history line (missing items): %s\n", buf); continue; } if (parse_color(colstr) == -1) { ok = 0; *err += 1; dbgprintf("Bad history line (bad color string): %s\n", buf); continue; } } while (!ok); return buf; } static int scan_historyfile(FILE *fd, time_t fromtime, time_t totime, char *buf, size_t bufsize, time_t *starttime, time_t *duration, char *colstr) { time_t start, dur; unsigned int uistart, uidur; int scanres; int err = 0; /* * Format of history entries: * asctime-stamp newcolor starttime [duration] */ /* Is start of history after our report-end time ? */ rewind(fd); if (!get_historyline(buf, bufsize, fd, &err, colstr, &uistart, &uidur, &scanres)) { *starttime = getcurrenttime(NULL); *duration = 0; strcpy(colstr, "clear"); return err; } if (scanres == 2) uidur = getcurrenttime(NULL)-uistart; start = uistart; dur = uidur; if (start > totime) { *starttime = start; *duration = dur; strcpy(colstr, "clear"); return 0; } /* First, do a quick scan through the file to find the approximate position where we should start */ while ((start+dur) < fromtime) { if (get_historyline(buf, bufsize, fd, &err, colstr, &uistart, &uidur, &scanres)) { start = uistart; dur = uidur; if (scanres == 2) dur = getcurrenttime(NULL) - start; if (scanres >= 2) { dbgprintf("Skipped to entry starting %lu\n", start); if ((start + dur) < fromtime) { fseeko(fd, 2048, SEEK_CUR); if (!fgets(buf, bufsize, fd)) {}; /* Skip partial line */ } } } else { start = getcurrenttime(NULL); dur = 0; } }; /* We know the start position of the logfile is between current pos and (current-~2048 bytes) */ if (ftello(fd) < 2300) rewind(fd); else { fseeko(fd, -2300, SEEK_CUR); if (!fgets(buf, bufsize, fd)) {}; /* Skip partial line */ } /* Read one line at a time until we hit start of our report period */ do { if (get_historyline(buf, bufsize, fd, &err, colstr, &uistart, &uidur, &scanres)) { start = uistart; dur = uidur; if (scanres == 2) dur = getcurrenttime(NULL) - start; dbgprintf("Got entry starting %lu lasting %lu\n", start, dur); } else { start = getcurrenttime(NULL); dur = 0; } } while ((start+dur) < fromtime); dbgprintf("Reporting starts with this entry: %s\n", buf); *starttime = start; *duration = dur; return err; } static char *timename(char *timestring) { static char timespec[26]; char *timecopy; char *tokens[5]; int i; /* Compute the timespec string used as the name of the historical logfile */ *timespec = '\0'; timecopy = strdup(timestring); tokens[0] = tokens[1] = tokens[2] = tokens[3] = tokens[4] = NULL; tokens[0] = strtok(timecopy, " "); i = 0; while (tokens[i] && (i < 4)) { i++; tokens[i] = strtok(NULL, " "); } if (tokens[4]) { /* Got all 5 elements */ snprintf(timespec, sizeof(timespec), "%s_%s_%s_%s_%s", tokens[0], tokens[1], tokens[2], tokens[3], tokens[4]); } else { errprintf("Bad timespec in history file: %s\n", timestring); } xfree(timecopy); return timespec; } int parse_historyfile(FILE *fd, reportinfo_t *repinfo, char *hostname, char *servicename, time_t fromtime, time_t totime, int for_history, double warnlevel, double greenlevel, int warnstops, char *reporttime) { char l[MAX_LINE_LEN]; time_t starttime, duration; unsigned int uistart, uidur; char colstr[MAX_LINE_LEN]; int color, done, i, scanres; int fileerrors = 0; repinfo->fstate = "OK"; repinfo->withreport = 0; repinfo->reportstart = getcurrenttime(NULL); for (i=0; (icount[i] = 0; repinfo->fullduration[i] = 0; repinfo->fullpct[i] = 0.0; repinfo->reportduration[i] = 0; repinfo->reportpct[i] = 0.0; } repinfo->fullavailability = 0.0; repinfo->reportavailability = 0.0; repinfo->fullstops = 0; repinfo->reportstops = 0; if (reporttime) build_reportspecs(reporttime); /* Sanity check */ if (totime > getcurrenttime(NULL)) totime = getcurrenttime(NULL); /* If for_history and fromtime is 0, don't do any seeking */ if (!for_history || (fromtime > 0)) { fileerrors = scan_historyfile(fd, fromtime, totime, l, sizeof(l), &starttime, &duration, colstr); } else { /* Already positioned (probably in a pipe) */ if (get_historyline(l, sizeof(l), fd, &fileerrors, colstr, &uistart, &uidur, &scanres)) { starttime = uistart; duration = uidur; if (scanres == 2) duration = getcurrenttime(NULL) - starttime; } else { starttime = getcurrenttime(NULL); duration = 0; strcpy(colstr, "clear"); fileerrors = 1; } } if (starttime > totime) { repinfo->fullavailability = repinfo->reportavailability = 100.0; repinfo->fullpct[COL_CLEAR] = repinfo->reportpct[COL_CLEAR] = 100.0; repinfo->count[COL_CLEAR] = 1; return COL_CLEAR; } /* If event starts before our fromtime, adjust starttime and duration */ if (starttime < fromtime) { duration -= (fromtime - starttime); starttime = fromtime; } repinfo->reportstart = starttime; done = 0; do { /* If event ends after our reportend, adjust duration */ if ((starttime + duration) > totime) duration = (totime - starttime); strcat(colstr, " "); color = parse_color(colstr); if (color != -1) { unsigned long sladuration = 0; dbgprintf("In-range entry starting %lu lasting %lu color %d: %s", starttime, duration, color, l); repinfo->count[color]++; repinfo->fullduration[color] += duration; if (color > COL_YELLOW) repinfo->fullstops++; if (reporttime) { sladuration = reportingduration(starttime, duration); repinfo->reportduration[color] += sladuration; if ((color > COL_YELLOW) && (sladuration > 0)) repinfo->reportstops++; } if (for_history || ((hostname != NULL) && (servicename != NULL))) { replog_t *newentry; char *timespec = timename(l); newentry = (replog_t *) malloc(sizeof(replog_t)); newentry->starttime = starttime; newentry->duration = duration; newentry->color = color; newentry->affectssla = (reporttime && (sladuration > 0)); if (!for_history && timespec && (color != COL_GREEN)) { newentry->cause = parse_histlogfile(hostname, servicename, timespec); } else newentry->cause = ""; newentry->timespec = (timespec ? strdup(timespec): NULL); newentry->next = reploghead; reploghead = newentry; } } if ((starttime + duration) < totime) { if (get_historyline(l, sizeof(l), fd, &fileerrors, colstr, &uistart, &uidur, &scanres)) { starttime = uistart; duration = uidur; if (scanres == 2) duration = getcurrenttime(NULL) - starttime; } else done = 1; } else done = 1; } while (!done); for (i=0; (ifullduration[i]); repinfo->fullpct[i] = (100.0*repinfo->fullduration[i] / (totime - repinfo->reportstart)); } repinfo->fullavailability = 100.0 - repinfo->fullpct[COL_RED]; if (reporttime) { repinfo->withreport = 1; duration = repinfo->reportduration[COL_GREEN] + repinfo->reportduration[COL_YELLOW] + repinfo->reportduration[COL_RED] + repinfo->reportduration[COL_CLEAR]; if (duration > 0) { repinfo->reportpct[COL_GREEN] = (100.0*repinfo->reportduration[COL_GREEN] / duration); repinfo->reportpct[COL_YELLOW] = (100.0*repinfo->reportduration[COL_YELLOW] / duration); repinfo->reportpct[COL_RED] = (100.0*repinfo->reportduration[COL_RED] / duration); repinfo->reportpct[COL_CLEAR] = (100.0*repinfo->reportduration[COL_CLEAR] / duration); repinfo->reportavailability = 100.0 - repinfo->reportpct[COL_RED] - repinfo->reportpct[COL_CLEAR]; if (repinfo->reportavailability > greenlevel) color = COL_GREEN; else if (repinfo->reportavailability >= warnlevel) color = COL_YELLOW; else color = COL_RED; if ((warnstops >= 0) && (repinfo->reportstops > warnstops)) color = COL_RED; } else { /* Reporting period has no match with REPORTTIME setting */ repinfo->reportpct[COL_CLEAR] = 100.0; repinfo->reportavailability = 100.0; color = COL_GREEN; } } else { if (repinfo->fullavailability > greenlevel) color = COL_GREEN; else if (repinfo->fullavailability >= warnlevel) color = COL_YELLOW; else color = COL_RED; if ((warnstops >= 0) && (repinfo->fullstops > warnstops)) color = COL_RED; /* Copy the full percentages/durations to the SLA ones */ repinfo->reportavailability = repinfo->fullavailability; repinfo->reportstops = repinfo->fullstops; for (i=0; (ireportduration[i] = repinfo->fullduration[i]; repinfo->reportpct[i] = repinfo->fullpct[i]; } } if (fileerrors) repinfo->fstate = "NOTOK"; return color; } replog_t *save_replogs(void) { replog_t *tmp = reploghead; reploghead = NULL; return tmp; } void restore_replogs(replog_t *head) { reploghead = head; } int history_color(FILE *fd, time_t snapshot, time_t *starttime, char **histlogname) { char l[MAX_LINE_LEN]; time_t duration; char colstr[MAX_LINE_LEN]; int color; char *p; *histlogname = NULL; scan_historyfile(fd, snapshot, snapshot, l, sizeof(l), starttime, &duration, colstr); strcat(colstr, " "); color = parse_color(colstr); if ((color == COL_PURPLE) || (color == -1)) { color = -2; } p = timename(l); if (p) *histlogname = strdup(p); return color; } #ifdef STANDALONE time_t reportstart, reportend; double reportgreenlevel = 99.995; double reportwarnlevel = 98.0; int warnstops = -1; int main(int argc, char *argv[]) { FILE *fd; reportinfo_t repinfo; int i, color; char *p, *hostsvc, *host, *svc; replog_t *rwalk; debug=1; if (argc != 4) { fprintf(stderr, "Usage: %s HISTFILE STARTTIME ENDTIME\n", argv[0]); fprintf(stderr, "Start- and end-times are in Unix epoch format - date +%%s\n"); return 1; } fd = fopen(argv[1], "r"); if (fd == NULL) { printf("Cannot open %s\n", argv[1]); exit(1); } reportstart = atol(argv[2]); reportend = atol(argv[3]); hostsvc = strdup(argv[1]); p = strrchr(hostsvc, '.'); *p = '\0'; svc = p+1; p = strrchr(hostsvc, '/'); host = p+1; while ((p = strchr(host, ','))) *p = '.'; color = parse_historyfile(fd, &repinfo, host, svc, reportstart, reportend, 0, reportwarnlevel, reportgreenlevel, warnstops, NULL); for (i=0; (inext) { char start[30]; char end[30]; char dur[30], dhelp[30]; time_t endtime; time_t duration; strftime(start, sizeof(start), "%a %b %d %H:%M:%S %Y", localtime(&rwalk->starttime)); endtime = rwalk->starttime + rwalk->duration; strftime(end, sizeof(end), "%a %b %d %H:%M:%S %Y", localtime(&endtime)); duration = rwalk->duration; dur[0] = '\0'; if (duration > 86400) { sprintf(dhelp, "%lu days ", (duration / 86400)); duration %= 86400; strcpy(dur, dhelp); } sprintf(dhelp, "%lu:%02lu:%02lu", duration / 3600, ((duration % 3600) / 60), (duration % 60)); strcat(dur, dhelp); dbgprintf("Start: %s, End: %s, Color: %s, Duration: %s, Cause: %s\n", start, end, colorname(rwalk->color), dur, rwalk->cause); } return 0; } #endif xymon-4.3.28/lib/memory.c0000664000076400007640000001710012271166607015443 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains memory management routines. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: memory.c 7371 2014-01-26 11:12:07Z storner $"; #include #include #include #include #define LIB_MEMORY_C_COMPILE 1 #include "libxymon.h" #ifdef MEMORY_DEBUG static xmemory_t *mhead = NULL; static xmemory_t *dmem; static void *allocend, *copyend; #endif #ifdef MEMORY_DEBUG void add_to_memlist(void *ptr, size_t memsize) { xmemory_t *newitem; newitem = (xmemory_t *)malloc(sizeof(xmemory_t)); newitem->sdata = ptr; newitem->ssize = memsize; newitem->next = mhead; mhead = newitem; } static void dump_memitems(void) { xmemory_t *mwalk; for (mwalk = mhead; (mwalk); mwalk = mwalk->next) { errprintf("%8x : %5d\n", mwalk->sdata, mwalk->ssize); } } static xmemory_t *find_in_memlist(void *ptr) { xmemory_t *mwalk = mhead; int found = 0; while (mwalk) { found = (((void *)ptr >= (void *)mwalk->sdata) && ((void *)ptr < (void *)(mwalk->sdata + mwalk->ssize))); if (found) return mwalk; mwalk = mwalk->next; } return NULL; } void remove_from_memlist(void *ptr) { xmemory_t *mwalk, *mitem; if (ptr == NULL) { errprintf("remove_from_memlist called with NULL pointer\n"); dump_memitems(); abort(); } mitem= find_in_memlist(ptr); if (mitem == NULL) { errprintf("remove_from_memlist called with bogus pointer\n"); abort(); } if (mitem == mhead) { mhead = mhead->next; free(mitem); } else { for (mwalk = mhead; (mwalk->next != mitem); mwalk = mwalk->next) ; mwalk->next = mitem->next; free(mitem); } } #endif const char *xfreenullstr = "xfree: Trying to free a NULL pointer\n"; void *xcalloc(size_t nmemb, size_t size) { void *result; result = calloc(nmemb, size); if (result == NULL) { errprintf("xcalloc: Out of memory!\n"); abort(); } #ifdef MEMORY_DEBUG add_to_memlist(result, nmemb*size); #endif return result; } void *xmalloc(size_t size) { void *result; result = malloc(size); if (result == NULL) { errprintf("xmalloc: Out of memory!\n"); abort(); } #ifdef MEMORY_DEBUG add_to_memlist(result, size); #endif return result; } void *xrealloc(void *ptr, size_t size) { void *result; if (ptr == NULL) { errprintf("xrealloc: Cannot realloc NULL pointer\n"); abort(); } #ifdef MEMORY_DEBUG dmem = find_in_memlist(ptr); if (dmem == NULL) { errprintf("xrealloc: Called with bogus pointer\n"); abort(); } #endif result = realloc(ptr, size); if (result == NULL) { errprintf("xrealloc: Out of memory!\n"); abort(); } #ifdef MEMORY_DEBUG dmem->sdata = result; dmem->ssize = size; #endif return result; } char *xstrdup(const char *s) { char *result; if (s == NULL) { errprintf("xstrdup: Cannot dup NULL string\n"); abort(); } result = strdup(s); if (result == NULL) { errprintf("xstrdup: Out of memory\n"); abort(); } #ifdef MEMORY_DEBUG add_to_memlist(result, strlen(result)+1); #endif return result; } char *xstrcat(char *dest, const char *src) { if (src == NULL) { errprintf("xstrcat: NULL destination\n"); abort(); } if (dest == NULL) { errprintf("xstrcat: NULL destination\n"); abort(); } #ifdef MEMORY_DEBUG dmem = find_in_memlist(dest); if (dmem == NULL) { errprintf("xstrcat: Bogus destination\n"); abort(); } allocend = dmem->sdata + dmem->ssize - 1; copyend = dest + strlen(dest) + strlen(src); if ((void *)copyend > (void *)allocend) { errprintf("xstrcat: Overwrite of %d bytes\n", (copyend - allocend)); abort(); } #endif strcat(dest, src); return dest; } char *xstrncat(char *dest, const char *src, size_t maxlen) { if (src == NULL) { errprintf("xstrncat: NULL destination\n"); abort(); } if (dest == NULL) { errprintf("xstrncat: NULL destination\n"); abort(); } #ifdef MEMORY_DEBUG dmem = find_in_memlist(dest); if (dmem == NULL) { errprintf("xstrncat: Bogus destination\n"); abort(); } allocend = dmem->sdata + dmem->ssize - 1; if (strlen(src) <= maxlen) copyend = dest + strlen(dest) + strlen(src); else copyend = dest + strlen(dest) + maxlen; if ((void *)copyend > (void *)allocend) { errprintf("xstrncat: Potential overwrite of %d bytes\n", (copyend - allocend)); abort(); } if (strlen(dest) + strlen(src) >= maxlen) { errprintf("xstrncat: destination is not NULL terminated - dst '%s', src '%s', max %d\n", dest, src, maxlen); } #endif strncat(dest, src, maxlen); return dest; } char *xstrcpy(char *dest, const char *src) { if (src == NULL) { errprintf("xstrcpy: NULL destination\n"); abort(); } if (dest == NULL) { errprintf("xstrcpy: NULL destination\n"); abort(); } #ifdef MEMORY_DEBUG dmem = find_in_memlist(dest); if (dmem == NULL) { errprintf("xstrcpy: Bogus destination\n"); abort(); } allocend = dmem->sdata + dmem->ssize - 1; copyend = dest + strlen(src); if ((void *)copyend > (void *)allocend) { errprintf("xstrcpy: Overwrite of %d bytes\n", (copyend - allocend)); abort(); } #endif strcpy(dest, src); return dest; } char *xstrncpy(char *dest, const char *src, size_t maxlen) { if (src == NULL) { errprintf("xstrncpy: NULL destination\n"); abort(); } if (dest == NULL) { errprintf("xstrncpy: NULL destination\n"); abort(); } #ifdef MEMORY_DEBUG dmem = find_in_memlist(dest); if (dmem == NULL) { errprintf("xstrncpy: Bogus destination\n"); abort(); } allocend = dmem->sdata + dmem->ssize - 1; if (strlen(src) <= maxlen) copyend = dest + strlen(src); else copyend = dest + maxlen; if ((void *)copyend > (void *)allocend) { errprintf("xstrncpy: Potential overwrite of %d bytes\n", (copyend - allocend)); abort(); } if (strlen(src) >= maxlen) { errprintf("xstrncpy: destination is not NULL terminated - src '%s', max %d\n", dest, src, maxlen); } #endif strncpy(dest, src, maxlen); return dest; } int xsprintf(char *dest, const char *fmt, ...) { va_list args; size_t printedbytes; #ifdef MEMORY_DEBUG size_t availablebytes; #endif if (dest == NULL) { errprintf("xsprintf: NULL destination\n"); abort(); } #ifdef MEMORY_DEBUG dmem = find_in_memlist(dest); if (dmem == NULL) { errprintf("xsprintf: Bogus destination\n"); abort(); } availablebytes = (dmem->sdata + dmem->ssize - dest); va_start(args, fmt); printedbytes = vsnprintf(dest, availablebytes, fmt, args); va_end(args); if (printedbytes >= availablebytes) { errprintf("xsprintf: Output was truncated\n"); abort(); } #else va_start(args, fmt); printedbytes = vsprintf(dest, fmt, args); va_end(args); #endif return printedbytes; } char *xresultbuf(int maxsz) { static char rrbuf[10000]; static char *rrbufnext = rrbuf; char *result; if ((rrbufnext + maxsz) >= (rrbuf + sizeof(rrbuf))) result = rrbufnext = rrbuf; else { result = rrbufnext; rrbufnext += maxsz; } return result; } xymon-4.3.28/lib/osdefs.h0000664000076400007640000000230111615341300015402 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* Compatibility definitions for various OS's */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __LIBXYMON_OSDEFS_H__ #define __LIBXYMON_OSDEFS_H__ #include "config.h" #include #include #ifndef HAVE_SOCKLEN_T typedef unsigned int socklen_t; #endif #ifndef HAVE_SNPRINTF extern int snprintf(char *str, size_t size, const char *format, ...); #endif #ifndef HAVE_VSNPRINTF extern int vsnprintf(char *str, size_t size, const char *format, va_list ap); #endif #endif xymon-4.3.28/lib/calc.c0000664000076400007640000001102011615341300015012 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2003-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: calc.c 6712 2011-07-31 21:01:52Z storner $"; #include #include #include #include #include #include "libxymon.h" long compute(char *expression, int *error) { /* * This routine evaluates an expression. * * Expressions are of the form "expr [operator expr]" or "(expr)" * "operator" is + - / * % & | && || > >= < <= == * * All operators have equal precedence! * */ char *exp, *startp, *operator; char *inp, *outp; char op; long xval, yval, result; if (*error) return -1; /* Copy expression except whitespace */ exp = (char *) malloc(strlen(expression)+1); inp = expression; outp=exp; do { if (!isspace((int) *inp)) { *outp = *inp; outp++; } inp++; } while (*inp); *outp = '\0'; /* First find the value of the first sub-expression */ startp = exp; while (isspace((int) *startp)) startp++; if (*startp == '(') { /* Starts with parentheses: * - find matching end parentheses * - find the operator following the end parentheses * - compute value of expression inside parentheses (recursive call) */ int pcount = 1; char *endp; for (endp = startp+1; (*endp && pcount); ) { if (*endp == '(') pcount++; else if (*endp == ')') pcount--; if (pcount) endp++; } if (*endp == '\0') { *error = 1; return -1; } operator = endp+1; *endp = '\0'; xval = compute(startp+1, error); } else { /* No parentheses --> it's a number */ xval = strtol(startp, &operator, 10); if (operator == startp) { *error = 2; return -1; } } /* Now loop over the following operators and expressions */ do { /* There may not be an operator */ if (*operator) { while (isspace((int) *operator)) operator++; op = *operator; /* For the && and || operators ... */ if ((op == '&') && (*(operator+1) == '&')) { op = 'a'; operator++; } else if ((op == '|') && (*(operator+1) == '|')) { op = 'o'; operator++; } else if ((op == '>') && (*(operator+1) == '=')) { op = 'g'; operator++; } else if ((op == '<') && (*(operator+1) == '=')) { op = 'l'; operator++; } else if ((op == '=') && (*(operator+1) == '=')) { op = 'e'; operator++; } /* Since there is an operator, there must be a value after the operator */ startp = operator + 1; while (isspace((int) *startp)) startp++; if (*startp == '(') { int pcount = 1; char *endp; for (endp = startp+1; (*endp && pcount);) { if (*endp == '(') pcount++; else if (*endp == ')') pcount--; if (pcount) endp++; } operator = endp+1; *endp = '\0'; yval = compute(startp+1, error); } else { yval = strtol(startp, &operator, 10); if (operator == startp) { *error = 3; return -1; } } switch (op) { case '+': xval = (xval + yval); break; case '-': xval = (xval - yval); break; case '*': xval = (xval * yval); break; case '/': if (yval) xval = (xval / yval); else { *error = 10; return -1; } break; case '%': if (yval) xval = (xval % yval); else { *error = 10; return -1; } break; case '&': xval = (xval & yval); break; case 'a': xval = (xval && yval); break; case '|': xval = (xval | yval); break; case 'o': xval = (xval || yval); break; case '>': xval = (xval > yval); break; case 'g': xval = (xval >= yval); break; case '<': xval = (xval < yval); break; case 'l': xval = (xval <= yval); break; case 'e': xval = (xval == yval); break; default : { *error = 4; return -1; } } } else { /* Do nothing - no operator, so result is the xval */ } result = xval; } while (*operator); xfree(exp); return result; } #ifdef STANDALONE int main(int argc, char *argv[]) { long result; int error = 0; result = compute(argv[1], &error); printf("%s = %ld\n", argv[1], result); return error; } #endif xymon-4.3.28/lib/sha2.h0000664000076400007640000001106612000300516014755 0ustar rpmbuildrpmbuild/* * FIPS 180-2 SHA-224/256/384/512 implementation * Last update: 02/02/2007 * Issue date: 04/30/2005 * * Copyright (C) 2005, 2007 Olivier Gay * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project 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 PROJECT 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 PROJECT 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. */ #ifndef SHA2_H #define SHA2_H #define SHA224_DIGEST_SIZE ( 224 / 8) #define SHA256_DIGEST_SIZE ( 256 / 8) #define SHA384_DIGEST_SIZE ( 384 / 8) #define SHA512_DIGEST_SIZE ( 512 / 8) #define SHA256_BLOCK_SIZE ( 512 / 8) #define SHA512_BLOCK_SIZE (1024 / 8) #define SHA384_BLOCK_SIZE SHA512_BLOCK_SIZE #define SHA224_BLOCK_SIZE SHA256_BLOCK_SIZE #ifndef SHA2_TYPES #define SHA2_TYPES typedef unsigned char uint8; typedef unsigned int uint32; typedef unsigned long long uint64; #endif #ifdef __cplusplus extern "C" { #endif typedef struct { unsigned int tot_len; unsigned int len; unsigned char block[2 * SHA256_BLOCK_SIZE]; uint32 h[8]; } sha256_ctx; typedef struct { unsigned int tot_len; unsigned int len; unsigned char block[2 * SHA512_BLOCK_SIZE]; uint64 h[8]; } sha512_ctx; typedef sha512_ctx sha384_ctx; typedef sha256_ctx sha224_ctx; extern void sha224_init(sha224_ctx *ctx); extern void sha224_update(sha224_ctx *ctx, const unsigned char *message, unsigned int len); extern void sha224_final(sha224_ctx *ctx, unsigned char *digest); extern void sha224(const unsigned char *message, unsigned int len, unsigned char *digest); extern void sha256_init(sha256_ctx * ctx); extern void sha256_update(sha256_ctx *ctx, const unsigned char *message, unsigned int len); extern void sha256_final(sha256_ctx *ctx, unsigned char *digest); extern void sha256(const unsigned char *message, unsigned int len, unsigned char *digest); extern void sha384_init(sha384_ctx *ctx); extern void sha384_update(sha384_ctx *ctx, const unsigned char *message, unsigned int len); extern void sha384_final(sha384_ctx *ctx, unsigned char *digest); extern void sha384(const unsigned char *message, unsigned int len, unsigned char *digest); extern void sha512_init(sha512_ctx *ctx); extern void sha512_update(sha512_ctx *ctx, const unsigned char *message, unsigned int len); extern void sha512_final(sha512_ctx *ctx, unsigned char *digest); extern void sha512(const unsigned char *message, unsigned int len, unsigned char *digest); extern int mySHA224_Size(void); extern void mySHA224_Init(void *c); extern void mySHA224_Update(void *c, unsigned char *in, int len); extern void mySHA224_Final(char md[20], void *c); extern int mySHA256_Size(void); extern void mySHA256_Init(void *c); extern void mySHA256_Update(void *c, unsigned char *in, int len); extern void mySHA256_Final(char md[20], void *c); extern int mySHA384_Size(void); extern void mySHA384_Init(void *c); extern void mySHA384_Update(void *c, unsigned char *in, int len); extern void mySHA384_Final(char md[20], void *c); extern int mySHA512_Size(void); extern void mySHA512_Init(void *c); extern void mySHA512_Update(void *c, unsigned char *in, int len); extern void mySHA512_Final(char md[20], void *c); #ifdef __cplusplus } #endif #endif /* !SHA2_H */ xymon-4.3.28/lib/holidays.h0000664000076400007640000000307511615341300015744 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __HOLIDAYS_H__ #define __HOLIDAYS_H__ typedef struct holiday_t { enum { HOL_ABSOLUTE, HOL_EASTER, HOL_ADVENT, HOL_MON_AFTER, HOL_TUE_AFTER, HOL_WED_AFTER, HOL_THU_AFTER, HOL_FRI_AFTER, HOL_SAT_AFTER, HOL_SUN_AFTER, HOL_MON, HOL_TUE, HOL_WED, HOL_THU, HOL_FRI, HOL_SAT, HOL_SUN } holtype; char *desc; /* description */ int month; /* month for absolute date */ int day; /* day for absolute date or offset for type 2 and 3 */ int yday; /* day of the year this holiday occurs in current year */ int year; /* year for absolute date */ struct holiday_t *next; } holiday_t; extern int load_holidays(int year); extern int getweekdayorholiday(char *key, struct tm *t); extern char *isholiday(char *key, int dayinyear); extern void printholidays(char *key, strbuffer_t *buf, int mfirst, int mlast); #endif xymon-4.3.28/lib/xymond_ipc.c0000664000076400007640000001531012656200750016300 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* This module implements the setup/teardown of the xymond communications */ /* channel, using standard System V IPC mechanisms: Shared memory and */ /* semaphores. */ /* */ /* The concept is to use a shared memory segment for each "channel" that */ /* xymond supports. This memory segment is used to pass a single xymond */ /* message between the xymond master daemon, and the xymond_channel workers. */ /* Two semaphores are used to synchronize between the master daemon and the */ /* workers, i.e. the workers wait for a semaphore to go up indicating that a */ /* new message has arrived, and the master daemon then waits for the other */ /* semaphore to go 0 indicating that the workers have read the message. A */ /* third semaphore is used as a simple counter to tell how many workers have */ /* attached to a channel. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: xymond_ipc.c 7891 2016-02-08 21:00:24Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" #include "xymond_ipc.h" #define FEEDBACKQUEUE_MODE 0620 char *channelnames[C_LAST+1] = { "", /* First one is index 0 - not used */ "status", "stachg", "page", "data", "notes", "enadis", "client", "clichg", "user", "feedback", NULL }; xymond_channel_t *setup_channel(enum msgchannels_t chnid, int role) { key_t key; struct stat st; struct sembuf s; xymond_channel_t *newch; unsigned int bufsz; int flags = ((role == CHAN_MASTER) ? (IPC_CREAT | 0600) : 0); char *xymonhome = xgetenv("XYMONHOME"); if ( (xymonhome == NULL) || (stat(xymonhome, &st) == -1) ) { errprintf("XYMONHOME not defined, or points to invalid directory - cannot continue.\n"); return NULL; } bufsz = 1024*shbufsz(chnid); dbgprintf("Setting up %s channel (id=%d)\n", channelnames[chnid], chnid); dbgprintf("calling ftok('%s',%d)\n", xymonhome, chnid); key = ftok(xymonhome, chnid); if (key == -1) { errprintf("Could not generate shmem key based on %s: %s\n", xymonhome, strerror(errno)); return NULL; } dbgprintf("ftok() returns: 0x%X\n", key); newch = (xymond_channel_t *)malloc(sizeof(xymond_channel_t)); newch->seq = 0; newch->channelid = chnid; newch->msgcount = 0; newch->shmid = shmget(key, bufsz, flags); if (newch->shmid == -1) { errprintf("Could not get shm of size %d: %s\n", bufsz, strerror(errno)); xfree(newch); return NULL; } dbgprintf("shmget() returns: 0x%X\n", newch->shmid); newch->channelbuf = (char *) shmat(newch->shmid, NULL, 0); if (newch->channelbuf == (char *)-1) { errprintf("Could not attach shm %s\n", strerror(errno)); if (role == CHAN_MASTER) shmctl(newch->shmid, IPC_RMID, NULL); xfree(newch); return NULL; } newch->semid = semget(key, 3, flags); if (newch->semid == -1) { errprintf("Could not get sem: %s\n", strerror(errno)); shmdt(newch->channelbuf); if (role == CHAN_MASTER) shmctl(newch->shmid, IPC_RMID, NULL); xfree(newch); return NULL; } if (role == CHAN_CLIENT) { /* * Clients must register their presence. * We use SEM_UNDO; so if the client crashes, it wont leave a stale count. */ s.sem_num = CLIENTCOUNT; s.sem_op = +1; s.sem_flg = SEM_UNDO; if (semop(newch->semid, &s, 1) == -1) { errprintf("Could not register presence: %s\n", strerror(errno)); shmdt(newch->channelbuf); xfree(newch); return NULL; } } else if (role == CHAN_MASTER) { int n; n = semctl(newch->semid, CLIENTCOUNT, GETVAL); if (n > 0) { errprintf("FATAL: xymond sees clientcount %d, should be 0\nCheck for hanging xymond_channel processes or stale semaphores\n", n); shmdt(newch->channelbuf); shmctl(newch->shmid, IPC_RMID, NULL); semctl(newch->semid, 0, IPC_RMID); xfree(newch); return NULL; } } #ifdef MEMORY_DEBUG add_to_memlist(newch->channelbuf, bufsz); #endif return newch; } void close_channel(xymond_channel_t *chn, int role) { if (chn == NULL) return; /* No need to de-register, this happens automatically because we registered with SEM_UNDO */ if (role == CHAN_MASTER) semctl(chn->semid, 0, IPC_RMID); MEMUNDEFINE(chn->channelbuf); shmdt(chn->channelbuf); if (role == CHAN_MASTER) shmctl(chn->shmid, IPC_RMID, NULL); } int setup_feedback_queue(int role) { char *xymonhome = xgetenv("XYMONHOME"); struct stat st; key_t key; int flags = ((role == CHAN_MASTER) ? (IPC_CREAT | FEEDBACKQUEUE_MODE) : 0); int queueid; if ( (xymonhome == NULL) || (stat(xymonhome, &st) == -1) ) { errprintf("XYMONHOME not defined, or points to invalid directory - cannot continue.\n"); return -1; } key = ftok(xymonhome, C_FEEDBACK_QUEUE); if (key == -1) { errprintf("Could not generate backfeed key based on %s: %s\n", xymonhome, strerror(errno)); return -1; } queueid = msgget(key, flags); if ((role == CHAN_MASTER) && (queueid == -1)) { /* Check if the permissions simply don't match, and re-create if necessary */ if ((errno == EACCES) && (msgget(key, 0) != -1)) { errprintf("BFQ 0x%X already existed but did not match expected permissions; recreating\n", key); } if (msgctl(msgget(key, 0), IPC_RMID, NULL) != 0) errprintf("Existing BFQ 0x%X could not be removed: %s\n", key, strerror(errno)); /* try creating again */ queueid = msgget(key, flags); } if ((queueid == -1) && (errno != ENOENT)) errprintf("Could not retrieve BFQ ID from key 0x%X: %s\n", key, strerror(errno)); dbgprintf(" setup_feedback_queue: got ID %d for key 0x%X\n", queueid, key); return queueid; } void close_feedback_queue(int queueid, int role) { int n; if ((queueid >= 0) && (role == CHAN_MASTER)) { n = msgctl(queueid, IPC_RMID, NULL); if (n) errprintf("Error closing BFQ (%d): %s\n", queueid, strerror(errno)); } } xymon-4.3.28/lib/strfunc.h0000664000076400007640000000323712501343647015627 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __STRFUNC_H__ #define __STRFUNC_H__ extern strbuffer_t *newstrbuffer(int initialsize); extern strbuffer_t *convertstrbuffer(char *buffer, int bufsz); extern void addtobuffer(strbuffer_t *buf, char *newtext); extern void addtobuffer_many(strbuffer_t *buf, ...); extern void addtostrbuffer(strbuffer_t *buf, strbuffer_t *newtext); extern void addtobufferraw(strbuffer_t *buf, char *newdata, int bytes); extern void clearstrbuffer(strbuffer_t *buf); extern void freestrbuffer(strbuffer_t *buf); extern char *grabstrbuffer(strbuffer_t *buf); extern strbuffer_t *dupstrbuffer(char *src); extern void strbufferchop(strbuffer_t *buf, int count); extern void strbufferrecalc(strbuffer_t *buf); extern void strbuffergrow(strbuffer_t *buf, int bytes); extern void strbufferuse(strbuffer_t *buf, int bytes); extern char *htmlquoted(char *s); extern char *prehtmlquoted(char *s); extern strbuffer_t *replacetext(char *original, char *oldtext, char *newtext); #endif xymon-4.3.28/lib/xymond_ipc.h0000664000076400007640000000262412174246230016307 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __XYMOND_IPC_H__ #define __XYMOND_IPC_H__ #include "xymond_buffer.h" /* Semaphore numbers */ #define BOARDBUSY 0 #define GOCLIENT 1 #define CLIENTCOUNT 2 #define CHAN_MASTER 0 #define CHAN_CLIENT 1 typedef struct xymond_channel_t { enum msgchannels_t channelid; int shmid; int semid; char *channelbuf; unsigned int seq; unsigned long msgcount; struct xymond_channel_t *next; } xymond_channel_t; extern char *channelnames[]; extern xymond_channel_t *setup_channel(enum msgchannels_t chnname, int role); extern void close_channel(xymond_channel_t *chn, int role); extern int setup_feedback_queue(int role); extern void close_feedback_queue(int queueid, int role); #endif xymon-4.3.28/lib/xymonrrd.c0000664000076400007640000002567712603243142016024 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains routines for working with RRD graphs. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: xymonrrd.c 7678 2015-10-01 14:42:42Z jccleaver $"; #include #include #include #include #include #include #include "libxymon.h" #include "version.h" /* This is for mapping a status-name -> RRD file */ xymonrrd_t *xymonrrds = NULL; void * xymonrrdtree; /* This is the information needed to generate links on the trends column page */ xymongraph_t *xymongraphs = NULL; static const char *xymonlinkfmt = "
\"xymongraph \"Zoom
\n"; static const char *metafmt = "\n %s\n \n \n\n"; /* * Define the mapping between Xymon columns and RRD graphs. * Normally they are identical, but some RRD's use different names. */ static void rrd_setup(void) { static int setup_done = 0; char *lenv, *ldef, *p, *tcptests, *services; int count; xymonrrd_t *lrec; xymongraph_t *grec; /* Do nothing if we have been called within the past 5 minutes */ if ((setup_done + 300) >= getcurrenttime(NULL)) return; /* * Must free any old data first. * NB: These lists are NOT null-terminated ! * Stop when svcname becomes a NULL. */ lrec = xymonrrds; while (lrec && lrec->svcname) { if (lrec->xymonrrdname != lrec->svcname) xfree(lrec->xymonrrdname); xfree(lrec->svcname); lrec++; } if (xymonrrds) { xfree(xymonrrds); xtreeDestroy(xymonrrdtree); } grec = xymongraphs; while (grec && grec->xymonrrdname) { if (grec->xymonpartname) xfree(grec->xymonpartname); xfree(grec->xymonrrdname); grec++; } if (xymongraphs) xfree(xymongraphs); /* Get the tcp services, and count how many there are */ services = strdup(init_tcp_services()); tcptests = strdup(services); count = 0; p = strtok(tcptests, " "); while (p) { count++; p = strtok(NULL, " "); } strcpy(tcptests, services); /* Setup the xymonrrds table, mapping test-names to RRD files */ lenv = (char *)malloc(strlen(xgetenv("TEST2RRD")) + strlen(tcptests) + count*strlen(",=tcp") + 1); strcpy(lenv, xgetenv("TEST2RRD")); p = lenv+strlen(lenv)-1; if (*p == ',') *p = '\0'; /* Drop a trailing comma */ p = strtok(tcptests, " "); while (p) { sprintf(lenv+strlen(lenv), ",%s=tcp", p); p = strtok(NULL, " "); } xfree(tcptests); xfree(services); count = 0; p = lenv; do { count++; p = strchr(p+1, ','); } while (p); xymonrrds = (xymonrrd_t *)calloc((count+1), sizeof(xymonrrd_t)); xymonrrdtree = xtreeNew(strcasecmp); lrec = xymonrrds; ldef = strtok(lenv, ","); while (ldef) { p = strchr(ldef, '='); if (p) { *p = '\0'; lrec->svcname = strdup(ldef); lrec->xymonrrdname = strdup(p+1); } else { lrec->svcname = lrec->xymonrrdname = strdup(ldef); } xtreeAdd(xymonrrdtree, lrec->svcname, lrec); ldef = strtok(NULL, ","); lrec++; } xfree(lenv); /* Setup the xymongraphs table, describing how to make graphs from an RRD */ lenv = strdup(xgetenv("GRAPHS")); p = lenv+strlen(lenv)-1; if (*p == ',') *p = '\0'; /* Drop a trailing comma */ count = 0; p = lenv; do { count++; p = strchr(p+1, ','); } while (p); xymongraphs = (xymongraph_t *)calloc((count+1), sizeof(xymongraph_t)); grec = xymongraphs; ldef = strtok(lenv, ","); while (ldef) { p = strchr(ldef, ':'); if (p) { *p = '\0'; grec->xymonrrdname = strdup(ldef); grec->xymonpartname = strdup(p+1); p = strchr(grec->xymonpartname, ':'); if (p) { *p = '\0'; grec->maxgraphs = atoi(p+1); if (strlen(grec->xymonpartname) == 0) { xfree(grec->xymonpartname); grec->xymonpartname = NULL; } } } else { grec->xymonrrdname = strdup(ldef); } ldef = strtok(NULL, ","); grec++; } xfree(lenv); setup_done = getcurrenttime(NULL); } xymonrrd_t *find_xymon_rrd(char *service, char *flags) { /* Lookup an entry in the xymonrrds table */ xtreePos_t handle; rrd_setup(); if (flags && (strchr(flags, 'R') != NULL)) { /* Don't do RRD's for reverse tests, since they have no data */ return NULL; } handle = xtreeFind(xymonrrdtree, service); if (handle == xtreeEnd(xymonrrdtree)) return NULL; else { return (xymonrrd_t *)xtreeData(xymonrrdtree, handle); } } xymongraph_t *find_xymon_graph(char *rrdname) { /* Lookup an entry in the xymongraphs table */ xymongraph_t *grec; int found = 0; char *dchar; rrd_setup(); grec = xymongraphs; while (!found && (grec->xymonrrdname != NULL)) { found = (strncmp(grec->xymonrrdname, rrdname, strlen(grec->xymonrrdname)) == 0); if (found) { /* Check that it's not a partial match, e.g. "ftp" matches "ftps" */ dchar = rrdname + strlen(grec->xymonrrdname); if ( (*dchar != '.') && (*dchar != ',') && (*dchar != '\0') ) found = 0; } if (!found) grec++; } return (found ? grec : NULL); } static char *xymon_graph_text(char *hostname, char *dispname, char *service, int bgcolor, xymongraph_t *graphdef, int itemcount, hg_stale_rrds_t nostale, const char *fmt, int locatorbased, time_t starttime, time_t endtime) { static char *rrdurl = NULL; static int rrdurlsize = 0; static int gwidth = 0, gheight = 0; char *svcurl; int svcurllen, rrdparturlsize; char rrdservicename[100]; char *cgiurl = xgetenv("CGIBINURL"); MEMDEFINE(rrdservicename); if (locatorbased) { char *qres = locator_query(hostname, ST_RRD, &cgiurl); if (!qres) { errprintf("Cannot find RRD files for host %s\n", hostname); return ""; } } if (!gwidth) { gwidth = atoi(xgetenv("RRDWIDTH")); gheight = atoi(xgetenv("RRDHEIGHT")); } dbgprintf("rrdlink_url: host %s, rrd %s (partname:%s, maxgraphs:%d, count=%d)\n", hostname, graphdef->xymonrrdname, textornull(graphdef->xymonpartname), graphdef->maxgraphs, itemcount); if ((service != NULL) && (strcmp(graphdef->xymonrrdname, "tcp") == 0)) { sprintf(rrdservicename, "tcp:%s", service); } else if ((service != NULL) && (strcmp(graphdef->xymonrrdname, "ncv") == 0)) { sprintf(rrdservicename, "ncv:%s", service); } else if ((service != NULL) && (strcmp(graphdef->xymonrrdname, "devmon") == 0)) { sprintf(rrdservicename, "devmon:%s", service); } else { strcpy(rrdservicename, graphdef->xymonrrdname); } svcurllen = 2048 + strlen(cgiurl) + strlen(hostname) + strlen(rrdservicename) + strlen(urlencode(dispname ? dispname : hostname)); svcurl = (char *) malloc(svcurllen); rrdparturlsize = 2048 + strlen(fmt) + 3*svcurllen + strlen(rrdservicename) + strlen(xgetenv("XYMONSKIN")); if (rrdurl == NULL) { rrdurlsize = rrdparturlsize; rrdurl = (char *) malloc(rrdurlsize); } *rrdurl = '\0'; { char *rrdparturl; int first = 1; int step; step = (graphdef->maxgraphs ? graphdef->maxgraphs : 5); if (itemcount) { int gcount = (itemcount / step); if ((gcount*step) != itemcount) gcount++; step = (itemcount / gcount); } rrdparturl = (char *) malloc(rrdparturlsize); do { if (itemcount > 0) { sprintf(svcurl, "%s/showgraph.sh?host=%s&service=%s&graph_width=%d&graph_height=%d&first=%d&count=%d", cgiurl, hostname, rrdservicename, gwidth, gheight, first, step); } else { sprintf(svcurl, "%s/showgraph.sh?host=%s&service=%s&graph_width=%d&graph_height=%d", cgiurl, hostname, rrdservicename, gwidth, gheight); } strcat(svcurl, "&disp="); strcat(svcurl, urlencode(dispname ? dispname : hostname)); if (nostale == HG_WITHOUT_STALE_RRDS) strcat(svcurl, "&nostale"); if (bgcolor != -1) sprintf(svcurl+strlen(svcurl), "&color=%s", colorname(bgcolor)); sprintf(svcurl+strlen(svcurl), "&graph_start=%d&graph_end=%d", (int)starttime, (int)endtime); sprintf(rrdparturl, fmt, rrdservicename, svcurl, svcurl, rrdservicename, svcurl, xgetenv("XYMONSKIN"), xgetenv("IMAGEFILETYPE")); if ((strlen(rrdparturl) + strlen(rrdurl) + 1) >= rrdurlsize) { rrdurlsize += (4096 + rrdparturlsize); rrdurl = (char *) realloc(rrdurl, rrdurlsize); } strcat(rrdurl, rrdparturl); first += step; } while (first <= itemcount); xfree(rrdparturl); } dbgprintf("URLtext: %s\n", rrdurl); xfree(svcurl); MEMUNDEFINE(rrdservicename); return rrdurl; } char *xymon_graph_data(char *hostname, char *dispname, char *service, int bgcolor, xymongraph_t *graphdef, int itemcount, hg_stale_rrds_t nostale, hg_link_t wantmeta, int locatorbased, time_t starttime, time_t endtime) { return xymon_graph_text(hostname, dispname, service, bgcolor, graphdef, itemcount, nostale, ((wantmeta == HG_META_LINK) ? metafmt : xymonlinkfmt), locatorbased, starttime, endtime); } rrdtpldata_t *setup_template(char *params[]) { int i; rrdtpldata_t *result; rrdtplnames_t *nam; int dsindex = 1; result = (rrdtpldata_t *)calloc(1, sizeof(rrdtpldata_t)); result->dsnames = xtreeNew(strcmp); for (i = 0; (params[i]); i++) { if (strncasecmp(params[i], "DS:", 3) == 0) { char *pname, *pend; pname = params[i] + 3; pend = strchr(pname, ':'); if (pend) { int plen = (pend - pname); nam = (rrdtplnames_t *)calloc(1, sizeof(rrdtplnames_t)); nam->idx = dsindex++; if (result->template == NULL) { result->template = (char *)malloc(plen + 1); *result->template = '\0'; nam->dsnam = (char *)malloc(plen+1); strncpy(nam->dsnam, pname, plen); nam->dsnam[plen] = '\0'; } else { /* Hackish way of getting the colon delimiter */ pname--; plen++; result->template = (char *)realloc(result->template, strlen(result->template) + plen + 1); nam->dsnam = (char *)malloc(plen); strncpy(nam->dsnam, pname+1, plen-1); nam->dsnam[plen-1] = '\0'; } strncat(result->template, pname, plen); xtreeAdd(result->dsnames, nam->dsnam, nam); } } } return result; } xymon-4.3.28/lib/digest.h0000664000076400007640000000253312605347542015423 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is used to implement the message digest functions. */ /* */ /* Copyright (C) 2003-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __DIGEST_H_ #define __DIGEST_H_ typedef enum { D_MD5, D_SHA1, D_SHA256, D_SHA512, D_SHA224, D_SHA384, D_RMD160 } digesttype_t; typedef struct digestctx_t { char *digestname; digesttype_t digesttype; void *mdctx; } digestctx_t; extern char *md5hash(char *input); extern digestctx_t *digest_init(char *digest); extern int digest_data(digestctx_t *ctx, unsigned char *buf, int buflen); extern char *digest_done(digestctx_t *ctx); #define dohash(P) md5hash(P) #endif xymon-4.3.28/lib/memory.h0000664000076400007640000000656412271166607015464 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __MEMORY_H__ #define __MEMORY_H__ #undef XYMON_MEMORY_WRAPPERS /* If defined, will wrap mem-alloc routines */ #undef MEMORY_DEBUG /* If defined, use debugging code */ typedef struct xmemory_t { char *sdata; size_t ssize; struct xmemory_t *next; } xmemory_t; extern const char *xfreenullstr; extern void add_to_memlist(void *ptr, size_t memsize); extern void remove_from_memlist(void *ptr); extern void *xcalloc(size_t nmemb, size_t size); extern void *xmalloc(size_t size); extern void *xrealloc(void *ptr, size_t size); extern char *xstrdup(const char *s); extern char *xstrcat(char *dest, const char *src); extern char *xstrcpy(char *dest, const char *src); extern char *xstrncat(char *dest, const char *src, size_t maxlen); extern char *xstrncpy(char *dest, const char *src, size_t maxlen); extern int xsprintf(char *dest, const char *fmt, ...); extern char *xresultbuf(int maxsz); #ifdef XYMON_MEMORY_WRAPPERS #ifndef LIB_MEMORY_C_COMPILE #undef calloc #undef malloc #undef realloc #undef strdup /* * This arranges for all memory-allocation routines to * go via a wrapper that checks for bogus input data * and malloc() returning NULL when running out of memory. * Errors caught here are fatal. * Overhead is small, so this is turned on always. */ #define calloc(N,S) xcalloc((N), (S)) #define malloc(N) xmalloc((N)) #define realloc(P,S) xrealloc((P), (S)) #define strdup(P) xstrdup((P)) #endif /* LIB_MEMORY_C_COMPILE */ #endif /* XYMON_MEMORY_WRAPPERS */ #ifdef MEMORY_DEBUG /* * This arranges for all calls to potentially memory-overwriting routines * to do strict allocation checks and overwrite checks. The performance * overhead is significant, so it should only be turned on in debugging * situations. */ #ifndef LIB_MEMORY_C_COMPILE #define MEMDEFINE(P) { add_to_memlist((P), sizeof((P))); } #define MEMUNDEFINE(P) { remove_from_memlist((P)); } #define xfree(P) { remove_from_memlist((P)); free((P)); (P) = NULL; } #undef strcat #undef strncat #undef strcpy #undef strncpy #undef sprintf #define strcat(D,S) xstrcat((D), (S)) #define strncat(D,S,L) xstrncat((D), (S), (L)) #define strcpy(D,S) xstrcpy((D), (S)) #define strncpy(D,S,L) xstrncpy((D), (S), (L)) #define sprintf xsprintf #endif #else /* * This defines an "xfree()" macro, which checks for freeing of * a NULL ptr and complains if that happens. It does not check if * the pointer is valid. * After being freed, the pointer is set to NULL to catch double-free's. */ #define xfree(P) { if ((P) == NULL) { errprintf(xfreenullstr); abort(); } free((P)); (P) = NULL; } #define MEMDEFINE(P) do { } while (0); #define MEMUNDEFINE(P) do { } while (0); #endif /* MEMORY_DEBUG */ #endif xymon-4.3.28/lib/readmib.h0000664000076400007640000000725612173472453015556 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2007-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __READMIB_H__ #define __READMIB_H__ /* This holds one OID and our corresponding short-name */ typedef struct oidds_t { char *dsname; /* Our short-name for the data item in the mib definition */ char *oid; /* The OID for the data in the mib definition */ enum { RRD_NOTRACK, RRD_TRACK_GAUGE, RRD_TRACK_COUNTER, RRD_TRACK_DERIVE, RRD_TRACK_ABSOLUTE } rrdtype; /* How to store this in an RRD file */ enum { OID_CONVERT_NONE, /* No conversion */ OID_CONVERT_U32 /* Convert signed -> unsigned 32 bit integer */ } conversion; } oidds_t; /* This holds a list of OID's and their shortnames */ typedef struct oidset_t { int oidsz, oidcount; oidds_t *oids; struct oidset_t *next; } oidset_t; /* This describes the ways we can index into this MIB */ enum mibidxtype_t { MIB_INDEX_IN_OID, /* * The index is part of the key-table OID's; by scanning the key-table * values we find the one matching the wanted key, and can extract the * index from the matching rows' OID. * E.g. interfaces table looking for ifDescr or ifPhysAddress, or * interfaces table looking for the extension-object ifName. * IF-MIB::ifDescr.1 = STRING: lo * IF-MIB::ifDescr.2 = STRING: eth1 * IF-MIB::ifPhysAddress.1 = STRING: * IF-MIB::ifPhysAddress.2 = STRING: 0:e:a6:ce:cf:7f * IF-MIB::ifName.1 = STRING: lo * IF-MIB::ifName.2 = STRING: eth1 * The key table has an entry with the value = key-value. The index * is then the part of the key-OID beyond the base key table OID. */ MIB_INDEX_IN_VALUE /* * Index can be found by adding the key value as a part-OID to the * base OID of the key (e.g. interfaces by IP-address). * IP-MIB::ipAdEntIfIndex.127.0.0.1 = INTEGER: 1 * IP-MIB::ipAdEntIfIndex.172.16.10.100 = INTEGER: 3 */ }; typedef struct mibidx_t { char marker; /* Marker character for key OID */ enum mibidxtype_t idxtype; /* How to interpret the key */ char *keyoid; /* Key OID */ void *rootoid; /* Binary representation of keyoid */ size_t rootoidlen; /* Length of binary keyoid */ struct mibidx_t *next; } mibidx_t; typedef struct mibdef_t { enum { MIB_STATUS_NOTLOADED, /* Not loaded */ MIB_STATUS_LOADED, /* Loaded OK, can be used */ MIB_STATUS_LOADFAILED /* Load failed (e.g. missing MIB file) */ } loadstatus; char *mibfn; /* Filename of the MIB file (for non-standard MIB's) */ char *mibname; /* MIB definition name */ int tabular; /* Does the MIB contain a table ? Or just simple data */ oidset_t *oidlisthead, *oidlisttail; /* The list of OID's in the MIB set */ mibidx_t *idxlist; /* List of the possible indices used for the MIB */ int haveresult; /* Used while building result messages */ strbuffer_t *resultbuf; /* Used while building result messages */ } mibdef_t; extern int readmibs(char *cfgfn, int verbose); extern mibdef_t *first_mib(void); extern mibdef_t *next_mib(void); extern mibdef_t *find_mib(char *mibname); #endif xymon-4.3.28/lib/cgiurls.c0000664000076400007640000001061311615341300015567 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains routines for generating the Xymon CGI URL's */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: cgiurls.c 6712 2011-07-31 21:01:52Z storner $"; #include #include #include #include #include #include #include #include "libxymon.h" static char *cgibinurl = NULL; char *hostsvcurl(char *hostname, char *service, int htmlformat) { static char *url; if (url) xfree(url); if (!cgibinurl) cgibinurl = xgetenv("CGIBINURL"); url = (char *)malloc(1024 + strlen(cgibinurl) + strlen(hostname) + strlen(service)); sprintf(url, (htmlformat ? "%s/svcstatus.sh?HOST=%s&SERVICE=%s" : "%s/svcstatus.sh?HOST=%s&SERVICE=%s"), cgibinurl, hostname, service); return url; } char *hostsvcclienturl(char *hostname, char *section) { static char *url; int n; if (url) xfree(url); if (!cgibinurl) cgibinurl = xgetenv("CGIBINURL"); url = (char *)malloc(1024 + strlen(cgibinurl) + strlen(hostname) + (section ? strlen(section) : 0)); n = sprintf(url, "%s/svcstatus.sh?CLIENT=%s", cgibinurl, hostname); if (section) sprintf(url+n, "&SECTION=%s", section); return url; } char *histcgiurl(char *hostname, char *service) { static char *url = NULL; if (url) xfree(url); if (!cgibinurl) cgibinurl = xgetenv("CGIBINURL"); url = (char *)malloc(1024 + strlen(cgibinurl) + strlen(hostname) + strlen(service)); sprintf(url, "%s/history.sh?HISTFILE=%s.%s", cgibinurl, commafy(hostname), service); return url; } char *histlogurl(char *hostname, char *service, time_t histtime, char *histtime_txt) { static char *url = NULL; if (url) xfree(url); if (!cgibinurl) cgibinurl = xgetenv("CGIBINURL"); /* cgi-bin/historylog.sh?HOST=foo.sample.com&SERVICE=msgs&TIMEBUF=Fri_Nov_7_16:01:08_2002 */ url = (char *)malloc(1024 + strlen(cgibinurl) + strlen(hostname) + strlen(service)); if (!histtime_txt) { sprintf(url, "%s/historylog.sh?HOST=%s&SERVICE=%s&TIMEBUF=%s", xgetenv("CGIBINURL"), hostname, service, histlogtime(histtime)); } else { sprintf(url, "%s/historylog.sh?HOST=%s&SERVICE=%s&TIMEBUF=%s", xgetenv("CGIBINURL"), hostname, service, histtime_txt); } return url; } char *replogurl(char *hostname, char *service, int color, char *style, int recentgifs, reportinfo_t *repinfo, char *reportstart, time_t reportend, float reportwarnlevel) { static char *url; if (url) xfree(url); if (!cgibinurl) cgibinurl = xgetenv("CGIBINURL"); url = (char *)malloc(4096 + strlen(cgibinurl) + strlen(hostname) + strlen(service)); sprintf(url, "%s/reportlog.sh?HOST=%s&SERVICE=%s&COLOR=%s&PCT=%.2f&ST=%u&END=%u&RED=%.2f&YEL=%.2f&GRE=%.2f&PUR=%.2f&CLE=%.2f&BLU=%.2f&STYLE=%s&FSTATE=%s&REDCNT=%d&YELCNT=%d&GRECNT=%d&PURCNT=%d&CLECNT=%d&BLUCNT=%d&WARNPCT=%.2f&RECENTGIFS=%d", cgibinurl, hostname, service, colorname(color), repinfo->fullavailability, (unsigned int)repinfo->reportstart, (unsigned int)reportend, repinfo->fullpct[COL_RED], repinfo->fullpct[COL_YELLOW], repinfo->fullpct[COL_GREEN], repinfo->fullpct[COL_PURPLE], repinfo->fullpct[COL_CLEAR], repinfo->fullpct[COL_BLUE], style, repinfo->fstate, repinfo->count[COL_RED], repinfo->count[COL_YELLOW], repinfo->count[COL_GREEN], repinfo->count[COL_PURPLE], repinfo->count[COL_CLEAR], repinfo->count[COL_BLUE], reportwarnlevel, use_recentgifs); if (reportstart) sprintf(url+strlen(url), "&REPORTTIME=%s", reportstart); return url; } xymon-4.3.28/lib/xymond_buffer.c0000664000076400007640000000462012174246230016776 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* This module contains a shared routine to find the size of a shared memory */ /* buffer used for one of the Xymon communications-channels. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: xymond_buffer.c 7217 2013-07-25 16:04:40Z storner $"; #include #include #include "libxymon.h" #include "xymond_buffer.h" unsigned int shbufsz(enum msgchannels_t chnid) { unsigned int defvalue = 0, result = 0; char *v = NULL; if (chnid != C_LAST) { switch (chnid) { case C_STATUS: v = getenv("MAXMSG_STATUS"); defvalue = 256; break; case C_CLIENT: v = getenv("MAXMSG_CLIENT"); defvalue = 512; break; case C_CLICHG: v = getenv("MAXMSG_CLICHG"); defvalue = shbufsz(C_CLIENT); break; case C_DATA: v = getenv("MAXMSG_DATA"); defvalue = 256; break; case C_NOTES: v = getenv("MAXMSG_NOTES"); defvalue = 256; break; case C_STACHG: v = getenv("MAXMSG_STACHG"); defvalue = shbufsz(C_STATUS); break; case C_PAGE: v = getenv("MAXMSG_PAGE"); defvalue = shbufsz(C_STATUS); break; case C_ENADIS: v = getenv("MAXMSG_ENADIS"); defvalue = 32; break; case C_USER: v = getenv("MAXMSG_USER"); defvalue = 128; break; case C_FEEDBACK_QUEUE: v = getenv("MAXMSG_STATUS"); defvalue = 256; break; default: break; } if (v) { result = atoi(v); /* See if it is an old setting in bytes */ if (result > 32*1024) result = (result / 1024); } if (result < 32) result = defvalue; } else { enum msgchannels_t i; unsigned int isz; result = 0; for (i=C_STATUS; (i < C_LAST); i++) { isz = shbufsz(i); if (isz > result) result = isz; } } return result; } xymon-4.3.28/lib/errormsg.h0000664000076400007640000000254612466407063016010 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __ERRORMSG_H__ #define __ERRORMSG_H__ #include extern char *errbuf; extern int save_errbuf; extern int debug; extern void errprintf(const char *fmt, ...); extern void real_dbgprintf(const char *fmt, ...); #define dbgprintf(...) { if (debug) real_dbgprintf(__VA_ARGS__); } #define logprintf(...) printf(__VA_ARGS__); extern void flush_errbuf(void); extern void set_debugfile(char *fn, int appendtofile); extern void starttrace(const char *fn); extern void stoptrace(void); extern void traceprintf(const char *fmt, ...); extern void redirect_cgilog(char *cginame); extern void reopen_file(char *fn, char *mode, FILE *fd); #endif xymon-4.3.28/lib/stackio.h0000664000076400007640000000220611615341300015560 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __STACKIO_H__ #define __STACKIO_H__ #define MAX_LINE_LEN 16384 extern int initfgets(FILE *fd); extern char *unlimfgets(strbuffer_t *buffer, FILE *fd); extern FILE *stackfopen(char *filename, char *mode, void **v_filelist); extern int stackfclose(FILE *fd); extern char *stackfgets(strbuffer_t *buffer, char *extraincl); extern int stackfmodified(void *v_listhead); extern void stackfclist(void **v_listhead); #endif xymon-4.3.28/lib/url.h0000664000076400007640000000332512514226415014740 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __URL_H__ #define __URL_H__ extern int obeybbproxysyntax; typedef struct urlelem_t { char *origform; char *scheme; char *schemeopts; char *host; char *ip; int port; char *auth; char *relurl; int parseerror; } urlelem_t; enum webtesttype_t { WEBTEST_PLAIN, WEBTEST_CONTENT, WEBTEST_CONT, WEBTEST_NOCONT, WEBTEST_POST, WEBTEST_NOPOST, WEBTEST_TYPE, WEBTEST_STATUS, WEBTEST_HEAD, WEBTEST_SOAP, WEBTEST_NOSOAP, }; typedef struct weburl_t { int testtype; char *columnname; struct urlelem_t *desturl; struct urlelem_t *proxyurl; unsigned char *postcontenttype; unsigned char *postdata; unsigned char *expdata; unsigned char *okcodes; unsigned char *badcodes; } weburl_t; extern char *urlunescape(char *url); extern char *urldecode(char *envvar); extern char *urlencode(char *s); extern int urlvalidate(char *query, char *validchars); extern char *cleanurl(char *url); extern void parse_url(char *inputurl, urlelem_t *url); extern char *decode_url(char *testspec, weburl_t *weburl); #endif xymon-4.3.28/lib/color.c0000664000076400007640000000740312244604307015250 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains routines for color <-> string conversion */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: color.c 7315 2013-11-25 08:22:31Z storner $"; #include #include #include "libxymon.h" int use_recentgifs = 0; char *colorname(int color) { static char *cs = ""; switch (color) { case COL_CLEAR: cs = "clear"; break; case COL_BLUE: cs = "blue"; break; case COL_PURPLE: cs = "purple"; break; case COL_GREEN: cs = "green"; break; case COL_YELLOW: cs = "yellow"; break; case COL_RED: cs = "red"; break; default: cs = "unknown"; break; } return cs; } int parse_color(char *colortext) { char inpcolor[10]; int n; if (!colortext) return -1; MEMDEFINE(inpcolor); strncpy(inpcolor, colortext, 7); inpcolor[7] = '\0'; n = strspn(inpcolor, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"); inpcolor[n] = '\0'; strcat(inpcolor, " "); if (strncasecmp(inpcolor, "green ", 6) == 0) { MEMUNDEFINE(inpcolor); return COL_GREEN; } else if (strncasecmp(inpcolor, "yellow ", 7) == 0) { MEMUNDEFINE(inpcolor); return COL_YELLOW; } else if (strncasecmp(inpcolor, "red ", 4) == 0) { MEMUNDEFINE(inpcolor); return COL_RED; } else if (strncasecmp(inpcolor, "blue ", 5) == 0) { MEMUNDEFINE(inpcolor); return COL_BLUE; } else if (strncasecmp(inpcolor, "clear ", 6) == 0) { MEMUNDEFINE(inpcolor); return COL_CLEAR; } else if (strncasecmp(inpcolor, "purple ", 7) == 0) { MEMUNDEFINE(inpcolor); return COL_PURPLE; } else if (strncasecmp(inpcolor, "client ", 7) == 0) { MEMUNDEFINE(inpcolor); return COL_CLIENT; } MEMUNDEFINE(inpcolor); return -1; } int eventcolor(char *colortext) { if (!colortext) return -1; if (strcmp(colortext, "cl") == 0) return COL_CLEAR; else if (strcmp(colortext, "bl") == 0) return COL_BLUE; else if (strcmp(colortext, "pu") == 0) return COL_PURPLE; else if (strcmp(colortext, "gr") == 0) return COL_GREEN; else if (strcmp(colortext, "ye") == 0) return COL_YELLOW; else if (strcmp(colortext, "re") == 0) return COL_RED; else return -1; } char *dotgiffilename(int color, int acked, int oldage) { static char *filename = NULL; /* yellow-recent.gif */ /* Allocate the first time, never free */ if (filename == NULL) filename = (char *)malloc(20); strcpy(filename, colorname(color)); if (acked) { strcat(filename, "-ack"); } else if (use_recentgifs) { strcat(filename, (oldage ? "" : "-recent")); } sprintf(filename+strlen(filename), ".%s", xgetenv("IMAGEFILETYPE")); return filename; } #ifndef CLIENTONLY int colorset(char *colspec, int excludeset) { char *cspeccopy = strdup(colspec); int c, ac; char *p; char *pp = NULL; p = strtok_r(cspeccopy, ",", &pp); ac = 0; while (p) { c = parse_color(p); if (c != -1) ac = (ac | (1 << c)); p = strtok_r(NULL, ",", &pp); } xfree(cspeccopy); /* Some color may be forbidden */ ac = (ac & ~excludeset); return ac; } #endif xymon-4.3.28/lib/environ.h0000664000076400007640000000177311615341300015613 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __ENVIRON_H__ #define __ENVIRON_H__ extern char *xgetenv(const char *name); extern void envcheck(char *envvars[]); extern void loadenv(char *envfile, char *area); extern char *getenv_default(char *envname, char *envdefault, char **buf); extern char *expand_env(char *s); #endif xymon-4.3.28/lib/loadhosts.h0000664000076400007640000000562412616464461016152 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __LOADHOSTS_H__ #define __LOADHOSTS_H__ enum xmh_item_t { XMH_NET, XMH_DISPLAYNAME, XMH_CLIENTALIAS, XMH_COMMENT, XMH_DESCRIPTION, XMH_NK, XMH_NKTIME, XMH_TRENDS, XMH_WML, XMH_NOPROPRED, XMH_NOPROPYELLOW, XMH_NOPROPPURPLE, XMH_NOPROPACK, XMH_REPORTTIME, XMH_WARNPCT, XMH_WARNSTOPS, XMH_DOWNTIME, XMH_SSLDAYS, XMH_SSLMINBITS, XMH_DEPENDS, XMH_BROWSER, XMH_HTTPHEADERS, XMH_HOLIDAYS, XMH_DELAYRED, XMH_DELAYYELLOW, XMH_FLAG_NOINFO, XMH_FLAG_NOTRENDS, XMH_FLAG_NOCLIENT, XMH_FLAG_NODISP, XMH_FLAG_NONONGREEN, XMH_FLAG_NOBB2, XMH_FLAG_PREFER, XMH_FLAG_NOSSLCERT, XMH_FLAG_TRACE, XMH_FLAG_NOTRACE, XMH_FLAG_NOCONN, XMH_FLAG_NOPING, XMH_FLAG_DIALUP, XMH_FLAG_TESTIP, XMH_FLAG_LDAPFAILYELLOW, XMH_FLAG_NOCLEAR, XMH_FLAG_HIDEHTTP, XMH_PULLDATA, XMH_NOFLAP, XMH_FLAG_MULTIHOMED, XMH_FLAG_SNI, XMH_FLAG_NOSNI, XMH_FLAG_HTTP_HEADER_MATCH, XMH_LDAPLOGIN, XMH_IP, XMH_HOSTNAME, XMH_DOCURL, XMH_NOPROP, XMH_PAGEINDEX, XMH_GROUPID, XMH_DGNAME, XMH_PAGENAME, XMH_PAGEPATH, XMH_PAGETITLE, XMH_PAGEPATHTITLE, XMH_ALLPAGEPATHS, XMH_ACCEPT_ONLY, XMH_RAW, XMH_CLASS, XMH_OS, XMH_NOCOLUMNS, XMH_DATA, XMH_NOTBEFORE, XMH_NOTAFTER, XMH_COMPACT, XMH_INTERFACES, XMH_LAST }; enum ghosthandling_t { GH_ALLOW, GH_IGNORE, GH_LOG, GH_MATCH }; extern int load_hostnames(char *hostsfn, char *extrainclude, int fqdn); extern int load_hostinfo(char *hostname); extern char *hostscfg_content(void); extern char *knownhost(char *hostname, char *hostip, enum ghosthandling_t ghosthandling); extern int knownloghost(char *logdir); extern void *hostinfo(char *hostname); extern void *localhostinfo(char *hostname); extern char *xmh_item(void *host, enum xmh_item_t item); extern char *xmh_custom_item(void *host, char *key); extern enum xmh_item_t xmh_key_idx(char *item); extern char *xmh_item_byname(void *host, char *item); extern char *xmh_item_walk(void *host); extern int xmh_item_idx(char *value); extern char *xmh_item_id(enum xmh_item_t idx); extern void *first_host(void); extern void *next_host(void *currenthost, int wantclones); extern void xmh_set_item(void *host, enum xmh_item_t item, void *value); extern char *xmh_item_multi(void *host, enum xmh_item_t item); #endif xymon-4.3.28/lib/netservices.c0000664000076400007640000002774413033575046016502 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains routines for parsing the protocols.cfg file. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: netservices.c 7999 2017-01-06 02:00:06Z jccleaver $"; #include #include #include #include #include #include #include #include #include "libxymon.h" /* * Services we know how to handle: * This defines what to send to them to shut down the * session nicely, and whether we want to grab the * banner or not. */ static svcinfo_t default_svcinfo[] = { /* ------------- data to send ------ ---- green data ------ flags */ /* name databytes length databytes offset len */ { "ftp", "quit\r\n", 0, "220", 0, 0, (TCP_GET_BANNER), 21 }, { "ssh", NULL, 0, "SSH", 0, 0, (TCP_GET_BANNER), 22 }, { "ssh1", NULL, 0, "SSH", 0, 0, (TCP_GET_BANNER), 22 }, { "ssh2", NULL, 0, "SSH", 0, 0, (TCP_GET_BANNER), 22 }, { "telnet", NULL, 0, NULL, 0, 0, (TCP_GET_BANNER|TCP_TELNET), 23 }, { "smtp", "mail\r\nquit\r\n", 0, "220", 0, 0, (TCP_GET_BANNER), 25 }, /* Send "MAIL" to avoid sendmail NOQUEUE logs */ { "pop", "quit\r\n", 0, "+OK", 0, 0, (TCP_GET_BANNER), 110 }, { "pop2", "quit\r\n", 0, "+OK", 0, 0, (TCP_GET_BANNER), 109 }, { "pop-2", "quit\r\n", 0, "+OK", 0, 0, (TCP_GET_BANNER), 109 }, { "pop3", "quit\r\n", 0, "+OK", 0, 0, (TCP_GET_BANNER), 110 }, { "pop-3", "quit\r\n", 0, "+OK", 0, 0, (TCP_GET_BANNER), 110 }, { "imap", "ABC123 LOGOUT\r\n", 0, "* OK", 0, 0, (TCP_GET_BANNER), 143 }, { "imap2", "ABC123 LOGOUT\r\n", 0, "* OK", 0, 0, (TCP_GET_BANNER), 143 }, { "imap3", "ABC123 LOGOUT\r\n", 0, "* OK", 0, 0, (TCP_GET_BANNER), 220 }, { "imap4", "ABC123 LOGOUT\r\n", 0, "* OK", 0, 0, (TCP_GET_BANNER), 143 }, { "nntp", "quit\r\n", 0, "200", 0, 0, (TCP_GET_BANNER), 119 }, { "ldap", NULL, 0, NULL, 0, 0, (0), 389 }, { "rsync", NULL, 0, "@RSYNCD",0, 0, (TCP_GET_BANNER), 873 }, { "bbd", "dummy", 0, NULL, 0, 0, (0), 1984 }, { "ftps", "quit\r\n", 0, "220", 0, 0, (TCP_GET_BANNER|TCP_SSL), 990 }, { "telnets", NULL, 0, NULL, 0, 0, (TCP_GET_BANNER|TCP_TELNET|TCP_SSL), 992 }, { "smtps", "mail\r\nquit\r\n", 0, "220", 0, 0, (TCP_GET_BANNER|TCP_SSL), 0 }, /* Non-standard - IANA */ { "pop3s", "quit\r\n", 0, "+OK", 0, 0, (TCP_GET_BANNER|TCP_SSL), 995 }, { "imaps", "ABC123 LOGOUT\r\n", 0, "* OK", 0, 0, (TCP_GET_BANNER|TCP_SSL), 993 }, { "nntps", "quit\r\n", 0, "200", 0, 0, (TCP_GET_BANNER|TCP_SSL), 563 }, { "ldaps", NULL, 0, NULL, 0, 0, (TCP_SSL), 636 }, { "clamd", "PING\r\n", 0, "PONG", 0, 0, (0), 3310 }, { "vnc", "RFB 000.000\r\n", 0, "RFB ", 0, 0, (TCP_GET_BANNER), 5900 }, { NULL, NULL, 0, NULL, 0, 0, (0), 0 } /* Default behaviour: Just try a connect */ }; static svcinfo_t *svcinfo = default_svcinfo; typedef struct svclist_t { struct svcinfo_t *rec; struct svclist_t *next; } svclist_t; static char *binview(unsigned char *buf, int buflen) { /* Encode a string with possibly binary data into an ascii-printable form */ static char hexchars[16] = "0123456789ABCDEF"; static char *result = NULL; unsigned char *inp, *outp; int i; if (result) xfree(result); if (!buf) { result = strdup("[null]"); return result; } if (buf && (buflen == 0)) buflen = strlen(buf); result = (char *)malloc(4*buflen + 1); /* Worst case: All binary */ for (inp=buf, i=0, outp=result; (irec = (svcinfo_t *)calloc(1, sizeof(svcinfo_t)); newitem->rec->svcname = strdup(svcname); newitem->next = NULL; if (first == NULL) first = newitem; if (head == NULL) { head = tail = newitem; } else { tail->next = newitem; tail = newitem; } svcname = strtok(NULL, "|"); } } else if (strncmp(l, "send ", 5) == 0) { if (first) { getescapestring(skipwhitespace(l+4), &first->rec->sendtxt, &first->rec->sendlen); for (walk = first->next; (walk); walk = walk->next) { walk->rec->sendtxt = strdup(first->rec->sendtxt); walk->rec->sendlen = first->rec->sendlen; } } } else if (strncmp(l, "expect ", 7) == 0) { if (first) { getescapestring(skipwhitespace(l+6), &first->rec->exptext, &first->rec->explen); for (walk = first->next; (walk); walk = walk->next) { walk->rec->exptext = strdup(first->rec->exptext); walk->rec->explen = first->rec->explen; walk->rec->expofs = 0; /* HACK - not used right now */ } } } else if (strncmp(l, "options ", 8) == 0) { if (first) { char *opt; first->rec->flags = 0; l = skipwhitespace(l+7); opt = strtok(l, ","); while (opt) { if (strcmp(opt, "ssl") == 0) first->rec->flags |= TCP_SSL; else if (strcmp(opt, "banner") == 0) first->rec->flags |= TCP_GET_BANNER; else if (strcmp(opt, "telnet") == 0) first->rec->flags |= TCP_TELNET; else errprintf("Unknown option: %s\n", opt); opt = strtok(NULL, ","); } for (walk = first->next; (walk); walk = walk->next) { walk->rec->flags = first->rec->flags; } } } else if (strncmp(l, "port ", 5) == 0) { if (first) { first->rec->port = atoi(skipwhitespace(l+4)); for (walk = first->next; (walk); walk = walk->next) { walk->rec->port = first->rec->port; } } } } if (fd) stackfclose(fd); freestrbuffer(inbuf); /* Copy from the svclist to svcinfo table */ svcinfo = (svcinfo_t *) malloc((svccount+1) * sizeof(svcinfo_t)); for (walk=head, i=0; (walk && (i < svccount)); walk = walk->next, i++) { svcinfo[i].svcname = walk->rec->svcname; svcinfo[i].sendtxt = walk->rec->sendtxt; svcinfo[i].sendlen = walk->rec->sendlen; svcinfo[i].exptext = walk->rec->exptext; svcinfo[i].explen = walk->rec->explen; svcinfo[i].expofs = walk->rec->expofs; svcinfo[i].flags = walk->rec->flags; svcinfo[i].port = walk->rec->port; } memset(&svcinfo[svccount], 0, sizeof(svcinfo_t)); /* This should not happen */ if (walk) { errprintf("Whoa - didn't copy all services! svccount=%d, next service '%s'\n", svccount, walk->rec->svcname); } /* Free the temp. svclist list */ while (head) { /* * Note: Don't free the strings inside the records, * as they are now owned by the svcinfo records. */ walk = head; head = head->next; xfree(walk); } searchstring = strdup(xgetenv("XYMONNETSVCS")); xymonnetsvcs = (char *) malloc(strlen(xgetenv("XYMONNETSVCS")) + svcnamebytes + 1); strcpy(xymonnetsvcs, xgetenv("XYMONNETSVCS")); for (i=0; (svcinfo[i].svcname); i++) { char *p; strcpy(searchstring, xgetenv("XYMONNETSVCS")); p = strtok(searchstring, " "); while (p && (strcmp(p, svcinfo[i].svcname) != 0)) p = strtok(NULL, " "); if (p == NULL) { strcat(xymonnetsvcs, " "); strcat(xymonnetsvcs, svcinfo[i].svcname); } } xfree(searchstring); if (debug) { dump_tcp_services(); dbgprintf("XYMONNETSVCS set to : %s\n", xymonnetsvcs); } MEMUNDEFINE(filename); return xymonnetsvcs; } void dump_tcp_services(void) { int i; dbgprintf("Service list dump\n"); for (i=0; (svcinfo[i].svcname); i++) { dbgprintf(" Name : %s\n", svcinfo[i].svcname); dbgprintf(" Sendtext: %s\n", binview(svcinfo[i].sendtxt, svcinfo[i].sendlen)); dbgprintf(" Sendlen : %d\n", svcinfo[i].sendlen); dbgprintf(" Exp.text: %s\n", binview(svcinfo[i].exptext, svcinfo[i].explen)); dbgprintf(" Exp.len : %d\n", svcinfo[i].explen); dbgprintf(" Exp.ofs : %d\n", svcinfo[i].expofs); dbgprintf(" Flags : %d\n", svcinfo[i].flags); dbgprintf(" Port : %d\n", svcinfo[i].port); } dbgprintf("\n"); } int default_tcp_port(char *svcname) { int svcidx; int result = 0; for (svcidx=0; (svcinfo[svcidx].svcname && (strcmp(svcname, svcinfo[svcidx].svcname) != 0)); svcidx++) ; if (svcinfo[svcidx].svcname) result = svcinfo[svcidx].port; return result; } svcinfo_t *find_tcp_service(char *svcname) { int svcidx; for (svcidx=0; (svcinfo[svcidx].svcname && (strcmp(svcname, svcinfo[svcidx].svcname) != 0)); svcidx++) ; if (svcinfo[svcidx].svcname) return &svcinfo[svcidx]; else return NULL; } xymon-4.3.28/lib/links.c0000664000076400007640000001275112134724562015260 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module for Xymon, responsible for loading the host-, */ /* page-, and column-links present in www/notes and www/help. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: links.c 7183 2013-04-21 08:55:14Z storner $"; #include #include #include #include #include #include #include #include "libxymon.h" /* Info-link definitions. */ typedef struct link_t { char *key; char *filename; char *urlprefix; /* "/help", "/notes" etc. */ } link_t; static int linksloaded = 0; static void * linkstree; static char *notesskin = NULL; static char *helpskin = NULL; static char *columndocurl = NULL; static char *hostdocurl = NULL; char *link_docext(char *fn) { char *p = strrchr(fn, '.'); if (p == NULL) return NULL; if ( (strcasecmp(p, ".php") == 0) || (strcasecmp(p, ".php3") == 0) || (strcasecmp(p, ".asp") == 0) || (strcasecmp(p, ".pdf") == 0) || (strcasecmp(p, ".doc") == 0) || (strcasecmp(p, ".docx") == 0) || (strcasecmp(p, ".odt") == 0) || (strcasecmp(p, ".shtml") == 0) || (strcasecmp(p, ".phtml") == 0) || (strcasecmp(p, ".html") == 0) || (strcasecmp(p, ".htm") == 0)) { return p; } return NULL; } static link_t *init_link(char *filename, char *urlprefix) { char *p; link_t *newlink = NULL; dbgprintf("init_link(%s, %s)\n", textornull(filename), textornull(urlprefix)); newlink = (link_t *) malloc(sizeof(link_t)); newlink->filename = strdup(filename); newlink->urlprefix = urlprefix; /* Without extension, this time */ p = link_docext(filename); if (p) *p = '\0'; newlink->key = strdup(filename); return newlink; } static void load_links(char *directory, char *urlprefix) { DIR *linkdir; struct dirent *d; char fn[PATH_MAX]; dbgprintf("load_links(%s, %s)\n", textornull(directory), textornull(urlprefix)); linkdir = opendir(directory); if (!linkdir) { errprintf("Cannot read links in directory %s\n", directory); return; } MEMDEFINE(fn); while ((d = readdir(linkdir))) { link_t *newlink; if (*(d->d_name) == '.') continue; strcpy(fn, d->d_name); newlink = init_link(fn, urlprefix); xtreeAdd(linkstree, newlink->key, newlink); } closedir(linkdir); MEMUNDEFINE(fn); } void load_all_links(void) { char dirname[PATH_MAX]; char *p; MEMDEFINE(dirname); dbgprintf("load_all_links()\n"); linkstree = xtreeNew(strcasecmp); if (notesskin) { xfree(notesskin); notesskin = NULL; } if (helpskin) { xfree(helpskin); helpskin = NULL; } if (columndocurl) { xfree(columndocurl); columndocurl = NULL; } if (hostdocurl) { xfree(hostdocurl); hostdocurl = NULL; } if (xgetenv("XYMONNOTESSKIN")) notesskin = strdup(xgetenv("XYMONNOTESSKIN")); else { notesskin = (char *) malloc(strlen(xgetenv("XYMONWEB")) + strlen("/notes") + 1); sprintf(notesskin, "%s/notes", xgetenv("XYMONWEB")); } if (xgetenv("XYMONHELPSKIN")) helpskin = strdup(xgetenv("XYMONHELPSKIN")); else { helpskin = (char *) malloc(strlen(xgetenv("XYMONWEB")) + strlen("/help") + 1); sprintf(helpskin, "%s/help", xgetenv("XYMONWEB")); } if (xgetenv("COLUMNDOCURL")) columndocurl = strdup(xgetenv("COLUMNDOCURL")); if (xgetenv("HOSTDOCURL")) hostdocurl = strdup(xgetenv("HOSTDOCURL")); if (!hostdocurl || (strlen(hostdocurl) == 0)) { strcpy(dirname, xgetenv("XYMONNOTESDIR")); load_links(dirname, notesskin); } /* Change xxx/xxx/xxx/notes into xxx/xxx/xxx/help */ strcpy(dirname, xgetenv("XYMONNOTESDIR")); p = strrchr(dirname, '/'); *p = '\0'; strcat(dirname, "/help"); load_links(dirname, helpskin); linksloaded = 1; MEMUNDEFINE(dirname); } static link_t *find_link(char *key) { link_t *l = NULL; xtreePos_t handle; handle = xtreeFind(linkstree, key); if (handle != xtreeEnd(linkstree)) l = (link_t *)xtreeData(linkstree, handle); return l; } char *columnlink(char *colname) { static char *linkurl = NULL; link_t *link; if (linkurl == NULL) linkurl = (char *)malloc(PATH_MAX); if (!linksloaded) load_all_links(); link = find_link(colname); if (link) { sprintf(linkurl, "%s/%s", link->urlprefix, link->filename); } else if (columndocurl) { sprintf(linkurl, columndocurl, colname); } else { *linkurl = '\0'; } return linkurl; } char *hostlink(char *hostname) { static char *linkurl = NULL; link_t *link; if (linkurl == NULL) linkurl = (char *)malloc(PATH_MAX); if (!linksloaded) load_all_links(); if (hostdocurl && *hostdocurl) { snprintf(linkurl, PATH_MAX-1, hostdocurl, hostname); return linkurl; } else { link = find_link(hostname); if (link) { sprintf(linkurl, "%s/%s", link->urlprefix, link->filename); return linkurl; } } return NULL; } xymon-4.3.28/lib/headfoot.h0000664000076400007640000000430212277125340015724 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __HEADFOOT_H__ #define __HEADFOOT_H__ #include extern void sethostenv(char *host, char *ip, char *svc, char *color, char *hikey); extern void sethostenv_report(time_t reportstart, time_t reportend, double repwarn, double reppanic); extern void sethostenv_snapshot(time_t snapshot); extern void sethostenv_histlog(char *histtime); extern void sethostenv_template(char *dir); extern void sethostenv_refresh(int n); extern void sethostenv_filter(char *hostptn, char *pageptn, char *ipptn, char *classptn); extern void sethostenv_clearlist(char *listname); extern void sethostenv_addtolist(char *listname, char *name, char *val, char *extra, int selected); extern void sethostenv_critack(int prio, char *ttgroup, char *ttextra, char *infourl, char *docurl); extern void sethostenv_critedit(char *updinfo, int prio, char *group, time_t starttime, time_t endtime, char *crittime, char *extra); extern void sethostenv_critclonelist_clear(void); extern void sethostenv_critclonelist_add(char *hostname); extern void sethostenv_pagepath(char *s); extern void sethostenv_backsecs(int seconds); extern void sethostenv_eventtime(time_t starttime, time_t endtime); extern void output_parsed(FILE *output, char *templatedata, int bgcolor, time_t selectedtime); extern void headfoot(FILE *output, char *template, char *pagepath, char *head_or_foot, int bgcolor); extern void showform(FILE *output, char *headertemplate, char *formtemplate, int color, time_t seltime, char *pretext, char *posttext); #endif xymon-4.3.28/lib/ripemd.h0000664000076400007640000001165411535462534015430 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This file is part of the Xymon monitor library, but was taken from the */ /* FreeBSD sources. It was originally written by Eric Young, and is NOT */ /* licensed under the GPL. Please adhere the original copyright notice below. */ /*----------------------------------------------------------------------------*/ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ #ifndef HEADER_RIPEMD_H #define HEADER_RIPEMD_H /******************** Modifications for Xymon ***************************/ #include "config.h" #ifndef HAVE_UINT32_TYPEDEF typedef unsigned int u_int32_t; #endif #ifndef BYTE_ORDER #ifndef LITTLE_ENDIAN #define LITTLE_ENDIAN 1234 #endif #ifndef BIG_ENDIAN #define BIG_ENDIAN 4321 #endif #ifdef XYMON_LITTLE_ENDIAN #define BYTE_ORDER LITTLE_ENDIAN #else #define BYTE_ORDER BIG_ENDIAN #endif #endif /******************** End of modifications for Xymon ***************************/ #define RIPEMD160_CBLOCK 64 #define RIPEMD160_LBLOCK 16 #define RIPEMD160_BLOCK 16 #define RIPEMD160_LAST_BLOCK 56 #define RIPEMD160_LENGTH_BLOCK 8 #define RIPEMD160_DIGEST_LENGTH 20 typedef struct RIPEMD160state_st { u_int32_t A,B,C,D,E; u_int32_t Nl,Nh; u_int32_t data[RIPEMD160_LBLOCK]; int num; } RIPEMD160_CTX; #if 0 __BEGIN_DECLS void RIPEMD160_Init(RIPEMD160_CTX *c); void RIPEMD160_Update(RIPEMD160_CTX *c, const void *data, size_t len); void RIPEMD160_Final(unsigned char *md, RIPEMD160_CTX *c); char *RIPEMD160_End(RIPEMD160_CTX *, char *); char *RIPEMD160_File(const char *, char *); char *RIPEMD160_FileChunk(const char *, char *, off_t, off_t); char *RIPEMD160_Data(const void *, unsigned int, char *); __END_DECLS #endif #endif xymon-4.3.28/lib/htmllog.c0000664000076400007640000005154012647753376015623 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains routines for generating HTML version of a status log. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: htmllog.c 7861 2016-01-20 18:50:38Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include "libxymon.h" #include "version.h" #include "htmllog.h" static char *cgibinurl = NULL; static char *colfont = NULL; static char *ackfont = NULL; static char *rowfont = NULL; static char *documentationurl = NULL; static char *doctarget = NULL; #define HOSTPOPUP_COMMENT 1 #define HOSTPOPUP_DESCR 2 #define HOSTPOPUP_IP 4 static int hostpopup = (HOSTPOPUP_COMMENT | HOSTPOPUP_DESCR | HOSTPOPUP_IP); enum histbutton_t histlocation = HIST_BOTTOM; static void hostpopup_setup(void) { static int setup_done = 0; char *val, *p; if (setup_done) return; val = xgetenv("HOSTPOPUP"); if (val) { /* Clear the setting, since there is an explicit value for it */ hostpopup = 0; for (p = val; (*p); p++) { switch (*p) { case 'C': case 'c': hostpopup = (hostpopup | HOSTPOPUP_COMMENT); break; case 'D': case 'd': hostpopup = (hostpopup | HOSTPOPUP_DESCR); break; case 'I': case 'i': hostpopup = (hostpopup | HOSTPOPUP_IP); break; default: break; } } } setup_done = 1; } static void hostsvc_setup(void) { static int setup_done = 0; if (setup_done) return; hostpopup_setup(); getenv_default("NONHISTS", "info,trends,graphs", NULL); getenv_default("CGIBINURL", "/cgi-bin", &cgibinurl); getenv_default("XYMONPAGEACKFONT", "COLOR=\"#33ebf4\" SIZE=-1\"", &ackfont); getenv_default("XYMONPAGECOLFONT", "COLOR=\"#87a9e5\" SIZE=-1\"", &colfont); getenv_default("XYMONPAGEROWFONT", "SIZE=+1 COLOR=\"#FFFFCC\" FACE=\"Tahoma, Arial, Helvetica\"", &rowfont); getenv_default("XYMONWEB", "/xymon", NULL); { char *dbuf = malloc(strlen(xgetenv("XYMONWEB")) + 6); sprintf(dbuf, "%s/gifs", xgetenv("XYMONWEB")); getenv_default("XYMONSKIN", dbuf, NULL); xfree(dbuf); } setup_done = 1; } static void historybutton(char *cgibinurl, char *hostname, char *service, char *ip, char *displayname, char *btntxt, FILE *output) { char *tmp1; char *tmp2 = (char *)malloc(strlen(service)+3); getenv_default("NONHISTS", "info,trends", NULL); tmp1 = (char *)malloc(strlen(xgetenv("NONHISTS"))+3); sprintf(tmp1, ",%s,", xgetenv("NONHISTS")); sprintf(tmp2, ",%s,", service); if (strstr(tmp1, tmp2) == NULL) { fprintf(output, "

", cgibinurl); fprintf(output, "", htmlquoted(btntxt)); fprintf(output, "", htmlquoted(service)); fprintf(output, ""); fprintf(output, "", htmlquoted(ip)); fprintf(output, "", htmlquoted(displayname)); fprintf(output, "
\n"); } xfree(tmp2); xfree(tmp1); } static void textwithcolorimg(char *msg, FILE *output) { char *p, *restofmsg; restofmsg = msg; do { int color, acked, recent; color = -1; acked = recent = 0; p = strchr(restofmsg, '&'); if (p) { *p = '\0'; fprintf(output, "%s", restofmsg); *p = '&'; if (strncmp(p, "&red", 4) == 0) color = COL_RED; else if (strncmp(p, "&yellow", 7) == 0) color = COL_YELLOW; else if (strncmp(p, "&green", 6) == 0) color = COL_GREEN; else if (strncmp(p, "&clear", 6) == 0) color = COL_CLEAR; else if (strncmp(p, "&blue", 5) == 0) color = COL_BLUE; else if (strncmp(p, "&purple", 7) == 0) color = COL_PURPLE; if (color == -1) { fprintf(output, "&"); restofmsg = p+1; } else { acked = (strncmp(p + 1 + strlen(colorname(color)), "-acked", 6) == 0); recent = (strncmp(p + 1 + strlen(colorname(color)), "-recent", 7) == 0); fprintf(output, "\"%s\"", xgetenv("XYMONSKIN"), dotgiffilename(color, acked, !recent), colorname(color), xgetenv("DOTHEIGHT"), xgetenv("DOTWIDTH")); restofmsg = p+1+strlen(colorname(color)); if (acked) restofmsg += 6; if (recent) restofmsg += 7; } } else { fprintf(output, "%s", restofmsg); restofmsg = NULL; } } while (restofmsg); } void generate_html_log(char *hostname, char *displayname, char *service, char *ip, int color, int flapping, char *sender, char *flags, time_t logtime, char *timesincechange, char *firstline, char *restofmsg, char *modifiers, time_t acktime, char *ackmsg, char *acklist, time_t disabletime, char *dismsg, int is_history, int wantserviceid, int htmlfmt, int locatorbased, char *multigraphs, char *linktoclient, char *prio, char *ttgroup, char *ttextra, int graphtime, FILE *output) { int linecount = 0; xymonrrd_t *rrd = NULL; xymongraph_t *graph = NULL; char *tplfile = "hostsvc"; char *graphs; char *graphsenv; char *graphsptr; time_t now = getcurrenttime(NULL); if (graphtime == 0) { if (getenv("TRENDSECONDS")) graphtime = atoi(getenv("TRENDSECONDS")); else graphtime = 48*60*60; } hostsvc_setup(); if (!displayname) displayname = hostname; sethostenv(displayname, ip, service, colorname(color), hostname); if (logtime) sethostenv_snapshot(logtime); if (is_history) tplfile = "histlog"; if (strcmp(service, xgetenv("INFOCOLUMN")) == 0) tplfile = "info"; else if (strcmp(service, xgetenv("TRENDSCOLUMN")) == 0) tplfile = "trends"; headfoot(output, tplfile, "", "header", color); if (strcmp(service, xgetenv("TRENDSCOLUMN")) == 0) { int formfile; char formfn[PATH_MAX]; sprintf(formfn, "%s/web/trends_form", xgetenv("XYMONHOME")); formfile = open(formfn, O_RDONLY); if (formfile >= 0) { char *inbuf; struct stat st; int n; fstat(formfile, &st); inbuf = (char *) malloc(st.st_size + 1); *inbuf = '\0'; n = read(formfile, inbuf, st.st_size); if (n > 0) inbuf[n] = '\0'; close(formfile); sethostenv_backsecs(graphtime); output_parsed(output, inbuf, color, 0); xfree(inbuf); } } if (prio) { int formfile; char formfn[PATH_MAX]; sprintf(formfn, "%s/web/critack_form", xgetenv("XYMONHOME")); formfile = open(formfn, O_RDONLY); if (formfile >= 0) { char *inbuf; struct stat st; int n; fstat(formfile, &st); inbuf = (char *) malloc(st.st_size + 1); *inbuf = '\0'; n = read(formfile, inbuf, st.st_size); if (n > 0) inbuf[st.st_size] = '\0'; close(formfile); sethostenv_critack(atoi(prio), ttgroup, ttextra, hostsvcurl(hostname, xgetenv("INFOCOLUMN"), 1), hostlink(hostname)); output_parsed(output, inbuf, color, 0); xfree(inbuf); } } if (acklist && *acklist) { /* received:validuntil:level:ackedby:msg */ time_t received, validuntil; int level; char *ackedby, *msg; char *bol, *eol, *tok; char receivedstr[200]; char untilstr[200]; fprintf(output, "\n"); fprintf(output, ""); fprintf(output, "", ackfont); fprintf(output, "\n"); fprintf(output, ""); fprintf(output, "", ackfont); fprintf(output, "", ackfont); fprintf(output, "", ackfont); fprintf(output, "", ackfont); fprintf(output, "\n"); nldecode(acklist); bol = acklist; do { eol = strchr(bol, '\n'); if (eol) *eol = '\0'; tok = strtok(bol, ":"); if (tok) { received = atoi(tok); tok = strtok(NULL, ":"); } else received = 0; if (tok) { validuntil = atoi(tok); tok = strtok(NULL, ":"); } else validuntil = 0; if (tok) { level = atoi(tok); tok = strtok(NULL, ":"); } else level = -1; if (tok) { ackedby = tok; tok = strtok(NULL, "\n"); } else ackedby = NULL; if (tok) msg = tok; else msg = NULL; if (received && validuntil && (level >= 0) && ackedby && msg) { strftime(receivedstr, sizeof(receivedstr)-1, "%Y-%m-%d %H:%M", localtime(&received)); strftime(untilstr, sizeof(untilstr)-1, "%Y-%m-%d %H:%M", localtime(&validuntil)); fprintf(output, ""); fprintf(output, "", ackfont, level); fprintf(output, "", ackfont, htmlquoted(ackedby)); fprintf(output, "", ackfont, receivedstr, untilstr); fprintf(output, "", ackfont, htmlquoted(msg)); fprintf(output, "\n"); } if (eol) { *eol = '\n'; bol = eol+1; } else bol = NULL; } while (bol); fprintf(output, "
Acknowledgments
LevelFromValidityMessage
%d%s%s - %s%s
\n"); } fprintf(output, "

 \n"); if (flapping) fprintf(output, "
WARNING: Flapping status
\n"); if (histlocation == HIST_TOP) { historybutton(cgibinurl, hostname, service, ip, displayname, (is_history ? "Full History" : "HISTORY"), output); } fprintf(output, "
\n"); if (wantserviceid) { fprintf(output, "\n"); } if (disabletime != 0) { fprintf(output, "\n", (disabletime == -1 ? "OK" : ctime(&disabletime))); fprintf(output, "\n", htmlquoted(dismsg)); fprintf(output, "\n"); fprintf(output, "\n", htmlquoted(dismsg)); fprintf(output, "\n"); } if (modifiers) { char *modtxt; nldecode(modifiers); fprintf(output, "
", rowfont); fprintf(output, "%s - ", htmlquoted(displayname)); fprintf(output, "%s", htmlquoted(service)); fprintf(output, "

Disabled until %s

%s


Current status message follows:

"); if (strlen(firstline)) { fprintf(output, "

"); textwithcolorimg(firstline, output); fprintf(output, "

"); /* Drop the color */ } fprintf(output, "\n"); } else { char *txt = skipword(firstline); if (dismsg) { fprintf(output, "

Planned downtime: %s



Current status message follows:

"); modtxt = strtok(modifiers, "\n"); while (modtxt) { fprintf(output, "

"); textwithcolorimg(modtxt, output); fprintf(output, "

"); modtxt = strtok(NULL, "\n"); if (modtxt) fprintf(output, "
"); } fprintf(output, "\n"); } fprintf(output, "
"); if (strlen(txt)) { fprintf(output, "

"); textwithcolorimg(txt, output); fprintf(output, "

"); /* Drop the color */ } fprintf(output, "\n"); } if (!htmlfmt) fprintf(output, "
\n");
	textwithcolorimg(restofmsg, output);
	if (!htmlfmt) fprintf(output, "\n
\n"); fprintf(output, "
\n"); fprintf(output, "

\n"); fprintf(output, "\n"); fprintf(output, "\n"); fprintf(output, "
", colfont); if (strlen(timesincechange)) fprintf(output, "Status unchanged in %s
\n", timesincechange); if (sender) fprintf(output, "Status message received from %s
\n", sender); if (linktoclient) fprintf(output, "Client data available
\n", linktoclient); if (ackmsg) { char *ackedby; char ackuntil[200]; MEMDEFINE(ackuntil); strftime(ackuntil, sizeof(ackuntil)-1, xgetenv("ACKUNTILMSG"), localtime(&acktime)); ackuntil[sizeof(ackuntil)-1] = '\0'; ackedby = strstr(ackmsg, "\nAcked by:"); if (ackedby) { *ackedby = '\0'; fprintf(output, "Current acknowledgment: %s
%s
%s

\n", ackfont, htmlquoted(ackmsg), (ackedby+1), ackuntil); *ackedby = '\n'; } else { fprintf(output, "Current acknowledgment: %s
%s

\n", ackfont, htmlquoted(ackmsg), ackuntil); } MEMUNDEFINE(ackuntil); } fprintf(output, "
\n"); /* trends stuff here */ if (!is_history) { rrd = find_xymon_rrd(service, flags); if (rrd) { graph = find_xymon_graph(rrd->xymonrrdname); if (graph == NULL) { errprintf("Setup error: Service %s has a graph %s, but no graph-definition\n", service, rrd->xymonrrdname); } } } if (rrd && graph) { int may_have_rrd = 1; /* * See if there is already a linecount in the report. * If there is, this overrides the calculation here. * * From Francesco Duranti's hobbit-perl-client. */ char *lcstr = strstr(restofmsg, "\n", linecount); fprintf(output, " \n"); /* Get the GRAPHS_* environment setting */ graphs = (char *)malloc(7 + strlen(service) + 1); sprintf(graphs, "GRAPHS_%s", service); graphsenv=getenv(graphs); if (graphsenv) { fprintf(output, "\n", service, graphsenv); /* check for strtokens */ graphsptr = strtok(graphsenv,","); while (graphsptr != NULL) { // fprintf(output, "\n", graphsptr); graph->xymonrrdname = strdup(graphsptr); fprintf(output, "%s\n", xymon_graph_data(hostname, displayname, graphsptr, color, graph, linecount, HG_WITHOUT_STALE_RRDS, HG_PLAIN_LINK, locatorbased, now-graphtime, now)); // next token graphsptr = strtok(NULL,","); } } else { fprintf(output, "%s\n", xymon_graph_data(hostname, displayname, service, color, graph, linecount, HG_WITHOUT_STALE_RRDS, HG_PLAIN_LINK, locatorbased, now-graphtime, now)); } xfree(graphs); } } if (histlocation == HIST_BOTTOM) { historybutton(cgibinurl, hostname, service, ip, displayname, (is_history ? "Full History" : "HISTORY"), output); } fprintf(output,"
\n"); headfoot(output, tplfile, "", "footer", color); } char *alttag(char *columnname, int color, int acked, int propagate, char *age) { static char tag[1024]; size_t remain; remain = sizeof(tag) - 1; remain -= snprintf(tag, remain, "%s:%s:", columnname, colorname(color)); if (remain > 20) { if (acked) { strncat(tag, "acked:", remain); remain -= 6; } if (!propagate) { strncat(tag, "nopropagate:", remain); remain -= 12; } strncat(tag, age, remain); } tag[sizeof(tag)-1] = '\0'; return tag; } static char *nameandcomment(void *host, char *hostname, int usetooltip) { static char *result = NULL; char *cmt, *disp, *hname; if (result) xfree(result); hostpopup_setup(); /* For summary "hosts", we have no hinfo record. */ if (!host) return hostname; hname = xmh_item(host, XMH_HOSTNAME); disp = xmh_item(host, XMH_DISPLAYNAME); cmt = NULL; if (!cmt && (hostpopup & HOSTPOPUP_COMMENT)) cmt = xmh_item(host, XMH_COMMENT); if (!cmt && usetooltip && (hostpopup & HOSTPOPUP_DESCR)) cmt = xmh_item(host, XMH_DESCRIPTION); if (!cmt && usetooltip && (hostpopup & HOSTPOPUP_IP)) cmt = xmh_item(host, XMH_IP); if (disp == NULL) disp = hname; if (cmt) { if (usetooltip) { /* Thanks to Marco Schoemaker for suggesting the use of */ result = (char *)malloc(strlen(disp) + strlen(cmt) + 30); sprintf(result, "%s", cmt, disp); } else { result = (char *)malloc(strlen(disp) + strlen(cmt) + 4); sprintf(result, "%s (%s)", disp, cmt); } return result; } else return disp; } static char *urldoclink(const char *docurl, const char *hostname) { /* * docurl is a user defined text string to build * a documentation url. It is expanded with the * hostname. */ static char linkurl[PATH_MAX]; if (docurl) { sprintf(linkurl, docurl, hostname); } else { linkurl[0] = '\0'; } return linkurl; } void setdocurl(char *url) { if (documentationurl) xfree(documentationurl); documentationurl = strdup(url); } void setdoctarget(char *target) { if (doctarget) xfree(doctarget); doctarget = strdup(target); } char *hostnamehtml(char *hostname, char *defaultlink, int usetooltip) { static char result[4096]; void *hinfo = hostinfo(hostname); char *hostlinkurl; if (!doctarget) doctarget = strdup(""); /* First the hostname and a notes-link. * * If a documentation CGI is defined, use that. * * else if a host has a direct notes-link, use that. * * else if no direct link and we are doing a nongreen/critical page, * provide a link to the main page with this host (there * may be links to documentation in some page-title). * * else just put the hostname there. */ if (documentationurl) { snprintf(result, sizeof(result), "%s", urldoclink(documentationurl, hostname), doctarget, xgetenv("XYMONPAGEROWFONT"), nameandcomment(hinfo, hostname, usetooltip)); } else if ((hostlinkurl = hostlink(hostname)) != NULL) { snprintf(result, sizeof(result), "%s", hostlinkurl, doctarget, xgetenv("XYMONPAGEROWFONT"), nameandcomment(hinfo, hostname, usetooltip)); } else if (defaultlink) { /* Provide a link to the page where this host lives */ snprintf(result, sizeof(result), "%s", xgetenv("XYMONWEB"), defaultlink, doctarget, xgetenv("XYMONPAGEROWFONT"), nameandcomment(hinfo, hostname, usetooltip)); } else { snprintf(result, sizeof(result), "%s", xgetenv("XYMONPAGEROWFONT"), nameandcomment(hinfo, hostname, usetooltip)); } return result; } xymon-4.3.28/lib/ipaccess.c0000664000076400007640000000622712411754366015736 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module for Xymon, implementing IP-address based access */ /* controls. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: ipaccess.c 7476 2014-09-28 09:46:30Z storner $"; #include #include #include #include "libxymon.h" sender_t *getsenderlist(char *iplist) { char *ips, *p, *tok; sender_t *result; int count; dbgprintf("-> getsenderlist\n"); ips = strdup(iplist); count = 0; p = ips; do { count++; p = strchr(p, ','); if (p) p++; } while (p); result = (sender_t *) calloc(1, sizeof(sender_t) * (count+1)); tok = strtok(ips, ","); count = 0; while (tok) { int bits = 32; p = strchr(tok, '/'); if (p) *p = '\0'; result[count].ipval = ntohl(inet_addr(tok)); if (p) { *p = '/'; p++; bits = atoi(p); } if (bits < 32) result[count].ipmask = (0xFFFFFFFF << (32 - atoi(p))); else result[count].ipmask = 0xFFFFFFFF; tok = strtok(NULL, ","); count++; } xfree(ips); dbgprintf("<- getsenderlist\n"); return result; } int oksender(sender_t *oklist, char *targetip, struct in_addr sender, char *msgbuf) { int i; unsigned long int tg_ip; char *eoln = NULL; dbgprintf("-> oksender\n"); /* If oklist is empty, we're not doing any access checks - so return OK */ if (oklist == NULL) { dbgprintf("<- oksender(1-a)\n"); return 1; } /* If we know the target, it would be ok for the host to report on itself. */ if (targetip) { if (strcmp(targetip, "0.0.0.0") == 0) return 1; /* DHCP hosts can report from any address */ tg_ip = ntohl(inet_addr(targetip)); if (ntohl(sender.s_addr) == tg_ip) { dbgprintf("<- oksender(1-b)\n"); return 1; } } /* If sender is 0.0.0.0 (i.e. it arrived via backfeed channel), then OK */ if (sender.s_addr == INADDR_ANY) { dbgprintf("<- oksender(1-c)\n"); return 1; } /* It's someone else reporting about the host. Check the access list */ i = 0; do { if ((oklist[i].ipval & oklist[i].ipmask) == (ntohl(sender.s_addr) & oklist[i].ipmask)) { dbgprintf("<- oksender(1-c)\n"); return 1; } i++; } while (oklist[i].ipval != 0); /* Refuse and log the message */ if (msgbuf) { eoln = strchr(msgbuf, '\n'); if (eoln) *eoln = '\0'; } errprintf("Refused message from %s: %s\n", inet_ntoa(sender), (msgbuf ? msgbuf : "")); if (msgbuf && eoln) *eoln = '\n'; dbgprintf("<- oksender(0)\n"); return 0; } xymon-4.3.28/lib/md5.h0000664000076400007640000000215711615341300014615 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* API for the MD5 digest routines. */ /* */ /* Copyright (C) 2006-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __MD5_H__ #define __MD5_H__ extern int myMD5_Size(void); extern void myMD5_Init(void *pms); extern void myMD5_Update(void *pms, unsigned char *data, int nbytes); extern void myMD5_Final(unsigned char digest[16], void *pms); #endif xymon-4.3.28/lib/locator.c0000664000076400007640000003036411630612042015570 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains routines for communicating with the Xymon locator service. */ /* */ /* Copyright (C) 2006-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: locator.c 6745 2011-09-04 06:01:06Z storner $"; #include #include #ifdef HAVE_SYS_SELECT_H #include #endif #include #include #include #include #include #include #include #include #include #include "libxymon.h" #include const char *servicetype_names[] = { "rrd", "client", "alert", "history", "hostdata" }; static struct sockaddr_in myaddr; static socklen_t myaddrsz = 0; static int locatorsocket = -1; #define DEFAULT_CACHETIMEOUT (15*60) /* 15 minutes */ static void * locatorcache[ST_MAX]; static int havecache[ST_MAX] = {0,}; static int cachetimeout[ST_MAX] = {0,}; typedef struct cacheitm_t { char *key, *resp; time_t tstamp; } cacheitm_t; enum locator_servicetype_t get_servicetype(char *typestr) { enum locator_servicetype_t res = 0; while ((res < ST_MAX) && (strcmp(typestr, servicetype_names[res]))) res++; return res; } static int call_locator(char *buf, size_t bufsz) { int n, bytesleft; fd_set fds; struct timeval tmo; char *bufp; /* First, send the request */ bufp = buf; bytesleft = strlen(buf)+1; do { FD_ZERO(&fds); FD_SET(locatorsocket, &fds); tmo.tv_sec = 5; tmo.tv_usec = 0; n = select(locatorsocket+1, NULL, &fds, NULL, &tmo); if (n == 0) { errprintf("Send to locator failed: Timeout\n"); return -1; } else if (n == -1) { errprintf("Send to locator failed: %s\n", strerror(errno)); return -1; } n = send(locatorsocket, bufp, bytesleft, 0); if (n == -1) { errprintf("Send to locator failed: %s\n", strerror(errno)); return -1; } else { bytesleft -= n; bufp += n; } } while (bytesleft > 0); /* Then read the response */ FD_ZERO(&fds); FD_SET(locatorsocket, &fds); tmo.tv_sec = 5; tmo.tv_usec = 0; n = select(locatorsocket+1, &fds, NULL, NULL, &tmo); if (n > 0) { n = recv(locatorsocket, buf, bufsz-1, 0); if (n == -1) { errprintf("call_locator() recv() failed: %s\n", strerror(errno)); return -1; } buf[n] = '\0'; } else { errprintf("call_locator() comm failure: %s\n", (n == 0) ? "Timeout" : strerror(errno)); return -1; } return 0; } static char *locator_querycache(enum locator_servicetype_t svc, char *key) { xtreePos_t handle; cacheitm_t *itm; if (!havecache[svc]) return NULL; handle = xtreeFind(locatorcache[svc], key); if (handle == xtreeEnd(locatorcache[svc])) return NULL; itm = (cacheitm_t *)xtreeData(locatorcache[svc], handle); return (itm->tstamp + cachetimeout[svc]) > getcurrenttime(NULL) ? itm->resp : NULL; } static void locator_updatecache(enum locator_servicetype_t svc, char *key, char *resp) { xtreePos_t handle; cacheitm_t *newitm; if (!havecache[svc]) return; handle = xtreeFind(locatorcache[svc], key); if (handle == xtreeEnd(locatorcache[svc])) { newitm = (cacheitm_t *)calloc(1, sizeof(cacheitm_t)); newitm->key = strdup(key); newitm->resp = strdup(resp); if (xtreeAdd(locatorcache[svc], newitm->key, newitm) != XTREE_STATUS_OK) { xfree(newitm->key); xfree(newitm->resp); xfree(newitm); } } else { newitm = (cacheitm_t *)xtreeData(locatorcache[svc], handle); if (newitm->resp) xfree(newitm->resp); newitm->resp = strdup(resp); newitm->tstamp = getcurrenttime(NULL); } } void locator_flushcache(enum locator_servicetype_t svc, char *key) { xtreePos_t handle; if (!havecache[svc]) return; if (key) { handle = xtreeFind(locatorcache[svc], key); if (handle != xtreeEnd(locatorcache[svc])) { cacheitm_t *itm = (cacheitm_t *)xtreeData(locatorcache[svc], handle); itm->tstamp = 0; } } else { for (handle = xtreeFirst(locatorcache[svc]); (handle != xtreeEnd(locatorcache[svc])); handle = xtreeNext(locatorcache[svc], handle)) { cacheitm_t *itm = (cacheitm_t *)xtreeData(locatorcache[svc], handle); itm->tstamp = 0; } } } void locator_prepcache(enum locator_servicetype_t svc, int timeout) { if (!havecache[svc]) { locatorcache[svc] = xtreeNew(strcasecmp); havecache[svc] = 1; } else { locator_flushcache(svc, NULL); } cachetimeout[svc] = ((timeout>0) ? timeout : DEFAULT_CACHETIMEOUT); } char *locator_cmd(char *cmd) { static char pingbuf[512]; int res; strcpy(pingbuf, cmd); res = call_locator(pingbuf, sizeof(pingbuf)); return (res == 0) ? pingbuf : NULL; } char *locator_ping(void) { return locator_cmd("p"); } int locator_init(char *ipport) { char *ip, *p; int portnum; if (locatorsocket >= 0) { close(locatorsocket); locatorsocket = -1; } locatorsocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (locatorsocket == -1) { errprintf("Cannot get socket: %s\n", strerror(errno)); return -1; } ip = strdup(ipport); p = strchr(ip, ':'); if (p) { *p = '\0'; portnum = atoi(p+1); } else { portnum = atoi(xgetenv("XYMONDPORT")); } memset(&myaddr, 0, sizeof(myaddr)); inet_aton(ip, (struct in_addr *) &myaddr.sin_addr.s_addr); myaddr.sin_port = htons(portnum); myaddr.sin_family = AF_INET; myaddrsz = sizeof(myaddr); if (connect(locatorsocket, (struct sockaddr *)&myaddr, myaddrsz) == -1) { errprintf("Cannot set target address for locator: %s:%d (%s)\n", ip, portnum, strerror(errno)); close(locatorsocket); locatorsocket = -1; return -1; } fcntl(locatorsocket, F_SETFL, O_NONBLOCK); return (locator_ping() ? 0 : -1); } int locator_register_server(char *servername, enum locator_servicetype_t svctype, int weight, enum locator_sticky_t sticky, char *extras) { char *buf; int bufsz; int res; bufsz = strlen(servername) + 100; if (extras) bufsz += (strlen(extras) + 1); buf = (char *)malloc(bufsz); if (sticky == LOC_SINGLESERVER) weight = -1; sprintf(buf, "S|%s|%s|%d|%d|%s", servername, servicetype_names[svctype], weight, ((sticky == LOC_STICKY) ? 1 : 0), (extras ? extras : "")); res = call_locator(buf, bufsz); xfree(buf); return res; } int locator_register_host(char *hostname, enum locator_servicetype_t svctype, char *servername) { char *buf; int bufsz; int res; bufsz = strlen(servername) + strlen(hostname) + 100; buf = (char *)malloc(bufsz); sprintf(buf, "H|%s|%s|%s", hostname, servicetype_names[svctype], servername); res = call_locator(buf, bufsz); xfree(buf); return res; } int locator_rename_host(char *oldhostname, char *newhostname, enum locator_servicetype_t svctype) { char *buf; int bufsz; int res; bufsz = strlen(oldhostname) + strlen(newhostname) + 100; buf = (char *)malloc(bufsz); sprintf(buf, "M|%s|%s|%s", oldhostname, servicetype_names[svctype], newhostname); res = call_locator(buf, bufsz); xfree(buf); return res; } char *locator_query(char *hostname, enum locator_servicetype_t svctype, char **extras) { static char *buf = NULL; static int bufsz = 0; int res, bufneeded; bufneeded = strlen(hostname) + 100; if (extras) bufneeded += 1024; if (!buf) { bufsz = bufneeded; buf = (char *)malloc(bufsz); } else if (bufneeded > bufsz) { bufsz = bufneeded; buf = (char *)realloc(buf, bufsz); } if (havecache[svctype] && !extras) { char *cachedata = locator_querycache(svctype, hostname); if (cachedata) return cachedata; } sprintf(buf, "Q|%s|%s", servicetype_names[svctype], hostname); if (extras) buf[0] = 'X'; res = call_locator(buf, bufsz); if (res == -1) return NULL; switch (*buf) { case '!': /* This host is fixed on an available server */ case '*': /* Roaming host */ if (extras) { *extras = strchr(buf+2, '|'); if (**extras == '|') { **extras = '\0'; (*extras)++; } } if (havecache[svctype] && !extras) locator_updatecache(svctype, hostname, buf+2); return ((strlen(buf) > 2) ? buf+2 : NULL); case '?': /* No available server to handle the request */ locator_flushcache(svctype, hostname); return NULL; } return NULL; } int locator_serverdown(char *servername, enum locator_servicetype_t svctype) { char *buf; int bufsz; int res; bufsz = strlen(servername) + 100; buf = (char *)malloc(bufsz); sprintf(buf, "D|%s|%s", servername, servicetype_names[svctype]); res = call_locator(buf, bufsz); locator_flushcache(svctype, NULL); xfree(buf); return res; } int locator_serverup(char *servername, enum locator_servicetype_t svctype) { char *buf; int bufsz; int res; bufsz = strlen(servername) + 100; buf = (char *)malloc(bufsz); sprintf(buf, "U|%s|%s", servername, servicetype_names[svctype]); res = call_locator(buf, bufsz); xfree(buf); return res; } int locator_serverforget(char *servername, enum locator_servicetype_t svctype) { char *buf; int bufsz; int res; bufsz = strlen(servername) + 100; buf = (char *)malloc(bufsz); sprintf(buf, "F|%s|%s", servername, servicetype_names[svctype]); res = call_locator(buf, bufsz); locator_flushcache(svctype, NULL); xfree(buf); return res; } #ifdef STANDALONE int main(int argc, char *argv[]) { char buf[1024]; int done = 0; char *res; if (argc < 2) { printf("Usage: %s IP:PORT\n", argv[0]); return 1; } if (locator_init(argv[1]) == -1) { printf("Locator ping failed\n"); return 1; } else { printf("Locator is available\n"); } while (!done) { char *p, *p1, *p2, *p3, *p4, *p5, *p6, *p7; char *extras; printf("Commands:\n"); printf(" r(egister) s servername type weight sticky\n"); printf(" r(egister) h servername type hostname\n"); printf(" d(own) servername type\n"); printf(" u(p) servername type\n"); printf(" f(orget) servername type\n"); printf(" q(uery) hostname type\n"); printf(" x(query) hostname type\n"); printf(" p(ing)\n"); printf(" s(ave state)\n"); printf(">"); fflush(stdout); done = (fgets(buf, sizeof(buf), stdin) == NULL); if (done) continue; p = strchr(buf, '\n'); if (p) *p = '\0'; p1 = p2 = p3 = p4 = p5 = p6 = p7 = NULL; p1 = strtok(buf, " "); if (p1) p2 = strtok(NULL, " "); if (p2) p3 = strtok(NULL, " "); if (p3) p4 = strtok(NULL, " "); if (p4) p5 = strtok(NULL, " "); if (p5) p6 = strtok(NULL, " "); if (p6) p7 = strtok(NULL, "\r\n"); switch (*p1) { case 'R': case 'r': if (*p2 == 's') { enum locator_servicetype_t svc; enum locator_sticky_t sticky; int weight; svc = get_servicetype(p4); weight = (p5 ? atoi(p5) : 1); sticky = ((p6 && (atoi(p6) == 1)) ? LOC_STICKY : LOC_ROAMING); printf("%s\n", locator_register_server(p3, svc, weight, sticky, p7) ? "Failed" : "OK"); } else if (*p2 == 'h') { printf("%s\n", locator_register_host(p5, get_servicetype(p4), p3) ? "Failed" : "OK"); } break; case 'D': case 'd': printf("%s\n", locator_serverdown(p2, get_servicetype(p3)) ? "Failed" : "OK"); break; case 'U': case 'u': printf("%s\n", locator_serverup(p2, get_servicetype(p3)) ? "Failed" : "OK"); break; case 'F': case 'f': printf("%s\n", locator_serverforget(p2, get_servicetype(p3)) ? "Failed" : "OK"); break; case 'Q': case 'q': case 'X': case 'x': extras = NULL; res = locator_query(p2, get_servicetype(p3), (*p1 == 'x') ? &extras : NULL); if (res) { printf("Result: %s\n", res); if (extras) printf(" Extras gave: %s\n", extras); } else { printf("Failed\n"); } break; case 'P': case 'p': p = locator_cmd("p"); if (p == NULL) printf("Failed\n"); else printf("OK: %s\n", p); break; case 'S': case 's': p = locator_cmd("@"); if (p == NULL) printf("Failed\n"); else printf("OK: %s\n", p); break; } } return 0; } #endif xymon-4.3.28/lib/digest.c0000664000076400007640000001515511615341300015404 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is used to implement message digest functions (MD5, SHA1 etc.) */ /* */ /* Copyright (C) 2003-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: digest.c 6712 2011-07-31 21:01:52Z storner $"; #include #include #include #include #include "libxymon.h" char *md5hash(char *input) { /* We have a fast MD5 hash function, since that may be used a lot */ static struct digestctx_t *ctx = NULL; unsigned char md_value[16]; static char md_string[2*16+1]; int i; char *p; if (!ctx) { ctx = (digestctx_t *) malloc(sizeof(digestctx_t)); ctx->digestname = strdup("md5"); ctx->digesttype = D_MD5; ctx->mdctx = (void *)malloc(myMD5_Size()); } myMD5_Init(ctx->mdctx); myMD5_Update(ctx->mdctx, input, strlen(input)); myMD5_Final(md_value, ctx->mdctx); for(i = 0, p = md_string; (i < sizeof(md_value)); i++) p += sprintf(p, "%02x", md_value[i]); *p = '\0'; return md_string; } digestctx_t *digest_init(char *digest) { struct digestctx_t *ctx = NULL; if (strcmp(digest, "md5") == 0) { /* Use the built in MD5 routines */ ctx = (digestctx_t *) malloc(sizeof(digestctx_t)); ctx->digestname = strdup(digest); ctx->digesttype = D_MD5; ctx->mdctx = (void *)malloc(myMD5_Size()); myMD5_Init(ctx->mdctx); } else if (strcmp(digest, "sha1") == 0) { /* Use the built in SHA1 routines */ ctx = (digestctx_t *) malloc(sizeof(digestctx_t)); ctx->digestname = strdup(digest); ctx->digesttype = D_SHA1; ctx->mdctx = (void *)malloc(mySHA1_Size()); mySHA1_Init(ctx->mdctx); } else if (strcmp(digest, "rmd160") == 0) { /* Use the built in RMD160 routines */ ctx = (digestctx_t *) malloc(sizeof(digestctx_t)); ctx->digestname = strdup(digest); ctx->digesttype = D_RMD160; ctx->mdctx = (void *)malloc(myRIPEMD160_Size()); myRIPEMD160_Init(ctx->mdctx); } else if (strcmp(digest, "sha512") == 0) { /* Use the built in SHA-512 routines */ ctx = (digestctx_t *) malloc(sizeof(digestctx_t)); ctx->digestname = strdup(digest); ctx->digesttype = D_SHA512; ctx->mdctx = (void *)malloc(mySHA512_Size()); mySHA512_Init(ctx->mdctx); } else if (strcmp(digest, "sha256") == 0) { /* Use the built in SHA-256 routines */ ctx = (digestctx_t *) malloc(sizeof(digestctx_t)); ctx->digestname = strdup(digest); ctx->digesttype = D_SHA256; ctx->mdctx = (void *)malloc(mySHA256_Size()); mySHA256_Init(ctx->mdctx); } else if (strcmp(digest, "sha224") == 0) { /* Use the built in SHA-224 routines */ ctx = (digestctx_t *) malloc(sizeof(digestctx_t)); ctx->digestname = strdup(digest); ctx->digesttype = D_SHA224; ctx->mdctx = (void *)malloc(mySHA224_Size()); mySHA224_Init(ctx->mdctx); } else if (strcmp(digest, "sha384") == 0) { /* Use the built in SHA-384 routines */ ctx = (digestctx_t *) malloc(sizeof(digestctx_t)); ctx->digestname = strdup(digest); ctx->digesttype = D_SHA384; ctx->mdctx = (void *)malloc(mySHA384_Size()); mySHA384_Init(ctx->mdctx); } else { errprintf("digest_init failure: Cannot handle digest %s\n", digest); return NULL; } return ctx; } int digest_data(digestctx_t *ctx, unsigned char *buf, int buflen) { switch (ctx->digesttype) { case D_MD5: myMD5_Update(ctx->mdctx, buf, buflen); break; case D_SHA1: mySHA1_Update(ctx->mdctx, buf, buflen); break; case D_RMD160: myRIPEMD160_Update(ctx->mdctx, buf, buflen); break; case D_SHA512: mySHA512_Update(ctx->mdctx, buf, buflen); break; case D_SHA256: mySHA256_Update(ctx->mdctx, buf, buflen); break; case D_SHA384: mySHA384_Update(ctx->mdctx, buf, buflen); break; case D_SHA224: mySHA224_Update(ctx->mdctx, buf, buflen); break; } return 0; } char *digest_done(digestctx_t *ctx) { unsigned int md_len = 0; unsigned char *md_value = NULL; char *md_string = NULL; int i; char *p; switch (ctx->digesttype) { case D_MD5: /* Built in MD5 hash */ md_len = 16; md_value = (unsigned char *)malloc(md_len*sizeof(unsigned char)); md_string = (char *)malloc((2*md_len + strlen(ctx->digestname) + 2)*sizeof(char)); myMD5_Final(md_value, ctx->mdctx); break; case D_SHA1: /* Built in SHA1 hash */ md_len = 20; md_value = (unsigned char *)malloc(md_len*sizeof(unsigned char)); md_string = (char *)malloc((2*md_len + strlen(ctx->digestname) + 2)*sizeof(char)); mySHA1_Final(md_value, ctx->mdctx); break; case D_RMD160: /* Built in RMD160 hash */ md_len = 20; md_value = (unsigned char *)malloc(md_len*sizeof(unsigned char)); md_string = (char *)malloc((2*md_len + strlen(ctx->digestname) + 2)*sizeof(char)); myRIPEMD160_Final(md_value, ctx->mdctx); break; case D_SHA512: /* Built in SHA-512 hash */ md_len = (512/8); md_value = (unsigned char *)malloc(md_len*sizeof(unsigned char)); md_string = (char *)malloc((2*md_len + strlen(ctx->digestname) + 2)*sizeof(char)); mySHA512_Final(md_value, ctx->mdctx); break; case D_SHA256: /* Built in SHA-256 hash */ md_len = (256/8); md_value = (unsigned char *)malloc(md_len*sizeof(unsigned char)); md_string = (char *)malloc((2*md_len + strlen(ctx->digestname) + 2)*sizeof(char)); mySHA256_Final(md_value, ctx->mdctx); break; case D_SHA384: /* Built in SHA-384 hash */ md_len = (384/8); md_value = (unsigned char *)malloc(md_len*sizeof(unsigned char)); md_string = (char *)malloc((2*md_len + strlen(ctx->digestname) + 2)*sizeof(char)); mySHA384_Final(md_value, ctx->mdctx); break; case D_SHA224: /* Built in SHA-224 hash */ md_len = (224/8); md_value = (unsigned char *)malloc(md_len*sizeof(unsigned char)); md_string = (char *)malloc((2*md_len + strlen(ctx->digestname) + 2)*sizeof(char)); mySHA224_Final(md_value, ctx->mdctx); break; } sprintf(md_string, "%s:", ctx->digestname); for(i = 0, p = md_string + strlen(md_string); (i < md_len); i++) p += sprintf(p, "%02x", md_value[i]); *p = '\0'; xfree(md_value); xfree(ctx->digestname); xfree(ctx->mdctx); xfree(ctx); return md_string; } xymon-4.3.28/lib/holidays.c0000664000076400007640000004433112175367354015762 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains routines for handling holidays. */ /* */ /* Copyright (C) 2006-2008 Michael Nagel */ /* Modifications for Xymon (C) 2007-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: holidays.c 7240 2013-07-29 04:26:20Z storner $"; #include #include #include #include #include #include #include #include "libxymon.h" static int holidays_like_weekday = -1; typedef struct holidayset_t { char *key; holiday_t *head; holiday_t *tail; } holidayset_t; static void * holidays; static int current_year = 0; static time_t mkday(int year, int month, int day) { struct tm t; memset(&t, 0, sizeof(t)); t.tm_year = year; t.tm_mon = month - 1; t.tm_mday = day; t.tm_isdst = -1; return mktime(&t); } /* * Algorithm for calculating the date of Easter Sunday * (Meeus/Jones/Butcher Gregorian algorithm) * For reference, see http://en.wikipedia.org/wiki/Computus */ static time_t getEasterDate(int year) { time_t day; int Y = year+1900; int a = Y % 19; int b = Y / 100; int c = Y % 100; int d = b / 4; int e = b % 4; int f = (b + 8) / 25; int g = (b - f + 1) / 3; int h = (19 * a + b - d - g + 15) % 30; int i = c / 4; int k = c % 4; int L = (32 + 2 * e + 2 * i - h - k) % 7; int m = (a + 11 * h + 22 * L) / 451; day = mkday(year, (h + L - 7 * m + 114) / 31, ((h + L - 7 * m + 114) % 31) + 1); return day; } /* Algorithm to compute the 4th Sunday in Advent (ie the last Sunday before Christmas Day) */ static time_t get4AdventDate(int year) { time_t day; struct tm *t; day = mkday(year, 12, 24); t = localtime(&day); day -= t->tm_wday * 86400; return day; } static int getnumberedweekday(int wkday, int daynum, int month, int year) { struct tm tm; /* First see what weekday the 1st of this month is */ memset(&tm, 0, sizeof(tm)); tm.tm_mon = (month - 1); tm.tm_year = year; tm.tm_mday = 1; tm.tm_isdst = -1; mktime(&tm); if (tm.tm_wday != wkday) { /* Skip forward so we reach the first of the wanted weekdays */ tm.tm_mday += (wkday - tm.tm_wday); if (tm.tm_mday < 1) tm.tm_mday += 7; tm.tm_isdst = -1; mktime(&tm); } /* t and tm now has the 1st wkday in this month. So skip to the one we want */ tm.tm_mday += 7*(daynum - 1); /* Check if we overflowed into next month (if daynum == 5) */ mktime(&tm); tm.tm_isdst = -1; if ((daynum == 5) && (tm.tm_mon != (month - 1))) { /* We drifted into the next month. Go back one week to return the last wkday of the month */ tm.tm_mday -= 7; tm.tm_isdst = -1; mktime(&tm); } return tm.tm_yday; } static int getweekdayafter(int wkday, int daynum, int month, int year) { struct tm tm; /* First see what weekday this date is */ memset(&tm, 0, sizeof(tm)); tm.tm_mon = (month - 1); tm.tm_year = year; tm.tm_mday = daynum; tm.tm_isdst = -1; mktime(&tm); if (tm.tm_wday != wkday) { /* Skip forward so we reach the wanted weekday */ tm.tm_mday += (wkday - tm.tm_wday); if (tm.tm_mday < daynum) tm.tm_mday += 7; tm.tm_isdst = -1; mktime(&tm); } return tm.tm_yday; } static void reset_holidays(void) { static int firsttime = 1; xtreePos_t handle; holidayset_t *hset; holiday_t *walk, *zombie; if (!firsttime) { for (handle = xtreeFirst(holidays); (handle != xtreeEnd(holidays)); handle = xtreeNext(holidays, handle)) { hset = (holidayset_t *)xtreeData(holidays, handle); xfree(hset->key); walk = hset->head; while (walk) { zombie = walk; walk = walk->next; xfree(zombie->desc); xfree(zombie); } } xtreeDestroy(holidays); } holidays_like_weekday = -1; firsttime = 0; holidays = xtreeNew(strcasecmp); } static void add_holiday(char *key, int year, holiday_t *newhol) { int isOK = 0; struct tm *t; time_t day; holiday_t *newitem; xtreePos_t handle; holidayset_t *hset; switch (newhol->holtype) { case HOL_ABSOLUTE: isOK = ( (newhol->month >= 1 && newhol->month <=12) && (newhol->day >=1 && newhol->day <=31) && (!newhol->year || (newhol->year == year)) ); if (!isOK) break; day = mkday(year, newhol->month, newhol->day); t = localtime(&day); newhol->yday = t->tm_yday; break; case HOL_EASTER: isOK = (newhol->month == 0); if (!isOK) break; day = getEasterDate(year); t = localtime(&day); newhol->yday = t->tm_yday + newhol->day; break; case HOL_ADVENT: isOK = (newhol->month == 0); if (!isOK) break; day = get4AdventDate(year); t = localtime(&day); newhol->yday = t->tm_yday + newhol->day; break; case HOL_MON: isOK = ( (newhol->month >= 1 && newhol->month <=12) && (newhol->day >=1 && newhol->day <= 5) ); if (!isOK) break; newhol->yday = getnumberedweekday(1, newhol->day, newhol->month, year); break; case HOL_TUE: isOK = ( (newhol->month >= 1 && newhol->month <=12) && (newhol->day >=1 && newhol->day <= 5) ); if (!isOK) break; newhol->yday = getnumberedweekday(2, newhol->day, newhol->month, year); break; case HOL_WED: isOK = ( (newhol->month >= 1 && newhol->month <=12) && (newhol->day >=1 && newhol->day <= 5) ); if (!isOK) break; newhol->yday = getnumberedweekday(3, newhol->day, newhol->month, year); break; case HOL_THU: isOK = ( (newhol->month >= 1 && newhol->month <=12) && (newhol->day >=1 && newhol->day <= 5) ); if (!isOK) break; newhol->yday = getnumberedweekday(4, newhol->day, newhol->month, year); break; case HOL_FRI: isOK = ( (newhol->month >= 1 && newhol->month <=12) && (newhol->day >=1 && newhol->day <= 5) ); if (!isOK) break; newhol->yday = getnumberedweekday(5, newhol->day, newhol->month, year); break; case HOL_SAT: isOK = ( (newhol->month >= 1 && newhol->month <=12) && (newhol->day >=1 && newhol->day <= 5) ); if (!isOK) break; newhol->yday = getnumberedweekday(6, newhol->day, newhol->month, year); break; case HOL_SUN: isOK = ( (newhol->month >= 1 && newhol->month <=12) && (newhol->day >=1 && newhol->day <= 5) ); if (!isOK) break; newhol->yday = getnumberedweekday(0, newhol->day, newhol->month, year); break; case HOL_MON_AFTER: isOK = ( (newhol->month >= 1 && newhol->month <=12) && (newhol->day >=1 && newhol->day <= 31) ); if (!isOK) break; newhol->yday = getweekdayafter(1, newhol->day, newhol->month, year); break; case HOL_TUE_AFTER: isOK = ( (newhol->month >= 1 && newhol->month <=12) && (newhol->day >=1 && newhol->day <= 31) ); if (!isOK) break; newhol->yday = getweekdayafter(2, newhol->day, newhol->month, year); break; case HOL_WED_AFTER: isOK = ( (newhol->month >= 1 && newhol->month <=12) && (newhol->day >=1 && newhol->day <= 31) ); if (!isOK) break; newhol->yday = getweekdayafter(3, newhol->day, newhol->month, year); break; case HOL_THU_AFTER: isOK = ( (newhol->month >= 1 && newhol->month <=12) && (newhol->day >=1 && newhol->day <= 31) ); if (!isOK) break; newhol->yday = getweekdayafter(4, newhol->day, newhol->month, year); break; case HOL_FRI_AFTER: isOK = ( (newhol->month >= 1 && newhol->month <=12) && (newhol->day >=1 && newhol->day <= 31) ); if (!isOK) break; newhol->yday = getweekdayafter(5, newhol->day, newhol->month, year); break; case HOL_SAT_AFTER: isOK = ( (newhol->month >= 1 && newhol->month <=12) && (newhol->day >=1 && newhol->day <= 31) ); if (!isOK) break; newhol->yday = getweekdayafter(6, newhol->day, newhol->month, year); break; case HOL_SUN_AFTER: isOK = ( (newhol->month >= 1 && newhol->month <=12) && (newhol->day >=1 && newhol->day <= 31) ); if (!isOK) break; newhol->yday = getweekdayafter(0, newhol->day, newhol->month, year); break; } if (!isOK) { errprintf("Error in holiday definition %s\n", newhol->desc); return; } newitem = (holiday_t *)calloc(1, sizeof(holiday_t)); newitem->holtype = newhol->holtype; newitem->day = newhol->day; newitem->month = newhol->month; newitem->desc = strdup(newhol->desc); newitem->yday = newhol->yday; handle = xtreeFind(holidays, key); if (handle == xtreeEnd(holidays)) { hset = (holidayset_t *)calloc(1, sizeof(holidayset_t)); hset->key = strdup(key); xtreeAdd(holidays, hset->key, hset); } else { hset = (holidayset_t *)xtreeData(holidays, handle); } if (hset->head == NULL) { hset->head = hset->tail = newitem; } else { hset->tail->next = newitem; hset->tail = hset->tail->next; } } static int record_compare(void **a, void **b) { holiday_t **reca = (holiday_t **)a; holiday_t **recb = (holiday_t **)b; return ((*reca)->yday < (*recb)->yday); } static void * record_getnext(void *a) { return ((holiday_t *)a)->next; } static void record_setnext(void *a, void *newval) { ((holiday_t *)a)->next = (holiday_t *)newval; } int load_holidays(int year) { static void *configholidays = NULL; char fn[PATH_MAX]; FILE *fd; strbuffer_t *inbuf; holiday_t newholiday; xtreePos_t handle, commonhandle; char *setname = NULL; holidayset_t *commonhols; MEMDEFINE(fn); if (year == 0) { time_t tnow; struct tm *now; tnow = getcurrenttime(NULL); now = localtime(&tnow); year = now->tm_year; } else if (year > 1000) { year -= 1900; } sprintf(fn, "%s/etc/holidays.cfg", xgetenv("XYMONHOME")); /* First check if there were no modifications at all */ if (configholidays) { /* if the new year begins, the holidays have to be recalculated */ if (!stackfmodified(configholidays) && (year == current_year)){ dbgprintf("No files modified, skipping reload of %s\n", fn); MEMUNDEFINE(fn); return 0; } else { stackfclist(&configholidays); configholidays = NULL; } } reset_holidays(); fd = stackfopen(fn, "r", &configholidays); if (!fd) { errprintf("Cannot open configuration file %s\n", fn); MEMUNDEFINE(fn); return 0; } memset(&newholiday,0,sizeof(holiday_t)); inbuf = newstrbuffer(0); while (stackfgets(inbuf, NULL)) { char *p, *delim, *arg1, *arg2; sanitize_input(inbuf, 1, 0); if (STRBUFLEN(inbuf) == 0) continue; p = STRBUF(inbuf); if (strncasecmp(p, "HOLIDAYLIKEWEEKDAY=", 19) == 0) { p+=19; holidays_like_weekday = atoi(p); if (holidays_like_weekday < -1 || holidays_like_weekday > 6) { holidays_like_weekday = -1; errprintf("Invalid HOLIDAYLIKEWEEKDAY in %s\n", fn); } continue; } if (*p == '[') { /* New set of holidays */ if (setname) xfree(setname); delim = strchr(p, ']'); if (delim) *delim = '\0'; setname = strdup(p+1); continue; } delim = strchr(p, ':'); if (delim) { memset(&newholiday,0,sizeof(holiday_t)); if (delim == p) { newholiday.desc = "untitled"; } else { *delim = '\0'; newholiday.desc = p; p=delim+1; } } arg1 = strtok(p, "="); while (arg1) { arg2=strtok(NULL," ,;\t\n\r"); if (!arg2) break; if (strncasecmp(arg1, "TYPE", 4) == 0) { if (strncasecmp(arg2, "STATIC", 6) == 0) newholiday.holtype = HOL_ABSOLUTE; else if (strncasecmp(arg2, "EASTER", 6) == 0) newholiday.holtype = HOL_EASTER; else if (strncasecmp(arg2, "4ADVENT", 7) == 0) newholiday.holtype = HOL_ADVENT; else if (strncasecmp(arg2, "MON", 3) == 0) newholiday.holtype = HOL_MON; else if (strncasecmp(arg2, "TUE", 3) == 0) newholiday.holtype = HOL_TUE; else if (strncasecmp(arg2, "WED", 3) == 0) newholiday.holtype = HOL_WED; else if (strncasecmp(arg2, "THU", 3) == 0) newholiday.holtype = HOL_THU; else if (strncasecmp(arg2, "FRI", 3) == 0) newholiday.holtype = HOL_FRI; else if (strncasecmp(arg2, "SAT", 3) == 0) newholiday.holtype = HOL_SAT; else if (strncasecmp(arg2, "SUN", 3) == 0) newholiday.holtype = HOL_SUN; else if (strncasecmp(arg2, "+MON", 4) == 0) newholiday.holtype = HOL_MON_AFTER; else if (strncasecmp(arg2, "+TUE", 4) == 0) newholiday.holtype = HOL_TUE_AFTER; else if (strncasecmp(arg2, "+WED", 4) == 0) newholiday.holtype = HOL_WED_AFTER; else if (strncasecmp(arg2, "+THU", 4) == 0) newholiday.holtype = HOL_THU_AFTER; else if (strncasecmp(arg2, "+FRI", 4) == 0) newholiday.holtype = HOL_FRI_AFTER; else if (strncasecmp(arg2, "+SAT", 4) == 0) newholiday.holtype = HOL_SAT_AFTER; else if (strncasecmp(arg2, "+SUN", 4) == 0) newholiday.holtype = HOL_SUN_AFTER; } else if (strncasecmp(arg1, "MONTH", 5) == 0) { newholiday.month=atoi(arg2); } else if (strncasecmp(arg1, "DAY", 3) == 0) { newholiday.day=atoi(arg2); } else if (strncasecmp(arg1, "OFFSET", 6) == 0) { newholiday.day=atoi(arg2); } else if (strncasecmp(arg1, "YEAR", 4) == 0) { newholiday.year=atoi(arg2); if (newholiday.year > 1000) { newholiday.year -= 1900; } } arg1 = strtok(NULL,"="); } add_holiday((setname ? setname : ""), year, &newholiday); } stackfclose(fd); freestrbuffer(inbuf); commonhandle = xtreeFind(holidays, ""); commonhols = (commonhandle != xtreeEnd(holidays)) ? (holidayset_t *)xtreeData(holidays, commonhandle) : NULL; for (handle = xtreeFirst(holidays); (handle != xtreeEnd(holidays)); handle = xtreeNext(holidays, handle)) { holidayset_t *oneset = (holidayset_t *)xtreeData(holidays, handle); if (commonhols && (oneset != commonhols)) { /* Add the common holidays to this set */ holiday_t *walk; for (walk = commonhols->head; (walk); walk = walk->next) add_holiday(oneset->key, year, walk); } oneset->head = msort(oneset->head, record_compare, record_getnext, record_setnext); } MEMUNDEFINE(fn); current_year = year; return 0; } static holiday_t *findholiday(char *key, int dayinyear) { xtreePos_t handle; holidayset_t *hset; holiday_t *p; if (key && *key) { handle = xtreeFind(holidays, key); if (handle == xtreeEnd(holidays)) { key = NULL; handle = xtreeFind(holidays, ""); } } else { key = NULL; handle = xtreeFind(holidays, ""); } if (handle != xtreeEnd(holidays)) hset = (holidayset_t *)xtreeData(holidays, handle); else return NULL; p = hset->head; while (p) { if (dayinyear == p->yday) { return p; } p = p->next; } return NULL; } int getweekdayorholiday(char *key, struct tm *t) { holiday_t *rec; if (holidays_like_weekday == -1) return t->tm_wday; rec = findholiday(key, t->tm_yday); if (rec) return holidays_like_weekday; return t->tm_wday; } char *isholiday(char *key, int dayinyear) { holiday_t *rec; rec = findholiday(key, dayinyear); if (rec) return rec->desc; return NULL; } void printholidays(char *key, strbuffer_t *buf, int mfirst, int mlast) { int day; char *fmt; char oneh[1024]; char dstr[1024]; fmt = xgetenv("HOLIDAYFORMAT"); for (day = 0; (day < 366); day++) { char *desc = isholiday(key, day); if (desc) { struct tm tm; time_t t; /* * mktime() ignores the tm_yday parameter, so to get the * actual date for the "yday'th" day of the year we just set * tm_mday to the yday value, and month to January. mktime() * will figure out that the 56th of January is really Feb 25. * * Note: tm_yday is zero-based, but tm_mday is 1-based! */ tm.tm_mon = 0; tm.tm_mday = day+1; tm.tm_year = current_year; tm.tm_hour = 12; tm.tm_min = 0; tm.tm_sec = 0; tm.tm_isdst = -1; t = mktime(&tm); if ((tm.tm_mon >= mfirst) && (tm.tm_mon <= mlast)) { strftime(dstr, sizeof(dstr), fmt, localtime(&t)); sprintf(oneh, "%s%s\n", desc, dstr); addtobuffer(buf, oneh); } } } } #ifdef STANDALONE int main(int argc, char *argv[]) { char l[1024]; char *hset = NULL; char *p; strbuffer_t *sbuf = newstrbuffer(0); char *dayname[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; load_holidays(0); do { printf("$E year, $4 year, $W daynum wkday month year, Setname\n? "); fflush(stdout); if (!fgets(l, sizeof(l), stdin)) return 0; p = strchr(l, '\n'); if (p) *p = '\0'; if (hset) xfree(hset); hset = strdup(l); if (*hset == '$') { time_t t; struct tm *tm; int i; char *tok, *arg[5]; i = 0; tok = strtok(hset, " "); while (tok) { arg[i] = tok; i++; tok = strtok(NULL, " "); } if (arg[0][1] == 'E') { t = getEasterDate(atoi(arg[1]) - 1900); tm = localtime(&t); printf("Easter Sunday %04d is %02d/%02d/%04d\n", atoi(arg[1]), tm->tm_mday, tm->tm_mon+1, tm->tm_year+1900); } else if (arg[0][1] == '4') { t = get4AdventDate(atoi(arg[1]) - 1900); tm = localtime(&t); printf("4Advent %04d is %02d/%02d/%04d\n", atoi(arg[1]), tm->tm_mday, tm->tm_mon+1, tm->tm_year+1900); } else if (arg[0][1] == 'W') { struct tm wtm; memset(&wtm, 0, sizeof(wtm)); wtm.tm_mday = getnumberedweekday(atoi(arg[2]), atoi(arg[1]), atoi(arg[3]), atoi(arg[4])-1900) + 1; wtm.tm_mon = 0; wtm.tm_year = atoi(arg[4]) - 1900; wtm.tm_isdst = -1; mktime(&wtm); printf("The %d. %s in %02d/%04d is %02d/%02d/%04d\n", atoi(arg[1]), dayname[atoi(arg[2])], atoi(arg[3]), atoi(arg[4]), wtm.tm_mday, wtm.tm_mon+1, wtm.tm_year+1900); } else if (arg[0][1] == 'A') { struct tm wtm; memset(&wtm, 0, sizeof(wtm)); wtm.tm_mday = getweekdayafter(atoi(arg[2]), atoi(arg[1]), atoi(arg[3]), atoi(arg[4])-1900) + 1; wtm.tm_mon = 0; wtm.tm_year = atoi(arg[4]) - 1900; wtm.tm_isdst = -1; mktime(&wtm); printf("The %d. %s on or after %02d/%04d is %02d/%02d/%04d\n", atoi(arg[1]), dayname[atoi(arg[2])], atoi(arg[3]), atoi(arg[4]), wtm.tm_mday, wtm.tm_mon+1, wtm.tm_year+1900); } } else { char *set_tok, *y_tok; int year; set_tok = strtok(hset, " "); y_tok = strtok(NULL, " "); year = atoi(y_tok); load_holidays(year); printholidays(set_tok, sbuf, 0, 11); printf("Holidays year %d in set: %s\n", year, STRBUF(sbuf)); clearstrbuffer(sbuf); } } while (1); return 0; } #endif xymon-4.3.28/lib/loadcriticalconf.c0000664000076400007640000003076412003541731017432 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module for Xymon, responsible for loading the */ /* critical.cfg file. */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: loadcriticalconf.c 7117 2012-07-24 15:48:41Z storner $"; #include #include #include #include #include #include #include #include #include #include "libxymon.h" static void * rbconf; static char *defaultfn = NULL; static char *configfn = NULL; static void flushrec(void *k1, void *k2) { char *key; key = (char *)k1; if (*(key + strlen(key) - 1) == '=') { /* Clone record just holds a char string pointing to the origin record */ char *pointsto = (char *)k2; xfree(pointsto); } else { /* Full record */ critconf_t *rec = (critconf_t *)k2; if (rec->crittime) xfree(rec->crittime); if (rec->ttgroup) xfree(rec->ttgroup); if (rec->ttextra) xfree(rec->ttextra); } xfree(key); } int load_critconfig(char *fn) { static void *configfiles = NULL; static int firsttime = 1; FILE *fd; strbuffer_t *inbuf; /* Setup the default configuration filename */ if (!fn) { if (!defaultfn) { char *xymonhome = xgetenv("XYMONHOME"); defaultfn = (char *)malloc(strlen(xymonhome) + strlen(DEFAULT_CRITCONFIGFN) + 2); sprintf(defaultfn, "%s/%s", xymonhome, DEFAULT_CRITCONFIGFN); } fn = defaultfn; } if (configfn && (strcmp(fn, configfn) != 0)) { /* Force full reload - it's a different config file */ if (configfiles) { stackfclist(&configfiles); configfiles = NULL; } } if (configfn) xfree(configfn); configfn = strdup(fn); /* First check if there were no modifications at all */ if (configfiles) { if (!stackfmodified(configfiles)){ dbgprintf("No files modified, skipping reload of %s\n", fn); return 0; } else { stackfclist(&configfiles); configfiles = NULL; } } if (!firsttime) { /* Clean up existing datatree */ xtreePos_t handle; for (handle = xtreeFirst(rbconf); (handle != xtreeEnd(rbconf)); handle = xtreeNext(rbconf, handle)) { flushrec(xtreeKey(rbconf, handle), xtreeData(rbconf, handle)); } xtreeDestroy(rbconf); } firsttime = 0; rbconf = xtreeNew(strcasecmp); fd = stackfopen(fn, "r", &configfiles); if (fd == NULL) return 1; inbuf = newstrbuffer(0); while (stackfgets(inbuf, NULL)) { /* Full record : Host service START END TIMESPEC TTPrio TTGroup TTExtra */ /* Clone record: Host =HOST */ char *ehost, *eservice, *estart, *eend, *etime, *ttgroup, *ttextra, *updinfo; int ttprio = 0; critconf_t *newitem; xtreeStatus_t status; int idx = 0; ehost = gettok(STRBUF(inbuf), "|\n"); if (!ehost) continue; eservice = gettok(NULL, "|\n"); if (!eservice) continue; if (*eservice == '=') { char *key = (char *)malloc(strlen(ehost) + 2); char *pointsto = strdup(eservice+1); sprintf(key, "%s=", ehost); status = xtreeAdd(rbconf, key, pointsto); } else { estart = gettok(NULL, "|\n"); if (!estart) continue; eend = gettok(NULL, "|\n"); if (!eend) continue; etime = gettok(NULL, "|\n"); if (!etime) continue; ttprio = atoi(gettok(NULL, "|\n")); if (ttprio == 0) continue; ttgroup = gettok(NULL, "|\n"); ttextra = gettok(NULL, "|\n"); updinfo = gettok(NULL, "|\n"); newitem = (critconf_t *)malloc(sizeof(critconf_t)); newitem->key = (char *)malloc(strlen(ehost) + strlen(eservice) + 15); sprintf(newitem->key, "%s|%s", ehost, eservice); newitem->starttime= ((estart && *estart) ? atoi(estart) : 0); newitem->endtime = ((eend && *eend) ? atoi(eend) : 0); newitem->crittime = ((etime && *etime) ? strdup(etime) : NULL); newitem->priority = ttprio; newitem->ttgroup = strdup(ttgroup); newitem->ttextra = strdup(ttextra); newitem->updinfo = strdup(updinfo); status = xtreeAdd(rbconf, newitem->key, newitem); while (status == XTREE_STATUS_DUPLICATE_KEY) { idx++; sprintf(newitem->key, "%s|%s|%d", ehost, eservice, idx); status = xtreeAdd(rbconf, newitem->key, newitem); } } } stackfclose(fd); freestrbuffer(inbuf); if (debug) { xtreePos_t handle; handle = xtreeFirst(rbconf); while (handle != xtreeEnd(rbconf)) { printf("%s\n", (char *)xtreeKey(rbconf, handle)); handle = xtreeNext(rbconf, handle); } } return 0; } static xtreePos_t findrec(char *key) { xtreePos_t handle; handle = xtreeFind(rbconf, key); if (handle == xtreeEnd(rbconf)) { /* Check if there's a clone pointer record */ char *clonekey, *p; clonekey = strdup(key); p = strchr(clonekey, '|'); if (p && *(p+1)) { *p = '='; *(p+1) = '\0'; } handle = xtreeFind(rbconf, clonekey); xfree(clonekey); if (handle != xtreeEnd(rbconf)) { char *pointsto; char *service; /* Get the origin record for this cloned record, using the same service name */ pointsto = (char *)xtreeData(rbconf, handle); service = strchr(key, '|'); if (service) { service++; clonekey = (char *)malloc(strlen(pointsto) + strlen(service) + 2); sprintf(clonekey, "%s|%s", pointsto, service); handle = xtreeFind(rbconf, clonekey); xfree(clonekey); } else handle = xtreeEnd(rbconf); } } return handle; } static int timecheck(time_t starttime, time_t endtime, char *crittime) { time_t now = getcurrenttime(NULL); if (starttime && (now < starttime)) return 0; if (endtime && (now > endtime)) return 0; if ((crittime == NULL) || within_sla(NULL, crittime, 0)) return 1; /* FIXME */ return 0; } critconf_t *get_critconfig(char *key, int flags, char **resultkey) { static xtreePos_t handle; static char *realkey = NULL; critconf_t *result = NULL; int isclone; if (resultkey) *resultkey = NULL; switch (flags) { case CRITCONF_TIMEFILTER: handle = findrec(key); /* We may have hit a cloned record, so use the real key for further searches */ if (handle != xtreeEnd(rbconf)) { realkey = (char *)xtreeKey(rbconf, handle); } while (handle != xtreeEnd(rbconf)) { result = (critconf_t *)xtreeData(rbconf, handle); if (timecheck(result->starttime, result->endtime, result->crittime)) return result; /* Go to the next */ handle = xtreeNext(rbconf, handle); if (handle != xtreeEnd(rbconf)) { critconf_t *rec = (critconf_t *)xtreeData(rbconf, handle); if (strncmp(realkey, rec->key, strlen(realkey)) != 0) handle=xtreeEnd(rbconf); } } realkey = NULL; break; case CRITCONF_FIRSTMATCH: handle = findrec(key); realkey = NULL; if (handle != xtreeEnd(rbconf)) { realkey = (char *)xtreeKey(rbconf, handle); } break; case CRITCONF_FIRST: realkey = NULL; handle = xtreeFirst(rbconf); if (handle == xtreeEnd(rbconf)) return NULL; do { realkey = (char *)xtreeKey(rbconf, handle); isclone = (*(realkey + strlen(realkey) - 1) == '='); if (isclone) handle = xtreeNext(rbconf, handle); } while (isclone && (handle != xtreeEnd(rbconf))); break; case CRITCONF_NEXT: if (!realkey || (handle == xtreeEnd(rbconf))) return NULL; isclone = 1; while (isclone && (handle != xtreeEnd(rbconf))) { handle = xtreeNext(rbconf, handle); if (handle) { realkey = (char *)xtreeKey(rbconf, handle); isclone = (*(realkey + strlen(realkey) - 1) == '='); } } break; case CRITCONF_RAW_FIRST: handle = xtreeFirst(rbconf); realkey = NULL; break; case CRITCONF_RAW_NEXT: handle = xtreeNext(rbconf, handle); realkey = NULL; break; case CRITCONF_FIRSTHOSTMATCH: do { int found = 0; char *delim; realkey = NULL; handle = xtreeFirst(rbconf); while (!found && (handle != xtreeEnd(rbconf))) { realkey = (char *)xtreeKey(rbconf, handle); delim = realkey + strlen(key); /* OK even if past end of realkey */ found = ((strncmp(realkey, key, strlen(key)) == 0) && ((*delim == '|') || (*delim == '='))); if (!found) { handle = xtreeNext(rbconf, handle); realkey = NULL; } } if ((handle != xtreeEnd(rbconf)) && (*(realkey + strlen(realkey) - 1) == '=')) { key = (char *)xtreeData(rbconf, handle); isclone = 1; } else isclone = 0; } while (isclone && (handle != xtreeEnd(rbconf))); break; } if (handle == xtreeEnd(rbconf)) { realkey = NULL; return NULL; } if (resultkey) *resultkey = (char *)xtreeKey(rbconf, handle); result = (critconf_t *)xtreeData(rbconf, handle); return result; } int update_critconfig(critconf_t *rec) { char *bakfn; FILE *bakfd; unsigned char buf[8192]; int n; struct stat st; struct utimbuf ut; xtreePos_t handle; FILE *fd; int result = 0; /* First, copy the old file */ bakfn = (char *)malloc(strlen(configfn) + 5); sprintf(bakfn, "%s.bak", configfn); if (stat(configfn, &st) == 0) { ut.actime = st.st_atime; ut.modtime = st.st_mtime; } else ut.actime = ut.modtime = getcurrenttime(NULL); fd = fopen(configfn, "r"); if (fd) { bakfd = fopen(bakfn, "w"); if (bakfd) { while ((n = fread(buf, 1, sizeof(buf), fd)) > 0) fwrite(buf, 1, n, bakfd); fclose(bakfd); utime(bakfn, &ut); } fclose(fd); } xfree(bakfn); fd = fopen(configfn, "w"); if (fd == NULL) { errprintf("Cannot open output file %s\n", configfn); return 1; } if (rec) { handle = xtreeFind(rbconf, rec->key); if (handle == xtreeEnd(rbconf)) xtreeAdd(rbconf, rec->key, rec); } handle = xtreeFirst(rbconf); while (handle != xtreeEnd(rbconf)) { char *onekey; onekey = (char *)xtreeKey(rbconf, handle); if (*(onekey + strlen(onekey) - 1) == '=') { char *pointsto = (char *)xtreeData(rbconf, handle); char *hostname; hostname = strdup(onekey); *(hostname + strlen(hostname) - 1) = '\0'; fprintf(fd, "%s|=%s\n", hostname, pointsto); } else { critconf_t *onerec = (critconf_t *)xtreeData(rbconf, handle); char startstr[20], endstr[20]; *startstr = *endstr = '\0'; if (onerec->starttime > 0) sprintf(startstr, "%d", (int)onerec->starttime); if (onerec->endtime > 0) sprintf(endstr, "%d", (int)onerec->endtime); fprintf(fd, "%s|%s|%s|%s|%d|%s|%s|%s\n", onekey, startstr, endstr, (onerec->crittime ? onerec->crittime : ""), onerec->priority, (onerec->ttgroup ? onerec->ttgroup : ""), (onerec->ttextra ? onerec->ttextra : ""), (onerec->updinfo ? onerec->updinfo : "")); } handle = xtreeNext(rbconf, handle); } fclose(fd); return result; } void addclone_critconfig(char *origin, char *newclone) { char *newkey; xtreePos_t handle; newkey = (char *)malloc(strlen(newclone) + 2); sprintf(newkey, "%s=", newclone); handle = xtreeFind(rbconf, newkey); if (handle != xtreeEnd(rbconf)) dropclone_critconfig(newclone); xtreeAdd(rbconf, newkey, strdup(origin)); } void dropclone_critconfig(char *drop) { xtreePos_t handle; char *key; char *dropkey, *dropsrc; key = (char *)malloc(strlen(drop) + 2); sprintf(key, "%s=", drop); handle = xtreeFind(rbconf, key); if (handle == xtreeEnd(rbconf)) return; dropkey = (char *)xtreeKey(rbconf, handle); dropsrc = (char *)xtreeDelete(rbconf, key); xfree(dropkey); xfree(dropsrc); xfree(key); } int delete_critconfig(char *dropkey, int evenifcloned) { xtreePos_t handle; handle = xtreeFind(rbconf, dropkey); if (handle == xtreeEnd(rbconf)) return 0; if (!evenifcloned) { /* Check if this record has any clones attached to it */ char *hostname, *p; hostname = strdup(dropkey); p = strchr(hostname, '|'); if (p) *p = '\0'; handle = xtreeFirst(rbconf); while (handle != xtreeEnd(rbconf)) { char *key, *ptr; key = (char *)xtreeKey(rbconf, handle); ptr = (char *)xtreeData(rbconf, handle); if ((*(key + strlen(key) - 1) == '=') && (strcmp(hostname, ptr) == 0)) { xfree(hostname); return 1; } handle = xtreeNext(rbconf, handle); } xfree(hostname); } handle = xtreeFind(rbconf, dropkey); if (handle != xtreeEnd(rbconf)) { void *k1, *k2; k1 = xtreeKey(rbconf, handle); k2 = xtreeDelete(rbconf, dropkey); flushrec(k1, k2); } return 0; } xymon-4.3.28/lib/timing.c0000664000076400007640000001106312262772651015426 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains routines for timing program execution. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: timing.c 7328 2014-01-07 12:40:09Z storner $"; #include // For POSIX timer definitions #include #include #include #include #include #include "libxymon.h" int timing = 0; typedef struct timestamp_t { char *eventtext; struct timespec eventtime; struct timestamp_t *prev; struct timestamp_t *next; } timestamp_t; static timestamp_t *stamphead = NULL; static timestamp_t *stamptail = NULL; time_t gettimer(void) { int res; struct timespec t; #if (_POSIX_TIMERS > 0) && defined(_POSIX_MONOTONIC_CLOCK) res = clock_gettime(CLOCK_MONOTONIC, &t); if(-1 == res) { res = clock_gettime(CLOCK_REALTIME, &t); if(-1 == res) { return time(NULL); } } return (time_t) t.tv_sec; #else return time(NULL); #endif } void getntimer(struct timespec *tp) { struct timeval t; struct timezone tz; int res; #if (_POSIX_TIMERS > 0) && defined(_POSIX_MONOTONIC_CLOCK) res = clock_gettime(CLOCK_MONOTONIC, tp); if(-1 == res) { res = clock_gettime(CLOCK_REALTIME, tp); if(-1 != res) return; /* Fall through to use gettimeofday() */ } #endif gettimeofday(&t, &tz); tp->tv_sec = t.tv_sec; tp->tv_nsec = 1000*t.tv_usec; } void add_timestamp(const char *msg) { if (timing) { timestamp_t *newstamp = (timestamp_t *) malloc(sizeof(timestamp_t)); getntimer(&newstamp->eventtime); newstamp->eventtext = strdup(msg); if (stamphead == NULL) { newstamp->next = newstamp->prev = NULL; stamphead = newstamp; } else { newstamp->prev = stamptail; newstamp->next = NULL; stamptail->next = newstamp; } stamptail = newstamp; } } int ntimerus(struct timespec *start, struct timespec *now) { struct timespec tdiff; /* See how long the query took */ if (now) { memcpy(&tdiff, now, sizeof(struct timespec)); } else { getntimer(&tdiff); } if (tdiff.tv_nsec < start->tv_nsec) { tdiff.tv_sec--; tdiff.tv_nsec += 1000000000; } tdiff.tv_sec -= start->tv_sec; tdiff.tv_nsec -= start->tv_nsec; return (tdiff.tv_sec*1000000 + tdiff.tv_nsec/1000); } void show_timestamps(char **buffer) { timestamp_t *s; struct timespec dif; char *outbuf = (char *) malloc(4096); int outbuflen = 4096; char buf1[80]; if (!timing || (stamphead == NULL)) return; MEMDEFINE(buf1); strcpy(outbuf, "\n\nTIME SPENT\n"); strcat(outbuf, "Event "); strcat(outbuf, " Start time"); strcat(outbuf, " Duration\n"); for (s=stamphead; (s); s=s->next) { sprintf(buf1, "%-40s ", s->eventtext); strcat(outbuf, buf1); sprintf(buf1, "%10u.%06u ", (unsigned int)s->eventtime.tv_sec, (unsigned int)s->eventtime.tv_nsec / 1000); strcat(outbuf, buf1); if (s->prev) { tvdiff(&((timestamp_t *)s->prev)->eventtime, &s->eventtime, &dif); sprintf(buf1, "%10u.%06u ", (unsigned int)dif.tv_sec, (unsigned int)dif.tv_nsec / 1000); strcat(outbuf, buf1); } else strcat(outbuf, " -"); strcat(outbuf, "\n"); if ((outbuflen - strlen(outbuf)) < 200) { outbuflen += 4096; outbuf = (char *) realloc(outbuf, outbuflen); } } tvdiff(&stamphead->eventtime, &stamptail->eventtime, &dif); sprintf(buf1, "%-40s ", "TIME TOTAL"); strcat(outbuf, buf1); sprintf(buf1, "%-18s", ""); strcat(outbuf, buf1); sprintf(buf1, "%10u.%06u ", (unsigned int)dif.tv_sec, (unsigned int)dif.tv_nsec / 1000); strcat(outbuf, buf1); strcat(outbuf, "\n"); if (buffer == NULL) { printf("%s", outbuf); xfree(outbuf); } else *buffer = outbuf; MEMUNDEFINE(buf1); } long total_runtime(void) { if (timing) return (stamptail->eventtime.tv_sec - stamphead->eventtime.tv_sec); else return 0; } xymon-4.3.28/lib/acknowledgementslog.c0000664000076400007640000003241412652222745020173 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This displays the "acknowledgements" log. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* Host/test/color/start/end filtering code by Eric Schwimmer 2005 */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: acknowledgementslog.c 7085 2012-07-16 11:08:37Z storner $"; #include #include #include #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" typedef struct acknowledgements_t { void *host; struct htnames_t *service; time_t eventtime; time_t validity; char *recipient; char *message; struct acknowledgements_t *next; } acknowledgements_t; static time_t convert_time(char *timestamp) { time_t event = 0; unsigned int year,month,day,hour,min,sec,count; struct tm timeinfo; count = sscanf(timestamp, "%u/%u/%u@%u:%u:%u", &year, &month, &day, &hour, &min, &sec); if(count != 6) { return -1; } if(year < 1970) { return 0; } else { memset(&timeinfo, 0, sizeof(timeinfo)); timeinfo.tm_year = year - 1900; timeinfo.tm_mon = month - 1; timeinfo.tm_mday = day; timeinfo.tm_hour = hour; timeinfo.tm_min = min; timeinfo.tm_sec = sec; timeinfo.tm_isdst = -1; event = mktime(&timeinfo); } return event; } static htnames_t *namehead = NULL; static htnames_t *getname(char *name, int createit) { htnames_t *walk; for (walk = namehead; (walk && strcmp(walk->name, name)); walk = walk->next) ; if (walk || (!createit)) return walk; walk = (htnames_t *)malloc(sizeof(htnames_t)); walk->name = strdup(name); walk->next = namehead; namehead = walk; return walk; } void do_acknowledgementslog(FILE *output, int maxcount, int maxminutes, char *fromtime, char *totime, char *pageregex, char *expageregex, char *hostregex, char *exhostregex, char *testregex, char *extestregex, char *rcptregex, char *exrcptregex) { FILE *acknowledgementslog; char acknowledgementslogfilename[PATH_MAX]; time_t firstevent = 0; time_t lastevent = getcurrenttime(NULL); acknowledgements_t *head, *walk; struct stat st; char l[MAX_LINE_LEN]; char title[200]; /* For the PCRE matching */ const char *errmsg = NULL; int errofs = 0; pcre *pageregexp = NULL; pcre *expageregexp = NULL; pcre *hostregexp = NULL; pcre *exhostregexp = NULL; pcre *testregexp = NULL; pcre *extestregexp = NULL; pcre *rcptregexp = NULL; pcre *exrcptregexp = NULL; if (maxminutes && (fromtime || totime)) { fprintf(output, "Only one time interval type is allowed!"); return; } if (fromtime) { firstevent = convert_time(fromtime); if(firstevent < 0) { fprintf(output,"Invalid 'from' time: %s", htmlquoted(fromtime)); return; } } else if (maxminutes) { firstevent = getcurrenttime(NULL) - maxminutes*60; } else { firstevent = getcurrenttime(NULL) - 86400; } if (totime) { lastevent = convert_time(totime); if (lastevent < 0) { fprintf(output,"Invalid 'to' time: %s", htmlquoted(totime)); return; } if (lastevent < firstevent) { fprintf(output,"'to' time must be after 'from' time."); return; } } if (!maxcount) maxcount = 100; if (pageregex && *pageregex) pageregexp = pcre_compile(pageregex, PCRE_CASELESS, &errmsg, &errofs, NULL); if (expageregex && *expageregex) expageregexp = pcre_compile(expageregex, PCRE_CASELESS, &errmsg, &errofs, NULL); if (hostregex && *hostregex) hostregexp = pcre_compile(hostregex, PCRE_CASELESS, &errmsg, &errofs, NULL); if (exhostregex && *exhostregex) exhostregexp = pcre_compile(exhostregex, PCRE_CASELESS, &errmsg, &errofs, NULL); if (testregex && *testregex) testregexp = pcre_compile(testregex, PCRE_CASELESS, &errmsg, &errofs, NULL); if (extestregex && *extestregex) extestregexp = pcre_compile(extestregex, PCRE_CASELESS, &errmsg, &errofs, NULL); if (rcptregex && *rcptregex) rcptregexp = pcre_compile(rcptregex, PCRE_CASELESS, &errmsg, &errofs, NULL); if (exrcptregex && *exrcptregex) exrcptregexp = pcre_compile(exrcptregex, PCRE_CASELESS, &errmsg, &errofs, NULL); sprintf(acknowledgementslogfilename, "%s/acknowledge.log", xgetenv("XYMONSERVERLOGS")); acknowledgementslog = fopen(acknowledgementslogfilename, "r"); if (acknowledgementslog && (stat(acknowledgementslogfilename, &st) == 0)) { time_t curtime; int done = 0; /* Find a spot in the acknowledgements log file close to where the firstevent time is */ fseeko(acknowledgementslog, 0, SEEK_END); do { /* Go back maxcount*80 bytes - one entry is ~80 bytes */ if (ftello(acknowledgementslog) > maxcount*80) { unsigned int uicurtime; fseeko(acknowledgementslog, -maxcount*80, SEEK_CUR); if (fgets(l, sizeof(l), acknowledgementslog) && /* Skip to start of line */ fgets(l, sizeof(l), acknowledgementslog)) { /* 2015-03-07 18:17:03 myserver disk andy 1 1425724570 1425752223 1425838623 testing message */ if ( sscanf(l, "%*u-%*u-%*u %*u:%*u:%*u %*s %*s %*s %*u %*u %u %*u %*s", &uicurtime) == 0 ) { /* that didnt work - try the old format 1430040985 630949 30 630949 np_filename_not_used myserver.procs red testing log format \nAcked by: andy (127.0.0.1) */ sscanf(l, "%u\t%*u\t%*u\t%*u\tnp_filename_not_used\t%*s\t%*s\t%*s", &uicurtime); } curtime = uicurtime; done = (curtime < firstevent); } else { fprintf(output, "Error reading logfile %s: %s\n", acknowledgementslogfilename, strerror(errno)); return; } } else { rewind(acknowledgementslog); done = 1; } } while (!done); } head = NULL; while (acknowledgementslog && (fgets(l, sizeof(l), acknowledgementslog))) { unsigned int etim; unsigned int valid; int duration; time_t eventtime; time_t validity; char host[MAX_LINE_LEN]; char svc[MAX_LINE_LEN]; char recipient[MAX_LINE_LEN]; char message[MAX_LINE_LEN]; char *hostname, *svcname, *p; int itemsfound, pagematch, hostmatch, testmatch, rcptmatch; acknowledgements_t *newrec; void *eventhost; struct htnames_t *eventcolumn; int ovector[30]; /* 2015-03-07 18:17:03 myserver disk andy 1 1425724570 1425752223 1425838623 testing message */ itemsfound = sscanf(l, "%*u-%*u-%*u %*u:%*u:%*u %s %s %s %*u %*u %u %u %[^\t\n]", host, svc, recipient, &etim, &valid, message); if (itemsfound != 6) { /* 1430040985 630949 30 630949 np_filename_not_used myserver.procs red testing log format \nAcked by: andy (127.0.0.1) */ itemsfound = sscanf(l, "%u\t%*u\t%d\t%*u\tnp_filename_not_used\t%s\t%*s\t%[^\n]", &etim, &duration, host, message); if (itemsfound != 4) continue; p = strrchr(host, '.'); if (p) { *p = '\0'; strcpy(svc,p+1); } /* Xymon uses \n in the ack message, for the "acked by" data. Cut it off. */ p = strstr(message, "\\nAcked by:"); if (p) { strcpy(recipient,p+12); *(p-1) = '\0'; } else { strcpy(recipient,"UnknownUser"); } p = strchr(recipient, '('); if (p) *(p-1) = '\0'; } eventtime = etim; if (eventtime < firstevent) continue; if (eventtime > lastevent) break; validity = duration ? (etim + duration * 60) : valid; hostname = host; svcname = svc; eventhost = hostinfo(hostname); if (!eventhost) continue; /* Dont report hosts that no longer exist */ eventcolumn = getname(svcname, 1); p = strchr(recipient, '['); if (p) *p = '\0'; if (pageregexp) { char *pagename; pagename = xmh_item_multi(eventhost, XMH_PAGEPATH); pagematch = 0; while (!pagematch && pagename) { pagematch = (pcre_exec(pageregexp, NULL, pagename, strlen(pagename), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0); pagename = xmh_item_multi(NULL, XMH_PAGEPATH); } } else pagematch = 1; if (!pagematch) continue; if (expageregexp) { char *pagename; pagename = xmh_item_multi(eventhost, XMH_PAGEPATH); pagematch = 0; while (!pagematch && pagename) { pagematch = (pcre_exec(expageregexp, NULL, pagename, strlen(pagename), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0); pagename = xmh_item_multi(NULL, XMH_PAGEPATH); } } else pagematch = 0; if (pagematch) continue; if (hostregexp) hostmatch = (pcre_exec(hostregexp, NULL, hostname, strlen(hostname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0); else hostmatch = 1; if (!hostmatch) continue; if (exhostregexp) hostmatch = (pcre_exec(exhostregexp, NULL, hostname, strlen(hostname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0); else hostmatch = 0; if (hostmatch) continue; if (testregexp) testmatch = (pcre_exec(testregexp, NULL, svcname, strlen(svcname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0); else testmatch = 1; if (!testmatch) continue; if (extestregexp) testmatch = (pcre_exec(extestregexp, NULL, svcname, strlen(svcname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0); else testmatch = 0; if (testmatch) continue; if (rcptregexp) rcptmatch = (pcre_exec(rcptregexp, NULL, recipient, strlen(recipient), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0); else rcptmatch = 1; if (!rcptmatch) continue; if (exrcptregexp) rcptmatch = (pcre_exec(exrcptregexp, NULL, recipient, strlen(recipient), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0); else rcptmatch = 0; if (rcptmatch) continue; newrec = (acknowledgements_t *) malloc(sizeof(acknowledgements_t)); newrec->host = eventhost; newrec->service = eventcolumn; newrec->eventtime = eventtime; newrec->validity = validity; newrec->recipient = strdup(recipient); newrec->message = strdup(message); newrec->next = head; head = newrec; } if (head) { char *bgcolors[2] = { "#000000", "#000066" }; int bgcolor = 0; int count; struct acknowledgements_t *lasttoshow = head; count=0; walk=head; do { count++; lasttoshow = walk; walk = walk->next; } while (walk && (counteventtime) / 60)); } else { sprintf(title, "%d events acknowledged.", count); } fprintf(output, "

\n"); fprintf(output, "\n"); fprintf(output, "\n"); fprintf(output, "\n", htmlquoted(title)); fprintf(output, "\n"); for (walk=head; (walk != lasttoshow->next); walk=walk->next) { char *hostname = xmh_item(walk->host, XMH_HOSTNAME); fprintf(output, "\n", bgcolors[bgcolor]); bgcolor = ((bgcolor + 1) % 2); fprintf(output, "\n", ctime(&walk->eventtime)); fprintf(output, "\n", ctime(&walk->validity)); fprintf(output, "\n", hostname); fprintf(output, "\n", walk->service->name); fprintf(output, "\n", walk->recipient); fprintf(output, "\n", walk->message); } fprintf(output, "
%s
TimeValid UntilHostServiceAcknowledged ByMessage
%s%s%s%s%s%s
\n"); /* Clean up */ walk = head; do { struct acknowledgements_t *tmp = walk; walk = walk->next; xfree(tmp->recipient); xfree(tmp->message); xfree(tmp); } while (walk); } else { /* No acknowledgements during the past maxminutes */ if (acknowledgementslog) sprintf(title, "No events acknowledged in the last %d minutes", maxminutes); else strcpy(title, "No acknowledgements logged"); fprintf(output, "

\n"); fprintf(output, "\n", title); fprintf(output, "\n"); fprintf(output, "\n", htmlquoted(title)); fprintf(output, "\n"); fprintf(output, "
%s
\n"); fprintf(output, "
\n"); } if (acknowledgementslog) fclose(acknowledgementslog); if (pageregexp) pcre_free(pageregexp); if (expageregexp) pcre_free(expageregexp); if (hostregexp) pcre_free(hostregexp); if (exhostregexp) pcre_free(exhostregexp); if (testregexp) pcre_free(testregexp); if (extestregexp) pcre_free(extestregexp); if (rcptregexp) pcre_free(rcptregexp); if (exrcptregexp) pcre_free(exrcptregexp); } xymon-4.3.28/lib/readmib.c0000664000076400007640000001733112000304667015532 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor SNMP data collection tool */ /* */ /* Copyright (C) 2007-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: readmib.c 7058 2012-07-14 15:01:11Z storner $"; #include #include #include "libxymon.h" static void * mibdefs; /* Holds the list of MIB definitions */ static xtreePos_t nexthandle; int readmibs(char *cfgfn, int verbose) { static char *fn = NULL; static void *cfgfiles = NULL; FILE *cfgfd; strbuffer_t *inbuf; mibdef_t *mib = NULL; /* Check if config was modified */ if (cfgfiles) { if (!stackfmodified(cfgfiles)) { dbgprintf("No files changed, skipping reload\n"); return 0; } else { xtreePos_t handle; errprintf("Re-loading MIBs\n"); /* Clear list of config files */ stackfclist(&cfgfiles); cfgfiles = NULL; /* Drop the current data */ for (handle = xtreeFirst(mibdefs); (handle != xtreeEnd(mibdefs)); handle = xtreeNext(mibdefs, handle)) { mibdef_t *mib = (mibdef_t *)xtreeData(mibdefs, handle); oidset_t *swalk, *szombie; mibidx_t *iwalk, *izombie; int i; swalk = mib->oidlisthead; while (swalk) { szombie = swalk; swalk = swalk->next; for (i=0; (i <= szombie->oidcount); i++) { xfree(szombie->oids[i].dsname); xfree(szombie->oids[i].oid); } xfree(szombie->oids); xfree(szombie); } iwalk = mib->idxlist; while (iwalk) { izombie = iwalk; iwalk = iwalk->next; if (izombie->keyoid) xfree(izombie->keyoid); if (izombie->rootoid) xfree(izombie->rootoid); xfree(izombie); } if (mib->mibfn) xfree(mib->mibfn); if (mib->mibname) xfree(mib->mibname); freestrbuffer(mib->resultbuf); xfree(mib); } xtreeDestroy(mibdefs); } } mibdefs = xtreeNew(strcasecmp); nexthandle = xtreeEnd(mibdefs); if (fn) xfree(fn); fn = cfgfn; if (!fn) { fn = (char *)malloc(strlen(xgetenv("XYMONHOME")) + strlen("/etc/snmpmibs.cfg") + 1); sprintf(fn, "%s/etc/snmpmibs.cfg", xgetenv("XYMONHOME")); } cfgfd = stackfopen(fn, "r", &cfgfiles); if (cfgfd == NULL) { errprintf("Cannot open configuration files %s\n", fn); return 0; } inbuf = newstrbuffer(0); while (stackfgets(inbuf, NULL)) { char *bot, *p; sanitize_input(inbuf, 0, 0); bot = STRBUF(inbuf) + strspn(STRBUF(inbuf), " \t"); if ((*bot == '\0') || (*bot == '#')) continue; if (*bot == '[') { char *mibname; mibname = bot+1; p = strchr(mibname, ']'); if (p) *p = '\0'; mib = (mibdef_t *)calloc(1, sizeof(mibdef_t)); mib->mibname = strdup(mibname); mib->oidlisthead = mib->oidlisttail = (oidset_t *)calloc(1, sizeof(oidset_t)); mib->oidlisttail->oidsz = 10; mib->oidlisttail->oidcount = -1; mib->oidlisttail->oids = (oidds_t *)malloc(mib->oidlisttail->oidsz*sizeof(oidds_t)); mib->resultbuf = newstrbuffer(0); mib->tabular = 0; xtreeAdd(mibdefs, mib->mibname, mib); continue; } if (mib && (strncmp(bot, "mibfile", 7) == 0)) { p = bot + 7; p += strspn(p, " \t"); mib->mibfn = strdup(p); continue; } if (mib && (strncmp(bot, "extra", 5) == 0)) { /* Add an extra set of MIB objects to retrieve separately */ mib->oidlisttail->next = (oidset_t *)calloc(1, sizeof(oidset_t)); mib->oidlisttail = mib->oidlisttail->next; mib->oidlisttail->oidsz = 10; mib->oidlisttail->oidcount = -1; mib->oidlisttail->oids = (oidds_t *)malloc(mib->oidlisttail->oidsz*sizeof(oidds_t)); continue; } if (mib && (strncmp(bot, "table", 5) == 0)) { mib->tabular = 1; continue; } if (mib && ((strncmp(bot, "keyidx", 6) == 0) || (strncmp(bot, "validx", 6) == 0))) { /* * Define an index. Looks like: * keyidx (IF-MIB::ifDescr) * validx [IP-MIB::ipAdEntIfIndex] */ char endmarks[6]; mibidx_t *newidx = (mibidx_t *)calloc(1, sizeof(mibidx_t)); p = bot + 6; p += strspn(p, " \t"); newidx->marker = *p; p++; newidx->idxtype = (strncmp(bot, "keyidx", 6) == 0) ? MIB_INDEX_IN_OID : MIB_INDEX_IN_VALUE; newidx->keyoid = strdup(p); sprintf(endmarks, "%s%c", ")]}>", newidx->marker); p = newidx->keyoid + strcspn(newidx->keyoid, endmarks); *p = '\0'; newidx->next = mib->idxlist; mib->idxlist = newidx; mib->tabular = 1; continue; } if (mib) { /* icmpInMsgs = IP-MIB::icmpInMsgs.0 [/u32] [/rrd:TYPE] */ char *tok, *name, *oid = NULL; name = strtok(bot, " \t"); if (name) { tok = strtok(NULL, " \t"); if (tok && (*tok == '=')) oid = strtok(NULL, " \t"); else oid = tok; } if (name && oid) { mib->oidlisttail->oidcount++; if (mib->oidlisttail->oidcount == mib->oidlisttail->oidsz) { mib->oidlisttail->oidsz += 10; mib->oidlisttail->oids = (oidds_t *)realloc(mib->oidlisttail->oids, mib->oidlisttail->oidsz*sizeof(oidds_t)); } mib->oidlisttail->oids[mib->oidlisttail->oidcount].dsname = strdup(name); mib->oidlisttail->oids[mib->oidlisttail->oidcount].oid = strdup(oid); mib->oidlisttail->oids[mib->oidlisttail->oidcount].conversion = OID_CONVERT_NONE; mib->oidlisttail->oids[mib->oidlisttail->oidcount].rrdtype = RRD_NOTRACK; tok = strtok(NULL, " \t"); while (tok) { if (strcasecmp(tok, "/u32") == 0) { mib->oidlisttail->oids[mib->oidlisttail->oidcount].conversion = OID_CONVERT_U32; } else if (strncasecmp(tok, "/rrd:", 5) == 0) { char *rrdtype = tok+5; if (strcasecmp(rrdtype, "COUNTER") == 0) mib->oidlisttail->oids[mib->oidlisttail->oidcount].rrdtype = RRD_TRACK_COUNTER; else if (strcasecmp(rrdtype, "GAUGE") == 0) mib->oidlisttail->oids[mib->oidlisttail->oidcount].rrdtype = RRD_TRACK_GAUGE; else if (strcasecmp(rrdtype, "DERIVE") == 0) mib->oidlisttail->oids[mib->oidlisttail->oidcount].rrdtype = RRD_TRACK_DERIVE; else if (strcasecmp(rrdtype, "ABSOLUTE") == 0) mib->oidlisttail->oids[mib->oidlisttail->oidcount].rrdtype = RRD_TRACK_ABSOLUTE; } tok = strtok(NULL, " \t"); } } continue; } if (verbose) { errprintf("Unknown MIB definition line: '%s'\n", bot); } } stackfclose(cfgfd); freestrbuffer(inbuf); if (debug) { xtreePos_t handle; for (handle = xtreeFirst(mibdefs); (handle != xtreeEnd(mibdefs)); handle = xtreeNext(mibdefs, handle)) { mibdef_t *mib = (mibdef_t *)xtreeData(mibdefs, handle); oidset_t *swalk; int i; dbgprintf("[%s]\n", mib->mibname); for (swalk = mib->oidlisthead; (swalk); swalk = swalk->next) { dbgprintf("\t*** OID set, %d entries ***\n", swalk->oidcount); for (i=0; (i <= swalk->oidcount); i++) { dbgprintf("\t\t%s = %s\n", swalk->oids[i].dsname, swalk->oids[i].oid); } } } } return 1; } mibdef_t *first_mib(void) { nexthandle = xtreeFirst(mibdefs); if (nexthandle == xtreeEnd(mibdefs)) return NULL; else return (mibdef_t *)xtreeData(mibdefs, nexthandle); } mibdef_t *next_mib(void) { nexthandle = xtreeNext(mibdefs, nexthandle); if (nexthandle == xtreeEnd(mibdefs)) return NULL; else return (mibdef_t *)xtreeData(mibdefs, nexthandle); } mibdef_t *find_mib(char *mibname) { xtreePos_t handle; handle = xtreeFind(mibdefs, mibname); if (handle == xtreeEnd(mibdefs)) return NULL; else return (mibdef_t *)xtreeData(mibdefs, handle); } xymon-4.3.28/lib/rmd160c.h0000664000076400007640000000217711615341300015306 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* API for the RMD160 digest routines. */ /* */ /* Copyright (C) 2006-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __RMD160C_H__ #define __RMD160C_H__ extern int myRIPEMD160_Size(void); extern void myRIPEMD160_Init(void *c); extern void myRIPEMD160_Update(void *c, const void *data, size_t len); extern void myRIPEMD160_Final(unsigned char *md, void *c); #endif xymon-4.3.28/lib/loadhosts.c0000664000076400007640000006403112616464461016142 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module for Xymon, responsible for loading the hosts.cfg */ /* file and keeping track of what hosts are known, their aliases and planned */ /* downtime settings etc. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: loadhosts.c 7720 2015-11-04 20:23:13Z jccleaver $"; #include #include #include #include #include #include #include "libxymon.h" typedef struct pagelist_t { char *pagepath; char *pagetitle; struct pagelist_t *next; } pagelist_t; typedef struct namelist_t { char ip[IP_ADDR_STRLEN]; char *hostname; /* Name for item 2 of hosts.cfg */ char *logname; /* Name of the host directory in XYMONHISTLOGS (underscores replaces dots). */ int preference; /* For host with multiple entries, mark if we have the preferred one */ pagelist_t *page; /* Host location in the page/subpage/subparent tree */ void *data; /* Misc. data supplied by the user of this library function */ struct namelist_t *defaulthost; /* Points to the latest ".default." host */ int pageindex; char *groupid, *dgname; char *classname; char *osname; struct namelist_t *next, *prev; char *allelems; /* Storage for data pointed to by elems */ char **elems; /* List of pointers to the elements of the entry */ /* * The following are pre-parsed elements. * These are pre-parsed because they are used by the xymon daemon, so * fast access to them is an optimization. */ char *clientname; /* CLIENT: tag - host alias */ char *downtime; /* DOWNTIME tag - when host has planned downtime. */ time_t notbefore, notafter; /* NOTBEFORE and NOTAFTER tags as time_t values */ } namelist_t; static pagelist_t *pghead = NULL; static namelist_t *namehead = NULL, *nametail = NULL; static namelist_t *defaulthost = NULL; static char *xmh_item_key[XMH_LAST]; static char *xmh_item_name[XMH_LAST]; static int xmh_item_isflag[XMH_LAST]; static int configloaded = 0; static void * rbhosts; static void * rbclients; static void xmh_item_list_setup(void) { static int setupdone = 0; int i; enum xmh_item_t bi; if (setupdone) return; /* Doing it this way makes sure the index matches the value */ setupdone = 1; memset(xmh_item_key, 0, sizeof(xmh_item_key)); memset(xmh_item_name, 0, sizeof(xmh_item_key)); memset(xmh_item_isflag, 0, sizeof(xmh_item_isflag)); xmh_item_key[XMH_NET] = "NET:"; xmh_item_name[XMH_NET] = "XMH_NET"; xmh_item_key[XMH_DISPLAYNAME] = "NAME:"; xmh_item_name[XMH_DISPLAYNAME] = "XMH_DISPLAYNAME"; xmh_item_key[XMH_CLIENTALIAS] = "CLIENT:"; xmh_item_name[XMH_CLIENTALIAS] = "XMH_CLIENTALIAS"; xmh_item_key[XMH_COMMENT] = "COMMENT:"; xmh_item_name[XMH_COMMENT] = "XMH_COMMENT"; xmh_item_key[XMH_DESCRIPTION] = "DESCR:"; xmh_item_name[XMH_DESCRIPTION] = "XMH_DESCRIPTION"; xmh_item_key[XMH_DOCURL] = "DOC:"; xmh_item_name[XMH_DOCURL] = "XMH_DOCURL"; xmh_item_key[XMH_NK] = "NK:"; xmh_item_name[XMH_NK] = "XMH_NK"; xmh_item_key[XMH_NKTIME] = "NKTIME="; xmh_item_name[XMH_NKTIME] = "XMH_NKTIME"; xmh_item_key[XMH_TRENDS] = "TRENDS:"; xmh_item_name[XMH_TRENDS] = "XMH_TRENDS"; xmh_item_key[XMH_WML] = "WML:"; xmh_item_name[XMH_WML] = "XMH_WML"; xmh_item_key[XMH_NOPROP] = "NOPROP:"; xmh_item_name[XMH_NOPROP] = "XMH_NOPROP"; xmh_item_key[XMH_NOPROPRED] = "NOPROPRED:"; xmh_item_name[XMH_NOPROPRED] = "XMH_NOPROPRED"; xmh_item_key[XMH_NOPROPYELLOW] = "NOPROPYELLOW:"; xmh_item_name[XMH_NOPROPYELLOW] = "XMH_NOPROPYELLOW"; xmh_item_key[XMH_NOPROPPURPLE] = "NOPROPPURPLE:"; xmh_item_name[XMH_NOPROPPURPLE] = "XMH_NOPROPPURPLE"; xmh_item_key[XMH_NOPROPACK] = "NOPROPACK:"; xmh_item_name[XMH_NOPROPACK] = "XMH_NOPROPACK"; xmh_item_key[XMH_REPORTTIME] = "REPORTTIME="; xmh_item_name[XMH_REPORTTIME] = "XMH_REPORTTIME"; xmh_item_key[XMH_WARNPCT] = "WARNPCT:"; xmh_item_name[XMH_WARNPCT] = "XMH_WARNPCT"; xmh_item_key[XMH_WARNSTOPS] = "WARNSTOPS:"; xmh_item_name[XMH_WARNSTOPS] = "XMH_WARNSTOPS"; xmh_item_key[XMH_DOWNTIME] = "DOWNTIME="; xmh_item_name[XMH_DOWNTIME] = "XMH_DOWNTIME"; xmh_item_key[XMH_SSLDAYS] = "ssldays="; xmh_item_name[XMH_SSLDAYS] = "XMH_SSLDAYS"; xmh_item_key[XMH_SSLMINBITS] = "sslbits="; xmh_item_name[XMH_SSLMINBITS] = "XMH_SSLMINBITS"; xmh_item_key[XMH_DEPENDS] = "depends="; xmh_item_name[XMH_DEPENDS] = "XMH_DEPENDS"; xmh_item_key[XMH_BROWSER] = "browser="; xmh_item_name[XMH_BROWSER] = "XMH_BROWSER"; xmh_item_key[XMH_HTTPHEADERS] = "httphdr="; xmh_item_name[XMH_HTTPHEADERS] = "XMH_HTTPHEADERS"; xmh_item_key[XMH_HOLIDAYS] = "holidays="; xmh_item_name[XMH_HOLIDAYS] = "XMH_HOLIDAYS"; xmh_item_key[XMH_DELAYRED] = "delayred="; xmh_item_name[XMH_DELAYRED] = "XMH_DELAYRED"; xmh_item_key[XMH_DELAYYELLOW] = "delayyellow="; xmh_item_name[XMH_DELAYYELLOW] = "XMH_DELAYYELLOW"; xmh_item_key[XMH_FLAG_NOINFO] = "noinfo"; xmh_item_name[XMH_FLAG_NOINFO] = "XMH_FLAG_NOINFO"; xmh_item_key[XMH_FLAG_NOTRENDS] = "notrends"; xmh_item_name[XMH_FLAG_NOTRENDS] = "XMH_FLAG_NOTRENDS"; xmh_item_key[XMH_FLAG_NOCLIENT] = "noclient"; xmh_item_name[XMH_FLAG_NOCLIENT] = "XMH_FLAG_NOCLIENT"; xmh_item_key[XMH_FLAG_NODISP] = "nodisp"; xmh_item_name[XMH_FLAG_NODISP] = "XMH_FLAG_NODISP"; xmh_item_key[XMH_FLAG_NONONGREEN] = "nonongreen"; xmh_item_name[XMH_FLAG_NONONGREEN] = "XMH_FLAG_NONONGREEN"; xmh_item_key[XMH_FLAG_NOBB2] = "nobb2"; xmh_item_name[XMH_FLAG_NOBB2] = "XMH_FLAG_NOBB2"; xmh_item_key[XMH_FLAG_PREFER] = "prefer"; xmh_item_name[XMH_FLAG_PREFER] = "XMH_FLAG_PREFER"; xmh_item_key[XMH_FLAG_NOSSLCERT] = "nosslcert"; xmh_item_name[XMH_FLAG_NOSSLCERT] = "XMH_FLAG_NOSSLCERT"; xmh_item_key[XMH_FLAG_TRACE] = "trace"; xmh_item_name[XMH_FLAG_TRACE] = "XMH_FLAG_TRACE"; xmh_item_key[XMH_FLAG_NOTRACE] = "notrace"; xmh_item_name[XMH_FLAG_NOTRACE] = "XMH_FLAG_NOTRACE"; xmh_item_key[XMH_FLAG_NOCONN] = "noconn"; xmh_item_name[XMH_FLAG_NOCONN] = "XMH_FLAG_NOCONN"; xmh_item_key[XMH_FLAG_NOPING] = "noping"; xmh_item_name[XMH_FLAG_NOPING] = "XMH_FLAG_NOPING"; xmh_item_key[XMH_FLAG_DIALUP] = "dialup"; xmh_item_name[XMH_FLAG_DIALUP] = "XMH_FLAG_DIALUP"; xmh_item_key[XMH_FLAG_TESTIP] = "testip"; xmh_item_name[XMH_FLAG_TESTIP] = "XMH_FLAG_TESTIP"; xmh_item_key[XMH_FLAG_LDAPFAILYELLOW] = "ldapyellowfail"; xmh_item_name[XMH_FLAG_LDAPFAILYELLOW] = "XMH_FLAG_LDAPFAILYELLOW"; xmh_item_key[XMH_FLAG_NOCLEAR] = "NOCLEAR"; xmh_item_name[XMH_FLAG_NOCLEAR] = "XMH_FLAG_NOCLEAR"; xmh_item_key[XMH_FLAG_HIDEHTTP] = "HIDEHTTP"; xmh_item_name[XMH_FLAG_HIDEHTTP] = "XMH_FLAG_HIDEHTTP"; xmh_item_key[XMH_PULLDATA] = "PULLDATA"; xmh_item_name[XMH_PULLDATA] = "XMH_PULLDATA"; xmh_item_key[XMH_NOFLAP] = "NOFLAP"; xmh_item_name[XMH_NOFLAP] = "XMH_NOFLAP"; xmh_item_key[XMH_FLAG_MULTIHOMED] = "MULTIHOMED"; xmh_item_name[XMH_FLAG_MULTIHOMED] = "XMH_MULTIHOMED"; xmh_item_key[XMH_FLAG_HTTP_HEADER_MATCH] = "headermatch"; xmh_item_name[XMH_FLAG_HTTP_HEADER_MATCH] = "XMH_FLAG_HTTP_HEADER_MATCH"; xmh_item_key[XMH_FLAG_SNI] = "sni"; // Enable SNI (Server name Indication) for TLS requests xmh_item_name[XMH_FLAG_SNI] = "XMH_FLAG_SNI"; xmh_item_key[XMH_FLAG_NOSNI] = "nosni"; // Disable SNI (Server name Indication) for TLS requests xmh_item_name[XMH_FLAG_NOSNI] = "XMH_FLAG_NOSNI"; xmh_item_key[XMH_LDAPLOGIN] = "ldaplogin="; xmh_item_name[XMH_LDAPLOGIN] = "XMH_LDAPLOGIN"; xmh_item_key[XMH_CLASS] = "CLASS:"; xmh_item_name[XMH_CLASS] = "XMH_CLASS"; xmh_item_key[XMH_OS] = "OS:"; xmh_item_name[XMH_OS] = "XMH_OS"; xmh_item_key[XMH_NOCOLUMNS] = "NOCOLUMNS:"; xmh_item_name[XMH_NOCOLUMNS] = "XMH_NOCOLUMNS"; xmh_item_key[XMH_NOTBEFORE] = "NOTBEFORE:"; xmh_item_name[XMH_NOTBEFORE] = "XMH_NOTBEFORE"; xmh_item_key[XMH_NOTAFTER] = "NOTAFTER:"; xmh_item_name[XMH_NOTAFTER] = "XMH_NOTAFTER"; xmh_item_key[XMH_COMPACT] = "COMPACT:"; xmh_item_name[XMH_COMPACT] = "XMH_COMPACT"; xmh_item_key[XMH_INTERFACES] = "INTERFACES:"; xmh_item_name[XMH_INTERFACES] = "XMH_INTERFACES"; xmh_item_key[XMH_ACCEPT_ONLY] = "ACCEPTONLY:"; xmh_item_name[XMH_ACCEPT_ONLY] = "XMH_ACCEPT_ONLY"; xmh_item_name[XMH_IP] = "XMH_IP"; xmh_item_name[XMH_CLIENTALIAS] = "XMH_CLIENTALIAS"; xmh_item_name[XMH_HOSTNAME] = "XMH_HOSTNAME"; xmh_item_name[XMH_PAGENAME] = "XMH_PAGENAME"; xmh_item_name[XMH_PAGEPATH] = "XMH_PAGEPATH"; xmh_item_name[XMH_PAGETITLE] = "XMH_PAGETITLE"; xmh_item_name[XMH_PAGEPATHTITLE] = "XMH_PAGEPATHTITLE"; xmh_item_name[XMH_ALLPAGEPATHS] = "XMH_ALLPAGEPATHS"; xmh_item_name[XMH_GROUPID] = "XMH_GROUPID"; xmh_item_name[XMH_DGNAME] = "XMH_DGNAME"; xmh_item_name[XMH_PAGEINDEX] = "XMH_PAGEINDEX"; xmh_item_name[XMH_RAW] = "XMH_RAW"; xmh_item_name[XMH_DATA] = "XMH_DATA"; i = 0; while (xmh_item_key[i]) i++; if (i != XMH_IP) { errprintf("ERROR: Setup failure in xmh_item_key position %d\n", i); } for (bi = 0; (bi < XMH_LAST); bi++) if (xmh_item_name[bi]) xmh_item_isflag[bi] = (strncmp(xmh_item_name[bi], "XMH_FLAG_", 9) == 0); } static char *xmh_find_item(namelist_t *host, enum xmh_item_t item) { int i; char *result; if (item == XMH_LAST) return NULL; /* Unknown item requested */ xmh_item_list_setup(); i = 0; while (host->elems[i] && strncasecmp(host->elems[i], xmh_item_key[item], strlen(xmh_item_key[item]))) i++; result = (host->elems[i] ? (host->elems[i] + strlen(xmh_item_key[item])) : NULL); /* Handle the LARRD: tag in Xymon 4.0.4 and earlier */ if (!result && (item == XMH_TRENDS)) { i = 0; while (host->elems[i] && strncasecmp(host->elems[i], "LARRD:", 6)) i++; result = (host->elems[i] ? (host->elems[i] + 6) : NULL); } if (result || !host->defaulthost || (strcasecmp(host->hostname, ".default.") == 0)) { if (xmh_item_isflag[item]) { return (result ? xmh_item_key[item] : NULL); } else return result; } else return xmh_find_item(host->defaulthost, item); } static void initialize_hostlist(void) { while (defaulthost) { namelist_t *walk = defaulthost; defaulthost = defaulthost->defaulthost; if (walk->hostname) xfree(walk->hostname); if (walk->groupid) xfree(walk->groupid); if (walk->dgname) xfree(walk->dgname); if (walk->classname) xfree(walk->classname); if (walk->osname) xfree(walk->osname); if (walk->logname) xfree(walk->logname); if (walk->allelems) xfree(walk->allelems); if (walk->elems) xfree(walk->elems); xfree(walk); } while (namehead) { namelist_t *walk = namehead; namehead = namehead->next; /* clientname should not be freed, since it's just a pointer into the elems-array */ if (walk->hostname) xfree(walk->hostname); if (walk->groupid) xfree(walk->groupid); if (walk->dgname) xfree(walk->dgname); if (walk->classname) xfree(walk->classname); if (walk->osname) xfree(walk->osname); if (walk->logname) xfree(walk->logname); if (walk->allelems) xfree(walk->allelems); if (walk->elems) xfree(walk->elems); xfree(walk); } nametail = NULL; while (pghead) { pagelist_t *walk = pghead; pghead = pghead->next; if (walk->pagepath) xfree(walk->pagepath); if (walk->pagetitle) xfree(walk->pagetitle); xfree(walk); } /* Setup the top-level page */ pghead = (pagelist_t *) malloc(sizeof(pagelist_t)); pghead->pagepath = strdup(""); pghead->pagetitle = strdup(""); pghead->next = NULL; } static void build_hosttree(void) { static int hosttree_exists = 0; namelist_t *walk; xtreeStatus_t status; char *tstr; if (hosttree_exists) { xtreeDestroy(rbhosts); xtreeDestroy(rbclients); } rbhosts = xtreeNew(strcasecmp); rbclients = xtreeNew(strcasecmp); hosttree_exists = 1; for (walk = namehead; (walk); walk = walk->next) { status = xtreeAdd(rbhosts, walk->hostname, walk); if (walk->clientname) xtreeAdd(rbclients, walk->clientname, walk); switch (status) { case XTREE_STATUS_OK: case XTREE_STATUS_DUPLICATE_KEY: break; case XTREE_STATUS_MEM_EXHAUSTED: errprintf("loadhosts:build_hosttree - insert into tree failed (out of memory)\n"); break; default: errprintf("loadhosts:build_hosttree - insert into tree failed code %d\n", status); break; } tstr = xmh_item(walk, XMH_NOTBEFORE); walk->notbefore = (tstr ? timestr2timet(tstr) : 0); if (walk->notbefore == -1) walk->notbefore = 0; tstr = xmh_item(walk, XMH_NOTAFTER); walk->notafter = (tstr ? timestr2timet(tstr) : INT_MAX); if (walk->notafter == -1) walk->notafter = INT_MAX; } } #include "loadhosts_file.c" #include "loadhosts_net.c" char *knownhost(char *hostname, char *hostip, enum ghosthandling_t ghosthandling) { /* * ghosthandling = GH_ALLOW : Default BB method (case-sensitive, no logging, keep ghosts) * ghosthandling = GH_IGNORE : Case-insensitive, no logging, drop ghosts * ghosthandling = GH_LOG : Case-insensitive, log ghosts, drop ghosts * ghosthandling = GH_MATCH : Like GH_LOG, but try to match unknown names against known hosts */ xtreePos_t hosthandle; namelist_t *walk = NULL; static char *result = NULL; time_t now = getcurrenttime(NULL); if (result) xfree(result); result = NULL; if (hivalhost) { *hostip = '\0'; if (!hivalbuf || (*hivalbuf == '\0')) return NULL; result = (strcasecmp(hivalhost, hostname) == 0) ? strdup(hivalhost) : NULL; if (!result && hivals[XMH_CLIENTALIAS]) { result = (strcasecmp(hivals[XMH_CLIENTALIAS], hostname) == 0) ? strdup(hivalhost) : NULL; } if (result && hivals[XMH_IP]) strcpy(hostip, hivals[XMH_IP]); return result; } /* Find the host in the normal hostname list */ hosthandle = xtreeFind(rbhosts, hostname); if (hosthandle != xtreeEnd(rbhosts)) { walk = (namelist_t *)xtreeData(rbhosts, hosthandle); } else { /* Not found - lookup in the client alias list */ hosthandle = xtreeFind(rbclients, hostname); if (hosthandle != xtreeEnd(rbclients)) { walk = (namelist_t *)xtreeData(rbclients, hosthandle); } } if (walk) { /* * Force our version of the hostname. Done here so CLIENT works always. */ strcpy(hostip, walk->ip); result = strdup(walk->hostname); } else { *hostip = '\0'; result = strdup(hostname); } /* If default method, just say yes */ if (ghosthandling == GH_ALLOW) return result; /* Allow all summaries */ if (strcmp(hostname, "summary") == 0) return result; if (walk && ( ((walk->notbefore > now) || (walk->notafter < now)) )) walk = NULL; return (walk ? result : NULL); } int knownloghost(char *logdir) { namelist_t *walk = NULL; if (hivalhost) { int result; char *hvh_logname, *p; hvh_logname = strdup(hivalhost); p = hvh_logname; while ((p = strchr(p, '.')) != NULL) { *p = '_'; } result = (strcasecmp(hvh_logname, logdir) == 0); xfree(hvh_logname); return result; } /* Find the host */ /* Must do the linear string search, since the tree is indexed by the hostname, not logname */ for (walk = namehead; (walk && (strcasecmp(walk->logname, logdir) != 0)); walk = walk->next); return (walk != NULL); } void *hostinfo(char *hostname) { xtreePos_t hosthandle; namelist_t *result = NULL; time_t now = getcurrenttime(NULL); if (hivalhost) { return (strcasecmp(hostname, hivalhost) == 0) ? &hival_hostinfo : NULL; } if (!configloaded) { load_hostnames(xgetenv("HOSTSCFG"), NULL, get_fqdn()); configloaded = 1; } hosthandle = xtreeFind(rbhosts, hostname); if (hosthandle != xtreeEnd(rbhosts)) { result = (namelist_t *)xtreeData(rbhosts, hosthandle); if ((result->notbefore > now) || (result->notafter < now)) return NULL; } return result; } void *localhostinfo(char *hostname) { /* Returns a static fake hostrecord */ static namelist_t *result = NULL; if (!result) { initialize_hostlist(); result = (namelist_t *)calloc(1, sizeof(namelist_t)); } strcpy(result->ip, "127.0.0.1"); if (result->hostname) xfree(result->hostname); result->hostname = strdup(hostname); if (result->logname) xfree(result->logname); result->logname = strdup(hostname); { char *p = result->logname; while ((p = strchr(p, '.')) != NULL) { *p = '_'; } } result->preference = 1; result->page = pghead; if (result->allelems) xfree(result->allelems); result->allelems = strdup(""); if (result->elems) xfree(result->elems); result->elems = (char **)malloc(sizeof(char *)); result->elems[0] = NULL; return result; } char *xmh_item(void *hostin, enum xmh_item_t item) { static char *result; static char intbuf[10]; static char *inttxt = NULL; static strbuffer_t *rawtxt = NULL; char *p; namelist_t *host = (namelist_t *)hostin; namelist_t *hwalk; if (rawtxt == NULL) rawtxt = newstrbuffer(0); if (inttxt == NULL) inttxt = (char *)malloc(10); if (host == NULL) return NULL; if (host == &hival_hostinfo) return hivals[item]; switch (item) { case XMH_CLIENTALIAS: return host->clientname; case XMH_IP: return host->ip; case XMH_CLASS: if (host->classname) return host->classname; else return xmh_find_item(host, item); break; case XMH_OS: if (host->osname) return host->osname; else return xmh_find_item(host, item); break; case XMH_HOSTNAME: return host->hostname; case XMH_PAGENAME: p = strrchr(host->page->pagepath, '/'); if (p) return (p+1); else return host->page->pagepath; case XMH_PAGEPATH: return host->page->pagepath; case XMH_PAGETITLE: p = strrchr(host->page->pagetitle, '/'); if (p) return (p+1); /* else: Fall through */ case XMH_PAGEPATHTITLE: if (strlen(host->page->pagetitle)) return host->page->pagetitle; return "Top Page"; case XMH_PAGEINDEX: sprintf(intbuf, "%d", host->pageindex); return intbuf; case XMH_ALLPAGEPATHS: if (rawtxt) clearstrbuffer(rawtxt); hwalk = host; while (hwalk && (strcmp(hwalk->hostname, host->hostname) == 0)) { if (STRBUFLEN(rawtxt) > 0) addtobuffer(rawtxt, ","); addtobuffer(rawtxt, hwalk->page->pagepath); hwalk = hwalk->next; } return STRBUF(rawtxt); case XMH_GROUPID: return host->groupid; case XMH_DGNAME: return host->dgname; case XMH_DOCURL: p = xmh_find_item(host, item); if (p) { if (result) xfree(result); result = (char *)malloc(strlen(p) + strlen(host->hostname) + 1); sprintf(result, p, host->hostname); return result; } else return NULL; case XMH_DOWNTIME: if (host->downtime) return host->downtime; else if (host->defaulthost) return host->defaulthost->downtime; else return NULL; case XMH_RAW: if (rawtxt) clearstrbuffer(rawtxt); p = xmh_item_walk(host); while (p) { addtobuffer(rawtxt, nlencode(p)); p = xmh_item_walk(NULL); if (p) addtobuffer(rawtxt, "|"); } return STRBUF(rawtxt); case XMH_HOLIDAYS: p = xmh_find_item(host, item); if (!p) p = getenv("HOLIDAYS"); return p; case XMH_DATA: return host->data; case XMH_FLAG_NONONGREEN: case XMH_FLAG_NOBB2: p = xmh_find_item(host, XMH_FLAG_NONONGREEN); if (p == NULL) p = xmh_find_item(host, XMH_FLAG_NOBB2); return p; case XMH_NOFLAP: /* special - can be 'noflap=test1,test2' or just 'noflap' */ p = xmh_find_item(host, XMH_NOFLAP); if ((p != NULL) && (*(p) == '\0')) p = xmh_item_key[XMH_NOFLAP]; /* mirror flag semantics */ return p; case XMH_PULLDATA: /* special - can be 'pulldata=IP:PORT' or just 'pulldata' */ p = xmh_find_item(host, XMH_PULLDATA); if ((p != NULL) && (*(p) == '\0')) p = xmh_item_key[XMH_PULLDATA]; /* mirror flag semantics */ return p; default: return xmh_find_item(host, item); } return NULL; } char *xmh_custom_item(void *hostin, char *key) { int i; namelist_t *host = (namelist_t *)hostin; i = 0; while (host->elems[i] && strncmp(host->elems[i], key, strlen(key))) i++; return host->elems[i]; } enum xmh_item_t xmh_key_idx(char *item) { enum xmh_item_t i; xmh_item_list_setup(); i = 0; while (xmh_item_name[i] && strcmp(xmh_item_name[i], item)) i++; return (xmh_item_name[i] ? i : XMH_LAST); } char *xmh_item_byname(void *hostin, char *item) { enum xmh_item_t i; namelist_t *host = (namelist_t *)hostin; i = xmh_key_idx(item); return ((i == -1) ? NULL : xmh_item(host, i)); } char *xmh_item_walk(void *hostin) { static int idx = -1; static namelist_t *curhost = NULL; char *result; namelist_t *host = (namelist_t *)hostin; if ((host == NULL) && (idx == -1)) return NULL; /* Programmer failure */ if (host != NULL) { idx = 0; curhost = host; } result = curhost->elems[idx]; if (result) idx++; else idx = -1; return result; } int xmh_item_idx(char *value) { int i; xmh_item_list_setup(); i = 0; while (xmh_item_key[i] && strncmp(xmh_item_key[i], value, strlen(xmh_item_key[i]))) i++; return (xmh_item_key[i] ? i : -1); } char *xmh_item_id(enum xmh_item_t idx) { if ((idx >= 0) && (idx < XMH_LAST)) return xmh_item_name[idx]; return NULL; } void *first_host(void) { return (hivalhost ? &hival_hostinfo : namehead); } void *next_host(void *currenthost, int wantclones) { namelist_t *walk; if (!currenthost || (currenthost == &hival_hostinfo)) return NULL; if (wantclones) return ((namelist_t *)currenthost)->next; /* Find the next non-clone record */ walk = (namelist_t *)currenthost; do { walk = walk->next; } while (walk && (strcmp(((namelist_t *)currenthost)->hostname, walk->hostname) == 0)); return walk; } void xmh_set_item(void *hostin, enum xmh_item_t item, void *value) { namelist_t *host = (namelist_t *)hostin; if (host == &hival_hostinfo) { switch (item) { case XMH_CLASS: case XMH_OS: case XMH_CLIENTALIAS: hivals[item] = strdup((char *)value); break; case XMH_DATA: hivals[item] = (char *)value; break; default: break; } return; } switch (item) { case XMH_CLASS: if (host->classname) xfree(host->classname); host->classname = strdup((char *)value); break; case XMH_OS: if (host->osname) xfree(host->osname); host->osname = strdup((char *)value); break; case XMH_DATA: host->data = value; break; case XMH_CLIENTALIAS: /* * FIXME: Small mem. leak here - we should run "rebuildhosttree", but that is heavy. * Doing this "free" kills the tree structure, since we free one of the keys. * * if (host->clientname && (host->hostname != host->clientname) && (host->clientname != xmh_find_item(host, XMH_CLIENTALIAS)) xfree(host->clientname); */ host->clientname = strdup((char *)value); xtreeAdd(rbclients, host->clientname, host); break; default: break; } } char *xmh_item_multi(void *hostin, enum xmh_item_t item) { namelist_t *host = (namelist_t *)hostin; static namelist_t *keyhost = NULL, *curhost = NULL; if (item == XMH_LAST) return NULL; if ((host == NULL) && (keyhost == NULL)) return NULL; /* Programmer failure */ if (host != NULL) curhost = keyhost = host; else { curhost = curhost->next; if (!curhost || (strcmp(curhost->hostname, keyhost->hostname) != 0)) curhost = keyhost = NULL; /* End of hostlist */ } return xmh_item(curhost, item); } #ifdef STANDALONE int main(int argc, char *argv[]) { int argi; namelist_t *h; char *val; if (strcmp(argv[1], "@") == 0) { load_hostinfo(argv[2]); } else { load_hostnames(argv[1], NULL, get_fqdn()); } for (argi = 2; (argi < argc); argi++) { char s[1024]; char *p; char *hname; char hostip[IP_ADDR_STRLEN]; handlehost: hname = knownhost(argv[argi], hostip, GH_IGNORE); if (hname == NULL) { printf("Unknown host '%s'\n", argv[argi]); continue; } if (strcmp(hname, argv[argi])) { printf("Using canonical name '%s'\n", hname); } h = hostinfo(hname); if (h == NULL) { printf("Host %s not found\n", argv[argi]); continue; } val = xmh_item_walk(h); printf("Entry for host %s\n", h->hostname); while (val) { printf("\t%s\n", val); val = xmh_item_walk(NULL); } do { *s = '\0'; printf("Pick item:"); fflush(stdout); if (!fgets(s, sizeof(s), stdin)) return 0; p = strchr(s, '\n'); if (p) *p = '\0'; if (*s == '!') { load_hostnames(argv[1], NULL, get_fqdn()); /* Must restart! The "h" handle is no longer valid. */ goto handlehost; } else if (*s == '>') { val = xmh_item_multi(h, XMH_PAGEPATH); while (val) { printf("\t%s value is: '%s'\n", s, val); val = xmh_item_multi(NULL, XMH_PAGEPATH); } } else if (strncmp(s, "set ", 4) == 0) { xmh_set_item(h, XMH_DATA, strdup(s+4)); } else if (*s) { val = xmh_item_byname(h, s); if (val) printf("\t%s value is: '%s'\n", s, val); else printf("\t%s not found\n", s); } } while (*s); } return 0; } #endif xymon-4.3.28/lib/tree.h0000664000076400007640000000347412275523176015112 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains routines for tree-based record storage. */ /* */ /* Copyright (C) 2011-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __TREE_H__ #define __TREE_H__ typedef enum { XTREE_STATUS_OK, XTREE_STATUS_MEM_EXHAUSTED, XTREE_STATUS_DUPLICATE_KEY, XTREE_STATUS_KEY_NOT_FOUND, XTREE_STATUS_NOTREE } xtreeStatus_t; #ifdef HAVE_BINARY_TREE #define xtreeEnd(X) (NULL) typedef void *xtreePos_t; #else #define xtreeEnd(X) (-1) typedef int xtreePos_t; #endif extern void *xtreeNew(int(*xtreeCompare)(const char *a, const char *b)); extern void xtreeDestroy(void *treehandle); extern xtreeStatus_t xtreeAdd(void *treehandle, char *key, void *userdata); extern void *xtreeDelete(void *treehandle, char *key); extern xtreePos_t xtreeFind(void *treehandle, char *key); extern xtreePos_t xtreeFirst(void *treehandle); extern xtreePos_t xtreeNext(void *treehandle, xtreePos_t pos); extern char *xtreeKey(void *treehandle, xtreePos_t pos); extern void *xtreeData(void *treehandle, xtreePos_t pos); #endif xymon-4.3.28/lib/clientlocal.h0000664000076400007640000000167412275104151016430 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __CLIENTLOCAL_H__ #define __CLIENTLOCAL_H__ extern void load_clientconfig(void); extern char *get_clientconfig(char *hostname, char *hostclass, char *hostos); extern void set_clientlocal_mergemode(int onoff); #endif xymon-4.3.28/lib/eventlog.c0000664000076400007640000006556312244604307015770 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This displays the "eventlog" found on the "All non-green status" page. */ /* It also implements a CGI tool to show an eventlog for a given period of */ /* time, as a reporting function. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* Host/test/color/start/end filtering code by Eric Schwimmer 2005 */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: eventlog.c 7315 2013-11-25 08:22:31Z storner $"; #include #include #include #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" char *eventignorecolumns = NULL; int havedoneeventlog = 0; static int wanted_eventcolumn(char *service) { char svc[100]; int result; if (!eventignorecolumns || (strlen(service) > (sizeof(svc)-3))) return 1; sprintf(svc, ",%s,", service); result = (strstr(eventignorecolumns, svc) == NULL); return result; } int record_compare(void **a, void **b) { countlist_t **reca = (countlist_t **)a, **recb = (countlist_t **)b; /* Sort the countlist_t records in reverse */ if ( (*reca)->total > (*recb)->total ) return -1; else if ( (*reca)->total < (*recb)->total ) return 1; else return 0; } void * record_getnext(void *a) { return ((countlist_t *)a)->next; } void record_setnext(void *a, void *newval) { ((countlist_t *)a)->next = (countlist_t *)newval; } static htnames_t *namehead = NULL; static htnames_t *getname(char *name, int createit) { htnames_t *walk; for (walk = namehead; (walk && strcmp(walk->name, name)); walk = walk->next) ; if (walk || (!createit)) return walk; walk = (htnames_t *)malloc(sizeof(htnames_t)); walk->name = strdup(name); walk->next = namehead; namehead = walk; return walk; } static void count_events(countlist_t **hostcounthead, countlist_t **svccounthead) { void *hostwalk; for (hostwalk = first_host(); (hostwalk); hostwalk = next_host(hostwalk, 0)) { eventcount_t *swalk; countlist_t *hrec, *srec; swalk = (eventcount_t *)xmh_item(hostwalk, XMH_DATA); if (!swalk) continue; hrec = (countlist_t *)malloc(sizeof(countlist_t)); hrec->src = hostwalk; hrec->total = 0; hrec->next = *hostcounthead; *hostcounthead = hrec; for (swalk = (eventcount_t *)xmh_item(hostwalk, XMH_DATA); (swalk); swalk = swalk->next) { hrec->total += swalk->count; for (srec = *svccounthead; (srec && (srec->src != (void *)swalk->service)); srec = srec->next) ; if (!srec) { srec = (countlist_t *)malloc(sizeof(countlist_t)); srec->src = (void *)swalk->service; srec->total = 0; srec->next = *svccounthead; *svccounthead = srec; } srec->total += swalk->count; } } } typedef struct ed_t { event_t *event; struct ed_t *next; } ed_t; typedef struct elist_t { htnames_t *svc; ed_t *head, *tail; struct elist_t *next; } elist_t; static void dump_eventtree(void) { void *hwalk; elist_t *lwalk; ed_t *ewalk; for (hwalk = first_host(); (hwalk); hwalk = next_host(hwalk, 0)) { printf("%s\n", xmh_item(hwalk, XMH_HOSTNAME)); lwalk = (elist_t *)xmh_item(hwalk, XMH_DATA); while (lwalk) { printf("\t%s\n", lwalk->svc->name); ewalk = lwalk->head; while (ewalk) { printf("\t\t%ld->%ld = %6ld %s\n", (long) ewalk->event->changetime, (long) ewalk->event->eventtime, (long) ewalk->event->duration, colorname(ewalk->event->oldcolor)); ewalk = ewalk->next; } lwalk = lwalk->next; } } } void dump_countlists(countlist_t *hosthead, countlist_t *svchead) { countlist_t *cwalk; printf("Hosts\n"); for (cwalk = hosthead; (cwalk); cwalk = cwalk->next) { printf("\t%20s : %lu\n", xmh_item(cwalk->src, XMH_HOSTNAME), cwalk->total); } printf("\n"); printf("Services\n"); for (cwalk = svchead; (cwalk); cwalk = cwalk->next) { printf("\t%20s : %lu\n", ((htnames_t *)cwalk->src)->name, cwalk->total); } printf("\n"); } static int eventfilter(void *hinfo, char *testname, pcre *pageregexp, pcre *expageregexp, pcre *hostregexp, pcre *exhostregexp, pcre *testregexp, pcre *extestregexp, int ignoredialups, f_hostcheck hostcheck) { int pagematch, hostmatch, testmatch; char *hostname = xmh_item(hinfo, XMH_HOSTNAME); int ovector[30]; if (ignoredialups && xmh_item(hinfo, XMH_FLAG_DIALUP)) return 0; if (hostcheck && (hostcheck(hostname) == 0)) return 0; if (pageregexp) { char *pagename; pagename = xmh_item_multi(hinfo, XMH_PAGEPATH); pagematch = 0; while (!pagematch && pagename) { pagematch = (pcre_exec(pageregexp, NULL, pagename, strlen(pagename), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0); pagename = xmh_item_multi(NULL, XMH_PAGEPATH); } } else pagematch = 1; if (!pagematch) return 0; if (expageregexp) { char *pagename; pagename = xmh_item_multi(hinfo, XMH_PAGEPATH); pagematch = 0; while (!pagematch && pagename) { pagematch = (pcre_exec(expageregexp, NULL, pagename, strlen(pagename), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0); pagename = xmh_item_multi(NULL, XMH_PAGEPATH); } } else pagematch = 0; if (pagematch) return 0; if (hostregexp) hostmatch = (pcre_exec(hostregexp, NULL, hostname, strlen(hostname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0); else hostmatch = 1; if (!hostmatch) return 0; if (exhostregexp) hostmatch = (pcre_exec(exhostregexp, NULL, hostname, strlen(hostname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0); else hostmatch = 0; if (hostmatch) return 0; if (testregexp) testmatch = (pcre_exec(testregexp, NULL, testname, strlen(testname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0); else testmatch = 1; if (!testmatch) return 0; if (extestregexp) testmatch = (pcre_exec(extestregexp, NULL, testname, strlen(testname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0); else testmatch = 0; if (testmatch) return 0; return 1; } static void count_duration(time_t fromtime, time_t totime, pcre *pageregexp, pcre *expageregexp, pcre *hostregexp, pcre *exhostregexp, pcre *testregexp, pcre *extestregexp, int ignoredialups, f_hostcheck hostcheck, event_t *eventhead, countlist_t **hostcounthead, countlist_t **svccounthead) { void *hwalk; elist_t *lwalk; event_t *ewalk; ed_t *ed; sendreturn_t *bdata; /* * Restructure the event-list so we have a tree instead: * * HostRecord * | *Data ----> EventList * | | *Service * | | *EventHead --> Event --> Event --> Event * | | *EventTail --------------------------^ * | | * | v * | * v * */ for (ewalk = eventhead; (ewalk); ewalk = ewalk->next) { lwalk = (elist_t *)xmh_item(ewalk->host, XMH_DATA); while (lwalk && (lwalk->svc != ewalk->service)) lwalk = lwalk->next; if (lwalk == NULL) { lwalk = (elist_t *)calloc(1, sizeof(elist_t)); lwalk->svc = ewalk->service; lwalk->next = (elist_t *)xmh_item(ewalk->host, XMH_DATA); xmh_set_item(ewalk->host, XMH_DATA, (void *)lwalk); } ed = (ed_t *)calloc(1, sizeof(ed_t)); ed->event = ewalk; ed->next = lwalk->head; if (lwalk->head == NULL) lwalk->tail = ed; lwalk->head = ed; } if (debug) { printf("\n\nEventtree before fixups\n\n"); dump_eventtree(); } /* * Next, we must add a pseudo record for the current state. * This is for those statuses that haven't changed since the * start of our data-collection period - they won't have any events * so we cannot tell what color they are. By grabbing the current * color we can add a pseudo-event that lets us determine what the * color has been since the start of the event-period. */ bdata = newsendreturnbuf(1, NULL); if (sendmessage("xymondboard fields=hostname,testname,color,lastchange", NULL, XYMON_TIMEOUT, bdata) == XYMONSEND_OK) { char *bol, *eol; char *hname, *tname; int color; time_t lastchange; void *hrec; htnames_t *srec; char *icname = xgetenv("INFOCOLUMN"); char *tcname = xgetenv("TRENDSCOLUMN"); bol = getsendreturnstr(bdata, 0); while (bol) { eol = strchr(bol, '\n'); if (eol) *eol = '\0'; hname = strtok(bol, "|"); tname = (hname ? strtok(NULL, "|") : NULL); color = (tname ? parse_color(strtok(NULL, "|")) : -1); lastchange = ((color != -1) ? atol(strtok(NULL, "\n")) : totime+1); if (hname && tname && (color != -1) && (strcmp(tname, icname) != 0) && (strcmp(tname, tcname) != 0)) { hrec = hostinfo(hname); srec = getname(tname, 1); if (eventfilter(hrec, tname, pageregexp, expageregexp, hostregexp, exhostregexp, testregexp, extestregexp, ignoredialups, hostcheck) == 0) goto nextrecord; lwalk = (elist_t *)xmh_item(hrec, XMH_DATA); while (lwalk && (lwalk->svc != srec)) lwalk = lwalk->next; if (lwalk == NULL) { lwalk = (elist_t *)calloc(1, sizeof(elist_t)); lwalk->svc = srec; lwalk->next = (elist_t *)xmh_item(hrec, XMH_DATA); xmh_set_item(hrec, XMH_DATA, (void *)lwalk); } /* See if we already have an event past the "totime" value */ if (lwalk->head) { ed = lwalk->head; while (ed && (ed->event->eventtime < totime)) ed = ed->next; if (ed) { ed->next = NULL; lwalk->tail = ed; } else { ed = (ed_t *)calloc(1, sizeof(ed_t)); ed->event = (event_t *)calloc(1, sizeof(event_t)); lwalk->tail->next = ed; ed->event->host = hrec; ed->event->service = srec; ed->event->eventtime = totime; ed->event->changetime = lwalk->tail->event->eventtime; ed->event->duration = (totime - lwalk->tail->event->eventtime); ed->event->newcolor = -1; ed->event->oldcolor = lwalk->tail->event->newcolor; ed->event->next = NULL; ed->next = NULL; lwalk->tail = ed; } } else if (lastchange < totime) { ed = (ed_t *)calloc(1, sizeof(ed_t)); ed->event = (event_t *)calloc(1, sizeof(event_t)); ed->event->host = hrec; ed->event->service = srec; ed->event->eventtime = totime; ed->event->changetime = (lwalk->tail ? lwalk->tail->event->eventtime : fromtime); ed->event->duration = (totime - ed->event->changetime); ed->event->newcolor = color; ed->event->oldcolor = (lwalk->tail ? lwalk->tail->event->newcolor : color); ed->event->next = NULL; ed->next = NULL; lwalk->head = lwalk->tail = ed; } } nextrecord: bol = (eol ? eol+1 : NULL); } freesendreturnbuf(bdata); } else { errprintf("Cannot get the current state\n"); freesendreturnbuf(bdata); return; } if (debug) { printf("\n\nEventtree after pseudo-events\n\n"); dump_eventtree(); } /* * Fixup the beginning-time (and duration) of the first events recorded. * This is to handle events that begin BEFORE our event-logging period. * Fixup the end-time (and duration) of the last events recorded. * This is to handle events that end AFTER our event-logging period. */ for (hwalk = first_host(); (hwalk); hwalk = next_host(hwalk, 0)) { elist_t *lwalk; event_t *erec; ed_t *ewalk; lwalk = (elist_t *)xmh_item(hwalk, XMH_DATA); while (lwalk) { if (lwalk->head) { erec = lwalk->head->event; if (erec->changetime > totime) { /* First event is after our start-time. Drop the events */ lwalk->head = lwalk->tail = NULL; } else if (erec->changetime < fromtime) { /* First event is before our start-time. Adjust to starttime. */ erec->changetime = fromtime; erec->duration = (erec->eventtime - fromtime); } ewalk = lwalk->head; while (ewalk && (ewalk->event->eventtime < totime)) ewalk = ewalk->next; if (ewalk) { lwalk->tail = ewalk; lwalk->tail->next = 0; } if (lwalk->tail) { erec = lwalk->tail->event; if (erec->eventtime > totime) { /* Last event is after our end-time. Adjust to end-time */ erec->eventtime = totime; erec->duration = (totime - erec->changetime); } } } lwalk = lwalk->next; } } if (debug) { printf("\n\nEventtree after fixups\n\n"); dump_eventtree(); } for (hwalk = first_host(); (hwalk); hwalk = next_host(hwalk, 0)) { countlist_t *hrec, *srec; hrec = (countlist_t *)malloc(sizeof(countlist_t)); hrec->src = hwalk; hrec->total = 0; hrec->next = *hostcounthead; *hostcounthead = hrec; lwalk = (elist_t *)xmh_item(hwalk, XMH_DATA); while (lwalk) { for (srec = *svccounthead; (srec && (srec->src != (void *)lwalk->svc)); srec = srec->next) ; if (!srec) { srec = (countlist_t *)malloc(sizeof(countlist_t)); srec->src = (void *)lwalk->svc; srec->total = 0; srec->next = *svccounthead; *svccounthead = srec; } if (lwalk->head) { ed_t *ewalk = lwalk->head; while (ewalk) { if (ewalk->event->oldcolor >= COL_YELLOW) { hrec->total += ewalk->event->duration; srec->total += ewalk->event->duration; } ewalk = ewalk->next; } } lwalk = lwalk->next; } } if (debug) dump_countlists(*hostcounthead, *svccounthead); } void do_eventlog(FILE *output, int maxcount, int maxminutes, char *fromtime, char *totime, char *pageregex, char *expageregex, char *hostregex, char *exhostregex, char *testregex, char *extestregex, char *colrregex, int ignoredialups, f_hostcheck hostcheck, event_t **eventlist, countlist_t **hostcounts, countlist_t **servicecounts, countsummary_t counttype, eventsummary_t sumtype, char *periodstring) { FILE *eventlog; char eventlogfilename[PATH_MAX]; time_t firstevent = 0; time_t lastevent = getcurrenttime(NULL); event_t *eventhead = NULL; struct stat st; char l[MAX_LINE_LEN]; char title[200]; /* For the PCRE matching */ const char *errmsg = NULL; int errofs = 0; pcre *pageregexp = NULL; pcre *expageregexp = NULL; pcre *hostregexp = NULL; pcre *exhostregexp = NULL; pcre *testregexp = NULL; pcre *extestregexp = NULL; pcre *colrregexp = NULL; countlist_t *hostcounthead = NULL, *svccounthead = NULL; if (eventlist) *eventlist = NULL; if (hostcounts) *hostcounts = NULL; if (servicecounts) *servicecounts = NULL; havedoneeventlog = 1; if ((maxminutes > 0) && (fromtime || totime)) { fprintf(output, "Only one time interval type is allowed!"); return; } if (fromtime) { firstevent = eventreport_time(fromtime); if(firstevent < 0) { if (output) fprintf(output,"Invalid 'from' time: %s", htmlquoted(fromtime)); return; } } else if (maxminutes == -1) { /* Unlimited number of minutes */ firstevent = 0; } else if (maxminutes > 0) { firstevent = getcurrenttime(NULL) - maxminutes*60; } else { firstevent = getcurrenttime(NULL) - 86400; } if (totime) { lastevent = eventreport_time(totime); if (lastevent < 0) { if (output) fprintf(output,"Invalid 'to' time: %s", htmlquoted(totime)); return; } if (lastevent < firstevent) { if (output) fprintf(output,"'to' time must be after 'from' time."); return; } } if (!maxcount) maxcount = 100; if (pageregex && *pageregex) pageregexp = pcre_compile(pageregex, PCRE_CASELESS, &errmsg, &errofs, NULL); if (expageregex && *expageregex) expageregexp = pcre_compile(expageregex, PCRE_CASELESS, &errmsg, &errofs, NULL); if (hostregex && *hostregex) hostregexp = pcre_compile(hostregex, PCRE_CASELESS, &errmsg, &errofs, NULL); if (exhostregex && *exhostregex) exhostregexp = pcre_compile(exhostregex, PCRE_CASELESS, &errmsg, &errofs, NULL); if (testregex && *testregex) testregexp = pcre_compile(testregex, PCRE_CASELESS, &errmsg, &errofs, NULL); if (extestregex && *extestregex) extestregexp = pcre_compile(extestregex, PCRE_CASELESS, &errmsg, &errofs, NULL); if (colrregex && *colrregex) colrregexp = pcre_compile(colrregex, PCRE_CASELESS, &errmsg, &errofs, NULL); sprintf(eventlogfilename, "%s/allevents", xgetenv("XYMONHISTDIR")); eventlog = fopen(eventlogfilename, "r"); if (eventlog && (stat(eventlogfilename, &st) == 0)) { time_t curtime; int done = 0; int unlimited = (maxcount == -1); if (unlimited) maxcount = 1000; do { /* Find a spot in the eventlog file close to where the firstevent time is */ fseeko(eventlog, 0, SEEK_END); do { /* Go back maxcount*80 bytes - one entry is ~80 bytes */ if (ftello(eventlog) > maxcount*80) { unsigned int uicurtime; fseeko(eventlog, -maxcount*80, SEEK_CUR); if (fgets(l, sizeof(l), eventlog) && /* Skip to start of line */ fgets(l, sizeof(l), eventlog)) { sscanf(l, "%*s %*s %u %*u %*u %*s %*s %*d", &uicurtime); curtime = uicurtime; done = (curtime < firstevent); if (unlimited && !done) maxcount += 1000; } else { if (output) fprintf(output,"Error reading eventlog file %s: %s\n", eventlogfilename, strerror(errno)); return; } } else { rewind(eventlog); curtime = 0; done = 1; } } while (!done); if (unlimited) unlimited = ((curtime > firstevent) && (ftello(eventlog) > 0)); } while (unlimited); } eventhead = NULL; while (eventlog && (fgets(l, sizeof(l), eventlog))) { time_t eventtime, changetime, duration; unsigned int uievt, uicht, uidur; char hostname[MAX_LINE_LEN], svcname[MAX_LINE_LEN], newcol[MAX_LINE_LEN], oldcol[MAX_LINE_LEN]; char *newcolname, *oldcolname; int state, itemsfound, colrmatch; event_t *newevent; void *eventhost; struct htnames_t *eventcolumn; int ovector[30]; eventcount_t *countrec; itemsfound = sscanf(l, "%s %s %u %u %u %s %s %d", hostname, svcname, &uievt, &uicht, &uidur, newcol, oldcol, &state); eventtime = uievt; changetime = uicht; duration = uidur; oldcolname = colorname(eventcolor(oldcol)); newcolname = colorname(eventcolor(newcol)); /* For DURATION counts, we must parse all events until now */ if ((counttype != XYMON_COUNT_DURATION) && (eventtime > lastevent)) break; eventhost = hostinfo(hostname); eventcolumn = getname(svcname, 1); if ( (itemsfound == 8) && (eventtime >= firstevent) && (eventhost && !xmh_item(eventhost, XMH_FLAG_NONONGREEN)) && (wanted_eventcolumn(svcname)) ) { if (eventfilter(eventhost, svcname, pageregexp, expageregexp, hostregexp, exhostregexp, testregexp, extestregexp, ignoredialups, hostcheck) == 0) continue; /* For duration counts, record all events. We'll filter out the colors later. */ if (colrregexp && (counttype != XYMON_COUNT_DURATION)) { colrmatch = ( (pcre_exec(colrregexp, NULL, newcolname, strlen(newcolname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0) || (pcre_exec(colrregexp, NULL, oldcolname, strlen(oldcolname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0) ); } else colrmatch = 1; if (!colrmatch) continue; newevent = (event_t *) malloc(sizeof(event_t)); newevent->host = eventhost; newevent->service = eventcolumn; newevent->eventtime = eventtime; newevent->changetime = changetime; newevent->duration = duration; newevent->newcolor = eventcolor(newcol); newevent->oldcolor = eventcolor(oldcol); newevent->next = eventhead; eventhead = newevent; if (counttype != XYMON_COUNT_DURATION) { countrec = (eventcount_t *)xmh_item(eventhost, XMH_DATA); while (countrec && (countrec->service != eventcolumn)) countrec = countrec->next; if (countrec == NULL) { countrec = (eventcount_t *)calloc(1, sizeof(eventcount_t)); countrec->service = eventcolumn; countrec->next = (eventcount_t *)xmh_item(eventhost, XMH_DATA); xmh_set_item(eventhost, XMH_DATA, (void *)countrec); } countrec->count++; } } } /* Count the state changes per host */ svccounthead = hostcounthead = NULL; switch (counttype) { case XYMON_COUNT_EVENTS: count_events(&hostcounthead, &svccounthead); break; case XYMON_COUNT_DURATION: count_duration(firstevent, lastevent, pageregexp, expageregexp, hostregexp, exhostregexp, testregexp, extestregexp, ignoredialups, hostcheck, eventhead, &hostcounthead, &svccounthead); break; default: break; } if (hostcounthead) hostcounthead = msort(hostcounthead, record_compare, record_getnext, record_setnext); if (svccounthead) svccounthead = msort(svccounthead, record_compare, record_getnext, record_setnext); if (eventhead && (output != NULL)) { char *bgcolors[2] = { "#000000", "#000033" }; int bgcolor = 0; struct event_t *ewalk, *lasttoshow = eventhead; countlist_t *cwalk; unsigned long totalcount = 0; if (periodstring) fprintf(output, "

%s

\n", htmlquoted(periodstring)); switch (sumtype) { case XYMON_S_HOST_BREAKDOWN: /* Request for a specific service, show breakdown by host */ for (cwalk = hostcounthead; (cwalk); cwalk = cwalk->next) totalcount += cwalk->total; fprintf(output, "\n"); fprintf(output, "\n", (counttype == XYMON_COUNT_EVENTS) ? "State changes" : "Seconds red/yellow"); fprintf(output, "\n"); for (cwalk = hostcounthead; (cwalk && (cwalk->total > 0)); cwalk = cwalk->next) { fprintf(output, "\n", xmh_item(cwalk->src, XMH_HOSTNAME), cwalk->total, ((100.0 * cwalk->total) / totalcount)); } fprintf(output, "
Host%s

%s%lu(%6.2f %%)
\n"); break; case XYMON_S_SERVICE_BREAKDOWN: /* Request for a specific host, show breakdown by service */ for (cwalk = svccounthead; (cwalk); cwalk = cwalk->next) totalcount += cwalk->total; fprintf(output, "\n"); fprintf(output, "\n", (counttype == XYMON_COUNT_EVENTS) ? "State changes" : "Seconds red/yellow"); fprintf(output, "\n"); for (cwalk = svccounthead; (cwalk && (cwalk->total > 0)); cwalk = cwalk->next) { fprintf(output, "\n", ((htnames_t *)cwalk->src)->name, cwalk->total, ((100.0 * cwalk->total) / totalcount)); } fprintf(output, "
Service%s

%s%lu(%6.2f %%)
\n"); break; case XYMON_S_NONE: break; } if (sumtype == XYMON_S_NONE) { int count; count=0; ewalk=eventhead; do { count++; lasttoshow = ewalk; ewalk = ewalk->next; } while (ewalk && (countnext = NULL; /* Terminate list if any items left */ if (maxminutes > 0) { sprintf(title, "%d events received in the past %u minutes", count, (unsigned int)((getcurrenttime(NULL) - lasttoshow->eventtime) / 60)); } else { sprintf(title, "%d events received.", count); } } else { strcpy(title, "Events in summary"); } fprintf(output, "

\n"); fprintf(output, "\n"); fprintf(output, "\n"); fprintf(output, "\n", htmlquoted(title)); for (ewalk=eventhead; (ewalk); ewalk=ewalk->next) { char *hostname = xmh_item(ewalk->host, XMH_HOSTNAME); if ( (counttype == XYMON_COUNT_DURATION) && (ewalk->oldcolor < COL_YELLOW) && (ewalk->newcolor < COL_YELLOW) ) continue; if ( (counttype == XYMON_COUNT_DURATION) && (ewalk->eventtime >= lastevent) ) continue; fprintf(output, "\n", bgcolors[bgcolor]); bgcolor = ((bgcolor + 1) % 2); fprintf(output, "\n", ctime(&ewalk->eventtime)); if (ewalk->newcolor == COL_CLEAR) { fprintf(output, "\n", hostname); } else { fprintf(output, "\n", colorname(ewalk->newcolor), hostname); } fprintf(output, "\n", ewalk->service->name); fprintf(output, "\n", xgetenv("XYMONSKIN"), dotgiffilename(ewalk->newcolor, 0, 0), xgetenv("DOTHEIGHT"), xgetenv("DOTWIDTH"), colorname(ewalk->newcolor), colorname(ewalk->newcolor)); fprintf(output, "\n"); } fprintf(output, "
%s
%s%s%s%s\n", histlogurl(hostname, ewalk->service->name, ewalk->changetime, NULL)); fprintf(output, "\"%s\"\n", xgetenv("XYMONSKIN"), dotgiffilename(ewalk->oldcolor, 0, 0), xgetenv("DOTHEIGHT"), xgetenv("DOTWIDTH"), colorname(ewalk->oldcolor), colorname(ewalk->oldcolor)); fprintf(output, "\"From\n", xgetenv("XYMONSKIN"), xgetenv("IMAGEFILETYPE")); fprintf(output, "\n", histlogurl(hostname, ewalk->service->name, ewalk->eventtime, NULL)); fprintf(output, "\"%s\"
\n"); } else if (output != NULL) { /* No events during the past maxminutes */ if (eventlog) sprintf(title, "No events received in the last %d minutes", maxminutes); else strcpy(title, "No events logged"); fprintf(output, "

\n"); fprintf(output, "\n", title); fprintf(output, "\n"); fprintf(output, "\n", htmlquoted(title)); fprintf(output, "\n"); fprintf(output, "
%s
\n"); fprintf(output, "
\n"); } if (eventlog) fclose(eventlog); if (pageregexp) pcre_free(pageregexp); if (hostregexp) pcre_free(hostregexp); if (testregexp) pcre_free(testregexp); if (colrregexp) pcre_free(colrregexp); /* Return the event- and count-lists, if wanted - or clean them up */ if (eventlist) { *eventlist = eventhead; } else { event_t *zombie, *ewalk = eventhead; while (ewalk) { zombie = ewalk; ewalk = ewalk->next; xfree(zombie); } } if (hostcounts) { *hostcounts = hostcounthead; } else { countlist_t *zombie, *hwalk = hostcounthead; while (hwalk) { zombie = hwalk; hwalk = hwalk->next; xfree(zombie); } } if (servicecounts) { *servicecounts = svccounthead; } else { countlist_t *zombie, *swalk = svccounthead; while (swalk) { zombie = swalk; swalk = swalk->next; xfree(zombie); } } } xymon-4.3.28/lib/misc.c0000664000076400007640000004412712656201271015071 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains miscellaneous routines. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: misc.c 7892 2016-02-08 21:03:53Z jccleaver $"; #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_SYS_SELECT_H #include /* Someday I'll move to GNU Autoconf for this ... */ #endif #include #include #include "libxymon.h" #include "version.h" enum ostype_t get_ostype(char *osname) { char *nam; enum ostype_t result = OS_UNKNOWN; int n; if (!osname || (*osname == '\0')) return OS_UNKNOWN; n = strspn(osname, "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-/_"); nam = (char *)malloc(n+1); strncpy(nam, osname, n); *(nam+n) = '\0'; if (strcasecmp(nam, "solaris") == 0) result = OS_SOLARIS; else if (strcasecmp(nam, "sunos") == 0) result = OS_SOLARIS; else if (strcasecmp(nam, "hpux") == 0) result = OS_HPUX; else if (strcasecmp(nam, "hp-ux") == 0) result = OS_HPUX; else if (strcasecmp(nam, "aix") == 0) result = OS_AIX; else if (strcasecmp(nam, "osf") == 0) result = OS_OSF; else if (strcasecmp(nam, "osf1") == 0) result = OS_OSF; else if (strcasecmp(nam, "win32") == 0) result = OS_WIN32; else if (strcasecmp(nam, "hmdc") == 0) result = OS_WIN32_HMDC; else if (strcasecmp(nam, "bbwin") == 0) result = OS_WIN32_BBWIN; else if (strcasecmp(nam, "powershell") == 0) result = OS_WIN_POWERSHELL; else if (strcasecmp(nam, "freebsd") == 0) result = OS_FREEBSD; else if (strcasecmp(nam, "netbsd") == 0) result = OS_NETBSD; else if (strcasecmp(nam, "openbsd") == 0) result = OS_OPENBSD; else if (strcasecmp(nam, "debian3") == 0) result = OS_LINUX22; else if (strcasecmp(nam, "linux22") == 0) result = OS_LINUX22; else if (strcasecmp(nam, "linux") == 0) result = OS_LINUX; else if (strcasecmp(nam, "redhat") == 0) result = OS_LINUX; else if (strcasecmp(nam, "debian") == 0) result = OS_LINUX; else if (strcasecmp(nam, "suse") == 0) result = OS_LINUX; else if (strcasecmp(nam, "mandrake") == 0) result = OS_LINUX; else if (strcasecmp(nam, "redhatAS") == 0) result = OS_LINUX; else if (strcasecmp(nam, "redhatES") == 0) result = OS_RHEL3; else if (strcasecmp(nam, "rhel3") == 0) result = OS_RHEL3; else if (strcasecmp(nam, "snmp") == 0) result = OS_SNMP; else if (strcasecmp(nam, "snmpnetstat") == 0) result = OS_SNMP; else if (strncasecmp(nam, "irix", 4) == 0) result = OS_IRIX; else if (strcasecmp(nam, "macosx") == 0) result = OS_DARWIN; else if (strcasecmp(nam, "darwin") == 0) result = OS_DARWIN; else if (strcasecmp(nam, "sco_sv") == 0) result = OS_SCO_SV; else if (strcasecmp(nam, "unixware") == 0) result = OS_SCO_SV; else if (strcasecmp(nam, "netware_snmp") == 0) result = OS_NETWARE_SNMP; else if (strcasecmp(nam, "zvm") == 0) result = OS_ZVM; else if (strcasecmp(nam, "zvse") == 0) result = OS_ZVSE; else if (strcasecmp(nam, "zos") == 0) result = OS_ZOS; else if (strcasecmp(nam, "snmpcollect") == 0) result = OS_SNMPCOLLECT; else if (strcasecmp(nam, "mqcollect") == 0) result = OS_MQCOLLECT; else if (strcasecmp(nam, "gnu/kfreebsd") == 0) result = OS_GNUKFREEBSD; if (result == OS_UNKNOWN) dbgprintf("Unknown OS: '%s'\n", osname); xfree(nam); return result; } char *osname(enum ostype_t os) { switch (os) { case OS_SOLARIS: return "solaris"; case OS_HPUX: return "hpux"; case OS_AIX: return "aix"; case OS_OSF: return "osf"; case OS_WIN32: return "win32"; case OS_WIN32_HMDC: return "hmdc"; case OS_WIN32_BBWIN: return "bbwin"; case OS_WIN_POWERSHELL: return "powershell"; case OS_FREEBSD: return "freebsd"; case OS_NETBSD: return "netbsd"; case OS_OPENBSD: return "openbsd"; case OS_LINUX22: return "linux22"; case OS_LINUX: return "linux"; case OS_RHEL3: return "rhel3"; case OS_SNMP: return "snmp"; case OS_IRIX: return "irix"; case OS_DARWIN: return "darwin"; case OS_SCO_SV: return "sco_sv"; case OS_NETWARE_SNMP: return "netware_snmp"; case OS_ZVM: return "zvm"; case OS_ZVSE: return "zvse"; case OS_ZOS: return "zos"; case OS_SNMPCOLLECT: return "snmpcollect"; case OS_MQCOLLECT: return "mqcollect"; case OS_GNUKFREEBSD: return "gnu/kfreebsd"; case OS_UNKNOWN: return "unknown"; } return "unknown"; } int hexvalue(unsigned char c) { switch (c) { case '0': return 0; case '1': return 1; case '2': return 2; case '3': return 3; case '4': return 4; case '5': return 5; case '6': return 6; case '7': return 7; case '8': return 8; case '9': return 9; case 'a': return 10; case 'A': return 10; case 'b': return 11; case 'B': return 11; case 'c': return 12; case 'C': return 12; case 'd': return 13; case 'D': return 13; case 'e': return 14; case 'E': return 14; case 'f': return 15; case 'F': return 15; } return -1; } char *commafy(char *hostname) { static char *s = NULL; char *p; if (s == NULL) { s = strdup(hostname); } else if (strlen(hostname) > strlen(s)) { xfree(s); s = strdup(hostname); } else { strcpy(s, hostname); } for (p = strchr(s, '.'); (p); p = strchr(s, '.')) *p = ','; return s; } void uncommafy(char *hostname) { char *p; p = hostname; while ((p = strchr(p, ',')) != NULL) *p = '.'; } char *skipword(char *l) { return l + strcspn(l, " \t"); } char *skipwhitespace(char *l) { return l + strspn(l, " \t"); } char *stripnonwords(char *l) { /* Attempt to strip non-word data */ static char reduced[255]; char *inp; int outidx; reduced[0] = '\0'; if (!l) return (char *)reduced; /* Must be in the set [a-zA-Z0-9_] ... */ for (inp=l, outidx=0; (*inp && (outidx < 250)); inp++) { if ( ((*inp >= 'A') && (*inp <= 'Z')) || ((*inp >= 'a') && (*inp <= 'z')) || ((*inp >= '0') && (*inp <= '9')) ) { reduced[outidx++] = *inp; } /* Replace anything else with an underscore, */ /* compacting successive invalid chars into 1 */ else if ((outidx == 0) || (reduced[outidx - 1] != '_')) { reduced[outidx++] = '_'; } } /* strip a final invalid char */ if ((outidx > 0) && (reduced[outidx-1] == '_')) { reduced[outidx-1] = '\0'; } else { reduced[outidx] = '\0'; } return (char *)reduced; } int argnmatch(char *arg, char *match) { return (strncmp(arg, match, strlen(match)) == 0); } char *msg_data(char *msg, int stripcr) { /* Find the start position of the data following the "status host.test " message */ char *result; if (!msg || (*msg == '\0')) return msg; result = strchr(msg, '.'); /* Hits the '.' in "host.test" */ if (!result) { dbgprintf("Msg was not what I expected: '%s'\n", msg); return msg; } result += strcspn(result, " \t\n"); /* Skip anything until we see a space, TAB or NL */ result += strspn(result, " \t"); /* Skip all whitespace */ if (stripcr) { /* Replace with blanks */ char *cr = result; do { cr = strchr(cr, '\r'); if (cr) *cr = ' '; } while (cr); } return result; } char *gettok(char *s, char *delims) { /* * This works like strtok(), but can handle empty fields. */ static char *source = NULL; static char *whereat = NULL; int n; char *result; if ((delims == NULL) || (*delims == '\0')) return NULL; /* Sanity check */ if ((source == NULL) && (s == NULL)) return NULL; /* Programmer goofed and called us first time with NULL */ if (s) source = whereat = s; /* First call */ if (*whereat == '\0') { /* End of string ... clear local state and return NULL */ source = whereat = NULL; return NULL; } n = strcspn(whereat, delims); if (n == 0) { /* An empty token */ whereat++; result = ""; } else if (n == strlen(whereat)) { /* Last token */ result = whereat; whereat += n; } else { /* Mid-string token - null-teminate the token */ *(whereat + n) = '\0'; result = whereat; /* Move past this token and the delimiter */ whereat += (n+1); } return result; } char *wstok(char *s) { /* * This works like strtok(s, " \t"), but can handle quoted fields. */ static char *source = NULL; static char *whereat = NULL; int n; char *result; if ((source == NULL) && (s == NULL)) return NULL; if (s) source = whereat = s + strspn(s, " \t"); /* First call */ if (*whereat == '\0') { /* End of string ... clear local state and return NULL */ source = whereat = NULL; return NULL; } n = 0; do { n += strcspn(whereat+n, " \t\""); if (*(whereat+n) == '"') { char *p = strchr(whereat+n+1, '"'); if (!p) n = strlen(whereat); else n = (p - whereat) + 1; } } while (*(whereat+n) && (*(whereat+n) != ' ') && (*(whereat+n) != '\t')); if (n == strlen(whereat)) { /* Last token */ result = whereat; whereat += n; } else { /* Mid-string token - null-teminate the token */ *(whereat + n) = '\0'; result = whereat; /* Move past this token and the delimiter */ whereat += (n+1); whereat += strspn(whereat, " \t"); } /* Strip leading/trailing quote */ { char *p; if (*result == '"') result++; p = result + strlen(result) - 1; if (*p == '"') *p = '\0'; } return result; } void sanitize_input(strbuffer_t *l, int stripcomment, int unescape) { int i; /* * This routine sanitizes an input line, stripping off leading/trailing whitespace. * If requested, it also strips comments. * If requested, it also un-escapes \-escaped charactes. */ /* Kill comments */ if (stripcomment || unescape) { char *p, *commentstart = NULL; char *noquotemarkers = (unescape ? "\"'#\\" : "\"'#"); char *inquotemarkers = (unescape ? "\"'\\" : "\"'"); int inquote = 0; p = STRBUF(l) + strcspn(STRBUF(l), noquotemarkers); while (*p && (commentstart == NULL)) { switch (*p) { case '\\': if (inquote) p += 2+strcspn(p+2, inquotemarkers); else p += 2+strcspn(p+2, noquotemarkers); break; case '"': case '\'': inquote = (1 - inquote); if (inquote) p += 1+strcspn(p+1, inquotemarkers); else p += 1+strcspn(p+1, noquotemarkers); break; case '#': if (!inquote) commentstart = p; break; } } if (commentstart) strbufferchop(l, STRBUFLEN(l) - (commentstart - STRBUF(l))); } /* Kill a trailing CR/NL */ i = strcspn(STRBUF(l), "\r\n"); if (i != STRBUFLEN(l)) strbufferchop(l, STRBUFLEN(l)-i); /* Kill trailing whitespace */ i = STRBUFLEN(l); while ((i > 0) && isspace((int)(*(STRBUF(l)+i-1)))) i--; if (i != STRBUFLEN(l)) strbufferchop(l, STRBUFLEN(l)-i); /* Kill leading whitespace */ i = strspn(STRBUF(l), " \t"); if (i > 0) { memmove(STRBUF(l), STRBUF(l)+i, STRBUFLEN(l)-i); strbufferchop(l, i); } if (unescape) { char *p; p = STRBUF(l) + strcspn(STRBUF(l), "\\"); while (*p) { memmove(p, p+1, STRBUFLEN(l)-(p-STRBUF(l))); strbufferchop(l, 1); p = p + 1 + strcspn(p+1, "\\"); } } } unsigned int IPtou32(int ip1, int ip2, int ip3, int ip4) { return ((ip1 << 24) | (ip2 << 16) | (ip3 << 8) | (ip4)); } char *u32toIP(unsigned int ip32) { int ip1, ip2, ip3, ip4; static char *result = NULL; if (result == NULL) result = (char *)malloc(16); ip1 = ((ip32 >> 24) & 0xFF); ip2 = ((ip32 >> 16) & 0xFF); ip3 = ((ip32 >> 8) & 0xFF); ip4 = (ip32 & 0xFF); sprintf(result, "%d.%d.%d.%d", ip1, ip2, ip3, ip4); return result; } const char *textornull(const char *text) { return (text ? text : "(NULL)"); } int issimpleword(const char *text) { if (text == NULL) return 0; return (strlen(text) == strspn(text, "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ._-")); } int get_fqdn(void) { /* Get FQDN setting */ getenv_default("FQDN", "TRUE", NULL); return (strcmp(xgetenv("FQDN"), "TRUE") == 0); } int generate_static(void) { getenv_default("XYMONLOGSTATUS", "STATIC", NULL); return (strcmp(xgetenv("XYMONLOGSTATUS"), "STATIC") == 0); } void do_extensions(FILE *output, char *extenv, char *family) { /* * Extension scripts. These are ad-hoc, and implemented as a * simple pipe. So we do a fork here ... */ char *exts, *p; FILE *inpipe; char extfn[PATH_MAX]; strbuffer_t *inbuf; p = xgetenv(extenv); if (p == NULL) { /* No extension */ return; } MEMDEFINE(extfn); exts = strdup(p); p = strtok(exts, "\t "); inbuf = newstrbuffer(0); while (p) { /* Don't redo the eventlog or acklog things */ if ((strcmp(p, "eventlog.sh") != 0) && (strcmp(p, "acklog.sh") != 0)) { sprintf(extfn, "%s/ext/%s/%s", xgetenv("XYMONHOME"), family, p); inpipe = popen(extfn, "r"); if (inpipe) { initfgets(inpipe); while (unlimfgets(inbuf, inpipe)) fputs(STRBUF(inbuf), output); pclose(inpipe); freestrbuffer(inbuf); } } p = strtok(NULL, "\t "); } xfree(exts); MEMUNDEFINE(extfn); MEMUNDEFINE(buf); } static void clean_cmdarg(char *l) { /* * This routine sanitizes command-line argument, stripping off whitespace, * removing comments and un-escaping \-escapes and quotes. */ char *p, *outp; int inquote, inhyphen; /* Remove quotes, comments and leading whitespace */ p = l + strspn(l, " \t"); outp = l; inquote = inhyphen = 0; while (*p) { if (*p == '\\') { *outp = *(p+1); outp++; p += 2; } else if (*p == '"') { inquote = (1 - inquote); p++; } else if (*p == '\'') { inhyphen = (1 - inhyphen); p++; } else if ((*p == '#') && !inquote && !inhyphen) { *p = '\0'; } else { if (outp != p) *outp = *p; outp++; p++; } } /* Remove trailing whitespace */ while ((outp > l) && (isspace((int) *(outp-1)))) outp--; *outp = '\0'; } char **setup_commandargs(char *cmdline, char **cmd) { /* * Good grief - argument parsing is complex! * * This routine takes a command-line, picks out any environment settings * that are in the command line, and splits up the remainder into the * actual command to run, and the arguments. * * It handles quotes, hyphens and escapes. */ char **cmdargs; char *cmdcp, *barg, *earg, *eqchar, *envsetting; int argi, argsz; int argdone, inquote, inhyphen; char savech; argsz = 1; cmdargs = (char **) malloc((1+argsz)*sizeof(char *)); argi = 0; cmdcp = strdup(expand_env(cmdline)); /* Kill a trailing CR/NL */ barg = cmdcp + strcspn(cmdcp, "\r\n"); *barg = '\0'; barg = cmdcp; do { earg = barg; argdone = 0; inquote = inhyphen = 0; while (*earg && !argdone) { if (!inquote && !inhyphen) { argdone = isspace((int)*earg); } if ((*earg == '"') && !inhyphen) inquote = (1 - inquote); if ((*earg == '\'') && !inquote) inhyphen = (1 - inhyphen); if (!argdone) earg++; } savech = *earg; *earg = '\0'; clean_cmdarg(barg); eqchar = strchr(barg, '='); if (eqchar && (eqchar == (barg + strspn(barg, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")))) { /* It's an environment definition */ dbgprintf("Setting environment: %s\n", barg); envsetting = strdup(barg); putenv(envsetting); } else { if (argi == argsz) { argsz++; cmdargs = (char **) realloc(cmdargs, (1+argsz)*sizeof(char *)); } cmdargs[argi++] = strdup(barg); } *earg = savech; barg = earg + strspn(earg, " \t\n"); } while (*barg); cmdargs[argi] = NULL; xfree(cmdcp); *cmd = cmdargs[0]; return cmdargs; } long long str2ll(char *s, char **errptr) { #ifdef HAVE_STRTOLL return strtoll(s, errptr, 10); #else long long result = 0; int negative = 0; char *inp; inp = s + strspn(s, " \t"); if (*inp == '-') { negative = 1; inp++; } while (isdigit((int)*inp)) { result = 10*result + (*inp - '0'); inp++; } if (errptr && (*inp != '\0') && (!isspace((int)*inp))) *errptr = inp; if (negative) result = -result; return result; #endif } int checkalert(char *alertlist, char *testname) { char *alist, *aname; int result; if (!alertlist) return 0; alist = (char *) malloc(strlen(alertlist) + 3); sprintf(alist, ",%s,", alertlist); aname = (char *) malloc(strlen(testname) + 3); sprintf(aname, ",%s,", testname); result = (strstr(alist, aname) != NULL); xfree(aname); xfree(alist); return result; } char *nextcolumn(char *s) { static char *ofs = NULL; char *result; if (s) ofs = s + strspn(s, " \t"); if (!s && !ofs) return NULL; result = ofs; ofs += strcspn(ofs, " \t"); if (*ofs) { *ofs = '\0'; ofs += 1 + strspn(ofs+1, " \t"); } else ofs = NULL; return result; } int selectcolumn(char *heading, char *wanted) { char *hdr; int result = 0; hdr = nextcolumn(heading); while (hdr && strcasecmp(hdr, wanted)) { result++; hdr = nextcolumn(NULL); } if (hdr) return result; else return -1; } char *getcolumn(char *s, int wanted) { char *result; int i; for (i=0, result=nextcolumn(s); (i < wanted); i++, result = nextcolumn(NULL)); return result; } int chkfreespace(char *path, int minblks, int mininodes) { /* Check there is least 'minblks' % free space on filesystem 'path' */ struct statvfs fs; int n; int avlblk, avlnod; n = statvfs(path, &fs); if (n == -1) { errprintf("Cannot stat filesystem %s: %s\n", path, strerror(errno)); return 0; } /* Not all filesystems report i-node data, so play it safe */ avlblk = ((fs.f_bavail > 0) && (fs.f_blocks > 0)) ? fs.f_bavail / (fs.f_blocks / 100) : 100; avlnod = ((fs.f_favail > 0) && (fs.f_files > 0)) ? fs.f_favail / (fs.f_files / 100) : 100; if ((avlblk >= minblks) && (avlnod >= mininodes)) return 0; return 1; } xymon-4.3.28/lib/clientlocal.c0000664000076400007640000001652113017633557016434 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module for Xymon, responsible for loading the */ /* client-local.cfg file into memory and finding the proper host entry. */ /* */ /* Copyright (C) 2006-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: clientlocal.c 7985 2016-11-30 20:32:47Z jccleaver $"; #include #include #include #include "libxymon.h" typedef struct clientconfig_t { pcre *hostptn, *classptn, *osptn; strbuffer_t *config; struct clientconfig_t *next; } clientconfig_t; static clientconfig_t *cchead = NULL; typedef struct cctree_t { char *hostname; char *config; } cctree_t; static void *cctree = NULL; /* Feature flag: Set to 1 to merge all matching clientconfig entries into one */ static int ccmergemode = 0; void load_clientconfig(void) { static char *configfn = NULL; static void *clientconflist = NULL; FILE *fd; strbuffer_t *buf; clientconfig_t *cctail = NULL; if (!configfn) { configfn = (char *)malloc(strlen(xgetenv("XYMONHOME"))+ strlen("/etc/client-local.cfg") + 1); sprintf(configfn, "%s/etc/client-local.cfg", xgetenv("XYMONHOME")); } /* First check if there were no modifications at all */ if (clientconflist) { if (!stackfmodified(clientconflist)){ dbgprintf("No files modified, skipping reload of %s\n", configfn); return; } else { stackfclist(&clientconflist); clientconflist = NULL; } } /* Must reload the config, clear out old cache data */ if (cchead) { clientconfig_t *walk, *zombie; walk = cchead; while (walk) { zombie = walk; walk = walk->next; if (zombie->hostptn) freeregex(zombie->hostptn); if (zombie->classptn) freeregex(zombie->classptn); if (zombie->osptn) freeregex(zombie->osptn); if (zombie->config) freestrbuffer(zombie->config); xfree(zombie); } cchead = NULL; } if (cctree) { xtreePos_t handle; cctree_t *rec; handle = xtreeFirst(cctree); while (handle != xtreeEnd(cctree)) { rec = xtreeData(cctree, handle); xfree(rec->hostname); xfree(rec->config); handle = xtreeNext(cctree, handle); } xtreeDestroy(cctree); cctree = NULL; } buf = newstrbuffer(0); fd = stackfopen(configfn, "r", &clientconflist); if (!fd) return; while (stackfgets(buf, NULL)) { static int insection = 0; char *p, *ptn; /* Ignore comments and blank lines */ p = STRBUF(buf); p += strspn(p, " \t\r\n"); if ((*p == '#') || (*p == '\0')) continue; if (insection) { if (*p != '[') { if (cctail) { if (!cctail->config) cctail->config = newstrbuffer(0); addtostrbuffer(cctail->config, buf); } } else { insection = 0; } } if (!insection) { if (*STRBUF(buf) == '[') { pcre *hostptn = NULL, *classptn = NULL, *osptn = NULL; clientconfig_t *newrec; p = STRBUF(buf) + strcspn(STRBUF(buf), "\r\n"); if (p == STRBUF(buf)) errprintf("Garbled block in client-local.cfg\n"); else if (*(p-1) == ']') { *(p-1) = '\0'; strbufferrecalc(buf); ptn = STRBUF(buf) + 1; if (strncasecmp(ptn, "host=", 5) == 0) { ptn += 5; if (*ptn == '%') ptn++; hostptn = compileregex((strcmp(ptn, "*") == 0) ? "." : ptn); if (!hostptn) errprintf("Invalid host pattern in client-local.cfg: %s\n", ptn); } else if (strncasecmp(ptn, "class=", 6) == 0) { ptn += 6; if (*ptn == '%') ptn++; classptn = compileregex((strcmp(ptn, "*") == 0) ? "." : ptn); if (!classptn) errprintf("Invalid class pattern in client-local.cfg: %s\n", ptn); } else if (strncasecmp(ptn, "os=", 3) == 0) { ptn += 3; if (*ptn == '%') ptn++; osptn = compileregex((strcmp(ptn, "*") == 0) ? "." : ptn); if (!osptn) errprintf("Invalid os pattern in client-local.cfg: %s\n", ptn); } else if (*(ptn + strlen(ptn) - 1) == '*') { /* It's a "blabla*" */ *(ptn-1) = '^'; /* Ok, we know there is a '[' first */ strbufferchop(buf, 1); hostptn = compileregex(ptn-1); } else { /* Old-style matching, must anchor it and match on all possible patterns */ *(ptn-1) = '^'; /* Ok, we know there is a '[' first */ addtobuffer(buf, "$"); /* Compile it three times, because we free each expression when reloading the config */ hostptn = compileregex(ptn-1); classptn = compileregex(ptn-1); osptn = compileregex(ptn-1); } if (hostptn || classptn || osptn) { newrec = (clientconfig_t *)calloc(1, sizeof(clientconfig_t)); newrec->hostptn = hostptn; newrec->classptn = classptn; newrec->osptn = osptn; newrec->next = NULL; if (!cchead) { cchead = cctail = newrec; } else { cctail->next = newrec; cctail = newrec; } insection = 1; } } } } } stackfclose(fd); freestrbuffer(buf); } char *get_clientconfig(char *hostname, char *hostclass, char *hostos) { xtreePos_t handle; cctree_t *rec = NULL; if (!cchead) return NULL; if (!cctree) cctree = xtreeNew(strcasecmp); handle = xtreeFind(cctree, hostname); if (handle == xtreeEnd(cctree)) { strbuffer_t *config = newstrbuffer(0); clientconfig_t *walk = cchead; if (!ccmergemode) { /* Old-style: Find the first match of hostname, classname or osname - in that priority */ clientconfig_t *hostmatch = NULL, *classmatch = NULL, *osmatch = NULL; while (walk && !hostmatch) { /* Can stop if we find a hostmatch, since those are priority 1 */ if (walk->hostptn && !hostmatch && matchregex(hostname, walk->hostptn)) hostmatch = walk; else if (walk->classptn && !classmatch && matchregex(hostclass, walk->classptn)) classmatch = walk; else if (walk->osptn && !osmatch && matchregex(hostos, walk->osptn)) osmatch = walk; walk = walk->next; } if (hostmatch && hostmatch->config) addtostrbuffer(config, hostmatch->config); else if (classmatch && classmatch->config) addtostrbuffer(config, classmatch->config); else if (osmatch && osmatch->config) addtostrbuffer(config, osmatch->config); } else { /* Merge mode: Merge all matching entries into one */ while (walk) { if ( (walk->hostptn && matchregex(hostname, walk->hostptn)) || (walk->classptn && matchregex(hostclass, walk->classptn)) || (walk->osptn && matchregex(hostos, walk->osptn)) ) { if (walk->config) addtostrbuffer(config, walk->config); } walk = walk->next; } } rec = (cctree_t *)calloc(1, sizeof(cctree_t)); rec->hostname = strdup(hostname); rec->config = grabstrbuffer(config); xtreeAdd(cctree, rec->hostname, rec); } else { rec = (cctree_t *)xtreeData(cctree, handle); } return (rec ? rec->config : NULL); } void set_clientlocal_mergemode(int onoff) { ccmergemode = (onoff != 0); } xymon-4.3.28/lib/tree.c0000664000076400007640000003203712275523176015102 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains routines for tree-based record storage. */ /* */ /* Copyright (C) 2011-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: files.c 6712 2011-07-31 21:01:52Z storner $"; #include #include #include #include #include #include "config.h" #include "tree.h" #ifdef HAVE_BINARY_TREE #include typedef struct treerec_t { char *key; void *userdata; int (*compare)(const char *a, const char *b); struct treerec_t *link; } treerec_t; typedef struct xtree_t { void *root; int (*compare)(const char *a, const char *b); } xtree_t; static treerec_t *i_curr = NULL; static int xtree_i_compare(const void *pa, const void *pb) { const treerec_t *reca = pa, *recb = pb; return (reca->compare)(reca->key, recb->key); } void *xtreeNew(int(*xtreeCompare)(const char *a, const char *b)) { xtree_t *newtree; newtree = (xtree_t *)calloc(1, sizeof(xtree_t)); newtree->compare = xtreeCompare; newtree->root = NULL; return newtree; } void xtreeDestroy(void *treehandle) { free(treehandle); } xtreeStatus_t xtreeAdd(void *treehandle, char *key, void *userdata) { xtree_t *tree = treehandle; treerec_t *rec, **erec; if (!tree) return XTREE_STATUS_NOTREE; rec = (treerec_t *)calloc(1, sizeof(treerec_t)); rec->key = key; rec->userdata = userdata; rec->compare = tree->compare; erec = tsearch(rec, &tree->root, xtree_i_compare); if (erec == NULL) { free(rec); return XTREE_STATUS_MEM_EXHAUSTED; } if (*erec != rec) { /* Was already there */ free(rec); return XTREE_STATUS_DUPLICATE_KEY; } return XTREE_STATUS_OK; } void *xtreeDelete(void *treehandle, char *key) { xtree_t *tree = treehandle; treerec_t **result, *zombie, rec; void *userdata; if (!tree) return NULL; rec.key = key; rec.userdata = NULL; rec.compare = tree->compare; result = tfind(&rec, &tree->root, xtree_i_compare); if (result == NULL) { /* Not found */ return NULL; } userdata = (*result)->userdata; zombie = (*result); tdelete(&rec, &tree->root, xtree_i_compare); free(zombie); return userdata; } xtreePos_t xtreeFind(void *treehandle, char *key) { xtree_t *tree = treehandle; treerec_t **result, rec; if (!tree) return NULL; rec.key = key; rec.userdata = NULL; rec.compare = tree->compare; result = tfind(&rec, &tree->root, xtree_i_compare); return (result ? *result : NULL); } static void xtree_i_action(const void *nodep, const VISIT which, const int depth) { treerec_t *rec = NULL; switch (which) { case preorder: break; case postorder: rec = *(treerec_t **) nodep; break; case endorder: break; case leaf: rec = *(treerec_t **) nodep; break; } if (rec) { /* * Each time here, we have rec pointing to the next record in the tree, and i_curr is then * pointing to the previous record. So build a linked list of the records going backwards * as we move through the tree. * * R0 <- R1:link <- R2:link <- R3:link * ^ * i_curr * * becomes * * R0 <- R1:link <- R2:link <- R3:link <- rec:link * ^ * i_curr */ rec->link = i_curr; i_curr = rec; } } xtreePos_t xtreeFirst(void *treehandle) { xtree_t *tree = treehandle; treerec_t *walk, *right, *left; if (!tree) return NULL; i_curr = NULL; twalk(tree->root, xtree_i_action); if (!i_curr) return NULL; /* * We have walked the tree and created a reverse-linked list of the records. * Now reverse the list so we get the records in the right sequence. * i_curr points to the last entry. * * R1 <- R2 <- R3 <- R4 * ^ * i_curr * * must be reversed to * * R1 -> R2 -> R3 -> R4 */ walk = i_curr; right = NULL; while (walk->link) { left = walk->link; walk->link = right; right = walk; walk = left; } walk->link = right; i_curr = NULL; return walk; } xtreePos_t xtreeNext(void *treehandle, xtreePos_t pos) { return pos ? ((treerec_t *)pos)->link : NULL; } char *xtreeKey(void *treehandle, xtreePos_t pos) { return pos ? ((treerec_t *)pos)->key : NULL; } void *xtreeData(void *treehandle, xtreePos_t pos) { return pos ? ((treerec_t *)pos)->userdata : NULL; } #else typedef struct treerec_t { char *key; void *userdata; int deleted; } treerec_t; typedef struct xtree_t { treerec_t *entries; xtreePos_t treesz; int (*compare)(const char *a, const char *b); } xtree_t; static xtreePos_t binsearch(xtree_t *mytree, char *key) { xtreePos_t uplim, lowlim, n; if (!key) return -1; /* Do a binary search */ lowlim = 0; uplim = mytree->treesz-1; do { xtreePos_t res; n = (uplim + lowlim) / 2; res = mytree->compare(key, mytree->entries[n].key); if (res == 0) { /* Found it! */ uplim = -1; /* To exit loop */ } else if (res > 0) { /* Higher up */ lowlim = n+1; } else { /* Further down */ uplim = n-1; } } while ((uplim >= 0) && (lowlim <= uplim)); return n; } void *xtreeNew(int(*xtreeCompare)(const char *a, const char *b)) { xtree_t *newtree = (xtree_t *)calloc(1, sizeof(xtree_t)); newtree->compare = xtreeCompare; return newtree; } void xtreeDestroy(void *treehandle) { xtree_t *mytree = (xtree_t *)treehandle; xtreePos_t i; if (treehandle == NULL) return; /* Must delete our privately held keys in the deleted records */ for (i = 0; (i < mytree->treesz); i++) { if (mytree->entries[i].deleted) free(mytree->entries[i].key); } free(mytree->entries); free(mytree); } xtreePos_t xtreeFind(void *treehandle, char *key) { xtree_t *mytree = (xtree_t *)treehandle; xtreePos_t n; /* Does tree exist ? Is it empty? */ if ((treehandle == NULL) || (mytree->treesz == 0)) return -1; n = binsearch(mytree, key); if ((n >= 0) && (n < mytree->treesz) && (mytree->entries[n].deleted == 0) && (mytree->compare(key, mytree->entries[n].key) == 0)) return n; return -1; } xtreePos_t xtreeFirst(void *treehandle) { xtree_t *mytree = (xtree_t *)treehandle; /* Does tree exist ? Is it empty? */ if ((treehandle == NULL) || (mytree->treesz == 0)) return -1; return 0; } xtreePos_t xtreeNext(void *treehandle, xtreePos_t pos) { xtree_t *mytree = (xtree_t *)treehandle; /* Does tree exist ? Is it empty? */ if ((treehandle == NULL) || (mytree->treesz == 0) || (pos >= (mytree->treesz - 1)) || (pos < 0)) return -1; do { pos++; } while (mytree->entries[pos].deleted && (pos < mytree->treesz)); return (pos < mytree->treesz) ? pos : -1; } char *xtreeKey(void *treehandle, xtreePos_t pos) { xtree_t *mytree = (xtree_t *)treehandle; /* Does tree exist ? Is it empty? */ if ((treehandle == NULL) || (mytree->treesz == 0) || (pos >= mytree->treesz) || (pos < 0)) return NULL; return mytree->entries[pos].key; } void *xtreeData(void *treehandle, xtreePos_t pos) { xtree_t *mytree = (xtree_t *)treehandle; /* Does tree exist ? Is it empty? */ if ((treehandle == NULL) || (mytree->treesz == 0) || (pos >= mytree->treesz) || (pos < 0)) return NULL; return mytree->entries[pos].userdata; } xtreeStatus_t xtreeAdd(void *treehandle, char *key, void *userdata) { xtree_t *mytree = (xtree_t *)treehandle; xtreePos_t n; if (treehandle == NULL) return XTREE_STATUS_NOTREE; if (mytree->treesz == 0) { /* Empty tree, just add record */ mytree->entries = (treerec_t *)calloc(1, sizeof(treerec_t)); mytree->entries[0].key = key; mytree->entries[0].userdata = userdata; mytree->entries[0].deleted = 0; } else { n = binsearch(mytree, key); if ((n >= 0) && (n < mytree->treesz) && (mytree->compare(key, mytree->entries[n].key) == 0)) { /* Record already exists */ if (mytree->entries[n].deleted != 0) { /* Revive the old record. Note that we can now discard our privately held key */ free(mytree->entries[n].key); mytree->entries[n].key = key; mytree->entries[n].deleted = 0; mytree->entries[n].userdata = userdata; return XTREE_STATUS_OK; } else { /* Error */ return XTREE_STATUS_DUPLICATE_KEY; } } /* Must create new record */ if (mytree->compare(key, mytree->entries[mytree->treesz - 1].key) > 0) { /* Add after all the others */ mytree->entries = (treerec_t *)realloc(mytree->entries, (1 + mytree->treesz)*sizeof(treerec_t)); mytree->entries[mytree->treesz].key = key; mytree->entries[mytree->treesz].userdata = userdata; mytree->entries[mytree->treesz].deleted = 0; } else if (mytree->compare(key, mytree->entries[0].key) < 0) { /* Add before all the others */ treerec_t *newents = (treerec_t *)malloc((1 + mytree->treesz)*sizeof(treerec_t)); newents[0].key = key; newents[0].userdata = userdata; newents[0].deleted = 0; memcpy(&(newents[1]), &(mytree->entries[0]), (mytree->treesz * sizeof(treerec_t))); free(mytree->entries); mytree->entries = newents; } else { treerec_t *newents; n = binsearch(mytree, key); if (mytree->compare(mytree->entries[n].key, key) < 0) n++; /* * n now points to the record AFTER where we will insert data in the current list. * So in the new list, the new record will be in position n. * Check if this is a deleted record, if it is then we won't have to move anything. */ if (mytree->entries[n].deleted != 0) { /* Deleted record, let's re-use it. */ free(mytree->entries[n].key); mytree->entries[n].key = key; mytree->entries[n].userdata = userdata; mytree->entries[n].deleted = 0; return XTREE_STATUS_OK; } /* Ok, must create a new list and copy entries there */ newents = (treerec_t *)malloc((1 + mytree->treesz)*sizeof(treerec_t)); /* Copy record 0..(n-1), i.e. n records */ memcpy(&(newents[0]), &(mytree->entries[0]), n*sizeof(treerec_t)); /* New record is the n'th record */ newents[n].key = key; newents[n].userdata = userdata; newents[n].deleted = 0; /* Finally, copy records n..(treesz-1) from the old list to position (n+1) onwards in the new list */ memcpy(&(newents[n+1]), &(mytree->entries[n]), (mytree->treesz - n)*sizeof(treerec_t)); free(mytree->entries); mytree->entries = newents; } } mytree->treesz += 1; return XTREE_STATUS_OK; } void *xtreeDelete(void *treehandle, char *key) { xtree_t *mytree = (xtree_t *)treehandle; xtreePos_t n; if (treehandle == NULL) return NULL; if (mytree->treesz == 0) return NULL; /* Empty tree */ n = binsearch(mytree, key); if ((n >= 0) && (n < mytree->treesz) && (mytree->entries[n].deleted == 0) && (mytree->compare(key, mytree->entries[n].key) == 0)) { mytree->entries[n].key = strdup(mytree->entries[n].key); /* Must dup the key, since user may discard it */ mytree->entries[n].deleted = 1; return mytree->entries[n].userdata; } return NULL; } #endif #ifdef STANDALONE int main(int argc, char **argv) { char buf[1024], key[1024], data[1024]; void *th = NULL; xtreePos_t n; xtreeStatus_t stat; char *rec, *p; do { printf("New, Add, Find, Delete, dUmp, deStroy : "); fflush(stdout); if (fgets(buf, sizeof(buf), stdin) == NULL) return 0; switch (*buf) { case 'N': case 'n': th = xtreeNew(strcasecmp); break; case 'A': case 'a': printf("Key:");fflush(stdout); fgets(key, sizeof(key), stdin); p = strchr(key, '\n'); if (p) *p = '\0'; printf("Data:");fflush(stdout); fgets(data, sizeof(data), stdin); p = strchr(data, '\n'); if (p) *p = '\0'; stat = xtreeAdd(th, strdup(key), strdup(data)); printf("Result: %d\n", stat); break; case 'D': case 'd': printf("Key:");fflush(stdout); fgets(key, sizeof(key), stdin); p = strchr(key, '\n'); if (p) *p = '\0'; rec = xtreeDelete(th, key); if (rec) { printf("Existing record deleted: Data was '%s'\n", rec); } else { printf("No record\n"); } break; case 'F': case 'f': printf("Key:");fflush(stdout); fgets(key, sizeof(key), stdin); p = strchr(key, '\n'); if (p) *p = '\0'; n = xtreeFind(th, key); if (n != xtreeEnd(th)) { printf("Found record: Data was '%s'\n", (char *)xtreeData(th, n)); } else { printf("No record\n"); } break; case 'U': case 'u': n = xtreeFirst(th); while (n != xtreeEnd(th)) { printf("Key '%s', data '%s'\n", (char *)xtreeKey(th, n), (char *)xtreeData(th, n)); n = xtreeNext(th, n); } break; case 'S': case 's': xtreeDestroy(th); th = NULL; break; } } while (1); return 0; } #endif xymon-4.3.28/lib/loadalerts.c0000664000076400007640000012206312654212423016263 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module for Xymon, responsible for loading the */ /* alerts.cfg file which holds information about the Xymon alert */ /* configuration. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: loadalerts.c 7888 2016-02-02 20:44:03Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" /* token's are the pre-processor macros we expand while parsing the config file */ typedef struct token_t { char *name; char *value; struct token_t *next; } token_t; static token_t *tokhead = NULL; /* This defines a rule. Some general criteria, and a list of recipients. */ typedef struct rule_t { int cfid; criteria_t *criteria; recip_t *recipients; struct rule_t *next; } rule_t; static rule_t *rulehead = NULL; static rule_t *ruletail = NULL; static int cfid = 0; static char cfline[256]; static int printmode = 0; static rule_t *printrule = NULL; static enum { P_NONE, P_RULE, P_RECIP } pstate = P_NONE; static int defaultcolors = 0; static int localalertmode = 0; static criteria_t *setup_criteria(rule_t **currule, recip_t **currcp) { criteria_t *crit = NULL; MEMDEFINE(cfline); switch (pstate) { case P_NONE: *currule = (rule_t *)calloc(1, sizeof(rule_t)); (*currule)->cfid = cfid; pstate = P_RULE; /* Fall through */ case P_RULE: if (!(*currule)->criteria) (*currule)->criteria = (criteria_t *)calloc(1, sizeof(criteria_t)); crit = (*currule)->criteria; crit->cfid = cfid; if (crit->cfline == NULL) crit->cfline = strdup(cfline); *currcp = NULL; break; case P_RECIP: if (!(*currcp)->criteria) { recip_t *rwalk; (*currcp)->criteria = (criteria_t *)calloc(1, sizeof(criteria_t)); /* Make sure other recipients on the same rule also get these criteria */ for (rwalk = (*currule)->recipients; (rwalk); rwalk = rwalk->next) { if (rwalk->cfid == cfid) rwalk->criteria = (*currcp)->criteria; } } crit = (*currcp)->criteria; crit->cfid = cfid; if (crit->cfline == NULL) crit->cfline = strdup(cfline); break; } MEMUNDEFINE(cfline); return crit; } void set_localalertmode(int localmode) { if (localmode) localalertmode = 1; } static char *preprocess(char *buf) { /* Expands config-file macros */ static strbuffer_t *result = NULL; char *inp; if (result == NULL) result = newstrbuffer(8192); clearstrbuffer(result); inp = buf; while (inp) { char *p; p = strchr(inp, '$'); if (p == NULL) { addtobuffer(result, inp); inp = NULL; } else { token_t *twalk; char savech; int n; *p = '\0'; addtobuffer(result, inp); p = (p+1); n = strcspn(p, "\t $.,|%!()[]{}+?/&@:;*"); savech = *(p+n); *(p+n) = '\0'; for (twalk = tokhead; (twalk && strcmp(p, twalk->name)); twalk = twalk->next) ; *(p+n) = savech; if (twalk) addtobuffer(result, twalk->value); inp = p+n; } } return STRBUF(result); } static void flush_rule(rule_t *currule) { if (currule == NULL) return; currule->next = NULL; if (rulehead == NULL) { rulehead = ruletail = currule; } else { ruletail->next = currule; ruletail = currule; } } static void free_criteria(criteria_t *crit) { if (crit->cfline) xfree(crit->cfline); if (crit->pagespec) xfree(crit->pagespec); if (crit->pagespecre) pcre_free(crit->pagespecre); if (crit->expagespec) xfree(crit->expagespec); if (crit->expagespecre) pcre_free(crit->expagespecre); if (crit->dgspec) xfree(crit->dgspec); if (crit->dgspecre) pcre_free(crit->dgspecre); if (crit->exdgspec) xfree(crit->exdgspec); if (crit->exdgspecre) pcre_free(crit->exdgspecre); if (crit->hostspec) xfree(crit->hostspec); if (crit->hostspecre) pcre_free(crit->hostspecre); if (crit->exhostspec) xfree(crit->exhostspec); if (crit->exhostspecre) pcre_free(crit->exhostspecre); if (crit->svcspec) xfree(crit->svcspec); if (crit->svcspecre) pcre_free(crit->svcspecre); if (crit->exsvcspec) xfree(crit->exsvcspec); if (crit->exsvcspecre) pcre_free(crit->exsvcspecre); if (crit->classspec) xfree(crit->classspec); if (crit->classspecre) pcre_free(crit->classspecre); if (crit->exclassspec) xfree(crit->exclassspec); if (crit->exclassspecre) pcre_free(crit->exclassspecre); if (crit->groupspec) xfree(crit->groupspec); if (crit->groupspecre) pcre_free(crit->groupspecre); if (crit->exgroupspec) xfree(crit->exgroupspec); if (crit->exgroupspecre) pcre_free(crit->exgroupspecre); if (crit->timespec) xfree(crit->timespec); if (crit->extimespec) xfree(crit->extimespec); } int load_alertconfig(char *configfn, int defcolors, int defaultinterval) { /* (Re)load the configuration file without leaking memory */ static void *configfiles = NULL; char fn[PATH_MAX]; FILE *fd; strbuffer_t *inbuf; char *p; rule_t *currule = NULL; recip_t *currcp = NULL, *rcptail = NULL; MEMDEFINE(fn); if (configfn) strcpy(fn, configfn); else sprintf(fn, "%s/etc/alerts.cfg", xgetenv("XYMONHOME")); /* First check if there were no modifications at all */ if (configfiles) { if (!stackfmodified(configfiles)){ dbgprintf("No files modified, skipping reload of %s\n", fn); MEMUNDEFINE(fn); return 0; } else { stackfclist(&configfiles); configfiles = NULL; } } fd = stackfopen(fn, "r", &configfiles); if (!fd) { errprintf("Cannot open configuration file %s: %s\n", fn, strerror(errno)); MEMUNDEFINE(fn); return 0; } /* First, clean out the old rule set */ while (rulehead) { rule_t *trule; if (rulehead->criteria) { free_criteria(rulehead->criteria); xfree(rulehead->criteria); } while (rulehead->recipients) { recip_t *trecip = rulehead->recipients; if (trecip->criteria) { recip_t *rwalk; /* Clear out the duplicate criteria that may exist, to avoid double-free'ing them */ for (rwalk = trecip->next; (rwalk); rwalk = rwalk->next) { if (rwalk->criteria == trecip->criteria) rwalk->criteria = NULL; } free_criteria(trecip->criteria); xfree(trecip->criteria); } if (trecip->recipient) xfree(trecip->recipient); if (trecip->scriptname) xfree(trecip->scriptname); rulehead->recipients = rulehead->recipients->next; xfree(trecip); } trule = rulehead; rulehead = rulehead->next; xfree(trule); } while (tokhead) { token_t *ttok; if (tokhead->name) xfree(tokhead->name); if (tokhead->value) xfree(tokhead->value); ttok = tokhead; tokhead = tokhead->next; xfree(ttok); } defaultcolors = defcolors; MEMDEFINE(cfline); cfid = 0; inbuf = newstrbuffer(0); while (stackfgets(inbuf, NULL)) { int firsttoken = 1; int mailcmdactive = 0, scriptcmdactive = 0; recip_t *curlinerecips = NULL; cfid++; sanitize_input(inbuf, 1, 0); /* Skip empty lines */ if (STRBUFLEN(inbuf) == 0) continue; if ((*STRBUF(inbuf) == '$') && strchr(STRBUF(inbuf), '=')) { /* Define a macro */ token_t *newtok = (token_t *) malloc(sizeof(token_t)); char *delim; delim = strchr(STRBUF(inbuf), '='); *delim = '\0'; newtok->name = strdup(STRBUF(inbuf)+1); /* Skip the '$' */ newtok->value = strdup(preprocess(delim+1)); newtok->next = tokhead; tokhead = newtok; continue; } strncpy(cfline, STRBUF(inbuf), (sizeof(cfline)-1)); cfline[sizeof(cfline)-1] = '\0'; /* Expand macros inside the line before parsing */ p = strtok(preprocess(STRBUF(inbuf)), " \t"); while (p) { if ((strncasecmp(p, "PAGE=", 5) == 0) || (strncasecmp(p, "PAGES=", 6) == 0)) { char *val; criteria_t *crit; if (firsttoken) { flush_rule(currule); currule = NULL; currcp = NULL; pstate = P_NONE; } val = strchr(p, '=')+1; crit = setup_criteria(&currule, &currcp); crit->pagespec = strdup(val); if (*(crit->pagespec) == '%') crit->pagespecre = compileregex(crit->pagespec+1); firsttoken = 0; } else if ((strncasecmp(p, "EXPAGE=", 7) == 0) || (strncasecmp(p, "EXPAGES=", 8) == 0)) { char *val; criteria_t *crit; if (firsttoken) { flush_rule(currule); currule = NULL; currcp = NULL; pstate = P_NONE; } val = strchr(p, '=')+1; crit = setup_criteria(&currule, &currcp); crit->expagespec = strdup(val); if (*(crit->expagespec) == '%') crit->expagespecre = compileregex(crit->expagespec+1); firsttoken = 0; } else if ((strncasecmp(p, "DISPLAYGROUP=", 13) == 0) || (strncasecmp(p, "DISPLAYGROUPS=", 14) == 0)) { char *val; criteria_t *crit; if (firsttoken) { flush_rule(currule); currule = NULL; currcp = NULL; pstate = P_NONE; } val = strchr(p, '=')+1; crit = setup_criteria(&currule, &currcp); crit->dgspec = strdup(val); if (*(crit->dgspec) == '%') crit->dgspecre = compileregex(crit->dgspec+1); firsttoken = 0; } else if ((strncasecmp(p, "EXDISPLAYGROUP=", 15) == 0) || (strncasecmp(p, "EXDISPLAYGROUPS=", 16) == 0)) { char *val; criteria_t *crit; if (firsttoken) { flush_rule(currule); currule = NULL; currcp = NULL; pstate = P_NONE; } val = strchr(p, '=')+1; crit = setup_criteria(&currule, &currcp); crit->exdgspec = strdup(val); if (*(crit->exdgspec) == '%') crit->exdgspecre = compileregex(crit->exdgspec+1); firsttoken = 0; } else if ((strncasecmp(p, "HOST=", 5) == 0) || (strncasecmp(p, "HOSTS=", 6) == 0)) { char *val; criteria_t *crit; if (firsttoken) { flush_rule(currule); currule = NULL; currcp = NULL; pstate = P_NONE; } val = strchr(p, '=')+1; crit = setup_criteria(&currule, &currcp); crit->hostspec = strdup(val); if (*(crit->hostspec) == '%') crit->hostspecre = compileregex(crit->hostspec+1); firsttoken = 0; } else if ((strncasecmp(p, "EXHOST=", 7) == 0) || (strncasecmp(p, "EXHOSTS=", 8) == 0)) { char *val; criteria_t *crit; if (firsttoken) { flush_rule(currule); currule = NULL; currcp = NULL; pstate = P_NONE; } val = strchr(p, '=')+1; crit = setup_criteria(&currule, &currcp); crit->exhostspec = strdup(val); if (*(crit->exhostspec) == '%') crit->exhostspecre = compileregex(crit->exhostspec+1); firsttoken = 0; } else if ((strncasecmp(p, "SERVICE=", 8) == 0) || (strncasecmp(p, "SERVICES=", 9) == 0)) { char *val; criteria_t *crit; if (firsttoken) { flush_rule(currule); currule = NULL; currcp = NULL; pstate = P_NONE; } val = strchr(p, '=')+1; crit = setup_criteria(&currule, &currcp); crit->svcspec = strdup(val); if (*(crit->svcspec) == '%') crit->svcspecre = compileregex(crit->svcspec+1); firsttoken = 0; } else if ((strncasecmp(p, "EXSERVICE=", 10) == 0) || (strncasecmp(p, "EXSERVICES=", 11) == 0)) { char *val; criteria_t *crit; if (firsttoken) { flush_rule(currule); currule = NULL; currcp = NULL; pstate = P_NONE; } val = strchr(p, '=')+1; crit = setup_criteria(&currule, &currcp); crit->exsvcspec = strdup(val); if (*(crit->exsvcspec) == '%') crit->exsvcspecre = compileregex(crit->exsvcspec+1); firsttoken = 0; } else if (strncasecmp(p, "CLASS=", 6) == 0) { char *val; criteria_t *crit; if (firsttoken) { flush_rule(currule); currule = NULL; currcp = NULL; pstate = P_NONE; } val = strchr(p, '=')+1; crit = setup_criteria(&currule, &currcp); crit->classspec = strdup(val); if (*(crit->classspec) == '%') crit->classspecre = compileregex(crit->classspec+1); firsttoken = 0; } else if (strncasecmp(p, "EXCLASS=", 8) == 0) { char *val; criteria_t *crit; if (firsttoken) { flush_rule(currule); currule = NULL; currcp = NULL; pstate = P_NONE; } val = strchr(p, '=')+1; crit = setup_criteria(&currule, &currcp); crit->exclassspec = strdup(val); if (*(crit->exclassspec) == '%') crit->exclassspecre = compileregex(crit->exclassspec+1); firsttoken = 0; } else if (strncasecmp(p, "GROUP=", 6) == 0) { char *val; criteria_t *crit; if (firsttoken) { flush_rule(currule); currule = NULL; currcp = NULL; pstate = P_NONE; } val = strchr(p, '=')+1; crit = setup_criteria(&currule, &currcp); crit->groupspec = strdup(val); if (*(crit->groupspec) == '%') crit->groupspecre = compileregex(crit->groupspec+1); firsttoken = 0; } else if (strncasecmp(p, "EXGROUP=", 8) == 0) { char *val; criteria_t *crit; if (firsttoken) { flush_rule(currule); currule = NULL; currcp = NULL; pstate = P_NONE; } val = strchr(p, '=')+1; crit = setup_criteria(&currule, &currcp); crit->exgroupspec = strdup(val); if (*(crit->exgroupspec) == '%') crit->exgroupspecre = compileregex(crit->exgroupspec+1); firsttoken = 0; } else if ((strncasecmp(p, "COLOR=", 6) == 0) || (strncasecmp(p, "COLORS=", 7) == 0)) { criteria_t *crit; char *c1, *c2; int cval, reverse = 0; if (firsttoken) { flush_rule(currule); currule = NULL; currcp = NULL; pstate = P_NONE; } crit = setup_criteria(&currule, &currcp); /* Put a value in crit->colors so we know there is an explicit color setting */ crit->colors = (1 << 30); c1 = strchr(p, '=')+1; /* * If the first colorspec is "!color", then apply the default colors and * subtract colors from that. */ if (*c1 == '!') crit->colors |= defaultcolors; do { c2 = strchr(c1, ','); if (c2) *c2 = '\0'; if (*c1 == '!') { reverse=1; c1++; } cval = (1 << parse_color(c1)); if (reverse) crit->colors &= (~cval); else crit->colors |= cval; if (c2) c1 = (c2+1); else c1 = NULL; } while (c1); firsttoken = 0; } else if ((strncasecmp(p, "TIME=", 5) == 0) || (strncasecmp(p, "TIMES=", 6) == 0)) { char *val; criteria_t *crit; if (firsttoken) { flush_rule(currule); currule = NULL; currcp = NULL; pstate = P_NONE; } val = strchr(p, '=')+1; crit = setup_criteria(&currule, &currcp); crit->timespec = strdup(val); firsttoken = 0; } else if ((strncasecmp(p, "EXTIME=", 7) == 0) || (strncasecmp(p, "EXTIMES=", 8) == 0)) { char *val; criteria_t *crit; if (firsttoken) { flush_rule(currule); currule = NULL; currcp = NULL; pstate = P_NONE; } val = strchr(p, '=')+1; crit = setup_criteria(&currule, &currcp); crit->extimespec = strdup(val); firsttoken = 0; } else if (strncasecmp(p, "DURATION", 8) == 0) { criteria_t *crit; if (firsttoken) { flush_rule(currule); currule = NULL; currcp = NULL; pstate = P_NONE; } crit = setup_criteria(&currule, &currcp); if (*(p+8) == '>') { if (*(p+9) == '=') crit->minduration = 60*durationvalue(p+10); else crit->minduration = 60*durationvalue(p+9) + 1; } else if (*(p+8) == '<') { if (*(p+9) == '=') crit->maxduration = 60*durationvalue(p+10); else crit->maxduration = 60*durationvalue(p+9) - 1; } else errprintf("Ignoring invalid DURATION at line %d: %s\n",cfid, p); firsttoken = 0; } else if (strncasecmp(p, "RECOVERED", 9) == 0) { criteria_t *crit; if (firsttoken) { flush_rule(currule); currule = NULL; currcp = NULL; pstate = P_NONE; } crit = setup_criteria(&currule, &currcp); crit->sendrecovered = SR_WANTED; firsttoken = 0; } else if (strncasecmp(p, "NORECOVERED", 11) == 0) { criteria_t *crit; if (firsttoken) { flush_rule(currule); currule = NULL; currcp = NULL; pstate = P_NONE; } crit = setup_criteria(&currule, &currcp); crit->sendrecovered = SR_NOTWANTED; firsttoken = 0; } else if (strncasecmp(p, "NOTICE", 6) == 0) { criteria_t *crit; if (firsttoken) { flush_rule(currule); currule = NULL; currcp = NULL; pstate = P_NONE; } crit = setup_criteria(&currule, &currcp); crit->sendnotice = SR_WANTED; firsttoken = 0; } else if (strncasecmp(p, "NONOTICE", 8) == 0) { criteria_t *crit; if (firsttoken) { flush_rule(currule); currule = NULL; currcp = NULL; pstate = P_NONE; } crit = setup_criteria(&currule, &currcp); crit->sendnotice = SR_NOTWANTED; firsttoken = 0; } else if ((pstate == P_RECIP) && (strncasecmp(p, "FORMAT=", 7) == 0)) { if (!currcp) errprintf("FORMAT used without a recipient (line %d), ignored\n", cfid); else if (strcasecmp(p+7, "TEXT") == 0) currcp->format = ALERTFORM_TEXT; else if (strcasecmp(p+7, "PLAIN") == 0) currcp->format = ALERTFORM_PLAIN; else if (strcasecmp(p+7, "SMS") == 0) currcp->format = ALERTFORM_SMS; else if (strcasecmp(p+7, "PAGER") == 0) currcp->format = ALERTFORM_PAGER; else if (strcasecmp(p+7, "SCRIPT") == 0) currcp->format = ALERTFORM_SCRIPT; else errprintf("Unknown FORMAT setting '%s' ignored\n", p); firsttoken = 0; } else if ((pstate == P_RECIP) && (strncasecmp(p, "REPEAT=", 7) == 0)) { if (!currcp) errprintf("REPEAT used without a recipient (line %d), ignored\n", cfid); else currcp->interval = 60*durationvalue(p+7); firsttoken = 0; } else if ((pstate == P_RECIP) && (strcasecmp(p, "STOP") == 0)) { if (!currcp) errprintf("STOP used without a recipient (line %d), ignored\n", cfid); else currcp->stoprule = 1; firsttoken = 0; } else if ((pstate == P_RECIP) && (strcasecmp(p, "UNMATCHED") == 0)) { if (!currcp) errprintf("UNMATCHED used without a recipient (line %d), ignored\n", cfid); else currcp->unmatchedonly = 1; firsttoken = 0; } else if ((pstate == P_RECIP) && (strncasecmp(p, "NOALERT", 7) == 0)) { if (!currcp) errprintf("NOALERT used without a recipient (line %d), ignored\n", cfid); else currcp->noalerts = 1; firsttoken = 0; } else if (currule && ((strncasecmp(p, "MAIL", 4) == 0) || mailcmdactive) ) { recip_t *newrcp; mailcmdactive = 1; newrcp = (recip_t *)calloc(1, sizeof(recip_t)); newrcp->cfid = cfid; newrcp->method = M_MAIL; newrcp->format = ALERTFORM_TEXT; if (strncasecmp(p, "MAIL=", 5) == 0) { p += 5; } else if (strcasecmp(p, "MAIL") == 0) { p = strtok(NULL, " \t"); } else { /* Second recipient on a rule - do nothing */ } if (p) { newrcp->recipient = strdup(p); newrcp->interval = defaultinterval; currcp = newrcp; if (curlinerecips == NULL) curlinerecips = newrcp; pstate = P_RECIP; if (currule->recipients == NULL) currule->recipients = rcptail = newrcp; else { rcptail->next = newrcp; rcptail = newrcp; } } else { errprintf("Ignoring MAIL with no recipient at line %d\n", cfid); xfree(newrcp); } firsttoken = 0; } else if (currule && ((strncasecmp(p, "SCRIPT", 6) == 0) || scriptcmdactive)) { recip_t *newrcp; scriptcmdactive = 1; newrcp = (recip_t *)calloc(1, sizeof(recip_t)); newrcp->cfid = cfid; newrcp->method = M_SCRIPT; newrcp->format = ALERTFORM_SCRIPT; if (strncasecmp(p, "SCRIPT=", 7) == 0) { p += 7; newrcp->scriptname = strdup(p); p = strtok(NULL, " \t"); } else if (strcasecmp(p, "SCRIPT") == 0) { p = strtok(NULL, " \t"); if (p) { newrcp->scriptname = strdup(p); p = strtok(NULL, " \t"); } else { errprintf("Invalid SCRIPT command at line %d\n", cfid); } } else { /* A second recipient for the same script as the previous one */ newrcp->scriptname = strdup(currcp->scriptname); } if (p) { newrcp->recipient = strdup(p); newrcp->interval = defaultinterval; currcp = newrcp; if (curlinerecips == NULL) curlinerecips = newrcp; pstate = P_RECIP; if (currule->recipients == NULL) currule->recipients = rcptail = newrcp; else { rcptail->next = newrcp; rcptail = newrcp; } } else { errprintf("Ignoring SCRIPT with no recipient at line %d\n", cfid); if (newrcp->scriptname) xfree(newrcp->scriptname); xfree(newrcp); } firsttoken = 0; } else if (currule && (strncasecmp(p, "IGNORE", 6) == 0)) { recip_t *newrcp; newrcp = (recip_t *)calloc(1, sizeof(recip_t)); newrcp->cfid = cfid; newrcp->method = M_IGNORE; newrcp->format = ALERTFORM_NONE; newrcp->interval = defaultinterval; newrcp->stoprule = 1; currcp = newrcp; if (curlinerecips == NULL) curlinerecips = newrcp; pstate = P_RECIP; if (currule->recipients == NULL) currule->recipients = rcptail = newrcp; else { rcptail->next = newrcp; rcptail = newrcp; } firsttoken = 0; } else { errprintf("Ignored unknown/unexpected token '%s' at line %d\n", p, cfid); } if (p) p = strtok(NULL, " \t"); } if (curlinerecips && currcp && (curlinerecips != currcp)) { /* We have multiple recipients on one line. Make sure criteria etc. get copied */ recip_t *rwalk; /* All criteria etc. have been set on the last recipient (currcp) */ for (rwalk = curlinerecips; (rwalk != currcp); rwalk = rwalk->next) { rwalk->format = currcp->format; rwalk->interval = currcp->interval; rwalk->criteria = currcp->criteria; rwalk->noalerts = currcp->noalerts; } } } flush_rule(currule); stackfclose(fd); freestrbuffer(inbuf); MEMUNDEFINE(cfline); MEMUNDEFINE(fn); return 1; } static void dump_criteria(criteria_t *crit, int isrecip) { if (crit->pagespec) printf("PAGE=%s ", crit->pagespec); if (crit->expagespec) printf("EXPAGE=%s ", crit->expagespec); if (crit->dgspec) printf("DISPLAYGROUP=%s ", crit->dgspec); if (crit->exdgspec) printf("EXDISPLAYGROUP=%s ", crit->exdgspec); if (crit->hostspec) printf("HOST=%s ", crit->hostspec); if (crit->exhostspec) printf("EXHOST=%s ", crit->exhostspec); if (crit->svcspec) printf("SERVICE=%s ", crit->svcspec); if (crit->exsvcspec) printf("EXSERVICE=%s ", crit->exsvcspec); if (crit->classspec) printf("CLASS=%s ", crit->classspec); if (crit->exclassspec) printf("EXCLASS=%s ", crit->exclassspec); if (crit->groupspec) printf("GROUP=%s ", crit->groupspec); if (crit->exgroupspec) printf("EXGROUP=%s ", crit->exgroupspec); if (crit->colors) { int i, first = 1; printf("COLOR="); for (i = 0; (i < COL_COUNT); i++) { if ((1 << i) & crit->colors) { dbgprintf("first=%d, i=%d\n", first, i); printf("%s%s", (first ? "" : ","), colorname(i)); first = 0; } } printf(" "); } if (crit->timespec) printf("TIME=%s ", crit->timespec); if (crit->extimespec) printf("EXTIME=%s ", crit->extimespec); if (crit->minduration) printf("DURATION>%d ", (crit->minduration / 60)); if (crit->maxduration) printf("DURATION<%d ", (crit->maxduration / 60)); if (isrecip) { switch (crit->sendrecovered) { case SR_UNKNOWN: break; case SR_WANTED: printf("RECOVERED "); break; case SR_NOTWANTED: printf("NORECOVERED "); break; } switch (crit->sendnotice) { case SR_UNKNOWN: break; case SR_WANTED: printf("NOTICE "); break; case SR_NOTWANTED: printf("NONOTICE "); break; } } } void dump_alertconfig(int showlines) { rule_t *rulewalk; recip_t *recipwalk; for (rulewalk = rulehead; (rulewalk); rulewalk = rulewalk->next) { if (showlines) printf("%5d\t", rulewalk->cfid); dump_criteria(rulewalk->criteria, 0); printf("\n"); for (recipwalk = rulewalk->recipients; (recipwalk); recipwalk = recipwalk->next) { printf("\t"); switch (recipwalk->method) { case M_MAIL : printf("MAIL %s ", recipwalk->recipient); break; case M_SCRIPT : printf("SCRIPT %s %s ", recipwalk->scriptname, recipwalk->recipient); break; case M_IGNORE : printf("IGNORE "); break; } switch (recipwalk->format) { case ALERTFORM_TEXT : printf("FORMAT=TEXT "); break; case ALERTFORM_PLAIN : printf("FORMAT=PLAIN "); break; case ALERTFORM_SMS : printf("FORMAT=SMS "); break; case ALERTFORM_PAGER : printf("FORMAT=PAGER "); break; case ALERTFORM_SCRIPT: printf("FORMAT=SCRIPT "); break; case ALERTFORM_NONE : break; } printf("REPEAT=%d ", (int)(recipwalk->interval / 60)); if (recipwalk->criteria) dump_criteria(recipwalk->criteria, 1); if (recipwalk->unmatchedonly) printf("UNMATCHED "); if (recipwalk->stoprule) printf("STOP "); if (recipwalk->noalerts) printf("NOALERT "); printf("\n"); } printf("\n"); } } int stoprulefound = 0; static int criteriamatch(activealerts_t *alert, criteria_t *crit, criteria_t *rulecrit, int *anymatch, time_t *nexttime) { /* * See if the "crit" matches the "alert". * Match on pagespec, dgspec, hostspec, svcspec, classspec, groupspec, colors, timespec, extimespec, minduration, maxduration, sendrecovered */ static char *pgnames = NULL; const char *dgname = NULL; int pgmatchres, pgexclres; time_t duration = (getcurrenttime(NULL) - alert->eventstart); int result, cfid = 0; char *pgtok, *cfline = NULL; void *hinfo = hostinfo(alert->hostname); if (!hinfo) { logprintf("Checking criteria for host '%s', which is not yet defined; some alerts may not immediately fire\n", alert->hostname); if (localalertmode) hinfo = localhostinfo(alert->hostname); }; /* The top-level page needs a name - cannot match against an empty string */ if (pgnames) xfree(pgnames); pgnames = strdup((*alert->location == '\0') ? "/" : alert->location); dgname = hinfo ? textornull(xmh_item(hinfo, XMH_DGNAME)) : strdup(""); if (crit) { cfid = crit->cfid; cfline = crit->cfline; } if (!cfid && rulecrit) cfid = rulecrit->cfid; if (!cfline && rulecrit) cfline = rulecrit->cfline; if (!cfline) cfline = ""; traceprintf("Matching host:service:dgroup:page '%s:%s:%s:%s' against rule line %d\n", alert->hostname, alert->testname, dgname, alert->location, cfid); if (alert->state == A_PAGING) { /* Check max-duration now - it's fast and easy. */ if (crit && crit->maxduration && (duration > crit->maxduration)) { traceprintf("Failed '%s' (max. duration %d>%d)\n", cfline, duration, crit->maxduration); if (!printmode) return 0; } } if (crit && crit->classspec && !namematch(alert->classname, crit->classspec, crit->classspecre)) { traceprintf("Failed '%s' (class not in include list)\n", cfline); return 0; } if (crit && crit->exclassspec && namematch(alert->classname, crit->exclassspec, crit->exclassspecre)) { traceprintf("Failed '%s' (class excluded)\n", cfline); return 0; } /* alert->groups is a comma-separated list of groups, so it needs some special handling */ /* * NB: Don't check groups when RECOVERED - the group list for recovery messages is always empty. * It doesn't matter if we match a recipient who was not in the group that originally * got the alert - we will later check who has received the alert, and only those that * have will get the recovery message. */ if (crit && (crit->groupspec || crit->exgroupspec) && (alert->state != A_RECOVERED)) { char *grouplist; char *tokptr; grouplist = (alert->groups && (*(alert->groups))) ? strdup(alert->groups) : NULL; if (crit->groupspec) { char *onegroup; int iswanted = 0; if (grouplist) { /* There is a group label on the alert, so it must match */ onegroup = strtok_r(grouplist, ",", &tokptr); while (onegroup && !iswanted) { iswanted = (namematch(onegroup, crit->groupspec, crit->groupspecre)); onegroup = strtok_r(NULL, ",", &tokptr); } } if (!iswanted) { /* * Either the alert had a group list that didn't match, or * there was no group list and the rule listed one. * In both cases, it's a failed match. */ traceprintf("Failed '%s' (group not in include list)\n", cfline); if (grouplist) xfree(grouplist); return 0; } } if (crit->exgroupspec && grouplist) { char *onegroup; /* Excluded groups are only handled when the alert does have a group list */ strcpy(grouplist, alert->groups); /* Might have been used in the include list */ onegroup = strtok_r(grouplist, ",", &tokptr); while (onegroup) { if (namematch(onegroup, crit->exgroupspec, crit->exgroupspecre)) { traceprintf("Failed '%s' (group excluded)\n", cfline); xfree(grouplist); return 0; } onegroup = strtok_r(NULL, ",", &tokptr); } } if (grouplist) xfree(grouplist); } pgmatchres = pgexclres = -1; pgtok = strtok(pgnames, ","); while (pgtok) { if (crit && crit->pagespec && (pgmatchres != 1)) pgmatchres = (namematch(pgtok, crit->pagespec, crit->pagespecre) ? 1 : 0); if (crit && crit->expagespec && (pgexclres != 1)) pgexclres = (namematch(pgtok, crit->expagespec, crit->expagespecre) ? 1 : 0); pgtok = strtok(NULL, ","); } if (pgexclres == 1) { traceprintf("Failed '%s' (pagename excluded)\n", cfline); return 0; } if (pgmatchres == 0) { traceprintf("Failed '%s' (pagename not in include list)\n", cfline); return 0; } if (crit && crit->dgspec && !namematch(dgname, crit->dgspec, crit->dgspecre)) { traceprintf("Failed '%s' (displaygroup not in include list)\n", cfline); return 0; } if (crit && crit->exdgspec && namematch(dgname, crit->exdgspec, crit->exdgspecre)) { traceprintf("Failed '%s' (displaygroup excluded)\n", cfline); return 0; } if (crit && crit->hostspec && !namematch(alert->hostname, crit->hostspec, crit->hostspecre)) { traceprintf("Failed '%s' (hostname not in include list)\n", cfline); return 0; } if (crit && crit->exhostspec && namematch(alert->hostname, crit->exhostspec, crit->exhostspecre)) { traceprintf("Failed '%s' (hostname excluded)\n", cfline); return 0; } if (crit && crit->svcspec && !namematch(alert->testname, crit->svcspec, crit->svcspecre)) { traceprintf("Failed '%s' (service not in include list)\n", cfline); return 0; } if (crit && crit->exsvcspec && namematch(alert->testname, crit->exsvcspec, crit->exsvcspecre)) { traceprintf("Failed '%s' (service excluded)\n", cfline); return 0; } if (alert->state == A_NOTIFY) { /* * Don't do the check until we are checking individual recipients (rulecrit is set). * You don't need to have NOTICE on the top-level rule, it's enough if a recipient * has it set. However, we do want to allow there to be a default defined in the * rule; but it doesn't take effect until we start checking the recipients. */ if (rulecrit) { int n = (crit ? crit->sendnotice : -1); traceprintf("Checking NOTICE setting %d (rule:%d)\n", n, rulecrit->sendnotice); if (crit && (crit->sendnotice == SR_NOTWANTED)) result = 0; /* Explicit NONOTICE */ else if (crit && (crit->sendnotice == SR_WANTED)) result = 1; /* Explicit NOTICE */ else result = (rulecrit->sendnotice == SR_WANTED); /* Not set, but rule has NOTICE */ } else { result = 1; } if (!result) traceprintf("Failed '%s' (notice not wanted)\n", cfline); return result; } /* At this point, we know the configuration may result in an alert. */ if (anymatch) (*anymatch)++; /* * Duration checks should be done on real paging messages only. * Not on recovery- or notify-messages. */ if (alert->state == A_PAGING) { if (crit && crit->minduration && (duration < crit->minduration)) { if (nexttime) { time_t mynext = alert->eventstart + crit->minduration; if ((*nexttime == -1) || (*nexttime > mynext)) *nexttime = mynext; } traceprintf("Failed '%s' (min. duration %d<%d)\n", cfline, duration, crit->minduration); if (!printmode) return 0; } } /* * Time restrictions apply to ALL messages. * Before 4.2, these were only applied to ALERT messages, * not RECOVERED and NOTIFY messages. This caused some * unfortunate alerts in the middle of the night because * some random system recovered ... not good. So apply * this check to all messages. */ if (crit && ((!hinfo) || ( (crit->timespec && !timematch(xmh_item(hinfo, XMH_HOLIDAYS), crit->timespec)) || (crit->extimespec && timematch(xmh_item(hinfo, XMH_HOLIDAYS), crit->extimespec)) ) ) ) { /* Try again in a minute */ if (nexttime) *nexttime = getcurrenttime(NULL) + 60; traceprintf("Failed '%s' (time/extime criteria)\n", cfline); if (!printmode) return 0; } /* Check color. For RECOVERED messages, this holds the color of the alert, not the recovery state */ if (crit && crit->colors) { result = (((1 << alert->color) & crit->colors) != 0); if (printmode) return 1; } else { result = (((1 << alert->color) & defaultcolors) != 0); if (printmode) return 1; } if (!result) { traceprintf("Failed '%s' (color)\n", cfline); return result; } if ((alert->state == A_RECOVERED) || (alert->state == A_DISABLED)) { /* * Don't do the check until we are checking individual recipients (rulecrit is set). * You don't need to have RECOVERED on the top-level rule, it's enough if a recipient * has it set. However, we do want to allow there to be a default defined in the * rule; but it doesn't take effect until we start checking the recipients. */ if (rulecrit) { int n = (crit ? crit->sendrecovered : -1); traceprintf("Checking recovered setting %d (rule:%d)\n", n, rulecrit->sendrecovered); if (crit && (crit->sendrecovered == SR_NOTWANTED)) result = 0; /* Explicit NORECOVERED */ else if (crit && (crit->sendrecovered == SR_WANTED)) result = 1; /* Explicit RECOVERED */ else result = (rulecrit->sendrecovered == SR_WANTED); /* Not set, but rule has RECOVERED */ } else { result = 1; } if (printmode) return result; } if (result) { traceprintf("*** Match with '%s' ***\n", cfline); } return result; } recip_t *next_recipient(activealerts_t *alert, int *first, int *anymatch, time_t *nexttime) { static rule_t *rulewalk = NULL; static recip_t *recipwalk = NULL; if (anymatch) *anymatch = 0; do { if (*first) { /* Start at beginning of rules-list and find the first matching rule. */ *first = 0; rulewalk = rulehead; while (rulewalk && !criteriamatch(alert, rulewalk->criteria, NULL, NULL, NULL)) rulewalk = rulewalk->next; if (rulewalk) { /* Point recipwalk at the list of possible candidates */ dbgprintf("Found a first matching rule\n"); recipwalk = rulewalk->recipients; } else { /* No matching rules */ dbgprintf("Found no first matching rule\n"); recipwalk = NULL; } } else { if (!recipwalk) { /* Should not happen! */ } else if (recipwalk->next) { /* Check the next recipient in the current rule */ recipwalk = recipwalk->next; } else { /* End of recipients in current rule. Go to the next matching rule */ do { rulewalk = rulewalk->next; } while (rulewalk && !criteriamatch(alert, rulewalk->criteria, NULL, NULL, NULL)); if (rulewalk) { /* Point recipwalk at the list of possible candidates */ dbgprintf("Found a secondary matching rule\n"); recipwalk = rulewalk->recipients; } else { /* No matching rules */ dbgprintf("No more secondary matching rule\n"); recipwalk = NULL; } } } } while (rulewalk && recipwalk && !criteriamatch(alert, recipwalk->criteria, rulewalk->criteria, anymatch, nexttime)); stoprulefound = (recipwalk && recipwalk->stoprule); printrule = rulewalk; return recipwalk; } int have_recipient(activealerts_t *alert, int *anymatch) { int first = 1; return (next_recipient(alert, &first, anymatch, NULL) != NULL); } void alert_printmode(int on) { printmode = on; } void print_alert_recipients(activealerts_t *alert, strbuffer_t *buf) { char *normalfont = "COLOR=\"#FFFFCC\" FACE=\"Tahoma, Arial, Helvetica\""; char *stopfont = "COLOR=\"#33ebf4\" FACE=\"Tahoma, Arial, Helvetica\""; int first = 1; recip_t *recip; char l[4096]; int count = 0; char *p, *fontspec; char codes[20]; MEMDEFINE(l); MEMDEFINE(codes); if (printmode == 2) { /* For print-out usage - e.g. confreport.cgi */ normalfont = "COLOR=\"#000000\" FACE=\"Tahoma, Arial, Helvetica\""; stopfont = "COLOR=\"#FF0000\" FACE=\"Tahoma, Arial, Helvetica\""; } fontspec = normalfont; stoprulefound = 0; while ((recip = next_recipient(alert, &first, NULL, NULL)) != NULL) { int mindur = 0, maxdur = INT_MAX; char *timespec = NULL; char *extimespec = NULL; int colors = defaultcolors; int i, firstcolor = 1; int recovered = 0, notice = 0; count++; addtobuffer(buf, ""); if (count == 1) { sprintf(l, "%s", alert->testname); addtobuffer(buf, l); } /* * The min/max duration of an alert can be controlled by both the actual rule, * and by the recipient specification. * The rule must be fulfilled before the recipient even gets into play, so * if there is a min/max duration on the rule then this becomes the default * and recipient-specific settings can only increase the minduration/decrease * the maxduration. * On the other hand, if there is no rule-setting then the recipient-specific * settings determine everything. */ if (printrule->criteria && printrule->criteria->minduration) mindur = printrule->criteria->minduration; if (recip->criteria && recip->criteria->minduration && (recip->criteria->minduration > mindur)) mindur = recip->criteria->minduration; if (printrule->criteria && printrule->criteria->maxduration) maxdur = printrule->criteria->maxduration; if (recip->criteria && recip->criteria->maxduration && (recip->criteria->maxduration < maxdur)) maxdur = recip->criteria->maxduration; if (printrule->criteria && printrule->criteria->timespec) timespec = printrule->criteria->timespec; if (printrule->criteria && printrule->criteria->extimespec) extimespec = printrule->criteria->extimespec; if (recip->criteria && recip->criteria->timespec) { if (timespec == NULL) timespec = recip->criteria->timespec; else errprintf("Cannot handle nested timespecs yet\n"); } if (recip->criteria && recip->criteria->extimespec) { if (extimespec == NULL) extimespec = recip->criteria->extimespec; else errprintf("Cannot handle nested extimespecs yet\n"); } if (printrule->criteria && printrule->criteria->colors) colors = (colors & printrule->criteria->colors); if (recip->criteria && recip->criteria->colors) colors = (colors & recip->criteria->colors); /* * Recoveries are sent if * - there are no recipient criteria, and the rule says yes; * - the recipient criteria does not have a RECOVERED setting, and the rule says yes; * - the recipient criteria says yes. */ if ( (!recip->criteria && printrule->criteria && (printrule->criteria->sendrecovered == SR_WANTED)) || (recip->criteria && (printrule->criteria->sendrecovered == SR_WANTED) && (recip->criteria->sendrecovered == SR_UNKNOWN)) || (recip->criteria && (recip->criteria->sendrecovered == SR_WANTED)) ) recovered = 1; if ( (!recip->criteria && printrule->criteria && (printrule->criteria->sendnotice == SR_WANTED)) || (recip->criteria && (printrule->criteria->sendnotice == SR_WANTED) && (recip->criteria->sendnotice == SR_UNKNOWN)) || (recip->criteria && (recip->criteria->sendnotice == SR_WANTED)) ) notice = 1; *codes = '\0'; if (recip->method == M_IGNORE) { recip->recipient = "-- ignored --"; } if (recip->noalerts) { if (strlen(codes)) strcat(codes, ",A"); else strcat(codes, "-A"); } if (recovered && !recip->noalerts) { if (strlen(codes)) strcat(codes, ",R"); else strcat(codes, "R"); } if (notice) { if (strlen(codes)) strcat(codes, ",N"); else strcat(codes, "N"); } if (recip->stoprule) { if (strlen(codes)) strcat(codes, ",S"); else strcat(codes, "S"); } if (recip->unmatchedonly) { if (strlen(codes)) strcat(codes, ",U"); else strcat(codes, "U"); } if (strlen(codes) == 0) sprintf(l, "%s", fontspec, recip->recipient); else sprintf(l, "%s (%s)", fontspec, recip->recipient, codes); addtobuffer(buf, l); sprintf(l, "%s", durationstring(mindur)); addtobuffer(buf, l); /* maxdur=INT_MAX means "no max duration". So set it to 0 for durationstring() to do the right thing */ if (maxdur == INT_MAX) maxdur = 0; sprintf(l, "%s", durationstring(maxdur)); addtobuffer(buf, l); sprintf(l, "%s", durationstring(recip->interval)); addtobuffer(buf, l); if (timespec && extimespec) sprintf(l, "%s, except %s", timespec, extimespec); else if (timespec) sprintf(l, "%s", timespec); else if (extimespec) sprintf(l, "all, except %s", extimespec); else strcpy(l, "-"); addtobuffer(buf, l); addtobuffer(buf, ""); for (i = 0; (i < COL_COUNT); i++) { if ((1 << i) & colors) { sprintf(l, "%s%s", (firstcolor ? "" : ","), colorname(i)); addtobuffer(buf, l); firstcolor = 0; } } addtobuffer(buf, ""); if (stoprulefound) fontspec = stopfont; addtobuffer(buf, "\n"); } /* This is hackish - patch up the "rowspan" value, so it matches the number of recipient lines */ sprintf(l, "%d ", count); p = strstr(STRBUF(buf), "rowspan=###"); if (p) { p += strlen("rowspan="); memcpy(p, l, 3); } MEMUNDEFINE(l); MEMUNDEFINE(codes); } xymon-4.3.28/lib/loadhosts_file.c0000664000076400007640000003334512173472453017143 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module for Xymon, responsible for loading the hosts.cfg */ /* file and keeping track of what hosts are known, their aliases and planned */ /* downtime settings etc. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid_file[] = "$Id: loadhosts_file.c 7204 2013-07-23 12:20:59Z storner $"; static int get_page_name_title(char *buf, char *key, char **name, char **title) { *name = *title = NULL; *name = buf + strlen(key); *name += strspn(*name, " \t\r\n"); if (strlen(*name) > 0) { /* (*name) now points at the start of the name. Find end of name */ *title = *name; *title += strcspn(*title, " \t\r\n"); /* Null-terminate the name */ **title = '\0'; (*title)++; *title += strspn(*title, " \t\r\n"); return 0; } return 1; } static int pagematch(pagelist_t *pg, char *name) { char *p = strrchr(pg->pagepath, '/'); if (p) { return (strcmp(p+1, name) == 0); } else { return (strcmp(pg->pagepath, name) == 0); } } static strbuffer_t *contentbuffer = NULL; static int prepare_fromfile(char *hostsfn, char *extrainclude) { static void *hostfiles = NULL; FILE *hosts; strbuffer_t *inbuf; /* First check if there were no modifications at all */ if (hostfiles) { if (!stackfmodified(hostfiles)){ return 1; } else { stackfclist(&hostfiles); hostfiles = NULL; } } if (!contentbuffer) contentbuffer = newstrbuffer(0); clearstrbuffer(contentbuffer); hosts = stackfopen(hostsfn, "r", &hostfiles); if (hosts == NULL) return -1; inbuf = newstrbuffer(20480); while (stackfgets(inbuf, extrainclude)) { sanitize_input(inbuf, 0, 0); addtostrbuffer(contentbuffer, inbuf); addtobuffer(contentbuffer, "\n"); } stackfclose(hosts); freestrbuffer(inbuf); return 0; } static int prepare_fromnet(void) { static char contentmd5[33] = { '\0', }; sendreturn_t *sres; sendresult_t sendstat; char *fdata, *fhash; sres = newsendreturnbuf(1, NULL); sendstat = sendmessage("config hosts.cfg", NULL, XYMON_TIMEOUT, sres); if (sendstat != XYMONSEND_OK) { freesendreturnbuf(sres); errprintf("Cannot load hosts.cfg from xymond, code %d\n", sendstat); return -1; } fdata = getsendreturnstr(sres, 1); freesendreturnbuf(sres); fhash = md5hash(fdata); if (strcmp(contentmd5, fhash) == 0) { /* No changes */ xfree(fdata); return 1; } if (contentbuffer) freestrbuffer(contentbuffer); contentbuffer = convertstrbuffer(fdata, 0); strcpy(contentmd5, fhash); return 0; } char *hostscfg_content(void) { return strdup(STRBUF(contentbuffer)); } int load_hostnames(char *hostsfn, char *extrainclude, int fqdn) { /* Return value: 0 for load OK, 1 for "No files changed since last load", -1 for error (file not found) */ int prepresult; int ip1, ip2, ip3, ip4, groupid, pageidx; char hostname[4096], *dgname; pagelist_t *curtoppage, *curpage, *pgtail; void * htree; char *cfgdata, *inbol, *ineol, insavchar = '\0'; load_hostinfo(NULL); if (*hostsfn == '!') prepresult = prepare_fromfile(hostsfn+1, extrainclude); else if (extrainclude) prepresult = prepare_fromfile(hostsfn, extrainclude); else if ((*hostsfn == '@') || (strcmp(hostsfn, xgetenv("HOSTSCFG")) == 0)) { prepresult = prepare_fromnet(); if (prepresult == -1) { errprintf("Failed to load from xymond, reverting to file-load\n"); prepresult = prepare_fromfile(xgetenv("HOSTSCFG"), extrainclude); } } else prepresult = prepare_fromfile(hostsfn, extrainclude); /* Did we get the data ? */ if (prepresult == -1) { errprintf("Cannot load host data\n"); return -1; } /* Any modifications at all ? */ if (prepresult == 1) { dbgprintf("No files modified, skipping reload of %s\n", hostsfn); return 1; } MEMDEFINE(hostname); MEMDEFINE(l); configloaded = 1; initialize_hostlist(); curpage = curtoppage = pgtail = pghead; pageidx = groupid = 0; dgname = NULL; htree = xtreeNew(strcasecmp); inbol = cfgdata = hostscfg_content(); while (inbol && *inbol) { inbol += strspn(inbol, " \t"); ineol = strchr(inbol, '\n'); if (ineol) { while ((ineol > inbol) && (isspace(*ineol) || (*ineol == '\n'))) ineol--; if (*ineol != '\n') ineol++; insavchar = *ineol; *ineol = '\0'; } /* Strip out initial "v" for vpage/vsubpage/vsubparent -- we don't care about the difference here */ if ((strncmp(inbol, "vpage", 5) == 0) || (strncmp(inbol, "vsubpage", 8) == 0) || (strncmp(inbol, "vsubparent", 10) == 0)) inbol++; if (strncmp(inbol, "page", 4) == 0) { pagelist_t *newp; char *name, *title; pageidx = groupid = 0; if (dgname) xfree(dgname); dgname = NULL; if (get_page_name_title(inbol, "page", &name, &title) == 0) { newp = (pagelist_t *)malloc(sizeof(pagelist_t)); newp->pagepath = strdup(name); newp->pagetitle = (title ? strdup(title) : NULL); newp->next = NULL; pgtail->next = newp; pgtail = newp; curpage = curtoppage = newp; } } else if (strncmp(inbol, "subpage", 7) == 0) { pagelist_t *newp; char *name, *title; pageidx = groupid = 0; if (dgname) xfree(dgname); dgname = NULL; if (get_page_name_title(inbol, "subpage", &name, &title) == 0) { newp = (pagelist_t *)malloc(sizeof(pagelist_t)); newp->pagepath = malloc(strlen(curtoppage->pagepath) + strlen(name) + 2); sprintf(newp->pagepath, "%s/%s", curtoppage->pagepath, name); newp->pagetitle = malloc(strlen(curtoppage->pagetitle) + strlen(title) + 2); sprintf(newp->pagetitle, "%s/%s", curtoppage->pagetitle, title); newp->next = NULL; pgtail->next = newp; pgtail = newp; curpage = newp; } } else if (strncmp(inbol, "subparent", 9) == 0) { pagelist_t *newp, *parent; char *pname, *name, *title; pageidx = groupid = 0; if (dgname) xfree(dgname); dgname = NULL; parent = NULL; if (get_page_name_title(inbol, "subparent", &pname, &title) == 0) { for (parent = pghead; (parent && !pagematch(parent, pname)); parent = parent->next); } if (parent && (get_page_name_title(title, "", &name, &title) == 0)) { newp = (pagelist_t *)malloc(sizeof(pagelist_t)); newp->pagepath = malloc(strlen(parent->pagepath) + strlen(name) + 2); sprintf(newp->pagepath, "%s/%s", parent->pagepath, name); newp->pagetitle = malloc(strlen(parent->pagetitle) + strlen(title) + 2); sprintf(newp->pagetitle, "%s/%s", parent->pagetitle, title); newp->next = NULL; pgtail->next = newp; pgtail = newp; curpage = newp; } } else if (strncmp(inbol, "group", 5) == 0) { char *tok; groupid++; if (dgname) xfree(dgname); dgname = NULL; tok = strtok(inbol, " \t"); if ((strcmp(tok, "group-only") == 0) || (strcmp(tok, "group-except") == 0)) { tok = strtok(NULL, " \t"); } if (tok) tok = strtok(NULL, "\r\n"); if (tok) { char *inp; /* Strip HTML tags from the string */ dgname = (char *)malloc(strlen(tok) + 1); *dgname = '\0'; inp = tok; while (*inp) { char *tagstart, *tagend; tagstart = strchr(inp, '<'); if (tagstart) { tagend = strchr(tagstart, '>'); *tagstart = '\0'; if (*inp) strcat(dgname, inp); if (tagend) { inp = tagend+1; } else { /* Unmatched '<', keep all of the string */ *tagstart = '<'; strcat(dgname, tagstart); inp += strlen(inp); } } else { strcat(dgname, inp); inp += strlen(inp); } } } } else if (sscanf(inbol, "%d.%d.%d.%d %s", &ip1, &ip2, &ip3, &ip4, hostname) == 5) { char *startoftags, *tag, *delim; int elemidx, elemsize; char groupidstr[10]; xtreePos_t handle; namelist_t *newitem; if ( (ip1 < 0) || (ip1 > 255) || (ip2 < 0) || (ip2 > 255) || (ip3 < 0) || (ip3 > 255) || (ip4 < 0) || (ip4 > 255)) { errprintf("Invalid IPv4-address for host %s (nibble outside 0-255 range): %d.%d.%d.%d\n", hostname, ip1, ip2, ip3, ip4); goto nextline; } newitem = calloc(1, sizeof(namelist_t)); /* Hostname beginning with '@' are "no-display" hosts. But we still want them. */ if (*hostname == '@') memmove(hostname, hostname+1, strlen(hostname)); if (!fqdn) { /* Strip any domain from the hostname */ char *p = strchr(hostname, '.'); if (p) *p = '\0'; } sprintf(newitem->ip, "%d.%d.%d.%d", ip1, ip2, ip3, ip4); sprintf(groupidstr, "%d", groupid); newitem->groupid = strdup(groupidstr); newitem->dgname = (dgname ? strdup(dgname) : strdup("NONE")); newitem->pageindex = pageidx++; newitem->hostname = strdup(hostname); if (ip1 || ip2 || ip3 || ip4) newitem->preference = 1; else newitem->preference = 0; newitem->logname = strdup(newitem->hostname); { char *p = newitem->logname; while ((p = strchr(p, '.')) != NULL) { *p = '_'; } } newitem->page = curpage; newitem->defaulthost = defaulthost; startoftags = strchr(inbol, '#'); if (startoftags == NULL) startoftags = ""; else startoftags++; startoftags += strspn(startoftags, " \t\r\n"); newitem->allelems = strdup(startoftags); elemsize = 5; newitem->elems = (char **)malloc((elemsize+1)*sizeof(char *)); tag = newitem->allelems; elemidx = 0; while (tag && *tag) { if (elemidx == elemsize) { elemsize += 5; newitem->elems = (char **)realloc(newitem->elems, (elemsize+1)*sizeof(char *)); } newitem->elems[elemidx] = tag; /* Skip until we hit a whitespace or a quote */ tag += strcspn(tag, " \t\r\n\""); if (*tag == '"') { delim = tag; /* Hit a quote - skip until the next matching quote */ tag = strchr(tag+1, '"'); if (tag != NULL) { /* Found end-quote, NULL the item here and move on */ *tag = '\0'; tag++; } /* Now move quoted data one byte down (including the NUL) to kill quotechar */ memmove(delim, delim+1, strlen(delim)); } else if (*tag) { /* Normal end of item, NULL it and move on */ *tag = '\0'; tag++; } else { /* End of line - no more to do. */ tag = NULL; } /* * If we find a "noconn", drop preference value to 0. * If we find a "prefer", up reference value to 2. */ if ((newitem->preference == 1) && (strcmp(newitem->elems[elemidx], "noconn") == 0)) newitem->preference = 0; else if (strcmp(newitem->elems[elemidx], "prefer") == 0) newitem->preference = 2; /* Skip whitespace until start of next tag */ if (tag) tag += strspn(tag, " \t\r\n"); elemidx++; } newitem->elems[elemidx] = NULL; /* See if this host is defined before */ handle = xtreeFind(htree, newitem->hostname); if (strcasecmp(newitem->hostname, ".default.") == 0) { /* The pseudo DEFAULT host */ newitem->next = newitem->prev = NULL; defaulthost = newitem; } else if (handle == xtreeEnd(htree)) { /* New item, so add to end of list */ newitem->prev = nametail; newitem->next = NULL; if (namehead == NULL) namehead = nametail = newitem; else { nametail->next = newitem; nametail = newitem; } xtreeAdd(htree, newitem->hostname, newitem); } else { namelist_t *existingrec = (namelist_t *)xtreeData(htree, handle); if (newitem->preference <= existingrec->preference) { /* Add after the existing (more preferred) entry */ newitem->next = existingrec->next; /* NB: existingrec may be the end of the list, so existingrec->next can be NULL */ if (newitem->next) newitem->next->prev = newitem; existingrec->next = newitem; newitem->prev = existingrec; if (newitem->next == NULL) nametail = newitem; } else { /* New item has higher preference, so add before the current item (i.e. after existingrec->prev) */ if (existingrec->prev == NULL) { newitem->next = namehead; namehead = newitem; } else { newitem->prev = existingrec->prev; newitem->next = existingrec; existingrec->prev = newitem; newitem->prev->next = newitem; } } } newitem->clientname = xmh_find_item(newitem, XMH_CLIENTALIAS); if (newitem->clientname == NULL) newitem->clientname = newitem->hostname; newitem->downtime = xmh_find_item(newitem, XMH_DOWNTIME); #ifdef DEBUG { namelist_t *walk; int err = 0; for (walk = namehead; (walk && !err); walk = walk->next) { // printf("%s %s %s\n", walk->hostname, (walk->next ? walk->next->hostname: ""), (walk->prev ? walk->prev->hostname : "")); if (walk->next && (walk->next->prev != walk)) { printf("*** ERROR: next->prev is not self\n"); err = 1; } if (!walk->next && (walk != nametail)) { printf("*** ERROR: No next element, but nametail is different\n"); err = 1; } if (!walk->prev && (walk != namehead)) { printf("*** ERROR: No prev element, but namehead is different\n"); err = 1; } } if (err) printf("Error\n"); } #endif } nextline: if (ineol) { *ineol = insavchar; if (*ineol != '\n') ineol = strchr(ineol, '\n'); inbol = (ineol ? ineol+1 : NULL); } else inbol = NULL; } xfree(cfgdata); if (dgname) xfree(dgname); xtreeDestroy(htree); MEMUNDEFINE(hostname); MEMUNDEFINE(l); build_hosttree(); return 0; } xymon-4.3.28/lib/netservices.h0000664000076400007640000000242611615341300016461 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __NETSERVICES_H__ #define __NETSERVICES_H__ /* * Flag bits for known TCP services */ #define TCP_GET_BANNER 0x0001 #define TCP_TELNET 0x0002 #define TCP_SSL 0x0004 #define TCP_HTTP 0x0008 typedef struct svcinfo_t { char *svcname; unsigned char *sendtxt; int sendlen; unsigned char *exptext; int expofs, explen; unsigned int flags; int port; } svcinfo_t; extern char *init_tcp_services(void); extern void dump_tcp_services(void); extern int default_tcp_port(char *svcname); extern svcinfo_t *find_tcp_service(char *svcname); #endif xymon-4.3.28/lib/eventlog.h0000664000076400007640000000413411615341300015750 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __EVENTLOG_H_ #define __EVENTLOG_H_ /* Format of records in the $XYMONHISTDIR/allevents file */ typedef struct event_t { void *host; struct htnames_t *service; time_t eventtime; time_t changetime; time_t duration; int newcolor; /* stored as "re", "ye", "gr" etc. */ int oldcolor; int state; /* 2=escalated, 1=recovered, 0=no change */ struct event_t *next; } event_t; typedef struct eventcount_t { struct htnames_t *service; unsigned long count; struct eventcount_t *next; } eventcount_t; typedef struct countlist_t { void *src; /* May be a pointer to a host or a service */ unsigned long total; struct countlist_t *next; } countlist_t; typedef enum { XYMON_S_NONE, XYMON_S_HOST_BREAKDOWN, XYMON_S_SERVICE_BREAKDOWN } eventsummary_t; typedef enum { XYMON_COUNT_NONE, XYMON_COUNT_EVENTS, XYMON_COUNT_DURATION } countsummary_t; typedef int (*f_hostcheck)(char *hostname); extern char *eventignorecolumns; extern int havedoneeventlog; extern void do_eventlog(FILE *output, int maxcount, int maxminutes, char *fromtime, char *totime, char *pagematch, char *expagematch, char *hostmatch, char *exhostmatch, char *testmatch, char *extestmatch, char *colormatch, int ignoredialups, f_hostcheck hostcheck, event_t **eventlist, countlist_t **hostcounts, countlist_t **servicecounts, countsummary_t counttype, eventsummary_t sumtype, char *periodstring); #endif xymon-4.3.28/lib/headfoot.c0000664000076400007640000013635112656201271015730 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains routines for handling header- and footer-files. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: headfoot.c 7892 2016-02-08 21:03:53Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" #include "version.h" /* Stuff for headfoot - variables we can set dynamically */ static char *hostenv_hikey = NULL; static char *hostenv_host = NULL; static char *hostenv_ip = NULL; static char *hostenv_svc = NULL; static char *hostenv_color = NULL; static char *hostenv_pagepath = NULL; static time_t hostenv_reportstart = 0; static time_t hostenv_reportend = 0; static char *hostenv_repwarn = NULL; static char *hostenv_reppanic = NULL; static time_t hostenv_snapshot = 0; static char *hostenv_logtime = NULL; static char *hostenv_templatedir = NULL; static int hostenv_refresh = 60; static char *statusboard = NULL; static char *scheduleboard = NULL; static char *hostpattern_text = NULL; static pcre *hostpattern = NULL; static char *pagepattern_text = NULL; static pcre *pagepattern = NULL; static char *ippattern_text = NULL; static pcre *ippattern = NULL; static char *classpattern_text = NULL; static pcre *classpattern = NULL; static void * hostnames; static void * testnames; typedef struct treerec_t { char *name; int flag; } treerec_t; static int backdays = 0, backhours = 0, backmins = 0, backsecs = 0; static char hostenv_eventtimestart[20]; static char hostenv_eventtimeend[20]; typedef struct listrec_t { char *name, *val, *extra; int selected; struct listrec_t *next; } listrec_t; typedef struct listpool_t { char *name; struct listrec_t *listhead, *listtail; struct listpool_t *next; } listpool_t; static listpool_t *listpoolhead = NULL; typedef struct bodystorage_t { char *id; strbuffer_t *txt; } bodystorage_t; static void clearflags(void * tree) { xtreePos_t handle; treerec_t *rec; if (!tree) return; for (handle = xtreeFirst(tree); (handle != xtreeEnd(tree)); handle = xtreeNext(tree, handle)) { rec = (treerec_t *)xtreeData(tree, handle); rec->flag = 0; } } void sethostenv(char *host, char *ip, char *svc, char *color, char *hikey) { if (hostenv_hikey) xfree(hostenv_hikey); if (hostenv_host) xfree(hostenv_host); if (hostenv_ip) xfree(hostenv_ip); if (hostenv_svc) xfree(hostenv_svc); if (hostenv_color) xfree(hostenv_color); hostenv_hikey = (hikey ? strdup(htmlquoted(hikey)) : NULL); hostenv_host = strdup(htmlquoted(host)); hostenv_ip = strdup(htmlquoted(ip)); hostenv_svc = strdup(htmlquoted(svc)); hostenv_color = strdup(color); } void sethostenv_report(time_t reportstart, time_t reportend, double repwarn, double reppanic) { if (hostenv_repwarn == NULL) hostenv_repwarn = malloc(10); if (hostenv_reppanic == NULL) hostenv_reppanic = malloc(10); hostenv_reportstart = reportstart; hostenv_reportend = reportend; sprintf(hostenv_repwarn, "%.2f", repwarn); sprintf(hostenv_reppanic, "%.2f", reppanic); } void sethostenv_snapshot(time_t snapshot) { hostenv_snapshot = snapshot; } void sethostenv_histlog(char *histtime) { if (hostenv_logtime) xfree(hostenv_logtime); hostenv_logtime = strdup(histtime); } void sethostenv_template(char *dir) { if (hostenv_templatedir) xfree(hostenv_templatedir); hostenv_templatedir = strdup(dir); } void sethostenv_refresh(int n) { hostenv_refresh = n; } void sethostenv_pagepath(char *s) { if (!s) return; if (hostenv_pagepath) xfree(hostenv_pagepath); hostenv_pagepath = strdup(s); } void sethostenv_filter(char *hostptn, char *pageptn, char *ipptn, char *classptn) { const char *errmsg; int errofs; if (hostpattern_text) xfree(hostpattern_text); if (hostpattern) { pcre_free(hostpattern); hostpattern = NULL; } if (pagepattern_text) xfree(pagepattern_text); if (pagepattern) { pcre_free(pagepattern); pagepattern = NULL; } if (ippattern_text) xfree(ippattern_text); if (ippattern) { pcre_free(ippattern); ippattern = NULL; } if (classpattern_text) xfree(classpattern_text); if (classpattern) { pcre_free(classpattern); classpattern = NULL; } /* Setup the pattern to match names against */ if (hostptn) { hostpattern_text = strdup(hostptn); hostpattern = pcre_compile(hostptn, PCRE_CASELESS, &errmsg, &errofs, NULL); } if (pageptn) { pagepattern_text = strdup(pageptn); pagepattern = pcre_compile(pageptn, PCRE_CASELESS, &errmsg, &errofs, NULL); } if (ipptn) { ippattern_text = strdup(ipptn); ippattern = pcre_compile(ipptn, PCRE_CASELESS, &errmsg, &errofs, NULL); } if (classptn) { classpattern_text = strdup(classptn); classpattern = pcre_compile(classptn, PCRE_CASELESS, &errmsg, &errofs, NULL); } } static listpool_t *find_listpool(char *listname) { listpool_t *pool = NULL; if (!listname) listname = ""; for (pool = listpoolhead; (pool && strcmp(pool->name, listname)); pool = pool->next); if (!pool) { pool = (listpool_t *)calloc(1, sizeof(listpool_t)); pool->name = strdup(listname); pool->next = listpoolhead; listpoolhead = pool; } return pool; } void sethostenv_clearlist(char *listname) { listpool_t *pool = NULL; listrec_t *zombie; pool = find_listpool(listname); while (pool->listhead) { zombie = pool->listhead; pool->listhead = pool->listhead->next; xfree(zombie->name); xfree(zombie->val); xfree(zombie); } } void sethostenv_addtolist(char *listname, char *name, char *val, char *extra, int selected) { listpool_t *pool = NULL; listrec_t *newitem = (listrec_t *)calloc(1, sizeof(listrec_t)); pool = find_listpool(listname); newitem->name = strdup(name); newitem->val = strdup(val); newitem->extra = (extra ? strdup(extra) : NULL); newitem->selected = selected; if (pool->listtail) { pool->listtail->next = newitem; pool->listtail = newitem; } else { pool->listhead = pool->listtail = newitem; } } static int critackttprio = 0; static char *critackttgroup = NULL; static char *critackttextra = NULL; static char *ackinfourl = NULL; static char *critackdocurl = NULL; void sethostenv_critack(int prio, char *ttgroup, char *ttextra, char *infourl, char *docurl) { critackttprio = prio; if (critackttgroup) xfree(critackttgroup); critackttgroup = strdup((ttgroup && *ttgroup) ? ttgroup : " "); if (critackttextra) xfree(critackttextra); critackttextra = strdup((ttextra && *ttextra) ? ttextra : " "); if (ackinfourl) xfree(ackinfourl); ackinfourl = strdup(infourl); if (critackdocurl) xfree(critackdocurl); critackdocurl = strdup((docurl && *docurl) ? docurl : ""); } static char *criteditupdinfo = NULL; static int criteditprio = -1; static char *criteditgroup = NULL; static time_t criteditstarttime = 0; static time_t criteditendtime = 0; static char *criteditextra = NULL; static char *criteditslawkdays = NULL; static char *criteditslastart = NULL; static char *criteditslaend = NULL; static char **criteditclonelist = NULL; static int criteditclonesize = 0; void sethostenv_critedit(char *updinfo, int prio, char *group, time_t starttime, time_t endtime, char *crittime, char *extra) { char *p; if (criteditupdinfo) xfree(criteditupdinfo); criteditupdinfo = strdup(updinfo); criteditprio = prio; criteditstarttime = starttime; criteditendtime = endtime; if (criteditgroup) xfree(criteditgroup); criteditgroup = strdup(group ? group : ""); if (criteditextra) xfree(criteditextra); criteditextra = strdup(extra ? extra : ""); if (criteditslawkdays) xfree(criteditslawkdays); criteditslawkdays = criteditslastart = criteditslaend = NULL; if (crittime) { criteditslawkdays = strdup(crittime); p = strchr(criteditslawkdays, ':'); if (p) { *p = '\0'; criteditslastart = p+1; p = strchr(criteditslastart, ':'); if (p) { *p = '\0'; criteditslaend = p+1; } } if (criteditslawkdays && (!criteditslastart || !criteditslaend)) { xfree(criteditslawkdays); criteditslawkdays = criteditslastart = criteditslaend = NULL; } } } void sethostenv_critclonelist_clear(void) { int i; if (criteditclonelist) { for (i=0; (criteditclonelist[i]); i++) xfree(criteditclonelist[i]); xfree(criteditclonelist); } criteditclonelist = malloc(sizeof(char *)); criteditclonelist[0] = NULL; criteditclonesize = 0; } void sethostenv_critclonelist_add(char *hostname) { char *p; criteditclonelist = (char **)realloc(criteditclonelist, (criteditclonesize + 2)*sizeof(char *)); criteditclonelist[criteditclonesize] = strdup(hostname); p = criteditclonelist[criteditclonesize]; criteditclonelist[++criteditclonesize] = NULL; p += (strlen(p) - 1); if (*p == '=') *p = '\0'; } void sethostenv_backsecs(int seconds) { backdays = seconds / 86400; seconds -= backdays*86400; backhours = seconds / 3600; seconds -= backhours*3600; backmins = seconds / 60; seconds -= backmins*60; backsecs = seconds; } void sethostenv_eventtime(time_t starttime, time_t endtime) { *hostenv_eventtimestart = *hostenv_eventtimeend = '\0'; if (starttime) strftime(hostenv_eventtimestart, sizeof(hostenv_eventtimestart), "%Y/%m/%d@%H:%M:%S", localtime(&starttime)); if (endtime) strftime(hostenv_eventtimeend, sizeof(hostenv_eventtimeend), "%Y/%m/%d@%H:%M:%S", localtime(&endtime)); } char *wkdayselect(char wkday, char *valtxt, int isdefault) { static char result[100]; char *selstr; if (!criteditslawkdays) { if (isdefault) selstr = " selected"; else selstr = ""; } else { if (strchr(criteditslawkdays, wkday)) selstr = " selected"; else selstr = ""; } sprintf(result, "\n", wkday, selstr, valtxt); return result; } static void *wanted_host(char *hostname) { void *hinfo = hostinfo(hostname); int result, ovector[30]; if (!hinfo) return NULL; if (hostpattern) { result = pcre_exec(hostpattern, NULL, hostname, strlen(hostname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))); if (result < 0) return NULL; } if (pagepattern && hinfo) { char *pname = xmh_item(hinfo, XMH_PAGEPATH); result = pcre_exec(pagepattern, NULL, pname, strlen(pname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))); if (result < 0) return NULL; } if (ippattern && hinfo) { char *hostip = xmh_item(hinfo, XMH_IP); result = pcre_exec(ippattern, NULL, hostip, strlen(hostip), 0, 0, ovector, (sizeof(ovector)/sizeof(int))); if (result < 0) return NULL; } if (classpattern && hinfo) { char *hostclass = xmh_item(hinfo, XMH_CLASS); if (!hostclass) return NULL; result = pcre_exec(classpattern, NULL, hostclass, strlen(hostclass), 0, 0, ovector, (sizeof(ovector)/sizeof(int))); if (result < 0) return NULL; } return hinfo; } static void fetch_board(void) { static int haveboard = 0; char *walk, *eoln; sendreturn_t *sres; if (haveboard) return; sres = newsendreturnbuf(1, NULL); if (sendmessage("xymondboard fields=hostname,testname,disabletime,dismsg", NULL, XYMON_TIMEOUT, sres) != XYMONSEND_OK) { freesendreturnbuf(sres); return; } haveboard = 1; statusboard = getsendreturnstr(sres, 1); freesendreturnbuf(sres); hostnames = xtreeNew(strcasecmp); testnames = xtreeNew(strcasecmp); walk = statusboard; while (walk) { eoln = strchr(walk, '\n'); if (eoln) *eoln = '\0'; if (strlen(walk) && (strncmp(walk, "summary|", 8) != 0)) { char *buf, *hname = NULL, *tname = NULL; treerec_t *newrec; buf = strdup(walk); hname = gettok(buf, "|"); if (hname && wanted_host(hname) && hostinfo(hname)) { newrec = (treerec_t *)malloc(sizeof(treerec_t)); newrec->name = strdup(hname); newrec->flag = 0; xtreeAdd(hostnames, newrec->name, newrec); tname = gettok(NULL, "|"); if (tname) { newrec = (treerec_t *)malloc(sizeof(treerec_t)); newrec->name = strdup(tname); newrec->flag = 0; xtreeAdd(testnames, strdup(tname), newrec); } } xfree(buf); } if (eoln) { *eoln = '\n'; walk = eoln + 1; } else walk = NULL; } sres = newsendreturnbuf(1, NULL); if (sendmessage("schedule", NULL, XYMON_TIMEOUT, sres) != XYMONSEND_OK) { freesendreturnbuf(sres); return; } scheduleboard = getsendreturnstr(sres, 1); freesendreturnbuf(sres); } static char *eventreport_timestring(time_t timestamp) { static char result[20]; strftime(result, sizeof(result), "%Y/%m/%d@%H:%M:%S", localtime(×tamp)); return result; } static void build_pagepath_dropdown(FILE *output) { void * ptree; void *hwalk; xtreePos_t handle; ptree = xtreeNew(strcmp); for (hwalk = first_host(); (hwalk); hwalk = next_host(hwalk, 0)) { char *path = xmh_item(hwalk, XMH_PAGEPATH); char *ptext; handle = xtreeFind(ptree, path); if (handle != xtreeEnd(ptree)) continue; ptext = xmh_item(hwalk, XMH_PAGEPATHTITLE); xtreeAdd(ptree, ptext, path); } for (handle = xtreeFirst(ptree); (handle != xtreeEnd(ptree)); handle = xtreeNext(ptree, handle)) { fprintf(output, "\n", (char *)xtreeData(ptree, handle), xtreeKey(ptree, handle)); } xtreeDestroy(ptree); } char *xymonbody(char *id) { static void * bodystorage; static int firsttime = 1; xtreePos_t handle; bodystorage_t *bodyelement; strbuffer_t *rawdata, *parseddata; char *envstart, *envend, *outpos; char *idtag, *idval; int idtaglen; if (firsttime) { bodystorage = xtreeNew(strcmp); firsttime = 0; } idtaglen = strspn(id, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"); idtag = (char *)malloc(idtaglen + 1); strncpy(idtag, id, idtaglen); *(idtag+idtaglen) = '\0'; handle = xtreeFind(bodystorage, idtag); if (handle != xtreeEnd(bodystorage)) { bodyelement = (bodystorage_t *)xtreeData(bodystorage, handle); xfree(idtag); return STRBUF(bodyelement->txt); } rawdata = newstrbuffer(0); idval = xgetenv(idtag); if (idval == NULL) return ""; if (strncmp(idval, "file:", 5) == 0) { FILE *fd; strbuffer_t *inbuf = newstrbuffer(0); fd = stackfopen(idval+5, "r", NULL); if (fd != NULL) { while (stackfgets(inbuf, NULL)) addtostrbuffer(rawdata, inbuf); stackfclose(fd); } freestrbuffer(inbuf); } else { addtobuffer(rawdata, idval); } /* Output the body data, but expand any environment variables along the way */ parseddata = newstrbuffer(0); outpos = STRBUF(rawdata); while (*outpos) { envstart = strchr(outpos, '$'); if (envstart) { char savechar; char *envval = NULL; *envstart = '\0'; addtobuffer(parseddata, outpos); envstart++; envend = envstart + strspn(envstart, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"); savechar = *envend; *envend = '\0'; if (*envstart) envval = xgetenv(envstart); *envend = savechar; outpos = envend; if (envval) { addtobuffer(parseddata, envval); } else { addtobuffer(parseddata, "$"); addtobuffer(parseddata, envstart); } } else { addtobuffer(parseddata, outpos); outpos += strlen(outpos); } } freestrbuffer(rawdata); bodyelement = (bodystorage_t *)calloc(1, sizeof(bodystorage_t)); bodyelement->id = idtag; bodyelement->txt = parseddata; xtreeAdd(bodystorage, bodyelement->id, bodyelement); return STRBUF(bodyelement->txt); } typedef struct distest_t { char *name; char *cause; time_t until; struct distest_t *next; } distest_t; typedef struct dishost_t { char *name; struct distest_t *tests; struct dishost_t *next; } dishost_t; void output_parsed(FILE *output, char *templatedata, int bgcolor, time_t selectedtime) { char *t_start, *t_next; char savechar; time_t now = getcurrenttime(NULL); time_t yesterday = getcurrenttime(NULL) - 86400; struct tm *nowtm; for (t_start = templatedata, t_next = strchr(t_start, '&'); (t_next); ) { /* Copy from t_start to t_next unchanged */ *t_next = '\0'; t_next++; fprintf(output, "%s", t_start); /* Find token */ t_start = t_next; /* Don't include lower-case letters - reserve those for eg " " */ t_next += strspn(t_next, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"); savechar = *t_next; *t_next = '\0'; if ((strcmp(t_start, "XYMWEBDATE") == 0) || (strcmp(t_start, "BBDATE") == 0)) { char *datefmt = xgetenv("XYMONDATEFORMAT"); char datestr[100]; MEMDEFINE(datestr); /* * If no XYMONDATEFORMAT setting, use a format string that * produces output similar to that from ctime() */ if (datefmt == NULL) datefmt = "%a %b %d %H:%M:%S %Y\n"; if (hostenv_reportstart != 0) { char starttime[20], endtime[20]; MEMDEFINE(starttime); MEMDEFINE(endtime); strftime(starttime, sizeof(starttime), "%b %d %Y", localtime(&hostenv_reportstart)); strftime(endtime, sizeof(endtime), "%b %d %Y", localtime(&hostenv_reportend)); if (strcmp(starttime, endtime) == 0) fprintf(output, "%s", starttime); else fprintf(output, "%s - %s", starttime, endtime); MEMUNDEFINE(starttime); MEMUNDEFINE(endtime); } else if (hostenv_snapshot != 0) { strftime(datestr, sizeof(datestr), datefmt, localtime(&hostenv_snapshot)); fprintf(output, "%s", datestr); } else { strftime(datestr, sizeof(datestr), datefmt, localtime(&now)); fprintf(output, "%s", datestr); } MEMUNDEFINE(datestr); } else if ((strcmp(t_start, "XYMWEBBACKGROUND") == 0) || (strcmp(t_start, "BBBACKGROUND") == 0)) { fprintf(output, "%s", colorname(bgcolor)); } else if ((strcmp(t_start, "XYMWEBCOLOR") == 0) || (strcmp(t_start, "BBCOLOR") == 0)) fprintf(output, "%s", hostenv_color); else if ((strcmp(t_start, "XYMWEBSVC") == 0) || (strcmp(t_start, "BBSVC") == 0)) fprintf(output, "%s", hostenv_svc); else if ((strcmp(t_start, "XYMWEBHOST") == 0) || (strcmp(t_start, "BBHOST") == 0)) fprintf(output, "%s", hostenv_host); else if ((strcmp(t_start, "XYMWEBHIKEY") == 0) || (strcmp(t_start, "BBHIKEY") == 0)) fprintf(output, "%s", (hostenv_hikey ? hostenv_hikey : hostenv_host)); else if ((strcmp(t_start, "XYMWEBIP") == 0) || (strcmp(t_start, "BBIP") == 0)) fprintf(output, "%s", hostenv_ip); else if ((strcmp(t_start, "XYMWEBIPNAME") == 0) || (strcmp(t_start, "BBIPNAME") == 0)) { if (strcmp(hostenv_ip, "0.0.0.0") == 0) fprintf(output, "%s", hostenv_host); else fprintf(output, "%s", hostenv_ip); } else if ((strcmp(t_start, "XYMONREPWARN") == 0) || (strcmp(t_start, "BBREPWARN") == 0)) fprintf(output, "%s", hostenv_repwarn); else if ((strcmp(t_start, "XYMONREPPANIC") == 0) || (strcmp(t_start, "BBREPPANIC") == 0)) fprintf(output, "%s", hostenv_reppanic); else if (strcmp(t_start, "LOGTIME") == 0) fprintf(output, "%s", (hostenv_logtime ? hostenv_logtime : "")); else if ((strcmp(t_start, "XYMWEBREFRESH") == 0) || (strcmp(t_start, "BBREFRESH") == 0)) fprintf(output, "%d", hostenv_refresh); else if ((strcmp(t_start, "XYMWEBPAGEPATH") == 0) || (strcmp(t_start, "BBPAGEPATH") == 0)) fprintf(output, "%s", (hostenv_pagepath ? hostenv_pagepath : "")); else if (strcmp(t_start, "REPMONLIST") == 0) { int i; struct tm monthtm; char mname[20]; char *selstr; MEMDEFINE(mname); nowtm = localtime(&selectedtime); for (i=1; (i <= 12); i++) { if (i == (nowtm->tm_mon + 1)) selstr = " selected"; else selstr = ""; monthtm.tm_mon = (i-1); monthtm.tm_mday = 1; monthtm.tm_year = nowtm->tm_year; monthtm.tm_hour = monthtm.tm_min = monthtm.tm_sec = monthtm.tm_isdst = 0; strftime(mname, sizeof(mname)-1, "%B", &monthtm); fprintf(output, "\n", i, selstr, mname); } MEMUNDEFINE(mname); } else if (strcmp(t_start, "MONLIST") == 0) { int i; struct tm monthtm; char mname[20]; MEMDEFINE(mname); nowtm = localtime(&selectedtime); for (i=1; (i <= 12); i++) { monthtm.tm_mon = (i-1); monthtm.tm_mday = 1; monthtm.tm_year = nowtm->tm_year; monthtm.tm_hour = monthtm.tm_min = monthtm.tm_sec = monthtm.tm_isdst = 0; strftime(mname, sizeof(mname)-1, "%B", &monthtm); fprintf(output, "\n", i, mname); } MEMUNDEFINE(mname); } else if (strcmp(t_start, "REPWEEKLIST") == 0) { int i; char weekstr[5]; int weeknum; char *selstr; nowtm = localtime(&selectedtime); strftime(weekstr, sizeof(weekstr)-1, "%V", nowtm); weeknum = atoi(weekstr); for (i=1; (i <= 53); i++) { if (i == weeknum) selstr = " selected"; else selstr = ""; fprintf(output, "\n", i, selstr, i); } } else if (strcmp(t_start, "REPDAYLIST") == 0) { int i; char *selstr; nowtm = localtime(&selectedtime); for (i=1; (i <= 31); i++) { if (i == nowtm->tm_mday) selstr = " selected"; else selstr = ""; fprintf(output, "\n", i, selstr, i); } } else if (strcmp(t_start, "DAYLIST") == 0) { int i; nowtm = localtime(&selectedtime); for (i=1; (i <= 31); i++) { fprintf(output, "\n", i, i); } } else if (strcmp(t_start, "REPYEARLIST") == 0) { int i; char *selstr; int beginyear, endyear; nowtm = localtime(&selectedtime); beginyear = nowtm->tm_year + 1900 - 5; endyear = nowtm->tm_year + 1900; for (i=beginyear; (i <= endyear); i++) { if (i == (nowtm->tm_year + 1900)) selstr = " selected"; else selstr = ""; fprintf(output, "\n", i, selstr, i); } } else if (strcmp(t_start, "FUTUREYEARLIST") == 0) { int i; char *selstr; int beginyear, endyear; nowtm = localtime(&selectedtime); beginyear = nowtm->tm_year + 1900; endyear = nowtm->tm_year + 1900 + 5; for (i=beginyear; (i <= endyear); i++) { if (i == (nowtm->tm_year + 1900)) selstr = " selected"; else selstr = ""; fprintf(output, "\n", i, selstr, i); } } else if (strcmp(t_start, "YEARLIST") == 0) { int i; int beginyear, endyear; nowtm = localtime(&selectedtime); beginyear = nowtm->tm_year + 1900; endyear = nowtm->tm_year + 1900 + 5; for (i=beginyear; (i <= endyear); i++) { fprintf(output, "\n", i, i); } } else if (strcmp(t_start, "REPHOURLIST") == 0) { int i; struct tm *nowtm = localtime(&yesterday); char *selstr; for (i=0; (i <= 24); i++) { if (i == nowtm->tm_hour) selstr = " selected"; else selstr = ""; fprintf(output, "\n", i, selstr, i); } } else if (strcmp(t_start, "HOURLIST") == 0) { int i; for (i=0; (i <= 24); i++) { fprintf(output, "\n", i, i); } } else if (strcmp(t_start, "REPMINLIST") == 0) { int i; struct tm *nowtm = localtime(&yesterday); char *selstr; for (i=0; (i <= 59); i++) { if (i == nowtm->tm_min) selstr = " selected"; else selstr = ""; fprintf(output, "\n", i, selstr, i); } } else if (strcmp(t_start, "MINLIST") == 0) { int i; for (i=0; (i <= 59); i++) { fprintf(output, "\n", i, i); } } else if (strcmp(t_start, "REPSECLIST") == 0) { int i; char *selstr; for (i=0; (i <= 59); i++) { if (i == 0) selstr = " selected"; else selstr = ""; fprintf(output, "\n", i, selstr, i); } } else if (strcmp(t_start, "HOSTFILTER") == 0) { if (hostpattern_text) fprintf(output, "%s", hostpattern_text); } else if (strcmp(t_start, "PAGEFILTER") == 0) { if (pagepattern_text) fprintf(output, "%s", pagepattern_text); } else if (strcmp(t_start, "IPFILTER") == 0) { if (ippattern_text) fprintf(output, "%s", ippattern_text); } else if (strcmp(t_start, "CLASSFILTER") == 0) { if (classpattern_text) fprintf(output, "%s", classpattern_text); } else if (strcmp(t_start, "HOSTLIST") == 0) { xtreePos_t handle; treerec_t *rec; fetch_board(); for (handle = xtreeFirst(hostnames); (handle != xtreeEnd(hostnames)); handle = xtreeNext(hostnames, handle)) { rec = (treerec_t *)xtreeData(hostnames, handle); if (wanted_host(rec->name)) { fprintf(output, "\n", rec->name, rec->name); } } } else if (strcmp(t_start, "JSHOSTLIST") == 0) { xtreePos_t handle; fetch_board(); clearflags(testnames); fprintf(output, "var hosts = new Array();\n"); fprintf(output, "hosts[\"ALL\"] = [ \"ALL\""); for (handle = xtreeFirst(testnames); (handle != xtreeEnd(testnames)); handle = xtreeNext(testnames, handle)) { treerec_t *rec = xtreeData(testnames, handle); fprintf(output, ", \"%s\"", rec->name); } fprintf(output, " ];\n"); for (handle = xtreeFirst(hostnames); (handle != xtreeEnd(hostnames)); handle = xtreeNext(hostnames, handle)) { treerec_t *hrec = xtreeData(hostnames, handle); if (wanted_host(hrec->name)) { xtreePos_t thandle; treerec_t *trec; char *bwalk, *tname, *p; char *key = (char *)malloc(strlen(hrec->name) + 3); /* Setup the search key and find the first occurrence. */ sprintf(key, "\n%s|", hrec->name); if (strncmp(statusboard, (key+1), strlen(key+1)) == 0) bwalk = statusboard; else { bwalk = strstr(statusboard, key); if (bwalk) bwalk++; } while (bwalk) { tname = bwalk + strlen(key+1); p = strchr(tname, '|'); if (p) *p = '\0'; if ( (strcmp(tname, xgetenv("INFOCOLUMN")) != 0) && (strcmp(tname, xgetenv("TRENDSCOLUMN")) != 0) ) { thandle = xtreeFind(testnames, tname); if (thandle != xtreeEnd(testnames)) { trec = (treerec_t *)xtreeData(testnames, thandle); trec->flag = 1; } } if (p) *p = '|'; bwalk = strstr(tname, key); if (bwalk) bwalk++; } fprintf(output, "hosts[\"%s\"] = [ \"ALL\"", hrec->name); for (thandle = xtreeFirst(testnames); (thandle != xtreeEnd(testnames)); thandle = xtreeNext(testnames, thandle)) { trec = (treerec_t *)xtreeData(testnames, thandle); if (trec->flag == 0) continue; trec->flag = 0; fprintf(output, ", \"%s\"", trec->name); } fprintf(output, " ];\n"); } } } else if (strcmp(t_start, "TESTLIST") == 0) { xtreePos_t handle; treerec_t *rec; fetch_board(); for (handle = xtreeFirst(testnames); (handle != xtreeEnd(testnames)); handle = xtreeNext(testnames, handle)) { rec = (treerec_t *)xtreeData(testnames, handle); fprintf(output, "\n", rec->name, rec->name); } } else if (strcmp(t_start, "DISABLELIST") == 0) { char *walk, *eoln; dishost_t *dhosts = NULL, *hwalk, *hprev; distest_t *twalk; fetch_board(); clearflags(testnames); walk = statusboard; while (walk) { eoln = strchr(walk, '\n'); if (eoln) *eoln = '\0'; if (*walk) { char *buf, *hname, *tname, *dismsg, *p; time_t distime; xtreePos_t thandle; treerec_t *rec; buf = strdup(walk); hname = tname = dismsg = NULL; distime = 0; hname = gettok(buf, "|"); if (hname) tname = gettok(NULL, "|"); if (tname) { p = gettok(NULL, "|"); if (p) distime = atol(p); } if (distime) dismsg = gettok(NULL, "|\n"); if (hname && tname && (distime != 0) && dismsg && wanted_host(hname)) { nldecode(dismsg); hwalk = dhosts; hprev = NULL; while (hwalk && (strcasecmp(hname, hwalk->name) > 0)) { hprev = hwalk; hwalk = hwalk->next; } if (!hwalk || (strcasecmp(hname, hwalk->name) != 0)) { dishost_t *newitem = (dishost_t *) malloc(sizeof(dishost_t)); newitem->name = strdup(hname); newitem->tests = NULL; newitem->next = hwalk; if (!hprev) dhosts = newitem; else hprev->next = newitem; hwalk = newitem; } twalk = (distest_t *) malloc(sizeof(distest_t)); twalk->name = strdup(tname); twalk->cause = strdup(dismsg); twalk->until = distime; twalk->next = hwalk->tests; hwalk->tests = twalk; thandle = xtreeFind(testnames, tname); if (thandle != xtreeEnd(testnames)) { rec = xtreeData(testnames, thandle); rec->flag = 1; } } xfree(buf); } if (eoln) { *eoln = '\n'; walk = eoln+1; } else { walk = NULL; } } if (dhosts) { /* Insert the "All hosts" record first. */ hwalk = (dishost_t *)calloc(1, sizeof(dishost_t)); hwalk->next = dhosts; dhosts = hwalk; for (hwalk = dhosts; (hwalk); hwalk = hwalk->next) { fprintf(output, ""); fprintf(output, ""); fprintf(output,"
\n", xgetenv("SECURECGIBINURL")); fprintf(output, "\n", (hwalk->name ? hwalk->name : "")); fprintf(output, "\n"); fprintf(output, "", (hwalk->name ? hwalk->name : "All hosts")); fprintf(output, "\n"); fprintf(output, "\n"); fprintf(output, "\n"); fprintf(output, "\n"); fprintf(output, "\n"); fprintf(output, "\n"); fprintf(output, "
%s
\n"); if (hwalk->name) { fprintf(output, "\n", hwalk->name); fprintf(output, "\n"); } else { dishost_t *hw2; fprintf(output, "\n"); } fprintf(output, "\n"); fprintf(output, "\n"); fprintf(output, "\n"); fprintf(output, "\n"); fprintf(output, "
\n"); fprintf(output, "
\n"); fprintf(output, "\n"); fprintf(output, "\n"); } } else { fprintf(output, "No tests disabled\n"); } } else if (strcmp(t_start, "SCHEDULELIST") == 0) { char *walk, *eoln; int gotany = 0; fetch_board(); walk = scheduleboard; while (walk) { eoln = strchr(walk, '\n'); if (eoln) *eoln = '\0'; if (*walk) { int id = 0; time_t executiontime = 0; char *sender = NULL, *cmd = NULL, *buf, *p, *eoln; buf = strdup(walk); p = gettok(buf, "|"); if (p) { id = atoi(p); p = gettok(NULL, "|"); } if (p) { executiontime = atoi(p); p = gettok(NULL, "|"); } if (p) { sender = p; p = gettok(NULL, "|"); } if (p) { cmd = p; } if (id && executiontime && sender && cmd) { gotany = 1; nldecode(cmd); fprintf(output, "\n"); fprintf(output, "%s\n", ctime(&executiontime)); fprintf(output, ""); p = cmd; while ((eoln = strchr(p, '\n')) != NULL) { *eoln = '\0'; fprintf(output, "%s
", p); p = (eoln + 1); } fprintf(output, "\n"); fprintf(output, "\n"); fprintf(output, "
\n", xgetenv("SECURECGIBINURL")); fprintf(output, "\n", id); fprintf(output, "\n"); fprintf(output, "
\n"); fprintf(output, "\n"); } xfree(buf); } if (eoln) { *eoln = '\n'; walk = eoln+1; } else { walk = NULL; } } if (!gotany) { fprintf(output, "No tasks scheduled\n"); } } else if (strncmp(t_start, "GENERICLIST", strlen("GENERICLIST")) == 0) { listpool_t *pool = find_listpool(t_start + strlen("GENERICLIST")); listrec_t *walk; for (walk = pool->listhead; (walk); walk = walk->next) fprintf(output, "\n", walk->val, (walk->selected ? " selected" : ""), (walk->extra ? walk->extra : ""), walk->name); } else if (strcmp(t_start, "CRITACKTTPRIO") == 0) fprintf(output, "%d", critackttprio); else if (strcmp(t_start, "CRITACKTTGROUP") == 0) fprintf(output, "%s", critackttgroup); else if (strcmp(t_start, "CRITACKTTEXTRA") == 0) fprintf(output, "%s", critackttextra); else if (strcmp(t_start, "CRITACKINFOURL") == 0) fprintf(output, "%s", ackinfourl); else if (strcmp(t_start, "CRITACKDOCURL") == 0) fprintf(output, "%s", critackdocurl); else if (strcmp(t_start, "CRITEDITUPDINFO") == 0) { fprintf(output, "%s", criteditupdinfo); } else if (strcmp(t_start, "CRITEDITPRIOLIST") == 0) { int i; char *selstr; for (i=1; (i <= 3); i++) { selstr = ((i == criteditprio) ? " selected" : ""); fprintf(output, "\n", i, selstr, i); } } else if (strcmp(t_start, "CRITEDITCLONELIST") == 0) { int i; for (i=0; (criteditclonelist[i]); i++) fprintf(output, "\n", criteditclonelist[i], criteditclonelist[i]); } else if (strcmp(t_start, "CRITEDITGROUP") == 0) { fprintf(output, "%s", criteditgroup); } else if (strcmp(t_start, "CRITEDITEXTRA") == 0) { fprintf(output, "%s", criteditextra); } else if (strcmp(t_start, "CRITEDITWKDAYS") == 0) { fprintf(output, "%s", wkdayselect('*', "All days", 1)); fprintf(output, "%s", wkdayselect('W', "Mon-Fri", 0)); fprintf(output, "%s", wkdayselect('1', "Monday", 0)); fprintf(output, "%s", wkdayselect('2', "Tuesday", 0)); fprintf(output, "%s", wkdayselect('3', "Wednesday", 0)); fprintf(output, "%s", wkdayselect('4', "Thursday", 0)); fprintf(output, "%s", wkdayselect('5', "Friday", 0)); fprintf(output, "%s", wkdayselect('6', "Saturday", 0)); fprintf(output, "%s", wkdayselect('0', "Sunday", 0)); } else if (strcmp(t_start, "CRITEDITSTART") == 0) { int i, curr; char *selstr; curr = (criteditslastart ? (atoi(criteditslastart) / 100) : 0); for (i=0; (i <= 23); i++) { selstr = ((i == curr) ? " selected" : ""); fprintf(output, "\n", i, selstr, i); } } else if (strcmp(t_start, "CRITEDITEND") == 0) { int i, curr; char *selstr; curr = (criteditslaend ? (atoi(criteditslaend) / 100) : 24); for (i=1; (i <= 24); i++) { selstr = ((i == curr) ? " selected" : ""); fprintf(output, "\n", i, selstr, i); } } else if (strncmp(t_start, "CRITEDITDAYLIST", 13) == 0) { time_t t = ((*(t_start+13) == '1') ? criteditstarttime : criteditendtime); char *defstr = ((*(t_start+13) == '1') ? "Now" : "Never"); int i; char *selstr; struct tm *tm; tm = localtime(&t); selstr = ((t == 0) ? " selected" : ""); fprintf(output, "\n", selstr, defstr); for (i=1; (i <= 31); i++) { selstr = ( (t && (tm->tm_mday == i)) ? " selected" : ""); fprintf(output, "\n", i, selstr, i); } } else if (strncmp(t_start, "CRITEDITMONLIST", 13) == 0) { time_t t = ((*(t_start+13) == '1') ? criteditstarttime : criteditendtime); char *defstr = ((*(t_start+13) == '1') ? "Now" : "Never"); int i; char *selstr; struct tm tm; time_t now; struct tm nowtm; struct tm monthtm; char mname[20]; memcpy(&tm, localtime(&t), sizeof(tm)); now = getcurrenttime(NULL); memcpy(&nowtm, localtime(&now), sizeof(tm)); selstr = ((t == 0) ? " selected" : ""); fprintf(output, "\n", selstr, defstr); for (i=1; (i <= 12); i++) { selstr = ( (t && (tm.tm_mon == (i -1))) ? " selected" : ""); monthtm.tm_mon = (i-1); monthtm.tm_mday = 1; monthtm.tm_year = nowtm.tm_year; monthtm.tm_hour = monthtm.tm_min = monthtm.tm_sec = monthtm.tm_isdst = 0; strftime(mname, sizeof(mname)-1, "%B", &monthtm); fprintf(output, "\n", i, selstr, mname); } } else if (strncmp(t_start, "CRITEDITYEARLIST", 14) == 0) { time_t t = ((*(t_start+14) == '1') ? criteditstarttime : criteditendtime); char *defstr = ((*(t_start+14) == '1') ? "Now" : "Never"); int i; char *selstr; struct tm tm; time_t now; struct tm nowtm; int beginyear, endyear; memcpy(&tm, localtime(&t), sizeof(tm)); now = getcurrenttime(NULL); memcpy(&nowtm, localtime(&now), sizeof(tm)); beginyear = nowtm.tm_year + 1900; endyear = nowtm.tm_year + 1900 + 5; selstr = ((t == 0) ? " selected" : ""); fprintf(output, "\n", selstr, defstr); for (i=beginyear; (i <= endyear); i++) { selstr = ( (t && (tm.tm_year == (i - 1900))) ? " selected" : ""); fprintf(output, "\n", i, selstr, i); } } else if (hostenv_hikey && ( (strncmp(t_start, "XMH_", 4) == 0) || (strncmp(t_start, "BBH_", 4) == 0) )) { void *hinfo = hostinfo(hostenv_hikey); if (hinfo) { char *s; if (strncmp(t_start, "BBH_", 4) == 0) memmove(t_start, "XMH_", 4); /* For compatibility */ s = xmh_item_byname(hinfo, t_start); if (!s) { fprintf(output, "&%s", t_start); } else { fprintf(output, "%s", s); } } } else if (strncmp(t_start, "BACKDAYS", 8) == 0) { fprintf(output, "%d", backdays); } else if (strncmp(t_start, "BACKHOURS", 9) == 0) { fprintf(output, "%d", backhours); } else if (strncmp(t_start, "BACKMINS", 8) == 0) { fprintf(output, "%d", backmins); } else if (strncmp(t_start, "BACKSECS", 8) == 0) { fprintf(output, "%d", backsecs); } else if (strncmp(t_start, "EVENTLASTMONTHBEGIN", 19) == 0) { time_t t = getcurrenttime(NULL); struct tm *tm = localtime(&t); tm->tm_mon -= 1; tm->tm_mday = 1; tm->tm_hour = tm->tm_min = tm->tm_sec = 0; tm->tm_isdst = -1; t = mktime(tm); fprintf(output, "%s", eventreport_timestring(t)); } else if (strncmp(t_start, "EVENTCURRMONTHBEGIN", 19) == 0) { time_t t = getcurrenttime(NULL); struct tm *tm = localtime(&t); tm->tm_mday = 1; tm->tm_hour = tm->tm_min = tm->tm_sec = 0; tm->tm_isdst = -1; t = mktime(tm); fprintf(output, "%s", eventreport_timestring(t)); } else if (strncmp(t_start, "EVENTLASTWEEKBEGIN", 18) == 0) { time_t t = getcurrenttime(NULL); struct tm *tm = localtime(&t); int weekstart = atoi(xgetenv("WEEKSTART")); if (tm->tm_wday == weekstart) { /* Do nothing */ } else if (tm->tm_wday > weekstart) tm->tm_mday -= (tm->tm_wday - weekstart); else tm->tm_mday += (weekstart - tm->tm_wday) - 7; tm->tm_mday -= 7; tm->tm_hour = tm->tm_min = tm->tm_sec = 0; tm->tm_isdst = -1; t = mktime(tm); fprintf(output, "%s", eventreport_timestring(t)); } else if (strncmp(t_start, "EVENTCURRWEEKBEGIN", 18) == 0) { time_t t = getcurrenttime(NULL); struct tm *tm = localtime(&t); int weekstart = atoi(xgetenv("WEEKSTART")); if (tm->tm_wday == weekstart) { /* Do nothing */ } else if (tm->tm_wday > weekstart) tm->tm_mday -= (tm->tm_wday - weekstart); else tm->tm_mday += (weekstart - tm->tm_wday) - 7; tm->tm_hour = tm->tm_min = tm->tm_sec = 0; tm->tm_isdst = -1; t = mktime(tm); fprintf(output, "%s", eventreport_timestring(t)); } else if (strncmp(t_start, "EVENTLASTYEARBEGIN", 18) == 0) { time_t t = getcurrenttime(NULL); struct tm *tm = localtime(&t); tm->tm_year -= 1; tm->tm_mon = 0; tm->tm_mday = 1; tm->tm_hour = tm->tm_min = tm->tm_sec = 0; tm->tm_isdst = -1; t = mktime(tm); fprintf(output, "%s", eventreport_timestring(t)); } else if (strncmp(t_start, "EVENTCURRYEARBEGIN", 18) == 0) { time_t t = getcurrenttime(NULL); struct tm *tm = localtime(&t); tm->tm_mon = 0; tm->tm_mday = 1; tm->tm_hour = tm->tm_min = tm->tm_sec = 0; tm->tm_isdst = -1; t = mktime(tm); fprintf(output, "%s", eventreport_timestring(t)); } else if (strncmp(t_start, "EVENTYESTERDAY", 14) == 0) { time_t t = getcurrenttime(NULL); struct tm *tm = localtime(&t); tm->tm_mday -= 1; tm->tm_hour = tm->tm_min = tm->tm_sec = 0; tm->tm_isdst = -1; t = mktime(tm); fprintf(output, "%s", eventreport_timestring(t)); } else if (strncmp(t_start, "EVENTTODAY", 10) == 0) { time_t t = getcurrenttime(NULL); struct tm *tm = localtime(&t); tm->tm_hour = tm->tm_min = tm->tm_sec = 0; tm->tm_isdst = -1; t = mktime(tm); fprintf(output, "%s", eventreport_timestring(t)); } else if (strncmp(t_start, "EVENTNOW", 8) == 0) { time_t t = getcurrenttime(NULL); fprintf(output, "%s", eventreport_timestring(t)); } else if (strncmp(t_start, "PAGEPATH_DROPDOWN", 17) == 0) { build_pagepath_dropdown(output); } else if (strncmp(t_start, "EVENTSTARTTIME", 8) == 0) { fprintf(output, "%s", hostenv_eventtimestart); } else if (strncmp(t_start, "EVENTENDTIME", 8) == 0) { fprintf(output, "%s", hostenv_eventtimeend); } else if (strncmp(t_start, "XYMONBODY", 9) == 0) { char *bodytext = xymonbody(t_start); fprintf(output, "%s", bodytext); } else if (*t_start && (savechar == ';')) { /* A "&xxx;" is probably an HTML escape - output unchanged. */ fprintf(output, "&%s", t_start); } else if (*t_start && (strncmp(t_start, "SELECT_", 7) == 0)) { /* * Special for getting the SELECTED tag into list boxes. * Cannot use xgetenv because it complains for undefined * environment variables. */ char *val = getenv(t_start); fprintf(output, "%s", (val ? val : "")); } else if (strlen(t_start) && xgetenv(t_start)) { fprintf(output, "%s", xgetenv(t_start)); } else fprintf(output, "&%s", t_start); /* No substitution - copy all unchanged. */ *t_next = savechar; t_start = t_next; t_next = strchr(t_start, '&'); } /* Remainder of file */ fprintf(output, "%s", t_start); } void headfoot(FILE *output, char *template, char *pagepath, char *head_or_foot, int bgcolor) { int fd; char filename[PATH_MAX]; char *bulletinfile; struct stat st; char *templatedata; char *hfpath; int have_pagepath = (hostenv_pagepath != NULL); MEMDEFINE(filename); if (xgetenv("XYMONDREL") == NULL) { char *xymondrel = (char *)malloc(12+strlen(VERSION)); sprintf(xymondrel, "XYMONDREL=%s", VERSION); putenv(xymondrel); } /* * "pagepath" is the relative path for this page, e.g. * - for the top-level page it is "" * - for a page, it is "pagename/" * - for a subpage, it is "pagename/subpagename/" * * We allow header/footer files named template_PAGE_header or template_PAGE_SUBPAGE_header * so we need to scan for an existing file - starting with the * most detailed one, and working up towards the standard "web/template_TYPE" file. */ hfpath = strdup(pagepath); /* Trim off excess trailing slashes */ if (*hfpath) { while (*(hfpath + strlen(hfpath) - 1) == '/') *(hfpath + strlen(hfpath) - 1) = '\0'; } fd = -1; if (!have_pagepath) hostenv_pagepath = strdup(hfpath); while ((fd == -1) && strlen(hfpath)) { char *p; char *elemstart; if (hostenv_templatedir) { sprintf(filename, "%s/", hostenv_templatedir); } else { sprintf(filename, "%s/web/", xgetenv("XYMONHOME")); } p = strchr(hfpath, '/'); elemstart = hfpath; while (p) { *p = '\0'; strcat(filename, elemstart); strcat(filename, "_"); *p = '/'; p++; elemstart = p; p = strchr(elemstart, '/'); } strcat(filename, elemstart); strcat(filename, "_"); strcat(filename, head_or_foot); dbgprintf("Trying header/footer file '%s'\n", filename); fd = open(filename, O_RDONLY); if (fd == -1) { p = strrchr(hfpath, '/'); if (p == NULL) p = hfpath; *p = '\0'; } } xfree(hfpath); if (fd == -1) { /* Fall back to default head/foot file. */ if (hostenv_templatedir) { sprintf(filename, "%s/%s_%s", hostenv_templatedir, template, head_or_foot); } else { sprintf(filename, "%s/web/%s_%s", xgetenv("XYMONHOME"), template, head_or_foot); } dbgprintf("Trying header/footer file '%s'\n", filename); fd = open(filename, O_RDONLY); } if (fd != -1) { int n; fstat(fd, &st); templatedata = (char *) malloc(st.st_size + 1); *templatedata = '\0'; n = read(fd, templatedata, st.st_size); if (n > 0) templatedata[n] = '\0'; close(fd); output_parsed(output, templatedata, bgcolor, getcurrenttime(NULL)); xfree(templatedata); } else { fprintf(output, " \n
\n
%s is either missing or invalid, please create this file with your custom header
\n
", htmlquoted(filename)); } /* Check for bulletin files */ bulletinfile = (char *)malloc(strlen(xgetenv("XYMONHOME")) + strlen("/web/bulletin_") + strlen(head_or_foot)+1); sprintf(bulletinfile, "%s/web/bulletin_%s", xgetenv("XYMONHOME"), head_or_foot); fd = open(bulletinfile, O_RDONLY); if (fd != -1) { int n; fstat(fd, &st); templatedata = (char *) malloc(st.st_size + 1); *templatedata = '\0'; n = read(fd, templatedata, st.st_size); templatedata[n] = '\0'; close(fd); output_parsed(output, templatedata, bgcolor, getcurrenttime(NULL)); xfree(templatedata); } if (!have_pagepath) { xfree(hostenv_pagepath); hostenv_pagepath = NULL; } xfree(bulletinfile); MEMUNDEFINE(filename); } void showform(FILE *output, char *headertemplate, char *formtemplate, int color, time_t seltime, char *pretext, char *posttext) { /* Present the query form */ int formfile; char formfn[PATH_MAX]; sprintf(formfn, "%s/web/%s", xgetenv("XYMONHOME"), formtemplate); formfile = open(formfn, O_RDONLY); if (formfile >= 0) { char *inbuf; struct stat st; int n; fstat(formfile, &st); inbuf = (char *) malloc(st.st_size + 1); *inbuf = '\0'; n = read(formfile, inbuf, st.st_size); inbuf[n] = '\0'; close(formfile); if (headertemplate) headfoot(output, headertemplate, (hostenv_pagepath ? hostenv_pagepath : ""), "header", color); if (pretext) fprintf(output, "
%s
\n", pretext); output_parsed(output, inbuf, color, seltime); if (posttext) fprintf(output, "%s", posttext); if (headertemplate) headfoot(output, headertemplate, (hostenv_pagepath ? hostenv_pagepath : ""), "footer", color); xfree(inbuf); } } xymon-4.3.28/lib/test-endianness.c0000664000076400007640000000342011615341300017221 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Utility program to define endian-ness of the target system. */ /* */ /* Copyright (C) 2006-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: test-endianness.c 6712 2011-07-31 21:01:52Z storner $"; #include #include #include #include int main(int argc, char **argv) { unsigned int c; unsigned char cbuf[sizeof(c)]; int i; int outform = 1; if ((argc > 1) && (strcmp(argv[1], "--configh") == 0)) outform = 0; for (i=0; (i < sizeof(c)); i++) { cbuf[i] = (i % 2); } memcpy(&c, cbuf, sizeof(c)); if (c == 65537) { /* Big endian */ if (outform == 0) printf("#ifndef XYMON_BIG_ENDIAN\n#define XYMON_BIG_ENDIAN\n#endif\n"); else printf(" -DXYMON_BIG_ENDIAN"); } else if (c == 16777472) { /* Little endian */ if (outform == 0) printf("#ifndef XYMON_LITTLE_ENDIAN\n#define XYMON_LITTLE_ENDIAN\n#endif\n"); else printf(" -DXYMON_LITTLE_ENDIAN"); } else { fprintf(stderr, "UNKNOWN ENDIANNESS! testvalue is %u\n", c); } fflush(stdout); return 0; } xymon-4.3.28/lib/msort.h0000664000076400007640000000202011615341300015261 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __MSORT_H__ #define __MSORT_H__ typedef int (msortcompare_fn_t)(void **, void **); typedef void * (msortgetnext_fn_t)(void *); typedef void (msortsetnext_fn_t)(void *, void *); extern void *msort(void *head, msortcompare_fn_t comparefn, msortgetnext_fn_t getnext, msortsetnext_fn_t setnext); #endif xymon-4.3.28/lib/acklog.h0000664000076400007640000000216111615341300015363 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef _ACKLOG_H_ #define _ACKLOG_H_ /* Format of records in $XYMONACKDIR/acklog file (TAB separated) */ typedef struct ack_t { time_t acktime; int acknum; int duration; /* Minutes */ int acknum2; char *ackedby; char *hostname; char *testname; int color; char *ackmsg; int ackvalid; } ack_t; extern int havedoneacklog; extern void do_acklog(FILE *output, int maxcount, int maxminutes); #endif xymon-4.3.28/lib/run.h0000664000076400007640000000155112000046362014730 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __RUN_H__ #define __RUN_H__ extern int run_command(char *cmd, char *errortext, strbuffer_t *banner, int showcmd, int timeout); #endif xymon-4.3.28/lib/crondate.h0000664000076400007640000000164611615341300015731 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __CRONDATE_H__ #define __CRONDATE_H__ extern void * parse_cron_time(char * ch); extern void crondatefree(void *vcdate); extern void crongettime(void); extern int cronmatch(void *vcdate); #endif xymon-4.3.28/lib/notifylog.c0000664000076400007640000002661112603243142016141 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This displays the "notification" log. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* Host/test/color/start/end filtering code by Eric Schwimmer 2005 */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: notifylog.c 7678 2015-10-01 14:42:42Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" typedef struct notification_t { void *host; struct htnames_t *service; time_t eventtime; char *recipient; struct notification_t *next; } notification_t; static time_t convert_time(char *timestamp) { time_t event = 0; unsigned int year,month,day,hour,min,sec,count; struct tm timeinfo; count = sscanf(timestamp, "%u/%u/%u@%u:%u:%u", &year, &month, &day, &hour, &min, &sec); if(count != 6) { return -1; } if(year < 1970) { return 0; } else { memset(&timeinfo, 0, sizeof(timeinfo)); timeinfo.tm_year = year - 1900; timeinfo.tm_mon = month - 1; timeinfo.tm_mday = day; timeinfo.tm_hour = hour; timeinfo.tm_min = min; timeinfo.tm_sec = sec; timeinfo.tm_isdst = -1; event = mktime(&timeinfo); } return event; } static htnames_t *namehead = NULL; static htnames_t *getname(char *name, int createit) { htnames_t *walk; for (walk = namehead; (walk && strcmp(walk->name, name)); walk = walk->next) ; if (walk || (!createit)) return walk; walk = (htnames_t *)malloc(sizeof(htnames_t)); walk->name = strdup(name); walk->next = namehead; namehead = walk; return walk; } void do_notifylog(FILE *output, int maxcount, int maxminutes, char *fromtime, char *totime, char *pageregex, char *expageregex, char *hostregex, char *exhostregex, char *testregex, char *extestregex, char *rcptregex, char *exrcptregex) { FILE *notifylog; char notifylogfilename[PATH_MAX]; time_t firstevent = 0; time_t lastevent = getcurrenttime(NULL); notification_t *head, *walk; struct stat st; char l[MAX_LINE_LEN]; char title[200]; /* For the PCRE matching */ const char *errmsg = NULL; int errofs = 0; pcre *pageregexp = NULL; pcre *expageregexp = NULL; pcre *hostregexp = NULL; pcre *exhostregexp = NULL; pcre *testregexp = NULL; pcre *extestregexp = NULL; pcre *rcptregexp = NULL; pcre *exrcptregexp = NULL; if (maxminutes && (fromtime || totime)) { fprintf(output, "Only one time interval type is allowed!"); return; } if (fromtime) { firstevent = convert_time(fromtime); if(firstevent < 0) { fprintf(output,"Invalid 'from' time: %s", htmlquoted(fromtime)); return; } } else if (maxminutes) { firstevent = getcurrenttime(NULL) - maxminutes*60; } else { firstevent = getcurrenttime(NULL) - 86400; } if (totime) { lastevent = convert_time(totime); if (lastevent < 0) { fprintf(output,"Invalid 'to' time: %s", htmlquoted(totime)); return; } if (lastevent < firstevent) { fprintf(output,"'to' time must be after 'from' time."); return; } } if (!maxcount) maxcount = 100; if (pageregex && *pageregex) pageregexp = pcre_compile(pageregex, PCRE_CASELESS, &errmsg, &errofs, NULL); if (expageregex && *expageregex) expageregexp = pcre_compile(expageregex, PCRE_CASELESS, &errmsg, &errofs, NULL); if (hostregex && *hostregex) hostregexp = pcre_compile(hostregex, PCRE_CASELESS, &errmsg, &errofs, NULL); if (exhostregex && *exhostregex) exhostregexp = pcre_compile(exhostregex, PCRE_CASELESS, &errmsg, &errofs, NULL); if (testregex && *testregex) testregexp = pcre_compile(testregex, PCRE_CASELESS, &errmsg, &errofs, NULL); if (extestregex && *extestregex) extestregexp = pcre_compile(extestregex, PCRE_CASELESS, &errmsg, &errofs, NULL); if (rcptregex && *rcptregex) rcptregexp = pcre_compile(rcptregex, PCRE_CASELESS, &errmsg, &errofs, NULL); if (exrcptregex && *exrcptregex) exrcptregexp = pcre_compile(exrcptregex, PCRE_CASELESS, &errmsg, &errofs, NULL); sprintf(notifylogfilename, "%s/notifications.log", xgetenv("XYMONSERVERLOGS")); notifylog = fopen(notifylogfilename, "r"); if (notifylog && (stat(notifylogfilename, &st) == 0)) { time_t curtime; int done = 0; /* Find a spot in the notification log file close to where the firstevent time is */ fseeko(notifylog, 0, SEEK_END); do { /* Go back maxcount*80 bytes - one entry is ~80 bytes */ if (ftello(notifylog) > maxcount*80) { unsigned int uicurtime; fseeko(notifylog, -maxcount*80, SEEK_CUR); if (fgets(l, sizeof(l), notifylog) && /* Skip to start of line */ fgets(l, sizeof(l), notifylog)) { /* Sun Jan 7 10:29:08 2007 myhost.disk (130.225.226.90) foo@test.com 1168162147 100 */ sscanf(l, "%*s %*s %*u %*u:%*u:%*u %*u %*s %*s %*s %u %*d", &uicurtime); curtime = uicurtime; done = (curtime < firstevent); } else { fprintf(output, "Error reading logfile %s: %s\n", notifylogfilename, strerror(errno)); return; } } else { rewind(notifylog); done = 1; } } while (!done); } head = NULL; while (notifylog && (fgets(l, sizeof(l), notifylog))) { unsigned int etim; time_t eventtime; char hostsvc[MAX_LINE_LEN]; char recipient[MAX_LINE_LEN]; char *hostname, *svcname, *p; int itemsfound, pagematch, hostmatch, testmatch, rcptmatch; notification_t *newrec; void *eventhost; struct htnames_t *eventcolumn; int ovector[30]; itemsfound = sscanf(l, "%*s %*s %*u %*u:%*u:%*u %*u %s %*s %s %u %*d", hostsvc, recipient, &etim); eventtime = etim; if (itemsfound != 3) continue; if (eventtime < firstevent) continue; if (eventtime > lastevent) break; hostname = hostsvc; svcname = strrchr(hostsvc, '.'); if (svcname) { *svcname = '\0'; svcname++; } else svcname = ""; eventhost = hostinfo(hostname); if (!eventhost) continue; /* Don't report hosts that no longer exist */ eventcolumn = getname(svcname, 1); p = strchr(recipient, '['); if (p) *p = '\0'; if (pageregexp) { char *pagename; pagename = xmh_item_multi(eventhost, XMH_PAGEPATH); pagematch = 0; while (!pagematch && pagename) { pagematch = (pcre_exec(pageregexp, NULL, pagename, strlen(pagename), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0); pagename = xmh_item_multi(NULL, XMH_PAGEPATH); } } else pagematch = 1; if (!pagematch) continue; if (expageregexp) { char *pagename; pagename = xmh_item_multi(eventhost, XMH_PAGEPATH); pagematch = 0; while (!pagematch && pagename) { pagematch = (pcre_exec(expageregexp, NULL, pagename, strlen(pagename), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0); pagename = xmh_item_multi(NULL, XMH_PAGEPATH); } } else pagematch = 0; if (pagematch) continue; if (hostregexp) hostmatch = (pcre_exec(hostregexp, NULL, hostname, strlen(hostname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0); else hostmatch = 1; if (!hostmatch) continue; if (exhostregexp) hostmatch = (pcre_exec(exhostregexp, NULL, hostname, strlen(hostname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0); else hostmatch = 0; if (hostmatch) continue; if (testregexp) testmatch = (pcre_exec(testregexp, NULL, svcname, strlen(svcname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0); else testmatch = 1; if (!testmatch) continue; if (extestregexp) testmatch = (pcre_exec(extestregexp, NULL, svcname, strlen(svcname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0); else testmatch = 0; if (testmatch) continue; if (rcptregexp) rcptmatch = (pcre_exec(rcptregexp, NULL, recipient, strlen(recipient), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0); else rcptmatch = 1; if (!rcptmatch) continue; if (exrcptregexp) rcptmatch = (pcre_exec(exrcptregexp, NULL, recipient, strlen(recipient), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0); else rcptmatch = 0; if (rcptmatch) continue; newrec = (notification_t *) malloc(sizeof(notification_t)); newrec->host = eventhost; newrec->service = eventcolumn; newrec->eventtime = eventtime; newrec->recipient = strdup(recipient); newrec->next = head; head = newrec; } if (head) { char *bgcolors[2] = { "#000000", "#000066" }; int bgcolor = 0; int count; struct notification_t *lasttoshow = head; count=0; walk=head; do { count++; lasttoshow = walk; walk = walk->next; } while (walk && (counteventtime) / 60)); } else { sprintf(title, "%d notifications sent.", count); } fprintf(output, "

\n"); fprintf(output, "\n"); fprintf(output, "\n"); fprintf(output, "\n", htmlquoted(title)); fprintf(output, "\n"); for (walk=head; (walk != lasttoshow->next); walk=walk->next) { char *hostname = xmh_item(walk->host, XMH_HOSTNAME); fprintf(output, "\n", bgcolors[bgcolor]); bgcolor = ((bgcolor + 1) % 2); fprintf(output, "\n", ctime(&walk->eventtime)); fprintf(output, "\n", hostname); fprintf(output, "\n", walk->service->name); fprintf(output, "\n", walk->recipient); } fprintf(output, "
%s
TimeHostServiceRecipient
%s%s%s%s
\n"); /* Clean up */ walk = head; do { struct notification_t *tmp = walk; walk = walk->next; xfree(tmp->recipient); xfree(tmp); } while (walk); } else { /* No notifications during the past maxminutes */ if (notifylog) sprintf(title, "No notifications sent in the last %d minutes", maxminutes); else strcpy(title, "No notifications logged"); fprintf(output, "

\n"); fprintf(output, "\n", title); fprintf(output, "\n"); fprintf(output, "\n", htmlquoted(title)); fprintf(output, "\n"); fprintf(output, "
%s
\n"); fprintf(output, "
\n"); } if (notifylog) fclose(notifylog); if (pageregexp) pcre_free(pageregexp); if (expageregexp) pcre_free(expageregexp); if (hostregexp) pcre_free(hostregexp); if (exhostregexp) pcre_free(exhostregexp); if (testregexp) pcre_free(testregexp); if (extestregexp) pcre_free(extestregexp); if (rcptregexp) pcre_free(rcptregexp); if (exrcptregexp) pcre_free(exrcptregexp); } xymon-4.3.28/lib/stackio.c0000664000076400007640000003731212611256373015575 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains routines for reading configuration files with "include"s. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: stackio.c 7705 2015-10-19 21:13:31Z jccleaver $"; #include #include #include #include #include #include #include #include #include "libxymon.h" typedef struct filelist_t { char *filename; time_t mtime; size_t fsize; struct filelist_t *next; } filelist_t; typedef struct fgetsbuf_t { FILE *fd; char inbuf[4096+1]; char *inbufp; int moretoread; struct fgetsbuf_t *next; } fgetsbuf_t; static fgetsbuf_t *fgetshead = NULL; typedef struct stackfd_t { FILE *fd; filelist_t **listhead; struct stackfd_t *next; } stackfd_t; static stackfd_t *fdhead = NULL; static char *stackfd_base = NULL; static char *stackfd_mode = NULL; static htnames_t *fnlist = NULL; /* * initfgets() and unlimfgets() implements a fgets() style * input routine that can handle arbitrarily long input lines. * Buffer space for the input is dynamically allocated and * expanded, until the input hits a newline character. * Simultaneously, lines ending with a '\' character are * merged into one line, allowing for transparent handling * of very long lines. * * This interface is also used by the stackfgets() routine. * * If you open a file directly, after getting the FILE * descriptor call initfgets(FILE). Then use unlimfgets() * to read data one line at a time. You must read until * unlimfgets() returns NULL (at which point you should not * call unlimfgets() again with this fd). */ int initfgets(FILE *fd) { fgetsbuf_t *newitem; newitem = (fgetsbuf_t *)malloc(sizeof(fgetsbuf_t)); *(newitem->inbuf) = '\0'; newitem->inbufp = newitem->inbuf; newitem->moretoread = 1; newitem->fd = fd; newitem->next = fgetshead; fgetshead = newitem; return 0; } char *unlimfgets(strbuffer_t *buffer, FILE *fd) { fgetsbuf_t *fg; size_t n; char *eoln = NULL; for (fg = fgetshead; (fg && (fg->fd != fd)); fg = fg->next) ; if (!fg) { errprintf("umlimfgets() called with bad input FD\n"); return NULL; } /* End of file ? */ if (!(fg->moretoread) && (*(fg->inbufp) == '\0')) { if (fg == fgetshead) { fgetshead = fgetshead->next; free(fg); } else { fgetsbuf_t *prev; for (prev = fgetshead; (prev->next != fg); prev = prev->next) ; prev->next = fg->next; free(fg); } return NULL; } /* Make sure the output buffer is empty */ clearstrbuffer(buffer); while (!eoln && (fg->moretoread || *(fg->inbufp))) { int continued = 0; if (*(fg->inbufp)) { /* Have some data in the buffer */ eoln = strchr(fg->inbufp, '\n'); if (eoln) { /* See if there's a continuation character just before the eoln */ char *contchar = eoln-1; while ((contchar > fg->inbufp) && isspace((int)*contchar) && (*contchar != '\\')) contchar--; continued = (*contchar == '\\'); if (continued) { *contchar = '\0'; addtobuffer(buffer, fg->inbufp); fg->inbufp = eoln+1; eoln = NULL; } else { char savech = *(eoln+1); *(eoln+1) = '\0'; addtobuffer(buffer, fg->inbufp); *(eoln+1) = savech; fg->inbufp = eoln+1; } } else { /* No newline in buffer, so add all of it to the output buffer */ addtobuffer(buffer, fg->inbufp); /* Input buffer is now empty */ *(fg->inbuf) = '\0'; fg->inbufp = fg->inbuf; } } if (!eoln && !continued) { /* Get data for the input buffer */ char *inpos = fg->inbuf; size_t insize = sizeof(fg->inbuf); /* If the last byte we read was a continuation char, we must do special stuff. * * Mike Romaniw discovered that if we hit an input with a newline exactly at * the point of a buffer refill, then strlen(*buffer) is 0, and contchar then * points before the start of the buffer. Bad. But this can only happen when * the previous char WAS a newline, and hence it is not a continuation line. * So the simple fix is to only do the cont-char stuff if **buffer is not NUL. * Hence the test for both *buffer and **buffer. */ if (STRBUF(buffer) && *STRBUF(buffer)) { char *contchar = STRBUF(buffer) + STRBUFLEN(buffer) - 1; while ((contchar > STRBUF(buffer)) && isspace((int)*contchar) && (*contchar != '\\')) contchar--; if (*contchar == '\\') { /* * Remove the cont. char from the output buffer, and stuff it into * the input buffer again - so we can check if there's a new-line coming. */ strbufferchop(buffer, 1); *(fg->inbuf) = '\\'; inpos++; insize--; } } n = fread(inpos, 1, insize-1, fd); *(inpos + n) = '\0'; fg->inbufp = fg->inbuf; if (n < insize-1) fg->moretoread = 0; } } return STRBUF(buffer); } FILE *stackfopen(char *filename, char *mode, void **v_listhead) { FILE *newfd; stackfd_t *newitem; char stackfd_filename[PATH_MAX]; filelist_t **listhead = (filelist_t **)v_listhead; MEMDEFINE(stackfd_filename); if (fdhead == NULL) { char *p; stackfd_base = strdup(filename); p = strrchr(stackfd_base, '/'); if (p) *(p+1) = '\0'; stackfd_mode = strdup(mode); strcpy(stackfd_filename, filename); } else { if (*filename == '/') strcpy(stackfd_filename, filename); else sprintf(stackfd_filename, "%s/%s", stackfd_base, filename); } dbgprintf("Opening file %s\n", stackfd_filename); newfd = fopen(stackfd_filename, stackfd_mode); if (newfd != NULL) { newitem = (stackfd_t *) malloc(sizeof(stackfd_t)); newitem->fd = newfd; newitem->listhead = listhead; newitem->next = fdhead; fdhead = newitem; initfgets(newfd); if (listhead) { struct filelist_t *newlistitem; struct stat st; fstat(fileno(newfd), &st); newlistitem = (filelist_t *)malloc(sizeof(filelist_t)); newlistitem->filename = strdup(stackfd_filename); newlistitem->mtime = st.st_mtime; newlistitem->fsize = st.st_size; newlistitem->next = *listhead; *listhead = newlistitem; } } MEMUNDEFINE(stackfd_filename); return newfd; } int stackfclose(FILE *fd) { int result; stackfd_t *olditem; if (fd != NULL) { /* Close all */ while (fdhead != NULL) { olditem = fdhead; fdhead = fdhead->next; fclose(olditem->fd); xfree(olditem); } xfree(stackfd_base); xfree(stackfd_mode); while (fnlist) { htnames_t *tmp = fnlist; fnlist = fnlist->next; xfree(tmp->name); xfree(tmp); } result = 0; } else { olditem = fdhead; fdhead = fdhead->next; result = fclose(olditem->fd); xfree(olditem); } return result; } int stackfmodified(void *v_listhead) { /* Walk the list of filenames, and see if any have changed */ filelist_t *walk; struct stat st; for (walk=(filelist_t *)v_listhead; (walk); walk = walk->next) { if (stat(walk->filename, &st) == -1) { dbgprintf("File %s no longer exists\n", walk->filename); return 1; /* File has disappeared */ } if (st.st_mtime != walk->mtime) { dbgprintf("File %s new timestamp\n", walk->filename); return 1; /* Timestamp has changed */ } if (S_ISREG(st.st_mode) && (st.st_size != walk->fsize)) { dbgprintf("File %s new size\n", walk->filename); return 1; /* Size has changed */ } } return 0; } void stackfclist(void **v_listhead) { /* Free the list of filenames */ filelist_t *tmp; if ((v_listhead == NULL) || (*v_listhead == NULL)) return; while (*v_listhead) { tmp = (filelist_t *) *v_listhead; *v_listhead = ((filelist_t *) *v_listhead)->next; xfree(tmp->filename); xfree(tmp); } *v_listhead = NULL; } static int namecompare(const void *v1, const void *v2) { char **n1 = (char **)v1; char **n2 = (char **)v2; /* Sort in reverse order, so when we add them to the list in LIFO, it will be alpha-sorted */ return -strcmp(*n1, *n2); } static void addtofnlist(char *dirname, int is_optional, void **v_listhead) { filelist_t **listhead = (filelist_t **)v_listhead; DIR *dirfd; struct dirent *d; struct stat st; char dirfn[PATH_MAX], fn[PATH_MAX]; char **fnames = NULL; int fnsz = 0; int i; if (*dirname == '/') strcpy(dirfn, dirname); else sprintf(dirfn, "%s/%s", stackfd_base, dirname); if ((dirfd = opendir(dirfn)) == NULL) { if (!is_optional) errprintf("WARNING: Cannot open directory %s\n", dirfn); else dbgprintf("addtofnlist(): Cannot open directory %s\n", dirfn); return; } /* Add the directory itself to the list of files we watch for modifications */ if (listhead) { filelist_t *newlistitem; stat(dirfn, &st); newlistitem = (filelist_t *)malloc(sizeof(filelist_t)); newlistitem->filename = strdup(dirfn); newlistitem->mtime = st.st_mtime; newlistitem->fsize = 0; /* We don't check sizes of directories */ newlistitem->next = *listhead; *listhead = newlistitem; } while ((d = readdir(dirfd)) != NULL) { int fnlen = strlen(d->d_name); /* Skip all dot-files */ if (*(d->d_name) == '.') continue; /* Skip editor backups - file ending with '~' */ if (*(d->d_name + fnlen - 1) == '~') continue; /* Skip RCS files - they end with ",v" */ if ((fnlen >= 2) && (strcmp(d->d_name + fnlen - 2, ",v") == 0)) continue; /* Skip any documentation file starting with README */ if (strncmp(d->d_name, "README", 6) == 0) continue; /* Skip Debian installer left-overs - they end with ".dpkg-new" or .dpkg-orig */ if ((fnlen >= 9) && (strcmp(d->d_name + fnlen - 9, ".dpkg-new") == 0)) continue; if ((fnlen >= 10) && (strcmp(d->d_name + fnlen - 10, ".dpkg-orig") == 0)) continue; /* Skip RPM package debris - they end with ".rpmsave", .rpmnew, or .rpmorig */ if ((fnlen >= 8) && ((strcmp(d->d_name + fnlen - 8, ".rpmsave") == 0) || (strcmp(d->d_name + fnlen - 8, ".rpmorig") == 0) ) ) continue; if ((fnlen >= 7) && (strcmp(d->d_name + fnlen - 7, ".rpmnew") == 0)) continue; sprintf(fn, "%s/%s", dirfn, d->d_name); if (stat(fn, &st) == -1) continue; if (S_ISDIR(st.st_mode)) { /* Skip RCS sub-directories */ if (strcmp(d->d_name, "RCS") == 0) continue; addtofnlist(fn, 0, v_listhead); /* this directory is optional, but opening up files that do exist isn't */ } /* Skip everything that isn't a regular file */ if (!S_ISREG(st.st_mode)) continue; if (fnsz == 0) fnames = (char **)malloc(2*sizeof(char **)); else fnames = (char **)realloc(fnames, (fnsz+2)*sizeof(char **)); fnames[fnsz] = strdup(fn); fnsz++; } closedir(dirfd); if (fnsz) { qsort(fnames, fnsz, sizeof(char *), namecompare); for (i=0; (iname = fnames[i]; newitem->next = fnlist; fnlist = newitem; } xfree(fnames); } } char *stackfgets(strbuffer_t *buffer, char *extraincl) { char *result; int optional = 0; result = unlimfgets(buffer, fdhead->fd); if (result) { char *bufpastwhitespace = STRBUF(buffer) + strspn(STRBUF(buffer), " \t"); if (strncmp(bufpastwhitespace, "optional", 8) == 0) { optional = 1; bufpastwhitespace += 8 + strspn(bufpastwhitespace+8, " \t"); } if ( (strncmp(bufpastwhitespace, "include ", 8) == 0) || (strncmp(bufpastwhitespace, "include\t", 8) == 0) || (extraincl && (strncmp(bufpastwhitespace, extraincl, strlen(extraincl)) == 0)) ) { char *newfn, *eol, eolchar = '\0'; eol = bufpastwhitespace + strcspn(bufpastwhitespace, "\r\n"); if (eol) { eolchar = *eol; *eol = '\0'; } newfn = bufpastwhitespace + strcspn(bufpastwhitespace, " \t"); newfn += strspn(newfn, " \t"); while (*newfn && isspace(*(newfn + strlen(newfn) - 1))) *(newfn + strlen(newfn) -1) = '\0'; if (*newfn && (stackfopen(newfn, "r", (void **)fdhead->listhead) != NULL)) return stackfgets(buffer, extraincl); else { if (!optional) errprintf("WARNING: Cannot open include file '%s', line was: %s\n", newfn, STRBUF(buffer)); else dbgprintf("stackfgets(): Cannot open include file '%s', line was: %s\n", newfn, STRBUF(buffer)); if (eol) *eol = eolchar; return result; } } else if ((strncmp(bufpastwhitespace, "directory ", 10) == 0) || (strncmp(bufpastwhitespace, "directory\t", 10) == 0)) { char *dirfn, *eol, eolchar = '\0'; eol = bufpastwhitespace + strcspn(bufpastwhitespace, "\r\n"); if (eol) { eolchar = *eol; *eol = '\0'; } dirfn = bufpastwhitespace + 9; dirfn += strspn(dirfn, " \t"); while (*dirfn && isspace(*(dirfn + strlen(dirfn) - 1))) *(dirfn + strlen(dirfn) -1) = '\0'; if (*dirfn) addtofnlist(dirfn, optional, (void **)fdhead->listhead); if (fnlist && (stackfopen(fnlist->name, "r", (void **)fdhead->listhead) != NULL)) { htnames_t *tmp = fnlist; fnlist = fnlist->next; xfree(tmp->name); xfree(tmp); return stackfgets(buffer, extraincl); } else if (fnlist) { htnames_t *tmp = fnlist; if (!optional) errprintf("WARNING: Cannot open include file '%s', line was: %s\n", fnlist->name, buffer); else dbgprintf("stackfgets(): Cannot open include file '%s', line was: %s\n", fnlist->name, buffer); fnlist = fnlist->next; xfree(tmp->name); xfree(tmp); if (eol) *eol = eolchar; return result; } else { /* Empty directory include - return a blank line */ dbgprintf("stackfgets(): Directory %s was empty\n", dirfn); *result = '\0'; return result; } } } else if (result == NULL) { /* end-of-file on read */ stackfclose(NULL); if (fnlist) { if (stackfopen(fnlist->name, "r", (void **)fdhead->listhead) != NULL) { htnames_t *tmp = fnlist; fnlist = fnlist->next; xfree(tmp->name); xfree(tmp); return stackfgets(buffer, extraincl); } else { htnames_t *tmp = fnlist; if (!optional) errprintf("WARNING: Cannot open include file '%s', line was: %s\n", fnlist->name, buffer); else dbgprintf("stackfgets(): Cannot open include file '%s', line was: %s\n", fnlist->name, buffer); fnlist = fnlist->next; xfree(tmp->name); xfree(tmp); return result; } } else if (fdhead != NULL) return stackfgets(buffer, extraincl); else return NULL; } return result; } #ifdef STANDALONE int main(int argc, char *argv[]) { char *fn, *p; char cmd[1024]; FILE *fd; strbuffer_t *inbuf = newstrbuffer(0); void *listhead = NULL; int done, linenum; fn = strdup(argv[1]); strcpy(cmd, "!"); done = 0; while (!done) { if (*cmd == '!') { fd = stackfopen(fn, "r", &listhead); linenum = 1; if (!fd) { errprintf("Cannot open file %s\n", fn); continue; } while (stackfgets(inbuf, NULL)) { linenum++; printf("%s", STRBUF(inbuf)); } stackfclose(fd); } else if (*cmd == '?') { filelist_t *walk = (filelist_t *)listhead; while (walk) { printf("%s %lu\n", walk->filename, (unsigned long)walk->fsize); walk = walk->next; } if (stackfmodified(listhead)) printf("File(s) have been modified\n"); else printf("No changes\n"); } else if (*cmd == '.') { done = 1; continue; } else { xfree(fn); fn = strdup(cmd); stackfclist(&listhead); strcpy(cmd, "!"); continue; } printf("\nCmd: "); fflush(stdout); if (fgets(cmd, sizeof(cmd), stdin)) { p = strchr(cmd, '\n'); if (p) *p = '\0'; } else done = 1; } xfree(fn); stackfclist(&listhead); return 0; } #endif xymon-4.3.28/lib/htmllog.h0000664000076400007640000000331111615341300015567 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __HTMLLOG_H__ #define __HTMLLOG_H__ #include enum histbutton_t { HIST_TOP, HIST_BOTTOM, HIST_NONE }; extern enum histbutton_t histlocation; extern void generate_html_log(char *hostname, char *displayname, char *service, char *ip, int color, int flapping, char *sender, char *flags, time_t logtime, char *timesincechange, char *firstline, char *restofmsg, char *modifiers, time_t acktime, char *ackmsg, char *acklist, time_t disabletime, char *dismsg, int is_history, int wantserviceid, int htmlfmt, int locatorbased, char *multigraphs, char *linktoclient, char *nkprio, char *nkttgroup, char *nkttextra, int graphtime, FILE *output); extern char *alttag(char *columnname, int color, int acked, int propagate, char *age); extern void setdocurl(char *url); extern void setdoctarget(char *target); extern char *hostnamehtml(char *hostname, char *defaultlink, int usetooltip); #endif xymon-4.3.28/lib/xymonrrd.h0000664000076400007640000000350611630612042016012 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __XYMONRRD_H__ #define __XYMONRRD_H__ #include /* This is for mapping a service -> an RRD file */ typedef struct { char *svcname; char *xymonrrdname; } xymonrrd_t; /* This is for displaying an RRD file. */ typedef struct { char *xymonrrdname; char *xymonpartname; int maxgraphs; } xymongraph_t; typedef enum { HG_WITHOUT_STALE_RRDS, HG_WITH_STALE_RRDS } hg_stale_rrds_t; typedef enum { HG_PLAIN_LINK, HG_META_LINK } hg_link_t; typedef struct rrdtpldata_t { char *template; void *dsnames; /* Tree of tplnames_t records */ } rrdtpldata_t; typedef struct rrdtplnames_t { char *dsnam; int idx; } rrdtplnames_t; extern xymonrrd_t *xymonrrds; extern xymongraph_t *xymongraphs; extern xymonrrd_t *find_xymon_rrd(char *service, char *flags); extern xymongraph_t *find_xymon_graph(char *rrdname); extern char *xymon_graph_data(char *hostname, char *dispname, char *service, int bgcolor, xymongraph_t *graphdef, int itemcount, hg_stale_rrds_t nostale, hg_link_t wantmeta, int locatorbased, time_t starttime, time_t endtime); extern rrdtpldata_t *setup_template(char *params[]); #endif xymon-4.3.28/lib/cgi.c0000664000076400007640000002465512666146167014721 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains routines for handling CGI requests. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: cgi.c 7949 2016-03-03 23:44:55Z jccleaver $"; #include #include #include #include #include #include #include #include "libxymon.h" #define MAX_REQ_SIZE (1024*1024) enum cgi_method_t cgi_method = CGI_OTHER; static char *cgi_error_text = NULL; static void lcgi_error(char *msg) { cgi_error_text = msg; } char *cgi_error(void) { char *result = cgi_error_text; cgi_error_text = NULL; return result; } int cgi_ispost() { char *method = getenv("REQUEST_METHOD"); if (method && (strcasecmp(method, "POST") == 0)) { cgi_method = CGI_POST; /* might as well set here */ return 1; } return 0; } cgidata_t *cgi_request(void) { char *method = NULL; char *reqdata = NULL; char *conttype = NULL; char *token; cgidata_t *head = NULL, *tail = NULL; cgi_error_text = NULL; cgi_method = CGI_OTHER; method = getenv("REQUEST_METHOD"); if (!method) { lcgi_error("CGI violation - no REQUEST_METHOD\n"); return NULL; } conttype = getenv("CONTENT_TYPE"); if (strcasecmp(method, "POST") == 0) { char *contlen = getenv("CONTENT_LENGTH"); int postsize = 0; cgi_method = CGI_POST; if (contlen) { postsize = atoi(contlen); } else { lcgi_error("CGI violation - no CONTENT_LENGTH\n"); return NULL; } if (postsize < MAX_REQ_SIZE) { size_t n; reqdata = (char *)malloc(postsize+1); n = fread(reqdata, 1, postsize, stdin); if (n < postsize) { lcgi_error("Error reading POST data\n"); return NULL; } reqdata[n] = '\0'; } else { lcgi_error("Request too large\n"); return NULL; } } else if (strcasecmp(method, "GET") == 0) { char *q = getenv("QUERY_STRING"); cgi_method = CGI_GET; if (q) { if (strlen(q) < MAX_REQ_SIZE) { reqdata = strdup(q); } else { lcgi_error("Request too large\n"); return NULL; } } else { /* This is OK - we may not have any query */ return NULL; } } dbgprintf("CGI: Request method='%s', data='%s'\n", method, textornull(reqdata)); if ((cgi_method == CGI_GET) || (conttype && (strcasecmp(conttype, "application/x-www-form-urlencoded") == 0))) { token = strtok(reqdata, "&"); while (token) { cgidata_t *newitem = (cgidata_t *)calloc(1, sizeof(cgidata_t)); char *val; val = strchr(token, '='); if (val) { *val = '\0'; val = urlunescape(val+1); } newitem->name = strdup(token); newitem->value = strdup(val ? val : ""); if (!tail) { head = newitem; } else { tail->next = newitem; } tail = newitem; token = strtok(NULL, "&"); } } else if ((cgi_method == CGI_POST) && (conttype && (strcasecmp(conttype, "multipart/form-data") == 0))) { char *bol, *eoln, *delim; char eolnchar = '\n'; char *currelembegin = NULL, *currelemend = NULL; cgidata_t *newitem = NULL; delim = reqdata; eoln = strchr(delim, '\n'); if (!eoln) return NULL; *eoln = '\0'; delim = strdup(reqdata); *eoln = '\n'; if (*(delim + strlen(delim) - 1) == '\r') { eolnchar = '\r'; *(delim + strlen(delim) - 1) = '\0'; } bol = reqdata; do { eoln = strchr(bol, eolnchar); if (eoln) *eoln = '\0'; if (strncmp(bol, delim, strlen(delim)) == 0) { if (newitem && currelembegin && (currelemend >= currelembegin)) { /* Finish off the current item */ char savech; savech = *currelemend; *currelemend = '\0'; newitem->value = strdup(currelembegin); *currelemend = savech; currelembegin = currelemend = NULL; } if (strcmp(bol+strlen(delim), "--") != 0) { /* New element */ newitem = (cgidata_t *)calloc(1, sizeof(cgidata_t)); if (!tail) head = newitem; else tail->next = newitem; tail = newitem; } else { /* No more elements, end of input */ newitem = NULL; bol = NULL; continue; } } else if (newitem && (strncasecmp(bol, "Content-Disposition:", 20) == 0)) { char *tok; tok = strtok(bol, ";\t "); while (tok) { if (strncasecmp(tok, "name=", 5) == 0) { char *name; name = tok+5; if (*name == '\"') { name++; *(name + strlen(name) - 1) = '\0'; } newitem->name = strdup(name); } else if (strncasecmp(tok, "filename=", 9) == 0) { char *filename; filename = tok+9; if (*filename == '\"') { filename++; *(filename + strlen(filename) - 1) = '\0'; } newitem->filename = strdup(filename); } tok = strtok(NULL, ";\t "); } } else if (newitem && (strncasecmp(bol, "Content-Type:", 12) == 0)) { } else if (newitem && !currelembegin && (*bol == '\0')) { /* End of headers for one element */ if (eoln) { currelembegin = eoln+1; if ((eolnchar == '\r') && (*currelembegin == '\n')) currelembegin++; } currelemend = currelembegin; } else if (newitem && currelembegin) { currelemend = (eoln ? eoln+1 : bol + strlen(bol)); } if (eoln) { bol = eoln+1; if ((eolnchar == '\r') && (*bol == '\n')) bol++; } else { bol = NULL; } } while (bol && (*bol)); if (newitem) { if (!newitem->name) newitem->name = ""; if (!newitem->value) newitem->value = ""; } } else { /* Raw data - return a single record to caller */ head = (cgidata_t *)calloc(1, sizeof(cgidata_t)); head->name = strdup(""); head->value = reqdata ? strdup(reqdata) : NULL; } if (reqdata) xfree(reqdata); return head; } char *csp_header(const char *str) { char *csppol = NULL; char *returnstr = NULL; if (getenv("XYMON_NOCSPHEADER")) return NULL; if (strncmp(str, "enadis", 6) == 0) csppol = strdup("script-src 'self' 'unsafe-inline'; connect-src 'self'; form-action 'self'; sandbox allow-forms allow-scripts allow-same-origin allow-modals allow-popups;"); else if (strncmp(str, "useradm", 7) == 0) csppol = strdup("script-src 'self'; connect-src 'self'; form-action 'self';"); else if (strncmp(str, "chpasswd", 8) == 0) csppol = strdup("script-src 'self'; connect-src 'self'; form-action 'self';"); else if (strncmp(str, "ackinfo", 7) == 0) csppol = strdup("script-src 'self'; connect-src 'self'; form-action 'self';"); else if (strncmp(str, "acknowledge", 11) == 0) csppol = strdup("script-src 'self'; connect-src 'self'; form-action 'self';"); else if (strncmp(str, "criticaleditor", 14) == 0) csppol = strdup("script-src 'self'; connect-src 'self'; form-action 'self';"); else if (strncmp(str, "svcstatus-trends", 16) == 0) csppol = strdup("script-src 'self' 'unsafe-inline'; connect-src 'self'; form-action 'self'; sandbox allow-forms allow-scripts;"); else if (strncmp(str, "svcstatus-info", 14) == 0) csppol = strdup("script-src 'self' 'unsafe-inline'; connect-src 'self'; form-action 'self'; sandbox allow-forms allow-same-origin allow-scripts allow-modals allow-popups;"); else if (strncmp(str, "svcstatus", 9) == 0) csppol = strdup("script-src 'self'; connect-src 'self'; form-action 'self'; sandbox allow-forms allow-same-origin;"); else if (strncmp(str, "historylog", 10) == 0) csppol = strdup("script-src 'self'; connect-src 'self'; form-action 'self'; sandbox allow-forms;"); else { errprintf(" csp_header: page %s not listed, no CSP returned\n", str); } if ((!csppol) || (*csppol == '\0')) return NULL; returnstr = (char *)malloc(3 * strlen(csppol) + 512); snprintf(returnstr, (3 * strlen(csppol) + 512), "Content-Security-Policy: %s\nX-Content-Security-Policy: %s\nX-Webkit-CSP: %s\n", csppol, csppol, csppol); dbgprintf("CSP return is %s", returnstr); return returnstr; } int cgi_refererok(char *expected) { static char cgi_checkstr[1024]; int isok = 0; char *p, *httphost; p = getenv("HTTP_REFERER"); dbgprintf(" - checking if referer is OK (http_referer: %s, http_host: %s, xymonwebhost: %s, checkstr: %s\n", textornull(p), textornull(getenv("HTTP_HOST")), textornull(xgetenv("XYMONWEBHOST")), textornull(expected)); if (!p) return 0; /* If passed NULL, just check that there _is_ a REFERER */ if (!expected) return 1; httphost = getenv("HTTP_HOST"); if (!httphost) { if (strcmp(xgetenv("XYMONWEBHOST"), "http://localhost") != 0) { /* If XYMONWEBHOST is set by the admin, use that */ snprintf(cgi_checkstr, sizeof(cgi_checkstr), "%s%s", getenv("XYMONWEBHOST"), expected); if (strncmp(p, cgi_checkstr, strlen(cgi_checkstr)) == 0) isok = 1; } else { errprintf("Disallowed request due to missing HTTP_HOST variable\n"); return 0; } } else { /* skip the protocol specifier, which HTTP_REFERER has but HTTP_HOST doesn't */ p += (strncasecmp(p, "https://", 8) == 0) ? 8 : (strncasecmp(p, "http://", 7) == 0) ? 7 : 0; if (*p == '\0') { errprintf("Disallowed request due to unexpected referer '%s'\n", getenv("HTTP_REFERER")); return 0; } snprintf(cgi_checkstr, sizeof(cgi_checkstr), "%s%s", httphost, expected); if (strncmp(p, cgi_checkstr, strlen(cgi_checkstr)) == 0) isok = 1; } if (!isok) dbgprintf("Disallowed request due to unexpected referer '%s', wanted '%s' (originally '%s')\n", p, cgi_checkstr, expected); return isok; } char *get_cookie(char *cookiename) { static char *ckdata = NULL; char *tok, *p; int n; /* If no cookie, just return NULL */ p = getenv("HTTP_COOKIE"); if (!p) return NULL; if (ckdata) xfree(ckdata); n = strlen(cookiename); /* Split the cookie variable into elements, separated by ";" and possible space. */ ckdata = strdup(p); tok = strtok(ckdata, "; "); while (tok) { if ((strncmp(cookiename, tok, n) == 0) && (*(tok+n) == '=')) { /* Got it */ return (tok+n+1); } tok = strtok(NULL, "; "); } xfree(ckdata); ckdata = NULL; return NULL; } xymon-4.3.28/lib/sig.c0000664000076400007640000000746712000773065014724 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains routines for handling of signals and crashes. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: sig.c 7085 2012-07-16 11:08:37Z storner $"; #include #include #include #include #include #include #include #include #include #include "libxymon.h" /* Data used while crashing - cannot depend on the stack being usable */ static char signal_xymoncmd[PATH_MAX]; static char signal_xymondserver[1024]; static char signal_msg[1024]; static char signal_tmpdir[PATH_MAX]; static void sigsegv_handler(int signum) { /* * This is a signal handler. Only a very limited number of * library routines can be safely used here, according to * Posix: http://www.opengroup.org/onlinepubs/007904975/functions/xsh_chap02_04.html#tag_02_04_03 * Do not use string, stdio etc. - just basic system calls. * That is why we need to setup all of the strings in advance. */ signal(signum, SIG_DFL); /* * Try to fork a child to send in an alarm message. * If the fork fails, then just attempt to exec() the XYMON command */ if (fork() <= 0) { execl(signal_xymoncmd, "xymon-signal", signal_xymondserver, signal_msg, NULL); } /* Dump core and abort */ if (chdir(signal_tmpdir) == 0) {}; /* Cannot chdir? Well, abort anyway */ abort(); } static void sigusr2_handler(int signum) { /* SIGUSR2 toggles debugging */ if (debug) { dbgprintf("Debug OFF\n"); debug = 0; } else { debug = 1; dbgprintf("Debug ON\n"); } } void setup_signalhandler(char *programname) { struct rlimit lim; struct sigaction sa; MEMDEFINE(signal_xymoncmd); MEMDEFINE(signal_xymondserver); MEMDEFINE(signal_tmpdir); MEMDEFINE(signal_msg); memset(&sa, 0, sizeof(sa)); sa.sa_handler = sigsegv_handler; /* * Try to allow ourselves to generate core files */ getrlimit(RLIMIT_CORE, &lim); lim.rlim_cur = RLIM_INFINITY; setrlimit(RLIMIT_CORE, &lim); if (xgetenv("XYMON") == NULL) return; if (xgetenv("XYMSRV") == NULL) return; /* * Used inside signal-handler. Must be setup in * advance. */ strcpy(signal_xymoncmd, xgetenv("XYMON")); strcpy(signal_xymondserver, xgetenv("XYMSRV")); strcpy(signal_tmpdir, xgetenv("XYMONTMP")); sprintf(signal_msg, "status %s.%s red - Program crashed\n\nFatal signal caught!\n", (xgetenv("MACHINE") ? xgetenv("MACHINE") : "XYMSERVERS"), programname); sigaction(SIGSEGV, &sa, NULL); sigaction(SIGILL, &sa, NULL); #ifdef SIGBUS sigaction(SIGBUS, &sa, NULL); #endif /* * After lengthy debugging and perusing of mail archives: * Need to ignore SIGPIPE since FreeBSD (and others?) can throw this * on a write() instead of simply returning -EPIPE like any sane * OS would. */ signal(SIGPIPE, SIG_IGN); /* Ignore SIGUSR1 unless explicitly set by main program */ signal (SIGUSR1, SIG_IGN); /* SIGUSR2 toggles debugging */ memset(&sa, 0, sizeof(sa)); sa.sa_handler = sigusr2_handler; sigaction(SIGUSR2, &sa, NULL); } xymon-4.3.28/lib/errormsg.c0000664000076400007640000001130312504126500015755 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains routines for error- and debug-message display. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: errormsg.c 7612 2015-03-24 00:18:08Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" char *errbuf = NULL; static char msg[4096]; static char timestr[20]; static size_t timesize = sizeof(timestr); static struct timeval now; static time_t then = 0; int save_errbuf = 1; static unsigned int errbufsize = 0; static char *errappname = NULL; int debug = 0; static FILE *tracefd = NULL; static FILE *debugfd = NULL; void errprintf(const char *fmt, ...) { va_list args; gettimeofday(&now, NULL); if (now.tv_sec != then) { strftime(timestr, timesize, "%Y-%m-%d %H:%M:%S", localtime(&now.tv_sec)); then = now.tv_sec; } fprintf(stderr, "%s.%06d ", timestr, (int) now.tv_usec); if (errappname) fprintf(stderr, "%s ", errappname); va_start(args, fmt); vsnprintf(msg, sizeof(msg), fmt, args); va_end(args); fprintf(stderr, "%s", msg); fflush(stderr); if (save_errbuf) { if (errbuf == NULL) { errbufsize = 8192; errbuf = (char *) malloc(errbufsize); *errbuf = '\0'; } else if ((strlen(errbuf) + strlen(msg)) > errbufsize) { errbufsize += 8192; errbuf = (char *) realloc(errbuf, errbufsize); } strcat(errbuf, msg); } } void real_dbgprintf(const char *fmt, ...) { va_list args; gettimeofday(&now, NULL); if (!debugfd) debugfd = stdout; if (now.tv_sec != then) { strftime(timestr, timesize, "%Y-%m-%d %H:%M:%S", localtime(&now.tv_sec)); then = now.tv_sec; } fprintf(debugfd, "%lu %s.%06d ", (unsigned long)getpid(), timestr, (int) now.tv_usec); va_start(args, fmt); vfprintf(debugfd, fmt, args); va_end(args); fflush(debugfd); } void flush_errbuf(void) { if (errbuf) xfree(errbuf); errbuf = NULL; } void set_debugfile(char *fn, int appendtofile) { /* Always close and reopen when re-setting */ if (debugfd && (debugfd != stdout) && (debugfd != stderr)) fclose(debugfd); if (fn) { if (strcasecmp(fn, "stderr") == 0) debugfd = stderr; else if (strcasecmp(fn, "stdout") == 0) debugfd = stdout; else { debugfd = fopen(fn, (appendtofile ? "a" : "w")); if (debugfd == NULL) errprintf("Cannot open debug log '%s': %s\n", fn, strerror(errno)); } } if (!debugfd) debugfd = stdout; } void starttrace(const char *fn) { if (tracefd) fclose(tracefd); if (fn) { tracefd = fopen(fn, "a"); if (tracefd == NULL) errprintf("Cannot open tracefile %s\n", fn); } else tracefd = stdout; } void stoptrace(void) { if (tracefd) fclose(tracefd); tracefd = NULL; } void traceprintf(const char *fmt, ...) { va_list args; if (tracefd) { char timestr[40]; time_t now = getcurrenttime(NULL); MEMDEFINE(timestr); strftime(timestr, sizeof(timestr), "%Y-%m-%d %H:%M:%S", localtime(&now)); fprintf(tracefd, "%08lu %s ", (unsigned long)getpid(), timestr); va_start(args, fmt); vfprintf(tracefd, fmt, args); va_end(args); fflush(tracefd); MEMUNDEFINE(timestr); } } void reopen_file(char *fn, char *mode, FILE *fd) { FILE *testfd; testfd = fopen(fn, mode); if (!testfd) { fprintf(stderr, "reopen_file: Cannot open new file: %s\n", strerror(errno)); return; } fclose(testfd); if (freopen(fn, mode, fd) == NULL) { /* Ugh ... lost the filedescriptor :-(( */ } } void redirect_cgilog(char *cginame) { char logfn[PATH_MAX]; char *cgilogdir; FILE *fd; cgilogdir = getenv("XYMONCGILOGDIR"); if (!cgilogdir) return; if (cginame) errappname = strdup(cginame); sprintf(logfn, "%s/cgierror.log", cgilogdir); reopen_file(logfn, "a", stderr); /* If debugging, setup the debug logfile */ if (debug) { sprintf(logfn, "%s/%s.dbg", cgilogdir, (errappname ? errappname : "cgi")); set_debugfile(logfn, 1); } } xymon-4.3.28/lib/environ.c0000664000076400007640000003223113022765207015611 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains environment variable handling routines. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: environ.c 7986 2016-12-10 11:44:07Z jccleaver $"; #include #include #include #include #include "libxymon.h" const static struct { char *name; char *val; } xymonenv[] = { { "XYMONDREL", VERSION }, { "XYMONSERVERROOT", XYMONTOPDIR }, { "XYMONSERVERLOGS", XYMONLOGDIR }, { "XYMONSERVERHOSTNAME", XYMONHOSTNAME }, { "XYMONSERVERIP", XYMONHOSTIP }, { "XYMONSERVEROS", XYMONHOSTOS }, { "XYMONSERVERWWWNAME", XYMONHOSTNAME }, { "XYMONSERVERWWWURL", "/xymon" }, { "XYMONSERVERCGIURL", "/xymon-cgi" }, { "XYMONSERVERSECURECGIURL", "/xymon-seccgi" }, { "XYMONNETWORK", "" }, { "BBLOCATION", "" }, { "PATH", "/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin:"XYMONHOME"/bin" }, { "DELAYRED", "" }, { "DELAYYELLOW", "" }, { "XYMONDPORT", "1984" }, { "XYMSRV", "$XYMONSERVERIP" }, { "XYMSERVERS", "" }, { "FQDN", "TRUE" }, { "PAGELEVELS", "red yellow purple" }, { "PURPLEDELAY", "30" }, { "XYMONLOGSTATUS", "DYNAMIC" }, { "PINGCOLUMN", "conn" }, { "INFOCOLUMN", "info" }, { "TRENDSCOLUMN", "trends" }, { "CLIENTCOLUMN", "clientlog" }, { "DOCOMBO", "TRUE" }, { "MAXMSGSPERCOMBO", "100" }, { "SLEEPBETWEENMSGS", "0" }, { "SERVEROSTYPE", "$XYMONSERVEROS" }, { "MACHINEDOTS", "$XYMONSERVERHOSTNAME" }, { "MACHINEADDR", "$XYMONSERVERIP" }, { "XYMONWEBHOST", "http://$XYMONSERVERWWWNAME" }, { "XYMONWEBHOSTURL", "$XYMONWEBHOST$XYMONSERVERWWWURL" }, { "XYMONWEBHTMLLOGS", "$XYMONWEBHOSTURL/html" }, { "XYMONWEB", "$XYMONSERVERWWWURL" }, { "XYMONSKIN", "$XYMONSERVERWWWURL/gifs" }, { "XYMONHELPSKIN", "$XYMONSERVERWWWURL/help" }, { "XYMONNOTESSKIN", "$XYMONSERVERWWWURL/notes" }, { "XYMONMENUSKIN", "$XYMONSERVERWWWURL/menu" }, { "XYMONREPURL", "$XYMONSERVERWWWURL/rep" }, { "XYMONSNAPURL", "$XYMONSERVERWWWURL/snap" }, { "XYMONWAP", "$XYMONSERVERWWWURL/wml" }, { "CGIBINURL", "$XYMONSERVERCGIURL" }, { "XYMONHOME", XYMONHOME }, { "XYMONTMP", "$XYMONHOME/tmp" }, { "HOSTSCFG", "$XYMONHOME/etc/hosts.cfg" }, { "XYMON", "$XYMONHOME/bin/xymon" }, { "XYMONGEN", "$XYMONHOME/bin/xymongen" }, { "XYMONVAR", "$XYMONSERVERROOT/data" }, { "XYMONACKDIR", "$XYMONVAR/acks" }, { "XYMONDATADIR", "$XYMONVAR/data" }, { "XYMONDISABLEDDIR", "$XYMONVAR/disabled" }, { "XYMONHISTDIR", "$XYMONVAR/hist" }, { "XYMONHISTLOGS", "$XYMONVAR/histlogs" }, { "XYMONRAWSTATUSDIR", "$XYMONVAR/logs" }, { "XYMONWWWDIR", "$XYMONHOME/www" }, { "XYMONHTMLSTATUSDIR", "$XYMONWWWDIR/html" }, { "XYMONNOTESDIR", "$XYMONWWWDIR/notes" }, { "XYMONREPDIR", "$XYMONWWWDIR/rep" }, { "XYMONSNAPDIR", "$XYMONWWWDIR/snap" }, { "XYMONALLHISTLOG", "TRUE" }, { "XYMONHOSTHISTLOG", "TRUE" }, { "SAVESTATUSLOG", "TRUE" }, { "CLIENTLOGS", "$XYMONVAR/hostdata" }, { "DU", "du -k" }, { "MAILC", "mail" }, { "MAIL", "$MAILC -s" }, { "SVCCODES", "disk:100,cpu:200,procs:300,svcs:350,msgs:400,conn:500,http:600,dns:800,smtp:725,telnet:723,ftp:721,pop:810,pop3:810,pop-3:810,ssh:722,imap:843,ssh1:722,ssh2:722,imap2:843,imap3:843,imap4:843,pop2:809,pop-2:809,nntp:819,test:901" }, { "ALERTCOLORS", "red,yellow,purple" }, { "OKCOLORS", "green,blue,clear" }, { "ALERTREPEAT", "30" }, { "XYMWEBREFRESH", "60" }, { "MAXMSG_ALERTSCRIPT", "8164" }, { "CONNTEST", "TRUE" }, { "IPTEST_2_CLEAR_ON_FAILED_CONN", "TRUE" }, { "NONETPAGE", "" }, { "FPING", "xymonping" }, { "FPINGOPTS", "-Ae" }, { "SNTP", "sntp" }, { "SNTPOPTS", "-u" }, { "NTPDATE", "ntpdate" }, { "NTPDATEOPTS", "-u -q -p 1" }, { "TRACEROUTE", "traceroute" }, { "TRACEROUTEOPTS", "-n -q 2 -w 2 -m 15" }, { "RPCINFO", "rpcinfo" }, { "XYMONROUTERTEXT", "router" }, { "NETFAILTEXT", "not OK" }, { "XYMONRRDS", "$XYMONVAR/rrd" }, { "TEST2RRD", "cpu=la,disk,memory,$PINGCOLUMN=tcp,http=tcp,dns=tcp,dig=tcp,time=ntpstat,vmstat,iostat,netstat,temperature,apache,bind,sendmail,nmailq,socks,bea,iishealth,citrix,xymongen,xymonnet,xymonproxy,xymond" }, { "GRAPHS", "la,disk:disk_part:5,memory,users,vmstat,iostat,tcp.http,tcp,netstat,temperature,ntpstat,apache,bind,sendmail,nmailq,socks,bea,iishealth,citrix,xymongen,xymonnet,xymonproxy,xymond" }, { "SUMMARY_SET_BKG", "FALSE" }, { "XYMONNONGREENEXT", "eventlog.sh acklog.sh" }, { "DOTHEIGHT", "16" }, { "DOTWIDTH", "16" }, { "IMAGEFILETYPE", "gif" }, { "RRDHEIGHT", "120" }, { "RRDWIDTH", "576" }, { "COLUMNDOCURL", "$CGIBINURL/columndoc.sh?%s" }, { "HOSTDOCURL", "" }, { "XYMONLOGO", "Xymon" }, { "XYMONPAGELOCAL", "Pages Hosted Locally" }, { "XYMONPAGEREMOTE", "Remote Status Display" }, { "XYMONPAGESUBLOCAL", "Subpages Hosted Locally" }, { "XYMONPAGEACKFONT", "COLOR=\"#33ebf4\" SIZE=\"-1\"" }, { "XYMONPAGECOLFONT", "COLOR=\"#87a9e5\" SIZE=\"-1\"" }, { "XYMONPAGEROWFONT", "SIZE=\"+1\" COLOR=\"#FFFFCC\" FACE=\"Tahoma, Arial, Helvetica\"" }, { "XYMONPAGETITLE", "COLOR=\"ivory\" SIZE=\"+1\"" }, { "XYMONDATEFORMAT", "%a %b %d %H:%M:%S %Y" }, { "XYMONRSSTITLE", "Xymon Alerts" }, { "ACKUNTILMSG", "Next update at: %H:%M %Y-%m-%d" }, { "WMLMAXCHARS", "1500" }, { "XYMONREPWARN", "97" }, { "XYMONGENREPOPTS", "--recentgifs --subpagecolumns=2" }, { "XYMONGENSNAPOPTS", "--recentgifs --subpagecolumns=2" }, { "XYMONSTDEXT", "" }, { "XYMONHISTEXT", "" }, { "TASKSLEEP", "300" }, { "XYMONPAGECOLREPEAT", "0" }, { "ALLOWALLCONFIGFILES", "" }, { "XYMONHTACCESS", "" }, { "XYMONPAGEHTACCESS", "" }, { "XYMONSUBPAGEHTACCESS", "" }, { "XYMONNETSVCS", "smtp telnet ftp pop pop3 pop-3 ssh imap ssh1 ssh2 imap2 imap3 imap4 pop2 pop-2 nntp" }, { "HTMLCONTENTTYPE", "text/html" }, { "HOLIDAYFORMAT", "%d/%m" }, { "WEEKSTART", "1" }, { "XYMONBODYCSS", "$XYMONSKIN/xymonbody.css" }, { "XYMONBODYMENUCSS", "$XYMONMENUSKIN/xymonmenu.css" }, { "XYMONBODYHEADER", "file:$XYMONHOME/etc/xymonmenu.cfg" }, { "XYMONBODYFOOTER", "" }, { "LOGFETCHSKIPTEXT", "<...SKIPPED...>" }, { "LOGFETCHCURRENTTEXT", "<...CURRENT...>" }, { "XYMONALLOKTEXT", "

All Monitored Systems OK


" }, { "HOSTPOPUP", "CDI" }, { "STATUSLIFETIME", "30" }, { "ACK_COOKIE_EXPIRATION", "86400" }, { NULL, NULL } }; char *xgetenv(const char *name) { char *result, *newstr; int i; result = getenv(name); if ((result == NULL) && (strcmp(name, "MACHINE") == 0) && xgetenv("MACHINEDOTS")) { /* If MACHINE is undefined, but MACHINEDOTS is there, create MACHINE */ char *oneenv, *p; #ifdef HAVE_SETENV oneenv = strdup(xgetenv("MACHINEDOTS")); p = oneenv; while ((p = strchr(p, '.')) != NULL) *p = ','; setenv(name, oneenv, 1); xfree(oneenv); #else oneenv = (char *)malloc(10 + strlen(xgetenv("MACHINEDOTS"))); sprintf(oneenv, "%s=%s", name, xgetenv("MACHINEDOTS")); p = oneenv; while ((p = strchr(p, '.')) != NULL) *p = ','; putenv(oneenv); #endif result = getenv(name); } if (result == NULL) { for (i=0; (xymonenv[i].name && (strcmp(xymonenv[i].name, name) != 0)); i++) ; if (xymonenv[i].name) result = expand_env(xymonenv[i].val); if (result == NULL) { errprintf("xgetenv: Cannot find value for variable %s\n", name); return NULL; } /* * If we got a result, put it into the environment so it will stay there. * Allocate memory for this new environment string - this stays allocated. */ #ifdef HAVE_SETENV setenv(name, result, 1); #else newstr = malloc(strlen(name) + strlen(result) + 2); sprintf(newstr, "%s=%s", name, result); putenv(newstr); #endif /* * Return pointer to the environment string. */ result = getenv(name); } return result; } void envcheck(char *envvars[]) { int i; int ok = 1; for (i = 0; (envvars[i]); i++) { if (xgetenv(envvars[i]) == NULL) { errprintf("Environment variable %s not defined\n", envvars[i]); ok = 0; } } if (!ok) { errprintf("Aborting\n"); exit (1); } } void loadenv(char *envfile, char *area) { FILE *fd; strbuffer_t *inbuf; char *p, *marker, *oneenv; MEMDEFINE(l); inbuf = newstrbuffer(0); fd = stackfopen(envfile, "r", NULL); if (fd) { while (stackfgets(inbuf, NULL)) { char *equalpos; int appendto = 0; sanitize_input(inbuf, 1, 1); if ((STRBUFLEN(inbuf) == 0) || ((equalpos = strchr(STRBUF(inbuf), '=')) == NULL)) continue; appendto = ((equalpos > STRBUF(inbuf)) && (*(equalpos-1) == '+')); /* * Do the environment "area" stuff: If the input * is of the form AREA/NAME=VALUE, then setup the variable * only if we're called with the correct AREA setting. */ oneenv = NULL; p = STRBUF(inbuf); /* Skip ahead for anyone who thinks this is a shell include */ if ((strncmp(p, "export ", 7) == 0) || (strncmp(p, "export\t", 7) == 0)) { p += 6; p += strspn(p, " \t"); } marker = p + strcspn(p, "=/"); if (*marker == '/') { if (area) { *marker = '\0'; if (strcasecmp(p, area) == 0) oneenv = strdup(expand_env(marker+1)); } } else oneenv = strdup(expand_env(p)); if (oneenv) { p = strchr(oneenv, '='); if (*(p+1) == '"') { /* Move string over the first '"' */ memmove(p+1, p+2, strlen(p+2)+1); /* Kill a trailing '"' */ if (*(oneenv + strlen(oneenv) - 1) == '"') *(oneenv + strlen(oneenv) - 1) = '\0'; } if (appendto) { char *oldval, *addstring, *p; addstring = strchr(oneenv, '='); if (addstring) { *addstring = '\0'; addstring++; } p = strchr(oneenv, '+'); if (p) *p = '\0'; oldval = getenv(oneenv); if (oldval) { char *combinedenv = (char *)malloc(strlen(oneenv) + strlen(oldval) + strlen(addstring) + 2); sprintf(combinedenv, "%s=%s%s", oneenv, oldval, (addstring)); xfree(oneenv); oneenv = combinedenv; } else { /* oneenv is now VARxxVALUE, so fix it to be a normal env. variable format */ strcat(oneenv, "="); memmove(oneenv+strlen(oneenv), addstring, strlen(addstring) + 1); } } putenv(oneenv); } } stackfclose(fd); } else { errprintf("Cannot open env file %s - %s\n", envfile, strerror(errno)); } freestrbuffer(inbuf); MEMUNDEFINE(l); } char *getenv_default(char *envname, char *envdefault, char **buf) { static char *val; val = getenv(envname); /* Don't use xgetenv() here! */ if (!val) { val = (char *)malloc(strlen(envname) + strlen(envdefault) + 2); sprintf(val, "%s=%s", envname, envdefault); putenv(val); /* Don't free the string - it must be kept for the environment to work */ val = xgetenv(envname); /* OK to use xgetenv here */ } if (buf) *buf = val; return val; } typedef struct envxp_t { char *result; int resultlen; struct envxp_t *next; } envxp_t; static envxp_t *xps = NULL; char *expand_env(char *s) { static char *res = NULL; static int depth = 0; char *sCopy, *bot, *tstart, *tend, *envval; char savech; envxp_t *myxp; if ((depth == 0) && res) xfree(res); depth++; myxp = (envxp_t *)malloc(sizeof(envxp_t)); myxp->next = xps; xps = myxp; myxp->resultlen = 4096; myxp->result = (char *)malloc(myxp->resultlen); *(myxp->result) = '\0'; sCopy = strdup(s); bot = sCopy; do { tstart = strchr(bot, '$'); if (tstart) *tstart = '\0'; if ((strlen(myxp->result) + strlen(bot) + 1) > myxp->resultlen) { myxp->resultlen += strlen(bot) + 4096; myxp->result = (char *)realloc(myxp->result, myxp->resultlen); } strcat(myxp->result, bot); if (tstart) { tstart++; envval = NULL; if (*tstart == '{') { tstart++; tend = strchr(tstart, '}'); if (tend) { *tend = '\0'; envval = xgetenv(tstart); bot = tend+1; } else { envval = xgetenv(tstart); bot = NULL; } } else { tend = tstart + strspn(tstart, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"); savech = *tend; *tend = '\0'; envval = xgetenv(tstart); *tend = savech; bot = tend; } if (envval) { if ((strlen(myxp->result) + strlen(envval) + 1) > myxp->resultlen) { myxp->resultlen += strlen(envval) + 4096; myxp->result = (char *)realloc(myxp->result, myxp->resultlen); } strcat(myxp->result, envval); } } else { bot = NULL; } } while (bot); xfree(sCopy); depth--; if (depth == 0) { envxp_t *tmp; /* Free all xps except the last one (which is myxp) */ while (xps->next) { tmp = xps; xps = xps->next; xfree(tmp->result); xfree(tmp); } if (xps != myxp) { errprintf("Assertion failed: xps != myxp\n"); abort(); } /* We KNOW that xps == myxp */ res = myxp->result; xfree(myxp); xps = NULL; return res; } else return myxp->result; } xymon-4.3.28/lib/cgi.h0000664000076400007640000000226612666146167014720 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __CGI_H__ #define __CGI_H__ typedef struct cgidata_t { char *name; char *value; char *filename; struct cgidata_t *next; } cgidata_t; enum cgi_method_t { CGI_OTHER, CGI_GET, CGI_POST }; extern enum cgi_method_t cgi_method; extern char *cgi_error(void); extern int cgi_ispost(void); extern cgidata_t *cgi_request(void); extern char *csp_header(const char *pagename); extern int cgi_refererok(char *expected); extern char *get_cookie(char *cookiename); #endif xymon-4.3.28/lib/encoding.h0000664000076400007640000000203011615341300015704 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __ENCODING_H__ #define __ENCODING_H__ extern char *base64encode(unsigned char *buf); extern char *base64decode(unsigned char *buf); extern void getescapestring(char *msg, unsigned char **buf, int *buflen); extern unsigned char *nlencode(unsigned char *msg); extern void nldecode(unsigned char *msg); #endif xymon-4.3.28/lib/availability.h0000664000076400007640000000345711615341300016606 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __AVAILABILITY_H__ #define __AVAILABILITY_H__ #include "color.h" typedef struct reportinfo_t { char *fstate; time_t reportstart; int count[COL_COUNT]; double fullavailability; int fullstops; double fullpct[COL_COUNT]; unsigned long fullduration[COL_COUNT]; int withreport; double reportavailability; int reportstops; double reportpct[COL_COUNT]; unsigned long reportduration[COL_COUNT]; } reportinfo_t; typedef struct replog_t { time_t starttime; time_t duration; int color; int affectssla; char *cause; char *timespec; struct replog_t *next; } replog_t; extern replog_t *reploghead; extern char *durationstr(time_t duration); extern int parse_historyfile(FILE *fd, reportinfo_t *repinfo, char *hostname, char *servicename, time_t fromtime, time_t totime, int for_history, double warnlevel, double greenlevel, int warnstops, char *reporttime); extern replog_t *save_replogs(void); extern void restore_replogs(replog_t *head); extern int history_color(FILE *fd, time_t snapshot, time_t *starttime, char **histlogname); #endif xymon-4.3.28/lib/sha1.h0000664000076400007640000000220411615341300014755 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* API for the SHA1 digest routines. */ /* */ /* Copyright (C) 2006-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __SHA1_H__ #define __SHA1_H__ extern int mySHA1_Size(void); extern void mySHA1_Init(void *context); extern void mySHA1_Update(void *context, const unsigned char *data, int len); extern void mySHA1_Final(unsigned char digest[20], void *context); #endif xymon-4.3.28/lib/loadhosts_net.c0000664000076400007640000000576311645550634017016 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module for Xymon, responsible for loading the host */ /* configuration from xymond, for either a single host or all hosts. */ /* */ /* Copyright (C) 2011-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid_net[] = "$Id: loadhosts_file.c 6745 2011-09-04 06:01:06Z storner $"; static char *hivalhost = NULL; static char *hivals[XMH_LAST] = { NULL, }; static char *hivalbuf = NULL; static namelist_t hival_hostinfo; /* Used as token for userspace. Also holds raw data in "elems" */ int load_hostinfo(char *targethost) { sendreturn_t *sres; sendresult_t sendstat; char *msg, *bol, *eoln, *key, *val; int elemsize = 0; xmh_item_list_setup(); if (hivalhost) { xfree(hivalhost); hivalhost = NULL; } if (hivalbuf) { xfree(hivalbuf); hivalbuf = NULL; xfree(hival_hostinfo.elems); } if (!targethost) return -1; msg = (char *)malloc(200 + strlen(targethost)); sprintf(msg, "hostinfo clone=%s", targethost); sres = newsendreturnbuf(1, NULL); sendstat = sendmessage(msg, NULL, XYMON_TIMEOUT, sres); xfree(msg); if (sendstat != XYMONSEND_OK) { errprintf("Cannot load hostinfo\n"); return -1; } hivalbuf = getsendreturnstr(sres, 1); if (strlen(hivalbuf) == 0) { errprintf("No such host\n"); return -2; } hivalhost = strdup(targethost); memset(hivals, 0, sizeof(hivals)); memset(&hival_hostinfo, 0, sizeof(hival_hostinfo)); hival_hostinfo.elems = (char **)calloc(1, sizeof(char *)); bol = hivalbuf; while (bol && *bol) { int idx; /* * The "clone" output is multiline: * Lines beginning with XMH_ are the item-values, * all others are elem entries. */ eoln = strchr(bol, '\n'); if (eoln) *eoln = '\0'; key = bol; if (strncmp(key, "XMH_", 4) == 0) { val = strchr(bol, ':'); if (val) { *val = '\0'; val++; } idx = xmh_key_idx(key); if ((idx >= 0) && (idx < XMH_LAST)) hivals[idx] = val; } else { elemsize++; hival_hostinfo.elems = (char **)realloc(hival_hostinfo.elems, (elemsize+1)*sizeof(char *)); hival_hostinfo.elems[elemsize-1] = bol; } bol = (eoln ? eoln+1 : NULL); } hival_hostinfo.elems[elemsize] = NULL; hival_hostinfo.hostname = hivals[XMH_HOSTNAME]; if (hivals[XMH_IP]) strcpy(hival_hostinfo.ip, hivals[XMH_IP]); else *(hival_hostinfo.ip) = '\0'; return 0; } xymon-4.3.28/lib/timefunc.c0000664000076400007640000003362512603243142015744 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains routines for timehandling. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: timefunc.c 7678 2015-10-01 14:42:42Z jccleaver $"; #include #include #include #include #include #include #include #include "libxymon.h" #ifdef time #undef time #endif time_t fakestarttime = 0; time_t getcurrenttime(time_t *retparm) { static time_t firsttime = 0; if (fakestarttime != 0) { time_t result; if (firsttime == 0) firsttime = time(NULL); result = fakestarttime + (time(NULL) - firsttime); if (retparm) *retparm = result; return result; } else return time(retparm); } char *timestamp = NULL; void init_timestamp(void) { time_t now; if (timestamp == NULL) timestamp = (char *)malloc(30); now = getcurrenttime(NULL); strcpy(timestamp, ctime(&now)); timestamp[strlen(timestamp)-1] = '\0'; } char *timespec_text(char *spec) { static char *daynames[7] = { NULL, }; static char *wkdays = NULL; static strbuffer_t *result = NULL; char *sCopy; char *p; if (result == NULL) result = newstrbuffer(0); clearstrbuffer(result); if (!daynames[0]) { /* Use strftime to get the locale-specific weekday names */ time_t now; int i; now = time(NULL); for (i=0; (i<7); i++) { char dtext[10]; struct tm *tm = localtime(&now); strftime(dtext, sizeof(dtext), "%a", tm); daynames[tm->tm_wday] = strdup(dtext); now -= 86400; } wkdays = (char *)malloc(strlen(daynames[1]) + strlen(daynames[5]) + 2); sprintf(wkdays, "%s-%s", daynames[1], daynames[5]); } p = sCopy = strdup(spec); do { char *s1, *s2, *s3, *s4, *s5; char *days = NULL, *starttime = NULL, *endtime = NULL, *columns = NULL; unsigned char *cause = NULL; char *oneday, *dtext; int daysdone = 0, firstday = 1, causelen; /* Its either DAYS:START:END or SERVICE:DAYS:START:END:CAUSE */ s1 = p; p += strcspn(p, ":"); if (*p != '\0') { *p = '\0'; p++; } s2 = p; p += strcspn(p, ":"); if (*p != '\0') { *p = '\0'; p++; } s3 = p; p += strcspn(p, ":;,"); if ((*p == ',') || (*p == ';') || (*p == '\0')) { if (*p != '\0') { *p = '\0'; p++; } days = s1; starttime = s2; endtime = s3; columns = "*"; cause = strdup("Planned downtime"); } else if (*p == ':') { *p = '\0'; p++; s4 = p; p += strcspn(p, ":"); if (*p != '\0') { *p = '\0'; p++; } s5 = p; p += strcspn(p, ",;"); if (*p != '\0') { *p = '\0'; p++; } days = s2; starttime = s3; endtime = s4; columns = s1; getescapestring(s5, &cause, &causelen); } if (!days) return ""; oneday = days; if (STRBUFLEN(result) > 0) addtobuffer(result, "
"); while (!daysdone) { switch (*oneday) { case '*': dtext = "All days"; break; case 'W': dtext = wkdays; break; case '0': dtext = daynames[0]; break; case '1': dtext = daynames[1]; break; case '2': dtext = daynames[2]; break; case '3': dtext = daynames[3]; break; case '4': dtext = daynames[4]; break; case '5': dtext = daynames[5]; break; case '6': dtext = daynames[6]; break; default : dtext = oneday; daysdone = firstday = 1; break; } if (!firstday) addtobuffer(result, "/"); addtobuffer(result, dtext); oneday++; firstday = 0; } addtobuffer(result, ":"); addtobuffer(result, starttime); addtobuffer(result, ":"); addtobuffer(result, endtime); addtobuffer(result, " (status:"); if (strcmp(columns, "*") == 0) addtobuffer(result, "All"); else addtobuffer(result, columns); addtobuffer(result, ")"); if (cause) { addtobuffer(result, " (cause:"); addtobuffer(result, cause); addtobuffer(result, ")"); xfree(cause); } } while (*p); xfree(sCopy); return STRBUF(result); } struct timespec *tvdiff(struct timespec *tstart, struct timespec *tend, struct timespec *result) { static struct timespec resbuf; if (result == NULL) result = &resbuf; result->tv_sec = tend->tv_sec; result->tv_nsec = tend->tv_nsec; if (result->tv_nsec < tstart->tv_nsec) { result->tv_sec--; result->tv_nsec += 1000000000; } result->tv_sec -= tstart->tv_sec; result->tv_nsec -= tstart->tv_nsec; return result; } static int minutes(char *p) { /* Converts string HHMM to number indicating minutes since midnight (0-1440) */ if (isdigit((int)*(p+0)) && isdigit((int)*(p+1)) && isdigit((int)*(p+2)) && isdigit((int)*(p+3))) { return (10*(*(p+0)-'0')+(*(p+1)-'0'))*60 + (10*(*(p+2)-'0')+(*(p+3)-'0')); } else { errprintf("Invalid timespec - expected 4 digits, got: '%s'\n", p); return 0; } } int within_sla(char *holidaykey, char *timespec, int defresult) { /* * timespec is of the form W:HHMM:HHMM[,W:HHMM:HHMM]* * "W" = weekday : '*' = all, 'W' = Monday-Friday, '0'..'6' = Sunday ..Saturday */ int found = 0; time_t tnow; struct tm *now; int curtime; int newwday; char *onesla; if (!timespec) return defresult; tnow = getcurrenttime(NULL); now = localtime(&tnow); curtime = now->tm_hour*60+now->tm_min; newwday = getweekdayorholiday(holidaykey, now); onesla = timespec; while (!found && onesla) { char *wday; int validday, wdaymatch = 0; char *endsla, *starttimep, *endtimep; int starttime, endtime; endsla = strchr(onesla, ','); if (endsla) *endsla = '\0'; for (wday = onesla, validday=1; (validday && !wdaymatch); wday++) { switch (*wday) { case '*': wdaymatch = 1; break; case 'W': case 'w': if ((newwday >= 1) && (newwday <=5)) wdaymatch = 1; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': if (*wday == (newwday+'0')) wdaymatch = 1; break; case ':': /* End of weekday spec. is OK */ validday = 0; break; default: errprintf("Bad timespec (missing colon or wrong weekdays): %s\n", onesla); validday = 0; break; } } if (wdaymatch) { /* Weekday matches */ starttimep = strchr(onesla, ':'); if (starttimep) { starttime = minutes(starttimep+1); endtimep = strchr(starttimep+1, ':'); if (endtimep) { endtime = minutes(endtimep+1); if (endtime > starttime) { /* *:0200:0400 */ found = ((curtime >= starttime) && (curtime <= endtime)); } else { /* The period crosses over midnight: *:2330:0400 */ found = ((curtime >= starttime) || (curtime <= endtime)); } dbgprintf("\tstart,end,current time = %d, %d, %d - found=%d\n", starttime,endtime,curtime,found); } else errprintf("Bad timespec (missing colon or no endtime): %s\n", onesla); } else errprintf("Bad timespec (missing colon or no starttime): %s\n", onesla); } else { dbgprintf("\tWeekday does not match\n"); } /* Go to next SLA spec. */ if (endsla) *endsla = ','; onesla = (endsla ? (endsla + 1) : NULL); } return found; } int periodcoversnow(char *tag) { /* * Tag format: "-DAY-HHMM-HHMM:" * DAY = 0-6 (Sun .. Mon), or W (1..5) */ time_t tnow; struct tm *now; int result = 1; char *dayspec, *starttime, *endtime; unsigned int istart, iend, inow; char *p; if ((tag == NULL) || (*tag != '-')) return 1; dayspec = (char *) malloc(strlen(tag)+1+12); /* Leave room for expanding 'W' and '*' */ starttime = (char *) malloc(strlen(tag)+1); endtime = (char *) malloc(strlen(tag)+1); strcpy(dayspec, (tag+1)); for (p=dayspec; ((*p == 'W') || (*p == '*') || ((*p >= '0') && (*p <= '6'))); p++) ; if (*p != '-') { xfree(endtime); xfree(starttime); xfree(dayspec); return 1; } *p = '\0'; p++; strcpy(starttime, p); p = starttime; if ( (strlen(starttime) < 4) || !isdigit((int) *p) || !isdigit((int) *(p+1)) || !isdigit((int) *(p+2)) || !isdigit((int) *(p+3)) || !(*(p+4) == '-') ) goto out; else *(starttime+4) = '\0'; p+=5; strcpy(endtime, p); p = endtime; if ( (strlen(endtime) < 4) || !isdigit((int) *p) || !isdigit((int) *(p+1)) || !isdigit((int) *(p+2)) || !isdigit((int) *(p+3)) || !(*(p+4) == ':') ) goto out; else *(endtime+4) = '\0'; tnow = getcurrenttime(NULL); now = localtime(&tnow); /* We have a timespec. So default to "not included" */ result = 0; /* Check day-spec */ if (strchr(dayspec, 'W')) strcat(dayspec, "12345"); if (strchr(dayspec, '*')) strcat(dayspec, "0123456"); if (strchr(dayspec, ('0' + now->tm_wday)) == NULL) goto out; /* Calculate minutes since midnight for start, end and now */ istart = (600 * (starttime[0]-'0')) + (60 * (starttime[1]-'0')) + (10 * (starttime[2]-'0')) + (1 * (starttime[3]-'0')); iend = (600 * (endtime[0]-'0')) + (60 * (endtime[1]-'0')) + (10 * (endtime[2]-'0')) + (1 * (endtime[3]-'0')); inow = 60*now->tm_hour + now->tm_min; if ((inow < istart) || (inow > iend)) goto out; result = 1; out: xfree(endtime); xfree(starttime); xfree(dayspec); return result; } char *histlogtime(time_t histtime) { static char *result = NULL; char d1[40],d2[3],d3[40]; if (result == NULL) result = (char *)malloc(30); MEMDEFINE(d1); MEMDEFINE(d2); MEMDEFINE(d3); /* * Historical logs use a filename like "Fri_Nov_7_16:01:08_2002 * But apparently there is no simple way to generate a day-of-month * with no leading 0. */ strftime(d1, sizeof(d1), "%a_%b_", localtime(&histtime)); strftime(d2, sizeof(d2), "%d", localtime(&histtime)); if (d2[0] == '0') { d2[0] = d2[1]; d2[1] = '\0'; } strftime(d3, sizeof(d3), "_%H:%M:%S_%Y", localtime(&histtime)); snprintf(result, 29, "%s%s%s", d1, d2, d3); MEMUNDEFINE(d1); MEMUNDEFINE(d2); MEMUNDEFINE(d3); return result; } int durationvalue(char *dur) { /* * Calculate a duration, taking special modifiers into consideration. * Return the duration as number of minutes. */ int result = 0; char *startofval; char *endpos; char savedelim; /* Make sure we only process the first token, don't go past whitespace or some other delimiter */ endpos = dur + strspn(dur, "01234567890mhdw"); savedelim = *endpos; *endpos = '\0'; startofval = dur; while (startofval && (isdigit((int)*startofval))) { char *p; char modifier; int oneval = 0; p = startofval + strspn(startofval, "0123456789"); modifier = *p; *p = '\0'; oneval = atoi(startofval); *p = modifier; switch (modifier) { case '\0': break; /* No delimiter = minutes */ case 'm' : break; /* minutes */ case 'h' : oneval *= 60; break; /* hours */ case 'd' : oneval *= 1440; break; /* days */ case 'w' : oneval *= 10080; break; /* weeks */ } result += oneval; startofval = ((*p) ? p+1 : NULL); } /* Restore the saved delimiter */ *endpos = savedelim; return result; } char *durationstring(time_t secs) { #define ONE_WEEK (7*24*60*60) #define ONE_DAY (24*60*60) #define ONE_HOUR (60*60) #define ONE_MINUTE (60) static char result[50]; char *p = result; time_t v = secs; int n; if (secs == 0) return "-"; *result = '\0'; if (v >= ONE_WEEK) { n = (int) (v / ONE_WEEK); p += sprintf(p, "%dw ", n); v -= (n * ONE_WEEK); } if (v >= ONE_DAY) { n = (int) (v / ONE_DAY); p += sprintf(p, "%dd ", n); v -= (n * ONE_DAY); } if (v >= ONE_HOUR) { n = (int) (v / ONE_HOUR); p += sprintf(p, "%dh ", n); v -= (n * ONE_HOUR); } if (v >= ONE_MINUTE) { n = (int) (v / ONE_MINUTE); p += sprintf(p, "%dm ", n); v -= (n * ONE_MINUTE); } if (v > 0) { p += sprintf(p, "%ds ", (int)v); } return result; } char *agestring(time_t secs) { static char result[128]; char *p; time_t left = secs; *result = '\0'; p = result; if (left > 86400) { p += sprintf(p, "%ldd", (left / 86400)); left = (left % 86400); } if ((left > 3600) || *result) { p += sprintf(p, (*result ? "%02ldh" : "%ldh"), (left / 3600)); left = (left % 3600); } if ((left > 60) || *result) { p += sprintf(p, (*result ? "%02ldm" : "%ldm"), (left / 60)); left = (left % 60); } /* Only show seconds if no other info */ if (*result == '\0') { p += sprintf(p, "%02lds", left); } *p = '\0'; return result; } time_t timestr2timet(char *s) { /* Convert a string "YYYYMMDDHHMM" to time_t value */ struct tm tm; if (strlen(s) != 12) { errprintf("Invalid timestring: '%s'\n", s); return -1; } tm.tm_min = atoi(s+10); *(s+10) = '\0'; tm.tm_hour = atoi(s+8); *(s+8) = '\0'; tm.tm_mday = atoi(s+6); *(s+6) = '\0'; tm.tm_mon = atoi(s+4) - 1; *(s+4) = '\0'; tm.tm_year = atoi(s) - 1900; *(s+4) = '\0'; tm.tm_isdst = -1; return mktime(&tm); } time_t eventreport_time(char *timestamp) { time_t event = 0; unsigned int year,month,day,hour,min,sec,count; struct tm timeinfo; if ((*timestamp) && (*(timestamp + strspn(timestamp, "0123456789")) == '\0')) return (time_t) atol(timestamp); count = sscanf(timestamp, "%u/%u/%u@%u:%u:%u", &year, &month, &day, &hour, &min, &sec); if(count != 6) { return -1; } if(year < 1970) { return 0; } else { memset(&timeinfo, 0, sizeof(timeinfo)); timeinfo.tm_year = year - 1900; timeinfo.tm_mon = month - 1; timeinfo.tm_mday = day; timeinfo.tm_hour = hour; timeinfo.tm_min = min; timeinfo.tm_sec = sec; timeinfo.tm_isdst = -1; event = mktime(&timeinfo); } return event; } xymon-4.3.28/lib/loadcriticalconf.h0000664000076400007640000000343711630612042017433 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module for Xymon, responsible for loading the */ /* critical.cfg file. */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __LOADCRITICALCONF_H__ #define __LOADCRITICALCONF_H__ #include typedef struct critconf_t { char *key; int priority; time_t starttime, endtime; char *crittime; char *ttgroup; char *ttextra; char *updinfo; } critconf_t; #define CRITCONF_TIMEFILTER 1 #define CRITCONF_FIRSTMATCH 2 #define CRITCONF_FIRST 3 #define CRITCONF_NEXT 4 #define CRITCONF_RAW_FIRST 5 #define CRITCONF_RAW_NEXT 6 #define CRITCONF_FIRSTHOSTMATCH 7 #define DEFAULT_CRITCONFIGFN "etc/critical.cfg" extern int load_critconfig(char *fn); extern critconf_t *get_critconfig(char *key, int flags, char **resultkey); extern int update_critconfig(critconf_t *rec); extern void addclone_critconfig(char *origin, char *newclone); extern void dropclone_critconfig(char *drop); extern int delete_critconfig(char *dropkey, int evenifcloned); #endif xymon-4.3.28/lib/color.h0000664000076400007640000000230611615341300015242 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __COLOR_H__ #define __COLOR_H__ #define COL_GREEN 0 #define COL_CLEAR 1 #define COL_BLUE 2 #define COL_PURPLE 3 #define COL_YELLOW 4 #define COL_RED 5 #define COL_CLIENT 99 #define COL_COUNT (COL_RED+1) extern int use_recentgifs; extern char *colorname(int color); extern int parse_color(char *colortext); extern int eventcolor(char *colortext); extern char *dotgiffilename(int color, int acked, int oldage); extern int colorset(char *colspec, int excludeset); #endif xymon-4.3.28/lib/encoding.c0000664000076400007640000001357711615341300015721 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains routines for Base64 encoding and decoding. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: encoding.c 6712 2011-07-31 21:01:52Z storner $"; #include #include #include #include "libxymon.h" static char b64chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; char *base64encode(unsigned char *buf) { unsigned char c0, c1, c2; unsigned int n0, n1, n2, n3; unsigned char *inp, *outp; unsigned char *result; result = malloc(4*(strlen(buf)/3 + 1) + 1); inp = buf; outp=result; while (strlen(inp) >= 3) { c0 = *inp; c1 = *(inp+1); c2 = *(inp+2); n0 = (c0 >> 2); /* 6 bits from c0 */ n1 = ((c0 & 3) << 4) + (c1 >> 4); /* 2 bits from c0, 4 bits from c1 */ n2 = ((c1 & 15) << 2) + (c2 >> 6); /* 4 bits from c1, 2 bits from c2 */ n3 = (c2 & 63); /* 6 bits from c2 */ *outp = b64chars[n0]; outp++; *outp = b64chars[n1]; outp++; *outp = b64chars[n2]; outp++; *outp = b64chars[n3]; outp++; inp += 3; } if (strlen(inp) == 1) { c0 = *inp; c1 = 0; n0 = (c0 >> 2); /* 6 bits from c0 */ n1 = ((c0 & 3) << 4) + (c1 >> 4); /* 2 bits from c0, 4 bits from c1 */ *outp = b64chars[n0]; outp++; *outp = b64chars[n1]; outp++; *outp = '='; outp++; *outp = '='; outp++; } else if (strlen(inp) == 2) { c0 = *inp; c1 = *(inp+1); c2 = 0; n0 = (c0 >> 2); /* 6 bits from c0 */ n1 = ((c0 & 3) << 4) + (c1 >> 4); /* 2 bits from c0, 4 bits from c1 */ n2 = ((c1 & 15) << 2) + (c2 >> 6); /* 4 bits from c1, 2 bits from c2 */ *outp = b64chars[n0]; outp++; *outp = b64chars[n1]; outp++; *outp = b64chars[n2]; outp++; *outp = '='; outp++; } *outp = '\0'; return result; } char *base64decode(unsigned char *buf) { static short bval[128] = { 0, }; static short bvalinit = 0; int n0, n1, n2, n3; unsigned char *inp, *outp; unsigned char *result; int bytesleft = strlen(buf); if (!bvalinit) { int i; bvalinit = 1; for (i=0; (i < strlen(b64chars)); i++) bval[(int)b64chars[i]] = i; } result = malloc(3*(bytesleft/4 + 1) + 1); inp = buf; outp=result; while (bytesleft >= 4) { n0 = bval[*(inp+0)]; n1 = bval[*(inp+1)]; n2 = bval[*(inp+2)]; n3 = bval[*(inp+3)]; *(outp+0) = (n0 << 2) + (n1 >> 4); /* 6 bits from n0, 2 from n1 */ *(outp+1) = ((n1 & 0x0F) << 4) + (n2 >> 2); /* 4 bits from n1, 4 from n2 */ *(outp+2) = ((n2 & 0x03) << 6) + (n3); /* 2 bits from n2, 6 from n3 */ inp += 4; bytesleft -= 4; outp += 3; } *outp = '\0'; return result; } void getescapestring(char *msg, unsigned char **buf, int *buflen) { char *inp, *outp; int outlen = 0; inp = msg; if (*inp == '\"') inp++; /* Skip the quote */ outp = *buf = malloc(strlen(msg)+1); while (*inp && (*inp != '\"')) { if (*inp == '\\') { inp++; if (*inp == 'r') { *outp = '\r'; outlen++; inp++; outp++; } else if (*inp == 'n') { *outp = '\n'; outlen++; inp++; outp++; } else if (*inp == 't') { *outp = '\t'; outlen++; inp++; outp++; } else if (*inp == '\\') { *outp = '\\'; outlen++; inp++; outp++; } else if (*inp == 'x') { inp++; if (isxdigit((int) *inp)) { *outp = hexvalue(*inp); inp++; if (isxdigit((int) *inp)) { *outp *= 16; *outp += hexvalue(*inp); inp++; } } else { errprintf("Invalid hex escape in '%s'\n", msg); } outlen++; outp++; } else { errprintf("Unknown escape sequence \\%c in '%s'\n", *inp, msg); } } else { *outp = *inp; outlen++; inp++; outp++; } } *outp = '\0'; if (buflen) *buflen = outlen; } unsigned char *nlencode(unsigned char *msg) { static unsigned char *buf = NULL; static int bufsz = 0; int maxneeded; unsigned char *inp, *outp; int n; if (msg == NULL) msg = ""; maxneeded = 2*strlen(msg)+1; if (buf == NULL) { bufsz = maxneeded; buf = (char *)malloc(bufsz); } else if (bufsz < maxneeded) { bufsz = maxneeded; buf = (char *)realloc(buf, bufsz); } inp = msg; outp = buf; while (*inp) { n = strcspn(inp, "|\n\r\t\\"); if (n > 0) { memcpy(outp, inp, n); outp += n; inp += n; } if (*inp) { *outp = '\\'; outp++; switch (*inp) { case '|' : *outp = 'p'; outp++; break; case '\n': *outp = 'n'; outp++; break; case '\r': *outp = 'r'; outp++; break; case '\t': *outp = 't'; outp++; break; case '\\': *outp = '\\'; outp++; break; } inp++; } } *outp = '\0'; return buf; } void nldecode(unsigned char *msg) { unsigned char *inp = msg; unsigned char *outp = msg; int n; if ((msg == NULL) || (*msg == '\0')) return; while (*inp) { n = strcspn(inp, "\\"); if (n > 0) { if (inp != outp) memmove(outp, inp, n); inp += n; outp += n; } /* *inp is either a backslash or a \0 */ if (*inp == '\\') { inp++; switch (*inp) { case 'p': *outp = '|'; outp++; inp++; break; case 'r': *outp = '\r'; outp++; inp++; break; case 'n': *outp = '\n'; outp++; inp++; break; case 't': *outp = '\t'; outp++; inp++; break; case '\\': *outp = '\\'; outp++; inp++; break; } } } *outp = '\0'; } xymon-4.3.28/lib/timing.h0000664000076400007640000000205112000046362015407 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __TIMING_H__ #define __TIMING_H__ extern int timing; extern void add_timestamp(const char *msg); extern void show_timestamps(char **buffer); extern long total_runtime(void); extern time_t gettimer(void); extern void getntimer(struct timespec *tp); extern int ntimerus(struct timespec *start, struct timespec *now); #endif xymon-4.3.28/lib/calc.h0000664000076400007640000000147711615341300015036 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2003-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __CALC_H__ #define __CALC_H__ 1 extern long compute(char *expression, int *error); #endif xymon-4.3.28/lib/webaccess.h0000664000076400007640000000201111664526142016071 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __WEBACCESS_H__ #define __WEBACCESS_H__ typedef enum { WEB_ACCESS_VIEW, WEB_ACCESS_CONTROL, WEB_ACCESS_ADMIN } web_access_type_t; extern void *load_web_access_config(char *accessfn); extern int web_access_allowed(char *username, char *hostname, char *testname, web_access_type_t acc); #endif xymon-4.3.28/lib/ipaccess.h0000664000076400007640000000227711615341300015725 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __IPACCESS_H__ #define __IPACCESS_H__ #include #include #include #include #ifdef HAVE_SYS_SELECT_H #include /* Someday I'll move to GNU Autoconf for this ... */ #endif typedef struct sender_t { unsigned long int ipval; int ipmask; } sender_t; extern sender_t *getsenderlist(char *iplist); extern int oksender(sender_t *oklist, char *targetip, struct in_addr sender, char *msgbuf); #endif xymon-4.3.28/lib/matching.h0000664000076400007640000000345212621055261015727 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __MATCHING_H__ #define __MATCHING_H__ /* The clients probably don't have the pcre headers */ #if defined(LOCALCLIENT) || !defined(CLIENTONLY) #include #include extern pcre *compileregex(const char *pattern); extern pcre *compileregex_opts(const char *pattern, int flags); #ifdef PCRE_FIRSTLINE #define firstlineregex(P) compileregex_opts(P, PCRE_FIRSTLINE); #define firstlineregexnocase(P) compileregex_opts(P, PCRE_CASELESS|PCRE_FIRSTLINE); #else #define firstlineregex(P) compileregex_opts(P, 0); #define firstlineregexnocase(P) compileregex_opts(P, PCRE_CASELESS); #endif extern pcre *multilineregex(const char *pattern); extern int matchregex(const char *needle, pcre *pcrecode); extern void freeregex(pcre *pcrecode); extern int namematch(const char *needle, char *haystack, pcre *pcrecode); extern int patternmatch(char *datatosearch, char *pattern, pcre *pcrecode); extern pcre **compile_exprs(char *id, const char **patterns, int count); extern int pickdata(char *buf, pcre *expr, int dupok, ...); extern int timematch(char *holidaykey, char *tspec); #endif #endif xymon-4.3.28/lib/strfunc.c0000664000076400007640000001474012501343647015623 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains string handling routines. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: strfunc.c 7600 2015-03-15 17:55:51Z jccleaver $"; #include "config.h" #include #include #include #include #include #include "libxymon.h" #include "version.h" #define BUFSZINCREMENT 4096 strbuffer_t *newstrbuffer(int initialsize) { strbuffer_t *newbuf; newbuf = calloc(1, sizeof(strbuffer_t)); if (!initialsize) initialsize = 4096; newbuf->s = (char *)malloc(initialsize); if (newbuf->s == NULL) { errprintf("newstrbuffer: Attempt to allocate failed (initialsize=%d): %s\n", initialsize, strerror(errno)); xfree(newbuf); return NULL; } *(newbuf->s) = '\0'; newbuf->sz = initialsize; return newbuf; } strbuffer_t *convertstrbuffer(char *buffer, int bufsz) { strbuffer_t *newbuf; newbuf = calloc(1, sizeof(strbuffer_t)); newbuf->s = buffer; newbuf->used = strlen(buffer); newbuf->sz = (bufsz ? bufsz : newbuf->used+1); return newbuf; } void freestrbuffer(strbuffer_t *buf) { if (buf == NULL) return; if (buf->s) xfree(buf->s); xfree(buf); } void clearstrbuffer(strbuffer_t *buf) { if (buf == NULL) return; if (buf->s) { *(buf->s) = '\0'; buf->used = 0; } } char *grabstrbuffer(strbuffer_t *buf) { char *result; if (buf == NULL) return NULL; result = buf->s; xfree(buf); return result; } strbuffer_t *dupstrbuffer(char *src) { strbuffer_t *newbuf; int len = 0; newbuf = newstrbuffer(0); if (src) { newbuf->s = strdup(src); len = strlen(src); newbuf->used = newbuf->sz = len; } return newbuf; } static void strbuf_addtobuffer(strbuffer_t *buf, char *newtext, int newlen) { if (buf->s == NULL) { buf->used = 0; buf->sz = newlen + BUFSZINCREMENT; buf->s = (char *) malloc(buf->sz); *(buf->s) = '\0'; } else if ((buf->used + newlen + 1) > buf->sz) { buf->sz += (newlen + BUFSZINCREMENT); buf->s = (char *) realloc(buf->s, buf->sz); } if (newtext) { memcpy(buf->s+buf->used, newtext, newlen); buf->used += newlen; /* Make sure result buffer is NUL-terminated; newtext might not be. */ *(buf->s + buf->used) = '\0'; } } void addtobuffer(strbuffer_t *buf, char *newtext) { if (newtext) strbuf_addtobuffer(buf, newtext, strlen(newtext)); } void addtobuffer_many(strbuffer_t *buf, ...) { va_list ap; char *newtext; va_start(ap, buf); newtext = va_arg(ap, char *); while (newtext) { strbuf_addtobuffer(buf, newtext, strlen(newtext)); newtext = va_arg(ap, char *); } va_end(ap); } void addtostrbuffer(strbuffer_t *buf, strbuffer_t *newtext) { strbuf_addtobuffer(buf, STRBUF(newtext), STRBUFLEN(newtext)); } void addtobufferraw(strbuffer_t *buf, char *newdata, int bytes) { /* Add binary data to the buffer */ strbuf_addtobuffer(buf, newdata, bytes); } void strbufferchop(strbuffer_t *buf, int count) { /* Remove COUNT characters from end of buffer */ if ((buf == NULL) || (buf->s == NULL)) return; if (count >= buf->used) count = buf->used; buf->used -= count; *(buf->s+buf->used) = '\0'; } void strbufferrecalc(strbuffer_t *buf) { if (buf == NULL) return; if (buf->s == NULL) { buf->used = 0; return; } buf->used = strlen(buf->s); } void strbuffergrow(strbuffer_t *buf, int bytes) { if (buf == NULL) return; buf->sz += bytes; buf->s = (char *) realloc(buf->s, buf->sz); } void strbufferuse(strbuffer_t *buf, int bytes) { if (buf == NULL) return; if ((buf->used + bytes) < buf->sz) { buf->used += bytes; } else { errprintf("strbuffer: Attempt to use more than allocated (sz=%d, used=%d, growbytes=%d\n", buf->sz, buf->used, bytes); } *(buf->s+buf->used) = '\0'; } char *htmlquoted(char *s) { /* * This routine converts a plain string into an html-quoted string */ static strbuffer_t *result = NULL; char *inp, *endp; char c; if (!s) return NULL; if (!result) result = newstrbuffer(4096); clearstrbuffer(result); inp = s; do { endp = inp + strcspn(inp, "\"&<> "); c = *endp; if (endp > inp) addtobufferraw(result, inp, endp-inp); switch (c) { case '"': addtobuffer(result, """); break; case '&': addtobuffer(result, "&"); break; case '<': addtobuffer(result, "<"); break; case '>': addtobuffer(result, ">"); break; case ' ': addtobuffer(result, " "); break; default: break; } inp = (c == '\0') ? NULL : endp+1; } while (inp); return STRBUF(result); } char *prehtmlquoted(char *s) { /* * This routine converts a string which may contain html to a string * safe to include in a PRE block. It's similar to above, but escapes * only the minmum characters for efficiency. */ static strbuffer_t *result = NULL; char *inp, *endp; char c; if (!s) return NULL; if (!result) result = newstrbuffer(4096); clearstrbuffer(result); inp = s; do { endp = inp + strcspn(inp, "&<>"); c = *endp; if (endp > inp) addtobufferraw(result, inp, endp-inp); switch (c) { case '&': addtobuffer(result, "&"); break; case '<': addtobuffer(result, "<"); break; case '>': addtobuffer(result, ">"); break; // this is not, strictly speaking, needed, but unbalanced encoding might confuse automated readers default: break; } inp = (c == '\0') ? NULL : endp+1; } while (inp); return STRBUF(result); } strbuffer_t *replacetext(char *original, char *oldtext, char *newtext) { strbuffer_t *result = newstrbuffer(0); char *pos = original, *start; do { start = pos; pos = strstr(pos, oldtext); if (pos) { if (pos > start) strbuf_addtobuffer(result, start, (pos - start)); addtobuffer(result, newtext); pos += strlen(oldtext); } else addtobuffer(result, start); } while (pos); return result; } xymon-4.3.28/lib/xymond_buffer.h0000664000076400007640000000173112174246230017003 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __XYMOND_BUFFER_H__ #define __XYMOND_BUFFER_H__ enum msgchannels_t { C_STATUS=1, C_STACHG, C_PAGE, C_DATA, C_NOTES, C_ENADIS, C_CLIENT, C_CLICHG, C_USER, C_FEEDBACK_QUEUE, C_LAST }; extern unsigned int shbufsz(enum msgchannels_t chnid); #endif xymon-4.3.28/lib/timefunc.h0000664000076400007640000000266212000046362015742 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __TIMEFUNC_H__ #define __TIMEFUNC_H__ extern time_t fakestarttime; extern char *timestamp; extern time_t getcurrenttime(time_t *retparm); #define time(X) getcurrenttime(X) extern void init_timestamp(void); extern char *timespec_text(char *spec); extern struct timespec *tvdiff(struct timespec *tstart, struct timespec *tend, struct timespec *result); extern int within_sla(char *holidaykey, char *timespec, int defresult); extern int periodcoversnow(char *tag); extern char *histlogtime(time_t histtime); extern int durationvalue(char *dur); extern char *durationstring(time_t secs); extern char *agestring(time_t secs); extern time_t timestr2timet(char *s); extern time_t eventreport_time(char *timestamp); #endif xymon-4.3.28/lib/rmd160c.c0000664000076400007640000003511212000317413015271 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This file is part of the Xymon monitor library, but was taken from the */ /* FreeBSD sources. It was originally written by Eric Young, and is NOT */ /* licensed under the GPL. Please adhere the original copyright notice below. */ /*----------------------------------------------------------------------------*/ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ #include #include #include #include "rmd_locl.h" /* * The assembly-language code is not position-independent, so don't * try to use it in a shared library. */ #ifdef PIC #undef RMD160_ASM #endif // static char *RMD160_version="RIPEMD160 part of SSLeay 0.9.0b 11-Oct-1998"; #ifdef RMD160_ASM static void ripemd160_block_x86(RIPEMD160_CTX *c, const u_int32_t *p,int num); #define ripemd160_block ripemd160_block_x86 #else static void ripemd160_block(RIPEMD160_CTX *c, const u_int32_t *p,int num); #endif static void RIPEMD160_Init(c) RIPEMD160_CTX *c; { c->A=RIPEMD160_A; c->B=RIPEMD160_B; c->C=RIPEMD160_C; c->D=RIPEMD160_D; c->E=RIPEMD160_E; c->Nl=0; c->Nh=0; c->num=0; } static void RIPEMD160_Update(c, in, len) RIPEMD160_CTX *c; const void *in; size_t len; { u_int32_t *p; int sw,sc; u_int32_t l; const unsigned char *data = in; if (len == 0) return; l=(c->Nl+(len<<3))&0xffffffffL; if (l < c->Nl) /* overflow */ c->Nh++; c->Nh+=(len>>29); c->Nl=l; if (c->num != 0) { p=c->data; sw=c->num>>2; sc=c->num&0x03; if ((c->num+len) >= RIPEMD160_CBLOCK) { l= p[sw]; p_c2l(data,l,sc); p[sw++]=l; for (; swnum); ripemd160_block(c,p,64); c->num=0; /* drop through and do the rest */ } else { int ew,ec; c->num+=(int)len; if ((sc+len) < 4) /* ugly, add char's to a word */ { l= p[sw]; p_c2l_p(data,l,sc,len); p[sw]=l; } else { ew=(c->num>>2); ec=(c->num&0x03); l= p[sw]; p_c2l(data,l,sc); p[sw++]=l; for (; sw < ew; sw++) { c2l(data,l); p[sw]=l; } if (ec) { c2l_p(data,l,ec); p[sw]=l; } } return; } } /* we now can process the input data in blocks of RIPEMD160_CBLOCK * chars and save the leftovers to c->data. */ #if BYTE_ORDER == LITTLE_ENDIAN if ((((unsigned long)data)%sizeof(u_int32_t)) == 0) { sw=(int)len/RIPEMD160_CBLOCK; if (sw > 0) { sw*=RIPEMD160_CBLOCK; ripemd160_block(c,(u_int32_t *)data,sw); data+=sw; len-=sw; } } #endif p=c->data; while (len >= RIPEMD160_CBLOCK) { #if BYTE_ORDER == LITTLE_ENDIAN || BYTE_ORDER == BIG_ENDIAN if (p != (u_int32_t *)data) memcpy(p,data,RIPEMD160_CBLOCK); data+=RIPEMD160_CBLOCK; #if BYTE_ORDER == BIG_ENDIAN for (sw=(RIPEMD160_LBLOCK/4); sw; sw--) { Endian_Reverse32(p[0]); Endian_Reverse32(p[1]); Endian_Reverse32(p[2]); Endian_Reverse32(p[3]); p+=4; } #endif #else for (sw=(RIPEMD160_LBLOCK/4); sw; sw--) { c2l(data,l); *(p++)=l; c2l(data,l); *(p++)=l; c2l(data,l); *(p++)=l; c2l(data,l); *(p++)=l; } #endif p=c->data; ripemd160_block(c,p,64); len-=RIPEMD160_CBLOCK; } sc=(int)len; c->num=sc; if (sc) { sw=sc>>2; /* words to copy */ #if BYTE_ORDER == LITTLE_ENDIAN p[sw]=0; memcpy(p,data,sc); #else sc&=0x03; for ( ; sw; sw--) { c2l(data,l); *(p++)=l; } c2l_p(data,l,sc); *p=l; #endif } } #ifndef RMD160_ASM static void ripemd160_block(ctx, X, num) RIPEMD160_CTX *ctx; const u_int32_t *X; int num; { u_int32_t A,B,C,D,E; u_int32_t a,b,c,d,e; for (;;) { A=ctx->A; B=ctx->B; C=ctx->C; D=ctx->D; E=ctx->E; RIP1(A,B,C,D,E,WL00,SL00); RIP1(E,A,B,C,D,WL01,SL01); RIP1(D,E,A,B,C,WL02,SL02); RIP1(C,D,E,A,B,WL03,SL03); RIP1(B,C,D,E,A,WL04,SL04); RIP1(A,B,C,D,E,WL05,SL05); RIP1(E,A,B,C,D,WL06,SL06); RIP1(D,E,A,B,C,WL07,SL07); RIP1(C,D,E,A,B,WL08,SL08); RIP1(B,C,D,E,A,WL09,SL09); RIP1(A,B,C,D,E,WL10,SL10); RIP1(E,A,B,C,D,WL11,SL11); RIP1(D,E,A,B,C,WL12,SL12); RIP1(C,D,E,A,B,WL13,SL13); RIP1(B,C,D,E,A,WL14,SL14); RIP1(A,B,C,D,E,WL15,SL15); RIP2(E,A,B,C,D,WL16,SL16,KL1); RIP2(D,E,A,B,C,WL17,SL17,KL1); RIP2(C,D,E,A,B,WL18,SL18,KL1); RIP2(B,C,D,E,A,WL19,SL19,KL1); RIP2(A,B,C,D,E,WL20,SL20,KL1); RIP2(E,A,B,C,D,WL21,SL21,KL1); RIP2(D,E,A,B,C,WL22,SL22,KL1); RIP2(C,D,E,A,B,WL23,SL23,KL1); RIP2(B,C,D,E,A,WL24,SL24,KL1); RIP2(A,B,C,D,E,WL25,SL25,KL1); RIP2(E,A,B,C,D,WL26,SL26,KL1); RIP2(D,E,A,B,C,WL27,SL27,KL1); RIP2(C,D,E,A,B,WL28,SL28,KL1); RIP2(B,C,D,E,A,WL29,SL29,KL1); RIP2(A,B,C,D,E,WL30,SL30,KL1); RIP2(E,A,B,C,D,WL31,SL31,KL1); RIP3(D,E,A,B,C,WL32,SL32,KL2); RIP3(C,D,E,A,B,WL33,SL33,KL2); RIP3(B,C,D,E,A,WL34,SL34,KL2); RIP3(A,B,C,D,E,WL35,SL35,KL2); RIP3(E,A,B,C,D,WL36,SL36,KL2); RIP3(D,E,A,B,C,WL37,SL37,KL2); RIP3(C,D,E,A,B,WL38,SL38,KL2); RIP3(B,C,D,E,A,WL39,SL39,KL2); RIP3(A,B,C,D,E,WL40,SL40,KL2); RIP3(E,A,B,C,D,WL41,SL41,KL2); RIP3(D,E,A,B,C,WL42,SL42,KL2); RIP3(C,D,E,A,B,WL43,SL43,KL2); RIP3(B,C,D,E,A,WL44,SL44,KL2); RIP3(A,B,C,D,E,WL45,SL45,KL2); RIP3(E,A,B,C,D,WL46,SL46,KL2); RIP3(D,E,A,B,C,WL47,SL47,KL2); RIP4(C,D,E,A,B,WL48,SL48,KL3); RIP4(B,C,D,E,A,WL49,SL49,KL3); RIP4(A,B,C,D,E,WL50,SL50,KL3); RIP4(E,A,B,C,D,WL51,SL51,KL3); RIP4(D,E,A,B,C,WL52,SL52,KL3); RIP4(C,D,E,A,B,WL53,SL53,KL3); RIP4(B,C,D,E,A,WL54,SL54,KL3); RIP4(A,B,C,D,E,WL55,SL55,KL3); RIP4(E,A,B,C,D,WL56,SL56,KL3); RIP4(D,E,A,B,C,WL57,SL57,KL3); RIP4(C,D,E,A,B,WL58,SL58,KL3); RIP4(B,C,D,E,A,WL59,SL59,KL3); RIP4(A,B,C,D,E,WL60,SL60,KL3); RIP4(E,A,B,C,D,WL61,SL61,KL3); RIP4(D,E,A,B,C,WL62,SL62,KL3); RIP4(C,D,E,A,B,WL63,SL63,KL3); RIP5(B,C,D,E,A,WL64,SL64,KL4); RIP5(A,B,C,D,E,WL65,SL65,KL4); RIP5(E,A,B,C,D,WL66,SL66,KL4); RIP5(D,E,A,B,C,WL67,SL67,KL4); RIP5(C,D,E,A,B,WL68,SL68,KL4); RIP5(B,C,D,E,A,WL69,SL69,KL4); RIP5(A,B,C,D,E,WL70,SL70,KL4); RIP5(E,A,B,C,D,WL71,SL71,KL4); RIP5(D,E,A,B,C,WL72,SL72,KL4); RIP5(C,D,E,A,B,WL73,SL73,KL4); RIP5(B,C,D,E,A,WL74,SL74,KL4); RIP5(A,B,C,D,E,WL75,SL75,KL4); RIP5(E,A,B,C,D,WL76,SL76,KL4); RIP5(D,E,A,B,C,WL77,SL77,KL4); RIP5(C,D,E,A,B,WL78,SL78,KL4); RIP5(B,C,D,E,A,WL79,SL79,KL4); a=A; b=B; c=C; d=D; e=E; /* Do other half */ A=ctx->A; B=ctx->B; C=ctx->C; D=ctx->D; E=ctx->E; RIP5(A,B,C,D,E,WR00,SR00,KR0); RIP5(E,A,B,C,D,WR01,SR01,KR0); RIP5(D,E,A,B,C,WR02,SR02,KR0); RIP5(C,D,E,A,B,WR03,SR03,KR0); RIP5(B,C,D,E,A,WR04,SR04,KR0); RIP5(A,B,C,D,E,WR05,SR05,KR0); RIP5(E,A,B,C,D,WR06,SR06,KR0); RIP5(D,E,A,B,C,WR07,SR07,KR0); RIP5(C,D,E,A,B,WR08,SR08,KR0); RIP5(B,C,D,E,A,WR09,SR09,KR0); RIP5(A,B,C,D,E,WR10,SR10,KR0); RIP5(E,A,B,C,D,WR11,SR11,KR0); RIP5(D,E,A,B,C,WR12,SR12,KR0); RIP5(C,D,E,A,B,WR13,SR13,KR0); RIP5(B,C,D,E,A,WR14,SR14,KR0); RIP5(A,B,C,D,E,WR15,SR15,KR0); RIP4(E,A,B,C,D,WR16,SR16,KR1); RIP4(D,E,A,B,C,WR17,SR17,KR1); RIP4(C,D,E,A,B,WR18,SR18,KR1); RIP4(B,C,D,E,A,WR19,SR19,KR1); RIP4(A,B,C,D,E,WR20,SR20,KR1); RIP4(E,A,B,C,D,WR21,SR21,KR1); RIP4(D,E,A,B,C,WR22,SR22,KR1); RIP4(C,D,E,A,B,WR23,SR23,KR1); RIP4(B,C,D,E,A,WR24,SR24,KR1); RIP4(A,B,C,D,E,WR25,SR25,KR1); RIP4(E,A,B,C,D,WR26,SR26,KR1); RIP4(D,E,A,B,C,WR27,SR27,KR1); RIP4(C,D,E,A,B,WR28,SR28,KR1); RIP4(B,C,D,E,A,WR29,SR29,KR1); RIP4(A,B,C,D,E,WR30,SR30,KR1); RIP4(E,A,B,C,D,WR31,SR31,KR1); RIP3(D,E,A,B,C,WR32,SR32,KR2); RIP3(C,D,E,A,B,WR33,SR33,KR2); RIP3(B,C,D,E,A,WR34,SR34,KR2); RIP3(A,B,C,D,E,WR35,SR35,KR2); RIP3(E,A,B,C,D,WR36,SR36,KR2); RIP3(D,E,A,B,C,WR37,SR37,KR2); RIP3(C,D,E,A,B,WR38,SR38,KR2); RIP3(B,C,D,E,A,WR39,SR39,KR2); RIP3(A,B,C,D,E,WR40,SR40,KR2); RIP3(E,A,B,C,D,WR41,SR41,KR2); RIP3(D,E,A,B,C,WR42,SR42,KR2); RIP3(C,D,E,A,B,WR43,SR43,KR2); RIP3(B,C,D,E,A,WR44,SR44,KR2); RIP3(A,B,C,D,E,WR45,SR45,KR2); RIP3(E,A,B,C,D,WR46,SR46,KR2); RIP3(D,E,A,B,C,WR47,SR47,KR2); RIP2(C,D,E,A,B,WR48,SR48,KR3); RIP2(B,C,D,E,A,WR49,SR49,KR3); RIP2(A,B,C,D,E,WR50,SR50,KR3); RIP2(E,A,B,C,D,WR51,SR51,KR3); RIP2(D,E,A,B,C,WR52,SR52,KR3); RIP2(C,D,E,A,B,WR53,SR53,KR3); RIP2(B,C,D,E,A,WR54,SR54,KR3); RIP2(A,B,C,D,E,WR55,SR55,KR3); RIP2(E,A,B,C,D,WR56,SR56,KR3); RIP2(D,E,A,B,C,WR57,SR57,KR3); RIP2(C,D,E,A,B,WR58,SR58,KR3); RIP2(B,C,D,E,A,WR59,SR59,KR3); RIP2(A,B,C,D,E,WR60,SR60,KR3); RIP2(E,A,B,C,D,WR61,SR61,KR3); RIP2(D,E,A,B,C,WR62,SR62,KR3); RIP2(C,D,E,A,B,WR63,SR63,KR3); RIP1(B,C,D,E,A,WR64,SR64); RIP1(A,B,C,D,E,WR65,SR65); RIP1(E,A,B,C,D,WR66,SR66); RIP1(D,E,A,B,C,WR67,SR67); RIP1(C,D,E,A,B,WR68,SR68); RIP1(B,C,D,E,A,WR69,SR69); RIP1(A,B,C,D,E,WR70,SR70); RIP1(E,A,B,C,D,WR71,SR71); RIP1(D,E,A,B,C,WR72,SR72); RIP1(C,D,E,A,B,WR73,SR73); RIP1(B,C,D,E,A,WR74,SR74); RIP1(A,B,C,D,E,WR75,SR75); RIP1(E,A,B,C,D,WR76,SR76); RIP1(D,E,A,B,C,WR77,SR77); RIP1(C,D,E,A,B,WR78,SR78); RIP1(B,C,D,E,A,WR79,SR79); D =ctx->B+c+D; ctx->B=ctx->C+d+E; ctx->C=ctx->D+e+A; ctx->D=ctx->E+a+B; ctx->E=ctx->A+b+C; ctx->A=D; X+=16; num-=64; if (num <= 0) break; } } #endif static void RIPEMD160_Final(md, c) unsigned char *md; RIPEMD160_CTX *c; { int i,j; u_int32_t l; u_int32_t *p; static unsigned char end[4]={0x80,0x00,0x00,0x00}; unsigned char *cp=end; /* c->num should definitly have room for at least one more byte. */ p=c->data; j=c->num; i=j>>2; /* purify often complains about the following line as an * Uninitialized Memory Read. While this can be true, the * following p_c2l macro will reset l when that case is true. * This is because j&0x03 contains the number of 'valid' bytes * already in p[i]. If and only if j&0x03 == 0, the UMR will * occur but this is also the only time p_c2l will do * l= *(cp++) instead of l|= *(cp++) * Many thanks to Alex Tang for pickup this * 'potential bug' */ #ifdef PURIFY if ((j&0x03) == 0) p[i]=0; #endif l=p[i]; p_c2l(cp,l,j&0x03); p[i]=l; i++; /* i is the next 'undefined word' */ if (c->num >= RIPEMD160_LAST_BLOCK) { for (; iNl; p[RIPEMD160_LBLOCK-1]=c->Nh; ripemd160_block(c,p,64); cp=md; l=c->A; l2c(l,cp); l=c->B; l2c(l,cp); l=c->C; l2c(l,cp); l=c->D; l2c(l,cp); l=c->E; l2c(l,cp); /* clear stuff, ripemd160_block may be leaving some stuff on the stack * but I'm not worried :-) */ c->num=0; /* memset((char *)&c,0,sizeof(c));*/ } #ifdef undef int printit(l) unsigned long *l; { int i,ii; for (i=0; i<2; i++) { for (ii=0; ii<8; ii++) { fprintf(stderr,"%08lx ",l[i*8+ii]); } fprintf(stderr,"\n"); } } #endif /* Added for Xymon - not part of the original file */ int myRIPEMD160_Size(void) { return sizeof(RIPEMD160_CTX); } void myRIPEMD160_Init(void *c) { RIPEMD160_Init((RIPEMD160_CTX *)c); } void myRIPEMD160_Update(void *c, unsigned char *in, int len) {RIPEMD160_Update((RIPEMD160_CTX *)c, in, len); } void myRIPEMD160_Final(char md[20], void *c) { RIPEMD160_Final(md, (RIPEMD160_CTX *)c); } #ifdef STANDALONE #include #include int main(int argc, char *argv[]) { FILE *fd; unsigned char buf[8192]; int buflen, i; unsigned char md[20]; char md_string[41]; char *p; void *c; fd = fopen(argv[1], "r"); if (fd == NULL) return 1; c = (void *)malloc(myRIPEMD160_Size()); myRIPEMD160_Init(c); while ((buflen = fread(buf, 1, sizeof(buf), fd)) > 0) myRIPEMD160_Update(c, buf, buflen); fclose(fd); myRIPEMD160_Final(md, c); for(i = 0, p = md_string; (i < sizeof(md)); i++) p += sprintf(p, "%02x", md[i]); *p = '\0'; printf("%s\n", md_string); return 0; } #endif xymon-4.3.28/lib/webaccess.c0000664000076400007640000000632111665414371016075 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains routines for web access control. */ /* */ /* Copyright (C) 2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: misc.c 6712 2011-07-31 21:01:52Z storner $"; #include #include "config.h" #include "libxymon.h" void *acctree = NULL; void *load_web_access_config(char *accessfn) { FILE *fd; strbuffer_t *buf; if (acctree) return 0; acctree = xtreeNew(strcasecmp); fd = stackfopen(accessfn, "r", NULL); if (fd == NULL) return NULL; buf = newstrbuffer(0); while (stackfgets(buf, NULL)) { char *group, *member; char *key; group = strtok(STRBUF(buf), ": \n"); if (!group) continue; member = strtok(NULL, ", \n"); while (member) { key = (char *)malloc(strlen(group) + strlen(member) + 2); sprintf(key, "%s %s", group, member); xtreeAdd(acctree, key, NULL); member = strtok(NULL, ", \n"); } } stackfclose(fd); return acctree; } int web_access_allowed(char *username, char *hostname, char *testname, web_access_type_t acc) { void *hinfo; char *pages, *onepg, *key; hinfo = hostinfo(hostname); if (!hinfo || !acctree || !username) return 0; /* Check for "root" access first */ key = (char *)malloc(strlen(username) + 6); sprintf(key, "root %s", username); if (xtreeFind(acctree, key) != xtreeEnd(acctree)) { xfree(key); return 1; } xfree(key); pages = strdup(xmh_item(hinfo, XMH_ALLPAGEPATHS)); onepg = strtok(pages, ","); while (onepg) { char *p; p = strchr(onepg, '/'); if (p) *p = '\0'; /* Will only look at the top-level path element */ key = (char *)malloc(strlen(onepg) + strlen(username) + 2); sprintf(key, "%s %s", onepg, username); if (xtreeFind(acctree, key) != xtreeEnd(acctree)) { xfree(key); xfree(pages); return 1; } xfree(key); onepg = strtok(NULL, ","); } xfree(pages); if (hostname) { /* See if user is a member of a group named by the hostname */ key = (char *)malloc(strlen(hostname) + strlen(username) + 2); sprintf(key, "%s %s", hostname, username); if (xtreeFind(acctree, key) != xtreeEnd(acctree)) { xfree(key); return 1; } xfree(key); } if (testname) { /* See if user is a member of a group named by the testname */ key = (char *)malloc(strlen(testname) + strlen(username) + 2); sprintf(key, "%s %s", testname, username); if (xtreeFind(acctree, key) != xtreeEnd(acctree)) { xfree(key); return 1; } xfree(key); } return 0; } xymon-4.3.28/lib/misc.h0000664000076400007640000000447212656201271015075 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __MISC_H__ #define __MISC_H__ #include enum ostype_t { OS_UNKNOWN, OS_SOLARIS, OS_OSF, OS_AIX, OS_HPUX, OS_WIN32, OS_FREEBSD, OS_NETBSD, OS_OPENBSD, OS_LINUX22, OS_LINUX, OS_RHEL3, OS_SNMP, OS_IRIX, OS_DARWIN, OS_SCO_SV, OS_NETWARE_SNMP, OS_WIN32_HMDC, OS_WIN32_BBWIN, OS_WIN_POWERSHELL, OS_ZVM, OS_ZVSE, OS_ZOS, OS_SNMPCOLLECT, OS_MQCOLLECT, OS_GNUKFREEBSD } ; extern enum ostype_t get_ostype(char *osname); extern char *osname(enum ostype_t os); extern int hexvalue(unsigned char c); extern char *commafy(char *hostname); extern void uncommafy(char *hostname); extern char *skipword(char *l); extern char *skipwhitespace(char *l); extern char *stripnonwords(char *l); extern int argnmatch(char *arg, char *match); extern char *msg_data(char *msg, int stripcr); extern char *gettok(char *s, char *delims); extern char *wstok(char *s); extern void sanitize_input(strbuffer_t *l, int stripcomment, int unescape); extern unsigned int IPtou32(int ip1, int ip2, int ip3, int ip4); extern char *u32toIP(unsigned int ip32); extern const char *textornull(const char *text); extern int issimpleword(const char *text); extern int get_fqdn(void); extern int generate_static(void); extern void do_extensions(FILE *output, char *extenv, char *family); extern char **setup_commandargs(char *cmdline, char **cmd); extern int checkalert(char *alertlist, char *test); extern long long str2ll(char *s, char **errptr); extern char *nextcolumn(char *s); extern int selectcolumn(char *heading, char *wanted); extern char *getcolumn(char *s, int wanted); extern int chkfreespace(char *path, int minblks, int mininodes); #endif xymon-4.3.28/lib/links.h0000664000076400007640000000164011622212202015240 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __LINKS_H__ #define __LINKS_H__ extern char *link_docext(char *fn); extern void load_all_links(void); extern char *columnlink(char *colname); extern char *hostlink(char *hostname); #endif xymon-4.3.28/lib/suid.h0000664000076400007640000000156311615341300015074 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2006-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __SUID_H__ #define __SUID_H__ extern void drop_root(void); extern void get_root(void); extern void drop_root_and_removesuid(char *fn); #endif xymon-4.3.28/lib/sendmsg.c0000664000076400007640000005630512473243106015577 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains routines for communicating with the Xymon daemon */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: sendmsg.c 7585 2015-02-25 03:49:26Z jccleaver $"; #include "config.h" #include #include #include #include #include #include #include #include #include #ifdef HAVE_SYS_SELECT_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" #define SENDRETRIES 2 /* These commands go to all Xymon servers */ static char *multircptcmds[] = { "status", "combo", "extcombo", "meta", "data", "notify", "enable", "disable", "drop", "rename", "client", NULL }; static char errordetails[1024]; /* Stuff for combo message handling */ int xymonmsgcount = 0; /* Number of messages transmitted */ int xymonstatuscount = 0; /* Number of status items reported */ int xymonnocombocount = 0; /* Number of status items reported outside combo msgs */ static int xymonmsgqueued; /* Anything in the buffer ? */ static strbuffer_t *xymonmsg = NULL; /* Complete combo message buffer */ static strbuffer_t *msgbuf = NULL; /* message buffer for one status message */ static int msgcolor; /* color of status message in msgbuf */ static int combo_is_local = 0; static int maxmsgspercombo = 100; /* 0 = no limit. 100 is a reasonable default. */ static int sleepbetweenmsgs = 0; static int xymondportnumber = 0; static char *xymonproxyhost = NULL; static int xymonproxyport = 0; static char *proxysetting = NULL; static char *comboofsstr = NULL; static int comboofssz = 0; static int *combooffsets = NULL; static int xymonmetaqueued; /* Anything in the buffer ? */ static strbuffer_t *metamsg = NULL; /* Complete meta message buffer */ static strbuffer_t *metabuf = NULL; /* message buffer for one meta message */ static int backfeedqueue = -1; static int max_backfeedsz = 16384; int dontsendmessages = 0; void setproxy(char *proxy) { if (proxysetting) xfree(proxysetting); proxysetting = strdup(proxy); } static void setup_transport(char *recipient) { static int transport_is_setup = 0; int default_port; if (transport_is_setup) return; transport_is_setup = 1; if (strncmp(recipient, "http://", 7) == 0) { /* * Send messages via http. This requires e.g. a CGI on the webserver to * receive the POST we do here. */ default_port = 80; if (proxysetting == NULL) proxysetting = getenv("http_proxy"); if (proxysetting) { char *p; xymonproxyhost = strdup(proxysetting); if (strncmp(xymonproxyhost, "http://", 7) == 0) xymonproxyhost += strlen("http://"); p = strchr(xymonproxyhost, ':'); if (p) { *p = '\0'; p++; xymonproxyport = atoi(p); } else { xymonproxyport = 8080; } } } else { /* * Non-HTTP transport - lookup portnumber in both XYMONDPORT env. * and the "xymond" entry from /etc/services. */ default_port = 1984; if (xgetenv("XYMONDPORT")) xymondportnumber = atoi(xgetenv("XYMONDPORT")); /* Next is /etc/services "bbd" entry */ if ((xymondportnumber <= 0) || (xymondportnumber > 65535)) { struct servent *svcinfo; svcinfo = getservbyname("bbd", NULL); if (!svcinfo) svcinfo = getservbyname("bb", NULL); if (svcinfo) xymondportnumber = ntohs(svcinfo->s_port); } } /* Last resort: The default value */ if ((xymondportnumber <= 0) || (xymondportnumber > 65535)) { xymondportnumber = default_port; } dbgprintf("Transport setup is:\n"); dbgprintf("xymondportnumber = %d\n", xymondportnumber); dbgprintf("xymonproxyhost = %s\n", (xymonproxyhost ? xymonproxyhost : "NONE")); dbgprintf("xymonproxyport = %d\n", xymonproxyport); } static int sendtoxymond(char *recipient, char *message, FILE *respfd, char **respstr, int fullresponse, int timeout) { struct in_addr addr; struct sockaddr_in saddr; int sockfd = -1; fd_set readfds; fd_set writefds; int res, isconnected, wdone, rdone; struct timeval tmo; char *msgptr = message; char *p; char *rcptip = NULL; int rcptport = 0; int connretries = SENDRETRIES; char *httpmessage = NULL; char recvbuf[32768]; int haveseenhttphdrs = 1; int respstrsz = 0; int respstrlen = 0; int result = XYMONSEND_OK; if (dontsendmessages && !respfd && !respstr) { fprintf(stdout, "%s\n", message); fflush(stdout); return XYMONSEND_OK; } setup_transport(recipient); dbgprintf("Recipient listed as '%s'\n", recipient); if (strncmp(recipient, "http://", strlen("http://")) != 0) { /* Standard communications, directly to Xymon daemon */ rcptip = strdup(recipient); rcptport = xymondportnumber; p = strchr(rcptip, ':'); if (p) { *p = '\0'; p++; rcptport = atoi(p); } dbgprintf("Standard protocol on port %d\n", rcptport); } else { char *bufp; char *posturl = NULL; char *posthost = NULL; if (xymonproxyhost == NULL) { char *p; /* * No proxy. "recipient" is "http://host[:port]/url/for/post" * Strip off "http://", and point "posturl" to the part after the hostname. * If a portnumber is present, strip it off and update rcptport. */ rcptip = strdup(recipient+strlen("http://")); rcptport = xymondportnumber; p = strchr(rcptip, '/'); if (p) { posturl = strdup(p); *p = '\0'; } p = strchr(rcptip, ':'); if (p) { *p = '\0'; p++; rcptport = atoi(p); } posthost = strdup(rcptip); dbgprintf("HTTP protocol directly to host %s\n", posthost); } else { char *p; /* * With proxy. The full "recipient" must be in the POST request. */ rcptip = strdup(xymonproxyhost); rcptport = xymonproxyport; posturl = strdup(recipient); p = strchr(recipient + strlen("http://"), '/'); if (p) { *p = '\0'; posthost = strdup(recipient + strlen("http://")); *p = '/'; p = strchr(posthost, ':'); if (p) *p = '\0'; } dbgprintf("HTTP protocol via proxy to host %s\n", posthost); } if ((posturl == NULL) || (posthost == NULL)) { sprintf(errordetails + strlen(errordetails), "Unable to parse HTTP recipient"); if (posturl) xfree(posturl); if (posthost) xfree(posthost); if (rcptip) xfree(rcptip); return XYMONSEND_EBADURL; } bufp = msgptr = httpmessage = malloc(strlen(message)+1024); bufp += sprintf(httpmessage, "POST %s HTTP/1.0\n", posturl); bufp += sprintf(bufp, "MIME-version: 1.0\n"); bufp += sprintf(bufp, "Content-Type: application/octet-stream\n"); bufp += sprintf(bufp, "Content-Length: %d\n", (int)strlen(message)); bufp += sprintf(bufp, "Host: %s\n", posthost); bufp += sprintf(bufp, "\n%s", message); if (posturl) xfree(posturl); if (posthost) xfree(posthost); haveseenhttphdrs = 0; dbgprintf("HTTP message is:\n%s\n", httpmessage); } if (inet_aton(rcptip, &addr) == 0) { /* recipient is not an IP - do DNS lookup */ struct hostent *hent; char hostip[IP_ADDR_STRLEN]; hent = gethostbyname(rcptip); if (hent) { memcpy(&addr, *(hent->h_addr_list), sizeof(struct in_addr)); strcpy(hostip, inet_ntoa(addr)); if (inet_aton(hostip, &addr) == 0) { result = XYMONSEND_EBADIP; goto done; } } else { sprintf(errordetails+strlen(errordetails), "Cannot determine IP address of message recipient %s", rcptip); result = XYMONSEND_EIPUNKNOWN; goto done; } } retry_connect: dbgprintf("Will connect to address %s port %d\n", rcptip, rcptport); memset(&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = addr.s_addr; saddr.sin_port = htons(rcptport); /* Get a non-blocking socket */ sockfd = socket(PF_INET, SOCK_STREAM, 0); if (sockfd == -1) { result = XYMONSEND_ENOSOCKET; goto done; } res = fcntl(sockfd, F_SETFL, O_NONBLOCK); if (res != 0) { result = XYMONSEND_ECANNOTDONONBLOCK; goto done; } res = connect(sockfd, (struct sockaddr *)&saddr, sizeof(saddr)); if ((res == -1) && (errno != EINPROGRESS)) { sprintf(errordetails+strlen(errordetails), "connect to Xymon daemon@%s:%d failed (%s)", rcptip, rcptport, strerror(errno)); result = XYMONSEND_ECONNFAILED; goto done; } rdone = ((respfd == NULL) && (respstr == NULL)); isconnected = wdone = 0; while (!wdone || !rdone) { FD_ZERO(&writefds); FD_ZERO(&readfds); if (!rdone) FD_SET(sockfd, &readfds); if (!wdone) FD_SET(sockfd, &writefds); tmo.tv_sec = timeout; tmo.tv_usec = 0; res = select(sockfd+1, &readfds, &writefds, NULL, (timeout ? &tmo : NULL)); if (res == -1) { sprintf(errordetails+strlen(errordetails), "Select failure while sending to Xymon daemon@%s:%d", rcptip, rcptport); result = XYMONSEND_ESELFAILED; goto done; } else if (res == 0) { /* Timeout! */ shutdown(sockfd, SHUT_RDWR); close(sockfd); if (!isconnected && (connretries > 0)) { dbgprintf("Timeout while talking to Xymon daemon@%s:%d - retrying\n", rcptip, rcptport); connretries--; sleep(1); goto retry_connect; /* Yuck! */ } result = XYMONSEND_ETIMEOUT; goto done; } else { if (!isconnected) { /* Havent seen our connect() status yet - must be now */ int connres; socklen_t connressize = sizeof(connres); res = getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &connres, &connressize); dbgprintf("Connect status is %d\n", connres); isconnected = (connres == 0); if (!isconnected) { sprintf(errordetails+strlen(errordetails), "Could not connect to Xymon daemon@%s:%d (%s)", rcptip, rcptport, strerror(connres)); result = XYMONSEND_ECONNFAILED; goto done; } } if (!rdone && FD_ISSET(sockfd, &readfds)) { char *outp; int n; n = recv(sockfd, recvbuf, sizeof(recvbuf)-1, 0); if (n > 0) { dbgprintf("Read %d bytes\n", n); recvbuf[n] = '\0'; /* * When running over a HTTP transport, we must strip * off the HTTP headers we get back, so the response * is consistent with what we get from the normal Xymon daemon * transport. * (Non-http transport sets "haveseenhttphdrs" to 1) */ if (!haveseenhttphdrs) { outp = strstr(recvbuf, "\r\n\r\n"); if (outp) { outp += 4; n -= (outp - recvbuf); haveseenhttphdrs = 1; } else n = 0; } else outp = recvbuf; if (n > 0) { if (respfd) { fwrite(outp, n, 1, respfd); } else if (respstr) { char *respend; if (respstrsz == 0) { respstrsz = (n+sizeof(recvbuf)); *respstr = (char *)malloc(respstrsz); } else if ((n+respstrlen) >= respstrsz) { respstrsz += (n+sizeof(recvbuf)); *respstr = (char *)realloc(*respstr, respstrsz); } respend = (*respstr) + respstrlen; memcpy(respend, outp, n); *(respend + n) = '\0'; respstrlen += n; } if (!fullresponse) { rdone = (strchr(outp, '\n') == NULL); } } } else rdone = 1; if (rdone) shutdown(sockfd, SHUT_RD); } if (!wdone && FD_ISSET(sockfd, &writefds)) { /* Send some data */ res = write(sockfd, msgptr, strlen(msgptr)); if (res == -1) { sprintf(errordetails+strlen(errordetails), "Write error while sending message to Xymon daemon@%s:%d", rcptip, rcptport); result = XYMONSEND_EWRITEERROR; goto done; } else { dbgprintf("Sent %d bytes\n", res); msgptr += res; wdone = (strlen(msgptr) == 0); if (wdone) shutdown(sockfd, SHUT_WR); } } } } done: dbgprintf("Closing connection\n"); shutdown(sockfd, SHUT_RDWR); if (sockfd > 0) close(sockfd); xfree(rcptip); if (httpmessage) xfree(httpmessage); return result; } static int sendtomany(char *onercpt, char *morercpts, char *msg, int timeout, sendreturn_t *response) { int allservers = 1, first = 1, result = XYMONSEND_OK; char *xymondlist, *rcpt; /* * Even though this is the "sendtomany" routine, we need to decide if the * request should go to all servers, or just a single server. The default * is to send to all servers - but commands that trigger a response can * only go to a single server. * * "schedule" is special - when scheduling an action there is no response, but * when it is the blank "schedule" command there will be a response. So a * schedule action goes to all Xymon servers, the blank "schedule" goes to a single * server. */ // errprintf("sendtomany: onercpt=%s\n", onercpt); if (strcmp(onercpt, "0.0.0.0") != 0) allservers = 0; else if (strncmp(msg, "schedule", 8) == 0) /* See if it's just a blank "schedule" command */ allservers = (strcmp(msg, "schedule") != 0); else { char *msgcmd; int i; /* See if this is a multi-recipient command */ i = strspn(msg, "abcdefghijklmnopqrstuvwxyz"); msgcmd = (char *)malloc(i+1); strncpy(msgcmd, msg, i); *(msgcmd+i) = '\0'; // errprintf("sendtomany: msgcmd=%s\n", msgcmd); for (i = 0; (multircptcmds[i] && strcmp(multircptcmds[i], msgcmd)); i++) ; xfree(msgcmd); allservers = (multircptcmds[i] != NULL); } // errprintf("sendtomany: allservers=%d\n", allservers); if (allservers && !morercpts) { sprintf(errordetails+strlen(errordetails), "No recipients listed! XYMSRV was %s, XYMSERVERS %s", onercpt, textornull(morercpts)); return XYMONSEND_EBADIP; } if (strcmp(onercpt, "0.0.0.0") != 0) xymondlist = strdup(onercpt); else xymondlist = strdup(morercpts); rcpt = strtok(xymondlist, " \t"); while (rcpt) { int oneres; if (first) { /* We grab the result from the first server */ char *respstr = NULL; if (response) { oneres = sendtoxymond(rcpt, msg, response->respfd, (response->respstr ? &respstr : NULL), (response->respfd || response->respstr), timeout); } else { oneres = sendtoxymond(rcpt, msg, NULL, NULL, 0, timeout); } if (oneres == XYMONSEND_OK) { if (respstr && response && response->respstr) { addtobuffer(response->respstr, respstr); xfree(respstr); } first = 0; } } else { /* Secondary servers do not yield a response */ oneres = sendtoxymond(rcpt, msg, NULL, NULL, 0, timeout); } /* Save any error results */ if (result == XYMONSEND_OK) result = oneres; /* * Handle more servers IF we're doing all servers, OR * we are still at the first one (because the previous * ones failed). */ if (allservers || first) rcpt = strtok(NULL, " \t"); else rcpt = NULL; } xfree(xymondlist); return result; } sendreturn_t *newsendreturnbuf(int fullresponse, FILE *respfd) { sendreturn_t *result; result = (sendreturn_t *)calloc(1, sizeof(sendreturn_t)); result->fullresponse = fullresponse; result->respfd = respfd; if (!respfd) { /* No response file, so return it in a strbuf */ result->respstr = newstrbuffer(0); } result->haveseenhttphdrs = 1; return result; } void freesendreturnbuf(sendreturn_t *s) { if (!s) return; if (s->respstr) freestrbuffer(s->respstr); xfree(s); } char *getsendreturnstr(sendreturn_t *s, int takeover) { char *result = NULL; if (!s) return NULL; if (!s->respstr) return NULL; result = STRBUF(s->respstr); if (takeover) { /* * We cannot leave respstr as NULL, because later calls * to sendmessage() might re-use this sendreturn_t struct * and expect to get the data back. So allocate a new * responsebuffer for future use - if it isn't used, it * will be freed by freesendreturnbuf(). */ s->respstr = newstrbuffer(0); } return result; } int sendmessage_init_local(void) { backfeedqueue = setup_feedback_queue(CHAN_CLIENT); if (backfeedqueue == -1) return -1; max_backfeedsz = 1024*shbufsz(C_FEEDBACK_QUEUE)-1; return max_backfeedsz; } void sendmessage_finish_local(void) { close_feedback_queue(backfeedqueue, CHAN_CLIENT); } sendresult_t sendmessage_local(char *msg) { int n, done = 0; #if defined(__OpenBSD__) || defined(__dietlibc__) unsigned long msglen; #else msglen_t msglen; #endif if (backfeedqueue == -1) { return sendmessage(msg, NULL, XYMON_TIMEOUT, NULL); } /* Make sure we dont overflow the message buffer */ msglen = strlen(msg); if (msglen > max_backfeedsz) { errprintf("Truncating backfeed channel message from %d to %d\n", msglen, max_backfeedsz); *(msg+max_backfeedsz) = '\0'; msglen = max_backfeedsz; } /* This will block if queue is full, but that is OK */ do { n = msgsnd(backfeedqueue, msg, msglen+1, 0); if ((n == 0) || ((n == -1) && (errno != EINTR))) done = 1; } while (!done); if (n == -1) { errprintf("Sending via backfeed channel failed: %s\n", strerror(errno)); return XYMONSEND_ECONNFAILED; } return XYMONSEND_OK; } sendresult_t sendmessage(char *msg, char *recipient, int timeout, sendreturn_t *response) { static char *xymsrv = NULL; int res = 0; *errordetails = '\0'; if ((xymsrv == NULL) && xgetenv("XYMSRV")) xymsrv = strdup(xgetenv("XYMSRV")); if (recipient == NULL) recipient = xymsrv; if ((recipient == NULL) && xgetenv("XYMSERVERS")) { recipient = "0.0.0.0"; } else if (recipient == NULL) { errprintf("No recipient for message\n"); return XYMONSEND_EBADIP; } res = sendtomany(recipient, xgetenv("XYMSERVERS"), msg, timeout, response); if (res != XYMONSEND_OK) { char *statustext = ""; char *eoln; switch (res) { case XYMONSEND_OK : statustext = "OK"; break; case XYMONSEND_EBADIP : statustext = "Bad IP address"; break; case XYMONSEND_EIPUNKNOWN : statustext = "Cannot resolve hostname"; break; case XYMONSEND_ENOSOCKET : statustext = "Cannot get a socket"; break; case XYMONSEND_ECANNOTDONONBLOCK : statustext = "Non-blocking I/O failed"; break; case XYMONSEND_ECONNFAILED : statustext = "Connection failed"; break; case XYMONSEND_ESELFAILED : statustext = "select(2) failed"; break; case XYMONSEND_ETIMEOUT : statustext = "timeout"; break; case XYMONSEND_EWRITEERROR : statustext = "write error"; break; case XYMONSEND_EREADERROR : statustext = "read error"; break; case XYMONSEND_EBADURL : statustext = "Bad URL"; break; default: statustext = "Unknown error"; break; }; eoln = strchr(msg, '\n'); if (eoln) *eoln = '\0'; if (strcmp(recipient, "0.0.0.0") == 0) recipient = xgetenv("XYMSERVERS"); errprintf("Whoops ! Failed to send message (%s)\n", statustext); errprintf("-> %s\n", errordetails); errprintf("-> Recipient '%s', timeout %d\n", recipient, timeout); errprintf("-> 1st line: '%s'\n", msg); if (eoln) *eoln = '\n'; } /* Give it a break */ if (sleepbetweenmsgs) usleep(sleepbetweenmsgs); xymonmsgcount++; return res; } /* Routines for handling combo message transmission */ static void combo_params(void) { static int issetup = 0; if (issetup) return; issetup = 1; if (xgetenv("MAXMSGSPERCOMBO")) maxmsgspercombo = atoi(xgetenv("MAXMSGSPERCOMBO")); if (maxmsgspercombo == 0) { /* Force it to 100 */ dbgprintf("MAXMSGSPERCOMBO is 0, setting it to 100\n"); maxmsgspercombo = 100; } if (xgetenv("SLEEPBETWEENMSGS")) sleepbetweenmsgs = atoi(xgetenv("SLEEPBETWEENMSGS")); comboofssz = 10*maxmsgspercombo; comboofsstr = (char *)malloc(comboofssz+1); combooffsets = (int *)malloc((maxmsgspercombo+1)*sizeof(int)); } void combo_start(void) { int n; combo_params(); memset(comboofsstr, ' ', comboofssz); memcpy(comboofsstr, "extcombo", 8); *(comboofsstr + comboofssz) = '\0'; memset(combooffsets, 0, maxmsgspercombo*sizeof(int)); combooffsets[0] = comboofssz; if (xymonmsg == NULL) xymonmsg = newstrbuffer(0); clearstrbuffer(xymonmsg); addtobufferraw(xymonmsg, comboofsstr, comboofssz); xymonmsgqueued = 0; combo_is_local = 0; } void combo_start_local(void) { combo_start(); combo_is_local = 1; } void meta_start(void) { if (metamsg == NULL) metamsg = newstrbuffer(0); clearstrbuffer(metamsg); xymonmetaqueued = 0; } static void combo_flush(void) { int i; char *outp; if (!xymonmsgqueued) { dbgprintf("Flush, but xymonmsg is empty\n"); return; } outp = strchr(STRBUF(xymonmsg), ' '); for (i = 0; (i <= xymonmsgqueued); i++) { outp += sprintf(outp, " %d", combooffsets[i]); } *outp = '\n'; if (debug) { char *p1, *p2; dbgprintf("Flushing combo message\n"); p1 = p2 = STRBUF(xymonmsg); do { p2++; p1 = strstr(p2, "\nstatus "); if (p1) { p1++; /* Skip the newline */ p2 = strchr(p1, '\n'); if (p2) *p2='\0'; printf(" %s\n", p1); if (p2) *p2='\n'; } } while (p1 && p2); } if (combo_is_local) { sendmessage_local(STRBUF(xymonmsg)); combo_start_local(); } else { sendmessage(STRBUF(xymonmsg), NULL, XYMON_TIMEOUT, NULL); combo_start(); } } static void meta_flush(void) { if (!xymonmetaqueued) { dbgprintf("Flush, but xymonmeta is empty\n"); return; } sendmessage(STRBUF(metamsg), NULL, XYMON_TIMEOUT, NULL); meta_start(); /* Get ready for the next */ } void combo_add(strbuffer_t *buf) { if (combo_is_local) { /* Check if message fits into the backfeed message buffer */ if ( (STRBUFLEN(xymonmsg) + STRBUFLEN(buf)) >= max_backfeedsz) { combo_flush(); } } else { /* Check if there is room for the message + 2 newlines */ if (maxmsgspercombo && (xymonmsgqueued >= maxmsgspercombo)) { combo_flush(); } } addtostrbuffer(xymonmsg, buf); combooffsets[++xymonmsgqueued] = STRBUFLEN(xymonmsg); } static void meta_add(strbuffer_t *buf) { /* Check if there is room for the message + 2 newlines */ if (maxmsgspercombo && (xymonmetaqueued >= maxmsgspercombo)) { /* Nope ... flush buffer */ meta_flush(); } else { /* Yep ... add delimiter before new status (but not before the first!) */ if (xymonmetaqueued) addtobuffer(metamsg, "\n\n"); } addtostrbuffer(metamsg, buf); xymonmetaqueued++; } void combo_end(void) { combo_flush(); combo_is_local = 0; dbgprintf("%d status messages merged into %d transmissions\n", xymonstatuscount, xymonmsgcount); } void meta_end(void) { meta_flush(); } void init_status(int color) { if (msgbuf == NULL) msgbuf = newstrbuffer(0); clearstrbuffer(msgbuf); msgcolor = color; xymonstatuscount++; } void init_meta(char *metaname) { if (metabuf == NULL) metabuf = newstrbuffer(0); clearstrbuffer(metabuf); } void addtostatus(char *p) { addtobuffer(msgbuf, p); } void addtostrstatus(strbuffer_t *p) { addtostrbuffer(msgbuf, p); } void addtometa(char *p) { addtobuffer(metabuf, p); } void finish_status(void) { if (debug) { char *p = strchr(STRBUF(msgbuf), '\n'); if (p) *p = '\0'; dbgprintf("Adding to combo msg: %s\n", STRBUF(msgbuf)); if (p) *p = '\n'; } combo_add(msgbuf); } void finish_meta(void) { meta_add(metabuf); } xymon-4.3.28/lib/matching.c0000664000076400007640000001124112621055261015715 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains routines for matching names and expressions */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: matching.c 7733 2015-11-12 09:24:01Z jccleaver $"; #include #include #include #include #include #include "libxymon.h" pcre *compileregex_opts(const char *pattern, int flags) { pcre *result; const char *errmsg; int errofs; dbgprintf("Compiling regex %s\n", pattern); result = pcre_compile(pattern, flags, &errmsg, &errofs, NULL); if (result == NULL) { errprintf("pcre compile '%s' failed (offset %d): %s\n", pattern, errofs, errmsg); return NULL; } return result; } pcre *compileregex(const char *pattern) { return compileregex_opts(pattern, PCRE_CASELESS); } pcre *multilineregex(const char *pattern) { return compileregex_opts(pattern, PCRE_CASELESS|PCRE_MULTILINE); } int matchregex(const char *needle, pcre *pcrecode) { int ovector[30]; int result; if (!needle || !pcrecode) return 0; result = pcre_exec(pcrecode, NULL, needle, strlen(needle), 0, 0, ovector, (sizeof(ovector)/sizeof(int))); return (result >= 0); } void freeregex(pcre *pcrecode) { if (!pcrecode) return; pcre_free(pcrecode); } int namematch(const char *needle, char *haystack, pcre *pcrecode) { char *xhay; char *tokbuf = NULL, *tok; int found = 0; int result = 0; int allneg = 1; if ((needle == NULL) || (*needle == '\0')) return 0; if (pcrecode) { /* Do regex matching. The regex has already been compiled for us. */ return matchregex(needle, pcrecode); } if (strcmp(haystack, "*") == 0) { /* Match anything */ return 1; } /* Implement a simple, no-wildcard match */ xhay = strdup(haystack); tok = strtok_r(xhay, ",", &tokbuf); while (tok) { allneg = (allneg && (*tok == '!')); if (!found) { if (*tok == '!') { found = (strcmp(tok+1, needle) == 0); if (found) result = 0; } else { found = (strcmp(tok, needle) == 0); if (found) result = 1; } } /* We must check all of the items in the haystack to see if they are all negative matches */ tok = strtok_r(NULL, ",", &tokbuf); } xfree(xhay); /* * If we didn't find it, and the list is exclusively negative matches, * we must return a positive result for "no match". */ if (!found && allneg) result = 1; return result; } int patternmatch(char *datatosearch, char *pattern, pcre *pcrecode) { if (pcrecode) { /* Do regex matching. The regex has already been compiled for us. */ return matchregex(datatosearch, pcrecode); } if (strcmp(pattern, "*") == 0) { /* Match anything */ return 1; } return (strstr(datatosearch, pattern) != NULL); } pcre **compile_exprs(char *id, const char **patterns, int count) { pcre **result = NULL; int i; result = (pcre **)calloc(count, sizeof(pcre *)); for (i=0; (i < count); i++) { result[i] = compileregex(patterns[i]); if (!result[i]) { errprintf("Internal error: %s pickdata PCRE-compile failed\n", id); for (i=0; (i < count); i++) if (result[i]) pcre_free(result[i]); xfree(result); return NULL; } } return result; } int pickdata(char *buf, pcre *expr, int dupok, ...) { int res, i; int ovector[30]; va_list ap; char **ptr; char w[100]; if (!expr) return 0; res = pcre_exec(expr, NULL, buf, strlen(buf), 0, 0, ovector, (sizeof(ovector)/sizeof(int))); if (res < 0) return 0; va_start(ap, dupok); for (i=1; (i < res); i++) { *w = '\0'; pcre_copy_substring(buf, ovector, res, i, w, sizeof(w)); ptr = va_arg(ap, char **); if (dupok) { if (*ptr) xfree(*ptr); *ptr = strdup(w); } else { if (*ptr == NULL) { *ptr = strdup(w); } else { dbgprintf("Internal error: Duplicate match ignored\n"); } } } va_end(ap); return 1; } int timematch(char *holidaykey, char *tspec) { int result; result = within_sla(holidaykey, tspec, 0); return result; } xymon-4.3.28/lib/url.c0000664000076400007640000004132212603243142014725 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains routines for URL parsing and mangling. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: url.c 7678 2015-10-01 14:42:42Z jccleaver $"; #include #include #include #include #include #include #include "libxymon.h" int obeybbproxysyntax = 0; /* Big Brother can put proxy-spec in a URL, with "http://proxy/bla;http://target/foo" */ /* This is used for loading a .netrc file with hostnames and authentication tokens. */ typedef struct loginlist_t { char *host; char *auth; struct loginlist_t *next; } loginlist_t; static loginlist_t *loginhead = NULL; /* * Convert a URL with "%XX" hexadecimal escaped style bytes into normal form. * Result length will always be <= source length. */ char *urlunescape(char *url) { static char *result = NULL; char *pin, *pout; pin = url; if (result) xfree(result); pout = result = (char *) malloc(strlen(url) + 1); while (*pin) { if (*pin == '+') { *pout = ' '; pin++; } else if (*pin == '%') { pin++; if ((strlen(pin) >= 2) && isxdigit((int)*pin) && isxdigit((int)*(pin+1))) { *pout = 16*hexvalue(*pin) + hexvalue(*(pin+1)); pin += 2; } else { *pout = '%'; pin++; } } else { *pout = *pin; pin++; } pout++; } *pout = '\0'; return result; } /* * Get an environment variable (eg: QUERY_STRING) and do CGI decoding of it. */ char *urldecode(char *envvar) { if (xgetenv(envvar) == NULL) return NULL; return urlunescape(xgetenv(envvar)); } /* * Do a CGI encoding of a URL, i.e. unusual chars are converted to %XX. */ char *urlencode(char *s) { static char *result = NULL; static int resbufsz = 0; char *inp, *outp; if (result == NULL) { result = (char *)malloc(1024); resbufsz = 1024; } outp = result; for (inp = s; (*inp); inp++) { if ((outp - result) > (resbufsz - 5)) { int offset = (outp - result); resbufsz += 1024; result = (char *)realloc(result, resbufsz); outp = result + offset; } if ( ( (*inp >= 'a') && (*inp <= 'z') ) || ( (*inp >= 'A') && (*inp <= 'Z') ) || ( (*inp >= '0') && (*inp <= '9') ) ) { *outp = *inp; outp++; } else { sprintf(outp, "%%%0x", *inp); outp += 3; } } *outp = '\0'; return result; } /* * Check if a URL contains only safe characters. * This is not really needed any more, since there are no more CGI * shell-scripts that directly process the QUERY_STRING parameter. */ int urlvalidate(char *query, char *validchars) { #if 0 static int valid; char *p; if (validchars == NULL) validchars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.-:&_%=*+/ "; for (p=query, valid=1; (valid && *p); p++) { valid = (strchr(validchars, *p) != NULL); } return valid; #else return 1; #endif } /* * Load the $HOME/.netrc file with authentication tokens for HTTP tests. */ static void load_netrc(void) { #define WANT_TOKEN 0 #define MACHINEVAL 1 #define LOGINVAL 2 #define PASSVAL 3 #define OTHERVAL 4 static int loaded = 0; char netrcfn[MAXPATHLEN]; FILE *fd; strbuffer_t *inbuf; char *host, *login, *password, *p; int state = WANT_TOKEN; if (loaded) return; loaded = 1; MEMDEFINE(netrcfn); /* Look for $XYMONHOME/etc/netrc first, then the default ~/.netrc */ sprintf(netrcfn, "%s/etc/netrc", xgetenv("XYMONHOME")); fd = fopen(netrcfn, "r"); /* Can HOME be undefined ? Yes, on Solaris when started during boot */ if ((fd == NULL) && getenv("HOME")) { sprintf(netrcfn, "%s/.netrc", xgetenv("HOME")); fd = fopen(netrcfn, "r"); } if (fd == NULL) { MEMUNDEFINE(netrcfn); return; } host = login = password = NULL; initfgets(fd); inbuf = newstrbuffer(0); while (unlimfgets(inbuf, fd)) { sanitize_input(inbuf, 0, 0); if (STRBUFLEN(inbuf) != 0) { p = strtok(STRBUF(inbuf), " \t"); while (p) { switch (state) { case WANT_TOKEN: if (strcmp(p, "machine") == 0) state = MACHINEVAL; else if (strcmp(p, "login") == 0) state = LOGINVAL; else if (strcmp(p, "password") == 0) state = PASSVAL; else if (strcmp(p, "account") == 0) state = OTHERVAL; else if (strcmp(p, "macdef") == 0) state = OTHERVAL; else if (strcmp(p, "default") == 0) { host = ""; state = WANT_TOKEN; } else state = WANT_TOKEN; break; case MACHINEVAL: host = strdup(p); state = WANT_TOKEN; break; case LOGINVAL: login = strdup(p); state = WANT_TOKEN; break; case PASSVAL: password = strdup(p); state = WANT_TOKEN; break; case OTHERVAL: state = WANT_TOKEN; break; } if (host && login && password) { loginlist_t *item = (loginlist_t *) malloc(sizeof(loginlist_t)); item->host = host; item->auth = (char *) malloc(strlen(login) + strlen(password) + 2); sprintf(item->auth, "%s:%s", login, password); item->next = loginhead; loginhead = item; host = login = password = NULL; } p = strtok(NULL, " \t"); } } } fclose(fd); freestrbuffer(inbuf); MEMUNDEFINE(netrcfn); } /* * Clean a URL of double-slashes. */ char *cleanurl(char *url) { static char *cleaned = NULL; char *pin, *pout; int lastwasslash = 0; if (cleaned == NULL) cleaned = (char *)malloc(strlen(url)+1); else { cleaned = (char *)realloc(cleaned, strlen(url)+1); } for (pin=url, pout=cleaned, lastwasslash=0; (*pin); pin++) { if (*pin == '/') { if (!lastwasslash) { *pout = *pin; pout++; } lastwasslash = 1; } else { *pout = *pin; pout++; lastwasslash = 0; } } *pout = '\0'; return cleaned; } /* * Parse a URL into components, following the guidelines in RFC 1808. * This fills out a urlelem_t struct with the elements, and also * constructs a canonical form of the URL. */ void parse_url(char *inputurl, urlelem_t *url) { char *tempurl; char *fragment = NULL; char *netloc; char *startp, *p; int haveportspec = 0; char *canonurl; int canonurllen; memset(url, 0, sizeof(urlelem_t)); url->scheme = url->host = url->relurl = ""; /* Get a temp. buffer we can molest */ tempurl = strdup(inputurl); /* First cut off any fragment specifier */ fragment = strchr(tempurl, '#'); if (fragment) *fragment = '\0'; /* Get the scheme (protocol) */ startp = tempurl; p = strchr(startp, ':'); if (p) { *p = '\0'; if (strncasecmp(startp, "https", 5) == 0) { url->scheme = "https"; url->port = 443; if (strlen(startp) > 5) url->schemeopts = strdup(startp+5); } else if (strncasecmp(startp, "http", 4) == 0) { url->scheme = "http"; url->port = 80; if (strlen(startp) > 4) url->schemeopts = strdup(startp+4); } else if (strncasecmp(startp, "ftps", 4) == 0) { url->scheme = "ftps"; url->port = 990; } else if (strncasecmp(startp, "ftp", 3) == 0) { url->scheme = "ftp"; url->port = 21; } else if (strncasecmp(startp, "ldaps", 5) == 0) { url->scheme = "ldaps"; url->port = 389; /* ldaps:// URL's are non-standard, and must use port 389+STARTTLS */ } else if (strncasecmp(startp, "ldap", 4) == 0) { url->scheme = "ldap"; url->port = 389; } else { /* Unknown scheme! */ errprintf("Unknown URL scheme '%s' in URL '%s'\n", startp, inputurl); url->scheme = strdup(startp); url->port = 0; } startp = (p+1); } else { errprintf("Malformed URL - no 'scheme:' in '%s'\n", inputurl); url->parseerror = 1; xfree(tempurl); return; } if (strncmp(startp, "//", 2) == 0) { startp += 2; netloc = startp; p = strchr(startp, '/'); if (p) { *p = '\0'; startp = (p+1); } else startp += strlen(startp); } else { errprintf("Malformed URL missing '//' in '%s'\n", inputurl); url->parseerror = 2; xfree(tempurl); return; } /* netloc is [username:password@]hostname[:port][=forcedIP] */ p = strchr(netloc, '@'); if (p) { *p = '\0'; url->auth = strdup(urlunescape(netloc)); netloc = (p+1); } p = strchr(netloc, '='); if (p) { url->ip = strdup(p+1); *p = '\0'; } p = strchr(netloc, ':'); if (p) { haveportspec = 1; *p = '\0'; url->port = atoi(p+1); } url->host = strdup(netloc); if (url->port == 0) { struct servent *svc = getservbyname(url->scheme, NULL); if (svc) url->port = ntohs(svc->s_port); else { errprintf("Unknown scheme (no port) '%s'\n", url->scheme); url->parseerror = 3; xfree(tempurl); return; } } if (fragment) *fragment = '#'; url->relurl = malloc(strlen(startp) + 2); sprintf(url->relurl, "/%s", startp); if (url->auth == NULL) { /* See if we have it in the .netrc list */ loginlist_t *walk; load_netrc(); for (walk = loginhead; (walk && (strcmp(walk->host, url->host) != 0)); walk = walk->next) ; if (walk) url->auth = strdup(walk->auth); } /* Build the canonical form of this URL, free from all config artefacts */ canonurllen = 1; canonurllen += strlen(url->scheme)+3; /* Add room for the "://" */ canonurllen += strlen(url->host); canonurllen += 6; /* Max. length of a port spec. */ canonurllen += strlen(url->relurl); p = canonurl = (char *)malloc(canonurllen); p += sprintf(p, "%s://", url->scheme); /* * Don't include authentication here, since it * may show up in clear text on the info page. * And it is not used in URLs to access the site. * if (url->auth) p += sprintf(p, "%s@", url->auth); */ p += sprintf(p, "%s", url->host); if (haveportspec) p += sprintf(p, ":%d", url->port); p += sprintf(p, "%s", url->relurl); url->origform = canonurl; xfree(tempurl); return; } /* * If a column name is column=NAME, pick out NAME. */ static char *gethttpcolumn(char *inp, char **name) { char *nstart, *nend; nstart = inp; nend = strchr(nstart, ';'); if (nend == NULL) { *name = NULL; return inp; } *nend = '\0'; *name = strdup(nstart); *nend = ';'; return nend+1; } /* * Split a test-specification with a URL and optional * post-data/expect-data/expect-type data into the URL itself * and the other elements. * Un-escape data in the post- and expect-data. * Parse the URL. */ char *decode_url(char *testspec, weburl_t *weburl) { static weburl_t weburlbuf; static urlelem_t desturlbuf, proxyurlbuf; char *inp, *p; char *urlstart, *poststart, *postcontenttype, *expstart, *proxystart, *okstart, *notokstart; urlstart = poststart = postcontenttype = expstart = proxystart = okstart = notokstart = NULL; /* If called with no buffer, use our own static one */ if (weburl == NULL) { memset(&weburlbuf, 0, sizeof(weburl_t)); memset(&desturlbuf, 0, sizeof(urlelem_t)); memset(&proxyurlbuf, 0, sizeof(urlelem_t)); weburl = &weburlbuf; weburl->desturl = &desturlbuf; weburl->proxyurl = NULL; } else { memset(weburl, 0, sizeof(weburl_t)); weburl->desturl = (urlelem_t*) calloc(1, sizeof(urlelem_t)); weburl->proxyurl = NULL; } inp = strdup(testspec); if (strncmp(inp, "content=", 8) == 0) { weburl->testtype = WEBTEST_CONTENT; urlstart = inp+8; } else if (strncmp(inp, "cont;", 5) == 0) { weburl->testtype = WEBTEST_CONT; urlstart = inp+5; } else if (strncmp(inp, "cont=", 5) == 0) { weburl->testtype = WEBTEST_CONT; urlstart = gethttpcolumn(inp+5, &weburl->columnname); } else if (strncmp(inp, "nocont;", 7) == 0) { weburl->testtype = WEBTEST_NOCONT; urlstart = inp+7; } else if (strncmp(inp, "nocont=", 7) == 0) { weburl->testtype = WEBTEST_NOCONT; urlstart = gethttpcolumn(inp+7, &weburl->columnname); } else if (strncmp(inp, "post;", 5) == 0) { weburl->testtype = WEBTEST_POST; urlstart = inp+5; } else if (strncmp(inp, "post=", 5) == 0) { weburl->testtype = WEBTEST_POST; urlstart = gethttpcolumn(inp+5, &weburl->columnname); } else if (strncmp(inp, "nopost;", 7) == 0) { weburl->testtype = WEBTEST_NOPOST; urlstart = inp+7; } else if (strncmp(inp, "nopost=", 7) == 0) { weburl->testtype = WEBTEST_NOPOST; urlstart = gethttpcolumn(inp+7, &weburl->columnname); } else if (strncmp(inp, "soap;", 5) == 0) { weburl->testtype = WEBTEST_SOAP; urlstart = inp+5; } else if (strncmp(inp, "soap=", 5) == 0) { weburl->testtype = WEBTEST_SOAP; urlstart = gethttpcolumn(inp+5, &weburl->columnname); } else if (strncmp(inp, "nosoap;", 7) == 0) { weburl->testtype = WEBTEST_NOSOAP; urlstart = inp+7; } else if (strncmp(inp, "nosoap=", 7) == 0) { weburl->testtype = WEBTEST_NOSOAP; urlstart = gethttpcolumn(inp+7, &weburl->columnname); } else if (strncmp(inp, "type;", 5) == 0) { weburl->testtype = WEBTEST_TYPE; urlstart = inp+5; } else if (strncmp(inp, "type=", 5) == 0) { weburl->testtype = WEBTEST_TYPE; urlstart = gethttpcolumn(inp+5, &weburl->columnname); } else if (strncmp(inp, "httpstatus;", 11) == 0) { weburl->testtype = WEBTEST_STATUS; urlstart = strchr(inp, ';') + 1; } else if (strncmp(inp, "httpstatus=", 11) == 0) { weburl->testtype = WEBTEST_STATUS; urlstart = gethttpcolumn(inp+11, &weburl->columnname); } else if (strncmp(inp, "httphead;", 9) == 0) { weburl->testtype = WEBTEST_HEAD; urlstart = strchr(inp, ';') + 1; } else if (strncmp(inp, "httphead=", 9) == 0) { weburl->testtype = WEBTEST_HEAD; urlstart = gethttpcolumn(inp+9, &weburl->columnname); } else if (strncmp(inp, "http=", 5) == 0) { /* Plain URL test, but in separate column */ weburl->testtype = WEBTEST_PLAIN; urlstart = gethttpcolumn(inp+5, &weburl->columnname); } else { /* Plain URL test */ weburl->testtype = WEBTEST_PLAIN; urlstart = inp; } switch (weburl->testtype) { case WEBTEST_PLAIN: case WEBTEST_HEAD: break; case WEBTEST_CONT: case WEBTEST_NOCONT: case WEBTEST_TYPE: expstart = strchr(urlstart, ';'); if (expstart) { *expstart = '\0'; expstart++; } else { errprintf("content-check, but no content-data in '%s'\n", testspec); weburl->testtype = WEBTEST_PLAIN; } break; case WEBTEST_POST: case WEBTEST_NOPOST: case WEBTEST_SOAP: poststart = strchr(urlstart, ';'); if (poststart) { *poststart = '\0'; poststart++; /* See if "poststart" points to a content-type */ if (strncasecmp(poststart, "(content-type=", 14) == 0) { postcontenttype = poststart+14; poststart = strchr(postcontenttype, ')'); if (poststart) { *poststart = '\0'; poststart++; } } if (poststart) { expstart = strchr(poststart, ';'); if (expstart) { *expstart = '\0'; expstart++; } } if ((weburl->testtype == WEBTEST_NOPOST) && (!expstart)) { errprintf("content-check, but no content-data in '%s'\n", testspec); weburl->testtype = WEBTEST_PLAIN; } } else { errprintf("post-check, but no post-data in '%s'\n", testspec); weburl->testtype = WEBTEST_PLAIN; } break; case WEBTEST_STATUS: okstart = strchr(urlstart, ';'); if (okstart) { *okstart = '\0'; okstart++; notokstart = strchr(okstart, ';'); if (notokstart) { *notokstart = '\0'; notokstart++; } } if (okstart && (strlen(okstart) == 0)) okstart = NULL; if (notokstart && (strlen(notokstart) == 0)) notokstart = NULL; if (!okstart && !notokstart) { errprintf("HTTP status check, but no OK/not-OK status codes in '%s'\n", testspec); weburl->testtype = WEBTEST_PLAIN; } if (okstart) weburl->okcodes = strdup(okstart); if (notokstart) weburl->badcodes = strdup(notokstart); } if (poststart) getescapestring(poststart, &weburl->postdata, NULL); if (postcontenttype) getescapestring(postcontenttype, &weburl->postcontenttype, NULL); if (expstart) getescapestring(expstart, &weburl->expdata, NULL); if (obeybbproxysyntax) { /* * Ye olde Big Brother syntax for using a proxy on per-URL basis. */ p = strstr(urlstart, "/http://"); if (!p) p = strstr(urlstart, "/https://"); if (p) { proxystart = urlstart; urlstart = (p+1); *p = '\0'; } } parse_url(urlstart, weburl->desturl); if (proxystart) { if (weburl == &weburlbuf) { /* We use our own static buffers */ weburl->proxyurl = &proxyurlbuf; } else { /* User allocated buffers */ weburl->proxyurl = (urlelem_t *)malloc(sizeof(urlelem_t)); } parse_url(proxystart, weburl->proxyurl); } xfree(inp); return weburl->desturl->origform; } xymon-4.3.28/lib/acklog.c0000664000076400007640000001624012603243142015364 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This file contains code to build the acknowledgement log shown on the */ /* "all non-green" page. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: acklog.c 7678 2015-10-01 14:42:42Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" int havedoneacklog = 0; void do_acklog(FILE *output, int maxcount, int maxminutes) { FILE *acklog; char acklogfilename[PATH_MAX]; time_t cutoff; struct stat st; char l[MAX_LINE_LEN]; char title[200]; ack_t *acks; int num, ackintime_count; havedoneacklog = 1; cutoff = ( (maxminutes) ? (getcurrenttime(NULL) - maxminutes*60) : 0); if ((!maxcount) || (maxcount > 100)) maxcount = 100; sprintf(acklogfilename, "%s/acknowledge.log", xgetenv("XYMONSERVERLOGS")); acklog = fopen(acklogfilename, "r"); if (!acklog) { /* BB compatible naming */ sprintf(acklogfilename, "%s/acklog", xgetenv("XYMONACKDIR")); acklog = fopen(acklogfilename, "r"); } if (!acklog) { /* If no acklog, that is OK - some people don't use acks */ dbgprintf("Cannot open acklog\n"); return; } /* HACK ALERT! */ if (stat(acklogfilename, &st) == 0) { if (st.st_size != 0) { /* Assume a log entry is max 150 bytes */ if (150*maxcount < st.st_size) { fseeko(acklog, -150*maxcount, SEEK_END); if ((fgets(l, sizeof(l), acklog) == NULL) || (strchr(l, '\n') == NULL)) { errprintf("Oops - couldnt find a newline in acklog\n"); } } } } acks = (ack_t *) calloc(maxcount, sizeof(ack_t)); ackintime_count = num = 0; while (fgets(l, sizeof(l), acklog)) { char ackedby[MAX_LINE_LEN], hosttest[MAX_LINE_LEN], color[10], ackmsg[MAX_LINE_LEN]; char ackfn[PATH_MAX]; char *testname; void *hinfo; int ok; if (atol(l) >= cutoff) { int c_used; char *p, *p1, *xymondacker = NULL; unsigned int atim; sscanf(l, "%u\t%d\t%d\t%d\t%s\t%s\t%s\t%n", &atim, &acks[num].acknum, &acks[num].duration, &acks[num].acknum2, ackedby, hosttest, color, &c_used); acks[num].acktime = atim; p1 = ackmsg; for (p=l+c_used, p1=ackmsg; (*p); ) { /* * Need to de-code the ackmsg - it may have been entered * via a web page that did "%asciival" encoding. */ if ((*p == '%') && (strlen(p) >= 3) && isxdigit((int)*(p+1)) && isxdigit((int)*(p+2))) { char hexnum[3]; hexnum[0] = *(p+1); hexnum[1] = *(p+2); hexnum[2] = '\0'; *p1 = (char) strtol(hexnum, NULL, 16); p1++; p += 3; } else { *p1 = *p; p1++; p++; } } *p1 = '\0'; /* Xymon uses \n in the ack message, for the "acked by" data. Cut it off. */ nldecode(ackmsg); p = strchr(ackmsg, '\n'); if (p) { if (strncmp(p, "\nAcked by:", 10) == 0) xymondacker = p+10; *p = '\0'; } /* Show only the first 30 characters in message */ if (strlen(ackmsg) > 30) ackmsg[30] = '\0'; sprintf(ackfn, "%s/ack.%s", xgetenv("XYMONACKDIR"), hosttest); testname = strrchr(hosttest, '.'); if (testname) { *testname = '\0'; testname++; } else testname = "unknown"; ok = 1; /* Ack occurred within wanted timerange ? */ if (ok && (acks[num].acktime < cutoff)) ok = 0; /* Unknown host ? */ hinfo = hostinfo(hosttest); if (!hinfo) ok = 0; if (hinfo && xmh_item(hinfo, XMH_FLAG_NONONGREEN)) ok = 0; if (ok) { char *ackerp; /* If ack has expired or tag file is gone, the ack is no longer valid */ acks[num].ackvalid = 1; if ((acks[num].acktime + 60*acks[num].duration) < getcurrenttime(NULL)) acks[num].ackvalid = 0; if (acks[num].ackvalid && (stat(ackfn, &st) != 0)) acks[num].ackvalid = 0; if (strcmp(ackedby, "np_filename_not_used") != 0) { ackerp = ackedby; if (strncmp(ackerp, "np_", 3) == 0) ackerp += 3; p = strrchr(ackerp, '_'); if (p > ackerp) *p = '\0'; acks[num].ackedby = strdup(ackerp); } else if (xymondacker) { acks[num].ackedby = strdup(xymondacker); } else { acks[num].ackedby = ""; } acks[num].hostname = strdup(hosttest); acks[num].testname = strdup(testname); strcat(color, " "); acks[num].color = parse_color(color); acks[num].ackmsg = strdup(ackmsg); ackintime_count++; num = (num + 1) % maxcount; } } } if (ackintime_count > 0) { int firstack, lastack; int period = maxminutes; if (ackintime_count <= maxcount) { firstack = 0; lastack = ackintime_count-1; period = maxminutes; } else { firstack = num; lastack = ( (num == 0) ? maxcount : (num-1)); ackintime_count = maxcount; period = ((getcurrenttime(NULL)-acks[firstack].acktime) / 60); } sprintf(title, "%d events acknowledged in the past %u minutes", ackintime_count, period); fprintf(output, "

\n"); fprintf(output, "\n", title); fprintf(output, "\n"); fprintf(output, "\n", title); for (num = lastack; (ackintime_count); ackintime_count--, num = ((num == 0) ? (maxcount-1) : (num - 1)) ) { fprintf(output, "\n"); fprintf(output, "\n", ctime(&acks[num].acktime)); fprintf(output, "\n", colorname(acks[num].color), acks[num].hostname); fprintf(output, "\n", acks[num].testname); if (acks[num].color != -1) { fprintf(output, "\n", xgetenv("XYMONSKIN"), dotgiffilename(acks[num].color, acks[num].ackvalid, 1)); } else fprintf(output, "\n"); fprintf(output, "\n", acks[num].ackedby); fprintf(output, "\n", acks[num].ackmsg); } } else { sprintf(title, "No events acknowledged in the last %u minutes", maxminutes); fprintf(output, "

\n"); fprintf(output, "
%s
%s%s%s %s%s
\n", title); fprintf(output, "\n"); fprintf(output, "\n", title); } fprintf(output, "
%s
\n"); fclose(acklog); } xymon-4.3.28/lib/files.h0000664000076400007640000000150411615341300015225 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __FILES_H__ #define __FILES_H__ extern void dropdirectory(char *dirfn, int background); #endif xymon-4.3.28/lib/msort.c0000664000076400007640000001370312000304667015272 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains a "mergesort" implementation for sorting linked lists. */ /* */ /* Based on http://en.wikipedia.org/wiki/Merge_sort pseudo code, adapted for */ /* use in a generic library routine. */ /* */ /* Copyright (C) 2009-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: msort.c 7058 2012-07-14 15:01:11Z storner $"; #include #include #include #include #include #include "libxymon.h" #if 0 static void *merge(void *left, void *right, msortcompare_fn_t comparefn, msortgetnext_fn_t getnext, msortsetnext_fn_t setnext) { void *head, *tail; head = tail = NULL; while (left && right) { if (comparefn(left, right) < 0) { /* Add the left item to the resultlist */ if (tail) { setnext(tail, left); } else { head = left; } tail = left; left = getnext(left); } else { /* Add the right item to the resultlist */ if (tail) { setnext(tail, right); } else { head = right; } tail = right; right = getnext(right); } } /* One or both lists have ended. Add whatever elements may remain */ if (left) { if (tail) setnext(tail, left); else head = tail = left; } if (right) { if (tail) setnext(tail, right); else head = tail = right; } return head; } void *msort(void *head, msortcompare_fn_t comparefn, msortgetnext_fn_t getnext, msortsetnext_fn_t setnext) { void *left, *right, *middle, *walk, *walknext; /* First check if list is empty or has only one element */ if ((head == NULL) || (getnext(head) == NULL)) return head; /* * Find the middle element of the list. * We do this by walking the list until we reach the end. * "middle" takes one step at a time, whereas "walk" takes two. */ middle = head; walk = getnext(middle); /* "walk" must be ahead of "middle" */ while (walk && (walknext = getnext(walk))) { middle = getnext(middle); walk = getnext(walknext); } /* Split the list in two halves, and sort each of them. */ left = head; right = getnext(middle); setnext(middle, NULL); left = msort(left, comparefn, getnext, setnext); right = msort(right, comparefn, getnext, setnext); /* We have sorted the two halves, now we must merge them together */ return merge(left, right, comparefn, getnext, setnext); } #endif void *msort(void *head, msortcompare_fn_t comparefn, msortgetnext_fn_t getnext, msortsetnext_fn_t setnext) { void *walk; int len, i; void **plist; for (walk = head, len=0; (walk); walk = getnext(walk)) len++; plist = malloc((len+1) * sizeof(void *)); for (walk = head, i=0; (walk); walk = getnext(walk)) plist[i++] = walk; plist[len] = NULL; /* This bizarre cast is to quelch compiler warnings */ qsort(plist, len, sizeof(plist[0]), (int(*)(const void *, const void *))comparefn); for (i=0, head = plist[0]; (i < len); i++) setnext(plist[i], plist[i+1]); xfree(plist); return head; } #ifdef STANDALONE typedef struct rec_t { struct rec_t *next; char *key; char *val; } rec_t; void dumplist(rec_t *head) { rec_t *walk; walk = head; while (walk) { printf("%p : %-15s:%3s\n", walk, walk->key, walk->val); walk = walk->next; } printf("\n"); printf("\n"); } int record_compare(void **a, void **b) { rec_t **reca = (rec_t **)a; rec_t **recb = (rec_t **)b; return strcasecmp((*reca)->key, (*recb)->key); } void * record_getnext(void *a) { return ((rec_t *)a)->next; } void record_setnext(void *a, void *newval) { ((rec_t *)a)->next = (rec_t *)newval; } /* 50 most popular US babynames in 2006: http://www.ssa.gov/OACT/babynames/ */ char *tdata[] = { "Jacob", "Emily", "Michael", "Emma", "Joshua", "Madison", "Ethan", "Isabella", "Matthew", "Ava", "Daniel", "Abigail", "Christopher", "Olivia", "Andrew", "Hannah", "Anthony", "Sophia", "William", "Samantha", "Joseph", "Elizabeth", "Alexander", "Ashley", "David", "Mia", "Ryan", "Alexis", "Noah", "Sarah", "James", "Natalie", "Nicholas", "Grace", "Tyler", "Chloe", "Logan", "Alyssa", "John", "Brianna", "Christian", "Ella", "Jonathan", "Taylor", "Nathan", "Anna", "Benjamin", "Lauren", "Samuel", "Hailey", "Dylan", "Kayla", "Brandon", "Addison", "Gabriel", "Victoria", "Elijah", "Jasmine", "Aiden", "Savannah", "Angel", "Julia", "Jose", "Jessica", "Zachary", "Lily", "Caleb", "Sydney", "Jack", "Morgan", "Jackson", "Katherine", "Kevin", "Destiny", "Gavin", "Lillian", "Mason", "Alexa", "Isaiah", "Alexandra", "Austin", "Kaitlyn", "Evan", "Kaylee", "Luke", "Nevaeh", "Aidan", "Brooke", "Justin", "Makayla", "Jordan", "Allison", "Robert", "Maria", "Isaac", "Angelina", "Landon", "Rachel", "Jayden", "Gabriella", NULL }; int main(int argc, char *argv[]) { int i; rec_t *head, *newrec, *tail; head = tail = NULL; for (i=0; (tdata[i]); i++) { char numstr[10]; newrec = (rec_t *)calloc(1, sizeof(rec_t)); newrec->key = strdup(tdata[i]); sprintf(numstr, "%d", i+1); newrec->val = strdup(numstr); if (tail) { tail->next = newrec; tail = newrec; } else { head = tail = newrec; } } dumplist(head); head = msort(head, record_compare, record_getnext, record_setnext); dumplist(head); return 0; } #endif xymon-4.3.28/lib/reportlog.h0000664000076400007640000000231611615341300016142 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __REPORTLOG_H__ #define __REPORTLOG_H__ #include #include "availability.h" #define STYLE_CRIT 0 #define STYLE_NONGR 1 #define STYLE_OTHER 2 extern char *stylenames[]; extern void generate_replog(FILE *htmlrep, FILE *textrep, char *textrepurl, char *hostname, char *service, int color, int style, char *ip, char *displayname, time_t st, time_t end, double reportwarnlevel, double reportgreenlevel, int reportwarnstops, reportinfo_t *repinfo); #endif xymon-4.3.28/lib/cgiurls.h0000664000076400007640000000242511615341300015576 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __CGIURLS_H__ #define __CGIURLS_H__ #include #include "availability.h" extern char *hostsvcurl(char *hostname, char *service, int htmlformat); extern char *hostsvcclienturl(char *hostname, char *section); extern char *histcgiurl(char *hostname, char *service); extern char *histlogurl(char *hostname, char *service, time_t histtime, char *histtime_txt); extern char *replogurl(char *hostname, char *service, int color, char *style, int recentgifs, reportinfo_t *repinfo, char *reportstart, time_t reportend, float reportwarnlevel); #endif xymon-4.3.28/lib/reportlog.c0000664000076400007640000003434011615341300016137 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This tool generates the report status log for a single status, with the */ /* availability percentages etc needed for a report-mode view. */ /* */ /* Copyright (C) 2003-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: reportlog.c 6712 2011-07-31 21:01:52Z storner $"; #include #include #include #include #include #include "libxymon.h" char *stylenames[3] = { "crit", "nongr", "all" }; void generate_replog(FILE *htmlrep, FILE *textrep, char *textrepurl, char *hostname, char *service, int color, int style, char *ip, char *displayname, time_t st, time_t end, double reportwarnlevel, double reportgreenlevel, int reportwarnstops, reportinfo_t *repinfo) { replog_t *walk; char *bgcols[2] = { "\"#000000\"", "\"#000033\"" }; int curbg = 0; if (!displayname) displayname = hostname; sethostenv(displayname, ip, service, colorname(color), hostname); sethostenv_report(st, end, reportwarnlevel, reportgreenlevel); headfoot(htmlrep, "replog", "", "header", color); fprintf(htmlrep, "\n"); fprintf(htmlrep, "
\n"); fprintf(htmlrep, "
", xgetenv("XYMONPAGEROWFONT")); fprintf(htmlrep, "%s - ", htmlquoted(displayname)); fprintf(htmlrep, "%s\n", htmlquoted(service)); fprintf(htmlrep, "\n"); fprintf(htmlrep, "\n"); if (repinfo->withreport) { fprintf(htmlrep, "\n", repinfo->fullavailability); fprintf(htmlrep, "\n"); fprintf(htmlrep, "\n", repinfo->reportavailability); } else { fprintf(htmlrep, "\n", repinfo->fullavailability); } fprintf(htmlrep, "\n"); fprintf(htmlrep, "\n"); fprintf(htmlrep, "\n"); fprintf(htmlrep, "\n", xgetenv("XYMONSKIN"), dotgiffilename(COL_GREEN, 0, 1), colorname(COL_GREEN), colorname(COL_GREEN), xgetenv("DOTHEIGHT"), xgetenv("DOTWIDTH")); fprintf(htmlrep, "\n", xgetenv("XYMONSKIN"), dotgiffilename(COL_YELLOW, 0, 1), colorname(COL_YELLOW), colorname(COL_YELLOW), xgetenv("DOTHEIGHT"), xgetenv("DOTWIDTH")); fprintf(htmlrep, "\n", xgetenv("XYMONSKIN"), dotgiffilename(COL_RED, 0, 1), colorname(COL_RED), colorname(COL_RED), xgetenv("DOTHEIGHT"), xgetenv("DOTWIDTH")); fprintf(htmlrep, "\n", xgetenv("XYMONSKIN"), dotgiffilename(COL_PURPLE, 0, 1), colorname(COL_PURPLE), colorname(COL_PURPLE), xgetenv("DOTHEIGHT"), xgetenv("DOTWIDTH")); fprintf(htmlrep, "\n", xgetenv("XYMONSKIN"), dotgiffilename(COL_CLEAR, 0, 1), colorname(COL_CLEAR), colorname(COL_CLEAR), xgetenv("DOTHEIGHT"), xgetenv("DOTWIDTH")); fprintf(htmlrep, "\n", xgetenv("XYMONSKIN"), dotgiffilename(COL_BLUE, 0, 1), colorname(COL_BLUE), colorname(COL_BLUE), xgetenv("DOTHEIGHT"), xgetenv("DOTWIDTH")); fprintf(htmlrep, "\n"); fprintf(htmlrep, "\n"); fprintf(htmlrep, "\n"); fprintf(htmlrep, "\n", repinfo->fullpct[COL_GREEN]); fprintf(htmlrep, "\n", repinfo->fullpct[COL_YELLOW]); fprintf(htmlrep, "\n", repinfo->fullpct[COL_RED]); fprintf(htmlrep, "\n", repinfo->fullpct[COL_PURPLE]); fprintf(htmlrep, "\n", repinfo->fullpct[COL_CLEAR]); fprintf(htmlrep, "\n", repinfo->fullpct[COL_BLUE]); fprintf(htmlrep, "\n"); if (repinfo->withreport) { fprintf(htmlrep, "\n"); fprintf(htmlrep, "\n", reportwarnlevel); fprintf(htmlrep, "\n", repinfo->reportpct[COL_GREEN]); fprintf(htmlrep, "\n", repinfo->reportpct[COL_YELLOW]); fprintf(htmlrep, "\n", repinfo->reportpct[COL_RED]); fprintf(htmlrep, "\n"); fprintf(htmlrep, "\n", repinfo->reportpct[COL_CLEAR]); fprintf(htmlrep, "\n"); fprintf(htmlrep, "\n"); } fprintf(htmlrep, "\n"); fprintf(htmlrep, "\n"); fprintf(htmlrep, "\n", repinfo->count[COL_YELLOW]); fprintf(htmlrep, "\n", repinfo->count[COL_RED]); fprintf(htmlrep, "\n", repinfo->count[COL_PURPLE]); fprintf(htmlrep, "\n", repinfo->count[COL_CLEAR]); fprintf(htmlrep, "\n", repinfo->count[COL_BLUE]); fprintf(htmlrep, "\n"); fprintf(htmlrep, "\n"); fprintf(htmlrep, "\n", xgetenv("XYMONPAGECOLFONT")); if (strcmp(repinfo->fstate, "NOTOK") == 0) { fprintf(htmlrep, "\n"); fprintf(htmlrep, "\n", xgetenv("XYMONPAGECOLFONT")); } fprintf(htmlrep, "

Availability (24x7): %.2f%%
 
Availability (SLA): %.2f%%

Availability: %.2f%%
 \"%s\"\"%s\"\"%s\"\"%s\"\"%s\"\"%s\"
24x7%.2f%%%.2f%%%.2f%%%.2f%%%.2f%%%.2f%%
SLA (%.2f)%.2f%%%.2f%%%.2f%%-%.2f%%-
Event count%d%d%d%d%d
\n"); fprintf(htmlrep, "[Total may not equal 100%%]
\n"); fprintf(htmlrep, "[History file contains invalid entries]
\n"); fprintf(htmlrep, "
\n"); /* Text-based report start */ if (textrep) { char text_starttime[20], text_endtime[20]; fprintf(textrep, "Availability Report\n"); strftime(text_starttime, sizeof(text_starttime), "%b %d %Y", localtime(&st)); strftime(text_endtime, sizeof(text_endtime), "%b %d %Y", localtime(&end)); if (strcmp(text_starttime, text_endtime) == 0) fprintf(textrep, "%s\n", text_starttime); else fprintf(textrep, "%s - %s\n", text_starttime, text_endtime); fprintf(textrep, "\n"); fprintf(textrep, "\n"); fprintf(textrep, " %s - %s\n", displayname, service); fprintf(textrep, "\n"); if (repinfo->withreport) { fprintf(textrep, " Availability (24x7) : %.2f%%\n", repinfo->fullavailability); fprintf(textrep, " Availability (SLA) : %.2f%%\n", repinfo->reportavailability); } else { fprintf(textrep, " Availability: %.2f%%\n", repinfo->fullavailability); } fprintf(textrep, " Green Yellow Red Purple Clear Blue\n"); fprintf(textrep, " 24x7 %.2f%% %.2f%% %.2f%% %.2f%% %.2f%% %.2f%%\n", repinfo->fullpct[COL_GREEN], repinfo->fullpct[COL_YELLOW], repinfo->fullpct[COL_RED], repinfo->fullpct[COL_PURPLE], repinfo->fullpct[COL_CLEAR], repinfo->fullpct[COL_BLUE]); if (repinfo->withreport) { fprintf(textrep, " SLA %.2f%% %.2f%% %.2f%% - %.2f%% - \n", repinfo->reportpct[COL_GREEN], repinfo->reportpct[COL_YELLOW], repinfo->reportpct[COL_RED], repinfo->reportpct[COL_CLEAR]); } fprintf(textrep, " Events %d %d %d %d %d %d\n", repinfo->count[COL_GREEN], repinfo->count[COL_YELLOW], repinfo->count[COL_RED], repinfo->count[COL_PURPLE], repinfo->count[COL_CLEAR], repinfo->count[COL_BLUE]); fprintf(textrep, "\n"); fprintf(textrep, "\n"); fprintf(textrep, " Event logs for the given period\n"); fprintf(textrep, "\n"); fprintf(textrep, "Event Start Event End Status Duration (Seconds) Cause\n"); fprintf(textrep, "\n"); fprintf(textrep, "\n"); } fprintf(htmlrep, "

\n"); fprintf(htmlrep, "
\n"); fprintf(htmlrep, "\n"); fprintf(htmlrep, "\n"); fprintf(htmlrep, "\n"); fprintf(htmlrep, "\n"); fprintf(htmlrep, "\n"); fprintf(htmlrep, "\n", xgetenv("XYMONPAGECOLFONT")); fprintf(htmlrep, "\n", xgetenv("XYMONPAGECOLFONT")); fprintf(htmlrep, "\n", xgetenv("XYMONPAGECOLFONT")); fprintf(htmlrep, "\n", xgetenv("XYMONPAGECOLFONT")); fprintf(htmlrep, "\n", xgetenv("XYMONPAGECOLFONT")); fprintf(htmlrep, "\n"); for (walk = reploghead; (walk); walk = walk->next) { int wanted = 0; switch (style) { case STYLE_CRIT: wanted = (walk->color == COL_RED); break; case STYLE_NONGR: wanted = (walk->color != COL_GREEN); break; case STYLE_OTHER: wanted = 1; } if (wanted) { char start[30]; char end[30]; time_t endtime; int angrygif = (repinfo->withreport && walk->affectssla); strftime(start, sizeof(start), "%a %b %d %H:%M:%S %Y", localtime(&walk->starttime)); endtime = walk->starttime + walk->duration; strftime(end, sizeof(end), "%a %b %d %H:%M:%S %Y", localtime(&endtime)); fprintf(htmlrep, "\n", bgcols[curbg]); curbg = (1-curbg); fprintf(htmlrep, "\n", start); fprintf(htmlrep, "\n", end); fprintf(htmlrep, "\n"); fprintf(htmlrep, "\n", durationstr(walk->duration)); fprintf(htmlrep, "\n", walk->cause); fprintf(htmlrep, "\n\n"); /* And the text-report */ if (textrep) { fprintf(textrep, "%s %s %s %s %u ", start, end, colorname(walk->color), durationstr(walk->duration), (unsigned int)walk->duration); if (walk->cause) { char *p; for (p=walk->cause; (p && *p); ) { if (*p == '<') { p = strchr(p, '>'); if (p) p++; } else if (*p != '\n') { fprintf(textrep, "%c", *p); p++; } else p++; } fprintf(textrep, "\n"); } } } } fprintf(htmlrep, "\n"); fprintf(htmlrep, "\n", durationstr(repinfo->fullduration[COL_RED])); if (style != STYLE_CRIT) { fprintf(htmlrep, "\n"); fprintf(htmlrep, "\n", durationstr(repinfo->fullduration[COL_YELLOW] + repinfo->fullduration[COL_PURPLE] + repinfo->fullduration[COL_CLEAR] + repinfo->fullduration[COL_BLUE])); } if (repinfo->withreport) { fprintf(htmlrep, "\n"); fprintf(htmlrep, "\n", durationstr(repinfo->reportduration[COL_RED])); if (style != STYLE_CRIT) { fprintf(htmlrep, "\n"); fprintf(htmlrep, "\n", durationstr(repinfo->reportduration[COL_YELLOW])); } } /* And the text report ... */ if (textrep) { fprintf(textrep, "\n"); fprintf(textrep, "\n"); fprintf(textrep, " %s %s (%lu secs)\n", "Time Critical/Offline (24x7):", durationstr(repinfo->fullduration[COL_RED]), repinfo->fullduration[COL_RED]); if (style != STYLE_CRIT) { fprintf(textrep, " %s %s (%lu secs)\n", "Time Non-Critical (24x7):", durationstr(repinfo->fullduration[COL_YELLOW] + repinfo->fullduration[COL_PURPLE] + repinfo->fullduration[COL_CLEAR] + repinfo->fullduration[COL_BLUE]), (repinfo->fullduration[COL_YELLOW] + repinfo->fullduration[COL_PURPLE] + repinfo->fullduration[COL_CLEAR] + repinfo->fullduration[COL_BLUE])); } if (repinfo->withreport) { fprintf(textrep, "\n"); fprintf(textrep, "\n"); fprintf(textrep, " %s %s (%lu secs)\n", "Time Critical/Offline (SLA) :", durationstr(repinfo->reportduration[COL_RED]), repinfo->reportduration[COL_RED]); if (style != STYLE_CRIT) { fprintf(textrep, " %s %s (%lu secs)\n", "Time Non-Critical (SLA) :", durationstr(repinfo->reportduration[COL_YELLOW]), repinfo->fullduration[COL_YELLOW]); } } } fprintf(htmlrep, "
Event logs for the given period
Event StartEvent EndStatusDurationCause
%s%s"); fprintf(htmlrep, "", histlogurl(hostname, service, 0, walk->timespec)); fprintf(htmlrep, "\"%s\"", xgetenv("XYMONSKIN"), dotgiffilename(walk->color, 0, !angrygif), colorname(walk->color), colorname(walk->color), xgetenv("DOTHEIGHT"), xgetenv("DOTWIDTH")); fprintf(htmlrep, "%s%s
\n"); fprintf(htmlrep, "Time Critical/Offline (24x7):%s
\n"); fprintf(htmlrep, "Time Non-Critical (24x7):%s
\n"); fprintf(htmlrep, "Time Critical/Offline (SLA):%s
\n"); fprintf(htmlrep, "Time Non-Critical (SLA):%s
\n"); fprintf(htmlrep, "

\n"); fprintf(htmlrep, "

\n"); fprintf(htmlrep, "Click here for text-based availability report\n", textrepurl); fprintf(htmlrep, "


\n"); /* XYMONREPEXT extensions */ do_extensions(htmlrep, "XYMONREPEXT", "rep"); fprintf(htmlrep, "
\n"); headfoot(htmlrep, "replog", "", "footer", color); } xymon-4.3.28/lib/sendmsg.h0000664000076400007640000000442313033575046015602 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __SENDMSG_H_ #define __SENDMSG_H_ #define XYMON_TIMEOUT 15 /* Default timeout for a request going to Xymon server */ #define PAGELEVELSDEFAULT "red purple" typedef enum { XYMONSEND_OK, XYMONSEND_EBADIP, XYMONSEND_EIPUNKNOWN, XYMONSEND_ENOSOCKET, XYMONSEND_ECANNOTDONONBLOCK, XYMONSEND_ECONNFAILED, XYMONSEND_ESELFAILED, XYMONSEND_ETIMEOUT, XYMONSEND_EWRITEERROR, XYMONSEND_EREADERROR, XYMONSEND_EBADURL } sendresult_t; typedef struct sendreturn_t { FILE *respfd; strbuffer_t *respstr; int fullresponse; int haveseenhttphdrs; } sendreturn_t; extern int xymonmsgcount; extern int xymonstatuscount; extern int xymonnocombocount; extern int dontsendmessages; extern void setproxy(char *proxy); extern sendresult_t sendmessage(char *msg, char *recipient, int timeout, sendreturn_t *response); extern sendreturn_t *newsendreturnbuf(int fullresponse, FILE *respfd); extern void freesendreturnbuf(sendreturn_t *s); extern char *getsendreturnstr(sendreturn_t *s, int takeover); extern void combo_start(void); extern void combo_end(void); extern void combo_add(strbuffer_t *msg); extern void combo_start_local(void); extern int sendmessage_init_local(void); extern void sendmessage_finish_local(void); extern sendresult_t sendmessage_local(char *msg); extern void init_status(int color); extern void addtostatus(char *p); extern void addtostrstatus(strbuffer_t *p); extern void finish_status(void); extern void meta_start(void); extern void meta_end(void); extern void init_meta(char *metaname); extern void addtometa(char *p); extern void finish_meta(void); #endif xymon-4.3.28/lib/run.c0000664000076400007640000001022512173472453014740 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains miscellaneous routines. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: run.c 6893 2012-01-21 12:52:53Z storner $"; #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" int run_command(char *cmd, char *errortext, strbuffer_t *banner, int showcmd, int timeout) { int result; char l[1024]; int pfd[2]; pid_t childpid; MEMDEFINE(l); result = 0; if (banner && showcmd) { sprintf(l, "Command: %s\n\n", cmd); addtobuffer(banner, l); } /* Adapted from Stevens' popen()/pclose() example */ if (pipe(pfd) > 0) { errprintf("Could not create pipe: %s\n", strerror(errno)); MEMUNDEFINE(l); return -1; } if ((childpid = fork()) < 0) { errprintf("Could not fork child process: %s\n", strerror(errno)); MEMUNDEFINE(l); return -1; } if (childpid == 0) { /* The child runs here */ close(pfd[0]); if (pfd[1] != STDOUT_FILENO) { dup2(pfd[1], STDOUT_FILENO); dup2(pfd[1], STDERR_FILENO); close(pfd[1]); } if (strchr(cmd, ' ') == NULL) execlp(cmd, cmd, NULL); else { char *shell = getenv("SHELL"); if (!shell) shell = "/bin/sh"; execl(shell, "sh", "-c", cmd, NULL); } exit(127); } else { /* The parent runs here */ int done = 0, didterm = 0, n; struct timespec tmo, timestamp, cutoff; close(pfd[1]); /* Make our reads non-blocking */ if (fcntl(pfd[0], F_SETFL, O_NONBLOCK) == -1) { /* Failed .. but lets try and run this anyway */ errprintf("Could not set non-blocking reads on pipe: %s\n", strerror(errno)); } getntimer(&cutoff); cutoff.tv_sec += timeout; while (!done) { fd_set readfds; getntimer(×tamp); tvdiff(×tamp, &cutoff, &tmo); if ((tmo.tv_sec < 0) || (tmo.tv_nsec < 0)) { /* Timeout already happened */ n = 0; } else { struct timeval selecttmo; selecttmo.tv_sec = tmo.tv_sec; selecttmo.tv_usec = tmo.tv_nsec / 1000; FD_ZERO(&readfds); FD_SET(pfd[0], &readfds); n = select(pfd[0]+1, &readfds, NULL, NULL, &selecttmo); } if (n == -1) { errprintf("select() error: %s\n", strerror(errno)); result = -1; done = 1; } else if (n == 0) { /* Timeout */ errprintf("Timeout waiting for data from child, killing it\n"); kill(childpid, (didterm ? SIGKILL : SIGTERM)); if (!didterm) didterm = 1; else { done = 1; result = -1; } } else if (FD_ISSET(pfd[0], &readfds)) { n = read(pfd[0], l, sizeof(l)-1); l[n] = '\0'; if (n == 0) { done = 1; } else { if (banner && *l) addtobuffer(banner, l); if (errortext && (strstr(l, errortext) != NULL)) result = 1; } } } close(pfd[0]); result = 0; while ((result == 0) && (waitpid(childpid, &result, 0) < 0)) { if (errno != EINTR) { errprintf("Error picking up child exit status: %s\n", strerror(errno)); result = -1; } } if (WIFEXITED(result)) { result = WEXITSTATUS(result); } else if (WIFSIGNALED(result)) { errprintf("Child process terminated with signal %d\n", WTERMSIG(result)); result = -1; } } MEMUNDEFINE(l); return result; } xymon-4.3.28/lib/rmd_locl.h0000664000076400007640000001705111535462534015740 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This file is part of the Xymon monitor library, but was taken from the */ /* FreeBSD sources. It was originally written by Eric Young, and is NOT */ /* licensed under the GPL. Please adhere the original copyright notice below. */ /*----------------------------------------------------------------------------*/ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ #include "ripemd.h" #undef c2nl #define c2nl(c,l) (l =(((u_int32_t)(*((c)++)))<<24), \ l|=(((u_int32_t)(*((c)++)))<<16), \ l|=(((u_int32_t)(*((c)++)))<< 8), \ l|=(((u_int32_t)(*((c)++))) )) #undef p_c2nl #define p_c2nl(c,l,n) { \ switch (n) { \ case 0: l =((u_int32_t)(*((c)++)))<<24; \ case 1: l|=((u_int32_t)(*((c)++)))<<16; \ case 2: l|=((u_int32_t)(*((c)++)))<< 8; \ case 3: l|=((u_int32_t)(*((c)++))); \ } \ } #undef c2nl_p /* NOTE the pointer is not incremented at the end of this */ #define c2nl_p(c,l,n) { \ l=0; \ (c)+=n; \ switch (n) { \ case 3: l =((u_int32_t)(*(--(c))))<< 8; \ case 2: l|=((u_int32_t)(*(--(c))))<<16; \ case 1: l|=((u_int32_t)(*(--(c))))<<24; \ } \ } #undef p_c2nl_p #define p_c2nl_p(c,l,sc,len) { \ switch (sc) \ { \ case 0: l =((u_int32_t)(*((c)++)))<<24; \ if (--len == 0) break; \ case 1: l|=((u_int32_t)(*((c)++)))<<16; \ if (--len == 0) break; \ case 2: l|=((u_int32_t)(*((c)++)))<< 8; \ } \ } #undef nl2c #define nl2c(l,c) (*((c)++)=(unsigned char)(((l)>>24)&0xff), \ *((c)++)=(unsigned char)(((l)>>16)&0xff), \ *((c)++)=(unsigned char)(((l)>> 8)&0xff), \ *((c)++)=(unsigned char)(((l) )&0xff)) #undef c2l #define c2l(c,l) (l =(((u_int32_t)(*((c)++))) ), \ l|=(((u_int32_t)(*((c)++)))<< 8), \ l|=(((u_int32_t)(*((c)++)))<<16), \ l|=(((u_int32_t)(*((c)++)))<<24)) #undef p_c2l #define p_c2l(c,l,n) { \ switch (n) { \ case 0: l =((u_int32_t)(*((c)++))); \ case 1: l|=((u_int32_t)(*((c)++)))<< 8; \ case 2: l|=((u_int32_t)(*((c)++)))<<16; \ case 3: l|=((u_int32_t)(*((c)++)))<<24; \ } \ } #undef c2l_p /* NOTE the pointer is not incremented at the end of this */ #define c2l_p(c,l,n) { \ l=0; \ (c)+=n; \ switch (n) { \ case 3: l =((u_int32_t)(*(--(c))))<<16; \ case 2: l|=((u_int32_t)(*(--(c))))<< 8; \ case 1: l|=((u_int32_t)(*(--(c)))); \ } \ } #undef p_c2l_p #define p_c2l_p(c,l,sc,len) { \ switch (sc) \ { \ case 0: l =((u_int32_t)(*((c)++))); \ if (--len == 0) break; \ case 1: l|=((u_int32_t)(*((c)++)))<< 8; \ if (--len == 0) break; \ case 2: l|=((u_int32_t)(*((c)++)))<<16; \ } \ } #undef l2c #define l2c(l,c) (*((c)++)=(unsigned char)(((l) )&0xff), \ *((c)++)=(unsigned char)(((l)>> 8)&0xff), \ *((c)++)=(unsigned char)(((l)>>16)&0xff), \ *((c)++)=(unsigned char)(((l)>>24)&0xff)) #undef ROTATE #if defined(WIN32) #define ROTATE(a,n) _lrotl(a,n) #else #define ROTATE(a,n) (((a)<<(n))|(((a)&0xffffffff)>>(32-(n)))) #endif /* A nice byte order reversal from Wei Dai */ #if defined(WIN32) /* 5 instructions with rotate instruction, else 9 */ #define Endian_Reverse32(a) \ { \ u_int32_t l=(a); \ (a)=((ROTATE(l,8)&0x00FF00FF)|(ROTATE(l,24)&0xFF00FF00)); \ } #else /* 6 instructions with rotate instruction, else 8 */ #define Endian_Reverse32(a) \ { \ u_int32_t l=(a); \ l=(((l&0xFF00FF00)>>8L)|((l&0x00FF00FF)<<8L)); \ (a)=ROTATE(l,16L); \ } #endif #define F1(x,y,z) ((x)^(y)^(z)) #define F2(x,y,z) (((x)&(y))|((~x)&z)) #define F3(x,y,z) (((x)|(~y))^(z)) #define F4(x,y,z) (((x)&(z))|((y)&(~(z)))) #define F5(x,y,z) ((x)^((y)|(~(z)))) #define RIPEMD160_A 0x67452301L #define RIPEMD160_B 0xEFCDAB89L #define RIPEMD160_C 0x98BADCFEL #define RIPEMD160_D 0x10325476L #define RIPEMD160_E 0xC3D2E1F0L #include "rmdconst.h" #define RIP1(a,b,c,d,e,w,s) { \ a+=F1(b,c,d)+X[w]; \ a=ROTATE(a,s)+e; \ c=ROTATE(c,10); } #define RIP2(a,b,c,d,e,w,s,K) { \ a+=F2(b,c,d)+X[w]+K; \ a=ROTATE(a,s)+e; \ c=ROTATE(c,10); } #define RIP3(a,b,c,d,e,w,s,K) { \ a+=F3(b,c,d)+X[w]+K; \ a=ROTATE(a,s)+e; \ c=ROTATE(c,10); } #define RIP4(a,b,c,d,e,w,s,K) { \ a+=F4(b,c,d)+X[w]+K; \ a=ROTATE(a,s)+e; \ c=ROTATE(c,10); } #define RIP5(a,b,c,d,e,w,s,K) { \ a+=F5(b,c,d)+X[w]+K; \ a=ROTATE(a,s)+e; \ c=ROTATE(c,10); } xymon-4.3.28/lib/Makefile0000664000076400007640000001067412503132277015432 0ustar rpmbuildrpmbuild# Xymon library Makefile # XYMONLIBOBJS = osdefs.o acklog.o availability.o calc.o cgi.o cgiurls.o clientlocal.o color.o crondate.o digest.o encoding.o environ.o errormsg.o eventlog.o files.o headfoot.o xymonrrd.o holidays.o htmllog.o ipaccess.o loadalerts.o loadcriticalconf.o links.o matching.o md5.o memory.o misc.o msort.o netservices.o notifylog.o acknowledgementslog.o readmib.o reportlog.o rmd160c.o sha1.o sha2.o sig.o stackio.o strfunc.o suid.o timefunc.o tree.o url.o webaccess.o XYMONCOMMLIBOBJS = $(XYMONLIBOBJS) loadhosts.o locator.o sendmsg.o xymond_ipc.o xymond_buffer.o XYMONTIMELIBOBJS = run.o timing.o CLIENTLIBOBJS = osdefs.o cgiurls.o color-client.o crondate.o digest.o encoding.o environ-client.o errormsg.o holidays.o ipaccess.o md5.o memory.o misc.o msort.o rmd160c.o sha1.o sha2.o sig.o stackio.o strfunc.o suid.o timefunc-client.o tree.o ifeq ($(LOCALCLIENT),yes) CLIENTLIBOBJS += matching.o endif XYMONCLIENTCOMMLIBOBJS = locator.o loadhosts.o sendmsg.o xymond_ipc.o xymond_buffer.o XYMONCLIENTLIB = libxymonclient.a XYMONCLIENTLIBS = $(XYMONCLIENTLIB) XYMONCLIENTCOMMLIB = libxymonclientcomm.a XYMONCLIENTCOMMLIBS = $(XYMONCLIENTCOMMLIB) $(ZLIBLIBS) $(XYMONCLIENTLIB) $(SSLLIBS) $(NETLIBS) $(LIBRTDEF) XYMONLIB = libxymon.a XYMONLIBS = $(XYMONLIB) XYMONCOMMLIB = libxymoncomm.a XYMONCOMMLIBS = $(XYMONCOMMLIB) $(ZLIBLIBS) $(SSLLIBS) $(NETLIBS) $(LIBRTDEF) XYMONTIMELIB = libxymontime.a XYMONTIMELIBS = $(XYMONTIMELIB) $(LIBRTDEF) CFLAGS += -I../include all: test-endianness $(XYMONLIB) $(XYMONCOMMLIB) $(XYMONTIMELIB) $(XYMONCLIENTCOMMLIB) $(XYMONCLIENTLIB) loadhosts stackio availability md5 sha1 rmd160 locator tree client: test-endianness $(XYMONCLIENTLIB) $(XYMONCLIENTCOMMLIB) $(XYMONTIMELIB) test-endianness: test-endianness.c $(CC) $(CFLAGS) -o $@ $< $(XYMONLIB): $(XYMONLIBOBJS) ar cr $(XYMONLIB) $(XYMONLIBOBJS) ranlib $(XYMONLIB) || echo "" $(XYMONCOMMLIB): $(XYMONCOMMLIBOBJS) ar cr $(XYMONCOMMLIB) $(XYMONCOMMLIBOBJS) ranlib $(XYMONCOMMLIB) || echo "" $(XYMONTIMELIB): $(XYMONTIMELIBOBJS) ar cr $(XYMONTIMELIB) $(XYMONTIMELIBOBJS) ranlib $(XYMONTIMELIB) || echo "" $(XYMONCLIENTLIB): $(CLIENTLIBOBJS) ar cr $(XYMONCLIENTLIB) $(CLIENTLIBOBJS) ranlib $(XYMONCLIENTLIB) || echo "" $(XYMONCLIENTCOMMLIB): $(XYMONCLIENTCOMMLIBOBJS) ar cr $(XYMONCLIENTCOMMLIB) $(XYMONCLIENTCOMMLIBOBJS) ranlib $(XYMONCLIENTCOMMLIB) || echo "" loadhosts.o: loadhosts.c loadhosts_file.c loadhosts_net.c $(CC) $(CFLAGS) -c -o $@ loadhosts.c eventlog.o: eventlog.c $(CC) $(CFLAGS) $(PCREINCDIR) -c -o $@ $< notifylog.o: notifylog.c $(CC) $(CFLAGS) $(PCREINCDIR) -c -o $@ $< acknowledgementslog.o: acknowledgementslog.c $(CC) $(CFLAGS) $(PCREINCDIR) -c -o $@ $< headfoot.o: headfoot.c $(CC) $(CFLAGS) $(PCREINCDIR) -c -o $@ $< loadalerts.o: loadalerts.c $(CC) $(CFLAGS) $(PCREINCDIR) -c -o $@ $< matching.o: matching.c $(CC) $(CFLAGS) $(PCREINCDIR) -c -o $@ $< sha1.o: sha1.c $(CC) $(CFLAGS) `./test-endianness` -c -o $@ $< rmd160c.o: rmd160c.c $(CC) $(CFLAGS) `./test-endianness` -c -o $@ $< environ.o: environ.c $(CC) $(CFLAGS) -DXYMONTOPDIR=\"$(XYMONTOPDIR)\" -DXYMONLOGDIR=\"$(XYMONLOGDIR)\" -DXYMONHOSTNAME=\"$(XYMONHOSTNAME)\" -DXYMONHOSTIP=\"$(XYMONHOSTIP)\" -DXYMONHOSTOS=\"$(XYMONHOSTOS)\" -DXYMONHOME=\"$(XYMONHOME)\" -c -o $@ environ.c environ-client.o: environ.c $(CC) $(CFLAGS) -DXYMONTOPDIR=\"$(XYMONTOPDIR)\" -DXYMONLOGDIR=\"$(XYMONLOGDIR)\" -DXYMONHOSTNAME=\"$(XYMONHOSTNAME)\" -DXYMONHOSTIP=\"$(XYMONHOSTIP)\" -DXYMONHOSTOS=\"$(XYMONHOSTOS)\" -DXYMONHOME=\"$(XYMONCLIENTHOME)\" -c -o $@ environ.c color-client.o: color.c $(CC) $(CFLAGS) -DCLIENTONLY -c -o $@ $< timefunc-client.o: timefunc.c $(CC) $(CFLAGS) -DCLIENTONLY -c -o $@ $< loadhosts: loadhosts.c loadhosts_file.c loadhosts_net.c $(XYMONCOMMLIB) $(CC) $(CFLAGS) -DSTANDALONE -o $@ loadhosts.c $(XYMONCOMMLIBS) stackio: stackio.c libxymon.a $(CC) $(CFLAGS) -DSTANDALONE -o $@ stackio.c $(XYMONLIBS) availability: availability.c libxymon.a $(CC) $(CFLAGS) -DSTANDALONE -o $@ availability.c $(XYMONLIBS) md5: md5.c $(CC) $(CFLAGS) -DSTANDALONE `./test-endianness` -o $@ md5.c sha1: sha1.c $(CC) $(CFLAGS) -DSTANDALONE `./test-endianness` -o $@ sha1.c rmd160: rmd160c.c $(CC) $(CFLAGS) -DSTANDALONE `./test-endianness` -o $@ rmd160c.c locator: locator.c $(CC) $(CFLAGS) -DSTANDALONE -o $@ locator.c $(XYMONCOMMLIBS) $(XYMONLIBS) tree: tree.c $(CC) $(CFLAGS) -DSTANDALONE -o $@ tree.c clean: rm -f *.o *.a *~ loadhosts stackio availability test-endianness md5 sha1 rmd160 locator tree xymon-4.3.28/lib/locator.h0000664000076400007640000000355111615341300015572 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __LOCATOR_H__ #define __LOCATOR_H__ enum locator_servicetype_t { ST_RRD, ST_CLIENT, ST_ALERT, ST_HISTORY, ST_HOSTDATA, ST_MAX } ; extern const char *servicetype_names[]; enum locator_sticky_t { LOC_ROAMING, LOC_STICKY, LOC_SINGLESERVER } ; extern enum locator_servicetype_t get_servicetype(char *typestr); extern int locator_init(char *ipport); extern void locator_prepcache(enum locator_servicetype_t svc, int timeout); extern void locator_flushcache(enum locator_servicetype_t svc, char *key); extern char *locator_ping(void); extern int locator_register_server(char *servername, enum locator_servicetype_t svctype, int weight, enum locator_sticky_t sticky, char *extras); extern int locator_register_host(char *hostname, enum locator_servicetype_t svctype, char *servername); extern int locator_rename_host(char *oldhostname, char *newhostname, enum locator_servicetype_t svctype); extern char *locator_query(char *hostname, enum locator_servicetype_t svctype, char **extras); extern int locator_serverup(char *servername, enum locator_servicetype_t svctype); extern int locator_serverdown(char *servername, enum locator_servicetype_t svctype); #endif xymon-4.3.28/lib/md5.c0000664000076400007640000003411011535462534014620 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This file is part of the Xymon monitor library, but was written by */ /* Peter Deutsch and released under the GNU GPL. */ /*----------------------------------------------------------------------------*/ /* Copyright (C) 1999, 2000, 2002 Aladdin Enterprises. All rights reserved. This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. L. Peter Deutsch ghost@aladdin.com */ /* $Id: md5.c 6650 2011-03-08 17:20:28Z storner $ */ /* Independent implementation of MD5 (RFC 1321). This code implements the MD5 Algorithm defined in RFC 1321, whose text is available at http://www.ietf.org/rfc/rfc1321.txt The code is derived from the text of the RFC, including the test suite (section A.5) but excluding the rest of Appendix A. It does not include any code or documentation that is identified in the RFC as being copyrighted. The original and principal author of md5.c is L. Peter Deutsch . Other authors are noted in the change history that follows (in reverse chronological order): 2002-04-13 lpd Clarified derivation from RFC 1321; now handles byte order either statically or dynamically; added missing #include in library. 2002-03-11 lpd Corrected argument list for main(), and added int return type, in test program and T value program. 2002-02-21 lpd Added missing #include in test program. 2000-07-03 lpd Patched to eliminate warnings about "constant is unsigned in ANSI C, signed in traditional"; made test program self-checking. 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5). 1999-05-03 lpd Original version. */ /************ XYMON SPECIFIC MODIFICATION *****************/ /* For Xymon: Moved these definitions from md5.h into here */ typedef unsigned char md5_byte_t; /* 8-bit byte */ typedef unsigned int md5_word_t; /* 32-bit word */ /* Define the state of the MD5 Algorithm. */ typedef struct md5_state_s { md5_word_t count[2]; /* message length in bits, lsw first */ md5_word_t abcd[4]; /* digest buffer */ md5_byte_t buf[64]; /* accumulate block */ } md5_state_t; /************ END XYMON SPECIFIC MODIFICATION *****************/ #include #undef BYTE_ORDER /* 1 = big-endian, -1 = little-endian, 0 = unknown */ #ifdef ARCH_IS_BIG_ENDIAN # define BYTE_ORDER (ARCH_IS_BIG_ENDIAN ? 1 : -1) #else # define BYTE_ORDER 0 #endif #define T_MASK ((md5_word_t)~0) #define T1 /* 0xd76aa478 */ (T_MASK ^ 0x28955b87) #define T2 /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9) #define T3 0x242070db #define T4 /* 0xc1bdceee */ (T_MASK ^ 0x3e423111) #define T5 /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050) #define T6 0x4787c62a #define T7 /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec) #define T8 /* 0xfd469501 */ (T_MASK ^ 0x02b96afe) #define T9 0x698098d8 #define T10 /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850) #define T11 /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e) #define T12 /* 0x895cd7be */ (T_MASK ^ 0x76a32841) #define T13 0x6b901122 #define T14 /* 0xfd987193 */ (T_MASK ^ 0x02678e6c) #define T15 /* 0xa679438e */ (T_MASK ^ 0x5986bc71) #define T16 0x49b40821 #define T17 /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d) #define T18 /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf) #define T19 0x265e5a51 #define T20 /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855) #define T21 /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2) #define T22 0x02441453 #define T23 /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e) #define T24 /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437) #define T25 0x21e1cde6 #define T26 /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829) #define T27 /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278) #define T28 0x455a14ed #define T29 /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa) #define T30 /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07) #define T31 0x676f02d9 #define T32 /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375) #define T33 /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd) #define T34 /* 0x8771f681 */ (T_MASK ^ 0x788e097e) #define T35 0x6d9d6122 #define T36 /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3) #define T37 /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb) #define T38 0x4bdecfa9 #define T39 /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f) #define T40 /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f) #define T41 0x289b7ec6 #define T42 /* 0xeaa127fa */ (T_MASK ^ 0x155ed805) #define T43 /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a) #define T44 0x04881d05 #define T45 /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6) #define T46 /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a) #define T47 0x1fa27cf8 #define T48 /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a) #define T49 /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb) #define T50 0x432aff97 #define T51 /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58) #define T52 /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6) #define T53 0x655b59c3 #define T54 /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d) #define T55 /* 0xffeff47d */ (T_MASK ^ 0x00100b82) #define T56 /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e) #define T57 0x6fa87e4f #define T58 /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f) #define T59 /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb) #define T60 0x4e0811a1 #define T61 /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d) #define T62 /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca) #define T63 0x2ad7d2bb #define T64 /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e) static void md5_process(md5_state_t *pms, const md5_byte_t *data /*[64]*/) { md5_word_t a = pms->abcd[0], b = pms->abcd[1], c = pms->abcd[2], d = pms->abcd[3]; md5_word_t t; #if BYTE_ORDER > 0 /* Define storage only for big-endian CPUs. */ md5_word_t X[16]; #else /* Define storage for little-endian or both types of CPUs. */ md5_word_t xbuf[16]; const md5_word_t *X; #endif { #if BYTE_ORDER == 0 /* * Determine dynamically whether this is a big-endian or * little-endian machine, since we can use a more efficient * algorithm on the latter. */ static const int w = 1; if (*((const md5_byte_t *)&w)) /* dynamic little-endian */ #endif #if BYTE_ORDER <= 0 /* little-endian */ { /* * On little-endian machines, we can process properly aligned * data without copying it. */ if (!((data - (const md5_byte_t *)0) & 3)) { /* data are properly aligned */ X = (const md5_word_t *)data; } else { /* not aligned */ memcpy(xbuf, data, 64); X = xbuf; } } #endif #if BYTE_ORDER == 0 else /* dynamic big-endian */ #endif #if BYTE_ORDER >= 0 /* big-endian */ { /* * On big-endian machines, we must arrange the bytes in the * right order. */ const md5_byte_t *xp = data; int i; # if BYTE_ORDER == 0 X = xbuf; /* (dynamic only) */ # else # define xbuf X /* (static only) */ # endif for (i = 0; i < 16; ++i, xp += 4) xbuf[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24); } #endif } #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) /* Round 1. */ /* Let [abcd k s i] denote the operation a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */ #define F(x, y, z) (((x) & (y)) | (~(x) & (z))) #define SET(a, b, c, d, k, s, Ti)\ t = a + F(b,c,d) + X[k] + Ti;\ a = ROTATE_LEFT(t, s) + b /* Do the following 16 operations. */ SET(a, b, c, d, 0, 7, T1); SET(d, a, b, c, 1, 12, T2); SET(c, d, a, b, 2, 17, T3); SET(b, c, d, a, 3, 22, T4); SET(a, b, c, d, 4, 7, T5); SET(d, a, b, c, 5, 12, T6); SET(c, d, a, b, 6, 17, T7); SET(b, c, d, a, 7, 22, T8); SET(a, b, c, d, 8, 7, T9); SET(d, a, b, c, 9, 12, T10); SET(c, d, a, b, 10, 17, T11); SET(b, c, d, a, 11, 22, T12); SET(a, b, c, d, 12, 7, T13); SET(d, a, b, c, 13, 12, T14); SET(c, d, a, b, 14, 17, T15); SET(b, c, d, a, 15, 22, T16); #undef SET /* Round 2. */ /* Let [abcd k s i] denote the operation a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */ #define G(x, y, z) (((x) & (z)) | ((y) & ~(z))) #define SET(a, b, c, d, k, s, Ti)\ t = a + G(b,c,d) + X[k] + Ti;\ a = ROTATE_LEFT(t, s) + b /* Do the following 16 operations. */ SET(a, b, c, d, 1, 5, T17); SET(d, a, b, c, 6, 9, T18); SET(c, d, a, b, 11, 14, T19); SET(b, c, d, a, 0, 20, T20); SET(a, b, c, d, 5, 5, T21); SET(d, a, b, c, 10, 9, T22); SET(c, d, a, b, 15, 14, T23); SET(b, c, d, a, 4, 20, T24); SET(a, b, c, d, 9, 5, T25); SET(d, a, b, c, 14, 9, T26); SET(c, d, a, b, 3, 14, T27); SET(b, c, d, a, 8, 20, T28); SET(a, b, c, d, 13, 5, T29); SET(d, a, b, c, 2, 9, T30); SET(c, d, a, b, 7, 14, T31); SET(b, c, d, a, 12, 20, T32); #undef SET /* Round 3. */ /* Let [abcd k s t] denote the operation a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */ #define H(x, y, z) ((x) ^ (y) ^ (z)) #define SET(a, b, c, d, k, s, Ti)\ t = a + H(b,c,d) + X[k] + Ti;\ a = ROTATE_LEFT(t, s) + b /* Do the following 16 operations. */ SET(a, b, c, d, 5, 4, T33); SET(d, a, b, c, 8, 11, T34); SET(c, d, a, b, 11, 16, T35); SET(b, c, d, a, 14, 23, T36); SET(a, b, c, d, 1, 4, T37); SET(d, a, b, c, 4, 11, T38); SET(c, d, a, b, 7, 16, T39); SET(b, c, d, a, 10, 23, T40); SET(a, b, c, d, 13, 4, T41); SET(d, a, b, c, 0, 11, T42); SET(c, d, a, b, 3, 16, T43); SET(b, c, d, a, 6, 23, T44); SET(a, b, c, d, 9, 4, T45); SET(d, a, b, c, 12, 11, T46); SET(c, d, a, b, 15, 16, T47); SET(b, c, d, a, 2, 23, T48); #undef SET /* Round 4. */ /* Let [abcd k s t] denote the operation a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */ #define I(x, y, z) ((y) ^ ((x) | ~(z))) #define SET(a, b, c, d, k, s, Ti)\ t = a + I(b,c,d) + X[k] + Ti;\ a = ROTATE_LEFT(t, s) + b /* Do the following 16 operations. */ SET(a, b, c, d, 0, 6, T49); SET(d, a, b, c, 7, 10, T50); SET(c, d, a, b, 14, 15, T51); SET(b, c, d, a, 5, 21, T52); SET(a, b, c, d, 12, 6, T53); SET(d, a, b, c, 3, 10, T54); SET(c, d, a, b, 10, 15, T55); SET(b, c, d, a, 1, 21, T56); SET(a, b, c, d, 8, 6, T57); SET(d, a, b, c, 15, 10, T58); SET(c, d, a, b, 6, 15, T59); SET(b, c, d, a, 13, 21, T60); SET(a, b, c, d, 4, 6, T61); SET(d, a, b, c, 11, 10, T62); SET(c, d, a, b, 2, 15, T63); SET(b, c, d, a, 9, 21, T64); #undef SET /* Then perform the following additions. (That is increment each of the four registers by the value it had before this block was started.) */ pms->abcd[0] += a; pms->abcd[1] += b; pms->abcd[2] += c; pms->abcd[3] += d; } static void md5_init(md5_state_t *pms) { pms->count[0] = pms->count[1] = 0; pms->abcd[0] = 0x67452301; pms->abcd[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476; pms->abcd[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301; pms->abcd[3] = 0x10325476; } static void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes) { const md5_byte_t *p = data; int left = nbytes; int offset = (pms->count[0] >> 3) & 63; md5_word_t nbits = (md5_word_t)(nbytes << 3); if (nbytes <= 0) return; /* Update the message length. */ pms->count[1] += nbytes >> 29; pms->count[0] += nbits; if (pms->count[0] < nbits) pms->count[1]++; /* Process an initial partial block. */ if (offset) { int copy = (offset + nbytes > 64 ? 64 - offset : nbytes); memcpy(pms->buf + offset, p, copy); if (offset + copy < 64) return; p += copy; left -= copy; md5_process(pms, pms->buf); } /* Process full blocks. */ for (; left >= 64; p += 64, left -= 64) md5_process(pms, p); /* Process a final partial block. */ if (left) memcpy(pms->buf, p, left); } static void md5_finish(md5_state_t *pms, md5_byte_t digest[16]) { static const md5_byte_t pad[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; md5_byte_t data[8]; int i; /* Save the length before padding. */ for (i = 0; i < 8; ++i) data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3)); /* Pad to 56 bytes mod 64. */ md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1); /* Append the length. */ md5_append(pms, data, 8); for (i = 0; i < 16; ++i) digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3)); } /* Added for use with Xymon */ int myMD5_Size(void) { return sizeof(md5_state_t); } void myMD5_Init(void *pms) { md5_init((md5_state_t *)pms); } void myMD5_Update(void *pms, unsigned char *data, int nbytes) { md5_append((md5_state_t *)pms, (md5_byte_t *)data, nbytes); } void myMD5_Final(unsigned char digest[16], void *pms) { md5_finish((md5_state_t *)pms, (md5_byte_t *)digest); } #ifdef STANDALONE #include #include #include int main(int argc, char *argv[]) { FILE *fd; int n; unsigned char buf[8192]; void *context; unsigned char digest[16]; int i; fd = fopen(argv[1], "r"); if (fd == NULL) return 1; context = (void *)malloc(myMD5_Size()); myMD5_Init(context); while ((n = fread(buf, 1, sizeof(buf), fd)) > 0) myMD5_Update(context, buf, n); fclose(fd); myMD5_Final(digest, context); for (i=0; (i < sizeof(digest)); i++) printf("%02x", digest[i]); printf("\n"); return 0; } #endif xymon-4.3.28/lib/loadalerts.h0000664000076400007640000000670312654212423016272 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __LOADALERTS_H__ #define __LOADALERTS_H__ #include #include /* The clients probably don't have the pcre headers */ #if defined(LOCALCLIENT) || !defined(CLIENTONLY) #include typedef enum { A_PAGING, A_NORECIP, A_ACKED, A_RECOVERED, A_DISABLED, A_NOTIFY, A_DEAD } astate_t; typedef struct activealerts_t { /* Identification of the alert */ char *hostname; char *testname; char *location; char *osname; char *classname; char *groups; char ip[IP_ADDR_STRLEN]; /* Alert status */ int color, maxcolor; unsigned char *pagemessage; unsigned char *ackmessage; time_t eventstart; time_t nextalerttime; astate_t state; int cookie; struct activealerts_t *next; } activealerts_t; /* These are the criteria we use when matching an alert. Used both generally for a rule, and for recipients */ enum method_t { M_MAIL, M_SCRIPT, M_IGNORE }; enum msgformat_t { ALERTFORM_TEXT, ALERTFORM_PLAIN, ALERTFORM_SMS, ALERTFORM_PAGER, ALERTFORM_SCRIPT, ALERTFORM_NONE }; enum recovermsg_t { SR_UNKNOWN, SR_NOTWANTED, SR_WANTED }; typedef struct criteria_t { int cfid; char *cfline; char *pagespec; /* Pages to include */ pcre *pagespecre; char *expagespec; /* Pages to exclude */ pcre *expagespecre; char *dgspec; /* Display groups to include */ pcre *dgspecre; char *exdgspec; /* Display groups to exclude */ pcre *exdgspecre; char *hostspec; /* Hosts to include */ pcre *hostspecre; char *exhostspec; /* Hosts to exclude */ pcre *exhostspecre; char *svcspec; /* Services to include */ pcre *svcspecre; char *exsvcspec; /* Services to exclude */ pcre *exsvcspecre; char *classspec; pcre *classspecre; char *exclassspec; pcre *exclassspecre; char *groupspec; pcre *groupspecre; char *exgroupspec; pcre *exgroupspecre; int colors; char *timespec; char *extimespec; int minduration, maxduration; /* In seconds */ enum recovermsg_t sendrecovered, sendnotice; } criteria_t; /* This defines a recipient. There may be some criteria, and then how we send alerts to him */ typedef struct recip_t { int cfid; criteria_t *criteria; enum method_t method; char *recipient; char *scriptname; enum msgformat_t format; time_t interval; /* In seconds */ int stoprule, unmatchedonly, noalerts; struct recip_t *next; } recip_t; extern int load_alertconfig(char *configfn, int alertcolors, int alertinterval); extern void dump_alertconfig(int showlinenumbers); extern void set_localalertmode(int localmode); extern int stoprulefound; extern recip_t *next_recipient(activealerts_t *alert, int *first, int *anymatch, time_t *nexttime); extern int have_recipient(activealerts_t *alert, int *anymatch); extern void alert_printmode(int on); extern void print_alert_recipients(activealerts_t *alert, strbuffer_t *buf); #endif #endif xymon-4.3.28/lib/suid.c0000664000076400007640000000333711615341300015070 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains routines for handling UID changes. */ /* */ /* Copyright (C) 2006-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: suid.c 6712 2011-07-31 21:01:52Z storner $"; #include #include #include #include "libxymon.h" int havemyuid = 0; static uid_t myuid; #ifdef HPUX void drop_root(void) { if (!havemyuid) { myuid = getuid(); havemyuid = 1; } setresuid(-1, myuid, -1); } void get_root(void) { setresuid(-1, 0, -1); } #else void drop_root(void) { if (!havemyuid) { myuid = getuid(); havemyuid = 1; } seteuid(myuid); } void get_root(void) { seteuid(0); } #endif void drop_root_and_removesuid(char *fn) { struct stat st; if ( (stat(fn, &st) == 0) && (st.st_mode & S_ISUID) && (st.st_uid == 0) ) { /* We now know that fn is suid-root */ chmod(fn, (st.st_mode & (~S_ISUID))); } drop_root(); } xymon-4.3.28/lib/crondate.c0000664000076400007640000003767511615341300015737 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains routines for time-specs in CRON format. */ /* */ /* Copyright (C) 2010-2011 Henrik Storner */ /* Copyright (C) 2010 Milan Kocian */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2 (see the file "COPYING" for details), except as listed below. */ /* */ /*----------------------------------------------------------------------------*/ /* * A large part of this file was adapted from the "cron" sources by Paul * Vixie. It contains this copyright notice: * ------------------------------------------------------------------------ * Copyright 1988,1990,1993,1994 by Paul Vixie * All rights reserved * * Distribute freely, except: don't remove my name from the source or * documentation (don't take credit for my work), mark your changes (don't * get me blamed for your possible bugs), don't alter or remove this * notice. May be sold if buildable source is provided to buyer. No * warrantee of any kind, express or implied, is included with this * software; use at your own risk, responsibility for damages (if any) to * anyone resulting from the use of this software rests entirely with the * user. * ------------------------------------------------------------------------ * Adjusted by Milan Kocian so don't tease original autor * for my bugs. * * Major change is that functions operate on string instead on file. * And it's used only time part of cronline (no user, cmd, etc.) * Also, the file "bitstring.h" was used from the cron sources. This file * carries the following copyright notice: * ------------------------------------------------------------------------ * Copyright (c) 1989 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Paul Vixie. * * Redistribution and use in source and binary forms are permitted * provided that the above copyright notice and this paragraph are * duplicated in all such forms and that any documentation, * advertising materials, and other materials related to such * distribution and use acknowledge that the software was developed * by the University of California, Berkeley. The name of the * University may not be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * * @(#)bitstring.h 5.2 (Berkeley) 4/4/90 * ------------------------------------------------------------------------ * */ static char rcsid[] = "$Id: crondate.c 6712 2011-07-31 21:01:52Z storner $"; /* -------------------- bitstring.h begins -----------------------------*/ #include #include #include #include #include typedef unsigned char bitstr_t; /* internal macros */ /* byte of the bitstring bit is in */ #define _bit_byte(bit) \ ((bit) >> 3) /* mask for the bit within its byte */ #define _bit_mask(bit) \ (1 << ((bit)&0x7)) /* external macros */ /* bytes in a bitstring of nbits bits */ #define bitstr_size(nbits) \ ((((nbits) - 1) >> 3) + 1) /* allocate a bitstring */ #define bit_alloc(nbits) \ (bitstr_t *)malloc(1, \ (unsigned int)bitstr_size(nbits) * sizeof(bitstr_t)) /* allocate a bitstring on the stack */ #define bit_decl(name, nbits) \ (name)[bitstr_size(nbits)] /* is bit N of bitstring name set? */ #define bit_test(name, bit) \ ((name)[_bit_byte(bit)] & _bit_mask(bit)) /* set bit N of bitstring name */ #define bit_set(name, bit) \ (name)[_bit_byte(bit)] |= _bit_mask(bit) /* clear bit N of bitstring name */ #define bit_clear(name, bit) \ (name)[_bit_byte(bit)] &= ~_bit_mask(bit) /* clear bits start ... stop in bitstring */ #define bit_nclear(name, start, stop) { \ register bitstr_t *_name = name; \ register int _start = start, _stop = stop; \ register int _startbyte = _bit_byte(_start); \ register int _stopbyte = _bit_byte(_stop); \ if (_startbyte == _stopbyte) { \ _name[_startbyte] &= ((0xff >> (8 - (_start&0x7))) | \ (0xff << ((_stop&0x7) + 1))); \ } else { \ _name[_startbyte] &= 0xff >> (8 - (_start&0x7)); \ while (++_startbyte < _stopbyte) \ _name[_startbyte] = 0; \ _name[_stopbyte] &= 0xff << ((_stop&0x7) + 1); \ } \ } /* set bits start ... stop in bitstring */ #define bit_nset(name, start, stop) { \ register bitstr_t *_name = name; \ register int _start = start, _stop = stop; \ register int _startbyte = _bit_byte(_start); \ register int _stopbyte = _bit_byte(_stop); \ if (_startbyte == _stopbyte) { \ _name[_startbyte] |= ((0xff << (_start&0x7)) & \ (0xff >> (7 - (_stop&0x7)))); \ } else { \ _name[_startbyte] |= 0xff << ((_start)&0x7); \ while (++_startbyte < _stopbyte) \ _name[_startbyte] = 0xff; \ _name[_stopbyte] |= 0xff >> (7 - (_stop&0x7)); \ } \ } /* find first bit clear in name */ #define bit_ffc(name, nbits, value) { \ register bitstr_t *_name = name; \ register int _byte, _nbits = nbits; \ register int _stopbyte = _bit_byte(_nbits), _value = -1; \ for (_byte = 0; _byte <= _stopbyte; ++_byte) \ if (_name[_byte] != 0xff) { \ _value = _byte << 3; \ for (_stopbyte = _name[_byte]; (_stopbyte&0x1); \ ++_value, _stopbyte >>= 1); \ break; \ } \ *(value) = _value; \ } /* find first bit set in name */ #define bit_ffs(name, nbits, value) { \ register bitstr_t *_name = name; \ register int _byte, _nbits = nbits; \ register int _stopbyte = _bit_byte(_nbits), _value = -1; \ for (_byte = 0; _byte <= _stopbyte; ++_byte) \ if (_name[_byte]) { \ _value = _byte << 3; \ for (_stopbyte = _name[_byte]; !(_stopbyte&0x1); \ ++_value, _stopbyte >>= 1); \ break; \ } \ *(value) = _value; \ } /* -------------------- end of bitstring.h ------------------------------- */ /* --------------------- crondate from Paul Vixie cron ------------------ */ #define TRUE 1 #define FALSE 0 #define MAX_TEMPSTR 1000 #define Skip_Blanks(c) \ while (*c == '\t' || *c == ' ') \ c++; #define Skip_Nonblanks(c) \ while (*c!='\t' && *c!=' ' && *c!='\n' && *c!='\0') \ c++; #define SECONDS_PER_MINUTE 60 #define FIRST_MINUTE 0 #define LAST_MINUTE 59 #define MINUTE_COUNT (LAST_MINUTE - FIRST_MINUTE + 1) #define FIRST_HOUR 0 #define LAST_HOUR 23 #define HOUR_COUNT (LAST_HOUR - FIRST_HOUR + 1) #define FIRST_DOM 1 #define LAST_DOM 31 #define DOM_COUNT (LAST_DOM - FIRST_DOM + 1) #define FIRST_MONTH 1 #define LAST_MONTH 12 #define MONTH_COUNT (LAST_MONTH - FIRST_MONTH + 1) /* note on DOW: 0 and 7 are both Sunday, for compatibility reasons. */ #define FIRST_DOW 0 #define LAST_DOW 7 #define DOW_COUNT (LAST_DOW - FIRST_DOW + 1) typedef struct { bitstr_t bit_decl(minute, MINUTE_COUNT); bitstr_t bit_decl(hour, HOUR_COUNT); bitstr_t bit_decl(dom, DOM_COUNT); bitstr_t bit_decl(month, MONTH_COUNT); bitstr_t bit_decl(dow, DOW_COUNT); int flags; #define DOM_STAR 0x01 #define DOW_STAR 0x02 #define WHEN_REBOOT 0x04 #define MIN_STAR 0x08 #define HR_STAR 0x10 } c_bits_t; #define PPC_NULL ((char **)NULL) static char *MonthNames[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", NULL }; static char *DowNames[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", NULL }; static char * get_number(numptr, low, names, ch) int *numptr; /* where does the result go? */ int low; /* offset applied to result if symbolic enum used */ char *names[]; /* symbolic names, if any, for enums */ char *ch; /* current character */ { char temp[MAX_TEMPSTR], *pc; int len, i, all_digits; /* collect alphanumerics into our fixed-size temp array */ pc = temp; len = 0; all_digits = TRUE; while (isalnum((int)*ch)) { if (++len >= MAX_TEMPSTR) return(NULL); *pc++ = *ch; if (!isdigit((int)*ch)) all_digits = FALSE; ch++; } *pc = '\0'; if (len == 0) { return(NULL); } /* try to find the name in the name list */ if (names) { for (i = 0; names[i] != NULL; i++) { if (!strcasecmp(names[i], temp)) { *numptr = i+low; return ch; } } } /* no name list specified, or there is one and our string isn't * in it. either way: if it's all digits, use its magnitude. * otherwise, it's an error. */ if (all_digits) { *numptr = atoi(temp); return ch; } return(NULL) ; } static int set_element(bits, low, high, number) bitstr_t *bits; /* one bit per flag, default=FALSE */ int low; int high; int number; { if (number < low || number > high) return(-1); bit_set(bits, (number-low)); return(0); } static char * get_range(bits, low, high, names, ch, last) bitstr_t *bits; /* one bit per flag, default=FALSE */ int low, high; /* bounds, impl. offset for bitstr */ char *names[]; /* NULL or names of elements */ char *ch; /* current character being processed */ int last; /* processing last value */ { /* range = number | number "-" number [ "/" number ] */ register int i; auto int num1, num2, num3; if (*ch == '*') { /* '*' means "first-last" but can still be modified by /step */ num1 = low; num2 = high; ch++; if (!*ch) { if (!last) /* string is too short (if not last)*/ return(NULL); } } else { ch = get_number(&num1, low, names, ch); if (!ch) return (NULL); if (*ch != '-') { /* not a range, it's a single number. */ if (set_element(bits, low, high, num1)) return(NULL); return ch; } else { /* eat the dash */ ch++; if (!*ch) return(NULL); /* get the number following the dash */ ch = get_number(&num2, low, names, ch); if (!ch) return(NULL); } } /* check for step size */ if (*ch == '/') { /* eat the slash */ ch++; if (!*ch) return(NULL); /* get the step size -- note: we don't pass the * names here, because the number is not an * element id, it's a step size. 'low' is * sent as a 0 since there is no offset either. */ ch = get_number(&num3, 0, PPC_NULL, ch); if (!ch || num3 <= 0) return(NULL) ; } else { /* no step. default==1. */ num3 = 1; } /* Explicitly check for sane values. Certain combinations of ranges and * steps which should return EOF don't get picked up by the code below, * eg: * 5-64/30 * * * * touch /dev/null * * Code adapted from set_elements() where this error was probably intended * to be catched. */ if (num1 < low || num1 > high || num2 < low || num2 > high) return(NULL); /* range. set all elements from num1 to num2, stepping * by num3. (the step is a downward-compatible extension * proposed conceptually by bob@acornrc, syntactically * designed then implmented by paul vixie). */ for (i = num1; i <= num2; i += num3) if (set_element(bits, low, high, i)) return(NULL); return ch; } static char * get_list(bits, low, high, names, ch, last) bitstr_t *bits; /* one bit per flag, default=FALSE */ int low, high; /* bounds, impl. offset for bitstr */ char *names[]; /* NULL or *[] of names for these elements */ char *ch; /* current character being processed */ int last; /* processing last value */ { register int done; /* we know that we point to a non-blank character here; * must do a Skip_Blanks before we exit, so that the * next call (or the code that picks up the cmd) can * assume the same thing. */ /* clear the bit string, since the default is 'off'. */ bit_nclear(bits, 0, (high-low+1)); /* process all ranges */ done = FALSE; while (!done) { ch = get_range(bits, low, high, names, ch, last); if (ch && *ch == ',') ch++; else done = TRUE; } /* exiting. skip to some blanks, then skip over the blanks. */ if (ch) { Skip_Nonblanks(ch) Skip_Blanks(ch) } return ch; } /* parse cron time */ void * parse_cron_time(char * ch) { c_bits_t *e; e = (c_bits_t *) calloc(1, sizeof(c_bits_t)); if (!e) return(NULL); if (ch[0] == '@') { if (!strcmp("yearly", ch + 1) || !strcmp("annually", ch + 1)) { bit_set(e->minute, 0); bit_set(e->hour, 0); bit_set(e->dom, 0); bit_set(e->month, 0); bit_nset(e->dow, 0, (LAST_DOW-FIRST_DOW+1)); e->flags |= DOW_STAR; } else if (!strcmp("monthly", ch + 1)) { bit_set(e->minute, 0); bit_set(e->hour, 0); bit_set(e->dom, 0); bit_nset(e->month, 0, (LAST_MONTH-FIRST_MONTH+1)); bit_nset(e->dow, 0, (LAST_DOW-FIRST_DOW+1)); e->flags |= DOW_STAR; } else if (!strcmp("weekly", ch + 1)) { bit_set(e->minute, 0); bit_set(e->hour, 0); bit_nset(e->dom, 0, (LAST_DOM-FIRST_DOM+1)); e->flags |= DOM_STAR; bit_nset(e->month, 0, (LAST_MONTH-FIRST_MONTH+1)); bit_nset(e->dow, 0,0); } else if (!strcmp("daily", ch + 1) || !strcmp("midnight", ch + 1)) { bit_set(e->minute, 0); bit_set(e->hour, 0); bit_nset(e->dom, 0, (LAST_DOM-FIRST_DOM+1)); bit_nset(e->month, 0, (LAST_MONTH-FIRST_MONTH+1)); bit_nset(e->dow, 0, (LAST_DOW-FIRST_DOW+1)); } else if (!strcmp("hourly", ch + 1)) { bit_set(e->minute, 0); bit_nset(e->hour, 0, (LAST_HOUR-FIRST_HOUR+1)); bit_nset(e->dom, 0, (LAST_DOM-FIRST_DOM+1)); bit_nset(e->month, 0, (LAST_MONTH-FIRST_MONTH+1)); bit_nset(e->dow, 0, (LAST_DOW-FIRST_DOW+1)); e->flags |= HR_STAR; } else { free(e); return(NULL); } } else { /* end of '@' and begin for * * .. */ if (*ch == '*') e->flags |= MIN_STAR; ch = get_list(e->minute, FIRST_MINUTE, LAST_MINUTE, PPC_NULL, ch, 0); if (!ch) { free(e); return(NULL); } /* hours */ if (*ch == '*') e->flags |= HR_STAR; ch = get_list(e->hour, FIRST_HOUR, LAST_HOUR, PPC_NULL, ch, 0); if (!ch) { free(e); return(NULL); } /* DOM (days of month) */ if (*ch == '*') e->flags |= DOM_STAR; ch = get_list(e->dom, FIRST_DOM, LAST_DOM, PPC_NULL, ch, 0); if (!ch) { free(e); return(NULL); } /* month */ ch = get_list(e->month, FIRST_MONTH, LAST_MONTH, MonthNames, ch, 0); if (!ch) { free(e); return(NULL); } /* DOW (days of week) */ if (*ch == '*') e->flags |= DOW_STAR; ch = get_list(e->dow, FIRST_DOW, LAST_DOW, DowNames, ch, 1); if (!ch) { free(e); return(NULL); } } /* make sundays equivilent */ if (bit_test(e->dow, 0) || bit_test(e->dow, 7)) { bit_set(e->dow, 0); bit_set(e->dow, 7); } /* end of * * ... parse */ return e; } /* END of cron date-time parser */ /*----------------- End of code from Paul Vixie's cron sources ----------------*/ void crondatefree(void *vcdate) { c_bits_t *cdate = (c_bits_t *)vcdate; free(cdate); } static int minute=-1, hour=-1, dom=-1, month=-1, dow=-1; void crongettime(void) { time_t now; struct tm tt; now = time(NULL); /* we need real clock, not monotonic from gettimer */ localtime_r(&now, &tt); minute = tt.tm_min -FIRST_MINUTE; hour = tt.tm_hour -FIRST_HOUR; dom = tt.tm_mday -FIRST_DOM; month = tt.tm_mon +1 /* 0..11 -> 1..12 */ -FIRST_MONTH; dow = tt.tm_wday -FIRST_DOW; } int cronmatch(void *vcdate) { c_bits_t *cdate = (c_bits_t *)vcdate; if (minute == -1) crongettime(); return cdate && bit_test(cdate->minute, minute) && bit_test(cdate->hour, hour) && bit_test(cdate->month, month) && ( ((cdate->flags & DOM_STAR) || (cdate->flags & DOW_STAR)) ? (bit_test(cdate->dow,dow) && bit_test(cdate->dom,dom)) : (bit_test(cdate->dow,dow) || bit_test(cdate->dom,dom))); } xymon-4.3.28/lib/sig.h0000664000076400007640000000147411615341300014713 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __SIG_H__ #define __SIG_H__ extern void setup_signalhandler(char *programname); #endif xymon-4.3.28/lib/sha2.c0000664000076400007640000010267612000053403014760 0ustar rpmbuildrpmbuild/* * FIPS 180-2 SHA-224/256/384/512 implementation * Last update: 02/02/2007 * Issue date: 04/30/2005 * * Copyright (C) 2005, 2007 Olivier Gay * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project 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 PROJECT 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 PROJECT 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. */ #if 0 #define UNROLL_LOOPS /* Enable loops unrolling */ #endif #include #include "sha2.h" #define SHFR(x, n) (x >> n) #define ROTR(x, n) ((x >> n) | (x << ((sizeof(x) << 3) - n))) #define ROTL(x, n) ((x << n) | (x >> ((sizeof(x) << 3) - n))) #define CH(x, y, z) ((x & y) ^ (~x & z)) #define MAJ(x, y, z) ((x & y) ^ (x & z) ^ (y & z)) #define SHA256_F1(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22)) #define SHA256_F2(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25)) #define SHA256_F3(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHFR(x, 3)) #define SHA256_F4(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHFR(x, 10)) #define SHA512_F1(x) (ROTR(x, 28) ^ ROTR(x, 34) ^ ROTR(x, 39)) #define SHA512_F2(x) (ROTR(x, 14) ^ ROTR(x, 18) ^ ROTR(x, 41)) #define SHA512_F3(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHFR(x, 7)) #define SHA512_F4(x) (ROTR(x, 19) ^ ROTR(x, 61) ^ SHFR(x, 6)) #define UNPACK32(x, str) \ { \ *((str) + 3) = (uint8) ((x) ); \ *((str) + 2) = (uint8) ((x) >> 8); \ *((str) + 1) = (uint8) ((x) >> 16); \ *((str) + 0) = (uint8) ((x) >> 24); \ } #define PACK32(str, x) \ { \ *(x) = ((uint32) *((str) + 3) ) \ | ((uint32) *((str) + 2) << 8) \ | ((uint32) *((str) + 1) << 16) \ | ((uint32) *((str) + 0) << 24); \ } #define UNPACK64(x, str) \ { \ *((str) + 7) = (uint8) ((x) ); \ *((str) + 6) = (uint8) ((x) >> 8); \ *((str) + 5) = (uint8) ((x) >> 16); \ *((str) + 4) = (uint8) ((x) >> 24); \ *((str) + 3) = (uint8) ((x) >> 32); \ *((str) + 2) = (uint8) ((x) >> 40); \ *((str) + 1) = (uint8) ((x) >> 48); \ *((str) + 0) = (uint8) ((x) >> 56); \ } #define PACK64(str, x) \ { \ *(x) = ((uint64) *((str) + 7) ) \ | ((uint64) *((str) + 6) << 8) \ | ((uint64) *((str) + 5) << 16) \ | ((uint64) *((str) + 4) << 24) \ | ((uint64) *((str) + 3) << 32) \ | ((uint64) *((str) + 2) << 40) \ | ((uint64) *((str) + 1) << 48) \ | ((uint64) *((str) + 0) << 56); \ } /* Macros used for loops unrolling */ #define SHA256_SCR(i) \ { \ w[i] = SHA256_F4(w[i - 2]) + w[i - 7] \ + SHA256_F3(w[i - 15]) + w[i - 16]; \ } #define SHA512_SCR(i) \ { \ w[i] = SHA512_F4(w[i - 2]) + w[i - 7] \ + SHA512_F3(w[i - 15]) + w[i - 16]; \ } #define SHA256_EXP(a, b, c, d, e, f, g, h, j) \ { \ t1 = wv[h] + SHA256_F2(wv[e]) + CH(wv[e], wv[f], wv[g]) \ + sha256_k[j] + w[j]; \ t2 = SHA256_F1(wv[a]) + MAJ(wv[a], wv[b], wv[c]); \ wv[d] += t1; \ wv[h] = t1 + t2; \ } #define SHA512_EXP(a, b, c, d, e, f, g ,h, j) \ { \ t1 = wv[h] + SHA512_F2(wv[e]) + CH(wv[e], wv[f], wv[g]) \ + sha512_k[j] + w[j]; \ t2 = SHA512_F1(wv[a]) + MAJ(wv[a], wv[b], wv[c]); \ wv[d] += t1; \ wv[h] = t1 + t2; \ } uint32 sha224_h0[8] = {0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4}; uint32 sha256_h0[8] = {0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19}; uint64 sha384_h0[8] = {0xcbbb9d5dc1059ed8ULL, 0x629a292a367cd507ULL, 0x9159015a3070dd17ULL, 0x152fecd8f70e5939ULL, 0x67332667ffc00b31ULL, 0x8eb44a8768581511ULL, 0xdb0c2e0d64f98fa7ULL, 0x47b5481dbefa4fa4ULL}; uint64 sha512_h0[8] = {0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL, 0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL, 0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL, 0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL}; uint32 sha256_k[64] = {0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2}; uint64 sha512_k[80] = {0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL, 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL, 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL, 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL, 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL, 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL, 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL, 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL, 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL, 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL, 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL, 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL, 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL, 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL, 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL, 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL, 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL, 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL, 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL, 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL, 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL, 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL, 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL, 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL, 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL, 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL, 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL, 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL, 0x113f9804bef90daeULL, 0x1b710b35131c471bULL, 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL, 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL}; /* SHA-256 functions */ void sha256_transf(sha256_ctx *ctx, const unsigned char *message, unsigned int block_nb) { uint32 w[64]; uint32 wv[8]; uint32 t1, t2; const unsigned char *sub_block; int i; #ifndef UNROLL_LOOPS int j; #endif for (i = 0; i < (int) block_nb; i++) { sub_block = message + (i << 6); #ifndef UNROLL_LOOPS for (j = 0; j < 16; j++) { PACK32(&sub_block[j << 2], &w[j]); } for (j = 16; j < 64; j++) { SHA256_SCR(j); } for (j = 0; j < 8; j++) { wv[j] = ctx->h[j]; } for (j = 0; j < 64; j++) { t1 = wv[7] + SHA256_F2(wv[4]) + CH(wv[4], wv[5], wv[6]) + sha256_k[j] + w[j]; t2 = SHA256_F1(wv[0]) + MAJ(wv[0], wv[1], wv[2]); wv[7] = wv[6]; wv[6] = wv[5]; wv[5] = wv[4]; wv[4] = wv[3] + t1; wv[3] = wv[2]; wv[2] = wv[1]; wv[1] = wv[0]; wv[0] = t1 + t2; } for (j = 0; j < 8; j++) { ctx->h[j] += wv[j]; } #else PACK32(&sub_block[ 0], &w[ 0]); PACK32(&sub_block[ 4], &w[ 1]); PACK32(&sub_block[ 8], &w[ 2]); PACK32(&sub_block[12], &w[ 3]); PACK32(&sub_block[16], &w[ 4]); PACK32(&sub_block[20], &w[ 5]); PACK32(&sub_block[24], &w[ 6]); PACK32(&sub_block[28], &w[ 7]); PACK32(&sub_block[32], &w[ 8]); PACK32(&sub_block[36], &w[ 9]); PACK32(&sub_block[40], &w[10]); PACK32(&sub_block[44], &w[11]); PACK32(&sub_block[48], &w[12]); PACK32(&sub_block[52], &w[13]); PACK32(&sub_block[56], &w[14]); PACK32(&sub_block[60], &w[15]); SHA256_SCR(16); SHA256_SCR(17); SHA256_SCR(18); SHA256_SCR(19); SHA256_SCR(20); SHA256_SCR(21); SHA256_SCR(22); SHA256_SCR(23); SHA256_SCR(24); SHA256_SCR(25); SHA256_SCR(26); SHA256_SCR(27); SHA256_SCR(28); SHA256_SCR(29); SHA256_SCR(30); SHA256_SCR(31); SHA256_SCR(32); SHA256_SCR(33); SHA256_SCR(34); SHA256_SCR(35); SHA256_SCR(36); SHA256_SCR(37); SHA256_SCR(38); SHA256_SCR(39); SHA256_SCR(40); SHA256_SCR(41); SHA256_SCR(42); SHA256_SCR(43); SHA256_SCR(44); SHA256_SCR(45); SHA256_SCR(46); SHA256_SCR(47); SHA256_SCR(48); SHA256_SCR(49); SHA256_SCR(50); SHA256_SCR(51); SHA256_SCR(52); SHA256_SCR(53); SHA256_SCR(54); SHA256_SCR(55); SHA256_SCR(56); SHA256_SCR(57); SHA256_SCR(58); SHA256_SCR(59); SHA256_SCR(60); SHA256_SCR(61); SHA256_SCR(62); SHA256_SCR(63); wv[0] = ctx->h[0]; wv[1] = ctx->h[1]; wv[2] = ctx->h[2]; wv[3] = ctx->h[3]; wv[4] = ctx->h[4]; wv[5] = ctx->h[5]; wv[6] = ctx->h[6]; wv[7] = ctx->h[7]; SHA256_EXP(0,1,2,3,4,5,6,7, 0); SHA256_EXP(7,0,1,2,3,4,5,6, 1); SHA256_EXP(6,7,0,1,2,3,4,5, 2); SHA256_EXP(5,6,7,0,1,2,3,4, 3); SHA256_EXP(4,5,6,7,0,1,2,3, 4); SHA256_EXP(3,4,5,6,7,0,1,2, 5); SHA256_EXP(2,3,4,5,6,7,0,1, 6); SHA256_EXP(1,2,3,4,5,6,7,0, 7); SHA256_EXP(0,1,2,3,4,5,6,7, 8); SHA256_EXP(7,0,1,2,3,4,5,6, 9); SHA256_EXP(6,7,0,1,2,3,4,5,10); SHA256_EXP(5,6,7,0,1,2,3,4,11); SHA256_EXP(4,5,6,7,0,1,2,3,12); SHA256_EXP(3,4,5,6,7,0,1,2,13); SHA256_EXP(2,3,4,5,6,7,0,1,14); SHA256_EXP(1,2,3,4,5,6,7,0,15); SHA256_EXP(0,1,2,3,4,5,6,7,16); SHA256_EXP(7,0,1,2,3,4,5,6,17); SHA256_EXP(6,7,0,1,2,3,4,5,18); SHA256_EXP(5,6,7,0,1,2,3,4,19); SHA256_EXP(4,5,6,7,0,1,2,3,20); SHA256_EXP(3,4,5,6,7,0,1,2,21); SHA256_EXP(2,3,4,5,6,7,0,1,22); SHA256_EXP(1,2,3,4,5,6,7,0,23); SHA256_EXP(0,1,2,3,4,5,6,7,24); SHA256_EXP(7,0,1,2,3,4,5,6,25); SHA256_EXP(6,7,0,1,2,3,4,5,26); SHA256_EXP(5,6,7,0,1,2,3,4,27); SHA256_EXP(4,5,6,7,0,1,2,3,28); SHA256_EXP(3,4,5,6,7,0,1,2,29); SHA256_EXP(2,3,4,5,6,7,0,1,30); SHA256_EXP(1,2,3,4,5,6,7,0,31); SHA256_EXP(0,1,2,3,4,5,6,7,32); SHA256_EXP(7,0,1,2,3,4,5,6,33); SHA256_EXP(6,7,0,1,2,3,4,5,34); SHA256_EXP(5,6,7,0,1,2,3,4,35); SHA256_EXP(4,5,6,7,0,1,2,3,36); SHA256_EXP(3,4,5,6,7,0,1,2,37); SHA256_EXP(2,3,4,5,6,7,0,1,38); SHA256_EXP(1,2,3,4,5,6,7,0,39); SHA256_EXP(0,1,2,3,4,5,6,7,40); SHA256_EXP(7,0,1,2,3,4,5,6,41); SHA256_EXP(6,7,0,1,2,3,4,5,42); SHA256_EXP(5,6,7,0,1,2,3,4,43); SHA256_EXP(4,5,6,7,0,1,2,3,44); SHA256_EXP(3,4,5,6,7,0,1,2,45); SHA256_EXP(2,3,4,5,6,7,0,1,46); SHA256_EXP(1,2,3,4,5,6,7,0,47); SHA256_EXP(0,1,2,3,4,5,6,7,48); SHA256_EXP(7,0,1,2,3,4,5,6,49); SHA256_EXP(6,7,0,1,2,3,4,5,50); SHA256_EXP(5,6,7,0,1,2,3,4,51); SHA256_EXP(4,5,6,7,0,1,2,3,52); SHA256_EXP(3,4,5,6,7,0,1,2,53); SHA256_EXP(2,3,4,5,6,7,0,1,54); SHA256_EXP(1,2,3,4,5,6,7,0,55); SHA256_EXP(0,1,2,3,4,5,6,7,56); SHA256_EXP(7,0,1,2,3,4,5,6,57); SHA256_EXP(6,7,0,1,2,3,4,5,58); SHA256_EXP(5,6,7,0,1,2,3,4,59); SHA256_EXP(4,5,6,7,0,1,2,3,60); SHA256_EXP(3,4,5,6,7,0,1,2,61); SHA256_EXP(2,3,4,5,6,7,0,1,62); SHA256_EXP(1,2,3,4,5,6,7,0,63); ctx->h[0] += wv[0]; ctx->h[1] += wv[1]; ctx->h[2] += wv[2]; ctx->h[3] += wv[3]; ctx->h[4] += wv[4]; ctx->h[5] += wv[5]; ctx->h[6] += wv[6]; ctx->h[7] += wv[7]; #endif /* !UNROLL_LOOPS */ } } void sha256(const unsigned char *message, unsigned int len, unsigned char *digest) { sha256_ctx ctx; sha256_init(&ctx); sha256_update(&ctx, message, len); sha256_final(&ctx, digest); } void sha256_init(sha256_ctx *ctx) { #ifndef UNROLL_LOOPS int i; for (i = 0; i < 8; i++) { ctx->h[i] = sha256_h0[i]; } #else ctx->h[0] = sha256_h0[0]; ctx->h[1] = sha256_h0[1]; ctx->h[2] = sha256_h0[2]; ctx->h[3] = sha256_h0[3]; ctx->h[4] = sha256_h0[4]; ctx->h[5] = sha256_h0[5]; ctx->h[6] = sha256_h0[6]; ctx->h[7] = sha256_h0[7]; #endif /* !UNROLL_LOOPS */ ctx->len = 0; ctx->tot_len = 0; } void sha256_update(sha256_ctx *ctx, const unsigned char *message, unsigned int len) { unsigned int block_nb; unsigned int new_len, rem_len, tmp_len; const unsigned char *shifted_message; tmp_len = SHA256_BLOCK_SIZE - ctx->len; rem_len = len < tmp_len ? len : tmp_len; memcpy(&ctx->block[ctx->len], message, rem_len); if (ctx->len + len < SHA256_BLOCK_SIZE) { ctx->len += len; return; } new_len = len - rem_len; block_nb = new_len / SHA256_BLOCK_SIZE; shifted_message = message + rem_len; sha256_transf(ctx, ctx->block, 1); sha256_transf(ctx, shifted_message, block_nb); rem_len = new_len % SHA256_BLOCK_SIZE; memcpy(ctx->block, &shifted_message[block_nb << 6], rem_len); ctx->len = rem_len; ctx->tot_len += (block_nb + 1) << 6; } void sha256_final(sha256_ctx *ctx, unsigned char *digest) { unsigned int block_nb; unsigned int pm_len; unsigned int len_b; #ifndef UNROLL_LOOPS int i; #endif block_nb = (1 + ((SHA256_BLOCK_SIZE - 9) < (ctx->len % SHA256_BLOCK_SIZE))); len_b = (ctx->tot_len + ctx->len) << 3; pm_len = block_nb << 6; memset(ctx->block + ctx->len, 0, pm_len - ctx->len); ctx->block[ctx->len] = 0x80; UNPACK32(len_b, ctx->block + pm_len - 4); sha256_transf(ctx, ctx->block, block_nb); #ifndef UNROLL_LOOPS for (i = 0 ; i < 8; i++) { UNPACK32(ctx->h[i], &digest[i << 2]); } #else UNPACK32(ctx->h[0], &digest[ 0]); UNPACK32(ctx->h[1], &digest[ 4]); UNPACK32(ctx->h[2], &digest[ 8]); UNPACK32(ctx->h[3], &digest[12]); UNPACK32(ctx->h[4], &digest[16]); UNPACK32(ctx->h[5], &digest[20]); UNPACK32(ctx->h[6], &digest[24]); UNPACK32(ctx->h[7], &digest[28]); #endif /* !UNROLL_LOOPS */ } /* SHA-512 functions */ void sha512_transf(sha512_ctx *ctx, const unsigned char *message, unsigned int block_nb) { uint64 w[80]; uint64 wv[8]; uint64 t1, t2; const unsigned char *sub_block; int i, j; for (i = 0; i < (int) block_nb; i++) { sub_block = message + (i << 7); #ifndef UNROLL_LOOPS for (j = 0; j < 16; j++) { PACK64(&sub_block[j << 3], &w[j]); } for (j = 16; j < 80; j++) { SHA512_SCR(j); } for (j = 0; j < 8; j++) { wv[j] = ctx->h[j]; } for (j = 0; j < 80; j++) { t1 = wv[7] + SHA512_F2(wv[4]) + CH(wv[4], wv[5], wv[6]) + sha512_k[j] + w[j]; t2 = SHA512_F1(wv[0]) + MAJ(wv[0], wv[1], wv[2]); wv[7] = wv[6]; wv[6] = wv[5]; wv[5] = wv[4]; wv[4] = wv[3] + t1; wv[3] = wv[2]; wv[2] = wv[1]; wv[1] = wv[0]; wv[0] = t1 + t2; } for (j = 0; j < 8; j++) { ctx->h[j] += wv[j]; } #else PACK64(&sub_block[ 0], &w[ 0]); PACK64(&sub_block[ 8], &w[ 1]); PACK64(&sub_block[ 16], &w[ 2]); PACK64(&sub_block[ 24], &w[ 3]); PACK64(&sub_block[ 32], &w[ 4]); PACK64(&sub_block[ 40], &w[ 5]); PACK64(&sub_block[ 48], &w[ 6]); PACK64(&sub_block[ 56], &w[ 7]); PACK64(&sub_block[ 64], &w[ 8]); PACK64(&sub_block[ 72], &w[ 9]); PACK64(&sub_block[ 80], &w[10]); PACK64(&sub_block[ 88], &w[11]); PACK64(&sub_block[ 96], &w[12]); PACK64(&sub_block[104], &w[13]); PACK64(&sub_block[112], &w[14]); PACK64(&sub_block[120], &w[15]); SHA512_SCR(16); SHA512_SCR(17); SHA512_SCR(18); SHA512_SCR(19); SHA512_SCR(20); SHA512_SCR(21); SHA512_SCR(22); SHA512_SCR(23); SHA512_SCR(24); SHA512_SCR(25); SHA512_SCR(26); SHA512_SCR(27); SHA512_SCR(28); SHA512_SCR(29); SHA512_SCR(30); SHA512_SCR(31); SHA512_SCR(32); SHA512_SCR(33); SHA512_SCR(34); SHA512_SCR(35); SHA512_SCR(36); SHA512_SCR(37); SHA512_SCR(38); SHA512_SCR(39); SHA512_SCR(40); SHA512_SCR(41); SHA512_SCR(42); SHA512_SCR(43); SHA512_SCR(44); SHA512_SCR(45); SHA512_SCR(46); SHA512_SCR(47); SHA512_SCR(48); SHA512_SCR(49); SHA512_SCR(50); SHA512_SCR(51); SHA512_SCR(52); SHA512_SCR(53); SHA512_SCR(54); SHA512_SCR(55); SHA512_SCR(56); SHA512_SCR(57); SHA512_SCR(58); SHA512_SCR(59); SHA512_SCR(60); SHA512_SCR(61); SHA512_SCR(62); SHA512_SCR(63); SHA512_SCR(64); SHA512_SCR(65); SHA512_SCR(66); SHA512_SCR(67); SHA512_SCR(68); SHA512_SCR(69); SHA512_SCR(70); SHA512_SCR(71); SHA512_SCR(72); SHA512_SCR(73); SHA512_SCR(74); SHA512_SCR(75); SHA512_SCR(76); SHA512_SCR(77); SHA512_SCR(78); SHA512_SCR(79); wv[0] = ctx->h[0]; wv[1] = ctx->h[1]; wv[2] = ctx->h[2]; wv[3] = ctx->h[3]; wv[4] = ctx->h[4]; wv[5] = ctx->h[5]; wv[6] = ctx->h[6]; wv[7] = ctx->h[7]; j = 0; do { SHA512_EXP(0,1,2,3,4,5,6,7,j); j++; SHA512_EXP(7,0,1,2,3,4,5,6,j); j++; SHA512_EXP(6,7,0,1,2,3,4,5,j); j++; SHA512_EXP(5,6,7,0,1,2,3,4,j); j++; SHA512_EXP(4,5,6,7,0,1,2,3,j); j++; SHA512_EXP(3,4,5,6,7,0,1,2,j); j++; SHA512_EXP(2,3,4,5,6,7,0,1,j); j++; SHA512_EXP(1,2,3,4,5,6,7,0,j); j++; } while (j < 80); ctx->h[0] += wv[0]; ctx->h[1] += wv[1]; ctx->h[2] += wv[2]; ctx->h[3] += wv[3]; ctx->h[4] += wv[4]; ctx->h[5] += wv[5]; ctx->h[6] += wv[6]; ctx->h[7] += wv[7]; #endif /* !UNROLL_LOOPS */ } } void sha512(const unsigned char *message, unsigned int len, unsigned char *digest) { sha512_ctx ctx; sha512_init(&ctx); sha512_update(&ctx, message, len); sha512_final(&ctx, digest); } void sha512_init(sha512_ctx *ctx) { #ifndef UNROLL_LOOPS int i; for (i = 0; i < 8; i++) { ctx->h[i] = sha512_h0[i]; } #else ctx->h[0] = sha512_h0[0]; ctx->h[1] = sha512_h0[1]; ctx->h[2] = sha512_h0[2]; ctx->h[3] = sha512_h0[3]; ctx->h[4] = sha512_h0[4]; ctx->h[5] = sha512_h0[5]; ctx->h[6] = sha512_h0[6]; ctx->h[7] = sha512_h0[7]; #endif /* !UNROLL_LOOPS */ ctx->len = 0; ctx->tot_len = 0; } void sha512_update(sha512_ctx *ctx, const unsigned char *message, unsigned int len) { unsigned int block_nb; unsigned int new_len, rem_len, tmp_len; const unsigned char *shifted_message; tmp_len = SHA512_BLOCK_SIZE - ctx->len; rem_len = len < tmp_len ? len : tmp_len; memcpy(&ctx->block[ctx->len], message, rem_len); if (ctx->len + len < SHA512_BLOCK_SIZE) { ctx->len += len; return; } new_len = len - rem_len; block_nb = new_len / SHA512_BLOCK_SIZE; shifted_message = message + rem_len; sha512_transf(ctx, ctx->block, 1); sha512_transf(ctx, shifted_message, block_nb); rem_len = new_len % SHA512_BLOCK_SIZE; memcpy(ctx->block, &shifted_message[block_nb << 7], rem_len); ctx->len = rem_len; ctx->tot_len += (block_nb + 1) << 7; } void sha512_final(sha512_ctx *ctx, unsigned char *digest) { unsigned int block_nb; unsigned int pm_len; unsigned int len_b; #ifndef UNROLL_LOOPS int i; #endif block_nb = 1 + ((SHA512_BLOCK_SIZE - 17) < (ctx->len % SHA512_BLOCK_SIZE)); len_b = (ctx->tot_len + ctx->len) << 3; pm_len = block_nb << 7; memset(ctx->block + ctx->len, 0, pm_len - ctx->len); ctx->block[ctx->len] = 0x80; UNPACK32(len_b, ctx->block + pm_len - 4); sha512_transf(ctx, ctx->block, block_nb); #ifndef UNROLL_LOOPS for (i = 0 ; i < 8; i++) { UNPACK64(ctx->h[i], &digest[i << 3]); } #else UNPACK64(ctx->h[0], &digest[ 0]); UNPACK64(ctx->h[1], &digest[ 8]); UNPACK64(ctx->h[2], &digest[16]); UNPACK64(ctx->h[3], &digest[24]); UNPACK64(ctx->h[4], &digest[32]); UNPACK64(ctx->h[5], &digest[40]); UNPACK64(ctx->h[6], &digest[48]); UNPACK64(ctx->h[7], &digest[56]); #endif /* !UNROLL_LOOPS */ } /* SHA-384 functions */ void sha384(const unsigned char *message, unsigned int len, unsigned char *digest) { sha384_ctx ctx; sha384_init(&ctx); sha384_update(&ctx, message, len); sha384_final(&ctx, digest); } void sha384_init(sha384_ctx *ctx) { #ifndef UNROLL_LOOPS int i; for (i = 0; i < 8; i++) { ctx->h[i] = sha384_h0[i]; } #else ctx->h[0] = sha384_h0[0]; ctx->h[1] = sha384_h0[1]; ctx->h[2] = sha384_h0[2]; ctx->h[3] = sha384_h0[3]; ctx->h[4] = sha384_h0[4]; ctx->h[5] = sha384_h0[5]; ctx->h[6] = sha384_h0[6]; ctx->h[7] = sha384_h0[7]; #endif /* !UNROLL_LOOPS */ ctx->len = 0; ctx->tot_len = 0; } void sha384_update(sha384_ctx *ctx, const unsigned char *message, unsigned int len) { unsigned int block_nb; unsigned int new_len, rem_len, tmp_len; const unsigned char *shifted_message; tmp_len = SHA384_BLOCK_SIZE - ctx->len; rem_len = len < tmp_len ? len : tmp_len; memcpy(&ctx->block[ctx->len], message, rem_len); if (ctx->len + len < SHA384_BLOCK_SIZE) { ctx->len += len; return; } new_len = len - rem_len; block_nb = new_len / SHA384_BLOCK_SIZE; shifted_message = message + rem_len; sha512_transf(ctx, ctx->block, 1); sha512_transf(ctx, shifted_message, block_nb); rem_len = new_len % SHA384_BLOCK_SIZE; memcpy(ctx->block, &shifted_message[block_nb << 7], rem_len); ctx->len = rem_len; ctx->tot_len += (block_nb + 1) << 7; } void sha384_final(sha384_ctx *ctx, unsigned char *digest) { unsigned int block_nb; unsigned int pm_len; unsigned int len_b; #ifndef UNROLL_LOOPS int i; #endif block_nb = (1 + ((SHA384_BLOCK_SIZE - 17) < (ctx->len % SHA384_BLOCK_SIZE))); len_b = (ctx->tot_len + ctx->len) << 3; pm_len = block_nb << 7; memset(ctx->block + ctx->len, 0, pm_len - ctx->len); ctx->block[ctx->len] = 0x80; UNPACK32(len_b, ctx->block + pm_len - 4); sha512_transf(ctx, ctx->block, block_nb); #ifndef UNROLL_LOOPS for (i = 0 ; i < 6; i++) { UNPACK64(ctx->h[i], &digest[i << 3]); } #else UNPACK64(ctx->h[0], &digest[ 0]); UNPACK64(ctx->h[1], &digest[ 8]); UNPACK64(ctx->h[2], &digest[16]); UNPACK64(ctx->h[3], &digest[24]); UNPACK64(ctx->h[4], &digest[32]); UNPACK64(ctx->h[5], &digest[40]); #endif /* !UNROLL_LOOPS */ } /* SHA-224 functions */ void sha224(const unsigned char *message, unsigned int len, unsigned char *digest) { sha224_ctx ctx; sha224_init(&ctx); sha224_update(&ctx, message, len); sha224_final(&ctx, digest); } void sha224_init(sha224_ctx *ctx) { #ifndef UNROLL_LOOPS int i; for (i = 0; i < 8; i++) { ctx->h[i] = sha224_h0[i]; } #else ctx->h[0] = sha224_h0[0]; ctx->h[1] = sha224_h0[1]; ctx->h[2] = sha224_h0[2]; ctx->h[3] = sha224_h0[3]; ctx->h[4] = sha224_h0[4]; ctx->h[5] = sha224_h0[5]; ctx->h[6] = sha224_h0[6]; ctx->h[7] = sha224_h0[7]; #endif /* !UNROLL_LOOPS */ ctx->len = 0; ctx->tot_len = 0; } void sha224_update(sha224_ctx *ctx, const unsigned char *message, unsigned int len) { unsigned int block_nb; unsigned int new_len, rem_len, tmp_len; const unsigned char *shifted_message; tmp_len = SHA224_BLOCK_SIZE - ctx->len; rem_len = len < tmp_len ? len : tmp_len; memcpy(&ctx->block[ctx->len], message, rem_len); if (ctx->len + len < SHA224_BLOCK_SIZE) { ctx->len += len; return; } new_len = len - rem_len; block_nb = new_len / SHA224_BLOCK_SIZE; shifted_message = message + rem_len; sha256_transf(ctx, ctx->block, 1); sha256_transf(ctx, shifted_message, block_nb); rem_len = new_len % SHA224_BLOCK_SIZE; memcpy(ctx->block, &shifted_message[block_nb << 6], rem_len); ctx->len = rem_len; ctx->tot_len += (block_nb + 1) << 6; } void sha224_final(sha224_ctx *ctx, unsigned char *digest) { unsigned int block_nb; unsigned int pm_len; unsigned int len_b; #ifndef UNROLL_LOOPS int i; #endif block_nb = (1 + ((SHA224_BLOCK_SIZE - 9) < (ctx->len % SHA224_BLOCK_SIZE))); len_b = (ctx->tot_len + ctx->len) << 3; pm_len = block_nb << 6; memset(ctx->block + ctx->len, 0, pm_len - ctx->len); ctx->block[ctx->len] = 0x80; UNPACK32(len_b, ctx->block + pm_len - 4); sha256_transf(ctx, ctx->block, block_nb); #ifndef UNROLL_LOOPS for (i = 0 ; i < 7; i++) { UNPACK32(ctx->h[i], &digest[i << 2]); } #else UNPACK32(ctx->h[0], &digest[ 0]); UNPACK32(ctx->h[1], &digest[ 4]); UNPACK32(ctx->h[2], &digest[ 8]); UNPACK32(ctx->h[3], &digest[12]); UNPACK32(ctx->h[4], &digest[16]); UNPACK32(ctx->h[5], &digest[20]); UNPACK32(ctx->h[6], &digest[24]); #endif /* !UNROLL_LOOPS */ } #ifdef TEST_VECTORS /* FIPS 180-2 Validation tests */ #include #include void test(const char *vector, unsigned char *digest, unsigned int digest_size) { char output[2 * SHA512_DIGEST_SIZE + 1]; int i; output[2 * digest_size] = '\0'; for (i = 0; i < (int) digest_size ; i++) { sprintf(output + 2 * i, "%02x", digest[i]); } printf("H: %s\n", output); if (strcmp(vector, output)) { fprintf(stderr, "Test failed.\n"); exit(EXIT_FAILURE); } } int main(void) { static const char *vectors[4][3] = { /* SHA-224 */ { "23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7", "75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525", "20794655980c91d8bbb4c1ea97618a4bf03f42581948b2ee4ee7ad67", }, /* SHA-256 */ { "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad", "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1", "cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0", }, /* SHA-384 */ { "cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed" "8086072ba1e7cc2358baeca134c825a7", "09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712" "fcc7c71a557e2db966c3e9fa91746039", "9d0e1809716474cb086e834e310a4a1ced149e9c00f248527972cec5704c2a5b" "07b8b3dc38ecc4ebae97ddd87f3d8985", }, /* SHA-512 */ { "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a" "2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f", "8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018" "501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909", "e718483d0ce769644e2e42c7bc15b4638e1f98b13b2044285632a803afa973eb" "de0ff244877ea60a4cb0432ce577c31beb009c5c2c49aa2e4eadb217ad8cc09b" } }; static const char message1[] = "abc"; static const char message2a[] = "abcdbcdecdefdefgefghfghighijhi" "jkijkljklmklmnlmnomnopnopq"; static const char message2b[] = "abcdefghbcdefghicdefghijdefghijkefghij" "klfghijklmghijklmnhijklmnoijklmnopjklm" "nopqklmnopqrlmnopqrsmnopqrstnopqrstu"; unsigned char *message3; unsigned int message3_len = 1000000; unsigned char digest[SHA512_DIGEST_SIZE]; message3 = malloc(message3_len); if (message3 == NULL) { fprintf(stderr, "Can't allocate memory\n"); return -1; } memset(message3, 'a', message3_len); printf("SHA-2 FIPS 180-2 Validation tests\n\n"); printf("SHA-224 Test vectors\n"); sha224((const unsigned char *) message1, strlen(message1), digest); test(vectors[0][0], digest, SHA224_DIGEST_SIZE); sha224((const unsigned char *) message2a, strlen(message2a), digest); test(vectors[0][1], digest, SHA224_DIGEST_SIZE); sha224(message3, message3_len, digest); test(vectors[0][2], digest, SHA224_DIGEST_SIZE); printf("\n"); printf("SHA-256 Test vectors\n"); sha256((const unsigned char *) message1, strlen(message1), digest); test(vectors[1][0], digest, SHA256_DIGEST_SIZE); sha256((const unsigned char *) message2a, strlen(message2a), digest); test(vectors[1][1], digest, SHA256_DIGEST_SIZE); sha256(message3, message3_len, digest); test(vectors[1][2], digest, SHA256_DIGEST_SIZE); printf("\n"); printf("SHA-384 Test vectors\n"); sha384((const unsigned char *) message1, strlen(message1), digest); test(vectors[2][0], digest, SHA384_DIGEST_SIZE); sha384((const unsigned char *)message2b, strlen(message2b), digest); test(vectors[2][1], digest, SHA384_DIGEST_SIZE); sha384(message3, message3_len, digest); test(vectors[2][2], digest, SHA384_DIGEST_SIZE); printf("\n"); printf("SHA-512 Test vectors\n"); sha512((const unsigned char *) message1, strlen(message1), digest); test(vectors[3][0], digest, SHA512_DIGEST_SIZE); sha512((const unsigned char *) message2b, strlen(message2b), digest); test(vectors[3][1], digest, SHA512_DIGEST_SIZE); sha512(message3, message3_len, digest); test(vectors[3][2], digest, SHA512_DIGEST_SIZE); printf("\n"); printf("All tests passed.\n"); return 0; } #endif /* TEST_VECTORS */ /* Added for Xymon - not part of the original file */ int mySHA224_Size(void) { return sizeof(sha224_ctx); } void mySHA224_Init(void *c) { sha224_init((sha224_ctx *)c); } void mySHA224_Update(void *c, unsigned char *in, int len) {sha224_update((sha224_ctx *)c, in, len); } void mySHA224_Final(char md[20], void *c) { sha224_final((sha224_ctx *)c, md); } int mySHA256_Size(void) { return sizeof(sha256_ctx); } void mySHA256_Init(void *c) { sha256_init((sha256_ctx *)c); } void mySHA256_Update(void *c, unsigned char *in, int len) {sha256_update((sha256_ctx *)c, in, len); } void mySHA256_Final(char md[20], void *c) { sha256_final((sha256_ctx *)c, md); } int mySHA384_Size(void) { return sizeof(sha384_ctx); } void mySHA384_Init(void *c) { sha384_init((sha384_ctx *)c); } void mySHA384_Update(void *c, unsigned char *in, int len) {sha384_update((sha384_ctx *)c, in, len); } void mySHA384_Final(char md[20], void *c) { sha384_final((sha384_ctx *)c, md); } int mySHA512_Size(void) { return sizeof(sha512_ctx); } void mySHA512_Init(void *c) { sha512_init((sha512_ctx *)c); } void mySHA512_Update(void *c, unsigned char *in, int len) {sha512_update((sha512_ctx *)c, in, len); } void mySHA512_Final(char md[20], void *c) { sha512_final((sha512_ctx *)c, md); } /* end of xymon adds */ xymon-4.3.28/lib/files.c0000664000076400007640000000444512603243142015232 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* This is a library module, part of libxymon. */ /* It contains routines for file- and directory manipulation. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: files.c 7678 2015-10-01 14:42:42Z jccleaver $"; #include #include #include #include #include #include #include #include #include "libxymon.h" void dropdirectory(char *dirfn, int background) { DIR *dirfd; struct dirent *de; char fn[PATH_MAX]; struct stat st; pid_t childpid = 0; if (background) { /* Caller wants us to run as a background task. */ childpid = fork(); } MEMDEFINE(fn); if (childpid == 0) { dbgprintf("Starting to remove directory %s\n", dirfn); dirfd = opendir(dirfn); if (dirfd) { while ( (de = readdir(dirfd)) != NULL ) { sprintf(fn, "%s/%s", dirfn, de->d_name); if (strcmp(de->d_name, ".") && strcmp(de->d_name, "..") && (stat(fn, &st) == 0)) { if (S_ISREG(st.st_mode)) { dbgprintf("Removing file %s\n", fn); unlink(fn); } else if (S_ISDIR(st.st_mode)) { dbgprintf("Recurse into %s\n", fn); dropdirectory(fn, 0); /* Don't background the recursive calls! */ } } } closedir(dirfd); } dbgprintf("Removing directory %s\n", dirfn); rmdir(dirfn); if (background) { /* Background task just exits */ exit(0); } } else if (childpid < 0) { errprintf("Could not fork child to remove directory %s\n", dirfn); } MEMUNDEFINE(fn); } xymon-4.3.28/lib/acknowledgementslog.h0000664000076400007640000000206612503132277020173 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __ACKNOWLEDGEMENTSLOG_H_ #define __ACKNOWLEDGEMENTSLOG_H_ extern void do_acknowledgementslog(FILE *output, int maxcount, int maxminutes, char *fromtime, char *totime, char *pagematch, char *expagematch, char *hostmatch, char *exhostmatch, char *testmatch, char *extestmatch, char *rcptmatch, char *exrcptmatch); #endif xymon-4.3.28/web/0000775000076400007640000000000013037531514013771 5ustar rpmbuildrpmbuildxymon-4.3.28/web/eventlog.cgi.10000664000076400007640000000137713037531445016452 0ustar rpmbuildrpmbuild.TH EVENTLOG.CGI 1 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME eventlog.cgi \- CGI program to report the Xymon eventlog .SH SYNOPSIS .B "eventlog.cgi" .SH DESCRIPTION \fBeventlog.cgi\fR is invoked as a CGI script via the eventlog.sh CGI wrapper. Based on the parameters it receives, it generates the Xymon event log for a period. This log shows all status changes that have occurred for all hosts and services. eventlog.cgi is passed a QUERY_STRING environment variable with the following parameters: MAXTIME (maximum minutes to go back in the log) MAXCOUNT (maximum number of events to report) .SH OPTIONS .IP "--env=FILENAME" Loads the environment defined in FILENAME before executing the CGI script. .SH "SEE ALSO" hosts.cfg(5), xymonserver.cfg(5) xymon-4.3.28/web/svcstatus.cgi.10000664000076400007640000000751213037531445016663 0ustar rpmbuildrpmbuild.TH SVCSTATUS.CGI 1 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME svcstatus.cgi \- CGI program to view Xymon status logs .SH SYNOPSIS .B "svcstatus.cgi [\-\-historical] [\-\-history={top|bottom}]" .SH DESCRIPTION \fBsvcstatus.cgi\fR is a CGI program to present a Xymon status log in HTML form (ie, as a web page). It can be used both for the logs showing the current status, and for historical logs from the "histlogs" directory. It is normally invoked as a CGI program, and therefore receives most of the input parameters via the CGI QUERY_STRING environment variable. Unless the "\-\-historical" option is present, the current status log is used. This assumes a QUERY_STRING environment variable of the form .br HOSTSVC=hostname.servicename .br where "hostname" is the name of the host with commas instead of dots, and "servicename" is the name of the service (the column name in Xymon). Such links are automatically generated by the .I xymongen(1) tool when the environment contains "XYMONLOGSTATUS=dynamic". With the "\-\-historical" option present, a historical logfile is used. This assumes a QUERY_STRING environment variable of the form .br HOST=hostname&SERVICE=servicename&TIMEBUF=timestamp .br where "hostname" is the name of the host with commas instead of dots, "servicename" is the name of the service, and "timestamp" is the time of the log. This is automatically generated by the .I history.cgi(1) tool. .SH OPTIONS .IP "\-\-historical" Use a historical logfile instead of the current logfile. .IP "\-\-history={top|bottom|none}" When showing the current logfile, provide a "HISTORY" button at the top or the bottom of the webpage, or not at all. The default is to put the HISTORY button at the bottom of the page. .IP "\-\-env=FILENAME" Load the environment from FILENAME before executing the CGI. .IP "\-\-templates=DIRECTORY" Where to look for the HTML header- and footer-templates used when generating the webpages. Default: $XYMONHOME/web/ .IP "\-\-no\-svcid" Do not include the HTML tags to identify the hostname/service on the generated web page. Useful is this already happens in the hostsvc_header template file, for instance. .IP "\-\-multigraphs=TEST1[,TEST2]" This causes svcstatus.cgi to generate links to service graphs that are split up into multiple images, with at most 5 graphs per image. This option only works in Xymon mode. If not specified, only the "disk" status is split up this way. .IP "\-\-no\-disable" By default, the info-column page includes a form allowing users to disable and re-enable tests. If your setup uses the default separation of administration tools into a separate, password- protected area, then use of the disable- and enable-functions requires access to the administration tools. If you prefer to do this only via the dedicated administration page, this option will remove the disable-function from the info page. .IP "\-\-no\-jsvalidation" The disable-function on the info-column page by default uses JavaScript to validate the form before submitting the input to the Xymon server. However, some browsers cannot handle the Javascript code correctly so the form does not work. This option disables the use of Javascript for form-validation, allowing these browsers to use the disable-function. .IP "\-\-nkconfig=FILENAME" Use FILENAME as the configuration file for the Critical Systems information. The default is to load this from $XYMONHOME/etc/critical.cfg .SH FILES .IP "$XYMONHOME/web/hostsvc_header" HTML template header .IP "$XYMONHOME/web/hostsvc_footer" HTML template footer .SH ENVIRONMENT .IP "NONHISTS=info,trends,graphs" A comma-separated list of services that does not have meaningful history, e.g. the "info" and "trends" columns. Services listed here do not get a "History" button. .IP "TEST2RRD=test,test" A comma-separated list of the tests that have an RRD graph. .SH "SEE ALSO" xymon(7), xymond(1) xymon-4.3.28/web/datepage.cgi.10000664000076400007640000000532413037531445016375 0ustar rpmbuildrpmbuild.TH DATEPAGE.CGI 1 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME datepage.cgi \- Xymon CGI script to view pre-built reports by date .SH SYNOPSIS .B "datepage.cgi?type={day,week,month} \-\-url=URLPREFIX [options] .SH DESCRIPTION \fBdatepage.cgi\fR is invoked as a CGI script via the datepage.sh CGI wrapper. datepage.cgi is passed a QUERY_STRING environment variable with the type of time-selection that is desired: Either "day", "week" or "month" can be requested. It will then generate a web form with appropriate day/week/month selection boxes, and based on the users' selection a resulting url is built from the URLPREFIX and the time selection. The browser is then redirected to this URL. The URL is constructed from the URLPREFIX, the type-parameter, the value of the "pagepath" or "host" cookie, and the users' selection as follows: .IP type=day The final URL is \fBURLPREFIX/daily/YEAR/MONTH/DAY/PAGEPATH\fR. .IP type=week The final URL is \fBURLPREFIX/weekly/YEAR/WEEK/PAGEPATH\fR. .IP type=month The final URL is \fBURLPREFIX/monthly/YEAR/MONTH/PAGEPATH\fR. YEAR is the full year (4 digits, including century). MONTH is the two-digit number of the month (01..12). DAY is the number of the day in the month (01..31). WEEK is the ISO 8601:1988 week-number (01..53). PAGEPATH is the current value of the "pagepath" cookie if set; if it is not set but the "host" cookie is set, then this host is looked up in the hosts.cfg file and the page where this host is found is used for PAGEPATH. These two cookies are set by the default web-header templates supplied with Xymon. .SH OPTIONS .IP "\-\-url=URLPREFIX" This specifies the initial part of the final URL. This option is required. .IP "\-\-hffile=FILENAME" Specifies the template files (from $XYMONHOME/web/) to use. The default is "\-\-hffile=report". .IP "\-\-color=COLOR" Sets the background color of the generated webpage. The default is blue. .IP "\-\-env=FILENAME" Loads the environment defined in FILENAME before executing the CGI script. .IP "\-\-debug" Enables debugging output. .IP "$XYMONHOME/web/report_form_daily" HTML form template for the date selection form when type=daily. .IP "$XYMONHOME/web/report_form_weekly" HTML form template for the date selection form when type=weekly. .IP "$XYMONHOME/web/report_form_monthly" HTML form template for the date selection form when type=monthly. .IP "$XYMONHOME/web/report_header" HTML header file for the generated web page .IP "$XYMONHOME/web/report_footer" HTML footer file for the generated web page .SH "ENVIRONMENT VARIABLES" .IP XYMONHOME Used to locate the template files for the generated web pages. .IP QUERY_STRING Contains the parameters for the CGI script. .SH "SEE ALSO" xymongen(1), hosts.cfg(5), xymonserver.cfg(5) xymon-4.3.28/web/csvinfo.c0000664000076400007640000001235112603243142015601 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon general CSV info viewer. */ /* */ /* This is a CGI script for a generic presentation of information stored in */ /* a comma-separated file (CSV), e.g. via an export from a spreadsheet or DB. */ /* It is also used for the Xymon column-name links, to provide information */ /* about what each column header means and what kind of test is run. */ /* */ /* Copyright (C) 2003-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: csvinfo.c 7678 2015-10-01 14:42:42Z jccleaver $"; #include #include #include #include #include #include #include "libxymon.h" #define MAXCOLUMNS 80 char *srcdb = "hostinfo.csv"; char *wantedname = ""; int keycolumn = 0; char delimiter = ';'; cgidata_t *cgidata = NULL; void errormsg(char *msg) { printf("Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); printf("Invalid request\n"); printf("%s\n", msg); exit(1); } void parse_query(void) { cgidata_t *cwalk; cwalk = cgidata; while (cwalk) { /* * cwalk->name points to the name of the setting. * cwalk->value points to the value (may be an empty string). */ if (strcasecmp(cwalk->name, "key") == 0) { wantedname = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "db") == 0) { char *val, *p; /* Don't allow any slashes in the db-name */ val = cwalk->value; p = strrchr(val, '/'); if (p) val = (p+1); srcdb = strdup(val); } else if (strcasecmp(cwalk->name, "column") == 0) { keycolumn = atoi(cwalk->value); } else if (strcasecmp(cwalk->name, "delimiter") == 0) { delimiter = *(cwalk->value); } cwalk = cwalk->next; } } int main(int argc, char *argv[]) { FILE *db; char dbfn[PATH_MAX]; strbuffer_t *inbuf; char *hffile = "info"; int bgcolor = COL_BLUE; char *envarea = NULL; char *headers[MAXCOLUMNS]; char *items[MAXCOLUMNS]; int i, found; int argi; for (argi=1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } else if (strcmp(argv[argi], "--debug") == 0) { debug = 1; } else if (argnmatch(argv[argi], "--hffile=")) { char *p = strchr(argv[argi], '='); hffile = strdup(p+1); } else if (argnmatch(argv[argi], "--color=")) { char *p = strchr(argv[argi], '='); bgcolor = parse_color(p+1); } } redirect_cgilog("csvinfo"); cgidata = cgi_request(); parse_query(); if (strlen(wantedname) == 0) { errormsg("Invalid request"); return 1; } sprintf(dbfn, "%s/etc/%s", xgetenv("XYMONHOME"), srcdb); db = fopen(dbfn, "r"); if (db == NULL) { char msg[PATH_MAX]; sprintf(msg, "Cannot open sourcedb %s\n", dbfn); errormsg(msg); return 1; } /* First, load the headers from line 1 of the sourcedb */ memset(headers, 0, sizeof(headers)); initfgets(db); inbuf = newstrbuffer(0); if (unlimfgets(inbuf, db)) { char *p1, *p2; for (i=0, p1=STRBUF(inbuf), p2=strchr(STRBUF(inbuf), delimiter); (p1 && p2 && strlen(p1)); i++,p1=p2+1,p2=strchr(p1, delimiter)) { *p2 = '\0'; headers[i] = strdup(p1); } } /* * Pre-allocate the buffer space for the items - we weill be stuffing data * into these while scanning for the right item. */ for (i=0; i\n"); for (i=0; (headers[i]); i++) { printf("\n"); printf(" %s%s\n", headers[i], items[i]); printf("\n"); } printf("\n"); headfoot(stdout, hffile, "", "footer", bgcolor); return 0; } xymon-4.3.28/web/showgraph.cgi.10000664000076400007640000000556513037531445016634 0ustar rpmbuildrpmbuild.TH SHOWGRAPH.CGI 1 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME showgraph.cgi \- CGI to generate Xymon trend graphs .SH SYNOPSIS .B "showgraph [options]" .SH DESCRIPTION \fBshowgraph.cgi\fR is invoked as a CGI script via the showgraph.sh CGI wrapper. showgraph.cgi is passed a QUERY_STRING environment variable with the following parameters: .sp .BR host Name of the host to generate a graph for .sp .BR service Name of the service to generate a graph for .sp .BR disp Display-name of the host, used on the generated graphs instead of hostname. .sp .BR graph Can be "hourly", "daily", "weekly" or "monthly" to select the time period that the graph covers. .sp .BR first Used to split multi-graphs into multiple graphs. This causes showgraph.cgi to generate only the graphs starting with the "first'th" graph and continuing for "count". .sp .BR count Number of graphs in a multi-graph. .sp .BR upper Set the upper limit of the graph. See .I rrdgraph(1) for a description of the "\-u" option. .sp .BR lower Set the lower limit of the graph. See .I rrdgraph(1) for a description of the "\-l" option. .sp .BR graph_start Set the starttime of the graph. This is used in zoom-mode. .sp .BR graph_end Set the end-time of the graph. This is used in zoom-mode. .sp .BR action=menu Generate an HTML page with links to 4 graphs, representing the hourly, weekly, monthly and yearly graphs. Doesn't actually generate any graphs, only the HTML that links to the graphs. .sp .BR action=selzoom Generate an HTML page with link to single graph, and with JavaScript code that lets the user select part of the graph for a zoom-operation. The JavaScript invokes showgraph.cgi with "action=showzoom" to generate the zoomed graph webpage. .sp .BR action=showzoom Generate HTML with a link to the zoomed graph image. This link goes to an "action=view" invocation of showgraph.cgi. .sp .BR action=view Generate a single graph image. .SH OPTIONS .IP "\-\-config=FILENAME" Loads the graph configuration file from FILENAME. If not specified, the file $XYMONHOME/etc/graphs.cfg is used. See the .I graphs.cfg(5) for details about this file. .IP "\-\-env=FILENAME" Loads the environment settings defined in FILENAME before executing the CGI. .IP "\-\-rrddir=DIRECTORY" The top-level directory for the RRD files. If not specified, the directory given by the XYMONRRDS environment is used. .IP "\-\-save=FILENAME" Instead of returning the image via the CGI interface (i.e. on stdout), save the generated image to FILENAME. .IP "\-\-debug" Enable debugging output. .SH ENVIRONMENT .sp .BR QUERY_STRING Provided by the webserver CGI interface, this decides what graph to generate. .sp .BR RRDGRAPHOPTS RRD-specific options for the graph. This is usually set in the .I xymonserver.cfg(5) file. .SH FILES .sp .BR graphs.cfg: The configuration file determining how graphs are generated from RRD files. .SH "SEE ALSO" graphs.cfg(5), xymon(7), rrdtool(1) xymon-4.3.28/web/statusreport.cgi.10000664000076400007640000000572613037531445017410 0ustar rpmbuildrpmbuild.TH STATUSREPORT.CGI 1 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME statusreport.cgi \- CGI program to report a status for a group of servers .SH SYNOPSIS .B "statusreport.cgi \-\-column=COLUMNNAME [options]" .SH DESCRIPTION \fBstatusreport.cgi\fR is a CGI tool to generate a simple HTML report showing the current status of a single column for a group of Xymon hosts. E.g. You can use this report to get an overview of all of the SSL certificates that are about to expire. The generated webpage is a simple HTML table, suitable for copying into other documents or e-mail. statusreport.cgi runs as a CGI program, invoked by your webserver. It is normally run via a wrapper shell-script in the CGI directory for Xymon. .SH EXAMPLES The Xymon installation includes two web report scripts using this CGI tool: The \fBcertreport.sh\fR script generates a list of SSL server certificates that are yellow or red (i.e. they will expire soon); and the \fBnongreen.sh\fR script generates a report of all statuses that are currently non-green. These can be accessed from a web browser through a URL referencing the script in the Xymon CGI directory (e.g. "/xymon\-cgi/xymon\-nongreen.sh"). .SH OPTIONS .IP "\-\-column=COLUMNNAME" Report the status of the COLUMNNAME column. .IP "\-\-all" Report the status for all hosts known to Xymon. By default, this tool reports only on the hosts found on the current page from where the CGI was invoked (by looking at the "pagepath" cookie). .IP "\-\-filter=CRITERIA" Only report on statuses that match the CRITERIA setting. See the .I xymon(1) man-page - in the "xymondboard" command description - for details about specifying filters. .IP "\-\-heading=HTML" Defines the webpage heading - i.e. the "title" tag in the generated HTML code. .IP "\-\-show\-column" Include the column name in the display. .IP "\-\-show\-colors" Show the status color on the generated webpage. The default is to not show the status color. .IP "\-\-no\-colors" Do not include text showing the current color of each status in the report. This is the default. .IP "\-\-show\-summary" Show only a summary of the important lines in the status message. By default, the entire status message appears in the generated HTML code. This option causes the first non-blank line of the status message to be shown, and also any lines beginning with "&COLOR" which is used by many status messages to point out lines of interest (non-green lines only, though). .IP "\-\-show\-message" Show the entire message on the webpage. This is the default. .IP "\-\-link" Include HTML links to the host "info" page, and the status page. .IP "\-\-embedded" Only generate the HTML table, not a full webpage. This can be used to embed the status report into an external webpage. .IP "\-\-env=FILENAME" Load the environment from FILENAME before executing the CGI. .IP "\-\-area=NAME" Load environment variables for a specific area. NB: if used, this option must appear before any \-\-env=FILENAME option. .SH "SEE ALSO" xymon(7) xymon-4.3.28/web/appfeed.cgi.10000664000076400007640000000403613037531445016226 0ustar rpmbuildrpmbuild.TH APPFEED.CGI 1 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME appfeed.cgi \- Xymon CGI feeder for Smartphone apps .SH SYNOPSIS .B "appfeed.cgi [options]" .SH DESCRIPTION \fBappfeed.cgi\fR is invoked as a CGI script via the appfeed.sh CGI wrapper. appfeed.cgi is optionally passed a QUERY_STRING environment variable with the "filter=FILTER" parameter. FILTER is a filter for the "xymondboard" command sent to .I xymond(8) daemon. These filters are described in detail in the .I xymon(1) manual. Typically, the filter will specify hosts found on a specific (sub)page to be returned, e.g. "filter=page=webservers" will cause appfeed.cgi to only return hosts that are present on the "webservers" page in Xymon. If no filter is specified, appfeed.cgi returns data for all red, yellow or purple statuses (equivalent to the data present on the "All non-green" page), or if invoked with the "\-\-critical" option it returns data from the "Critical systems" page. The output is an XML document with the current status of the selected hosts/services. .SH OPTIONS .IP "\-\-env=FILENAME Loads the environment from FILENAME before executing the CGI. .IP "\-\-critical[=FILENAME]" FILENAME specifies the "Critical Systems" configuration file (default: critical.cfg). appfeed.cgi will only return the statuses currently on the "Critical Systems" view. .IP "\-\-access=FILENAME" In addition to the filtering done by the "filter" parameter or the "\-\-critical" option, this option limits the output to hosts that the user has access to as defined in the Apache-compatible group-definitions in FILENAME. See .I xymon\-webaccess(5) for more details of this. .BR Note: Use of this option requires that access to the appfeed.cgi tool is password-protected by whatever means your webserver software provides, and that the login userid is available via the REMOTE_USER environment variable (this is standard CGI behaviour, so all webservers should provide it if you use the webserver's built-in authentication mechanisms). .SH "SEE ALSO" xymon(1), critical.cfg(5), xymon\-webaccess(5) xymon-4.3.28/web/chpasswd.c0000664000076400007640000001615113033575046015761 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon webpage generator tool. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: chpasswd.c 6588 2010-11-14 17:21:19Z storner $"; #include #include #include #include #include #include "libxymon.h" static void errormsg(int status, char *msg) { printf("Status: %d\n", status); printf("Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); printf("Invalid request\n"); printf("%s\n", msg); exit(1); } static int idcompare(const void *p1, const void *p2) { return strcmp(* (char * const *) p1, * (char * const *) p2); } #define ACT_NONE 0 #define ACT_DELETE 2 #define ACT_UPDATE 3 char *adduser_name = NULL; char *adduser_password = NULL; char *adduser_password1 = NULL; char *adduser_password2 = NULL; char *deluser_name = NULL; int parse_query(void) { cgidata_t *cgidata, *cwalk; int returnval = ACT_NONE; cgidata = cgi_request(); if (cgi_method != CGI_POST) return ACT_NONE; if (cgidata == NULL) errormsg(400, cgi_error()); cwalk = cgidata; while (cwalk) { /* * cwalk->name points to the name of the setting. * cwalk->value points to the value (may be an empty string). */ if (strcmp(cwalk->name, "USERNAME") == 0) { adduser_name = cwalk->value; } else if (strcmp(cwalk->name, "PASSWORD") == 0) { adduser_password = cwalk->value; } else if (strcmp(cwalk->name, "PASSWORD1") == 0) { adduser_password1 = cwalk->value; } else if (strcmp(cwalk->name, "PASSWORD2") == 0) { adduser_password2 = cwalk->value; } else if (strcmp(cwalk->name, "USERLIST") == 0) { deluser_name = cwalk->value; } else if (strcmp(cwalk->name, "SendDelete") == 0) { returnval = ACT_DELETE; } else if (strcmp(cwalk->name, "SendUpdate") == 0) { returnval = ACT_UPDATE; } cwalk = cwalk->next; } /* We only want to accept posts from certain pages */ if (returnval != ACT_NONE) { char cgisource[1024]; char *p; p = csp_header("chpasswd"); if (p) fprintf(stdout, "%s", p); snprintf(cgisource, sizeof(cgisource), "%s/%s", xgetenv("SECURECGIBINURL"), "chpasswd"); if (!cgi_refererok(cgisource)) { fprintf(stdout, "Location: %s.sh?\n\n", cgisource); return 0; } } return returnval; } int main(int argc, char *argv[]) { int argi, event; char *envarea = NULL; char *hffile = "chpasswd"; char *passfile = NULL; FILE *fd; char *infomsg = NULL; char *loggedinuser = NULL; for (argi = 1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } else if (strcmp(argv[argi], "--debug") == 0) { debug = 1; } else if (argnmatch(argv[argi], "--passwdfile=")) { char *p = strchr(argv[argi], '='); passfile = strdup(p+1); } } if (passfile == NULL) { passfile = (char *)malloc(strlen(xgetenv("XYMONHOME")) + 20); sprintf(passfile, "%s/etc/xymonpasswd", xgetenv("XYMONHOME")); } loggedinuser = getenv("REMOTE_USER"); if (!loggedinuser) errormsg(401, "User authentication must be enabled and you must be logged in to use this CGI"); event = parse_query(); if (adduser_name && !issimpleword(adduser_name)) { event = ACT_NONE; adduser_name = strdup(""); infomsg = "Invalid USERNAME. Letters, numbers, dashes, and periods only.\n"; } switch (event) { case ACT_NONE: /* Show the form */ break; case ACT_UPDATE: /* Change a user password*/ { char *cmd; int n, ret; if ( (strlen(loggedinuser) == 0) || (strlen(loggedinuser) != strlen(adduser_name)) || (strcmp(loggedinuser, adduser_name) != 0) ) { infomsg = "Username mismatch! You may only change your own password."; break; } if ( (strlen(adduser_name) == 0)) { infomsg = "User not logged in"; } else if ( (strlen(adduser_password1) == 0) || (strlen(adduser_password2) == 0)) { infomsg = "New password cannot be blank"; } else if (strcmp(adduser_password1, adduser_password2) != 0) { infomsg = "New passwords don't match"; } else if (strlen(adduser_name) != strspn(adduser_name,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-.,@/=^") ) { infomsg = "Username has invalid characters!"; } else if (strlen(adduser_password1) != strspn(adduser_password1,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-.,@/=^") ) { infomsg = "Password has invalid characters! Use alphanumerics and/or _ - . , @ / = ^"; } else { pid_t childpid; int n, ret; childpid = fork(); if (childpid < 0) { /* Fork failed */ errprintf("Could not fork child\n"); exit(1); } else if (childpid == 0) { /* child */ char *cmd; char **cmdargs; cmdargs = (char **) calloc(4 + 2, sizeof(char *)); cmdargs[0] = cmd = strdup("htpasswd"); cmdargs[1] = "-bv"; cmdargs[2] = strdup(passfile); cmdargs[3] = strdup(adduser_name); cmdargs[4] = strdup(adduser_password); cmdargs[5] = '\0'; execvp(cmd, cmdargs); exit(127); } /* parent waits for htpasswd to finish */ if ((waitpid(childpid, &n, 0) == -1) || (WEXITSTATUS(n) != 0)) { infomsg = "Existing Password incorrect"; break; } childpid = fork(); if (childpid < 0) { /* Fork failed */ errprintf("Could not fork child\n"); exit(1); } else if (childpid == 0) { /* child */ char *cmd; char **cmdargs; cmdargs = (char **) calloc(4 + 2, sizeof(char *)); cmdargs[0] = cmd = strdup("htpasswd"); cmdargs[1] = "-b"; cmdargs[2] = strdup(passfile); cmdargs[3] = strdup(adduser_name); cmdargs[4] = strdup(adduser_password1); cmdargs[5] = '\0'; execvp(cmd, cmdargs); exit(127); } /* parent waits for htpasswd to finish */ if ((waitpid(childpid, &n, 0) == -1) || (WEXITSTATUS(n) != 0)) { infomsg = "Update FAILED"; } else { infomsg = "Password changed\n"; } } } break; } fprintf(stdout, "Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); showform(stdout, hffile, "chpasswd_form", COL_BLUE, getcurrenttime(NULL), infomsg, NULL); return 0; } xymon-4.3.28/web/showgraph.c0000664000076400007640000011205512603243142016136 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD graph generator. */ /* */ /* This is a CGI script for generating graphs from the data stored in the */ /* RRD databases. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: showgraph.c 7678 2015-10-01 14:42:42Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" #define HOUR_GRAPH "e-48h" #define DAY_GRAPH "e-12d" #define WEEK_GRAPH "e-48d" #define MONTH_GRAPH "e-576d" /* RRDtool 1.0.x handles graphs with no DS definitions just fine. 1.2.x does not. */ #ifdef RRDTOOL12 #ifndef HIDE_EMPTYGRAPH #define HIDE_EMPTYGRAPH 1 #endif #endif #ifdef HIDE_EMPTYGRAPH unsigned char blankimg[] = "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\x00\x00\x01\x00\x00\x00\x01\x08\x06\x00\x00\x00\x1f\x15\xc4\x89\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x12\x00\x00\x0b\x12\x01\xd2\xdd\x7e\xfc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd1\x01\x14\x12\x21\x14\x7e\x4a\x3a\xd2\x00\x00\x00\x0d\x49\x44\x41\x54\x78\xda\x63\x60\x60\x60\x60\x00\x00\x00\x05\x00\x01\x7a\xa8\x57\x50\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82"; #endif char *hostname = NULL; char **hostlist = NULL; int hostlistsize = 0; char *displayname = NULL; char *service = NULL; char *period = NULL; time_t persecs = 0; char *gtype = NULL; char *glegend = NULL; enum {ACT_MENU, ACT_SELZOOM, ACT_VIEW} action = ACT_VIEW; time_t graphstart = 0; time_t graphend = 0; double upperlimit = 0.0; int haveupperlimit = 0; double lowerlimit = 0.0; int havelowerlimit = 0; int graphwidth = 0; int graphheight = 0; int ignorestalerrds = 0; int bgcolor = COL_GREEN; int coloridx = 0; char *colorlist[] = { "0000FF", "FF0000", "00CC00", "FF00FF", "555555", "880000", "000088", "008800", "008888", "888888", "880088", "FFFF00", "888800", "00FFFF", "00FF00", "AA8800", "AAAAAA", "DD8833", "DDCC33", "8888FF", "5555AA", "B428D3", "FF5555", "DDDDDD", "AAFFAA", "AAFFFF", "FFAAFF", "FFAA55", "55AAFF", "AA55FF", NULL }; typedef struct gdef_t { char *name; char *fnpat; char *exfnpat; char *title; char *yaxis; char *graphopts; int novzoom; char **defs; struct gdef_t *next; } gdef_t; gdef_t *gdefs = NULL; typedef struct rrddb_t { char *key; char *rrdfn; char *rrdparam; } rrddb_t; rrddb_t *rrddbs = NULL; int rrddbcount = 0; int rrddbsize = 0; int rrdidx = 0; int paramlen = 0; int firstidx = -1; int idxcount = -1; int lastidx = 0; void errormsg(char *msg) { printf("Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); printf("Invalid request\n"); printf("%s\n", msg); exit(1); } void request_cacheflush(char *hostname) { /* Build a cache-flush request, and send it to all of the $XYMONTMP/rrdctl.* sockets */ char *req, *bufp; int bytesleft; DIR *dir; struct dirent *d; int ctlsocket = -1; ctlsocket = socket(AF_UNIX, SOCK_DGRAM, 0); if (ctlsocket == -1) { errprintf("Cannot get socket: %s\n", strerror(errno)); return; } fcntl(ctlsocket, F_SETFL, O_NONBLOCK); dir = opendir(xgetenv("XYMONTMP")); if (!dir) { errprintf("Cannot acces $XYMONTMP directory: %s\n", strerror(errno)); return; } req = (char *)malloc(strlen(hostname)+3); sprintf(req, "/%s/", hostname); while ((d = readdir(dir)) != NULL) { if (strncmp(d->d_name, "rrdctl.", 7) == 0) { struct sockaddr_un myaddr; socklen_t myaddrsz = 0; int n, sendfailed = 0; memset(&myaddr, 0, sizeof(myaddr)); myaddr.sun_family = AF_UNIX; sprintf(myaddr.sun_path, "%s/%s", xgetenv("XYMONTMP"), d->d_name); myaddrsz = sizeof(myaddr); bufp = req; bytesleft = strlen(req); do { n = sendto(ctlsocket, bufp, bytesleft, 0, (struct sockaddr *)&myaddr, myaddrsz); if (n == -1) { if (errno == EDESTADDRREQ) { /* Probably a left-over rrdctl file, ignore it */ } else if (errno == EAGAIN) { /* Harmless */ } else { errprintf("Sendto failed: %s\n", strerror(errno)); } sendfailed = 1; } else { bytesleft -= n; bufp += n; } } while ((!sendfailed) && (bytesleft > 0)); } } closedir(dir); xfree(req); /* * Sleep 0.3 secs to allow the cache flush to happen. * Note: It isn't guaranteed to happen in this time, but * there's a good chance that it will. */ usleep(300000); } void parse_query(void) { cgidata_t *cgidata = NULL, *cwalk; char *stp = NULL; cgidata = cgi_request(); cwalk = cgidata; while (cwalk) { if (strcmp(cwalk->name, "host") == 0) { char *hnames = strdup(cwalk->value); hostname = strtok_r(cwalk->value, ",", &stp); while (hostname) { if (hostlist == NULL) { hostlistsize = 1; hostlist = (char **)malloc(sizeof(char *)); hostlist[0] = strdup(hostname); } else { hostlistsize++; hostlist = (char **)realloc(hostlist, (hostlistsize * sizeof(char *))); hostlist[hostlistsize-1] = strdup(hostname); } hostname = strtok_r(NULL, ",", &stp); } xfree(hnames); if (hostlist) hostname = hostlist[0]; } else if (strcmp(cwalk->name, "service") == 0) { service = strdup(cwalk->value); } else if (strcmp(cwalk->name, "disp") == 0) { displayname = strdup(cwalk->value); } else if (strcmp(cwalk->name, "graph") == 0) { if (strcmp(cwalk->value, "hourly") == 0) { period = HOUR_GRAPH; persecs = 48*60*60; gtype = strdup(cwalk->value); glegend = "Last 48 Hours"; } else if (strcmp(cwalk->value, "daily") == 0) { period = DAY_GRAPH; persecs = 12*24*60*60; gtype = strdup(cwalk->value); glegend = "Last 12 Days"; } else if (strcmp(cwalk->value, "weekly") == 0) { period = WEEK_GRAPH; persecs = 48*24*60*60; gtype = strdup(cwalk->value); glegend = "Last 48 Days"; } else if (strcmp(cwalk->value, "monthly") == 0) { period = MONTH_GRAPH; persecs = 576*24*60*60; gtype = strdup(cwalk->value); glegend = "Last 576 Days"; } else if (strcmp(cwalk->value, "custom") == 0) { period = NULL; persecs = 0; gtype = strdup(cwalk->value); glegend = ""; } } else if (strcmp(cwalk->name, "first") == 0) { firstidx = atoi(cwalk->value) - 1; } else if (strcmp(cwalk->name, "count") == 0) { idxcount = atoi(cwalk->value); lastidx = firstidx + idxcount - 1; } else if (strcmp(cwalk->name, "action") == 0) { if (cwalk->value) { if (strcmp(cwalk->value, "menu") == 0) action = ACT_MENU; else if (strcmp(cwalk->value, "selzoom") == 0) action = ACT_SELZOOM; else if (strcmp(cwalk->value, "view") == 0) action = ACT_VIEW; } } else if (strcmp(cwalk->name, "graph_start") == 0) { if (cwalk->value) graphstart = atoi(cwalk->value); } else if (strcmp(cwalk->name, "graph_end") == 0) { if (cwalk->value) graphend = atoi(cwalk->value); } else if (strcmp(cwalk->name, "upper") == 0) { if (cwalk->value) { upperlimit = atof(cwalk->value); haveupperlimit = 1; } } else if (strcmp(cwalk->name, "lower") == 0) { if (cwalk->value) { lowerlimit = atof(cwalk->value); havelowerlimit = 1; } } else if (strcmp(cwalk->name, "graph_width") == 0) { if (cwalk->value) graphwidth = atoi(cwalk->value); } else if (strcmp(cwalk->name, "graph_height") == 0) { if (cwalk->value) graphheight = atoi(cwalk->value); } else if (strcmp(cwalk->name, "nostale") == 0) { ignorestalerrds = 1; } else if (strcmp(cwalk->name, "color") == 0) { int color = parse_color(cwalk->value); if (color != -1) bgcolor = color; } cwalk = cwalk->next; } if (hostlistsize == 1) { xfree(hostlist); hostlist = NULL; } else { displayname = hostname = strdup(""); } if ((hostname == NULL) || (service == NULL)) errormsg("Invalid request - no host or service"); if (displayname == NULL) displayname = hostname; if (graphstart && graphend) { char t1[15], t2[15]; persecs = (graphend - graphstart); strftime(t1, sizeof(t1), "%d/%b/%Y", localtime(&graphstart)); strftime(t2, sizeof(t2), "%d/%b/%Y", localtime(&graphend)); glegend = (char *)malloc(40); sprintf(glegend, "%s - %s", t1, t2); } } void load_gdefs(char *fn) { FILE *fd; strbuffer_t *inbuf; char *p; gdef_t *newitem = NULL; char **alldefs = NULL; int alldefcount = 0, alldefidx = 0; inbuf = newstrbuffer(0); fd = stackfopen(fn, "r", NULL); if (fd == NULL) errormsg("Cannot load graph definitions"); while (stackfgets(inbuf, NULL)) { p = strchr(STRBUF(inbuf), '\n'); if (p) *p = '\0'; p = STRBUF(inbuf); p += strspn(p, " \t"); if ((strlen(p) == 0) || (*p == '#')) continue; if (*p == '[') { char *delim; if (newitem) { /* Save the current one, and start on the next item */ alldefs[alldefidx] = NULL; newitem->defs = alldefs; newitem->next = gdefs; gdefs = newitem; } newitem = calloc(1, sizeof(gdef_t)); delim = strchr(p, ']'); if (delim) *delim = '\0'; newitem->name = strdup(p+1); alldefcount = 10; alldefs = (char **)malloc((alldefcount+1) * sizeof(char *)); alldefidx = 0; } else if (strncasecmp(p, "FNPATTERN", 9) == 0) { p += 9; p += strspn(p, " \t"); newitem->fnpat = strdup(p); } else if (strncasecmp(p, "EXFNPATTERN", 11) == 0) { p += 11; p += strspn(p, " \t"); newitem->exfnpat = strdup(p); } else if (strncasecmp(p, "TITLE", 5) == 0) { p += 5; p += strspn(p, " \t"); newitem->title = strdup(p); } else if (strncasecmp(p, "YAXIS", 5) == 0) { p += 5; p += strspn(p, " \t"); newitem->yaxis = strdup(p); } else if (strncasecmp(p, "NOVZOOM", 7) == 0) { newitem->novzoom = 1; } else if (strncasecmp(p, "GRAPHOPTIONS", 12) == 0) { p += 12; p += strspn(p, " \t"); newitem->graphopts = strdup(p); } else if (haveupperlimit && (strncmp(p, "-u ", 3) == 0)) { continue; } else if (haveupperlimit && (strncmp(p, "-upper ", 7) == 0)) { continue; } else if (havelowerlimit && (strncmp(p, "-l ", 3) == 0)) { continue; } else if (havelowerlimit && (strncmp(p, "-lower ", 7) == 0)) { continue; } else { if (alldefidx == alldefcount) { /* Must expand alldefs */ alldefcount += 5; alldefs = (char **)realloc(alldefs, (alldefcount+1) * sizeof(char *)); } alldefs[alldefidx++] = strdup(p); } } /* Pick up the last item */ if (newitem) { /* Save the current one, and start on the next item */ alldefs[alldefidx] = NULL; newitem->defs = alldefs; newitem->next = gdefs; gdefs = newitem; } stackfclose(fd); freestrbuffer(inbuf); } char *lookup_meta(char *keybuf, char *rrdfn) { FILE *fd; char *metafn, *p; int servicelen = strlen(service); int keylen = strlen(keybuf); int found; static char buf[1024]; /* Must be static since it is returned to caller */ p = strrchr(rrdfn, '/'); if (!p) { metafn = strdup("rrd.meta"); } else { metafn = (char *)malloc(strlen(rrdfn) + 10); *p = '\0'; sprintf(metafn, "%s/rrd.meta", rrdfn); *p = '/'; } fd = fopen(metafn, "r"); xfree(metafn); if (!fd) return NULL; /* Find the first line that has our key and then whitespace */ found = 0; while (!found && fgets(buf, sizeof(buf), fd)) { found = ( (strncmp(buf, service, servicelen) == 0) && (*(buf+servicelen) == ':') && (strncmp(buf+servicelen+1, keybuf, keylen) == 0) && isspace(*(buf+servicelen+1+keylen)) ); } fclose(fd); if (found) { char *eoln, *val; val = buf + servicelen + 1 + keylen; val += strspn(val, " \t"); eoln = strchr(val, '\n'); if (eoln) *eoln = '\0'; if (strlen(val) > 0) return val; } return NULL; } char *colon_escape(char *buf) { static char *result = NULL; int count = 0; char *p, *inp, *outp; p = buf; while ((p = strchr(p, ':')) != NULL) { count++; p++; } if (count == 0) return buf; if (result) xfree(result); result = (char *) malloc(strlen(buf) + count + 1); *result = '\0'; inp = buf; outp = result; while (*inp) { p = strchr(inp, ':'); if (p == NULL) { strcat(outp, inp); inp += strlen(inp); outp += strlen(outp); } else { *p = '\0'; strcat(outp, inp); strcat(outp, "\\:"); *p = ':'; inp = p+1; outp = outp + strlen(outp); } } *outp = '\0'; return result; } char *expand_tokens(char *tpl) { static strbuffer_t *result = NULL; char *inp, *p; if (strchr(tpl, '@') == NULL) return tpl; if (!result) result = newstrbuffer(2048); else clearstrbuffer(result); inp = tpl; while (*inp) { p = strchr(inp, '@'); if (p == NULL) { addtobuffer(result, inp); inp += strlen(inp); continue; } *p = '\0'; if (strlen(inp)) { addtobuffer(result, inp); inp = p; } *p = '@'; if (strncmp(inp, "@RRDFN@", 7) == 0) { addtobuffer(result, colon_escape(rrddbs[rrdidx].rrdfn)); inp += 7; } else if (strncmp(inp, "@RRDPARAM@", 10) == 0) { /* * We do a colon-escape first, then change all commas to slashes as * this is a common mangling used by multiple backends (disk, http, iostat...) */ if (rrddbs[rrdidx].rrdparam) { char *val, *p; int vallen; char *resultstr; val = colon_escape(rrddbs[rrdidx].rrdparam); p = val; while ((p = strchr(p, ',')) != NULL) *p = '/'; /* rrdparam strings may be very long. */ if (strlen(val) > 100) *(val+100) = '\0'; /* * "paramlen" holds the longest string of the any of the matching files' rrdparam. * However, because this goes through colon_escape(), the actual string length * passed to librrd functions may be longer (since ":" must be escaped as "\:"). */ vallen = strlen(val); if (vallen < paramlen) vallen = paramlen; resultstr = (char *)malloc(vallen + 1); sprintf(resultstr, "%-*s", paramlen, val); addtobuffer(result, resultstr); xfree(resultstr); } inp += 10; } else if (strncmp(inp, "@RRDMETA@", 9) == 0) { /* * We do a colon-escape first, then change all commas to slashes as * this is a common mangling used by multiple backends (disk, http, iostat...) */ if (rrddbs[rrdidx].rrdparam) { char *val, *p, *metaval; val = colon_escape(rrddbs[rrdidx].rrdparam); p = val; while ((p = strchr(p, ',')) != NULL) *p = '/'; metaval = lookup_meta(val, rrddbs[rrdidx].rrdfn); if (metaval) addtobuffer(result, metaval); } inp += 9; } else if (strncmp(inp, "@RRDIDX@", 8) == 0) { char numstr[10]; sprintf(numstr, "%d", rrdidx); addtobuffer(result, numstr); inp += 8; } else if (strncmp(inp, "@STACKIT@", 9) == 0) { /* Contributed by Gildas Le Nadan */ /* the STACK behavior changed between rrdtool 1.0.x * and 1.2.x, hence the ifdef: * - in 1.0.x, you replace the graph type (AREA|LINE) * for the graph you want to stack with the STACK * keyword * - in 1.2.x, you add the STACK keyword at the end * of the definition * * Please note that in both cases the first entry * mustn't contain the keyword STACK at all, so * we need a different treatment for the first rrdidx * * examples of graphs.cfg entries: * * - rrdtool 1.0.x * @STACKIT@:la@RRDIDX@#@COLOR@:@RRDPARAM@ * * - rrdtool 1.2.x * AREA::la@RRDIDX@#@COLOR@:@RRDPARAM@:@STACKIT@ */ char numstr[10]; if (rrdidx == 0) { #ifdef RRDTOOL12 strcpy(numstr, ""); #else sprintf(numstr, "AREA"); #endif } else { sprintf(numstr, "STACK"); } addtobuffer(result, numstr); inp += 9; } else if (strncmp(inp, "@SERVICE@", 9) == 0) { addtobuffer(result, service); inp += 9; } else if (strncmp(inp, "@COLOR@", 7) == 0) { addtobuffer(result, colorlist[coloridx]); inp += 7; coloridx++; if (colorlist[coloridx] == NULL) coloridx = 0; } else { addtobuffer(result, "@"); inp += 1; } } return STRBUF(result); } int rrd_name_compare(const void *v1, const void *v2) { rrddb_t *r1 = (rrddb_t *)v1; rrddb_t *r2 = (rrddb_t *)v2; char *endptr; long numkey1, numkey2; int key1isnumber, key2isnumber; /* See if the keys are all numeric; if yes, then do a numeric sort */ numkey1 = strtol(r1->key, &endptr, 10); key1isnumber = (*endptr == '\0'); numkey2 = strtol(r2->key, &endptr, 10); key2isnumber = (*endptr == '\0'); if (key1isnumber && key2isnumber) { if (numkey1 < numkey2) return -1; else if (numkey1 > numkey2) return 1; else return 0; } return strcmp(r1->key, r2->key); } void graph_link(FILE *output, char *uri, char *grtype, time_t seconds) { time_t gstart, gend; char *grtype_s; fprintf(output, "\n"); grtype_s = htmlquoted(grtype); switch (action) { case ACT_MENU: fprintf(output, " \"%s\n", uri, grtype_s, grtype_s); fprintf(output, " \"Zoom \n", uri, grtype_s, colorname(bgcolor), xgetenv("XYMONSKIN"), xgetenv("IMAGEFILETYPE")); break; case ACT_SELZOOM: if (graphend == 0) gend = getcurrenttime(NULL); else gend = graphend; if (graphstart == 0) gstart = gend - persecs; else gstart = graphstart; fprintf(output, " \"Zoom\n"); break; case ACT_VIEW: break; } fprintf(output, "\n"); } char *build_selfURI(void) { strbuffer_t *result = newstrbuffer(2048); char numbuf[40]; addtobuffer(result, xgetenv("SCRIPT_NAME")); addtobuffer(result, "?host="); if (hostlist) { int i; addtobuffer(result, urlencode(hostlist[0])); for (i = 1; (i < hostlistsize); i++) { addtobuffer(result, ","); addtobuffer(result, urlencode(hostlist[i])); } } else { addtobuffer(result, urlencode(hostname)); } addtobuffer(result, "&color="); addtobuffer(result, colorname(bgcolor)); if (service) { addtobuffer(result, "&service="); addtobuffer(result, urlencode(service)); } if (haveupperlimit) { snprintf(numbuf, sizeof(numbuf)-1, "%f", upperlimit); addtobuffer(result, "&upper="); addtobuffer(result, urlencode(numbuf)); } if (graphheight) { snprintf(numbuf, sizeof(numbuf)-1, "%d", graphheight); addtobuffer(result, "&graph_height="); addtobuffer(result, urlencode(numbuf)); } if (graphwidth) { snprintf(numbuf, sizeof(numbuf)-1, "%d", graphwidth); addtobuffer(result, "&graph_width="); addtobuffer(result, urlencode(numbuf)); } if (displayname && (displayname != hostname)) { addtobuffer(result, "&disp="); addtobuffer(result, urlencode(displayname)); } if (firstidx != -1) { snprintf(numbuf, sizeof(numbuf)-1, "&first=%d", firstidx+1); addtobuffer(result, numbuf); } if (idxcount != -1) { snprintf(numbuf, sizeof(numbuf)-1, "&count=%d", idxcount); addtobuffer(result, numbuf); } if (ignorestalerrds) addtobuffer(result, "&nostale"); return STRBUF(result); } void build_menu_page(char *selfURI, int backsecs) { /* This is special-handled, because we just want to generate an HTML link page */ fprintf(stdout, "Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); sethostenv(displayname, "", service, colorname(bgcolor), hostname); sethostenv_backsecs(backsecs); headfoot(stdout, "graphs", "", "header", bgcolor); fprintf(stdout, "\n"); graph_link(stdout, selfURI, "hourly", 48*60*60); graph_link(stdout, selfURI, "daily", 12*24*60*60); graph_link(stdout, selfURI, "weekly", 48*24*60*60); graph_link(stdout, selfURI, "monthly", 576*24*60*60); fprintf(stdout, "
\n"); headfoot(stdout, "graphs", "", "footer", bgcolor); } void generate_graph(char *gdeffn, char *rrddir, char *graphfn) { gdef_t *gdef = NULL, *gdefuser = NULL; int wantsingle = 0; DIR *dir; time_t now = getcurrenttime(NULL); int argi, pcount; /* Options for rrd_graph() */ int rrdargcount; char **rrdargs = NULL; /* The full argv[] table of string pointers to arguments */ char heightopt[30]; /* -h HEIGHT */ char widthopt[30]; /* -w WIDTH */ char upperopt[30]; /* -u MAX */ char loweropt[30]; /* -l MIN */ char startopt[30]; /* -s STARTTIME */ char endopt[30]; /* -e ENDTIME */ char graphtitle[1024]; /* --title TEXT */ char timestamp[50]; /* COMMENT with timestamp graph was generated */ /* Return variables from rrd_graph() */ int result; char **calcpr = NULL; int xsize, ysize; double ymin, ymax; char *useroptval = NULL; char **useropts = NULL; int useroptcount = 0, useroptidx; /* Find the graphs.cfg file and load it */ if (gdeffn == NULL) { char fnam[PATH_MAX]; sprintf(fnam, "%s/etc/graphs.cfg", xgetenv("XYMONHOME")); gdeffn = strdup(fnam); } load_gdefs(gdeffn); /* Determine the real service name. It might be a multi-service graph */ if (strchr(service, ':') || strchr(service, '.')) { /* * service is "tcp:foo" - so use the "tcp" graph definition, but for a * single service (as if service was set to just "foo"). */ char *delim = service + strcspn(service, ":."); char *realservice; *delim = '\0'; realservice = strdup(delim+1); /* The requested gdef only acts as a fall-back solution so don't set gdef here. */ for (gdefuser = gdefs; (gdefuser && strcmp(service, gdefuser->name)); gdefuser = gdefuser->next) ; strcpy(service, realservice); wantsingle = 1; xfree(realservice); } /* * Lookup which RRD file corresponds to the service-name, and how we handle this graph. * We first lookup the service name in the graph definition list. * If that fails, then we try mapping it via the servicename -> RRD map. */ for (gdef = gdefs; (gdef && strcmp(service, gdef->name)); gdef = gdef->next) ; if (gdef == NULL) { if (gdefuser) { gdef = gdefuser; } else { xymonrrd_t *ldef = find_xymon_rrd(service, NULL); if (ldef) { for (gdef = gdefs; (gdef && strcmp(ldef->xymonrrdname, gdef->name)); gdef = gdef->next) ; wantsingle = 1; } } } if (gdef == NULL) errormsg("Unknown graph requested"); if (hostlist && (gdef->fnpat == NULL)) { char *multiname = (char *)malloc(strlen(gdef->name) + 7); sprintf(multiname, "%s-multi", gdef->name); for (gdef = gdefs; (gdef && strcmp(multiname, gdef->name)); gdef = gdef->next) ; if (gdef == NULL) errormsg("Unknown multi-graph requested"); xfree(multiname); } /* * If we're here only to collect the min/max values for the graph but it doesn't * allow vertical zoom, then there's no reason to waste anymore time. */ if ((action == ACT_SELZOOM) && gdef->novzoom) { haveupperlimit = havelowerlimit = 0; return; } /* Determine the directory with the host RRD files, and go there. */ if (rrddir == NULL) { char dnam[PATH_MAX]; if (hostlist) sprintf(dnam, "%s", xgetenv("XYMONRRDS")); else sprintf(dnam, "%s/%s", xgetenv("XYMONRRDS"), hostname); rrddir = strdup(dnam); } if (chdir(rrddir)) errormsg("Cannot access RRD directory"); /* Request an RRD cache flush from the xymond_rrd update daemon */ if (hostlist) { int i; for (i=0; (i < hostlistsize); i++) request_cacheflush(hostlist[i]); } else if (hostname) request_cacheflush(hostname); /* What RRD files do we have matching this request? */ if (hostlist || (gdef->fnpat == NULL)) { /* * No pattern, just a single file. It doesnt matter if it exists, because * these types of graphs usually have a hard-coded value for the RRD filename * in the graph definition. */ rrddbcount = rrddbsize = (hostlist ? hostlistsize : 1); rrddbs = (rrddb_t *)malloc((rrddbsize + 1) * sizeof(rrddb_t)); if (!hostlist) { rrddbs[0].key = strdup(service); rrddbs[0].rrdfn = (char *)malloc(strlen(gdef->name) + strlen(".rrd") + 1); sprintf(rrddbs[0].rrdfn, "%s.rrd", gdef->name); rrddbs[0].rrdparam = NULL; } else { int i, maxlen; char paramfmt[10]; for (i=0, maxlen=0; (i < hostlistsize); i++) { if (strlen(hostlist[i]) > maxlen) maxlen = strlen(hostlist[i]); } sprintf(paramfmt, "%%-%ds", maxlen+1); for (i=0; (i < hostlistsize); i++) { rrddbs[i].key = strdup(service); rrddbs[i].rrdfn = (char *)malloc(strlen(hostlist[i]) + strlen(gdef->fnpat) + 2); sprintf(rrddbs[i].rrdfn, "%s/%s", hostlist[i], gdef->fnpat); rrddbs[i].rrdparam = (char *)malloc(maxlen + 2); sprintf(rrddbs[i].rrdparam, paramfmt, hostlist[i]); } } } else { struct dirent *d; pcre *pat, *expat = NULL; const char *errmsg; int errofs, result; int ovector[30]; struct stat st; time_t now = getcurrenttime(NULL); /* Scan the directory to see what RRD files are there that match */ dir = opendir("."); if (dir == NULL) errormsg("Unexpected error while accessing RRD directory"); /* Setup the pattern to match filenames against */ pat = pcre_compile(gdef->fnpat, PCRE_CASELESS, &errmsg, &errofs, NULL); if (!pat) { char msg[8192]; snprintf(msg, sizeof(msg), "graphs.cfg error, PCRE pattern %s invalid: %s, offset %d\n", htmlquoted(gdef->fnpat), errmsg, errofs); errormsg(msg); } if (gdef->exfnpat) { expat = pcre_compile(gdef->exfnpat, PCRE_CASELESS, &errmsg, &errofs, NULL); if (!expat) { char msg[8192]; snprintf(msg, sizeof(msg), "graphs.cfg error, PCRE pattern %s invalid: %s, offset %d\n", htmlquoted(gdef->exfnpat), errmsg, errofs); errormsg(msg); } } /* Allocate an initial filename table */ rrddbsize = 5; rrddbs = (rrddb_t *) malloc((rrddbsize+1) * sizeof(rrddb_t)); while ((d = readdir(dir)) != NULL) { char *ext; char param[PATH_MAX]; /* Ignore dot-files and files with names shorter than ".rrd" */ if (*(d->d_name) == '.') continue; ext = d->d_name + strlen(d->d_name) - strlen(".rrd"); if ((ext <= d->d_name) || (strcmp(ext, ".rrd") != 0)) continue; /* First check the exclude pattern. */ if (expat) { result = pcre_exec(expat, NULL, d->d_name, strlen(d->d_name), 0, 0, ovector, (sizeof(ovector)/sizeof(int))); if (result >= 0) continue; } /* Then see if the include pattern matches. */ result = pcre_exec(pat, NULL, d->d_name, strlen(d->d_name), 0, 0, ovector, (sizeof(ovector)/sizeof(int))); if (result < 0) continue; if (wantsingle) { /* "Single" graph, i.e. a graph for a service normally included in a bundle (tcp) */ if (strstr(d->d_name, service) == NULL) continue; } /* * Has it been updated recently (within the past 24 hours) ? * We don't want old graphs to mess up multi-displays. */ if (ignorestalerrds && (stat(d->d_name, &st) == 0) && ((now - st.st_mtime) > 86400)) { continue; } /* We have a matching file! */ rrddbs[rrddbcount].rrdfn = strdup(d->d_name); if (pcre_copy_substring(d->d_name, ovector, result, 1, param, sizeof(param)) > 0) { /* * This is ugly, but I cannot find a pretty way of un-mangling * the disk- and http-data that has been molested by the back-end. */ if ((strcmp(param, ",root") == 0) && ((strncmp(gdef->name, "disk", 4) == 0) || (strncmp(gdef->name, "inode", 5) == 0)) ) { rrddbs[rrddbcount].rrdparam = strdup(","); } else if ((strcmp(gdef->name, "http") == 0) && (strncmp(param, "http", 4) != 0)) { rrddbs[rrddbcount].rrdparam = (char *)malloc(strlen("http://")+strlen(param)+1); sprintf(rrddbs[rrddbcount].rrdparam, "http://%s", param); } else { rrddbs[rrddbcount].rrdparam = strdup(param); } if (strlen(rrddbs[rrddbcount].rrdparam) > paramlen) { /* * "paramlen" holds the longest string of the any of the matching files' rrdparam. */ paramlen = strlen(rrddbs[rrddbcount].rrdparam); } rrddbs[rrddbcount].key = strdup(rrddbs[rrddbcount].rrdparam); } else { rrddbs[rrddbcount].key = strdup(d->d_name); rrddbs[rrddbcount].rrdparam = NULL; } rrddbcount++; if (rrddbcount == rrddbsize) { rrddbsize += 5; rrddbs = (rrddb_t *)realloc(rrddbs, (rrddbsize+1) * sizeof(rrddb_t)); } } pcre_free(pat); if (expat) pcre_free(expat); closedir(dir); } rrddbs[rrddbcount].key = rrddbs[rrddbcount].rrdfn = rrddbs[rrddbcount].rrdparam = NULL; /* Sort them so the display looks prettier */ qsort(&rrddbs[0], rrddbcount, sizeof(rrddb_t), rrd_name_compare); /* Setup the title */ if (!gdef->title) gdef->title = strdup(""); if (strncmp(gdef->title, "exec:", 5) == 0) { char *pcmd; int i, pcmdlen = 0; FILE *pfd; char *p; pcmdlen = strlen(gdef->title+5) + strlen(displayname) + strlen(service) + strlen(glegend) + 5; for (i=0; (ititle+5, displayname, service, glegend); for (i=0; (i= firstidx) && (i <= lastidx))) { p += sprintf(p, " \"%s\"", rrddbs[i].rrdfn); } } pfd = popen(pcmd, "r"); if (pfd) { if (fgets(graphtitle, sizeof(graphtitle), pfd) == NULL) *graphtitle = '\0'; pclose(pfd); } /* Drop any newline at end of the title */ p = strchr(graphtitle, '\n'); if (p) *p = '\0'; } else { sprintf(graphtitle, "%s %s %s", displayname, gdef->title, glegend); } sprintf(heightopt, "-h%d", graphheight); sprintf(widthopt, "-w%d", graphwidth); /* * Grab user-provided additional rrd_graph options from RRDGRAPHOPTS */ useroptcount = 0; useroptval = gdef->graphopts; if (!useroptval) useroptval = getenv("RRDGRAPHOPTS"); if (useroptval) { char *tok; useropts = (char **)calloc(1, sizeof(char *)); useroptval = strdup(useroptval); tok = strtok(useroptval, " "); while (tok) { useroptcount++; useropts = (char **)realloc(useropts, (useroptcount+1)*sizeof(char *)); useropts[useroptcount-1] = tok; useropts[useroptcount] = NULL; tok = strtok(NULL, " "); } } /* * Setup the arguments for calling rrd_graph. * There's up to 16 standard arguments, plus the * graph-specific ones (which may be repeated if * there are multiple RRD-files to handle). */ for (pcount = 0; (gdef->defs[pcount]); pcount++) ; rrdargs = (char **) calloc(16 + pcount*rrddbcount + useroptcount + 1, sizeof(char *)); argi = 0; rrdargs[argi++] = "rrdgraph"; rrdargs[argi++] = (action == ACT_VIEW) ? graphfn : "/dev/null"; rrdargs[argi++] = "--title"; rrdargs[argi++] = graphtitle; rrdargs[argi++] = widthopt; rrdargs[argi++] = heightopt; rrdargs[argi++] = "-v"; rrdargs[argi++] = gdef->yaxis; rrdargs[argi++] = "-a"; rrdargs[argi++] = "PNG"; if (haveupperlimit) { sprintf(upperopt, "-u %f", upperlimit); rrdargs[argi++] = upperopt; } if (havelowerlimit) { sprintf(loweropt, "-l %f", lowerlimit); rrdargs[argi++] = loweropt; } if (haveupperlimit || havelowerlimit) rrdargs[argi++] = "--rigid"; if (graphstart) sprintf(startopt, "-s %u", (unsigned int) graphstart); else sprintf(startopt, "-s %s", period); rrdargs[argi++] = startopt; if (graphend) { sprintf(endopt, "-e %u", (unsigned int) graphend); rrdargs[argi++] = endopt; } for (useroptidx=0; (useroptidx < useroptcount); useroptidx++) { rrdargs[argi++] = useropts[useroptidx]; } for (rrdidx=0; (rrdidx < rrddbcount); rrdidx++) { if ((firstidx == -1) || ((rrdidx >= firstidx) && (rrdidx <= lastidx))) { int i; for (i=0; (gdef->defs[i]); i++) { rrdargs[argi++] = strdup(expand_tokens(gdef->defs[i])); } } } #ifdef RRDTOOL12 strftime(timestamp, sizeof(timestamp), "COMMENT:Updated\\: %d-%b-%Y %H\\:%M\\:%S", localtime(&now)); #else strftime(timestamp, sizeof(timestamp), "COMMENT:Updated: %d-%b-%Y %H:%M:%S", localtime(&now)); #endif rrdargs[argi++] = strdup(timestamp); rrdargcount = argi; rrdargs[argi++] = NULL; if (debug) { for (argi=0; (argi < rrdargcount); argi++) dbgprintf("%s\n", rrdargs[argi]); } /* If sending to stdout, print the HTTP header first. */ if ((action == ACT_VIEW) && (strcmp(graphfn, "-") == 0)) { time_t expiretime = now + 300; char expirehdr[100]; printf("Content-type: image/png\n"); strftime(expirehdr, sizeof(expirehdr), "Expires: %a, %d %b %Y %H:%M:%S GMT", gmtime(&expiretime)); printf("%s\n", expirehdr); printf("\n"); #ifdef HIDE_EMPTYGRAPH /* It works, but we still get the "zoom" magnifying glass which looks odd */ if (rrddbcount == 0) { /* No graph */ fwrite(blankimg, 1, sizeof(blankimg), stdout); return; } #endif } /* All set - generate the graph */ rrd_clear_error(); #ifdef RRDTOOL12 result = rrd_graph(rrdargcount, rrdargs, &calcpr, &xsize, &ysize, NULL, &ymin, &ymax); /* * If we have neither the upper- nor lower-limits of the graph, AND we allow vertical * zooming of this graph, then save the upper/lower limit values and flag that we have * them. The values are then used for the zoom URL we construct later on. */ if (!haveupperlimit && !havelowerlimit) { upperlimit = ymax; haveupperlimit = 1; lowerlimit = ymin; havelowerlimit = 1; } #else result = rrd_graph(rrdargcount, rrdargs, &calcpr, &xsize, &ysize); #endif /* Was it OK ? */ if (rrd_test_error() || (result != 0)) { if (calcpr) { int i; for (i=0; (calcpr[i]); i++) xfree(calcpr[i]); calcpr = NULL; } errormsg(rrd_get_error()); } if (useroptval) xfree(useroptval); if (useropts) xfree(useropts); } void generate_zoompage(char *selfURI) { fprintf(stdout, "Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); sethostenv(displayname, "", service, colorname(bgcolor), hostname); headfoot(stdout, "graphs", "", "header", bgcolor); fprintf(stdout, "
\n"); fprintf(stdout, "
\n"); fprintf(stdout, "\n"); graph_link(stdout, selfURI, gtype, 0); fprintf(stdout, "
\n"); { char zoomjsfn[PATH_MAX]; struct stat st; sprintf(zoomjsfn, "%s/web/zoom.js", xgetenv("XYMONHOME")); if (stat(zoomjsfn, &st) == 0) { FILE *fd; char *buf; size_t n; char *zoomrightoffsetmarker = "var cZoomBoxRightOffset = -"; char *zoomrightoffsetp; fd = fopen(zoomjsfn, "r"); if (fd) { buf = (char *)malloc(st.st_size+1); n = fread(buf, 1, st.st_size, fd); fclose(fd); #ifdef RRDTOOL12 zoomrightoffsetp = strstr(buf, zoomrightoffsetmarker); if (zoomrightoffsetp) { zoomrightoffsetp += strlen(zoomrightoffsetmarker); memcpy(zoomrightoffsetp, "30", 2); } #endif fwrite(buf, 1, n, stdout); } } } headfoot(stdout, "graphs", "", "footer", bgcolor); } int main(int argc, char *argv[]) { /* Command line settings */ int argi; char *envarea = NULL; char *rrddir = NULL; /* RRD files top-level directory */ char *gdeffn = NULL; /* graphs.cfg file */ char *graphfn = "-"; /* Output filename, default is stdout */ char *selfURI; /* Setup defaults */ graphwidth = atoi(xgetenv("RRDWIDTH")); graphheight = atoi(xgetenv("RRDHEIGHT")); /* See what we want to do - i.e. get hostname, service and graph-type */ parse_query(); /* Handle any command-line args */ for (argi=1; (argi < argc); argi++) { if (strcmp(argv[argi], "--debug") == 0) { debug = 1; } else if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } else if (argnmatch(argv[argi], "--rrddir=")) { char *p = strchr(argv[argi], '='); rrddir = strdup(p+1); } else if (argnmatch(argv[argi], "--config=")) { char *p = strchr(argv[argi], '='); gdeffn = strdup(p+1); } else if (strcmp(argv[argi], "--save=") == 0) { char *p = strchr(argv[argi], '='); graphfn = strdup(p+1); } } redirect_cgilog("showgraph"); selfURI = build_selfURI(); if (action == ACT_MENU) { build_menu_page(selfURI, graphend-graphstart); return 0; } if ((action == ACT_VIEW) || !(haveupperlimit && havelowerlimit)) { generate_graph(gdeffn, rrddir, graphfn); } if (action == ACT_SELZOOM) { generate_zoompage(selfURI); } return 0; } xymon-4.3.28/web/cgiwrap.c0000664000076400007640000002015412634276470015604 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon CGI wrapper tool */ /* */ /* This is a wrapper for running the Xymon CGI programs */ /* */ /* Copyright (C) 2014 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: $"; #include #include #include #include #include #include #include #include "libxymon.h" static char **options = NULL; static int optcount = 0; static int haveenvopt = 0; void addopt(char *opt) { options = (char **)realloc(options, (++optcount)*sizeof(char *)); options[optcount-1] = strdup(opt); if (strncmp(opt, "--env=", 6) == 0) haveenvopt = 1; } void addoptl(char *ename) { char *optlist, *opt; if (getenv(ename) == NULL) return; optlist = strdup(getenv(ename)); opt = strtok(optlist, " \t"); while (opt) { addopt(opt); opt = strtok(NULL, " \t"); } free(optlist); } void addoptdone(void) { options = (char **)realloc(options, (++optcount)*sizeof(char *)); options[optcount-1] = NULL; } int main(int argc, char **argv) { char *cgifile = XYMONHOME "/etc/cgioptions.cfg"; char *pgm = strdup(argv[0]); char *cgipgm = NULL; char executable[PATH_MAX]; char xymoncmd[PATH_MAX]; if (getenv("CGIDEBUG")) debug = 1; set_debugfile("stderr", 1); loadenv(cgifile, NULL); cgipgm = (char *)malloc(strlen(pgm) + 5); strcpy(cgipgm, basename(pgm)); if (strstr(cgipgm, ".sh")) strcpy(strstr(cgipgm, ".sh"), ".cgi"); if (strcmp(cgipgm, "cgiwrap") == 0) { printf("\ncgiwrap is an executable wrapper program for xymon CGI scripts. It sets the environment according to the configuration specified in %s and then launches the CGI to response to the request.\n\nCGI scripts in the xymon-cgi or xymon-seccgi directories should be symlinked or hardlinked to this file. cgiwrap will do nothing if called directly.\n", cgifile); return 1; } addopt(""); // Reserve one for the program name if (strcmp(cgipgm, "ackinfo.cgi") == 0) { addoptl("CGI_ACKINFO_OPTS"); } else if (strcmp(cgipgm, "acknowledge.cgi") == 0) { addoptl("CGI_ACK_OPTS"); } else if (strcmp(cgipgm, "appfeed-critical.cgi") == 0) { cgipgm = "appfeed.cgi"; addoptl("CGI_APPFEED_OPTS"); addopt("--critical=/etc/xymon/critical.cfg"); } else if (strcmp(cgipgm, "appfeed.cgi") == 0) { addoptl("CGI_APPFEED_OPTS"); } else if (strcmp(cgipgm, "certreport.cgi") == 0) { cgipgm = "statusreport.cgi"; addopt("--column=sslcert"); addopt("--filter=color=red,yellow"); addopt("--all"); addopt("--no-colors"); } else if (strcmp(cgipgm, "columndoc.cgi") == 0) { cgipgm = "csvinfo.cgi"; addoptl("CGI_COLUMNDOC_OPTS"); if (getenv("QUERY_STRING")) { char *t = (char *)malloc(strlen(getenv("QUERY_STRING")) + 35); sprintf(t, "QUERY_STRING=db=columndoc.csv&key=%s", getenv("QUERY_STRING")); putenv(t); } } else if (strcmp(cgipgm, "confreport-critical.cgi") == 0) { cgipgm = "confreport.cgi"; addoptl("CGI_CONFREPORT_OPTS"); addopt("--critical"); } else if (strcmp(cgipgm, "confreport.cgi") == 0) { addoptl("CGI_CONFREPORT_OPTS"); } else if (strcmp(cgipgm, "criticaleditor.cgi") == 0) { addoptl("CGI_CRITEDIT_OPTS"); } else if (strcmp(cgipgm, "criticalview.cgi") == 0) { addoptl("CGI_CRITVIEW_OPTS"); } else if (strcmp(cgipgm, "csvinfo.cgi") == 0) { addoptl("CGI_CSVINFO_OPTS"); } else if (strcmp(cgipgm, "datepage.cgi") == 0) { addoptl("CGI_DATEPAGE_OPTS"); } else if (strcmp(cgipgm, "enadis.cgi") == 0) { addoptl("CGI_ENADIS_OPTS"); } else if (strcmp(cgipgm, "eventlog.cgi") == 0) { addoptl("CGI_EVENTLOG_OPTS"); } else if (strcmp(cgipgm, "findhost.cgi") == 0) { addoptl("CGI_FINDHOST_OPTS"); } else if (strcmp(cgipgm, "ghostlist.cgi") == 0) { addoptl("CGI_GHOSTS_OPTS"); } else if (strcmp(cgipgm, "history.cgi") == 0) { addoptl("CGI_HIST_OPTS"); } else if (strcmp(cgipgm, "historylog.cgi") == 0) { cgipgm = "svcstatus.cgi"; addoptl("CGI_SVCHIST_OPTS"); addopt("--historical"); } else if (strcmp(cgipgm, "hostgraphs.cgi") == 0) { addoptl("CGI_HOSTGRAPHS_OPTS"); } else if (strcmp(cgipgm, "hostlist.cgi") == 0) { addoptl("CGI_HOSTLIST_OPTS"); } else if (strcmp(cgipgm, "nongreen.cgi") == 0) { cgipgm = "statusreport.cgi"; addopt("--filter=\"color=red,yellow\""); addopt("--all"); addopt("--heading=\"All non-green systems\""); addopt("--show-column"); addopt("--show-summary"); addopt("--link"); } else if (strcmp(cgipgm, "notifications.cgi") == 0) { addoptl("CGI_NOTIFYLOG_OPTS"); } else if (strcmp(cgipgm, "acknowledgements.cgi") == 0) { addoptl("CGI_ACKNOWLEDGEMENTSLOG_OPTS"); } else if (strcmp(cgipgm, "perfdata.cgi") == 0) { addoptl("CGI_PERFDATA_OPTS"); } else if (strcmp(cgipgm, "reportlog.cgi") == 0) { addoptl("CGI_REPLOG_OPTS"); } else if (strcmp(cgipgm, "report.cgi") == 0) { addoptl("CGI_REP_OPTS"); addoptl("XYMONGENREPOPTS"); } else if (strcmp(cgipgm, "showgraph.cgi") == 0) { addoptl("CGI_SHOWGRAPH_OPTS"); } else if (strcmp(cgipgm, "snapshot.cgi") == 0) { addoptl("CGI_SNAPSHOT_OPTS"); addopt("XYMONGENSNAPOPTS"); } else if (strcmp(cgipgm, "svcstatus-hist.cgi") == 0) { cgipgm = "svcstatus.cgi"; addoptl("CGI_SVCHIST_OPTS"); addopt("--historical"); } else if (strcmp(cgipgm, "svcstatus.cgi") == 0) { addoptl("CGI_SVC_OPTS"); } else if (strcmp(cgipgm, "svcstatus2.cgi") == 0) { cgipgm = "svcstatus.cgi"; addoptl("CGI_SVC_OPTS"); } else if (strcmp(cgipgm, "topchanges.cgi") == 0) { cgipgm = "eventlog.cgi"; addoptl("CGI_TOPCHANGE_OPTS"); } else if (strcmp(cgipgm, "useradm.cgi") == 0) { addoptl("CGI_USERADM_OPTS"); } else if (strcmp(cgipgm, "chpasswd.cgi") == 0) { addoptl("CGI_CHPASSWD_OPTS"); } else { /* Make sure we're being called as a CGI */ if ((strlen(cgipgm) <= 4) || (strcmp(cgipgm+strlen(cgipgm)-4, ".cgi") != 0)) { fprintf(stderr, "ERROR: cgiwrap was called as an unexpected CGI name: %s\n", cgipgm); printf("Status: 403\nContent-type: text/plain\n\nUnexpected CGI name: %s\n", cgipgm); return 1; } dbgprintf("called as an unexpected CGI name: %s", cgipgm); } addoptdone(); if (!haveenvopt && getenv("XYMONENV")) loadenv(getenv("XYMONENV"), NULL); snprintf(executable, sizeof(executable), "%s/bin/%s", xgetenv("XYMONHOME"), cgipgm); options[0] = executable; execv(executable, options); printf("Status: 500\nContent-type: text/plain\n\nExec failed for %s: %s\n", executable, strerror(errno)); errprintf("Exec failed for %s: %s\n", executable, strerror(errno)); return 1; } xymon-4.3.28/web/csvinfo.cgi.10000664000076400007640000000322513037531445016270 0ustar rpmbuildrpmbuild.TH CSVINFO.CGI 1 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME csvinfo.cgi \- CGI program to show host information from a CSV file .SH SYNOPSIS .B "csvinfo.cgi" .SH DESCRIPTION \fBcsvinfo.cgi\fR is invoked as a CGI script via the csvinfo.sh CGI wrapper. Based on the parameters it receives, it searches a comma- separated file for the matching host, and presents the information found as a table. csvinfo.cgi is passed a QUERY_STRING environment variable with the following parameters: key (string to search for, typically hostname) column (columnnumber to search - default 0) db (name of the CSV database file in $XYMONHOME/etc/, default hostinfo.csv) delimiter (delimiter character for columns, default semi-colon) CSV files are easily created from e.g. spreadsheets, by exporting them in CSV format. You should have one host per line, with the first line containing the column headings. Despite their name, the default delimiter for CSV files is the semi-colon - if you need a different delimiter, invoke csvinfo.cgi with the "delimiter=" in the query string. .SH Example usage This example shows how you can use the csvinfo CGI. It assumes you have a CSV-formatted file with information about the hosts stored as $XYMONHOME/etc/hostinfo.csv, and the hostname is in the first column of the file. .IP "Use with the xymongen \-\-docurl" The \-\-docurl option to .I xymongen(1) sets up all of the hostnames on your Xymon webpages to act as links to a CGI script. To invoke the csvinfo CGI script, run xymongen with the option .sp \-\-docurl=/cgi\-bin/csvinfo.sh?db=hostinfo.csv&key=%s .SH "SEE ALSO" hosts.cfg(5), xymonserver.cfg(5), xymongen(1) xymon-4.3.28/web/report.c0000664000076400007640000002466012603243142015453 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon report generation front-end. */ /* */ /* This is a front-end CGI that lets the user select reporting parameters, */ /* and then invokes xymongen to generate the report. When the report is */ /* ready, the user's browser is sent off to view the report. */ /* */ /* Copyright (C) 2003-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: report.c 7678 2015-10-01 14:42:42Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" char *reqenv[] = { "XYMONHOME", "XYMONREPDIR", "XYMONREPURL", NULL }; char *style = ""; time_t starttime = 0; time_t endtime = 0; char *suburl = ""; int csvoutput = 0; char csvdelim = ','; cgidata_t *cgidata = NULL; char *monthnames[13] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", NULL }; void errormsg(char *msg) { printf("Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); printf("Invalid request\n"); printf("%s\n", msg); exit(1); } void parse_query(void) { cgidata_t *cwalk; int startday, startmon, startyear; int endday, endmon, endyear; struct tm tmbuf; startday = startmon = startyear = endday = endmon = endyear = -1; cwalk = cgidata; while (cwalk) { /* * cwalk->name points to the name of the setting. * cwalk->value points to the value (may be an empty string). */ if (strcasecmp(cwalk->name, "start-day") == 0) { startday = atoi(cwalk->value); } else if (strcasecmp(cwalk->name, "start-mon") == 0) { char *errptr; startmon = strtol(cwalk->value, &errptr, 10) - 1; if (errptr == cwalk->value) { for (startmon=0; (monthnames[startmon] && strcmp(cwalk->value, monthnames[startmon])); startmon++) ; if (startmon >= 12) startmon = -1; } } else if (strcasecmp(cwalk->name, "start-yr") == 0) { startyear = atoi(cwalk->value); } else if (strcasecmp(cwalk->name, "end-day") == 0) { endday = atoi(cwalk->value); } else if (strcasecmp(cwalk->name, "end-mon") == 0) { char *errptr; endmon = strtol(cwalk->value, &errptr, 10) - 1; if (errptr == cwalk->value) { for (endmon=0; (monthnames[endmon] && strcmp(cwalk->value, monthnames[endmon])); endmon++) ; if (endmon > 12) endmon = -1; } } else if (strcasecmp(cwalk->name, "end-yr") == 0) { endyear = atoi(cwalk->value); } else if (strcasecmp(cwalk->name, "style") == 0) { style = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "suburl") == 0) { suburl = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "DoReport") == 0) { csvoutput = 0; } else if (strcasecmp(cwalk->name, "DoCSV") == 0) { csvoutput = 1; } else if (strcasecmp(cwalk->name, "csvdelim") == 0) { csvdelim = *cwalk->value; } cwalk = cwalk->next; } memset(&tmbuf, 0, sizeof(tmbuf)); tmbuf.tm_mday = startday; tmbuf.tm_mon = startmon; tmbuf.tm_year = startyear - 1900; tmbuf.tm_hour = 0; tmbuf.tm_min = 0; tmbuf.tm_sec = 0; tmbuf.tm_isdst = -1; /* Important! Or we mishandle DST periods */ starttime = mktime(&tmbuf); memset(&tmbuf, 0, sizeof(tmbuf)); tmbuf.tm_mday = endday; tmbuf.tm_mon = endmon; tmbuf.tm_year = endyear - 1900; tmbuf.tm_hour = 23; tmbuf.tm_min = 59; tmbuf.tm_sec = 59; tmbuf.tm_isdst = -1; /* Important! Or we mishandle DST periods */ endtime = mktime(&tmbuf); if ((starttime == -1) || (endtime == -1) || (starttime > getcurrenttime(NULL))) errormsg("Invalid parameters"); if (endtime > getcurrenttime(NULL)) endtime = getcurrenttime(NULL); if (starttime > endtime) { /* Swap start and end times */ time_t tmp; tmp = endtime; endtime = starttime; starttime = tmp; } } void cleandir(char *dirname) { DIR *dir; struct dirent *d; struct stat st; char fn[PATH_MAX]; time_t killtime = getcurrenttime(NULL)-86400; dir = opendir(dirname); if (dir == NULL) return; while ((d = readdir(dir))) { if (d->d_name[0] != '.') { sprintf(fn, "%s/%s", dirname, d->d_name); if ((stat(fn, &st) == 0) && (st.st_mtime < killtime)) { if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) { dbgprintf("rm %s\n", fn); unlink(fn); } else if (S_ISDIR(st.st_mode)) { dbgprintf("Cleaning directory %s\n", fn); cleandir(fn); dbgprintf("rmdir %s\n", fn); rmdir(fn); } else { /* Ignore file */ }; } } } } int main(int argc, char *argv[]) { char dirid[PATH_MAX]; char outdir[PATH_MAX]; char xymonwebenv[PATH_MAX]; char xymongencmd[PATH_MAX]; char xymongentimeopt[100]; char csvdelimopt[100]; char *xymongen_argv[20]; pid_t childpid; int childstat; char htmldelim[100]; char startstr[30], endstr[30]; int cleanupoldreps = 1; int argi, newargi; char *envarea = NULL; char *useragent = NULL; int usemultipart = 1; newargi = 0; xymongen_argv[newargi++] = xymongencmd; xymongen_argv[newargi++] = xymongentimeopt; for (argi=1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } else if (strcmp(argv[1], "--noclean") == 0) { cleanupoldreps = 0; } else { xymongen_argv[newargi++] = argv[argi]; } } redirect_cgilog("report"); cgidata = cgi_request(); if (cgidata == NULL) { /* Present the query form */ sethostenv("", "", "", colorname(COL_BLUE), NULL); printf("Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); showform(stdout, "report", "report_form", COL_BLUE, getcurrenttime(NULL)-86400, NULL, NULL); return 0; } useragent = getenv("HTTP_USER_AGENT"); if (useragent && strstr(useragent, "KHTML")) { /* KHTML (Konqueror, Safari) cannot handle multipart documents. */ usemultipart = 0; } envcheck(reqenv); parse_query(); /* * We need to set these variables up AFTER we have put them into the xymongen_argv[] array. * We cannot do it before, because we need the environment that the command-line options * might provide. */ if (xgetenv("XYMONGEN")) sprintf(xymongencmd, "%s", xgetenv("XYMONGEN")); else sprintf(xymongencmd, "%s/bin/xymongen", xgetenv("XYMONHOME")); snprintf(xymongentimeopt, sizeof(xymongentimeopt)-1,"--reportopts=%u:%u:1:%s", (unsigned int)starttime, (unsigned int)endtime, style); sprintf(dirid, "%lu-%u", (unsigned long)getpid(), (unsigned int)getcurrenttime(NULL)); if (!csvoutput) { sprintf(outdir, "%s/%s", xgetenv("XYMONREPDIR"), dirid); mkdir(outdir, 0755); xymongen_argv[newargi++] = outdir; sprintf(xymonwebenv, "XYMONWEB=%s/%s", xgetenv("XYMONREPURL"), dirid); putenv(xymonwebenv); } else { sprintf(outdir, "--csv=%s/%s.csv", xgetenv("XYMONREPDIR"), dirid); xymongen_argv[newargi++] = outdir; sprintf(csvdelimopt, "--csvdelim=%c", csvdelim); xymongen_argv[newargi++] = csvdelimopt; } xymongen_argv[newargi++] = NULL; if (usemultipart) { /* Output the "please wait for report ... " thing */ snprintf(htmldelim, sizeof(htmldelim)-1, "xymonrep-%lu-%u", (unsigned long)getpid(), (unsigned int)getcurrenttime(NULL)); printf("Content-type: multipart/mixed;boundary=%s\n", htmldelim); printf("\n"); printf("--%s\n", htmldelim); printf("Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); /* It's ok with these hardcoded values, as they are not used for this page */ sethostenv("", "", "", colorname(COL_BLUE), NULL); sethostenv_report(starttime, endtime, 97.0, 99.995); headfoot(stdout, "repnormal", "", "header", COL_BLUE); strftime(startstr, sizeof(startstr), "%b %d %Y", localtime(&starttime)); strftime(endstr, sizeof(endstr), "%b %d %Y", localtime(&endtime)); printf("
 \n"); printf("



\n"); printf("

Generating report for the period: %s", htmlquoted(startstr)); printf(" - %s ", htmlquoted(endstr)); printf("(%s)
\n", htmlquoted(style)); printf("

\n"); fflush(stdout); } /* Go do the report */ childpid = fork(); if (childpid == 0) { execv(xymongencmd, xymongen_argv); } else if (childpid > 0) { wait(&childstat); /* Ignore SIGHUP so we don't get killed during cleanup of XYMONREPDIR */ signal(SIGHUP, SIG_IGN); if (WIFEXITED(childstat) && (WEXITSTATUS(childstat) != 0) ) { char msg[4096]; if (usemultipart) printf("--%s\n\n", htmldelim); sprintf(msg, "Could not generate report.
\nCheck that the %s/www/rep/ directory has permissions '-rwxrwxr-x' (775)
\n and that is is set to group %d", xgetenv("XYMONHOME"), (int)getgid()); errormsg(msg); } else { /* Send the browser off to the report */ if (usemultipart) { printf("Done...Report is here.

\n", xgetenv("XYMONREPURL"), dirid, suburl); fflush(stdout); printf("--%s\n\n", htmldelim); } printf("Content-Type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); printf("\n"); if (!csvoutput) { printf("Report is available here\n", xgetenv("XYMONREPURL"), dirid, suburl); } else { printf("Report is available here\n", xgetenv("XYMONREPURL"), dirid); } if (usemultipart) printf("\n--%s\n", htmldelim); fflush(stdout); } if (cleanupoldreps) cleandir(xgetenv("XYMONREPDIR")); } else { if (usemultipart) printf("--%s\n\n", htmldelim); printf("Content-Type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); errormsg("Fork failed"); } return 0; } xymon-4.3.28/web/boilerplate.c0000664000076400007640000000423712277125340016446 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon webpage generator tool. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: boilerplate.c 7435 2014-02-13 11:22:08Z storner $"; #include #include #include #include "libxymon.h" static void errormsg(char *msg) { printf("Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); printf("Invalid request\n"); printf("%s\n", msg); exit(1); } void parse_query(void) { cgidata_t *cgidata, *cwalk; cgidata = cgi_request(); if (cgidata == NULL) errormsg(cgi_error()); cwalk = cgidata; while (cwalk) { /* * cwalk->name points to the name of the setting. * cwalk->value points to the value (may be an empty string). */ cwalk = cwalk->next; } } int main(int argc, char *argv[]) { int argi; char *envarea = NULL; char *hffile = "boilerplate"; int bgcolor = COL_BLUE; for (argi = 1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } else if (strcmp(argv[argi], "--debug") == 0) { debug = 1; } else if (argnmatch(argv[argi], "--hffile=")) { char *p = strchr(argv[argi], '='); hffile = strdup(p+1); } } parse_query(); fprintf(stdout, "Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); headfoot(stdout, hffile, "", "header", bgcolor); headfoot(stdout, hffile, "", "footer", bgcolor); return 0; } xymon-4.3.28/web/confreport.cgi.10000664000076400007640000000344113037531445017002 0ustar rpmbuildrpmbuild.TH CONFREPORT.CGI 1 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME confreport.cgi \- Xymon Configuration report .SH SYNOPSIS .B "confreport.cgi" .SH DESCRIPTION \fBconfreport.cgi\fR is invoked as a CGI script via the confreport.sh CGI wrapper. \fBconfreport.cgi\fR provides a plain HTML (Web) report of the Xymon configuration for a group of hosts; which hosts are included is determined by the hosts available on the webpage from where the CGI script is invoked. The configuration report include the hostnames, a list of the statuses monitored for each host, and if applicable any configuration settings affecting these. Alerts that may be triggered by status changes are also included. The report is plain HTML without any images included, and therefore suitable for inclusion into e-mails or other documents that may be accessed outside the Xymon system. .SH OPTIONS .IP "\-\-critical" Report only on the statuses that are configured to show up on the \fBCritical Systems\fR view. .IP "\-\-old\-nk\-config" Use the deprecated \fBNK\fR tag in hosts.cfg to determine if tests appear on the Critical Systems view. .IP "\-\-env=FILENAME" Loads the environment defined in FILENAME before executing the CGI script. .IP "\-\-area=NAME" Load environment variables for a specific area. NB: if used, this option must appear before any \-\-env=FILENAME option. .IP "\-\-debug" Enables debugging output. .IP "\-\-nkconfig=FILENAME" Use FILENAME as the configuration file for the Critical Systems information. The default is to load this from $XYMONHOME/etc/critical.cfg .SH BUGS Client-side configuration done in the .I analysis.cfg(5) is not currently reflected in the report. Critical Systems view configuration is not reflected in the report. .SH "SEE ALSO" hosts.cfg(5), alerts.cfg(5), analysis.cfg(5), xymon(7) xymon-4.3.28/web/criticaleditor.c0000664000076400007640000003065312666146167017162 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon CGI for administering the critical.cfg file */ /* */ /* Copyright (C) 2006-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: criticaleditor.c 7949 2016-03-03 23:44:55Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" static char *operator = NULL; static enum { CRITEDIT_FIND, CRITEDIT_NEXT, CRITEDIT_UPDATE, CRITEDIT_DELETE, CRITEDIT_ADDCLONE, CRITEDIT_DROPCLONE } editaction = CRITEDIT_FIND; static char *rq_hostname = NULL; static char *rq_service = NULL; static int rq_priority = 0; static char *rq_group = NULL; static char *rq_extra = NULL; static char *rq_crittime = NULL; static time_t rq_start = 0; static time_t rq_end = 0; static char *rq_clonestoadd = NULL; static char *rq_clonestodrop = NULL; static int rq_dropevenifcloned = 0; static void parse_query(void) { cgidata_t *cgidata = cgi_request(); cgidata_t *cwalk; char *rq_critwkdays = NULL; char *rq_critslastart = NULL; char *rq_critslaend = NULL; int rq_startday = 0; int rq_startmon = 0; int rq_startyear = 0; int rq_endday = 0; int rq_endmon = 0; int rq_endyear = 0; cwalk = cgidata; while (cwalk) { if (strcasecmp(cwalk->name, "Find") == 0) { editaction = CRITEDIT_FIND; } else if (strcasecmp(cwalk->name, "Next") == 0) { editaction = CRITEDIT_NEXT; } else if (strcasecmp(cwalk->name, "Update") == 0) { editaction = CRITEDIT_UPDATE; } else if (strcasecmp(cwalk->name, "Drop") == 0) { editaction = CRITEDIT_DELETE; } else if (strcasecmp(cwalk->name, "Clone") == 0) { /* The "clone" button does both things */ editaction = CRITEDIT_ADDCLONE; } else if (strcasecmp(cwalk->name, "HOSTNAME") == 0) { if (*cwalk->value) rq_hostname = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "SERVICE") == 0) { if (*cwalk->value) rq_service = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "PRIORITY") == 0) { rq_priority = atoi(cwalk->value); } else if (strcasecmp(cwalk->name, "GROUP") == 0) { if (*cwalk->value) rq_group = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "CRITWKDAYS") == 0) { if (*cwalk->value) { if (!rq_critwkdays) rq_critwkdays = strdup(cwalk->value); else { rq_critwkdays = (char *)realloc(rq_critwkdays, strlen(rq_critwkdays) + strlen(cwalk->value) + 1); strcat(rq_critwkdays, cwalk->value); } } } else if (strcasecmp(cwalk->name, "CRITSTARTHOUR") == 0) { if (*cwalk->value) rq_critslastart = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "CRITENDHOUR") == 0) { if (*cwalk->value) rq_critslaend = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "start-day") == 0) { rq_startday = atoi(cwalk->value); } else if (strcasecmp(cwalk->name, "start-mon") == 0) { rq_startmon = atoi(cwalk->value); } else if (strcasecmp(cwalk->name, "start-yr") == 0) { rq_startyear = atoi(cwalk->value); } else if (strcasecmp(cwalk->name, "end-day") == 0) { rq_endday = atoi(cwalk->value); } else if (strcasecmp(cwalk->name, "end-mon") == 0) { rq_endmon = atoi(cwalk->value); } else if (strcasecmp(cwalk->name, "end-yr") == 0) { rq_endyear = atoi(cwalk->value); } else if (strcasecmp(cwalk->name, "EXTRA") == 0) { if (*cwalk->value) rq_extra = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "DROPEVENIFCLONED") == 0) { rq_dropevenifcloned = 1; } else if (strcasecmp(cwalk->name, "CRITEDITADDCLONES") == 0) { if (*cwalk->value) rq_clonestoadd = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "CRITEDITCLONELIST") == 0) { if (rq_clonestodrop) { rq_clonestodrop = (char *)realloc(rq_clonestodrop, strlen(rq_clonestodrop) + strlen(cwalk->value) + 2); strcat(rq_clonestodrop, " "); strcat(rq_clonestodrop, cwalk->value); } else { if (*cwalk->value) rq_clonestodrop = strdup(cwalk->value); } } cwalk = cwalk->next; } if (editaction == CRITEDIT_UPDATE) { struct tm tm; if ((rq_startday == 0) || (rq_startmon == 0) || (rq_startyear == 0)) rq_start = -1; else { memset(&tm, 0, sizeof(tm)); tm.tm_mday = rq_startday; tm.tm_mon = rq_startmon - 1; tm.tm_year = rq_startyear - 1900; tm.tm_isdst = -1; rq_start = mktime(&tm); } if ((rq_endday == 0) || (rq_endmon == 0) || (rq_endyear == 0)) rq_end = -1; else { memset(&tm, 0, sizeof(tm)); tm.tm_mday = rq_endday; tm.tm_mon = rq_endmon - 1; tm.tm_year = rq_endyear - 1900; tm.tm_isdst = -1; rq_end = mktime(&tm); } rq_crittime = (char *)malloc(strlen(rq_critwkdays) + strlen(rq_critslastart) + strlen(rq_critslaend) + 3); sprintf(rq_crittime, "%s:%s:%s", rq_critwkdays, rq_critslastart, rq_critslaend); } else if (editaction == CRITEDIT_ADDCLONE) { if (!rq_clonestoadd && rq_clonestodrop) editaction = CRITEDIT_DROPCLONE; } } void findrecord(char *hostname, char *service, char *nodatawarning, char *isclonewarning, char *hascloneswarning) { critconf_t *rec = NULL; int isaclone = 0; int hasclones = 0; char warnmsg[4096]; /* Setup the list of cloned records */ sethostenv_critclonelist_clear(); if (hostname && *hostname) { char *key, *realkey, *clonekey; critconf_t *clonerec; if (service && *service) { /* First check if the host+service is really a clone of something else */ key = (char *)malloc(strlen(hostname) + strlen(service) + 2); sprintf(key, "%s|%s", hostname, service); rec = get_critconfig(key, CRITCONF_FIRSTMATCH, &realkey); } else { key = strdup(hostname); rec = get_critconfig(key, CRITCONF_FIRSTHOSTMATCH, &realkey); } if (rec && realkey && (strcmp(key, realkey) != 0)) { char *p; xfree(key); key = strdup(realkey); hostname = realkey; p = strchr(realkey, '|'); if (p) { *p = '\0'; service = p+1; } isaclone = 1; } xfree(key); /* Next, see what hosts are clones of this one */ clonerec = get_critconfig(NULL, CRITCONF_RAW_FIRST, &clonekey); while (clonerec) { if ((*(clonekey + strlen(clonekey) -1) == '=') && (strcmp(hostname, (char *)clonerec) == 0)) { sethostenv_critclonelist_add(clonekey); hasclones = 1; } clonerec = get_critconfig(NULL, CRITCONF_RAW_NEXT, &clonekey); } } else { hostname = ""; } if (!service || !(*service)) service=""; if (rec) sethostenv_critedit(rec->updinfo, rec->priority, rec->ttgroup, rec->starttime, rec->endtime, rec->crittime, rec->ttextra); else sethostenv_critedit("", 0, NULL, 0, 0, NULL, NULL); sethostenv(hostname, "", service, colorname(COL_BLUE), NULL); *warnmsg = '\0'; if (!rec && nodatawarning) snprintf(warnmsg, sizeof(warnmsg), "%s", nodatawarning); if (isaclone && isclonewarning) snprintf(warnmsg, sizeof(warnmsg), "%s", isclonewarning); if (hasclones && hascloneswarning) snprintf(warnmsg, sizeof(warnmsg), "%s", hascloneswarning); printf("Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); showform(stdout, "critedit", "critedit_form", COL_BLUE, getcurrenttime(NULL), warnmsg, NULL); } void nextrecord(char *hostname, char *service, char *isclonewarning, char *hascloneswarning) { critconf_t *rec; char *nexthost, *nextservice; /* First check if the host+service is really a clone of something else */ if (hostname && service) { char *key; key = (char *)malloc(strlen(hostname) + strlen(service) + 2); sprintf(key, "%s|%s", hostname, service); rec = get_critconfig(key, CRITCONF_FIRSTMATCH, NULL); if (rec) rec = get_critconfig(NULL, CRITCONF_NEXT, NULL); xfree(key); } else { rec = get_critconfig(NULL, CRITCONF_FIRST, NULL); } if (rec) { nexthost = strdup(rec->key); nextservice = strchr(nexthost, '|'); if (nextservice) { *nextservice = '\0'; nextservice++; } } else { nexthost = strdup(""); nextservice = ""; } findrecord(nexthost, nextservice, NULL, isclonewarning, hascloneswarning); xfree(nexthost); } void updaterecord(char *hostname, char *service) { critconf_t *rec = NULL; if (hostname && service) { char *key = (char *)malloc(strlen(hostname) + strlen(service) + 2); char *realkey; char datestr[20]; time_t now = getcurrenttime(NULL); strftime(datestr, sizeof(datestr), "%Y-%m-%d %H:%M:%S", localtime(&now)); sprintf(key, "%s|%s", hostname, service); rec = get_critconfig(key, CRITCONF_FIRSTMATCH, &realkey); if (rec == NULL) { rec = (critconf_t *)calloc(1, sizeof(critconf_t)); rec->key = strdup(key); } rec->priority = rq_priority; rec->starttime = (rq_start > 0) ? rq_start : 0; rec->endtime = (rq_end > 0) ? rq_end : 0; if (rec->crittime) { xfree(rec->crittime); rec->crittime = NULL; } if (rq_crittime) { rec->crittime = (strcmp(rq_crittime, "*:0000:2400") == 0) ? NULL : strdup(rq_crittime); } if (rec->ttgroup) xfree(rec->ttgroup); rec->ttgroup = (rq_group ? strdup(rq_group) : NULL); if (rec->ttextra) xfree(rec->ttextra); rec->ttextra = (rq_extra ? strdup(rq_extra) : NULL); if (rec->updinfo) xfree(rec->updinfo); rec->updinfo = (char *)malloc(strlen(operator) + strlen(datestr) + 2); sprintf(rec->updinfo, "%s %s", operator, datestr); update_critconfig(rec); xfree(key); } findrecord(hostname, service, NULL, NULL, NULL); } void addclone(char *origin, char *newhosts, char *service) { char *newclone; newclone = strtok(newhosts, " "); while (newclone) { addclone_critconfig(origin, newclone); newclone = strtok(NULL, " "); } update_critconfig(NULL); findrecord(origin, service, NULL, NULL, NULL); } void dropclone(char *origin, char *drops, char *service) { char *drop; drop = strtok(drops, " "); while (drop) { dropclone_critconfig(drop); drop = strtok(NULL, " "); } update_critconfig(NULL); findrecord(origin, service, NULL, NULL, NULL); } void deleterecord(char *hostname, char *service, int evenifcloned) { char *key; key = (char *)malloc(strlen(hostname) + strlen(service) + 2); sprintf(key, "%s|%s", hostname, service); if (delete_critconfig(key, evenifcloned) == 0) { update_critconfig(NULL); } findrecord(hostname, service, NULL, NULL, (evenifcloned ? "Warning: Orphans will be ignored" : "Will not delete record that is cloned")); } int main(int argc, char *argv[]) { int argi; char *envarea = NULL; char *configfn = NULL; operator = getenv("REMOTE_USER"); if (!operator) operator = "Anonymous"; for (argi = 1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } else if (argnmatch(argv[argi], "--config=")) { char *p = strchr(argv[argi], '='); configfn = strdup(p+1); } else if (strcmp(argv[argi], "--debug") == 0) { debug = 1; } } redirect_cgilog("criticaleditor"); /* We only want to accept posts from certain pages */ if (cgi_ispost()) { char cgisource[1024]; char *p; p = csp_header("criticaleditor"); if (p) fprintf(stdout, "%s", p); snprintf(cgisource, sizeof(cgisource), "%s/%s", xgetenv("SECURECGIBINURL"), "criticaleditor"); if (!cgi_refererok(cgisource)) { fprintf(stdout, "Location: %s.sh?\n\n", cgisource); return 0; } } parse_query(); load_critconfig(configfn); switch (editaction) { case CRITEDIT_FIND: findrecord(rq_hostname, rq_service, ((rq_hostname && rq_service) ? "No record for this host/service" : NULL), "Cloned - showing master record", NULL); break; case CRITEDIT_NEXT: nextrecord(rq_hostname, rq_service, "Cloned - showing master record", NULL); break; case CRITEDIT_UPDATE: updaterecord(rq_hostname, rq_service); break; case CRITEDIT_DELETE: deleterecord(rq_hostname, rq_service, rq_dropevenifcloned); break; case CRITEDIT_ADDCLONE: addclone(rq_hostname, rq_clonestoadd, rq_service); break; case CRITEDIT_DROPCLONE: dropclone(rq_hostname, rq_clonestodrop, rq_service); break; } return 0; } xymon-4.3.28/web/acknowledgements.c0000664000076400007640000001041212503132277017465 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon acknowledgements log viewer */ /* */ /* Copyright (C) 2007-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: acknowledgements.c 6712 2011-07-31 21:01:52Z storner $"; #include #include #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" int maxcount = 100; /* Default: Include last 100 events */ int maxminutes = 1440; /* Default: for the past 24 hours */ char *totime = NULL; char *fromtime = NULL; char *pageregex = NULL; char *expageregex = NULL; char *hostregex = NULL; char *exhostregex = NULL; char *testregex = NULL; char *extestregex = NULL; char *rcptregex = NULL; char *exrcptregex = NULL; cgidata_t *cgidata = NULL; static void parse_query(void) { cgidata_t *cwalk; cwalk = cgidata; while (cwalk) { /* * cwalk->name points to the name of the setting. * cwalk->value points to the value (may be an empty string). */ if (strcasecmp(cwalk->name, "MAXCOUNT") == 0) { maxcount = atoi(cwalk->value); } else if (strcasecmp(cwalk->name, "MAXTIME") == 0) { maxminutes = atoi(cwalk->value); } else if (strcasecmp(cwalk->name, "FROMTIME") == 0) { if (*(cwalk->value)) fromtime = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "TOTIME") == 0) { if (*(cwalk->value)) totime = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "HOSTMATCH") == 0) { if (*(cwalk->value)) hostregex = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "EXHOSTMATCH") == 0) { if (*(cwalk->value)) exhostregex = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "TESTMATCH") == 0) { if (*(cwalk->value)) testregex = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "EXTESTMATCH") == 0) { if (*(cwalk->value)) extestregex = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "PAGEMATCH") == 0) { if (*(cwalk->value)) pageregex = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "EXPAGEMATCH") == 0) { if (*(cwalk->value)) expageregex = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "RCPTMATCH") == 0) { if (*(cwalk->value)) rcptregex = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "EXRCPTMATCH") == 0) { if (*(cwalk->value)) exrcptregex = strdup(cwalk->value); } cwalk = cwalk->next; } } int main(int argc, char *argv[]) { int argi; char *envarea = NULL; for (argi = 1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } else if (strcmp(argv[argi], "--debug") == 0) { debug = 1; } } redirect_cgilog("acknowledgements"); load_hostnames(xgetenv("HOSTSCFG"), NULL, get_fqdn()); fprintf(stdout, "Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); cgidata = cgi_request(); if (cgidata == NULL) { /* Present the query form */ sethostenv("", "", "", colorname(COL_BLUE), NULL); showform(stdout, "acknowledgements", "acknowledgements_form", COL_BLUE, getcurrenttime(NULL), NULL, NULL); return 0; } parse_query(); /* Now generate the webpage */ headfoot(stdout, "acknowledgements", "", "header", COL_GREEN); fprintf(stdout, "
\n"); do_acknowledgementslog(stdout, maxcount, maxminutes, fromtime, totime, pageregex, expageregex, hostregex, exhostregex, testregex, extestregex, rcptregex, exrcptregex); fprintf(stdout, "
\n"); headfoot(stdout, "acknowledgements", "", "footer", COL_GREEN); return 0; } xymon-4.3.28/web/svcstatus-info.h0000664000076400007640000000165311615341300017127 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __SVCSTATUS_INFO_H__ #define __SVCSTATUS_INFO_H__ extern int showenadis; extern int usejsvalidation; extern int newcritconfig; extern char *generate_info(char *hostname, char *critconfigfn); #endif xymon-4.3.28/web/critical.cfg.50000664000076400007640000000171513037531445016416 0ustar rpmbuildrpmbuild.TH CRITICAL.CFG 5 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME critical.cfg \- Configuration of the showgraph CGI .SH SYNOPSIS .B $XYMONHOME/etc/critical.cfg .SH DESCRIPTION .I critical.cgi(1) uses the configuration file $XYMONHOME/etc/critical.cfg to determine which of the statuses currently in a red or yellow state should appear on the Critical Systems view. This file should not be edited manually. It is maintained by the .I criticaleditor.cgi(1) utility via a web-based frontend. .SH FILE PERMISSIONS Since the file is maintained by a web front-end tool, the userid running Web CGI scripts must have write-permission to the file. Typically, this means it must have a group-ownership matching your webserver userid, and group-write permissions (mode 664). When editing the file with the web front-end, a backup file is created. Therefore the critical.cfg.bak file should have identical permissions. .SH "SEE ALSO" criticalview.cgi(1), criticaleditor.cgi(1) xymon-4.3.28/web/eventlog.c0000664000076400007640000003375711615341300015767 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon eventlog generator tool. */ /* */ /* This displays the "eventlog" found on the "All non-green status" page. */ /* It also implements a CGI tool to show an eventlog for a given period of */ /* time, as a reporting function. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* Host/test/color/start/end filtering code by Eric Schwimmer 2005 */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: eventlog.c 6712 2011-07-31 21:01:52Z storner $"; #include #include #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" int maxcount = 100; /* Default: Include last 100 events */ int maxminutes = 240; /* Default: for the past 4 hours */ char *totime = NULL; char *fromtime = NULL; char *hostregex = NULL; char *exhostregex = NULL; char *testregex = NULL; char *extestregex = NULL; char *pageregex = NULL; char *expageregex = NULL; char *colorregex = NULL; int ignoredialups = 0; int topcount = 0; eventsummary_t summarybar = XYMON_S_NONE; countsummary_t counttype = XYMON_COUNT_NONE; char *webfile_hf = "event"; char *webfile_form = "event_form"; cgidata_t *cgidata = NULL; char *periodstring = NULL; static void parse_query(void) { cgidata_t *cwalk; cwalk = cgidata; while (cwalk) { /* * cwalk->name points to the name of the setting. * cwalk->value points to the value (may be an empty string). */ if (strcasecmp(cwalk->name, "MAXCOUNT") == 0) { maxcount = atoi(cwalk->value); } else if (strcasecmp(cwalk->name, "MAXTIME") == 0) { maxminutes = atoi(cwalk->value); } else if (strcasecmp(cwalk->name, "FROMTIME") == 0) { if (*(cwalk->value)) fromtime = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "TOTIME") == 0) { if (*(cwalk->value)) totime = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "HOSTMATCH") == 0) { if (*(cwalk->value)) hostregex = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "EXHOSTMATCH") == 0) { if (*(cwalk->value)) exhostregex = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "TESTMATCH") == 0) { if (*(cwalk->value)) testregex = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "EXTESTMATCH") == 0) { if (*(cwalk->value)) extestregex = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "PAGEMATCH") == 0) { if (*(cwalk->value)) pageregex = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "EXPAGEMATCH") == 0) { if (*(cwalk->value)) expageregex = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "COLORMATCH") == 0) { if (*(cwalk->value)) colorregex = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "NODIALUPS") == 0) { ignoredialups = 1; } else if (strcasecmp(cwalk->name, "TOP") == 0) { if (*(cwalk->value)) topcount = atoi(cwalk->value); } else if (strcasecmp(cwalk->name, "SUMMARY") == 0) { if (strcasecmp(cwalk->value, "hosts") == 0) summarybar = XYMON_S_HOST_BREAKDOWN; else if (strcasecmp(cwalk->value, "services") == 0) summarybar = XYMON_S_SERVICE_BREAKDOWN; else summarybar = XYMON_S_NONE; } else if (strcasecmp(cwalk->name, "COUNTTYPE") == 0) { if (strcasecmp(cwalk->value, "events") == 0) counttype = XYMON_COUNT_EVENTS; else if (strcasecmp(cwalk->value, "duration") == 0) counttype = XYMON_COUNT_DURATION; else counttype = XYMON_COUNT_NONE; } else if (strcasecmp(cwalk->name, "TIMETXT") == 0) { if (*(cwalk->value)) periodstring = strdup(cwalk->value); } cwalk = cwalk->next; } } void show_topchanges(FILE *output, countlist_t *hostcounthead, countlist_t *svccounthead, event_t *eventhead, int topcount, time_t firstevent, time_t lastevent) { fprintf(output, "

%s

\n", (periodstring ? periodstring : "")); fprintf(output, "\n"); fprintf(output, "\n"); if (hostcounthead && (output != NULL)) { countlist_t *cwalk; int i; unsigned long others = 0, totalcount = 0; strbuffer_t *s = newstrbuffer(0); strbuffer_t *othercriteria = newstrbuffer(0); if (hostregex) { addtobuffer(othercriteria, "&HOSTMATCH="); addtobuffer(othercriteria, hostregex); } if (exhostregex) addtobuffer(s, exhostregex); if (testregex) { addtobuffer(othercriteria, "&TESTMATCH="); addtobuffer(othercriteria, testregex); } if (extestregex) { addtobuffer(othercriteria, "&EXTESTMATCH="); addtobuffer(othercriteria, extestregex); } if (pageregex) { addtobuffer(othercriteria, "&PAGEMATCH="); addtobuffer(othercriteria, pageregex); } if (expageregex) { addtobuffer(othercriteria, "&EXPAGEMATCH="); addtobuffer(othercriteria, expageregex); } if (colorregex) { addtobuffer(othercriteria, "&COLORMATCH="); addtobuffer(othercriteria, colorregex); } if (ignoredialups) { addtobuffer(othercriteria, "&NODIALUPS=on"); } addtobuffer(othercriteria, "&SUMMARY=services"); addtobuffer(othercriteria, "&TIMETXT="); addtobuffer(othercriteria, periodstring); if (counttype == XYMON_COUNT_EVENTS) addtobuffer(othercriteria, "&COUNTTYPE=events"); else if (counttype == XYMON_COUNT_DURATION) addtobuffer(othercriteria, "&COUNTTYPE=duration"); fprintf(output, "\n"); freestrbuffer(s); freestrbuffer(othercriteria); } if (svccounthead && (output != NULL)) { countlist_t *cwalk; int i; unsigned long others = 0, totalcount = 0; strbuffer_t *s = newstrbuffer(0); strbuffer_t *othercriteria = newstrbuffer(0); if (hostregex) { addtobuffer(othercriteria, "&HOSTMATCH="); addtobuffer(othercriteria, hostregex); } if (exhostregex) { addtobuffer(othercriteria, "&EXHOSTMATCH="); addtobuffer(othercriteria, exhostregex); } if (testregex) { addtobuffer(othercriteria, "&TESTMATCH="); addtobuffer(othercriteria, testregex); } if (extestregex) addtobuffer(s, extestregex); if (pageregex) { addtobuffer(othercriteria, "&PAGEMATCH="); addtobuffer(othercriteria, pageregex); } if (expageregex) { addtobuffer(othercriteria, "&EXPAGEMATCH="); addtobuffer(othercriteria, expageregex); } if (colorregex) { addtobuffer(othercriteria, "&COLORMATCH="); addtobuffer(othercriteria, colorregex); } if (ignoredialups) { addtobuffer(othercriteria, "&NODIALUPS=on"); } addtobuffer(othercriteria, "&SUMMARY=hosts"); addtobuffer(othercriteria, "&TIMETXT="); addtobuffer(othercriteria, periodstring); if (counttype == XYMON_COUNT_EVENTS) addtobuffer(othercriteria, "&COUNTTYPE=events"); else if (counttype == XYMON_COUNT_DURATION) addtobuffer(othercriteria, "&COUNTTYPE=duration"); fprintf(output, "\n"); freestrbuffer(s); freestrbuffer(othercriteria); } fprintf(output, "\n"); fprintf(output, "
\n"); fprintf(output, " \n", topcount); fprintf(output, " \n", topcount); fprintf(output, " \n", (counttype == XYMON_COUNT_EVENTS) ? "State changes" : "Seconds red/yellow"); /* Compute the total count */ for (i=0, cwalk=hostcounthead; (cwalk); i++, cwalk=cwalk->next) totalcount += cwalk->total; for (i=0, cwalk=hostcounthead; (cwalk && (cwalk->total > 0)); i++, cwalk=cwalk->next) { if (i < topcount) { fprintf(output, " \n", xmh_item(cwalk->src, XMH_HOSTNAME), (unsigned long)firstevent, (unsigned long)lastevent, STRBUF(othercriteria), xmh_item(cwalk->src, XMH_HOSTNAME), cwalk->total, ((100.0 * cwalk->total) / totalcount)); if (STRBUFLEN(s) > 0) addtobuffer(s, "|"); addtobuffer(s, "^"); addtobuffer(s, xmh_item(cwalk->src, XMH_HOSTNAME)); addtobuffer(s, "$"); } else { others += cwalk->total; } } fprintf(output, " \n", STRBUF(s), (unsigned long)firstevent, (unsigned long)lastevent, STRBUF(othercriteria), "Other hosts", others, ((100.0 * others) / totalcount)); fprintf(output, " \n"); fprintf(output, " \n", totalcount); fprintf(output, "
Top %d hosts
Host%s
%s%lu(%6.2f %%)
%s%lu(%6.2f %%)

Total%lu 
\n"); fprintf(output, "
\n"); fprintf(output, " \n", topcount); fprintf(output, " \n", topcount); fprintf(output, " \n", (counttype == XYMON_COUNT_EVENTS) ? "State changes" : "Seconds red/yellow"); /* Compute the total count */ for (i=0, cwalk=svccounthead; (cwalk); i++, cwalk=cwalk->next) totalcount += cwalk->total; for (i=0, cwalk=svccounthead; (cwalk && (cwalk->total > 0)); i++, cwalk=cwalk->next) { if (i < topcount) { fprintf(output, " \n", ((htnames_t *)cwalk->src)->name, (unsigned long)firstevent, (unsigned long)lastevent, STRBUF(othercriteria), ((htnames_t *)cwalk->src)->name, cwalk->total, ((100.0 * cwalk->total) / totalcount)); if (STRBUFLEN(s) > 0) addtobuffer(s, "|"); addtobuffer(s, "^"); addtobuffer(s, ((htnames_t *)cwalk->src)->name); addtobuffer(s, "$"); } else { others += cwalk->total; } } fprintf(output, " \n", STRBUF(s), (unsigned long)firstevent, (unsigned long)lastevent, STRBUF(othercriteria), "Other services", others, ((100.0 * others) / totalcount)); fprintf(output, " \n"); fprintf(output, " \n", totalcount); fprintf(output, "
Top %d services
Service%s
%s%lu(%6.2f %%)
%s%lu(%6.2f %%)

Total%lu 
\n"); fprintf(output, "
\n"); } int main(int argc, char *argv[]) { int argi; char *envarea = NULL; for (argi=1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } else if (argnmatch(argv[argi], "--top")) { topcount = 10; webfile_hf = "topchanges"; webfile_form = "topchanges_form"; maxminutes = -1; maxcount = -1; } else if (strcmp(argv[argi], "--debug=")) { debug = 1; } } redirect_cgilog("eventlog"); load_hostnames(xgetenv("HOSTSCFG"), NULL, get_fqdn()); fprintf(stdout, "Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); cgidata = cgi_request(); if (cgidata == NULL) { /* Present the query form */ sethostenv("", "", "", colorname(COL_BLUE), NULL); showform(stdout, webfile_hf, webfile_form, COL_BLUE, getcurrenttime(NULL), NULL, NULL); return 0; } parse_query(); if (periodstring && (fromtime || totime)) { strbuffer_t *pstr = newstrbuffer(1024); if (fromtime && totime) { addtobuffer(pstr, "Events between "); addtobuffer(pstr, htmlquoted(fromtime)); addtobuffer(pstr, "- "); addtobuffer(pstr, htmlquoted(totime)); } else if (fromtime) { addtobuffer(pstr, "Events since "); addtobuffer(pstr, htmlquoted(fromtime)); } else if (totime) { addtobuffer(pstr, "Events until "); addtobuffer(pstr, htmlquoted(totime)); } xfree(periodstring); periodstring = grabstrbuffer(pstr); } /* Now generate the webpage */ headfoot(stdout, webfile_hf, "", "header", COL_GREEN); fprintf(stdout, "
\n"); if (topcount == 0) { do_eventlog(stdout, maxcount, maxminutes, fromtime, totime, pageregex, expageregex, hostregex, exhostregex, testregex, extestregex, colorregex, ignoredialups, NULL, NULL, NULL, NULL, counttype, summarybar, periodstring); } else { countlist_t *hcounts, *scounts; event_t *events; time_t firstevent, lastevent; do_eventlog(NULL, -1, -1, fromtime, totime, pageregex, expageregex, hostregex, exhostregex, testregex, extestregex, colorregex, ignoredialups, NULL, &events, &hcounts, &scounts, counttype, XYMON_S_NONE, NULL); lastevent = (totime ? eventreport_time(totime) : getcurrenttime(NULL)); if (fromtime) { firstevent = eventreport_time(fromtime); } else if (events) { event_t *ewalk; ewalk = events; while (ewalk->next) ewalk = ewalk->next; firstevent = ewalk->eventtime; } else firstevent = 0; show_topchanges(stdout, hcounts, scounts, events, topcount, firstevent, lastevent); } fprintf(stdout, "
\n"); headfoot(stdout, webfile_hf, "", "footer", COL_GREEN); return 0; } xymon-4.3.28/web/xymonpage.c0000664000076400007640000000443711615341300016144 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon webpage generator tool. */ /* */ /* This is a generic webpage generator, that allows scripts to output a */ /* standard Xymon-like webpage without having to deal with headers and */ /* footers. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: xymonpage.c 6712 2011-07-31 21:01:52Z storner $"; #include #include #include #include "libxymon.h" #include "version.h" char *reqenv[] = { "XYMONHOME", NULL }; int main(int argc, char *argv[]) { int argi; char *hffile = "stdnormal"; int bgcolor = COL_BLUE; char inbuf[8192]; int n; char *envarea = NULL; for (argi = 1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } else if (strcmp(argv[argi], "--debug") == 0) { debug = 1; } else if (argnmatch(argv[argi], "--hffile=")) { char *p = strchr(argv[argi], '='); hffile = strdup(p+1); } else if (argnmatch(argv[argi], "--color=")) { char *p = strchr(argv[argi], '='); bgcolor = parse_color(p+1); } } envcheck(reqenv); fprintf(stdout, "Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); headfoot(stdout, hffile, "", "header", bgcolor); do { n = fread(inbuf, 1, sizeof(inbuf), stdin); if (n > 0) fwrite(inbuf, 1, n, stdout); } while (n == sizeof(inbuf)); headfoot(stdout, hffile, "", "footer", bgcolor); return 0; } xymon-4.3.28/web/criticaleditor.cgi.10000664000076400007640000000240213037531445017616 0ustar rpmbuildrpmbuild.TH CRITICALEDITOR.CGI 1 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME criticaleditor.cgi \- Xymon Critical Systems View Editor CGI .SH SYNOPSIS .B "criticaleditor.cgi" .SH DESCRIPTION \fBcriticaleditor.cgi\fR is invoked as a CGI script via the criticaleditor.sh CGI wrapper. criticaleditor.cgi is a web-based editor for the .I critical.cfg(5) file, which is used to configure the Xymon "Critical Systems" view. A detailed description of how to use the editor is provided in the Xymon Web documentation, available from the "Help" \-> "Critical Systems" link on the Xymon website. .SH SECURITY Access to this CGI script should be restricted through access controls in your webserver. Editing the Critical Systems View configuration will impact the monitoring of your site. .SH OPTIONS .IP "\-\-config=FILENAME" Name of the Critical Systems View configuration file. The default is critical.cfg in the $XYMONHOME/etc/ directory. .IP "\-\-env=FILENAME" Loads the environment defined in FILENAME before executing the CGI script. .IP "\-\-area=NAME" Load environment variables for a specific area. NB: if used, this option must appear before any \-\-env=FILENAME option. .IP "\-\-debug" Enables debugging output. .SH "SEE ALSO" criticalview.cgi(1), critical.cfg(5), xymon(7) xymon-4.3.28/web/svcstatus.c0000664000076400007640000005502612657227265016220 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon status-log viewer CGI. */ /* */ /* This CGI tool shows an HTML version of a status log. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: svcstatus.c 7900 2016-02-12 01:00:37Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" #include "version.h" #include "svcstatus-info.h" #include "svcstatus-trends.h" /* Command-line params */ static enum { SRC_XYMOND, SRC_HISTLOGS, SRC_CLIENTLOGS } source = SRC_XYMOND; static int wantserviceid = 1; static char *multigraphs = ",disk,inode,qtree,quotas,snapshot,TblSpace,if_load,"; static int locatorbased = 0; static char *critconfigfn = NULL; static char *accessfn = NULL; /* CGI params */ static char *hostname = NULL; static char *service = NULL; static char *tstamp = NULL; static char *nkprio = NULL, *nkttgroup = NULL, *nkttextra = NULL; static enum { FRM_STATUS, FRM_CLIENT } outform = FRM_STATUS; static char *clienturi = NULL; static int backsecs = 0; static time_t fromtime = 0, endtime = 0; static char errortxt[1000]; static char *hostdatadir = NULL; static void errormsg(int status, char *msg) { snprintf(errortxt, sizeof(errortxt), "Status: %d\nRefresh: 30\nContent-type: %s\n\nInvalid request\n%s\n", status, xgetenv("HTMLCONTENTTYPE"), msg); errortxt[sizeof(errortxt)-1] = '\0'; } static int parse_query(void) { cgidata_t *cgidata = cgi_request(); cgidata_t *cwalk; cwalk = cgidata; while (cwalk) { if (strcasecmp(cwalk->name, "HOST") == 0) { hostname = strdup(basename(cwalk->value)); } else if (strcasecmp(cwalk->name, "SERVICE") == 0) { service = strdup(basename(cwalk->value)); } else if (strcasecmp(cwalk->name, "HOSTSVC") == 0) { /* For backwards compatibility */ char *p = strrchr(cwalk->value, '.'); if (p) { *p = '\0'; hostname = strdup(basename(cwalk->value)); service = strdup(p+1); for (p=strchr(hostname, ','); (p); p = strchr(p, ',')) *p = '.'; } } else if (strcasecmp(cwalk->name, "TIMEBUF") == 0) { /* Only for the historical logs */ tstamp = strdup(basename(cwalk->value)); } else if (strcasecmp(cwalk->name, "CLIENT") == 0) { char *p; hostname = strdup(cwalk->value); p = hostname; while ((p = strchr(p, ',')) != NULL) *p = '.'; service = strdup(""); outform = FRM_CLIENT; } else if (strcasecmp(cwalk->name, "SECTION") == 0) { service = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "NKPRIO") == 0) { nkprio = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "NKTTGROUP") == 0) { nkttgroup = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "NKTTEXTRA") == 0) { nkttextra = strdup(cwalk->value); } else if ((strcmp(cwalk->name, "backsecs") == 0) && cwalk->value && strlen(cwalk->value)) { backsecs += atoi(cwalk->value); } else if ((strcmp(cwalk->name, "backmins") == 0) && cwalk->value && strlen(cwalk->value)) { backsecs += 60*atoi(cwalk->value); } else if ((strcmp(cwalk->name, "backhours") == 0) && cwalk->value && strlen(cwalk->value)) { backsecs += 60*60*atoi(cwalk->value); } else if ((strcmp(cwalk->name, "backdays") == 0) && cwalk->value && strlen(cwalk->value)) { backsecs += 24*60*60*atoi(cwalk->value); } else if ((strcmp(cwalk->name, "FROMTIME") == 0) && cwalk->value && strlen(cwalk->value)) { fromtime = eventreport_time(cwalk->value); } else if ((strcmp(cwalk->name, "TOTIME") == 0) && cwalk->value && strlen(cwalk->value)) { endtime = eventreport_time(cwalk->value); } cwalk = cwalk->next; } if (backsecs == 0) { if (getenv("TRENDSECONDS")) backsecs = atoi(getenv("TRENDSECONDS")); else backsecs = 48*60*60; } if (!hostname || !service || ((source == SRC_HISTLOGS) && !tstamp) ) { errormsg(403, "Invalid request"); return 1; } if (strcmp(service, xgetenv("CLIENTCOLUMN")) == 0) { /* Make this a client request */ char *p = strdup(basename(hostname)); xfree(hostname); hostname = p; /* no need to convert to dots, since we'll already have them */ xfree(service); /* service does double-duty as the 'section' param */ outform = FRM_CLIENT; } if (outform == FRM_STATUS) { char *p, *req; req = getenv("SCRIPT_NAME"); clienturi = (char *)malloc(strlen(req) + 10 + strlen(htmlquoted(hostname))); strcpy(clienturi, req); p = strchr(clienturi, '?'); if (p) *p = '\0'; else p = clienturi + strlen(clienturi); sprintf(p, "?CLIENT=%s", htmlquoted(hostname)); } return 0; } int loadhostdata(char *hostname, char **ip, char **displayname, char **compacts, int full) { void *hinfo = NULL; int loadres; if (full) { loadres = load_hostnames(xgetenv("HOSTSCFG"), NULL, get_fqdn()); } else { loadres = load_hostinfo(hostname); } if ((loadres != 0) && (loadres != -2)) { errormsg(500, "Cannot load host configuration"); return 1; } if ((loadres == -2) || (hinfo = hostinfo(hostname)) == NULL) { errormsg(403, "No such host"); return 1; } *ip = xmh_item(hinfo, XMH_IP); *displayname = xmh_item(hinfo, XMH_DISPLAYNAME); if (!(*displayname)) *displayname = hostname; *compacts = xmh_item(hinfo, XMH_COMPACT); return 0; } int do_request(void) { int color = 0, flapping = 0; char timesincechange[100]; time_t logtime = 0, acktime = 0, disabletime = 0; char *log = NULL, *firstline = NULL, *sender = NULL, *clientid = NULL, *flags = NULL; /* These are free'd */ char *restofmsg = NULL, *ackmsg = NULL, *dismsg = NULL, *acklist=NULL, *modifiers = NULL; /* These are just used */ int ishtmlformatted = 0; int clientavail = 0; char *ip = NULL, *displayname = NULL, *compacts; if (parse_query() != 0) return 1; { char *p = NULL; if (!service || !strlen(service)) p = csp_header("svcstatus"); else { if (strcasecmp(service, xgetenv("INFOCOLUMN")) == 0) p = csp_header("svcstatus-info"); else if (strcasecmp(service, xgetenv("TRENDSCOLUMN")) == 0) p = csp_header("svcstatus-trends"); else { int d = atoi(xgetenv("XYMWEBREFRESH")); fprintf(stdout, "Refresh: %d\n", ((d > 0) ? d : 60) ); p = csp_header("svcstatus"); } } if (p) fprintf(stdout, "%s", p); } /* Load the host data (for access control) */ if (accessfn) { load_hostinfo(hostname); load_web_access_config(accessfn); if (!web_access_allowed(getenv("REMOTE_USER"), hostname, service, WEB_ACCESS_VIEW)) { errormsg(403, "Not available (restricted)."); return 1; } } { char *s; s = xgetenv("CLIENTLOGS"); if (s) { hostdatadir = (char *)malloc(strlen(s) + strlen(hostname) + 12); sprintf(hostdatadir, "%s/%s", s, hostname); } else { s = xgetenv("XYMONVAR"); hostdatadir = (char *)malloc(strlen(s) + strlen(hostname) + 12); sprintf(hostdatadir, "%s/hostdata/%s", s, hostname); } } if (outform == FRM_CLIENT) { if (source == SRC_XYMOND) { char *xymondreq; int xymondresult; sendreturn_t *sres = newsendreturnbuf(1, NULL); xymondreq = (char *)malloc(1024 + strlen(hostname) + (service ? strlen(service) : 0)); sprintf(xymondreq, "clientlog %s", hostname); if (service && *service) sprintf(xymondreq + strlen(xymondreq), " section=%s", service); xymondresult = sendmessage(xymondreq, NULL, XYMON_TIMEOUT, sres); if (xymondresult != XYMONSEND_OK) { char *errtxt = (char *)malloc(1024 + strlen(xymondreq)); sprintf(errtxt, "Status not available: Req=%s, result=%d\n", htmlquoted(xymondreq), xymondresult); errormsg(500, errtxt); return 1; } else { log = getsendreturnstr(sres, 1); } freesendreturnbuf(sres); } else if (source == SRC_HISTLOGS) { char logfn[PATH_MAX]; FILE *fd; sprintf(logfn, "%s/%s", hostdatadir, tstamp); fd = fopen(logfn, "r"); if (fd) { struct stat st; int n; fstat(fileno(fd), &st); if (S_ISREG(st.st_mode)) { log = (char *)malloc(st.st_size + 1); n = fread(log, 1, st.st_size, fd); if (n >= 0) *(log+n) = '\0'; else *log = '\0'; } fclose(fd); } } restofmsg = (log ? log : strdup("\n")); } else if ((strcmp(service, xgetenv("TRENDSCOLUMN")) == 0) || (strcmp(service, xgetenv("INFOCOLUMN")) == 0)) { int fullload = (strcmp(service, xgetenv("INFOCOLUMN")) == 0); if (loadhostdata(hostname, &ip, &displayname, &compacts, fullload) != 0) return 1; ishtmlformatted = 1; sethostenv(displayname, ip, service, colorname(COL_GREEN), hostname); sethostenv_refresh(600); color = COL_GREEN; logtime = getcurrenttime(NULL); strcpy(timesincechange, "0 minutes"); if (strcmp(service, xgetenv("TRENDSCOLUMN")) == 0) { if (locatorbased) { char *cgiurl, *qres; qres = locator_query(hostname, ST_RRD, &cgiurl); if (!qres) { errprintf("Cannot find RRD files for host %s\n", hostname); } else { /* Redirect browser to the real server */ fprintf(stdout, "Location: %s/svcstatus.sh?HOST=%s&SERVICE=%s\n\n", cgiurl, hostname, service); return 0; } } else { if (endtime == 0) endtime = getcurrenttime(NULL); if (fromtime == 0) { fromtime = endtime - backsecs; sethostenv_backsecs(backsecs); } else { sethostenv_eventtime(fromtime, endtime); } log = restofmsg = generate_trends(hostname, fromtime, endtime); } } else if (strcmp(service, xgetenv("INFOCOLUMN")) == 0) { log = restofmsg = generate_info(hostname, critconfigfn); } } else if (source == SRC_XYMOND) { char *xymondreq; int xymondresult; char *items[25]; int icount; time_t logage, clntstamp; char *sumline, *msg, *p, *compitem, *complist; sendreturn_t *sres; if (loadhostdata(hostname, &ip, &displayname, &compacts, 0) != 0) return 1; complist = NULL; if (compacts && *compacts) { compitem = strtok(compacts, ","); while (compitem && !complist) { p = strchr(compitem, '='); if (p) *p = '\0'; if (strcmp(service, compitem) == 0) complist = p+1; compitem = strtok(NULL, ","); } } /* We need not check that hostname is valid, has already been done with loadhostdata() */ if (!complist) { pcre *dummy = NULL; /* Check service as a pcre pattern. And no spaces in servicenames */ if (strchr(service, ' ') == NULL) dummy = compileregex(service); if (dummy == NULL) { errormsg(500, "Invalid testname pattern"); return 1; } freeregex(dummy); xymondreq = (char *)malloc(1024 + strlen(hostname) + strlen(service)); sprintf(xymondreq, "xymondlog host=%s test=%s fields=hostname,testname,color,flags,lastchange,logtime,validtime,acktime,disabletime,sender,cookie,ackmsg,dismsg,client,acklist,XMH_IP,XMH_DISPLAYNAME,clntstamp,flapinfo,modifiers", hostname, service); } else { pcre *dummy = NULL; char *re; re = (char *)malloc(5 + strlen(complist)); sprintf(re, "^(%s)$", complist); dummy = compileregex(re); if (dummy == NULL) { errormsg(500, "Invalid testname pattern"); return 1; } freeregex(dummy); xymondreq = (char *)malloc(1024 + strlen(hostname) + strlen(re)); sprintf(xymondreq, "xymondboard host=^%s$ test=%s fields=testname,color,lastchange", hostname, re); } sres = newsendreturnbuf(1, NULL); xymondresult = sendmessage(xymondreq, NULL, XYMON_TIMEOUT, sres); if (xymondresult == XYMONSEND_OK) log = getsendreturnstr(sres, 1); freesendreturnbuf(sres); if ((xymondresult != XYMONSEND_OK) || (log == NULL) || (strlen(log) == 0)) { errormsg(404, "Status not available\n"); return 1; } if (!complist) { sumline = log; p = strchr(log, '\n'); *p = '\0'; msg = (p+1); p = strchr(msg, '\n'); if (!p) { firstline = strdup(msg); restofmsg = NULL; } else { *p = '\0'; firstline = strdup(msg); restofmsg = (p+1); *p = '\n'; } memset(items, 0, sizeof(items)); p = gettok(sumline, "|"); icount = 0; while (p && (icount < 20)) { items[icount++] = p; p = gettok(NULL, "|"); } /* * hostname, [0] * testname, [1] * color, [2] * flags, [3] * lastchange, [4] * logtime, [5] * validtime, [6] * acktime, [7] * disabletime, [8] * sender, [9] * cookie, [10] * ackmsg, [11] * dismsg, [12] * client, [13] * acklist [14] * XMH_IP [15] * XMH_DISPLAYNAME [16] * clienttstamp [17] * flapping [18] * modifiers [19] */ color = parse_color(items[2]); flags = strdup(items[3]); logage = getcurrenttime(NULL) - atoi(items[4]); timesincechange[0] = '\0'; p = timesincechange; { int days = (int) (logage / 86400); int hours = (int) ((logage % 86400) / 3600); int minutes = (int) ((logage % 3600) / 60); if (days > 1) p += sprintf(p, "%d days, ", days); else if (days == 1) p += sprintf(p, "1 day, "); if (hours == 1) p += sprintf(p, "1 hour, "); else p += sprintf(p, "%d hours, ", hours); if (minutes == 1) p += sprintf(p, "1 minute"); else p += sprintf(p, "%d minutes", minutes); } logtime = atoi(items[5]); if (items[7] && strlen(items[7])) acktime = atoi(items[7]); if (items[8] && strlen(items[8])) disabletime = atoi(items[8]); sender = strdup(items[9]); if (items[11] && strlen(items[11])) ackmsg = items[11]; if (ackmsg) nldecode(ackmsg); if (items[12] && strlen(items[12])) dismsg = items[12]; if (dismsg) nldecode(dismsg); if (items[13]) clientavail = (*items[13] == 'Y'); acklist = ((items[14] && *items[14]) ? strdup(items[14]) : NULL); ip = (items[15] ? items[15] : ""); displayname = ((items[16] && *items[16]) ? items[16] : hostname); clntstamp = ((items[17] && *items[17]) ? atol(items[17]) : 0); flapping = (items[18] ? (*items[18] == '1') : 0); modifiers = (items[19] && *(items[19])) ? items[19] : NULL; sethostenv(displayname, ip, service, colorname(COL_GREEN), hostname); sethostenv_refresh(60); } else { /* Compressed status display */ strbuffer_t *cmsg; char *row, *p_row, *p_fld; char *nonhistenv; color = COL_GREEN; cmsg = newstrbuffer(0); addtobuffer(cmsg, "\n"); row = strtok_r(log, "\n", &p_row); while (row) { /* testname,color,lastchange */ char *testname, *itmcolor, *chgs; time_t lastchange; int icolor; testname = strtok_r(row, "|", &p_fld); itmcolor = strtok_r(NULL, "|", &p_fld); chgs = strtok_r(NULL, "|", &p_fld); lastchange = atoi(chgs); icolor = parse_color(itmcolor); if (icolor > color) color = icolor; addtobuffer(cmsg, "\n"); row = strtok_r(NULL, "\n", &p_row); } addtobuffer(cmsg, "
&"); addtobuffer(cmsg, itmcolor); addtobuffer(cmsg, " "); addtobuffer(cmsg, htmlquoted(testname)); addtobuffer(cmsg, "
\n"); ishtmlformatted = 1; sethostenv(displayname, ip, service, colorname(color), hostname); sethostenv_refresh(60); logtime = getcurrenttime(NULL); strcpy(timesincechange, "0 minutes"); log = restofmsg = grabstrbuffer(cmsg); firstline = (char *)malloc(1024); sprintf(firstline, "%s Compressed status display\n", colorname(color)); nonhistenv = (char *)malloc(10 + strlen(service)); sprintf(nonhistenv, "NONHISTS=%s", service); putenv(nonhistenv); } } else if (source == SRC_HISTLOGS) { char logfn[PATH_MAX]; struct stat st; FILE *fd; /* * Some clients (Unix disk reports) don't have a newline before the * "Status unchanged in ..." text. Most do, but at least Solaris and * AIX do not. So just look for the text, not the newline. */ char *statusunchangedtext = "Status unchanged in "; char *receivedfromtext = "Message received from "; char *clientidtext = "Client data ID "; char *p, *unchangedstr, *receivedfromstr, *clientidstr, *hostnamedash; int n; if (!tstamp) { errormsg(500, "Invalid request"); return 1; } if (loadhostdata(hostname, &ip, &displayname, &compacts, 0) != 0) return 1; hostnamedash = strdup(hostname); p = hostnamedash; while ((p = strchr(p, '.')) != NULL) *p = '_'; p = hostnamedash; while ((p = strchr(p, ',')) != NULL) *p = '_'; sprintf(logfn, "%s/%s/%s/%s", xgetenv("XYMONHISTLOGS"), hostnamedash, service, tstamp); xfree(hostnamedash); p = tstamp; while ((p = strchr(p, '_')) != NULL) *p = ' '; sethostenv_histlog(tstamp); if ((stat(logfn, &st) == -1) || (st.st_size < 10) || (!S_ISREG(st.st_mode))) { errormsg(404, "Historical status log not available\n"); return 1; } fd = fopen(logfn, "r"); if (!fd) { errormsg(404, "Unable to access historical logfile\n"); return 1; } log = (char *)malloc(st.st_size+1); n = fread(log, 1, st.st_size, fd); if (n >= 0) *(log+n) = '\0'; else *log = '\0'; fclose(fd); p = strchr(log, '\n'); if (!p) { firstline = strdup(log); restofmsg = NULL; } else { *p = '\0'; firstline = strdup(log); restofmsg = (p+1); *p = '\n'; } color = parse_color(log); p = strstr(log, "\n", cmd); if (obeycookies && !gotfilter && ((hostname = get_cookie("host")) != NULL)) { if (*hostname) { pcre *dummy; char *re; re = (char *)malloc(3+strlen(hostname)); sprintf(re, "^%s$", hostname); dummy = compileregex(re); if (dummy) { /* Valid expression */ freeregex(dummy); cmd = (char *)realloc(cmd, 1024 + strlen(cmd) + strlen(re)); sprintf(cmd + strlen(cmd), " host=%s", re); gotfilter = 1; } else { filtererror = 1; printf("

Invalid hostname filter

\n"); } } } if (obeycookies && !gotfilter && ((pagename = get_cookie("pagepath")) != NULL)) { if (*pagename) { pcre *dummy; char *re; re = (char *)malloc(8 + strlen(pagename)*2); sprintf(re, "%s$|^%s/.+", pagename, pagename); dummy = compileregex(re); if (dummy) { /* Valid expression */ freeregex(dummy); cmd = (char *)realloc(cmd, 1024 + strlen(cmd) + strlen(re)); sprintf(cmd + strlen(cmd), " page=%s", re); gotfilter = 1; } else { filtererror = 1; printf("

Invalid pagename filter

\n"); } } } sres = newsendreturnbuf(1, NULL); if (!filtererror && (sendmessage(cmd, NULL, XYMON_TIMEOUT, sres) == XYMONSEND_OK)) { char *bol, *eoln; int first = 1; respbuf = getsendreturnstr(sres, 1); bol = respbuf; while (bol) { char *hname, *tname, *ackcode; eoln = strchr(bol, '\n'); if (eoln) *eoln = '\0'; hname = tname = ackcode = NULL; hname = strtok(bol, "|"); if (hname) tname = strtok(NULL, "|"); if (tname) ackcode = strtok(NULL, "|"); if (hname && tname && ackcode && (strcmp(hname, "summary") != 0)) { if (first) { fprintf(stdout, "
\n", getenv("SCRIPT_NAME")); fprintf(stdout, "
\n"); fprintf(stdout, "\n"); first = 0; } generate_ackline(stdout, hname, tname, ackcode); } if (eoln) bol = eoln+1; else bol = NULL; } if (first) { fprintf(stdout, "
No active alerts
\n"); } else { generate_ackline(stdout, NULL, NULL, NULL); fprintf(stdout, "
HostTestDurationCauseAckAck Multiple
\n"); fprintf(stdout, "
\n"); } } freesendreturnbuf(sres); headfoot(stdout, "acknowledge", "", "footer", COL_RED); } } else if ( (nopin && (cgi_method == CGI_POST)) || (!nopin && (cgidata != NULL)) ) { char *xymonmsg; char *acking_user = ""; acklist_t *awalk; strbuffer_t *response = newstrbuffer(0); int count = 0; /* We only want to accept posts from certain pages */ { char cgisource[1024]; char *p; p = csp_header("acknowledge"); if (p) fprintf(stdout, "%s", p); snprintf(cgisource, sizeof(cgisource), "%s/%s", xgetenv("SECURECGIBINURL"), "acknowledge"); if (!cgi_refererok(cgisource)) { fprintf(stdout, "Location: %s.sh?\n\n", cgisource); return 0; } } parse_query(); if (getenv("REMOTE_USER")) { char *remaddr = getenv("REMOTE_ADDR"); acking_user = (char *)malloc(1024 + strlen(getenv("REMOTE_USER")) + (remaddr ? strlen(remaddr) : 0)); sprintf(acking_user, "\nAcked by: %s", getenv("REMOTE_USER")); if (remaddr) sprintf(acking_user + strlen(acking_user), " (%s)", remaddr); } /* Load the host data (for access control) */ if (accessfn) { load_hostnames(xgetenv("HOSTSCFG"), NULL, get_fqdn()); load_web_access_config(accessfn); } addtobuffer(response, "
\n"); for (awalk = ackhead; (awalk); awalk = awalk->next) { char *msgline = (char *)malloc(1024 + (awalk->hostname ? strlen(awalk->hostname) : 0) + (awalk->testname ? strlen(awalk->testname) : 0)); if (!awalk->checked) continue; if (accessfn && (!web_access_allowed(getenv("REMOTE_USER"), awalk->hostname, awalk->testname, WEB_ACCESS_CONTROL))) continue; if ((reqtype == ACK_ONE) && (awalk->id != sendnum)) continue; if (reqtype == ACK_MANY) { if (!awalk->ackmsg) awalk->ackmsg = ackmsgall; if (!awalk->validity && validityall) awalk->validity = durationvalue(validityall); if (periodall) awalk->period = periodall; } if (strncmp(awalk->period, "hour", 4) == 0) awalk->validity *= 60; else if (strncmp(awalk->period, "day", 4) == 0) awalk->validity *= 60*24; count++; if (!awalk->ackmsg || !awalk->validity || !awalk->acknum) { if (awalk->hostname && awalk->testname) { sprintf(msgline, "NO ACK sent for host %s / test %s", htmlquoted(awalk->hostname), htmlquoted(awalk->testname)); } else { sprintf(msgline, "NO ACK sent for item %d", awalk->id); } addtobuffer(response, msgline); addtobuffer(response, ": Duration or message not set
\n"); continue; } xymonmsg = (char *)malloc(1024 + strlen(awalk->ackmsg) + strlen(acking_user)); sprintf(xymonmsg, "xymondack %d %d %s %s", awalk->acknum, awalk->validity, awalk->ackmsg, acking_user); if (sendmessage(xymonmsg, NULL, XYMON_TIMEOUT, NULL) == XYMONSEND_OK) { if (awalk->hostname && awalk->testname) { sprintf(msgline, "Acknowledge sent for host %s / test %s
\n", htmlquoted(awalk->hostname), htmlquoted(awalk->testname)); } else { sprintf(msgline, "Acknowledge sent for code %d
\n", awalk->acknum); } } else { if (awalk->hostname && awalk->testname) { sprintf(msgline, "Failed to send acknowledge for host %s / test %s
\n", htmlquoted(awalk->hostname), htmlquoted(awalk->testname)); } else { sprintf(msgline, "Failed to send acknowledge for code %d
\n", awalk->acknum); } } addtobuffer(response, msgline); xfree(xymonmsg); } if (count == 0) addtobuffer(response, "No acks requested\n"); addtobuffer(response, "
\n"); fprintf(stdout, "Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); headfoot(stdout, "acknowledge", "", "header", COL_RED); fprintf(stdout, "%s", STRBUF(response)); headfoot(stdout, "acknowledge", "", "footer", COL_RED); } return 0; } xymon-4.3.28/web/perfdata.c0000664000076400007640000002716212003234710015721 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon CGI for reporting performance statisticsc from the RRD data */ /* */ /* Copyright (C) 2008-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: perfdata.c 7105 2012-07-23 11:47:20Z storner $"; #include #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" enum { O_NONE, O_XML, O_CSV } outform = O_NONE; char csvdelim = ','; char *hostpattern = NULL; char *exhostpattern = NULL; char *pagepattern = NULL; char *expagepattern = NULL; char *starttime = NULL; char *starttimedate = NULL, *starttimehm = NULL; char *endtime = NULL; char *endtimedate = NULL, *endtimehm = NULL; char *customrrd = NULL; char *customds = NULL; static void parse_query(void) { cgidata_t *cgidata = cgi_request(); cgidata_t *cwalk; cwalk = cgidata; while (cwalk) { if (strcasecmp(cwalk->name, "HOST") == 0) { if (*(cwalk->value)) hostpattern = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "EXHOST") == 0) { if (*(cwalk->value)) hostpattern = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "PAGEMATCH") == 0) { if (*(cwalk->value)) pagepattern = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "EXPAGEMATCH") == 0) { if (*(cwalk->value)) expagepattern = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "STARTTIME") == 0) { if (*(cwalk->value)) starttime = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "ENDTIME") == 0) { if (*(cwalk->value)) endtime = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "CUSTOMRRD") == 0) { if (*(cwalk->value)) customrrd = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "CUSTOMDS") == 0) { if (*(cwalk->value)) customds = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "CSV") == 0) { outform = O_CSV; if (*(cwalk->value)) csvdelim = *(cwalk->value); } else if (strcasecmp(cwalk->name, "FORMAT") == 0) { if (strcmp(cwalk->value, "XML") == 0) outform = O_XML; else { outform = O_CSV; csvdelim = *(cwalk->value); } } cwalk = cwalk->next; } } int oneset(char *hostname, char *rrdname, char *starttime, char *endtime, char *colname, double subfrom, char *dsdescr) { static int firsttime = 1; time_t start, end, t; unsigned long step; unsigned long dscount; char **dsnames; rrd_value_t *data; int columnindex; char tstamp[30]; int dataindex, rowcount, havemin, havemax, missingdata; double sum, min = 0.0, max = 0.0, val; char *rrdargs[10]; int result; rrdargs[0] = "rrdfetch"; rrdargs[1] = rrdname; rrdargs[2] = "AVERAGE"; rrdargs[3] = "-s"; rrdargs[4] = starttimedate; rrdargs[5] = starttimehm; rrdargs[6] = "-e"; rrdargs[7] = endtimedate; rrdargs[8] = endtimehm; rrdargs[9] = NULL; optind = opterr = 0; rrd_clear_error(); result = rrd_fetch(9, rrdargs, &start, &end, &step, &dscount, &dsnames, &data); if (result != 0) { errprintf("RRD error: %s\n", rrd_get_error()); return 1; } for (columnindex=0; ((columnindex < dscount) && strcmp(dsnames[columnindex], colname)); columnindex++) ; if (columnindex == dscount) { errprintf("RRD error: Cannot find column %s\n", colname); return 1; } sum = 0.0; havemin = havemax = 0; rowcount = 0; switch (outform) { case O_XML: printf(" \n"); printf(" %s\n", hostname); printf(" %s\n", rrdname); printf(" %s\n", colname); printf(" %s\n", (dsdescr ? dsdescr : colname)); printf(" \n"); break; case O_CSV: if (firsttime) { printf("\"hostname\"%c\"datasource\"%c\"rrdcolumn\"%c\"measurement\"%c\"time\"%c\"value\"\n", csvdelim, csvdelim, csvdelim, csvdelim, csvdelim); firsttime = 0; } break; default: break; } for (t=start+step, dataindex=columnindex, missingdata=0; (t <= end); t += step, dataindex += dscount) { if (isnan(data[dataindex]) || isnan(-data[dataindex])) { missingdata++; continue; } val = (subfrom != 0) ? subfrom - data[dataindex] : data[dataindex]; strftime(tstamp, sizeof(tstamp), "%Y%m%d%H%M%S", localtime(&t)); switch (outform) { case O_XML: printf(" \n"); printf(" \n", tstamp); printf(" %f\n", val); printf(" \n"); break; case O_CSV: printf("\"%s\"%c\"%s\"%c\"%s\"%c\"%s\"%c\"%s\"%c%f\n", hostname, csvdelim, rrdname, csvdelim, colname, csvdelim, (dsdescr ? dsdescr : colname), csvdelim, tstamp, csvdelim, val); break; default: break; } if (!havemax || (val > max)) { max = val; havemax = 1; } if (!havemin || (val < min)) { min = val; havemin = 1; } sum += val; rowcount++; } if (outform == O_XML) { printf(" \n"); printf(" \n"); if (havemin) printf(" %f\n", min); if (havemax) printf(" %f\n", max); if (rowcount) printf(" %f\n", (sum / rowcount)); printf(" %d\n", missingdata); printf(" \n"); printf(" \n"); } return 0; } int onehost(char *hostname, char *starttime, char *endtime) { struct stat st; DIR *d; struct dirent *de; if ((chdir(xgetenv("XYMONRRDS")) == -1) || (chdir(hostname) == -1)) { errprintf("Cannot cd to %s/%s\n", xgetenv("XYMONRRDS"), hostname); return 1; } if (customrrd && customds) { if (stat(customrrd, &st) != 0) return 1; oneset(hostname, customrrd, starttime, endtime, customds, 0, customds); return 0; } /* * CPU busy data - use vmstat.rrd if it is there, * if not then assume it's a Windows box and report the la.rrd data. */ if (stat("vmstat.rrd", &st) == 0) { oneset(hostname, "vmstat.rrd", starttime, endtime, "cpu_idl", 100, "pctbusy"); } else { /* No vmstat data, so use the la.rrd file */ oneset(hostname, "la.rrd", starttime, endtime, "la", 0, "pctbusy"); } /* * Report all memory data - it depends on the OS of the host which one * really is interesting (memory.actual.rrd for Linux, memory.real.rrd for * most of the other systems). */ if (stat("memory.actual.rrd", &st) == 0) { oneset(hostname, "memory.actual.rrd", starttime, endtime, "realmempct", 0, "Virtual"); } if (stat("memory.real.rrd", &st) == 0) { oneset(hostname, "memory.real.rrd", starttime, endtime, "realmempct", 0, "RAM"); } if (stat("memory.swap.rrd", &st) == 0) { oneset(hostname, "memory.swap.rrd", starttime, endtime, "realmempct", 0, "Swap"); } /* * Report data for all filesystems. */ d = opendir("."); while ((de = readdir(d)) != NULL) { if (strncmp(de->d_name, "disk,", 5) != 0) continue; stat(de->d_name, &st); if (!S_ISREG(st.st_mode)) continue; if (strcmp(de->d_name, "disk,root.rrd") == 0) { oneset(hostname, de->d_name, starttime, endtime, "pct", 0, "/"); } else { char *fsnam = strdup(de->d_name+4); char *p; while ((p = strchr(fsnam, ',')) != NULL) *p = '/'; p = fsnam + strlen(fsnam) - 4; *p = '\0'; dbgprintf("Processing set %s for host %s from %s\n", de->d_name, hostname, fsnam); oneset(hostname, de->d_name, starttime, endtime, "pct", 0, fsnam); xfree(fsnam); } } closedir(d); return 0; } void format_rrdtime(char *t, char **tday, char **thm) { int year, month, day, hour, min,sec; int n; time_t now = getcurrenttime(NULL); struct tm *nowtm = localtime(&now); if (t == NULL) return; /* Input is YYYY/MM/DD@HH:MM:SS or YYYYMMDD or MMDD */ n = sscanf(t, "%d/%d/%d@%d:%d:%d", &year, &month, &day, &hour, &min, &sec); switch (n) { case 6: break; /* Got all */ case 5: sec = 0; break; case 4: min = sec = 0; break; case 3: hour = min = sec = 0; break; default: break; } hour = min = sec = 0; n = sscanf(t, "%d/%d/%d", &year, &month, &day); switch (n) { case 3: break; /* Got all */ case 2: day = month; month = year; year = nowtm->tm_year + 1900; default: break; } if (year < 100) year += 2000; *tday = (char *)malloc(10); sprintf(*tday, "%4d%02d%02d", year, month, day); *thm = (char *)malloc(20); sprintf(*thm, "%02d:%02d:%02d", hour, min, sec); } int main(int argc, char **argv) { pcre *hostptn, *exhostptn, *pageptn, *expageptn; void *hwalk; char *hostname, *pagename; hostptn = exhostptn = pageptn = expageptn = NULL; if (getenv("QUERY_STRING") == NULL) { /* Not invoked through the CGI */ if (argc < 4) { errprintf("Usage:\n%s HOSTNAME-PATTERN STARTTIME ENDTIME", argv[0]); return 1; } hostpattern = argv[1]; if (strncmp(hostpattern, "--page=", 7) == 0) { pagepattern = strchr(argv[1], '=') + 1; hostpattern = NULL; } starttimedate = argv[2]; starttimehm = "00:00:00"; endtimedate = argv[3]; endtimehm = "00:00:00"; if (argc > 4) { if (strncmp(argv[4], "--csv", 5) == 0) { char *p; outform = O_CSV; if ((p = strchr(argv[4], '=')) != NULL) csvdelim = *(p+1); } } } else { char *envarea = NULL; int argi; for (argi = 1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } else if (strcmp(argv[argi], "--debug") == 0) { debug = 1; } } /* Parse CGI parameters */ parse_query(); format_rrdtime(starttime, &starttimedate, &starttimehm); format_rrdtime(endtime, &endtimedate, &endtimehm); switch (outform) { case O_XML: printf("Content-type: application/xml\n\n"); break; case O_CSV: printf("Content-type: text/csv\n\n"); break; case O_NONE: load_hostnames(xgetenv("HOSTSCFG"), NULL, get_fqdn()); printf("Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); showform(stdout, "perfdata", "perfdata_form", COL_BLUE, getcurrenttime(NULL), NULL, NULL); return 0; } } load_hostnames(xgetenv("HOSTSCFG"), NULL, get_fqdn()); if (hostpattern) hostptn = compileregex(hostpattern); if (exhostpattern) exhostptn = compileregex(exhostpattern); if (pagepattern) pageptn = compileregex(pagepattern); if (expagepattern) expageptn = compileregex(expagepattern); switch (outform) { case O_XML: printf("\n"); printf("\n"); break; default: break; } dbgprintf("Got hosts, it is %s\n", (first_host() == NULL) ? "empty" : "not empty"); for (hwalk = first_host(); (hwalk); hwalk = next_host(hwalk, 0)) { hostname = xmh_item(hwalk, XMH_HOSTNAME); pagename = xmh_item(hwalk, XMH_PAGEPATH); dbgprintf("Processing host %s\n", hostname); if (hostpattern && !matchregex(hostname, hostptn)) continue; if (exhostpattern && matchregex(hostname, exhostptn)) continue; if (pagepattern && !matchregex(pagename, pageptn)) continue; if (expagepattern && matchregex(pagename, expageptn)) continue; onehost(hostname, starttime, endtime); } switch (outform) { case O_XML: printf("\n"); break; default: break; } return 0; } xymon-4.3.28/web/ackinfo.c0000664000076400007640000001116712666146167015572 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon CGI for sending in an "ackinfo" message. */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: ackinfo.c 7949 2016-03-03 23:44:55Z jccleaver $"; #include #include #include #include #include #include #include "libxymon.h" static char *hostname = NULL; static char *testname = NULL; static int level = -1; static int validity = -1; static char *ackedby = NULL; static char *ackmsg = NULL; static void parse_query(void) { cgidata_t *cgidata = cgi_request(); cgidata_t *cwalk; cwalk = cgidata; while (cwalk) { if (strcasecmp(cwalk->name, "HOST") == 0) { hostname = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "SERVICE") == 0) { testname = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "ALLTESTS") == 0) { if (strcasecmp(cwalk->value, "on") == 0) testname = strdup("*"); } else if (strcasecmp(cwalk->name, "NOTE") == 0) { ackmsg = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "LEVEL") == 0) { /* Command line may override this */ if (level == -1) level = atoi(cwalk->value); } else if (strcasecmp(cwalk->name, "VALIDITY") == 0) { /* Command line may override this */ if (validity == -1) validity = atoi(cwalk->value); } cwalk = cwalk->next; } } int main(int argc, char *argv[]) { int argi; char *envarea = NULL; char *xymonmsg; for (argi = 1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } else if (strcmp(argv[argi], "--debug") == 0) { debug = 1; } else if (argnmatch(argv[argi], "--level=")) { char *p = strchr(argv[argi], '='); level = atoi(p+1); } else if (argnmatch(argv[argi], "--validity=")) { char *p = strchr(argv[argi], '='); validity = atoi(p+1); } else if (argnmatch(argv[argi], "--sender=")) { char *p = strchr(argv[argi], '='); ackedby = strdup(p+1); } } redirect_cgilog("ackinfo"); /* We only want to accept posts from certain pages */ { char cgisource[1024]; char *p; p = csp_header("ackinfo"); if (p) fprintf(stdout, "%s", p); snprintf(cgisource, sizeof(cgisource), "%s/%s", xgetenv("CGIBINURL"), "svcstatus"); if (!cgi_refererok(cgisource)) { snprintf(cgisource, sizeof(cgisource), "%s/%s", xgetenv("CGIBINURL"), "criticalview"); if (!cgi_refererok(cgisource)) { errprintf("ackinfo POST that is not coming from criticalview or svcstatus (referer=%s). Ignoring.\n", textornull(getenv("HTTP_REFERER")) ); fprintf(stdout, "Location: %s.sh?\n\n", cgisource); return 0; } } } parse_query(); if (hostname && *hostname && testname && *testname && ((level == 0) || (validity>0)) && ackmsg && *ackmsg) { char *p; /* Get the login username */ if (!ackedby) ackedby = getenv("REMOTE_USER"); if (!ackedby) ackedby = "UnknownUser"; if (validity == -1) validity = 30; /* 30 minutes */ validity = validity*60; p = strchr(ackmsg, '\n'); if (p) *p = '\0'; /* ackinfo HOST.TEST\nlevel\nvaliduntil\nackedby\nmsg */ xymonmsg = (char *)malloc(1024 + strlen(hostname) + strlen(testname) + strlen(ackedby) + strlen(ackmsg)); sprintf(xymonmsg, "ackinfo %s.%s\n%d\n%d\n%s\n%s\n", hostname, testname, level, validity, ackedby, ackmsg); sendmessage(xymonmsg, NULL, XYMON_TIMEOUT, NULL); } else { xymonmsg = (char *)malloc(1024 + (hostname ? strlen(hostname) : 9) + (testname ? strlen(testname) : 9) + (ackmsg ? strlen(ackmsg) : 9)); sprintf(xymonmsg, "error in input params: hostname=%s, testname=%s, ackmsg=%s, validity=%d\n", (hostname ? hostname : ""), (testname ? testname : ""), (ackmsg ? ackmsg : ""), validity); } fprintf(stdout, "Content-type: %s\n", xgetenv("HTMLCONTENTTYPE")); fprintf(stdout, "Location: %s\n", getenv("HTTP_REFERER")); fprintf(stdout, "\n"); fprintf(stdout, "Sent to xymond:\n%s\n", htmlquoted(xymonmsg)); return 0; } xymon-4.3.28/web/svcstatus-trends.c0000664000076400007640000002175612631736762017517 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD graph overview generator. */ /* */ /* This is a standalone tool for generating data for the trends column. */ /* All of the data stored in RRD files for a host end up as graphs. Some of */ /* these are displayed together with the corresponding status display, but */ /* others (e.g. from "data" messages) are not. This generates a "trends" */ /* column that contains all of the graphs for a host. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: svcstatus-trends.c 7836 2015-12-09 05:36:50Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" typedef struct graph_t { xymongraph_t *gdef; int count; struct graph_t *next; } graph_t; typedef struct dirstack_t { char *dirname; DIR *rrddir; struct dirstack_t *next; } dirstack_t; dirstack_t *dirs = NULL; static dirstack_t *stack_opendir(char *dirname) { dirstack_t *newdir; DIR *d; d = opendir(dirname); if (d == NULL) return NULL; newdir = (dirstack_t *)malloc(sizeof(dirstack_t)); newdir->dirname = strdup(dirname); newdir->rrddir = d; newdir->next = NULL; if (dirs == NULL) { dirs = newdir; } else { newdir->next = dirs; dirs = newdir; } return newdir; } static void stack_closedir(void) { dirstack_t *tmp = dirs; if (dirs && dirs->rrddir) { dirs = dirs->next; closedir(tmp->rrddir); xfree(tmp->dirname); xfree(tmp); } } static char *stack_readdir(void) { static char fname[PATH_MAX]; struct dirent *d; struct stat st; if (dirs == NULL) return NULL; do { d = readdir(dirs->rrddir); if (d == NULL) { stack_closedir(); } else if (*(d->d_name) == '.') { d = NULL; } else { sprintf(fname, "%s/%s", dirs->dirname, d->d_name); if ((stat(fname, &st) == 0) && (S_ISDIR(st.st_mode))) { stack_opendir(fname); d = NULL; } } } while (dirs && (d == NULL)); if (d == NULL) return NULL; if (strncmp(fname, "./", 2) == 0) return (fname + 2); else return fname; } static char *rrdlink_text(void *host, graph_t *rrd, hg_link_t wantmeta, time_t starttime, time_t endtime) { static char *rrdlink = NULL; static int rrdlinksize = 0; char *graphdef, *p; char *hostdisplayname, *hostrrdgraphs; hostdisplayname = xmh_item(host, XMH_DISPLAYNAME); hostrrdgraphs = xmh_item(host, XMH_TRENDS); dbgprintf("rrdlink_text: host %s, rrd %s\n", xmh_item(host, XMH_HOSTNAME), rrd->gdef->xymonrrdname); /* If no rrdgraphs definition, include all with default links */ if (hostrrdgraphs == NULL) { dbgprintf("rrdlink_text: Standard URL (no rrdgraphs)\n"); return xymon_graph_data(xmh_item(host, XMH_HOSTNAME), hostdisplayname, NULL, -1, rrd->gdef, rrd->count, HG_WITH_STALE_RRDS, wantmeta, 0, starttime, endtime); } /* Find this rrd definition in the rrdgraphs */ graphdef = strstr(hostrrdgraphs, rrd->gdef->xymonrrdname); if (graphdef) { char *endp; int namelength; namelength = strlen(rrd->gdef->xymonrrdname); while (graphdef) { /* * Search for string, but eliminate partial matches. * Must start and bol or after a comma or !, * and end with colon, comma, or eol. */ endp = graphdef + namelength; if (((*endp == '\0') || (*endp == ':') || (*endp == ',')) && ((graphdef == hostrrdgraphs) || (*(graphdef-1) == ',') || (*(graphdef-1) == '!') )) break; /* no match, keep looking */ graphdef = strstr(endp, rrd->gdef->xymonrrdname); } } /* If not found ... */ if (graphdef == NULL) { dbgprintf("rrdlink_text: NULL graphdef\n"); /* Do we include all by default ? */ if (*(hostrrdgraphs) == '*') { dbgprintf("rrdlink_text: Default URL included\n"); /* Yes, return default link for this RRD */ return xymon_graph_data(xmh_item(host, XMH_HOSTNAME), hostdisplayname, NULL, -1, rrd->gdef, rrd->count, HG_WITH_STALE_RRDS, wantmeta, 0, starttime, endtime); } else { dbgprintf("rrdlink_text: Default URL NOT included\n"); /* No, return empty string */ return ""; } } /* We now know that rrdgraphs explicitly define what to do with this RRD */ /* Does he want to explicitly exclude this RRD ? */ if ((graphdef > hostrrdgraphs) && (*(graphdef-1) == '!')) { dbgprintf("rrdlink_text: This graph is explicitly excluded\n"); return ""; } /* It must be included. */ if (rrdlink == NULL) { rrdlinksize = 4096; rrdlink = (char *)malloc(rrdlinksize); } *rrdlink = '\0'; p = graphdef + strlen(rrd->gdef->xymonrrdname); if (*p == ':') { /* There is an explicit list of graphs to add for this RRD. */ char savechar; char *enddef; graph_t *myrrd; char *partlink; myrrd = (graph_t *) malloc(sizeof(graph_t)); myrrd->gdef = (xymongraph_t *) calloc(1, sizeof(xymongraph_t)); /* First, null-terminate this graph definition so we only look at the active RRD */ enddef = strchr(graphdef, ','); if (enddef) *enddef = '\0'; graphdef = (p+1); do { p = strchr(graphdef, '|'); /* Ends at '|' ? */ if (p == NULL) p = graphdef + strlen(graphdef); /* Ends at end of string */ savechar = *p; *p = '\0'; myrrd->gdef->xymonrrdname = graphdef; myrrd->gdef->xymonpartname = NULL; myrrd->gdef->maxgraphs = 0; myrrd->count = rrd->count; myrrd->next = NULL; partlink = xymon_graph_data(xmh_item(host, XMH_HOSTNAME), hostdisplayname, NULL, -1, myrrd->gdef, myrrd->count, HG_WITH_STALE_RRDS, wantmeta, 0, starttime, endtime); if ((strlen(rrdlink) + strlen(partlink) + 1) >= rrdlinksize) { rrdlinksize += strlen(partlink) + 4096; rrdlink = (char *)realloc(rrdlink, rrdlinksize); } strcat(rrdlink, partlink); *p = savechar; graphdef = p; if (*graphdef != '\0') graphdef++; } while (*graphdef); if (enddef) *enddef = ','; xfree(myrrd->gdef); xfree(myrrd); return rrdlink; } else { /* It is included with the default graph */ return xymon_graph_data(xmh_item(host, XMH_HOSTNAME), hostdisplayname, NULL, -1, rrd->gdef, rrd->count, HG_WITH_STALE_RRDS, wantmeta, 0, starttime, endtime); } return ""; } char *generate_trends(char *hostname, time_t starttime, time_t endtime) { void *myhost; char hostrrddir[PATH_MAX]; char *fn; int anyrrds = 0; xymongraph_t *graph; graph_t *rwalk; char *allrrdlinks = NULL, *allrrdlinksend; unsigned int allrrdlinksize = 0; myhost = hostinfo(hostname); if (!myhost) return NULL; sprintf(hostrrddir, "%s/%s", xgetenv("XYMONRRDS"), hostname); if (chdir(hostrrddir) != 0) { errprintf("Cannot chdir to %s: %s\n", hostrrddir, strerror(errno)); return NULL; } stack_opendir("."); while ((fn = stack_readdir())) { /* Check if the filename ends in ".rrd", and we know how to handle this RRD */ if ((strlen(fn) <= 4) || (strcmp(fn+strlen(fn)-4, ".rrd") != 0)) continue; graph = find_xymon_graph(fn); if (!graph) continue; dbgprintf("Got RRD %s\n", fn); anyrrds++; for (rwalk = (graph_t *)xmh_item(myhost, XMH_DATA); (rwalk && (rwalk->gdef != graph)); rwalk = rwalk->next) ; if (rwalk == NULL) { graph_t *newrrd = (graph_t *) malloc(sizeof(graph_t)); newrrd->gdef = graph; newrrd->count = 1; newrrd->next = (graph_t *)xmh_item(myhost, XMH_DATA); xmh_set_item(myhost, XMH_DATA, newrrd); rwalk = newrrd; dbgprintf("New rrd for host:%s, rrd:%s\n", hostname, graph->xymonrrdname); } else { rwalk->count++; dbgprintf("Extra RRD for host %s, rrd %s count:%d\n", hostname, rwalk->gdef->xymonrrdname, rwalk->count); } } stack_closedir(); if (!anyrrds) return NULL; allrrdlinksize = 16384; allrrdlinks = (char *) malloc(allrrdlinksize); *allrrdlinks = '\0'; allrrdlinksend = allrrdlinks; graph = xymongraphs; while (graph->xymonrrdname) { for (rwalk = (graph_t *)xmh_item(myhost, XMH_DATA); (rwalk && (rwalk->gdef->xymonrrdname != graph->xymonrrdname)); rwalk = rwalk->next) ; if (rwalk) { int buflen; char *onelink; buflen = (allrrdlinksend - allrrdlinks); onelink = rrdlink_text(myhost, rwalk, 0, starttime, endtime); if ((buflen + strlen(onelink)) >= allrrdlinksize) { allrrdlinksize += (strlen(onelink) + 4096); allrrdlinks = (char *) realloc(allrrdlinks, allrrdlinksize); allrrdlinksend = allrrdlinks + buflen; } allrrdlinksend += sprintf(allrrdlinksend, "%s", onelink); } graph++; } return allrrdlinks; } xymon-4.3.28/web/enadis.c0000664000076400007640000003721412657227265015423 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon backend script for disabling/enabling tests. */ /* */ /* Copyright (C) 2003-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: enadis.c 7900 2016-02-12 01:00:37Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" enum { ACT_NONE, ACT_FILTER, ACT_ENABLE, ACT_DISABLE, ACT_SCHED_DISABLE, ACT_SCHED_CANCEL } action = ACT_NONE; enum { DISABLE_FOR, DISABLE_UNTIL } disableend = DISABLE_FOR; /* disable until a date OR disable for a duration */ int hostcount = 0; char **hostnames = NULL; int disablecount = 0; char **disabletest = NULL; int enablecount = 0; char **enabletest = NULL; int duration = 0; int scale = 1; char *disablemsg = "No reason given"; time_t schedtime = 0; time_t endtime = 0; time_t nowtime = 0; time_t starttime = 0; int cancelid = 0; int preview = 0; char *hostpattern = NULL; char *pagepattern = NULL; char *ippattern = NULL; char *classpattern = NULL; void errormsg(char *msg) { printf("Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); printf("Invalid request\n"); printf("%s\n", msg); exit(1); } void parse_cgi(void) { cgidata_t *postdata, *pwalk; struct tm schedtm; struct tm endtm; struct tm nowtm; memset(&schedtm, 0, sizeof(schedtm)); memset(&endtm, 0, sizeof(endtm)); postdata = cgi_request(); if (cgi_method == CGI_GET) return; /* We only want to accept posts from certain pages: svcstatus (for info), and ourselves */ /* At some point in the future, moving info lookups to their own page would be a good idea */ { char cgisource[1024]; char *p; p = csp_header("enadis"); if (p) fprintf(stdout, "%s", p); snprintf(cgisource, sizeof(cgisource), "%s/%s", xgetenv("SECURECGIBINURL"), "enadis"); if (!cgi_refererok(cgisource)) { snprintf(cgisource, sizeof(cgisource), "%s/%s", xgetenv("CGIBINURL"), "svcstatus"); if (!cgi_refererok(cgisource)) { errprintf("Enadis POST that is not coming from self or svcstatus (referer=%s). Ignoring.\n", textornull(getenv("HTTP_REFERER")) ); return; /* Just display, don't do anything */ } } } if (!postdata) { errormsg(cgi_error()); } pwalk = postdata; while (pwalk) { /* * When handling the "go", the "Disable now" and "Schedule disable" * radio buttons mess things up. So ignore the "go" if we have seen a * "filter" request already. */ if ((strcmp(pwalk->name, "go") == 0) && (action != ACT_FILTER)) { if (strcasecmp(pwalk->value, "enable") == 0) action = ACT_ENABLE; else if (strcasecmp(pwalk->value, "disable now") == 0) action = ACT_DISABLE; else if (strcasecmp(pwalk->value, "schedule disable") == 0) action = ACT_SCHED_DISABLE; else if (strcasecmp(pwalk->value, "cancel") == 0) action = ACT_SCHED_CANCEL; else if (strcasecmp(pwalk->value, "apply filters") == 0) action = ACT_FILTER; } else if ((strcmp(pwalk->name, "go2") == 0) && (action != ACT_FILTER)) { if (strcasecmp(pwalk->value, "Disable until") == 0) disableend = DISABLE_UNTIL; } else if (strcmp(pwalk->name, "duration") == 0) { duration = atoi(pwalk->value); } else if (strcmp(pwalk->name, "untilok") == 0) { if (strcasecmp(pwalk->value, "on") == 0) { duration = -1; scale = 1; } } else if (strcmp(pwalk->name, "scale") == 0) { scale = atoi(pwalk->value); } else if (strcmp(pwalk->name, "cause") == 0) { disablemsg = strdup(pwalk->value); } else if (strcmp(pwalk->name, "hostname") == 0) { if (hostnames == NULL) { hostnames = (char **)malloc(2 * sizeof(char *)); hostnames[0] = strdup(pwalk->value); hostnames[1] = NULL; hostcount = 1; } else { hostnames = (char **)realloc(hostnames, (hostcount + 2) * sizeof(char *)); hostnames[hostcount] = strdup(pwalk->value); hostnames[hostcount+1] = NULL; hostcount++; } } else if (strcmp(pwalk->name, "enabletest") == 0) { char *val = pwalk->value; if (strcmp(val, "ALL") == 0) val = "*"; if (enabletest == NULL) { enabletest = (char **)malloc(2 * sizeof(char *)); enabletest[0] = strdup(val); enabletest[1] = NULL; enablecount = 1; } else { enabletest = (char **)realloc(enabletest, (enablecount + 2) * sizeof(char *)); enabletest[enablecount] = strdup(val); enabletest[enablecount+1] = NULL; enablecount++; } } else if (strcmp(pwalk->name, "disabletest") == 0) { char *val = pwalk->value; if (strcmp(val, "ALL") == 0) val = "*"; if (disabletest == NULL) { disabletest = (char **)malloc(2 * sizeof(char *)); disabletest[0] = strdup(val); disabletest[1] = NULL; disablecount = 1; } else { disabletest = (char **)realloc(disabletest, (disablecount + 2) * sizeof(char *)); disabletest[disablecount] = strdup(val); disabletest[disablecount+1] = NULL; disablecount++; } } else if (strcmp(pwalk->name, "year") == 0) { schedtm.tm_year = atoi(pwalk->value) - 1900; } else if (strcmp(pwalk->name, "month") == 0) { schedtm.tm_mon = atoi(pwalk->value) - 1; } else if (strcmp(pwalk->name, "day") == 0) { schedtm.tm_mday = atoi(pwalk->value); } else if (strcmp(pwalk->name, "hour") == 0) { schedtm.tm_hour = atoi(pwalk->value); } else if (strcmp(pwalk->name, "minute") == 0) { schedtm.tm_min = atoi(pwalk->value); } /* Until start */ else if (strcmp(pwalk->name, "endyear") == 0) { endtm.tm_year = atoi(pwalk->value) - 1900; } else if (strcmp(pwalk->name, "endmonth") == 0) { endtm.tm_mon = atoi(pwalk->value) - 1; } else if (strcmp(pwalk->name, "endday") == 0) { endtm.tm_mday = atoi(pwalk->value); } else if (strcmp(pwalk->name, "endhour") == 0) { endtm.tm_hour = atoi(pwalk->value); } else if (strcmp(pwalk->name, "endminute") == 0) { endtm.tm_min = atoi(pwalk->value); } /* Until end */ else if (strcmp(pwalk->name, "canceljob") == 0) { cancelid = atoi(pwalk->value); } else if (strcmp(pwalk->name, "preview") == 0) { preview = (strcasecmp(pwalk->value, "on") == 0); } else if ((strcmp(pwalk->name, "hostpattern") == 0) && pwalk->value && strlen(pwalk->value)) { hostpattern = strdup(pwalk->value); } else if ((strcmp(pwalk->name, "pagepattern") == 0) && pwalk->value && strlen(pwalk->value)) { pagepattern = strdup(pwalk->value); } else if ((strcmp(pwalk->name, "ippattern") == 0) && pwalk->value && strlen(pwalk->value)) { ippattern = strdup(pwalk->value); } else if ((strcmp(pwalk->name, "classpattern") == 0) && pwalk->value && strlen(pwalk->value)) { classpattern = strdup(pwalk->value); } pwalk = pwalk->next; } schedtm.tm_isdst = -1; schedtime = mktime(&schedtm); endtm.tm_isdst = -1; endtime = mktime(&endtm); } void do_one_host(char *hostname, char *fullmsg, char *username) { char *xymoncmd = (char *)malloc(1024); int i, result; if (disableend == DISABLE_UNTIL) { nowtime = time(NULL); starttime = nowtime; if (action == ACT_SCHED_DISABLE) starttime = schedtime; if (duration > 0) { /* Convert to minutes unless "until OK" */ duration = (int) difftime (endtime, starttime) / 60; } scale = 1; } switch (action) { case ACT_ENABLE: for (i=0; (i < enablecount); i++) { if (preview) result = 0; else { xymoncmd = (char *)realloc(xymoncmd, 1024 + 2*strlen(hostname) + 2*strlen(enabletest[i]) + strlen(username)); sprintf(xymoncmd, "enable %s.%s", commafy(hostname), enabletest[i]); result = sendmessage(xymoncmd, NULL, XYMON_TIMEOUT, NULL); sprintf(xymoncmd, "notify %s.%s\nMonitoring of %s:%s has been ENABLED by %s\n", commafy(hostname), enabletest[i], hostname, enabletest[i], username); sendmessage(xymoncmd, NULL, XYMON_TIMEOUT, NULL); } if (preview) { printf("Enabling host %s", htmlquoted(hostname)); printf(" test %s", htmlquoted(enabletest[i])); printf(": %s\n", ((result == XYMONSEND_OK) ? "OK" : "Failed")); } } break; case ACT_DISABLE: for (i=0; (i < disablecount); i++) { if (preview) result = 0; else { xymoncmd = (char *)realloc(xymoncmd, 1024 + 2*strlen(hostname) + 2*strlen(disabletest[i]) + strlen(fullmsg) + strlen(username)); sprintf(xymoncmd, "disable %s.%s %d %s", commafy(hostname), disabletest[i], duration*scale, fullmsg); result = sendmessage(xymoncmd, NULL, XYMON_TIMEOUT, NULL); sprintf(xymoncmd, "notify %s.%s\nMonitoring of %s:%s has been DISABLED by %s for %d minutes\n%s", commafy(hostname), disabletest[i], hostname, disabletest[i], username, duration*scale, fullmsg); result = sendmessage(xymoncmd, NULL, XYMON_TIMEOUT, NULL); } if (preview) { printf("Disabling host %s", htmlquoted(hostname)); printf(" test %s", htmlquoted(disabletest[i])); printf(": %s\n", ((result == XYMONSEND_OK) ? "OK" : "Failed")); } } break; case ACT_SCHED_DISABLE: for (i=0; (i < disablecount); i++) { xymoncmd = (char *)realloc(xymoncmd, 1024 + 2*strlen(hostname) + strlen(disabletest[i]) + strlen(fullmsg)); sprintf(xymoncmd, "schedule %d disable %s.%s %d %s", (int) schedtime, commafy(hostname), disabletest[i], duration*scale, fullmsg); result = (preview ? 0 : sendmessage(xymoncmd, NULL, XYMON_TIMEOUT, NULL)); if (preview) { printf("Scheduling disable of host %s", htmlquoted(hostname)); printf("test %s", htmlquoted(disabletest[i])); printf(" at %s: %s\n", ctime(&schedtime), ((result == XYMONSEND_OK) ? "OK" : "Failed")); } } break; case ACT_SCHED_CANCEL: sprintf(xymoncmd, "schedule cancel %d", cancelid); result = (preview ? 0 : sendmessage(xymoncmd, NULL, XYMON_TIMEOUT, NULL)); if (preview) { printf("Canceling job %d : %s\n", cancelid, ((result == XYMONSEND_OK) ? "OK" : "Failed")); } break; default: errprintf("No action\n"); break; } xfree(xymoncmd); } int main(int argc, char *argv[]) { int argi, i; char *username = getenv("REMOTE_USER"); char *userhost = getenv("REMOTE_HOST"); char *userip = getenv("REMOTE_ADDR"); char *fullmsg = "No cause specified"; char *envarea = NULL; int obeycookies = 1; char *accessfn = NULL; if ((username == NULL) || (strlen(username) == 0)) username = "unknown"; if ((userhost == NULL) || (strlen(userhost) == 0)) userhost = userip; for (argi=1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } else if (strcmp(argv[argi], "--no-cookies") == 0) { obeycookies = 0; } else if (strcmp(argv[argi], "--debug") == 0) { debug = 1; } else if (argnmatch(argv[argi], "--access=")) { char *p = strchr(argv[argi], '='); accessfn = strdup(p+1); } } redirect_cgilog("enadis"); parse_cgi(); if (debug) preview = 1; if (cgi_method == CGI_GET) { /* * It's a GET, so the initial request. * If we have a pagepath cookie, use that as the initial * host-name filter. */ char *pagepath; action = ACT_FILTER; pagepath = get_cookie("pagepath"); if (obeycookies && pagepath && *pagepath) pagepattern = strdup(pagepath); } if (action == ACT_FILTER) { /* Present the query form */ load_hostnames(xgetenv("HOSTSCFG"), NULL, get_fqdn()); sethostenv("", "", "", colorname(COL_BLUE), NULL); sethostenv_filter(hostpattern, pagepattern, ippattern, classpattern); printf("Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); showform(stdout, "maint", "maint_form", COL_BLUE, getcurrenttime(NULL), NULL, NULL); return 0; } fullmsg = (char *)malloc(1024 + strlen(username) + strlen(userhost) + strlen(disablemsg)); sprintf(fullmsg, "\nDisabled by: %s @ %s\nReason: %s\n", username, userhost, disablemsg); /* * Ready ... go build the webpage. */ printf("Content-Type: %s\n", xgetenv("HTMLCONTENTTYPE")); if (!preview) { char *returl; // dbgprintf("Not a preview: sending to %s\n", textornull(getenv("HTTP_REFERER"))); /* We're done -- figure out where to send them */ if (getenv("HTTP_REFERER")) printf("Location: %s\n\n", getenv("HTTP_REFERER")); else { returl = (char *)malloc(strlen( xgetenv("SECURECGIBINURL") ) + 11); sprintf(returl, "%s/%s", xgetenv("SECURECGIBINURL"), "enadis.sh"); printf("Location: %s?\n\n", returl); } } else { printf("\n"); } /* It's ok with these hardcoded values, as they are not used for this page */ sethostenv("", "", "", colorname(COL_BLUE), NULL); if (preview) headfoot(stdout, "maintact", "", "header", COL_BLUE); if (debug) { printf("
\n");
		switch (action) {
		  case ACT_NONE   : dbgprintf("Action = none\n"); break;

		  case ACT_FILTER : dbgprintf("Action = filter\n"); break;

		  case ACT_ENABLE : dbgprintf("Action = enable\n"); 
				    dbgprintf("Tests = ");
				    for (i=0; (i < enablecount); i++) printf("%s ", enabletest[i]);
				    printf("\n");
				    break;

		  case ACT_DISABLE: dbgprintf("Action = disable\n"); 
				    dbgprintf("Tests = ");
				    for (i=0; (i < disablecount); i++) printf("%s ", disabletest[i]);
				    printf("\n");
				    if (disableend == DISABLE_UNTIL) {
				    	dbgprintf("Disable until: endtime = %d, duration = %d, scale = %d\n", endtime, duration, scale);
				     }	
			            else {
				    	dbgprintf("Duration = %d, scale = %d\n", duration, scale);
				    }
				    dbgprintf("Cause = %s\n", textornull(disablemsg));
				    break;

		  case ACT_SCHED_DISABLE:
				    dbgprintf("Action = schedule\n");
				    dbgprintf("Time = %s\n", ctime(&schedtime));
				    dbgprintf("Tests = ");
				    for (i=0; (i < disablecount); i++) printf("%s ", disabletest[i]);
				    printf("\n");
				    if (disableend == DISABLE_UNTIL) {
						  dbgprintf("Disable until: endtime = %d, duration = %d, scale = %d\n", endtime, duration, scale);
					  }	
			            else {
				    		  dbgprintf("Duration = %d, scale = %d\n", duration, scale);
				    }
				    dbgprintf("Cause = %s\n", textornull(disablemsg));
				    break;

		  case ACT_SCHED_CANCEL:
				    dbgprintf("Action = cancel\n");
				    dbgprintf("ID = %d\n", cancelid);
				    break;
		}
		printf("
\n"); } if (preview) printf("\n"); if (action == ACT_SCHED_CANCEL) { do_one_host(NULL, NULL, username); } else { /* Load the host data (for access control) */ if (accessfn) { load_web_access_config(accessfn); for (i = 0; (i < hostcount); i++) { if (web_access_allowed(getenv("REMOTE_USER"), hostnames[i], NULL, WEB_ACCESS_CONTROL)) { do_one_host(hostnames[i], fullmsg, username); } } } else { for (i = 0; (i < hostcount); i++) do_one_host(hostnames[i], fullmsg, username); } } if (preview) { printf("\n", xgetenv("HTTP_REFERER")); printf("


\n"); headfoot(stdout, "maintact", "", "footer", COL_BLUE); } return 0; } xymon-4.3.28/web/report.cgi.10000664000076400007640000000552313037531445016137 0ustar rpmbuildrpmbuild.TH REPORT.CGI 1 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME report.cgi \- CGI front-end to xymongen reporting .SH SYNOPSIS .B "report.cgi [\-\-noclean] [xymongen-options]" .SH DESCRIPTION \fBreport.cgi\fR is invoked as a CGI script via the report.sh CGI wrapper. It triggers the generation of a Xymon availability report for the timeperiod specified by the CGI parameters. report.cgi is passed a QUERY_STRING environment variable with the following parameters: start\-mon (Start month of the report) start\-day (Start day-of-month of the report) start\-yr (Start year of the report) end\-mon (End month of the report) end\-day (End day-of-month of the report) end\-yr (End year of the report) style (Report style) The following non-standard parameters are handled by the xymongen version of report.cgi: suburl (Page in report to go to, if not the top page) The "month" parameters must be specified as the three-letter english month name abbreviation: Jan, Feb, Mar ... Start- and end-days are in the range 1..31; the start- and end-year must be specified including century (e.g. "2003"). End-times beyond the current time are silently replaced with the current time. The generated report will include data for the start- and end-days, i.e. the report will begin at 00:00:00 of the start-day, and end at 23:59:59 of the end-day. The "style" parameter is passed directly to .I xymongen(1) and should be "crit", "non\-crit" or "all". Other values result in undefined behaviour. All of the processing involved in generating the report is done by invoking .I xymongen(1) with the proper "\-\-reportopts" option. .SH OPTIONS .IP \-\-noclean Do not clean the XYMONREPDIR directory of old reports. Makes the report-tool go a bit faster - instead, you can clean up the XYMONREPDIR directory e.g. via a cron-job. .IP "\-\-env=FILENAME" Load the environment from FILENAME before executing the CGI. .IP xymongen-options All other options passed to report.cgi are passed on to the .I xymongen(1) program building the report files. .SH FILES .IP $XYMONHOME/web/report_header HTML template header for the report request form .IP $XYMONHOME/web/report_footer HTML template footer for the report request form .IP $XYMONHOME/web/report_form HTML template report request form .SH "ENVIRONMENT VARIABLES" .IP XYMONGENREPOPTS xymongen options passed by default to the report.cgi. This happens in the report.sh wrapper. .IP XYMONHOME Home directory of the Xymon server installation .IP XYMONREPDIR Directory where generated reports are stored. This directory must be writable by the userid executing the CGI script, typically "www", "apache" or "nobody". Default: $XYMONHOME/www/rep/ .IP XYMONREPURL The URL prefix to use when accessing the reports via a browser. Default: $XYMONWEB/rep .SH "SEE ALSO" xymongen(1), hosts.cfg(5), xymonserver.cfg(5) xymon-4.3.28/web/hostlist.c0000664000076400007640000000754711645550676016040 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon hostlist report generator. */ /* */ /* Copyright (C) 2007-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: hostlist.c 6766 2011-10-13 11:55:42Z storner $"; #include #include #include #include "libxymon.h" cgidata_t *cgidata = NULL; char *pagefilter = NULL; char *testfilter = "cpu"; enum { SORT_IP, SORT_HOSTNAME } sortkey = SORT_HOSTNAME; char *fields = NULL; char csvchar = ','; void parse_query(void) { cgidata_t *cwalk; fields = strdup("XMH_HOSTNAME,XMH_IP"); cwalk = cgidata; while (cwalk) { /* * cwalk->name points to the name of the setting. * cwalk->value points to the value (may be an empty string). */ if (strcasecmp(cwalk->name, "page") == 0) { pagefilter = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "filter") == 0) { testfilter = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "sort") == 0) { if (strcasecmp(cwalk->value, "hostname") == 0) sortkey = SORT_HOSTNAME; else if (strcasecmp(cwalk->value, "ip") == 0) sortkey = SORT_IP; } else if (strncasecmp(cwalk->name, "XMH_", 4) == 0) { if (strcasecmp(cwalk->value, "on") == 0) { fields = (char *)realloc(fields, strlen(fields) + strlen(cwalk->name) + 2); strcat(fields, ","); strcat(fields, cwalk->name); } } else if (strcasecmp(cwalk->name, "csvdelim") == 0) { csvchar = *(cwalk->value); } cwalk = cwalk->next; } } int main(int argc, char *argv[]) { char *envarea = NULL; char *req, *board, *l; int argi, res; sendreturn_t *sres; char *cookie; pcre *dummy; init_timestamp(); for (argi=1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } else if (strcmp(argv[argi], "--debug") == 0) { debug = 1; } } cookie = get_cookie("pagepath"); if (cookie) sethostenv_pagepath(cookie); cgidata = cgi_request(); if (cgidata == NULL) { /* Present the query form */ sethostenv("", "", "", colorname(COL_BLUE), NULL); printf("Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); showform(stdout, "hostlist", "hostlist_form", COL_BLUE, getcurrenttime(NULL), NULL, NULL); return 0; } parse_query(); dummy = (testfilter ? compileregex(testfilter) : NULL); if (dummy == NULL) return 1; else freeregex(dummy); dummy = (pagefilter ? compileregex(pagefilter) : NULL); if (dummy == NULL) return 1; else freeregex(dummy); sres = newsendreturnbuf(1, NULL); req = malloc(1024 + strlen(fields) + strlen(testfilter) + strlen(pagefilter)); sprintf(req, "xymondboard fields=%s test=%s page=%s", fields, testfilter, pagefilter); res = sendmessage(req, NULL, XYMON_TIMEOUT, sres); if (res != XYMONSEND_OK) return 1; board = getsendreturnstr(sres, 1); freesendreturnbuf(sres); printf("Content-type: text/csv\n\n"); l = strtok(fields, ","); while (l) { printf("%s;", l); l = strtok(NULL, ",\n"); } printf("\n"); l = board; while (l && *l) { char *p; char *eoln = strchr(l, '\n'); if (eoln) *eoln = '\0'; do { p = strchr(l, '|'); if (p) *p = csvchar; } while (p); printf("%s\n", l); if (eoln) l = eoln+1; else l = NULL; } return 0; } xymon-4.3.28/web/xymonpage.cgi.10000664000076400007640000000161213037531445016626 0ustar rpmbuildrpmbuild.TH XYMONPAGE 1 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME xymonpage \- Utility to show a webpage using header and footer .SH SYNOPSIS .B "xymonpage [options]" .SH DESCRIPTION \fBxymonpage\fR is a tool to generate a webpage in the Xymon style, with a standard header- and footer as well as a Xymon background. The data to present on the webpage, apart from the header and footer, are passed to xymonpage in stdin. The generated webpage is printed to stdout. .SH OPTIONS .IP "--env=FILENAME" Loads the environment defined in FILENAME before executing the CGI script. .IP "--hffile=PREFIX" Use the header- and footer-files in $XYMONHOME/web/PREFIX_header and PREFIX_footer. If not specified, stdnormal_header and stdnormal_footer are used. .IP "--color=COLOR" Set the background color of the generated webpage to COLOR. Default: Blue .IP "--debug" Enable debugging output. .SH "SEE ALSO" xymon(7) xymon-4.3.28/web/appfeed.c0000664000076400007640000001616512000355653015547 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon status-log viewer CGI. */ /* */ /* This CGI provides an XML interface to the xymondboard status. Intended for */ /* use by external user interfaces, e.g. smartphones. */ /* */ /* Copyright (C) 2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: svcstatus.c 6765 2011-10-13 11:55:08Z storner $"; #include #include #include #include "libxymon.h" static char *queryfilter = NULL; static char *boardcmd = "xymondboard"; static char *fieldlist = "fields=hostname,testname,color,lastchange,logtime,cookie,acktime,ackmsg,disabletime,dismsg,line1"; static char *colorlist = "color=red,yellow,purple"; static void errormsg(char *msg) { fprintf(stderr, "Refresh: 30\nContent-type: %s\n\nInvalid request\n%s\n", xgetenv("HTMLCONTENTTYPE"), msg); } static int parse_query(void) { cgidata_t *cgidata = cgi_request(); cgidata_t *cwalk; cwalk = cgidata; while (cwalk) { if (strcasecmp(cwalk->name, "filter") == 0) { queryfilter = strdup(cwalk->value); } cwalk = cwalk->next; } if (!queryfilter) queryfilter = ""; /* See if the query includes a color filter - this overrides our default */ if ((strncmp(queryfilter, "color=", 6) == 0) || (strstr(queryfilter, " color=") != NULL)) colorlist = ""; return 0; } char *extractline(char *ptn, char **src) { char *pos = strstr(*src, ptn); char *eoln; if (pos == NULL) return NULL; eoln = strchr(pos, '\n'); if (eoln) *eoln = '\0'; if (pos == *src) *src = eoln+1; else *(pos-1) = '\0'; if (pos) pos += strlen(ptn); return pos; } int main(int argc, char **argv) { int argi; char *criticalconfig = NULL; char *envarea = NULL; char *accessfn = NULL; char *userid = getenv("REMOTE_USER"); FILE *output = stdout; char *xymondreq; sendreturn_t *sres; int xymondresult; char *log, *bol, *eoln, *endkey; for (argi = 1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } else if (strcmp(argv[argi], "--debug") == 0) { debug = 1; } else if (strcmp(argv[argi], "--hobbit") == 0) { boardcmd = "hobbitdboard"; } else if (argnmatch(argv[argi], "--critical=")) { char *p = strchr(argv[argi], '='); criticalconfig = strdup(p+1); } else if (argnmatch(argv[argi], "--access=")) { char *p = strchr(argv[argi], '='); accessfn = strdup(p+1); } } /* Setup the query for xymond */ parse_query(); xymondreq = (char *)malloc(strlen(boardcmd) + strlen(fieldlist) + strlen(colorlist) + strlen(queryfilter) + 5); sprintf(xymondreq, "%s %s %s %s", boardcmd, fieldlist, colorlist, queryfilter); /* Get the current status */ sres = newsendreturnbuf(1, NULL); xymondresult = sendmessage(xymondreq, NULL, XYMON_TIMEOUT, sres); if (xymondresult != XYMONSEND_OK) { char *errtxt = (char *)malloc(1024 + strlen(xymondreq)); sprintf(errtxt, "Status not available: Req=%s, result=%d\n", htmlquoted(xymondreq), xymondresult); errormsg(errtxt); return 1; } else { log = getsendreturnstr(sres, 1); } freesendreturnbuf(sres); /* Load the host data (for access control) */ if (accessfn) { load_hostnames(xgetenv("HOSTSCFG"), NULL, get_fqdn()); load_web_access_config(accessfn); } /* Load the critical config */ if (criticalconfig) load_critconfig(criticalconfig); fprintf(output, "Content-type: text/xml\n\n"); fprintf(output, "\n"); fprintf(output, "\n"); /* Step through the status board, one line at a time */ bol = log; while (bol && *bol) { int useit = 1; char *hostname, *testname, *color, *txt, *lastchange, *logtime, *cookie, *acktime, *ackmsg, *distime, *dismsg; eoln = strchr(bol, '\n'); if (eoln) *eoln = '\0'; if (criticalconfig) { critconf_t *cfg; /* The key for looking up items in the critical config is "hostname|testname", which we already have */ endkey = strchr(bol, '|'); if (endkey) endkey = strchr(endkey+1, '|'); *endkey = '\0'; cfg = get_critconfig(bol, CRITCONF_TIMEFILTER, NULL); *endkey = '|'; if (!cfg) useit = 0; } if (useit) { hostname = gettok(bol, "|"); testname = (hostname ? gettok(NULL, "|") : NULL); if (accessfn) useit = web_access_allowed(userid, hostname, testname, WEB_ACCESS_VIEW); } if (useit) { color = (testname ? gettok(NULL, "|") : NULL); lastchange = (color ? gettok(NULL, "|") : NULL); logtime = (lastchange ? gettok(NULL, "|") : NULL); cookie = (logtime ? gettok(NULL, "|") : NULL); acktime = (cookie ? gettok(NULL, "|") : NULL); ackmsg = (acktime ? gettok(NULL, "|") : NULL); distime = (ackmsg ? gettok(NULL, "|") : NULL); dismsg = (distime ? gettok(NULL, "|") : NULL); txt = (dismsg ? gettok(NULL, "|") : NULL); if (txt) { /* We have all data */ fprintf(output, "\n"); fprintf(output, " %s\n", hostname); fprintf(output, " %s\n", testname); fprintf(output, " %s\n", color); fprintf(output, " %s\n", lastchange); fprintf(output, " %s\n", logtime); fprintf(output, " %s\n", cookie); if (atoi(acktime) != 0) { char *ackedby; nldecode(ackmsg); ackedby = extractline("Acked by: ", &ackmsg); fprintf(output, " %s\n", acktime); fprintf(output, " \n", ackmsg); if (ackedby) fprintf(output, " \n", ackedby); } if (atoi(distime) != 0) { char *disabledby; nldecode(dismsg); disabledby = extractline("Disabled by: ", &dismsg); if (strncmp(dismsg, "Reason: ", 8) == 0) dismsg += 8; fprintf(output, " %s\n", distime); fprintf(output, " \n", dismsg); if (disabledby) fprintf(output, " \n", disabledby); } fprintf(output, " \n", txt); fprintf(output, " \n", hostsvcurl(hostname, testname, 0)); fprintf(output, "\n"); } } if (eoln) { *eoln = '\n'; bol = eoln+1; } else bol = NULL; } fprintf(output, "\n"); xfree(log); return 0; } xymon-4.3.28/web/findhost.c0000664000076400007640000002105113033575046015756 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon host finder. */ /* */ /* This is a CGI script to find hosts in the Xymon webpages without knowing */ /* their full name. When you have 1200+ hosts split on 60+ pages, it can be */ /* tiresome to do a manual search to find a host ... */ /* */ /* Copyright (C) 2003-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /* 2004/09/08 - Werner Michels [wm] */ /* Added support regular expression on the host search. */ /* Minor changes on errormsg() and error messagess. */ /* The parse_query was rewritten to meet the new needs. */ /* */ /*----------------------------------------------------------------------------*/ /* * [wm] - Functionality change * Now the search is done using only Extended POSIX pattern match. * If you don't know how Regex works, look at "man 7 regex". * If you want search for multiple hosts use "name1|name2|name3" insted * of separating them by spaces. You can now search for host (displayname) * with spaces. * Emtpy search string will list all the hosts. * * * * [wm] - TODO * - Move the new global vars to local vars and use function parameters * - Verify the security implication of removing the urlvalidate() call * - Move to POST instead of GET to receive the FORM data * - Add the posibility to choose where to search (hostname, description * host comment, host displayname, host clientname...) * */ static char rcsid[] = "$Id: findhost.c 7999 2017-01-06 02:00:06Z jccleaver $"; #include #include #include #include #include #include #include #include /*[wm] For the POSIX regex support*/ #include #include "libxymon.h" /* Global vars */ /* * [wm] To support regex searching */ char *pSearchPat = NULL; /* What're searching for (now its regex, not a hostlist) */ int re_flag = REG_EXTENDED|REG_NOSUB|REG_ICASE; /* default regcomp flags see man 3 regcomp */ /* You must remove REG_ICASE for case sensitive */ cgidata_t *cgidata = NULL; int dojump = 0; /* If set and there is only one page, go directly to it */ void errormsg(char *msg) { printf("Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); printf("Xymon FindHost Error\n"); printf("


%s\n", msg); exit(1); } void parse_query(void) { cgidata_t *cwalk; cwalk = cgidata; while (cwalk) { /* * cwalk->name points to the name of the setting. * cwalk->value points to the value (may be an empty string). */ if (strcasecmp(cwalk->name, "host") == 0) { pSearchPat = (char *)strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "case_sensitive") == 0 ) { /* remove the ignore case flag */ re_flag ^= REG_ICASE; } else if (strcasecmp(cwalk->name, "jump") == 0 ) { dojump = 1; } cwalk = cwalk->next; } } void print_header(void) { /* It's ok with these hardcoded values, as they are not used for this page */ sethostenv("", "", "", colorname(COL_BLUE), NULL); printf("Content-Type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); headfoot(stdout, "findhost", "", "header", COL_BLUE); printf("

\n"); printf("\n"); } void print_footer(void) { printf("
Hostname (DisplayName)IPLocation (Group Name)
\n"); headfoot(stdout, "findhost", "", "footer", COL_BLUE); } int main(int argc, char *argv[]) { void *hostwalk, *clonewalk; int argi; char *envarea = NULL; strbuffer_t *outbuf; char *oneurl = NULL; int gotany = 0; enum { OP_INITIAL, OP_YES, OP_NO } gotonepage = OP_INITIAL; /* Tracks if all matches are on one page */ char *onepage = NULL; /* If gotonepage==OP_YES, then this is the page */ /*[wm] regex support */ #define BUFSIZE 256 regex_t re; char re_errstr[BUFSIZE]; int re_status; for (argi=1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } } redirect_cgilog("findhost"); cgidata = cgi_request(); if (cgidata == NULL) { /* Present the query form */ sethostenv("", "", "", colorname(COL_BLUE), NULL); printf("Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); showform(stdout, "findhost", "findhost_form", COL_BLUE, getcurrenttime(NULL), NULL, NULL); return 0; } parse_query(); if ( (re_status = regcomp(&re, pSearchPat, re_flag)) != 0 ) { regerror(re_status, &re, re_errstr, BUFSIZE); print_header(); printf("%s\n", htmlquoted(pSearchPat)); printf("%s\n", re_errstr); print_footer(); return 0; } outbuf = newstrbuffer(0); load_hostnames(xgetenv("HOSTSCFG"), NULL, get_fqdn()); hostwalk = first_host(); while (hostwalk) { /* * [wm] - Allow the search to be done on the hostname * also on the "displayname" and the host comment * Maybe this should be implemented by changing the HTML form, but until than.. * we're supposing that hostname will NEVER be null */ char *hostname, *displayname, *comment, *ip; hostname = xmh_item(hostwalk, XMH_HOSTNAME); displayname = xmh_item(hostwalk, XMH_DISPLAYNAME); comment = xmh_item(hostwalk, XMH_COMMENT); ip = xmh_item(hostwalk, XMH_IP); if ( regexec (&re, hostname, (size_t)0, NULL, 0) == 0 || (regexec(&re, ip, (size_t)0, NULL, 0) == 0) || (displayname && regexec (&re, displayname, (size_t)0, NULL, 0) == 0) || (comment && regexec (&re, comment, (size_t)0, NULL, 0) == 0) ) { /* match */ addtobuffer_many(outbuf, "\n", " ", (displayname ? displayname : hostname), " \n", " ", ip, " \n", NULL); oneurl = (char *)malloc(4 + strlen(xgetenv("XYMONWEB")) + strlen(xmh_item(hostwalk, XMH_PAGEPATH)) + strlen(hostname)); sprintf(oneurl, "%s/%s/#%s", xgetenv("XYMONWEB"), xmh_item(hostwalk, XMH_PAGEPATH), hostname); addtobuffer_many(outbuf, " ", xmh_item(hostwalk, XMH_PAGEPATHTITLE), "\n", NULL); gotany++; /* See if all of the matches so far are on one page */ switch (gotonepage) { case OP_INITIAL: gotonepage = OP_YES; onepage = xmh_item(hostwalk, XMH_PAGEPATH); break; case OP_YES: if (strcmp(onepage, xmh_item(hostwalk, XMH_PAGEPATH)) != 0) gotonepage = OP_NO; break; case OP_NO: break; } clonewalk = next_host(hostwalk, 1); while (clonewalk && (strcmp(xmh_item(hostwalk, XMH_HOSTNAME), xmh_item(clonewalk, XMH_HOSTNAME)) == 0)) { addtobuffer_many(outbuf, "
", xmh_item(clonewalk, XMH_PAGEPATHTITLE), "\n", NULL); clonewalk = next_host(clonewalk, 1); gotany++; } addtobuffer(outbuf, "\n\n"); hostwalk = clonewalk; } else { hostwalk = next_host(hostwalk, 0); } } regfree (&re); /*[wm] - free regex compiled patern */ if (dojump) { if (gotany == 1) { printf("Location: %s\n\n", oneurl); return 0; } else if ((gotany > 1) && (gotonepage == OP_YES)) { printf("Location: %s/%s/\n\n", xgetenv("XYMONWEB"), onepage); return 0; } } print_header(); if (!gotany) { printf("%sNot found\n", htmlquoted(pSearchPat)); } else { printf("%s", grabstrbuffer(outbuf)); } print_footer(); /* [wm] - Free the strdup allocated memory */ if (pSearchPat) xfree(pSearchPat); return 0; } xymon-4.3.28/web/useradm.c0000664000076400007640000001423012656201271015575 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon webpage generator tool. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: useradm.c 6588 2010-11-14 17:21:19Z storner $"; #include #include #include #include #include #include "libxymon.h" static void errormsg(char *msg) { printf("Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); printf("Invalid request\n"); printf("%s\n", msg); exit(1); } static int idcompare(const void *p1, const void *p2) { return strcmp(* (char * const *) p1, * (char * const *) p2); } #define ACT_NONE 0 #define ACT_CREATE 1 #define ACT_DELETE 2 char *adduser_name = NULL; char *adduser_password = NULL; char *deluser_name = NULL; int parse_query(void) { cgidata_t *cgidata, *cwalk; int returnval = ACT_NONE; cgidata = cgi_request(); if (cgi_method != CGI_POST) return ACT_NONE; if (cgidata == NULL) errormsg(cgi_error()); cwalk = cgidata; while (cwalk) { /* * cwalk->name points to the name of the setting. * cwalk->value points to the value (may be an empty string). */ if (strcmp(cwalk->name, "USERNAME") == 0) { adduser_name = cwalk->value; } else if (strcmp(cwalk->name, "PASSWORD") == 0) { adduser_password = cwalk->value; } else if (strcmp(cwalk->name, "USERLIST") == 0) { deluser_name = cwalk->value; } else if (strcmp(cwalk->name, "SendCreate") == 0) { returnval = ACT_CREATE; } else if (strcmp(cwalk->name, "SendDelete") == 0) { returnval = ACT_DELETE; } cwalk = cwalk->next; } /* We only want to accept posts from certain pages */ if (returnval != ACT_NONE) { char cgisource[1024]; char *p; p = csp_header("useradm"); if (p) fprintf(stdout, "%s", p); snprintf(cgisource, sizeof(cgisource), "%s/%s", xgetenv("SECURECGIBINURL"), "useradm"); if (!cgi_refererok(cgisource)) { fprintf(stdout, "Location: %s.sh?\n\n", cgisource); return 0; } } return returnval; } int main(int argc, char *argv[]) { int argi, event; char *envarea = NULL; char *hffile = "useradm"; char *passfile = NULL; FILE *fd; char *infomsg = NULL; for (argi = 1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } else if (strcmp(argv[argi], "--debug") == 0) { debug = 1; } else if (argnmatch(argv[argi], "--passwdfile=")) { char *p = strchr(argv[argi], '='); passfile = strdup(p+1); } } if (passfile == NULL) { passfile = (char *)malloc(strlen(xgetenv("XYMONHOME")) + 20); sprintf(passfile, "%s/etc/xymonpasswd", xgetenv("XYMONHOME")); } event = parse_query(); if (adduser_name && !issimpleword(adduser_name)) { event = ACT_NONE; adduser_name = strdup(""); infomsg = "Invalid USERNAME. Letters, numbers, dashes, and periods only.\n"; } switch (event) { case ACT_NONE: /* Show the form */ break; case ACT_CREATE: /* Add a user */ { pid_t childpid; int n, ret; childpid = fork(); if (childpid < 0) { /* Fork failed */ errprintf("Could not fork child\n"); exit(1); } else if (childpid == 0) { /* child */ char *cmd; char **cmdargs; cmdargs = (char **) calloc(4 + 2, sizeof(char *)); cmdargs[0] = cmd = strdup("htpasswd"); cmdargs[1] = "-b"; cmdargs[2] = strdup(passfile); cmdargs[3] = strdup(adduser_name); cmdargs[4] = strdup(adduser_password); cmdargs[5] = '\0'; execvp(cmd, cmdargs); exit(127); } /* parent waits for htpasswd to finish */ if ((waitpid(childpid, &n, 0) == -1) || (WEXITSTATUS(n) != 0)) { infomsg = "Update FAILED"; } else { infomsg = "User added/updated"; } } break; case ACT_DELETE: /* Delete a user */ { pid_t childpid; int n, ret; childpid = fork(); if (childpid < 0) { /* Fork failed */ errprintf("Could not fork child\n"); exit(1); } else if (childpid == 0) { /* child */ char *cmd; char **cmdargs; cmdargs = (char **) calloc(3 + 2, sizeof(char *)); cmdargs[0] = cmd = strdup("htpasswd"); cmdargs[1] = "-D"; cmdargs[2] = strdup(passfile); cmdargs[3] = strdup(deluser_name); cmdargs[4] = '\0'; execvp(cmd, cmdargs); exit(127); } /* parent waits for htpasswd to finish */ if ((waitpid(childpid, &n, 0) == -1) || (WEXITSTATUS(n) != 0)) { infomsg = "Update delete FAILED"; } else { infomsg = "User deleted"; } } break; } sethostenv_clearlist(NULL); sethostenv_addtolist(NULL, "", "", NULL, 1); /* Have a blank entry first so we won't delete one by accident */ fd = fopen(passfile, "r"); if (fd != NULL) { char l[1024]; char *id, *delim; int usercount; char **userlist; int i; usercount = 0; userlist = (char **)calloc(usercount+1, sizeof(char *)); while (fgets(l, sizeof(l), fd)) { id = l; delim = strchr(l, ':'); if (delim) { *delim = '\0'; usercount++; userlist = (char **)realloc(userlist, (usercount+1)*sizeof(char *)); userlist[usercount-1] = strdup(id); userlist[usercount] = NULL; } } fclose(fd); qsort(&userlist[0], usercount, sizeof(char *), idcompare); for (i=0; (userlist[i]); i++) sethostenv_addtolist(NULL, userlist[i], userlist[i], NULL, 0); } fprintf(stdout, "Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); showform(stdout, hffile, "useradm_form", COL_BLUE, getcurrenttime(NULL), infomsg, NULL); return 0; } xymon-4.3.28/web/enadis.cgi.80000664000076400007640000000335313037531445016075 0ustar rpmbuildrpmbuild.TH ENADIS.CGI 8 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME enadis.cgi \- CGI program to enable/disable Xymon tests .SH SYNOPSIS .B "enadis.cgi (invoked via CGI from webserver)" .SH DESCRIPTION \fBenadis.cgi\fR is a CGI tool for disabling and enabling hosts and tests monitored by Xymon. You can disable monitoring of a single test, all tests for a host, or multiple hosts - immediately or at a future point in time. enadis.cgi runs as a CGI program, invoked by your webserver. It is normally run via a wrapper shell-script in the secured CGI directory for Xymon. enadis.cgi is the back-end script for the enable/disable form present on the "info" status-pages. It can also run in "stand-alone" mode, in which case it displays a web form allowing users to select what to enable or disable. .SH OPTIONS .IP "\-\-no\-cookies" Normally, enadis.cgi uses a cookie sent by the browser to initially filter the list of hosts presented. If this is not desired, you can turn off this behaviour by calling acknowledge.cgi with the \-\-no\-cookies option. This would normally be placed in the CGI_ENADIS_OPTS setting in .I cgioptions.cfg(5) .IP "\-\-env=FILENAME" Load the environment from FILENAME before executing the CGI. .IP "\-\-area=NAME" Load environment variables for a specific area. NB: if used, this option must appear before any \-\-env=FILENAME option. .SH FILES .IP "$XYMONHOME/web/maint_{header,form,footer}" HTML template header .SH BUGS When using alternate pagesets, hosts will only show up on the Enable/Disable page if this is accessed from the primary page in which they are defined. So if you have hosts on multiple pages, they will only be visible for disabling from their main page which is not what you would expect. .SH "SEE ALSO" xymon(7) xymon-4.3.28/web/reportlog.c0000664000076400007640000001243212006167014016147 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon report-mode statuslog viewer. */ /* */ /* This tool generates the report status log for a single status, with the */ /* availability percentages etc needed for a report-mode view. */ /* */ /* Copyright (C) 2003-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: reportlog.c 7136 2012-08-01 08:51:24Z storner $"; #include #include #include #include #include #include #include "libxymon.h" char *hostname = NULL; char *displayname = NULL; char *ip = NULL; char *reporttime = NULL; char *service = NULL; time_t st, end; int style; int color; double reportgreenlevel = 99.995; double reportwarnlevel = 98.0; int reportwarnstops = -1; cgidata_t *cgidata = NULL; static void errormsg(char *msg) { printf("Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); printf("Invalid request\n"); printf("%s\n", msg); exit(1); } static void parse_query(void) { cgidata_t *cwalk; cwalk = cgidata; while (cwalk) { /* * cwalk->name points to the name of the setting. * cwalk->value points to the value (may be an empty string). */ if (strcasecmp(cwalk->name, "HOSTSVC") == 0) { char *p = strrchr(cwalk->value, '.'); if (p) { *p = '\0'; service = strdup(p+1); } hostname = strdup(basename(cwalk->value)); while ((p = strchr(hostname, ','))) *p = '.'; } else if (strcasecmp(cwalk->name, "HOST") == 0) { hostname = strdup(basename(cwalk->value)); } else if (strcasecmp(cwalk->name, "SERVICE") == 0) { service = strdup(basename(cwalk->value)); } else if (strcasecmp(cwalk->name, "REPORTTIME") == 0) { reporttime = (char *) malloc(strlen(cwalk->value)+strlen("REPORTTIME=")+1); sprintf(reporttime, "REPORTTIME=%s", cwalk->value); } else if (strcasecmp(cwalk->name, "WARNPCT") == 0) { reportwarnlevel = atof(cwalk->value); } else if (strcasecmp(cwalk->name, "STYLE") == 0) { if (strcmp(cwalk->value, "crit") == 0) style = STYLE_CRIT; else if (strcmp(cwalk->value, "nongr") == 0) style = STYLE_NONGR; else style = STYLE_OTHER; } else if (strcasecmp(cwalk->name, "ST") == 0) { /* Must be after "STYLE" */ st = atol(cwalk->value); } else if (strcasecmp(cwalk->name, "END") == 0) { end = atol(cwalk->value); } else if (strcasecmp(cwalk->name, "COLOR") == 0) { char *colstr = (char *) malloc(strlen(cwalk->value)+2); sprintf(colstr, "%s ", cwalk->value); color = parse_color(colstr); xfree(colstr); } else if (strcasecmp(cwalk->name, "RECENTGIFS") == 0) { use_recentgifs = atoi(cwalk->value); } cwalk = cwalk->next; } } int main(int argc, char *argv[]) { char histlogfn[PATH_MAX]; FILE *fd; char *textrepfn = NULL, *textrepfullfn = NULL, *textrepurl = NULL; FILE *textrep; reportinfo_t repinfo; int argi; char *envarea = NULL; void *hinfo; for (argi=1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } } redirect_cgilog("reportlog"); cgidata = cgi_request(); parse_query(); load_hostinfo(hostname); if ((hinfo = hostinfo(hostname)) == NULL) { errormsg("No such host"); return 1; } ip = xmh_item(hinfo, XMH_IP); displayname = xmh_item(hinfo, XMH_DISPLAYNAME); if (!displayname) displayname = hostname; sprintf(histlogfn, "%s/%s.%s", xgetenv("XYMONHISTDIR"), commafy(hostname), service); fd = fopen(histlogfn, "r"); if (fd == NULL) { errormsg("Cannot open history file"); } color = parse_historyfile(fd, &repinfo, hostname, service, st, end, 0, reportwarnlevel, reportgreenlevel, reportwarnstops, reporttime); fclose(fd); textrepfn = (char *)malloc(1024 + strlen(hostname) + strlen(service)); sprintf(textrepfn, "avail-%s-%s-%u-%lu.txt", hostname, service, (unsigned int)getcurrenttime(NULL), (unsigned long)getpid()); textrepfullfn = (char *)malloc(1024 + strlen(xgetenv("XYMONREPDIR")) + strlen(textrepfn)); sprintf(textrepfullfn, "%s/%s", xgetenv("XYMONREPDIR"), textrepfn); textrepurl = (char *)malloc(1024 + strlen(xgetenv("XYMONREPURL")) + strlen(textrepfn)); sprintf(textrepurl, "%s/%s", xgetenv("XYMONREPURL"), textrepfn); textrep = fopen(textrepfullfn, "w"); /* Now generate the webpage */ printf("Content-Type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); generate_replog(stdout, textrep, textrepurl, hostname, service, color, style, ip, displayname, st, end, reportwarnlevel, reportgreenlevel, reportwarnstops, &repinfo); if (textrep) fclose(textrep); return 0; } xymon-4.3.28/web/Makefile0000664000076400007640000001714612615453444015450 0ustar rpmbuildrpmbuildXYMONLIB = ../lib/libxymon.a XYMONLIBS = $(XYMONLIB) XYMONCOMMLIB = ../lib/libxymoncomm.a XYMONCOMMLIBS = $(XYMONCOMMLIB) $(SSLLIBS) $(NETLIBS) $(LIBRTDEF) XYMONTIMELIB = ../lib/libxymontime.a XYMONTIMELIBS = $(XYMONTIMELIB) $(LIBRTDEF) PROGRAMS = history.cgi eventlog.cgi report.cgi reportlog.cgi snapshot.cgi findhost.cgi csvinfo.cgi acknowledge.cgi xymonpage datepage.cgi svcstatus.cgi enadis.cgi confreport.cgi criticalview.cgi criticaleditor.cgi ackinfo.cgi statusreport.cgi boilerplate.cgi hostgraphs.cgi ghostlist.cgi notifications.cgi acknowledgements.cgi hostlist.cgi useradm.cgi chpasswd.cgi appfeed.cgi cgiwrap CGISCRIPTS = history.sh eventlog.sh report.sh reportlog.sh snapshot.sh findhost.sh csvinfo.sh columndoc.sh datepage.sh svcstatus.sh historylog.sh confreport.sh confreport-critical.sh criticalview.sh certreport.sh nongreen.sh hostgraphs.sh ghostlist.sh notifications.sh acknowledgements.sh hostlist.sh topchanges.sh appfeed.sh appfeed-critical.sh SECCGISCRIPTS = acknowledge.sh enadis.sh criticaleditor.sh ackinfo.sh useradm.sh chpasswd.sh ifeq ($(DORRD),yes) PROGRAMS += showgraph.cgi perfdata.cgi CGISCRIPTS += showgraph.sh perfdata.sh endif CGIWRAPOBJS = cgiwrap.o HISTOBJS = history.o EVENTLOGOBJS = eventlog.o REPOBJS = report.o REPLOGOBJS = reportlog.o SNAPOBJS = snapshot.o FINDHOSTOBJS = findhost.o CSVINFOOBJS = csvinfo.o ACKCGIOBJS = acknowledge.o WEBPAGEOBJS = xymonpage.o DATEPAGEOBJS = datepage.o APPFEEDOBJS = appfeed.o SHOWGRAPHOBJS = showgraph.o SVCSTATUSOBJS = svcstatus.o svcstatus-info.o svcstatus-trends.o ENADISOBJS = enadis.o CRITVIEWOBJS = criticalview.o CRITEDITOBJS = criticaleditor.o ACKINFOOBJS = ackinfo.o CONFREPOBJS = confreport.o STATUSREPOBJS = statusreport.o MAILACKOBJS = xymon-mailack.o GHOSTOBJS = ghostlist.o NOTIFYOBJS = notifications.o ACKNOWLEDGEOBJS = acknowledgements.o HOSTLISTOBJS = hostlist.o PERFDATAOBJS = perfdata.o USERADMOBJS = useradm.o CHPASSWDOBJS = chpasswd.o HOSTGRAPHSOBJS = hostgraphs.o BOILERPLATEOBJS = boilerplate.o IDTOOL := $(shell if test `uname -s` = "SunOS"; then echo /usr/xpg4/bin/id; else echo id; fi) all: $(PROGRAMS) cgiwrap.o: cgiwrap.c $(CC) $(CFLAGS) -DXYMONHOME=\"$(XYMONHOME)\" -c -o $@ $< cgiwrap: $(CGIWRAPOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(CGIWRAPOBJS) $(XYMONCOMMLIBS) $(PCRELIBS) history.cgi: $(HISTOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(HISTOBJS) $(XYMONCOMMLIBS) $(PCRELIBS) eventlog.cgi: $(EVENTLOGOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(EVENTLOGOBJS) $(XYMONCOMMLIBS) $(PCRELIBS) report.cgi: $(REPOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(REPOBJS) $(XYMONCOMMLIBS) $(PCRELIBS) reportlog.cgi: $(REPLOGOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(REPLOGOBJS) $(XYMONCOMMLIBS) $(PCRELIBS) snapshot.cgi: $(SNAPOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(SNAPOBJS) $(XYMONCOMMLIBS) $(PCRELIBS) findhost.cgi: $(FINDHOSTOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(FINDHOSTOBJS) $(XYMONCOMMLIBS) $(PCRELIBS) csvinfo.cgi: $(CSVINFOOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(CSVINFOOBJS) $(XYMONCOMMLIBS) $(PCRELIBS) acknowledge.cgi: $(ACKCGIOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(ACKCGIOBJS) $(XYMONCOMMLIBS) $(PCRELIBS) xymonpage: $(WEBPAGEOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(WEBPAGEOBJS) $(XYMONCOMMLIBS) $(PCRELIBS) datepage.cgi: $(DATEPAGEOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(DATEPAGEOBJS) $(XYMONCOMMLIBS) $(PCRELIBS) showgraph.o: showgraph.c $(CC) $(CFLAGS) $(PCREINCDIR) $(RRDDEF) $(RRDINCDIR) -c -o $@ $< # Need NETLIBS on Solaris for getservbyname(), called by parse_url() showgraph.cgi: $(SHOWGRAPHOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(RPATHOPT) $(SHOWGRAPHOBJS) $(XYMONCOMMLIBS) $(PCRELIBS) $(RRDLIBS) svcstatus.cgi: $(SVCSTATUSOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(SVCSTATUSOBJS) $(XYMONCOMMLIBS) $(PCRELIBS) enadis.cgi: $(ENADISOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(ENADISOBJS) $(XYMONCOMMLIBS) $(PCRELIBS) statusreport.cgi: $(STATUSREPOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(STATUSREPOBJS) $(XYMONCOMMLIBS) $(PCRELIBS) confreport.cgi: $(CONFREPOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(CONFREPOBJS) $(XYMONCOMMLIBS) $(PCRELIBS) criticalview.cgi: $(CRITVIEWOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(RPATHOPT) $(CRITVIEWOBJS) $(XYMONCOMMLIBS) $(PCRELIBS) criticalview.o: criticalview.c $(CC) $(CFLAGS) $(PCREINCDIR) -c -o $@ $< criticaleditor.cgi: $(CRITEDITOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(RPATHOPT) $(CRITEDITOBJS) $(XYMONCOMMLIBS) $(PCRELIBS) ackinfo.cgi: $(ACKINFOOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(RPATHOPT) $(ACKINFOOBJS) $(XYMONCOMMLIBS) boilerplate.cgi: $(BOILERPLATEOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(RPATHOPT) $(BOILERPLATEOBJS) $(XYMONCOMMLIBS) $(PCRELIBS) hostgraphs.cgi: $(HOSTGRAPHSOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(RPATHOPT) $(HOSTGRAPHSOBJS) $(XYMONCOMMLIBS) $(PCRELIBS) ghostlist.cgi: $(GHOSTOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(RPATHOPT) $(GHOSTOBJS) $(XYMONCOMMLIBS) $(PCRELIBS) notifications.cgi: $(NOTIFYOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(RPATHOPT) $(NOTIFYOBJS) $(XYMONCOMMLIBS) $(PCRELIBS) acknowledgements.cgi: $(ACKNOWLEDGEOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(RPATHOPT) $(ACKNOWLEDGEOBJS) $(XYMONCOMMLIBS) $(PCRELIBS) hostlist.cgi: $(HOSTLISTOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(RPATHOPT) $(HOSTLISTOBJS) $(XYMONCOMMLIBS) $(PCRELIBS) perfdata.o: perfdata.c $(CC) $(CFLAGS) $(PCREINCDIR) $(RRDDEF) $(RRDINCDIR) -c -o $@ $< # Need -lm on perfdata because it refers to isnan() perfdata.cgi: $(PERFDATAOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(RPATHOPT) $(PERFDATAOBJS) $(XYMONCOMMLIBS) $(PCRELIBS) $(RRDLIBS) -lm useradm.cgi: $(USERADMOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(RPATHOPT) $(USERADMOBJS) $(XYMONCOMMLIBS) $(PCRELIBS) chpasswd.cgi: $(CHPASSWDOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(RPATHOPT) $(CHPASSWDOBJS) $(XYMONCOMMLIBS) $(PCRELIBS) appfeed.cgi: $(APPFEEDOBJS) $(XYMONLIB) $(CC) $(CFLAGS) -o $@ $(RPATHOPT) $(APPFEEDOBJS) $(XYMONCOMMLIBS) $(XYMONLIBS) $(PCRELIBS) %.o: %.c $(CC) $(CFLAGS) -c -o $@ $< clean: rm -f $(PROGRAMS) *.o *~ install: install-bin install-cgi install-man install-bin: ifndef PKGBUILD chown $(XYMONUSER) $(PROGRAMS) chgrp `$(IDTOOL) -g $(XYMONUSER)` $(PROGRAMS) chmod 755 $(PROGRAMS) endif cp -fp $(PROGRAMS) $(INSTALLROOT)$(INSTALLBINDIR)/ install-cgi: mkdir -p $(INSTALLROOT)$(CGIDIR) mkdir -p $(INSTALLROOT)$(SECURECGIDIR) ifndef PKGBUILD for F in $(CGISCRIPTS); do ln -f $(INSTALLROOT)$(INSTALLBINDIR)/cgiwrap $(INSTALLROOT)$(CGIDIR)/$$F; done for F in $(SECCGISCRIPTS); do ln -f $(INSTALLROOT)$(INSTALLBINDIR)/cgiwrap $(INSTALLROOT)$(SECURECGIDIR)/$$F; done else for F in $(CGISCRIPTS); do ln -f $(INSTALLROOT)$(INSTALLBINDIR)/cgiwrap $(INSTALLROOT)$(CGIDIR)/$$F; done for F in $(SECCGISCRIPTS); do ln -f $(INSTALLROOT)$(INSTALLBINDIR)/cgiwrap $(INSTALLROOT)$(SECURECGIDIR)/$$F; done endif install-man: ifndef PKGBUILD chown $(XYMONUSER) *.1 *.5 *.8 chgrp `$(IDTOOL) -g $(XYMONUSER)` *.1 *.5 *.8 chmod 644 *.1 *.5 *.8 endif mkdir -p $(INSTALLROOT)$(MANROOT)/man1 $(INSTALLROOT)$(MANROOT)/man5 $(INSTALLROOT)$(MANROOT)/man8 ifndef PKGBUILD chown $(XYMONUSER) $(INSTALLROOT)$(MANROOT)/man1 $(INSTALLROOT)$(MANROOT)/man5 $(INSTALLROOT)$(MANROOT)/man8 chgrp `$(IDTOOL) -g $(XYMONUSER)` $(INSTALLROOT)$(MANROOT)/man1 $(INSTALLROOT)$(MANROOT)/man5 $(INSTALLROOT)$(MANROOT)/man8 chmod 755 $(INSTALLROOT)$(MANROOT)/man1 $(INSTALLROOT)$(MANROOT)/man5 $(INSTALLROOT)$(MANROOT)/man8 endif cp -fp *.1 $(INSTALLROOT)$(MANROOT)/man1/ cp -fp *.5 $(INSTALLROOT)$(MANROOT)/man5/ cp -fp *.8 $(INSTALLROOT)$(MANROOT)/man8/ xymon-4.3.28/web/statusreport.c0000664000076400007640000001450012003541731016706 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon status report generator. */ /* */ /* This is a CGI program to generate a simple HTML table with a summary of */ /* all FOO statuses for a group of hosts. */ /* */ /* E.g. this can generate a report of all SSL certificates that are about */ /* to expire. */ /* */ /* Copyright (C) 2006-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: statusreport.c 7117 2012-07-24 15:48:41Z storner $"; #include #include #include #include "libxymon.h" int main(int argc, char *argv[]) { char *envarea = NULL; char *server = NULL; char *cookie, *pagefilter = ""; char *filter = NULL; char *heading = NULL; int showcolors = 1; int showcolumn = 0; int addlink = 0; int allhosts = 0; int summary = 0; int embedded = 0; char *req, *board, *l; int argi, res; sendreturn_t *sres; init_timestamp(); for (argi=1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } else if (strcmp(argv[argi], "--debug") == 0) { debug = 1; } else if ( argnmatch(argv[argi], "--column=") || argnmatch(argv[argi], "--test=")) { char *p = strchr(argv[argi], '='); int needed; needed = 10 + strlen(p); if (filter) needed += strlen(filter); filter = (char *)(filter ? realloc(filter, needed) : calloc(1, needed)); sprintf(filter + strlen(filter), " test=%s", p+1); if (!heading) { heading = (char *)malloc(1024 + strlen(p) + strlen(timestamp)); sprintf(heading, "%s report on %s", p+1, timestamp); } } else if (argnmatch(argv[argi], "--filter=")) { char *p = strchr(argv[argi], '='); int needed; needed = 10 + strlen(p); if (filter) needed += strlen(filter); filter = (char *)(filter ? realloc(filter, needed) : calloc(1, needed)); sprintf(filter + strlen(filter), " %s", p+1); } else if (argnmatch(argv[argi], "--heading=")) { char *p = strchr(argv[argi], '='); heading = strdup(p+1); } else if (strcmp(argv[argi], "--show-column") == 0) { showcolumn = 1; } else if (strcmp(argv[argi], "--show-test") == 0) { showcolumn = 1; } else if (strcmp(argv[argi], "--show-colors") == 0) { showcolors = 1; } else if (strcmp(argv[argi], "--show-summary") == 0) { summary = 1; } else if (strcmp(argv[argi], "--show-message") == 0) { summary = 0; } else if (strcmp(argv[argi], "--link") == 0) { addlink = 1; } else if (strcmp(argv[argi], "--no-colors") == 0) { showcolors = 0; } else if (strcmp(argv[argi], "--all") == 0) { allhosts = 1; } else if (strcmp(argv[argi], "--embedded") == 0) { embedded = 1; } } if (!filter) allhosts = 1; if (!allhosts) { /* Setup the filter we use for the report */ cookie = get_cookie("pagepath"); if (cookie && *cookie) { pcre *dummy; char *re = (char *)malloc(8 + 2*strlen(cookie)); sprintf(re, "^%s$|^%s/.+", cookie, cookie); dummy = compileregex(re); if (dummy) { freeregex(dummy); pagefilter = malloc(10 + strlen(re)); sprintf(pagefilter, "page=%s", re); } } } sres = newsendreturnbuf(1, NULL); req = malloc(1024 + strlen(pagefilter) + strlen(filter)); sprintf(req, "xymondboard fields=hostname,testname,color,msg %s %s", pagefilter, filter); res = sendmessage(req, server, XYMON_TIMEOUT, sres); board = getsendreturnstr(sres, 1); freesendreturnbuf(sres); if (res != XYMONSEND_OK) return 1; if (!embedded) { printf("Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); printf("%s\n", htmlquoted(heading)); printf(""); printf("\n", (showcolumn ? "Host/Column" : "Host")); } l = board; while (l && *l) { char *hostname, *testname = NULL, *colorstr = NULL, *msg = NULL, *p; char *eoln = strchr(l, '\n'); if (eoln) *eoln = '\0'; hostname = l; p = strchr(l, '|'); if (p) { *p = '\0'; l = testname = p+1; } p = strchr(l, '|'); if (p) { *p = '\0'; l = colorstr = p+1; } p = strchr(l, '|'); if (p) { *p = '\0'; l = msg = p+1; } if (hostname && testname && colorstr && msg) { char *msgeol; nldecode(msg); msgeol = strchr(msg, '\n'); if (msgeol) { /* Skip the first status line */ msg = msgeol + 1; } printf("\n"); printf("\n"); } if (eoln) l = eoln+1; else l = NULL; } if (!embedded) printf("
%sStatus
"); if (addlink) printf("%s", hostsvcurl(hostname, xgetenv("INFOCOLUMN"), 1), htmlquoted(hostname)); else printf("%s", htmlquoted(hostname)); if (showcolumn) { printf("
"); if (addlink) printf("%s", hostsvcurl(hostname, testname, 1), htmlquoted(testname)); else printf("%s", htmlquoted(testname)); } if (showcolors) printf(" - %s", colorstr); printf("
\n");

			if (summary) {
				int firstline = 1;
				char *bol, *eol;

				bol = msg;
				while (bol) {
					eol = strchr(bol, '\n'); if (eol) *eol = '\0';

					if (firstline) {
						if (!isspace((int)*bol)) {
							printf("%s\n", bol);
							firstline = 0;
						}
					}
					else if ((*bol == '&') && (strncmp(bol, "&green", 6) != 0)) {
						printf("%s\n", bol);
					}

					bol = (eol ? eol+1 : NULL);
				}
			}
			else {
				printf("%s", msg);
			}

			printf("
\n"); return 0; } xymon-4.3.28/web/graphs.cfg.50000664000076400007640000000766413037531445016121 0ustar rpmbuildrpmbuild.TH GRAPHS.CFG 5 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME graphs.cfg \- Configuration of the showgraph CGI .SH SYNOPSIS .B $XYMONHOME/etc/graphs.cfg .SH DESCRIPTION .I showgraph.cgi(1) uses the configuration file $XYMONHOME/etc/graphs.cfg to build graphs from the RRD files collected by Xymon. .SH FILE FORMAT Each definition of a graph type begins with a "[SERVICE]" indicator, this is the name passed as the "service" parameter to .I showgraph.cgi(1). If the service name passed to showgraph.cgi is not found, it will attempt to match the service name to a graph via the TEST2RRD environment variable. So calling showgraph.cgi with "service=cpu" or "service=la" will end up producing the same graph. A graph definition needs to have a TITLE and a YAXIS setting. These are texts shown as the title of the graph, and the YAXIS heading respectively. (The X-axis is always time-based). If a fixed set of RRD files are used for the graph, you just write those in the RRDtool definitions. Note that Xymon keeps all RRD files for a host in a separate directory per host, so you need not worry about the hostname being part of the RRD filename. For graphs that use multiple RRD files as input, you specify a filename pattern in the FNPATTERN statement, and optionally a pattern of files to exclude from the graph with EXFNPATTERN (see "[tcp]" for an example). When FNPATTERN is used, you can use "@RRDFN@" in the RRDtool definitions to pick up each filename. "@RRDIDX@" is an index (starting at 0) for each file in the set. "@RRDPARAM@" contains the first word extracted from the pattern of files (see e.g. "[memory]" how this is used). "@COLOR@" picks a new color for each graph automatically. The remainder of the lines in each definition are passed directly to the RRDtool rrd_graph() routine. The following is an example of how the "la" (cpu) graph is defined. This is a simple definition that uses a single RRD-file, la.rrd: .sp [la] .br TITLE CPU Load .br YAXIS Load .br DEF:avg=la.rrd:la:AVERAGE .br CDEF:la=avg,100,/ .br AREA:la#00CC00:CPU Load Average .br GPRINT:la:LAST: \: %5.1lf (cur) .br GPRINT:la:MAX: \: %5.1lf (max) .br GPRINT:la:MIN: \: %5.1lf (min) .br GPRINT:la:AVERAGE: \: %5.1lf (avg)\\n .sp Here is an example of a graph that uses multiple RRD-files, determined automatically at run-time via the FNPATTERN setting. Note how it uses the @RRDIDX@ to define a unique RRD parameter per input-file, and the @COLOR@ and @RRDPARAM@ items to pick unique colors and a matching text for the graph legend: .sp [disk] .br FNPATTERN disk(.*).rrd .br TITLE Disk Utilization .br YAXIS % Full .br DEF:p@RRDIDX@=@RRDFN@:pct:AVERAGE .br LINE2:p@RRDIDX@#@COLOR@:@RRDPARAM@ .br \-u 100 .br \-l 0 .br GPRINT:p@RRDIDX@:LAST: \: %5.1lf (cur) .br GPRINT:p@RRDIDX@:MAX: \: %5.1lf (max) .br GPRINT:p@RRDIDX@:MIN: \: %5.1lf (min) .br GPRINT:p@RRDIDX@:AVERAGE: \: %5.1lf (avg)\\n .SH ADVANCED GRAPH TITLES Normally the title of a graph is a static text defined in the graphs.cfg file. However, there may be situations where you want to use different titles for the same type of graph, e.g. if you are incorporating RRD files from MRTG into Xymon. In that case you can setup the TITLE definition so that it runs a custom script to determine the graph title. Like this: .sp TITLE exec:/usr/local/bin/graphitle .sp The \fB/usr/local/bin/graphtitle\fR command is then called with the hostname, the graphtype, the period string, and all of the RRD files used as parameters. The script must generate one line of output, which is then used as the title of the graph. .SH ENVIRONMENT .BR TEST2RRD Maps service names to graph definitions. .SH NOTES Most of the RRD graph definitions shipped with Xymon have been ported from the definitions in the \fBlarrd\-grapher.cgi\fR CGI from LARRD 0.43c. .SH "SEE ALSO" xymonserver.cfg(5), rrdtool(1), rrdgraph(1) xymon-4.3.28/docs/0000775000076400007640000000000013037531513014143 5ustar rpmbuildrpmbuildxymon-4.3.28/docs/mainview.jpg0000664000076400007640000013671411070452713016477 0ustar rpmbuildrpmbuildÿØÿàJFIFHHÿÛC  !"$"$ÿÛCÿÀº"ÿÄ ÿÄ] !1A"Q“Ó2TUW’•ÑSV–ÒÔ#3Baq$%45Rbst…‘²Á 7‚„¡±ðCDdu³µÂ&Erƒá´ÿÄÿÄ<Q!1S‘ÑA3RaqÒð"¡±Á2BCáñ#’ÂbcrÿÚ ?ôôùrÓ:BS)ä¤Q‡b+˜ørÙž–ÿxaQÿIÿJ¯üÌT4ª/Ò¾*ªy„꼞¿ûé=ì³bå _²O']òß2hޱŸ›çfK9œQê›Ö+*zKíÈq´´ê–FQÜCObê‘¡Ç“Iïr¶Ã¶Ã–Ìô·ûúñUº©b£œ'S©8¿“µ‹XQªQÐËvIð¶„ßyï;žÑð,WŽ!á\EQyú–DáY•H’êÙtIih6ÅçhóþЕl©#Qæ°ïå³=-þðÖÌô·ûÃ|?¡ ·S¬È«IZó©×Zi²EÈ‹"ÚSd‘™fÌ­§uËl@É÷å³=-þðÖÌô·ûÃ~ÇGåÖ4‹Vc PŸ8õ6Iuå:|åNAS¡šœaÕÕ«#7‰ÔÜîYOø·x¿ãbJùaæª FC Œ–NL9)[(t×!rK¤ƒ5 M‘d3ºŽé!‚ܬ׊G›W¨Ô_bîIîe«#hI©J²ngb#;«e¾ì†˜©©×#8M>”?˜ÚY¥+$¨ˆú§•iU‚ˆ÷ cLµ¬ü/¤¦Ï&%œ¨¨©hÓ-ÄJÍkRÒkë©Å4ŒŠI›;æÚCyXÄUÅV*t†ªÜÞÛ¸­ŠKSI–ÍPØU1™&IÌ“I©NšF²V×Ka؈hrÙž–ÿxaËfz[ýáŠRN.ÅiÕx Ö$ÖÞo"ŠÔè¬ÄCì±ÈZxȵ†† Ífd]{3,ìŸ56=cÊE¤?R—H•#¹N\—Û„ôµÄ*{Ò?h–MÆPîd‘­±)Q¦Ê4˜÷-™éo÷†¶g¥¿ÞÄӌCe‡d»)ÆÛJû¤’[¦EcZ‰”Ü÷žR"Û°ˆ¶•bŸ­I—KžÑ=[+aäñ!Ddeþã&Ç–Ìô·ûÃ(•eËiNÅ©ªCiqmš1УBÓr=éRT“.FG´…ZSæ×©0ty=õ;U)K‡[sr—>E-ÓÿN…°Ÿÿ½VóGÂmsˤE~B^©º¥i¹I§$Í6£Îq¦ui’Zµ6„&Ëþ#êm¹Æ {–Ìô·ûÃ[3Òßï ið¼æê˜j—SjW+n\6_Kú­^´–‚Q/'ðÞ÷· Øl@~[3Òßï s8çHLaOÎ ªÈÖ²ô•òc#Ô°ÎMkªÌ´Ý)Ö#bs(ï±'cTJ=#³ˆçÕh´Jþ%‰U’×'¬¿‘KÆLeVG ”›#J:ÊQ™žÓ2Ób³á·#D¨¦´Ô6"Óåq*Èã¯ÔD¢,¦›£*úŠ3WX¬éËfz[ýá}sF¢C“*©YTfãCzk„n©KÔ2Dn¸H+©DœÉ½ˆüä–ó!_cJŒ¬Oôe©Ö”êáȨá%Îs“’NƸºÅ6YÉ]U\Ò|lgc#±––äTéøV©@rµ*§ü_’ûÒ[dœ}ÆÊ16£6„–T¼âH’DFFW¹•Àÿ-™éo÷†¶g¥¿ÞøÁ“ïËfz[ýá‡-™éo÷†<Ý‚¨‹¦`­Öƒ°¥/®J¬Ód™Ô_Öjˆ‰hÔ7}i™%ÂÖ.ÉZÏ­kŽëÊ:÷+ç¿( '•ËÌZ†²j¹V£6lºÝnOî‹æË—øm´dÁkòÙž–ÿxaËfz[ýáŠz«ˆ±“[o”2<^Å™ù3ƒc—¡ƒ+©&æ±m]Ëæ±!{[_Ëõlx}üFÆ/ZTx¥ÚK0—OaQÒªª„“U’N)hI’ˆÉdG”ˆÈÎæ`\|¶g¥¿ÞrÙž–ÿxb®¨ÖëmìKK¨âYsQ%6LY®AaR©RcTIA6Ù™©”’¢²MË«1'o"Æ&Ҹ¡‡Ú“‹Í¸Ñ%¢S4>W¬Q™).ž´šSI"AåA%ÂÖcI @_ü¶g¥¿ÞÅ£WбG…W§T_~èíÉŽîe§;kI)*²¬er2;ŠÿÔ1>!ÆÑ&´ªTF0ý*¥& 4Gy.H}É:ÄkM+»fL’O!í"#J‹iŸ%¢|U\F‹Û”fQœÃØI‡aÐõdnOJb%H’¥™\УNT¥³+ÉFjê¤ ß–Ìô·ûÃ[3Òßï RŠñÄ<+ˆª/?RÈœ+2©]C›.‰- Â#8¼íc?Ú­•$j<Ö¾ƒPÛ©ÖdU¤­yÔë­4Ù"äE‘ m)²È̳fVÓºe€ÜrÙž–ÿxaËfz[ýဪ)T_¥|UTò+ Õy=~/÷Ò{ÙfÅË¿džN»å¾dþÑc?7Î0-î[3Òßï 9lÏK¼1X9‹§·ƒS)Ê«)©+sJn–ÉFÏ<êuYm¿“q¶ku¯}£-W7MòìNóÌ-r”TÓ†Á2q•VT$‘¨‘¬Î”™(”EÕ"23¹˜*¼UX«“¢ûÍ"CÑ”¬ËMœeÕ4âlvÜ´(¯¸ír¹XÇÕú²Øv;OÔÔÓ’\6˜JßÊn¬’¥šRF}cÊ…*ÅÁ&{ˆÅ9£Êb£Y¨a‚ª;‡c5T­=ÖÚmoÔŒê2‰FÙ¸…!)hÌ®›Œò™‘#ÏÉÑ”Š#GÚ(ŠŠÔ©UM†ßKí³û6y¥÷I„šM’—A‘×°ÈÔe°oòÙž–ÿxaËfz[ýኣb:ô™>§3ôâ}o)¥êJiöanþÌÒ’_ìÔ‚eyÔ«©eæî< UÅ…KÑÝf¯‰Þª–'i¶æE\6i£\d¥mšJ%]›Ôi<ÆdIØD·Ëfz[ýá‡-™éo÷†)Íb¼iZªÐª3ãÔ‘O«›Å)©J§"4c&Ö´¦>­Ó¥¥H$).FdŒ¶V‡\®ÏÀTjýHªË«S"ÊR–šdÖÙ(òh#¹æ,ÙŒÊåÕ$–ÀsËfz[ýá‡-™éo÷†>¾›#1¥úß“ôªMC5™®åÕ'"dþè¨eË‘‡s_­{嵋}öa¿V[ÇiúššrK†Ó [ùMÕ’T³JHϬyP¥X¸$ÏqúòÙž–ÿxb¡Ã5Zôli)™­D"£ù4øñ_9-)²Ãèu)'Úç4Ò®IIÜŒ¶•ïÌÕ±Æ17èhõLI&vFMqä¶ÒÙ4š‰ÈˆqÒq³5R\ Ô_´";¯*Tõ:¼Pe@*¢ûnÔ$h©Ì³Ö8M8é¦å»¨ÒÎçbêÛy‘W-™éo÷†*:túìÚžj¾Ô”H‰‹_a¥K\S’¶¹¢ZÈÞ(ËSI]Ö¢±Z䔫)fâûòÙž–ÿxaËfz[ýá€>ü¶g¥¿ÞrÙž–ÿxcà¿-™éo÷†¶g¥¿ÞøïËfz[ýá‡-™éo÷†>ûòÙž–ÿxaËfz[ýá€>ü¶g¥¿ÞrÙž–ÿxcà¿-™éo÷†¶g¥¿ÞøïËfz[ýá‡-™éo÷†>ûòÙž–ÿxaËfz[ýá€>ü¶g¥¿ÞrÙž–ÿxcà¿-™éo÷†¶g¥¿ÞøïËfz[ýá‡-™éo÷†>ûòÙž–ÿxaËfz[ýá€>ü¶g¥¿ÞrÙž–ÿxcà¿-™éo÷†¶g¥¿ÞøïËfz[ýá‡-™éo÷†>ûòÙž–ÿxaËfz[ýá€>ü¶g¥¿ÞrÙž–ÿxcà¿-™éo÷†¶g¥¿ÞøïËfz[ýá‡-™éo÷†>ûòÙž–ÿxaËfz[ýá€>ü¶g¥¿ÞÇ•Yr:É·'?¬Q¥áš•nüχh‘§ÿ÷ïï‡'ÿá{—þŽá”`ψœ’†µ’ßaÇLÉ(S¦w·>ÎÛrRÿ¤"L—ë=·¤:âQ¥+Y™$ÍM\Êû¯bÿqPW²kÔjyuÿe›}¿•ö^û¯üí´ycéûŸž0~·.~I'6]×ÌÝíü†Wzæ«S¦·T–Û•ˆZ^Y)*y$dd£Ø{Gí¾q2“j”þ[ ßu¨è¥’sX’[UÔ«!(A”¥eBHÌì73tw£¶æ>Ú4wƒ )qDEÌ6ú1òèûG¾Ï0gáøžÀ3#¯ G}Ç]—Q®È´iRuË'±–ìë"R¿ÊQÌaD¥à(ˆœˆ”ì55)¹©i†RR¢2R\±uÈÈÎäw½Äô}£ßg˜3ðüO :>Ñï³Ìø~'†M¿;R½g ¿OÌ9Ú•ë8]ú~cQÑö}ž`ÏÃñ<0èûG¾Ï0gáøžS&ˆË“ªci.¥ ßSÏ2Ãt¼†f’Iš¢š•d%#Y¨ò¥$fvÑð;‘©mÔ Tž¥°Û1dÊb1¸Ù ˆˆÓ•$”n½I"àD[Û£íû<ÁŸ‡âxaÑö}ž`ÏÃñ<0Ö``zԔʬBÕÐÒ™K²ÚeÕ¥µ’F¢3ÊdgrÜw1üb8Ô¥£‰tœž´¸ú¤ÇjCO-$‚#u³2Öu[J6™ˆ¬eb·õÑö}ž`ÏÃñ<0èûG¾Ï0gáøžY„(f‹‡gR&Ì¡T¨È9Dv™Š£È†Ò„1uP”6„‘«Í¹™™Í>>§F‹žÍÝ7£4ÂZm,8iR h"Ø•V¤Ü¶ÙF\L|z>Ñï³Ìø~'†h÷Ùæ ü?ÃmùÚ•ë8]ú~cå6£N~Ì5\b#Ž6¤%öžhÖÑ™X–’Y)7-嘌¶m#-ƒ[Ñö}ž`ÏÃñ<0èûG¾Ï0gáøžBÞaº“µ&ô£VDç›KNÉK‚uÄ&攩\’æEs±ì¹ýFŸªQ£ LŒ‡—!,¾Ó.!.­Fµ¸I22%)JRŒ÷™™™í1h÷Ùæ ü?ô{ìó~‰á€6ÍÕ) ¡(EF P’"JRòˆ» hžv¥zÎ~Ÿ˜Ôt}£ßg˜3ðüO :>Ñï³Ìø~'†äëX …[–ÔºÎ<‘RÑY·eÁ£<´ò5C3!Ò7GÂD€ÝrE'Ê~O6¤ÌE<޵Ë.D%)¶Â,©-„W¹íh÷Ùæ ü?ô{ìó~‰áƒ=‰uŠr)¬?Jj l“Œ…¶M%²,¤‚Il$‘lµ­mƒ < žšs°ëP‘èÉŽ†™Kieã%:Ù$ŠÄ…™©;”dW¸ù?€ôrÃ>î°b[m&µ“ñÄEsÿÙŽ'Ÿ¾¿a¢ß…ÂðÀÉhsµ+Öp»ôüÇÊmFœü7˜j¸ÄGmHKí<Ñ­£2±-$²Rn[Ë1lÚF[iÏßFß°ÑoÂáxaÏßFß°ÑoÂáx`­FxR9éÀ©ÒÑ|ŦQq7ße&ë“àî|çÝE²äåÙåmkk<ë[e®8~ú6ý†‹~ Ã~ú6ý†‹~ Ãn«˜^‰WÆŒ×dUðêYnCTH€ÉMZ™4©9Yï«Î„¯.[ì¶kl^|1Éy.z?'å§UvòkµºÝe·gÖuóoÍÖß´W\ýômû ü.†ýômû ü.†±&+ Ìå<¬èÒ9[)bN´Û^¹¤š(]üä‘­fD{ 2»LkÝ¢èõÚ[§)8YtøË7Ѝì-(÷©(µ’̈q|ýômû ü.†ýômû ü.†²X•‡˜© H¥´òÚC*q l”m ÔhA™mÊ“Zì[‹2­¼ÇłŒ*˜*+G“b£TžLÙ‘Fíæ&ÉIX¬V"ìç?}~ÃE¿ …á‡?}~ÃE¿ …á€;ˆ”¼‘†£¦ …75-0ÂJJTFJK–.¹ÜŽ÷¸Üsµ+Öp»ôüÅ_ÏßFß°ÑoÂáxaÏßFß°ÑoÂáx` C©^³…ß§æ>LM °ì‡X—MiÉ.¯©!&êÉ)A)F^qåBSsà’-ÄB´çï£oØh·áp¼0çï£oØh·áp¼0kØ ‚õYUwqãîT–¤-RÕŠo¢R ×Èó]*JL¶ì4‘–áÜg×’ç£ò~QÊuWo&»[­Ö[v}g_6üÝmûEuÏßFß°ÑoÂáxaÏßFß°ÑoÂáx` Ë YI•ÒÄ•Kd¿efßR”¥:žÅš–³5Ó5ñ1ò§ÅÁ”ì¥O@‰–R¦¡ ¢Ï©…;³øÍi5o23+Øp<ýômû ü.†ýômû ü.†ïàÇÁÐ*’j°X Å¨Kÿ”ÊC¯m¿]eµ[{L}š^eˆ,4º;mSíÈ›I¶Ide«/ತì·UF[ŒW\ýômû ü.†ýômû ü.†ïcDÁqk.Ö£FÃìU#'f¶Û)}Ëï̲ëõ1 m6a×M†ÒÓ,´â†Ð’²R”–Â""""-´çï£oØh·áp¼0çï£oØh·áp¼0¡ÎÔ¯YÂïÓóÍV™]vMZ‘'RœÛm)¸‰¦™|©Ììu¸dF¥ªÊQØÖ«XŽÃ•çï£oØh·áp¼0çï£oØh·áp¼0ò‰Óê²1âªMŘ¹î7-¨H[²2ã%yØm­Í8dy‰fy±¤’d­ã¼Âg%Švi5ðÒC IãûK_úÜpüýômû ü.†ýômû ü.†ïéì`êth±©ìÐb1 Óv3L%¤%…šTƒR¶%F•©7-¶Q—¬@ÁøB‹N‹ ÊÔcSØ…"¢ÓM2ô¢i´§2ÌŒÏn[ØÌíÚc•çï£oØh·áp¼0çï£oØh·áp¼0¡ÎÔ¯YÂïÓóv¥zÎ~Ÿ˜«ùûèÛö-ø\/ 9ûèÛö-ø\/ hsµ+Öp»ôüé^³…ß§æ*þ~ú6ý†‹~ Ã~ú6ý†‹~ ÃZíJõœ.ý?0çjW¬áwéùŠ¿Ÿ¾¿a¢ß…Âðß¾¿a¢ß…ÂðÀ‡;R½g ¿OÌ9Ú•ë8]ú~b¯çï£oØh·áp¼0çï£oØh·áp¼0¡ÎÔ¯YÂïÓóv¥zÎ~Ÿ˜«ùûèÛö-ø\/ 9ûèÛö-ø\/ hsµ+Öp»ôüé^³…ß§æ*þ~ú6ý†‹~ Ã~ú6ý†‹~ ÃZíJõœ.ý?0çjW¬áwéùŠ¿Ÿ¾¿a¢ß…Âðß¾¿a¢ß…ÂðÀ‡;R½g ¿OÌ9Ú•ë8]ú~b¯çï£oØh·áp¼0çï£oØh·áp¼0¡ÎÔ¯YÂïÓóv¥zÎ~Ÿ˜«ùûèÛö-ø\/ n0œmbÊ¢©˜kèê­1 )åµ f†Ób5ªÍõRFdW;Ì‹y¸çjW¬áwéù‡;R½g ¿OÌkú3À^Ïð/ÁàþAƒ[ÁZ1¢ÄnUKàVvK1[2¡ÃY©×œKM¤‰-™Ö´–ëÓ;’Àßsµ+Öp»ôüé^³…ß§æ5h÷Ùæ ü?ô{ìó~‰á€6üíJõœ.ý?0çjW¬áwéùGGÚ=öyƒ?Äðãíû<ÁŸ‡âx` ¿;R½g ¿OÌ9Ú•ë8]ú~cQÑö}ž`ÏÃñ<0èûG¾Ï0gáøžoÎÔ¯YÂïÓóv¥zÎ~Ÿ˜Ôt}£ßg˜3ðüO :>Ñï³Ìø~'†Ûóµ+Öp»ôüé^³…ß§æ4¯à=°Ã»£ì–ÛI­GäüC±\ÿöc‰çï£oØh·áp¼0¡ÎÔ¯YÂïÓóv¥zÎ~Ÿ˜«ùûèÛö-ø\/ 9ûèÛö-ø\/ hsµ+Öp»ôüé^³…ß§æ*þ~ú6ý†‹~ Ã~ú6ý†‹~ ÃZíJõœ.ý?0çjW¬áwéùŠ¿Ÿ¾¿a¢ß…Âðß¾¿a¢ß…ÂðÀ‡;R½g ¿OÌ9Ú•ë8]ú~b¯çï£oØh·áp¼0çï£oØh·áp¼0¡ÎÔ¯YÂïÓóv¥zÎ~Ÿ˜«ùûèÛö-ø\/ 9ûèÛö-ø\/ hsµ+Öp»ôüé^³…ß§æ*þ~ú6ý†‹~ Ã~ú6ý†‹~ ÃZíJõœ.ý?0çjW¬áwéùŠ¿Ÿ¾¿a¢ß…Âðß¾¿a¢ß…ÂðÀ‡;R½g ¿OÌ9Ú•ë8]ú~b¯çï£oØh·áp¼0çï£oØh·áp¼0¡ÎÔ¯YÂïÓóò¥P¤,œr¡ X’2JÊBII¿Û¼¸v ߟ¾¿a¢ß…Âðß¾¿a¢ß…ÂðÀ¡FCZÊœ'ÜhÌÒµ>’µø_wí¹.}>dG“XÂNF}§Qä‘©µ’ˆ3{6 Æ„þ€kµV)TZ>ê3ß¾ª8 ¦Ó›ŠäÉ3]-®<û†¥-\ms;aþ's=A5Ú”j=]RY™1•:»o2"Ü_Ì÷ ê‹*U—Z}ªü˜¤óš¶ÐÌ4¦2œû4­ÖO9ßgžY¸n.·H J Áˆô¤Æ‹*Y¢J”MË®±*Id$ïn‘«F•gÓ"«„%töTóq•ë)f¦Ò–>Ù}›v}/„aaäù’‚“o×N“V½þ+qó¾+Š~r¤ª8Y~Wø¾?¡Ôa*nF%©BªÌ‹!¤BŽû aƒl‘™o!W¹™Üõdg´È·iõcŒÑd¦œõZKYdÊVBQ<ã™™J%ffeµFG²ù¯b˜äx–ÆfJš²V^ž‰'Ãâu° ¦^>c»{ïów4²¦N™%Æ)¤é$³V­)5¯)ÙGeì#Ùºæ{¶oÆn¥P©‘P×.3é5'X”šKz“”‹wa–ÒÚ_ÏøaÒ¥Wü–qM-×YCJ¶sRÌÒwÿ'­c¶Ò>G·Ì:ä–^Dgš˜¶TÓˆQÝ ;XÚE¶çý7™í©bÙב‘‘m#Ü1*ÓÛ§ÆKŠBœqÇÓ-'a¸â¼ÔÜööžá’ÁYBOa’HýÃ_‰â36Œäy1ŽTsq¥¼ÑoZâT¢-¥¶Äb9)IZ.ÌÊiofŽ»P©A†Ns²Ês·KM¥- Uö™æFlˆ¹\ÍEägbÙa êêÑœ9´±T‹b’ÒHÉ*#ó\EöäUŽÝ†F[Èkê,¦ƒ£Š® ¢ËntÍkME~mß$6n6“E”wØJ^ÃÜw¹oXrdz¬ÚuL݉"rè1ycŒl—•sq;<Ó¹Óü‹°VÀà«a¨¿>£œï½ú|‘½ZÑ©/Á/ÔÛW¿ÄsÿÕœÿ„ÇÇGØ8sèñ€$¢7-&‡J‰!9ß}Èí‘ŒÉ NgRR£CM¸¼ªÊd>Õïñÿõg?á1ÎRéÕþ:,­Òã=5ú>™=qlÔã쪞¨Îå"ëÜ…ºII)K6‰ +¬Œ·ÅT«KRtcµ5ÒÕ¤ì¿6k¥$›²9IÏLSX¢Õ)•H›]ŠÍR•6©U OFo<†#²±LŽ·‰.uJB’ê %[:Òt…„Ñ6Ldê2Ó ’ÁY$ão4—Z}Ì¥%µ¥FV3<«mÔ—«Î¯=S“L¢µ6³…êØˆã¶•¤§SêTç#3MKm2”0ëí“kºbFJÒáço’,ÍβNMÏôw 3êøŠq(râÁ¦QZUÏ]"\4HJ”f£BÕ!hMˬ–’á)Iq&8Þã”üC¡‡Œ­fåµk+lÛÕÙÞû½w¾¿_¨ÐÚžçºß~þZ–:ï(ÇL3Érò l9Ü£Y}g(vR2e¶Ì¼š÷¹ß>â¶ÜÆj®J¢6þiñ#3)ö²+¨ÓÊu-ªö±ÝL:V#¹eÛk•ø:Æ¢b/Weâ|:ÝNaÚcW)“S:ÎQP72_«¬I)³¹uK+fÛÉhË SœÄôiø×ªµgR#»6m O+•¡‰Hš‰›fM-M-¦ÔNšs‘6Û(úSš]4*¤ ån–ÿ(PŒÜ¨®äRu8’Re]&Gc">Ñš<Ù‡iš)ÑEv šÒ"×Xf¿Mjˆë.É–ÝQ>á·ŽQ]$jZIdâRdF­¤,M…TQ# ÕÓ‡]Å¡R“ÆžŠÑ=Væ¤Í*i¤JKšL‹+dwMº ⩊¨4Îwå³õ|Ϲ¬ÊÕªC™²y©<Ê<‡ÕMÕ»gX¯º´oïÿ$þ/+ñ’æ/ýBŸû³ÿø/‘±³ÿˆþf1¹•ß+¯äÍ[Ë+9O>r'5\×ʳååVÉ«ä±Ôæ¾}¹?ˆyŒœ“<‡¢= ×ZJ×ãA¸É™\УB”“Qn<ªQ\¶–ÑNáŠ1Ótع(2&ªMFkÓ*3hOG“ KŠI”üÚ©,(C63JTƒ; |´7‚z¡‡gâ|2µ?JÀxm˜§>!Ú<¶ŽZœ"%•’ûg«ÿ=‹vm \ðrLòˆô7]i+\wã&esB RME¸ò©ErØf[F³W|¤1P伫[R&³%¹L¶cç½ÍÖæ·¶¹^åAÎÃrã`Œ)ü1:«Z‰ƒ©Ñ¤ÏÃÏÊhŸC}d6ûf“§È¹ÙN®ÄDHÿ$íji‡1 ì,Š=VB ¥AóÍ2¢iÆWToZHZNù›C*Zíl‰R}»°@SX‹Á§½ètŠ4êN•J¤IC4Šq­¥É)RµùYM‰Ë¶Üru´õ”ƒµŒÔWÒˆé¸F%k a$B¨B«I ¨ïSÛ~<¨Èl¤r7 × L)i;V»k€/ð{›ƒñJ™*\§Õ§7B™E¡C’¤/Y2!U˜yé$´í2äéeæ©—LÏ«³¼¢Râ`,WŒäPðĦ( Ð`Ïj*VD¤®v¹,6VJžR%c36ïç€:üw]ò_×±7%å|ÑM‘;“ë2kuM)y3Xòß-¯cµ÷aêï;Õñ?’êy’¤ˆ9õ™µÙ¢G‘žÖ,¿ám·Ì½öØ©];PYŸH­Õ°mn¿[O4áyP©®ÉԵɓi Œ™2|žR’f“q+""]ò¬Úa:VÄUjå"¡UÁÎbP޵Yþo€†æ)²#9,¥hR,W&ÖƒU”i3l "±Œ AÅôŒ2Â9TÙ³“I©%+‰.B|¶YŸ$Rr‘‘‘(”| ]0¤ 3ŒäÑ+3éŽTiÕŒu.d”äR›(lS¦D`ܶÂiz¦ŽÇÕQ½c¾kÔðÉÓ"Õé Ãs\Á±›O=I‰ kmÚr©Œš‰¦_´d¦/:›AG Çc «ˆk¼ÑWÔþK®çº’àçÖeÔå‰"F{Xóƒå¶Ï>÷Ùcbï4Uðå?’ë¹î¤¸9õ™u9bH‘žÖ<ßàùm³Ï½öXéZ­¥Ñh†þ ­¿ƒÑŽW.-!çTäjw6>Ùš£gC' ÜV¨ÒWK‰F^±$ÕJ *¢PÍì[£®\ZB)®›‘©üØûfjŒE œƒqZ£I].%zÄ“ýó=ˆóéyÓBÖÙ ’ÁdR³¯2ˆÍ7I'ªJ;­;2æQjüª ùÖ1åÿÞ7¡"sru+º™ZIHQ#.{™(¬›f¹Úר*Ú&TµÐ## Ëk ;Œe»™2 ’ˆÔåÑe2¢q•—ìš[êrÈY<„Ø®D10-2ŸF<Àpðúè“$O†Uè륮œzt?!ÕfBuÄ·e³u9’¼öÌv;o`Úï”T‡ê—’êªSàäÖg¿&–ô|÷±yÚ¬Öáš×;\Ø6»å!ú‡%亪”ø95™ïÉ¥½=ì^v«5¸fµÎ×:W ÐYn¶¢…ƒ+p±‡—3%ó»´×PÙÓΦëŽ)2É©\sZI¬Ýe,–I;’ƒ ÐYn¶¢…ƒ+p±‡—3%ó»´×PÙÓΦëŽ)2É©\sZI¬Ýe,–I;’€V!®óE_Sù.»žêKƒŸY—S–$‰ícÍþ–Û<ûße2£TO™M‰1ýSÕ9'r(õŽ“.:ÀqêtÝ1WœÃOÊÄêÞÃòJ:Ôú\n‘T¸†[IZä©9›Ú¥#)ß-‹úÒ†fEÁ˜m暪`*ë u¬æK"ŒQ‰Ã"3qõäe5]jº÷ØÀx0*¿Çþ¨÷ÿˆÏ_ãÿT{ÿÄa‚µ­ãLCœp+X²ƒL–”’‰u™pˆ÷U(ŽÆ9}%Ö)Ì+@ŸDªA©ÄêMIiN«+hJKjÖ£þ‘m3+•úÀâ'ÕBÅ&ì¢4Æ›U…PiÞ &”ºÑùi&3’w™,í{¨x…iÒ¥xj“z-J#^thíGUw¢quJ 䢮üI± Ô²ó­E\g¢¬Ìˆµ)J2+™í#MÊåk™weÆ… é³$53 ›Ž¼ê‰(B®j3=„D\Eg¤*Ëøó"ŸÌ´¸ÍR9FÚË*œyDv$ ŒÔE´ˆíc32!Øi&2©„dF§ÇåO·"4¢˜“Ê̆ÝS7=t Ñ·g[nÁ‡V•M´åµ÷>ÿ‚¿…âg[Ì[[QOs×^„Ññ­Pj G§%çï¨94Ù1ÐýˆÔzµ¸ÚR½„gÕ3ØFcY…q*Ÿê”º¥“S#ëõ/r7[É‘ÒK_µQšÖ¶fçìȵyrªæc5ê¥gÐE‰WFpÌæpÏ4­É·X&pü¦]mã$Hœë†™e¬K}rI‘ªÇ˜®D®Ž±u»Q„Õb5!oZl˜îÉe¬§Öm¥6•ªö±XÞl¬gsͲö;kʼábº} Êk¬*d9Ò‰Ç\MÒQža¢ê¤ÔFNä²;‘‘¤ŒÌ“Íã*-!Í,aZõO ¢ –áIˆ‰i¥œ¥G’oÅ\e)IB²NWÌœ;%•´³ð°52¥Ó‘O–ËHò§;Ž2¤¥:ê».5s2ÙjOùI#2¹;ú÷øŽú³Ÿð˜Ó` ºéº*ѹH®»G¦#·2[ÈKGµ¦a%77®¯ao3/ä75ïñÿõg?á1Áª‡SÄšÀÔj5Ž¡#G_Üè5XœRJš¼—=l¹vìÛ´\ðúP«]B£´]îôÜ÷þE|[’¤Üxÿ¹Ü17H’騫‰8¡­³u¥OŒÌå§i§ö\Е(¬d•8V¹²™‹Ϊ»^›¢üå¡4ÈSÔÄ2N°·W –…I$µI.;oc1Ï5¥œ;3 œØµJ%:¶‚"~‘]ŸÈ]Žá[;k#I®å´ˆÉ&G°r¨Ó–ÃX…5LwXòz¡X SŸLS¦º¦Òg!Òë“VVy)3I–‡v4q8Z”ödᲮקž¦øXÒ[w“nÛ®ýn¿‹—¨Œ -̓c)y->Ò]B^el¸D¢¹²%![v¥DFG°ÈŒ}„$€[ÿOý¿þ’dž?éÿa/õi?ñ6=Ï[ÿOý¿þ’dž?éÿa/õi?ñ65õ3è{ £þ0“þ•_ù˜Ä’Ã2XSC­,¬¤-7#þÒŠn'~C»¤¼\kqFµeäI+™ÜìEÅý„*t¥TÌz¬wŽmÃ3p|1Äðÿ¡âNK Kfײá{ÛöeÌF Xx§ZI^ö»Óî{ JHIY$V"ž hí")¼4Ýåf{­´%´’JKqþ‡„JZ_áŽåÿVÚðÇðzRÓ w'ú¶×†#ËV÷Y¾b—¼{²\H²ÐH•·’Gr%¤ŽÆ>q)Ðb,×#M(÷šk ”´Ïýý[oÃÏJZkûöçv߆6ÊV÷Lf){ǽÀx#¥-5ýûs»oÔ´×÷íÎí¿ 2•½Ñ™¥ïær…GrIÉ]::ž3¹¬Ñ¶ÿú"¬°Ë?ºiá°‡ƒ:RÓ_ß·;¶ü0éKM~ÜîÛðÃ+Yú Å-OvÕšqúT¶NgahI^×3I‘ †ÉÌ5£Ì7‡&= Ù4ªLX/8ÓŽ¶™Ji»dv3IÚäCÀ])i¯ïÛÛ~t¥¦¿¿nwmø`°µ—øŒÅ-O~M¡`i¸‰8ŽfÃkIu·“Qv$–݉ 'M¬Ù“•6;ܲ•·ƒžšícß_äœ})i¯ïÛÛ~t¥¦¿¿nwmøc9jþèÌRÔý离X÷×ùžšícß_äœ})i¯ïÛÛ~t¥¦¿¿nwmøa–¯îŒÅ-OÐú‹Ôº„Êl¹Œ°ëÔÉ'*µÎ–­ÓeÆMV$Øÿfó‰±Üº×ÞDe›ÏMv±ï¯òÎ>”´×÷íÎí¿ :RÓ_ß·;¶ü0ËW÷Fb–§è|EÑbr>IM¥Gä,ªüô×kúÿ üãéKM~ÜîÛðÃ¥-5ýûs»oà µtf)j~ŽsÓ]¬{ëüÏMv±ï¯òÎ>”´×÷íÎí¿ :RÓ_ß·;¶ü0ËW÷Fb–§èç=5ÚǾ¿È>O§¹5™ÎF‚¹L!m´ú‰FãiY¤Ö”«Wr%r-ùJûˆ~ut¥¦¿¿nwmøaÒ–šþý¹Ý·á†Z¿º3µ?G9é®Ö=õþ@离X÷×ùçJZkûöçv߆)i¯ïÛÛ~e«û£1KSôsžšícß_äzkµ}~qô¥¦¿¿nwmøaÒ–šþý¹Ý·á†Z¿º3µ?G9é®Ö=õþ@离X÷×ùçJZkûöçv߆)i¯ïÛÛ~e«û£1KSôsžšícß_äzkµ}~qô¥¦¿¿nwmøaÒ–šþý¹Ý·á†Z¿º3µ?G9é®Ö=õþ@离X÷×ùçJZkûöçv߆)i¯ïÛÛ~e«û£1KSôsžšícß_äzkµ}~qô¥¦¿¿nwmøaÒ–šþý¹Ý·á†Z¿º3µ?G9é®Ö=õþ@离X÷×ùçJZkûöçv߆)i¯ïÛÛ~e«û£1KSôsžšícß_äzkµ}~lÔôæZ|t¼ö9}IR²‘!¦Œïc>-ÿ!®éçKŸ}¦÷,þAá8;H’3Œ•ÑúoÏMv±ï¯ò=5ÚǾ¿È?2:yÒçßi½Ë?:yÒçßY½Ë?k¼ÛqúoÏMv±ï¯ò=5ÚǾ¿È?2:yÒçßi½Ë?:yÒçßi½Ë?7Çé¿=5ÚǾ¿È5xš¼¸Ô‰s!Ó^ªÉDu6Ô(Ž%.<¥šKbž6ÐD[ÌÍ[ˆìFv#üÜéçKŸ}¦÷,þ@éçKŸ}f÷,þ@Þ7Úò¿{'¯üNú¦ÅRñ–)Mžz9«Ó[f¹O˜ì—êV†ÛfSn,Ìù¨ú©Vâ3áaãîžt¹÷ÚorÏäžt¹÷ÖorÏäÙbçèþ$2̈ë%–Ÿa²Úu´(¿šOaÏžt¹÷ÚorÏäžt¹÷ÖorÏä –™úM§S©)še6 ÖwR"FC)Qÿ2AÆHüíéçKŸ}f÷,þ@éçKŸ}f÷,þA… +# («#ôHçoO:\ûí7¹gòO:\ûí7¹gò ì³7?D€~vôó¥Ï¾³{– tó¥Ï¾³{– l±sô"¬ÓÒ¥°Òs8ã BJö¹šLˆF ¢Ä¦`L'E«8Ó• Šqȇ:K$f–›K™T„¤Í&¦’{{ aÏŽžt¹÷ÚorÏäžt¹÷ÖorÏä —ÀÄ£+I\ýä´ŸI¨ünwÌ`ÍÃX6}^™V©R˜©N¤È)T÷§Ì‘$ã:De™ÂV]ä{7© «ÎmŸÎþžt¹÷ÚorÏäžt¹÷ÖorÏäTÒwIÆœ!¾*Çé¿=5ÚǾ¿Èô×kúÿ üÈéçKŸ}¦÷,þ@éçKŸ}f÷,þA¶ó}Çé¿=5ÚǾ¿Èô×kúÿ üÈéçKŸ}f÷,þ@éçKŸ}f÷,þ@Þ7¦üô×kúÿ sÓ]¬{ëüƒó#§.}õ›Ü³ù§.}õ›Ü³ùxÜ~›óÓ]¬{ëüÏMv±ï¯òÌŽžt¹÷ÖorÏäžt¹÷ÖorÏä ãqúoÏMv±ï¯ò=5ÚǾ¿È?2:yÒçßY½Ë?:yÒçßY½Ë?7Çé¿=5ÚǾ¿Èô×kúÿ üÈéçKŸ}¦÷,þ@éçKŸ}¦÷,þ@Þ7¦üô×kúÿ sÓ]¬{ëüƒó#§.}õ›Ü³ù§.}õ›Ü³ùxÜ~›óÓ]¬{ëüÏMv±ï¯òÌŽžt¹÷ÚorÏäžt¹÷ÚorÏä ãqúa:¤Ì†M&¶SbQ–SY™™¡I"Ú’í&ÿ¤ üy„¿Õ¤ÿÄØª:yÒçßY½Ë?sßb¼läG1MaÚšâÉ…8Úh%[1uH¯æ–ð³¸=ßÚ<“M¥rê%V Ü‹=NKN©Œž{J^­KÍ}™V¦ŠÖÛŸy[o­»G”0]N.µš¨™ ¦ÉaسÂINjÜA§2IFDjIåY™ÒCã?éï‹·ÿ_þçOúªÛ/ÿËÿSa#M*kÄåæ9ȉÆPÒ *SoºÚMF¼×Õ4•ß.[)Y9K>¾F­²Ëœf]e×$ÝbSN ÛJÒ…) 2Q¤Ö›¤ŒÌˆîem£® é5>¡\ž¸ RêUVä4Ñ´Û³£MŽhÊ»¥F”ÊFT©&“Èd{7ÿ31Å-Uº*ä™ÔXÊ™­5E‡L55% iâCQú¦¼‰Øµ(ö’v&Û}Sj¥ø!h[‰Ì¹‚±Csyé“f3ék:s)2 ÎR¿YJ5¤²–ÒÛr,§l AEŸB˜ˆ•‹¬[zÄœymHA¦æŸ=¥)7ºLŒ¯r¶ÑØÕô‰Îñ©ª’SbOn®r¥JŠi%¥„¼·YKW?= ý¯°¬×fÍjÔŠÅZ4ŠC+"n)7&Bá5Rε¦ËFhAåRS°Îù3Ó1´\ï½’·Ø Àßàšu~‘LzErT9õj”ŠtQO'YÎÓl,ÖëºÔ›i=zJä…X’fcŸ¦aªÕJ"%CŠ…¡ÓY2•Hm>i+¨›B”JpËüÒ=»7ŽƒcÙ4,E\ÅF\ù®ÕaëM LŽû1›JÇç–©Ó%uMI2¾ÒŒ?¤ e.›MŒÃÏÇ] N=ß'©òž}&úÞBç³.:ÈÜ2êë¬FE{Þæ®J”ÉÌÁ–%/œ_„ÂYä­ÌÈSXSÆÃˆJÒé4K7 T“5e±m½¬vþ›Àx¥Ç!4Õ=—™!˜í°‰Œ)ÖÜuD–Òê y™ÌfDFá$¶Ž›ÖðÅ>¢ÝVù³ªÎaˆ”åGC œT)ÊSqœ=q8j5 ”¢4jÊËMŒö š>?ÃTÌnö/CugeÕªqåÔ¢œfÒÜd"k2Ü&W¬3pÍL’S™(±ÜÆ6çk¤gfÞÎZ&¨¿ƒêØ…Si6K ®3•ÉZ‰Æ]tÌ®ár$$‰²#R”kIfÖE«Ä˜j±‡TÊ*ì2ÂÝ5$›D¦Z›fC‰BŒÛYf+¥dFWÜ2èuJR0erƒR\Ö\•"4Ø®Çe.‘ºÃrM¬”´åJµþqf2ËæÆv‘ñ¼ˆæKšÚž\ª„ÈlÇ}òVLˆ^©FNš2¬õª²•Ÿiˆnœ¶­èjÔvnqà$#éð~^!£V*¼¢ª ÜÍYŽS¤Û®›dw,¿³eþݹJÝbÀï°Ž=¦áªM +8jMøsœŸ%éª}&—TiI%½SÉJ“«Bx“+©EkßI¹[ð›A+ï0tkæâ¬CFfF©Š\Ú‹1qS˜aå¶§— ”¸¬Î(ˆÏÍJ¶ðà>hÑÎ/\F¥•>)4äv¥]UÉ6Øu Zp˶ْ“×YHÎÆd{ÿb¬᪤ү¡¼34Žã2£“3! qJp²,µŠ#I‰V"ÌãQQÅ”é<û‘™eÎj›IjéOUè܇:•Öó’¹c+žÔÜŠçm6§µ¸Þбó-b…FY¢ž®PÃ’[ì!–Ûl¢þÐ7l¢>Vљؓ•IQ)E›'ðb3Cò#\’y„4mHaÈÎ6ãrÖkÉ̹H£8yŠè"Jó)’%t5Ý!Qgài46cT%ÚcQ Km3¥ª: Ìó^×§?Ãø›ÙµYŠ&=¤ÅÂTj*Þ«Á‘ ™K²£FiÛTR¬…¬‰i2œÒM*±(‰Â;l¾6ªlÞÆviÞÆ´UN¬ÖŸ›Iit©l0¶§õ©q—^5¡ZÞ¿U Ê”’ÌÊËsBˆ`/WÛÄoaé ÓãTÙÎN3"©’Já¶h5-ÂN|ÄvMˆ&F{šÎ#Âõ8–œÌi´øóŸ…2Ç„ÑߎÃÍ«;d´¥¤º§”³Èj$n"Q Æñ†{âúôÊ{Ùªµ7&Sžv›bšmN¸µ6¦žV­*Q)~¾\‡b;ŒíOïò1³ŒêïSiÞ~;ON­»Hv IÊšZa¾«Ky*ZÍo(—)%*Q’VJÿ’•ÞdçŽJÏ&Õk²r¦µú¯´ÔfÖäÿ?.[m½‡vxÿ ÈÅìפ"®ÑAÆÒ1 f›ŒÚõÌ>ôu) 3p²-)bålÄf«\‹¬4~TвóÕª<ùÌœÏÉ5ä¹y#Öës澯­“'üVRŸ¨q‡¡ªÄ8P#Ìz©†¹ º©m·5‡]Žy²‘­´,Ô”š¶Œ‰'r±ÈsC´­bÊtÜC¤:ƒLËKX—[ÈÒ¤§3yê É-g[gQ¥ÌÝc.K‹AɯÄi$“ÜnjÕ1„5º@ á>q·;óg÷N§÷\±¦\ósu²k­¼³e¾ËìÖ' V•LçŠV ää9 “ÆÑÂk6sFóÍ–Ö#=ÛGoLÒÍj5ÃS#â JÆ¥·JjE9©‹Jˆì°‡Ò–‰y –¦Ü2#¶lÛms'´ƒì6M’Î-E4„ÒµMP (Ö‚ÉóÕ¾œÈÞ›í2%$­hvªhKhjaâýWi¸Ž«—.Ó™›-ªy¿:9H”ÓdÍ-æ%8²6•rJo²ö±à…ÍŒqŽ‘аþ8feMsâ»*¡žˆÍ):´É 6úõ·iVZLÒH_UDd{n)‘šR“_ˆÅE÷‘€ÆOºŸ˜yMìdû©ùŽD=Tdéw”ð>ÆOºŸ˜yMìdû©ùŽD=Tdéw”Ð>ÆOºŸ˜yMìdû©ùŽK´@gªŒ#®òšØÉ÷Só) }ŒŸu?1È€gªŒ#®òžØÉ÷Só)à}ŒŸu?1È€gªŒ#®òžØÉ÷Só)à}ŒŸu?1È€gªŒ#®òžØÉ÷Só) }ŒŸu?1Èz¨ÉÒ:ï) }ŒŸu?0òžØÉ÷Sóˆz¨ÉÒ:ï) }ŒŸu?0òžØÉ÷S󗞪2tŽ»Êhc'ÝOÌ<¦ö2}ÔüÇ"žª2tŽ»Êhc'ÝOÌ<§ö2}ÔüÇ%Ø 3ÕFN‘×yMìdû©ù‡”ð>ÆOºŸ˜äˆ@gªŒ#®òšØÉ÷Só)à}ŒŸu?1È€gªŒ#®òšØÉ÷Só) }ŒŸu?1Ép õQ“¤o1b5Be·’¤¸J3Y¬eÀÿ˜Ñ õ*J¤¶¤ON𦬉$@ŒÜž OH@’žð````D  0íÐôO´ièP[´ß&içõ$LçI¥F•ÚÆ{¶Øn;F‚™RO‹YC’Ëï3f $«š‰*µŒ·m2!ý;*Qǧ[ûlïÿ/_Óâ}Þ1Màí7_º?šV~¸íZœÉ/’š£©yi2Bîde{áÏÁÂ*7æÕY‚äóË¥6j7…Ìeö¼†Î_J(µ¨õZ‹î8ücDdº¥¹uVFE¾ÛÓØ?˜ÕÊÈ47*’Þ‰"Ž¢2m,šÉâN[XËwšÿÏûGØÑŽ­:j>‰î“Iÿvûµmö»_ÉÆ¨ñ0”¯¯¢øz^þ¼L\!‡ZLlYNªÇ‡Êc0”¡çJ&LÒç\ŒÊä[Žå·a}Ì$Ý:µ†§µ1е&¡9–õš“Ië èRU}†Wߨw!ÑÓ1eD¼U"¬ó‘[©´†ÚB[5-I$- Äv2ÞdW1ª©bJ 8¸V‰Ošä˜tÚƒräÊ[*E¬³3²wÿeøoéÇ åFÍn½÷ÿ~믊ø¤ëm»§¾ß.Èǘ%OVΉP‚ÌÈÌ¡ôR™Ži² ´‘í+$ŒÎçb#ÞWµÆº…†éó°^ z©ÍMDY&\Z)Êå.už³ky+º’£I'Í,·Iß«·/àên(­âÈ9§ÈˆQÙÉ–”­D”u‰F[º©#½aÚ÷!ʳ‹¨q4w„)ç)NO¥VÑ6Lt´«“iuÕ\”e”ÎÊNÂ>?Ú/¥‡U•·ß×wn«Ð­ÿse-þŸ±ÏéâA£cY¢Êi*2I?¸Êm1,ÓyzDZyîjÙ»ŽÑZ¾,-5Ô(¬Zåv…VTâš”›Íe·¨4!"º­šö3Ù¸W¯ŒT·›+p¿¡˜ße\Ãtb;Äeº1â'ŒGF+»Œe:1]Übìdb;æ˜Çâ2óLcñãÀ…ƒ$Ä Œ| >Oh‚Ú€=¢öˆ ©ñ0&Šte†+ø‡GÅU¬HÑÉJ%um5•*±’¢+%Ä ÌÌö‘ÐUè=ÒN–(t}¼ýš£*i*!›QÝCJrÈA¨¯|¦“"2I\®3ðæ3Ѷ2Ñõ i5ê•2M¸s¢$ÔN5b"IÙ*2Ø”‘–_á##-¤>-ãíP´Ï†*øN†¨4 ;kbD”¶¢vN±µ6nLîyIW¹õoò ‚‰¢Žséûÿªò+]ÿ¹æåš½ù嫾£üï;ùmÉÄÚ'¥aÝQñ]K²Ë•zaL‰TõgqÓi$¢Y•ºÆF³""Ù°ï³»F3Ñm"›¥#¦bÉSfb¸ïºÊ\§<Ú5Ž!ü­$ò™Ü”áÝJ$•”žÃ1Âé¯áìE€4qJ£TyTº5,ب7©q—5QÓk©$JÚ…•Òf[?™>ÚQÐÜ,ûäc6ªU©º’NM=M¹ Öî¬úÙÔ”‘lµÏ­´¬V¸Ë¨hms&2§ÏÅTØE6]–› ÈŽÉtÎÊ=¥b±yɽ®B4ù¤*cL8{áY¥SJW6œhÖ¤8æ[-${;mm¢ÁÄnÃò2·H•èèr2y6GŽ—{)æ}Ö–“IžÓÚfW;ì ]@Ñ6fŒèØê¯Ž"ÑaÔe)‡ü/UgAe4ªë36Èíd‘™™õvØ:)ÐÍ…¦*žůî*=)©ñ×D‡Ð§r)ÕÍ$h4åÈy¯¬¹y¢¾Ä¸»Lú3á|¡ž¹¨¹bê\,š¤™sNCýâ6™íþF- :bÀM} XÄíÕÜ~Œææ×%"#¥ª{”›»Ri%X‹iùÅüì›1L*M>»&µÏtöòêgrUGÖÝ$jýš¶¦Ê3NÝö¿ë0¦ Ð)%‡´MÐdDC’*Œ¸Ë’ÎûÔ”,³,̶Ù*Ií²ÃÉx’-.rTZ-TêÔöÔDÄÃŽ¦MÒ±žEmNÛ–ÞÁè-c= QاV W1.”©thïÈv4— ÎÌJ%’ˆÏwY;; ðцÑz¤º–ªD!6´Gj§ K~ŒÑ²³SÆ’Q’ÔK%‘&æ²ÔÒ5h¶ƒ‰å›-é#g"k±©­1OrCï¶…åKδ•^:U°ËYÀvXgJX2¥‰´šu™/Ð`bبþJ§µd–\hÔ¤"ç˜ó’íº÷+ñ cíá\ Í5ªìÚeJ`äÊ~%=Fíj;n(ÛA«ø¤šÉFVÊeüFËѶŠ0Å2’iؾl7ªtf ¾Pqu0\u¸™I+Ùj23<¤Y’ml>± ÏèÞ%Eð1ä IÎpçÕ]‚Ã|„ÙÌÚúRõÍfe˜™#Êi#,ö¾Í¶ª´“£Ù8ãIH‘‰Õ/Ó#±z ¼²eH޶TJA¤”gÖÌ[,}¤9˜Ø›G] ÂÀuÌG:èugd°¶)ëZ§µ¬tÓ”· Ô—LºÆV2âÆ¨h kZW‹!b6d”®szc‘ ½SzÕ6i$Õ˜îIâ^wò†’°5 ÓâΣcjm}:¦^ŽMòiqÖWóØRiOTÊæEô…Ÿt‡€ëZu¥â(øª·–Å1¹Â”Úšq§Éç•Iu³5#*¶‘$ïrì2¤5› Q!SªiÄX†;Æ©U¢¦œ3[VQf“"¹íNíS2µì¥H8D ž OH@’¿>‰ÔÜ3&Ž*˜š‰L©±LAÈ­½«I%õ/.r;\’W·avBÚ;¡R´‘Šââ:4ñJªtºcS#¡Ô~íÉ9‰*#+ê¿ç­ô)‹°öÀF¥Öj–ef–Qà7©qzç5Rk¥&IÚâ6¨È¶ÿ#å;L8YìG£‰S*™¸,>þ {“8ÝG“ Ì‰&k=–ºo±EØ`)Í3_ÅØö³&« az%bS.IäÆâQg”Im¶‘m„F’±[zHˆÇÉZœÞ’èUÊë ¦×ã¹"Y† iqiN~ìÔ[v'fmÊ#¹îê^?ÁuHEÁ•ꬊu'רÀª5n‘fy*Nfȉ{um­ÄÈì6HÒ® N•p q¦>ÖÂp_‰Î0¼ÎšãD¬‰#Uº–ëÜÏa—«èI–(Xªm#@«NÃ*pçÃn"Ñ‘ Ìw5™Û6T¨Í$FDdiͰSÆ/L/°œ.š9U[Wå/)æîwO”çåYw'©}j<ü»ÿ‘Ûж Ã8s7/Ñ¢Õi2¶CñQ ™322p¢23#M¶m±» ¿ Ѩïý±}iêT*‘ë ¶ÌÕÇA¾Ú q.”¸e˜‹¬­„Ä}¦>U sv™hš:ò›[ÎU/—r j¬O]^³oîwæ/;vÍ»]!cQtCPÀ<™P©"«92ŸvCjI3e!FWRRgû¤$ˆˆö\Ìï¿°I:*ªéK if%›dJr¢;›RXQ¡Ó̵‘m/Ú©6A*æi=„F®iº‹#bªÔÜgÖߥ¼·à¨Ðâ[dnÝ+3#2^Ä*æDWÛrçt»£•à.f”ÅiŠÍ2³äC”Û&Ѩˆ’gt™ŠËA‘ßÛ×qö“¢m%PØ«f¨V±KÓéìòwK\Ÿad¼Æ›'ª…”d{7n-6bì=ˆðŽitj‡*™F¥zƒz—©sU6º’D­­¯jLËgó ËCtš #D£I5j >¹" Æ¡Æ9­c)#SD³Ê{ Ï\[xeÙ¼ÇOWÑžƒô§¥Ñ؃7âó«±I)”¤‰Â4eVÃI­°öYVݰqZ"ÅøU8ÄZ<ÆéPjr–ÔÖã©âJ’¦ÍI4§nÝR-³·w®‘q–Ò&™Ž¡ˆ^«ÅÃ-ÅL6$ÄJIâÊf¢Z’¤«ªjRö^ÆGÚ@çéGªÆj‘SVÁph¯­îC3 2ICä£M’ò‹b”D–+m]¯Â>ޏv:1Åušdj¢0å)RX‰%9™[†‡F¤ÿY£+ù_Ø?+âì-ÑŽÑÆ¨¿Y‹K¹OT]Œ¦3¨ÍÃ$¥*ÛÿµUÿ°·ðÃÐ>3¡áÔbl?‰z%+Ó•Ém4n Ê´’%´ÊÎ+w@;le…°#xëFxŽ£LK¡âxi~t8É4²—uhRH’^jMN¶“"àF}£?é‡pÕ'GuêX^‹‡ë%WS4¦4H9Q I²Ý˲æƒY÷'´hëúUÂÑt‰€LCõL?„bmzÙȧM“fâP­¥”’…í´¿°Ç÷¥|ÞÑÍa꼪ôºýmUC[ÑVÒ`”…Ö[m“)[‚•»ˆíWa؂֌sN–šþ¬êDÑ"ô‚V«6²Î̵‹ó‰»?é`éwàjwÑâƒVÁÐÒê­›\ç!””©)IHBŒÕk’ M‘’vˆ¶\VÚ‰@ÃaZÌéõIsV™ƒ$F{#g•m¦å˜Ü-†¯4¶öõ˜›aéŸFŒ/ƒ£T3× ÕW"L]K…‘³T“#ÎiȼFÂ3=¿ÈÀïчGøq.¡ì]M‰P«Ui뛸éu ÃKˆN¹IQ–¥–]žjNÛÌRØ' ÑëÔ GR©bÈ4Y˜ºø‘$3Ô‘ÅjÑ™i;Ý -„¯<¶vܺ'ÓÕ:F3“?S0Í ³§›H¨@¥»Ê¢[yZ5$Ö¬™HÎÖ·U"®…'b”âÊæ*u¬9T(¨UFŠmDuä´²Êi$/)ÙÔ›šÔwìÆÐ&aíIª³JÁ³ëµ*±F€œFÒ\k"sJ ÎÌgŸbwÚç°‡GÁŽÌÒ. ‘Œ`±E¤Qrei¸¨ÈÓDj3DvJÿÆfIAù»Kpûè…Z.„ª]{âÅ&»J¨7(Ù(ÚøòPÚ³%(ÈœÉ3²HÍGm‡Û³e_Óœ¹¼@qp¦¨Òª•––kMõFÒ.D²OšÙ㱩[v€?¿¥ÕBÒE:•™TvœSQ#¥¤)ZçˆÔd’"3±_~ÂMV°½2¸o`Äâ|Y>KlÓ—/DJLÒFJIªùŽêÛcÜÅqÐ}(t‡±¥V L4Ý2t6˜mÅÔù Ë' N‘±dGª²’¬¶¶c½ø o£gárª×«øª]|ШԳvžô”Ç%'¬ñ’ Æg|¶ÌGbWwÅ£\?éBí&— ”U ”ôþé/æ$’-Á6[kË»m·læ7´ e‚´‹éTH4ëÕ’¤ÊfžÑ6Ñ’Þq Q'qjÏoÛwÕàle‡4¦’¯§ÈÅ´ú”E¢¥Q(Gq8¼ÇÔYÝV4!FeÁFDW+ëi Ò0И&sõˆ¸v§Î‹–ìu0N8N)hA%[w;voàyp~¨Ñt‰‡)¸Z™L{Â*Øíå}ÌÌ)å‹Þ½‰2Û}÷Þ'èö3a‡!`ü-ˆ¦Ö©îMšU‰:©fBVÛq*²™¶ˆ¶o#;–›iOU0íFdºÎ1‹3°œˆ¦ÊPÑ´£RϪ®ª•æ™í· ¢0”ð?3`ºž$©ÍƒWÁ±¤FjQâf¥Æ‰¤åQlI’RŸ:ÛoÃhϵ†Éª¼Æ“ È)CëIFqf¥3ePÌÈ®eºöà1ÇU·‰j•¥4M*|Ç¥dw$kj·ô¸×?DûGUýòÇ{Ú8ÕÒêu9•62i·lü…9–÷µò‘Úö?÷ÏØDÝV‘è›q…äìs7 lî{âÅÌ3X?û“Ÿ!‚öÆ*.®¬ýÍ!ô¢×sjW¤ÿÉu8ÙŒjäñÃØ*ö•ƒÿº/ä0_ÑÎÏëâ~b:Ó³úǸŸ˜gð¼Øõ]ÆÌ´+P_@ºaöX÷ótÃìþ±î'æü/6=Wq³- ЗÐ.˜}ŸÖ=ÄüÄt ¦gõq?0Ïáy±ê»™hV ,®tÃìþ±î'æ' ]0û?¬{‰ù† ÍUÜlËB´eô ¦gõq?1é‡ÙýcÜOÌ3ø^lz®ãfZ¨ + ]0û?¬{‰ù‡@ºaöX÷ó þ›«¸Ù–…jB{E•Ð.˜}ŸÖ=Äüà]0û?¬{‰ù† ÍUÜlËB´eô ¦gõq?0èL>Ïëâ~aŸÂócÕw2ЭY]é‡ÙýcÜOÌO@ºaöX÷ó þ›«¸Ù–…kÚ Y}é‡ÙýcÜOÌ:Ó³úǸŸ˜gð¼Øõ]ÆÌ´+@_@ºaöX÷ótÃìþ±î'æü/6=Wq³- ЕÐ.˜}ŸÖ=Äüà]0û?¬{‰ù† ÍUÜlËBµet ¦gõq?0èL>Ïëâ~aŸÂócÕw2Э@…•Ð.˜}ŸÖ=ÄüÄô ¦gõq?0Ïáy±ê»™hV€,¾tÃìþ±î'æ# ]0û?¬{‰ù† ÍUÜlËB¶à Y}é‡ÙýcÜOÌG@ºaöX÷ó þ›«¸Ù–…jËèL>Ïëâ~aÐ.˜}ŸÖ=ÄüÃ?…æÇªî6e¡Zö_@ºaöX÷óÐ.˜}ŸÖ=ÄüÃ?…æÇªî6e¡[e–tÃìþ±î'æ# ]0û?¬{‰ù† ÍUÜlËBµeô ¦gõq?1é‡ÙýcÜOÌ3ø^lz®ãfZ±et ¦gõq?0èL>Ïëâ~aŸÂócÕw2ЭY]é‡ÙýcÜOÌO@ºaöX÷ó þ›«¸Ù–…j Y}é‡ÙýcÜOÌG@ºaöX÷ó þ›«¸Ù–…mÀA‹/ ]0û?¬{‰ù‡@ºaöX÷ó þ›«¸Ù–…hËèL>Ïëâ~b:Ó³úǸŸ˜gð¼Øõ]ÆÌ´+b,²Ð.˜}ŸÖ=ÄüÄt ¦gõq?0Ïáy±ê»™hVÜ / ]0û?¬{‰ùˆèL>Ïëâ~aŸÂócÕw2Э@Y]é‡ÙýcÜOÌ:Ó³úǸŸ˜gð¼Øõ]ÆÌ´+S_@ºaöX÷ótÃìþ±î'æü/6=Wq³- ЕÐ.˜}ŸÖ=Äüà]0û?¬{‰ù† ÍUÜlËBµeô ¦gõq?1é‡ÙýcÜOÌ3ø^lz®ãfZ¨ / ]0û?¬{‰ùˆèL>Ïëâ~aŸÂócÕw2Э„ / ]0û?¬{‰ùˆèL>Ïëâ~aŸÂócÕw2Э@Y]é‡ÙýcÜOÌ:Ó³úǸŸ˜gð¼Øõ]ÆÌ´+PW@ºaöX÷ótÃìþ±î'æü/6=Wq³- Ô•Ð.˜}ŸÖ=Äüà]0û?¬{‰ù† ÍUÜlËBµet ¦gõq?0èL>Ïëâ~aŸÂócÕw2Э@Y}é‡ÙýcÜOÌ:Ó³úǸŸ˜gð¼Øõ]ÆÌ´+@W@ºaöX÷ótÃìþ±î'æü/6=Wq³- ØÃ´Y]é‡ÙýcÜOÌ:Ó³úǸŸ˜gð¼Øõ]ÆÌ´+@l]‡+XN¿"ˆ .N:[SÑÖ¤©H'K‰¾S2¹¥i;o+Øìdd5"Ôd¤®¸Ÿ¢}£‚ªþùc½íW÷ËŸ°¾ÑždÃ['pÙHÜ5²wý…C[#q\ž#i#q\ž#«@£3Y+xÖÈÞce+xÖÈÞc«D§3\øÃ|f>0ß*einŒGxŒ·F#¼EØHÄtb»¸ÆS£ÝÆ.À†F#¾iŒ~#!ß4Æ?n<X1L@ØÁ'À@“à „öˆ!= Ú Oh€ À@žO`=‚B€AÀ8  H€ðbx0B€ð'€€ H€I‡hv€ ¢}£‚ªþùc½íW÷ËŸp¾ÑždÃ['pÙHÜ5²wý…C[#q\ž#i#q\ž#«@£3Y+xÖÈÞce+xÖÈÞc«D§3\øÃ|f>0ß*einŒGxŒ·F#¼EØHÄtb»¸ÆS£ÝÆ.À†F#¾iŒ~#!ß4Æ?n<X1L@ØÁ'À@“à „öˆ!= Ú Oh€ À@žO`=‚B€AÀ8  H€ðbx0B€ð'€€ H€I‡hv€ ¢}£‚ªþùc½íW÷ËŸp¾ÑždÃ['pÙHÜ5²wý…C[#q\ž#i#q\ž#«@£3Y+xÖÈÞce+xÖÈÞc«D§3\øÃ|f>0ß*einŒGxŒ·F#¼EØHÄtb»¸ÆS£ÝÆ.À†F#¾iŒ~#!ß4Æ?n<X1L@ØÁ'À@“à „öˆ!= Ú Oh€ À@žO`=‚B€AÀ8  H€ðbx0B€ð'€€ H€I‡hv€ ¢}£‚ªþùc½íW÷ËŸp¾ÑždÃ['pÙHÜ5²wý…C[#q\ž#i#q\ž#«@£3Y+xÖÈÞce+xÖÈÞc«D§3\øÃ|f>0ß*einŒGxŒ·F#¼EØHÄtb»¸ÆS£ÝÆ.À†F#¾iŒ~#!ß4Æ?n<X1LXßFÇßgLtvÚyÆÐú$6êR£"q:…«*‹‰fJNÇÅ$|Ô¡æMCWcIËf.ZÉð-\D§Ç™„1Ž“RˆGФÈjCÉ5«6U’hJl• Ô“Iß}®d2± ¥b¬G‹eS™|,Hˆ²NJÒ¶å2”Ù)I#NUp3UËnÁ2ÂÉÆëû\ÎIÙ• ¡ø´ÊNŒ´£‡©NÕÍ2d&\)o¥h[…'"œBR’$fÈDe´ì”í=ÅKˆëRòí¿v¿ƒxOnàи´ÌC£ýRëîÕrsÓaGy‡ÒFÍä!´š³¥Y’’$$­°·•ˆ‡ÊLhTÍ J£b'j¢Òñ«°ÐQ$edï”Ö•SsZ¬E´Ï…ÌĹ_[îµÿDÿ’?;áëþÅ8ÐÅZ:£a(µ¹µy“ç1®Ý2*"­ ¯®Á=¬^dªöJˆ²•®d{Hl+:0 ÄÅXª$gç*Ÿ‡#Ä5¢EF;Iuò#/Û8„¶ÒHŽÛIFf[¬DXÊT[ŸßÌÏŸ¿Ë¹O€´©ø »X®ÅURLØððê«L. ö6T‚ëÇtÒ•%j#=é4ì-Ýb·1¤¬9M£ª˜ì•EªÑãÔ‰ JœkZJº I"%[.ûñ¤ðó„v™´jÆNÈåYz|ËËX¯½  ¹…¦-öšW—)­¸ÔD¥‘îÌ}¦:}ÑbÒ4…k´93ÙˆcÎK‘_x”´›(Y)*RR’Z D…Ò[RGÀ†ô°®¦ËOé¾ßɬëlßw×(ÒÚ- !…ðÔ•á\K‰ÏA{µI— c­¯X³$©+/ÙÛ!߬ƒ#¹]9¶Ü.a*.#ÒÎ(¦ÁeÚ]>”S¤Èk”´’^©ÕV”hBAÝ$D¬Ä‚#33-ØËI¤×©Ÿ9\¬Z0p&‘]§2þ&‹‰_tâ^3Î5! "K*ÙdK%‰YxXÌnè8KÑk¸žSÕ)Œ#"vI’ã¾IQ+jØq-Z朙\±L–F•\­˜á&ø˜uâŠLÒQ°©.ª3n4Á¬Í¤8²Z’›ì#QŽÜHŠý…¸nôw‡c:nå%¥¸¢S¶¾T¥&µX¸’vþb¼bå%Å’¶’»4=¢‡…0ŽÆ5ˆtê+µšrܨgNfW’¦µN¸k%¥ JfŒ‰s<×#<¦>Ô|†jñ¨5ˆœîÕ6}|¨’#»%³|”´‘¡Ô,›µ‹5Í&“Ýkí¹L°Ó’ºûû¹«Ä­€Xø×áÚ5 Uf ꮳOÄîÑd²óíæyI¯2MõÄe´•·m¸ Ž4u‡hÑq‘R¤ÕMü4¸&g%ÖÖ‡“$‹e’„™Lï{ÿ+qxY«ü;7ü0«Gwßß§u RS€¥c ÑÍÂ*)§3¨if³oXkRÔ•Ù$[²í>Á æìå%‘eCÂXAXwVªûÍÑSö :S¨’Iê)*hÌ&j,äf•’ˆ­çeôw@)UTrŠššòKÊ:rµÈ%7ÕýÓ¥óí2Úœ» vÝ“efþþ}<è•Pë´‡ix~M T“šLU(‘êJD§RâÛS¦»¤””$Œˆ’\;°r$ œ%²Íã%%t^Ú¢S°ÆðkE&¦ºj’¹î)·’˜Ú§pÒÒ‘–ê¶BUÍVÌ”ìâ\u6—^†é²_©KƒÌVˆró›kadÌß"$ÈÉE”ÖeÕ3ã²ÆU¨Þû÷þ–îGç+Úß{ûßìkS°Ž1ÂÕ:ªn5#ƦÍM™¤2¥-'«BTÚÔFE”ÍDi5•Ìiô¹…bRyïT™&UR»50݉)³ŒÊIÕlx²ë7õIE²÷±¤È%„œbÛô ¼[KR«V‚4–6ŒóÏ”'0¬ÇiµØ•—)­¸ÔD¥‘îÌ}¦!¥OÌšÉ'-˜Ü­» EÝQοÚ™=•aRÄŽ6¥!R Nì¥YI&w·[.î Ñ5#Hx»D“9š~!9+Šûħ©BÉIR’I%¤Ô”(º¥µ%³`šI¹(½”¯ú‘ʼRº(ò-\ D§Ç™„1Ž“RˆJÅ Òd5!äšÕ|ª5$ДÙ*A©&“¾û\È1ΠÔgcŒDÉT’õ»ýÞÒßA&J´™4y.ÚˆÈ÷çÙ¶Ü2ÒÙÚ¿üZãÎW±U¾dÑh¬iSHð«QäVÎ\–žl¥e•†L̬ÖT¹Ö"JÈ‹)Ü•{•}B£R#á8å÷jì¶Ýe0iìÄ”„¼ÂòkIÅ9“¬i+[)&æ[ÓÃ3¸»__ÐF²k†Ÿ©ÄpÒ7þ¹«ß÷ÿçhW¼5aåÎPÑØ’ÚŠ–¤½qÍ-‡O‘P•Q:¼-±VLƒt”‡uf£Q,ŒJRGÖÌVþwŽ4‹‡XÐæ—Žã5ˆšG%6F¥!ô’Û7™Âß³B;]\fžÂîû’¿ê—òGÊVÜW"—¥øØZ‘üЇ"/( Â”ö¦KhÖ4¬ù‰VgkÇb»§°ÿÈاGXj&!Ÿz•"®™”g9%ùO6¶ÝA!µ)³JP“#²ö*ÿÊÛ.xxi]¤ïn×þ ªÊɲ§à Äðb±(ÝáLÈÑ7–™z"à›ˆJÛ6_JÞ²II4ÈÒd£ºVW¹\¶mèj;ˆç7»YfIàòÄëä6â·kGfÒjÙÇe­¸ïb±4¤“Z_õkø"uRveHBÔ‰$ÆŠð„©´Ù•s!>âd£Tá­ä2âžF¯ö„iR²mI ­µFWÆ%Át6i®EêŠÂóš‰(帅&Q-Å7™”¤Ñe&ö3VÎ#3Ã4®÷_ô¿ìb5“ã÷¾Å{À@ž­Ñ¥â¼y UÎb˜‡I.Eu(SjB²3Ì…•’em›Èï²Ç ç%Å’JJ)¶r -Ì7£¬+[,%©“Ydñ33RÎgZ=C‘³]jêu’«T¬e8Æ· `,œ-C­Vê:„Vd<Ù9Îq¢¦m¬n)/užÛs4¢ÆD[îeyò•>ÿ.èÓÎßçÙ•©‹O`L+.ƒ Té57¤;Š‹©ØRÚ6%Òò.ÙØ¬e²ê½·–mŸÎŽ©e£¥N˜™HÅg†ÞT“I¶µ[c©$‘Kù«ûH2µ-qçFö+ =sáØðq4¨ ª«Éj‹1g%÷Û.X…º¦ÌÚ2oöGt¯Ÿa‘íÜ>ØÓèï ã¹øn¡å3íÇ62¾Ô¦S—:[R³´w²T¥–ó"M‹Îxi%vÕ¿ç³ ª{—ßÝÊÈ‹¤ÜDÂLÔ TÍNJmªCËšÚÛέ+qÓ"h®E™V2ڽ痭]êStå³.&𚚺-Ì'£¼+\‚ÉOVcÌĬÎI¨¤4¶Ùr1ZÚ²3J'Õ½ÊåÖÙsÕ·‚ð³Å‚*Ö%Òé8„å"K’ÜA›ÂòÜ”I""Yض‘å¾Ó1.Vv¿ß§tiçFöûõìÊà@·¦hÆ’ÍD’ó5h‘#Ó&Uu3ؔܶY$e(î%´ÙFj<Ĥ‹-¯q‚Þ Á/S°Lçj:TlDü®Pü¹-)Ê9Jͦæ¥K9™oË·aá*.?|;˜óâUà;})a8xY4Ò {'+Z­s“™—öË)%M8ÚwڬĤìºm¼qtå²É#%%tZÌ„_¢àY2 ¸™¡çb/W)£C!Ôµ¬"6®i5ò^ö?;fÜy¸; ÑðLºÍYUgåÓñ´WÑKimü‰5gFfÌѲÛóß/ ÝYrÓµþø_öfžtJÜ—MÁxYæpô‡^¬­ŒQT~%0ÒãITVé6…Î1.§[“l–¥C‰)¨’ÙeµšR²aä–¥$³e3E¯m÷Ò¥SIËÔÚï`ǧèúu)w¨ùB¨Å)6‡ \˜Ôž±¶jÕË·}ª#<Å{ÎNÁ4Ì„qQ…i­r„Êf<–nK„…-¦øÌ}¤Y¶\ö˾7ô¿ðkæ­=lW€-8º8¢7J¤R²Ì95ZQT1ú¬V`ÔJ6Û6zՑ؈֓"#=Çc¶NÑÞ®SðYµ˜ó1+3’j) ©¶]ŒGÖ¶¬ŒÒ£Iõor¹u¶\öXJÛïÓº0ëÁoûûÜT†¢ÔÑ­D“€ñ‰53¨Vêêj7$y-¡”6ò[Q8YLÖKÌddFž©žýÇžœEÅ¿¼ìµÉ¬7ˆd¶Õ)ªƒQq­bŒÜJœBÉg}™l[¶žá˜á%(¦¸¾×²L¦ÀgbÌïT!Æj[,1)ÆÛnQ<„¥FDNeÙœˆ¶Ûeî0Ef¬ìLÏÑ>ÑÁU|±ÞöŽ «ûåϘ_hÏF²FŽFá­“¸l¤nÙ;‡~‰B¡­‘¸Æ®O´‘¸Æ®OÕ Q™¬•¼kdo1²•¼kdo1Õ¢S™®|a¾3oŽ•2´Œ7F#¼F[£Þ"ì$b:1]Üc)ÑŠîã`C#ß4Æ?ïšcˆ·,ét{‰šÂug*©1sI#»æmß?ïXt®eb¹e2,Å´”cš1HMÂJQâk(©+2Åé œRiÒ ™[%S7â §Ã&ÐéïpÑȲ©|s¨WÛ{íÍ_H4ú«.52!Êì’”é³UŠÊxŽäµ©¸dj2¾Ë™Û…¬+Óà K™«k\ÓɆ…TÒ[shõjyBª}É Ý“ iudG•k"„•)Dv<Ä¢VÂë‘W J•gS|Í£ÃeDÒdH)ÐcÓ«-Ǧ¥I„’›ì^×ROÜ–{óù×3;ÜÎÿ:~‘iði(¥1L¬œ4I9z·gBw;ÇÚ,×ÍjÛ½Fv±[qZ¹&j®¦žL4-9ÂyêŽVŒÛTçRû„™0ç%×Jýs'XI6¢Ùe'oöX‡ñ\ÒU~/ªâ&hµ¦©%-Hi58êaÖÒ”¥$¦œŠ´žÄ‘ØÍV;íˆ æªÚ×ûûcÉ…îXð4Oƒ*\˜ÔªºW.1Du*™hÔm»IB šPƒ334¤ˆ‰ç±¶&kƤÇj<Æ‘LÉZ9O0ꉤ’I%6ÃJ2MÎ5o;Zç~d’ÄT”v[ÜeRŠwHë°.…¢ÏJ"T&r —ž&;wdËÌý¬gTW;™šTWêìê‘ÜM%C‰YWO­µ.#)¦|,‘Ð{ɶùDí¹¤ˆÌŒÊö3°q"’O€t¡'vŽún8¤Ìäí;  =Ê#%Š´VR‡nG¬²!‘)w"ëÏùŒ‰F„ýUº¢¡bJlÝ2SU8¥F嵆´&%f«cQìWÜ+’Ú3™«¨òa¡b3¤*[/©Ö¨õT¥qÕL¸<ŸV¥%J-O!ÕÜÔ„ž[žRÚ!C‚šÊªå¥Cä>ˆmr}ÚQÂÉ“üܶØj®¦<˜hlñ=M5ŠäŠŠ!´:H$¡÷µ$’‚IЄ&ÅkHˆ¬\.' TcRk Ô$7QR˜ë°¨3Ä8FVVe6²µ¯²Üwð=X¶ÞÖש&ʵ‹^;¥È™YÓ«ì=ãÒ¢Õ"dz§½Ã&ᤔ£ÿ(îcê­!Ó•> Þl­%È)øÈDèIi·O{š²…×Ç1‘™Þä+¾Ñ\Í]M<˜hXótN™LitŠ«ÌJžš‹Í.TJ¤‘$µ–ä6#2I­±WUï™WW4–ФjÒ\…USõˆÈbRÝ“ IwVJÕ)iL$™šM[ *Ø›(²¤Ê¸—ŠªýLy0п bºu ’ä%Óê²A’¤·Ëc*3¦FyU©z+„FEb½Ìÿ³qr"„åx›Ê*J̶°Þpd $nTPªiM©ÌïÅ’…êŒÔ‚5-¤¥$£Q¥Dm¬‰6±pvñý=×ke ×£œWª´U6¦L­«Õœ<™,EÕµ…zWЍÒWàh¨ÃyÔãìXX¡4ÒÔLAÀdã¡RaÅjÊÙRJi†ŽÅcó³yÇk\ïËg9MíK‰$b¢¬‹&‹¤¨´dBM>}³‚•"+‹©CqƫݵÂ5eÚ}[ÛùlÌ]#S¢Ó𧯤UXŠÌò¨´Ûr '$’^rpŒ ÜŒfÍ™z¾nÁ\›5Un¹“ $ô‘߆òiuvù“–ÃmK‚†’ù•µ¦Ú`’²-Ê23-†V1ð®i æÐªôر'³ÎΛòyCinRRÍ ˆƒÌdéRL•Öß{×Ü 9¤±‡ÓAn›_äK¨m ªERÛK¿¼J8yÐJÛrI•ï´p &xª¯‹#ò`½ ÌoB¨SbÑ*q66Ûq”¤Tb)äÇB‰D‚W$J–”™\k"¹íão¤Ý&P± ª¢©+í¢¥(yKv+RJÉAåen-¾ªTi7JæjØ[ÅN 3Uv\oÄy0½Éà Äðb¹)Ùaœ_O¤a9˜}ÚmEÖjáú©1R—¬}OÞEqiÊV2ëìUÔV3ÕiM…IDƒ¦Õs¢©ÄE"žI8ª4™²iäMR²L¬[mkëÇV*É‘ºPnííCQgÑi´iŠß#¥žhIj£¥²|L–ˆD«™í;ŸXÈŒîeqðŸ݊íø%°Ûޏ—V·'F4º²þ7I¸­©ÕZäF¥\Œï·qñD aâ*4ÓaRŠô'€ét{‰šÂug*©1sI#»æmß?ïXt®eb¹e2,Å´”cšà G ¸IJrT¼Æé-0‰D»®FVOWÍØ+£ Õ[ZãɆ…‡RÒ6¢„·6™\uôHq'P†Dû‰óTñ/ÛúL׸‡áœQ]MSR±¯¬ÛÒ¨ÄBͲæ”DA-D[ ç{Ȉ­ÃÃÄT–æîeRŠàvúAÅz»|:ú‘Kˆˆ›=£ý™*æki-o±šv/q'²ÇÄêTuÙ´b¢¬‹.“bÁjÔ:ue„ѳóy¢l63 Ò»!¹æ%kß1ÙGs"1üGÒDñ)q¥U’Í%.&y\ÕˆR-°zIJQæÍ|Ç´îdF+pæªë÷ö‘§“ 6Ÿ¤•¨'3Š Ç†Ó5ÈfB44…‘š’˜å ¨”vÌGkïÛb!›^Òn[´Fé4ªâ›¢¢J"¾äˆŒ)E#c‰S%Ʋåê‘[‡SXº©ZÿhÇ‘ 68Äíb$@mˆóc3 +Clºû i£#ýša¤£mÌöön¶ÞdA9¹»Ë‰,b¢¬‹}ZHÂü@¥PàâTJ¤ë ×"CtÍkR]S.d«bT”6v3¹–á먮á…á·i·)‹rTÚª1 jxÎæá¹È³çá›5òõwl ¥Š¨ý~jŒßÑ1Õ*‹ éÔì@Û-8n²KªÅtØY•Mšá™¶£íI‘…3R©ÐÎ$zn [:ã”ȪEVéïqä5þrlc€…‰¨¸?ØÏ• ‘ Á†ÄhÔúê9:C/F¤6N)J^Wް®kQ•ÄÅr4YÎÛO´að;¬3éô*"i‘ ÖÉâd9jŒcIH$åÖ¶Kˆ³i]†J¹Þ\eBªP)ô)´ZÊéôëòFÑP†Ùµ:ËL"QæÞ«™æ;ÜÊã…¶b¥¶o¸×ÊïbÀ‰)qiñàµM¯Q’hŒ·*qìtžòmÕB5 ¶ÿ ŠÃ.“bÁjÔ:ue„ѳóy¢l63 Ð»!¹æ%kß1ÙGs"1ZÙbª® ãèX´Í!Ó©©JaS+m!¹g-”òøjK™ÜÔÑ#&Èûb¶ËX}Ѥèˆì„Òªš×fãYÉ€f™”¤ÝAœ¢Œ›šms+ï31Zv‚ÅU[®<˜hdU$òÚœ©—|õï-Û¾é8çYF}eemÚv+žÛÆÛ¾òSôO´pU_ß,w½£‚ªþùcóîÚ3ѣ쑣‘¸kdî)†¶NáߢP¨kdn1«“Äm$n1«“Äuhfk%oÙÌl¥oÙÌuh”ækŸoŒÇÆã¥L­# шï–èÄwˆ» ŽŒWwÊtb»¸ÅØÈÄwÍ1Äd;æ˜Çâ-Ç ;Ú&ÀieÏÒÝ6—-ÖÉOCz‹5Ű®)56Ù¥Ví#ˆU§)ÿlœ~VþS زÏh×ÛuàGÚ5öÝGøG±ð!ËTæË¤~“7Z_Ú5öÝGøGÂ!´kíºð „+@ µNlºGéZ_Ú5öÝGøGÂä6}·QþQð…j–©Í—Hý"ëBÊòF¾Û¨ÿ¨øB|†Ñ¯¶ê?À*>­2Õ9²é¤]hY~Ch×ÛuàGÚ5öÝGøG¨Z§6]#ô‹­ +Èmûn£ü£áÚ5öÝGøG¨Z§6]#ô‹­ /Èmûn£ü£áÚ5öÝGøG¡ í µNlºGéZWÚ5öÝGøGÂ!´kíºð „+@ µNlºGéZWÚ5öÝGøGÂä6}·QþQð…h–©Í—Hý"ëBËòF¾Û¨ÿ¨øAä6}·QþQð…kÚ 2Õ9²é¤]hY~Ch×Ûuà<†Ñ¯¶ê?À*>­2Õ9²é¤]hY^Ch×Ûuà<†Ñ¯¶ê?À*>­@2Õ9²é¤]hY^Ch×Ûuà<†Ñ¯¶ê?À*>­@2Õ9²é¤]hY^Ch×ÛuàOÚ5öÝGøG eªseÒ?HºÐ²ü†Ñ¯¶ê?À*>!´kíºð „+P µNlºGéZ_Ú5öÝGøGÂä6}·QþQð…mÀ@eªseÒ?HºÐ²ü†Ñ¯¶ê?À*>y £_mÔ€T|!ZeªseÒ?HºÐ²ü†Ñ¯¶ê?À*>!´kíºð „+nÁ–©Í—Hý"ëBË, £_mÔ€T|!Ch×ÛuàVÄ 2Õ9²é¤]hY~Ch×ÛuàGÚ5öÝGøG¨Z§6]#ô‹­ /Èmûn£ü£áÚ5öÝGøG©ËTæË¤~‘u¡dù £_mÔ€T|!>Ch×ÛuàV€jœÙtÒ.´,¿!´kíºð „#Èmûn£ü£á Ø@eªseÒ?HºÐ²ü†Ñ¯¶ê?À*>y £_mÔ€T|!Zða–©Í—Hý"ëBËòF¾Û¨ÿ¨øB<†Ñ¯¶ê?À*>­@2Õ9²é¤]hYe´kíºð „#Èmûn£ü£á Ø„Z§6]#ô‹­ /Èmûn£ü£áòF¾Û¨ÿ¨øB¶à 2Õ9²é¤]hY^Ch×Ûuà<†Ñ¯¶ê?À*>­@2Õ9²é¤]hY~Ch×Ûuà<†Ñ¯¶ê?À*>­ 2Õ9²é¤]hY^Ch×Ûuà<†Ñ¯¶ê?À*>­@2Õ9²é¤]hY~Ch×ÛuàGÚ5öÝGøG¨Z§6]#ô‹­ /Èmûn£ü£áòF¾Û¨ÿ¨øBµËTæË¤~‘u¡eù £_mÔ€T|!Ch×ÛuàVÂ-S›.‘úEÖ…•ä6}·QþQðƒÈmûn£ü£á Ô-S›.‘úEÖ…•ä6}·QþQðƒÈmûn£ü£á Ô-S›.‘úEÖ…•ä6}·QþQðƒÈmûn£ü£á Ô-S›.‘úEÖ…•ä6}·QþQðƒÈmûn£ü£á Ô-S›.‘úEÖ…—ä6}·QþQðƒÈmûn£ü£á Ð-S›.‘úEÖ…•ä6}·QþQðƒÈmûn£ü£á Ô-S›.‘úEÖ…—ä6}·QþQðƒÈmûn£ü£á Ôô2Õ9²é¤]he×#Á‰[—Qç8 Éq¸³5*g”´•!ÌŠÚŒÄD¬§´¯c`Ò5?DûGUýòÇ{Ú8*¯ï–??a}£=>É9†¶NáÕaY‘Œèqä4‡™v£6´’’´›‰###ØdeÀmë8u[WæG‘G¢Òš«HŒÃ³¤v”¢qVmD{ŠÅºÜ8¤Ãє㵙Z¬c+2¬‘¸Æ®Oa7£œM#KÃëf>0ße?DX²mjµM˜º]º#‰n|Ꜳf+JVÔ{ó‘•‹q•íròt9Œ‹3†šs†ü%On¢‰dpŽ*|çõ¿ä™ì¾ÒÙ´…úd2’*÷F#¼G ôW¡Hnéj…KÄõ¬)_¡Mb[¶¦Ö´ÊSM‘HR2«X•:Úòìê¡gs±§t‡…¼’¬5MòWõ±Òÿ)¢Íå,"êRr)V+,²Ü˱Ií)É7b ;œ›£ÝÆ2®î1zR1óLcñù¦1ø‹qàBÁˆbÆ >™ íÁŵU1øÑhÝʶŽBP질õe¶éEŒ³+~Û'mÍ;í6àZ—2»…ݧFTsQȄˈCkm7ë¶E°”D[R[ ·u¼î[ñj¼®û¥½ú'¥þíûs߉QXœ¾ûú¿Eð)PC èíè» Q0t©X©ú]F±5¢BÙSèZ! Ì®”ï;V[·$íu*™Ò6,-X&£Mjl •Ô¸•,ˆ­t¬‹rŠå·qÞåm¤\¼‹PÆTœ)ßð»_Ñëo½þ‡? âTqU%_sµýÈåÀu€„ŽçDÔÈÒ9æªì(Õ ce‰K:Æ–òÒ³I¨ŒÈŽÙ-c#.½îF’1bâdH®ëcÕ#"\~TIJ×´Ò×'¹¬¶ìV³«ráÈââ¼f8|C£³t¸»ÛG¹zñÕ=ñøáqN†ÅÒâïmåmûž¨ }çÇ8“ŸŠjÎlº¦óZ×±™\|e4ÕÑô’’º2džÑ{G£t¢ì-DÁÒ¥b§éuÄÖ‰ eO¡h†ƒ2ºPd¼íYnÜ“µÔ®ˆx•,bçväÒIqÿ…êRÆã©àã=í»$¾ý8€ê4…K V ¨ÓZ›FeFu.%K"+]+"Ü¢¹mÜw¹[i..Ó©‘SZ§8ÔŠ”x0spüО¨ ЕŠqlšd©#)p`:ꆤìqÂ3±¬Èö$üÛÜúÞe{¥|M)ôyŒ?J’æT6O—v3È{n¤ØŽÊþV=¶5rðþ-Cˆ_ðî¿£~©}ï9ô|Jjò£O_F·PèëaÜ=€ôtª‹SÕ Ìª8zS‹"¡Q“ÊTd¥+þë$d§#P¬è¹%Z²7”J­_ R6ÖÔ¯kî[“nïÑn$§MÍî<‘À@ôÇÒ{ àšŒ|EŠpLÖç@¦¢Τ‰îT9T‡y§Ú9.8µ)IACVSQä"+u†gæqšˆÖs¬ž—²|wz4mZŒ©Zþªë«_À`„žÁ{$„ ÃFsáHj¢C޹’©oH~Y³gœuiBÚg6k’6ØÈŒˆòº¦g~JÔ¦Þ‰2¬¨í´ûRIu)ë>ƒCdf­»L–¥ûýGB®#ÊÙ²nÉßpô¿Ïó´?¨a[äìZ-´÷½öám×ôß{zxÙôDpæ„ôm@f„¬S‹dÓ%H‘KƒOuÔ- !IØã„gcY‘ìIù·¹õ¼Ê#â4°¼Ê—wÜ’âßßSÆãiàéíÏä’âÙBÖ•°lL;53èó~•%yPÙâËÄ"ï™+;^ü~6_±ðÓ;uú Ó±.‘i´Š³kvÑ!ç[JÍ:ÍS:H3-¤“4ŒŽÆv2;È»ÏR޼íÈŒ Ü„gº¼Š¤"É5m3"2±Üä‹j>¯:µþ˜è4ì5¤Z•"’ÚÚ„„Gy¦Ô³V¯ZÃnšÏi¤fEs3±ÌÎæ`rËÐv`âÚŠª˜‚|h´HŽå[G!(vS„Dz²Ût¢ÆY•¿m“¶æþ›p- K™]ÂîÓ£*9¨äBeÄ!µ¶›õÛ"ØJ"-©-†[ºÞw-øµ ÞW}ÒÞýÒÿvý¹ïĨ¬N_}ý_¢ø±‡hvŽ¡Ð ¢}£‚ªþùc½íW÷ËŸp¾Ñždžy˜øÎ‡"C¨e–ª1Öã‹Q%(I8“33=„D\Gi‹Ê‹ ¹L‰é¹4ºÅAÂ9¯äfKO>k'²¹(øþ ÎFá­“¸}6¾Ä-tÎV"ŽÔ”¯f‹v£ˆpÍeUœÝ~Ñü€ …ð í®ÇÓh®Òê-9-´#û‘De™62²gü=‡´ËuŒ­n+´@Ž­(UV’48ÍZHÌ«ÔeU'.dÇ38­„Eæ ¸$‹ëxä’²7àdvÆÐ™rŸ5.H§-*Ê”ØÖÊŒjoÀÏyRâG¤ÄU©U¹Ç"Aåm7&š#ê¶_ó>Óãý–"ÖŠ4a¹¥½šFœc'$·°BSp/=iî^´ü=U]Y®lCDŸ ľ£efŸÙ-‡!š æÛ—êYTƒq.Q€9þ%áx_¤©bct×ÁðýŸÈšyÑ•â[ZbÓ ¬cAF¦.­Ì­I'ÒíIô.BÒI"CJ4] ;ÜS«Q’T¥Ü…J'€¾ÃðþEQÃÆÑãó~­üX¯^uåµ0é =‚öv{» ˜Ä NNl£’‰§ã-*Q¤ÌºŠC„i2.¼ˆˆŠ×;âb¬Rõ^)BmRTƳX·Ygpíb,©"JH»¶™_}Ç6B8à(F§š£¿‰B>†o9Gñqüþÿ á|’AÀ®ÀøÍú.Óæ¥Éå¥YR›ÙQ‘íMÏqžòþ¥Ä‘ZQ«™-Æ“„f­#gˆ«R«s¹DƒÊÚnM4GÕl¿æ}§Çû,E¬ o¨«#d­¹ÀA‰à ÆLÒà\Y+ ÍÊ¢SÔ÷UwØ#ÚGþZ{ÿ–ÃàeÍÒ¥8Ô‹Œ–ãYÂ3ŽÌ¸ÜYˆ_®J±fjgû&¯¿üå?ü·v™è„˜ÅAYI%dOxÜ᳇êôê&½2&ªW×rµˆ=n©d‡:¤y“eXŠü.9÷Ç êUKÐ>ŒäâÜ77/ûêQbµ8âµnTYÔµ¤wó,E³Î¿³…¢œ'I›M¢Ë¬·/ Á­ÑðÒê|™oò…,–qžk6H#ß~·~ÅiOSË®ŒGx‹ê¯„°œÙ8Ú–ÖªaŠÄ 8š”Xsf8꣺Óßµ6Õr'¶”‹f#Ú•Xg;£,˜ý=SiŠA5öNK„NTá4“w¬•’F·š²HȺ»·‹pšDRg›®î1è¬YCç¼S­L­ax ººÃ¬2ÙºJÎòHŒÔ§ ÉWEÒ‚"Mˆ®b®ú@a8K•ü+Lu×!Buµ0nÔHq¤:I3ãlö¿ t¦¤ìE#ˆ£ÒçVë0h´¶9Dú„–âÅk:S¬uÅP›¨ÈŠædW3"í g€ñ^‹ ^#¥rfÉ—:¹CNgv+º™ ²fY\êÜìG¼®[G¡)tèÏLØ?G¯àÉõÜZÅN–r«««®:#Êum8[)I¥hNt•c=×â;0`H¸« Ò±e2^ÃØ^³‹gT¢ÂÛ*RN¬¬­6[ÈŒÒy—¹ #>Á&fÒ[·?÷#hñ)ˆµÙPçUåK§ÒÙ¥DuÓS0Ùun!„ðI)Ã5*ݦ{–á„.š| >iˆ)PišŽE‰iU½flü…¹)ÕZÖͯe½÷;e¾ã½¶\ PØPiñ*SÄÊå>ŒÚ[5“óPú£¹R&[qWÚg´ˆ¶ÛØkM±1æ’Ô¦ÛqHK퉑‰I%’UcÞYˆnÒ#Øø€ íCmR¥A‹H9ŒKJŸ!ì¹à°Ü’y‹¤Ì󛌥³Ê}Sʵm=—-  HžÑ¶ÃØn»ˆšå˜üÔAk[ Û"²gb-»Ô{l’ºŽÇb;ÔöOàœY† èé¨V«„V7¹o)Û§1»ÕÚ½…~¶^®QËñLm|,aäSÚri|õoO»ÐÇâ«PŒ|˜m6íð_=ý/€ìô¹2‡;*E*'&”¬Ç8²SjrûËaY{óp3·×ãB”ÝH)5k—)ÉÊ)µ`CpaA§Ä©L[+”ú3ilÖOÍCêBŽäYH™mÅ_ižÒ"Ø{obûË&Úi´š–µØ’D[LÌöÎÄ”*¶ª¹K­B\9m‘¡FJ##âJI™(¶\Œö‘–ò1eý+jU“"U;•b¹Dq×I)CYzÚ²Ê}së\÷åØ[3ßs¦¼ACªÑ䢫MË+Xâ ­¸‡ øuv£vbÝkqÊ8ïÄ1ï#Êü qº»oE~ ï†þkÆWÍùJŸà^·_¦þ:(ô ;G`éÑ>ÑÁU|±ÞöŽ «ûåϸ_hÏF²F™N-—Pëj4­ %$Ë–Ò1Ô»¤—Ѥ_+¹©³oSªä:î­­;/Ú~Óvÿ÷ŽNFá­“¸}¬áý¯âskÓŒø£k„±”¼5.¯),·*PÖÉš——V騔‡·Í*+ÛgöÕÌÆ£dàÊ’BgòžUŸi¶D«5–Û³©J½÷žá¬‘¸Æ®OÔ¡RVµÊU!ÞÆöµjp¦¢3˜v‚òžL¢]Ôñ’ÍM\¬VÉ™d[OÎà01Ž9gé>>/™B`á0ôesJœ%´¦YÈFÉ™¦ÙU”ïtŸœ{ sÒ·læ:”dÙNQHé´›Žã⺠€Õ=&]EöÓĤd•#\M¥$„’I²²JÛí{'pÙ?¥L;=T–ñ&Ž¢Ö£Ó¨PiH%ÔœeâTmgíPãi#A/Yµ|Ôí³ã ñІò¼¢‹1Í5KV–©øÙÜ?P`SN–Õ$¤¨Ò¨šµ¤›[ª#5Öj32ÛbÅ;I•8xa·â¦K¸•ô¾©†îUGQ¸KzɱæÖPG´­—ˆãŽñ!A$tzOÆžYù3ýíä<Ň¢Q¬×ê3þ×Í,¹³y»mmæ7X»JÔÌG¤ŒgŒjx"Ÿ(¨ª§F‹"B]æç–šD¤-MmZuFebIõ¬J-ç[º1]ÜbÜ!)Kzy¡¿T¡â|A¢ÊUcR•5eU'š×“œª6RYu¶NÅžk)‘F»}!krkj­@¤ó<ºR¯9Y¥ëÛ–ÝB_(S NDõ]CÚy¼âÊdBœwÍ1ÄX z6Íþ«:þ,›XÃØtðì)JÖsyJס¥Ÿ‘Yd™í$Ûfâ;X‹ŸbéYXÔ“à Ið2'´A í@žÑ™KªÔi‰˜ÜŽ™Èé$üâáý†\ ¶•ÎÇ´aöˆi5fa¤ø€2€Ox=‚öIBI à—I©N¥JåTù aÓI ÌˆŒ'¼Œa—öñ">MY˜i=ÌþœZÝqN8µ-k3R”£¹™žó3È‘&Ià Äð`ȧ̕OšÔØO)™ +2äó.[Œ†8 4š³ _s>Ó$¿2S’¥:§^pî¥+þ»ÄIJÀžð````D ûeÇu2â›q %!i;L¶‘‘ð1‘U¨ÍªÌTÉòûÊ+Œˆ¬]„E°¿ Ä‹+ÜÅ•îI‡hvŒ™ ¢}£‚ªþùc½íW÷ËŸp¾ÑždÃ['pÙHÜ5²wý…C[#q\ž#i#q\ž#«@£3Y+xÖÈÞce+xÖÈÞc«D§3\øÃ|f>0ß*einŒGxŒ·F#¼EØHÄtb»¸ÆS£ÝÆ.À†F#¾iŒ~#!ß4Æ?n<X1L@ØÁ'À@“à „öˆ!= Ú Oh€ À@žO`=‚B€AÀ8  H€ðbx0B€ð'€€ H€I‡hv€ ¢}£‚ªþùc½íW÷ËŸp¾ÑždÃ['pÙHÜ5²wý…C[#q\ž#i#q\ž#«@£3Y+xÖÈÞce+xÖÈÞc«D§3\øÃ|f>0ß*einŒGxŒ·F#¼EØHÄtb»¸ÆS£ÝÆ.À†F#¾iŒ~#!ß4Æ?n<X1L@ØÁ'À@“à „öˆ!= Ú Oh€ À@žO`=‚B€AÀ8  H€ðbx0B€ð'€€ H€I‡hv€ ¢}£‚ªþùc½íW÷ËŸp¾ÑždÃ['pÙHÜ5²wý…C[#q\ž#i#q\ž#«@£3Y+xÖÈÞce+xÖÈÞc«D§3\øÃ|f>0ß*einŒGxŒ·F#¼EØHÄtb»¸ÆS£ÝÆ.À†F#¾iŒ~#!ß4Æ?n<X1L@ØÁ'À@“à „öˆ!= Ú Oh€ À@žO`=‚B€AÀ8  H€ðbx0B€ð'€€ H€I‡hv€ ¢}£‚ªþùc½íW÷ËŸp¾ÑždÃ['pÙHÜ5²wý…C[#q\ž#i#q\ž#«@£3Y+xÖÈÞce+xÖÈÞc«D§3\øÃ|f>0ß*einŒGxŒ·F#¼EØHÄtb»¸ÆS£ÝÆ.À†F#¾iŒ~#!ß4Æ?n<X1L@ØÁ'À@“à „öˆ!= Ú Oh€ À@žO`=‚B€AÀ8  H€ðbx0B€ð'€€ H€I‡hv€ ¢}£]Eú|‡Í†¡¬×kòˆm?k_v±*¶þ¿ô!ÙvŽ «ûåÏØFÕVÑ蛤®Å5D–ÆhåþƉá ±…i%ÕnŽ_ìX~Á‘¸kdîAJMñg6¥ KüWCdö8¯¦ö*9±!øCý bTß*¨åþÃ…á LÆ5rxŽ•§ÅçJ#vþ‘ñR|×(åþÂ…àŒ'´Ÿ‹Ò{£—û‚9é[ƶFó*4©¾1] “„t:wt«ºMà|Šî–±ÂwK£ü‚9Æã¡O Eÿ‚èŠòHì\Òþ;-Óhÿ‡àx#Í1ãâ½§QÿSüÅ:1â.C CÜ] ŽáÍ4i·T(ÿ‡©þÇsMšD+Ú£Gü;OðèÅwq‹PÁaŸúq舤ÙÞ¯NG"ÙS£þ§xãÓž’¯þ4£þ§x½wÍ1ÄZŽ oeˆ‰ÉêYG§=%zÒøràéÓI^´£þ§x¶1l†•‹±©jYg§=%zÒøràéÓI^´£þ§x¶>!…åG¢ì6¥©eô餯ZQÿS¼éÓI^´£þ§x´ÈayQè» ©jY}:i+Ö”ÔïGNšJõ¥ðå;À¨C ÊEØmKRÊéÓI^´£þ§xztÒW­(ÿ‡)Þ­2^Tz.ÃjZ–_NšJõ¥ðå;ÀÓ¦’½iGü9NðjÂò£ÑvRÔ²ºtÒW­(ÿ‡)Þt餯ZQÿS¼Z€d0¼¨ô]†Ôµ,¾4•ëJ?áÊw€:i+Ö”ÔïV„'´2^Tz.ÃjZ–WNšJõ¥ðå;À4•ëJ?áÊw€+@ †•‹°Ú–¥•Ó¦’½iGü9Nðô餯ZQÿS¼Zd0¼¨ô]†Ôµ,¾4•ëJ?áÊw€:i+Ö”ÔïV½¢!…åG¢ì6¥©eô餯ZQÿS¼éÓI^´£þ§x´ÈayQè» ©jY]:i+Ö”Ôï:tÒW­(ÿ‡)Þ­@2^Tz.ÃjZ–WNšJõ¥ðå;À4•ëJ?áÊw€+P †•‹°Ú–¥•Ó¦’½iGü9Nðô餯ZQÿS¼ZC ÊEØmKRËéÓI^´£þ§x:tÒW­(ÿ‡)Þ­@2^Tz.ÃjZ–_NšJõ¥ðå;ÀÓ¦’½iGü9NðmÀ@d0¼¨ô]†Ôµ,¾4•ëJ?áÊw€:i+Ö”ÔïV€ /*=aµ-K/§=%zÒøràéÓI^´£þ§x¶ì /*=aµ-K,´é¤¯ZQÿS¼:i+Ö”ÔïVÄ 2^Tz.ÃjZ–_NšJõ¥ðå;ÀÓ¦’½iGü9NðjÂò£ÑvRÔ²útÒW­(ÿ‡)Þt餯ZQÿS¼Zp †•‹°Ú–¥“Ó¦’½iGü9Nðô餯ZQÿS¼Zd0¼¨ô]†Ôµ,¾4•ëJ?áÊw€#§M%zÒørà Ø@d0¼¨ô]†Ôµ,¾4•ëJ?áÊw€:i+Ö”ÔïV¼d0¼¨ô]†Ôµ,¾4•ëJ?áÊw€#§M%zÒørà Ô!…åG¢ì6¥©e–4•ëJ?áÊw€#§M%zÒørà Ø„C ÊEØmKRËéÓI^´£þ§x:tÒW­(ÿ‡)Þ­¸ †•‹°Ú–¥•Ó¦’½iGü9Nð§M%zÒørà Ô!…åG¢ì6¥©eô餯ZQÿS¼éÓI^´£þ§x´00ÈayQè» ©jY]:i+Ö”Ôï:tÒW­(ÿ‡)Þ­@2^Tz.ÃjZ–_NšJõ¥ðå;ÀÓ¦’½iGü9NðjÂò£ÑvRÔ²útÒW­(ÿ‡)ÞŽ4•ëJ?áÊw€+P †•‹°Ú–¥—Ó¦’½iGü9Nðt餯ZQÿS¼[ †•‹°Ú–¥•Ó¦’½iGü9Nð§M%zÒørà Ô!…åG¢ì6¥©et餯ZQÿS¼éÓI^´£þ§xµÈayQè» ©jY]:i+Ö”Ôï:tÒW­(ÿ‡)Þ­@2^Tz.ÃjZ–WNšJõ¥ðå;À4•ëJ?áÊw€+P †•‹°Ú–¥—Ó¦’½iGü9Nð§M%zÒørà Ð!…åG¢ì6¥©et餯ZQÿS¼éÓI^´£þ§xµÈayQè» ©jY}:i+Ö”Ôï:tÒW­(ÿ‡)Þ­L;C!…åG¢ì6¥©µÅØŠ¯Šëò+Õé(“P–Ðãˆa¶S•¶ÒÚÚR”‘! -„[†¤ZŒTU—SôO´pU_ß,w½£‚ªþùcóöÚ3ѣ쑣‘¸kdî)†¶NáߢP¨kdn1«“Äm$n1«“Äuhfk%oÙÌl¥oÙÌuh”ækŸoŒÇÆã¥L­# шï–èÄwˆ» ŽŒWwÊtb»¸ÅØÈÄwÍ1Äd;æ˜Çâ-Ç  Iˆ$ø|žÑ'´{D í@xÀ@ ì'°@H@’H8D ž OH@’žð````êtA,í,àøSc3*,Šì&žeäÐêú IROa‘‘™Ã#°ëAÔ§('k¦Œ§f\ÔLƒ«x*”ª1×+jn]YÝKpƒQ¨-´SI1›²ß#$“Ët¼ã¶²È¹Ü÷lè·ɡŦ:°óh¯ÊfEV:Ù#¥6¸p>Z¬‡ -n$Șœ±‘¨ˆüü™/Ä7º³õ|5¾-×ÓçºÉo¶´= Fô*…s MU&§HKìa«M4GT Î>ˆmºÓm-£I½gò³šÉYW™23«ôO£FÁ˜ ¡H£Ì†äêCÊ›%ÙãrD·Ð«Y´ÙDI#µÎÈ[IÞ“Zø að)I9T½¾|,Õ¸üo¿…·rOÐô–¸FN8Á5©ªYɃL¨STÒ2M•24U6êѹF¢~BÎå´âüí¼®ÑNª1‡yJ«Œ³Qv”Jª“ÍrIŠ–û-»9dº^hY™š—µ•Ý$FW¦cá•áýµŸ¸iÅþ_$ÖvÖ…« àç°KÓØ­&Øy©$ÈŽ·\6&ÒÉJmÝAês¢i‘eI©&›–•)*ék0Ã5 w‰ÚL®B‚Þ"“¹<†õ4hÉJV‰¯ænçyÍH"4Y2㱪…$¼>µÛV¸þ¶·¯¥¸úü®ž6Ö‡Q¤JM‡*—O¥"¢rWIƒ6k²_Bз$Deû6”¡&”¤ÜQm5ììÛÜiCŧèûÃÃñ¨Õ)œï.ž¹t©ÑåÈ©¼¶¢-6&V¥¨‰Å:„¦×JM¼Ä•:Y©ð¼-KÒjÛ{ßÕµm~/SK~âà“‡ê艙uì) sQ ŸQf‚â[„Ùº‚TÙ3Ú–¢p®’hwÖ\’›!*È›€¨’ôiF©”)¿Üô ƒë¯ÂÊŠ{ޱ6n¨JÚ'·‰(m£Bˆµe”ò™&— ÀU·á©oŵ¹|-n?Ÿ?Tgmhz,´Q¨V[yºÎ"90g·¶ómÏZ`>êeÅÂ&J…½Öq Ì¢A¥|ŠtYOVŠŠfª<”D‹-2äK\ˆ6ô†Y5en-’I'‰J$ºêÓ—)¢÷µDHxv" ?=·ºû´në•ïnö¶\Ö…Á‡pýQUª/áHÕŠqæ³}>‚ãÎKu&¢)Š”¶óÇe£²¬fŒÄŒ¦«Qu°õ4«R™†© Efªóx8ùm&«¡K[9”D\¥*yzË5]N©7Úd<îSÃ'97æZ÷ôÖß:¿TÚÜ­bš^‡¢(¸v#ËS³(,ÅÆ‡O„©´ØØa‰ªdÔüĸ£‚£CmþÉj"#A8fDF¡ª•‡ãF ÍiJŠ p+ ªÕbEKǨ´ô”Åm© »¤òDÈŒÝtºfd«™•UáU›ó7|¸n¶íþœW=FÚÐô~!´VkQ9:˜í%$·CDªqU9EBâoÏ—2§PÉ-Nó-V%~ƒ“M˜.*ÁÔ÷jU6â1U¥ª:b³S³VÚVät¤’GÉõK6¬’Ì¢3+]'H˜vŒCÂf¢ã*·Ü× ?]ÆïV“¸ó>ퟢ}£‚ªþùc½íW÷ËŸp¾ÑždÃ['pÙHÜ5²wý…C[#q\ž#i#q\ž#«@£3Y+xÖÈÞce+xÖÈÞc«D§3\øÃ|f>0ß*einŒGxŒ·F#¼EØHÄtb»¸ÆS£ÝÆ.À†F#¾iŒ~#!ß4Æ?n<X1L@ØÁ'À@“à „öˆ!= Ú Oh€ À@žO`=‚B€AÀ8  H€ðbx0B€ð'€€ H€I‡hv€ ¢}£‚ªþùc½íW÷ËŸp¾ÑždÃ['pÙHÜ5²wý…C[#q\ž#i#q\ž#«@£3Y+xÖÈÞce+xÖÈÞc«D§3\øÃ|f>0ß*einŒGxŒ·F#¼EØHÄtb»¸ÆS£ÝÆ.À†F#¾iŒ~#!ß4Æ?n<X1L@ØÁ'À@“à „öˆ!= Ú Oh€ À@žO`=‚B€AÀ8  H€ðbx0B€ð'€€ H€I‡hv€ úÁÔ|iŠhˬÆÅH *tÈí°å Ç””±%ÖHÍe%$fdÝüÒÞ2]Ñn)uFnbê™ïÿôûÿ¬ƒ?êñüÚ«ÿÜd. L¼C.|ªN1âkufФítÕN$"\†ÐžLr·%)KdZŠ"2ØY‡-xNoT!ÿŠìZÎb-o1õf´EˆU¿Pý‚ÿëGÉZ®+ÎÅÿaHýhùUô¥‰#M¥¢ ´ÙÌU¤œv× Uj7QNgmä–Y¥•µ›$Ü•±$£-ûȨ̈ÑãÄ…=Bm}t³“P¥JŠÓ¬¦²5í°é¥Òó 9ĽҲ%m%‹Ã°‹…(ÿ⻼Ugþo«9¹ú›ó'bÜ73 ©×žv!m +©JQα™žá*ÐeE^v" ûOëFÃJÕlY;cøQÞ¡òZ5!Øur3‰r[«„—\[_´2e$—“•*Ö™‹xßKÄ•+UŠ]"&=BV'j–Ä—VCþö3%O>IQ‹$%H+nIm7+\n°Xuœz#}_yõ8ÅhZ¼êýÿز¿\>jú>¼­õÚÿ±¥~¸Yú?¬Vêob(Uþn9TН!CP´!Ôrh¥(ÍãÙ}› m®}HÙa¨®]¯›=YA+èìjß[ |_ë‡ð¯£ŠU¾³@ø<¿×@ÙQ¦¿Åt1·-O>ѱ“ßW |"gëÇòFˆÇ¾­@øDÏ×B€ÛËŽ†6ž§ÏèÉ ÷Õ( ™úñüÑ‚ï©Ð>7õãÑ`3dŒ]žr?¢Ý4÷Ôh ›úñüýV)^° |.oëÇ£ÀmpyÃê±Jõ…ás^#ê±Jõ…ás^= v8}V)^° |.oëÄ}V)^° |.oëǤ.ÁæÿªÅ+Ö…Íýx}V)^° |.oëǤ.ÁæÿªÅ+Ö…Íýx}V)^° |.oëǤ.ÁæÿªÅ+Ö…Íýx}V)^° |.oëǤ.ÁæÿªÅ+Ö…Íýx}V)^° |.oëǤ.ÁæÿªÅ+Ö…Íýx}V)^° |.oëǤ.ÁæÿªÅ+Ö…ÍýxŸªÅ+Ö…ÍýxôxØ<ßõX¥zÂ𹿯ªÅ+Ö…Íýxô€Ø<ßõX¥zÂ𹿯ªÅ+Ö…Íýxô€Ø<áõX¥zÂ𹿯õX¥zÂ𹿯»›þ«¯XP>7õáõX¥zÂ𹿯»›þ«¯XP>7õáõX¥zÂ𹿯»›þ«¯XP>7õáõX¥zÂ𹿯»›þ«¯XP>7õáõX¥zÂ𹿯»›þ«¯XP>7õáõX¥zÂ𹿯»œ>«¯XP>7õâ>«¯XP>7õãÒ`óÕb•ë Âæþ¼>«¯XP>7õãÒ`ó‡Õb•ë Âæþ¼GÕb•ë Âæþ¼z@ìpú¬R½a@ø\ß׈ú¬R½a@ø\ß×H]ƒÍÿUŠW¬( ›úðú¬R½a@ø\ß×H]ƒÎUŠW¬( ›úðú¬R½a@ø\ß×G€]ƒÍÿUŠW¬( ›úðú¬R½a@ø\ß×H]ƒÎUŠW¬( ›úñUŠW¬( ›úñé °yÃê±Jõ…ás^#ê±Jõ…ás^= v7ýV)^° |.oëÃê±Jõ…ás^= v8}V)^° |.oëÄ}V)^° |.oëǤ.ÁçªÅ+Ö…ÍýxªÅ+Ö…Íýxô€Ø<ßõX¥zÂ𹿯ªÅ+Ö…Íýxô€Ø<ßõX¥zÂ𹿯ªÅ+Ö…Íýxô€Ø<ßõX¥zÂ𹿯ªÅ+Ö…Íýxô€Ø<ßõX¥zÂ𹿯ªÅ+Ö…Íýxô€Ø<ßõX¥zÂ𹿯ªÅ+Ö…Íýxô€Ø<áõX¥zÂ𹿯õX¥zÂ𹿯»›þ«¯XP>7õáõX¥zÂ𹿯»›þ«¯XP>7õáõX¥zÂ𹿯»›þ«¯XP>7õáõX¥zÂ𹿯»›þ«¯XP>7õáõX¥zÂ𹿯»›þ«¯XP>7õáõX¥zÂ𹿯»›þ«¯XP>7õáõX¥zÂ𹿯»˜býðÕo⸔–éTè4ZÊ©¬¢Ty’]p’Ã.gRÓ-²¿ímbOýLú6aØŽ)·j´5-%u%ª5AÃOö’g¿¨¸p¬…C«iRZLbi&û®˜1OþC.§6DJœZlµ¶n”vRJÒŸUˆŠåÅJQÎ×;Úö1G‹ (+¶s±øÙaì¡¶R”ߣV¨¥j‡XÃΚËO5NJ‘Ù™'<Œ¿©Ó}0 ü·Êd5;.¯“óqI‰“ÎÍ›<‡s_«keµ}öoë*†ñ… =Å;)‡X‰=üê2ã«J]Øg±$j¹n4¹°—þóÿcþbƳª·ñ[™>»«u½neS Ïú¼Gÿ6ªÿ÷#­¥S¡R¢®4u-.CÒTœÆ«¸óªuÅ\Ì÷­j;n+جV!Ó`ŠU26¥"=6)\T<¢m„¤”µ–u¬ì[T¥)J3Þffg´Æç‘CôF;²X²Tôw„cÇ\vé¯j$–©Ï¨£(”DÅÖz‹þË.âì!°§áZÂ&c>µÂ˜©¬ºü·žs^¦VÉ­KZK=ZÔž±žËv¬þEÑîÈ9?Dc»!›¤Å âg¤»Y§:ùËd˜”†æ<Ê$ ˆÈµˆmiJÍ7<¦¢3NËX„âŒ+ u"¨ˆtèÏL-©Ë×Êy’SèCm’ÉÖÏ;*Õ´”’‘¸Êö;í®EÑîÈ9?Dc» °)ýag°½.¢™)a¹5*‚ç<Ó} ¨Ûm²-k½w+I5-DFj5‡X;NEÑîÈ9?Dc» °8°§"‡èŒwdŠ¢1ÝÅÅ€í9?Dc» äPýŽì‚ÀâÀvœŠ¢1Ýr(~ˆÇvA`q`;NEÑîÈ9?Dc» °8°§"‡èŒwdŠ¢1ÝXXÓ‘CôF;²EÑîÈ,,iÈ¡ú#Ù"‡èŒwd´äPýŽìƒ‘CôF;² ‹Úr(~ˆÇvAÈ¡ú#ÙÅ€í9?Dc» äPýŽì‚ÀâÀvœŠ¢1Ýr(~ˆÇvA`q`;NEÑîÈ9?Dc» °8°§"‡èŒwdŠ¢1ÝXXÓ‘CôF;²EÑîÈ,,iÈ¡ú#Ù"‡èŒwd´äPýŽìƒ‘CôF;² ‹Úr(~ˆÇvAÈ¡ú#ÙÅ€í9?Dc» äPýŽì‚ÀâÀvœŠ¢1Ýr(~ˆÇvA`q`;NEÑîÈ9?Dc» °8°§"‡èŒwdŠ¢1ÝXXÓ‘CôF;²EÑîÈ,,iÈ¡ú#Ù"‡èŒwd´äPýŽìƒ‘CôF;² ‹Úr(~ˆÇvAÈ¡ú#ÙÅ€í9?Dc» äPýŽì‚ÀâÀvœŠ¢1Ýr(~ˆÇvA`q`;NEÑîÈ9?Dc» °8°§"‡èŒwdŠ¢1ÝXXÓ‘CôF;²EÑîÈ,,iÈ¡ú#Ù"‡èŒwd´äPýŽìƒ‘CôF;² ‹Úr(~ˆÇvAÈ¡ú#ÙÅ€í9?Dc» äPýŽì‚ÀâÀvœŠ¢1Ýr(~ˆÇvA`q`;NEÑîÈ9?Dc» °8°§"‡èŒwdŠ¢1ÝXXÓ‘CôF;²EÑîÈ,,iÈ¡ú#Ù"‡èŒwd´äPýŽìƒ‘CôF;² ‹Úr(~ˆÇvAÈ¡ú#ÙÅ€í9?Dc» äPýŽì‚ÀâÀvœŠ¢1Ýr(~ˆÇvA`q`;NEÑîÈ9?Dc» °)ŒÚÄúKiԒмXòT“Üdp¢\„FoáIêU žu†­È7PFeÃ9-I,ÅþQÛpÜ- )L¦¢,é§ÄKÒªRÝá2’S«'”‚RŽ×QåBsà’-ÄCqÈ¡ú#ÙêQK7ÅÕ¡¶oŠàÊ' á«ÕÔW1%£iÃu¨ùÉk[§~»†WNË™‘žÛÊÖ;ƒ ï?ö?æ6ÜŠ¢1Ýú2Ë,ßTÓmß~T‘\f(ÒV‰šT£J;1?ÿÙxymon-4.3.28/docs/editor-main.jpg0000664000076400007640000022262611070452713017066 0ustar rpmbuildrpmbuildÿØÿàJFIFHHÿÛC  !"$"$ÿÛCÿÀª"ÿÄ ÿÄi  !1QV“Ó"ATU”•²ÑÒ2357RSqu‚’£Ô#a¡¥³BDWƒ–¢Â$46r‘¤±%Cbst´ „8dv…¦µÁÄðEceáãÿÄÿÄ: !1Q24ARSq’Ñða‘"B¡3ÁáCbr±ÂñÿÚ ?ééòå¦t„¦SÉI:¢"'ÄW1cvÌð·ùà ÂóUÿS†•AÝúWÅUN²°Ws×âÿÚ“ÞË6.X•ú$îuß-ó'ôˆîŒýϺ>ilæqDgªlSX¬©é/·!ÆÒÓªYGq !¦4ËQªÏÂúJlñ1RbQéÊŠˆ–2ÐìD¬Öµ-&¾íN)¤dRH”Ùß6ÒÊÆ"®*±S¤5VÞöÝÅlRZšL¶j†Â©ŒÉ2NdšMJtÔ‚5’¶º[Ä@6†í™áoó†¶g…¿ÎÒ’qv(ƒN«Àf±&¶óx¹V§Ef"eÂÓÆE¬40nk3"ëÙ™gdû”lzÆ7•‹H~¥.‘*F'rœ¹/· ékˆT÷¤~‘,›Œ¡ÜÉ"+[bR£M”i0ÛÛ¶g…¿ÎnÙžÿ8cÇ §†ËÉvS¶”)÷I$·LŠÆµ )¹ðžR"Û°ˆ¶ UŠ|Jµ&].{DôIl­‡ÊBˆÈËþ dwlÏ œ1j%YrÚS±jjÚ\[F¦ŸÌD´(д܅*J’eÞ22=¤5iO›^¤ÁÑä÷ÔíT¥.mÎ.|Š[§ÿž…°ŸíÕor,M®bùtˆ¯Â¨KÕ7T­7)4â„™¦ÔyÎ4έ2KV¦Ð„ÙÊ>ãmÌîConÙžÿ8a»fx[üáŒ>œÝS RêmJÝmˆËéU«Ö’ÐJ%äþMï{w¯a‘vÌð·ùÜs¤&0†çßUdkYzJ÷1‘êXg&µÕfZn”ë±9”wØ“±ˆTJ=#³ˆçÕh´Jþ%‰U’Ö笿‘KÆLeVG ”›#J;¥(ÌÏi™a± YŒG‡ðÛ‘¢T S@‡ZjiòŽ8•dq×ê "QSMÑ•}ÂŒÕ݃znÙžÿ8c\ŨäʪVU¸ÐÞšáªRõ ‘® êQ'2ob?t’á2ûTeb~¦ZiN®ŠŽ\ç79$ìk‹¬Seœ•ܪæ“ïØÎÆGc/–äTéøV©@rµ*§ü_’ûÒ[dœ}ÆÊ16£6„–T¼âH’DFFW¹•ÀmýÛ3Âßç 7lÏ œ1`%vÌð·ùà Û3Âßç sv ¢.™‚´sXN”D¾ºA*³M’gQYª"%£PÝõ¦d— X»%k>ê×®¸ëÛ¯~úà,to.ñjɪÝZŒÙ²ëu¹?Ò/›._äÛh”6¾í™áoó†¶g…¿ÎÓÕ\Eˆ¬šÛx´¡‘âö(»Ï¹˜4½ ]I75‹jî_5‰ ؒآ¥úŽ6<>þ#c­*äb5¦•ݳ&I'ö‘¥E´Î%¢|U\F‹Û”fQœÃØI‡aÐõdnOJb%H’¥™\УNT¥³+ÉFjîRßvÌð·ùà Û3Âßç iÅxâÄUŸ©dN™T‰.¡½—D–Fƒaœ^v1Ÿé VÊ’5k ¯‡àÔ A6êu™i+^u:ëM6H¹dB[Jl‚23,Ù•´î£Ù`ÌnÙžÿ8a»fx[üá‹TR¨;¿Jøª©ÖVªîzü_ûR{ÙfÅË¿Dλå¾dþ‘ÑŸ¹÷F{vÌð·ùà Û3Âßç k1töðje9Ue5%c-éMÒÙ(ÙßN«-¸w7~Ù­Ý^ûGŽ-W7MëìNóÌ-r”TÓ†Á2q•VT$‘¨‘¬Î”™(”EÜ‘ÜÌ6*¼UX«“¢ûÍ"CÑ”¬ËMœeÕ4âlvàZWà;\®V1uú²Øv;OÔÔÓ’\6˜JßÊn¬’¥šRF}ÑåB•bï$Ï€ŒiÍTëÍC QÜ;ª¥ièζÓk~¤gQ”J6ÍÄ) KFetØÔg”̉ïÓ£):F´Q©Sª› ¾—ÛgôlïKî“ 46›%.2ƒ#;¯a‘¨Ë` ¿»fx[üá†í™áoó†5F Äué20}Nf )éÄúÝÓKÔ4”ÓìÂÝý¥$¿Ñ©Êó©WRËÜð x«‹ —£ºÍ_½U,NÓmÌŠ¸l4ÓF¸ÉJÛ4 ”J»6;¨ÒyŒÈ“°ˆ6Þí™áoó†¶g…¿ÎÓš6ÅxÒµU¡TgÇ©"ŸW7ŠSR•NDhÆM­iL}[§!KJHR\#;ŒÉl%Zr»?Q«õüA"«.­L‹)HTvZi“[d£ÈM Žç˜³f3+—rI-€';¶g…¿ÎnÙžÿ8bÀ×ÓdbF4¿[ë~•I¨f S5Ûº¤äLŸé ¹r0îk÷W¾[X¸o°6õe°ìvŸ©©§$¸m0•¿”ÝY%K4¤Œû£Ê…*ÅÞIŸ»»fx[üáC†jµèØÒS3Z‰EGîiñâ¾rZSe‡ÐêRN-´+Ý4Ò®IIÜŒ¶•ï«cŒboÐ$ÑꘒL*쌚ã‡Im¥²i5‘ã¤ãfj$¤·A¨¿HDw^T¨7ÔêñA•4ª‹í»Pq¢§2ÏXá4㦛—pÒÎçbîmÂdGêݳ<-þpÆ£§O®Í©á«íIDˆ˜µöTµÅ9+kz%¬âŒµ4•Ýj+®IJ²–agFxJ§à*G•uXš1”È»™†ÓIŒ§MÄjÒJ,«A6²Q¨³8V$ì ‹vÌð·ùà Û3Âßç X _ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÇžUeÈë&Üœþ±Df”†jU»ÅúϽÆ?Fÿëßö†çÿ꼫ÿá÷øÂø‰É(kY-ötÌ’…:g{wÈø»ßMÈr—ÿ‰2_¬`öÞëˆDyF”­fd“55s+ð^ÅÿA^ɬcQ©Ý×ýn~«ì½ø/úí´rÇWî}øÁúܹ÷$œÙx/™»Ûõ Ž£®jµ:kuIm¹Pˆ…¥å’’§’FFJ=‡´BÝ£7¾3¦CÒmRŸ»dîµ²NkKj¢š•d%#R”¬¨I†fnŽôvÜÇÛFŽða%.(ˆ·‚&Â#ÿË»h÷ú<ÁŸÝø쎼1ô?tv]F»"Ðm¥I×,œvÆ\ÖD¥|¥ÜÇŠ%/DDäD§a¨é¨!MÍKL0’’•’’å‹»##;‘Þ÷½´{ý`ÏîüNŒ;h÷ú<ÁŸÝø%—ßjWŒáséõ†ûR¼g ŸO¬b;h÷ú<ÁŸÝøv>Ñïôyƒ?»ñ:0™4F\P“Iu(Hžúžy–¥ä34’HŒÕÔ«!(AÍG•)#3°È&ÜKn Í¤õ-†Ù‹&SÆÉDFœ©$£‚öA$‹¼D[îÇÚ=þ0g÷~'F´{ý`ÏîüNŒíf­ILªÄ,9Q} )”»-¦]Z[Q)j#<¦Fw.¹Š1j R‹Q€ÄºNOZ\}Rcµ!§–’AºÙ™k;–Ò¦Gb+X­WcíÿG˜3û¿£ÇÚ=þ0g÷~'F„(f‹‡gR&Ì¡T¨È9Dv™Š£È†Ò„1uP”6„‘«ÜÜÌÌÆfŸS£E‹Ofƒ ˆn›Ñša-6–4©´lJ+Rn[l£.ù‹=´{ý`ÏîüNŒ;h÷ú<ÁŸÝø ¾ûR¼g ŸO¬Z›Q§? æ®1ÇRûO4kh̬KI,”›— f#-›HË`Æö>Ñïôyƒ?»ñ:0ì}£ßèówât`0-ᦩ;RoJ5dNy´´ì”±H'\BniJ•¹.dW;žË˜ÏÔiø¥ê0°äÈÈyrËí2âêÔk[„“#"R”¥(Ï„ÌÌÏiÎÇÚ=þ0g÷~'F´{ý`ÏîüNŒYº¥!´%¨ÁJDIJ^Am»íJñœ.}>±ˆì}£ßèówâtaØûG¿Ñæ þïÄèÀDëX …[–ÔºÎ<‘RÑY·eÁ£<´ê5C3!$n„‰ºäŠN!•ûžmI˜ŠyÕË.D%)¶Â,©-„W¹íŽÇÚ=þ0g÷~'F´{ý`ÏîüNŒ÷±#±NE5‡éMAm’a¶É¤¶E”I-„’-–µ­°x£ÀÀñéé§1 µ ÞŒ˜èi”¶–^2S­’H¬HY‘“À£"½Å§ðŽXaÇÝÑö Km¤Ö£ë~!؈®÷b¿ÝM¿1¢ß5ÂèÁ-¡¾Ô¯ÂçÓë¦ÔiÏÃy†«ŒDqÆÔ„¾ÓÍÚ3+ÒK%&åÂYˆËfÒ2Ø5¦ÿu6üÆ‹|× £ þêmùù®FíFxR9éÀ©ÒÑ|ŦQq7ᲓŒ„ësàíüßÝE}²äÝÙÝmkk=Õ­²× þêmùù®FýÔÛó-ó\.Œj¹…è•|hÍvE_¥–ä1%Dˆ ”Õ©“Jƒ•žú¼èJòå¾Ëf¶Á+φ7.åÏGÜû£tê®ÞMv·[¬·}gw›‡7uôk­þêmùù®FýÔÛó-ó\.Œʬ/3tî³£HÝl¥‰:Ómzæ’j4¡w÷I#Z̈öeq˜Ç»EÑë´¶)NRp²éñ–n1QØ6ZQð©(µ’¬ˆB÷û©·æ4[æ¸]o÷SoÌh·Ípº0%‰Xy‰ ÄŠ[O-¤2§¶ÉFÚ F„–Ü©5®ÅÀY•nX,(¡)‚¢´p6!š5IÜÍ™dnÞá6JJÅb±×›ýÔÛó-ó\.Œ7û©·æ4[æ¸] ÄJ^ˆ‰È‰NÃQÓPB›š–˜a%%*#%%ËvFFw#½î3íJñœ.}>±«÷û©·æ4[æ¸]o÷SoÌh·Ípº0C}©^3…ϧÖ-16‚òb]5§$¸N¾¤8„›«$¥¥{£Ê„¦çÞIÖ›ýÔÛó-ó\.Œ7û©·æ4[æ¸]kØ ‚õYUwqãîT–¤-RÕŠo¢R ׸ó]*JL¶ì4‘—œg×rç£î}ѺuWo&»[­Ö[ƒ>³»ÍÛºáÚ5Öÿu6üÆ‹|× £ þêmùù®Fa™aCK)2¢šX’©l—è¬ÛêR”§SijRÖf¢Úf£>ù‹Tø¸2”©ñ¨2ÊTÂÔ!”Yõ Чv,Ðf“W ‘™^¿ÝM¿1¢ß5Âèú›~cE¾k…Ñ€ŸÁƒ U$Õ`±A‹P—þ±)”4‡^Û~íeµ[xÌ^ixa– °ÒèíµO¶âm&Ù&5m–¬¿‘d)IÙnåF\5Öÿu6üÆ‹|× £ þêmùù®F{& ‹Yvµ6b¨ñ;5¶ÙKî_‡2˺?ë1î…6ƒ 0á˦ƌÃii–ZqChIY)JKaÖ›ýÔÛó-ó\.Œ7û©·æ4[æ¸] ¡¾Ô¯ÂçÓëš­2<ºìš´="N¥9!¶ÚSqM2$"ùS™ØëpÈKU”£±­V±„Wº›~cE¾k…цÿu6üÆ‹|× £œ…‡"GÄtú¬Œxª“qf.{Ëj샌¸É^vk§ 1,Ï#v4’L•œb—€˜Lä±NÃM&¡þºHa‚)=ÿÒX»¿ë¸ƒï÷SoÌh·Ípº0ßî¦ß˜Ñošát`'ôö0u:4XÔöh1†é»¦ÒÂÍ*A©[£JÔ›–Û(˾c€(?QiÑa¹B:Œj{¤TZi¦^”M6”æY‘™íË{¸ÌEwû©·æ4[æ¸]o÷SoÌh·Ípº0C}©^3…ϧÖíJñœ.}>±«÷û©·æ4[æ¸]o÷SoÌh·Ípº0C}©^3…ϧÖíJñœ.}>±«÷û©·æ4[æ¸]o÷SoÌh·Ípº0C}©^3…ϧÖíJñœ.}>±«÷û©·æ4[æ¸]o÷SoÌh·Ípº0C}©^3…ϧÖíJñœ.}>±«÷û©·æ4[æ¸]o÷SoÌh·Ípº0C}©^3…ϧÖíJñœ.}>±«÷û©·æ4[æ¸]o÷SoÌh·Ípº0C}©^3…ϧÖíJñœ.}>±«÷û©·æ4[æ¸]o÷SoÌh·Ípº0C}©^3…ϧÖíJñœ.}>±«÷û©·æ4[æ¸]o÷SoÌh·Ípº0C}©^3…ϧÖíJñœ.}>±«÷û©·æ4[æ¸]o÷SoÌh·Ípº0C}©^3…ϧÖíJñœ.}>±«÷û©·æ4[æ¸]o÷SoÌh·Ípº0C}©^3…ϧÖíJñœ.}>±«÷û©·æ4[æ¸]o÷SoÌh·Ípº0C}©^3…ϧÖíJñœ.}>±«÷û©·æ4[æ¸]o÷SoÌh·Ípº0C}©^3…ϧÖíJñœ.}>±«÷û©·æ4[æ¸]o÷SoÌh·Ípº0C}©^3…ϧÖíJñœ.}>±«÷û©·æ4[æ¸]o÷SoÌh·Ípº0C}©^3…ϧÖíJñœ.}>±«÷û©·æ4[æ¸]o÷SoÌh·Ípº0C}©^3…ϧÖíJñœ.}>±«÷û©·æ4[æ¸]o÷SoÌh·Ípº0C}©^3…ϧÖíJñœ.}>±«÷û©·æ4[æ¸]o÷SoÌh·Ípº0C}©^3…ϧÖíJñœ.}>±«÷û©·æ4[æ¸]Ìa8ÚÅ•ES0ÖÑÕZbSËj-Í ¦ÄkU›îRFdW;Ì‹„Èã}©^3…ϧÖíJñœ.}>±ìg€¿£ü æx>ÀðÖðVŒh±•RÀø†’ÌV̨pÖjuçÓi"Kfgu­%ÁbÚgb#2`g·Ú•ã8\ú}a¾Ô¯ÂçÓëŽÇÚ=þ0g÷~'F´{ý`ÏîüNŒ_}©^3…ϧÖíJñœ.}>±ˆì}£ßèówâtaØûG¿Ñæ þïÄèÀe÷Ú•ã8\ú}a¾Ô¯ÂçÓëŽÇÚ=þ0g÷~'F´{ý`ÏîüNŒ_}©^3…ϧÖíJñœ.}>±ˆì}£ßèówâtaØûG¿Ñæ þïÄèÀe÷Ú•ã8\ú}a¾Ô¯ÂçÓëWðŽXaÇÝÑö Km¤Ö£ë~!؈®÷b¿ÝM¿1¢ß5ÂèÀm ö¥xÎ>ŸXoµ+Æp¹ôúƯßî¦ß˜Ñošáta¿ÝM¿1¢ß5ÂèÀm ö¥xÎ>ŸXoµ+Æp¹ôúƯßî¦ß˜Ñošáta¿ÝM¿1¢ß5ÂèÀm ö¥xÎ>ŸXoµ+Æp¹ôúƯßî¦ß˜Ñošáta¿ÝM¿1¢ß5ÂèÀm ö¥xÎ>ŸXoµ+Æp¹ôúƯßî¦ß˜Ñošáta¿ÝM¿1¢ß5ÂèÀm ö¥xÎ>ŸXoµ+Æp¹ôúƯßî¦ß˜Ñošáta¿ÝM¿1¢ß5ÂèÀm ö¥xÎ>ŸXoµ+Æp¹ôúƯßî¦ß˜Ñošáta¿ÝM¿1¢ß5ÂèÀm ö¥xÎ>ŸXoµ+Æp¹ôúƯßî¦ß˜Ñošáta¿ÝM¿1¢ß5ÂèÀm ö¥xÎ>ŸXoµ+Æp¹ôúƯßî¦ß˜Ñošáta¿ÝM¿1¢ß5ÂèÀm ö¥xÎ>ŸXóÊ•B²qÊ„-bHÉ+) %&ýòÛÂ]î!­÷û©·æ4[æ¸]o÷SoÌh·Ípº0У!­eNî4fiZŸIZýâ+ðwþ›˜åί™äÖ0“‘Ÿiäy$jmd¢#ÌÞ̓xПРvªÅ*‹GѽF{÷ÕGF†ã‹²MJ2I7{HÌϼDf{hN®Š% ‡U¬P°ýŽÛŒI[…N§3Xy›"Í«If·z÷µÎÜ&&:¡Ú5„$ÿæ«þ¦"ÕzµB\)‡‡R•nv´“FryÔ¤ìÓI/vyŠÆ®à,Çr)%z:%9>+†¤¡ãqµNÆDw#±÷Œk¼KP›‡`)š“Dl°É”wÙI!·’”ìEˆ¬ÚöpZÇžúK/ÊwïY·›qË×=™^VÔÞÓÚÝDrõÏoÎé|zÜE=;è—ù*ÈÙ= æÒ¥’MF’R’E{%GÃÞ1¤Ð+g[§Ny–Q©%!gºgbmÄdOÎ_‡¼'Sc·.Ñ]S©mæÔÚ§TÒÈŒ¬f• ÉI=»“#.21èÒ\½rŒÞ§—§CzýÛsUúvÎz~Ë£ÏP™S“)JKd´#¹B–f¥(’’"I™š”E°»â7£\î§K'âI"L…9ºjó–ú›lŒõm¥&f”Ù'Ý(ˆj¹‹*S˜Å0¥T(Êb¨ä%öA8£JOVêµÈŽ×$Û€Ç{³U4LÓÎqÉè½UTÛªª#38ø¼“ê5'§±½M¸Û(eźSaºËn¯3d„gRK)™†FD|JÃ%I©G¨¶æ¬–Óì«#ñÝ+8ʸl¢ý¤e°ÊÆFd5ü÷æPdÆQŽ˜ç! S&Óæñ¬Òh#I'"LÌó•­ÄbM† T¨¦µPNçQ0l4ÁXÔM™ß»Wò•~÷v‘p™žNUª¹¨ªšéÄzÿf.ƒ[«½¨ª‹”c¿íËþ{$à1ø’”Ýr….’äÚ„Éo!I)Qä2|$´8¤ddGß#à223#Çh÷ ;…0´jDšõZ½-=Ü™õ)+yל2+™gR²#e‰v"áºJ=–û)]©F£ÑåÕ%™“YS«· ‘~³àê‹*U—Z}ªü˜¤óš¶ÐÌ4¦2œù´­ÖO9ßg»,Ýâ.–éIT1”˜ÑeK4IR‰£#BYuÂ#Ö%I"Ì„íÞ´i QÆ}2*±ØBWOeO7QÞ±’–jm(Ùcï_eömÙô¾HÒÑú?©UTÌúûtåÎxäùß*ê§õ¢Ô\š1,þó×ü%J£[‘‰jPª³"Èi£¾ÂX`Û$f[ÈUîfw=Yí2.ã9X†h² ÓNz­%¬²e+!(žqÌÌ¥G’Ƴ32Ú£#Ù|×± ˜Èò–Î&¨·ˆÄz½Q=?v¶‚.pôþ¤ægž~3–TÉÓ$¸Å4"d–jÕ¥&µå;(ì¢=„{8.gÁ³‡ÌÝJ¡S"¡®\gÒjN±(#4— “”‹ƒˆËim/×C•*¸§ä°óŠinºÊU³š–f“¿Éî¬vÚGÞ2=¾\C0ë’YyžjbÙSN!Gt(íb4_iÛŸõp™íòaëKÈÈÈŒ¶‘ð%Z{tøÉqHSŽ8âZe¤ì7W¹MÏa}'À=,¥”$ö$ˆÿà1øž#3hÎG“åG7[Í З¥m-¶#ꊪŒS8”ÄÄs–»P©A†No²Ês·KM¥- Uö™æFlˆ¹\ÍEÔgbÉa êêÑœ9´±T‹b’ÒHÉ*#÷."ûr*Çn##.ú‹) è⫈(²Û3ZÓQ_›wÉ ›¤Ñeö—°ø÷.êÓ#ÕfÓªfìI—A‹»`“d¼«›‰ÙîNäWOê.!æÐè¯i¬ÏëÜšëÏ9õ|!{·©¹WôSˆÿ,µ{à9ÿúg=ü)‹â`ž¦\ZÆê|ðý.<8„é!R\vÉ)¾Ó$¤³-fD£KhqYU–Ã!^øþ™ÏDƽÆ^µ‰:‘0øy—åThÔšeEo3’Q¸M—‹d¡õ¸DD£Q¶I"3Q =ë¿E7gÌÆg´gœ¼×ê®›uM™ÄãâÖލŒpª’ª±Ý·e Š;;‰ëp%(RW ÛY%WR^3>ìФ‘'¤zŸ4£J9sjúÈ‹*nM’ÊéZGÜ©ü— ÒhèªÍ1M\±Œs•u?ç›ÉZE˵Es3¿«üCxC®îŒqTÃ;—.à¦Ãº5—Ön‡e#&[l˹¯{óð¶ûª@z¹*ˆÛù§ÄŒÌ§ÚȮ᧔ê[Uícº˜t¬Gr˶×+À뉊t½]—‰ðëu8‡iŒE\¦MLë7E@ÜÉ~çX’SgrîK+fÛÑ–§9‰èÓñ® 9UjΤGvlÚžVëC‘56ÌšZš[M¨4ç"$m¶Qðmöé¡U W(p+t·÷D „fåEw"“¬iÄ’«(ˆÊé2;ñhæÈôl;LÑNŠ(³°LÖ‘ºÃ5úkTGYvL¶èò‰÷ ¼„rŠé#RÒK'“"5m!°pe6|!QDŒ/WNwD~…JLgz+DôM[š“4©¦‘).>i2,­‘Ý6î@N*˜ªƒLß}Û?W¼ñÛ‘:Ì­Z¤9›'¹IæQä>å7WÎ诚Z7ý¿¹?•×~2\Åÿè)þöî/q±³ÿ¬~³måw®ëõ³Vëß®ÍÓ¿›‰ÍVõî¬ùwU²j÷èu9¯ŸnOåÞBÌœ“<‡¢= ×ZJ×ãA¸É™\УB”“QpU(®[ ËhÓ¸bŒtÝ6.DJ ‰ª“QšôÊŒÚÑäÄB’â’e?6ªK£J͌ҕ ÎÆƒ´7‚z¡‡gâ|2µ?JÀxm˜§>!Ú<¶ŽZœ"%•’ûg«ÿÆŒÅÁ›hnx9& yDz®´•®;ƃq“2¹¡F…)&¢à<ªQ\¶–ÑŒÆUÞ·i T7.êÖÔ AɬÉmÓ-˜ùïc÷:ÜÖïåµÊ÷-; Ë‚0§ðÄê­j&§Dn“??)¢} ÷HmöÍ'O‘s²]ˆˆ‘òNÛSLl9ˆhoadQê²U* ‡ži•N2º£zÒBÒwÌÚR×kdJ«íØšÄX& =ìoC¤Q§RpäªU"J¤Sm.IJ•¯ÊÊlN]¶ã“­§ºRÖ3Q_ #¦á•¬-„‘ ¡ ­&$B£½Omøò£!²‘¸Ü3\t&A0¥¤ìYXZìY®€ç¹¸?T©’¨õÊ}Zst)”Z9*Bõ“"Y‡ž’KNÓ-ΘÙÖ^åLºf}ÎÉå—b¼g"‡†%1@fƒ{P)P»™’¹Úä°ÙY*yHDr4•ŒÌÛ¿º#/ÇuÞµð={n]×½Ù·>³&·TÒ—“5-òÚö;_€ÃWwÞ¯ˆéû—S¼•$AϬͮÍ<Œö±eÿXËm¾â÷ÛbÒºv ³>6‘[«`ÚÝ~·:žiÂò¡S]“©kr%&ÒA2dù<¥$Í&âVDD»åY´*Ât­ˆªÕÊEB«ƒœÄ,, 3j³ûß ÌSdFrYJФX®M­«(ÒfØlŠÆ2Ò0ËÝSfÎLY$F¤”T®$¹]òÙf{‘IÊFFD¢Q÷‰Ra¤ 3ŒäÑ+3éŽTiÕŒu.d”äR›(lS¦D`ܶÂiz¦ŽÇܨޱß5ö§†N™¯HNšæ …ŒÚyêLHk[nÓ•LdÔM0’ý#%1yÔÚÈò8V;Ú¸†»½|9Oܺíû©.}f]NX’$gµ7ú¾[l÷w¾Ë×w¢¯‡)û—]¿u%ÁϬ˩ËDŒö±æÿWËmžî÷ÙcÒµZ K¢Ñ ü[£®\ZB)ΩÈÔíì}³5F"ΆNA¸­Q¤®—Œ½Ñ$ÕJ *¢PÍì[£®\ZB)®›‘©ûØûfjŒE œƒqZ£I].%{¢I†ýó=ˆóéyÓBÖÙ ’ÁdR³¯2ˆÍ7I'¹%Ö™s(¬Pª+”8º[û¢B3r¢»‘IÖ4âIHU”Det™ŒˆøÆ ¢aÅK]20̶°£¸Æ[±)“ ©(N]S*'Y~‰¥¾§,…‘ÈMŠäC-¡š,ún†(4|# Ÿ„«ÙŽÍdªXmâKÒ‘ }y lªR‰?§%-*Êes=© ¬Kâª1±¦¦ªÑh2+$ÔaœºËܬ’[JÝQB‰ 6‚%-L¯jÔK+Ye|+Xo”×.¢“j«×6êbs8RSòt] o‰H&΢ͩµ ­ÝY U” è ·ÓiÑqü÷+˜b¦æ,UVk­Ö•Å4p”§ „”«d&É“m½Nk’Êù?”0Ø.Œó8±™‡j”Ý$ª%‰õ‡á¸ÒdÏ4ØœÝ*"CùîÐi5dM˸à0ܳÞr4ˆôÇZiKDvMãÆErBMjJIGÀY”’¹í2-¢?1” 6ôHfÕP•&iŒF¤Ù§æÇˆnš²™UHJ‰'cVS"à3-ˆ)4'äÖ `œZ£È‘£JûFv–ôw$ÉQÃ$ ¤‘¼íö‰%g3M”«lšãZK˜ÂN-”˜’f0Uú`”jÜñ§Ç~K„iÚ’%>ñ)Ek73"MÀn†ÆUÞ·i T7.êÖÔ AɬÉmÓ-˜ùïc÷:ÜÖïåµÊ÷-c‰pƒÔgñ'áçáPäSè²W šÑ²Ü›L“»ÐÉ&ÉÖ®3hJ‰63Ì‹íQàñ™G§ àÊÜ\*ýB€¨ô†)ÎÃuçZ¨!sf:‰ m&Ö¨VI]µ«‚꺱•w­ÚC ˺µµ(rk2[tËf>{Øýη5»ùmr½Ë'5çe+j#Ò”n¶ƒCF‚Q–I5žu$²¤ŒÔ{odžRR¬“ÐXŠ‚ÌŒ%Š“…ðen.~¡@S†)®ÃuçZ¨!sf:‰ m&Ö¨VI]µªöº†Eº).5YXC Ô©8iÊær,S‰úvjm®[莤¥M·ªÔæVT‘ê–® ¨ÃrѪ+Ü—N^Ër_Š¥dRlë-—SerãkMø×+‘‘hÕ:$ÃŒÐh8š…¨Tü-_Mfb—*Fp£=Sä9ƃh¤%1ÔII!ÏÑ܈ȽÉÞ“€éø›J5YÖ‡´Ú0Å*:$9 IйüóyM%JQ%iÌÙ—t¥¶K.뺹„ÞwtcЦܹw6íѬ¾³t;)2Ûf]Í{Ü­·29Æ% L*%N·K­O¤§áäbZn¥h•PZ7qºÝÌ®â›RÒ§#ìRÉdGÑw´“†ë3±^BXS Èj/[2›Áòê`!, ²°óo¶ˆk'‰Å:”‘ܳ)Eܤ7~;®õ¯ëØ›rî½è¦È¹õ™5º¦”¼™¬yo–×±Úü/H­Å‰Q{oDvlã…Ü"Re¬£ªAš2²¤Û¥úL‡v•b± Õ£ôíAf|m"·VÁµºýnu<Ó…åB¦»'RÖäJM¤:‚2dÉòyJIšMĬˆ‰wÊ=¸Û Såã9•¼MƒZ¥ÅÇ%!Ò]sÔ¨‹Ã̰jCIBÔã{¥,‘åI–fˆÏj6ölC]ÞŠ¾§î]výÔ—>³.§,I3ÚÇ›ý_-¶{»ße¥D·[ÃUÜ6ì:ëm·•ʉßCÄ© »IAÞ˨»­ÓmÂ"¹¬ˆkê&*Ý' R§`Ö£ÑXÆ/:ãQ©Óã¿©RHŸ\G Õµ:¢lЫ%g¶ß¤±†åÄ•êf‚‰•G$t™iâ;%×dg• ´•-Gd¨öì#>ðóQqn¬»Nj™Q) ©F‘**I¥¤ÔÛ6Ó×¹E!n¡&•YW3+w*´6‘M™…°¦“aP`O¥Å‡)÷h,Á§ë´23Ÿè¬¥.¤ÖlŒ’kÌ›–ÛSUÁXÇXFŸ‡*•Ú 4:¹;P„Û/­N;&òº¹ :“[Š'\32%¨Ð£½‰@'“1Ê”I•c9K„Ôù¦íІ#¸n¥)fYlfýû–]¶¹_Á†ñ¾Ä5§Ó¥ÊL½Q¾†&@~"ÝhŒˆÜlžB Ä™]H¹ËnÒ潃±2k˜Á:µŠªn’õ£µº·-B[îÃB™i¦ŒÍEc+–¸³Œ­%:“˜Ëai4Ê%nj$‡æM•R¦»ĸβQÒN¥&ášJÌÑt¨»«™ÌBÒ6›PfiòÜ'Þ&•½²J®²’Q$ÛÔ¨Í[ Ë;žÂ)ºMÂÕ âh‘™ÄÛ½Z£SNáj“Z´º¥%µ¸kŽDÚ HYgQ’{…mîNм<õF‹>HÁ‡Ž›ŒÔ¶#»B¬ÑpÇœ‰Ì’Í¢¶­¼Æ‚KîšR’##¹NéQ%#L8Žrã<˜aúK->m™6µ¢EDÖ‚W©$â ȶ‘-7á éXï Õ0Øê]/áæ"»-ÙdË„hi´š–£lÓœŒ’FvËs+XŽä=xƒP(:U6¯PLiuwµ›6Ö­bî”í4‘’K2ЛªÅ™i+ÜÈIÕ0Ö!¡õ6²å"‡Q‘*«¥VhíFYÉ)'O&Zy-[6±*³N&×4XÏÞˆŽKаn/ǘƒNT§Ðá)’£SÊ£Fy÷Ò–”NªS*'Ú$¿cIšVFQÚQlØa²Šh)Æ…ƒUPIWNTJ)¶²¼sZK%Û)žd¨²ß6Ã;[hÆT4ƒ Ê®Äzªë’(.Cj¢ÌxO¾¶Ü–¼‘Д¶ƒ7µ÷6Fc#Øv)¯bg1ST“¤bHtZ+±Ž{N3åµ"¤‰qÍd“3B›uEr#î]iv;¦ølEƒkU¶I‡ä*6“2©M§®C®ÊEnL‰2ZõŠF}fL‹Ê“EÒeb0ÝxcÓ±èÞøÕ¦w>\ûãF—ù¯l»¡¤g÷'|·¶ËÚå|ÈÖt„̯aŠä*}oâ)*ÜùÄ,HÃY;³3ÕI —v‘«)/Ü¥'”–w`œ)‰i¸ž$Ú…sÆo>w;#V*yn…£Hi-9´È»£,¾è¶‘•LÆØn&%ëué¯@œm— ¸O8Ë.8Dm¡Ç’ƒmµ¨”›%j#<ÅbÚCÓ‰ñ= ¦>úÈ|”¥&­'ÇbŸ‹]Tz´,?ž§¸Ž™) y؄äƒ7œ6Žì—riVTܲ“àÔñ54ÌOŽ_S¥×ªÏ¡7\4o\´ìmØm·ª5-(Φ”F§M$¬Ö$„öƒðÍr\xtê‚Õ&F»#Eu‡¦rk´¸”š’u‘DJ2UÈŒ®cÓ\Å4%B5>§<˜“'UªlšZÌõ’Ž‹å#$æuæÒW· ŸTe­ãáŠí6›ˆ†çÕ1%²Šô«í’UWÌÉ Û3Id³e ŠiAk±f"Ôi•Jæ•‹^¤Ô>¯‰hŠØËKñiÑj‘Ͷ̳#¹'¤(Œ‹)8w¶]°ÓŠènbƒÃLI~EILxo:ÔsÉœ’ë©I¶Ò;H–¤™Ü¬Gr¿²«ü¿ý#ßå,!Ú^¥…ªtª¢%K¬N{p]v,–žuÇÒj} 46¤%DÖW &fÙotÞ[Uþ_þ‘ïòˆ‘­kxÓPç Ö, Ó%¥$£b]E¦\">Ê¥ØÄ_IuŠEs Ð'Ñ*jqRO×›5ænY’fW!wLz%Ã:N«ìYpÝI·.98mf#[G~2½¾Ií.ù­$RiÔ,…èôˆÃƒQša–ÊÄ„”Ö¿â}ó3Úgs1E›Eñ%~{uRè­4§Û6ŠCî¤Ô–”ê²¶„¤¶­j?ä܈‹i™\¯(Dú¨X¤Ý”F˜Ój°ª ;ÞY4l¥ÖˆþZIŒäž%¯c·ƒÊ«µk4wˆ™íÞ(ß®ÍÔ÷ŒÏh âê”ÉE]ø“b©eçZЏÏEY™kR”dW2#ÚF›•Ê×2œM—'¦ÌÔxÌ6n:óª$¡"¹¨ÌöwƳÒeüyˆO‡Hf ‡Ú\f‹)£me•N<¢;Fj"ÚDv±™™˜i&2©„dF§ÇÝO·"4¢˜“º̆ÝS7=ÚPhÛ³ºÛ°sòuê®o‰«u1<§¦þ<þKÔ×{õ#vêbyO~ÿÃöŒèjƒPb=9/?}AɦɎ‡ìF£Õ­ÆÒ•ì#>äÏaŒfĪ~7ªRê”mÍL¯Ô½¸Ýo&GI-~•FhZÙ›Ÿ£"ÕåÊ«™*kÕJÎ7 .Šx¢,"uh«Á›F8ñRÑ0ù’õ®²JSšíBlÛ†› ˆ>‰WFpÌæpÎô­É·X&pü¦]mã$Hœë†™e¬K}Ù$ÈÕcÌW"VžÍÖíFUˆÔ…½i²c»%–²ŸtÛJm+Uíb±¼ÙXÎç›eìvÇ•yÂÅtú”×XTÈs¥ޏ›¤£<ÃEܤÔFNä²;‘‘¤ŒÌ“ÆTZCšXµêžEA-“ÓK9J$ߊ¸ÊR’…dœ¯™8vJ3+if;ø°52¥Ó‘O–ËHë§;Ž2¤¥:ê».5s2ÙjOÊI•Èþ½ðÿý3ž‰Œ6«®›¢­”Šë´zb0;s%¼„´{ZfSsq ï:½…Âf_¨fkßÏÿÓ9蘪‡SÄšÀÔj5Ž¡#G_èè5XœRJš¼—=Ö\»vmÚ=žOµEÛñEÉÅ3œÏnSÏäóêæ¨µ3O_ûN›¤ItÔUáDœPÖÙºˆÒ§ÆfrÓ´Óú-ÈhJ”V2Jœ+\‰YLŒ„‹Ϊ»^›¢üå¡4ÈSÔÄ2N°·W –…I$µI.þÛØÌGšÒΙ…ÎlZ¥[A?H®ÏÜ.Çp­µ‘¤×rÚDd“#Ø"¨Ó–ÃX…5LwXëz¡X SŸLS¦º¦Òg!ÒîÉŒ«+<”™¤ÎËC‰;Eu:[–öÕ4mŒÌužß¼Ïò¾–›Q¿5LÎ9f}yøËz€³Ks`ǘÊ^KO´—P—™[.(®D¤,‰HVÝ©Q‘ì2#‡@x+êÉûÂXáþ _a/ý4ŸI±Üõ¿õdý¿á,pÇÿ/‡0—þšO¤Ø¯­>§aT~“ÿš¯ú˜òIa™,)‰ !Ö–VR›‘ý$8Ž¡¥}(-nÉ^<ª›Ž(Ö«3%s;žÂhˆ¾‚#Ò––ûØîo6ÏF>›Yþ×è馫óM1Vqšºã¯«÷q¯QnžU;± JHIY$V"£„{)iw—s9¶º1ùÙKKÜ»™ÍµÑŒéò-èþúŸúWеÝÝà8?²–—ùw/›k£”´Ã˹\Û]¤ù"ôu?Êx«]ÝÖüXϺۯ0ÛŽ5}Z”›šoÃcýv/ø Ã{)i—ry¶º0=)i“½Žäsmtcœù.ôzãù8›]Ýäƒ;)i——oómtcó²–™¹vÿ6ßF+>N½¿”ñ6»»ª¥NƒRK)¹ aÒy¢Y\’²#"WÓc1Ž<)‡Ìí½äM|Á:²g›¾OØ8›²–™ùv÷6ßF?;)i£—osmôbôØÕÛŒSV>çUzjç5b~Nóm m„$’’à" 쥦ž]»Í·ÑÎÊZjåÛ¼Û}á:+Ý8›]Ýá.$Yh$JŽÛÉ#¹ÒGcâS ÄY®4FšQðškŽ쥦®]¹Í·ÑÎÊZkåÛœÛ}¯ {Ù8›^Ó½ÀpGe-5òíÎm¾Œ;)i¯—nsmôaÂ^öN&×´îg(Tw$œ•Ó£©ã;šÍoÿðˆ{Ya–}é¤#½°‡vRÓ_.ÜæÛèò–šùvç6ßF-éõE®îí«4ãô©l4œÎ8ÂÐ’½®f“" “˜kG˜oLz²iT˜°^q§4-m2”(ÓvÈìf“µÈ‡vRÓ_.ÜæÛèò–šùvç6ßF¥½Úq»»òe MÄ)Äs0–“ZK­ºš‹°¹$¶ìHQ:mfÌœ©±Þå”­À$ô×}~ÀùÇÙKM|»s›o£ÊZkåÛœÛ}žÿ²q»¾ŽoÓ\l}õû¿Mq±÷×ìœ}”´×Ë·9¶ú0쥦¾]¹Í·Ñ‡ Ù8‹]ßCê/Rê)²æ2ïS$œ¨j×:Z·M—5X“cýÎ&Çrî¯ÂDeíߦ¸ØûëöÎ>ÊZkåÛœÛ}vRÓ_.ÜæÛèÆ¿ìœE®ï¡ñE‰¸÷%6•p²¨ñ5Mšw;JË™¶ìßr“È‹‘X»”ñöïÓ\l}õûçe-5òíÎm¾Œ;)i¯—nsmôaÃ_öN"×wÑÍúk¾¿`7é®6>úýó²–šùvç6ßF”´×Ë·9¶ú0á¯û'k»èæý5ÆÇß_°ô×}~ÀùÇÙKM|»s›o£ÊZkåÛœÛ}p×ý“ˆµÝôs~šãcï¯Ø úk¾¿`|ã쥦¾]¹Í·Ñ‡e-5òíÎm¾Œ8kþÉÄZîú9¿Mq±÷×ìý5ÆÇß_°>qöRÓ_.ÜæÛèò–šùvç6ßF5ÿdâ-w}ߦ¸Øûëö~šãcï¯Ø8û)i¯—nsmôaÙKM|»s›o£ÿ²q»¾ŠÀŸO ˜0#A‹„l°É) ¶’+R’nÄD]â÷é®6>úýó²–šùvç6ßF”´×Ë·9¶ú0á¯û'k»èæý5ÆÇß_°ô×}~ÀùÇÙKM|»s›o£ÊZkåÛœÛ}p×ý“ˆµÝôs~šãcï¯Ø úk¾¿`|ã쥦¾]¹Í·Ñ‡e-5òíÎm¾Œ8kþÉÄZîú9¿Mq±÷×ìý5ÆÇß_°>qöRÓ_.ÜæÛèò–šùvç6ßF5ÿdâ-w}ߦ¸Øûëö~šãcï¯Ø8û)i¯—nsmôaÙKM|»s›o£ÿ²q»»÷ Ò0ΜüÚTBD—ÛK&ãóäÈRI™“MëIZ¶ÈÎä„Y?¨f!ϧÂmmÃ2êÞZZ% ”âÔjZ̉½ªRŒÌÏ„ÌÌÌ|ê쥦¾]¹Í·Ñ‡e-5òíÎm¾Œ8kþÉÄZîú9¿Mq±÷×ìý5ÆÇß_°>qöRÓ_.ÜæÛèò–šùvç6ßF5ÿdâ-w}ߦ¸Øûëö~šãcï¯Ø8û)i¯—nsmôaÙKM|»s›o£ÿ²q»¾ŽoÓ\l}õû¿Mq±÷×ìœ}”´×Ë·9¶ú0쥦¾]¹Í·Ñ‡ Ù8‹]ßG7é®6>úý€ß¦¸ØûëöÎ>ÊZkåÛœÛ}vRÓ_.ÜæÛèÆ¿ìœE®ï£›ô×}~ÀoÓ\l}õûæÍOL:e§ÇKÏc—Ô•+)hÎö3ï·ú†;³Î—9k7™gØ«¢º':S]5Faôß~šãcï¯Ø úk¾¿`|Èìó¥ÎZÍæYö³Î—9k7™gØæ·'Ó}úk¾¿`7é®6>úýó#³Î—9k7™gØÏ:\å¬ÞeŸ`9œŸM÷é®6>úý€ß¦¸ØûëöÌŽÏ:\å¬ÞeŸ`;<és–³y–}€ær}7ߦ¸Øûëö~šãcï¯Ø2;<és–³y–}€ìó¥ÎZÍæYö™Éôß~šãcï¯Ø úk¾¿`|Èìó¥ÎZÍæYö³Î—9k7™gØg'Ó}úk¾¿`7é®6>úýó#³Î—9k7™gØÏ:\å¬ÞeŸ`9œŸM÷é®6>úý€ß¦¸ØûëöÌŽÏ:\å¬ÞeŸ`;<és–³y–}€ær}7ߦ¸Øûëö~šãcï¯Ø2;<és–³y–}€ìó¥ÎZÍæYö™Éôß~šãcï¯Ø úk¾¿`|Èìó¥ÎZÍæYö³Î—9k7™gØg'Ó}úk¾¿`7é®6>úýó#³Î—9k7™gØÏ:\å¬ÞeŸ`9œŸM÷é®6>úý‹ÄÕ寤K™šõVJ#©¶¡Dq)qå,Ò[ñ¶‚"á35pØŒìGós³Î—9k7™gØÏ:\å¬ÞeŸ`9œµ×~2þ‰ëþs§~`a±T¼eŠSG§žŽjôÖÙ®Sæ;%ú„¡¶Ù”Û‹3$>j>å*à#>õ‡vyÒç-fó,ûÙçKœµ›Ì³ìÛ&_D…fDuÇ’ËO°áYm:‚Z_­'°ÇÏÏ:\å¬ÞeŸ`;<és–³y–}€Û$â_Bi´êu1¥3L¦Á€ÚÎêDHÈe*?ÖH"¸ô½žt¹ËY¼Ë>ÀvyÒç-fó,û"ŒF!LbD€|íìó¥ÎZÍæYö³Î—9k7™gضS—Ñ ;{<és–³y–}€ìó¥ÎZÍæYöl™}«4ãô©l4œÎ8ÂÐ’½®f“"˜2‹™0¬ãNT(Tf)Ç"é,‘šZm.eR“4ššIíâ-„>|vyÒç-fó,ûÙçKœµ›Ì³ìÙ芩¦¨ÅQ—ÑíËIðšžçzdžnÁ³êôʵJ”ÅJu&AJ§½>d‰'Ò#,ÈÖ²ð‘ìáRWºmŸýžt¹ËY¼Ë>ÀvyÒç-fó,û"ÜDæ"¦Ýs¦0úo¿Mq±÷×ìý5ÆÇß_°>dvyÒç-fó,ûÙçKœµ›Ì³ì s_“é¾ý5ÆÇß_°ô×}~Àù‘ÙçKœµ›Ì³ìg.rÖo2ϰÎO¦ûô×}~ÀoÓ\l}õûæGg.rÖo2ϰžt¹ËY¼Ë>Às9>›ïÓ\l}õû¿Mq±÷×왞t¹ËY¼Ë>ÀvyÒç-fó,ûÌäúo¿Mq±÷×ìý5ÆÇß_°>dvyÒç-fó,ûÙçKœµ›Ì³ì3“é¾ý5ÆÇß_°ô×}~Àù‘ÙçKœµ›Ì³ìg.rÖo2ϰÎO¦ûô×}~ÀoÓ\l}õûæGg.rÖo2ϰžt¹ËY¼Ë>Às9>›ïÓ\l}õû¿Mq±÷×왞t¹ËY¼Ë>ÀÙNxßIZMÒ!áš®‘kÜ/I'£1ÖFÝŽÖR,de~.ðs9;¢uI™ šMl¦Ä£,¦³33B’Eµ%Æ8›ÿˆØKÿM'Òlo®Ç8úgÆo‡ìˆ‹ú¢i/Õpö3ÆØÂ®¬=$ˆòo9ÞRŸ%#)2«‘tÌøT{ ×8Ž£—'{¾’¦Ò·u«PnEž§%§TÆOvÒ—«Ró_fU©¢µ¶çá+mÆÎ÷…}3‚êp©u¬ÕDÈ]6KŘ–JsVâ 9’J2#RO*ȌȮ’Ú?×Yý6?÷ÿðÉÔã|e‘‚¦•5‡bn‰sÜDã(i†•)·Ým&£^kêšJï—-”¬Æœ¥Ÿ# VÙeÇÎ3.²ˆë’n±)§Pm¥iBŒ”…(ÒkMÒFfDw2¶Ñ. é5>¡\ž¸ RêUVä4Ñ´Û³£MŽhÊ»¥F”ÊFT©&“Èd{8i™Ž)j­ÑP§$΢ÆT„Íiª,:a©©(KOÜšò'bÔ£ÚIØ›mþsºæz8âŒuF\ÁX¡¹»‰t‡ŠI³ôµ9”™‚g)_ºRi,¥´¶Ü‹)ÛÁˆ(³èS Qu‹oX“-©4ÜÓîÚR“{¤ÈÊ÷+m¾‘7Þ55RJlIíÕÎT©QM$´°—–ë)jçîЩÚû ÍqlÀé­H¬U£H¤2²&â“rd.Q)ÜëQºl´f„U%; ï“1í3¦kÏ8EQN9#`:9€&ø7Ó«ôŠcÒ+’¡Ï«T¤S ²Šy:Îv›af·]Ö¤ÛIëÒW$*Ä“3úf­T¢"T8¨Z5“)T†Ðãæ’º‰´)D§ ¿ð‘íÙÂ$sÉ¡`Èxz*æ*2çÍv«ZhbdwÙŒÚPv?vZ§L”eÜš’e}¤3HÊ]6›‡ŸŽºœ*{½oSå<úMõ¼…Ïf\u‘¸eÜë¬FE{ߌÍq—XŠ%™‚1,J^ø¿ „³¹[™¦°§‡•¥Òh–n2©&jËbÛ{XíSx¸ä&š§²ãÓ$3¶1…:ÛŽ¨’Ú]A/39ŒÈˆÜ$–Ñ&Äu¼1O¨·U…>l곘b%9QÐÃg r”Üg\NH%(²²Óc=ƒÓGÇøj™ÞÅèn¬ìºµN<º”SŒÚ[Œ„Mf[„Êõ†n©’Js%#;˜õã1 ÛFyÊ-T_ÁõlB©´ÆŽ›%†WÊ„d­Dã.ºfWp9DÙ©J5¤‹3k"ÅâL5Xêevanš’M¢SN­ M³!Ä¡Fm¬³Ò²#+ð]©JF ®PjKšË’¤F›Øì¥Ò7XnB µ’–œ©V¿Ýc,¾äî=ÚGÄzò ™.kjyrª!³÷ÉY2!z¥:hʳ֪ÊV}¤V!xš·cÔ¬Å;r‡€èæ“àü"¼CF¬T7yETÿÑš6³§I·]6ÈîYFˇ}»r•»¢>Â8ö›†©4(¬á¨U7áÎr|—¦©ôš]Q¥$–õO%*N­ ÷Ä™]J+XÎô®jÇô­DFy¼:5ÀóqV!£3#TÅ.mE˜Î¸©Ì0òÛS‰K†Ê\VgDgîR­½îð¶âõÄjYSâ“NGjUÕQŒ“m‡P•¡×Ü»m™)=ÚÈ’Fv3#Ø3øs`˜x‡ U&•} ᙤp˜•˜é˜¹SŠS…‘e¬QH”J±dðŒEGS¤ïîFe–øaªm%«¥=ËÑ·u+º÷¹\±•ÏjnEsµ7W»’ø£ e£ŒP¨Ë4SÕºqâ’K}„2Ûm”_Ò¦í”GºÚ3;r©*%(³d¡:>Äf‡ÜF¹$óhÚÑœmÆä9¬×“™r‘FpóÐD•æR $J×t…EŸ¤ÐÙPL—iD%-´dΖ¨è33Í{^œÿ{ùMìÚ¬´Q1í&.£QVõ^ ˆdÊ]•3Nغ¢•d-dKI”æ’iU‰DNÛeãu͹ÂvÛÎBÑýU8^³Z~m%¥Ò¥°ÂØ:œSÖ¥Æ]xÖ…k{¾å Ê”’ÌÊËsBˆxƒ+íâ7°ô†éñªlç'‘TŒÉ%HpÛ4–á'>b;&÷QYDF“#<Ígáz„KNf4Ú|yÏ™ãÂh‰oÇaæÕ²ZRÒ]SÊYä58”CØÞ0ÂÏc<_^™O{5V¦äÊsÎÓcÌSM©×¦ÔÓÊÕ¥J%#»îòä;ÜNêÿ>HÛCÉFuw©´‰o?§§Vݤ;¤ÆÝM-0ßrÒÞJ–³[Ê#AåÊIJ”d•’„­JîòoÆågsjµÙ7SZýWÎj3krãË–Ûoa;<†dbökÒWh ãi†3MÆmzæz:”…™¸Y”±r¶b3U®EÝ ]4,»õjŽþo&óîMB7.]ǸõºÜù¯«î²d÷_ʰˆª¿Y4Ñêb±Åóª@a­Âîª[mÍa×cžl¤km 5%&­„£"Iܬgr¡4­bÊtÜC¤:ƒLËKX—[¸Ò¤§3yê É-gu³¸iE³7teÞÚP±Ò‰ªcú”ª"'ê€TÆÖ郄÷ÆÛ⦅é:ŸzÝ2ç¹ÍÝd×[„³e¾ËìÆ' V•LߊV ää9 “ÆÑÂk6sG æËkŸÑ7¦ifµá©‘ñ%cÒÛ¥5"œÔÅ¥ DvXCéKD¼†KSnÛ6m¶¹‹Oi+Øl›%œZŠi ¥jš @Q­sæ9ª#}9‘›í2%$­n;®vuÅÞ<_£*í7ÕcRâ¥Ús3eµO7çG)šbC¬™¥¼Ä§FÒ®IMö^Ö2!¹±Ž1Â1VÇ Ì©®|WeT#SÑ¥"çV™!¦ß^¶í*ËIšI îTFG¶ãL‰µUSÔ‹‘LO W0ü×þyz*.Ƶÿž^Š„Dbë¿ÝkhÿÚy o®¡/Cúšg¢CBÝÔ[L‰YÓ ÔÙû§s=F•¬(òÝŒ³"$ªÚÆ”•‘¬vQ\®Gr3!:н£ìmPÒ”\kI;Š<2Õ1J*Q­A™gBÏ\YV#5XŽä›[)Z_£/޼yõMÒœ1Œ0G‹ªÿÞZ§æEÝ R)´=,ãšu)‡ÙŽŠUVzt‰J35Î3<︵ÐFE³‚æfu„¸fw¼+è©0_ÈsþëéÞð¯ FÜ᤼«ä?”,[›Ñ?Ó3ŒO|}™—©Š«æÊo¬ïü Ö?­¿ïü Ö1(Pùßéý"”EŠ%™:¼bþCßð/Xü:ÌRÿ»{þëE jw|“§§¤Oò¼i¨gN¹¿îßû¥ë‡]ˆ_÷oýÒõˆú… ·tv©è· m"ßø4ÿÝ/Xüë‚ÍHû¥ë³ð\·M=[i7\0¾jGÝ/XüëŠÍHû¥ëƒ%uLtO m(ëŽÍHû©õ‡\°~jOÝO¬ELR|#Ë]úã¢xKi_\Ð>jOÝO¬~uÏædýÔúÄLÅ#ËV¶ì'ƒ´—uÏædýÔúîx3'î§Ö" #Žºpv’î¹à|ÌŸºŸXuÏædýÔúÄDŽºpv’î¹à|ÌŸºŸXuÏædýÔúÄDŽºpv’î¹à|ÌŸºŸXuÏædýÔúÄDŽºpv’î¹à|ÌŸºŸXuÏædýÔúÄDŽºpv’î¹à|ÌŸºŸXuÏædýÔúÄDŽºpv’î¹à|ÌŸºŸXuÏædýÔúÄDŽºpv’î¹à|ÌŸºŸXuÏædýÔúÄDŽºpv’î¹à|ÌŸºŸXuÏædýÔúÄDŽºpv’î¹à|ÌŸºŸXuÏædýÔúÄDŽºpv’î¹à|ÌŸºŸXuÏædýÔúÄDŽºpv’î¹à|ÌŸºŸXuÏædýÔúÄDŽºpv’î¹à|ÌŸºŸXuÏædýÔúÄDŽºpv’î¹à|ÌŸºŸXuÏædýÔúÄDŽºpv’î¹à|ÌŸºŸXuÏædýÔúÄDŽºpv’î¹à|ÌŸºŸXuÏædýÔúÄDŽºpv’î¹à|ÌŸºŸXuÏædýÔúÄDŽºpv’î¹à|ÌŸºŸXuÏædýÔúÄDŽºpv’î¹à|ÌŸºŸXuÏædýÔúÄDŽºpv’î¹à|ÌŸºŸXuÏædýÔúÄDŽºpv’î¹à|ÌŸºŸXuÏædýÔúÄDŽºpv’î¹à|ÌŸºŸXuÏædýÔúÄDŽºpv™ÜAXP„†Ymä©.ŒÖDEkwõŒóܹUÊ·TïnÜ[Œ@šàß]B_‡õ4ÏD†…ë¨KãÐþ¦™è‰!Üc£/޼yõMÒœ3ã/޼yõMÒœ) p\ïxWÐ'ºÑ1ÇÑÕH…P¨”"žo´…-·–Û䜊_¸3Q'mË€¸„ w¼+èÝ c NÂXæ<Ê£*5 E4ÛC™Ôò[|ŠÊAC%-32áýCôoú’‹Õù&bÄNíÔãö©íÏëû<<¿WšM4eRÃÚ>ÇÒ±ž„‡÷©NSQ!m© >jR &£A‘šû8 ˆD°ÎˆŠ£B£Ô+X¦EufšLW#©ÕH;\®ddH¾Ëpû¤÷ÎÃߣ­#¥¼Ži¸¿ÔeJ¨SMŠcrÜzFe›O%D“î‰5"æv.-™J.7Àuª{Õ¦Rª8=I40ˆŠu2ÉŒ¤•'b}é¶ÝòïÜ|&¦¯)Ù»vjÏ:£3M31ærÛžYÄL÷ÏGJvÌCóD˜;04@İieQ§CCMK”Ê\LU)§ÌBŒŒÒVÊ«•ŽÄ]òÄèÝŠ'À•ˆÕX˜“VªÑš'·1¡*=jIM­µßa‘(¶ñ(ŒˆJ0¾“°•B«¤©ø–KôÖ1v˜ŠÊSŽ­´2ëV,¤i%e4{£"¹ðØŒÆ:©Ž0}2£Ü%D«?P¦Pë,ÔgÔ\ж­gMGdf;kv+ðÆ]ʵ¿­Vb«Œró9âj¹r—HÆí(è’ŸYÆØœð½^•¡3R› FˆmÙ¢ig˜¬”©J#<¤Gî’fe˜x°–¥T´m£¹5­ãbK”w\n¢š÷w'+NHK—RV¤=ÊræIß¸Û ™¤}Ò1Þ'Ò"»2}Vm=0ãÂÜ.!,ßvKQ“vÐFJ"2Ê£+Ü„F>Ã0tC£úIÍ[µJ$n£2"^d²—Ÿ]ÉFDƒ;-;ûÿ¨ÆdΦmSLç–:Ç?6sêõN9­Ë,TžÃ8{H/GÃÓYJÔH)¶¡©¤Á³-dîÏc™îj;pï´Æ­1²: ê˜cã·q.®*¢šŠPo²¨Ž3¹ ¶ÙÖEžùLöÁ­ÌZÞFÙÎ=g­IŠEF)[„)1IðŠŒR|#Ãq*LR*1Hð×Õ`mn§|@¯ËIJ¹4l7u½&e­U–¢½Œ®DM¬ír¹Û½r<ž0ÆZ!Ř¢„`Ôajüs-íÜ $õÜFµ%)M¶XÉW2¹\G4©ø.­S‡^†ìÊ n)ÄžÛ^ì‹iˆ®W+)DerØ«—ŽC‹gh2…êP0|y˜†³Q"KRg¶²8[xHÍ(µ¶Û)Î×3 ÜO¢zVÑíÔ±»,¹W¦ÈUOVw6á2J%™[º25™͇}›¦™£|0þœÝ§â(XnBãáÖ¥F§S¨ª‡ËÉq*uIÖ-&¤Y)îº' gqsÓkÅø{` Ò¨ÕÕ.K6* ê\F¥ÍTtÚêI¶¡et™–ÏÖChIÓkªŒNÝ]ÇèÎa­írR":Z§·I»µ&’Q•ˆ¶‘º/×`/ RchÕ(u:rŸ ªËLÔ ©©Îf܆¢mÕ9v’JpÓ”Ðw²¶÷{<’t#¸©q™©ã:d M.žºƒ4w™RHÛI™)ã<©UˆøJ×#ÚdFcÒX“Q´Œ°%;Jdª³oÀQÁy£’ÑS5mI’-«p¬£¿súÈeqö.ÑF>8»ÔjiªÅ¤7hŒÆZM׋1¥Ix»”¤”µÛÜ­rØda ц)˜Â,ULÆ‘)“f¼¦¢Áb"æ>v2,Î¥Z”Üö)v+mଣøx~¦:. §Ó*s蔤.,—#¥ÃhÕC‰[f¢º Ë!ìÛr.!gCúBÀ¸oF°a½T™B­D©¦]CrB7ª´…©Ig?RdiIÜËÜžÎèÆ^«¤¬ª¶–å1ˆRê1-;4ÛC|ÇQÖ”ƒº )æ4í;t[vƒKè‚—C­i*‡KÄŽ“t¹2½uä%S4 ϼJQ%?Ö:IT|-I§U¡W4(ìJ#-¬¢Ö¨ia׊ܬ‹"›"áîŒË¼c˜°|ª, ¤ÔdáìK‰k ‘HA˜§\ŽÁŸRn'¹.ñžul¿ %Šô½:9øÚV:œ*º—Qµgò/{3̬ÛR²½‹Ü–Í¢\Þe»Œ(¸Q‘‚ªK¥N¢ÚâØ ·t§)Yg¬Q©F_É÷7ï‰Rt¨µª5s bªz‘ Ök-:²ý6´™‘Ÿx*NÝò%ñ˜‡Ó1í*³§J†/Ä5ºíêZbJ¥©$ë +%´­*J³#!YDI;™ßŒªŒpŒ,s…#¯Ó+4Ê…QeÆÜêfZsÊÒãçÖ!.):¼çl¹ÈÏ`Ìi3E4ªÞœ:ÖÁ5‘Þq²rt†¶š¥´†Y²³ð:nfÍÜðØÏmÇ£IzIÁ2æà‰±ê=rV¨õv&O¬·M8‹q†×›W”È®gÜðlºO‚ö©OÁ4=?¯RëÕ©õ¨{– Ò!8ÚáPÊRežÚË›Dgn¿ˆ»Ç/GÁªÅøkDÄÔv%œ9nµL)‡v¹QÓs"½ÿ”“+‘ÜLêO4øxÂ6sHÐÓROÂaTÕ“Žšs®D³JRD›’W>êÉîvÚÓ’ U0Š ]"Ö1\‰¯¤Öƒ¤±3M%iYîÉ8¥‘¤¶¥DGß±l<Ö&Òn™Õ/…ñ„jÞzRãÉ•¹^,Žd‘CFs÷Äm"2ÛúŒ*n…TÞÄSábúmB¯†Ðk«S˜ayX"%(È;”D•l$Úé2¸¿HМ3ÂTjæ#Ç”ì>ºÓøH~*”Ų’ÒN>jJ3I–Ãú æF2X[a8]š7U[W×.éÞôwOtçÝYxÜ_Zw—‡õ³z%Ò¡a*l:¦7¬*"#)NœRÙufž–ÿFŒ×2J”ddv;p€çŠŒS…P“ ßaóaÕ4n°á-µå3,ÈQlRN×#.‚œs{©3ñ•>*©B9‘h댵]FvS¤vIì;•ܪױKˆ$A—^¨J¦E8^”둘?û¦FiGõ‘PéÅiÊW‹ªî>¬aÅ5$Ú4J;O8óå~í·œmiI¬|$EîNà4ÖÑsÕºf!¬b ã8n—AtØ—!èê|õÄv4Rd{Äv¹ÝEb1¸ëhz•K§a…=.,¥Jr”™¦©¸m±Ä Ý¹æRMJ##UøÈà#áz¶ Æø?ÕfR™¯ÔRb~æ×¨5¥fKKi"½ÛAì$¤î¯s°L_ÒfŽ™Åú*‘ºñÓ0äqæ-èoØ%DCM’ˆ’yŒÍ6<™ˆ¸í´ èû¹£wR­T©Ôé¬â)dTؤ8h¦d”„¥¦™%r¢Êe”û’{)™ä1Âz*–¢T«ØºN!^Z<7#)ÕH;\³(Œ‰ÙntžùØHãcŒ WÁšGÂuLBí-¼G"§aAuäºÒmhîH®Fz¢÷V¶oÕar´y]ÃØìSX›G©à¥$Ѹky3 Œ¤•'boªlÏ5¿”]û€‹`Ý Î¬T1:³]b‰' ¥ñª9ºÓ¤¤¸¢VlÄiNVÈïc;+ƒe†¸ÄÐé´úä˜tz¹V ¶e©šQÔθ$fyfi±™–Þ!»)WÕév¥T’ªkø–¥GS+ZœÉæ’Fh#$žÖïs"º¸v 7çRm7 ɣ㊦&¢S*lS#ÇG2+ojÒI¥åÎGk’Jöâ.!#жŽèT­$b¸¸Ž|Rª.˜ÔÈèuöäœÄ••õHFßüF5¾…1vøHôºÍCr̬Ҋ==½K‹×9ª›])2N×µFE·õžS´Ã…žÄz8•2¡¹›‚Ãïâ·3‡þ”p÷: È’f³Ùk¦û\F振âì{Y“U…†0½±)—$îcq(³Ê$¶ÛH¶Â#IX­Â’"1iZœÞ’èUÊë ¦×ã¹"Y† iqiN{Ù¨¶ìNÌÜ #¹ð õ/຤ "àÊõVE:“ˆkÔ`UŠ·H³<•'3dD½º¶ÎÖIUÁ©Ò®n4ÇÚÃN ñ7Áæ™Ó\ch•‘$j·pÙp^æ{€EêúeŠ)™HÆÐ*Ó°Êœ9ðÛˆ´dBsÍfvÍ•*3I‘slxoL-°œ.ͪ­“®]Ó½èîžéϺ²ð'¸¾µï/ê;@t+ˆ0ÎÆíËÅôhµZCÌ-‡üTH&LÌŒœ$(ŒŒÈÓm›lgn# ~£QßêNÅõ§©P\ªG¬6Û3Wûh5ĺRá–b.é[ÿ”|f-Vt%½Úe¢hë®mnúAT½Ý¸-ª±ÂÉy6Or…”d{88 M˜»b<£š]¡º¦Q©G Þ¥Äj\ÕGM®¤‘+kkÚ“2ÙúÈKCtš #D£I5j >¹" Æ¡Æ9­c)#SD³Ê{ Ï\[{Ùvp˜“Õôg‡àõSÒèìAŒŠñwÕØŽ$”ÊRDá2«a¤Ö‚Ø{,«pl­bü*bc ƒô¨59 ËjkqÔñ%ISf¤šS·n©;qðwîé`m"i˜ê…ê¼\2ÜTÃbLD¤ž,¦j%©*J»“R—°Šö2>2OT=«ªEMXÁ¢¾·· Ì4É%’Œ¬—”[¢$ì±[jí~÷çS®£N‡Œq]f™¨Œ9JT–"INfVá¡Å©?Ê+4ecù_@£Jø» v1ú8ÂUë1ir)ꋱ”Æu¸d”¥[ïU ¸{ÞMã:F&Ãø‘÷¢R±9Q–ÓFá°¬«I(Ò[L¬â¸;öþ ØíaJÖ‘ôc=ÈôÊn,‚r¦Bú6s¶Ê^4¤‹Ü’³¥6+Äî-i‡ Pjz2ÄØ†‡æaœ@å9¥CcTR£ÐÙ)eÀ£3p7þÖ#zDǸV©Š°=2›R«Âñ›¾Q©j"BMÖÒ²;[Vƒ±•ÎÆ\F2šcÒ&¡£ù˜R•Šê8±ê”ä¾äÉPÊ1FŽŒ¦†r’RJVd‘š‰$Gs> ú«ƒ0ìÁkF9§KMVu"h‘zA+U›YgæZÅû¢G½Ÿõl.áÜ Nêx Õ°t4º‡ëfÖùÈe%*JRR£5ZäƒSdd…b-—ÃAÀÑ(qì+Y>©".jÓ2dˆÏdlò Í´Ü³…°ÕîKo³bì=3©£ àèÕ õÈ5UÈ“RádlÕ$Èóšr¾#ažßÔ`6†Ñì*nÃBÁø[M­SÜ›4«uRÌ„­¶ãUe2%m;lá#;–Ž á:5f6/›PÄ0»ôd-Øt¹jJÝ”«:z„©KAš’hJnIQÝE³¼{[éOï6 ©âJœØ5|Df¡µN&j\hšNUÄ™%)÷VÛ~öѬ ½‚13Øßbʤê]VB™F‹&¤>ûšÕ›k2mV"V¬¸QÂ{xƒfh“aŠ6‹ðµz«†é•¹x«·KZ§2NjRÜo¸#Ø•¶g~¿¨„j¡XMU̇ð†Äºk Âjµåj iΔ ÍE”¬í”g}ˆ#>’ÑN?Á}¨8oÔäÒžÃUÄU¡­¸«y2I*ZɾæùO3ŠáÙÁúícé Lê‹©éIU6›qPÆê‰YRËddÙ(Èõyˆ¿ÀÕ53£CÃtJ%ôvMÈIމH5$’[r¢Û.fdjQ}8íÖ°½2¸o`Äâ|Y>KlÓ—/DJLÒFJIªùŽêÛcàNÒ+ˆn{ÕZÔ꤅ž™!ÇÜ3ï©j5í1µzœë8 ï­z¿ˆÚ¥×͵F¥›´÷¤¦9)=ÓÆH+òÛ1‰]ã>-àyýT.ÐáB`ép©EP™OO½%üÄ’E»É²Û^^ ¶àØ#˜ß Ð1– Ñþ/¥Q ЯVJ“)š{DÛFKyÄ%Dž2ÕžÞþm¼1xaÍ餫éŲ1m>¥h©TJ‘ÜCŽ/1÷ ;ªÆ„(Ì»Ê2"¹XUŽ´ƒ†igáL9úÄ\;SßEËv:˜''´ ’­¿Ë]ÎÜ\=àžc܃ª4m"aÊn¦SÁ°cJ‡6;y_s3 yDâøW±&[oÃ~û4{ ›€0ð~ÄSkT÷&Í*ÄT‡³!+m¸Ç•YL‰[NÄ[8HÎå†ÇZSÀ‡AÆ•L;Q™.³ŒbÇŒì'")²†”4m(Ô³îUÜ©^äÏm»ÛE8Jxy°UOTæÁ«àØÒ#5 ¨Šq3RãDÒr¨¶$É)Oº¶Û÷¶€çêÃdÕ^cI†ä¡õ¤£8³R™²¸32+™p^Ýá»ú„¾=êiž‰ -Š*‡[ĵJÒš&•>cÒ²;’5‹5[ú®7OP—Ç¡ýM3Ñ!C¸ÆF_xóêš7¥8g†F_xóêš7¥8Rà¹Þð¯ FÜáIÞð¯ aàÒêu#p©´é“uvÖnvæKÞ×ÊGkØÿà?R_˜±”|X6=uæhd•£r¶Út­F¥$ÖIÎdf£¹Ûm¸XHzÈÆ<—¬yýAÖF1ä½cÈ×ê ×{šþ™ûéîõ‘Œy/Xò5úƒ¬ŒcÉzÇ‘¯Ô®÷5ý3ö7ÓÝ!ë#ò^±äkõYÇ’õ#_¨<+]îkúgìo§º<CÖF1ä½cÈ×ê²1%ëF¿PxV»Ü×ôÏØßOtx‡¬ŒcÉzÇ‘¯ÔdcKÖ<~ ð­w¹¯éŸ±¾žèð YÇ’õ#_¨:ÈÆ<—¬yýAáZïs_Ó?c}=Ñà²1%ëF¿Pu‘Œy/Xò5úƒÂµÞ濦~Æú{£À$=dcKÖ<~ ë#ò^±äkõ…k½ÍLýô÷G€HzÈÆ<—¬yýAÖF1ä½cÈ×ê ×{šþ™ûéîõ‘Œy/Xò5úƒ¬ŒcÉzÇ‘¯Ô®÷5ý3ö7ÓÝ!ë#ò^±äkõYÇ’õ#_¨<+]îkúgìo§º<CÖF1ä½cÈ×ê²1%ëF¿PxV»Ü×ôÏØßOtx‡¬ŒcÉzÇ‘¯ÔdcKÖ<~ ð­w¹¯éŸ±¾žèð YÇ’õ#_¨:ÈÆ<—¬yýAáZïs_Ó?c}=Ñà²1%ëF¿Pu‘Œy/Xò5úƒÂµÞ濦~Æú{£À$=dcKÖ<~ ë#ò^±äkõ…k½ÍLýô÷G€HzÈÆ<—¬yýAÖF1ä½cÈ×ê ×{šþ™ûéîõ‘Œy/Xò5úƒ¬ŒcÉzÇ‘¯Ô®÷5ý3ö7ÓÝ!ë#ò^±äkõYÇ’õ#_¨<+]îkúgìo§º<CÖF1ä½cÈ×ê²1%ëF¿PxV»Ü×ôÏØßOtx‡¬ŒcÉzÇ‘¯ÔdcKÖ<~ ð­w¹¯éŸ±¾žèð YÇ’õ#_¨:ÈÆ<—¬yýAáZïs_Ó?c}=Ñà²1%ëF¿Pu‘Œy/Xò5úƒÂµÞ濦~Æú{£À$=dcKÖ<~ ë#ò^±äkõ…k½ÍLýô÷G€HzÈÆ<—¬yýAÖF1ä½cÈ×ê ×{šþ™ûéîõ‘Œy/Xò5úƒ¬ŒcÉzÇ‘¯Ô®÷5ý3ö7ÓÝ!ë#ò^±äkõYÇ’õ#_¨<+]îkúgìo§º<CÖF1ä½cÈ×ê²1%ëF¿PxV»Ü×ôÏØßOtx‡¬ŒcÉzÇ‘¯ÔdcKÖ<~ ð­w¹¯éŸ±¾žèðß]B_‡õ4ÏD†«ÓgR'®J2ãJBP¥´¿t’RII¿ÙE³„¸hÝýB_‡õ4ÏD‡†ºj¢f𣠸ÆF_xóêš7¥8g†F_xóêš7¥8r„¸.w¼+è·8D’w¼+è·8Gê[Þg\óÖÌP¡YŠ>oPµ=([P¸¡mC Pë j(V¡B†-õáAŠ Vbƒ7V…&)¤g\L)1IðŠŒR|#Ãq*LR*1Hð×Õ`úêøô?©¦z$4(ß]B_‡õ4ÏD„Iã|uãϪhÞ”áž|uãϪhÞ”áHK‚ç{¾s„I'{¾s„~¥½èññ–uÏ=lÅ ˜¡Cæõ SÑB…µ ŠÔ0µ°¶¡B…j(bß^ Åf(1“uhRb‘QŠFuÄ“Ÿ¨Å'Â<7¤Å"£ }VPo®¡/Cúšg¢CBõÔ%ñèSLôHDî1Ñ—Ç^<ú¦éNáÑ—Ç^<ú¦éN„¸.w¼+è·8D’w¼+è·8Gê[Þg\óÖÌP¡YŠ>oPµ=([P¸¡mC Pë j(V¡B†-õáAŠ Vbƒ7V…&)¤g\L)1IðŠŒR|#Ãq*LR*1Hð×Õ`úêøô?©¦z$4(ß]B_‡õ4ÏD„Iã|uãϪhÞ”áž|uãϪhÞ”áHK‚ç{¾s„I'{¾s„~¥½èññ–uÏ=lÅ ˜¡Cæõ SÑB…µ ŠÔ0µ°¶¡B…j(bß^ Åf(1“uhRb‘QŠFuÄžøiW¨¸HV9Ñb›‘™&p²hWüÕ¯‹ö‹à"|Ÿn}sùòFùXÕ¯‹ö†­|_´_k¼þ|ò±«_í Zø¿h¾áÖ»ÏçÈß+µñ~ÐÕ¯‹ö‹àk¼þ|ò±«_í Zø¿h¾áÖ»ÏçÈß+µñ~ÐÕ¯‹ö‹àk¼þ|ò±«_í Zø¿h¾áÖ»ÏçÈß+µñ~ÐÕ¯‹ö‹àk¼þ|ò±«_í Zø¿h¾áÖ»ÏçÈß+µñ~ÐÕ¯‹ö‹àk¼þ|ò±«_í Zø¿h¾áÖ»ÏçÈß+µñ~ÐÕ¯‹ö‹àk¼þ|ò±«_í Zø¿h¾áÖ»ÏçÈß+µñ~ÐÕ¯‹ö‹àk¼þ|ò±«_í Zø¿h¾áÖ»ÏçÈß+µñ~ÐÕ¯‹ö‹ãnõ=èçãŠF-«bú•VŸ €Ã2ä%¤¬Ù¥å8¥¶³U‰¢2$•øxvwtvmQ5Õ3ÏÙ1TËMê×ÅûCV¾/Ú7&¨…ƒçIÁxÚ¿R¯#W¹cIeIm˸’]Ì㣣÷E´‹‡€Ú#Ð~$ÄÕêŒIDªÂÂõ2qG::ÛK„JÖÚ¬y)R’’#Rly¶påúx¢kªf><¿àÌå¦õkâý¡«_í¦N‰â=AÅê£Òñ$ê…3®‰M’R¡¦ÿ¤2Òñ)ItÜ=gºJIRx•o?T†¥èÏ{æÃvEBŒóm²ì÷TÚ/-Fé›il1'"îw.½à¦Î–ª¢Ó™ø©§µkâý¡«_íSBÚ1‰ŒàÕ±#­• QÈ·\¢IÖ£+äMöŠ×; Hˆï³'¥m`zf´}ŒÎ¯MTÎäyªJ_5^Æh,¨Q™•Òi½ŽüfÆš.~žg?ã=³ƒ3Œ´Æ­|_´5kâý£i§B˜ö“W§õÏ…æ±LvtHòdcqDóÄÙ%³5šs™ì+ì#25XŽâqKêy:ÕKnk”ö(Í¥šT9ÏE\™2Õ.êÜ[k6Ò’RÚÚ[ .Ò4ªÕªÖ’ž{ÿÌ~zÓšœé«_í Zø¿hÚËG‰Ãš*§W¦Qëñ«K«=N˜ó²b.­µÈBÚ[Q»œ’+¨²žUØìi¾*½¢­!P°Ñb:¶™™•*SªR M‘ðÐJ5 ¶—º")Óiªþï^:Â7J «_í Zø¿hŸáéÐS]¢áy2©ë#6Ý7[oXE°Í)Z‰J-â1™¢èâ—'©ÿcÙÎÔØ­Ñª©‚ˆÙ’–H³ÇJ³¤Ñ›1k—ü¢à-œ7U¦ÓG-ÓÖ#¬u“2Ôúµñ~ÐÕ¯‹ö… Í’±Òh Ÿ¸cµr¤ºI̽ZM)²Höf3ZKo\öÚÂgŽ4q¢4áz¬ì¤u.«K#7 UÖ†U Ëi¡²ZQªÄv±*çbïÜV½>žŠöLÎ:ò38ËEj×ÅûCV¾/Ú$øÇâl#R‰NĵE“1”¿(y·‰Ô(̈ҦԢ=¥Á{ðqÍöÒ9âƒÃ)Ã.¹ULdÊ[(’ʉ¶ÔfI5¬—‘2;Œõ“¤ÓDg/Œ¥¯ukâý¡«_íwh;Ô´bj|ª"É’$¶á%„l̃%e]Ö¤#¹32Ïs+Œv.Ñ/¦é:V ¥Q%ÌufäŠykZœ‡­ZyjIåEòíÍ–ÇÞ+¤XÒÍ[wú³Ö:©¬õkâý¡«_íëeÊö‰ºÒ¤6'>þ™«‚WxÐëK3,¤®à’£76ò3m¹p‘´étÑëëûÁº¦´Õ¯‹ö†­|_´Mq^ŒñÞ¡3\Än\ {ÆIK«4S>ZRf¤ÿâ"âÐÖ“OõÁÖŒÝÁ©×fÖ7¬ÉkßU›YÁ·Ü‡ ¦Æwÿ˜7K]j×ÅûCV¾/Ú/€ëáÖ»ÏçÉåcV¾/Úµñ~Ñ|íwŸÏ‘¾V5kâý¡«_íÀ<:×yüùåcV¾/Úµñ~Ñ|íwŸÏ‘¾V5kâý¡«_íÀ<:×yüùåcV¾/Úµñ~Ñ|íwŸÏ‘¾V5kâý¡«_íÀ<:×yüùåcV¾/Úµñ~Ñ|íwŸÏ‘¾V5kâý¡«_íÀ<:×yüùåcV¾/Úµñ~Ñ|íwŸÏ‘¾V5kâý¡«_íÀ<:×yüùåcV¾/Úµñ~Ñ|íwŸÏ‘¾V5kâý¡«_íÀ<:×yüùåcV¾/Úµñ~Ñ|íwŸÏ‘¾V5kâý¡«_íÀ<:×yüùåcV¾/Úµñ~Ñ|íwŸÏ‘¾^sBˆ®e°R/»ïf, ýUšl×ÓÙjg 2Àß]B_‡õ4ÏD†…ë¨KãÐþ¦™è‰!Üc£/޼yõMÒœ3ã/޼yõMÒœ) p\ïxWÐ#np‰$ïxWÐ#npÔ·½>2ι筘¡B³(|Þ¡jz(P¶¡qBÚ†¡ÖÔ(P­B… [냬Å2n­ LR*1Hθ˜~ űÜ~ç/Ö"ÕÊi§œ¢¨TbxŒ~kSÄbó©µܲ¸Þµ¹\qFµ2´oÇv.€ôÐÓÍ)¥8yd•»•Iˆ¤ŸÐi22ýF9KZž# jxŒR-Zß¾nzâzvœ÷38èØO©uzM„˜ØÍ8FY¶²9qÒók^ÏÑ-*RSeøO„ˆ­s!Ò`‚µhƒ=¥¥aêmÇ=ã™MJÒûŽØòlY\ŒÕ–äƒ2¶kì!ÅzÔñkSÄc­øµväWú˜ÇíÏù#1í´0ÕI˜ V+ò›DÍLVëSŸ÷‘’Ù­£?ÔF†ø~i|b?¡Üg‰ñŽ“1åRšÍ£²Ùôj¤ÅGv\t’ÐÛl¨’¢Ì”Uf±weô–¶N–!St]'a\"ÅÚ“ 5W©żäÃJH”d•d%w]É‘”D[n5–µN¾™…º¢´l[ý=”®,­m¡T9H¤©qm R))FI"#±ä+l°üÑÓ á1éRƒ_‹5,FOL¤0äâcv2·d6N¤ÌÛR󧃺+Û`ä-jxŒ5©â1iµjiÄÜõcüçóÿ´f{:ÓKrŸ+EJ^¤á×#bˆOF€Ý}uqÚ×YI]Û"$™©&G¬WˆòÉpt¹NõhãXÎHuLµ@i-¶j<©,°Õ°¾•¨þÑñŽ&Ö§ˆÃZž#6,Í3úÄÇó9Ï9Ng³¡°¼¹3ú‹±Ü™¹!åWУ[Š5ÍÈj3¹ñšŒÿ¬ÆÛT Ž%Ãʬ㠄;¬Q®Ö2Ãçmh%_T´ Ïowc%'„ˆÒ{kSÄa­O‰¹jÕS3"9ç§|}¿é3Ùp½jxŒ5©â1£ÅYö•Û+€-ëSÄa­O‡gÚ6Êà zÔñkSÄaÅYö²¸ÞµŒí«5ÊæW²LûÂU¼üEzÄk ü;íz&'#'QTÅ\–†/­úG‚~"ýcó­ê?‚~"ýc*Ì–+­ê?‚~"ýaÖõÁ?~±•®·¨þ ø‹õ‡[ÔüEúÆTbºÞ£ø'â/ÖoQüñëPŠëzàŸˆ¿Xu½GðOÄ_¬e@+­ê?‚~"ýaÖõÁ?~±•®·¨þ ø‹õ‡[ÔüEúÆTbºÞ£ø'â/ÖoQüñëPŠëzàŸˆ¿Xu½GðOÄ_¬e@+­ê?‚~"ýaÖõÁ?~±•®·¨þ ø‹õ‡[ÔüEúÆTbºÞ£ø'â/ÖoQüñëPŠëzàŸˆ¿Xu½GðOÄ_¬e@+­ê?‚~"ýaÖõÁ?~±•®·¨þ ø‹õ‡[ÔüEúÆTbºÞ£ø'â/ÖoQüñëPŠëzàŸˆ¿Xu½GðOÄ_¬e@+­ê?‚~"ýaÖõÁ?~±•®·¨þ ø‹õ‡[ÔüEúÆTbºÞ£ø'â/ÖoQüñëPŠëzàŸˆ¿Xu½GðOÄ_¬e@+­ê?‚~"ýaÖõÁ?~±•®·¨þ ø‹õ‡[ÔüEúÆTbºÞ£ø'â/ÖoQüñëPŠëzàŸˆ¿Xu½GðOÄ_¬e@+­ê?‚~"ýaÖõÁ?~±•®·¨þ ø‹õ‡[ÔüEúÆTbºÞ£ø'â/ÖoQüñëPŠëzàŸˆ¿Xu½GðOÄ_¬e@+­ê?‚~"ýaÖõÁ?~±•®·¨þ ø‹õ‡[ÔüEúÆTbºÞ£ø'â/ÖoQüñëPŠëzàŸˆ¿Xu½GðOÄ_¬e@+­ê?‚~"ýaÖõÁ?~±•®·¨þ ø‹õ‡[ÔüEúÆTbºÞ£ø'â/ÖoQüñëPŠëzàŸˆ¿Xu½GðOÄ_¬e@+­ê?‚~"ýaÖõÁ?~±•®·¨þ ø‹õ‡[ÔüEúÆTbºÞ£ø'â/ÖoQüñëPŠëzàŸˆ¿Xu½GðOÄ_¬e@+­ê?‚~"ýaÖõÁ?~±•®·¨þ ø‹õ‡[ÔüEúÆTFñ ›Žüˆñ²8œ¹UGk¨‹¾b"'¸³à ?cÓ!¾º„¾=êiž‰ 7×P—Ç¡ýM3Ñ!C¸ÆF_xóêš7¥8g†F_xóêš7¥8Rà¹Þð¯ FÜáIÞð¯ FÜá©oz<|esÏ[1B…f(Pù½BÔôP¡mBâ…µ -C¬-¨P¡Z… ·×…(1YŠ dÝZ˜¤Tb‘q0Èá‡c}¯DÄäA°¿Ã±¾×¢br25>zÐó¤JÕé”úTèÔU8Ç!¶Ù'34’Zd¼ÈI_:žäÕî ø ŒÕª1Ó)ô©‡Q‡(ªqŽCm²Nfi$µ Éy’¾t-=É«ÜðÆF,€eBœü(”é.©µ"¡ä4I3ºRN¸Õ•³‡3J=—ØeôŒ\è7E87höR©OFéÊÛfm²×uú&Õs̃335Û‰Ï`=x¹–:1ƒ@w—`=x¹–:0ì£ÏW2ÇF$phòì£ÏW2ÇF€ôyà æXèÀphòì£ÏW2ÇF€ôyà æXèÀphòì£ÏW2ÇF€ôyà æXèÀphòì£ÏW2ÇF€ôyà æXèÀphòì£ÏW2ÇF€ôyà æXèÀphòì£ÏW2ÇF€ôyà æXèÀphòì£ÏW2ÇF€ôyà æXèÀphòì£ÏW2ÇF€ôyà æXèÀphòì£ÏW2ÇF€ôyà æXèÀphòì£ÏW2ÇF€ôyà æXèÀphòì£ÏW2ÇF€ôyà æXèÀphòì£ÏW2ÇF€ôyà æXèÀphòì£ÏW2ÇF9O”jvÒÅfJŽˆðã&96„‘\ã¶¥‹eÌÌÏg( „ü ˆ;ằ~o{¦)]ÄÃÕ¼zË'd}¾ôæÒ¹w<;Jñºå9ú=ju&J›[ð¤¹Å6fi5!F“23";\¸ˆDU<`ÙC§?X­A¤ÆSh~l–ã¶§ É$¥¨’FfDgkŸ‰0!Ѽxòñ¤ò˜iöW¬ÌÛˆ%$ìÚŒ®G³„€G€w—`=x¹–:0ì£ÏW2ÇFƒ@w—`=x¹–:0ì£ÏW2ÇFƒ@w—`=x¹–:0ì£ÏW2ÇFƒ@w—`=x¹–:0ì£ÏW2ÇFƒ@w—`=x¹–:0ì£ÏW2ÇFƒ@w—`=x¹–:1̽T¸^„t•CŠ˜ñΖ‡Wd¤k7ž,Ç”ˆ¯d¤¶p N½¥`¬Óêm8 ™¸i,ñº-u‚9 …¼Òϲ+¹8ppñë;r y¥Ÿd:ÎÁ†ÂÞigÙ ÐaÁÀ;ǬìÈl-æ–}ë;r y¥Ÿd7A‡îjUG•X«“agšD‡£)[ÎÒlã.©§cIp- +ð®W+õõ‚9 …¼Òϲ Ãƒ€ln¨†aGÒ"اÒéÔØí±‘,BŒ†î\p®d’+¨í´Ïoõu„¬Ú}M§ás"· %ž/÷DäÂ@wYØ#Ø[Í,û!Övä6óK>ÈÐaÁÀ;ǬìÈl-æ–}ë;r y¥Ÿd7A‡ï³°G!°·šYöG9uSC¥ÀÄ蔪%&”Ëip0a¡ašZUÖi"Ì{N×àïpæ'&l ¬YðŸ±é î,øOØôÈ@€o®¡/Cúšg¢CBõÔ%ñèSLôHDî1Ñ—Ç^<ú¦éNáÑ—Ç^<ú¦éN„¸.w¼+è·8D’w¼+è·8Gê[Þg\óÖÌP¡YŠ>oPµ=([P¸¡mC Pë j(V¡B†-õáAŠ Vbƒ7V…&)¤g\L28_áØßkÑ19l/ðìoµè˜œŒOž´<éÒ©Tƒ áF¤áÊ]MgKqDì§$¥I-Û+¹-S¨M¶_‚ûOo²ITJg¸Šd8äª$•F†Þu´o¥ù¦Ê,┥ft‘°Ìîj·ÁŸUªT#E>¥2[«ŒÛÏ©ie6"Ê‚3²JÉIX¸‹ˆ~Í«Ug1<ÚœÙ,ÃNH­¼ú––b+ Œì’²S°­À\B›Dê5ŠÎ®¹ˆäÊ–ˆ‰kq»(ÍJjA¼’Õ Ïi¶n™ ¶wvØ$8ÖUEú^%…¯”Â"jÊU{¤S¿L‚-ÈâTi±“À›¡J>ê×î©Y«ÕRÒj•YÓ‰¢³e&BÜÈ_«1‡ìêÝft& Î«Ï•Ÿzaé+[húgbþ Ú%8‚¯‰ßÂxj©Xv莛ñÚᶤ7*Id‘ØÒ–Ò’Û°’’ïÕ} §{õtW©W„Ù«Xµ«uÛ¾œÄVJ»Ä[6lš¬UÙ¥¹Jj©9º{‡uÅL…“J>3EìðyRåKÕn©/?©hškXá«" )¿K¼E°LFvu-|SCÿyÀhmAªz˜–˜ú&§ë‰H' AšNÊN¥¢¹q•ÈËúŒlýÙç?ÂbEð7dœÿ †ìóŸá1"ø ²?΄ÃvGùÏð˜ à,nÈÿ9þ Ùç?Â`/€±»#üçøL7dœÿ €¾ÆìóŸá0Ý‘þsü&ø ²?΄ÃvGùÏð˜ à,nÈÿ9þ Ùç?Â`/€±»#üçøL7dœÿ €¾ÆìóŸá0Ý‘þsü&ø ²?΄ÃvGùÏð˜ à,nÈÿ9þ Ùç?Â`/€±»#üçøL7dœÿ €¾ÆìóŸá0Ý‘þsü&øà>©ÿ±»#üçøL7dœÿ ‹ à,nÈÿ9þ Ùç?Â`/€±»#üçøL7dœÿ €¾ÆìóŸá0Ý‘þsü&ø ²?΄ÃvGùÏð˜ ã‹:¶>6`ýNßñß™»#üçøLq—V±’´¯Dw#£6eϾ¨jë‹þ¯ú×úL¡ªµR£$“B©I|ΉXxÐÄÛêÿI±+º›µŠèY´øÆ%¼MC‹U~;ÓÒN6¢JÉ(RˆŽÅr¹•Ëö r§k±J-mŠ}R:O152¼‚>;)Wýk!ob'(ØI4ü-Ar!XŒ©SX¦¾Ã茳cZjŒ§Ô†HŒ‰´(’Dµ¨²¶µ“1…U«"¯¤ºÞ÷CÕµOz£%Ƹ’¢C‡§}ÞÕl4¢ùHÖV“&£E:"cÓÓK4ä8EɃMïm^L¶¿zÂÆ·Gż;ÛHÞ›æÜ;Ø[ž÷½õy2ðþ B#FÅ®²Ì ;U™´ù)ÅÎÑäK}ˆnIS ¦¹(ÉdÖv ÂUŠèÙÜÓî’$ÔÉU‰Xº£ ü\ìF(R!Å(î15@–ÓK7<„dkSŠm:¬„JAì?r=Ð'`zD´Ø‰eí{DÅ?!!ÝV«9Y«î.[r÷<S*XmR5Vcù5›#Jv­æÜY¢éþ£  9ˆ(Ô5×£b·±¤¨gK8ÌêTÓõ·#¬Íyu™ÈÜ5‘’ȶe=¦{|F7ïn]Ëþ‰¹÷FéÕn5d×kuºËe¶}gw›‡7uôzúîÃÞ0ü=±Õñ’ÿþZ¿Œè캇úâÿ«þ„8êæäio²¬Í¸É­k\× Œu½oPâÕ_Žôô“¨’²J¢#±\®Derý‚g …é“"«¤Ü2p$”Z”:-RT•|¨y/À"%‘p¡IR¢ù*;XìeªãIMT1~!¥D[U&(”X¯Æ^C\7•:sN³©(<„³Y””*䓸؋ĘUs˜© *KM­¦Þ8Ë5¡ 4š’JËr#4 Ì»ùSÄBÊk8-2¦ÊJa”‰èJ&:P<„¤Œ’—-ÖDFdDw±ñˆ(˜ƒÀ¢bêRgG:b#J„ur‚¹Íf´ª2Ñ K"JÍ)$(’•š—b%å2<|ÙU¼]?Ô¥WjzAâY•NŠÔs]9I§Ë±,Ýiy2.pi{¹#î&t·ôuKe,Ó)ô˜-%â”G¦êÒN‘È’‚î¬fWáÚbº¬ÝÕš}ª¬:döäš ôɧkIÓEò‰H<Ùnv¿ö—Ž]ê±ÿk!ý¿á²:®ì=ãÁsÙåÕE.<üC\G5Œ¯Y•YL¯d4G°öðšz’Ó .€b±gÀ~ǦB'¸³à ?cÓ!¾º„¾=êiž‰ 7×P—Ç¡ýM3Ñ!C¸ÆF_xóêš7¥8g†F_xóêš7¥8Rà¹Þð¯ FÜáIÞð¯ FÜá©oz<|esÏ[1B…f(Pù½BÔôP¡mBâ…µ -C¬-¨P¡Z… ·×…(1YŠ dÝZ˜¤Tb‘q0Èá‡c}¯DÄäA°¿Ã±¾×¢br25>zÐó¤ìj•Tz”õYªlÇ)Ì/Vì´°£eµlîT»e#Ͼ\cÆ$>.+?[Óÿƒ0c(1:³*!;;;¥š;NâKjˆ”ddžäº22.àž£ÄkŠè‘›ÂÎÕÓL¤Ó^b{1‰ºuY3âCªºÈpТ6¸n’<ÇbØ=ž•Cf…R~›Feømj÷¾« iº³ºÒ_éMšÏVjFn&ʱm#¸ð ΰû-²ã¬¸ÚF±¥)&Dâss$ûå™*+—|Œ»Âؙ⊔"ÂX^1áúb]D™&äcfS$¤Í%­És25Òeu¬V"Ä`¨ÐæT¦F› ¹(:\ç5-i6œn3Ž¡iÊ¢¹’Ee\ŒŒöp3Ë#947p Bb¡¶S#U"´‰$¥æ6ÝjA©Y²Úí$Èòßií2±w½…iÕxÓ„ÙÔɃD•"[ùÚSÑÛqDÅÖdDYög%í¿zĹàA‡¢l°u¶ˆÛ¡”¾Î¹£F±µ{•¦åµ'c±–ÉԚ~fk³à³Y}i4ÖóŽ!¤“3¬Éµ%Fg¬M»¢"²¸{×ñêr°S4ÚT‡Xv˜j8H~Ê2)²Ä“†G”¶*Ê2;Ó½Œ7@¹!‡ã¸MÈeÆVhK„•¤Òf•$”•XûÆ“##ï‘‘‰Ž+¢Fo ;WM2“My‰ìÆ&éÕdÌKˆqªë"uÃBˆÚáºHó‹`öb•C¯bê=š. ÓãRZLÆ× ÖÙ9‚"²4eI(‹job+™ÌÛ†¾Štµ)§C‘2S—ÈË ‹UˆÌì’#3±ŸÐBqR¡R× Ù@ SšŽÃŽÅ”Ö#aùÔIqò‰f²,¶Bew®B?£OŒ|3õ¼Oã$7f3>W4*Þí¦Ã¢"؈ü˜ÒÓ!Å:½KjpÉÒR™(Qw)MŒË½°dèÐh“XÃÕ5aø%Ne¹X=t‹¸¦S™Fg­îLФrå#ZŒ¶–Àš° 2S¦=Nv¢Ì†ãK\ÃJ)´³KlšnK'gr#îr™™÷î1¢À1X³à ?cÓ!ÜYðŸ±éß]B_‡õ4ÏD†…ë¨KãÐþ¦™è‰!Üc£/޼yõMÒœ3ã/޼yõMÒœ) p\ïxWÐ#np‰$ïxWÐ#npÔ·½>2ι筘¡B³(|Þ¡jz(P¶¡qBÚ†¡ÖÔ(P­B… [냬Å2n­ LR*1Hθ˜dp¿Ã±¾×¢br Ø_áØßkÑ19Ÿ=hyÒÎQq tê,ŠKô ]I‰Q!j”©¬ÈJ’‚#mÔˆœ_{nc½ìVô«¾Ö÷¦F¥S™„ä‡ –Içö½´6é/ZâÌÈЂMˆËaŸ|F€FØ Ø2(RèÌaú<(Ò^ió8äöt8Þr%–âŒîKQYW"#ØD{EÊæ/™Ujy®›L‹&¤e»åGmirM–KîˆÖiMÖ”¨ò%72° °3mâ' ŠÕ5êU2JØaÈñå<ÚÔë-­JY’K6KæZÌ”i5žÃ+¼4J”ŠEMª„RmN6JI¥ÄæBÒ¤šT•|*2?ÔcĈ Ø äPeQ¡ÒaÃóR ,%ìÍ:‚QgJ”á™Ý+RL•˜ˆ¸hÎb¬O =J÷3B­*%:,N8ï’˜[L¡ ,«È•÷hR‹:VQºP0¶bˆ$GnC3aÄ«Gö½Æ¦ç2Ö÷ÖJB’²3¾Û*Dz÷±t¼g=ù”©i§S#¹MŽäFɦTHr:Íwii5lâÓr"Q’Žægc¶‚v'LŠº3~ 4—š|Î9=7œ‰D¥¸£;’ÔVUȈöÑL¬Q!øM7½´ææ¶Ó •A(^èÈÉ$›"3Q¥&D„–d¤ŒÈ¬g´ïÛ@þ)yq¤¦="•T¶ÔÜ™‘ÚY:âUÖhFnÈ”ì3.°Çẫ”:ô*Ã1cÉzÉy¦ßÍ“:v¤Ï*’{ÇkÚå¶år2ι筘¡B³(|Þ¡jz(P¶¡qBÚ†¡ÖÔ(P­B… [냬Å2n­ LR*1Hθ˜dp¿Ã±¾×¢cfÒ0æ!«ÆTšM©Pa+4)رu$¢"3IšHÊö2;~²Ë ü;íz&76‡n­µ&­˜„Õ (ž’—T“=TÎäµHYßmö•¶Þ ãêç/ÌèràJ\YÑ_Šú=ÓO6hZ~’=¤? Å~tæ!EoY"C‰i¤\‹2”v"¹ì-§ßªcôzž$ÁøjCÝp°‰ûžKï­¥M¾´$›AÝ.eGt¢3·t³Ùn&“†*¸–‹EV’EY†Tú¦HÎã 3mIYȳ]IQ)9H±‘™.ïØB€HiSiØeºÜÚcUG¥Lr+,¾ëˆi²m ©jV­IQ™ëREÝ•ÃÞÌÒ©T×¢¼ý,ݦԨRç¦9¾²\e´ÛçÜ,Œ®yã³’‹*¶‘žÑ3V.Wæ<¦£7imÇL®EÜ¡µÞ$¤Ïú…*aôÆD•2á0âÔÚ4žU)$“RHø È”“2ïf.2Ú$Œ?Z}P‹ BˆãtÚ‹«u¹r™HŒ§ZY%N”•4wÚiQ,û„b¢©B£;oaúdÕNz ÇÜJ#ÕÅ<ýé+ÙD\²²ùMÂ}FƒD𯩫Á*s-È*Áë¤]Å2œÊ3=orf… Ó—)Ôe´¶œÆéS¨³!¸Ò×0ÒŠcm,ÒÛ&›’ÉÅ܈ûœ¦f}û„U‘!‡:šÚ®Ñ˜ªÄ«- ?›*]D¢Ê£IÞÍp‘÷Ç7£z#ø¼¦küe‹ Ú¨çŽSå?ÿÄZ‘Ô·¨I)ÊÒI<{«gðF÷Ñ”Š¾ïÅôнvmoz+h‹LƘCº¥@†þUjme¼å-ìdG{ $ÿP?ÿò#˜;Yãøý¯,.„Et¡ŠnÂ5Ê»UÔÊ•Jn:ÖÃok,o<”$•ú4Ûa¨øo°¶XÈÆÊÄ:IÇ´Ý(±¢h·wnÌÎé`ÑqÒdJyjÔ¯&d’Ó´ÈÔ’,ÙÐjòi—ý‰Òÿt"Rå`@1X³à ?cÓ!ÜYðŸ±éß]B_‡õ4ÏD†…ë¨KãÐþ¦™è‰!Üc£/޼yõMÒœ3ã/޼yõMÒœ) p\ïxWÐ#np‰$ïxWÐ#npÔ·½>2ι筘¡B³(|Þ¡jz(P¶¡qBÚ†¡ÖÔ(P­B… [냬Å2n­ LR*1Hθ˜dp¿Ã±¾×¢cfƬ›be{¡­¤·!RTnk¦ÉD’M–H±Ü-©?v|I¶²ÂÿÆû^‰‰ÈÈÕFkZ 7Ur‡^…Xf,y/By/4Ûù²gNÔ™åROaØí{\¶Ü®Gè¦WSMÅqq*==¥Ey3ï)„­$YOk†³²ˆ•c]¯ú¶ 86ÌÀ¯œTÉŽºE:U=÷ò„þ´Ûe{lhQ,œ+ÛÝÈŠ÷±D,Y%Šâê¯S)Òï ÈMÆq.!–YZ ³J µ¤Ë¸RÊægîŒýÖÑÄ Å ºšEfMEš==ô¾Ëì”gíSHu&…r¸K÷ RHÔ£;øle]9O¦¢´ªeA¶Ÿ\ˆç1µ¯RâÒ„¨È‰D•\›FÅ’‹¹àá@ @”ËŸ “ƒ£RkG=Ue0üÔ¥…¶Qò"ú£Ì]Ñëw4ÜŒ›I÷ìX-ßÿbo^â…þ³º7V«ôþç.¯=ýÇ~ÖáÚ<`>èâò™ý¯ñ–>r ‡MšM ¨pñ"Ya¤åBOb.oiþ¾ø‘Úø/¿†«5Zšñ† ¬ªªé?)™íÃ&Ôñ6ÓDéjc¶¢Q6Âb<¶¹šMGqìǵZ}†©•)HŒÎbA)W3RŒËam3ØgbïŸ#ìï¥nU~ïчg}+r«÷|nŒ@鮿ð—¿åÝöFºÒ…B%SGZMŸítww«"òšogG°È„Œj®ÎúVåWîøÝÆâ,éP¤Pë•ý×O“—\Îãa²¨–žé(#.é${¼"# ÊÈ+|'ìzd B{‹>“ö=2 ë¨KãÐþ¦™èУ}u |zÔÓ=$;Œ`teñ×>©£zS†x`teñ×>©£zS…!. ï úmÎ$ï úmÎú–÷£ÇÆY×<õ³(Vb…›Ô-OE Ô.([PÂÔ:ÂÚ… ¨P¡‹}xPbƒ˜ ÆMÕ¡IŠEF)× Žøv7ÚôLND ü;íz&'##Sç­:@¬YðŸ±é î,øOØôÈ@€o®¡/Cúšg¢CBõÔ%ñèSLôHDî1Ñ—Ç^<ú¦éNáÑ—Ç^<ú¦éN„¸.w¼+è·8D’w¼+è·8Gê[Þg\óÖÌP¡YŠ>oPµ=([P¸¡mC Pë j(V¡B†-õáAŠ Vbƒ7V…&)¤g\L28_áØßkÑ19l/ðìoµè˜œŒOž´<éºK‘Z«3LжóÙ²©Ã2IY&£½ˆÏ€¸†Áì¤?«ÉßèÄ[E¿íÝ;û_á,N°Õ)jŠ™~QÄŠË+~L^}ShMÌòÜ®fvIÊæ¢!ÚÍŸÔÏË Ø'H~+W“¿Ñ‡`!ø­^NÿF=ôªV¨Ú\ƒÝBžÔ‘šÒ’Í‘K?te°’“3>— •ÈY«SeÒ䥉dÎe –…2úB“s+’Ðf“ÚF[¼'ƒŒãr¼\õÚóv ÒŠÕäïôaØ'H~+W“¿ÑŠ@Oÿ·ø8ÏýÊ®Á:CñZ¼þŒbŸÑn!aå°üªkN¶£Bз%%Dv224l21ÐÔŒgMÀº ¤â ÍAÈcCYåBì§Vo9•+íQðí±˜á~ÇéDNrífÿêÌÆÇØÊ¹áô®y~ÀÃãœ#YÁµ6)Õ¶’ԇ㔄$³ä5­IDFGt+a—÷ÇEâ-(ÀÒGSN-­Ñ§Ii{Ñ!™Öù›‘Öm™n™Øø é"ƒõk|kÀú™¿ã¾<ñ/CF€”‹>“ö=2!=ÅŸIû™ õÔ%ñèSLôHhQ¾º„¾=êiž‰’Æ0:2øëÇŸTѽ)Ã<0:2øëÇŸTѽ)—Î÷…}6ç’N÷…}6çýK{Ñãã,ëžzÙŠ+1B‡Íê§¢… j-¨ajamB… Ô(Pž¼(1AŠÌPc&êФÅ"£Œë‰†G ü;íz&'" …þö½{áv«x^©Sb¢´O‚êˆg/’›qÎåÌ×%YtòåÛd‘™ìÇÕN*^ ü†ÕŠq ÖPXZ—d›yɼëJÜÜ®fµ%6¿~ýãø”©•:‹ÑhP§ÔÉ&£A5ÍÓAÅ)5eÙk•Ì‹ŒÇŸ0<=ŒÒªH“šlLjڒÚQ©”'Ý)dEt‘\®gÀ?j”zµ(š:¥.tx³5ºc©¼åÆYˆ¯ýA‘â&§a…O?CN«G“ž¹/0ô5ÉZ#ë &‚±’Vå’“=¶q&v<[´ ëUTÒ]¢Ô›¨-9“QVO(¸É¹—õèÐôÑ+*«•4ŠÔŽö†Q—®;ϸ¶n3àà!î¥ázãÒiîÉõç Êy)J£BY©äØÔ¢h̬¥dJŒ¾ƒ>0Ì | -f ÂIŸ-—Üèq˜ËZTî\ÙȬj˶Ü6Ú<óaLƒ1p¦Ä‘J ‰L¼Ù¡i3ïOi Ȱ,þÄŒ”þ«4IaRk„âlÒm™Ã¹{’¹]\rá*3ø‹ÓhqÍÄ®l”2kCFá¶“>éyK„’›¨ö–Â=¤#1ÔbÀgS†+q$ºÝ[WXJ"= ÒP–•¥)IÙÃ%ÆÉfŒÊïŸ~ÃËWæ²Ãðèu9-HJÖÊÚˆµ¥Ä ì³I‘m$™‘—ð†`c{¥U§7R~›1¨N+#rV‰¥+ˆ”ec=‡³õ áÑk`;>&|˜ŒßZûQÖ¶ÑnÊ"±XdxH 6‹Ûºwö¿ÂXØ´@TJ$Æ`²ÒçÍu yRb4ûDÂ{¬„— DfkÊgrÙ«Miu¢ßöîý¯ð–;kö5ø¿᪎ ¦nŠþ¼£>ŠSÃFÑ´›:£±§2Þm ±Ô¢#¶ÁÞÍØ·œÆrázÔ׌Kž§â¨µ TÅKaiªJ¥&žâ™ŽÛl«W%—VTØ“fÛ4X“ü”q¼3ñg¤yª S{-;b3-q¸”ª×">;\t›'£W´–îkR×Rfšºƒ•)΂JÚI´jáÖYö—l¶Ê²;í°öÓãh†¡¡:\JjT©ï°ˆ«n)$ŒÔn¨¶ ˆˆÌóZÄF;ƪˆõ8Κ¹õ¹¿}ðœ:QÀŠÍZ{OUâÎ}¹HCi6[K¤¦®•¨ÍG¬¶m—â+mÈÌ®³W§7CÂѦ?U]M‰‘ŠæÇ~„¢StU\“*5 ©¿ Y%7 ˜Ï)…mزI¤öÇbÈØ>‡\¦Ñ!豚ôú„i2Õ:êÚaL¥jQÈq¢÷R""3>!M=“ÃUÝ¡16!†Ö6i0VäîeÀ$¬”û„zçJîT“Qå$™ØÛJJåÂ0Æ¡M©TYzšÁ¡(`ó§¸Ú÷3(ÍÍSfhFÃIXŒï–ü&:‘Èš.ŠôuŠ.£U&¡ƒn›9¸h’KxÍ-·”ŒÉJ5%i,†¢R¢IªÃßBÂØ2¥CQëS ¯uFmüУ3":³$•vÝÕ§X½Êò–b±Ø¯a1ª¦=H5SëqÚë'rFæÖ}ë'rFæÖ}‘n6žÊðuwq(ß2»‰âàšj^ªµhÍÄ2L´T 2‡LÜYžTºúWb½®¤–Ò;\¬g¸ºÉÁœ‘ yµŸdG °Ìh)–Ùa©2ÐÛm¤’”$¥¼D’"ØDE²ÃÍ©¿b"!Þʼn·33-M¦jÞ.™¢lUnŽjtèë¥HÖJr¯MZZ"AžcJdƒ$f}â3Ø Zßð>¦oøïçï‰LaõKþ‰=Õ­ñ¯êfÿŽøóRôËF€²ŠÅŸIû™žâÏ€$ýL„úêøô?©¦z$4(ß]B_‡õ4ÏD„Iã|uãϪhÞ”áž|uãϪhÞ”áHK‚ç{¾s„I'{¾s„~¥½èññ–uÏ=lÅ ˜¡Cæõ SÑB…µ ŠÔ0µ°¶¡B…j(bß^ Åf(1“uhRb‘QŠFuÄÃ#…þö½§ ¦­ G•JäòR˜•Ê{©’–ŒÐ…!¹;MV¶Ãq²?÷Ò_Ê+él/ðìoµè˜œŒ}Tf¥á³pÔÊdœy…éØU‡”ÜÊÌj”æÑÝ¥%dz’ãm¤ë›‰FgîF 2¯3¹D¥B–ºœz£ª¨ÁmµkÍ$„%»·îŒ¢xgrjÛkˆx6Ñ´(lÕ]Ætö¢5&Urš™ŠŽ“uÄ=¨’MšoÝVÃïY<;jj”Öf*<§¢³Y†­vE)3jA8y¸ j™#ýjEøHE6•*Ÿ>&‘؇.˜òdabe–hз:9´I"=¦zÂ4[å— U.‡[‡E¬PÊñë²Ê3¨‰Á!ÈÄn“ä÷YZ¥d2Ìd›ÚÛD(m3 è7‰ôIõV#Uõ®0i5:ÄRq¥%+.å4¾»NûÆ'·ˆËJ”J]Eª¢e*µT¨!d¼ÉY/X´Û’ G˜ËbLÏ€B@6‰•:nŒ±1î)ñÛMZyfl­$œˆ’KBÎÛ,µ4FGÀjI ³MK…3Ï©4ôU?Cˆ²¤¤Ð~²QGVelîsÇQy&ƒà°Öâì7Õ[2P†œS.%ÂC­’У#½”“Ø¢ã#Øa4‰Í6“‰iX3a‰ã¿•Rn“ye2?é“Ú¢"3#Qlî‹nÑÑÛ­±¤ 8ûÎ%¶›ªÅZÖ£±$‰Ô™™Ÿ¦£ˆŽDá£Ó)MÉ˺N"\Ìñæ$™¸µeNb#²lW"â!„8œ‰Ö Âx–!q©49í¼õ"§‘“dÍÓ-Èâò{¢#[ˆI•”j±\ÅË^FŒ°ú¡D¨rkÒ•4Òì뺸Ék)‘mQ©.’mÂiQˆ`'#hâXU©“Ji\)î6³-J-¤¦²¦ÏƒajIj#ù£-—DaºŠh3i4,E-áGBeÁ«6Ìx®¥%­5‘°­Oé3¨ÍJÛ|ÜCV‰J&“òŲi´zc´Â–…9 ¬µCA¼­Y2£Ê¬ª÷&yv‘È„\Z#H“h·ý»§kü%ŽãÒ& bÈâVÕ8°ýNæ!IÏK’ 9iIÍI8ëYˆÛ+™\¯Ãš-ÿnéßÚÿ cè=_Ðiއj5Ç©ÖõÛÜÊ›Y“Ú’I¹ÝeM‰i÷FW½Šæ\Ô4g]'ŽÍH¤Í©aÌA¡ZÈLÞ|×!j•«%)II!•%$Y²¥”‘í#Âø£бÅÁ%‡N¨PcC9QvÈy(Õ%ÚÍ)i½Z’“pЦWr’¸ÚIÅ4cCÁ©¨%UÒ€uŠM¬í–”ÍvÊG™I,·Í´ŽÖÚ3 !u.ùcú<Ê;;×Oc Ôi«— -%Q–·arJFG”›|Ót)%c#.êÇ­`)U\e†U«b ”m"¦ÌŠ›u3§ÉSÏ? M!gØÌœºV$åýM]ÕŒö0ÃL®î|qKÃ;—6ï¦Ìº5–Õîwb£&[mͺo{•²pö…†OÒ…J´pÔ¸iÔÚd)¾o¼fÓÓTê kQ¸gg3Rº3#¹™½š'¥Ï¡è³ Q*Œnyôú$(²šÎ•jÝm„%iºLÈì¢2¹—“^ô¿ýdßýãâx4­cWk9“ÙÒ-rse“0âîrm´”—HíxËQÝYjŒö÷ŠÄU©0óiûâS}Rÿ¢cOuk|kÀú™¿ã¾'úGÀ®ÀÀ5é¸J8®m!š{Ë™ÔódƒÌ„‘Å"Ì|´¶™m.êÖø×õ3Ç|)%£@J‰C©VTá@m“KF’[Ém†Òj¾R5¸¤¦çc±^çcâè†4¢§ M6¥*5­T¨¯-—‘˜••i3JŠår;ÒØ<à:Óõ£ÒdT¦O^¥„æQ!‡J3;éxLÌ‹m‹nÓ"”áÊÀ&:hÃ0–’ª˜z™›rÄKs™™©†Ö£ÚfvÌ£Ùs°‡ @Ðä)-ÓY¨­«E}çmy‹º[d…,­ÂV'·ƒnÎpÓz!ÐfƘ"jB÷3ÊBáYÅæV© 5lpˆ®jà°—v°a? ü'z`l²{X0Ÿ†þ½0v°a? ü'z`l²{X0Ÿ†þ½0v°a? ü'z`l®åu9à¸Î›nͲ¿òžéG–^€° HJ‘QÈË-©Ç¨|ì’+™Ø¿ÊpäàNXZ…kÔhô2t£O£³<õ—½ÜqËl5*ÝÊRV¹í#üJ¬YðŸ±é î,øOØôÈ@€o®¡/Cúšg¢CBõÔ%ñèSLôHDî1Ñ—Ç^<ú¦éNáÑ—Ç^<ú¦éN„¸.w¼+è·8D’w¼+è·8Gê[Þg\óÖÌP¡YŠ>oPµ=([P¸¡mC Pë j(V¡B†-õáAŠ Vbƒ7V…&)¤g\L28_áØßkÑ19l/ðìoµè˜œŒOž´<é›E¿íÝ;û_á,v¶”ð¬ÜOèíÄK±ÖÆ©ª-CVfÜI¥*šìe)DV#ÌÊ/ ’…—Çhòl*v1§Ë¨ILX¨RÉÇ”…(JB’Fd’5\Ë€ŒvwlFŠyIÿ#'¢Œ™ƒñ”ZÔŠ‹DƒÅul3ˆVô膳k«§¦#)uI+PÊI9ˆŒõkU‹m°ÕJ wð®0k`ºÝ Ø¥|G©G\Ú‚ÛNç$¡I#}ä‘>Ju$¬ÚÄ–ew¥±)å'üŒžˆ;b4SÊOù= q z_ÎŽ©;ÒýGUÚ\˜è4!ÉéTBˆ·œàS×[æKQæ2Îw;£tjU2>.Tü£œAOmœUbKOC~œR¦)Èf†u¦I=z²,ô™š¸IjÈydݱ)å'üŒžˆ;b4SÊOù=v²+8²e èi£Ðê¸vRe½OÂr¨­·5Æ6£}Åk_Fg—2¢öQ‘®Ç’¡…ÖqBzüÄ̲‰ªŒTÈ hîÞ©µYùâ'ÞNbÿûm³úÆ¿§×i)5 I'rÈ"K¥£¬ÈŒŽÄãHJÈŽÖ2#+•ÈîFd=4ù¡ú|ð!W[3Ie–[$’ÚVJHµ[ˆˆ€mð›¶#E<¤ÿ‘“ÑlFŠyIÿ#'¢¶F¦ÆÐ1K N…«‡D¬n©ª‹(ØmÔf)o÷+JÒ¢Ê|dW.â7lFŠyIÿ#'¢ú»Žô_S©¿13c[N8·D%–³­KQ'<%(î¥(û¥íµìDE——ӱ̦¬X½!WÊ­[‘J}džm¸¥ìÚM´'1ñ™ßnÂØW8V·Æ¼©›þ;âCY¬è–±I—J©éÃJ…-•2û+ŒÕ–…Œ¿Ô8¸„ªaüi¤ul7?vÄn˜†æ¥Æìá:ê6ZHø¶¶ÑU }«*+Ha¨+#«B/ÓÁeãîÙ•}«AŸò Çü›ªÖÌ«ÄR~¥‹*ŒÆã8R—¬y.ÁeÕ²šIDµ Ô“"R¬de—2Œ¬fbjŒÂYuâ£R°œ–(T ;M7$œšcN&A"Sí¤–Yxr¶Dk+-]õ±.kt9ÊTZ-6lg¡Å}ý|D8ì¥<ÚV¢' ³¢Æ£Ad4Û/Ƨ_©TiPé’÷£BA7$[q ,Ç—X”Ì®¥(ÈÌî£5Ïh½NÅ5Ê|6¢Å–Ù!›“ \f–ë;þÅ$ÖÞÓ3îL¶Åv‰Û›ѱLx°éÓUMÄ,Ƈ&L6žRRi”J;©'˜Œ™Gr«¤iÑꚸ+²h¨¢ÒØ‹&€uêâ§X™NÝY»fBI{2’mÞ–kU¨Rhˆ\s…)ä¾ñ*3jqKO¹2pÓœ­s-Š/t¯”«ûúò¯oÎûë)û¯qî,Û×&§.L¹5y}Çq{_/s|»m”£à:!ß”ª¬ÊSÍF¹OI.e:“P—&›‘¸Þµi+wö‘ 5vUOG¥RÞzåVµŸÔ«¾3/ý.&§Vâ3™ä'5ʺdwd–Ñ3Ñ^æsGö$j–…¥ä­µØÉDn®äd|$d=8gá,9ºw®ée1ÜÝ3“fS|¬§Zµdh³›M’Wà,+ü7¤:m=z­W‡T È›%U ÎJ2}‡£!. Ög«' Bî„Ù£+$¶È•ÌI‰×CĵéT‰T¼/kª¡Îz39õÈCΤîJq¶Î:r¡Ë¦ÎwI3Ü'„°¶u稱ÔËŽ¶†MoMvBÒ.iiêÕ«l®vBl’â)Ú=Àó)4ªSÔóLJTÓ⡚ƒíE$¥:…© %:Ý›¡ÃQ¶‘€†Ð¥Tô‚tÝø®Uh¹0]6°[ß1q?Òå뵎/!–roP›!WGvwIìGY•íaºåA‰•LYrI±Ž2•¨­ÞÚf<Ø›á,G¹·Ò+s²¨èÜÓvUl̯T´çhìWmWNÎ!eQYe ²¦[m $¡ 2"IÂ".ñÖzX^0f6Fn’ýiœ®5¤ÚÍ© $íl”•£"Ïe”fi¹XìG™:âGHU T*úBI¥Ë•¨\XãºÛ¬7¬N׳¸«-[!H»®èÍ)ÙX‹)ŠÔ–ØŽZ[Q']ž£mfDWÊfer½ÊüÞ¹XÄ_UgV°Ìºd\)‰óÙ2©Êr‰%e¥G{Ÿq ,箩ÿê÷±$¯d¤‹ò\Öèr)”¨´ZlØÏCŠûúøˆqÙJy´­DNgEF‚Èi¶^;Œ%Öhñ·=>KM œ7PkŒÛŠiÃ"#[jZLÛU‰;Rd{ ˆ…tìS\§Ãj,Ym’¹0µÆin±s¿èÜRMmí3>äËiÜShóbˆ,S1-R›Ãuˆ“aµ™ß2P³Iõ‘ p™™™™™žÓ3xåÔµñMýä¡~‹ãé*<7ˆ1P ›r½:¤ä˜ÖSJÕ²HQêÛXm¯+II% Vb,è¿›©uÆÑ¢xd¥¥'tl3·ýÃBG„ty„0¤–^¡;YŒ–V㈎¼G9èæ¥æÎjeÇÔÚŒÍFw4žÓ¿Ð÷G:C¦bÍ5ÓçDÇåF«Òªh‰Ebª•¥”2ô=Î¥°JÙ!hÝNí,äƒ4žÆÔ&‰ºÝcáü+]¨»4¦êÓ:4Ç¢©ä0û(ˆÙº“K„­L‚ZÉ&DklítìW Òž®E­¸–Õ>$g¢°î´û†žSJq6½Žêa£¹•Ë.Ë\`¼%6˜Ý=Ø«m¦¦ÈžÓ‘ç¼ÃÍ>ûŽ8òÐëkK‰Î§\¹ˆ¬«ZÄD A•SÄë¸b«\ª¦ïî¾TI‹‹"nàšˆ¬fu£Jû¤,Ü<¦Y;v\„ãDÓæÔ0C+¨Krcñ¦Î‚R\±­ôG–ó ¸£.) ¥F}ó;‹• „¦ÐéÔeÃ(ñ)–Ü;Žc±]ÜšO#­-.&äfGewW;ÜfhðétzTj]1¨ñaElše–̉(Ipÿï¾'¤TÖÕ aaÇiíUµ&q=¥®9¬”ge’•Xø.G²÷²­”õ&«i^¹ƒñ,í#Q¨”6‹&Ÿ)šŒf[\’y¦ßRŠÍ6²<Æ”Øö™jÕ|·,Þ8XpÞŠRäÖitøÎ¸¦ã9%N–èÊv3A% Q&ÿÊQ$»Ü$vnƒ!„§É‘WŒôÈŸ¤¶—¤"CŠ,ÍÒƒZ”šTEÃu‹)(^sJ]VDZΪ¡椬Ù7T´!RPÙäÌÚr8•ÉV<Žl½ÎѺ`™A[Ž™-üCDŒÕM‚v)º·ˆÔyÔ… È›3I¥I25‘Ä£˜vk³çÅ”ìzziË4LzJŒ›eD¬¹O)(ÔfddD’3;ð˜Ð0à3µÌ4å*‰°ujdÈÓ$-˜Ån)NdJMk²YHi+*ʹìM¶ŒDäH÷P)r+Ufi‘VÒ{6U8fI+$Ôw±ðØ=‚t‡âµy;ý‹h·ý»§kü%ŽôÒV0{³Duš+Õmñ©GeÌ®4Òc?!ÇRœ§¬RQVl¬j3±öq§`!ø­^NÿF‚t‡âµy;ýíG±tâ*E=¥GvŸR£L«¦¢R›CL.*Hø,iQJÍšåbG~÷/%;IX2|wä3Tyd™Z·D )M¼á6Û¨Kˆ#[FµkF‚á3"Ú»éÅjòwú1ø­é%uSEúØ£Å+Pã-Ä;QlÖÕAšk‰AÔ‰.’ ™$ŒÈÌœAñÌȈÌzëi€á‘™™} p`ÜâïÁ£z–†qÅ>™2£*$w$º¥!Ô‘!´ÕµH"½’}ý¼£ñ¶š0. ®ª‰‰ñ$ªlô¶—IµÁ”¢RÀ¤©-šT[ ®“;p‘‘yqÍEʃX‘Ýl£Ž¼ 1æ›…¶¤g½îÚÈ”…nFDeb#-‚"S‡u—"µVf™m!ç³eS†d’²MG{Ÿq“h·ý»§kü%‹!)ì¤?«ÉßèðNüV¯'£—¤¬`öfˆë4WªÛãR8Ž6Ë™\i¤Æ~CŽ¥9OX¤¢:¬ÙXÔgb;ì?Kغq"žÒ£»O©Q¦UÓQ)M¡¦$|4¨¥fÍr±#¿{q_`!ø­^NÿF‚t‡âµy;ýìšv’°døïÈf¨òÉ2µnˆR›yÂm·P—F¶j"Ö$ÂfE´f%bJe¸‡j-šÚ¨3Mq(#Z‘%ÒA¡³$‘™“ˆ>"#¹™€áîÁ:CñZ¼þŒ;éÅjòwú1Þà‚;éÅjòwú0ì¤?«ÉßèÇ{€ì¤?«ÉßèðNüV¯'£î8ô¤;8Èÿ[ôaØ7ø»ð_èÇjc›µÊ5H&Úmn,˜mn-D”‘Ù(A–|IIŸ˜ÖX'MWSDÃ’UJz›S¦Ú ÊI% áR”¦É)-¤WQ•ÌȸLˆë”¹Û–p,jyUñf ŒÔ­cqŠœ”Ø›$\²¨ÒdVZm²Ü}÷Vë®*¨µ­j5)J7Û333á3>øÒÂÈmÙ{Åuú2Ä/›K4)²©ÊRÊÄ“3²o³º-¢GÖVŸùGŠ<¶w²%½C~ûTÿuïÿn7¢f‘kXF]1P“ JbÁšofD×J+\nÖ,‹J$$É7<Ä•™{“"Ëýeiÿ”x£Ëg{!ÖVŸùGŠ<¶w²:~6‘(­ÐÓR«%ø‹v­P¦Ç‹‡f>ùÄ”ó Z[e³#&s’d’UŒÏ„ò1ñÆ‘ Ù­VãœVi¥Tqó%%´Å3Yk3[a¶¢4û¤ÛiÊáÉýeiÿ”x£Ëg{ x+OäWŸXÅè­æŸÓ6;u‡Pëj¤Ñ¬¤(Œ»ß!ìy€9 †<ÒDz6‡pî ï®ñP©”­~§]¸¢6γ.|¹²^×;_‚æ) |ùï úmÎ$ï úmÎú–÷£ÇÆY×<õ³(Vb…›Ô-OE Ô.([PÂÔ:ÂÚ… ¨P¡‹}xPbƒ˜ ÆMÕ¡IŠEF)× Žøv7ÚôLmŠ zC”ä¾XTZÃRd§›tÙSYS”Ò¦¥¥d¬÷¹XÈÓÁc¾§ÂÿÆû^‰‰ÈÇÕFk^—+ÔDZlWäÔMûR$À—SS*-{βûdêŠÙ̈BL̳"ö¹ØY¡u»K9‘Û­ÒŸœ¶ÚS3æSz#v5ë$-µ(ÌËVdµ7ÞQX¶Ãy¶ºÅÌeªN×é¦Õ/!OqŠ{‘Ðѵ)Ç»–ÛhŠÊJÈ“”®gsQ&æb)‡äCÃøî•5s™ŸøòüT¹•iJÒµe'•\¬e´‹iqm §%[ƒM‚–S¶ÅQÅæ7 †B-™v¸”™™í¹e±X¶öd:sø‹~¡·-5I.¾ÊÛzì6êBV£&Í&E©Q™$ÔvRlFw"€œ í^uM{H2Ú¯C6ªˆZ ²ÿúA®[R2—èû“$¶i<ÙK1•ŒÓu:B¨· T¦×OScÇ•㸷U©m-‘´iI ó% >éI±™÷¶ˆ˜Šp%õ:´®ÄóŸ4ú•q™íÁ4:k4HÍe2pÈ+]E± ÿÛÝID^Ñô·kÐɪZ©æL¾{œÑ-ÙOô}Ñš\$–\Å˜ŽæI²Ž´I¨ÛÔº^*¹&²|i Ë[/)§RÒd!YI(5‘žµ&Y’[ïcd ¯Nƒ Uöà).ÆBåEvÒY7–êVDÙ/*ÿH¢4ªÅ°»£@ ¢tÅFT•‰IÊÌz[2iqiЕ1§ŒÝ&\e¨šBò÷ÌÏõ¬ˆ¯´Ë …]€Ý7.§#ÒiÉf3n!ÕË) ;b4!D[2ºŒŠêOzæQð ¢Iˆ*™…#G­CZÙ‚qåž­â(ªT—]ºîßtD—ˆ&m¨U¯Üš³uiêå{C‹?Y}@ª­TŠòÚi)[–Ö§&t¦Ò &yNÊ"á#¸€E>tÚt¤Ê§Ì‘B}ˬ:hY}GpšDŸŇaø±fîÃ9ÓžS¤Ò›Bó"2IH%‘(ÑÜ\È®iVÍ‚ =5*„úœ£—R›&l…Ù©Å™}*31æˆ$Ú-ÿnéßÚÿ cè*¢Jª×pœèî2–¨Õw&È' ÉJB ÊŽD‹ÝYßAí±X•¶ö#ùÝ„jíбJ«±U)¶¬Ì¥ÝY¬&“"U•cÛÃcÛi#‘½K µjº-/Tâ³Q ÌÃÕjlvK6è†ìõÆ7 l¦Éj²,ÄdnH²‘[Ó#b|PäÇqÑ!(°üª,dÒÞqÒYÈ6”·ÔkB5fFÃyPY²Ý]Ñ쇶ÒG"?z—@¶’9ûÔºGhÊ»MÅ4ZåR¥õ(Ü©W›g=žªèÈÜrsë =ªIXÒ||=ë²CÔ7ïµO÷^ÿöãw¹Ü˜¬`S%!…Uë,Ôé’c™›°ÜnFPæÒ"%“‘ÔvÚF“"=ŠRGèGKE£6åå *¦ìƒU•»I’JU’äe«Uϸ-·.øÙ¶’9ûÔºSà¼oD‡D¬4xvn"‡"´©qW%æ¢:ÝBnê3Cº¥-*A¡²Úƒ¹Êü ¥h¢|¸v¹Ðm2f/6HQ"S2e”Õ²ÑXîz‹*ߢSó±ëÛIˆýê]vÚHäGïRèoaJž£Mbµ=š„ù¯º5fi 1˜ÌˆóêšB•ÞÎ¥Ú÷¹Ì÷¥ÿºc•ûm$r#÷©tðú¬äØÿ•.„åÅôJN#¦ÔhuÈ-N§LÌÛì:[W¹Ëi’ŠÆFDdddF08®4hMáHpãµ3¸m2ËH$!´&䔥%°ˆˆˆˆ‹€hgôǃŸ}ÇßÑrÝuÅÖµâ'Ô¥(Îæff¦gßÁÓ>…5‰‘´[«}‡ëJß÷O*’w#±·cÚ]ñ]©k+|hâÏ®æb42X®«¿¸¦­\Ôn}ñšô½N|Ú½bÍysX¯kÚö+Œh²¬YðŸ±é î,øOØôÈ@€nž£_õýVÿ¤¥†éê5øß_ÕoúH=vp–èëùÿöæ!-Ñ×óÿìÿÌ)S/œÓ½á_@¹Â$“½á_@¹Â?RÞôxøË:çž¶b… ÌP¡óz…©è¡BÚ…Å jZ‡X[P¡Bµ 1o¯ Pb³ɺ´)1H¨Å#:âa‘ÂÿÆû^‰ŸI¡ªlŸ*¥—Zl¡éfá“‹"#4¥-¡j;’fv±f-»F°ÂÿÆû^‰»Izd\,—ª&êtMq ­KRÌŒçÊ´Òf_º#IÛa‘ÛUç/ R°œö*LÃ)P_Kô÷ª,HeÓSN²ÒZŒŽ×#ý Óc";–ÛpŒØxu•áüXÔŠª”Ô0ìé)iNš_d÷4Œ¨R’IÍÝ´…¤ìWîÄv:tüFtJµ}ÙU'«„˜ÆÄÇÖµ¾ˆfn“Ž6µm"%¥´æ. ÆWÚc˺D ÌÃ3jâ}Õ§H}5‰5}Sš.¿Üi)RÏ…YO¢çÂ’±Üˆc¢T1EêÝ3®B©ñ`É[‘ÝMš†êPzZx»º´[\”e´Œ7 &‹~>’°Ó‘Þq•R;f¤(Òf•8”©7.ñ¤ÌŒ»äfC-WWêSŽ òeE©ÄjÉ;.#n7$Ö†L¶¶“Õ ¬›‹õ˜™™±$gV-ªT#4•ÕºÞ‰:)df©.1n¸IùD•¼»÷Œ¯ÂC:§W™ƒÛ­UfË]N=Q¤Ó§8âµæ’BÔåœ÷FHQ2e·¹5lµÂ*ñym°PZu2sHS‹JÙÈe‘$I4«7æ3Q[½—õÙ•ÊÝN~’1…L¥®—j¹”;þ„”ÓO¸…’8 yЕfá3¾Ý¢+.tÖô}†Ýnd„9¯?r­.™DE–C¿sÝ«g|ÌøLDU20uÊsôzÔêL•6·áIr;ŠlÌÒjB&dfDv¹qñ¥Z•[«ib¬ÅJEB£O‰Tœ˜,IZÝŒ™—Ž3D•]=Ò’’$÷ËgF±Yµ×1™RÑ-n7e©MH7’Z´í"6ÍÓ4ÎàŽÛ*ázcl4òSNèA¶Úy 6Q I±ü•¦ýû_¾&øãbXõBŽÍbJ—C„Ü´æ¹IÖÁkX§/îÔyº;™l±•ˆdªOoI.ÍT§]yü(K’n¨ÖRy‰Ë9vF´¥FJ½ÌˆÃtõȶeV£[Ñüéy¯ÎzR#qÝ}fµ¶‡’kAí$™´ƒ·Á. T1d¦Ði‹t6êLîhd›Ç8„²4=—Ü™š,¼ü7Û{„Õ©\’ûò¤»&KÎ>ûË7qÅ”µÜÔf{LÌöÜ[&ÑoûwNþ×øKÕQÁº;¦ª*j1âC9’1?=Æõï(ŒÒÚ.²Ì³$™’KiØø‡ è·ý»§kü%ŽßÓ& v«€©&ز± Èp‰F•ý“P2RL¶¥DdFJ-¤dF[H@È/à4Nj à2™o4·š`æ¸N-4’ÖIÏsJMÄ™l#ZoÂB÷c¬âù—½±®ªµœRÆ:Þt6©x‡‚«ÇÍQe¨»O8¯‘p]jA¥Iï- "îr™â°Ø“*¥ƒ‹á*Fóœ[8²eUäÔu¥²§‰ØíT«»CŒÜ‰D«’¡8k±Ö ñ?üËÞØv:Á¾'ÿ™{Ûò½‹1*ÂÌk„Ü,Hq G­[yVãÍ. ê²¡g™–ÏVJ$-HSoY'{ŸS«ÌÁõ¶)عÀíkÇŠõI«»OTšjAn·šA÷H4–ªëËu܉+$›nv:Á¾'ÿ™{Û)xK ±!Mol¶ÛºÝ.÷ûÂyD¦Ç¤S§Evk¬µ›*åÌvS§u3Ž©KVÓ;\ÎÅb+ s¥Œ4î+£M¤F¯U¨2Õ•q§Ód­—Yp“°Ï"“lh3±—”IQVS n1¦áŠ&™Sc¡×YI¹ŽåÌ¥HÎÊÚDg{l½­ráÁÕ!4 3×aÃe,°Òc%Oækþ'úûãu@Áµ|¡ª„|EŠjØ’µ'PäÉ3':ûM¨œM›e.åA\û«–{NÅ•)ÓSÿx‹ÿ–ÿÚ´’Ö£µúž0¥»£(ê°7CèKm¥Zå¦É&[;Y*"á3P;Ë©kâšûÈþBPÌFÃ1“‡ÏÆ:sÔd²·Î ÝMJŒM¢ù—¬'2å+Îö+Èö:Á¾'ÿ™{ÛBKkÂJ9„(è5ü†å¶’¹Cœºq%wñåB¸œÈ¯å¬ÆcJÕÌQHèå\§QžŽQÏÜM*\-J¥&QÜDÛ¼n!I3R¬’I%©ÀÚýްo‰ÿæ^öÃ±Ö ñ?üËÞØ‰VjU¨ø†££Fê3ÊejreÓ¦“ËÖ±MtÔ¹Y\½Ò¦”‡[A‘÷øä\"¬×1:´¤¸òë”ú}Q›PÔ98šR]v›¯È”¢˜QÍ¥’ز‰ìçee-$F’`m~ÇX7Äÿó/{aØëøŸþeïlbt=OuæjøŠu^³:cÕÊÌVÛ“Qyl0Ãu'ІÐÉ«VYI¤‘+.b+¤Œ“Ü‚NÇX7Äÿó/{aØëøŸþeïlJÀ0"ްo‰ÿæ^öÇž¡£üÄe:š>Ô‘ŸúË»vþ!3:ÏÁîÿºô15÷[OÄ?ónúÄ;Hpû4üKK‡Bi“g ΜO-÷<ù„‘ŽÅnèïcÛkZÛ|Qц Å8¶™W éaÈjp‘V‰¤òPãIIÙl$••·ēٗn{fI“žÌi¸‡‰â´§TÛ8 [i7]S«2,ÄF¥¬ÍJ=›T£3>31XYÇBM¢ßöîý¯ð–#"M¢ßöîý¯ð–/*»ª£ƒtwMTTÔcĆs$&,b~{ëÞQ¥´]e™fI3$–Ó±ñ «À¸ š‚¸ ¦[Í-æ˜9®‹B $µ’sÜÒ“qf[Ö›ðÇ銓»UÀTŠ“FìYX…ä8D£J‹þɨ)&[R¢2#%Ò2#-¤"ZÎ)co:T¼aCÁUãˆæ¨²Ô ݧœWȸ.µ Ò¤÷–…‘w9LØ±Ö ñ?üËÞØv:Á¾'ÿ™{Û—½‰1ªPh8¾¤o9ÉÕ³‹&U^MA§Z[*xŽÑEJ»´8ÍÈ”J± ‰*zö,ÄX«W1®rth±!Æ6µmå[4ºƒªÊ…žf[=Y(µ!M½dìl ‡ØëøŸþeïl;`ßÿ̽íGO©Õæ`úÛì\Æàvµ‡ãÅzŠ$ÕÝŠ§ªM5 ·[Í û¤KUuåºîD•’O}Ñ)±éÆiÑ]šë-fʹs”éÝF£ÌãªRÕ´Î×3±XŠÄDA—„°›ÖñæËm»­Òï¼0xÆ›†(˜jeMŒ:‡]e$HJæ;—2”I#;+ií²öµË„d´±†Åti´ˆÕêµZ²®4úl•²ë.väRs£mv2ಉ*-qÕðv†ªñ)«bJÔC“$Ìœëí6¢q6m”¸g•sî¬JYí;T¦‹4¯T„HÐ4Ï]‡ ”²ÃIŒ”!<[™¯øŸëïx6WTÿÇž"ÿå¿ö­ j.¨1X³à ?cÓ!ÜYðŸ±éÝ=F¿ëú­ÿIK ÓÔkñ¾¿ªßô"zìá-Ñ×óÿìÿÌ"B[£¯çÿÙÿ˜R:¦_9§{¾s„I'{¾s„~¥½èññ–uÏ=lÅ ˜¡Cæõ SÑB…µ ŠÔ0µ°¶¡B…j(bß^ Åf(1“uhRb‘QŠFuÄÃ#…þö½“Y¬RµRjÓéæ¿tq¤-¬ßNS+q…þö½‘‘©óÖ‡«|jå¾{¾Vî%çÝ:åksqæ½ïúî/*¹[UTªÊ¬TQ-…,ä¯\]ïw{þÑæÂYÊ!z&1‰*ç2¬ìI(’¢\£'R2HÜQ+eȯ³i\¶p—š«[¨Îd ª¥Sr˜ÒÌãD“1N¥”ÿ$»É¹Ë’Kè.ŒÄE:tÚlÆæÓ¦H‡)»äy‡Mµ¦ädvQ\ŒËè1èr¹Zr¨NV* ‹1ã~S*’³C֛ÙJ¹ÜöÜ‹ˆcÀNB}nµ> ÕBu^¡*c$IjCÒV·DfdIQÊÆf{8Ì~K­ÖfTY¨Ë«Ï‘5ƒJšì•©ÖÍ'r4¨ÎåcÚVˆF±!fªõYªõQº‹èÕ»-2Ü'œNÎåK¾c.å; ûÅÄ<îÕjR™¤»R˜å9…눧Ôl¶­½ÒQ|¤}Ò¶‘wÏŒxÀ1Ý>³X¨2Ã3êÓåµczBÖ–¿Ý#>çú‚©Y«ÕRÒj•YÓ‰¢³e&BÜÈ_«1‡„2Šåj³ªßŠÅB£©¾«uI[¹/kåÌgkدn"Žº±Fùo—\•Ý©ÔnÜæ·W|Ù3f¾[íµí}£ˆƪµFiORZ©LnœúõŽÄKê&\VÎéH¾S>å;L»ÅÄ$ô¼pšm:Q"Uô2Bšk}Ü8ZäXÉÓŽi>ë1¬K$ß½m‚4Ä€ $Ñ“¬³Ži«‘!ˆíæZMÇÝKhI›j"º”dDW2Úf;˲†9k‡|èǶ>t€¢Ý”4yË\;çF=°ì¡£ÎZáß:1í è·e r×ùÑl;(hó–¸wÎŒ{cçHú-ÙCGœµÃ¾tcÛ æ7nEZC´ìk£vâ¬ÑH¬fs)®¬¦Esµì\µÏ„ø `uÝ~¸uªCôÉXóFˆeì¹”Ý^Ê+(”V¹™p—нQu]2WgÓ'FÝÏ«~3©qµÚ;DvRLÈìdeô‘|€¥Ôïð}F0bUqM…ªv¢Ê’&›NԚOaâÐ>‹vPÑç-pïöò†9k‡|èǶ>t€¢Ý”4yË\;çF=°ì¡£ÎZáß:1í è·e r×ùÑl;(hó–¸wÎŒ{cçHú-ÙCGœµÃ¾tcÛÊ<å®ó£ØùÒ>‹vPÑç-pïöǃé+?GÝ/aELRLš)5vRÙìº*3±^ö"Ûk\¸KçÀ쮼dòçEþv?ha±jœí#TêxÓH}ü12xôê¢V·¤š’D•ÌÌî[‹`äà„äM:Ë8æš¹ŽÞe¤Ü}Ô¶„™¶¢+©FDEs-¦b6Pú-ÙCGœµÃ¾tcÛÊ<å®ó£ØùÒ>‹vPÑç-pïöò†9k‡|èǶ>t€¢Ý”4yË\;çF=°ì¡£ÎZáß:1í µë˜Ý¹iÓ±®Ûˆj³E"±™Ì¤Vº²™Î×±p^×>Á×ë‡Z¤?L•4h†^Ë™MÕ좲‰Ek™— qDN[ª.¡«¦JìúdèÓ¢;¹õoÆu.6»GhŽÊI™ŒŒ¾’1¯€ ¬YðŸ±é î,øOØôÈ@€nž£_õýVÿ¤¥†éê5øß_ÕoúH=vp–èëùÿöæ!-Ñ×óÿìÿÌ)S/œÓ½á_@¹Â$“½á_@¹Â?RÞôxøË:çž¶b… ÌP¡óz…©è¡BÚ…Å jZ‡X[P¡Bµ 1o¯ Pb³ɺ´)1H¨Å#:âa‘ÂÿÆû^‰‰Èƒa‡c}¯DÄädj|õ çH‹>“ö=2!=ÅŸIû™ ÓÔkñ¾¿ªßô4°Ý=F¿ëú­ÿI'¡ÎÝ?þÏüÂ$%º:þýŸù…#ªeóšw¼+è·8D’w¼+è·8Gê[Þg\óÖÌP¡YŠ>oPµ=([P¸¡mC Pë j(V¡B†-õáAŠ Vbƒ7V…&)¤g\L28_áØßkÑ1´hØj©V¦»QˆtôÅeâaÅÉ©G•j#RJÎ-'´‰V>þU[€í«°¿Ã±¾×¢crá–énàÚjÓ&Dc} W*_Q«U3a¥N ˆ­}·ïÍ»1õsŠ—†·F©Qiº„ro\Œí8‡Pën&öºVƒ4¨¯³a˜Ç‰ìª}.i`ê4 /»C•PZU5â$:N¸¶PêT‚¹#*RÙ‘fQwW¾Û¢kt‰ÌTâ*~[,Æyر鴹I’›I©%¬8é5seŠ2"3=†C˸k ´Ã] QaS©’hºÇ©ò¢j'¡ÍFc”‡q7ý)$—cF̶Ú0g-4 =Fv>!Ú‹.?!épÛ‘î^[dÑg#$‘ WM•Ýð𠊆2dÊ|éñÐÚØ€„9&ï!*JT²A(g™E™I#4‘Û1^×!ã©PãAs5­CNP¢H&HÌÉ“vDÞݽɬӷnÁí!¹u*^,vHÞøÔ×W5„Ó#¥•:Í’mš LÜRÙ;Ú宨eb´nà†PcaúmG|°¬)•Mt™EP¥­ã÷å ÚPÂÛmH½“•]×x‰#ñ´S)s±ŠbÓàLŒÕ.<¸äü5ZuOF+·®I8H-rȈìKN\Ä¢°nøF½Wr°ôwž…NжX&OqDDt»e)YÔ”'7uk‘ÄOšÝ Úm*%›2;У>ù¿;%O6•¨‰Ã,豨ÐY >çŽâÙà&¤üX¸¯I½—„Kܬœ‰ s™e³AK-’³¹Åÿ+0ıV)”Y¸…Ú=w@(КKTöÐÑ“†òÔúÚ"Õ©e•(¹¦ÖQl¹ŠÅBaa²‹;ળôÚrŸW83Üêl–ÉgÕd+“ÊNÂ"#EÊÇ´GðËd¼7‹ìV&©ìº‡ÂT¶œ)l +2Ì‹¥k#"2¹ÛØ­;„tâ¯XU3 agcQhºé4Õœ‰ÓY½’Kí¤Œ6ÌIBn²"YÜ®g°cq:CPjKSiÈ ÈŠÌcIêd:ËnkÏ·V“Z’ÊØA †…°å;ãvhµ6ó2ú”ÔY§PœÝÉ‘‰G²ã¤ûX0Ÿ†þ½0нL_4ÿ÷›þ;C½ÄÚÁ„ü7ð郵ƒ øoá;Ó úF‚í`Â~øNôÁÚÁ„ü7ðé†ý µƒ øoá;ÓkðßÂw¦ôh.Ö 'á¿„ïL¬Oà ޘoР»X0Ÿ†þ½0v°a? ü'za¿@‚í`Â~øNôÁÚÁ„ü7ðé†ý µƒ øoá;ÓkðßÂw¦ôh.Ö 'á¿„ïL¬Oà ޘoР»X0Ÿ†þ½0v°a? ü'za¿@_S&d‰×d©ÆÒ¢Ì”¥Ä™•ö‘´ì®Æ8Ü}?Ÿþ¨¿êÿ©˜1X³à ?cÓ!ÜYðŸ±éÝ=F¿ëú­ÿIK ÓÔkñ¾¿ªßô"zìá-Ñ×óÿìÿÌ"B[£¯çÿÙÿ˜R:¦_9§{¾s„I'{¾s„~¥½èññ–uÏ=lÅ ˜¡Cæõ SÑB…µ ŠÔ0µ°¶¡B…j(bß^ Åf(1“uhRb‘QŠFuÄÃ#…þö½%ŠÌö(2hmª>á’ò^u'¥,Ö‰2pÓœ¬FdDFEe+å*úÛ ü;íz&'##Sç­tz´æ)Ò›q³ˆû‰uH[(Z’²àRdjA챚L®[ä=³qUv\'¢=-¬–WÜDfóå{ÙÇR’Zö‘tgq„æÄ%›sל¦&œ¹ˆSIŽQ‰{™­q2Ebo[—Y’Û2æµ¶p 4ŒEV¥Å8±^aLg7܈­>”,ȈԂq*È­…µ6=…Ä1@•ˆjÑÑTIHiÓ« Ñ5r#¶òÝ,Ù½ÒÒjIæ²®“#ºR|)#+ Õª,Ñ_£7)I!Ô¼ë6+)ià;ÚåôØìWà+x@1+HÄJ\sØëg9­-ɈԄ¡Gb5$œJ‰*Ø[Jǰ¸…ت· MBB!Ú•ŠZ¦CfIºD¬Ö=jbÌDv.úSòJØP @ ¦Ä´ètX‘äÔ*Í?7rˆŸ;ŒìË˳‘öòsmº‹†Â1‘!Q$ÒOE)-,ˆøK2[#°Ìõ•§þQâ-쉟®gç[ûÄæ~u¿¼CŒ:ÊÓÿ(ñG–ÎöC¬­?òylïd2;?\Ïη÷ˆ5Ìüëx‡u•§þQâ-ì‡YZå(òÙÞÈdv~¹Ÿoïk™ùÖþñ0ë+Oü£Å[;Ù²´ÿÊë®IJ²MH+$”›™¨½ÑX½‘§á(ÒkÅN]d›"šôø3 9šKhZÌ–YˆÐ_¢q&ešÊNÂ2Ú<ÐçPÝ¥¹C¨¿QD6&9&¶#!NwiJTKhÜ"Ïbû“#÷Wn ¡¦ºÑÈ:Œj\:<šl][yåk›u&µ‘­]Óî.ÄgÀIÿÄS9CT£S‘C:½"¨üÖZ’ˆÒüBahZÒµ ÊËY)&M¯mÈöpmê­.}/rîæ5;®2%1Ý¥YÚ]ò«a¯cØ{FBê[x¥Kué…Q‘:<†’˜é6r´‡Se/9(ŒõÊ=‰?p_+¹ÇÕw«ýz÷oú²7VéËïûsäËüŽ _o ÄÆGsu-|SCÿyÀhmAªú–¾)¡ÿ¼à46 ´±?ýQÕÿR0Óùÿê‹þ¯úù€‹>“ö=2!=ÅŸIû™ ÓÔkñ¾¿ªßô4°Ý=F¿ëú­ÿI'¡ÎÝ?þÏüÂ$%º:þýŸù…#ªeóšw¼+è·8D’w¼+è·8Gê[Þg\óÖÌP¡YŠ>oPµ=([P¸¡mC Pë j(V¡B†-õáAŠ Vbƒ7V…&)¤g\L28_áØßkÑ19l/ðìoµè˜œŒOž´<é÷ѧT:°V‹Ag ªY´IÎñÔ‰µ›’u'b²KeϾ$½¶’9ûÔºÌ`§;m$r#÷©tÛi#‘½K Æ:s¶ÒG"?z—@¶’9ûÔºÌ`§;m$r#÷©tÛi#‘½K Æ:s¶ÒG"?z—@¶’9ûÔºÌ`§;m$r#÷©tÛi#‘½K Æ:s¶ÒG"?z—@¶’9ûÔºÌ`§;m$r#÷©tÛi#‘½K Æ:s¶ÒG"?z—@¶’9ûÔºÌ`§;m$r#÷©tÛi#‘½K Æ:s¶ÒG"?z—@¶’9ûÔºÌ`§;m$r#÷©tÛi#‘½K Æ:s¶ÒG"?z—@¶’9ûÔºÌ`§;m$r#÷©tÛi#‘½K Æ:s¶ÒG"?z—@¶’9ûÔºÌ`§;m$r#÷©tÛi#‘½K Æ:s¶ÒG"?z—@¶’9ûÔºÌ`§;m$r#÷©tÛi#‘½K Æ:s¶ÒG"?z—@¶’9ûÔºÌ`§;m$r#÷©tÛi#‘½K Æ:s¶ÒG"?z—@¶’9ûÔºÌ`§;m$r#÷©tÛi#‘½K Æ:s¶ÒG"?z—@¶’9ûÔºÌ`§;m$r#÷©tÛi#‘½K Æ:s¶ÒG"?z—@¶’9ûÔºÌ`§;m$r#÷©tÛi#‘½K Æ:s¶ÒG"?z—@¶’9ûÔºÌ`§;m$r#÷©tÛi#‘½K Æ:s¶ÒG"?z—@¶’9ûÔºÌ`§;m$r#÷©tÛi#‘½K Æ:s¶ÒG"?z—@¶’9ûÔºÌ`§;m$r#÷©tÛi#‘½K Æ:s¶ÒG"?z—@¶’9ûÔºÌ`§;m$r#÷©tÛi#‘½K Æ:s¶ÒG"?z—@¶’9ûÔºÌ`§;m$r#÷©tÛi#‘½K Æ:iΫœA¡xé>ßRèG2€ÅbÏ€$ýL„OqgÀ~ǦBtõüo¯ê·ý$ ,7OQ¯Æúþ«Ò@‰èC³„·G_Ïÿ³ÿ0‰ nŽ¿ŸÿgþaHê™|æï úmÎ$ï úmÎú–÷£ÇÆY×<õ³(Vb…›Ô-OE Ô.([PÂÔ:ÂÚ… ¨P¡‹}xPbƒ˜ ÆMÕ¡IŠEF)× Žøv7ÚôLND ü;íz&'##Sç­:@î¢Ñêõ¹J‰F¥N©HB Å5:ÞY ŒˆÔd’3µÌŠÿ¬€x@I{cÞDb_5?ì‡cì{ÈŒKæ§ý ^ÇØ÷‘—ÍOû!Øûò#ù©ÿdh—±ö=äF%óSþÈv>ǼˆÄ¾jÙ%ì}y‰|Ôÿ²±ï"1/šŸö@F€I{cÞDb_5?ì‡cì{ÈŒKæ§ý ^ÇØ÷‘—ÍOû!Øûò#ù©ÿdh—±ö=äF%óSþȵ/ãX‘]—/âñÙBœu×i¯%  Šæ¥¦ÄDEs3ŠÅŸIû™žâÏ€$ýL„éê5øß_ÕoúHXnž£_õýVÿ¤Їg nŽ¿ŸÿgþaÝ?þÏü‘Õ2ùÍ;ÞôÛœ"I;ÞôÛœ#õ-ïGŒ³®yëf(P¬Å 7¨ZžŠ-¨\P¶¡…¨u…µ +P¡Cúð Å+1AŒ›«B“ŠŒR3®&/ðìoµè˜œˆ6øv7ÚôLNFF§ÏZt€vu™–’ªÆGc*Ö?í˜LnΣŒš¿ÔO:^÷Ï9÷Œy)U†j±W&ÇiŒ¥wI³Œº¦œMŽÜ BŠük•ÊÆ/y@­¹„áÔè³èùJ«P•qÓ}©(‘)×Û³¨I¶ƒ³¤“ΤØÈûÛEO(Õ†kxUztÇ…:;rc»Ý';kI)*²¬er2;^½ïžsïçÖ(4z]n-ayõÙì G†„„ä¢jB-'l„zµ™¤òºv$Ù]Òo·?R¤¼—)ÐjX‰HÃqc°qb®V¦¤œû¡WA©ÅÝœ¯R,Šî‹¾7×ÞÄXB‹ˆ29|éìLÔëMz­ki^\Ö+Û5¯b½¸zÚ¬2íbM!9±£µ%æ»®å·TâP«ðÍ— Äw,»mr¾ˆ“Hœ¼!ƒiU&‡VÆ‚Ñ9;J©š$yVÊ[C¦+‰²LÜY¤Ï1Ë&É(í1ŒhµÌE†]ßÚ†¥T]¤©N75¶ä¢u쇩pЦyÍ&¢"NÛ‹^÷Ï9÷Œ5ï|óŸxÆŒÑm· QÞª‘±X`Þ߇™ÃRTÃSk#×N[êiäk2­9RgrIPW"œc3i#bŽŠ•.="¥¬Kìë#ëTì,‰Ye32' ’®†d]ÍÈ'z÷¾yϼa¯{çœûÆ4cT Ùirg‘µRëƒt31¬5!çÕ ]t·»Éòe jl…!I+wVB•e§ÀƒMr±‡j ÄÊ©Kqº±ÃqME)fÊJE² £m«ß9_/ò-•¯{çœûÆ÷¾yϼcLèöäjæ6pýN!‹®ëª¢ôGD˲´ªï(²ÈÌù¶´e5eJOÜð 4l ‘¢<Nág”Ú›€æ(ˆÜ5.T¦Óe‘ÖÈµŽ“o-m™’•&Û ­B¯½SªW¡dq­è¨"}i«[š3测/¿å¶ßs{í±F4÷"Gc:š5îå[N%iÎvQj–v>=¤GýD,èb 0“‹u›"½®ƒTe°fÖ㊜ÈBˆ(Ì•&Å–ÙlF“"ýÓçŵCÿ-Ïิ¸ÈE@ŠÅŸIû™žâÏ€$ýL„éê5øß_ÕoúHXnž£_õýVÿ¤Їg nŽ¿ŸÿgþaÝ?þÏü‘Õ2ùÍ;ÞôÛœ"I;ÞôÛœ#õ-ïGŒ³®yëf(P¬Å 7¨ZžŠ-¨\P¶¡…¨u…µ +P¡Cúð Å+1AŒ›«B“ŠŒR3®&/ðìoµè˜œˆ6øv7ÚôLNFF§ÏZt€eõ;c . ŵZµmå6Ó´‡c²ImJ5º§Z2OrGb²Tw>.ùØZ¬ìý„ø¿‹Ñgì'Åü^ˆr˜ í„åÔ-i³5X“WC›&;Qžw;ÝÓm)Å!6ÕØ¬o8w"¹æÛ{½}Ÿ°Ÿñz!Ê``Ë«;?a>/âôAÙû ñ¢¦¶ º³³öâþ/DŸ°Ÿñz!Ê``Ë«;?a>/âôAÙû ñ¢¦¶ º³³öâþ/DŸ°Ÿñz!Ê``Ë«;?a>/âôB7¤/aŒM„&Ò£»ªym9«î\<Ê6Ô’-¨"-ªá¸çp¶ €%ÅbÏ€$ýL„OqgÀ~ǦBtõüo¯ê·ý$ ,7OQ¯Æúþ«Ò@‰èC³„·G_Ïÿ³ÿ0‰ nŽ¿ŸÿgþaHê™|æï úmÎ$ï úmÎú–÷£ÇÆY×<õ³(Vb…›Ô-OE Ô.([PÂÔ:ÂÚ… ¨P¡‹}xPbƒ˜ ÆMÕ¡IŠEF)× Žøv7ÚôLND ü;íz&'##Sç­:@¬YðŸ±é î,øOØôÈ@€nž£_õýVÿ¤¥†éê5øß_ÕoúH=vp–èëùÿöæ!-Ñ×óÿìÿÌ)S/œÓ½á_@¹Â$“½á_@¹Â?RÞôxøË:çž¶b… ÌP¡óz…©è¡BÚ…Å jZ‡X[P¡Bµ 1o¯ Pb³ɺ´)1H¨Å#:âa‘ÂÿÆû^‰‰Èƒa‡c}¯DÄädj|õ çH;ÚV Àí>¦Óð¹‘[†’Ïû£‚GÑ:‡úâÿ«þ„+Raë;r y¥Ÿd:ÎÁ†ÂÞigÙÜgC¢Wô§†¡×©ú¤fè•WRÔØÈy Y?O"QˆÈŽÆe~¦#sf?DÜt-d•:á(ÒÙíQå#U‹‡añ‹`,„ìTuÇÖï]ø}7fâÔd™ïÙòe͹òû­—½¿X‡‹§G¨ãÌO‡¡a*ZªU £°ãKC®“ÚÓ–“%~‘Å6F¬¦“ÊH¶sÚEtž? ®±‰0ÁaHÕ $¨S[•£yDÚZ‰¯nåJBÿQ‡ß1Hªq™Jh·ˆš¬MÄ•çk†¤E8ñ©ò˜`¥Ibg#Qgqƒ3&ó,•{¸,ÌWL–gð M‰µ‡æHª%µÔ&GDgd²n¶›!Õ©eÝ8“Z­˜.ܧfÿØj±z l=9†¥IÜÑÖâRëÙ z´™ØÕ”¶‹m‹„JáVêuÌ5‰£Tå.Dh°[“…èã/u°ßè“À‚ÈâÊɱXÇ‹E¿IXiÈï8ÊΩ³Ri3JœJT›—xÒfF]ò3!9å(xhTEÕ‘)ÚŒlHëm§$K5ä%¹˜Ð›!*U̳à±NæCÎä#×ÕM•Q¹Ú”l;6=Þk)/)º‹XÖ›wEnf¯NÑ¥iº}Vt4ZM,H[dd¶eg+ÿ+"/Ç•7à!äÑcïÇÒVr;Î2³ªGlÔ…LÒ§•&åÞ4™‘—|ŒÈ3<ÆšsîÑeU’¦ÉˆÒYŽ´™žcS©uI2+ZÖeWÛß.¶óÆmIi§n:²Jp”ilŒö¨ò‘ªÅðŒøˆÄ» Vk´ÝÖGªÔ¡¨ªðr”Y lû¶¥­”ËÝ¿Tñ‰ÎL¤M}’òe%Åäñ8K¿ušûs^÷¾Û‰‰ç"õrœýµ:“%M­øR\Žâ›34š£I™‘®\DâHà%çBU›„ÎûvŒVreÓ—×bžŠ£«y†)tÔ¾nÙfÙ¥ÅæÚ™¨¬w±fÛX«—1³ʉˆ1ÁB**$jÆçEJ˜”›ËZù!¬¹’zµ’všL¬m¤¶ÜˆâzEÝ}wJTåÅqõ4ÂÈíIp”Vh=©ZˆÉJ/”jfD|d¥8æz¶‰QͶ&7Æ;­jMÄ-h_¹Êi=ZËÝ^å´¬dbK ¡\¤Q0â°³Ò™\Âstnb;¿$žZI¥ÛÝ‘6MC¹wfvÚbÍMÇÝíÙQãF}xŠ"f5µM¨Ñ:éEŒË)±žËm0Ü"6~ë©öFëo;Ýjë²îK£o}½ÿ/¹¾¯»Öpßmî0­âÕ3F”TÓêr¢­5YèmÖ4¸Ú ¸ªÈ…Ô¤Ôµ(ÒV#=¦#tˆP —¡«TgHS¬ËgbÚG ×äPê¨B&GKjq)32"Z´ð‘ì¢Øe°b†ÊêŸøóÄ_ü·þÕ¡­D€ÅbÏ€$ýL„OqgÀ~ǦBtõüo¯ê·ý$ ,7OQ¯Æúþ«Ò@‰èC³„·G_Ïÿ³ÿ0‰ nŽ¿ŸÿgþaHê™|æï úmÎ$ï úmÎú–÷£ÇÆY×<õ³(Vb…›Ô-OE Ô.([PÂÔ:ÂÚ… ¨P¡‹}xPbƒ˜ ÆMÕ¡IŠEF)× Žøv7ÚôLND ü;íz&'##Sç­:@ßu¼MC‹U~;ÓÒN6¢JÉ(RˆŽÅr¹•Ëö³ˆ$hïˆ)ôš¾çͨÝÔÝ~«5³e΃µò¦öá±qC5lÍ9ªk-Ân+CGD&¤,–…%$›¥I%—‘m!ÃÀ#jríÚÕCV̓­F§T·:³±ºéæö©\ĩ±ì-¤1sØÀ•L[.½Y:}Q.‰˜òé†é0¦½bMI=§º-°ŠÙ8Nû8Øi—tÌĘVl7¡L̘¯¶¦žeØËZBŠÊJ’i±‘‘™±Y«àšÔƒYD*”E(Ø—Ýl̸*’d8ti—mÌ—£é”v¨ÒáRäS¶®´ìì"ÜA£)[è ¬½UZŠÕR.spÌŽ2dÓµ„Á•­”ƒËÀ\C‰6™wJ1&DÇ&"C)’ëhiÇŠ2ÉkB F„š²ÜÈk2.öeq˜ÇÇ‘£¸õeUãÓé,Ԗ鼩h¦åyNT“Y¬‘›6U¨¯{ÙF]óL´Ë»úîÃÞ0ü=‘ÆÚRÿnê?Ù 2b0ägß‹%©1žq‡ÙY8Û¨Ò¤(Žä¢2ÚFG¶âØ BAׯ5å† ó“ÞÐÂÄ•*¦ìI/GqHSf¦–i3JˆÉI¹wŒŒÈ˾F,€ŒD ð&L)àJ~$„{‡Ypдý[Hz·ö·¾é¬oÍG|’FI™ºW®+‘‘ÙwÍÀf\<1À' Ír´ÎïÔÖ* ï÷vY+-Õ{ßY·»¾e{«û£ãzté´ÙͧL‘SwÈó›kMÈÈì¢22¹—ÐcΔoâãLŒÝz¨†&­nKm2Ü$ÈRÊËRÊöQ¨¶ïß:té´ÙͧL‘SwÈó›kMÈÈì¢22¹—ÐcÎ1!»[…:DèuŠŒyrLÍ÷Ú’´8é™ÜÍJ#º®{v#2d±1ër[pCÈY’Ò²;’‰E´Žûn-œ £X³Uz¬Õz¨ÝEôjÝ–™nÎ'gr¥ß1—r†}ââ Vë0!» ^¡+×ֲ̕¡ ¾Îé$v?ëˆFñ!n¦íQºõQÞ"K²“-ÂuÂ"""Rïs±Óï sï;!õ¾û«u×jZÖ£R”gÂfgÂb€ m6±V¦4óTÚ¤èM¾Vu1ä)²p¸”I2¿õƪµF©ORZ©LnœúõŽÄKê&\VÎéH¾S>å;L»ÅÄ<`ýú¬ïVôï´ýïð]нO ýÅíûÕjR™¤»R˜å9…눧Ôl¶­½ÒQ|¤}Ò¶‘wÏŒxÀ0=óëuš„öªêóåÌd‰-H~JÖâŒÌˆ”gr±™žÎ3Ôëj¤†äÔª“¦¾ÙYH§Ÿ Ôfd<@îªÖjõmVúÕgOÕ›Ý2æBâ,ÆvyRåKÕn©/?©hškXá«" )¿K¼E°Y8\+ˆªø^¬š­RcLBr¥Å2‡HŠä~åde{‘í²ÂkÙßJܪýߣÔd±Ez«‰«²+•É[®¡'.¹íZQ›*I îRDEܤ‹aw†4b±gÀ~ǦB'¸³à ?cÓ!½z‡c5/MÆËÙõgI”£ÈdGÜ’UÂd|CE óÔ,´7§¸â’„&‹4Ô¥ˆˆ[LDíÝí¥üÜÎ}>Àµ£Ú®³Hx§2Æ®%:ŸN…­yœZÞT¢Ü‹)H±Z÷Í´îDZƽ¢Vt¥Ë~Èh³¿ F¢Käe‘Õ•øKmËG”Ï€óNtVóO雺èuµRhÖRFGÝÎï¬%¢ð–…ÙÅ”EÕÙ—Dƒs¦Gn;”éO))fK¬‘šÊbÌÉ»ìIpyõ3Å>­Í?>6vƒ>/õµWÿÌdŒ. L¼C.|ªN1âkufФítÕN$"\†ÐÌr¸”¥²-FÅl,ÃOÇ|§1‰Ô×þu}Õš)ŸRÚËÆ´4Ìüøüíd‡ãJšf~|gjúRÄ‘¦ÒÑÚlæ*ÒN;k†ª5¸S™Ûy%–iemEfÉw%lI(Ë>Æ2ų)ôxñ!EP›_],äÔ)R¢´ë)†ì{l:it½Á')™‘šVD­¤¢ç>V×Ï[õýS÷NÚ{5ìÞ¦ÚT(oÌ›\Ãq£0Úyçi“†Ð’º”¥û™™ð ½¬P|g@óLßωV•ªØ²vÇð£½CÜ´jC°êägä·W .¸¶¿HdÊI/'*U¬3225ÏKÄ•+UŠ]"&=BV'j–Ä—VCÿ³’§Ÿ$¨Å’¤7$¶›•®)>QÖO[µ}S÷6Çf¶í`ã:šfþ|~Rý?ÆT5MüøÜZ?¬Vêob(Uýî9TŠ®áCP´!Ônh¥(ÍãÙ}› m®r‘Îuº™ër¯æSˆsŸjõ;ÆT5Müøüí\§xÊæ©¿Ÿ“©½=kŸæLCœ»W)¾1 yªoçÇçjÝ3Æ45Müøèà›×'û§ù0çh½LPb¾—Ø©ÐâocÞ™§k•»óÇ»µá~; yš_ç†ûIª©ë#Bv¼/Çt3Küðv¼/Çt3Küðß`#2–„íx_Žèf—ùàíx_Žèf—ùá¾À3#Bv¼/Çt3Küðv¼/Çt3Küðß`‘¡;^㺙¥þx;^㺙¥þxo° ÈЯ ñÝÌÒÿ<¯ ñÝÌÒÿ<7ØdhN×…øîæiž×…øîæižì24'kÂüw@ó4¿ÏkÂüw@ó4¿Ï ö™µá~; yš_烵á~; yš_ç†ûÌ Úð¿Ð<Í/óÁÚð¿Ð<Í/óÃ}€fF„íx_Žèf—ùàíx_Žèf—ùá¾À3#Bv¼/Çt3Küðv¼/Çt3Küðß`‘¡;^㺙¥þx;^㺙¥þxo° ÈЯ ñÝÌÒÿ<¯ ñÝÌÒÿ<7ØdhN×…øîæiž×…øîæižì24'kÂüw@ó4¿ÏkÂüw@ó4¿Ï ö™µá~; yš_烵á~; yš_ç†ûÌ Úð¿Ð<Í/óÁÚð¿Ð<Í/óÃ}€fF„íx_Žèf—ùàíx_Žèf—ùá¾À3#Bv¼/Çt3Küðv¼/Çt3Küðß`‘¡;^㺙¥þx;^㺙¥þxo° ÈЯ ñÝÌÒÿ<¯ ñÝÌÒÿ<7ØdhN×…øîæiž×…øîæižì24'kÂüw@ó4¿ÏkÂüw@ó4¿Ï ö™µá~; yš_烵á~; yš_ç†ûÌ Úð¿Ð<Í/óÁÚð¿Ð<Í/óÃ}€fF„íx_Žèf—ùàíx_Žèf—ùá¾À3#Bv¼/Çt3Küðv¼/Çt3Küðß`‘¡;^㺙¥þx;^㺙¥þxo° ÈЯ ñÝÌÒÿ<¯ ñÝÌÒÿ<7ØdhN×…øîæiž×…øîæižì24'kÂüw@ó4¿ÏkÂüw@ó4¿Ï ö™µá~; yš_烵á~; yš_ç†ûÌ Úð¿Ð<Í/óÁÚð¿Ð<Í/óÃ}€fF„íx_Žèf—ùàíx_Žèf—ùá¾À3#Bv¼/Çt3Küðv¼/Çt3Küðß`‘¡;^㺙¥þx;^㺙¥þxo° ÈЯ ñÝÌÒÿ<¯ ñÝÌÒÿ<7ØdhN×…øîæiž×…øîæižì24'kÂüw@ó4¿ÏkÂüw@ó4¿Ï ö™µá~; yš_烵á~; yš_ç†ûÌ Úð¿Ð<Í/óÁÚð¿Ð<Í/óÃ}€fF„íx_Žèf—ùàíx_Žèf—ùá¾À3#Bv¼/Çt3Küðv¼/Çt3Küðß`‘Ïòúœ*:£È¬ÐÚ­™;Ï,¯c¿zpÇö¬R¼a@ó\ßÏŽÌŽoíX¥xÂæ¹¿ŸÕŠWŒ(k›ùñÒ‘Íý«¯P<×7óáÚ±Jñ…Ís>:@29¿µb•ã šæþ|;V)^0 y®oçÇHfG7ö¬R¼a@ó\ßχjÅ+Æ5Íüøé ÈæþÕŠWŒ(k›ùðíX¥xÂæ¹¿Ÿ ™Ã©ß Öñ>+‰In•NƒE¬ªšÊ%G™%× ,2æu-2Û+þ–Ö$÷†b‡ ê~%Ø5<(ã¯1¨ÔŒ+"¢Y©+"SnKq$y“#±͇Â6^¨um*KA©ŒM!Äß‚éƒÿý®§6DJœZlµ¶n”vRJÒŸUˆŠåßR”EsµÎö½Œxuººìb(§3,í~¶­>"Šs2ƒÓtfU­PßÑc¦ƒ²ÓØâ:TŽ,É7ˆËúÈlÍ`Y˜}oP ÂÝŸö{ F¦gËŸßv¹¬¶nçƒ-ÕÛdN²¨øoQ ÓÜS²˜uˆ“ßΣ):´¥Ý†{F«‘¤†æÂ_Î~Çÿ¨ôiïMØœõŽR樂7iœÇ8å-S Ï‹Ä}mUÿó"[J§B¥E\h êZ\‡¤©9WqçT늹™ð­j;pìV+“`ŠU26¥"=6)\T<¢m„¤”µ–u¬ì[T¥)J3á333Úc3¸¡ø#ÙØzZ‚>ŽðŒxëŽÝ5íQ¤’Ò9õb%ˆ˜ºÏQc"?Ñeà." ~¡ÁL"f3ë\)ŠšË¯Ëyç5êelšÔµ¨Ô³Õ­IîŒö[ˆ­³÷?c› ÜPüŽl„àjLQ€°®&zKµšs¯œ¶I‰HncÌ¢BŒ‹X†Ö”¬ÓsÊj#4챕ˆ~âŒ+ u"¨ˆtèÏL-©Ë×Êy’SèCm’ÉÖÏ;*Õ´”’‘Àe{ÎûkqCðF9² ÅÁæÈ04þŒ0³Ø^—QL”°Üš•Asži‰>†Ôm¶ÙµÞíÃÊÒMKQšGa,MÅÁæÈ7?c› À…€šn(~Ç6A¸¡ø#ÙÀ…€šn(~Ç6A¸¡ø#Ù,ÓqCðF9² ÅÁæÈ0!`&›Š‚1Ín(~Ç6A 4ÜPüŽlƒqCðF9² X ¦â‡àŒsdŠ‚1Í`BÀM7?c› ÜPüŽlƒi¸¡ø#Ùâ‡àŒsd°MÅÁæÈ7?c› À…€šn(~Ç6A¸¡ø#Ù,ÓqCðF9² ÅÁæÈ0!`&›Š‚1Ín(~Ç6A 4ÜPüŽlƒqCðF9² X ¦â‡àŒsdŠ‚1Í`BÀM7?c› ÜPüŽlƒi¸¡ø#Ùâ‡àŒsd°MÅÁæÈ7?c› À…€šn(~Ç6A¸¡ø#Ù,ÓqCðF9² ÅÁæÈ0!`&›Š‚1Ín(~Ç6A 4ÜPüŽlƒqCðF9² X ¦â‡àŒsdŠ‚1Í`BÀM7?c› ÜPüŽlƒi¸¡ø#Ùâ‡àŒsd°MÅÁæÈ7?c› À…€šn(~Ç6A¸¡ø#Ù,ÓqCðF9² ÅÁæÈ0!`&›Š‚1Ín(~Ç6A 4ÜPüŽlƒqCðF9² X ¦â‡àŒsdŠ‚1Í`BÀM7?c› ÜPüŽlƒi¸¡ø#Ùâ‡àŒsd°MÅÁæÈ7?c› À…€šn(~Ç6A¸¡ø#Ù,ÓqCðF9² ÅÁæÈ0!`&›Š‚1Ín(~Ç6A 4ÜPüŽlƒqCðF9² X ¦â‡àŒsdŠ‚1Í`BÀM7?c› ÜPüŽlƒi¸¡ø#Ùâ‡àŒsd°MÅÁæÈ7?c› À…€šn(~Ç6A¸¡ø#Ù,ÓqCðF9² ÅÁæÈ0!`&›Š‚1Ín(~Ç6A 4ÜPüŽlƒqCðF9² X ¦â‡àŒsdŠ‚1Í`BÀM7?c› ÜPüŽlƒi¸¡ø#Ùâ‡àŒsd°MÅÁæÈ7?c› À…€šn(~Ç6A¸¡ø#Ù,ÓqCðF9² ÅÁæÈ0!`&›Š‚1Ín(~Ç6A¦0hwé-§RKBñcÉRO€ÈáD¹ÈÍã<)=J¡3¾°ÕÀƒuf]ìäµ$³Ê#Ûn÷ÚR™MDYÒOˆ—¥T¥»!Âe$§VO)¥®£Ê„&çÞIÌn(~Ç6CË4ÜÄÏXq»b›¸™ë%¢pžª½]EsZ6œ7Zœ–µºwîÜ2ºv\̈ŒöØîV±î %üçìúŒ¶â‡àŒsd.2Ë,ßTÓm߇*H®&ͪmF)M«TÚ§m/ÿÙxymon-4.3.28/docs/critview-disk.jpg0000664000076400007640000013560511070452713017442 0ustar rpmbuildrpmbuildÿØÿàJFIFHHÿÛC  !"$"$ÿÛCÿÀÙý"ÿÄ ÿÄe  !1AQUÓ"2S“•Ô37TVWu’–²ÑÒ#Ba”¥45q $%Rbt‚…‘±³rsvƒ¡£¦´Á6CDdw„ðEHµÂĆÿÄÿÄ91Q‘!RÑ3ASa±ð"q¡2BCÁáb’ÂñcÿÚ ?ôôùrÓ:BS)ä¤Q‡b+˜øqÙŸÒT¬$ÿΫýæ*Uæ¾*ª{ŠÂu^/_‹þžö™±tÀ„¯Ñ'‹®úo©?¤GŒgäùG­+9œQê›Ö+*zKíÈq´´ê–FQÜCO¢ñHÐã‰I¤Î÷¹[aÛaÇf|mÿHb—^#ª·U,@´r„êu'ñv´p…¥ ·d‘~«hM÷žó¹íÅxâÄUŸ©hN™T‰.¡É—D–Fƒaœ^¶QŸé VÒ’5«»øìÏ¿é 8ìÏ¿é iðü„&ÝN³"­%kÖ§]i¦É"-KiMFFe«R¶Ô{-±¾üvgÆßô†vgÆßô†<ýŽ(ˬf-YŒ-B|ãÔÙ%×”éò•9N†jq„WWFn©¹Ü´Ÿënñ~/Æ Ä•òÃÍTŒ†,.œ˜rR¶Pé®Bä:—Ij4›""ÐguÒD-ÊÍx¨ôyµzEö!AŽä™êZ´6„š”«&æv"3±˜ú±V[îÈiŠšr3„ÓéCú¥šR²JˆÅ=+J¬|Ê#Üd)Œå¨Õgá|Êlñ1RbQéÊŠˆ F™hv"VkZ–“_ާÒ4)$Jlï«i åcWX©Ò«r{nâ¶)-M&[5CaTÆd™'RM&¥:jAÉ[]-‡b ‡™ñ·ý!‡™ñ·ý!ŠRN.ÅiÕx Ö$ÖÞo"ŠÔè¬ÄCì±ÄZxȸCCç ©^ÍK;'É@ÍXÆò£QiÔ¥Ò%HÄîS—%öá=-q žôÒ%“q”;©$EklJTi²&÷™ñ·ý!‡™ñ·ý!Œ8M8Ä6XvK²œm´¡OºI%ºdV5¨IMÏyé"-»‹`ùV)ñ*Ô™t¹íÑ%²¶Aþ²FF_ì0KcÇf|mÿHc嬹m)ص5Hm.-£SOê"ZhZnG½*J’eÌdd{HU¥>mz“/'¾§j¥)pënnRáÇÐ¥ºóè[ ÿ¯U¼‘ð›\Åòé_…P—Á7T­7)4â„™¦ÔyÎ4Ï™%Á©´!6_뉶æw!oqÙŸÒqÙŸÒÓáyÍÕ0Õ.¦Ô®6ܸl¾—ø.…% ”KÑú·½íÍ{ ˆ¿™ñ·ý!ŽgæC‹ò‚ª²8V^’¾,d| èá]V¥¦éO‰Ô£¾ÄŒqQ(ôŒBÎ#ŸU¢Ñ+ø–%VK\^²þ„Da/1¥Z6Rlhp(ñ”£3=¦e¦Ä5f1ÃnF‰P.´Ô6"Óåq*Ðã¯ÔD¢-&›£JüE«Æ+éÇf|mÿHc_\ŨäʪVU¸ÐÞšáªRøH× u(“©7±”’Þd+ìiQ•‰û™ju¥:¸r*8Isœâ䓱®/¦ËY+ÅUÍ'Ïc;Œ°snENŸ…j”+RªqŸÁù/½%¶IÇÜl£j3iIiKÎ$‰$Dde{™\¿Çf|mÿHaÇf|mÿHcàûñÙŸÒqÙŸÒóv ¢.™‚²æ°œ…(‰}t‚Uf›$΢ÿ ÁÑÀ7~Ì’áp‹²V³ñ­qÝ{£¯q¾[÷@Z=Ôr/!p hà¸×«Vž…Ñýñ}Ztþ­¶‰B×ã³>6ÿ¤0ã³>6ÿ¤1OUq"²kmâÒ†G‹Ø¢ò?`Ðlqô0eu$ÜáÕܾ«±%±Eü¿QÆÇ‡ßÄlbõ¥GŠ]¤³ tö,*ª¨I5Y$â–„™(Œ–DzHŒŒîf™ñ·ý!‡™ñ·ý!Šº£[¬a·±-.£‰eÍDH”Ù1f¹…HJ¥HyŽ’‚m³3S)$)Ed›—V¢NÞEŒM˜Nã †jN/6âCD–‰LÐøß£2R]>šSI"AéA%Âá Q¤ ¿øìÏ¿é bÑ«ÅX£Â«Óª/¿ tväÇwRÓ­µ¤”•YV2¹ŒˆÅ‡jŸãè“ZU*#~•R“#¼—$>äž)¥wlÉ’Iè=¤DiQm3䲟W•íÊ3(Îaì$ðè|“Ò˜‰R$©fW4(Ó¥)lÊÇrQš¼T…ïÇf|mÿHaÇf|mÿHb,WŽ!á\EQyú–„áY•H’ê™tIih6Åëhõþ•m)#Qê°µðü„&ÝN³"­%kÖ§]i¦É"-KiMFFe«R¶Ô{,Ž;3ãoúC;3ãoúCTR¨<5ñUSÜVªñzü_ð¤÷´Í‹¦%~‰<]wÓ}Iý"ÏÄìýö^üÞ`ϳñ;0KoÊÔ®³…éÓø‡+RºÎ§Oâ5ï²÷æó}Ÿ‰Ù‡{ì½ù¼ÁŸgâv`52hŒ¹:¡&6eÔ¡"{êyæXn— ÌÒI"3TSR¬„¡k5”¤ŒÎÃ`š>r5-ºƒ4 “Ô¶f,™LF7$t¤’ײ $\ÄE°}»ßeïÍæ û?³÷Ù{óyƒ>ÏÄìÀMf­ILªÄ,9Q} )”»-¦]Z[Q)j#=&Fw-ÇsÆ#AªQj0—@iÉëKªLv¤4òÒH"7[3.Åm(Údv"±•Šß×{ì½ù¼ÁŸgâvaÞû/~o0gÙø˜ f aš.H›2…Pn£ äLiÚf*BJÅÔIBPÚDf¯&æff74øø:,Z{4lCtÞŒÓ i´°á¥H5 ‹bTiZ“rÛes˜ø÷¾Ëß›Ìö~'fï²÷æó}Ÿ‰Ù€Ûòµ+¬áztþ#å6£N~Ì5\b#Ž6¤%öžhÖÑ™X–’Y)7-娌¶m#-ƒ[Þû/~o0gÙø˜w¾Ëß›Ìö~'fBÞaº“µ&óF¬‰Ï6–’–)ëˆMÍ)R¸¥ÌŠçb3Ùsú?T¢"F™.BY}¦\B]Zkp’ddJR”¥ï333Úb;ßeïÍæ û?³÷Ù{óyƒ>ÏÄìÀm›ªRBPŠŒ¡$D”¥ätÑ<­Jë8^?ˆÔw¾Ëß›Ìö~'fï²÷æó}Ÿ‰Ù€äëX …[–ÔºÎ<‘RÑY·eÁ£<´ì5C3!Ò7GÂD€ÝrE'Ê~/6¤ÌE<å§B”Ûa”–Â+ÜöŒŽ÷Ù{óyƒ>ÏÄìýö^üÞ`ϳñ;0C=‰uŠr)¬?Jj l“Œ…¶M%²-$‚Il$‘lµ­mƒ < žšs°ëP‘èÉŽ†™Kieã%:Ù$ŠÄ…™©;”dW¸ù?€òå†}ܾÁ‰m´šÔ~ç∊çÿ»O/w6ùŒ­õ\.Ì´9Z•Öp½:ò›Q§? æ®1ÇRûO4kh̬KI,”›–òÔF[6‘–ÁZr÷so˜ÊßUÂì×»›|ÆVú®fëGË<)Fœ‰ôŒ`Téh¾‡âÓ(8›ï²“Œ‡uÅðw.rïAåm:8ö†¸Æ›ZÜ'•klµÇËÝ;c+}W ³^îmó[ê¸]˜ Õs Ñ*øÑšìоK-ÈbJ‰)«S&•!+]ø=hJôé¾Ëj¶ÁÕëÃWŠë£ñ~1Æx+·£†áx^Ûµðž>­ú¼mûEuËÝ;c+}W ³^îmó[ê¸]˜ b°¼Î3ÆÎ#²–$ð¦Úøf’j4¡wò’Fµ™ì-Jé1¯v‹—®ÒØ¥9IÂ˧ÆY¸ÄUG`ÙiG½IE¬“ý¤C‹åîæß1•¾«…Ù‡/w6ùŒ­õ\.Ì’Ĭ<Ä…HbE-§–ÒSˆ[d£m£B Ën”š×bÜZ•mæ>,aP”ÁQZ8 ›Íx³fDZ·›%%b±X‹ Wœ½ÜÛæ2·Õp»0åîæß1•¾«…Ù€î"RðDNDJvŽš‚ÜÔ´Ã ))Q).X¼r23¹ïq¸åjWYÂôéüE_ËÝ;c+}W ³^îmó[ê¸]˜ C•©]g Ó§ñ&&ÐXvC¬K¦´ä— ×Ô‡“ud” ”£/(ô¡)¹ó$‹q­9{¹·ÌeoªávaËÝ;c+}W ³šö ½VU]Üxû•%© Tµ@¢›Æ¤(”ƒ5ñ=WJ’“-» $e¸wðÇâºèü_Œqž íèá¸^„¶í|'«~¯~Ñ]r÷so˜ÊßUÂì×»›|ÆVú®fÃ2†–ReE4±%RÙ/ÑY·Ô¥)N§¡f¥¬ÍE´ÍF|æ>Tø¸2¤©ñ¨4ÊTÂàÊ,úhS»?\Ðf“Vó#2½‡ËÝ;c+}W ³^îmó[ê¸]˜þ |©&«Š Z„¿é™CHuí·ñÖ[U·¤ÇÙ¥á†X‚ÃK£¶Õ>ÜI´›d˜ÖA¶\~¥¥'e¼Un1]r÷so˜ÊßUÂì×»›|ÆVú®f½Ŭ»Z±TxŒšÛl¥÷/¿RËÆ?Þc:Ú (lÇ.›3 ¥¦YiÄ! ¡%d¥)-„DDDD[…iËÝ;c+}W ³^îmó[ê¸]˜ C•©]g Ó§ñÍV™]vMZbN¥9!¶ÚSqM2$"úS©ØëpÈKU”£±­V±‡+ËÝ;c+}W ³^îmó[ê¸]˜ ä,9>#§ÕdcÅT›‹1sÜn[P·deÆJõ°Û[špÈõÌô7cI$É[Æ)x „ÎKì4ÒjÓI 0E'Ÿô–/÷Üpü½ÜÛæ2·Õp»0åîæß1•¾«…Ù€ïéì`êth±©ìÐb1 Óv3L%¤%…šTƒR¶%F•©7-¶Q—9V `ü!E§E†åê1©ìB‘Qi¦™zQ4ÚS©fFg·Mìfvé1Êò÷so˜ÊßUÂì×»›|ÆVú®fÐåjWYÂôéüC•©]g Ó§ñ/w6ùŒ­õ\.Ì9{¹·Ìeoªáv`-V¥uœ/NŸÄ9Z•Öp½:Wò÷so˜ÊßUÂì×»›|ÆVú®fÐåjWYÂôéüC•©]g Ó§ñ/w6ùŒ­õ\.Ì9{¹·Ìeoªáv`-V¥uœ/NŸÄ9Z•Öp½:Wò÷so˜ÊßUÂì×»›|ÆVú®fÐåjWYÂôéüC•©]g Ó§ñ/w6ùŒ­õ\.Ì9{¹·Ìeoªáv`-V¥uœ/NŸÄ9Z•Öp½:Wò÷so˜ÊßUÂì×»›|ÆVú®fÐåjWYÂôéüC•©]g Ó§ñ/w6ùŒ­õ\.Ìn0œlŽÅ•ES0Ö˪´Ä4§–ÔZ45šMˆÖ«7⤌Ȯv+™ó Ç+RºÎ§Oâ­Jë8^?ˆ×÷³À_7øÔð Á­à¬±¢ÄnUKàVvK1[2¡ÃY©×œKM¤‰-™Ö´–ëÓ;“}ÊÔ®³…éÓø‡+RºÎ§Oâ5ï²÷æó}Ÿ‰Ù‡{ì½ù¼ÁŸgâv`6ü­Jë8^?ˆrµ+¬áztþ#QÞû/~o0gÙø˜w¾Ëß›Ìö~'foÊÔ®³…éÓø‡+RºÎ§Oâ5ï²÷æó}Ÿ‰Ù‡{ì½ù¼ÁŸgâv`6ü­Jë8^?ˆrµ+¬áztþ#QÞû/~o0gÙø˜w¾Ëß›Ìö~'foÊÔ®³…éÓø‡+RºÎ§Oâ4¯à<¹a‡w/°b[m&µ¹ø‡b"¹ÿîÇËÝ;c+}W ³hrµ+¬áztþ!ÊÔ®³…éÓøŠ¿—»›|ÆVú®f½ÜÛæ2·Õp»0‡+RºÎ§Oâ­Jë8^?ˆ«ù{¹·ÌeoªávaËÝ;c+}W ³hrµ+¬áztþ!ÊÔ®³…éÓøŠ¿—»›|ÆVú®f½ÜÛæ2·Õp»0‡+RºÎ§Oâ­Jë8^?ˆ«ù{¹·ÌeoªávaËÝ;c+}W ³hrµ+¬áztþ!ÊÔ®³…éÓøŠ¿—»›|ÆVú®f½ÜÛæ2·Õp»0‡+RºÎ§Oâ­Jë8^?ˆ«ù{¹·ÌeoªávaËÝ;c+}W ³hrµ+¬áztþ!ÊÔ®³…éÓøŠ¿—»›|ÆVú®f½ÜÛæ2·Õp»0‡+RºÎ§Oâ­Jë8^?ˆ«ù{¹·ÌeoªávaËÝ;c+}W ³hrµ+¬áztþ#Tª…“ŽT!p‰#$¬¤$”›ó–ÝåÍÐ+~^îmó[ê¸]˜r÷so˜ÊßUÂìÀX… p•8O¸Ñ™¥j}%kó_w?öÜÇ—;¾dG“XÂNF}§Qä‘©µ’ˆS{6 Æ„þ@×j¬R¨´|·¨Ï~üxÔhn8»$Ô£$“w±$ŒÌùˆŒÏa »¢‰B¡Õp«,?E£¶ãVáS©ÌÆáSdZ¸4–«s^ö¹Ûy‰Žh{F£ýa'þu_ï1ËUêÕ p¦JUÅÚvÒMÉçR“³M$¼³ÔV5n-ŨîEÒW£¢S“â¸jJ7Q¤ìdGr;1ŠïÔ&áØ f¤Ñ,2eöRHmä¥;b+6½›­cÞžt—/ÄïÞ³o6ãËë=¯âopöµQ_YéûêëãÖâ)è±ßD¸ïÉV†Éèo6•,’j4’”’+Ù*=üÃf8 M¶uºtç™eÚ’R|hÖv&ÜA„ùËïæÔØíˆôWTê[yµ6£iÕ4²#+¥h2ROnÅ$ÈËy±Â\½rŒÞ§•žõû¶æ«ôéœòüQñ—%˜Œï¨Ò‚RS±&£3Q‘Ó¹™ær×»ƒ©ÒãÉÅ8‡H“!Nqš¼å¾¦Û#> ´¤ÌÒ›$üe­W3±iJwÕè¯Ì¦)˜Ú8Rq·KQ‘‡«\ˆíäô k¬IµK”×JÒÚ[Zœ)ÖÚV« ’J"±™¶•÷m!°§Ífkj6õ!ÆÏK­,¬¶ÕÐeÿ®ãÞCŒœR©O0̶’Ù¼•|¦á¨Òi#+i#¿Œ[†ûÁ•ÆJ£/ôJàÍ´4V3$Þþ1óŸý…ÍÎg3¾ðŸ3!»O>É8›pŒ¸hZO˜ÈËqÿøw!ð¡ÀU6œÜW&IšémqçÜ5)jçµÌì]_öÌñ]©F£ÑåÕ%™“YS«¶ó"-ÅûOp®©Ø²¥Yu§Ú¯ÉŠO9Á¶†a¥1”ç›JÝdõöye«˜‹qu¹€¤ª JLh²¥š$©DÑ‘¡,ºáð‰RHµ!'{sF­BTqŸLЬv•ÓÙSÍÆTw¬d¥š›J6Xù¯²û6ìú_áhø?ª"©™úôååÎò|ïŠñSñ¢Ô\š1–çýF¨ÖäbZ”*¬È²D(ï°–6É–ò{™Ïƒ#=¦E¸ºO«fVAZiÏU¤µ¦L¥h%Î9©”¨ôXÖff[Td{/ªö!ÙŽG‰hÜÕã§Ò"'—âëpsoOÄœÌùçúÎZYS'L’ãÒt‰’Y«ƒJMkÒvQÙD{ön¹ží›ñ›©T p2*2ã>“RxD ŒÒ[Ô$[º ¶–Òý¿Ã•*¸§ä°óŠinºÊUµš–f“¿ø¾5ŽÛHùŒn.!˜uÉ,¼ˆÏ51l©§£ºv±/´‹mÏ÷o3ÛS n¼ŒŒˆËiá‰VžÝ>2\RãŽ8–™i; Çä¦ç°¿´÷ –ÒÊ{ ’DìüO™´g#ÉŒr£›-æ‹zЗ¥m-¶#ꊪŒS8”ÄÄyËG]¨T Ã'9Ye9Û¥¦Ò–‰„ªûLõ#V„\®f¢¿ì3±l°…uuhÎFœÚXªE±Ii$d•ù."ût*Çnƒ#-ä5õSAËŠ® ¢ËntΦ¢¿6ï’7I¢Ê;ì%/aî;Ü·Œ¬92=Vm:¦nÄ‘9t¼qÆ 6Kʹ¸žIÜŠéý…Ð+p<îÌü{“]yóŸ§ô†woSr¯ä§ýÛj÷õÿóg>éŽ_báÎçŒ%¸ìé4:TH1 ÍûîGlˆŒìfHJu8â’•mÅéV“!ö¯QÏÿ6sî˜ç)tê‹ýÏ9Y[¥Æzkô }2zâ2Ù©ÇÙU=QÒEãÜ…ºII)K6‰ +¬Œ³â®]µÃÜ®Í:«Šfb:ÌDâ?9cDEUDL⤌gœSX¢Õ)•H›]ŠÍR•7ˆ*†§£7®CÙ X¦G[ˆD—˜åFXÇRæIN…)²†Å:dF Ël&—Á4v?FõŽú¬sSÃ'L‹W¤' ÍsBÆm<õ&$5­·iʦ2j&˜I~‘’˜½jmdz+Œ€Z¸†»É|9Oâ¼7-Ô—_ §ÓDv±êþ¦Û<»ßeˆk¼‘WÔþ+ÃrÝIpuðšx1$H×k¯èúm³Ë½öXéZ­¥Ñh†þ ­¿ƒÑŽW.-!çTäjw&>Ùš£kC' ÜWi+¥Ä£OŒI5R‚ʨ”3{VßÁèÇ+—Šk¦äj&>Ùš£kC' ÜWi+¥Ä£OŒI0¿d<ãOFB"<ú^tе¶h$°Z­kÔ¢3MÒIñIGu§fJ/… ©¹C[¥¿Æ T#7*+ºž§JB¬¢#+¤ÈìdGÒ* &TµÐ## Ëk ;Œe»™2 ’ˆÔåÑe2¢q•—èš[êrÈY<„Ø®D6Ù3EŸMÉŠ §á*Ä6c³Y*–x’ô¤GB_^‚[ꔢOéÉKJ´™\ÏjBÖV¿M§'6ê2ñ>©Õ'=6"ðíA¨>Ô6ÓD¤“É-1Ìž'–½FiYäŽ#ÓiѪÍ.±…ªŽbÕãØ¦³Ä\6• Uf”Áq›h6ÒÁ¶ßªä´êѳP Ú]n$ŒÈª¶õ?ŒN(,¡Ô’ÔãŠtÛlÈ›5x«Ø¢½Œ’«¬’d¢/Ž®û¨ÀôMÅx§+ÓcÎâü&¾ …i+ѪŪڭ{í¸…oƒâJ‘Šh4 ‘ž`©õ¼GˆmÖÍeTdµÌzV™+q'¸ÉeÌ0rÓ±†è?R§a·©õ•2Ë÷Ê:Ó#‚U*B”‰&e¨’—ÒÉ/bTHI[a»Æ›W}Ô`z&â¼S•é±çq~_´•èÕbÕmV½ŠöÜB¦Ë*+±q60ÍZŸ‰âpþìjÂq¦ç]‡«¾¢$É× ÚqMz“/p×dM˜òéºN ­Ð+piäœQ*m5ØÜ3\QI&–êȉåæÊ’5iA‘’-¤Õ+¾ê0=q^)ÊôØó¸¿ ¯‚áZJôj±j¶«^Å{n!ö¥VâΜºb›z%Q˜1æÊ‚ñ¹›‰A)H56jÔË©= Q£}&t~DÐY.›¤àÊÝ·žIŦÓ]Ã5Å’in¬ˆžQ¾l© #Q¶”"ÚFnJaj}ayõœ¸õy‰<õѥǖÃQ%.Î L6|"’j$¥}$°Óbï$Uðå?ŠðÜ·R\|&žLI5ÚÇ«ú>›lòï}–>/azÍuìNÆŸˆXF%qùgO¦;:#•2a$BžwÅ7 )35U­(2Ûãrbxﮇb»Cj7qÚBÓE$uáåëS~)¥¶Õ!×PK"4¥Åù&e¤Âü<â§;â<–Ò™hàÜ5ˆÐDJÕ©:HÎé"²Óc3ÔI§£3# Á¦â¬‚k Èv;Ôš­%Ö¹Iºœa÷W´Ý"ZTýÔF™ YªÉ;`ÖðN$¥Sñ]&€™OIsÑìÞFS*„÷§ÚÊF·‡Vf„­'úd•Ó¨ŒêÏ´*ú^¬WèôÙ&“6ŸS…J§a)4fÍÆ”âeßuk[®0µ Í$”™’-¨ÍC¡Ëj.0oSéøµ©RZ£0ýY–“6œ•4‘©¤+q›KTäéÞ–ÖÏH „i°õw•êøŽŸÅxD©"¾W ª$yíbÓý#M¶ù¾ÛG›N¹>“‹#áJ¥F|ª+ ‰Fªáפ¥-|<Ò‹“å²JÝYج§¤ÇÛ`V*3ƒ« ½+¥å¿‡¤ñu©ôºÕ"'¸»/«†J“vö©HÒwÓb ¼`U_üÑïÿ¨Ï_×ÿ4{ÿê"Ek[Ƙ:‡8àV±e™-)%ê-2áî=*QŒrù—X¤W0­}©§ñU!ü9 y³QNfå©&er\ãÊ\3™Ñ •`‹.©6åÇ"' ­Dkh,¯oñOis‘ü³"“N¡`¼/G¤Dn˜’ŒÓ ¶V$$¦µþÓç3=¦w32X×ĕùíÔK¢´ÒŸlÚ)º“RZSªÒÚ’Úµ¨ÿVäD[LÊå~ p8‰õP±I»(1¦ÕaTw™dѲ—Z#ÿ$ƲNó%¯cµ½]«Y£¬DÏHê¡â7ë³gU=c3Ò8º¥rQW~$؆êYyÖ¢®3ÑVfD\#JRŒŠæD{HÓr¹Zæ]ÄÙq¡BzlÉ GŒÃfã¯:¢J‚+šŒÏa8¬ó ²þ<ħä3Cí.3E¤ŽQ¶²Ò§Q‰#5m";XÌ̈v“N™TÂ2#Sãñ§Û‘QFÔIã fCn©›žÏ(4mÙãmØ5øuê®k‰«U1>SË?üWð¾&»ß5j¦'Êzõìš>3 Uª Aˆôä¼ýø“M“ØGÁ­ÆÒ•ì#?ÏafĪ~7ªRê”n-LÃð/q7[Ñ¡ÒK_¥Qšá[3sôd\*¹˜ÅMz©YÆôÑOE„N­x3hÇ*Z&2_ ë$¥9Ãp ³nl[·˜áðÃK`0+Ñ“þŸü% t úó ›IûÍsÖÿ£'ý?øKþèõæÿ6“÷›ýSô{ £ýa'þu_ï1‰%†d°¦$4‡ZYYHZnGý¤* ÜNü‡w2ñq­ÅÕ§‰$®gs±{ö¨]Í*¦£à±Þ9·6¦àöc‰áþ7cĦ¨áiª­8Î#–sÒW8Ž ®˜›ÕDg8Ìôçú½€„¥$$¬’+ 7ViWÿWã/ÞÜ>Ì|•šX›õqÞ.ýíÄìÇR&ôÿ¥WeIª×ÜŽïf€ñr³K~®;Å?½¸˜ù+4±·êã¼IûÛ‹ÙŒâ›Óþ•]˜üK^¸{IÖuh[!JEô¨Ëi_}‡Ðx‘Y¥¿W×ÿ{q»1òVif/êãºßïn?f3‹w§ý9ì‹k×pðÚ³K3?WÕÿ{lvcøVifê㺧ïmŽÌeðoz%תÝ©S Ô’ÊgEnBXtžh–W$¬ˆÈ•ý¶3ã˜|ÎÜžDט'VLú;èÿ°xÀóK5¹±ÝC÷¶Ïf?ƒÍ,ÚæÇs¿{löc}ÅѧT5W<5sš±/u¶„¶‚BIIn"Ððæ–oóc¹½¶»1üig6;“ûÛk³ö×½2ÏqkÔ÷d¸‘e ‘*;o$ŽäKIŒ|âS ÄY®4FšQï4&×<ÒÎ~lv÷ïm¾Ì=ô³¯åÛž¾Ìe´½éFâשïpï¥.ÜômöaßK:þ]¹èÛìÃi{Ònmzžær…GrIÉ]::ž3¹¬Ñ¶ÿþ ÖXeŸziæØCÁô³¯åÛž¾Ì;ég_Ë·=}˜moOÐÜZê÷mY§¥Ka¤êqÆ„•ís4™Øe¹9†²ó áÉBvM*“ Î4ㆅ­¦R…nÙŒÒv¹ð},ëùvç£o³úY×òíÏFßfÂÞò›‹]^ü›BÀÓqqÌ#†$Ö’ëo&¢ì.I-»N›Zµ'Jlw¹i+n-5ÒÇ×_äœ}ô³¯åÛž¾Ì;ég_Ë·=}˜µÿI¸µÕú9ËMt±õ×ù–šécë¯òÎ>úY×òíÏFßfô³¯åÛž¾Ì6×ý&â×Wè}Eê]Be6\ÆXuêd“• \3¥Áºl¸ÉªÄ›èÞq6;—}äFY¼´×K]~q÷Òο—nz6û0ï¥.Üômöa¶¿é7º¿Câ.‹‰ñJm*?eQâpMšx»JÓ©¶ìߊ“Ћ‘X¼TôÍ妺Xúëüƒó¾–uü»sÑ·Ù‡},ëùvç£o³ µÿI¸µÕú9ËMt±õ×ù–šécë¯òÎ>úY×òíÏFßfô³¯åÛž¾Ì6×ý&â×Wèç-5ÒÇ×_äZk¥®¿È?8ûég_Ë·=}˜wÒο—nz6û0Û_ô›‹]_£œ´×K]9i®–>ºÿ üãï¥.ÜômöaßK:þ]¹èÛìÃmÒn-u~ŽrÓ],}uþ@妺Xúëüƒó¾–uü»sÑ·Ù‡},ëùvç£o³ µÿI¸µÕú9ËMt±õ×ù–šécë¯òÎ>úY×òíÏFßfô³¯åÛž¾Ì6×ý&â×Wè¬ ôø™ƒ4±XA6Ë ’Ûi"±%)&ìDEÌCïËMt±õ×ùç},ëùvç£o³úY×òíÏFßfkþ“qk«ôs–šécë¯ò-5ÒÇ×_äœ}ô³¯åÛž¾Ì;ég_Ë·=}˜m¯úMÅ®¯ÑÎZk¥®¿È´×K]~q÷Òο—nz6û0ï¥.Üômöa¶¿é7º¿G9i®–>ºÿ ÐK¤a™x™¬G&!;=§ò Sä›êS¡.ðà¸BMˆ—§Q݃À]ô³¯åÛž¾Ì;ég_Ë·=}˜m¯úMÅ®¯ÑTϧ¦s“Ó Kq¤²·È•Â)´š(5pw4‘­FE¸GÒcïËMt±õ×ùç},ëùvç£o³úY×òíÏFßfkþ“qk«ôs–šécë¯ò-5ÒÇ×_äœ}ô³¯åÛž¾Ì;ég_Ë·=}˜m¯úMÅ®¯ÑÎZk¥®¿È´×K]~q÷Òο—nz6û0ï¥.Üômöa¶¿é7º¿G9i®–>ºÿ rÓ],}uþAùÇßK:þ]¹èÛìþ–uü»sÑ·Ù†Úÿ¤ÜZêý妺XúëüËMt±õ×ùç},ëùvç£o³úY×òíÏFßfkþ“qk«ôs–šécë¯ò-5ÒÇ×_äœ}ô³¯åÛž¾Ì;ég_Ë·=}˜m¯úMÅ®¯ÑÎZk¥®¿È´×K]~lÔó‡9iñÒóØåõ%JÒD†š3½ŒùÛýƒ]ßç7>[Mô,þAªº+¢qSe5ÓTf¦ü´×K]jñ5yq©æC¦½U’ˆêm¨QJ\yK4–Å[Mô,þ@ïó›Ÿ-fú ÇÍ—“Û^ëñ—Í=ÖtïhlU/b”Ñéç—5zkl×)ó’ýB ÐÛlÊmÅ™’5Š•n#>kwùÍÏ–Ó} ?;üæçËi¾…ŸÈ#L™~‰âC,ÈŽ¸òYiö+-§PKB‹ö¤öüðïó›Ÿ-¦ú wùÍÏ–³} ?4É8—èM6N¦4¦i”Ø0YÝH‰ ¥GûIW#ó·¿În|¶›èYüßç7>ZÍô,þAF#ˆˆ¦1Ñ ½þsså´ßBÏäÿ9¹òÖo¡gò Ó)ËôHçoœÜùk7гù¿În|µ›èYü¦L¿B*Í8ý*[ 'SŽ0´$¯k™¤È„`Ê,JfÂtZ³9P¡Q˜§ˆs¤²Fii´¹¥HJLÒji'· ¶üøïó›Ÿ-¦ú wùÍÏ–Ó} ?4Ï$UM5F*Œ¿G¸­'ã5]ÎüF Ü5ƒgÕé•j•)Š”êL‚•Oz|ÉN3¤FZ‘´ï#Ù½Hm^Sh4þw÷ùÍÏ–³} ?;üæçËY¾…ŸÈ"-ÄNb!6è£Î˜Ãôß–šécë¯ò-5ÒÇ×_ä™þsså´ßBÏäÿ9¹òÖo¡gò ¼Ùù?Mùi®–>ºÿ rÓ],}uþAù‘ßç7>[Mô,þ@ïó›Ÿ-fú yžOÓ~Zk¥®¿È´×K]~dwùÍÏ–Ó} ?;üæçËY¾…ŸÈg“ôß–šécë¯ò-5ÒÇ×_ä™þsså¬ßBÏäÿ9¹òÖo¡gò™äý7妺XúëüËMt±õ×ùæGœÜùk7гù¿În|µ›èYüæy?Mùi®–>ºÿ rÓ],}uþAù‘ßç7>ZÍô,þ@ïó›Ÿ-fú yžOÓ~Zk¥®¿È´×K]~dwùÍÏ–³} ?;üæçËY¾…ŸÈg“ôß–šécë¯ò-5ÒÇ×_ä™þsså´ßBÏäGsž7̬ÍÌ3Ã5\Ŭ@cˆ½$žŒÄsYv;YH±‘•ú9ƒÌò{¢uI™ šMl¦Ä£-&³33B’Eµ%Òq™u”G\“u‰M:ƒm+Jd¤(ÉF“Zn’32#¹•¶Žºƒ˜ñ©õ äõÀZ—Rª·!¦¦Üm˜ÅlsF•Ý*4¦R4¥I4žƒ#Ù¿ù™Ž)j­ÑP§$΢ÆT„Íiª,:a©©(KOâšô'bÔ£ÚIØ›mõMW3Éò£ܢ+77‰.ñI6c>–µ§R“ ÐLé+øÊQ­%¤¶–Û‘i;`b ,úÄD¨^mð‰8òÚƒMÍ>[JRot™^åm£±«æ'+ƦªIM‰=º¹Ê•*)¤––òÝe-\ü´*Cö¾Â³]49ƒV¤V*ѤRYqI¹2 ¨Š”Ý6Z3BJ’†wѨö™Œ©šóçª)Ç“›±¬ÛàÜN¯Ò)H®J‡>­R‘N‚Ê)äë:Úm…šÝw…I¶“áÒW$*Ä“3ý3 VªQ*T-šÉ”ªChqóI]DÚ¢S†_ä‘íÙ¼tsÉ¡`Èxz*æ*2çÍv«…412;ìÆm(;–\¦J2ñMI2¾ÒŒ?˜Ê]6›‡ŸŽºœ*{¾ç©òž}&úÞBçµ.:ÈÜ2ñxB+‘^÷Ó3\e¶"‰rs0F%‰Kåá0–x«s4Öñ°â´ºMÍÃF•$ÍZl[ok¿¦ð)qÈM5OeǦHf;l"c u·Q%´º‚^¦u‘¸I-£¦Äu¼1O¨·U…>l곘b%9QÐÃg r”Üg†' F¤”FŽ ¬´ØÏ`É£ãü5LÆïbô7Vv]Z§]J)Æm-ÆB&³-Âe|!›†jd’IEˆÎæ#]xÌBtÑŸ9rÑ05EüVÄ*›Lhé²Xeqœ¨FJÔN2ë¦ewõ‘!$M‘”£ZHµ6²-^$ÃUŒ:¦QWa–é©$Ú%4êФÛRJfÚËQ]+"2¾á—CªR‘ƒ+”’æ²ä©¦Åv;)tÖ‚md¥§JUÃùE¨ËO’wÙˆ(õä@82\ÖÔòåT&Cf;ï’´hBø%:hÒ³áUe+^Ò+Î&­Xú1˜§N\x `Ÿáâ5b¡ÇÊ* ·ýìѵ¨å:Mºé¶GrÓú6\;íÛ¤­ãæ}„qí7 RhQYÃPªoÜäù/MSé4º£JI-ðO%*O„ûâL®¥¬g|+š±ü¬¨ˆÏ›-p<ÜUˆhÌÈà˜¥Í¨³×9†[jq)pÙKŠÔ∌ü”«o70ù£.qzâ5,©ñI§#µ*ê¨ÆI¶Ã¨JÐë„n]¶Ì”ŸdI#;‘ìü9аL5Mdã2*‘™$©fƒRÜ$ëÔGdÞê+(ˆÒdg¹¬âõÇeÏ'W£†¶òÕ¦û/³Xœ5ZU3” *8.äè9 “ÆÑÂkV³FóÕ¦Ö#=ÛGoLÍšÔ k†¦GÄ•Œ;Kn”ÔŠsS”-Ùa¥-ô-M¸dGmZ¶Úæ>Of W°Ù6K8µÒJàš @Q­‹ê9ª#}:‘½63ÚdJIZÚu\èÛŠ:°ñ~YWi¸Ž«—.Ó™›-ªy¿:9H”ÓdÍ-ê%8²6•rJo²ö±à…ÍŒqŽ‘аþ8feMsâ»*¡žˆÍ):´É 6úø[´«-&i$/ÅQÛŠdMªª˜þd\Šb|€ZÀåú3TLã^Fã¹<ã¾ÂØ]ªÕ>¼© –™”önÃ-ØNYÏDdg½$V+s ¸Z£R©u¸Dn|–ÛÔ•$ÌÒ¥’OI•Êåݳ`êYá.Å×)÷ÇŸO5*ïQªiÏœ8É[ƶFó>?Ëú­&¡Qz—O™"Iñ‡“Q–„©Gb±™™í"±[öŤàDV°þ‘-U¹uIçÉ+qƒŒM‘ºk4'Q9©)lÏÆ±•oHêZánÓ\Ñ1çøSªíNr¬_oŽó6°Tœ\&]9òþôâÐjxÒ„›wM”«m"ýûÇø»Mi«œ4ÍQTfnŒGyÆ[£Þqj†š˜ŽŒWwÊtb»¸ÅÚjb;ä˜Ççù&1ùźy4Èb˜’|Ÿ0€!="OH>WàÉøóEðCá)ÇŸZnL´Ÿ)Vçæ".s2ݼ0úŸ”™cQ¤VÂ9†¹ÊCJ\„ÌRf–%RDF{5”DfWÌ#ˆaàØXÆM?Esç4®³ÖáÈËA+Y{Úö™lý¤GÒ w]èó ÝW¹sÿá~#Çø¿cÞ8N^­z|­–½ÿe„ÇÊÆ‘*\V°ËÊ‘3RŸgŒ2KCnkÐzMw3> ~)xÛ6–ÒÂì)ùeŽªšv…‡Ÿ~§OÓÆÛK­ègQ]$§5h#2=…«§ ÇÀò÷'±ƒœ¡>ÕrBT¦b¸âÂ$’¥’³Q ÊÉVÛÛa–ð°Ö·•9…E¢J¬ÔðĨðb-H}Ó[jÑ¥ZMZIF£MÿX‹I–ÛÛhêsO$ªØ/Rq8y+àuÖÉki(„µICi"Qšüu­&¤ê-„{B¹É¼½{0+Òc¹=Ú\8Äù‹+ðhæ"#2+iì"#>kaŒ2Ë.žÀuM€1Êê ¥™¦'©(á¡JæDf[ªÆD`)`!Ú?•˜õœ4ŒHæYRW”$¤²ià4¥ZŒ‰w#²ˆÉ&Zn͇kB—pjÙ’í¶q%–Ô¹*¨½Ù uÇ\B“eJI%Imgs#24ËÆH=€³je"‰–øŽ©ˆ(•ØõÊD棩ƥDT’²Ž¢'–n©F—· Œ¼dßr­£c,1óØWÝ;Xfb©\ O]»_Y7}f›m½­m»€qüÂ[ƒ2ÛãÏÔ¦Åmf…‹‘Bâ\ÍÁ;¥ð¾0[×CƒJ\y2¸«Å¡ÃL’"ÐhÔ~ø¤F[aŠ/0çĪãüET€ï eVL†ÒiÖÚÝR’v2#+‘–Ã+€ôç{¼Ëê}ÌÓxrÜ¥ÊÜ÷ßáx-\&û_ÆÓ»šÖØ8¼„¬=•’j¬Ò°lúíJ¬Q '´—Є\Ò‚òµëØö¹ì!¸<åÁáãò3ÝW¹ÞHä®*­‘­Ã®,Zä–É&¶Y'JÜfIY•ÆË¤pU_~XðßâçƒââôFf"¼L»ï¯Ø‹ü/Ùç?¤Äºšm~es×øÛl#€ˆ­<L¯© ½îgÐC#NU)ØZM2CIbœ´œÒá :-¦æeûl¯¬8)†¶Náõö|nºâ˜»¦#9ÄÏój§—OÅȹÀSLΉǟOà 6!Š•K»NÛhu†ÒÛÚ´¤”M¸“]ú.FwýãQQIÓix‡PqµU«2ê’K%šáÅræñ’_èþÁ[ÈÜcW'œ_·âš©ÄÓççõòó«W,~Jµp˜ž~^_Ú0¼ä2í+bLIT–Ï"rrZR â;/JA¦÷#±(˧Y[xãá<Ô|§Ëù¸–Úk´µ­GbJIçÌÌÿe…S+xÖÈÞc¡OªsóÏ׬Äôüg‡ÄsýÄ;NèšlÈÙ‡*¦ói(•¶¨ÎÈõ’m*ØGrÛÒ*çÆcã ñ¶kŠëš£êÇià шï8Ëtb;Î,ÐÕSÑŠîãNŒWw»CMLG|“üã!ß$Æ?8·O&™ @“2BO˜@“æ'¤A éÑîbÅ”¼#š ʬ>ˆÐæÄrß^Ä´jR•(ùŠè"3æ½Ï`«€õPÈj=VÄ«ÁjˆÛK]9ÈfKvAïEÉV#=Å¥&w¾òШ’1·rޤQdÂ9ª»ŽÏ7䡤Ço\ƒ5(Ôeb$º…fë;€sÿû§ÿþ#ÿ÷ S¹Æ|³ËÌݨ‡NQRIâtÔz‰|µ^ý7Ú(N‘=Üã6—RÊlU…MfµX‘)/•-u„¹¬él‰)t¶– 3-ÛHŽÄ¡×MÉÿ–Ô‰Tê\ tØS¶"U—9ÆqTHmÕ©´ÙE¥_¬³;™™î3ò@õ•&R;¢%÷Ke(KQ™$‰3VýÈIbK s¹íO“XÈ̶®ÓI©4úM),Mu§ôN)¸è$Ú÷3Ô…ض[m….>æjí:±V­Ô¦7‰©ÜU™n™Pá%Ä‘žÂ3'LÊö¹¦Û̇Óä­;`z•gbø|£b*TX¬¤*û/¨‰G~{’W;žáL ãº2CíåRÇC«KNQ‰KI‰FQãþå+ý¦.‰2£Fî«am¥HÁœ$µk_5i.“²Tvý†<>а¨•,9Ü£èµv <èµÖ’ód´¬’f¨F[RfG°ËqŽŸ3iõŒMV£cÜ‹!Ñ0Ô|:ãJƦ:¼s6¾¥„fFŽ’"?)€LäysCÅ%ŠÄˆ•rã,Ôª#PØ'n:Ûf¢I8dIQ9¬ºý]e‡Y¯çÚÜiHCÔ®6fV%§ˆ>“2éñ’¢þÒ1ãÎa:¸$ž9¤jÄ'‡¾ ML›×Å•úª25$­{ÜìDg}ƒ×•82]ÃRÍšŽ¬aÔEQÄ©2ѵ%gÌ­'t¥VÝÁïkCdDHŸ–«ËÊÃä—èu&j{Î2—úTÖp¿µÄô ªN9¬×û¦§JÂóhM1"鱩¾¦™}„-:’Ú•)K#Zvn/Üu¾Ìظ3ʧÐ0« b‘Ü"¸©‹RÍ Y™ijÖI‘KaØÍ$fF+p ÌŠ]7Ôòê ü©˜uÅb(ÎÈÃŽÕŽLH¨K¦j}}("é+œÜ[FäŒ3Ýi2»_Tx´üAN&iRœyTâZŽGÏâù I^×¹[xò9élãuêLThð+7> —c°¼JäùN9Â%Jy 6ÏÅQ$ïu¦×3µÎÇØc)RKºÿÄ'Ü(üŠò¸=G¦æ‰w;~Ý ú¥Ð9¯ræ4Ûn«ÚÛoaýãLŠ0l¶"âZCÔ÷I©JJÒáû)i3+•Ê÷+—Hôž^âÚV9Tà“k‡„¸°ž"Úñ¥Ô]ÏßÂ8EþM† j¡’ÙDõdøW׋[mÅ;´Í£’ù,ŽüÖ$ؘÄ9mŽpþn¿YÃ’áÓ\ÓúešLÑ«v´‘š‘{‘xÄ[NÁ…2ÛbªC•j•6 fdo‚Q–òI(È×oòo´zS-R*ír”¨ŒÒa©„¬üT¯‰-EoôÉ?¼(Ppä¼?”´ U[‘R£?ÄåÓê Œq(èqåø†Z”£3-»7ÜŽæÈ/6ã.­§P¦ÜB+BŠÆ“-†F\Æ/~á/‡CúgÝ!Mã(OSquf&Zæ={ì9!j3SÊKŠI¬Ì÷™™_÷‹“¸KáÐþ†™÷HD÷Ðå—Ã^<ú&÷§ ðÐå—Ã^<ú&÷§ !.O¤pU_~XïzGU÷åá~d½Ÿ• Ã['pÙHÜ5²wý• lÆ5ryÆÒFã¹<ã«aF¶²Vñ­‘¼ÆÊVñ­‘¼ÇVÊmsã ñ˜øÃ|t­«TÃtb;Î2ÝŽó‹´4TÄtb»¸ÆS£ÝÆ.ÐÓSß$Æ?8ÈwÉ1Î-ÓɦC$Ä “æ$ù„ éBz@@ é'¤@žay„ è' @ !H@’` æD y„ža$„ !'˜@ža````D »ËœÏªàzF…‡êêKÕ+”b­Óq:lM™ÒF‚Úv2?(Ç;efM]ŒoÑ)4=2< 1J…ÀÇu7Q™­=Fd«ßq&Ö2¸ùãüÈÄ8Ítòšˆ4èÔã5D‹NdÙi¥™ÜÖEs=Fe¾ÿÙk˜ã@‹s—â\2ý qSD´¡3¥F‹ÁȘHòIÅ^Ç»˜‹£vÁ?91†ìÑ`¦™! eD¸¼#ð‰wÕÁ*åkÜ÷‘ônØ+ ô’ó²d9!÷ëάÖâÔw5(Îæf}&böîøt?¡¦}Ò(¾»„¾èiŸt„IqY|5ãÏ¢hßzpß Y|5ãÏ¢hßzpÂäúG¶éŽH”¦KŒEm^*^Õ¾÷Ôâ-ÍÓÏ»Ÿ²éWß–< „œ]—¡iÕf#8„­ãV+Ÿº–×´ £à«xÕŒAû©lû@Á‘¸kdîAjb~Ÿ¯»r×ýÒÙ=íÕXÄ¿º–Ç´ ãåÞÝUŒUû©qý jdn1«“Î:Vi‰ÿì©×Gã-ÛñòÏõ«¿÷Rãû@Âz>V_Ƭc?ÝKíž•¼kdo1Óµn'ë=åRºNì|¥ýjÆ7ýÔ¸¾Ð1]”­XÇ_º—Ú"øÃ|_¢Äužò¯T;#äß=cþê\OhîGÉ}·¬fî¥ÃöÅ:1ç(áãÕ=妧pä|’ç¬fî¥ÃöŽä|ŽÛzÆbþê\/h#£ÝÆ-QÂǪ®òÕT»ÕÇÈ«m¬fGªá{@øñ|†¿õÆez®´ õß$Æ?8µO º»ËTÔ²Ž>CuÆez®´âù וê¸^Ð+c2ÚG®®òK,ãä7\fWªá{@Ž/Ýq™^«…í¶>a´]]äÔ²ø¾CuÆez®´Èn¸Ì¯UÂöZm#×Wy5,¾/Ýq™^«…í8¾CuÆez®´ Ôiº»É©eq|†ëŒÊõ\/hÅò®3+Õp½ V€HõÕÞMK/‹ä7\fWªá{@Ž/Ýq™^«…íµÚG®®òjY\_!ºã2½W Ú‹ä7\fWªá{@­@6‘뫼š–_Èn¸Ì¯UÂö€âù וê¸^Ð+BÒHõÕÞMK+‹ä7\fWªá{@q|†ëŒÊõ\/h Ò=uw“RÊâù וê¸^Ð'‹ä7\fWªá{@­6‘뫼š–_Èn¸Ì¯UÂö€âù וê¸^Ð+^‘´]]äÔ²ø¾CuÆez®´Èn¸Ì¯UÂöZm#×Wy5,®/Ýq™^«…íÅò®3+Õp½ V HõÕÞMK+‹ä7\fWªá{@q|†ëŒÊõ\/h¨Ò=uw“RÊâù וê¸^Ð'‹ä7\fWªá{@­ƒiº»É©eñ|†ëŒÊõ\/hÅò®3+Õp½ V HõÕÞMK/‹ä7\fWªá{@Ž/Ýq™^«…í¶æHõÕÞMK/‹ä7\fWªá{@q|†ëŒÊõ\/h Ò=uw“RËâù וê¸^Ð#‹ä7\fWªá{@­ºÒ=uw“RË(ù וê¸^Ð#‹ä7\fWªá{@­ˆ@m#×Wy5,¾/Ýq™^«…í8¾CuÆez®´ Ôiº»É©eñ|†ëŒÊõ\/h/Ýq™^«…íµ æ ¤zêï&¥“Åò®3+Õp½ OÈn¸Ì¯UÂöZm#×Wy5,¾/Ýq™^«…í8¾CuÆez®´ Ø@m#×Wy5,¾/Ýq™^«…íÅò®3+Õp½ V¼Â 6‘뫼š–_Èn¸Ì¯UÂö_!ºã2½W Új´]]äÔ²Ê>CuÆez®´âù וê¸^Ð+bHõÕÞMK/‹ä7\fWªá{@Ž/Ýq™^«…í¶æHõÕÞMK+‹ä7\fWªá{@q|†ëŒÊõ\/h¨Ò=uw“RËâù וê¸^Ð_!ºã2½W Úh`a´]]äÔ²¸¾CuÆez®´Èn¸Ì¯UÂöZ€m#×Wy5,¾/Ýq™^«…í8¾CuÆez®´ Ôiº»É©eñ|†ëŒÊõ\/hÅò®3+Õp½ V HõÕÞMK/‹ä7\fWªá{@Ž/Ýq™^«…í¶HõÕÞMK+‹ä7\fWªá{@q|†ëŒÊõ\/h¨Ò=uw“RÊâù וê¸^Ð_!ºã2½W Új´]]äÔ²¸¾CuÆez®´Èn¸Ì¯UÂöZ€m#×Wy5,®/Ýq™^«…íÅò®3+Õp½ V HõÕÞMM¶.,8U÷Ë .¬º1%²aUD6™*WžÔM™¤‹^»øºnfw'p—áý 3î¡EõÜ%ðèCLû¤,Äb0‡¸Æ‡,¾ñçÑ4o½8o†‡,¾ñçÑ4o½8c“éWß–;Þ‘ÁU}ùcÀx_™/E§åCG#pÖÉÜ6R7 lÿeBã[#q\žq´‘¸Æ®O8êØQ­¬•¼kdo1²•¼kdo1Õ²§[\øÃ|f>0ß+jÕ0ÝŽóŒ·F#¼âí 1®î1”èÅwq‹´4ÔÄwÉ1Î2òLcó‹tòiÄ 1$$ù„ >aBzDžzD é@'˜@žaz èH@’$ƒ˜9€@‘Dža'˜A€ !H@ æ'˜@‘D ë¸KáÐþ†™÷HP¢úîøt?¡¦}Ò$=Æ49eð×>‰£}éÃ|49eð×>‰£}éÃK“éWß–;Þ‘ÁU}ùcÀx_™/E§åCG#pÖÉÜ6R7 lÿeBã[#q\žq´‘¸Æ®O8êØQ­¬•¼kdo1²•¼kdo1Õ²§[\øÃ|f>0ß+jÕ0ÝŽóŒ·F#¼âí 1®î1”èÅwq‹´4ÔÄwÉ1Î2òLcó‹tòiÄ 1$$ù„ >aBzDžzD é@'˜@žaz èH@’$ƒ˜t8 ÍÄÕˆ‘Š=E¸IDggG„o¡…,É)5mI\Ó{¨¬Fg·qäU°sÔöq;ÊzcŒÑ'œ&ßM=ÃfB’î…jp®†ŒˆÒvQõÙ«šucÉŒ×LN¨ ÉaªÛ©Ôhµ˜´ƒ4³JÍ B”E¨ZRg´¬F¢#3"¹\m±¦«P±u^ƒLbmm´´·äÇ„«!+hœº‰&­%´Êæªf ¼g¿ÜéÎ2äD 5²O0ƒÌ À$ óÌ H"õÜ%ðèCLû¤(Q}w |:ÐÓ>é’ã²økÇŸDѾôá¾²økÇŸDѾôá„%ÉôŽ «ïËïHાü±à+5ŨÑÿ-š¡Qª 'ɶ´­©$lìBtj¹x¤F“±™(y¬SÇDç4óÿŸtGŒyòÿdˆ PYO0ƒÌ À$ óÌ H"õÜ%ðèCLû¤(Q}w |:ÐÓ>é’ã²økÇŸDѾôá¾²økÇŸDѾôá„%ÉôŽ «ïËïHાü±àé’ã²økÇŸDѾôá¾²økÇŸDѾôá„%ÉôŽ «ïËïHાü±àé’ã²økÇŸDѾôá¾²økÇŸDѾôá„%ÉôŽ «ïËïHાü±à®¼AŒ3¶¼ìdÅr¥ëÓÂw4n8ÚÍ%ýš­û†¨¿\ÄÌcËðÿ”áXвã×q¤üGÃÒ§VéÏ8ÄÈì© &ÚÍ ÔåôŠÚµXùŒÄf\ã|¾’Ä|a‡¥RŽAµ©.6å·’\AšLÊår#¹\XXRLÊgqæ'›BqÆ&ÌÅŒD«:É™/‰}H%m$›¦eûneÎ2LÊr>`ǬºëÐ)•Zk”NÌɹ+pÒú[3Ýú3#2/ñŒùÆß‰VsôÎ…K…è5ŒO^B SÞ¨Ô¥¨ÒÄvJê]’j?ÜI#3>b#N?ÉìÊÀT¤Uq^•O€µ8Á:ÓÈJq(ÛR´ßü«.Ù”ùE*·âHJT’u‡ "RM*+–ÛLÈúHÌ…êÒèï÷)âBÀ3ª„–_¦/±XA­Õ*È8ŠB´“|1ÈӬȓsÙcÎåUS1ŽD(!ÓbT¡à\-Œ%Ȇ¸›ñ&ÚZÖø³¤ÚøB4‘ÌÊÖ5lßmÙµÀxr…^É|«ˆ©ü©aüU[:v£IL[ÚÒÑÛmŒÕ{sÛmÊä"õχ‰ýò’#/%ô•Îü6{ø3àÚ¥¿I„™T(Ç©æÉ&… ÌÈÖ‹ëÕ¿vâ½ôÙ½Z¢MÅÕŒœÂ¹U†)ëf¨ŠE& Û*MC†D„£ZÞ3ý!9c++q,Žça{3§S YuÌ—Å4Œ +IŸF\ÔJ]im¶ó†é±Pum²’#l‹Yg¨¯b+XÕ¸za¼WÁ˜ï ÔØËEb¬=‡æT6 ?ØoG"35JZÌœ"Y’MDgØcaZªS¨¹>©U¡F®Å—1J%Å!§UÆ¥5švšIF•[Ma5qS8Ó_déx„zÇa|˜{Wª:…†%+;EžÕ “ŠÄ¸è‚¹v4‘™’BQª÷Ú{v•¹šmO fÆÇô•e¦®áÊ$ŠÅ*u.1²ú …$¸ ¿éT²;\È·ËØËnãÏåÍyÐnqN®áŽJåȉ£}éÃ|49eð×>‰£}éÃK“éWß–;Þ‘ÁU}ùcÀx_™/E§åCG#pÖÉÜ6R7 lÿeBã[#q\žq´‘¸Æ®O8êØQ­¬•¼kdo1²•¼kdo1Õ²§[\øÃ|f>0ß+jÕ0ÝŽóŒ·F#¼âí 1®î1”èÅwq‹´4ÔÄwÉ1Î2òLcó‹tòiÄ 1$$ù„ >ag„ëR°Þ)¤â(-²äº\Öf°‡ˆÍµ-¥’ÒJ"23MÒW±‘ÛœƒÖ¥bLSVÄS›e¹uI¯M} ‘“i[«5¨’Ffd›¨ís3·9a éˆÎGkZÌìQQ®á:ã.ǦÔp­*-.œô4©'ÁGÕ¡KÔ¥jQê2Vä™lÓkŽÖÝZ¥Ôk•¹u—*¼§9I×).©O¡Ä¡.4fo{Úô”$Ôj;\Å( µDùL'.ûæ¾$ÂX–¹V¢Â¢· ¸âÕ>ˆä"]5Ä)f¢l™3Ø„ê2IÜ‹eíp̬×Ęꕉ&‰C„á¼Å&‹¢ÅK¦FFá ŒÌÕc2Ú{.vµÌp 'áÑXó2Ý`ŒKP¢&!¥µ éQu’[–Á<ˉZÚÒ´Ã#JÔ_¼u¹œX‹a‚ãa¬7ESå!øTqDnK¥¹nm3Q—ö‘^Çm…jç¤@MÌê˜óFAxa<Ô¤Ñ(,l]^¦ÊÂmKàx¾eä¸rÖN>Óª]@‰Öõ”ž„¶™ÚÔxtE|̯¼wš¸[Ñ£Ñcâ –¦3-3N.ÀÑ¡¡Ù ò]]ª&f¢Þ[H¯cµÈ­°ÄÙÙ‡ëÔí+r#UÔ¸î=]‹€"7Q}L8‡[5»Ê6ضÐ{E²Û‡kÛÓûÂrô½[>píB=q¾:˜k¯RäSªr"eüfŸ’O$’§–áTµ„WµÏNÓºOe´µÌ×ÂÕ| +ÉÄU”@“D¥ÑVãx=²t˜§º·QÔ̵™¸zŽÖ2µ‰;Å=1ËýŒ®|;0®Áp°½b˜mAÄ)Ä1æ# 1Æ%,ð$W:ŽƒoNôšvžó¶Á¿Æ¹É†±6¨PÓZ—Bjª¤ª«"€¢Æ~¡c¿é—Ê&j¹í;ZûyŒÈyäLئg>ÞÆ^ŠÄÓ†jØz§Jn¦ºLмuF©Õ)¹}‰³W–‡*Œ•Ïb!ÎcœÍÃÕŒ£c&O-K§Æf%:}C°ÄÆXmĨ›L¤ÍpÛI$Œ¶6z‹aï50)ƒ)æ'˜@Ü€O@=IBȦÏLšÜêlÙ0¥7~ øî©·r±ÙI22¹—öÇ æU1TLLy&&bs ʽZ©X”™Uz”ÊŒ„ NÊ}N¬’FfIºŒÎ×3ÙûLa¦šh4Æ ª©ªs2‘D ža'˜A€ !H@ æ'˜@‘D ë¸KáÐþ†™÷HP¢úîøt?¡¦}Ò$=Æ49eð×>‰£}éÃ|49eð×>‰£}éÃK“éWß–;Þ‘ÁU}ùcÀx_™/E§åCG#pÖÉÜ6R7 lÿeBã[#q\žq´‘¸Æ®O8êØQ­¬•¼kdo1²•¼kdo1Õ²§[\øÃ|f>0ß+jÕ0ÝŽóŒ·F#¼âí 1®î1”èÅwq‹´4ÔÄwÉ1Î2òLcó‹tòiÄ 1$$ù„ >aBzDžzD é@'˜@žaz èH@’$ƒ˜9€@‘Dža'˜A€ !H@ æ'˜@‘D ë¸KáÐþ†™÷HP¢úîøt?¡¦}Ò$=Æ49eð×>‰£}éÃ|49eð×>‰£}éÃK“éWß–;Þ‘ÁU}ùcÀx_™/E§åCG#pÖÉÜ6R7 lÿeBã[#q\žq´‘¸Æ®O8êØQ­¬•¼kdo1²•¼kdo1Õ²§[\øÃ|f>0ß+jÕ0ÝŽóŒ·F#¼âí 1®î1”èÅwq‹´4ÔÄwÉ1Î2òLcó‹tòiÄ 1$$ù„ >aBzDžzD é@'˜@žaz èH@’$ƒ˜9€@‘Dža'˜A€ !H@ æ'˜@‘D ë¸KáÐþ†™÷HP¢úîøt?¡¦}Ò$=Æ49eð×>‰£}éÃ|49eð×>‰£}éÃK“éWß–;Þ‘ÁU}ùcÀx_™/E§åCG#pÖÉÜ6R7 lÿeBã[#q\žq´‘¸Æ®O8êØQ­¬•¼kdo1²•¼kdo1Õ²§[\øÃ|f>0ß+jÕ0ÝŽóŒ·F#¼âí 1®î1”èÅwq‹´4ÔÄwÉ1Î2òLcó‹tòiÅË’eÔ20Ü¥aªun·Nrœå0œ¢19ô¯)/Im©J#B7É63"#31MïðF)Ôœ¦Æø^¢åTªX‡Šñsb#ke¾,áºj7R¯Fi;$ô‘jñ¯¤¢¸Ì!Û×ð}&³IÁ´ìS Æ•zÑ@[4ÈhÔqV-¼ôT­)m\)¥;4ž“3²Œ¬8\Uƒðv¬V¨³qÄÇj4©œ¡Š.¦ß"x½ 7ŠÎ%¥šTD“4IgrPÑåÅRBÇÔåYRÊ6{3(¬¥ÇÁ(–I$©I/ÒEs=„fv;Xþ˜ò§E¯æUbµúƒtšMÉf·"£Œ4‡W­eÁ“†•u(‹Ç-V#3MìQ18Ê]Î>Ëys3×áv$ÒaǦDLéÒ¢Á8Ñ£ÇDfÜZÒÉ)f^Q‰G©G}—ÙÊT0lðdüW…ër*irb¢Ü¨%æ8[“k"'JfF›ê##¶ÁÚb|Ø JÎzþ/¦Ãª?EÄ”•RêQd4Û/¶ÚÙCJàÍ+ZL˃BÈÎ×¹¦ÅmGÊ¿Špý/+XG *«4ëÒ#¹>]B3qô6ÂM¶†Ðã—=J¹¨Ô[­a«ù ¶&Ë|†åaÎXÌ ŒC¯Ó©0êhZÜŽÛ·27—ö¹Ðk32Q[aácå}ϹUW#PcÑÞãÑg_}.§C«òµÒvÓbÚ«ìc|S‡*ÙM‚0½9ʩ԰÷ãüFÐËœeÂuZN©^"ˆ’WIj#ÕâÛIÌjòÈësû `ùñ6ŠÕNNiÉ1ZÌZ#% ÒúM^1¤ÔZmK;¨ÒD®v»–´ª?ÄXn«ˆ*ŒD Á9R'!³5ÐI$·Æ´¯„A%Z®f¢#Im2ûæs fn8•[£5],E\\Hñà<Û FeâKmÞ7 ÖFI±]-ØÕs;k8ŽR²÷ Ñ«·©ø±èˆf´o‘¥åÇŒµ¦6´žÒ5jRŽö3ЃÚZLc¢"0r!="OHY@ƒrâ´Ó`Ô+X’T¢ŽäÖûQ#ÇQ!D––F…-K;ÝDv"±o íi¸¦•QÀ‘0f)DäF§JrM6|&Ðë±øKp­)¥©$´(È•å$ÈúHì1¨}&W!c ; ‚œ/Ng»Ue¸³iÐÛŠ‰ ­+I´´7¥¸ChÈÉ;¯´­ãlÓ•ðebІ ¥b…MÅpPö¨œžhŒó¬¤ÔãM=ÂE¥DZ›I§xÕHÅ hm`Úk«z—QEMÊ¥E†Ó&CÈ4èA%® ¤é¾j¹Ìöéaæ¤æG2¨ñëg_–r_bžû-hÒ_B’µ›Ä³S‰-k2O“Ý´c9ŽIa¿ ÝË UM§•EŒbp‘1Dƒ`â)Î NIK-j3ñŒù‹rH‹æy_.(§àº®(T,W9 éˆTó\f]y$¦Úuî”J2Ro¥µ·Œ?u8s¼¸~«Ë\½Ë¸£|[Þ¸ _ «ÈñõhßâÚÞ0ÞKÌ<%WÌJveV#ÖÊ¿ã>ý=†Z8ÒdGBR…“ƲSi=3O£-»D4rŒ1–Ѫ8[Õ«Ê,¼'!¦gÅ\*%¸mÙ+'õêBËI¦×Óã(Í<Ž(‡A‡"'¹êäš´w£*D*ãëQFk#±U©*2ñí¼ŒvôŒyEwæ<ë•2­ã LÊAņÚã¶¶žSå©Ju*²Ö³IÙ'¤ˆÆ¾’¬FTç3”3 <Âó<*ª"11!Ìä„§9mÇdœ#IšÖ‡ÔoXŒì“JÎÚ®WI¢j‘V€Ü„s0 H€Ì;Œ©U*Šü¬iˆ)1ªÔê[0Ü)-’Û’ûª2Òi=‡¥¤¼¿Ø¤£¤püþ^3§Ñð=‰†M¾…®EMl= Cj»©¥ºnž’JR‚-)¾“QùZK¹`ms,ä=žMáL*†U¾´M£¹äµÅ^I¸JØ^B–]6@æjøw ·KªÈ£c>;.›¤ÕTŒRÈÜKfqÕÂ,ܶ¢U”H=$gm†,J~rÒ§àªä¦&?‹ð»Ž ‰šdxÐäEpÍÅÛYhÒÙž•V¾Í;MB¶¯»…;­K•)eÀöPÊ`£V£±¶â¸e›¨’DFg¦ö2Æ\¥+C1pD íK ÕeŒ9F, §Z©Sé--¾á¹ã)¦Í´šÖ«$‰;wX¬[+èX2"…PÅnWêð¼YmÁfJéi9rd©Í `ž4”‘™™º[-Îv+ Ìè¢ÅÄAº|ºô¬3N 7C­SfÓÚàå´„ØÜKdù§RÊÅ´ËN‚Ú²3!¨ƒ˜øb‰G«á<+WÆ”JÙé©Ã™(jd7tšÂ’—ÈžhÐHÚkAÝ%r;\ñQ›NWÔê‡ ÓðôÖêPñJºdÇ6v!F—‰Ä]ZTÞ•‘ŠÖ±˜ìr§àÅRó<:¤|B¨xVséLúm©·›M‘";†§DWW›35 ìv-:™ªý#áŒA¡ˆqÐÜuk‘\˜µ; I!Ä%µ¥’Ѱ¬j33¹™‘VÅye…\ÅDرÔW販m¨àG¼$½nnô¶±«£Éµ¼k”ΩQ€Ú€ÀÀÀÀˆ _]Â_‡ô4ϺB…×p—áý 3î‰!î1¡Ë/†¼yôMïNá¡Ë/†¼yôMïNB\ŸHાü±ÞôŽ «ïËÂüÉz-?*9†¶NᲑ¸kdîû*ÙŒjäó¤Æ5ryÇVÂmd­ã[#y”­ã[#yŽ­•:ÚçÆã1ñ†øé[V©†èÄwœeº1çhh©ˆèþ`Cv¡R•!.Éy  ÖfI%)DE{smÓ£3í…é?â$]¶ÓS¼k¹Û3%Gmøô£u—RKmÄG¤­&W##&¬deÎ?ŸÌÓ¿õ2ÿ…“Ù|ª¿+ dý¥žÍB[ŒÒ¡1é'µ.K¬GI©ÂBÍ)#t”vJŽÅ¸Ì6é%YkB‹‡Ÿ¤'\iK›mËuL°¤¬šBöº…$ÈÐZlG{ÅÈŒ4åàoÌÓêeÿ '²àÙš}L¿ádöCô&69¡,êS¤U$Tæ&ºÌÚdˆ°…»!²q|)$Ì–l%‚Wˆguˆ´wÇÁÉÃók¯Õ‹†cÌ)P_aæyhCD¶V‚q$¥8‹¦Ö;ÞÄfR‡çǃfiõ2ÿ…“ÙðlÍ>¦_ð²{!îüMš”š,c¨!ª”Ö–í-¢§•kRØL¹ŽÇáÖFÙ¨Ò|ÍàÒjSDD¥í¶ŸŠ(sŠi·-lªf¥KD¸îF[ 8Ù¸…­.¥&’ÒJ½Ëa¥I;)&Dœ~ ™§ÔËþOd ™§ÔËþOd?I™¨C"«DmU&!H„‰&¸ÉtÔH%™ ÖÙÊ÷Ašo䙕†»/«ò±.å9ÔöiòÛ6ñÙ’rJãJv:.jI›F¢ºRv=À?:¼3O©—ü,žÈ<3O©—ü,žÈ~Žaêï+Õñ?Šð<‰RD|&®THò5ÚŧúF›mò/}¶-%cb=^:ªxV;496©ÍJEP—(Öë¤ÓnroOjROc†¢IÜÒV2 üþðlÍ>¦_ð²{ ðlÍ>¦_ð²{!ú9ˆk¼‘WÔþ+ÃrÝIpuðšx1$H×k¯èúm³Ë½öXãNÄq8³xv¨ãšǪ̃ñFY"µ®¢mÅ™ÎÄH2ñNæ[.œž ™§ÔËþOd?“îoÍ;$ÈÿÍäöCôsâbŒ3²ˆªŠn8ó.4nÉ.4êÚ^•–ŧRiQyI±óaWâa¨3+U)2cÓá´nÈ[,¸é¡£º ‘¨È·™‘l"3;ˆ™Â_ŸþŸÕ'ü<žÈqØÏ.1.Åt¬5\i˜Óê¶ìr3Q%n­¤šˆÒJOŒ…sn±í¸÷…6ð®7£WšÁ¸Šléiî<ëÄ’ÊYñOO鄤”fGb½ÏJŒ‹Å;yúá§+¿èå#ÿ2èDŽ:?s–gHa¹é|3.¤–Ûˆ%IZL®FFMXÈËœ~ ™§ÔËþOd=ôªü¬5“ô ”{5 n3J„Äw¤œvÔ¹.±&§ 4¤ÒQÙ*;áö¢ã¥"F ‰‹áÓèr(1Ø•-ÈÕ—‚{„Ñe›m«]ÚUÐh#Ú‹_Q CóÿÁ³4ú™ÂÉìƒÁ³4ú™ÂÉì‡è„w…¥ÑjUr¨¹-0ˆæ”ØEu‚2ºMM:„¹ã“âøÜ׬ň SåI]2ŸI¦¸˜ò`¹Ö$:ìÞRB\-Hmƒ"QZÄF^Q™‡<3O©—ü,žÈ<3O©—ü,žÈ~Žaêï+Õñ?Šð<‰RD|&®THò5ÚŧúF›mò/}¶- 7¹5Ú]54m5É5GàMÆoÄÒÇŒëæ½24)•'ajáÚ/UÈ<àÙš}L¿ádöAàÙš}L¿ádöCôF‹Ž°µb¶tzuEnÊ3pšR¢<†dgg —”‚mãIï&Ô«m¸âòÃΑIf«‹k-”&ð-±%å´„H“Ç8w¦_ð²{ ðlÍ>¦_ð²{!úIǘZ§Á&4÷ÛuÙ©ƒÀI‚üwò›SˆJÛq Z IIšT¢"=„FfdC`Ö$¡»" Ô[yÉòŸ‰š#Y-Ö5ðÉ3"²t›k#3±\­{™‡æú»›³E>U!Eý±¤öB<3?ªOøy=ý%Ä*R š£J‹q‘Ø÷¦ªùá€i8¥Ü/PÄU«MH(Ç©sTêœQ–”¤’ÑëÕrÒi¹(ŒŒ®FC”¼UŒ2?a\/?V !š|¡O­Hue¸†ÓmhIêZvÞ×>cø'1ž5¡·WÃÑš–Âït¡-mÙJOŒHmDW4*Ûy‡ª{¥d>þRæÉ>óŽ“i¢¡Ôg¥„S« 3ÓOuÆ¢GrGÝu¶Í-¤Ýqã%:¢ç+Ù6)CÂ^ ™§ÔËþOd ™§ÔËþOd?D+˜ï ÑkEG©T–Ô¢àøSLWœf?vo†u(6ÙÔ{¸E&üÃ>&$¡Êq¦Ù¨·Â;=êshY¹ ÍÆÈ”DfdM­WÜdW#223ÎÌÓêeÿ '²ÌÓêeÿ '²¤P«ôytkÌÏl©Œ“Æä—ÛBÊ”—f¢/ ñ·ÈÌŒŒq˜Ó1©îåÞ3—†gL‹[¤áù•å2˜ôe‘¡•šB$6’u²-¤JNâ=à¦_ð²{ ðlÍ>¦_ð²{!új?2¼3O©—ü,žÈ<3O©—ü,žÈ~š€Ì•w7æŠNʤ(öÆ“ÙðpÌþ©?áäöCô{-m¶ƒBÔ“¹Òvé #<0 [µ…éøŠ íiÙ¡.j]K‰3Ô•š-lzV$‘ˆŒc2—‡³ (q¦ÃÍ×q 41 rÑ&iq 7…¬¬KBnVmW2½¶_y |ºÊüS¡½'2ÔƒeÅ!m][…bIš¬„+ÅñÒWé‰î»yé-ÇÝqÕ÷ÁRu-F£²b:DW>b""/ØC#ûœ~ÿYÿ’ÿûã B™ðlÍ>¦_ð²{ ðlÍ>¦_ð²{!úFÇh™˜µ¬#.˜¨I…%1`Í7µ"k¥‰.7k…¥d›ž¢J̼“"ˆÙ‰En†š•Y/Ä[µj…6æE.>«.š†ã@ˆô·Ô¶ÞAm6¥¯j›"¾”ˆÏiعdz±¶t`\]UâITÙém.“kƒ)D¤+r’¤¶iQl2ºLìde¼Œ‹[™µ*Ldï (ã¯.ê4Ü„-µ#ZN÷mdJBŒ‰7#"2±–Á)ÃÄ97–•ÜÔÄÒ°þ™L‰&4%ÍZ纴7Á¥hA‘£½Ü.kXhµü3å. þ:G`Üûø_¯Ñ™ùˆÃÚ3âÿÌÇùK‚Ž‘Øæcü¥Á?ÇH쨪xÕ0±Ü|;ÉÊr”Óª<5“CÉqL´h¶ÝDÙ\îV7+­ŸyØû B®J£I©:‰qm‰V†òšŽ·…·Â:HàÐJ'cRˆŒÌÊ÷#"RaåoÌÇùK‚Ž‘Øæcü¥Á?ÇHìªgcì) ¹*&¤ê%Äy¶%ZÊj:ÜJßé#ƒA(œMJ"33+ÜŒ‹ã‡ñ*WŒ1¥7ô‰¬qZcfÕ‹BiñZ5XÏS®/Æ;™^Û±ªL<¹ày˜ÿ)pOñÒ;Êf§sÖ+Ëœ&ö#®â,*û-© Lxrž[îš–”ø©S)+¢332"þÓ"?wÓjpj.LD'øc‡ ã>d…%Â"3I••mDFer#¹o#"£{·~ Qûÿã0&$ÃÄ2BD /®á/‡CúgÝ!B‹ë¸KáÐþ†™÷HD÷Ðå—Ã^<ú&÷§ ðÐå—Ã^<ú&÷§ !.O¤pU_~XïzGU÷åá~d½Ÿ• Ã['pÙHÜ5²wý• lÆ5ryÆÒFã¹<ã«aF¶²Vñ­‘¼ÆÊVñ­‘¼ÇVÊmsã ñ˜øÃ|t­«TÃtb;Î2ÝŽó‹´4TÄtfaý°£} ÇüDŒ7DÒ¦òubCƒáx¬†ÞѪڴ¨•kó^Âí¶šŸ§ðÛØ³&°õ—¸EF’êÊCŒ(šbDgÜÐã~:hmD“I‘’Œ¶§y}êùuNoªlÑ%úÍ.|¹5 ¯ÊuôEšÃêJuKqG¡¥HÎÄgm„fcÌt¾íJ¤Ä¦ÇË…©˜Œ!†ÍuÒ5P’I^Ñ÷؇ÛÑëüÿxr=óküð½œG‡#ß6ŸÏKÙÄGcœZ«×kUjkÔýr#ÐNRZ OSª/ËR\4¡ZP²ZJ"Q—ŒzvôxΜÞ2ÌŠ%‰‘™¨7ÛÆq!?ô˜£y\Y¥'u¸vN¤¥JiÇIjw‡#ß6¿Ï ÙÄxr=óiüô½œ²ç*Sp_T~RZQ°ÓΛM­vñR¥’TiIˆÔIQ‘m±î.µUaJ®Ì ;†eÀ•R—9,5)SÚ{ŒMzQ¡ÆÞŽÙ§D~6£N«&ÄCÍÞ|Ú­WÄØš©˜T|1*fŸN†šc*TÖ‹‹;%Ãá8VKñžBˆô•Œ­o”¯8ør=óiüð½œ<9ù´þx^ÎÑx?(°]×*êÁxI*z®ÔÚ:Ù¥²NBB"ÆAOApj'šuÂÐvºõ_Q·ôÜ1Å3>µ‹x8¤ÜúT(šo“­¹ ÝR¶ZÊB£ÈÌÏ‚"2-)¿•|9ù´þz^Î|Ú…ZͦÊ"I®vBÚNôš×ÅÙÃð-UUÌãúòÄÆ9þ9óå$MQ?G¤°¾Â2qÆ­H¥RÎHôeB𦑢l©‘¢©·VÊ5òw-§ïåmåpÆTáú£wŒª¸Ë5iDª©<ט©o²Û±c–‹¥æ‰Õ™™©{Y]ÒDez\š|2ýá½<¢9tÏãøÏåý"buÇE« àç°KÓØ­&Øy©$ÈŽ·\6&ÒÉJmÞøhšdZRjI¦Æ¥¥JJºZÆXaš†;ÄíG¦W!AoI‚\^C| 2R•¢kú›¹Ç^³RB µ¬ìj¡@l«Ãïff›³ÿ¾1õúcŸ×úf&5ÇGS˜tš%U.ŸJED䮓l×d¾…¡nHˆËöm)BM)I¸¢Új3ÙÑ··Í Ÿ—Ø>F©LåytõË¥N.EMåµi±2µ-DN)Ô%6ºRmê$©ÒÕO€ß<-ÌÚ˜¯ü9Î~³1Ž¿ŒõF¨óò\°ýQ¼¢f]{ F§BœÔB§ÔY ¸–á6n •6LÄ6¥¨œ+¤š#]øK’Sd%Yp^ZQªe o÷½ úë𴢞ã¬M›Á©[Dâ–ñ%  ÔhQZOI’iLðqü·1üÚ¼£ðÆ9þ|ñ?XN¸èôYeF UYmæë8ˆäÁžÜFØSÍ·=i€û¨y—›¾¦É(B÷Œâ©DƒJùåe=YP¼S0åQä¢$Yi—"ZäDy·¤2É«Kql’I]&sñÎ9O鉚ã¢àØ~¨ÆXUª/áHÕŠqæ³}>‚ãÎKu&²)Š”¶õÇe£²¬fD&«Quðõ4«R™†© Efªóx8ø“m&«¡K[:”D\e*y|eš®§T›í2w¹á•×TÏÄÆsôëÇŸYúÄÌyF0Šâ>DQpìG–§fPY‹Ÿ Si±°ÃTÉ©ù‰qGF†Ûý!ÔDF‚p̈CU+ÆAšÒ(”)àVUªÄŠ—Qié)ŠÛRwI艡¼tºfd«™•ð«‘TÏÄòþœ¼±åçôçñ=MqÑèüC…h¬Ö¢q*u1ÚJ&In†‰T&âªrŠ…Ä&Þ%ŸeN¡’Zœ+êZ¬K2ý-&.v`¸«SÝ©TÛˆÅV–¨éŠÌyNÍ[i[‘Ò’Ià–mY%©DfVºNxMqLÓUÜùLrÄýzOã™ë1“â~½û†Yeüðàßlœo’%(ÒfdFdI2ÝcÞD(v÷Õét,ß~«Z¨Å§@b/…‘%Òm´\’”‘¨ö\ÔdD\ædE´ÇfZÞÌ™Œ²âMt¹•ü-{npKŒíY(u+ÿÐnÜöXm2ò§!ìÐÅÔd¥¶`A¦ÒÝa¤ìqÕÌÖ£3333$ ­{’±™™Õu*Þ@Ôqü,s/a·+pÚ6Ûxæ'IžÍ+RwÒW$«šÿ±6í2>½EÄ™±ŽêT ¬:œ3¦QÑÃFt–’Q*uÒf[vÏÚCKŽÀN~)ë­JÇ’ŽTg2LEL2i´3-æE®:•ä¡;Ô{n7 ÊFw^7Äê?ÚÕ<ÿÿ(ØägÁâ>–ªÿüŒ‘ ÊªøresÜVþ¿¬ÿ‡8oð—ôÙHòx¿úýä}QZ8KÊˆí ¿çª{²'¡žüe‰þ¢ìƒù<š§žü_ˆÿ¶§{ äjØã›ô 4z¦$“ »#G pé-´¶M&¢r"tœlÍD”—5éŽëÒ•tìÖ1¬¨ÔJKÕ”‰R13”ç$ÈnÒשïHý"Y7Cš’DV·’•l£Iå¶µåŽÐ‹_ª_ÖTaúEm^¥Œ«ìƒÉ2]âtåhm 5)V(fgb#;휛ÃÒ]Ó8°ó‘œ&ŸJ#Óm,Ò•’TEÅ=+J¬|Ê#Üd5¹³2²þ ÌHc!±C¥2ŽóïP'!¥JuÓÐFJqN)´ðzJAì?$tUŒE\Ub§Hj­Éí»ŠØ¤µ4™lÕ …S’dI4š”é©k%mt¶ˆ„ü ~˜ì‰WVäu ÷âJÙÿl*g²äò+žüCX?þÆ™ìƒ¦Ë •NkتJ¸U¢¥×y<h> ¢ÆY¥\MD·J;o¾Â+vB~ôŽÈ×WUJy ‡}z¬ý…/ØÇòy †}rªêú_±‹pè§¡ªzªÈ.{ë5?WRýŒA÷?áSßW©z¶—ìbß:c¢3*|ûŸ0™ïªÔ}[Jö1üŸsÖ=õIþ¬¥{¸€N Êœ>çŒ{êS½WJö1Ø7¬&ú®•ìbä߃¶ ë ¾«¥{x;`Þ°›êºW±‹äS~Ø7¬&ú®•ìaàíƒzÂoªé^Æ.@ ŠoÁÛõ„ßUÒ½Œ<°oXMõ]+ØÅÈ‘Mø;`Þ°›êºW±‡ƒ¶ ë ¾«¥{¹2)¿lÖ}WJö0ðvÁ½a7Õt¯c E7àíƒzÂoªé^ÆØ7¬&ú®•ìbäȦü°oXMõ]+ØÃÁÛõ„ßUÒ½Œ\€߃¶ ë ¾«¥{x;`Þ°›êºW±‹"›ðvÁ½a7Õt¯clÖ}WJö1rdS~Ø7¬&ú®•ìaàíƒzÂoªé^Æ.@ ŠoÁÛõ„ßUÒ½Œ<°oXMõ]+ØÅÈ‘Mø;`Þ°›êºW±‡ƒ¶ ë ¾«¥{¹2)¿lÖ}WJö0ðvÁ½a7Õt¯c E7àíƒzÂoªé^ÆØ7¬&ú®•ìbäȦü°oXMõ]+ØÃÁÛõ„ßUÒ½Œ\€߃¶ ë ¾«¥{x;`Þ°›êºW±‹"›ðvÁ½a7Õt¯clÖ}WJö1rdS~Ø7¬&ú®•ìaàíƒzÂoªé^Æ.@ ŠoÁÛõ„ßUÒ½Œ<°oXMõ]+ØÅÈ‘Mø;`Þ°›êºW±‡ƒ¶ ë ¾«¥{¹2)¿lÖ}WJö0ðvÁ½a7Õt¯c E7àíƒzÂoªé^ÆØ7¬&ú®•ìbäȦü°oXMõ]+ØÃÁÛõ„ßUÒ½Œ\€߃¶ ë ¾«¥{x;`Þ°›êºW±‹"›ðvÁ½a7Õt¯clÖ}WJö1rdS~Ø7¬&ú®•ìaàíƒzÂoªé^Æ.@ ŠoÁÛõ„ßUÒ½Œ<°oXMõ]+ØÅÈ‘Mø;`Þ°›êºW±‡ƒ¶ ë ¾«¥{¹2)¿lÖ}WJö0ðvÁ½a7Õt¯c E7àíƒzÂoªé^ÆØ7¬&ú®•ìbäȦü°oXMõ]+ØÃÁÛõ„ßUÒ½Œ\€߃¶ ë ¾«¥{x;`Þ°›êºW±‹"›ðvÁ½a7Õt¯clÖ}WJö1rdS~Ø7¬&ú®•ìaàíƒzÂoªé^Æ.@ ŠoÁÛõ„ßUÒ½Œ<°oXMõ]+ØÅÈ‘Mø;`Þ°›êºW±‡ƒ¶ ë ¾«¥{¹2)¿lÖ}WJö0ðvÁ½a7Õt¯c E7àíƒzÂoªé^ÆØ7¬&ú®•ìbäÈ¡é¹3„1-Æ“-Ò¢Ò«Ë4*]<ІŠ;m7c­fzVÓW@ÛQò¶…g½7 âLxj})"\…)d‡–³/(ÏR¯~‹‹§ ñ?èê,p×fäN®qäßÂߪí3«œy*œŒøzŠŸ=#QR4QEEP윶Ø9ø.Ù#¡Y ä„éš‹”Û/šŽŠRLµfRB9n’¾rá"?Œ»ã¤.˜æexê6ç.DÏ"ª#‘‡“ È9KžY…—©¦M…¨LYAx\wS[j%w@ÑšŠ¶2æ]Lòä(†’æïø¦È:ãÃÆÜ3™€ž»¢b‘‰8G$pgÈ¥A"޵ ò€o/Ÿ}©Zô £„ˆZXÛe´”Yà 6‹¥R,tô69²Q3ÈCQ3Þæ ·F͵d0Ó…ÒÂÒïtŠ2j1)ŒÉ¹@t'¤º€4ê(¹‰²óÐf )¡w`Üœ]ÍlDÂK¶›os'´Žv %)ŒcD˜¦Ï1ÝæóW]Ù‚þ-€›‘€»YO¸·Ï¦a¢mŒ‘›nÌÚDD@ùd9ò|SyÀB€ROšœ1&Ìm(iËŽüŽ·Ï4†Ý‘jc!–9AEÄÅ"b%Ü?؈ h,Œ?°•À+ŠJnmŠ’“®f’fw@ÇBɤH ?|)ÃHë&[—È~(Ð} ( (Šua¾³)l»Žä¸£ZbE²ˆrÔÊÔJ¡DÅ1·€j/ ¢€Žc•l.KB@v "šÙf ä'ÀrÒ"<‚4¢µ˜ŸkFY׈™Ü$šv2|d›lÒA_:e6¡Ö!¿1È2äåÌ'@QE Oš j|ÔQE@Q@PÔ…@Ô…QEQ^ž±í fgàÉCÀÆ~U'¨´{à‰øA—LîU m2ÕñPÓËÉ»’Œ?´-”>³JHÀÆ9àó‰o ]¢gY"ªEÁ)Ä5 GPd;„s Ì4SnÓÁ€’·á$§næP.n !Ù¨ØÊ™Àå˜j03Ý—/Æ/œr¯¡‚²ï¯(ùyÆð®írÊíWQT0O¨„É0ZDr6ynÈ@TPÅÄl2JÙ²¡ï‹™¼ü4š¢VM±©‘‡-& á¿!Ì9)tEz.ëø{•Ž ÁF¢Æ ÄÜ:Ê;z݉êœWQÀ¢Q8ˆ·ˆÿ8Gûp0˜Qã>1¿Ëû.m¿ÌõxfÏoÿœ6yì?ó|oͼÔÓ¥®ÆŒu òGÇÎÝ3¶EHãûeC2ä|Œ^Ba€ë Yâ°îͼdm§Ë&²ì”Љç¤å1@å6CÉ™L—š€¡¢½MaYött6ÛrV´dš×“.ž=pž¥ÓÒV(&~Rn8ì¹3å¬Ö ÙQìb Û—‰wâ¨áŸ)L×mµ1DÇÏ“»xêÈ9h?Q[e‹™ˆÄ'í§!¢!Ý06‰KfÓF€("ù€Úsüڳ˒›Io[Ø_kOJÛq“nî«8³™ò ¦ÁDü€Å0 b9òïüÁ@yÚŠô}™cÚ18Í}Ûf‰g)$ͶÚÝ~Ð9Œ–×A³Ü9jL¹˜yG—}g1âݵ {Zè%lJ¾I\l@+F&PS `r.jä 3=“¢˜‘ílKVm<ã†p HQMfAMʆL† Ãh%”L`Õ¼K¿ÎÄÅûB ËK ›»r>Ø»&äˆÝËXÄ´ VçPH9ypÍ>Mù‰¼ÙPw¢½M~ÙötŒ6"[‘¶´dbÖkΙ½nž•ÔÔ–0(~Sî(†üùså¤,¯Ó âî¤nÆ.e:2 B ·l@@6Gd;2Žòñ¿“02tW¢fí,;ø:ÝÏ­qNmÛÈ6<ÊèY”[‰¶ÊDòSNáß¿x†CTYœ~ÖÚqeØîb£QQÔ”¬„@,਄éA6Bo+Is Àƒ¦€ITÖƒåâç¯yIXH¦ÑQ«*Õ«tŠ™™JÒP6Bç0ÓŸÔ°îCÂÙÌìïÍà‹+qIÈ·)Ž˜òvV KH¢‹½Sù×y¢Nn!ÊÑœ¨Ý«ç‡]%HL™€C2òÿ4¿þ¼•ø5× [®±ÉÒðƒ¦lÌ"—= 9n/›Î5Ž_ÏUŽ+¿cö­µ废³¼—oe^§*ÒN ûßñR¦ÖVã¶£¢®sÅ>]۹Ø»# $Ê:€M˜ò€ë0‡Ÿx€o¡k†ÊxÒÎ3é¥Ðq’j¤j¡Š')SÌ‚9â o Ãpü 4·uUn¹+¥eö£üª˜oƸâTŽZ_ñPb·¾¡\›]=pfªL´X&dŒaSJJ&P(w“”rßYüCž·.:¶ÑBQD¥ašƒs23cýðD)‡_ÅO?ÏŸš±j¹=^‚j8áºûõ¯ÌÑ”)Õ;Ž%¹+‰Zí[’¸•­Öf¸ŽUk‘_=u«\Šùê홢#•^ZäSÏ]jò×"žz¹fjˆå?ƨ©?ƨ«(ÔEOš¢§Í@EQ@EEQE@Q@PQ@QE?%EOÉQ@EETùê*|ôTEHÐEPQ@9øÂav$C'€â~à,’ì…% B*àáå‰tŽzÉÈ">WæÙ+ŠXowNâtD¤ƒ¹éXÂ4NFf&Å@£)ñD>öLòË!åÏw™¨ öÕbÜ.ǯ9—PG‰‘ðÆîhuʹÇ0—"ï}ôá¿py#¿xWÓ .Ì5·¯[µdü*£´( %Û‹¥X“M¤G1C—qrÞ")JšÓîñRÂuxa¬¹®‡+%o‘óy]³[nmm¶dXÚJ mf ä"!¬3Ë~Y9ËúÓs„ø•„¶¹ «¥gñèø:¡¶@Ë p>¡.EòHaÈ»“’‘u!Ë@?¥qZÚŽSdcžEkiÛÊ DNC%­º)NSå2ÈD3/.ðý\ö@À_«Z’ïfdïc˜TAFgD¬Šp>°1ñ‡ïªiÏù¡æÎ¼ý@PÂ\C°à­(Ör—¼Á𑱉#'ÑTâ^DTþöMYˆÆ‡.ZÏÚ—‚÷ ï[&BIki)Yƒ¿þw"ZÒ1È™ï ˆs ù豈Tù¨ Ë è²îÖW,Z-VxÏ^ÌŽJc&:Ó10(€ò|ü¹W~(_“‡p!54Ù‹w5+R•¡R s˜@Æ0ç™ÇÏòVN€ = ~aäÝ»‡KÜóOb¥,ç —Á’duJ¹ )O¨»€¡³!‡”ÛŒQÌ»¤16ÈVk'7šWSvñFðU¿„(VJ&`øžFG0fÈ7çɾ¼ßEèü%Ä; ÒŽg){Ì¡’0qÀíN%ä@åOïdÕ˜LaÈråªë`m /º“€pF..½ŠQ¹Î c ÀQ }ìªxç»wš#EÂÇ©+Fv÷ŽÑ}¶JM®õ¸ tÌÝÇ!ÀusÜ9”G~¯ÍKÚšŠ¢Š(j|ÕSæ "Š(  Š€¤*¤(¢Š(½¹‰–ì&áäbb3·…¿l)™‰ÜëZtŽdT7ˆù\›†®Å;1eqIIƒvR0¨Æ[镪¹*TÛ®M _ 5¨jÓñ¿0ל( =aäí½`­tÌ=‡“²ŒQ#tÙb¼4L]ÅÏd˜Ž¬¿œ|ëçŠöä‰ñvJUÉ£W¹cÈ„[s"s™M ÖH "@(ïO<Ä3rî¤ ^滭矋^Ïm!®qŒ©Ü9k±P4&&r :ĺøÂnßù†¿893†Fµf-\CdV¢íPY´Â-Gî.d)À†9w2Ô`]ꪀô<Ö.Y­±6Á< ¢^x[ŠCv:zòënº¨•Hå“&ÑB/¥"Ž‘ÀÊf021~AóuÒé¿­7¼Kø,¶Óƒ^ ãàꇃhð]\¥òòÙâjäüážçân|Yšœƒwáqîv¶f&­(&Cy&ÈÅÞjÂMèÛì@‚²å.)­&læŽ$É6†PÒŠ%8y%òJ_Œ!¿?6úZÛ‡ÃÛªNrNùœ–€”xøîÐYº;vâ>£Å)Dú·›!Ìx|™ ðƒ¾ߨ„yh´”#íˆÑ¹Ô.“*R˜Æˆy³Ž_˜“’¶XSÙ|_@Ûw|›˜¥­©ÂK3:mN±\Ls‚~NzGR†åÝÉùòDÑ@>mlW¶^߸€ò|\Ųºšø+gäDTQ¡ ™“.e.ýåˆåžò‡öÕ>.]–UÕ9cÀ¶~íhHTQe!0(5VHE2œå(€›É) `Ìy‡pùÓÔP XЈ¼Y]»¡ž²D…".eX¦DâÌ Ö\² Û÷äê/ÌCµâí[.×´¸ž rL²^0p‘Õ¤ç1R7•——îË"——Ì’¢€ôuõŠv ÀÞ’–ì‹Çs7‹Ví•d£C& ÊD…# Ž>I¼“âˆïË;“²lldðÎ-û —ÊÞ :1_°9`’9«‘Š;0 ò¿ž?w|™:(½³w[Ìþ EœæCDãéB8l×b ëL ØDutñgÜ"»ó…~0òì·m̽c¼a²¹¦LFÈ·T;$ut†åÜ"»û)WESö˛è¬ež"…¿3.¤Ë¢Ã9p¦BÄJÒ"9æl¾5 ªh&]SK6ìÃK†uta_? ¥Óds E ¼R Ì]@‘~Yˆ&ûþ;¡~èq»¶N|Aâÿm6|Ùj×´ÓË–Ó~\º|Ùî¯>|•¦ýÄ j"׳-KúÒí­é/Ú­Ì€@PÇ!¦ß»hlÇ/“,üÚkÇ,1‚½¥á$<˜¼Y ÕHåZ˜€ËB&HDN>I¼“ù";À?´<áE!ËEËEîÙöÎ^K³6ë9\ÿ$SœÙ1ÈxîÕUkÚ7Q„tÛSýÉOuwÝ_†›ûþYW<¦¯ ‘»÷j§ M+KîëTø“µk*ï7%±0?ÜÔ÷W ÖênKV`ºÝUËùê±ÅvlºÈÕ¦+/òZ¯‡wѾ-¥0?ÝMî®ðÏ ñlùþìj¥uUn¹+§b¢îÌÊq¨ñý¿É _ 1ß͘îã\já.%<¬¹ÿ`5™sUËùë¥d­{šËü•¢©¬S18Cu“1õ5̦ âòXóSÿûXõ¹+‰Z½g ·2ÉúU0[G’Řú ÷×:˜%‹ÉbL}P{ë­r+ç«pC1̼¯ÔiˆÝ±lGu…1õaï®sàV/yX3@¾úÁ«Ë\ŠyêÔLóÃå~£TTÀlaÝ`L}ûê8…Ææ>}ô¶?ƨ«&¹áò¿Y¯„dñ Œ=Ì}ûêx…Æ¿'ó@¾úZTù©rkž+õŽ“Ä.0ô1ô ï©âz?˜ú÷ÒÒŠ\šç‡Êýc„eñ Œ=Ì}ûèâz?˜ú÷ÒÐ(¥É®x|¯Ö8FW¸ÃÑüÇÐ/¾Ž!q‡£ù _}-h¥É®x|¯Ö8F_¸ÃÑüÇÐ/¾Ž!q‡£ù _}-( \šç‡Êýc„eq Œ=Ì}ûèâz?˜ú÷ÒÖŠ\šç‡Êýc„eq Œ=Ì}ûèâz?˜ú÷ÒÖŠ\šç‡Êýc„eñ Œ=Ì}ûèâz?˜ú÷Ò×䨥ɮx|¯Ö8F_¸ÃÑüÇÐ/¾£ˆ\aèþcèßKP¢—&¹áò¿Xá\BãGó@¾úž!q‡?ÉüÇÐ/¾–•>z\šç‡Êýc„dñ Œ=Ì}ûêx…Ææ>}ô´©\šç‡Êýc„eq Œ=Ì}ûê8…Ææ>}ôµ¢—&¹áò¿Xá\BãGó@¾ú8…Ææ>}ôµ¢—&¹áò¿Xá\BãGó@¾ú8…Ææ>}ôµ¢—&¹áò¿Xá\BãGó@¾úž!q‡£ù _}-*irkž+õŽ“Ä.0ô1ô ï© Ææ>}ô´©Z\šç‡Êýc„dñ Œ=Ì}ûêx…Ææ>}ô´ )rkž+õŽ—Ä.0ô1ô \aèþcèßK@©óRä×<>Wë#+ˆ\aèþcèßG¸ÃÑüÇÐ/¾–”.MsÃå~±Â2ø…Ææ>}õBãGó@¾úZÑK“\ðù_¬pŒ¾!q‡£ù _}BãGó@¾úZ ¹5Ï•úÇËâz?˜ú÷Ôq Œ=Ì}ûémQK“\ðù_¬pŒ¾!q‡£ù _}BãGó@¾úZQK“\ðù_¬pŒ¾!q‡£ù _}BãGó@¾úZ Oš—&¹áò¿Xá\BãGó@¾ú8…Ææ>}ô´¢—&¹áò¿Xá\BãGó@¾úž!q‡£ù _}-( \šç‡Êýc„eñ Œ=Ì}ûè Ææ>}ô´¥É®x|¯Ö8FO¸ÃÑüÇÐ/¾Ž!q‡£ù _}-h¥É®x|¯Ö8FW¸ÃÑüÇÐ/¾§ˆ\aèþcèßKJ)rkž+õŽ—Ä.0ô1ô ï¨âz?˜ú÷ÒÖŠ\šç‡Êýc„eq Œ=Ì}ûêx…Ææ>}ô´ )rkž+õŽ•Ä.0ô1ô \aèþcèßKZ)rkž+õŽ—Ä.0ô1ô \aèþcèßKA©¥É®x|¯Ö8FO¸ÃÑüÇÐ/¾Ž!q‡£ù _}-h¥É®x|¯Ö8FW¸ÃÑüÇÐ/¾Ž!q‡£ù _}-h¥É®x|¯Ö8FW¸ÃÑüÇÐ/¾Ž!q‡£ù _}-h¥É®x|¯Ö8FW¸ÃÑüÇÐ/¾Ž!q‡£ù _}-h¥É®x|¯Ö8FW¸ÃÑüÇÐ/¾§ˆ\aèþcèßKJ)rkž+õŽ—Ä.0ô1ô ï¨âz?˜ú÷ÒÖŠ\šç‡Êýc„eq Œ=Ì}ûêx…Ææ>}ô´©¥É®x|¯Ö8FW¸ÃÑüÇÐ/¾£ˆ\aèþcèßKo’¢—&¹áò¿Xá\BãGó@¾úý¡€Ʋé¢KT s@O …Ëy„ÀœG ¥•¹5Ï•ú‡ !ËEËE[1=Ñu~oìøe\òšµWWá¦þÀÿ€VUÏ)«Âd¿¡‰1ýL­_ÏUŽ*Í=V8®Ý‰Í´+U[®J´uUn¹+«bQŒ­sUËùêÅÍW/ç®­‰V3‰nJâV»Vä®%jý™Z#•ZäWÏ]j×"¾z»fhˆåW–¹ó×Z¼µÈ§ž®Yš¢9Oñª*Oñª*Ê5S権óPEPQ@Q@QEPPEPQ@OÉQSòTPQ@Q@>zŠŸ=#QR4QEEPQ@54T‡-EHrÐ@Q@PTùª§Í@EE@QE  ÔTÔPQ@S樟5QEPP5!P5!@EQ@QEQE@Q@PQ@SP54QEEPQ@QEQEEPMEM|•?%EQE‡--¼&¹‘™ðF…!•1þZ…L R“Q„LaãæªwÔˆˆÿ †öËNÖ´éþ1¸ý÷÷E+äÂ9eû+Ã$T*Æÿ‡ßMGÞ¸a¡Ð½­&?çP~ÛgÚÕröœ ÿ@ûy—k\ëª`ó身×r 5©'º»OûÿƒÞt>îlùaäwoþ»mUÎlÉ Ï-Ï×q0í«àåâÁÈFÿ­º~ê®s ¸äÚ~¶‰}šéظ»—ïþ qß:Y#þ{mu–?·®¬Y±Ïøu±ÖxîÞ¿-•–xFQÑéø?ø^ÊmÙÕ¸Æ 7¡¦#½L;ŸþP´zÝÞ+˜øspoÿ(YýoŠï5ðm'8ôWð(Æ.v™u¶P­Ï³L¿æÉ=Å Ã1Á_ÈÜ>)2ñnßÁ¼/ÄMö;m:¶zöZuéß§<òßV s8C›ÐÕ©ðÞáÏùFÎëŒWy¨âÞáùÆÎëŒWyªƒÜ’9þ ìfG d}ØÍ;:±Y¬!Íèká-ø·¸~q³ºãÞjx·¸rþQ³ºãÞj›„²> ìfO drüØÍ;:Vkszß‹{‡ç;®1]æ§‹{‡ç;®1]橸K#èÐÞÆiÙÑÂYF†ö3NΕšÂÞƒ„¹âÞáùÆÎëŒWy£‹{‡ç;®1]æ»0ÞDóϘÈÇÃ,€ÀL*–Å8×*&`1Sä)€@sª©Ùg®›4hÒ$©=™ü¸¶ÊLfɘÂ&2b""cæ#ç¬>öbÿÝÑV•ï¥?iÑŽÃó×®óG÷Î6w\b»ÍSð–GÑ¡½ŒÓ³£„²> ìfgY¬!Íè8Kž-îœlî¸Åwš8·¸~q³ºãÞj›„²> ìf%‘ôhoc4ìéY¬!Íè8KŽ-îœlî¸Åwš8·¸~q³ºãÞjŸ„²> ìf%‘ôhoc4ìéY¬!Íè8KŽ-îœlî¸Åwš8·¸~q³ºãÞjŸ„²> ìf%‘ôhoc4ìéY¬!Íè8Kž-îœlî¸Åwš8·¸~q³ºãÞjŸ„²> ìfG d}ØÍ;:Vkszç‹{‡ç;®1]棋{‡ç;®1]æ¬T·qM" ŠaÜPÌLk=0íØVaKŠM3˜‡iS”D SB´ùïU )§ÝoAÂ[qopüãguÆ+¼Ôñopçü£guÆ+¼Õ7 d}ØÍ;:žÈçø47±švu5šÂÞƒ„·âÞáùÆÎëŒWy©7¸~q³ºãÞj›„²> ìfXÁ9ºçÞœ¾ÚUÉL‹+uºÇ)@ÂR$"˜€gù•šÂÞƒ„èâÞáùÆÎëŒWy¨âÞáùÆÎëŒWyª~Èú47±švtp–GÑ¡½ŒÓ³¥f°‡7 á.8·¸~q³ºãÞhâÞáùÆÎëŒWyª~Èú47±švtp–GÑ¡½ŒÓ³¥f°‡7 á.8·¸~q³ºãÞhâÞáùÆÎëŒWyª~Èú47±švtp–GÑ¡½ŒÓ³¥f°‡7 á.8·¸~q³ºãÞjx·¸~q³ºãÞj›„²> ìfO d}ØÍ;:Vkszß‹{‡ç;®1]æ¤0ÞáÏùFÎëŒWyªnÈú47±švu!rÈçø47±švt¬Öæô%¿÷Î6w\b»ÍO÷Î6w\b»ÍSp–GÑ¡½ŒÓ³£„²> ìf+5„9½ sŽÃó×®óG÷_Ê6w\b»ÍSp–GÑ¡½ŒÓ³©á,Ž_ƒC{§gJÍaoAÂ\qopüãguÆ+¼ÑŽÃó×®óTÜ%‘ôhoc4ìèá,£C{§gJÍaoAÂ\ñopüãguÆ+¼ÔqopüãguÆ+¼Õ? d}ØÍ;:8K#èÐÞÆiÙÒ³XC›Ðp—<[Ü?8ÙÝqŠï4qopüãguÆ+¼Õ7 d}ØÍ;:8K#èÐÞÆiÙÒ³XC›Ðp—<[Ü?8ÙÝqŠï5[Ü?8ÙÝqŠï5QÂYF†ö3NΣ„²> ìf+5„9½ sŽÃó×®óG÷Î6w\b»Í^b‹UÛÖ±(ª£ tâ-@Ä- ª% JQ9ü¡È1¬W d}ØÍ;: Y‹JÝKu1Á?¨¢EÏ÷Î6w\b»Í[Ü9(ÙÝqŠï5MÂYF†ö3NΧ„²9~ ìfgY¬!Íè8KŽ-îœlî¸Åwš8·¸~q³ºãÞj›„²> ìf%‘ôhoc4ìéY¬!Íè8KŽ-îœlî¸Åwšž-îœlî¸Åwš¦á,£C{§gG d}ØÍ;:Vkszç‹{‡ç;®1]æ€Ã{‡ç;®1]橸K#èÐÞÆiÙÔ…Ë#èÐÞÆiÙÒ³XC›Ðp–ü[Ü?8ÙÝqŠï4qopüãguÆ+¼Õ? d}ØÍ;:ÐDFb,¼rR16Bò •Ïfá­¨’©!ŽF*"€‡ö€ÑÅ4»¡Íè8N~-îœlî¸Åwšž-îœlî¸Åwšâ—¹"‹9hVQî@3]@6Hàü¦H¸øK#èÐÞÆiÙÒ³XC›Ðp—<[Ü?8ÙÝqŠï5[Ü?8ÙÝqŠï5OÂYF†ö3NÎŽÈú47±švt¬Öæô%Ç÷Î6w\b»ÍO÷Î6w\b»ÍSp–GÑ¡½ŒÓ³£„²> ìf+5„9½ qŽÃó×®óG÷Î6w\b»ÍSð–GÑ¡½ŒÓ³£„²> ìf+5„9½ sŽÃó×®óG÷Î6w\b»ÍSp–GÑ¡½ŒÓ³©á,£C{§gJÍaoAÂ[ñopüãguÆ+¼ÑŽÃó×®ó\R2WoƒxÆ‹? nW-öð “Û"lô¨LÒ D‡#áʹ8K#èÐÞÆiÙÒ³XC›Ðp—[Ü?8ÙÝqŠï4qopüãguÆ+¼×i+‰Ô{ÉÐìWdËG…¸N±“o¬t“Y,‹¨wyf<•øB^yÃ'/PŠŽU«]>± ›ˆê‹¬À–EÌw|£JÍaoAÂXqopüãguÆ+¼ÑŽÃó×®óTü%‘ôhoc4ìèá,£C{§gJÍaoAÂ\qopüãguÆ+¼ÑŽÃó×®óTü%‘ôhoc4ìèá,£C{§gJÍaoAÂ\qopüãguÆ+¼ÔñopüãguÆ+¼Õ7 d}ØÍ;:8K#èÐÞÆiÙÒ³XC›Ðp—<[Ü?8ÙÝqŠï5[Ü?8ÙÝqŠï5OÂYF†ö3NÎŽÈú47±švt¬Öæô%Ç÷Î6w\b»ÍO÷Î6w\b»ÍSp–GÑ¡½ŒÓ³©á,£C{§gJÍaoAÂ\qopüãguÆ+¼ÔqopüãguÆ+¼ÕG d}ØÍ;:ŽÈú47±švt¬Öæô%Ç÷Î6w\b»Í|_aýÀÑ’îÌæÚpD2§#Kš9ʺJ˜JšK˜æÈDt€î5Vð–GÑ¡½ŒÓ³­«3¦óàåg“ÕÜmÔY³$1Ó$kC¦Ù”º€¢¢‚òj–°´µ˜³…Å]øá^$ÅrÑ@rÑWŒO§øÆãôsßÝ¥û®Q¦Œn?G=ýÑJ_ºåðÉ?Á‡õú}1ýÃø}JÅüõXâ¬×óÕcŠìX”í ÇUVë’­U[®JêØ”c;pÿò‰m~—kÿ8µµVbÏÄ›ªaõÈY*íñÕ„1Îpаœ¥ Ds6ðÝ.¡e„e0‹fîVf±VI5õhÖQÌ¢:LQÜ9/›~a˜U}Õ(¤äóé…›7l³ÅŒ²©¡«F³o0†£wŽc–yf;² ‚»6Ò¥Hk­žkjÃᥗpÔjêFPÉNíÁRPP ¨@ˆd>Hsy9dÅ>ŒCÌ Vn>,ñ¹Ýçnšzº„*BÜÊ SHc” Rk€‰HïÎ’â»KÚ0ÖÚ±qÈ7‡×àË#µÚŽÐsSV¥£¨Ù|ÈCÉÈ7W"·sž/xâ¨ßðßðŸ¿xFß-:óÚhøžFZrË~Z¼ª½Ev™°•¶­8\SÃWP ÷l£V®¥|)R¸Û.R´À ³”T €Ä6àÞ5ÁkÛQö~&v9G¶£äjäŽHÇ®dD¦ŸH“2ü]YÞWÅÒå“xÎMh¸‡Sl’*M¥—EC8 4Dà™ŒPË#‚;ƒ}UEߣmKŠÞ4dsÔîï9…q1RbQ*€PœDá™G1Õ¨7U¨ M3U†ç·n2^`Ú×JÍ,§ŽYÉ;È˦?UÞC„&}`"‘Gvbù”bËচŽm¸©"’󌛥”ªY‰¶£²Xƒ¬tdÒ™DÙ˜qv%èêΈ‹ñ³ǹðݶæçþ0…Ù¨Lµd\Çx†ÈC~|ð7˸«MkUÌ4DÄAß„‰P|E~öà £YE%?vC˜~j³ 53J· sà‹Y[^ÕgÂF2¨ÇJ˜‹¹:‡*¢ŠÅ(ª$.³yò~0Ž(V'‚Åãkr1›ö†ðbø*«‹˜‚ e³Tç6Fò Àºwg˜Ž¾Å¼ÛÙÑ“× ‰§Œç#×AXdcÔKÁœaÙ¨A쀄/–Q _çR®¬@L>jŠŸ5l Š(¢€Ù`÷ãkßõrsü)ÝS^?ÊÈ~cû¢5sƒß¯ÕÉÏð§uMxÿ+!ú5îˆÕGýÒÿåüÑ—å)¨¢Š¶bQEEPòTTü•¤®X&n¬&Ó°µÞšÏ‰M0.s>F!ŠMžñ€  aÉÉ4ͼþ×ү㔎iÕÌ‚ÌU]6¹›„ÒeDt&>G1óÈDsZY_÷ÓÛÅHS¸ˆ‹‹43ãÚ†Ü`Ÿñd6ÑSç§3d`ÈGPæ#»+9lW¸_Þi]àÆ%¬¸¶¯UE‰$SbUÈs˜¦Ì¡éþÐ ´¨"D–7E³|?’™Q^j= ݜ]Ä“à~‰ÄJ|‰á œAÒaÛ³KL4´M$ÕݯkÛ×Õ®“tÕtvÓ«„¹‹¤6†ÙÄL žDÓ¿pf;‘R×`ºŠq ÝØ”]ƒ¬&\ :ŠSe P0´”@3 Á–™Î0J Òêëµ­ˆ«…È)ªIš.B™B‰Nrë00€•£=ùÔ¸bîäÐжÛWT„y÷÷—`šnœ,š-‘nr¦ ‰Èa9Œ"9‰²ÝL\,µãmŸ„ý„¤>Ô‘óp£.‚ ŸYÛ‚Ì—Í17ó²ŽB;òÏå¤Ô5è핺»#;‚æpÙ¼Uþ¡€ÂC$¡ lƒ2ˆ‰DC<³«XÆj[j)5\ÙQФèª9Ú4(‰Çd˜ ÂA frœÙ|¡„-í<.·^\ñøpµ€Œœy&1Sz´’N<UŽDðP.í[1ÞŒaË5Œ¾!¾—ƒa'íÌ|YbZHª‚†p“b€J´Ùj0äq& åÈjñ¦5Ï¡z´½Mo[KÜh%²RAVë ÜÈRÌå@€:œB”weɘ7bJˆ¸? Ñžâ¡ÜAÇÈ•"Nr9:åÀÎD¥)öj@ & "QÌèLVÙÍ£dðC$¼ZVn8ŽU¿ƒ;rR«9쌘ª$P„Ž‘8À&0‰„rË1lß. Z\¨BD9‡Ÿü25À.(€&  !Ѝ*DwœGåå®ÆØŽéµµrÛèÛ6êlî-ˆ:Ù¢ºb"±ÀªCAƒ^f Œ"'ç•dáu`¹¸¢­[2ÏBFÛF}ÌäB2ï\.ítÅ$Ö1€©¢ ¥¥Þ'æ#É–êÔÄaͧ ‰Ø™iÎFŒÓ¬–*$ºbB&r†é[!ÔSd €0³ @|”l[)HHIÁˆ.ˆå¤TTlMZ€³P r„D  <¹7WE»‰ó‘Sw$ÓÆ“oî6ª3V@ÌQSøÂP€P6E” ïÎ1Ââ…·ä°=­÷„+ô®#C®‹eÖQ%ˆ-öÅ>JœâMÃü”¶­_ ÝqaÅÿ‰¢¼ÃücáðŸËN¼öš?‹ò2Ñ–[òÕåVR³…5Ú@QE (¢€*j*h䨩ù*(™P¿’«ôÏþÆ–´Ê…ü•[ÿ¤nð¶5RwðŸÁü™”=¢Ø9h 9h«f'¿Óücqú9ïîŠVMŠyƒrµe7(Ùg¡$^„.c˜ä9ñ­bŒn?G=ýÑJ_ºåðÙ&ÕŒ4ëô>òj»O©Øµãtô–õI(ú× ×µÐÒk“õK(\¿ž«W^É·Þó(Gcî-W¾î‚ÿJ.ŸÕ2 é\+âÐ_éMÛú§ý*•ÕUºä®Œ ã›)Çg|EºúUy~«@ÿú׸“tö®öýWŸf³.j¹=t¬¬axæÊÑBb˜›t~6__ªåSìW2˜¡tô²ýýW:Ÿb±ërWµzÎ^Íã›ÔÑ6ªbÐÒÛÿõ]*}ŠçSn€þ—bêºÔìë­r+ç«pJÙ`ózšbfèø±tþ7b/[Tìëœø·tö¿úÞ§gX5yk‘O=Z‚NÅ÷<Þ¦¨›Åë£?Ç Jë‚•G×G<1+® vT¶?ƨ« Ž7©®ó¨âµÞ²k(Ó‰êm1.åD. .£%¸5¡˜ùÌ篟×G<1+®*vUœ´X3{j^‹(¤‚NØÅ åAÈ /›$tÖOH‰Àv¤8dbé2`"Ì2¼w‡Qpvœ„“{e&ãÔ|A±Èåt ©DQe0¢&· yCg˜gDáºÞúno–ö8¼ûq½tsúâ§eG×G<1+®*vUeb·°îLnø’®d-ƧA³ØÇåd²bIíÎtÎd”ÀpÈÁÈ]eÈDàbÕ\Žâ$¼î¿Ö¸fdî…T³ÄQ:MQ0µLê¨dL ©š(€™èÔ&ÌÛµBìb¨lÛ‡uçVÚQnUì§{kàNúvŸ¾7®ŽxbW\Tì¨ãzèç†%uÅNʱפ)mû‰xÔœ‹¦û$\6XI TAdˆ²Fæ:DH¡DC1Ès Æ©ªíœ¤½¤*8S£ßÚõ1q42¸Þº9á‰]qS²£ë£ž•×;*ZÑYì68<Þ¢ó\o]ðÄ®¸©ÙQÆõÑÏ J늕-h¦ÃcƒÍê/1•ÆõÑÏ J늕O×G<1+®*vT´¢› Ž7¨¼Æ_×G<1+®*vUo]ðÄ®¸©ÙRÖŠl68<Þ¢ó\o]ðÄ®¸©ÙTñ½tsúâ§eKJšl68<Þ¢ó\o]ðÄ®¸©ÙTq½tsúâ§eKo’¢› Ž7¨¼ÆW×G<1+®*vUa)(þã¶a.9û¢MU >È™—3â¢T£Ð>¤ÄJ]a\@ܹè/ÉJZeBþJ­ÿÒ7?ø[Ñ1-gefÜ+¹÷¼)¶Å°rÑ@rÑ]#ßéþ1¸ý÷÷E)~ë”i€ŸãÑÏtR—î¹F¼2Oðaý~‡ßLpþR±=V8«5üõXâ»%;B±ÕUºä«GUVë’º¶%Ê×5\¿ž¬\ÕrþzêØ•c8–ä®%kµnJâV¯Ù•¢-íIR0#†ˆCD»“xªDjîKfdš”ÚÃJ¿zò„Iåq@£òæX¢ÄYÇÂûHĦeV,‰•ª¨æPK!KïF8+¨SÝ–à5Á¥®,_4¸Q‘MeL™š=dR¨d4êÖS$c”§j.ý@! 2åø]r‘jÃFÁCűUuÅòŠ*¢ ˜È)Œ(EÈ5x˜sß•]³4EÚeUå®E<õÖ¯-r)ç«–f¨ŽSüjŠ“üjвDTùª*|ÔQEË¿^ÿ«“ŸáNêšñþVCôkÝ«œüm{þ®N…;ªkÇùYѬtFª?î—ÿ/挿)MEU³ ( (Š(  (¢€Ÿ’¢§ä¨ ¢€¢€û3p£GˆºH©DT*…R*¤Ì5à%0nÞS€òV¯8År“Höé°›]&ÍÓb‰[ˆª%!v ]™ƒ"`%[ÄÙˆŽxêßÊKØS——DÀÜ)½t·…=A²&Ee„u)¥qP B˜Ùñfç–ü³¬_mAcuÛqx‰¼Š(@;YTQm@@[&ì­´&bNtô€uŽzŒQò‡-9oòk.ÊiãÈ9 ·Qc°*nP:[1T6[Q)„ © _¾y–»™\ñM~HN¬ù¹5jESÚ™Ún‡YŒ¡D¥Ô‰K¸ 9Gù¹•YqÅ«ÉTÞ¶—réè•‚fLˆ®T"™¶À'9A¹GHDâƒNf…TIq;i ö὚¯p=tFIºµJ0€"¢ ,QCHî1…2¼36š æ.ÝU‹&Òî^ÉŠy&ʳ* ÅQû΢¨}f ùî.À>V¢—M3vÚĹ®Û¾ ÄÙgädTseؤB4"ÇÖ¡ÄÅX †£”¦(qŒ<ÍøþYãih“½îÒʤ«2"‰\äΈ•CfSPˆ!ä ‡IPÔ+z6ØtÇm7s/àëŠI „h¸— ¢† LÄCÉÖo$|žLúѳŬ¤ò ˆG4t,Þ®Š;s™}g!SH™” aÙ¨;ÌPÈ‚9òÞ[7ËHÛN>5½Ãv[Ž›rAé!$DÊàubÀLĪ r€ü® ªÚ—ºo,2ÁpÉ„škdÁÓe€Ê¹¥´œT™k.` lÃâÒ®¤vGÀ#‡öz­Ÿ¦á’²Ò)(ù´ÒxT VfЩÁ´9ELP2† ŽÜYl;‚c+rFò2‹ÛJœdL1‚R XÔíN¦³¦Q C3n8€jªùé;)ÅŸoF¸žOÀ%\.åÊÌ’Y%ÈL¡H y'.ÀÌ@Ùæ*’»¦.{QõÁ‰$s6DîTÎ1Åô³)Îí'B ýÿÉ2@˜ uæd7’|mû]º•fµ¸œ&ÖmVëÆIx¸¦U#ŠæD‚t ¦Ÿ%dÄ5˜2 ÃWÅ»jÚ…‘³ä.;Äqcß·lº` „Y5LC$;Bê>hŸ2HoÖ#äÕÔ=Ïj1¸0ÞDîfδ™D¡–f9ªè/¿ù@&TS6Œ€ l„G@R§#n7°' Òy*£×2í20L©¹T6ØD‡080é8Pê̳¼|«0UŒ€ÈGÉ3Œ×:˜›C¦`95I€é¢a Ù€ïª@å­%á' þÔi¼‚Žc#Ñà9jD‰¬Î_4ÌU & ×1w~ ^VE͇-d»"€¢€©>j€©óP@Q@PQ@EE55/[ôu­þ ´¦^*þ ·èë[ü)iU%;"ø¯úÂe Oš j|ÕlÄŠ(¢€( ( ¨ "Š(  (¢€û2E7Pn³¤Z&ª…!Ü,$9 Ì)Œ £¤¢9àÝLÌCaf\“­ä"¯Ër1£š2œ©$äÆðtM¨±É€fDɘeñµylŒÔP;ÔVY©T(¬š*‚g93òŠS‰L ÀJ`ßòV¢à­ÜRšƒhÞIXx©U˜Š» ¸Xˆ¨$8í )DÚL!ä0e˜Ò·³QÛÃHši:R”íUí¯C$÷ )g¶b÷Hȱ¼-”âÜB¶‡ñy5Œá$M"˜$rz ’œ<‘ÈäÞQЦ5’Äc@ÝvrQM$Ñ’tÒOÆoEú‰î)L¢˜Ç. nPùˆæe.Û(Üh\¶½¤ÑÉÙÃ=]¸ªýâA ˆ©²2ª¬ šd)Œ†yj)s0ï‡6uÈÞy¤!£¶hÛbºj¤²ažjRS1I³0Hi6b sì¥eœÒÙ­ÉѵÙNõNåÞû1Üfâx œ,·–¸ÛvýínÅǨü¯ÔMÛ™Wz)@*_äòdÉCf¨ÆÈ¹˜t…~.D,9¨”Ì­Ùk–x³b/ŒâTQ)$šE1ð9“H¥1Î]æ(BI«.à‡^19¦”¢‚›'D‘n£UL)Mü ‡ƒH˜º„L\ó‚¬qbÈVËºåØ¤í‚ñÍäÜ4i¢Y«—;2(`(ªšG¦m ê!rà Õ•œ¼ºŽ`¶uukzßF«¾›û·:öt!· ´ØYðw<{ëòÜx´ÔqY"ª*I"VúWM}F(ÇTòÑKp |ažfí>ÊÕ´YïŠplü àøL‰…Ù‹˜Sÿ&Äu,¨{@n(‰°å±3p±¨7‰Ag¢ÕÄÙé(ª±Š@0ä9<Ç!È7Uíóe«îÓŽŒ’,¤ÌQYšª•ÁŒã—CïBB3‚%9CÊÜŒ`ÈG(ì,a¶£¶Šóuí‡s»JµMÜ=:ö„Ý; úïðåíÑ}KH]ovüfèIH&vºœ¦éLŽ1&æªDÓ䆒æ¨D ‘¬E`˜Å]µ*XÝeb³E圉œâqHùÇ(&³ÁÀ'7•¼2Â\tü~ý³SµÚ&Y£ä%@Š '6ÌÂ9Ùä;· u%‡×j°ËJ§™ÑA ½Yxˆ¹M¾[c7×µôˆP“,‡<ò¬!“–‚Kv“¥8—jTTtí¦çNÞñyà|ñ%Âon•_%5*UÒ&“F&àˆ7! ³M þA@ Âeåç–j´èX7Zðg˜J53·#Aztâ>VÀ…ao¯k³ÓåkÓ§-ùåYŠêKÅgråœU»»»è`ëÚŠ(«Q@QEQESQS@%EOÉQ@Ê…ü•[ÿ¤nð¶4µ¦T/äªßý#sÿ…±ª“¿„þäÌ¡íÁËEËE[1=þŸãÑÏtR—î¹F˜ þ1¸ý÷÷E+&‹x”Ïde\sÖDcˆ©~ìŒ+Gv^`ÿÖ¼6IVÆ×è}äÔJvÞS0¿ž«VÉf¸ÿ¥§ÿT2cÿ¸®¢íqÿJÜŸª 1ÿÜ×^Ê‹½fŠÛ@ûÌCª«uÉ[Åá­s¥.ŸÕo¦?ûªá^×7úNíýVâcÿº®Œp®ôSŽÒ~æ«—óÓ {r×ôåú­”Çÿw\jÛ¸çþP½¿U¬Ÿ{®••½šüÈ­H]­É\JÓKR×þP¾¿U¦Ÿ|®e-\ÏïßÕh§ß*õœÍ’üÈѸV¹óÓ)K:×óëÿõYé÷ÚçR˵Çüû¿UšŸ}«pMØó#LHY«Ë\Šyéž{"×ü7z˜Ÿ}®sØÖ¸çü3ú”Ÿ~«PNØ/ÌQ&+ñª)–k×ÏðÌJêB}ú£€v¿¦bWRïÕcn—çF»¬ZTù©“À;_Ó1+© ÷êžÚù~‰]HO¿Sn—çBë”S+€v¿¦bWRïÕ<µý3ºŸ~¦Ý/Î…ÖS`÷ãkßõrsü)ÝS^?ÊÈ~cû¢4Ä·``m·/¤˜§ˆ’ ÉëZ$A3Ë5›”L ;8” *‡"˜rJàRÔ†•I«¹Bâ  Ñº ÚÑ#„Êd’"y•C; ˜F{ȹy³ªînÇïÔw•(×è,h¦WíLÄ®¤'ߨà¯é˜•Ô„ûõXÛ¥ùÑXµ )—À;_Ó1+© ÷ê8kúf%u!>ýMº_ ¬ZQL®Úþ™‰]HO¿QÀ;_Ó1+© ÷êmÒüè]bÖŠep×ôÌJêB}úŽÚþ™‰]HO¿Sn—çBëß%E2økúf%u!>ýGíLÄ®¤'ß©·Kó¡u‹@¢™|µý3ºŸ~¨à¯é˜•Ô„ûõ6é~t.±kSç¦OíLÄ®¤'ߪxkçøf%u!>ýMº_ ¬ZT2xkúf%u!>ýSÀ;_Ó1+© ÷êmÒüè]bÒŠeð×ôÌJêB}ú£€v¿¦bWRïÔÛ¥ùкŭÊà¯é˜•Ô„ûõµý3ºŸ~¦Ý/Î…Ö-h¦WíLÄ®¤'ߨà¯é˜•Ô„ûõ6é~t.±kSLžÚþ™‰]HO¿Tð×ôÌJêB}ú›t¿:X´©Zdð×ôÌJêB}ú¤,;_Ó1+© ÷êmÒüè]bÒ€¦WíLÄ®¤'ߪxkúf%u!>ýMº_ ¬ZOš™\µý3ºŸ~£€v¿¦bWRïÔÛ¥ùкťL¾Úþ™‰]HO¿QÀ;_Ó1+© ÷êmÒüè]bÒŠeð×ôÌJêB}ú£€v¿¦bWRïÔÛ¥ùкŨÑL¾Úþ™‰]HO¿QÀ;_Ó1+© ÷êmÒüè]bÖ¢™|µý3ºŸ~¨à¯é˜•Ô„ûõ6é~t.²qWðU¿GZßà¡KJp\,˜Oʾlæ6ûeà‘(µr´UWP̘ƒSkH\¤f ”>[ƒÏº«€v¿¦bWRïÕ^^nÆ ¨¢]ßõD¸[ƒSæ¦WíLÄ®¤'ߨà¯é˜•Ô„ûõXÛ¥ùÑX´¢™|µý3ºŸ~£€v¿¦bWRïÔÛ¥ùкťL®Úþ™‰]HO¿Tð×ôÌJêB}ú›t¿:X´¦WíLÄ®¤'ߨ ×ôÌJêB}ú›t¿:X´¢™\µý3ºŸ~£€v¿¦bWRïÔÛ¥ùкŭÊà¯é˜•Ô„ûõOíLÄ®¤'ß©·Kó¡u‹¦M”xõˆ™¨º…L†Yb$@@&9Ä @ß¼Æ â ØÄü@Äbõà ‰2þâeo™¥Ì ÌQQt¨UvD ÅÏ1&ð6"Ï kÅÂÉ%' ;ŠÑ¯‘Ïd奜T•&`%&+ðÌ@rA­n^”1çØJÔkŸ5mekk |1$šß‹§G”)¤S^¦e-xbm¾Öj‹ËÜE”v2(ø+¤J£ƒlü ³(˜®(À) G#Uð·×o îÔ¶†æ‚BA™åríC‘Û–åLŒÔ9GAˆ}‘ŠcÂRƒó ÐxÖåéC}„§ýFܽ(cϰ”ÿ¨Õ5ý/CJbûnݯôöS»þã#Š)Æ7‰…lÓÅìž‚®Tw/áìPÕ²ª™¶Š¦‘aÉ"g–àÖ4Ƥ­åq]m¦àݲ—›rá’Md]s¢ªŠ(U BŠ@%*šM™ƒ"ŽB!ºñ­ËÒ†<û Oú5¹zPÇŸa)ÿQ­ÖVñY¸ŠÕüÏ}Z}ðôë»2¨½„A;‹P·YÈÆ³’c,»Ó$ýêMå%RD€ ¢¦)3LQ7’&Wv{òÖ¾s+‡ÆsrE½A+iôC‡•pª¯Šb”DàT¼%#´ä`.dU¯n^”1çØJÔhñ­ËÒ†<û Oúak´tqCw{¥_æM=÷zÕå%n0aKJιÉKÃ;q0ÝŒÛGȤìs+”–Ì)À@¤$0‡kÉ–yX^-¹nKéÝ"W.&Ýñá¶å01nS‚¥ Ž)Æ&€0€˜2ÖxÖåéC}„§ýFܽ(cϰ”ÿ¨Ö_{ë÷¡«­w¾ÇNë¿ñX÷þ‘B­sF+k‘ü”½¾¸’ÚLGÉx4¡ðM™X¬ÔT€?ÁÄû0OÊåäÒjŸ>5¹zPÇŸa)ÿQ¬³ë6óÕÞ½”ÅNœ(eVYk,‡:§0æcÂû1â#V$mà±½~5¿ßÑSôÝ‚DD«Ø+è¦WíLÄ®¤'ߨà¯é˜•Ô„ûõ_Û¥ùÑÖ-h¦WíLÄ®¤'ߨà¯é˜•Ô„ûõ6é~t.±kE2¸kúf%u!>ýSÀ;_Ó1+© ÷êmÒüè]bÒŠeð×ôÌJêB}ú£€v¿¦bWRïÔÛ¥ùкŭM2xkúf%u!>ýSÀ;_Ó1+© ÷êmÒüè]b×䨦_íLÄ®¤'ߪ8kúf%u!>ýMº_ ¬ZÓ*òUoþ‘¹ÿÂØÑÀ;_Ó1+© ÷ê°”nÂ*Ù„Žot I}Ø»™…,yT2±èf˜Êë‚ &Ã-¡wo­6V¶n"«£ù2RiŠ`墀墺F¿Óücqú9ïîŠRý×(Ó?Æ7£žþè¥/ÝrxdŸàÃúý¾˜þáü>¥bþz¬qVkùê±Åv,Jv…cª«uÉVŽª­×%ulJ1•®j¹=X¹ªåüõÕ±*Æq-É\J×jܕĭ_³+Dr«\Šùë­ZäWÏWlͪò×"žzëW–¹óÕË3TG)þ5EIþ5EYF¢*|Õ>j(¢Š ( (Š(  Š€(¢Š¢Š( ù**~JŠ ( (§ÏQSç 5e·mèã‘¥Ïq½9 s Î0€STò6B P>Yä;À@>mäé+k•¼Â2lùºÌ‘ÖÝâJª‚f8˜ ™Ê. ™t›yNQˆo±¼-‹‚ï»$îkfÜ´l«“½*­ ßj:Å5D?ЉGV\™†` #6µ»&„6$6j—Ê "¸pÀ¦YÚ(`ÖäTÕAŽ`(gXW¨21öíÁ!¼¤|£¶ óÛ:A¢‡I<ƒ1Ôp ƒõ|àá&§\¼$D„¢Ä.£¦Í±Ö1Kòˆ@)¼Å²Rĵ䠭›µúqñÍ#øÙÔ›´d±Ha8 Sì>û´0‰Ïåg«@*¦. ´Â„\]Á4ÑÌâÅ45¶üš u"±ÄÈœNO¾¤0¤\´œGNyT_$[4…˜våãf‘/Ü.Å#¬í4›œÆn™#œà™JQÌG =~æà'`Áš…’ŒÔ…µ:;@ùK¨0Þ”äzQÞ"qÔ!˜ikz¯æò›s @$b² ™@¹Q $7“•!Š éºíЋº†‰]Ô©\6hå©…®ÍeÃtÖ)E2˜ù@.@co ®š…˜ƒvV“q/ãº'ΉĿ.F©«1+{¿U£¨Ù×¶Tj@à‚‚‚°4fEJA6^P‘7)|¢lÉ˺«!Û)lÃÂ1Än·;7I1zASfP?…˜S7”R4y@5h³Èj[ŒB˼W#3¡iÏ*W¹ø ’9SŒŠ&ò2/•䀎ì÷h¬ì9ñ•ª…Õ>æn& w*"WÍ ”z’DONµ•9t$} !¨DÄ8eähm8KíÅtKM Â3y1·zªŸx‘Í’â]‘óÒ¶ð†œòˆòfd`æ°2ň4rSrJ¨ìQ!›Êa>Y Èrç¼Å0r€Ô^ouI8šÚi-sÈA=,Ä#¶pË=Ø>bQ]~¢g(˜‚™ ¡M&ÈÓ2Žb!I oÏÎsBÁÉÉ‚šÂÍ¡ÖÙ‡Êm 9~ºlpjããoÀ|A+á|þ#ÀÔÚ x?ÅË?ã¾õÿÏäòîªë}«IËÜgkÝ3ª±Û™á!%€"àËœAEðuL)l@ä\ƒ!(Òð°ð“3OLÆ!ü‹¢”Ld6:ª(‰J9W+¶ÎYºQ«¶ê·p‘´¨’¤ƒòðr»™¹›Ñ£HfšxázÊ*Wm#·"G.E Ž•À´Úäžg(†àRÿ< /Ǥu*´¢©¤Ù1]r+tÊ )£p¨˜&aß™ˆ"9ˆÔ¨ªèA\0oOªu*éTšÁ„QxPÈR  ¨pPNSgÊ@åΡí­s²ZEå¹0Ù’ ™œ*ÉB&š…6“ÆÈ Þº´o æœ`õ¨«x‰“wqH¤ØÄlsÇQ&D!H P˜É*Påμ£–ÒEÏ)ð‹Äÿ•v±ÚÎ[•a@[/àÞHzD†0‰‰–ñ ^$H k.[r"9¼Š,$^³(9|é6'Ø2QbB¤u2êТFò¾eçÛ×ãÐW®ÓICç–‚ ƒY‡ósÕZô% ~_LJ ®5Lx´„r.ˆ‰›3óŠz‘ÿ6¥º2 s»ZæfvwnL74fÄd¡EÐd÷¼ÃËÜbü\ùC寓ëz}ŒÂ0Ï`äÚÉ®b•k49PÆŠ †¡Áo`±AŒCsöHè[±FeŒJà“™  ªTN 9mEUÕÒa‰ƒHç•~ñÛ~L<µciÜŒã·ÌÊÖAo pUM ¤—ŠbA8í© uë0fº/o¡& ݧt³s&îÚ™nŪ‚“‡*±T©"p>)Î%È¢òrÏ=ܵy!c¶c$ªÓ øÉ„)ƒµa ÂÉdcí3)ŠWŸâŽy˜N@&Ó_ñ7<§Â&bÝ’<«g¦ÔHvúÒ*ÌAÐè>C"‚z€w‡‘˜rW*.$/³qGÆ»Y¢‘`rìP1Š‚A Ôé”Dv”Q8ïþjfBŽQyƒÂݸ$#”a(íƒ|öÎh¡ÒO-ã¨àëùBBÌN:3HH—òn ]b“6çXà_—"€ŽTÂsuË?¶f­ºñ[ædEâ'É则AÀªŠŽk§YfÞD»cÜÐólpý›‡D5ÎñÒ¬Y&"ªŒÌðCeòŒBd· ažY…Mâô¤$ÌR ÜJD?b‹ƒ(DrØé•S&m*DÀa)·\ƒ¸j¾·øÄ”¢ ,”&—Ÿ¥nlÕ*1r|ð‚9”R€CÌ%JÀVIÕ ( *@ HT HPEPQ@QEPPEPÔÔ MQEQEEPQ@QEQESQS@%EOÉQ@Ê…ü•[ÿ¤nð¶4µ¦T/äªßý#sÿ…±ª“¿„þäÌ¡íÁËEËE[1=þŸãÑÏtR²IF2pÜZáŒfsgš+&àN]ùoБ‹ù÷òÖµ?Æ7£žþè¥UaŤ7Àâ+Æ"ÃdÔÎ6€–Ó<ŒBå–¢ÿâÏ<üÕã?aÉZN¨,¬é]ýµ§vÚý§n¬-oï‰^0¦aþÉçaUËÁEôÒ?ؽîôóÏúZRÖ¿ð(ÿK–õCvµõ°¦æáï‡7¡Å‹í8?±çç6üHòßøj/»µW9·aÄ7ß–àjûµz@~„[½Çêl~Ú¿#ðxHyo©;j·Øspòæô4E=Çö<ÂâÛ†þÐ- ÿa!Ýk…kfsÿ¼K`?»È÷ZõHüQé‹ß«W·¯Èü›ôÅÿÑ[·«P}—5.oÒjsP¼O&+kÁåùGµƒû¼—t®EmX.’­Pþï%Ý+×£ðol?Ó)ÿ·¯ÈüZôÊKö¸ïb•†~ÓS·…ž;RÔé2ÓîÒ}ιT´à:N´ƒû´§s¯fÁ­ ÿLå>›Žñ_‘ø4³霯Ö9ïºi•†~Ói °ï¼Ò“3ödžøot«gz¬¯r©à}½Ò­ê²½Ê½Ç÷1°ç¬Ï¬;ï4}Ìl9ë3ëûÍ)1Ó?hÜxsö÷J¶wªÊ÷*8ot«gz¬¯r¯qýÌl9ë3ëûÍszÌúþóJLtÏÚ7à}½Ò­ê²½ÊŽÛÝ*ÙÞ«+ܫܟszÌúþóGÜÆÃž³>°ï¼Ò“3öLJ8ot«gz¬¯r£ö÷J¶wªÊ÷*ö±~vѧ \Iv2ÅCÂLÄ$x@#˜i³ð­Z3 Ye˜€WÝÿÁºƒß¾¿¤Ú´l‘–]u¹"i¡™Žc œŠPÀJLtÏÚ7!à}½Ò­ê²½ÊŽÛÝ*ÙÞ«+ܫܟszÌúþóGÜÆÃž³>°ï¼Ò“3ödžøot«gz¬¯r£ö÷J¶wªÊ÷*÷'ÜÆÃž³>°ï¼Ñ÷1°ç¬Ï¬;ï4¤ÇLý£qáÎÛÝ*ÙÞ«+ܨà}½Ò­ê²½Ê½ºãàÝ Ùfȸ¿¤ÑUÒ¢‹r(íÉL±À†8€.|£h!ÍoȦ@û}Ìl9ë3ëûÍ)1Ó?hÜxsö÷J¶wªÊ÷*ŽÛÝ*ÙÞ«+ܫܟszÌúþó_ ƒ„,sŸH_òM AQe×x䉦På1Œ.r”iIŽ™ûFãÄ\·ºU³½VW¹Tð>ÞÏò«gz¬¯r¯n°ø7C?bÝóúMÓG)dE㓦© ”å09ÈÅÜ 5öû˜ØsÖgÖ÷šRc¦~Ѹðßíî•lïU•îU#gÛÝ*ÙÞ«+Ü«ÜszÌúþó_ègìP|Æþ“tÑÊEYÑväéªCe1Lr1D7 )1Ó?hÜx‹ö÷J¶wªÊ÷*ŽÛÝ*ÙÞ«+ܫܟszÌúþóGÜÆÃž³>°ï¼Ò“3ödžøot«gz¬¯r£ö÷J¶wªÊ÷*öóƒt3•œ¢Þþ“YVª‚.›Ç&2'àC€9òM ä6C¿#y+í÷1°ç¬Ï¬;ï4¤ÇLý£qá¾ÛÝ*ÙÞ«+ܨà}½Ò­ê²½Ê½É÷1°ç¬Ï¬;ï4}Ìl9ë3ëûÍ)1Ó?hÜxÚó·îiTd ˆ}dš ÐdÚlH$E0M1«cŽ`B¼»ô€å˜ˆ/íî•lïU•îUî?¹‡=f}aßy£îcaÏYŸXwÞj˜_ûí ð>ÞéVÎõY^åR}½ŸåVÎõY^å^ãû˜ØsÖgÖ÷š>æ6õ™õ‡}榓3öÇ‘ž+ªü ñÂ觯:±ŽšMC¦pÈå)¨¤˜3Ù»„CpÖWö÷J¶wªÊ÷*÷ÜÆÃž³>°ï¼Ñ÷1°ç¬Ï¬;ï5 …ÿ¾Ñ¸ðçíî•lïU•îTp>ÞËò«gz¬¯r¯qýÌl9ë3ëûÍszÌúþóSIŽ™ûFãÜ·ºU³½VW¹QÀû{¥[;Õe{•{îcaÏYŸXwÞhû˜ØsÖgÖ÷šRc¦~Ѹðçíî•lïU•îU·ºU³½VW¹W¹>æ6õ™õ‡}湇=f}aßy¥&:gí2¶¢X¹,q~Ôj¸ÅF\†1D¦ Á–y D@~P øð>ÞéVÎõY^å^¥øBàÊ8{ƒó×[¶qgŒÊÜ^9 ÇrŠb#©c†“›v\¢žêò îžrÌúò¿j”˜éŸ´n.xot«gz¬¯r¨à}½Ò­ê²½Ê¾ä•ópÎ4…Џe|ñ@IºjË s!u(r—1äÞ"ˆ€WÒ!Ýù-t%mGÜO—’YÀ¶H6šŠˆi*¢ &lÄ2(²0ˆsÌ3÷3öÇSj%‹rÇíF«LPQeÈ`J`Ìg”Då¯íî•lïU•îUXò㻼¯Ú©¤ÇLý£qsÀû{¥[;Õe{•[Û±VÄJN‘s{á´Ât “~Æg2 sÈH¢mH¡>0æ`ݘA–jjõ˜˜g?2»×®Ùº^09u¨sJ\ÄÀ˜ˆb Ë»§/ÆYŸ^WíTRa៴n5wL<ã´V_ìVÉ7D¶lÙ”±RA !@Yˆå™Œ""""&¬à}½Ò­ê²½Ê©¸Wtó–gוûTp®éç,ϯ+öªi1Ó?hÜ\p>ÞéVÎõY^åSÀû{¥[;Õe{•sAÉ_3JºJ:á”QF­x©O,)ŽÉ"‰ÔÎÄ m%ÌÙˆ@5_»§œ³>¼¯Ú¥&:g틞ÛÝ*ÙÞ«+ܨ >ÞéVÎõY^åUŒ®+ÁëÔ5¸fT]Â…I"xz¨Æ€3dÇÏZ®c¥Lû`½¥)1Ó?hÜSð>ÞéVÎõY^åGíî•lïU•îUû¹¸Ê¶Ðj¼ÜœãD™B q‘1Ês 'œw€™‡þ`ªNÝ<å™õå~Õ)1Ó?hÜ\p>ÞéVÎõY^åSÀû{¥[;Õe{•uá”ÄÜÍï%=2»U¶»Düb±sÉ#˜7”À< í¹‡=f}aßy¥&:gíp>ÞéVÎõY^åQÀû{¥[;Õe{•{“îcaÏYŸXwÞkâËàÝ õ,Îþ“r‘UQ'ŽNP:g‚ çãå1D9@J ;”˜éŸ´nÞéVÎõY^å^ãû˜ØsÖgÖ÷š>æ6õ™õ‡}攘韴n<7Àû{¥[;Õe{•·ºU³½VW¹W¹>æ6õ™õ‡}æ¸ÞüâÚ(Võ™ ùÂïÿùž”˜éŸ´ne™ë4mO÷3öÇøot«gz¬¯r£ö÷J¶wªÊ÷*÷Ǹqó,ÏY¤{jø¯…ø^‚­Ò^6Q%¨) SÝ2N1Ä¥_Ê$1²1Dyi[ãöŠ#Á¼·ºU³½VW¹Tð>ÞéVÎõY^å^÷â—>e™ë4mG¸qó,ÏY¤{jVߦ~ÑDx#ö÷J¶wªÊ÷*ŽÛÝ*ÙÞ«+Ü«ßRáÇ̳=f‘í«â¾áz ·IxÙD”r ¤OtÈU8Ç”(tÆÈ<Åä¥mÿÚ(ð>ÞéVÎõY^åSÀû{¥[;Õe{•{ߊ\8ù–g¬Ò=µ|WÂü/AVé/(’ŽT)î™Ч˜âR€¯å’Ù˜¢<€4­¿ñûEàîÛÝ*ÙÞ«+ܪ8ot«gz¬¯r¯|qK‡2ÌõšG¶£Š\8ù–g¬Ò=µ+oÓ?h¢<Àû{¥[;Õe{•h hFœ5»sÆÏ;n¥ÀõÁØ"艤E£Û‘0]ÄL"‚œ€ ¿}{cŠ\8ù–g¬Ò=µy_ntZ&É›2JFâ+fê¼UÈ¢A‡6¢¦1ÇyŒ;Ç,Är Á¢cï~íßì£ïèÿâ¾dªTóørÑ@rÑ]3ßéþ1¸ý÷÷E*ÏàÛøüûôaÿæ¥U‰þ1¸ý÷÷E*ÏàÞ`-üøL âÃòÿz•yoú3ûˆ>|‘õowþŸ3d­Í<Îä¹b£EWÒ’1QçªÝ‘8]pË\p™`»g ±W<[˜ò¼ ‡*ÄAÈm_/H€‰ƒQ ˆo¬¬eïz óò[ÆáZÐÕzá¼á0ÎffbR6uá®7q±ÅðUPÖ<ÂÍT9–PE1È%!@¢šdÑ™òS ѶmëQ³ÆðMŹ:Ž…GJ,u–1PÆPÆ0˜J™3÷ˆŽñrY–©[M4fQ¤Ú†UóU^*¢9Œc˜ÄLÇ$cæ0Š`Qd#˜€ÏeÌÏ«rLÛ)㾎nÕÙÇ tU±JQLç8”å2 gåˆ GvyV~×’ºY\8Ÿ!+pD8‰‹’?‚·r‚¨¾QÌÖ&¥ÅU4@§`T·œN e«f+ZܶRrH”Õ)Ýp»—Šº]aÒ]j¬cÀäÉ•|–´í¥¥%¤Vle™l-¤Q3µE»’ A¡«d'ÐB“^ZCNyn ÷ý+1d_–Üš‰<#›"ZA³”­çñe($‘Hb Àvä:c»!Ì¡™sÖ/‰’£cÍ_G7´\§ÀȪ£ß3’·¸"y˜žYÃï ©oFШᅈ˜<ÖÁÓ“=ŒqºŽåÝ89™¯£hˆELb”t,„4ïÓ–cÃËR×vîUˈä<ºF@¢¡7 _ŠcHœ å« Ï €¥ÂÛ¦r}̳)–kˆ2N„€À=ŠIÀ)¯4Á~^¢ 7‰L`990¯³y«¢^ø•ahfñohðŽ‘Pî褹̙Êp*`R,L³)õ Ho«{bÜ„·< cÙ”q¤UäŠîÕ0=%Ö±Î`(j6EÈ3ÛëäþÒ¶Ÿ\i\+¶P$H)‰Ž‹ÕR"˜昪™TJ;ˬ¦ËÍ•†—ÄÉXûÅàáƒØÃN#£voÔ…WnSC/”Ç(™!(d:ˆg*ß·{>à¼_£«’îâ#˜µbà먡dÅ’*¨bœÂ!»ÊL‰‰ÊQ ôVÎY%¼f³Œ°HL©xÉÀ7#²ª ‚Å@ÙâpÔ&€›3g˜s¸ vÞ&b‚‘¯p»†êNSu޲¦Þ"!šŠÛ¹wedÝ3“îe™L³\A"t$ìRNMy¦»òõI¼JcÉÈ9…V^7µÑµÝ+”7‰lýÝÊJËÜ›¦å]‘Êp*Y&©@¹úŒO-l-‹rÜðŒfQÆUW’+»TÀ\ô—ZÇ9€¡¨Ù Ìwo®9Ë"Ñšš ‰&«¡Ùí@¯M1Í=²E8&¶‘äÚÙPbÞx¸‰ÉE¬ÃǤL¨¥t×x½‰“ûè¬`•3ièÞ}G(@dîõ.¥¬ì| IÆO"Z¶~ƒV¥f©TC8vÊ ¡–1@€SŽ¢R‚uJÐHèøÈ÷’NÙ¦T–“ržh#´TM6B9ÞÑL¹AäçÊ"#S#fZò§vÙcøù™ÙJ$Wë‘)™2¦a2E8ÐR“h†@l¨ Eõt]Öü-ÄÆèikËk>Va³tÙ+°(µ*@vË”ên™¼ ¨6y€4†aVÓW}ˉ%ˆvFQp‡vÙ»E]E¹T¯ö MY;LÛ$¬Æ!SP¢'†Bƒ-UÇm[××Ç ëkê,ÿ93jçg·OÉ0|m’~WÆ ;„3ùä,ëaýÂIçmÖQáMÆŸX™TòÙ¨dû#ºK‘ŒQÒ\‡pPØ5pE¸¶#í°ŒsSÀê?Hê&’`ÍÊâp) Q ³Þ†až Ì…Ñ<ÒBV“k|“®®–ðàü4SÄíݨådÁA1ÇINB—h¤©Mäê$Œ|dƒÈ×o*«F9LÍ´Ùª(¨ˆ› ‡ïk(\‡0ò³å »í(ÉY‚0Žd»ù©H)á—nr™HU’Ql‘!@Ɇá ò͘ ÙY»Ú^à…Žpkx&á¯ãÇ7]4ÆL`XU:b ˜M’çpäêÜ'‰‰ìB¸íød'!#¤c®õ➬œrçlôG‰R% L…19¾øR 4›K†˜~ΙœË¢ÓÆ&œVi$Û½Yr5\í|øÕ°Š:µ@òŒs „/¦,Ë^T‹¦ËGr’QfÏ×n°9+r·¢g)Ó‰ O @3ÌPæ]ñ.x]ä¢n·:Z Um"‰ÎR’˜ Îo+É!wœÚJæ ›žï¹®›}ý¾/&ò>rÜX]¹¶2Mt\É2Z¹Pªy*#™Œ1NMD &1÷ \LüBñ2è‘Ë5ô‰É´e0¦)Š b˜¦)Lªì<²ØÒˆ±]Už*Ég+9’páUŽÍa]±Œu1Œ$PsÞ;Ã"Že 'lÎ^ùñFv霚·Ü_i²Ôœc5òHNáPM1)÷½#š†1õ­5–(]è[w<‹¨°\ñöËÉ–ÎmIG6AtH ”@]¾­@ b @‡òK¸iš•·”üŒÙ?…I¥²zAv¨·pJMG@M²é!K¯N­!§<·U[l;³Ž‘ŽnUi ÅXåÑ^QÊÅ+e#¢AØ@rzyä òÙ%ÀXóäs³Ã©¬¥`Üé&‰ïb'9…Cêòü€ò-øƒäã•­[rÝPˆ£ß|™À®›‚ 9夲ynÌM˜Ža“GhŸõ…ýµq‡6Bí# z©#Á8ÖåBEÂ:š2" ‰ ²`ÍSPo”s)iÞX‡x0°¦µØk>"uÁݳ]P<#RD)V.”þðDD»óçäØB^·Eàák£ gÛç^2MEÀÀïi³@šM9l”Ô êË2ùl-ËjÞ·v^'hV»(Ö±dûùÏ“VÛM‚~Q‡âíTò¾0êÞ#eZ㬵ãâX z‰!ÈŒ‚×DÀØ R‚'1U<Š•A0œ1 0’7u·'‹W49¡  &Wî›:AS®èˆbuC”å*^AC# TÌGxbéª7¶Õ¼ò>árЧmqëñ±6çÔÜͼ ™3I2ÉË“>Q«­¢ÖöЪ+ó´OúÂþÚ6‰ÿX_Û@~¨¯ÎÑ?ë ûhÚ'ýamú¢¿;Dÿ¬/í£hŸõ…ý´êŠüíþ°¿¶¢ÖöЪ+ó´OúÂþÚ6‰ÿX_Û@~¨¯ÎÑ?ë ûhÚ'ýamú¢¿;Dÿ¬/í£hŸõ…ý´[á½ÿÕ¦éþéûâüÒ¯égÃpÅ7Á¦éÒ`Á9ÿÆ!_Í:Wƒ¿•Û7ôóÞ Z\){am2³¶®T\ŒÛ0EEgÐP„>ÜšDÅeY€3äÌ9knLÈ[Ó&¢”I'ÌÔ[¨£tÖ9 ¥B˜¹‡(†áÈ@¾‘ ¤MЕËfˆI"à\¤pdˆ¦š‚":ŠS.B9”¹@¹dbá¨/a—NÂF}¤|s¹²‹³2Y¦èÓI$N ¨&gM¼@Gï[²ßZ&MàÓ”m8â9›$-¿8]2Žsáb€,¢ Sd‘ÊMÁ¤Å)—&EË ¬ô¢èRäBå‘D¦a ãTâÂÞxØ,"ËÙªgc$Ý‚ ­&L„6çT„c˜ s(—#fr‰†­ñr·¸UŸ+¶ª?U©™ˆ¯ÝTÊ‹ S"G ¦B‰3.E(y"`ä0€ó½º¦^Û -§b1ŒÎ'@…ŽnEaËPíJ@PDr ó6üƒ<ò ]u¨>vGã¬éÿó _Ö[ñßýÛþQkùõXéF²†UªäX€p(˜¦yy³ ô+†.&1bÝ‹XE6íÒ*IÁ’3Žà¬Á¹ÿé0þ>ÃÿxÿÁ­xâ™Xߌ÷N/ @ܬaÚŒVÛaà (M[]ž­ZÔ>ylË–Yr--h † ~R¢ÛÉ=K±‘üú°Q6êj™ÔÔ¹X¨dx1Š ²ÆÉ]&Àv Q8LaÒ´×óG?)Q?í¿äž¿ª×TTôi£å µ@LS€‘s$¢g(æS‘B†ä1D>Z=„Ž 1R±Ž‘nö.HÍ]·y*¤ˆ$ ¢’  ¸PE(C†½à'0d&Ι»­øUeЊ[Ê_/ãÌÔPWÂÌgVCj ëÐ]**FÌs)sÔ9NÚ„†·#F>!-Š&PË(e:Ê*¡¾1΢†1ÎaÝåDwÉ_ [Þ(ñO‚À¼eãMžÜÿ…x_†m3ÕŸñþ^œôù²Óº€ÇðÚèðŸl¡¸5ÂOxÉO ÏÃ< oµ×£øï+g³ø›õ纻ö” Ç›^ÂïhÐmø¬µg¯cågžZ÷å—“W´xKÂð ÓáŠø>ßN·ƒëÙmrÿâhÕùë™ÞÙ¦|j¼z¦_ÃÓ’ÂEÁ[•Ù*…\6@¦²€‰€¹›x`"}­Óˆ®í{‚âfÎÚm$ßGÇÇ·d±×1P‘3o9¶¾V”ÓP‰Jq(i9sÒŒ3župA¸pùû'Ž[;3u Þ9Ã@„6•®"¢G \‚#™D¦ò²Ó[vù Áx6–\¬íTÈåB›lªæps”àme6ÔÆ8 D4ŽZr ¾¶Ä-¶ÅV‘:dYa]ut£…VP@ 'QULcœÙ¡™„w€·¢¿;Dÿ¬/í£hŸõ…ý´ê²÷©\3š©"äS8"¢© „!ô†‘1@ÅY€¹òfµ¦Ú'ýamb±dX=n’0ó2Bb‰„X³2¥ nÌÛƒ1Èwˆîß–aœ>ÂP©Âéli”»dÚßPÖÌT4j‚ŽÙ¢ ßœJS c* ä%0œÅÿÉ– >„/Â÷òg…ïùÈת¸Nã™÷g³Gß^\øe4tÇp¹«ÖË6\ž7֒Ŭ€†`;Ãp€Ô z ÿ$ú³û¹+“g„³–GrY  Á˜¶n¢êêg©B¦˜ Œ)¦@9&5q+Ç l$^É3j ÚñÆ,¹H"†yònÙ]îŸÚ.¤ÙI8–‹QÓSÁŽ/‹’zÀçVB9Yˆf"–cž/´›fò^6ЙbŒŸ>‹‘A£Ì¢áºË"ír‘²ŠíŠU¥2†LÆÌÛ{ó¯Þ%LÊÚÍ-9«œI*Ê}e?ÉmŒ(O=̇9´d"9˜N%†¡ À52ű%œ.¼‹Ø‡pÐY-©ér:"mZDÙFÞÊ\Ç! ƾ ØL“fD¥ª,Ý™â's.uÔŒ‰Ñê(cïg1r0ˆdƒ 8™¾”—€†n½²“©H÷¯×_ÁÖ]&äIFÀ™I’…Úî\@M™w¹i› ¶æ˜J)"Ì:<™]8]n@bä($LCœæ(€ ü’çžyoµ†o`øl¼køÆæjšè·‘̈¦¹Ó:„!DâR”L’bȺr.@#ŸÅôvŽ#B2wY¿ZE+ðÈŽ*„9þ6üʲ¤wddzÀÄ9Ë’b%CE®h¹rœä)`_!à$Ù™DÌ£¥ ±T ù|£—H˜7×+i‹’~k g¤$‘2²j»hÝŽW Êhׂ™T8œJ ‰ :„ M& ·çiãaül°I²’f’Å9Κ~79›¤cæ2h ‚™u1)@wË_0˜jÊm¬ËgŒíšÊ.×9s™&çP‡!öi š ˜ "–`p@Ý÷c×vd‹’Á„-Ô¹öh&Š€åªBÑw €œN%9‡f]C¤ ]áæ ç.Iˆ• ¹¢åÊs¥|‡€“fe2Ž”.ÅP0 äiòŽ]"`ß\‘pñŒ×Œ-¶Qñnœ¹i°›UcU"‰é“rä©„Û1FŽEä­Dc ?– 6RLÒX§9ÓOÆç3tŒ|ÀÆMPS Ž£f%(ñùh xs?kúFáÿޝgðŠßùö/ÖÓ÷׌13ðF¿¤nðXê­7øOàþLÉvˆ`墀墮˜ÿOñÇè翺)X¶ÒÒ±fWÅ’oXí2Úx:æO^\™éÏ,ÇöÖÑ?Æ7£žþè¥/Ýrxt„qAc …Ó·è}äÌ*)†žS¡{¾ìK¢l?¿«öª¹{ÎðK®t?Þ ýªå_ÏUŽ+¹c1kÌóe+K80Gk›ÞôK¾àì’[íUs›îøÝy\Aý’k}ªàuUn¹+§cmiÌó)G8N/ûð9/k”?Þ«ýªá[ïðÏ+æç÷²ÿjª\ÕrþzêYZG‰V8VÚ¸ˆ@¯» ?ÞëýºäWq9/Û«Úî>ÝQ-É\JÕë8âįF…LKÄ`ä¿î¿l8ûuʦ&âHrb Ûí—n³Ê×"¾z¹OLI51?ÀwbÝí§n¹ŠXšÿÞ-ßí§?n³jò×"žz¹4ÄiŠ˜ŸŸåðöÛŸ·QƦ'ôxûmÏÛ¬þ5EXF³aƦ'ôxûmÏÛ£LOËòxûmÏÛ¬uOš€Øq©‰ý#Þ>ÛsöèãSúG¼}¶çíÖ:ŠcƦ'ôxûmÏÛ£LOéñöÛŸ·XࢀØñ©‰ý#Þ>ÛsöèãSúG¼}¶çíÖ:ŠcƦ'ôxûmÏÛ£LOéñöÛŸ·Xê€Øñ©‰ý#Þ>ÛsöèãSúG¼}¶çíÖ:ŠcƦ'ôxûmÏÛ£LOéñöÛŸ·Xê( ˜ŸÒ=ãí·?nŽ51?¤{ÇÛn~ÝcþJŠcƦ'ôxûmÏÛ£LOéñöÛŸ·XࢀØñ©‰ý#Þ>ÛsöèãSóü£Þ>ÛsöëSç 6jbH÷¶Üýº1?¤{ÇÛn~ÝcªF€Øq©‰ý#Þ>ÛsöèãSúG¼}¶çíÖ:ŠcƦ'ôxûmÏÛ£LOéñöÛŸ·Xê( ˜ŸÒ=ãí·?nŽ51?¤{ÇÛn~Ýc¨ 6Ûsöë@P51?¤{ÇÛn~Ýjb~_”{ÇÛn~Ýc‚§Í@l8ÔÄþ‘ïm¹ûtq©‰ý#Þ>Ûsöë@P51?¤{ÇÛn~ÝjbH÷¶ÜýºÇQ@if¯ûòn5h¹›Úä’`¶[VÎåY%4˜ ˆcB!˜r€ f¨( ¨©¨  (¢€§ÍP5>j(¢Š ( (jB jB€Š(¢€é‹ ŒŒ[×,^ mh¸l©“Q3|¥1Dó…j8ÔÄþ‘ïm¹ûuŽ¢€Øñ©‰ý#Þ>ÛsöèãSúG¼}¶çíÖ:ŠcƦ'ôxûmÏÛ£LOéñöÛŸ·Xê€Øñ©‰ý#Þ>ÛsöèãSúG¼}¶çíÖ:ŠcƦ'ôxûmÏÛ£LOéñöÛŸ·Xá© 6jbH÷¶Üýº8ÔÄþ‘ïm¹ûuŽ¢€Øñ©‰ý#Þ>Ûsöêšåº®‹›ÁøIrLMx6­‡Œ(ãe«-Zu˜t礹åË|•OEpUÎ ¦˜\sD“"I—ÔȄ!@¤(­Å)@(áUÏÎ9]SíU=Ç ®~qÌzêŸjŽ\üã˜õÕ>ÕSÑ@\pªççÇ®©ö¨áUÏÎ9]SíU=Ç ®~qÌzêŸjŽ\üã˜õÕ>ÕSÑ@\pªççÇ®©öªxUsóŽc×TûUMS@\pªççÇ®©öª8UsóŽc×TûUQòTP*¹ùÇ1ëª}ªÜ1téîA:zåg+žFæÖªÇœÙE1ÌGxî WÓ*òUoþ‘¹ÿÂØÕIßÂòfPö‹`墀墭˜žùpå“«*àúfNRÈG3¹ÈPÝò˜À®³(É1A¹RZ-ÙËžk,£9·ùô*RîäÜÉV·Wá¦þÀÿ€VUÏ)«ÂäbjÎzÕ’Š7YÚ´ÄWžÕ€ýj¾í«…iˆ=«mþµd;j®_ÏUŽ+³dÛïùhs#²êËUæ!<ö­­úÕ’ÿÑjá^bÏjÚ_­YOýªWUVë’ºv0·ßòЧMóïžÕ³Z²Ýµq«1moÎÕ²Z³µf\ÕrþzéYY·ùŸí¡Z(Mb“Æ[í[õ«3ÛW2“·žÕ°¿Z³]µcÖä®%jõ‹ç¶†ˆª“§žÕ°?Z³µs©1iyí\=ýjÎöÕˆV¹óÕ¸%ß;ý´4Än1hçø«‡_[=ÛW9æ,ýÿöW>¶¶¬¼µÈ§ž­A,üH¿m Q1€i‹7?Å\5úÛƒ¶¨ñÅ›Í\5úÛƒ¶¥±þ5EXÙ_‰kC]îƒ'Ço5p×ënÚ§Çn_Џkõ·mKJŸ56WâEšÐ^è2|qfóW ~¶àíª|qfóW ~¶àí©iE6WâEšÐ^è2üqfóW ~¶àí¨ñÅ›Í\5úÛƒ¶¥ QM•ø‘f´º ¯Y¼ÕÃ_­¸;j8³y«†¿[pvÕ>8³y«†¿[pvÔ´ )²¿,Ö‚÷A—ã‹7š¸kõ·mGŽ,Þjá¯Öܵ-§ÍM•ø‘f´º ¯Y¼ÕÃ_­¸;j8³y«†¿[pvÔ´ )²¿,Ö‚÷A—ã‹7š¸kõ·m@LY¼ÕÃ_­¸;jZ HSe~$Y­îƒ'Ço5p×ënÚY¼ÕÃ_­¸;jZÑM•ø‘f´º ¯Y¼ÕÃ_­¸;jŸY¼ÕÃ_­¸;jZQM•ø‘f´º ¿Y¼ÕÃ_­¸;jY¼ÕÃ_­¸;jZÑM•ø‘f´º ¯Y¼ÕÃ_­¸;jŸY¼ÕÃ_­¸;jZPÙ_‰kA{ ÊñÅ›Í\5úÛƒ¶£Ço5p×ënÚ–´Se~$Y­îƒ/Ço5p×ënÚY¼ÕÃ_­¸;jZ M6WâEšÐ^è2|qfóW ~¶àí¨ñÅ›Í\5úÛƒ¶¥­Ù_‰kA{ ÊñÅ›Í\5úÛƒ¶£Ço5p×ënÚ–´Se~$Y­îƒ+Ço5p×ënÚY¼ÕÃ_­¸;jZÑM•ø‘f´º ¯Y¼ÕÃ_­¸;jzZQQåG_¶‚÷BC–Š–ЏbÿÙxymon-4.3.28/docs/critview-detail.jpg0000664000076400007640000026723611070452713017760 0ustar rpmbuildrpmbuildÿØÿàJFIFHHÿÛC  !"$"$ÿÛCÿÀ©A"ÿÄ ÿÄk  !1A"QTVW“–ÓÔ#27SUu‘’”•ÑÒ3B¥²á46aq$%5Fv³´&CRstƒ„µÁÕ '8DEbr‚…¡¤±Ä9Gcd£ðÂÿÄÿÄ?‘!1QR3ASaÑq’¡áð"BÁ24C±²bÂ#cr¢ñÿÚ ?ý=>\´Î”Êy)'TDDáà‹&<9lÎûÊTÊãUÿÜÇ!¥Py~ÕYVW“×âÿ'½¦l]0!+Ü“É×9ÔŸtGlgï}ñó$éÌÝž©±Mb²§¤¾Ü‡KN©deÄ4ñj.Ô8”šLóœ–86¶g}¿å quÜuVê¥p-PN¤Ýü­[ÂRކ[ÂH¿U´'<çÎy>#À®»â«qT^~¥¡6¬Ê¤Iu¦eZA „FqzÚ=F~èJÆ”‘¨õ`ÛùlÎûÊrÙöÿ”1§·àÔ A6êu™i+^µ:ëM6HÉhB[Jp‚23-Z•Äò£áˆ{òÙöÿ”0å³;íÿ(cóõñD~]chµf-jç¦É.¼§OªTä:©ÆMe[²3pˆNO%¤ÿ[wwÝ÷‚®Jù[ÍTŒ†,.œ˜rR¶Pé®Bä:—Ij4›""Ðg•RB¹Y¯6¯Q¨¾Ä(1Ü“!ÝKV†Ð“R•„äÏFx"3¬U–û²b¦§\Œá4úPþ£if”¬’¢#íOJÒ¬BˆùŒ‡Û-F«>×ÚSgs&%œ¨¨¹hÓ-ÄJÍkRÒkíÔâšF…$‰Mžuq!¼¬\UÅV*t†ªÝOmÛ­ŠKSI–ÍPØU1™&IÔ“I©NšF²WKàˆÔ9lÎûÊrÙöÿ”1Å$Ý×Du^5‰5·›»‘EjtVb!öXä-é$–é‘`Ö¢A%9>sÒD\xåX§Ä«ReÒç´OD–ÊØyúÈQ}›[3¾ßò†<¢U—-¥;¦© ¥Å´jiýDKB NHùÒ¤©&]FGć-)ókÔ˜;<žúª”¥Ã­¹Ì¥Ã¡Ktÿãжÿ>¬{Ñá6¹wˤE~B^麥i¹I§$Í6£Îq¦wi’[µ6„' ýcí8äÏ"½ËfwÛþPÖÌï·ü¡=¯9º¥µK©µ+•·./¥ýÖïzKA(—£õsœã£8¿-™ßoùC›çhLZŸª ªÈÞ²ô•òc#ܰÎëªÔ´å)Þ#‚u(óÁ'ƒ¨”zEÂÍÇ>«E¢WîX•Y-rzËú„¼dÆ•hpÙI±¡Â4£¶RŒÌø™–šá«1qÛöÛ‘¢T s@‡ZjiòŽ8•hq×ê "Q“NQ¥}¢ŒÕÛg}¿å kë—Dj$92ª••Fn47¦¸FꔽÃ$Fë„‚Ê”IÔœàß$¹Ì‡>½*2®c-N´§WEFÒ\ç99$ðk‹¼Se¬•Ú«&“éÁž X;[‘S§ÚµJ•©U8ÏÙù/½%¶IÇÜl£j3iIiKÎ$‰$Ddeœ™d×ùlÎûÊrÙöÿ”1à =ùlÎûÊrÙöÿ”1ùºÊ¢.™elæ°›:Ô¢%õÒ Ušl“:‹ûÍÑ-†ó½3$¸[Åá+YöØÈ½uÇ^å}[뀴uÑÔ^¡nѺå[Z´ïwº?Â3«NŸÕÇ$_–Ìï·ü¡‡-™ßoùCz«q\XMm»´¡‘ÝìQzɘ4½ eI77‹k.gV à’à¢þ_¨ÞÇo¿q±w­*;¥ÚK0—OaQÒªª„“VN)hI’ˆÉdG¤ˆÈÏ&`v>[3¾ßò†¶g}¿å rên±m½rÒê7,¹¨‰›&,× °© T©1º$ ›lÌÔÊI Qa&æU¨“Æ¢ÅÍ´'o …¾Ô›¼Û‰ Z%3Cå{Å’’éïI¥4’$”\-áj4‘ Ôå³;íÿ(c^*Å^Q}øS£·&;º–m­$¤« Á–HÈðdF9ý»P¹îÂ:$Ö•JˆÅ¿J©Iƒ ÞK’rNñÓJòÙ“$“Ð|HˆÒ¢âgRÙ=Õ\FËÛ”fQœ·­&‡CÝ‘¹=)ˆ•"J–e“B:R–̰y%«µHß–Ìï·ü¡‡-™ßoùC@®»â«qT^~¥¡6¬Ê¤Iu¦eZA „FqzÚ=F~èJÆ”‘¨õ`u{~ Bn§Y‘V’µëS®´ÓdŒ‘„%´§##2Õ©\O*>qËfwÛþPÖÌï·ü¡Ê)T_µ{ª©ÖU§Uäõø¿ãIïi›LJ÷$òuçNu'ÝÛûß|`uî[3¾ßò†¶g}¿å s.éíÙ©”åU”Ô•yu%9Kd£g«;ÖœsònœjÇmœñqj·ctÞ¹Þ¹Þy‚»\¥4á°LœeU• $j$o5¥&FJ%v¤FFy3¨Ò«ÅUй0*/¼Ò$=JÔ´áÆ]SN'Že¡EžcÆK%ƒ¯Õ–ñÚ~¦¦œ’á´ÂVþ“ud•,Ò’3íJ¬BLùˆÇÙåN±Q¬Ô-‚ª;nÆj©Zz3­´Úß©Ôe³q BRÑ™e85é3"G¿ÉÙ”Š#gÛ(ŠŠÔ©UM†ßKí³îlõ%÷I„šN—A‘žWÀÈÔeÀ×ùlÎûÊrÙöÿ”1Ê,ËŽ½&EŸS™pôÜûÞSKÜ4”ÓðÂÝ÷3JI~æ¤+Ö¥eK/{Ì<ìJ­ØT½Öj÷;ÕR¹Úm¹‘W †šh×Ù)[f„‰Yg•OQ™xÖùlÎûÊrÙöÿ”1Ç6muÞ•ª­ £>=Iú¹¼Rš”ªr#F2mkJcîÝ9 ZT‚B’áàÔfHÓjØë•Ùö¿_¸$UeÕ©‘e) ŽËM2kl”z ´äõ­Fe’íI%Àyå³;íÿ(aËfwÛþPÇ€çÓd\Œm~·Öý*“PÕ@¦o¹uIÈš?Â*tèaÝYí³8Ásç€ ú²Øv;OÔÔÓ’\6˜JßÒn¬’¥šRF}±éB•‚èIŸ1õå³;íÿ(cÛ5ZôkÒS3Z‰EF÷äÓãÅ|ä´¦ÊßC©I8¶Ð¯|ÓJÉ%'’2âYÍf­|^&ýM©rI…]‘£|pé-´¶M&¢r"tœlÍD”—(5ºW¥*½N¯P#J¨¾Ûµ *u,÷ŽN:iÉsv,òx.׿Dy\¶g}¿å r:túìÚ¢Õ}©(‘í}†•-qNJÚêDµ‘¼Q–¦’¼­E‚ÆI)V’Ô"–í¾¨Î™iµJ-oºÔtRÉ:°I.*ŠjV” JR´¡$fx™»;ÙÛsm;³ )qDEÔœþ,yv>Ùï‹Ë3ÍøžŒs$ÌŽ»b;è~:èìºö… ÛJ“¾Y8î ¹µ¬‰Jÿ„¢#<˜Â‰K°¢"r"S­¨é¨!MÍKL0’’•’’æ ·##<‘ç9Øûg¾/,Ï7âz0ì}³ß–g›ñ=mú­JùN—OâV¥|§ ˧ñŽÇÛ=ñyfy¿чcížø¼³<߉èÀ™4F\P“iu(Hžúžy–¥è34’HŒÕÔ¬!(AÍG¥)#3ÀØ&c¹–ÝAšIê[ ³L¦#’ˆ:RIG6p‚IApݶ{âòÌó~'£ÇÛ=ñyfy¿Ñ€&³Ç­ILªÄ+r¢úS)v[Lº´¶¢2RÔFzLŒò\Ç“ÅǃT¢Ô`1.€Ó“Ö—T˜íHiå¤Dn¶f[ÎÕ´£‰‘à‹X,]¶{âòÌó~'£ÇÛ=ñyfy¿Ñ€5–…Ù¢Û³©fPª Ôd‰";LÅQèCiBʉ(JBHŒÕïrffcsOgS£E‹Ofƒ ˆn›Ñša-6–4©´pJ+Rr\p£.“=¶{âòÌó~'£ÇÛ=ñyfy¿Ñ€6ýV¥|§ ˧ñSj4çá¼ÃUÆ"8ãjB_iæm– i%’“’ç-DeÉpÞÇÛ=ñyfy¿чcížø¼³<߉èÀí¦©;Roj5dNy´´ì”±H'\BriJ•É2dY<Ÿ ˜ßÔiö5J"!Ôa[“#!åÈK/´ËˆK«Q­nLŒ‰JR”£>s33>&#±öÏ|^YžoÄôaØûg¾/,Ï7âz0Ùº¥!´%¨ÁJDIJ^Ap¸‰êµ+å8^]?ˆÔv>Ùï‹Ë3ÍøžŒ;l÷Å噿üOF©Ö¬*n[Rë7䊔†‹ ». å ¿°Õ Ì…‘º= ôH ×$RnP3ÉæÔ™ˆ§‘Ûd´èBRœp"Ò’àEœŸ‘Øûg¾/,Ï7âz0ì}³ß–g›ñ=g±"ÝbœŠkÒš‚Û$Â#!m“Il‹I ’\ $\1Œc€ÂÇOM9ˆVëP‘èÉŽ†™Kieã%:Ù$‹…™©<Ê2,äy?aìå†}ÝŸY‰m´šÔ}oÄ<OýìRz½ìmø–ý× Ñ'Pêµ+å8^]?ˆò›Q§? æ®1ÇRûO4kh̰KI,”œ—9j#.HË€æ^ö6üFË~ë…èÃ«ÞÆßˆÙoÝp½Ö³;R9éS¥£:‹L¢4âsÏ…& ×'³º¹ÕÝŪÚtrí r8Æ7žûጊW½¿²ßºáz0ê÷±·â6[÷\/FÝW-z%^ôf»"¯n¥–ä1%Dˆ ”Õ©“Jƒ•¯;½hJôéÏ jÇk×lr^K®ÉùG)Ýe½íî÷yŽm{ÎßW>®ÛŸˆç]^ö6üFË~ë…èÃ«ÞÆßˆÙoÝp½¢LU¯3”ò³£Hål¥‰;Óm{æ’j4¡y÷É#Z̈ø¥wLkÝ¢ìõÚ[§)6²éñ–n1QØ6ZQó©(ÆÚD)}^ö6üFË~ë…èÃ«ÞÆßˆÙoÝp½¤±*ÞbB¤1"–ÓËi ©Ä-²Q¶ƒQ¡eÇJMkÁs¥cœÇ‹j0¨J`¨­MˆfÒy3fDZǼN’Á`°EÜó«ÞÆßˆÙoÝp½u{ØÛñ-û®£^"Rì(ˆœˆ”ëj:jSsRÓ $¤¥Dd¤¹‚íÈÈÏ$yÎFãªÔ¯”áytþ#—õ{ØÛñ-û®£¯{~#e¿uÂô`¡ÕjWÊp¼ºäÄÚ Èu‰tÖœ’á:úân¬’””eïJœŸBH¹ˆ‡4ê÷±·â6[÷\/F^ö6üFË~ë…èÀ¯XTªÊ«»~>åIjBÕ-P(¦ñ© % Í|VR¤¤ËIs Æ»c’ò]t~OÊ9Në-èßow»ÌskÞvú¹õvÜüG:ê÷±·â6[÷\/F^ö6üFË~ë…èÀ ÊÔ4²“*)¥‰*–É{–}JR”ê{‹5-fj.&j3é1åO‹fS´•>5&™J˜[„2Œ>¤ï×4¤ÕÎdfYÀ õ{ØÛñ-û®£¯{~#e¿uÂô` üöt ¤š¬(1jÿ¤Je !׸ç·YqWéf—l2Ä]¶©øäM¤Û$ÆÂ ²Ý—êa RxcµQ—1ŽuÕïcoÄl·î¸^Œ:½ìmø–ý× Ñ€/±¢Yqk.Ö£F·ØªÙï‹Ë3ÍøžŒ·êµ+å8^]?ˆuZ•òœ/.ŸÄj;l÷Å噿üOF¶{âòÌó~'£mú­JùN—OâV¥|§ ˧ñŽÇÛ=ñyfy¿чcížø¼³<߉èÀ~«R¾S…åÓø‡U©_)ÂòéüF£±öÏ|^YžoÄôb¿tÃØ¬û,\væÏiN>“[%*‰ ½áàñ–øãþÒî€.ýV¥|§ ˧ñ«R¾S…åÓøŽ_ÕïcoÄl·î¸^Œ:½ìmø–ý× Ñ€:‡U©_)ÂòéüCªÔ¯”áytþ#—õ{ØÛñ-û®£¯{~#e¿uÂô`¡ÕjWÊp¼ºêµ+å8^]?ˆåý^ö6üFË~ë…èÃ«ÞÆßˆÙoÝp½¨uZ•òœ/.ŸÄ:­JùN—Oâ9W½¿²ßºáz0ê÷±·â6[÷\/FêV¥|§ ˧ñ«R¾S…åÓøŽ_ÕïcoÄl·î¸^Œ:½ìmø–ý× Ñ€:‡U©_)ÂòéüCªÔ¯”áytþ#—õ{ØÛñ-û®£¯{~#e¿uÂô`¡ÕjWÊp¼ºêµ+å8^]?ˆåý^ö6üFË~ë…èÃ«ÞÆßˆÙoÝp½¨uZ•òœ/.ŸÄ:­JùN—Oâ9W½¿²ßºáz0ê÷±·â6[÷\/FêV¥|§ ˧ñª¥!I4ª£I2Á‘¾“#/¤s¯{~#e¿uÂôaÕïcoÄl·î¸^Œ~Zh[öÕV#mµœ¶O¤ÉYçç>žcçÉpÕB]š ØÑ&Ã-L8IB_IšŒÒÛ“1Ïú½ìmø–ý× Ñ‹kseµ‹Uêå˱æDS.ª<¦møŠmfDf“ÝáDJI— –HË Áƒæø…O¬•ò„ŸøÕ÷1V«ÕªáL;u)W'iÜI4k'JO 4’÷稰jæ.bÔy"²W£¢S“â¸jJ7Q¤ðdG’<AŽwrÔ&Û°ÍI¢6XdÊ;ì¤ÛÉJx#Xm|9±ƒçOJKÈözÔiÞšÝÞù_µ´šÚ=,P[»ß/¾e¾=n"ž‹ôKŽü•hlž†óiRÉ&£I)I"Σçè1@¤Ð+g[§Ny–Q©%!gÊg‚mÄhOÆgŸ ^¦Çn\7¢º§RÛÍ©µN©¥‘`Í+A’’|x)&F\ädcF‰RµH^´lîiÐkW«Mʼp»ðò=GŒ¹,Ä`ß}F”’ž 5šŒˆˆˆ¸žLÈ…gf¶k¶u:\y7MÃrH“!Nrš¼å¾¦Û#=ÛiI™¥8IöÊ"#Z²g‚Ò”ï«Ñ_™LS1´oIÆÜI-FDzJ±’#ǽî fÓmFRå5È´¶–Ö§ Du¶•«($§Rˆ°fF®%žn$6ù¬ÍmFÞ¤8Ùéu¥–Ú»†_öó9 dâ•Jy†e´–Íä¨Ûݺn&’2Æ’<öÅÌ7Öü\¤ª2ýÉ[³m  É9Ïl}'ÿȺ:LåØàã&d7c)çÙ'ã.“è22æ?ÿÓÉ SiÍÅrd™®—}ÃR–®œdÏÜ"ÿæy3¨&»RG£ËªK3&"²§WŽs".bþÓæêvT«.´ûUù1Iç7m¡˜iLe9ñi[¬ž³Ï~Zº¹ŠÛ´%P`ÄzRcE•,Ñ%J&Œ e×x•$‹RyÇ@¨Õ£HJŽ3é‘UŽÂº{*y¸ÊŽö ”³SiG Fxg‡¥öF‹ N²PRm÷òá¹5kßÍn?;í])ë•%QÂËô¿›ãò-•F·"å©BªÌ‹!¤BŽû aƒl‘©o!YÉ™ä÷dgÄȹ‹ºv±LÙd¦œõZKZdÊV‚Q<ãš™JF ffeÅFGÃ:³‚1ä{KÓ%MY+.îä“áæzÚ©³ÇXîÞûûÝÍ,©“¦IqŠi:DÉ,Õ»JMkÒxQáD|øsdÏ›‡>3u*„ ÌŠ†ùqŸI©;Ä ŒÒ\êN’.ná—â_Ûü0éR«Š~K8¦–묡¥cY©fi<ÿÁí°xâGÐd|qn‡\’ËÈŒóSÊšq <¡GŒ£I"? kîxŒÍ£9Lc•Üio4\ëB\J”EĸàŒs’”•¢ìÉM-ìÑ×j(0ÉΫ,§;”´ÚRÑ0•g‰ž¤jÐŒ–LÔYþÃ<ÊЮ®­ÈÓ›KH¸)-$Œ’¢?zâ3ÇB°xîs×ÔYMg[‚‹-¹Ó7­5ù¹|Ù¸ÚMQç)|˜ó’çVäÈõY´ê™»DåÐbòÇ$á/+&âx{ÓÉSý…Ü´ ¶Eëê9Îûßw¹«Z5%ø#eó6Õïòÿù3ŸÂcÇg×mÏcÅ%¹lé4:TH1 ÍûîGlˆŒðfHJu8â’•mÅéV“!í^ÿ!Ïÿ“9ü&+”ºuEÿcÎË+t¸ÏM~O¦O\F[58û*§ª3ºH»cR·I)%)fÑ!%•‘•ôª•ihõ'F8¦¢Ú\ÚNËõe`”¤“vEREç¶)¬Qj”ÊŠ$M®Åf©J‡tˆ*†§£7®CÙ `¦G[ˆD—;R¤º‚B ]gbBNЭ4M“0ꌴÂä°XI8ÛÍ%ÖŸB5)ImiQ– ÏJÛu¥îõ«óÕ94Ê+Sk6½Zâ8í¥i)Ôú•9ÈÌÓRÛL¥ :ûdÚò˜‘’´¸zÛä‹3s¶IÉìþÇz1¯qS£®%\X4Ê+JÉï¡ÄK†‰ RŒÔhZ¤- ÉvÉi.”—cÆöw·)ûCKPÑã+Y¹bµ•°Û½ÙÞû»÷¾ß_CThbžçºÞ|þýÜÎ…»Ê/Š¥³Étò l9Ü£yç(vR4iÇ <›9Éç_1cŽc5HW%QTø‘™”ûZÚ4òKjÎ0yS–òZxã%šbÅ¢];^®Ë¹íÖêp ݦ1r™53¼åsF{]âIMžK¶A,°e«KfVµ9Ëž>õ²ŽUZ³cR#»6m O+•¡‰Hš‰›fM-M-¦ÔNšu‘8ãHý)榅T\¡À­Òßå*›•Ý Nñ§JB°¢#,¤ÈðdGÝ£ódz5»LÙNÊ(³¬™­"-u†kô֍޲ì™mÑåîzåRF¥¤–N%&DjâC Ù”ØQí Š$ZõtۮݡR“ÆžŠÑ=væäÍ*i¤JKšL‹KdyN;Pâ©uPiWå³÷}GŽÜ‰ØejÝ!ÍZ=êORAö©Ê¹¸vÅÐâÑ¿Çü“õºï¼—1ò èÏÿa|ŽÿcûLcuÞ»³ÖÍ[¯~»9OW9›®¥ò­zyV4nù¸îug_¬îCÆÎIƒCцë­%kŽñ Üd̲hQ¡JI¨¹J”Y.eÄqÛbŒtݶ.DJ ‰ª“QšôÊŒÚÑäÄB’â’e?VêK£JÎ Ò• σ[²z¡nϹ합úU‡m³çÄFO ux""GüÇTÛ\47­dQê²U* ‡ži•N2º£{ÒBÒyÔÚR׌hJ¬ñàAÆ®+& =ëÞ‡H£N¤Û’©T‰(f‘N5´¹%*VÿK)Á9–ÛŽN¶žÙH<`ÍE,(6щZµ­$B¨B«I ¨ïSÛ~<¨Èl¤r7 × L)i<–¼¬€;øÏslû‚¥L•G®SêÓ›¡L¢Ð¡ÉR¼™ªÌ<ô’Zx™rtÆÖ²÷ªeÓ3íx_(”¸–×yȡۘ 3Aƒ=¨¨]¬‰I\íòXl°•<¤"9Kfmç߀-÷Ýw­{½sr^WÔŠl‰ÜŸy£{ºiKÑ«§:qœ3ÌaoWz¯W¸éü—sÔJ’ ëÞjßj‰F¼`´ÿHÓŽ>ó9ã‚â»v ³>6Ñ[«Yµºýnu<ÓkÊ…MvNå®H”›HudÉ“äò”“4›‰Yó¤mfЫ ÚµÅV®R*[9Ë……”c­X©ðÜÅ6Dg%”­ F $ÚÐjÂ&mÒ+”7}"ÙaªlÙÉ‹$ˆÔ’Еė! Μ,Ï’):HÈÈ”J>‚U˜q·™¼äÑ+3éŽTiÕ‹ê\É)Ð¥6PاLˆÁ¹ŽÒ÷MµQ½ƒÎ¬Ô퓦E«ÒmÍrÌ…y´óԘֶݧ*˜É¨ša%ÅëSh##Ðá`ðdê· w©{rŸÉwÝ[©.½æÎ˜’$kÆWô}8áïóž5Ã]êE^ܧò]÷VêKƒ¯y§s¦$‰ñƒÕýN8{ü熊Õh-.‹D7ìÚÛöz/•Ë‹HE9Õ9ÔÇÛ3Tb-hdäŠÝK)q(ÓÛMT ²ª% Þ³+oÙè¾W.-!×MÈÔþ¦>Ùš£kC' ÜVèÒYK‰FžØ’`wÙ8Óш>—4-mš ,…+Zõ(ŒÓ”’{RQåiá§R‹Â…T\¡À­Òßå*›•Ý Nñ§JB°¢#,¤ÈðdGÝ‚‰n*Zè‘lËjÔvñ–ìJdÈ*J#S—E”ʉÆV^äÒßS˜BȈ‰ä'’!¶ØÍ}7c=£ ŸiV!³šÉT­·‰/JDt%õè%°n©J$û¹)iV“,™ñHX-~›NNÖê2î{b§TœôØ‹·j @qö¡°–š%$žIiŽdñ<µê4ëJÈ»z)}6¬ÒëµQ˵wìSYä.J„ª³J`¹N4i`Ûos«$´êÑÃP»K­Ä™VÞ§ò‰Å”:’ZœqN›m™f®Õ|YÁ’U•’L”EãbWzè±è77%äW¦ÇÉ÷š÷[Ö’½°Z±«ÁgÄ9½ŸT‹¦ƒ@™æ Ÿ[¸î›u³AáU-E3#çJÓ%n$ùŒF]»°š 0#ìéºM™[ VàÓÉ7D©´×cošäŠI4·VDO(ß6T„‘¨ÛJ Œ‘ ÕbWzè±è77%äW¦ÇÉ÷š÷[Ö’½°Z±«ÁgÄ w©{rŸÉwÝ[©.½æÎ˜’$kÆWô}8áïóž>+°š 0#ìéºM™[ VàÓÉ7D©´×cošäŠI4·VDO(ß6T„‘¨ÛJ Œ‘"ízZõšëÖU:ðê}ÂÂ.W–túc±£¢9S&IÔ)ç{SpÒ“3Q%ZÒƒ.=°4©Û'L‹W¤&Ûšå™ óiç©1!­m»NU1“Q4ÂKÝ)‹Ö¦ÐFG¡ÂÁàÈcͶڕ³Ù*“V§Û¥srº=1Ê ³Ü^LH4?O,:l)ýòÒÑMMEÀÒõR5È´GÓ>\g¥0Ö…ví2¦’ⳌûEƒ<ž®Áã4p»zÞ¦õͳ»‚àÙÛ )˜5M›4'(oœèË„æƒJ×Rû‰ÖdLo“Rx‰ƒjD{j•[oU"Õ¤ÔT™:„ôy˜u·xý[©,(ÔM¡’#R¤àÐx¹€ã-So›Š“6–fF«ÚÔyi“$ ÛLê¢Ûq–¦!GÀÈš$«Qp#’âyÐx°X.Úô Z³S¶¬Zý0áÂKÓ!õ%ÖdÍu´-F„%xåðÁ¸Y%š’ZÕŽta¦³k½qR¨r^Kº©Oƒ£y¯<š[Ñõçï·Z±Ñ«[ÖF먂é99&ŽI¿ç÷óF÷tÒ—£VNtã8r2è§f;³¬ ¦©pÒqÉ2ÖežíŠ FE©¶ÏûO=±ñÓ‚î™ód›=–ÿ—6þ”+ýŠ ¶Vj1é4¹j2e„Õ¤²gÜ".“>b.“=–ÿ—6þ”+ýŠ °Þ0äηÞn[ù ºÌ¦ÙÉ{©²êÝñáÛhÓǺ9Õ”£â®ìR¬¥IÅ]¤Ê¼ÚýÒ“\‡_§ÒЗI­Ã°œy pÒ•k|–”¥zV“Á¹Ï¬±Úî­Åy/°QæÅY7!¤«RḦÉIW I222<pÈŒŒŠ½I¾X§ÛµØÌÓYª*tå8g(‹“6Þå–ÌžIžujBˆÛ2/zy2á™ÙɉՅ‘”ihe˜Ç§ê7n$¿àºiOtF\0gâè:UJ•¢±âº»Vþ_¾Gƒ éÕ*i‚ž+¦ÚéýKzì¡Ñf¦ Çå;1M“¼š应™Ô†P¥%&de“"#Á÷ªïºjµ!Ömyr$ÊÝ8÷Sß”qÛ"^¥vÍ.¨÷ˆKf’Á¤Ôf|d0¥Ézܹ.uN‰\K·~N—N\Õ±ˆÍ²mš‡ *J›7 Z ¼éâB­_Evu­Anä£;W×&£®UV€íGvÑH>K½ƒv[ų¤õšKF•àÖcÞ?Buª™³(Tùu(|†sñ[rLmZ·.)$jFzt™™gûñM«ÆªS)uJZ›¦ÚfBHim›ˆqIY¥X>Õ8"5ee’"ÔeXÙ$o칊]ÉOWlìØÎD™ГÊ^Ch6–¥á³kAMK-8í”\N¯³º+Pm]™Â§Ûr)’)µ$•iK\lIM"KN<³4,”³BwÅ”¨Ìˆ”gÀÒlÚÏ\V…àäÜ—ªtö&nuëÝo[JôêÁg±œqÌC‰ÿ”]+ý¨¶B{'&Ë-(s#»KHm<˨4-µ¥„’¤Ÿ2222>aéDÿÊ.•þˆÔ?Û!â ŠEÅ_¨B¡À¦UêUJìÊKæ§1X –Ù«äë4êW¤’¥ ñ‚3/j­Bü¦Q«oÔ—:3Ð)OÎb\i$ÄqhI™4­QÛp•Ã8ÓŒ~¶E[gõfìZä*Ê¥D Ü¶õ%1*Žg“Ç}†4©‡UÌÞ¢^¤š°ž âg’+÷hð&Á¹hÌÍ Ê¡d‡j”ùnÎTdéC^ìÓ ,ÓÛ=«$jÂqG‚IWÚ:f¦V½îÿ[o¶çºÖî1è 7ZNÍ««¾ôÞv`mšínÀÚ<épìºÛÕWa´NÉQS¤´ÛDg„‘­ÆÒ’QñÂs“$¨ÈŒ’x¼8ÖF¾?ɳ¿äÏÿ‚ò(×Çù6wü™ÿâpV\ GÊ úÉQÿ(IÿWÿs’XfK bCHu¥–…§$ÞCH¦ÜïÈq÷v—wÜQ­ZyK&y<GÁqBîÔªšu}ß8èÔÜF üH­©_ß«}×ÿkq½òVÔ¶‹ú·Ýoö·Ñ‹ªuŸöÞDkiu£÷ÃjÚ–Ó?Vû«þÖØôcøVÔ¶£ú·ÝSö¶Ç£ÔÖèdk©u#öíJ¤–S:+räóD²É%dFD¯ïÁ˜×©o™ã©äM|A:²gÉçGÿ!øÀö¥µn‹î¡û[gÑàö¥µ®‹îwímŸF;ÁipVŽ$r›Ñ¦ï+3÷[hKh$!$”—1þ‡áÚ–×ú/¹µ¶½þj[cè¾äþÖÚôcžÍ[¥—Ú)u»%Ä‹-‰QÛy$y"ZHðcÎ%: EšãDi¥9¡8Èü({RÛ?Eö÷ím¿F?žÊ[kðíÏ&ߣÙ+t‘´Rê?{€üÙKm~¹äÛôaÙKm~¹äÛôa²VéM.£÷3”*;’NJéÑÔñžMfŽ9ÿý"¬°Ë?¢ièàCðge-µøvç“oчe-µøvç“oцËY÷ ¢—3÷mY§¥Ka¤êqÆ„–q“4™ØlÜœ¶¶ymÛ“„ìšU&,œiÇ [L¥ 4å²<¤ñ’!ø ²–Úü;sÉ·èò–Úü;sÉ·èÁhµ—åE.gïÉ´+mÄ›Že£lI­%ÖÞMEØ\’[x$,6µjN”àó’ÒXæ­5Ýcë¯òœ}”¶×áÛžM¿F”¶×áÛžM¿F'f¯Ò6Š\Ï£ZkºÇ×_ä­5Ýcë¯òœ}”¶×áÛžM¿F”¶×áÛžM¿F5~‘´Ræ}¨½K¨L¦Ë˜Ë½L’r¡«|énÝ6\dÕ‚NÜÞq8<—mžr#,Þ­5Ýcë¯òœ}”¶×áÛžM¿F”¶×áÛžM¿F5~‘´Ræ}ˆº,NGÉ)´¨ü…•G‰ºlÓÉÚVM·†ûTž„d‹Ú§¸C7«MwXúëüƒçe-µøvç“oчe-µøvç“oцÍ_¤m¹ŸG:´×u®¿ÈZkºÇ×_ä8û)m¯Ã·<›~Œ;)m¯Ã·<›~Œ6jý#h¥Ìú9Õ¦»¬}uþ@êÓ]Ö>ºÿ ùÇÙKm~¹äÛôaÙKm~¹äÛôa³WéE.gÑέ5Ýcë¯òVšî±õ×ùÎ>Ê[kðíÏ&ߣÊ[kðíÏ&ߣ š¿HÚ)s>Žui®ë]:´×u®¿È>qöRÛ_‡ny6ývRÛ_‡ny6ýlÕúFÑK™ôs«MwXúëüÕ¦»¬}uþAó²–Úü;sÉ·èò–Úü;sÉ·èÃf¯Ò6Š\Ï¢°'ÓàBf ÐbÅaÛ,2JCm¤‹”¤›ÁA~­5Ýcë¯òœ}”¶×áÛžM¿F”¶×áÛžM¿F5~‘´Ræ}êÓ]Ö>ºÿ ui®ë]|ã쥶¿Üòmú0쥶¿Üòmú0Ù«ô¢—3èçVšî±õ×ù«MwXúëüƒçe-µøvç“oчe-µøvç“oцÍ_¤m¹ŸG:´×u®¿È4éÌ»™«ŽLBv{N%ä§É6 Ô§B]Ücu¼$à‰zuqà?vRÛ_‡ny6ývRÛ_‡ny6ýlÕúFÑK™ôU3ééœäôÆ‚RÜi,­ò%oÚMF”·y4‘­FEÌF£î˜÷êÓ]Ö>ºÿ ùÇÙKm~¹äÛôaÙKm~¹äÛôa³WéE.gÑέ5Ýcë¯òVšî±õ×ùÎ>Ê[kðíÏ&ߣÊ[kðíÏ&ߣ š¿HÚ)s>Žui®ë]:´×u®¿È>qöRÛ_‡ny6ývRÛ_‡ny6ýlÕúFÑK™ôs«MwXúëüÕ¦»¬}uþAó²–Úü;sÉ·èò–Úü;sÉ·èÃf¯Ò6Š\Ï£ZkºÇ×_ä­5Ýcë¯òœ}”¶×áÛžM¿F”¶×áÛžM¿F5~‘´Ræ}êÓ]Ö>ºÿ ui®ë]|ã쥶¿Üòmú0쥶¿Üòmú0Ù«ô¢—3èçVšî±õ×ù«MwXúëüƒæÍOl;e§ÇKÏ_/©*V’$4ÑžpgÒßö wg®xm7ȳù)Âpv‘Ò3Œ•Ñôß«MwXúëüÕ¦»¬}uþAó#³Î×<6›äYüÙçkžÍò,þA]å·Mú´×u®¿ÈZkºÇ×_ä2;<ísÃi¾EŸÈžv¹á´ß"Ïä ãqôß«MwXúëüÕ¦»¬}uþAó#³Î×<6›äYüÙçkžÍò,þ@Þ7Mú´×u®¿ÈZkºÇ×_ä2;<ísÃi¾EŸÈžv¹á¬ß"Ïä ãqôß«MwXúëüÕ¦»¬}uþAó#³Î×<6›äYüÙçkžÍò,þ@Þ7½/;¦¿®ˆt‹³Z;mòÖ&Ci·UŒž”ºòW‚Î2¤§‰Ëz^»ï/õÿ¼éÞ°?öyÚ熳|‹?;<ísÃY¾EŸÈ# ?nìªe…]5 ÕEÊ­qSŒû̸²o’Ço&m-i÷ͯ§<3‚Ⱥ½žv¹á´ß"ÏäÏ;\ðÚo‘gò.}™G£Í˜™³hÔÉR“/¿ ·,saJIŸÿ1œffy3Éžv¹á¬ß"ÏäÏ;\ðÖo‘gòP·ŠÞ‘ôHÎÞÏ;\ðÚo‘gòg®xk7ȳùádÜú$çog®xm7ȳù³Î×<5›äYü…‹ŸD†¦›L”ÎÖ"]FädÂB“ORVµÔ㯰áH’|˜Vs|œgŽ?öyÚç†Ó|‹?;<ísÃY¾EŸÈX¹ôj-:…3Q¢®k 4‚Cm·Yš”¡$X""#Á íp© A¥RjX2Áâ¹8é#à>qvyÚ熳|‹?;<ísÃY¾EŸÈ*éEñHå4¢î¢²>YôûZÏ¥»KµèÔºD'd»)Æb’Е:â²¥cG÷2R”¤°”‘ç«MwXúëüƒæGg®xk7ȳù³Î×<5›äYü‚ûλ¦ýZkºÇ×_ä­5Ýcë¯ò™žv¹á¬ß"ÏäÏ;\ðÖo‘gòñ¸úoÕ¦»¬}uþ@êÓ]Ö>ºÿ ù‘ÙçkžÍò,þ@ìóµÏ fù o¦ýZkºÇ×_ä­5Ýcë¯ò™žv¹á´ß"ÏäÏ;\ðÚo‘gòñ¸úoÕ¦»¬}uþ@êÓ]Ö>ºÿ ù‘ÙçkžÍò,þ@ìóµÏ fù o¦ýZkºÇ×_ä­5Ýcë¯ò™žv¹á´ß"ÏäÏ;\ðÚo‘gòñ¸úoÕ¦»¬}uþ@êÓ]Ö>ºÿ ù‘ÙçkžÍò,þ@ìóµÏ fù o¦ýZkºÇ×_ä­5Ýcë¯ò™žv¹á¬ß"ÏäÏ;\ðÚo‘gòñ¸úoÕ¦»¬}uþAX¼]CÔ™ªBÒ¯ðWŒôçfkV8‘wHr šÚ÷mÓ³Ë~曵ۦ+õH(’¶Y‡hAžHÈŒÐGŒ‘ÿ1ýí Ö¸-‹·p»µ«¾rið]‘ÉŽ4Æ”™’ ZgÀÏ‚>cæwdŸ€~ûö–ì·åûË푽\îTÜwGäšm+—Q*µäaêrZuLh÷í){µ/VxiZš,c޾rÇÖÝÑùB˩¥ֵU!tÙ,;bXI)ÍÛˆ4êI(ÈI=+"3"ÊH~/ÿLo}.ßüùž§ñU°P¿ý¿ñ6,©¥MaØœ¢\Ç98ÊA!¥Jm÷[I¨×«;¦’¼éÓ…+Q§Ik×ȵ«l²ãç—YDuÉ7X”Ó¨6Ò´¡FJBŒ”i5§)#3"<™cˆ·PvŸP®O\©u*«rhÚmÆÙŒQ¦Ç4i^R£Je#JT“Iè2>ÿÌËâ–ªÝ rLê,eHLÖš¢Ã¦š’„´ñ!¨ý©¯Bx-J>$ž Ǫb©~ä- q+.YWCsyé“f3ékZu)2 Î’Ïl¥ÒZK‰qÉ“ÆÁEŸB˜ˆ•‹¼[{ÄœymHA§&Ÿ~Ò”œå&FYÉcˆ¸Õö‰ÕxÔÕI)±'·W9R¥E4’ÒÂ^[¬¥¬Ÿ¿B¤?Œð,5Üá¡Ú Z‘X«F‘HedMÅ&äÈ\&¢*SºÖ£tÙhÍ=*JxçF£âf-;ïDIFۊ؇0ïfÙ4êý"˜ôŠä¨sêÕ)è,¢žN³­¦ØY­×w©6Ò{ô–I Á$ÌÅ~™mVªQ*T-šÉ”ªChqóIeDÚ¢S†_ú¤|xs‹¹~É¡Yí諘¨ËŸ5Ú¬=顉‘ßf3iAàýùn2Q—jjI–xÜ[û@¦Ré´ØÌ<üuÐÔáSÝëzŸ)çÒo­ä(Þ{Rã¬Ã.×xE‚2,ç<[š¹Õ(2§2ȹbRú¢ü&Ï%nf‚šÂž6BV—I¢Y¸hÒ¤™«N ŽqƒÇô݇t¸ä&š§²ãÓ$3¶1…:ÛŽ¨’Ú]A/S:ŒÈˆÜ$—f¸ëvÅ>¢ÝVù³ªÎ[)ÊŽ†8¨S”¦ã8{âpÔjA)DhÝ–œð4{þÚ¦^ï]èn¬ìºµN<º”SŒÚ[Œ„Mf[„Ê÷†n©’Ju%#<˜ŒsµÒ' /½•h–5Eû>­pªm1£¦Éa•Ær¡+Q8Ë®™–\#ÖD„‘6DjRi"ÔÚȵw%µX·TÊ*ì2ÂÝ5$›D¦ZœjC‰BŒÛYj,¥dFYæt:¥)erƒR\Ö\•"4Ø®Çe.‘ºÃrM¬”´éJ·þøµi÷§‘´{‚^D€s%ÍmO.UBd6c¾ù+F„/t£'MV{ÕaJ×Ä‹.œ±[¸«QÃrž¡ÌÏgÚ+¸hÕŠ‡/(ª‚ßø3FÖ£”é6ë¦ÙKO¹²áç%ŽØ…`_­ö›mRhQY¶¡T߇9Éò^š§ÒiuF”’[Ý<”©;´'ô‰2Ê”XÁži7+~ÐJûÌšØón«†ŒÌÓ¹µc:â§0ÃËmN%.)qZœQŸ½J¸ôt4læï\F¥•>)4äv¥eUÉ6Øu Zp̶ْ“Û¬‰$gƒ2>n]VL;†ÚªM*ú¶f‘Âb)ÉOÅ<[‹Ú<ËgB£,ÑOW(aÇŠI-öËm¶Q}Ð7p¢>VÑ™à“¥IQ)E«GðŸ\f‡äF¹$óhÚÑœmÆä9¼ß“št‘FpõPD•êR $J°×v…EŸcI¡³ ™.ÓˆJ[hÑ­-QÐfg«8Í9þÖo‡iþ(—í&-¥F¢­ê¼É”»*4fÁ!uE+ZÈ–“)Í$Ò¬ˆœ#Ç Æ*˜obpÓ½!lþª›^³Z~m%¥Ò¥°ÂØ:œSÞ¥Æ]xÖ…o{~Õ Ò”’ÍJÓ“Bˆ`.̯·q½oHnŸ¦Î²q™HÌ’T‡ ³A©nuê#Âs•Di23ÜÖn;^¡å§3m><çáL„qá4D·ã°ójÖÙ-)i.©å,ô‰ÄJ!˜Ýák=yÝõé”÷µUjnL§<í6<Å4ÚqjmM<­ÚT¢R;~ßNƒÁDâŸßèFvgWz›H–óñÚzumÚC°JLnTÒÐã ö­-ä©k5¼¢4$”©FIY(WúÔ®õ«•žMºßhåMo÷_¸Õ½Ñÿ¯§N8çöwý³"ïf½!vŠ í"áŒÓq›^ù‡ÞŽ¥!fn…¥,d±¨ŒÕŒ‘vÃG×M OV±QêçQ:É7äºy#ÞïuêÎï¶Ñ£ß~¶)O¼8øÕ\6%Ñ@1ê¤ä.ÜÖv9êÒF¶Ð³RRjàJ2$žKy!ZJÕÙN›pí Ó2ÒÕ˽äiRS©½ud–ó¶áÚ4¢á«¶2èâT±ÒM~"’I=ÀÊ€Z˜´7»@ Ú}QÇUú™þ¹ý,i—=î®ÛFûå«Nxg†±6ÕiTΨTn·'AÈlž6ˆðnZµš9ÏVœ`Œù¸‹½3k5¨­µ2=Ár±nÒÛ¥5"œÔÅ¥ DvXCéKD½KSnãV®8É'¶ƒël›%œZŠi ¥nš @Q­“ê9ª#}:‘Μñ2%$±Ž8ªr:ÚÌ;¿fUÚmÇUKŠ—iÌÍ–Õ<ߤJi‰²f–õœYJÉ%9áœ`ÈP‡f¼oBEÕoß Ì©®|WeT#SÑ¥#'V™!¦ß^÷-+ IšI íTFGÇ#Œ‰¥)5øˆ¨¢žà©ÌÑÞä¶¿ãËøT*"Ýyÿ’Úÿ/áP¨NíO[Cì‰$@Èj' A‰è`$„ ! è' @€ $@$úС–*µ\ö2Z4ª |¨$Ño—múÚA©z´´áF\ÊÏŽ82ÓÜv¥rËö5]–ýbê;¸Ô§Ê#ë†l¸ÓzÜÔ{Åë"èæÁpâXÆÃcÖ%±ZØõ™RªGª¿%Ú3:éì!$F¤‘%¶ŸJ\3Ú¤²ff|LÌymšÁ´i;&ºª0©õ2Å*B›7. “‰#Ðe“B¤UÏÌ¢2>’2à(Xý&Jœº?5HÙµu…W.œf]Çùé^è¡UL±ñáÿné~ÊE£5ø­{«ð½¿Ë?m¦{2†JëþÛõ·¡ÇWbUÑÏ&×_å ³ªh./Ãúêü£¦ÈæÙ<ÃöTÿŒ½§.-dx³þÐ×ó9êíyèçz7ÖWà<¡KG;Œ~Åà.ò9ŒjäôÔ¿Š½¡.-de—±4UÜó*®S$#m~Ã?Àx.+ˆç4ý#}+œkds˜ßOøM—²3ËÙ2îyšÕ‘§œy-Ô§œŒ{>0ß!íÍ-÷¬Ž2öeÏ2U1¤ó¥AáUΗ>‚üF+£Þ‘¦>×Ò_zÈå/gQFÁUxÅ·~‚üGðªäBçmÿª_ˆÓº1]æ1¢>Ó®ùÞƒIå\Pˆ¸µ#ê—â<úæñ2~ªZwÞ˜Çé#§Vg7¡Ò-½s@ø™?U?ˆuÏâdýTþ"¤b¶ê¤lt‹w\Ð>&OÕOâsÀø™?U?ˆ©@€ÛªŽ‘nëšÄÉú©üC®h'ê§ñ º¨Øéî¹ |LŸªŸÄ:çñ2~ªQÛªŽ‘nëžÄÉú©üC®h'ê§ñ º¨Øéî¹ |LŸªŸÄ:çñ2~ªQÛªŽ‘nëžÄÉú©üC®x'ê§ñ º¨Øéî¹ |LŸªŸÄ:æñ2~ªQ!=ÐÛªŽ‘mëšÄÉú©üC®h'ê§ñ º¨Øéî¹à|LŸªŸÄ:æñ2~ªQÛªŽ‘nëšÄÉú©üC®h'ê§ñ.è€ÛªŽ‘nëšÄÉú©üC®h'ê§ñ º¨Øéî¹à|LŸªŸÄ:çñ2~ªQÛªŽ‘nëžÄÉú©üC®x'ê§ñ º¨Øéî¹à|LŸªŸÄ:æñ2~ªQ º¨Øéî¹ |LŸªŸÄ:çñ2~ªQÛªŽ‘nëšÄÉú©üC®x'ê§ñ.·U"Ý×4‰“õSø‡\Ð>&OÕOâ* uQ±Ò-Ýs@ø™?U?ˆuÏâdýTþ"¥ÜuQ±Ò-Ýs@ø™?U?ˆuÏâdýTþ"¤Bnª6:E»®h'ê§ñ¹à|LŸªŸÄT@6ê£c¤[ºæñ2~ªëšÄÉú©üEHƒ 6ê£c¤o. Äj„$2Ëo%Ip”f²",`Ë ÿ´h€z•%RX¤w§MSVDˆ s.O@ƒÐ ÀIBÐ O@€ H€I‡t ; Jv ðc|Ìßñ,yíûàRðù¥ÿá1é°_€»æfÿ‰cÏoß—‡Í/ÿ Ž}åŽÚÅNÝzçE­7ÉšyýÉ:ÒFiQ¥xÁŸ7 Çth)•(ôøµ”9!L¾ó8`ÒJɨ’¬`Ë›‰ø—ðì©GON·òÙÞÿý_?—™û½1Mèv‡¯òæ•n¿ ƒ\v­Nd—ÉMQÔ½ 4™!y22ΘWàÚ*7æÕY‚äóÓ¥6j7£&GÃ<>’:5}(¢Ö£Õj/¸ãñ’ê–æTiY>9ÓÜÌjåd•IoD‘GQ6–Mdñ'N0eÍïSÏý¿Þ?cF:ZtÔ{“Ý&“þm÷jÛív¿sƨô˜JWçܼ»¯~þ&-¡n´˜×e:«)ŒÂR‡žA(™3K¹–H¹%Ç û–“têÕµ=©ŒU©5 Ì·¼ÜšHÏxYB’¬ð2Ï?pòBÇL»(²%ÝR*Ï9º›Hm¤%³RÔ’BÑÐX#Á—9‘dƪ¥rPaŵh”ù®I‡M¨7.L¥²¤c 3<'Ÿõ”|3ÑÎ7ÓŽ‹ªšÝ{;ïþ}×^kÈÍ'[º{íîáêEù`D©Ü•³¢T ³23(}¦cšp‚m$|K #3ÉàˆùË8È×P­º|ë.Íz©Ô¦¢N¬“.-år—;g°ÚÞJò¤¨ÒI÷¥§)<ö¼wòï:›tVîÈ9§ÈˆQÙÉ–”­D”vÄ£.nÕ$yÁðŸïÒÑÕG%m÷ïÝÅ[5ÜfÿÜ–þïðWöñF Ñ¯Y¢Êi*2I?¸Êm10Óz{cà½y5pæéâ9«ã¡m®¡@­]®WhUeN)©I¼ÑÆ[{ƒB‚,«³ƒ>Þ¾"¥µ²· ÷áW0ÝŽôŒ·F#½#¼r1®óÊtb»Ìcl21÷¦1úFC¾ôÆ?H× @“,A'Ð Iô!=Ñ'º€=Ñ{¢¢öá³6îºÒ-KB›L£´õ_6#¥–›I<ñ)Å%Y> Oöö¥ÍÍùÐ~™¯ížÐ‡·ú}×M–íJŠº S%¼Ôu¡M(ß[™$¬’gŒ#8è3ÆL°å÷ÞË¢Ú »­Ë¢%ÍFfQÄ–óQÔʘtRfyNL‹9ýd™d#o'b<Š™šçLsJ§® ÍæT’6ÒFfJxÏJU‚>rÆHø™˜ö¼.Û"±éÛ=²ªÒ«½V¨òÉЦÊ HQ ‰\M^ä‚ɶ>mïÛ»eñÀ»®:M5X´ƒ†í˜ËI¸ñj4©/j”’–£ãœ–2\ Œ ^Ì6iL¼"ÅTËÒ%2l×”ÌX,D\ÇÏN¥[”äø)x,qæ« gðíú6Øè·>™SŸD¥!qd¹.F¨òJÛ5PfZ‡‘wŽÇö…bÛ{5ƒ ê¤Êj%M2ê’¸íU¤-JK&¾d¤ÈÒ“É—½?øF6õ]¥XŠ«mnS ]EËGŽÍ7ß#qÔDu¥ ò‚ÒzHJW…aYçÁc*Èn½•ƺ,ý™ª‘™BŠt%L®U“JLGV·L´ëQ™¬Ë'Ò£ÉL~x­±O‹V••=Ê„&Ü4³)lnMÔ—ëhÔ­$}sŽç0ý'KÛ]«O£XñÔQ.ŽTsr2¨Ž{‰“ !<é툔NèÎK?Ø?8Üñéqn ñ蓹}1¨¢HФgµ3%8KœŒ­ˆ = O@ƒ$ IO@=ú›Ù7aÐ^¥CiÛôÊ}J$¸¤úaDC:Ú”·F­Y÷Fˆ‹=Ó–Gꊦ٬^ÌŽUÑSåÔmö™RŽ#ÅþÌ•¼ÑiR Y,ðV0F¢ãÀÀ~ÈKJÚgeTm;~šÔõWÑJ'ãÅm¾¶ÊC*J–DFz–ÞO'ÏÎ)•‚Hié”û¾ŸPºiÐÓ2U¸ëNeœ%Ó<(ù°X.rÎ2CÚ£´ÚGaË6;sÊUÍJ¹º¯.!´âKƒÒ\γN“ɸŽc3í¿°Å©í©lÞ•wWvHªT%ת´ÄDnŽä5 ™p‰©N{Ó/sG1ž0|ùà= lŽ›3ft[ê¯|E¢Ã¨ÊS!ø*^ë8‚ÒiVVfm‘ã "#33íxÖv½aÌÙÕÝÔsZš•ÇL–B ÛQ©ãaT+†ÛZ3…¹Æôé[Šm¯&„«¶4žuqÁž}-­¬Z5[Çi*¸dI¤S.ØhŒÄÂSIm•²Z’Œž£Jõt–KR){(å¶%tuw×-mºO'äyäÚÝu½æ­}¾7YÓ„óóðãgwØøÊî Å·O¿ K®@Œ™MÁ8+BœlҜըɩXÁ¸Lñœ Œ›ãgtëg¶åâ‘/¨7Li²Öü[Q0‡^SŽàˆËY$ŒÕƒ.#vÎÓlˆ~É{¢ð“[ÑCJDxÒ¹+Ç­ÂLb2ÐHÖ\[_".Ú@iRÊ·uR(¦³AOœÌSQs§xâSŸþcô•ûgÙÕ6Ñ-Êm­L¦=fÁ*Øíé}ÍL)å‹ç_™qÏ>yÇæ›r¦åá§VA-Èš’„™ã&…’ˆ¿ùý}mNÄ: éT·j3%Öo±ã; ÈŠl¡¥ J5,ûUvªW½3㎎ Í›Z kd6úèví…W¸êg"c\ %Ç\i'„¥¢÷ÆxÒ|L’YãŒÍRã½S±d´¦ŸefÛˆQ`Ò¢<ö‘ŽÇ±ê¶Éí94‹ÍúýqŠõ=—ŠM-ÈÛÔHqMš=ÉiISÛöçÒ\ØÉò‹š¨ºÝÉS­8Ñ4¹ó”¤ä’n,Ôd_ÝêŽÇvoV;u³Mßõ­Õ.«nÿÂùN÷u«yÏ]¶žnŒc€­ûmËj«³š|Šm¯E¸+ «¥šñÔÚ%œX¦¥emjá’A Ëægܶk#xwùN™×W[½HêW%Vîóy¼ÞûÝ:¿·8èÏ]Ù=ÿc³³ª½pUåÐ%Ð+iªoŠ·S<’¥¨f‚…K‡ 4–£”Ú”5$–Ü$-Z4Ÿ 'îFiæíÏ£€§û!èõXÍR*j·ì¸4WÖ÷!™m2ICä£,%å(‰<0Xâ¼g£K2.Ï]Ú9*½|Uî*DæéuhUæä©gÁHt”jNŒÌ‹õ‹ÆCmµ{ºÖìcnìâÒ¨¿Y‹K¹OT]Œ¦5¨ÍÃ$¥*ãþú¬ÿqsô««ØÖuiÊûCƒP¡?ReÕ¡¡ K&’t÷DIZÈÖ{´‘qϺé´{$¨v­"ÌÙÜ«R’Ô(³à¼þðÚIH}&ˆêA¼¢â¥³ç>=Ë^Úîëzâ°6sK£T9TÊ5,ãÔܸ˛¨éÆT’%qm|Rf\?´€j½³˜Õ´õaÛ7qè¤ü¥½/uVuìž·Z=*2Acv¹3Ág?ÊÔÆš”S¨¥åB'r œo ¼–¢NxgÆzGéX›f²9Rv€üé½s&ÝêJ¨ü•F…¹¼Þo7ž÷N¯íÎ:3À~j¦µúŒf&J(‘œyyóA¬šA™—¤¸ž '‚âx~ˆ”Ýwìžó­Ä²a[ÔjK ¦‰?““rž‘£¶BÔFzýÐОsÉ/mµ…gÙÔê6Îíº•­L©½yA•*dÙ ê}½,%ä“kçG‘pÇ6yÅck5œW,˜vý·´‚…J£CQä"‰$Îd„¤ÌÇOIeGÃ&X#RŒó‘°±¶§b˪\U ±+6tIš„ÜE8S mI4¬»Tö©O¾2㞎 m‘jÐ,Û*ÿ»ê´H÷è5“¤Æf Ñ8Ñm Q§˜Ì÷¥Ç£Osé;"¶Wì˜ê2`'¨IêÉÀJŒg¯u».<kí±ÍÑÌ)Ö&Ðmš½±yÚ—¼çèñ®ŸU-¨ê|ḅ­”ñÿ{NÞnÂößG/d?]éfJ¨ƒ©Zô{¦ëV½æŸøÎ8çÓý¼?d%píê çl«f”© YJÞ•ª3ØÏ¹)‚"Ypí²¬éV ¸Èë»[»í3Ù…½³»F¥"±›)ÉnÏv2™É©NPIW÷Õdù¸ìä@¥;ø ±¾foø–<öýð)x|Òÿð˜ôØ/À]ó3ıç·ïKÃæ—ÿ„Ç>òÇmb§îŠWôËÞ覮—S©È|©´é“M¼käì)Í9Î3¤Áýà"n«Hú&8Šrv+9†¶O0·=gÝŠ.Í`ÿèN~ë"ñQv¶½`ÿèküè)E®(ójW¤ÿ2Ì¦Èæ1«“Ò/X7²³‹R°ôEþýœßŠÎ›J°ôU~Ò£$¸³êÚ(R¹Æ¶G9Ž€þÌv‚¯{gÖþŒ¡„öÊ¶Ž£áfVþŽcÒ£Všã%™’s3¾0ßÝ‘í-\ÖUcÈ Wv=´õsY"= zMùÖhÏ&ŽrèÄw¤t‡65µ#æ±ëGùŒw6+µSÎ,ZÇ’/Äl†—C­fŽ29££Þc5͈ídù¬JÇ“/Äc¹°Ý®qaV<™~#T4Ýr9£”“9{¾ôÆ?Hê ØN×̸X5¨ŸÄxöÛ~ëQ?ˆÕ?E·kÑÉÅò9©ˆ,ö ¶õ¨ŸÄG`]°ø¿¬}Dþ"Û~‹âÇ5êFr9±ô,ö ¶õ¨ŸÄG`]°ø¿¬}Dþ!·è¾,s^£ ¹ÔKì ¶õ¨ŸÄ;í‡Åýcê'ñ ¿EñcšõeÈæ€:_`]°ø¿¬}Dþ";í‡Åýcê'ñ ¿EñcšõeÈæ :W`]°ø¿¬}Dþ"{í‡Åýcê'ñ ¿EñcšõeÈæ€:_`]°ø¿¬}Dþ";í‡Åýcê'ñ ¿EñcšõeÈæ :W`]°ø¿¬}Dþ!Øl>/ëQ?ˆmú/‹רÃ.G5!=ÑÒ»í‡Åýcê'ñÀ»añXú‰üCoÑ|Xæ½Fr9 —Øl>/ëQ?ˆvÛ‹úÇÔOâ~‹âÇ5ê0Ë‘Ít®À»añXú‰üDöÛ‹úÇÔOâ~‹âÇ5ê0Ë‘Í{¢Kì ¶õ¨ŸÄ;í‡Åýcê'ñ ¿EñcšõeÈæ€:_`]°ø¿¬}Dþ!Øl>/ëQ?ˆmú/‹רÃ.G4Ò»í‡Åýcê'ñÀ»añXú‰üCoÑ|Xæ½Fr9¨•Øl>/ëQ?ˆvÛ‹úÇÔOâ~‹âÇ5ê0Ë‘Í@‡Jì ¶õ¨ŸÄO`]°ø¿¬}Dþ!·è¾,s^£ ¹ÐKì ¶õ¨ŸÄG`]°ø¿¬}Dþ!·è¾,s^£ ¹Û @é}vÃâþ±õøˆì ¶õ¨ŸÄ6ýÅŽkÔa—#š€é}vÃâþ±õø‡`]°ø¿¬}Dþ!·è¾,s^£ ¹׸ t¾À»añXú‰üDvÛ‹úÇÔOâ~‹âÇ5ê0ˑ͈@ée°]°ø¿¬}Dþ";í‡Åýcê'ñ ¿EñcšõeÈæ :_`]°ø¿¬}Dþ";í‡Åýcê'ñ ¿EñcšõeÈæÄ¥vÛ‹úÇÔOâvÃâþ±õø†ß¢ø±ÍzŒ2äs@+°.Ø|_Ö>¢=vÃâþ±õø†ß¢ø±ÍzŒ2äsQ¥öÛ‹úÇÔOâ#°.Ø|_Ö>¢Ûô_9¯Q†\ŽmÐ ÇKì ¶õ¨ŸÄ;í‡Åýcê'ñ ¿EñcšõeÈæ€:_`]°ø¿¬}Dþ";í‡Åýcê'ñ ¿Eñcšõe龀 t²Ø.Ø|_Ö>¢vÃâþ±õø†ß¢ø±ÍzŒ2äsn¥öÛ‹úÇÔOâ#°.Ø|_Ö>¢Ûô_9¯Q†\Žj¥vÛ‹úÇÔOâvÃâþ±õø†ß¢ø±ÍzŒ2äsS/°.Ø|_Ö>¢ì ¶õ¨ŸÄ6ýÅŽkÔa—#šé]vÃâþ±õø‡`]°ø¿¬}Dþ!·è¾,s^£ ¹ÔKì ¶õ¨ŸÄG`]°ø¿¬}Dþ!·è¾,s^£ ¹ÔKì ¶õ¨ŸÄG`]°ø¿¬}Dþ!·è¾,s^£ ¹Ø@é}vÃâþ±õøˆì ¶õ¨ŸÄ6ýÅŽkÔa—#š€é]vÃâþ±õø‡`]°ø¿¬}Dþ!·è¾,s^£ ¹ÔJì ¶õ¨ŸÄ;í‡Åýcê'ñ ¿EñcšõeÈæ :W`]°ø¿¬}Dþ!Øl>/ëQ?ˆmú/‹רÃ.G5Ò»í‡Åýcê'ñÀ»añXú‰üCoÑ|Xæ½Fr9¨—Øl>/ëQ?ˆvÛ‹úÇÔOâ~‹âÇ5ê0Ë‘Ít®À»añXú‰üC°.Ø|_Ö>¢Ûô_9¯Q†\ŽlaÝ+°.Ø|_Ö>¢ì ¶õ¨ŸÄ6ýÅŽkÔa—#šé]vÃâþ±õø‡`]°ø¿¬}Dþ!·è¾,s^£ ¹ÔîäØþÒíºÚýzПN¦BJ"Cæ„¥§Ú[&f¥¤°Y>9æ#2¢ôêÓª±S’kÉ܆šâ})Ø/À]ó3ıç·ïKÃæ—ÿ„ǦÁ~ìo™›þ%=¿| ^4¿ü&ä´Šœº(U_Ó,_{¢…Uý2Çóþ‹Ú3èÑì‘£‘Ì5²y†ÊG0ÖÉæýC[#˜Æ®OHÚHæ1«“Ò=ZšÉ\ã[#œÆÊW8ÖÈç1êÑ1Ì×>0ߌ7Ç¥LÍ# шïHËtb;Ò6Àá#ÑŠï1Œ§F+¼Æ6Àã#ßzc¤d;ïLcôqàq`Ä 1Ä}Ÿ@€ÝB{ Ý'º €ôÐ ÷ îIBI@t  H€ô1= $ =ô0000"ˆ˜w@ú€ô§`¿v7ÌÍÿÇžß¾/š_þ›ø ±¾foø–<öýð)x|Òÿð˜çÞXí ,TàÑBªþ™bûÝR&ÔyKѹ2ZeIC‹~SL$”¢Q¤²âˆŒÏJ¹»ƒà"n«Hú"’ÙU‘Ì5²y…±ûf¤eý&‹÷ÔOJ5ò-j™—ôªßý(ýK‘çÔ©eFG1\ž‘r~ÒªžÂèBô£]"Ï«ÂíïÛpÁôÃÔ¢š1NqæRåslŽsY6]`Ï„ËsöÜp=0׿dVLÏü6Ùó–ŸéÇ©Gq’rE%ñ†øº=bÖÏÿ>µüç§zqˆõ…\?üúÖó¦›éÇ£NK™šM§F#½"êí]?üþÔóª™ëÍŸW?áöŸ”ÏX!8ó8Ȥ:1]æ1xsg•óÿÒ—´¿XÎlêà2?ñ…¡çu/ÖÈT‡4q‘EwÞ˜Çé‡6qp™”lÿ<)^²<;Ü9ÿ(ÙÞxÒ½djZvþdri”ã.G³{‡å;ÏW¬ˆìopü£gyãJõ‘mm>¥™e<ú ‘ìÞáùFÎóÆ•ë";Ü?(ÙÞxÒ½d5´ú–b̧¹v7¸~Q³¼ñ¥zÈv7¸~Q³¼ñ¥zÈkiõ,Å™Mrìopü£gyãJõ‘î”l菱³) .=î”l菱³) .]î”l菱³) .=î”l菱³)â˱½Ãòç+ÖDv7¸~Q³¼ñ¥zÈkiõ,Å™Nqìopü£gyãJõìopü£gyãJõÖÓêY‹2œãØÞáùFÎóÆ•ë!ØÞáùFÎóÆ•ë!­§Ô³e8DZ½Ãòç+ÖC±½Ãòç+ÖC[O©f,Êp c{‡å;ÏW¬‡c{‡å;ÏW¬†¶ŸRÌY”à.Æ÷Ê6wž4¯YÆ÷Ê6wž4¯Y m>¥˜³) .=î”lïÔÉ95v¸ÒE‡q1F›ì{z½M¤®—›ÑÈíGD÷ÝBYTu8’RV³B–’RQ¼$¤Í(,ñ33Ó BɤÙDªÔniGê…" >TÂdÇßУ#|ʳ¥Äjk¶Aàð¢àxÞ¹j9þFûš'£sÙ Z¦¶Í„…ÚTWÛ>—! [²ÈÚoRÏpœ>E»Ár¢5áGÛçK®Õ³Ù¹-Ëž•jAM.‚íUöÎT¥”Út¸ÊÖodœ'M´$Òi,¸œ’°cLhP¶ø,‘ɶr3¹j=íFûš'£×-G½¨ßsDôcY5Öß–óíFj+n8¥¥†F†ˆÌÌ’“Y©X.bÔf|8™Ÿâ:ì´:HŒLÝËQïj7ÜÑ=޹j=íFûš'£sè-…’™¹ë–£ÞÔo¹¢z1u²ÔÅnÑqú•6’ã­]ÔHè[tÖVéÖ癡”¨ÛFR|Iw1/eßÔ©_é­¿þ®¢3itiÓ£)B)?$Z-¶Szå¨÷µîhžŒ:å¨÷µîhžŒi€iÙht,‘\LÜõËQïj7ÜÑ=uËQïj7ÜÑ=Ól´:Hbfç®Z{Q¾æ‰èîZ{Q¾æ‰èƘe¡Ð²C7=rÔ{Ú÷4OFrÔ{Ú÷4OF4À-…’™¹ë–£ÞÔo¹¢z1=rÔ{Ú÷4OF4¤'º-…’™c¤T®*ÅAªu&¡5ìîãÅ FuÅàG„¥£3ÁŸ‚1µ«Sv‰H„¹µ[!øQïÞ“j´ÒýêS$D0v;ð»füýý¡¼Ù´èÔ­³íävE¬7j²%Û0’ñ;-·ÛpB¢A¨Œôø§†rYç:bÿ‘d‰»?:uËQïj7ÜÑ=uËQïj7ÜÑ=¼lòʃ+f ÚL*URJjè¥Å‡S«"dû–õn-ju£YàÒIJVGïEÃbvvÏz÷²N¯X¥RéutºU¨pk-KE=ÖòI-ò½-¹îfF¥§*í¸pFвBìæýrÔ{Ú÷4OF#®Z{Q¾æ‰èÇYÚ‰…³êåYË"Þr>¦›¦×-ểM°½ò2O%ÇŒŒ”DJ$ðQ¤°Y#/­©fÐ6¿KÙT»u3·ÎC‡2±ËLü„ ÷$•º$$Ü,%HVIj(t,»9w\µö£}Íч\µö£}ÍÑŽ«*Ò·ŽÍ¦Þ”›^ÝuÙ|–VàäLBŒÂÉ´’w’[q×TyR•­INKµ"2!ïeX¶4¯d Ø6©ÕÊjšrŒÕPßänâš'£¸D¥!mx™‘¡\ÆxPjt~…’g#ë–£ÞÔo¹¢z0ë–£ÞÔo¹¢z1•_¬[RèëK´X§ID´­šMyn­‚JÈÛu Q¶j34+RŒi2Ɔïfvå"e¥x^5¨§PbÜÚ½Si}ÙîÒkR •¡832I‘Ÿ$,ôz _ÉvVºå¨÷µîhžŒ:å¨÷µîhžŒtIÑ,Õì«æ%‘Of¬«¡ש’ÔÁ4–wÆ”'}’%i$ž¥)XRðdzM>Ûs‹aYJ¸-:]ŠÃÑÚŠ”4óµ);ÈϹ*Cöø4¥KJ+%j<–HŒˆ¡P Ýµk$Mß3šõËQïj7ÜÑ=uËQïj7ÜÑ=êu[RÍ mz—²©–êgoœ‡ec–<™;ùAïI+tHI¸XJ¬‘q1«‰fQ"ìëjíΧ±&±iÔbG…RK®¥X\³eÂ4÷fœ6fYNKZ¸Ÿ 5:H]”¹j8þFûš'£×-G½¨ßsDôbå{ÑíúfË6etàDnmS—uIûæÜÎNúN¢72E[³G4ðÅÊú·vyKöA£f‘,¶Û§J—¥•BIÈao¶ÞÑ›†Œ¸G…¥y=\H°DÔPèY.áwÌã}rÔ{Ú÷4OFrÔ{Ú÷4OFFM ¦ëä’ FKr4•èQµ…i>ŒàùÇ@¸¬ÛJ~Ì.ªý!Ë}º·&!(¨²g:ÚÛyÓkK§)$F¬–IM’.÷ÚV >Ç]—6åµJ©êí6ãŽI%FRd%&ê4¼DkQöæK%'W2RžÔ5; ²Bï™Í_«×£Â5úU9¨²µrw—BŒ”=¤ð­ 6°¬Ç1Œ~¹j=íFûš'£"¿m­lûc,CB H¯J›ãåO:ÊTRšdœKn-IAžMj$i#QŸ,eÒ­K6¿µê¦Ê¡Û©ƒ¹rd8uŽXò¤ïã¡g¼u&­Ñ¡FÙå)BpJàa¨¡Ð²BìårÔ{Ú÷4OFrÔ{Ú÷4OF/´Šu¥Øò‹Æu§}i›”éIqrä¡6q÷Þê”8DxÉ‘hÑïSœöÚµn·(öýVÝ“CЍQk¶ì:¹Å7Tâc­âV¤%J3Q¤9,™Ÿ*…ídˆ»æVzå¨÷µîhžŒ:å¨÷µîhžŒi€[e¡Ð²C7=rÔ{Ú÷4OFrÔ{Ú÷4OF4À-…’™¹ë–£ÞÔo¹¢z0ë–£ÞÔo¹¢z1¦Ùht,ÄÍÑܵö£}Íч\µö£}ÍÑ1‡t6Z $13q×-G½¨ßsDôa×-G½¨ßsDôcL²ÐèY!‰j Çf4¾M4T½Û¶ã°–n9HÞ8¢J’F¥©J<31ÎJÚ¯ôW¾nµ¿êRÔsÑ8KÞ¿Ö$ÈúS°_€»æfÿ‰cÏoß—‡Í/ÿ M‚üØß37üK{~ø¼>iøLwïmb§îŠÌŸêWçŸêä‹7tVeTê¿8ÄÿW$| Aí_»ögïëMúþè¦HæÙ<ÂÜõÝtY+Ÿ² áÚ0^¼®‚/ë5Áû*ný£Þ¥‡Ïïõ1TNŸ™M‘ÌcW'¤^½î‚Ïû§¹eYÂ/ß—AgýÔ]_²´áØ=*/’/Så.E W8͵n™ÁÔù=2Ÿ7ª0× þU½àÊýúKBÓ\2|å‚Á—Ø_Ú ÐŸó¦ïý•× þÁ„öÑ®‚?ëUçû. ÿù ’‹º‹ùz˜çv¬Ñ@CˆfKN¸Ãr…’”Ó†¢C„G“Ié2V˜ðd}Ã!›´;¢]ãq½_¨B…cèB^䤲C†’ÒJ2Z•ƒÒI..Ô¸g&vgv•tù×{þËÏÊ1]ÚmÐ_çeõû.W? ô)Õ©k`/S„Mô:ÅF¯A«E…O¤M Æn,a¹&›ýN8²Q'*þÓÔz³Ãú•ñ1Ê}J:H£Q:'½· ÉÕ¨ÑÛ­D„™àÍ($‘ãÜõͨÝþvß¿²èsò w6§tÝnÐ?eÒç£ãZ¯CÍzœ$ŠÝÍyI­Y”+YÚE2Æû|{Ã˺N)'­XQö¥ƒ,'Id†3·¤®Æ‡aõ"—ÈywT9W»rŽQ:ó¼Ñï;LhÆ8ãWl,®mZè/ó»h²ësÑŒw6³tÝ~ÑeÚ磡V¯†ó^§)$hk[A›V¡Á§Ôè4)r`RÊ• ë)ö£$Œ’’-æëQ 4j.r2>#gtÝqi[*ìuD¹š¯Âvª¹…!¸Ž°mGÂM-(œ"258ZÍ)Ô’4—l¬ðþ׵ˠ‹úß´;ÜôCDzõÑŸë†Ò¼ñsÑ ©WÂy£›K™ÍL@égµë£Ã ¥yâç¢ÙzèðÃi^x¹è‡M}o 戲æscè:YízèðÃi^x¹è„v^º<0ÚWž.z ×ÖðžhYs9¨é{.þ¥JÿMmÿõuì½txa´¯<\ôCdÕb©|ÚíJ©]wÃüŽè¥Dm©÷¥¶žP‰fn ”‚Ðêw$IW•ÀpÒjT))à çtÉŠW9—ÙzèðÃi^x¹è„v^º<0ÚWž.z!ß_[Ây¢,¹œÔJì½txa´¯<\ôB{/]m+Ï=këxO4,¹œÐKì½txa´¯<\ôB;/]m+Ï=këxO4,¹œÔJì½txa´¯<\ôAÙzèðÃi^x¹èƒ_[Ây¡eÌæ¤'º:Weë£Ã ¥yâç¢Ë×G†JóÅÏDúÞÍ .e*Ю;m\ôÛ‚<8“$SŸL–Z•¯vn$ò……%G¥XV3ƒ2,ä²G½ƒ´ZÍ?jNí¦ì—$»´¸q–§ÉÒ4©f¬,Ô£2ÕÀφˆ‹qÙzèðÃi^x¹èƒ²õÑá†Ò¼ñsÑuk?í<ר²æhà_r¡·T€š ÊMäHzŽâ8­º’Á-³ÞoP®'Äœæ<¦`“ilÐLêyIá«RJ3#"Áð,R6—yN¿n×îj>Ÿt–ЇÊ8HpÐ’I(Ék^I%< ‹µ.É“²õÑá†Ò¼ñsÑ ì½txa´¯<\ôBJËûO4,¹˜ö£YDØUgé4I•ø ¡˜µ™ ¸©-’ JdK&–¤–”´(øWk_Z5¸®G‡W…]BSR‹P'‰•ëJÍHZVJ%™(¹Å²õÑá†Ò¼ñsÑì½txa´¯<\ôA­«á|ר²æk.[î]ßo[ö¥B@¤Á¤<´Ã–ËO§“6ê²²Y—©Ú™™!Kí ‰™«UëlÛU¥»µ¹7EŸÝ«/vÊéõeÃ’™T–É&JBÍ ©iQ)IR¼“džYì½txa´¯<\ôB;/]m+Ï=e_ æ…—3œÉ}éR]“!Õºó«5¸âÏ*RŒòfgÒfcÌt¾Ë×G†JóÅÏD—® 6•狞ˆ__[Ây¡eÌæ½Á¥ö^º<0ÚWž.z!—® 6•狞ˆ5õ¼'š\ÎlBK-¯]m+Ï=ŽË×G†JóÅÏDúÞÍ .g5Òû/]m+Ï=ŽË×G†JóÅÏDúÞÍ .g6 è+²õÑá†Ò¼ñsÑeë£Ã ¥yâç¢ }o æ…—3K°ß†»ý#§ÿ´¶4÷ù"ÜùµírMÙþÐî;–ü·íÇï}¦Çj«T n¢ïpÔÚ]u(5\L‰Yª%çY´­ªTJuÉzÃj[ ”lÓ.Ãa ß8ßÉÄɲ3<ñ3'R£œdá¾ëu×)’±ÏÄ—ÙzèðÃi^x¹è„v^º<0ÚWž.z!ß_[Ây¢,¹œÛ AŽ—ÙzèðÃi^x¹èƒ²õÑá†Ò¼ñsѾ·„óBË™Ít¾Ë×G†JóÅÏD#²õÑá†Ò¼ñsѾ·„óB˙͈@éeµë£Ã ¥yâç¢ÙzèðÃi^x¹èƒ_[Ây¡eÌæÝKì½txa´¯<\ôB;/]m+Ï=këxO4,¹˜õý¨uutÇ*v¥!t¸ Sá¹i“QÚ΄iå:UGÅDf}&cK>þºeÝðn£¨îjTâB`îKmEB=ëm¶E¥("ÉiÆ'œäÅ‹²õÑá†Ò¼ñsÑeë£Ã ¥yâç¢Uj¯í|ר²æiª@œí6© —D¢Pήéí:NIF­FƒÞ8¢BMDFil’GŒsp»@œTŠe:©D¢Vú’“E9ù츧c#V¢Ahq)ZHòd— dYÆ1Àn»/]m+Ï=v^º<0ÚWž.z ÖÕðžkÔYs4íûY¤}…X‹p‘V4ô¬Ñ!d³q+3mHQ(”fdd¢çW6ÑeÜ6õ½A¨[”ƒ@yk††PûymjÔ¶W‡x¡XI‹ íHõäÔg´ì½txa´¯<\ôAÙzèðÃi^x¹èƒ[V÷Õ|ר²æ{HÛMbMÙp\Ò-kiÙ×3©u4Ë$8Á¤’¢"'ËI©)m&d|7iÆ Ôj¯Vïê…Nж­´Òé¶ÖµÓåÅ7ÊA)jÔá¨Ôê’f¥‘,ð’Á‘iÒY!¼ì½txa´¯<\ôB;/]m+Ï=*•WöžkÔYs5³¶“P—Rr¶»~€ÝÂîTºÃl:™á– ÒFórNtê&ÈÈø–ˆÂëÞWcÇýF¥r_ÕWîü§”cN¼ï4~´ÆŒcŽ5vÂÁÙzèðÃi^x¹è‡¢¶­w¦+r•tí<£¸µ6‡NîwB”’I©${¬‘-&eѨ»¤Ú«û_5ê,¹š{Ÿi5ZÝjÙ¬7I¤R¥Û,1ž¨ixÈšaD¦R¢uÅêÐyÁð3ÔzŒøc+²½]‹Á«¶•A·©U”Ï\÷äÆŽâ•!Õ¥iY(Üqf”¨œ^R$fyÆHŒ²»/]m+Ï=ŽË×G†JóÅÏDʾÍz‹.f v–û6ÕÅn´­˜TÛ-ò¶ØnIVÚHZo‘¥FFI34p.×¢\S|¤–­NN©&jYÏ ,%’²6£Y\Ùµf)4H•ùì­™U˜ì8™.Ó¥j"5›HR‹$jB|OÙzèðÃi^x¹èƒ²õÑá†Ò¼ñsѶ¯…ó^¢Ë™ ëÞWcÇýF¥r_ÕWîü§”cN¼ï4~´ÆŒcŽ5vÁ´;ÞUéÔ~WF¥Sº‘è܇Æ:?F…o\^tåX>z&|1¿ì½txa´¯<\ôAÙzèðÃi^x¹è„ëkqÕ<ר²æsP+²õÑá†Ò¼ñsÑeë£Ã ¥yâ碯­á<вæsP/²õÑá†Ò¼ñsÑeë£Ã ¥yâç¢ }o æ…—3šé]—® 6•狞ˆ;/]m+Ï=këxO4,¹œØÃº:Weë£Ã ¥yâç¢Ë×G†JóÅÏDúÞÍ .g4Ò»/]m+Ï=v^º<0ÚWž.z ×ÖðžhYsUþŠ÷ÍÖ·ýJCšŽµ$:ET}úZ¦ìÄÐ&®ERYÉ’¥?LSÆ•8dZ‰&æ’áïR’èà4N÷¯õˆ‘ô§`¿v7ÌÍÿÇžß¾/š_þ›ø ±¾foø–<öýð)x|Òÿð˜ïÞÚÅNÝ™?Õ:¯Î1?ÕÉnè¬Éþ©Õ~q‰þ®HøƒÚ¿wìÏß×þ—ïš)’9†¶O0ÙHæÙ<ÃÜ¢g¨kdsÕÉéIÆ5rzG«@Ã3Y+œkds˜ÙJçÙæ=Z&9šçÆã1ñ†øô©™¤aº1én‹e­P•6,*kG–ÒræU¹"•)Jpñƒ•Á8J’’K}±é5tðÛ„ÎzèÅw˜Å«i1¡Ã¼ª!DäˆdЇ$- KÄÚwº¾Ø‘¼Öi#ã¤ÈU]æ1¶ŽûÓý#!ßzc¤k‹ Iˆ “è$ú¥ì»ú•+ý5·ÿÕÔG4/eßÔ©_é­¿þ®¢2ißÓÏÜZZJ‰St‘6 2KjÏ6¢K©Q’ÛAç\ÆdpÝ*Ñá²7’ÍÓ0ÕŸ-%D©ºH›™H%µ ç›Q%Ô©$d¶ÐyÇA—1™Óí‹pìºmÍU¹¦ÄnTÉ0ŒÍ-/:—KK#F^I-—““3A¤ø+œ³8æ›l*zUi ×ÛPe·)˜dâe2¨ IRT¢6ÉÈêQj-F•pýbR¬z}fŸD™F«Ôf"K»ªÇø¹´,É:”¥¿…'I-DµnÒiIñ#%%1‰ŒaqƥîK‹E©»T§´½,Ìr7'7ˆ‹Š·z•¤³œdòeƒ2#<ö ³B©SÖÝ2ævUiºs“×éÊDr&š7lž5ê7„¯ýì’f“"QäŒæà©³Ó­ê;THu;Ž»&šU j„ÌX%kBTh7—HF´©%ƒRŒÐ®×›6»¢Ö¦Vö¯.ŽºœYu½z$A§¥1uº[R\V„hÝ¡z\V¤¤ÌŒË´âxŒH´^NѵJ\rñ–ŠDÙCBÎ\¡¶H5êo}§vIu³ÖK3틵ÎqàŽ&˜ÍýM~¦¸ó¨Œ2Xn2\jR=––ᨳ' ¥z‰&Fiéb@¦€¼.ÒµbÒ­ú…Jï™5¸\¡´"N)…¥ç^ó݈·d¦JË*Qg(N0u[†—&‡_¨Ñfhå4ùNÅ{Aå:ÛY¥XþÌ‘‰M0atÐ Hžà=Á !H@ è€Ãa¿ v/úGOÿiliîòE¹ójÿÚä ÆÃ~ì_ôŽŸþÒØÓÜ?ä‹sæÕÿµÈ*vÑ÷þÒ,¸qD eIèbz !H@z èbë°‰R¡í²Êz$—£¸ªì6”¶–i3BÞJœ—B’¥$˘ÈÌŠQ‹~ÇeÒ©{E¤W+áÄI’‰è).¾Ú^u¥¥HoS,>¢í°g”`Ò•¤™‘ŒºrrѪ$¯t÷sÜZˆ«ÚÙ¸ m Ôm»k“eVC«K/)ä“®òë=J2à”‘$’DDD9Î¥zŠQ’•œZàûÖëÙqç¹oüÖÜJIÂâ~Ý}ÖNÝ¥Uií’Oz™õ&åš Òha­%ý†GûæT*S;=µjî•YÖݬO>/.I6²i0Ök`·g¹Zñ Í[Î-¤ù»RÝÜÖþÏ%¦3võãmRÙ­O.TЬ·^5c’§¶”¥8<'=±åJáŒõB°Þ±èV܋ބ§)õWçJ’ÜšŠJBKHq´ 釻=1ÚÂK"=fi2QvËIXiá„÷7ui^Ö’ãï·{+n'ÅgXÌÞw]—HràUFŒU'#Ï‘!£eÎF‡]SJh›%gCJNð—ÅDG ˆðY6­ãÖ>ǨÕKqUêezMj …̇Sm¶[-ÃR7Í Þ´Dö £V5ofd²Jve6Ãsj·é*í¡.-i¹åÈ[›QBÙ\Æ–ÛªÞ,ÉDDó¦’ÐFFhÉ«IêÓÈ…a¿³X6ÂïzT¡M“1¹å&£¹5¿¸JÈØêf¬qÐEî„zJ32ÂKåV0§^” wO¥{óIÚë‡$Ëp»FYöŸ^ŽõÖºæå=Oåûö¹'.ÎÎçF½ÎÓy¼ÏëiýQÍGmê…™ÕnººìµzîÎó—ïê¼›”cúO'ê~­î{Òi×ÇN819–ãÍ~;2™–ÛN)É,éà–’ZR¢#ç-I#Áñ">Óö}J“mMIn\Sã¾íyp²ù"“K¸ñé”$úÐ¥mWú+ß7Zßõ)j:VÕ¢½óu­ÿRæ£&‰Â^õþ±-#éNÁ~ìo™›þ%=¿| ^4¿ü&=6 ðc|Ìßñ,yíûàRðù¥ÿá1ß¼´Šœº+2ªu_œb«’,ÝÑY“ýSªüãý\‘ð-µ~ïÙŸ¿¯ý/ß4S$s lža²‘Ì5²y‡¹DÏPÖÈæ1«“Ò6’9ŒjäôV†f²W8ÖÈç1²•Î5²9Ìz´Ls5ÏŒ7Æcã ñéS3HÃtnØU&‹ ¹ç[¦Ô˜JÓ%È‘Ñ%¹yZ”•an Û2I’xj#ÒGŒ™çHèÄw¤mÂFeëWj·_v{Öæc²…¯ZɶšCH5 *4 ŒÏæb¼ï1Œ§F+¼Æ6Àã#ßzc¤d;ïLcôqàq`Ä 1Ä}Ÿ@€t½—R¥¦¶ÿúºˆæƒ¥ì»ú•+ý5·ÿÕÔFM;úyû‹G‰Ík*ÝB{ nlÊËt‰Š‹ñ•*6íèòYJô)Æ^im8’VhZ°x<˜ïÖ%NͷبK È¯T*2¡? „͆Ôv£%än(Ô‡VníKIpGÏFB§Ewf´z+Ô­§.[è\T&>‡ÛeIpœ5—'IñAgxežÔU®èKë–Ëëûª¼ºàêo[=I×Ô¶wÛî§rZ9F}×:óžÓ®1(WU¿oSèði ¨8ÔÃÅÒr ·þÙà†Èí›$šðFm™¬’¼‘’Iüa@ί&ŠÄ”Пœý7Vc®k)ií8. JT¤ä%’>8Î 8.°ÞÓhnΚ·î;Þ-&¡\3¡Gi³ƒžŽãI$#~”º„ÈÉ&–Ï«%ÇŒ€8§Äȵ;j«@¦SîGªÐߤ¶ãž·ÉæTêÝФ­Äh2[Ž¢5d”E§‡—U”þÐU\%סS¶Ž—¹L&Ÿu—ŽŸÈpFo –‚OºkíLÌ´è,êÌ-nTmɆìÊ«sbÕäÊši€Ú›C/¥„¶­ñÖ’Ž“Òd‚3Y–¢Ó•në=©:àÚEEkhnåmgNIÓÚÊV¹mJ2wÝûR%4M‘§^IF¬–ƒç A„»’£nTi–t&&USÔØ¤µÀl´j’ëæ¦Hž=æ7ëI·yÐG’ÔdœM¤U)ÕÛþ½\¤ªY©Ozce)”¶âwª5šM)R‹µ5d‰ 8*ø HÐ O@ {‚÷$„ !$ƒ : †ü5Ø¿é?ý¥±§¸ÉçÍ«ÿk7 øk±Ò:ûKcOpÿ’-Ï›Wþ× d©ÛGßûH²àiÄ 5•' A‰è`$„ ! è' @‹NÌit*ÅÅ*Á¤üVéS¦  ËDuëÉF¥´á(š4sdD¬ž'V1{Øbä1}=2%V*CjžâTŠ“P´<ä'šgCŽ-KÞ¸Þ0y/}À’fYté8èÕ$šOË}·kvaK¡V.)0îõ'â·J1Z#¯\xÎH"5-§ÉDÒ‘Í’5²ztž-½gWë°NtÑQxm!és˜Š‡\"#46o-;Åe)É–K‡™Þ×ÅÃZ©Rë{@©=O~…TiÆk7ê;«rÍ4“ߺHQ›®7‚ç/}À’fZC§¢í³í¸ôÚ½$ŠZ$¡£32Ðn#(R°D}¢”XQqÎH®UZkWLŠ-zŸqÑiÑ#S!E”Rª ²ô%Çe -IeFN9¨Ðn–é+μsä†ÊÕ䡤¬ûìíúYßvü¼Õ\VD´í.çµ­Ö—"=£)‚zSí´–Ùiãm+yÕGê‘™é,™s‘ ENÕ¯Óë1)Ó”äɤ“†˜Î"B$’”i#imš’áˆË)3,‘—@èת¡U¯ §[ñkTt?W¸“T§Ë:‹<–S)rB·{òVí&¤ÈBûe´i<(°1)5]¶vÕ»Q«AzCW)3"¼R„sb¦;E¼o$½Ú’n™ ÔE¯†O$2RÓkà]îÜ,îÿïî¾î{Ë8¢£U°nºl8“¦µ&4¹i„˰&11'!E”²fÊ×¥Ã"< ð|€ò¸ì«ŽKER£9ÁSü˜äEœÄ¤!ì·K6–­ ÁéVðà7ôj[ö´úÊ¿iô×®Ä|‘O”ÝA˜©mG‰®“K4joYéAöÆF¿{úÙ›Jj›Óq9 @©¿TmgÞ¬r¨SZKnÿ„-¢qdÊÒj"I¤ðêÈœzGL«­Œnš}é?Ý÷sX¼ì†c™õŽ`˜w@ú€t­ªÿE{æë[þ¥!ÍGJÚ¯ôW¾nµ¿êRÔdÑ8KÞ¿Ö%¤})Ø/À]ó3ıç·ïKÃæ—ÿ„ǦÁ~ìo™›þ%=¿| ^4¿ü&;÷ƒ¶€±S€wEfWõN«óŒOõrE›º+2ªu_œb«’> ö¯Ýû3÷õ¿¦ýtj‡k™•럲Ùÿùêu®eþV¸?e³ÿòF Ža­“Ì=êRò_?SHO«älž¤ÚçŸñ­Ëû(MŸÿ’0_¢ZçŸñ¥Õû-æÏÿÊ™Æ5rzG¥Gu¾ÿSã.fíû~×Wþ’»ÿe¶ÙÿùC ën×3ÿ(Þ²Ølÿü±^•Î5²9Ìzt”ûšËêdš|Ë;¶µ®úB÷ý–«~¸1]´ísÿÏï¯Ùi·ë‚¢øÃ|o„*õ,¾¦y"âå¡kŸþ~þËE¿\îY¶¹çü;h²Ïo×E)шïHÙVëY}N2/YV¹ÿç»Cý–k~º1ܲ-sÏønÑe–ß®Š#£Þc¡N¿ZËêr•‹êì[\ËúfÒ<ÉoׇXv¾¦m+̆ýxs×}éŒ~‘ª4´|?S“k‘Ҏõûói^d7ëÂ:õûói^d7ëÛmV‘â/‡êE×#¥‡k÷æÒ¼Èoׄu‡k÷æÒ¼Èoׇ6>ªÒ–ÅR} ©Œne?Ä4æx–•™`ÿa†¯HñÃõ\‹·Xv¿~m+̆ýx:õûói^d7ë“ݸ&R¬D¡ÔäSXÎö[Q¶[Ç>¥‘i/ÚaK·.¬fåS(UIÌ;#’¶ìxŽ8…½§^ì$dkÓÛiçÇ`Õé"Ëê.¹n°í~üÚW™ úðu‡k÷æÒ¼Èoׇ>©ÓçÒç9§ LmbCJmÄ?¨ˆÈ]M¨õ#«O—ÔÞQɹfå[ö[½xÓ¯O9Î8‰Õi"ø~¢ë‘ë×ïÍ¥y߯ ë×ïÍ¥y߯ KVÕÆõB 9ªUɵå&tÃpÜ’É‘¨œm8ÊÐd•¢É`¸"}»pSéŒU'Ъ‘ HÆæSñCNd²ZVeƒáÜ1½#ÄY}E×"ï֯ߛJó!¿^֯ߛJó!¿^ ‹ä¼èöô©ÎÁn§-¸…!¸äñ¶·¥ ÖŒ–£N{n“"3,‹X®J8”JLúœ„§Yµ:ÞY'»„‘žW¤x‹áú‹®Eó¬;_¿6•æC~¼#¬;_¿6•æC~¼9ÿSçõK©œ†O.Þn¹6é[ÝyÆÎsÑŒ…JÓº©¬Êz£mV¡µ -®RäAu´°—iA¬Ô’ÒJ22,ó™`ƒW¤x‹áú‹®EǬ;_¿6•æC~¼aÚýù´¯2õὓ¹Kn UÖnâªÉDw‘M‹n8®T•è[¬²ñ«‹í²¥­Dmàµ$Ï$(ñ豞±fÜIœéI‡S ȧ´iå¥Âs^rFÂÈÓ£¥'¨ø‘B…wýÅðýFîEì;_¿6•æC~¼#¬;_¿6•æC~¼)=nÜDêçPªJÎ9w$sqÏÒcO?ö…:ݸ*T×êTêRdù'¤±ÇoORˆŒ‹ö˜^‘â,¾¢ë‘w+×ïÍ¥y߯ë×ïÍ¥y߯lC{T¶jÍÖeÓaÛõäH ¹3£I†¢~9H7\ZH²†‰J3%(‹µRsÄÃW¤x‹áú‹®E·¬;_¿6•æC~¼#¬;_¿6•æC~¼(õªv†Lj‹R¦„š™åqVÎð»©ÔE’â\ÁkÒ$\%6‡ðýBSq›iøLzlà.Æù™¿âXóÛ÷À¥áóKÿÂc¿x;h 8tVdÿTê¿8ÄÿW$Y»¢³+ú§UùÆ'ú¹#àZjýß³?Y_FýtS$s lžal~‹M2þ¶ÑKþj_ ù:a—õƆ_ó3=\{Ô`þÙ’¤×ÚeFG1\ž‘r~ƒJ<ÿ»ZÌÍõq®‘oÒO?îæÞ/ïbw«RŠ1NH¥ÊçÙæ.²mÊ9ŸöÜ/ïb« {öÕÌÿñƒl—üÅCÕG©DÉ6R_o‹£ÖÅÿýŵËþQõAˆõ­C?ÿr-bÿ£Ô½Pz4äŒÒe)шïHº»jмeZ…ÿG©ú ÆrÔ ñÿÆe¦_ôjŸ©šûG‡F+¼Æ/ZTö—Ùªž¦1œ´müþ4m³U=Ll…Eç“8È¢»ïLcô‹Ã–…½…;?ìÕ_RgÛÙøU³¾ËUõ!ª5»òg&Šqˆ#³íï¶wÙj¾¤#¬û{Æ­öZ¯© kcç“ô"Å<ú ‘Ùö÷[;ìµ_RÖ}½ãVÎû-WÔƒ[<Ÿ ±Nrë>Þñ«g}–«êAÖ}½ãVÎû-WÔƒ[<Ÿ ±Mrë>Þñ«g}–«êB:Ï·¼jÙßeªúkcç“ô)À.=gÛÞ5lï²Õ}HOYö÷[;ìµ_R l|ò~‚Å4ˬû{Æ­öZ¯©ë>Þñ«g}–«êA­žOÐX§¸õŸoxÕ³¾ËUõ ë>Þñ«g}–«êA­žOÐX§žè¸õŸoxÕ³¾ËUõ ë>Þñ«g}–«êA­žOÐX¦€¹uŸoxÕ³¾ËUõ ë>Þñ«g}–«êA­žOÐX¦€¸õŸoxÕ³¾ËUõ!=gÛÞ5lï²Õ}H5±óÉú ížO‰OºšrsÉb<ˆÒ¡-åážQÆ ÃÇ$Ü%8ðlêì#SÓiЧSPF¥Õ%˜D’,êKÅ”¹ž‚F£W"31ëÖ}½ãVÎû-WÔƒ¬û{Æ­öZ¯©Ö/<˜±»¡D(6&ÏëUÚdž·ÓwËrKËŽ­ÓŒš`‘–qƒÉ2ñtÛY~©ã}Sˆ¨±îzÌÛ^æŽÌè2RíJ«q6ì‹QìÛ4ÄO(VóBHW:HÌÒ’3*7Yö÷[;ìµ_R³íï¶wÙj¾¤+‰yäÁÒ6]mîn+ þ¥Ýµ¸{Ø‹EMšš¦Dß-+uÒø–´­ÄÕ¨ˆ‹QÑé4ûŽ›±«ÍENªEeêtYê6‚Fí¹„ãn;SJÖÉ(˜Ö‚?|Y×uŸoxÕ³¾ËUõ ë>Þñ«g}–«êA‰yäÁï´¸5V-›uJÆJM¾¢CÏ´¤“¤™²M8Q—m†”É—þª|ÆCù³i• öÎî*5õ —U)Ó: o-–Û˜…©(.*Ò§›Îñ«#ˬû{Æ­öZ¯©Yö÷[;ìµ_RZÛòbÅÖE©Qi"tU¶Z㵯Fð«¶õ h'©<é3"< < UÓI‘qÖnÔÊ*Lêl´;-õ™±Qym«“›J>‚#3àC>›F¯T,­Ê%:{•˜•§•W¦²Ò¹JM¶–u4]²‰µ¦AÔÖYÆFYö÷[;ìµ_RÖ}½ãVÎû-WÔ„¹«÷äÅ‹a¸ÿTº’rS×Z\‡y¾-ç,å:·ZóúNGî8ÎsÚsðÊ¥&æ¢lB¥áb\õÇÈðe嵘óu/v®Ù)Vƒ2,èÙ:›RK¶÷¥Eë>Þáÿ[;ìµ_RÖ}½ãVÎû-WÔ…n­ß“<‡o‡Cº¡í™”E¢UÚ©1c%ƘŽ©Rh;‚2,g$ùnÿöû_}ÀPJÏ·¼jÙßeªú޳íï¶wÙj¾¤,æŸ<˜±“M‡W™± †z¢N‘=Á\ ÛRšlÍ™ItõsG%j›Ï:sç²ñ{µë©]©Qi/-…ý—ñœi¦²ÿ‹1çÖ}½ãVÎû-WÔ‡³VÕ%¨oÃkkö¢#HRTó)f®HpÓ&¤ò,–£Æy²}ÐÆ¼òbÆÆÁ»A‰2¨M¸Í úåKmfDoAV\KEý›ôš?¾Q[N›.å Uë²"Ý7$ªQJŸM¢L&M&’%¦CÄmºj#S®OF¥}±gFV}½ãVÎû-WÔƒ¬û{ ¶wÙj¾¤מLÊE}vuúE"°RNÎT¸Æ’9Û'7ˆI¦ožâH‰N ‰àS6xíZ’õÁSª¹5®µàJS1¤©EÉçH4Æ.Ñ^õÍJÔ|ýÇ0ÖõŸoxÕ³¾ËUõ!îÕµIjðÚÚý¨ˆÒ…<ÊY«’4çI©<‹e¨ñžlŸtF%nü˜6´eÅÙýj»M“Öúnùk’ó‘Õº[&˜$eœ`òL¼EÝ6Ö_ªxôJºé3®jÍÞ™]JN˜‡¦<¼±Qym¨£›K÷¯aãie§8$™ð"³íï¶wÙj¾¤#¬û{Æ­öZ¯© Ƽò`ÞÏ¥]5iÝfÒL£¥A¦Äm©l,ÉŠsÈm% Ý_3&o«=XÉ(‰®m‹ávòùúwûBÅ®ŽÍ³O§EŒíײ¹ïD38òäÓkDêLÔjí´FJÁŸ âWÃÌDCEQ¶¨õ „‰óv·h?*Kªyç«•­Ff¥ø9™™‚š¿~LX£¹uŸoxÕ³¾ËUõ!gÛÞ5lï²Õ}H[[<Ÿ ±O!äV}½ãVÎû-WÔ„uŸoxÕ³¾ËUõ ÖÇÏ'è,Sú —Yöö>lï²Õ}HGYö÷[;ìµ_R l|ò~‚Å8Ǭû{Æ­öZ¯©Yö÷[;ìµ_R l|ò~‚Å8ÀÅˬû{Æ­öZ¯©Yö÷[;ìµ_R l|ò~‚Å4Ǭû{Æ­öZ¯©Yö÷[;ìµ_R l|ò~‚Å8ˬû{Æ­öZ¯©ë>Þñ«g}–«êA­žOÐX§¹uŸoxÕ³¾ËUõ!gÛÞ5lï²Õ}H5±óÉú ñåÖ}½ãVÎû-WÔ„uŸoxÕ³¾ËUõ ÖÇÏ'è,S€\zÏ·¼jÙßeªúuŸoxÕ³¾ËUõ ÖÇÏ'è,S€\zÏ·¼jÙßeªúuŸoxÕ³¾ËUõ ÖÇÏ'è,S€\zÏ·¼jÙßeªúuŸoxÕ³¾ËUõ ÖÇÏ'è,S€\zÏ·¼jÙßeªúuŸoxÕ³¾ËUõ ÖÇÏ'è,S€\ºÏ·¼jÙßeªúuŸoxÕ³¾ËUõ ÖÇÏ'è,S@\zÏ·¼jÙßeªúuŸoxÕ³¾ËUõ ÖÇÏ'è,SÌ;¢âv}½ãVÎû-WÔƒ¬û{Æ­öZ¯©¶>y?AbšãÖ}½ãVÎû-WÔƒ¬û{Æ­öZ¯©¶>y?Acsµ_è¯|ÝkÔ¤9¨è›KMŸ¢ºMIš”HíÛðŠS-¸†Ý\zb™pÒN%+Ó­µjI‘gŽ&å/zÿX“#éNÁ~ìo™›þ%=¿| ^4¿ü&=6 ðc|Ìßñ,yíûàRðù¥ÿá1ß¼´Šœº+2ªu_œb«’,ÝÑY“ýSªüãý\‘ð-µ~ïÙŸ¿¯ý/ß4mök³3½(/Õ:º¨©J»äÆæp”+9ÖŸø\ØècØÎ×>Ä~”o}ÔI¿9¹þ©¡ÔGÛ4oghnŒ¥ ò®^ãñkTSkâpóö?¤ÿÎç¾È¿J?ƒö=¶ç|ŸÙÏL;˜ÿñÚ'……zõµ:™ÂØîÑóÞÿc.úaüŸ±Ñƒÿ{XàxkYûD¿Yk k?h—ë#ôËC¡d†&~|ö±ÀðÖ³ö‰~²Ö8Ö~Ñ/ÖGè0 –‡BÉ Lüùícá­gíýd=¬p<5¬ý¢_¬Ð`-…’™ùóÚÇÃZÏÚ%úÈ{XàxkYûD¿Y À6Z $13ó絎†µŸ´Kõö±ÀðÖ³ö‰~²?A€l´:HbgçÏk k?h—ë!ícá­gíýd~ƒÙht,ÄÏÏžÖ8Ö~Ñ/ÖCÚÇÃZÏÚ%úÈý²ÐèY!‰ŸŸ=¬p<5¬ý¢_¬‡µŽ†µŸ´Kõ‘ú e¡Ð²C?>{XàxkYûD¿Yk k?h—ë#ôËC¡d†&~|ö±ÀðÖ³ö‰~²Ö8Ö~Ñ/ÖGè0 –‡BÉ Lüùícá­gíýd=¬p<5¬ý¢_¬Ð`-…’™ùóÚÇÃZÏÚ%úÈ{XàxkYûD¿Y À6Z $13ó絎†µŸ´Kõö±ÀðÖ³ö‰~²?A€l´:HbgçÏk k?h—ë!ícá­gíýd~ƒÙht,ÄÏÏžÖ8Ö~Ñ/ÖCÚÇÃZÏÚ%úÈý²ÐèY!‰ŸŸ=¬p<5¬ý¢_¬Žì¾²¤l™»tK¦¸ëµ5L7ÖsŸ$él˜ÐD•8¬\^O¢Íµ.C…nÑê1$SáI•Ê`!禭öâÒ—L·é5›e»Rq£<ù1]žBÉ ¾e[®»§ÂZÏÛüÃ* jõ›|˜µúËSã”™Jê‚ËvÙº†‰X5qíÝA`²|sÌFey§À£Ð$Õ©P\¡5&=Å.2î g(‹PŽÑ¡)ekKKNMJ>ÐðêQ`³…@©J ÍÚ¢"QiÔÃj!™SåDbrbj‘LåÔ(”I%¨¹°£JTe”¤É³Ñî‚ÉvRzëºqýe¬ý¹ßÌ#®»§ÂZÏÛüÃÔãÆ­ÆZŸqPi³ JQ@äO2§°’2Ý¥† ”µ"5#‰p\O¢Æ£GÜTmzÔ›™4ú,Õ9M‡Oxê ÉÇu*NäÈÜÖÞV“{G¾"Ip!/G ¿"Évs^ºîŸ k?nwó ‚jWÊíÇ.Ü5ESš–ˆn,ªÆkC«B–’6õë"4¡xV'¥Eœ‘ÙG¨"Õ·í™hÔz‹µV•1Sà7+^™.2L'Y‚$´JÊ4«Ý9ù±g±iôš¤[¬§·ÚˆÍ×O}ªl³%iY"¡»…—PiÎLju:H‰F¢áƒ‡£Ñ_‘d‰»æsrºîŸ k?nwó ½>þ¸&®"·Y’ú7TŽ©)IžT².uÁ¾ªª7D×*4xi 8¦•â">•i¡ ,™seYQ㉘èÞÿ†ú_þÓ?í, l´zH‹³KÖöØ;ê³÷Â} ¯\;òUv•X¬×"Li(ZÚ\÷ É+BVƒÉ(ÈÈÒ¤™pÈ}p2=šùK]Ÿô?ö6ì´:H]œß®»§ÂZÏÛüñûh³v•uK¡Ön*ÉgFéî_#ÜûG–}ª\Ns ‹‰ð ~–ÿÁ÷ð¦÷þïú‰!²ÐèY!‰ÿÚÇÃZÏÚ%úÈ{XàxkYûD¿YjÑéhm©³ë*&¼ŽMK¦Ò*ŽÅ\‰=±–„¶iÖ®ûÓ$¡¶’Ê–¥œ%$Dff|ˆ{{XàxkYûD¿Y+lòâÏØé: –eD“kOy‡Ùp–Û¨TUšV•$ÈÈÈË‘mNóº­sºîj=”Ûu ë(¦0ë+k‘›;ÆkZ÷™ß£ "G½<§‰ËC¡d†&Qý¬p<5¬ý¢_¬‡µŽ†µŸ´Kõ‘l¸okÚԤ׺›zlö­Iõúz¡0êmÈ©F¦]%8£q9y¼-&DKíSÀmö±{Õ-3šTÖ!=¸´kU´ïÐ¥eø|—t“Ò¢í~½EÎx,qËe¡Ð²C9絎†µŸ´Kõö±ÀðÖ³ö‰~².÷mh¶ô*j¥u%i’·œ™:dæ %)ovÊ™ií놣7Lß-)"Ae‘~·¦õNN©oâ¿Êâ´þö*L¯R Z›3âh<äŒú0-…’™Â½¬p<5¬ý¢_¬‡µŽ†µŸ´Kõ‘ú e¡Ð²C?5»ìz¤4á¶åëY%9r‰ž°0+›·(ô™)—½srÂu(ôÃRŒÏEþÎfd\p\x™ê;X]àÍl‹ºKõ¦t¸Ôj“k6¤$“ŲRV >Q™§%ƒÁ¤óˆ¡V65P«í &—.Váq`CŽën°Þñ<^Öâ°µp=Di"í»c4¦›5…’&ìüûyÒd[þÊú~ÎÛ¯W$Q±JŠûk©>FêLstµõ$ŒÜ^0y"2ãÃ#õsÛ"ÙÃn­¾£VOJŒ³×5GŽ?ç‡æm¯ÿú€BÿHèêâÚ?¥½ÿ¯þâ^G¡d…ÙFìK³‘k>sT}0v%ÙÇȵŸ9ª>˜i¶ÇY’íN ±O¨WiîòggÈ•Iƒ*K%HŒ…”t)D…;©g’‰…$ùð3¡ÞU{† ²Í¾Ü( Ä9¤ª£Ç ã©¶ÞdÚ%!Fá:é'¤ãJŒóŒ ìÔzH]ž¨Ù~Ë×1Èi¦Õ%¦Ð댕ÓP5¡ 5TißäˆÍ ">*îöìK³‘k>sT}0®Uî*¥#kOÒ˜ 땊)†ÞtÔP™u.Ô³R¸)]:,)xç"%(²ë×]é»Î§è ¦Ú‹#q¥Åw}1 „Ä—H”NéhýÑZLÉ}eÀÔ©Ù¨ô,»7‰vqò-gÎj¦Ä»8ù³ç5GÓ ¦î¸ ½sÔ©­Òº“kiå¬HmÅH—†!ÍÚÉd–ðÛ‰$å+Ô¢2à&FЧ\mÑ*Q7SYv,—ZÊS)¥£aÓÉŸT¨¨3æÊ–|4à›5…’gº6_²õÌriµEIi´:ã%tÔ hBÍD•wù"3BȧJ»†=»ìãäZÏœÕL)ѯIðž¯^R ¡ÉR­ê"ã0ÓN(´ÈŸ= e Ôµ%ÆÍD’33%`‹$Csü¸C¬9*œoÉŒô& Ëz2—÷%˜VUX¹(Û*¦t™ÕB¦P¢D\v–à Só&4ÚœB–µ$’·{b%RœðÎ 2©{]ÚîxÕÆ©U©‘)ŽC]>#èÞ¹2C̶‰N/ RÚ£RŒˆÌ²j"&ÍG¡d…ÙºìK³‘k>sT}0Ô^;:ÙíÚ™SbVuÖRD„®æ¨éÔ¥HÏñ"3Î8gÉsÖÎn:ÅnEN%Z+ÆQ •³4è²é­¾NkÊ ©=¶¤8™(ÈÉiæ<ÊÚ§õ¥ÿ5þµ³QèY!v~Úã®ÈD§ßunºä ]kZÔjR”tb333ç3>‘ÌGJÚ¯ôW¾nµ¿êRÔWCVRý?Ö"GÒ‚üØß37üK{~ø¼>iøLzlà.Æù™¿âXóÛ÷À¥áóKÿÂcGx;h 8tVdÿTê¿8ÄÿW$Y»¢³'ú§UùÆ'ú¹#àZjýß³?_ú_¾hë>Æ¥¥6,ÒR’GÕ79Ïÿâhu 㟤~6fá¯ÀŠˆ°k•8¬#:fZЄäòx"<3ý£Eáv‘pºk…ÿOwó¨hÿÅ•8ÇV÷$¸£óu}“7&ñ#ö–ñ¿ŒOÒÆþ1?Hü:ýéx–qvW‹ÿˆ»ù†¶Eñz–qx\ýÕ'¿0Ûâ*rüŒÌý›%ùÞ›Æþ1?HoøÄý#çÔ›òù#áyÜeýÕG¿0Àhéâö¹KÿŠ¿ù†˜{fü¬äô).óè¦ñ¿ŒOÒÆþ1?Hù¸öÑ6€\×ÍÎ_üYÿÌ1Ú6ЋšüºKÿ‹¿ùƈûF/òœÞŒ×yô»x߯'é 㟤|Çwi;E.kúêûâGçÎm/håœmëûâGç––ŸqGE®óêñ¿ŒOÒÆþ1?HùhæÓ¶’\ÛB»~ù‘ùÆ3›PÚYãh—wßR?8ê«'ÜQÂÇÕM㟤7üb~‘ò‰Í©m8‹†Ñ®ÿ¾äþqÙSiùøG¼~û“ùÇTîTú˼oãô†ñ¿ŒOÒ>MÕ6ŸãñûîOçÊ›Oñxý÷'ó‰ ú˼oãô†ñ¿ŒOÒ>MÕ6ŸãñûîOçÊ›Oñxý÷'ó€>²ïøÄý!¼oãô“]•6ŸãñûîOçÊ›Oñxý÷'ó€>²ïøÄý!¼oãô“]•6ŸãñûîOçÊ›Oñxý÷'ó€>²ïøÄý!¼oãô“]•6ŸãñûîOçÊ›Oñxý÷'ó€>²ïøÄý!¼oãô“]•6ŸãñûîOçÊ›Oñxý÷'ó€>²ïøÄý!¼oãô“]•6ŸãñûîOçÊ›Oñxý÷'ó€>²ïøÄý!¼oãô“]•6ŸãñûîOçÊ›Oñxý÷'ó€>²ïøÄý!¼oãô“]•6ŸãñûîOçÊ›Oñxý÷'ó€>²ïøÄý!¼oãô“]•6ŸãñûîOçÊ›Oñxý÷'ó€>²ïøÄý!¼oãô“]•6ŸãñûîOçÊ›Oñxý÷'ó€>²ïøÄý!¼oãô“]•6ŸãñûîOçÊ›Oñxý÷'ó€>²ïøÄý!¼oãô“]•6ŸãñûîOçÊ›Oñxý÷'ó€>²ïøÄý!¼oãô“]•6ŸãñûîOçÊ›Oñxý÷'ó€>²ïøÄý!¼oãô“]•6ŸãñûîOçÊ›Oñxý÷'ó€>²ïøÄý!¼oãô“]•6ŸãñûîOçÊ›Oñxý÷'ó€>²ïøÄý!¼oãô“]•6Ÿ„{Çï¹?œ;*m?Æ=ã÷ÜŸÎú˼oãô†ñ¿ŒOÒ>MvTÚŒ{Çï¹?œ;*m?Æ=ã÷ÜŸÎú˼oãô†ñ¿ŒOÒ>MvTÚücÞ?}ÉüáÙSiþ1ï¾äþpÖ]㟤7üb~‘òh¶©´ÿ÷ßr8vTÚŒ{Çï¹?œõ—x߯'éŒ?ð—™ö‘‘—øÇ›û¢Í=•6ŸãñûîOçk–êº.nO×%ÉX­rm[ލNrFëV5iÖ£Ó)Î9ð]À †Ö‰pÔèÔê¤ ˆ˜õXåa= —”¶ÈõR§jGlIVPdz’ƒçJLµD ¥áªQ©õH1ê±Ê4Âz/)m‘ê$¥N ÔŽØ’¬ Èõ%Δ™fÒok–•Of)Í%¸ù(Î9—^“3=Ë«A¸×3íž&gÎ+ "È åpÑ)ë§Á–¢)ó’MJ†Ì”¡ã"#qê¡x"-IÁð.<5&ä¬Ó*²ªqå!É3¤Ê9L7% J%¨œC©RW•+¶#âD|ä5"ȵº¤úÕMÚ•Iýü§t’”HJ‰)$¥$”‘RI"""""""!d´»Å‡IäO‚·Í¥0ëÎÒ¢¸ì†ÔƒBòÔÙ©äšLÈÉÃQ~Ò!OèadÁ¾·®û‚ƒ£Se²–’áºÑ=—͇khÜJ¥ ¶FqàCÎ-ÑYC—EC±‡2Z&H'à°óŽ|pâF+ M¬Ò¾Üý©ü‹hý–O¬´ëΩ´â¡wÖX‡|ýÖõ¸ˆRZ-ÛHl´’”£æAg&|sý·Р¥¿ð~ÔŸ32"íyÿâ$Í#kn\·´û¯Û•ú­×’Hup&9KIH”h2Ég ÀUîkÖ¸®. ‰Õª1â5" rd%%£V£NuÄø™ã'‚Ï1cm:‹HŸjȶ'’éra*í¿-Ÿë*A¡D§M[Å(Òg•šµsœñ+»*m?Æ=ã÷ܟΕ6ŸãñûîOç}X¯Sé•Êú%Q´ÈPŒäYMo ;ÆœI¥iÊLŒ²“2ÉpyϤQ§Õ©LŒËòY†ü$)j3Náõ4§PiΕ–ùÈϵÁc'Ÿ•}•6ŸãñûîOçÊ›Oñxý÷'ó€>žÐ¬;:ŒÌơӷˆ™‘¼S&;+ü‰n¾Z´5ÄýÍ8Oö û/°ÙD´>Kü²–ý!åJ«J}G íÆ N:f”„à’e§ŽœdóóC²¦ÓücÞ?}ÉüáÙSiþ1ï¾äþpÔ«¦Ú¡\©`ª¼«TrY6äJƒñ$«’kehQ¤ô§)32<K€ÙÓc@¦Ó£S 4Äh‘ZC,2Þ -¶’$¥$]DDCåeM§øÇ¼~û“ùò¦ÓücÞ?}Éü଻Æþ1?HoøÄý#ä×eM§øÇ¼~û“ùò¦ÓücÞ?}Éüà£7Äã©,5m\’ÒÚ‰;èôåk2"Γ3,–rYæ>Œ– UïJBµl˦E´®t<ö*rœ¢IaiQçgÌ]Áø;²¦ÓücÞ?}ÉüáÙSiþ1ï¾äþq\$Üì;_ÿõ…þ‘ÐÿÕįê5ê5 ,½Y§6âRV…JALŒÈÈË< |À™pW¦\ ¸fVêR+)q·SPvR×$–Œ¼3Õ©:SƒÎKŽaí×UÏácí®~a-\\úM}£¥6¢ÅZ–™s¡Ãœ“5èN”—`ˆ‹< “3ç33ÔϦìòj—gÁmJ˜¹¤ìz²˜u,ˆ–¤-· HÔEÄ’dG“3#31ó¿®«ŸÂ:ÇÛ\üÁ×UÏácí®~aEÏ¢’¡lòTyäI¤8܈Qà¸G<¿B–¦I=¿j¤)Õ™-8VL< ®µb;K¬Ó¨Óœ‹[I¦¢•Ô²§ÈØDsÊzˆÍ¦Ðœ‘‘ðÏ9™ŸÎnº®ëmsó]W?„u¶¹ùƒ¹ôF±NÙÝ^­ÕIóiÎH=Þô“T44þƒÊ7­%d‡tŸ6´«ûªÁÙÝQú³óäQÞv¯ 0§(笧V”ðWje¨ûdàù¸ö¥}u\þÖ>Úçæº®ëmsósèÓíØ/ò²z]ÄÌ„ÌЩ‰4©†Ãmu`´›®`øóð,cE§ìú=2u8êPåGž‚nO-¬.RÖ”çJuºâ”Dœ™‘– òX1ó»®«ŸÂ:ÇÛ\üÁ×UÏácí®~`Â.}Mg±)µ¦`L¥½"­ I]B®äþïYµ¼RÜ5ö¦áñ#%cÚ§»"…nÃrà~¿>€eZeˆÎÄMiÉäm³¼4©o¿‡³7UÐZI("æÈüwUÏácí®~`ëªçðޱö×?0a>ÛÝeÐwçO­Æ5¿¤œrUarœQ':S­×¢Ij< 'Àam&µG—eO­÷—»ÒÛr¥Iž<Ä>xuÕsøGXûkŸ˜:ê¹ü#¬}µÏÌEË–Õ¢½óu­ÿR棥mWú+ß7Zßõ)j3hœ%ï_ëd})Ø/À]ó3ıç·ïKÃæ—ÿ„ǦÁ~ìo™›þ%=¿| ^4¿ü&;÷ƒ¶€±S€wEfOõN«óŒOõrE›º*se0‹~£ KÃîÍŽêƒâ”!òQç›­?O÷€è]«÷~ÌúTÞeÏЩHæÙ<ÂÜõb™Ž6­ö»3Ó «œqµmÿÚìïL=úI.ÿóèa©Wþ¬¦Èæ1«“Ò/V(ÜsjÛ_µÚ‡¦/Ö(|sjÚ¿µÚ—¦•%ÿñ˜ç?&P¥slŽsúÅ¿ÓjÚµÚ§ý '«æxÚ¶gív­é‡§J¢]Ï&dœ¼ŽvøÃ|tGk×M«d~×k˜b»X¶:m[ö»YôÃ|+®O&g“9Ë£Þ‘Ò¬Z½6­…û]­úaŽåbÔã›WgÿµÚç¦!¤.—“8ÈæŽŒWyŒt×+—‚»<ý®×}0Çr±hqÿr»:ý®×½0Õ )tË&r’9{¾ôÆ?Hê ¬YØþªìßö»_ôÃÇ«nª»5ò·¦£¥®‰dÎN'51¥bÍðWf¾VàôÂ:±fø+³_+pzam­tK&F›@Òαfø+³_+pzaX³|Ù¯•¸=0mk¢Y1„æ :_V,ßvkånLX³|Ù¯•¸=0mk¢Y1„æ€:_V,ßvkånL#«o‚»5ò·¦ ­tK&0œÔJêÅ›à®Í|­Áé„õbÍðWf¾VàôÁµ®‰dÆšé}X³|Ù¯•¸=0ެY¾ ì×Êܘ6µÑ,˜ÂsP+«o‚»5ò·¦¬Y¾ ì×Êܘ6µÑ,˜ÂsRÝ+«o‚»5ò·¦¬Y¾ ì×Êܘ6µÑ,˜Âs@/«o‚»5ò·¦¬Y¾ ì×Êܘ6µÑ,˜Âs@+«o‚»5ò·¦Õ‹7Á]šù[ƒÓÖº%“NkÝ:_V,ßvkånLX³|Ù¯•¸=0mk¢Y1„æ€:_V,ßvkånLX³|Ù¯•¸=0mk¢Y1„æ€:WV,ßvkånLX³|Ù¯•¸=0mk¢Y1„æ :WV,ßvkånLX³|Ù¯•¸=0mk¢Y1„æ C¥ubÍðWf¾VàôÂz±fø+³_+pz`Ú×D²c Ít¾¬Y¾ ì×ÊܘGV,ßvkånLZè–La9·@Òú±fø+³_+pzaX³|Ù¯•¸=0mk¢Y1„æ :_V,ßvkånLX³|Ù¯•¸=0mk¢Y1„æ½Á¥õbÍðWf¾VàôÂ:±fø+³_+pz`Ú×D²c ͈@éeX³|Ù¯•¸=0ެY¾ ì×Êܘ6µÑ,˜ÂsP/«o‚»5ò·¦Õ‹7Á]šù[ƒÓÖº%“NlAÐ:WV,ßvkånLX³|Ù¯•¸=0mk¢Y1„æ€:WV,ßvkånL'«o‚»5ò·¦ ­tK&0œÔ@é}X³|Ù¯•¸=0ެY¾ ì×Êܘ6µÑ,˜Âsn:_V,ßvkånLX³|Ù¯•¸=0mk¢Y1„æ€:_V,ßvkånL#«o‚»5ò·¦ ­tK&0œØ„–U‹7Á]šù[ƒÓêÅ›à®Í|­Áéƒk]ÉŒ'6è:_V,ßvkånL#«o‚»5ò·¦ ­tK&0œÔJêÅ›à®Í|­Á郫o‚»5ò·¦ ­tK&0œÔÀÇKêÅ›à®Í|­Á郫o‚»5ò·¦ ­tK&0œÐJêÅ›à®Í|­Á郫o‚»5ò·¦ ­tK&0œÔKêÅ›à®Í|­Áé„ubÍðWf¾VàôÁµ®‰dÆš€é}X³|Ù¯•¸=0ެY¾ ì×Êܘ6µÑ,˜Âsa¥õbÍðWf¾VàôÂ:±fø+³_+pz`Ú×D²c Í@t®¬Y¾ ì×Êܘ:±fø+³_+pz`Ú×D²c Í@t®¬Y¾ ì×Êܘ:±fø+³_+pz`Ú×D²c Í@t®¬Y¾ ì×Êܘ:±fø+³_+pz`Ú×D²c Í@t®¬Y¾ ì×Êܘ:±fø+³_+pz`Ú×D²c Í@t¾¬Y¾ ì×Êܘ:±fø+³_+pz`Ú×D²c Ít®¬Y¾ ì×Êܘ:±fø+³_+pz`Ú×D²c ÍŒ;£¥ubÍðWf¾VàôÁÕ‹7Á]šù[ƒÓÖº%“Nh¥ubÍðWf¾VàôÁÕ‹7Á]šù[ƒÓÖº%“FÕ¢½óu­ÿRæ¢ñ~×¢ÖbM“ÊèÜ¢C´æ™‡LnQ4Ã"®:K2 Qö¤ß:”fy1G ødÚ¶õÇwåHHúS°_€»æfÿ‰cÏoß—‡Í/ÿ M‚üØß37üK{~ø¼>iøLwïmb§îŠWôËÞè¡UL±üÿ¢öŒú4{$häs lža²‘Ì5²y‡¿DÁPÖÈæ1«“Ò6’9ŒjäôV†f²W8ÖÈç1²•Î5²9Ìz´Ls5ÏŒ7Æcã ñéS3HÃtb;Ò2ÝŽô°8HÄtb»Ìc)ÑŠï1°8ÈÄwÞ˜ÇéûÓý#\xX1L@±Ÿ@'Ð „÷Džè÷D îˆ =ô=Á{‚B€AЈ = O@ƒ$ IO@= H"&Ð0î€ })Ø/À]ó3ıç·ïKÃæ—ÿ„ǦÁ~ìo™›þ%=¿| ^4¿ü&9÷–;h 8tPª¿¦X¾÷E «úeçý´gÑ£Ù#G#˜kdó ”Ža­“Ì=ú& †¶G1\ž‘´‘ÌcW'¤z´ 35’¹Æ¶G9”®q­‘ÎcÕ¢c™®|a¾3oJ™šF£Þ‘–èÄw¤mÂF#£ÞcNŒWyŒmÆF#¾ôÆ?HÈwÞ˜ÇéãÀâÁˆbˆ$ú >'º „÷@'º Ot@ è' @ îÜ’$„’€ è@$@‘ èbz !H@z è````D  0î‡téNÁ~ìo™›þ%=¿| ^4¿ü&=6 ðc|Ìßñ,yíûàRðù¥ÿá1ϼ±Û@X©À;¢…Uý2Å÷º(U_Ó,?è½£>É9Ã['˜l¤s lžaïÑ0T5²9Œjäô¤Žc¹=#Õ a™¬•Î5²9Ìl¥slŽs­Ísã ñ˜øÃ|zTÌÒ0ÝŽôŒ·F#½#l1®óÊtb»Ìcl21÷¦1úFC¾ôÆ?H× @“,A'Ð Iô!=Ñ'º€=Ñ{¢€O@=Op@žà€$ t@"ˆO@ƒÐ ÀIBÐ O@€ H€I‡t ; Jv ðc|Ìßñ,yíûàRðù¥ÿá1é°_€»æfÿ‰cÏoß—‡Í/ÿ Ž}åŽÚÅNÝ*¯é–/½ÑBªþ™cùÿEíôhöHÑÈæÙ<Ãe#˜kdó~‰‚¡­‘ÌcW'¤m$sÕÉé­ Íd®q­‘Îce+œkds˜õh˜ækŸoŒÇÆãÒ¦f‘†èÄw¤eº1é`p‘ˆèÅw˜ÆS£Þc`q‘ˆï½1Ò2÷¦1úF¸ð8°b˜b >O @ îˆ!=Ð îˆÝ@z è{‚÷$„ !$ƒ : $@zžH@’žz‘DL; aÝ@úS°_€»æfÿ‰cÏoß—‡Í/ÿ M‚üØß37üK{~ø¼>iøLsï,vÐ*pè¡UL±}îŠWôËÏú/hÏ£G²FŽG0ÖÉæ)Ã['˜{ôL lŽc¹=#i#˜Æ®OHõhfk%slŽs)\ã[#œÇ«DÇ3\øÃ|f>0ß•34Œ7F#½#-шïHÛ„ŒGF+¼Æ2®óÛŒŒG}éŒ~‘ï½1Ò5ÇŃ$Ä Iô}OtA î€ Ot@žè€ íc–ŶWtl>Û¹.KKª5YÜ«~ÿTdµ«D—PžÕK JK0¿û^¶à”EÑ6>xtD=¯[ð÷ÄÏJ×­‡øûâg¥ HXùÞ臵ëaþ~ø™éCÚõ°ÿ?|Lô¡‰ <;‚ÑkÖÃüýñ3Ò‡µëaþ~ø™éC>xôCÚõ°ÿ?|Lô£’{)¶a³ 'fî˵ì´@©º¤š%ª¥)Ói$ëd¢$-ÃI™’ñ“#Ág†pdº?%’ è€D ž' A€’$„' @ž$@‘“èw@>”ìà.Æù™¿âXóÛ÷À¥áóKÿÂcÓ`¿v7ÌÍÿÇžß¾/š_þûË´Šœº(U_Ó,_{¢…Uý2Çóþ‹Ú3èÑì‘£‘Ì5²y†ÊG0ÖÉæýC[#˜Æ®OHÚHæ1«“Ò=ZšÉ\ã[#œÆÊW8ÖÈç1êÑ1Ì×>0ߌ7Ç¥LÍ# шïHËtb;Ò6Àá#ÑŠï1Œ§F+¼Æ6Àã#ßzc¤d;ïLcôqàq`Ä 1Ä}Ÿ@€ÝB{ Ý'º €ôCØÿ“M›ÿNÿlxXv¯>m2Ñne<¥®Bjô´“Q\$:òUPŽ•4F¥%=ºLÑ…(’d£#<Ч±r£Oìi²¹|è±wœ¿Fùä£V&;œdøó—Ò/5Z¥UŠˆÓêô·šD†d¥<µ)ÃŒº—[VIEÌ´$ñÌxÁä²B‰%r©rVåÝÖl7m‹†ƒú»©yÙR"O¤©òÔM1!Ål”¯9ArD+ÔFnZ­gUg3rW)[Vâ)U“‰+•›zœyÕ­)ÝDhǺ *ÊOVGDQ´§J&U^–ã´ù&*¹jKvá´ãF¬¸öެ°y.Û<äFZ7h»9\J|VêlÄnŸ ¸1ŽyØË&,!µ-·R¥¤‹>øÏœû¦ +–:§bÒkTúÝׯªÐ)ƵVeÆtª£l>ÓˆmhI­$·Z5™ûRíŒÈŒnHDËÇ­«W#R)´¦¦6†êòJD§}ä¨×#^ùIl›,¼{©ð$‘mP›8ÔFæÒOŠû2eR’K<—¬’²g¼I(òg¨óœäóüÜMØõõÇv£U…¿ŽJ&dFªª3í’±©$ãKJÉ'‚Ég‚Ï0Q«“j†ˆ=pÖ˜…x9N.§TŽ,ɬ-é…ÇôâÅ@:I@t  H€ô1= $ =ô0000"ˆ˜w@ú€ô§`¿v7ÌÍÿÇžß¾/š_þ›ø ±¾foø–<öýð)x|Òÿð˜çÞXí ,TàÑBªþ™bûÝ*¯é–?Ÿô^ÑŸFdŽa­“Ì6R9†¶O0÷è˜*ÙÆ5rzFÒG1\ž‘êÐ0ÌÖJçÙæ6R¹Æ¶G9V‰Žf¹ñ†øÌ|a¾=*finŒGzF[£Þ‘¶ ŽŒWyŒe:1]æ1¶ŽûÓý#!ßzc¤k‹ Iˆ “è$úžè‚Ý@žè=Ñ@ ¬k–â ˆq«õVcGI¡–[˜âPÒMF£$¤F¥)X.•ôﮫŸÂ:ÇÛ\üÃN Ï]W>?¬u¶¹ù„uÕsøGXûkŸ˜j:7u\þÖ>Úçæº®ëmsó 87=tÜü?Ýcí®~au\þÖ>ÚçæŽà€䮫ŸÂ:ÇÛ\üÃÂm~»62âÍ­T¤°¼kiéKZƒÉdŒð|HŒkˆ@ è€D ž' A€’$„' @ž$@‘“èw@>”ìà.Æù™¿âXóÛ÷À¥áóKÿÂcÓ`¿v7ÌÍÿÇžß¾/š_þûË´Šœº(U_Ó,_{¢…Uý2Çóþ‹Ú3èÑì‘£‘Ì5²y†ÊG0ÖÉæýC[#˜Æ®OHÚHæ1«“Ò=ZšÉ\ã[#œÆÊW8ÖÈç1êÑ1Ì×>0ߌ7Ç¥LÍ# шïHËtb;Ò6Àá#ÑŠï1Œ§F+¼Æ6Àã#ßzc¤d;ïLTš•FQj£I¨K§Íg;¹^SN#$i<)&FY#2þã1®<,Å1õÆÒˆ¶·³Ëæ“‚vå±ëó\ŒEÅnE'œÂKÿq&œKHîŒ?a›MЮs¡iê…J†º´Ó2íšozÊc7ý†hZÜ>é:Žà¦·ð·acò¡ôJ¯vm5{¢mL•ª•f¯)jJ8R•/ ZÕ‚""I(ù‹¸<®-ŸÕéV›lI”êÕ×Î9ϧ­f†Ýÿ€´¸„-ýéÇî–o‰p ¨é·Æêvý2ƒUªÝö¤zmy²v £zN•$Ò…$Í;dFK#Μëxf±´›"»³û™výÂÛ)”M%æÖÊõ¶ëj3"ROxÉq"<‘‚’|YvØ]J£MÚå­Ôꄸ|ª¯4ÃÊo|ʤ7©µàËR”ŸÀ¿û$#UîÿdÔ›8ë›–—",jr'<ê£GqèÌö©JR­פŒÉ8É‘«“(r´¬¢±²û›^eë«Q­´Ù--ÇŽ;ǹKÚR¢hÌA™öÉ"íL³œfl×îÛê¿fSêÔF*ÔGCé’ã扷wKSjKJàJÓï´™ê,ñÄãˆ9È ô}–V¦Ú•«†W¡Õ›¡'UR4GÜ7£ ÌÏSiBȉ*<¡J#Òx3)§ÀçgÛN—G´-b“´¹ÚJ3­Heº 3eõÌ}D·\pÈÒ“BÚ÷šñŽb=¾Rï VÓêMß3ŸXy-¸©6”"Cd‚B”¥)"íPIÆ ŠOŸœê¤Û³„÷G\ö$ÚT»»k­1YŒÜ¨”ènOTwS©©*BJ.’%8GŽcÇѰIÕ ­×îÛJî˜íJªCÒá¢Aê(/%Ô% c?¢"Þs'dX2ÀJv¿‘6?=ý°Öß±êø›C6é?+i«º˜‰&²ÖZnJÍ)B°NäµöéþÁ‰ì°û R£!êÃÔTõR¨Â LMt’ÙdOjê‰[Ã3#> OöSüV8@¥W´n]‡ÝíÇM¥TW.,‡"2N­¡ÝÑ d¤àÔÚBñƒ#2"%t•ïØãY©^ŒÞ¶9êÅ¥”§¤;QVñ1ÔZMµ+ôg§xdIÇ–:¹Ù]p?9÷D£±‹ívUµq+©ûz|¹°M+Lnk¯2„J'”8d‚–ÑäÔ“îg˜m=e|Uí»^ë­Ý­Ývì´»Ôɉ€ÜE²â±¼mÆÐ\îð”]¡ãûXž+q k·f75±`ÐïZ™Bê]kG'&žÔê5 ÖiÆ RHÏž:p|]¥Ö^­û o‰D… ¦kL³4FI¶™lœ„d’éWš”f£3É™ƒ¸ó`Óìe À~™~^r£3&M³DrD<‚Zú›uIsIð3NèñžîyȆÇg…/i›Ú7]sªÏ·£µQ§M”³qöCªZ³ã¡DÖ4çsŒƒ™68(ïÛw7ö>͹dY*“)tÄΪT➉RÝRÔŒ¥Û%hQ’HÈ»a.Vip!vªm&½VµcS*n*MZM©Ð«†¼Md…‘·½"Ö¢Ô¤,ŒÕ’4tðÓÞ¶×>ú‘²í•L·îçi’dQ Ùï;r7O\¥›Œ”¥:ê ÓɬÌûljã\jæÓI’~OúSeuKl´{_jwÔS`õB2¥+”'•Ì ÍÖñN- B *Ðdx5eEï’Eý^vnÛm¨Uùw‹êƒ*Ÿ%¥âI<˜ÚÛQ!öÛZu6m™’ðÙc 2Éfû šºûìk¿.šÞÜ­JKõª“t†árB¦¢c¼”ÒÅ=HIîZrfÙ,ø{ã3M®ß—O^ÛB¶æVêSéRêRb",©Ž¸Ôd·5. ÛA«JL·D’áÁ*2!lO¬AË@lmz‹‹–—V•ºƒ¦3!ØŽ$% %g’2ˆ°y#çæ1ܽŽWm×{miÊmÁ%UKjLi.Ô II.v‰iÒÙö‘/Bxp12“Џ?>÷ý±[vÜUoj—u9†&Dµ¡Ëz†N¤œBL÷êeÜ+$£$´XÎ}öyð<öxRö™±]£u×1ê¬ûz;UtÙK7`ô:¥¡+>:McNqÇ8È«¨MŽ BzÚKٞŶs֤ǩSîîÔj3b¬Û}óÐÊ…,»m 'q§8áœdXî­Ñn­¢ìŽ¢ìV£¦ð¦&UY¦M¥å²ÂqXN4šÉXÆ{RìMN•K­Ožh“U¹«mÔæG¸nÐÚð´èI’ 9mXQ‘‘ªÒ è-öþÏêµ;EÛºdêm‚‰ª p’ë§úˆKhZÔeƒâIÇãÀñ“7f7 â‹jÔ$Ó¢®¸M2y¸µÄ’—x6iR¥aJ2Oð5ž ˆœHpk°Ú»¦­jĬےë´ÈÉ”äe;¼q¥L&¦É<ëIaF“âGŒ×j›2­ÄÙû×ÄZ"©I‹+’L8O-KŒîRXQ) #,©%”ˆõ ˈ)Å÷‚Ž`bñJÙ^U„ÕóRªÒ(”)4gç-Ó7Ü#Qa)iµ« ,™½1Zº(“mÚÛ´™êao6†Ý%°é8Û¸Ú\miQs’´Ÿí¤˜5€:g±¶êjí!¹­I˜tö Î™6/©–LBâR²æV #ÁžEÓm[>§¿L¶M“>áÑYI’ÌC4;Nx&âI%ÚûÚ¹ÚV`üþô}‹D{j;v¤Ò®úœúµ.—mSêj‹*RÜJÔ¨0õã'Ã[‹J—}ƒÏ8æ}­^nÜOÍ¥Ö¦Ó‰ã8Ô¸äH„ÛD}«fÁ…òGžSor?úm†›¨—½ŽÙÛê¾­ä›È‚ê™8‹%Ƶ2h24j- 2.5wFêñ»®¶=‡v]u‹ž¶ÕZMmÆŸœ‰î”‡PK™„©ÂV¥hžª]¬ܸ“có(·»î ÷EmUŠšÔäÅÆŒÃ®)jZ6Xm­jRŒÌÔ¢l”f|æf6V]‰[ºiµ:¼eăG¥ •:£5ÃC ç™=©)JQ÷“>%Ý,Þö[È*À-÷Ïêô«M‹¶$Êuj€ëççÓÖ³CnÿÀZ\Bƒþôã‰wK=«ÙLª^vÄ`”µ;>£HZ•(Üs¶6")n¸¤’•Žu)X>“>“sI¡có0 ­ÏIF©(Õê]h’G­úvøÚJˆÌ9q´jæÎRF“#,P¸$úÐ¥;ø ±¾foø–<öýð)x|Òÿð˜ôØ/À]ó3ıç·ïKÃæ—ÿ„Ç>òÇmb§îŠWôËÞè¡UL±üÿ¢öŒú4{$häs lža²‘Ì5²y‡¿DÁPÖÈæ1«“Ò6’9ŒjäôV†f²W8ÖÈç1²•Î5²9Ìz´Ls5ÏŒ7Æcã ñéS3HÃtb;Ò2ÝŽô°8HÄtb»Ìc)ÑŠï1°8ÈÄwÞ˜þ©1X›Qj,š”JcKΩR’ê›ofY&µñ2ÇŸ,à²eü»ïLcôqàqga…´¶l»Öï[vlK’—W‘-çXdÞŽKiçV´¶³u¢4­'¡Fd•Aäñ¹ö8íÞ¢í6»~Þ÷,*zª1žŒQKŽ©ÆV“I6ÒM‘ ÒE«%¤‹N0c‚˜šjÂçd³.Ëf²Ë»eZìt±S}©p«qc¾¸Æán”hZTÚ]$外tëp2ÁŸŒûÊÝ·v7f”Šš+Õ µL¦Ë–÷:m%êRµ(÷)ýR.*ý¼ˆúEÎá·[’Ϻ,MšÐ¨—u>LšDÓê 8²Ð„šañ™#Si6Uœ¾)ÂOŽ1}–·u­|_TÊí«[j¥ÄÄu%æ–ÒÐë‹É“ˆI8XÁŸ½VH¸gŒ€*i[È›—-ÖÖÖ,W]ŠûmÉ­Cu…)³"u ’I5$Ïß) ,—JLº ^¶óZDö[J¸•>Í6§N”â2ʉ¦XR’_ÛÚ™{nmî·¢DJ©´Ò!käkv9Y™«t·¥7“33ÒeÄÌW*%Ô'?>|—dÊá¸óάԷg“Q™ó™˜anWd£›½¶n~ÉÖ¶¤»Ñ¢¥º×ôr§J7™s‘î0²ÝãOtš&\1“,]ßV=³ì…¾/­Õz)äN¢$¥)þQ!ºÊtM*ÕŽØËN¢â?:Rµ‰¹Ü6rYöÅ‹´ªnî§Æ“_ˆª|”YkBÍ->‚xÍ,™¥µÉÆK_e%Ã<<YFͲ ûtœÔ¦Qæ7vµD†Q#&«D9.>O¥ 'ÔÉ¡+B‰j%(µ)8ÕŒÈöDí&Ò6ŠºÝ:3¬@âïH‰kBT¥jQ6Tµpî`s€ ;î öÁ/älçhÑkòXqø+iqf6Ö5›KÁ™§< ÉIJ±ÓŒpÎE£g×M©²Ù7Ez‰qµ]¨T 9“Üt!XJ[CX5iâ¥+w¬Ï˜ºHÛfȼ¬]ŸP©{@¢3&Û¦IŠ‘ ”8½ÓËf˜ÆfYi\äžráÜà€B®Ó¸:L:Lsj罫Ô%C~;S¡3)Æ e¢’óm-E¡24–²$èÁ‘¸lfþ£l®-jD›á+ÂSP¨Ð˜”MÙ#K‹7ÛBPDDdzud”|ø"ÂêÌ\é~ÆÚÅ¿líFtÜu蔸TÝî¤8Ãî8öñ‡[-Ój.ÔÔœê4ð>â+û[~—7hÕÚµ±« §>Dæœa·‘»K¯-D…“¨Aë"23Áxð3㊯@8Á@f"»OW˜¸T×d¶‰rPƒZ™dÖDµ’HŒÌÉ9<p;ÍmÍ“.„åµlm•åÒ.Q‹^bߘeÓ!ã2S=©PYà’ž%÷ƒ¯ìöûµ­;Êû¢3¾M™r·.2…­qÙ58–Ò¾ÝDHY‘‘öÜsÎX?*ÙA°v[v[”zãê½Ï»Ž·bÇy¶#GI,•¨ÞB¥¨œQ`“‚ÎsÐ97p@Œn¹vPoí–Úvåb¸Å¯l‘Ðì¨ï8Ęê$t›(Z’´“i,pxÎz erí’$m¡X³­Ö_“F³!· “u;µËNì›yd\tjAs'Ü.&BV…ÎñjÝ nö¨«¬äÄqùsX¥" å0Ü}+#mFi&ˆ‹x®$áç8ÍÕV]zçª×e,®£5éjm'’A¸³Y‘vF´¨¤îÁ³¯d5écYÐmjM2ß~-æír˜yN·áäÒêKgÐ\09@t QKzt´+Öd_c=~À™{Ò£Ö«3ÚœÙ*$Õ6ÂsF‡˜çÛ–åeÚ’“œ`̸Žk²Ú«/ë]úÅ_Ñé•vªÛÕ¶Ö•!NP„¨õ¬šBrIâdŒ™dª€!B×óè¾¾¬mßd^º¢u½É÷»þI+^®GÉ·Z7Zµêí³:[Wj0¬Í§ZööѶšÃõ¤Qo¾¨ÕFà©æÙ5›ªFñ‡PF´‘ÐÚB‹VæV8§œ¹Ç!©¥À\ï£Ûv:VZ„:+Ôª³²i’+´„TY‘KuIK„L¹¡Ò'O*&ú0FDfC¡}ÒêWþΣxØVÔ†ž—9tÄF†ÒPâºŒË %Ý$–’‚ÖGÛpBrc‹t«Bçê»ki{:§û%î›þE㨵*C1£`Ë7 Ì0•$ӹ᧓™™çqÉê$Ñ-ë’Ϧ{îÛ ëºžån¡ST¸­·Y¡Ä6¶0Z’"5“ 4çý'¨“ÃÀF©¹ß¶9µ¢´ìº] ‹žÜd)Ó¨@¯Sä:†ÍN©YŒ¸èQé4šLÒç2µ…Ù pY—.Ñ©ØÔ䦜t!ÓLre/¼F£S„ŽŒ‘¤¸‘šLúG;01* ;‘rá²³¤1X2¯qSèíõ2tFÊKRn®D7ÙI§rÒðIRÒjÕŽÀ”|ïcM²ûªC(y‹vK¦ÌøÍ’·RG§zÙ8I2V8–¢,‘áD]и§Ä²^Ôè¶§²6Eéf´S-ÎMc¡ gTdÅe³BIdFF•6XÉ`ÍÐy*½ g³®'çÓ¯Ö Ñ_xÝ(²)²NkQçvIB ¥sï€à‹·-¡E¾j”¨thoB·èP“šÓæFé ˆˆÖ¼p#2JKž !p»ëÖd¯c=À‡{Ò¤V¨ÓÝœá&$Ô¶ús%D†Ô¨åÛžùÛSœäȸŽn\…É_f—½½Ž][2¯ÊU,ªï¢\JŽåN¶‡m¡ÂAÉ'¹O’¹ÕûÊ 5pué÷•»nìnÍ)4Wªj™M—-†nÅnLÈì¬è­™%Ç &e­|x˜ñÛ½FžþÆnæ˜×I C©3>ÐúÅ3d–mŸVÙ…³PªZ”)ó¦1¼‘&žÓŽ/",©I3<q´v<°<¶>écòŽeÐ@,TàÑBªþ™bûÝ*¯é–?Ÿô^ÑŸFdŽa­“Ì6R9†¶O0÷è˜*ÙÆ5rzFÒG1\ž‘êÐ0ÌÖJçÙæ6R¹Æ¶G9V‰Žf¹ñ†øÌ|a¾=*finŒGzF[£Þ‘¶ ŽŒWyŒe:1]æ1¶ŽûÓý#!ßzc¤k‹ láPks©ÎÔaÒ¦H†Îw¶Ê”„`²y2àX.#X"5#&Ô]íÄ—$›\I>O @¹P îˆ!=Ð îˆÝ@z è{‚÷$„ !$ƒ : $@zžH@’žz‘DL; aÝ@ú °ÿ‚WæÆ„\…7aÿ6¯ÍŒÿ¹E޶åNÝ*¯é–/½ÑBªþ™cùÿEíôhöHÑÈæÙ<Ãe#˜kdó~‰‚¡­‘ÌcW'¤m$sÕÉé­ Íd®q­‘Îce+œkds˜õh˜ækŸoŒÇÆãÒ¦f‘†èÄw¤eº1é`p‘ˆèÅw˜ÆS£Þc`q‘ˆï½1Ò2÷¦1úF¸ð8³õ¶Ájæ¶-Ý—ÂßêYŽÙGÛw8ƒ“$™—M<ƳÇÒ:‡zØ4‹ E"µk*eIdæ^"#'2]¯lg”w8sc<æ9ZÌfi,ŸîÍû ÙóÑtÍ.¤¢Òœ®¯k>/u›çä{>ÓÒã_G¡Ó»¯åÇw>µ¯[õ*+QšÖ)”8JJU„)HJɵ‘½ mf’3Á8œàÏíe±Lr¸‰5§*|&Õ)öVá$ä’8¥”ô™­ZSÉš¹’bï³;Âד*ºÖÒSÊX©JD¦Ü6MdÛ®š˜yiIàÒÓêt¸pSÇ"?Ò6Ñâ”-Ûöd¼Å ¨ëQXD‰ DG–ZZu!Å™j•$ÉD£àeÄ‚•n\5X‹—K¡U'ÆF½oFˆãˆN‚I¯*I’ZLû„¢Ï9›G¾¨sjìVgÕ:’šeÈõY0w./–E6ÙCQh#IRÉ·ÛšS¥ÓãÎGHU¨û8£R)õ9 M\™=ÖÚRÑ£S1Ëš‹†¢6ÞÆ%ƒæÉf`Â¸í¹”©Jm„¿5†©Ðg>ú2K%&;O(Ë$DFé ŒÌ²eÑœ èÛDº¨õë^.Ÿ £.œNY& â °Ë†¼—éR”™á“Q§ÅÎr&-µ¼EÚR×"ƒOˆñ=T«Gå*Ž¢$&;j34œ3Ç$Ü32"JL'Ç Ù\¦Sˆ‡tÛÒbG޹&¡×ɨˆJЃÖJhœ<©Ô$´!D£W àñ¾‹qAw[wJg2„?BêkúI.®ˆ†¨ZÔ×9‘!Ò,aDfE“#"ÝE¼)M.;;Æ=f´˜2ÙMrT7äFNõlL¼‡[Þ<„¥·Ï¶mD•:œ’E[‘%^NË«MPδÕV* ±ß“Æ]tùsL Öú›Ëe§AäœÐfddDf(†F\ Œ‡fkh”Ø÷D(nU#H¦»OKI,0û0]}éµ¢1i$²Flê4´K#'‚IŸo´)TÉ·„ùt‰.Ɉé¡[×âõ¹»NðÒnû¡£^­:ûm:sÇ"bÝ÷jÑM¨¹¹ÑO–­üw$³†T{Æ[×­Äðâ„îÜÊ‹hVyŒ{½@®³En¶õ¤Ý-ÓÒÜÕÅY0³î†ZOé»z³l•‘6myfS-šµ àœgT·^}3TÒ‰II |©)É«$eİf¢ñ­W(Söz¤M©Á•Z("Eä¬ÊfJI¥6FÜ‚3äëi(A’M9Y©(3ÇÄî <ê5bŸ©ô©Ñ#ÍN¸Ž½hCéáÅe…âYçz½¡6‡E¤Ôn§ÒÕ>¡"+‘ß„¤:Óm":÷¤•uj)‚à]§?çÚ ºõrX†ÕqrD¬È‡‰§)(kV[uO¸l–­8d´« >Ô’I{ÖU2]¯oÛÔ멪춪õÜ}hu–ÛD‚ŠHÊžJH²m¸j>b=\q…I»§uQÝ \3i¼‡ù3šPò y³â‡ýŠI¥Eý†3íÛJ©_·ª*Di“åD›)B‹O8á<Ü…šû\™y>1ƒÎ®rÇÚLØ“oGôɉ˜ð}<Ï&; °Nö+w«öî[nÎët¶fºÄùujt†ÐDki–åë=Eõ[Œž ó“#.cÄï°50hu©ÌÌz ¡)¨)Õ-lÆZÓ»«2.Ô¸>9‡õ]“Fzµ‹Rz˜Á™;1¸«S ŸqK"Ò_´Çd¶®û­¡Ô+Óª‘Î?^2j ´Î47I¥Øí2iNðÈ•¯|^ôZUƒIÔ(Uʶ}È«u8.?Ÿ.<[fSsØqÃqIJ\AîÊ”¼¯yÇ ZH¸ˆÄùsžèÚI·.´²ªÉ Õ§«F%9IJzÒJGneŽÙ*#.¿F‡q.l§ê”Ç}¤º‚}¦”J25% [DD­&xI‘È—õ°‹‚¹*;ÔTîîɵ˜R*1§)/2餛ݢ:ÐF¢$hñLœ2Ê{b3“@æV•£U¸•-f³McîN(ª[$¶"¸ù4kà’R·zyòZ³ƒæ:èê6ÅAfÛ„¹WÓÞnÕéK§nQÊvB$©µ‘¥&&o6“Ôddm'†8—.›l‚öÎË.¸õ›Vv—P¤F¸¥³2_‚éU¹!l’%’Ky„„ŒñA¤òYáV™A®Â•,Ú-J3óR•Eiè«Bß%h#,¨Œù±œ‹µ·Z G©ìƳ&´Ã'oËaŠŒU0ñºÛi¨?$ß#$‚C„X%kÏ2L¸‰²ï*m>-¶å^AË“§W\’y.«v‰Q#´Û¦i4¨Èœ'Vd…ËI™`ÌŒâò$ UiÕ Lç U`J-¬o’Ê›q,–R¢#.kH´kuŠKU \tË'–“eµ{¢ 3(yÅžpXо334™c8ÎnÓj°êu:kP¤¹=1PtÆ¥%’"qÅàŽRÕkç<pIFv •ß°lûVjTFº™Õb-„i3#Œj%ÉãŒq&A‘žLœ>rÎ%·k¢ ?gÕÉÕ ¤îÂ7i”dUß3qDJmL¶é6ž×‹¸p‹O6R¬‘dÿªMƒ&¥ŒãWª…i¥;N¦:§Ó!ò'œd’JÝn‰J[K"#p³Ã›"ú«úÅ£Ýuz”FçÕcH®ÆTdG|ãBŠÖ„o7Œ«ZÖdh-*÷>&žÔ³~R¨S-zM9øsèÐbȇ2Ri¨LÆÐ¹ÒÔN2úÛ'¢eÆÜI%DDgƒ,ê![È’­PÙírªk½EQ¡®´ËˆqF‚iU)M¨ôðt›Iv¼ÙRxàò=ßÙêùm· ×oÔd\o´Ô0™iíVúØ'Vn0’J ÆÔ“.*é$™q^Vªjªtš¿)…Ü&iÒ%Ìê2`¸Ñ$ÒJJ\VžØÈ‹,§Ž#_m±G¸¶eQMãJ¨5o¿ªE0”„•Aù*t·Œ#R $°]¶¬á&\CUE_\Ùð›(«~ Išs„Ná+S¨}ĺ•wZ#­F³2ài>lãSpÑØ¥n5z“WCºˆÕNûš“Œ’‰Ä!]%ƒ"4ŸàÇG¶¯«q«;5Y/&°ä–©ÓRÛ*R• 0§FL‚?zkBf%rFdÒ´Ê¡x9BbÓ¡Ñ©Õ*]VlI3~l( cS.;¦ÜZÛBÜRT—¶Õ¤–DJÇ”Ý÷aYt:uyu²jráÍb™‘Ü4ºÛۈ­fâM¼“X#$¯Š¸‘c޲›G«ÔãÊ‘M¥ÎšÌ4o%9:ÜKÿ„³I$¸î ®ÎgÁ§\ûÊ”’‹D Дù¡K&ŽDGXJÌ’F£I)Â3Áàbç³›¦…oÑÓNzUr©u§g±.cÖÜ”BM¤°¦õ¹¨ô¾’#'0fžØŽ[hѺeIÄ4¶éòÖ—XrCf–Td¶‘«[…ÊS¡yW1i<óþÝ£ÕÚ£µYv—9ºcË6Ú˜¨ë&²ÎRKÆ“>À \h·=&6ɪ4ÇÞYWЧ"ANì̹,…2·OV0ZM…'y>P®|pØÜwunÏŽ,#£3-úLsÌ›3U31Í£5dÜä©I›jV¤§Wnde•)B1>@¨^T:uiTšœº„*¬˜ÚåCLg‰0i4%Ç “<’¹”\Wúžä•M¨Y–ÂØ©3Ëi‘§È‚¦Ü'xÊ’ù:JÓ»4aä§µgõqÄV:.'bÿŽ*×n |¤ÓZ›S~cOqÖµ´Ù²DÒZÔ•¾„™é"É+ ²xP-4Í—QÜÜ”R¥ÓɽõY|¡1N{Ô%&ÖôÔg¨±»ýE1dXªÕc=§U«Ô{åVÙV›9ț簓yIqqÝ62â4«Qi>(IãJ Ç@«ÆzŒýÅ3tÁ’õrTt¸ê““q²mKQrRœ©³ÔlöÄZ….É+·Í«Ô:Фéì0ÑH6uJqqâe2ztjY‘m¨ÈÈôãˆÑD¢«Z¡XfQ›ôù "DSoM9’'IYã…‘$Ëiây'º „÷@'º Ot@ è' @ îÜ’$„’€ è@$@‘ èbz !H@z è````D  0î‡tè.Ãþm_›þr݇üÚ¿63ü"ä9:Ø •8tPª¿¦X¾÷E «úeçý´gÑ£Ù#G#˜kdó ”Ža­“Ì=ú& †¶G1\ž‘´‘ÌcW'¤z´ 35’¹Æ¶G9”®q­‘ÎcÕ¢c™®|a¾3oJ™šF£Þ‘–èÄw¤mÂF#£ÞcNŒWyŒmÆF#¾ôÆ÷ft×%àÕ&TZ„¶ÕcåÉ2[1]y  Í Á©M¥>õ\ü #Dï½1›kV:‡Tzo'åÈ!è×§¢3¬jÎÞï5c§Ég%©pÜqeÕ62_»¨4žµê¶‹³¤nîzBÙ¨¹¼m)aÄVÖœšð£Î0¢íxÍfìRç̪S*Tx“w”‰òYã%È®1 ÷¤hZRyZ’ZTX.ÉçgµÊuµwSî 2]K©Ò•–&&>^mÄ­&µne©‘¤ˆŒóï‹f‹]¥ÑnåU)Ô™‡K\w¢®‰É[ÆÓÑÔË¥¾KI-FN,Ò{¾2JÇŸKZͨ\0“&<Ú|S~AĂԗ•ÍI%MiI–¬)TiNV’ÎLBlù)µcܪԸh–Ó¯CŒú'd!µ)*4™ Û#Ô…%KJòYÝZ;FzÚ¦J¤À+‚58ç92#pk«ˆ´š’”è}M ·ÉÒÚ9‰³É‘§QÄ·/†è¶„Ú#Pj;.+ñœ#ª+‘,œ#-âã Ä‘–•’DiIà̸¿5³-”ZSõ7_‰Éƒa8KV'Õ¥ §µâ²2s$x/r^ ðYȹ¬§mÙÍÁ©ÜTJ))1”›æ¨J<åK-×n’ÁåMo ‡ ™–vw…kFËmK_ éÞKqßK¦–kTvÜ4™‘-;Ù Ò|S½"2#É kºønµiÇ·£Á¨4ËRS$ŽmQS ƒJÜrRÚlõdÒf³3J8ðä{¦Ãê¦Pè šæSãËtòò 1*Rujq¤4d¥­8Ô¢B{b%p8¡ì±Z¸:“N«Ñ]K:,ÃuÔ±) ˆÈJ ÛÔJ7–HÂÒœp?†/ÄĹ(w%>*-R@–âg™%öÑ1RmiA)•îˆò­J파±ŒÒ›µG!^Ep.^¦I„•R´¹Oá‰ìLâê‘ÌfÉ ‰)I­X3ΨüV$£ÝY6ýiÊ\§£¾´6ÓÉv:M¸Û­¥Ä)&dGƒBÒ|H¹Æ°mnªÇW*lÍäüŸw=õg“ÆiYÁ{íÞ¬tg‰H(êAÊŒÁ¶¦½F~ì¥j' ˜‹O9žòÒ³(Õ8”(3 ®º­Â…9øÊAG†“¨­É4¬”úM&d¤i%'ßàj,Úý¹G¢Ö Õ¨UZƒµXåÇbÕ[Œ”2O2ñ%QÜíõ²]±ž4¨ËI“nÞ±)i+“DTºµyÔ™e/vÛ:–§¼oAï48µ-8R8Ÿ£¿p"…Gµ«t‰¬Äf¸Ìø4·g?=çÚä©[hÕ»6‰’J^J·†f¥'µã‚õ«ÙÐ)[1MnT™=_å± Ø„iÝ3K2֢ƭᓾ|O Ÿ«¶×vÆm³mV!)¶‰O¹²ÚZ—(’dOºƒŒjQŸ÷„I,‘šŽ+»J®W­zµ±–ûõ)±¥91ª\V÷$ºFFm´•)J7ÛêÉT’àâˆ?&¿fTh•û©TɤÖítÚ‹¨S®hCÂyÆÖ¥$­ QôpâFY!º²­ÈTý¨[TJÜ*MÇJ¯?¦žCÒÒÙyòlÝlÒ¦–KI¥Äáe‚2<¤ðCUE¾*݈¯Ü¯Ï¹V˜ ©g­K6žaÖ´“ŠÔdE¾R°_ÛÍœƒ·ŠXºíÊÅ"˜qbÛ›ŽA÷÷Ê2mõ>{Å’S¨ÔâÖg„§à‹€;`Ú¶Ëõæ¥H::—*šmÉS–´·¼pÕ»l´%G©Z|Ø"I™™ ¨ÖMCDÕUj4Ê!Dšå?ü=Õ–öK~ý¤èJ¸§)Ê•„–¤åE‘ïL¹mØkªS×mM‘@œüyH†º¡Í<ÊVI3x™Â’{×HÓ  .9-Gèõ鬉éºh‹©rš¬Š³'g&6ŸNô•Ú/SjÐßҮׂ‹!øýU-]B¯E& Æ:*äΓ!ÅézG.–Óm ¸åÅ!¤‘%$E„©C_Z³äÒ(qê3jÔ´H~32ÑOÔéH6]$šFh&ÕÁI3JVj"3É2¯gfYtëN\#vÚi&ÿ¼’rx¤#µíOnÔž:’žr=&Ÿg¯†û½j± E!¶Pç(ª)è­kJ÷Œ°h÷'iÁ«Y–¢"">Ä X €@ºÑ-*tÛ‹gtç^––®mÏ-4©:›×P~1îû^£I>:»c>ŽJ[võMfƒ&] éukwü•%·L§­ôoZݨÜÒãŠ>ÕhÉäVWî¾µhI¤P˜¨Í«RÑ!øÌËE?S¥ Ùt’hY ›VII3JVj"3É5=ŸV¡¹;R N˜äö©¯ÄŒâÈ’Ü#42u•jj"4(ŒÈÈ{={·ØùëUˆ5) ²‡9EQOEhÛZW¼eƒG¹8£N Z̰¥ðÙÜ{X«ÕçS*Šr°ª„:›53LÊò!¥öÌÌ·1̈šI™™ã*2. 4–HãñWyZð(6McéÕ9rª•—×ÚÓq4£ JpiSŽñ$ñ%äËI=‹Gb½vÓ©rÝq˜n»ª[ãSl n¬³Ã$„¨ø÷uÛrR*” m‹@v“ÉrýÖw(SŠ},$Ë:‚Nàˆ¿°ËeB4F$Kv±XSí¡ÆÚ70•©M­*K„m›‰ÒeŽß=9W°6µ«RnÔ*#¥*4)¬7.+ÝžbJ½ÁÌcJo<Ü\Nú1éVLš•RM.=r†SQ5pb0© ×9äž0Ñ£2Ò§4ŒðG’2-å'jr¡]m\nÑ¢½/©(€úÐÃn8Ñ’£¼”!”n͸æH"ǹs–xFË6œ»4vÑOžòØ©”ãTJ¢¢’ÂÙ|’…¨"AšK$DkVIDxø¬I[*JÀvàje*N'±ö“Ê \E-2 <¤™RM)FdkQiG½Êˆò®)olæÝ«E£Ä§Í\ù°d¸Ã+”¥–a©+Y8µ//8g ’ž<Å€¦WíÈöërE ªôÙ’”¹ˆª¶†Òó)} 4qÌôH=IוK O0ÁMn–9[²éï8üy®Ìƒ)¹$„¶§RÊKˆ4ð,#R0y>%ÀNûY-§.ëe3jšÍ.U~6¤Ô+VåO9ú%,‰$z’—0¶”¤ö§… -B‹Ö¬Š}RJh—->Bl’‡ŸäêuD¶Öi6œÔhWjzO)25ñ¹ÏÛ2¤¿Lp¨Ó¨5ø5¤Æz®§hãï2Äv÷d–Vð°E¨ËO_ Q®šü•2ŸI¤ÒWL ×äîÜ•¿RŸ{vN+V”á8i²$à̉ŒÚkgäÇ7Ô…)&”ÌuVxž…;‚àZ•ž}<ú¡&«ö­š”X$n.Tvªé75jM­L™6„ŸVfFdjæ2ϬÞPÚ³Wí"¥U*³±eML‚SûóxÉ*KhÒŒàˆŒŒËÛxNò {6œ©«œTZ” Â"?‚\Ry;ã|ô¤Ð—B°KÂQ'Š‹#ÈÓÕá:«.ž© H8¯­“yƒ3mÃJŒµ$̈Í'Œ–H¸t öÍëÔÚ ^温m7œÝ,ÛuA·¤•) `Ñ„ Ü4<Ú\É# JH”y25sq)»ƒ°X{)¤\1¬iÏT'7­¬«jB‘˜º¥»6ï)á¼SzxêâF|Ü ‹>˨÷°¹Ôå­¸ÌË‘,äÇŽñ¤šudiÑ¥ZÑÀ”fZÓ’,ŒÊù.•P´e‡ù5½¸7ã"Q¥·Sž–DE„àÞ4–IXÆzpQR½#Ë·†Š2šªÌ§Å¦Lœrµ6ähæÙ¶IkIi_¸2F­FG£LGâ¹">Ï+O\ShI•O)0î(öóŠ7 ä¼·•‘éÎì…äñž)íOŽ1§Yå TÇd\´2§Ï[ìòôî2ì¥&ãk$´k5¶ø¡*Ië##ÆL¬ÊÚ…=5¤Ö"ÚËjc×4+Šz•QÔO<Á¼¥6‚Ý–í 7”eFžec·Qc Hƒ2Îd½>\)5$0å6°ý:¨igYFCM8á¼]±j#KðíGÏdž’ͧC{ªг;êe.9¸ãf£I>ò»VYÉl®'ƒ#Ð…™sî‘xÕi1.°Z†Ó5öM©(&pM¨Ï- Z:KJÔC Mc]¯ƒ6á¦ä.L—5ää:e¥e‚Á!¸ñRÏ=¶ w‚å|ÚÔg!?Q¦TÌê}»GŸ*žˆ$†´;#jY8Jâá¸òV¢ÑÇYž£<ö¬Yôj=¡X¦U©5x×-:9ç y÷SIÔ¡I5­Æõ$³„‘¨Ú÷§„æ£*í¨Éê–¶bTi)/a*íYÉ´)=·Ÿ%o&y.*ÁK‰[L­<–œj›H‹15Xµ‡¦4Ê÷²e°N\sRÍ'âDI"3âDYVkiXÝÕg·e9F«TéõYÔÙÊ} ‰S‚å1å­¤£9N¥·—[2RTF¢%jeÃÿ§Ó£R(s›£3B©ÎC®¿NeçV„1ÚnêRÐkË©¨òIJ‹¢ç´Gù}òµ­¾MI™&k0”Ëëe×_CiQ¹©ÓZðm!E•p>S„––𸛹&òåP©ôéKZÜôgå:¹ V8¬ßyÎ%ƒæÇ9ç<1*ýàѸB{¢OtÙ3gôG§MaúÑ-Ú|˜§á).Tb¹-–ïn£mDh{y–Ò’F4«9LZ%^o.'%…@¡SZqæÞ˜˜ÑÖe0ЭIK„µ¨‰âhF”Ÿ ’o€/ɵ¨p’u»¾Ì‹jC‹1ÈhbSÓV̳r$¥ÇqÂJÔñ¤že²5µ„¨”x.ÔÆº‹G£=´«U¹Ý­P·«Ó¦¤é²ªƒQ¾Ù:²7]KÈy)q%…v¸ROIç"§&òZù,xöí %2;ªyTæÚuL>â’h58kqN’LȰ²Ó“4é3È̦m ú}n•PlPÅÓ‘N‰$à m¬ßÉ=¼ZýÉÛ­IÁcb¸dI‹³v)sæÕ)•*¨ó ÕšÜRÉn©I3Q‘öŠI¡&’#,ž]3iS Ìšÿ[tÑ" 2ÊŠKe :ue¶VÛÉZIzQš”jÉäø«<í"M‡Sè _R-ª5¡¼ãŽ£Zž©=»Š[¤èBÛRS¥·7¥½Y©:RFeÀÌ÷ìÛQ†¢3K*=qúÔ‰GKn£6K/¾Â$ºÃI`™"B]VèÏSǤÍI"IàÅN™±O¦T©‘ì{d¡ÔœJßoy9'¥)ID´É%›z‹^•(ËQç¡$œz]÷*šl¹ƒE'á:·)O­)tÝK5’Z3s $©F¤ïIÃ#3<äÂÒò¯N¶ªv¶îÒ‡kH–Å&<‰Xv¢š’Û\µéuEXY;Á®Ó&EÃ%¾©lö†ºùÙôƨϿ§Ÿ>k¤*s¹ °§–…G6ÍKÁ%R h%HóÏcÝÎE¤.$ Ç"7jL´áH[JF…– fÙ“”©IA(ÈÏ'ÄÆL U–Ó®ELR’¶œ™SŒÛ…&R›q.$שf‚=â³Ð”êRHÏ!†]Àȹ¡Ðªc×"ˆÅâTZŠM³1oï™y/šá-j4:“Œ¼ãI-&I"Á X®k²En AE&•JŒ©'-öà6´“ï™cx­kV0F¬%:RZYÑxÜ‚õ³ ,2µ1ÚM:§6Ç&ªOT(d…šÉjS¤ãe¼É ’“ZrF³ÁéÀµË³i1$N*5–«‰æê blUJ|“Lk“°³ZT…$÷jqÇÉ/9©ZIžudù½µq¹F‡2ÔªuZŸ5m¸ôIÉsA¸Þ²BÉM­ JˆœYpV ”y#"¿$.¤íNU»oK›­µEuèΓm¡¶Ð„’É*BRÚ’á,¸iæ;‚ÅI ÛìÞµK6e¸Ô˜T©²YªW\˜ò]ŒÃn©ä’TM' $á*Jõ«^øˆ²úÑ¢u¡Ê:…“u½Õ¨uI}Så;_Ñ5þ‡{ÚêÝcwÛ눛Ap­²¡ÔmjUµJ\¹Érb”ò”g­ÓfB fY2NKgLÌüüœtí×Q¨åPêS:©ºs”òmÖçG¿Ýþ‹ÜõhÕ§§¤-"K•Vض.«‘š}’Å®š:ëL°©4çj<µˆ¯>L¶§Q-Z ²ãz´ž¤²Dx= öíWíÞºµ I¸Ç ª“Š)M<܃lÝ3R”‡¨Æj$èÔ• $d¡©]ó1¨ëEG¡HyÆÜ‘*žÓ‰qãmiqzÖ¤ ‰hB´¶”–R\8Êoh’©Â–ݯm%ˆó9Ø\Ó.A¤ÒN:“s=®£4¥&”™ö¸3#Yƒ~åÝM%7BÚb¸´·ª/ÐÚ”þéÆÍøÌÆqZ–n –§Ö£N¼š[I‘‘,ŒTö‰KƒM*e>+Pš©Àå*ŠÌûL¸‡ÞadÛ†¥j`Ô“Ô® .'Î2e_®=[vªÝµEeÙhuºŠ Ù& ‡ ŒÉÓyõ«¤”FƒI‘ñÏÆŠå­È®ÍjCÑãDi†4XÉ4´ÃIÎFjç5šŒÌÍFfg‘1LƒTà‘D2é2˜…PjTšlJ›HΨ²”ê[s$dY6–…ð3Ï,ä²GÐ)Ô{~/².M¦ý$ú+×2©(Œûï–ᓘM’¦ÜJiG5‹ŽLŒÇ?¤ÊbA©Ri±*m#:¢ÊS©mÌ‘‘dÚZÀÏ<\H³’ɯ² û#uõÖ¥¿Õ.QË7Z¥îy^û{Ê1¿Õ¯W :·xýN‘Y& ®Ìmš ÇhÔ™v Ÿ­Ým‡¿I’¢äédÓîF£w^´¹•1»#P ×)ÏR*òi’ ÍèË6ÜËN6z‹œ´¸”¨¿÷ˆûÆŸr®™uz—H§BI!mòË¡mN'+qNaIR²zòF®X,b\õ©WiÚ¬¶ØiÇÛim’2Chm´¶„'Q™à„–LÌÏ33â ;ƒ:ͧC{ªг;êe.9¸ãf£I>ò»VYÉl®'ƒ#Ð…™s ðÛI¬kµâPcÆÜ4Ûë“%Íy9™iA™`°HG.É9Ã['˜l¤s lžaïÑ0T5²9Œjäô¤Žc¹=#Õ a™¬•Î5²9Ìl¥slŽs­Ísã ñ˜øÃ|zTÌÒ0ÝŽôŒ·F#½#l1®óÊtb»Ìcl21÷¦<•-Ä¡ 5)FDDE“3îw}ék~¨ýµ­¦‘{ÆIäš’•‘v«ÁdÒxQtd‹$e’=qàqeÙú ¹S)3ÙqqíZYɪ*܉rÖûM-²uIQP·Œ™(ˆšZˆ»c:Í¥D®\õŒ§žêd ]; 9T‰Ou{êsF•)Ù甡¥ ‹*3,`²eÊh•Ê¢º…>BRûˆSnïšCÈu*÷ÉZ%%d}Å–H lÎú¹×Z•Wz{2%Ke¦dˆL:Ó©i CzšZ ³4¥ ÁéÉc9É™ˆqd‡GžýOGeÅ¢UŸf¡&+ˆ6Ý„†]q´x2ʹ;¤Jʈõ·‚î×ìÈÑ£C©\Õí?œÙ5—JCòÝ%I4ŸH–á‘ð=Þß ·5v*+ b¢â ¶Ù·QíR{ôšÉgœ—س’Áó—1™ yui2(phÚj,7t‰²27s–³3âzR„–0DI.33›0t+ö•B©B›)®¨¢³Jµ¨s\ZAÇq Ù#N¢Qo­Z±ÀËO1že^Ü¢A¶kv-5—¥G¼)”Ù«Â9%¹È5°‚$c*5‘!J<á=·Ýûвÿ,ÞÌÕË`1N‘îH-qØÜî‘ÍÃO'g‰`ÏO<žvRïû¶TXÑ«a1¥15µ·¦Ü9 ¥ImÕ8”’–²%jQ™Ÿ çŠáv$Ý^vô+9ª%Á#"Kò£ªÚ„j’ã)k¶R£áïé=Ú‹)4öÚˆË>{Oíû~¦ÃÔIòd¹)·êx\’+š7ZZÝhlÉÄk33ݧ$â9ñ‘§~]€ëÓc':ó±[fvšmO%)wÜЂA’É É±ç_q\Ujÿ'MEæ7Q‰Dâµ–µ-´” ŒðY2,ž <ÂR{®A©p„÷Džè¦í³*nË',÷›¨Ò*ôé2jÒéZÐâÜnNñ´©ÄW (È2<¡K>9%$qa–ÕFcT‰”=ˆR_jKÍé.ÙÆ’âP¬ã%‚yÂÁWà±Y&ÁÖér™žý«I¯Q­ç'KnM^CQ¢ELV ;œœÝ&Pm§IÈZLÏR43Àÿ¹;bN‰T©õ |Š„YQ¬Q­¨ÏÆC¨~"É'BYFñ-ïHÖhIâB1«c—Í\+”®4ÏRj„e‡’„‘iѧI:;]8Ó§†1Àg¹~ÜÎKjB¤ÀÒËKi“KŒQI+4©DqɽÑäÒ“34äÍ)î®IzM¢S£U/JÅBœûR‘éµo0i$:rP¥¡’q*ˆ¤™(Íæ3#a`Ät‰½N¨53’D–mäÉ©Mï322#4ó óƒá’,‘–Hñ]"£2“Pj|I© gJ Y`ÈÒdiQ(ŒŒÈÈÈÈÈÌt éuýLµmÏ¡Óí›’±Q\¨¥&ŸFIEqi6M ¦2›BMä&¦ˆ/'™j,Z­JŸí‹9ÙÐ箫T¦&Ld¤ÝR‰¦Ûˆ"4›HQ¡³-i3I’LÌô16‘wD¨&li°R#; ¦•£¡§ ÂK½Ù´‘’reÀÏ:/šò%¹!¢#x„!ÆQB„–¤ÔiQ²MnÍe­X^XÕF\ÆUNlªl:sïê‰ _'l’DH5«+>“32.'“ÁsX«[FºëÓŸ¥¤›F‰lÑa³%³lÒmèy¶’âtéI•Ç7./¸-¤±OvÌzc­Š«ÌVèTↈ­nžéÒÐá¬ÒF•axÝ/·<Ž^7×Ý^¯ÄLJŒ˜Ü.ïͨЙŒ—Æ7‹&kÁ™jVO‰ñâcB&*È‚ã²Ç’ºV˜ô:|˜Ò¨µ'WÊ`²òж`Hqµ6µ¤ÔÑ’È(4çœà†ÆÄ¸-Ø–³4‰/ƧUUPyÕË‘kCª6ãKC)m*[Æn6HR3$%_¤Î ÅbÔºjöò¤=.HlÚqRi±åƒJ¤¤ÞB´’’µ%Dœj#Á䇽.ô¯Óú¡9Oo}%R°ª\e“.«S$¦Ì™>ú=8Ác˜„8¶ Ô6`8ÌMš°ô }̤R%öÌ9-Ê–r^"2š¬¾ƒ4©¶ÉDžÔÐFF\ãÞ›bM¦ìr¹%ûF\És¨UÑTU=kDVÊ\m ´îœ…<놓÷†DxÒ¡@…|\Ðáª3ÚÉï1!q\¤o ÍzR ÔdÔ£=*.*>èÓA¨Ì…|h¯nÚ¨G(Ò“¤xÙ:‡I92áÛ´ƒÉ`øc˜ÌŽ0²N†ÜyuûT£Ô(48Rë1Ø qä8êžJT½dDµ³§Z5:¥ejN ô«]§PUgZ¶Ô–¬³aÚ¤ø+™R¥-¾¨â2óšÈI7BšJ¸iF0xY -Í~Üw#µY:<ƒuBžEO’Q$N¡¢ZH‰$\\8spºmÅX§1 ˆ’É Aüˆè6¢JÞBw$¢=D¤6„šU’Á'–¶Í2ÙzšÅÍT‘oÏ8P&H\ú]+w ×üF›hâég[­”…/ B­m’ŒÈ”cm-”•F›PaÈOD¨À)1žMDq뙸ÃfhBÉm­'§’Høç'âíós9>4ÎY³ŒÚÚj;0n1!~ý&ÂPM+œ¤ó‚ÎpCW_­T«³ŠmMôºê[KHKm!¦ÛBy„ ‰(Iqà’"â}Ñ1‹Lƒ\à‘D,û/§Sjw¤V+¾BÓ¥¼NjТb;U§¶4™¶Dd\pgŽ#¡S£RêDwK·Ü€˜|»y˜A}§"‘œˆÍkC©ÒúPƒ"qF§Ë$zp\~™>e2 ÅBë)…ëmÄó¤ÿí/ì>7Ê¿nž^Ô´ÍŒÞé•ÇLv©ñÑÛY‘­'(&”J2IžRy4‘Ÿ1 J-°uÒ¦ÚÕ*[4žA@]J¥Luî©E†ÃQ§¬ÒâPë)V—b¥ƒiF£KhJ”…ï7iâ8uÓIr‡^“Kpž#dÓƒu(#ZT’RUÚ)i2QT¢2223ÈËzï¸]¸#×U963[–4Fi-6Ñ’’m“$’ld¥£N“Ô¬‘äÆº·TZ©»R©?¾’î’R‰ A%$”¥)IR’IHˆˆˆˆ‹‹L›.4hÐêW5B;OƧ6MGeäü·IDÒM'ÁD’%¸d|wƒ÷ÂÕVÙiS©Sn×_w­^D¹PœÞ—(Q­¦Ž:WÚéâãéIà²{—¸' Ui2(p¨Új,7t‰²27s–³3âzR„–0DI.33Ê•v\R­ÆíÙGœ¥4–ˆæIÁjuh,ã'…>éóô—üâZw†þ´è”j}W©NÔNU®ŠDõIq nKŠCǽh’’4$•ÂÒf®“Ï@´Ó(?k«JÜUY3¡³[§òšœ¦I‡P% Ìð”îô¨“Û™eG£Ú¿vWëÐX…Uœ—ÙeD²$°Ûjqd’I-Å!$n¯IcRÍGŽ‘àåÅYráŸp.fjUUÊžÝ#Ý9J‡»\i-IqeÀ‹áŒŒ.À÷½é”ú-Âý¥¸¨>á%ÙIÞ¾“2ZŒ¥àD¬™‘dñ%£u*ŒÊ“Œ¹5í󌲆³I´ °’3"ʰX"3Éàˆ¹ˆˆb H $@$úР»ø!µ~lgøEÈSvðCjüØÏð‹äXë`.TàÑBªþ™bûÝ*¯é–?Ÿô^ÑŸFdŽa­“Ì6R9†¶O0÷è˜*ÙÆ5rzFÒG1\ž‘êÐ0ÌÖJçÙæ6R¹Æ¶G9V‰Žf¹ñ†øÌ|a¾=*finŒGzF[£Þ‘¶ ŽŒWyŒe:1]æ1¶ŽûÓý#!ßzc¤k‹ Iˆ “è$úžè‚Ý@žè=Ñ@' @ž'¸ Op@H@’H:ƒ ‘D' A‰è`$„ ! è' @€ $@$úР»ø!µ~lgøEÈSvðCjüØÏð‹äXë`.TàÑBªþ™bûÝ*¯é–?Ÿô^ÑŸFdŽa­“Ì6R9†¶O0÷è˜*ÙÆ5rzFÒG1\ž‘êÐ0ÌÖJçÙæ6R¹Æ¶G9V‰Žf¹ñ†øÌ|a¾=*finŒGzF[£Þ‘¶ ŽŒWyŒe:1]æ1¶ŽûÓý#!ßzc¤k‹ Iˆ “è$úžè‚Ý@žè=Ñ@' @ž'¸ Op@H@’H:ƒ ‘D' A‰è`$„ ! è' @€ $@$úР»ø!µ~lgøEÈSvðCjüØÏð‹äXë`.TàÑBªþ™bûÝ*¯é–?Ÿô^ÑŸFdŽa­“Ì6R9†¶O0÷è˜*ÙÆ5rzFÒG1\ž‘êÐ0ÌÖJçÙæ6R¹Æ¶G9V‰Žf¹ñ†øÌ|a¾=*finŒGzF[£Þ‘¶ ŽŒWyŒe:1]æ1¶ŽûÓý#!ßzc¤k‹ Iˆ “è$úžè‚Ý@žè=Ñ@' @ž'¸ Op@H@’H:ƒ ‘D' A‰è`$„ ! è' @€ $@$úР»ø!µ~lgøEÈSvðCjüØÏð‹äXë`.TàÑBªþ™bûÝ*¯é–?Ÿô^ÑŸFdŽa­“Ì6R9†¶O0÷è˜*ÙÆ5rzFÒG1\ž‘êÐ0ÌÖJçÙæ6R¹Æ¶G9V‰Žf¹ñ†øÌ|a¾=*finŒGzF[£Þ‘¶ ŽŒWyŒe:1]æ1¶ŽûÓý#!ßzc¤k‹ Iˆ “è$úžè‚Ý@¦Îr›$ëàÓi iˆ²4R%Sy$øzQë'‰n)¬jQ)yQ%]©tt§O÷””°œÏº tZÕ"Ý©]Q!SèÕ(¬·K‡*ZÓ>9 ›T6”Ff¶ÛCfkZ N)FFj5iÉ’G±P-Ê,Z˳©ò'0ý©ÑÐÍR;ªþ†I} ­ VSïÒE„šÒe•e=6ww¿rýŠëV㚺µoÐ$»L³Si©ÖìÊŠR©hYµ!ŽSŒ™4Z›>OïpFZý÷>* »@ªp6[éŽËŽÈjK+m·i%¶ã8'$™šIfj%µp¦¦V¹mb½Šˆ õ6-ËJEZK3\‘«‡Ü„¥.°ëo(ÒDh3JÈÙନ»o{ÃŽö}¿kR—ròôV^M¾Tæ÷2›IºÊ·äYËg…–àÌϘóŒ'œ#Iµ¾ÿ@æ–âˆåS·¨–ûóδu¬³X•Le1C*÷ :œQ©*#Îñ8Ig¶âXz©J¶e¾ûˆy%Ä;o%£A'&DFƒÔj2ÔŸ{Ìb©eĉ:¥2<´:fT¹¯2¤0—Œã„j%!Z‹2á¤ÈÌ”J#!“VWâN>&Œá›zÛ‘J§EUn¡:…&¢JT†ÔÒŽr57df•”sÁd9.+{1¦ ªõc3)Êu<ä0ËÈÖ…8n´ÞT“à¢I8¥`øv¼rY SM}ùŒhÐw %Ìmη)ÅD‹d‡äÇx£0–Pâ[&”—4$‰$g½R{R"=Ü‹¨Ð+¶ý¸ÅEê‹•4[2ÞŒöø´"3Ó”(ŒJ#Kf‚Á§IyËJ¥vÒl9Ù\ç„ ] [´%Ô©vì…TŽ­Sf:Û”‡PQÚ[èJÛI¶i5(ˆ–’Rµ–8ð-«“ûÎZýùãŽæ¡@¶j÷˜…O•OD:$)Ï“•Hí!ä®É9Ã['˜l¤s lžaïÑ0T5²9Œjäô¤Žc¹=#Õ a™¬•Î5²9Ìl¥slŽs­Ísã ñ˜øÃ|zTÌÒ0ÝŽôŒ·F#½#l1®óÊtb»Ìcl21÷¦1úFC¾ôÆ?H× @“,A'Ð Iô!=Ñ'º€‚uåqNaöåMikÙ¶ü‚ˆÊd:“,Vñ œQp<¨óÒ+âÛhG¢=HQ¹‘2¬©*I±T˜äfÉ)ÒhRT„ê5k#Ô¾Nòc¥-2qÑ!Mo#ºµ$•¾I) Z ÉX3$¡YÖ¬a½b©‹i5׫¢3M0ü·G[l¥·„4âÔ’uĚ˵íHðfJ2,ŽÎ5—ó)ŠŸ/‘¯‹|\ÑRg´êO©øl¼¥Ú·©3Z Í 5¨ÍÚ™žqž#]ÍZ•H*[ò¨Û¤2fQÛ'Ú1¡ p“­IN”á&fE¤»„,7µn³Y»Û¢Ôg èŽ­eØI&É%),îùJ=;ÄáFœ¨ˆóƒË4Wªs™f©>Dhñ¡Éo“ÓIÉN"C$é(Ù'x%dJ2R±’àyᯆÿ?¾AJŸ|¾ù•ª=n§HjKPB’IÞ¥l¡Â3Nt¨‰dzTY<(°e“ÁŒùWzW-å.SåÓ›'U.1ï^G½QûŸ÷ä¹ZòG­Yñ·è±*—¬Kyu%!‰SJsŽkÉ©Z½ 4“3Nsƒ"3àfXšeŸH¨•/“\nŸU%ªŸ01™IÝäÝ85î­öüý·¼àb°UZ´^ïß2ÒpOzùüî©L¨.LW˜é>ù. AºEá Ñ¥+î©$Ffffy0‰yÜ1JêTU. ÅÍa×`0ã„úýó†µ Ô¥ÊŒø¥ú‰ÆÚÚÙÕJ·D‡=–êŠ]C_$äôŽ´¨ÑîÏ‘7•$Ë™X.'‚<#²£•2™%ÊÊÙ\þO¡×a(¡åÓIJA(ËZ Fk%%8Ңɞ3l5í{¼ÊÞŸ_ô¸`©•Å“µ0ù¿]OŽgF½fM™£ÜÓ¨Ìô' â|8„Kν‘rg)ÍrŽM¦—·O/ß(½Ïû°\Å¡"Мl%YM7qB¤5.­¼|œ7[vŒéHA!9%%´‰Ä¯™&Jç÷ÚKˆŠŽºuYMT%M…ä˜Ü”5½Ü‘® 70DZ°ddyÀa®»Þï2oO—È͵ïXt†"M[ó¹|i+•ÉQ1°§ f¢&Üà¸è>Ô”„$Èð|Äx*Í*æ­Rá”XR›Bj6Ô¨í­ÆM\æÚÔ“Sfú†BÃÃb õ=4Šœú‚$Ó©®óNÎu Ý#CM´Êm´äÏ B’’É™ð"âceó¯Eä[—)ÅÈ¡¹ T¸ÊÒÊýúO-ž¬åY5dÏZøöêÎÎ5ŽÜ·©°#NÕI²d â;O"42ƽn—¥(ô Š-Õ]OLf6M¡³i·;jy´r„:iÞ%:[“^³Þ6HÐáš°fj#<‘qàC:±iÂ…¢¸µµJ‘ $yæÑÄЕFxÚ$+V£Âýݳ4`ȳïfq(µ Ú—O®Æ~LYRšŽ–Z^‚Z–êÛ(¸’H”£áÄ̈¸g%U‘’…í2[‹X­sMV©ÍªHKÓ]JÍ ÐÚPÚ[CiÉž”¡$IIdÌðDE“1¶‹y×¢ò-Ë”âäP× T¸ÊÒÊýúO-ž¬åY5dÏZøöêÏ…µ&ŽÄy)™CUb¤ë7 •­Ä²Dzµš‰µ%jVtHUž‚=Á¢‹ç“F§[Q*ò%ÈŒÔTJ”ñ¢;ŠFh¥ ×îª$’ŒÏ‚:udL¿™K¼JÜ5Ñ/:ô^E¹rœ\Š˜ÕKŒ­,¯ß¤òÙêÎU“VLõ¯n¬Ä[ν‘n\§"†ä&5Rã+K+÷é<¶z³•dÕ“=kãÛ«8·‘ÒŽèžš$vا¡Óm„¶µ©&I-&¢5©JÂŒX3×'œgˆþ›¼®&ã13›Ü°” qZ2q)A¡)w)÷R$™¤‰zˆ‹»4:•v|T +ÌFf3Ž- ©n“ªÔ³A¥FDL¨°F\T\x`üîØp˜U6}=ƒ¥¥}f²eDë)$gÄËSFeœž ¸Ÿ8­ê(ßßmÚÇ¢/+…/ºï*Ž´º” Ù\&ÂI´ihÐhNjÆ”–5+ºcI.Còå½.S«y÷œSޏ³Ê–¥LÌû¦f7õè”TY4*…23è’ì©Qæ<òòn© Æ_—¥&êȺL¸Ÿ> ¶+QÊö“¹hÛŠD$ s,O@= H"&Ð0î€ }ØÁ «óc?Â.B›°ÿ‚WæÆ„\‡"Ç[r§îŠWôËÞè¡UL±üÿ¢öŒú4{$häs lža²‘Ì5²y‡¿DÁPÖÈæ1«“Ò6’9ŒjäôV†f²W8ÖÈç1²•Î5²9Ìz´Ls5ÏŒ7Æcã ñéS3HÃtb;Ò2ÝŽô°8HÄtb»Ìc)ÑŠï1°8ÈÄwÞ˜ÇéûÓý#\xX1L@±Ÿ@'Ð „÷DžèÊMƨt~¤J¤S*“!R[D´¸FÛŠJR£J›Zƒ$'$feÀ¸  FN<i>%™«ÊqIšìªm*j%-…“Q´Ê˜B›dÒ’Q’P£N•jI—9õ›{È˜Š¡È¡ÑÕ"«Ù›$’ñ8éëC„çé4¥D´%XIOReÀU{¢µÓµ®Wy¹7¼™3äËz‡EW-C©žÞéÂ)ŠqhqJqD½yÖÚTD•%$dx"Éæ¼Ü~ S¤[Ô7œÜGk‹n§Â46´©.zpFI2AéNS’Ȫ€tßxÕÄÜÓ®)‘/î§#Å™9n‡’¢lÞÔj%!I> 툈ñÀ³’É 6óU?©\–Ý£'©u'*1²rO¯O÷n)N†°\þ䜙åzª !U’àÉpL°1s›lK¡Qä&¾G¿mÇ9"V£V„¯ I)FdNø™÷Lqîé1©¥5"ŽÑ©,¡÷J9™ÉKJJ—j6ÏŠ“ÐF®93Éæ¸:/P¶uGº\´n¹wiqŸ8³êñœmQ⾞ÕeÉ·f·…dDá‘d“Ð8VÓmÙð[ì¸ÿžíýÈ•M3J›âbˆÌÑéMS‰—Z\“Û§ Å6¥äÍÃYdÚlûUžÄó™Hº#Ï“4æh´ˆ± ; Ti1!µ=½&^Òµ-)%)J% µd‹9ç,ëbÕ¦\Ô;LB§Ô*·êSò×!ô¢Ja­”¨É.“k5HSd¤·¤²“Q CKC±ªZd9i©Ò¢É¨ëê\ 8R'éQ¤÷zPh,­*AkR5)&E“µ ®äímÛü›]Ýß…¿woŠî2.;¢:*0Z¦3T8´Î§¾Ñ2â#HI¾·$J2sI)iÂŒÉFh%sŠÍfzj2’ò B€ÚHC14¡$Yç5©GÇFgý¸"¢ÙÌÕСÕ#Ü4 ›Gv¯|Ÿq–MÒ}$Jh’Kopær¢%i=±çµ Jj͈Í.èVßA…!l4‰ê è<¥åÆFíJYšŒÔI4’ˆ”JÄÈÓ«SVž÷~çºÛ¿N^û÷’©aW5•¦L«‚=iŠt.±¸»– Å4ãHotIQ8µå¼ ø–H»¦fbºÔ„ª-)²¦^ˆÛNr£#2qJY¸|R“.Ü´™§E®Æ±¢“s¯½D’óöÔú‹4×$>™‘‰0Ý~<’Ñ¥³34 ô)J3BÌÍÁ•j›g?Q·Î§·Er_&~Zii¥K6YÔn,ÈhN…«J–•KQ$ÈÈδ©¹I_…·Ûvûúo|«q⛜Éç’t*9ÓÝBªy6âYÊ5i^¤¬œ5–µöƳ<(ÈøpÌ«•OÑj4³£RšDéMI7mÆÔÉ´“J‚%èÁ%nl“3Öffgƒ+%á³úE2ã§R©w½â—$—U%r& ÈMÈ[Š[Œ!;µ”hJu8d¤$Ó¯$*—Eú ˜È\ÈsãLŽRbLˆk6¤5­HÔiJË BÒd¤‘‘¤ø QÓáYG â®®­¹û׿çb4Œ‰×e^m}ŠÜ…²©-0LiÝö‹FƒJÉEÓ¯RÍ]ÓZ†Gô‹¥LÉ%E¡Q£D6VÃÐÛiÃnBi3%©K7ŠReÛ–“IcG”+uÙ”ŽZÅN˜·÷.È($êŽA¶Þ£ZŒ‰:S‚J•¥J%K$FX“lÕÄEAÅÜu· 3Ih)_C¸Ð–ÌÚ,¨ò’±ï¹ûUéÚµ¯yOÁÀÀ¸ëë­Ç§0ºe>i쩆y*\,¶n)d•jZˆôšÕƒç=G¨Ô|FÆ樮Ûï·nÑŽEG%uG'+Òµ¸ZË}ƒ÷G Î\p^÷µÛ®·FUIš2Zše·äFŽê–ìvÖiJT¾×G¾ZHÈ”f“Q‘ ³Ô0#ÜÐÞj4ÇbÒ!O‰1·]=&ã‘x§$ŽÕH}ªÐfžGÀÌåk/‹ïïq­÷÷¼ÓS+ª‚ìÔ2ð&¬–ä‰Ãd&f&K'Ó¨È^pfFg“Š»ä-Š“Ri‹jlÀm]Jb2— Â&‰.á%fkÔfeÇ$j#Æ~Ýuº2ªLÔé’ÔÓ-¿"4wT·c¶³JR¥öº=òÒFD£4šˆŒˆn®Ë]…ÊTºC”Ⱥ©qjKmçTêP¨­¸ê’kÔX#5«I¬Õ¤³ŒUÝ÷{†ásmæ©]QÍ»Fk—ÓX§/AÉ÷6™Ñ»4åãí‹tÏÉì¸q^­U«Z;~·®Ý:çã-.°™Fæ–ÜJ’¤¬‰µ¤ÌÈ˘ÌˉäŒo+Öìi5·ß†ª}˜Ü|‡Tó)–œ‘·4'ôŽšfEÇGÇ+5hÒê“ ÜoJBµ%iQ’¤ŸJM&FGÜ2=dewÜLpµdmé;4º„Ùq­ª6%6M¥¥.N#§VíDñ,]&j3âdX#2åpºÕ}U˜4Út7–™Ž…“LûŽëZr£V¼vÚ”ff®Øò4 9ë%À¶fĨrz\è<ŠܯwîÖt(ÏÜÕž×<ÇÝ!µ—vÌ‘ôœ {s¤³¸“PBÊFŒ*ÐFdX5%$£ã“<žkÂ)É+ â™`+¡Þ¨Î’ª= âNJ úrYR#‚-&’B‰I2ÁžR¢>Ù]d<ê7#ó£Ìaêu0ûl´É¥ƒÌ6Û32K&g”‘äõäÕ“ÉçˆÒt1:És½™q7"×A*)”GZnJ#|N(›'ÅÓFTM Œ´à¸é$‰Iˉ)%À’$„ ’O@= H"&Ð0î€ }ØÁ «óc?Â.B›°ÿ‚WæÆ„\‡"Ç[r§îŠWôËÞè¡UL±üÿ¢öŒú4{$häs lža²‘Ì5²y‡¿DÁPÖÈæ1«“Ò6’9ŒjäôV†f²W8ÖÈç1²•Î6Võ‹u\ð\ŸC¥ò¸íºl©|¡¤adDfXRˆù”_HõôhJnÑW1Ti+²”øÃ|t—v;´es[¿ýlH1ØÆÒ•ÍmÿõÑý õiЪ¿+ÈË)Ç™ÌÝŽôŽœæÄöœ|ÖÏÿ]Ò w6µÎ-þ¾7¤!N|™ÂR3—:1]æ1ÔÜØ^ÕšÖýáÒ w6µsÎ-_Þ} ÕÉw¤ÑÊ]÷¦1úGV^Àö´eÂÓýãÒkþ×3ýRýãÒQàrg/1¨Ÿ±ÿkž ~ñ‹éD{_ö¹à—ï¾”Xƒ˜@ÔOØÿµÏ¿xÅô¢=¯û\ðK÷Œ_Jåà:‡µÿkž ~ñ‹éCÚÿµÏ¿xÅô ^¨{_ö¹à—ï¾”=¯û\ðK÷Œ_Jåà:‡µÿkž ~ñ‹éCÚÿµÏ¿xÅô ^¨{_ö¹à—ï¾”=¯û\ðK÷Œ_Jåà:‡µÿkž ~ñ‹éCÚÿµÏ¿xÅô ^B{£§û_ö¹à—ï¾”=¯û\ðK÷Œ_Jåà:‡µÿkž ~ñ‹éCÚÿµÏ¿xÅô ^¨{_ö¹à—ï¾”=¯û\ðK÷Œ_JæÑ¨{_ö¹à—ï¾”=¯û\ðK÷Œ_Jåà:‡µÿkž ~ñ‹éCÚÿµÏ¿xÅô ^¨{_ö¹à—ï¾”=¯û\ðK÷Œ_Jæ°YnDÖ#½)˜ºâP¹Í ž j$%J2.sÒ“<3à; ®ØR¦¹_©\v|Û‘Â59!×*j„ëÆX7œŒtã5,϶2Þ \éÁékþ×<ýãÒ‡µÿkž ~ñ‹éFM'DZCMÉ«rÝûR±¿³fØtVz»hRå[•×kJqj-"JÖMaƒ¥¨ÐDq£žu(̉Âá­&…»vÒh”F(ðö¢Ëéêy4Èñ+µ¨­N8· 2RÕ=;å–¬­ÑŸ7""¨{_ö¹à—ï¾”=¯û\ðK÷Œ_J1Tö-*—Å9;ïâ¹·ËÍæYTh²ÒgìæP7÷E!î¥[Óh®è©T¿å[ýn–i'£ªFz¹ÚÉž…o4W|k*¿L…¦òµ#V4‰êr¬´-¸Ñ“ CE‰’„F³3Ii4‘™?µÿkž ~ñ‹éCÚÿµÏ¿xÅô¢ðöT!=djJþõ;\ßÝ‘wV±d¡Tìò#Ô*÷-·>¦š;”Wä12¦ÂWQ*Jš½.¥£Ju©'§Þdò[ZåmA¢Æ¥I¿`*R\¤Ëƒ ¯Uæ×L¥©ŠI·Z7&+ ×îËNHÖFI. ‘+×ÚÿµÏ¿xÅô¡íÚç‚_¼búQÖ‡²iQ¬«)IµÍù[—"ÛV5ô­¢7šÄ Õ•©ë",j¹³Ä)•4n;µ9Ûj5¨Y]6œòÛ‘ aI(îè3I™Ôœ—9ˆÈñÄŒ¸ •‡wìǰ=­hÞ7;Ú M̃&RIiJJ"Qg)<T\ÇÅ&]4÷eò`5û2̺(ŠÍ-ô2Ê&!NÈtÒyRõ–¯À‹ ‡2Çë*~i°-9÷MººÔ«âä†ã•Ì“S šm Ëy¤kŽ¥{Ô'GÇ#p½’0³Êï{Gý­SÏÿņ|#çj¯ýc$h6UAÿL®u•iÿ—ë?ãÍ÷øËúl¤{ÞOÿ¹úoyõFU¢P\ ²GmuN§™”{†|÷•ÈóïTÉìjž|÷}Äôjwª Zø¼Múš=Rä“ »#FøáÒ[ilšMDäD8é8Ùš‰).Pj/t"<¯JUgf±zÊD¤½Q™H•"ærœä™ ÂzZâ•=éè–MÆP椑1ïR£Ni;lÔ—åY"5³êgkeý"6¯R¼«ìƒÉ2]ätåhm 5)X(fg‚#<íÛÒ]Ó7…aç#8M>”G¦(ÚY¥+$¨Š'jzV•`úGÌd5»Y™Y~ËÚ$G¯!±C¥2ŽóóP'!¥JuÓÐFJqN)´îô$”ƒà~ôX«qUŠ!ª·SÛvëb’ÔÒe³T6LfI’u$ÒjS¦¤¬•ÅÒàx"¨§Ò²#Y.fì:†|÷%lÿ¾3Õ΋²õÑSTm ]ÔÖÖ£R‘0%ã&d˜¥Ç}6;0©Tæ½uB©W ´TºáÂ'tÚvQc,Ò­ÙMD·JÔ¨ÍIazÚu$´+ºF0è>ѧ¥Jp‹MÆÏw)%(¼žÿ;«P•8©5¹ßäìË_P |uOïI>Ô©df8Ý©íº1R ¶·)$jydjÔóËyEÂS†EÛüã>#«ˆÒš‹Oµ8·M-$’Fµ¨Öµ`ºT¥)F}&fgÄǸ4¬Pèl&rX´èm&¡ý4‘ ²)=>é‚íÿnFE>>,j}½JˆÄ7MØÍ1K 4©¤pJ+Rr\p£.“ j+4ŠEjJeV-z-Eô4¦R츺´¶¢2RÔFzLŒò\Ç“•81ª0¦C“H€¶g:‡f!QÛZd)$‚÷BQ/)m)É‘ž’"#,6`@ÒZtˆöØ¥Cm¦¦K9KA%Bv†É(J )JI  ˆ±ÑÄÌø×/™Þíý?ÌH#—ÌïvþŸæ¾g{·ôÿ1 @Ž_3½Ûú˜rùîßÓüÄ€Y9|Î÷oéþaËæw»Oódåó;Ý¿§ù‡/™Þíý?ÌH#—ÌïvþŸæ¾g{·ôÿ1 @Ž_3½Ûú˜rùîßÓüÄ€Y9|Î÷oéþaËæw»Oódåó;Ý¿§ù‡/™Þíý?ÌH#—ÌïvþŸæ=¡I—&kͦÐN¸”¹ôäñœdy ªGùVüz?ˆ‚ÈÕZä>ÌJ´º†ádÛŽSè’¥´J4¥Zwg…$ðGÃx§¶27·?ôHüƪôþ¬NÿØ/â!_¶ÿ­þoWÿt´t5RŒªßçé{£¤Ó¡†ø»î]ù|Î÷oéþaËæw»Oó‘èËæw»Oó_3½Ûú˜ G/™Þíý?Ì9|Î÷oéþb@,¾g{·ôÿ0åó;Ý¿§ù‰²rùîßÓü×ÌïvþŸæ$ÈËæw»Oó_3½Ûú˜ G/™Þíý?Ì9|Î÷oéþb@,¾g{·ôÿ0åó;Ý¿§ù‰²rùîßÓü×ÌïvþŸæ$ÈËæw»Oó_3½Ûú˜ G/™Þíý?Ì9|Î÷oéþb@,¾g{·ôÿ0åó;Ý¿§ù‰²rùîßÓü×ÌïvþŸæ$ÈËæw»Oó_3½Ûú˜ G/™Þíý?Ì9|Î÷oéþb@,¾g{·ôÿ0åó;Ý¿§ù‰²rùîßÓü×ÌïvþŸæ$ÈËæw»Oó_3½Ûú˜ G/™Þíý?Ì9|Î÷oéþb@,«¹b*¿Ocjm¸õµK"Q¹ÒqyÏjf\KŸÆC&I½!õ:ó£6ɲN® ,äñýæIÏþÉ °t–“MÒ«ÅñEáRTä¥fE*œÕ6«2¥*•"fï{¼yKIh#$éIžÎyÆ3Ò6ž“r ¶Iyå=£%¥¬j$ÿa«*ãž*>Œ{€ã£û?FÑž*0IÙ/ÑnKô-R½JŸÎîmzî¬wœO ÿ0 P §#ÿÙxymon-4.3.28/docs/TODO0000664000076400007640000001702111535462534014643 0ustar rpmbuildrpmbuildBugfixes -------- * From: Date: Mon, 10 Jan 2005 15:06:36 -0500 Subject: {bb} Bbgen depends not working for conn tests 10.0.0.1 host1.domain.com # depends=(conn:host2.domain.com/conn) 10.0.0.2 host2.domain.com # Both hosts have red connectivity. My understanding is that since host2 can't be pinged, host1's conn test should be clear, not red. Is this right? Analysis: "depends" is not evaluated for "conn" tests, only the "router" setting is. Simple fix would be to change "conn" dependencies into router tags on the fly, or implement "depends" throughout and treat "route" as a special-case of depends. * SMTP network check violates the SMTP protocol by sending commands before the banner has appeared. Some servers recognize this as a spam-client, and refuses with a status 554, causing a red status. The correct fix would be to implement a full expect-send engine for the TCP tests (would help with other things also). * Make a common vmstat RRD layout, to allow for systems that grow more advanced. Use this to add Solaris I/O wait data. AIX also needs it. Will break compatibility with existing RRD files, unless we look at what datasets exist and drop data that cannot be stored. For AIX (bug-report Nov.10-14-16 2006 from Andy France): > There's a mix of "cpu_w" and "cpu_wait" definitions in the Xymon RRD > module, depending on what operating system the vmstat data comes from. > But all of the graph definitions in graphs.cfg use the cpu_wait > definition. Also, postponed from the 4.2 release: o vmstat columns on HP-UX 11.0 are different from 11.11i. Marco Avvissano March 10. o vmstat columns differ between various Red Hat Enterprise versions. o sar data parsing for IRIX client instead of vmstat data. * A host cannot be configured to appear on multiple pages of an alternate pageset. Configuring this will cause it to appear twice on each page. Fixing this requires a complete re-design of how alternate pagesets are built, and probably also quite a bit of work on the internal datastructures in xymongen. Things I must remember to look at --------------------------------- * IIS6Check: Log performance data in graphs. * Scott Walters suggest larger RRA's for graphs: "I think 3 RRAs is good. A month of 5m samples, 2 years of 1 hour samples, and 7 years of one day samples. This doesn't address keeping the MAXs, but is worth considering as a blanket change for all RRDs. You could then generate *real* 9AM-5PM Load avareage reports for the last year Monday - Friday." It will require re-generating all of the RRD's. * configuration file for NCV. - filter out unwanted lines - more flexible DS configuration than the env settings * Create a new xymond worker module off the stachg channel. This will dynamically receive status updates, and therefore it can have the full status of each PAGE without having to load the xymond board (should do so regularly just in case). This can be used to switch the overview pages to a CGI tool instead of generating the static pages. NB: Must be able to handle multiple page setups - or should we just have one worker per setup with different config files ? * "cpu" status determined by the non-idle time reported by vmstat, instead of the rather meaningless load average. * xymond_client process/disk alarms to different people depending on *which* process/disk is in error. * process checks that relate to a group of host (process "foo" must exist on at least X of these Y nodes: HostA, HostB, HostC. * Configuration of which graph(s) to show by default, including limiting it to e.g. one of the 7 disk graphs. Ref. mail from Charles Jones 15-feb-2005. What we really want to do is customize on a per host/test basis which graphs appear for which tests. So this means some way of customizing svcstatus.cgi to include specific graphs. * Something similar to larrd-graphs.cgi for picking out a bunch of graphs to show on one page. * Move all of the xymonnet "badFOO" etc. stuff away from xymonnet and into xymond. * On Fri, Aug 05, 2005 at 09:39:15AM +0200, Thomas Bergauer wrote: 2. the NOPROP(RED|YELLOW|..) command in the hosts.cfg file works as announced, but I am looking for a possibility to tell NOPROP a "level" of propagation. This means that an alarm should propagate to its sub-page, but not further up to the main page. * Dialog-style network tests. Currently when we connect, we immediately blast all of the SEND string to the remote end, which in many cases is a protocol violation (e.g. SMTP servers may refuse us because we send data before seeing their "220" greeting). Should do this right and also cater for multiple http exchanges to follow redirects. * Better dependencies between tests. If you have multiple http tests for one host, be able to make them depend on each other - also such that one http test depends on another on the same host. And direct alerts for one URL to one group, and for another URL to a different group (like GROUP in client handling). See http://www.xymon.com/archive/2006/06/msg00210.html * Better selection of which graphs go with what statuses. * Easy way of grouping hosts for multi-graphs. Improvements ------------ * showgraph.cgi change to make zoom work in two dimensions. Requires RRDtool 1.2.x. * More reports: Check out bb-reports on deadcat * Multi-line macros in alerts.cfg * Allow for regex's in the TCP response match code. * Merging of alerts based on some criteria, e.g. merge all purple alerts for a host into one message. * Implement "--follow" in the new HTTP tester. * https proxying (proxy CONNECT protocol) * Optionally hide the URL and content output from HTTP/content checks for "security reasons". Marco Avvisano, 20-sep-2004. * Set a "BASE" URL in the content status message, so the web page we show will link back to the original page for images etc. * Provide a way of sending http status-messages with individual test (column) names for each URL - apparently, Big Sister does this. Suggested by Darshan Purandare. Repeated by Scott Walker. * Provide a way for a "cont" check to NOT be included in the "http" column. Suggested by Kim Scarborough. * Allow for enable/disable of TCP response check per host/service. * Use the "acked" gif for subpage/page/etc. links when there are only acked tests on the page. Marco Avvisano. * Handle "summary" pages for alternate pagesets. Need to find a way of detecting what color a page has when it was NOT generated by the current pageset (allowing for summaries across pagesets). * Improve the history colorbars in cases where there are many shortlived statuses. They should not automatically be given 1 pixel each, as that will cause the history graph to be *very* wide. * Display-only tags should work on duplicate host-entries in hosts.cfg, e.g. you should be able to put a "NAME:foo" tag on a host and have it show up with different names for the same host. Various ideas that have appeared on the mailing lists ----------------------------------------------------- * A report generater capable of displaying for a certain time frame: 1) List of the top XX "host.service" state changes. This is to help us understand what is barking the most in our environment and focus efforts on fixing chronic issues rather than band aiding. 2) List of lowest XX "Availablity" for host.service. And since I am throwing things out, how about embedding a 13 week rolling availability into the status/history page? Scott Walters, "Reporting based on history", Sep 9 2004 xymon-4.3.28/docs/critview-green.jpg0000664000076400007640000013572711070452713017615 0ustar rpmbuildrpmbuildÿØÿàJFIFHHÿÛC  !"$"$ÿÛCÿÀº"ÿÄ ÿÄe  !A1Q“•"2TUVÒÓÔ3SWa’”Ñ#Bq–¤ $%457Rbst…‘²Cr‚¡±³Áð6DEdu¢´µ'cfƒ„Âw†äÿÄÿÄ9 !1Rb‘AQ3a"2q¡±ÑðBCÁá’ñcÂÿÚ ?ìôùrÓ:BS)ä¤Q‡&>lÏ;´0¨ÿ„$ÿ¥Wý¦8†•AÛô¯uU>EZu]ž¿û©=ì³bå _²Nμrã™?´GŒgäùG­.NfèŒõMŠk•=%öä8ÚZuK#(î!§‹1x¤hqĤÒgŽ8– †Û3Îßí pºî:«uR¸ŽPN¤Ýû;Yµ…¥ ·‚H¿u´'“éR§ ©ÐÍN0‚kjÈÍÂ"u8ž%”ÿ{wwÝ÷‚®Jù[ÍTŒ†,.œ˜rR¶Pé®Bä:—Ij4›""ÈgŠ‘\¬×ŠG›W¨Ô_bîIîe«#hI©JÁ8™àDg˜ú±V[îÈiŠšr3„ÓéCù¥šR²JˆÅ<«J°> #è21¦ZV}¯¤¦Îæ*LJ=9QQRѦZˆ•šÖ¥¤×ã©Å4ŒŠI›«E¢WîX•Y-lõ—ò"# xÉŒªÈᲓc#„iGŒ¥™ï3-5ÃVbã·í·#D¨¦´Ô6"Óåq*Èã¯ÔD¢,¦œQ•~"ŒÕãΛlÏ;´1¯®]¨äʪVU¸ÐÞšáªRõ ‘® (“™8àGå$ºL‡^•W?ƒ-N´§WEFÒ\ç6rIàk‹¬Seœ•â«IñÀÏ#ÀËKr*tûV©@rµ*§û"¿%÷¤¶É8û”bmFm! ,©yÄ‘$ˆŒŒ±ÄË¿¶Ìó·ûC ¶g¿Úø„¾ûlÏ;´0ÛfyÛý¡Ž·YTEÓ,­ÖgZ”D¾ºA*³M’gQYª"%£PÞ:Ó2K…¬^ ZÏÆÃzùG^ÚùoådùQȼ…¨k&«jÔfÍ—[­Éý±Žl¹w âPå}¶g¿Úm³<íþÐÇUn+‹ÖÛ»JÞÅ‘öf ÆÞ† ±RMÍbÚÅÌs`H^ä–ååúìvû÷zÒ£º]¤³ tö,*ª¨I5`’qKBL”FK"<¤FFx™‡1í³<íþÐÃm™çoö†8º£[¬[o\´ºË.j"D¦É‹5È,*BU*CÌj‰(&Û352’B”X$ÜÅY‰;ê,\ÚBvð¨[íI»Í¸Ñ%¢S4=¯X£2R]=i4¦’DƒÊ‚K…¬,Æ’4ƒŸöÙžvÿhc^*Å^Q}øS£·&;¹–œí­$¤«`e‰DcíÚ…ÏpÞÑ&´ªTF-úUJLhŽò\û’uˆÖšW‹fL’O!ï"#J‹yKD÷Uq/nQ™FrÞ´˜vVFäô¦"T‰*Y–&…r¥-™`x’ŒÕâ¤9ßm™çoö†lÏ;´1Âußí[Š¢óõ,‰µfU"K¨rf(’ÒÐl"3‹ÎÑæ3ý¡+ ©#QæÀr½¿¡ ·S¬È«IZó©×Zi²F$E‘ m)ÁdfY³+yâ£Ý€n6Ùžvÿha¶Ìó·ûCŪߥ{ª©ò*Óªìõø¿ÝIïe›,Jý’vuã—Éý¢:3¸î)Tû §Q»Jº«š1”È»3 ¦:“N›ˆÕ¤”YV‚md£Qfp°$î ŶÌó·ûC ¶g¿Úø„¾ûlÏ;´0ÛfyÛý¡€ûí³<íþÐÃm™çoö†>ï¶Ìó·ûC ¶g¿Úø¾Û3Îßí 6Ùžvÿhcà>ûlÏ;´0ÛfyÛý¡€ûí³<íþÐÃm™çoö†>ï¶Ìó·ûC ¶g¿Úø¾Û3Îßí 6Ùžvÿhcà>ûlÏ;´0ÛfyÛý¡€ûí³<íþÐÃm™çoö†>ï¶Ìó·ûC ¶g¿Úø¾Û3Îßí 6Ùžvÿhcà>ûlÏ;´0ÛfyÛý¡€ûí³<íþÐÃm™çoö†>ï¶Ìó·ûC ¶g¿Úø¾Û3Îßí 6Ùžvÿhcà>ûlÏ;´0ÛfyÛý¡€ûí³<íþÐÃm™çoö†>ï¶Ìó·ûC ¶g¿Úø¾Û3Îßí 6Ùžvÿhcà>ûlÏ;´0ÛfyÛý¡€ûí³<íþÐÃm™çoö†>ï¶Ìó·ûCò«.GY6äçõŠ#4 œ3R°à_yðë4ÿû{û¡³ÿî½wþO@˜C>Ää”5¬–û:fIB3Ç$}\?Ž$:¥ý‰2_¬Yí½!׈ò)ZÌÉ&jk,z1À¿ÜC´ìšÆ5»ÙféÃîÇv8ôc÷á¼ucÃ÷?,YúܹöI9²ôc™¼pû„Ç1Ûš­NšÝR[nT"!iyd¤©ä‘‘’qï·hÍòŒéô›T§í² ÷ZŽŠY'6’Þ¨¦¥`„¡jR•• #3ÀnfèïGmÌ}´hîÌ$¥Å DÜDèÇË›íýžYŸÑøžì@ÌŽ»b;è~:èìºvE ÛJ“®Y8î]ÖD¥”¢#OØz9a‡wGÖb[m&µÉø‡bòb“ËÞ ¿Q¢Þë…îÁ.PåjW¤ávéýGÊmFœü7˜j¸ÄGmHKí<Ñ­£2À–’Y)8—If#-ÛÈËpãN^ðmú÷\/v½àÛõ-î¸^ìÖ£;R9éS¥£ŦQq8ôà¤Â#!zÙìî\åÝE•²äÛ²5´eà 5žVnÃ@åïߨÑouÂ÷aËÞ ¿Q¢Þë…îÀn«–½¯z3]‘W·RËr’¢DJjÔÉ¥HAÊÏŽ¯:¼¹q݆l7 ^{ceÙsÑö}£iÕbÞMv·[¬Ã£>³ÇÍÓ›ÆéÞ8ë—¼~£E½× ݇/x6ýF‹{®»È“kÌÚv³£HÚÙKu¦ÚõÍ$ÔiBñò’Fµ™î,Êë1¯v‹£×ilRœ¤Ú˧ÆY¸ÄUG`ÙiGÒ¤£ y¥ò÷ƒoÔh·ºá{°åïߨÑouÂ÷`9%‰Vó!‰¶ž[HeN!m’´3-ùRk^ÐY•‡I‹j0¨J`¨­MˆfRvf̈²7‡œ’À°,º‡r÷ƒoÔh·ºá{°åïߨÑouÂ÷`/)vDNDJuµ5)¹©i†RR¢2R\À¼r23ÄqŽV¥zNnŸÔq/x6ýF‹{®»^ðmú÷\/v”9Z•é8]ºQòbm‡d:ĺkNIp}Hq 7VIJ J2ò*œO‚Hº‡r÷ƒoÔh·ºá{°åïߨÑouÂ÷`3^°¨/U•Wvü}Ê’Ô…ªZ QMãRJAšö<Ø¥II–ýÆ’2èŒöÆË²ç£ìûFӪżšín·Y‡F}g›§7Ó¼q×/x6ýF‹{®»^ðmú÷\/vÌ­CK)2¢šX’©l—ì°mõ)JS©êY©k3Qo3QŸ*|[2”©ñ¨2ÊTÂÔ!”`úhS»¿|Ðf“WI‘™c€ ò÷ƒoÔh·ºá{°åïߨÑouÂ÷`/ðcÙÐ*’j°X Å¨Kþø”ÊC¯oÇÇYoVþ³f—l2Ä]¶©ølM¤Û$ÆÁÙjË÷0B”Øxª2è1Ç\½àÛõ-î¸^ì9{Á·ê4[Ýp½Ø ìh–\Z˵¨Ñ­ö*“³[m”¾æ=9–^1ÿ3ЦÐaCf9tØÑ˜m-2ËN!m ,”¤·t4åïߨÑouÂ÷aËÞ ¿Q¢Þë…îÀr‡+R½' ·Oê+5ZdyuÙ5hzDJrCm´¦â&šdHF9S™ØëpÈKV QàkVà*¼½àÛõ-î¸^ì9{Á·ê4[Ýp½Ø ä+r${ŽŸU‘~*¤ÜY‹žãrÚ„…» ã.2W†ÚèiÃ#ÌK3ÈÞ’I’·ŒRì&9,S­¦“Pþý$0Áž?´À¼爣ò÷ƒoÔh·ºá{°åïߨÑouÂ÷`/ôö,êth±©ìÐb1 Óv3L%¤%…šTƒR·%F•©8–üeÄÆªÀ Yö…”#¨Æ§± EE¦šeéDÓiNe™žü¸àfxu˜ªò÷ƒoÔh·ºá{°åïߨÑouÂ÷`9C•©^“…Û§õV¥zNnŸÔq/x6ýF‹{®»^ðmú÷\/v”9Z•é8]ºPåjW¤ávéýGò÷ƒoÔh·ºá{°åïߨÑouÂ÷`9C•©^“…Û§õV¥zNnŸÔq/x6ýF‹{®»^ðmú÷\/v”9Z•é8]ºPåjW¤ávéýGò÷ƒoÔh·ºá{°åïߨÑouÂ÷`9C•©^“…Û§õV¥zNnŸÔq/x6ýF‹{®»^ðmú÷\/v”9Z•é8]ºPåjW¤ávéýGò÷ƒoÔh·ºá{°åïߨÑouÂ÷`9C•©^“…Û§õV¥zNnŸÔq/x6ýF‹{®»^ðmú÷\/v”9Z•é8]ºPåjW¤ávéýGò÷ƒoÔh·ºá{°åïߨÑouÂ÷`9C•©^“…Û§õV¥zNnŸÔq/x6ýF‹{®»‹N6ƒ®Ê¢©–Õ¿£ª´Ä4§–ÔZ45šNkV ø©#2,OÄȺL€^9Z•é8]ºPåjW¤ávéýF¿›; ìþÅîx>ÀÁ­ÙZ1¢ÄnUJDZXiÙ,Ålʇ f§^q-6’$¶fx­i.Œ yžFdÀßrµ+Òp»tþ¡ÊÔ¯IÂíÓúG7Ú=û<³?£ñ=Øs}£ß³Ë3ú?Ý€Ûòµ+Òp»tþ¡ÊÔ¯IÂíÓúG7Ú=û<³?£ñ=Øs}£ß³Ë3ú?Ý€Ûòµ+Òp»tþ¡ÊÔ¯IÂíÓúG7Ú=û<³?£ñ=Øs}£ß³Ë3ú?Ý€Ûòµ+Òp»tþ¡ÊÔ¯IÂíÓúG7Ú=û<³?£ñ=Øs}£ß³Ë3ú?Ý€Ûòµ+Òp»tþ¡ÊÔ¯IÂíÓú+öŽXaÇÝÑõ˜–ÛI­Gò~!àDXŸü˜¤ò÷ƒoÔh·ºá{°¡ÊÔ¯IÂíÓú‡+R½' ·Oê8¿—¼~£E½× ݇/x6ýF‹{®»Ê­Jôœ.Ý?¨rµ+Òp»tþ£‹ù{Á·ê4[Ýp½Ør÷ƒoÔh·ºá{°¡ÊÔ¯IÂíÓú‡+R½' ·Oê8¿—¼~£E½× ݇/x6ýF‹{®»Ê­Jôœ.Ý?¨rµ+Òp»tþ£‹ù{Á·ê4[Ýp½Ør÷ƒoÔh·ºá{°¡ÊÔ¯IÂíÓú‡+R½' ·Oê8¿—¼~£E½× ݇/x6ýF‹{®»Ê­Jôœ.Ý?¨rµ+Òp»tþ£‹ù{Á·ê4[Ýp½Ør÷ƒoÔh·ºá{°¡ÊÔ¯IÂíÓú‡+R½' ·Oê8¿—¼~£E½× ݇/x6ýF‹{®»Ê­Jôœ.Ý?¨rµ+Òp»tþ£‹ù{Á·ê4[Ýp½Ør÷ƒoÔh·ºá{°¡ÊÔ¯IÂíÓúŒyR¨RN9P…¬I%e!$¤ãÄ·ô—¡Æü½àÛõ-î¸^ì9{Á·ê4[Ýp½Ø@€t(ÈkYS„ûšV§ÒXcÀ‹Ž?Ç\ðù‘MbÒr3í<‚$M¬”Dy›Ý¸s ý×j¬R¨´}Ôg¿Žª'ÿQpâg3¾ðŸ3!»O>É8œ5Œ¸hZO‘—Aÿäñ!ð¡ÀU6œÜW&IšéoqçÜ5)jã†&xQýg‰ž"kµ(Ôz<º¤³2b+*uxt™tÞ}Ž©×eJ²ëOµ_“žsVÚ†”ÆSŸV•ºÉç™Xì!+§²§›Œ¨ï`d¥š›J7`|1ÝŽíû¿Ké-¥TES3ïñË„Lc9ûÇç}WJ´Z‹“F#ñŸ¼óþ E¥Q­È¹jPª³"Èi£¾ÂX`Û$f[ÈV8™ž'«#=æEÐ]gkÍAZiÏU¤µ–L¥d%Î9™”¨ò`k33-ê2=ØæÇ1Èõ-M樷ˆÄ{{DDòûºÚ\ÝéÚNfxç÷ÎZYS'L’ãÒt‰’Y«V”š×”ðQà¢=Ä{º13èÝÓŒÝJ¡S"¡®\gÒjN±(#4—J“”‹£¨Ëyo/¿ðÃ¥J®)ù,<âš[®²†•†sRÌÒxÿ“ã`xo#àd{ñn‡\’ËÈŒóSÊšq ’ÁYBOq’HýÃ_sÄfmÈòc¨æãKy¢éZâT¢-å¿1®¨ª¨Å3‰LLGhëµ ”dç+,§;ŠZm)h˜J±Þg™²#ÄÍEÜgl­ êêÑœ9´±T‹Ii$d•ù.#ùáÔdeÒC_Qe4Un ,¶çLÖ´ÔWæâù!³q´š0Q㸔½ÇÐxâ]#*Ü™«6S7bHœº ]±Æ 8%åbn'w’x‘bŸ¸º…mB½£Y½É®¼ñŸoÝ îÞ¦å_¢œGñm«ßà9ÿêÎÂc]jÞ,K&µ!©ó·éqáÄ'I òã¶IN8’RY–³I(ÒÚVUeÀlkßà9ÿêÎÂcî»^­rø$èõú$w¦M¢Ò©u†ËyÜ’„Ùq),qÌ”>·ˆ”¥d‚#5ßvk¦ÕSoö±8ýþʺUW)³\ڌՉÇïÇÖ4ñ~”õT£ÞioS­yÈRYLLe%.§"’·òã¹_·Ìffh4–]ˆÐ6’Q¤k]÷¦Gbv˜éF©ÆiÂ4$¤¼ÚLÍDÒË3t)'dÌ}v¯ qÞZ)¾Â‰ä”„ÈkgR\V+5(Õ˜ˆÌ‹?Š{Èü¬ ÕøZõ(jõå9§cG¸q¼¦ìvIÅ&A8åZŸY$Œ‹¶K#4¬Œq}"þ•]Ù¦äÌÇç<9rýÞ™ô-'L¹zi»3TqÎqÂs×/ÝâÍ»´_Kge˰SaÎÚ5˜ë6‡e#&\7eÙ±ÇÇ?Aa¿1𤫒¨¿š|HÌÊ}¬ŠñyN¥µc†Š˜t°#IJïÃƇX±h—N—«²î{uºœ·iŒE\¦MLë6й“X’Sg‰xÈ%–Y·Ô´ekSœ¹èÓï[(åU«65";³fДò¶´1)Q!ÓlÉ¥©¥´Ú‰ÓNr"Fü2Ñ?VæšRr‡·KhPŒÜ¨®äRu8’R‚ˆŒ±I‘àdGÖ3G[#Ñ­ÚfŠtQEdÍik¬3_¦µDu—dËn(ŸpÛÈG(±I–’Y8”™«yA³)°£ÚHµêé·]º"?B¥&3=¢z&­ÍIšTÓH”—4™VÈñN( ÅRê Ó9_mŸ«äxíȃ+V©fÉä¤ó(òŠœUÑ»Æ,wC…£wöOÞù_y.bÿÔ)ÿFó±±»ÿxûÌcr+¿+±ù3Vùoò³iå͉ÍW%íYòíXdÕì±ÔæÇ>üŸ¼œ‡ÆÎIƒCцë­%kŽñ Üḏ4(Ð¥$Ô]•J,Kq™o;lQŽ›¦ÅȉA‘5Rj3^™Q›Bz<˜ˆR\RL§æÕI`ÔiBÀÍ)R ð4ùhnÈeê…»>ç¶V§éV¶ÌSŸð-£–§‰e‚_lõç£1tfÞÏç$Á!èCuÖ’µÇxÐn2fXšhR’j.ƒÊ¥%¸Ì·eå]ù;Hb¡²íZÚ”95™0Úe³>8“­Í‡¸bXâ\:Û—Ȱå?lNªÖ¢YÔèÒgÛÏÊhŸC~2}³IÓäbx)ÕàDDòOTÓ\47­dQê²U* ‡ži•N2º£zÒBÒxæm ©kà ‰RŽýÁÈ 8jâ²`ÓÞ½ètŠ4êM¹*•H’†iã[K’R¥kò²œ Ì[n9:Ú|e ðÀÍEŽ– Ž›hÄ­ZÖ’!T!U¤À„ˆTw©í¿Td6R67 × L)i< + ^›þ¯slû‚¥L•G®SêÓ›¡L¢Ð¡ÉR¬™ªÌ<ô’Zw™léeä©—LÏÅÝ|¢RâXW]ç"‡lJb€Í ö R¡x²%%sµÉa²Á*yHDr4–fmã倷ßuß’ö=zæÙv¾H¦È³ë2kuM)y3`yqˆ8ô[ÕÞW«Ütý—SÈ•$AϬͮÍ<Œø`Y¾2á¿ÈÇø éÚ‚ÌøÚEn­fÖëõ¹ÔóM¯*5Ù:–¶D¤ÚC¨#&LŸ'”¤™¤ÜJȈ—ŽQµ›B¬'J×Z¹H¨Ulç.P޵`ÿ'ÀCsÙœ–R´)$ÚÐjÁF“6Ã’+”7}"ÙaTÙ³“I©%+‰.BŽ\g²)9HÈÈ”J>«0á·™¼äÑ+3éŽTiÕ‹ê\É)È¥6PاLˆÁ¹†âiz¦ñTo`xæÀæ§l2-^›nk–d+ͧž¤Ä†µ¶í9TÆMDÓ /Ú2SM Œ#…àd•nï$UíÊ~ˮ庒àçÖeÔå‰"F|0<ßÞùpÝåãŽì p×y"¯nSö]w-Ô—>³.§,I3áæþ÷ˆï/w`|+U ´º-ß³koÙè¾W.-!çTäjw&>Ùš£gC' ÜV¨ÒX¥Ä£/ŒI5R‚ʨ”3zÌ­¿g¢ù\¸´„S]7#Sù1öÌÕ‹:9âµF’Å.%|bI‡>ÈyÆžŒ„Dyô¼é¡klÐI`²)Y×™DfœRIñIGŠÓ».eÂ…T\¡À­ÒßÚ T#7*+¹cN$”…`¢#,RdxõŽ ¢[Š–ºd[2Úµ¼e»™2 ’ˆÔåÑe2¢q•—ìš[ês,ˆˆžBp,H†ÛC4YôÝ PhöŒ*}¥X†Ìvk%R¶Þ$½)ЗזÁº¥(“ûrRÒ¬¦X™ïHr°-~›NN–ê2î{b§TœôØ‹·j @qö¡°–š%$žIeŽdñ<µæ4çJȼ$R.úm:5Y¥Ö-j£—jïØ¦³°¸m*ªÍ)‚ÚpÈm¥ƒm½NlIiÍ“v`í.·FdU[zŸ´N(,¡Ô’ÔãŠtÛlÈ›5x«Ü¢Ç$«’L”Eñ±+¿*,z Ͳ윯M;gÖgÕkZJòfÀ³a› p,pè!Æö|IR.š dg˜*}nã¸mÖÍ‚ª2ZŠfGÒ•¦JÜIô Œ¸ X¬[t Ô©ÖÛÔúÊ™eŠûåi‘ªU*B”‰&e˜’—ÒÉ/rTHIa¸€sxÓX•ß•=æÙvNW¦Ç³ë3êµ­%y3`Y°Í†88tâmQ]‹pÚFųV§Üñ5ÿ,jÂq¦çbÉV/¨‰2sÈ6œFS^D¤ËÅèíÐYGMÒlÊÝ·žIº%M¦»\ÖȤ“KudDòóeHI´ ÈÉeÍV%wåEA¹¶]“•é±çlúÌú­kI^LØl3aŽŽ>ÔªÜYÓ—LSoDª3<ÙP^"7#¡óq(%)¦ÍY™u'‘J"4tài3àýÐYGMÒlÊÝ·žIº%M¦»\ÖȤ“KudDòóeHI´ ÈÉeºµ©ôKš×ŸY³¯"Æ¢G=tE©qå°Ä”IKPæ©L6zÅ$ÔIJ ¤ì4× w’*öå?e×rÝIpsë2êrÄ‘#>oï|¸nòñÇvK½-zÍuë*xr}ÂÂ.W–túc±£¢9S&IÔ)ç|SpÒ“3Q%YÒƒ-þ5Bã´.xﮇbÅv†Ô;ÝÇi LUh‘×o/:›ñM-¶©º‚Y¥./É3,¦ø>(yÅNv9Äy-!¤-2 Ñ«pÔj#A+6då#×µŠÅB˜.[oJ¸Ròß·¤ìëSéuªDMRâîÇ6¹*N-ïR‘”ñË7€ ¯ïÿª=ÿõã«ûÿêýDHãZÝégPç ÕÙA¦KJIFĺ‹L¸D}•J#ÀÅ_IuŠErÕ O¢U ÔâÕHA?B^lÔS™Ä³$̱!õÓ‰m'F‚U‚v,¸n¤Û—ˆœ6³­£Ç¤Œ±Ãü“Þ\HþZH¤Ó¨V]¯G¤Dn—%¦l°$$¦µþóâf{Ìñ32r0«Ü•ùíÔK¢´ÒŸlÚ)º“RZSªÊÚ’Þµ¨ÿw"-æe‰ch‰õP®“vQcMªÂ¨4ï“FÊ]hü´“É=&K<1Àð¡ê«µk4|ÄLüGʇ¨ß®Íj~c3ñº¥rQW~$؆êYyÖ¢®3ÑVfDZÆ”¥&D{ÈÓ‰bXbex›.4(OM™!¨ñ˜lÜuçTIBE‰¨Ì÷qg¤*Ë÷åÀŠ|:C0d>Òã4YHåk,ªqåàHA¨‹yá™™¸i&2©hÈOµ>܈Ҋ6bNЖd6ê™Ä÷xéA£~ï~á¯Ó¯Us^&­jbxO,ÿé_Òôšïm#[Z˜žóóá4{ÎV¨5#Ó’óøêM6Lt?V·JW¸ŒüS=Äf5–­ÁuO½ê”º¥f¦G×ê^ØÝo&GI-~ÕFhZÙ›Ÿ³"ÕåʬLÆ*kÕJÍï@]‰Õ¢¯mãÅKDÃæKÖºÉ)Nkµ Á· 8GIŠ=® Û3™¶y%nH}ºÁ3oÊeÖÐq^2D‰Î¸i–ZÄ·ã’LXbĉ]<:Îkv£ ªÄjBÞÂl˜îÉe¬§ã6Ò›JÕŽóež'›v8ò¯8W]>„å5Ö2éDã®'”g˜h¼TšˆÉÂ|–G‰HÌÉ5»Ê‹HsK­z§m¢ –áIˆ‰i¥œ¥G’oÅ\e)IB²NWÌœ<ŒÊÞY+™RxÓ‘O–ËHùSÇRRu]—ÄÌ·gA“þRH̱ ú÷øú³Ÿð˜ÓXuÓtU£r‘]vLEŽÜÉo!-ö™„”ân!\^âé3/¸nkßà9ÿêÎÂb†ªNäÐEF£`u :þ×A«qI*jòb{¼l¹wîß¼\ôûT]¿\œS9Ìüpž?…}.j‹S4óÿµá‰ºD—ME^IÅ m›¨*|fg-;Í?²Ù R‹$©ÂÃ%e22+>uUÚôØ5ç- ¦B˜–¦!’u…º¹´(ÚI$ðÕ$¸ïÇ1^kK6ìË\æÅªQ)Õ´ôŠìý…ØîÛYMx–ò#$™áUFœ¬ jáMRû¬|ž¨V(çÓT鮩´™Èt¼rc*Ë’“4™à´8“ÀÒ1Òt[–õjš5c3çãï3åž‹M¨×ÍS3ŽŸ|ÇüeΠ>0$·6 yŒ¥ä´ûIu y•²á‹%!dJB·ïJˆŒq‘û -€À­ÿ{'þŸýÒÇF?²þ´¿Õ¤ÿÄØï=oûÙ?ôÿî–:1ý/ðå¥þ­'þ&Æ>éöw £þ“þ•_ö˜Ä’Ã2XSC­,°RœHÿ‰fÑ:[®¿¤«·;Š5¨Ñ±$±3Äð"Nö”§âz›îüÆfàû±ÄÐ}jǨÕU:5U«Œâ9g8þRæZõmöus?‡o”¡„– "ÀˆHéÂô¥\ýËîôþmÂ÷cä½)\¿¹}Ýß͸~ìu"oOûUxoßí}ü;˜¥ÊÒ•Ûû·ÝÓüÛ‰îÇÉZR½¿vû¹?›q}ØÎ"ôÿµW„ïÖ¾îé:Ã.­ q¤)HÇ*Œ·–=8 é"´¥~í÷_þmÆ÷cä­)i÷oºßón?»Å»ÓþÜøNùiÞV”´™û·Ý_ù¶Ç»…iKJ?»}Ôÿ›l{±”Y½Ñ,·»_.îÔ©ÐjIe3¢·!,:O4K,I+"2% ƸíK|ÏO"kê Õ“=ž9?ê0=)i[…÷Qþm³îÇàô¥¥®ÜïæÛ>ìo¢4º#ëC]Wtjç5DOá޶ЖÐHBI).‚!ú=)i…÷/ù¶×»ƒÒ–˜ø_r›m{±¯v½Ó-»Í¯—{%Ä‹-‰QÛy$x‘-$xùħAˆ³\h4£é4' GEJZgá}½üÛoÝÏ:ZkõíÎÍ¿v2Ý/t§yµò︄s¥¦¿^ÜìÛ÷aΖšý{s³o݆é{¤Þmu;Ìå Žä“’ºtuÆñkåÞÚ³N?J–ÃIÌãŒ- ,pÄÍ&D67'-­[väÇ¡;&•I‹çqÃBÖÓ)B8¶GšO H‡@¹ÒÓ_¯nvmû°çKM~½¹Ù·îÂ4[Ñþ“xµòïäÚ6âMÇ2Ѷ$Ö’ëo&¢ì.I-¼ 'M¬Ù“•88–RàX9i®¶?ýç:ZkõíÎÍ¿véi¯×·;6ýØÚÿI¼Zùz9ËMu±ø×ì-5ÖÇã_°<ãçKM~½¹Ù·îÃ-5úöçfß» ÚÿI¼ZùzQz—P™M—1–z™$åCV¹ÒÕºl¸É«Nû7œN‰xØô‘fòÓ]l~5ûÎ>t´×ëÛ›~ì9ÒÓ_¯nvmû°Ý¯ô›Å¯—¡ñE‰±ì”ÚT}…•G‰ªlÓ³´¬¹›oüTžDbEx©ê!›ËMu±ø×ì8ùÒÓ_¯nvmû°çKM~½¹Ù·îÃv¿Òo¾^ŽrÓ]l~5ûËMu±ø×ì8ùÒÓ_¯nvmû°çKM~½¹Ù·îÃv¿Òo¾^ŽrÓ]l~5ûËMu±ø×ì8ùÒÓ_¯nvmû°çKM~½¹Ù·îÃv¿Òo¾^ŽrÓ]l~5ûËMu±ø×ì8ùÒÓ_¯nvmû°çKM~½¹Ù·îÃv¿Òo¾^ŽrÓ]l~5ûËMu±ø×ì8ùÒÓ_¯nvmû°çKM~½¹Ù·îÃv¿Òo¾^ŽrÓ]l~5ûËMu±ø×ì8ùÒÓ_¯nvmû°çKM~½¹Ù·îÃv¿Òo¾^ŠÀŸO ˜0#A‹„l°É) ¶’, )I7~Zk­Æ¿`yÇΖšý{s³o݇:ZkõíÎÍ¿vµþ“xµòôs–šëcñ¯ØZk­Æ¿`yÇΖšý{s³o݇:ZkõíÎÍ¿vµþ“xµòôs–šëcñ¯ØZk­Æ¿`yÇΖšý{s³o݇:ZkõíÎÍ¿vµþ“xµòôs–šëcñ¯Ø t‹f]ÌÕÇ&!;=§ò Sä›êS‘.ê0Õk 8/.b"-û‡@¹ÒÓ_¯nvmû°çKM~½¹Ù·îÃv¿Òo¾^Ц}=3œž˜ÐJ[%•¾D­b›I¨ÒƒV¯IÔd]j>³~Zk­Æ¿`yÇΖšý{s³o݇:ZkõíÎÍ¿vµþ“xµòôs–šëcñ¯ØZk­Æ¿`yÇΖšý{s³o݇:ZkõíÎÍ¿vµþ“xµòôs–šëcñ¯ØZk­Æ¿`yÇΖšý{s³o݇:ZkõíÎÍ¿vµþ“xµòôs–šëcñ¯ØZk­Æ¿`yÇΖšý{s³o݇:ZkõíÎÍ¿vµþ“xµòôs–šëcñ¯ØZk­Æ¿`yÇΖšý{s³o݇:ZkõíÎÍ¿vµþ“xµòôs–šëcñ¯ØZk­Æ¿`yÇΖšý{s³o݇:ZkõíÎÍ¿vµþ“xµòôs–šëcñ¯ØZk­Æ¿`y³SÓ™iñÒó×ËêJ•”‰ 4gŽ|[û†»Ÿ.zí7±gØ«¢º'6S]5Faé¿-5ÖÇã_°´×[~Àó#Ÿ.zí7±gØ~t¹ë¬ÞÅŸ`cÅ—¦ü´×[~ÀrÓ]l~5ûÌŽ~t¹ë´ÞÅŸ`9ùÒç®Ó{}€âpzoËMu±ø×ì ]Í^\jD¹é¯Ud¢:›jG—RÍ%¹Oh".“3WAg›œüés×i½‹>Àsó¥Ï]fö,ûÄàî×ÊûËìž¿Þtïˆkª]åt¦O=Õé­³\§ÌvKõ+Cm³)·fH|Ô~*UÐF|0>ççKž»MìYöŸ.zë7±gØ«&^‰ĆY‘qä²Óì8X-§PKB‹ïIî1ç‡?:\õÚobϰüés×Y½‹>ÀjÉ8—¡4Úu:˜Ò™¦S`ÀmgŠ‘2Jï$b2G¼üés×Y½‹>Àsó¥Ï]fö,û"ŒF!Lb‰ó·Ÿ.zí7±gØ~t¹ë´ÞÅŸ`N¬§/D€yÛÏΗ=u›Ø³ì?:\õÖobϰ²eèEY§¥Ka¤æqÆ„–8bf“"fQbS,KN‹Vq§**3ã‘t–HÍ-6—2© IšMM$÷õâ|só¥Ï]¦ö,ûÏΗ=u›Ø³ì¬òETÓTb¨ËÑí–“ç5ûúŒ¶Õ›>¯L«T©LT§Rdª{ÓæH’q"2Ìa+/Iî•!µyM Óç?:\õÚobϰüés×Y½‹>Àˆ·9ˆ†4Û¢Ž4Æ›òÓ]l~5ûËMu±ø×ì29ùÒç®Ó{}€ççKžºÍìYö\YðzoËMu±ø×ì-5ÖÇã_°<ÈççKžºÍìYöŸ.zë7±gØ'¦ü´×[~ÀrÓ]l~5ûÌŽ~t¹ë¬ÞÅŸ`9ùÒ箳{}€âpzoËMu±ø×ì-5ÖÇã_°<ÈççKžºÍìYöŸ.zë7±gØ'¦ü´×[~ÀrÓ]l~5ûÌŽ~t¹ë¬ÞÅŸ`9ùÒ箳{}€âpzoËMu±ø×ì-5ÖÇã_°<ÈççKž»MìYöŸ.zí7±gØ'¦ü´×[~ÀrÓ]l~5ûÌŽ~t¹ë¬ÞÅŸ`9ùÒ箳{}€âpzoËMu±ø×ì-5ÖÇã_°<ÈççKž»MìYöŸ.zí7±gØ'¦ªLÈdÒke8Œ²šÌÌÍ Iô—Xé7ö@¿Ã–—ú´Ÿø›QÏΗ=u›Ø³ì Åï}]w³‘ºkÔ×–L)ÆÐ“A+ Åâ‘cä—Hbr;ÓIúSO¦Ò¶ê%V ÜŒ§%§TÆO-¥/V¥æÇvU©¢Ã ùúK ý°¤ý)Ž«Yu8TºÖj¢d.›%‡bÌK %9«qœÉ%©'•dFdX¤‡ãøÓ:ú^?úÿý¿é8ýYûËa"ÊšTÖ‰´K˜æÄN2†HiR›}ÖÒj5æÇTÒWŽ\¸)Y9K>¾E­[e—8̺Ê#®IºÄ¦A¶•¥ 2Rd£I­8¤ŒÌˆñ2Ãx·PtŸP®O\©u*«rhÚmÆÙŒQ¦Ç4e^)Q¥2‘•*I¤òîŸÌËâ–ªÝ rLê,eHLÖš¢Ã¦š’„´ñ!¨þ)¯"w-J=äÉéë\Ï'ocš²å•t77b]!â’lÆ}-gNe&A ™ÊXøÊQ­%”·–üH²ž} b"T .±mëqåµ!œM>[JRqÅ&FXâXo¾‘9^55RJlIíÕÎT©QM$´°—–ë)kòЩáŽâÁ®­Ú Õ©Š´i†VDÜRnL…Âj"¥;j7M–ŒÐƒÊ¤§qž93ó1•3^xÂ*ŠqÁ[±¬w³lšu~‘LzErT9õj”ŠtQO'YÎÓl,ÖëºÔ›i=zKB°$™˜¯Ó-ªÕJ"%CŠ…¡ÓY2•Hm>i,TM¡J%8eþiýÝ"Án_²hVd;z*æ*2çÍv«ZhbdwÙŒÚPx–Z§L”eâš’eŽò‹HÊ]6›‡ŸŽºœ*{¿'©òž}&úÞBç³.:ÈÜ2ñu„X‘cŽ:fkŒ¶ÄQ*œË"å‰Kåá0–vVæd)¬)ãaÄ%itš%›†ŒªIš²à[ñÃÃô݇t¸ä&š§²ãÓ$3¶1…:ÛŽ¨’Ú]A/39ŒÈˆÜ$–ñf¸ëvÅ>¢ÝVù³ªÎ[)ÊŽ†8¨S”¦ã8zâpÔjA)DhÕ– N{†Mÿ¶©—»×z«;.­S.¥ã6–ã!Y–á2½a›†jd’œÉFg‰ˆ×¯ˆN­ã*´K¢ýŸV¸U6˜ÑÓd°Êã9PŒ•¨œe×LËó‘!$M‘”£ZH³6²-]ÉmV-Õ2Š» °·MI&Ñ)§V…' Èq(Q›k,ÅŠVDe@Ë¡Õ)H³+”’æ²ä©¦Åv;)tÖ‚md¥§*U¯ò‹1–_$ñÚG¸(õä@82\ÖÔòåT&Cf;ï’²dBõJ2tÑ•g­V V}äXÎ&­l{1˜§W*x ` =Ÿh®á£V*yETÿµš6³§I·]6Èñ,¿³eÃÇ~ü¥‡ŒB°/ÖûM¶©4(¬ÛPªoÜäù/MSé4º£JI-êžJTZô‰2ÅJ,03Ç æ¬~–TDg‹F¶<Ûªá£3#TÅ.mE˜Î¸©Ì0òÛS‰K†Ê\VgDgä¥[øp4hæï\F¥•>)4äv¥bªŒd›l:„­¸Fæ-¶d¤øë"IàfG¸oí˪ɇpÛUI¥_CvÌÒ8LGŒÊŽLtÌ\„)Å)ÂȲÖ($J%`E™=#QQ»)Òyw#2Ë”-ªm%¬RŸèÛu+Æòes,Ozq"ÄðÃZ½n ñF2ÑÅШË4SÕ´0ãÅ$–ûe¶Û(¿´'MÜGµ´fxr©*%(³dü'GסÆö#\’y„4mHaÈÎ6ãrÖkÉ̹H£8y‹%y”ƒI¬5Ý!QgØÒhlƨ&K´Æ¢–Ú2gKTt™æÇ iÏðýæ÷oV_Åý¤Å´¨ÔU½Wƒ"2—eFŒÓ¸TR°BÖD´™Ni&•`J"p ØÆµÍ\á:¶ó†´UM¯Y­?6’ÒéRØalN)ëRã.¼kBµ¾?Š„åJIFæeeÄТ ³+íÜo[Ò§Æ©³œœfER3$•!ÃlÐj[„œùˆðN8¨°Q¤ÈÏsY¸íz„–œÌi´øóŸ…2Ç„ÑߎÃÍ«;d´¥¤º§”³Èj$t(†cw…¬õçwצSÞÍU©¹2œó´ØóÓjuÅ©µ4òµiR‰Hñü|¹QÕù3ûgSô[cL¹äæñ²k°é,ÙqÝŽíbmªÒ©œ QQªÔœ‡!²xÚ#ÀÜ&³g4tžl¸`F}ÅÞ™¥šÔ ÖÚ™à¹X·imÒš‘NjbÒ…¢;,!ô¥¢^C%©· ˆðÍ›~˜ù=¤¯[dÙ,âÔSHM+TÕh(û>cš¢7Ó™)ÀÏy‘)%†u®|6â–ߣ*í6ãªÆ¥ÅK´æfËjžoÎŽR%4ćY3Ky‰N,¥bIN;±Ã!BÍxÞ6„‹ªß¾™S\ø®Ê¨F§¢3JF'V™!¦ß^·•‚Òf’BüU‘ïÄpÈ›UU1ú‘r)‰àÚÖÑÞà¶¿Ó—ü*n¼ÿÁm§/øT*#‹§}W[CúI$@¨´ž O$„ !'€<€ $@ 0ë°= ¤ý)ŽºIÑ…}…W2˜f]N/Ø‹¤ý)Š_é—üGŠú'¯i~“zähÓ¯W9ŒòÎ?œ¼ÿB»U¹œ{¸QË°Ž™0?’×ìŒw,Ê¢:_‡ü–¯drœ¾#S+ˆý}¯ñŸªUÎcçMúåÇnZÕt½ù)_ Çrƒ1.1ü” ¼Jâ5rxŽ…¿ñ_¨UÎcÃ}5̪‹¦HGJÚÿyþƒà¸®#¤Óþñ¾“Äkdq â=6®s錵«I§¤|”êSÒF>ïñOñ(õÍ.yÌxo‹tËô©'¥+ÿqšª,'¥.¸¿QŠðÄxY§Õô™÷ ±b‰lUWŒž”;þâýGÍUȉémÿÂ_¨Ô:1éiõ+óðÙ5¶ùW$ôµ#ð—ê>) cô2 QZw Æ9ùC}:uélÚÛòšÔÉü)ýCå<©“øSúŠ‘ˆo×S¹Ú[¾S@ú™?…?¨|§õ2 QR>~ºnv–ï”Ð>¦OáOê) }LŸÂŸÔT@7ë¦çinùMêdþþ¡òžÔÉü)ýED~ºnv–ï”ð>¦OáOê) }LŸÂŸÔT@7ë¦çinùMêdþþ¡òžÔÉü)ýED~ºnv–ï”ð>¦OáOê)à}LŸÂŸÔT@7ë¦çinùMêdþþ¡òšÔÉü)ýED„õ†ýtÜí-¿) }LŸÂŸÔ>S@ú™?…?¨¨€o×MÎÒÝòžÔÉü)ýCå4©“øSúŠˆýtÜí-ß) }LŸÂŸÔ>S@ú™?…?¨©uˆ úé¹Ú[¾S@ú™?…?¨|¦õ2 QQß®›¥»å<©“øSú‡ÊxS'ð§õ úé¹Ú[¾SÀú™?…?¨|§õ2 QQß®›¥»å<©“øSú‡ÊhS'ð§õ ß®›¥»å4©“øSú‡ÊxS'ð§õ úé¹Ú[¾S@ú™?…?¨|§õ2 QRà 7ë¦çinùMêdþþ¡òšÔÉü)ýED~ºnv–ï”Ð>¦OáOê)à}LŸÂŸÔTº„ýtÜí-ß) }LŸÂŸÔ>SÀú™?…?¨©€ß®›¥»å4©“øSú‡ÊxS'ð§õ úé¹Ú[¾S@ú™?…?¨|¦õ2 QR àõÓs´Þ\ˆÕHe–ÞJ’á(ÍdDX`eÀþñ¢î\ªåZÕ7Û·ã‘D lÓÀA‰à À$ ð'€€0000"ˆ&`aÖ¡´Ÿ¥1‰H„ÜØõ„lí¼ö«s$ŒÉFKÃ>ø ºOÒ˜×A¨Çƒ¬—S/:Þ šHñ5`¬02èÞdÑ<*˜‰ý®9˜Çfcþ]º#Gªšqñï?|cÛ“Ñ·šLk²UiŒÁ%<‚Q2f‡)T‡”[’g”ˆÈú©DeŽ'OhbøV¯¸õåG\˜¦Ú£ËiD¥4¬1ËŽìHÉ'¿§ 7cˆäiõ?ª-6­W£B^ªNie5¥“QT®£4¤ˆˆø’”¢Ãq€ãúÖ¹;CTM"ò¾·•'*&óaªÀÞ,ÚÌÛþ‡£)y];·Þ~o¿þ*|†ù]ÿ°ù[käïÿ?U«É­þy³}ØqôkªÀ­è•dÜõ©´©tj‚¥¥ BSÊ”“SªÊ“/&dò‹`eŽò…ÎæyýùQòƒû‘ò[`Ú67þŸjÖdË“7“¿0ûñÆV¦‡(÷#—&i#¬P¡´ô‰ENY2n(žÎŒMdd”ê¼²#Ä•‰íúÛsE´ÚÊkõ¤Þ‘£Úe! ­9Ì^R’“Á,ã›q¨‹yã¼°#ÇvN….û~ݰ´L¬ÔvYµšY1OF¥ÅëœÕHN¥&IÞâ7¨È·ýÆ6šÒm:س«VœúÜ‹qér T*»PŠY2³$%D¦Ì2AGè< ´ô--:J·­c¸#¹M¸#9*Y˜æ¤­´´§>ŒÔ[ð$þ÷Bˆñà2*úeŠÓ2‘{@«N¶TáφÜE£"˜ñ5™á›*Tf’#"24æÜ,Ç¥;uÍ4Ú9×…V­H£3(¤T¦Ám¤ëaH=[L²•å5|¬ÆXð"3=e­Zp¹èÚªÙ>Rí<‘ý®éí9ö¬½ ñ1Ö£ËËÓ÷÷Ó½‘`Ð4[iO¢Õbkµ±Í÷ u¬Å3ªQŸìr¥F²J¿Ë4–µàïgÐ+òë÷ÒÊäÑí¸;[Ñ’fZÕ`µ8bDM¬ðı<8bG—¥+¦Ï»tCfÇ\uŠí»1N\7\f–P¥k|‚"&³óÇ4š ¿©ö]Z§½ Ù”ÜS‰=¶¼²-äJ"ı,¢2Ä·+èÀÂÇx^:!»,:Šf¢Ö¯Ç?înÀÒO[ÔkRR”á»%be‰b5w>‰éVîh÷]J÷e—*ô™ ©êÎã¦Ò&ID³,U–™©;ASSœÍ²‰·Tæ-$”á§) ñÁ[ü}×Ù:a°šð€bçn®ãôg-®MrR":Z§¶“wzM$£,·‘”_x ÉeQ´yX”ë”êS%U›~Ž Í–ˆâ™«zL‘†­ÂÁG‹÷ y:Ø©q™©ÞTÈ4ºzê ÑÞeI#m$fd§Œò¥X–òÃ=æDf50Ñ¥2ð‹S/H”ɳ^S1`±s< ‹;©A–¥8žå/Ã@º_×vŠ/í‚î¸ê54ÕbÒ´Fc-&ãŘҤ¼^*RJZ~8––ã#hHV-·£X0ÞªL¡V¢TÓ.¡²C7ª´…©Ig?BRdiIâeäžïÀ}¬-÷èÚb¢ÜúeN}”•Å’ät¸m£Èq+lÔX Ì²íø‘u(Ñ.‡ZÒU—r:MÒäHÊö+ÈJ<¦hAŸR‰)þcšjºJ±VÒÔ¦nº‹–Ã4Ü!¾F㨈ëJAâ‚Êy;Ïñ‹~ãÀ,ùTXw4 75u*BþÛŒ‡…-FG¤Èñ,q-剖¸g´“Gµ©4ê´*æ…‰Deµ”ZÕ ,:ñaÐâȲ)².Ÿ̸àK¯Gü“£›vö§Uާ ®£eämYÅ|‹èÌó+6ô¬±À¼’ݼsm/IÚ'³iU6õËrÖ":‘ƒ1N¹ƒ>„¤ÜOŠ\ ó«v=#Cà*-j\´®ªz‘ Ök-:²ý›6´™‘Ÿ<©<8‘/¬ÀW›Ð,·/ -¨‹‘‚ªK¥N¢ÚâàP[Å)ÊX,õŠ5(Ë÷|œx”Ú0¯›R:ïÚef™Pª",¸Û:™–…âyZ\|úÄ%Å'WœðËœŒ÷ ZeûJ¬éÒ¡wÜ5ºíêZbJ¥©$ë ,ÚV•%X£!`¢$ž&xõ‹V’ô“dË›dMQùIZ£ÕØ™>²Ý4â-Æ^m^S"ÄÏÅèÝŠO£cé3E4ªÞœ>KY5‘Þq²rt†¶š¥´†YÁYú73fñz ð3߈¦ß0G³Uw[WTKšŽÄ³‡-Ö£)…0î$^JŒñN&EŽ?¼“,Hñ‰#IöMOË¿©u‡êÔúÔ=– Ò!8ÚáPÊReŸ f&ÑáÐXôîÇS¦ $@ªXRh1t‹XºäM}&´%ˆqši+JÈ—‹$â–F’Þ•ÛŒ>µš|;Â5¬æ‘¡¦¥:*Ÿ„©«'4æ5bD³JRDœIF¬OÆÁ>.úüÝ ©»^⟠ï¦Ô*öÚ ujs /+D¥§)DIVâN¤Ëu¹´›dLð—µïÕ¼ô84¥Ç“+ex²8i’DY Ï鼈ËÜcGk_Öœ.z6ª¶¯å.ÓÉÚîžÓŸjËПj<¼½?qàÚF…!¥F®\wå:ß]i|$?Jc ¤´“š’†ÌÒe¸ÿbdc‰j1NBL3}‡Í‡TѺĶה̳!E¹I<1#.’‡Ñ.ì:¥M‡T½ë ˆˆÊEFS§¶]Y§¡…¥¿Ù£6&IRŒŒäuúà‘]z¡*™âAzS®F`ÿäš5¥ÈŒ‹ùÂà Äð`H@’Ÿ<©¶Ìš=ñT¹¨”Ê›ÈñäÌŠÛÚ´’_Ròç#ÃIc‡Qu …´wB¥i"ë‹qÑ ÏŠUS¥Ó™£èÜ“˜’¢2ÇT„oÿ8ÇèRî·­ÛHÔºÍCe™Y¥”x ê\^¹ÍT„áŠRdî#zŒ‹ÜbùNÓ ¬õÇ£‰S*3pX}ûí™ÃþÚ8{: È’f³Ý†)Çr‹¨ÀRœÑƒ5ûºý¬ÉªÂ¶-z%bS.IÙÄ£”Im¶‘†â#I`Xt¤ˆŒ|•¡IÍé.j¹]atÚüw$@«0Á­.! )Ï£5ýÉÝ›¡DxŸ@ßRïû.©H¶ez«"I¸kÔ`UŠ·H³<•'3dD½ú¶Ï 8™d*Ù©Ò­‚ÜiµlZp_‰Ê0¼ÎšãD¬‰#V#eÑŽ&{ˆ€UêúeŠÕ6‘{@«N¶TáφÜE£"˜ñ5™á›*Tf’#"24æÜ8xÇ:Z÷õ§ žª­«ùK´òGö»§´çÚ²ô'ÄÇZ//OÜxPt-p[6åðÜ»¾«Hy•°òЉÉ™‘“„…‘™pÝ¿<:Œ-öŽÿ‚ußZz•ʤzÃm³5qÐo¶ƒ\LR— ³xÊÜGûÇÖcåYЗ'i–‰£¯”ÚÞT‚©{vÁ†«xòêõ›þ‡§1y]·ít…xèÒ‹¢…£É• ’*³“)÷d6¤“8) 2ÅIIŸÑ!$DG»3Ǧàþ’tUUÒ•µ¤Y—,Ø“"S•Ø<œê’že¬‹y~ÕIÁ¬LÒ{ˆŒÓt/E½uV¦ÞqéÑ­ÚÛô·–üCKlÜR³23%îA±2"Ç~%]ÒîŽWar4¦+LVi•˜Ç"¦Ù6DD“*x(È÷tt ›.ëzã°4sK£T6©”jQǨ7©q—5QÓ†*I·¶½é3-ßyÙhn“A¤h‚èÒMZƒO®Hƒ1¨q£ÎkXÊHÔÑ,òžã3×þwt˜³ÕôgoÁð§¥Ñ؃7âò«±I)”¤‰Â4eVãI­¸÷`¬:7 Vˆ®ûU8¸´yxT¥A©Èn[S[ާ‰*J›5$ÒûõHÃw_G®‘o+Hšf:…Âõ^-²ÜTÃbLD¤ž,¦j%©*J¼SR—¸‹ ¬€~|!èõXÍR*j·ì¸4WÖöÃ2Úd’‡ÉFœò‹r”DØ׆<#ÁÖÝ£N‡xÝušdj¢-ÊR¤±Js2· (IýâÁ£,ü¯à?:W»­nlmÝZUë1ir)ꋱ”Æu¸d”¥[ÿåUð.žz¼èvê.k~ä}è”«Žœ¨ŽKi£pØVU¤”i-æX8®Ž8 »^VµˆÝõ£;Ž£LK¡ÜðÒüèq’ie.êФ‘$¼”šm&EÀŒúÆ„»mRtwP~¥kÑmúÉUÔÍéTBRp[¹wbh5™ãÐdž±£¯éVÖ‹¤KTÄ?T·í…^¶r)ãSdÙ¸”+ye$¡EŽËøýé^ÿ±ÞÑÍ~Þ·ªò«ÒëõµU oE[I€JRh#YoÃ&R•ÑÄ8ö«f[° ËZ/št´×õgR&‰Ò Z¬ÚÌÖ¸¦Ö©îMšU‰:©fBVÛq*²™·ž[ºHÏàê §F¬Æ»æÔ.–»ôd-Øt¹jJÝ”¬=BT¥ ÍI4%8’Tx¨·p>V°t§cò5•S¹*s`ÕìØÒ#5 ¨Šq3RãDÒr¨·$É)O•†üxoaë"æz÷¸.ʤê]VB™F‹&¤>ûšÕ›k2mX+V](é=ýAÉ~ V–Žê²£¹T6ëµ÷à¿%Ê|†ähM¡âh³âJqY‰EAAn3ã- T-¨7É­Û+¸ª2˜ôx‹$)ƒ’³Á:ÒRˆŒF’ãžà7ž ×u½eßóª—-Ca†í)ÈèsR㘸n´¢,“>„«~nÍ9`*eFüÔ–™“Ó {&â¶7°<hA‘¬·‘ôô‘a˜ g„õߢÖ(,ÓéQi5·©äíf&Í›pÉ8jøtë w.8N‡«V½2¸oY‰¹îÉò[f˜Ô¸éz"Rf’2RMXæVñá¼_k “Uy&R‡Ö’ŒâÍJgˆfdX™tc‡ˆ67EPëw-R´¦‰¥O˜ô£lF±f¬?–#\ÐÚOÒ˜©Õþ™Ä[)?Jb•[˜ÚjÅC3y)'˜ñ{*TfDfhI‘biWOPùûG·]Í"i¢&gÏ;ÑyµøL®#e!RŽZ]dÿÙr=¯Ìåc–‘Y?öcþÀýHŽtO‰th†¦W«“Än߃TV9hµ“ÿf¿ì é5¥y4*Éÿ³žöGRÍ‹±Î™ð³D¿'ˆÖÈâ,oÐkêÇ-¿Y?ÿ€ï²0^¶nUt[µ“ÿø.û#©jŠ£œ-Q]?*ÓüFüE™ÛNéWEµYü‹Ÿ ÅvλUÑlV$çè/Ûà±MÚ>aWxb<-NY7ôZõŸÉ¹úƒ–-æ}­gòkýÊ*–êo[ê*“£Þ‘prÀ½Ï¢Ô¬þQ ÆsG—ÑôZUŸÊ/ôè¹GÌ7Eû]QåMw Æ9ùBææŽ/Óè´k?•Wè>£[ÿý¬þUBÍ7­õG–ØÒ-uG˜TÌ@¶žoÿT+?•Psiú¡Yüª†[{}Qå;Åž¸ó ™ð-§£[ÿÕ ÏåTÚ_þ¨V* ÛÛê&ñg®<¤ÛÍ¥ÿê…gòªm/ÿT+?•PmíõG“x³×aRmæÒÿõB³ùU6—ÿªŸÊ¨6öú£É¼Yë0©¶óiú¡Yüªƒ›KÿÕ ÏåT{}QäÞ,õǘT€[y´¿ýP¬þUAÍ¥ÿê…gòª ½¾¨òozãÌ*@-¼Ú_þ¨V* æÒÿõB³ùUÞßTy7‹=qæ"Ö-œÚ_þ¨V* æÒÿõB³ùUÞßTy7‹=qæ Þm/ÿT+?•Psiú¡Yüªƒooª<›Åž¸ó o6—ÿªŸÊ¨9´¿ýP¬þUA··ÕMâÏ\y…O¬@¶óiú¡Yüªƒ›KÿÕ ÏåT{}QäÞ,õǘT€[y´¿ýP¬þUAÍ¥ÿê…gòª ½¾¨òozãÌ*@-¼Ú_þ¨V* æÒÿõB³ùUÞßTy7‹=qæ Þm/ÿT+?•Psiú¡Yüªƒooª<›Åž¸ó ¶óiú¡Yüªƒ›KÿÕ ÏåT{}QäÞ,õǘT€[y´¿ýP¬þUAÍ¥ÿê…gòª ½¾¨òozãÌ*| o6—ÿªŸÊ¨9´¿ýP¬þUA··ÕMâÏ\y…H·›KÿÕ ÏåTÚ_þ¨V* ÛÛê&ñg®<Â§Ô [yµ¿ýP¬þUAÍ¥ÿê…gòª ½¾¨òozãÌ*d-ô…yG²ÊÍ]yš%hÙ[m Å+Q©I5’s™¨ñ#<7áÐ>…£KÿÕ ÏåTÚ_þ¨V* ÛÛê&ñg®<¤ÛÍ¥ÿê…gòªm/ÿT+?•PmíõG“x³×aS à-œÚ_þ¨V* æÒÿõB³ùUÞßTy7‹=qæ Þm/ÿT+?•Psiú¡Yüªƒooª<›Åž¸ó ˜mæÒÿõB³ùU6—ÿªŸÊ¨6öú£É¼Yë0©ðbÛÍ¥ÿê…gòªm/ÿT+?•PmíõG“x³×aRmæÒÿõB³ùU6—ÿªŸÊ¨6öú£É¼Yë0©m-_þ¨V* æÒÿõB³ùUÞßTy7‹=qæ>·›KÿÕ ÏåTÚ_þ¨V* ÛÛê&ñg®<¤ÛÍ¥ÿê…gòªm/ÿT+?•PmíõG“x³×aR01mæÒÿõB³ùU6—ÿªŸÊ¨6öú£É¼Yë0©¶óiú¡Yüªƒ›KÿÕ ÏåT{}QäÞ,õǘT€[y´¿ýP¬þUAÍ¥ÿê…gòª ½¾¨òozãÌ*@-¼Ú_þ¨V* æÒÿõB³ùUÞßTy7‹=qæ1ÛÍ¥ÿê…gòªm/ÿT+?•PmíõG“x³×aRmæÒÿõB³ùU6—ÿªŸÊ¨6öú£É¼Yë0©¶óiú¡Yüªƒ›KÿÕ ÏåT{}QäÞ,õǘT€[y´¿ýP¬þUAÍ¥ÿê…gòª ½¾¨òozãÌ*@-¼Ú_þ¨V* æÒÿõB³ùUÞßTy7‹=qæ Þm/ÿT+?•Psiú¡Yüªƒooª<›Åž¸ó o6—ÿªŸÊ¨9´¿ýP¬þUA··ÕMâÏ\y…Lì[9´¿ýP¬þUAÍ¥ÿê…gòª ½¾¨òozãÌ*@3«ÔŠ• ¨å.¯q&´”)ÆVe™´ÓŽ•Dxt—Aàcl‰Ïm‰‰ŒÃÐÚOÒ˜©Õþ™Ä[)?Jb§Wúeÿó寯?‡žhÜÕù|F¦W¶—Äjeqë \®#W'ˆÚJâ5rx޽…ª¹{µõçð󽚿/ˆÔÊâ6ÒøL®#½aÑ¡«•ÄjäñI\F®O×°µCW'ˆÖÈâ6RxlŽ#­en†½þ# þ#5þ# þ#¥mf–Ãá–ðÄx^¶±KшïHËtb;Ò.[n¥ˆïAŒsò†C½1ÏÊén€Ä 1$¤ø| ëBzÀ@ ë'¬@žð'¨@ž¡$„ !H8$@‘'€ƒÀA€ !H@ à O````D L:ÀìCi?Jb§Wúeÿl¤ý)Š_é—üGÏv¾¼þw£sWåñ™\FÚ_©•Äw¬:45r¸\ž#i+ˆÕÉâ:ö¨jäñÙFÊO­‘Äu¬­Ð׿Äa?Äf¿Äa?Ät­¬ÒÃxb<2Þ ÖÖ)bº1énŒGzEËmÔ±è1Ž~PÈw Æ9ùBÝ-Ð& d”ŸO€€!=bOX=bõˆ À@žõÔ $ I àˆ ðbx0$ I< à H"I‡Xu€€èm'éLTêÿL¿â-”Ÿ¥1S«ý2ÿˆùî×ןÃÎônjü¾#S+ˆÛKâ52¸Žõ‡F†®W«“Äm%q¹„õˆ!=` õˆÖ €OxÔ OP€B€$ƒ€ H€ÀA‰à À$ ð'€€0000"ˆ&`aÖ¡´Ÿ¥1S«ý2ÿˆ¶R~”ÅN¯ôËþ#ç»_^;ѹ«òøL®#m/ˆÔÊâ;Ö¹\F®O´•Äjäñ{ T5rxlŽ#e'ˆÖÈâ:ÖVèkßâ0Ÿâ3_â0Ÿâ:VÖia¼1o G…ëk±]ŽôŒ·F#½"å¶êXŽôÇ?(d;Ðcü¡n–è @“2JO€'À@ž±'¬’#3""33ÜDCšo]Ñí½È­¹RœåÝL(nÕágF¢"d¨ò Ë.bY\|l7ýä1š¢9ŽwÐÕ£M»îIÌÖß–Å&™J“RšäU¥.m#v¤¨‹Æ4ð=Ø…*Ѧ¯C5«â ü´JjªÅ6˜ÛkI4· :Çs‘¤ÌðGFXN!5Fp)=b}¿Nr¯_§ÒZÇY6SQÓ‡N+Y$¿í™á£K{GÒhÎÛê3`Ï9L¸¹Ž!jKÑÝ&ÜI’ÀŒðèàTDàq gÐÆŠmËŽÌs^3êÚQHU1¨KBê#´k}ÕЯ*1, .²âdF™ˆã"‘ÀAŽ]b‹  òSJuÞ$¬ò"§6#7A(М$ÿ0〨Üj‡¤¶lYšµÍ~[,0óG™·’ꈛqÄŒ”_õ—TH¨ä;Gk™¦½‘b7.thÉ¿1ÄþÅ-‘®:á%)J¬Ûð-ØóéÔifQäG¥ZõIÕ©qÓ–¡QR’˜Ž¹Ä˜F\ÙK£:”y¸EQ"¨Bžð$@‘$ì :À@ô6“ô¦*u¦_ñÊOÒ˜©Õþ™Ä|÷këÏáçz75~_©•Äm¥ñ™\GzãCW+ˆÕÉâ6’¸\ž#¯aj†®O­‘Äl¤ñÙGZÊÝ {üFüFküFüGJÚÍ,7†#Ã-áˆð½mb–+£Þ‘–èÄw¤\¶ÝKÞƒçå ‡z cŸ”-Ò݈bIIð$øÖ „õ€åïKJ Næzð¸dÓ¡ÐíóK¤íFBXŽô³úÔµn"ijOAˆ¾S-Šƒ¶–•äU/»2å™[¥ª¢ë4j®Òé.:ÍÒQ£)`‚ÇêñHpÇzò†èV]6›É´êr×&QëõŠ){åx¥† ñRøÞ?".55Ó¹E‰0‚ü}~«:NSñ²« ð>ø USTæR¶hïû… Kþä?꣱hqUÿ8õ'ù£Ò‡÷Bš:µËÅzcR+’ÓþV¹YYWà#!S©Þ;V‹©3í¸SÞŸ&N¿6ÒêË*O&RË•;ºO¸4¥xü¶¸cT[§rlXtö E‹¯Öêši8fÊœq33è.‘:³œ×ƒU15M8[-8E«$æ-GÐ’e tŒÿš\êh™¤ýET2ÖT¾^¼ÃD¯ÝDÒ73Qg=ÿÀÇhÆñùV©TÑNÛdJ¥Hƒõú½n‘;äžl¥‹»zHntQ¥)V¿_¦Æ¥"kõ"BáÉ[ù6Ò‡N’ržsÁÍÛËIª™™ÌZ®V`E¶tŽÅÜKF€Å¯OQË9!ܲ]ÿœ¥#y—I¦ÞW SFZ4³­‹BS´™uÚSuÊ­B1ä}óxÕªlœ-éJŒ°#êëMO•FFÚ\Iš\JL™á÷™`8¦$‡¢JjTgTÓì­.6âOJˆñ#/¼Œ‡,MÒÍ¥p=ÊW®‰©Uªá‘kgÆ©=ŸQ–ÚÉG»~ÿ÷ ê‰ø [4Û&u«yZUWêT ©œÊjä ‘!µ°âIm¸E¸Í*À³{ú±>K«Ð)”½<ÞÚG«²NÐ-ãjªÊU¹2åÈmGh¿Š×˜ú²–;Œq]ÉX»4³^‡n±MªI¤FRšˆÆb#< •)9–|Lº7 „µÔëtûFí¼ÂޢŽuÇX‚õÅé*~Ùm\¬8áÌZIA·¬5b“JÍe½D¬¾6ì ±fi&ŸÐnм,ØWe3ë‘ K\W£-~Y%ÔžS=øaÓÇ£ ­iVD»²Õ©Ó­ê}2‘j¼—)t†–¥6Ú‹5,÷©J2,U÷áŽ8άëg˜ÞœÅ×á Q£\És-K”©N³)Çe×¢6”-ç#=bÉÇgÒ¥pã€Ç£_ü[ÍŠýKÂR¡RŒO¤ÓmKLWÚ3ñš&ñ4$8‘$̺wŽ%wJIƒ¥Wo«^ÙHL¤8™Ôç¥.SS5¦£{9« ÊÇ ˆˆ°-Ã`î–¨tˆÒ]°4sLµjò›Sk©í®Ky¢Q`­Nr"hÌŒËè#ìçûÁ•–Ï«Ó¬Ë I÷Å¶Ó P­&‘@S¬â„£:Ý#È¢àÙ¡DJ.”–%ÒCï'H—}ÁÆ›U[•6»[®È]>tµk^‰¶É·Ò•‰¡YIĺ jÃÅ[ÈæhÂc³NÙÑ{óäÉ׿ÚYeIäÊYr§wIã÷½ï”ví­Cf°E·àd–¿Y®ujÌã¾IeÌxx»ðäÆZ™ž&\¦\Uýh®!5+†æ— UEG•r%8Ó«ÌÙ©E‘&gÓ¹pºA¼ê·Å^F¬šubŸ«"¡™KM‘- å2C„d“Üx+¤ñNì8râÒ¥Nf’h÷)+¢ÅU»¯Km4Œ¹Tx'VeâDE¹X}ã}Ï›"UnÔÑ*…sÉmÄQ3u,›„dµ´É‘%µ`g†|KpÆhœrQV™ÊYsÎ4x»KË{Q&–šÌ£<¨#32Ic™î!Ê’àÇa1‡.©Pz¤hè9(Y%¢W߫Ǹ‡ ÆŽ´2Ô¦L Ï¤@¸mÉË'$Òç$òk°'QoBð",K‚ê#-µG,!MTù±àÂaɤ8–™i´â¥­G$‹‰™ŽÐÆ…ß {ZéM-«Õc–$cŠRäfTf³?óTãxÿ ·¥Ê¾‡Ñæi6ÅMÄ ¢ôÇ'¾Î%›Fá ÿ‘ÿV´ï—èT‹½‡"96¥rCÙ=É&Je*^gLÈÒf³^âé,:wŒ*ŠªK–åUíëîȼ­ ·: E—9Yo¸¼¸“Q¾N%«:[û‹qoîcofÜ5Rè§\T§2L‚ñ:Œz] Iÿš¢3IýÆboJ¥:µuTjôªG#Ęñ¼ˆDþ´™5oQ²§ÅÇ"À°#"à2¦Y‚$„ Äð'€€0000"ˆ&`aÖ¡´Ÿ¥1S«ý2ÿˆ¶R~”ÅN¯ôËþ#ç»_^;ѹ«òøL®#m/ˆÔÊâ;Ö¹\F®O´•Äjäñ{ T5rxlŽ#e'ˆÖÈâ:ÖVèkßâ0Ÿâ3_â0Ÿâ:VÖia¼1o G…ëk±]ŽôŒ·F#½"å¶êXŽôÇ?(d;Ðcü¡n–è @“2JO€'À@ž±'¬ž±zÄ à O>‰Y«Ðå*U«:™!m›Kv$…²µ ÌŒÒf“#23"Ý÷ÂqkqÅ8┵¨ÌÔ¥&f|LGP€B€$ƒ€ H€ÀA‰à À$ ð'€€0000"ˆ&`aÖ¡´Ÿ¥1S«ý2ÿˆ¶R~”ÅN¯ôËþ#ç»_^;ѹ«òøL®#m/ˆÔÊâ;Ö¹\F®O´•Äjäñ{ T5rxlŽ#e'ˆÖÈâ:ÖVèkßâ0Ÿâ3_â0Ÿâ:VÖia¼1o G…ëk±]ŽôŒ·F#½"å¶êXŽôÇ?(d;Ðcü¡n–è @“2JO€'Àn¬:,k’ó£ÛÒ§;ºœ¶â†ã“ÆÚÜVTCZ1,Æœ|mʼn‘–™ÀÒåFôYF©Ýµ{6ܼ—rÓž’Ê!Î¥lÍË[¬éiļác‚e˜“Ž*=“yÈ(fÅ£_t§3¯ˆh§<­¡¼yÛÁ>2pROļbë!ŒU4,Õ;>¡K²Š¿SU‚ùÔգȥ¼ÛfIJ³+^¢$g%¡h6ü¢4«¨Æk^å“GUf5»Wz˜‚3TÆá8¦EÒf²,»¿ˆœÀÔÚÓm»Š¥L]R@ªÍ€ÛÄÂåG†ã%Ã4‘ Ö’2%­±ÇÆ.²ºnn*ÁÖè÷©´µÏý¥BótäJðIj¬Ž~Ñ^)jÕÔa˜OÈ\uµ|R`Õj½W8 SâÓ\uKd›5’ZqŲ6÷' Ä~6;…f]§tã5Z—mVcÓJÔ×`º–•áÉfœ¦JİÀ÷ã¸"¨‘¥°¯PëT ˆ‡]¤T)RVÙ:–fÆ[+R ̉D•‘–$eÜ}C^$OX‚ÖOXqfÎ…O·)Õë¶´õ%Š©)p#E…µIy¤žStÐkm(F;ˆÍXža¼|¯;N ‰E®Ñ®«TÚºŸm£Ù”Ãì¸Î¯:lÍDGûT™`£ÇýØÆ´ ˜ ½bÙ¹(Ñ™W·ªÔèÏ`M=*!ÁJ"#þCsxY±¨vŸvE«;1»¹Fl9™8ËŽ´¶²Ä–¬äjR°<¸ˆÌˆÏf<ÞM¯rÆ£¦³&Ý«³LY¦cœK #è2Y–]ÿÄ~áZWTè'¶kRaÌpÚŠû0][o¬³b”(“‚Œ²/qcäŸQ†`i@eÕéµ=AÚuZŸ.Ÿ5œ5‘å2¦œF$J,R¢#,HÈ÷ð2‚@€ð'€€=Bõ$ I 6ŒíFï ™ÉUVèðd¹î5¬Ltš’„™§Ç3‹m%åcÀDÎ8ŠÀ Õénεnúµ8R`ISdœ5„G⨋©E—Üd2›°/·m¦ì«‘n8ÙºÚK|ÍH#"5eÞX¨·ýåÖ\ à6Ô{fä¬Äve"ß«Tc2x:ôXn:„$Œ‹ùI‘‘™t‘‰$@‘'€ƒÀA€ !H_ôm£9¥½W¨³Un$¸Ì¼ºl%2kUIl –ëh<Ŕҕ7ÀñÎ]F"f#ŒŠ&™uNcp©°¤Í”áàÛÚSŽ+ø%$fbÃoYsä_´kRäT·œªJn*Vý=ZÄ)ÅdBµkR1NcN'ŽâÄË, 3* -µ-\ÅuW¨´ -b¾Ý¢ôd§¸á¶µ$ŒÉ¬¦yqÀÌÿ˜ÔÒm{–¯éT›v¯PŽÁ™:ìhN:†ÌºIF’2/æ¨01•M§T*sÑ›TÙn’ŽÊœqF]8%$fbå_Ñ̪.ŠÚ¼ªÔaN*×$É¥M¦› iFÊ'³^*I¤“Ò„ï3àDf™ˆ0$@‘$ì :À@ô6“ô¦*u¦_ñÊOÒ˜©Õþ™Ä|÷këÏáçz75~_©•Äm¥ñ™\GzãCW+ˆÕÉâ6’¸\ž#¯aj†®O­‘Äl¤ñÙGZÊÝ {üFüFküFüGJÚÍ,7†#Ã-áˆð½mb–+£Þ‘–èÄw¤\¶ÝKÞƒçå ‡z cŸ”-Ò݈bIIðý F“/LVsQcºû‰­ÄtÒÚ FHC©ZÕpJR¥ð"3=Ä*À@‰ŒÀæM'ßUkKJœ:5³H ÔÝ©Kmu$Ç|æ­§Që§œRQ¬B‰Y›JHÉX§2]%·^§x5詚„H†åE׌д#:ŸÏF}jA­Hë,L±-ã…€c©Ès,ÈÕ©¾ïU¦G¨IS÷ʧ=-Ô-fâV§”³é#tͳ=ëÝŽ"ÙV‹V¨xAÛ—•¶O&ÇŽTõ±PmxC‡ ¶›'šZü–̰t 2hB58kVT¤’’Ä÷àII".à6  < à OP=BIPBƒoèž"î…ÜTc¹d¦[oÅ£&BŒÑ4ƒS4E™JS˜lRM«qa­f="­yèÏLr›šýiØ+§BÔd4•4ħH”´¡*pÐY³šHÒ’Ç­¢zïF¥W®hóã±&Ò©)j’fI–öƒ¨Çéˆ×ã§,å¿y¡Ô¥Ñ«Pk÷ ¹d7&:Í$¢KˆQ)'î=ä[ŒYÞÒÖéõX´j „º»'¡"N“´£#S´qiBTdX’ $xaÐ5læ8'.O«Ç…Z´´>Ú¶nšãtÊ3M8ª U ¦Ô­Fñ¸ÞÎê³Q’µ†i%—V'źf¨1VÒmr¤Ä(Pv—’ã‘âJÚmÓBu„NRJ<ù±2,1ÇQ`gP à3¦ŒJ1"ˆ<ž }¡F“6c0áÇvL—ÜKL²Ò kqj<”¤·™™™tŽn\Ú&¯ëZ<ê•ÑO©ZÍ¡.Ãj„ÚÛâÌÕ Ò⤡JK™Ô‚^O%)Ã"B5S‘Ùªõ”í«PÒ…‹ øÓî(LI¶ŒÛ6–ü}r\—¬p3ZR¤¤Û/-ÛÇXt»Î&´i@­Ÿíjò%E¤¸ÚŽL6õ̩׌¹ƒ&Xî&Ö¬GЏŸ€ŒQ1Òìíël¢ø=!ÚÖ¥"¥G¹©U¹)¬8J4Ö™[†¤—”²žüÍ üS%–c3Qjn:ssmÛtkFï©»E¥7Stj’c: ÛŠ×“ÌœgÛ™ücZ8–·b}xoîeØÔ£×êÚ^D‡ ÏY‹P"A˜Oš°q*šËNS¬Z·â”–ó%a˜‹¹(—DvbÖ ÏmÈWy:l<…g†ÁÆRKX“ÞÑ‹ÜJÃ{‰ÿ(±à³¨d± $@ 0ë°= ¤ý)Š_é—üE²“ô¦*u¦_ñ=ÚúóøyÞÍ_—Äjeqi|F¦WÞ°èÐÕÊâ5rx¤®#W'ˆëØZ¡«“Äkdq)å¿¢Vy^ӨͪýªÑ—4‡ñòL±è.‘˰iÚŸ^v߃T Ê¬2âÛv5¬ò´’Òm“™ˆÒdx‘–ìÆÿØÿÿ§ÿŸýbH´YÔ[žä¦¦  ÐâÐàß*‚*5Ç&¨Ø­HtЖu$†ó)&Ù«Z¯Õ»ÆÀ¥+ÄÛɈÊ]vˆò’§[h‰¥ÈuX­d‚3$™'*èIb¥$ŒËíÍÕ›èë/{cbµ=‹FUЫ†àz¡"ü*zIÊ£æË1~S!JÍ“«FLM&¬ªR1ÈyGË–Ýù]‡Êj¯Ë•›/!m®j¹/jÉ›eÇ&¯cý¶».9÷gýÑ8ƒ6òb2—]¢<¤©ÖÚ"irV+Y ŒÉfIÅEŠºX©FI#2B±l9¬©èp’Ò]q•-©®-$¶ÖhZ É~RV•$ˤ&G¼…+SØ´e] ¸nª/§¤œª>l³å2Ô¡¬Ù :´dÄÒjÊ¥#‡”cY4æi¶Ò‹J¹P]ÍA¸gΑN‘]ùš¨K[M:Û®+"d0jñÌ‹Xj'jRs’ùº³}ýeïlk#Ûz.“qI·#¹Lzµ¢zE9º¢•%”S%­¢s2Sã£y–2zÈeè¶|뎻ÖK“‡Z4.• åIˆH#&–hÇ[¦jpϧ*›IùMpÝ–¬_;j—&墱=º%J"â¹9¤º—ß‘LS- X’ÜJLÒœ1Q™à¹-‡èÌÈ€Ë.ÊtÙŽ‡&¸•<²B–hAüedBÕoÁ*>‚1‡pÛZ/·b¢]Àºm":Õ‘.Ϊ)„)]DkpˆÏî=$¿Žö²TÍÍl¡—.Gö.ß}Jcû›<ËZ¢˜Dïìó'Å&ñQ’·c¤ Ò™aR¨Ë¼§[“.™ªz=9çštu™Ï3Î9©i)Õç<ê5fiH`n"ØV4¸ÍJ‹MiöA-·[˜ê´™bFFKÀÈúÇâ-‘`K¦µS‹;ð^dŸjKsœSKlË1-*%ài2VýøþáÑEr¥¥+ñ´vB¶Ìüê;5y)Ìñ`†”Kñ^&j"Þœ0F¢Õè<$ÅN–ÿØß÷í `p´ffi¨’Q‡â“n',ÉT†ËÞ[Œw®æ¢è’Ø8årÍ£QVmŸ”*ç]— Ùs¸Y°ÌœpèĺÇF| Ç|Oô(ÿêXâ¿Ø¸$izÖnÛ©Réó>OVMNT)ë–Ú‘´SqI!4dxå<ÙŒ°#,§Ž%’xV%‰6#S!SÙ“äÚy™®- IôTKÀÈúÈ}¹º³}ýeïlpÜÊR‹i[”EÊIõVn7_®½EŽŠ†¸B Tv–¦™^¹×GˆFY±,ªÞ¢°ñÛvRo‹Ápí÷ÑQÚªÐ*ï°ÓÏ!ä¦k˜Iej#dÝ3^'VÙòQc8KjÔ°ëôçgC¡¼ÛMN— Dì‡ YãHr:̰Yø¦¶”eÇ,Hq}NÒѹQÙ¬›pJ˜úq©œ¢½C‰s Z’¼ùL•™8üK‘[ÐÛW,ÝAvÓ¹)Ì´uŠÒ‘Y¤;-Ù$u99d‡ØÈ®“V$xšº†ÿ¦„huʶ„­ªmÏR¢TmÊ…©„AJu‡Ò…Çlˆ–ò¤-+Á‘™6ŒO\0 9Øö TN8LÕ4o}µÍa¶FI5åÏŽR3"Ç£!‡rÚ–œÔé”7œiÙÑ!$šá«<™ ÇAž+/–êLøàGî:S*chšèºãÍ]BçTã*Zs6¤Bƒ5QYP³AšQ&A©(Q’œ<¬¤C[J¨KmTŠå.§IEÉlª+pî9½C§V`#”óH=ä–ÏWŠ'˜Ï))$mZ–~œìèt7›i©Òá(á+X¸×~eÕzàºU2cÜ‚“”š³Û;K…%HI¥R†dæR[úæªÝê݄ԵMRî¨ÒèÔ¹r’£6Íqf)‡N¼£2#V¥$|0`r—7Vo¡ÿ¬½íU^Ë´a<”¦‹˜•ÿ½:Xt÷†‡+u;©5›š Rc%Çš€Ü%­Z¶ŽÑŒ©=Äe!o¶f^Q4ça¸½c·-µEuN¥·›[j6SK"4‘¥h2RO~å$ÈˤŒŒc<“ ×É‹OÐ?ÖÝýGR|3v ¦j©­@Û\ª©M¡jY‘%Æ’5(ÌÏ"ê,L̈±í¢í\µÛS«×´‹s\pÒᢓ]Iå!¶”’Åo¤Õ•Ç InË»>”Dßx]‹}ÿµÿï™oŠt:µåW§Ô×FwS8à܃-äd}$C¸7¿¢«m¦¸¤Rhͼf–•>ª¦ f\Öácü‡R±ãþ0ª_þ×ýÔ‘Úm$ʤÐo¶ëÅ}PmгôÆâškðõ±_e.8¤“k7Êæe¯1%ffY1Nä‰C5»G/Wétx´Í©U:|š„i KZØSL-„+Æ'7™œ”a·–Žç›«7ÐÿÖ^öÇRbµyÝ6"äÇ•o²å¾ëŒÑ¤;2§@I8…£#‰mÓÁâÀң̜Lñ<~ ¬áI·¡Þ7eR›m3P¯B“T:“‘ë±'©ˆm½) J‹陿,êl±Çp9+›«7ÐÿÖ^öÛ«7ÐÿÖ^öǪ·z·C¡5­ST»ª4º5.\¤¨Í³DÅYŠAàDáÁS¯(̈թI /º­Ôî¤ÖnjIŒ—jp–µjØr;DR2¤÷”…¾Ù™yDÒwžƒkÍÕ›èë/{b³B§èâ±X‹KoÍCÒyS"œyd’äùˆˆö88gã8áwoN&yOp£\«ñôŽÊ©Õ'Ûš‹²=5øòî‡ÎA°äÔG_÷- êÁ¡³uJJŒ²+2”x*É£/ñƒEÿýÛÿ¿Æ ß7Vo¡ÿ¬½í‡7Vo¡ÿ¬½í‹XS›«7ÐÿÖ^öÛ«7ÐÿÖ^öŬ©ÍÕ›èë/{aÍÕ›èë/{bÖTæêÍô?õ—½°æêÍô?õ—½±kÀªsufúúËÞØsufúúËÞØµ€`U9º³}ýeïlcÔ4g±N¦½$gýòîýÇþp¹Œ:Ïø=ßù§ÿaˆ‘Çß&-?@ÿ[wõM+Á·Ù¶/*dJL›6mFq<·ÜpóêÔ„‘ÃÆGRØšãMÏņԜI’dçn¶¼Ä¼‰I‹Ò'‘ùº³}ýeïlkë=£ )Rh¹ˆÌ‹ ©Òëÿ;º~…¿ùÅÿˆ‰ä˜S~LZ~þ¶ïê:åá‚Õ)Í ªL KPN=äˆ)2qn)Hn+ÛÍJ3Þ‡߆#’-íW)ºQ~¿'H÷dÛi¬¯Á£½W’¬¯ž(uF¿¤`F’=êÇâI=gxYÿˆùÿWÿÓ<1ùþÇbÔÜkýh<\›ÿ9#µ›lŸ­ÿå!Õìxyéý›ÿl‘ÙùòãÀƒ"tÇRÌhí)לWB’3QŸÜDFs!õj¿Ú›Ô¶ª‘W=†Òë±Râ ÖЯ%JGIð3-ã+m“õ¿ü¤8*˜‹®“.‘ª´ZdHò'.UNBjN*QA•«B[[&Á%:”¢2•ûCÃR³/(~(–—WQÄ»*ò¢ò[“ÜZ6¨¸‡ Pg—T† J'0ñT’I(°$ˆñ¶ÉúßþRû~äå¸ÌŠn¡¶æIˆdêG‡Üag»ƦÔe÷bD{‡ Ð+-.®£‰vUåÝ?,%Eä·'¸´l%Qq Ï.© ”Naâ©$’Q`Ipêõ;RÝÉ ©UÏ׫TשÈpð[ÎU%e¡&xµ¸6f\#=ÈÍ»lŸ­ÿå!Ö/ª„Ç­<'$(ã¦{N“{ˆ³›o–'‡Ià_ËYŽÁZ°&S(!Ôg¹>rRk•!j3ÎêŒÔ¼¸ù(ÌfIOBRDEÐ:çáçÿ£Ô¯õ¶à&9’ê Ð 0ë°= ¤ý)Š_é—üE²“ô¦*u¦_ñ=ÚúóøyÞÍ_—Äjeqi|F¦WÞ°èÐÕÊâ5rx¤®#W'ˆëØZ¡«“Äkdq)Ñ->úïž}¢Z}õÞ(@«Üðè³íÓï¨Þði®ý,X²©&Õ HVË5c6ºÊ[JqÄÏÄQ™žì0ÝÓŽ;°?.€¢\á1ö‘¢Nü/hqÞž. ßùï›.©T«òn¦%"¬‡–­T–ó`Œs‹¿v={‡LHOXŒ'.aðA«R¨Úa:±TLІÔüÙHa¿öTe™fEŽ QáŽ'†áßÎxtYö‰i÷Ôox<¡(z½Ï‹>Ñ->úïž}¢Z}õÞ(@«Üðè³íÓï¨ÞØsâϴKO¾£{ÁåX€¯sâϴKO¾£{Àç‡EŸh–Ÿ}F÷ƒÊê÷<:,ûD´ûê7¼xtYö‰i÷Ôox<¡¯sâϴKO¾£{ÁS½t¡lM–ÉÛÚDÑÂYJLÜTêóyG†â$+"çǂÙ #Ñ.p˜ûHÑ'~´:íáyQ¡=ihò‘H¹è5×éü¥µ*•=RÞ±ÆTŒM'‰bXá‰9O×` ˆN]Žð¸¨åëS™pWiT– -(—:kQÉE«}>.ucÅiÜXôŽèsâϴKO¾£{Áå CÕîxtYö‰i÷Ôol9áÑgÚ%§ßQ½àò‹€€¯sâϴKO¾£{Àç‡EŸh–Ÿ}F÷ƒÊê÷<:,ûD´ûê7¶ðè³íÓï¨ÞðyEÔ «Üðè³íÓï¨ÞØsâϴKO¾£{Áåê÷<:,ûD´ûê7¼xtYö‰i÷Ôox<¡¯sâϴKO¾£{aÏ‹>Ñ->úí(ˆ8õwž}¢Z}õÞ<:,ûD´ûê7¼P€W¹áÑgÚ%§ßQ½°ç‡EŸh–Ÿ}F÷ƒÊ!=^ç‡EŸh–Ÿ}FöÆÃ¥½¿HÕ/HVJ¦)&Mšë lŒ÷b£JŒð,qÀ‹~b]%åÑ.p˜ûHÑ'~´+·½Óo¿j^µ †´.L›F}>4jeeµ¸ëŠmF’$™âfg‰`[ÌÌ‹Ðð„å$=ðbÒ5@Ðõ bö¶ ÊÔ2jaú¼t8Œi&JI¬'ŠTXîw(z½Ï‹>Ñ->úí‡<:,ûD´ûê7¼QpÕîxtYö‰i÷Ôox+·¾•,鱨E½¤=„¬]TúëDDDG$£ÄÏ“2ÃÇw˜`Ñ.p˜ûHÑ'~´8gž³ABÓâ^µn§&î*ƒŒÑêH‘‘µFxŒò‘æ"%`Xôo-ûÇTÌ F—e¼ /KbÎ¥ßÜU˜TõJU=1›~B[Æ“‘›)(ËIb|1.&Xóÿ=Ú8õŽçcûÁçPÆL½ç»G±Àüìx5öþ–4_D€ì8·4U¶äÉ2ÌÝÏ;ï¸úËrËq)Å}ÄX™žñçÐÕ2ôßÒÆ‹è‡抶ܙ&Y›³£ç}÷YnYn%8¢/¸‹3Þ1ê:OÑ•BâW—x!Ä@#Tx;|BŽ—Œ”q–lê^UšKK¤’G¼tTËÑ^{´qëÎÇ÷ƒ|0okbî¶©ÇA¬B˜¶¦4Ji©-¸²"CØ«(÷xÄXý㬢Å82”L:ÀìCi?Jb§Wúeÿl¤ý)Š_é—üGÏv¾¼þw£sWåñ™\FÚ_©•Äw¬:45r¸\ž#i+ˆÕÉâ:ö¨jäñÙFÊO­‘Äu¬­Ð׿Äa?Äf¿Äa?Ät­¬ÒÃxb<2Þ ÖÖ)bº1énŒGzEËmÔ±è1Ž~PÈw Æ9ùBÝ-Ð& d”ŸO€€!=bOX=bõˆ À@žõÔ $ I àˆ ðbx0$ I< à H"I‡Xu€€èm'éLTêÿL¿â-”Ÿ¥1S«ý2ÿˆùî×ןÃÎônjü¾#S+ˆÛKâ52¸Žõ‡F†®W«“Äm%q¹„õˆ!=` õˆÖ €OxÔ OP€B€$ƒ€ H€ÀA‰à À$ ð'€€0000"ˆ&`aÖ¡´Ÿ¥1S«ý2ÿˆ¶R~”Å*¶Üç*êæF’YsESËRñ<ØþÑE†\:xôqùûG£_H˜ÌGwè¼Ú‰|F¦W²‘íùë ÿ*Qü@×ÈŽùë þT¯ÿ裳£ãýQåѦ™\F®O»~G±øÖ./åJgâÊ'ìÝMÎÙTŽô‹ƒ‘ì>5‹—ùR˜øŒä}q¬]Ê”ÇÄ tWö–è»Û*k½1ÏÊ7#èëbêþT¨ÿ>FØÿ†.ÎêñÍ7>ÒÛ»eS1Úqôm鋳º£ü@lú6ôÅÛÝQþ e´í”í»eS>´ãèÛÓguGø€Ùômé‹·º£ü@m;dÛvʤÛ³èÛÓouGø€Ùômé‹·º£ü@m;dÛvʤÛ³èÛÓouGø€Ùômé‹·º£ü@m;dÛvʤÛ³èÛÓouGø€Ùômé‹·º£ü@m;dÛvʤÛ³èÛÓouGø€Ùômé‹·º£ü@m;dÛvʤÛ³èÛÓouGø€Ùômé‹·º£ü@m;dÛvʤBzųgÑ·¦.Þêñ³èÛÓouGø€Úvɶí•H·gÑ·¦.Þêñ³èÛÓouGø€Úvɶí•H·gÑ·¦.Þêñ³èÛÓouGø€Úvɶí•O¬@¶ìú6ôÅÛÝQþ 6}zbíî¨ÿNÙ6ݲ©¶ìú6ôÅÛÝQþ 6}zbíî¨ÿNÙ6ݲ©¶ìú6ôÅÛÝQþ 6}zbíî¨ÿNÙ6ݲ©¶ìú6ôÅÛÝQþ 6}zbíî¨ÿNÙ6ݲ© nÏ£oL]½ÕâgÑ·¦.Þêñ´í“mÛ* nÏ£oL]½ÕâgÑ·¦.Þêñ´í“mÛ*ŸÛ³èÛÓouGø€Ùômé‹·º£ü@m;dÛvʤÛ³èÛÓouGø€Ùômé‹·º£ü@m;dÛvÊ§Ô [v}zbìî¨ÿ>½1v÷Tˆ §l›nÙTÈ@¶”}zbíî¨ÿ>½1v÷Tˆ §l›nÙT€[v}zbíî¨ÿ>½1v÷Tˆ §l›nÙTÈ8 fÏ£oL]½ÕâgÑ·¦.Þêñ´í“mÛ* nÏ£oL]½ÕâgÑ·¦.Þêñ´í“mÛ*˜mÙômé‹·º£ü@lú6ôÅÛÝQþ 6²m»eSà Å·gÑ·¦.Þêñ³èÛÓouGø€Úvɶí•H·gÑ·¦.Þêñ³èÛÓouGø€Úvɶí•L„ iGÑ·¦.Þêñ³èÛÓouGø€Úvɶí•O€mÙômé‹·º£ü@lú6ôÅÛÝQþ 6²m»eRmÙômé‹·º£ü@lú6ôÅÛÝQþ 6²m»eR01mÙômé‹·º£ü@lú6ôÅÛÝQþ 6²m»eRmÙômé‹·º£ü@lú6ôÅÛÝQþ 6²m»eRmÙômé‹·º£ü@lú6ôÅÛÝQþ 6²m»eRmÙômé‹·º£ü@lú6ôÅÛÝQþ 6²m»eS-»>½1v÷Tˆ ŸFÞ˜»{ª?ÄÓ¶M·lª@-»>½1v÷Tˆ ŸFÞ˜»{ª?ÄÓ¶M·lª@-»>½1v÷Tˆ ŸFÞ˜»{ª?ÄÓ¶M·lª@-»>½1v÷Tˆ ŸFÞ˜»{ª?ÄÓ¶M·lª@-»>½1v÷Tˆ ŸFÞ˜»{ª?ÄÓ¶M·lª@-»>½1v÷Tˆ ŸFÞ˜»{ª?ÄÓ¶M·lª@-»>½1v÷Tˆ ŸFÞ˜»{ª?ÄÓ¶M·lªfbÙ³èÛÓouGø€Ùômé‹·º£ü@m;dÛvʤ:¼T‚ª8T%Î]<’‚mSP„º¥d,ædƒ2"Ï›Ä÷a‰™Œ²'0Û˜ËÐÚOÒ˜©Õþ™Ä[)?Jb§Wúeÿó寯?‡žhÜÕù|F¦W¶—Äjeqë \®#W'ˆÚJâ5rx޽…ª¹•sÀÔÍ‹6šô÷›'šCÌ¥©/²¼­õŽ%)d–¥¥8$—¿£Ã|±êÇ^<8ã8ãöN¬©À/ÔMݵ «Œú)”ü‘$Hqr*‘SªSL-ÝK¤nbÓŠ$м¦DKY‘% 4וiÖŠÛ]ÂÚ`?¤%Ƕz”wže*Q!*q”,Ül³))ÅI-ê"âBiÓ4z§Všâg‡¼{òó„jÏÃDámÚtªÝ¹6c7éªC‚üç£8Î3-µŽ vA¬²­x ’…©hI¨ŒÌ‹zþ‹#ùp£\ªqÚ<×!×Íp2&Û!÷ ¬=rI1$ýY™ ·`xŒ+õ ÝSMS‰´ÿO>ÉŠ&\d”):(MQ<§O¨Öª'"±!‡ PÕ"bµ®HoFK¸$’¨¯æV°È‰%†&¢!¬Ná,ÔW®¨ü)µ|t@Q3",U<—§¤©µFxÒƒlü’ÄÒg€Æ=KF™˜ÖåÏ„ð÷ãÇßãÜÔ• ìr…kDnRjÑ©Sªu8rIRjåQ]i‚n;.<û±5d%ÒË÷ ÌÓ™b[ú5‡]¿-ê;ªÏí<¥¬«Î’4– ,‡€Î­ ÅYÍ<óüyùÁ­-•ÇY•]¨56ZCB‹ $ÑHñÛa¼Ïy¥´™ðÄÏ"ÜV;›IuûžW *öbÔ—Q^J[1W%kKiR\rmYL›"<¦•+ÅG‘¼” Îf­\Ó§—ÛÛ‡Â5¥q“~ÈrÚ¥ÑâÐit÷éY £DÆä2òT•é"TN¨ÒX¯WF`œ>Îi.²õ¸RiôÉ5áJ‚šÃäòçR]yÇó(ÜÈ¥,ä:F¥$̉G‘™™Òa¹X˜ÄÓïŸïnIÖ—&Ö´ÙwV¤F~ª†&›H}6üÉ«fI=Èî™7õm™¶ë„FÒ[ÃØá†Þ–®Xöa[#Á§´Qã³µD\†ž#aæžmÒ"wV—IM'ö‰A(ñQ™™ž#€kMÑb""ˆÄcŽ0kÕò¸ªýý§&Q Òê+”óÒ_¨È‘3jzC†g¯pÐú[qÄæ<¦´(‹~$x«¹Q­¹)2›¦Q˜yÙ*•RSl¹ýÔuM8ÊÔù)f^3o<“&òíVxbxŠ çA±<éùù÷ækJðÞ’j uM*ƒE]$™e¦i&RJÜ[jI¥ÒtÔKyåb§qXã»ÌÍ%×&Å™¶Â¥¿Q’™m•ML¬¤0Ô¥­o´ŒM’T§]éA™Š"2ÄR@79Õþÿïßçß&´¯ò4­_uĺTúJvQʨ¬›uGRpÙq•ħ ˆ”ÛΤɲAsâDeªUñPMãB¹"S©°Î€ã ¦ÁifRÓ¦òQã,Ö¢5š”fk33Qïc±4è:=<©öÇ÷ü¾ÑÂ8Ò€˜»ñdÑo;’ŽºÔ;ž‰NeS¦Gm‡(Ž>¤¥‰.²FkÚRFfMãä—HÎ{FWcÆfåá@QŸÿ§ÞøÁ¿Ðgø¼Gÿªÿ÷#K£B“.á—>U&ñâkufФítÕN$"\†Ð˜åt%)KdZÊ"2ÜY‡.='@‰ÎÂücú4F‡£Ç+qâKÑ-Æ¿*ë ûÿèrº¯*è ûGÆ_JW$i´´Av›9Š´“ŽÚã[UGšâ)Ìí¼’Ë4²¶¢Á²Až$­É%oؼ®Ù”úš½º&|xüŸƒDcé«P;¢gǎ€ËR˜öN­?»Ÿƒ$3éªP;¦gÇÁø0@>šº¦üxìX ÄBq¹‚Ý4új4ê›ñãóóX¥zBÝs~k¯HP;®oÇŽÈfG[þk¯HP;®oLJÍb•é uÍøñÙ ÈëÍb•é uÍøðù¬R½!@; ™où¬R½!@5ŠW¤(×7ãÇd3#­ÿ5ŠW¤(×7ãÃæ±Jô…ºæüxì€du¿æ±Jô…ºæüxŸšÅ+Òë›ñã±à‘ÖÿšÅ+Òë›ñáóX¥zBÝs~k¯HP;®oÇŽÈfG\>k¯HP;®oLjù¬R½!@; ™où¬R½!@5ŠW¤(×7ãÇd3#­ÿ5ŠW¤(×7ãÃæ±Jô…ºæüxì€du¿æ±Jô…ºæüx|Ö)^ w\ßÌŽ·üÖ)^ w\ßšÅ+Òë›ñ㲑ÖÿšÅ+Òë›ñáóX¥zBÝs~k¯HP;®oÇŽÇ€fG[þk¯HP;®oLJÍb•é uÍøñÙ Èë‡Íb•é uÍøñ5ŠW¤(×7ãÇd3#®5ŠW¤(×7ãÄ|Ö)^ w\ßÌŽ·üÖ)^ w\ßšÅ+Òë›ñ㲑ךÅ+Òë›ñâ>k¯HP;®oÇŽÈfG\>k¯HP;®oLjù¬R½!@; ™où¬R½!@5ŠW¤(×7ãÇd3#­ÿ5ŠW¤(×7ãÃæ±Jô…ºæüxì€du¿æ±Jô…ºæüx|Ö)^ w\ßÌŽ·üÖ)^ w\ßšÅ+Òë›ñ㲑ÖÿšÅ+Òë›ñáóX¥zBÝs~¬‹â¥(‹ÃÇ p1GMÒ뱈¢32çiúmZ>"Šs2áJoƒU¹QJÕ±o:h<žJœ•#«2Ny2K ÁBÁmùL†§eÕìüœRbdò³fÏ!ÜØø¸a— §ÛúÊ£Ûw… =Å;)‡X‰=üê2ã«J]Üg¹$jĈº $9šÒÿÖèâ,h÷¦ìqç%¿F¿7iœÇá.)Ðgø¼Gÿªÿ÷"ÛJ§B¥E\h êZ\‡¤©9X¸óªuÅbf}+Z‚ÇÀ°!f²)TÈÖ…)é°ÙJâ¡ål%$¥¬³­goR”¥(ϤÌÌÏyÎÅÍìÈnÂˈ#èîÑqÛ¦½ª4’ZB§>¢ŒD¢Q¬õþË/AuØSíZÂ&c>µÂ˜©¬ºü·žs^¦VÉ­KZK=ZÔŸÏvE‡'ìPüю̃b‡æŒvd'‰.‹ Õ¹ž’ífœëç-’bR˜ó(‚#"Ö!µ¥+4âyMDfØ`Bn‹VêEQéÑž™:[S—¯”ó$§Ð†Û%“­žvU«i)%# ËÇ–¶(~hÇfA±CóF;2 Ñ…¬õ¯K¨¦JXnMJ ¹Ï4ćCj6Ûl‹ZïŽáåi&¥¨ˆÍF£À[Ób‡æŒvd?4c³ À¥€ºlPüю̃b‡æŒvd#–é±CóF;2 Šš1Ù`RÀ]6(~hÇfA±CóF;2 X ¦ÅÍìÈ6(~hÇfAKtØ¡ù£™ÅÍìÈ0)`.›?4c³ Ø¡ù£™,Ób‡æŒvd?4c³ À¥€ºlPüю̃b‡æŒvd°MŠš1ÙlPüю̃–é±CóF;2 Šš1Ù`RÀ]6(~hÇfA±CóF;2 X ¦ÅÍìÈ6(~hÇfAKtØ¡ù£™ÅÍìÈ0)`.›?4c³ Ø¡ù£™,Ób‡æŒvd?4c³ À¥€ºlPüю̃b‡æŒvd°MŠš1ÙlPüю̃–é±CóF;2 Šš1Ù`RÀ]6(~hÇfA±CóF;2 X ¦ÅÍìÈ6(~hÇfAKtØ¡ù£™ÅÍìÈ0)`.›?4c³ Ø¡ù£™,Ób‡æŒvd?4c³ À¥€ºlPüю̃b‡æŒvd°MŠš1ÙlPüю̃–é±CóF;2 Šš1Ù`RÀ]6(~hÇfA±CóF;2 X ¦ÅÍìÈ6(~hÇfAKtØ¡ù£™ÅÍìÈ0)`.›?4c³ Ø¡ù£™,Ób‡æŒvd?4c³ À¥€ºlPüю̃b‡æŒvd°MŠš1ÙlPüю̃–é±CóF;2 Šš1Ù`RÀ]6(~hÇfA±CóF;2 X ¦ÅÍìÈ6(~hÇfAKtØ¡ù£™ÅÍìÈ0)`.›?4c³ Ø¡ù£™,Ób‡æŒvd?4c³ À¥€ºlPüю̃b‡æŒvd°MŠš1ÙlPüю̃–é±CóF;2 Šš1Ù`RÀ]6(~hÇfA±CóF;2 X ¦ÅÍìÈ6(~hÇfAÃhvçÒ[N¤–…Ý%I>ƒ#…»ÎÔž¥P™åXjèAº‚3.ÉjIf/òˆ÷áàr…©L¦¢,é§ÄKÒªRÝá2’S«'”‚R TyP„â|EÐD7?4c³!®åšnbgœ4ݱMÜLóŽRà›NѪ½]Erâ$´m8nµ9-ktññÜ2Å;±3"#=ø%†Ì—þ³ÿCÿ¶Ø¡ù£™£,²Î:¦›oœ©"ÄM›TÚŒR›V©µN­/ÿÙxymon-4.3.28/docs/mainview-acked.jpg0000664000076400007640000015015011070452713017532 0ustar rpmbuildrpmbuildÿØÿàJFIFHHÿÛC  !"$"$ÿÛCÿÀ¼"ÿÄ ÿÄ^  !1"AQ’“ÑÓ2SUW•TV–ÒÔ#3Babq$%457Rs‘±²CEFuƒ„…¡Ááð&Ddet‚µÃ6rÄÿÄÿÄ>Q!1S‘ÑA3RaqÒð¡±Á"Bá2Cñ#Âbcr¢ÿÚ ?ôôùrÓ:BS)ä¤Q‡b+˜øpÙŸk¼0¨ÿŒ$ÿ¥WûLT4ªÒ¾*ªz„꼿ûé=ì³bå _²O]òß2hŽqŸ«ëfK9œQê›Ö+*zKíÈq´´ê–FQÜCObæ‘¡Ç“Iïr¶Ã¶Ã†Ìû[ýáŠ]xŽªÝT±ÑƩԜ_ÁÚÈE¬(Õ(èe»$‹ø[Bo¼÷Ïhø+Çð®"¨¼ýK"p¬Ê¤Iu,º$´‚4Œâó´yŒÿhJ¶T‘¨óXwðÙŸk¼0á³>ÖÿxcO‡àÔ A6êu™i+^u:ëM6H¹dB[Jl‚23,Ù•´î£Ùmˆ>ü6gÚßï 8lϵ¿Þóö8¢?.±¤Z³Z„ùÇ©²K¯)Óã*r Ôã&®­Y¸DN¦çrÊŻŸ¿+WË5P\j2\d°ºraÉJÙC¦¹ ê]$¨ÐJlˆ‹!ÔwI åf¼Tz<Ú½F¢û ÇrL‡s-YBMJU“s;؈Ì}X«-÷d4ÅMN¹Âiô¡üÆÒÍ)Y%DGÍ<«J¬} #Üd)2Ôj³ð¾’›é$–é‘XÖ¢A%7=甈¶ì"-ƒåX§Ä«ReÒç´OD–ÊØyüHQ¨Àɱá³>Öÿxc嬹m)ص5Hm.-£SOæ"ZhZnG½*J’eÐdd{HU¥>mz“G“ßSµR”¸u·7)pãäRÝ?ôè[ ÿ§U½Qð›\Åòé_…P—ªn©ZnRiÅ 3M¨óœiZd–­M¡ ²ÿˆù›ngq‚Þá³>ÖÿxaÃf}­þðÆŸ În©†©u6¥p¶åÃeô¿ªÕëIh%ò ï{t^ÃbûðÙŸk¼1Ìã!1„8?*«#ZËÒWÁŒRÃ95®«2Ót§X‰Ì£¾ÄŒqQ(ôŒBÎ#ŸU¢Ñ+ø–%VK\²þDDa/1•Y6Rldp(ç)Ff{LËMˆjÌb0dûðÙŸk¼0á³>ÖÿxcÍØ*ˆºf ÑÍa8; QúéªÍ6IEýf¨ˆ–CwÖ™’\-b앬ùÖ¸î½#¯p¾;ô€²zQļE¨k&«…j3fË­Öäþè¾l¹†ÛFL¿ ™ö·ûÃ3ío÷†)ê®"ÄVMm¼ZPÈñ{^'àÌ Ž† ®¤›šÅµw/šÄ…ìIlQ/Ôq±á÷ñ½iQâ—i,Â]=…GK ªªMVI8¥¡&J#%‘R##;™qðÙŸk¼0á³>Öÿxb®¨ÖëmìKK¨âYsQ%6LY®AaR©RcTIA6Ù™©”’¢²MË«1'o"Æ&Ҹ¡‡Ú“‹Í¸Ñ%¢S4>¬Q™).ž´šSI"AåA%ÂÖcI @_ü6gÚßï bÑ«ÅX£Â«Óª/¿ tväÇw2Óµ¤”•YV2¹ŒˆÅ‡jŸãè“ZU*#~•R“#¼—$>äb5¦•ݳ&I'ö‘¥E´Ï’Ñ>*®#EíÊ3(Îaì$ðèz²7'¥1¤IRÌ®hQ§*RÙ•Žä£5sRïÃf}­þðÆÌû[ýáŠ@±^8‡…qEçêY…fU"K¨qeÑ%¤ ØDg£ÌgûBU²¤GšÂ×Ãðj ›u:ÌŠ´•¯:u¦›$\ˆ²!-¥6A–lÊÚwQì°Ž3ío÷†6gÚßï |QJ ðý+⪧¡XN«Áëñ¾“ÞË6.X•û$ðuß-ó'öˆçú¾±opÙŸk¼0á³>Öÿxb°sOo¦S•VSRV2â”Ý-’ž9Ôê²Ûé¶ks¯}£-W7MôìNóÌ-r”TÓ†Á2q•VT$‘¨‘¬Î”™(”EÍ"23¹˜*¼UX«“¢ûÍ"CÑ”¬ËMœeÕ4âlvÜ´(¯¸ír¹XÇÕú²Øv;OÔÔÓ’\6˜JßÊn¬’¥šRF|ãÊ…*ÅГ=ÄbœÑåN±Q¬Ô0ÁUñšªVžŒëm6·êFuD£lÜB”´fWMFyLÈ‘ëäèÊEN‘£íEEjTƪ¦Ão¥öÙý›Ì-ßÙšRKýšL¯:•u,½]Ãç*¸°©z;¬Õñ;ÕRÄí6ÜÈ«†ÃM4k€ì”­³B D«³cº'˜Ì‰;€¶ølϵ¿ÞpÙŸk¼1NhÛãJÕV…QŸ¤Š}\Þ)MJU9£6µ¥1õnœ…-*A!IpŒìj3$e°ê´:åv~£Wëø‚EV]Z™R¨ì´Ó&¶ÉG›AÏ1fÌfW.i$¶;ž3ío÷†6gÚßï |}6F$cKõ¿GéTš†j3]êNDÉýÑPË—#æ¿:÷ËkûìÃ~¬¶ŽÓõ54ä— ¦·ò›«$©f”‘Ÿ8ò¡J±t$ÏqúðÙŸk¼1Páš­z64”ÌÖ¢@‘QÆü|x¯œ–”Ùaô:”“‹m õšiW$¤îF[J÷æjØã›ô 4z¦$“ »#&¸áÒ[ilšMDäD8é8Ùš‰).j/Úו*ú^(2 F•Q}·j4TæYë&œtÓrÝÌigs±sm¼È+†Ìû[ý኎>»6§„Z¯µ%"bרiR×ä­®(–²7Š2ÔÒWu¨¬V¹%*ÊY‡ÇFxJ§à*G•uXš1”ȼ†ÓIŒ§MÄjÒJ,«A6²Q¨³8V$ì ÅÃf}­þðÆÌû[ýဠ>ü6gÚßï 8lϵ¿ÞøïÃf}­þðÆÌû[ýá€>ü6gÚßï 8lϵ¿ÞøïÃf}­þðÆÌû[ýá€>ü6gÚßï 8lϵ¿ÞøïÃf}­þðÆÌû[ýá€>ü6gÚßï 8lϵ¿ÞøïÃf}­þðÆÌû[ýá€>ü6gÚßï 8lϵ¿ÞøïÃf}­þðÆÌû[ýá€>ü6gÚßï 8lϵ¿ÞøïÃf}­þðÆÌû[ýá€>ü6gÚßï 8lϵ¿ÞøïÃf}­þðÆÌû[ýá€>ü6gÚßï 8lϵ¿ÞøïÃf}­þðÆÌû[ýá€>ü6gÚßï 8lϵ¿ÞøïÃf}­þðÆÌû[ýá€>ü6gÚßï 8lϵ¿ÞøïÃf}­þðÆÌû[ýá€>ü6gÚßï 8lϵ¿ÞøïÃf}­þðÆÌû[ýá€>ü6gÚßï |dÕÜ“_Pu¼çdÝÃÛÿ—ó4õ?ñ«ÑïÃÌø~'–Ÿh÷áæ ü?ËjdÑruBLm%Ô¡"{êyæXn—ÌÒI"3TSR¬„¡k5T¤ŒÎÃ`š>r5-ºƒ4 “Ô¶f,™LF7$r¤’ײ $]E°}¹>ÑïÃÌø~'–Ÿh÷áæ ü?ËMf­ILªÄ,9Q} )”»-¦]Z[Q)j#<¦Fw-ÇsÆ#AªQj0—@iÉëKªLv¤4òÒH"7[3-g5´£i‘ØŠÆV+\Ÿh÷áæ ü?ËO´{ðó~‰å€5˜B†h¸vu"lÊAºŒƒ‘1¤Gi˜ª<ˆm(CQ% ChIš½[™™˜ÜÓãàêth±iìÐa± Óz3L%¦ÒÆ• Ö‚-‰Q¥jMËm”eÒcãÉö~`ÏÃñ<°äûG¿0gáøžXoÆÔ¯yÂïÓâ>Sj4çá¼ÃUÆ"8ãjB_iæm•‰i%’“rÞYˆËfÒ2Ø5¼Ÿh÷áæ ü?ËO´{ðó~‰å€4-ᦩ;RoJ5dNy´´ì”±H'\BniJ•Á.dW;žË˜ßÔiø¥ê0°äÈÈyrËí2âêÔk[„“#"R”¥(Ïy™™žÓÉö~`ÏÃñ<°äûG¿0gáøžXlÝRÚ„T`¥ "$¥/ ˆ‹¨¶‰ãjW¼áwéñŽO´{ðó~‰å‡'Ú=øyƒ?ÄòÀkP«rÚ—YÇ’*R+6ì¸4g–‚þF¨fd:FèøAè®H¤âP/ÁæÔ™ˆ§‘ιeÈ„¥6ØE•%°Š÷=£#“íü<ÁŸ‡âyaÉö~`ÏÃñ<°0g±#±NE5‡éMAm’a¶É¤¶E”I-„’-–µ­°aGãÓÓNbj#½1ÐÓ)m,¼d§[$‘X³"5'rŒŠ÷'ðŽXaÇÝÑö Km¤Ö£ô~!؈®ðc‰ãï£o°ÑoÊáy`d´8Ú•ï8]ú|GÊmFœü7˜j¸ÄGmHKí<Ñ­£2±-$²Rn[Ë1lÚF[iÇßFßa¢ß•Âòþ¾ÃE¿+…å€>´}áJ4äO¤c§KEò?™DiÄß}”˜Dd;®ƒ¸óu6Ë“‡dk„eµ­¬õ­m–¸à8ûèÛì4[ò¸^Xq÷Ñ·Øh·åp¼°ê¹…è•|hÍvE_¥–ä1%Dˆ ”Õ©“Jƒ•žú¼èJòå¾Ëf¶ÁÕçÂç£ð~ÂuWo&»[­Ö[v}g?6üÜíûEuÇßFßa¢ß•Âòþ¾ÃE¿+…å€,IŠÂó8O :4ŽÊX“­6×®i&£JY$kY‘ÂÌ®³÷hº=v–Å)ÊN]>2ÍÆ"ª;ËJ=êJ-dŸó"_}}†‹~W Ë>ú6û ü®–²X•‡˜© H¥´òÚC*q l”m ÔhA™mÊ“Zì[‹2­¼ÇłŒ*˜*+G“b£Tž Ù‘Fíê&ÉIX¬V"êç}}†‹~W Ë>ú6û ü®–î"RðDNDJvŽš‚ÜÔ´Ã ))Q).X¹ädgr;ÞãqÆÔ¯yÂïÓâ*þ>ú6û ü®–}ômö-ù\/,hqµ+Þp»ôø“h,;!Ö%ÓZrK„ëêCˆIº²JPJQ—¬yP”ÜúE¸ˆVœ}ômö-ù\/,8ûèÛì4[ò¸^X5ìAz¬ª»¸ñ÷*KR©jE7HQ)kày®•%&[vHËpî3ᎠÁsÑø?á:«·“]­Öë-»>³Ÿ›~nvý¢ºãï£o°ÑoÊáyaÇßFßa¢ß•ÂòÀ–4²“*)¥‰*–É~Ê;¥)Ju=K5-fj-¦j3é1ò§ÅÁ”ì¥O@‰–R¦¡ ¢Ï©…;³øÍi5o23+Øp<}ômö-ù\/,8ûèÛì4[ò¸^X¿ƒ@ªIªÁbƒ¡/ü"S(i½¶üõ–Õmë1öixa– °ÒèíµO·m&Ù&5m–¬¿‚ÈR“²ÜÕn1]q÷Ñ·Øh·åp¼°ãï£o°ÑoÊáy`ö4L²íj4l>ÅQâ2vkm²—ܾüË.qÿiŒèSh0¡³ºlhÌ6–™e§„6„•’”¤¶n§}}†‹~W Ë>ú6û ü®–´8Ú•ï8]ú|G3U¦G—]“V‡¤IÔ§$6ÛJn"i¦D„_*s;n©j²”v5ªÖ#°åxûèÛì4[ò¸^Xq÷Ñ·Øh·åp¼°ò‰Óê²1âªMŘ¹î7-¨H[²2ã%yØm­Í8dy‰fy±¤’d­ã¼Âg%Švi5ðÒC Iéý¥‹Ÿý·?}}†‹~W Ë>ú6û ü®–ïéì`êth±©ìÐb1 Óv3L%¤%…šTƒR¶%F•©7-¶Q—IV `ü!E§E†åê1©ìB‘Qi¦™zQ4ÚS™fFg·-ìfvë1Êñ÷Ñ·Øh·åp¼°ãï£o°ÑoÊáy` C©^ó…ß§Ä8Ú•ï8]ú|E_ÇßFßa¢ß•Âòþ¾ÃE¿+…å€-6¥{Î~ŸãjW¼áwéñ}}†‹~W Ë>ú6û ü®–´8Ú•ï8]ú|C©^ó…ß§ÄUü}ômö-ù\/,8ûèÛì4[ò¸^XÐãjW¼áwéñ6¥{Î~ŸWñ÷Ñ·Øh·åp¼°ãï£o°ÑoÊáy` C©^ó…ß§Ä8Ú•ï8]ú|E_ÇßFßa¢ß•Âòþ¾ÃE¿+…å€-6¥{Î~ŸãjW¼áwéñ}}†‹~W Ë>ú6û ü®–´8Ú•ï8]ú|C©^ó…ß§ÄUü}ômö-ù\/,8ûèÛì4[ò¸^XÐãjW¼áwéñ6¥{Î~ŸWñ÷Ñ·Øh·åp¼°ãï£o°ÑoÊáy` C©^ó…ß§Ä8Ú•ï8]ú|E_ÇßFßa¢ß•ÂòÆÃ9 "¯ãï£o°ÑoÊáyaÇßFßa¢ß•ÂòÀ‡R½ç ¿Oˆqµ+Þp»ôøŠ¿¾¾ÃE¿+…å‡}}†‹~W ËZmJ÷œ.ý>!ÆÔ¯yÂïÓâ*þ>ú6û ü®–}ômö-ù\/,hqµ+Þp»ôø‡R½ç ¿Oˆ«øûèÛì4[ò¸^Xq÷Ñ·Øh·åp¼°¡ÆÔ¯yÂïÓâmJ÷œ.ý>"¯ãï£o°ÑoÊáyaÇßFßa¢ß•ÂòÀ‡R½ç ¿Oˆqµ+Þp»ôøŠ¿¾¾ÃE¿+…å‡}}†‹~W ËZmJ÷œ.ý>!ÆÔ¯yÂïÓâ*þ>ú6û ü®–}ômö-ù\/,hqµ+Þp»ôø‡R½ç ¿Oˆ«øûèÛì4[ò¸^Xq÷Ñ·Øh·åp¼°¡ÆÔ¯yÂïÓâ>2fP¤ä×΀æCºnúvß»ù ×¾¾ÃE¿+…å‡}}†‹~W ËwÑ“Bo>¾«MÜÖ'Xúvߴϧ®Å°QO qehò…Á¤²þZ·;Vá*×ev½…§ôwŸ:<4ýJ—%Բà Ñá­ÇV£²P”“wRŒÌˆˆ¶™˜¬¾›øs дDr……ðý!×j¤N;”Äw’iÎi­´=6½®D}3ê`õUGüa'ý*¿Úc–«ÕªáL<:”«ƒ´í¤š3“Î¥'fšIz瘬jÜ[‹1Ü‹¤¯GD§'ÅpÔ”ƒÞ%¨MðÍI¢6XdÊ;ì¤ÛÉJv"ÄVm{7Zǽ=)._‰×­Fé­Þ¯C•âØšØz[P[½^Ÿz|zÜE=;è—ù*ÈÙ= æÒ¥’MF’R’E{%G¿ lÇI VηNœó,¢;RJBÏ…ÎÄÛˆ""ÈŸi}ýº›¹pÞŠêKo6¦Ôm:¦–Dec4­JIíØ¤™o##0•+T…ëFÎåœ jõi¹WŽË¿õõ ‘àE92”¤¶KB9¨RÌÔ¥RDI#33Rˆ¶Hæôkƒ]ÁÔéqäâœC‰$I§8M^rßSm‘ž­´¤ÌÒ›$ùÊ"#Z®gbÊ”î1L)U 2˜…ª9 }‡N(Ò“Õº‡-r#µÉ6Übz®QƒqÞí¸±ZR9J í'o™‰>£Rz{TÛ²†\[¥6¬¶êó6HFu$²™‘¸ddG»iXl©5(õÜÕ’Ú}•d~;¥gVû(¿ï#-†V23!_Ï~eLhÕéŽrµ2m>oÍ&‚4’r$ÌÏ9ZÝF:l1 õE5ª‚x:‰ƒa¦ Æ¢lÎüõ¯Ñ¹;H·™Ÿ'ŠÅTÄJ3—¯Àâà1¸ºØ‰B¤-¯Ãwï¡Ó€×âJSuʺK“jS%¼…&¥GÉï%¡Äí##">’=ÆFFdzíá§p¦H“^«W¥§Ÿ&}JJÞuç ŠæYÔ¬ˆÙbAˆ·ÝF¥dï›JíJ5.©,̘ŠÊ]·™n/æ{…uNÅ•*Ë­>Õ~LRyÍ[hfSN{4­ÖO9ßg®Yº·[¤%P`ÄzRcE•,Ñ%J&Œ e×X•$‹2w·@äjѤ%GôȪÇa ]=•<ÜeGzÆJY©´£e¢û/³nÏ¥ðŒ,<Ÿ2PRmúéÃrj׿Ån>wÅqOÎT•G /ÂÿÇò:Œ%Q­Èĵ(UY‘d4ˆQßa,0m’3-ä*÷3;ž¬Œö™âë>¬qš,‚´Óž«Ik,™JÈJ'œs3)Q䱬Ì̶¨Èö_5ìC³ØÌÉSVJËÓÑ$ø|N¶TËÇÌwo}þnæ–TÉÓ$¸Å4"d–jÕ¥&µå;(ì¢=„{7\ÏvÍøÍÔª52*åÆ}&¤ë‚3IoRr‘nê2Ú[Kùÿ :TªâŸ’ÃÎ)¥ºë(iVÎjYšNÿæó¬vÚGÐd{qq îIeäFy©‹eM8…УµˆÑ}¤[nÙ¼ÏmKμŒŒˆËiá‰VžÝ>2\RãŽ8–™i; Çê¦ç°¿¬÷ –ÒÊ{ ’DêüO™´g#ÉŒr£›-æ‹zЗ¥m-¶#ÉJJÑvfSK{4uÚ…J 2s–SºZm)h˜J¯´Ï23dEÊæj+ÿ#;ËWWVŒäiÍ¥Š¤[–’FIQªâ/·"¬vê22ÞC_Qe4Uq[s¦kZj+ónù!³q´š,£¾ÂRöã½ËxÊÓ#ÕfÓªfìI—A‹Ã`“d¼«›‰ÙêÈ®Ÿä]B¶[ Eùõç}ïÓäêÖIDl¿3m^ÿÏÿéœÿtÇÇGØ8sèñ€$¢7 &‡J‰!9ß}Èí‘ŒÉ NgRR£CM¸¼ªÊd>Õïñÿþ™Ï÷Ls”ºuEÿ£Î‹+t¸ÏM~O¦O\F[58û*§ª3¹H¹Æ¤7!n’RJRÍ¢BJë#-ñU*ÒÃÔíME´µi;/ÅšÁ)I&ìŽRF3ÓÖ(µJeE&×b³T¥CªDCSÑ›Ï!ƒˆì†¬S#­Ä"KœÒ¤º‚B V΄4„!a4M“0ꌴÂä°VI8ÛÍ%ÖŸB3)ImiQ•ŒÏ*Ûu¥êó«ÏTäÓ(­M¬áz¶"8í¥i)Ôú•9ÈÌÓRÛL¥ :ûdÚ’´¸yÛà‹3sœ““sýè Ä:¾"§G\J¸°i”V•s×Cˆ— ¥¨ÐµHZrç%¤¸JR\IŽ7‡xå?Ũaã+Y¹mZÊÛ6õvw¾ï]ï‚/×Áª46§¹î·Ç_¿–¥…»Â1ÅS ð\¼›wÖ_Y”Œ™m³/½îwϸ­·1𤫒¨¿š|HÌÊ}¬Šæ4òKj½¬wS•ˆîYvÚå~±h˜§KÕÙxŸ·S€Xv˜ÄUÊdÔγ„T Ì—æëJlî\äÊÆY¶òZ2ÂÔç1=~5ÁG*­YÀÔˆîÍ›BSÊáhbR&¢C¦Ù“KSKiµ¦œäD¶Ê>”æ—M ©¹C[¥¿Â T#7*+¹cN$”…YDFWI‘ØÈ¬f6G£aÚfŠtQE‚f´ˆµÖ¯ÓZ¢:˲e·G”O¸mä#”WI–’Y8”™«i SaGÂHÂõtá×qDGèT¤Æq§¢´ODÕ¹©3Jši’ãæ“"ÊÙÓnh¸ªbª 3ølý_ÇnDë2µjælžªO2!óSunÙÎ+î…-ûÿÁ?‹Òüd¹‹ÿè)ÿ»?ÿ¢ø?øæc‰]ôºþŒÕ½7ô³„ñçsUÅ|+>^lš¾ûNkçÛ“ø€øÀyÉ0cÈz#ÐÝu¤­qÞ4Œ™•Í 4)I5ãÊ¥Ëa™mî£7M‹‘ƒ"j¤Ôf½2£6„ôy1¤¸¤™Oͪ’Á¨Ò„3c4¥H3± ÇËCx!—ªv~'Ã+Sô¬†ÙŠsâ£Ëhå©Â"YY/¶z¿é£1nÍ´ žÎIƒCцë­%kŽñ ÜdÌ®hQ¡JI¨·U(®[ ËhÖc*†*…kjP äÖd· –Ì|÷±úºÜÖéËk•îTì7.6ÀrŸÃªµ¨˜:ºLü<ü¦‰ô7ÎCo¶i:|‹”êìDDóNÖ¦˜ØsÐÞÂÈ£Õd ªT<Ó*&œeuFõ¤…¤ï™´2¥®ÖÈ•!WÛ° 5ˆ°L{ØÞ‡H£N¤áÉTªD”3H§Ú\’•+_•”Øœ»mÇ'[O9H;XÍE},(Ž›„bV°¶D*„*´˜‘ Žõ=·ãÊŒ†ÊGpÍqЙ–“±eak±f¸ÿ繸?T©’¨õÊ}Zst)”Z9*Bõ“"Y‡ž’KNÓ.˜ÙÖ^ª™tÌù»;Ê%.&ÅxÎE Jb€Í ö R¡sdJJçk’Ãed©å!ÈÒV33nþ±¯ÇußEð={p^ÅÙ¸>³&·TÒ—“5-òÚö;_q†®ñ½_Óø.§‰*HƒŸY›]š$yíbËþ–Û}KßmЕӵ™ñ´ŠÝ[Öëõ¹ÔóN• šìK\)6êÉ“'Éå)&i7²"%ß(ÚÍ¡V¥lEV®R*\æ!ae˜ëUŸâønb›"3’ÊV…"Årmh5YF“6À²+Ê_HÃ,#…M›91d‘’QR¸’ä!wËe™ðE')‰GÐJé… Xyœg&‰YŸLr£N¬c©s$§"”ÙCb2#å¶KÕ4v>jëóX槆N™¯HNšæ …ŒÚyêLHk[nÓ•LdÔM0’ý£%1yÔÚÈò8V;-\C]⊾§ð]wÔ—>³.§,I3ÚÇ›ü-¶z÷¾Ë×x¢¯‡)ü]Çu%ÁϬ˩ËDŒö±æÿËmž½ï²ÇJÕh-.‹D7ðmmüŒr¹qi§:§#S¸±öÌÕ‹:9âµF’º\J2ó‰&ªPYU†o`ÊÛø=årâÒMtÜOâÇÛ3Tb,èdäŠÕJéq(ËÎ$˜쇜ièÈDGŸKΚ¶Í– "•y”FiºI<ÒQÝiÙ—2‹WéUж±þñ½ ›“©]ÔÊÒJB‰sÜÉEdÛ5ÎÖ¾ÁVÑ0⥮f[XQÜc-Ø”ÉT”F§.‹)•Œ¬¿dÒßS–BȈ‰ä&År!‰i”øÚ0Ñæ‡‡×D™"|2¯G]-pÔãУ¡ù«2®%¸Ë-›©Ì•ç¶c±Ø {×}"¤?Pà¼URŸ&³=ø4·£ç½‹ÖÕf·Fk\ís`Úï¤T‡ê‚êªSàäÖg¿–ô|÷±zÚ¬ÖèÍk®t® ²ÝmE VácNfKãwi®¡³§M×>e“R¸æ´“Y¹ÊY,’w% ²ÝmE VácNfKãwi®¡³§M×>e“R¸æ´“Y¹ÊY,’w%.¬C]⊾§ð]wÔ—>³.§,I3ÚÇ›ü-¶z÷¾ËeF©Ÿ2›cú§ªrN,4äQë&\xÓr+ìÙqW;6Û̈ø]#Ó™Æ5ü1H›‡ê)´ÜTiœoÇQ0ó|Q%dálSÞm£5Xd¤O_Á8ut&§ ~¢ãe¹"hjš†`=DI/RÂ[R”ÉÍZLÒÚM$´^ÜÍ€_ÃMŽë¾‹àzö&à¼/Š)²'p}fMn©¥/&k[åµìv¾ã>:ÀqêtÝ1WœÃOÊÄêÞÃòJ:Ôú\n‘T¸†[IZä©9›Ú¥#)ß-‹úÒ†fEÁ˜m暪`*ë u¬æK"ŒQ‰Ã"3qõäe5]jº÷ØÀx>¿ý)ÿ¸¡÷ _¿‹þ”ÿÜP²Ä¯ áçšb¿‰(Ô—]I­´NœÛ ZHír%¨®CŒÒö! bãW¨ÊeY¶io%ÕÁ–‡Òƒ4‘ ÎÇýcw¥Íд“…—D¬¤Úu¬‰1 #r3ŸçYãNã.£"2æô…„è¸'èÛ‰pí11=ý§µn¬ÓÎZÏ¥GÒØV""›¨çqv z˜|M9/P¹.­Ó2j;(õœ]ˆÌú‰$WQÿ"3.ˆp:LCМ¨L±z0¡ª2$6ò ÓJT£Øœäñ‘캯s+Òñ µ(áå:|J^!Ztpòœ8ŸÃ¸¦½G˜ï;j#í—0WK ÛuTµç""3è¹Ó}ÇÞ²óOGD†Ö•4´’Ò¢=†FW¸à4ŸŒ‹O‡ ¦ÜþâS¨#™)[yˆ">cjØg{ìÚ¬¶ê––æ‹dá8Ò’‰Š¢*œÜ‹™8ljÉwß¿hƒZS©8)íÅp·Ä©á¸™U«R [qV³øéñ"<Âóf34ÉN%÷ÓŠŸ ¢ºµ’HhÕ*ædEeï°`úAйNâ>&þò^Ü#»û½F}¾«÷¿²ÔÛ?ñÞÛ¦¡_«ÎM )¡Ô£MˆÜÊw—T}sDù.BÚSyPÑ;”Úu&wéØEÉÖâU×ZŸ ðZƒX•‚[íáùNÊTC–”­Ó¨›„Þ©M)FmTHIå²I9“Ô:å×:£ ¨¥=«v¡ ãENS=c„ÓŽšnE³˜ÒÎçbæÛy‘¾«^rf‘O]5ÒMJ¦¨yn$ŠÅ Ù:Ô‘™•Ú6쬧{žâ#W7¦ -"£' T«Xm¸4꫊–‚¥œå¡…ÄÝ% R’n›dD{R“?Vå…Å•.QxWËàþ›ðn¥Y5>jµ—µ²k9™·fæïس#¢’¢è³ ²ÅIÊsR±5i¹/¡-™“I‘Qw{‰RH³6“½º\8 ꦇpÝ2;Ú—¥â,@Ãn\Ë"–ud‘ìê3pŒêlË…ŸèÈq ª{¾©ÖÓ*xÒ¿ ªxié.Ò–µwê3cÆ\¤ç[Ba¹Ì3¾SQ¤ÌŠö±‘¾©W\¯Ò˜ªQ„ΦÌô*F7q—£¡6S)"22uG¼ön=ƒ˜Ñî)¼×&Ó0þ(¢BD鵩e&ãHÈKJÌ3KÊJ% ”V>‘¨“¦¬#FªP1>=©GÃé‘§*2[RR™FvÞCGÁÔ«\Œ’ãGk,„˜Üé&ã %$¯w½~.ÎëÕ+ÁÆŸ™ýrosõõ³·æ^€5˜V½LÄøv ¢ºóÔéÍk£:ìgSˆ=Ë$8”¨’{È̬dder23ÙŠÄÀðŸû„ÿ¥oýôý>Éåþvÿô¬{îþ•¿÷Òî’ñq­ÅÕ—$®gs±{õ¨]Ò•S1ê±Þ9·Ffàùc‰áþ7CÄœ–2–ͯeÂ÷·è˘Œ°ñN´’½íw§Ôö” ’²H¬D$xÝZR¯ÿ;Æ_ÚÜ?,|•¥,Mü8ïkq<±ÔN³ÿj] ŽT¹‹©ìÐ.V”±wðã¼Sý­ÄòÇÉZRÆßÃŽñ'ö·Ë¨ÖíK¡¯™KßG´‹÷[uæqƯ«R“sM÷Øÿ‹ýCìJÒ–‘‡Öÿµ¸þXÙR­Ë} y”—÷#Ü<6­)i3øqÝ_û[cË´¥¥áÇuOím,oäÖ÷:—¼nÔ©ÐjIe3¢·!,:O4K+’VDdJþ»qáL>gn/"kØ«&{»äÿ¸xÀô¥¥nŒwPþÖÙòÇðzRÒ×F;ý­³å‰à±pVŽÒ"›ÃMÞVgºÛB[A! $¤·èx@ô¥¥þŒw/û[kËÁéKL}îOö¶×–#ËV÷Y¾b—¼{²\H²ÐH•·’Gr%¤ŽÆ>q)Ðb,×#M(÷šk ”´ÏÑŽÞþÖÛòÇóÊ–šþý¹Ý·å²•½ÓŠ^ñïpåKM~ÜîÛòÕ-5ýûs»oË ¥otfi{ǹœ¡QÜ’rWNާŒîk4m¿þˆ†k,2ÏîšB:6ðg*Zkûöçvß–©i¯ïÛÛ~Xek?A˜¥©îÚ³N?J–ÃIÌãŒ- +Úæi2!°Ñ¹9†´y†ðäÇ¡;&•I‹çqÃBÖÓ)B7lŽÆi;\ˆx •-5ýûs»oËT´×÷íÎí¿,²þј¥©ïÉ´, 7'ÌÂ8bMi.¶òj.ÀBä’Û±!déµ›2r¦Ç{–R¶áÐqÓ]lv×ùç*Zkûöçvß–©i¯ïÛÛ~XÎZ¿º3µ?G8é®¶;küÇMu±Û_äœ|©i¯ïÛÛ~Xr¥¦¿¿nwmùa–¯îŒÅ-OÐú‹Ôº„Êl¹Œ°ëÔÉ'*µÎ–­ÓeÆMV$Øÿfó‰±Ü¹×ÞDe›ÇMu±Û_äœ|©i¯ïÛÛ~Xr¥¦¿¿nwmùa–¯îŒÅ-OÐø‹¢Äà|›JÀYTxš¦Í<¥eÌÛvoš“È‹‘X¹©ê!›ÇMu±Û_äœ|©i¯ïÛÛ~Xr¥¦¿¿nwmùa–¯îŒÅ-OÑÎ:k­ŽÚÿ qÓ]lv×ùç*Zkûöçvß–©i¯ïÛÛ~Xe«û£1KSôsŽšëc¶¿Èt×[µþAùÇÊ–šþý¹Ý·å‡*Zkûöçvß–jþèÌRÔý㦺Øí¯ò5ÖÇm~qò¥¦¿¿nwmùaÊ–šþý¹Ý·å†Z¿º3µ?G8é®¶;küÇMu±Û_äœ|©i¯ïÛÛ~Xr¥¦¿¿nwmùa–¯îŒÅ-OÑÎ:k­ŽÚÿ qÓ]lv×ùç*Zkûöçvß–©i¯ïÛÛ~Xe«û£1KSôVú|LÁ X¬ ›e†IHm´‘X’”“v""è!÷㦺Øí¯òÎ>T´×÷íÎí¿,9RÓ_ß·;¶ü°ËW÷Fb–§èç5ÖÇm8é®¶;küƒó•-5ýûs»oËT´×÷íÎí¿,2Õýј¥©ú9ÇMu±Û_ä'ÓÜšÌç#A\¦¶Ú}D£q´¬ÒkJU«¹ ¹ü¥}Ä?:¹RÓ_ß·;¶ü°åKM~ÜîÛòÃ-_ÝŠZŸ£œt×[µþ@㦺Øí¯òÎ>T´×÷íÎí¿,9RÓ_ß·;¶ü°ËW÷Fb–§èç5ÖÇm8é®¶;küƒó•-5ýûs»oËT´×÷íÎí¿,2Õýј¥©ú9ÇMu±Û_ä:k­ŽÚÿ üãåKM~ÜîÛòÕ-5ýûs»oË µtf)j~ŽqÓ]lv×ùŽšëc¶¿È?8ùRÓ_ß·;¶ü°åKM~ÜîÛòÃ-_ÝŠZŸ£œt×[µþ@㦺Øí¯òÎ>T´×÷íÎí¿,9RÓ_ß·;¶ü°ËW÷Fb–§èç5ÖÇm8é®¶;küƒó•-5ýûs»oËT´×÷íÎí¿,2Õýј¥©ú9ÇMu±Û_ä:k­ŽÚÿ üãåKM~ÜîÛòÕ-5ýûs»oË µtf)j~ŽqÓ]lv×ùŽšëc¶¿È?6jzaÓ->:^{¾¤©YHÓFw±ŸKÈk¹yÒçßi½Ë?E8NÒ$Œã%t~›ñÓ]lv×ùŽšëc¶¿È?29yÒçßi½Ë?9yÒçßY½Ë?k¼ÛqúoÇMu±Û_ä:k­ŽÚÿ üÈåçKŸ}¦÷,þ@åçKŸ}¦÷,þ@Þ7¦üt×[µþAP®6ÔuJK%Q’·S:¿jñ’d'9!£3±”’ë2-£óC—.}ö›Ü³ù—.}õ›Ü³ùxÜ{kÒüeðž¿ó:wê?¤ŠŽ9Å8¹‡chº·úŒc¶ã•*y¥*RLˆÎÒ/k"òó¥Ï¾Ó{– ró¥Ï¾³{– ÆË?D„(‰HR”© #J’¢¹( È÷üîåçKŸ}¦÷,þ@åçKŸ}f÷,þ@Ùcqú M¥Ri‹qtÊM:Ü+-Qb6ɯúÍ$Wƒó·—.}õ›Ü³ù—.}õ›Ü³ù-¹ŠŒU’?D€~vòó¥Ï¾Ó{– ró¥Ï¾Ó{– ÎË3sôHço/:\ûë7¹gò/:\ûë7¹gòË?D†§G©8ºl9&-Flö×[í©£~L‡ÎBHÉDÛæ•X̯šÆecåçKŸ}¦÷,þ@åçKŸ}f÷,þ@Ùf$”•™ú=Ái?j¨üîwˆÖ×ð¶ Ä1[‰ˆimÖc4óo¡ŠŒùRZKˆQ)*$9tßefÔ©h;¥jIþyòó¥Ï¾Ó{– ró¥Ï¾³{– ÕSKzHÖ4éÁÞ*Ìý7㦺Øí¯ò5ÖÇm~dró¥Ï¾Ó{– ró¥Ï¾³{– ßy¾ãôߎšëc¶¿Èt×[µþAù‘ËΗ>úÍîYüËΗ>úÍîYü¼n?Møé®¶;küÇMu±Û_䙼ésï¬ÞåŸÈ¼ésï¬ÞåŸÈÆãôߎšëc¶¿Èt×[µþAù‘ËΗ>úÍîYüËΗ>úÍîYü¼n?Møé®¶;küÇMu±Û_䙼ésï¬ÞåŸÈ¼ésï¬ÞåŸÈÆãôߎšëc¶¿Èt×[µþAù‘ËΗ>ûMîYüËΗ>ûMîYü¼n?Møé®¶;küÇMu±Û_䙼ésï¬ÞåŸÈ¼ésï¬ÞåŸÈÆãôߎšëc¶¿Èt×[µþAù‘ËΗ>ûMîYüËΗ>ûMîYü¼n?M«0é% [)I-*3%,ÎÄ¢=Ù?òoÓçüžP?çoÿJÇŸyyÒçßY½Ë?hq®’q¾3§3OÄõ÷ªQ™{\Úi²Ê»\)#Üf`÷7XòM6•è•Zƒr,õ9-:¦2zí)zµ/5öeZš+[n}åm¾¶ëPÁu8TºÖj¢d.›%‡bÌK %9«qœÉ%©'•dFdWIŒÿ¦7¾.ßüù?â«lP¿þïüM„Œ4©¬;„K˜ç'CH$4©M¾ëi5ó_TÒW|¹l¥f4å,úùZ¶Ë.>q™u”G\“u‰M:ƒm+Jd¤(ÉF“Zn’32#¹•¶Žºƒ¤xÔú…rzà-K©U[ÓFÓn6Ìb69£*î•S)R¤šO!‘ìßüÌǵVè¨S’gQc*Bf´Õ0ÔÔ”%§‰ Gæšò'bÔ£ÚIØ›mõMª—à|…¡n'2æ Å ÍàK¤hÑÎ/\F¥•>)4äv¥]UÉ6Øu Zp˶ْ“ÏYHÎÆd{ÿb¬᪤ү¡¼34Žã2£“3! qJp²,µŠ#I‰V"ÌãQQÅ”é<{‘™eÆj›IjéO5èÜ:•Îõ‚¹c+žÔÜŠçm6§µ¸Þбó-b…FY¢ž®Ã’[ì!–Ûl¢þÐ7l¢>љؓ•IQ)E›'ðb3Cð#\’y„4mHaÈÎ6ãrÖkÉ̹H£8yŠè"Jó)’%t5Ý!Qgài46cT%ÚcQ Km3¥ª: Ìó^×§?ÑüMìÚ¬¿ÅÒbá*5oUàȆL¥ÙQ£4í‰ ª)VBÖD´™Ni&•X”Dá¶_U6oc;4ïcHZ?ª§ ÖkOͤ´ºT¶[SŠzԸ˯Эo?š„åJIFæee¹¡D0ƒ+íâ7°ô†éñªlç'‘TŒÉ%HpÛ4–á'>b;&÷QYDF“#=Ígáz„KNf4Ú|yÏ™ãÂh‰oÇaæÕ²ZRÒ]SÊYä57(†cxà =Œñ}ze=ìÕZ›“)Ï;M1M6§\Z›SO+V•(”Ž?.C±Æv§÷øÙ‰Fuw©´‰o?§§Vݤ;¤ÆáM-0ß5¥¼•-f·”FƒË”’•(É+%ÑJïqÇgƒjµÙ8SZýW´ÔfÖäþž\¶Û{ìñþ‘‹Ù¯HE]¢ƒ¤bÍ7µë˜}èêRfádZRÅÊÙˆÍV¹8hý)¡eã«Txó‰8Ÿ‚jÁrð>­ÖçÍ}_;&O[ø¬0¥?PãCUˆp&( G˜õR puRÛnk»óe#[hY©)5l%Nåc;æ‡iZŔ鸇Hu™––±.·¥INfóÔ’ZÎvÎcJ-™¹Æ]K‹Aɯê4’Iî75ê˜ÂÝ PpŸÛø³û§Sû®Ó.z¹¹Ù5ÖÞY²ßeök†«J¦qEF«Prr†ÉãhŽÆá5›9£yæËkží£·¦ifµá©‘ñ%cÒÛ¥5"œÔÅ¥ DvXCéKD¼†KSnÛ6m¶¹“ÚAŠö&Ég¢šBiZ¦¨kAGàùŽjˆßNdoMŒö™’V´;U4%´50ñ~Œ«´ÜGUKŠ—iÌÍ–Õ<ߤJi‰²f–óœYJ¹%7Ù{XÈpBæÆ8ÇHÅX32¦¹ñ]•PODf”‹Zd†›}zÛ´«-&i$/š¢2=·ÈÍ)I¯ê1QE=À¤`ÿŠÚÿN_î¨r#®Æâ¶¿Ó—ûªˆâ㽩ÖÁû"D *‰èbz !H@z è````D  0ë°ôO¬yªF«¬(Ò¹tã2êqzW¬pU_ß,x¯ðÿŽâü*u¯êµî¯ÂöýYöØÏ ¡Ž¥:ÿÓ{~6ìS«À•to“¶¿Ê> ÁÕ4×áöÕùE›#pÖÉÜ>ÊŸñ—‰Ë‹],ÿ‡ðk‚}Jõx^z7½´¯ðr…-Ücû~·‘¸Æ®OH½Kø«Ä%Å®…Yx&z>§*å2B7­¯ì3ðÅqÍ?ëé[ƶFóéÿãeÅ®…yxFz>¦µdiÞ>Ku)ÞF>ÏŒ7ÅÈxæ-ú®„2ðÊ ^¤ªcIÞ•ÿ¨‡ðª‹ Þ—?Ô^#шïH³Ä¿UЊ^EUãô;þ¢ñ«‘ {oöKÄiÝ®î1b>']èFð4‘¾V"„Eµ©’ñ?I {=”øŽißTÆ?H±ufFðtŽ·ÒhÆOe>!é<c'²ŸÉ¶z©Œ#®ôš±“ÙOˆzOØÉì§ÄrGÐ 3ÕFN‘×zMØÉì§Ä=&ìdöSâ9 õQ“¤uÞ“@ö2{)ñIà{=”øŽD=Tdéw¤ð=ŒžÊ|CÒhÆOe>#‘ÏU:G]é4c'²Ÿôž±“ÙOˆä@3ÕFN‘×zOØÉì§Ä='ìdöSâ9 õQ“¤uÞ“@ö2{)ñI {=”øŽD„õ†z¨ÉÒ:ßI {=”ø‡¤Ð=ŒžÊ|G"žª2tŽ»ÒxÆOe>!é4c'²ŸÈ€gªŒ#®ôš±“ÙOˆzMØÉì§Är]b=Tdéw¤Ð=ŒžÊ|CÒhÆOe>#‘ÏU:G]é<c'²Ÿôž±“ÙOˆä@3ÕFN‘×zOØÉì§Ä='ìdöSâ9 õQ“¤uÞ“Àö2{)ñI {=”øŽD3ÕFN‘×zMØÉì§Ä='ìdöSâ9 õQ“¤uÞ“@ö2{)ñIà{=”øŽK @gªŒ#®ôš±“ÙOˆzMØÉì§Är ê£'Hë½&ìdöSâ“Àö2{)ñ—P€ÏU:G]é4c'²Ÿôž±“ÙOˆäˆ@gªŒ#®ôš±“ÙOˆzOØÉì§Är ê£'Hë½&ìdöSâ“@ö2{)ñ‘@gªŒ#yˆ+ªË-¼•%ÂQšÈˆ­c.ƒþcD+Ô©*’Ú‘=:jš²$@‘3rzžH@’žz‘DL:ÀìýëzçE­7ÁšyýI9ÒFiQ¥v±ží¶ޱ ¦T£ÓâÖPä…2ûÌÙƒI*æ¢J­c-ÛL‡ˆÊ”qéÖÿMïÿÕëù|O»Æ)¼¡ÆëõGóJï ×«S™%ðSTu/"Í&H]ÌŒ¯cÜ9ø8@¥@†üÚ«0\žyb4¦ÍFáô\Èö_gúÈlèÕô¢‹ZU¨¾ãÆ4FKª[—Q¥dd[í½=Cù\ LƒCr©-è’(ê#&Òɬž$嵌·z©ßüÿ¬}à*Ó¦£èžé4Ÿú·Ý«oµÚýÎ5G‰„¥}}ÃÒ÷õâbá :ÒcbÊuV<>„¥<‚Q2f—9äfW"Üw-»sîa&éÕ¬5=©ŒU©5 Ì·¬ÔšHÏXWB’«ì2¾þ£¹Ž™‹(²%â©gœŠÝM¤6ÒÙ©jI!hè+ØËy‘\ƪ¥‰(0âáZ%>k’aÓj Ë“)l©²ÌÎÉßüJ=—èÞ/ÓŽÊšÝ{;ïÿ^믊ø¤ëm»§¾ß.Èǘ%OVΉP‚ÌÈÌ¡ôR™Ži² ´‘í+$ŒÎçb#ÞWµÆº…†éó°^ z©ÅMDY&\Z)Êá.sž³ky+º’£I'Õ,·Iß›·/àên(­âÈ9§ÈˆQÙÁ–”­D”s‰F[¹©#½aÚ÷!ʳ‹¨q4w„)ç)NO¥VÑ6Lt´«“iuÕ\”e”ÎÊNÂ>ŸëÒêŽJÛï뻊·UèVÿ¹²–ÿOÐçôñF Ñ±‹¬Ñe4•$Ÿ€Üe6˜–i¼¼ãؼ÷5lÝÓ´V¯‹ Mu k¹]¡U•8¦¥&óGmê B®«f½Œönëã-æÊÜ/èf7ÙW0ÝŽôŒ·F#½"xÈÄtb»¸ÆS£ÝÆ.À†F#¾©Œ~‘ïªc¤[ @“60Iô}OX‚Ö€=bõˆ ©ñ0&Šte†+ø‡GÅU¬HÑÉJ%um5•*±’¢+%Ä ÌÌö‘ÐUè=ÒN–(t}¼ýš£*i*!›QÝCJrÈA¨¯|¦“"2I\®3ðæ3Ѷ2Ñõ i5ê•2M¸s¢$ÔN5b"IÙ*2Ø”‘–_á##-¤>-ãíP´Ï†*øN†¨4 ;kbD”¶¢vN±µ6nLîyIW¹óoò ‚‰¢Ž3åûÿªô+]ÿ¹æáš½ôËW}Gô½oå·'hž•‡t}GÅu,nË.Ué…2$SÕÇM¤8L’‰fVç̈‹fþÎíÏE´Šn”Ž™‹%M™Šã¾ë)rœóhÖ8‡ò´“ÊgrS‡u(’VRzŒÇ ¦¼_‡±ÑÅ*QáRèÔ³b Þ¥Äj\ÕGM®¤‘+jWI™lþdûiGCp°KìS‘ŒÚ©V¦êJ94õ6äƒ[º³çgRRE²×>vÒ±Zã.¡ uµÆ4˜ÊŸ?SaÙttFZlƒ";%Ó;(ö•ŠÅë&ö¹Óæ¨U0áì[…f•N=*4e\Úq¢7Zã™l´‘î4íµ¶‹i»ÈLÊÜ "W£¡ÈÉàØ~=:\iì¤G™÷ZZM&{Oi™\ìg°€uDtÙš3£cª¾8‹E‡Q”¦CðT½Uœq”Ò«¬ÌÛ#µ’DFfgÍÛ`è§C4:˜ªx{¿¸¨ô¤N§Ç\eBȧTW4‘ Ó—!æ¾²åêŠûâì=3èÏ…ð|j†zä¢äI‹©p²6j’dyÍ9÷ˆØFg·ù´$é‹5ôc·Wqú3˜k‹\”ˆŽ–©îníI¤”eb-¤Gëó°lÅ0©4úì˜t:×ÓÛË©ÁU[t‘«öjÚ›(Í;wÚý#Ö.aL'A RKhš3 Èˆ‡$Uq—%÷©(YfY™m²T’+Ûe‡’ñ$Z\*䨴Z©Õ©í¨‰‰‡L›¥b3<ŠÚ·-½CÐZ>Æz£±N¬@®b\))„%RèÑßìi.­˜”K%žîrvuᣠ£:õ;Iu-Tˆ,BmhŽÕN–ý£ef§$£%¨–K"MÍe¨-¤j.ÑmË6[Ò FÎD×cSZbžä‡ßm Ê—i*¼t«a–³ vXgJX2¥‰´šu™/Ð`bبþ §µd–\hÔ¤"ç˜ó’íº÷+ô†Œ1öp®fšÕvm2¥°re?ž£vµ·m Õü RMd£+e2þ#eèÛEb™I4ì_6Õ:3ß8Ž:˜ .:ÜL¤•쵞R,É6¶8…g‹ôo‹¢øò$ã8sê®Áa¾læm })zæ³2ÌL‘å4‘–{_fÛUZIÑìœq¤¤HÄ‹j—‹i‘Ø=^Y2¤G[*% ÒJ3çf-–>²ÌlM£Š®„á`:æ# t:³²X[õ­SÚÖ:iÊ[jK¦\ã+t€1ªšÖ•âàHX™å+ŒÞ˜äCoTÞµMšIµf;’zKÖþCÒV£áz|YÔlmM¯¡çTËÑɾ .:Êþ» Q­)æ™\Ⱥ:ÈYø÷Hxµ§Z^"Š«q)lQSŒ)M©§|žqYT—[3R2«iN÷.£!¡úAã\!‰°Å:¦œEˆc¼j•Z*iÃ5µe6i2+žÔîÙÍ3+^À Tƒ : $@zžH@’¹~ˆtjEsI5•ªTœtQÝq-Kއ•“Ì‘(‰De{•ÿ™Ž¿à¬7Ë¥F³&ì.ô(s Ær:ÆiËm¶“Ë-‰JrÅm™JÂú/bì=ƒ1ôê¦%¨pnÒÜŽ‡5.9w Ö”Ed$ÏrU¶ÖØ7ô-)PšÑî£Ê—ª¨À­Ããg5+3LÏ©Æö‘sˆ³ˆ®{fÐ轟O²›H:v¡R#Ç“-ä°If23j<­¦Ås<ÊèÜ£¿_3]ÑáÏÂÒñz¶ÄÓš…¨Ôe ÛZÖIç4£½Ëœv¿ð™‡t­*`µéW¢TÙaœYˆ…Pb:ó4hŒMäQ­Ïp·^ä[ ŽãWTÒ ¥ÁÑÞ  ÔߨQðõmŠ”ê«±VÑ++ÊR²¶dk±k;[ ˆ®þ]ú>²æ!¬aº~>.¹2e7à­ q³JlkVc$eZÄjØi3µì(³ÃZMÁþ’ø£I­ä¡Î¥"†p,|6ÅOV‰´HéLÆ”’R5o©6I™ÒE°É7±ïä>ŒxJ—Œ4œˆ•˜é• G&8ÂýWM*BJë+¬ŽÝ6¶á¸Æ«aýÔ4‚kk©ªÔŠcÈŠ¦x3dm™ ÍDY•û$•ȈŽê=›s?Gìo i ª½Mœ ×J›Ne!*4¨”EÓe!7.«ÿP¶ÒÖttŒº$:Z…[UY¦µ«lØ'\#Q$¿ˆ’ʶ–ÓÍüˆvÚVÂø*Äò¦aJ.’ÔV Ô`µi2ž[FvpËlùK¼ŒÏùŠócì!LØ+ai×ét ™T¤¼ôu2—ÌRɲJÊûœYÊÛ·í·SŽ´¥£ç¨8Úu.­:«?Db:)CZHhÛÌjW4÷ææ™íIX—©ajD]RñS² ª¤Ùjaê" øÉ#t‰ÅYf«­'µûÂÛº÷FÀn¢“J†Û"t:KšøhÕ¯*Z2R)5$É)µ”Ö9Ú•gGxóKÕ™ØÂSX~€„>˜R¨Ð”Òæ,¤¶ë©Õ¬ÍÅ¡j5(Ò›åNíÆ.€p…2­_‹ˆ1Jt&* Bi¥¦å6c«$¶ÉúÉ+ç_ôKnñß#Gøz»ô±­Ð—JŒÕ©§3dËK³ &ɱÜ#>½·Þc‡Ñ~–Ý¡5†påVƒ†_£Sj tæÊ§­é1Ò·³¸ê •±i#;S~jwØvӴ݇¢éø«Ðá@w“ ŠåF%5*Jm“5;žÊ^­m$¬VMí}€céI\<=Aœî Ã4¥HZȪXzVhÏZÿ²R D²Ùκ¯•V>‚ãôO[Â4•˜—9_šqòR£)¤¸Æ¼ïcu&¢¹_)l#ØjÙ{ŸKx¿ žŒ0öŽðJEb56S’Ýžìe3sQ¸iA%[áUsݰ¿³[ôy›èØÅuüiVD./A.žÚâºòVùÞË2m'±½ŽÛLŒ·,|e£ü-TÒÖŽéH‹GX†r«´¸…«i¼ë2’KÕÌiu-±7ß´cioaŠÎ‹ñM~•†é”IxW¹KB ²MëÙJÛožE±J3pŽûö3ÍKÑ0þ˜¨ÚA‹ŽÆo®K«¨)nÃ8íI”†d¢Èµ‘nÈWßq³Ò¶?Á|ž×pީɪ=‰+‹«L[‘VÊc”…›|ëf<ÈNí›ÿ•À±Gx7Ž9)ôf›¯ô[Œ¸ÛWý×Âuº¬ÚÍöÍÎË»¢ÖØ9màHÑ…+¢†«U:ÅIMkÎåe,%KF­­Šýª”ƒ±’OQ ÃÓ.Ö>)Ó=*ôwŠ8«‚«.·Y¬Ök}\¹¿íÑ}ƒ–ÑN?Á瀨XkUeRÃuÆêðÝn2žL’J”½Q幤ó-[Oe¬«4‘€ãªÄN"* µ$Òtò\–eÉ+±fIï-›Œ‡<:­-bv1–‘k’3 f<ÇS©BýlˆBP“;n3$‘Ÿó1Ê€?DúÇUýòÇ{Ö8ÕÒêu9•62i·lü…9–÷µò‘Úö?õÏØDÝV‘è›q…äìs7 lî{âÅÌ3X?ú“žìŒT\Ü/X?úšüÐR‹\QÍ©^“þåÔãdn1«“Ò;‡°6Uí…+ÿT_€ÁG8ñWË„«ÿUW€éQ’\YNuaª8)[ƶFóú1Ò ½\X?ú²†Ú*Ò:f ¬ý\ÇJZkŒ—R¤çJíñ†ø±Ñ’Õ»V;Šî‡´ž­Ø"±ÜŽ…"9ÓÃúÇa>!ŸÂócÕw2Э@Y|‚é‡áýc°ŸäL?ë„ø† ÍUÜlËB´eò ¦‡õŽÂ|Dr ¦‡õŽÂ|C?…æÇªî6e¡Z€²¹ÓÃúÇa>"yÓÃúÇa>!ŸÂócÕw2ЭY|‚é‡áýc°Ÿ‚é‡áýc°ŸÏáy±ê»™hV ,®AtÃðþ±ØOˆr ¦‡õŽÂ|C?…æÇªî6e¡Zž±er ¦‡õŽÂ|C]0ü?¬vâü/6=Wq³- ЗÈ.˜~Ö; ñAtÃðþ±ØOˆgð¼Øõ]ÆÌ´+@W ºaøXì'ÄO ºaøXì'Ä3ø^lz®ãfZ¯Xeò ¦‡õŽÂ|C]0ü?¬vâü/6=Wq³- ЗÈ.˜~Ö; ñAtÃðþ±ØOˆgð¼Øõ]ÆÌ´+@W ºaøXì'Ä9ÓÃúÇa>!ŸÂócÕw2Э@Y\‚é‡áýc°ŸäL?ë„ø† ÍUÜlËBµW ºaøXì'ÄO ºaøXì'Ä3ø^lz®ãfZ  /]0ü?¬vâ#]0ü?¬vâü/6=Wq³- Û @²ùÓÃúÇa>"9ÓÃúÇa>!ŸÂócÕw2Э@Y|‚é‡áýc°ŸäL?ë„ø† ÍUÜlËBµê,¾AtÃðþ±ØOˆŽAtÃðþ±ØOˆgð¼Øõ]ÆÌ´+b,²Ð.˜~Ö; ñÈ.˜~Ö; ñ þ›«¸Ù–…jËäL?ë„øˆäL?ë„ø† ÍUÜlËB¶ èW ºaøXì'Ä9ÓÃúÇa>!ŸÂócÕw2ЭY\‚é‡áýc°Ÿ<‚é‡áýc°ŸÏáy±ê»™hV¢—È.˜~Ö; ñÈ.˜~Ö; ñ þ›«¸Ù–…mÐ Å—È.˜~Ö; ñAtÃðþ±ØOˆgð¼Øõ]ÆÌ´+@_ ºaøXì'ÄG ºaøXì'Ä3ø^lz®ãfZ±YhL?ë„øˆäL?ë„ø† ÍUÜlËB¶è,¾AtÃðþ±ØOˆŽAtÃðþ±ØOˆgð¼Øõ]ÆÌ´+PW ºaøXì'Ä9ÓÃúÇa>!ŸÂócÕw2ЭL Y|‚é‡áýc°ŸäL?ë„ø† ÍUÜlËB´er ¦‡õŽÂ|C]0ü?¬vâü/6=Wq³- Ô—È.˜~Ö; ñÈ.˜~Ö; ñ þ›«¸Ù–…jËäL?ë„øˆäL?ë„ø† ÍUÜlËB¶,¾AtÃðþ±ØOˆŽAtÃðþ±ØOˆgð¼Øõ]ÆÌ´+PW ºaøXì'Ä9ÓÃúÇa>!ŸÂócÕw2Э@Y\‚é‡áýc°ŸäL?ë„ø† ÍUÜlËBµer ¦‡õŽÂ|C]0ü?¬vâü/6=Wq³- Ô•È.˜~Ö; ñAtÃðþ±ØOˆgð¼Øõ]ÆÌ´+P_ ºaøXì'Ä9ÓÃúÇa>!ŸÂócÕw2ЭY\‚é‡áýc°ŸäL?ë„ø† ÍUÜlËB¶0ëW ºaøXì'Ä9ÓÃúÇa>!ŸÂócÕw2ЭoñÆ Äø"£›Š©R¦IŒRšeå$ÖmÖ‚Q‘ۜڶe÷è˜Î3JQwLÔýëW÷ËïXિ¾Xüÿ…öŒôhû$hänÙ;†ÊFá­“¸wè”*ÙŒjäô¤Æ5rzGVFf²Vñ­‘¼ÆÊVñ­‘¼ÇV‰Nf¹ñ†øÌ|a¾:TÊÒ0ÝŽôŒ·F#½"ì$b:1]Üc)ÑŠîã`C#ßTÆ?HÈwÕ1Ò-Ç  Iˆ$ú >'¬A ë@ž±zÄžzž¡z„$„ !$ƒ : $@zžH@’žz‘DL:ÀìýëW÷ËïXિ¾Xüû…öŒôhû$hänÙ;†ÊFá­“¸wè”*ÙŒjäô¤Æ5rzGVFf²Vñ­‘¼ÆÊVñ­‘¼ÇV‰Nf¹ñ†øÌ|a¾:TÊÒ0ÝŽôŒ·F#½"ì$b:1]Üc)ÑŠîã`C#ßTÆ?HÈwÕ1Ò-Ç  Iˆ$ú >'¬A ë@ž±zÄžzž¡z„$„ !$ƒ : $@zžH@’žz‘DL:ÀìýëW÷ËïXિ¾Xüû…öŒôhû$hänÙ;†ÊFá­“¸wè”*ÙŒjäô¤Æ5rzGVFf²Vñ­‘¼ÆÊVñ­‘¼ÇV‰Nf¹ñ†øÌ|a¾:TÊÒ0ÝŽôŒ·F#½"ì$b:1]Üc)ÑŠîã`C#ßTÆ?HÈwÕ1Ò-Ç  Iˆ$ú >'¬A ë@ž±zÄžzž¡z„$„ !$ƒ : $@zžH@’žz‘DL:ÀìýëW÷ËïXિ¾Xüû…öŒôhû$hänÙ;†ÊFá­“¸wè”*ÙŒjäô¤Æ5rzGVFf²Vñ­‘¼ÆÊVñ­‘¼ÇV‰Nf¹ñ†øÌ|a¾:TÊÒ0ÝŽôŒ·F#½"ì$b:1]Üc)ÑŠîã`C#ßTÆ?HÈwÕ1Ò-Ç  I‹èØûì鎎ÛO8ÚD†ÝJTdN'PµeQt–d¤ì})#èR‡™5 ]'-˜¹hW'Ð Z¸‰O3c=&¥3IÔ‡’kVlª5$ДÙ*A©&“¾û\Èeb<JÅXʦ?2øX‘dœ•¥m;Âe)²R’Fœªè3UËnÁ2ÂÉÆëø¹œ“³*Cñi”iGRª)šdÈL¸RßJз NE8„¥$H͈ËiÙ)Ú{Š—Ö¥åÛí~ÆðžÝÀ ¡qi˜‡Gú*¥×ݪ:äç¦ÂŽó¤›ÈCi5gJ³%$H"I[ao+”˜Ð©š•FÄNÔ'E¥ãWa ¢>H2ÊÉß)­*$¦æµX‹iŸEÌĹ_[îµÿ$ÿr?;áëþ p¡Š´uFÂQksjó'Îb%]ºdTEZ_=‚{X¼ÉUì•e+\ÈöØVtaA‰Š±THÏÎU?GˆkDŠŒv’ëäF_¶q m¤‘¶’ŒÌ¶8ˆ±”¨·?¾=™Ÿ>‡rŸiSð&v±]Šª¤™±ááÕV˜\ì:l©ÏŽé¥*JÔF{ÒiØ[¹ÅncIXr›GU1Ù*‹U£Ç©!•8Ö´•t’DJ¶]ö-ãIáçí3hÕŒ‘ʲôù—¦±_zAAs L[í4¯[.R%[q¨‰K"3ݘúÌtú!¢Å¤i ×hrg³Çœ—"¾ñ)i6P²RT¤¥$´‰ +¤¶¤ †ô°®¦ËOå¾ß¹¬ëlßw×(ÒÖ- !…ðÔ•á\K‰ÏA{µI— c­¯X³$©+/ÙÛ!ßœƒ#¹]9¶Ü.a*.#ÒÎ(¦ÁeÚ]>”S¤Èk„´’^©ÕV”hBAÝ$D¬Ä‚#33-ØËI¤×©Ÿ9\¬Z0p&‘]§2þ&‹‰_tâ^3Î5! "K*ÙdK%‰Yz ¬f7t%‡hµÜON©áÊŠ”Æ‘;$Éqß$¨•µl8–­sNL®X&K#J®VÌp“|L:ñE&é(ØT—U·`ÖfÒY-IMö¨ˆ‰Gn’"¿Qn½áÃŘΛ‡¸IF)n(”í¯•)I­V.“²NßÌWŒ\¤¢¸²VÒWf‡¬@°ð¦ÃXƱEv³N[•ŒéÌÊòTÖ©× d´¡)BìÑ‘ îgšäg”ÇÚƒpÍ^5±ڦϯ•Dwd¶o’–’4:…“v±f¹¤Ò{­}·)–rW_w#ub¸•° àÜ;F¡J¬Á]UÖiøÚ,–^}¼Ï! 5æB‰¾aØŒ¶’¶í·@ØéGXv*MTßÃK‚fr]mhy2H¶Y(I‘¤Î÷¿ò·HËÂÍ_áٿمZ;¾þø•8ë¨Xz’œ+VŽl†QM9˜°ÝCK5›zÃZ–¤®É"ØE—iõa7do)(œˆ * øª°µWÞnŠ˜°YÐÂD’O1ISFdi3Qg#4¨Œ”Eo[/“ºJª£„TÔ×¢^‘Ó•®A)¾oî,‡Ÿi–ÔåØ[¶ì›+7÷óìiçDª€‡]¤ì;KÃòhJ¤œÒb©DRR%:—Ú5Ý$¤¡$dD’èëþ¡È‚pp–Ë7Œ”•ÐjèÒ‰N¢IÀxŽDš™Ô+usj7y-¡”6ò[Q8YLÖKÌddFžižýÇ÷¯ÂfE/KòÓ"c/D­ ÜBVÙ²úW1d’RM²4™(î••îW-›l,3Ù»v¹¬¯o¾6*NÕŘ&‹‡pØ“L©T“£®5^I•6Ûæ´_XÑ œjÜì¦KQ’²Þלð¬BÄx·ÕX™-„½‰ º”¨ÈœN¡jÊ¢é,ÉIØúRGÐ ¥2j»Î[1rЮz„ :£ªUnF:TÙ‘˜Ä‡-/“KŠkƒ(ÉF“I$¹Ä[ïcé1‘‚è´Øõ,'Œ°ÔŠœ6•Ф¼Ä—Ò§ùTj%!)æ© RT“.›\ÈJ°³oßèÑÖßßÀªˆ@µqÍ&v8Å4i5(UJw3Ê[ÉÊá»!dJk*IHRVWÞ­…}Ý/áÚF"Ò>8&×9е.˜Š‘¸§qÜCl²FÞL¹ˆò™YY·Ü­³nÏ +6ŸùãØÕWW[¾÷w(ÐÍ‹EwKø èò*gá†ßb<óeÔ±vžRP¢&’N%$“µÈ•˜ÉWÙ”WXr@ªÒñ6$uª›4š+QÍÓ- âÝ^B»º²MˆÈÌù›Œ‹ùž²Ã5Áëù+™U“ôû{Ž0ƒ YHÎMO I7¤>náhKÖHVgWu8y–}*=æ}b´èU§åÍÆæð–Ôn@ Ö•DƒpNŒ(5‰U-š³q_mÒ2kT«§1(ŒÔ’KiI$Œ¬];,9ñpê~§R‘Gqʤ*ŒRóhs75'œmšµE²íßjˆÏ1^Å4°­o¾ë_òNß™¢¬žëzþí~År XøÒ.cC¸"\z;ŒÔf"i”<Ù”‡ÒJ7lÞg ~BÌYíutí¹<Âs1 Ar·]~„šœw^’ÓÇZ›ZÉ "i&´ó-rËmûobÆVMÙ=?>|ä•ßÇò*>' AŠÄ w¢XLÎŒr&F}Œ7.BÂÛÊ´$‹3kJУ2Qšv¤Òe”úî]ÑÞ®SðYµ˜ó1+3’j) ©¶]ŒGζ¬ŒÒ£Ióor¹s¶\ìC *‰8ú÷·îE*ª-ßïÔ©@·pi¼3 …W)IŸª¬DqÎLyHA©eÖŒÄm«3%²í¬w<ÄGb¬hîv!ÃìKžuŠ ªoÉZÐqŸ²µ¶”s'c…c5Ì·ËÃ=”âï÷þ9]¦Vô ƧÁ«cE&¢™tÆã,㸔-:Å DjJ‹a™­´ŠÛ/r¯í4‘+vW4À.ÑÖ× Éúj°ÚÓ¯k2”gÍtW°ˆ·•ŽöÞ‘¬ƒ£ªsë³êR×!ŠuuÊ;M¦¡ ¨ÑsS†ãüÓØEdÓÛ¶Äf,<%DEçĬŒ Y©ÁXJ5/L~£2¨Þ‘Ø“N˜ÖªS/¬’Eê*Ê-·2Q•Ïw7oßèæ…E…ŒŠÚ‹’°Ó°ŒÖòm¼Ü“+')$Œ”›—:ö>¢…©kýúöf|èÞß~ÑU€´+;£EˆpûçbƒH*›òV´gì„-m¥œÉØáXÍGs-Ä1±maÇ(«’Æ%}º­ ª’[nk¦Vá(ÒƒQ³e$̈ŒìFDFvUò–q½÷[þ­À®Yø×áj%%êÔ$V_¤È¦°õ2JæµûY.¨ùŠ"gøI+3Iù›Ë6ÊÀGV“¦ìÍ¡55tYxázƤUª'XD©¸º#„ĖɬFbpˆÛ3M³Êç|§ºû#`±ÁU|±ÞõŽ «ûåÏx_hÏG²FŽFá­“¸l¤nÙ;‡~‰B¡­‘¸Æ®OHÚHÜcW'¤uhfk%oÙÌl¥oÙÌuh”ækŸoŒÇÆã¥L­# шïHËtb;Ò.À‚F#£ÝÆ2®î1v21õLcôŒ‡}Sý"Üx°c¥Ñî&k Õœª¦<ÅÍ$dŽìw˜A´G|ÿ½aÒ¹•Šå”ȳÒQŽhÄ !7 )G‰¬¢¤¬Ë”*qI§H*el•Ntߊ‚Ÿ ›C§½ÃGÊ¥ôçQ¯¶÷Ú?š¾iõV\jdC•Ù%)Óf«•:ñÉkSpÈÔe}—3·E¬+Óè%ÌÕµ®iäÃBƪi-¹´zµ<¡U?¾dnÉ„´º²#ʵ‘BJ”¢;bQ+asˆÈŒ«¥J³©¾NæÑ„aÀ²¢i2$Hè1éÕ–ãÓR¤ÂIMƒv/k©'ÀnK=ùýk™îg?H´ø4”R˜¦VN$œ½[³¡;ã¿ík‚fµmÞ£;X­¸­\€“5WSO&á<õG+ Æmªs©}ÂL˜s’ë¥~y“¬$›Ql²“·ú¬Cø®i*?Õq4ZÓÔ’–¤4šœu0ëiJR’SNEZObHìf«öŠÄsUmkýý±äÂ÷,xF§Á•.LjU]+—¢:•L‚´j6ݤ¡PM(A™™šRDGÒF9ìm‰šÄ1©1Ú1¤S#pVŽSÌ:¢i$’B M°ÒŒ“cõ[Îֹߙ¤±%–÷T¢Ò:ì‹£áh³Òˆ•Iœƒeç£IŽÝÙ2õ?kÕÎæf•ù»9¤cwIPâVcUãSëmKˆÁÇŠiŸ $tòm¾‘{ni"3#2½ŒÅlEH¤“à(IÝ£¾›Ž)38;NÄ((pˆÉb­”¡Û‘ë,ˆdJ]ȹÇsþc"F‘¡?Un¨¨X›7L”ÕN#iQ¹ma­ „IYªÅ˜ÔG{÷ ä„õŒæjê<˜hXŒé –Ëêuª=U)\uGS.Õ©IR‹SÀuw5!g–ç”¶ˆFলª¹AÄ)Pø ‘Õ"\v§Tp²dþŽ[ ì5WSL46xž¦šÅrEEÚ$PûˆZ’IA$ŠèBbµˆ‰$DV.‹‰ÂÕÔšÃu ÔT¦9ì* ÄÆq••™M¬­kì·NþƒÕ€‹mímz’l«X°%ãº\‰‘¥:¾ÃÑž9 *-R,{:{Ü2nIJ?óŽæ>ªÒ9SàÍâÊÒ\€òŸŒ„N„–›t÷¹«(Y }9ŒŒÈÈŽ÷!]õˆæjêiäÃBÇ›¤jtÈÒcK¤U^bTôÔ^ir U$‰%¬·±’H•mŠº¯|ʺ¹¤´U#V’ä*ªŸ¬FC–ì˜JKº²V©KJa$ÌÒjØdiVÄÙE•&UÀ ¼UWêcɆ€uøKÓ¨T—!.ŸUr •%¾Q23Ê­KÑ\"2+îgý[‹'(;ÄÞQRVeµ†ôƒƒ P1#r â…TkJmNg~,”/Tf¤©m%)%*#mdIµ‹ iÛÇôôW]­”,Ds^Žq\RªÑTÚ™2¶¯Vpòd±6Öè ^*£I_¢£ çS±ab„ÓKQ1“Ž…Ju‡«+eI)¦;ÖÍë­s¿,@!œå7µ.$‘ŠŠ²;Ì3ŽáP©páÇ…[5Eq2®0Ф¶öÌËhœˆ³lŒËq+vÃ3éË{HÔç£Vc9Hª›U¥ë*$R ½VØ£2ƒr2>qZÊ3QsŒÌ뀬MT¬™££ïbÉ©é" I/&].®¤È}$¥à ¤­™&é& ¤G¶Ë¹!õ™¥w]RS1je6§,Hq÷ :‡‰$¢F±³‘f±•È̈Šû Õ—@œÝoxÇ“O@:mâf°YʪcÌ\ÒFHîÇy„Dw%þõ‡JæV+–S"Ì[IF9ÂnRIEIY–š@¦®-:2iµÖ[¦ÉrLEF#J޵¨Ô¼ŠD"4¤ÍGÌ#˰ŠÖ"·ô½!Ó•> Þ,­%È)øÈDèIi·U½ÍYBÈkéÌdfFDw¹ ï¨@—3WSO&-OHtêšT™´ÊÛ¨rQLy>Rû¤w%:E‰Â.¥Ü­²ÖÝoIQk(šš„*û‡9)D§R†ÛŽ¡6² h„J˰¹··òÚ+‚3š«©&D$B‘V¥Õ•O­µ6”Þª ¬O„ɲݭ’È„Di"3"IÜŠçb+þHÒ1’Š]m:ØülBSYY5< WlÆjõw™žóà fªê<˜huXÿ–*âÛ³1 ‚ɰ•Êu‡«Ù•$¦˜hìV?[7¬vµÎü·@t§9MíK‰$b¢¬‹*“bÁjÔ:ue„ѳñy¢l63 Ð»¹æ%kß1ÙGs"1LÇôºdi Òël0ü£˜m•B¥·ímcdp¬Òˆ¶£-‹u…zlÕ]Hü˜hwÑñÅ%Œ>Š tÚÿBChUR*–Ú]ýâPáÃ΂VÛ’L¯}££ÅLÂŽC¦E ÄÄ䈔ÄÓ kv$wRÊ )\Ôº²RˆÌ•”Ð[ aôSâV.ªV¸t`ÝÉèbz¬JuØFÂѧ$ ÌyùÈ6_[OF$­ƒ-­š^ŒéØÎ÷±‘+›ræ‘ì &Å‚Õ!¨têË £gâóDØ$lgA¡v>sÌJ<×¾c²ŽæDb´ªò¹ DJ.…\}¢ãÊcNtéø†G8NËDº´Y º²Ü£CÔ›—AÛ`àj±äÿC.”_¡cÁÒ<yªumj9jšK~|'–‡Ì’“Z¸Fh;!$YL­b°àj’xmNT˾z÷–íßtœsœ£>rˆ‹2¶í;ÏmˆcÖu§5i31„c½† Å´ü;M~2`U]rbI3 3ceQ©²v+„F›–Û™ÞæVÜ6qÝ&n~…*•[zò•1Ôª£:ßR®n›œ >s½³^ùy¾®Á_€Ùb*%²žã”[½Žò“¨´ÊriÑiµÄC†ëmH¨Ä|šYïR5•öoM†T]#ANjžÕ:¹©jyTPk¨C[œ(—œž7Ôk¾Ë™ÓÍõv äV&ªàãèX§¤:qɨH:elÕQtŸ”ƒŸ Û[¥¹ÂGÊ•ôçI¯¶÷Ú2%é>$¹³&K¥Tä½4šá&ôŠzÉÓk16£IÀ¶d’ÔD«^Ö+ØŠÕ™‡XÎj®¦<˜hlñeYUÜC.¬µLR¤¨”g-ô¼íò‘mRP‚=Û’V+EƬA&äîɲ²?DúÇUýòÇ{Ö8*¯ï–?>a}£=>É9†¶NᲑ¸kdîú% †¶Fã¹=#i#q\ž‘Õ Q™¬•¼kdo1²•¼kdo1Õ¢S™®|a¾3oŽ•2´Œ7F#½#-шïH» ŽŒWwÊtb»¸ÅØÈÄwÕ1Ò2õLcô‹qàBÁŽö‰„0ÚDYsô·M¥Ëu²SÐÞ¢Íql+¥&¦Û4ªÝdc‚1J´å?ôÉÇåoÝ0‹,ð6~7QþAQò„z £_ÔT|¡[@Z§6]#ô™ºÐ²ýѯÆê?È*>Pz £_ÔT|¡ZeªseÒ?HºÐ²ýѯÆê?È*>PA´kñºò ”+P µNlºGéZW Ú5øÝGùGÊè6~7QþAQò…h–©Í—Hý"ëBËôF¿¨ÿ ¨ùB=ѯÆê?È*>P­@2Õ9²é¤]hY^ƒh×ãuä(=ѯÆê?È*>P­@2Õ9²é¤]hY~ƒh×ãuä(=ѯÆê?È*>P­OXeªseÒ?HºÐ²½ѯÆê?È*>Pz £_ÔT|¡ZeªseÒ?HºÐ²½ѯÆê?È*>PŸA´kñºò ”+@ µNlºGéZ_ Ú5øÝGùGÊA´kñºò ”+^±–©Í—Hý"ëBËôF¿¨ÿ ¨ùAè6~7QþAQò…h–©Í—Hý"ëBÊôF¿¨ÿ ¨ùAè6~7QþAQò…j–©Í—Hý"ëBÊôF¿¨ÿ ¨ùAè6~7QþAQò…j–©Í—Hý"ëBÊôF¿¨ÿ ¨ùB}ѯÆê?È*>P­ƒ-S›.‘úEÖ…—è6~7QþAQò„z £_ÔT|¡Z€eªseÒ?HºÐ²ýѯÆê?È*>PA´kñºò ”+n–©Í—Hý"ëBËôF¿¨ÿ ¨ùAè6~7QþAQò…h–©Í—Hý"ëBËôF¿¨ÿ ¨ùB=ѯÆê?È*>P­º„Z§6]#ô‹­ ,°6~7QþAQò„z £_ÔT|¡[€ËTæË¤~‘u¡eú £_ÔT|¡ƒh×ãuä(V jœÙtÒ.´,¿A´kñºò ”ƒh×ãuä(V¤–©Í—Hý"ëBÉôF¿¨ÿ ¨ùB}ѯÆê?È*>P­2Õ9²é¤]hY~ƒh×ãuä(G Ú5øÝGùGʰ€ËTæË¤~‘u¡eú £_ÔT| ôF¿¨ÿ ¨ùBµèa–©Í—Hý"ëBËôF¿¨ÿ ¨ùB=ѯÆê?È*>P­@2Õ9²é¤]hYe´kñºò ”#Ðmün£ü‚£å Ø„Z§6]#ô‹­ /Ðmün£ü‚£åôF¿¨ÿ ¨ùB¶èjœÙtÒ.´,¯A´kñºò ”ƒh×ãuä(V jœÙtÒ.´,¿A´kñºò ”ƒh×ãuä(V†jœÙtÒ.´,¯A´kñºò ”ƒh×ãuä(V jœÙtÒ.´,¿A´kñºò ”#Ðmün£ü‚£å Ô-S›.‘úEÖ…—è6~7QþAQò„z £_ÔT|¡Z€eªseÒ?HºÐ²ýѯÆê?È*>PA´kñºò ”+a–©Í—Hý"ëBÊôF¿¨ÿ ¨ùAè6~7QþAQò…j–©Í—Hý"ëBÊôF¿¨ÿ ¨ùAè6~7QþAQò…j–©Í—Hý"ëBÊôF¿¨ÿ ¨ùAè6~7QþAQò…j–©Í—Hý"ëBÊôF¿¨ÿ ¨ùAè6~7QþAQò…j–©Í—Hý"ëBËôF¿¨ÿ ¨ùAè6~7QþAQò…h–©Í—Hý"ëBÊôF¿¨ÿ ¨ùAè6~7QþAQò…j–©Í—Hý"ëBËôF¿¨ÿ ¨ùAè6~7QþAQò…jaÖjœÙtÒ.´6¸º"™_‘ƒ^E~žÚ[6ç¢+‘Òê´©dHsœD•š“s"¾[دa©¢¬¬ÝÍOÑ>±ÁU|±ÞõŽ «ûåÏØ_hÏF²FŽFá­“¸uXA–dc:y !æ]¨ÇC­$¤­&âHÈÈöt ½gΫb*üÈò(ôZSUi˜vt‚ŽÒ”N*Í ˆqX·[£ }&Œ§¨œÊÕcY•dÆ5rzE„ÞŽq4ŒQ/­˜ñ^†Ö¾D‡Þ$Çm®‡ æŸòÛ¿föºfå7‰QE{afäNÜ÷*d˜Ž#>K%ËmUÈù¶½ˆÌtèÒšâŠS©JîVñ­‘¼Åí£}»FÓ>‡ˆ£W)5DJ[°´Ê‰$×µÊÆiV]å°ì>xãE®W¢`©”™X[Ç•…à’—6R"ðÉj%씑©n)Q–Û–ÑÕ£‘Juc{||a¾,Ê~ˆ±dÚÕj›1tº+tGÜùÕ9dÌV”­¨,ö;æ##+ã+Úä1äès2g !4ç øJžÝEÈáTúÏëÌ#2#Ù}¥³i ôÈe$UîŒGzG ôW¡Hnéj…KÄõ¬)_¡Mb[¶¦Ö´ÊSM‘HR2«X•:Úòìæ¡gs±§t‡…½¬5MôWõ±Òÿ ¢Íá,"êRr)V+,²ÜË©Ië)É7b ;œ›£ÝÆ2®î1zR1õLcôŒ‡}Sý"Üx°b˜±‚O @³4£Ø8¶¢ª¦ Ÿ-¹VÑÈJ”ᬶÝ(±–eoÛdí¹§}¦Ü CRæWp»´èÊŽj9™qmm¦üöȶˆ‹jKa–îw­Ë~-C7•ßt·¿Dô¿Ý¿N{ñ*+—ßWè¾*¨t=£ýaj&•+?K¨Ö&´H[*} D4•Òƒ#ýçZËv䮥S:FÂ¥…«Ôi­M#2£:—¥‘®•‘nQ\¶î;Ü­´‹—‚ñjÊ“…;ÿKµý¶ûßèsð¾%GRP…÷;_ÑüŽ\PèHîtML#Žj®ÂP‘6X‘d³¬io-+4šˆÌˆí’Ö22çÞäi#.&DŠî¶=R2%ÇáD”­{M-p{šËnÅk9·.ŽŽ‘ÅÅxÌpø‡Gféqw¶rõãª>{ãñÂâ ‹¥ÅÞÚ=ÊÛ÷=Q@ûÏŽq'?ÕœÙuM浯c2¸øÊi«£è#%%tdÉ=bõFèÿEØZ‰ƒ¥JÅOÒê5‰­ÊŸBÑ et Èÿyֲݹ'k©\ÿñ*XÅÎíɤ’ãÿ Ô¥ÇSÁÆ.{ÛvI}úqÔi –¬Q¦µ6ŒÊŒê\J–DVºVE¹ErÛ¸ïr¶Ò.\]§R5"§ µNq©(ð`æàù¡=P¡+âÙ4ÉR$FRàÀuÔ- !IØã„gcY‘ìIú·¹ó½J÷Jø6&šSèó~•%̨lž%.:ìgöÝI±•ü¬{ljåáüZ†#:¿ôî¿£~©}ï9ô|Jjò£O_F·P躆ª/ê²I¢–·&\õ˜ˆ¶}M³ft²ÿ„7{Û.WomK¹îè25üUR޽n»U«³©<Ùõ¬ä¶üÚÖ­¿:=bÕ?C 0ëÌ:Ór7RÐdN ”¤’g¼³%I¹t¤Ë Æ. ¬|5Q|šÉ&ŒZÝ^\õ˜ˆ¶}M³ft²ÿ„7{Û.WomK¹4¢ÂÆÔ¨ø5…Ÿ^ˆçK[õW#J~M“dÔcpË#Nšýa6y*Ôi2#åñÛÜ#W¤køF¶¥!zÝv·YwTy³ë^Ï}ùµ®ß~uúǺ¯ ¸ðôø­{|7ú›Ôƒƒ³âi@NhOP=BBÉ¢XLÒðý2­3Î)fü¥²FäVR—DÚŒÎ×Rv™“†FGb2ÆÇtçjÔ'Ô¢4ÔÖ`2ñ¼EÎ'yæãw¾Ô‘mÕ›¤q?G2èìîN×¾ûÞÜ4¿Çð>wÿPÃ6èlJv½÷ÞöánZðßb¤Û>ˆ’€ è@¹þú9£Õ”Ö*Ås = >Ç‘ýФ™‘­Ò¾Ä‘‘$ýc-¼Ý‹¥âúX µ^ ÑqoDUÆc)àé:µ8~mèS"Ÿ¦,M§˜ƒI‰ÀÔ¢á1êb¥‰M•ýS3õKÕ3ÙÍõk>¼kÁN$´+F´âO@ƒÐ ÄÄ YzÑì[QUSO‰Ü«hä%ÊpˆV[n”XË2·í²vÜÓWŒ¥ƒ£*Õx.¿%ñ Äâiá©:µ8"µ!êÓn¡©s+¸]ÚteG5œˆL¸„6¶Ó~{d[ DEµ%°Ëis½jT0x¸b©*‘ÝGèc ‰Ž&šœw| è' @´Xí4I‚q™™QbK‹•s[©K†G{!²=êUm¬’#3¾ÄªÎÒöŽð¼Öo„×L.HCL¶òIPI.jŒÏ×þ™ÌýcÜiåÕñj±k ï{]¿EÂ×ù߹ϫâTiâÞö»Ñ|Ï>€êëôGJƒTÅÉ:‹hzƒ…ªu¨IÅxFF!rK¦Ôd/Y;šÅ“¨Î¢±¯! ÈíÓkÛÕ²7ÕÉéjUöšmo(J…“IžŒkÓ\ÆÚ.—[Æ´*”˜'WMFsO6Ë-š›4·˜Œ“ŽÄ”™‘fµÊ÷†œê0'«>|iG@Žù°òW©u:ÌÈUš¢¹\i\qò·læ:4æäUò”wžŒÒµW ãÉØËÅÆT*cÎVaÕ Ï“(Š´”™[fònE”Èϧn΃¶ž!§Q§áL‡±ÞSô,æfOª!K¥Ô%æÔ¨Š_ù„Dg›w4‹¤Èyéñ†ø½ äV=ÅkF˜WNرV…%¦å¦¾õ Õ®˜ÚÜim²hQì/\ó[al¸óæ‘pÃxNºTƱ%!l“É•G•¯hˆÔ¢$)V+/›s"½‰E´jŽô‹tãfDÕŒGF+»Œe:1]Übü¤b;ê˜Çéú¦1úE¸ð!`Ä 1cç âØr¤R¢žv—b}…’êð2è>æFd{ o‹\ylCKŒ@5f4®Ä·÷çXÏatöõ[—>'F~e·šyqÚÛ¶ðSpÛ ãÇé´Wiuœ–Ò\De™62²gü=G´ËuŒ­nV¯Q•Tœ¹“Ìⶪ‚èIAëxÃ(ÂrŠÞÍ#N0m¥Ä”Üq…«¯Ð¦:ê§Yy³mÖ‰Õ7˜º ”[Œºy\ím㤕M-^3õ9N‘TÉÕ! 3#,Ç«I·ú¦véÞD82Ö)ÖÀP­=¹Æì¡_Ã0ØŠžeHݒ┵šÖ£R”wRŒîf}cù àÖ;\+¦Ñ]¥ÔZr[hG÷"ˆË2led(Ïøzi–ëZÜWXZPª­$i:qš´‘™W¨ÊªN\ÉŽfq[‹ÕAt$‹ ¿õ¼a€ ÒIYð2»ãGèL¹Oš—$S–•eJlkeFGµ7è3Þ_Ú]$zLEZ•[œr$VÓri¢>keÿ‰õŸOõX‹X(Ñ„fæ–öiqŒœ’ÞÀ MÍÖ{ƒãz ÕT£¯[®ÕjìêO6}k9-¿6µ«oÎX­½WÕO SacbLBýôËÂ'­êÞyl¹•jJˆ”…¸ü%$Í÷Bv- :(\^ž.Ÿ—Rÿƒ³üÕ]?ƒh’•YR–ÔN’}ת¯ÕdáúÌÉ•7øBÜE=·qå2¢4’SnyÊŽdDV={VõÓ|\v÷Çéþ­©H^·]­Ö]Õlú׳ß~mk·ß~±éº 1ŠŠ²àFÝ÷° ž¡z„:Œ+‹¤À:sÊ”LºÆÝaÂÎÑÛiUt¨¨ÊÅs=ö·×ãgÓ݃É®%âI8ô•$•”ŒÏ)%I/æ{̎ǰŠÜ™Þƒ«æ¸ïâP~†u¼çêãøýþÂù$AÐÒà\Y+ Í4¨”õ=Õ~Ý‚=¤ç§©_÷l>ƒ.h•)Ƥ\d·ÎœveÀÞâÌBýrU“™¨mŸìš¾ÿé+ùÿ³wYžˆH˜ÅAYI%dO@ƒÐ ÆÆ@Üá,C;TŠTSÎÒìO°£²]Oþ]ÑüÈÌLYÂ3‹Œ•Ó5”T•Ÿ©ÆØ±uÇ–Ä4¸ÄVcJìKpï~uŒÊÅÐ_ÛÕnXI§N4㳨«"z è76Ï¡U§Q*mÏ€îGQ°Èö¥iéJ‹¤ÿ2±‘èñž7]e’b.DmÔÌdj3µeü?ÏaŸQm#ãL E*0”ÔÚÞ8¹m[x)¸lpåZE®ÍB9f4\–ŒÆD´žò;¯§iÃàΩ+¦iRœjAÂjéò±âÂM·jÎ)62Žã“em¤Fá'X¢/æwU¹×¹Ž"|§§Mz\…fuåšÕý½ü‡Ä@¯‡ÁÑöé«\­…ÀP¶éFÍ€‹€gáʬŠ!¦×!¡¥É§Kj[)tŒÐ¥¶²ZIDFFer+ØËúÆ.9˜³D•W uN.)D·.â›*t7ÐÊ”£Y¥*S‰Ì’Y‘ÜМÙLÍ?´t—ÄéOµ‹«ñ߇Ö)ôø‰ƒ ^³[ëi+Zóº£3ºÍN(÷ŠÅu•É3è5iÔJ“sà;‘Ôl2=©ZzR¢é#ÿ̬dF:ŒäâÜ77/ûêQbµ8âµnYÔµ¤wõ,E³Ö¿@ÙÂÑN“Š$ͦÑeÖ[—†àÖèøiu> ·øB–KF¸Ï5›$ï¿;¤_ƒ±ZSÔòë£Þ‘}Uð–›'RÚÀUL1X‡R‹lÇTwZ{ö¦Ú®DâÒ‘lÄ{R« çte‚ bS§ªm"‘@¨&¾ÉÉp‰Êœ&’nó’¢RHÖóVI7vñnHŠLóc£ÝÆ=‹!ècÂÀüw€*u©•¬/¡7WXu†[7IYÞIš”á™*èºPDI±ÌUßH !ér¿…iŽºä(N¶¦ Óº‰4‡I&}6ÏkôØ[¥5'b)E—:·YƒE¥±Â'Ô$·+YÒc®(’„ÝFDW3"¹™XØc<ŠðtXRñ+€³6L¸±ÕÂs;±]ÔÈM£2Êç6çb=årÚ= K¤è¿FzfÁú=O®âÖ*t³•]]]qÑS«iÄêÙJM+Bs¤ì«î¿HìtÁ"â¬+JÄU”É{azÎ-R‹ l©I:²²´Ùo"3Iæ^ä$Œú„™›InÜÿÉG‰L@ͮʇ:¯*]>–Í*#®š™†Ë«q '¡$§ Ô«u™íþ[†ºhIô}iˆ)PišŽ‰iU½flü¹)ÕZÖͯe½÷;e¾ã½¶\ PØPiñ*SÄÊå>ŒÚ[5“óPú£¹R&[qWÚg´ˆ¶ÛØkM±1æ’Ô¦ÛqHK퉑‰I%’UcÞYˆnÒ#Øø€ ëCmR¥A‹H9ŒKJŸ!ì¹à°Ü’y‹¤Ì󛌥³Ê|Óʵm=—-  Hž±¶ÃØn»ˆšå˜üÔAk[ Û"²gb-»Ô{l’ºŽÇb;ÔõOàœY† èé¨V«„V7¹o)Û§1»ÍÚ½…~‹[/7(åø¦6¾0ò)í94¾ z·¿§ÝècñU¨F>L6›vø/žþ‡—Àvz\™C‰•"•ƒJVcœHY)µ9}å°¬½ùº íÓšü`èR›©&­rå99E6¬Hnl(4ø•)‹berŸFm-šÉù¨}HQÜ‹)-¸«í3ÚD[mìG‹1¦Ø˜ó IjSm¸¤%ö‰D‡HŽÄ¤’É*±ï,ÄG·iì|@€tˆ¬M¨5MJ%1¥ß4©IuM·b3+“HZö™[bOi•ìW2 @Ë«EbAرªQ*m"ÙeEK©mË‘ØB°ÎÛR[Hír±ž ê'¨@H@ˤEbmE¨²jQ).ù¥JKªm»™\šB×´ÊÛ{L¯b¹’¯ˆUbÆ©D©´‹e•.¥·.Dgbu^Ã;mIm#µÊÆ`bH:ƒ 6‡J¨ÖêÑ©4˜ŽK›%yi²Ú£ßýDDW33ØDFgb!„/£† ÃTJ\“‹K×bÜ¥¼ëÄJÕfæ“e—b=[ôš·ìÉn‰âªápÒ©Frô\ÍðÜSÇâ*aè9Ò†Ô½HÕióiU©õë)…eqµï#ÿÄŒ¬de°ÈÈË`Åæ›k:¥=| Ue(î¶éµwçÊÛQ¾Ý9·lÌ*1c VUi©MY“aêN¤š³' A‰èbÁ0H¬?*KQb²ãï¼²m¦›I©kQ‰$E´ÌÏa˜·~ŽŒ5FªÉ‘*±Ü¢8뤔¡¬¼íYe>yó®{òì-™ïOˆž*´á¶×¹~oÓR¶.¼èQ•HGi¯Où+\IB«aÊ«”ºÔ%ÖÙ\У%—Y)&d¢Øer3ÚF[ÈÆ°^ÚkÄ:­J*´Ü²µŽ* ÐñˆpÏ£›µ³ë[§(¢C^¥z*Ucizéø %Z•i)U™=ô lCJƒLÔp,KJ­ë3gà-ÉNªÖ¶m{-ï¹Û-÷í²àj@ mªT¨1i§1‰iS¤=“<’O1tÜ󛌥³Ê|Óʵm=—-£R ®¥A©ëøn%¥Q5yrpæä«[{ß.¡—7X¯šÛÊ×ÛmPm‰0Õw ¹ºå1ø ’Ñ:Ñ:EsI‘ŽÛ”W+¤ì¢¹\Šã­Ð5C S1Še× p¹¨ÊtÂqÂK(vç´ÊÇuîÉ}„wþ,¶³´³Š(u:læ±+û•yM_-b\ËÍ6Ï/¯¿ùZ÷ÙqǯâˆcUÒ¼-½Ýo{¸+úzßþyµq•ãŠT£Nñ¶÷uùo<ÞaÖÖ;H€~‰õŽ «ûåŽ÷¬pU_ß,~}ÂûFz4}’4Êqlº‡[Q¥hQ)&][HÇRî’_F‘}.â¦Í½N«€ë¹¶µýl¾Óö›·ÿ¬rr7 lÃèðÕgô¿‰Í¯N3â®ÆRðÔº¼¤°RÜ©C[&j^][¦¢RÜw4¨¯mŸÖCW3HV“ƒ*I ŸÂxV}¦Ù¬Ö[nÎ¥*÷Þ{†²Fã¹=#©B¤­k”ªB7½íkÔ$áL3Df90íå<™D»©ã%šš¹X­“2ȶŸ­Ð01Ž9gé>>/™B`á0ôeqJœ%´¦YÈFÉ™¦ÙU”ïtŸ¬{ sÒ·læ:”dÙNQHé´›Žã⺠€Õ=&]EöÓĤd•#\M¥$„’I²²JÛí{'pÙ?¥L;=T–ñ&Ž¢Ö£Ó¨PiH%ÔœeâTmgíPãi#A/Yµ}Tí³ã ñІò¼¢‹1Í5KV–©øÙÜ?P`SN–Õ$¤¨Ò¨šµ¤›[ª#5Öj32ÛbÅ;I•8xa·â¦K¸•ô¾©†îUGQ¸KzɱæÖPG´­—¤qÎŒGzEÈEI“ñ§¦~Œÿ{xaè”_ßë5úŒÿµõK.lÞ®Û[yÖ.Òµ3é#㞇'Ò**©Ñ¢È—x¹ãe¦‘) S[VQ™X’|ë‹yÖîŒWw·DŠEÒÞžhoÕ(xŸh²•XÆ¥FÍYUIæµäÁ§*”–]m“±gšÇcÊdD‘®Ä_HZܚƫP)"D ¥`O@ƒÐ Àý²ãŒº‡™qM¸…´&[HÈú ˪TfÕf*dù }åFDV.¢"Ø_Ø1„’VF¶äO@=L€ H"mV«Qª©¥T%¹%M ƒYî/üOa\ÏiÛiŒ ²næ,¯rL:ÀìdÉýëW÷ËïXિ¾Xüû…öŒôhû$hänÙ;†ÊFá­“¸wè”*ÙŒjäô¤Æ5rzGVFf²Vñ­‘¼ÆÊVñ­‘¼ÇV‰Nf¹ñ†øÌ|a¾:TÊÒ0ÝŽôŒ·F#½"ì$b:1]Üc)ÑŠîã`C#ßTÆ?HÈwÕ1Ò-Ç  Iˆ$ú >'¬A ë@ž±zÄžzž¡z„$„ !$ƒ : $@zžH@’žz‘DL:ÀìýëW÷ËïXિ¾Xüû…öŒôhû$hänÙ;†ÊFá­“¸wè”*ÙŒjäô¤Æ5rzGVFf²Vñ­‘¼ÆÊVñ­‘¼ÇV‰Nf¹ñ†øÌ|a¾:TÊÒ0ÝŽôŒ·F#½"ì$b:1]Üc)ÑŠîã`C#ßTÆ?HÈwÕ1Ò-Ç  Iˆ$ú >'¬A ë@ž±zÄžzž¡z„$„ !$ƒ : $@zžH@’žz‘DL:ÀìýëW÷ËïXિ¾Xüû…öŒôhû$hänÙ;†ÊFá­“¸wè”*ÙŒjäô¤Æ5rzGVFf²Vñ­‘¼ÆÊVñ­‘¼ÇV‰Nf¹ñ†øÌ|a¾:TÊÒ0ÝŽôŒ·F#½"ì$b:1]Üc)ÑŠîã`C#ßTÆ?HÈwÕ1Ò-Ç  Iˆ$ú >'¬A ë@ž±zÄžzž¡z„$„ !$ƒ : $@zžH@’žz‘DL:ÀìýëW÷ËïXિ¾Xüû…öŒôhû$hänÙ;†ÊFá­“¸wè”*ÙŒjäô¤Æ5rzGVFf²Vñ­‘¼ÆÊVñ­‘¼ÇV‰Nf¹ñ†øÌ|a¾:TÊÒ0ÝŽôŒ·F#½"ì$b:1]Üc)ÑŠîã`C#ßTÆ?HÈwÕ1Ò-Ç  Iˆ$ú >'¬A ë@ž±zÄžzž¡z„$„ !$ƒ : $@zžH@’žz‘DL:Àìýëjê/Óä>l5 f»_„CiûZûµ‰U·ôZÿØC²ëW÷ËŸ°ª­£Ñ6#:)I\=Šj‰-ŒÑËþƉå ±…i%ÍnŽ_ö,?(`ÈÜ5²w ¥&ø³›R…%ý«¡²{WÓ{¿ìH~PÁH•7ʪ9Øp¼¡©‘¸Æ®OHéQŠ|QNt¡¢7oé'ÕrŽ_ö/$a=¤ü^“Øý¿ì>Hç¥oÙÌt¨Ò¦øÅt*NÐéÝÒ®4Né4AòF+ºZÇ Ý.òHä_oŽ…<5ý‹¢+É#±sKøì·M£þäŒw4ÇŠöGü=OòèÄw¤\†‡¸º"ÚhÒ n¨QÿSüŽæ›4ˆWµFøvŸäÑŠîã¡‚Ã?öãÑI³½^œ4ŽE²§Gü;NòÇ—=%_üiGü9Nòzïªc¤ZŽ oeˆ‰ÉêYG§=%{ÒøräåÓI^ô£þ§y¶1l†•‹±©jYg§=%{ÒøräåÓI^ô£þ§y¶>Âò£ÑvRÔ²ùtÒW½(ÿ‡)Þ@r餯zQÿS¼Zd0¼¨ô]†Ôµ,¾]4•ïJ?áÊw#—M%{Òørä Ô!…åG¢ì6¥©er餯zQÿS¼<ºi+Þ”Ôï V€ /*=aµ-K/—M%{ÒøräåÓI^ô£þ§yµÈayQè» ©jY\ºi+Þ”Ôï 9tÒW½(ÿ‡)Þ@­@2^Tz.ÃjZ–_.šJ÷¥ðå;È]4•ïJ?áÊw+BÖ /*=aµ-K+—M%{Òørä.šJ÷¥ðå;È C ÊEØmKRÊåÓI^ô£þ§yytÒW½(ÿ‡)Þ@­2^Tz.ÃjZ–_.šJ÷¥ðå;È]4•ïJ?áÊw+^±Âò£ÑvRÔ²ùtÒW½(ÿ‡)Þ@r餯zQÿS¼Zd0¼¨ô]†Ôµ,®]4•ïJ?áÊwºi+Þ”Ôï V  /*=aµ-K+—M%{Òørä.šJ÷¥ðå;ȨC ÊEØmKRÊåÓI^ô£þ§yytÒW½(ÿ‡)Þ@­ƒ!…åG¢ì6¥©eò餯zQÿS¼ºi+Þ”Ôï V  /*=aµ-K/—M%{ÒøräåÓI^ô£þ§y¶è /*=aµ-K/—M%{Òørä.šJ÷¥ðå;È C ÊEØmKRËåÏI^ô£þ§y9tÒW½(ÿ‡)Þ@­º„C ÊEØmKRË-:i+Þ”Ôï G.šJ÷¥ðå;ȱ †•‹°Ú–¥—˦’½éGü9Nòr餯zQÿS¼Z€d0¼¨ô]†Ôµ,¾]4•ïJ?áÊwºi+Þ”Ôï V¤Âò£ÑvRÔ²ytÒW½(ÿ‡)Þ@ž]4•ïJ?áÊw+@ †•‹°Ú–¥—˦’½éGü9Nòr餯zQÿS¼[ †•‹°Ú–¥—˦’½éGü9Nò—M%{Òørä × A†C ÊEØmKRËåÓI^ô£þ§y9tÒW½(ÿ‡)Þ@­@2^Tz.ÃjZ–YiÓI^ô£þ§y9tÒW½(ÿ‡)Þ@­ˆ@d0¼¨ô]†Ôµ,¾]4•ïJ?áÊw#—M%{Òørä Û @d0¼¨ô]†Ôµ,®]4•ïJ?áÊwºi+Þ”Ôï V  /*=aµ-K/—M%{Òørä.šJ÷¥ðå;È¡†C ÊEØmKRÊåÓI^ô£þ§y˦’½éGü9NòjÂò£ÑvRÔ²ùtÒW½(ÿ‡)Þ@Ž]4•ïJ?áÊw+P †•‹°Ú–¥—˦’½éGü9Nòr餯zQÿS¼Z€d0¼¨ô]†Ôµ,¾]4•ïJ?áÊw#—M%{Òørä Ø@d0¼¨ô]†Ôµ,®]4•ïJ?áÊwºi+Þ”Ôï V  /*=aµ-K+—M%{Òørä.šJ÷¥ðå;ȨC ÊEØmKRÊåÓI^ô£þ§y˦’½éGü9NòjÂò£ÑvRÔ²¹tÒW½(ÿ‡)Þ@r餯zQÿS¼Z€d0¼¨ô]†Ôµ,¾]4•ïJ?áÊwºi+Þ”Ôï V€ /*=aµ-K+—M%{Òørä.šJ÷¥ðå;ȨC ÊEØmKRËåÓI^ô£þ§y˦’½éGü9NòjaÖ /*=aµ-Mö8Æ8‡ÔcT1ÆdÈ‹¢±©ˆÌt!¢Z×”ÒŸYÅí}£@,Æ‚QвF§èŸXિ¾XïzÇUýòÇçü/´g£GÙ#G#pÖÉÜ6R7 lÿD¡PÖÈÜcW'¤m$n1«“Ò:´ 35’·læ6R·læ:´Js5ÏŒ7Æcã ñÒ¦V‘†èÄw¤eº1é`A#ÑŠîãNŒWw»Žú¦1úFC¾©Œ~‘n<X1L@ØÁ'Ð Iô!=bOXõˆÖ €ôÐ õÔ $ I$AЀH"Ð Äô0B€ôÐ ÀÀÀÀz¿‚°%Kcj]1éiq¼j–ÉR؈qÉ,ÕPâ,Y8¶PÙ](+¥£Ê{‹h¥‡jñ“„ñ<éj“I}tÆœg)†áT¶œpÙõlÛn™jÓr6óeÊj*ùeu•]úzimãoŸÇäÛZ¦)ѾFˆôxµ§ÒjŠ,EÚL—|âhž,†¥8ñ!¶ÒyËz‰DGm™pý“‡æª™I™ÃâczÍ6MC;IiM·ª6m4ÊÝÈÏ*RdDhzÄd¢Ku8 hø}XTŒ¥U»6økøÿ‡4×ê¦áü53G¸>±"]¡Òž¬UHÒ”ª¤ÁϘÚ³Þ£'a›ï´‚èNÌ­!hßñ–/©Ç‹PŽËS«/&dSiºm5Qä¾–a-¼—%¸M “e&ÚÖ앨ÁË«*›qªÖöíoFïn:þÊÖÜgm[vÉÀ9šÎ1‹DUiµá™u*kªžäy “–ŸRu Ju$M™*ŒöŸ8”“mDF_Ôü†*õÕ=HÕÈé¢Ñ_b—kJ‘ ¤E%;(–lØÛmIÈ哵Å(ó6G•€òê׺¬ø[×á_]ÿ+îkC¹ÒnÃx^ &5.\Ú”ée%åÎ×£‚ºËS¥FA¶Ù#1f(è]Íf[OfÒ·CW´È?G•T"•dôÔiÒäOj¥É(KìË#ŠH%›‰Ë•“4IF­aØÒÑ©5( Þ«ŒW™ÂW÷·7ið5ÚZÃx†Œ*ÒëXk§1lt›xynK9(5’ŸzI¤Õ (¶–d‘êòšž¢ÎÁú< Vð55…¢EY²Ä£¿ˆhÄmGˆÉÆ‚¢zF½”¸¦[5/a“dFk²¹Åš‘ ü>¬®ÕK6ï¹|-¯þjÖK*kCÐ#EØ";8&¹W“>¦ÍF]4ÞJ òŠúä:ÚV—Á ”jÍgŸöê5jM›RˆÓ¡Ãú,ƒUÁuªÜšUj’¨ÑêR"¸ôýq â¡ÕðwP˜„’söF“ÎëF~±"ÆI:t¿Ëñ ·ç»·§;’º^¾¿/–vÖ…Í¢Œ3P&jCÃÐ1–‡$“*]7¿9ú‚¤™EeN´K`Šû\$¶i¹×ÌIìè´ÔúZ+´jll¨´EÆ«ðT6·åºôRšÙÉ"%®É\ÌÈ5 šIÙ6#:jxlç7/3½7îõãÇãnÖµ¬SIp=J 7!èîb¬5“‹J4õB§CÃ캷‡a“ Lco«"æå5zÄÙ(ÍYvý)øi†±F*|W+º¬Rót¤%4êyÆŠ²Y¥YŽˆÜ”kȤ’\lÒGb$<‰øMMÿ÷5Ým߆ûÙz+î{ǘ´= a·pÖuæ`·†×ÄëŸ.M –ëŒ&Y5PJó¸êT·IM(²¡ Q–Ô‘|Œ4S&Q$âú6 Ö¢ª¡%êcÇ’Üèíp~ ƒ%mÙn­äç¾e6ÚŒFDgHuãá•bïæë骷£_6ýZ\,6Ö‡]¦ªc4}/búlf!ÇŽÍfQ0ÌE¶m4Ѻ£B«3Jl“"4l4™LˆÈȹÓ¡MÓ§7v’WÔÑ»³ôO¬pU_ß,w½c‚ªþùcÀ°¾Ñž‹dÃ['pÙHÜ5²wý…C[#q\ž‘´‘¸Æ®OHêÐ(ÌÖJÞ5²7˜ÙJÞ5²7˜êÑ)Ì×>0ߌ7ÇJ™ZF£Þ‘–èÄw¤]ŒGF+»Œe:1]Übìdb;ê˜Çéú¦1úE¸ð!`Ä 1cŸ@'Ð „õˆ!=`Ö OX€ Ð O@€Ô OP€$ t@"ˆO@ƒÐ ÀIBÐ O@€ H€I‡Xu€ ¢}c‚ªþùc½ëW÷ËŸp¾ÑždÃ['pÙHÜ5²wý…C[#q\ž‘´‘¸Æ®OHêÐ(ÌÖJÞ5²7˜ÙJÞ5²7˜êÑ)Ì×>0ߌ7ÇJ™ZF£Þ‘–èÄw¤]ŒGF+»Œe:1]Übìdb;ê˜Çéú¦1úE¸ð!`Ä 1cŸ@'Ð „õˆ!=`Ö OX€ Ð O@€Ô OP€$ t@"ˆO@ƒÐ ÀIBÐ O@€ H€I‡Xu€ ö¥Ö1Z;’èø·>d=2• qLº¶–dN>•[2[H· Tº2}jW Uôßÿ‰§ÿê&ƒ?Éâ?çj¯ÿ‘’5Ø/.4w¢Õiµ×˜V%¨Sʪá!QеT^m†®kÖeÚÛddƒBNɹZÅópþð¨;Æ—ÿ©w:ͱilíîù.Å|æÆKÿõòÿ§§~¬c9‚1’Ëÿáuòÿ¦§~¬X(ÒF$<åhðMA2ˆÑKJ qr­£©*)‘ZOffdjÒevó(º*¦ePä“PZCHy³Ž²mò^µÄ <¦D£3=×-£uB ‚5u$Ï,«èõŒ•ÿWûªwë‡É_GLd¯ø¢¿ÜÓ¿\=lî9¡ÆKçPáTãeøle6HR•+.¨È¯r+¨Ò«ÚÆÚú ç‰7H0š­• ¹Tš·%6Ò"6ÎW6 2RÜJRDo’n£-¨QoË›u¸rlòz¾ØÉEn*¯÷4ï×—Õ§_üY_î)߯ÕÃ5˜¸‚ŠÍRo´ÛŠqµ4ú2¸Ó­M¸…ÎÊJФŒÊå°Ìq2q²«X«³L[‰NV|ÛšâRˆÕYìʳQ¤ÔM­$âS›)(ˆírÝ6O0}Zq—»+ýÅ;õáõiÆ^ì¯÷ï×Shƒ±VÁ¸n»6¥-ª Gª•Q-¦]8èQ¥×T«©Õ\ÔdYŒ·ª×+éðÎ;­=ˆäN“C¬U;À¨3š”äŽÒäN2Y¥×’qM$¢#Ì£FÄÙ6,݃Î?VœeîÊÿqNýx}Zq—»+ýÅ;õã×31õ5,Ãv•L«WJU9º™•=”µ~£ª'ZʲS™G•VNÁ¤s} Oz Ýz™# ÓgÇE=)[m6§ff{+‹I]IÕìMÖ¢IX.ÅØ<ÃõiÆ^ì¯÷ïׇէ{²¿ÜS¿^=>î6T} Oz Ýz™# ÓgÇE=)[m6§ff{+‹I]IÕìMÖ¢IX.Ϧ-ÒÓÈ¥aè³ëfòhŽ%¦ÒÁ1ÁæËq¢qµ¶£qd“O9F’Q²v$ë .ÁåÏ«N2÷e¸§~¼>­8ËÝ•þâúñî(N¸ü6_v3±q´­L:i5´fW4(ÐjMËqå3-› Ëhç)8ÚŸP…*¨têœJ+\–ÝVCH(ÒG¬´YF²+s‹:S˜¶¦ä`òÕ§{²¿ÜS¿^VœeîÊÿqNýxõ=KHñ¤ÌÚ.'¡ºÕea.<}g`J[wZÓ¬ý¢Lál2ç‘‘6•±]B›%Øu©Nr‘&b£ŽBÍê›(&‘”Êä¦Ûx”›bZKq™ìaú´ã/vWûŠwëÃêÓŒ½Ù_î)߯ŸÆ¸ÙJÂ’ÞD Ý"£L«RT%¥<%L»=‚æê–¤­.$œE‰G{)&[Èu¸gµZ~l7)µ UBC~Ô¶N% #Ȳ6Ö´)*Ê¢#%Ô¨ŽÆAvýZq—»+ýÅ;õáõiÆ^ì¯÷ï×TU14êF”k0Û¤WkL Ÿ!1 dRY=|ÒqvqÄ$”¢&ÊÅu+!X.ÍŒÌ}MK0Ý¥S*ÕÒ•Nn¦eOemE_¨ê‰Å£Ö²¬”æQåU“°.Áäo«N2÷e¸§~¼>­8ËÝ•þâúñ멘öš™ñ!ÒéµJÚ¤ÓÚ©f€†Ì‘ÃQ!Ë-iRï•\Ô•³vÒ¾-/Jã­8ËÝ•þâúñëên-r§9êK4:•.¤ä&SÓTBܤ$Ò“UÛZÔ’%8Þd¨’²%—4s’1Ír‘M¬J«É¡¿™T¦Är¨ÓFŠDô´3)Kq\æR«šÉyn«¡I °y“êÓŒ½Ù_î)߯«N2÷e¸§~¼zÅÝ#a¹Ø“Q°Ö%ÃÕ‡jU”ÔY;ël¦$‡s‘!{9í6W22²Œ·™k½.Å~‰zª£ú7¨áÜTç à6Í®×gÉŸWÏÕêÿ£›¤.Áåÿ«N2÷e¸§~¼>­8ËÝ•þâúñꈚµb·@•JÚn3ñr.WT¬†ÂÐêÔd²Y¥$W%ŒÈÒ“-«°yêÓŒ½Ù_î)߯«N2÷e¸§~¼zt±¥f^$™Mf·„éÙšìhôj£n¦\¤¡f”¸—5‰"'‰IÊÛ–%ó¹ zÎ=’Æ0Ä—ô€ðËtÉGb5^1®C¨TV7 Î[[ N©%dÿó;…Ø<ÕõiÆ^ì¯÷ïׇէ{²¿ÜS¿^=Šô‘R¤â­8ËÝ•þâúðú´ã/vWûŠwëǹÀ6˜<1õiÆ^ì¯÷ïׇէ{²¿ÜS¿^=δÁá«N2÷e¸§~¼>­8ËÝ•þâúñîp ¦ }Zq—»+ýÅ;õáõiÆ^ì¯÷ï×s€m0xcêÓŒ½Ù_î)߯«N2÷e¸§~¼{œiƒÃVœeîÊÿqNýx}Zq—»+ýÅ;õãÜàLú´ã/vWûŠwëÃêÓŒ½Ù_î)߯çÚ`ðÇÕ§{²¿ÜS¿^VœeîÊÿqNýx÷8Ó†>­8ËÝ•þâúðú´ã/vWûŠwëǹÀ6˜<1õiÆ^ì¯÷ïׇէ{²¿ÜS¿^=δÁá«N2÷e¸§~¼>­8ËÝ•þâúñîp ¦ }Zq—»+ýÅ;õáõiÆ^ì¯÷ï×s€m0xZgÑʺÕ}ÚGªµ ñ Å›-¸ðâ$£‚Y¡ 7%¤”²Õ¬&dܶ‘‘ŸõõiÆ^ì¯÷ï×[RËŽ2ÿ™(Ÿì–>Ï̧ÎdÞšë/¸ëzæã-Dim£õO&ëÛz¦å¸UÅã#†ÞöÊxÜd0°R’»|ä?«N2÷e¸§~¼npÑ7WêNC~\Ê"PɺOÏ‹M¨ÈÒY Q)Åf;ßjH¬G¶ö#ô³Ãú~!D„´ÄìÒž†ò§‚Øœ=¶Ì¤‘¨¬EÔgapáoñƒŸèý¤$Ãâ<åÂÌ߈U£{YèV: ÿ'ˆÿª¿þFHÌô;ÿf8“Œãþ9Öê?ùŸÕ[7ýkÿJßÂ:ýàÚe+SØŽüÅ¥òrjŤ̗!Å>²+$¹¤§EÓb+™žÓ踂µ´^kJÌQ:RŒŠìdÇv®UjrŽšã=ÃNi“§­³ÈÖØˆˆ›2MÊægrÀ•CÆ2´‹R“¸Í5Kôè²%)N1!Òzi¬Ú#p²-’dF¥’IÂÌJ¹ºø‚µ´^Äý«ý¢ðI‰ðÍV>oáyn"#4s£·ÒŒÖ^¥¤HÖ(ÈÈÚi.žRõ³u¤ˆÿ³Âi©Õ±+8†Å&U%š$4¡i¹ÇȳuIµòÜÝÉ·oìˆíkÛAÚ¿Ú/â~ÕþÑx X]3 ÖŠ{•*Þ%n¡9ºk´è.³OK$Ê4)n-*ZÉÇ ÚhÏÕO3Õ+˜ÕÒtj¨‘§!us —P§LSTÚWŠ“‰%/ÜšÖ+öŽeÊ¥æèIÛ›cº8‚µ´^Äý«ý¢ð 0UÞ‡ìÇqüÇ:ÝGÿ3áÚ«fÿ£Íé[øF;!âÒX©éôë°ã«G¥¥‰O%hRI§ß%þÕ´’®IÈGt ÌÌËm³Äý«ý¢ð ‡í_í€XÌL?58š r}_†;=F2SÁ‰»·&K.¶›‘ÿÁ!„·{]~±ØîG£«hýéxw‰Ñ:!¥T'Ìq5:2e´|&K–T›‰4­½a¤–J±í3Nâ+‹ˆ!ûWûEàAÚ¿Ú/°)ÉÚ1:M4çU%Ê‹Å6é]rT–ÖÓo©wõÒ‡¤tm7/rË·a…pbè²è“«*lŠ| Ñ並2·¥¾Ãî=ëN{*æíõ÷ìÛiñ?jÿh¼ˆ!ûWûEàsCÃóicF‹W³I«Î¨JO/î†ä»!Òfæg“*ßAç-§ªµˆ”dZ:6ªÓêiµâvÞ¢á§Öº|"§åpÛ8ΰ„8î°óîÅS°Žäfw+‹ˆ!ûWûEàAÚ¿Ú/°(†ôqSÃÌ?„êjZdÒ›¦Ëª$!oÊæ·uþÅYs-I猊Śæ®â—‡Ú§âi•xî’Y‘L‡On17bi1×!Dy¯¶å"Ö±[&ó¾Îÿˆ!ûWûEàAÚ¿Ú/à¦éø ¯F¦Ò˜Ãø¡¨R¢Ð¢Ñe¾õ;\O·*&ÜBu‰Õ¸F· ®k.~Ò; ,U¦T{ bvé1‘C‡E&_§ð“&£›Æ‡ ZÄYË;b¹JÇrUÊ×Cö¯ö‹À8‚µ´^`§=ªÓ* ½…1;t˜È¡Ã¢“/ÓøI“QÍãC„­blå±\%c¹*åoêVŽYDEÆ¥Ôø"§ÑáÂ'#ëI“¦Éqö”®rs’i#Ieؓ۷eÃÄý«ý¢ð ‡í_í€ÎðpPi®Ô`ÖêtÊL¼A92U$ÁJNÃ%jQ©m ÍKæç;Œ®w3='K†¥á)õ´LÃk§9M0õo´Â“‰nç2Y¥Ò2Jvm<Ç´[AÚ¿Ú/â~ÕþÑx Xt‹AĘҭQ‰V©OàÇ…§ÑNTš à“NÊS$FHZÏ^²&ŒÔ¤6vI&×1ÓÌÁÕ:å7”™Š£Î©W#L —”Ó1`Ù±^ÜíA®Æ{ Ó¹l4‹“ˆ!ûWûEàAÚ¿Ú/S•<UªÓênTq;|u=úzÊlj~­¸íÃ’O´„4§·1¹u)Gµ{¬V:vD…ÕŸÆÓ±ÕD0Ëí.œHŠL°¥­¤+S—²ÜZî¥ÓÙk´8‚µ´^Äý«ý¢ð³Hñ©x’]R´Äg©éÌÃi’BDeÈRrØíc'É$’"¶N›ìæéø ¯F¦Ò˜Ãø¡¨R¢Ð¢Ñe¾õ;\O·*&ÜBu‰Õ¸F· ®k.~Ò; “ˆ!ûWûEàAÚ¿Ú/°)œO£Fê”j]èiÔè-BaR)‰‘.2[,¤äwó¤ÚvÄ\ã%ÒFD[o¼‡j1kxŠ\j» ­þØÙ8YbI0Ó²pוHÈÊO!·¼ýklWCö¯ö‹À8‚µ´^f j£f£Rq )S 6u–›FZU4¡1mæ4>†³¯öÙ”J5ßi¶…ašX&Jhšn´E^‰Q]SŒÎ%Ð䥥hY©¬Þ¡¶êÛ$’îIÊD­„bØâ~ÕþÑxCö¯ö‹À,ÁÂF…[K²“\mÇ£È[“ÔÜ"B% ÐáiI¨Í¢JÖڈV3<Æc‹sEï>Ö#)ŠsNÖhòijr !1zâ"×È$¸dû©¶Ã"AYK+ö]üAÚ¿Ú/â~ÕþÑx˜8ITm~/§b—SåÃÔä¾}{‘×›5öeàöµŽù÷•¶ëåág$áÔÒ\žÒTU´UIÖ¡¥²²*%0›È“"3± Íê;¬ÈÌÌŽËâ~ÕþÑxCö¯ö‹À,»Fã:¥o ÕqEAs2dÍ­Íö2Þå—÷ù¯·Õµ¶Ü¹Ÿ@ê\S迤¨ôNù8þéà÷¿×綪ÜÏÝæË³5ö‹‡ˆ!ûWûEàAÚ¿Ú/°+LIEÄõå5ÓY¦ÊFEÅ›G)&Ùe"2B‰ÔiÙi^Ó>‹þ›Âl±D1Òc ¼•·­Nu¾”Ãz1•r±ÙìÆv;嵶ܬž ‡í_í€q?jÿh¼À®jø>“U¨»>L¼BÛ®Û2bâ Ñš+Y¶žJ°º®w3Úf`î`—‡ 4Éij‡PrbJSîÊuìñä2i7]Y¯aÈÍs5X’I""µ¬n ‡í_í€q?jÿh¼À©0Þ›K—EfUy3)7DL=[Ý¥2k¹ÌœÈÒÖ‚²Q¾çsJ>ªÀÃ’°Áâeq1Sœ§ÓÒÄMT˜¨Rr¡Fös%©´ìI’QÖw=¢×â~ÕþÑxCö¯ö‹À, .†ÐÚj§Æ(nTpôÚ"Ž—@LB2‘«³Î~ÕJqiÕžÃU6Ì»suÕlÃèxâ™Æ:¿Jµ¿´Ô_‚ç„Ô]Ù¹öÕgÞŸZÝ;Gˆ!ûWûEàAÚ¿Ú/à©1&›T•Zf-y0éƒ/ÄT=cŽY¤²½S¹È›ÎÒƒºWºåcÖ"ÁVq„*ã“éÍ7K2QRÓÑ«23i‰ddÒÌ2M 3%(®Dekgˆ!ûWûEàAÚ¿Ú/‹0T§‚%9@¬P^­ ¡J¨ª¥O[Pò½åKT³Î¥-Iu$é•‹*y¤dy¯rÂgGÕW±LlETÄ‘\}™MHz,*aÇ‹-H%$–êêÍN‘+š²QXÒ›’‰$Esñ?jÿh¼ˆ!ûWûEà3¼6*ÂXƒEG›‰¡*‡5J'U$ŽShQß+o„„™ĨÛ5ˆîg´jø¶ ®T(8މ5Zb%©‰´Wd-µ¦3,Ñ%²22`ÕÙsÚbÖâ~ÕþÑxCö¯ö‹ÀbÀ¬äàø²ââ¨Òä›×唢4·•qTQXa&•_ÖI°NŠÆFeÕsÄÄ8%ÚÛô·åÖ2¸ÜvâÕòF²jl¥hs!–naÒ¯ó¹®8Ÿâ¹ZüAÚ¿Ú/â~ÕþÑx˜+*æXªVfIšëi©@…ÒH—ȯ>óo%Gr5ÞI‘X½·½‹§†15k ×(uÌU öjT¹8ÔN¬ÝA£Z»º£ZˆŒö$ÐGsÙºÖ¿Cö¯ö‹À8‚µ´^`W4Úv)w„ÇÄuÚLÈOÇ[Y)´çà<•*ŘáK4ìÍê’TFdd¢¶ß”,E‰1™MMÄÊq—âIÜMQudw"Rù¥E³jTFG¸ÈÈY|AÚ¿Ú/â~ÕþÑxNã\U­±‰aRq;t˜8‘ƒEAµÓõë'5 c;jÖ$’FÚ•$ÉW$ì4™ÜfÕðkÒÙ¯¥™ÔåñÅM¹ëf¡KL¸ùS˜ú¥¶kNr»$»’’dfE´ˆïjñ?jÿh¼ˆ!ûWûEà`¥[Ñ\Ä¡1.¨òÕF‰5¨¯0Ö©Æ}ö^K¬ÏTMj G8²+)™‘+»¤µ9ŠlvjS™1$½!¶5)q_ç3+-ú®c¯â~ÕþÑxCö¯ö‹À,hKÄý«ý¢ð ‡í_í€XЗˆ!ûWûEàAÚ¿Ú/°9 /Cö¯ö‹À8‚µ´^`s@:^ ‡í_í€q?jÿh¼Àæ€t¼AÚ¿Ú/â~ÕþÑxÍéx‚µ´^Äý«ý¢ð šÒñ?jÿh¼ˆ!ûWûEà4¥â~ÕþÑxCö¯ö‹À,hKÄý«ý¢ð ‡í_í€XЗˆ!ûWûEàAÚ¿Ú/°9 /Cö¯ö‹À8‚µ´^`s@:^ ‡í_í€q?jÿh¼Àæ€t¼AÚ¿Ú/â~ÕþÑxÍéx‚µ´^Äý«ý¢ð šÒñ?jÿh¼ˆ!ûWûEà4¥â~ÕþÑxCö¯ö‹À, ¦“þ\q—üÉDÿd±®•:>LŠ6%¥¢Uû Ý2ÈjA’M.•+$™•ŒË¦ÛâÈ£aiãlI^7åð™Ó9 ¶΃"Ë|Ær}¶Ø›m¾ÿˆ!ûWûEà!­AU¶û4WÄaÕd·Ù£ÏõWÒ&'uÖUÅKQ4o%?²b2ve#ݘӹ%}§}×1xáoñƒŸèý¤3ø‚µ´^"ŸL ãu¥º¥róŒ­k—òþC4(*WßvÅ Š{îßÿÙxymon-4.3.28/docs/xymon-alerts.html0000664000076400007640000003546112603243142017500 0ustar rpmbuildrpmbuild Configuring Xymon Alerts

Configuring Xymon Alerts

When something breaks, you want to know about it. Since you probably don't have the Xymon webpages in view all of the time, Xymon can generate alerts to draw your attention to problems. Alerts can go out as e-mail, or Xymon can run a script that takes care of activating a pager, sending an SMS, or however you prefer to get alerted.

A simple alert configuration

The configuration file for the Xymon alert module is ~/server/etc/alerts.cfg. This file consists of a number of rules that are matched against the name of the host that has a problem, the name of the service, the time of day and a number of other criteria. Each rule then has a number of recipients that receive the alert. For each recipient you can further refine the rules that need to be matched. An example:

	HOST=www.foo.com
		MAIL webmaster@foo.com SERVICE=http REPEAT=1h
		MAIL unixsupport@foo.com SERVICE=cpu,disk,memory

The first line defines a rule for alerting when something breaks on the host "www.foo.com".
There are two recipients: webmaster@foo.com is notified if it is the "http" service that fails, and the notification is repeated once an hour until the problem is resolved.
unixsupport@foo.com is notified if it is the "cpu", "disk" or "memory" tests that report a failure. Since there is no "REPEAT" setting for this recipient, the default is used which is to repeat the alert every 30 minutes.

OK, suppose now that the webmaster complains about getting e-mails at 4 AM in the morning. The webserver is not supposed to be running between 9 PM and 8 AM, so even though there is a problem, he doesn't want to hear about it until 7:30 - that gives him just enough time to fix the problem. So you must modify the rule so that it doesn't send out alerts until 7:30 AM:

	HOST=www.foo.com
		MAIL webmaster@foo.com SERVICE=http REPEAT=1h TIME=*:0730:2100
		MAIL unixsupport@foo.com SERVICE=cpu,disk,memory

Adding the TIME setting on the recipient causes the alerts for this recipient to be suppressed, unless the time of day is within the interval. So with this setup, the webmaster gets his sleep.

What would have happened if you put the TIME setting on the rule instead of on the recipient ? Like this:

	HOST=www.foo.com TIME=*:0730:2100
		MAIL webmaster@foo.com SERVICE=http REPEAT=1h
		MAIL unixsupport@foo.com SERVICE=cpu,disk,memory

Well, the webmaster would still have his nights to himself - but the TIME setting would then also apply to the alerts that go out when there is a problem with the "cpu", "disk" or "memory" services. So there would not be any mails going to unixsupport@foo.com when a disk fills up during the night.

Keywords in rules and recipients

These are the keywords for setting up rules:

PAGErule matching an alert by the name of the page the host is displayed on. This is the name following the "page", "subpage" or "subparent" keyword in the hosts.cfg file.
EXPAGErule excluding an alert if the pagename matches.
HOSTrule matching an alert by the hostname.
EXHOSTrule excluding an alert by matching the hostname.
SERVICErule matching an alert by the service name.
EXSERVICErule excluding an alert by matching the hostname.
COLORrule matching an alert by color. Can be "red", "yellow", or "purple".
TIMErule matching an alert by the time-of-day. This is specified as the DOWNTIME timespecification in the hosts.cfg file (see hosts.cfg(5)).
DURATIONRule matching an alert if the event has lasted longer/shorter than the given duration. E.g. DURATION>10m (lasted longer than 10 minutes) or DURATION<2h (only sends alerts the first 2 hours). Unless explicitly stated, this is in minutes - you can use 'm', 'h', 'd' for 'minutes', 'hours' and 'days' respectively.
UNMATCHEDThis keyword on a recipient means that he will only get an alert, if no other alerts have been sent. So you can use it e.g. when setting up alerts to specific people for some services, then after those you add a recipient with the UNMATCHED keyword who will only get those alerts that were not sent anyone else. You can also use it to setup a "catch-all" alert recipient, use the UNMATHED keyword on a recipient at the end of the alerts.cfg file.
RECOVEREDRule matches if the alert has recovered from an alert state.
NOTICERule matches if the message is a "notify" message. This type of message is sent when a host or test is disabled or enabled.

These are the keywords for specifying a recipient:

MAILRecipient who receives an e-mail alert. This takes one parameter, the e-mail address.
SCRIPTRecipient that invokes a script. This takes two parameters: The script filename, and the recipient that gets passed to the script.
IGNORERecipient that does NOT send an alert, and will cause Xymon to stop looking for any more recipients. See the example below.
FORMATformat of the text message with the alert. Default is "TEXT" (suitable for e-mail alerts). "PLAIN" is the same as TEXT, except it does not include the URL linking to the status webpage. "SMS" is a short message with no subject for SMS alerts. "SCRIPT" is a brief message template for scripts.
REPEATHow often an alert gets repeated. As with the DURATION setting, this is in minutes unless explicitly modified with 'm', 'h', 'd'.
STOPBy default, xymond_alert looks at all the possible recipients in the alerts.cfg file when handling an alert. If you would like it stop after a specific recipient gets an alert, add the STOP keyword to this recipient. This terminates the search for more recipients.

Wildcards - regular expressions

So now we can setup an alert. But using explicit hostnames is bothersome, if you have many hosts. There is a smarter way:

	HOST=%(www|intranet|support|mail).foo.com
		MAIL webmaster@foo.com SERVICE=http REPEAT=1h
		MAIL unixsupport@foo.com SERVICE=cpu,disk,memory

The percent-sign indicates that the hostname should not be taken literally - instead, (www|intranet|support|mail).foo.com is a Perl-compatible regular expression. This particular expression matches "www.foo.com", "intranet.foo.com", "support.foo.com" and "mail.foo.com". You can use regular expressions to match hostnames, service-names and page-names.

If you want to test how your alert configuration handles a specific host, you can run xymond_alert in test mode - you give it a hostname and servicename as input, and it will go through the configuration and tell you which rules match and who gets an alert.


	osiris:~ $ cd server/
	osiris:~/server $ ./bin/xymoncmd xymond_alert --test osiris.hswn.dk cpu
	Matching host:service:page 'osiris.hswn.dk:cpu:' against rule line 109:Matched
	    *** Match with 'HOST=*' ***
	Matching host:service:page 'osiris.hswn.dk:cpu:' against rule line 110:Matched
	    *** Match with 'MAIL henrik@sample.com REPEAT=2 RECOVERED COLOR=red' ***
	Mail alert with command 'mail -s "XYmon [12345] osiris.hswn.dk:cpu is RED" henrik@sample.com'

If e-mail is not enough

The MAIL keyword means that the alert is sent in an e-mail. Sometimes this ends up being an SMS to your cell-phone - there are several "e-mail to SMS" gateways that perform this service - but that may not be what you want to do. And also, for an e-mail to actually be delivered requires that the mail-server is working. So if you need full control over how alerts are handled, you can use the SCRIPT method instead. Here's how:

	HOST=%(www|intranet|support|mail).foo.com SERVICE=http
		SCRIPT /usr/local/bin/smsalert 4538761925 FORMAT=sms

This alert doesn't go out as e-mail. Instead, when an alert needs to be delivered, Xymon will run the script /usr/local/bin/smsalert. The script can use data from a series of environment variables to build the information it sends in the alert, depending on what the recipient can handle. E.g. for pagers you will typically just send a sequence of numbers - Xymon provides things like the IP-address of the server that has a problem and a numeric code for the service to the script. So a simple script to send an SMS alert with the "sendsms" tool could look like this:

	#!/bin/sh

	/usr/local/bin/sendsms $RCPT "$BBALPHAMSG"

Here you can see the script use two environment variables that Xymon sets up for the script: The $RCPT is the recipient, i.e. the phone-number "4538761925" that is in the alerts.cfg file. The $BBALPHAMSG is text of the status that triggers the alert.

Although $BBALPHAMSG is nice to have, not all recipients can handle the large messages that may be sent in the status message. The FORMAT=sms tells Xymon to change the BBALPHAMSG into a form that is suitable for an SMS message - which has a maximum size of 160 bytes. So Xymon picks out the most important bits of the status message, and puts as much of that as possible into the BBALPHSMSG variable for the script.

The full list of environment variables provided to scripts are as follows:

BBCOLORLEVELThe current color of the status
BBALPHAMSGThe full text of the status log triggering the alert
ACKCODEThe "cookie" that can be used to acknowledge the alert
RCPTThe recipient, from the SCRIPT entry
BBHOSTNAMEThe name of the host that the alert is about
MACHIPThe IP-address of the host that has a problem
BBSVCNAMEThe name of the service that the alert is about
BBSVCNUMThe numeric code for the service. From SVCCODES definition.
BBHOSTSVCHOSTNAME.SERVICE that the alert is about.
BBHOSTSVCCOMMAS As BBHOSTSVC, but dots in the hostname replaced with commas
BBNUMERICA 22-digit number made by BBSVCNUM, MACHIP and ACKCODE.
RECOVEREDIs "1" if the service has recovered.
DOWNSECSNumber of seconds the service has been down.
DOWNSECSMSGWhen recovered, holds the text "Event duration : N" where N is the DOWNSECS value.

This set of environment variables are the same as those provided by Big Brother to custom paging scripts, so you should be able to re-use any paging scripts written for Big Brother with Xymon.

Save on the typing - use macros

Say you have a long list of hosts or e-mail addresses that you want to use several times throughout the alerts.cfg file. Do you have to write the full list every time ? No:

	$WEBHOSTS=%(www|intranet|support|mail).foo.com 
	
	HOST=$WEBHOSTS SERVICE=http
		SCRIPT /usr/local/bin/smsalert 4538761925 FORMAT=sms

	HOST=$WEBHOSTS SERVICE=cpu,disk,memory
		MAIL unixsupport@foo.com

The first line defines $WEBHOSTS as a macro. So everywhere else in the file, "$WEBHOSTS" is automatically replaced with "%(www|intranet|support|mail).foo.com" before the rule is processed. The same method can be used for recipients, e.g. e-mail addresses. In fact, you can put an entire line into a macro:
	$UNIXSUPPORT=MAIL unixsupport@foo.com TIME=*:0800:1600 SERVICE=cpu,disk,memory

	HOST=%(www|intranet|support|mail).foo.com 
		$UNIXSUPPORT

	HOST=dns.bar.com
		$UNIXSUPPORT

would be a perfectly valid way of specifying that unixsupport@foo.com gets e-mailed about cpu-, disk- or memory-problems on the foo.com web-servers, and the bar.com dns-servers.

Note: Nesting macros is possible, except that you must define a macro before you use it in a subsequent macro definition.

There are rules ... and exceptions: IGNORE

A common scenario is where you handle most of the alerts with a wildcard rule, but there is just that one exception where you don't want any cpu alerts from the marketing server on Thursday afternoon. Then it is time for the IGNORE recipient:

	HOST=* COLOR=red
		IGNORE HOST=marketing.foo.com SERVICE=cpu TIME=4:1500:1800
		MAIL admin@foo.com

What this does is it defines a general catch-all alert: All red alerts go off to the admin@foo.com mailbox. There is just one exception: When the marketing.foo.com alerts on the "cpu" status on Thursdays between 3PM and 6PM, that alert is ignored. The IGNORE recipient implicitly has a STOP flag associated, so when the IGNORE recipient is matched, Xymon will stop looking for more recipients - so the next line with the MAIL recipient is never looked at when handling that busy marketing server on Thursdays.

xymon-4.3.28/docs/xymon-apacheconf.txt0000664000076400007640000000350112527752052020150 0ustar rpmbuildrpmbuild# This file is for Apache 1.3.x and Apache 2.x # # Add this to your Apache configuration, it makes # the Xymon webpages and cgi-scripts available in the # "/xymon" and "/xymon-cgi" URLs. # NB: The "Alias" line below must NOT be used if you have # the Xymon webfiles as the root URL. In that case, # you should instead set this: # # DocumentRoot /usr/local/xymon/server/www/ Alias /xymon/ "/usr/local/xymon/server/www/" Options Indexes FollowSymLinks Includes MultiViews # Apache 2.4+ Require all granted Order deny,allow Allow from all ScriptAlias /xymon-cgi/ "/usr/local/xymon/cgi-bin/" AllowOverride None Options ExecCGI Includes # Apache 2.4+ Require all granted Order deny,allow Allow from all ScriptAlias /xymon-seccgi/ "/usr/local/xymon/cgi-secure/" AllowOverride None Options ExecCGI Includes # Apache 2.4+ Require all granted Order deny,allow Allow from all # Password file where users with access to these scripts are kept. # Create it with "htpasswd -c /usr/local/xymon/server/etc/xymonpasswd USERNAME" # Add more users / change passwords with "htpasswd /usr/local/xymon/server/etc/xymonpasswd USERNAME" AuthUserFile /usr/local/xymon/server/etc/xymonpasswd AuthType Basic AuthName "Xymon Administration" Require valid-user xymon-4.3.28/docs/about.html0000664000076400007640000002736311600065757016164 0ustar rpmbuildrpmbuild About the Xymon

About Xymon

In this document:

What is Xymon ?

Xymon is a tool for monitoring servers, applications and networks. It collects information about the health of your computers, the applications running on them, and the network connectivity between them. All of this information is presented in a set of simple, intuitive webpages that are updated frequently to reflect changes in the status of your systems.

Xymon is capable of monitoring a vast set of network services, e.g. mail-servers, web-servers (both plain HTTP and encrypted HTTPS), local server application logs, ressource utilisation and much more.

Much of the information is processed and stored in RRD files, which then form the basis for providing trend graphs showing how e.g. webserver response-times vary over time.

Xymon was inspired by the Big Brother monitoring tool, a freely available tool from BB4 Technologies (now part of Quest Software) with some of the features that Xymon has. But Xymon is better than Big Brother in many ways:

  • Xymon can handle monitoring lots of systems.

    Big Brother is implemented mostly as shell-scripts, and performance suffers badly from this. In large networks where you need to monitor hundreds or thousands of hosts, processing of the data simply cannot keep up. Another problem with BB is that it stores all status-information in individual files; when you have lots of hosts and statuses, the amount of disk I/O triggered by this severely limits how many systems you can monitor with one BB server.
    Xymon avoids these performance bottlenecks by keeping most of the ever-changing data in memory instead of on-disk, and by being implemented in C rather than shell scripts.

  • Xymon has a centralized configuration.

    Xymon keeps all configuration data in one place: On the Xymon server. Big Brother has lots of configuration files stored on the individual servers being monitored, so to change a setting you may need to logon to several servers and change each of them individually.

  • Xymon is easy to setup and deploy.

    Big Brother has a huge number of add-ons, available from the www.deadcat.net site. This is both a blessing and a curse - you can find anything you need as an add-on, but many of the add-ons really ought to have been part of the base package. E.g. the ability to track historical performance data, simple things such as monitoring SSL-enabled services and SSL certificates, or just something as simple as a GUI for temporarily disabling monitoring of a system. Maintaining and improving all of these add-ons gets really complex.
    Xymon has all of these features built-in so you don't have to worry about getting the right add-ons and maintaining them - they come with the base package.
    Also, when it comes to deploying the client-side packages, Xymon clients require no configuration changes when you install them on multiple hosts. So you can setup a template client installation, and then blindly copy it to all of your hosts.

  • Xymon is actively being developed.

    New Xymon versions appear regularly, usually every 4-6 months. In contrast, development of Big Brother appears to have stopped - at least when it comes to the non-commercial (BTF) version.

  • Xymon is licensed as Open Source - Big Brother is not.

    Although the BB "Better-than-Free" license permits the use of BB for non-commercial use without having to buy a license, it is still a non-free package in the Open Source sense. I fully respect the decision of the people behind Big Brother to choose the licensing terms they find best - just as I can choose the licensing terms that I find best for the software I develop. It is my sincere belief that an Open Source license works best for a project such as Xymon, where community involvement is essential to get a tool capable of monitoring as many different systems as possible.

    An interesting essay appeared recently, which tries to explain why Open Source is the natural way for a software product to evolve. If you are curious as to why the trend seems to be that more and more software exist in an Open Source version, I suggest you have a look at it.

Didn't you write something called "bbgen" and "Hobbit" ?

Yes I did. The bbgen toolkit was the name I used for Xymon from 2002 until the end of 2004 (i.e. bbgen version 1.x, 2.x and 3.x). The bbgen versions relied on a Big Brother server to hold the monitoring data and status logs, and this turned out to be a real performance problem for me. So I needed to completely replace Big Brother with something more powerful. In March 2005 version 4 was ready and capable of operating without any need for a Big Brother server, so I decided to change the name to avoid any misunderstanding about whether this was an add-on to Big Brother, or a replacement for it. Xymon no longer has any relation to Big Brother.

From 2005 until November 2008 the project was called "Hobbit". However, it turned out that this is a trademarked name, and I was asked to stop using it. Therefore the project is now called Xymon.

Why did you call it Xymon ?

During the late summer and autumn of 2008 several new names for the project were discussed on the mailing list. I was looking for a name that was short, easy to pronounce, free of any legal ties, and a suitable group of domain names should be available. "Xymon" fit all of these criteria, and just sounded right to me - "XY" could be seen as meaning "anything" and "mon" is short for "monitor". So "Xymon" really just means "The Anything Monitor".

Why should I use Xymon ? My Big Brother setup works just fine.

It is your choice. I think Xymon has many improvements over BB, so I would of course say 'Yes, I think you should'. But in the end it is You who have to deal with the hassle of setting up and learning a new system, so if you are comfortable with what Big Brother is doing for you now, I am not forcing you to switch. If you want to see what some of the Xymon users think about changing to Xymon, check out this thread (continued here) from the Xymon mailing list archive. The executive summary of those messages is that You won't regret switching.

So where can I download Xymon?

The Xymon sources are available on the project page at Sourceforge.

Support

There are two mailing lists about Xymon:

  • The xymon@xymon.com mailing list is for general discussion about Xymon. To avoid spam you must be a subscriber to the list before you are allowed to post mesages. To subscribe to the list, send an e-mail to xymon-subscribe@xymon.com, or visit the list homepage.
    There is an archive of the list.
  • The xymon-announce list is an announcement-list where new versions of Xymon will be announced. You can subscribe to the list by sending an e-mail to xymon-announce-subscribe@xymon.com, or visit the list homepage.

If you have a specific problem with something that is not working, first check the list of known issues, and try to search the list archive. If you don't find the answer, post a message to the Xymon mailing list - I try to answer questions about Xymon in that forum.

Are there any other sites with Xymon stuff?

Several projects have sprung up around Xymon:

  • BBWin is a client for Microsoft Windows systems. It is available from the BBWin project page at Sourceforge. However, currently (October 2010) development seems to have stalled. A new Windows client based on Powershell is currently undergoing intense development, and the core server-side functionality is included in Xymon 4.3.0. The client itself is available from Sourceforge at the Xymon sandbox projects page.
  • DevMon is a tool to collect data from SNMP-capable devices. It is available from the DevMon project page at SourceForge.
  • hobbit-perl-cl is an add-on to Xymon for monitoring databases, BEA Weblogic servers, and NetApp boxes. It is available from the hobbit-perl-cl project page at SourceForge.
  • Xymonton is a site hosting a collection of add-ons for Xymon, including stuff like monitors for Solaris zones (the "zonestat" monitor).
  • The Xymon Wiki has some information about Xymon usage.
  • Deadcat is a repository for Big Brother extensions. Although these were written for Big Brother, most of these can be used with Xymon with little or no extra work since Xymon is compatible with the Big Brother extensions. See the Deadcat site.

Who are you ?

My name is Henrik Storner. I was born in 1964, and live in Copenhagen, the capital of Denmark which is a small country in the northern part of Europe. I have a M.Sc. in Computer Science from the University of Copenhagen, and have been working with computers and Unix systems professionally since 1984. I have been developing bits and pieces of Open Source software for the past 15 years - you'll find my name in the Linux kernel CREDITS file - and I am actively involved in the local Linux Users Group SSLUG, one of the largest LUG's world-wide, where I am a systems administrator for their Internet servers (web, e-mail, news).

I started using Big Brother around 1998, for monitoring a bunch of servers that I was administering. In late 2001 I began working for the CSC Managed Web Services division in Copenhagen, and one of my first tasks was to improve on the monitoring and SLA reporting. After looking at what the standard tools could do, I decided to setup a Big Brother system as a demonstration of what could be done. This was an immediate success. Systems were rapidly added to the Big Brother monitor, and I began to see some of the scalability problems that happen when you go from monitoring 50 servers to monitoring 500 (not to mention the 2500 hosts we are currently - 2006 - keeping tabs on). So I decided it was time to do something about it, and during the autumn and early winter 2002 bbgen was born. The rest is history.

xymon-4.3.28/docs/xymonmain.png0000664000076400007640000013477411535414771016717 0ustar rpmbuildrpmbuild‰PNG  IHDR²ý9mÔ° pHYs  ÒÝ~ü€IDATxÚìý}lçž7þή«3î Ò¥÷Úù‚G°Šý-Rl•U3ÚÜÚLÕÁ”Jq Ú&)IÚU©ÁeU˜ÃÑfªå8©”:©nH‚Ds«G*Å•ÓÉѲrС²#Ñ_-(ŽT{¿ðHdñ¬š¿?.›Ø8Nò@Þ/©©¯_sÍå™Ï\¿xüøñãÇ €ˆˆtìñÊx¼Ù°™)êȬ¢þ22!XY,€,@ Ö¤¢M%¯¯ËáõͪÈXIÏ,0ÝÜ~ÔtSÜZý‚¸5óoT›:ÕØ:ŽûÿÆq óSæÍÿl~q5¿Þ|û¹ç%qkÈ® ¹—w[æw~–ýírsàÙHSÇãÒ”Èï)y"ÿ¼ ³§æug!3÷ݾø¹–¾øÑþcGû—7–ïH={9ô4wVzš×þ‰½úûÉε¦’ÆOšJ 9;–×ó-ck­„/åfÖ–ÂXå=aìªÿÊwWýëýÛ­~]±–lîïõzÉç•8"+];­\άÜUÇF*ÿ°ºgû'êxNTŒü¤<È~ƒÚ‰c/—¯ü9pùù~½Üý ÚohA»»¿í¦»_¡RVpëË•¯v4Ñ…µQhj½Î=µÞ!×ð®!—8Pýq óÝ!—ÿúKòžÔ$/ý°6JÂréö}^×ísSÛnìç<ç ÅB÷íÛ »gu¶þ|ËØÆ(á¹µe¬åÞ—±±ï_‹ýûh?íÛ'ñ¦SÈï5l é×Ö‚솰6cÒB¨ê¡Šj÷:³Ÿ¨$¤éá„T?Q÷^ýDf„ñÀíýãÌ5c½ΘÀÞekÊeíz¹¬`OrÒŸÝó’¸U.;m’ËrŸ¾?l+ÒÔIMšbë¬t:œû_q8õúŠšÙ-‚åLLˆŸ B¨ò!”/úâç÷Å…±ªÿÆØ·sØ»óù=›e{ȞƳ<´uîþÞÖ©¨×§Ó­'Ø~jÊ̘¦°×K?RAû-A{![/|[ùösuH“ÇcÒ¤4uò¿¥©…×dß"» ìÿÇñ@äPú»°³ƒ•–ÌÏzšÏX<Í^_O×÷|ϵÌ#¸ØµØý\} éáXB2sÛ>4s¹u ;^™ÇŽ-¶oÇrŒu¶bµAfޱœÌ]^H‰ºê¿v÷ª¿~âÐ?æ?¾ùŽlfúIe&œT2Ó\ûuuá 9[¶ Ï™Ìó=sÍܵ”=/ü·{±{¾väÖEK9/ò¥Ÿ.Ë;R°=c°@SfÕô­ûË~ÖþfMj-Ž]Gærwÿñ¸»¿µîý‹­uì Œw k¯wÀÕÐvÓÕðÔšÿéîo26žn2²5ÍÜÎ.3§)Ú”ö3 ØMTkÝ{=­uʃë?*,Ž]Gîg ßv,lÛ ›‡¥¹Òyhùjƒl÷ìþÞî¹ê¿>¾hrùÿ8äªõÖì©õ.œ»Ù»zùÊŸ¯^fßn°üâÙÁòçU*Xš9s»™cyØwÿìû}÷¥©v}ú¦—í''Ud?£[Ê‘b¡«B¶^ø¶òíçê¨õ.¶l/6gÒiŽü¤<`¿°¹%êÙj’Åþv¾ç«ì2ÿ2†ÑR΋|ûcqX¾°8{¤`=úÅãÇ?~¯Œ÷Ç+ ÿ‹.GE}Tø:…|jy±¾š,4f ).ÄÏÇ…«—¿úóÕ˙ͤ-oX¾°¼a MÁÌاÂm·^·e®j W…Úô"WªÙ6{V¶ð÷eëŒ}{ÿø× ¶ðýaß1öjô·±WWsDƒ!×ðõ!»!ìèy»{€]¾xº~ã°:v]±:òå»`—hNoͯÞZïþݵÞÕÙÿü%óÎÑG™û>.lùüK–~¤ ßzáÛÊýìjæ*Ï‚Ý(²‹ÔÜý ¹oí ¹Ù³Ä¸0=XciÖê'sMvã:ÔréË¡–„”IHìr6³Áíó=×–^¢ ÙÏÕ?/ØÙÍZpø[†¿ñ·,¼Ï–7v]±¼ù:òNäëÅ~»|9–Îó:b¯fïm¡%*˜8 Xå²Ä™Çwá#kæJÛÍ šä†‡Ö~]]È/oáçãJÔW,g&Ýù`òÑÏ•¨§¿Ká{^øowá{þ|Ý|õI¡ùSÈy‘›ZáG Ö;v=¯ÛØ_2«¯f½Lm}¥çÙWÚíûÌÑíë£þû²Ö¿zùÚ«—Ó?DDìSÏkÿ Ùö鑎§G«¹oçÞ§Ôy<.u²†‹Z‰ö¹V’&ȇ=‰ ÖnÖ Ù/]²öøÞìñ·\ú2}Cò<<ûåûr©B·¾ÖJi.‘¯Ö‰¼1Xì0½ziŠˆ¦2×q5¹æj`ϲì»e¯ ³?Òó‹;Õìf´¬}A@¾òQ@ŽÅ¼‹×‡kƒd¤Ód\ÛçÚóŽtiÇqO±È7¹[ö7¹‰èƒçqr"Wʉôˆèçò<_‰2Ñv2QúI~FúÇwá#kóì¾móÄë¥Q(­â„ÒÕ*?«§ðóq­ÕW‹ßóå¬Ö¾¥œ›nêÄ&ãáÓMƘë Y=½ùjÈû¬_œñY3×Ï75¿÷»†¯û]l {ÆÎšç-¼u!TyOü×îž4Ý¿rk¾Ï¾?Ï »„BU3BÈÕpä®§·fÓ[ÈgYÿF6®\ÚþK¹4ø~dM÷eR—ûÏéH¾­Üý\}Òäɤ4ɺœä¾›fÆkvΖôÅ¿8ÓÏ=Òj~õÝ+à¿r+àwz÷ïþ¹’¶^εÂ÷sõ±g’fn[[ö˜lŸ3ëÀAë¥KƒVV7>¯oÇ: ä–(^æÿŽ—ÙëÌõ Ÿ  £ñLyG#ëÇž[ž×~]]Xîz>®D}Åäþª²ò³\{^øo÷Æ8¦+w^<Û‘€õhÓ ˜Öº–‹­uÍŸ ©Ë>Ö‹/h¿µ+hÏœ6,sôš§ÿÊÓØï?Þgk†Ý·÷‡Ý©'` b7ÆÝ¾.G·  Ü~3àå¢ ^ÎÞJ¡ûó|±kиpò¬üoøà­ ì{½¶uï_¿¶Uš<©I“k¿äˆüž—Dž5Œ_ý#Uø¶r÷sõ±n>vÏîÛvOn¯`¹ôdR.u¨yÝq =DVì|LÈ=ÌÜŽ.3ÇÆA0·µƒ¹¸Æ oŒs­ðý\i¹½£Yw–?¹uà ÕwnÐÊÖd¯ÙòçõíX7t‰ª~AÜ:¸ýæx@y02«<`]*2¿ …ž~÷@×Þî°ûû7ÃîÌÁ5×K]ýs¹Wèù¸õUºã@ôdTckvûζtûXùY®=/ü·{cÓ•8/–r¤`=zÆ1 `iØ D:žˆHÜ?ÛÒÏì ›é\ÛØuj<€••T´©¤bï´Ý°w®ÜØ«?ò¿†“Цðmš¢'"=Àº´aÇ,È|6•Ô‘„”TfÕ¤‚C¾‘°ú~?,L® ¹ 2gæDSÐÔh ²÷4E‹j Ѭª¥Î8N̾!™»ÍxáÉrƒ\dãDNäJ‰‚ö[»‚öõxd­Ï ZÅ­{wŠ[ööÜZ7X~ëÿ,µýЬ`ÙíY$ï»Ç?N·¾a°¾‘f )÷[¹†¯¹XÆþŽ"‡Æ»ä‡ÜñóQ-@!"2‡ASp{›)hæv~fæêÇëÞ­gO°Sïæi•ó™?Là³^<ç³>Yǰøt5eîÜ€õ+,Ð"M)äïÚÿJìbñÛ·ßøö[¢J3aUZÔ¸ °.X¶‡¢ŽÌ"d°zæZ°Û{^6TdMaç×B7 \‘õ¢ÎÀ‰¼Ì•r"ÛÊz9²}ñs-}q¹¬k¯\&—úÎJ“õã{ŠëÇ-c£™Kߘ¥oÏX^pbT‹÷G5ÖÊ _ÈÀÕÐò] '&¿üòÄdk]×ošŒ¯m_xm+ËŸ¤¢MmÜ0hýÄ¥KŠÊ:˜‚ÆÃ¦`“ñšŒ™ÿ;ƒlæJÛÍœ\zÚ(—Š|µNäY/}„ ?—3KZGs§ÐÑ´nÚþkwþôïæÜ¯gn›‚§Ë6lª»@ µEj‹)ñþXê:©$§’ЦÌÖ=ͪzÂeÍÆÀËE6^¶Ð®+R#û•€ÈW«"ã»rØØ¬Óœ?L e´âá²n-ØqÉ软ü¤f¶3˜Ã™9‘h&¬)l‹ìFq­æÉ½Î˜ užüo©ó¨±_k캒[³ƒ%s­-81ª©#Qm¨%Ò0ÔÂB™&E;ù¨ìEó[e/öÞW~ò4)§·ÕÙ÷püõ>k°bôÿ V˜¹mms!‰ÀÕpå»Q»1¸íCcÐìØù™Ùaö”›=Æqãaã¸Q5n1ª–ñ-ã1ú±:FƒßÙA˾Л»÷…"\¤+¡cB>ìÉ¿¦Ì„5%©$£é³Õ)ÔS ¢_±6QíЦ:ä-™¾š ^°Ì͆ f¿Ñÿâ÷}qöš=ÉyòÖœ !+L Lû³ûg²§pOþ9?vQž~r‚Ë Õ–îV°8¼\TÁ˲\°9„ÁJ™U‰Ø†fy{µIæD2“˜ÙäXS’SI…·TèEMѦæ–èK3CI…8¹¨š5JŒ$æ­õK*wŽDÿ`¢µyLY§ ‹ãÕ?XvÏ®ß!rP#qŠz{¿¢Æ„©ß¥j¤xú:~î_:ž‹GµÛû£š¿ç÷þžo|óÿ}û@“5§&'ΜTXÄfO°–X^°¾1Ôrëÿjéë9þŸ> Úol ÚÞš¨Ñ»‘náXk[ÈvÃjê=hêe#A˜‚¦k¦ Ù¾}»ÙnÙ÷ò˾Xbd6–zò}´÷ÃÑ£½£ö+µ{š»j<Í&ÉÔd’2È Õ%¤ÄHBz­S|áµNÚJÿ‹¶žJˆnQˆôd4c$€nž–™a‹cG—ŤQ ’ªüA­µ/0_˜€õ±Ôˆ¾}6_½LĆkJßÒp©‹iÖ³:hþ.h?UöÖ[§ÊTiÚ¯J¤;I™¯±%¬†ÊPÕLe%=ÓÖˆx™¯ž Ü8¢D¾ !ƒeĞ𳙸 gæ¸ôØs8qK…A6s;>3;ÈAD”¦?LpqᇩhjPCNäJ ²)hl4±Ñì¹D°èCžS¥éá¸À‚ Ùir¥D1nºk­¶/xÒMÀy´×â56š½C®EC.URh —Z+·ï·ŽçĨvkW$àw}f ø¯^üûÕËzQoÖ‹œÌÕprfàòIïý"NäÌœØäo¿[çr÷›p[Sƒ}*:Ãz®»2g:pzkö8½vÏn£Ýcö˜ÛÍž˜7Ç‹éå‹)–øñI€ ׉èoµѨ)z:jº¼^z5hLM&a³† rëÀ¹nß>¸ñ«P›ÏúÍtÐþä]uîS³*QRÑ¢ªä³~*HSš¢Mi qDÄ¥ÏPωœ¦ã9Æè?hlýÔiñó ý¸yÙ:*nØ:â•ñþx%Ž#@®õUO.Å<Á‡sO±ÃÕ¢'£»e×Ú®g† X¿_Žt$I•flªÄ&Gd“Þ¥Ï;ö©|LjÝTGOF0­Ñü±:Ìÿd÷„”©©¤ºÕýZ ªÝ~3ªš?¯ ø3×<ÚÛÿñÑÞ'aG:L`·Ø 2+ì3Â䣨yò‘^d]5æò‡ua0wt™‚TFÿ@”®¥‹*ÖgÝÅêsÖé`°åâÙÁòÒYòrÏ9,û^þÞ²/Òzçz¤•º‰¨ûÉYÿRF ðRvšG{ÛFöÛ.}ÁóÔ·ÉCDDݾžºnß“îD¤)?©DDÚ§åglÞ¢ùݼrkÈU?~ð`ýøzÏ“H òN$°9ËC>¶Ž ²uà8ä³ëÉg3O° õìN vˆ¨+µ];ÏôÄ­{^·¦ÃÓþ¨Æn:²G`žÿÆ#½fzNÔ”¢íä'¢›¬uR!¢qóžo2>•ÑQqª‹¼ý^]dýî¿Ïrñ¬Ïâpîßíp.%€ÿÊ­ìà&Ž#¬éºnïÎ¥ÕuKð_»³žëÉÅÊ;À! h4ÖÈDÆÃkãi»Èë½ïÿ¦÷~@W"ª"¢¼ÑdOĉìV‡a¶„ˆˆÒE ‰\$ 'áZ )ꈦ¨‘*-=56¡š"ŒœW„ –»Ó‹ìMD§Y@*ß76¦{ÝZ×âk­‹Ñ¯Äæ9Ëæ <=½"S?þö»õãd$"cæ8Að|ÍÜÉ9¿0Ø'¬{‹í°¼1±É³Y7avµcæÌí驦—k+ñ$ÓÕBÿ>O™£‚Ú‡ÿvGµ‰wÒ;¤Ožœ0.d—ÙOjvާò=Õ¾ÈƉ¦à¶óò 2_mÍ\i»1HôBÆ€|óý¬‡ÖlV‚'Ã/×ð2ŒÍSÀÂlÊÏÌÖß>ø¡ãêec°ÈÆË,'&%'Ç¿ÿúahüëP[B µä"›)Èêá;òNÈ­JÓÉ èŒ"‡²û'Ž÷ìiœ|ÔþËÖºÞû5¿ùùJ”¡:óÙeg-޹ó¼¤sõaøè÷o††Ü·÷‡Ü‘Àíý‘ëtÀŽû›fÂé’–z@½ºöÌå–ÙŠ'ýze¯ñ2·KÇ¥Œ"‡Æ¬Æ»ÃUa7›KNQo±¿A; ",×v×YË‚ÌQÁÙ<äV»eÀú…jÞ¡¬VªïW¥„¤ŽüÜÅ´^Ñ8–¡vĵãIì…ŽøÂS£¾ç `:Ì¥ŸwœÈmçDMѦæÎ)2xg9Od zÑÌ•~fvd~žu:`¯SC'Ù ²Q*®Ñä¸0Í'‰h6£íܳMvËM!Ý´æædé½öýÞûÍ%Kö•ßøUmynî¥K¬Ž×‹l ‚²Íÿ\ö"k/`¹RSPg©‘*iBúò=©$•Y•M˜ kB4ë4mö¼¦nEÔJúÛ‡•¡Ô¹¤Ã´æf‹X¬Hàî‘ÌÌCNÔ”pUȪ©³jªXVmï´ý›½“:éÔ™¹<5”¦ˆ|›ü,6±`œ>c*Ó'ùö×Ùù–¥‡žŒVÀÎDŽÓñ·±ók_­cç¾Ú;\r³'6Éo“Ñä·™ë¨'ÔõDmÏ[oÕöÄ„XL0M¦àÕËþo®^æ^+²q¯-vÍ¥H· ™Ãê™Ü5M7·5Ýdáˬ7ìT´×B¼l<ÌËkaâRýkz³þµÜc—ë”ùŸ¹Sf6—J¾%K×lz¯§ÙÔdl<Ýd¬ ¿z¯2œ»dé[•÷„pÐ6º-h[®5—žÃkŸþµ-6ýkÉo†Óߥðo—yÅ­Õ/ˆ[—7O ß“Â×Ì=úùÊüJ”Ò¥X¸ÕƦ‡RÀ}ZQÍ\ù3ñ»“®Ä¤KsϾCˆ{bWÄ®ÙgG4;ëwÙ8qygÅZwÁ‚Ônó…… XëƒEœŠè‚{ýŠjwŽD5¨“~f2$cp›j ²£†0ÁJ³8vvY19‘^̬:R­ ¬â6dUOé± Ø´ˆ³*±Ž ÁÌAæH”n§ )l}ö×Ìíì2sDtxíåLæ´²WýßL_õ{<þÏk[Å^Ûj ÿm¨¨È–®»Ê^Ü~´ìÅÞûÊOÞƒ£¨Ëä!Q›ÒHSÒÏl91c(VQ/Î&’JØ~çHØÕîŠj1á‡Î„4j¿òa·w ç]ï'r¥ÙOŒ×#6Tž4uü„4u‚>¦YïjŠÎ@ÔWrkW$@DßÚnnµ±Ñ ‚öÑíéÉÿ¬Ë«#©<K*§Ê>1*;Úûaðh/õR„z7ß¹›Y*æ&š )·Â!%s°Ò§>õ¤ÎLMŽ(rfNdm‚HÔÒ]ºRm ´ÀèAë+3l ™ÃóÜ$—µsr›CêhßGûöu4ý¾¸£Išjç¤)!Ï¢×\ M™MdÍñ¯ï¸Æ¿.|}"Ú¶øíÎÓŽà&ݼzyôÿ,705™n²ü »ÇªÂnEùEùê¿y6ëV“ñðéç=þ…\vÆ"— ß>©yr—,«©z¯ž½×{5ß’eØJÁ7ÿK @Þ#û™éµu°Ï9G?_™_‰R ¹’6•¢Zä˜À ³»ˆÖÄ®˜Ê'ª)˜t?K*DOĉô(ɦWfä°ö•öñÝ{ìãDºšåÛ«¼Á‚¾øÅs}qöºÉøö»kq£…Bâ«Ó×GW/õç«—¾˜f7œkÿ‚ûÙšö­—>Šì¢!»ñÌü½’Fí£ÛGS7/L0¸{d|Ñ—ÝVÇŽ.«cåöŠÝ$Dì‘?Eìz263ÇЋ:'&”ÄHBä‚SN’SOƒ¥™°*°YXwv¤4Y›Òd6`\˜V¥'©%ˆrIJ ׿ñb93X~¡j°¼ÞzH_oÕÏ”ÓøÑÞþ öfÛ'öæñ¯#¥ã_³úêÉØ+/”½x´·ÿãÖºŒïÏ>¨DdÕ”Ù¹H›íÔ´„¤Ž$¿õ÷V¿ÕáÜÿŠÃÉúêsªg¾Tk‚Ü0Á%ö¼$è9é½Fÿ<ߥÀínÀ¯<ùHyÀ–°ãÕ߉qOÓ‹§i±k.Íóì.¬¸ýÆÕˬæçD¾šH“‰Ti°ü›ý½J}óëÿ«¹dòÑ7ÿŸÓk v5¶5eVMHƒVßÙA·©Ád•+w­rÊü‰ñ”yÈåÿãK•¦ýªäèyÛ;à¨Ý»ÓQkÝ·ëŠuŸ¦ÌŒi {Í>•¹düêíýãWÙ3ÛÖº÷}­uÿõ速C-ÃׇZÌúÒv³>ß>D®N¼¹jqXþÛâ ¢ýó-‰WÞëŒW:{¾åìaܲnkþ–K_ú[Œ£ÛÚŒ£,µîÁÏßîìöu9º}OZÿ™91tôÖË¡£¹Ï–3÷\QGfÕÓØYéiÜwÀ±sßÌ5NùÙrxá”ëÇß:X?ήÀ[ë?¸ÖZïîku÷±ÐÒ· eöÛ›û¦/~®¥/>hñ´°o$MI“C®¯¾Ë¿Ý\ÑäÔÉh²¶§fOmªÍ»þ\¸±_%Çý»ܽm£î^gwÍgwîq,Gó‡ ÎÃÕéÓžU@ù%§Af¯ç¹ÄIµ&ȼÉ\‹ØOiá!ƒõ8”‘^äJõbº"È{«?KÄB ¯5»í/ °×ésvù£¤+WbYPuÜqûq{J@Nz…œœÌÙ89³|>U_}n}£µ®çï[눈4¥Ûwäé¶]ä#ÖÆ ŽèÄäo“'&E¾Z'ò,LÀžÆ¯÷6 kò*Ï©³›ÿ;NLÜÿ~ÈARq…¸Œo*ªubÞv`ñûÒˆHý4Aý™)o6ùËÆÓõ$»áo¢Ã§ærÿ|˜¼ÖŽH òNä¹u‰jwŽDa÷Ý#!7ç⦳ÂÔ”™*ÍÿtÉI*Dœ™”úñ7_1sµêñiEm2¦åÔEÞ~·.u{lëxå{[Gôµ{¶èkôLašÔl &"2±×n{Û¨;k¬‡ÜÞì¦kpü»ƒã,¸Ÿ»$h¿Q´ùîÐϤ/ò{^ùúСcõ¡zËÛïÖ[ê"Öå °3×y¼fóøÂßn±)žÃùR®<õÊíÊSaý­ÏÂz­|&¬•ë¼°[Àî°]±;FmßýfÔÆZCxC=½!ÚGDû–rdó峋Z.Î7‹º0V5#ŒyÝ¿ôºEÛžmâÏÙÂ÷­ð#^xÙ[ìš Ë÷힯̇ÜÏVhœ;½XdÓ‹NïÞ)§7ì¾½?ìŽcUa%aON%$fišŽ×N˜U9ASˆ4%h×µíûhú´XfO‚sÍ9Ø¥§Y2·›%"ê"R¥éaUJ5]Óæ¹°¾Ás₺.¸ÞÙò… 6ÏÄH•¡ª™Êmà± ò… V?L½W–/¬6ô—&= '$ƒ¼…7ˆz‘… 7¥ÍÜÓ°¹gb:žíž]Wì"ZGÇ”µ‹Ñ“Ž×äJ¹à“åæ§ËçÓõUmÏáOöùºwÓ­¢r»P¥j3‘3s"›vq¾”×:Vröpüõ¾¬'sGó§BGÖ$õ‡þ±~‚ìD4a¥a +Dôǰ›JæÖYxbÅL™õ¤w ë7ÞWÑ?¸®^üûÕË5”Õ¦NF5U›Vç3('X éxnþ5çBcdØe }½ñò1?öäÕÀ¬¥{mÚjl4m}¶5—ÂáÜ¿Ûá\J ÿ•[ÿ³}VS´©¤¢)3aÍ­)Z4³ƒ¦ôÅÿ§¢²6fî%§¦éÚ³Ol,ƒ•9Vϳ{©ö­Õ¾MH‰‘„d\âÅË{þ]¼ÜTòÞçM%®º“š«Žh6‘T8QgЋ¬ŒÄ„iTc.,„ÍÆ ֔Ĉ¦„Ýÿ¶%K{þþÄdRѦˆâÂÃQ-ªÝ=ÕÌ\é?YQíî‘ñ€«áÈ\ö&HÕoXæZØÍ㿞ú÷ý-bÙž„ RA„ ÑF*ØáÜ»Ãá ~Ñ8²Rº¨ŸØ:[æÚ ´ü_W¥oX2°¿”j;iOÕ–ºA6L0ùèŽkòQ\˜Ž ì²cu&šbš©r›jÍGëô—×4jj4¥ ô‹-‰UÆúc©ºWš<©I“µþ·¦ký}ñ Wú⦠iÚ2~© e5¤/|Í¥x^Ó‰å^°£ö‹ç¢Zv˜ µ§Q"ö+ žPG4Å¿â`]_ŸßpÚ¬]†uŸå ë¾ñ«‘wƯæ.ak²îvÕvîÑ^¢¡aÝÐ@fj™cüW¾ øÞƒ^önî’'uà^ï@ýÄÛïÕOt4w^éhæå¢^¸¨ÌJ¿¹¤ñtsILøqwL`9éé=SîY†Ù^Ny)S-.œ²ÈW=ùSeŸœ?U&ü±êáÜ)ÎÉÒë¹ÿÐë…ºªQ¡îÙ¾Qî>³|fv(W:‘¯®y"ݵüé Z.üË e_­³j_mÿû™žuÙÎ=Ž…+üˆ^ö»f¾³€…o–òíVÒâZ°²ßIJwz³ClùbS£gš5¦pì7Ô,m7)0SCMÔ¢š¨5^/²9ÈÌ\ù‡Å±ýC3ÇÉÜN^¹_Û_<~üøñãÇ,ÚWÈÂîpU8ÕÀ¬.òö{u‘µqÓkÁ¬J”f ‰M™ê·Ÿƒ5¤gÓ1¦&cCÏçœOË·&­XóZwﱈ»×]qìWî "ê{òFvp[l›€…±^œUõ¢^$Ò‹¤×ÂZÄ…xg\ i&L’¦Ì„5eÔþý›£vc°¨ÂdXûS¢¢ÛsóD̪D©Ô2Â"I…=HXÜþEúEjJ³'}ÖK—|Vö7û]XkÒSÏÎ÷7ûyZ¾¿kßÂõØJÿ]ªì[úYU/f.aÍÜöÍg&JwéÕñéؤ‰ìSfî¥3ÇfIHÏD“n}T2§™L‡ ÷-æiYà³ÿÑ—ÔâØÑeq„Ý·)ì¶yv}eÛ¤óT¬esÓÐ.AòÖ6MÉœl{ýIt|v€ !Í&)3aRØ÷³yvŽÙ<¼VºóÁâë4Osg¥§ÙÝÛ6:ßð`GûÛnío2¾ÛÓd´:,¬Žç•« ×Û¹9û[°Þ±qéY{½Ìå}÷ÏÜw±µJῃ‹-]›çÖ8jl4Žnìï¸ëe®+Gx^[OfŽP~M¤s‡§MwÿÏœ‡bî~*ý©§Û d¦™žéÙÛüÌl,4£xŒ8*ªXÚ d.1‹;+Ìbîòti¸ÙT†_ù¾2œ;¶…zBQO<¯ùŸW»4Ùl“†²0™ÛÖf挣Å5é‹3í[mJû–ÎzU©’:¢Jf϶6³'ßÔ‰k“¢^ŸVTö~¨eøìP y°ðGýÄÛ-õ•T6ÿðZØçnßçuÝ>7µ}àžçÝŽÆÎW;‰èÂz+oï·€M(˜û«GµÓ¦ >®˜øÇ`5e>áϼŸïÉ?Wúô§çZdæ>•ýà67ågñÙ›_AÆži²¦\vÚ$—±6 âÖ=/‰[c½ÎXÖ3Ïú‰º÷ê'Ø¿lMö´j<94žÕ|…=1fé°¿,}öL&sÍ„4=œXÊ™[ÜÞ?¾©›ÿ1ñÊéáxeæ_&`­bÂôpLˆj÷:£{RÍ>ÅæIfËÓï>cc)°Û¶ì5µ©¤’oyf ¹[aç+Û³*Qæ:,ýÍ}lgU"ã(_mUOÌŒ©'ØñeáÖÚ(óØEwÌ5cù?ÿs9Ÿ>ÊÓÃÙGsu꯯§Îë“KÛ9¹4³e{Í–{}]¯/·Ö’¦NjÒÔÂ5[’®gª_·Êeíz¹,wO ©»ØrÖ ,³õVáuTöžïyIܴߨ´Óû[°ØïÅŽ”ãÀÞŽ¶ÎÝßÛ:Y0ˆµÅÈ]¾6¿uzùÓ¿D¹ /]}ñóÇûâÙ¥kïNÇÜ5“ÊL8©°²wÕíîUÿÂå“­S?qèó£|¥ný5€Å˼Ï÷zþõÓ!€|©-§¿XYËn>Íœ¹Ý̱§4MÆÆÓMFwÿñÿt÷g®éiì¬ô4²9~ÙšžÆ3åžFwÿ±‰ì5¥©“ÿ-MµÖ½×ÓZ§<¸þ£òÀâØÙeqääî?w÷·Ö½±µŽ¥éèÚëp5´Ýt5læ">:V>ÊníØmyî:¦ ñ°)hó¼|Åæ1ë·}hÖ³ð)X\c V†+nT†mžò/lUšV%NäÌ\ÖÉ`‹k 2[‡ý ñþ¸À&É\Ξog¦¹•ÌmÅu$&°ç~lM¶WÆ`±Ó˜ZŸÝ.fŽ)ºÙð2_ÍË£¶±ªQ[:€2NPÒgå¶63Çâš¶ŽŠ¶Ö!Ÿ|u:?Ùš,…ÌœOeãaƒœ*' ®¹ÌeØýýþ°Ûî±Ý°Ï3˜«Ý³û¶Ý L<Õ+˜}w‹Ãò…űpÄ–°wÙšfng—™Ë­g ©»ØrÖ ,óyuáuÛs›ÇvÃæaõžªz(„V®ÞNß@>ý·`Ðb¿—)h:l ._»¸š9Ë4[n3ðl†tk-ª)fý¶¯ÌúT3ûM…KLc£ÉÁò'Fñó1JH³jþ X~&Z4°é·}eËÊOб„wtYÂùÊÉÂk®¯)ä¾õrÈÝÛv¶ª·-sMI<þ™”UÏ^wåZlUëÝ¿{¹GaÈ•·>™_ÜÉÿÜ“ó¿ÛVæèVÇ®+V‡vsVÕnÖ>ªÙSû(syLˆ÷ÇzDУUÍr:KåË•~á¥KUÍ!—çÈ\§·fÖé­•÷ï®Í:k{j^¯í‘KÛ#r©ÀW |æ»ùÊ'{Wš:—¦æ9F—éeºœ¯Ô­Í£°™­ã`A!\ G®¹Ø“ {Åî_Ù+èÁìôÀüâNµ°Îù\½|íÎÕËz‘+}Òd‡ 2r#—žtN¾@CöÀó§jŠ&¢pnÊ™)dõº×Ãl¹’øn—’˜o[:‘¦h#e´…¥c9Ì.ë-âŽ.‹ÈžÆ›=¥íæTkŽ*œ<ùùóGyá5— kËš ÇB“¬Aæ»!w¸*ä¶”•¿n)£¯é›t`mÖ]…ÔQ©–tüú¹ÝZLÝût“M´LÄÚ dåN('©ÛG `#X—Ý¿køºßÅ^³ÑË…På½ì´ if,!±flI_ü‹3}ñÜÁöØgþkwþtšWn ¹r×d›ù¬_œñY3—³ ©Bdæ*ë>À(bC!²pC4?Mæ¸èY‡KœU‰x¹¸†—Y¯ûÈÕ»G²çIïgæÄxå´?½õÌ&÷›Sæ,ÿYçvqϽƙ¹×ò}Ö sfƒœ›Ÿ¹ÝL˜ùÖ,²­d¦Éø^O“‘õ¦Î¥‚½fÏKÓ>Kd÷ìþÞîÉ]3·<^wåvÍØ¨uÔf¨{MÁmm¦`æ7Ê÷K”«ðÒÅF7B•?!¹´ý—ri$ðýSÓPu4ž)ïhdãD°n ÙåS™¯|ò2ÿw¼Ì^g®ÏFÚÌõ'Àz´.ƒìâ8ªEOF5Öó³Ûw¶¥ÛÇ.z2×”KO&åRÇš×ÒCŽÅÎÇ„Ô“Š¬5Û)—²ÉÒØšl’H^.ªà³g²ž™Aû­]A;Ûº0VyOëhþTèhF‘Z,6ŽÀ“á ?Mh—oÌ‚¥`a‚°{¬*ìŽî~¾8Î&„íUL¸÷iL`{ÅúýÎ7 ÈfÁZ d:˜ÙR#³U»±g£dçgü|Lˆ¦NFª43¦JGi»Å‘Û¢$©ÌŒ%•HàÞ§‘@jn…œ­¬Ö+›õúfͰÙ9Î^³P‚Èï)Ξ¡ðÉÓxú¯<}ñþã}q¶fØ}{Ø=_ThÝ%ò{^y6ÔÜÆ®£6CÝËŽ;륟þ%ŠŠrû|ùShéjmøà­ l×¶îýë×¶J“'5i27ÍÝa÷÷o†ÝløÏô~¶sså³úqëxàö›ãåÁȬò€ =˜9:CÈ}k‚éëÍ/?~üøñãÈÕï÷Ï÷|5W$pçH$Àš×EÞ~¯.²±&­™›”‚êÌ&Qó· “nœ ù2¡`¾uØí»Éä^ÓñÙϨ³{³ÏŸBáËy¹ÈÆËÜkE6î5vó©};«jß²gã™k²½âOñÕü)¶$ßš›æ0÷±–™2×dG07?ÓŸ›\“͆ ^½'´oµ¨ömæ¶Öæ4œ›g^úÕÁÚ°Ø;m7쑯#ïD¾Fž¬&E™UT ²°ÉŸ2û]÷ÞïùûÞûl8%€•–,X/u ‚Ë‹µ’pz÷¿âôº{EܽÈ€ÕÄ‚|€ÃÅ \¾òçÀeª _QEj‘ƒ®Â«Äê(m·:h”ˆF×Ë>#L°¼Ø„|ÔKB˜à¹YÇÀFµ9»x¬©–šÂþ€Í- KªeAT»ss ‘Îg¹xÖgYJl¤Dd%ÀÆš:Lª‚zb&¬ž(äŠz}ZQ5E‹jJ]äí÷ê"·`c`½téΪÈÀlð ‚enÌ‚Döݾó'º}ìukÝáS­uOÞÚ‚lƒl1!~>& `¹Ø:*nØ:0xêf†Z–jœû€s¹°XºÜE™a‹cG—Å¡¨7HQE¾ê¡È#Ë ŸH òN$€|€¥³uT­ù¨U`¹ VÁ¹8÷`±æ 8œ{ŠΨ=ÕD~O±ÈiQd†M¨‰|€gSø4®°y V¥@­‚spîÀ³I 4eVÕöÚDÆÃ&"ÚI ¢.¢¨vïÓ¨f ›‚d§-d_ÞH*ÚѨ=òNR ÚïI/·8JÛ‰DÞrA/ä"ÛZÍÄ ] ÚƒöØyE&Þ‰j}÷köôÝGñÖ´ž=†IHÓà )ó]½XT¡Íœ¹ÝÌ™¹mmfŽHÇ#×àyË;À! hÊLXSRa‚0h½±%©4—tVFµ¨vïSMq8_¾¢)B¨´]Sü®‘YUªí9cIHŽÇ&Bî¤2«®½L´8ŠlGØ}¯3àåØy^FÁØœõú´¢¶6ùCkƒ¸uÏKâVOó‹§9ªMŒj™¯6ÈfnG—™c×W IIHƒÖ ¿´:ìßí8Ðoü¤©„èÊwWýD3ᤂ\€Õ§{^î‹ßØB4tàÊ­°;0~Ú(pDºWH&] "žˆHäwÑQO—3¨Å…{1AYÇÛ×HÖÍO/Q)ŠÀf1ä¾>äêh>céhNH3c IæO&e¾ûAçîÔ¨{•‰èU""zHDº@öY;íÞc'¢š$MÒšLއã$}^×í#ê:Ù­éźwkãDo¿W7NÄ•¦®6VÐs˜:1&¨#DC®kwÆÝGÇÂÍí:„Ð`ù™òZï|ï³¶‘C!7Ñíý!7ÑϣˉD1µ©›gÕñ‚ÑIH3áôߘ0=LÕâçŸNY_j˜·eÛûGÆD3áì&ˆ°ÒØ¥¼¸µúqkæ_¶|éé›_Üù™ùÅì%æÎ^IR™ '•¦’ÆOšJ\ -ÿ×ÕÀ‰E6N VŒü¬¨õºH퉟jæŠm[Ÿ¹Ñ~ü|LHHg,î~¢]Û*íéoqk—RFDŸS'v¾Úw_/Ùænàïuí Çô¢A~©¦ÒM4î›âD¯Д"›4IÄW !¶¶×w}:©Ä…éaMI–ͪDqáa˜‰Ô‘¸ ò»®9”=*§QÑÓ{¨Ž$¤˜pò¿Ýýœh;n³EZÂÍœ?ÕT©fºÉj Öì©GAX9¬Ip_ülK_|¨eøìP kÌšþÖO¼ÝR?aPùˆAùjæ|€Ÿ“T´©¤RÛóö?Ôö„ýßyÃ~N,ªàÄÁò/Î –äâÆeë¨Eܽ¤L݈z4%|2ì&å][kƒ^<÷~÷Qi»™Ã€•ðZDµ{ìÙ¾º¤§ë1á´ÉÝOtøÔÑ^ƒ|ø´«Î ¿Ûãª#:|ÚÝK9 „Ýï}^?‘þDü¼\ÕîQ%ƒl¹ —×ìs•¶û[4åᘦ$¤pUSIR™ '$E"µnjréÛïäŽÆw>2ÈIez8.„܇b‚ͳ£‹óïáÉÿv5pâû¾¹=l缑@¬?!)ªïÜ õyxÓMS“éæÂK6¯¯§Îë“KÛ9¹”… Øröš-÷úº^_æ§X»iê¤&M±^ÇAû-A{L¸×ØÖ6A.k×Ëeù¶.—6Éeé¶ {^·²²ëŠ{1Áq`ÿß8°5ÙëÜ5YŸçôÖ÷¼$neéç¶k@­°rN•6ž* »¿Ûv³%NïþÝNo!c<±0eÈ® ¹ ߢ^|û½ô£M™ «RR9—¦õ°ç>,JÞ`A_üâ¹¾8û»¼›Ô”ŸÔ¤¢)³*'²ØüâÓ™½êj‘w¢šAÞuÅîÉ|Ï Wþ „ˆvv™9M¹s$ªÅ„»GÆIåGÐfÆlžùÒÜR!òœ¨3hʨýútGóëæ¶¤’¦‡³û¹êj~m jÊl‚õߊæŸ8\´'¤èɨƉúR½˜zê<Í1¡s÷sâ[›ŒNïùËWÿãG6›°ûûýa·Ýc»aŸçÜ·{vß¶{"‰§æôfsÄØ<¶6òàúÊ!TõP¹ûÿ§»¿ÉØxºÉ¨<ùIy`æXm£MiJn l„s¶&ûK!sM¶¤~¼îÝúq¶&{»¦4uò¿¥©Öº÷zZëØ^Y;»,ŽÜ­£VX l.ƒ¾øùÙWGlÀÂBR0ÈE6ƒ¬)3cš2ˆäþeaÁìÏmÿ0; ¡)Ñ“QhdVQqîÀJH ’ QRa3ÇŽ.‹#h¿µ+hgï.}“é>ÿɨ)vßÞŸ¿ßÝkt{RrÝÚ•î0ä™MHD·v)ª¦°Fþó÷ÜãÄ—¿²{’Š6¥) )z2à'Ò¦b‚¦hÑùZ4p¢±Ñé%âJy9!MÇ„¨öçšÔ}VPÃæ1·ëENÔTÉîyùŠqžgIeâP$@4íOH£öëÓWýDUEÞZ– VGî_cÐØh Fµ»G¢Z:ˆðç1!ØuÅæ‰ŠlœÈ®e’ÊÜþàÜ€åõ¤ekÆ6«9œ{ŠN&`?ìÙÚr5uyËDšòoæä²/~rSNHÚ'š‚|5J0&tû†¯G5"m*ª%mŠˆ—gUUŠjìVüizñ%§1¨)|5/k g6s™+Õ¢™p¾†Y•Ô"N,®1sµ^Û UR¥‡a¢ú‰“ZØÍ†f”¦.ž‹ gÅ¿‰|åó_ƒ™HS’Ê­]£öÜ« ?ê°™Ù{Ä"WÑ?¸Øú¬F ÚoíM%ï~ÞT–·6¼±µ-w5¹æj°wVþ‡½Óïºv7à/d¬œû°XyÇ,`!g¯—o£:žh¨¥ý—fÎæy©&ª)êèö¨&ŒµÝÈe—.%$E W%•«þpURñ»®OÇ^NF#S°¸†õâ¶63§ÛF¥É¤¢Ž$• ýà[ŽIåâ¹¾xL8omˆ :'Öz{ÞN `w]jQ%mÊŒj7Šê'Rä\–T¦NÊeQ-\Õ·8öîð·èŹŒ­Ž]¦ \ú^Ý~Ö”H`z˜—¥©s-éî1a&X!ˆ¹ƒöÈ;A»1Øóö`yTã̼ºÍãý#Œý£ã@BºòÝrLØV8üÀÃæ´Ï¹wÇ>'/ ¶§æõÚ6ˆ {ÍB ¬U!©yOÿ•§±/Þ¼/ÎÒ »oï»9‘+ÍîÀÚ&DµèɨÆÖìöméöÉ¥í¿”KsÓ´úÎ ZÙšì5[ž¹&ûl·¯ËÑíc7‘Àí7#^.ªàåÕÏ[Ô*°™Ù<7lË¥/ý-éLžž›€µD`ëðr‘—ÝýÇ&ÜýžæÎJOsnšÇË_YlÚE6" [ÎÆFaËÙvÙc’ùF7À¹ËC÷¼6lùj½ ÚGãˆ1æðY¯wE„¨‰“¦þ¸Ý4 ævSÐÓØxÃ4µ7‰ÄÑ“΃ëÇÍε¾mä¾×IÔíóÿ1&ð²¾”È$ÑpL‹ÉDªÐ'ŒÌš9¢ŸêBnÙÓBvO°¢Å¬ˆ ÓñS°¸Æ"QÇ“cü¦û7äÒí#­ÔÌíþ¥0`K_yÓåk4ˆŸvØØØEv-ü©6û /í!oîúÑGÑßFå.7·µ™‚ ]ÿñɃüRâ¨T~Ôþühž&)F“'‰ˆèG" RsÓ Ð•??iðt™þL—‰¨-{ëìV„5~&ÒýDtµ÷ÚÝ«½¡xø‹Pœ¾¦oèkÔ*kŽ'bAÉQºI£¤¨#ÿ£¨nj#÷:þV8÷6¶'Á‚ÙÄóÛ «ÃrÁ”K-dâ‰Ýà—’D´ƒˆ‚´ƒxb¦ã‰¬Žjy"z…¼TÀ _f®´Ýî¡ ]°I¤jÊê«ÔN”Ë.ü>{ë^áE«£´Ç QÌL<˜ùûd¨Öqü?£š¢|·+ ¢í©=™¯) Ž'²{ö¿Rë%¢Wˆˆè =çY‘s{¢Ÿ!Àzá8Póºã@ªƒX™¨¬÷~Ï/{ï?ß½B­k§é³^ü/Ÿ•µBr÷ ¸{‰§bâ×û·Ã¹°Qé¹úâ#³ )ªMŒ©VǶ6sV¨Â Ùôb“õà³Ò'~Šô€h¾'“+!pùÊŸ—©‚~E©EºBŽÍœ'«ƒu%0–m³ËLÁ—jLA"z;ÿúlö„ñ’ÈÅñ‘¯¾ òMjz`æK‹Í<[Ç,®1ê¶"£j¨3TêÈH§Éhùjƒl n+2MÁb¶­òÍÅÀóÅ:ž§F"jÄÑ€å• h ûˆˆx™HSÔæÄ'ÖOœ¾2.÷Þ?±:ô"WJÄæbš±DµÖñƒÍ›Á“MTKDôòÏ­/òÕ:‘—ZŽ)µ°.KDÔž½NGcç«é[}#&#{)MžLJ“RÛÉ—¥6"Ф×o2¾ÛÓdlj{—šÚpD`åämYàw ÿ1=.·Ó[ókç&º!vÕÕì1ÈZ³º#êp£Û£ZmO{æ6L™8‘kà*õ¢TW·ÛÌÙ½;ºôâæÉX˜4yl\š”ÚŽÿ­Ôf c«5OÀòš³@M¿ò»®|—X;º,ŽHà6E‡å‚e5su÷>m÷¸é0Ñe""*§yè>ň#uÂóPOÌ„ÕÈX.¨U`}aC–"pî¬wó´,p8÷;œ©é¾ø=Å"îuÆdäc머aë°uT­¹K‡Zç>ràùš'XÀÆé5+æv³BD]Dš¢MiJî,âL¼2Þ¯D>ÀrA­€sž¯¼c°Ð@Œîuƈ#®”ÛL¹°‰Í3flf,€L©–šÂþ€Í.,ˆjwŽD5dè|–‹g}–¥$¡¨#³ŠŠ¬Ø~{5Ö{ÏÆ8jl4Ž"`a˜ `}Ñ! àÙ°0n¡¬ý‘ÈWëD¹°öa6X4„ `±X˜]–Ö‹¼- pYùÔÑÛT‡lذæ  Á0Àf–,È Œî ƒ —‘ŒFdÀ†…1 ‚Á€a~ÑüÏæó¿»ó³üï.%e€¥[t°`ß=/í;°»Òï?Þ¶ÏæîUîWÃû] «ŸÅ çØÊå' DEݾ.G·OS~R5…-W¥‡UéTY»þTYÀ¸ðãd&äW…ÜÒÔIMš"šUÓËcBü|Lhmh¹ØÚ0h½xnЊ¼بÖPË¿ëâ9¿kåÒ÷|þ¶w`³`SÐxØŒî| ø]Ϧs˜Ý *êõiE¾ßYÁÁ,£ÚÔɨ&nÝ󒸕ý•ËN›ä²Ü§ëì™9Û7¶fÐ~cKО¦‡RýDÝ{õâÖêÒéŒnïφ³ð5Ù¶<Í•žf¶Ž­s÷÷¶N–'«¤b½Θà8°ÿoØž³×lyîú,3¿c¾5ËÌmo3sãÛo޼¾ž:¯-o*y÷ó¦¿kø~WÈ}kWȽ)ëL€Ma‚ìÙ8kÐ\òîçÍ%õߪŸµnµg®éwù¯û]õo¿W?Ñ\òαæWûŸ»šKÒ\¢)Ú”¦°×l}wÿGî~¶fzý÷/º¢ZôdT{¶ý|¶= ±óqíûÛ?ÛÒ_‰vl[웲o½”ÔxÙPÍËG{ÛFööÅϵöÅÝýÞt÷Gß¿ ƒÛ>4ÞƒÞ•+dÒÔÉÿ–¦ZëÞëi­S\ÿQy`qìì²8ØÏ\SSfUM±yl7l¶¦ªz(„ÜýÇãîþÖº÷/¶Ö)F~Rxºöz\ m7³[‹¾&Û–™3·›9¶­¾ûgßï»/Mµë¥©…¿»_x–~úfþé¿™OìŸìùºûëÇëÞ­g{Î^³åù÷|ä'åA“±ñt“1wÍgc‹k ²\zÚ(—ž*ûÄtªÌÙsð-gOØýÝ®°ÛÌíè2sMÆw{š0%À†¥[zé[—mmf®éþ¹â¦û¬é»ìkß+û*©òlej;ø¹–¾øÐý/¿ºÏÝßbãîkÊð¦p[lÜÀ¾{J÷è½|þãÞËl}iòXDšäï¿t†¿Ï–°0AGóKG³wàsZZKÂ÷Üëë¬ôúœ¡ƒ:gÈátìp8YÓ}M™=—}»›o+™A¬wµÙ“ZVàƒmËÚûÐr ¼ù¶cZC°K›ç•Û6Oæ-ßÑÉc‘£“ærs»¹|å YÐ>º-hïužÝÝë$/yk½5{j½nñØ„[¤GDô(sýZïþݵÞìníÑà-¤­ôm¥ºH i&œ¨^¦¶Å®É‰:ž3·e÷ØnØ=1!Þè}½W™—¯ü9pyáoÍÒg7óó‘wòÙ­*R¹ä=»§×K"‰õãÖËîö+²›¾&¢¯3×wzkö8 ZóÙX– VGeèoV†Fíÿ¶eÔnq”_°8<¯zÙ»¨@6ªeë† òÕ:‘g¯-Ë‹C•¦‡U)s›g÷m›‡5ŸVÔ‘YEåDÎ̉ùÒd·m®†®¥Ÿ±³>öQíî‘Å·,XÊž‡Ýßï»E¾ú/Ók:œ{ŠÎBÒg7½÷ÏÜ{?÷/{w¾mí)Nokéõ›iEeaÖš€å¡ß5|ÝïR¥ÄHö÷}^Ò¹¡›÷›_½|íÎÕËìö›ý ·Ýz9ܶ”5ómks›U‰†\—. ¹X˜ÀÌ•þ“™‹&E}ñó'ú⬻r `£Z†`AúïþçÖ”KÛ9¹´ÖûÖÁZoØ}kWØíî?6‘¿á´\Ö®—ËXóõÞû_œé½ï8û¾w€=«_Í=OÓÖÛŽj?tF5Ÿõ‹3>+kMP?þαúqö®¢^»«¨Ý¾ÏÝ>6äáJ샪¼'„þkwÒÃ(¹®Ür~Y@‡}‹Ìål(¾g[s­a¹ÄÂ7lÉ õÒ¥A«Ý³û{»'wýÌ5‡\Ãׇ\,…å(3S'£Z·¯§®ÛÇZ°n,éí^ºäw±q%؇›¥²ØLVu€CÖŸõHo­û ÐZÕî~0×Fàég¼š¢E5Å ; 2[ð_¹õ<Æí·y^¾bóí#³ÁÔX¬eÄÊl«â†Í£¨#ÿ³´ôãÂq¡£ù´©£™…9¼]¿ñ°nG{??ÚˉEœÈÀ³[Ä•øFriû/åR6#Š/¸ýf$ÀËE¼\H žÆ3åžÆ ýÖ® õùÆ*ï cÍŸ Í϶æR2fÁbyOÿ•§qÐê;7he{Î^³å™k² ë’ÃÖìöméö±|^Ê>°2p´ÿ£‰£©ÞÕËWþ|õr­÷àÁZ/ë€ÀËüßñrÀ}:àjwެL™€çK·š“ËNå2­D=¦•ÑçDMÞ÷/6y‰h‘ªšBløÃÁò‹gË›Œï_l2¶69ÞÚ`()úÄPRª® qqÏʼnèÇÕÚsWÝ‘€«Ž Ô磋ŸøÈæÙ}ÄæáD®”‰èβnëš«N.kçä2¿ëâ1¿‹µªx¶ÔšŒïõ4M¥Å5¦RNÜbKwy`ÝL¥&ÎTÊ–X/eq‘y¹sÏÌ•>DH÷ÑÕÞkw¯ö†âá/Bqúš¾I÷±>Šþ6:ÏHz±È¦û謭ˆè'"ª mTADÿò¬kæÛVôÑ¢þF…ŒY/ý|[1·µ™‚ºòç'“6\¦?Óe"j›7åIŠÑ¤DÇI¢Ô¹¤6 .ýx¹{Eܽ¦û¦M÷õbQ»>UfØ( f÷¶]f7•Q9ëXD"•’ˆÊ`#ùEìÕX_ìUöö´œ5äÜ=2ØÜ™³Qû¢Qû õËKƒVïÀg{7Ó¤Œ¢áogDC¼2Þ¯,üSìi¼*©OÆGè½ßó÷½÷­Ž]W0TÞæYà 7Ö2² pl:ĤŽ$$òéxòÉ¥'¯-­á÷æ‘z_A¿¢ŠÔ"]!„ Ö Á;ðùÛ›©lN,€L@ ‚å?~üø12 ·ØI2GÆQäÀÚä³|qÆgI ê#S' §ˆˆ8‘ˆHSˆt<‘^ÔñDœÈ™‰ˆ¸RMáD¯)š2u’Ò̘¦iQ"¢äûÑl‚ˆhVÍþËÞåÄY•5…HSÒK´èÜvçÖLK¥àĤ2·Nö»Lf:¹)ü”‘rV ‰Ì5ÓûƉ³ó®ÏöVS2·’ýíæû¦Oo%ßkNL*:^Sô¢%J*DDz‘hî»ÿ¤>}(gÕ§¿õÓyȉ³‰œ%jn>-´oseãÉ·{êiŠŽO¿ÎÞ£Ù§öù©¼}’N:å…¿+“¹yΖkSÙ{²0N$âDMÑñO—«•’Þâü¹¿6š{ØOäÌfúŽÏ¶E”R”í…¬î/Âúͽç¹çÙÇhåö¤”ó­³¼{µPjK)±ëáúð›µzy²öψÁò ÿ2XŽnå[ôÅ+ÿÃéEöäR¥ïvù]…­‹–° eÁêå ZÀº„`dA°² XY,€,@ Ë2 ËÏ”K“MÆ·:œ¹ïr"Wʉ±WG~,7sÛ?4•ç?ö4â0ÀZc Õ9qâÖËC­¡¶áoºØ_Vb-Ž]fnmî9'n©àDOc[°Éˆã™X¹e¥Z.-´„°s!úèú}÷—÷üz¶úÿÙ>»ÒçE¾ô—òMa¾r8òÓ`ùò–Ò…SØÌ–;X`½vGQëÇ÷îùÜw÷9«uv¢ŽUEQí‡Oc‚¸õð'î~X›Ô3aí[{gÍë­ ìo·ÏwÎïê8k­[›û¬u½XëÝ»SáB&V3û[¯ÝµÕï)~~%$!%FÒ³ÕÿÏöÙ•>/ò¥¿”o ð|-s° ࿱%h·8JÛMASÐtØÌ|·nüõb‘÷»w5_,Ÿ}*pùÜûr){–¬¸øº2Ÿå²– žÆ¹6ö©Ø«7~5ÔÊÚ/¤öçòç/— !Û¿ZlIýø›¯ˆ[HÙÎw^,|6¥·¸¥‚•ç?NŸÝìoæ^-œ~îÞ~Ž/œ°°Bjæ\…×Õ›n¹œU‰ü®‘Ù ½^Û»Cpy„~ØýQÅ-Ky½ÿ£YO‰^ÜBú@îçûî·s­uÒT×Þ¾x¨óöëÑvaÔ!;Ýdtx—¤)E½µ+ìn ¼±o’ˆÞ¢§·Zgó¨uêˆzbßT•Ãr]§ ÝâØñ™™ ¾x{g$À‰ωÞÇZ-¯?qk!wä­¨FcôVjãe(°°&ãþݧ29º=ä&""_áåv.î5iªËÑ×팾k`Á/¹ôƒÛõŽú‰c¡ï~û/[뤲žÃ>«ÒycKÈíîm¼Uë•K?lk’¤©Ï¾T:^ß¿ôEÑ“Ý ÔLDÔ·u¸Z‘Cm_Ú<'ì/Ö¼ÞÚڦȕ¢üoVBh÷m‹#!©Á„1:öç±~ŸõzO¯åö•†[Ê*É}üðõ€°ó«O”ӄ颡,XqžnH¯ã¹×º}—>¿ê•Ü~+&lÿjq Mvõȧö5·œ‘¢!÷í·"eB‰í_-y²m´IR¶Žþchgì,Í‹Ÿ¹B%·ßŠjbÃîÛv\Ú¨ÆFÿa¾ÏR¶_ÛÚX-)¹ç… Ÿ°Àß|g“ŽiŠH‡I"ê$¢€ö4uÕ c·‡èµ­ŸHS ¥Ÿ­°süYrccãOÙ¸×BÉáÎn)ë6ú˜JIž'ŸQ3ÏS¶~¦®FÝ›n%´^»«¨žÆc;]¼g¬Ÿ†ÈéÝS,„ž‘Ù C{qVÕ|z"Òg}Š]ðUž¨¸a±ô&Û;Ý•DôMêM£V:[M2QCT‹žŒ ¹èß¹RÃØ– NÜw¹ª\µ6Ÿ6uûêÇ÷ÿ¥È;¦ºbB¤ñn0ªÑÙÿK¤)³ª¦œª;ßãsöÞ?½ÃÍdþ'^¹¿ß HS]ŽAk$pçHTC±&óÂÔ óÕ¼ Mük´ÔÙÿá9N M-¦Ü²Eš2«jßF_ŒžŒ¥.4þEa·ûÁ;j\'÷'šmk3ëõÆ¥B4äº>´µtÝ´u.ȋѓ…•XMѦPþ7«T×õ¯FíÔLD®!×õiE V\(ö„޾xú…>‘HÇUžxù+‹ÅqêÝÿºçJUÌ[¢¾ ¹o¿™`K"{ŸÆ­\³¨!÷í7#%™ËÍmƳn(Y°”~rß~3]Ãî©“QÍÔV|Ö Ó‹ó¶²—§I]àìXèl²8,Ìœ»÷j½6ÏÎÏÌWÊÝ7È\5‰ôâ⎫1 ;ÇŸ%76¶T×°Œp ÃÚ„Ú¾üÒ“•Ï…×ÌùJE¾ºšÞ ¿AÍÝŠ ‚ö[»"ƒ\ôKN´ôìì2sµ{wмÇuö®ßN*í"wþOÏ&ˆ„±CÇŽökÊÃ1MYx+޲j`MzgU-¤ôŒn¹=ž¶ÏšŸí†Å¡¨·*¬K‚‹}ÊÓ|¶eÈåéäÖ¾¥Ÿ}[¬”¾|)i.®lï£:%=[î.÷¼-—¶ºÚ§»íM'ßóØ ò[êÖt‡-,ä_JNnNÏ^3çʪ«;i@Àư‚S'¹®Ý ÚÙÓ3·íCSPQoí å °§Cá£wD“Ž¦Ç”Î7Ê´¢~·+ä–&ß÷Õ³Žéå·v…ÜîÞçj½Šzk×xª³{ò — 4Ù3¶Eö4USp aåÄÝÆÒíó·t¾*M²µØr›OCǧ—Ôïß-òŠ:º=äf©Eµ{ÑdfÏdÖÛ|Ô¾ÐÄ$•d4©°ΉOn^™9΋ÍS~a­ÎýQxÙÎw^,Œ­É‰\)÷ûÅa·ë•¡—¿ÊΓÂÓ_ú9…XlÍ<ßÑgÿŸ¿®FÀf [¹¤Yg„`½o§'Ü=xq$0DSô×_øSM%Ç&:š=Á“‡[ë"Ž+m}÷¹Gº/i àÝrS=é%®¨·vEÞÑß:ùÁ€~äÂ&²‘äw]ÿ1h¯—÷ïùÐÍÛI ØÅœ¥|g¹©7â¹²»;”f𦇥­R»¥[¡Š,„5¶Lš¿3 ]¿91éóÒTS°Ðr˽ƕr¯)s‡</óÕz1˜êŠ MSÇ=V"š¢xSÉÉÿîöõQ{ uœ™›ÄhKüvÂÓ\rÜÑa]xÙ%r_饀b {¯ìèV’Ê̘¦â;Ñ£(ÿ›NýøÞ"?h½rKQsßõY¯ÝµK_¿»)f·ìä"®P{—×áhçܽDÚ—š DOÆœtŸn¬ÕïXHÝ®´)MË=/^“ß#égΦŽÞs§|ÎHÝ—_v;5eöÏD¡òÈ¡O4—'ùλ|é/å‡Â~E‘«º9 Û/?~üøñãúÈÔIÃ)¢t,]SX4]/êx"NäÌDD\©¦p¢Ž×”¾xå8½È>€Â¥{Õú¿ñ˜_¬~¡~y°Ö ®†å¢Jßíò» [—µaY¸•_¾u ùláJ‰8QSØÂâ,å³°Z–·,!OÖ÷1X~á_Ëÿbmî³êÓßúé<äÄÙDÎuþy=óí›4ó¨=ý4en&Òì=zznÒ§òöI:é”þ^:>7Ÿç–kSÙ{²°ô§:þérµRÖÃ<Ãëe–]̼™sfõ¿ã³m¥e{!«û‹°~sïyîyö1 › Z@ ‚ÁÈ‚`dA°² XY,€,@ ‚ÁÈ‚`dÑ­D¢î^½9X‘¹ÄëKŒ8hʬªJ™Ë9QÇó²4in\&"¢Ô§$ºsD[‰}ëx½8{ߎö3í8 )Z4{ßÖw¿ñtv:­ò…3Žš23¶˜tËDzÒyÐ$wU;dæög°¼SPK*ŒDM%§MŽ éax1ÛX«t<‘ù§ØáùjÈ[å,N,²q"Ñl‚(.ÄÏÇ…ûöþ[QGþGQÃîïv…ÝÈ»g¬¸ñ«ì_1Çý»TIýÓ³ÿ²èx"§·fÓ+òÕ)òf®´ÝÌq"gæDMÑ¢šî}"È;‘€¢ÞØ’}Wf¯V3ž¥ìÑODDô«ùÖgõž«áÈ\ Ï·œ+nüJy@ôäŠ=SRIF“J\˜Ž QívÕÿÍôUÿ¨ýß¶ŒÚ7Ʊãeþïx¹Ö[³§Ökqìºbq˜¹mmfŽ-'ÒˆTIQ¥H`âHàª?pw190Xîû?ƒåfn{›™cK„±ªÿZ™{¢ù¶UM…mËé­ùµÓëpîÝépš‚Û>49QÇsbT»÷iTSÔëÓŠê³^ºä³ͪ«±çÏ’K«“Ûùò*.Üû4.\¿>}u<_^Í[W, &ÄÎDŽڞ·ÞªíY®ý_‘`@!x¹¸†—=§žF«ÃrÁêH½¢j ‘LD2Ñ DdæÌdæÌ^s»Ù[KoR- TE²pGþïx¹{ ko÷€¹×Ünî}òÖv IÖÓ ¤'YÈ@V²\°’%°ëˆ%Ðìn¤f}Ö=½¨7ëE3·Ìœ™Û®3sbcµQl 6Þz5Ø(—Ôä2M™Ó”õûY´Éظ·ÉH!" Ña"Sÿ‘ž^"=™ø—ÈÄ‹UF±Ñ;~ö#ï¸ÏúÅï}ÖìÔvt™9c°¸ÆÜçtìØç̼q]î=_žm˜ümòÄä>çëÅûœÔK£ÔKD(UÏ[i'Y‰ýµ7îÞeot÷·Ýt÷¯…=_ÍÜ.$¯ÌÜN2s®ºäª[®¼Z ¦FâIGüÊíóÒ·ÅêíÔ­/¥¯=Íg,žfVÏ»{Eܽ¬žgÇÝáÜ»Ãá ø¯Ý øŸ×ž¯~n’WÒ䱈4i no3 Ï«Ì3nžº¢gv4ÙC=D´¹[ˆ|qMݸÕÁW‹¼1È™Ó1!UÒ¢q!äžVŒŠ??h%šMü\üÒÔ—š‚¸¥½uÒâ(®BÜ€ÎÀ]Ž êH$0hý~·/ªÅÎG §c‹l¦ Èïþ¾uÒ6PúOBˆuNŒjÓÑ€Ï:2Ûí‹jñþìt:ßë,ÏXp¿©¤Ë‘î†àoiçæk|Òwÿx,p™ZȘjöÀÙóÑž°ÀúÁ:ä† šJO7•¨.õOª‹ˆþHDn"r‡iŒÂð_ù§€_.=Ý)—Ñ?¤S+¤©í³­ãìyû=gktÊ.þØÏ|ýDÝ?ÔO,výÌ5YC}‡sÿn‡ÓâØÑ•îv¡JÓê´n Úûâç÷Ås çn·©äÝÏ›JêÇ}T?nóTܰyRkÚG·íÍ¿·t4kŠ6¥)ùš5._¹¸Lô«tãÂdV†^ý¡2D"™ÓÏÖX܈:ñ?5½" Dè{ŠPÀMŸ}1Tà^ýD$ŒU‘0ƶÈ.ÊÙ³¾ÌfÀìB*ªMŒjÿõé€?à¿ò]z‹‹Íå*] {ºU7þö»uãì¶Š¿ÌWó—YwÖˆ7ìW…Ý,d†n›랣¦‡Õù®6öŸŽŸ¿ŽzçCgO­wÿîùêœÁò/Îd]g’ãÀþ¿[¾î61á^gLPêŸÔ¹éwéºújÉõé«%}RÏHŸd ÕÙîÙ}ÛîaõëJ–›ÚRjÅÜiŸóÍWö9-Žò/,vÏr†u‘`Ý ü®K—ü‹ˆ^„Ýcÿ;ìnv¿—ÙêÜ“Wnú¹cÁøáXPl©þRla‹5eV]Ïí)R%ǹ§Øá¤"`K­Ï ZGí7/¥;Yôñçþ²—KÛ9¹4}L÷‹|€®ÝÍ.Úë·#X!{^P^9ÏýeŸS¢vN¢…ó*ï—·®XNë,XÐd,m÷X[lö:b!‚ŒgKzzÌÜ>çj2Zµâpå@_üû7] ÉOÑÖºWïyô½/ðz‘BÔFO‡¼Dv:Úû·3^åTÙµ;õ1af,ž÷œ˜Ü¿Û; _Ø£IÎlc";˜¬‰ziêb´~‚õæZïUÀR°E"Š¥—°ŸÒ'a‚yEµ©ßEµú‰C|ö÷ÊaMëMã/Õ˜ÆSû@?tF—´þ‰Éc'&Y3H Ñm ev»Ð“‰ôTtRmP*Ï B½Ø¨Ö‹ 7ßõ4ž)÷4dÃŒA&™l$³åûèuÚG䟽KþSeŸ˜N•­D.±Ka=éSKØÅ" …Ü᪛M ¨7ŠuéM‘­Ž]_Y‚±òÁHó46ž d ÙÉFv2×mó™ëº}Ÿ×uûžW™g70réi£\ª_àŸ´ŽIíù Dô¤o—•Bî[!÷¨tsû(‚°@ÓY¹˜:ju°þ؃ãgÇ]Ôò¤5 (ý#7•þ•¨ö~4~´·¶ñÍòÚF≈§ ÕPeéÎP¶'5ƒŸ.‘IßÔÌ•þSú±%/;y¹¶ÎùëÚ:¶õ¤ò“šTúšÏYúšs?›eáÎTÈr,}[©à>G”º£HàöþH€ˆ.¥×am.¨…¾¤T „@Dýô×Ôÿ¼ö|õs»¼ ¹#‡BîÅæ•)¸­Íä‚E6.ÈÂâ+^Y¥Ù\u†êÀeiò¥š`…»×tXy Mš+¤É—j ;H•¡b§Ókul±ÙSOKbB2Õ¼¾È¡Ö¯/r¨©$ª= Ò§î›Õ!òÛ>l2.œ²¢NôY=Í7ŠšJ<Í7ŠŽöGµÄH:ös.ò–/êÇN'àÿ~¿Ï*—}y©©D.ûêVkCTûq8ª¥ÓÑ›õâ>çîÛ?—N¦Ö†.Ç|ÄÒÔÙ–¦’Ö†ÎÊú‰Ö†3–¦XWØS£Ì%a÷­—×Þ€…¦àK5¦ »àcÃw-<\ÓÂë³F†© b""b7Ò­ \km`­X[€tj¦Ã¦`“ñc?÷[ÆžÝå{—=¯c¯s›%3¬q#{7ß:ùí7¶íùrƒ5Å”&Ǥɫ—ýß\½ÜZ÷¾¯µ.sÍÂöêð'Ùë°¼’¦ÚõÒ{—å¡§¹Ëáɺ4gCL­\ÂUw$àªË ôÅ϶ôÅ3÷\.;c‘Ë‚ö[»‚d@8(Dàòð7Ëì‰eîß'¡Õe©£VÓ¨}t[öÀ~¹5ÿrÕŠ,Zï›»kSg:Ë V¤Ï²÷/6•ôÅû÷ÅY(séß‘µÝ`»>}µ{@ä«fDžF] -] Ki„¿v°1†2—Ä„é§ò0÷(ëŠÂ‰\)·‰:’W¬½Ìbóªïþço÷Ý÷·\<ëoaÁ6LcæoÜòZ7- ìþï²+Ê€?~Þë‹6τéêcÈu÷H·ÏÝk£îÔ:6OqÈ_¥»Gºó¦¬¨Ñ“C.MÓÞQ%¢Y•Ó†\‡ºîÞÊ'éXÆÃBˆ¦è»ŽÒ¹½È¥i3ê¤)DòŒ~è ¹{ߤޯt:ÛÚ„õSKGAß:&Lû£ —³|8&$„‡a5Àöyóœ~°1¤f:H aHD”fÆID´†ž£²KÕÈÖ»/E¶r ž^â…ÈVÖl8;X°ÿ‡“ßšlO꩎ê‰êÈG©§ý¬ÍÈÏíËO"¢¾ø¹Ö¾¸±ÙxØØ\«Õì©ÕœŽš¯œ©‘É9±èmN¤^â©7s»ìiRTšú]TZÞ(X‹DjK·€0·µƒFÕXdTY§‰ˆp廈 + ê§í´æ»‚µ&»ÎY[Rµúe"J=LÏq3g¹jÅÜtº}çZ»}O:\¢¬ÎP}=穯gå¾{eèÕ{•!²Ó6²Ëâé Y\ïƒ;²ym2µYç©l©ß»œy=æjïÔÌíæ6F¢±µŸ…ìùòæÕÂØîÞ6r÷rãܻܸÏzñ\öPšK±JÁ‚Akb¤©$!iŠ^œU91©°×DœØd|©¦ïþÂ)ð²Î`æ2;Ä„™pvÿÿ˜ ME473d½ÙÔOéxNL*?Qa§hLHŒD5ê¥s[ç̼L ôÝb†‹ˆ ÓÃQ-sx¹ÈÆËÔOË8ìÀzĚϱæâŒA.ª0È*M«kh?cB¼?&°KÌ¥¯Ÿzª–q9û¤Gqæå™ìOƒÆÃÆ m¥¤¼7!÷­—Cn’fÿDRÐ~£4h§”¤™ë°éš4…h¹/XÙE°K9B.Åæ©øW›‡,Xà€Ýg5¼'¢ôÓþnßç´ø®ÇË_YÞòÎW½åúq½Y?NãD4Nó/¬µ2vÿfØ-Ðî']JÙÓÔ}ä }©%‰Ë‰?'.³  £°‘&Pcll pâçc)¤Ò¼ïN/¦ŽZM™¯6ÈTNßPù“ºâ©Ù–«VÌM'h¿Q´ò-t2oÙ3áúñw>ªoñM¢ÈW‘Ès¥'5®ÔMÇh}OüÂnw_xòïÔ-1ÑŸæÖIÝèþ”óYusÓË“Wó¤ã‰ÌܶÍ\“±ñt“1{(Í·ß­÷ÑÅsË×ßn•º!$$¢˜ J³jTKH³jTc¯cQl öÞ×ñËÓTFÇ?=^wnT `3bÏQ3—Ø<¶'Ãò-a£äÕbgx¾·—l°ŽæO…Žæú‰CÿX?±ïÀ›»÷´~yiКû½X{‡Ånåhï‘kG{3s†5]–¦Njé. +ù-Ÿ¥t±q°S}zó`ÝIØÀ¬ãêŠÍ€ pÈÚ×äþ]¿£ÊÐîÛ•¡Ì%‘ÀÄ¡È25Öæœ8ìH ¹†ÿ8”5ò ¡®÷R:_þ©îo©öSÒÃpBÚlAÏBòÊ,®1=C^ͪéñ›ä²Ó&¹,{+†jƒül¿ªùü­ª4›È¾¬4‹lÙ½žLA®4{¶Ì„”ŒÆ„ä"Ç µ:^ªÉnBԑ袛ú[ÆÆì=Œ ꟢è2@ìÙiæ’úñwŽÕ§Ç´Ÿ{šÔ{ÿìû½YíÑXÝÌ%¹?Ãkë>sÉÑþãGû3ûÉçû»–fïýþ{ïƒÛ>4Γç¬ÝA_ü\K_<û¨%£IåÙšæf*ưË&6Ê:í|¹¾Ýr•®¸?šKÞû¼¹„…3<Í•žæ!—ÿú+ªýЙ½Ï©9&Ö!VW³çœ™ËYiÏ\²\µâ“®LO,Ü%êÙ´Ö}h­[øÜdÓàe.ٷʹ!~‹cוì;«c׫#ûSËYo¤¼Ê]’›WMÆÃ§òXÄæøÈ\²”_Õ|ÖM° äVÿ”}Yép»êÌ\‘Íæ1sE6‹£Ö»£ëhoæ:a÷ôð|S³d2s†j‹ÃÜb3svÏö6‘wzË/d¼´Oü¹IÌœ±Ñâ0‹kÌ\eÈrÁátz«f§£¨ï,~€“ôp5™ÅkG—Ýc ÕÆ A6Tók®±%ÀÂü®+ßù]Q-úä• ÓÕwÿlKß}Ö@M2Çœ7ßín2–_ø—Ár«cgWöåHî@AG{EŽö²ôrƒ ÏKÀåVö¯€«î½WÅaùÂâH?¯ÖˆŒAc£1èpîÝépz;+=Ë»'¹¿,vÏîïív‰Ÿjâ[0vDË/œ,g£šW†þöae(óíýp4û7šMj¸˜½š{f¥J3cÙG<= §ŽÏ˜kcYr`¹J×PË—_µ°’̾K$pûÍH€ ¹O#1w¬}llv¼cgzÝø;Õ÷Ý?û~ßýÌWÙ€£ö›Û³‡<\®Z1à¿v';vcŸýkR~Áâpztz‡Züß µ,öû²Ž¿/ïhduk5ÀÒg)íý0˜]×eИ‰}–ýµ8^~êÖ1w¥©Â¶õòWù·•;áe“ñšŒ,tÂ>ÕZ÷nOö½On=ŸÊ“œ<ó=*X®\Z®t ÙóBòªÉønOv 7¯XGOc竞FöYVÒØ ÅlnÌõsϯ¥[7ŽÚ§ý~—ÕXÜfn‹Íî1õf3ç Z¨{ }Óz2_÷Ãðx@ñÝ{³¯aá”]u»ow4‘ŽÊÉH·i’d2§û:Ž~¹•æ;ÓþŸIÇÝûzqG#•Q9Õ‘Ž&‰2Óù¡3äVÊ—ü D¤.滇ÝwŒÚÚEéKwï[S…#UÍ9é#¬'³*ÑÑþcGû;Ïœìh4sæv3ÇFºvÛȤr¥rºOD÷ÉHDFéÍÓ¸Ž]†ÖÓ[TŸZÂn_ÙDtIî'5ÉÑ…çýý®á?ú]–Éò˜%5IûÖÒäq’&©œ>N÷ì¥Fú˜WnOØ%Ef_ÇÔ€ˆÓ8 Tµ¨_6*ëŸê‡_Nôä:‰(5Ú9kŠßÝ𙣻áÙöJvs…¯9¢IDATQ¯O+jj ÄÔš©™½"J*?ý˜TH$žÄ¥çÀr•®ô(ÉHtìÉñe¹ÔK”刵eðNõhÞ)²Ó?fF€5ŠÍžu¦×QeŒÎÅn•=eíš§,wÛåªÓ鼜´L²XØØònj#7eýš¤Ïµ%v‡Ès$ó,î%sú\f-†º}Ÿ¿=ßÈ,ÝŸí}r3úou['/ï¶X­rïÿM(5- uÐïi¾ÛY×°@õ›†¥äóråÒjæöòæk«"4î.S%MÉè ®¹;ߨù˜à)éºè)!‰†—o èu,`¼¾©“®‘ç;ëÆížâ‘O |HDDª¤EãBÈ­Ž(ª¢Þ{s°šg?× CQï´ZÆÃ"Ï2Ô”Ù„*íS¿ øýÍ‘¢Á~"šþ¹}»ê¿½Ðj÷”¶Ï¥£EUIQ'üæÑ?>ã˜Æ}ñ+ßyš~mWÂ(„Ê/!NäÌéž<ÀúÅf×S#_ONïþJ§—ݼ™¹Òv3—7{6‘nªv‡«ÂîT†1z3=þ0kâι¸[œ‹¥Àó‹î‰úúÏŽöõwÓg Ì&°šN•}b:U¦„F~PBìrÓâ(ÿÂâH?ÐÒO³#»D©‰ ÇèîòͦèKÔ=ô%ê„På=!”nÐ8›H"úÇÂRkmøðfkƒÈW=yÖ´Ò46ÙNš¢E5…5Ëd—Pþ’+ý%¹C^¾Wݾs-Ý>ªÓ]¢:6eÛ–*©#ªÔ]ö¹©»L.=IÙO]žm[ËUºXG !TõPY;>›ïˆ³KF_É¥Ï}%›³ù.¬Gé®:ìÜ™Ž , ÈÎw˜ãD¢üý¨—«Vëg|Ö¨6õ»¨¶pšNoͯ^–¦)¸íCSu<'Fµ{ŸF5E½>­¨>ë¥K>+Ѭº´tü®K—ü®…ÓÉ%—¶ÿR.ùjÈg.ƪþK[‰|F°Ö v+¾Ï騱ÏIq$R;‰ì]=½DzÚç|ö9ÅûUQñ¾«¡Íæjˆ¾3ÈMíÄäo“'&÷9_/Þç¤^¥^"º@D2ÉVÚIVbí»wÙÝým7ÝýKIGpïÞ%¸]JÛM—RÈ÷e±·zTì]Í|F7Xg’ÊOjRé‹_8Óo*y÷ó¦’Ö†o¶6Œ"‡ÆSA½¨7ëÅÖº÷zZërS°y^¹mó¤n(&ü8Žö4q´Ÿ¥Õ~èL·JB»o !‡sï‡s1é|p-;»g÷m»'7\Gù‹£µî}ß|û¿Ò,€uC•fªäjh¹èj苟kí‹G‡"°û»]a÷©²3–Se™ë³[îÜtÎ=ÅÙ·ëƒÖ‹ç­£ö›ÛGía÷XUØÝ?×ÒÏ\Gä÷gwøÙtþwaédâÄ¢ N”KÛ9¹”…<­_^´®f>#XëF·ï3G·rßM*Z4YPó~6ÞAæ’Hàöþì43Û)0¹¡‡åJ'“4y<&Mš‚¦Ã¦`Ð>º=h´~qÁ€gÀ: d.ÉVàåâ^Î\¦‡cBæ’¸0=ÏZb·Ø 2'r¥œ¸¼é0NïÁƒN¯ÈW͈<ëÎ MµsÒÔêç$‚°î±›ö&ãáÓMÆÌåùðs"gξQ'šM<½V¾9 tür§cq¼üUz„6"ƒ4uR“¦4efLSV??1¬cìù¼§ñ´ÑÓhpª ©æýŠ:2«¨£öÛ2jŸïsì–þ…ÌtØmÿŸæÖIÝÌÿ”óYu¹Ó‘KOjr©^|׋Aû­]A»)hºk šxS±‰çù"Ïç~‡Ì±ØÔŒË•«hYëÐÓØùª§1sì€ûöþ[.;m’Ëò}v¾®|µ!«C1X\c f.IHà IS´©ôÓþåJ‡PÀ^³Îréɤ\Êþº{ÛFÝóL˜¹Îòæ-‚°Î°NÞ®½Þ»g×»‡-gÏäÝým7Ýý™·â¹¢ÚÔÉôt†ŒÅ±ëÊÓƒ=xaT»{$ûSË•ÎZƒn°nØ<ÿjóH“'5iÒäx©Æ”º ga‚n_O]·ÏDÆ„‰ˆ#ößQmêwé[tEùEù*J7ão2¾óQ“1ú¡3Ò”YUSZ'ß´NRSê™À}:àÏLóçÒÑ¢šÒ:ùnüçÒƪþKË÷­y™ÿ;^\¾r+p¹ðO-‚°nx;+=¬oærÖt_(?ÿ±Pžï³ÂX¥o­Yÿ{ÿoBn»ÇvÃî1ȆjƒÜA¿§Žy>r‡«Bî@õ›†ÌåË•ÎZƒ`¬¹a‚¥p÷›p÷×Çß>^ùjȃÆÃéñâBü|\`%ö_<7ØŸo^ƒÂÓšºxnh*ÿük‚°n,oÃ{6®A?ÑG}ñóÔ§­ô´5=AÆ-}<õß"Óy§°ÿG•Ô?©’@U$¬R>c€CÈ‚`dA°² XY,€,@ ‚ÁÈ‚`dA°² XY,€,@–_<~üøñãÇõ‘©“†SDDœHD¤)D:žH/êx"NäÌDD\©¦p¢Ž×M™:ɉ ifLSˆ´(‘ÏÚ) ;žOc[ÐÓèî¯üwÿRÒ,¿ð/ƒåº•Ø9$€õkÙ‚uãïûˆ‚J’ÜýD³ "¢Y5û¯¦qâ¬Ê‰šB¤)é%Zt®EÃÜši©œ˜TæÖÉ~—ÉL'7…Ÿ2RÎJ!‘¹fzß8qvÞõÙÞjJæV²¿Ý|ßôé­ä{͉IEÇkŠ^Ô¢DI…ˆH/Í}÷ŸÔ§ó~V}ú[?‡œ8›ÈY¢ææÓBû6×êäÉ·{êiŠŽO¿ÎÞ£Ù§öù©¼}’N:å…¿kí’›çl¹6•½' ãD"NÔÿt¹Z)é-Οûk¤Z(0÷°ŸÈ™ÍôŸm‹(¥(Û YÝ_„õ›{ÏsϳÑÊíI!)ç[gy÷j¡Ô–Rb×Ãõà7kõòd½œ³² XY,€,@ ‚ÁÈ‚`dA°² XY,€,@ ‚ÁÈ‚`dA°² XY,€,@ ‚ÁÈ‚`dA°² XY,€,@ ‚ÁÈ‚`dA°² XY,€,@ ‚ÁÈ‚`dA°² XY,€,@ ‚ÁÈ‚`dA°² XY,€,@ ‚ÁÈ‚`dA°² XY,Xré—_Æ^•K}ÿgòÑr­9ßg}ÿgòKa3çJÎZÈ[Áõ[–Öfù\L Ï¿&\lnÿÜ·¾ð/ý<’&¿ü2úhéåÓæ©þK§÷ÄdÏ߇ÚXîµÖþ««—7óyº2û¹Ö¯7`uè°:­§õšBF*Anl®ãÞT¢)dÔ–tÜk½‡O{ÉË™õâ«kokƒ*Mÿ>:ED‡ËË - –•^tzß÷yØ“¢£½]¿ Vƒ¥ÿdq¾&'UðrÝøGãƒår©ïÿÄ^=ÚÛùê·ˆt½¸™òÿ;^n2þ69ÔÂò¡µîLù·äÒ ÿ{5û‰‡ŽçD§÷ÝnOã‰ÉþÇ¿N¯ßþË«—yyÛ‡f.s›™ÏvDþàÁ£½lë'&Ͼ?þµÅñÊm‡s=æØSybЋé%…æ1¸£Ëæi2¶ÿr¨…¥Ïr‰=»ãeãa3—+Ï“È×üúh/Ë öíNLö<ù¨Éøql°<}N}콟þ^þeò[ÂÞ}¶²±Ë‘ͳ§¸nœíCîžžË[>ÙûõãÇãƒåMÆc‘Þû™y˜[¢žÔ„‘µ].œÛù¾ÝÂçÑ\¹Š½šþ-ø¹œ_ÛêÇÇûîg÷ÅžAéüáÌé£_ë=r­{ ªM »Ÿ¥T¯®Â¸ÓûA }Y¯þàp®Üo\öõÆ…É–òë°¾Ê$Á€eÕ&Þ ÚƒöëÓ}qƒll4sûœ§åÒÂ×tzŸ–K­ŽÝß‹|È=º}Èðy©£™h6±ÙòÁÓhæv]B,Õ½£97§÷ݹÔîÙóRý¸¢_ïö]õ_<'M™‚å_Ø=õã->ïÀ|û¨3èE‘?xÐÝË.@õ"_mÎÆSóíçÚÏ1öÌ6½Öl"ý·ðüi2‹ôÝ7så_¡!׿—¦­]WCLøáÓHÀ ׃ù¶ò¼JšÃyø”\*òo¿çîU¥‡c µËÑT¢¨ÏIS¼üR™szßíñ4Z•÷ö9ƒökwûâì/[ÂÞ]ZÙX;eIgЋµÞw{:Ù>¤÷äÐGé=Y|n,OùÌ·ÇùË-« m7ÖnM˜/·çŽ{¾oWøy |·ëªŸ£Bòs}úù3há{¶R½š ?âQ-\¥¨ƒÖÎÊæv6­Üo\á×…ü:l¬2 D,³¤vüÏðñûSel™™ÛÑeó¾¦Õ±ûIÔßï:×âînnøÙ§6S>Ønˆ|!ù`÷Tþàô²×ûœï“&÷9ß9–¾2KÛížùör6A$—½×cëô4· cl©Aæ«WÿÔräX$0ö¿5sM¶¤ðüÑ”™°–Ê[!´§¸ÉhqìúJäcÂÝ#‘@L¸{$ìη•çUÖlžª™ô·´~ZÙTÂÊɨýú´ÏÚÑÜvSË,KÿÅs§ÊØ_¶$óÝg-k§,ýüž,>7–§|æÛã|%j=Ô„?ŸÛù¾]¡çÑ\~Σ…ós}zöœ|öR½ºsÄÿm‹ßÅÞÕõOª´r¿qÙgÙùãùϲB~6V™„ÿ{÷ÚÖ™ç{ü;¬àϸ —,#wS°M»ØÞ)ØbºŒÅfÙœ’åFÙ"7e#7…Øn—Æn Ž’eÝ,ÓU²4QRhmÛØ¤± ӯɲ4›ãe³Èåf-V˜ËN¬½ ÑæŽD‹ïUë±cW±ã_ñû£zŽŽžó<=ÒÉùêèH„kÀ’1* u ßDrö£­érOßëŒ;k¤@°T9¨Ï7ŠÍ¡7ý®èÉÙë—Lý÷‹™kg-Dzÿ=ýcDzÿ]D*¤am'¶Ø|zÓÇÊÝ>ïÖë-žr«bÄ®‰¼Øaº½æ–î¦ ¯oóÛ½]rH¶­¢9YbºÜS9DfŒkQun¬ž¹´´=YÚù©[ ï„Ë÷¼/>ÏÕm5¾¯F{Wì«l-î°xœYU‰©¾ ¨N¡WËFc×_PuúâÖL9É×óz`÷Ãcê;±këš/W™ˆ?°ë¹sH„¦[nHl}®Åc˜îÍåqOüÙŽ óÍ?uy˯ᤲ–JI}ßµø|šF&û«3á»Ò¾¸÷ò×]–ýé§Ñ©¯~fi}Yd®­¬Tr‰ÐµÒÁö|ÿßî½£úSÝüGÁQu‹ÑØÈ¦ü'xj.™î]o˧7}ïz°4çüœËÌõ$¼Î=ºb_GÓyî>øhy®/kç5¾wÎ¥ÛÇ鯲ùö³²wÀ“ƒ3 à1ó‚o„ÇÊ"ž=•)gäeËl?³5<^üšF»{sY_‹§c¸¿ÚÙº§=˜Šù¥e‹‘û¸ÕÁóúÉ¡itßåž;¾øöwÚý©ø×gã^™ºˆR.3u’äÕ)ÊNàþvºÞhòGkGëë¶Ýɺ72c)_rwÜ-"µOzbê^˾øÛ®Ó½]Ú¬¦Ñ½©N ÇÞüUíß“O&üí`Ê1îï)u'Ë"pd+Ôwh/Õ~’ŒT‰È¿Ê‡lE¾ª/nƒí§ÛB}¶ÛÞ9ÑSÝÔרÙÙ·£÷ŽŒæŽe+Rέ}#¡Áôé†Ð3“nôù·>×â·ˆÈhlxã¥A5ÖÏ{ÔÔx1Ç5?ç2{FEÛ¥_zz­¿Îùª”/¤êÇżŽ–çz³°Y½zfB1£[Š}Üùö3‡BEý{£ø½³ñIò£ÉÉÉÉÉɦ丑²£""ê'ÇR'¥”˜.·ˆa•""F…c¦ËíXŽ5~Ä03áû7KÄI‰ˆdÇÕãDò§ŒªS¤¦oÕ½†™³ Ó±D+¿ÄIMowzͼ©2†™µ¦×ÑïU ۙ݃‚–µ2…kæûf˜¹‡®¯zëX…[ÑG÷°‘ÎÜÊ\fÖr¹«ÄtRùï •˜"Óc`Ï|söÌQÏÌÐ0s™YKìÙ9Í×·é¹ñýèfŒÈ±¦N¶ çÑìvfn}º|ËóKÍÉÙ™«åθޓù¦ˆa:–Ë=s^-•üžþêPlzô“d–‡ú5u±´òø³5~u¹¦”óåö¸·7ýO%Ý«5Uf)s{>Ë»GX»é­dÏõçhéz2³åüuòs™¬þ]ÕçÞúãíÕ|­-fÆ®…ÿ€}Öòe²ú_ýÕgßë¯æÌX”•ýÑ¸ðø«¯–ñÄçpQ•£/ˆOÄ-;¥G-T¿’°Ôù/]«á矌ٸV’d.=soyÓžï§IWÏûQ‰‰È¤BDÖés=¼N×ÊœDñ(À¢°k\‰ž„O?˜9$¹¼ pfÁjžoÅŒq­>ƒ*1Î,X ïTœY€™¸À!ÐP,Š@C±h( Å ¡X4 €†bÐP,Š@C±h(‹¬W;w’€•ãXêà9zòÓ Éõ&ÚÜ6‡ú~ê#µ‹b€uMíÌÈ(D±Àºõé§"¡¾OåI«y»Ü""9ûI~î–Œ Ûâzx.˜Û g˜"†¹\Ÿ¸®ÝôV²çús´t=)¦å¹Öy¼½š¯µÅÌØåíXoïX*\³h( Å ¡X4 €†bÐP,Š@C±h( Å ¡X4 €†bÐP,Š@C±°æäl2ðäà= ÀjD±x““““‰Žž;}ÿpxŒ4O%©R]™—ÉŽ‰ˆ ÿ‰ˆÈõ?9öSf‰‘‰‘‰ÄH +b–UöêD_¢£ëÜÿsq~Ù«ÙT¢£çN÷.Ú±¦^cÓ·7w‹ˆÜØ$"’|]Ddä/ED6Dò;õÝHŒÄHŒÄHŒÄHŒÄH +ÁEXNíM“‘ªTíÍÓ©A±åÙ…·³ïr¤*ºy:5HªX Ô.\í¼µ W§ž¾»Ü""žféÙsTDäÌa#1#1#1#1ÃráÌ,«ÞôÇ'ÛãÞágGB‹kçôÞÁöaïµÒŵ,µ#ÿnDD¤á÷"ùyÅ/EDšÿyzÍïL/Q;õç? 1#1#1#1#1,/вˆ{³;Òuî]ãðXêïÞËþòoâuñºË¿;¿·Å³ë@ç\mñì>èŒ× =8¿7{õÖÛñºÌ¡äî«÷bŸ}òQ繦Ñ;ýÂõçÿÂädf(ÑÑ{§{×ᱦÑÝýxݵÒþêìÕŒ¯Kt\ÿYu¾ù¾†Ð|k Ð9ú¿“¯ß;9ùà^¼.s(c]½wõžõ ó\pt÷½W ÓâÙsÔHtŒüEµÚÊØRÿëÒgÁÑ]oÌÝ~[ðíXq}«ñWŸ­4Ô7ö÷÷ ŽÎn-ÑqýÏú«Õíì{ýÃD‹GµàŽlØáŽèiO_ @­9ö‡[íç÷NNfÇÅŒ¥j»ýÕgß‹Tdÿí»D¼.ûoÙ±x]¼îÚOzîx£/ü¦Ö¿˜ö;wšîÕ}]õíAµ#/¤jüó_Ôªð^õ Àz@b$Fb$Fb$Fb$†•G±`]3ÌÒzüzï“zï:·lØ诽pe°=œ:QÓ90á»ý~ʉ¶¼k„ÇÂcñOácÃc“mÁHÅ¡‰POÜ{í©¸7ÔûnI´5Rõ«à@í„ïÛ v¸Åœ§Ð0—`r×›‘Š#Ù¶ eåâÞö¦Ž/¢­áñwKzÓó?6Rqì§mÁhóñêPe_¹›l´õxÍ@mÚ—î³ÃíÁ½Þ«BM£»Þ؈6¯Þß¼|+î õ¼Ù9 ’Ë8VÍÀG‘ u¨?»o‘ŠãÕíÁbú–ŒÝ|=娇ïf¾DÃ7Þhakž¸g;Ròç_ÕøÕ­ZR¸Ž/Ñp»ÆŸ¼tswʱÃw/ØáÙci)ß} ±3ÔÓŽÔ~ú©e‡z¥£­ó¥¸ÙeTf¢cøOzï:wl1Ý]¿ ö׆úÞŒ¶&B_nOÆ*ç>ôÄö,˜îÍ®úèù¶‰T ¶]¸bÙ­Ï4ÿóѪÕ÷:Þ("òÍû"úîyêA÷|-¼wÃŽõòÎDb$Fb$Fb$Fb$†•Ç5 ÖµPOó±OeïÆîJã¥W‚o6=“lJȸœ.éûÕ€t;æ9<¶?ùÖ'-ý'?u'åöûi_[pϱ¦Qu0ê;âœlu,×qÈm1L¹,â<--ψˆý(½®ÿbc"äeûŸ‡ºËqì9$2øÃomÁ·/7Æ/÷¶wïûד­"ò¯"20cÅg“[2öÕö”c>½å[^±Çíÿr,iŸ Xöµ/Gü‰ý×¥¿Z}â}´êŸ^Ï8ö÷,¤o–}í©‘:ì‘©o™‰l l}ΗHW¤û&‚îˆ{sYdÛkÛn¶öÊé3ùË8x£/~Yã¿4xñ©¸WDDºgedÿMɘùô–?n¹‘‹Ë'–=tmî±cÏ;ÃM£•%Ïy*ë^zÅtµ¼fÙCÿ=¿ ¨QwŒJÃl‘=›!ÿúhÝT—êK»ÎY™¡\"ÔØýê«¡×ÖÂkNíÔ¨³D>œ^òN\DÄuQDdü Öùx½¿K‘‰‘‰‘‰‘‰aepfÁºèܲÁtìÿj{2¦>é½NçÀÇÇjÕßþÀ– ¦[ým‡ï^È„ý[Ÿ7Ý‘Š#Îþ_âů꣆9-ó‡ÆníK9Žå¤ëQ;á»{!tmÿ¹éŽ6ŸúÅþž†Ä_|W5L£âñå–}ùòhÌÛÿ®÷PÔߕƳúgæ ë›eå!ϰ§¹<î‰o|'î€ú¬þ|û…+–­ j‰ºWe eÙC¹¹¯ì°°±£±óÕ¦[#¾/,R¥QñKO<öÙå[=w’±›»SζW^þóPßZø…êÂRWͬ´ZR¸ÎóN/)laý 1#1#1#1ÃJ¢X°®U–l|§<žrRGò‡…³%c·öM4nì(Ÿ:hly¦ã‹ðx*;~$å´5½ÑÝ4z5óë_÷Þ™øÅ­·ãu½w>Ø©pGÜ› s9GÔúÌîƒù^íï}g¸i4^­´÷NæPƊשoλ#î¿Zš^9–3>}È=³hÒts!}³ì¡Ü°:/@ò_Fp¹EL÷– ¾Ä`û…‹{UÉÀ߸eƒ7j˜¥u†©Î)È·p­têÌ‚Ç6–b¨//$cÉÝsÏ®â•Ç7ì(‹\½wåÛ®sîHi}‰i>½õO[žÑû¹:ýö…é gï’ç:_F-)\n­—w&#1#1#1#1¬<ŠX ¸÷úÏFBÞS›]ÝÞ“¦«±»µü`2<®¾èÚ±Åè¯þ`k´yy{õŸO„ª~\s®±»v[ÍÇÝ­åÍÇÂãê³÷`r÷A ¿zà£åí•2ìýϧFBµó|gÓÍâû–Œ}õrʱÛC™°/Ñp»>êlÙÐP»UJˆ ^¼nÙ""†élÙàKø ·½ÑTvüÈ„/íûæý‡]­`©/¹Ü†ù¸*ÖþÆí/šnW™a/•Öfxì`R¿ŽÆjuè¿DDÒ}ÓKÔµˆ”ˆ¾›/ü[­Sø¨õóãF$Fb$Fb$Fb$FbXy\³`]Ke¿yÂWi<Ÿª´DäÕ‡­SãþƒJCDv‹¤œoNMøDdÆÛJʹµ/å$kSŸ¦û»?±crÉ<{¼óœY¶é;ý²|ËI] 0)7%5ØÛ}FbrÉŒý®óœú~e“ԾŽ×JGB¾HÃ횈26IL•Dr¶ÜP_"°ö^{*q®±sÇsГð ¸ýÃÞkgVî§%Ó é3>O|c‡Û+OËßË¢®)0²ÿ·?KÆ|76ý¿¦S½w>*TìOH¶’±[ݽéÓmƒíká5wwPD䣷DDÞü•ˆ¨ëV<ıŸNÿ}kŸÈì×Ýú@b$Fb$Fb$Fb$†•Á™ëÚ`ûPβëOV\ã÷%ê¯Õ?ä0µ=¸çXþóÛØà•»êl‘Þ;§"†iTÎ}JºÁÊ.ë)â½wξ©P§âÏÝ«»Ö+uÚüìßx\Ô Ö7˾VšÕGë®Õú;·¿˜¿Zþl^¸bÙþÀöÞè‹_ÕøÕå'—.íùS×JP£Ùë¨+5ÔæKQ?H][Á±œq‘¦›Íÿ®ÿÏÒD¨g¢{WxÌtoÙP¿Â ¢>PÔN]í°çºU’¯‹¬×ª?‰‘‰‘‰‘‰‘Vg¬kÑÖöö¦Ù-§üó{?z«+Ò›þät0å¤û2aàßøæáÍ._¢«ÿôÞþÚ”sûý´O=V}ÑÀ<¼i°!Ü_{ÁlOÓÇ2a_âgkýfÙf—/8q¸+$­Ò°\#R'ó› [64„û›?N¶§œÛ§Ô üµ~ãÖç}‰°÷ÐS]!™õ{£—’»Ïïí8“<l•f9^²¾ííoþøÄàhñ}S4^2* Óó’gOy,¯ñäÊ㪌ò¨íÛa{ȱ^Šl}·-’è¸n÷G¬{W¾í´êã/îiº™ö¥Ï¬Ä•ʼnZÞƒHŒÄHŒÄH $FbX­~499999Ù”?RvTDD íXêb%¦Ë-b˜F¥ˆˆQáX†ér;–c1ÌLøþ ÇÊ_H#;®'"’ˈä/¤1}«î5Ìœm˜Ž%âXù%Njz»ÓkæMµ1̬5½Ž~¯RØÎì´¬µ)\3ß7ÃÌ=t}Õ[Ç*ÜŠ>º‡tæVæúÛ0³–ËíX%¦“Q'¤—˜"Óc`Ï|söÌQÏÌÐ0s™YKìÙ9Í×·é¹ñýèfŒÈ±¦/ ¢÷hæ%îfdû};ù–ç—š“³3WËq½'ó3LÃt,—{æ¼Z*ù-><ýÕ¡Øôè'ɬ§1.l‹ÌRæö|–w°vÓ[ÉžëÏÑÒõ¤˜–çZçñöj¾Ö3c׿À>kù2Yý¯ˆþê³ïõWsÍ ¡X4 €†bÐP,Š@C±h( Å ¡X4 €†bÐP,Š@C±h( Å ¡X4 €†bÐP,Š@C±h( Å ¡X4 €†bÐP,Š@C±h( Å ¡X4 €†bÐP,Š@C±h( Å ¡X4 €†bÐP,Š@C±h( Å ¡X4 €†bÐP,Š@C±h( Å ¡X4 €†bÐP,Š@C±h( Å ¡X4 €†bÐP,Š@C±h( Å ¡X4 €†bÐP,Š@C±h( Å ¡X4 €†bÐP,Š@C±h( Å ¡X4 €†bÐP,Š@C±h( Å ùÑääääädSrüHÙQÃq,—[¤Ät¹E Ó¨1*Ë0]nÇr¬ñ#†™ ß¿áX"NJd ö”8X ÑæŽx´9Ô×ðûPßbÚé¯>û^µk):Ç“ÀÚõØŠÁÑ·DâVVB}"¹ŒˆHÎÖoKDÄ0s¶a:–ˆcå—8©é3¦×Ì›j!c˜Ykzý^¥°Ù-<(hYk!S¸f¾o†™{èúª·ŽU¸}téÌ­Ìõ·af-—Û±JL'%’µDDJL‘é±?°gfŸ³gŽzf††™ËÌZbÏÎi¾¾MŸuòýèfŒÈ±\îüßzr3ú<#ÛïÛÉ·<ÿ¸ÔÙ.³3WËq½'ó3LÃt,—{æ¼Z*ù-><ýUò¶Pdzô“dÖÓ¶Ef)s{>Ë»GX»é­dÏõçhézRLËs­óx{5_k‹™±káß?`Ÿµ|™¬•W×,Š@C±h( Å ¡X4 €†bÐP,Š@C±h( Å ¡X4 ¬"ñºk?‰×õWŸ}¯¿úQï]LËwÍGmAÝGw½-¼·-øÖ@[p1£~\)-g”úhÝÔG ó)æQ†iTæá±˜8lÒ:ÃŒT¼û?"…Ÿ$«%êÞmVf¤âØO#Wï}þ¯Þë¹óÑ[=wÜ‘ ;Ü‘G]ódó‰ê“Í᱃Éð˜ZRøo¥Qùn¥Q̧¾Y+›ÊZåñò=åqÓ½ùL·éÞ²Át¦Ë½¸Q~*¾¿çÀèþ5–ó{ýëó{kü?ûM¿°åâGô¨}8¿wðóó{£Í§~m¾zÏzpõÞ\Ïi‹gÏÑO&leÂiß7§Ò¾âçŒ/±é;_"þn$îMŸnëM«[µDÝ»àÙ8Ï|PcQ «Ô:ÑæãÕÑfwÄýWîÈ\IV¿¬4ú«þ¥¿Z%£Ûy®ûo;ÏUÏ}Pi<®|ŠG±Àª£¥¬{W¾µîÞÎ^SÖšîÍ.ÓÝ_ûñ‰þZu«–ìïygxOáúê Î²‡þÛ²Û/þv°½Ö_s¶ÖßâÙ}@ÿ̹ø5 ©OæÕß¾‰3¾Â%sIûÒgÒ¾ÑXòõÑX sçÎ@gÓèÎM£j답ʳ±óå;KÌ’ÊS&Z<Í?øIû\#zÔ>(±Á‹×cƒáñCéð¸c9㎥÷³â—•FptçÎàèÉÖã5'[uæxâžfOÜß½`‡ —«%žø†ž¸þ,—ÖæìÛÙ-Ï?Ôxý-üÞôé½½éÞô™Ã½i_¢á¶/Ñ|ë“¶à\Ifi½a&B#›¡ðø'<Þ›þøDoÚ}á¢7º¿g_,Ÿäâó)Å«Nʹ}*å´<óÖ'-ÏÞÎ^³!ñ‹Û µþ@í'§jÕ­:S‡j…ëÛa{È[ö•»–­êÔòÍÇúgìůYhØûųÃ^õ·c9)Ç*\2?u¼:DT‡÷jÉâG­–›Oo}Þ|ºéæîƒM7ÕrwĽY?Ÿ¢ø=jëþˆc©ƒí¹2Ùßs0¹¿'6xùëØ`&|ÿFF;àŸ}öÇâY÷.ß²î;½æüóA³  1¡žŽáPO{pï@{P­Si<ÿA¥1÷ÜÈÙ"•Ƴ•F¤âH6RÑ|³;ÿXUJXþ|\¼ X}r¶H2öÕß%cÚâ:ù‰ÔÍ^Û0]e†)7E俣lÅå‘oE+—q¬Ç±æÂYöPβÛÂo´…'|ß¼?áK>sóõä3‹µ:4unÞ¿áÜLÉý)‘Ÿˆ”˜.w‰¹˜>/4ù‡S…¯¼pÑ+FC>—©“ðcŸ]ø<ö™O6‰oês~ÇÊÙŽ¥f‹¢Î ˜:l~Eþ^^QËÕ’´ïîý¤ý¹ŠPrC^—ÅÏÃïrþŒd†2ê;”iç’8Uθ3ç5 "ï‘ ·ß}Öíï8ÝÖ5zíÖåÔk]ç>ÜÚu®ð9*>ŸÅ£X` SŸÍªSß M ÝN¾åùÇ¥æäìÌÕrg\ïɽàE Ó±\î™ój©ä·øðôW‡bÓ£Ÿ$³žÆ¸°-2K™ÛóYÞ=ÂÚMo%{®?GKדbZžkÇÛ«ùZ[ÌŒ] ÿþû¬åËdõ¿"ÔogpC ¡X4 €†bÐP,Š@C±h( Å ¡X4 €†bÐP,Š@C±h( Å ¡X4 €†bÐP,Š@ó£þê³ïõWP\5þ.Öø XŸêOÖ]«?™nH÷¥ÔËÊY6É+Åtov™nõ÷„/}f·üï .õ’±äîdŒ§XoêOÖIýÉÙËkü5ó±"°ì¯ÇÅ;e9ÙÕ{‚«pQaõÀ“Í0Kë “€µb©Ù ß\Ä À“'¾{!ŽT¯‰T•EÜ›Ë"õÑúkõQu¯:[A}Íádóñê“Í…¥XÀèd멆“­ÛÜ[\Û܆iÜ7Ì„3²/á¨{M÷æïLw*1~;•‘?|ÀO'ðJ9ß¼Ÿr<ñžx´õƒ­ÑÖ²HÙæ²H‰YRQbžl=Qs²Õtoºÿ°¯6pfO Ãt¹ ÓÛCv¸,]v¨,Ýtg÷¦;âOÜ{ýWq¯a†)‰>–3 €†3 X3ö÷u|±¿/í»{Ág­\F-u,Çz`ÏZùU¹‘ãv—8ã¹3"m¯í}§-m>^m®¨>[3Л>[Ù›n—½íÚ)°fø›¾3ÝåÁ²æ¹‰Ñ̰v,g\šËév¬¬%"RbŠˆdÂθˆc9©¬•‰~{!í³ìO^Ž:Žå|îXmÁ7»Û‚#¡/_ ÍÞ ÅÖ ÇÊÙ"™Èw#Žeûî9V&|ÿ†ˆU{áJoz¤êZéùö¶àÁd´Ù —Ö—Ç3áû#bÙ¾»2a'䤜©‘ê³´¾ÄôIÃmßC¶Â5 xB¦Qi˜†YZ_ÉZ9[DäíXÚÅÖ(UÈe²V¿á¶?PßøN¥áX.·;²˜v)°Æ8VÎÎ_¡@}1!å$_{'|ß¼ŸöeÂöPÚ'’Ëäïq¹ 3ûÃ(°Æò¦Ë-RbælǪñWŸ­4Ê""Y«ð^Ã,­/1 ÓUV\û\à€5cÂg9VƱ‡+í³‡²VÖº?âXžx½ø5‘†-þ€cI½Äßý‘ü£ëþHÖr¼NÊiU8œ+ XC¾I9ÃÞ3/ Ž‹ˆH•üœAZäî÷ÿ'<õßÒ©ÿD*ílë4ÌÒzÔˆˆÌy]Ь¡žŽáPTËG?tvÀCtŠHçÔí¼´bÁTu¬2ËyÌþ£ÉÉÉÉÉIBÖ³tCº/Ý þ¶ì¡œe“»Þ &IXÙ×£gØÓì^þ>üaicdd²'oIEND®B`‚xymon-4.3.28/docs/man-index.html0000664000076400007640000002312512465031236016715 0ustar rpmbuildrpmbuild Xymon man-pages

Xymon man-pages

Overview Introduction to Xymon

Server Configuration Files
The hosts.cfg configuration file
The Xymon client configuration (analysis.cfg)
The local Xymon client configuration (client-local.cfg)
Xymon environment variables (xymonserver.cfg)
Xymon server task configuration (tasks.cfg)
Xymon alert configuration (alerts.cfg)
Xymon Critical Systems configuration (critical.cfg)
Xymon CGI configuration (cgioptions.cfg)

Web page generation
Generating web pages (xymongen)
Viewing current status (svcstatus.cgi)
Viewing trend graphs (showgraph.cgi)
Trend graph definitions (graphs.cfg)
Viewing multiple trend graphs (hostgraphs.cgi)
Viewing critical systems (criticalview.cgi)
Viewing ghost clients (ghostlist.cgi)
Viewing historical logs (history.cgi)
Viewing the eventlog (eventlog.cgi)
Viewing information from a CSV file (csvinfo.cgi)
Linking to prebuilt reports by date (datepage.cgi)
Custom Xymon webpages (xymonpage.cgi)
Xymon webpage headers, footers and forms (xymonweb)
Xymon webpage access control

Report generation
Generating reports (report.cgi)
Viewing report details (reportlog.cgi)
Generating snapshots (snapshot.cgi)
Configuration summary report (confreport.cgi)
Single status summary report (statusreport.cgi)

Administrative web pages
Editing critical systems (criticaleditor.cgi)
Finding hosts (findhost.cgi)
Acknowledging alerts (compatibility mode) (acknowledge.cgi)
Acknowledging critical alerts (ackinfo.cgi)
Enabling/disabling tests (enadis)
Acknowledging alerts via e-mail (xymon-mailack)

Network service testing
Network service test engine (xymonnet)
Xymon ping utility (xymonping)
Re-testing failed network services (xymonnet-again.sh)
Network services definitions (protocols.cfg)

Combination tests
Combining status results (combostatus)
Combo-test definitions (combo.cfg)

Xymon server programs
The Xymon network daemon (xymond)
xymond communication module (xymond_channel)
xymond history module (xymond_history)
xymond RRD module (xymond_rrd)
xymond alert module (xymond_alert)
xymond file-storage module (xymond_filestore)
xymond client-data module (xymond_client)
xymond hostdata module (xymond_hostdata)
xymond admin command distribution module (xymond_distribute)
xymond data capture module (xymond_capture)
xymond sample module (xymond_sample)
Xymon proxy server (xymonproxy)
Xymon client HTTP gateway (xymoncgimsg.cgi)
Trimming Xymon history-logs (trimhistory)
Client data collector (xymonfetch)
Application status feed (appfeed.cgi)

Xymon Client
Xymon client filedata tool (logfetch)
Xymon client update utility (clientupdate)
Xymon client ORCA data utility (orcaxymon)
Xymon client task configuration (clientlaunch.cfg)
Xymon client settings (xymonclient.cfg)
Xymon client message cache (msgcache)

Miscellaneous programs
Running Xymon tasks (xymonlaunch)
Xymon communications program (xymon)
Digest calculation tool (xymondigest)
hosts.cfg utility for extension scripts (xymongrep)
hosts.cfg file combiner (xymoncfg)
Xymon command-line tool (xymoncmd)
List of XMH-field names
xymon-4.3.28/docs/Renaming-430.txt0000664000076400007640000001261611615610703016755 0ustar rpmbuildrpmbuildThis documents all of the renaming that has happened between the 4.3.0-beta2 and 4.3.0-beta3 releases of Xymon. Configuration files =================== bb-hosts hosts.cfg bbcombotest.cfg combo.cfg hobbit-alerts.cfg alerts.cfg hobbitcgi.cfg cgioptions.cfg hobbit-nkview.cfg critical.cfg hobbit-rrddefinitions.cfg rrddefinitions.cfg hobbitgraph.cfg graphs.cfg hobbit-holidays.cfg holidays.cfg hobbit-clients.cfg analysis.cfg hobbit-snmpmibs.cfg snmpmibs.cfg hobbitlaunch.cfg tasks.cfg hobbitserver.cfg xymonserver.cfg hobbitclient.cfg xymonclient.cfg bb-services protocols.cfg Common programs =============== bb xymon bbcmd xymoncmd hobbitlaunch xymonlaunch bbhostgrep xymongrep bbhostshow xymoncfg bbdigest xymondigest Client programs =============== hobbitclient* xymonclient* orcahobbit orcaxymon Xymon server programs ===================== hobbitd xymond hobbitd_alert xymond_alert hobbitd_capture xymond_capture hobbitd_channel xymond_channel hobbitd_client xymond_client hobbitd_filestore xymond_filestore hobbitd_history xymond_history hobbitd_hostdata xymond_hostdata hobbitd_locator xymond_locator hobbitd_rrd xymond_rrd hobbitd_sample xymond_sample hobbitfetch xymonfetch hobbit-mailack xymon-mailack bbcombotest combostatus Net test tools ============== bbtest-net xymonnet bbretest-net.sh xymonnet-again.sh hobbitping xymonping hobbit-snmpcollect xymon-snmpcollect Proxy tools =========== bbproxy xymonproxy bbmessage.cgi xymoncgimsg.cgi Web tools ========= bbgen xymongen bb-ack.cgi acknowledge.cgi bb-csvinfo.cgi csvinfo.cgi bb-datepage.cgi datepage.cgi bb-eventlog.cgi eventlog.cgi bb-findhost.cgi findhost.cgi bb-hist.cgi history.cgi bb-histlog.cgi historylog.cgi bb-hostsvc.sh svcstatus.sh bb-message.cgi xymoncgimsg.cgi bb-rep.cgi report.cgi bb-replog.cgi reportlog.cgi bb-snapshot.cgi snapshot.cgi bb-webpage xymonpage hobbit-ackinfo.cgi ackinfo.cgi hobbit-certreport.sh certreport.sh hobbit-confreport.cgi confreport.cgi hobbit-enadis.cgi enadis.cgi hobbit-ghosts.cgi ghostlist.cgi hobbit-hostgraphs.cgi hostgraphs.cgi hobbit-hostlist.cgi hostlist.cgi hobbit-nkedit.cgi criticaleditor.cgi hobbit-nkview.cgi criticalview.cgi hobbit-nongreen.sh nongreen.sh hobbit-notifylog.cgi notifications.cgi hobbit-perfdata.cgi perfdata.cgi hobbit-statusreport.cgi statusreport.cgi hobbit-topchanges.sh topchanges.sh hobbit-useradm.cgi useradm.cgi hobbitcolumn.sh columndoc.sh hobbitgraph.cgi showgraph.cgi hobbitsvc.cgi svcstatus.cgi hobbitreports.sh xymonreports.sh Templates ========= bb stdnormal bb2 stdnongreen bbnk stdcritical bbsnap snapnormal bbsnap2 snapnongreen bbsnapnk snapcritical bbrep repnormal hobbitnk critical nkack critack nkedit critedit Web pages ========= bb.html xymon.html bb2.html nongreen.html bbnk.html critical.html CGI option variables ==================== CGI_HOBBITCOLUMN_OPTS CGI_COLUMNDOC_OPTS CGI_HOBBITGRAPH_OPTS CGI_SHOWGRAPH_OPTS CGI_HOBBITCONFREPORT_OPTS CGI_CONFREPORT_OPTS Configuration settings (in xymonserver.cfg) =========================================== BB XYMON BBACKS XYMONACKDIR BBALLHISTLOG XYMONALLHISTLOG BBDATA XYMONDATADIR BBDATEFORMAT XYMONDATEFORMAT BBDISABLED XYMONDISABLEDDIR BBDISPLAYS XYMSERVERS BBDISP XYMSRV BBGENOPTS XYMONGENOPTS BBGENREPOPTS XYMONGENREPOPTS BBGENSNAPOPTS XYMONGENSNAPOPTS BBGEN XYMONGEN BBHELPSKIN XYMONHELPSKIN BBHISTEXT XYMONHISTEXT BBHISTLOGS XYMONHISTLOGS BBHIST XYMONHISTDIR BBHOME XYMONHOME BBHOSTHISTLOG XYMONHOSTHISTLOG BBHOSTS HOSTSCFG BBHTML XYMONHTMLSTATUSDIR BBLOCATION XYMONNETWORK BBLOGSTATUS XYMONLOGSTATUS BBLOGS XYMONRAWSTATUSDIR BBMAXMSGSPERCOMBO MAXMSGSPERCOMBO BBMENUSKIN XYMONMENUSKIN BBNOTESSKIN XYMONNOTESSKIN BBNOTES XYMONNOTESDIR BBOSTYPE SERVEROSTYPE BBREPEXT XYMONREPEXT BBREPPANIC XYMONREPGREEN BBREPURL XYMONREPURL BBREPWARN XYMONREPWARN BBREP XYMONREPDIR BBROUTERTEXT XYMONROUTERTEXT BBRRDS XYMONRRDS BBRSSTITLE XYMONRSSTITLE BBSERVERCGIURL XYMONSERVERCGIURL BBSERVERHOSTNAME XYMONSERVERHOSTNAME BBSERVERIP XYMONSERVERIP BBSERVERLOGS XYMONSERVERLOGS BBSERVEROS XYMONSERVEROS BBSERVERROOT XYMONSERVERROOT BBSERVERSECURECGIURL XYMONSERVERSECURECGIURL BBSERVERWWWNAME XYMONSERVERWWWNAME BBSERVERWWWURL XYMONSERVERWWWURL BBSKIN XYMONSKIN BBSLEEPBETWEENMSGS SLEEPBETWEENMSGS BBSNAPURL XYMONSNAPURL BBSNAP XYMONSNAPDIR BBTMP XYMONTMP BBVAR XYMONVAR BBWAP XYMONWAP BBWEBHOSTURL XYMONWEBHOSTURL BBWEBHOST XYMONWEBHOST BBWEBHTMLLOGS XYMONWEBHTMLLOGS BBWEB XYMONWEB BBWWW XYMONWWWDIR MKBBACKFONT XYMONPAGEACKFONT MKBBCOLFONT XYMONPAGECOLFONT MKBBLOCAL XYMONPAGELOCAL MKBBREMOTE XYMONPAGEREMOTE MKBBROWFONT XYMONPAGEROWFONT MKBBSUBLOCAL XYMONPAGESUBLOCAL MKBBTITLE XYMONPAGETITLE hosts.cfg tags ============== The "nobb2" tag has been deprecated. Use "nonongreen" instead. Xymon internal statuses ======================= bbgen xymongen bbtest xymonnet hobbitd xymond bbproxy xymonproxy Xymon internal RRD files ======================== bbgen.rrd xymongen.rrd bbtest.rrd xymonnet.rrd hobbit.rrd xymon.rrd hobbit2.rrd xymon2.rrd hobbitd.rrd xymond.rrd bbproxy.rrd xymonproxy.rrd Xymon network-daemon commands ============================= hobbitdboard xymondboard hobbitdxboard xymondxboard hobbitdlog xymondlog hobbitdxlog xymondxlog hobbitdack xymondack xymon-4.3.28/docs/editor-showclone.jpg0000664000076400007640000012156211070452713020140 0ustar rpmbuildrpmbuildÿØÿàJFIFHHÿÛC  !"$"$ÿÛCÿÀò"ÿÄ ÿÄ`  !1U"”•ÓÔ#5AQVs¥²Òã2¤³7Bar346RSTtu’“£´Ä$qv±Á%bƒ„…‘Ñ&CDWXc‚–ðÿÄÿÄ%1!QAð"2aÿÚ ?ã²¼•è¯%v¹‹ÀØ_E@Ú™¤† w¾8„ŽG,4¹ óÇÎ?ôS=ZÁß7?E3Ú§äªO°gá )q²ö´“êÖù¹ú)žÐZÁß7?E3Úb($úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´'V°wÍÏÑLö…ˆ$úµƒ¾n~Šg´/dvxèÏT¬¯©©27ZFBƳÝÙ#É9ÛŽÌsíåŒA[Þ>V¬ûwþ"±VUãåjÏ·â+I^JôW’»\ŒÅ£¡mR_*löxj©é¦­C“îÙ½Àƒµ®<ÎqŒžx"f}3ºŽz›]öÓwêñ™eŠ•Ó2F°~Óƒe…Àgnp2{Xý†Z;ýaCüF,Á|²PST‹ Ž®šª¢ÓšŠÚñPcí-xc[`Ò[“žDãŸ5ÄÎÞ×M5Åö¨ŽCLèjx¯’2é™°·„íîrkÉ vGøØù–ïqÖ–ÍgÑÓZï4ÓGjqâ5Ù/ ¬©cüç{ր촙}hɯ¸hޏzäÍ°Ô fOñòÇ=h§´olm ìÆbÏj+Ô[‰¸Þ/:Vû&£©ª«e#bêrÕçEPfhá°ž`̤°ròÇ%™®5†¥§º xo,Š®ÇE[wdTñhbâ:LþÛŽãå‘Ë`+ÚïCT£µ û‹©-õqͶ‰õn{Úæç3JÌs9^Ð{ òF«6¥Ö>’¥­†ãZÊÊ($ÌÂIï0x%Àäík¿¬í 3J^uEmÒ¦Õq»Þ7ê*O ³ÔÉ™“Áò‰òš^Óч¼}*v£EE½]îSÕjkNžª¤®Ô´vJsFÚÔÈL²“!anH w!æFÑØ´U©v/Ïr¶ˆÓÚÒ úkårˆ$EŸÈBËšyyG’½¼ôyþ`ï÷0zµW{†ÿºÝ?«7ý:³úO°i½A¨*,Ö{LZÚ®6<݆]-Ž<¶£‰œÂFܲ&cˆàIw¸öNz=ká@ì€O÷=Z‡“¢Žc‘Ì6É2ÒAÄÿ‘]srõJ¥zo¶ëúÛ EGG‹Þ»Õ,‘´ÒSÁ$UÍùã.•ŽØþ^K²’C¹æJ¨ËßFÝ[:‹}æšY+k¡£ŒpiÀi{±¸ž`Ÿé8³‘ÊÝ#RS[úBÔ”P¶ ZkµT0ÄÞÆ1²¸5£ú.©¤¶êk^ŸÒ4úÃQ{ýzuþ–Jª–ÓÇ LqÏÅÆÖ1¹cÆpÜã“ÈÖòïJßÊŽ¬ÿ]Öé Ö‘iD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDDA[Þ>V¬ûwþ"±VUãåjÏ·â+I^JôW’»\ŒÅ“¦+«m´ô¶êÊŠ:¨ànÉ ”Æöå˜8p Œ‚GýÅ}ªgžª¦Zš™¤žyžd’I\縜—y’O<¬OÉTŸ`ÏÂRãeíi![|½W[`¶ÖÞ.44ûx4ÓT½ñG´mnÖ“€H‡%â¶íu®‚’ž¶ç[S vRÇ4î{`nÃ8hÃ[Èc°} t3®—›½Õ±6éu®® F*j&Áý‰Âõx¾^¯lŸûÊàäRÍ«¸+©u}âãfmN”ê0R] ª–_|"“ açÈ`öòú"t­ü¨êÏõÝgñÞµ¤I4‚"*ˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ‚·¼|­YöïüEb¬«ÇÊÕŸnÿÄV*" "" ’¼•è¯%v¹‹ÓòU'Ø3ð…”±m?%R}ƒ?YK—µ¡D@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DD½ãåjÏ·â+e^>V¬ûwþ"±Pd•ä¯Ey+µÈÌX6Ÿ’©>ÁŸ„,¥‹iù*“ìøBÊ\l½­ˆ """ """ """ """ """ "" VÅÑþª²PÖ]uCíµ5ñÌaHìîh9 xÆr9œòY¾:;úøß÷uʱŸ“PXa‰Ž|’[)ÚÆ´d¸‘€ܵþušÆÚ˜l•ôN·T6޲¢h¤ «s˜…ܱ½²7ÉåƒÎr}œÇq–ÛöñçÏœÊÉšª²á ôtí¦Þ×±“ìò߸m.{ц»³žׯãëÛïýþ“ärvëõþÿmgÁÇG_þî£ÙSÁÇG_þî£ÙTÎÑRê:8ÝHû£ê&qc =©òÓDìà fÈÙžG 8A$s“L‡[§mn-ÕT¯©ž«…ýî"Ï¥¹æáË#vövnWâñy»þÿLüž_Ôax8èïëãÝÔ{*x8èïëãÝÔ{*‘»éhíúfžïÖë&3EÌ¡&—/ðÄáÇã6–Žm#'çÖUŸ‰Ç|µ/årOdJø8èïëãÝÔ{*x8èïëãÝÔ{*ŠE¯‡‡î§ÌÏõ £¡í;|ªu6¾T^%Ž3,Âx"&äIž(ÁÉpìÊ”ñx¨ÿ%]é*Oÿ+a÷6ü»|ÿWãF¦ì:ƒ¥™ºRª†ë¡:®Œ”pi¦Ô®žÒ~9á²’àï Ñ· îçóãþ<î1îáÎç„ʪ [Ñ-ºÑ¡u.¡‚ã9žÃWôî™’bgšwm%ÚG¡§!Ç‘éísütÃÿ‹bþ±s Änˆˆ¨""" """ """ """ """ """ """ """ """ """ """ "" ÞñòµgÛ¿ñв¯+V}»ÿX¨ˆ€ˆˆ2JòW¢¼•Úäf,OÉTŸ`ÏÂR“è¦šŽ·RiŠ …u”•uÔóB÷½¡Íµ„åŽk²9öœŒƒŸz±Š‹í lPIx ’……ÄðËŽ×D\Äxsr~`{W+ÿ+k¨·M[f¶MQ¦íÚZ……Õto{êL¯ÝTöÔM‘ÛݵŒÄ;ù€ã’p1 rÓÉ_Iu·] …ÍeA¤t™„»³p{H'–æäg<Æs2”B¢ÛfеQ×ÅoeöË-eL1ME$—u[dŒ=›3 $8$,9ù»3‡GUÜXúFË„HÒ×õ˜ÉŽg0ƒ¼7m~Fs–7&ö‚%Ý­4Õº‚ºž+MâÝS4´”%”P2¤Ë#䧉Îx/ˆ7s‹€Üù#·KOOOTèn¶ºÚš6—ÕRSJ÷K AÃŽKCϱÎÇo`%I”£_E´ÒèÃ,6©§ÔÖ (n° i¤©šV7;ÜÇ5ÿv¹¤3èq^#Óµ Ž—µGYi‰×jVõYÚÙZÒçÏ+Cfò7q8€Ç pÏ)Ú eínššžÙS[ ÒÛXê=½ržžG™)Ü %¡®ˆnXç ½Qéy¦¦¦|÷[] E[éijd{d•¤á§!¥ŒæÞæç·°‚¯h HjKT–;õmžjªz™¨¦t2Éí›ÛÉÀnkO#‘œc#–F ›¿X-4ÚjÅp‚ùlЦ¦Øj%§-©2O'X™¾OÅZÃå4e„ó9ÍÁª"ÚçÒõUúªK4U¶hçŽÙT/‹‰5 m+%¥ÌÈ{£òÉxhÝ»$dgæ4{¸õgQXÅCÌQU™%ºQŒÇŽð@ ’Zw0§h5„S4šrºK…Â’ªZk{m¯,­ž¥äG ƒ¶í;A.%À€ 8'|®v:ª:ŠXà–Œuœ©f£ÜöÌs·hg–ÒÐyŽ\Ænà‹Eîx¥§žH'‰ñK‹Ç´µÍp8 ƒØAù—…A^ÚbÝ©º¶ž½Øtý}˪ÛàÙ$TrM% È9hý¦å®=¸È!{¶é½wBÊÖ3GÞåem;©æl–ÙÈ àyÌ9­p?HùÕ³Ñ%î«M{˜o:ކ8d«µZ§­“csâ¢cÚ·-Á8R:Û¥{埢i®”ûtšÎ•µ‘ÕÑLךxd¢ÒÕH@pw±€³ÊçÆ‡™Êôáù7dÓÍŸãL²ÞÔþ µt{âõ½wgãUp<+dãã*8{Ç0|‘Ãno3’Vn‡_Y}ï{z>¬­žÛ/Šj«MKŸ•¸´m ¸“Ì ‰К¤K]’é]K-ªñWIkáûíq¦†7S[·´8qw<<áŽkÝÃköµÀ»bßzO·ZnWúy4£Ó³2;½Æ!4Ô­tOÄ%Ò‡½­d ¸1®sv’F6“¯•õ®©ñ~÷µb_ZYkÛÑí]\Ö©7ÑMSjªs¢C!i >Q'$ ò#Ê=«íúš~†Å}ªu|⪳‡j¨ka­Û\Á“‘—cÉË‚pºW¤«ÝVšèëRê:á’®Õhª­“csâ…ÏhpÜ´g|áj6ž’(è´íÒù_­tη‚–¢ŠŸ…¤¨ÇÔÎ föš¹·nsÛäœ1ø8|«¿ÿª0Úu¸±Íkƒ£úún±qTÔEk©ÌÆ9®hp9`æÖ’CA8æNNa¾ë?ª7ÿFÍùWZiB붤¯ ¨¡¼Úë ¶ÒUIo®۶Yªãkƒ¡sò÷p p/- `5Æ@¶e©ù– _åÄ¿uŸÕÿ£fü©ð'YýQ¿ú6oÊ»iù¹~“áãûrÏDúkZÑ\.À_¦*&£T\ìÒNÆÊÍÍc ‘yY,˲@Éo^ðô‰ÿó"Ñÿú‘öÕcj¿—hÿÕÕ_Æ¥QKÅÍŸ|îUêãæ3ª!«§è/¥¨k«ã¸U3UB%©Ž“«6Gpm™">$›~Ú9ÆygšOkŸäk¦ü[𭋘Tž7DDUD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDDA[Þ>V¬ûwþ"±VUãåjÏ·â+I^JôW’»\ŒÅ½ÑMM¤Ó÷ Èèé)*)ª&™ì{ƒ[kÈÃçvàrí#8"BߨŸh³Ül±2 Ò^ñE\ÒáÀÞ6JèÀ8‘€(9µ+OÉTŸ`ÏÂRâå7kMÕ·[MÒ²‹ŒUŒ†ÑSA_¯»Ö_à£ÔŒ¡±êmžýÑ:‡‹,¸…?ƒ.ð"ß lc·1ý™%f^´/¾:{¤O¾œ/†<_Œêùê{íðÑönøÌpwö·ö±ódç_5Þ•²Þ…žår|UC‡Å-¥šHiø‡ñ¥k pî=œG7?2Å»t•£-WšëEuÒvU[¦ŽâÛ}D‘R:HÙ# ²¶3m-‘„9Î íËHïYèþÓ©ÙOm¶[¯Z†ÑQk¨¼G@ÇTì–.Þñ‡HÖá‡ipCG, Ië+Â+DþµÕxW* íü=ùêÕpÔlÆGíp¶çæÝœ`ê=5t‘kÒz?TÃGu–ŸPQYj*)ß “ÇM9‰æ+ÃeÏkd#w.G+a¾kÍ/eº¾Ûq¯¨ŽXžÆO$t3Ë3žhšf0Ç !Í?æòp=„ Í£±u}qtÔÝkw_¶ÑÐõ~8}^Z§ïÝž{ºÎ1§<¦T$Ú³OÃiºÝe¸m¥´Núzç_º)[Œ³fÝÎ'sv†ƒ»svçpÌØ9@DD¶±š(/²Ï+"¶êœ¹î¥ùÊ€÷ÚÕÞt_ïÛÿåfôŸ¦ìžçk£Ôvš[¥$µ3²ˆY#CÄ”íÃÚàîxÏ5¨ø*è³ê“Ìi½RÅõb¾Ö¯d t¿$nkØíY kšr1[9…Ìk¨õÓmTÝô›i²Xíöz f¢†–(hál{ü›{Ëß´\\ò2òCG‘âW·Ÿ”FHäyóóm’ò븳¶Ñp7#œQŠgñŽO‘Ý€žÎÀ›ƒ›tî sécmŽæçÖ4º•¢‘ùœ’YËÊúD3SO%=DRC4n-|r4µÍ#´y‚®ÇÍt‡¸æËl¾Áq¤ºÓuˆédkw¹¸p å¤ÂPsz/Ћ†šèºßw¤³×¾ÙIr­þõ¤žèæM?®Vµ$’_€ùÔ}§Mt]w´>ñi}²¾Ûíõt×GK vŒ»/l…£·Ÿ$žè¿C,:S£Ký¸X›Au£.,W'ÍáÚ71äd} ùxÐúF‰­sl» c­J>ŸýïèP~z"O¸{—ÿʤ=Ñ1ZäèÊzš LT&ŸU ‘#äs™<¼Éq=®$àcæñ”•tçTE1¤týn¥ºKACD’GGQRD0OÅÄç5¸ã85€ý/§ÛtˆtRRØ/±][i–ËrŽàöîm+©^&púC1’?±b\(«-õO¤¯¤ž’¡Ÿ·ñ–=¿÷ƒÌ)±ðDWo¹ÝGvÖUVû„V¬ûwþ"±Pd•ä¯Ey+µÈÌX6Ÿ’©>ÁŸ„,¥‹iù*“ìøBÊ\l½­ˆ """ """ """ """ """ ""Òè’ÉU©}Ì79C$1ÕÝmSÑ@ù‰µòÑ1. — à˜­³\ôWCw¥Ö5¶º™™v¿Y«hiá©” :yê)Û¦ k šçˆ¢>W&œ ¹Û¹ã£Ot;´V’¥°Ã¤ÝVb ß1¹¸1­Èoàa£–Oζ_J©zP‚ÝÖ:'T\&ÕÖ«T¶ceÖ:ýEL²6¦‹4ÑÓIÂcX[.c‰¥¹{6¸“å,ÝA¢n— /Ò•²è›>®ãu=î }²ž‘¼R‘‰"qòC¼’n@¥|m*>¤}ê=BxÚT}HûÔz„§Hú#Z\­úîѦ]§ßG¬)ÝÅžã<±ÉI)¤e1 k#p‘ŽdL îic‹Žذz`èë\êù5--ÎÑ](Ì÷M¨+èÙC˜ÇRÓ·‡PýÎ.‘Çø,pn sãiQõ#ïQêÆÒ£êGÞ£Ô ´Yl Õ]7ÕÕYîL¨²[[·Øa!ðÍtÏm; ¸‘ŒºAÚ Tàö+er¯¥GÔ½G¨OJ©zPƒª‘r¯¥GÔ½G¨OJ©zPƒ uŒÑAx¥–yYm·TåÏp|}/ÎU'a裣K7JUZö’z!Q(ß•œ iÉ;å`ÏiåØÓ¸ŽÑ·SÔÞèÛ§‚}IÑE¦õ ./Š;…LU Ä`–‡Ó>p ¼-tgÿôû£ÜRû*Í•[¦µ{$è[¥ù#s^ÇjÈK\ÓAŠÙÌ.cVþ±éŠÇvèâ碬Û4Å%|‘ÊãA4lŒ=²Fâã!`sˆ­Îs€>Œ*X“¢È'¨é+MGO “<])ä-cKˆkdkœì˜4OÌ*WDÙ5E=>°£¥³]ã¸GiŽÂÊY­2US»in2 £8ùÚ{Z2)fÆÛ¦¤¹]tÕÖÕC5EMÌõvSÀ]#éé]$QŽÒ7¾7ìon Ç"§ôÍÂ=OÑý¦ºžw^)®üY -.– Q$Nk^;[´¶wàö4ç*³D¸Þ8õèßSÍUÉ­mê‘•n’7€Çl¨âµäŽD<ÂÎXhX=(Ñ×ÑêxEÆ–¦žymtpž71ÎwT‰¯<ù“½¯ÿx8v‚µdIŽ®Áu¸oû­Óú³Ó®^]î<Ôv >ۜ׻å®Ú×ÑUY.qwŒ¸<‡sBбºHª¶Ó?¤ë{¢n¦¾ð> ÂöüuOýŽSðGk¸uM™çoìgqÀ9N’*­´Ïé:Å^蛩¯¼ƒp½¿Sÿc…”üÚîSfyÛûÜpU‰áC£Ï®ºwÒ~tð¡Ñç×];éH?:>—…ôWøY]p¬š,µ7K^ø#·¶á#¥‘Œ Át‘2¥¯’[ –u}KUmÔ Ö÷Ý8è®zeþðõÙ¨›Å†«Xç×í-È“¦&;ý½£ Äð¡Ñç×];éH?:xPèóë®ô¤wGUö»×H:²û¦êi«,U–øEU+ƒ ž®>±Æ-pò^Do¦i#?³ŽÖàlÚ§ûŒÖú¨¯ }uÓ¾”ƒó­w[ô‡§ëiàfžÖš H™]_wŒ8 '$ç´‘Œvò—ÅŠÿOtQ|¶ô£=þ§¤}Y[¦¢Û= žk½K¶ÌIË%q—0 Aæìáù k­~ :”z›NÝn5:Ÿ¯¾+U{gØÇA 'Üw/íù©6(±tv×I©`ºYí·b`í|£™¬húIqœµÔVÍÄn¶»îŽËx±Š)éïµbšVRvTIL ¢Hö~Öâ†çæ°ulUTZrÉm»5ìºÓ¾ ¾)OÆCNî 7ÖÂgm<Àp8浄S_{|{‹ÿ”9³ø3ª]>ä«Í¢É­j+/Z t k\_WU Ž­å¼Œœ¹¼‡Ò´:;¥íu¤ôíâ=9Q]¦¨µâ‡i¨¼K 0ÓÑîpâJéâ48¿l@åîÏìÎGM´5qtVmÖ«-ÇQh»F‡©} Î’²’H¤œÒI sÌ_3öGd6¿q— e€[‡GŸ]tï¥ üéáC£Ï®ºwÒ~tÝ%:¢é`¬¥ ©»Ûõ=~º›}Ÿˆ6¹îe8s¤áîŒÍ…!çû¬›wHÓ.µVÝR.~ ½_@Ü-ïêMÇ¥ü¥Nì~̬ÛQä)»¹žv'…>ºéßJAùÓ‡GŸ]tï¥ üè5Ý sÓwÎ’-Uš%ôÒ[(4Ì´•晸l3SšX$ÇìÈÆ²§È>Swž{þ¤þð?ÿß8P^:<úë§})çPÚ¿¤m+Ui1XµžŽ5eÀf¶ïcks’|‡O,c—nsËUVÚ‡¢‹åË¥/ôÝ#êÊ-5.éë¬ðÝê[º`FƒüˆŸ’\6ã ÀpáâtËþô£ÿÒ?ˆÅ°ü1©úóÑ¥æZgJWKkú1ÖòTjÝ%p¸Ýz‡ šÕql®<)™œ4߳ϖ{ 䤨æ„DZAoxùZ³íßøŠÅYW•«>Ýÿˆ¬TD@DD%y+Ñ^Jír3 §äªO°gá )ftwWECUl©¯‚ÚbÌbA†#´þÐcË]ŸjÛ/µú©Új¹•wš]Mi›†ÃRg5¤vðæ¹¡ø’í-æÐ$vã\®²i£¢ÜúJšÂû„ÑÛ.qVe¸²IkÙ$aN­,´—mÀ'pÉàgëzÑñE§®7:k¨·EArŠ«¤!‘U5Ò²<4 ŽÌÀo î|–{y±£¢ÜMŠ ¢ÓÕwHoò6åGÆ©e5LAЖÏ,N{ £Ãƒ¸d†cçq^µDÖ‚Z]޶ÜÍa³;…(¸0FÓ×*A.g.ÛˆÃÌ‚âì4ÄSš"ÝlºÞ&£ººª8E Tí–í7E å‚Ó¼a„m§ŸhÇ97ÐhèìÔ7É"¾ jª™i (©ˆÈÇÆ#s¤âpð[‰Y†m9ò’å«¡¨"ÚdÓ´6»Ž 7‰jf£³WuÚbÖIQ)t 9ÁÁƒ=ÄáÝ€cžFMŸOØîWý4è½ñ‹Íy |Fv à”98“f×%ÙØ3’9v§h4ÕîH¥‘¾HžÆÊÝñ—4€öä·#égéè[íÚz¶ËušÓï“*­p²wÉQ+LffDH`h1œÈÓ‚çòÏ57¤é¨)µÏGWÉY§Å%SOQ[,~AÙÊ=ìß³òœ7dîK¯Ñl”TZ~éSQQMKt ·Ûé]SX%«eD¯ØÆµ„DÀÒ]#FH8Î~l5”69mqß-ÐÜYGdtÕ´“Ô±ÒymsšY(Œ(G æÏ$ûYWc]^çŠX'’ â|RÆâDZí-s\ ö~e·jŠd½ÞlÂýLôކELLd“ö8pÉiØÁ>Pn9/½EŠÈ5&¸§ºÔ]eie–3$¡µl„‰2ß)Ïâ,‚ !ÙÂ†Ž‹hžÁCsmŠm>Ú¨EÚ¹öñdÍ‘ÑÌÓ=íkAi3ù£=«2ÇmÑ•Mâ))*ªD¢¢&о /“ho ðs³9&N\¾|‡a¥¢"Ð""" "" ó£n€"ÖšN–ùMr|"F0HÙ' òÌmyÀ^WÒ¶_I;å¾sú*Ñ÷-$ÔÖgð"P.ue?@Uõ÷Û“_©ß¢¤Ô6«˜§¢§4œSña»7Ã#š và´ÆìÎ 7ÅRNùoœþŠxªIß-óŸÑW6©é ¾ÑYžN6ºÇ¦v{÷Zêî±fNþ [—d21îËÙÛ¸…öð“n‚ûKc¹QÉK]Q|žÓ±¯ÞØÃ×Ç3Îñ-0ÇÌê† žÓE'â©'|·ÎEb?ÜË Zûìmpí¬üÒú&øu.—¢¿uN«k], âoÝ yáIœÛf×ãæÝŒœdèÝ,^/Ö 5mßN鯄•tÛ^úÕ%’0ß(Çä?{Ç#³‘œeØk³~•KܽΖÛu ÕÕº–iánç¼Õöû„9'æs'TßJº^=¯.n*‡Ô6°üc»I|,ŽÁ ˆÎbèZ c~×] \5ßHü¤©à:’W婌Èß-á³c-¤ä¸dà7iu9îŸþ\õÿ-ÿ+°VªüèÛ µ¦“¥¾S\Ÿ‘Œ6IÃ|³^pG—•ôª w—¹kù&£þ³?¨«¼U$ï–ùÏè§Š¤òß9ý¹XºAÕ”ýW×ßnM~§~Š“PÚ®bž6ŠœÒqOņìß Žh-Û‚Ó°w8 ÓTô…_h¬¿ÏG§]cÓ;=û­uw X³ '-„K²÷eìíÀÜB gÅRNùoœþŠxªIß-óŸÑWg„›tÚ[ÊŽJZê‹äö~öÆƾ9žp0׉i†>gT0döƒDߥÒôWî©Õb­k¥œMû¡/<)3ûlÚü|Û±“Œç?I;å¾sú)â©'|·ÎEu* å¯I;å¾sú)â©'|·ÎEu* å¯I;å¾sú+ç7¹dÂÍï¼´7ç=k³þ ꕇyù>_êŸüŠƒ–|Yéûþ/<¥Cê~m–[UÒwjÉUEj©¸ˆ#œHâØ˜H$pÆv2>|go½(ô‘­4~­¶Ym}K¨é®Òmõ”×N|»Itr4ÂDDçd»icK³ä¼73Z:¥çSº²(¡©: ¬ÍR™Çù[ƒ\ZÒàpK[žÜÅ%W)k§½jZKeSåd3oÜèÈcœ1Ghú:Ùº-ÿíßü_á=iߊ¤òß9ýñT“¾[ç?¢®Î–®:žŠ]'I¤ë¡¥­¸^Ý Œš6º:˜ã¡«¨à¸K÷ÀÀ^ß)£˜ú }oHÐGv¶ÝÌÓÁcLÞ®wJGDÞ43QËD×1ß8||IÚZ ?>PT~*’wË|çôSÅRNùoœþŠ·kzG½Ùa¨øM¤"·NÛqºÃ7N;M$rÄÊ’÷p›²H›3Zšìà?´Œöô“n©¼ÔÙí”rUVÁŠÏ±ïá‰71Ï–fœµ‚*‘Ôï )?I;å¾sú+£ÜÀȶ[Û¦«ÿ‚ºµjúÕÕ,ΣŠ)ªDo0Ç,¦6=ûFÐ縴Œ×c·±Kô®uñg§ïø¼ðz•XtÃÑõ¿E[ì•–ë°¸Çs’©›ÚýìÄ.¹k¶·9sœ;1ÈNUéÑwIÓXjÛ–éÑ”ºršÓ!†áYStâK´ÇD JH-vC¶†8;>SªÎŸ“~ŽÿúŸñ£RQL¢"Òˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆ+{ÇÊÕŸnÿÄV*ʼ|­YöïüEb """ É+É^ŠòWk‘˜´4U|ß{êê­Ô÷M²Jióµáñžc˜pÝ~bù”ÕUêÓ ®¶†Çhª£ëÌlu2UW ƒ±¯l›Zò˜Ó““Ë·µjÖŸ’©>ÁŸ„,¥ÅÊKZmGTÐ6¢‚èËuê´ŒeDµeÐâ˜FÖh9- åÎÎ8ǧêKi/1Séûƒe»R˜d–[¯Æî,r´·1snèÆC²HìpíZš,õ‚rûwµÜ,Vz*{me=]º›«™ßZÙ#‘¦I%qØ#ii/”ãÊ8h™ò—·^ísØi(«¬ÒÔVQRÉKK8¬,‰­t’HèÃrç5Ò¸,̃Ï0® ˜Ò7Z+5ÒZºêШ䣍¦ÃR #¢s·?8kÝŽÜÀAú:ïk“LZìÓ[k é+¥ªžfV´ [(¯cZc;أÉvâAÈ Sѵ\5MuþùU=¢g[/5=jjCV8‘˹ÎÜÉC0/ °ù. äóK~©¢¡¿Øê ´LÛeš§­CH*ÇIw5ÛŸ)f %‘ƒ†%  kUE:Á9i»Úè)57½µ’2çMÕéÏ]h4í²V—ü_ÆÑÆ6dnìÈ-ÉøMMN•«·ÛfЦÀÖf©2 ¶wOÐÆ– ï,»–ÑÚ :Ò+Ö Ž+õžŽ}¶Ë±ÑÍ ÖÅS\e}CZ@ÜÐÍ®c\Ü79í.—ƶñk}$ÊUM-¯¬¶¢©¬O;€-‰Ã nç†ùÄÝŠ ¬š¦ïk½jÊ‹ÔvÚÊh+*]QWNêÖ½Îsä.xcø`4`àe®ÇiÏb®Õ6º»ž­®uš±§P0†4W·þÌçLÙÜOÅycˆÆày8nFI!ÃSE:Á? †›OZ(¨i*`¸Û.W²°ÔµÌ.xŒ`G°Ž x;=ßHÛ·a³{éte=¥®© «²Ó^YP×>h_àÓ†‰cxÏ8náÛ…Y"\Aw—¹kù&£þ³?œ¾ô_§¯Ðt{SQqŽ‚‚ß5dR±µqÆØx‡íÛ¹Ñ1ÞN{¹›“tž§é¦Ó§¨é4ýc`¶ˆšè £$´´m$¹»‰Æ;yò Wá׺ ½?w¡üª¢Ô}ÚïwJú©n׊J;§ßku4ÑŠk†Æ†Ž.挱­c¸nfæ´¼ê.Œôíòç¹UKpŠª÷E$’A0i¦1æÍ’v˘á%Ç#â"åÈç—þ{ »Ó÷zÊŸ½Ð]éû½åMŽÌµPÓ[-”¶Ú8ÄtÔ²X?šÆ45£ÿ° ·ÔšÓLPß*¨ên¬BàÉÈžð×22Ö‘‘ØGÌr;W=ü:÷Aw§îô?•>{ »Ó÷zÊ—íV®¿Õúv餫h(.{ »Ó÷zÊ›ª‹Š¾{ »Ó÷zÊŸ½Ð]éû½åMŽÕEÅ_½Ð]éû½åO‡^è.ôýÞ‡ò¦Çj¨½U[In°ÕV×NÈ)âa/{Ï!Èÿy'Ì’\}ðëÝÞŸ»ÐþTøuî‚ïOÝè**󸤻Û÷y*Õµ-âÝzv°ª¶Tqáf‰­ÎØæáÃ'p°…Zü:÷Aw§îô?•bݵ_O[]]²¾¿IYàž> wÆö–¸d4O0r¤šÂÙº-ÿíßü_á=>êÎéýâ/̰½èíJÇ:>¥t¤Û#[$löA®®žAT~Ž^l”·[’º¢I›-š¹Õ´â2\÷SÍNCò[²wžX9 猃]ÑÞ­ÕõúŽ¥µ/}Â×Ql¬¢âM3'à‰d-ÆxŽl0¸8 ¬³Íq—‡~•¾µ}ßMêÖÅIÒOµt°ÕSÝ÷Ã3$nêÔ#-# à·=…QÕž-Ô¦­×KÍëP>{síluÎXÜ`¤~7ÄÎlÎì7sŸ¹îØÜ¸áxÓ½éÛÎÁr¥–á-U’†JHß4ÁƤ¼¸™¦òFés$Ä8`||¼¹Œrÿïtz~ïCùSá׺ ½?w¡üªlvªÑºEÔ¶;%u<;ƒ –F—µ®{¶ò! àg8'·è+˜þ{ »Ó÷zÊŸ½Ð]éû½åKö«Ïáþ’ïoÝåüªé÷ù7èïÿ©ÿ5—ðëÝÞŸ»ÐþU¬ë†ô¯­ºŸÂq×ú–þ¯ýëÍûw~ÆÜçc{sؤš¢-›à¬îŸÞ"üËõ¥oöj_r·: ^+aâqààâv“‚C\°­"oxùZ³íßøŠÅYW•«>Ýÿˆ¬TD@DD%y+Ñ^Jír3¦¶2ï-¾†If‘Ò¼ÆÝÏsc„ÈZÑó¸†à¤…-TÝ#Qi¬}»[®5¦ªfeC*rðܶ6pÈi.çv‘œáCèJhjå¶Á5Õ–iÙVüíŽFÆ\̑͠¸5»¿›œüËq¾ÍVí9^5EÂÑq­"?{¦‚ªšž&öî/’"Ig)nÜÕÄÏþÍ#µ–’žÅ,nŽ¢†X -,…­¹ÓK)’H#{ñ¸·{‚¸9 äá\tµòßG-UU$aàÎÆTÄù`ÉÀâF×ÇÌåÌálU&–CeÕÏ®¶MAG ¨ºœU1Õº ŽHÄ@— ÍÁ Èœ€qh裱Ô\îµW«mm4ÔuPAÀ«d’Õ:hÜÆ“;Ù‚àó¼7~œ,L®•ŒÔQÒV z6SVB&¦–K…;($Œ4¹ã/Yû@ò (:ºyé*¥¥ª…ðÏË$íØàpA1[•ÒÍ-ÓJi'Ar¶Äèí²‡ÃWY>ÖõÚŸ,qÏ1†äù=œÂÖ•”ÕÚ†Yi%ãÅ0S‰°GÅ #tœùùE…Üùóæµ¶£ïŒÔSSSTCG‘ÕÓõŠmµ—NÜC¿.x- °æ‘̇uÓ÷k]u•´ìd2?‡¹“Ç!cñ q,v?šìG—%¹Y!Ô=K%ÊØÈiZÉ*n0bœ6¶YÝÄòüƒÃ{‚O’2à@‚Š™ñt~ŽzÊ;/§†+át’ÙP×¹ËÛºXü¦‚I†’'j0> ßz‡\êlÛÁãðºÄ|~7oàîâmÇ=ÛqŽ}‹ûA¥ou¶Ê{œÒ *‡¾6O-t0=˜Ë^ñ±ÞP!®Á ä9­£4ž>{ëm÷§®uþ[gnwunwçÿÛÎݸçœsP7ôegª‘ÇßZÉ_jãt­kã§k胷€LRs#æã7.ÔbÐX® ¼WÛêm­–¢Š’¢i©ä©l.hlN;ÚIòöò“ks¸4üÙ+2'5NŒ¡¾ÓÔÐ6Yêªc‘“Üé¡Ã#l%¸kÞ»/~G3‡8lF™§_ܬûN—à™}õ§áq}ìêÛ8›öîâù8Îqå~Ï5o¢Žñ¢h(b¹Û)$¤¹ÕÍQ×*ÙÈ䊘5Á¤î8ŸÉÇ—g0§j¨ëv–¾\(⪥¤Ì›&>¦&K>78>N`$`…âÕ¦¯Kt· 8 u,3ˆ&’J¨£à¸‚Fð÷Æœì4FsÉMÕÑG|¨¶]ioVÚ*hhé`ŸVÈå¥t1µŽ"2w¿%¥ã`wí}9YÒ2õ§u}Šz fV_b¬Ššjèb”ÂÆÕ9ØÏv8±€9'$^Õ—}7s³Z«r·À$Š®ž#³è}K ŽôtÆN•‘¶º>f‡DÐòenÓœ³píùÁKt@ôkywY£kÍÒŽFÂê¨Û3šÈêç62íîÍ0>sþ+±±42—ô¬’Ü­†žž;Q–vÜ`t1¶bl ÈZ1È1œžXpÌíU¥Y¬—³e}Q¡À’iê#‚&œùÖäààg'{¿iûµ‰”ºÓ2Ÿ­±Ò@Þ0»fødsˆv왓¹¤ ·îZO[.´–›•ö×Eq­8¥¤¨«Ž9§ç!Ž »Ÿ.@¯¹»Ú…²¢èntB‚—‹Ö*ŒíáEÂ%²n~pÝ…®ÉäZAÆ=Ò&‚Ô× WªŒ? jíš@-SÚâŽ,dϪ‰Ó00È×B]‚òCC.ØïJ÷6´©´SÒ5Ú>ñ]Þá/£‡4Cã)Ã3¸¶WÇNó´Ž88. Üê=<5tñ¿ZÅåÌâ6ßÖãë%¸ÎáwcóŽÅü·ê]9q»Ëg·ßíUw([#¥£‚²7ÌÆÇ' åÌp r9;‘æªh4¦‡YK_ÂZ»|š§ßÈ禞ÖÊ·¬qš$/ˆÖnk~,µ¤‡5»CÚ×a¶EÖ)ì+”5t1ÒUV_®µÒm-&VM_<½Å¤ä˜o00À ME41‰Û\HÆ~•_Ñt¥£+k!££×Úf¦¦y0Ås§{ä{ŽÖ´;$’@v­óTÿqúÃÿUWZú2ÑvΑkuõš(ï•‘í|ŸÌcÎî$¬ocdx 9÷°½åø¾ª·÷FÜk®}ÖK]RùÝ´tîìdl¦5 @êIí%sjè~ž¿’k‡þ9—ø.xZ‰WǸ¿ùC—û?ƒ:êškh§é=%­`%˜b&ì`2y¦ˆˆˆ€´]]ª-ºk57«å¾ÑHé%­¨Ž–çhsÈà8ãúз¥_k›%§QÑ\,wÊ«­Õ‘ˆç‚QÉÑÌ@!à €VrXÖu/H4Mx©Òz²Ùpš™±6Y-ÕqLèD ,'i#v#È‘Ì.j÷Oÿ.z‹ÿ–ÿ•‰_7aÐ} TéÝ;IÀ¤‡„ç½ÄgÈÍÒÈì Ï8ù€ îŸþ\õÿ-ÿ+bUj»Ëܵü“QÿYŸÀ‰pjï/r×òMGýf%¤NXºPÓ׎‹kúB¦§¸Ço ·É_SG,Lm\q¶8›¶îtE¯o•‚Þal—-G§­—ZKMÊûk¢¸ÖœRÒTUÇÓóÇÇ]Ï— UA}èûVSôCo±[ZýLýžºÛ Dm9¤áŒ.پ⻦Fäîi^‘4¦¸j½TaøKWlÔ‚Ñjž×pˆád{&}TN™€9†Fºì’ p\&ïjÊ‹¡¹Ñ ^/Xª3·…–ɹùÃv¸;'‘i_¨ôðÔ ÓÆýk—3ˆÛ[¬–ã;„yÝŒsÎ;‘xÒW¹µ¥M¢ž‘®Ñ÷Šè.÷ x­9¢NŲ¾:wœ ¤qÁÁpι‚ÔÐë)`«øKWo“TûùôÓÚÙBÖõŽ3D…ñÍÍoÅ–´æ·h{Zì4-›~¥Ó—¼¶{}þÕWr…²:Z8+#|ÌlrpÞ\Àw×ù#“¹k΢šHÇÄí®$ ã?J‹èºÅ=‚År†®†:JªËõÖºM¥¤Êɫ璸´œ“£íæÁ§ûŒÖú©|XÐèºRÑ•µÑÑëí3SS<Šb¹Ó½ò=Ç kZ’I ;UEî¸×\ú+¬–º¥óº-hè#ÝØÈÙM k@€ÿÔ“ÚJ²-}h»gHµºúŽÍwÊÈö¾Oæ1çwV7±²<áÛƒØ^òú³§¯äšáÿŽeþ‹0sÂ"- ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆ+{ÇÊÕŸnÿÄV*ʼ|­YöïüEb """ É+É^ŠòWk‘˜°m?%R}ƒ?YKÓòU'Ø3ð…”¸Ù{ZA!t¼×Üèíôun§0Ûá0Óébˆµ„çÌh.æIˉ9sk‰1興€ˆˆˆ€ˆˆˆ‚JË|¹YÙV¬ûwþ"±VUãåjÏ·â+I^JôW’»\ŒÅ«ÑÝ® ÝÊÅf¨ª’‘•ΆœLÈD¥Žx iÚ\ÜÄgŸ!“Ï3qØìW z‘c¾ÖÏYO•^¶ÜØ8Œ¥ïÚæK Èk\ìgšÅèZ ê5®Žž&x­¤µ.!­s\ç`|Á ’~` [ж:Ê«Žš§Ó46½LÓDúq9›ŠÝNá;Þ[¿?'iË€<²;{V£PµÙ®÷Q)µÚ««„C2jwɰNÐp¼Û-w;¥S©m¶êÊÚ†‚]<‘àÓ†‚VûC@*ôŦØÍ5©+êíïµÐ[ë[©ê8Îò¤ˆÀ÷4ìáääã‘i_s ÷[ž§§§³¾éNùhU-¾áÄ­â¶7ƒ+"Û.¿‰äcsÚG!¹gº«cEX+º¤¨{öp8g‰»ü]½¹þ…‘Wj¬¶\a¥¾ÑWÛ‹KÄ´¤JO75-ÝË8ý!n“š“­oôŒ¹ÉWvšÕ= ò–²^ lˆ–œqD-’#ƒ—;=¤¨ÊëeÞGÇdºÑU²çQt‰Öêcw4±í“þÐq„^Qo,á^ÈŒ¿ik­¶¾òÈ(«k-öªéhæ¯e+„;£~ܹÃ!¤ù'ÿ8,:« òÒ «5Æ[ýè$¥{xýŸ±‘å~ÐìÏhúVë~£ª«é7Yii |s].ÉHÉÒglŽ’3þ;æƒØx ö%®áo¶ãlˆMS%¥ÖËgV©lHö½œGG#šàÓ ã‘ä’x›G2™]+H«²^hîÛªíôõ³–¶yižÙ$.8­#''ÂúTéëý5 õÕ6;œ4”ï1Í<”lq¸;ikœFÝäàüü–Ó©íòÁ¥©-éÛžª{‹M%-Æ´ORì±ÍwÀÂâcÉ?´ZÐçŒ^–ß|¤éRG^nÌ­¬˜µ²ï`žœLxdûLò˜Ëyv+2µ¥¾Š²áTÊJ IêêûA{ÝÿpÊÌ›Nê\ÖÍbºF]RÚF‡ÒH3;†[Èý²!½§èRšN*šÍ9{¶ÚZ÷ÝjNY_Ý&§o‹GkŽã ¶Žd4Ÿ™Hê{uö= ¥­UðÔÉ]ï•tPR]4aÍ¥ÛÎÐâI!¸Ï”9sVå÷¡­Téëý5 õÕ6;œ4”ï1Í<”lq¸;ikœFÝäàüü—βËx£ Š¾²Ó_OG68SËNöFüöaÄ`ÿbÝu•E}·¦ª÷ê_¶¦ó¾xækÚÚŠ&Ôå¼ídžríO.Åð‚ߨmÕWÛž¤ûßUERÉ*evb­•ÌwÆîÉ>7†ñ·8 '–™Q§IjºGSGM%¶±“Ö±’RFèPל1Ì˃ Fsó/¤6KÔϪd6‹„£•±U5”Ï&¹ÛZ×ày..y’0¶Û%Îù¦´ÍM²•õÔ´2SUNÑñtÏësÉñ®ì`Ù#]‚¶:ŠK³:Bé:–ŒKK],5& ãÃsÚúø8ý¶;ÉÿpÇhK˜­®¶»•ª SÝ-ÕtîÔÂèÜGÓ‡p±×w£¸Zt?½×è'¥¬}Å’ÑSTÙcŒFñ3¶mkœaíÆvv(Ým|:ž®;®ŠÕV6q))ÖÅÜm $s'Ÿi*˱Û}émyÓt®­¦†¢è"3TF*Þ$k,¬åpÃO à`–;è+a§Ðº¦j˜iè!šZYD5 ޶G:–5áþK¶=ŽÁç‡4ö´Ž/Öm%|uÏSÜélÖû‚’ JÊÙD4ï–ž¶àé#â; ¢"NH'Á^K¥¿ê(jm·k­ ›Skòcª ¨’™Õ´±i÷1Û^ܦ¥v;v‡4‚áEƒQ ôLSDû$ÅÕ2˜˜c}CÚcŸ—–’Ü0ùNÀÉks¹ÍíàëF÷?ï3~u G[SjÔqiêAuz o5 ¥©¹JdnÓ’U–I;½Íl²9Ä·crÐDE÷G]ªiàÕUµñPšY¦Œ¬àºçç-Hœâ>ß%Åûwn] »ÁÖîÞfüéàëF÷?ï3~u¢t劓UÃh’¾¢ŽSmlôæmU=š¼É#q§†GÕOäŒÆàæÃÃr㘸µDw{f—¹k­[s°SWhÚ ¾Z*Ù)]ÆV¹Õ‘Æ‘£€[ ÜÞC¾f†ù¤ô¦ƒÔºVÓ¨èlsGIu¡†¶MQ ‘¬•íäaÃ8$gç*OÁÖîÞfüê®è†Ë&¦·X-µwýEECGÑÆœ–{uÖjF6iE`2ü[.ÄL>IÀ܆âO@:é ¯¢]QQ¨¯•× TØÙwmUsßO0’ÕQUäÁže²BÌ5§œ”ÐÞ(4‰­¡§¬†É3bž&ÊÆÌúˆdà 9!Ìw>mpD¾Þ´osþó7çU§EôÚÙ–xï:§T5Œè÷OU‘Ixžœ¾ª~¹¾¡îct‡†Üäî[ƒ°1htOt­¾tY¤¯W)xÕ· %UL˜|’@Ç8àvd’š/Z7¹ÿy›ó§ƒ­Üÿ¼ÍùÖÖ‰¡ªx:ѽÏûÌß<hÞçýæoζ´M SÁÖîÞfüéàëF÷?ï3~uµ¢hjž´osþó7çOZ7¹ÿy›ó­­CTðu£{Ÿ÷™¿:x:ѽÏûÌßmhšAîÀµÐYúK·Ñ[i›Om ;A$’gŸ™'™?÷ýS ó÷l+4?êxÿ:£V÷•«>Ýÿˆ¬U•xùZ³íßøŠÅ@DDDA’W’½ä®×#1`Ú~J¤û~²—1C[r§ ¢·QÔVUIvCFG» ÉÃ@$àî íSôµ2ÓTÃ$Âó‘ÈÒ×1Àà´ƒÌyaq²ö´ù¢"€‹éSôµ2ÓTÃ$Âó‘ÈÒ×1Àà´ƒÌya|ÐÑÐNÚfTº=ѲBÓµÎhisAì$4‘ónH^ª)g§†šY£Úʘ̰œƒ¹¡îf£Êc‡?¡E–â-µJû} |rFc|5q—4‚AÈ ‡4òSH=£8%}/w‰.qÓÓ¶’–†Ž›q†š˜;c ±¹Ù{œâN’Iäù”j) DVBšo5§ÔÉO;vðœßÙ‘Çw’ãØÎX ŠýJYo&ÙoºÑ‹uP¹Ó y$˜Éº&‡µà³kÚ3½Œw”ûvFøªIß-óŸÑOI;å¾sú*_±ËȺ‡ÅRNùoœþŠxªIß-óŸÑTZ}ôƒ¡íš*ÝG[«ôü3±¯s˜ndHç ù|Žåó-‹Â‡GŸ]tï¥ üêŠñT“¾[ç?¢ž*’wË|çôT¯…>ºéßJAùÓ‡GŸ]tï¥ üêŠñT“¾[ç?¢ž*’wË|çôP^¾:<úë§})çO }uÓ¾”ƒóª+ÅRNùoœþŠxªIß-óŸÑAzøPèóë®ô¤<(tyõ×NúRΨ¯I;å¾sú)â©'|·ÎEëáC£Ï®ºwÒ~tð¡Ñç×];éH?:¢¼U$ï–ùÏè§Š¤òß9ý¯…>ºéßJAùÓ‡GŸ]tï¥ üêŠñT“¾[ç?¢ž*’wË|çôP^¾:<úë§})çO }uÓ¾”ƒóª+ÅRNùoœþŠxªIß-óŸÑAzøPèóë®ô¤<(tyõ×NúRΨ¯I;å¾sú)â©'|·ÎEëáC£Ï®ºwÒ~tð¡Ñç×];éH?:¢¼U$ï–ùÏè§Š¤òß9ý¯…>ºéßJAùÓ‡GŸ]tï¥ üêŠñT“¾[ç?¢ž*’wË|çôPh^ë»ÕžýÒem–éCr¦˜Øéi*+Zî4Çi-$‚?¤*muФòß9ýñT“¾[ç?¢ƒ—‘uФòß9ýñT“¾[ç?¢¨åä]Câ©'|·ÎEŽõU%‘•n©tÔ-©{‰ÈkŒ²3àda€öÒ´4½ãåjÏ·â+e^>V¬ûwþ"±Pd•ä¯Ey+µÈÌ\]†Z;ýaCüF)>,Ñh›Ê¾Ë u]-Æ–(ù¥`seŽræ<5ã- FÝ®Éý¬rZî…ºÉc©³Þ!¥§©šˆE4QÏ»fö€ZN×4ò88Î29äd/Z,7êM/>µ´iØôÔ²ï ¼K3j§.¦’¦œLYyC¤Î¼öŒãÕ.ZÕVù(i-Vë\9¯¨“3ön/{ˆóÚÜ àãÆSµt¿ ­Ú–;-®)íì°Ó´Îa&†ÄçfBâZÎÇv ƒ—eª!é)è$¶WTT\xpðúµ7ÎëvåLÚ9óíìV7@÷Jû»Y^íSõzû}’®ª–]wXèêœÇaÀƒ‡pAJ¯[sc).TÑÚíÍesÚæ¸Æç>”5ÅÁ±9Î% ç$’ÉùÕ¿îC¡¤ºk ûeÂTQÕÂ`¨‰ÿ³$o‚¡®iþ‚ Hë’îµö}9IWnŸ4—»M+±®ÌSÜiᕸ *9ÜöŒä`€T>šékÖ¾­Ó"Ûl¦m%Lð9’Ý€¸Ä\æÆ>%ä ¯kÜH{IŒª.bަƒß-W©o4飞’ß]4äŒæ79̉²ÊX@#ˆ÷sœ‘•–ݵu.¡¬¿^«ºDÕ445D`¥–V=sŒJFÙ\÷5 òj:¦Ë&¬Õ6»U+ìN‚òeáK}Цµ¼8Ý&j)ZÐ`cG”ü5ÛIžԗ½]MÓ›°Úhí“Ùk-µ5‚¢µÑI˜ê(ØéË£dÞKw´<ÈíÅ›]Ÿ¦´TV ÚsC¨¯ÆÕI¸RZ4]Rœ@hÄbW5 ù-{ÜÖà` fßtÜW=Eg¿Gt¸[«mbXšê^lðJè,2 ï!Æò[µÃœWZ U_,6©ÍFšú~Mis·ºà.8œIQzž(ÞØ8x1‰ek 2v¤ œ·tÙdøoï _b4âô,…¦û¹u“/p¢Û¸ÅÅòwoÝ+nÞkqøjø9ïX­êÞýû÷»{wñýñ÷ÃnvãgÉÆ3³–så/œ**[Ûë­úŠýCE-a®šÕÑ Y&s÷½Ù1™Zü¹Íl®%Ù'!Ò…ïWZoº.—KQÛ*›s»ÍMWmk©Û(m L­s`”µ¹ˆ¼¸AÁkÜ[ñÕ=!WÚ+/óÑéÆ×XôÎÏ~ë]]–,ÂÉßÁ‹aì†F=Ù{;p7¶-c¦âÔpÛÿö¥ÂÕWm«ë”u”<.,2p¤ˆ%cØAŽYCškéÁQ:£»]îé_U-ÚñIGtáûín¦š1MpØÐÑÅÜÂñ–5¬w ÌÜÖ€rE_zG¼Ûnz®Fiç°iJˆÙs¸žÙLF–™<2cdÙsKÛÐA$í~´¿G¦´ì÷gRËXöÉ <ñ¸5ÓO4¬†(òy ÒHÁ“Ùœ­)½ÍwÕšÚ®ót¼ÑÚo7hmôõuk3(i#"@Zç°#•Ž s €ÁËv­óSÙ(uŽ¢Ïqˆ'ÚwÄòÉ#{ÉáØæ½­p?1hA¯\µ^£µÚ(YpÒô¿Ü®BßACÓ}<Îá:bó9ˆ9¬lqÊOÅ“–² ‹¨éðÈhhaÒQ˨%Ô°ÔЛl0J(¤¬‰¸y|f&±ß°‡Ÿ$–í3uZ!•–(¨+õ5þ®ºž´WRÝd’UO0nÀXˆ …Í-1CÝK‰KV‚µÐ>Ù;«îU•´7i/UÔHÃ-]Kée¦.—kp"—¬ c1ÈCYªé3TQÛµ³BÒÇ•‘;¹—­Á­l,¨s©¾$± Œys8+#Sô‘}´Ï¬j©tt5–]#( ·]Drˤ†ªC \"æ²^msØI!»%ÏEZ®}ck𢵰êî'_sÐè÷ÑÅHxYnÅÂÓåyDžÌ¹è«UÂϬmsTV¶]ÄëîcÚú8© -Àø¸Z| ï(“Ù€>ƒXߣ¾>Ó~Òl¡¨šÕQt·²šæÉÝ; tM’)7¶6E(3Åüç3Ê>_%¬AÓ]'VÔ»àÓuõ–keî8lš•í’:`7Å3„M0<—°%ÀåØ'i }ÕBÓ©+ EÌÔ¹®´WYß$ÚÇÁVa2çpwÄ0Æ]ÈòÆ·7DÖê¸kc»jKt5VË5Ó´CKSÃßÃlpµ¡ã„Ü8‚Oó·``>¯éágª¬f²ÓqÙ¡ŠÉW{…ôÕýmΧ¦1ñ›#xl ‘¼hù4½§'ä£,÷=Iqé·Nü"ÓpY\4½ÖX7´SmË^xlÛ#vÀno”0ãϵûJÚo—Xëîl’pÛ]e©ôåÃ…,N€Ê1œÿÙØäçväb'Lè,Úž›PÏ©u æ²–Ý-¶œ\g‰ÌŽ  È‘´— |·â Ü]äà>½]/M·>híÓ”¶‹}K^k\'ˆÊúÀdˆ<§9ð†™kckÁ%î`øé^«îõ– ë4ãhl𛼕­®âË."|ìãE°·ÃÞݯf Ø¥ÓqnÝWOt¸RÔ:‘”ut±ðŒqÆetB@æ‚ÇO#c™’pr9(9ÑÝ®Ét ªŠíx«¤µq=é·Tͦ·oiiám`yÃæ7ˆçíkˆ!5ì;N:*ÞlV[­® umÀ ê×0Ã4u4M5 ‚ö™blƒ‡å ™åG´ãén5 ÖÝg¢Òº.:ÝÚR×{q¯¿¼ÛT& €Êèžùdå»öòK‹OíXu6JYõU£|“ ºš(˜á–NøòF3¸fc dŒFh­jÒ|{ª+eàY-öFõ‡µÙ‚ÂqÚÑåž;÷ÆàyHzD¯¼Åm~Ó"ïÖlt×Ú†Ô× S=@wŒò¾WpåòNÖœÞ2&„¾ü÷,Xu7Uë~ôhŠzî¯ÄÙÅáPµû7`íÎÜgì*F>Œm”¶Ë= ªÿµ{Ûg†Êù©'ˆIYIpÆJ]qŒ1À½Ø#*WàU«Ágƒž±[ïO¼žòq··¬p8Û¶íß·žvã?69 ‹ªÕÚ¶­¶¡£íþÿ\ÄõÔo¼¸E$"-òM(€ì“|Ìg dƒ¿ÇÊ.kîtvH,q•7»Ÿ]âQV×ux©:œÂ òµ’¶g5ƒkíÙä2§õn–†ÿSC]Úçf¹PqM]otbV²@Þ$dJDZÍvÆ O64ŒµQ¢ÛhÓ¶Q¥éõ•ö™&luºÊfÖ¹“’ùÜãV82q$ sñÏÊn @!—¡zAŸRWZ(ª¬¶O_ áòÆê¡!§u¾º*BÆ€âó.샆íÇ•œ¨AÓ ªß@顳PÖ×Üî´P Åé”4¡”O§|ŽÌ<ÜCcXã周ÒåëEtgSK£¬L«½^,—ê n ª*˜¦™Œ­©uDHéc{%çÃ˶äº0A b‹£Km¾Éo µßoÔ5–êŠÉ鮌ž9*Ç[ÓNÇ#s$kžáÉì?°ÃÃ(&z<Õ4zÏGÑj:ÆÃRdaÌÙ˜މá²7É{w±Øpäá‚;V­ zG¼ßéô¥}ëHÇf·êªpûd±ÜúÌ‚^®ê€ÉYÃ`htl‘Íps²å“…½Ù( ²× «ëkÝâêšÉå—â§0«î†ú7›Oi]%þéy©¸Y­0²;mUDRSÛê]dÆ3Aq‘€¹ï kˆnAý°t‘¨®š.Á¨£))çÔýY¶:/~ +¥‚IÞg˜ØãsÁoÎÍiòVpé »ÞÞ¬tã~{õï'½xp:ÏWë;¸û3Âêÿ»‡»¶ç’“v‚µ·CØ4­=}Ê•š~*v[+â‘‚ªA ²d°°¸°¹®…¤9Ãn øŽŽí~ñu}oá゙üq£ë½onÎ6vpóÃø½»6lòváf·é-ÚBŠÉO|¤°Úïwn°[ ÎþÊZÛ h{ºË£%ÙßÖˆ÷ÜÃv»õ1Ò/§/–ê+Wòj˜ê«å´ÖúwÓÉÂ{:Óc‘®.~î†8ä-®¿E²®ŠÛÿêKô7kwCxŽHMYdkƒ¢19®!¾OhØÜ´/íËGÏWf¤·G¬5-+àl­–ª9 |µMåâA$NŒÿFÖ7häÝ£’SÒ]Ušùj´‹=®)k¨"«Ýr½2‘’>G9½^™ûÉæy·sûÊå¯úl²i-MtµNûŽÊ"7&Ö_b¥¬vö6LSS9¤ÎDoiææd­ÜA `½tml¹iêM7êùAb‚ݲ[m<ñ˜ji£ZÇ™#sÚvò/ÌqÉä1›wÑQV^ª®”Šýdu~Ãp†Ý4Mެµ¡Î/Îc¶5­Ý˜ì5¼ùu!ÍI¯Ñ±Ûm‘ðå†=Õ—aMUR$c^d¦Ñ‘;Cˆ±à@Ìþ¼ÔÓ6sdVç c¤¸Ü™CK òÌàv· %®9p匑‹~ÑP^¯Ð\k¯×§QÃWhµ‰"ê¦x ]ùÆenÆ»k^Ö’AÉÎ^´Òôº¢’Š)««­õúÆÖÑÕјøÌönF=ŽòdxÚG<ö€@i6Ζå¼Yí²Øl¶ËÍÆ¯P>ÂöQ^Ù-em•|VT¶2$cŸ 8eÃisv™6ô…sê2QI¦a·Ácm¹·Ó:sJ*÷õŽ<>®w“ÃÝÈ·i+6ÅÑÕ²×] {®÷«…dwÇ_=dѹÒTº€Ðí¬g ’ñŒ4¬‹®‚µ×>ç;kîTuµ×hïÕÓÈÁ-%K)b¦‹s pb‹¯{óÈ€'¡Ú«eç¤)îÖÖ[kN¦cf§düf4¶×@ܵû[¹®8ÖœBˆè{Ušš‹†—²Û|´Z’öûÅKåáEB×Ý*Ýs´™%pÁ ¼Üæå¡Û¾‡ÒtÚR;¯çs¹Ïv¯7 ºŠùù1†(Ž65 7l-;@À$€0í}Y­wZ{µ¶¦áK_e]D³Ç#ªeMDµ‚Q·ˆI3‹9nn9;%ÅÁS¾éî:KÔ4óSE_hèú©ÍTú™#^¦pk¥•#†p^în<Ï2¬Þ”/zºÓ}ÑtºZŽÙTÛÞjj¸ëk]NÙChjel{›¥­ÌEåÀ ln ^âÕ¿¢ûºŠ†*Ë›¢£¡²QF]#7ZªQNO‘ûN{ˆÌG솞jsX鸵6ÿý©pµUÛjúåe ‹ œ)"$ Xöc–FæŸÚúpPWNÕWÍ)¨zR¼Sé¨.Keâ:ÛK®<Ym4A |7qÖ4¸‡9€äIÎ2õÿM–M%©®–©ßbÙDFäÚËìTµŽÞÆÉŠjg4™Èí<ÜÌ“µ»ˆ!n7=j¸Yõ®jŠÖë¸}Ì{C£ßG!áe¸ O”å{0Î¬½U](5úÈêý†á ºh›YkCœ_œÇlk[º71Økyò5ýOÒEöÓ>±ª¥ÑÐÖYtŒ \*ÝuË,b’© 1pˆsšÉyµÏ`8q$†ÍéýS{ŸVC§µ›†Ñ-e¾k… ¡¸u’øâ’&HÉG ¢9g‹“KÚrpîK&碭W >±µÍQZØuw¯¹ht{èâ¤<,·âáiòƒ¼¢Of“©²RϪ¨5ä˜UÐÐÔÑDÀG ²wÀ÷’1ÀÓ3 `» ä`$Ñqg»cùY¡ÿSÇüyÕ¯?vÇò³Cþ§øóª1oxùZ³íßøŠÅYW•«>Ýÿˆ¬TD@DD%y+Ñ^Jír3 §äªO°gá )bÚ~J¤û~²—/kB"(ˆ€ˆˆˆ€ˆˆ {Fk E£«%¬Ó•í¢žV†½æž)N{8v3Ìc´¨Aexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TAexwé[ëWÝôÞ­<;ô­õ«îúoV«TA9­5n ÖWH®z’áתâ€@É81LjÜà0ÆÚçsÆy¨4D½ãåjÏ·â+e^>V¬ûwþ"±Pd•ä¯Ey+µÈÌX6Ÿ’©>ÁŸ„,¥‹iù*“ìøBÊ\l½­ˆ """ """ """ """ """ """ """ """ "+µÞæpÓµ×½.ùTÞ©$ŠìñjÖýù¥¼îoTž-Zß¿4·Íê”Ø¤Ñ]ž-Zß¿4·Íê“Å«[÷æ–ó¹½RlRh®Ï­oßš[ÎæõIâÕ­ûóKyÜÞ©6)4Wg‹V·ïÍ-çsz¤ñjÖýù¥¼îoT›š+³Å«[÷æ–ó¹½Rxµk~üÒÞw7ªMŠMÙâÕ­ûóKyÜÞ©Ýÿˆ¬TD@DD%y+Ñ^Jír3 §äªO°gá )bÚ~J¤û~²—/kB"(ˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆ ôNáýøÿìÿÈ/ÎÅú'pþüöärXª¼ð5}»OõmÝvßWYÆßœ )Ù·n9îëÎF6vò޽k[UŽñv¦½8QPÛhè*_XKž ªê'ŒÚÖ’0è[åsý¾x Éõª­7™/Ö½E`ê×PAQJêjÙSC9‰ÎøÆµÅŽ‚2× dcžV—¯¬Ú‹ÞK•úäëT‹ÊÁGMOß5< †ç£Þ÷5Ž~_;Éò[Ë}+#y£ÖzrªÓ_tÝýø*©¥§– ŒÑÈÖ¼d·Éò¾l¨+6½·VêÍDç\&ŠÏm¶[žb©¢’ b¨šj¶¸ÞÆÊ\ðÈ[ƒœ·hò¹üë4Ž¢¼Å{¹]$µPÝ«}ïêSK$ôñõ)ÝQîcíò9ÁØhÃpp¾3é­w]W©®²ÕYíU÷:}-#(jåvÆÓÍ;åk¥1µÃ{f-5¹nã–‚â¤/%ب,fçKαÑܨè'¥6Ú¨ê!3ÊÖº# ®s›–€òw8)kÆ´ÓÖ˜i$¯¨«ˆÕSõ–DÛ}CædX|‘µ…ñ4dd¼7‘Áh´=êˆýü«|”,¨«užj:yïu•á²PÖ>¡Ì|ó´¼5ùh­ÀÉò9eÒº¿F^®÷ú}Gq:²kdTU”Qê:ë|q¹{Ù-;A”fWŒ=ƒ 6ä‚úFñq»Ûmö ›ýU[l¦¥udµ íµ…åãnK†ÑžYÏÌ¢®´Ûm±\ Eq†yŒ4ím²¥ÒÔ¸48º(Ä{åfÓì½¼ùñ½iyª:!­Ñvþ«O4– -tþSø1¸Ó˜›ÍÛŸ°s;¤¬^‘ôeöáhºÛ\]Qmdðõo}ª­Í–9¸dü}7–Ò MÀ!Í œŒà‚¥jõ–œ¦´PÝ {秸)KM-D³ !±F×<íÁÝäù8ç…æñ­ôͦ*Ik+å-ª§ëQð)&œˆ9|kÄlqŽ>cÊvô¨ #{²SX+¬tö£p¶²º)¨êkê «™³=¡í’S |m;œÓ»/äÜ€3.Ö}]ñ×Û0±TV×Za ®Ž®YcŠ'Äé^ÙcÚÇ—·3I–¹¾PA-Q¬4ô7êk¬š¢áS5EKI4àÃ+ÜÆJ]KẔÙy 7‘$ ‚¯×¶êÝ_¥ìÖ+”¯ë—iàªÍŠ¢èêžî¯f׆ËY1¸à€ Á çh#.šº‡6¢9èáÓÖËD9â¹Ô®©Üç `&f0O0îÌ ÂXt†¬¢«Ñ–ê—XÍ—JÎþñÍ!©ªˆROO,, c‡»†çs9 $Y+†ºRÿî?ü/á1w*á®”¿Ã»ÿ øLWµ”D[AV÷•«>Ýÿˆ¬U•xùZ³íßøŠÅ@DDDA’W’½ä®×#1`Ú~J¤û~²–-§äªO°gá )q²ö´""€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€¯+Ÿº6ùW_5D6vÓF÷y6¡® €dÇ’§ÿ.ÅF¢h]>0š‡üÃþ4~©0š‡üÃþ4~©U:¦íïåú¦éÕú¿oÅïÝ·kC{p>¡F"hPDDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DD½ãåjÏ·â+e^>V¬ûwþ"±Pd•ä¯Ey+µÈÌX6Ÿ’©>ÁŸ„,¥‹iù*“ìøBÊ\l½­ˆ """ """ """ """ """ "—²é}M{¥u]›NÝîTìyÒÒQI3À´–‚3‚?¤,ïÚ÷êF¥ôTÿ•´‹eð}¯~¤j_EOùSÁö½ú‘©}?åA­"Ù|kß©—ÑSþTð}¯~¤j_EOùPkH¶_Ú÷êF¥ôTÿ•<kß©—ÑSþTÒ-—Áö½ú‘©}?åOÚ÷êF¥ôTÿ•´‹eð}¯~¤j_EOùSÁö½ú‘©}?åA­"—½i}Md¥m]çNÝí´ïx²ÕÑI È$43€N? ¨„D@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDDA[Þ>V¬ûwþ"±VUãåjÏ·â+I^JôW’»\ŒÅƒiù*“ìøBÊX¶Ÿ’©>ÁŸ„,¥ÆËÚЈŠ" """ """ """ """ ""°÷!9ÌèžàXâÓïì¼ÁÇÿ± µ/7ˆlöz۽ƲH(¨i䩨—ÊvÈØÒç; É8œJª}È¿É5Ãý{/ð![¿KÕ5½jÚ::yjjg²VE 10½ò=Ð<5­hæI$jÅõYwe¹\b·GYr¤¬Ÿ<núš'M’'c78nN+bãÍþZOöН/÷_†Z­–[=ì®´•“VWZ碎š8&l®ÇŒsœðÓ öÎp2 cÑü ¨.4Ö …î²ù\ê§¶"ÚºŠv|’EŽ$ %­iÅÀŽg* ‡7ùi?Ú)Ç›ü´ŸíBê‹} zOQ>ϧ.Vý/Qq°²žÚ(ä¢|Ó‹„}aÐÂð×G¹®… á¹sIIÞº0¢¥§½ß§±Yj¬ºrVS ZY¨ŸF Kx¼y Ã\Æ–˜vÅŽ<ûIVoòÒ´S7ùi?Ú*¯“IÍQué÷EldzŽZ‡2Ç_%;@-w”9çoèžš¦‹¢Í%GYO-5LJ8¦†V>7¶5Í<ÁAìDUë馒‚Û’Èö6V9­s‰‘.HÓÿØ.q]îºþô·ý¤_ùL¹Õnx”[E-.—¦Ñöû­ÆÝxªª©¬©¦x‚å,&Âàà <ÄÀc=­ÏÏ««Á.¢ƒ£ël:wRÓÛ&}Æ®jˆ™‚兔쌽®•§¶9pÎ9ö82Õšzžçw†ß¦©ê)ª£¤’Jú;¥tQ¾šXä=›älM8cXòÈ˳û'QØnRXç½FÚWQA3`‘²-áî>HîÞs‚FÈk`8–¼MYdÕt7Ú«ÎåRãp®m<ÑKdtÒFçDç0îh cLc’‘¸\,úrõ`¢·TÇq¶Ñ\t¨|nâæ@XÃóe±1¹3žð¦ïð5ûŽ–¾[è䪪¤­‡v2¦'ËH‰\_2”2ûÓèÍC<s²šE[–•ﯧh˜[µ¤¼eà´‚ÁåÈ€¶ZšŠ*:k­x¢Ñôìž–x¡©¥®¨¨¨œÈÒш]RK ÝœÈÑ·Á ©iä’Ñ£iᬠ{ͽÑme|'ƒ#ª¦ 0ïŠòeŒ’ý¸çžmv+U¬O°O$FèåÅc† \#é[%³LOr¿i‹3¢§¡7hã-©ë‘ÈÙXùž8Ÿµ†¸YÃÈqtxÆça|:I1»¤A,ÓÏ ×æŠZy™,ocÞ^ÒÒAäáË<»!l¶Hâ‡Qôg<· ["¦do¨q¸ÁˆkfÜO/È<7´áØ$£.¿[Fµ¬hìt¦§µÅWP/5g‚ðI-cÃAg óÜÌmÜpµÛ´’RNúwÉ2`¨Žv€y>2Z{~cÈòí v£ššÙyèÖ¾ª¶‹HØRbªŽW@t³íc‰aÙ#i €¿Sèi÷‹UUªHÙU-†@Kz­t5 cé1=ÀnÍ6˜7-#mºÛ#,¨}]M5d•U±EXØ]kŸ°4‘)KœNÂGÐ"¯vym-„O]m¨’]ßIVÊ€cÎa-ÉÀÎyË2wôegª‘ÇßZÉ_jãt­kã§k胷€LRs#æã77~ÆXnï¿h_ï‹K„1†—I8Ú ·gçœ/íÆÁu¡ª¥¦š™²>¬í¦4Ó2vLsŒ1ñ—5Ç8<Ößq¢µM¬vÜj-5ŽmŠŒR°ÜÙÕ¥©Žž“Fü7’ÿ9¹-o<8÷¸ºš ~•t5ZzÇ-%öWNmµ½oªoÅ“ºW¹øá¸ù$³É“<÷ñZmãM^-4-®¬§‡ªº^ – ˜§kdÁ;cs¶»§‘XÚ»c)(¡2ÌàHI$òI'šÛu£(¢°¼fÕK]-s\`´\8ôÕ, Ç:0÷ÜÒ@hÈå#¼‘…¤&ƒÿjÛæ¨ŠšK…§‚i]µŒx–9s¿š#,Éä7sÀÉZ–ëhϲiˆõfŸ·êi¾ñVÚx碬‰áûœK$nöÒæ’?³–r!,ÖKÙ²¾Ž(„PàI4õÁ Î|Žkrpp3“‚¶})GïV´ÒPUê Í•sÄ+£4ÔlkØç;‹¿‡½ÍŒäüÖ ’@4´žøiŸx"®·A_Cršg¶jØ£Šv½‘³-”»†í¦';˜“-Ï57Dm.—¾ÔÞ'´CCšø tæ+ç±­ÜK2~3Éò€fIÆBùÝôýÒÕK]\PycÁUí;\csƒ]˜à­¾Ï$Ôt40\íæKn­¤’®JÈá‰óIHcXùÐì:xãæ’<‘•oŒ;£KÁ54mqºQÈÈ]UfsYC^æÆ]¼€e˜9ÿØv£à­÷¨uÓGÎ…Ö#ãð±»wn9îÛŒsì_ÛF”¿]©£¨ ¢d¢mÜÍDl–}¼78>LG’0Vù%Ö×Q©äÕ0Û´„†cTÚ©kjRÏœ0Ó \ñû8 ?HjŽÒ®¢’Ïc’áp´¾š”<¾¤Võ[…«=ßÁ›·ˆÜ1ÜÞG.Õ;Ý*¹E3i–½šb÷=ÒŠš‘ý_¬ÒJæ‰j°ó·†$í<Îåô¨e´t†œ÷5Å}³Au¤»=O»ke¨Ãk‹Nq üëSé¿¡vtq¥)︺¢Y룦lbMíÚèåq'Èná§´®´è®VSèdSîûdv×4ƒƒ#ˆ?÷AþÕTû·äd½[²=ùˆvý™Ñ\zˆŠ ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆ+{ÇÊÕŸnÿÄV*ʼ|­YöïüEb """ É+É^ŠòWk‘˜°m?%R}ƒ?YKÓòU'Ø3ð…”¸Ù{Z@DDD@DDD@DDD@DDD@DDDA{tÒ~šÑ]ÔÚ®S8×Íw’ E±øbhqpi%¤cúqË;·‡í'ôÕ.SE,ÚíÕž´ŸÑü_Tž´ŸÑü_T¹Më º†ëÓf†ºÒ²š¾4L¨†¥­ß3q$2¶XÝ‘ì{qØqƒ‘²ü?i?£ø¾©rš'XmÕž´ŸÑü_Tž´ŸÑü_T¹M¬6êÏÚOèþ/ªOÚOèþ/ª\¦‰Öug‡í'ôÕ'‡í'ôÕ.SDë ­Þž5ýZÛé}ì—㢕›£ÚÿÙNys@ípU"ÔAV÷•«>Ýÿˆ¬U•xùZ³íßøŠÅ@DDDA’W’½ä®×#1bØ 8¢ 5L™ð[½°ÈóärË\<|ÇÿU3ÄÓ½ßyô”^Π­?%R}ƒ?YK—µ¤ŸN÷}çÒQ{:q4ïwÞ}%³¨ÄPIñ4ïwÞ}%³§N÷}çÒQ{:ŒD|M;Ý÷ŸIEìéÄÓ½ßyô”^ΣŸN÷}çÒQ{:q4ïwÞ}%³¨ÄA'ÄÓ½ßyô”^ΜM;Ý÷ŸIEìê1Iñ4ïwÞ}%³§N÷}çÒQ{:ŒD|M;Ý÷ŸIEìéÄÓ½ßyô”^ΣŸN÷}çÒQ{:q4ïwÞ}%³¨ÄA'ÄÓ½ßyô”^ΜM;Ý÷ŸIEìê1Iñ4ïwÞ}%³§N÷}çÒQ{:ŒD|M;Ý÷ŸIEìéÄÓ½ßyô”^ΣŸN÷}çÒQ{:q4ïwÞ}%³¨ÄA'ÄÓ½ßyô”^ΜM;Ý÷ŸIEìê1Iñ4ïwÞ}%³§N÷}çÒQ{:ŒD|M;Ý÷ŸIEìéÄÓ½ßyô”^ΣŸN÷}çÒQ{:q4ïwÞ}%³¨ÄA'ÄÓ½ßyô”^ΜM;Ý÷ŸIEìê1Iñ4ïwÞ}%³§N÷}çÒQ{:ŒD|M;Ý÷ŸIEìéÄÓ½ßyô”^ΣŸN÷}çÒQ{:q4ïwÞ}%³¨ÄA'ÄÓ½ßyô”^ΜM;Ý÷ŸIEìê1Iñ4ïwÞ}%³§N÷}çÒQ{:ŒD|M;Ý÷ŸIEìéÄÓ½ßyô”^ΣŸN÷}çÒQ{:q4ïwÞ}%³¨ÄA'ÄÓ½ßyô”^ΜM;Ý÷ŸIEìê1Iñ4ïwÞ}%³§N÷}çÒQ{:ŒD|M;Ý÷ŸIEìéÄÓ½ßyô”^ΣŸN÷}çÒQ{:q4ïwÞ}%³¨ÄA'ÄÓ½ßyô”^ΜM;Ý÷ŸIEìê1Iñ4ïwÞ}%³§N÷}çÒQ{:ŒD|M;Ý÷ŸIEìéÄÓ½ßyô”^ΣŸN÷}çÒQ{:q4ïwÞ}%³¨ÄA'ÄÓ½ßyô”^ΜM;Ý÷ŸIEìê1Iñ4ïwÞ}%³§N÷}çÒQ{:ŒD|M;Ý÷ŸIEìéÄÓ½ßyô”^ΣŸN÷}çÒQ{:q4ïwÞ}%³¨ÄA'ÄÓ½ßyô”^ΜM;Ý÷ŸIEìê1Iñ4ïwÞ}%³§N÷}çÒQ{:ŒD|M;Ý÷ŸIEìéÄÓ½ßyô”^ΣŸN÷}çÒQ{:q4ïwÞ}%³¨ÄA'ÄÓ½ßyô”^ΜM;Ý÷ŸIEìê1Iñ4ïwÞ}%³§N÷}çÒQ{:ŒD|M;Ý÷ŸIEìëçY5 Ñ˜¨mõ±Îdk¸Õ— Ùhkc`æH99ýž]¥`" ÞñòµgÛ¿ñв¯+V}»ÿX¨ˆ€ˆˆ2JòW¢¼•Úäf,OÉTŸ`ÏÂRÅ´ü•Iö ü!e.6^Ö„DPEº†®ãTÚZ(4¤óÌ’O æIäc¢›¯Ò—Ê+d·GÓA=%¢ié*á©dEÇy‰ÎÛ’qÏÖæÙYg¸>‚½‘²v±’|\Ì•¥¯`{ÂZàZ朂{T–Q†ˆŠ‚" "",ËE®¶íRêzØç1†I$¬‰‘´79ï!­ d‘Ìó¯íòÕ]e¹In¸ÄȪckæ²VHݯ`{Hs i®‘ùÔßð0‘JSéû¬úœé¦SÆ.¢¥Ô¼Ï¤‚Íîpnrùœœ…®ÁÚ¢Ÿƒ 4œhdãÆdÛòèð÷7kÇÌï'8úÓó¯Š,Ê;eee¾º¾‘¾ 2JœÌƹ­sà Üá¹Í´nÆBÃ@DDYQTÇm†âø±K<ÒC÷)ñ†9ã£Fsìç˰¬tD@E‘n¡«¸Õ6–ŠM)à|Às$“È9’y'_¥/”VÉn¦‚z(KDÓÒUÃRÈ‹Žó·$ãž9©¸!f^m•–{ƒè+Ù'k'ÅÌÉZZö±Áì%®®iÈ'µaªˆ€ˆ²*èªi`¤žx¶GY š¸ì>2yvyQ¼`óåôƒeæÙYg¸>‚½‘²v±’|\Ì•¥¯`{ÂZàZ朂{WÅ”û¨eªãB8r2>Æ;pqÜÎѳüÅÍúSc∳,–ÊËÍÖž×odrUÔ¿‡ 3"wÌÝÏ!¹=€g™ÀÈA†ˆˆ‹"’Цª ¹à‹|tp‰§;€ØÃ##Ÿo•#>@(1ÑEЦ‚vÁWGCÀn,’6ÈÃËékšqÚ3Ïš tD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDDA[Þ>V¬ûwþ"±VUãåjÏ·â+I^JôW’»\ŒÅƒiù*“ìøBÊX¶Ÿ’©>ÁŸ„,¥ÆËÚЈŠ" ""Ø,ßàUÿýóƤâc·«æMÿÙÄàn¾¶%gÔõºiø\xotFA+“–ãÌFA©D=)¯•TÔŠcE_vÂÍíÛ¿±¼7ùñó­Ö¾s¬¸OMSíÚfÝS Ì{úµ$`¸84H_ŽÃ³Ÿ,¯7kHW:AGSo‚:`ðó+iiãs‡ ç6-¡Ç™æry•ô«´ôUy†ðú(b­†ÀÇÓ¶–ðÚÝ¡¥ŒÃ\6ù8 ù 7°³wUUW×ôÏ¿òPÛ ¸PÜ¡…ކŠ(ã¯dÃâ á»i¿Íæ$óÉl©¨ªµæªÓl²ÚiíÐ £ l4q¶HŸsH×6@7º1äçn ¾ÅÒ tô²ÔÛi‹iĆGHÈì‚I‰¸Œç9iÈ9 ï·¤vj*Í@-Ôn¸Ö1쨑ðQ¹¯FÀ\2@ÉÜìçqÌÐùZiíÖí-h©Žé¦i*«Ù,Õëo–©ä _cqcpÌò!ÙwÑ…õŠžÍnº^ú©¡¦%ÔŽ¤¬®¶K=\HÜ÷ŶXË›¸þÞÂKc'çÊÇ´XºAµÓšz[u;áÞ^Øê[KPÖ8à4I¸5܇1ƒÈ} ëEjé&’¢ºvÓ6wW¸>­µN¦¨dÎç2Bæ’2pqË' Ök]GÂÔõ-÷º–ߘáw–MðœÄÃÄaÿùÞÌ̳Í[lzÍ-¾ÝQ-Æ'¨š®Ž:Ù™ñˆ†ðC@ Ëpï/·±}.Z?[Ükd­­ tÓÊAsÍDC°`° gZ,}!ZéM--¾A¼ÈØêK;Xò.`“vÇrÛƒÈ} ZúFU4ÂÁQ¬›l¥¢Ž7ÙhêÄ5‘T]$Ôn1ük]ɦW7çkIÉh"¿Ž¦Hë›XÖÂdl‚P×BÇGœç„m-ÿÝ#åŒ-æÙiéß5Âh¨)§’㎶êÈé*Œ¸vþ|]ßÎÇ¥­'°b".µ„²²(¬Î’G¸5­lñ’â{¹•1š=uÖª³§úz9¢ lTú´:bâ¯SØÀçÿþDäóíZí=t7½=¨"–×m§e¾’:ª7SÒ²9"=f¶™Ý -”þÙqÈbq©Ee5`¬¦ãÓN*Xþ£]0 _ä|cÆã‡?$Aæ°)/÷*Hî‘Óõ62êÃ[zŒ$—nÚÀYñcv Û‚Ö‘û-ĘÕl´í·¾»GÔVÛ¢|o²Lùú½\ £š­ŒšF0 `Žy<ÜÖ“Íak±¾×j©àYfÞùÚ.V¸Ä1ÔÃòc6=™ÎvŒ‰Ñ“ÍU|ŽKT°ÕC–¨]᥊727gs\ZÐ^çg~r^ãüçgóz¸]ÌB¶HvB ()ã‚6g´†FÖ´“Œœf7{D΃©m»UT¾š–v‘ÍÜÂî»K‚GσƒƒÈã!fÇMK¨áÒ•°QÑK_x–ÝU-%; k£oV!ÅŒ¡ÃŽî` àek6»Í}²ŽáGHêq  H’–)K˜pö’Þ`´ƒ–´ö´ýšõp–ÅMd{éÅ,ΞÚhÛ#^ïÚ&@Ýç8›ì·üVáÖïca£­ŽùQtµUYm´TÐÑÔÏ‘‘ËJècsÚ €o~KCòìîúp¥#mìn¥¢·Z' ²ñ&·ÕRp+Ù'qªdÅ™‘¹øÐÐürÛŽkS¸ê›åÂŽZZª¸Ë&À즉’σŸŒ‘­“˜Ê'˜ÊþɪïÒ[n}ciÅ0V‹Œ!>.Þ&ÌrÛ»åØh˜ºÚŒlðà ±í7:øÉžÛO3±Ã¥9Üö^|¬ç£8k@Ö*ýê÷²‡ªuÞ¿ñw‹·…û_ÃÇ?ÙíÏÏØ²ìº–óg¦êöú˜£`ÊÂúhätR|n{IØ æÒ!ô‰Wt¯«¶PÛ*'ßIAÄêÑìhÙ½ÛÌ œŸ¤•dÐÃDE¡°Y¿À«ÿûçIÄÇoWÌ›ÿ³‰ÀþÜ(ŠS^)+:©©Æ6оí…›Û·~9cxn3óãçSJÏ©ê3tÓð¸ðÞ茂V7'-!ǘ Œ‚9SwkHW:AGSo‚:`ðó+iiãs‡ ç6-¡Ç™æry•Ÿäz¯†œßë.ÓETûv™·Tãsþ­I.Î ã°ìçË*.ª¯¯éŸä¡·Ap¡¹C  QÇ;^ɇÄÃvÓ›ÌI‡g’–«´ôUy†ðú(b­†ÀÇÓ¶–ðÚÝ¡¥ŒÃ\6ù8 ù 7°¾uö.k§¥–¦ÛL[Hþ$02:F@×dLMÄg8ËN@ÁÈREg^¦¢ª×š«M²Ëi§·@.Ž°ÑÆÙ"|Í#\ÙÞèÇ“¸8 ,;M=ºÝ¥­1Ý4Í%U{%š ÝmòÕ<+ã n ‘¬nžD;.ú0¾±ÛzGf¢¬ÔÝFëcʉšðñ‡ùlÃ!Ä ÎÎwãÚ,] ÚéÍ=-ºðï/lu-¥¨kp š$ÜîC˜Áä>…:Ý sZRÑQêJ˜møêűÈÀØäcFøÚò%ûq .-ÁùÔÞ¨½Ö·Iiz ³…-™Ís¶œÈ¬©hÛ&Íí8hÉrãÌ’~5Ú3Z×VMYYA$õ<¾IUsœ{I;”…5›¤Z{G½PÑDÚnái=XÊÈÞI{!òÚÓ¹ÙhpqúJÖ¼"ºy§4ìö»l´uôvŠZ§KJÇÊñ%, ÜÙ/aÃNyä­FG'G2ø)Ì]èÄrð[Åh’íßŧ†Ã·8ÈÈ%lr[zG~¢£ÔÝFÛÊyZÀÁ†yl%£¤Œ­Æ6Œc:Á¯j®µûÕFÚJê‘S; #Ogik‡”À2àÒp9Ìšš­´o³ß#·Û­RÓlÁÕ:­ÂÕ‰XßË¥íá».w7˱k=(úgýoIüf­†ïmé*íK%=}3%mã½½Y’Ï·˜âHÜ:L”O0 À²iMqfºÓÝ-öØã«¦½ôò†;æv×’ÜŽÐqÈàŽ`+&¦‡ÊžºÞžÔKk¶Ó²ßIU©éY‘³ [L€nÊl¸ä¾µu±Øê-–ª[-¶¶šj:YçãÒ2Ij4m{€ìÁq`Ø[¿NVE%ƒ_RGtŽžÕFÆ]Xc«o‚ÒíÛX÷1»mÁkHý–ãínµt‘o£Š––’0Èr {ú³åƒ'?#²øù’|’9œ¦‡ÚŽŽÛhžão¤}¦9á½TSESx¡ãSÖCÐØÙ!c›†IqòyHß(`,k=mE¢«¤SÚè¨LtÄõ:ŠxªÅ9m| áfFàÐâ>‚C]Œµ¤mŽ‘­Tn£¤¢„Óºn?qK;[&ÞÞ&í®ÀPÁäÂß§uý ¢¾¾zæÔ‡ÓÎÙƒœw¶BZï(Ì`::ºªJʹ*¦l-’C—adL÷1€4` ~ÔuÓ_u¥’Á\Ûlu°Z,°Ûiâ‘‚Jj}ÄHÖ7 à 0Qw]#­î•òWW[ø³É€çq¡hÀ  :¢ÏÒ4ö‘l’Ž>¯ÃŽ"[Õ›+ØÌlc¤[šÝ­À. m@VÍŒ::Øï•KUU–ÛEM Lðp)´®†7= È÷ä´0ï.Îï§ Y«÷«ÞÊ©×zÿÆuÞ.Þí|_ÿg·??bÝ.6®’.rÒÕRFY6ïgVd³àçã$n'0”O1•…W¥µÝ]²†ÙQA¾’ƒ‰Õ£âÀ6ovçs''é%Yô4Ä[7ÀYÝ?¼Eù“à¬îŸÞ"üË[F²‹fø«;§÷ˆ¿2|ÕÓûÄ_™65”[7ÀYÝ?¼Eù“à¬îŸÞ"üɱ¬¢Ù¾êÎéýâ/ÌŸugtþñæMeÍðVwOï~dø«;§÷ˆ¿2lk(¶o€:³ºx‹ó'ÀYÝ?¼Eù“cYE³|ÕÓûÄ_™>êÎéýâ/Ì›Ê-›à¬îŸÞ"üÉðVwOï~dØÖQlßugtþñæO€:³ºx‹ó&Ʋ‹fø«;§÷ˆ¿2|ÕÓûÄ_™65”[7ÀYÝ?¼Eù“à¬îŸÞ"üɱ¬¢Ù¾êÎéýâ/ÌŸugtþñæMeÍðVwOï~dø«;§÷ˆ¿2lk(¶ˆº>ÖÊÈ¢³:IàÖµ³ÆK‰ìnæV®€ˆˆˆ€ˆˆˆ‚·¼|­YöïüEb¬«ÇÊÕŸnÿÄV*" "" ’¼•è¯%v¹‹ÓòU'Ø3ð…”±m?%R}ƒ?YK—µ¡D@DDÔ>á¿î·OêÍÿN¹yu¸oû­Óú³Ó ½tþ··)S~ÕwKEš¯7sf¨¨m<$S×OO•#±¼² O>g8r·]E§í6ˆï[í®‚Û.ÞeM\qÂýÃ-ÃÜCNGg>j¶¡Óz’ÇWh¾;LÉzê7MDçÛ¡¨€L]q|ÐT°ÈöÆHŒ`‚ðàÙÝó‚Õü´imE§it•Øé¶Ým7^5ž’¢ê>»P&‹‚é\ÈÝÁ`0þÓ|—»nG"%ëUék$T’Þu-šÛn:«ªë¢„Oœcas†îÑÙžÕªëMwp±j+L·õ:6éç‰fäÚûœ´³—Àa±ÆÓó;$î”Fº³ë:›¥(³Xª¨¨*,ÒÈË8µïŽPé7APú¸Ýšf‡7o Ž92y<ÀP”=jš1n·ÝìÍæÅ£(ëb–xž% ÂI«˜ï(‡FìžÐüá»$ý£Sé»Å²¢éhÔ6›…1pžª–²9bˆ´eÛžÒCp9œžKùAª4ÍÂÇ5öƒQZ*í0nâ×C[éãÛû[¤hÇÏ“ÉhºóF]îw½WQm¶ÓÉM[n±º(Ÿ#t´uµ3O¾ñ£.pÁ$4ã³LÝ5:¾ïqÑõ¶ø®‘ÛYOieu;*ß-$¯“¬ïcŸ“.Œ49Ä8@Ðâä-ë¥^­1XêjµmÑ^ª¥¦¥¬eÆ® q>G½Ï/`ÚÖ3‡Ë?´¦µ¬QOcdÆÉb’¾‰cÚ \ÓU ƒÚUÍ«\ÃCd½WØn:›^¨’àÚG>‚;”ôŽ·MJ3£{)0|ß3‡Åµ¼Ë†ƒÒ dí2û…OMWI4¼(Ÿ+ö¶¦"v±€¹Ç“Z =€”h÷zÝ+j­¤£®·Ùbš­Ûcß/éw“Èg–~ŸíXv׊~œ­Ô4°ÓÒÒ»K×Ìø©àdM{Å]phˆœã'ÉÌý!èê‰5V‹Ô52»ÉQ£j%w/ét$¬ {‹Sô×Ms·ÙïTttšb²žGÖÚ'£c^êª2Æ·{ÓÇrâ•ó8ÍÑ‘u¸oû­Óú³Ó®¥\µîþëtþ¬ßôë©P|+ÿ½ýŸù…ù€¿Oëÿ½ýŸù…ù€€ˆˆˆ€ˆˆˆ‚·¼|­YöïüEb¬«ÇÊÕŸnÿÄV*" "" ’¼•è¯%v¹‹ÓòU'Ø3ð…”±m?%R}ƒ?YK—µ¡D@DDÔ>á¿î·OêÍÿN¹yu¸oû­Óú³Ó êTD@DDD@ZßI_à}GúE/üÄkdZßI_à}GúE/üÄj_Дæ‹ùB£ýþ6(59¢þP¨ÿG?‹_ŸÈˆ¾ˆ""" """ "" “ÜëÒžŸèâ:çÞ)n•Î\#m,½»]ÃæK¤náö`ö«‡Æ¯Dw6¢óh}rã¤Aؾ5z#¹µ›Cë“Æ¯Dw6¢óh}rã¤Aؾ5z#¹µ›Cë“Æ¯Dw6¢óh}rã¤Aؾ5z#¹µ›Cë“Æ¯Dw6¢óh}rã¤Aؾ5z#¹µ›Cë“Æ¯Dw6¢óh}rã¤Aؾ5z#¹µ›Cë“Æ¯Dw6¢óh}rã¤Aؾ5z#¹µ›Cë“Æ¯Dw6¢óh}rã¤Aؾ5z#¹µ›Cë“Æ¯Dw6¢óh}rã¤Aؾ5z#¹µ›Cë“Æ¯Dw6¢óh}rã¤Aؾ5z#¹µ›Cë“Æ¯Dw6¢óh}rã¤Aؾ5z#¹µ›Cë“Æ¯Dw6¢óh}rã¤Aؾ5z#¹µ›Cë“Æ¯Dw6¢óh}rã¤Aؾ5z#¹µ›Cë“Æ¯Dw6¢óh}rã¤Aؾ5z#¹µ›Cë“Æ¯Dw6¢óh}rã¤Aؾ5z#¹µ›Cë“Æ¯Dw6¢óh}rã¤Aؾ5z#¹µ›Cë“Æ¯Dw6¢óh}rã¤Aؾ5z#¹µ›Cë“Æ¯Dw6¢óh}rã¤Aؾ5z#¹µ›Cë“Æ¯Dw6¢óh}rã¤Aؾ5z#¹µ›Cë“Æ¯Dw6¢óh}rã¤Aؾ5z#¹µ›Cë“Æ¯Dw6¢óh}rã¤Aؾ5z#¹µ›Cë“Æ¯Dw6¢óh}rã¤Aؾ5z#¹µ›Cë“Æ¯Dw6¢óh}rã¤Aؾ5z#¹µ›Cë“Æ¯Dw6¢óh}rã¤AØS{©ô<±–:ϨÀ?E4>¹qê"" """ "" ÞñòµgÛ¿ñв¯+V}»ÿX¨ˆ€ˆˆ2JòW¢¼•Úäf,OÉTŸ`ÏÂRÅ´ü•Iö ü!e.6^Ö„DPPû†ÿºÝ?«7ý:ååÔ>á¿î·OêÍÿNƒ©Qk}%õé¿ó­‘k}%õé¿ó©|#BSš/å ôsøØ Ôæ‹ùB£ýþ6,E~""ú ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆ+{ÇÊÕŸnÿÄV*ʼ|­YöïüEb """ É+É^ŠòWk‘˜°m?%R}ƒ?YKÓòU'Ø3ð…”¸Ù{Z@DDD@]Cîþëtþ¬ßôë——Pû†ÿºÝ?«7ý:¥DDD@DD­ô•þÔ¤RÿÌF¶E­ô•þÔ¤RÿÌF¥ð Nh¿”*?ÑÏãbƒSš/å ôsøØ±ùüˆ‹è‚" """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ ­ï+V}»ÿX«*ñòµgÛ¿ñŠ€ˆˆˆƒ$¯%z+É]®FbÁ´ü•Iö ü!e,[OÉTŸ`ÏÂRãeíhDEu¸oû­Óú³Ó®^]Cîþëtþ¬ßôè:•·ÒWøQþ‘Kÿ1ÙF®ù*õüÔJQZ©Íò…Gú9ülXWíi5žçMošš÷Q-Q €Ó€æÈãËhËÁÏôaa2zÉ:~µEU,Çf“¸’nØãYCžÂFyqô,H®DEôAV÷•«>Ýÿˆ¬U•xùZ³íßøŠÅ@DDDA’W’½ä®×#1`Ú~J¤û~²–-§äªO°gá )q²ö´""€ˆˆˆ€ºÜ<æ²K¡sƒF%æN?È.`R¶MI¨¬qI–ÿu¶G+·HÊ:É!=™!¤d ý.ãCþV?ö‚q¡ÿ+ûA~pøA׿]õ/¥güÉá^ýwÔ¾•Ÿó ýãCþV?ö‚q¡ÿ+ûA~pøA׿]õ/¥güÉá^ýwÔ¾•Ÿó ýãCþV?ö‚q¡ÿ+ûA~pøA׿]õ/¥güÉá^ýwÔ¾•Ÿó ýãCþV?ö‚†ÖO•Ö¾†™õóÁQOPÚh$²J#-i‘Ífâq¹Àgç óë½úï©}+?æO:÷ë¾¥ô¬ÿ™\6ÿ¯[+%Þ÷°’Ç{ïlËI?íŽ Ú¿š>“V\zXƒQÞ4um‚†šÁUC¾¦º’n$²TÒ½¡¢^f'ä!Ïšä:÷ë¾¥ô¬ÿ™< ëß®ú—Ò³þež«¶´ˆ‹H""" """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ "" ÞñòµgÛ¿ñв¯+V}»ÿX¨ˆ€ˆˆ2JòQk‘˜°m?%R}ƒ?YH‹—µ¡D@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DD½ãåjÏ·â+ÿÙxymon-4.3.28/docs/editor-disksetup.jpg0000664000076400007640000023227511070452713020156 0ustar rpmbuildrpmbuildÿØÿàJFIFHHÿÛC  !"$"$ÿÛCÿÀª"ÿÄ ÿÄj  !1QV“Ó"ATU”•²ÑÒ2357RSqu‚’£Ô#a¡¥BDWƒ–¢¤³Â$46rt‘±%Cbs„´ Áðdv…¦µÄ&8EceáãÿÄÿÄ: 1Q!2Ñ4ARSq’ða‘"B¡3ÁáCbr±ÂñÿÚ ?ééòå¦t„¦SÉI:¢"'ÄW1cvÌð·ùà ÂóUÿS†•AÝúWÅUN²°Ws×âÿÚ“ÞË6.X•ú$îuß-ó'ôˆîŒýϺ>ilæqDgªlSX¬©é/·!ÆÒÓªYGq !¦4ËQªÏÂúJlñ1RbQéÊŠˆ–2ÐìD¬Öµ-&¾íN)¤dRH”Ùß6ÒÊÆ"®*±S¤5VÞöÝÅlRZšL¶j†Â©ŒÉ2NdšMJtÔ‚5’¶º[Ä@6†í™áoó†¶g…¿ÎÒ’qv(ƒN«Àf±&¶óx¹V§Ef"eÂÓÆE¬40nk3"ëÙ™gdû”lzÆ7•‹H~¥.‘*F'rœ¹/· ékˆT÷¤~‘,›Œ¡ÜÉ"+[bR£M”i0ÛÛ¶g…¿ÎnÙžÿ8cÇ §†ËÉvS¶”)÷I$·LŠÆµ )¹ðžR"Û°ˆ¶ UŠ|Jµ&].{DôIl­‡ÂBˆÈËþF dwlÏ œ1j%YrÚS±jjÚ\[F¦ŸÌD´(д܅*J’eÞ22=¤5iO›^¤ÁÑä÷ÔíT¥.mÎ.|Š[§ÿž…°ŸéÕor,M®bùtˆ¯Â¨KÕ7T­7)4â„™¦ÔyÎ4έ2KV¦Ð„ÙÂ>ãmÌîConÙžÿ8a»fx[üáŒ>œÝS RêmJÝmˆËéU«Ö’ÐJ%äþ ï{w¯a‘vÌð·ùÜs¤&0†çßUdkYzJ÷1‘êXg&µÕfZn”ë±9”wØ“±ˆTJ=#³ˆçÕh´Jþ%‰U’Ö笿‘KÆLeVG ”›#J;¥(ÌÏi™a± YŒG‡ðÛ‘¢T S@‡ZjiòŽ8•dq×ê "QSMÑ•}ÂŒÕ݃znÙžÿ8c\ŨäʪVU¸ÐÞšáªRõ ‘® êQ'2ob?t’á2ûTeb~¦ZiN®ŠŽ\ç79$ìk‹¬Seœ•ܪæ“ïØÎÆGc/–äTéøV©@rµ*§ü_’ûÒ[dœ}ÆÊ16£6„–T¼âH’DFFW¹•ÀmýÛ3Âßç 7lÏ œ1`%vÌð·ùà Û3Âßç sv ¢.™‚´sXN”D¾ºA*³M’gQYª"%£PÝõ¦d— X»%k>ê×®¸ëÛ¯~úà,to.ñjɪÝZŒÙ²ëu¹?Ò/›._àÛh”6¾í™áoó†¶g…¿ÎÓÕ\Eˆ¬šÛx´¡‘âö(»Ï¹˜4½ ]I75‹jî_5‰ ؒآ¥úŽ6<>þ#c­*äb5¦•ݳ&I'ö‘¥E´Î%¢|U\F‹Û”fQœÃØI‡aÐõdnOJb%H’¥™\УNT¥³+ÉFjîRßvÌð·ùà Û3Âßç iÅxâÄUŸ©dN™T‰.¡½—D–Fƒaœ^v1Ÿé VÊ’5k ¯‡àÔ A6êu™i+^u:ëM6H¹dB[Jl‚23,Ù•´î£Ù`ÌnÙžÿ8a»fx[üá‹TR¨;¿Jøª©ÖVªîzü_ûR{ÙfÅË¿Dλå¾dþ‘ÑŸ¹÷F{vÌð·ùà Û3Âßç k1töðje9Ue5%c-éMÒÙ(ÙßN«-¸w7~Ù­Ý^ûGŽ-W7MëìNóÌ-r”TÓ†Á2q•VT$‘¨‘¬Î”™(”EÜ‘ÜÌ6*¼UX«“¢ûÍ"CÑ”¬ËMœeÕ4âlvàZWà;\®V1uú²Øv;OÔÔÓ’\6˜JßÊn¬’¥šRF}ÑåB•bï$Ï€ŒiÍTëÍC QÜ;ª¥ièζÓk~¤gQ”J6ÍÄ) KFetØÔg”̉ïÓ£):F´Q©Sª› ¾—ÛgôlïKî“ 46›%.2ƒ#;¯a‘¨Ë` ¿»fx[üá†í™áoó†5F Äué20}Nf )éÄúÝÓKÔ4”ÓìÂÝý¥$¿Ñ©Êó©WRËÜð x«‹ —£ºÍ_½U,NÓmÌŠ¸l4ÓF¸ÉJÛ4 ”J»6;¨ÒyŒÈ“°ˆ6Þí™áoó†¶g…¿ÎÓš6ÅxÒµU¡TgÇ©"ŸW7ŠSR•NDhÆM­iL}[§!KJHR\#;ŒÉl%Zr»?Q«õüA"«.­L‹)HTvZi“[d£ÈM Žç˜³f3+—rI-€';¶g…¿ÎnÙžÿ8bÀ×ÓdbF4¿[ë~•I¨f S5Ûº¤äLŸé ¹r0îk÷W¾[X¸o°6õe°ìvŸ©©§$¸m0•¿”ÝY%K4¤Œû£Ê…*ÅÞIŸ»»fx[üáC†jµèØÒS3Z‰EGîiñâ¾rZSe‡ÐêRN-´+Ý4Ò®IIÜŒ¶•ï«cŒboÐ$ÑꘒL*쌚ã‡Im¥²i5‘ã¤ãfj$¤·A¨¿HDw^T¨7ÔêñA•4ª‹í»Pq¢§2ÏXá4㦛—pÒÎçbîmÂdGêݳ<-þpÆ£§O®Í©á«íIDˆ˜µöTµÅ9+kz%¬âŒµ4•Ýj+®IJ²–agFxJ§à*G•uXš1”È»™†ÓIŒ§MÄjÒJ,«A6²Q¨³8V$ì ‹vÌð·ùà Û3Âßç X _ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÇžUeÈë&Üœþ±Df”†jU»ÅúϽÆ?Fÿëßö†çÿ켫ÿ£ïð „=ð1’PÖ²[ì8é™% tÎöï‘ñw¾›å/þ!d¿XÁí½!׈ò)ZÌÉ&jjæWཋþD:‚½“XÆ£S»¯ú,Ü6ýWÙ{ð_õÛh厯Üûñƒõ¹sîI9²ð_3w·êÇ\ÕjtÖê’Ûr¡ KË%%O$ŒŒ”{h…»Fo|gL‡¤Ú¥?vÈ7Ýj:)dœÖ$–ÕE5*ÈJF¥)YP’3; ÌÝèí¹¶àÂJ\QoM„Gÿ–-v>Ñïòyƒ?«ñ:1Ùxb;è~:èìºvE ÛJ“®Y8팸3¬‰JùJ"3¹J^ˆ‰È‰NÃQÓPB›š–˜a%%*#%%ËvFFw#½î?{h÷ù<ÁŸÕøv>Ñïòyƒ?«ñ:0K/¾Ô¯ÂçÓë ö¥xÎ>ŸXÄv>Ñïòyƒ?«ñ:0ì}£ßäóWât`12hŒ¹:¡&6’êP‘=õ<ó,7KÈfi$‘ª)©VBP‚5š*RFgaM¹–ÝAšIê[ ³L¦#’ˆ9RIGì‚Ixˆ¶ Ý´{üž`ÏêüNŒ;h÷ù<ÁŸÕøÚÌ Z’™UˆXr¢úS)v[Lº´¶¢2RÔFyLŒî\sb8Ô¥£‰tœž´¸ú¤ÇjCO-$‚#u³2Öw-¥LŽÄV2±Z®ÇÚ=þO0gõ~'F´{üž`ÏêüNŒ3P0ÍΤM™B¨7Qr&4ˆí3G‘ ¥bê$¡(m "3W¹¹™™ŒÍ>>§F‹žÍÝ7£4ÂZm,8iR h"Ø•V¤Ü¶ÙF]ó{h÷ù<ÁŸÕøv>Ñïòyƒ?«ñ:0}ö¥xÎ>ŸXµ6£N~Ì5\b#Ž6¤%öžhÖÑ™X–’Y)7.ÌF[6‘–Áì}£ßäóWâtaØûG¿Éæ þ¯ÄèÀ`[ÃL7Rv¤Þ”jÈœóiiÙ)bN¸„ÜÒ•+r\È®v#=—1Ÿ¨Óð5J"!ÔaaÉ‘òä%—ÚeÄ%Õ¨Ö· &FD¥)JQŸ ™™žÓ´{üž`ÏêüNŒ;h÷ù<ÁŸÕø ³uJChJQ‚”$ˆ’”¼‚"."Ú?wÚ•ã8\ú}cØûG¿Éæ þ¯Äèñö“Ìý_‰Ñ€‰Ö° ·-©uœy"¥!¢³n˃Fyh/Ôj†fBHÝ=uÉœC*÷<Ú“1ò;«–\ˆJSm„YR[¯sÚ=´{üž`ÏêüNŒ;h÷ù<ÁŸÕø!ïbFbœŠkÒš‚Û$Â#!m“Il‹) ’[ $[-k[`ñGãÓÓNbj#½1ÐÓ)m,¼d§[$‘X³"5'FE{‹Oà=°Ã»£ì–ÛI­GÖüC±\ÿîÄ'º›~cE¾k…Ñ‚[C}©^3…ϧÖ-M¨ÓŸ†ó Wˆã© }§š5´fV%¤–JMË„³–ͤe°kMþêmùù®FýÔÛó-ó\.ŒÚ>Œð¥r'Ò1S¥¢ù‹L¢4âoÃe& ÖçÁÛù¿ºŠûeÉ»²5º2ÚÖÖ{«[e® ýÔÛó-ó\.Œ7û©·æ4[æ¸] Õs Ñ*øÑšìоK-ÈbJ‰)«S&•!+=õyЕåË}–Ím‚WŸ n]Ëž¹÷FéÕ]¼šín·Yn úÎï7në‡h×[ýÔÛó-ó\.Œ7û©·æ4[æ¸] ‰1X^féÝgF‘ºÙKu¦ÚõÍ$ÔiBïî’Fµ™ì,Êã1v‹£×ilRœ¤áeÓã,Üb*£°l´£áRQk$ÿY…ï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6K°ó!‰¶ž[HeN!m’´3-¹Rk]‹€³*Ü&,°XQ…BSEhà2lC4j“¹›2"ÈݽÂl”•ŠÅb.!¯7û©·æ4[æ¸]o÷SoÌh·Ípº0ˆ”¼‘†£¦ …75-0ÂJJTFJK–.쌌îG{Üf7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬Zbm‡d:ĺkNIp}Hq 7VIJ J2÷G• Mϼ’.!­7û©·æ4[æ¸]o÷SoÌh·Ípº0×°겪îãÇÜ©-HZ¥ªÞ5!D¤¯qæºT”™mØi#.8φ7.åÏGÜû£tê®ÞMv·[¬·}gw›‡7uôk­þêmùù®FýÔÛó-ó\.ŒÃ2†–ReE4±%RÙ/ÑY·Ô¥)N§‰f¥¬ÍE´ÍF}ó©ñpe;)SãP"e”©…¨C(³êA¡Nìþ Í&®#2½„º›~cE¾k…цÿu6üÆ‹|× £?ƒ@ªIªÁbƒ¡/ýbS(i½¶ýÚËj¶ñ˜¼ÒðÃ,Aa¥ÑÛjŸmÄÚM²Lk Û-YÈR“²ÝÊŒ¸ k­þêmùù®FýÔÛó-ó\.Œö4L²íj4l>ÅQâ2vkm²—Ü¿e—tÎcÝ m6a×M†ÒÓ,´â†Ð’²R”–Â"""".­7û©·æ4[æ¸]o÷SoÌh·Ípº0C}©^3…ϧÖ#5ZdyuÙ5hzDJrCm´¦â&šdHEò§3±Öá‘–«)GcZ­b;®ÿu6üÆ‹|× £ þêmùù®F9 DˆéõYñU&âÌ\÷–Ô$-Ùq’¼ì6×NbYžFìi$™+8Å/0™Éb†šMCýtÃR{ÿ¤±wÏqßî¦ß˜Ñošáta¿ÝM¿1¢ß5ÂèÀOéì`êth±©ìÐb1 Óv3L%¤%…šTƒR¶%F•©7-¶Q—|Æ+P0~¢Ó¢Ãr„uÔö!H¨´ÓL½(šm)̳#3Û–ö3;q˜Šï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº1˜Âq´‹*Цa¬?£ª´Ä4§–ÔZ45šMˆÖ«7ܤŒÈ®v+™ ÆûR¼g ŸO¬7Ú•ã8\ú}cØÏ'øÌð}á­à­Ñb7*¥ð+ ;%˜­™Pá¬ÔëÎ%¦ÒD–ÌÎëZK‚Å´ÎÄFdÀÏoµ+Æp¹ôúÃ}©^3…ϧÖ1´{üž`ÏêüNŒ;h÷ù<ÁŸÕø ¾ûR¼g ŸO¬7Ú•ã8\ú}cØûG¿Éæ þ¯Äèñö“Ìý_‰Ñ€Ëïµ+Æp¹ôúÃ}©^3…ϧÖ1´{üž`ÏêüNŒ;h÷ù<ÁŸÕø ¾ûR¼g ŸO¬7Ú•ã8\ú}cØûG¿Éæ þ¯Äèñö“Ìý_‰Ñ€Ëïµ+Æp¹ôúÃ}©^3…ϧÖ0¯à=°Ã»£ì–ÛI­GÖüC±\ÿîÄ'º›~cE¾k…Ñ€ÚíJñœ.}>°ßjWŒáséõ_¿ÝM¿1¢ß5Âèú›~cE¾k…Ñ€ÚíJñœ.}>°ßjWŒáséõ_¿ÝM¿1¢ß5Âèú›~cE¾k…Ñ€ÚíJñœ.}>°ßjWŒáséõ_¿ÝM¿1¢ß5Âèú›~cE¾k…Ñ€ÚíJñœ.}>°ßjWŒáséõ_¿ÝM¿1¢ß5Âèú›~cE¾k…Ñ€ÚíJñœ.}>°ßjWŒáséõ_¿ÝM¿1¢ß5Âèú›~cE¾k…Ñ€ÚíJñœ.}>°ßjWŒáséõ_¿ÝM¿1¢ß5Âèú›~cE¾k…Ñ€ÚíJñœ.}>°ßjWŒáséõ_¿ÝM¿1¢ß5Âèú›~cE¾k…Ñ€ÚíJñœ.}>°ßjWŒáséõ_¿ÝM¿1¢ß5Âèú›~cE¾k…Ñ€ÚíJñœ.}>±ç•*…!dã•ZÄ‘’VRJMûå·„»ÜC[ï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6¡FCZÊœ'ÜhÌÒµ>’µûÄWàïý71Ë_2#ɬa'#>ÓÈ(òHÔÚÉDG™½›ñ¡? íUŠU£zŒ÷ïª Çdš”d’nö$‘™ŸxˆÌöÐ]J«…X¡aú-·’· Nf6°ó6E›V’Ínõïk¸LLsC´j?IÿÍWýLEªõj„¸S¥*Üí;i&Œäó©IÙ¦’^ìó\ÀYŽäRJôtJr|W ICÆãj4ŒˆîGcï×x–¡7ÀS5&ˆÙa“(ï²’Co%)Ø‹Yµì൅=ô–_¤ïÞ³o6ã»Û=^–ÔÞÓÚÝDw{g§çT¾=n"ž‹ôKŽü•dlž†óiRÉ&£I)I"½’£áï ˜€Rh³­Ó§<Ë(ŽÔ’³ÝF³±6∲'ç/ÃÞ©±Û— 让ԶójmFÓªidFV3JÐd¤žÝŠI‘— ôi.^¹FoS‰ËÓ¡½~í¹ªý;g<¿eÑf\–b0o¾£J INÄšŒÍFDDD[NædB3£\î§K'âI"L…9ºjó–ú›lŒõm¥&f”Ù'Ý(ˆj¹‹*Sž¯E~e1LÆÉ­'q$µäq*µÈŽÞçˆzÞ×’mFRå5¸´¶–Ö§ Du¶•ªè$§2ˆ¬fF­¥~ ¤2ù¬ÍmFÞd8Ùåu¥•–Ú¸Œ¿ùð dâ•Jy†e´–Íä¨ÛÕºn&’2¶R;÷EÀ3Ø~ ­ÒU¢V¬ÛCEc2MïÝ|ÿaw»æs8à'ÆLÈnÆSϲN&ÚÆ\4-'Þ22à?þŽä,Pà*›Nn+“$Ít¶¸ówís;í;™Ô~×jQ¨ôyuIfdÄVTêíÂdEÀ_¬øº§bÊ•eÖŸj¿&)<æ­´3 )Œ§>m+u“ÎwÙîË7x‹€¥º@RU G¥&4YRÍT¢hÈЖ]pˆõ‰RH³!'{w„F­BTqŸLЬv•ÓÙSÍÆTw¬d¥š›J6Xû×Ù}›v}/¢4´~êUDU3>Þœ»¢cÏïÏô®ªZ-EÉ£ôÏï<ÿÂQ„ª5¹–¥ «2,†‘ ;ì%† ²Fe¼…^ægsÕ‘žÓ"à.3•ˆf‹ ­4çªÒZË&R²‰çÌÊTy,k33-ª2=—Í{™ŒIlâj‹qˆŒG³ÙË÷kh"çOêNf{ó󜰲¦N™%Æ)¤é$³V­)5¯)ÙGeì#ÙÁs> œ>fêU™ rã>“Ru‰A¤¸Tœ¤\F[Ki~ºt©UÅ?%‡œSKuÖPÒ­œÔ³4þOuc¶Ò>ñ‘íòâ‡\’ËÈŒóSÊšq ;¡Gk¢ûH¶Üÿ›„Ïo“Z^FFDe´€y*ÓÛ§ÆKŠBœqÇÓ-'a¸â½Ên{ é>é`,¡'°É$Gÿ!Äñ›Fr<˜Ç*9¸ÒÞh¸V„¸•(‹im±çTUTb™Ä¦&#¾X:íB¥9¾Ë)ÎÝ-6”´L%WÚg™²"ås5ÿQ‹%„+««Fr4æÒÅR-ŠKI#$¨Ü¸‹íÈ«¸ŒŒ¸Hcê,¦ƒ£Š® ¢ËntÍkME~mß$6n6“E”wØJ^Ãà;ܸG«LU›N©›±$N].ìq‚M’ò®n'g¹;‘]?¨¸‡›C¢½¦³?¯rk¯=óìùB÷oSr¯è§þYj÷ÀsÿáœôLcð¦/‰‚z™pMjC©óÃô¸ð⤅HyqÛ$¦ûL’’̵™-¡ÅeV[ …{à9ÿðÎz&5î0Âõ¬IÔ‰€ÃÌ¿*£F¤Ó*(ˆÃyœ’Âl¸”XÈó%­Â"%²Išˆièè·]ú)»8¦f3=#=òó_ªºmÕ4Fg›XV:¢1ªJ¨BÆvÜA”&(ìî'­À”¡I\ƒmd•]IxÌû³B’DDž‘ê|ÒŒ}(`åÎu¨ñkKìºJBŒÒJCí•ÍDÒÊöÍÀ¤8’5äÌ|—™T}zq £nÆyˆ™¶Îº»·ê ÁõZ>­âÚš_e¬@¨É‚ÛÍ’TìvRá¦EÈøSë",©¹6K+¥iqþ§ô^ƒI£¢«4Å5wcï¥u?罉è­N¢åÚ¢¹™ßÙþ!¼!×wF8ªaË—pSaÎÝËë7C²‘“-¶eÜ×½Îùø Û}ŒÕ =\•DmüÓâFfSídWpÓÊu-ªö±ÝL:V#¹eÛk•àuŒ DÅ:^®ËÄøuºœôÆ"®S&¦u›¢ nd¿s¬I)³¹wH%•Œ³m‰hË SœÄôiø×ªµgR#»6m O+u¡‰Hš‰›fM-M-¦ÔNšs‘6Û(ø6ûtЪ+”8º[û¢B3r¢»‘IÖ4âIHU”Det™ŒˆøÇ´sdz6¦h§EYØ&kH‹]ašý5ª#¬»&[tyDû†ÞB9Et‘©i%“‰I‘¶Ø82› >¨¢F«§»Š"?B¥&3=¢z&­ÍIšTÓH”—4™VÈî›w 'LUA¦o¾íŸ«ÞxíÈfV­R͓ܤó(òr›«ƒgtWÍ -þßÜŸÂë¿.bÿà)þöî/q±³ÿ´~³måw®ëõ³Vëß®ÍÓ¿›‰ÍVõî¬ùwU²j÷èu9¯ŸnOáÞBÌœ“<‡¢= ×ZJ×ãA¸É™\УB”“QpU(®[ ËhÓ¸bŒtÝ6.DJ ‰ª“QšôÊŒÚÑäÄB’â’e?6ªK£J͌ҕ ÎÆƒ´7‚z¡‡gâ|2µ?JÀxm˜§>!Ú<¶ŽZœ"%•’ûg«ÿÆŒÅÁ›hnx9& yDz®´•®;ƃq“2¹¡F…)&¢à<ªQ\¶–ÑŒÆUÞ·i T7.êÖÔ AɬÉmÓ-˜ùïc÷:ÜÖïåµÊ÷-; Ë‚0§ðÄê­j&§Dn“??)¢} ÷HmöÍ'O‘s²]ˆˆ‘òNÛSLl9ˆhoadQê²U* ‡ži•N2º£zÒBÒwÌÚR×kdJ«íØšÄX& =ìoC¤Q§RpäªU"J¤Sm.IJ•¯ÊÊlN]¶ã“­§ºRÖ3Q_ #¦á•¬-„‘ ¡ ­&$B£½Omøò£!²‘¸Ü3\t&A0¥¤ìYXZìY®€ç¹¸?T©’¨õÊ}Zst)”Z9*Bõ“"Y‡ž’KNÓ-ΘÙÖ^åLºf}ÎÉå—b¼g"‡†%1@fƒ{P)P»™’¹Úä°ÙY*yHDr4•ŒÌÛ¿º#/ÇuÞµð={n]×½Ù·>³&·TÒ—“5-òÚö;_€ÃWwÞ¯ˆéû—S¼•$AϬͮÍ<Œö±eÿXËm¾â÷ÛbÒºv ³>6‘[«`ÚÝ~·:žiÂò¡S]“©kr%&ÒA2dù<¥$Í&âVDD»åY´*Ât­ˆªÕÊEB«ƒœÄ,, 3j³ûß ÌSdFrYJФX®M­«(ÒfØlŠÆ2Ò0ËÝSfÎLY$F¤”T®$¹]òÙf{‘IÊFFD¢Q÷‰Ra¤ 3ŒäÑ+3éŽTiÕŒu.d”äR›(lS¦D`ܶÂiz¦ŽÇܨޱß5ö§†N™¯HNšæ …ŒÚyêLHk[nÓ•LdÔM0’ý#%1yÔÚÈò8V;Ú¸†»½|9Oܺíû©.}f]NX’$gµ7ú¾[l÷w¾Ë×w¢¯‡)û—]¿u%ÁϬ˩ËDŒö±æÿWËmžî÷ÙcÒµZ K¢Ñ ü[£®\ZB)ΩÈÔíì}³5F"ΆNA¸­Q¤®—Œ½Ñ$ÕJ *¢PÍì[£®\ZB)®›‘©ûØûfjŒE œƒqZ£I].%{¢I†ýó=ˆóéyÓBÖÙ ’ÁdR³¯2ˆÍ7I'¹%Ö™s(¬Pª+”8º[û¢B3r¢»‘IÖ4âIHU”Det™ŒˆøÆ ¢aÅK]20̶°£¸Æ[±)“ ©(N]S*'Y~‰¥¾§,…‘ÈMŠäC-¡š,ún†(4|# Ÿ„«ÙŽÍdªXmâKÒ‘ }y lªR‰?§%-*Êes=© ¬Kâª1±¦¦ªÑh2+$ÔaœºËܬ’[JÝQB‰ 6‚%-L¯jÔK+Ye|+Xo”×.¢“j«×6êbs8RSòt] o‰H&΢ͩµ ­ÝY U” è ·ÓiÑqü÷+˜b¦æ,UVk­Ö•Å4p”§ „”«d&É“m½Nk’Êù?„0Ø.Œó8±™‡j”Ý$ª%‰õ‡á¸ÒdÏ4ØœÝ*"CùîÐi5dM˸à0ܳÞr4ˆôÇZiKDvMãÆErBMjJIGÀY”’¹í2-¢?1” 6ôHfÕP•&iŒF¤Ù§æÇˆnš²™UHJ‰'cVS"à3-ˆ)4'äÖ `œZ£È‘£JûFv–ôw$ÉQÃ$ ¤‘¼íö‰%g3M”«lšãZK˜ÂN-”˜’f0Uú`”jÜñ§Ç~K„iÚ’%>ñ)Ek73"MÀn†ÆUÞ·i T7.êÖÔ AɬÉmÓ-˜ùïc÷:ÜÖïåµÊ÷-c‰pƒÔgñ'áçáPäSè²W šÑ²Ü›L“»ÐÉ&ÉÖ®3hJ‰63Ì‹íQàñ™G§ àÊÜ\*ýB€¨ô†)ÎÃuçZ¨!sf:‰ m&Ö¨VI]µ«‚꺱•w­ÚC ˺µµ(rk2[tËf>{Øýη5»ùmr½Ë'5çe+j#Ò”n¶ƒCF‚Q–I5žu$²¤ŒÔ{odžRR¬“ÐXŠ‚ÌŒ%Š“…ðen.~¡@S†)®ÃuçZ¨!sf:‰ m&Ö¨VI]µªöº†Eº).5YXC Ô©8iÊær,S‰úvjm®[莤¥M·ªÔæVT‘ê–® ¨ÃrѪ+Ü—N^Ër_Š¥dRlë-—SerãkMø×+‘‘hÕ:$ÃŒÐh8š…¨Tü-_Mfb—*Fp£=Sä9ƃh¤%1ÔII!ÏÑ܈ȽÉÞ“€éø›J5YÖ‡´Ú0Å*:$9 IйüóyM%JQ%iÌÙ—t¥¶K.뺹„ÞwtcЦܹw6íѬ¾³t;)2Ûf]Í{Ü­·29Æ% L*%N·K­O¤§áäbZn¥h•PZ7qºÝÌ®â›RÒ§#ìRÉdGÑw´“†ë3±^BXS Èj/[2›Áòê`!, ²°óo¶ˆk'‰Å:”‘ܳ)Eܤ7~;®õ¯ëØ›rî½è¦È¹õ™5º¦”¼™¬yo–×±Úü/H­Å‰Q{oDvlã…Ü"Re¬£ªAš2²¤Û¥úL‡v•b± Õ£ôíAf|m"·VÁµºýnu<Ó…åB¦»'RÖäJM¤:‚2dÉòyJIšMĬˆ‰wÊ=¸Û Såã9•¼MƒZ¥ÅÇ%!Ò]sÔ¨‹Ã̰jCIBÔã{¥,‘åI–fˆÏj6ölC]ÞŠ¾§î]výÔ—>³.§,I3ÚÇ›ý_-¶{»ße¥D·[ÃUÜ6ì:ëm·•ʉßCÄ© »IAÞ˨»­ÓmÂ"¹¬ˆkê&*Ý' R§`Ö£ÑXÆ/:ãQ©Óã¿©RHŸ\G Õµ:¢lЫ%g¶ß¤±†åÄ•êf‚‰•G$t™iâ;%×dg• ´•-Gd¨öì#>ðóQqn¬»Nj™Q) ©F‘**I¥¤ÔÛ6Ó×¹E!n¡&•YW3+w*´6‘M™…°¦“aP`O¥Å‡)÷h,Á§ë´23Ÿè¬¥.¤ÖlŒ’kÌ›–ÛSUÁXÇXFŸ‡*•Ú 4:¹;P„Û/­N;&òº¹ :“[Š'\32%¨Ð£½‰@'“1Ê”I•c9K„Ôù¦íІ#¸n¥)fYlfýû–]¶¹_Á†ñ¾Ä5§Ó¥ÊL½Q¾†&@~"ÝhŒˆÜlžB Ä™]H¹ËnÒ潃±2k˜Á:µŠªn’õ£µº·-B[îÃB™i¦ŒÍEc+–¸³Œ­%:“˜Ëai4Ê%nj$‡æM•R¦»ĸβQÒN¥&ášJÌÑt¨»«™ÌBÒ6›PfiòÜ'Þ&•½²J®²’Q$ÛÔ¨Í[ Ë;žÂ)ºMÂÕ âh‘™ÄÛ½Z£SNáj“Z´º¥%µ¸kŽDÚ HYgQ’{…mîNм<õF‹>HÁ‡Ž›ŒÔ¶#»B¬ÑpÇœ‰Ì’Í¢¶­¼Æ‚KîšR’##¹NéQ%#L8Žrã<˜aúK->m™6µ¢EDÖ‚W©$â ȶ‘-7á éXï Õ0Øê]/áæ"»-ÙdË„hi´š–£lÓœŒ’FvËs+XŽä=xƒP(:U6¯PLiuwµ›6Ö­bî”í4‘’K2ЛªÅ™i+ÜÈIÕ0Ö!¡õ6²å"‡Q‘*«¥VhíFYÉ)'O&Zy-[6±*³N&×4XÏÞˆŽKаn/ǘƒNT§Ðá)’£SÊ£Fy÷Ò–”NªS*'Ú$¿cIšVFQÚQlØa²Šh)Æ…ƒUPIWNTJ)¶²¼sZK%Û)žd¨²ß6Ã;[hÆT4ƒ Ê®Äzªë’(.Cj¢ÌxO¾¶Ü–¼‘Д¶ƒ7µ÷6Fc#Øv)¯bg1ST“¤bHtZ+±Ž{N3åµ"¤‰qÍd“3B›uEr#î]iv;¦ølEƒkU¶I‡ä*6“2©M§®C®ÊEnL‰2ZõŠF}fL‹Ê“EÒeb0ÝxcÓ±èÞøÕ¦w>\ûãF—ù¯l»¡¤g÷'|·¶ËÚå|ÈÖt„̯aŠä*}oâ)*ÜùÄ,HÃY;³3ÕI —v‘«)/Ü¥'”–w`œ)‰i¸ž$Ú…sÆo>w;#V*yn…£Hi-9´È»£,¾è¶‘™àÚï\T‡ê—rêªSàäÖg¾æ–ô|÷±{­Vkw³ZçkždhÇh¤ˆÔ•bü/R«a¦ëx•ÉPLv_éž©¸¸®2¥8Ùµ®Ê¬ª"Ö¡\2©4W›ÃØ8±¦«UpÄ}óÖÒÕ ÉîGÖ>J§kØA-Njãçlö+*”“> o ÄØëyq ÚNõë÷.ò~“te;5!ðe;jõyø{«Û¹µÆ¿Ò¥4§Ï¥AF K° ˆÉBr£‡%ÖTÛ—Ynt¡·˜Ž¥9 ÞZÈÕ˜‹7èîXÝàÄuÜ3ÚEaé躭‡Rên¨ë’ÉFDJJÛJ³¯€ÐGs·…¦1.zŒþ3¤á<ü*Š}JáSZ6[“i’wz$Ù:ÕÆm Q&Æy‘}ª#?20ô ¸w±B ×(FStýË Š;-RuJ’â!,³iIÔ%h$‘¸HrÄfw0Üu¤ |ÊlIêž©É8°Ó‘G¬t™qãMȬ_£eÅ\ì]͸LˆéªÿþïòCpãïIÁõp|*j(ø¦Zš‘Žå8Ž”§Ð§SÓ5ÆJÞ6¦îD¥6•Ûi ½Uþü#ßå#ZÖñ¦¡Î8¬YA¦KJIFĺ‹L¸D|•J#±ˆ¾’ëŠæ O¢U Ôâ*¤ Ÿ‡!/6j)Ìܳ$Ì®Bî˜ôK†t V زẓn\r"pÚÌF¶Žü$e{|“Ú]ò;ZH¤Ó¨X/ Ñé‡&$£4Ã-•‰ )­Ìûæg´Îæb‹60‹âJüöê ¥ÑZiO¶m‡ÝI©-)Õem ImZÔÁ¹Ó2¹^P 8‰õP±I»(1¦ÕaTw¼²hÙK­ü´“É<&K;^Ço¤/WjÖhë3Ò:¼‘¿]›;©ëžAÅÕ(3’Š»ñ&Ä7RËεqžŠ³2"Ö4¥(È®dG´7+•®e8›.4(OM™!¨ñ˜lÜuçTIBEsQ™ì""ïg¤*Ëøó"ŸÌ´¸ÍR9FÚË*œyDv$ ŒÔE´ˆíc32!0ÒM:eSÈOºŸnDiE1't%™ º¦n{;´ Ñ·gu·`çèëÕ\ßVêb{§–üyý©®÷êFíÔÄ÷O^¿ÃöŒèjƒPb=9/?}AɦɎ‡ìF£Õ­ÆÒ•ì#>äÏaŒfĪ~7ªRê”mÍL¯Ô½¸Ýo&GI-~•FhZÙ›Ÿ£"ÕåÊ«™*kÕJÎ7 .Šx¢,"uh«Á›F8ñRÑ0ù’õ®²JSšíBlÛ†› ˆ>‰WFpÌæpÎô­É·X&pü¦]mã$Hœë†™e¬K}Ù$ÈÕcÌW"VžÍÖíFUˆÔ…½i²c»%–²ŸtÛJm+Uíb±¼ÙXÎç›eìvÇ•yÂÅtú”×XTÈs¥ޏ›¤£<ÃEܤÔFNä²;‘‘¤ŒÌ“ÆTZCšXµêžEA-“ÓK9J$ߊ¸ÊR’…dœ¯™8vJ3+if;ø°52¥Ó‘O–ËHë§;Ž2¤¥:ê».5s2ÙjOÊI•Èþ½ðÿøg=lW]7EZ7)×hôÄ`væKy hö´Ì$¦æâÞu{ „Ì¿PÌ×¾Ÿÿ ç¢bªOh#Q¨Ö:„£ ÕbqI*jò\öwYríÙ·höz>ÕoÅ'Îs=;§¿èóêæ¨µ3O?ûN›¤ItÔUáDœPÖÙºˆÒ§ÆfrÓ´Óú-ÈhJ”V2Jœ+\‰YLŒ„‹Ϊ»^›¢üå¡4ÈSÔÄ2N°·W –…I$µI.þÛØÌGšÒΙ…ÎlZ¥[A?H®ÏÜ.Çp­µ‘¤×rÚDd“#Ø"¨Ó–ÃX…5LwXëz¡X SŸLS¦º¦Òg!ÒîÉŒ«+<”™¤ÎËC‰;Eu:[–öÕ4mŒÌsžŸ¼Ïò¾–›Q¿5LÎ;³>ÜÇüe½@Y%¹°cÌe/%§ÚK¨KÌ­—”W"RD¤+nÔ¨ˆÈö‹Ã‹ <¿õdý¿ð–8cÿˆØKþO¤Øîzßú²~ßøK1ÿÄ áÌ%ÿ 'ÒlWÚŸc°ª?IÿÍWýLy$°Ì–ĆëK+) MÈþ’GPÒ¾”·d¯UMÇkU™Ž’¹Ïa4D_AéKK}ìw7›g£M¬ÿHkôtÓUù¦˜«8Í\ñÏÙû¸×¨·OuNìBR„VIˆ‡èáÊZ]åÜÎm®Œ~vRÒ÷.æsmtc:} z?¾Ÿçþ•â­uwx쥥þ]ËæÚèÇçe-0òîW6×F)>ˆ½ÝOòž*×WvºÃ.­ q¤)H¾Um+ðØ\ÙKL|»“͵ÑéKLìw#›k£çÑw£ÛÉÄÚêï ÙKL¼»›k£”´ÍË·ù¶ú1Yôuèéü§‰µÕÝU*t’YLè­ÈK“ÍÊä•‘¾›ŒqáL>gmï"kæ Õ“<Ýò~ÁÄÝ”´ÏË·¹¶ú1ùÙKM»{›o£¦Æ®Übš±ò—:«ÓW9«ôw›hKh$!$”—¨pWe-4òíÞm¾Œ~vRÓW.ÝæÛèÇ Ñ^èéÄÚêï q"ËA"TvÞIÈ–’;·"Íq¢4҄Л\pŸe-5ríÎm¾Œ~vRÓ_.ÜæÛèÅxKÞéÄÚ÷î‚;)i¯—nsmôaÙKM|»s›o£÷ºq6½çs9B£¹$ä®OÜÖhÛþˆ‡µ–gÞšB;Ûpge-5òíÎm¾Œ;)i¯—nsmôaÂÞŸaÄZêîÚ³N?J–ÃIÌãŒ- +Úæi2!ѹ9†´y†ðäÇ¡;&•I‹çqÃBÖÓ)B7lŽÆi;\ˆpe-5òíÎm¾Œ;)i¯—nsmôa[Ñý§k«¿&P°4ÜBœG3 a‰5¤ºÛ©¨»+’KnÄ…¦ÖlÉÊ›îYJÜA¿Mq±÷×ìœ}”´×Ë·9¶ú0쥦¾]¹Í·Ñ‰á¯û§k«èæý5ÆÇß_°ô×}~ÀùÇÙKM|»s›o£ÊZkåÛœÛ}p×ýÓˆµÕô>¢õ.¡2›.c,:õ2Iʆ­s¥«tÙq“U‰6?Ѽâlw.êü$F^Ýúk¾¿`|ã쥦¾]¹Í·Ñ‡e-5òíÎm¾Œ8kþéÄZêútX›rSiQ÷ *TÙ§s´¬¹›nÍ÷)<ˆ¹‹¹Oný5ÆÇß_°>qöRÓ_.ÜæÛèò–šùvç6ßF5ÿtâ-u}ߦ¸Øûëö~šãcï¯Ø8û)i¯—nsmôaÙKM|»s›o£ÿºqº¾ŽoÓ\l}õû¿Mq±÷×ìœ}”´×Ë·9¶ú0쥦¾]¹Í·Ñ‡ Ý8‹]_G7é®6>úý€ß¦¸ØûëöÎ>ÊZkåÛœÛ}vRÓ_.ÜæÛèÆ¿îœE®¯£›ô×}~ÀoÓ\l}õûçe-5òíÎm¾Œ;)i¯—nsmôaÃ_÷N"×WÑÍúk¾¿`7é®6>úýó²–šùvç6ßF”´×Ë·9¶ú0á¯û§k«è¬ ôø™ƒ4±XA6Ë ’Ûi"±%)&ìDEÞ!~šãcï¯Ø8û)i¯—nsmôaÙKM|»s›o£ÿºqº¾ŽoÓ\l}õû¿Mq±÷×ìœ}”´×Ë·9¶ú0쥦¾]¹Í·Ñ‡ Ý8‹]_G7é®6>úý€ß¦¸ØûëöÎ>ÊZkåÛœÛ}vRÓ_.ÜæÛèÆ¿îœE®¯£›ô×}~ÀoÓ\l}õûçe-5òíÎm¾Œ;)i¯—nsmôaÃ_÷N"×WÑÍúk¾¿`7é®6>úýó²–šùvç6ßF”´×Ë·9¶ú0á¯û§k«¿pÍ# áÉÏÍ¥D$I}´²n?>L…!¤™™4Þ´•«lŒîHE“ú†bú|&ÖÜ8Ðc!n­å¥¢R N-F¥¬È›Ú¥(ÌÌøLÌÌÇήÊZkåÛœÛ}vRÓ_.ÜæÛèÆ¿îœE®¯£›ô×}~ÀoÓ\l}õûçe-5òíÎm¾Œ;)i¯—nsmôaÃ_÷N"×WÑÍúk¾¿`7é®6>úýó²–šùvç6ßF”´×Ë·9¶ú0á¯û§k«èæý5ÆÇß_°ô×}~ÀùÇÙKM|»s›o£ÊZkåÛœÛ}p×ýÓˆµÕôs~šãcï¯Ø úk¾¿`|ã쥦¾]¹Í·Ñ‡e-5òíÎm¾Œ8kþéÄZêú9¿Mq±÷×ìý5ÆÇß_°>lÔôæZ|t¼ö9}IR²‘!¦Œïc>û¨c»<és–³y–}ʺ+¢qS¥5ÓTfM÷é®6>úý€ß¦¸ØûëöÌŽÏ:\å¬ÞeŸ`;<és–³y–}^õ»ŸM÷é®6>úý€ß¦¸ØûëöÌŽÏ:\å¬ÞeŸ`;<és–³y–}€ï;ŸM÷é®6>úý€ß¦¸ØûëöÌŽÏ:\å¬ÞeŸ`;<és–³y–}€ï;ŸM÷é®6>úý€ß¦¸ØûëöÌŽÏ:\å¬ÞeŸ`;<és–³y–}€ï;ŸM÷é®6>úý€ß¦¸ØûëöÌŽÏ:\å¬ÞeŸ`;<és–³y–}€ï;ŸM÷é®6>úý€ß¦¸ØûëöÌŽÏ:\å¬ÞeŸ`;<és–³y–}€ï;ŸM÷é®6>úý€ß¦¸ØûëöÌŽÏ:\å¬ÞeŸ`;<és–³y–}€ï;ŸM÷é®6>úý€ß¦¸ØûëöÌŽÏ:\å¬ÞeŸ`;<és–³y–}€ï;ŸM÷é®6>úý€ß¦¸ØûëöÌŽÏ:\å¬ÞeŸ`;<és–³y–}€ï;ŸM÷é®6>úý€ß¦¸ØûëöÌŽÏ:\å¬ÞeŸ`;<és–³y–}€ï;ŸM÷é®6>úý‹ÄÕ寤K™šõVJ#©¶¡Dq)qå,Ò[ñ¶‚"á35pØŒìGós³Î—9k7™gØÏ:\å¬ÞeŸ`;Îçmuߌ¿’zÿœéߘlU/b”Ñé磚½5¶k”ùŽÉ~¡hm¶e6âÌÉš¹J¸ϽaÇÝžt¹ËY¼Ë>ÀvyÒç-fó,û6É—Ñ!D†Y‘qä²Óì8V[N –…ëIì1óóΗ9k7™gØÏ:\å¬ÞeŸ`6É8—Кm:LiLÓ)°`6³º‘2Jõ’®=#çog.rÖo2ϰžt¹ËY¼Ë>Àˆ£ˆDDS‡Ñ ;{<és–³y–}€ìó¥ÎZÍæYöí”åôHÎÞÏ:\å¬ÞeŸ`;<és–³y–}€Û&_B*Í8ý*[ '3Ž0´$¯k™¤È‡æ ¢Ä¦`L'E«8Ó• Šqȇ:K$f–›K™T„¤Í&¦’{x‹aŸžt¹ËY¼Ë>ÀvyÒç-fó,û¶y"ªiª1Teô{rÒ|&£ç¹Þ±á›†°lú½2­R¥1RIR©ïO™"IÆtˆË25„¬¼${8T†Õî›A§çg.rÖo2ϰžt¹ËY¼Ë>Àˆ·9ˆ…i·EôÆM÷é®6>úý€ß¦¸ØûëöÌŽÏ:\å¬ÞeŸ`;<és–³y–}nõûŸM÷é®6>úý€ß¦¸ØûëöÌŽÏ:\å¬ÞeŸ`;<és–³y–}€ï;ŸM÷é®6>úý€ß¦¸ØûëöÌŽÏ:\å¬ÞeŸ`;<és–³y–}€ï;ŸM÷é®6>úý€ß¦¸ØûëöÌŽÏ:\å¬ÞeŸ`;<és–³y–}€ï;ŸM÷é®6>úý€ß¦¸ØûëöÌŽÏ:\å¬ÞeŸ`;<és–³y–}€ï;ŸM÷é®6>úý€ß¦¸ØûëöÌŽÏ:\å¬ÞeŸ`;<és–³y–}€ï;ŸM÷é®6>úý€ß¦¸ØûëöÌŽÏ:\å¬ÞeŸ`;<és–³y–}€ï;ŸM÷é®6>úý€ß¦¸ØûëöÌŽÏ:\å¬ÞeŸ`lާµÎ#˜åÉÞð¯ d©´­ÝDªÔ‘g©ÉiÕ1“Ý´¥êÔ¼×Ù•jh­m¹øJÛq³½á_@Ìຜ*]k5Q2M’ñf%„’œÕ¸ƒNd’ŒˆÔ“ʲ#2+¤‡öõÖGMýý:œoŒ²0TÒ¦°ìMÑ.c›ˆœe Ò¥6û­¤ÔkÍ}SI]ò岕˜Ó”³ãäajÛ,¸ùÆeÖQrMÖ%4ê ´­(Q’£%MiºHÌÈŽæVÚ%Ô#ƧÔ+“×j]JªÜ†š6›q¶ci±ÍWt¨Ò™HÊ•$Òy g 31Å-Uº*ä™ÔXÊ™­5E‡L55% iâCQû“^DìZ”{I;m¿Îw\Ï'QŽh˘+77q.ñI6c>–³§2“ ÐLå+÷JQ­%”¶–Û‘e;x1} b"T .±mëqåµ!›š}ÛJRot™^åm¢cWÒ&ûƦªIM‰=º¹Ê•*)¤––òÝe-\ýÚ!û_aY®-˜ Õ©Š´i†VDÜRnL…Âj"¥;j7M–ŒÐƒÊ¤§aòf=¦bÔÍyï„Uã¹ÑÌ7Á¸&_¤S‘\•}Z¥"”SÉÖs´Û 5ºîµ&ÚO^’¹!V$™˜Ó0Õj¥¡ÅBÐ鬙J¤6‡4•ÔM¡J%8eÿ„nÎ ØöM CÃÑW1Q—>kµXzÓC#¾ÌfÒƒ±û²Õ:d£.äÔ“+í!˜Ãú@¦Ré´ØÌ<üuÐÔáSÝëzŸ)çÒo­ä(Þ{2ã¬Ã.çXEb2+ÞüfkŒºÄQ(œÌ‰bR÷ÅøL%ÊÜÌ…5…?ÃTÌnö/CugeÕªqåÔ¢œfÒÜd"k2Ü&W¬3pÍL’S™(±ÜÄo¯ˆNÚ3ß(´L QÕ± ¦Ó:l–\g*’µŒºé™]Â<äHIdF¥(Ö’,ͬ‹‰0Õc©”UØe…ºjI6‰M:´)6̇…¶²ÌWJÈŒ¯À=t:¥)2¹A©.k.J‘lWc²—HÝa¹&ÖJZr¥ZÿtYŒ²û“¸÷iQëÈ€pd¹­©åʨL†Ìwß%dÈ…ê”dé£*ÏZ«)Yö‘X…âjÝb³íÊ£˜OƒðŠñ ±PÝåP[ÿFhÚÌr&ÝtÛ#¹eý.öíÊVîˆFûãÚn¤Ð¢³†¡T߇9Éò^š§ÒiuF”’[Õ<”©:´'ßeu(­c;Ò¹«Òµïxtkæâ¬CFfF©Š\Ú‹1qS˜aå¶§— ”¸¬Î(ˆÏÜ¥[{Ýám9ÅëˆÔ²§Å&œŽÔ«ª£&Û¡+C®¹vÛ2R{µ‘$ŒìfG°gðæ*Á0ñªM*úÃ3Há13*91Ó1r§§ "ËX¢4‘(•b,É኎,§IßÜŒË-ðÃTÚKWJ{—£nêWuîr¹c+žÔÜŠçjn¯wrø£ e£ŒP¨Ë4SÕºqâ’K}„2Ûm”_Ò¦í”GºÚ3;r©*%(³d¡:>Äf‡ÜF¹$óhÚÑœmÆä9¬×“™r‘FpóÐD•æR $J×t…EŸ¤ÐÙPL—iD%-´dΖ¨è33Í{^œÿ{øMìÚ¬´Q1í&.£QVõ^ ˆdÊ]•3Nغ¢•d-dKI”æ’iU‰DNÛeãu͹ÂvÛÎBÑýU8^³Z~m%¥Ò¥°ÂØ:œSÖ¥Æ]xÖ…k{¾å Ê”’ÌÊËsBˆxƒ+íâ7°ô†éñªlç'‘TŒÉ%HpÛ4–á'>b;&÷QYDF“#<Ígáz„KNf4Ú|yÏ™ãÂh‰oÇaæÕ²ZRÒ]SÊYä58”CØÞ0ÂÏc<_^™O{5V¦äÊsÎÓcÌSM©×¦ÔÓÊÕ¥J%#»îòä;ÜNêÿ>ˆÛCÉFuw©´‰o?§§Vݤ;¤ÆÝM-0ßrÒÞJ–³[Ê#AåÊIJ”d•’„­JîòoÆågsjµÙ7SZýWÎj3krãË–Ûoa;<†dbökÒWh ãi†3MÆmzæz:”…™¸Y”±r¶b3U®EÝ ]4,»õjŽþo&óîMB7.]ǸõºÜù¯«î²d÷_°ˆª¿i4Ñìb±Åóª@a­Âîª[mÍa×cžl¤km 5%&­„£"Iܬgr¡4­bÊtÜC¤:ƒLËKX—[¸Ò¤§3yê É-gu³¸iE³7teÞÚP±Ò‰ªcú”ª"'¸u@*cktAÂ{ãm÷ÞÏôO½nÆ™sÜæî²k­ÂY²ßeöc†«J¦oEF«Prr†ÉãhŽÆá5›9£„óeµˆÏƒh›Ó4³ZpÔÈøƒ±‡imÒš‘NjbÒ…¢;,!ô¥¢^C%©· ˆí›6Û\ŧ´ƒì6M’Î-E4„ÒµMP (Ö‚¹óÕ¾œÈáMŒö™’V·×::⎯/Ñ•v›ˆê±©qRí9™²Ú§›ó£”‰M1!ÖLÒÞbS‹#iW$¦û/kÜØÇá «ã†fT×>+²ª©èŒÒ‘s«LÓo¯[v•e¤Í$…÷*##Ûq¦DÚª©êEȦ'¸Õ̃Ƶÿž^Š„DK±ŸÁmç—¢¡ºï÷ZÚ?ö€G¨ë¨KãÐþ¦™èУwuÓ"VtÂõ6~éÜÏQ¥k <·c,ȉ*¶±¥%dGk”W+‘ÜŒÈDŽ¢¯hûT4¥ÄÒNâ µLRŠ”kcPfYг×cUˆÍV#¹&ÖÊV—èËã¯}SFô§ gc âê¿õ–©ù‘wBÔŠmK8æJaöc¢•GUž"RŒÍsŒÏ;î-Eô‘l๙a.ï ú„êLðÿ‘zǺw¼+è·8Gé/Jú'Oé æôOôÌã×LËÔÅU÷²›ëä;ÿ"õëF/à;ÿ"õŒAŠ>F÷úGG(Ÿåb‰fN¯¿€÷ü‹Ö?³¿îÞÿ‘zÆBÚ†]ßDééåü¯jÓ®D/û·þézÇá×býÛÿt½b>¡B†mݪy-ÂÛH·þÍ?÷KÖ?:à…óR>ézÄlÅ<-ÓO$Æ–ÚM× /š‘÷KÖ?:â…óR>ézÄ`Å#É]S“Â[J:ãƒóR>ê}a×,š“÷SëSŸò×~¸äžÚW×4š“÷SësÀù™?u>±1HòÕ­» àí%ÝsÀù™?u>°ëžÌÉû©õˆˆ㮜¤»®x3'î§ÖsÀù™?u>±㮜¤»®x3'î§ÖsÀù™?u>±㮜¤»®x3'î§ÖsÀù™?u>±㮜¤»®x3'î§ÖsÀù™?u>±㮜¤»®x3'î§ÖsÀù™?u>±㮜¤»®x3'î§ÖsÀù™?u>±㮜¤»®x3'î§ÖsÀù™?u>±㮜¤»®x3'î§ÖsÀù™?u>±㮜¤»®x3'î§ÖsÀù™?u>±㮜¤»®x3'î§ÖsÀù™?u>±㮜¤»®x3'î§ÖsÀù™?u>±㮜¤»®x3'î§ÖsÀù™?u>±㮜¤»®x3'î§ÖsÀù™?u>±㮜¤»®x3'î§ÖsÀù™?u>±㮜¤»®x3'î§ÖsÀù™?u>±㮜¤»®x3'î§ÖsÀù™?u>±㮜¤»®x3'î§ÖsÀù™?u>±㮜¤»®x3'î§ÖsÀù™?u>±㮜¤»®x3'î§ÖsÀù™?u>±㮜¤»®x3'î§ÖsÀù™?u>±㮜¤»®x3'î§ÖsÀù™?u>±㮜¦wV#T!!–[y*K„£5‘ZÆ]ãýc<÷.Ur­Õ;Û·ãæ¸7×P—Ç¡ýM3Ñ!¡Fúêøô?©¦z$"HwÀèËã¯}SFô§ ðÀèËã¯}SFô§ B\;Þô î€päLG„±ôuR!T*%§›í!Kmå¶ù'"—î ÔIÛrà.!ï ú·CX“…ð–92¨ä BQM6Ðæu<–ß"²GÉKEŒÌ¸Pýþ¤¢õ~‰˜±»u8Æ}êzwãÿg‡»õ{Òl £*–Ñö>•ŒðÌ$?½Jrœëú‰ mHióRi5 ŒÐwÙÀ\B%†tDU¡ZÅ0è’+«4Òb¹NªAÚås#"Eö[‡Ý'¾výi-à|sMÅøž£*UBšlS–ãÒ3,Úy*$ŸtH¹©3±pqlÊQq¾­P°CØ–­2•QÁêI¡„DS©–H$e$©;ïH=¶ï—~ãá55zNÍÛ³V{êŒÍ4Ìǃ»lN{³ˆ™ëžN”혇æ‰0$v`i:‰`ÒÊ£N††š—)”¸˜ªSO™:…¤­•W+ˆ»ä#‰Ñ»ÿê1™3©›TÓ9îÇ8ïðÎ}žÉÇzÝÙ`ú¤ðþÃÚAz>šÊV¢AH¥µ M& ™k'v{ÏsQÛ€ï}¦5i‘ÕTÇ»‰pÕqUÔRƒ}•DqÌhm¶È®²,÷Êg°¶ nbÖóú4îÎqí=ªLR*1HòÜ!IŠO„Tb“á‰Rb‘QŠG†¾k(ku;àú~^ Äx¥•É£a¸;­èÉ3-j¬µìer"mgk•ÎÝë‘äñ†2Ñ,Àu#£ Wã™onài'®â5©)Jm²ÆJ¹•ÈÊâ9 ¼}OÁujœ:ô7fPkqN$öÚ÷d[H”Er¹YJ#+–Å\¸,r[;A”,RƒãÌÄ5š‰Z“=µ‘ÂÛÂFiE­¶ÙHîv¹™Æâ}Ò°îhø®¥Ùeʽ0¦D‚ªz³¸é´‡ ’Q,ÊÝÑ‘¬Èˆ¶l;ìÝ4Íá‡ôæí?BÃrµ*5:ET8î^K‰SªN±i5"ÉOt}Ñ8[;‹ž˜Ó^/ÃØ‹hæ•F¨î©tjY±PoRâ5.j£¦×RH•µ +¤Ì¶~²BN˜°]P,bvêî?Fs ok’‘ÒÕ=ºMÝ©4’Œ¬E´ˆýÑ~» xR“@¸Æ©C©Ð«”øUVZf¤íMNs6ä5n©Ë´’S†œ¦ƒ½•·»Ùä“¡ÅKŒÍOÓ bitõÔ£¼Ê’FÚHÌÉOåJ¬GÂV¹Ó"3’Ę* ™SŸD¥!qd¹.F¨òJÛ5ÐfYfÛ‘q :ÒÃz5ƒ ê¤Êj%M2ê’¸íU¤-JK9ø“#JNæ^äöwF2õ]%`EU´·)ŒB—Q‰hñÙ¦Úän:ˆŽ´¤ÐYO1§iØ»¢Û°ì_DºkIT:^$t›¥È‘•ë¯!(ò™¡}âR‰)þqÐúJ£ájM:­ ¹¡GbQmeµCK¼VàudYÙtf]ãŃåQaâhq5u*BÿKŒ‡…-FGcI‘ܯrÚW2±ì!KÒv‰ðm&£'b\KXLˆêDz Å:äv ø“q=ÉwŒó«eø@i,W£ýéÑÎÆÔê±ÔáUÔl¼‚«8¯‘{ÙžefÚ••ì^ä¶mæô -ÜaEˆČR],êu×Å»¥9JË=bJ2þ¹¿|Hz“¥E­Q«˜KESÔˆN³YiÕ—èØqµ¤ÌŒûÄyRvï‘/ŒÄ>™iU:T1~!­×h°ßRÓU-I'XIY-¥iRU™ Ê"IÜÎü`=Ptc„acœ)xö™Y¦T*ˆ‹.6çS2лžV—>± qIÕç;eÎF{cIš)¥VôáÖ¶ ¨ÄŽó““ ”5´Õ-¤2Í•ŸÓs6nç€ÎÆ{n=KÒN —7MQë’µG«±2}eºiÄ[Œ6¼Ú¼¦Es>çƒeÒ|°õHÒ~ ¡éýxú—X~­O­Cܵ‘ Æ×’†R“,öÖ\Ú#;pøv\5Þ8Ñ|z> V/ÃXª&&£±,áËu¨ÊaL;°½ÊŒî›™ïü$™\ŽâgPêy§Ãư³šF†š”èª~ ¦¬œtÓ˜Õr%šR’$Ü”j¹÷VOs¶Ö˜4‘©€äPb鱊äM}&´%ˆqši+JÈ—vIÅ,%µ*">ý‹aæ±6“pDΩ|/Œ#VóÐàÒ—L­ÊñdpÓ$ˆ²3Ÿ¾#i–ßÔ`!St*¦ð¾"Ÿ Ój|6ƒ]ZœÃ ÊÁ)FD騔¢$«a&×I•ÅúF„ឣW1<§aõÖ˜×ÂCñT¦-”–’qóRPÙšL¶ÐW21’ÂØû ÂìѺªÚ¾¹wNô£º{§>êËÀžâúÔ{¼¼?¨í›Ñ.ð SaÕ1½aQH¨Ð*tâ–Ë«4ð0´·ú4f¹’T£##±Û„ªbih­â983 ¯%Ö”ëkGrEr3Õºµ³~« ” }£ÊîÀ/bšÄÚ=O)&ˆíÃ[ɘH$e$©;}Sfy­ü"ïÜ[èVub¡ŒiÕšëI8](7QÍÖ%%ųf#Jr¶G{Ù\,5Æ&‡M§×$ãÕʱ³-LÒŽ¦uÄi#3È£3MŒÌ¶ñ ÙHÒ¾¨¯Kµ*¤•S_İÅ*:™ZÔæHï4’3A$ö·{™Õðh¿:“i¸fMU15™Sb™<‚9‘[{V’L…/.r;\’W·q …´wB¥i#ÅÄth3â•TétƦGC¨÷·$æ$¨Œ¯ªB6ÿâ1­ô)‹°öÀG¥Öj–ef”Qéíê\^¹ÍT„ÚéI’v¸ª2-¿¨Äò¦,ö#ÑÄ©• ÌÜ=¹œ?ô£‡¹ÐfD“5žË]7Ø¢â0§4`ÍcÚÌš¬,1…蕉L¹'s‰EžQ%¶ÚE¶JÅn‘‹JФæô—@®WX]6¿É*Ì0kKˆCJsÞÍE·bvfàQÏ€g©xÿÕ iWª²)ÔœC\~£¨ÔUºE™ä©9›"%íÕ¶v·|Èì2HÒ® N•p q¦>ÖÂp_‰¾0¼ÎšãD¬‰#U»†Ë‚÷3ØD/WГ,P±LÊF6V†TáφÜE£"˜îk3¶l©QšHŒˆÈÓ›`ÓÃzal}„ávhÝUlrîèÿGt÷N}Õ—=Åõ¨÷yxQÚ¡\A†pæ7n^/£EªÒal<‡â¢A2fddá!DdfF›lÛc;qKðŽÿRv/­=J‚åR=a¶Ùš¸è7ÛA®%Ò— ³wJØGü#ã1j³¡-îÓ-G]skwÒ ¥îíÁmU‰ãË«Öm÷žÅî¸6mÊé èÒ‹¢†ÑäÊ…IYÉ”û²RI›) 2º’“?zBHˆeÌÎü3ô“¢ª®”°Ö‘fbY±&D§*#°w¹Õ%…<ËYÒý*“d®f“ØD`5Å7BñdaìUZ›ŒãÓ£aÚÛô·–üCJA·JÌÈÌ—±J¹‘öÜ£Ú]ÑÊðóJb´Åf™YŒr!Êm“hÔDI3ºLÎÅe Èïßï ½wa9:&ÒU жj…k½>žÎçtµÌ)öKÌi²{”(ì£#ÙÁÀ0ZlÅØ{à ÒèÕ Õ2J8õõ.#Ræª:mu$‰[[^Ô™–ÏÖ@2Z¤Ði ÅI«PiõÉf54yÍkIš%žSØfzâÛÞ˳„Äž¯£bîxˆÿXÑT¬+…«…'±‹âR"Ò5R#K$ëj(ý)¡ Ì´žk!°”wYlãÛXJZ>f…‚gU*Ó©3ðœ7㮚Ì5­3”¶‰¼Ä¤÷%Á›º·tgôMN<ˆÆÕ¬IP™Fžá»*ƒ * ÛqÕëTM.ͨ‰$z¤ð£ažÞ œu2àz$ºÕ:·‹â±%š›¯E£AÑ8‰+m¥-×”•l4 ’i-†Y”\Cߣì+‡]ǺY¬J¡Á¨u´äÇ)´·#ŽfN>i-Yl2-ZREÀY¾àÑ&š™‡ˆpÔSFÃ1)T˜‡TÓ\\Æ–T”åY)FF¥X••6<ÊØW n‘päÝ0׫ÎVœÁì­ǧT¨”òÕÉ-jÔ—e2´(ÝZÉIQ’wIpÒ OTf¥RØÂ8ž•JfXŠ˜R$Aa9[eâKjVTÿßH­ÿ‡õ˜Åè~µ…é¥Ã{'âÉò[f˜Ô¸éz"Rf’2RMWÌwVÛv‘\^Óö=…Œ¦Ñ)ôɲª0èÐõ'>KzµÌyYuŽåþ Dì?×ú†K©Î³p¾ú׫øª]|ÛTjY»OzJc’“Ýå]Ê•îLöÛ½´S€t§÷›Tñ%Nl¾ "3PÚˆ§5.4M'*‹bL’”û«m¿{h~¬6MUæ4˜nAJZJ3‹5)›(ûƒ3"¹—íÞ¿¨KãÐþ¦™èÒØ¢¨u¼KT­)¢iSæ=(Û#¹#X³U¿šãtõ |zÔÓ=$;Œ`teñ×>©£zS†x`teñ×>©£zS…!. ï úmÎ$ï ú .§R7 ›N™7WmfçaNd½í|¤v½þCõ%ùˆÓÄÏVuÏb… ÑálOɺǹìŠO âŽMÖ<…Ïd|ÝþþKS0Â([PΞÅ<›¬y ž¡Aá,UɪǑ9ê×íW<¢]"¨êÀ¨P¡žIßOTx‡¬ŒcÉzÇ‘¯ÔdcKÖ<~¡NÊ×|þÙò7ÓÕ!ë#ò^±äkõYÇ’õ#_¨;+]ðkûgÈßOTx‡¬ŒcÉzÇ‘¯ÔdcKÖ<~ ì­wÁ¯íŸ#}=Qà²1%ëF¿Pu‘Œy/Xò5úƒ²µß¿¶|ôõG€HzÈÆ<—¬yýAÖF1ä½cÈ×êÊ×|þÙò7ÓÕ!ë#ò^±äkõYÇ’õ#_¨;+]ðkûgÈßOTx‡¬ŒcÉzÇ‘¯ÔdcKÖ<~ ì­wÁ¯íŸ#}=Qà²1%ëF¿Pu‘Œy/Xò5úƒ²µß¿¶|ôõG€HzÈÆ<—¬yýAÖF1ä½cÈ×êÊ×|þÙò7ÓÕ!ë#ò^±äkõYÇ’õ#_¨;+]ðkûgÈßOTx‡¬ŒcÉzÇ‘¯ÔdcKÖ<~ ì­wÁ¯íŸ#}=Qà²1%ëF¿Pu‘Œy/Xò5úƒ²µß¿¶|ôõG€HzÈÆ<—¬yýAÖF1ä½cÈ×êÊ×|þÙò7ÓÕ!ë#ò^±äkõYÇ’õ#_¨;+]ðkûgÈßOTx‡¬ŒcÉzÇ‘¯ÔdcKÖ<~ ì­wÁ¯íŸ#}=Qà²1%ëF¿Pu‘Œy/Xò5úƒ²µß¿¶|ôõG€HzÈÆ<—¬yýAÖF1ä½cÈ×êÊ×|þÙò7ÓÕ!ë#ò^±äkõYÇ’õ#_¨;+]ðkûgÈßOTx‡¬ŒcÉzÇ‘¯ÔdcKÖ<~ ì­wÁ¯íŸ#}=^ˆúBÆQðY`Øõ×™¡’VÊÛhMÒµ”“Y'9‘šŽägm¶àa!ë#ò^±äkõYÇ’õ#_¨;+]ðkûgÈßOTx‡¬ŒcÉzÇ‘¯ÔdcKÖ<~ ì­wÁ¯íŸ#}=Qà²1%ëF¿Pu‘Œy/Xò5úƒ²µß¿¶|ôõG€HzÈÆ<—¬yýAÖF1ä½cÈ×êÊ×|þÙò7ÓÕ!ë#ò^±äkõYÇ’õ#_¨;+]ðkûgÈßOTx‡¬ŒcÉzÇ‘¯ÔdcKÖ<~ ì­wÁ¯íŸ#}=Qà²1%ëF¿Pu‘Œy/Xò5úƒ²µß¿¶|ôõG€HzÈÆ<—¬yýAÖF1ä½cÈ×êÊ×|þÙò7ÓÕ!ë#ò^±äkõYÇ’õ#_¨;+]ðkûgÈßOTx‡¬ŒcÉzÇ‘¯ÔdcKÖ<~ ì­wÁ¯íŸ#}=Qà²1%ëF¿Pu‘Œy/Xò5úƒ²µß¿¶|ôõG€HzÈÆ<—¬yýAÖF1ä½cÈ×êÊ×|þÙò7ÓÕ!ë#ò^±äkõYÇ’õ#_¨;+]ðkûgÈßOTx‡¬ŒcÉzÇ‘¯ÔdcKÖ<~ ì­wÁ¯íŸ#}=Qà²1%ëF¿Pu‘Œy/Xò5úƒ²µß¿¶|ôõG€HzÈÆ<—¬yýAÖF1ä½cÈ×êÊ×|þÙò7ÓÕ!ë#ò^±äkõYÇ’õ#_¨;+]ðkûgÈßOTx‡¬ŒcÉzÇ‘¯ÔdcKÖ<~ ì­wÁ¯íŸ#}=Qà²1%ëF¿Pu‘Œy/Xò5úƒ²µß¿¶|ôõG€HzÈÆ<—¬yýAÖF1ä½cÈ×êÊ×|þÙò7ÓÕ!ë#ò^±äkõYÇ’õ#_¨;+]ðkûgÈßOTx‡¬ŒcÉzÇ‘¯ÔdcKÖ<~ ì­wÁ¯íŸ#}=Qà²1%ëF¿Pu‘Œy/Xò5úƒ²µß¿¶|ôõG€HzÈÆ<—¬yýAÖF1ä½cÈ×êÊ×|þÙò7ÓÕ!ë#ò^±äkõYÇ’õ#_¨;+]ðkûgÈßOTx‡¬ŒcÉzÇ‘¯ÔdcKÖ<~ ì­wÁ¯íŸ#}=Qà²1%ëF¿Pu‘Œy/Xò5úƒ²µß¿¶|ôõG€HzÈÆ<—¬yýAÖF1ä½cÈ×êÊ×|þÙò7ÓÕ!ë#ò^±äkõYÇ’õ#_¨;+]ðkûgÈßOTxo®¡/Cúšg¢CHU鳩×¥q¥!(RÚ_ºI)$¤ßˆì¢ÙÂ\´nþ¡/Cúšg¢CÃ]5Q3MQ‰…áÜc£/޼yõMÒœ3ã/޼yõMÒœ9B\;ÞôÛœ"I;ÞôÛœ#õ-ïWœ³®xÖÌP¡YŠ>oPµ<”([P¸¡mC Pë j(V¡B†-õáAŠ Vbƒ7V…&)¤g\L)1IðŠŒR|#Ãq*LR*1Hð×Í`úêøô?©¦z$4(ß]B_‡õ4ÏD„Iã|uãϪhÞ”áž|uãϪhÞ”áHK‚ç{¾s„I'{¾s„~¥½êñó–uÏÙŠ+1B‡Íê§’… j-¨ajamB… Ô(Pž¼(1AŠÌPc&êФÅ"£Œë‰…&)>QŠO„xn%IŠEF)ù¬ ß]B_‡õ4ÏD†…ë¨KãÐþ¦™è‰!Üc£/޼yõMÒœ3ã/޼yõMÒœ) p\ïxWÐ#np‰$ïxWÐ#npÔ·½^>rιã[1B…f(Pù½BÔòP¡mBâ…µ -C¬-¨P¡Z… ·×…(1YŠ dÝZ˜¤Tb‘q0¤Å'Â*1Ið Ä©1H¨Å#Ã_5€ë¨KãÐþ¦™èУ}u |zÔÓ=$;Œ`teñ×>©£zS†x`teñ×>©£zS…!. ï úmÎ$ï úmÎú–÷«ÇÎY׆ùXÕ¯‹ö†­|_´_ìë]góèo•Zø¿hj×ÅûEðεÖ>†ùXÕ¯‹ö†­|_´_ìë]góèo•Zø¿hj×ÅûEðεÖ>†ùXÕ¯‹ö†­|_´_ìë]góèo•Zø¿hj×ÅûEðεÖ>†ùXÕ¯‹ö†­|_´_ìë]góèo•Zø¿hj×ÅûEðεÖ>†ùXÕ¯‹ö†­|_´_ìë]góèo•Zø¿hj×ÅûEðεÖ>†ùXÕ¯‹ö†­|_´_ìë]góèo•Zø¿hj×ÅûEðεÖ>†ùXÕ¯‹ö†­|_´_w©ïG8GR1m[Ôª´øT§!-%fÍ/)Å(µš¬M‘$¯Ãðs»£³j‰®©œ~~ÉŠ¦ZoV¾/Úµñ~ѹ4…@Ð,,:N ÆÕú•y½ËK*Kn]Ä’îg5º-¤\<уñ&&¯P¤bJ%V©“Š9ÑÖÚ\$êV¶ÕcÌiJ””‘“cͳ„‡/ÐÓÅ]S1óîÿƒ3–›Õ¯‹ö†­|_´n™:'ˆõªKÄ“ªÌRº%6IJ†˜gþËHKÄ¥%Ópõžé)$]Ià"U¼ýP—£=ï› Ù 3Ͷ˳ÝSh¼µ¦m¥²<Äœˆ#¹Ü¸v÷‚›:ZªŠwNgäf¦žÕ¯‹ö†­|_´mM hÆ&3ƒVÄx޶T<1G"Ýr‰$kZŒ¯‘7ØV+\ì|)"#¾Ìž•´ié˜>6Ñö3:½5R7;‘æ©)|Õ{ ²¡FdfWI¦ö;ð ›h¹úyœÿŒôÎ Î2Óµñ~ÐÕ¯‹ö¦ cÚM^Ÿ×>šÅ1ÙÑ#ÈTY‘ÅÏd–ÌÖiÎg°¯°ŒÈÕb;‰Å/©äëU,m¸Y®SØ£6–iPç=rdËTT»«qm¬ÛJIKkil4¸[HÒ«V«ZJ{÷ÿ˜üö§59ÓV¾/Úµñ~Ñ´1–‡4UN¯L£×ãV—Vz1çdÄ\[k…!´¶£w9$WQe<«±ØÓ|U{EZB¡a¢Äul/2-3*T§T¤›#à5 ”kAm/tD:S¦ÓUýÞÜs„n”V¾/Úµñ~Ñ?Ã#Ò6% ¦»EÂòeSÖFmºn¶Þ°‹ašRµ”[;Äc3EÑÅ.OSþ(dz©±[£US³%,‘gŽ•gI£6b×/øEÀ[8n«M¦ŽíÓÎ#œs“2Ôúµñ~ÐÕ¯‹ö… Í’±Òh Ÿ¸cµr¤ºI̽ZM)²Höf3ZKo\öÚÂgŽ4q¢4áz¬ì¤u.«K#7 UÖ†U Ëi¡²ZQªÄv±*çbïÜV½>žŠöLÎ9÷œe¢µkâý¡«_í|c‚ñ6©D§b Z¢É˜Ê_Œ”<ÛÄêfDiSjQÒà½ø8ÈfûéñAá”á—\ª¦2e-”IeDÛj3$šÖKÈ‹™‰FGú‡IÒi¢3¿»çékÝZø¿hj×ÅûFÝÁŵ-'DÁØšŸ*ˆ…Ærd‰m¸Ia3 ÉYWu©îL̳ÜÊÄc‹´C‹éºN•ƒ)TIsY¹"žZÆÖ§!ëV†ÞZ’yQ|»se±÷Šä)4³VÝþÌóŽFjk=Zø¿hj×ÅûDÏhãP17V(ĨÔÞC0·h}jQ$’— FŽ$ºÙr½†bn„t© ‰Ï¿ƒ¦jà•Þ4:ÒÌË)+¸$¨Í͇ü Ûn\$d-:]4cúùþðn©­5kâý¡«_í\W£†ùXÕ¯‹ö†­|_´_ìë]góèo•Zø¿hj×ÅûEðεÖ>†ùXÕ¯‹ö†­|_´_ìë]góèo•Zø¿hj×ÅûEðεÖ>†ùXÕ¯‹ö†­|_´_ìë]góèo•Zø¿hj×ÅûEðεÖ>†ùXÕ¯‹ö†­|_´_ìë]góèo•Zø¿hj×ÅûEðεÖ>†ùXÕ¯‹ö†­|_´_ìë]góèo•Zø¿hj×ÅûEðεÖ>†ùXÕ¯‹ö†­|_´_ìë]góèo•Zø¿hj×ÅûEðεÖ>†ùXÕ¯‹ö†­|_´_ìë]góèo—œÐ¢+™l‹îûÙ‹?Uf›5Å4ôZ™Ḛ̀7×P—Ç¡ýM3Ñ!¡Fúêøô?©¦z$"HwÀèËã¯}SFô§ ðÀèËã¯}SFô§ B\;ÞôÛœ"I;ÞôÛœ#õ-ïWœ³®xÖÌP¡YŠ>oPµ<”([P¸¡mC Pë j(V¡B†-õáAŠ Vbƒ7V…&)¤g\L? „…b‹Øî?s—ëjå4Óß(ª£Xž#šÔñ¼êmG÷#l®·­O†µiˆ˜œºûª³/aúç]}`ï7ú>éÞÍ׺ÖË“YÜû¬·¿zýñ)‡^!Ó6Çx~£­=âr2[L´‘›†‡OTMÞæ« È‹f¤ïkájxŒ5©â1äý [6ÅÈöû:Æ:­™èêœUÿòÿ¦¯þýÉÿÝÅ.­ªl©Øš‡Œ¡“R(RiDf[o%D·u9b";Û*ˆïk~±ÎzÔñkSÄc­ªm[®+‹œ¦ÌDÂ'3ìoíÌ£ââÍL¬E¤Tª’2ÒU•¬µG’ÿK)ÙÃe‘Œat§¢FŽ0+rk˜¶<¬Vü„¥š|;)­WðŒó/amÌdE{»ãMëSÄa­OŽ‘UºnMTÜÄLæcþÑߎN¯êˆ’ùõUhâ.µz„®œ²Fnæêœ»¿^DÿÈ„¡Lª§¤VŠ0”¼5IîFÅžºúê2ãµ®²’»¶DI3RLX®"+å’àérêÑÆ±œê™j€Ò[lÔyRYa«a}+Qý£ãM­O†µŒí«5ÊæW²LûÂU¼üEzÄk ü;íz&'#'QTÅ]ËCÖý#Á?~±ùÖõÁ?~±•æKÖõÁ?~°ëzàŸˆ¿XÊ€ W[ÔüEúíê?‚~"ýc*1]oQüñë·¨þ ø‹õŒ¨Åu½GðOÄ_¬:Þ£ø'â/Ö2 ÖõÁ?~°ëzàŸˆ¿XÊ€ W[ÔüEúíê?‚~"ýc*1]oQüñë·¨þ ø‹õŒ¨Åu½GðOÄ_¬:Þ£ø'â/Ö2 ÖõÁ?~°ëzàŸˆ¿XÊ€ W[ÔüEúíê?‚~"ýc*1]oQüñë·¨þ ø‹õŒ¨Åu½GðOÄ_¬:Þ£ø'â/Ö2 ÖõÁ?~°ëzàŸˆ¿XÊ€ W[ÔüEúíê?‚~"ýc*1]oQüñë·¨þ ø‹õŒ¨Åu½GðOÄ_¬:Þ£ø'â/Ö2 ÖõÁ?~°ëzàŸˆ¿XÊ€ W[ÔüEúíê?‚~"ýc*1]oQüñë·¨þ ø‹õŒ¨Åu½GðOÄ_¬:Þ£ø'â/Ö2 ÖõÁ?~°ëzàŸˆ¿XÊ€ W[ÔüEúíê?‚~"ýc*1]oQüñë·¨þ ø‹õŒ¨Åu½GðOÄ_¬:Þ£ø'â/Ö2 ÖõÁ?~°ëzàŸˆ¿XÊ€ W[ÔüEúíê?‚~"ýc*1]oQüñë·¨þ ø‹õŒ¨Åu½GðOÄ_¬:Þ£ø'â/Ö2 ÖõÁ?~°ëzàŸˆ¿XÊ€ W[ÔüEúíê?‚~"ýc*1]oQüñë·¨þ ø‹õŒ¨Åu½GðOÄ_¬:Þ£ø'â/Ö2 ÖõÁ?~°ëzàŸˆ¿XÊ€ W[ÔüEúíê?‚~"ýc*1]oQüñë·¨þ ø‹õŒ¨Åu½GðOÄ_¬:Þ£ø'â/Ö2 ÖõÁ?~°ëzàŸˆ¿XÊ€ W[ÔüEúíê?‚~"ýc*1]oQüñë·¨þ ø‹õŒ¨Åu½GðOÄ_¬:Þ£ø'â/Ö2 ÖõÁ?~°ëzàŸˆ¿XÊ€ W[ÔüEúíê?‚~"ýc*#x†M‹G~DxÙN\ªÎ£µÔEß1ÜYðŸ±éß]B_‡õ4ÏD†…ë¨KãÐþ¦™è‰!Üc£/޼yõMÒœ3ã/޼yõMÒœ) p\ïxWÐ#np‰$ïxWÐ#npÔ·½^>rιã[1B…f(Pù½BÔòP¡mBâ…µ -C¬-¨P¡Z… ·×…(1YŠ dÝZ˜¤Tb‘q0Èá‡c}¯DÄäA°¿Ã±¾×¢br25>5 çH2•ª1Ó)ô©‡Q‡(ªqŽCm²Nfi$µ Éy’¾t-=É«Üð«Tc¦SéS£QTã†ÛdœÌÒIjA’ó!%|èZ{“W¸3à23ŒŒX Ê…9øQ)Ò]SjEB1Èh’gt¤q«+gf”{/°Ëè/¬Ðž´‰°Í!ŠÄd&±*"ßi¶ã7úV™Dbqf£lÊä©-ðÏ6Â;–Æì£ÏW2ÇF phòì£ÏW2ÇF¦Óð¹‘[†’Ïû¢×YØ#Ø[Í,û"»“‡ï³°G!°·šYöC¬ìÈl-æ–}ݼzÎÁ†ÂÞigÙ³°G!°·šYöCtppæ¥P4yUй00fy¤Hz2•¼í&Î2êšq64—Т¿Úår±_YØ#Ø[Í,û!º 88Æêˆf}"-Š}.MŽÛÄ(Èa¾åÇ æI"ºŽÛLöÿ1XJÁX§ÔÚp>2+pÒYâÿtNL8$xõ‚9 …¼Òϲg`ŽCao4³ìˆÝ¼zÎÁ†ÂÞigÙ³°G!°·šYöCtppñë;r y¥Ÿds—U4:\ AN‰J¢RiL¶—ÓÖ¥¥]f’,Ç´í~÷ Þbra¦ÀJŠÅŸIû™žâÏ€$ýL„úêøô?©¦z$4(ß]B_‡õ4ÏD„Iã|uãϪhÞ”áž|uãϪhÞ”áHK‚ç{¾s„I'{¾s„~¥½êñó–uÏÙŠ+1B‡Íê§’… j-¨ajamB… Ô(Pž¼(1AŠÌPc&êФÅ"£Œë‰†G ü;íz&'" …þö½‘‘©ñ­:@4ªU ÂÃ8Q©8r—SYÒÜQ;)É)RKvÊîKTêm—à¾ÓÛÁl’U£YÁ®"™9*‰%Q¡·mé~i²‹8¥)Y$l3;š­Á°AgÕj•ÑcO©L–ÄDjã6óêZYMˆ² Œì’²RV."â³jÕYÌD6§6K0Ó’+o>¥¥„ØŠÈ#;$¬”ì+p¦Ñ$:b³…k®b92¥¢"ZÜnÊ3Ršo$µh3ÚDm›¦h-Á¶ 5•Q~—‰akå0ˆš²•FžÁ)ïÓ ‹r8•lGdð&èRºµÆ»ªVjõT´š¥Vtâh¬ÙI·2êÌgaû:·Y ¨3ªóåEgÞ˜zJÖÚ>„™Ø¿˜6‰N «âwðž§DªV†º#¦üv¤8m© Ê’G™$v4¥´¤¶ì$¤»ÄB5_CiÞý]êUá6jÖ-jÝG¶ï§1’®ñÍ›¦«vinRšªNnžáÝqS!dÒŒÑ{ü‡žT¹Rõ[ªKÏêZ&šÖ8jÈ‚àJoÀ’ïlÔ+ªÊ áúEr R—*‚«ÒØ`ÈÏZ¶ÑHZQ³nÓ"/ç ÌQˆðÉÔ 8”±µðŒºóWŽÊ5o3«Õ¡”¦í=¬VRVe~‰]Ñ÷L±á·£:\éQ[)DÖHï­›¬š[LgJUkåRšMȶ¶W÷%m…A£ájèÞ-.•º—žF℆uÊùJÈ’Ì{Oiñ‰UIøN«KÒ•§jÙÔË[J}Òm:”#"M.‰-›¦¢I•Ô¥‘K˜–»Qn³†«nVU*½…$¶ª¹@)iÝvÈн£jŨ%É+îÎål¦{zÁ° N§ÃôXÐêj›ª{hnIŸ ¸’M—ü÷”Ì7‚©qÎ53 Ñ ²fʸôæÛI›.­’’.áÃ5§ä¨ÌÊÇ´HÖXmÌKBÃîb8¸™ó‚¬{. Ò#…3&¾ìeš–hÖëÝRÈÉd„F“Úg‘ë§îÞ¸:åNN»÷ƒ­ÝÎίSº÷6|ÙuÚÝ_úMóåɳ-¶•¹([qî[›tî½Næ,šýv»[–ÖÏ­ý&nýÕï´XÞ|+×\[ËK߬™7Çq#tåµ²ëræµ¶Zà 0+¥z@r“YÄuHqê³§Ã¥9ª{ⶇT„ Í&ûr[J3+ZJlÔ…&ÛH†g©ÎˆšÁÛ¢¯2¥®¢Âu¥,–æIÆlµ(Õ¡Blv5æ^Óº½$‹F‘kÏWãQ)LUä'+ÓÛ„„Èp¸”á'1—Òbõ¡²ûJd cRT‡Ñ*YK®¨ˆ”â‰$WQ‘Ô{NÅÄ,ÆìóŸÙ0Ý‘þsû&ø ²?ÎdÃvGùÏì˜ à,nÈÿ9ý“ Ùç?²`/€±»#üçöL7dœþÉ€¾ÆìóŸÙ0Ý‘þsû&ø ²?ÎdÃvGùÏì˜ à,nÈÿ9ý“ Ùç?²`/€±»#üçöL7dœþÉ€¾ÆìóŸÙ0Ý‘þsû&ø ²?ÎdÃvGùÏì˜ ã€ú§þ<ñþ›ÿjÐï]Ùç?²c‚º§þ<ñþ›ÿjЬ‹ŠÏÖôÿðf Þ“›‚\žÕ^¯Išª‚š‘&™ /:–‰´i5›­›iRÞ<Ùvû’ªµFiORZ©LnœúõŽÄKê&\VÎéH¾S>å;L»ÅÄ?)u:•*AÉ¥Ô%Á|Ë)¹å6«q]&F+4älMaGÄ/TXYÖŸ—PDfX˜Á›ÉIJKDâ¬fZOº%-KØGqLY•$é_Mr©ºTòâs’Ú˜~C*´(ß#33Y‘­w2R ;LŽç¯Ù«UX©MšœÖç¨ÌÎJQ:f|'œŽÿ´Z™>tÉÇ:\Ù2%¨ÉFû®©n—æ3½Åv%Ÿ‰6»W¬Óäâ(U¼PÍÝm˜ïÈyJtÒ›©(^Ó,¦iQ‘qøGæ‹Ûºwô¿á,c$bü‰ìÔ$W*oLe&–¤.ZÔãdddd•ÜŠÆ|c+¢†ÜwH¶šBœqjq)JJæ£6×b"êŒeT¬Ö!³T™‹J;Ò Zh:†I«²”YYuºÕ%´¿|ùr*ÄŸá Cc‰´X’`Õ&ꛫ×Úšša@Lõ3 ë,jÑ(µJm §*Ì»³=^Û™™ìYx{Ë­oܬ=F~«vÏv»OmOݵ%Mž°Ó›¹RRe·a¤Œ¸~U0ö ªÂD¦¢ÎŠÜ‡$¡‰4öÜm/-fµ¸IRL‰jR”£W ™™žÓŽv0¨–X“K©"4C…¨þ&z1pÒãµ!z“¹%nš²§?èУî¯Ü¥[é”)¶PÚÝ[ªJHÅ‘fQ—|ìDW?ÔDCü,>úd¥útS.2bH%ÅI“Ì'>V—rîZÇ,“ØYÕ³i[BŽÃl0Hi¦ÒHBŒ©JH¬DDE°ˆ»À=@,nÈÿ9ý“ Ùç?²`/€±»#üçöL7dœþÉ€¾ÆìóŸÙ0Ý‘þsû&øâέ˜?S·þ;ã³7dœþÉŽ2êÖ2V•à(Žätf̹÷Àu CýqÍÿBÿI”5VªTd’hU"i/™Ñ+›}_é6%wSv±] "ÖŸØÄ¢·‰¨qj¯ÇzzIÆÔIY% QØ®W"2¹~Áƒ®Tð-v)E­±OªGIæ&¦@7GÇe Ê㟵d-ìDå &Ÿ…¨.Qä+•*kר}–lkMQ”úÉ‘6‚%H–µCVÃö£bf0ª£UdUâT—[Þèz¶©ïTd Ø×THpâ´ï»Ú­†”_)ÊÒdÔp"(§DLzzifœ‡ 0i½í«É–×ïXXÖèãx·‡{iÓ|Û‡{ sÞ÷¾¯&^ÔDhØ£ÖYGj³6Ÿ%8¹Ú<‰o± É*a4×%,šÎÁ8J±];‚º}ÒDš™*±+Ta?‹ˆÅ D8¥Æ#æ¨Úifó§ŒjqM§U‰H=‡îGºìOCH›,½¯h˜§ä$;ªÕg+#bµ}ÅËn^çƒ`ªeKͪFªÌbŸ&¡diNÀ5¼Ïû‹4]?Ì`!”1†ºôlBöãV4• égJš~¶äu™¯.³9†²2YÂ,§´ÏoˆÆýàÍ˹Ñ7>èÝ:­Æ¬šín·Yl¶Ï¬îópæî¸v_]Ø{Ƃ粖:£>2_ÿËWøÎŽË¨®/ù¿èCŒ:¡nFVû*ÌÛŒšÐvµÈÝpÈÇ[Öñ5-UøïOI8Ú‰+$¡J";ÊäFW/Ø&y^i2*ºMÃ'IE©C¢Õ%@yWʇ’ü"Y •) /’£µŽÆQÚ®4”ÕCâTEµRb‰EŠüeä5ÃyS§4á+:’ƒÈK5‘©IA‘®I;ˆ¼I…W1¹ŠÒ¤´ÚÚm㌳Z³I©$¬·"3B Ë¿•ábgKGT¶RÍ2ŸI‚Ò^) Dzn­$é‘,‰(.êÆe~¦+ªÍÑýY§ÚªÃ¦OnI ßLšv´4_!¨”ƒÍ–çkð_` xåÞ«ö²Ûÿ ‘ÐÝwaï~ žÈç.ª)qçââ9¬ez̪Êe{!¢=‡·„„ÓÌ–t‹>“ö=2!=ÅŸIû™ õÔ%ñèSLôHhQ¾º„¾=êiž‰’Æ0:2øëÇŸTѽ)Ã<0:2øëÇŸTѽ)—Î÷…}6ç’N÷…}6çýK{Õãç,ëž5³(Vb…›Ô-O% Ô.([PÂÔ:ÂÚ… ¨P¡‹}xPbƒ˜ ÆMÕ¡IŠEF)× Žøv7ÚôLND ü;íz&'##SãZt€=RªRž«5M˜å9…êÝ––l¶­Ê—l¤}Òv÷ËŒxÄ‚ÅÅgëzø32ƒs«1"¢³³ºY£´á!N$¶¨‰FFIîHû£#"á>æ<@&¸®‰¼,í]4ÊM5æ'³›§U“1.!Ä:«¬‰× #k†é#Ìv-ƒÑ‰éT6hU'é´f_†Ö¯{ê°¦›«;­%þ”Ù¬õf¤fàBl«Ò;ˆß ë²Û.:Ë¡ôkR’dN'1§2O¾Y’¢¹wÈ˼-‰ž(©B,%…ã¦)ÕÑ”I’nHÖ6e2JLÒZÜ—3#QÝ&WQÚÅb,F eJdi°Û’ƒ¥Îq³RÖ“iÆã8Ꜫ+™)VUÈÈÏg“=Ù0ÈÑ¡»€j ²™©¤I%/1¶ëR H2Í–×i&G–ûOi•ˆ³¸ì+N«Ä†œ&ΦLr$©ßÎÒžŽÛŠ&.³""ϳ9/mûÖ Ý߉°fÁÔnØr#n†Rû:æÆÕîV›–ÔŽÆ[ J'Riø]™®Ï‚ÍeôU¤ÓZCÎ8†’Ldγ&Ô•ž±6Êáï_Ä G©ÊÁLÓiRaÚa¨á!û(ȦÊ7NRØ«(Èì[Nö0Ü!䆎á7!—Y¡.V“IšT’RUcïLŒ¾FF&8®‰¼,í]4ÊM5æ'³›§U“1.!Ä:«¬‰× #k†é#Ìv-ƒÙŠU½‹¨ôht¸/OIi3\ƒ[däfŠÊtÑ•$¢-©½ˆ®fw3nøz)ÐfÔ¦7 DÉN_#,4n-V#3²HŒÎÄFA ÅJ…K\:ƒeNj;;SX‡ä8h#Q%ÄÊ%šÈ²ÙM”eÞ¹þ>1ðÏÖñ?ÆHnÌf|®"hU½ÛM‡DD±ù1¥¦CŠuz–Ôᓤ¥2P¢îR›—{`ÉÑ Ñ&±‡ªjÃðJœËr °zéqL§2ŒÏ[Ü™¡H4åÊFµm-5`@@d¦7LzœíE™ Æ–¹†”Sif–Ù4Ü–N(ÎäGÜå33ïÜcE€b±gÀ~ǦB'¸³à ?cÓ!¾º„¾=êiž‰ 7×P—Ç¡ýM3Ñ!C¸ÆF_xóêš7¥8g†F_xóêš7¥8Rà¹Þð¯ FÜáIÞð¯ FÜá©oz¼|åsƶb… ÌP¡óz…©ä¡BÚ…Å jZ‡X[P¡Bµ 1o¯ Pb³ɺ´)1H¨Å#:âa‘ÂÿÆû^‰‰Èƒa‡c}¯DÄädj|k@Îr‹ˆ[§QdR_ RêLH’‰ T¥H%fBT”n ¬DâûÛsïb·¥X½ö·½4ê5*œÌ'$8L²O8‡µí¡·Iz×fF„lF[ ûâ46ÀNÄé‘B—FcÑáF’óO™Ç'³¡Æó‘(”·grZŠÊ¹Â#Ú.W1|Ê«SÍtÚdY5#-ß*;kK’l²_tF³Jn´¥G‘)¹€m›o8TV©¯R©’VÃG)æÖ§YmjRÌ’Y²_2Öd£I¨ŒöX­á¢T¤R*mT"“jq²RM.'2•$Ò¤¨»äiQ‘þ£ @NÅ"ƒ*ˆÍ“‡šIa/fiÔ‹:T§ ÎéZ’d¬ÄEÀD{FsbxQêP7¹šiQ)ÐÙbqÇ|”ÂÚeQe^D¯»B”YТ²‹ýÒ€°3ìA";r›%Z<‡µî579–·¾²R•‘öÙV=—½ˆ{¥ã9ïÌ¥KM:™Êlw"6M2¢C‘Ök»KI¨ÈÓg›‘Œ”w3;Œ€°$±:dP¥Ñ˜ÃôxQ¤¼ÓæqÉìèq¼äJ%-ÅÜ–¢²®DG°ˆöŠeb‰Âi½í§75¶˜dª B÷FFI$Ùš)2$$³%$fEc=§|ØñKË%1é¨r¥¶¦äÌŽÒÉׯtDF³B3pD§a™p†? Õ\¡×¡V‹KОKÍ6þl™Óµ&yT“Øv;^×-·+‘ãÀ1=3¼ôi(b•Kƒ"Z ¥FmiqÔ™ÝEcQ¡}ü‰Mø8 ÈzåÏ…IÁŽQ©5£žª²˜~jRÂÛ(ù}Qæ.èõŠ;šnFM¤ûö(°ØÍßÿbo^â…þ³º7V«ôþç.¯=ýÇ~ÖáÚ<`@b±gÀ~ǦB'¸³à ?cÓ!¾º„¾=êiž‰ 7×P—Ç¡ýM3Ñ!C¸ÆF_xóêš7¥8g†F_xóêš7¥8Rà¹Þð¯ FÜáIÞð¯ FÜá©oz¼|åsƶb… ÌP¡óz…©ä¡BÚ…Å jZ‡X[P¡Bµ 1o¯ Pb³ɺ´)1H¨Å#:âa‘ÂÿÆû^‰‰.kjqÈIJ²žºs ™ˆö‹I™mᵸx†»ÂÿÆû^‰‰ÈÈÔøÖ†Oxª?*™çh(oGåS<í¥Àt²{ÅQùTÏ;DéCxª?*™çh(Æ žñT~U3ÎÑ:PÞ*ʦyÚ'J1€'¼U•Ló´N”7Š£ò©žv‰ÒŒ`ÉïGåS<í¥ â¨üªg¢t£2{ÅQùTÏ;DéCxª?*™çh(Æ žñT~U3ÎÑ:PÞ*ʦyÚ'J1€'¼U•Ló´N”7Š£ò©žv‰ÒŒ`ÉïGåS<í¥ â¨üªg¢t£2{ÅQùTÏ;DéCxª?*™çh(Æ žñT~U3ÎÑ:PÞ*ʦyÚ'J1€'¼U•Ló´N”7Š£ò©žv‰ÒŒ`ÉïGåS<í¥ â¨üªg¢t£2{ÅQùTÏ;DéCxª?*™çh(Æ žñT~U3ÎÑ:PÞ*ʦyÚ'J1€'¼U•Ló´N”7Š£ò©žv‰ÒŒ`ÉïGåS<í¥ â¨üªg¢t£2{ÅQùTÏ;DéCxª?*™çh(Æ žñT~U3ÎÑ:PÞ*ʦyÚ'J1€'¼U•Ló´N”7Š£ò©žv‰ÒŒ`ÉïGåS<í¥ â¨üªg¢t£2{ÅQùTÏ;DéCxª?*™çh(Æ žñT~U3ÎÑ:PÞ*ʦyÚ'J1€'¼U•Ló´N”7Š£ò©žv‰ÒŒ`ÉïGåS<í¥ â¨üªg¢t£2{ÅQùTÏ;DéCxª?*™çh(Æ žñT~U3ÎÑ:PÞ*ʦyÚ'J1€'¼U•Ló´N”7Š£ò©žv‰ÒŒ`ÉïGåS<í¥ â¨üªg¢t£2{ÅQùTÏ;DéCxª?*™çh(Æ žñT~U3ÎÑ:PÞ*ʦyÚ'J1€'¼U•Ló´N”7Š£ò©žv‰ÒŒ`ÉïGåS<í¥ â¨üªg¢t£2{ÅQùTÏ;DéCxª?*™çh(Æ žñT~U3ÎÑ:PÞ*ʦyÚ'J1€'¼U•Ló´N”7Š£ò©žv‰ÒŒ`ÉïGåS<í¥ â¨üªg¢t£2{ÅQùTÏ;DéCxª?*™çh(Æ žñT~U3ÎÑ:PÞ*ʦyÚ'J1€'¼U•Ló´N”7Š£ò©žv‰ÒŒ`ÉïGåS<í¥ â¨üªg¢t£2{ÅQùTÏ;DéCxª?*™çh(Æ žñT~U3ÎÑ:PÞ*ʦyÚ'J1€Å"ª*Tu½å%-(ÔäâÔiU³'a™^Çk•Èö˜×B{‹>“ö=2 ë¨KãÐþ¦™èУ}u |zÔÓ=$;Œ`teñ×>©£zS†x`teñ×>©£zS…!. ï úmÎ$ï úmÎú–÷«ÇÎYש’3¸ÂÌÛRVD²,×RTJNR#E¬dfCË»ö cTÚvn·6˜ÕQéSŠË/ºâl›CjZ•«RTfzÔ‘wDEep÷³4ªUuè¯?K7iµ*¹éŽo¬—m6ù÷ #+žxçlä¢Ê­¤g´LÕ ‡ù)¨ÍçZ[qÓ+‘w(A­G·‰)3þaJ˜}1‘%L¸L8µ6‡ '•JI$Ô’>2%$ً̻Œ„¶‰#ÖŸT"¢8Ý6¢êÝn\…fR#)Ö–IS‡e%MöšTK>ça¨ªP£hÆŽÛØ~™5GSž‚q÷$ˆõqO?pêJöQ¬„ì¾cSp†ŸQ Ñ&±‡ªjÃðJœËr °zéqL§2ŒÏ[Ü™¡H4åÊFµm-‚'1ºcÔçj,Èn4µÌ4¢˜ÛK4¶É¦ä²qFw">ç)™Ÿ~ádcGHaΦ¶«´f*±*ËCæÊ—d(²¨Òw³F\$}ñÍã覌‘%ÝCj„F’¶¤%—–Þ±-¬Üs*7,ÄGcµÊüd,4gj£ž9O”ÿÿjGRÞ¡$§+I$ñî­ŸàÁ«•RÒdÌ,ö"¬Vãǧºô¥ÕéH‚ão¥ä!;›+MkÙ27.²%¤¬Ý–yÄߨÿ]ò#˜;Yãøý¯,.„Et¡ŠnÂ5Ê»UÔÊ•Jn:ÖÃok,o<”$•ú4Ûa¨øo°¶XÈÆÊÄ:IÇ´Ý(±¢h·wnÌÎé`ÑqÒdJyjÔ¯&d’Ó´ÈÔ’,ÙÐjòi—ý‰Òÿ„ˆ)r° ¬YðŸ±é î,øOØôÈ@€o®¡/Cúšg¢CBõÔ%ñèSLôHDî1Ñ—Ç^<ú¦éNáÑ—Ç^<ú¦éN„¸.w¼+è·8D’w¼+è·8Gê[Þ¯9g\ñ­˜¡B³(|Þ¡jy(P¶¡qBÚ†¡ÖÔ(P­B… [냬Å2n­ LR*1Hθ˜dp¿Ã±¾×¢cfƬ›be{¡­¤·!RTnk¦ÉD’M–H±Ü-©?v|I¶²ÂÿÆû^‰‰ÈÈÕFkZ 7Ur‡^…Xf,y/By/4Ûù²gNÔ™åROaØí{\¶Ü®Gè¦WSMÅqq*==¥Ey3ï)„­$YOk†³²ˆ•c]¯ú¶ 86ÌÀ¯œTÉŽºE:U=÷ò„þ´Ûe{lhQ,œ+ÛÝÈŠ÷±D,Y%Šâê¯S)Òï ÈMÆq.!–YZ ³J µ¤Ë¸RÊægîŒýÖÑÄ Å ºšEfMEš==ô¾Ëì”gíSHu&…r¸K÷ RHÔ£;øle]9O¦¢´ªeA¶Ÿ\ˆç1µ¯RâÒ„¨È‰D•\›FÅ’‹¹àá@ @”ËŸ “ƒ£RkG=Ue0üÔ¥…¶Qò"ú£Ì]Ñëw4ÜŒ›I÷ìX-ßÿbo^â…þ³º7V«ôþç.¯=ýÇ~ÖáÚ<`>ŠèÆ9KÑ|8ŠuæIæßlÜeÃCˆÌã…t¨¶¥E}†\>u ‡MšM ¨pñ"Ya¤åBOb.oiþ¾ø‘Û¸w"™\ßÉø‚µ^¨¢2â0õEL–çejB–„%–ÛOtm¶f£#QäNÑ{Õiôz¦T¥"39‰¥\ÍJ3-„E´Ïa‹¼F|8³¾•¹Uû¾7Fô­Ê¯Ýñº1¦ºÿÂ^6þîï²5Ö”**š:Òløk£»½Y”Ó{<‚=†D|$cUvwÒ·*¿wÆèÆ7igHš…"‡\¯îº|œºæwÍ•D´÷IAwI#Ø}áNPp@1X³à ?cÓ!ÜYðŸ±éß]B_‡õ4ÏD†…ë¨KãÐþ¦™è‰!Üc£/޼yõMÒœ3ã/޼yõMÒœ) p\ïxWÐ#np‰$ïxWÐ#npÔ·½^>rιã[1B…f(Pù½BÔòP¡mBâ…µ -C¬-¨P¡Z… ·×…(1YŠ dÝZ˜¤Tb‘q0Èá‡c}¯DÄäA°¿Ã±¾×¢br25>5 çH‹>“ö=2!=ÅŸIû™ õÔ%ñèSLôHhQ¾º„¾=êiž‰’Æ0:2øëÇŸTѽ)Ã<0:2øëÇŸTѽ)—Î÷…}6ç’N÷…}6çýK{Õãç,ëž5³(Vb…›Ô-O% Ô.([PÂÔ:ÂÚ… ¨P¡‹}xPbƒ˜ ÆMÕ¡IŠEF)× Žøv7ÚôLND ü;íz&'##SãZt€Ý@¥È­U™¦E[HyìÙTá™$¬“QÞÄgÀ\C`ö ÒŠÕäïôb-¢ßöîý/øK@qæ!w ÐÑ*<ªU2™‡½ªÝ¸¢I$×eeIe©V;% ;€q?`!ø­^NÿF‚t‡âµy;ýë³Æ/ÕYÑÍJ–¥Ä_ª­™ÑÖ”©IIS¦º¦Tf]Êó)#2±Ý\dy-ÖäÕ4I…±rb&]$ÙÒVIm&µÇBÜY‘%%s3ØDEú€q—`!ø­^NÿF‚t‡âµy;ýêèZL£Õt‡O‰N«¸Õ¼;Q©ÏÝp\Š›6ô"iòSÈI›y\~ËIä=§sÊVͳ¤Œã^r|ȉ‚Ò_|¦S%FQ2¥’ Ô¥ÖÒklŒÊî$)á3"Ú»éÅjòwú0ì¤?«ÉßèÇmb,]‡póËf¯Q(î"6êRI•¸dÞ± 'ܤû¥8´¥)÷K;’Hìvõaºõ7Á\Êj¥dmÓiÄI†ìg[YU6êR´”“ÚEr207Ø'H~+W“¿Ñ‡`!ø­^NÿF;ÜpG`!ø­^NÿF1Oè·°òØ~U5§[Q¡h[Ž’¢;6¡ƒUãgMÀ¸B~ ¬Ô‰4©§• ²YË*WÚ£à/Ûb#1—"v2®x}+ž_°0øçÖpmMŠum¤µ!øå! ,Äy kFÒQ‘Ý ØeÄ}ñÑx‹J04‘ÔÓ‹ktiÒZ^ôHfd5¾fäu›fF…[…&Fv>#úH ýZßð>¦oüwÂ$hЀb±gÀ~ǦB'¸³à ?cÓ!¾º„¾=êiž‰ 7×P—Ç¡ýM3Ñ!C¸ÆF_xóêš7¥8g†F_xóêš7¥8Rà¹Þð¯ FÜáIÞð¯ FÜá©oz¼|åsƶb… ÌP¡óz…©ä¡BÚ…Å jZ‡X[P¡Bµ 1o¯ Pb³ɺ´)1H¨Å#:âa‘ÂÿÆû^‰‰Èƒa‡c}¯DÆÞø]ªÞªTب­ຄ"Ç#Kä¦Üs¹s5ÉD–]<¹vÙ$Ff{1õSŠ—„haµbœBÅ0唤%Ù&Þro:Ò„w7+™­IM¯ß¿xÆ>%*eN¢ôZ)õ2I¨ÐME3tÐG±JB YvZås"ã1çÌc4ª£Ò$Çf›1Ç¢6§d¶†je ÷JY]$W+™ðÚ¥­J&Ž©Kž,Ín˜êo9q–b+ÿ0dx€I©ØF¡SÄÏÐãSªÑ䯧®KÌ= FòVˆúÃI ¬d•¹d¤ÏmœG íºÕU4—hµ&ê NdÅTU“Ê.2E®eüÁº4½4JʪåGM" u#½¡”eëŽÅsî-›€Œø8{©x^¸ôš{²píyÈ2žJR¨Ð–jy65(š3+)Y£/ Ï€Œ3ß‹Y¨0‡àRgËeÇ·:f2Ö•;—6B2+²í· ¶<ØS Ì\)±$F’ƒ"S/6hZLûÆ“ÚBr,Ë?†1#¥?‡ªÍXT…á8›4›fpî^ä®WW\…8JŒþ"ÄôÚsq+›% šÐѸm¤Ïº^Rá$¦ê=¥°iÌs°ÔáŠÜI.·VÃÕÖˆH4”%¥iJRvpÉE±²Y£2»Ägß°òÃÃÕù¬°ü:NKRµ²¶¢-iq(;,Òd[I&dFeÀ|!˜ÀÇéUF)ÍÔŸ¦ÌjŠÈÜ•°¢iJâ%XÏaìýB¸tZÄØχIŸÖ¾Ôu­´[‡2ˆ¬_ÎM¢ßöîý/øKÝŒpYâÌ[L•V•%º5*;ŽFn FDI1ÎàÜ5²¤(’–³¤¬­ºåܶøGE¿íÝ;ú_ð–6í«¤­ «W‹Œkªf¯ZÒª“‹ÎK>à¯c²[ZŽæV"¾ÑÖÕ¯ÔÏ~0åvïéã¹½èú:¨Q11Ùm«S±ëL7.cÏÉFº¦Fw3îûévêY™ë¹•’JËÑðSå ¸z:ªKm–ETˆÆjJU¹I•­"3+ÜÊäGÁÀ9Éʦ[Â(ÄËÆ5„Ä\´ÅCgTZ£4¬ÉdW¶K¶´Þü)=ƒÏ*µ¤Ø²"Æ“VÅì?,È£6ä‰)SÆfDD‚3º®fE³Œvá'Þq⣣}õ³¤zž#Mb£+ ÑäFÃ5 D7éκúÓ)õÆR$VÚ’FÅõw<¶.éY.—„%aªãø»HSéðóTtÉ陉§T’â¤=ʼ¢JJõjND%'u$»»–]9QÄH§4ËÕ Þ,†Û噕¿*Cdáq¤Ìöÿ0õÑ+XÆ£N—PHµ dh¯4Ê—*¡,ó-ÂqI"&’³àiW½»ÂxIÆrqqœa¹p ©ÈÑ<•ÕÚf­X¬5ÐÝ`ÖÙ¢ -ÈËŠAgmÄ ³šÈIyŪÇk žŒ(•ÚTZô²unÌSÑc•AéÅ “B™)‘8ït•ªê"¶|¥±$9…5Í#<‰/ÀÄX¢|8ês4¸Òe)“Kv5*çc""4™æ"2%È®<Õ,]ŒâTdÄë³§RòÛ´‰4ée3+-Ï*¶mMÎDzæõ8¸èí K×¶3åuÎO{A×¶3åuÎO{Bx*º£Œ§£¶†žª×qWWüä÷´: Go½'GÔ)2^qçÝŽâÜqÅ”µî¨Ìö™™í¸óß±6¢&eÚÍø¹3 }¦jÞ.™¢lUnŽjtèë¥HÖJr¯MZZ"AžcJdƒ$f}â3Ø Zßð>¦oüwÆáÓ÷Ħ0ú¥ÿDÆžêÖø×õ3ã¾8Rï-È+|'ìzd B{‹>“ö=2 ë¨KãÐþ¦™èУ}u |zÔÓ=$;Œ`teñ×>©£zS†x`teñ×>©£zS…!. ï úmÎ$ï úmÎú–÷«ÇÎY×RHøHešj\)˜}I§¢©ú„E•%&„ëõ’Š:³+gsž:ˆûÉ4†·a¾¨²Ù’„4â™q.l–…줞Åà ¤Ni´œKJÁ˜À« L‡ø,¨š“t›Ë)‘ÿH”žÕ™‹gt[vˆöŽÝm aÇÞq-´ÝV*Öµ‰$N¤ÌÌø…5Dr ?™JnN]Òqægˆ1$ÍÅ«*s“b¹ ˜‰ÄäN°^İñ I¡Ïmç©<Œ›&n™nGG“ÝÜBH̬£UŠæ,nZò4e‡Õ %@›“^”l©¦—g]ÕÆKYL‹jIt“nJˆ¸ C19G­HÄšSJáOq¶¥™jTim%5•6| RKQÈ%l¸ª# ÔSA›I¡b)h‡ :. Y¶cÅu)-i¬…jIFjVÛæà2°lJQ4ŸÎ-“M£Ó¦´)Éeª åjÉ•UeW¹3Ë´ˆ®D"àÑ@@›E¿íÝ;ú_ð–6f¯7D¢I4W+}!¾–G•æPÔ”:“;ZÆN¥&\&JÙÀcYè·ý»§KþÇdÕð&†iއj4ÄÇ©ÖõÛÜʤË2{RI7;¢VTØ–Ÿte{Ø®cÑbí4f*öáÂýª«ÄÓìix¸º›•¹Ù­Lv-?1¹þ23–kšœ#;Úæ³;pÚý&±G¤T©dö!ßT"‹RvA2énv›5g5’FkVb3$’‹ôe´ÆáNÐʱ¡àÔÓªé@:‰Å)2ÎÑÉiA¬×›)e$²ß6Ò;[hÌöÑ¿'?¾ÈéiÔZýÜ#Osös$JÃg†'±=ÍÙ)Ê´IiaóY“©J$¦jI‘•ÍM‘ÙD£¾Î —ªŸ‰Y…A¬&*\IçC[Q ¥2M¶Ô‚Z’R5–<ËFÓ;÷Gm—"éÃz7äç÷Ù ÂÌÑÆããŠ^ëK6ï¦Ìº7ÆAj÷;±Q“.}¹·Mïr¶N¾ËN¦Üû%¦¹ØsåJ°R°tJ~¼’ùÕeËÃmêÛ"[qÉ $¤‰WK„D\DFBÆ6›£Œë•NkcJ¨Èy•å2Ì…8¥$ì{JäeÂ:“°Þù9ýöGH†ôoÉÏï²:@U¸öJ'Kr}°ä@wØoFüœþû#¤Ãz7äç÷Ù ·GIG _Xr éÝ|[aßøEŒàÏvÑ¿'?¾Èé-ìT}KM7H5Ê5‰‡*˜Õ°Òq$DkŽµÌŒî¥¨öñX‹Ëª¿M؈‡£Of«s3/Í?|Jcª_ôLiî­oxS7þ;â¤| ì ^›ˆô£ŠæÒ§¼¹‘qO6H<ÈIR,ÇÀ[Ki–Òá­oxS7þ;ãËKÕ-2TJJ²§ lšZ4’Ü~Kl6“Uò‘­Å%7;Š÷;·$1 =8Riµ)Té­j¥Eyl¼ŒÄ¬«IšTW+‘ØÈö–ÁçÖ˜G©ã ×ðôZ¾³skóþ‹+«Ë•jO´¯Á~•í`Â~øNôÂìžÖ 'á¿„ïL¬Oà ޘHã`“ÚÁ„ü7ð郵ƒ øoá;Óã`pïS¶ iÃmɶQp–©î”x+š Ñõ“"¥2zõ,'2‰ õÊÆ"øÒ«:µ†eÓ"áLL‡žÉ•NS”I+-*;ØÌø ˆQg=uOüyâ/ý7þÕ¡­FÊêŸøóÄ_úoý«CZ‹ª™•nlÑÙešbÒu9홿MŽò­«ŠwÌ´‘ÝgÝ^ö$•씑~KšÝE2•‹M›èq__;)O6•¨‰Ã,豨ÐY 6ËÇq„¢âZÍ6ç§Éi´†ê q›qM8dDkmKI›j±'jLaq®Šk”ømE‹-²C7&¸Í-Ö.wýŠI­½¦gÜ™m;ŠmlQŠf%ªSc8n±cÌ6³;æJi#þr!Ž333333Úf`/¼º–¾)¡ÿ¼ðè°Ž>’¡ÃÃxƒU ¹×+ÓªNIe4­[$…­·õ†Úò´”’P•f"΋ùº—\m'†JZRwFÃ;Ü4$xGG˜C Ie굘Éen8ˆëÄsžŽj^læ¦\}M¨ÌÔgsIí;ðíÀ2ªhFŽ1;µÊ¬¹˜Ã>ûE‘1nGF²Ò‹VÒŒÐΩm%²ÈI¹(ó\öŒö"n·XÅø ×j.Á)º´çN1èªy >Ê"6n¤Òá+S –²I‘Û;];z‰ƒp•¸åf š–­fLÓq¦5ŠÌ楥,Ûg1•Õ«Joß• „¦Ó§»m´ÔÙÚr<÷˜y§ßqÇZmiq9Ôë—"Q•kXˆ€A(2ªxxW Uk•TÃ=ý×ʉ1qdMÜQŒÎ´i_t…›‡”Ë1§nËœhš|Ú†eu nL~4ÙÐJK–5¾ˆòÞa·eÂ¥!´¨Ï¾gqr¡ƒp”Ú:Œ¸e%2Û‡qÌv+±û“Iäu¥¥ÄÜŒÈì®êç{ŒÍ.JK¦5,(­“L²Ù‘% .ÿý÷ÀDôŠšÚ¡L,8í=ª¶¤Î"§´µÇ5’Œì²B’«Èö^öU²ž¤À•m+×0~%¤j5†ÃqdÇ+‡‚Q)Å(ÝZI½†I±{æ#$å5íkˆqQÙ¡Wj”gaÁSÜÌÎÄ­„gc. –Ûp‘‘F+•ùS¨“¡3„±J\‘Æj§’dWÛÁ´Q.|êšø{ÿ÷R¤èÔãmõP4ë“ °ûkiÖð´4- I’’¢[¤dd|CR ¢@¬YðŸ±é î,øOØôÈ@€o®¡/Cúšg¢CBõÔ%ñèSLôHDî1Ñ—Ç^<ú¦éNáÑ—Ç^<ú¦éN„¸.w¼+è·8D’w¼+è·8Gê[Þ¯9g\ñ­˜¡B³(|Þ¡jy(P¶¡qBÚ†¡ÖÔ(P­B… [냬Å2n­ LR*1Hθ˜dp¿Ã±¾×¢br Ø_áØßkÑ1¸ðÝ9“ÃnU 'JL•¶üu)ܱZ$ Òâ’Ò’®èÔ¢ÌgbÉúÆ>ªqRðŠ€šPàá|AˆÉ¨ì•!„Ñ¥½!©N:¶Ó%¶^Qf‚Rò&ÈrÊÛÜ,»­„¬THÏT܈Ö#£ 3­\Å)æÚµÈ²‘-²qJÚ[ƒ>à#·›pÀG²ŸÄÔÊ"*4ÿûS&â™™ÃaÜÊ4'²ºÒhÚ’±ð؈Ìep¦€þ%¢±P¯Ñ$4ýYˆrá6óÚÒ%™§¹EŒ)£:dJZndGrMQÝXƒ ¦-fP–FjTT<’Gê=kh?ù\e)ØURè°êë®R!Æ–û‘‹t-ÒSn£!äQgÂKJ‰Et‘ti=‚s:CUÂS©±g-ù*œ¢)ЛqFôr5’ Jîrf4‘åQ™ŠäCò~Cê­.™‰%ʼn%եǒgdÉ&„÷³©7áà20Ý>?LÂÒ&RæÔ©Sà7Z"ÌD£q+dÔJ4¨É(<Äf…&ɺ®[RE´z)xnS8Ò‰MLºDÞãNB}âqq$¬É$¢$gÊ¥¤Ðdi+ïb¹†è€Œ?B¥Ô0UJ£.±O§Êf£–×$¤D)·Ô¢³M¬1¥6=¦Zµ_-Ë7Ž7¢”¹5š]>3®)¸ÎIS¥º2ŒÐIB”I¿ð”I.÷ › `ÀH`a)òdUã=2'é-¥éâ‹3F´ Ö…%&•gAðÝD¢ÊJœÃÅ—U‘³‡ê¨E9©+6MÕ-T”6y36œŽ%D‚2U#›/s´n&FVã¦KÑ#5S`Šn­â5u!H2&ÌÒiRLGdq(dž&šìùñe;žšrÍ’£&ÙQ+.SÊJ5™$ŒÎÆ|f't 8 ís 9J¢E¬Z™24É f1F[ŠS™“Zì¤R#ZJʲ®{m£9=Ô \ŠÕYšdU´‡žÍ•N’JÉ5ìF|Ä6`!ø­^NÿF"Ú-ÿnéßÒÿ„±ÞšJÆ`öh޳Ez­¾5#ˆãl¹•ÆšLgä8êS”õŠJ#ªÍ•Fv#¾Ã4ì¤?«ÉßèðNüV¯'£¨ö.€œEH§´¨îÓêTi•tÔJAhi…ÅI*)Y³\¬HïÞåä§i+OŽü†j! “+Vè!…)·œ&Ûu qkhÖ¢-bHÐ\&d[@q·`!ø­^NÿF? ½ ¤®ªbˆ¿[ôc¸¥bJe¸‡j-šÚ¨3Mq(#Z‘%ÒA¡³$‘™“ˆ>"#¹™]`Í023#"3#/ Äìü]ø/ôcÏRÐÎ8§Ó&TeBB#ÄŽä—T¤:’$6ƒZ¶©W²O¿·€t~6ÓFÁuÕQ1>$•Mž–Òé6¸2”JB¸•%³J‹a•Ògc#.2/.9¨¹Pk;­”q×&<Ór¶ÔŒ÷½ÛY£"MÈÈŒ¬De°DJpãQî RäVªÌÓ"­¤<ölªpÌ’VI¨ïb3à.!ámÿ·tïéÂX²žÁ:CñZ¼þŒ;éÅjòwú1ÙzJÆ`öh޳Ez­¾5#ˆãl¹•ÆšLgä8êS”õŠJ#ªÍ•Fv#¾Ãô½‹ 'R)í*;´ú•e]5DÚaqRGÁcJŠVl×+;÷¹ö ÒŠÕäïôaØ'H~+W“¿ÑŽÉ§i+OŽü†j! “+Vè!…)·œ&Ûu qkhÖ¢-bHÐ\&d[FbV$¡Æ[ˆv¢Ù­ªƒ4ׂ5©]$2I‘™8ƒâ";™‘˜ì¤?«ÉßèðNüV¯'£î8#°NüV¯'£Á:CñZ¼þŒw¸àŽÁ:CñZ¼þŒ;éÅjòwú1ÞàAš@#±ÓŒõ°ÿFƒqÿ‹¿þŒv¦1™¸\£T‚m¦ÖâɆÖâÔII’„©gÄ”‘™ðe‚tÑq¥u4L1‰%T§©µ:m¢ ¤’Pž)Jl’’ÚEu\Ì‹„ÈŽ¹K±±égƧ•_bÍJÖ7©ÉM‰²EË*&Ee¦Û-ÃÄ#=qï-ñ/_ö†Äê„u×ô}£çßunºâª‹ZÖ£R”£}³33>3ï,,†ÑÁ—±ŒW_¡ã,Bù´³B›*œ¥,¬I3;&û;¢Ú$}eiÿ”x£Ëg{"[Ô7ïµO÷^ÿöãyѱÚ&iµ„eÓ 0¤¦,¦ödMt¢±%ÆíbÈ´¢BL“sÌIY—¹2(¿ÖVŸùGŠ<¶w²eiÿ”x£Ëg{#§ãiŠÝ 5*²_ˆ·jÕ lx±˜vcïœIO0¥¥¶Pk22g9Ù&I%XÌøO#aIÝšÕn9ÅfšUG2R[LS5–³1•¶j#OºM¶‘\®ŸÖVŸùGŠ<¶w²‚´þEsÄxœ‹þ6w²;-Vª¼ÊKç™ ¶œ‚B¬„»›'ul¦g‘[îEc;\¯ë{Þ—þé€á¦‡tUœäúš$ΖíµÉ).8»]JlÌìDEô/`ì}âÿÁ£E¤"aÜ–å⪼ªtY/­¦]LWÞo9mÊfÚI3+™ÚäJµò°‡©˜Î‡+n©2].F!ŒÎµl<Â^Ê£3±8”šÒJ"ÚDe™&WºNÑ”¸Þ·N“G­N¤M$”¨2Œñ%W"ZiU¾W#A%Ò·ÆŽ,úîgøë¡d=ã*|6¡@ŵè‘YNV™b¢ê‚â$’¬Eô ýqï-ñ/_ö„hI{ ãÞ[â_:¿íd{Ë|KçWý¡^È8÷–ø—ίûAÙòßùÕÿhF€—²=å¾%ó«þÐvAǼ·Ä¾uÚ î­V*õ¹I—YªÎ©HB ´».BÞY ŒÌ’F£3µÌÎ߬DŽ+|'ìzd B{‹>“ö=2 ç¨YhoN+qÅ%Mi©J; ¶˜ÐÃoõ%S©õm(?OªA‹>´·u‘ä´—]–Ù•Ò¢2;ý$B'‘ñßjWŒáséõŒ^ŠÞiý3c·Xu¶ªMÊBˆÈû¹Ýò>ǘØcÍ,{#`èwáúúï ™J×êuÛŠ#lë2çË›!ísµø.b—Ï™Þð¯ FÜáIÞð¯ FÜá©oz¼|åsƶb… ÌP¡óz…©ä¡BÚ…Å jZ‡X[P¡Bµ 1o¯ Pb³ɺ´)1H¨Å#:âa‘ÂÿÆû^‰±AHrœ—˪‹XjBŒ”ón›*k*ršTÒ´¬•ž÷+x,wÔø_áØßkÑ19ú¨ÍkÂråz˜ö-Šüš‰¿jD˜êjeE¯yÖ_lQ[9‘¨I™–c$^×; 4.·ig2;uºSó–ÛJf|ÊcDnƽcd…¶¥™jÌ–¦ûÊ+Ã8`6ѲX¢9Œ°5IÚý4Ú¥ä)î1Or:6¥8÷rÛmYIYr•Ìîj$ÜÌE0üˆxÒ¦®s3â@ŸBߊ—2­)ZV¬¤âR«•Œ¶‘m.-£àd«pi°RÊ`ÖØª8¼Æá°ÃˆCe³.ד3=·,¶+Ӿ̓§NQ`oÔ6妩%×Ù[o]†ÝCJÔd٤ȵ*3$šŽÊMˆÎäQ°=«Î¢I¯i[UèfÕQ T6_ÿH5ËjFRýrd–Í'›)f2±šn¢ÇHU¶ä ”Úâiêb,xò¢œwêµ-¥²6)4d¡'Ý)63>öÑN¾§VƒUøžc³ãFŸR®3=¸&‡Mf‚)¬¢FNk¨¶!_øs{©3¨‘«Ú>–íz5KB<É—Ïsš%»#)þº3K„’˘³ÜÉ6QÀ€6‰5z—C«Ð%W"DÖO!™keå4êZL„+)%²3Ö¤Ë2Kaìbì‚¡UéÐaª¾Ü¥%ØÈ\¨®ÚK&òÝJÈ›%å_éF•X¶tb(´N˜¨Ñª’±)9YKfM.-:¦4ñ›¤Ë‘ìµH^^â9™þµ‘ö™ap«°¢bfåÔãÄzM9,ÆmÄ:£ye!§lF„(‹c&WQ‘]Iï\Ê>´I1Ó¥S0¤hõ¨k[0N<³Õ¼EJ’ë·]Ûñä͵ µû“Vn­"\¯c(qgë O¨UªƒQ^[M%+rÚÔäΔÚA¤Ï)ÙD\$wè§Î›N”™Tù’!ÈO¹u‡M / ÈîH“âØ°à`L?,ÝØg:sÊtšSh^dFI)²%;ƒ+™Í*Ù°D¦¥PŸS”rêSdÍ¢±»!Õ8³/¥Ff<Âb1@›E¿íÝ;ú_ð–>€bª$ª­w ÎŽã)jWrl‚pÌ”¤* ¨äH±ÕôÛ‰[ob?ØF®Ý Ī»R›aJÌÊ]ÕšÈÒi2%YV=¼61Ðý¶’9ûÔºV«¢ÙÒñN+5Ñð¬Ì=V¦Çd³nˆnÏ\cpVÊl–¡K"ÌFFᤋ)½20V'ÅLw‹Ê¢ÆM-ç%œƒiK}F´#Vdl7•›-ÕÝÁ¨{m$r#÷©tÛi#‘½K ´p†Œ«´ÜSE®U*PRÊ•y¶sÙê¡“Ä…µr+¶I”â{« X¶¶mgà÷Ý?úæÛIˆýê]òV:¨ÑV§=NŸägÓ•Ä"´mš‹¾WK$v>+í+‘ì7%o ÐkuUF¯I‰6]"AÉ€ëÍ’•Ã+fOì;ÌÉB½ÒReÒúî.ÿî4ßú¨i¾ËØ'ù)ÿó ÞÀü•¦\:šf#G{ÜýRœüHß§È—Sc<ªnÇc±÷¸8HDBZhI´[þÝÓ¿¥ÿ b22¸F®Ý Ī»R›aJÌÊ]ÕšÈÒi2%YV=¼61d>ˆâª$ª­w ÎŽã)jWrl‚pÌ”¤* ¨äH±ÕôÛ‰[ob8UWE³¥â*œVj1£áY˜z­MŽÉfÝÝž¸Æá ­”Ù-B–E˜ŒÃIR+j®ÛIˆýê]vÚHäGïRèmé+â‡&;Œ‰ E‡åQc&–óŽ’ÎA´¥¾£Z«26ʂ͖êî`ña Wi¸¦‹\ªT >¥•*ólç³ÕC'‰ jäWl“)Ä÷V2&±l;jîÛIˆýê]vÚHäGïRèuPUí´‘ÈÞ¥Ðm¤ŽD~õ.€Uå^ÛIˆýê]vÚHäGïRèuPUí´‘ÈÞ¥Ðm¤ŽD~õ.€DboùÿèB!DÃt%F«Q¤RbB—WRgºËd•HpŠÙ•ûNų2–¯t¥è|MÕEIJZ‘[ÑÊå­¤š[½yÄ%$|6J["¹ì¹Úçbâ!ˆì½‚’Ÿÿ0½ì Ì$ÓÿüOüfÆ™í+é 4¦Ð©Ôì7¼qhû£"7qÉÏ®4(ö©$ecIñð÷¬ "ÈuPß¾Õ?Ý{ÿÛÞærb±L”†W¬³S¦IŽfnÃq¸QC›Hˆ–NGQÛiLˆö)I¡-ŒÛ—–€ª›² VVí&I)VK‘–­W>à¶Ü»ãfvÚHäGïRèmL?‚ñ½°ÑáÙ¸ŠŠÒ¥Å\—šˆëu »¨Íê”´©†Ëjäk+ð(Z•¢‰òàaØrç@u´É˜¼DÙ!D‰LÉ–SVËEcºuèB,«~‰NwÎǬ;m$r#÷©tÛi#‘½K ¾4M…*xR5ŠÔöjäJ¾èlÔy˜i¤0Æc2#Ϫi W{:—kÞç0{Þ—þéŽWí´‘ÈÞ¥ÐÃê³ddx#aÿþTº—Ñ)8Ž›Q¡× µ:33o°élQ^äw-¤ddFJ+‘‘‘Àâ¸Ñ¡7…!ÃŽÔhÌVá´Ë- †Ð›’R”–Â"""".¡ŸÓ}÷EËu×kZ׈ŸR”£;™™š6™Ÿ|WLøBÖ&FÑn­öK­+Ý<ªIÜŽÆÝiwÅv¥®4­ñ£‹>»™þ:Ähd±]WqMZ¹¨Üûã5ézœùµzÅšòæ±^×µìWÑd1X³à ?cÓ!ÜYðŸ±éÝ=F¿ëú­ÿIK ÓÔkñ¾¿ªßô"yìá-Ñ×ñÿèÿÌ"B[£¯ãÿÑÿ˜R9¦_9§{¾s„I'{¾s„~¥½êñó–uÏÙŠ+1B‡Íê§’… j-¨ajamB… Ô(Pž¼(1AŠÌPc&êФÅ"£Œë‰†G ü;íz&6}&†©°N|ª” \=i²‡¥›†N,ˆŒÒ”¶…¨ìJI™Úضíà ü;íz&6í%é‘p²^¨P›©ÐU5Ä6µ-HS227Ÿ*ÐwIšu~è'm„fGl}W‰xZ•„ç±RfJ‚ú_§½QbC.ššu–êÔdv¹èV›ܶۄ`Ãì¯âƤP¥T ¦¡‡gIKJtÒû'¹¤eB”’Nní¤-'b¿pv#°ñÓ§â3¢U«îÊ©=\$Æ6&>µ­ôC3tœqµ«i--§1pf2¾Ó]Ò!6f›Pwèþ­:Cé¬I«êœ|Ôiuø¦ãIJ–|*Ìj}>•ŽäC¡ˆ*/Vé˜rO‹JÜŽêlÔ7RƒÔêÓÀÝÝÕ ²Úä£-¤a¸AI4Xûñô•†œŽóŒ¬ê‘Û5!F“4©Ä¥I¹w&deß#2h¸¢º¼Rœu“*-N#PÞIÙqq¹&´2eµ´ž©dج_¬ÄÌÌ( ‰#:±mR¡¤®­ÖôIÑH›#5IqˆËuÂOÊ$­åß¼e~¹Õ:¼ÌÝj«6Zêqê&9ǯ4’§,çº2B‰“-½É«e®P‡‹Ëm‚‚Ó©“šBœZVÎC,‰"I¥Y¸1šŠÝ쿬†Ì®Vêsô‘Œ(re-t»UÌ¡ßô$¦š}Ä,‘ÀK΄«7 öíYs¦·£ì6ës$!Èuyû•itÈØ²",²ûžèÍ[;ægÂb"©‘ƒ®SŸ£Ö§Rd©µ¿ K‘ÜSff“Ri3#2#µËˆ‡Œm*ÔªÝ[Kf*R*|J¤äÁbJÖìdÈ$¼qš$ªéî””‘'¾[8xê5ŠÎ®¹ˆäÊ–ˆ‰kq»(ÍJjA¼’Õ Ïi¶n™ ¶wvØP‡ Óa§’˜òwB ¶ÔkÈi²jMä¨Í7ïÚýñ7ÇÃǪvkPÔº&å§5ÊN¶ ZÅ9v£Ì}ÑÜËeŒ¬C ÍR{zIvj¥:ëÏáB\“uF²{ÌNYËû²5¥*2UîdF§˜Ö@%³*µÞçH«Í~sÐꑎëë5­´8Ô“ZÏi$ͤ¸6 u¡ˆÓ%6ƒL\ƒ¡·RgsC$Þ9Ä%‘¡ì¾äÌÑeçá¾ÛÜ&¬ Hä—ß•%Ù2^q÷ÞY¸ãŽ(Ô¥¨Îæ£3Úfg¶âظ 6‹Ûºwô¿á,wUGè©¨Ç‰ æHLXÄü÷×¼¢3KhºË2Ì’fI-§câ+¢ßöîý/øK¿¦*LíWR*M±ebá*/û& d¤™mJˆÈŒ”[HÈŒ¶^ÀhœÔÀe2Þio4ÁÍpœZi%¬“žæ”›ˆ#2ØF´ß„…îÇX7ÄÿÞ^öƺªÖqKëyÐÚ¥ã  ¯G5E– fí<â¾EÁu©•'¼´,‹¹ÊgŠÀobL@ª”/„©ÎrulâÉ•W“PiÖ–Êž'c´QR®í3r%¬H"J„àm®ÇX7ÄÿÞ^öÃ±Ö ñ?÷—½±¯+سb¬!\ƸMÉѢćxÚÕ·•n<Òê«*y™lõd¢BÔ…6õ’w±á©õ:¼Ì[b‹˜ÜÖ°üx¯QñDš»±TõI¦¤ëy¤tƒIj®¼·]È’²I°6çc¬âï/{c/ a6$)­ãÍ–Ûw[¥ÞÿxO(”ØôŠc4è®Íu–³e\¹ŽÊtî£QæqÕ)jÚgk™Ø¬Eb"!®t±†Åti´ˆÕêµZ²®4úl•²ë.väRs£mv2ಉ**ÊaÆ4Ü1DÃS*laÔ:ë)"BW1ܹ”¢IÙ[HŒïm—µ®\#˜:¤"F¦zì8l¥–Ld¡ à"ÜÍÌÿ_|n¨6¯ƒ´5Pˆ±M[V¤ê™&dç_iµ‰³l¥Ã<¨+ŸubRÏiز¥:sªãÏé¿ö­$µ¨í~§Œ)@®èʺ¬ ÐúÛiV¹i²I–ÎÖJˆ¸LÇòêZø¦‡þò?ÀhJˆØcF2pùâÇNzŒ–VùÔ©©Q‰´_2õ„æ\¥c¹ÞÅcâÇX7ÄÿÞ^öÆ’Úð‡RNa : !¹m¤®Pç.œICÄ]äÍ?ÒáКdÙ³§Ë}Ç>E!$D£±[º;ØöÚÖ¶ß”taˆ1N-¦Uè:EÄØrœ$U¢D©<”8ÒRv[ %emñ$öeÛžÙ’dç³Gn!âx­)Õ6ΖÚM×TêÌ‹1©k3RfÕ(ÌÏ„ÌÌVqГh·ý»§KþÄdI´[þÝÓ¿¥ÿ bò«ºª87GtÕEMFé×+[›5ï×qyUÊÚª¥VUb ª‰l)g%zâï{»ßöŒx6ÎPq Ñ1Œ IW9•gbID•å8êy’Fâ‰[.E}›J峄¼ÕZÝFs%U*›”Æ–g$™Šu,§ø%ÞMȶ\’_Ap ` z)Ó¦Óf762D9Mß#Ì:m­7##²ˆÈÊäf_AC•ÊÓåBr±P\Yò™T•špִ̌ÞÊUÈŽç¶ä\Cp2ëu©õªªõ S"KR’µ¸‚#3"JŒîV33ÙÆcò]n³2¢ÍF]^|‰¬TÔ‡d­N¶i;‘¥Fw+Ò°ðŒ@Ê5ˆñ 5WªÍWªÔ_F­Ùi–á<âvw*]ów)ØgÞ.!çv«Tz”Í%Ú”Ç)Ì/XÔE>£eµmî’‹å#î•´‹¾|cƈéõšÅA–ŸVŸ-¨ÛCÒ´µþé÷?ÌJÍ^ª–“TªÎœM›)2æBýYŒì< ¬W+UVüV*Mõ[ªJÝÉ{_.c;^Å{qôuÕŠ7Ë|ºä¬níN£tîç5º»æÉ›5òßm¯kíp @ö5Uª3Jz’ÕJctç׬v"_Q2â¶wJEò™÷)ÚeÞ.!'¥ã„ÓiÐÚ‰¨‡¡’Ó[îáÂ×"ÆNœsI÷Yˆ•bY&ýëlÀ ¦$H &ŒeœsM\‰ Go2Òn>ê[BLÛQÔ£""¹–Ó1Þ]”4yË\;çF=±ó¤}ì¡£ÎZáß:1í‡e r×ùÑl|éE»(hó–¸wÎŒ{aÙCGœµÃ¾tcÛ:@ÑnÊ<å®ó£Ø€W1»r*Ò§c]·ÕfŠEc3™H­ue2+¯b཮|'Å#®ëõíR¦JÇš4C/e̦êöQYD¢µÌË„¸†…ꋨ@ªé’»>™:4èŽî}[ñK®ÑÚ#²’fGc#/¤ŒkàŒí.§|oƒèz1ƒ«Šhpä(­SµP´‘4Úv¤×tÒ{ ‡€‘ô[²†9k‡|èǶ”4yË\;çF=±ó¤}ì¡£ÎZáß:1í‡e r×ùÑl|éE»(hó–¸wÎŒ{aÙCGœµÃ¾tcÛ:@ÑnÊ<å®ó£ØvPÑç-pïöÇÎô[²†9k‡|èǶ<‡IX1ú<†éxË *b’dÑI«²–ÈÏeÔiQŠ÷±ÛZåÂ_>euã'—:/ó±ûC ˆëTçiª§SƘ"Cïá‰#ǧUµ¸µ$Ô’$¨îfgrØ|['Œ' ’hÉÖYÇ4ÕÈÄvó-&ã$͵]J2"+™m3°‡ÑnÊ<å®ó£ØvPÑç-pïöÇÎô[²†9k‡|èǶ”4yË\;çF=±ó¤}ì¡£ÎZáß:1í‡e r×ùÑl|é¯\ÆíÈ«HvtnÜCUš)ŒÎe"µÕ”È®v½‹‚ö¹ðž¿\:Õ!úd¬y£D2ö\Ên¯e”J+\̸Kˆr ÂrØ=Qu]2WgÓ'FÝÏ«~3©qµÚ;DvRLÈìdeô‘|%ÅbÏ€$ýL„OqgÀ~ǦBtõüo¯ê·ý$ ,7OQ¯Æúþ«Ò@‰äC³„·G_Çÿ£ÿ0‰ nŽ¿ÿGþaHæ™|æï úmÎ$ï úmÎú–÷«ÇÎY×¶ˆµjYeJ.iµ”[.Db±P†ØXl¢ÎÄ8*¬ý6œ‡gÕÎ Æ7#z‡Û%²YõFY äò“°ˆˆÑr±íü2Ù/ âÄ»‡ ª{.¡Å°•-§ [#J̳"éZÈÈŒ®G¶ö+Ná8«ÖLÃXYØÔZ.ºM5g"C´ÆVod’ûi##M³P›¬ˆ–w+™ìÜA…Ô’ÔÆrr"³Òz™²Û„ÚóíÕ¤Ö¤Ÿð¶EC!¡l9NÅxÝš-M¼Ì¾„¥'uE)Ô'7rdgbQì¸é>Ö 'á¿„ïL4/SÆÍ?ýæÿÇhtîüTûO·ó}&o¿XZýÛºº7Nà¾}eók3íÍ{æýbDsµƒ øoá;ÓkðßÂw¦|SŒñÄcúÅ=8t¨¸5ìÊŽüg•&kh[©%“„–ÕúUU•d{ÒV3Uú¾7 JÅõ…R©ê¦R±ç"+™’Òì*C¥ÝY׉O2ÚêBP”íI¤D{X0Ÿ†þ½0v°a? ü'za¸0Zm{ Ä®ÌDFÓPAIŒÔuç&ØY¶•,ŒÉkËc3M“s±\‹1À°¶“*³±­™&D …>¸óÌ2¸49ì²ÂÐÑ¢kŨ”“K++ grQ‘‚-#©¯Fz32*̲ì§M˜èpœJžY!K4 îéYµX¶Ù*>1{µƒ øoá;Ó ¤Zæ*Ä•ýâ:‘ÑQE¬Už› ,vœL˜ÉU&r›K‹RÍ.¡G˜É(Ê¢·u{•Ü?Œô¡?`:»ýhüfÛHi”DµÃrVµJ7OZœŒ¯ôdH25$³@0ݬOà ޘ;X0Ÿ†þ½0—ÀÅ5‡±"‰^…D™Q…‹Ü¤;-˜«JŽŒôÔ>ÂVµNV–ÎêWr§ ýÖÏ>Æxâ| YĉꃌYBSg›v#Š‚ì´¨Ü[Š%¤Òʈӕ&“QwJ±™„cµƒ øoá;ÓkðßÂw¦ôh.Ö 'á¿„ïL¬Oà ޘoР»X0Ÿ†þ½0v°a? ü'za¿@‚í`Â~øNôÁÚÁ„ü7ðé†ý µƒ øoá;ÓkðßÂw¦ôhõ2`öHvJœm*,ÉJ\I™_iëNÇúìcÇÓùÿê‹þoúù€‹>“ö=2!=ÅŸIû™ ÓÔkñ¾¿ªßô4°Ý=F¿ëú­ÿI'‘ÎÝþüÂ$%º:þ?ýù…#šeóšw¼+è·8D’w¼+è·8Gê[Þ¯9g\ñ­˜¡B³(|Þ¡jy(P¶¡qBÚ†¡ÖÔ(P­B… [냬Å2n­ LR*1Hθ˜dp¿Ã±¾×¢cd±YžÅM µGÜ2^KΤⴥšÓ±&Ns•ˆÌˆˆÈ¬¥|¥_[a‡c}¯DÄädj|kCÝ­9ŠCô¦Ülâ>â]Rʤ¬¸…{,f“+–ùlÜU]— èKk#å•÷¤<ù^öqÔ¤–½¤GÝÜay± fÜÅuç)‰§.bÒc”b^æk\L‘X›ÖåÖd¶Ì¹­mœÍ#U©qN,W˜SÍÄ·"+O¥ 2"5 œJ²+amMaq P ecb´tURtêÈ4M\ˆí¼·K6ot´š’y¬«¤È HÊÃ5j‹4WèÍÊR`Hu/:ÍŠÊZxö¹}v;ø Þ @ÊÒ1R—ãÅv:ÙÎkKrb5!(QØI'¢J¶Ò±ì.!v*­Â“P‡ãHv¥b–©Ù’n‘+5Z…X³‹¾”ü’¶i‡q-:$y5 ³OÆÍÜ¢gÎÆ£;2òìä}‡üÛn¢á°…€LdHOU›­VêQQY}NÊmøLÉI‘¸neý*³5ŽÅkšRgÀVÅÑ곩2ô’ƒqBÛK¸›‘åRF•ÈŽÆG´ˆx€1!Q­TçÎfl‰FOG"&5HKIdˆîD„ ‰(+™žÂ-§q‘‘Œñ ìLaÉ1 ©¬›RŠ|t“ÄfJÌ¢$ÖF’2Y÷D{HÈgðþˆq•z’ÅN—c<„¬”Ûn¯.d’¬f”ØËeÇ¿°NüV¯'£ @ÀMÅÛ–A§Ñe8ᆦ¤·:šÂÛC¦óŽçhÖk±þ”ÓšÉ;!'ß²pk•hÒ§ÊjjÍú‹.1-Å‘-N¡ÃºÈÍD{NÜ%·õ‰÷`!ø­^NÿF‚t‡âµy;ýˆˆ¦3"ÒÅ<ÌìDmÜÿ§hv'c¬ »wFâ{U¯Ý‹|änflù·.³Q|Ý׸áÚ9‘¡Ý+QæÚB'SåM$ôR’ÒÈ„³%²; ÏYZå(òÙÞȑֳpæ™OÄ4ù1›\lGŸ}‘º[£4tGVÒUÑv›B{›p_„ÌÇáa¼4U¥Öw+jš¹§=KSëRwF¡¸ú܆¬¤¢i¤ ŽÛ 5¬jQŸ%õ•§þQâ-ì‡YZå(òÙÞÈdv ŸI£Gz=1 Æe××!M¥Ó4Öy–i#;$ŒîvMŠægk™ˆíGX‘V§Õ Áu)Ž-Êy9SëPó6¶Ô–Z[††ÐhqE‘)$ðlºSn`ë+Oü£Å[;Ù²´ÿÊ4fÑdÞ”n…žçËqÓ´ÕuÙ§žêü7á"1É]eiÿ”x£Ëg{!ÖVŸùGŠ<¶w²kÖæß}öÜÍîÝòßMfè_úÖäÜzËf·¼wm—¿lÛBÃéøzŸ3h‡2oJ7BÏs厸éÚjºìÓ‹Ou~ð‘䮲´ÿÊoPµ<”([P¸¡mC Pë j(V¡B†-õáAŠ Vbƒ7V…&)¤g\L28_áØßkÑ1·iΑhÖ²Í K*¤6Òò¢¶§’•·!JJ\4çI²ÞÂ>ñü¥_Qa‡c}¯DÆÕ…:–Þ©RÝzaTdN!¤¦:Mœ­!ÔÙKÎJ#=rbOÜÊîqõ~%á™wQ·ò%>$}ɵc»*§RfûH[htõ§«QšÈ»’Ypø±tJ DÖ*õI"9-Q[õùV”¥FnwiÈ›,­k™ÙV-ƒ'¿Øy­#ЫÍ?TrODw46Òò•´"ÉF´Óej’w5³ÃËÝ[ÂõÊ5;­±SÄLµ¬¤Äi*)‘ì’Kn²§I 22Q𬻳#½ˆy?« ~áÊM ¤ã(µiæê`Ä$³*TII‘Leëf§Ãr"±íKŠ;ì²¼¨4 4j…\ëóY‹ k1Í+§'XêC†•$‰Ó,÷mwI™¶æ3îE4úÍ%U\Br㿟Yim¥1K‡ŽCo$’“RIDZ²O l;þ¡{váTašÅ)‰U¦Ôü¶$Eϧ Z–]Ov¢q9s­åÂVRImY˜žñæ«Pé Q¦Õ)·ê E™9k ê iy•¹}«3%%M-›[a(ïb+ ²(mBœn&©S[ìêÊ9!n¥ÛÙJÌ”êV¬Û Ëø${¼?P¥&Q¢Ö1˜òžbBŠÒ]ZhœI¡JI:¯áŒ‹„eeâ:#0û´Æ'­¨÷éÒÙ})A¸Ó‹{2²Q÷JKëØiîL‹jƒ½ lÊNM5ª„Oþ"™Êª¥œŠÕéGæ²Ô”F‡â BÖ•©VZÉI2m{nG³ƒhÇUisé{—w1©Ýq‘)Ží*ÎÒï•[ í{ÃÚ2§RÛÀÕ*[¯L*Œ‰Ñä4”ÇI³•¤:›)yÉDg®QìIû‚ù]Î>«½_è»×»Õ‘º·N_ÛŸ&_àpZûxn&2;A8ŽU'Ft*E"”UZÍIF¨Ñ×#PÒ[j;Ç\s*(I­´ìJŒÍi".)ìêþ)j«ƒcTéñèÏT1°¦3Reµ!„Óe¾“CŠBTE¬iµ(UÐeîOn»Ðe±#aÜK‡ê´Ä9sÎZ̘ï±ÜA­ R›VfZQ+*½É•¶Ü¶SÔ|UYŸ…ªU¶è±¤VÝœëä:êR IŽ”¥Å!&âõ’ŒÍ(,·ï—uhú.:ÂÕŠÙÑéÕ»(ÍÂiJˆòmœ&^R ·'ÂM©VÛqMazÕ]ªU>|…¾ú¸Ër í1))+™°òÐM¼D[F¥lÛÁ´B4q¢Ú†­PÛ”†¦@ ç(s]Ä•) Q+e&PœVçeydf“QXÕ•)¹e±†tuŽXƘ^µ^©±/yæ<üÙJÄäìñ$2KDE¤£Ç<Τò ŽÅr%‘”\+¤¬Š%AEª>ùÔY7 ¸å>C-JI'1“n8ÚPµ\Í)3Rlw"±ÚDõR5È´GË>\g¥0ÖEwm2¦’â¯k”ûEc;žm—±Ú‡°MR…´[KuøFöÔîõ!jÊæJdˆŠÕw7;¸òOº$÷$gÃb<Ž2£â5âº.(Ã-R¥Jd¢T$¹5!qÖkKˆmÃ%%Q‘°Óc%ÒûSÒN§®#oÔ¤¸ôÇf³˜Ôé2ypÞ&d¥(mµ(ò8v=›HEt‘˜‘Q*”úÕ&5V•)¹p¥6N2ò8GûHûÆG´ŒŒŒiº}áÌm„"GF¨W7)%>ëœDšœGˆ²mjB‹\Ž+I¾ÒPÚ:=¡IøUšlÙ ¿1R$Ë’¶Rio]!÷q(#Û”ê‰7Ûb l%¤ªT=`Úž-ª¼åV©‡¢Te)ˆ¼®é”)ÇÜK2i¼Ê;¨É(/Õa$Äë P—5 ’Œå0r[ܱ]’DÁZï,ÚJµmm/Ò*Éýb‡°F6”Š!P•‡fÏo ÓèÍêiÈ©^Wš4¶£q&o9t(‘˜‰ÒvŒv"aZ(j–ô:æKJÃQ¨Fu·ÜdÕ¸³êÜh…ë\V½wbé5ز«a€¿?J'c ¯SñNŸ@§áVklÈërCðäìÉtž½Q(šCm6´¥4k^v󒤦1jPÆÏb*¢ 2¾Ä(K·2®Ÿ Òim&·Tn<á‘)]Õ‹a; èëHÑ4êS‡$ʾ)˜q¶¤)I6%´Äį[dG%r¹÷*Ù°¯˜ÅÚ7©Ö­Lj[I}ÜNÍrmÔ$ÄΔSY„¦ÜyŒ®4g•Ó#A«ø##R@JWð¢0ûU³¨HTge$4˜(ä›;˜‘®Ö%FhÉr"3µ¶ŒÝ© µKf¥OqÇ#=›)¸ÒÚYTiRT…‘)*####"22;pÖj à·á õEúÁT–ÌŒIRuD¢a,’ÓPYét’’"RPE–éË´ÔsmÓ+|# ^¨o…A£pÜ{\·l•8¥!ÅÙNdA¥ÔD¥eÌ{LÀ`XÒ–N¦nêÓ³¥Ê£Æ«éôYj'#µ; Y£ÎfdVJLÎÖ;gcšV-ïÖ4Ã(÷[͸£ý*N±—MJJHÒ¶M\®E˜Ós4˜´î’ðk[K©JÕ>Û.åM’l°N¥*o^á7‘ƒ4­gMD¢3"¸ÄbI“*Ÿ¿úsTjã)D§ ´²SinÄdjÊo4w2î_QÞé"<—´sŽ1j±$:uJ: ÔáãwO„Ü °HSj‹:·ÉK̬Î(ìK±¡D›lXøÏIÅÒ°¤i2Ÿ«Cp›”ÛP[qÔl¥äë$jÐJB’djQŸrWQžÒ1Tª•šÕ]öé˜uœ=O©ÆCŠ%Pôª‚ ìÄ’Q›±ÉlgdÜÌÍ^ŒKG®Ñðö‘¥Óº'â)¨U0¢¡Kq£rHiRÈ‹fGZÎ×"A\̶ÚÕsG2žz¦šDˆqcoM5-æQ!êl¹R—EïjÎÒv³ì+ÂIaYtJ•a5%Ç‹Lÿ^)‘Œô{‘s4êáf#,½Ïu}—0¦4ø¢tèyRU2žÛ.K& ñ]a.šÉ¼Èy QfÕ¬ík؈øFpÚîÄ5 ^'Äxú=2¦ûtçc±ÇeFe4çÕ)³qfÚæw¢VT’lE˜Ëm«OÄÚCÅø™ç(’!»O¦Aeú4¥JŠkeRÖ´êB5ª-z Ì’DYÉ<)3µ€‰ÿê‹þoúù€>ŸÏÿT_óԇ̬YðŸ±é î,øOØôÈ@€nž£_õýVÿ¤¥†éê5øß_ÕoúH<ˆvp–èëøÿôæ!-Ñ×ñÿèÿÌ)Ó/œÓ½á_@¹Â$“½á_@¹Â?RÞõxùË:çlÅ ˜¡Cæõ SÉB…µ ŠÔ0µ°¶¡B…j(bß^ Åf(1“uhRb‘QŠFuÄÃ#…þö½‘ÂÿÆû^‰‰ÈÈÔøÖ€ Þú4ê‡V ÂQh,á5K6‰9Þ:‘ –¢BSrN¤ìVIl¹÷Ä—¶ÒG"?z—@9Œtçm¤ŽD~õ.€;m$r#÷©t˜ÀNvÚHäGïRè¶ÒG"?z—@9Œtçm¤ŽD~õ.€;m$r#÷©t˜ÀNvÚHäGïRè¶ÒG"?z—@9Œtçm¤ŽD~õ.€;m$r#÷©t˜ÀNvÚHäGïRè¶ÒG"?z—@9Œtçm¤ŽD~õ.€;m$r#÷©t˜ÀNvÚHäGïRè¶ÒG"?z—@9Œtçm¤ŽD~õ.€;m$r#÷©t˜ÀNvÚHäGïRè¶ÒG"?z—@9Œtçm¤ŽD~õ.€;m$r#÷©t˜ÀNvÚHäGïRè¶ÒG"?z—@9Œtçm¤ŽD~õ.€;m$r#÷©t˜ÀNvÚHäGïRè¶ÒG"?z—@9Œtçm¤ŽD~õ.€;m$r#÷©t˜ÀNvÚHäGïRè¶ÒG"?z—@9Œtçm¤ŽD~õ.€;m$r#÷©t˜ÀNvÚHäGïRè¶ÒG"?z—@9Œtçm¤ŽD~õ.€;m$r#÷©t˜ÀNvÚHäGïRè¶ÒG"?z—@9Œtçm¤ŽD~õ.€;m$r#÷©t˜ÀNvÚHäGïRè¶ÒG"?z—@9Œtçm¤ŽD~õ.€;m$r#÷©t˜ÀNvÚHäGïRè¶ÒG"?z—@9Œtçm¤ŽD~õ.€;m$r#÷©t˜ÀNvÚHäGïRè¶ÒG"?z—@9Œtçm¤ŽD~õ.€;m$r#÷©t˜ÀNvÚHäGïRè¶ÒG"?z—@9Œtçm¤ŽD~õ.€;m$r#÷©t˜ÀNvÚHäGïRè¶ÒG"?z—@9Œtçm¤ŽD~õ.€;m$r#÷©t˜ÀNvÚHäGïRè¶ÒG"?z—@9Œtçm¤ŽD~õ.€;m$r#÷©t˜ÀNvÚHäGïRè¶ÒG"?z—@9Œtçm¤ŽD~õ.€;m$r#÷©t˜ÀM9Õbóˆ4/Ý'Â[ê]æP¬YðŸ±é î,øOØôÈ@€nž£_õýVÿ¤¥†éê5øß_ÕoúH<ˆvp–èëøÿôæ!-Ñ×ñÿèÿÌ)Ó/œÓ½á_@¹Â$“½á_@¹Â?RÞõxùË:çlÅ ˜¡Cæõ SÉB…µ ŠÔ0µ°¶¡B…j(bß^ Åf(1“uhRb‘QŠFuÄÃ#…þö½‘ÂÿÆû^‰‰ÈÈÔøÖ€ ÷QhõzÜ¥D£R§T¤!⚉o,FDj2IÚæEÖ@< $½±ï"1/šŸöC±ö=äF%óSþÈÐ /cì{ÈŒKæ§ýì}y‰|Ôÿ²4KØûò#ù©ÿd;cÞDb_5?쀒ö>ǼˆÄ¾jÙÇØ÷‘—ÍOû #@$½±ï"1/šŸöC±ö=äF%óSþÈÐ /cì{ÈŒKæ§ýì}y‰|Ôÿ²4KØûò#ù©ÿdZ—ñ¬H®Ë—ƒñ xì¡N:ë´×’†ÐEsRŒÓb""¹™€€ÅbÏ€$ýL„OqgÀ~ǦBtõüo¯ê·ý$ ,7OQ¯Æúþ«Ò@‰äC³„·G_Çÿ£ÿ0‰ nŽ¿ÿGþaHæ™|æï úmÎ$ï úmÎú–÷«ÇÎY×»"hðИPœ”MHBå¤íV³4žWNÄ›+ºMöçêT—’å#¯ú K)n,v,UÊÔÔ“Ÿt*è#Õ8»³•ãÊE‘]ÑwÂo„Ê6(¬@·+Q7âžÜÅ2ŠÜ¯ÑkÛqf’Q-<¡dFDVÊ݈µMäõª=*]bm ªu­ÚÔtÉ}¤Uf##oªRR¢2pˆ®fù$îœÚÚ¶²éé4‰ËÂ6•QÂhulaH-“°ôª™¢A7•l¥´8Úb¸›$ÍÅšLó\²lhÒŽÓÆ‹\ÄXeÝý¨a:QEÚJ”ãs[nAJ'^Èz— iœÒj"$í±!³£F{[žmhµ¹ód¬JM³kok8Y}ývµ²Ù»[TÞCôhÏksÍ­·>l•‰I¶mmíg /¿®Ö¶[7kj›É¨´[@­ÂÅÔwª¤lV7·áæpÔ†U0ÔÚÈõÓ–úšyÌ«NT™Ü’D”ȧÇ ÁÄZHçX£¢¥KH©kû:ÈúÕ; "VFYL̉Ã$«‡!™sr +ôhÏksÍ­·>l•‰I¶mmíg /¿®Ö¶[7kj›È~ínyµ¢ÖçÍ’±)6Í­½¬áe÷õÚÖËfímSy5T Ùirg‘µRëƒt31¬5!çÕ ]t·»Éòe jl…!I+wVB•e§ÀƒMr±‡j ÄÊ©Kqº±ÃqME)fÊJE² £m«ß9_/ð)£ôhÏksÍ­·>l•‰I¶mmíg /¿®Ö¶[7kj›È~ínyµ¢ÖçÍ’±)6Í­½¬áe÷õÚÖËfímSy5~iF®aƒgÔàâºîºª/Dq´L»+J®ò‹,ŒÏ›kFSVT¤ýϳFÁЩ#ÁdîyM©¸bˆÃRåJm1VYl‹Xé6òÐfÙ‘Ù)Qm°˜H˜Ô‰•l²*‘\£â81 k­ÈÈñ¸l?µûi"=Ü´jî¢<–G ´_š{‘#±M÷r­§´ç;(µK;Ò#þb<še'9 •:ƒM“‹a® 2›\CSJDw S!J%$‘üµ™JËéóâÚ¡ÿ–çø.\d¢ ÅbÏ€$ýL„OqgÀ~ǦBtõüo¯ê·ý$ ,7OQ¯Æúþ«Ò@‰äC³„·G_Çÿ£ÿ0‰ nŽ¿ÿGþaHæ™|æï úmÎ$ï úmÎú–÷«ÇÎYדö=2 §¨×ã}U¿é iaºz~7×õ[þ’O"œ%º:þ?ýù„HKtuüú?ó G4Ëç4ïxWÐ#np‰$ïxWÐ#npÔ·½^>rιã[1B…f(Pù½BÔòP¡mBâ…µ -C¬-¨P¡Z… ·×…(1YŠ dÝZ˜¤Tb‘q0Èá‡c}¯DÄäA°¿Ã±¾×¢br25>5 çH;ÚV Àí>¦Óð¹‘[†’Ïû£‚GÑ:‡úâÿ›þ„+Raë;r y¥Ÿd:ÎÁ†ÂÞigÙÜgC¢Wô§†¡×©ú¤fè•WRÔØÈy Y?O"QˆÈŽÆe~¦#sf?DÈu‚9 …¼Òϲ"uw«¬×ŸÃÝ}I¦¢›FMDê#E7%­n¼G¬-Y šh›A!)UœMÕ}§Šˆñ «£>-,*ßZúÒ£f•÷U#Zj7RgªNDˆ¬~æÊNÛÏxØ=g`ŽCao4³ì‡YØ#Ø[Í,û#[ÄuSÐTì\Êw¾­ÖË•$'!+s¿¹MÂ,ª##Ê®ñ‘ðm|c?ХШ Uk•YUI}ùp˜§6ûfÚZ³ “ù$­JY'´Êæ˜ïN³°G!°·šYöC¬ìÈl-æ–}‘ \Å5V0½}Tèê¨*TÆS×–¨Î¥¶Û-®²—•Š"Í—V´•¬vôÖªU‰UÅR˜ÆRƒ@f¥»ÛŽÂ“9kS‰RÏXJ"iÒTd‹鋺-—w‰WYØ#Ø[Í,û#É:£È2 F•ƒ0³nÔ$h©ÞvXá4㦛’vw ,îv.æÜ&DqÜ)Vĸ§ÂuÚ¼Š<$áÊMUú{Ù3[ò$ÜmKq Q"ÍLŠÊØVRN÷ÀÒj5Z½kF5Ê–&)J«TdJU'RÒS{Ý.èlÒ’_èókÎj3Q—¹àñ²úÎÁ†ÂÞigÙm¥sdôT8ð¡ÂhÔÙ¥ˆŒ%¦›#m”•ˆ¿ëÂw=£¸Ç iKý»¨ÿEþ©’Q‘r3hzKM8ûqе’Të„£KdgµG”V.„gÄF-€²±Q×[½wáýôÝ›‹Q’g¿gÉ—6çËî¶^öýb6.6£1>…„©j©T*ŽÃ-ºOkNZL•úGÙ²šO)"ÙÏiÒxü*ºÆ$Ã…#T$’¡MnTfåhmj$8v½»•) ýDn|Å"©Æe(P ¢Þ"j±7W¬V‘ãÆ§Êa‚•%ˆeœEÄ ̛̲Uîáü³1]2Yž7À56&Ö™"¨–×P™’ɺÚld‡V¥—tâMj¶b<»r›ÿaªÅè-°ôæ•'sG[‰K¯d5êÒgcVRÚv-¶.+…[©×0Ö&S”¹¢ÁnLV£Œ½ÖâO #‹+&Åc->ü}%a§#¼ã+:¤vÍHQ¤Í*q)Rn]ãI™wÈÌ„çºPðШ‹ª1"Sµ4Ø‘ÖÛNH–kÈKs1¡6BT«™!gÁb$̇È,G¯ª›*£sµ(Øvl{¼ÖR^Su±­6îŠÜ$$4 Í^£JÓtú¬èh:´$šX¶ÈÉlÊÎV#þD_*oÀCÉ¢Çߤ¬4äwœegTŽÙ© 4™¥N%*M˼i3#.ùf{ÆšsîÑeU’¦ÉˆÒYŽ´™žcS©uI2+ZÖeWÛß.¶óÆmIi§n:²Jp”ilŒö¨ò‘ªÅðŒøˆÄ» Vk´ÝÖGªÔ¡¨ªðr”Y lû¶¥­”ËÝ¿Tñ‰ÎL¤M}’òe%Åäñ8K¿ušûs^÷¾Û‰‰ï‘z¹N~ZI’¦Öü).GqM™šMHQ¤ÌŒÈŽ×."1´«•ºœý$c ™K].Õs(wý )¦Ÿq $pó¡*ÍÂg}»F+ 92‡éË뎱OEQռúj_7l³lÒâÆómFÆÌÔV;سm¬UÝÞ @6aQ18(EQ¥DXÜè©S“rk_$5—2OV²NÓI•´–Û‘OH»¯®éJœ¸®>¦˜Q¹£i.²ƒJ͵+Q)EòBb¬ÈŒƒt§ÃVÑ*9¶ÄÆâ¸Çu­I¸…­ ÷9M'«Y{«Ü¶•ŒŒIaT+”Š&VzS+˜NnÌGwä“ËI4»{²&É£Èw.ìÎÛLY©¸û¸c»*ÈÝmç{­]v]Éoômï·¿å÷7Õ÷zÎí½Æ¼CZ¦hÒŠš}NTU¦«= ºÓ¦—A7Y¢Ú”š–¥JÄg´Än‘ ²ã”5cŠŒé u™g‡âÎaq¢!÷ K‘ã-ÇÑ©$j²Þ_ ZÆ¢Ú@·“Uf‡1*¬ây{øÃ1ܪÅj>¼Žù£ç7–¥‘™7ÃÜ¢çs,Û[Æ´>ÆófÏÂn¸uYµUÚ‘U’\75nY´(”i6̈óZÆ”w)¾Ø¥} §{õtW©W„Ù«Xµ«uÛ¾œÄVJ»Ä[6l‘wáʆ(«oe3TrrgJW›ºî’’"$‘™™š‹e„ß°NüV¯'£¦/šûÍÿŽÐïq#æv- Tp½~Eª„"dt¶§“3"%¡+O ÞÊ-†[(l®©ÿ¨—aDŒÌytÃt˜SH^±&¤žÓÝØElœ'}œl´ËºfbL+6ЦHfLWÛSO2ìe­!Ee%I4ØÈÈÌŒ„X¬ÕðMj Á¬¢J"Œ”lK„n¶f\•I2:´Ë¶æKÑôÊ;Tip©r)[W Úvvn Ñ”­ôV^ª­Ej© —9¸fG2iÚÂ`ÊÖÈJAåà.!Ä€L»¥“ ¢c“!”Éu´4ãÅdµ¡£BMYndFµ™{2¸ÌcãÈÑÜz²ªñéô–jKtÞT´Sr¼§ *I¬ÖHÍ›*ÔW½ì£.ùŽ&ÚeÝýwaï~ žÈãm)·uè¿Â@Œ€˜Œ¹÷âÉjLgœaöVN6ãj4© #¹(Œ¶‘‘í¸¶Puñyaˆ<ä÷´0±%J†é»KÑÜRÙ©¥šLÒ¢2Rn]ã#22ï‘‹ #ü “ JD¸Ÿ‰!áÖ\4-?A–Ò­ý­ïºkóQß$‘’fn•ëŠädv]óp—Œp ÀÈ3\­3»õ5Šƒ{ã}Ý–JËu^÷Ömîï™^êþèøÇž:m6csiÓ$C”Ýò<æÚÓr2;(ŒŒ®Feôó€`eÄx…¸Ó#7^ª!‰«[’ÛL· 2²²Ô²½”j-†g{÷ÇŽ:m6csiÓ$C”Ýò<æÚÓr2;(ŒŒ®Feôó€Œ@ÈC®ÖáN‘:b£\“3}ö¤­:fw3Rˆî«žÝ£ÈÌ™,LDÆd:Ü–Ü'Pòd´¬Žä¢Qm#¾Û‹@'(Ö#Ä,Õ^«5^ª7Q}·e¦[„ó‰ÙÜ©wÌeܧaŸx¸…¨ºÌnƒW¨EŠõõ¬³%hBﳺIùÇ€bQ¼Gˆ[©»Tn½TD÷ˆ’ì¤Ëppˆˆˆ”»ÜìDE´ûÃûÎÈ}o¾êÝuÅ–µ¨Ô¥ð™™ð˜ ÛM¬U©<Õ6©:o•Ly lœ.%L¯üãñª­QªSÔ–ªS§>½c±ú‰—³ºR/”ϹNÓ.ñq¿~«;Õ½;í?{üt/SÃq{~ÁCµZ£Ô¦i.Ô¦9NazÆ¢)õ-«ot”_)t­¤]óã0 |úÝf¡=ª„ú¼ùs"KR’µ¸‚#3"%ܬfg³ŒÅ5:ÅZ©!¹5*¤é¯¶VC’$)Å'è5™ {ªµš½[U¾µYÓõEf÷L…¹¸‹1‡žT¹Rõ[ªKÏêZ&šÖ8jÈ‚àJoÀ’ïl@NW â*¾«&«C”˜Óœ©qL¡Ò"¹¹Y^äG{l°šöwÒ·*¿wÆèƵ,Q^ªâjìŠårVë¨IË®{V”fÊ’B{”‘w)"Ø]á¬YðŸ±é î,øOØôÈ@€o^¡ØÍKÓq²ö}YÒe(ò÷$•p™ÑC|õ - éÅn8¤¡ ¢Í5)Gb"$Ó$;w{i73ŸO°-hö«¬Ò)Ã̱«‰N§Ó¤!k^g·•(•s""ÊDÒ,V½óm;‘±¯h£F•)EDz߄r,ïÃ'Q¨’ùdue~ÛràQå3à<Ó¼ÓúfÇn°êmTš5”…‘÷s»ä+ h¼%¡vqeuveÑ Ç\é‘ÛŽå:SÊJY’ë$f²˜‚32nû\#Þ}LñO†«@óDÏÏ Ï‹Ä}mUÿõ# £B“/ËŸ*“Œd8šÝY¢©;]5S‰—!´'s®¥)l‹Q±DF[ 0ÓíßIÌbu5ãÿ}^jÍϱ íe‰ãZšf~|~v²Cñ¥Í3?>3µ})bHÓih‚í6si'µÆÃUGšÜ)Ìí¼’Ë4²¶¢³dƒ;’¶$”eŸcbÙ”ú‘ÖO;µ}ÓæmŽmÚÁÆt4Íüøü>¥úŒ¨j›ùñ¸´X­ÔÞÄP«ûÜr©]‡ ¡hC¨ÜÑÞ%)J2Q›Ç²û6Û\å#œëu3Îå_̧ç>ÕêwŒ¨j›ùñùÚ¹Nñ•ÍS>:4'Szy×?̘‡9v®S|c@óTßÏÎÕºgŒhj›ùñÑÀ+7®O÷OòaÎÑz˜ Å}/±S !ÄÞǽ3N×+wçwkÂüw@ó4¿Ï ö“USÎF„íx_Žèf—ùàíx_Žèf—ùá¾ÀFe- Úð¿Ð<Í/óÁÚð¿Ð<Í/óÃ}€fF„íx_Žèf—ùàíx_Žèf—ùá¾À3#Bv¼/Çt3Küðv¼/Çt3Küðß`‘¡;^㺙¥þx;^㺙¥þxo° ÈЯ ñÝÌÒÿ<¯ ñÝÌÒÿ<7ØdhN×…øîæiž×…øîæižì24'kÂüw@ó4¿ÏkÂüw@ó4¿Ï ö™µá~; yš_烵á~; yš_ç†ûÌ Úð¿Ð<Í/óÁÚð¿Ð<Í/óÃ}€fF„íx_Žèf—ùàíx_Žèf—ùá¾À3#Bv¼/Çt3Küðv¼/Çt3Küðß`‘¡;^㺙¥þx;^㺙¥þxo° ÈЯ ñÝÌÒÿ<¯ ñÝÌÒÿ<7ØdhN×…øîæiž×…øîæižì24'kÂüw@ó4¿ÏkÂüw@ó4¿Ï ö™µá~; yš_烵á~; yš_ç†ûÌ Úð¿Ð<Í/óÁÚð¿Ð<Í/óÃ}€fF„íx_Žèf—ùàíx_Žèf—ùá¾À3#Bv¼/Çt3Küðv¼/Çt3Küðß`‘¡;^㺙¥þx;^㺙¥þxo° ÈЯ ñÝÌÒÿ<¯ ñÝÌÒÿ<7ØdhN×…øîæiž×…øîæižì24'kÂüw@ó4¿ÏkÂüw@ó4¿Ï ö™µá~; yš_烵á~; yš_ç†ûÌ Úð¿Ð<Í/óÁÚð¿Ð<Í/óÃ}€fF„íx_Žèf—ùàíx_Žèf—ùá¾À3#Bv¼/Çt3Küðv¼/Çt3Küðß`‘¡;^㺙¥þx;^㺙¥þxo° ÈЯ ñÝÌÒÿ<¯ ñÝÌÒÿ<7ØdhN×…øîæiž×…øîæižì24'kÂüw@ó4¿ÏkÂüw@ó4¿Ï ö™µá~; yš_烵á~; yš_ç†ûÌ Úð¿Ð<Í/óÁÚð¿Ð<Í/óÃ}€fF„íx_Žèf—ùàíx_Žèf—ùá¾À3#Bv¼/Çt3Küðv¼/Çt3Küðß`‘¡;^㺙¥þx;^㺙¥þxo° ÈЯ ñÝÌÒÿ<¯ ñÝÌÒÿ<7ØdhN×…øîæiž×…øîæižì24'kÂüw@ó4¿ÏkÂüw@ó4¿Ï ö™µá~; yš_烵á~; yš_ç†ûÌ Úð¿Ð<Í/óÁÚð¿Ð<Í/óÃ}€fF„íx_Žèf—ùàíx_Žèf—ùá¾À3#Ÿåõ8"TuG‘Y -µ[2wžY^Ç~ôáíX¥xÂæ¹¿Ÿ ™ßÚ±Jñ…Ís>«¯P<×7óã¤3#›ûV)^0 y®oçõb•ã šæþ|t€dsjÅ+Æ5Íüøv¬R¼a@ó\ßÏŽÌŽoíX¥xÂæ¹¿ŸÕŠWŒ(k›ùñÒ‘Íý«¯P<×7óáÚ±Jñ…Ís>:@29†/S¾­â|W’Ý*‹YU5”J2K®XeÌêZe¶Wý-¬Iï ÅAÔü#:K°jxQÇ^cQ!©VEE³RVD¦Ü–âHó!&Gb=›„l¼+!PêÚT–‚#SšC‰¿Ó)ÿòºœÙ(fqi²ÖÙºQØuI+J}V"+—}JQÎ×;Úö1áÖê뱈¢œÌ³µúÚ´øŠ)ÌÊMÑ™TRµCEŽšËOcˆéR8³$Þ#/ç!³49faýõ½Bƒ tjÙì5™Ÿ.}Úæ²Ù»ž ·Wm‘:Ê£á¼aFƒOqNÊaÖ"O:Œ¤8êÒ—vìI®D\’› ûüÇ£OznÄçœwK¾šüݦsñÝ-S Ï‹Ä}mUÿõ"[J§B¥E\h êZ\‡¤©9WqçT늹™ð­j;pìV+“`ŠU26¥"=6)\T<¢m„¤”µ–u¬ì[T¥)J3á333Úc3¸¡ø#ÙØzZ‚>ŽðŒxëŽÝ5íQ¤’Ò9õb%ˆ˜ºÏQc"?Ñeà." ~¡ÁL"f3ë\)ŠšË¯Ëyç5êelšÔµ¨Ô³Õ­IîŒö[ˆ­³÷?c› ÜPüŽl„àjLQ€°®&zKµšs¯œ¶I‰HncÌ¢BŒ‹X†Ö”¬ÓsÊj#4챕ˆ~âŒ+ u"¨ˆtèÏL-©Ë×Êy’SèCm’ÉÖÏ;*Õ´”’‘Àe{ÎûkqCðF9² ÅÁæÈ04þŒ0³Ø^—QL”°Üš•Asži‰>†Ôm¶ÙµÞíÃÊÒMKQšGa,MÅÁæÈ7?c› À…€šn(~Ç6A¸¡ø#ÙÀ…€šn(~Ç6A¸¡ø#Ù,ÓqCðF9² ÅÁæÈ0!`&›Š‚1Ín(~Ç6A 4ÜPüŽlƒqCðF9² X ¦â‡àŒsdŠ‚1Í`BÀM7?c› ÜPüŽlƒi¸¡ø#Ùâ‡àŒsd°MÅÁæÈ7?c› À…€šn(~Ç6A¸¡ø#Ù,ÓqCðF9² ÅÁæÈ0!`&›Š‚1Ín(~Ç6A 4ÜPüŽlƒqCðF9² X ¦â‡àŒsdŠ‚1Í`BÀM7?c› ÜPüŽlƒi¸¡ø#Ùâ‡àŒsd°MÅÁæÈ7?c› À…€šn(~Ç6A¸¡ø#Ù,ÓqCðF9² ÅÁæÈ0!`&›Š‚1Ín(~Ç6A 4ÜPüŽlƒqCðF9² X ¦â‡àŒsdŠ‚1Í`BÀM7?c› ÜPüŽlƒi¸¡ø#Ùâ‡àŒsd°MÅÁæÈ7?c› À…€šn(~Ç6A¸¡ø#Ù,ÓqCðF9² ÅÁæÈ0!`&›Š‚1Ín(~Ç6A 4ÜPüŽlƒqCðF9² X ¦â‡àŒsdŠ‚1Í`BÀM7?c› ÜPüŽlƒi¸¡ø#Ùâ‡àŒsd°MÅÁæÈ7?c› À…€šn(~Ç6A¸¡ø#Ù,ÓqCðF9² ÅÁæÈ0!`&›Š‚1Ín(~Ç6A 4ÜPüŽlƒqCðF9² X ¦â‡àŒsdŠ‚1Í`BÀM7?c› ÜPüŽlƒi¸¡ø#Ùâ‡àŒsd°MÅÁæÈ7?c› À…€šn(~Ç6A¸¡ø#Ù,ÓqCðF9² ÅÁæÈ0!`&›Š‚1Ín(~Ç6A 4ÜPüŽlƒqCðF9² X ¦â‡àŒsdŠ‚1Í`BÀM7?c› ÜPüŽlƒi¸¡ø#Ùâ‡àŒsd°MÅÁæÈ7?c› À…€šn(~Ç6A¸¡ø#Ù,ÓqCðF9² ÅÁæÈ0!`&›Š‚1Ín(~Ç6A¦0hwé-§RKBñcÉRO€ÈáD¹ÈÍã<)=J¡3¾°ÕÀƒuf]ìäµ$³Ê#Ûn÷ÚR™MDYÒOˆ—¥T¥»!Âe$§VO)¥®£Ê„&çÞIÌn(~Ç6CË4ÜÄÏ8q»b›¸™ç¥¢pžª½]EsZ6œ7Zœ–µºwîÜ2ºv\̈ŒöØîV±î %ügìómÅÁæÈ\e–Y¾©¦Û¿T‘\M›TÚŒR›V©µNÚ_ÿÙxymon-4.3.28/docs/critview-detail-acked.jpg0000664000076400007640000027265011070452713021021 0ustar rpmbuildrpmbuildÿØÿàJFIFHHÿÛC  !"$"$ÿÛCÿÀ©A"ÿÄ ÿÄj !1A"QTV“•–ÓÔ2SUWu‘’”ÑÒ#37²á46Baq$%5v³´FRbs„¡µ&'8CDrt‚ƒ…¤±ÁÄÕ 9EGcd£ðÂÿÄÿÄ?‘!1AQRSaÑ3q¡áð"2’ÁBC±4b²r#cÂñ¢ÿÚ ?ý=>\´Î”Êy)'TDDáà‹&<9lÏ ÊTÒçUÿÌÅCJ òý«ÝUN­:¯'¯Åÿ:O{Lغ`BWè“É×9ÔŸÒ#º3ø?ù’YÌÝž©±Mb²§¤¾Ü‡KN©deÄ4ñj.ä8”šLóœ–86¶g…¿å Rë¸ê­ÕJàZ9Âu:“wòv´o 5J:o "þËhNzO¤ò|G]wÄ;V⨼ýKBmY•H’êÙ”Iih6Åëhõþ•)#QêÀïå³<-ÿ(aËfx[þPƞ߃PÛ©ÖdU¤­zÔë­4Ù#$E¡ m)ÂÈ̵jWʆ6 IïËfx[þPÖÌð·ü¡Ï×Åùu¢Õ˜µ¨Oœz›$ºò>r§ ©ÐÍN0‚k*Ý‘›„Dêry-'ý­ÝßwÞ ¹+åo5P\j2\d°ºraÉJÙC¦¹ ê]$¨ÐJlˆ‹AžTyI-ÊÍx¨ôyµzEö!AŽä™êZ´6„š”¬'&x"3Á˜õb¬·ÝÓ5:äg §Ò‡õK4¥d•rzV•`ú”GÐd)²Ôj³í}¥6w1RbQéÊŠˆ–2ÐìD¬Öµ-&¾íN)¤hRH”ÙçWÊÅÅ\Ub§Hj­Íí»u±Iji2Ùª ¦3$É:’i5)ÓRÖJâép<-[3Âßò†¶g…¿å R’në¢ :¯šÄšÛÍÝÈ¢µ:+1û,rž2-ᡃsy©_ K<'à fǬ^ò£QiÔ¥Ò%H¹Ü§.KíÂzZâ=é¤K&ã(wRH‹à”¨Ó…L {–Ìð·ü¡‡-™áoùCpšqˆl°ì—e8ÛiBŸt’KtȰkQ ’œŸIé".<‹€ò¬SâU©2ésÚ'¢Kel<ƒþÒFF_Q&Ç–Ìð·ü¡(•eËiNÅ©ªCiqmšQУBÓ’>”©*I—Q‘‘ñ!V”ùµêLžO}NÕJRáÖÜèRáÇÐ¥ºóè[ ÿÛ«xM®]òé_…P—ºn©ZnRiÅ 3M¨óœiÚd–íM¡ Âÿ´}Ç™äAorÙžÿ”0å³<-ÿ(cOkÎn©mRêmJåmˆËéu»Þ’ÐJ%èþÎsœugb÷å³<-ÿ(c™¾v„Å¡ÉùÁUYÖ^’¾Ld{–ѽuZ–œ¥;ÄpN¥x$ðcЉG¤\,Üsê´Z%~å‰U’×'¬¿¡KÆLiV‡ ”›#J;¥(Ìω™i®³¿m¹%@·4u¦¡±Ÿ(à‰V‡~ ¢%i4åWÜ(Í]Ñ` Ó–Ìð·ü¡}rèD‡&UR²¨ÍƆô×ÝR—¸dˆÝpYR‰:“œü$—I¯¯JŒ«ŸÜËS­)ÕÑQ´—9ÎNI<âïÙk%w*ɤúðgƒ#Á–ÖäTéö­R€åjUN3öE~KïIm’q÷(ÄÚŒÚBZRó‰"Ig&Y[ü¶g…¿å 9lÏ Êðžü¶g…¿å 9lÏ ÊüÝeQL²¶sXMjQúéªÍ6IEýæèˆ–ÃyÞ™’\-âð•¬û¬dw]‘×¹_=ö@Z;(æ^bÜ5£uÊ·µiÞït”gV?ÙÇ$¿-™áoùC[3Âßò†)ê­Åqa5¶îÒ†Gw±Eæ~LÁ Øåè`Ë*I¹¼[Ys:°H_—òýFö;}û‹½iQÝ.ÒY„º{ Ž–UT$š°’qKBL”FK"=$FFy3ãå³<-ÿ(aËfx[þPÅ]Q­Ö-·®Z]Få—5"SdÅšä!*•!æ7D”m™š™I!J,$Üʵxò,\ÛBvð¨[íI»Í¸Ñ%¢S4>W¼Q™).žôšSI"AéA%ÂÞ£I @_ü¶g…¿å bÑ«ÅX£Â«Óª/¿ tväÇwRÓ­µ¤”•aX2É ˆÅnÔ.{†ðމ5¥R¢1oÒªR`ÃDw’ä‡Ü“¼FôÒ¼¶dÉ$ô"4¨¸™ò['º«ˆÙ{rŒÊ3–õ¤Ã°è{²7'¥1¤IR̲hQ§JRÙ–$£5w)÷å³<-ÿ(aËfx[þPÅ W]ñÕ¸ª/?RЛVeR$º‡6eZA „FqzÚ=F¤%cJHÔz°-{~ Bn§Y‘V’µëS®´ÓdŒ‘„%´§##2Õ©\O*>qËfx[þPÖÌð·ü¡TR¨<¿j÷US°«N«ÉëñΓÞÓ6.˜•ú$òuçNu'ôˆîŒþÂ0-î[3Âßò†¶g…¿å V]ÓÛ³S)Ê«)©*òæ”å-’žyÜî´ã§“uãV;¬çˆÃ‹U»¦öNõÎóÌÚå(©§ ‚dã*¬¨I#Q#y­)22Q(‹¹"23ɘ*¼UX«“¢ûÍ"CÑ”­KNeÕ4âpxèZYèèô¡JÁu$Ï ŒS›<©Ö*5š…°UGmØÍU+OFu¶›[õ#:Œ¢Q¶n!HJZ3,§£=&dHøy;2‘S¤lûeQZ•1ª©°Ûé}¶FÏ4¾é0“CiÂRã(23ÊøŒ¸-þ[3Âßò†¶g…¿å UeÇ^“"ϩ̸ zn}ï)¥îJiøanþŒÒ’_èÔ‚ezÔ¬©eðz‰U» —³ºÍ^çzªW;M·2*á°ÓMà;%+lЂQ+,àò£Iê3"O -¾[3Âßò†¶g…¿å S›6ºïJÕV…QŸ¤Š}\Þ)MJU9£6µ¥1÷nœ…-*A!IpŒðj3$iÀê¶:åv}…F¯×î YujdYJB£²ÓLšÛ%‚my=E«Q™d»’Ipw<¶g…¿å 9lÏ ÊðôÙ#_­ö?J¤Ô5P)›î]Rr&òІ:wV{¬çN0]9à†ýYl;§êjiÉ.L%oé7VIRÍ)#>èô¡JÁu$Ï ŒzòÙžÿ”1PÛ5ZôkÒS3Z‰EF÷äÓãÅ|ä´¦ÊßC©I8¶Ð¯„ÓJÉ%'’2âYÏ3V¾/~&T¹$®ÈѾ8t–Ú[&“Q9:N6f¢JK”‹ô„G•éJ€¾§WŠ ¨¥T_mÚ„ƒ:–{Ç §4äº;†–y<sŽ“"<®[3Âßò†*:túìÚ¢Õ}©(‘í}†•-qNJÚæ‰k#x£-M%yZ‹Œ’R­%¨xìÎ㸥Sì*Fí*ê®hÆS"òfLu&27»I(´­ÚÉF¢Ôá`“À€-™áoùC[3Âßò†<A'¿-™áoùC[3Âßò†<ïËfx[þPÖÌð·ü¡{òÙžÿ”0å³<-ÿ(cÀü¶g…¿å 9lÏ Êð¿-™áoùC[3Âßò†<ïËfx[þPÖÌð·ü¡{òÙžÿ”0å³<-ÿ(cÀü¶g…¿å 9lÏ Êð¿-™áoùC[3Âßò†<ïËfx[þPÖÌð·ü¡{òÙžÿ”0å³<-ÿ(cÀü¶g…¿å 9lÏ Êð¿-™áoùC[3Âßò†<ïËfx[þPÖÌð·ü¡{òÙžÿ”0å³<-ÿ(cÀü¶g…¿å 9lÏ Êð¿-™áoùC[3Âßò†<ïËfx[þPÖÌð·ü¡{òÙžÿ”0å³<-ÿ(cÀü¶g…¿å 9lÏ Êð¿-™áoùC[3Âßò†<ïËfx[þPÖÌð·ü¡{òÙžÿ”0å³<-ÿ(cÀü¶g…¿å 9lÏ Êð¿-™áoùC©ò’“R¦<”‘dÌÝ2"/¬xŒ:Ç)ä 份_Ú׌iëéáõõdI®ås~“%ÆÝÎ\' ‰8ééïtŸF ˆþª‰PfɉQzXpÒ´º¢4™$ÿyò¥ò.l-ÖçuƒÞã:sŽë:¸ãüz°5]ß3Õ·žCÉÝÝiéΓéÏã§?ÝŽX>b€¹Õš­NšÝR[nT"!iyd¤©ä‘‘’ñ[´fùÆtÈ{MªSùlƒ}Ö£¢–IÕ‚IqTSR°„¡jR•¥ #3ÀÜÍÙÞÎÛ˜ûhÙݘIKŠ".`‰ÀˆÿæÇ—kížüÞYžÄõc™&duÛßCñ×GeÔo´-ÚTòÉÇpeÑ­dJWüeäÆJ]…‘mGMA njZa„””¨Œ”—0]Ùä9Èž×Û=ù¼³=‰êõöÏ~o,ÏGâz°$Ûóµ+å8^]?ˆsµ+å8^]?ˆÔv¾ÙïÍå™èüOV¯¶{óyfz?Õ€52hŒ¹:¡&6ÒêP‘=õ<ó,7KÐfi$‘ª)©XBP‚5šJRFg°MÇr5-ºƒ4 “Ô¶f,™LF7$t¤’ŽŒá’.¢"à=»_l÷æòÌô~'«×Û=ù¼³=‰êÀYcÖ¤¦Ub¹Q} )”»-¦]Z[Q)j#=&Fy.ƒÉâãAªQj0—@iÉëKªLv¤4òÒH"7[3-çrÚQÄÈðEƒ,?®×Û=ù¼³=‰êõöÏ~o,ÏGâz°²Ð [4[vu"lÊAºŒƒ‘1¤Gi˜ª=m(CQ% ChIš¾LÌÌniñìêth±iìÐa± Óz3L%¦ÒÆ• Ö‚. Q¥jNKŽeÖcǵöÏ~o,ÏGâz°í}³ß›Ë3Ñøž¬·çjWÊp¼ºå6£N~Ì5\b#Ž6¤%öžhÖÑ™`–’Y)9.’ÔF\8‘—­í}³ß›Ë3Ñøž¬;_l÷æòÌô~'«h[¶˜n¤íI½¨Õ‘9æÒÓ²RÅ q É¥*W$É‘dðF|2cQ§ØÕ(ˆ‡Q…nLŒ‡—!,¾Ó.!.­Fµ¸I22%)JRŒúLÌÌø˜Ž×Û=ù¼³=‰êõöÏ~o,ÏGâz°Ùº¥!´%¨ÁJDIJ^Ax¸‰çjWÊp¼º¨í}³ß›Ë3Ñøž¬;_l÷æòÌô~'«ru« …[–ÔºÍù"¥!¢Ãn˃Fyh/î5C3!Ò7G´‰ºäŠMÃ*y<Ú“1ò;¬–JSŽZR\³“â2;_l÷æòÌô~'«×Û=ù¼³=‰êÀƒ=‰ëäSX~”ÔÙ& lšKdZI’àI"áŒcxÌíJ4äO¤^N–Œè~-2ˆÓ‰ÏN˜Dd;®Ogsç>î(<í§G.Ð×(ÓŒcyð±ŽÈà9ûÜÛñ-ó\/Výîmø–ù®«n«–½¯z3]‘W·RËr’¢DJjÔÉ¥HAÊ×Þ´%ztç†5c€êõÛ—’ë£ò~QÊwYoFû{½Þc£^ó»ÕÓ«ºéâ+®~÷6üFË|× Õ‡?{›~#e¾k…êÀ$ÅZó9O+:4ŽVÊX“½6×¾i&£JŸ„’5¬ÈjW|ƽÚ.Ï]¥±Jr“k.ŸfãUƒe¥J’Œa'ýäC‹çïsoÄl·Íp½Xs÷¹·â6[æ¸^¬d±*ÞbB¤1"–ÓËi ©Ä-²Q¶ƒQ¡eÇJMkÁt¥c¤Ç‹j0¨J`¨­MˆfÒy3fDZÇÀN’Á`°EÞç?{›~#e¾k…ê߽Ϳ²ß5Âõ`â%.ˆ‰È‰N¶£¦ …75-0ÂJJTFJK˜.쌌òGœän9Ú•òœ/.ŸÄUüýîmø–ù®«~÷6üFË|× Õ€-v¥|§ ˧ñLM °ì‡X—MiÉ.¯©!&êÉ)A)F_ô¡)Éõ$‹ ˆVœýîmø–ù®«~÷6üFË|× Õ€3^°¨/U•Wvü}Ê’Ô…ªZ QMãRJAšù¬¥II—’2èÆ»c’ò]t~OÊ9Në-èßow»ÌtkÞwzºuw]dYÇI_kížüÞYžÄõ` ¿;R¾S…åÓø‡;R¾S…åÓøGkížüÞYžÄõaÚûg¿7–g£ñ=XoÎÔ¯”áytþ!ÎÔ¯”áytþ#QÚûg¿7–g£ñ=Xv¾ÙïÍå™èüOVÛóµ+å8^]?ˆsµ+å8^]?ˆÔv¾ÙïÍå™èüOV¯¶{óyfz?Õ€6üíJùN—OâíJùN—Oâ5¯¶{óyfz?ÕŽ~釱YöX¸íÍžÒœ}&¶JU{Â#Áã-ñÇÿRï€;~v¥|§ ˧ñv¥|§ ˧ñ?{›~#e¾k…ê߽Ϳ²ß5Âõ` C©_)ÂòéüC©_)ÂòéüE_ÏÞæßˆÙošáz°çïsoÄl·Íp½XÐçjWÊp¼ºçjWÊp¼ºWó÷¹·â6[æ¸^¬9ûÜÛñ-ó\/V´9Ú•òœ/.ŸÄ9Ú•òœ/.ŸÄUüýîmø–ù®«~÷6üFË|× Õ€-v¥|§ ˧ñv¥|§ ˧ñ?{›~#e¾k…ê߽Ϳ²ß5Âõ` C©_)ÂòéüC©_)ÂòéüE_ÏÞæßˆÙošáz°çïsoÄl·Íp½XÐçjWÊp¼ºçjWÊp¼ºWó÷¹·â6[æ¸^¬9ûÜÛñ-ó\/V´9Ú•òœ/.ŸÄ9Ú•òœ/.ŸÄUüýîmø–ù®«~÷6üFË|× Õ€-v¥|§ ˧ñª¥!I4ª£I2Á‘¾“#/¬Výîmø–ù®«~÷6üFË|× Õ€;妅¿amUb6ÛYËdúL•žž“ëè>œ—ýT%Ñ™ Íl2ÔÄ”%ô™¨Í'ýù3ÿ?{›~#e¾k…êÇAÜÙmbÕz¹A²ìy‘˪)›~"›Y£Q¤÷xQ’eÃ%’2ê0`ù¾¡Së%Gý!'þu_üÌrÕzµB\)‡n¥*äí;‰&dó©Iᦒ_ õ ]ÐZ$]%z:%9>+†¤¡ãqµODy#Áõ®îZ„Ûv™©4FË ™G}”’y)O`‹ ¯‡F0})ëIyÓ¯Z;Ó[¹¾‡—ím&¶Kîo§ßS¯[ˆ§¢Ç}ã¿%Z'¡¼ÚT²I¨ÒJRH³„¨úz†ÌpšlëtéÏ2Ê#µ$¤,ùQ¬ðM¸‚"- øÌôõêlvåÃz+ªu-¼Ú›Q´êšY– Ò´)'Ç‚’deÒFF4h•+T…ëFÎæµz´Ü«Ç ¿#ÔxË’ÌF ÷ÔiA))à“Q™¨Èˆˆ‹‰ä̈s;5³]³©Òãɺn’D™ s”Õç-õ6ÙîÛJLÍ)ÂOºQÕ“<”§}^ŠüÊb™£zN6âIj2#ÐâUŒ‘>xk6˜“j2—)®@•¥´¶µ8R#­´­YA%:”Eƒ25q,ôq!°§Ífkj6õ!ÆÏK­,°¶ÕÞ2ÿëÐ}$8ÉÅ*”ó Ëi-›ÉQ·»tÜ5M$e$yî‹ o­ø2¹ITeþ‰[³m  É9Ït}gÿQuu™Ë°7À<'ÆLÈnÆSϲN'Æ\4-'ÔdeÐÿ§’8 ¦Ó›ŠäÉ3]..<û†¥-]xÉž ¼EÿYäΠšíJ5.©,̘ŠÊ^:Lˆº ûÏ WTë²¥Yu§Ú¯ÉŠO9»m ÃJc)Ï‹JÝdõžx|2ÕÔEÐ]nЕAƒéIT³D•(š24%—\"=âT’-HIçC‘«F•gÓ"«„%töTóq•ì)f¦ÒŽ>¬ðωVžÝ>2\RãŽ8–™i< ÇðS“à_â}%‚4²„Ÿ$‘Ô5÷Ê©êŒî’.èÔ†ä-ÒJIJY´HIede}*¥ZZ=IÑŽ)¨¶—V“²ýYX%)$Ý‘ÊH¼öÅ5Š-R™QD‰µØ¬Õ)Pãn‘PÔôfõÈ`â;!¬Èëq’çrR—PHA*ÙØ†Ð“´+MdÆL:£-0¹,N6óIu§ÐJR[ZTeƒ3Ò¶ÝA){½jüõNM2ŠÔÚͯV¸Ž;iZJu>¥Nr34Ô¶Ó)C¾Ù6¼¦$d­.¶ù"ÌÜî’rns½˜‡W¸©Ñׇ.,e¥d÷Ðâ%ÃD„©Fj4-R„令´— JK‰1ã{;Û”ý¡¥¨hñ•¬Ü±ZÊØmÍÙÞû¹ï|¾¾†¨ÐÅ=Ïu¼úýü:–:ï(¾*–Ï%ÓÈ)°çræwœ¡ÙHѧ4òlç'}Ž9ŒÕ =\•DmýSâFfSíhWpÓÊu-«8ÁåL:X#Éi㌖x:Å‹Dºv½]—sÛ­Ôà»Lb*å2jgyÊ*æŒ÷;Ä’›<—t‚Y`ËWKfVµ9Ëž>õ²ŽUZ³cR#»6m O+•¡‰Hš‰›fM-M-¦ÔNšu‘8ãHý)æ—M ©¹C[¥¿Ê T#7*+ºãN$”…aDFYI‘àȾ3GæÈôkv™²”QgY3ZDZë ×é­QeÙ2Û£Ê'Ü6ôÊ,¤KI,œJLˆÕÄ…ƒfSaG´*(‘kÕÓn»tD~…JLgz+DôMÛ›“4©¦‘).>i2--‘å8î@ÅRê Ó9ß–ÏÝóÞ~SDúîÛíšNŸ#'…:¼#þ)âÔÛ\47­dQê²U* ‡ži•N2º£{ÒBÒyÔÚR׌hJ¬ñà‚š¸¬˜4÷¯z":“nJ¥R$¡šE8ÖÒ䔩[ý,§æ[n9:Ú{¥ ñƒ5t° \tÛF%jÖ´‘ ¡ ­&$B£½Omøò£!²‘ÈÜ3\t&A0¥¤ðZXZðZ²¿À~{›gÜ*dª=rŸVœÝ e…J½äÈ…Va礒ÓÄË“¦6µ—ÁS.™Ÿsü¢RâXW]ç"‡lJb€Í ö R¡w2%%s·Éa²ÂTòˆäi,™·Ÿ„Fëïºïbö=zæä¼¯š)²'r}æîé¥/F¬œéÆpxÏA…½]çz½ÇO仞d©"½æ­ö¨‘äkÆ Oô8ãð3ž8*WnÔgÆÚ+uk6·_­Î§šmyP©®ÉܵÉ“i Œ™2|žR’f“q+""^t¬Úa;V¸ªÕÊEB«g9p°²€Ìu«ó|71M‘Ée+B‘‚É6´°£I›`Y‹Ê¾‘l°ŽU6läÅ’DjIEJâK…çNgÉ$ddJ%Q+¦[ÌÞrh•™ôÇ*4êÅõ.d”èR›(lS¦D`ÜÇi{¦ܨÞÁçVjvÉÓ"Õé ¶æ¹fB¼ÚyêLHk[nÓ•LdÔM0’ý#%1zÔÚÈô8X<-[†»Í{rŸÉwÜ÷R\{Í;1$H׌¯èúqÃáç<0k†»Í{rŸÉwÜ÷R\{Í;1$H׌¯èúqÃáç<0t­V‚Òè´C~Í­¿g¢ù\¸´„SS‘©ÜØûfjŒE­ œƒq[£Ie.%{¢Iª”UD¡›Öemû=ÊåŤ"šé¹ŸÍ¶f¨ÄZÐÉÈ7º4–RâQ§º$˜쇜ièÈDGŸKΚ¶Í– B•­z”FiÊI=É(ò´ðÓ©EáBª@®PàVéoòˆÍÊŠî…'xÓ‰%!XQ–Rdx2#‰n*Zè‘lËjÔvñ–ìJdÈ*J#S—E”ʉÆV_¢io©Ì!dDDò‚ÉÛlf‹>›±Š Ñ…O´«ÙŽÍdªVÛÄ—¥":úôØ7T¥NJZU¤Ë&|R¬­~›NNÖê2î{b§TœôØ‹·j @qö¡°–š%$žIiŽdñ<µê4ëJÈ»¿‚8‹¾›NViu‹Z¨åÚ»ö©¬ò ¥BUY¥0\§ ´°m·¹Õ’Zuhá¨{K­Ä™VÞ§ò‰Å”:’ZœqN›m™f®å|YÁ’U•’L”EãbW{(±è77%äœïM;“ï5î·­%z5`µcV3‚Î:Vö|IR.š dg˜*}nã¸mÖÍ…TdµÌ¥+L•¸“è2Auwa4`GÙÓt›2·@­Á§’n‰Si®Æß5É’in¬ˆžQ¾l© #Q¶”#@U‰]ì¢Ç ÜÜ—’s½6<îO¼×ºÞ´•èÕ‚ÕXÎ 8è ¸k¼ÑW·)ü—}Ïu%Á×¼Ó¹ÓDxÁêþ§>sÃJì&‚Ìû:n“fVè¸4òMÑ*m5ØÛæ¹"’M-Õ‘Ê7Í•!$j6Òƒ#$cHí¯K^³]zʧ^ßp°‹•Çå>˜ìhèŽTÉ„’u yÞäÜ4¤ÌÔIV´ Ëtš‘©Û'L‹W¤&Ûšå™ óiç©1!­m»NU1“Q4ÂKôŒ”ÅëSh##Ðá`ðd1æÛmJÙìÆ•I«SíÒ¹¹]˜åÙÈn/&$§–6þùihˆ&¦ "àÒõR5È´GÓ>\g¥0Ö…wm2¦’ⳌûEƒ<ž®Áã4Qvõ½Mì›gwÁ³¶S0j0›6hNDÑ%Z‹—ÒƒÇA`»kÐ-jÍNÚ±kôÇ /L‡Í.³&k­¡j4!+Ç(† ÂÉ,Ô’Ö¬pÆk6»Ù!ú‡%仪”ø:7šóÉ¥½^p_ u«Z±“ÆN°º¨ÆÆÚš«E È¬L“Q„frèO/’²Im+v5E $0Ú”µ2¾+Q,±…–|"X¬D·û$m¼ÝÒWë¦YG_*LG+ê' 'D¢­J2.àÒ£_^@lKÚÚ•rö:Ô×Ê n¸Ëdä'ÐË®6Fn6ÛÊA6âÒIQšR£2Ò¬—=”лì×—˜9·9^éÑw[ÝæŒkøtãWV3Àk×M*†Ô6iTj“MaÊzƘ¾òä¡×æ¯Ò=»Jdi-ÚTX3ß(Š©ìï÷¬r.Ì/>[ØFë˜9ÖrrM“Óú< U[ÖÙ¦ÓiõjG%šš5ÀLîLrRt’µ6Û)ZÖ’##3"2,–zG8U',Ûâé“S¢VæÆ­ÈbdTÚk³2HŒÓ'DÒTm™)¥,xAïOºÉÐ7Dæ{Nß—XvѪˆ~¤û2møœ±ÚkRåü•ÆÐ‡IiÁ´ŸÕ­$lô— ØTvŸgÓèk­É~±ÈÞò—Z¡Ntân’•¯”% š˜ÂV•~“’É–H·\…_‚¹X©²Ò63é’!9’"<’Biâ]Ñ3’ÎHñ\ÕUuW¶´•Õ9ò¦ÔcQÔý;“͜ʢa¸é"4¸n)ÄI)5RzHÕÓm6…X­s4Óùfç{¼ÿºú…Ntcú"½ÎáãN8gQ€7WÝw±{½sr^WÍÙ¹>óF÷tÒ—£VNtã8:p]ó>l“g²ßôæÐ?Ö…¹Def£“K‘Q–£&XA­ZK&}â"ë3è"ë1Éì·ý9´õ¡_îQCxÓ:ßy¸moä2ë2›g%úSeÔ;»ãúѧ|s«)F Å]Ø¥YJ0“Š»Iœ¼ÚýÒ“\‡_§ÒЗI­Ã°œy pÒ•k|–”¥zV“ÁºO¬èí ÷=Åy/°QæÅY7!¤«RḦÉIW I222<xÈŒŒ‹ž¤ß,SíÚìfi¬Õ:rœ3”EÉ›orËfO$Ï:µ!Dm™Á<™pÌìŠ äÄêÂÈÊ4´2ÌcÓ‚u ›Š7_ñ Ý4§¾H#.3ñt*¥JÑXñ]]«~_¾‡ƒ éÕ*i‚ž+¦ÚíýN‚½vPè³Scò˜¦ÉÞM òÝJ ̉jC(R’“22É‘àûÃUwÝ5Zë6‹<¹enœ{›ß”qÛ"^¥vÍ.¨÷ˆKf’Á¤Ôf|d0¥Ézܹ.uN‰\K·~N—N\Õ±ˆÍ²mš‡ *J›7 Z ¼ëâC–¯¢»:Ö ·rQ«ë“Q×*«@v£»h¤%ÞÁ‹»-âÙÒzÍ%£Jˆðk1ï¡-ª™³(Tùu(|†sñ[rLmZ·.)$jFzô™™gû‡ñM«ÆªS)uJZ›¦ÚfBHim›ˆqIY¥X>å8"5ee’"ÔeÌl’ ·ö\Å.ä§«ºvlg"LŠhIÇå/!´KRðÙµ ‰&¥–œwJ.'ËìîŠÔWfp©öÜŠdŠmI%ZG5®6$¦‘%§Yš–JY¡;âÊTfDJ3à²lÚÏdV…àäÜ—œéìLÜë׺޶•éÕ‚Î5c8,ã †ÿºWú£Pÿ|„<öOL-–ZPæGv4–(Úy—Ph[kK%%I>$dddd}Ò‰ÿ„]+ýQ¨¾BÄ‹Š¿P…CL«Ôª•Ù”–'ÍNb±-²27WÉÖiÔ® I%J<ãf^ÕZ…ùL£Vß©.tg RŸœÄ¸Ò"IˆâГ2iZ£¶á+†q§þÖG-³ú³v-rFåR¢Pn[z’˜•G3Éã¾ÃTêèoQ/RMXOq3É •û´x`Ü´ffÐePŽ2CµJ|·g*2t¡¯Ó4ÃK4÷Ojɰ†ÜQà’cÕöŽƒ‡Y©…Õ¯{¿ÖÛí¹îµ¹ô N›­'fÕÕß úo.`6Ív·`mt¸v]mê«°Ú'd¨©ÒZm¢3ÂHÖãiI(øá9É’TdFICh¥ÔýÛViÇéRØi:œq…¡%œdÍ&D67'-­ž[väÇ¡;&•I‹çqÃBÖÓ)B9liÚ[kñíÏ&ß«Ú[kñíÏ&ß« š¿hÚ)u>‡Ô^¥Ô&SeÌe‡^¦I9PÕ¾t·n›.2jÁ'ú7œN%Ýg¤ˆË7žšï±ö×ùÎ>Ú[kñíÏ&ß«Ú[kñíÏ&ß« š¿hÚ)u>‡Ä]'#ä”ÚT~BÊ£ÄÝ6iäí+N¦ÛÃ}ÊOB2E‚îSÞ!›ÏMwØûküƒçm-µøöç“oÕ‡m-µøöç“oÕ†Í_´mºŸG9é®ûm9é®ûm|ãí¥¶¿Üòmú°í¥¶¿Üòmú°Ù«ö¢—Sèç=5ßcí¯ò=5ßcí¯òœ}´¶×ãÛžM¿V´¶×ãÛžM¿V5~Ñ´Rê}离ì}µþ@离ì}µþAó¶–Úü{sÉ·êö–Úü{sÉ·êÃf¯Ú6Š]O£œô×}¶¿Èô×}¶¿È>qöÒÛ_ny6ýXvÒÛ_ny6ýXlÕûFÑK©ôsžšï±ö×ùžšï±ö×ùÎ>Ú[kñíÏ&ß«Ú[kñíÏ&ß« š¿hÚ)u>ŠÀŸO ˜0#A‹„l°É) ¶’,R’oD]D=ùé®ûm|ãí¥¶¿Üòmú°í¥¶¿Üòmú°Ù«ö¢—Sèç=5ßcí¯ò=5ßcí¯òœ}´¶×ãÛžM¿V´¶×ãÛžM¿V5~Ñ´Rê}离ì}µþ@离ì}µþAó¶–Úü{sÉ·êö–Úü{sÉ·êÃf¯Ú6Š]O£œô×}¶¿È4éÌ»™«ŽLBv{N%ä§É6 Ô§B]Ücu¼$à‰zuqà?vÒÛ_ny6ýXvÒÛ_ny6ýXlÕûFÑK©ôU3ééœäôÆ‚RÜi,­ò%oÚMF”·y4‘­FEÐF£ï˜÷离ì}µþAó¶–Úü{sÉ·êö–Úü{sÉ·êÃf¯Ú6Š]O£œô×}¶¿Èô×}¶¿È>qöÒÛ_ny6ýXvÒÛ_ny6ýXlÕûFÑK©ôsžšï±ö×ùžšï±ö×ùÎ>Ú[kñíÏ&ß«Ú[kñíÏ&ß« š¿hÚ)u>ŽsÓ]ö>Úÿ sÓ]ö>Úÿ ùÇÛKm~=¹äÛõaÛKm~=¹äÛõa³WíE.§ÑÎzk¾ÇÛ_äzk¾ÇÛ_ä8ûim¯Ç·<›~¬;im¯Ç·<›~¬6jý£h¥Ôú9ÏMwØûküÏMwØûküƒçm-µøöç“oÕ‡m-µøöç“oÕ†Í_´mºŸG9é®ûm9é®ûm|Ù©í‡l´øéyëåõ%JÒD†š3Î úÛþá®íóµÏ¦ù å8NÒ:Fq’º>›óÓ]ö>Úÿ sÓ]ö>Úÿ ù‘Ûçkž;Mò,þ@íóµÏfù ®òÛ¦üô×}¶¿Èô×}¶¿È>dvùÚçŽÓ|‹?;|ísÇi¾EŸÈÆãé¿=5ßcí¯ò=5ßcí¯ò™¾v¹ã´ß"Ïäß;\ñÖo‘gòñ¸úoÏMwØûküÏMwØûküƒæGo®xí7ȳù·Î×›óÓ]ö>Úÿ sÓ]ö>Úÿ ù‘Ûçkž;Mò,þ@íóµÏfù oÞ—Ó_‹WD:EƒY­F¶ùk!´ÛªÆOJ]y+ÁgRSÄeƒ=/e÷—Í=Îtïh‰{|ísÇY¾EŸÈ¾v¹ã¬ß"Ïä…‹Ÿ·vU ²Â®š…j‹"ŽåV¸©ŒF}æ\Y7Éc·“6–´ü&×מÁdv£çoo®xí7ȳù·Î×L+9ÇÂN3Ç€û|ísÇi¾EŸÈ¾v¹ã¬ß"Ïä ,\ú5B‹¨ÑW5†A!¶Û¬ÍJP’,àˆ‹†ö¸T… Ò©5,`ñ\œGõ‘ð8»|ísÇY¾EŸÈ¾v¹ã¬ß"Ïät¢ø¤rQwQYG¬ú}­gÒÝ¥Úôj]"²]”ã1IhJqYR±£ü‹¡)JRXJH‹sÏMwØûküƒæGo®xë7ȳù·Î×dvùÚ玳|‹?;|ísÇY¾EŸÈÆãé¿=5ßcí¯ò=5ßcí¯ò™¾v¹ã¬ß"Ïäß;\ñÖo‘gòñ¸úoÏMwØûküÏMwØûküƒæGo®xí7ȳù·Î×›óÓ]ö>Úÿ sÓ]ö>Úÿ ù‘Ûçkž:Íò,þ@íóµÏfù o¦üô×}¶¿Èô×}¶¿È>dvùÚçŽÓ|‹?;|ísÇi¾EŸÈÆãé¿=5ßcí¯ò=5ßcí¯ò™¾v¹ã¬ß"Ïäß;\ñÖo‘gòñ¸úoÏMwØûküÏMwØûküƒæGo®xë7ȳù·Î×›óÓ]ö>Úÿ æ/Põ&j´«ü•ã=9ÁšÕŽ$]òÍm{¶éÙå¿sMÚíÓú¤I[,È´ Ï$dFh#ÆHÿ˜þö…k\Å[¸]ÚÕß94ø.ÈäÇ  ãJLÉ­‚3àgƒÁAô »²OÀ?}ûËv[òýå÷ÈÞÎ÷*n;ãòM6•˨•Zƒr0õ9-:¦4|6”½Ú—«<4­M1Ç_Icënøü¡eÔáRëZª‰ºl–‹1,$”æíÄu$”dF¤ž•‘‘e$?ÿÓßK·ÿÿÜõ?ÕVÁBÿöÿõ6,©¥MaØœ¢\Ç98ÊA!¥Jm÷[I¨×«;¦’¼éÓ…+Q§Ik×ȵ«l²ãç—YDuÉ7X”Ó¨6Ò´¡FJBŒ”i5§)#3"<™cˆë¨;GO¨W'®Ôº•U¹ 4m6ãlÆ(Ócš4¯)Q¥2‘¥*I¤ôŸæeñKUnŠ…9&u2¤&kMQaÓ MIBZxÔ~äס<¥OãÕ1T¿ò…¸œË–UÐÜÞDºCÅ$ÙŒúZÖJLƒA3¤³Ý)F´–’â\rE¤ñpQgЦ"%@¢ïÞñ'[Riɧᴥ'9I‘–rXâ;¾Ñ9Þ55RJlIíÕÎT©QM$´°—–ë)k'ðЩã< w¸hvƒV¤V*ѤRYqI¹2 ¨Š”Ý6Z3BJ’žyѨø™‹EÎûÑQ¶ã›Ðævöm“N¯Ò)H®J‡>­R‘N‚Ê)äë:Úm…šÝwz“m'¿Id¬LÌsôËjµRˆ‰Pâ¡htÖL¥RCšK*&Ð¥œ2ÿ’GLJHè-ËöM ̇oE\ÅF\ù®ÕaïM LŽû1›JðËté’Œ»“RL³Ä†âßÚ2—M¦Æaç㮆§ žïcÔùO>“}o!FóÚ—dnw;Â,‘g9âÜÕΩAœœË"å‰Kçá0–y+s4Öñ°â´ºMÍÃF•$ÍZp\sŒ?¦ì;¥Ç!4Õ=—™!˜í°‰Œ)ÖÜuD–Òê z™ÔfDFá$¸Žšã­Ûú‹uXSæÎ«9lD§*:lâ¡NR›Œáï‰ÃQ©¥£vXZpgÀdÑïûj™{½w¡º³²êÕ8òêQN3in25™n+Þ¸f¦I)Ô”`Œòb1Î×Hœ0¾örÑ,j‹ö}ZáTÚcGM’Ã+ŒåB2V¢q—]3,¸G¬‰ "lˆÔ¥ÒE©µ‘jîKj±n©”UØe…ºjI6‰M:´)8Ô‡…¶²ÔYJÈŒ³Ð2èuJR,Ê夹¬¹*Di±]ŽÊ]#u†ä ›Y)iÒ•oþj2ÓðO#;h÷¼ˆæKšÚž\ª„ÈlÇ}òV^éFNš4¬÷ªÂ•¯‰]9b·"­G Î<C˜OgÚ+¸hÕŠ‡/(ª‚ßù3FÖ£”é6ë¦ÙKOèÙpóÇŽ’ÇtC˜õ£~ÓmªM +6Ô*›ðç9>KÓTúM.¨Ò’K{§’•'v„þ±&YR‹3Í&åoÂZ _yƒ³[mÕpÑ™‘ºb—6¢Ìg\Tæym©Ä¥Ãe.+SŠ"3ø)W®¡æœÝëˆÔ²§Å&œŽÔ¬ª£&Û¡+C®¹–Û2R{µ‘$ŒðfGÀoí˪ɇpÛUI¥_CvÌÒ8LGŒÊŽLtÌ\„)Å)ÂвÞ($J%`‹RzF¢£vS¤óî†e—8[TÚKYJ{—£rjWu𒹃,Ÿä‹'Šbž-Åí e³‹¡Q–h§«”0ãÅ$–ûe¶Û(¿¤'MÜ(•´fx$éRTJQjÑü'gסÆù®I<Â6¤0ägq¹o7äæ$Qœ=E”%z”ƒIºîШ³ìi46cT%ÚcQ Km5¥ª: Ìõg§?Õý¦øqVŸâ‰~ÒbÚTj*Þ«Á‘ ™K²£FiÜTR°…¬‰i2œÒM*Á(‰ÂG½ÞëÕßu£GÂþÖ)O˜q‡#UpØ—E<Ǫk»º–ÛsXuØç«IÛBÍII«(È’y,ä‡4;JÕÙN›pí Ó2ÒÕ˽äiRS©½ud–óºáÜ4¢á«º2êâ\Xé&¿I$žàå@:¦- îÐ(6Ÿ8ãù³ü§sú®XÓ.|]Öö:KVœðÏ bmªÒ©œàQQºÜ!²xÚ#Á¸MjÖhé=Zq‚3èâ;zfÖkP/[jd{‚åbÝ¥·JjE9©‹Jˆì°‡Ò–‰z –¦Ü2#Æ­\q“Om+ÖÙ6K8µÒJÝ5@€£Z ?'ÔsTFúu#¥83âdJIcqTèu´:˜w~Ì«´ÛŽ«—.Ó™›-ªy¿:9H”ÓdÍ-ê%8²6•’JsÃ8Áà…ÍxÞ6„‹ªß¾™S\ø®Ê¨F§¢3JFN­2CM¾½îZV“4’ܨŒŽE2&”¤×â"¢Š{€§0Gyÿ¢ÚÿŸ/áPäG]yÿ¢ÚÿŸ/áPäG‹§{ÓÖÐýÑ"ˆ Dõ1=B $ =Bõ0000"ˆ˜wÀþ€ô2À¥V«žæKF•A¯•dš#mòâ¿[H5/V‚Öœ(Ë¡YáÕÇZ{ŽÔ®Y~櫲߬]Gq·”ùD}pÍ—oAþG¼^².®Œ%Œl6=b[­Y•*¤z«ò]£3¨Ñ^žÂDjI[iô¡%Ã=ÊK&fgÄÌÇ–Ù¬F“²kª£ ŸS) R¤)³rà©8’=Y4*A¥]= ##ë#.…Ò`$©@wÇæ©6®°£Jåӌ˼âÿ ý+ßWõËÿOûwKöTê-¯ÅkÝ_…íþYûm3Ù”4êP×_ðÞß­½ uv%]2`ýµþQà»:¦‚âü?¶¯Ê,Ù[' ~ÊŸúËÚrâÖG‹?ôþ†¸'™^®×žŽ—£}¥~ÁÊ´t¸ÇîQþ·‘ÐcW'¬n¥þªö„¸µ‘–^ÄÑW'™Ê¹LŽ•µûŒÿฮ#¤Óõô®‘­‘Òc}?õ›.-dg—²4eÉækVFž‘ä·Rž’1ìøÃ|l‡·4·Ídq—³(.¹’©'¥+úˆ ¨°ž”¹õâ1]Žõ1ö¾’ù¬ŽRöulWŒ](wê/Ä ®D.–ßû%ø;£Þƒ#í:ï¡Íè4‘¾UÅ‹‹R>É~#ϲh'ì§ñÓ¿Æ?XÑ:³9½‘ÖöMâdý”þ!Ù<‰“öSøŽHÄ mÕHØéwdÐ>&OÙOâ“Àø™?e?ˆä¨@mÕFÇHë»&ñ2~ÊìšÄÉû)üG"·U#®ìšÄÉû)üC²x'ì§ñˆÝTltŽ»²x'ì§ñÉ |LŸ²ŸÄr uQ±Ò:îÉ |LŸ²ŸÄ;'ñ2~ÊÈ€mÕFÇHë»'ñ2~ÊìžÄÉû)üG"·U#®ìšÄÉû)üC²h'ì§ñ‰ ï†ÝTltŽ·²h'ì§ñÉ |LŸ²ŸÄr uQ±Ò:îÉà|LŸ²ŸÄ;&ñ2~ÊÈ€mÕFÇHë»&ñ2~ÊìšÄÉû)üG%ßuQ±Ò:îÉ |LŸ²ŸÄ;&ñ2~ÊÈ€mÕFÇHë»'ñ2~ÊìžÄÉû)üG"·U#®ìžÄÉû)üC²x'ì§ñˆÝTltŽ»²x'ì§ñÉ |LŸ²ŸÄr A·U#®ìšÄÉû)üC²x'ì§ñˆÝTltŽ»²h'ì§ñÉà|LŸ²ŸÄr]Bnª6:G]Ù4‰“öSø‡dÐ>&OÙOâ9 º¨ØéwdÐ>&OÙOâ“Àø™?e?ˆä»Ânª6:G]Ù4‰“öSø‡dð>&OÙOâ9"uQ±Ò:îÉ |LŸ²ŸÄ;'ñ2~ÊÈ€mÕFÇHë»&ñ2~ÊìšÄÉû)üG$AÔuQ±Ò7—b5Be·’¤¸J3Y0eÔÞ4@=J’©,R;Ó¦©«"D 9—'¨A‰ê`$„ ! ê'¨@€ $@$þð¥;ý…ØßC7üK{~ýŠ^D¿ü&=6 û ±¾†oø–<öýû¼>‰øLsæX»@X©@wÆž…¹ÑkMòfžrDδ‘šTi^0gÑÇqß eJ=>-eHS/¼Î4’²j$«2èâd>%þ•(ééÖü¶w¿ÿ×åæ~ïLSz¡Æëü£ù¥[¯Â ×«S™%òSTu/BÍ&H^LŒ³ƒèü@¥@†üÚ«0\žzb4¦ÍFáõdÈøg‡ÖCgF¯¥ZÔz­E÷~1¢2]RÜÊ+#"éÇJ{Ãù\ LƒCr©-è’(ê#&Òɬž$éÆ º> z¿üGìhÇ@«Nš$÷I¤ÿ6ûµmö»_ÉãTzL%+õä¼¹^üø˜¶…ºÒc]”ê¬x|¦3 Jy¢dÍ.wdfY"è<—9÷-&éÕ«j{S«Rj™oy¹4‘žð²…%Yàežžñä‡GL»(²%ÝR*Ï9º›Hm¤%³RÔ’BÑÔX#Á—I‘dƪ¥rPaŵh”ù®I‡M¨7.L¥²¤c 3<'§ûJ>êééÇEÕFÍn½÷þ}×^kÈÍ'[º{íðáêEù`D©Ü•³¢T ³23(}¦cšp‚m$|K #3ÉàˆúK8È×P­º|ë.Íz©ÍMDY&\Z)Êå.wOaµ¼•åIQ¤“ðKNRyîxïåÞ6u6è­Ý*r%O‘£³“-)Z‰(î‰F]ÊHóƒàxÎHr¬ÝÔ8›;´)ç)NO¥VÑ6Lt´¬“iuÕd”e¤Ï O>¿ñÒÑÕG%m÷绊¶k‘›ÿ¹…-ü¿ÁÏíâA£^.³E”ÒTd’~q”Úba¦ô÷GÁzòjáÑ×ÄV¯‹ mu jír»B«*qMJMæŽ2ÛÜ„eXÕœðèëâ*[[+p¿"c|*æ£Þ±–èÄw¬wÎF#£ÞƒNŒWz mÆF#¿Æ?XÈwà˜ÇëãÀâÁˆbˆ$ú„ >¡'¾ „÷À'¾ O|@ô^Ü6fÝ÷ZE©hSi”vž¢"KæÄt²Ói'ž%8¤ ‹'Á)þþäº:?:Ó5ý³ÚöÿOºé²Ý©QWA*d·šŽ´)¥ës$•’Lñ„gFxÉ–}÷²Æè¶‚®ërè‰sQ™”q%¼Ôu2¦#Ç™žS“"δ“,‘ämäìG‘S"³S¼é.iTõÔ£¼Ê’FÚHÌÉOéJ°GÒXÉ"3×…ÛdP6=;g¶UZUwª<²D§b©„²‚RH"WWèY"Á÷Gà ½ûwl¢þ8uÇQ©¦«pÝ¢3i7-F•%âîR’RÔ|s’ÆK‘ÅìÃf”ËÂ,UL½"S&ÍyLÅ‚ÄEÌ|ðxÔêPe¹NO‚—‚ÇÝX[?‡oѶÇE¸)ôÊœú%) ‹%ÈépÚ5GâVÙ¨²ƒ2Ð|8䋼Ý싲ëJuªÃ\…½Žh§¸K­j(úRŒÿC¥*5’UÿÒX ¸¶¥tÙ÷nÈlØñ«Ž±]·`¦"©Ë†áïŒÒÊ­ïÀ""kQq<ç¨Ç/²¨WömÎ\Ç™#œw[îXÚ×§w¯N+N>ç9êq”èÏŸ VÍÉKM ¿´¥ÖcôþÇ6An[»G™K®Uèw4æi:¥Òß§êä«ZÚ4-:ò• Ež -Eà ž¹å«hI¼ßa“–ubª-¦ÈÉÍöôÒY32,ðâgþ?F[ûGÙ]¬Ô¶€«¦sR+Ä0ìgiÎ錤îˆÒjI©FM§ Œ‹J»®$@ ÞU¡"¡°+&LF-ôÉ«×y .&™º˜k[’P’vV³ÖŒ¤»‚$ñîxù_»¦Z´Ú‰9´*RëTöó´Ù1Î)¼“N¬2µ«ô§ŒðItð<ýͼ­GýÏÖ]¨íJQÔ©ÕÎU>ÏåìÒµG‘uϼ^‘‘Ib£MÓ* ºLµ©òBR¼+ ÏN V@uì®5ÑgìÍTˆtÊS¡*er¬˜¨BP’b:µºe§ZŒÍfY>µH²cóÅmŠ|Z´¨ô©îT!6ᥙKcrn¤¿µ£R´‘õqÎ;Ýô/mv­>`[ÇQDº9QÎÈÊ¢9ú&BzSÝ(œ#Ñœ–¸~q¹ãÒâÜãÑ'rúbQD‘¡H7ÏrfJ"2 —èÑÐgŒNx^Ð6GM™³:-õW¾"ÑaÔe)‡ü/u‡Ai4«+36Èñ„‘™™÷?Üaî¡»­ëÒÿƒT¶ªºT¦ã­ÍËáÂuÕai#èRxã@VÌcÇ™´›b$¶‘úÄFÝiÔâòÒ¢>FFddbÛÚFËiõ»ûi³irbÐáÚÐcKnh)Ý»ª¸i-*I7“løàø¨ÏÿîÁº6)"jϸØU á¶Ö‡ áAÇ.q½:Vâ›AëÉ¡*î'\pgŸKkkVñÚJ®i˶#1#p§TÒ[el–¤£'¨Ò½]e’Æ@E/e¶Ä³®ŽÝöK[n“Éùy6·]oy«_wÖtá==<8ôîûŸ]ÁX¶é÷ô uÈ“)¸'hSšSƒZµ õ+#WIž3±“|lî`ìöÜ£ÜR%ó Ólµ¿ÖÔL!×”ã¸"2ÆVFI#5`ˆHÆ]³´Û"º^è¼$ÖôPçR‘4®Jñëp“Œ´5—×ÄÈ‹‡÷ƒ´©e[º©SY §Îf)¨ºS¼q)Ïýcô•ûgÙÕ6Ñ-Êm­L¦=fÁ*Øíé}ÍL)å‹é_™qÏNzGæ›r¦åá§VA-Èš’„™ã&…’ˆ¿êõõµ;è7¥Rݨ̗Y¼bÇŒì'")²†”4m(Ô³îUÜ©_ÏŽ:¸€36mh-­Ûë¡Û¶^㩜‰Ž5p0—q¤ž–‹áãIñ2IgŽ2?5KŽôINÅ’Òš}•›n!EƒJˆðdÞF.=U¶Oiɤ^o×ëŒW©ì¼RinFÞ¢CŠlÑú%¥$IOtgÝŸYtc'T\ÕEÖîJiƉ¥Ï˜ì¥ $“qf£"ÿ €?Tv»³yãµGc4ÝÿbÜåÎÛ¿ò¾S½ÝjÞtãWu§£«à9¿sí¹mUvsO‘Mµè·aUt³^:›D³‹Ô¬­­\2H$c¤Ìûà öÍdoÿ)Ó;*ìwš9«’«N÷y¼Þo~_ßœug€çvOØììêo\yt t Új›Æb­ÔÏ$©j$ %é<õ%==@rïÚ5ɶK†N»![ôt©Ø²¦nÔ²6Ò¦“¼Z?´¥™q3Â::Äl"UÞ“HM›å»j)ˆ¨% „ÚZ–k%(°zIgœ÷$EÒcû“TÙÍù¶[‚·wO¨[ô M›‘W¼¸§S»Aj$¶æ5$–³áÓ×ßÖlµ{5~‘QƒyH›G«oPí>°Â]t™"4™§vƒéàx3#øGÑ‚Zñv}bUýÔh”úrJ•N§ɰM K< ”IÐDØý#jÁpÎK£€ãöÇI ÕöAkm&“A§ÐäO–ì91ൻeDJt’zKnO^®=7«Ûm¼^èdÝÍFšÓy©×‰¿Ò-µïtôü,:t—€å6»wZ«ÙÍ»³Ë>¢ýV 2C²Þšäu2JR”á¥$•qá½^Oü?pª½gQö‘L ?´85 ñ&]Z¤²i'OtD•¬g»Iþ¸_Qî’¡Ú´‹3gr­JKP¢Ï‚óûÃi%!ôš#©ò‹Š”ZϤødñÀW»PƒcSëì3`VgU©jŠ•:ô´V—µ¬$FÚ8i$GYñïu{k»­ëŠÀÙÍ.PåS(Ô³Porâ7.n£§RH•ŵñI™pþòvöUÏL“³ºí÷tlÛgìS!â5=˜´4¡Ér,©J-’Î =?ñO?ži‡ 5(§QKÊ„O ä8Þy-DœðÎ3Œõ‹3iwe»'cv=ŸnÔ9C’¹5F‰—»i#Áš’D®éÇK)3.à+:kQŸ¨Æbd¢‰LJŸ4ɤ‘)zK‰à²x.'€è‰MØ~Éï:ÜK&½F¤°Úh“ù97)é;¤-Dg¯ô†„ôžI|xôm¬+>ΧQ¶wmÔ­jeMëÊ ©S&ÈoSíéa/$›_J8,‹†:3Ò9¬Övq\²aÛöÞÒ * GŠ$“9’“27=%• ™`J3ÎFÂÆÚˆT;.©qT&ĬÙÑ$FjqáL%´M$Ò²îSÜ¥?ËŽz¸€5¶E«@³l«þïªÑ Wß ÖN“šƒDãDHy´)Fžƒ3Þ—­<:Lo¤ìŠÙ_ºc™“<ÉÍ<òp£$ëÝnËšû¬tut:ÄÚ ³W¶/;R÷œý5ÃSçDËj:Ÿ$8n!kA¥<ñiÁã¿Ñ׸^Ûèåî‡ì½,ÉUsV½¤Ýj×¼Óÿ9Ç:¿€G®½Aœí•lÒ•!K"©[ÒµF{ýH"%—ë*Ε`úŠ™îÖîûLöaolîÑ©H¬F¦Êr[³ÝŒ¦rjS†”UÇÿ¬ŸGýÕéNÁav7ÐÍÿÇžß¿b—‡Ñ/ÿ M‚þÂìo¡›þ%=¿~Å/¢_þù–.Ð*PñÁU\±Þ÷Ǻ]N§!ò¦Ó¦M6ñ¯“°§4ç8Î’ÂÛô_9¯Q†] Ô—Úl?7õ°ŸÄ;Bí‡æþ±öø†ß¢ø±ÍzŒ2èV½áËí ¶›úÇØOâ#´.Ø~oëa?ˆmú/‹רÃ.…lB–[ÛÍýcì'ñÚl?7õ°ŸÄ6ýÅŽkÔa—Bµeö…ÛÍýcì'ñÚl?7õ°ŸÄ6ýÅŽkÔa—B¶ êWh]°üßÖ>Âí ¶›úÇØOâ~‹âÇ5ê0Ë¡Z²»Bí‡æþ±öø‰í ¶›úÇØOâ~‹âÇ5ê0Ë¡Zˆ_h]°üßÖ>¡vÃóXû üCoÑ|Xæ½Ft+n¡,¾Ð»aù¿¬}„þ!Úl?7õ°ŸÄ6ýÅŽkÔa—B´eö…ÛÍýcì'ñÚl?7õ°ŸÄ6ýÅŽkÔa—B¶!Ë-‚í‡æþ±öøˆí ¶›úÇØOâ~‹âÇ5ê0Ë¡[u_h]°üßÖ>¡vÃóXû üCoÑ|Xæ½Ft+PWh]°üßÖ>Âí ¶›úÇØOâ~‹âÇ5ê0Ë¡Z˜²ûBí‡æþ±öø‡h]°üßÖ>ÂÛô_9¯Q†] ЕÚl?7õ°ŸÄ;Bí‡æþ±öø†ß¢ø±ÍzŒ2èV ,¾Ð»aù¿¬}„þ";Bí‡æþ±öø†ß¢ø±ÍzŒ2èV ,¾Ð»aù¿¬}„þ";Bí‡æþ±öø†ß¢ø±ÍzŒ2èV—Úl?7õ°ŸÄGh]°üßÖ>ÂÛô_9¯Q†] Ô•Úl?7õ°ŸÄ;Bí‡æþ±öø†ß¢ø±ÍzŒ2èV ,®Ð»aù¿¬}„þ!Úl?7õ°ŸÄ6ýÅŽkÔa—Bµev…ÛÍýcì'ñлaù¿¬}„þ!·è¾,s^£ º¨ +´.Ø~oëa?ˆv…ÛÍýcì'ñ ¿EñcšõeЭ@Y}¡vÃóXû üC´.Ø~oëa?ˆmú/‹רÃ.…hÊí ¶›úÇØOâ¡vÃóXû üCoÑ|Xæ½Ft+cø²»Bí‡æþ±öø‡h]°üßÖ>ÂÛô_9¯Q†] ЕÚl?7õ°ŸÄ;Bí‡æþ±öø†ß¢ø±ÍzŒ2èV ;»“cûK¶èkõëB}:™ (T‰š”œKiþÖLÍKI`²|sÐFeÂôêÓª±S’kÉ܆šâ})Ø/ì.Æú¿âXóÛ÷ìRðú%ÿá1é°_Ø]ô3ıç·ïØ¥áôKÿÂaÌ’íb¥ßWõËï|pU_×,?è¾ñŸFºFŽG@ÖÉè)[' {ôL lŽƒ¹=ci# Æ®OXõhfk%tlŽ“)]#[#¤Ç«DÇ3\øÃ|f>0ß•34Œ7F#½c-шïXÛ„ŒGF+½2®ôÛŒŒG~ Œ~±ïÁ1Ö5ÇŃ$Ä Iõ}BO|A ï€ O|@žø€ Ô OP€Þ'¼ $ I$@AÔ€H"Ô Äõ0B€õÔ ÀÀÀÀˆ aßøÒ‚þÂìo¡›þ%=¿~Å/¢_þ›ý…ØßC7üK{~ýŠ^D¿ü&9ó,] ,T ;オþ¹c½ïŽAT‰µRônL–™RPâß”Ó %(”i,¸¢#3Ò®Žðøˆ›ªÒ>ˆ¤£E6r²:¶O@ë¶jF_Òh¾z‰ëF¾E­S2þ•Cóä?Z?AFèyõ*C©ÈÈè1«“Ö;'í*©çü®çè^´k¤YõcÏù]½ûî>¸z”SF)Î=N.WHÖÈé1Úɲë|&[Ÿ¾ã놽û"²få¶Ï¤´ÿ^=J;Œ“’8—Æã´zÅ­Ÿþ]kúONõãë ¸ùu­éM7×Fœ—S4š8§F#½cµvÀ®Ÿþ_jzULöŒæÏ«ÇŸòûOÒÊg´ œzœdqŒWz wlò¾ÿ´½-¥û@ÆsgW‘ÿœ-K©~Ð6B¤:£ŒŽß‚c¬wlâá2ÿHÙþ˜R½¤xv·¸sþ‘³½1¥{HÕ´íù‘ɦqÆ vG³{‡å;ÓW´ˆíopü£gzcJö‘mm>å™g}Bd{7¸~Q³½1¥{HŽÖ÷Ê6w¦4¯i m>嘳8à—k{‡å;ÓW´‡k{‡å;ÓW´†¶ŸrÌYœh˵½Ãòé+ÚDv·¸~Q³½1¥{Hki÷,Å™Çì{[Ü?(ÙÞ˜Ò½¤Ok{‡å;ÓW´†¶ŸrÌYœh˵½Ãòé+ÚDv·¸~Q³½1¥{Hki÷,Å™Çì{[Ü?(ÙÞ˜Ò½¤;[Ü?(ÙÞ˜Ò½¤5´û–bÌãˆO|v=­î”lïLi^Ò­î”lïLi^ÒÚ}Ë1fq ;.Ö÷Ê6w¦4¯iÖ÷Ê6w¦4¯i m>嘳8Ðk{‡å;ÓW´‰íopü£gzcJöÖÓîY‹3Žïˆ—k{‡å;ÓW´‡k{‡å;ÓW´†¶ŸrÌYœh˵½Ãòé+ÚCµ½Ãòé+ÚC[O¹f,Î4cÚÞáùFÎôÆ•í!ÚÞáùFÎôÆ•í!­§Ü³g±íopü£gzcJöíopü£gzcJöÖÓîY‹3Žk{‡å;ÓW´‰íopü£gzcJöÖÓîY‹3Ùv·¸~Q³½1¥{HŽÖ÷Ê6w¦4¯i m>嘳8þ¡²íopãý#gzcJö‘­î”lïLi^ÒÚ}Ë1fqÀ;.Ö÷Ê6w¦4¯iÖ÷Ê6w¦4¯i m>嘳8îðÙv·¸xœlïLi^Ò#µ½Ãòé+ÚC[O¹f,Î<„ȶopü£gzcJö‘­î”lïLi^ÒÚ}Ë1fqÀ;.Ö÷Ê6w¦4¯iÚÞáùFÎôÆ•í!­§Ü³gAÔ;Ù½Ãòé+ÚCµ½Ãôé+ÚC[O¹f,Î4cÚÞáùFÎôÆ•í"{[Ü?(ÙÞ˜Ò½¤5´û–bÌã„˵½Ãòé+ÚDv·¸~Q³½1¥{Hki÷,Å™Çõ1Ùv·¸qþ‘³½1¥{Hv·¸~Q³½1¥{Hki÷,řƀì»[Ü?(ÙÞ˜Ò½¤Gk{‡å;ÓW´†¶ŸrÌYœy‘lÞáùFÎôÆ•í";[Ü?(ÙÞ˜Ò½¤5´û–bÌãú„˵½Ãôé+ÚDv·¸~Q³½1¥{Hki÷,Å™Çì{[Ü?(ÙÞ˜Ò½¤;[Ü?(ÙÞ˜Ò½¤5´û–bÌ㌠v]­î”lïLi^Ò­î”lïLi^ÒÚ}Ë1fq ;Ö÷Ê6w¦4¯iÖ÷Ê6w¦4¯i m>嘳8à—k{‡å;ÓW´ˆíopü£gzcJöÖÓîY‹3ŽÙv·¸~Q³½1¥{HŽÖ÷Ê6w¦4¯i m>嘳8ñ²íopü£gzcJö‘­î”lïLi^ÒÚ}Ë1fqÀ;Ö÷Ê6w¦4¯iÖ÷Ê6w¦4¯i m>嘳8àk{‡å;ÓW´‡k{‡å;ÓW´†¶ŸrÌYœpǵ½Ãòé+ÚCµ½Ãòé+ÚC[O¹f,Î8cÚÞáùFÎôÆ•í!ÚÞáùFÎôÆ•í!­§Ü³g²íopü£gzcJöíopü£gzcJöÖÓîY‹3Øö·¸~Q³½1¥{Hv·¸~Q³½1¥{Hki÷,řǘwÇb{7¸~Q³½1¥{Hv·¸~Q³½1¥{Hki÷,řƀì{[Ü?(ÙÞ˜Ò½¤;[Ü?(ÙÞ˜Ò½¤5´û–bÌã€oî+F±A‚‰³]£?NZéõ¨s´¨È̉Dë4ä’¬jÆpxèhÎ2ü®äJv û ±¾†oø–<öýû¼>‰øLzlöc} ßñ,yíûö)x}ÿð˜¯2ÅÚÅJ¾9™?Õ:¯Ò1?ÙÉ7|s2ªu_¤b³’> û×ðþûúßñ¾ú£Ž}fEП²C_!å‘t7äÓø é[' {tR2Ô„zoÉp³Ü³äQø t‰¯{ˆß¾3”eÈè1«“Ö=J0‹äbœWCMBAâ~ø~P§G¸ëï3ÐÕQÜã{Éi({FsŒéAã8>žñŒI]#±Ø»hvUàÓ· µg%N¸J4¶FmåG¤Œð]<ϼF=m9I&‘НáW8šân*:ÒŠµ©ê_Á)T†Û5†¦Ë#LõfaâiÞncò MÁD¢ìê]¶uTÝ/˘Ãí´m<ˆ±Ú²¬)z•—rzI<:ÈÇñ¶(öm¥}Ö­Ê} Ë¬·’Û®OxÃËa*JÑÝàÒ“Q(Ò²VO%’#"/J5.6Y\¹X¯jë÷\®>ý¤¼Öö’Âw«¡iË|Rx<p÷+³K? ¥ù®7«ývͦÜÛKÙÝ ­í>-b܉*B%×I¢ÒëŠCFê–iN¥)É‘wŽyJ-2Ú¼é×[0-ö¨’(Ô·ª‘fKΈiIÔÛ¤âÔFf•p4’0eÑÔ5GF¥Ú²99 •ùÅÿˆ¥yª7«åR¸Tã©sdE¾ÜrždºÞcV[¬jÇtàX7K>‰²«åUŸeN®S).L’–]K“zÍ)pŒ–eƒîL““Ws$Xwi¾ç·«ÔÚJéy½ŽÔtO}Ô%•GS‰%%k4)i%%ÂJLÒ‚Ï3=0Ñèö,‘ÊMœ%V£pÓJ?8R ÃåL&L}ý 27Ì«:\F¦»¤ .­ì–£ŸèÔo3DõbÜ÷BV©­³a!v•ãvÏ¥ÈBÖì²6›Ô³Ü'‘nðFœ¨xQ÷yÁ’ëµlönKrç¥ZScË »U}³•)F¥6.2µ›Ù' Óm 4šK.'$¬Ó-¾ $rm•ܵ£yš'«Ù-GÁ¨Þf‰êƲk­¿-çÚŒÔVÜqKK  ™™%&³R°]¨Ìøq3>#ÄuÙhv,‘™º;–£àÔo3Dõb;%¨ø5ÌÑ=XÓŸP€Ùhv,ÄÍÏdµ£yš'«­–¦+v‹Ô©´—jî¢GBÛ¦°Ò·N·8ÜlÍ,¥FÚ2“àzK¼+eì»ú•+ýu·ÿÙÔFm.:te(E'ä‹E¶Î7²ZƒQ¼ÍÕ‡dµ£yš'«`vZ‹$W7=’Ô|æhž¬;%¨ø5ÌÑ=XÓl´;Hbfç²ZƒQ¼ÍÕ‡dµ£yš'«` –‡bÉ LÜöKQðj7™¢z°ì–£àÔo3DõcL²ÐìY!‰›žÉj> Fó4OV'²ZƒQ¼ÍÕ) ï†ËC±d†&ttŠ•ÅX¨5N¤ÑàÔ&½Üx´θ¼¨ð”´fx"3áÔF6µjnÑ)—6«d?*>ÒmVšBÅJdˆ†Çk¶oÓÐÞ/›6•¶}¢Ü‘îȵ‚†íVD»f^'e Öán¨BH5žƒ_ðÎK<çBŒ_äY"nÏÎ’Ô|æhž¬;%¨ø5ÌÑ=Xî6yeA•³ …í&*©%5tRâéՑ2E½[‹ZhÖx4’R•‘ü#Á‘pسÞÍì“«Ö)Tº]].•jËRÑOu¼’K|…¯Kn~ŒÈÔ£4å]רÑûH]•¿dµ£yš'«Ù-GÁ¨Þf‰êų´;- gÕʳ–E¼ä}M7M®[Õ™›a{ädžK)ˆ”Ià£I`²F^5[RÍ m~—²©vêgoœ‡ec–<™;ùAïI+tHI¸XJ¬’x˜…GGвB쯓u¿C~ºÅ¿ÚLg §ç"ÝŽ¨í,ôá*pšÒ“îÓÀÏûEß!¯ì–£àÔo3DõbÏ·é* ì—nt5HYèô¾’"ìæ»%¨ø5ÌÑ=XvKQðj7™¢z±bN‰f¯`_1,Š{5e]¦¼…L–¦ ¤³¾4¡;ì‘+I$õ)J—ƒ#ÒiöÛœ[ ÈÚUÁiÒìVŽÔT¡§©IÞF}ÈéRo»Á¥*ZTiY+Qä²DdE …í«Y"nú•¯dµ£yš'«Éj> Fó4OV-:­©fÐ6½KÙTËu3·ÎC‡2±ËLü„ ÷$•º$$Ü,%HVH¸˜Õij(‘vuµvçSØ“X´ê1#©%×R¬.Y²á {³N3,§%­\O†Š‹$.βZŽ?£Q¼ÍՈ얣àÔo3Dõc²½èöý3e›2ºaÐ"76©Ë¹ÉûæÜÎNúN¢72E[³G4ðÇe}[»<¥û Ñ³H–[mÓ¥K‰ RÊ¡$ä0·Ûo hÍÃFÜ#ÂÒ¼ž®$X"j(v,—!wÔ¦û%¨ø5ÌÑ=XvKQðj7™¢z±ãvRNƒtÕèjxž:t×¢„X%îÜ4jýøÈÖ ìÔ;H‹³uÙ-G‡ù5ÌÑ=XŽÉj> Fó4OV4ýá²ÐìY!‰›¢¹j> Fó4OV#²ZƒQ¼ÍÕ9 –‡bÉ LÜöKQðj7™¢z°ì–£àÔo3DõcL²ÐìY!‰›¢¹j> Fó4OV’Ôqýæhž¬iˆ:ƒe¡Ø²C, ‘Õªí^Ð¥ÔiÔ90¦WaGÊèÑ4¸ÚßBT“ýA‘™ $º“´º% "Ó?M nº§©Ì<µ«”¾œš–ƒ>„¤ºz†^Ãmv/úÇOÿyliîôE¹ôjÿÞä õ(ÓU#k®^R,›±=’Ô|æhž¬Gdµ£yš'«qFËC±dŠâfë²ZŽ?£Q¼ÍՈ얣àÔo3DõcOÔ Ãe¡Ø²C7=’Ô|æhž¬;%¨ø5ÌÑ=XÓl´;Hbfè®ZƒQ¼ÍՈ얣àÔo3DõcNBe¡Ø²C7]’Ôqýæhž¬Gdµ£yš'«~¡²ÐìY!‰––îÔÛA­ÍT„–MJ³Û"/ÿÀ9—® ³-—¡RZq 4­ ¢Å%$ˤŒ®;ßtïF{fÏGyÆ]E‡K4­µT“ý/2\‹U¥LØ÷=É[5{‚$¶ê²KóìFQ›n(Ï¥jm&D³ÎxtàsÔQJî $MÙJvKQðj7™¢z°ì–£àÔo3Dõc¹·©V­õL¼§[lÐ$ÐéUáHb[î­²¤’›xZ’jRUÀÐHÁ—F8¹©vµ‰I´Z¨[LÜ«t†jó$H–ûFÛo)ZZdšZR“$§Š–Kâ}à'QC†’"ï©ÃöKQðj7™¢z°ì–£àÔo3Dõc¸¢Pí®ÊöŸZ…Gp×E™ tY’p¤¶ÃòMJWºQ’_ÙéR¸ŸsÞoÓ6[³+¦#sjœ»œo¾mÌäï¡´ê#s)ÔYÕ»4qQãO N¢…íd…ßSì–£àÔo3DõaÙ-GÁ¨Þf‰êÅóqØ»8gi{C´˜´Ž<[rÞUf;íT_7m´Ë†ßvµ'B·˜â“Qp}\-ÅeÑ*ôm–Ôè°Z¢?xH~¦[uÇYimÊC$âwŠR‹$¼™jÇªŽŽÿ¡d‰»êp’Ô|æhž¬;%¨ø5ÌÑ=X¸'X’o ½©2-¯D¦E91ãVÝ»9©y²Q!o2r °µ¤ˆÐM%IÕÕƒå"iE÷<¢ñiÄŸZfå:R\\¹(CÍœ}÷éR‡2-> sžëTêhv,»êqëu©³‡ŸK“%÷Ó,µCе¸µR”“Y332""é •ÊÔ)C™O¥Æ’Êiæ]¡ÅBÛZO J’mdŒŒŒŒ ZA¡Û;wÙlÊ=1 ïG¤Uy¯8´Fq÷t™!Z‰g¤È–F|Hµj,‘ê/Xš{¡§ÛT»Zd*ã˜ÛÅSÍ99$újqn­Ä¶zP³ÊDZ¹<P¡Ø²Bìà;%¨ø5ÌÑ=XË“R¸¢ÓáÔdÑà± n¾I!Êd·#Aé^…XV“àxΤX›iOÙ…Õ_¤9o·Q¶äÄ%Lç[[o:mitå$ˆÕ’É)£ÁàòEÃ>ûBªÁgÜë²æÜ¶©R"=]¦ÜqÉ$¨ÊL„¤ÝF—ˆj>ìÉd¤êèJS܆¢‡(,»êV¯ÕëÑáFšý*œÔYZ¹;Ë¡FJÒxV…XVã Æ?dµ£yš'«E~Û…ZÙöÆX†…@‘^•6 ÇÊžu”¨¥4É8–ÜZ’ƒ<šÔHÒF£>X"Ë¥Z–mkÕM•C·SräÈpë±åIßÇBÏxêM[£B³ÊR„à•ÀÃQC±d…ÙVvKQðj7™¢z°ì–£àÔo3Dõc½¤S­(¾ç”^3­8“ëLܧJK‹—%y³¾ý*Páã&E£GÁNsÝjÔmºÜ£Ûõ[vM*¡E®Û°êçÝS‰Ž·‰Z•(ÍF’4ä²f|Dª¶’"ï©ÌöKQðj7™¢z°ì–£àÔo3DõcLÛ-Å’™¹ì–£àÔo3DõaÙ-GÁ¨Þf‰êƘe¡Ø²C7=’Ô|æhž¬;%¨ø5ÌÑ=XÓl´;HbfèîZƒQ¼ÍÕ‡dµ£yš'«cøl´;Hbfã²ZƒQ¼ÍÕ‡dµ£yš'«` –‡bÉ L±ö ÌvcKäÑcEKÑ-¹ n; iã”ãŠ$ ‰$jZ”£Áq33À²¶«ýoû…j9èœ%ñ_ù‰2>”ìöc} ßñ,yíûö)x}ÿð˜ôØ/ì.Æú¿âXóÛ÷ìRðú%ÿá1ߘ.Ð*PñÌÉþ©Õ~‘‰þÎHé»ã™•ýSªý#ýœ‘ð-Þ¿‡ðÏßÖÿúÿ(ã$t lž×=w]_ÖJçî¨8_ýF וÐEýf¸?uMÂÿê=êX|þÿSIÔíùœlŽƒ¹=c¸z÷º ?÷Orþ계0_¿.‚ÏýÔ]_º´áô•Ñ?—©Žr—C‚•Ò3m[¦E°u>OL§Íçk„ÿ*Þðe %¡iÆ®>’Á`ËŽzöƒt'þÝÿººáôOmè#þµ^ºàp¿ÿ‘éЩ(»¨¿—©ŽwjÍC2ZuÆ„,”¦œ5"<šOI’°}ƒ#ï Ý¡ÝïêýB(³B÷%%’4–’Q’Ô¬’IpÁw%Ã93éÚUÐ_ð®÷ýן”b»´Û ¿áeõû®W? ô)Õ©k`/S„Mô:ÅF¯A«E…O¤M Æn,a¹&›ýZN8²Q'*þóÔz³Ãú•ñ1Ê}J:H£Q:'½· ÉÕ¨ÑÝ­D„™àÍ($‘ãõͨÝÿ oßÝt9ù;›Sº ?÷[´Ýt¹êƸ֫Øó^§ #›¹¯)5«2…k;H¦G‹CÞrGØßoxywQ©Å$õ« >ä°e„é,Ævô•ÚÐì>h¥ò]ΫôÜ£”cN¼ï4|ã1Ž8Õݕͫ]ÿ ¶‡û®·=XÇsk7Agþëö‹û®×=XÕ µ|7šõ9I#CZÚ Úµ >§A¡K“–T¨µXqOµ$d”‘o7Zˆ”xY£Qt‘‘ñ;¦ë‹JÙWkª%ÌÕ~µUÌ) Äuƒj>iiDá‘©ÂÖiN¤‘¤»¥g‡ö½®]_Öý¤z^çª=·®Œÿ\6•鋞¨hJ¾ÍÚ]JÔÄ ,ö½txá´¯L\õB;o]8m+Ó=P鯭á<Ñ]JØú„ ,ö½txá´¯L\õB;o]8m+Ó=PkëxO4,º•¨²ö]ýJ•þºÛÿìê!ÛzèñÃi^˜¹ê†ÉªÅRùµÚ•Rºï‡ùÑJˆÛSîKm<¡ÌÝA)¡ÔîH’®8%+€á¤Ô©:RS†Öé“®T@,¾Û×GŽJôÅÏT#¶õÑã†Ò½1sÕúúÞÍeÔ­@Y]·®6•鋞¨Omë£Ç ¥zbçª }o æ…—R´eöÞº""-Çmë£Ç ¥zbçªÛ×GŽJôÅÏT!Õ¬ÿ´ó^¢Ë©£}ʆÝRh4W(u7‘!ê;ˆxâ¶êK¶Ïy½B¸Ÿs ñÑ‚/J^Ðê4Û†›T‡E¡·šÔ†£Ò‡ÒûJmÝdkÖ³RUÄÔ³>å%ÐDCoÛzèñÃi^˜¹ê„öÞºŸt–ЇÊ8HpÐ’I(Ék^I%< ‹¹.ÉŸIÛzèñÃi^˜¹ê„öÞº¬¸rS"*’Ù$ÉHY¡µ-*%)*R‚RxðÂyžÛ×GŽJôÅÏT#¶õÑã†Ò½1sÕÖUðžhYu+™/½*K²d:·^uf·YåJQžLÌúÌÌy‹/¶õÑã†Ò½1sÕmë£Ç ¥zbçª×ÖðžhYu+^ðeöÞºþºeÝðn£¨îjTâB`îKmEB> m¶E¥("ÉiÆ'œäÇEÛzèñÃi^˜¹êƒ¶õÑã†Ò½1sÕ ªµWö¾kÔYu4Õ  Nv›T…K¢Q(gWNŠ‹ôö'$£V£AïQ!&¢#4¶I#Æ:8] N*E2T¢Q+|Ò“E9ù츧c#V¢Ahq)ZHòd— dYÆ1Àn»o]8m+Ó=PvÞº\S|¤–­NN©&jYÏ ,%’²6£Y\Ùµf)4H•ùì­™U˜ì8™.Ó¥j"5›HR‹$jB|OÛzèñÃi^˜¹êƒ¶õÑã†Ò½1sÕ¶¯…ó^¢Ë© ìÞWk×üÍJ俜y_éùO(ÆyÞhý_qÇjîƒhw¼«Ó™ù]•N戧Fä;þ1Ñú´+zâó§*Áð3Ôy3áÿmë£Ç ¥zbçªÛ×GŽJôÅÏT'[[Ž©æ½E—RµevÞºýN­SvbhW"©,äÉRŸ¦)ãJœ2-D“sIpø)Iu à4Nø¯üÄHúS°_Ø]ô3ıç·ïØ¥áôKÿÂcÓ`¿°»èfÿ‰cÏoß±KÃè—ÿ„Ç~`»@X©@wÇ3'ú§UúF'û9#¦ïŽfOõN«ôŒOörGÀ´zþÃ?_þ/ßTq’:¶O@ÙHèÙ=Ü¢g¨kdtÕÉëI5rzÇ«@Ã3Y+¤kdt˜ÙJéÙ&=Z&9šçÆã1ñ†øô©™¤aº1ën޲֍J›Fµ£Ëi 9s*Ü‘J”¥8xÁÊàœ%II%¾èôšºømÂezèÅw ÇU´˜ÐáÞU¢rD2hCŒ’„¥âm;Ý _tHÞk4‘ñÒd9Wz mÆF#¿Æ?XÈwà˜ÇëãÀâÁˆbˆ$ú„ >¡²ö]ýJ•þºÛÿìê"´^Ë¿©R¿×[ýDdÓ¿ãÏàZZJ‰St‘6 2KjÏ6¢K©Q’ÛAçF]dpÝ9øØlä³tÌ5C§ËIQ*n’&ÁfR mByæÔIu*I-´qÔeÐfG4ûbÜ;.›sUni±•2L'c3KKΥƒÒÈÑ—’KA¥ääÌÐi>JéìÁÇîi¶Â©×¥VÝqM¸Õ\èr™†N&S*€©•%J#lœŽ¥¢ÔiQ—í•cÓë4ú$Ê5^£1]ÝV?ÍÍ ©fIÔ¥(Íü):Ij%«v“JO‰))ŒH0 …Ç—¹.-¦íRžÒô³1ÈÜœÞ".*ÝêV’Îq“É– ÈŒð[Ø6Í ¥O[tË™ÙU¦éÎO\S§)ÈšhÞu²xרÜJ¿üY$Í&D£ÉÍÁÉééÖõª$:Ç]“M*†µBf,’µ¡*4‹Ëˆ$#ZT’Á©FhWsÑž®èµ©•½«Ë£®§–]Gž‰iéLG]n–Ô—¡7h^—©)3#2î8ž#Z;“´mDÒ W¼e¢‘6Cг¤(Cí’ z›ßiÝ’]lõ’Ìû¢îsœx1oI¦3S_©®<ê#Ì–Œ—”„Oe¥§xj#lÉÃiE„ž¢I‘šzØ8ÐÂí+V-*ߨT®ù‘“[…ÊB)â˜Z^q•ï?LE»%4zVYR‹9Bqƒån\š~£E™£”Óå;í”ëmf•cû²F%4Á…Ô OP {Â÷„$„ !$ƒ¨:€†Ãmv/úÇOÿyliîôE¹ôjÿÞä ÆÃmv/úÇOÿyliîôE¹ôjÿÞä •=ô~?Ä‹.œ@‘YRz„ž¡H@’ž¡z„ív*T=¶YOD’ôw]†Ò–ÒÍ&h[ÉBÓ’êRT¤™t‘ð1Åëö;.•KÚ-"¹XŸ$zL”OAIuöÒó­-*Cz™aõuƒ<£”¨µ$ÌŒeÓ“–Q%{§»®âÑâŽ×dT¸Ìí®×­#k)µ'k±ÖêšMP¤K7"q×$fá)I=j"=g¨ðf8Êt:K”'o;ÍÚÍQU“Ñ™j,´´ô‡”8û®<âèß7ý“5ωcCeÀ³-½¢Ó.dß–ä˜4ÊŠfÇ„nT’éî×­¤­în2<'Q“e¨ˆðIÉdS"XmÓåPê·½:‡ËW2 MÈ©µ."”D“-÷6© Ô”¶JËe“BL´ñ!ä¹Ê\’›ME~[;'+¥dº¯Óƒ¹~F¾‘aÒ'Ü rEÔêé´S«S 4ãmN˜dù°¨ÉQ¥IÞ%HxòIV¤´fIÉà³ìªm¹F÷@Ø B^BS‚©tú†•QÉÒ–Ö³l‰Ä–s$„êJ´÷ É–Z²_«;Η5“.‰ÍeK‰ê‡a6N“¤ãO*°é¬–f³I‘ï\-$JÁ'O¢*ö¶n(BµnÚäÅ™gUêÒËÊy$ë¼…:ÏRŒ¸%$I$‘s©^¢”d¥g¸>kuì¸õÜ·ÿU·’Eaq?n¾ë'nÒª´öÉ'½Lú“rÍGÔi40Ö’þã#ýÃs*)žÚµwJ¬ënÖ'ÇŸ—$›Y4˜k5°[³Ü­Hxf­çÒ}Énîkg’Ó»zñ¶©HlÖ§—*EV[¯±‚ÉSÛJRœ“žèò¥pÆz¡XoXô+nEïBS”ú«ó¥InME%!¥¤8ÚtÃÝž˜íaF¥‘³4™(‰;e¤¬4ðÂ{›º´¯kIqøÛ›+n'ÅgXÌÞw]—HràUFŒU'#Ï‘!£eÎF‡]SJh›%gCJNð—ÅDG ˆðY6­ãØ>ǨÕKqUêezMj …̇Sm¶[-ÃR7Í Þ´Dö £V5ofd²Jve6Ãsj·é*í¡.-i¹åÈ[›QBÙ\Æ–ÛªÞ,ÉDDó¦’ÐFFhÉ«IêÓÈ…a¿³X6ÂïzT¡M“1¹å&£¹5¿¸JÈØæÍX&ã ‹ô„zJ32ÂKåV0§^” wO¥{õIÚë‡DËp»FaöŸf®õÖ»&å<ßË÷írN]Îz7ÆóyŸíiþÈ­EÛÎg;vUÙe«Ùvwœ¿UäÜ£Òy?7êÞç»ýf|t〦'2Üy¯ÇfS2ÛiÅ!%’"<ÒKJTD}%©$x>$GÀz~Ï©Rm©©-ËŠ|wݯ._$Rir<@ze 0ï‡|²¶«ýoû…j,­ªÿE{èë[þÅ!ZŒš' |WþbZGÒ‚þÂìo¡›þ%=¿~Å/¢_þ›ý…ØßC7üK{~ýŠ^D¿ü&;óÚÅJ¾9™?Õ:¯Ò1?ÙÉ7|s2ªu_¤b³’> û×ðþûúÿñ~ú£Œ‘Ð5²zÊG@ÖÉèå=C[# Æ®OXÚHè1«“Ö=ZšÉ]#[#¤ÆÊWHÖÈé1êÑ1Ì×>0ߌ7Ç¥LÍ# Ñ»aV<š,&çn›Ra+L—"GD–ååjRU…ºƒlÉ&Iá¨I2g#£Þ±¶ —­]ªÝ}ÙìG[ n™ŽÊ½k&Úi Ôx,¨Ò‚3¡²ö]ýJ•þºÛÿìê"´^Ë¿©R¿×[ýDdÓ¿ãÏàZÛ("K„á¨Ì¹:OŠ ;Ã,÷$jæ»âX_d¶_gÜëË®mìgšuó[;í÷7rZ9FKyÏqíŒJÕoÛÔú<Bª50ñtœˆ-ÿ”6x#a²'{¦É&¼›fk$¯$d’E~0 gW“HEbJhOÎ~›«1×5”´öœ%*RrG’Égœ°ÞÓhnΚ·î;Þ-&¡\3¡Gi³ƒžŽãI$#~”º„ÈÉ&–Ï«%Æ™qOˆ:ȵ;j«@¦SîGªÐߤ¶ãž·ÉæTêÝФ­Äh2[Ž¢5d”E§‡˪Êh*®ëЩŽ[GKܦOºËÇOä8#7KA'ôšû“3-: :…f„[•rEA¡»2ªÜصy2¦š`6¦ÐËéam«|Fµ¤£¤ô™ ŒÖe¨´å[ºÅÏjN¸6‘QDšÚ¹[YÓ’tö²•®[RŒý?rD¦‰²4ëÉ(Õ‚2ÐuÈaWrTmÊ2΄Äʪy¶é-p-¤ºù©’'yúÒD­Þtäµ'iJuvÿ¯W)*–pªSÞ˜ÙJe-¸êf“JT¢îMFY#âDG‚Î Ÿ)z„ ê$Ox@žð€$ uP°Øoí®ÅÿXéÿï-=Ãþˆ·>_ûܸØoí®ÅÿXéÿï-=Ãþˆ·>_ûÜ’§¾Çø‘eÀÓˆ k*OPƒÔ ÀIBÔ OP€NÌit*ÅÅ*Á¤üVéS¦  ËDuëÉF¥´á(š4tdD¬ž'Ëîö¹ _OL‰U‡Jŧ¸•"¤Ô-9 æ™Ðã‹A÷®7ŒKáp$™–]:N:5I'f“òßmÅ£ÅݘRèU‹ŠL;‚=Iø­Ò§LAA–ˆë×3’KiÂ2Q4¤tdD¬ž'‹oYÕúì4TEÞHz\æ"¡×ˆÍ ›ËNñDFYJre’áćs³;Úø¸kU*]oh'©ïЪ8ÍfãÝGunBy¦’{÷I 3uÆð]%ð¸LËHtô]¶}·›W£D‘GŒôI‘ª¢U%׉ô›ªI8F—II3Qnº1Œãž‘Z¤—åæÚ_›ôÚöK"ÖMUqTjà·ž§¯w0çÉjqÖfdHZÞRR•’ˆ’g“Áà¸ÝZ[<©O¾ª6¥q¤Ó&B¥Í˜¶ßšÄl-¸‹yžíÅiR­Ù™‘þ¬Ô¼’HÔ]lz”ÕNæf BÙ©ÆÑJŽtúÛüª™ÆŒl.[RãFÚÒ¤šˆDjL…d¸¢$š+;cœÔ:Êú,Ê{&NÞ4Ó®Òœa ïׂ6ꉤ¬ð Ið!ÊZf‘5R+sP¿tìŸ_7ËõºhaJÇ]¤Ê¢Ï8S€ëº z¡Ob[x?ÿ¨ÊÔŒÿvrCunYÚ‹ê‡Kå^¤G*‹¥Mm*ÂÊ:3ZÏ‚’JCk"Qt †¦ä¢¹BšÔ7ª4¹¯)’qÎo–‰(hÌÌ´ˆÊ¬p¥\s’.Ê«Mjé‘E¯Sî:-:$jd(²ŠUA¶^„¸ì¡¥©,¨ÉÇ5 ÒÝ%y׎œÙZ¼”"Ô•Ÿ;;~–wßË~wERÞj®+"Zv—sÚÖëK‘Q”Á=)öÚKl´ñ¶•¼ê £û$fzK&D]$CQSµkôúÌJCôå92i$á¦3ˆ‰$¥HÚ[f¤¸F¢2ÊLË$eÔ,kÕPª×†Ó­øµª:«ÜIªSåEžK)”¹![½ù+v“Rd!}ÒˆˆÚ4žX”š.Û;jݨՠ½!‚«”™‘^) Â9±S¢Þ7’^íI7LÐj"×Ã'’)iµð.nÜ,îÿïð¾îy–qG#U°nºl8“¦µ&4¹i„˰&11'!E”²fÊ×¥Ã"< ð|€ò¸ì«ŽKER£9ÁSü˜äEœÄ¤!ì·K6–­ ÁéVðà7ôj[ö´úÊ¿iô×®Ä|‘O”ÝA˜©mG‰®“K4joYéA÷FF¿ƒý¬Í¥5Mi¸œÐ Tߪ6³‹oV9T)­%·ÊÑ8²ei5$ŒÒxudHN=#¦UÖÆ7M>i?åòê±yÙ *ÅdÖ9€aßøemWú+ßGZßö) ÔY[UþŠ÷ÑÖ·ýŠBµ4Nø¯üÄ´¥;ý…ØßC7üK{~ýŠ^D¿ü&=6 û ±¾†oø–<öýû¼>‰øLwæ ´Š”|s2¿ªu_¤b³’:nøædÿTê¿HÄÿg$| A÷¯áü3÷õ¿ã~¿Ê5CµÌ¿ÒõÏÝHlÿû‚õ:×2ÿK\ºŠÙÿ÷#G@ÖÉèõ)y/Ÿ©Š¤'Ýò6ORmsÏùÖåýÔ&Ïÿ¹/Ñ-sÏùÒêýÖógÿÝ LŽƒ¹=cÒ£‹•¾ÿSã.¦íû~×WÿÄ®ÿÝm¶ýÐÂzÛµÌÿÒ7Ÿî¶?þìsÒºF¶GIN’Ÿ&²ú™&ŸS§vÖµÏÿâ¿îµ[öÁŠí§kŸþ_}~ëM¿l‹ã ñ¾«Ü²ú™äŽÅËB×?ü¾ýýÖ‹~Ø1ܳmsÏùvÐ?užß¶Ž)шïXÙVïY}N2;‡,«\ÿòÝ¡þë5¿mîY¹çü·h¿ºËoÛGèÅw Æ¨S¯Þ²úœ¥c½]‹k™LÚG¡-ûpñì×ÏôÍ¥zß· õß‚c¬j-#Ä_·êrmt,£°í ÚW¡ ûpŽÀí ÚW¡ ûp­Œ@¶«Hñíú‘uвÎõü3i^„7íÂ;µü3i^„7í¶>¡ªÒ³ÑëT‹Œ¦š~_Pš\‹/°;_Ã6•èC~Ü#°;_Ã6•èC~Ü+PÕi"ý¿Quв»µü3i^„7íÂ{µü3i^„7í´Õi"ý¿Quвûµü3i^„7íÂ;µü3i^„7íµÕi"ý¿Quв»µü3i^„7íÁدá›Jô!¿n¨«Hñíú‹®…—دá›Jô!¿nÀí ÚW¡ ûp­O|5ZGˆ¿oÔ]t,®Àí ÚW¡ ûpvkøfÒ½oÛ…hªÒ’,™™ð"#1ÔÑ­›.§=ºRoÓ‡9ÅhL‰”ÍÕ?WV_ÞšÒœÿiM'xéé ûŸÿŸ¨ºèm»µü3i^„7íÁدá›Jô!¿n}F‹=™G¸Xœë®N—.#ñ×L­„°¢4¬–zÉI}=)N Œ°eƒ? …»pSélU'Ъ‘ HÆæSñCNg‰iY–÷jô~ߨºèvÝÚþ´¯Böàì×ðÍ¥zß·&»pL¤=X‰C©È¦±ì¶¢-l·ŽK"Ò_¼Â—n\5XÍʦPª“˜vG%mØñq {N½ÙHÈ×§ºÓÓŽ=«Òž)Qþ¹¶£ÍñÍòù·”rnY¹Vç}§Vï^4ëÓÇNsŽ"uZGˆ¿oÔ]t;þÀí ÚW¡ ûpžÀí ÚW¡ ûpâZ¶®7ªiÍP*®M¨G)0£¦†ä–LDãiÆVƒ$¨õK}áíÛ‚ŸLb©>…T‰F72Ÿˆâs%’Ò³,ñˆÕé"Ëê.º¿`v¿†m+Іý¸G`v¿†m+Іý¸r%5ÉyÑíéS‚ÝN[q CqÉãmn+JA­-Fœ÷\ &DfX<:%±\”q(”™õ9 N³ju¼²O #<¯Hñíú‹®‡yدá›Jô!¿nدá›Jô!¿nÿ7Ïç.lä2yvóuÉ·JÞëÎ4èÆsž¬dl*VÕMfSÕjµ ¨imr—" ­¥„¸£J f¤–’Q‘‘g¤Ë½#Ä_·ê.º`v¿†m+Іý¸;µü3i^„7íÃ!{'r–Ü«¬ÝÅU’ˆï"›Üq\©+зYeãWÛeKZˆÛÁjIžHpñ豞±fÜIœéI‡S ȧ´iå¥Âs^rFÂÈÓ£­'¨ø‘B…wýÅû~£wC°ì×ðÍ¥zß·ì×ðÍ¥zß·'±Ûƒ™9󘪜՜rîHæã§¬ÆžŸï u»pT©¯Ô©Ô*¤È1òOIb#Ž4Þ8ž¥ï1:½#ÄY}E×C·+×ðÍ¥zß·ì×ðÍ¥zß· ؆ö©lÕ›¬Ë¦Ã·ëÈ‘rgF“ Dür&n¸´‘e ”fJQr¤ç‰†¯Hñíú‹®‡[دá›Jô!¿nدá›Jô!¿n=j]¡“Z¢Ô©…!&¦y\U³¼.úud¸—@Zô‰ÉM¡Ä%Ðdºþ"Ëê.ºEoÚöÅíB¹5m*_4Ô£ÎÜvÚ7»§½¹iéΜgŒôÒAµ ThtÆëÑïºtØL.9· ÖL¶Ô“yÇ Z×%£#ý&1§«¤óƉE¬L“24JLùÂioKm¨ëR£¶ƒÂÖ²"ÊR“2Éž³Äm¡Ø×Bî %¡C©Òœ­JDxk™ Æ’æT”𓍋Q'Yã£$*èVm7Q]y||üÅ×C¦ì×ðÍ¥zß·ì×ðÍ¥zß·fæ·©ÔÚ*½6°õA©5)Ð\Bd‹“îT—dµj%¡ô ‹I‘—tXQëêíÁO¦1TŸBªD#™OÄq 9ž%¥fX?ÜbÚ½#Ä_·ê.º¿`v¿†m+Іý¸;µü3i^„7íÈnÜ [ÕH*¤¸ó¾”ÄGÓxâz–E‚ýæ1ªôÚ¢í:­O—OšÎ7‘å2¦œFH”YJˆŒ²FGþBuzGˆ¿oÔ]t,Àí ÚW¡ ûpŽÀí ÚW¡ ûp­@5ZGˆ¿oÔ]t,²°í ÚW¡ ûpŽÀí ÚW¡ ûp­ˆ@j´~ߨºèY}Úþ´¯BöáÚþ´¯Böá[u V‘â/Ûõ] +°;_Ã6•èC~ÜÚþ´¯BöáZ€j´~ߨºèY}Úþ´¯Böá··)emrŽÇ.í±Q¹Nÿ µy>÷NtêÑ<µcR±žŒŸ|S¦+=´ã†SMyÇêH¾yÖåùÐÛϘœÿò!η/ΆÞ|Äçÿ‘0í«þ¿±Œ¾yÖåùÐÛϘœÿò!η/ΆÞ|Äçÿ‘0ûjÿ¯ìC|ó­Ëó¡·Ÿ19ÿäCn_ ¼ù‰Ïÿ"(`öÕÿ_؆2ùç[—çCo>bsÿȇ:Ü¿:yóŸþDPâýµ×ö!Œ¾yÖåùÐÛϘœÿò#ÆtºÜèO›´¹Ê‹!µ4ó/[ëZB‹ J’u‘‘ð21F/gYÝaýˆc,®Àí ÚW¡ ûpvkøfÒ½oÛ…jN«Hñíú‘uв»µü3i^„7íÁدá›Jô!¿n¨«Hñíú‹®…•دá›Jô!¿nÀí ÚW¡ ûp­@5ZGˆ¿oÔ]t,¾Àí ÚW¡ ûpvkøfÒ½oÛ…hªÒÔ¤4ùUÄJ´V£&ªC(²T–iŠhœSD¥h%’5‘j>åI<ŠàY[UþŠ÷ÑÖ·ýŠBµ „¾+ÿ1>”ìöc} ßñ,yíûö)x}ÿð˜ôØ/ì.Æú¿âXóÛ÷ìRðú%ÿá1ߘ.Ð*PñÌÉþ©Õ~‘‰þÎHé»ã™•ýSªý#ýœ‘ð-Þ¿‡ðÏßÖWÑ¿_ådŽ­“Ð:Çè´Ó/ëm¿öRý@×È¡Ó ¿®42ÿØÌöqïQƒûfJ“_iœŒŽƒ¹=c²~ƒJ<ÿÝ­¿ö3}œk¤[ô“ÏýÜÛÅþ,NöaêQF)É\®‘­‘Òcµ“nQÌøß¶á‹ý˜kß¶¨Ægÿ|d¿öe¥$Ùľ0ߣÖÅÿþbÚåÿG¨û ÄzÖ¡ŸÿÌ‹X¿èõ/d9#4™Å:1ë«¶­ ç*Ô/ú=OÙ3–¥ýó-2ÿ£TýŒl„×Ú8Èâ®ôî´¨9ö—ݪžÆ1œ´müýôm»U=Œl…Eç“8Èá]ø&1úÇpå¡ocö§gýÚ«ìCðû{?µ[;îµ_b£Q[žLäÑÇÙŸo|êÙßuªûŽÃíï[;îµ_bÖÇÏ'èEŽ<ú„Èìû{çVÎû­WØ„vo|êÙßuªûkcç“ô8à—aö÷έ÷Z¯±aö÷έ÷Z¯±¶>y?AcÙvo|êÙßuªûŽÃíï[;îµ_b l|ò~‚DZì>ÞùÕ³¾ëUö!=‡Ûß:¶wÝj¾ÄØùäýŽ4eØ}½ó«g}Ö«ìB;·¾ulïºÕ}ˆ5±óÉú pǰû{çVÎû­W؃°û{çVÎû­W؃[<Ÿ ±Çžøì{·¾ulïºÕ}ˆ;·¾ulïºÕ}ˆ5±óÉú h˰û{çVÎû­W؃°û{çVÎû­W؃[<Ÿ ±Æ€ì{·¾ulïºÕ}ˆOaö÷έ÷Z¯±¶>y?Ac]³Éñ)÷SNNy,G‘T%¼¢<3Ê#¸Á8xã„›„£Ç1­]„jzm1TêjÔº¤£Ó’EIx²—3ÔHÔjàDFf={·¾ulïºÕ}ˆ;·¾ulïºÕ}ˆF±yäÅÝ !A±6Z®Ó$ö>›¾[’^\unœdÓŒ³ŒI—ˆ»æÚËû'õN"¢Ç¹ë3m{š;3 ÉKµ*­ÄÛ°f-D{³lÓ<¡[Í A!])#3JH̸nÃíï[;îµ_bÃíï[;îµ_bļò`²6]mîn+ þk»kp÷±Š›545L‰¾ZVë ¥ð%-iZ7ˆ5«Q¢3áé4ûŽ›±«ÍENªEeêtYê6‚Fí¹„ãn;“JÖÉ( Ö‚?„Y×vo|êÙßuªûvo|êÙßuªûb^y0{í. U‹fÁR…1’“o¨óí)$é&l“NeÝa¥2eÿ%H>ƒ!üÙ´Ê…{gw ú…K)Ó: o-–Û˜…©(.*Ò§›Îñ«#˰û{çVÎû­W؃°û{çVÎû­WØ„ãV¶ü˜±ÚÓ¨µ*=÷±$NжË\vµã(ÞbB–Þ¢á­â5'¥&dG§Jºi2.:ÍÚ™EIM–‡e¾³6*/-µrsiGÁã'¥‘§8$™ð"…*‡m]ë‚>Òl9’)Ò%–¥E¬îÍÄžP£Ñ*=*±œ‘g%’=|ËRÚ~cϵ´Ë"+n8¥¥†£V žI)5ÃR°]¨Ìøq3>"1¯<˜<6%L½°ÙÍEŽëî&µÓKh5!¥kV ©)J”gÔDf|gÓhÕê…€õ¹D§Or³´òªôÖZW)R ¶ÒΦ‹ºQ6´È#áÜšË8ÈÂì>ÞùÕ³¾ëUö!‡Ûß:¶wÝj¾Ä%Í_žLXë ÇùËšNJ{/ìKï7ż圧Vë^YÈÿCŒç=ÇO¬ªRnj&Ä*Pn%ÁOdp^PëY7R÷jî’•a83"΃Ç@Ä¡Ûöý*¦ÔâÚMƒ7w¨‰”ú£­,”“I’’p»Æx2Á‘àÈÈÈŒl+Ñ(bipïÝÑiäñH\x1+FNºI4’Ô§b­fdJQjÁjV ‰ˆÆ¼ò`Þ7m\pýÐ{>åt ¬}ç0n÷°ÜN¾O&ÿ.;½*×ÿœ`qðèu¨ûºÝ‘H¨2ÜKŠœÔ•.2ÒL­¶¦¡iY™w&•:ÒL ÜAq»·¾ulïºÕ}ˆ;·¾ulïºÕ}ˆN5ç“ ûtùÛ—LRåv†YÝÔݸn•È´à™Y”EhFï¸6uËŠx¨jvu­&‹gT’Äøi€O+Š— –Í/ü¡Å(§4´ 3Q÷IÔÚ’]×Á.°û{‡ýõlïºÕ}ˆGaö÷έ÷Z¯± Ý[žLy ¾ꇶfQ‰Wj¤ÅŒ—Bb8N¥I îȱœ“å»ÿÏî~À•Ÿo|êÙßuªûŽÃíï[;îµ_bsO®LXÉ¦Ã«ÌØ…Ã=Q'Hƒà€®Pm©M6f̤ºzº Š£’¿½Mç¥9óÙGù½ÚõԮ䨴—–¿þåüGgÞF鬿æÌyöo|êÙßuªûöjÚ¤µ ømm~ÔDi Jže,ÕÉs¤ÔžEƒ2ÔxÏFO¾מLXØØ1 ×h1&U ·´\©m¬Èè*ˉh¿»~“GøÊ!ëiÓeÜ´ ½vD[¦ä•Qª)Sé´I„ɤÒD´Èx·MDjuÂIèÂt¯º,àhÊÏ·¾ulïºÕ}ˆ;·±ûU³¾ëUö Ƽò`±¤WÑ·g_¤R+$ìåKŒi#ñ™Ñ ²sx„‘:fùèÞ$ˆ”áพ³ÇjÔ—® UÉ­v/R™%J.O:A¦1w ø.jV£àGú=[Ø}½ó«g}Ö«ìCÝ«j’Ô7áµµûQ¤) y”³W$8iΓRy ËQã=>øŒJÜò`ÚÐa”gõªí6Océ»å®KÎGVélš`‘–qƒÉ2ñ|ÛYdñé•uÒg\Õ›½2¹ªu:b˜òòÅEå¶¢Žm/ཇ¥–œà’gÀˆh;·¾ulïºÕ}ˆGaö÷έ÷Z¯± Ƽò`ÞÏ¥]5iÝfÒL£¥A¦Äm©l,ÉŠsÈm% Ý_C&o«=XÉ(‰ç6Åû]¼¾žþð±ÕÑÙ¶iô豺öW=è†g\šmhIš]ÖˆÉC¸3á¼Jø`ºˆhª6Õ¡P‘>nÖíåIuO<â£Urµ¨ÌÔ£ÿ"é330SWç“8`—aö÷έ÷Z¯±ì>ÞùÕ³¾ëUö!ml|ò~‚ÇBdV}½ó«g}Ö«ìB;·¾ulïºÕ}ˆ5±óÉú PÙvocö«g}Ö«ìB;·¾ulïºÕ}ˆ5±óÉú pǰû{çVÎû­W؃°û{çVÎû­W؃[<Ÿ ±Çì»·¾ulïºÕ}ˆ;·¾ulïºÕ}ˆ5±óÉú hǰû{çVÎû­W؃°û{çVÎû­W؃[<Ÿ ±Çì»·¾ulïºÕ}ˆGaö÷έ÷Z¯±¶>y?AcŽÙvo|êÙßuªûŽÃíï[;îµ_b l|ò~‚Ç v]‡Ûß:¶wÝj¾Ä#°û{çVÎû­W؃[<Ÿ ±Çì{·¾ulïºÕ}ˆ;·¾ulïºÕ}ˆ5±óÉú pǰû{çVÎû­W؃°û{çVÎû­W؃[<Ÿ ±Çì{·¾ulïºÕ}ˆ;·¾ulïºÕ}ˆ5±óÉú pǰû{çVÎû­W؃°û{çVÎû­W؃[<Ÿ ±Çì»·¾ulïºÕ}ˆ;·¾ulïºÕ}ˆ5±óÉú hǰû{çVÎû­W؃°û{çVÎû­W؃[<Ÿ ±Ç˜wÇbv}½ó«g}Ö«ìAØ}½ó«g}Ö«ìA­žOÐXã@v=‡Ûß:¶wÝj¾Ä‡Ûß:¶wÝj¾ÄØùäýÎÕ¢½ôu­ÿb­E‰´¹ÔÙñê+¤Ô™©DŽÝ¿¥2ÛˆmÕǦ)— $âR½:ÛQ¤‘™p+±ÃDÜ¥ñ_ù‰2>”ìöc} ßñ,yíûö)x}ÿð˜ôØ/ì.Æú¿âXóÛ÷ìRðú%ÿá1ߘ.Ð*PñÌÉþ©Õ~‘‰þÎHé»ã™“ýSªý#ýœ‘ð-Þ¿‡ðÏß×ÿ‹÷Õ}šìÌïJ õN}T Ô¥GÝòcs8JœëOünŒu˜öŸøZçÜÖï¹£ú‰7é7?Ù4-öÍÙÚ£éG‚þ•Óà~"­jŠmb|J<ýÏé?ø\÷ÝëGð~ç¶ÏþÉýÑÜõÂóßý»Dð£ûW¡Ï[S¹”QûÚ>›Â_îeß\?“÷:0ðÆo“{׋Üì/‡‘Éõ(c÷8Ç?øc?ì½ëÇò~æøÇÿ ª?ÿŸ×‹ììZ7‡ÖK©AŸ¹¶)ÿÃ*ŸÚ‘íù?s\Cÿ†uO·#Úüv=ÃY"1Ë©@¹¦ÿÃ:¯”“íÜÏÿá¥_ËJöúìš?bÉ Rê~}?s,ÿ†•/+ÚD{ØàxëYûÄ¿i ÀNËC±dˆÄÏÏžö8:Ö~ñ/ÚCÞÇÇZÏÞ%ûHý²ÐìY!‰ŸŸ=ìp{ØàxëYûÄ¿i{k?x—í#ôËC±d†&~|÷±ÀñÖ³÷‰~Òö8:Ö~ñ/ÚGè0 –‡bÉ Lüùïcã­gïý¤=ìp{ØàxëYûÄ¿i{k?x—í#ôËC±d†&~|÷±ÀñÖ³÷‰~Òö8:Ö~ñ/ÚGè0 –‡bÉ Lüùïcã­gïý¤=ìp{ØàxëYûÄ¿i{k?x—í#ôËC±d†&~|÷±ÀñÖ³÷‰~Òö8:Ö~ñ/ÚGè0 –‡bÉ Lüùïcã­gïý¤P^ëë*FÉ‘k·DºkŽ»STÃ}g9òN–ÉISŠÁåÅäóÇ%Ç ñwÿ©‡ëì?ýãÿÊ(l´;Hbgå"ºîŸk?~wó ­]ùY§U'À¸§)ŠTr‘0Þ­“*CfzIIKŽ—ÝS„ž¥ ºT’>D‡k³)ÍRoeբ˗¨(Þ3JXq_çXÂÔ…‘qÁñIäˆË†rPôj)~E’f=]ùY§Õ'À¸§*=*9I˜oVÉ•!³=$¤¥Ç Kî)ÂÏR]*I«²»§ÆZÏßüì¢Éµ³o”Шµ¸2JˆÉ©Éµf¥ ÑÎP²D”GlÈóŽ: Ër_Ìú‹6Ôº5»G¨Ä‘O…&W)€‡žš·ÚC‹J]2Þ7¤Öm–íIÆŒôäÅvz=‹$.úœ·ewOŒµŸ¿;ù†TÕë6,ù1kõ—§Ç)2•Î -Ûfê%`ÕÇ»u‚ÉñÏA—sOG I«R ¹BjL{Š\6eÜÎQ¡£BRÊ6Ö––œš”}ÁáÔ¢Ág R•A›µDD¢Ó©†ÔC2§ÊˆÄäÄ4Õ# ™Ë¨Q(’KQtaF”¨Ë)I“g£Ê $MÙÄöWtãúËYûó¿˜GewOŒµŸ¿;ù‡©Ç[:µ>â Óf”¢ÈžeOa$e»K (%rDjG<ซqQµëRlvdÓè³Tå6=ã¨7&4GÔ©;“#s[yZMí‰%À„½‚þ…’"ì­{+º|e¬ýùßÌ6 ©_+·¸SpÕNjZ!¸²«­­ ZHÛ׬ˆÒ…áZtž•rFCe ‹Vß¶dA£Qê.ÕXvTÅO€Ü­zd¸É0dz’Ñ+(Ò¯Òtôc§±iôš¤[¬§·ÚˆÍ×O}ªl³%iY"¡»…—PiÎLju:H‰F¢áƒ‡£Ñ_вDÝõ+rºîŸk?~wó ½>þ¸&®"·Y’ú7TŽrR0’2#<©d]*!ƒ}T'Tn‰®Thð(ÒqM* 8 ÄD}*>ãBY2èʲ£Ç1c{Žÿmô¿üæÞXÙhö,‘f—±í°xUgÏ õƒž¸*wåªí*±Y®D˜ÒPµ´¹î’V„­’Q‘‘¥I2>ñúà>d{´?ð–»?èîl Ùhv,»+~ÊîŸk?~wó ܳE›´«ª]³qVK:7Orù£îY÷)q9΂.'ÀPcô·ÿ§ßíMïý_öCe¡Ø²C/ÿ{k?x—í!ïcã­gïý¤XûVKCmMŸX¹Q5ärj]6‘Tv*äI%³Nµqân›JS¨Èˆ”g^mæô›E°SgÕ¯h”;š=¨íV|Æj †ü©(aie¨ÜR£7$¡J2Gö[4™~ƒe¡Ø²C1gû›¨Ð È:þ©Å‰¥<ûïL’†ÚBK*Z”rp”‘™™ð"!íïcã­gïý¤Y[g—~À¯IÐd³*$›Z{Ì>Ë„¶ÝB¢¬Ò´¨¸)&FFF\ ŒkjwÕhËÙsTiì¦Û¨WYE1‡Y[\ŒÙÞ0£Z×¼ÎýY> å¸;RìãäZϤÕ\0n›ºâ‚õÏR¦·Jæ›[O-bCn*D¼0‰nÖK$·†ÜI')^¥—26„í:ãn‰RˆÑºšË±dºÖR˜ñM-žLøš¥EAŸFT³á§Ù¨ö,»=Ѳý—®cÓMª*KM¡×+¦ kBj$¨Ó¿ÉšD}zUÞ1íÚ—g"Ö}&¨úáÇF½'Âz½yH‚‡%J·¨‹ŒÃM8¢Ó"|ô1”'RÔd—5HÌÌ•‚,‘ ÌòàM°äªq¿&3Иƒ-ê<Ê\wÜ”ñ2”›r;¿Ñ¬ÈÖiQ‘¥Iè>Ù¨ö,»6IÙ~Ë×1Èi¦Õ%¦Ð댕ÓP5¡ 5TißäˆÍ ">½*ïöíK³‘k>“T}pæUX¹(Û*¦t™ÕB¦P¢D\v–à Só&4ÚœB–µ$’·{¢%RœðÎ 2©{]ÚîxÕÆ©U©‘)ŽC]>#èÞ¹2C̶‰N/ RÜ£RŒˆÌ²j"&ÍG±d…ÙºíK³‘k>“T}pÔ^;:ÙíÚ™SbVuÖRD„®æ¨éÔ¥HÏñ"3Î8gÉtÖÎn:ÅnEN%Z+ÆQ •³4è²é­¾NkÊ ©=Ö¤8™(ÈÉiè<ÊÚ§õ¥ÿ²ÿj€Ù¨ö,»? íq×d"Sﺷ]r®µ­j5)J:1™™ô™ŸX¬E•µ_è¯}kؤ+Q] YKôÿÌD¥;ý…ØßC7üK{~ýŠ^D¿ü&=6 û ±¾†oø–<öýû¼>‰øLhæ ´Š”|s2ªu_¤b³’:nøædÿTê¿HÄÿg$| A÷¯áü3÷õÿâýõE³îjZSbÍ%)$|æçIÿý&…¡¼oãõÆÌÜ5øQ r§„gCLËZœžOG‚âf¼cH¼.Ò.Mp¿éîþaõ ýQISŒuorKŠ?7WÙ3ro?ioøÄýa¼oãõïޗ‰gex¿÷‹¿˜kd_©g…À_áR{ó °ÿQS—ô33öl—õ½7üb~°Þ7ñ‰úÇÏ©7åòGÂó¸Ëü*~a€þÐ/Ò3Åír—þõó 0öÌ%ý,äô).gÑM㟬7üb~±óqí¢mº/›œ¿÷³ÿ˜b=´m¡Eùt—þ÷óöŒ_ôœÞŒ×3évñ¿ŒOÖÆþ1?XùŽîÒvŠ]õÕ牜c9´½£–q´ ¯Ï?8ì´´ùtZæ}AÞ7ñ‰úÃx߯'ë-ÚvÒK£hWožd~qŒæÔ6–DxÚ%Ý穜uU“äQÂÇÕM㟬7üb~±ò‰Í©m8‹†Ñ®ÿ=Éü㶦ÓóûG¼|÷'óީܩõ—x߯'ë 㟬|š=ªm?çñóܟε6ŸóxùîOçAõ—x߯'ë 㟬|š=ªm?çñóܟε6ŸóxùîOç}eÞ7ñ‰úÃx߯'ë&»jm?çñóܟε6ŸóxùîOç}eÞ7ñ‰úÃx߯'ë&»jm?çñóܟε6ŸóxùîOç}eÞ7ñ‰úÃx߯'ë&»jm?çñóܟε6ŸóxùîOç}eÞ7ñ‰úÃx߯'ë&»jm?çñóܟε6ŸóxùîOç}eÞ7ñ‰úÃx߯'ë&»jm?çñóܟε6ŸóxùîOç}eÞ7ñ‰úÃx߯'ë&»jm?çñóܟε6ŸóxùîOç}eÞ7ñ‰úÃx߯'ë&»jm?çñóܟε6ŸóxùîOç}eÞ7ñ‰úÃx߯'ë&»jm?çñóܟε6ŸóxùîOç}eÞ7ñ‰úÃx߯'ë&»jm?çñóܟε6ŸóxùîOç}eÞ7ñ‰úÃx߯'ë&»jm?çñóܟε6ŸóxùîOç}eÞ7ñ‰úÃx߯'ë&»jm?çñóܟε6ŸóxùîOç}eÞ7ñ‰úÃx߯'ë&»jm?çñóܟε6ŸóxùîOç}eÞ7ñ‰úÃx߯'ë&»jm?çñóܟε6ŸóxùîOç}eÞ7ñ‰úÃx߯'ë&»jm?çñóܟε6ŸóxùîOç}eÞ7ñ‰úÃx߯'ë&»jm?´{ÇÏr8vÔÚÎ=ãç¹?œõ—x߯'ë 㟬|ší©´ÿœ{ÇÏr8vÔÚÎ=ãç¹?œõ—x߯'ë 㟬|ší©´þ÷Ǽ|÷'ó‡mM§üãÞ>{“ùÀYwüb~°Þ7ñ‰úÇÉ¢Ú¦Óþqï=ÉüáÛSiÿ8÷žäþpÖ]㟬~0ÿõ/27ì3##/óGøEš{jm?çñóÜŸÎ4×-Õt\ÜŸ²K’±ZäÚ·á9É­XÕ§ZNt§8éÁw€‚Z%ÃS£Sª *"cÕc”y„ô&^RÛ#ÔIJœA©Ñ%YA‘êJ¥)2Õu6”K†©F§Õ @TDǪÇ(Ó èL¼¥¶G¨’•8ƒR;¢J²ƒ#Ô”JRe›I½®ZU=˜P§4–ãä£8äF]z6LÌ÷.­ã\LϸRx™ŸHç@E: åpÑ)ë§Á–¢)ó’MJ†Ì”¡ã"#qê¡x"-IÁð.<5&ä¬Ó*²ªqå!É3¤Ê9L7% J%¨œC©RW•+º#âD}$5"ȵº¤úÕMÚ•Iýü§t’”HJ‰)$¥$”‘RI"""""""!ÒGÚ]âäò'Á[æÒ˜uçiQ\vCjA¡HyjlÔòM&ddᨿyãú„Y0o­ë¾à Å(ÔÙl¥¤¸n´ODeóaÃÁÚ7£iG‚à\xó‹tVcPåÑPìG!Ì–‰’ ø,<ã#à¨ÜZ |2¢Æ¬ak,ajΔÈ›²æ«Ý3ÛZr#²i-Ø‚Äl¡%„‘“HI+DEœàˆ‹ †~Ìoj–Ïî¶nJL8%2œ!¹©qM䔕°…¤òJJO§8‘Ž`„ µúWߟµ?‘mºÉöGí:óªmø¨]õ–!ÇŸ?u½n"–‹vÒ-$¥(úYÉŸÿ€æú„ô·ÿ§á‘mIó3".ç§þbHüÒ6¶åËqÛOºý¹_ªÑy$‡Wc‘Ô´‘ä‰Fƒ,–zŒõ^æ±-kŠábà¨Qº£N#R ×&BRZ5j4á‡P\O‰ž2x,ô6Ó¨´‰ö¬‹bq9.—& >ÛòÜ[޲¤JtÕ¼R&yY«Qç9Ïò»¶¦Óþqï=ÉüáÛSiÿ8÷žäþpÕŠõ>™\¡Ï¢ULˆÎE”ÖðÓ¼iÄšVœ¤ÈË)3,‘‘÷‡œúE}Qš”ÈÌ¿%˜oÂB–£4îSJuœéQ(Ùo¤Œûœ2yùWÛSiÿ8÷žäþpí©´ÿœ{ÇÏr8éí ó¨ÌÌj;x‰‘yÅ2c²¿Éø–á;å«C\Oôi¸`ÇÙ}†Ê%¤éò_å”·é*UZSê8ohÞ0JqÓ4 ô'“-¥]6Õ åKUåZ£’É·"Tˆá%XÔ“[+B'¥9I™‘à²\Λ6¦#DŠÒa–ðIm´‘%)"ê"""(»jm?çñóܟε6ŸóxùîOç}eÞ7ñ‰úÃx߯'ë&»jm?çñóܟε6ŸóxùîOç}¸®'­Ia«jä––ÔIßG§(ÛY‘t™™d³’ÏAõd°c—½*u Õ³.™Ò¹ÐóÚ4©Êr‰%…¥GœŸAw‡àîÚ›OùǼ|÷'ó‡mM§üãÞ>{“ùÅp“ráÚÿÿ¸/õއþÎ ýQ¯PÙ¨IeêÍ9·ê’´*RÒdfFFYàcæË‚½2àMÃ2·R‘YKºšƒ²–¹$´`­áž­IÒœrX,tnÊ®ë}só jâçÒh“íµ)µ*Ô´Ëœhå䙯Bt¤¸«DYàX,™ŸI™ž¦}7g“P´»> jTÅÍ'cՔèydDµ!m¸JF¢.$“"<™™™ý•\þ1Ö>úçæÊ®ë}sóÂ.}• g’£È"M!ÆäBÂ9åú–µ2Iîû•!N¬Éi²dyàXõu«Ú]f˜íFœäZÚM5®¥•>FÂ#žTkÔFm6„䌆zLÌþsvUsøÇXû럘;*¹üc¬}õÏÌEÏ¢5ŠvÎêõntŸ6œäƒÝïI5CCOè<£zÒVHwIôkJ°?º¬Õ«?>EçjðÓ rŽqºÊuiOw&ZºN£rXù×ÙUÏãcï®~`ìªçñޱ÷×?0a>>Ý‚ÿ+'¥ÑœLÈLÀ} ˜“J˜hÜ6ѧV Iºá‘–OÆ4Z~Ï£Ó'SŽ¥Tyè&äòÚÂå-iNt§[®)DIÉ™`Ï%ƒ;»*¹üc¬}õÏÌ•\þ1Ö>úçæ "çÐTÐö{›ZfÊ[Ò*ÑPÄ•Ô*îIßîõ›[Å-Ã_rn2Q0}Êq«²(Vì7.ëóèU¦XŒìDÖœžFÛ;ÃJ–ûøqk3u]E¤’‚.ŒÁçu\þ1Ö>úçæÊ®ë}sósèݽØ]~túÜc[úIÇ%V)Ås¥:ÝqJ$–£Áà²|ÒkTyvTøñjÐy{½-·! QáÄ™àˆóÐCç‡eW?Œu¾¹ùƒ²«ŸÆ:Çß\üÁ„\ì¶«ýoû…j,­ªÿE{èë[þÅ!ZŒÚ' |WþbL¥;ý…ØßC7üK{~ýŠ^D¿ü&=6 û ±¾†oø–<öýû¼>‰øLwæ ´Š”|s2ªu_¤b³’:nøäæÊaýF—‡Ý›Ô'Å(Cä£ÏGZ~¿ñнëø úTÞe×Ðä¤t lž×=X¦c«CýîÌõÃêÅ'm[÷»;×~’KŸùô0Ô«ÿVq²: jäõŽáêÅŽm[k÷»PõÃúÅŽm[W÷»RõÃÒ£$¿þ3çäÎ WHÖÈé1`?X·úí[C÷»TÿèðÂz±ng«f~÷jÞ¸ztª%ÉäÌ“—‘]¾0ß#µ‹k®Õ²?{µ\1]¬[v­‹ûݬúá¾×G“3ɕˣÞ±d9Xµzí[ ÷»[õÃÊÅ©Ç6®Ïÿ{µÏ\6CH]¯&q‘Z:1]è1f¹X´¼UÙçïv»ë†;•‹CýÊìë÷»^õÃT4¥Û,™ÊH«Ýø&1úÅ ºÅê®Íÿ{µÿ\¡Ë:Å›â®Í|­Áë„sÅ›â®Í|­Áëƒk]’ÉŒ%jËç‹7Å]šù[ƒ×¡O¨@ ïˆ!=ð ïˆßéeVѳô^Æ–y±Ry>’QïH¸‘8iÆ4’¤ç?Œ°4Úmél²ô†ã6ã‰JÞp”ilŒðj2IŒ‹§÷ˆÅÙE»ö{ÎuëjT©Q­ù””ÓÑ5É:‰¢-ËÇLbq.j3YêVÍ|O†tP§ ß·O‰åûKJÒ((ºræì¯øSWKÏ}Õ®÷p)úE¹Wi×i4jA¶Z¨±Vé#üM$xýãzVY»³ˆ·\9rŸ˜ík™×MäxQ:mšÈТYšòZKHòf]Dg½çj ëß·St5F“@¨Iu×Ñõ"rV²RkJ3­$X"p‘Àˉ²Ï¿,øÖÙª·:BT«ÁÊñ§0þõ¦\Iµ½ËMn·ÉÎó”ã8"VºÓ£I»J\ºýðù˜´¿hi±Ž*tÞépIÝ­öÞÕ­%¾êØx2§U•y'^«J¾[µ¥µæœ÷rµc >瞤à¿å|`F¡Ö¤Õ—IG¨=QlÌ—¸ËSÉ2éʵ?ÀZ.T­*M§´J}2þn¢õuQ]§¸ìye!{§TâÒê¬kQ+IpgÄô‘ðØ^·•¡V¹¯ö ×˜n=Ï$©rgÉ1ÔÎ’q§»ÖZôt¥*,gŽHG§kâù¯?E˜‡µ4·&µM®O —fû>˜¥»‹ÀÊ›±{˜¢L”ví_“ÂQ¢S¼‰Í )$J2Yã 2##<ã˜6ÍmçV·èµ”DŒÛr&¼Ì¸qã¨Dé‘à°i%(ŒÔ’Øw$8\–T†%¥–”É%+iÒlñ´ç(É|çŠF¢]ñDªÀ¸è’ê”ØOT(ðaG©E‡)1ÓÉÝ5j5šßQ)”šÍ$g§Šxdí:q;Kuß?¿þg-ÚZ~ª*¥|1»iñj8’äܯ'øwqÝÇ_v$‹~µD¦RÝWv¯Kf¢Ë\„Ú};Ã^6Ò¥÷DHãƒï÷²5'f^l¤íJéî©–K›Ýý#‰%žçŠˆ³2.%¥]ãú®ër]ÍKä—j+vÆr„ì–aÈSÐä% RŸRtdÓFfFDJ3Á`Ϩý6‘FØ»“ë¬Jt¹rÞ˜¶žÒm"Kk#J4o0dƒJr’Ï à²eihô›m=ß4¿“/jéŒ!8~'~1w†o‚Kµ+qw¹Sv#ví°vÅoz鬛G wRÍ…‘ž:O§½Ö1)T:ÕZC±étŠ„÷™,ºÜhËqHÿÎ$‘™~ñuöukœƒhî¶ôžÐʺnî$éäÙ/«Îu#F>Åë¾Ñv=ÙHLÊC¼¶åUf¹NDwZQ”ãCÉZ úÈÓXÏ ½—)üÑÚÕÓZx¨>\Ÿ[sµþ¿?…WO¶nJ„w$À·êÒØiíÃŽ1 Å¥ð-dX%wIáÓÄ»ãiiX=Ë*³=æäQâ.L¦žeÂ^¤ô2DI3Þ«Ž”3¤ûù“yQªöÒž~à§Åª\ „¨± K)uQÏS†DD²I/&IÔ¼™äÔH#õ›ÎБµËÖªÅy“¥ÜvÛ´øòŠ3ä–^[M#'w¯¥³<¤”XQu䈨QVn_5çè³ö–Ÿ%(Æ“N×O Ÿ(;r¿æ’_ü_À©)öÅËP•&, z­.DG ¹-1 Å­•‘™VDYI‘‘–¼5²£¿K±e0ëZ›u§iZGƒJˆø‘‘– Œ[Û9¯Ú4:#öõb¿FªÑ©¥÷˜“O–ÛÜløî6“ÁçZH— û‚>çQ‘U—˜ó.”¸ŽÊz;òÝq§%,ÖòÐ¥™‘­GÒ£#,ŸYäp©N1‚iï=K­Z¼á85k;5|ÿÅ·uf¼Ò$@‘ êbz„ !H@z„ ê````D  0ï‡|éNÁav7ÐÍÿÇžß¿b—‡Ñ/ÿ M‚þÂìo¡›þ%=¿~Å/¢_þù–.Ð*PñÁU\±Þ÷ÇUýrÇóþ‹ïôhû¤hät lž²‘Ð5²z¿DÁPÖÈè1«“Ö6’: jäõV†f²WHÖÈé1²•Ò5²:Lz´Ls5ÏŒ7Æcã ñéS3HÃtb;Ö2Ý]éN¤EÙŸT‡I}O•r© uÕ÷e„©f’ÕJÁt‘cÀzT)9ÆROò«üÒþO?IÒcFtàÓxÝ—6rß¿¢}JùÑŠïA‹.ÔÙŒúý™SSÓ›EUõ³ãS•%¶ô«I­õ’‹tY,á]xÁæfÌ#GDuÚì¬Ï˜üIÆšzMõ°JßjV÷*Ӥ̸PF®D“ôièuœT°îý<½O:§¶´ÍÓsÞ›\{òòyXªÝø&1úŧml¦E~•¥eLâUe»žã4•<”¥ ÐNÉ4¯ $Ïû׌+¤‹#ƹHDƒ:™Ôè-Õé׊髒ˆÍ¥í Ž¥)µ8DJYk3>èÏ ‹ ˆ‹T4i¨ÞJÊ×8ËÚú;¨©Ówx”_+^ëšäÕ™Ygl®…G«lúï¨Ê R'Ôé+†¨nÔ*Ek8hZV¢y´`‰9NLQã'À‡•*Ò¥]µJÄBæû^Mй獵P‡'BJQ;¾Y ô¸Òp“p²•îD­ME®_Ó—µ¨Âu!$Öf÷sIÞɹ[ñ.\JÜú„âŸfQ*4ênÍ%tJT&_¨>ªf—Úy×TÚK[Í+3ÒJÕ¬‹ ï‘ÚÄÙ[ ¨Ô£É¸ÔË [¥qB˜:Ó&&2z‹xFÚòdX-]|xKG¨ø/š-?kh°º”š·Òòòã½;q³¿²gÎÙK Æ”ä;”ä:›l®HÍ®ï{’Yë= âx"ÔGŽ’¬GP̦žv;r[miR™pÔHpˆòiQ¤ÉX>ƒÁ‘÷Œ…'JTßâ;hÚm)7EÞÞM›@-ëŠÔ¶£ÞK†Fg°¹´ƒ©¹O¼d”¶œ:ѯ^­æðÐ’ÁãRÐX2ÎuÖžÌUyÅ*–ºœISÐûÈe4WŽŸÒ¥šY9JYŸ¤°xWÂ"336Z˜°­ïïÔȽµ£*j¬ïõkƒßtí{5g~K®ò²dµ˜ÿ¹îù±c2óWiC\æ!6rJ9Æ7]ɹ…(̉Jê"É6ÖÏ›nö¼žŸQ‡O¥[ÍD\§iÔÍ¥<„hmƒsffy3_Iõà6iZëËü7ü½­ETpžë6¹»ÙÆ;¬¹¹-ÜJ˜ÿ.Ù£Õv»bÓ¢5HŽuU™ZŠŠÚ¢Ê|Ðò”ãŒ!M‘e)3#,àÉŒq.5»j+`§sÉ\æë<ú¸dóqõ‘â9­,àÝ$è> 74ê#3-&E“´´Y+ïëò·©Î—¶¨ÍFñwxy7ùœ’ý? ô+°dÍ›PÙ§Rk Ý© t‰ç-4„a’gm(¹GÃÔdŒg”ž'“2¬Ç”¥Oóôm2Ž”›¤ïo&¹µÍ-÷Lžø‚ßÍD ïˆß@z„ ê*™PŸKœÔêdÙ0eµÛñÝSn#$dxRLŒ²FeþbjÕ:•ZY̪Ô%Ï’dI7¤¼§Vd]©Ff-·rlɆéT”C»[¤s²VÓ¶Ü—Øu:µ+KI_rE•àˆ¸J…‡HcdôäC¦6ýÛ.àb‘"C¯¸DËŽ´OiI(FHBI>:úðe«f©‡sÝký>'ˆý¯¢ªŸŠ-MKuç{þ_?•Ê€„ J¹±Ê=—Ünl´¦%Eˆž¨SWÒ¹»'YpÔ{Ö‰XʰžGŒÉ©ìd¡\ÔëuÊìÈÓfÎä͹6•¹Žê RiÔº²_¥$ƒÒ£5§q²Vèu^Ýк©×“ä®ùtiü VÙ´ZmÍL¡È¨\ ?(¤)öÜ·Ôo¶M£-©´6êÒñ8¬¤*-8ʰCÚVÈj½ÚÔ¸²d!ûsÎ0Uøûž.ï5+OtXQ䌅vj½>þÙ÷ɹîiµ¹ðW¿.‰¿†þ ¡P°‹g”ɶ‹5êÇ&zå×[¢CŽå4™ÖúÈ”JZ·ªÐœ™`”8Ééô½¶UP·(5Jª^¨:Ý&J#Ë9TÅÅmÍj4“Œ,Ô{Ôj",á=)<`ÁèÕ-{n%{_CsPÇfݬÓ[÷.k«KâW8‘"ˆOPƒÔ ÀIBÔ OP€ H€I‡| ;àJv û ±¾†oø–<öýû¼>‰øLzlöc} ßñ,yíûö)x}ÿð˜ç̱v€±R€ïŽ «úåŽ÷¾8*¯ë–?Ÿô_xÏ£GÝ#G# kdô ”Ž­“Ð=ú& †¶GA\ž±´‘ÐcW'¬z´ 35’ºF¶GI”®‘­‘ÒcÕ¢c™®|a¾3oJ™šF£ “z‹~•C›lQ&D¥!i¼T¤¨Ã%8£4<œš”YïQpû£Þ±èÑ©(_3“£S¯…Í~]ë{Vv·/&×êt•ö}E·W¤R*m׿°‰ »ˆÎ<½n48“4š¸éV¢Ø—Ín «X·D2‡Txßp÷:TÊŒ°½Ñ$É(%'¹2ÇÁàX'Gœ˜²›ˆÔ·#<ˆï)IiÕ Éq¨’}e¨³ŽŒ—|o…z­Þæ)h,R†k¦—+­û—ÍÛ3i𒎇>“K«Ã„ê݆™¨s1Ô³#Y$ÛZrFdFiVK=CÊUë.EŒí ºE%1¨Dßm·éH>ˆ‰dÙŽãI#IV{¡Ï»ðLcõ1«;ZþEe¡Pr¾wçÇ®{ßWÄé(7|š=Ÿ[¶Z¥SdF­håO=¾Þ–ìòÞ“K„’Ò¬¨»“Éž¨°B,k¾M¥Î¼š•MŸÎ—G,ßpa ݸŒjÁdø™i,qΤ©SUAr¸–Ú8-ÊLE¬žF´¸¤©i#Fu‘!XV4ž“,䌆¶²q³éÀ«ÑtzŠqµñ?Å¿š·ð—éc{kÜóhêÛm>¤ÒZ›RTm7IüRèvlmj°ÍÍE¸‘@ s…ŸÍðÕ»|’McIe$é™–EÐ]Ùä Ó¨¥_R©ô)4"¡ÑdÓ¨I˜ÒZqÄFN‚4eÎé$ž\ÖGŽ9â9Ê]:¡U˜˜tÈ2§IQ¥˜ì©Å™N’3Ûtš«•S¤·Lšº(ÐqRÂâQt–Œg?¸5Õ^û“°hP¼l·%Ï’m®|›y³¯¨\ÍÓ¶R›6[MI©ÒZ˜òJ:ÛT^àÆj,oI&F“2=àjÁpc*§OŸK˜¨u82aIG3!¥6²ÿ¨ˆÇ«ÔZ˦êÏRg·NtðܵÆY2³ïÌ´ŸÖ)9JozàvÑéÑ¡Âÿ;½÷ooád`žøÛVm‹–‹2«6õ^›k&Òì¸N4ƒQ‘™$DEœž?¸Æ.PªÌL:dS¤¨ŒÒÌvTâÌ‹§ IЏÉ;4wjrŽ5$×[î1@lâ[õé•'i‘(•)™Îö3QV§QøÈ"É~òµ3©²×£D9(øl¾Ñ¶´ÿŠLˆÈC‹Jö%U„¥…5sÊu»œÝFm¥¸ÝÈz*ÐÒóÑ…`Âm»žÝFm¥¸ÝÈz*ÐÒóÑ…`Äá—Bªµ7kIoÝÇ™®ïˆß´zEZ°ú˜¤RæÔJu)¸¬)ÕwÌ’Fx“{‘yJ0X¤ìŒ°éYµ3¦C¦M“9&dqšaKtŒºKAx€þãÑk2*ª¤Ç¤Ïz¢“2TDFZž#.’4jáþ…ô*êÁq’ëúu5à3[¤Õ\ª%ºdÕÔ FƒŠ–o‹¤´c9ýÃø©ÓçÒæ*N ˜RQÅLÈiM¬¿Å*"0ÂírUH7d÷ñý PïQk,R›«=IžÝ9ÓÃr×dÊϼK2ÒXþ‘B­®ªº(ÕSSð¥”e›%ÿ¯?õ‰Âú®§Çãn<ú|MpÊ¥ÓªY‰‡Lƒ*t•šYŽÊœY‘tá)#1Oµ®j„©Q`[µyr"(“%¦!8µ²gœÈ‹)3Áô÷Œdø!:Ôá|RJÞfœ¬¸ïÄ”ìYL:ĆV¦ÝiÄV…àÒ¢>$deƒ#äIMDfc‘žDgÔ¤²ò›2C†œj$« Ìµ'8èÉwÄX¾%»˨@÷LIGsŠ3Ç.“*|›=Ù,ÈÌjèÔdFxéÁxTتrÓ› LÙ+ø,ÇiN-_à”‘™…™qI¶øÀ6\Á]*¿3¤U,g‘òUï¾Æ5Ô1êTùôÉk‡Rƒ&”cS2SkOø¥DF@â×"±« ;&¯Çôêo˜½êП·åј‰I›BŒ¨Ñ¤Æ%©n%JR•¼'´™šœpø$‹»2Æ $Y Úa6©PJ$eU炨~—•rÌþ·;ÍÇsÇjî‡;Q¤U©±aʨÒçC5È®¿M¡ôàR Ë ,)'’ÏIwÆé­©×3lz-D¥…=üVøóÞÞç¸ëª7Óê§U~ضÎk²‘*[ªŠµò¥%d³%¥k4¤”eÝ ˆÌº ÆcûK¨; 0íú ÒbHrJiËm÷X[‹iMä÷Ž©E¤”f’J’Dx2,áˆ@kçÔ?ghÍ$ãÆ÷ðëÓ‡NE„Þ×.6äDÝB¦&XÓÑÉå¶l¼i7Ö§ Ü™¥8=|1‚ÀR6‘P9v”$³I Æ¡NZâÎç§—úbR ÃÞ'“,j=8%dÏ5è m:ýý£›öN‰k(%Ççu7øŸÞîå©x^Tˆ¶½&šsÚ¸9àž¥GÔv4·¥åÙ¬Ìõw‹EÀˆr=Úå|å¼ý‰lç7²æ0Ê÷¯+:Œûµ©(3>&hJsǨ̇6CûK/*:ä%¥›(RP· '¥*Q¤ŒúÌ’¬^¼"uç2tgPÑÒk{»wo~÷χ—ÿÓÌÐ$@ήR§QjK§T[iÛn~ä:ƒKˆJФ­iQT“##>‘*;ñ%;S±!•›n´â +BˆðiQ22Á‘‰i­Ì¬g¤âîžõð<ú„ž¡é.;ñ%=S±!•©·Zq•¡Dx4¨‰`ÈÄu{@3 Ò§M¦Ô*1›iqéÈC’²ò´%k$%Dƒ2R‹R’Fi#Æ¢Î2CKM¥6“áÇüÿ‚H@’ ±=Bõ01´¸(5*µSLVžY¨–æ2ëq”¸„(ÔÚ¸ô,ˆú{Çå*ª£Õž8»¾hÓËÚuĶë9p›âÚŒ–xY’OzLË8É `•íc’¯IÅIIYó¿¿ÎèÓ/:‡VÛKZYN·T”™’¨““ïT’Éõ™Xó:ÜGÙy…’im(Ò•’V“#4©$¤Ÿ£###ë##~G˜ è4©Óiµ ŒfÚ\zr䬼„­ ZÉ Q Ì”¢Ô¤‘šHñ¨³ŒÆLwÕÉIaÓŽÚÒÚÝ$„©D£JLúÌ£"ëÒ}ãfUN.é>¿_¶1Fu>³%Æ 6Ñ›M›®­é ²ÛhÉ'R–â’”–T’âeÄȺÁ&ÝœãŠNÈÀ“S*›9ÈSZÝ<Þ È”JJˆÈ*JˆÌ”•$ÉD¢3%‘‘™ÆÕ·2c%%uÀΠҧW+©ÖÚrd¥îØC!¢Z¡:–dœŸAx™‘LȆ›;\ŒQrÃ}ÿ~Œ‚ÀuV•:˜Ü&6ÒQ>*eÆSo!Â[F¥'9Až ”…¤ð¢4™ÁÓ\JÆQ’¼]Ѐ$þð¥;ý…ØßC7üK{~ýŠ^D¿ü&=6 û ±¾†oø–<öýû¼>‰øLsæX»@X©@wÇUýrÇ{ßWõËÏú/¼gѣ‘Ð5²zÊG@ÖÉèýC[# Æ®OXÚHè1«“Ö=ZšÉ]#[#¤ÆÊWHÖÈé1êÑ1Ì×>0ߌ7Ç¥LÍ# шïXËtb;Ö6Àá#ÑÙ]p®y;* O¨Ój\’$¹$Û«Š¤´Ôu3 -($¨ÉXWö•¨òff8×F+½= 3šê`Òh:“§4ÒÂïÂüšÝ½[™ˆïÁ1Ö2ø&1úƈð.ÎþÆj²ÆÎ«3é”sÕ[§4ÞöŸÊš5nå$È’i4š²ëiè3#u8ÁšGZųN§Vî:|J4ÅÍpHeQ‘@j¢¦à–“`Í.ºƒi %(÷‰é".é<3I˜®ÔRMpúžEfέIMT¶//$•÷ﵞyÝvíÝU³%¢ÄšMBê›NåRÚyÅAÔÉ‘É%%Ê œ%(Ët½*Ò“Ä„Ôíý–Óß›iB%½>§MvLêBIÄ'vÑ$µšH÷‰pß4¨ÌÔ“iI. REx}B×Mn_{¼¼„=™(É9Nê÷à÷þnwãø¸ùcê‘r\ë¯PêTÚj­Zd™å”MšUªŽél’”$Ím?žN‡ˆpY¦Õé·¬ÄUèñ©FáëŒÜXE…3ý•!$”ðÇNK9É Œ‡$*VS­÷¼¶‰ìùШ¦çukZÖä•Ö÷ÓÓ}rÒ/ÈvåÁZ¸éÕWdÕÚiê‹Ò6Ùa³}³A™™MÓY ‰ø 5‘q$äUâÔ›¹î{†B+Zd h‰!GþNóKiE¤B”…=ÁqNƒÉ U ²éóøùy‘gJÖr\øFÛž÷5…Yü¯¼µªñjMÜ÷=Ã!­2´D£ÿ'y¥´¢ˆÒ¡JBžà¸§Aä‹2îVJUB½Qj€ý2ˆP¤•:¼Ü§ˆœkt¢e‚3VéHYikv”’ˆ•Çà˜§€NзîûËï©_ö·x¼|¸5»wž÷»×‘ÝÑáE™n×ilšNt…Dsvä4±!æRoo[ChqÍe¨ã«y='à ÈéQ½MTžgUrén ‰P‰×7‹l’¥!dÒ‰ÅéB¢¡*##Ig‚L…>#]G‘zÞÎu¼ù§Ã}Õ—Öíܾ'o{ä2ìvªRjt¹­RÒmÒÛo•"#¦ã§¸Rœu*i'Ü/Y–õY,—ý^-I»žç¸d!ⵦ@–ˆ’äï4¶”QAô)HQ³Üè<‘`ÅR5Êü>þþž&’sä×¶{·Ý=Û›müKWj4”¼ýÏX©Û讞S¡[¯5QqÇËRP¥ž—iZÖJBQ‚F ¸ŽbÎ2£iܪ3N¿V}è«K ›¯ÆN÷z„¤¸«»S 4–x'=C‘!=ñª¥œÛã‹@»tGm䩵m¥¨Û¬ÈA“hÔz‚OéÚJ4“DGÓT:÷¾ïŸÇË̘{1Çâ[ø[†Ë~åøxo\,•‘Nj’¸³Q›:<„#1PÄDº‡Uƒàµˆ4tñ"_IðáƒßXT‹¦à‡S£Ñ5TÅ2*|š:2$k&û”‘©Gݯ.“â|”òñŒd“WFúÔ¥8µ½Ú×WJÞ[¾*ïsȳêÑ«õÝ„Sf±p:TÃ(* iQ8yŒµ§§$fdX<{ÔâÔ¦[[ÐÐô‹¥ ¢tv\‡C²M`¸©IJáå“-ßîOHºõÓïÔÃþÚì’’ÝgÚIuệÏqp#zš2©<ΪåÒÝ:¡®oÙ;%JBÉ¥‹Ò…D#BTFF’Ï™Z÷‡HeØíT¤ÔésZ¥¤Û¥¶ß*DGMÇOp¥8êTÒO¸^0³-ê²Y.<@•e%k£ìçJxÔü÷uò»i/Òþe­W‹Rnç¹îx­i%¢$…ù;Í-¥F} Rl÷Å:$X1—r²R§×ª-P¦Q ’§W›–ñnÔL°FjÝ) --nÒ’Q¸üð m ~ï¼¾úœÿÚÝâñðVàÖíÞ{Þîw^GwG…e»]¤Y²ju9ÒÃmÈibC̤ÞÞ¶†ÐãšËQÇVòzO†‘Ô”zŒ‹]Ê:­¨÷-Z$jyÔ!®K¦ûn!sI»hÉkÐË­%]Ñh=$d|qMu_­ËÖötª·øù§Ã}Õ¹¦·nà­¿#u{À…M¹¤Ã§÷,¡-(ÛÞ›—ÚTãZ¿µ¡f¤gþHéî˜7T­’[µ .©É"L”M¼¸‹KMFS0’ʈðI$,ÉXWB•¨òff+àUâÝÄÑ-OTño‡6®ÞæŸ=׿™rN¥À©ìn º${·™âÈŠücU:¶Ù–Nº¥¥ó#I¬Ï[Ÿø²&Ó…pÇ=K¥WÓ-­ê3tç¥[="Ì7—X`ÝA«Fžé&³$™¶“J´¡X>8:÷¨@»®·©û:pRXõðãf¯Â÷|÷«=å¯QqÉ­7 ‰¸“ ÛJfP jÖM­J†ßîUܺiÔKÒ¥–®£æ6§¼Lú;OEæ÷›¥¡.SIF|€÷®þ‹º3YdŒœÂÌÔ[ÌðxÌ£NæÚ‹s9¤‚Q)‰mkid¤šLŒ²GÐ| ŒŒFFDb%UI[ïïåäZ–ƒ*2SM;_u­wñ»ÍÝùñ¿k <)Rl&'¡—:£i·—¥·^)s”(ò]Êœ$$ø—šU-·¤SÕ~ÐâÒ'Õ&(§7rPQÞQ™Ní+Nù1ÒFzukQjÇ®. õ‡ã)QcCb+4hÄ­Û-êRðZÔ¥Tµ(ÌÌÏ*1¬U”_ ý¢’ö}J‘oïñWmîw·;=Îö;­ªÁºRÕO™ á;¿å†)†´§v|§Ž•–³$ê,c83ÓiVsŽÛ”—(’iÊ*ääÓ™%4Ò%HlÜ[„’6Ô–ÐFKÉ)jOQ–FCm]®V›G‚tØ1 •ã6ãî·RkS†kÖµu­Åw$Ÿ†eÐI"F´Tœ­úd*è5*t”¯fîíÁ4ù]pmZÜ,Ÿ#¹–mC¤XðkÖí:6·”ͨ®˜–^Ý¢rÿHÛ„’Â÷ÞUÄÔ—Õœ¤Çó>Ÿ\(—Wµ)ð$4óÂLRÚO)|ßAH"OùSfÙ¬û­æM)ãÝ`ëëß—ßÞòËÙ­;©.7áç}Û÷nü/×BêºéõH’nÇéö$U.çj9)¡%Iܼo¤Ó£jÿ&Ó«8ß'N5$bTíw)ïÜ‘ÎÓÞÓ©·´VØ'c“9޳|£¢#KjIÅâ¥i-âÃVN¡ êzBnöûßåðÈãeT‚²©Ó“å‡þÞO÷?Öêr‹ «L.§Lm‰J‡%Tø½Ž²ÔźKdˆ—œKO¤§ Ék4«$­$‘R¥%©P-Ó•r&4S\9tv²J”öùÔÂJœJ„Ç#I–KR”II¨À‘ý?1eT—ý7q½¸ðò;}«¢m6ú‰)Ø-F_5Óeµ2N0¢LFSÜ’ˆÒãd¤)»Ž ÙUwÞ¯$¿/L>|ðïê¾=}f Tj †ÜƒHTÈɘ•’6’­îå Y#kÂIFi.ÄŒ†ý4züêÍ2 vסңªy®3‡,›èm Y²‚mHT„,’I%dÌÔh"pµq¬ˆ@檤Þîf¹èS”b”÷¥kµ}öâ·î}xßx·m-˪ƞ‹q÷U&ºä ‹R­¦b#rDÊ´®:MÄèÖú‰j°“Wö CCi5wjh™o³½MC0؇Ýj[¦‚qãukŒâЕ¸“Ý Ödj""Ég**·¨@èô…{¥óò·ÔÍeOŒªo¶çn‰¾µ¬íkp:úÜ*6¦Ô ¹©±“1+$6¦’¢Fû¹BÖHÁšð’QšKñ#!¿ŸO® ˫ڔøyŽa&)m'”¾o ‰¤'ü©³lÖ}Öó&”ñî°uˆjªWÝÄÓ= RPü_•%½týw_ƒãu¸îöÎåbÖjÒjÖ¢-ºƒÎÃ')´‡Ù'ÖhqIÐIx•ƒÊÔJ׌˜î.X·IW6‰]rÞŽì!P\M)µÎ1ÜK®QúTèJ–KsQ(³Ê‰+Å`bëHß'×Ïâq—²ï QM~oËÇz{·îáçĶ+ÖÍIžÌÉVšã§±ÊmIDT­<™õ**6ÏNZ.2ÈÒ“"ÂF]Ç =ªÓN=“E‹I`楶]=¶^JM <4ûJ4ËgeÕeYÑljæ³­šK«òó&—³ªBQ“íåÇtWWÓçn·°ôÊVÈéUÛ×Û™2£—I¥$Ït¦™ÐiwI¬–ošffFÚˆ 4õj‰R‹Vª9ÕŽw éô—™€ºCxÝ®)r·[ŒhÐfO$’xGrf¾ƒ#ÅB6´*»TÆä4ý—Ueý&h˜ÚòƒNpi[jBÓð$JÁðÉ ˃ûÝn…jû>jòƒ»»åÆòR·IYõò,é‘çÆ©]ïSíè[º}¥M5³ž…ÇmkT'Ök$¤Òáç|¼¯VIœ¥<2ª”ËŽ-.µF¤Û1—-Ê4õÄ~ŽÆ'`½ÊèÃm¡îçW¶f¢#NUš~µR“W©»P—£zá%$–Ó¥JRIJ]IJHˆ‹¼D0…ž’¯¹|þ>^#”=“<+•ì¹_zÃç¿|^yöû*¤ªkµ9ÍÇ)ŽFi ¦;t„ÔŸ#Y™ïQKJI$•’-eÃ&F]¢h•ºUbójٶݔԫ~-„.„ÛäâÝv*•¥³K‰"3å¡&¤‘´};¢4Ò¢!YF)[[üNúG³ªVªçYÛsÖçÕ_‡Í—‹‘åÖjTêÔ¸‡èpN’äjG&g%`–„7ú>PH"ôf£B ,pJOúz¡ªç•Õ).C Ç—%3h,#s(¥ ‰{”)Âcô;Å)³4’‰+R“¤‹è =%>[þ'û"Q²SVV݇£^|í¿ÏyÙlÝoÖvÏ@•žÓk~ºÌ“ “&ÙIl³`O³Zu3n9TÉŽÈ£$Ýäå¸Ö“Y£QO”ž³=IÝ,ˆÈ¢-5"—X…E§¦j@© ô×J¡ äï¡å¤Úuk£¤›Kg’Sg•+¸ ×­Û¾//™ÏýºwoÞïÁõ“îÿ¶i2á¥Qk¨6Ív«’™•iÔd%ÕSMokC³dÛsN¤÷K`ËI–­òó©"ž©QM-Ü>†­E• I¹_þßvú¾©~™r6I‡| ;àJv û ±¾†oø–<öýû¼>‰øLzlöc} ßñ,yíûö)x}ÿð˜ç̱v€±R€ïŽ «úåŽ÷¾8*¯ë–?Ÿô_xÏ£GÝ#G# kdô ”Ž­“Ð=ú& †¶GA\ž±´‘ÐcW'¬z´ 35’ºF¶GI”®‘­‘ÒcÕ¢c™®|a¾3oJ™šF£Þ±–èÄw¬mÂF#£ÞƒNŒWz mÆF#¿Æ?XÈwà˜ÇëãÀâÁˆbˆ$ú„ >¡'¾ „÷À'¾ O|@ ê'¨@ ïÞ’$„’  ê@$@‘ êbz„ !H@z„ ê````D  0ï‡|éNÁav7ÐÍÿÇžß¿b—‡Ñ/ÿ M‚þÂìo¡›þ%=¿~Å/¢_þù–.Ð*PñÁU\±Þ÷ÇUýrÇóþ‹ïôhû¤hät lž²‘Ð5²z¿DÁPÖÈè1«“Ö6’: jäõV†f²WHÖÈé1²•Ò5²:Lz´Ls5ÏŒ7Æcã ñéS3HÃtb;Ö2ÝŽõ°8HÄtb»Ðc)ÑŠïA°8ÈÄwà˜Çëüýc\xX1L@±ŸP'Ô „÷Äžø÷Ä ïˆ =Bõ=á{ÂB€AÔ@ˆ =B OPƒ$ IOP=B H"&ð0ï€ })Ø/ì.Æú¿âXóÛ÷ìRðú%ÿá1é°_Ø]ô3ıç·ïØ¥áôKÿÂcŸ2ÅÚÅJ¾8*¯ë–;Þøàª¿®XþÑ}ã>tŽ­“Ð6R:¶O@÷è˜*Ù5rzÆÒGA\ž±êÐ0ÌÖJéÙ&6RºF¶GIV‰Žf¹ñ†øÌ|a¾=*finŒGzÆ[£Þ±¶ ŽŒWz e:1]è1¶Žüýc!ß‚c¬k‹ Iˆ “ê$ú„žø‚ß@žø=ñ@'¨@ž¡'¼ Ox@H@’H:€ƒ¨‘D'¨A‰ê`$„ ! ê'¨@€ $@$þð¥;ý…ØßC7üK{~ýŠ^D¿ü&9’màl‚Ì¥Vnú,ìÑ™ÞÇzZ Æõ”D¤ç)3I‘àúŒ ÈcmŸi»=«lžè¦Óo*$©’)!–[–“SŠ4žEž&}áÏ™côà (øàª¿®Xï{オþ¹cùÿE÷Œú4}Ò4r:¶O@ÙHèÙ=ߢ`¨kdtÕÉëI5rzÇ«@Ã3Y+¤kdt˜ÙJéÙ&=Z&9šçÆã1ñ†øô©™¤aº1ënŒGzÆØ$b:1]è1”èÅw ÆØdb;ðLcõŒ‡~ Œ~±®<,& X‚O¨@“êB{âO|{â÷Äž¡z„žð=á !H@ ê D ž¡'¨A€’$„'¨@ž¡$@‘“øwÀ>‚ì?öCjýÏðŽÈq»ýÚ¿F3ü#²‹Ø •(øàª¿®Xï{オþ¹cùÿE÷Œú4}Ò4r:¶O@ÙHèÙ=ߢ`¨kdtÕÉëI5rzÇ«@Ã3Y+¤kdt˜ÙJéÙ&=Z&9šçÆã1ñ†øô©™¤aº1ënŒGzÆØ$b:1]è1”èÅw ÆØdb;ðLcõŒ‡~ Œ~±®<,& X‚O¨@“êB{âO|{â÷Ä?Wì'Üã³ûãd4¾»U¹ÙŸQåÆáHa-'w!ÆË¶”eÁÖ|r;_zFÉþ[½¾õÔº?u¹=é;(ùnöûÔ_Pô“ü·{}ê/¨ ¢l~û“Þ“²–ïo½EõïIÙ?Ëw·Þ¢ú€º?w„Üžô”|·{}ê/¨zFÉþ[½¾õÔбøp„Üžô”|·{}ê/¨§º/a›:ÙÍ‚í^‡:ê•TR’LÉ1Í„§x„¬ÔIh”g…ð"2ï™ðÁ®ˆ±ù˜‚H:€ƒ¨‘D'¨A‰ê`$„ ! ê'¨@€ $@$þð »ýÚ¿F3ü#²nÃÿd6¯ÑŒÿì‡"ŶåJ¾8*¯ë–;Þøàª¿®XþÑ}ã>tŽ­“Ð6R:¶O@÷è˜*Ù5rzÆÒGA\ž±êÐ0ÌÖJéÙ&6RºF¶GIV‰Žf¹ñ†øÌ|a¾=*finŒGzÆ[£Þ±¶ ŽŒWz e:1]è1¶Žüýc!ß‚c¬k‹ Iˆ “ê$ú„žø‚ß@žø=ñ@¢äïülßúwûãçÚmfM¿k"©Ç[R*tæœ6£›ëSNMa·R”T¥›ZÒD’5qîxàsäïülßúwûãý¸)«p‡)n¡¶æF–FÑ‘¶mô>¦ÒGýÆx2>#›âIÉ̾™›tÚ”ºJ+q“:¦ëRÊm TT8ÒaJp’K}¤§;ÆÛVzIõjôŽémZ• V¿ërǪ4jB&8ôÇ©Òq$Ó»´hQilˆõ+‰i"mV‘¥>‘1õº—)S-‚A‘–l:Á’²G’Òò†8‘qÆHôlY\Š‘I¦Q”Õ2žÍ=³Žã Þ¶Òt¤Ö—ZZ5ã¥IJLÿÀˆˆ~å~´íŸI¯Q¶‰QZ^»2iô?=¶³KŒ­Ité¤ð¢I)z ŠFÍÆî 7Z1nÚ‹§Ó››.¤¨ñU.JŸuä¶‚-Öå)I2¼á¼žQÄ&{„Z´[1mô9,£GœÌýá¸Ju×Û”™F¥¨Èó­Ôå\ á1ÃÝÅlµU¨±TU©QªL´l¸ oZÚ3É¡Iq B‹¡'¾ „÷À'¾ O|@®§í&ö§Ð)Ô•Å·L¦¥ÄÄŽl4¤´KqN/I™™©FfgÇ ºˆ¿®Ù·¿Ëü+?qàì;fÞÿ-ÿð¬þ@í›{ü·ÿ³ù!Ô Øvͽþ[ÿáYüÛ6÷ùoÿ…gò<lÛßå¿þŸÈ#¶mïòßÿ Ïä‡x@°-¦Þÿ-ÿð¬þA‡Z¾®ªÍ5ÚmJ©¿Šöã|¤ç %¤¤ˆs„ uP"ˆOPƒÔ ÀIBÔ OP€ H€I‡| ;àAvû!µ~ŒgøGd8݇þÈm_£þÙE‹lÊ”|pU_×,w½ñÁU\±üÿ¢ûÆ}>é9[' l¤t lžïÑ0T5²: jäõ¤Žƒ¹=cÕ a™¬•Ò5²:Ll¥tlŽ“­Ísã ñ˜øÃ|zTÌÒ0ÝŽõŒ·F#½cl1®ôÊtb»Ðcl21ø&1úÆC¿ÇõI¨?K¨µ:3qu¬éL¨IlòFG–ÝJ®ÖGƒÁ—#ãÀâÌS?Pí^Ö¶o=™ÝS­{z“J¯YUéŒKjŸ ¶ è¨udFd‚,á²J²}m¯#Ü‹jÛR*üßrÐ)•yµJSµ4"tT¼¨l†ÿ§³N~m* ªdG JêðɇòDiÒæ÷Aš‰Di,÷Eœg9›²Û®Z•§h× 5ê|öˆ”¦œÁð>ƒ##2Q|ŒÈ“àÁ©Øl]ä£j6ä7aÓæF¨TâÃ’ÌØ,ÉBÚqöÉdIu*$™— I‹'ƒ,˜í}ÐÔ7ª[~—bÚôŠ$&Úq†©ÑcF‹”·c4³JœÂ5™«:Ij>*Òž*ÁÕMìÙêõúýˆŠKEq°Ù8¸KdhKÊd•ž…´¤Ìñ“Çrx[[3½nKŽ­nÑ©-I«RSsbœèí­³JÍ Æµ–²% IÉS“î‹3‰u­“³‹Ê=¿2¼ªB]ôÍSÙyqO¼ëhY­³.²RKc’Óà æÀ«Ó"YÖ•&/dr'MŒîõw%9oJrAÌ”¡Km&H-Ö7†žžŽŠÓlëP¶‡Sb¿nÒíéähטÁ5HIšI–E«9âf}ªWv"B{âÍ÷3ØÔûÿj1éUt©ÊlHë›)¤¨Òn¥”’2\HKNqÇèé>È`S6½Sº­yÔ$¢˜ìê;Ð)íFr+ˆq)JMM‘‰=áï Gäˆ9¤ (å±;r›PØ¥ç\£Ð¢×¯xRD8¯ÃLÃmƒSyZY)*Q‘½Ò“øûñ=Ó¶í‚Ýšì:dZEÁ>އëc6M¶Óº[ÁîË‚ Ôn– ¸5ŠÄئv²­ªæÍ딪…ñfï£ÊŽëÑ¡Ëw ¾{³$šgÜ-HQ ðg‚#Ær-}…Q[½¨WÝ Ùôx¶›t×YbÌ´ê§ôN´„œêâ‚#éÁ¥4•È?:wÄ e–½2.Æ/=§Ô E¨Ê¦:Ük›'mÕ©²SŠA÷+2'“‚Qtä«Ö§oÓîßsœ¢•: ݯȥ® dGjK*Ýé54Ù D§“Å$\óÆ® lE\²nª%±L¹ª´gâÒ*˜ärTi4¹’Ô\òœ‘–¢,‘d².P­Z¿¹&ð¸!Z4ª|¨5f¢Ã’mÒÐÞò!™©õ£Qï:SƒÁ$‹€—4ùðÎÜŸO¦N\¹ô†ª¦†Ï“²óŠKDîK p“Åi"ÕÜä²xÉ™‘Û¾í µl:"ŸJŒº#N©˜Qʳ}ò5RDFx",ÿq•¥`QàîÚÕ—±Úu¿nSèôÉ×$Ø S¨Tb"^ƒR$ÓM¸Jm)#JøšLÏĬì DvÕKÆ“Rµc–Å"%ѦÓíO‰Oi¶ŽH^¦Ý`¿D£×»› Ê’›‹˜<¨ßb+Eu¦šlÍM¸£#ÉäÔž‚㤻(—u¸Ýq;AÙ}8©NBÜI”šC ¢æ…n'XÓ”ôäœ3ðÚ»²»ñ¦âÔ"iù­o¢Ãrc –ú;èŽkÞ«£©"Ø—Pq@:ê6Íï Å›"ð§Sâ½CŠK9N¥­$¤)ÂZUÑ„™dÈÒdG’νdÜ· 154å´¹e ¶Ó-’yÇŒ’zPɬœ_™¥&DD£3"JŒ˜9â:›‹g÷]¿lŠ9‚D%3J<æ$*)©D’'RÒÔmåFEÝq<ò¡±Øe°;nøQh«uIf‡Û—Y†Ä4´fþ4)f’Þa åÍDzÈÒF“$Ú@¦ú„†Ü³.Jý2ERN޲mÙ²¤µ:VxÂw®©(ÕĸgÓI{Q)D…±„™+º>“< º4¿c[Ijtømë›Ohž‘©±Ü}-™’ÒÚ\5-`åÌ uKë¬[ÇqD§2Õ Ü”Ù“XˆÊ×ÿ*yi%àYè1¤®Rj4:«Ôº´7aÌgNñ§ ‰’JIÿyLŒŒ¸ º ÜïQ¥ÂÚM\ÊmJ„qeʨ3*šÄ¥#Ä}ÒÐn$ÔƒÊsÜšu`ˆóÑmÓf Z!mÆ[;>sˆ‘{´¾ÜU™å(ZVFJlÏj#/쨳ðªçiY‚–|Úö{;NÛ-"Ú›“ƒ©0©´ØñæöWÉ´„çS®Nt’•§†«í#WåE³íF¨-¤Øüê mîú´zåmU(ôèÔòr4d8Ìv[i³u 6‡”6”¥:Ö•/DE¨vµ«p] ’š5r‘½ì—im–ÿÇd„é2è1{îÞA¥Ð\–mÉoS£Tªtô•>R M!©1ÜQt¤iJFx 狇o¶ÄYö†ÈB£C¬\Ó\…DJ}mE2Ôi$ »¥«Á£Æ2*æ®ùøÖç Tmº‘Óª¼ˆ¥$Z#NbQ ÈÌ*6–¢JˆÈò“22ïq¡~ “øwÀ>‚ì?öCjýÏðŽÈq»ýÚ¿F3ü#²‹Ø •(øàª¿®Xï{オþ¹cùÿE÷Œú4}Ò4r:¶O@ÙHèÙ=ߢ`¨kdtÕÉëI5rzÇ«@Ã3Y+¤kdt˜ÙJéÙ&=Z&9šçÆã1ñ†øô©™¤aº1ënŒGzÆØ$b:1]è1”èÅw ÆØdb;ðLTš{õJ‹Pc9·]ΕJ–ÔfËfyqÕ% à]fY<q2!ü»ðLcõqàqeñDÚ }šû .ª¼õǬ[W©Ž>Ý2[ æ\yÅ4¾áf’W} 22JÏ%ij¸÷/ÜÔõmz½{Wê´**E9È1Z•Ta“d’äsi”¶µ’Í i’V=É–r?7˜WM4.^V J•b÷ÆË'Õië†l†eŪƒ+‹%%¹V褡FÖH›2â¬ef]$xñ›Z£ÚÞæYö ê6¥pUjå-¶ ÊD¤Cm&×t§5#'ºQ`”gÝÿˆ¥¨@œçèt;ЪÛ7ÙM•_ M™L‚˜šYоNú™Ž”ë2s’6Ü#s: TY,áû´ªtŠæÑ©5zf“U„ªB#›°g4þ—óªQ(£4ðq3"#ãŒàñEˆÓµ¼…ίc…®Ù¸ùzû‘· ¤J7»ÊÌÕšb@«R侤–LÛQÔ®ÓÀŒpv®ÑêûTcE ƒP•DÖT¹spÝŒJqN`´8”¯ Z”ZÒ¬ðÀæ.JÕJâ®Ì­Ö$ªTùŽ›¯ºdE©GýÅÀˆº‹ ÂÜ®Áúm¹vò½×Ímï]6ûíkjA՘ɫnt):µ6y#<¬’]œ™ÄØmV‡F÷Nm½T¸íø”¹¯q-Ê´rmíü¤:Þ…kîò„™žœé> ÒfD?/€®«u¯ä.~÷==—³½¬Rªõê9ÕH* ¹5˜¨å¥© =&n`Ó©ÔaÌè<ðQàñùø]FͲ «—>mEï ·M“3“ŸUe‡a>hNý&ÚÍ+Q%zôèJ²XâgÄm}Ô·µúÚ’ªTï D„Ü$HÒi'Í*ZdGÇ^ =:ET‡}Ø,ïs5óO°6¢ÅV®¥7M—p¥:”š¤¬Ò¢^ ‰‘) Î8ã==¨Ù êfÈj—UÑ:½DœµÓ…GfA©.Kqn%IQ¥³3m% Œ÷„“ãÐgÀQ$'¾!Á2n^ʽ½îa‹cÑkÚUìrgÇ™1¸e9£70d㆔+¦ø¿ñ៯Wèe°»&Êr­ ³tSqÙ2"¼R•˜gzœ¥\Ùa&eú?ðÍ(ƒyè °¢Ó¸n{2ŸQÚóõè ¥ÈC³6Í0Ýe“Vé n D¢5‘'Šº ±=ÏMÏoîÈîÒ݃Bb;É’ÔZË2—4II2Ê”³Â*î’GÜŠ(`݆äܼí‹ÒÞ­Ø;I°~-ºíMUJ'+Y4É~™ Ü)gܶzZA™’zx— àÔî }¥îs‘³¢¨ÀŸ[­Uùl´A’‰ Fe;½$§[3A¨ÔÊx$Ïžp)¾ø8¹rmRm9í„XÑ£í!ú䦴ïhŠ6Œ¡~ŒóÁ)%–ƒýo Y%e8.§µbG…îW»,™W ¨Ý~¡WnLX‘Á=ãd¨¦jÖOh. /™ï,þt7X\ÚÓ¨§ÕäÒØ~”‰µk[õXÌ2zTI=8á6¾'ÃJ%IJE‘uû²\rÞ±.[~»oÕ)±i Æuqk1\pœßºzI¢sx®$ò”™ŸQãóø 8ݦ@nÖëݰÓíë’X¥Â¸¡ÀL ¥>£1¸š*5­8饵$ÍKᨌ²\$ãwpvw·nÓ(ôzlJë+®d“å|žkGOˆÑá(A¼dI5™žT½z]=ñlmÞ${›g[1¤ÐîR\Ú ãT[ìŽ 7nc'NTñ¸¶²ÊLˇ÷üè!Çzw¥Ö-ÄLºoê5:º¨+f–qªQÝm¥ÄDFã®ÇRɶԑž“#d”f¬™² ¢VmJeu;P½iUªÓÔÜXEWb£&CÆdD”M:ˆõ™èâ?/€‡ JÌ›–·¹Yq`mŠ“_©ÔéTÚm;}Ê^Pb>7‘ÞBt¥Å’—Ýé#ÆK8ÈævÐÊQµŽcS)ó#T*r¦Fzæd¡m8úÍjiJ$™—*‹%’,ä:„ aüW ΠAj§]§Ó^Rä¶ÂåHQ%¦µ’MÅ™ô%9ÉŸx‡èƒµbÛ4‰4]œí;ftÄËku:³*âO8JOZ¥–ÏöPf| *1ù¤J7æ ¿eW±hÜûH±Wm*ôytÈG\'Ê ÖØZÖ‚Á¥IpÏY:+B± f»!¾i“j´©•»¶àÅ‹OœÔ½ \JÝZÚR’’Òê°FzŒË£¬RÝáárn]w}bÒöCcS!UiPëvÃnA•¡9¨šÚ4¶”:…º¤¥E¥¤äˆõŸGXÞÜ[Z¡Ñv³6é² ¥K²éè…*Sf—T¶RËÆÞq¨‰), žz¸Ï F­ Ÿ¢ìÉZ/º2¥´É×í¥I›5·QQmo¼‡²CE|J-eÀÐ_üxÔ£ÖnêÍb#<éïÉi£,nз¢OñÕ´cgr ƒg[Y²í›: ­±Û~á›y¼¨Ê6wêqK,êaGÜ’‰?ø$º:AÔBTRÞúÉn=Éw5¦í~Úf·V©µ27kÐÛZÚÌEeZ"Aáµå+2QiÁ–Ea²:“çYeÔ"F¥ÓkíÔMRži†Ùî™7–n,Ë¥ÑÀω¤‰%•`øPµüÁúƒh~ýÎÊû#·ù‹“òŽ_ÎÑ÷:y'Æ­x×¼á£ácºÆž#Ä»mz6Ó6½HªÔ(曡R¹¶k’‰ÈN’Ôò’…¼Ê»”­/$ÌÉI2Òdf•üÜ WT‰¹t\×Sv)T´^ì"š‰uŸL£Hv¢êÖF“[Æÿ*u –”%:OQ«'ÁøœØ?QßWÍî=œ]u*ýÞ·.I1ÔQùš¸Ì·j/ïnsââP£'Hûý$F9GfÑî¯r•±hA¸(‘k4ªÒÞ—}A¨ÊKF©'¬·Š-e‡}ÎO§fX)NÜÅÏÐôË‚Ò¨ì »œå¹U¨Ñkn¼†k’œ§5=“[ºB‰æˆ—¥Ä–…8x">zLbÖ.v«GÙDIµ{M  ?å ¨°XmÖÔMª[Ï­/[hÏ$eÄô‘¬ÌP}BV.~Æ´î r'ºÊðº¤Ý–Ût9tFZ0ëQ´8³(éÒ_¤ÎHØw%Ž#<Óªº¶]ƒ Ü‘z[3kÖúkr*ç%ˆ|óNºÛNFÖ¤‘8z³¹tÒEÅdDiÔJN?…KϧÈ\ý²+âeÔ[N·N´.šJ]uÇbTê,Azš³yÎ8z^#Jµ’‘…µ'«sîU”½¥8«i̦”6PêÉõºÚ]I46¥™¡(KdDG‚Æ DE[²…¥qsµÙH®Ô$œÚTF›¤Tc§TãÅÔãðd4ÒRN­:²µ$ŒË$œ‘«ynö v,ù¶]ÞÛUKBs‹5‚Zd6ÂŒô©ÆÍ&iZ¯I™(»¤äúiÐâ¥Äƒô {úÚÙϺvMV‘%Y4蔽ôW‰ÿòtÄŽ’RTGÝTÒs×ܨºE}WÙüWn'΋xZŽÐ\xÔÄçªì´¤4g’ÖÂŒž%t‘ øôdWà!BÜjû¡¯š5Ñ&Ý·m—‘C¶)ɃSˆ4…iBT²Iñ$á´g…ìÜ5û’í›Mªý´õn“SvdÈmW¡¸´5™jÊtºd³ÃˆÂPf£Õ‚,Ï@7$¹H¹¶UpÐålôÙÓÕ(tªåJKrá½1Òe© Jš3hÝWr“ý±¨È»¿ñÈ2ÑÙ6µGµ½Ì³ìÕ:mJàªÕÊ[lA”‰H†ÚM®éN6jFOt¢Á(Ï»ÿtBº,XÔšÑk3-z†æ‚å*|Æ«ñIÚKŠŒÊTddïB·n$Öž%‚$ŸtD¯Å`(é&MÎÃk>Ò¹F¸©5úCËR¡Ê…=—Õ ±Ü¸”(Í ,‘dȉX3.ƒ"ãÀE¹H 0ï‡|è.Ãÿd6¯ÑŒÿ쇰ÿÙ «ôc?Â;!ȱm€¹R€ïŽ «úåŽ÷¾8*¯ë–?Ÿô_xÏ£GÝ#G# kdô ”Ž­“Ð=ú& †¶GA\ž±´‘ÐcW'¬z´ 35’ºF¶GI”®‘­‘ÒcÕ¢c™®|a¾3oJ™šF£Þ±–èÄw¬mÂF#£ÞƒNŒWz mÆF#¿Æ?XÈwà˜ÇëãÀâÁˆ‰iÕ Ö–Ö¤—I’O<Å®A'Ô Iõ!=ñ'¾€=ñ{â€OP=BOx@žð€$ uP"ˆOPƒÔ ÀIBÔ OP€ H€I‡| ;àAvû!µ~ŒgøGd8݇þÈm_£þÙE‹lÊ”|pU_×,w½ñÁU\±üÿ¢ûÆ}>é9[' l¤t lžïÑ0T5²: jäõ¤Žƒ¹=cÕ a™¬•Ò5²:Ll¥tlŽ“­Ísã ñ˜øÃ|zTÌÒ0ÝŽõŒ·F#½cl1®ôÊtb»Ðcl21ø&1úÆC¿Æ?X×~¶Ø->œîÅ¢“±#,ŸCûýH#×Ý(»®ÿ"ãÔCòd’"’é' –xúÅÁ³zîÏ`ìÒe>µU¬G¨ºNïeç•ä°Z ' òX.ë¯9áN¯Õ§:sÃ#óÁÑ*PÓ4ÉË¥-×V\øoßÄö½©¤F®£Æ6ÝNý8ô ú†UJ2ɹk;““2ZI¨ŒÍµgJŒˆòœ‘dˆðfFGÐdg±²é,U«ˆLõ-ºdFÕ. âxXoŠˆþ2¸!?ò–’ëUµ¯WkpoùÌS™rb%Sòîí¸êx¹)¥rMAM¡-™ê=E!¼(‹yNu`Žn ²'ì,J¬1˜ƒ¨¢VZy‰+JJÕÓ¼aÒ"RÔîH”¤¨¸’ÃðTÄ6©¢?ÌÔ껲¢±|ç¡!k5e¥4–µ¬‰'ÜâB:2|ã7íqÚ²jT5¸ÛR-æî’c¥ÊÛ3 Šzuon+l¥qÐiÑ©(ÏR ²¥kiòjõ[^Û¦T®7pë)¨”²mÄÃ&HÍÒ­%ÔE§†“I›°+Úý.]µ2‘9)L˜o)—4+RLÈñ”ŸZO¤¬ŒŒQé2^·&×R¶Š49qâ8“3Öky-&EŒ`‰…çZxnvªãJ½å0Û¨xá1 ® ò—¶\QYÛQç¯#:̹§[›=¯.W:}QÚÅ5MN’^6ÒÔÝfž½$jA(ˆD|ƒ›»\@ÐÖd«a‹ö¸®Èa³D~ð’ÛñZ«Å…PTâI p”…*[*#Qi2J &¬§V¡É[Ud;²gi’ªìÓ"±YE¬´ƒñšÔ†äAZMO-Fd”º€“AäB1ùTýñ{âÒ¬^ê;¶Û¥Oª”»EˆT4φ٥ÆT–ãESÙIdÂRVƒ?„X4g!fÈ*Àmz« £z[)™Vj3Ì®rùɈ%EÓB›#e²t™CqÓ¬”MšÈͳpÕ„iHþ«Õ:aÝ1¤Ókq¸µ”Ó5 5†e­šMYöZR„oN:M pȱ©¨ø,ëÈ’ b“%ërmu+h£C—#‰3=f·òÒdXƘ^xõ§ñƼYŒÝUú»s¼›¡¥\oV)JT¨³㎥ækR\I÷x3m+ZLÈÍX32WÎ]¶)õË¡ºj¡ºÉ]Sž}¶ëìSãL§‘4…kiÎRÏ{†Ï=ѲF““\ˆ) &Mjsâ­¤8ÜI2ÌÜ3"Ðà yeÀ‰¥µy–L‹ˆ×‹ŽÆ«¥‹&;1®*db-ÚË8Lm·$Nq©[¥Fz–£B˜JVDxÒ¤äX:pJw`ÝÒ-Š­J³nÒÒ†˜ráq´SÜuÎáD¹ ŽJVœšHœBÈøg¹Î Œ³¤!tSnʵZ§²ŠjóTÊ|”b©·:²JSRP}dó-z°L)½2ÒE„ê.…l]PêˆT®º“s&E¨Õ™#vBätXü“‰¥DÓi}k4¤Òœ+d“!™%H6,Q*Ò)­TcAyøÎ¸ûhSE¬òËiqܤ»¢$¡iQ¨ËÏŽ—lSÛ¨\0\ÂU%¸nKʬµSuõ“Ž-Ù !RôÃ=ÊS“3ÉI±»ºlZ3dÔ\eÉMUc²Ôe™—F’”¢.œn˜6ÌË£z]fB\®AÁƳî92§Eb˜§L*¬¤¥Ä~Ž)¶‡ ÃãÿÄ’î¸ã#"ȧX—5B•¥,'[šÒÞŠÇ9F)/¡+ZhŽnoUÝ6²àž:OÃuë*x×eH¸–ì7êñ)Í*žÓRŽDÌ’%þ•[p”ÞZ¾à$K‚Ý·ªvU-ö(³]§Å~9×Yã¯SÜç›·R”¸l¨‘”íaöãÓѵB¤)kSi2&ÝWq­ N³ÂIDdfF,³¬Q¨U)5 Ý/{EµÍòQ- içALWã!dxRÝÙ¤ˆúPát¨j`BEéÙ,ÙÕ{“ÒßzØ­Ä“«$¾f²mÅ ›ZTkø%œ‘ð lÙZwÊ•4§—"Eºcí$Ò¥¦K›Í ’Hò£=ËœK%Üôñ,øÜ6õRƒ¸:Š"iQ6¸ÓY’ƒ4ãRMM-DJ-E”™‘–K€¶-‹’€õŒŠœú¼H•iÒ˜¦LB×úD)ú„væšKºÐE">¥êB¤ÈW÷…*›H´èqÿÌê®™œ±ÚuD¥“±ðɰ¥š[iVMôá:O N¢Ï•'{2 e­o*àMA,Õ©ñ$Èô´F’Ok’†šqç ³CjI!³øjFrX3ã ê6^ôvnÅ"L–"¦U2£ ¾á6Ù8ü'ÚoR•‚IÖ’É™g'Àw{'ªRèVüŠ|ƒŒ¹ÑêîQ¢¸£Â.)6„¥ R›p¥5¨žîZ<÷DdJÊM2Û@§YTÍ-½‘Ì’ôæ\§·"• 9¬‰Å±)m¬Ô’é4¥%,Œûï'¿ÇitW(ïl™¸7nE:d&›iÊë:cÌA·¿q¸$Öõ.)Dö\5éRVg“îRQ‹Èå×o*€ªr“V§ÕcTbr¸ÒaÄ… žu“#'[BˆÉl¯û=î#KÔ:ˬš™dZcK„âa@rŸ%’”Þý·Žd§‹-g^ƒCˆ=dZrxÎxO¨Y¦nÆ®=SvœÂ©Ê‘žÕB^úsQ‘· ²I8ãÊB yu²4‘Ÿ‘t‘‘cijë’êÓ)±QOyÈhK’EN1Åm*ÆœÈÞn¸šˆ±¯§‡Iη"´ÞÔî´9ÔXÌר9ŒY1Ž4˜¯8Ûèkü¥&ÖRiOÂÆ £,ä°yu£N¦K¡C~Ùj²÷7ΞÒ&7!æU).4‡Iil²ÛÌ(É JMI^ƒèÄÉ8Z­tÒéR*u J£G޳K¤·›Þ$‰ÍÞ½Þ­{½}ÆóupÎF¹š4—í¹5Ö]alE’ÜwÚ#=ëzÒ£Ḇ¥E’>X2,–nx7«W—kÌ™d(”¸Ñ™~D˜ì·)ÆÂ†Ýy½)A¸—_æ´(ÒXA)Dc‚DxÔÛ~þ–Ä™L’ú)p$îô•”¤>N%=Xi“3"ø;Ô—Y“æ¨A‰êc¡B€õÔ ÀÀÀÀˆ aßøÐ]‡þÈm_£þÙ7aÿ²WèÆ„vC‘bÛr¥ßWõËï|pU_×,?è¾ñŸFºFŽG@ÖÉè)[' {ôL lŽƒ¹=ci# Æ®OXõhfk%tlŽ“)]#[#¤Ç«DÇ3\øÃ|f>0ß•34Œ7F#½c-шïXÛ„ŒGF+½2®ôÛŒŒG~ Œ~±ïÁ1Ö5ÇŃ$Ä Iõ}BO|A ï€ O|@žø€ Ô OP€Þ'¼ $ I$@AÔ€H"Ô Äõ0B€õÔ ÀÀÀÀˆ aßøÐ]‡þÈm_£þÙ7aÿ²WèÆ„vC‘bÛr¥ßWõËï|pU_×,?è¾ñŸFºFŽG@ÖÉè)[' {ôL lŽƒ¹=ci# Æ®OXõhfk%tlŽ“)]#[#¤Ç«DÇ3\øÃ|f>0ß•34Œ7F#½c-шïXÛ„ŒGF+½2®ôÛŒŒG~ •“E_¸9ÉÎÁŒˆ’¥¼ûQÉå¥ã¸ú‰(5 ”fM™T]=#ZïÁ1¸Ùý±‹”ë v[.¢æv*´¸ÛÏDu¦ÖG’Æ•¸“ÉHˆÌ²x!©^ÛŽ,ØRmš=zã§Rí9µ ËŽ¸[øõ‰H[…­ &ÙqrJœV£",—$¨³Œ;™E¬H©À©±P9%L™.ñ¥!´4¸ñ^!M¨Ü%i. F8ñ>­µ£{Ézú¡WoÛšå©F¢LnldšŽrÍhuµ›dNº‚l”Hâ¢3èOr}ZËn¥A ÞkÌŠ”Ê3‘%CSˈ†¤h‘ƲhœRr“tÌ‹yÝi.)Ïò *«^¯C~]. <Ë' ÍO¶Ù¸½&­ ’ÔFâðFzJV:‡õÒ¯H óãqX(FÛŽ£\ÆPë­ Ì–´4¥“‹JM*Ê’“"Ò}ãm}S-ÊYÓ‘)´Aª»P§L*)/¹©-¤ˆÉóW&WèPz›Rðfy%`Œ`Ðîº,kÚ5PçT(’ ê|weÇ F‡[’g½gJ”K4$Œ”¢<ždKÈÓöÝiˆÏÉv–X†Ä×½F —$Ú‹3Z{’Ê‹ŽH´«u[*á¥*:*áÇSÒÒªŒ|°êºùkýð?ÖéÆ8ÁŽšõ¨=d6¥\7"Ôe ßxÜà·a¶·UXéÒg!üwÒ„Àÿîº-zßj;G:¡U9IxçͧÇaö›$(”ÒhÍRu(ÒzÖI2ÑÀ»£ÛÓ³úÅà¦Ñc½©&£;̦$Øî¨”ã º¢Q6â´%;Ã"Z°•¥:ÓÜôxÓöywÔ+¯Q ÒÛ“5¨‰™¥©Œ)2¥¥ Snô9•­)"A™™ž ‰Ü1yQ¡ÝÔ+ž*&ºûT¦éµÏDeM¶H‚˜zÚ5)Iw)%/KˆIdˆQãsAÚ]™z±Tº„è1¡ÂŒÎê• ¤™ª15d–2mimÌwJ3Z¸™÷1yX’²®Òj:£´Ê¤~O-¢I­Ҳ’JI’’fFF•‘‘ôÁ»Ò­·XbdT:†Û¦@ˆ¢tˆŒÖÄ6YYð3àjmF_Üe’#à4‚ë†ò ßB{à ý‡N©Ú•Ú—9Ëj¥IŽ™\—‘¥LºÊŸaŒï·„¤¯SùÓ»2Â~KvɉSƒIDšâ¢U«›ÎiˆQ7ˆ{JÔÚwŽk-Þ·¤' _ã‚â<ìiö¤*Á»R­Æ“V†˜I(TƤ!´&DwÉÃRä6fflštã†Hõ@ÙZW™…:aÕÑU·¦â±(8óR)¤¼£Y /¨ÔdI^¢J~ –E|©¥Û4J­5äÓ®7Þ¬1Ov{‘•N4G$´Ñºâ ã^­d”¨¸¶I3,$f›e¹ fÍ]Òj D‡¦²Ê)Û®ì˜y›o©Yá¨ã¸Dœq,+82ÎÐëLk™é+‚FLb:šŽËœ­âî‰÷)#DrQFO”JÂRŸêçÚ$;ŠÒ¬ÓåZ´¨5:„è/¡øg'B·ÑÐãê$šRâP”’téRødd»=³ên{”èç½5®çÙ&””šf+®¶œ«† m¤ûŒø—ImlûN2v“GµoSMº³ñã²å: ÉoœJRò\$:‡PDjàœdÿ´X2vÍÞÊo$V.(Í&76Í‚´R)Ñ¢ŒóI2CiB ÉNäÔ|p]x"½–Ré÷ŸQ¥32M:×ääÙÉBZzI7)rTf”©DŒ©Å$‹R°D\AÜ jÚ¬Ün¼Ý"3nî &âÝÛI¨ð”ëqIN¥Nr}DcÚ“h\5B”q %îNï)ÜÓqýwŠN·8pœ«û†Þ‘S³â±X I•^r‰.\I‘å· ¤ÉÖÂ]- ozi"2}ÂÔKƒ©”­ª”%]t·Þ‚úV­j ¥Nc)4“©K©J’¬jI¤Ô]DfF,NÙVlWé<ÙK—,Kž›XäìÒbÇ6cÇßkgx…k²Þ'JÝ>8…Z—i²jÐDºk[Ŷöõ ¸û(Q¥O!•(œSeƒÊ‰&IÁ‘™`ǽ©A“l&ݸܩEf4×&Ä•„>¤©Ä6‡¦Ö´‘“M™(•ÃIð<ðê-ËÒÍ¢ÛR`ƦËnK”ú”#5S"ºãÊ}·Ëª”£Þ·¥.6…!²I$Փɤá¶ÈU¬»’•En±:†ã,>JL¦–´¶ò m-HJiJˆË 2"ÏsÒFCø¬Y÷%–›M4“ïrCO6êÐñ–I§…›pø÷ "WáÀv›B«ÑiÐ_†Ç8¹Wª[Ho¡ÆÐQÚm1a¿­*Õ¨Ô{¦Ó¤ÒD]Ñäó‚ʪí&Ù![t•²¨— ÄxʥƌÛMÇKß S­¸ùåÄáÇ2fZ¸$óª¤IÂͳ+Ъqi³M"I¸”•X©m AehqÃsCk.ÊÍ'“"ÆL†u È—\ÚŠìÄ›TgS8o&læ¸Å¿&”’Q©´Èq9ø-à׃ÒX訷d»WÈêW PS‹’ë°qÖrYB‚x‰Î< f¤d:x`÷U›ª„ÖÛZ¾èê©K„u¬ºÄ¸ÈaÄ+”›¦Ñiqd¢"ÁŒË&gÜ–8ÍÙ7&Ù¬2©„–cJ(n²Ëˇ1™(%¼Fm’TÒ”KÎ ²“2#àx>_S…&›R•N˜„·&+Ëeä¥iY%i3Jˆ”“2>$|HÌ…“²‰Tú%bè¬SÚQ· SIâ“22X4JCˆv)-)ZÒJ7Û$‘j3Ru ‰^âÖãŠqÅ–£3RŒòfgÖ%6Ø,›GdÒn²j²Ûî]öýëh}m'WtZµš;Ÿƒ“Éudrí:üKyºûðR˜% ÔO¶n% 3$-Mµ¡ 2<)I">£1ÕZÛG]E™§f¢—Kä§XކÐg'qR~Ztdú’ñc&œ«$|ŒbÕ®Ê$›jfáª<ÔiiZ[h(Í7ØÃˆY+R”¢Œßri,j_É §+’i³.Wjò)(¦ælj»TW›ß·ÜÌuN% gV&Ë…¨Iiâe’Ì˲î“ E–ÌêžNnv§ å²ÊзMÍ ­<еˆÌ‹2#ï;aZ \ª¯Eb¸·§^0.9­¸ÃD–’ʤ)Ö[2põž§û•œ—I':òm^;ö5*†H{•D©Í–âÌ‹A¡æ¢¡$Gœä…ç‡ZxŸJrd[—gõŠUûQ´¢= ¢ìGĆæ°M“M­IÞ:¢pÒÁ÷948¢4äˆúK8,»–UV}1ºrS&žRNÉi´$Õð–¥TkÉi$™š¿³‘ÕñAch×~-T•—ŽYJ¥F¨n;!/™!—V¦ßJTÚK*ÐfF|dF1eÝô:¼šäZÛõeÁšôØ“ v]Õ•²†Í”[m CŠ"Òg£Jx/•äIÌ_Ô˜Ô ê¿B†·\N©ÉˆÊ25© º¤$ÔdDFx"οÀL[N¿*Þr¾ÄªiZÍFûdâƒ"ZÒÑ«ZГ<’“"ë2U£Wïªývn5F§&[)tˆ–”8ê–’Q™àË83ÿÐÒ®Ê$knýª<Ó©©šCh8η$ßË«Y«RT’’çrI<éGÁ‰»² ÒÔì›–›Dç™D=ÃLÓ)•¸–_JTÓ†ÚTk$(–’ÔeŒž“<ðèíªWm:IWI Ë.p¶i´–u%=Ëѹµ+ºàƒä®`Ë'Ý'$Y0ߌ7Ç¥LÍ# шïXËtb;Ö6Àá#ÑŠïAŒ§F+½6Àã#ß‚c¬d;ðLd[S#×bH¬°ì˜ ¸N<ÃDYx“Ä‘ÄË£"#>’#3"3, qàqgAØb\äpŠ{0æ7Nç:»óe+4î’d„)f£%¶g‚Q™º”àŒ;–Âi74ˆê4š]::”oÌ’ûŠar$CixJ’•¨÷‹Þ¨¸i"#>äˆhéWZ“[­N®Ä]MŠã+f¢ÛO“ Q)ÔÉÎðtWµ’ÌHGU¤Ì§Qè´¹Ò %ç!²~4}oS§Jžwà’²Z˹$àzÔ¬$ÒlÙê—6”õiÈõ%)…N5)N´ñ¬’‚=Hk*Ê’ZZ‹ ‰×‡)çóvŽr À£þ»;¾MÈÿKðxê䟆7'§Žæ¡´x¹MZÈ)òëÑ+µ¿3zÌ—™'µ ›ÐZ[Y¼£Á©FYQdÈËM‰43-ØTg©Óªu6ª´Iky¢³É¸ÒRjkôÈI¥Dko&i2ÂÈËW@þ¯="-\¤5Q†ÍLßICžòu)hÐDêV” ”…š”’îK‹k.#£¯í.›_›o•vƒW¬S©%I[ êžvB^CDMowE¡ SYÂSƒ#Æò£æoúý2ä©¢£ Z4ƒ#K¼¶¢Ô„ˆ†’Û iI‘$²XÁ8Ê¿2hÀßB{àZËÙ½mÃQ¶©Š«Å—G›,Ú”µ¡q_K²[¼B 6ËS©ZrµêAä…R;ê–ÐÐýº$X^@µ4RZrSdÊ•î-)ܶjB þ»”÷\5•ùgE³m«ªŸ¸®R©på½J*u(ñÍ÷ù,‡™J_[Im“RØ$)+%iÞ'‰äxS­*ö•oЪTÜJUmÖb0ëYYqÇÉò$6Á´âGƒl‹9éYt ;ƒh V‡L™³:ÓÛé Ô«k“%Õ†É/hI!(%¬ÒDƒ,¨õj.ú¡ß4 Mnß}‹b tÊÅTaÆçdkeF·]6 ”Œ0„èJß՜涑&–¦Qk*p*lTIS&K†üiHm .Ôv£ ¹U¡;*·O“"TGXžlF5¼úß=ë:k-n(¸-IO$CUÙ¬NlÞó¹ÿš¹§œ9_è¹>ïsÎŒï7?£Õ¯ã§±H¤9 㩺ÓÓ§¹,ŸhÖ‡Û‘©¶TÞ©Ö£%)eÀȈˆÃñÆÿ³éÖͯD}¹r¬;.\:³j4î˜y¦ã9»F 9IHÒ¼™÷I¨tª«NÈÝ!-D®:Ã.²ÓHi ÉI$ÍòÂ2fJA¨Ô¬ŸÅ^+’4‹FÛ]àõ=5µÖY"$Šƒ/4ˆ±7KZMÕ4hR–ÚRj=hÁjéÆO+° WaüéÈ® Ï3ó‡?ëG6ï÷z¹.ׯô9Þg_8qoÊ ´±*ÖõaÊVK²*õ†£*i­ÃY ÉQœ4¶FdzIXQñ<á$Ÿ¿`óy¸T)Xænfßó‰ò]Æçs«“èνs¯N¾ïND~ n®žÒ]¯±I´!Ê~+õ¦éíUÊâ‡RaM¸á¶ÚÖÔvÒ¦MfiQkW|°fy-5F‹gµGEÇÆå&<äÄËóiÙiqn_iÍÉ¥ª;¤¤šW8Õœ™y@½i´8ý¥o½LžûŒ-ç¤T9JM<‡Ò–‘¡&’Þ4ÙåJYá8Ïs®‹iøÉ¦1k·H~o.žÃ5T›®º”--¥·É“m£x¼¡fd£#WA‘)>-…FÔ.»y§¥*—o?-KQºÚq–¤(#qz[Aš–K<%%©XáÏ_”ˆôZÊ#E6NGK¤Ü™ŒË%™áM¾ÉA‘D\r\q“ÜV/ZDëÚ¹\j5ª}À—yÒ •4­jSïÌÚt™N‚%¥³"RWðO&¢<Šî­Ç¬»¨0ŸM†Pâ0ãûç źfµéI)F·Vy$¤¸‘p±_yŒÁ"ˆeÒ\§5Piuh²åÂ,ï‹%,8®Œ-HYžHŒ¸g%ÚÓ­kqt“bÔ[ªÈ¦ª¼ª‹qÚu9KšñÖX'ÔÔv¤¶ÚPÒTÚ¥­Òqfh3A‘7§R¸âgFr·"º¶V¶Ï 6^K¨Ï÷)&i?ñ#1ÒÛ·kVåЙÔXÕ6èéQ¨ =Q%9¨Ú4o7©m)Þ$ÔkB÷}Á’x8ë/Zçd—4ºÏ%8ÛòAhS›Åž„%–¼µ«N¥+©JQಠ÷õhRcT¥K‘Q[­RéñW*bÚ2%™„$ÌŒ‰KqHA³ƒ"1¤·jÑš³Y¡ÁC©uù'*¢âȈœ4‘¥”'Å)%-Y0ß•34Œ7F#½c-шïXÛ„ŒGF+½2®ôÛŒŒG~ Œ~±ïÁ1‘nOb•]‰R“‘Ât£­ZPµêàyN¬—Y–K9-qàqgVí§KKÜÙ2Jà.Lç ô¶Ú7ÜJÜq´¡„4kJMH7ZA–SÝ)ÌžC¡Ÿ³vë÷\ÔÒyr©tê]*]"Œ©NºãðZQ;¹A¤É*4¸µ¨Ï9?í)\kê5Ë:VP}˜õNqmmÏbnµ"RV²Yë4)*δ¥YJˆò’<œ»úlÚ¬Ù•%dY¬ÅiÚzÚu1Èã2L²´èq+J’‚>…c»Qc Hƒ2Îd½>\)5$0å6°ý:¨igYFCM8á¼]Ñj#KðîWÓdž’ͧC{œ+fwÔÊ\sqÆÍF’}åw,³’2>é\OG¡ 2èÝ"ñªÒb\1`µ ¦kì›RPLàš#QžZ"2$´u–•¨†šÆ»^JÞLò\U‚,–7¶™Zy-8Õ6‘bj±kLi•ïdË`œ$¸æ¥šO;ň’DgĈ²¬ÖÒ°?«²ÎE”º5Z¥«69O¡1jp\¦¼µ´”g)Ô£6òê ”“#Q‹¹2áM¡Â¦RèsÛ¦S©³'ó¹ç6„ C»Ç Y™¬”’qX"AðÕ‰U¾^žšs'nPY‡L™)ˆ†]Sn®BKšÍn)JýRLQ)&| °:Ë’ãr±itêM>œqˆ’æ‚qÍ$µšœZÖ¥6‚â£à’Ƥ÷\@O|A ï€ dÕ­Ú½³Ã~U5.Z}^žuyç ´7!™Nr5% O&5¨Œ”Fµ$Œ´ŠØuu¢^•Kbm»V¹*µ8Se÷9dçžQn‰xAjQ–ƒ5’ŒŒ*m³á¤VI¾ì)tÛZ®V¼9vu6P«9&Z[ƒ&a£¡¥¥„ºn¼æ„8òU©dDim³ƒÈÉz‹eÒÙbeÃI¶i“fAQ™)ófRÔHŒHVö+Ž9¯vrr’qDFM™‘jÀ¯ŠñªÚ›,Ã'PÇ%L]Ùœr¹Ü:Ló Ú3ONpfyÏ”õìNòXÇj[¥JŒ—tS ·Ín›zÜÖn›¤³Ý6Y' œ2:ádT+FÛ•{޲ųšÚbs{h™3›]'÷ÄN¤×%DGÒ4’‰fyÒ”™ túM-˜w½>M³L*NR….4Éš ÉDÙ©Í em¾¥§Z e¬²®N»î[¯)¹tJ4ªVᶤ­·S”¶¥©ƒC„á(”ã§«^Ox¼™ädFÚ©U]sí[~¤º³HŒù¿Ê‘¢3fɶ §ÐIB;XÙ%UúlÈOäïNyM°É- ÃiÕ¥=Ë{¼c´ãˆ›Hƒ”t‡áƨ4üø<¾:2j½6ÉgƒÁ“ÇÁž0fDdFYÉb ºDÒ§Ô–pâLJ2JbSf¶ÖFFFFDd}ÒFFGƒ##"1pw÷]:‰@f‹T•iRž—=tøWdÀ=*l›^õ·V¥+‹¤¦Ò÷àòYÒj•6‰Oº¡ÓjRU™ µÊ§T+ œþ\5¶n)Ô(”m“JÂÝÊT¥ õµô¤É¥Taȃk[­F‚Ûå‰;¶{A-ô¯}½Þá´+_rEÃDe¬;ªžsÝ|ì{lÙy)×J˜¤šÈÔ{ÂZ¤¤£Õƒ"^“Áe9,Žvd5ÁC·àöwGj…Ÿ¤ÓãN1O¾n°êß„Û$õ“n2[çI*4”F•j2ÀÅÙ]*q¸Ý&U½Nq´gÏvª¦æ¥¨õE`–[Õ%)øÛ¦fE“N¢Æm¡ºJ«.}«oT—Ue¸¯›ü©½›6M¦M>‚JqÚÁãW Œ_mÝ렵ȖýÊ”5âTiÎPµ‰DIp›Z’g’5¡FX.¢ ³°6ôWèØUš…FÌ¢·É#7 $ÆäM'Þšç¬Èä|—Q4ä’X"Q …›k\²—:×UœSâʼn*$—ß“5j}´ºÖ•š’≕-ym ‰eÝ‘]bLš !¶ËQ!8ëÉ&ÈÈÝqÃN¥¯'Äô¡ ,`ˆ’]y3êkJ~|š|Ö-Kz™>˜l:L5K.GºY-;¶Öúš,™qÊ&fgÄò%¦ ý¥[p)–§ ‘J˜ÝP¢3Í5UNiÆ´,×¾Q¸á6á#”ˆ×Ü‘ZŽŽàº×T¤*•‡G£DrJeÈD:[÷R•%*Q¸âðI'„§JKQðà˜¦–ò¯fìRç̪S*Tx“w”‰òYã%È®1 ÷¤hZRyZ’ZTX.Éçmb·h=j´Ì¶mG«ë¨QžL¸tŸ4«š-=o¨ízY*J¤G) ¾®JgŒ!&N‘­‚Â]5ÿ~LÏ0ÓaƒEv‡Û‡M¶¼Ôˆ“¢Ô¨·<¦”‡’”´iRb™“dÎ’3<«$dyÀÀ¦Ûh»3®L«FS·émU þ‘I(qùdfR¥$ S¤ò̉YÂR•Ã#-TòtiJ©ªF‘]ß¹!‡Zs•!Õ¬Öna+&Ô¢RŒÉJBŒ¸c ±üAÚ%éÞŸ@ì’ªý6d§òw§<¦Ød–…a´êÒžå½Þ1 ZqÄE¤I¶M:“^´'M…h¢â^f-æe<ëÕ *q¦TKQ¥fM©J56”LF]Ù÷¼(ö•¹@·^bœUIêgS-inkÍ3dI2<h[êNSƒY'9-De­¹6†íe1\nØ¢RfACh§Ë§=5§!j%$ÙIÈ6Ðy,™éÎLÕð¸›HºêTÚ}6¿Pv¿·¥“UGÝO)ÆÒÞ•ê_BI*4aI7dy> 0vɱè¢=^§K&)ò¦Êª¹÷‡£²Ñò„­Õg[ê5¡ R°„‘i5¯ö‰Ob V#‘ Ó#D—2]6CÎÆkNñ½ÿéSÅ“Jø’®Ž‚É;îRw£P¨±i !Ô*”Ûow‰ÓlÜ5šœ7LÌÚh󬌷iÆ04×5uúì˜î9$(ñ#”h±"¥DÓ ”­)Ô¥(ò¥­FjQ™šˆ˜§}àÔ€¹ˆ Ñlâ‰á»âS';»‰º~Kç½&òÛ,­å'Yä“’lËQ‘ã9êì+b…Pž™‘(v츧S•¥-¸ilêD•È4¸É¡Œõ6•š"2Ϻ…T“Fª3QˆM©Æµ¡ÔêCˆRM+B‹­*J”“.ñ˜é´ mbF PØ£îeÊJ[xã¼N-µ­JR7u™dòK#-Úq‚!I'}À±œ°­9t•Ef†Ìzü˜JqMÇ“!øí¾´¨£&ä¥4é“•’Ô³2Ô–ÍJIŠR¹Nz‘W“LfoFY¶æZq³Ô]%¥Ä¥Eÿ¬DÜ7§|TSqSêñéôØÍSâ.h !|Ü' Æø¬Ü=[çLÕ¯VVfFGŒj.zÔ«‚´íV[l4ãˆm´¶É!´6Ú[B¨ÌðHBK&fgŒ™™ñ¦¸ƒ:ͧC{œ+fwÔÊ\sqÆÍF’}åw,³’2>é\OG¡ 2è©û4©ÂTéï>¤ÛìDvSCh°úI¦œh´jÊMg":xžÜ<´™jMc]¯ƒ6á¦ß\™.kÉÈtËJ Ë‚B8q⥞{¬ꥴk–¡b³fHy“¥´Ó zÍ,­Õ¤ŒóŽ—H‡CM÷2ñrÞ–\z ŽÆ¬œé4ª‚i•VUtLIR\2&Õ¨÷ˆË.§Q’O(èÁ‘Ž¢™bP m§iÓ«\•x¬UáEÒ·hqäA•»[FkV¥%Ä#’L”i4š±’ãn«Ò¡pÀTYiÑMù%2sÑ›Z\› ’i']Ô£-XRø ’YZ1âåÝS]çVº÷QS:ªsä%*&ÑÊÛu·4¬– Õrgƒ"ÎzâÒ°1.ºLz]T¶ª)œüt’%©¶ðÛo—Ãm Éë$Ÿ X"3#ÆKz‘°¯U¤Ö§é¨k•iCΠŒ”úˆ±¼_+2ÆL±“,žLÌÏ^,€0001 $@‘“øwÀ>‚ì?öCjýÏðŽÈq»ýÚ¿F3ü#²‹Ø •(øàª¿®Xï{オþ¹cùÿE÷Œú4}Ò4r:¶O@ÙHèÙ=ߢ`¨kdtÕÉëI5rzÇ«@Ã3Y+¤kdt˜ÙJéÙ&=Z&9šçÆã1ñ†øô©™¤aº1ënŒGzÆØ$b:1]è1”èÅw ÆØdb;ðLcõŒ‡~ Œ~±®<,& X‚O¨@“êB{âO|{â÷Äž¡z„žð=á !H@ ê D ž¡'¨A€’$„'¨@ž¡$@‘“øwÀ>‚ì?öCjýÏðŽÈq»ýÚ¿F3ü#²‹Ø •(øàª¿®Xï{オþ¹cùÿE÷Œú4}Ò4r:¶O@ÙHèÙ=ߢ`¨kdtÕÉëI5rzÇ«@Ã3Y+¤kdt˜ÙJéÙ&=Z&9šçÆã1ñ†øô©™¤aº1ënŒGzÆØ$b:1]è1”èÅw ÆØdb;ðLcõŒ‡~ Œ~±®<,& X‚O¨@“êB{âO|{â÷Äž¡z„žð=á !H@ ê D ž¡'¨A€’$„'¨@ž¡$@‘“øwÀ>‚ì?öCjýÏðŽÈq»ýÚ¿F3ü#²‹Ø •(øàª¿®Xï{オþ¹cùÿE÷Œú4}Ò4r:¶O@ÙHèÙ=ߢ`¨kdtÕÉëI5rzÇ«@Ã3Y+¤kdt˜ÙJéÙ&=Z&9šçÆã1ñ†øô©™¤aº1ënŒGzÆØ$b:1]è1”èÅw ÆØdb;ðLcõŒ‡~ Œ~±®<,& X‚O¨@“êB{âO|{â÷Äž¡z„žð=á !H@ ê D ž¡'¨A€’$„'¨@ž¡$@‘“øwÀ>‹lz}µBØ —R¯È¦AaÊ[D¹3¥›Ôf¢"ÔkJs„ô ‹úñ·Õ²«®½eThsåÓiÏ-¹¦’Žîƒ4™‘-IÉt‘(ŒHË€ä¬;¿f=¡íkFñ¸è)ÞÐZnd2’KJTjQ‹9IàÒ¢è>)2ê1§».Ûû¯Ù–eÑDVio¡–Q1 vC¦“Ê”ÚZ¿.¢Ë®@X©ù¦À´çÝ6êëR¯‹’ŽTg2LEL2i´3-æE®:•ðPž•ÂöHÂÏ+½îu÷µO?þÔlvûƒ!­ÚÌÊËö^Ñ"=x9 Š(á”w˜š9 *S®ž‚2SŠqM§w¡$¤ø#¢¬\UÅV*t†ªÜÞÛ·[–¦“-š¡°ªc2L“©&“R5 d®.—ÁE>Õ‘Éu0aÔ3é¹+gþ0©žÈ?“ØU¾}7 `ÿè4Ïd6Ì*U9¯]PªU­.¸p£ÉÝ6ƒÝ”XË4«vD“Q-Å’9àE‚.ÈNª ’ÈŒrêT§°kpúkÕcÿ RýŒ'°Khúk•SÿÝô¿cà ÁƒêT'°\úk5?7RýŒAûŸíSé«Ô¼ÛKö1o€œ+¡e>~çËLújµ6Ò½Œ'îz´O¦©?Í”¯c ²)Ã÷#«ˆÒš‹Oµ8·M-$’Fµ¨Öµ`ºÔ¥)F}ffgÄǸ4¬Pèl&rX´èm&¡ý4‘ ²)=¤Áw¿#"ŸŸN5>Þ¥Db¦ìf˜Ž„%…šTƒR¸%F•©9.8Q—Y5šE"µ%2«½¢úS)v\FÝZ[Q)j#=&Fy.ƒÉJœÕS!ɤ@[3C³¨í­2’A~”FKÊ[Jrdg¤ˆˆË˜4–"=°Äæ)PÛi©’ÎRÐIBƒÝ¡²J‚JR’Ch",uq3>#uËæx;_ódåó<¿¯ù‡/™àíýÌH#—Ìðvþ¿æ¾gƒ·õÿ1 @Ž_3ÁÛúÿ˜rùžß×üÄ€Y9|ÏoëþaËæx;_ódåó<¿¯ù‡/™àíýÌH#—Ìðvþ¿æ¾gƒ·õÿ1 @Ž_3ÁÛúÿ˜rùžß×üÄ€Y9|ÏoëþaËæx;_ódåó<¿¯ùhReÉšÄsi´®%®9â ²s­ rf%Z]Cp²mÇ)ôIRÚ%R­;ƉH3Â’x#áž#úåôz-?ÕG¹ûúƒqý$ïû«ÝÐQÿ6ŸþD/R qèVÅ.¦Ã—Ó¾2½è´ÿV<^¨ÆZ\Lä8ó o”3.›"Ї Í "tˆÔFm(¸w ¥3ý3OÿÒSÿÈÇ÷vÿ\*ÿGSÚϲ,k'Öù}ûéîu¡²&Ù[‹R–¢JRINTfjQXòM}Ýë-¹L«Gß<Û\ŠD¦[ÖâÉ#ZÐINT¢,™‘dÆ%Oõ”Ϧ)ßïŒíÏýÓß÷Ö¨¦.xóƒßñ[úñsäÿa¦Õßêÿê1G¬í~á@õåó<¿¯ùt˲)+2£JŒú1©·e¡ NK%’5d¸Ù úîÿøÓEþäÀY©ìÚòÍïÍþa±‡Y\ØÈ“ ãIayÒãNÒ¬GƒâFCóæÑ¨Õý_À,ÏsÇìZØÿÑøÔ@ïy|ÏoëþaËæx;_ódåó<¿¯ù‡/™àíýÌH#—Ìðvþ¿æ¾gƒ·õÿ1 @Ž_3ÁÛúÿ˜rùžß×üÄ€Y9|ÏoëþaËæx;_ódåó<¿¯ù‡/™àíýÌH#—Ìðvþ¿æ¾gƒ·õÿ1 @Ž_3ÁÛúÿ˜rùžß×üÄ€Y9|ÏoëþaËæx;_ódåó<¿¯ù‡/™àíýÌH#—Ìðvþ¿æ¾gƒ·õÿ1 @Ž_3ÁÛúÿ˜þSQ”¬ée¥c§ þcUzV'æñçí¿ëd?£ÕÿÍ#m T£*·àyúFžèé4èa¾.w;~_3ÁÛúÿ˜rùžß×üÄ€Ådzrùžß×ü×Ìðvþ¿æ$ÈËæx;_ó_3ÁÛúÿ˜ G/™àíýÌ9|Ïoëþb@,¾gƒ·õÿ0åó<¿¯ù‰²rùžß×ü×Ìðvþ¿æ$ÈËæx;_ó_3ÁÛúÿ˜ G/™àíýÌ9|Ïoëþb@,¾gƒ·õÿ0åó<¿¯ù‰²rùžß×ü×Ìðvþ¿æ$ÈËæx;_ó_3ÁÛúÿ˜ G/™àíýÌ9|Ïoëþb@,¾gƒ·õÿ0åó<¿¯ù‰²rùžß×ü×Ìðvþ¿æ$ÈËæx;_ó_3ÁÛúÿ˜ G/™àíýÌ9|Ïoëþb@,¾gƒ·õÿ0åó<¿¯ù‰²rùžß×ü×Ìðvþ¿æ$ÈËæx;_ó_3ÁÛúÿ˜ jîXНÓãA˜Ú›n=F-EÒÈ”nGtœAsÜ™—éÇAÉ’oH}N¼Á(Ͳl“«‚K9<‰’sÿšC,#F¥¤ÓtªÆñ|QxT•9)EÙ£QJ§5MªÌ©GŠ¥H™»ÞïRÒZÉ:Rg„ôžqŒõ„g¤Ç\ƒm„’^yOhÉiA«‰?Üjʸ犫^à8èþÏÑ´gŠŒvKô[’ý T¯R§çw6½—V<'Ô˜¨Ó‘ÿÙxymon-4.3.28/docs/xymonprocs.png0000664000076400007640000024010611535414771017104 0ustar rpmbuildrpmbuild‰PNG  IHDRlÔ™˜àt pHYs  ÒÝ~ü€IDATxÚìýhSÙ¾ÿ§çöp‰(ŸÄ«Ðý`zš0š0Â5=wR=`ª&*LS=œ4LÛñ0môòu’8im*Çi;0ÚxQa´ñÍÌ$¾ùxHä(MAßI9Ý…ñcr¯bzL>œB¿¼Ì¸;iÚ½³³cªÏ¸§³³öÚ¯õZ¯×k¯½öúQ“lJŽ$›$ #©ó_ޤ~EÄ‘ÑAG$@tÐ tDD‘` ²áÜL6<è;môI$³hð‡wGäD÷-ÝÆU;ÖWWmÿµq•aRÿÐ0éiÐ{Ú+_Óž]¿3í©Nåªn¯ïRÝ&-å;ÖWMtǶMt—÷^êϨWˆ¡çLOÊ9c”ïXm”K$µr15fÚý¾y(œ¹9Îþ:’úÊ>’ê=:Õ5ZùÚ/¬M²üñÀµ»ã·3|¨W¨?ŸouÕ†ßqõ{¿c¾nÿµq¯N™…ÄÒꌇ‹Û‰x±k¹X)¼=Ô$›’#É&îPçËà…¡}ƒtí-‡Î3¹?frjé†Ój)ÔJÐ 0ó‚9Ƽ 3Ý­w":çÌñœs&üôæ?ÃOËw¯gÔ+˜Žäïµk8ÿåXCDwgKDç½pú?¼Ø¿šö|°Ñ´Ç9}<çœ6Lè2L¼ÞÚL$ ÆUü߯U‰ë÷v&®Ã«‡pæû'á uêmºxnl“Â%ß®p¥™›i§ujßaëT÷ðÑD÷°Q¾½Ö(¯&­¾ ¾ÌÝNÄ.o5[)¼=Œ¤Î9’â="’^ãUU›*Â>_Ø™v>¹švZ§,‡­Sìñ€ñà½]ñà|Q¾îI&·ýÃ0I)©Ë‰Ë¯…£]¨{ˆÆÔäÓïúiŸ'ó õçêÔUA²i¶Þ×P†J7Ll{f˜`r˜\iºÊw~½‘êª?!sÕÞ«P3Lnæ8“Ë_»cq•«¾Oåª/‘Ä]º u­Rêl-M?&ó®wMæpæûÇá {8•:iH}4°» ˸¸µ”—´óÙdÚ©–®ûd¾ås·@î5B%¥ òT"¶­’ žgç@µ9_3»~gÚ3¸ñãxÀ:uðÏÅëšK-gÃÏcÙ0;Ï×kKƒ¾!Ë ÏUwBꪣ.H:OÓùü‚Ådx%maÝ-ni¥i›ÎäÂÏ'saú›o¤*ôî×r·F±),…ë-–?—ZP^xwDÚ”‡†lJãªíµÆU¶µ‡ÏÚÖŽ5\üj¬¡põÀîÑžT÷h‡åO;,4úoðÂé/8öwÞvìg§ô´ŸÔxÚǯ\ûÛøJI#˜¸üZH÷hÏwZã–CÖ8¥§¿é<;e.<›É…ÕRõ µ4üôûÇá§#Îýiä‘sæ„Ì9#†ºi¯Æ´á´ÆTš®¨6e[ŸMI)ÕÒ§ÕÒ\87“ /~wçÌñÿÏ9Óa9<Ôa¡òjLOkL…×r—‡t¨õhoi=”'u¶–¦ê$Òy¶Þ×yÆß?ÉwfùüŽÖÁÝ;Zϯµp‡JšŸ”½í†ÉæUï¯i^E]Z¥Y ÷¡»«"ªT‘à•‚WÆ6~6¶‰|l˜}¾Ð†=mzO[¤ñÖo#$•§íä&O[ûÚ¶/Ú×vXþä›_×Ý£G§òÒ.^Ëôq¢uhß[‡º‡?v·˜?ØÐb~½¶뾿+Ö͵ÍFçÙzOçI§$‚…2hLšóIK¾VXwKD­’´Mg¤Æ•R#{Ä´HÅýZîÖ(Äw \Vžb½ÅäáRËÊ ï©Ù¡ñJc ¾sc jéÆ3j){:­f§æ¼f§*¢üÅØÉ´óy,íŒuÞÙë¤3Ô™B¯»æÁÝ¿7¶îÚÚ:H+.þká´;¿¿~oWüºÌ(­“éEW³sË5ÍÎÄõÄüÚüµ4%ðÕê‡åš*H« R·#•:eH}2Œ_ùöoãWØ]$ÜuE)':cÛ&:Ù¥ËËÌÖWÍ^Ë]*c²‰9–l*× ’´~Øò^Úç½@ƒNÿÇà…Ó–k ¦be\ÜZ„Px/’FÞìW¿ Øù[ ×)f«yýÿÔ?ß‹ m˜Vw¥1n)Ó«)ƒÔX+—Á©ƒ‰ Æ´é›ùãìº.VË$•ZZwB-¥Ù®Ã×eKy $Ì×X¡lì!¦_<82ýbñº[ÜÒ„h»°î¸Gª…¼žûµ\­Q¸ï,n«…é…éó—¹q¯e傦f×–v1u=¨ãuuÜ<¸û’yP7°õ±n 0åø•Ưä_ö$‰DÒ)Ù,éœ'Ê£sy±D×G,~ÝåË~ÝØïðØPÀ~ùRÀ¾ø¯åP…X°Ð«òË‘M’͒Αº¯3Rçõ1y}#’ÑÏFx몒p‘‡Ê(yQ+—”mý5“ùƒ&³s 'å )–¹µ¹³¹µì.È¢f-ºµ¼‚6ð±uÛwÙº%É‘JÔÉ/mUj”ÖI’ÉRúwìÿø†c?Ó5ný­®Qòtö±ä©J²^¢’иyù³êzñZÖz¶ÞÓz‚Æïë‚FCÝ6©¡®lIëÙ|M뙘Ž%'¦iü#ûWÚ0JS¿é}M½äºä; Å-Mˆ¶Å‰Tân3%6âè@¥á=5»pÕ¶D0q0T¸V›ó«°´„¯áüI_û|ážÑ´2­ýçª;ñW]"xW~Êäâ¿b˜Ð?4LW¿¼Üw¬áò屚ðûzÕmS~ÔgS& ÉѤ½Šw]Q)Ø¥£ñƒ4Ùpñ»“f‚‚?Oy¾vg¡k¹Ë#Ô]e˜ØöÜ0áØÿñÿrì7îÞaär-_kÒRK×uÎ_#’»r¯áü¼ºëGù‘‰#©ó'GRr—üßå.ú›žF=sɹ¿íä¦þ6Z ’&,Wƒ-Ù”‡‡lJZÊÎÖíï°Ø}Káµ…þE5ÅÝÒ„hûe‡lÅ©¤5Vƒõr©eå…wGd~‹ýÃü¦´Üà…¦Áy{Ó^´r~e=ýCÃdû)Cÿ¼®ŠŽýGþWÇ~JÓ¼êƒÿ»yíŒÌå×BÛ D"I >àÍ#""B#"EÄ‘ÑAG$@tÐ tDD§–ö¬"âQ“lJŽ$› €xÔÌÍÍÍÍÍAñ¨¥ÿ´zÍ;Z½P \ø;ßû;b]“Ûb]µìŽ«?P@…ó°k¹$¼yø4Ïù4•¹W-Ô ÀÛŒÉüÁF“Y"™MK$¹0ý›Í¼ú}6#‘dó™løç3éü_¹ðl&f§ŒußÛë.¼Ë¯ h€Ø # :UÑIûæÈšejYórÌ¿:txws¬«¦¦¦¦¦†=8öuå/Džj«/±uûfà°Ú/:¬Tkå­;èþû€7ƒªèˆÔö7ÞÒögCY&ZŽùWž–VÓÆ–V·ú ¥[ýæ%ßúJŒOHŒëú·Þ×õ—W’@ÇåËÓž]¿3í¡3 ÷³Âmˆm{nˆ¡SƒHé¤ô^ßY‹×7Ñ{o¢óMò5ðöø;€Å©_¡þ¼~…05{™A£{"ºèºˆ®køÈ®aè$~Ë…cÝw·ÄºËÕ9˜éÍÜÌôZ§µN9§gÓt>Ù”M6¹êŽg]uÐüKž\MèoMˆӚè,/°8ªÛë»T·éo!Ý‘KtDÒX''k~G+kV¸ÛîvU[_»*Ê1¹ưôÛNéûmª¨ªM¥ wªèúNUt$ùuÏH’’ò¤4\¦Î±'ÙÑhµz™úD½Œrhõ~øa«WHþ|å'h„N½lã™z™Øïœ9!sÎtwF»‡¥Í+µÒ&3zÇÎZ¼c4vŽŽ«ß:ÊU¿nõ—·:¯Ÿw´²fkâàQkBxz¾õE) “Ûþa˜ü9]>!“=“†‡IC.œ›É…už-×t:/m®•K›ŠkŒ ‰¤VQj=²-9?©ù­¬™Æy¥ô©Ñ”¾\öɲ‡f…±¶YA–@ù7+Þ_Ó¬`²?a² é_ÿp!ý³SæBÏc¹ùˆOsñœOÃþµ¥õ[[ZIÂäO¦ô$-[3Ý#GÝ#…Å7žP)È;òúYØž…Ô/_àïåZàí´nñŠ¦Ï¿£•5Ö#Ù•úàÍCu[eËwA²©_±qw䑦=»ß7í‘»Vï–»Ò=éæÅƒ#Ì‹x0q0ìí¼Ý=ÊNO/ºt>`¿|)`§ w‰ë±÷×uí­|‡‘ =‹eC‘Æ[¿4ò}¬áò屆‰Î;›óSAÓGãù‘k¥åÏW~‚Fè0¹?frâÐIŒßß•gnΆ3–#7:,ÅRfœ™›gº÷q ÝÛa94Ôaé=:5¿¦J«_‚~e^0ǘɦŸ’MLîÁÇL®Ø]¸§ç[_T;ìôÙг‰lˆÎ ™ ¬–n8­–’fFR£=#©—ušÍäÊ<éXQ}¤ŠPÙ5¦§5¦®ÑÎÛ]£å²Oîdó™lØU×§tÕ¥{Ó7Ó½éžt8Ý£Œ(?RFZ‡öý±uˆ»þÙ)©ÓÜo¿|ÉoïØÿñÿêØÏdgŽ3YïØ™¼cIÃOIÃàØéÿ"¿uÊrØ:¥Œ¬Þ­Œä‰ë÷v%®Gt·Þ‰è„Ç!ËäfŽ39æsœyA^CWÌ_¸×oiÀß…ûûÛl?\ é󪈲M nü Ì/ûůÆ,ñ}‡-qè€7‰b]lxwGÎÍÍÍÍÍ™wÿÞ<È>“lJŽ$›èÌô æØô‹9~{à;¿^hÙçóWÕÊ%’áG£Ÿ ?Êþðl"ûÃÜ¢LtÞù·‰ÎüÝÿù”[ÊøõÄþøõ9pÏ¿4ù¹ãihò´)#ë>QF¨s§kø“H×p²é§þdÝ«køÓx×páµæÁ½{̓½ÓŸ%{§/cºç±?ÝCç#ÑÍ¿´/TR®õËÎ_Œô¥ÕWi鹿~ogüºÖÓøÿhó#"Ò:©‘ü…j­´œÙ2S]Ðùñ+Á¿_‘»äÿ¾fĶÏbä»~jåó­¨4ý^8ýƒ4¦ÍßjLd…Â7.ö\˜÷xB>E)iLö¯¡§ßýOèi1ûç^¿¥Ùü]xú·Í~JÃUwâ7®:zÑ™ìÙéì¹?‘¡ª±M¾¿Œm¢Ô~N6=ö'›¨=œ?þÔŸl¢{þøÀ‘?R›<¼·3~òdß…ZãEGD& ©¯ó뾩eë>QÏ›r¥–®ÿD-Í8Ÿ\Í8Ùç•Qe›2ê·_ºä·ûΟô5(úTmо†Íù†– ÿƃ ¿\ý²b¬F'¶üICr4i`^$0/××UU›*b˜ÜþkäzÅÆ3êjéúNµ”}Mýn<º‡&º—XRî–o—»ógµr©1ÿ˫њ¥ÕoeÒWš–Í×4-#¾úÓÈ#:C]r4‚Æ<´÷CóP9¬nõneôå׆ȚݪHÆ™ùß iFlû ú¯Ý ú 1ýCCŒ=uÑ¸êƒÆUÉl¦Zµ)?ê³)i\’Q¾½Ö(WËêN¨MêäbÏBâ ;Ãä¶ç†Éü´âw´²æ–=æ÷[öÐÈh!õ[ðwá¼ÍöÞؾøôvK|ß!K<¸v' iÎÇÕïiÓ7“¦eÓùRŸÈo³þxÛ(Ú©Š(?REèo&ûðÔüµá˜ÜO§˜ (¼ÖìݽÃì ¥Ã³¡t6”gCÖ¸å5N¯ª_)âÉï±Ôxl4M•ººF>MtLg™Î&õÉѤ¾ÃzäFǼ•ò\õ'd®úËŸ|v§ƒ„Ô¯ØéùSúZ|¡)нÓÇr½ÓQÝíõQðø8ô^hò^X(m)öÉšMk˜Z§þÙ:E9SÙMæ][Mf!e¤]wi»Ò›´Yª–6ëcMõ1ƒÙ:´{Gë" ¤ O®¦ Š>…QѧÐÞÒ ´˜MZ~–¿ôñt~»ïœß.3JëdFZHág‹}n˜L§$‚ÂêW\àï°áP·cT÷×w¢:ýDÓOú ªá9Cÿ¼ ÔЂ‘­^óŽVoÀqõ‡€ƒÎ@5¯Ö°s˵†´³-f*O¬ëîæX—n`ëÿÑ ÐV Â'‡Š‘'ô_ŒpúûÇá4M<§i˜ËÑfìçíú@l|š‹ç|1r¶$ö¶$èo¢T uW'4B-zvBü—.°8Úþwïkûçúç$sýÐF5CÉikI0ÝC_~è2Gví6G %ûþ…hLšóS~ñ7úGÔÊ_¥Zà×_|¶—kå2c8ske8Sx—_AÑ€7ZéÒ¶öÐYÛZšJISƒå.ùv¹Ë{ah&TØôx}`j6o)45[Œ‘…S³1" :興:"¢ƒŽH¿`6-‘ÈšejY3kjjjjjè<äuÝÝëO'|ó"­ÒBZ‚Ý¿,w{€-ÅrÏÕeÀaµ_tXÙUÍñáíí±×Ð@<–èˆlWµõµ«êeêõ2r …{Yá¦ó™ÞÌÍL/;=;ÐÌ:¿VÔÔÐ>˜…ŽZ˜¾{äh¢{¤˜csIODµ·×Eµ†˜þ¡!–OÿŽVÖÜÒú‡­-­Lvæ8“¢>'s<çdØúihÑœoh §oΆÑXª:(ÄbÛžçíAáVlW¸é “ýñˆ0{xÛÈ…žÇr!kÂrØš Ï¢øàdzRN¦òù‹-O1ZZMÝê/”nõr¬Ç…ä¯UH$ÙP–Ɇ"·~i\ne*§ü˽~GÛßxKÛOºâ’>1>u 1®ëßz_×}V«ÿVΪMþ·Ã¿–{|ÕBJÿp ¥÷úÎZ¼¾‰ÎØ{‹ÛjåãÃÛOÐ{³ëwqÐ[î”WŸÂëwD‡Å–»Vƕ׎Ž+5-›M ½êÛ̇ÏÚÌ­óñVCÈž ¹)}1çiõ~øa«WY½[)ü5z6‘ î³S .éINãªkŒ«œæžwæs+ar¡ÜL.d[k¿h[Û:´{GëÐDWL2ÑUšúdÆ_ËeÆHã­¾H£2´ŽQ†¨ËÃ:e9lJê“£I=ܲÈ…rÌÏö0xt«s0º9yiEÔa-‰Ô¶I"Ðwû;£Žý©\j4•K_IÞI_É8373NƒkÛ9ƒK=­N©§mªCC6Ueò[žBèID]Ñùí—üöåUƒË]~è§òäÂÏc¹plàî–Ø€¤kö©¤‹û³ú„}ÂÄó/ø’4<¹š4HnK$’Ûš– §5-Ë·,ˆ‡o6ÐO!h½Ùöù6´–é±Ôxlš–Í×ò'ióJ­´Ùa±û–pæÖ;áÌâ9¤ô©Ñ”>à¸ú}ÀaS²)+S0&7sœÉåÂÏ'sá®á#7º†©òH~›ò£>›2Ö}ÿ±n!wéeŽåzet]§2Jg Ûž&2Î籌nY=0¹?frç“«g‡åO¾ Û™õ±¦‡ú˜ZVwB-ƒ®¸1›–HÆÎ9Öàª;!uÕ‘g‘/tX>¾ÑañúÎÙ½¾Â+é O½lã™zYùò/]!8gNÈœ3ÝÃÑîaº#/65ƒË”~Û)}¿MUµ©¢4nW]ß©ŠŽ$¿îI²S²s t\¾è`ΦÏ?¥É_4¶‚¾æG¤*¶çGÐÓÇvúLï“@¦—äd§/6ÂòoVk›”’JÚ¬xM³BŒÍ\ôã;kñŽÑØ[::®~è®­þRãVçíá­¬Ùš8xÔšžž~å>UŠR&·ýÃ0ùsºù³„ë“»ýÓçFÒ^Þ+/wÉOzG+k.̇ꗮ­Œs‰Ÿ|Ÿ_¥ÙßøÏתҞw\ì¹4ýçíMÿp!{[(=?{¦·?².v$§òŠ1‘í1!ñí1´Ç„Ø?Úc‹ë“¯<|ë·´çi5Pâ‘áÌÍÙpF?ñî=ýÄâ)GR_ÙGRZOã-­‡†¦QE×w©¢¤²|•<åŠKæ’^Ó²éM‹ÖÓøÿh=4é€\šRޤ¾îIÙ”>-_Ç(MTï=:Õ=êiëSzÚª¹âß6ÔÒºj©Ü%ÿw¹«uÈr¸u(è¿ñ è/\^p–5È…s3¹°2¢üHiõšwäÃ4ù{"xW"Xx-}á¡®ábZ¾ù ‘§4ã÷w%Æ)vXŽÜè°Ï“FÝ£·»GöË—vcž¸{/q]çÑÞÒyŠ];ÖpùòXÃDçÍù©UÎé£qçt%å7íÙý¾i£O÷<¤{˜Ž0/âÁÄÁxÊÅNß:dùcëýîIަ{Ò½é^£|Ûs£¼0ÿlx6“ »êú”®ºtoúfº7Ý“§{^ÖøÐ¾Ÿs«dýÒ¨[’¼Ãrh¨ÃBOáú!èWæsŒy‘lúi ÙÄä|ÌäŠÝ…{úlèYŒÏT©Â©U4;Î/>™ˆ‹>ùÚ¿uêàQë}td^0Ç™¤Uª‘búäâ/ÔVQE”mªH0pãÇ``þµ¿k°Ä÷¶Ä+#ûÏòñ<ÇäÂ\ìþ%žqÊ¿"ñ“»=ðÿ|í¡Úà[ÞÒì™»þ··…Òó³gš¦Œ¬Þ­Œ¥%®ßÛ•¸ÑÝz'¢+LŸïˆYú($žpí1´ÇÞÔçÚc•oñ•‡oý–ö<­ ææææææÌƒ»odŸ)FèéwÿzJ®¿žØ¿¾xzedÝ'ÊÈð£s~Ä>O‹C²é§þd“~â½gú K|ß!K\HzbúslúÉÀ.µ~¢é'ýDö‡ìtö‡¹2Ayv éžU Ù%~àSKœ–y{xï™~‚‹=‚Ö"í‘—©¥N«¥ù_ïü[þ×Êä/¶<…˜÷î5öN–ì^H~öÿùt©óù˜–I6I$µr‰døÑègò?<›(£Ø¹ñµÞÅåçR–…$¥ö¯~{à;¿ž ¥à˜Ÿž/ùGu­|¡úå"¿úM÷<ö§{ò’Dÿ5ßh¢vþb¤¢1ôÉ×þIç$ù>ûWv+Eˆ¿¸êNüÆUG’Ój3HÒ:©‘Ceä)Í>Ű¾öÿÏ¿JóÇÅã'ßç—°úZ:þ ··× ßò ±g¾úÃÞ¸È/Äb…Ä´ÇÐC{ í±J¶ÇJ“§Tê¿ÄØ&ß_Æ6‘´÷vNtƯßÛ¿ž?&ö¿:>pįÓ}óGæØü#õ×QžóK{o¢“LjHAF}®Á+×þ¼¢iÙt¾øz"Aÿµ;A?õõZã>µÎë«–»åÛånv4‰ÒUw<몣©ÜBÒÓH«æU;Ö4¯¢‰äT…Ô¡©–n<­–¶}øa9¾ØÐTÓ¨îöú¨Ž¦…Vußó[ ÙϘ曓cZÁ“œDáRlW¸Z‡ö~X¾/xo6r×ÊF¹‹þV¸äÛ®éìƒ#Ó/'b¤Ï&ÓNz¹Û?[Ÿ†ÉmÏ “ìñ2-{Ìï·ì¡‘×Bü…>p×î4—‚ZÓ¦o4&vk¤2ò”fŸbÛû‡U•‰Ÿüë‹ß’8|í/…›a OÏ·¼BìYlýp‹üåºÚcÂíí1îþ…öÚc|õ)\>þ¾ü–˜ãÔI³å­Sÿl ?½ñ÷ðSZSoñ«úÛϘúÛmÊGmJi³T-­èVô‰ñ?NŒÓôOö‘¤¨k²pˆ¯´žwïi=Â×õ•„œÖ9}4áœNïÿ¡|Swß½Q×^á”g:£1m¾¦1U&±åaãª?!sÕÓJ£ìFÏ|^N˜ºDÏßìݽÃì ¥Ã³¡t6”gCÖ¸å5N*%ÿÂeÉ…f3 -š¡Š(?ÊoDÆdžš¿6“ûé“£/~ ¥Ÿ9¾ÔZB´Ú=°išt@“YƯ|{güJ>máëÖÒò ÓÏÒðÕϼ_ENÏ~KeóÕ'ûgë3ÙÄK6‘%Ì? ʪ–m8£–QÜ8®Ý 8h5n9<ÿÃjeä)MŸâÛƒØñþ%4>óŸ¥?¿ø××Òñ¿’°'¾qñY.éù–Wˆ=W\ä/¼ª°K·Ø‘’¢~táJ¤žø‰®;›KÝ}ˆ Ù$-»KѼenfz}çìƒ>êJ†®¸Q«Hh¤3-ÐKžE«Šô·èûÛ;,‡‡Z)ƒVÓ(\ZXXþ¥ËÃ׊èH×Ec‚iÃi‰&5Dµw·Dµt~¡±Û¯ ˤ/ù¥‹é!T+—H¤F©Z؈Nîò+K±7ôí”<È9s<çœ!ùÉ¿<í'5žvk|ïÞ|sÒå;VåÝ£=ÿÝ=š_çw6}ÏÎ?ÎÍdÃôVz%ÍÆÜõŸKÝõBä¢.ðÕ›bé‹­qÌ7=_T‘Õ»ó¶m ×'wû—»W›ån“y×»&sÇþÎÛûÙ«ý’×ÓTáå¥f÷ oÈ2è#û±Æ÷úå JÈSš}ŠmbËÿŸùÆÏÒž_|ë‹{ü_îð-¯{®žòÒ’GΙžÔ/åÐ{Ú°Ò‚.ÝbG¾ñí1´Çð¼@{¬¼òp×§y¸Ôïrž.ÑéØoÿ/Ç~š^­Øz_7ÀeíNKN^lƒš´óùdÚIS§ixªê¶úsÕm¹kµYîy4Ú3òHHz™8~åÛ¿_ñ;?ø´ß -frO1¹ñ+W¿{õݦtò;: ÝÓˆ‡Ì¸R+3ÒR²š[®kvR}©W¨O¨WРèà•«ß¯@Wܼ0 ¼@‹‘“givjÿªÙIËÛT‡†lªÂ«h1u&7óŸÅ7«)-ÿÒäáuqÒØôh)–’âmZeÚ³ëw¦=†Ø¶ç†ØRw˜Íä¿°)úÖ˜}d¥~Ç¥Ë~-]ù Ë2¶iô³±M¶µ‡ÏÚÖ¾ÜÍ­ D~ûåK~{Êú:e ùÉ¿h) OÛÉMó·ðòÛ}ñÛɨ¾h—CòSvJñêihò´ÑØ|’Á¸jÇã*“y×Öù¢J“¿4ýp‡¯~gË5G½Bý¹z…êöúNÕí“æ›-/$}i».Ò¢(½ÓDz½ÓdÛ´£"…铟ýûí¾s~»Ì(­“Õ+6žQ¯ø¹DÏ “‰àÔrŒp§fnT÷×w¢:Z š4°PýŠ+Oiö)¶=ˆ-?ü«˜qo|ãg©Ï/¾õÅ5þ¿ð-oiö,|í™"vÊðäjÊ èS}ºí-Ý@‹Ù´¡åg{ã;þ·”x‚öÚcx^ =özÛc¥Éý~—ï󴆌¤fŽ«?t¦š…€JBc±vn¹Ö°“vÖ£oPõ  OèöàB8ýýãpš&öÒ´D¾9 ¾Ù@?Ð'ôùzñi.žói4&Íùüøe©‘þµòWiøõŸ—dÆZ¹ÌÎÜZÎXû[tž†ñ¡#@ ©Lnæ8“£}hB"mJ3WÆ4¾scè ª‡JvDþê Ö#€ŠA+ ÚÖ:k[›_Pk}§ê¶Ü%ß.wy/ íó^€–àm¦* ZI0>~O—H$» óÁˆH€è # :興NÙ:"c]w7Ǻjjjjjj$’Ùt¹囿yhY³L-k~³«_ìZ«$«ý¢ÃJµö6Ô¨nfÓ Û—›—‰+?žˆü €jb¹·P_Ë©¾ÿ¡ÏÊêóíŠoâ÷œ¼]ú,±#²¥Õ´±¥Õ­þBéV¿yJÑö7ÞÒögCY&â’>1>u 1®ëßz_×/Fz°8)ýÔÞë;kñú&:cïMtr¯;P ,÷x²üµ ‰„ì0Òxë·‘ÆåV¦rÊçáñÿÍÖguøoéTþùÿz½ú`)–{{`1Ð~ƒþÅí«å Ï79¾½Þ.}òžàˆ.º.¢ë>r£k&“ ?å±î»[bÝ\z¬ù¦‹“4<¹š4Ðßš– §5-ÐÉra¹ÇÄCè‡/Bâ?ôYýöYÉç;ìáõꀷ´ß µöUõè.ðîˆtΜ9gº‡;£ÝÃÒæ•Zéƒ{½cg-Þ1…{Yá¦c ãê÷ŽÂ”4–¾?ÈšßÑÊšnÅv…»]ÕÖ׮ʅrLn>{·úK[­ŠªÚTQºÊš8xÔšžž~å>–R&·ýÃ0ùsº|…ƒŸù¦'ý4+ŒµÍ Ò ¥iV¼¿¦YÁd<Âd ¥ê·Ò÷Ûòå•©eͪèúNUt$ùuÏH’S-3ÇsNFׯ½¥ëÏô> dzË›1è^­Þ?lõ²í¡{äh¢{¤¸þõÒçBö–MéI{lÉ)ÿêüœ =åBäy{XØžÙCÇûm_júm‹ûc~¸þ;ZYs¡_Púz™úD½¬¼%*OŠ }ç2$ž»}²s t\¾œ/#]Ev(<r‡o<äë/¥Å1êÏ .ñ¿4}r·îñ„¯¿”OÄ“§4}ò•‡oýòõ_ø—þáî/o[ûäõÂ×+ß¾-Þ~+¥¾ø¶O–{ûMx}!þW¾}}–k4îþÎ÷}ïó…(­=ÆÝªíyQ=ðèˆLŒßß•gnΆ3–#7:,ÅRfœ™›gº÷q ÝÛa94Ôaé=:Õ=Z˜Ò´g÷û¦=r×êÝrWºçq Ýüxp„y&ƃݣ·ºŠ~e^0ǘɦŸ’MLîÁÇL®Ø]¸§Ï†žÅø …-:› =›È†è|áàgÞéó™lØU×§tÕ¥{Ó7Ó½éžt8Ý£Œ(?RFZ‡öý±u¨ÐIoûåK;噸{/q]çÑÞÒy/¹\0pãÇ` üôælø©Ü½Ú,w—+ÿÅi²ü\¢tOr4ÝCVd”o{n”óÕazë”å°uJY½[!M&®ßÛ•¸ÑÝz'¢«N/ÿÁ£Ö)&7sœÉ1/˜ãÌ òò¸bþ’ ç˜\xq¤áúªˆ²M¡Úgÿ:Öpñ«±K|ßaK|¡ÛÒG!ñ„o .Í>Ç._k˜è¼³9?µß9}4Ã7òöžñDx^^ðÕ'_û/-žpñ—Òâ‰xò”¦O¾òð­_¾þ ÿ*¯Á_¸ûËrlŸ,wøú#ßö­xí·ÒêKHûd9¶ß„¼ þ ÿЧxúä”EÞG¸<_ˆÒÚcÜí¡ÚžUÄÜÜÜÜÜœyp÷ï̓ì3…˜÷î5öN–ì.üu¢óοMtæ«ð±?ÝCç#ÑÍ1;}²)9’l¢óÓ/˜cÓ/Ø¿úíïüvRhaþb¤/V–¹¹>[±Ó’ µò…µZ+—H†~6ü(ûó‰ì\$é° vX”‘uŸ(#Å®â›?wæÛÃÇüú®O.ö&¤FĆ|Š$¤u0Ù¿†ž~÷?¡§Å쟋?®º¿qÕ‘§Ó™ìÙéìR£´NjŒ_Oì_/W‰¸Çv,^×BìŸoé—_ ûdׯáO„Ä+¹¯.*†ü|ãaiþÂ7žT¦~ñ¼(—>¹Û¿xÂÝ_¸Ç“ÊÈÃ]ŸÂåáãïüžwð¯Ê?/ÞfákÏ˽}"FûMX|àÛ·}Ë=þð­/!í“åÜ~ãW_ˆÿåú|]Tæ}„}ñkq~‰‡{«8uDºêOÈ\õ–?ù:,l¥ AQ~¤ŠÐßLöá©ùk0¹ŸN19êÁ-¼Vìôü©U”;=­B 8Z±‚†þÒàêñ+ßÞ¿RÌÜÍÞÝ;ÌÞP:<JgCép6d[Yã4 Øǯ|û·ñ+Þ Cû¼¬Sm_X§H†Â”¥åÏÇfŽ—{­:.öV®{±®s¾Î%=[þds,ÙD–0ÿ(t¨¼Z¶áŒZ¦1m¾¦1×î4‰Æ·¶.0é©° ^ìÈ?ž,ì#iç³ÉôÁT û_•%šÍäBÂã!_O¸Èç…xÏ ¾úäbÿÕO*#w} “géúò¼ƒ•׿à/嵟êiŸ”†í·bö)N{€kûVÌö¿úÖ>)ü¯ÎúBü#þCŸåÕ'áï勵ò¯¯ò÷?”KÿåŠ?ÕÆ‘´\(=BœÓGÂVaCߢµžwïi=Ιã9ç -¥™éÍÜÌôzÚOj<íÖøÞ½ 5/Š¥·)|jS OÏ߈WïÎAT{wKT+<}6œ›É†é›€Ü%ÿw¹‹Ì‘Ø]ÿ¹Ô]_̽éK~~iR2âZ¹D"5JÕ¯z뉴¹V.m¶$ö¶$Læ6˜Ì…7¥åO«o,¾”8ÙƒQ¾cµQÞ=ÚóßÝ£ô•±–ìüõï=ÓO8gzR¿´‡½§½:]” •:Mæ]ïšÌû;owì'Éóõòp ¥§åº…ß‹^Ã}C–A­ïcï;´'6Á‹ùÆiÃi‰ìŠí#ôE½ØUBìŸ ¥ÅCvY ×K*-òõ—Òâ wùñ¼ãyÁWŸÜí¿ÚâIeäá®O!òp©ßÒžwð¯òúü… \ÚoÕÙ>©NÄkðmߊ×~ã[_BÚ'bÄÿê¬/ÄÿòÆè³¼úäî/|ý½´÷A¾õ%^ÿ.ÏS±ãOµ±DG$í!E p²7-)~ûåK~{Êú:ePô­1+úÔ+Ô'Ô+ÔÒ§ÕROÛÉMž¶Â«tž-×tõ õçêªÛë;U·LšoL´è©ô¥í¥Œ®ëTF{§e{§M{výδ‡v°¢ciéix°§m ÉÓf:øgëÝݸjÇã*“y×V“y!Îfò_xHŸt•ßqé²ßA˱s©—‘GCûF19æ8“s«¿PºÕBò§Åb™ÜÌ2¹Å¿gúí¾¿øí”†&IÑ.TŦŠó…$Lž\M} £¢O7 ½¥h1›6´ü¬O¾ß*‡ßî;ç·ËŒÒ:™Q½bãõŠŸ-ö¹a2œ: ¿ 5£º¿¾Õé'š~ÒOÅ Ï™{<¡ëïà_ånÁ_–†WûmY·O*ƒxí±Û·¥Å.õ%¤}"¶üÕS_ˆÿ¯»}}.Ý¿ÁÅ_øú{©ïƒ|ëKÜþ¾ÏS±ãOõPC F¶zÍ;Z½ÇÕ:CÃSvn¹Ö°“vÞ¡>×ê,B§¿NÓ@q”—åO¡èú„ü€å…ðö-âçë­/Äÿ·Ù¨<>ÍÅs>Ƥ9Ÿ)5Ò?¢Vþ*í¿þâs—ÌX+—Ù[+ÚwKçc]“Ûb]E;"Q à̓~3¹™ãLNkz¨ÑÐåÖ¡?lRFVïVFÆ4¾scè T?hߢ¾@8•ìˆüÕ¬G~­La[{è¬m-íÏECÙå.ùv¹‹6ê–Àrí[Ô,/j¡ðö@+SÄÇïIâã‰d4–3hߢ¾`y‘ÑAG$@tÐ tD.íã#k–©eÍ¥æpws¬«¦¦¦¦¦F"™M/”Æaµ_tXé.‹ß‹›<³i‰„Ûâwåfy럋ÅV2!ò÷_èS|}¾]ñJl{&[%žw@ #r´ý·´ýÙP–ɆÄÈ?¥8Ò{}g-^ßDg콉ÎÅïÅMžZ…DBi"·~i¬f ·´š6¶´ºÕ_(Ýêåh! Éý/WÿMŒOHŒëú·Þ×õCŸ•Òçrò—7±ŸwÀ‘¯¤áÉÕ¤þÖ´l8­iy{ÊNcg"ºèºˆ®køÈ®aÈù_/¹ðóX.ë¾»%ÖÍ´ ôYN}x³Y¢#2¥O¦ôÍŠ÷×4+hê–*º¾Sí9šè©æ©XìÉbùIÐïheÍ4N‡ÊUx¥á>UÆ6²õS/SŸ¨—ùßÞõ;Ê_¦–5&õ “?ßQW|j6_yø’ =åBíª¶¾v•­خpÓ­‰ƒG­‰\(ÇäÊÐAº]HÿÆÚfE^~™ZÖL5Âd<Âd‹YE ãòå|žtU«÷Ã[½¥É_$?§£²S)¨F õ ܹÈï;kñŽ)ÜkÌ 7IÿÂå'Üê/5nµ*ªjSE¹Ø÷ô|ý%ïÛþ±?r™¬ }–WŸ\ü…‹¿›,Ìå|¿íKM¿K}ezŸ2½7ØõEþX¬Üía¹?ï %:"­S–ÃÖ)edõne$Ý“§{×ïíJ\èn½Ñ-—Bª"ªT‘lèY,Ò˜6žÖ˜ºF;ow¦¤4ܧ š‡ö6©¥ë>QK³¡gÙÐDçÍÁÀƒ…òÿåTDºªØ´8¾òðÅ:uð¨uŠÉÍgrÌ æ8ó"Ýó8îÉ8373ÎîÑÎÛÝó´”q]úXx¯Äøý]‰ñpææl8Óa9r£ÃÂþ•¦ª"Ê6U¤P{c ¿k°Ä÷¶Äçé'<›É†]u}JW]º7}3ÝKVªŒ(?RFZ‡öý±u¨XÙÇ._k ú"ý;§ÆÓÅÒ/.i˜öì~ß´GîZ½[î"Í3/a^ă‰ƒñ`¡þ…ø#wù©öÓ½éÞË¡¡K÷èÑ©îQáòô+ó‚9ƼH6ý4lbr>frÅîÂ==_YÜŸ¬ }–WŸœòàïÜÉ…sL.Ì¥¾Z‡,?ß1Ý“M÷ÐUFù¶çF¹p{XîÏ;X€¹¹¹¹¹9óàîß›Ùg’MÉ‘d™~Á›~1ÇÂo|ç·çÓÿóé\Õ1Ñyçß&:IB* ¿üûø¹Kþïr—k‹•Nˆ~¸ä/vútÏcº‡ÒÐ:•ì_CO¿ûŸÐSê)W˜÷î5öN–ì.–ÆUwâ7®:JIg²?d§³?HÒ:©1~=±?~˽ò¯Öµò¼=j†{nÜå/¯ý°õ/Ü—Ÿ-3ÙF^“ÑÍwR‘Ÿ¿é+é_Ðgåã_/–'—óüëëc¾>…ÛÛô¼T?c›|ÛD½C÷vNtƯßÛ¿ž?&ö¿:>pįÓ{PþÈ›L6ýÔŸl¢<Ùw¡ü‹ŽˆLR_ç×1TËÖ}¢ž7%V-]ÿ‰ZZ®ÎPöÄ=.Ó÷ø¦WFWïVFéoUdÍnU$ãÌüïŒSˆÌ•Ô°å7Ln{n˜dglÙc~¿e­õ&ü^´yE0pãA0Ð=|4Ñ]t=K|ß!K<¸v' iãÇÕïiÓ7“¦eÓùùëiý×îý†˜þ¡!ÆžZn\õÁFã*‰d6S\*î«sr—¿¼ö“q>¹š·R!öÆW~¹[¾]¥ÆZ¹Ô˜ÿåÕ´M¾òÏûUäôb}¾.„ø;wø×W݉ùúž¿ð¼T3E;"UåGªýÍdžš¿Ö“ûé“+—ì‰{\¦ïñMŸÒ?¹š_!+ix|5i "Bd®¤~øS«Èÿ• ÍfZ'Ž-²‰9–l¢izó¿Ômap±#û*Wý ™«¾Ãò'_‡…ý^ˆZ¶áŒZ¦1m¾¦1×î4)Û·¶Æç×ij4¥§SZ¡¦:’äãW¾½3~%ŸVèë=wùKÓ1û¡jÂí¿üå±¶üó~9½Ç O¡þÂßß–!í|6™.Cgëüúš9>_Ÿ¯—·ïyXNíˆTF•mʨ~â½gú çLOÊ9C[dz373½žö½§}¹r$õ•}$E5œÿr¬Á(ß±¦ø^\`ëÇ]Bê®§`Ú¾ÀUß§rÕ¿®òjLNkL4Q±Øê]r÷j³Üm2ïz×dîØßy»c?Õ,ýJ›Ðv.ì« »€‹)=mA]ŠÎ飉â+0²±Æ-‡¬ñAßeÐGò[ãûY±:dn&¦1Pù×ìZE¾ÃÂ]ÿ¹Ô]ý—&?ý“ýh=ïÞÓzœ3Çs¿ô¯“O»5¾wo¾Ô¥ùciòs·îò³)–Þ¦<ð©M)<=_T‘Õ»ó,QíÝ-Qmyíúî/|ý'[a]®ú2Êw¬6Ê»G{þ»{”FpÓS è¿ñ è/—mÐj¤…[uáyXŽ,±YMÀ~ùRÀž2<¹š2(úFEŸn@{K7Ðb6mh1çSñÿRiÒÎg±´“&ñ%‚>N½š¼ SòÝõ5`¿x.`grO19J©Ù©ý«f§Q¾ý_„½ø•&A»÷Žmýll“míá³¶µ/ó‰m{nˆ±Súí¾s~»Ì(­“Õ+6žQ¯øùŽÏ “‰àÔDPˆü´§0mÈ@]Ÿ\®¢nǨî¯ïDuú‰¦ŸôÊèºÎüdC‚¦CzÚšõ õ õ µtãiµÔÓvr“§Mˆ?–&?wøÊOè<[®é<êêÏÕ+T·×wªn7˜4ß4˜h!éKó²®ÞécÙÞiÓž]¿3í¡¥é(Ü Ïbúäî/|ýòô´õ)=m$C¡÷•£¾|ñÛ©KNѧjSôÑ.Ø´…Q¹îB›ç0¹™ÿdr\Æw/ßçàm †Œlõšw´zŽ«?tfñËÂéï‡Ó4QŽ&ÇU[Áb]w7Ǻt[ÿn€–ϯþÓ7 𮨰s˵†´ó/©übPèË]ÿ°¸ƒç@>ÍÅs>Ƥ9ŸŸ[&5Ò?¢Vþ*í¿þâíCf¬•ËŒáÌ­•áŒ%±ï°%Açc]“Ûb]µ‹‹BߘÜÌq&§5=ÔÇh*Ÿ{èËÝCæÈ®Ýæ* B#˜²¡g'ª¯“zùÊÏÝ—»þaÀ›ÇS³ie.ÛÚCgmkiªMå“»äÛå.ï…¡} MøˆüË—%FDÒ8 øø=I|\"‘ìZ>Óö¿{_Û?×?'™ëG5ƒ7ƒåëñÀó°\øTtDD‘ÑAG$¼áĺînŽuÕÔÔÔÔÔH$³é׿yb]“Ûb]²f™ZÖüfh€åÆlZ"!¤ãróqåG¼@<à_Õ¬½rÝñíiwUgI«Uª7áyä°Ú/:¬ìˆ°ò.ïöØ‘íª¶¾vU½L}¢^FÅS¸×˜n:ŸéÍÜÌô²Ó³1_)¿VÔÔÐ>¿…&^˜¾{äh¢{¤˜KpIÏ®BCLÿÐcË_,=_œÌñœ“aë§¡Es¾¡%œ¾9ÆëjÕ‘·‡mÏ_Ùƒb»ÂMg˜ìG˜,´Ä\èy,²&,‡­ ònò/'Ó“r2•Ï_ly¸ÃdgŽ3Y’!¥O¦ô°–r¡ío¼¥íφ²L6Ä%}b|ê@b\׿õ¾¹¼ªMÿ•—§¥Õ´±¥Õ­þBéV/Ç\HþZ…DB>i¼õÛHãr+S9å_îõ»8•·o¶>«ÃËY_¯W~øo|ý…/bûWJÿp ¥÷úÎZ¼¾‰ÎØ{‹—…[y—w{l‰ŽH¹kõn¹küʵ;ãW¨É&æX²)ÎÍdíCæ­Cìô”¦ðhܽÇ%œ¹õN8³x4(à¸ú}ÀaSZ¨#R ¨W;exx*eèîŒv¿|€QÃrxÈakøæäXƒ»ô2Çr½Œ2º®S¥3†‰mÏ çóXÆ óª˜Ü3¹ŒóÉÕŒ³Ãò'_‡…Ýí¨5=ÔÇÈ6 +n̦%’±†ó_Ž5¸êNH]uÈ:,ßè°x}çì^_1߬—m Ì?þºð޵xÇh¬(W¿t¦¤ow4!?ÂT±=?"ž:÷ ¯r«¿Ô¸Õª¨ªM¥«¬‰ƒG­ áééWîS(¥arÛ? “?ç ›?š¾°¼ÍŠ÷×4+èWíîw|{×ï¨~ŸdÏt\¾è`Öoõ~øa«—žFSmRÍr©/ú€—¯/™Z֬ЮïTEG’_÷Ìïè/UÿÆÚfE^™ZÖL5R8boyùÊ#çÌ ™s†Z ‘ %gÛ0—ÉPÜõÏW?Üå/ ¾ñ„b&ÉÉN_lF _û¯~oKó/.úänÿ|ãwÉO—{G+k.̇ꗮ­Œ<¥é“{}±%iiýÃÖ–Öü\´Îh÷{ÎÕ;}~â;ZY33â>GþUÍí¾ñ™o}µ æxÎÉèúµ·týÕÓ®®¼~øÆ“Òäá¢ÿÒü¯?r÷¶<ý¶/5ý6.ú»}˜Ï_ÿp¡üJÏ/>,_J\#2œ¹9Îè'Þ½§ŸX<åHê+ûHJëi¼¥õÐÓÂ4ªèú.U”L0ïBÏc¹¢ÃPù¦/F"8u0,_ÐÉÜÌôvêõ´õ)=mo¢Á,WÔÒºj©Ü%ÿw¹«uÈr¸u(è¿ñ è/\^p¦ç¹™\XQ~¤Œ´zÍ;òÍbò÷Dðþ®…ü‹¾8Q×p±ÀÊ7!òˆhu² gÔ2óà®­æAWýI«¾ê.ãÌÜÌ8Ó½éÞË¡¡ E­Â”¦=»ß7í¡qñéžÇtóâÁæE<˜8vvÞ^è*ú•yÁc^$›~H61¹3¹bwáž>zã3õ pªBáhzvzóÐ¾Ãæ!µtÝ'j)¥¤ôÁÀƒåå¡c —/5üTRçôѸsšÆ:uð¨uŠÉÍgrÌ æ8ó‚j™,¤°~©áHçöË—vÊ™Æë<Ú[:ýgó™lØU×§tÕÑXõtO:œîyéÑCûþ8ßòò•'ß\úX(Obüþ®Ä8µ”:,GntX„×)_ýóÕØòó'­C–ŸkœF¸SÔ2Ê·=7ÊðwöÃîúA¼-æ_|õÉ×þùÆ7îþBï2ªˆ²M)|:ÐŒ+K|ßaK¼2ò”¦ÏÒê‹>ô^Ú7x¡¿ý”¡¿Ý{áÌx/ÐOû€~þüUDõ‘*B¶¤1m<­1uvÞî…-÷ö ßøÌ·¾ ¡.3’?üôælø©Ü½Ú,wKª±õÃ7ž”&_ýs÷w¾þÈ×_ˆ\8ÇäÂ\ô)äù%ÜJ_Jy—%ssssssæÁÝ¿7²Ï#ôô»ÿ =%Ó‰_Oì__<½2²îedøÑ¹? ?bŸ§";‡dÓOýÉ&ýÄ{Ïô–ø¾C–¸ô„ZZ÷ÿSK{§e{§çæþùtnnúslúçR^îè'š~ÒOt éžU Ù%~àSKœ^NÈÈŠ¸Ø3 hm Ò^Þ§6œVKó¿Þù·ü¯•É_ly„[Ô¸²Qj¤8ö:êë•Ò=ýy"ÑÍ?äØé“MÉ‘d[Ÿì_ýöÀw~;= ó#}±²PTç^öbé¹”—û_ŸW¾*éâÑŒl€R’ï°e?åÒR­\"~4úÙð£ìÏ&²?×ÿâä›bµòùVʽ¼å•‡ æÁ½{̓½ÓŸ%{§¹Ë°¸l|õ_š~¸È/†±ím~úŽùéËe?Bì{ý"Þ–ËÞ¸Ûiñ¯¿¸êNüÆUG’Ó™ìÙéìR£´NjdçPyÄó_v*#Û’ ϰÓS­Q>ãW‚¿Bà_âù—Øí¾ñ™o}^Õa9ì°P—VÇëElýð'¥=O¹ëŸ¯¿óõG!ñŠ»½ y~qGìçi¹äÛäûËØ&²®‰Î{;':ã×ïíŒ_Ïû_8â×É®òGæØü#õ×Qžó¥½7ÑÉcD$ £>õà•k ^Ñ´l:_|~{ÐíNÐO}óÖøO­ó¾ ÊÝòír7;šDI“i*·ô­nI_ÕhPnËž][[öÐ$qêÞ™KSM£ºÛë£:úZø†÷^/[È~Æ4ßœÓ$õÉѤžœDáRlW¸Z‡ö~X¾o6r×ÊF¹‹þV¸äÛ®éìƒ#Ó/'¾¥Ï&ÓNjŽW&±ånu&óMæjX/’b)ý-5ÖÊ_éäÕèÔ¤!õu~µlÝ'ó—,PK×¢–ÒB…ù‹^ ¸”·\÷*Ül­¼éóV·Øê3ìò&·=7L²Ç÷µì1¿ß²‡F.³¯RF•mʨß~é’ßîk8Ò× èSµ)úh‹6j!Ñ µh¢{ª‘qÕ«$’ÙL©å­$Ôn<º‡&ºË¶®™ýs×òó'óÓs]2EˆýˆW¿ˆ·åÒ'wû/-¾ñõ \» Ь,zј6}£1±ßV*#Øñç¥ 7×Ê¥ÍlK.<3¿ÖVïÎ/]¥Š¬Ù­Šdœ™ÿ]ÜÒà_•‰·åËŸß’V\êk«NLÉGè¾\º£=&¶~øÆ!òðÕ?â|)ÍÞijP§ŽHZÄ:uðÏÖ©ðÓ?¥5õ¿ª¿ýŒ©¿6¨‘6KÕÒ×P=´ºeD{keDKSuâã÷vÅÇ_:ðÄÖ{†‰rÝKëy÷žÖ#|%PI((;§&œÓ‰àý?Tvêîr×uíNy¦3ÓækSeò[áÐ'“þö3ô·Wÿ‚ªˆò#ÕËñÂLöá©ùk«1¹ŸN19úbYx­Øéù³ô&T\Ê[.ÝnæVÞô|ë÷åt¡g±lhþqá{™½»w˜½¡tx6”ΆÒálÈ·²Æ‹oѶ´þi!j@ÓŠ`4•†$¿òíñ+ù´Â›\7%+lb;Îóôú2W=­DÌns‘>™,.ýóŒTœä_¸,¹Ðlf¡ErøÆ“ùégŽ/µ¶£0ûYZ~aúA¼-§>¹Ø¿øÆZz…Úǵ;MʶÆ-‡ç¼¨Œ<ÂýW Rú'Wó+Ä% ¯& 4B þ%ž‰ÝžáŸ…3~åÛ¿_ñ^Úç½`jûÂ:Å}¥ÑÅ£=&¶~øÆáòp×?ââÃ/ŠÑ>/—ü\Ú3ÕÀ‘Þ±³û¼c¶µö‹¶µ‘Æ›ÿŒ4jûß½¯]bSsZ<œùþI8SlƒZâ”ítÆ]ÿ…Ê]o2°Ád’>_ Ïc¹ûµ?ªýëʨ–Æ%•kå#úò9ÑugóDWõWùÛ Ù$-¤Í dƒ¾söAu%CWܨUH$4Ò™'_£UœúÛôýí–ÃC ù­þS¸”»°üK—§2ÐG£|{­Qîõù ²Ûæð…ÆžG8gŽçœ3´t4ù ÅOk|ïÞù¯[D±ô6åOzðMÏUdõî|£'ª½»%ª-V^Z¢Á]Bê®§ zʸêûTÕ±¾g¹ •}Læ]ïšÌû;owìg?%Ékè$û*Šœ4ò(¿”85zjå‰Ô(U/4"†‹þ³áÜL6LcÖòÍÖZEþŽîúÏ¥î²éŸ‹¡^A΃W®~¼]qgð€~ð‚2²z·2B“¤4;µÕì¤eÚmªCC6UáU´x0“›ùÏâ›Õ”–iòTI º—¶ÅV%ñÛ/_òÛS†Ô×)ƒ¢oYÑGþ¢–n<­–zÚNnZhK.gË5G½Bý¹z…êöúNÕí“æ›m"!$}i»ÚÑ"´R°iϮߙöÐŽ–td§ Ø/ž Ø™ÜÃSLŽr&û1Ê·ÿ ·Å¼—~»ïœß.3JëdFõŠgÔ+~ÖðsÃd"8uà—#Äg3ù+d”Þï¸tÙï í#JÓ?hö´ 4yÚhîål\µcq•ɼkëBKƒ»=ð…>Ђè‹/¢O3'hS;’ÁÛöÜ[ê¥è_ ù Ë2¶iô³±M¶µ‡ÏÚÖ¾´¢‚ñ'~»ï/~;=#(žÓ;…SÄØwùKÓâm1ÿâ¯O~öÏ?¾•u;Fu}'ª£•âI刷•ð_ñâ!‘v>‹¥ôÖ–>ø8ô^hò^(—üð¯ò¶g¸·Ï¹Ççò2òhhßÈ#&ÇgrnõJ·ZR•ˆ­¾ñ¤\ò,®îþÎ×ÅÞÕº2ñ;¥•—{{¦z¨¡#i‡Ù€ãê©Nq`¹ÓÒjÚØÒj˜ØöÌ0ÑË|–êe –/4W£aç–k ;içGúæùQ¿ú|Ûô뺻9Ö¥Øút´aÂâa,_øú;¨~|š‹ç|Is>?¾Rj¤D­üUÚ~ýEíËŒµr™1œ¹µ2œ¡qµyË™Ü명º ’ŒûƒÆýÐo4"/zvâõ¯ô6Êý@ŸÐ'â€å:"à5ÃeZAu,„ ”:"à5ƒNF,whSÓ¹þ9É\?´ü€bü *ˆ :"¢ƒŽH€è #²b̦ó[Rᦦ¦¦¦†ÎCþX×Ýͱ.ñtÂ7!òІô\¶ 2À¿ªY{åºcåå|SíùÍ’jy?ð<-˽ý `?ÀžQ_˯¾ªíý«Ú¨ÒŽÈ–VÓÆ–V·ú ¥[½f!ùkù-)"·~i\ne*§ü˽~GÛßxKÛÏ}û‘ÄøÔĸ®ë}]‰ ý¾Ùú¬ÿ-g}½^ùá_¼=ðõ¾ˆí_Ë]þê 2íÏÙ´Dâ°~|ÃaU¸Ûn:ZZ…©s¡ç±\Èš°¶&dÍïheÍ ÷³ÂídzRNFxz°ÜìسPÐý//ª®#’zv#ºèºˆ®køÈ®áå¥Ðå.?ôSyráç±\8Ö}wK¬›ÿè0è³Òö)¤¾à_ËË¿o¶!>”‹î‘£SÝ#áÌ÷O™‰Î;›':Ó½é›é^ï…&ï…ÂôŽýQÇþ”!5š2¤{’£éžÄõØ{‰ë¾†‹ç| #ɯì#I!éàíý'9²DG$}lWµõµ«èÛ&}‡¤/œ¹PŽÉ•ùµsæ„Ì9Ó=Üí–6¯ÔJ›Ù\8ô”ËÔ~Û)}¿MUµ©¢4¬W]ß©ŠŽ$¿î™ßpaçè¸|9ÐQ/SŸ¨—ÑU­Þ?lõ–&i¤ôRzê_ÏVlW¸©F õŸé}Èô’œìôÝ#GÝ#ÅòoVk›ùú•©eÍÍŠ÷×4+˜ìG˜leê—wì¬Å;Fߺéè¸ú} C¸~·úK[·‡¥í™{zú•ûÐqJi˜ÜöÃäÏ9èò9p™ŒÆEŸÜퟯ¿s÷—üôºw´²æÂ|¨~éÚÊÈSš>¹×[’–Ö?lmi¥_»G:£Ý#†˜þ¡!Fg¨vØéVûE‡•JJãtRúÔhJÿÛ¿òñðý5Í ú•ìÇïøö®ß!<úñÏ|뫨U0ÇsNFׯ½¥ë'ª³9"¶~øÆ“Òäá¢ÿÒü¯?r÷¶<ý¶/5ý6.úþüZœj“¿Úž•o¿-Ž×÷•Ýëó´ 4yÚÔ² gÔ/¥•»W›åîùigÓÉXÃù/Ç\u'¤®:zZ)£ë:•ÑËÇ7:,^ß9»×Wjúꂯ¿—ö¾ÃÇÞÊÓÞX±ßK{ßá?ùÆ“ÒâÊ»¼àûü%?b·'éÍ‹êKŒ‰´ÅûO*ñ|Yîý'Âëk9¾UKtDZ§µN1¹™ãLŽyÁg^¤{Ò=gæfÆÙ=Úy»{”>ßp\úXx¯Äøý]‰ñpææl8Óa9r£ÃR®ÀArì—/ì4¸—¾£ê<Ú[:O±kÇ._k ïºt•súhÜ9],½ò›öì~ß´GîZ½[î"Í3/a^ă‰ƒñ`¡þ[‡,l¢¿é‹qº÷q Ýk”o{n”æŸ Ïf²aW]ŸÒUGß®Ó=épºGQ~¤Œ´íû97áp×YIÞa94Ôaé=:5¿¤¥é‡ _™Ì1æE²é§d“{ð1“+vî鳡g1>CÇ ‡šgCÏ&²!:¿ød4.úäkÿ|ý»¿Ðô:UDÙ¦Š7~ æ_{ñ«±K|ßaK¼2ò”¦ÏÒê‹^œ/ í¼Ðß~ÊÐßî½pæ?¼茧}@ïig§WET©"dKÓÆÓS×hçí®Qø—ØþeÚwØ<¤–®ûD-¥”d?…[|ã3ßú*„šP$øéÍÙðÓ…:ª±õÃ7ž”&_ýs÷w¾þÈ×_ˆ\8ÇäÂ\ô)äùÅÍ«Kþj{>ŠÝ~ãÞžg²3Ç™l.ü|2NžJêeÏÔËèÅ©ÕkÞÑêeɧÏÍäÂ/¥õšwä_SµžÆ[ZO"xW"XZúj¦´ç;_¸·Ä“Gˆ¿ˆñ¼(­=Ã=žðMÏ÷}y¹—w¹ÃWŸÖ)Ëaë”2²z·2B‘9qýÞ®ÄõˆîÖ;p{`³xû¿òÏ—åØ·¾J“¿ÚÞ¿ª‚¹¹¹¹¹9óàîß›ÙgÒ=ýé:3Ñ{o¢sŽEèéwÿzJ š+æÁ½{̓½ÓŸ%{§ è¼óoy ÿùt©óD²)9’l’HjåÉð£Ñφex6‘ý¡˜ ìÜâ×ûã×Ë%?—²,$¹D"‘L¿`ŽM¿`ÿê·¾óÛÙúŸŸþc~z¾ä›æµò¼=ð•_Hý’íå%‰þkþ%Aˆ~Øù‹‘^ˆ~ÄÐ'_û/Íßùú‹«îÄo\u$9ÉþÎþ 5Jë¤Fv•‘G<ÿe§¡2²-¹ð ;=Õå3~%ø÷ñ+r—üß—Š´ð/±ã-_-žÿÒñ™o}^Õa9ì°(#ë>QFêUbë‡o<)íyÊ]ÿ|ý¯? ‰WÜíMÈó‹;Õ µ=GŒöÛRu{/Ÿ§Q¾ý_Œrz‘#Ë7™w½k2Ó±0=Ù³Zºá´Zº„¥¤¯6øú{iï;ÜíMH{C<ïy!¤=Ã%ž‰?(oõø¦8ïãåoOÂåýEìçË›ÒRJ}-¯÷/.ŒmòýelEï‰Î{;':ã×ïíŒ_Ïû_8â×).å̱ùÇdÓOýÉ&Ês¾fbïMt™4¤¾NèoÃä¶ç†Iv|Ëóû-{hmá¡´Xx0pãA0Ð=|4Ñ]¶yõʨ²MõÛ/]òÛ} çOú}ª6E_C‹æ|CKÐãAÐ_ìZMˆӚ–×%?[ÿjÙºOÔó†L«¥ë?QK3Î'W3Î…ÒטŸ¾Aÿµ;A?MeO0®ú`£q•D2›)G-ðÕÜ-ßž3"5ÖÊ¥Æü/¯EóÕϼ_EN/6ÜõÉÝþ…û;±Ä÷²Äƒkw‚š¶p\ý>àИ6}£1iZ6ÏçPyÄŽ?/m¸¹V.mf[rá™ùµ¶z·2J«"kv«"gæ·4øWeâmùò矹××Vœ:˜’ÐwÚréŠ=q•Ëô[.éÅÖßx"D¾úçâïBü‘/¥Ù›xöS òWÛó‘¨Lû“Î]+å.ú»kø“h×0ÕMOë>즵# Ó+\òí ×töÁ‘é—ýÒÎg“i'½—–¾Úâ_÷öòñ1žBâ'ßx"vüyÊ[I䯾ïãåoO²áÞþ¯äóe9÷Ÿð«¯åþþU íˆTE”©"/•ÒÄK6ÑÐýùÇ_N]) ÅŽì«\õ'd®úËŸ|v%ͧV±ÐYj‚,^H³w÷³7”φÒÙP:œ Yã–CÖ8 Ä®Dnò/\–\h6³Ð¼}¶þ™ìÃSó×b`r?brÔýPú™ãK­ D«!Pƒ€V4 ¡ÂT³ãW¾½3~¥øãdiù…égiøêgÞ¯"§ç϶].}r±ÿÒü/´n”Æ´ùšÆp\»pФkÜrØ*ï¿bÒ?¹š_¡)ix|5i  ð/ñü‹Ky˧ϥã³pƯ|û·ñ+Þ Cû¼¬Sm_X§Êµò{â*ä’^lýð'Âåá®.þ.ÄŇ_<äk?Õ µ=+Ó~ãÞžÏwŽÔʹ–´î„ZF]‡…Sªé é¡´ôÕßøú»÷¾ðmoð}áë/bš(¾‚€Æ´á´ÆD ¨öî–¨–ÎS~±«ÈhäW~©N2âZ¹D"5JÕ¾ r—¿XYŠ­>FcÙ´žwïi=Ιã9ç ÉOµài?©ñ´[ã{÷æÃ¥7Êw¬6Ê»G{þ»{”¾xP˜(û™ çf²aú¦‘ovÔ*òs×.u× ‘_ˆ~¸ÀW?lŠ¥·)|jS OÏ?è¬Þ:lÛ®Oîö_š¿—uƒú†,ƒ>²k|ß¡ù5UyJ³OîõU#©¯ì#)ú›–ç7Êw¬Yh øW¹ê‹Ê«Ÿxï™~Â]Bê®§ÈIëš¹êûT®¢ñV‡)\ê»0îñY84êÖ’ØwØ’0™?Ø`2—ëÛˆ­¾ñD¸<ÜõÏÅß…ø£Øˆ«Aþj{>V¦ýƧ=_«H,ñ½{-qWýI«žü…¬Ôë;kñúÈ›òy×*$küÀ§Ö8-ðOéI“ýíúþöËá¡W+mñM_½pñ÷ÒÞwÄ“‡¯ýˆí/|ãsuÆOîþõf”·:ï}œÚ“ΙžÔ/Óÿr]xþñV")µý/öó…;ÕÖ·¾ÞŒ÷¯j`‰Íjüvß9¿]f”ÖÉŒêϨWü¼ÏàsÃd"8u@ØâÐÔ¤ ;_DŸ¦xxÚú”ž6Óž]¿3í1Ķ=7Ä–ºÃl&ßc­è[cVô‘ü~Ç¥Ë~mßQù Ë2¶iô³±M¶µ‡ÏÚÖ¾ÔjA‰üöË—üö”!õuÊ@ò«W¨O¨W¨¥O«¥ž¶“›N½š¼Ê%?ü«X}ìÏìLîá)&G9kvjÿªÙI«žÓ-ÖÎäfþ“É-þ}˜{|./#†ö—>¿ª´ö¿ØÏ±å¯žúz3Þ¿ªZ0’v  8®þpбoLÃËvn¹Ö°“v¢>àå¼–»üÐô }V>c]w7Ǻt[ÿn€–C^¼{`ùÂ×ßð÷7UÞÂéï‡Ó4ñ™&;óÍý'¯·¾Þ†÷/Ÿæâ9ŸFcÒœÏ?•éÁ^†e_ñ4‘kå2c8ske8Có„è|¬kr[¬«öu’zܳ¡g'^ÿ Ao£üÐô }"þÊMdfr3Ç™œ>ÖôP£©²î¡/?t™#»v›#¥åŒ÷—×[_xÿ*/¿‚ „@+-ÚÖ:k[KKÐTY¹K¾], %ÔxmS³¯—JNÍÆˆH€è # :興NÑŽÈX×Ýͱ®ššššš‰d6Í'Sšõ-k–©eͯ«`Bä#ÿå¥Ïrho6-‘Ìt¯.@y­½ü÷mÖ?ð¦"ʈHmã-m6”e¸mmžŸ:×õo½¯ë/íŽ-­¦-­nõJ·úÍ«¤Êë³Ô*$’9Òxë·‘F8Û›joà͆¶2S¸ÛîÅ;[ÛUm}íªz™úD½Œ:²î5f…›Îgz373½ìôìó?ZüZQSCûÖ ‘<zË…¬ Ëak‚r#yœLOÊÉ׌ØùóÕ?êõ @õSS³sáç±\8Ö}wK¬›ÿhÁ»›c]]t]D×5|äF×0*Uˆ>€Q¾½Ö(÷^Úç½°xJ¹kõn¹küʵ;ãW¨#;ÙÄK6eù™l¸uȼ£uˆžÒ̓»w˜mÊGmJ!’;öwFûS†ÔhÊîIަ{×cï%®û.žó5Œ$¿²$«9¾úGý¢~¨~8uDºÕ_jÜjUTÕ¦ŠÒ¸kâàQk"Ê1¹yc¦èWîSq)¥arÛ? “?ç ›?zbqÙœ3'dΙîáÎh÷°´y¥Vº@zïØY‹wŒÆ2Ð1Ðqõû@GaÊ”þá@JOã+ó# Ûó#> ËËW?Õ¦O*o³âý5Í ú•F»øßÞõ;*oŽ|õŸÒ§FçË¯Š®ïTE»GŽ&ºGªtI^ÿÆÚf•”JA%b²?a²¥Õ{²pKë¶¶´Rúî‘Îh÷ˆ!¦hˆÑ™~Û)}¿¯½±óï·}©é·qñ¯Ò óþòª–G’_÷Ìï Ld-y}.ì_¥ÉÏ×_¸ËS(U ãòå@{ôY«÷Ã[½BôSÖ#7:¬ÓÆÓÓâ)=¶“MÓ²ùš¦…ÎPLvXì>‡%œ¹õN8³”G¤FSú€ãê÷‡Myx¨ôŽªÙ´D2Öpþ˱WÝ ©«Ž$QF×u*£–otX¼¾sv¯¯Zó/Eÿ¨_Ô/Õ§ŽÈx0q0d^0ǘɦŸ’MLîÁÇL®{ôèT÷(;e6ô,Æg*náÔÝlèÙÄüÑÅ®MŒßß•gnΆ3–#7:,ÅRfœ™›gº÷q ÝÛa94Ôa)”œ0íÙý¾iûH÷<¤{˜Ž0/HÝ£·ºŠ»~ªMŸæ¡}‡ÍCjéºOÔRJ9ÑygóDg0pãÇ` òæÈWÿÖ)Ëaë”2²z·2’îI‡Ó=‰ë÷v%®Gt·Þ‰èªßý²áÙL6ìªëSºêÒ½é›é^*…2¢üHiÚ÷Çù#ŒJ«/z‘¼0´oðBû)C»÷™ÿð^ 3žö½§½4{#rá“ sñ/¾PÇÕ{À~ùRÀN6Lã’tí-g¾=/óÞ½æÁÞéÏ’½Ó‹ç™îyìO÷ÐùHcô_ó,ìôɦäH²‰{yùê§ÚôÉ¥¼|kDlyØú©¤ü•'ßX+Ï[)ßò²užý!;ýmù…gøÖ_ÿ*|©kåÉð£Ñφex6‘ý¡0%É@÷茽7ÑÉþ5ôô»ÿ =-æåŠlñ•§PªøõÄþøõréG8¥EivI¹”HY÷‰22üèÜŸ† “6öÞüx«–n8­–.T–jÌ¿\úGý¢~àÂØ&ß_Æ6QKx¢óÞÎ‰Îøõ{;ã×óÇÄþWÇŽøõéÓ/òGæØüc²é§þdåɾ åÏiD¤Z¶îµlÞéúOÔÒŒóÉÕŒ³ò§´K0pãA0Ð=|4ѽĺr·|»ÜMKµr©1ÿË«i§ICê뤡´òŠ^ ¸”·’uÊWÿ•”¿p³…r¥ú¯Ý úi¢4{ê®qÕ«$’ÙL9êKÚ\+—6³-¿ðŒ¸øWiúQF•mʨß~é’ßîk8Ò× èSµ)úZ4çZ‚þ‚þBý&·=7L²Ç÷µì1¿ß²‡ÖN/>³g¾òš– §ó`…ë§òÐÝ[‡,l ^¹ö·àM˦óÅKD¾@cE­ñŸZã‚lÒµ²Q.ùv…k:ûàÈôË…ÒÎg“i§Ô(­+ÕþÅοúAý¾Ùõ €xpêˆd²OÍ_«ŽÉýtŠÉÑ8ˆrˆQ«à“ÚUBæªï°üÉ×aaw"AQ~¤Š”V^±Ó‹¡O.å-Ÿ™½’'šÍ,´n&_ýWRþÂÍ„§§µÒ¨CŠV8¥©Á49züÊ·wƯäÓΦ+]_âÂWŸfïîfo(ž ¥³¡t8²Æ-‡¬qš˜_h/7Ð=‹eCó¥ïÎWÿbËÃW?D±]Œùvµ/­ni:øgëTøé¿‡ŸêcMõ±Å¯êo?cêo§ L¤ÍRµT jYÝ µŒºŠ §ÐÒióµRWå;ÿjõûf×/bé#Ò9s<眡­2½™›™^OûI§Ý¦<ð©°]/ UdõîüK{T{wKT[,%mßp\»p8§&毘&[¤õ¼{Oë)V^k|ïÞ…ÆqðÕO5è“Ê«Ÿxï™~Â]Bê®§¯Lï“@¦×Uß§rÕËŸVç¤m4¸È£1m8­1ÑÒb«éñÕ?[~çLOê—é_­{XÐ>³4æQî’ÿ»ÜEݵÔAé®ÿ\ê®/W}-_H4ö*¿µ uj×Ê%©QªÎH’»W›ån“y×»&sÇþÎÛûÉòù<Hé©EH|à®±å᫟—VWdãÅ»†)ç\x6“¿IŸ 7ÛñŽÝç³­µ_´­4Þüg¤QÛÿîý¥Ö¤¨Î|ÿ$œá² ·øS«HhämhF‘æûÛôýí–ÃC ­,\ù—¢ÿÒ@ý¾Ùõ @µÁ©#RçÙrMçQ¯P®^¡º½¾Su»Á¤ù¦ÁD›l°S–¶ 6íDÙ;},Û;mÚ³ëw¦=´,Ù)é•€6” WýòªÃo¿|ÉoOR_§ о5fEŸz…ú„z…Zºñ´Zêi;¹ÉÓ&D?զπýâ¹€É=<Åä(gÍNí_5;òíÿb”ÓmîÁäfþ“ÉqÙ“šöÛ4úÙØ&ÛÚÃgmk_–+¶í¹!&Dÿ´AGÊðäjÊ èS}ºí-Ý@‹Ù´¡ÅœOÅo¼me 7ž¶&O-"WíXc\e2ïÚj2^UZ}qGø.öåf6“Mö@2ø—.ûTûóíÇwÎo—¥u2£zÅÆ3ê?—è¹a2œ: ls ¾ú[¾ú)Ñ*~/«—ýÞ0©ÿ¶ŠßËêe¿§#;¥c¿ý¿ûiú­n`ë}Ý—±–´û0}„ಠ÷ø3xa@?x6³¢IëT_–ø¾Ã–¸MuhȦªæüùêõ‹ú ú©¡#iGÈ€ãê©6Aiˆ[®5줔iŒªNÿ8œ¦‰Ï4 :(ħ¹xΧј4çóóY¥FúGÔÊ_¥]à×_ ÿ’kå2c8ske8cIì;lIÐùX×ä¶Xׯ–‹Rhu*¡ 455ª½½.?ýœ&Àºë¿lp×›wmÍï^/˦#€Bh¥EÛÚCgmki?bšê.wÉ·Ë]Þ Cû¼ %€j *Ë'¿'‰K$’]Ð@µ‚‘ÑAG$@tÐ tDÀN¬ëîæXWMMMMMD2›~Ýù ‘'Ö5¹-Ö%k–©eÍo†öªáޝ›Ù´DBuJÇ7»ì¨ß·©ì°ØêëMö¯7»ýóæÉ„?._{~óZ KtD¶«ÚúÚUõ2õ‰z)Zá^cV¸é|¦7s3ÓËNÏvŒùNòkEM ík\¨ÊÂôÝ#GÝ#ÅÜÏaýø†Ãªp+¶+Üt´&µ& SGµ·×Eµº~í-]?Ýò7Äô 1úUˆúœÌñœ“aë§¡Es¾¡%œ¾9Fƒª Ãßä¶X—!¶í¹!–·gÅv…›Î0Ù0Yh‰;¹ÐóX.dMX[ä_œLOÊÉT>±åá“9ÎdI†”>5šÒÃZÊ…¶¿ñ–¶?Ê2Ù—ô‰ñ©‰q]ÿÖûº~h¯Z©UH$T§‘Æ[¿4B#¨ßÊ€ø{(/-­¦-­nõJ·úM‘9Õ×r×ÿâT¾ýS^}ò•Ÿ/oG™ñ×r™1Òxke¤‘]Rë”å°u æU=äB9&2®Ú±Æ¸ªuð[[ÉÈ~úÛ¾ÜÔßFÁpDZ¿3êØŸ2¤FS†tOr4Ý“¸{/qÝ×pñœ¯a$ù•}$YÉüÅ–‡;´Ÿ;EOûI§ÖòÚ|?ü<– Ǻïn‰ucÄ € â(4À"¢‹®‹èº†Üè†üÿõ"$¾-G}"žØçòb‰ŽHêÔ´l¾¦i¡3Òæ•Zi³Ãb÷9,áÌ­w™Ås Ñ@ÇÕï›òðÐB‘Üñú¾²{}ž¶&O›Z¶áŒZFçåîÕf¹»0=WF×u*£/ 4›É…²áf²aUdõnUDˆ<½Ì±\/ÃÎß0±í™a"ã|Ë8a^Õ“ûñc&—q>¹šqvXþäë°°»õ±¦‡úuAWܘMK$c ç¿kpÕºê(2/tX>¾ÑañúÎÙ½¾Â+é‹P½lã™zYùò/]ñpÕϺê(jezŸæ]xÇÎZ¼c4V”ŽŽ«ß: S¦ôRzúžaªØžOû…W¹Õ_jÜjUTÕ¦ŠÒU4b]xzö¨v.^ŽŸÜöÃäÏ9èæ¾/,o³âý5Í ú•F»ûßÞõ;„kžl Õûᇭ^¶>‹Ï(¥¾šÆÚfåL¥ ±G|³g$ôÛ¾ÔôÛÏŸoz‚F(“µäåYÚ–/¨ßj¨ß~Û)}¿-OdjY³*º¾SI~Ý3ÿCT©ñaiýWÊR£óã•”òó&;ó}U^?Ι2çL÷pg´{˜Z yÿ¢é{ïheÍ…rRýÒ³Fˆ½±½8Ðqùr>OºŠì°4ù—K}q‘íŸbñMl}ò•¿2ñœ{ýr÷/ÒÉYX"ŸæüIŸf©7 ·%~Â_×ûH177777gÜý{ó ûÌâ¸êNüÆU§ŸhúI?Á%¥Öóî=­‡}~¢óοMtÒ•åGʈÜ%ÿw¹Ë?ð©%žýáÙDövúé̱é”~øÑ¹? ?RK7œVKé*’?ÝóØŸî)”a¢3öÞD§Ô¸²Qj¤4¦MßhLɦäH²i®L¤{ÒátÆ´ù[iðÂéÿ¼0ª²(²“y×»&óø•àßǯP­A?|™~ñÀ‘÷Gú›|~ = ÿ3ôTj”ÖI ùã+ߟ›ûçÓrä/D±±Ä÷²Ä»†?w ¿®úbëœb2ïþ,Ù;M±´ð*ŠÛù˜œÎþ@1–"?uèæ??}:ü*ý‘`©éùÚOiéõï=ÓOØ”¹mJJIå%=p¿c1Œò«róàÞ½æÁü3îŸOçæÆ¯|û·ñ+Â닞’‘Æè¿Fóq/;ý4Ì~ óÍ¿4yÈòíÿb”SÍ’<Ùö#¤~«Ôoyë—Úl\Ž”>ÙôS²‰r¦ ktž¼˜ÚBäá®ÿÊØižž/…ñs¹xwýs•¦¾öÆ&~ýÞÎøuúµX«’êÑo|ç·Ï÷£½{̓T×Bì­IÊ“ýND¿Ó-ù«­¾¸Ëößh †>ùÊ#v<çkŸ|üëŸOçæhF)½}>\u}ÿW^ooFü,Mføc1Ä~Yœ±M¾¿Œm"/›è¼·s¢“bBþ˜ØÿêøÀ¿NïÝù#slþ‘|™òœ¯Ø{¼;"CO¿ûŸÐSr0bñôÊȺO”ê:dŸ§ fç@‚’êÉôW"‘H$ó¾Ï&ò _:..]E93¬Ò cíþ$òúºÀâ½Q ¡îo²(²:.ö ý‘ ûá1?ÔV"±ånu\šøbÖ×+ °Oô’S¨úHÃÖ'ûWz•¢§@aþb¤/V–r=ø¹”Wȃ~þóó^_‹“_E¨VþÊ_øåÏ7=¥¡ó…/ ìV„ðú­P¿ÕP¿ùZ¨•K$ÃF?~TøI[ y õ/¶=ˆ¯^׳IH|fÛ[åõS¬3‘ ½rSJ:C¯»ô‰”{û³ÐÞ 5É·5ËEþj®¯ÅåGû‡¯µ—WŸ¥É#^<ç[¿¥ùõä;’ØÏÍZ¹DB=ogü„?¾Þ÷.T²#’Ç®ÙAÿAëå­CÁ+×þ¼¢iÙt>?e{¡ô×îýgæfÆiøÔgÿ*wË·ËÝìh%Mf¤©ÜóÒ»V6Ê]ôw×ð'Ñ®aʆ‹w  v ÓÚ‘‹—‚®¢ð:’úºg$%|T)M5ên¯êhZè5hö ‚ìmLóÍÉ1MRŸMêÉI.Åv…«uhï‡ó×<Eýˆå —|»Â5}pdúåD¡´óÙdÚIÍëÊä/¶<­Îdþ`£É\ ëER ¤¿¥ÆZù+¼šV4¤¾NèoµlÝ'ó—,PK×¢–ÒB…ù‹^ ¸”·|ùó[‚K}ôÌ¥­ØØSe«>Øh\%‘Ìf„å_šý&·=7Læ§±¼£•5·ì1¿ß²‡ÖÊ©¼ýnŽ'<=ê·êWU¶)£~û¥K~»¯áüI_ƒ¢OÕ¦è£-©+$îúÛÄŽWbû‹ñ™ý¼¨¤~¨ý Üx tMt]GX×î´¬½éÐ ­Â÷©Òüдl8]üí¬4ù«³¾øÊöOyíïó¥â¹úåî_6e[ŸM9ÖpùòXMìk¸øÕXƒQ¾í™QÎ^ÒMlª9~ÂK«/ɧŽHZ Á:uðÏÖ©ðÓ?¥5õ¿ª¿ýŒ©¿6¨‘6KÕÂVÉ7æjåå,þbr¾ÐpYá몀JBvåœ>špN'‚÷ÿB'ÜõF]{‰àý]óõFg4¦Í×4¦Êä/¶<¡O,ýíg>èoÏôfnVÇz‘ÅPE”å×Ïe²OÍ_‹ŠÉýtŠÉÑÂÂkÅNÏŸ¥7¡âRÞòésæøüü…C«ùP­è”î}H÷ÒmãW¾½3~%Ÿ¶kƱËûrƒ»üfq¬c±}_Õ­é\^Ù 7Óžõ+Fývi;²¯2{wï0{Céðl( ¥ÃÙ5n9dßBpéøÀWÿbÛƒØñJlák|ŸG¥é§4{sÕŸ¹êib û¥ºZמÚ!ǵ;uLXã–ÃójTÒß¹Ë_mõUªüåñ¯7©ý#¶>… F<R¿Ü¡Ý5hË\úä0’úæË‘”MùQŸ°Ý2ªÙÅï#¯Wÿb³DG¤wìì>ï˜m­ý¢mm¤ñæ?#Úþwïk—ØtœQ¦ñ‰Å6¨¡e¼ÙM4:ã®ÿBå®7™?Ø`2Vž%¾w¯%îª?©qÕÓEúÎàõµx}´òÂ|ùÏ|àKŒßß•_è.»¶þò.¥…›Mç5-]w6Ot½IÆñ&A6IËS#/o™›™ÞAß9û ½òXŠZ…DB#iAkòGZ^·¿}@ßßÞa9<Ôa)¼’ü±pivaù—.Oe F‰Q¾½Ö(÷úÎ|PÙmsøBߢÉ#œ3ÇsΊ´ä/4®Óß»wþëQ,½MyàÓ…ž|Óó…½)YT{wKT[¬¼´Dƒ»þ„Ô]O/xô¼pÕ÷©\õÂõIO¨îÑžÿî%û¤»«• çf²aú´F+á’GP¬s×.u×K*m÷r­Àý·;ö³;ßÉ+éçžbÚpZc¢ŽÁÀƒê†¨_1ê·°K«Ø1ßÔhJOÚÎ/-OþZ¹D"5JÕ ˆçøê_l{`Ç+çLOê—ñs@ÿºÇÝs‡‹=ð}•¦¾öF­JêR¤Ù\ÊKÝ(ƒ¾!Ë Êkï;4ÿIZ/MþꩯÒäçî_oOûGl}–†xñ\Hýò…ÆER2œ:Ò´÷bé¹½U£?ŠÞGÊû>Rm,ÑéØoÿ/Ç~š^­Øz_7ÀeÚíNKF£ío¼µPÇeÚù|2íl^µcMó*šn º­þ\u[îZm–»FöŒ^]¾°§ O®¦ Š>…QѧÐÞÒ ´˜MZ~–‡ßx¨ÊÃÝø>ÄÖ}òì°ê°P×<—«¨Û1ªûë;Q­,_8I³2þ^šüÕS_¥ÉÏ'¾½]í±õÉ_~±â¹úå‹5~à¨5žNL̓»w˜Ÿ!Êýýh¹ÇOøãë}©jhÁÈV¯yG«7à¸úCÀAgÞ¤B@õÐÒjÚØÒj˜ØöÌ0ÑË|–êe  §¿NÓÄ^šÌ ”W?4—«aç–k ;™Ž0/h ËrÑÀò’¿°¾–»þaoô Š>M;Ö«üó?Dý¾yø4Ïù4“æ|~¼­ÔHÿö2‰ üú û–kå2c8ske8cg ìþ€IDATIì;lIÐyÆ÷«7XP…ŒûƒÆýè‚P4u1ª½½.?½‹¦’¹ë¿lp×›wm->ú¢±H/á˱˦:åç^_Ë]ÿ°‡·‡‘äWö‘¤Âµ²QáZ^]x¾€ÊP Àë…ËÂÜþ¨/À›­$hÛsè¬mÓ<£e^F$“ëƒí&-d$qK$7ôý ¾¨$´èœÜµR+w=òõŒ=Z^ò×¥-ï÷tDÀkV¨/àcŠß“ÄÇ%É.húA}P,÷iËðÇåciËû}S³¢ƒŽH€è # :E;"c]w7Ǻjjjjjj$’Ù4ŸLiCn.ËgÞD©ío¼¥íoùÌÄøÔĸ®ë}]?ª€êgYNÍÎ…ŸÇráX÷Ý-±n¾£5•‡SG¤wì¬Å;¦p¯1+Üt t\ý>ÐQ˜RÖüŽVÖL“²¹Oëî·Ò÷ÛTQU›*Jת¢ë;UÑ‘ä×=#ÉùùËÔ²fÃä¶&¾£.ÇÂÉà)ýÔ¾¥Õ´±¥•dS¸ÛîvU[_»*Ê1¹yc6ÙÒ—/:êeêõ2ʹÕûᇭ^JI 9 KäÓœ?éÓÔË6ž©—ÁÈàÔ™qfnfœéÞÇto‡åÐP‡¥{ôèT÷haÊlèY,Š4Þúm¤‘KÎÔQØ=Úy»{4`¿|)`§ ݉ë±÷×uí-g~þYf~þÙг‰lˆÎN7íÙý¾iܵz·Ü•îyH÷0/a^ă‰ƒñ Ý·˜lc —/5LtÞÙ<ÑI9;§ÆÓô«Ù»ë]³7ÎÍäÂáôÍÙð¼îÖ‘Ôù/GR6e›Û¦„‘À©#²Ãò'_‡…þn1ÿáÝ3“ûñc&Wjåùc<øàãx0zË…äîÕf¹›Öš,-ß”>5šÒÓômWÝ ©«NÚ,UK›)çîᣉîaêj,–ƒ«îÄo\u”žÎhûß½ÿJžZ…DbSøÔ¦ô5œ?é{™O¦÷I ÓÎÜœ glÊGÑ ÇŽH¹[¾=ß'5ÖÊ¥Æü/B×gTF•mʨß~é’ßNÝyŠ>U›¢¯¡Es¾¡%è¿ñ è/-ç¤!õuÒ@«eë>QÏ›"­–®ÿD-Í8Ÿ\Í8‹å iÙpZÓ²ø]lʶ>›’:4i¢÷XÃůÆŒòmÏŒret]§2 # *6«1{wï0{Céðl( ¥ÃÙ5n9d[§,‡­S ]Q«X*OUDù‘*B3Ù‡§˜,ûW&÷Ó)&GS¶…H®iÙ|MÓ¢1m8­1W¿8FRß|9’²)?êÃXHò¼æŽHš@M#ó[ÇP'c­\"‘¥êW£/_¡Š¬ÞïdŒjïn‰j ÓÐXK­çÝ{ZsæxÎ9Cùgz373½žö“O»5¾w¯5.¼4.ÒUß§rÕ'‚SAóàÞ½æA˜D™;"ùîj-‘Ìf$Wý ™«^ѷƬè£4~Ç¥Ë~m_SxšòÜ;},Û;mÚ³ëw¦=´ã6Ù)ýöË—üö”!õuÊ@ù«W¨O¨W¨¥O«¥ž¶“›ÍÅs>Ƥ9¯1åç(Ó?‚6š~õ÷/~ýEÿ—ÌX+—Ù[+ÃKbßaK‚ÎǺ&·ÅºªbÈåÎHò+ûHRáZÙ¨p¡ €Bj¡!ÈšßÑʚ宕Z¹k쑯gìt@!èˆD6ô,– A,¦fD‘ÑAG$@tÐ "뺻9ÖUSSSSS#‘̦¡‘êÓ!ßü…ÈëšÜë’5ËÔ²æå¢½åU^@5³DGd»ª­¯]U/SŸ¨—Ñ‹„½ƬpÓùLoæf¦—žÒkj~­¨©¡=¦)%ûŦ0}÷ÈÑD÷ÈBͦ%‡õã«Â­Ø®pÓÑš8xÔšàRàfÅûkšåz¡u2ÇsN†­Ÿ†Íù†–púælU½bÛžby{VlW¸é “ýñ“…–¸“ =åBÖ„å°5AÞMñÁÉô¤œLåó[ž·&;sœÉ’SúÔhJ” mã-m6”e¸mt–Ÿ:×õo½¯ëÊË—å®Þ6–舔»VƯ\»3~…^$’M̱dS6œ›É†[‡Ì;Z‡Øé)MáÑ<¸{‡yЦ’¬dþbËóö –ÕPË(šyÚOj<íÐÉë"~Ë…cÝw·Äº1¢ú`¹³DG$ujZ6_Ó´ÐióJ­´Ùa±û–pæÖ;áÌâ9Ðhš€ãê÷‡Myxh¡ŽHîx}_Ù½>OÛ@“§M-ÛpF-£ór÷j³Ü]ìªLï“@¦×Uß§rÕ»êNüÆUW.õõ2Çr½Œ2º®S¥3†‰mÏ çóXÆ óª˜Ü3¹ŒóÉÕŒ³Ãò'_‡…Ýí¨5=ÔǨóºâÆlZ"k8ÿåXƒ«î„ÔUG‘|¡Ãòñ‹×wÎîõ^I#˜êeÏÔËÊ—éò€b¸êŽg]uu)ŠVƒTÞ±³ïu¥c ãê÷ŽÂ”)ýÔ¾¥Õ´±¥5?BV±=?¢Ÿ>N^åV©q«UQU›*JWш{áéé×ü,¥GåSJÃä¶&ÎA7ö@ayiÔ?ýJ£õýŽoïú•×?ßòý¶Sú~[^Ÿ2µ¬Y]ß©ŠŽ$¿î™ÿ!¡4ýp·ö¼@ÇåËöì‡Vz)%i€ä,,}]*âð¶Pâ‘áÌÍÙpF?ñî=ýÄâ)GR_ÙGRZOã-­‡¦h¦QE×w©¢ìIÖ4Å’†¦ æÂÏ'sá¤áᩤšõtU«×¼£Õ[ìU¹cÿÇÿ«c¿sº'éœV¸Û.1TIÕ»GNuzÚú”ž6˜Wõ –ÖPKå.ù¿Ë]­C–íCAÿAáò€ yÌÍäÂʈò#e„|~%OïïJ ¯¥LÔ5\¬c‚oþBäE½F¶áŒZfܵÕ<èª?©qÕWƒTgæfÆ™î}H÷vX uX(ê¦4íÙý¾iëO÷<¤{˜Ž0/âÁÄÁx°{´óöBWÑ¯Ì æó"ÙôÓ@²‰É=ø˜É» ÷ôÙгX6i¼õÛH#—’Ò({vúÂÙìôæ¡}‡ÍCjéºOÔRJIó‚?•×?ßòRG!ÕKÀ~ùRÀNe¤qÍ:ö–Î#D?¥Ù1ÖpùòXé“rvN;§_jÞ»ë]³—âOáÂ,#©ó_ޤlÊ6·°±¼ðîˆ §¿N{ÚO›<í#¾þläÑâé}ç샾Ëá¡ û¼ZºáŒZ¿žØ¿žÔ'G“úÄõ{»×™sœÉÙÖ>k[ËNO/?ô7M´¤WzñË…g3¹°uªí‹ù¢©³‰Éý4Àä,‰G- ñTiÚóÁFÓ“yÇj“¹ÃzäF‡æU=Ðø¸Hct]¤Qî’o—»lkÛ¾°­Uô)ŒŠ>Z#’FêAW\È8ŸO¾ó[«HbÝ÷þë¦ÿW¸ÞiT¸èµ¼ðZmÿ»÷µýssssssŦÃóÍ_ˆ<`qœÓdzÎi¯ï¬Å뫆Žûüˆf‰D"i1ÿáÝs¾Sû4Ÿ¦ëæGÈJÕÒf;ß=|4Ñ=L]K…ùÏO/ßþ*ýůʑ^ ¨¼QÝ_߉êz§çz§É ¨¼ô®’ú/•Zyþ>ø8¤O’TŠb2¹ë§4{ø¹–ãªcϽ 8ÆŽ96åOmJ_Ãù“¾—ùÐÇQúp[liÞ6xtDR§^ëå­CÁ+×þ¼¢iÙt>?e{¡ô×îýÔhøÔgÿJ/lìh%M¤©ÜóÒ»V6Ê_Ždìþ$Ú5L9PS×ð‘`×0­Iihš•c¿ý¢cÿÈ£³û–ê0u`Eu·×Guô’êNÈÞÆ4ßœÓP÷÷ô æØô 'Û:´÷Ãùkž‚b°ýQá’oW¸¦³ŽL¿Üê'í|6™vJÒ:©±2ù‹-¼Ædþ`£É\ ëERä§¿¥ÆZù«:}5º6iH}4ÐßjÙºOæ/¹ –®ÿD-¥… ó;½p)o%õ_ʨ²MõÛ/]òÛ©;OѧjSôÑpÔO?‹×—¦eÃéâ­¦lë³)©C“Z Ôm”o{f”³—pàm†SG$­Žd:øgëTøé¿‡ŸÒšz‹_Õß~ÆÔßN£hôAóë÷ш‰¥I$ Lnæ?™\ÃÎ-×vÒJOº­ÿG7@ijj~½ª¦¦\;\k=ïÞÓz¨c†µ\ »rNM8§ÁûÀÔ]>z£®½Â)ÏtFcÚ|McªLþbËèQû™úÛ«AUDù‘*B3Ù‡§˜,ûW&÷Ó)&GSt ¯;=–ÞD‹Ky—‹¥™½»w˜½¡tx6”ΆÒálÈ·²Æ‹oWý¯/ZM[cÚpZc¢©#©o¾IÙ”õa,$y–èˆôŽÝç³­µ_´­4Þüg¤qþt¤…a²?a²4>±Ø54e‰VvcŸqסr×›Ìl0™ç_Q«H,ñ½{-qZ­Œ&mѸš6h”ïXm”SjZÝl®€‰Î;ÿ6ÑIiææþùtnΨØ^k´[2šèº³y¢ &UMÒ64M/ou™›™^Z@€º’¡+nÔ*$éìœ9!sÎ?Ò*oýíúþöÂˆÄøý]‰qÚö¡|ù—.àu²åÛkr¯ïÌÕ½í­#vÎÏ9gèIAþNã:­ñ½{çÓ'Š¥§‰·ÂÓóEY½;߉ÕÞÝÕ+¯~â½gú wý ©»žÆ'²7j«~£ÈL#ó[ÇP'c­\"‘¥ê…F4s×OiöÀI:O§$‚æÁ½{̓ˆ!KtD:öÛÿ˱Ÿ¦Wë¶Þ× °÷£,Ü•’ Ýi©Ñ_l]§´óùdÚÙ¼jÇšæU´¥ê¶úsÕm¹kµYîy4Ú³Ðdjï…¡}Þ ªˆªM¡I[о5fE­9¶iô³±M•Wb¬kr[¬«˜6@5 3®ÔÊŒ´V—fç–ëšT_êêê´}JðÊÕï‚W +î ^Ð^PFVïV¾ôGÍNí_5;-ñ}‡-q›êÐMUxU.œcra­¼øtN¾ù—&à‹ô´è=í…[ŠU~ûåK~{Êú:e 'ù»Zºñ´Zêi;¹i¡-Åtž-×tõ õçêªÛë;U·LšoL®º>åBËnpOÏw—g‚¦ôöNËöN›öìúií(MGvÊ€ýâ¹€É=<Åä(g²£|û¿ä?ÑU4êò.ïlF"qÕŸ¹ê©¾(ßqé²ßAÛ×ÑOiöÀküÀQk<œ:˜šwï0 ŸÀ›D ¤fŽ«?ùM$%Öuws¬‹… QØ\&“V3-­¦-­†‰mÏ ½Ìg©^µ …{YáöÛ}ñÛŠkŒËÚãÀ›OsñœO£1iÎkLù9Iô`/“¸À¯¿hïÊŒµr™1œ¹µ2œ±$öÎoMÃøj¡nÜ÷Œû¡ I~eI*\+.cïŽ5ƪ^M€ÊƒŽH‚à²0E6”e²U=•õ…ú¦Õw´²f¹k¥Vî{äë{P:"@Dhƒ¯¹þ9É\ÿ›ZFtZ¡¾@6ô,­°¿‚ bƒŽH€è # :舀7œX×Ýͱ®ššššš‰d6ýºó"O¬kr[¬‹Ëv+ËE{ÕpÇ×Íl:¿…ßì²£~ߦ²ó«ýÊÇ7Øx³ë ퟷ™åoá_o¯‰¡=‡Õ~Ñae[T5ÛÏ‘íª¶¾vU½L}¢^F…Q¸×˜n:ŸéÍÜÌô²Ó³‹=ß©~­¨©¡=% U_˜¾{äh¢{¤˜»:¬ßpXnÅv…›ŽÖÄÁ£ÖD±ªå“??œÌñœ“aë§¡Es¾¡%œ¾9Fƒª Ãåä¶X—!¶í¹!–·gÅv…›Î0Ù0Yh‰;¹ÐóX.dMX[äÝœLOÊÉT>±åá“9ÎdI†”>5šÒÃZÊ…¶¿ñ–¶Ÿûv+‰ñ©‰q]ÿÖûº7v³ åO­"¿…N¤ñÖo#Ðê÷í„o|ƒ=T-­¦-­nõJ·úM‘9Õ×r×yãƒðöô)>x>¾½þU^Rú‡)½×wÖâõMtÆÞ›è¬þ¶Ä»fË]«wË]ãÊkGÇ•š–ÍŒ¦…^õmæÃgmæVƒùx«!äφܔ¾X[½~ØêUEVïVE ͆žMdC䊋Ó=rtª{$œùþI83ÑygóD§Z¶áŒZ–é}ÈôJ܉Ä-$¾ÈŒ¿–ËŒ‘Æ[}‘Feh£ Q—‡uÊrØ:•Ô'G“耨 r¡“ WíXc\å<ºÕ9 Ýœˆ¼´Š¨ööº¨V©m“D +î8öwFûS¹Ôh*—¾’¼“¾’qfnfœ×¶s—zZROÛT‡†lªÊä/¶<ÜQËêN¨eæÁÝ9ó 'rRã‰x$Læuø~øy,Ž ÜÝtÍ>•t‰ñ,ð6C "ºèºˆÎo¿4à·C~ÈÿzÒþ>Ï¿Ä ixr5iÜ–H$·5-NkZª_‡KŒˆôØNj<6MËækùÂH›Wj¥Í‹Ýç°„3·Þ gÏFW¿8lÊÃC6¥q½¾¯ì^Ÿ§m ÉÓF]t^î^m–»+¯¾^æX®—QF×u*£tÆ0±í™a"ã|Ë8á¢Õ“ûñc&—q>¹šqvXþäë°°ƒ…>ÖôP£Î#芳i‰d¬áü—c ®ºRWEò…ËÇ7:,^ß9»×Wx%}Aª—m¡Ï·¾šÆÚfåL¥ ±G|³g ôÛ¾ÔôÛÏŸoz‚>[’µäåYÚ–/¨ß×[¿Üå)­¼Üõ_Z<á߈~Û)}¿-?ejY³*º¾SI~Ý3’|“ü‹ïóˆÞ>Øú'Í?Š1‘Ð9sBæœéîŒvS $oo4Ýï­¬¹PN²7² !öƶê@ÇåËù<é*ŠK¥É¿\ê‹‹ühÿpŸ°¹¸>o_o¼­Îxÿz]ïyyô’§ªíssssssæÁÝ¿7²Ï,Ž«îÄo\uú‰¦Ÿô\Rj=ïÞÓzØç':ïüÛD'ÝQQ~¤ŒÈ]ò—»,ñŸZâÙžMd`§Ÿ~Á›~Aé‡ûÓð#µtÃiµ”®"ùÓ=ýéžÒòNº'N÷hL›¿Õ˜/œþÁ s j '0™w½k2_ þ}ü Õô×éy¤¿Éé×ÐÓð?CO¥FiÔXx-Û7çæþù´ù ‘Gl,ñ}‡,ñ®áOã]﫾Ø:§˜Lç{§?KöNS,-¼Šâv>ff§³?PŒ¥ÈOú…ùÏOŸ¿J$Xjz¾öSZzýÄ{Ïô6åGn›’RRyIÜïX £|Çj£Ü<¸w¯y0ÿ úçÓ¹¹ñ+ßþmüŠðú¢§d¤1ú¯‘Æ|ÜËNg ³ŸÂ|ó/MòA£|û¿åT³$E`¶ý©ßêõ[Þú•W6J\Ž|å[ÿBâ wý$›~êO6QJšÐGçé.4-«ú½†{y¹?òþ¸ý_Œrzþ>_ ïÈ×ÞØÄ¯ßÛ¿N¿kU’]ùíïüöù~´w¯ylOˆ½±5Iy¾Ó-ù«­¾¸Ëößç){@¼#ÞV§q—þU ±ß/„ø{!c›|ÛDV=ÑyoçD'Å„ü1±ÿÕñ#~Þ»óGæØü#ùå9_ÚØ{¼;"CO¿ûŸÐSš²MB,ž^Y÷‰2B]‡ìódìHPª*r•Ä•H$ÉüÀ÷l"øèXZþÂ!ãîþ$òúºÀâ=P`¢îi²(² .ö ý‘ ûa3?V"±ånu\šøbÖ×+ °_N¨‘W¨™dSr$ßä"}²¥W)z æ/Fúbe)WCKy…<ÚççÿÀ1?áõµ8ùU‡jå¯ü…_þ|ÓS:_Ø@g·"„×o5€ú}½õËW±õ/$žðy1¦»ÔÊ%’áG£Ÿ ?ã{%ŸMBâ3»~ÅŽç…ëLdC¯è”’ÎÐë1}"åÞþ,´·BMòmÍr‘¿šëkqùÑþákí‹ëñV¼x»ã!üëõ¾_÷÷B*ÙÉc×ì ÿƃ ¿uÈòÇÖ¡à•k ^Ñ´l:_|þyÐíNÐOk´Yã>µÆÙ¿ÊÝòír7;šDI“i*÷¼ô®•rýÝ5üI´k˜r áâ]ÃG‚]ôvdiù ¦šFu·×Gu4-´ªÁ¾Å=Œi¾99¦¡<ÉI.Åv…«uhCÐØþ¨pÉ·+\ÓÙG¦_N”H;ŸM¦Ô¼®LþbË#ÜêLæ6šÌžö“Oûk®;·|{~! ©±VþJ'¯¦!$ ©¯“ú[-[÷Éü% ÔÒõŸ¨¥´ÐAaþb§.å-_þü–€àR_=s 1ýCCŒ=UÊ¸êƒÆUÉlFXþ¥ÙarÛsÃd~ÚË;ZYsËóû-{hmÊÛáæuÂÓ£~_oý ‘G ý‹OeTÙ¦Œúí—.ùí¾†ó'} Š>U›¢¶L¤{uú‹ñ™ý¼¨Œþ jÿ7ÝÃGÝÃÅRÒˆ`àÚ`€¦µÒ›ˆÆ´é©ð}ª4'¸¯Æ]þê¬/¾ò£ý#ÜoÅ‹·Ë=¿J«/É[ §ŽHZmÄ:uðÏÖ©ðÓ?¥5õ¿ª¿ýŒ©¿Ý¦}ΟŸ¿phõz Ò½éÞlèY,¿òíñ+ù´å\Ky“M̱dI2ÿXl/¿Wõ• ÍfʽΠݗ}žõ+Fývi; “§üú;ž°1{wï0{Céðl( ¥ÃÙ5n9dÓ–‰Õé/|íïó¨4ýs·7öU®ú2W=M$d¿„BëÚS;$à¸v'àk¸øÕXƒ5n9< F%ý»üÕV_¥ÊÏ/¾½ í¾úD¼/ÞV›‰Þ/^¯þ«%:"½cg÷yÇlkímk#7ÿiÔö¿{_»Ä&å´ˆ,O,¶A -ëÎn²Ówý*w½ÉüÁ“¹°²-ñ½{-qWýI«ž¾(Ò‚£´U9­ÐTjþ¥C_2'ºîlžèz›©š!›¤e†é!—·ŠÌÍLï ïœ}ÐÇ^©,E­B"¡‘δ 5ù#-ÇÛß> ïoï°ê°^™¿¿+1^¸4»°üK—§2Ж_FùöZ£Üë;óAe·Íá }û%pÎÏ9g(Ò’¿Ð¸Nk|ïÞù¯OD±ô6åOzðMÏUdõî|# ª½»%ª-V^Z¢Á]Bê®§.=5\õ}*W½p}Òª{´ç¿»GÉ>é.¿¥gù™l˜ÆÐJ¸äëÜõŸKÝõ’ BÛǽ\+jçíŽýìÎwòJúÀ¹€§˜6œÖ˜è£c0pãÇ` ú£!êWŒú-ìÒ*v"ú;žäË•MéɺòKïÓKQ­\"‘¥ê×1€/\ìïóˆ­çLOê—éô ÍKàno”žZ•Ô¥H³¹”—º-}C–A•×ßwhþ“´2þ^šüÕS_¥ÉÏ=ž¿=í¾úD¼åo¹½ïT£‰Þ/İÏåË‘Žýöÿrì§éÕº­÷u\¦]Ðî´ddÚþÆ[ u\¦Ï'ÓÎæU;Ö4¯¢áÖªÛêÏU·å®Õf¹käÑhÏÈ£r¾0´Ï{AQµ©"4(ZѷƬèË…g3¹ðئÑÏÆ6 É¿4ò;âUýÎDo12ãJ­ÌÎÜœ g4;·\×ì¤úR¯PŸP¯ IÁ+W¿ ^®¸3xa@?xAY½[ùÒ5;µÕì´Ä÷¶ÄmªCC6UáU¹pŽÉ…™ÜÌ2¹Å¿çóÍ¿4y* ‹¤¾«¢zñÛ/_òÛS†Ô×)EZòµtãiµÔÓvr“§­ð*gË5G½Bý¹z…êöúNÕí“æ›“«®O¹Ð²ÜÓ—¶ $-ÊÑ;},Û;mÚ³ëw¦=´ƒÙ)ö‹çv&÷𓣜É~hUârèÓ÷¿lþåó˽ƬpS\’3ö´ 4yÚhîiøjÇã*“y×Öò}xãUÞs~»Ì(­“Õ+6žQ¯ø¹Ÿ&Á© @§Yô4·­=|Ö¶öåU±mÏ ±êöÔïë¬ßÒäOÿ|ã ÿø6›É`¢øLiüŽK—ýŽ€ýò¥€½šý…¯=ð}‘R†'WSEŸÂ¨èÓ hoéZ̦ -?׿ñblè“g‡åÐP‡…ºf¸\EÝŽQÝ_߉êheyzBUÞßK“¿zê«4ùùÄ“·«ýÃWŸˆ·\â-÷÷åá_¯÷ýbùRC F¶zÍ;Z½ÇÕ:ó6+Ä£¥Õ´±¥Õ0±í™a¢—ù,ÕË@'€Ø„Óß?§iâ'Möä›͵jعåZÃNæÅƒ#Ì ó²\4°¼ä/¬¯å®Ø¨fÿ‚N€OsñœO£1iÎçÇçJô`/“¸À¯¿èΖkå2c8ske8cIì;lIÐyÆW u@%÷Œû¡@ h*%“›9Îäh]{ššçúòC÷9²k·9RZÎ4b+zvby¾´W§üÜëk¹ëöªÙ¿¨$èˆ€× —…„,þ P_ðö@+ÍÙö:kÛÃ4Ïh™—Ûäú`»ÉE =I܉ÄýV« õü þU5¼mïèˆ€× :­P_ÊóŠß“ÄÇ%É.hõü þUݼmï¿B•Ä‘ÑAG$@t8uDÒÛK-Ÿ9›Î/±IÇššššš:@%‰uÝÝë*fÜì”N‘ÚþÆ[Úþ¥–ϬUä—ØŒ4Þúm¤±z ™Ÿ:×õo½¯ëG•nö ÊÉ[15;~Ë…cÝw·Äº1B€Ê³DG¤¬ù­˜S­s¡ç±\¨]ÕÖ×®R¸Ûnº£5qð¨5‘ å˜ÜcÖúm§ôý6UTզВlªèúNUt$ùuÏHr¾ü2µ¬Ù0¹í†ÉŸK¤Ë—¨prnJÿp ¥oi5mli%IH*’°Pöà@ÇåËŽz™úD½Œrnõ~øa«Wxy«îò³5ÓoûRÓoS¸×˜n::®~è(ÌŸô߬0Ö6+òùËÔ²æfÅûkšLöÇ#Lv¡ôï¯iVPJÒ¿ßñí]¿£\öÌÝÞ@1–èˆÌ†žÅÄœjm:xÔ:ÅäfŽ39æsœy‘îyH÷dœ™›g÷hçíîQvzêx¢óûåK;M°M\½—¸®óhoé<óåÿåTñlèÙD6Dç 'çšöì~ß´GîZ½[î"I˜Ž0/âÁÄÁx°P6c —/5LtÞÙ<ÑI9;§ÆÓBÊ[m”&.œcrátïã@º·Ãrh¨ÃÒ=ztj¡”Ùðl&vÕõ)]uéÞôÍtoº'N÷(#Ê”‘Ö¡}lb§7í;lRK×}¢–RÍ’þƒ?Â홯½€b¼¶©Ù™Þ'LoÀqõ‡€ÃÓ6 ÷´ÉÝòír·´Yª–6w  v S×Þüëjåùc<øàãxÆèÉÝ«Ír7­ýWš<)}j4¥§éÛ®ºRWIB9wMt/(Ï+\u'~㪣ôtFÛÿîý¼<¥–·Z"‡åO¾ ýÝbþû-f&÷ãÇL®0¥ZVwB-ÓÇšêct†òwX9,±îÉm±nv}Eu}'ªë>žë¦UJIÿÎéžäü.àRËÞÞ6j_ד†Ô×Iým˜ÜöÜ0)i–h%¿ØÅx6#‘Hz_þ“H$ʨ²Mõw\Zïïð6œùÀÛàÐ}|áS¬ëTxÚš•«>œ:æÂ³™\X²J²Q²J"™äS_­T<{xÛ©#òU×R.4›É…¤Íµ é¼N+UDù‘*"‘H®K$É&æX²‰=–pqÌÞÝ;Ì^³w÷¬ÙKYnõ*·Ú:eÑ[§Ò’ôÍtQyŠñ³<•H˜ìÃSL–FçѯLî§SLNîZ}Vî*M#BÊ˾ûAsI/¶ü4±嶹«å¶ßî;çÿÿ·÷ÿ¡Meûþø¿{N7ñ8ˆBâUhŠ‚éUhÊxhÂ×ô8|Lõ€©˜êÀ4µ‡Iã€mÇË´Ñ˧“ôðqÒ ÚVŽÓv`´õ¢&Âhã—ã4~x{Hä*IAoR®Cwaü˜Ü;ƒ Øc6L¡ß?^Fw'M»wv’¦ú|€AvVV×^kíµwVÖ›yà€×<Àt•+™.âîœ?Q·Îø»ºuTâBÊ‹a˜ó‘6ñõ ~­ S³µ¦-ç´&šÐšmµ>êÆ2™÷¿o2·i»ßz$Ù•¼›|5’ŽÖæ£í_øŸ¢î*ŸçöŸ'½5 u2–+Ff”idÆÌ¿¥¬? Ðÿƒº‡;‚ºÌ04öMç~ÿ‘Îí˜9Í9f(~J•»ùŒÖÝÜ9t¨1’[žäv¾¥£ÐéOù¹™”ŸÆT*œŠU8©d©Ä]•_Ê\•™å¥}ðBrUvË\•ÔEHSÈiL¥ô³Î­¾@¦ewÍ·ë4‘Õ­ÕÉêF·|1ºÍº±å‚uã«x»f a~Hû&7Ê*äFÍš­ç5k^ÿÅYÃ$MÎ]÷\’aœ•Ýrg¥²gƒYÙCá=ö«×ÙÍGxqìiÎÁòó§ª^{©ªÞŸ¸;çǨ’C_! á]³†pº>+w+]t„MýpœM!—„ã&fÃÜDcÔÒÒ¥«›ÚÛw°Å¿Ðéyw°©™ÓlŠò0®ÄõÈ“|ÑõVßÓõ¦&RljBHøèøÔÑèxMïÎÇ5½¥þ¸þi_\?0vÁ20j j[ú\„o¹’a(L úÞïÕ¥S^¥–ÿ°º®_È´LG¤Â¹þ€Â9~ýæƒñëôà«eOÅjS~n&åo4ïi䇧0™¯æþ{ÌýVÕÑ“VUæ_IM¼- ﶞѺ­™!;†ONu û“w~ö'Cm¶‡Ú]‰»‰®Ë}µ—¥‡KnüBn Tß[¨æŸi㔥¥q Õ«tpËM×íÙ`\×Ðÿ§ ýTë¨>ô6}µ­·‰¾ ƒpö#mAû‘¸!>7$:c#‰Îè­ðÑ[cUW.ŽU Ǿ¶ ÇŠ¡ÓóîÐÈ+º5rjÍÜÍg´îfäÉJáü³aÎîx¸#ÜQ #c†ŸoÄ ômý–sÚzä?·LG$ujë·ßLÙÕ­ÕÉêìÛ˜ÝâOÞ{ÏŸ\:Mãµß¸ãµ[U-ƒ‹uD 70öµm`ÌÝÔWënÒÈ·œ×Èé¸ÂµÞ¬pI/V{ŠëbUÁMmª 1„v½0„’ŽÙpÒêU:Xî‡ÏX.éøùFÒÑjùt¬ÕÂïvÔ‡kŸêÃÔù‚¼f.Á0£U—¾­rVtËœÔ2еÐjùìv«e`ì¢m`,ó“4¨R¾õ|¥<ñçžÈÆYq:嬠V4Ùõ³wáø÷•20zÁ20Jc]éÕÛz㎷53$Ý«o0m­oHUîNè§'2?åÒ|¥uiÔAu“:HŸ¢ôÒÃӻ§SHÃä®&_ÇP³pö@æùÖ)?ÜP§¤wi´¾ÇþÝC]zΧӣºXz /î|Å¢ÐTšT²BÊ«×zVßkM——\#¯S7·©ƒÃ±o:þP‘[þ ¯oüy!ÞÖk×¼­üÙ }Ô0 ý|K‡ðôós¦×ú•¶×*üz¯SËë”éøåy]™3Ä^/¹Õgáõ àÝ‘ã‘þäÝ9Rzÿ‘>´tÈáø×¶á¸Î]}Oç¦)-™aÔÁÍíê Ò4=°òÃÐTAÎ?;Éùc†§gcêÈ O5 ˜÷4 ð¿*‹ /MTï99Õ1ânêQ¹›P½J‡FVÑ­‘)œŠU8-- ƒ>Ïí'>Oæò Dúúâf8¿* úD kŠÞ¥ë=ê{¼?êËü,0¢®ál_äÄÆ/%=õª‘o9¯‘›û÷ï4÷;+Ïh•¥ª¤#y7éHtýäMtµZŽ ¶Z¨ÕÍ i:xàCÓAןèüÉ›èd_>9ξŒø¢G|#m÷û½Ë¾dO±/cµ?öÅjYîÉg,—í¯Ÿšx3õ8sªræì~xóàáó F¶é„FF!i€Ï{ûŸWzÎ/žÅ‹;_±§>>Ù8År3§YŽ}Éžf_R)S É,_êx¢ã^Ûµ«^¥œÆM׸u÷jÜRò?·úFF«®]­¢ò¢˜Ó'#Ži)ç[jrK?ççXÎ/äzOùç’)¿³¢G嬠¹‰Î„?ÑùêŽ0xøÏ gðˆ½^ÄÖg±õ à2?????oî?ðGs?ÿH6Ïÿö¿ÏéQ;r+z$rkéðªÀ¦ªÀг‹Ÿ=ã§D~ ±Ú{cµúÐ/ô!Käð1K„žÖ¢¢»kTP ©ï_„Rß›Ìûß7™é5·ðÒéCµ?êCíC'íCóP’¨¾Y"G?·DèË ÕªuBê3d^_Ó/ÙSÓ/5²-ç4²ô»þ%ýnqâ/tz¤åÿ¯ÿò|u^52ãÚj™‘ZÑ•ÍÃDçOžtÕÁNw ðÃÇjcñZ~}à¿ë±yÿæ±Ñ],3þB„—R„„r¾ùª…H¿ØðT( ]ûüwùO)‹åR¹‚a†ž|1ôŒžŠ“ÿ™éáǼôÝ'·ó-bÓ/öz_Zºë°\‘þ””ëEx}έ¾¬”ÑmcÝFOk¡¶GûBm‘[öEn¥_£GÞ¼>±GnM¿|bŸ~™~eO-|¥þ=Š“ÿW(~#"iYàåÏ ƒ¾ë7ÿÓw][¿íRöõ¡|ž›|ú­»1rôóÆÿ]…K±[áâÇ@“(i2 Må^Þ¹¶Zá¤ÿ·¶Q 4³}踯}ˆÖ‚Ì-¼4Õ4Xss°†¦…¢ƒ»4Q}Õ~{fTÓÇFbzºH”Nån¥³aðÐG GL@6üëKéTìV:§SOŽO¿šø–p¼˜L8dFY…ÌXœø \5&óÞ­&s)¬I-9ý_f,W¼)Ó7£kc†ø7éu 5òM'.¹ ‘m>¡‘ÑB ™ñ:|!9ß·©NòÏ×0¹kÖ0™ž6ûžN^WÐüaýAyÍÿ”*¨jR=¶«W=¶±ªKgƪ”=ê&em1GO8…Ëÿ¥ëÃÒ«mæv¾¹ÉÜQ¿ï̦žž]¸6Ëýx–åhVæg ^¼å7Ñr¾«§®½9_nb.¹Øº‡üó}µÞÄ‹pjbáëâÆÍö˜&þ¹‰Dj"áOM4F,Ç#Ù·˜ËOþK©RÎW¬ÌÍ¥‡/túi-rêÐìj v ÑTnŠyüúwƯ§ÃÎ%Š{½ˆ¯oo¿e:"F/µn´]±n Tßý%P­ë}ÿñbë<òÑ¢à4Þ0Û5´>#­ìÆ?âªü‹ÚUi2ïÝb2/üD¹’a,‘C‡,Z­ŒÖ‘¤ÎÆ.XÆŒŠ=ëŠ\ÃçŽF …Úlµ£J•&ª“´l<}iI׺äÝdWÿØE[ÿu%#¯„)W2 tvÌtË3t}ѪX½Í}úÞæVKË`«%ó“ÑñÇû£ã´-@þâÏ== mYfTì.7*ÆÎï-ímh,]ÑŽ™Óœc†Z~ºÞi\gcäС…ãôI¶ðVÕÑÏ»—‰ /–:°þ@ºÓ$¨{¸#¨Ëv¾´Ä„«²[檤º«:+{Ô¥±¾§ šfÚrNk¢³­ÖGÛÍÑâ*­GÚî·áwŽÓUO? ò?E-?DKoBŒå †‘ešÅFL ÏÿÜ꛹oé(túS~n&å§1´4•,•¸«òK™«²ø×Knõ à]°LG¤ýˆí?ìGhzuMßÎÇ5}B¦áÐî´ôPžmƒš„cv2á¨[·gCÝ:š>£¾¯ùR}_á\oV8‡Ÿt?[$æËƒ‡.«ê&u€&¹({6˜•=œ.ÉùG·|1ºMJøÜ„Û'w…Û…Lb‚•"7®ÕÉ´É’vߎ[Ú}T^š5šnÍšæ»~ão¾ëÈ+áú/÷éû/«ë¨^]_Ú}º¿k÷Y"‡[,«úØ Uù)Ú|€åfþ=ûf5¹ÅŸ[z@8énîÓ»›3·+5Ûµ«[Üÿ&n –Ÿ®wlë9ÌÝtfÛb[ŠÕ¸wܬqkÖh¾Ô¬Qßßܦ¾_eÒ~[e¢M0¤„» 3¡EKº¦O¥º¦M÷ÿÁtvà¥W~H¯íÊE¯åžže9Š™ê?­’¼­nNçK³ èîlÝØrÁºñU<á]³†ðÂò»è±É² ¹Q³fëyÍš×qÖ0õMýõ÷¹$Ã8+»åÎJªÞc¿zÍc§íD¤änõML}{¾¥v=*ý4"ÞÝÔWën¢¹;³qÝž Æu&óþ¿þa;—ëE|}Î¥¾¼ ÊhÁHÚaÖk¿ñ½×NG5Ò…Ûn·×ôíü¯š>ÚÜ@ÈdÏRVß`ÚZß`ízau±_Ä»X”2Àê5¦½rqL«5i/¥ç'ÉŒôð—=\äÝ_}ÕËr£?yo­?i‰n±Dé8 ã+Gv€pãß“ql³¢¡#$²0E¾6Ó”¬^èˆ( Úàk¾wž™ï}[ÏV(/!~ƒ,€BCG$:" àÐ ð– ·?Ün/+++++c˜¹ÄJÇ/%=áöÉ]áv!Û­¬–Ü+…¿¸Òæé-tèõí>w”ï»tî(/@y-Ï'€úú_š¹÷öÕ·R³LGd³º©§Y])×tWÊ)»•® f¥‹Ž'»’w“]üðü‚YXH¿S–•ÉëÞÓ¥«&¿êd†ï>íÎVüöÆÏnÛ•.ån¥‹^£ŸlŒf†žžÜ8ØÓœƒåçOU½öRU½?qwÎ Yr¨‰4„wÍÂéú¬Ü­tÑ6õÃq6…\Ž›˜ sQKKc”®&jlgÜÁ?þB§G865sšMQâúøH\Ú’/ºÞê{º^áÛ­DǧŽFÇkzw>®yk7 ZýÊ•é-tÕ÷~¨FŽ |åUõ ¦­õ .Í_T.ÍÛ’þÕT^«=ÿ—Vüç“·;?…ÁýåÝ­ÿ¨o«=?—Ù5[á\@áWÝ<9®ÒÖogµõôUßjn¹`57̧ .ÿÜ„‹Âg«| }Ô0 ¬? d¾›šxJMPÑ.­cøäTǰ?yçg2Ôö`{¨M#ßr^#OvýìMv1.†a\ cÎ%=ÂÉ¿SÈê{=jÕÄ&V5A]S––Æ©˜>6CDIà&8–›0®Û³Á¸ÎÑr§£?0q7xU낺û›‚:&PÞÄWÂÙ´íGâ\|$Î%®Ç$®'É»I‡Á¹ë¢Á©™ÖÄ5ÓVõ±A«º8ñ:=Âiäݹ¹ÿgîwÎhÝ7ÓǸQeVâÚ÷φ9¸ïáŽpÓ>÷œir¯€· €Ô7j<¶«}Òô¯,)Ï'ÈOx—ë?¼ù¹ÌˆH·õŒÖmÕÖo¿©­§#²ºµ:YÝb³[üÉ{ïù“KÇ@£¼öw¼v«ªeЪ’’ܱ¯mcZwuAÒq…k½YáC~ÓÓÅžâºXUpS›*HG ¡]/ ¡¤c6œtà’(,÷Ãg,—tü|#éhµ|:Öjá_œúpíS}˜:WÂÌ%f´êÒW£UΊn™³‚ZºZ-ŸÝnµ Œ]´ Œe~’~±©”o=_)Ï_ü¹§§pœ§SÎ jµ^ýXRF/XFi¬(½z[oÜñ¶f†ŒëŸöÅõô{{z„©rwzDE#Ö¥‡§w…O… †É]ÿ0L¾Ž¡fáèøÌó­S~¸¡NIïÒhwý»‡»ôœ§:@?ƒñó3û €\Ê«Ni,¯SRÌttFüßü ½Ö¯´½Ö¥ãžÐÏ–T[ÒéY¾>¬^(ß•*_~úí¶+öFJ È6&]x~¦ÃÇG¶êàæ6uÊ7³Ez×ê¿Øû…Øü”Î1Ó-wÌt µ;†è !]h:á{:y]f:©þÓ½@Jýá×Roëµké8éSÔnä–þÕR^BÒç“lÏ'bê3ÚÃÕÚ^¡þ¯Ôó¹Øú/–Øú/ö~!½=Y)9®éOÞó'õ¡÷éCK‡ŽmŽëÜÕ÷tn²›FÜÜ®ò'YSñÃÐTGÎ?;Éùc†§gcêÈ O5 ˜÷4 ùª/$=¹¡‰ê#'§:FÜM=*wSiù»I#«èÖÈNÅ¿*œ ƒ––†AŸçöŸ'sy"}=r3œ_P}¢ Ð5HïÒõõ=Þõe~–~±¡®ál7*±ñKIOk|ËyÜÜ¿§¹ßYyFë¬,…²£Q¢‰®Ÿ¼‰®V˱ÁV µZ™!M|h:Hãâ?yìË'ÇÙ—_ô㈯c¤íþbŸ¢wÙ—ì)öe¬öǾX-Ë=ùŒå²ýááS/Âb¦BdN Ñ÷tèøãýÑqúæÒj9~»Õ—¾ ¨ª&u ³µ­ºòõh•%r¸Å‘~=¦ã¼vm´Šî/t'rLŸŒ8¦³…_:ý¥Y^¹¥Ï'ÙžOrËO´‡¥Pÿ…Cý_©çs)í¹Rê¿û…”öd…ÍÏÏÏÏÏ›ûüÑÜÏ?’ÍÄó¿ýïÄsªú‘[Ñ#‘[K‡W6P†ž]ütèÿ80?†Xí½±Z}èƒú%rø˜%Âj j£»kTP ©ï_„Rß›Ìûß7™é5·ôH§Õþ¨µ´ÍCI¢úf‰ýܡƅjÕ:!õ2¯Çé—ì©é—Ù–sYúÝÿ’~·8ñ:=Òk̸¶Zf¤Vk%ÊëM$:ò¤Ó¨þsú¦Å« ÇjùùÉ×cóþÍc£»@fü…Ÿí\æçy.æÜ³…r¾Âÿârñ?±/Œ_zy--ýhR®xs½ˆ‹_lx CÇéÚä¿ËŠ^¾¥å»²å˓ʂŽ_÷ý÷øuúRJ~Šm¤äO©ÉWûÉ?ßB··™Ìý‡™û»¦¿ˆuMg ã¬èþ'g…¤#©ïSÓ©ïeFY…Ì(üù0³þdæ¤Ø§M!é/åòZ:ýx>[Û…çç»Ö®Æö õeŸÏskÏ…§?·úŸÛý"_ÏW£ÛÆþ:ºRj{´/Ô¹õh_äVú5zäÍë{ä=÷¦_ÙS _©â\˜Úð¡6#"iýæï»~ó?}×µõÛ.¥§l/þ柇úz#G?o\ð[¢Â¥Ø­pñc I”4™‘¦N/ï\[­pÒÿÛ‡NÛ‡(ŽÞ>tÜ×>DkGæ–)hªi°æþæ` M -Ñ^çwÕ·Qí·gFµ´‚']$J§r·ÒÙ0xè#i¿x¼;ø×£Ò©Ø­tN§žŸ~5p=áx1™pÐã{qâ/tz¤×:“yïV“ÙÝ|Fën^á²s)v§²ËoòäÍèÔ˜!þMÌ@ÿ×È7X¸dF¶ù„FF dÆ_èð… ä|ó¿¸% „”¡{œ!¬jó§~×íÝj\Ç0sIiñçV “»f “üñJõÍÖ¤‘Ñůÿ™›×Iò-òU×H/•£l8 $Éÿw±–Dx~ŠmŠ™?…¨Ï…h?ùíy¡Û[>z>÷yo?ñy;†NF;†²…¤>ïÍ>/ÍÊ¢o"ZÓ¶oµ¦Ìï;¹]D[¿å\öoO¹¥¿4ËKlúñ|’ßú𮵇«½½BýÏ­¼¤ÿ)í¹ðôçVÿ…ß/V#A‘4;½qêãkœò?¿ýßþç´¦ÞÒŸêm>oêm¶ªŽž´ªdu2´ÕLÒ÷åŠ\cÈoz2éÜï?Ò¹¥¯ÛÅDõÊ1}2꘎úÿ©¸SwW{¾Q×^æ”g:¢5m¿©5'þB§G:ú‰¥·ùüÞÞæÒ_@P}’ÞÈ‹M==»pm–ûñ,ËÑ/x™Ÿ-txñ–_ªYÈùæ/?gNK[k&­^D4´bMí¡É2ã׿{0~=6Ÿk® 9ßX-{*VK)YøšmªÈ›òâ&æ’ù^7Š?QEÈt!áQ¾…(ßÌ.³l¯ óêçéÐb†ŸnÄ 4HJ~Šm¤åÏÊ×g±å%ö~‘[{›[}pVvË•´28ÿK~&ZJ…ž¼ö›¼vš”ݱ´,¸PÌëQxúK­¼rM¿¸öç]x>‘’ŸïZ{Xjõ¿ð|žßü—Öž‹«oŬÿ«Å2‘£ŒZ7Ú®X7ªïþ¨Öõ¾ÿx¹uiQOŸ˜mCZÏ‘ÿÈNG\•Q»*Mæ½[LæÌ̵D²Dhµ5úÅ’ø»`3*ö¬_l%&!é‘‚~) µ?Øj_mà]Au ×zVßkå/ÕL]BýcmýcÔ•Œ¼¦\É04²˜̦둖ûímîÓ÷6·ZZ[¹†V·É\ú]Zü¹§§8hË/£bw¹Q10v~oq·ÍKT5©‚tE8fNsŽjiéz¡q‘C‡Wž-¼UuôóÅÚ^±áÅRÖH?uwuÙΗ–hpUvË\•ôÀAw%geZÚúž?Ý¡:F:ÿ§c$½ò\"=Û@Jü)?7“òÓo¶é¯åÊô–«òK™«¨ë“Òöq´XJë‘¶û­GøïtUÒœ‹\)¦-ç´&úÑ1_«ÿçzAùæ·|3»Ì²½ò?Eë€Óÿiû2£bφ…O†bó“ß>8f:ã¿n¯úô ǹKÉŸR#¤¼ÄÞ/Äægnõžú¨K‘~lr¾˱ÆHÿØ ¥ŒÎ·1røXc¤ø×cné/òÊ-ýÂÛÛwçùDJ~®ööPØ÷…R¬ÿ…ƒçóü>ŸKiÏ…Ô·b>oOJÇ2‘ö#¶ÿ°¡éÌ5};×ô ™ÖA»ÓÒE’mC˜„cv2á¨[·gCÝ:žª¾¯ùR}_á\oV8‡Ÿt?[$æËƒ‡.«ê&u@Ù£nRö({6˜•=œ.ÉùG·|1º-·ôH‘Þq¯t÷$¹q­Nn¤¥µûvÜÒî£òÒ¬ÑtkÖРhßõó]G^ ×¹Oß™o¦ëQ»O÷wí>ZÖݪ>6hUg~Š6C`¹™ϾYMnñç–žb¢q‘ôà’¹%W©ñØ®]õØâ†ø7qµ´t½hd[Ïidî¦3ÛÛ’«Æ½ãf[³Fó¥fúþæ6õý*“öÛ*--%|n»ÂÑ¢]Ó§R]Ó¦ƒûÿ`:H;Ò+?¤×vå¢×ÆrOϲÅLõ‡V%ÎG~ŽýÕc£:ÿêþåÚ`Vº¨]’3v7õÕº›hîå†qÝž Æu&óþ¿þa¯8õgì¢Ç&7Ê*äFÍš­ç5k^—à¬a2ê›:ºØtšU@wsëÆ– Ö¯>Þ5k—öõ‚ò]ùòM8^„zªŒúž|õ \,=?½¶kW½¶¸áçqƒ²GiTöÔôéîÕôÕ›M[ê_‡3!·ü)5ÂËKìýBl~ŠE?IÒ†ôUPȧ¨Û1Xó÷÷‚5´ò;ÝAŠ=æ–þÒ)¯ÜÒ/¦ýy·žOrËÏÕÞ ÿ¾°ÚÛ+Ôÿ•z>—Òž‹©oÅxžŸ¥£ŒŒ¤f½öß{ít¤4“ °ÚÕ7˜¶Ö7B»^B]ìñ.y›pûÃíáöš¾ÿUÓG ´ó ¡?qç'‚&vÑ4+”ÈÊæ'͵ªÚ·ãfÕ>ÚI–ÆÔ¬–X]éÏ,¯Õžÿ«½> =\]í@©Ó^¹8¦Õš´—Òã=eFúGøË$.òî¯Z¹±\!7ú“÷Öú“–èáK”ŽÓ0¾ß¼ÅùP‚Æ=¾'ãtA¬4Q+¨»¿)=݉&X¹*¿ªrUšû÷ï4÷#—J!?i„ u ¬Æ.°ÒL¿ðòZíùú°²×ï»Ö^¼ËÊ‘+KÈÂù[ÌP^ ­$e=xì‚õ [7£c_µ&çÞÝ&'-ĸ†q½ÓÙ„üDyêÃ[WPÿW <Ÿ¯.˜š ðŽÂÔlx« # ‘Ppèˆ( pûÃíáö²²²²²2†™K GJ/ÅÆ/%=´*Šå´Ws œK¤— §WÔ ËtD6«›zšÕ•rMw¥œ¾N(]ÌJ§­ëùáù_<~ ù²¬L^÷ž.ýÕ‹ÿÕ(3|ÇðÉhÇðb)šK0Œ½ñ³ÛöF¥K¹[é¢×ÆèÇ'£™¡ƒºû›‚:CXÿÔNÇÿžN^Wßð§õ ljæ4›’’}ö4ç`ùùSU¯½TUïOÜóã WÉ¡.Cx×lº>Pý¡#lê‡ãÒêû†›˜ sQKKc”®,jlgÜÁ?þB§çÝAm#åa\‰ë‘'ù¢ë­¾§ë¾g_t|êht¼¦wçãšÞÕs–åÊô¾„ê{¿T—NÊVg~¼=–éˆT8×P8ǯß|0~¾TÄjÙS±ZÚÆ¾aм§ažÂd¾šûì1÷[UGOZU™%5ñ"´0¼ÛzFë¶f†ì>9Õ1ìOÞùÙŸ µ=ØjKt%î&º.÷Õ\懤. ãº=ŒëêÍz¿ÞL%ÑIt*œŠÝ gÃà_¥_,¹ñw ¹1P}om š¦S––Æ)T¯ÒÁMplº>4ôÿigCÿ«úЕ¸›èêmúj[oSæNO°4û‘¶ ýH܉èÊŠÞ ½5VuåâXÕpìkÛp¬˜ñ:=ï¼¢[#§ÖÌÝ|FënFž¬Î?æüᎇ;ÂQˆüXí–鈤Amýö›Úz:"«[«“ÕÙ-¶1»ÅŸ¼÷ž?¹t 4šÆk¿qÇk·ªZëˆn`ìkÛÀ˜»©¯Öݤ‘o9¯‘Óq…k½Yáâ‡d¹™Ó,Çùg'9ûÐñÛíCÔÍDé·ª>鱪Âÿî’ž.ö×Ū‚›ÚTA:bíza%³á¤Õ«t°ÜŸ±\Òñó¤£ÕòéX«…ßí¨×>Õ‡©óy%Ì\‚aF«.}5Zå¬è–9+èÊ¢k¡ÕòÙíVËÀØEÛÀXæ'iDR¥|ëùJyþâÏ==³âtÊYA­n²ëgïÂñï+e`ô‚e`”ƺҫ·õÆokfȸþi_\_ß`ÚZß!«ÜÑO?Nd~Ê¥ùJëÒ¨ƒê&u>E#§w…OU¦†É]ÿ0L¾Ž¡fáìÌó­S~¸¡NIïÒh}ý»‡»ôœOÇo,¯SRNÒ_¡¿(}D9ý|H¥“Ž©üäÏ«ð¶^»æmåÏNhøè£†)ù …ã‘þäÝ9Rzÿ‘>´tÈáø×¶á¸Î]}Oç¦)i™aÔÁÍíê ’5}!ᇡ©‚Ô±3<=3PG}ªaÀ¼§a€ÿUY[¿í[m½Î]ýtî± –1úÊG1Ç¿éŽ[UG?—Ö1ÊGÕ;FNNuŒ¸›zTî&T¯Ò¡‘Utkd §â_ΆAKKàÏsû‰Ï“¹¼‘¾¹ί ¨>Qè¤wézúïú2?K#’¨k8[GŒØø¥¤²^5ò-ç5rsÿþæ~gå­³²R•t$ï&‰®Ÿ¼‰®V˱ÁV µº™!M|h:Hãú?yìË'ÇÙ—_ô㈯c¤íþbŸ¢wÙ—ì)öe¬öǾX-Ë=ùŒå²ýááS/Âb¦*gNmΜ=Ào<ÜbÔÈ6ÐÈ($ÍðyoÿàóJÏù”.™ò;+zTÎ KžèLø¯®¸ÁÖ6àqêã“Sô#"û’=;¤R£ÏV^d´êÚµÑ*:_ÊÇôɈcZJ~@!ˆîˆô'îüäO¸›Ï™ÜÍÃϾùbøÙÒáûÇ.ÚúÇZ--ƒ­þqlËy,r+z$r+¦ÄôÑ[öGo±{šå¬[.X7òÃÓWú?M´¤¯ôÅóÏ%9ãTÓ_ÞLˆ.W2ŒÇvãŽÇæn>·×Ý\Vö»ueeò?¾W#ÿ#}Qì¿M¿M•idu4v¾cèd´cˆº®2ã_^±ûMø+_ç#|!Ðùkþþ^°¦kú4×5MW¯cº3¶°K.74fœÆ§ÛU™FVg·´ Ú-áŽÉ]¹Î0 ½öß{íî¦>½»‰r’âo:îkÏZ^¯Kៜü¹ÔÎàú(5":"iYàåÏ ƒ¾ë7ÿÓw][¿íRzÊöbáo>ðy¨±1rôóÆÿ]úšÁ&QÒd@šÊ½ ¼smµÂIÿo:lJQY«KQ¡µ#ÓŸ˜K0Lݺ=êÖÑDòùù_žÏÏÓlë9¬að£¤à Ô¬¹¿9XC_JQ±JÕ·Qí·gFµÔý=ý’=5ýRéTîV:å¥>¼ ø×£Ò©Ø­tN§žŸ~513áx1™pÈŒ² ™±8ñ:=¸jLæ½[MæRX/’Z~ú¿ÌX®xS¦oFׯ ñobú¿F¾éÄÂ%4²Í'42Z¨!3þB‡/!ç+ý¯Ð=6ãO6®Û»Õ¸Žaæ’ùH¿ar׬a2=ý=¼®þ ùÃúƒ4’:{-Ýr.ûÓ”A‘´úRãÔÇÿÖ8å~û¿ýÏùc"²ém>oêm¦ jh\ƒ”„¦×ï+W ÿá³è8”á¯I_b©k2_ÖˆÎýþ#›:FQ±V ªWŽé“QÇtÔ÷øO˜º+&ߨk/sÊ3Ñš¶ßÔšŠ¡ÓôQoóù½½Í¥¿ : úD ÿ³©§g®]Èr?že9š²ùÙB‡oùM´„œ¯”ЈKêìj v ÑÔxšl>~ý»ã×Óa3[x“~nb.¹Ø:›üô¿ÚoâE85±ð5_S§±)ÀJZ¦#r`ôÂáQëFÛëÆ@õÝ_ÕB¦;Ñ¢õ4>1Û54‹VvãqUþEíª4™÷n1™~¢\É0–È¡C–­VF«=Òö4mШسި ÐÙ¦6Œ:&èËóÂ5"/Ú†ãZÓ¶oóÑ1A#†Bí¶‡ÚQ¥JÕÉ^ëY}¯•¾T§k]òn²‹ ®dä•0åJ†¡‘ÎŽ™n¹c†®,Ú΢·¹OßÛœ¹ ‰Ž?Þ§m%òîé!hË2£bw¹Q10v~oioû£ ªšTAº¢3§9Ç Ý)èz§q‘C‡ŽÓ'ÙÂg[SXlx±ÔõÒtAÝÃA]¶óÕ‡>x¡¹*»e®JºßÑ]ÕYÙ£–¶¾gÊÏͤü4æ‘VÚ¥+ŽÚRWå—2WÖøµ¦-ç´&ú1Û4¥ÚdÞÿ¾ÉÜz¤í~ë~g7]Åôƒhqò g™ŽHûÛØÐôêš¾kúøûKfÛe’v§¥/Ù6¨I8f'š:MÓ¯Ô÷5_ªï+œëÍ çð³‘ÎÅVŸ¸Z©vµO­o0m­o0„v½0„ºØ/â],J`õÓ^¹8¦Õš´—Òó™dFúGøË$.òáÊå ¹ÑŸ¼·ÖŸ´D·X¢tœ†ñ•#»@¸qïɸùb¡#$²0Eþ6”¬Vèˆ( Úàk¾wž™ï}[ÏV(/!~ƒ,€BCG$:" àÐ ð– ·?Ün/+++++c˜¹ÄJÇ/%=áöÉ]áv!Û­¬–Ü+…¿¸Òæé-tèõí>w”ï»tî€ú€òZIxþA}(ÚhPcù–éˆlV7õ4«+åšîJ9¿ÒµÁ¬tÑñdWòn²‹ž_QVšß)ËÊäuïéÒM'?ã2Ãw ŸŒv g«ŽöÆÏnÛ•.ån¥‹^£ŸlŒ.V<“»Â톰þ©!ÌOöøÅq°§9ËÏŸªzí¥ªzâîœÍW 6Tv;©ÊÝJaS?gSÈ%ḉÙ07ѵ´4Féê¦ëËÁvÆlñã/tz„cS3§Ù¥!®Äõ¨-ù¢ë­¾§ë¾ÝJt|êht¼¦wçãš·v³ Õ¯\™ÞB'P}ï÷jäÊ·8 Ý> ýy×®÷úÓÖú—æ/*—æmIÿj*¯ÕžÿK+þóÏj¯« îG‹A}{›-Ó©p®? pŽ_¿ù`ü:U‚X-{*V›òs3)àyOà ?<…É|5÷Øcî·ªŽž´ª2ÿJjâEhax·õŒÖmÍ Ù1|rªcØŸ¼ó³?j{°=Ô–èJÜMt \œÞtpÿNÓA£bÏz£‚b¦OV]ùz´ª×zVßk•’}rãïrc úÞÚ@5ÿL§,-S¨^¥ƒ›àXn¸nÏ㺆þ?ílè§ZGõ§·é«m½MÔØpö#mAû‘¸!>7$:c#‰Îè­ðÑ[cUW.ŽU Ǿ¶ ÇŠ¡Ó#œF^Ñ­‘Skàn>£u7£¶¬ØµïŸ sþpÇÃáü¾ |…nÐþ¼;h€E &¸)PÓ>tüvûÒô¯,)íòsu•W)Ä Ö2‘Ô!¨­ß~S[OGduku²:»Å6f·ø“÷Þó'—ŽFyí7îxíVUËàb‘ Œ}ms7õÕº›4ò-ç5r:®p­7+\üÔë7<=7t µ;^5 ÔA`·´ Ú-£Ußž­’’ž.ö×Ū‚›ÚTA:bíza%³á¤Õ«t°ÜŸ±\Òñó¤£ÕòéX«…ßí¨×>Õ‡©n ¯„™K0ÌhÕ¥¯F«œÝ2gµ t-´Z>»Ýj»hËü$]›•ò­ç+åù‹?÷ô޳âtÊYA­V²ëgïÂñã+e`ô‚e`”ÆŠÒ«·õÆokfȸþi_\O¿‡§G˜*w§GÄSç~æ§\š¯´.:¨nRéS4b]zxzWøÔ i˜ÜõÃäëj޾Ï<ß:å‡ê”ô.v÷Ø¿{è±KÏyª }Ô0ÀÏÏ¥Gè‹-¯:¥±¼NI1ÓYÐñG|óg$ôZ¿ÒöZ—Ž_lxB#”©¶¤Ó³|}X½P¾¥P¾ôsº=‘käuêàæ6up8öMç¢rm–ϱñg›Z%dÊ•ðó]íÄÞèÛ¿=§œ¡ë±Ù3ÝrÇ }ã 't9ÒtÚ÷tòºÌtÒõE÷)õ_[¼­×®¥ã¤OQ»”[úWKy I?ž²µoÅ©…«ÏbÃúy÷£•½•æý¢ÔÚŸ’0?????oî?ðGs?ÿÈÒœÝÿä¬Ð‡jÔ‡„„Թߤsó‡ÚüK¨þ¢* úDP8ÿªpZ"G?·DRß¿¥¾ç‡Ÿ~Éžš~Iᇞ]ütè™F¶åœFFŸ¢ô':ò$:)|äVôHä…Ot&üéãüTÉŒ² ™q>Oè¯hMÛ¿Óšú/Ÿû¿ú/ÏCÉ EµÅdÞÿ¾É<~Ý÷ßã×3ë1ýò‰=}=Òÿé¤w'žû™xžíúâ_ûóó¿<ÏGüRÒSh–Èác–HûÐç‘ö¡•*/~žSëGÇ»¦¿ˆuMS[šù)j·Ómrj:õ=µ±ÔòS‡~fü Ã'üoÂ÷å^lýÉ-¼>ôÁ }ȪúÄeUQH:_Êá1›oî?tÈÜŸ¾Çýò|~~üúwÿ9~]zyÑ]2Püç@uºÝKM§¾§æß…ÅÆŸ[zè4*vÿÖ¨ ’¥ôP ̯?RÊ·t |ó[¾2ãÚj™QÈ+…ÕþØ«¥˜i§«8Ôþ Ô&%=Âó_lüÙÂ,ýÙÜηÔÏá÷£ôõ¸û·FÝ3ï/™Ql}ã‹Üz´/r‹ÞÍöTI×‘Çæý›Ç¶ð::tÈÜOך”úÆÏIŠ“ÿˆÞÍ–·BÒ_jå%<ýxþ{?-D}(t}¾ÐÏ{¸â~Tšíð4—Bû#Äè¶±¿Žn£R µ=Új£6!ý=òæõ‰=r‹¾w§_ÙS _©nPœ s&üA¨MtGäÄó¿ýïÄsš²M‰X:¼*°é„*@]‡üã”Aü(¡Ô4PUX$¹ Ã0ÌÂß¡ôƒ/½.¼ñWüßY×ô©T×4U Ê:.¼ãU*ìö¡•ën€¥Q}£ •º¿©P­RŸ!ózL_SoÓ…·ŠbÄ_èôH¯uBé Y^or€ÿpF1™9« §)(?ùïÒW)º dÆ_ˆðÙÎ%_âBÎWʃÈÂøŸØÆ/½¼––^U§\ñæz¿Øð†Žg>€òŸ"¤—o)@ù–Bù¦K¡\Á0CÏF¾z–ù“v!Ò“™ÿbãÏõ‹_.ç[jòÕ>óë[¡ÛóLÙ:ùè+(…¤#ôu‘~"þü™­¾ñsRìÓ¬ô—ry-~<ÿˆ­íù­Å©ÏÂç}Àý¨÷£Õx¿(µöGˆbvDŠØ5Ûç¹ýÄçi´ü¹aÐwýæú®kë·]JOÙ^,üÍ>OÒ‘¼›t4FŽ~Þá¿«p)v+\üh%Mf¤©Ü Â;×V+œôÿö¡Áö!І‹·÷µÑÚ‘üOÑê–þäÝ9’ÁÖÜ¿³þ M§®é£Jiªi°æþæ` M -Ñá¯ï<ªo£ÚoÏŒjcúØHLO‰Ò©Ü­t6 úháš§ ÿzT:»•ÎéÔ“ãÓ¯&$/&z¼.Nü…NôZg2ïÝj2—Âz‘ÔrÒÿeÆrÅ›¡‘ÑB™ñ:|!9ßüÅ/n !åEèžK›³ñ§Ê×íÝj\Ç0sIiñçV “»f “éieïéäuõÍÖ¤µŠŠ_ÿ37Ç“å[ å« ªšTAíêUm¬êÒ™±*eºIÙC[Ò¬”øsËÿÕ{¾…»^ Ñ>óï…nÏùèùßç½ýÄçí:íȺŽ °ðyo>ðyiYú¦£5mûVkÊü>%¥¾ië·œËþí,·ô—fy‰M?žŠ_ŠYŸ…„—Rß„·o¸â~´Úï¥Öþ”A‘´ÚBãÔÇÿÖ8å~û¿ýÏiM½¥?ÕÛ|ÞÔÛLÔÈêdi«K¤îËb>E«[t÷Öt´-IdüÑþÈ8½kí|då++i­ôu4 ˜¨^9¦OFÓQßã?E}ÈáùF]{Qßãý óŽhMÛojMʼn¿Ð鑎~bém>¿··9Ù•¼[ëEf£¨>Q¿/̦žž]¸Ö Ëýx–åè¶ÌÏ:¼xËoB%ä|ó—Ÿ3§Æ/­nC@´¢S¢ë'o¢+5ñ"œš¿þ݃ñëé°ÅXžœ¾¯6¸›xNM,|Ͷïç›òâ&æ’ù^×&s3=éáQ¾…(ß̯|Ù^ùŸ2Øc˜Høç&©‰„?5ѱkŒdßBpùöAZþ Ùoñ0ôÚÒŸ¾+½ˆ­bïG¹µç¹Õ7ge·ÜYIåø_23Ѻöôâµß|àµÓ¶™KËÂżޅ§¿ÔÊ+×ô‹kßÞ…çŸBׇR¾‰­obÛ7Üò{?*µög¥êçʵ'ù·LGäÀè…ãֶ+Ö껿ªu½ï?Ö-³é;-’Jã³mPC˺óÙ鈫ò/jW¥É¼w‹ÉœYù,‘C‡,gå­³’~Q¤8Æ.XÆh…&þg( ÿkP÷÷µAKjµ¿Ýj‘ž‰ôKf¨ýÁöP{i3P¤et©O׺äÝdWÿØE[ÿeXN¹’ah¤3-hM×-¯ÛÛܧïmnµ´ .v}EÇïŽg.Í.-þÜÓSô£ˆQ±»Ü¨;¿·¸ÛæˆE¿mÒá˜9Í9f¨¥¥ë…ÚÏÆÈ¡C ¿>‘lá­ª£Ÿ/v/^,u`ýôM=¨{¸#¨Ëv¾´Dƒ«²[檤8º+9+{ÔÎJéùIw¨Ž‘Îÿé¡úIEúoÅ)?7“òÓoà´.]ÔÖ¹*¿”¹*™"¢íã^­x¤í~ëþ]˜®Jús‘+Å´åœÖD?:ú¼·ðyK¿5Dù¢|3¿òe{MÿÝøH\O¹^š¾´”+Ff”i/¤}’ÿBâçç ?LæÜ ¾ÜηÔ©bïGüöÜ1Óÿuø>ýbóÄÖ7zª¤.Eú1[ÈùÒ×òþ±AKÿocäð±…wÒâ\ï¹¥¿tÊ+·ô oÏßçŸBׇR»úy÷#áç+ìû`)¶?…®ŸÅiJÁ2‘ö#¶ÿ°¡éÕ5};×ô –L»ÓR&êz«ï-Öq™pÌN&uëöl¨[GÉÕ÷5_ªï+œëÍ çð³‘Îág‹Ä|yððÀeu@ݤР_eϳ²‡óÏ%9ÿè¶‘/F·ñÃÇ ñ‘˜¡¦Ow/òÆ©£'§ÜMg´î&ê¹—ž‰éñò3  An\«“i’¾vߎ[Ú}T^š5šnÍšDæ»~ão¾ëÈ+áú/÷éû/«ë¨^]Ú}º¿k÷Y"‡[,«úØ Uù)ÎϱœŸåfþå–þýSlü¹¥§˜h\$ÝØÒ]¥Ëc»vÕc‹âßÄ ÔÒÒõ¢‘m=§‘¹›Îls7e~ªÆ½ãf[³Fó¥fúþæ6õý*“öÛ*“³¢GµØ²ÂÃç¶ $-úA+›îÿƒé í(G¯ü^Û•‹^Ë==Ër3ÕZ•8ù9öWêü«û—kƒYé¢vIJÌ4"ØÝÔWën¢¹ ”Æu{6×™Ìûwþú‡½âÔŸ±‹›Ü(«5k¶ž×¬y]‚³†É¨oêèb#ÐiVÝÍ­[.X7¾úTx׬!\Ú× ÊweËw.™ÑCíÅì±_½æ±{m×®zm¹µRò_Hü”'»‰ÂË\ηÔ¯bïG”qÃÏ7âeÒ¨ì¡ïõfÓ–ú×å%n¼ýäÙj96Øj¡®y!Ÿ¢nÇ`Íßß ÖÐÊòTCнç–þÒ)¯ÜÒ/¦}{·ž WJóþUèç=Ü„œ¯ðý~QšíO)(£#Ì{¼öß{ít¤4“ °ÚÕ7˜¶Ö7B»^B]ìñ.yPhþÄŸü šØH“ÅÆ@s¹ªöí¸Yµ}ùä8û’ư¬–X]éÏ,¯Õžÿ¨«…ôûÅj4¦½rqL«5i/¥ÇŸÊŒôð—I\äÝ_u×Êå ¹ÑŸ¼·ÖŸ´D·X¢tœ†ñ•£’Ó¸Ç÷d܃|(š*Èr3§YŽÖµ§©j®Á¯>r šû˜¹ÅL#’R/ºWç—ÒÒL¿ðòZíùúPj w¿€¥¡#`… YØAØÂÿ€òx×ÑJjÖƒÇ.X²u3:öU‹mrîÝmrÒBOŒ‹a×;M(/xç¡ýY)èˆXaè´By@¾Ð8¯Èø#&2Î0Ì~äÊ `1hVÊoPh舀‚CG$\ÖŽÈpûÃíáö²²²²²2†™Kˆ‰”6䲜¾HImÚ\"½½J‹­´ä#Þfbógéðůÿ°ú¯ß¦¿Ð-@~¯ å>[ê×Ú[ä'dS‘ºÞê{º^áËùGǧŽFÇkzw>®é]¹¬(W¦· Tßû} •ŠSÿ‹¯¾Á´µ¾Á¥ù‹Ê¥Y9¼XúWûõ›Ïô¯öòÍïõ%ýþ²²ùYüûãÛ]`e•ÄÔlÎ?æüᎇ;ÂïP84¶(Pܨi:~»}éGù¾Ý¤Ü_J!?‹yDý€BÔéÒ|¥uiÔAu“:(¯{O'¯kŒ~|²1ÊMp,·`L ½+|j!…4Lîú‡aòu 5é2'ßÅõOûâú:å‡ê”ôn¥\Ó])÷Ø¿{è±?ûÒé1–×)•.ån¥‹RE)dS?gSüðü)fÞÖk×¼­”~úTÃÀG5 H _jù#V©åØðbë¿ØôKç˜é–;f:†Ú‚C²ºµ:Y]fJøi2)²×zVßkM·r¼NÜܦǾéŽå÷|³¥_ÊõK㿨ìè*nV7õ4«3Û·d×ÏÞd¥“¾cød´cXzûP¸òå½`Uº6˜•.zõ¶Þ¸ãm•ž?bï¥v›Ÿ¹¶'BëC®÷ÇÜëÛÒç‹ûH'¨#2â‹~ñ±/ÙSìËXí}±Z–{òËuŒœœêá‡LM¼‹™Z˜915ñ"”š ã™“ï̃‡[̃Ù¦… µ=Øjóyoÿàó?ûRþ¹dÊï¬èQ9+]‰»‰®DgŸèTTŸ¨ ƒ‡ÿÜ0˜í³£U×®VQúéLÓ'#Ži)áK-¤(…ü^lý›þtGÌò¯™ñGÇïŽû“wçüÉVËñÛ­éeD#m÷;F¼¶kW½6JyôVøƒè­·î^;_å[ˆô›øÐtPá\@áLtþäMt²/Ÿg_R‹GçÅß0hy}E':c#‰ÎD×OÞD—Q±kÖ¨Èoû –ðüI:’w“Jy«åØ`«%³%Ï-ÄÞ/Jíþ"6?E·"ëƒØôK©ob¯/Ü¿ Góóóóóóæþ4÷ó„ÚüK¨ŽL¿dOM¿œçñؼóØè ê|þgççy>¿ !ácµ±áXíÒéþ¥§gi鯎åŠt~fƹ=¹%<%K‡/fþNéä”ü^Äž¯æþC‡Ìý]Ó_妅×ù¥Ï%Kå †z6òÅгÔ÷/B©ï q¾K§¿í ¿}[þ‰}aø|µRÚáå›èüÉ“èL§$øÏéN.)ù#ö~Qj÷±ù™ßö¶õAxü¯/Ü¿ÞV£ÛÆþ:º-Ôþ Ôj{´/Ô¹õh_äVú5zäÍë{ä}/N¿²§¾ÆjìÕRœü¿Bñ ©‘o:¡‘/8"Û|B#K:~¾‘t§Ã4fˆ3,žâwãú<7ø<†°þ©!œž ÷žN^g\·w«qÃÌ%³V[¿åœ¶^øßZ:|1ó‡?1PÈôF±áK!Š_ßÄž¯p´Ù…Ï{û‰ÏÛ1t2Ú‘·ußTAU“*è±]½ê±U]:3V¥ìQ7){ªêµ—ªê}žÛO|éç[ˆô )_~û¶0|E÷Âð…h W¾ —b·ÂEÿ—Ë2cú7ÓœÅæÏ‚w ¾Ð„ägníC¡ëCnñçv}­Þû¬,A‘lêéÙ…kK±ÜgYŽF¬ä#åÊåB¨ªOÔ¥Ó“¿ly“nb.¹Øºfq}|$®¯?hþ°þ ­¨ESiòàøõïŒ_O‡-Æö;ÅÌþÄ@!{׊ _ ùSÜú&Tf—n¶Wþ§œ•Ýrge«åÓ±V ¿JÈ5˜p¼˜L,Ód8°Ç<0‘ðÏM$R j¢1b9Öiœ²´4NI?kaéwý )_~û¶0üÌéåÖÚ“Ö>,Ÿ~iù“Ÿë%[û_èðRÚó|Õ7±íC¾êC!ê[!êO¡ÛgX½uD:fNsŽÚ: Ù•¼›ìr7ŸÑº›­ª£Ÿ[UÒ¡¬?þÔ=ÜÔe†¡±WúÐ/ô!We·ÌUI_¨hûgeÚY™¯LÑš¶œÓšh"[öÕ¾¸™”ŸÆ˜(œŠU8éë"}!tU~)så-=B3V#±ùSšù™Ù¥›í•ÂÓö^ûÍ^»cúd4û nü:Ï¿½öw¼Y·‰ ÚN#Ó[‹P§I¹‚adF™æÍh»\O¿Øë—ÊWç~ÿ‘έ}kŒ:Ôá‡7*ö¬7*:F:ÿ§c„›˜ sT+2Ç~Ji„¤_Jþ¿^„ç”ûE)Ü_Äæ§ØöAJ}’þÜâ/\ýÁý ²ÔYãÞq³Æ­Y£ùR³F}s›ú~•Iûm•‰Åç‡Ìm—RUpS›*Ø5}*Õ5m:¸ÿ¦ƒ´ƒ*½òCzmW.zm,÷ô,ËQÌÚ}º¿k÷»»Øf¹¡ÝBG·|1ºÍº±å‚uã«ó ïš5„) MÏt7õÕº›§>þ·Æ) c\·gƒqɼ§É\üâ,Nþ¬^bóGlxé»ôæíK’(\ëÍÙÇ:Qw7õ¨ÜMt òk{vsÉôˆ*eϳ²‡ÎÑc¿zÍc§íkŠ“~±×/ñØ®]õØâ†ø7q¥_³FÓ­Y£‘m=§‘¹›Îls7- ?öWºHh:í:M[|ðCJi„§?·üNlþˆ½_”ÚýEl~ o¤Ô!éÏ-þB×Ü¿ S-Ù0`ÞÓ0àµßøÞk§#È€Õ‹¦WíÛq³jítLcŽ~”/ ?Q€oL{åâ˜VkÒ^JÏÏ“é)W¼ »È»¿ZNJn,WÈþä½µþ¤%z¸Å¥ãáöÉ]áörd7ÀÛ‡FH¥&^t¯ÄŠœH?òù‰óÈôÖvD ™»R§¼kÞÚŽHt2”Žß  ÐÐ ‡ŽH(8tDP¸ýáöp{YYYYYÃÌ%#¥—‡bã—’žpûä®p»íÔJ)÷æé-àèõmªÏ¸B‹yu¿þÃê¿~ ›~Ü_J¹=ä'¼­–éˆlV7õ4«+åšîJ9ÝØ”® f¥‹Ž'»’w“]üðü…… ¿S–•ÉëÞÓ¥oü¦33|ÇðÉhÇpfz„ÇO¸‰Ù07ѵ´4Fé]J¿ƒíŒ;XéÙç`Os–Ÿ?UõÚKUõþÄÝ9?n%‡Ñ á]³†pº>+w+]t„MýpœM!—„+ôõ%6þB§çÝÁ¦fN³)Êø>>×#OòE×[}O×+|;µèøÔÑèxMïÎÇ5½+—êrez ¸@õ½ßªQŽPœú_|õ ¦­õ .Í_T.ÍjÌáÅÒ¿Ú¯ß|¦µ—o~¯/é÷—•ÍÏâßßîúPLËìš­p®? pŽ«nžWië·³Úzúªo5·\°š æÓ † —nÂEá³Ýü>ú¨a@X@È|75ñ"”š G¥‰ß~¤-h?çâ#q.q=ö q=éHÞM: Î] NÍ´&®™¶ª ZÕ¹eŸÜø;…ܨ¾×¨VMlbUÔåÑ8eiiœŠéc#1|/ ÜÇrÆu{6×9úOîtô&j]PwSPÇÊ›˜òJ¸B__bã/tzÞyE·Fnî?À™ûÝ3ZwÀÍô1ndÌJ´]þÙ0ç÷=ÜîcÚçž3íBî• ý@¨ n ÔxlWû<6¤åûv“r)…ü,æýõ ¿–鶞Ѻ­Úúí7µõtDV·V'«³[lcv‹?yï=réh4×~ãŽ×nUµ ZUù=ìñÏ%f´êÒW£UΊn™³‚R® njS[-ŸÝnµ Œ]´ ŒIùë]ì)®‹¥8éˆ!´ë…!”t̆“T¯ÒÁr?|ÆrIÇÏ7’ŽV˧c­þÊ>\ûT¦Îä•0¹__ô v¥|ëùJyþâ/Æõþ®qVœN9+ƾ¶ Œ%»~ö.ÿ¾RF/XFi¬+½z[oÜñ¶f†ŒëŸöÅõ4~!=BV¹;=¢Ÿ~œÈü”Kó•Ö¥QÕMê }ª1úñÉÆ¨ôðô®ð©…Ò0¹ë†É×1Ô,œ y¾uÊ7Ô)é]­ï±÷Ðc/~I¥Óc,¯SRÎSª(…™#Ðùó$¼­×®y[ù³ èçF)áK-Ä*µü^lý›~é3ÝrÇLÇP[°cˆî ™)á§YȤÈ^ëY}¯5Ý>È5ò:ups›:8û¦s8–ßóÍ–~)ׯðö“î”N~øl3œÄ¶…+_Ü_„Ü_Äæg®í‰Ðúëý1÷ú¶ôùâþ VŽkDú“wçüI}èýGúÐÒ!‡ã_Û†ã:wõ=›¦ d†Q7·«ƒtcHßbgÜ iÙâ§©…œŸ›áüª€êU aÀ¼'ݬSø¨ïñþ¨/_YIÕ;FNNuŒ¸›zTî&T¯Ò¡‘Utkd §â_ΆAKKàÏsû‰Ï“¹¼!åú¢_°©k8Ûƒ²Øø‹½¿W|ËyÜÜ¿§¹ßYyFë¬,…TÑ(×D×OÞDW«åØ`«…ZÝ̦ƒ>4¤qý‰ÎŸ¼‰Nöå“ãìˈ/úqÄ×1Òv±OÑ»ìKöû2Vûc_¬–åž|ÆrÙþŠðð©‰a1S 3§"Òì:ž9?ÀoñK*åŸK¦üΊ•³"Ñ•¸›èJt&ü‰ÎWWèàá?7 fûìhÕµk£U”~:SÇôɈcZJøRË)J!Ć[ÿŦ?ݳükfüÑñÇû£ãôdÛj9~»Õ"½Œ¨ã€Ú¯íÚU¯R½þ z«Æ­»WãÎWù"ýbÛφAËë+:ÑItR+mTìš5*òÛ>ˆ%<pÉv›Ÿ¢Û‘õAlú¥Ô7±×î_‚ÌÏÏÏÏÏ›ûüÑÜÏ?’ÍÄó¿ýïÄsºõFnEDn-^ØtBzvñÓ¡güãtàÇ«ý±7V«}ðB²D³DæÈ¨-üA¨Îhú%{jú¥F¶åœF–~÷Á¿¤ßÏ}¨öG}¨}èD }hJÕ7Käèç–=|P Z'¤>Cq®/±ñÿzs.ü¿þËóÕyÕÈŒk«eFj·W6?yÒiTÿ9ý%„>VŽÕòëÿ]Íû7îb™ñ"¼”ú $¼óÍW ”^ŸÓ_Ë K³ÖXxøbæOq®‚•Í)ù)¼þˆ=_)Ìý‡™û»¦¿ˆuM ¯óKŸK:—Ê 3ôlä‹¡g©ï_„Rßâ|—N!Ú~û¶0üûÂðùj¤´?ÂË÷éù™ßö¶õAxü¯/Ü¿àí0ºm쯣Ûè›u¨íѾP[äÖ£}‘[é×è‘7¯Oì‘[tßO¿²§¾RÿÅÉÿ+¿ˆ‘4‚Œ~óô]¿ùŸ¾ëÚúm—ÒS¶ óÏC¿.6FŽ~Þá¿«p)v+\üh%M¤©ÖË¥gÉøk«Nú¿Ò©Ø­tN§žŸ~5ð>áx1™pÈŒ² ™Qzg.M5 ÖÜ߬¡i¡èà.MTßFµßžÕÒ žt‘(ÊÝJgÃà¡ò÷ üÛ­Ð×—Øø‹y½¿›Wɼw«Éìn>£u7¯pÝs)v+^­J,3–+Þ”é›Ñµ1Cü›˜þ¯‘o:±pÉló ŒjÈŒ¿Ðá AÈù¿¤èmëŸÂé©pïéäuÆu{·×1Ì\r©Z·å\ö§ ±á‹™?™›éå7|)äOñë›ØóŽžß|ÞÛO|ÞŽ¡“ÑŽ¡|Ŭ ªšTAíêUm¬êÒ™±*eºIÙC[Òµôó-DúŶŸ à ]âFJûP¸òÅýEz~æÖ>º>än××꽓 ŽHZ½¢qêãkœò?¿ýßþç´¦ÞÒŸêm>oêm¶ªŽž´ªdu2´ÕjÄÆOCÔõ9%“ŽhMÛojMùJÎýþ#[úºIo\Ʀžž]¸öËýx–åhDIæg ^¼å—Þr¾ùËÝ7éá&æ’‹-¢Bk7×4XVÔ¢©Ž4ypüúwƯ§Ã.µŠY1ëC¾þb ½kņ/…ü)n}*³K7Ûë‚–­²[•£ùPB®Aú‰kéT™ì1L$üs‰ÔDŸšhŒXŽ5FhKCég-,ýâ®_±íçÂð3§—[kOZû°|ú¥åO~®—·éþ"6?Ŷùª…¨o…¨?…nŸV‹e:"F/µn´]±n Tßý%P­ë}ÿñbë<òÑ¢¿þäŸýÉlÔвÖüG:âªü‹ÚUi2ïÝb2K‰ŸnN4R’¦u'iÕžÞæ>}os«¥e0+éЈ¡Pûƒí¡vT©ÒDu†–§‡’t­KÞMvõ]´õQW2òJ˜Ü¯/Zm‡–ÙÎ_üÅ»ÞßM´e™Q±»Ü¨;¿·´·ý¡±HtE;fNsŽZÚŸ®w×Ù9thá8z’-¼UuôóÅî5bË¥¬?þÔ=ÜÔe;_ZbÂUÙ-sUÒ*º«:+{Ôù[ßSkÚrNk¢‰lÙWûâfR~cB+óÒJm¯«òK™«¨ë3V#±ùSšù™Ù¥›í•ÂÓS×~ó×N?F ©óükpé¹;TÛiäczkê4)W0ŒÌ(ÓH¡/<ýb¯_±í'…7*ö¬7*:F:ÿ§c$½Îû\"=›*_íƒôKÉÜ_¤ç§ØöAJ}’þÜâ/\ýÁý €,Ói?bûûšþ\Ó·óqMŸiD´;-ݤ³mP“pÌN&uëöl¨[GÃãÕ÷5_ªï+œëÍ çð³‘ÎágÙR%$~Ò¹OßYX@ I1Ú}º¿k÷Y"‡[,«úØ U-=Ãí“»ÂíÂ'UAñÉkur#-5­Ý·ã–v•—f¦[³†¶Oñ]¿ñ7ßuä•p¹]_œŸc9?ËÍü{öÍjr‹¿8×û»ŒÆEº›ûôîfá[Š­íÚU-nˆ7({6˜•=t½kd[Ïidî¦3ÛÛR¬Æ½ãf[³Fó¥fúþæ6õý*“öÛ*-r/%|n»”Ò¢%]Ó§R]Ó¦ƒûÿ`:H;¨Ò+?¤×vå¢×ÆrOϲÅLõߨØýÛÅ6‹È úÝ6òÅè6ëÆ– Ö¯Î+¼kÖðjžPv7õÕº›h.…1®Û³Á¸ÎdÞ¿3û…SœüY½ÄæØðÒwéÍ/úÉŠ6$Q¸Ö›³u¢:O›Ò5ȯíÙÍ%Ó#ª¨ý¡sôد^óØiûšâ¤_ìõ›[ûé±ýÕc£{:Ýi×izî⇔Ò>OnùƒûK¶û‹ØüÞ>H©BÒŸ[ü…®?¸”Ñ‚‘´Ã¬×~ã{¯Ž k¤ ·?Ün¯éÛù_5}´”¸ØÉP¥¦¾Á´µ¾ÁÚõÂêb¿ˆw±(eX-h.NÕ¾7«öÑNÇ4æéGùòõÞecÚ+Ç´Z“öRzþÌHÿH¹âMØEÞýÕ7\¹±\!7ú“÷Öú“–èáK”ŽÓ0¾rd77îñ=÷ `5¢R©‰Ý©’Óý¶¦ùƒüÄù:"@!Ó*Wj#@y@é@G$@Ñ_ó½óÌ|ïÛzŽè´Byñd:" àÐ ‡ŽH€·\¸ýáöp{YYYYYÃÌ%V:~)é ·Oî · Ùneµä^)üÅ•6—Ho¡C¯o÷¹£|q5¡¼åUœ+ôí~>y×®ßR«-hÐ>”rûPúõy™ŽÈfuSO³ºR®é®”SÆ)]ÌJOv%ï&»øáù}a¥ÿ²¬L^÷ž.õü¬É ß1|2Ú1œ™áñó5 ˜÷4 (]ÊÝJW~ ÃÁžæ,?ªêµ—ªêý‰»s~<°•`s6¹+ÜnE›€>?àIDATïš5„ÓõY¹[é¢#lê‡ãl ¹$71æ&£––Æ(]}Ô>8ØÎ¸ƒ-~ü…Npljæ4›¢4Äõñ‘¸µ%_t½Õ÷t½Â·[‰ŽOŽ×ôî|\óÖn´ú•+Ó[èªïý>PAù–¦w£=y›¯ÇúÓÖú—æ/*—æmIÿj*¯ÕžÿK+þóÉj¯o·Ò¸_ >¼»íCé[¦#Rá\@á¿~óÁøuʸX-{*V›òs3)àyOà ?<…É|5÷Øcî·ªŽž´ª2ÿJjâEhax·õŒÖm],d.ñ»ËŠËƒ‡.ç7ûäÆß)äÆ@õ½µj~J§,-S¸äJ7Á±Ü„qÝž Æu ýÚÙÐOµ.Ñ•¸›èêmúj[o5Ö œýH[Ð~$nˆÄ ‰ÎØH¢3z+üAôÖXÕ•‹cUñ¯mñbÆ_èô§‘WtkäÔ¸›ÏhÝͨ-+víûgÜ?ÜñpG¸#z@ ´'« €Ô7jÚ‡ŽßnBú‘þ•%¥=A~¾Ýå ð.ÔŸe:"©CP[¿ý¦¶žŽÈêÖêduv‹mÌnñ'ï½çO.òÚoÜñÚ­ª–ÁÅ: ¥kãñÛ­ZÓÖsZS~ÿz{ŠëbUÁMmª 1„v½0„’ŽÙpÒK¨t°ÜŸ±\Òñó¤£ÕòéX«…ßí¨×>Õ‡©óy%Ì\‚aF«.}5Zå¬è–9+¨e k¡ÕòÙíVËÀØEÛÀXæ'éžJùÖó•òüÅŸ{z ÇYq:å¬ûÚ60–ìúÙ»püøJ½`¥±¢ôêm½qÇÛš2®Ú×Óïíé¦ÊÝéñÔ¹Ÿù)—æ+­K£ª›ÔAúTcôã“Qéáé]áSK(¤ar×? “¯c¨Y8š>ó|ë”n¨SÒ»4ÚÝcÿî¡Ç.=ç©4 |ôQÃ??³ÍÈ­¼ê”Æò:%ÅLgAgÄñÍŸ‘ÐkýJÛk]:~±á P¦Ú’NÏòõaõBù®lùн~…ç§´öDhü«Øû=½óËKÜܦÒõRˆ©dŽ™n¹c¦c¨-Ø1DOéúOÓåÞÓÉë2ÓIõŸê’”òå_eÞÖk×ÒqÒ§¨ÝÈ-ý«¥¼„¤Ï'ÙÚ“âÔ‡ÂÕg±á ý<†ûÅjlÏÑ>¬Ô÷—šŸŸŸŸŸ7÷ø£¹ŸdiΊîrVèCµ?êCBBêÜï?Ò¹ùÇCmþ%ÔFQP}¢ (œŠU8-‘£Ÿ["©ï_„Rß OIfü™øq~þ—çóy–èLøZÓöï´¦þËçþ¯þËóP2¨FQ3™÷¿o2_÷ý÷øu*5äXÓ/ŸØ§_ÒÕDÿ§6„Þxîÿeâ¹Ì(«s»ÅÆ/%=…f‰>f‰´}iZ©òâç9µ™t¼kú‹X×´F¶åœF–ù)jWÓmrj:õ}¢ó'O¢“Z~êÐÏŒaø„ÿMøã¾\Ë­?¹…ׇ>x¡YUŸ¸¬* IçKù ýÞaTìYoT˜û2÷§ïq¿<ŸŸ¿þÝŽ_—^^Ó/ÙSÓ/ÕÁT§Û½Ôtê{Êaþ]Rlü¹¥‡®A£b÷o *YJµÀüú#¥|KÊ7¿å+3®­–…¼ævý ÏÏÜÒŸ[ü¥Føù ¿_¤¯—Ý¿5*èþ˜ÙþgþE±õ/rëѾÈ-z7ÛSÕsÍû7ma=?tÈÜOׂ”òåç$ÅIùÃ7[Þ I©•—ðôãùDìý®õ¡ÐõYløB?½›÷‹Òl„§íC¾êóÒF·ýut[¨-üA¨-Ôöh_¨ÚœôkôÈ›×'öÈ-úÞ~eO-|ÕþØ«¥8ž]øƒP›èŽÈ‰çû߉ç4e›±txU`Ó U`èÙÅO‡žñSñc „RVRU’YÙâÏWs/¦Q«ýQj:X¹îXÕ7j8¨û›êÕ:!õ4¯:þØSÓ/ù7ƒ…×Z1â/tz¤×:!Œ…,¯79Àø£‡žÌœ‰ÕƆcµüüä¿K_Õè.!Âg;—|ÝÈ…œ¯”{ÇÂøŸØÆ/½¼––^¨\ñæz¿Øð†ŽÓµÉ—ÿ!½|KÊweË7¿×of~æ7ýKÇ_jòÕ~òëC¡ÛÛLÙ:ùè+.…¤#ôõ’~Âþ|˜­|ù9)öiSHúK¹¼–N?žOÄÖöüÖ‡âÔgáá‹û<önÝ/Vc{Žö¡øß_ŠÙ)b×lŸçöŸ§aÐòç†Aßõ›ÿé»®­ßv)=e{±ð7ø6ÓÓE¢t*w+ ƒ‡>Z¸æ)d£p®­V8éÿJ§b·Ò9zr|úÕÄ„ãÅdÂAïʼn¿Ðé‘^ëLæ½[MæRX/’Ú^ú¿ÌX®x“'o¦ Ä ñobú¿F¾éÄÂ% 4²Í'42Zè 3þB‡/!盿øÅ-!¤¼Ý aýSC˜?UÖ¸nïVã:†™KJ‹?·úc˜Ü5k˜LOKyO'¯«?hþ°þ ­}SüúŸ¹Ùôð(ß•-ßÜ®ßÜòS¸BÇ_¸ú\ˆüç·ç…noùèùÜç½ýÄçí:íȺŽ €ðyo>ðyiÙú&¢5mûVkÊü¾#¥|µõ[Îeÿö”[úK³¼Ä¦Ï'ůŬÏBÂK©oâï×ïÖýbµ·çhò{½”A‘´šCãÔÇÿÖ8å~û¿ýÏiM½¥?ÕÛ|ÞÔÛLÈÈêdYž·*/tübÑðWéët@1Ñ—FÇôɨc:ê{ü§¨y"<ߨk/ê{¼a¾Ñ­iûÍ\We¡Ó#ýÄÒÛ|~oos²+y·4Ö‹ÌFP}¢~5^˜M==»pm–ûñ,ËÑ/~™Ÿ-txñ–ß„JÈùæ/?gNç{­Z‡:€hŨD×OÞDWjâE851~ý»ã×Óa‹±Ü5ÿ|_mp7ñ"œšXøšmßÀ7åÅMÌ%ó½Î`æfwÒã| Q¾™_)³½Š½~¥åçòíI1Ë«õYly‰½_äÖÞ ¯üO9+»åÎJšˆÇÿ›I#ßr^#§ç¯ýæ¯}´êÊ×£UKËÂÅ,_áé/µòÊ5ýâÚŸwáù¤Ðõ¡”ï/bë›øûõ»u¿(µöa¥ê¾¿”Že:"F/µn´]±n Tßý%P­ë}ÿ±n™MÄiQUòÎÏþd¶ dhYwþ#;qUþEíª4™÷n1™¥ÄÏG‹†rþ¹dú÷yºüòµ˜:ýRj°=Ô^Ê…ý.£:Ók=«ïµR£Ÿ®uɻɮþ±‹¶þ1þJ °œr%ÃÐHdZ0›FÐr¹½Í}úÞæVKË`«%ó“ÑñÇû£ã™K¿K‹?÷ômùeTì.7*ÆÎï-î¶9b©‚ª&U®ÇÌiÎ1C­%]/4®³1rèÐbãг…·ªŽ~¾X[-6¼XêÀúé›tP÷pGP—í|i‰We·ÌUI|tWrVö¨•Òó“ÖìéüŸŽªŸôWh¶”øS~n&å§ßÌi%\º"¨­sU~)sU2E¤p­7+\¯Ö <Òv¿õ¿ó®Jús‘+Å´åœÖD‘|ÞÛ?ø¼¥ß¢| Q¾™_)³½Š½~¥ä§ö¤ÔÊK !å%ö~Á//ÇLgü×áûô‹Í^(<=õQ—"ýØ,ä|#–c‘þ±AKÿocäð±…wºâ”oné/òÊ-ýÂÛÛwçù¤Ðõ¡ÔÚ«â<½÷ aß§J±}(týÁ÷—|]/…¶LG¤ýˆí?ìGhúsMßÎÇ5}B†=Óî´T t½Õ÷ë¸L8f'Žºu{6Ô­£áÇêûš/Õ÷Îõf…søÙHçð³l©?ŸüòJù “úÿïõÞC”WÊÿH¯Ò31½ã^~&¹@!Èkur£?ywΟÔîÛqK»ÊK³FÓ­YC“È|×oüÍwy%\ÿå>}ÿeU`ýU@Ù£nRöh÷éþ®Ýg‰n±D¬êcƒVuæ§8?Çr~–›ùw–[ú÷=±ñç–žb¢q‘tcNwU”.íÚU-nˆ7({6˜•=t½hd[Ïidî¦3ÛÜM™Ÿªqï¸YãÖ¬Ñ|©Y£¾¿¹M}¿Ê¤ý¶Êä¬èQ-¶l…ðð¹í2I‹~tMŸJuM›îÿƒé ípG¯ü^Û•‹^Ë==Ër3ÕZ„;ù9öWê<ÕOÚõÚ%)1Óˆ`wS_­»‰æ.Pn×íÙ`\g2ïß™ý‡½BÖŸ±‹›Ü(«5k¶ž×¬y]‚³†É¨oêèb#ÐiVÁè¶‘/F·Y7¶\°n|õ©ð®YC¸´¯”ïJ–¯ðëWJ~ iOJ³¼r#¼¼ÄÞ/¼¶kW½¶¸áçqƒ²GiTöÔôéîÕôÕ›M[ê_ç¸ñb|ô“d«åØ`«…ºÎ…|Šºƒ5/XC+¿S‰ÿzÌ-ý¥S^¹¥_Lûón=Ÿ®>”f{Uèç±·ã~!üûÔjoÏÑ>¬ì÷—Â)£#Ì{¼öß{ít¤” °zÕ7˜¶Ö7B»^B]ìñ.yàOÜùÉŸ ‰Š49Ql 4תjߎ›UûØ—O޳/iÌÈjÉÕ•þÌòZíùúP¸öyRúÆ´W.Žiµ&í¥ôøY™‘þ‘rÅ›°‹¼û«îf¹±\!7ú“÷Öú“–èáK”ŽÓ0¾rd7@1{|OÆ=Èx7ÑÄC–›9Ír´îú¨a@Jøtz>ÜP§¤0Þcÿî¡Ç^úÅYjù#6¼¼î=˜©µbÓ/c¦[î˜éj v ÉêÖêdu™)á§YȤÈ^ëY}¯UT7©ƒ”rups›:8û¦s8–ßóÍ–~)×/ÿ¢²£«¸YÝÔÓ¬æ&8–[0æ.Ùõ³7ÙEéä‡ï>í–Þ>®|ùF/XF•® f¥‹^½­7îx[¥çqi¾Òº4éúðžN^×ýødcTzx±×…4Lîú‡aòu 5é„Lî^:?smO„Ö±é—^ß–>_Ü¿V¸#2åŸK¦üΊ•³"Ñ•¸›èJt&ü‰NU@õ‰*Ð0xøÏ ƒÙ>;ZuíÚhU¨íÁöPM3tLŸŒ8¦¥„7n1jd›Nhd©‰¡Ô…÷yoÿà󮮢-…ü>5ñ"œëÔZ!éOwÄ,ÿštüñþè¸?ywΟlµ¿Ýj‘^FÔqÐ1Òv¿cÄk»vÕk£”Go…?ˆÞªqëîÕ¸óU¾…H¿éàMÎõÎDçOÞD'ûòÉqöeÄý8â£óâ‡o´¼¾¢±‘Dg¢ë'o¢Ë¨Ø5kTä·}Kxþ$É»I¥¼Õrl°ÕÒ1rrjá™æ–?„Þe_²§Ø—±Úûbµ,÷ä3–ËöW„‡{}eNu§«˜Ž/=¹[H~ŠnDÖ±é—RßÄ^_¸À;j~~~~~ÞÜàæ~þ)Bmþ%Ô–Ží—çâcHu,W,L?æÈ­è‘È-á)Y:|¬66«¥Ó/ÙSÓ/ùïzlÞ¿ylRΨ8J'¤ä§ðú#ö|¥0÷:dîïšþ"Ö5-¼Î/}.é\*W0Ìг‘/†ž¥¾J}_ˆó]:ýbó_HùRÜbáŸØ†ÏWû ¥ý^¾‰ÎŸ<‰ÎtJ‚ÿœîä’’?üø ^Jþ"?óÛÞ¢>_øõ…û”¦ÑmcÝj j µ=Új‹Üz´/r+ý=òæõ‰=r‹¾×§_ÙS _cµ?öÆj)Nþ_¡øWxD¤ÏsóÏcëŸÂé©pïéäuÆu{·×1Ì\2ûgµõ[Îië…ÿ­¥ÃÇ ñobú¿F¾é„FÎW#Û|B#Ë×Yó' ™Þ(6|)äO1ó3·óŽ6»ðyo?ñy;†NF;ò¶î›*¨jR=¶«W=¶±ªKgƪ”=ê&eOU½öRU½Ïsû‰Ï#ý| ‘~!å›tü|#éX,|E÷Âð…h W¾ —b·ÂEÿ—Ë2cú7ÓœÅæÏ‚w ¾Ð„ägníC¡ëCnñçv}­Þû€êˆ,W¦ÿÇMÌ%[×,®ÄõõÍÖ¤µhª#M¿þ݃ñëé°…Ý^€¨ªOÔú?›zzváZ`,÷ãY–Ë×ßâO ²w­Øð¥?ÅÌOá2»t³½ò?å¬ì–;+[-ŸŽµZøPÙê<_Âñb2±LgyàÀóÀDÂ?7‘HM$ü©‰ÆˆåXc¤qÊÒÒ8%ý¬…¥_Üõ+¤|iDÞbágN/·Öž´öaùôKËŸü\/üüYðnÃKiÏóUßĶùª…¨o…¨?…nŸVJA:"µ¦-ç´&šÈ–}µ/n&å§1& §â_NúºH_]•_Ê\•ÅÌ›¦}ðBrUvË\•ô…“¶×pVö¨EMO©›?¥™Ÿ™]ºÙ^)ÝßµûŒŠÝ¿]l3wØü^ú.½ùE{àÒ†$ ×zsö±NTçÝM=*w“éàþ?˜òk{vsÉôˆ*eϳ²‡ÎÑc¿zÍc§íkŠ“~±×/ñØ®]õØâ†ø7q¥_³FÓ­Y£‘m=§‘¹›Îls7- ?öWºHh:í:M[|ðCJi„§?·üNlþ÷Ž›5nÍÍ—š5êû›ÛÔ÷«LÚo«L´‰Š”ð¹]_ªà¦6U°kúTªkšê6íÐM¯RòSxû ¥>InñºþàþoŸ2Z0²aÀ¼§aÀk¿ñ½×NG5ð.£éÃUûvܬÚG;Ó˜#¤å ÈOÔx›Œi¯\ÓjMÚKéù…2#ý#åŠ7ay÷WËaÉå ¹ÑŸ¼·ÖŸ´D·X¢t<Ü>¹+Ü^ŽìÈD#¤R/ºWbEN¤ùƒüÄù¼}²vD ™»R§Àê’µ#Œ/¿A@¡¡# ‘Pp舀’n¸=Ü^VVVVVÆ0s‰•Ž_JzÂí“»ÂíB¶ƒ+¥Ü›K¤·°£×•ÅÛW»ÞµüY:|ñë?¬þë·°éÇý¥”Û@~ÀÛj™ŽÈfuSO³ºR®é®”ÓMéÚ`Vºèx²+y7ÙÅÏPXøÐð;eY™¼î=]úÖÈo:3Ãw ŸŒv g¦Gxü¹¥_,{šs°üø«êµ—ªêý‰»s~ÜJ=¢»f át}PîVºè›úá8›B. ÇM̆¹‰Æ¨¥¥1JW]_¶3î`‹¡Óóî`S3§Ùåa\‰ë‘'ù¢ë­¾§ë¾\t|êht¼¦wçãšÞ•Ku¹2½…] úÞïÕ(G(Ný/¾úÓÖú—æ/*—f5æðbé_í×o>Ó¿ÚË7¿×—ôûËÊægñïowý(¦e:"ÎõÎñë7Œ_§[¬–=«Mù¹™”¿aм§ažÂd¾šûì1÷[UGOZU™%5ñ"´0¼ÛzFë¶.R\übÓ/–Üø;…ܨ¾·6PÍOI㔥¥q Õ«tpËM×íÙ`\×Ðÿ§ ýTë]‰»‰®Þ¦¯¶õ6ÑÃ.g?Ò´‰â#qC¢36’èŒÞ ½5VuåâXÕpìkÛp¬˜ñ:=ï¼¢[#§ÖÌÝ|FënFž¬Î?æüᎇ;ÂïP8ôy &¸)PÓ>tüvûÒò}»I¹¿”B~óþˆú_ËtDR‡ ¶~ûMm=‘Õ­ÕÉêìÛ˜ÝâOÞ{ÏŸ\:Mãµß¸ãµ[U-ƒ‹uDJ±tüÒÓ¿´.ö×Ū‚›ÚTA:bíza%³á¤Õ«t°ÜŸ±\Òñó¤£ÕòéX«…ßí¨×>Õ‡©óy%Ì\‚aF«.}5Zå¬è–9+èÊ¢k¡ÕòÙíVËÀØEÛÀXæ'éìJùÖó•òüÅŸ{z gÅ锳b`ìkÛÀX²ëg¯´ñãù20zÁ20Jc]éÕÛz㎷53d\ÿ´/®§ñ é²ÊÝéñôãDæ§\š¯´.:¨nRéSÑO6F¥‡§w…O-¤†É]ÿ0L¾Ž¡fál€Ìó­S~¸¡NIïÒh}ý»‡{ñK*cy’ržRE)ÌΟ'ám½vÍÛÊŸmÐ0ðÑG R—ZþˆUjù#6¼Øú/6ýÒ9fºåޙޡ¶`ÇÝA2SÂO³I‘½Ö³ú^kº}käuêàæ6up8öMçÂƤŸo¶ôK¹~…·Ÿt tòÃg›á$¶}(\ùâþ"äþ"6?smO„Ö‡\ï¹×·¥Ï÷/±r\#ÒŸ¼;çOêCï?Ò‡–9ÿÚ6×¹«ïéÜ4e 3Œ:¸¹]¤Cú;æM+¿”ô G½;FNNuŒ¸›zTî&T¯Ò¡‘Utkd §â_ΆAKKàÏsû‰Ï#}zþ»‰¦îr~n†ó«ªOT†óžôc]QßãýQ_ægélêÎö ,6~)é¬W|ËyÜÜ¿§¹ßYyFë¬,…T%É»IG¢ë'o¢«Õrl°ÕB­nfHÓÁšÒ¸øDçOÞD'ûòÉqöeÄý8âëi»¿Ø§è]ö%{Š}«ý±/VËrO>c¹lExøÔÄ‹°˜©…™S3gðÛ·˜5²M'42 j{°=ÔæóÞþÁç-~I¥üsÉ”ßYÑ£rVÐØóDgŸè|u…þsö £U×®VQúéLÓ'#Ži)áK-¤(…ü^lý›þtGÌò¯™ñGÇïŽÓ“a«åøíV‹ô2¢Žjg¼¶kW½6J9Ó¯qëîÕ¸óU¾…H¿Øö³aÐòúЦ ÔJ»fŠü¶b ÏÜ_²Ý_Äæ§èöAd}›~)õMìõ…û€ óóóóóóæþ4÷ód3ñüoÿ;ñœn½‘[Ñ#‘[K‡W6P†ž]ütèÿ8Ýø1ÄjìÕêC¼Ð‡,‘ÃÇ,‘y²ÅŸ¯ô §Õþ¨µ´ÍCI¢·DŽ~n‰ÐÃÕyªuù­o·P[øƒPåÞôKöÔôKlË9,ýîƒI¿[œø \52ãÚj™‘Ú함ooJ0Ñù“'†@uðŸÓ_Bøácµ±áX-¿>ðßõؼóØè.!Âg;—ùù_ž‹9÷lá…œ¯ð¿(==KKu,W,,5~ÌBZcáá‹™?Ź V6¤ä§ðú#ö|¥0÷:dîïšþ"Ö5-¼Î/}.é\*W0Ìг‘/†ž¥¾J}_ˆó]:ý…hOøíÛÂðOì Ãç«}Òþ/_Ü_¤çg~ÛÛBÔáñ ¿¾pÿ€·Ãè¶±¿Žn£oÖ¡¶GûBm‘[öEn¥_£GÞ¼>±GnÑ}?ýÊžZøJý{'ÿ¯Pü"FDÒ2úÍÓwýæú®kë·]JOy^,üÍ>ýºØ9úyc„ÿ®Â¥Ø­pñc I”4¦Z/—ž¥â—ž~áhªi°æþæ` M Ewi¢Õ~{fTÓÇFbzºH”Nån¥³aðÐGùûþí¦p®­V8éÿJ§b·Ò9zr|úÕÄ–„ãÅdÂ!3Ê*dÆâÄ_èôàª1™÷n5™Ka½HºwÐÿeÆrÅ›2}3º6fˆ3Ðÿ5òM'.¹ ‘m>¡‘ÑB ™ñ:|!9ßâ—Ý£ aýSC8=î=¼Î¸nïVã:†™K.Uë¶œsw^:|1ó's3½ü†/…ü)~}{¾ÂÑó›Ï{û‰ÏÛ1t2Ú‘·ußTAU“*è±]½ê±U]:3V¥ìQ7){hKCz"•~¾…H¿Øösax¡KÜHi W¾¸¿HÏÏÜÚ‡BׇÜâÏíúZ½÷/€bÔI«W4N}üoSþç·ÿÛÿœÖÔ[úS½ÍçM½Í´Œ¬N¦‘¶Z”øsK¿X:÷ûtnéëò@1ÑC³cúdÔ1õ=þ¦îŠÉ7êÚËœòLG´¦í7µ¦âÄ_èôýDÔÛ|~oosé/h ¨>Q¿ï̦žž]¸öËýx–åhDIæg ^¼å7Ñr¾ùËÝ7éá&æ’‹-¢Bk7×4XVÔ¢©Ž4ypüúwƯ§ÃcûbæOæfzù _ ùSÜú&Tf—n¶×-[e·ÜYI+Gó;¡„\ƒô×Ò©2Øc˜Høç&©‰„?5ѱkŒäkKCaéwýŠm?†Ÿ9½ÜZ{ÒÚ‡åÓ/-òs½¼M÷±ù)¶}ÈW}(D}+Dý)tû °Z,Ó90záðÀ¨u£íŠuc úî/j]ïû—[‡‘ýõ'ïüìOfÛ †–µæ?²ÐWå_Ô®J“yï“YJüRÒ/ µ?ØjG•*MTghÙxz(I׺äÝdWÿØE[ÿu%#¯„)W2 D¦¼i]WZ«·¹OßÛÜji\l%Zm‡–ÙÎ_ü¹§„ -¿ŒŠÝåFÅÀØù½¥½íE¢+Ú1sšsÌÐÒþt½Ó¸ÎÆÈ¡C‹£ÏÞª:úùb÷±áÅRÖH êîê²/-1áªì–¹*é ÝU•=êü­ï©5m9§5ÑD¶ì«}q3)?1¡•yé ¥¶×Uù¥ÌUÔõF‹™?«‘Øü)ÍüÌìÒÍöJáé©Àk¿ùÀk§#…Ôyþ5¸ôܪí4ò1½µuš”+Ff”i¤Ðž~±×¯Øö“Â{Ö#ÿÓ1’^ç}.‘ž”¯öAHú¥äî/ÒóSlû ¥>Inñ®þàþ@–鈴±ý‡ýM®éÛù¸¦OÈ4"Ú–nÒÙ6I8f'Žºu{6Ô­£áñêûš/Õ÷Îõf…søÙHçð³l©¿”ô‹nŸÜnÏWlPrãZÜHKMk÷í¸¥ÝGå¥Y£éÖ¬¡íS|×oüÍwy%\ÿå>}ÿeU`ýU€&i÷éþ®Ýg‰n±D¬êcƒVuæ§8?Çr~–›ù÷ì›Õänéáh\¤»¹Oïn¾¥ØJñØ®]õØâ†ø7qƒ²gƒYÙC×»F¶õœFæn:³m±-ÅjÜ;nÖ¸5k4_jÖ¨ïonS߯2i¿­2Ñ"÷RÂç¶K)-ZÒ5}*Õ5m:¸ÿ¦ƒ´ƒ*½òCzmW.zm,÷ô,ËQÌTÿŠÝ¿]l³ˆÜШÿÑm#_Œn³nl¹`Ýøê¼Â»f ¯æÐewS_­»‰æ"Pãº=ŒëLæý;³ÿÐX8ÅÉŸÕKlþˆ /}—Þü¢Ÿ¬hC…k½9ûX'ªó´ !]ƒüÚžÝ\2=¢ŠÚ:Gýê5¶¯)NúÅ^¿¹µŸÛØ_=6º§Óý—v¦ç.~H)íƒðôç–?¸¿d»¿ˆÍOá탔ú $ý¹Å_èúƒû@-I;Ìzí7¾÷Úé²2Õ7˜¶Ö7B»^B]ìñ.y«ÍũڷãfÕ>Úé˜Æ!ý(_@~¢þÀ»lL{åâ˜VkÒ^JÏ?é)W¼ »È»¿Z.Cn,WÈþä½µþ¤%z¸Å¥ã4Œ¯Ù Â{|OÆ=ÈXh„TjâEwª¤Çt¿­éGþ ?q¾€ŽHDȴʕڈP^P:Ð ’ Ó å :"V@YYYYY™ððX¹V»ß  ÐÐ W‘´·åóK3þÒÈÇÛÃíé ¿s‰•Ž_JzJ­¼ ·ï‚’èˆÔõVßÓõnùüBÇ_|õ ¦­õ .Í_T.ÍÛW)Å–Wt|êht¼¦wçãšÞü¦ÄÛzíš·ÕtpÿLéˆÒµÁ¬t»f atJ‡©Ù« Î Ô7jÚ‡ŽßnBžpþÙ0çw<ÜîÈWç`²+y7ÙÕ8õñÉÆ)Çôé”cšŽÇjc#±ZgÅ锳9 Ü2‘qýÓ¾¸žÆßÉëÞÓÉë”.ån¥«YÝÔÓ¬æ&8–[dÌZ¯õ¬¾×ªª›ÔAš`«nnS‡cßtÇø!)N #dê+’,V«”kº+åCÃÀG5 H‰_lú È«”o=_)/t9fºåޙޡ¶`Ǭn­N¶ÈäåÑ –Q»G¯ÞÖw¼­ù*_—æ+­K“Ο÷tòºÆèÇ'£ÒË-/ i˜ÜõÃäëjÒ1H™Ü3<í‹8?7ÃùkÜ;nָ鸬®\!«3*÷l0*¦\‰&@˜e:"M|h:¨p®? p&:ò&:Ù—O޳/#¾èÇ_ÇHÛýŽ~xêØ¢ã^Ûµ«^M°Þ ½UãÖÝKwèÔÄ‹pj"P}ï÷j±I­ºvm´*Ôö`{¨þŠcúd$=r-·øÅ¦ŸÐˆ<–ûá3–+ÜtÝèøãýÑqòîœ?Ùj9~»Õ’-dÒ‘¼›t$º~ò&ºZ-Ç[-#'§–TnåKè]ö%{Š}«ý±/VËrO>c¹lExx±åE¥ÃŸšxJMÐq)“ñ5²-ç42Ê™áøHçpüUYOÌ%¹·d‚?@1e툌ëã#q=MwuVtËœ²:™FV§p­7+\C'£CÔ¸ðsåŠôkÄ÷䳈›˜ sô)Zû/_IwVtÿ“³‚b¦#ºÞ÷K?—ôÓߟŸŸŸŸ_z”\z¬åæ6uFv ·;†©”þVÇðÉhÇpægi,$MÇV¸»Óg©ÕòéXº›²Þü§÷ëÍéNRéåû*çyá»ß„¿òu>—Jm úî/êPGxW¨ƒŽ+{”FeOÀyOÕ!ʳ½3Ä¿‰˜û ÃÜ×È7Ð,˜t¬‘m>¡‘%?ÿWÒÁt1 ÓEÇUAU“*èi½ºÙÓ:Pu~ï@•½æ³ÛöMߦ6MŸ»©¯ÖÝdjØ»ÕÔ =éÚú-ç´õùÍŽB§?fˆÄ ìË(ǾäüsIÎ?ÿºi8n˜Üm3L¦ÖÌžO­qÈ:cÃ0·ÓŸ¢©ß>ïí'>ïð³£ÃÏ£b²vDò»)eÆr…ÌÈL2ÿ3™­Y®Ìµ|_½[àð¥C[¿ý¦¶~Øÿõöa ³“©ahôe‡ãä݇Ùè³?À™ZXÅò6|0È0LÑ2mæ›Y;"ÕÕ'êÃ0g6õô,›ÒÈ+ºÓÝI,÷ãY–S8×_P83?k8°Ç<`80g Î/—æ/j—¦qÊ¢oœJ0‰»¥½ÙpáÒﶞѺ­ôYÃÈêڙϣíLûðçL{z¤þտל•Ýrg%sTXZ…Uú9J)ßB‡¯xk5ÒeÙå8õ^—£nñwuë˜yfž™Gƒ«]²ëgo²‹ó3 çg˜¹ä›wæ’ “òÏ%Sþ×G^wÑ`;úÌû&fÈÖ©Ù46Pç~ÿ‘Îí˜9Í9fhkÚMØÝ|FënnŒ:ÔáŠ&üú<·Ÿø<é­H¨“¨\Á02£L#3–rvç–~Z½‘¶ÍÉozØÔÇÙ”×~ó×î˜>]¸¦¹•/ÉÞª:ú¹U%=¼XêÀúêWƒƒº‡;‚º|åüpìkÛpŒ9qÜ 71VuéÌXå)!–Ù¬Æc»vÕc‹âßÄ Êž fef¦[³F#ÛzN#s7ÙænZø‰¹dz…§‹=ö«×²Iü_YÐ9?????¬xX¢‡[,Ñâü­2t>@á„Û'w…ÛËãúøH\¿O@T5©‚(Èâ[½uJGÌÿ&f@>¼;Êbµ±áXíêJ4uA¢;l¥ø“wçüI£bw¹QÜ!²nV¨ nÔ?A†þGC(Û»è‚,Ô™ÙIG?°tÍA>¼›鈤.HóÀ=æâ'hL{å☫ ÆHê ,mAG$¿ 2Ù•¼›ì*~‚ø£í´&í%­IP}¢ ¨J¿k «þÁÒ´Œ–Ñ2~ßÝ£~º#Þ5åùNáºrQÙÃ02 Ã$»ìItJ‰-áHÜM8Ô&Õ·j“”xBñoN¥smµ¬.åçf¸ †™KÊê8?ÇÒÿ†ó§XÎÏ0sI™‘ós3ô†I88þq–w|&åO:b#I‡cúd]¥Ù-Ñ9—Xîà ׵kÊú²ëС7ÝŽsÉt ×ïß„9ðGi]“¹¡.H}xËy†‰ŽO•ÕÅ ³ád—ÒY®¦\Á02£¢If¤ð27g†‘e…‹a˜rn‚1—ïT¸¦\ÁM¨ª&•ÜéüRÆ: 3ÈQ™²ÉqDdº òÓ+ÃÜßÄr × %Q†a42…ëk›²†av>b†©¾§s+\_Û”ÅïŽL‚dY] &¼+Ü^ãÔÜeͽ÷ücœ6ÌùSö_¦^vL:fÃILùg'S~ÎϱÜTÒ1;™<¨ ¬?  3cM£"Òêx°#ÔÑ1ÒïIÁäXÎoî?tÈÜß1Ô좚5š/5kØ—ì)ö¥ôsÏol…3p¬F¦t®? påw¼jÜÀžN:Z--ƒ¸ÐVZÖŽHÎOÿ×:«U/Vßg˜OŸZU SËhM Ã0ºméÏd/3 ÃjæÂá±*úTúÝbšKÊêèrc¹RfT+*º•N«±‚±˜¯mŒÜø;…ܘòsá”_fd™‘r@n,WÈœƒa8‡ÌX®HwxÉZ†ÑrÃBS`?òÙmû‘þ˃‡û/׸u÷jÜL5³‰©fûØÉö32æ#{7« uAd¼jàKëdú™IGæß u<ÚêèmîQ÷6sþ¹$ç§1¼FÅÞ­FE«¥e°ÕB! “ú§†É@upS Zúù ‰­¦oçãš>£b× £ÂÝÔ§w7-Œa׬a2P}om>ÒÓ1Òì‰øž|ñÉ2ܨp®­V8ÓqÇ´F¶õœæ­™_KMÍN.÷á¸þÀž7Ý‘;1# óþã‚aFfd˜û›ê2Ì£?½™¸MÝ=Åöjl]ÃÈêR~ŽM:ó\¹RÆr?ß`9ê^L8R3 Ã0ìÂNØ”.™ò3~†aü¯»«’ Ãm›K0­ÂÓp$ï&ê€úŽ:À0Ì'éãÙ–%:zRþÙpÊß0xøÏ ƒ­ÛX«¥Þ¼wK½¹qÊÒÒ8År?žM§_f\«“ÝMg¶¹›ªLÚo«LÌ*±RãU3qÇLïôEï´Ö¦½ªµÑq–cõ,·²yBeqFDœÑ¦GÛ¢MZÓŽ›Ú‚”©É|`Éì¾¾ëû:cc0¶€êA4 êptj;Û5ÆcCC ÒýFʇUÁwÔ÷æÓ+Vüÿ˜Æm% Ã0,Ç0µOû/3̱AK„¿šäJàwªÎ%ÆŸ¼ó³?9Z5Ò9ZEÝ‹r#ÃÈ鮯_*}<Å2 Ãp3 Ã0åJ†a˜_’ÂR`U´ªŒëv—×Y7¶\°n­ºòõhU¶_긤.ÈŽ¡Ï|CÔIïÒ(¹@õ½ßªýÏïþâN]#'§:FV[%̯¨èV¬ªÃǬªôñß)äF±HãU_‡WÈ_ŽäW­£R[ê¯R'u\òkdšîì]Ãô)ëÆOz¬iÇp:ÞzäÓ+­Gìil<ôQà …a¹'ŸåÚ­i·ØÆìwsŸÞݼtHeén>£u77Nniœ¢¥„ü£b×ìÂÝ«kܺÿSãŽâ#Øò'ÇŽÈ7]´Fäpœa¾¶QXãÃ0Œ³’a.¶a˜‡ÛǪæÓ+:·*xó¡ú~ñO2½Â ýŸcc–{ÚÇrJç†J'Où96=æîÕ(äµ_»æµ;fºå‹u6oüä/Íi‚¼!´kÖâ¿7Ä¿‰¬]°n¤q‘´1Ëýð™´‰ÞíCŸùÚ‡z›ûô½ËŒ‹4™÷¬7™¥ü-Ÿ÷öŸ—^Û‡NÛ‡ÐD@¾ˆÙ>Òoi99Õ>Ò¬n¶ª£÷Þ³Dèx:ԛξÆhp³%BahU>úìÂð…Åùg'yX‰tÇbÌû&f Ç„cv2áH¯Bøf\çŸK¼^òվ̧¸.¿@ͽ÷Žh‹ú¢G}JçzszT&_oÓ™m½M ÇÏ7šrË—R«¨?Q¿šV<¿tf8¾°«nuXÙñªêÀæ6u ¡ÿ£C ýÃϾùbøÂ5ŸÎ½ã;;PܼØÈDªÏÔM™y寛ô¡NO…s½YáLÙü5ê"ÏìdŽ:ûÇ-ýcý—/~ÚYéTî^¬fä&ëf5üI¯„ºGµcGµÜÇrÌå¹$sY¦-WÈ´ÞÖ›½­öI&â¬èYï¬pŒœœj_&|ûÈÉ;í#Ί•³‚þ Õ¿B‘“ŽøHÒADÔ¥µ°Û‘aÞt;Ò¨º¹™7Ÿ§N®rÃ8ÿ¦s8Þ1yòhǤÌ(ÓÈŒÌHyœé¿ÜWÛ™q3˜E&Ò\>·wàrãTÓŸ§úCƒ?ö‡hÝ@gÅ锳Âd<ð¡É¨œRlPN+wc¬”UÊ:e•ÌK†a^®¦j¸ÜxUÎÁÝåÒÅþ¹$ãçw¿¯Ê”'e çdÎ)³1 ÃpÔÑ­Züoj‚›5†þizl#í­®\Ï©+™jæS½ þOŸæÓç ‡ 0xb Ðj±]Iï¬M¡êmª‹êm ÃÜc˜Ñª«×F«†ÉË:‹CmŽ¡Vî³Ó­ÜëZ·61S¤»ùÜ^wó𳋟?S6˜Õ4Ž_å¹}LV'Ó¤7!:÷ŽÓ:·gæ†Ü3#=|~¥x#iŽ„Ûœðrn†3¤wĦ0ü‘¿$æÕ8;ÿ\‚ñs~næW#"+¹°4 ?ùbøSÍ0L5óœù…yÎ0ÌO ø™ŸvA²/ÙSìënÄrÃŒnûöÿÝÆX˜1æU·WCÿ¡C ý Ì!¦yÏs†až;˜Îã&{l¥èõxÕ=²:þxÕ¤ãçIçàœƒßY¼ÈxUÇ\’yµ¶œy‘¿¯ºDéÐDì^îÌé^Ž:@eSå Ù”³¢;–îÏDæ­Žã·:†Ýßê†ÝVÕÇ'­*ZÔ:Öôë˜rJÑ¢œ2ŒéoÆdFY…,ëZ“ö’ÖTãÖMÕ¸_Ù¬f6-ì*ÍÔ8uôdãÔè¶KgF·e Cëc**×k•vçgÿ?»“a˜†R¾ôg„Ô¹p,äl˜›Õ•+duÜÄ\’› Î25³©MÍ4xýÜàuØ;¯9ìbÃóÇEæ7“î Ò¹«ÿÎ­í¯øeý Ãìd˜W#U è^M¤U1 £JùçzÞŒ åX†a, ÃXäFÅ Üø*¾T¡|+ÖxUÚyœa˜;¿zcÛ«¯ªƒ›Õü#—Ïï¸Lõ„ŽÐÆ2¦ëûŸ˜®3Û˜'Ì6Ч•ùlm+³tl™²…¡½Ñ…‡Òj jcž3?1Ïs•±¡@!,Ñùf•½WÓ¥c ÃĨˆ¿s1ŸÖ´õ­In,×Ê~KK£ŸÙX®`62ѹ$•)WȤ'}—+†±Ï%û«ø§çÌ4Ã0ù>ɨ=p$§“wŒÖ±ƒÕÖ3&†ÑÖ/²Î£‰)=ÚÑMÿõÎÖ×y"c1Ñ@Í7&qä罜ŸibdrrS ãU ÐˆŠ}{f(×ÏœŽëS~†I½ÚÅ8óÿJãZÒØ5ÝÍtMËŒŠF%7¦¦&•õ8ÃÌ¥ s’&óîr¹qÔwåbÔÁx¹Q»]×d9îc†±’†¹É`[œa¼*ÀÛOPGdt|êht<œ|°#œdj˜7syý¿>¤OèC…8É*“ö[†©b´{ò¾ ° ]R|¼êò`åeíˆ|5úì•7]B–èÑ“–h!’BÝr†Á|ÚwŠ!¤»—t ø¾þ,Ì0c›® “ÞM;‡ÿw0ŒÌX/Ûó1Ã0&ä1ÀÊ4"Rf,Wäcç_€L™¦›a4fÍz†af}ºÎñë_Îÿ?‡ü( :" !ý†Ð˜öÊÅ1­Q±{·Qñê 'Ã0N£bcTÄõñ‘¸¾IQ2ŠÝJÆŸ¼;çOªª&U@éTîV:†ù°š-2"Ò¨Ø]nTP‡`ñÄï‚TTŸ¨($€Õ.ëÔl­I{IkJ8wŽb&]oŸ¬‘Ô¨6©¾U{³LÄ^uTAU“*¨bTM*d,C×[Íèz ·È”¦²Xml8V‹Œ€Âù ² íÿD Q*!~IEND®B`‚xymon-4.3.28/docs/stdview-detail-acked.jpg0000664000076400007640000030022511070452713020640 0ustar rpmbuildrpmbuildÿØÿàJFIFHHÿÛC  !"$"$ÿÛCÿÀ©A"ÿÄ ÿÄ`  !"1A2Q#TW’“ÑÒ37BSVu‘•²ÓÔ$CUaq”á%&–456Rt´bs„¡¤±8v‚ÁErƒ…³ðdµÄÿÄÿÄ@!1AQ3Ra‘"Sq’¡ÑÒð2“ÁÓs±#BáCbrÂñcÿÚ ?úz|¹i!)”òRP8pMxvÙŸé .?ö„Ÿýê¿ûšä6«o⾪º{ŠÒw^Ï‹þÔžöÙ±vÀ„¯‚Og^vçr~â}_Xó$éÌêˆÏ\ض±ySÒ_nC¥§T°DwÓÃpJJIÎr1ÐâÃ¶ÌøÛÿHk‹¯QÝ[º@´zBuºÓ«û;[æ×(èe¼$Åm ωñ9=kÀj½qJê+‹Ïܶ'J̺D—pôfQ%¤‚Â#8½íÄü V6¤Ø ;m™ñ·þÓ¶ÌøÛÿHjŸOÁ¸@‚[¹Þd]¤­{Ôë­4ØF@–Òœ Hݹ]NTzbÆ„žý¶gÆßúCNÛ3ãoý!¯ŸµÅ‘ùwŽ"ݘÒÖ'Ì{›!wå:}%n@·C*q„²®X%À©ÉÈÚïWêý`­Iy«‚ãYÂã%…Û“JVÊ+¹¥Ð‚TPØl'*9HuËÍøYìón÷‹ìBƒÉ2ܵlm *R°œ“€ À׫e¾ì†˜¹©×#8}(qie)XJ€=ÓµiV’ð"¸Çn7Yú_‰ML-1,öåEDKE2ÐìD¬­jZJûêqM#b’›9ÝÔUåãQ_x¹Ú»z=·u[–¦†[*†Â­ŒÉ!;’RT§J ºº:@uÛ3ãoý!§m™ñ·þד«µDuÞ7‰7·›ÕȲµ:+1û,vž s .s7#+é¹g õQY±ïÞTk-¡û”»D©Ërä¾Ü'¥® ·½#áÉq”;¹ c¢R¢œ(¤×»lÏ¿ô†¶gÆßúCXpšqˆl°ì—e8ÛiBŸt$-Ò ÔœŸ´× ¥y^-ñ.Ö™v¹í¢Kel<ƒøÈP ÔhIcÛf|mÿ¤5åì¹m)Ø·5Hm.-¢¦ŸÜТ…§ ø¥IRHò ƒÔW-æß­0xy=õ;u—öç‚—>Å-Óÿ¿BØOÿÇV=Zð›|Õòí_…p—ÊnéznRmÂf–£Îq¦yi’9jmNøÇ¹×$äA×»lÏ¿ô†¶gÆßúCTú^swM5k¹µ+µ·./¥þW/š€ ½Ÿ‹œçYÅXÐý¶gÆßúCZιâC³úAWYÖ^’¾ÌAä°ÎÎkªÜ´å)æ#¢w(ç¢N iQ,öBΣŸu²Ù/ú–%ÖK]žòþÄDa/ÆÕlp²’ÆÇJ;ÊQ$õ$Sj³Oé·#D¸M‚é¨lE·Ê0‰VÇ~à Òœ£jûŠ%]á€;§m™ñ·þÕ}óTF²C“*éyTfãCzk€º¥/È×T ÉÎõ’x'ƒÅ¹;~•ºX½J¹ÆD_ä¾ô–Ù>ãb0mD´„$mKÎ$€#9#4_í³>6ÿÒvÙŸé xR “ß¶ÌøÛÿHiÛf|mÿ¤5óvв.Ù¢¸sxNŽÒ–D¾»@UæÛ$›‹üÎPhä7ži!.bð•¬÷±šÞ½Ñß»_¦ýÐ žê= è.C[9]«‘»vÞo7gôŒîÛ·ñqÖ¤ƒ«öÙŸé ;lÏ¿ô†¸õ×Qj,&öÞ­ÁÕìY}Ù˜(,vô0FT’ç1meÌîÀBú$tPþ_¸ëc§ßÔljõ¥GT»ifíì*:XUÕP’U„‡´$…Úä;m™ñ·þÓ¶ÌøÛÿHk—\ow6ö¥µÜu,¹¨‰Û&,× °© T©1Ê @m²J™HB”0’æU¸'®¢Æ¦âºÂá§Ú“«Ëq!¢KALØû_1D…%ÓÍ )¤€ƒµ.`ÜR €ïý¶gÆßúCX¶kð¼Yá]í×ß…:;rc»¹iÞÚÒ•aX# ƒ‚®§nŸPëè“zUª#~Õr“#¼—$>äžb9¥+Ëd2v •¤ê\'ÕWÄp½¹DˆÎií$ðì|°\ž”ÄJ‘%K#% )Ú”¶FB‰Wu w~Û3ãoý!§m™ñ·þׯ\CÒºŠâó÷-‰Ò³.‘%Ü=”Ii °ˆÎ/{Gq?©Gv+«éø7Kw;Ì‹´•¯zu¦›ÈbÚS„ ·+©ÊLqÛf|mÿ¤4í³>6ÿÒð®Qj°öþ+ê«§¸­'uì÷ø¿íIïm›lJø$öuçnw'áÞ'Õõˆ{¶ÌøÛÿHiÛf|mÿ¤5ÌÕÓÛÑ©”åՔܕ¬½œ¥°¢Ï¦y<­¸ñìÞxÝŽösÖ°âÝucvßtïjwž`j×-BÚa°1•vT$‚ Žfô¤‚t É uUø]b®L ‹ï4‰FR·-8q—TÓ‰ÁǂСŸŒŒŒõ~ì¶ŽÓ÷54ä— L%oí.¬%K)H'¼v¡JÀòI>×áåÎñq¼Ü4Àº;§c5t½=ÖÚmo܉¸Ê -—¤%-2œ´ëäðÊEÎÑÃîEEêTÆ®¥†ßKí³ðlú%÷C (m8J\e•ô ¨Ž”_í³>6ÿÒvÙŸé r¨ïÒdhûœÍ@'§Só{M¯ÒSoà wàÊRðj@e{Ô¬©cÕð¯= uÕ‚×ûÍßS½u¦Û™pØi¦Šà;%+l¡AYg*);‰=­öÙŸé ;lÏ¿ô†¸ç µ^´½]lWñîH·ÝËÂSR•nDhÄ6µ¥1ùn™ ZT€…%ÀN ‰ÛŠÚ¸:åö~‚³_ïú‚EÖ]ÚÙR¨ì´Ó%m…´“¸nÜHÈ”óÛf|mÿ¤4í³>6ÿÒð®}6F¤c‹÷¿sö«MÃu‚ÙÎí×'"lþ‘pÛ·cîÏ{9ÛŒô¡¿v[ÇiûššrK…¦·ö—V¥”¤Þ;P¥`y$Ÿk×¶ÌøÛÿHké›­ú6´”ÌÖ¢@‘qÖýš|x¯™-)±§ÐêR[hW¬ÓJÈJNAFs¬ÝµÆ±/Ø$Ùîš’L+ìœãÒÛKd¤¨9:l•¤v‚¡ð€¯jTz~e@*âûnÜ$ÑS¹g˜àiÇJr<;,äàwqâ@9]¶gÆßúC\ŽÝ>û6ç¤Z¿µ%"jרiR×É[^ˆ–°^–¦’¼­C J¶ÕãÃ=G¨¥[ôÎã«EõZš1"öfLu&2.#–¡µh ¬(¨np`'  ;m™ñ·þÓ¶ÌøÛÿHk•žý¶gÆßúCNÛ3ãoý!¯ Pý¶gÆßúCNÛ3ãoý!¯ Pý¶gÆßúCNÛ3ãoý!¯ Pý¶gÆßúCNÛ3ãoý!¯ Pý¶gÆßúCNÛ3ãoý!¯ Pý¶gÆßúCNÛ3ãoý!¯ Pý¶gÆßúCNÛ3ãoý!¯ Pý¶gÆßúCNÛ3ãoý!¯ Pý¶gÆßúCNÛ3ãoý!¯ Pý¶gÆßúCNÛ3ãoý!¯ Pý¶gÆßúCNÛ3ãoý!¯ Pý¶gÆßúCNÛ3ãoý!¯ Pý¶gÆßúCNÛ3ãoý!¯ Pý¶gÆßúCNÛ3ãoý!¯ Pý¶gÆßúCNÛ3ãoý!¯ Pý¶gÆßúCNÛ3ãoý!¯ Pý¶gÆßúCNÛ3ãoý!¯ Pý¶gÆßúCNÛ3ãoý!¯ Pý¶gÆßúCNÛ3ãoý!¯ Pý¶gÆßúCNÛ3ãoý!¯ Pý¶gÆßúCNÛ3ãoý!¯ Pý¶gÆßúCNÛ3ãoý!¯ Pý¶gÆßúCNÛ3ãoý!¯ Pý¶gÆßúCNÛ3ãoý!¯ Pý¶gÆßúCP©ò’’¥Ly)$—H~ºñ¬;Çiì 켽߿ÛçãÓõùf¤‚W©\ç°†¤Éq·s—„ãÇÇÙâ|0:×õp¼HzÃ6LKŒƒµ‡ V—T HIÿˆ5åkì^Œ®O+›ŒíÎ;ÙÝ×ã努ïúíÈäöÎï+oŽvŸõÎÚ8w£R ‰Ðÿ»¯/{îüžhÏù~'ðë™&duéˆï¡øë³²ê9Û‚ÚTžrÃŽà ëJÿÄ  ɬ(–½‘ݦ£¦à…75-0ÂD”¨¤¹ßsœÔûßp÷äóFËñ?‡O{îüžhÏù~'ðèIoékWöœ/§O×OKZ¿´á}:~º¨÷¾áïÉæŒÿ—âž÷Ü=ù<ÑŸòüOáÐ2lŒ¹:á&7îP‘=õ<ó,7kØIHHª)R°„¡¬¨íJA'`›>‡r5­»ƒ6 “Ö¶f,™LF.6;R á y:W·½÷~O4gü¿øt÷¾áïÉæŒÿ—â€›Ì z’™WˆZrâúS)v[Lº´¶ B ;H'#Àä×ñ¨ãXn–[Œ%ØrzÒãê“© <´„]l‘Ìî¶”u à ëÞû‡¿'š3þ_‰ü:{ßp÷äóFËñ?‡@Vi ™²éÙÖ‰³,Wî2 ‰";LÅQ؆҄1•¡(m •z¹$“W6øú:Ý,[{6lCt½¦Óia• ­tJŠV¤äuˆó5ãï}Ãß“Íÿ/Äþ=ï¸{òy£?åøŸÃ -ý-jþÓ…ôéúëÊmÆÜü7˜jøÄGmHKí<Ñ[DŒ¤,)9#p#§PGJ­÷¾áïÉæŒÿ—âž÷Ü=ù<ÑŸòüOáÐ-馹;roŠ7dNy´´ì”±h¸„ä¥*WdÉ'ž™5q·èk”DC¸ÂÓ“#!åÈK/´ËˆK«QZÜ €¥)JQ>$’OSQï}Ãß“Íÿ/Äþ=ï¸{òy£?åøŸÃ -›ºZBP‹Œ¡ ¥/ =ƒ­O¥­_Úp¾?]T{ßp÷äóFËñ?‡O{îüžhÏù~'ðè Nõ ¬W¹mK¼ëÉ) 6ì¸6g–ýÅPɲ7gÒD€ÝòE§PÊžÏ6äÌE<ŽöF݈JSŽ€mHèrzÖG½÷~O4gü¿øt÷¾áïÉæŒÿ—â„ìHÓ¬[‘maûSP[d0ˆÈ[a¤¶Ѐ‘Ð$˜Æ1Ò°£ÀÐñíé·1 Nµ ÞŒ˜èi”¶–^!N¶@*O‚ˆÍy? ørÃ>ï´b[m%j>çâ2«­'Óßsoä8[û.ðèIÔ=-jþÓ…ôéúëÊmÆÜü7˜jøÄGmHKí<Ñ[DŒ¤,)9#p#§PGJæžžû›!ÂßÙp¿‡OO}Í¿áoì¸_à=lü3Ò–iÈŸhÖÝ-Øü[e‘§Ÿ)0½v}éÏNò,>–Û³·lk´mÆ1Ìõ±Ž˜Íhžû›!ÂßÙp¿‡OO}Í¿áoì¸_à.¯š^ÉwÖŒßd]ôêYnCT‘5jd¥HA•¿<½èJöíÏLnÇJÚ÷éŽËÙwÙû?hí<¬·³Íæó1á¿™ßÝ㻽ãÖ¹×§¾æßÈp·ö\/áÓÓßsoä8[û.ðè‰1Z^giífÍ#µ²–$óKkç4’¢”/>²AZȠܯiª÷l¼=vÖÅ©ËN–]¾2ËŒETv -(ø©(Ƽ Òý=÷6þC…¿²ážžû›!ÂßÙp¿‡@t–%iæ$*C-m<¶ÊœBÛ - ¨¡Ž»RV¼¹Xñ5âÀÒŒ*˜VŒKÊ9IìÍÆñê' HÀÀÀÊçžžû›!ÂßÙp¿‡OO}Í¿áoì¸_à7ˆ–½‘ݦ£¦à…75-0ÂD”¨¤¹ßsœÕÇ¥­_Úp¾?]rÿO}Í¿áoì¸_ç§¾æßÈp·ö\/áÐCÒÖ¯í8_NŸ®¼˜›aaÙ±.ÚÓ’\¾¤8„—V”(XíBS“ä<®iéï¹·ò-ý— øtô÷ÜÛùþË…ü:5íazì«»ºñ÷.KR©je/!AH%}vR¤¤Ž½ A¼oÓ—²ï³ö~ÑÚyYog;›ÍæcÃ3¿»Çw{Ç­s¯O}Í¿áoì¸_ç§¾æßÈp·ö\/áÐ (RÊH²”±%RÙ†ßR”¥:ŸbÊ–²T:’¢|Íy[âèËvÑo`‰¶R¦BFR ïOÇ(%%^$3ŠÐ}=÷6þC…¿²ážžû›!ÂßÙp¿‡@oðcèèI7X,XbÜ%ÿÖ%2†ëÝsßXꮾÓ^Í/L2Ä]¶­øìM¤¶-ŽXüL!JOLwTG®uéï¹·ò-ý— øtô÷ÜÛùþË…ü:}Eż»zO±txìÖÛe/¹ŸËãÿYЦØaCf9vØÑ˜m-2ËN!m JR‘Ð æžžû›!ÂßÙp¿‡OO}Í¿áoì¸_à:‡¥­_Úp¾?]k7[dywÙ7h|DjrCm´¦â&Ú@B3µ;Ž·KV£‚µcâµ_O}Í¿áoì¸_ç§¾æßÈp·ö\/áдäHúŽßu‘¯rn,ÅÏq¹mBBÝc.2W½†ÚðiÂà²v7‚’xůA0™ÉbݦšMÃþºÃIóøLÿüsZ?§¾æßÈp·ö\/áÓÓßsoä8[û.ðè þÞÆŽ·F‹Þ͆#Ý.Æi„´„°²• ©tJŠV¤äuˆó5U ,?HYmÑa¹b7Öö!H¸´ÓL½(4ÚS¹dzíÎ 8öšÕ}=÷6þC…¿²ážžû›!ÂßÙp¿‡@uKZ¿´á}:~ºzZÕý§ éÓõ×/ô÷ÜÛùþË…ü:z{îmü‡ eÂþÔ=-jþÓ…ôéúéékWöœ/§O×\¿Óßsoä8[û.ðééï¹·ò-ý— øtPôµ«ûNÓ§ë§¥­_Úp¾?]rÿO}Í¿áoì¸_ç§¾æßÈp·ö\/áÐCÒÖ¯í8_NŸ®ž–µiÂútýuËý=÷6þC…¿²ážžû›!ÂßÙp¿‡@uKZ¿´á}:~ºzZÕý§ éÓõ×/ô÷ÜÛùþË…ü:z{îmü‡ eÂþÔ=-jþÓ…ôéúéékWöœ/§O×\¿Óßsoä8[û.ðééï¹·ò-ý— øtPôµ«ûNÓ§ë§¥­_Úp¾?]rÿO}Í¿áoì¸_ç§¾æßÈp·ö\/áÐCÒÖ¯í8_NŸ®ž–µiÂútýuËý=÷6þC…¿²ážžû›!ÂßÙp¿‡@uKZ¿´á}:~ºzZÕý§ éÓõ×/ô÷ÜÛùþË…ü:z{îmü‡ eÂþÔ=-jþÓ…ôéúéékWöœ/§O×\¿Óßsoä8[û.ðééï¹·ò-ý— øtPôµ«ûNÓ§ë§¥­_Úp¾?]rÿO}Í¿áoì¸_ç§¾æßÈp·ö\/áÐCÒÖ¯í8_NŸ®ž–µiÂútýuOkÐ<8¹ÚâÜàè- ì9m%èî›$$‡[WT­9@ÊHê#¥d{Ùè/“ý ûØ¥aékWöœ/§O×OKZ¿´á}:~º×aiΗp‹Bè—Ý·Ie„X"Û¼´;·<¼ãˆ= 8ñ ¿{îüžhÏù~'ðè KZ¿´á}:~ºzZÕý§ éÓõÕG½÷~O4gü¿øt÷¾áïÉæŒÿ—‷ôµ«ûNÓ§ë§¥­_Úp¾?]T{ßp÷äóFËñ?‡O{îüžhÏù~'ðè KZ¿´á}:~ºzZÕý§ éÓõÕG½÷~O4gü¿øt÷¾áïÉæŒÿ—‷ôµ«ûNÓ§ë§¥­_Úp¾?]T{ßp÷äóFËñ?‡Zþ©‡Á,û,j=9ÃÛS¤­‘*É ¾`o®?ýcÛ@nþ–µiÂútýtôµ«ûNÓ§ë®_éï¹·ò-ý— øtô÷ÜÛùþË…ü:¨zZÕý§ éÓõÓÒÖ¯í8_NŸ®¹§¾æßÈp·ö\/áÓÓßsoä8[û.ðè¡ékWöœ/§O×OKZ¿´á}:~ºåþžû›!ÂßÙp¿‡OO}Í¿áoì¸_à:‡¥­_Úp¾?]=-jþÓ…ôéúë—ú{îmü‡ eÂþ==÷6þC…¿²á€ê–µiÂútýtôµ«ûNÓ§ë®_éï¹·ò-ý— øtô÷ÜÛùþË…ü:¨zZÕý§ éÓõÓÒÖ¯í8_NŸ®¹§¾æßÈp·ö\/áÓÓßsoä8[û.ðè¡ékWöœ/§O×OKZ¿´á}:~ºåþžû›!ÂßÙp¿‡OO}Í¿áoì¸_à:‡¥­_Úp¾?]=-jþÓ…ôéúë—ú{îmü‡ eÂþ==÷6þC…¿²á€ê–µiÂútýu ºZ’•\`©$`‚úH#õ×0ô÷ÜÛùþË…ü:z{îmü‡ eÂþ¿-6.{ jë¶ÚÎ[¤…gÇÄùøŽ•ý\%Ù™°Íl1¹‡P—ÒJ‰Iþü“\ÿÓßsoä8[û.ðë`§8[xÒ¯_,:/C̈¦]TyLéøŠme)<¼($Ž™y0~oÒ”®…OÖKý¡'ÿz¯þæµk½Úá.çR•vvÄ’áçR“†šHõÎႯà7²_£¢S“â¸T”<\mE'p|s½Kp›§`)›“@²Ã$G}”„6òRžˆÀm}<1ƒâŸ4#¤ëÖ£NôÖœ_#ËélMl=,ÐZq|¾ù›|{ÜE=;è—ù*ØØzÍ¥K *) R@ΣãåVu Zl³{·Ny–Q©"BÏj+8 ¸€ØŸÊgÇÊ·©±Û— 让ԶójmE§TÒÀ#¥h!I=z)$â5£ RµH^´lîiÀÖ¯V›•xåwÝàz׌¹,Ä`¾úŠP”ôIQ%DNIµžè×tuº\y:§PêId)ÎÓwœ·ÔÛ`ž[iI%)ÂOy@µdœ ©Mõú+ó-Šf6Îhq·¢ØâUŒ€qêû+Y´Ä›q”¹Mv­-¥µ©Á":ÛJÕ”§r€Á «¨Ï‡QVù¬ÍmE½Èq³µÖ–0¶Õì#ÿ×à|Ei“„«SÌ3-¤¶^J‹|·K…E% Œm=ááWÚ~ ®Ò.2þ \²Ú$'9ï3ÿÈyy“.À¾¥xOŒ™ÝŒ§Ÿd8œsp¡i>DàþÎExXà*Ûnn+“$ÍtuqçÜ*RÕ猓ìÿ™É5ßnQ¬öywId†"²§WðÞ|+[µeÊòëOµ“<ç-´3 )Œ§?&•ºÉÞsÓ×¼€ðo•AƒéIT²‰*Ph‚„²ë€bT7!'8ò­FíBTc>™Xì!+·²§›Œ¨ï`…,©´£¦–zg§^ŸÒôFOY()6øòÝ¢j׿ŠÐþw¥qO®T•G /Êþ/ÀÚ4•Æ÷#RÜ¡]fEÒ!G}„°Ál#rÞB³’NO,Ôà=§k­3…V›s×i-m“)[ƒÎ9¹”¨ìÁY$Žª ôÎìàVç^GIdÚd©«%eÂIîñ=l©³Ç¬wo[û]ÊYS'L’ãÐè …•rÒ’µí8QÂèO “áÓÇ»•Â&EܸϤ©<Ä ‘â¤íÃØGQÔðâÕ|SòXyÅ4·]e +Ê–JNð÷°qÔ"\]C0ß$²ò#<ÔŲ¦œBŽP£ŒŒõ®OüØåÆÝx×RæINÅ)± ‹tÈŒ1Ð4¾SGº¢öw`ÍÏL›d[½¡:nkš2³iç­1!­m»nU±’ Ó Ș½êmƒ±Áƒ‚(«¨o¾ˆ»éËeçznä¸;ù›y;bH‘¿;¿êûqÓ×Îz`µ ÷Ñ}9oì¼ïMÜ—3o'lI7ãwý_n:zùÏL+u°´»-¿£ooèôk•Ë‹hE¹Õ9ÝèÇÛ%Q€Þ†L‚â¹E#)q(ÛÞ +¥…•Y,eí{G£\®\[B-®—#[ýûdª0ÐÉ\W(¤e.%{Á$û!çz2çÒó¥ [e, ŠVõîP%9HOt(åié·r‡…Šéùc{µ¿Ú \#7*+»žcN$) €#) à€}µÈ,šqR×`Œ3-­(î±–ìKdÈ*J#[—e”ʃŒ¬|K}Na ò*Ûƒ6YöÞ XlúF¿I^!³›È¹i·‚^”ˆèKëØÁuJPOÃ…-*ÚFIê:µ+–¿m·'‹wzŸL\›zvàÔj i ¤‡’6Ç!àò׸§zVÕ­#WÛmÑ®Í.ñ¥®ŽjÕëØ¦óØ\-*®Í)Úq°¶– mòwd-;¶tÝ@wiw¸"3"êÛÖþÑ8Ae¤-N8§Km*†pBU•„  åZïl,Àæí:2÷`½Á·„ê‰Sm®Æç5ÙÒÝXåË*BAQm( „cmÚ´%÷ÝF‡°ênËÙ=/m;³ó7ò¹­%{7`nÆìg8ðÔ7ßD]ô忲ó½7r\üͼ±$Hߌßõ}¸éëç=0x¯l,Àæí:2÷`½Á·„ê‰Sm®Æç5ÙÒÝXåË*BAQm( „cmnÚÓKÞo¯h«v°ô~¡a•Çå›}±ØÑÑ[&‡P§î— RIPJ·¥uïÓi\Fç¦M²-ÞÐ75Í Y´óÖ˜Ö¶Ý·*ØÉPi„„dL^õ6€AØàÁÁ7Mµ+‡³U¦íoÓ£Sv»=±Ë ³Ü^ÌPý¼aÒŸç-- Jš8Hí/] 3|‹dqý³åÆzS lW}¦TÒ\Vq…>ÐÁ9;ºgµÂôöž¶û¦áÞ Ô;a…3㠲͉DŽ7ÌèË„æÂ•®*6¥÷¼€Ç1I*OZ˜:R#ÜT¸@{M½t‹v“pMÒdëÑäFaÖÝè'îåIaEA´2R¤‚ƒ€;+Œµm×:ŠÓ6–fF»ék<È6É’[Lë¢Ûq–¦!G¡ •n’â|Pq°ht½ƒK^nzkBßí†$½2¢]fL×[BÔP„¯¡þ˜. …•$oV:Ѫ›Fß}ÑZ¸v^ËʹOƒ³™¿=š[Ñ÷çÖånÇ–ìdã'˜j«1cM]¢Ød^&I¸Â$˱<¾ÊÈKi[±®(PC  -L¯ªÔ1…ŒøDЬDÓþé#é·›Õ#^¸úeˆëíIˆåýA“Á…EZ”@Ï4M‰­´Ô­Kîu©¯‹uÆ[B} ºã`—må 6âÒ¢R•6«#¡¬Ÿu6/pþí{wûѾ”í|¥ÿÕy\ÞfÌoõ:íÆï,g¥W®Ú.PTÙ¢àëV›k[ж6Äm÷—%¸‡7|#Ü´¡$ŽZT0O9@rŸpz¿þ‹‹Ý†³í¾â9^€ì~ùØqÙ6vNÁã3Ëvî´\ÔšßMé뀷ÜeÊT¾P}lC€üµ´Ñ$ ¡e´¼ƒ×¡¯êë­tͶÛo¸;r2Y¹£|ÀŽäÇ%'hVæÛe+ZÒñ­p\œÑºãTɹÙ/sc^ä12 «mµÙ™ŒÓ&:ƒIQl…4¥‚¼ óO{ ÕvOCé=?.ñVÙ®ˆ~äû2tüNØíµ©r‹ý•ÆÐ‡BÓ‚Ò~ö´‚ψé7 ô}¾Æ»Ü—ï®oiu«çLNRRµö„¡’¦0•¥_‘’2ÆÁ¦ï¯ðW2 6ZC¥¢™öÉœÈä!ô!E=Gx g#9æê­U~àb\#\çÈvÛqgSöîÏ6s*‰„ÇH.âBRT“´b¶n&د¯Gú&ßÛ9<Þgûßp²mÎÌÕ®np}|mÇLî4Ö»¾û—Ð÷íMÙ{_¢-²'v~fÎo)¥/fì¹ÛŒàã>®k^´¾£‰Áî"Á‘exKŸ§å3†u]Æüãë1Þ L¦Ò[Q*H¼•“×ÕNk8›evV¡Õ¥ý3v¸jy|q×F!8ëppÃiNH)²@uÅî(Þ•Þð ;•+–¿m·'‹wzŸL\›zvàÔj i ¤‡’6Ç!àò׸§zVÕ­PB½/ˆìÜ`i.ÇsgVG ’Öš˜ôµB3P‡72èk’¶T¢YJV…mÚÉ«éué­C Óè¾GjôßÂvÛ}pn†Ñžg3wïg5¹×°è†oz²ÈΨÓNL¶°î¯umMŠ£©ëÓ+c˜• ª orРÃ;r7þÁ“lÑ^“DdÄºÜØŠÓéP(Љò ÝvrC{ONÒ:b€ðÕS Û ±>å2<(ŒÃB~C©m¶Ç^ªRˆj¶Ý}¡nS™nÖšnd·Õ±¦#ÝqÇìJR¢Iÿ Ûõ ,É<†ó.ÂJmi JÒA|AUÊxcÁ] 5MÓPÚqÉ2ÖDP÷xAh¹¶Ï÷œ÷]¸Òy²K>ÿÛœ@ÿóB¿ôQ+l¼ÜcÚmr.2ÔC, ­[FIö<ÉðÌÖ§ÂßûsˆþhWþŠ%l:Æ™Ú}æáµÏˬÊmœ…,º‡y}zw¶mëí®ue(Á¸«»«)FqWi3W›Õ)+ëöûZèkì'B\)Jƒk|-)Jö­'+Äà«¶=!~ôÜW’û<Ø« Èi*ÜH)*é¹$AÀö kÖrÅ¿Nßc3mfè©Ó”á2€ìÍ·Ée²I9ݹ ²ªrGLÏ ¾xX"4´2Ìc·Ô6\Qq#ÿ.”§Úé‚|\*¥JÑYó]]«~¾GƒÇT©ˆŒó]6×wó6 ö¬±Ùf¦ Çå;1M‡{4(/Ëu($€µ!”)II ŒÁöUV¯Õ7iHw"ÏnD™\§ô{òŒvÀ^å픺£ÌB[))*$ôI….KÚsRjuN‰|K·~Î×n\Õ±ˆÍ²[(B)RTÙpoAAæyõ«_Ñ}¥¬-êK3·}òn;å]lÜym ²ó`ÅåŽbÙÚw”›T Í{Çô'Z°I›2Åo—r‡Øg?·$ÆÝ»’â’ ‘Ÿ=¤‘Ÿî¯âÛwt¶Zî–´;6Í´<Ì„€†–Ùq)+)Vu8«+n#Xá$oð¹‹^¤·«¼ìØÎD™¡&?iy  ´µ/ –¶’¥¸ï(u:¿ì­AÒ¼3…oÓr-’-·$‹Ò=¸Ø’›D–œyd …,¡<ᔨ‰é@ty÷E¤,ºƒ³v_IÛØ™Éß¿•Ím+Û»8ÝŒàg°ìŸþ"í_þQ¸ë!WŸ ãI…ÂÍ%dwcIbÉ §™u miaIROPA|+ÒÉÿâ.Õÿå‡þ²ðdZ5þá ÇÙw¹]/³-,OšœÅb40¶ÁÕöu”îWD¤%J8'k­Ã^[,×·îKè§ç1.4ˆ’b8´$Ò·GmÀ®™ÆÜcñ³Z·îÍè[ä+Ž¥R¢Xu.ž´¦%ÑÌöxï°ÆÕ0ê¼Ü¹%XOEu'"¬µïàMƒ©lÌͰʱÉÝ-òÝœ¨ÉÚ†¾¦YOyíÙXCn(à$׫Ò8½gS «^÷µ¶K[¡)Óu¤ìÚº»Ý–§f¥hÜ5âÞ€â<épô]íë«°ÚÉP·Ii¶8H+q´¤(õÂs’¢ 8ÞkÎ5ŠR””¥¥)@)JP R””¥¥)@+F×ölïü³ÿ¼åo5£kû6wþYÿÞr«-Ä£ò‚”¥Xƒõ’ãÿhIÿÞ«ÿ¹¬I,3%…1!¤:ÒÆ…§ ÿˆ®A"Û©ßãîñ/W¸¢µmìI''GÀÿ\…Þ)]7V»×8òÜÜá×…Ñý7C¤œ–2–[^Ëuïoì͸Œ°ñN´’½íwË÷>ÀBR„$a ` šøÝ\R¿þ.»Ö_ñnðëÉ\RÔß‹®õwü[‰ü:õ¬ÿéKÈÈåKÖ/3ìÚWÅÊâ–®ü]wªâÜOá×’¸¥­¿]êOø·øuuÏþ”¼Šõ”»èûIÖuh[!JFv¨Ž£>8¯Jø‘\R×ß‹®ïÿñn7ðëÉ\Râ/âë»ßü[ü:º§YÿÓ~Du´»èû‚•ðÚ¸¥ÄÏÅ×wø¶ÇðëøW¸£øºîéÿØþ[©­ÜduÔ»ÈûvånƒrK)¹ aÐóAc!+€¯ñÁ5\t¦Ÿ'¯ÈVú<ìÿå_)q[Ë]Ü?âÛ?ïàñK‹^Zîwü[gøuÞ hæG)¼4Ýåf}ÖÚÚ”+ú¯„¸¿å®åÿŶ¿‡_Áâ—üµÜŸø¶×ðëžÍ[ºËí»ÇÝ’âE–€‰QÛy ä¤ó‰nƒeq¢4Ò‰BqšøPñKŒþZíïø¶ßðëù÷Òã_çÛŸFßðêÛ%néE.ñ÷½+à}.5þ}¹ômÿžú\küûsèÛþ6JÝÑ´Òïs9b³¹$É]º:ž'%esÿöf²Ã,ýé¤#Ë ¯ƒ=ô¸×ùöçÑ·ü:{éq¯óíÏ£oøtÙk>h¥Ìû¶ìÓÚ¥°Òw8ã BFq’R@«‡4×4Þœ˜ô'dÚ­1`¼ãN8Pµ´ÊP¢œ¶ IÆ@¯€½ô¸×ùöçÑ·ü:{éq¯óíÏ£oøtXZËý£h¥Ìûòm‹CMÔIÔs4Ž˜“zK­¼›‹°¹!mà!aÒÖíÉÚœämð­ƒÓM{XùëûùÇï¥Æ¿Ï·>¿áÓßKŸn}é٫÷FÑK™ú9馽¬|õýŠzi¯k=b¿8ýô¸×ùöçÑ·ü:{éq¯óíÏ£oøtÙ«÷FÑK™úqz×p™m—1–zÙ$ʆ®s£–éeÆJ°ƒðo8œŽö|@#7ÓM{XùëûùÇï¥Æ¿Ï·>¿áÓßKŸn}æÍ_º6Š\ÏÐø‹²Äì}’ÛjØYTxœ¦Ê{;JÛ¹¶ðßu'b2u>ÁY¾škÚÇÏ_دÎ?}.5þ}¹ômÿžú\küûsèÛþ6jýÑ´Ræ~Žzi¯k=bžškÚÇÏ_دÎ?}.5þ}¹ômÿžú\küûsèÛþ6jýÑ´Ræ~Žzi¯k=bžškÚÇÏ_دÎ?}.5þ}¹ômÿžú\küûsèÛþ6jýÑ´Ræ~Žzi¯k=bžškÚÇÏ_دÎ?}.5þ}¹ômÿžú\küûsèÛþ6jýÑ´Ræ~Žzi¯k=bžškÚÇÏ_دÎ?}.5þ}¹ômÿžú\küûsèÛþ6jýÑ´Ræ~Žzi¯k=bžškÚÇÏ_دÎ?}.5þ}¹ômÿžú\küûsèÛþ6jýÑ´Ræ~ŠÀŸo ˜0#A‹„Ùa¤6Ú@ÀJRÀy ÷ôÓ^Ö>zþÅ~qûéq¯óíÏ£oøt÷Òã_çÛŸFßðé³W3ôsÓM{XùëûôÓ^Ö>zþÅ~qûéq¯óíÏ£oøt÷Òã_çÛŸFßðé³W3ôsÓM{XùëûôÓ^Ö>zþÅ~qûéq¯óíÏ£oøt÷Òã_çÛŸFßðé³W3ôsÓM{XùëûA.Ѧeêfµ˜Ùí8—>I`:”ìK¼Œr¹8{w^•ð¾—ÿ>Üú6ÿ‡O}.5þ}¹ômÿ›5~èÚ)s?ES>Þ™ÎOLh"[%•¾¹Šm%E(*åä¤¨à ´×¿¦šö±ó×ö+óßKŸn}ç¾—ÿ>Üú6ÿ‡Mš¿tm¹Ÿ£žškÚÇÏ_ا¦šö±ó×ö+óßKŸn}ç¾—ÿ>Üú6ÿ‡Mš¿tm¹Ÿ£žškÚÇÏ_ا¦šö±ó×ö+óßKŸn}ç¾—ÿ>Üú6ÿ‡Mš¿tm¹Ÿ£žškÚÇÏ_ا¦šö±ó×ö+óßKŸn}ç¾—ÿ>Üú6ÿ‡Mš¿tm¹Ÿ£žškÚÇÏ_ا¦šö±ó×ö+óßKŸn}ç¾—ÿ>Üú6ÿ‡Mš¿tm¹Ÿ£žškÚÇÏ_ا¦šö±ó×ö+óßKŸn}ç¾—ÿ>Üú6ÿ‡Mš¿tm¹Ÿ£žškÚÇÏ_ا¦šö±ó×ö+ófçÆ2Ûã¥çµËêJ•´4Ñ9Á>mÿuW{üñsóÚoгö+”á8;HéÆJèý7ôÓ^Ö>zþÅ=4×µž¿±_™ÿ<\üö›ô,ýŠ{üñsóÖoгö*º–Ðý7ôÓ^Ö>zþÅ=4×µž¿±_™ÿ<\üö›ô,ýŠ{üñsóÚoгö)¨Ðý7ôÓ^Ö>zþÅ=4×µž¿±_™ÿ<\üö›ô,ýŠ{üñsóÖoгö)¨Ðý7ôÓ^Ö>zþÅ=4×µž¿±_™ÿ<\üö›ô,ýŠ{üñsóÖoгö)¨Ðý7ôÓ^Ö>zþÅ=4×µž¿±_™ÿ<\üö›ô,ýŠ{üñsóÖoгö)¨ÐûÓYê›ü[º!Ú4 æõߥ´}­Û^—³Zí’ì§Š„©×•+?Àà”¥)J@>škÚÇÏ_دÌž.~zÍú~Å=þx¹ùë7èYû}Nº¦þškÚÇÏ_ا¦šö±ó×ö+ó#ß狟ž³~…Ÿ±Ož.~zÍú~Å5¦þškÚÇÏ_ا¦šö±ó×ö+ó#ß狟ž³~…Ÿ±Ož.~zÍú~Å5¦þškÚÇÏ_ا¦šö±ó×ö+ó#ß狟žÓ~…Ÿ±Ož.~{Mú~Å5¦þškÚÇÏ_ا¦šö±ó×ö+ó#ß狟ž³~…Ÿ±Ož.~zÍú~Å5¦þškÚÇÏ_ا¦šö±ó×ö+ó#ß狟žÓ~…Ÿ±Ož.~{Mú~Å5¦þškÚÇÏ_ا¦šö±ó×ö+ó#ß狟ž³~…Ÿ±Ož.~zÍú~Å5¦þškÚÇÏ_ا¦šö±ó×ö+ó#ß狟ž³~…Ÿ±Ož.~{Mú~Å5¦þškÚÇÏ_Ø­cXº‡­3T…¥_Ñ^'np +V:íÈ8k¥õn©áæŸÔÓx»ªb¿t‚‰+e˜q„@%ã ÿ­|BÒÚƒLhkÞ¡w‹Z¾rmð]‘ÙŒ(h¤‚­‡ž„ààáUwdŸR¾ûÿ¡o ·õ—ùÈßËÒ¯r¥Ç¶¾I¶Ú»u’ëpnF·%§TÆÏ]¥/–¥îÏM«SCë¿Äc¯ÖÞÚùCEÜáZï[®‰»l–‹1,$)Î[ˆ)Ü¢RNÕ€HH¯âÿüÆ÷ÅÛÿçÿ¹êŠ­’…ÿîÿÔ°‘¢¦‹kÄíæ9؃Œ¡¤4©M¾ëi*+ÝžSI^v핸§hß_#K^ÙeÇÌf]e×$ºÄ¦Am+JB¢RVœ¤@9#kn°ñ5¾á|ž¸ RîWVä4Ñi·f069FÕå*)L¤mJ’Rvzxÿ35Å­W»*ä™ÖXÊ™­5e‡l*jJÓÁ Gî•ìOE©G¨ODã¯Õ3T¾ãù BÛÍeͪ›Ø—hxI,Æ}-oNå&A@ghÏyJ+HÚ:޹iÆ ²Ï±LDK€‹Ì[|ĘòÚ‚œ”úí)IÎRAÈÇZÜnüDô¼kj¤‰±'·w2¥JŠR–òÝe-dúèT‡ñžƒ {:Pñíh¼]£H´2°Š“!pšˆ©NïZ‹¥–‰BÕ%= ÎÍÇ©5h¹ßTD”m¡­Ò”®‡1JR€R” ¥()JwѺ&Ý´[‘|•}Úå"Ý”[ìïi¶Vë¼Ô–ÒyéVI5¯Û4Õêå¡ÅBÐéXe*Ú|¤eA´)ANÿ²^ž5°iÍ{&Å£!é諘¨ËŸ5Û¬>iC#¾ÌfÒƒƒëŽS¤(ŽéRHÏQWˆË]¶Û‡ŸŽ»œ÷}Ï[å<úKëy /=¹qÖ „wy€`3œñnjçT ÍNfˆÔ±-~‘~ g²·3`šÂž,8„­.†‚Ë…T’U·®qƒé½ª\rM[Ùqé’ŽÛ˜ÂmÇTÚ]@^æw.޵³j;Þ˜·Ü[ºÂŸ6uÙÍ1ܨèa³ rÔÜg88TT€¥ŽXÂÓ‚zVMŸ_é«f·{W¡»³²î×8òîQLfÒÜd"k2Ü ¯˜K„©”îJ0 ɨÏ;]"rÂú³V‰¡®/èû¶¡TÛcFÛ%†WË„d­AÆ]t‘—Þ`)Eisk¯Ri«ÆS(»°Ë t©!´JiÕ¡IÆä8”(–Ö7 ¥`Ÿ ˱Ý-HÑ—Ë ÉsYrTˆÓb»”º ¬7!µ…-;R®¬7·Õ9¬î#ê =ù 2\ÖÔòå\&Cf;ï…lØ…ò”C¥VyªÂ•¿¨tåšÜ µ·4úR•Ðæ)JP R””¥­ŸGéê5âáÛÄUAoú3E­ÆS¡·]-ƒ‘·àÙpç¯]£áZÅoÚG^ÛtÕ¦Å5 æü9ÎO’ôÕ>’—TR–ùO%*O- ûâHÊ”1‚sI¹[Ñ-¯©ƒÃ]7Uj329LZæÜYŒëŠœÃ-µ8”¸YKŠÜâ€'ÕJºùyWš8s«×©bß4äv¥eWÉ-°ê´:à.e¶ÈR{ë œJ¿Óš«DÃÔ:jé4_ÐÞ™š &#ÆeFLtÌ\„)Å)Á±c˜ R‚°äøÕEÇV[¤úwc2Ǥ4Õ¶ÒÖRžëÑ»õ+½êÊæÉ꜓Šfžm Ú<Ç5B£,¢Þ®Ðà !o°†[m±á¥Ü(ÖÑ';T•(nÙü'‡ÚŒ¡Æû\óhµ!‡#8ÛÈs™ÏmÚgᔕîR @VÃ}â–~†“cf5Á2]¶5)m£fôµgA$îÎ3nËñ›éÕ[‹&½´ÅÒVk*Þ»Á‘ 2—eFŒÓ¸]ÑJ°’'4’•`(ÇLÆj™obrÓ½ŠAÃûªt½æôüÛKKµKa…°nqO5.2ëÅhW7¿ÝBv¥!EÍÊÛ’… À^Œ¿·¨ÞÓҷƹ³¼8Ì‹¤fBT‡ eKp'~àpœåC ¤‚no:KÜ ê[s1¦ÛãÎ~ÈF<&€[ñØyµol-)i.©å,ì*ðB³ÖYíg«ïÓ-ïnºÜÜ™nyÛlyŠiµ:âÔÚšy\´©AHï÷öì859§÷ù–$ÝÞ¶Ú%¼üvž{vÐì&7jihq†û­-ä©k+y@ íÚ•(„¬*µÿr—ßBzc²³Ù¹\í©®+òœÜÝŸû{vã®q[Ù×úfF¯fý!v„m#PÆi¸Í¯œÃïGR²\”±‘À•c wªÝM‹o¦±qôç¡=Ù9ì»{cæówîÏ/½³g­øØ¨RŸãV¡Ðš¢Ác×H 5Ø]åKm¹¬:ìs»h+m *JJºr0NEkUº^µeºn¡âÁ¦e¥­KÍìiRS¹½÷dŽg{§q¥›»Äyu]tƒ“^‘I$ž‚”¥\¨¥)@mLio,:OÒ8ô¿£?¤ò~õÛeÏWw{g;#vÜôÏJÄé«Ò­žQÊä; †ÃÅ p\ nÞQâwmÆ>kw¶qfõZé©‘õ¥cNÚÛµ5"ÜÔÅ¥ DvXCéKA{Z›p€q»w\dדÜAŠö› …˜·Újå5`€¢´ýŸqš _Näx§õ )#ãš§#­¡ÌÃÕü2¾ÛuÖ5®*]·36[VòüèâD¦˜ë$¥½ÁN,•”ç¦q‚+B®Í¬uŽ‘ª´þ¸feÍsâ»*áÞˆÍ)7i’mõórÒ°´’…÷T=s\f¦”¤×¤EEô¥+©ÌR” ¥()JJR€£Öö[_ûñûª­F¶ígÿeµÿ¿ºªÔkÅÇv§­ƒì‰¨©¨¬†¢|ª O•A ¥( "¢€Ÿ*ŠŸ*ŠJR€JR€R” ¥( ¨©¨ ¥()JJR€R” ¥()JM=´4öÐJR€R” ?C4ªõ|û™4ªÃ ’l·Û„nzÚAR÷lÓ…à¬ôòë‚)õ”¾h¿¹«Viûƪ:¸Ö§ÄG× ²ãMì?£Ì^ð<¼0:uŇ´&˜½p{F\®‘î¯ÉvÌÎâ‹ôö ’[iô¡#¦{©$“Ô“^\fÐ:FÓÂmUq…o¹‰ Z¤)²æ ¹8v’…H)W‚ÌÒ¨XúN”¥IS€{kæ©6¾°¢•Ë·=Ž/ìWÒ¾ÚЮ¿~]|_ü?Ó¸¾ŠE†kҵöþìþÛÑ”1Ô¡×_ѽ¿;|Ž:½ wGŒ˜?=f¼£®h_‡óÕök¦ÈðªÙ>ý•?ñ—IË{^G‹?ðþ nOÌç«ÒóÑâôoœ¯ª¼±KG‹ŒÁGê­ÞGª¹>uº—ø«¤%½¯#,º ¸?3UrÙ!+kþýUฮ#ħõÕô¯­‘âk}?ñ6[Úò3Ë¢0˃ó+V |kÉn¥> ׳õ†ýl‡Nbßäq—FP\üÉTÆ“â•þ¡_®,'Å.~¡õÖ+µˆïiKâ_är—GQE‚®ñ‡ŠýCë¯áWȃŷþhúêÚÅwÀÖˆôwÈæð4‘|­E­Hù£ë¯?tÐ?#'æ§ë­ißTÖ?hŽ:³9¼#m÷Mò2~j~º{§ù?5?]jF¢­·U#c¤mÞé ~FOÍO×Otð?#'æ§ë­HùTSnª6:FÝîšädüÔýt÷Mò2~j~ºÔiMº¨Øéwºh‘“óSõÓÝ<ÈÉù©úëQ¥6ê£c¤mÞéà~FOÍO×OtÐ?#'æ§ë­F”ÛªŽ‘·{¦ù?5?]=ÓÀüŒŸšŸ®µSnª6:FÝîžädüÔýt÷Oò2~j~ºÔiMº¨Øéwºh‘“óSõÓÝ4ÈÉù©úëQ>ÚmÕFÇHÛ}Ó@üŒŸšŸ®žé ~FOÍO×Z)·U#n÷Oò2~j~º{¦ù?5?]j4¦ÝTlt»Ý4ÈÉù©úéîšädüÔýu©{j)·U#n÷Mò2~j~º{¦ù?5?]j4¦ÝTlt»Ý<ÈÉù©úéîžädüÔýu¨Ò›uQ±Ò6ïtð?#'æ§ë§ºx‘“óSõÖ£JmÕFÇHÛ½ÓÀüŒŸšŸ®žé ~FOÍO×Z6ê£c¤mÞé ~FOÍO×Otð?#'æ§ë­F”ÛªŽ‘·{¦ù?5?]=ÓÀüŒŸšŸ®µ/*ŠmÕFÇHÛ½Ó@üŒŸšŸ®žé ~FOÍO×Z)·U#n÷Mò2~j~º{§ù?5?]j^ÊŠmÕFÇHÛ½Ó@üŒŸšŸ®žéà~FOÍO×Z¨¦ÝTlt»Ý4ÈÉù©úéîžädüÔýu¨Ò›uQ±Ò6ïtÐ?#'æ§ë§ºh‘“óSõÖ¤)åMº¨Øéš‚ñá ²ÛÉR\ %`Œä¾¨©JÏR¤ªK4ŽôéªjÈšŠšŠæ\Ÿ*ƒSåPh)JEEH¨ 'Ê¢§Ê¢€R” †††€R” ¥()Jj*j()JJR€R” ¥()JJR€“Om =´R” ¥(Òžþô7èfÿyuçÇïÀ¦°ýÿîšôà/à/C~†o÷—^|~ü kÑ/þé®|K¶”¥X©À=µOb‚Üè·¦û3O?Éé¥E+Æ ð늸öÕ²åßò‡$)—Þg …d¨%XÁH¯‰‡eJ8ôë~;ßÿÏáâwŒSx;C}×÷Gójӯ°ß»[™ ì¥QÔ½‹)! Égµø:@J ù·V`¹<íˆÒ›*.,zg§ëgf¿¥[Ô{­Å÷~1Ddº¥¹•¬?Œ£Ó>^5¾œp½TlÖ—³¾¿K¯àf“­Ý=mìÝó#^h—=I{6K„fFe¢ÔÌrœ 6zŒ$rpñÆjºÅ¦íó´^zé覢N¼†\Z-Êí.wžÃky+Ê’¢ŸTmÊN{½oåëmÕ½Yç"Tùvcve¥+PJ;ÁDxwRpzg"µVuuŽ'ô…¼ÊS“íW´M“-+!´ºê²FÒp¤ôÏükzXuQÉ[[ñÓz·šàfÿS*ZðþƿNj5†Í¬]fË)¤¨„‡à7M¦&ooxô^ü•tðóë\Õúè\k¸X/ZµËíŠì©ÂjR^hÆ[|‚„!eXݜӹëõ-ÖÊÛ¯À˜ß*¹†íb;çYnÖ#¾uÞ9ŽÖ+¾²¬W| mÆF#¾©¬:ÈwÕ5çZã¸âÁ¨©5b >U'Ê¢€R” ¥()JJR€R” §ÛP*}´R” ¥( öÔTûj()JJR€WÑ|pá›z‡Ž¶)¤-¶Ë;OY%òÄt²Ói<â’€2z%?ßÝ:WÓ7þ3é|·ê»l·nVUØE²[ÍGZÒ‹ës!+ 'FqäN2F(_®øXÝ—H+WiÍQSY™”bKy¨êeL::¤“”äœþ2HÈ9«y<ìVȬÜõ²¦•o]Á›;Ì© ¶I x©VñÈ=H×¶°Õº"ÁÁéÜ=ÑWiWßK\{d‰NÅS eHP@ êUðH¼zto¯uw 5ñ«µÆæ›¬[A†í‘˜ËIqḥIxwR¥¨õÎF2:@ÒøaÃKf°‹S5¤KdÙ¯)˜°Xˆ¹œnu(#’œžŠ^:øVõ ¸OÙ¸ÇeÔûeÎ}’Ô…Å’ät¸Z*!Ä­²¡”6r²¼x?Ä- ¦øk×I–+ÔKšeÜ;$"ã·Vµ),•ø%$¤äTÿâ5ouâV„UÛ‹r˜Ô)u–Ï›n!¾ Ž¢#­)(Nâž§¼:ô8úÕ|6Ò—íÂæ½+gÒ’î6ÖÛ.7nÜõÂCŒ°S›wuÝ•-] Çš«œÚx3y—Ä þ˜™t‡-°ýÂä´•6†Šw¡A= %'8$c¯N»&¨×ÚNhà¿e»s=ÍvoKÿGtvm—wŠ{øå/ÔÝáýã6Ê⦋_uú%Mæ™Õˆ. G^æŠ#‰Ø ŽûƒÃ9¡4=Õ¼(—lrm‚÷ÿgÔRQô´¦9JÚ´+%=sæ}Ud U¶½àݳJÛn!Î!Z—z·°—¶ÉŽb—’S» ­jøSŒôHñèpzW¶¾Öš9½¤xy§î¥¦Ï8L›si“ÕË'’•õJ¾ oZÛõ¯ø/†—«µ]î PÞV‘pà‰“>™7{ïaeÄÛ9S Öä”$;+yÞŒ¤wv ž½Þ¾Z÷ƒvÍ+m¸‡8…j]êÞÂ^vÛ&9Š^INì2µ«áN3Ñ#Ç¡Áé_ÜÝe¥ûŸ´^”vå(Ü­×ÎÕ>Ý`wO´Ê”b iH OxžùóÉåšè»Þ¤¹Þœh4¹ó”¤’âʈášê{½ézs6Þ¹oIz[—ý/´óy[¹ž8ÝÞÛáåŒt­oî}ÓšjëÛ|‹n—²ê ®éfünm˜±J••µ»¦Blj'ÙYŒÚ#˜uø3ÝW¹ßDz+²«o7™Ìæs}]»¿¿8òÏJ×xO¯ô;<:°iíAw—`—`½¦éÌf*ÝLð•-A d/iÏ’Sãä®þÐÚ“Œš†ÍnÕ´ÆžŽ•;TÀ9jX-¥M'˜´~2–GRp:ŽJ°—¤Ú£cê][pp"Ø‹‚P¸M¡#rÊ”0v…œàžèÄ×÷&éÃyÆ]A{ÕÓî~Á)²äUÅo.)ÔòÐ7¶æ7$-g§Ÿ¶³…«á«ö‹Œe"mžíÍC¶ûà uÐÈ$§–ƒãÐà}cá@ux¼>Зº‚M’ßnHµ[­ÆdØ% K= ('`ñ>µ`tÎG‡JÓøÇi°ÝøA¥¸“i°Ûìr'Ëv˜ðZå² èIÚ:9'¯žî¾¯WÆÝ<>èdêæ£HMˆÛ}ëÁ¿„Z7oæíñõ°1ã´{zV©ÅÝ]¥WÃ;ÃÍq~ëÙ!ÙoMr:™ R”áJBU×§5y?áÿ*®úGYø‘l°?Ä87 ñ&]Ú¤²R< µ‚³ËHsðƒ¡óÚ>é+•´hÎÊÒ––¡EŸçù…¤‰¤¢:^Pê¥ çÄôÉÇJç¼Pƒ¡­÷öЙ×kZ¢¥N½-+KÛÖ @-£¦Ðƒáæzû6¾5êí=¨´mvk‡j™fµ˜÷ù.#’ç*:q•$um}RHéýâ€ÝôV§¶IáÝ÷]êŽpý‹dÓ·Ðä$®MѠˈåÈ)© +¼ã£)$tÿ ævÖ£?qŒÄÉB$gB| ¬4‚@Röާ'©ÅôD¦ô¯á>³½ÄÑ0´õšÒÃi²Oìá¹OHÙÞBÔ ßð… ñ9 ë×ÂÛAhýn³pïMÜ´µ²æö²ƒ*TɲÜû{XKÉ ¯ÅLxgƵŽ,Þxq|Ñ0ôþ›â@…j³CQ‡hE’I3$%$‚ã§hÊL‘€T¢sš°ÐÜSЂǢá6%çGD‘¨MÄS‚`[A¤”¬wSÝJ}b:çË­[¢4­ƒFè­«î¶H÷ì7“iŒÍÁ ã@!æÐ¥øy£¯–Þž&¯¤ð‹L¯î˜ô2`'О‰ôÉ€•‚wò¹c¯D•÷±áåáZv„â™»ég¥5¼çìñµ ÏÒ‰–Ôu>áq Z S×ú´àãÛáçp¾7ÙÇÝî½,ÉUƒ°z+~Ï„ånßÌÛÿ¼ë¿ßÒ€£û ­+‡§¬3ÑZfÔ© X-=+tg±Ÿ‚R ;ÙVv«Èqšë¼[ÕúLðÃOpïHܤ^#[e9-ÙîÆS9*S…( W_ëU“áÐÑP¥<üèoÐÍþòëÏßMaú%ÿÝ5éÀ_À^†ý ßï.¼øýøÖ¢_ýÓ\ø–;m)J±S€{kBºýùu¾ûkM]®çsø¶Û¦M-ãgaNmÎq ã8?ª¾„MÕiDÏQNNƱ#«døVÜöÕŠ4ÍàÿðN}U‚öˆÖ*Ý/x?üþªþ‚”ZÞ6¥zOýËÌÓdx«“ç[ÃÚ[+8Ò—ƒÿÂ/ê¬øs¯ºJðøU}UéQ’[ÙŽuaͯ­‘âk ?à «ÕÑ÷ƒÿÃ*°žáWÔzhËÁÿáÍzTjÓ[ä¼Ì“œyœíúÃ~º#¼#âZ¼4Uãè+Þq=^"ñô5èSÄÑ_ï^hÏ&Žríb;ç]!Î qHøh{ÇÐÿ­c¹Á^*œãBÞ>ˆ}u²ºõæŽ29£µŠï®šçx²|4%ãèÇ×Xîp7‹‡8ÐW£]j†7 ¿êGͤ™ËÝõMcù×P_x¾GMxù‰úëÇÞŒ9üÞ>b~ºÕ~ݬ|ÑÉÅò9©¨®–x Æ“ûÇÌO×Qï Æ“ûÇÌO×VÛð¾¶>kæFYr9±ò¨®–x Æ“ûÇÌO×Qï Æ“ûÇÌO×M¿ ëcæ¾c,¹Ö•ÒýáxÃòxù‰úéï Æ“ûÇÌO×M¿ ëcæ¾c,¹Ò•ÒýáxÃòxù‰úê=áxÃòxù‰úé·á}l|×Ìe—#šÒºW¼/~Oï1?]O¼/~Oï1?]6ü/­šùŒ²äsJWK÷…ãÉýãæ'ë¨÷…ãÉýãæ'ë¦ß…õ±ó_1–\ŽkJé^ð¼aù?¼|Äýt÷…ãÉýãæ'ë¦ß…õ±ó_1–\Žj*}µÒ½áxÃòxù‰úéï Æ“ûÇÌO×M¿ ëcæ¾c,¹Ò•ÒýáxÃòxù‰úéï Æ“ûÇÌO×M¿ ëcæ¾c,¹Ò•Ò½áxÃòxù‰úê}áxÃòxù‰úé·á}l|×Ìe—#šûj+¥ûÂñ‡äþñóõÓÞŒ?'÷˜Ÿ®›~ÖÇÍ|ÆYr9¥+¥ûÂñ‡äþñóõÓÞŒ?'÷˜Ÿ®›~ÖÇÍ|ÆYr9¥+¥{Âñ‡äþñóõÓÞŒ?'÷˜Ÿ®›~ÖÇÍ|ÆYr9­+¥{Âñ‡äþñóõÓÞŒ?'÷˜Ÿ®›~ÖÇÍ|ÆYr9­t¯x^0üŸÞ>b~ºŸx^0üŸÞ>b~ºmø_[5óeÈæ”®—ï Æ“ûÇÌO×Qï Æ“ûÇÌO×M¿ ëcæ¾c,¹ÛÊ¢º_¼/~Oï1?]G¼/~Oï1?]6ü/­šùŒ²äsZWK÷…ãÉýãæ'ë§¼/~Oï1?]6ü/­šùŒ²äs_eEt¿x^0üŸÞ>b~ºx^0üŸÞ>b~ºmø_[5óeÈæÂ¢ºXà/~Oï1?]G¼/~Oï1?]6ü/­šùŒ²äsZWK÷…ãÉýãæ'ë¨÷…ãÉýãæ'ë¦ß…õ±ó_1–\Žl)å]+ÞŒ?'÷˜Ÿ®žð¼aù?¼|ÄýtÛð¾¶>kæ2Ë‘Í)]+ÞŒ?'÷˜Ÿ®§ÞŒ?'÷˜Ÿ®›~ÖÇÍ|ÆYr9­Et¿x^0üŸÞ>b~ºx^0üŸÞ>b~ºmø_[5óeÈæÞUº_¼/~Oï1?]=áxÃòxù‰úé·á}l|×Ìe—#šRº_¼/~Oï1?]G¼/~Oï1?]6ü/­šùŒ²äsaQ],pŒ?'÷˜Ÿ®£ÞŒ?'÷˜Ÿ®›~ÖÇÍ|ÆYr9·•Et¿x^0üŸÞ>b~ºx^0üŸÞ>b~ºmø_[5óeÈæ´®•ï Æ“ûÇÌO×Ox^0üŸÞ>b~ºmø_[5óeÈæ¦†º_¼/~Oï1?]=áxÃòxù‰úé·á}l|×Ìe—#šRºW¼/~Oï1?]=áxÃòxù‰úé·á}l|×Ìe—#šÒº_¼/~Oï1?]G¼/~Oï1?]6ü/­šùŒ²äsZWK÷…ãÉýãæ'ë¨÷…ãÉýãæ'ë¦ß…õ±ó_1–\ŽmQ]/ÞŒ?'÷˜Ÿ®£ÞŒ?'÷˜Ÿ®›~ÖÇÍ|ÆYr9­+¥{Âñ‡äþñóõÓÞŒ?'÷˜Ÿ®›~ÖÇÍ|ÆYr9­+¥{Âñ‡äþñóõÓÞŒ?'÷˜Ÿ®›~ÖÇÍ|ÆYr9­+¥{Âñ‡äþñóõÓÞŒ?'÷˜Ÿ®›~ÖÇÍ|ÆYr9­+¥{Âñ‡äþñóõÓÞŒ?'÷˜Ÿ®›~ÖÇÍ|ÆYr9­+¥ûÂñ‡äþñóõÓÞŒ?'÷˜Ÿ®›~ÖÇÍ|ÆYr9¥+¥{Âñ‡äþñóõÓÞŒ?'÷˜Ÿ®›~ÖÇÍ|ÆYr9±§¶ºW¼/~Oï1?]=áxÃòxù‰úé·á}l|×Ìe—#šRºW¼/~Oï1?]=áxÃòxù‰úé·á}l|×Ìe—#šÒ·½IÁþ%é»ÛýûHO·[!% ‘!ò„¥N%´þ6I*ZFO\øF‰]éÕ§Uf§$׃¹ 5¼ý)à/à/C~†o÷—^|~ü kÑ/þé¯Nþô7èfÿyuçÇïÀ¦°ýÿîšq$í´¥*ÅNí­ ë÷åÖûí­ ë÷å×çü/hÏ£G²E ­“áVR<*¶O…{ôL ÙªäùÕ¤Ur|ëÕ a™Y+Æ«dxš²•ãU²U€R” $TTŠŠ|ª*|ª()Jhhhh)JJR€R” &¢¦¢€R” ¥()JJR€R” ¥( 4öÐÓÛ@E)JJR€ý)à/à/C~†o÷—^|~ü kÑ/þé¯Nþô7èfÿyuçÇïÀ¦°ýÿîšçıÛiJUŠœÛZ×ïË­÷ÛZ×ïË¯Ïø^ÑŸFdŠ9['¬¤xUlŸ ÷è˜*²< UÉó«Iªäù׫@Ã2²WVÈñ5e+Æ«dxšõh˜æW?XoÖcõ†ýzTÌÒ0ݬG|ë-ÚÄwζÀá#ÚÅwÀÖSµŠï­°8ÈÄwÕ5çYú¦±üë\wX5&¢¬A'Ê¢¤ùTP R””¥¥)@)JP R”TûjO¶€ŠR””¥>ÚŠŸmE¥)@)JP R”‚””¥>U>U”¥>ÊŠŸeE"¢¤TP R”ŠyPSÊ€ŠR”ÔTÔPåPj|ª ¥)@H¨©ùTTùTP R”ÐÐÐÐ R””¥¥)@MEME¥)@)JP R””¥¥)@)JPií¡§¶€ŠR””¥úSÀ_À^†ý ßï.¼øýøÖ¢_ýÓ^œüèoÐÍþòëÏßMaú%ÿÝ5ωc¶Ò”«8¶´+¯ß—[ï¶´+¯ß—_Ÿð½£>Ér<*¶O…YHðªÙ>ïÑ0T+dx«“çV’< UÉó¯V†ed¯­‘âjÊWVÈñ5êÑ1Ì®~°ß¬Çë úô©™¤a»XŽùÖ[µˆïmÂF#µŠï¬§kß[`q‘ˆïªkβõMcùÖ¸î8°j*MEX‚O•EIò¨ ¥()JJR€R” ¥(©öÔ Ÿm¥()J}µ>ÚŠJR€R” ²/E^ÑÃôkb–}©=ŸhQæÔ q…IRsŸXŠ †ÓoKe—¤7·JVóE-‚pTBAQÇ 'Ø vË.¯áï¤ïÚjT©Q´üËJmèšä‡aA 9.71ƒ‰sq+;•€Júž™ÑBœ'|îܽ§—ÒX¬EB\]•ýÕÒñÖê×zn8ý¢Ã|»´ë¶›5ÆàÛ?}TX«t#üJAÇüjôh²ï"ê¸rå?1Ûס×mìxPt¶V Jò6Œm$ M塞3´&ŸÓ©Õ Y¤Ø.]uôG}Hœ•¬)5µÞ0ê+lÑúóGÆÓeW¹Ð®¥k/ÆœÃüÖ™q%®nZk•ÎNy˜N3€€:Ó£I»J\9ýîø˜±}!ŒsS¦ô–äÚÖÚµkIkul»™ÉÕ¢µ’wîÒWñËZ[^mÏwV¬a'»ÐÉÀÿÚÚÀc½I».ÓÏpzâÙ!qŒµ<’Y¥¦÷‘œ›Ü¾¦&J:vïÙá(¢S½‰ÍŒ) (…œa$ Î:SLÞÞuk~ËyDHÍ·"kÌÀ[†÷œî1ëü=ê®{WécêËBfZíº•W˜ræ59Ýi@íAäly+A>`§;±žŠª¼=.ø£´:WÓÍAðàùÛ¯ì½øû9]¿LêK„w$ÀÓ÷il4÷!džâÒ‡z „€®òzxõÚ´ÒZSêYW˜-ï7"Ïre4ó.îOƒ “ÍW]¨8ÎÓì­æN²³\4÷žP[âÝ5á*#lB’Ê]Ts¹Â É Ü¼“’ €k>ó¬ô„Ž.k[«æM¯Qé·mñåÏ„²òÚiq<½þ-“”… (yä¡EY¹|WÉy‰ô–>JQ&®žY>váÅ$¿ñ~Ã’[ôÆ¥¸J“ž»K‘ÂÜ–˜„âÖÊÁ ¥` ¤‚ÁöUl¨ïÄ’ìYL:ĆV¦ÝiÄ­ *¨ Œk¯pæÿ¤lvGôõâÿfºÙ¹¥÷˜“o–ÛÝlã¸ÚNw¤ì=À{»ˆ³QÉ3PÜ¥ÄvSÑß–ë9)eo- Y ­GÅD“æs\*SŒ`šzžŽZµyÂpj*ÖvjþÚÚse})JàzDÔTÔPåPj|ª ¥)@H¨©ùTTùTP R”ÐÐÐÐ R””¥¥)@MEME¥)@)JP R””¥¥)@)JPií¡§¶€ŠR””¥úSÀ_À^†ý ßï.¼øýøÖ¢_ýÓ^œüèoÐÍþòëÏßMaú%ÿÝ5ωc¶Ò”«8¶´+¯ß—[ï¶´+¯ß—_Ÿð½£>Ér<*¶O…YHðªÙ>ïÑ0T+dx«“çV’< UÉó¯V†ed¯­‘âjÊWVÈñ5êÑ1Ì®~°ß¬Çë úô©™¤a»XŽùÖ[µµëKu¢/ ô}Ò¦ÕÚ¤%×TWÈp60•,¤nÎå`xŒ•éP¤çI?¯ñK÷<üN&4gN 7Ùnßg-uäŸ3Ÿ;X®øézS†3ïö;eÍONmWÖÌSÜ©-·µ[JßXPå#vFp¯q_ÌÎFÈë·ÙYŸ1ø“Šmé(·­€®våsr­»IP º}x:Î*Ytü¼>gS¦°1›¦çªmn{ÕïÃÁùXånú¦±üë©é®ȿڠ\£Ì¹˜—YnÇ·¸Í¥O%)Böd”¯ $Ÿï^0¯3^7ËB ðÔηAnïnÖ+¶®J#6—¶&:”¦ÔàKÉ=â|ð PÃMFòVV¹Æ]/‡u:nï2‹ákÝq\³9‘¨®Â»žíÃí_q•`´O¹ÚW Pݸ\ŠÖp¡iZƒÍ£')ÉqÆOA^V­%jÕ·KÄAèý/&Ée\÷ÓÓp‡'bŠ” ï9ek' . ¥G¡îÔ¬<š‹\çòà%ÒÔa:’k#³zqIÞɹ[Ò\7œÜùTVñoÑ–Kºã{‡©¤®Éj„Ë÷ÕlÚûO:ê›C)k™µdí ݼ +Ú«Xœ+aw”y:L°ÆŠ„ÁÞ™11“¸smy `nóëÐd°õåñE§ÒØX]JM[~’ððߪvßg}Ç2¥tùÜ)a¸Òœ‡©L‡S¦Æ¤ŒÚàòù±02w‹êpàqâ+šÄu Êiçc·%¶Ö•)— ‚ä¥E$+Ààƒì"©:R¦ý#¶G›¢ïo¿½*W^ÔZSMGÖMCn³3î.m ÜÜŽ§Þ!)m8u¢½û¹œÂ„ŒnZÎk´Ÿ U¬âÇ•k]Î$©è}ä2›+Æß¥K)dÊRÉꔌ+Ö’k¦ËS6U«ûù™Ma•5VwŒyµ¹ëtí{5g~ ž§2¥t–¢[ûžáÏ›3/5«D5ÎbfHŽcÝÒæ¢@R¼€ÈbÃ]pù¶õ¶²z}ƾէšˆ¹NÛ­›”òCl0 $䕸‚|ñMšVºðþÍþÄ®–¢ª8OK6¸»ÙÆ:YqrZo95+¿ËÓ6{¯t-º#Vˆæã¥Y•¸Y[TYO”<¥8ãS`e)$œŒu$m;¥ÀS©ä®swŸN®y¸ûÁÄr´³‚èNÃÑEÍ»$m dÚXY+ëÏáo™Î—MQšâîòðoñ9%ùz/äsºWL™Ãk6ëMá½QqzÑp·Hže¦ÐŒ2À-(v_qÆq¹IêrHæuÆ¥)SüFü62Ž)7IÞÞ qkŠZÝ0*}µ§Û\ÍDR” ¥( öÔTûj()JJR€R”   ¥( ò¨©ò¨ ¥( «eÂ}®sS­“dÁ–ÖyoÇuM¸Œ‚’È$57kÊí,̺Ü%Ï’@IzKÊud¹Dšê04ž›Ôœ2a»U¥õkvK%m>ê„ÖÛ’û§bÖ µ¤¯ºTN+Òá í pžÜˆvÆßÕ²õ‰}ÀqÖƒÁ´¤( îBT“מճTË£Ò×ÿiâ>—ªž”Zš–]ÊëÆ÷ü>? œ€TWR¾prãoe÷›-)‰qb§®ÕÄcá\å‡Yp¨óZ ÆU„ô ã²n|µ5»N¹}™lÙÝ™·&Ú¹1Ý@BÔ§Zu.¬/ªRƒµD­=Z’·#ªéÜWU9ð|ßM?aÉ)]íÃh¶ÝMl±È¸jŸ”$)öÜÓê/¶F[ShmÕ¥àâ²R¡·V{Já ×Ý–µÅ“!Ô|îO¤`ª#ñù=]æ4T¬a=á…‚*»5^_l¿ùÆɹèÓkG¹^ü9&ýšîh悞UЇ-“t‹7룓=rï­Ù!ÇrÚÞúÀPRÕÍVÄà’0}\ã'o¦¶áUÃNXn—T½pu»L”G–e[·7¨¤8ÂÊ5€Â|RqƒG†©kÛBWKàÜÔ3Ù·k4Öº.+›KÚsŠR•Àô‰¨©¨ 'Ê ÔùTJR€‘QR*( ò¨©ò¨ ¥(¡¡¡ ¥()JJR€šŠšŠJR€R” ¥()JJR€R” $ÓÛCOm¥()Jô§€¿€½ ú¿Þ]yñûð)¬?D¿û¦½8 ø Ðß¡›ýåן¿šÃôKÿºkŸÇm¥)V*pmhW_¿.·ßmhW_¿.¿?á{F}=’(äxUlŸ ²‘áU²|+ߢ`¨VÈð5W'έ$x«“ç^­ ÊÉ^5[#ÄÕ”¯­‘âkÕ¢c™\ýa¿YÖõéS3HÃv¶ :ÐHÓö«Ý1d™Ô…¦71R’ \!N(”<œ•(gØ<€+_v±ó¯FIBùx˜q8juò¹¯ÃªÕ«;[‡ƒkó6K޽ŸqC­Ýí‹›FkóXD†ÝÄg^÷68’RU×j· ­‰®opt­ãN0ˆbÑâû‡“µL¨Œ/”BPžéõz Uµç&,¦â5-ÈÏ";ÊRZuH!ãpIð$ndžG¶·Â½Vïs°X¥ Š×M.Zè¾.Ûø–õ„–4ô[ûM®ï«vf¡ÌÇRÈ+ -­9€JU‘Ÿ*ò•­eÈÐÎéÚ-)ˆíÀÜKí¶âMÀ†ÀÙÜÚ´,÷«_wÕ5çZcVvµü ËAÊùxߎþ~z¾oy²Xu|›>½é–­VÙ¯[;SÏs¹£–rÞÒ—FÕeCºrN¸`Thm_'IzW³Z­³ý) p$vÎwFë¡<·Ø=HÚ0G\Ô‹TÕX\¾%¶Œå&"ÖFô¸¤©iÞV§iÈ"°jÝdãgËqW…ÃÔS¯™úZñVý’ü¬^é}O6Áá ¸Ñ&ÛîM%©°å%E§‚U¹ìRT OPB…_Ãâå‹•ÆkÖ›<¾Ûjp˨y-Ç…Œ[q$Ó©%]:“ùTR5§dÅ\«rœnÞÿ‡É~I# Bâ­Ý¼Û%’V4ûzxóRøÌ4ç ìu=åde_û#nÞ¹çõbÅ’æô óS%«{-?$8âPâ[uIJ¢¤’´uH oI8Uu'9ÊÙ‰ÃPÃÒrêRá{{4öhïù›'»[ß½øÑL›`”dm<Ð ovq³p Æ3¸š¼³ñbûm™`œ›U–Lë NÇ KÍ;»“±HÚ —OEð^ÒzçP¸X¯vø,Οg¸ÄˆÿÞ_~2ÐÛž}Õƒÿ þ^²ÞXµ7vzÓ=»s§ Ë\e†V}dm?®®ªU‹Ñ½?mÇ á0UbÓI©7ù·£óâ_{¸_¸ÿržæ¬žŒôŸ¤öfVînqÜìíåüÙ-pîPdÂ’ŒnfCJmiÿ¨(â×±« ;&¯¿òæ_1­îПÓòìÌD´Í±FThÒc©n%JR•Ì)i$©ÇDß# !µvÌý÷<Í™Çw1ޏÝÞ­vãh»[bÕqµÎ‡j9‘]~:›CéÀ;H†“‘Ÿí¬éÖÔŽ—3lxZ‰K*zïüÛßÇVôzuÇ\9>ên¯é6f»)¥º¨«_jRVBÒµ”¤(Žð@FàHð&³â]ÁØP­‡OØM¦$‡$¦Ü¶ßu…¸¶”ÞO1Õ(m %!*H ŠÑ…E:ùó£°Í$ã»v¯ÙÏ–î\„ß5r"r¡[,íè„CËl²ñIp©ÂîIJpwôÆ)hâEÀËÒP’ͦÃÅ9k‹:U>U”¥45i¨,7+µsLVžYP,·1—\h§KˆBŠ›W_€|}‡Ê,WUG»7ñ·÷ÓÚVÒ½eçPêÛikK)Þê’’B¸''Ø2¤ŒŸ2yÕN·¥z>ËÌ,!ö–ÒŠR°•¤‚R¤…$õò ‚˜ Ð_çJ΃j6Ûp¸Æm¥Ç·!JËÈJЕ¬!*$)Cr’ H8Ü3ŒŠÆLwÕÉIaÓµ¥µºv%J )I>…<öŸa©³*§tží??¶:ŠšÎ±ÙçÞd¸ÄÚ%¦Ë®­é ²ÛhÈNå-Å%)RGR:<è“nÈNq‚Í'd`R²np%[g9 k\§›Á ()*•%@¤©$(( A¬j†­£&2RW[…+:Ãj|¼F´[[iÉ’—Ëa<†‚Ô|¹d''À õ$’@¬›;\ŒÑrË}~þLR”¨,)Y×[Tëcp\˜ÛIDø©—M¼‡Ú*Rs”‚…“…’ƒRÓ[ÊÆQ’¼]Ð¥)PXR” $ÓÛCOm¥()Jô§€¿€½ ú¿Þ]yñûð)¬?D¿û¦½8 ø Ðß¡›ýåן¿šÃôKÿºkŸÇm¥)V*pmhW_¿.·ßmhW_¿.¿?á{F}=’(äxUlŸ ²‘áU²|+ߢ`¨VÈð5W'έ$x«“ç^­ ÊÉ^5[#ÄÕ”¯­‘âkÕ¢c™\ýa¿YÖõéS3HÃv±ó¬·kß:Û„ŒGkrÕpµ<žX'Üm·.É\Û«Š¤´Ôu3 -(`%D+ üen9$šÓ]¬W| zg•5ÌÁ‰ êNœÓK+¾ëðkMU·ø˜Žú¦±üë!ßTÖ?hŽâìßô3W–8uyŸl°úOuîÜÓ|Ûjh«—)$””•eÖÓàH.§%5¶±¦mÖëÞ£·Ä³L\Øú‚C*Œ‹W7m,—]Ai Qæ'ÄÞOLñ3QZá]E$Öïù<Šý:µ%5RÙ¼<W×[Yùùö½;g.«Lĉ¤X“i¸j©¶îÐõ­§œTÌ É ) ‡”G){Uµ&µ‰ ¹éþÛß›¤¡½>çmvLëBCˆO- ‘¼¤b\/”¨’¤–”‘Ñ*MsÃåQG]5¢ûÓÃÀC£%')Ý^ûž¿‹÷ú[üØÆR5&§]úÇr¶ÛU¥m’gˆ6 ÙJ·BqÝ­„¥ %m?ž˜NÇ;Š qfÛw¶ëYˆ»ÙãZ‹‡|fâ˜S?Ф$%=1㑜äEjT¨©YN6·Þ¥°:Üî­kZܺÕò×þ5éږѯ!éÍAzÔv뫲ní4õÅé Ùa²ûe’K¥e!¢J¨NEÞ-ɽO©õ „<4´ÈÑBôwš[JAðR¢ÏpuNÃ0k”ÒŽ²åñöøx‘Ž•¬ä¸î´ywk£YUŸÂúZïäÞ§Ôú†BZd h‰!Gú;Í-¥ ø)HQg¸:§aÈ5—©Y®ë‹Ví–A H·_›”ð5ÊPe€J¹JBÆÖ¹iHP ëêšãÔ©Úº}ù}ó+þVïŸr¶æ´ÓÇW§¯{³Â‹3Nßm6MÎç:B¢9ËrXó)/s[ChqÍãqެ“´ôÂs[*9©³*Óèu_5KvèlJ„s˜¶Ã²T¤,4 âö¡QBT)è’+Ò¢5Ôx­ÑΣwŸ÷kue½5¦›•½¦ï­áÚv;W)7;\Ö­i-ÚÛoµ"#¥ÇO!JqÔ©¤žâñ…‘ÍVFG[û¼[“zŸSêxii%¢$…èï4¶”"4ƒà¥!Ežàê‡ `×)¥G\¯»ïïØYà$ÒN|ÝÎÏMnžš6ÛöWŠ6”¼þ§¼\ôÄ{+†Oiƒp-ך¸¸ããrP¥®$¥kXRŒ`޵¬hèÓ.:OPZ¬Í:ýÙ÷¢­,0 uøÉæóP”Žªï©…ŒôN|«Q>Ú‰URžk}ùG*t:¬÷³MoÒÖÓVÝ´çÄìL¢q±;iU«Ý í›l&§YÔµ•­AÙE+PiAÕ)¦”Ê ¡ýïW§^Ãqë4‰iÀ‡ Úá¡Ä ¤z ªC£•°’§9ƒ ÂÊ”ŽgSÒ¹•*î½ãk}ù}ûN4ú1¦u>7Üü/ºV¶šiàÛWO«êØúŽ-ƒV/TGm䩵 ÛKQnðL„Ú7Š@OÂÒQ´4ñÅ5l}GÁ«ª#¶‰rTÚ…í¥¨·x&BmŽÅ 'ái(Úøâ¹E(ëÞú|}¾$ãrúKG}ÖÝ—E®‹ÑݪÝd¬ŒësV•Ř«ŒÙÑä!І"%Ô:¬‹Qq;z€¿Ó¦ ö‚´jAçg²"j­Š,ȹöhêt€á¾êAR}x@ñ=ODå:§¶¢¸ÆI5to­JS‹Qz»Zêé[ÃOj»Ñù>íÿp^¨´"Û5@è¶]énÃCmPTáÌe­>90qïs‹r™¦ÓÐÐôRˆQ:;G|‡C²ŠšÀê¥%+‡” ‘Ëê;§¦•ׯ\¾þfò×d”––{¸¤—=ÚnøèvsSfU§Ðê¾j–íÐØ•:ç1m‡d©HXiAÅíB¢„¨R3Ñ$V­­áÚv;W)7;\Ö­i-ÚÛoµ"#¥ÇO!JqÔ©¤žâñ…‘ÍVFG]"•¬¤­bÔz9Òžu?9ø]´—å«]âÜ›ÔúŸPÈCÃKL-$(ÿGy¥´¡¤) ,÷Tì9²õ+"TûõÅ«öË …$[¯ÍËxå¨2À%\¥!ck\´¤(uõMqêU¶…®Ÿ~_|Îånñy÷+nkMÿ;—­ÑҪߧÅ=ÚÝ[ŠkM7+kä]kx­ºšL;u”%¥ùÎKŠm*q­ß±eHÏþÍlú¦ª•ÂM;p¹Úî’$ÉA·—ii¨ÊfYP8 Y ¼­Ç$“\ú•EQzZo4K 'Õ<ÚËWoFŸ/²NµÀ¹ðnà»$}[èx²"¿ªÂ‹[l˺¥¥ò JÉÞçõ`6œ+¦5ë]ªþ™h§¬ÍÛž•§zD30¼»ÃÔlÛÞIY %´”«jƒ×žùTUÝtí¡šŸGN K=ÓwÕ{7Ù«î½ßUž§W¸ÇÔroM²Gn$Á¦Ò™–µo [• ¾¼Ü«ºéNཪXÝäuŽ)ó>ÎÓÑ}óv´%ËhQ=€ó]ø.ñ+9…’¡ÌÁ=+O¬Ë4ïFÜ[˜aÚĶ·´°¤”FAð= ƒ‚ ‰URVûûøx¥•)¦¯¥­wí»ów~;ïºÂ TÄô2ãfÇ(´ÛËÚÛ¯ s‹(QÈî©À„ž£¡«›U­·¤[Õ¯lqmŒÕ&(·7rP#¼ ÊyiZyÉŽNÝÛÔ7c¨ç‚ðíáøÊTXÐØŠÀ4`®[-îRð7©J9RÔ¢I'*5YVU”^ëý¢’èú•"Þl­ßÚ®ÛÑÞÜlôw±½qV xÚ–«|Èw¼þÑhbØV€SË=§ä'pÆ3‚kc²Bzm«G8¹d“nP¾NM¹¦šD© —àH-©- ¼…-IêTF+‘ж¾ß ÖÛg‚m°b TS·.ïu%jp•ïZ†w­ÅwB}r<@F´Tœ­ùy ¸Ž•:JW³wvÜš|.·6­mÖO¼Ë-C´hx7í;n…m½Áe3n+¶%—¹hœ¿„mÀ‘…òyWR¤¸ ³”šþgÛï‚åÝô¥¾†žcÐ!‹[Ií/—ÐH?Ò›-•ž÷3%)ëÞÁæ4¨uïÃïïRË£ZwR[ï»Æúk¦ž‹ßuÈíZ®ßt‰'V?oÐJ­z¨Vä¦Ä•'’ñx””ìÛ¿£mÝœs“·“X—=.å½ýIé>mºÛ­¢¶Àv8g1Ö_£!@¶¤˜½T­£˜…tÝ“ÈE<ªÏ›½¾õðöyaÑU ¬ªràøeÿ»ÁûÏóíNYa‹Ó ¹ÛbR¡ÉU¾/¹ÖZ˜·BÙ. q->…8P¬å*ÈVКÀ¹Z’Ô‹‚¬tÊÔ‰®»; XJ”÷9ÔÂJœJ„Ç$dnR‚R5ÈéGˆ‹ÿoÄG¢ªG}KþZo½·îð7~+¢m·]D”ì£/ÑvÇ™mL‡PLFSÝ .6…'®àvsÖ·meÿ#Qêk›:zÝ2äåÍÃddÚã©r!—\.HKAz°Ö•ä-dBˆâuU_Y;o×yÖ]Ü)¬ÊðV½·­;¥…¹¸(!g* ^8a¡«¬F²|ü}§t]áJ)¯A[ðïÕ=5ÓwŽó¬_´ÍÉŸvaZMqÓîrÛrP­½™õ**-¹hu– R@ÂîtÃ⭴ǰ¢Rl±m,©m†om—’’…œ4ûJ)–ÏA—U•gg^§<Ε­šKÍøx“K£ªBQ“íá¿H®o—ÆÜïÐôËWíWé‹kíÌ™qƒÛ¤Ú’O)M3°¥Ý •…—ÊI ¶ SW׫%Ê-Úèä=+êÛí/3v†ñË\QÚÝn1FÂCÉ 8Gt•øqÈjÖÅwjØÜ†Ÿ²Ú´”LmyANpR¶Ô…§Ö9X=2&5–ç÷¥¹«ÑóW”Ýß ÷’•·ðJÏŸÓ¦GŸå«Þ·éè\»~’¶•³Þ…ÇmkT'ÖV’—yËÊ÷d ç)OL«¥³QŵެÖ3‰rܳO\Gììa°ì»C˜um´=ÝÝÑ-’  r¬ñûÕÊMÞæíÂ^Îk) m;P„¥!)BG’RÀ+ ¬ñ*ú/·ÃÇàr‡DÏ*Í%{.Õeñ×X¿?=ß…V•Mvç9¸âc‘šCiŽÝ¡7'ÁY'šˆêZP ‚ •7Ž™ Ñ6Kݪñ¬ÚÓ:mÙMJÓöél!v&ß-×b©[[)q ÚÄ•$(ñZФ+(Å+kÎþÓ¾#£ªVªçYÛG­_5}ßw#˼ݹݭq c‚m.F±ÄqrfvVІþ´ÿÁ• ¡#“€ý½PÕ©åAÒ¢Kì1åÉLÛ äÊÐù(Sæ)M’ •©IÚ8í*ÏŸ }§ôD£d¦¬­¦^Mxñ¶¾:›— ÖýçŒö Q­í6·ï¬É1¡2Cl¤<PBv¡ ÿrSýÕ³pêÉ2cºA§,rÝ©ŸƒwKöæ‰m…˜À"@Rzõ2’¼z$‚ž•Ju”w¯½>FœNU[Ë+h–ëð’æ¸Kàv d¹ú3FÀŸ£Zu3u«dÇdY’]ì㑽%eIí'y;“ÊX( kE®ñ ËoMŸJ@¹Ó}(_g}-%§V¼*:Cilä)³•+¯NœÞ•=zÓO³ÃÃâsÿ.ÛεwÜùÉ÷¿îóI†Õe¼N°é›2ô«’™•¤î2ê­¥ooC³d¶æÝÉï-‚6‘»œ€s¹5Ç©J¥JŠii»þ X\,¨JMÊùµÝmnß7Í/ËÉJR¹)JM=´4öÐJR€R” ?Jx ø Ðß¡›ýåן¿šÃôKÿºkÓ€¿€½ ú¿Þ]yñûð)¬?D¿û¦¹ñ,vÚR•b§öÖ…uûòë}öÖ…uûòëóþ´gÑ£Ù"ŽG…VÉð«)['½ú& …lUr|êÒGª¹>uêÐ0̬•ãU²U”¥¥)@)JP R””¥>ÚSí "”¥¥)@O¶¢§ÛQ@)JP R””¥ ¥¥)@O•EO•E¥)@O²¢§ÙQ@H¨©”¥"žTò "”¥55ùTŸ*ƒ@)JP**EE>U>U”¥4444”¥¥)@)JPQSQ@)JP R””¥¥)@)JP R”š{hií "”¥¥)@~”ðð¡¿C7û˯>?~5‡è—ÿt×§zô3¼ºóã÷àSX~‰÷MsâXí´¥*ÅNí­ ë÷åÖûí­ ë÷å×çü/hÏ£G²E ­“áVR<*¶O…{ôL ÙªäùÕ¤Ur|ëÕ a™Y+Æ«dxš²•ãU²U€R” $TTŠŠ|ª*|ª()Jhhhh)JJR€R” &¢¦¢€R” ¥()JJR€R” ¥( 4öÐÓÛ@E)JJR€ý)à/à/C~†o÷—^|~ü kÑ/þé¯Nþô7èfÿyuçÇïÀ¦°ýÿîšçıÛiJUŠœÛZ×ïË­÷ÛZ×ïË¯Ïø^ÑŸFdŠ9['¬¤xUlŸ ÷è˜*²< UÉó«Iªäù׫@Ã2²WVÈñ5e+Æ«dxšõh˜æW?XoÖcõ†ýzTÌÒ0ݬG|ë-ÚÄwζÀá#ÚÅwÀÖSµŠï­°8ÈÄwÕ5çYú¦±üë\wX5&¢¬A'Ê¢¤ùTP R””¥¥)@)JP R”TûjO¶€ŠR””¥>ÚŠŸmE¥)@)JP R”‚””¥>U>U”¥>ÊŠŸeE"¢¤TP R”ŠyPSÊ€ŠR”ÔTÔPåPj|ª ¥)@H¨©ùTTùTP R”ÐÐÐÐ R””¥¥)@MEME¥)@)JP R””¥¥)@)JPií¡§¶€ŠR””¥úSÀ_À^†ý ßï.¼øýøÖ¢_ýÓ^œüèoÐÍþòëÏßMaú%ÿÝ5ωc¶Ò”«8¶´+¯ß—[ï¶´+¯ß—_Ÿð½£>Ér<*¶O…YHðªÙ>ïÑ0T+dx«“çV’< UÉó¯V†ed¯­‘âjÊWVÈñ5êÑ1Ì®~°ß¬Çë úô©™¤a»XŽùÖ[µˆïmÂF#µŠï¬§kß[`q‘ˆïªkβõMcùÖ¸î8°j*MEX‚O•EIò¨ ¥()JJR€R” ¥(©öÔ Ÿm¥()J}µ>ÚŠJR€R” ¥((()J|ª*|ª()J}•>ÊŠEEH¨ ¥( ò §•¥( ¨©¨ 'Ê ÔùTJR€‘QR*( ò¨©ò¨ ¥(¡¡¡ ¥()JJR€šŠšŠJR€R” ¥()JJR€R” $ÓÛCOm¥()Jô§€¿€½ ú¿Þ]yñûð)¬?D¿û¦½8 ø Ðß¡›ýåן¿šÃôKÿºkŸÇm¥)V*pmhW_¿.·ßmhW_¿.¿?á{F}=’(äxUlŸ ²‘áU²|+ߢ`¨VÈð5W'έ$x«“ç^­ ÊÉ^5[#ÄÕ”¯­‘âkÕ¢c™\ýa¿YÖõéS3HÃv±ó¬·kß:Û„ŒGkßYNÖ+¾¶Àã#ßTÖ?d;êšÇó­qÜq`ÔTšŠ±Ÿ*Š“åQ@)JP R””¥¥)@)JPSí¨>Ú)JP R”ûj*}µ”¥¥)@)JP PP WÕü ûœx®8CaÕ÷Û®§f}Ç´s…!„´ž\‡ iDt@ó=s[¯ý8Oý·­¿ÍEþEбðç•E}ÉÿDžmëoóQOú$pŸûo[š‹ü ]cáºWÜŸôIá?öÞ¶ÿ5øÿ¢O ÿ¶õ·ù¨¿À¥Ð±ðç²¢¾äÿ¢O ?¶õ·ù¨¿À§ý8Oý·­¿ÍEþ.…‡E}ÉÿDžmëoóQ\Óî‹àg¸s ]»Øçj©WE)!2LrÂSÌBVTÐQ8_@ö“ÓtE™©JT‚E<¨)å@E)Jj*j( ò¨5>U€R” $TTŠŠ|ª*|ª()Jhhhh)JJR€R” &¢¦¢€R” ¥()JJR€R” ¥( 4öÐÓÛ@E)JJR€ý)à/à/C~†o÷—^|~ü kÑ/þé¯Nþô7èfÿyuçÇïÀ¦°ýÿîšçıÛiJUŠœÛZ×ïË­÷ÛZ×ïË¯Ïø^ÑŸFdŠ9['¬¤xUlŸ ÷è˜*²< UÉó«Iªäù׫@Ã2²WVÈñ5e+Æ«dxšõh˜æW?XoÖcõ†ýzTÌÒ0ݬG|ë-ÚÄwζÀá#ÚÅwÀÖSµŠï­°8ÈÄwÕ5çYú¦±üë\wX5&¢¬A'Ê¢¤ùTP R””¥¥)@)JP R”TûjO¶€ŠR””¥>ÚŠŸmE¥)@)JP R”‚”è‡Üÿá§FÿñßúÇ«gâmæNŸÒȺEqÖÔ‹¹§ QËëSNMa·R”©J*mkH ]{½qZÇÜÿá§FÿñßúÇ«}Ԉ׸ C”·PÛs#K¢ÞÃí¾Ô…M¤î'µÍï$Ôæk¦fê)k´¢÷3®nµ,M±JЇL)N…¾ÒSžcm« ;ŽÓ庵è:TÎÓZRásºßà@§!Lzãf´"cLq$4ï-lPÚØrº WMºÚ#\§Ú&>·Råªb¥°@ YaÖVAÈÚòLu®2 +±Z-6Ë>©Ô6¦­–ömí˜î0¾km'jJÒëKFüx©)I?àkú•ûÓº>Ó~³qâ´½:"ì8pÃO¡ùí°¥”¸ÊÔ—B)8PHRØ:¦¬ÜoPIÔcHÅÕ·o·76]ÉQâª\•>ëÉmr¹)JC+ÎÉÊ:ƒ’n¤-hÓ1tú–#GœÌþap)×_nRe-Dïu9WAëc¦?½E¦ZºÜXºFºÜ¬×&Z, pÞõ´NJ—´(g¨ÊI8#'"Mÿª/ÑcB´L¾\¢¿T*Ó6áh¶&D‰,ú9Ém”³Êw½Õ½¨8Ú²6[&¬½µ§ª$ÝeM°Û.î±)Ùpć ìJTû­„$¶¶^ß‘µm %9"·(6Õ 6ž[Óí¶àåËœã¡nIã.²µºHïe/+ Æ6¤ $m©ºi m§ˆãòÚcRÆ,MCKH %’ÊœFRp² “‘ÜOOˆ=´C·‰vÜ/jZ$Mqr[Œ¤%&#*9m“ÕIFÝÄäî*ëŒÇ~íßÁª?ãÿõ˜®ý\îÝü£þ?ÿYŠ-àø‚”¥t ‘O* yPJR€šŠšŠ|ª O•A ¥( "¢€Ÿ*ŠŸ*ŠJR€JR€R” ¥( ¨©¨ ¥()JJR€R” ¥()JM=´4öÐJR€R” ?Jx ø Ðß¡›ýåן¿šÃôKÿºkÓ€¿€½ ú¿Þ]yñûð)¬?D¿û¦¹ñ,vÚR•b§öÖ…uûòë}öÖ…uûòëóþ´gÑ£Ù"ŽG…VÉð«)['½ú& …lUr|êÒGª¹>uêÐ0̬•ãU²U”¥¥)@)JP R””¥>ÚSí "”¥¥)@O¶¢§ÛQ@)JP R””¥ ¥·[ø“­­ö u†%ñmÛ-©q1#–RZ qN/I$•(’O_à×¾n·þÛÿéYû§Ò€Ü=óu¿ößÿJÏØ§¾n·þÛÿéYû¨yTP‡¾n·þÛÿéYû÷ÍÖÿÛý+?b´úP¾n·þÛÿéYûùºßûoÿ¥gìV¡ì¨ 7ÄÝoý·ÿÒ³ö+õ®µUæÚí¶åtçÅ{o1¾ÎÒs…©H> V¸*()JE<¨)å@E)Jj*j( ò¨5>U€R” $TTŠŠ|ª*|ª()Jhhhh)JJR€R” &¢¦¢€R” ¥()JJR€R” ¥( 4öÐÓÛ@E)JJR€ý)à/à/C~†o÷—^|~ü kÑ/þé¯Nþô7èfÿyuçÇïÀ¦°ýÿîšçıÛiJUŠœÛZ×ïË­÷ÛZ×ïË¯Ïø^ÑŸFdŠ9['¬¤xUlŸ ÷è˜*²< UÉó«Iªäù׫@Ã2²WVÈñ5e+Æ«dxšõh˜æW?XoÖcõ†ýzTÌÒ0ݬG|ë-ÚÄwζÀá#ÚÅwÀÖSµŠï­°8ÈÄwÕ5çYú¦¿«MÁû]ũћˆã­gjeDjKg ƒ–ÝJ®‡ÌÔZã¸âÌSQ_Pñ_KigÃ=U;KéëMªý¢¯Ó–Õ¾l¢¡Õ€H@Ãa*Éómxñ¬_¹Jé©Gê[²ï6éjvæ„NЇ„hí¼ÛM p­ÒöPÙðUS­Yn,|Ò|ª+f¶Ù5>¼¹Í›m´°ò™l;-ÈñØ…:ÀR¶„2л$Ôä׎¤Ñº“O[£\®vô‹|¥164†¤ÇqCÅ!Ö”¤g¡éœô5Òëq¿Jß.!×öömÏ͵Ab5Ì JîðÃä®sv  R3ÞÆpkYÕšnù¥/NÙµ µë|ö€Ršs¡ð ‚Bö‚E“ÜÁSJÜ8.òQÅ9 Øvù‘®8°ä³6 2P¶œ}°°êTHé¹8PÉÁ5ºýÐÖ7®\~—¡t½¢É ¶œa«tXÑ¢Á [±šYJœÂ7’¬í Qê­©ê¬r³°8Õ+pc†zÕízþ„E¥¡¨Øl8¸K‚„¹ÝQXJÎÅmI'8îœ4× õ®¤Ôwm;f´µ&íhqMÍŠgGmm”¬¡XÞ±¼ ' e9=á™Ì¹ƒO¥m²xq¬£éù—åZì'lÕ1-——ûm +l0¤ŒyÖ¥DÓÜ+¼è ½²&ŽÒV˜v¾È63¼ÕêKrÞ”äƒ2BR…-´°5ŽaOCiÆw¨\C¹±Ó¶½=<oƒl`5! )¤‚Fìç©'ê¥w`j"§Û]7îgÐÖýÅö«ºTå¶$uÍ”ÒTR]J R‘Ô¥§8ëŒøxÖÏÂÎ/\õV—a²AZ-ŽÎ³½ÞÔg"¸‡”¤©° ‰<À0¨ôñ­Ò ¥w. éËmšÎùg±E¿kxRD8¯ÃLÂÛMåheaIRˆ/x¤úƒþ8Ÿtî°Ø[ѮöE´j öt?|ƒ°Ûm;µ¼Xè‚T]õGJgY¬MŽ1JÝei«ç ï–«†¸Ñ¼èò£ºôhrÝÃožY *($÷¤( àœqœ×WàU•½mbÔxƒ£ìñt›v×ybÐÌ´ê·ài æóÝPñÁJi+|éí¨®¿ÂÍ/l‹ÁgÄû„·VÇ[ƒmbSaÆ[ujl)Å ÷V@y8 xä/[žŸ·êß¹ÎGEº Ý–ïØ¥® dGjK*åí*i°òz¤€ç4ή7Jدš'UY4ųS]lÏÅ´]1Øä¨¤¥Ìà9N@$n df» (ZVï÷$ë A HÚ­ò Ýš‹Ih=- ó"Tú†â£Ì^víN@éRæ>|¥YéÉöûdåËŸhjêPÙìì¼â’Ðw# p'ªÒîîFN2H»÷hXì¶(ÛaØ­ûTeÙuLÂŒ†P¥—ßE)€¸QÊÒ°8})]»‹Vk_mÚN[ìöÉÚ’lιÜ.1/aRŠCM6àSiH)_R’NZ9YØF‚·k¦±´Ü´¬`昴DÕîm>Ôø–ö›aøá ÜÛ¬‚QßË8Ù‚2þ×jâ½–ö׸ovМ?µL›t´ 7‡`é’·8¦c©*Pä(#%Nõöt‡;4™'Ëô¯¢øQ§-ú›‹VÍÄ{š<ûl7.Jn,`ö¢û\j+­4Ód© \Q'%Iði5e“WiÆï‰â íÂÔä) Ä™i´0Ú!>P®CÖ6å{r$ã= èc¬W°±Ä<ª+¹p ÷Tñ‡Lé™:gMªÆ¸A‡£?c†ãޏ̹Å:Zæ§[.uV{ØëZÏu#1µV»ÒîXl)†‰Ò!ÛLK4HÎC-LIJƒ´?ÚÛÁW]ù9©Ìïks:UŽ—~×RÚäß"¹.ÔÔÆW9†ýwX Ä£©N@ê<|Ev>\­¼Aâ Ò·¦Õa¸5 †£[eØIJ¤”¾€'!)Ê”}j™K*¸8g²¢»w x§ÞÔÜG»Lm{FŠ-ØŒºrÜ¥ »ÊRñÉÚÉ$xG—Cç¤,ð¸•Âss›jµC½é†ÛU¾ QÚ)qKihi)J†Ö•‚FàO•Cš&ÇÚµ}ž xE¡®p­V©—½NÛ“¥J¸Aj^Æ‚[RBJ’‘µÔ丑ãåW·„¶‹×8j»;×nÖЙ&3« KIuþ^s´(`uÿwJޱ >Ò¾†ÔV+Ä!]mV>i‹¦š´º¶ÕgGeUÅøèî—Jòe¤«Ö :Ž„xüôA‚0Gˆ«FYˆžTò«)_HpÊׯ¹sPÞíºFÉvÕû›píÎ7¦âÈ‘ÊOeÈÛÊ<õn¥+©$ôÍj°mÚµÕ[-ËCZ’5à Cg…eš•0ôWœZ,·÷ÆÔ¦R7ÊZ‡ˆ\ó“cTWÐ?ÓvxuÒt›ºE˜vwƒ¨U¢ì†'ÑØËÉʉq îJT THi>°<ëWi;²Ã¥,ÅîÏwË Cl2‡Ö:ø%´$`dà‚¥M6A¢ùTØ5&Ôz~Ûçr‚ߣ䬶ÌȲš•k)æ´¥#wCÓ9è}•jï õãMÄ/XƒOÍk“L·ÑíDr¾j¼<“V̹ƒJ¥mÖnë Æ‘¬-Öø¯Xâ…™MÊ29[$x½ôÔ‚–•°jM©4õº5ÊçoH·ÊQCcHjLw?~5‡è—ÿt×§zô3¼ºóã÷àSX~‰÷MsâXí´¥*ÅNí­ ë÷åÖûí­ ë÷å×çü/hÏ£G²E ­“áVR<*¶O…{ôL ÙªäùÕ¤Ur|ëÕ a™Y+Æ«dxš²•ãU²û[ÚnÌd«°rv);·6r ÊÂG€ÎH‰ÀÛ­ŽÍ÷NqýtÔz~%®GkäKrí6÷>Rob·÷ò„’vçiè­¤_/Ò«Õikø Ÿ@ýÏOAµðï‹«½úÁuÒ  BnMæ*;CéjBNÒ\ÁNçQ‡3°ç¢Ž>~¥*ê6mt´-®|Û4‹.¯°·m“3“Ÿue‡a>PžzKk)Z‚W¿nÄ«#IëV¿u.¶²ë®)*å`_:HMÂD¥!ò•-E`¸Êð3ã¶¹U)—[°tï¹›\ÛôXºÝÔ¦í²ã.§R’¢ÒVR ¼¤!9Ç\gǶŽζp†éªµDëõ’r×lv˜¤¹-Ÿ•%E-’[HØ æž¾ô®*}µ “s¸[.ö{÷ÜÃCÙoÛV¡‹v2gÇ™1¸bsD¹‚p¥ ÀS} ¿«ÿ øñzÿc Ñ:)Ë´+Ψ¶<ã²dExHDvT\Ã<Ôå*è¦ÆHø?ðÏ¥2jAôQ¤õ§Ñ–ûŸ¿@]®B˜ñl¦ܬ²UÊG@·‚X ê¯1>禇u÷º=C­4ìÞL–¢ÞY”¹  „¤2Ê”³…«¼{µÂ©Q“L·&çsÓÓO^ôtoŲ7}¹ªédík 2> ä)gºÙÚÒ$„øõ3ƒsÔý%÷9ÈáиÀŸ{½]ûl´A’‰ Fe<½¡N¶J Š™OD“Мâ¸ß¶¢§";'&ÛžàF†‰ß%5·›dQhˆ_sÑ) ÁŽaVB²œ•³éX‘á}Êú³DÊÔ:Q»ýÂîܘ±=ÑÁ<ÆÂ¢’­á탣KèH=?¼gçJTdÒÂå­ºÁ:}ÞM­‡íH‘võ¿uŒÃ'j‚NÇœp6¾§¦ÕŽ£ f»_Ý’ä K­bj]?}Ó÷Kl[C1\[ÌWsÝ;CAÎbº8“”¤€ >G?Ò¬ãv™»oïÞ0Ûôö¤·^-pµ8 t·Üf7qJŠƒ­8éKjI*_MÀŒŽ•Ä©G»ƒsÔzoNÛ,ö{lKë-W2Ií}žkFߣ„¡âJÉ9R÷ìHñö×Xã¼Hú›‡\1´Øõ”—6Çh1®-û£‚ŽCœ˜ÉÛ•<º¶±”’:x¯(*uNàêQ4´yn"f©×ÖkuõPVͬƹGu¶—Œv:–Ñu ¤B‰VH=;„D¼éKeõÁ_D+LÚ$ÙxsÄîÛ-®TëÌ­DŸHJOšµ,7ŸÅA' Ê|ÓJ‰FüAÛøU¨ôÆ‘ÔüHЋ»¶‹ú<»d £®Ê ­°µ­*K„ï =<´…â xC®m“n¶©—½NÛpbÅ·Îj^Æ‚\JÝZÚR’‘µÕ`¸‘áç\[ÙQG “sµêûÄ.%ð‡C[!]mPïza· Ê‹pœÔMí¶”:…º¤¥CkIÈp'Ãίu¬v^#ðÍ»lrµè»z!J”À%.©l¥—‹yÆà‘ƒÓ'>]kçQQÕ¡sè½"Ëeû£.\L¬lM*LÙ­º‹‹k}ä<…„4#ƒÎ ÇBêÿ…pcryÕ×›ÄF xó§¿%¦ˆÇ- qJ éì ª¥Z1³¹`á×t^™ÑÐlwnéýC673™q”Yæ?¹Å,gs =РŸXôHðð®AåAO*•µ@úD· r^¦ÒnßôÓ7»µÍ©á»~†ÚÖÖb+*Üè8myJÈPÛ‚3\Äw'ξÑeÜ"FµÛoíÜJ¥<Ó ³Þd¼²âÈñDtt'©H V“Jª…¯â¨=+cÿ¦çº¿tzÐ]Ÿ´vÿKGäíì=Ÿ·ã3¦Ï[ìmëX:Vé{78½hºÜ,å:¡R½5ÉAÈN…©å% y•wR´¼’HRHÚA)P¯›ª*½R&çhÔÚ€[x)tÒ/{ˆ¶¢]ŧã[,Ò¸ºµ‚’·‹ý©Ô26¡)ÚwdôOS]‚½Ñº–øÁ×LhɬAoú.«xj4¢• ¦>á%•î넞ê‰Å|qåPhé&.wß¹³SX ñCPh=둤5Jß…/ä2°É9ð+A)>yR}•[ç@ñšÉ§,÷ø1¢éW%¥Så´¥0üÇ_3˜r¬7põB7uÇ^s¦5j¬Ùm=c—24³2$ù,¸dGs Æ V”­  (%iRA$ã©­u÷]û¾âœuÅ­j9*Q9$ŸmNMX>£×Z‹†ú‡®å³éí9©$ÇPèkã2ݸ¼O1%ÁõO1(QƒíñÖ¨ìÛ>ªû”´Æƒ¨,‘o6«ÒÞ—}Á¨ÊKERNñÌPÞ0òw'Ç‘Šà¢¢Š¸‹ŸCÛ5’¸ð ½nsN]n6[Û¯!›ä§-ÍOd­Ý¡Aæ€^×6)ÀBvšÅ¼jv¯GáDI·}&…XŽe¢Áa·[PmRÞ}ix¥¶‰È#©Ú É®åQN¬\ûIê 9î²ÖªN¬ÓmØåÙj4Ãz±Å‘;GÂg °îF:`€´îçZeØ0¾äi¦fß´úor.æKý3NºÛNFÞ¤€áÝžK¥ uX§pRsóõ*/_sèþk‹t~Ytîݤ5M¥.ºã±.w ½mYyθv¼ U¼)PÞ¤ùuç?t‚´Rø”â´$Ó2Ú!²‡V[­¥Ô‚©D’„¡-€ÀÆscCVP´®.n¼ ‚©Û„“6Õ¦íÅS®qâîqø2i)­;²µ$2U€s[o¸ t,ùº/W¶ÕÓHNqqæ°™ °¢v©ÆÊIJÐ|ö’;ÉÉñã´©qRÞAô }}¦¸s÷NɺÚ$¢ã¥“n‰kçEx?ý1#¤)*¼R¦“Ÿ>ê‡së¿⻨Ÿ6]a¥°¸ñSž»²ÒÑ9ØQâ_ ×?¥B…·ªýÐÚæÍª$éÝ;¦\rEL[“4§Pd+j¥„ž¡8mg¯C[†¶nþä½3¤Ú¿é§¯v››³&Cjý Å¡¬ËVSµÒpâ0”£»f¾z¥2h’àI5Ù¸U¨lr¸­8tõʪùr’ܸoLt2Ô„¥MÑu]ÔŸ‚V7;ÿã\f¢¦Qº í“oV}-÷2ÏÐ3®vÛ– ºÝĶ؃)‘ ´–»Êq²¤dò”0Oük´BÕ5§†¶[ÌÍ/päØ\µO˜Õþ(vÒâ£2•C¾ 帒´õ'¼¾+¥QÒL››‡4¿IjgcYµ¦ÿhyjT9P§²ú¶ w\JJ2HX$x4úRº-”¥H¥()JJR€“Om =´R” ¥(Òžþô7èfÿyuçÇïÀ¦°ýÿîšôà/à/C~†o÷—^|~ü kÑ/þé®|K¶”¥X©À=µ¡]~üºß}µ¡]~üºüÿ…íôhöH£‘áU²|*ÊG…VÉð¯~‰‚¡[#ÀÕ\Ÿ:´‘àj®Oz´ 3+%xÕlVR¼j¶G‰¯V‰Žesõ†ýf?Xo×¥LÍ# ÚÄwβݬG|ël1¬W| e;X®øÛŒŒG}SXþuïªkÎ4wåIDx¬8ûÎ(% ¶‚¥(ŸêMjM%vqg™¨¯@Ó¥%A¥ŸzT½C-4ë¬:Ûo'sKR NHÊO˜È#§˜5lÈYžgÊ¢¤ùTT)JP R””¥¥)@)JPSí¨>Ú)JP R”ûj*}µ”¥¥)@)JP PP R”ùTTùTP R”û**}•ŠŠ‘Q@)JP)åAO*)JPQSQ@O•A©ò¨4”¥"¢¤TPåQSåQ@)JPCCC@)JP R””¥55”¥¥)@)JP R””¥¥)@I§¶†žÚ)JP R”éOzô3¼ºóã÷àSX~‰÷Mzpð¡¿C7û˯>?~5‡è—ÿt×>%ŽÛJR¬TàÚЮ¿~]o¾ÚЮ¿~]~ÂöŒú4{$QÈðªÙ>e#«døW¿DÁP­‘àj®OZHð5W'νZ•’¼j¶G‰«)^5[#Ä׫DÇ2¹úÃ~³¬7ëÒ¦f‘†íb;çYnÖ#¾u¶ ŽÖ+¾²¬W| mÆF#¾©«þÞ _Ýk›òëª}SW<=‘.¥I}¶£>†”âÂQÌSj '¦Ò¢ÝÝÆsÓ4Æ&ðÕäÿ±Z}¢öŸJð¹Þ EÄŒ°ú/î@<Îò‡{ÛÐ×ʾt½ïskÇ€»Ìü63[ϯ¼=…Ãi¶ûÝÚïâï;˜Ã¸”¬‘°$ì9õ¼óž˜®}z“z"ÍHmRQ&BùhX;Z;BJ€èH_{>[kùž‰ÁÔ£¯9f´ª_Ueº{õZÚþÃÛéD*a¨Å[Hðwå¿‘®*ʹ[¦[»7mg’dÇL–’T -«;T@9N@È‚Øè»Kkâ=KnÙµK¸8ž…,7Õ@üJè„ÿí-#κ€ºémjíŹ—&"U¿.òÛŽ§‡e)OQÝl*;˜Î6F9îæ¿±r±üùÈi]ÒÁª­ÓnJ—ñÙffú±v‹"J\»3l²ÔvBA{ ¶òv$¹i8óM³X]t÷ m0ì7®Ç)wÉïJi•§˜¦ù‚Óâ[Q §º­¤vô…&øQ¿ÚdÙg5RÚ[ŽD,É#cì6òP:„¸¼:Õ}u>#Þ­rôœhv ±™‹u¥7J•;lé@B‡â´´©+kÄ/¼sŒ7Ë*bîrîš¹¥6T4ÚdK¼£™!J{iYBIN07«$àg #9ÇAênÞÜ4E„êÖÚÝ.5rŒ¶ZJ6…—K…¶ö•$µ nO´VÝá·Òú‘ã[æéÑ :ägÜ„AT2#ª@x«Ì%a^`Õ­¹û[@1v^Žrÿ&Û-—âF“‹tÆù±•§ÝŽRÒ _s)R[hj®L“@—ÃÍ_ ‰ÏZ‘Ù™mNóQ1•¥ä%;–¶JVyÉJz¨·¸$xâµJïõu®5êÕ¥_zÖÕ½ËZÚ~,i­9ª0Ì…ó¾ -ÎiF]P_1)År~!³c=»d¶eEËjJÚå%E´•6 IKjQR7 «n@Á©Œ›ÞA¯ÒºÆšU½ë%Šì»Ý¡†íÚJõm}‡¦¶‡Ì‡pShKdî;„†ð 0NSØuÙøF–%^Šƒ¨¢^Zy‰+JºO1‡@ ZÈ RT:…Ó6 ä­SdÐÖ뻲¢±|ç¡!k*ËJi,)kX =ÜHG†OEtðÏ`ÖÚJɹXÖãmHÓÍê’c¥ËÛ3 ôîæ2ÜVÙJã §fä8¢w cvTªÖ¸Ÿ&ïuÒúnÙrÔuðÞ.8¦¢RÃn&d‚}b•m@mé´¤›°9íþ×.Éz™hœ”¦L7”Ë›¹$ƒŒ¤ù¤øƒæ5ýG´É{NM¾¥mÐåLjâI;ÊÞCËIÀ /=|ÓÐõÅÏ\iZÞS º‡Œ&"ÁuÄ¥ÇcÇm—˜+mG>y¬í©§iÎß—g»›}ÑÛŵM x¶–¦ï)óÚ GL,ÑX3wkƒH¥} £%i†5íñ^èa³dXImø­]âÂŒ¨*q! p) T¶T €m$%%YNíÕ©i«²á3¶ÉWvm‘X,òÒ ‡‰Z܈+ISËQ!)u¢JAAü 9?¶¢§Û]Jñ­Ôun›µOº‰zEˆV4φÙKŒ©-ÆŠ§²‘\ JÐO¬0QœdU› å”®Û~ºÂ¸ëM2™—f£<Êç/ÒNj—JØ,¶ ¡¸éÞ+¶\*Â6¦¿«õÎØuLi6ÛÜFµúYM3p“xfZÙ¸ «›-)B9¦:Jáw‹5ÏàIÈ´É{NM¾¥mÐåLjâI;ÊÞCËIÀ /=|ÓÐõÅ}tÆuUþÁ§u;ÉÕ +Q½xµ)R¢ÌCŽ:”G™½Iq'¿‚[JÖ’A*Á$+®çf¾é‹}óT7mT7Yªs϶Ýý‹|i–â@i ÞÓ¥žŽ÷9ï² NMp â L›Ôç!Å[Hq¸’e’á la…¼±Ð¥-¨ï#$µ_]C]ÒÆ‰ŽÌmElƒlF¼±s€ôÆÛrDç•ÊPhËQB˜JVÆÕ' «ŽT§v »F˜ºÜ¯:vÖ”4Ú…ÆÑoq×;Š ¨áJÛ’BÁéžîpA¤Ú-º²ív¹ð¢çzÖj™oƒrŒ.mμ…)© ¸>°ó-{°R4 a;‡…aiUáîBåªîMÌ™ãvdd!GA‹²u)Pi´¾µ”’”áX$ŠŒÌ“’U‹K´‹kWÐ^~3®>ÚÐÞrËiqܤw€J•Œg¯C—ŒSÛ¸j.a*’Ü7%å^Z¹ºúÃŽ·d4„!KØPž™î¥9$ä “ƒzºÍ¦4ŒÙ7rSWXìµd.<¢R€ñÇ)‚Ù#Ú<È©rv¹‡Gê92§EbاlYIKˆø8¥´8=ð8ƒ´wºã ‹v„Ô× TK”8°nkKz+’Œ$¾„­hQDrç5]æÖ:'®ÓŒ×Xný¢¬Æû*F¢[°ß»Ä·4«{MJ2 Fd!À¿…FÖÜ o ½C€pqIPiÝ=sÑV·Ø²Ívßøæú̇zÞç¤frÝJRáeACÀ) AÁIÎÉ9ܽ©"J‡E±M»6Ônñur eOݽ¡GiïtÆ3Y“8}©â¿iaMZŸvðûqíè‹z‡!Rµ©´u]ÍèRwœ$(H5ÒÍâÈåÂéi¸^í|Û.•ÿgÉD´-§œ]…1_Œ…ƒ…(»Ë)ø¡Á⪩ ]SÂY³®ú³Úßzؽij«Ò’_%a·BkJŠýQœJg`çcIê#*TTÚž\ˆwí´’•-2\æll$¨žKFGwǨώ¡Ó×K ÜQkûƒk5™(%8Ü’¦– 7 ¤FGJëcRXÐȹϻĉv)‹dÄ-…"ßpŽÜÒ‘ÞØˆû”;£âEsýaj¶Ú4Ž?ûWÁ&glvÝqñðÉaK(qm¥Y/§ Úp”îêeIÞÌ‚³KiåjÜÍÚßL8KDi!íòPÓN<àl¡µ$†Ï®¤g#õÅ%m/z;:±H“%ˆ©•l¸ÃC¯¸l8ü'Úor•€V´Œ’ÎOJÞøOtµØ´ü‹|ƒs£ÝÝ7F†¢ <¸¡´%(Z”Û‚S[ƒÝÖŽ{À€¬¤¦[hr•Ò¬7›[|#™%éÌ"ùonEªr°[–ÚÊ’Þ¶š¢ùg{„ÍÀËr)¶Bi¶œ¾³¶<Äùî75ÍKŠP{.íRVNOu"3xžj½<«­ÊMÚßuq‰ÚãI„RβA¶…ÊÿÙÖ©|«lÕa©š#HM.‰…Ë|–D¦ùí¼fJxe¬ïØPâð6äã9éZŸ•YfoC_¹»naVåHojá/9¨ÈŠÛ…°ã) Ë­‚OUâñ4}ò]Úe¶*-ï9 rCè¹Æ1[J±·29œ®¥@cOEnw¹¦ø§¨fØçYc3`Ì`]“Æ“ç} IIk))O­ŒˆÎF]ÀY§[%Ø¡¿¦Z¼½èùÓÚDÆã[¤<Ê¥%ÆèZ[mæB”•%{…S3$ÑnºTÚíR.w J£G޲—BÞo˜åïåîßËßÜæcnî™ÍW3f’þ›“}eÖÄY-Ç} O5½éQBÈÆ6ª¡ dg³ÁÖ6{­Þ^—™2$ÈQ-q£2ü‰1ÙnSŒ!„) ºó{R‚â]•¡E# P5¡"J|°Ó$=^jG˜¢“â Ê ÔùTè@¥)@H¨©ùTTùTP R”ÐÐÐÐ R””¥¥)@MEME¥)@)JP R””¥¥)@)JPií¡§¶€ŠR””¥úSÀ_À^†ý ßï.¼øýøÖ¢_ýÓ^œüèoÐÍþòëÏßMaú%ÿÝ5ωc¶Ò”«8¶´+¯ß—[ï¶´+¯ß—_Ÿð½£>Ér<*¶O…YHðªÙ>ïÑ0T+dx«“çV’< UÉó¯V†ed¯­‘âjÊWVÈñ5êÑ1Ì®~°ß¬Çë úô©™¤a»XŽùÖ[µˆïmÂF#µŠï¬§kß[`q‘ˆïªkβõMcùÖ¸î8°j*MEX‚O•EIò¨ ¥()JJR€R” ¥(©öÔ Ÿm¥()J}µ>ÚŠJR€R” ¥((()J|ª*|ª()J}•>ÊŠEEH¨ ¥( ò §•¥( ¨©¨ 'Ê ÔùTJR€‘QR*( ò¨©ò¨ ¥(¡¡¡ ¥()JJR€šŠšŠJR€R” ¥()JJR€R” $ÓÛCOm¥()Jô§€¿€½ ú¿Þ]yñûð)¬?D¿û¦½8 ø Ðß¡›ýåן¿šÃôKÿºkŸÇm¥)V*pmhW_¿.·ßmhW_¿.¿?á{F}=’(äxUlŸ ²‘áU²|+ߢ`¨VÈð5W'έ$x«“ç^­ ÊÉ^5[#ÄÕ”¯­‘âkÕ¢c™\ýa¿YÖõéS3HÃv±ó¬·kß:Û„ŒGkßYNÖ+¾¶Àã#ßTÕ–‰²Æ¿êÁ2s°c"$©o>ÔpòÒˆñÜ}A(+@Q!²T<|jµßTÕÇïþæ5)¼%Ùlºˆ˜aتÚão=Ö›X9Ú·r@Œœ Ô¯m,°´é›=ûQÛ­zNmÂòã®|{€‰h[ƒzeÅÈq*q[ˆŽ„%C8ÃÐ6Ë-âEÎÍ‹’-“%Ã~4¤6†—+ÏáÄ)µ‹iŒuê|­´Ž·’öº±_uî¦Ô·(ÖIÍŒ’£9ehuµ–ÀuÔ‚:¨àžéò¬Ów+ ‡Y®C2.S,ÎD• O."‘²DWZÃAÅ').’3½´uNz5 °i[õúòípC̲v§Ûl¸½¥[ P./ˆ V<«ú¤¯Ò,>œn+mÇQ¾c(uÖÐHZÐÒ–ZRR¬©) m>Ã[n‡×VÍ9k6ÆäJmn®Ü-ÓŽ—ÜÜ–Ò•ve| æÔ¼r€kǪ챴#¶k¡ptDÌxO[ã¸Ë.8TPërIæ³µJ (H!J' / kOé»ÓŸ’ì-¬± ‰®/šŒ^) ¨uêIZ{£*rÕc.뢵 ©QÑp:žˆÅ*¸ÇË«Á/ÿz¾íÆqƒ[6µ¸=„:RË.‘n2Ð_x¹ÑnÃmnª"±ã´™ãÚ” õ¬=ªì·í>ÔvŒë…ÔÊKÆ|Û|vi°…4§Z%Rw(¤ïXI:ñ¢mƒTðþñeÔÛ,w Ý$ÜcGy”Ä›Õ8Ãn¨(6â¶%<ÂÕ„­)ޞ‡š¾á}zÉÖÜ™­DLÍ­LaHq•-(J›p/c™ZÒI$àu®ÖVhzºÅ©â¢k¯µjnÛqŒôFTÛaS{EJR]ÊB—µÄ$dwqsaâ]žÙ­XºH]ÂtÐáFg•j‰¤3tbjÂXd†Ð [såµu ì^V$æWÛMÂÇtvÙtÙå´VéXÂ’’’A*| `ÕÞ´»F½Þ™¡¶í"(:%lCe•ž„ô*mDqôªJºÝ©”¥H¥(©öÔ Ÿmc±Û®zRûrôœ¶®V˜é•Ù{Tˬ©öÏ;˜•î;yda>·^–šwDĹÁ´¢MñQ.×Îg¢bœÄ=µjm<Ç7Ž^÷¤' _Q×­yèiúRƒPD¾Ü¯q¤Ý¡¦D+cRÚ";áÂ¥Èl’K%;qÓ î>e¤µšÙÅ:a»¢ë§¦â±(1æ$HT¦’òŠÁ@Kê* %{‚Sꑚ£o€*mzfÉu¶¼›v£}ëÃ÷g¹Vâˆá-4]qâ½ÛÂR¡Õ°’FŽA)º-È\6kWI¸%šË(·r»á‡ùmõ+=7îœuVpFm ãDÆÐ>‡´\µ Œ˜ÀÜÔm ¹ÚÞàÏ;´‚ˆá@tÉÆåa)Oõ©ø‰Qi+;V•µA¹Ü'A}Ã2v!Û}> ’”¸”%!;v©}2Bì÷¬ Ôú”ÙÏ4­p'>ÈiIIS¬ÅuÖÓ•tÁ[iû‰ê•Ö¦–îÏÇŽË–ëƒ s‰J^K¡ÔUÑ8Éüa‚+ÏLêöS¬‘xÔQšLoFÍ‚´Z-Ñ¢=æ’BJHS¹*=p<ðzû¬µÛõž¸Ú™™&Ý¥û8lÉBZzHnR䨔¥JÊœR@ܬ:ÑÜkM^u¯7hŒÛ¼€’âÝÛIQÂS½Å%;”zç'Èö´é CtŒh @ˆ÷gw´Èn?Ãuø$óît=Äå_ÝVö‹žŠÅâÁ&UùË$¹q&G–Ü6“'{ tlS|Ò}Á¸,ãjUŒ‹ž«°jvîHÔmÜàóo“/1ýÓnî2voe{Ô r‘…ØÊ»§4»\ý$ù°Ù®vÆu/Ù\¹\ëˆKlm™!‚pCHÂI*R‰9aÍÒWèV4^dÅa¸ªi·¶öÆKémÌlqL…ó…nNRÜ:õ{?ZBŸÃ‹VÄ”³”—[m!]°J’ârs•´[|'½Õ*ÉHñ þ®z®Ë/‡æÑ ι\»4v#vøàÁ-©;Š%$ó\AJT€Ú’B‡S´Rò‡JR®((mv­Ûïz"Ûé_ºžWÂrsÙwÍv/†îþ9[üSëcË'T®¦5Vœ†t¥Öä.ɺi\vXñØmlKÛ)É(Þâ–×}Ò“„/ `Õe~×&é+ì+o2b°ÜU4ÛÛ{c%ô¶æ68¦Bù‰B·' )îzŠþ®š;R[†ì»i±Ä²Òu¸P-­QSk ‚° ¯®z®Ë/‡ÆÑ ι\„hìF2íñÁ‚[RwJI渂”©µ$…§h«­EÅ(ó/ûÜ48_Mö=êLDCŠÐu¢µm/´9¯õZ€S˜À'!DäEä WWhÙ:gJZgÜ€EÂmÂlu¡¹M>Ðm”F)!M’7nuĨné´ iô™ZƒSÛ¬©|F$%¥¾S¸2‚{Α”åDu]k+¾šJÚl:uwwSá6c®Üm²C茔¥! W‡$ƒíèzg Ãáýú›ºÌºK€™îöãÆa{ƒJ[©å+yBÒ°žZÜê“œíÆ‹\ikÈØCi[ç,)*JÕ¹rб”à(Vò±&œlÛчQ.;NF\¶£¡æ®,(²T;Ž u%\¢R¥mBº+p#*ýl²£BØo¶Æ.äÊ—.ÄÉ”‡µ°ÔUó m—ÕÝ%xÀï˵OÒpÖåe•r½¢í2[B¶4¸é[’„7Ì2°¾Ð’U³»´€•xÖ¥-R8vÕŽJæµqq~dN[ [/‡Ñ JÔV e!Œ‚¼ç5mnAi`áõÙZ»N[uW"Àº]ã[¤-‰ -Ö Ž%*BÀ*-;´’âAèzª™`{M\¡+UÚßz éZ¶A¸2•9Œ¤¤:”º”©*Æä”• ×D÷Êѱ_´ú2×.4XšžÛxììÚbÇ,ÇÎÞÏ1 ß!c˜«tõëÑwh:¶ïe~Åk±Ø} äX’dÌ[³›B.>I@ RJRÊ;ÙD¨á> ɽI=/úBB8“¨4­… ݲá)„9%öÛ e—¨O@2£´dùg¯Þ-³m'í· ˜V×H8è Œ‚ ‚ GJè#\Ø™â&¡ÔDÃR²ñ˜$ÚãHT7]—ÈCN©M¾”©´€W°OD iÚâð›ö¦“rCî¾ÚÓM­Ø¬Æ%-´†ÓðL€Û`œà2OS1o‰½†ÃmzÈ«åþîý²Þ©&$~Í IyçR”©xAZJBÑ’Užúp\B´…åÛl›´Q.Ú×1m½ÍCn>ÊR§Ê”Sc* !8 ‘ƒ^öK¥†N˜NÔn\¢³k“bJ‚ÂRTâCˆSkZ4Ù é´ô9é´iÍi£lºjLÖÙmÉrßr„J­‘]qå>ÛÈeÕJQæ·µ.6…!°BJ²rRa¶¨]´^¤µY[¼N€†á¸Ë…&SKZ[ym-HJŠÒ•0¢ÏwÄ_ÅãGê;K,;6ÚRxGiæÝZ#!§…6áëÜX èzt­ÓˆW{-º ðØô‹—{¦˜²C}6¦ÓûÒ­ÛŠ)´í)wŽNp2®¼IÓ1¡ÄnÒ¶UPÀ¼GŒ«\hÍ´Üt½ð u¢\|åÄáÇ2HÝÑ';¡JDš,Ý~…s‹m˜›lyK‰Arë-¡HZp¹±µŽÕ”œ1’+:Å¢%ß8¢½’Õ™ÄÜÌ7“6s \aÏ )!EM¦C‰ÏªÞ ðvŒxa\[Ñ.Ýãö;–¡jªqr]v.:ÎFP„ <z•# çoL«Îª±5ÆÖµÝW)pð^]b\d0âÚK¥¡µÅ…0‰$÷F:ÍÙ·'LÞTÀ–cJÝe——c2Pð%°•4¥çe$€z•_s…&Ûr•n˜„·&+Ëeä¥iXJÒJT’H=Aê ÒxQ*ßd¼j‹Å½©×=ÚfFK⊔­i /¶âTǨ½Å­ÇãŠ*Z‰*Q9$Ÿ:”Û`é:G„ÒuÑNµymˆú—ÏpÇÝØ6>¶“»¼7o(îú¹9Y­B^“¿ÄÓÍßß‚”Àq(^àûeÄ¡d„-MoBA”‘5µin#®É#FGiÙ¨µÚû)¼GCh&O"äü´ìÉòKÃ)ʲ@ bݵe’Nš™Èjã離 ¢KKm3MÆ,aÄ,+r”¡¾éHÆåõ9TårJF´f¥vï"Ò‹nfÆ»µey¾{}ÙŽ©Ä¡¬îÁÉeÁ¸£oR232ô^ ‰2YlÀŽ©áÎC®Üã!œ¶2´-ÒæÆÖž€¡j Œùï…¤Ôª¿Ebø·§kŽkn0ÐKIeRë-áÞw?ÝQۑ⌞y6ïý j±„=Ú¢\æËqd …5 ç9…ç§šzž¸”äÈ-u/ï­{qÒQ…qv#bCsX †›Z“ÌuA–w%(äâ3EêYWYöÆíÉL˜{HvKM¡%^  R‚TW‘´$’¯ÅÍmg\XXâ6¢¿Ãíªƒ©YxË­Q¤*ŽÈKä!—V¦ßJTÚFU°OD bËÕö;¼›ä[Û÷eÁšôØ“ v]Ý•²†Ë()m´)( ¤ìÚž‹ÁÊò$Ö5õ¦5ƒ]_ìPÖë‘­×91S¤© º¤$¨€88ü*bé;ü­<åýˆ)TÒµ•Û) -ih«zÐ’pT”<Ȩ××h×ýu¾ÃC­Æ¸ÜäËe.€”8ê–  àŒàŸñ­†Õ«,‘´Ü>{WLÛ­­šCh1nI.­e[’¤‰.wBNv£¨Á©»² ¥¹èKm²zfdÑÄ’S)•¸–_JTÓ…´¨¬!AiˆÆNÒsÒµÚÝ®Z¶Ý$_B–=!¦m¶–w%=×£vêW{¢esd÷“2q¤ÔÆü@¥)R)Jj*j()JJR€R” ¥()JJR€“Om =´R” ¥(Òžþô7èfÿyuçÇïÀ¦°ýÿîšôà/à/C~†o÷—^|~ü kÑ/þé®|K¶”¥X©À=µ¡]~üºß}µ¡]~üºüÿ…íôhöH£‘áU²|*ÊG…VÉð¯~‰‚¡[#ÀÕ\Ÿ:´‘àj®Oz´ 3+%xÕlVR¼j¶G‰¯V‰Žesõ†ýf?Xo×¥LÍ# ÚÄwβݬG|ël1¬W| e;X®øÛŒŒG}SXþuïªk#N=l}‰"òò`2àqæ/õêFˆŸ 1Zã¸â̓Üb\ìp„öaÌnÝé;»óDxL¬§”’…,¨…¶N‰.¥8Øê]Òu4ˆî6›]ººÔ_™%÷ÂäH†Òð•%+Qæ/š¡ÓhžèGjÕjMîõ:ûw6/Œ­›‹m>Z‚CÀ¡{TC ŽéÅl‘8¨ì[ÕÊD(wkU¾|X mW•ÅÙ‡0Ù„¤Ä¤¤úîR CÌAA A_%JJ¢ÇyGm’RêÕýÆÐV¥9„œ#j\9?¾ž¯Ò6˜×9Rä\VëV»|Uʘ¶ˆ a(BI-Å!àãvp@5sg×ÒmÌêÄFBõ VRãÒTµÆu|Ä©ÍÊÊœQiçI9<Ì“í¦zí­ÅŽ K¯Ê2®.,),¡8=R¥«'S‡§t:ƒbÖÚ%˜ÖÓ2ÜeµÎ•/8© ‡ãGÞñÊvíSÎú¡YÇt'ërÐI´èÙê—6ÔõéÈõJR; œjRiâ°”¹ eYRFÅ Ã ª‰Úôúcý³ÒV¿g—Ù»Âú½wvOW¦9ž'o[›‡àHRå5¥'Ë¿D¾ÜVüÎk2^d=¹½ƒkk/(à©DeC$¶¾•‰(fiØVg­Ó®w6®¶Iky¢Ð³’ãIIS_ „”¨·’RFÝá_Ö±³Ú"Øì×ËCWlÜËé缇JZ(Ô­(@RT¤ŽèêÚÇZØïüK¶ßæéñ}°ÝïëDÉRVÅÂú§—Ð syCb¦³„§`¨ë:þÿlÔ—4\aÁ»FAK½¶âÔ„Ò[a ÚR## u•~$Õ)J¸¥()J*}µ§Û@E)J]Y|7³MÔ75lUÞ,»<رfÜ¥­ Šú]’Ü~b’ØÜêVœ­{ È®S[õˈh~ÂÝ’, ¯`ZšzrSa”-+ä06§’ÙRO¬®ê{Ýk+ð—F髪ŸÈ¾Z­på½J.w(ñËïöY2”¾¶’Û%K`!IXVÞbzœ×…»IXÄ­?b¹Xoq-W·YˆÃ¬j²²ã„‘!¶ N! à¶sâ±áXzƒˆ ^‡l™ó:ÐÓÜé ܯk“%Õ) „½±! @ZÊ@AQݸt¯êÇ®l›ÞŸ}1p6ËÅ\aÆô²yÎK+eEnºX!HÃNÄ¡ÝÙÎkiRè+e–ñ"çæÅÀÉÉ’á¿RCKçðâÚ‹E´ŽŠF:õ>WzKéû¶”jkÑ$ÝoO}ƒ>¥‡oq %¶KjKO6µºV§gäñŒÕv—Ô:RǸOr÷"3ðÞ‰M4•´‡ã¸ÃÅkìÄ,áÂS„£nBë ÓsÒQœyS´ÅÂ`L•;mØ6RßM­¼C$8=dÉÉðè»múC‡Vû’ÞüÛv¢pÉSȸ\ã)‰dSn)$IJ›$”‡•·ÝX&«Ó£,ʶ.EÜÞÛ²¦ì¹aHìi*Šf&9FÍÁF:TB·õRHÛ€M{GâƒnÜa_.¶'e^íòdJˆëËŠÞ}ožk;V7¸¡ÑhÊ@IÈUîÖ'£9¾ƒW§ýèŸHv¿‚ìü¾Ny;3ÌäüíøÇ]¹ëQéi•—hrÜÕÁ¥Ý¢Ë—g˜ÌY)aÅt8ÂԅתN@#¦r1+.Ð幫ƒK»E—.Ï1˜²RÊèq…© ®Tœ€GLät Ûåi;4¬íÒÞž».˜vQXmhm¹)ŽÚw””¥J[å[H'o•/VM)a¸GvãR=á/™ 1!•]eÖÝqM+*CŒ¨‡ŽÒ0Wmoh™®/—Ö´ôÄ[õH/\’µ©N½Î%§C)Ø´¶R•ࣩP8v^ X`ÜûSšRaL8-²©‹¢õ¹!kZÜÞ¶•º¥8¥oؤ’ yúDžRô攵êçtÔ˜zšë9×Ùm†b<Ë.1ÌmµrÖ Ìu Z›RFÁ”xõÀ·O ­ðâ-ÇûuôÈ‘-0×n¸F½–qžkm»¹rTKKW-¼a;{Ýî•e¤­ ]QL_Ä™ëÂg¦þЖÓ%- ³Žú·´¥*)!>·xYµµ¦Úý²XÓÒß™buj±¸åÈmaÕ<Ú_HkáŠ\Z•”–󜎔ô—¨t•$™Ö.o¦ÛT‰¬ê8o¥•­¦Öþøhkœ„¡j[}å  'ÀúëÎÆÓ6©Œ7976Ì™mÏŒãIt¨$¥QR Í œ„8µwðžèÝÒ†Û©,v«c«¶iÙ Þ^€ä%9qÞÀK­ZYå…© W‹… « Y?ÄD4üûÅ¢Ðä-Gsu§§OrX}¢´>ÜͲ¦ðδ…¥,t = xëýnÓ:^Èûrä=xv\¸wfÔSÊa曌ç-ÊD«É=äœttŠÛuN»¹j=+ Ép…lBãÜ$N\ˆ¶èÑ‹…Ô40ÓIÆ9j$翹;¾öœjUxÞÚn|7Òñu [¤‡-—«Ü¨|žUªÐ´¢K©Y^÷rPçqR'.'ÀdÕå×Dé‹"Ü\ÖõÑÜŹ†!8Òˆàa—V—²…‡Jž-„'få2çQåªi=CÙi¹YîÖ¹3­÷u}–oey k~Ü,¡`¤ó””œ“Ð[^%²ÕÞ}ÐÚ®­;#”„µøë ºËM!¤7%!$¾0Œ’‚¢¥dõ«ÍrOæÑ¤tÚõƒÚzok¼³:DI^ibr–´—TÑB”¶Ò”ïQÞŒ Þ8ÉÊ÷j÷éNŨ9>‡ô‡§÷£Ñ¼þ^îË·fwïøó3¿®ÜV]yavÃ6%ÛO^¹Ýd»"ïpxj2¦•¸VB£8RØ$¡XQês„„ø{ÑåÁb/†ô7?Ò'²ò9<ÝŸfwìëûw÷öæ£ÒÖ¨áí¥Ûû!Sñ_½7ojî5;“ mÇ m­mGm*d¬”¨oW´`“‘Mq²èö¬èÔpàj7-1ç&$†_˜ÓNËKˆ{’ûNrJP7Gt)%+ÆÜnÎHò­m¶8þ’Óï['¾ã yéÒ„†žCéKHØ’‘Ìi³•)g Æzšóª4Óñ“lcK·h~onžÃ7T—]u(Z[Kn)’mÅà,¢ ¼% gÅÐQ$qCUéæž”«^ž~Z–¢ëhyÆZ@./kh%KFåœ%#r±Ó¯kËD{-å¢À› §#¥ÐÜ™ŒË œ)·Ù €0 \ޏɏ¼k[Dím|¾5`šÕ¿P%ßJAræ•­Jqþy-:NÀ–È JýS’ p(µuî=åØ A€¨ûl1#?Îp#˜·IZö¤)En¬ä%#¨t©Y¯©)J¸&¢¦¢€Ë´¹njàÒîÑeË„3Ìf,”°âºajBÀëƒÕ' Ó9­»KiÄqÒN…¸·u‘mUùVxî±-¶^o2ƒIud´´¯ É) NO˜ð­*Ò幫ƒK»E—.Ï1˜²RÊèq…© ®Tœ€GLän¾î4ç¾ï»ÿs7_úÿ¥;¦ÿ®vŽvwö½~.Í»¼÷ùUe~þ4²ê='s”¹¯Ëõ5©-§–”4•6¢Ò[¡Å’‚P@onåt5¤ÎŒä9nEul­mœ(²ò]F¹I%'üA5²éÝZÖœÕ esnΕ\BœÜZ(æsRÚSÌIQZËk5­óÝ&¦—yì¦7< lSœÅˆJ7-xÖ­»”¬ ÊRŽh¯pZBÓå*\‹ŠÝj×oйSÑd %I €¥¸¤ nΩ*íÛ´f´k68(u.¿$ʸ¸°p¤²„àõJB–¬œeNÐM%JùTTùTTJR€JR€R” ¥( ¨©¨ ¥()JJR€R” ¥()JM=´4öÐJR€R” ?Jx ø Ðß¡›ýåן¿šÃôKÿºkÓ€¿€½ ú¿Þ]yñûð)¬?D¿û¦¹ñ,vÚR•b§öÖ…uûòë}öÖ…uûòëóþ´gÑ£Ù"ŽG…VÉð«)['½ú& …lUr|êÒGª¹>uêÐ0̬•ãU²€” Çkº`¨Ž”´y¤ô•ZbħbÙ.W›úv mÒH)Ü1…ˆn…]—?Jéë’òÿjodfË%¦}(AŽÖ7tÁQ_¦õzì-Er&Ÿ²9r†¢¸—'Zs´0­ÅA@%ÀÚÔ’r Т0<€¥oe~Àþ‚¼Ü.:2ÊßdŒÜ(“‘4>ô×:%d¾ˆKŽ(mÈHÀ a`¶émAkçiuXmÂ|X±%D’ûòf­O¶—ZÚ²¤¸ Ê–¼¶„áAŽø¢K¼I“`d-²ÔHN:òC`‚ëŽîZòz¨BF0HóÉ;Mã‰OÏ“ošÆ”ÓÖÉöÂÉ·I†©c±ò–ž[k}M ‘×(9$“Ôæ¥¦ þ%i¸Í0©ÆÅhµLnè"3蛪§4ã[WÎQqÀÛ€„`e@¯¸6×5­PjµÝ- µE±ÙìÑ’™rŽ{©J’•(¸âð^©J×*bšZm|7b×>eÒÙr³Ä›Ì´O’̇y.Eqˆo¼…#bÒ“•¡9 J†LdæÛB·¤Ò­3-(õýw‚Ñ|vâÐS¶y!µFRZOŸ’á‹Ô ×ôV¦N˜“&H°Z®®ÈaÈÁS• r›u¥´êRu²P$䎅;OZ›V¦‹o[ê:GOK ’©ĆßWe'BHt `a.•ÿ~I9†˜7–+¶8šn·L9¬Ôˆ“¢Ü¸·Áî’êý¶doìïNyM°ÈZ†Ó»j{­òñŒlZÓŽµ‘%²mÖ›ö6‘E¡Ä¼Ì[;ÌÊy×®Tâ™PZŠVCjRŠ›JH@#¾{ë >’Ó– :óát‘ápvu2Ö–æ¼Ó1VH8 ¡o©9N Âs‘¸[©8†íå1\oLY-3 ¡´[åÛžšÓƒj Ie&Am#$íÎIW­Ö¼fq#UÜ­¶ûmþàíþ$)oK ]v@yN6–ö¯rü¢‚0¤—AÉè³ì`uî÷86kXbß*l¨Ðî«‘oqz;-Еº¬ï}EhBÔ¬! m+Ïø‰ob Ö#‘ Û#D—2]¶CÎÆëO1¾§ª JWÔ) ðð']ÊO"4k–-¡¤:…Z›mãàél¸VTát’Zhçx#–œcM©¯¯ßdÇqÈ‘!G‰F‹*Ta ¥+jw)J9RÖ¢T¢IQëSï¨*iJUÈ&¢¦¢€Ø¸qd‹¨u|Kdçyq9OÉ|óCym–Vò“¼ä'!²7qœùVû LX®Ó2%NËŠ`Jr¡Ü¥·Cí-È’¹.2P‡ ‰ÜÚTTÐg¯.±]$Ù®ŒÜbÔã[C©Ü‡¤”­ iRT¤‘ì&¶Dq[A1#X,lYù²å¥-¼c¼[kZ”¥:]ÜTË'!`ŽZq€*’Nú£9 ´œ»J¢³cf=þL%8¦ãÉüvßZT#&áJiÐTœ¬-K$nKeJI®)|·=h»É¶H$½e·2ÓÃÄmq)Pÿô€?ÝW§\\S¨­÷xöûlf­ñ 4¾ÎˆîõYpîç:J·îÊÉb£SÞ¥j Ó·Ym°ÓŽ!¶ÒÛ „6†ÛKhBwp„Œ’IÆI'­"šÞ ín†÷¤/fyÖË\r㕇ÞWu–r=åu8 ìBÈð«©ü4¹ÂTéï>¤éö";)‹¡haô†šq¡³vRVdGOS€\8*ÚEkRoô¼K x܆›}rd¹¿&C¤mA#è^ªYÏ{êåÄmKpЬèÉ2mm4ÃC ;ÊY[«H'8ñtÓÁ¦ý‡2ópëMÁc±¯&t›UÁ6Ë«*‹Ê IR\ 6­Ç˜Œ²êw“”x`ƒ[E³BX qç¤íׇ5%Þ+xF"í\´8ò Êå­¢V­ÊKˆGBBŠJJ±‘¦ê­ipÔ0DtRü‘2sÑ›Z\› $¤:îå» _DŒ­G5âæ®¹¯Yݵ_**g]Lâò•ÑÚÛu·6 Ù¨§$àœùÅ¥`bj»L{ÝV¶®)œüt„KSmá¶ß»hVNð“Óv$d`šš°¿]¤Þ§ ÓP×j-¥:€BŸPæ/¯U‘Œ‘Œ‘“’I5õd¡¡¡©”¥¥)@)JPQSQ@)JP R””¥¥)@)JP R”š{hií "”¥¥)@~”ðð¡¿C7û˯>?~5‡è—ÿt×§zô3¼ºóã÷àSX~‰÷MsâXí´¥*ÅNí­ ë÷åÖûí­ ë÷å×çü/hÏ£G²E ­“áVR<*¶O…{ôL ÙªäùÕ¤Ur|ëÕ a™Y+Æ«dxš²•ãU²U€R” $TTŠŠ|ª*|ª()Jhhhh)JJR€R” &¢¦¢€R” ¥()JJR€R” ¥( 4öÐÓÛ@E)JJR€ý)à/à/C~†o÷—^|~ü kÑ/þé­…'^=½&›6¨²Û 5ha 0õ‘o¸:d•/´$TO‚FR 6Z£Oñ RiË…‚å®,†Â:ã½ËÓªJ‚T0H=§¡®e¤éJUŠœÛZ×ïË­÷ÛZ×ïË¯Ïø^ÑŸFdŠ9['¬¤xUlŸ ÷è˜*²< UÉó«Iªäù׫@Ã2²WVÈñ5e+Æ«dxšõh˜æW?XoÖcõ†ýzTÌÒ0ݬG|ë-ÚÄwζÀá#ÚÅwÀÖSµŠï­°8ÈÄwÕ5çYú¦±üë\wX5&¢¬A'Ê¢¤ùTP R””¥¥)@)JP R”TûjO¶€ŠR””¥>ÚŠŸmE¥)@)JP R”‚””¥>U>U”¥>ÊŠŸeE"¢¤TP R”ŠyPSÊ€ŠR”ÔTÔPåPj|ª ¥)@H¨©ùTTùTP R”ÐÐÐÐ R””¥¥)@MEME¥)@)JP R””¥¥)@)JPií¡§¶€ŠR””¥ú ÀÿÁ•ýÏîÖåZoÿ:Wôc?»[•r,uºR•r§öÖ…uûòë}öÖ…uûòëóþ´gÑ£Ù"ŽG…VÉð«)['½ú& …lUr|êÒGª¹>uêÐ0̬•ãU²U”¥¥)@)JP R””¥>ÚSí "”¥¥)@O¶¢§ÛQ@)JP R””¥ ¥¥)@O•EO•E¥)@O²¢§ÙQ@H¨©”¥"žTò "”¥55ùTŸ*ƒ@)JP**EE>U>U”¥4444”¥¥)@)JPQSQ@)JP R””¥¥)@)JP R”š{hií "”¥¥)@~‚ð?ðC¥F3ûµ¹V›ÀÿÁ•ýÏîÖå\‹n”¥\©À=µ¡]~üºß}µ¡]~üºüÿ…íôhöH£‘áU²|*ÊG…VÉð¯~‰‚¡[#ÀÕ\Ÿ:´‘àj®Oz´ 3+%xÕlVR¼j¶G‰¯V‰Žesõ†ýf?Xo×¥LÍ# ÚÄwβݬG|ël1¬W| e;X®øÛŒŒG}SXþuïªkεÇqŃQRj*Ä|ª*O•E¥)@)JP R””¥¥)@O¶ Tûh¥)@)Jè³-ºeØw%[-§[˜Šêã̇=}½$ì[̸° wc~ÆÀH'àg¤)¹Þ̬¥”ç~ÚŠÞï:_OÈÕ-69—}ÏÁŠû¨¢áQt©!­JZÉÎܤ¯¶ŒÖ@Ñv›J/)Ô/^#„ÙÚŸ®Ù²CITÄ2¥-•:œ+9HI$¬«9 û<îüžQO™êò2¬dÅPëP¨Í¤í¼—R(Ô)[nšÒp.nØâϽ®»ãÉD4"5âÖõ«zpJ’°;z”ƒšÏ±ðæeæÚÄØ˜}¹Ët[ÜnÒ¥´R•©¾âTC$©$`olj8ëS%¹}ý°êEo4O*Šß´½’ÛÉ,MšÓ÷ ~\¥Cv\m T5¼ÑKª$¥Ñ†×‘‘»ÄgIÛ£]'K!ÒÚ›·K’Èå¥ki…¹ƒ…¤§¢ ïw‚r’ ¨tž‹˜Îµ)é[z4•±ëT'ؾ¾©“m\šŽ¸!)‚÷5aü,¤àîó ª½'æç>{L{l#(ÇÞPQu¶’’GP΂qƒ€zŽªI¤ÉΊ_eElŠ<¬vËì(·‰O?è͸µ¶•´Vä•(HÁ'ªO_!w6Ío¼iû ¢S0î~çäI ³ DéEJqi)ÂËm`+jŠŠ;Äx™T›m"ÒW4QQ[\-) çàÚ¼­«åÁ¦œDÜÎ]HSH[»ÁJ”Ÿ7 ‘×KÁ°ìºÈ¶Ã&èÞa§£¬s÷²~Õ=xs©êœ ué˜ë"j´­½½+d]ºÐêµA.ë§c³"Ä*aÀ§ÈJS±k #¼”œ„œ_¬¬ Xa”Iœ·W»{3 *3ˆP”•!Y8!GÀ䙇JQWaM7b„SÊ­4ä›4Gå?x·.ãˆäEc˜¤6§·'Â’°'yÂNIÚ: šØN•ÝO ßg¶¿ÕAíW8‘Ò·Ì<)[‚IY%²I;—´šF›’З4·šM+kâ~Ÿ]†þß*Ç>ÓLHÎ0Ü”/×1ÚS©Ü¡ÞRV²Ó½4î“¶Ýí¶gñèòîÓ·2Á‚”¾žVܯ™êò2¬dÅPëSÔË;‡GX²©EnVm-j—yÓIjîä˜7k‚ )k„FÇÐ[ÈÚMžs}फœ09¤­—{m™å__.ë9ÛsL!I§”Sßæz„<Œ«ñT:ÑQ›ÿêðù¡ÖDÔ|ª mZ{KÁ»{™ßuǦ®O[œÄ0¾Îêy[øA½'žŒžéN€¬ Ù7¤¬×húZ¢UÄ]®VåÈy¾Ã½ Øô€â•nJZ)JRŽöÄž…DhN[¾÷|éht­ý|7‰Ì!ÕÞ#Ç}‡]i¹’Ô×TÚ†ã©}󇡅õ^`ŠÓ¯°™·]Ÿ†Ä•Ém¢ql)•d€JT…uJ$Ôd0LN”à¯$Lgn0…EH¨®e‰ò¨©ò¨ ¥(¡¡¡ ¥()JJR€šŠšŠJR€R” ¥()JJR€R” $ÓÛCOm¥()Jôÿ‚+ú1ŸÝ­Ê´Þþt¯èÆv·*äXët¥*åNí­ ë÷åÖûí­ ë÷å×çü/hÏ£G²E ­“áVR<*¶O…{ôL ÙªäùÕ¤Ur|ëÕ a™Y+Æ«dxš²•ãU²¹˜ÔnBì¶gù‘[‡)Çs™)–Ò”¶…(,€½ìÎÑœâ£Ý³¥¶:~ËÙš„¸*µýް_¥*ø\÷\N{ÅU™7IéÿEÞgFÔiŒ!M‹¤\#¾Ûƒ˜Ã‹Z”4®øZ Ȳp 3N0¥[Ó57»BÂ[iÙM¶ë‹TFœRRsjÀ+HRPT¤“‚œô®­\±E‘™°µÌ¸å²åŽÉ%M·%„•²â6°ÿ3˜È ­!(Ë«#(gã¥`»©ŸU…ÛK6ËlQ!–™“!†Ö—Ce*HPݳ9JIPHQÇRrsg«tt[mÓR5k¿À˜Õ•Õ•Ç!ðølH €Ii(*IZ7`ã®SšÇ^‹’Ü©ˆzójj$F⸩ª/rV$·Ìk7¼e>jHޤtÊJªô_í÷À”Ἤ²_µÂ™Á…6<¥6â›’•‡ݱÄíPê7¬`䜃V—-f«‡¥{V³+Ò—&î2pdŒºÝÃtJ·»‘ãðªÁFÚ»=‰ëž«cN"t¤?+²¶úœ+aNµ8SaY VPu u«Xš\±³^ìÎv×U6sád§nXÏ_¾ž¾§xwºÕaÖµe÷÷re’÷gó3Z?6å:\ëžSs%ªiŒâ^å4úÀÞâ0æîñ”•ô0 f´~µ)+3ŽÛ.N\™qHy;ž^Üå(q( ÂR”ËO‘PV-¯KKŸ<„΀Ãó7v-aé{IIÙ„”Œ¨ÊNH f½Ó£'­¸HEÆÙÛ¦¦:Ú‚§”‡Š_) ¨nHB³½$„¨2H8”ë=~ù‘hn=mšÞDmηc³¸»\‚õ¼¸—fÒï-#™…'q=W¹]}oQmÖj·ú+²éÛ2}rrã&IëÛÐü7T§cX?œ“•îÄ“¦C7Ѳ8—‹‰[Üõ¶– c*%hJÓýÝÓ¸ôNãÒ¿¡¥%›‚XMÂÞaª!›é ëùe}Q¿×Û»wLRõ~í÷ÈZͤu–Þ›UÖ[öŽe¶J¤5 p䙇4¸a{”Úñ:w$©DdŒRߨ܋of#ö›]ÁQ’¤Äz[JZ£…¢ PÜ¥+ J†IöÖkú.KF…æÐãb99O¡nòØŽ— AÅ’Þ{ˤg¡H$ ¥½ÚݵImµ¾Ä–žh<Ć -¼‚HÜÀ A‚"“•D•Õ­ÿ*-—V½i&ZS–[D×Ûˆ¸*~Bæ9M©®ZŠHè…`(¬7c¥Ué‹Ñ±\\š›t9åÈÎÆ-Ê.m u #–´œ”)Iñ鸟q3BËaÖXfùc–óÅ•%¦ŸZWÉq‚ø|…¡$6 Q=SÓ#¨Î'¹9*u s¶È·©¥º»‚àa´ ¤/vä‚ Ð1·'zqœÑª·Wà‘ Yª/£±§lÎö kÖäo2~§·ï*Ãüy¯u˜ztFÚKÑûLµ¾Ël¼‡SO0òJ›yµx¥@qЂ Ah4¢‹Ž¹éë/£Úm TðëŠd• ¤ ¸v(í('§ZË·h‰Šã»s¶ÆnQà¥n¼ç,sšqÆ—Ým@¡Íƒj‚²?8PPŒµd×ßÞáx+”·Ë÷DÆdD‹$d¨10PmŽTrµ)D“Œ•zà[BÖj‹èìiÛ3½‚Úõ¹ÌŸ„iíûʰðïkÝFæ+§DmòF”ìhNǺ[r\—ØK …¡,‚\u{Û „€¬ç8> þS¤¤¸òÅÖØý¼´·WqJœ 6”…… 8+@ÆÌéÆsDª§u÷÷¡/#V&®™¨ëôuµÛ„Vƒ1®+m|öR‘„c %#*RI=v]e&Û,uZ-S{,wâ!É(wyŽðs˜Ñ(q=2êÈ# øã¥F¹¶B¶³§Ì4DÌ›Puçb¸âÛ}bCí‡0ä%´0œ÷SáWMi›T‹.—µÂ•aUÛP6’$HTÐë.)÷P6§”–ÒÙÊTw)Dwp±hª™¬žïøÿ‚­Â×±­MÔ+’ÝÕmdÙš 4Bà}<Âç¥ũ*ÊÔ²@äc"n£ra¸Ó-1cÈ̃,Bà@}Ð0•­Ja*À;r€1‚jN’ZO1Wë'cKuùiyŶ”¥¤4°”s2ÚŽ“ÝïGZþÙÑ’–f©w‹KLÅŠÜÐúÖémøët4\A9 Z€)8Vz’µ_»xšbñè+ªnÛà´$†Ñ,9µ ?Ž6-$(yôÎ|@#û»^Y¸\bKô²+QÒ¨Ìs¶?ðŠY.)NNâ ÞŒ κèù–ès$*ãl¨5!ÆXqef;¥·†RÕsÓ;†á”Šóáí¢Õ}Õ°-W‰¯Å%öÙ„eÇ·€”“Ñ>¶I>'¡8guO™7â1õMù7éß6{u½ÆYCÄ/bm ¶Ìq~ªP#õÎMfØõ{¶˜ÖV™²Zž]žzç°ë¥ýËuA=WµÐ’-¢ïiñÊ·`ا d›êçºójm1bDZZ.îݽeÅ!a!8OLdîð5jý³M[¯s-’c^®o­ÈÂ1ä·Iæ6T´:TÚòâT¤#¡~¦9›Ïu¯ßì_Ãcø¶ë5[ýÙtí™>‹¹9q“$áÕã¡øn©Nư<~ 9'+ܶë5[ýÙtí™>‹¹9q“$áÕíè~ªS±¬‚NIÊ÷Vk–Û~§Ÿз×;¼¤)çR⊒0¾òR¡¸+¦*îv±·:ç§£®ãé«c/­ÇÖ⠸ Þ@@HR@^¸çhè3ÒS©v“Ý÷ûÔm¿½LK²“fq…Å´Z–"ÜMÂCª\%øL”Ú|¨÷Aµ,k9Qã4Ì{=¡²Â\e— KZÛŽ·â˜ÖFÂ\X'ÊTAQÖŸ·Û—ky»‰NC†ãLc8–Üu×w”êJ‚@KK$í>c®G–§¶Å‚ì)õ¼¨7¢Tpö ˆÖÚ’¢0 mc €…FjŠ7¹6‹v±’5+)…#LX4¦Ì^C…*ܤ¨«˜\.…e#,`d (ëýÖMêêíÊZ[K®% ÚØ!)J”Œ’z% d’N:’jÆùhµDÒV[¬ ¯Ê“-ù ËÜ­¡Hm…„ xœsˆ$ø‘Ðc©×ê“r^‹&)oDŠŠ‘Q\Ë“åQSåQ@)JPCCC@)JP R””¥55”¥¥)@)JP R””¥¥)@I§¶†žÚ)JP R”è/ÿ:Wôc?»[•i¼üé_ÑŒþínUȱÖéJUÊœÛZ×ïË­÷ÛZ×ïË¯Ïø^ÑŸFdŠ9['¬¤xUlŸ ÷è˜*²< UÉó«Iªäù׫@Ã2²WVÈñ5e+Æ«dxšõh˜æW?XoÖcõ†ýzTÌÒ0ݬG|ë-ÚÄwζÀá#ÚÅwÀÖSµŠï­°8ÈÄwÕ5çYú¦±üë\wX5&¢¬A'Ê¢¤ùTP R””¥¥)@)JP R”TûjO¶€ŠR”¯-7K#vqn»ØW-H§Û•PŽÿy) QmaHr«©ª:U£'Ä5sosXB˜ýËÒÖ32,·bº†1MíTf–ÓakÚT°R³»TOPEXݸˆÝÊÑu·?ì¸Ååvaw&,gâB™d·„$cnIÚH 5 {j+¢ÄTI«ïöê¢n“µ…ž]Òé1Í8òSyC¾’ ¸wÜ[6ð-¨·µ JÛ•(‚OLz7­íÍÞMÉ›=Ê"Õ ,bb]ËJ†ƒX–AmiJ2…%G)è¡’+G¥:ùïýêâ_Y¯ñákÈúû`SlÏíɇÐÊB‚÷¥ %*ÂB±ÓöôŽ`R OuD6R’Rk•lR½7Õôã¹= Tb÷#ù÷Âm3˜}늃QÝg´»sß9;Ô‚6H傼¼')QkëÓ%­PΨœÛ[^Sjr “u¾¹­v€óa/­°êTs•¤ Á±èÈچǣ½™I»^om’ì¶nSÄCœ¤¥e2 v)ýIHŠk>ŒÔwk9»A‚Úâ÷ùaršm×ö ¯”Ò”îÑã±*ÅDzR.ù¤—;Ùqkã•ÛØC ¸#c¸ê¦tíÞÚÍ™N¶Ô{1·J.?Ò\’‚¡¹RAI;†1Òµma}sP\Û–³=A¦RÊ ÙË–ñ“•8¬y¨ôHHþìä›ð÷V&ÆÕèAŠä'­æâÒš¸ÆZÜŽ ‚Ö”%µl(Vô¹¼á5ýñBÎÑ’#"MÆÕ1¹b¼ [ŒgœJžŽÛÅ%¶Z‚RVR %`'¢…Uô•*²ê”Ó½ôºákÿð•K.¶!ý^Û¡²Á—Æ„ÔBÛ“w¬¥ v|¥Ä!¶P2’<€É¹k£=Ð̦.ó .2ãÈEÂð¹/­*[kî¸RÞÓda]íÝ1•¡ø{*å eÂ÷ öá*Ç>á L\mä)ˆî<Û«aAN)…)­™ÚJÁ éƒ@ÆŒÔ顨š€ƒoSKyÉh<ãHQJÜC%\Å6•%@¬$¤m9= IÃ4¡oðµÝôöé¸u+GbÆÉ¬™²=-‹D;¥¶Ý) s 즥)mîÚ¢ðFw¨„㯾¬rµÝÙz ÀΟ64¦å9sS¥¾BÚ·¤­d¥ÅäïvàœIÂíAj¿@³Â‘jº¿:$y ¦-Ò"Ö’¸©æä¡å6€UðªÂ”ïj…jº†Ér°N®l¶Û‹l:Úš}4ê‚ÐãeHZrÊIyTÒéu’TæÕÒÓsðŠNí’5Ô÷5t=DÄtÅr3*k–Ë….%\å¥C*Zœq@T¨cÀVEÇ]öçƒ3#Þ'ÛÜŒäi ϼ®CëJ–Úò— v·…4ÙG\w·tÅ Znòí”^&!BœI/¶Z¢•--îÞ¤‚*ƒ“ÐÖD­~Œ©Éy¸ 0"¢\Œ\ã+ ,e Nïç)ÀNOy;Éε:Ö{õð)–™üj‹ÍºëÑ­èÛqFùAàâ Ëu'ÔN—“œ˜ Æ*Öݪì‘%éIž¸®FŸåõôš$muÇü9N]sÚ{£o‰ßT“4Ýæ¥IˆËmt}µ8”/ Sa[Ò•daJŒxв^›f}Eà—Äûuº,æÔ†”Ñ8ÂH;7…¤¦@)RV:Hë€Nªy·~\µýƒPµ¾þõ0­W‹tVî6ù6ÉmC¡‘,!ö”ÞþYì)$%Ń”`î=LX«UÛ—åVi Žõ­6Ø(nh™ñ ©d¶yŠ.€N6 Œ‚š™šnóÒ‹¤ˆ‰De¶‡z>ÚœJ2…©°­éJ²0¥F©Ø6ÿyCÉ‹ìZ¯Ó–ËS¬¡¤f3OK.­†¶‡”²‘¹\Ï„Àg À­~•N¶VKöE²#:$˜-Û'1"ÝÚ%¿ËìÒyêOg‰_tt^áÓ¯‡^MÕqTÛ‹Vuµ{žÊÙ“,ÊÜÑæ'k«C[AJÖ %Dw•€:cV¨¨U$•qLÙ~³¦MÆ:l nÉ8´¾ÄÜÓÌem‚´:¤«¯yÏ‘…‘ì5çw¾Û®Žl¾S G¶+µ(˜m¥jZò0…eJ$0I   ò¨5=d­oÙ ˆØ§^lhè–FmåFyÉ ’»‚‚ë‰e.e°È;pÈÚ7ärUZí)U”œµd¤–âEEH¨ª’O•EO•E¥)@ ¥)@)JP R”ÔTÔP R””¥¥)@)JP R””¥&žÚ{h¥)@)JP ¼üé_ÑŒþínU¦ð?ðC¥F3ûµ¹W"Ç[¥)W*pmhW_¿.·ßmhW_¿.¿?á{F}=’(äxUlŸ ²‘áU²|+ߢ`¨VÈð5W'έ$x«“ç^­ ÊÉ^5[#ÄÕ”¯C°_n¬*E®ÉrœÊTP§#E[‰ À8% ŒàŽŸÞ+Ö ›Üc¨ìkÖõµ½¢µ‘ðÒWãÿòç¾Íb=¡õ¡ðÒ€ÿüµï³^¥8K‘–R\ÍMÚÄwζÇt.·>;Q~Ì{ìÖ3š\œãFj?Ùo}šÙË‘ÂM‹µŠï­¹Í®Ï†ŠÔŸ²ßû5Œçµé#S~ÊìÖ¸&q“4÷}SXþu·¹ÃÍ~GM ©ÿd¿ökÃÞëˆ9ÿ¸š£öKÿbµÇqÉš¹¨­¤ðëˆ?˜š£öKÿb£Þëˆ?˜š£öKÿb¬A¬*ŠÚO¸ƒù‰ª?d¿ö*=ù‰ª?d¿ö( ^•´{ÝqóT~ÉìSÞëˆ?˜š£öKÿb€Õé[G½×15Gì—þÅ=ù‰ª?d¿ö( ^•´{ÝqóT~ÉìSÞëˆ?˜š£öKÿb€Õé[G½×15Gì—þÅ=ù‰ª?d¿ö( ^•´{ÝqóT~ÉìSÞëˆ?˜š£öKÿb€ÕÅO¶¶{® þbjÙ/ýŠŸ{® þbjÙ/ýŠV¥m÷\AüÄÕ²_û÷ºâæ&¨ý’ÿØ 5zVÑïuÄÌMQû%ÿ±O{® þbjÙ/ýŠXöÔVÓïuÄÌMQû%ÿ±QïuÄÌMQû%ÿ±@jô­£Þëˆ?˜š£öKÿbž÷\AüÄÕ²_û¯JÚ=ù‰ª?d¿ö)ïuÄÌMQû%ÿ±@k°c92kS)q÷ÚóÈi¨à-d%¯U(€R@®ÏsÒö[ÍêV¬¼¿k~ï-k“*ÔUgLGä«%K2Ðâ[RÉQ@o ¡\ëÞëˆ?˜š£öKÿbž÷\AüÄÕ²_û“‡©U§ e·ƒã¿ŠåíäË&‘Ôô–ße…¡q½[{VŸÔÏ^¦6ÅöÊ´) ö¡µ›‚JŽb6 )HÕ¼°Ÿ¦ížÑk„›¶šJ¬ yçD­2ûò_qæÖ^~C‹Š°§B9©ë’xï½×15Gì—þÅ=ù‰ª?d¿ö+N‰Kçšw×ðø·ÏþçÿÒÊ¥Ž³e²Y£2%ê‰í+q³Ë ^,‹Ãò»VŒÜ†ä'¶¯©ÚO%=0òõ½u¤™¾A>ÂÎ/i…†ÝÕVdÆi¢"9(P”TáYm ÉÛÞVAW½×15Gì—þÅ=ù‰ª?d¿ö+¥>Ž­ b¨¯ÿ6ß{›i«Xë6M¥W÷«ÕÒ{‚´ó–'Ú‡¨ì®²€mꄇÒU9]Ý„¶Bzäïò9º^=šßjbé»z²H¶Ln4­8û©uØŽ0©)–¹‰}YZ÷–ò€)݃ƽû‰ª?d¿ö*=ù‰ª?d¿ö+”ú&sM:‹—áܵÝép¾œ~!T·®B´iÅÌfïrrÐõÝVˆVì»|°Êqã2Ç9,»3l’°Ï‚ùaÕÑD4¾=.íiU±. Ò"ÛÞ‚òa›`hí’ëÉp7çÞá#%)ê‚Bœ%Djþ÷\AüÄÕ²_û÷ºâæ&¨ý’ÿØ®Ô:6TªÆ£íáák^îËÃóßvCÕ‹Ë«Òðà5l?.[…% Y¢ºàqÈëiO&B”9R·lÊF ÇC¯ÜuR´tKJc­3ÒRÔ™Œ8ÃeE”ûr Šû›oÙ^¾÷\AéþâjÙ/ýŠ{® þbjÙ/ýŠöÝi5cЦ“¹ypÕz]ë%ê߇áµ>n; Y¢ ÇZ^iÔ¡O¥A×Ry{J”sÔª>·;î–{Ó}ž]å]²ÃÝ}½´ü+Œ•aㄞ̎£$sÓ¸7×qóT~ÉìT{ÝqóT~ÉìTºò{×Þ¿2$·— W¥Þ²^­ñ~WA¸ì5fŠƒiy§R…>•]I唕(ç¨;T|1nº‡L‰\­«¼=,Zki¹ÛmµȘÊuD8¢žîâ냻ʫ}ù‰ª?d¿ö)ïuÄÌMQû%ÿ±Gˆ“ûûæ$‹Ó¬,-L•+²ÕT;{j~U–,…¡È¬rz2êÔ‚• «;‚8êݧêËš/éÛ.Ö„sm³µJÜi)BF0”Žƒ¦O‰´:âæ&¨ý’ÿا½×qÿq5Gì—þÅVu¥5fL`¢îZ•´{ÝqóT~ÉìSÞëˆ?˜š£öKÿb¹5ŠŠÚ}ù‰ª?d¿ö*=ù‰ª?d¿ö( cÊ ÖÓïuÄÜMQû%ÿ±QïuÄÌMQû%ÿ±@jô­£Þëˆ?˜š£öKÿbž÷\AüÄÕ²_û°*+i:âæ&¨ý’ÿب÷ºâæ&¨ý’ÿØ 5*ŠÚ}û‰ª?d¿ö*=ù‰ª?d¿ö( ^•´{ÝqóT~ÉìSÞëˆ?˜š£öKÿb€ÕÍ m÷\AüÄÕ²_û÷ºâæ&¨ý’ÿØ 5zVÑïuÄÌMQû%ÿ±O{® þbjÙ/ýŠW¥m÷\AüÄÕ²_û÷ºâæ&¨ý’ÿØ 5zVÑïuÄÌMQû%ÿ±O{® þbjÙ/ýŠX¨­§Þëˆ?˜š£öKÿb£Þëˆ?˜š£öKÿb€Õé[G½×15Gì—þÅ=ù‰ª?d¿ö( ^•´{ÝqóT~ÉìSÞëˆ?˜š£öKÿb€Õé[G½×15Gì—þÅ=ù‰ª?d¿ö( ^•³¯‡šý+^†ÔéJFI6—ÀæÖ±@)JP R”š{hií "”¥¥)@~‚ð?ðC¥F3ûµ¹V›ÀÿÁ•ýÏîÖå\‹n”¥\©À=µ¡]~üºß}µ¡]~üºüÿ…íôhöH£‘áU²|*ÊG…VÉð¯~‰‚¡[#ÀÕ\Ÿ:´‘àj®Oz´ 3+%x×ÒßqË,¿¥nHy¤8‘=ÒÒÏ-m|Ó+ƾ™ûŒ¿î½Ïÿ<ïî1_Òô?n½‡—ŒìÎïèøôIú©èøôIú«&•ýIåÞñ(ßDŸªžñ(ßDŸª²i@cz>Ä£}~ªz>Ä£}~ªÉ¥èøôIú©èøôIú«&”7£à|J7Ñ'ê§£à|J7Ñ'꬚PÞñ(ßDŸªžñ(ßDŸª²i@cz>Ä£}~ªz>Ä£}~ªÉ¥èøôIú©èøôIú«&”7£à|J7Ñ'ê§£à|J7Ñ'꬚PÞñ(ßDŸªžñ(ßDŸª²i@cz>Ä£}~ªz>Ä£}~ªÉ­Rtë“]³ÛQrxÛ&Ø'¾ì"Û|°ó!¥…mæn)´TS€œ$’ÅèøôIú©èøôIú«WÔþž]Ôz ó6Ýdÿ¶nq»8b߆’ú÷¥n¥ÕíeÄ8yM¯!@'rHö¹kTƼNLßîì[KW)emÄYm”–Ôê^uA§^mÂBÂS¹yHbô|‰Fú$ýTô|‰Fú$ýU¨ëÎ%ZtSËvùk¹3iiÄ´ýÙkŒÄd,£˜R€óÈuõw°Ãn…%;–• fNrc‹¶{j.OdÛ÷Ý„[o–bD4¡Ð­¼ÍÅ2’ Šp„ƒ’@ؽâQ¾‰?U=âQ¾‰?Usÿ|)C­ÚºZï3íV;’ôØÑÚKÈ~Šò”µ-HS¸RßYKAׯR76q¨5ü;<»¨ôæmºÉÿlÜãvpÅ¿ %õïJÝK«Úˈpò›^B€NåÑèøôIú©èøôIú«]¹kTƼNLßîì[KW)emÄYm”–Ôê^uA§^mÂBÂS¹yH­½_5³c²Øa[¬Ë°Ê¶Ë²åÉiuĶì$©ÒŽÎ­«oœ°–Âö¸J”‚( ÓÑð>%è“õSÑð>%è“õVMr›íïRÛÞâ6«oQÌ\=#$©›"£Çì²nÛKˆRù\àµ]ڰ梂P´¤¡@tßGÀø”o¢OÕOGÀø”o¢OÕTrïÅ eƒtÆ£=e™3o!¥1!h~23ÌßÍBÛz»6(?ÙF+Æå­Sñ:3»±lq-\¦@m•·e´:R[S©yÕœmxe· Nåå ‹Ñð>%è“õSÑð>%è“õV£fÕ®'WêK,Ž:B/íöÄa´sØ ºëŠðÃMªBÖ¥¨ø­(R›B·zÑð>%è“õSÑð>%è“õW?ÔºžùHqz|iÛ$éÞÑè¥ò{>ÛDi èF‡\Z»ÙñÇ€³/WÍlÇì¶Vë2ì2­²ä,¹rZ]q-» *t£³«jÛç,%°½®’¥ ¤ tô|‰Fú$ýTô|‰Fú$ýUG.ñ!P¶X7Lj3ÖY“6òS‡ã#<ÍüÔ-°ç«³bƒùÝ”b¼gN¹1ÅÛ=µ'²m‚{îÂ-·Ë1"PèVÞfâ™ IE8 ÂAÉ l^ñ(ßDŸªžñ(ßDŸª¨åÞ$#ŠËéFzË2fÞCJbBÐüdg™¿š…¶õvlP;²ŒV®×ôíͨjÐÚ–ä܉-ʼn"°Je:´çkhrJ;@YQ()mk=Ä•PG£à|J7Ñ'ê§£à|J7Ñ'ê­G^q*Ó¢ž[·Ë]É›KN%§îË\f#!e”žC¯¨#½†pœ))Ü´©Æõ|ÖÌqŽËa…n³.Ã*Û.BË—%¥×Û°’§J;:¶­¾rÂ[ ÚàY*R @ 7OGÀø”o¢OÕOGÀø”o¢OÕTrïÅ eƒtÆ£=e™3o!¥1!h~23ÌßÍBÛz»6(?ÙF+PkøvywQè+ÌÛu“þÙ¹Æìá‹~KëÞ•º—Wµ—áå6¼…Ê £Ñð>%è“õSÑð>%è“õV£xâE¾Ûq¿G6 ü˜ºuÀ›ÍÁ¦¡·ÙÛ]*[‰S© ¹’–’·Ôw›ß»ÐÞñ(ßDŸªžñ(ßDŸª¨ô}ÒtýC¬âK˜Í¶ôÜX‰Ø‘ËhÛá¼S2~ד“ÞÇ€VëÎ%ZtSËvùk¹3iiÄ´ýÙkŒÄd,£˜R€óÈuõw°Ãn…%;–• ·z>Ä£}~ªz>Ä£}~ª×nZÕ1¯ AÓ7û»ÇÕÊdÙ[q[C¥%µ:—PiÆ×†[p°”î^R+oWÍlÇì¶Vë2ì2­²ä,¹rZ]q-» *t£³«jÛç,%°½®’¥ ¤ tô|‰Fú$ýTô|‰Fú$ýU“\óˆ¶ðÔ¤ÆÓKe†-—ûL Ä·›Þ¥2¢¤Åi'ñ‹2µ:A JPµ)L½z>Ä£}~ªz>Ä£}~ªäÜAÕ·Ë}ÛU;ÿy…&ÍÿeB‡kCöɈÓÉíòK ·:µ¥{Ÿck! îUب oGÀø”o¢OÕOGÀø”o¢OÕ\›\ñ.eŠ×ÅHÜÛϤlüßC=Ã"K¿ÙqžF÷ÊšykYæ« #vŠÜu¿‡g—u‚¼Í·Y?훜nη᤾½é[©u{YqSkÈP Ü RÚ=âQ¾‰?U=âQ¾‰?UQܵ®£WÝbb™Ò|ÎÞ”!%NlˆÔ³Êʰ~ ÔŽñOxáÔáÊ×Ì¢ýw´ÂÒú–çèY(bå&$VÔÓL4øZw8÷qÞ¨e.8 HÙÞoxG£à|J7Ñ'ê§£à|J7Ñ'ê­vå­Sñ:3»±lq-\¦@m•·e´:R[S©yÕœmxe· Nåå#k 1½âQ¾‰?U=âQ¾‰?UdÒ€Æô|‰Fú$ýTô|‰Fú$ýU“JÑð>%è“õSÑð>%è“õVM( oGÀø”o¢OÕOGÀø”o¢OÕY4 1½âQ¾‰?U=âQ¾‰?UdÒ€Æô|‰Fú$ýTô|‰Fú$ýU“JÑð>%è“õSÑð>%è“õVM( oGÀø”o¢OÕOGÀø”o¢OÕY4 1½âQ¾‰?U=âQ¾‰?UdÒ€Æô|‰Fú$ýUå2$6"<óvèÎ-¶Ô¤£•ë3ŽêIý@Ÿ`5X·†ÜvÑ1¦™ç¸¸ëJZÊFòRpžø)ëáÞ{A«]zVˆ»»*ÀÅ´·Éå-$’¼º3ÑHAݧÃñ°p¤©#òæ¿N.P›‰¡/ËnÓØ’çgÎòy¤: ÓD`’s·ý €”þcÐG}Ê<,Ñ\@Óoöã*rg–¹ÎÊq´0Ò[B’–Ôœ©JZ÷ !8©7¿tÇ´ŽáƒºžÇË\ˆ/ qá(8´#b‚Ôv PRqà B·$£}Î\e‡ÃæÄºZ^™ç{BÅ9„§j·(B‡QÞ+p(í×)iŸºÑ#I<^³Â*m ‚ô¦X“!{‹¡l¬•î 0RrÞê{À«Ñ¥‡»[–ºja§CS£ôxrûñ>+¥mOÑ“4.¬zÇ*Kr‘·›äŠ[EJHÞÞIm`¥AH>d$¥JÕë,d§(»¦o”\]žòM=´4öÕˆ"”¥¥)@~‚ð?ðC¥F3ûµ¹V›ÀÿÁ•ýÏîÖå\‹n”¥\©À=µ¡]~üºß}µ¡]~üºüÿ…íôhöH£‘áU²|*ÊG…VÉð¯~‰‚¡[#ÀÕ\Ÿ:´‘àj®Oz´ 3+%x×Ó?q—ý×¹ÿçýÆ+æi^5ôÏÜeÿuîùçqŠþ—¡ûuì<¼gf}JR¿©<¡JR€R” ¬5]mi¶Iº*å 0"ó»D¢úyLò”¤»½yÂv,+'ºRAÆ {H—;Ñ™‘%–\”áj:°•<°…,¥úÊÚ…«®£à íJR€R” ¥(+Î4ˆò[.F}§¶Ê›XP BŠTœ0 ADå^””¥¥)@+Nºi½Q+‰ýQQY™3°ÑË;Ž:¦\u¼ ÂJFòc ªåá!G)^3[( Sh;¥Ñz– A%“TçÓ =mSÒ{ñ›Šçgx<„·–ZFÝí¹…îQÜ@Ì•¥õ{õÞfžÔÐíïRQ*z^µ™Pèa¨åQÝ.¥´| ”‡tî'rNÁ¸×œiä¶\ŒûO -m•6° …©9a@‚<ˆ#Ê€çZ÷†sµ½H¸Z†¹†Úä 2]´¦Løí) Ùa‡Ôà Æ% Z™ØIRÞRV…-*EÅÓMê‰\H·êˆÚŠÌÌ1†ˆ.YÜqÕ0òã­à^R7“mW/ 9JñšÜi@i×鿵zS•î¿›ðœŒöMð‰á»á1ÉßâŸ[Y8z›AÝ.‹Ô°`êq,š§>˜aëjž“ߌÜW;;Áä%¼²Ò6ïmÌ/rŽàBûJžkιªuî+—`BVÚZD¹=t€œ)‰q…$åÄ)Hp¡Õ)Y#j}ªôÜë¥îÝz´^½>$iT銗ÿ£HS*t¶ /²…¨-½¹µäce¥­ á î“®Ú™‡õ?s:šJ^¹[ÓmP”´vFc-”ÉçmJ–Q o ZÂT•mZwÚPuÓMê‰\H·êˆÚŠÌÌ1†ˆ.YÜqÕ0òã­à^R7“mW/ 9Jñš­×œ7sTêÜW.À„­´´‰r,zé8Sâ IˈRáCªR²FÔ'"<–Ë‘Ÿiä­²¦ÖТ•'#Ì(G‘yW¥¤+‡±ZÔwýUo”Ì=GršÜ¨×$Dƈ¬1ÙïüuJ”Ù)^S±Ä!ѻҔ…©´Òè½K ‡ɪs醶©é=øÍÅs³¼B[Ë-#nöÜÂ÷(î \j½7:é{·^­¯DωD:b¥ÿèÒÊ-‚@KÀÇl¡j @ïnmyÙi@i×M7ª%q"ߪ#j+30 Æv ¹gqÇTÃËŽ·xIHÞLaµ\¼$(å+ÆitÓz¢W-ú¢6¢³3 ga¢ –wuL<¸ëx„”äÆUËÂBŽR¼f·PuÓMê‰\H·êˆÚŠÌÌ1†ˆ.YÜqÕ0òã­à^R7“mW/ 9Jñšñ¹iduœíCjÕ%æÒÄFî6'¤¹ ¨ÞÓkD¶“µn'˜£³rŽÀ¥(6ØNï^q¤G’Ùr3í<€µ¶TÚ€ZR¤äy…ò *kÞÎÔrõ"ájväjk$ÉvÒ™3ã´¦ƒe†S€7”%jga%KyIZ´©&«Ós®—»uêÑzôLø‘¤AS¦*_þ!L©ÒØ$¼ vÊ ´öæ×‘–”tÓz¢W-ú¢6¢³3 ga¢ –wuL<¸ëx„”äÆUËÂBŽR¼f°õ6ƒº]©`ÁÔâY5N}0ÃÖÕ='¿¸®vwƒÈKye¤mÞÛ˜^åÀ„ ö”yÐþ‘°kûW¥9^ëù¿ ÈÏdߘž¾þ)õ±å“¸Ò”­3¬ j;ýËNê‹X·™­Í\yö'¤¸ÒÓˆä-°RC W«Tzš­×¼3¨åêEÂÔ0íÈÔ6× I’í¥2gÇiMË >§n1(JÔÎÂJ–ò’´)iR:M(y¯8næ©Ô ¸®] [iiäXõÒp¦%Ä“—¥!‡T¥d¨Mö«Ós®—»uêÑzôLø‘¤AS¦*_þ!L©ÒØ$¼ vÊ ´öæ×‘†4ˆò[.F}§¶Ê›XP BŠTœ0 ADå^”´}Âí«ÕÚ§i˹®l9/ÏzÔËϼ†ijiK (¥m¶Z9$«Àއw¥¡jmtº/RÁƒ¨!IJjœúa‡­ªzO~3q\ìï–òËHÛ½·0½Ê;í)@i×鿵zS•î¿›ðœŒöMð‰á»á1ÉßâŸ[Y8z›AÝ.‹Ô°`êq,š§>˜aëjž“ߌÜW;;Áä%¼²Ò6ïmÌ/rŽàBûJžk^Þ/que²Õª™´Û5Sk7«g>J]TTFø' h¡–· ¶¥¹µÄ$·µéû¢nÚŠjçzjä‰Û9{y;bG³9;¿êû³ÓÖÆ:dÜWœiä¶\ŒûO -m•6° …©9a@‚<ˆ#Ê€Ð5ç ÜÕ:w˰!+m-"\‹º@Îĸ‚Â’râ¤8Pꔬ‘µ èt¥¥)@)JP R”•çDy-—#>ÓÈ [eM¬(¡E*NG˜P "ò¯JJR€R” ¥()^q¤G’Ùr3í<€µ¶TÚ€ZR¤äy…ò *Ò”¥¯)ƒtG“Ëu̶¡±¥ìZºx%Y>Ñh¯Zż-mZ&:ÛÈZ#­Ii¥©+p„žêJz‚|}”ƒ¨Ί¾ÌTI±Öâc4yòu* w#i})pùÏM½Fwcòþ¿Qu¦E§‡÷–ßb;AÅ2¤ò]IIøD纆šH>pIð' H¯ËªVrõtÓ·¸·«,Ç!ÏŠ½Í:€ˆ ¤‚RT’R¤¨©$‚$U}( =I»êK—¤¯sW6^À‚êÒ¢‘œ€3Œþ¬*²”¨I%dKm»²M=´4öÔE)JJR€ýàà‡JþŒg÷kr­7ÿ‚+ú1ŸÝ­Ê¹:Ý)J¹S€{kBºýùu¾ûkBºýùuùÿ Ú3èÑì‘G#«døU” ­“á^ýB¶Gª¹>ui#ÀÕ\Ÿ:õhfVJñ¯¦~ã/û¯sÿÏ;ûŒWÌÒ¼k韸ËþëÜÿóÎþãý/CöëØyxÎÌú”¥RyB”¥¬;çgô$îÙÛ;7fsØù¼ý›Nî_'áwã8å÷ó½qY” 8ŽŠi>ã­Œ@Óט¶½;«'ÜæZܱI‹Ì‚ä‰êŠXeÆÐå—#H £*G);SÌ ¡^/èÝMÇs€í¡åȼZ^ƒ¦Â•§O<©²¤2 HŒ–šr ÞÉRA·¥(*R#%ÎéJõ$»[ìN}øñŠw8ë2ÜŒ¤Ùæ6¤©#§\Ó ôÍi¶F™•hÓ»¨..Iqh.ïÔr¥¼Xï'¼þR­êGD‚{ÛpµVøòÔÛ+ZZ[ªJIA”}ƒ$ Ÿï U– i½,Ù·LlÚlë@,=` A*Æp…wÚDYS’VLþ™±iCËåÞnKÎÍŸï$µnÏ+oõÝs¹¯ñæç8:vÃ¥ /‚¾O{2žØQ¨¤`åäíCäÞhdõQ^T78 vôK­¹µÌFí¹Êšîçfs…ùnVqù5c9Nì;,éÅ$Û¦uè$ºÒ¶ü.$:¿Wrô娧º’²'<¹šäÛ”TÛ?.ù<æPØ¢²æYî€Tþrw4rœ’‚6¸¢s™±iCËåÞnKÎÍŸï$µnÏ+oõÝs¹¯ñæç6³'HíVÐmÓæHÁÖ‡‹D@tnÆå_Þ”B}UVb%ÈVÜÚæ#vÜåMws³9Âü·+8üš±œ§rÈg—3DÐÚ{I"δ±Ÿ *ç5HR5ø%RÉ ø9 åm “¹EyX qI¬É¶(©¶~]òyÌ¡°E!e̳ݩüäîhå9$/mqDÝé[„‡í«Q1Y)%EöœÙ‰H}ÏWr]9Jî·Y'HíVÐmÓæHÁÖ‡‹D@tnÆå_Þ”B}UT$¬^¥I¹¶ß©›”<¾]æä¼ìÙþòKVìò¶ÿ]×;šÿ`ñÞsƒ§l:PÂø+ä÷³)í…ŠF^NÑ„>A=æ†OUåCsŠoD¹ Û›\ÄnÛœ©®îvg8_–åg“V3”îòÎìRMºgY‚K­+oÂà‚C«õw(NZ€J{©3dS<¹šäÛ”TÛ?.ù<æPØ¢²æYî€Tþrw4rœ’‚6¸¢s™±iCËåÞnKÎÍŸï$µnÏ+oõÝs¹¯ñæç6³'HíVÐmÓæHÁÖ‡‹D@tnÆå_Þ”B}UVb%ÈVÜÚæ#vÜåMws³9Âü·+8üš±œ§rÈg—3PÓ¶(a|ò{Ù”öÂE#/'h žóC'ªŠò¡¹Å›aÒŠ›gåß'œÊÔR\Ë=Ð ŸÎNæŽS’BðF×NÇe!ؤ›tβ—ZVß…Á‡WêîP œµ”÷RS'HíVÐmÓæHÁÖ‡‹D@tnÆå_Þ”B}URÈg—2©›”<¾]æä¼ìÙþòKVìò¶ÿ]×;šÿ`ñÞsK¡´ö’Eibÿ>@UÎj¤j'ðJ¥’ðr ÊÚ'rŠò°â“[Ú%ÈVÜÚæ#vÜåMws³9Âü·+8üš±œ§u^•¸H~Úµ™Ò’T_i͘A‡Üõw(Ó” ŽëuW.ªO#Wâ¿r’m‡J*mŸ—|žs(lQHYs,÷@*9;š9NI Á\Q9ÌØ´¡åòï7%çfÏ÷’Z·g•·úî¹Ü×øóŽó›Y“¤v«h6és$`‚ëCÅ¢H :7cr‰/ïJ!>ª«1ä+nms»nr¦»¹Ùœá~[•œ~MXÎSºlŠg—3PÓ¶(a|ò{Ù”öÂE#/'h žóC'ªŠò¡¹Å›aÒŠ›gåß'œÊÔR\Ë=Ð ŸÎNæŽS’BðF×NÇe!ؤ›tβ—ZVß…Á‡WêîP œµ”÷RS'HíVÐmÓæHÁÖ‡‹D@tnÆå_Þ”B}URÈg—2©›”<¾]æä¼ìÙþòKVìò¶ÿ]×;šÿ`ñÞsƒ§l:PÂø+ä÷³)í…ŠF^NÑ„>A=æ†OUåCsŠoD¹ Û›\ÄnÛœ©®îvg8_–åg“V3”îòÎìRMºgY‚K­+oÂà‚C«õw(NZ€J{©+!ž\Írm‡J*mŸ—|žs(lQHYs,÷@*9;š9NI Á\Q9ÌØ´¡åòï7%çfÏ÷’Z·g•·úî¹Ü×øóŽó›Y“¤v«h6és$`‚ëCÅ¢H :7cr‰/ïJ!>ª«1ä+nms»nr¦»¹Ùœá~[•œ~MXÎS¹d3Ë™¢hm=¤‘gZX¿Ïsš¤)‰ü©d„ü…r¶†IÜ¢¼¬8¤ÖdÛ”TÛ?.ù<æPØ¢²æYî€Tþrw4rœ’‚6¸¢nô­ÂCöÕ¨À˜¬Î”’¢ûNlÄ‚$>竹@€®œ¥„w[¬‰“¤v«h6és$`‚ëCÅ¢H :7cr‰/ïJ!>ªªV/R¤ÜÛo‰TÍ‹J_.ór^vlÿy%«vy[®ëÍ0xï9ÁÓ¶(a|ò{Ù”öÂE#/'h žóC'ªŠò¡¹Å·¢\…mÍ®b7mÎT×w;3œ/Ër³É«ÊwaÙgHv)&Ý3¬‡A%Ö•·ápA!Õú»”§-@%=Ô™²)ž\Írm‡J*mŸ—|žs(lQHYs,÷@*9;š9NI Á\Q9ÌØ´¡åòï7%çfÏ÷’Z·g•·úî¹Ü×øóŽó›Y“¤v«h6és$`‚ëCÅ¢H :7cr‰/ïJ!>ª«1ä+nms»nr¦»¹Ùœá~[•œ~MXÎS¹d3Ë™¨iÛ”0¾ ù=ìÊ{aF¢‘ƒ—“´aOy¡“ÕEyPÜâM°éEM³òï“Îe €ê) .ežèOç'sG)É!x#kŠ'c²ÎìRMºgY‚K­+oÂà‚C«õw(NZ€J{©)“¤v«h6és$`‚ëCÅ¢H :7cr‰/ïJ!>ª©d3Ë™TÍ‹J_.ór^vlÿy%«vy[®ëÍ0xï9¥ÐÚ{I"δ±Ÿ *ç5HR5ø%RÉ ø9 åm “¹EyX qI­íä+nms»nr¦»¹Ùœá~[•œ~MXÎSº¯JÜ$?mZŒ ŠÌéI*/´æÌH ‚Cîz»” éÊPGuº‹+—U'‘«ñ_¹I6Ã¥6Ï˾O9”6¨¤,¹–{ ?œÍ§$…à®(œælZPòùw›’ó³gûÉ-[³ÊÛýw\îküyƒÇyͬÉÒ;U´tƹ’0Au¡âÑ$±¹D€÷¥ŸUU˜‰r·6¹ˆÝ·9S]ÜìÎp¿-ÊÎ?&¬g)Ý6E3Ë™¨iÛ”0¾ ù=ìÊ{aF¢‘ƒ—“´aOy¡“ÕEyPÜâM°éEM³òï“Îe €ê) .ežèOç'sG)É!x#kŠ'c²ÎìRMºgY‚K­+oÂà‚C«õw(NZ€J{©)“¤v«h6és$`‚ëCÅ¢H :7cr‰/ïJ!>ª©d3Ë™TÍ‹J_.ór^vlÿy%«vy[®ëÍ0xï9ÁÓ¶(a|ò{Ù”öÂE#/'h žóC'ªŠò¡¹Å·¢\…mÍ®b7mÎT×w;3œ/Ër³É«ÊwaÙgHv)&Ý3¬‡A%Ö•·ápA!Õú»”§-@%=Ô•Ï.f¹6Ã¥6Ï˾O9”6¨¤,¹–{ ?œÍ§$…à®(œælZPòùw›’ó³gûÉ-[³ÊÛýw\îküyƒÇyͬÉÒ;U´tƹ’0Au¡âÑ$±¹D€÷¥ŸUU˜‰r·6¹ˆÝ·9S]ÜìÎp¿-ÊÎ?&¬g)ܲåÌÑ46žÒH³­,_çÈ ¹ÍRDþ T²B~B9[C$îQ^VœRk2m‡J*mŸ—|žs(lQHYs,÷@*9;š9NI Á\Q7zVá!ûjÔ`LVgJIQ}§6bAsÕÜ @WNR€B;­ÖDÉÒ;U´tƹ’0Au¡âÑ$±¹D€÷¥ŸUU +©Rnm·ÄªfÅ¥/—y¹/;6¼’Õ»<­¿×uÎæ¿Ç˜;Nì;(¹ª)+ ÜHt(†s‡p@<åãÁÀ{»’6§aI0»!år®»ýMŸí%«wÞvþ?\åŸñæyóìKÖG"¤µxçHp úQnnè æ¯?ÔŒgññµ<š’¦\ÁsD«h\è}éP );þ’ç ú®0¼e'opª³ÝÌmß.±·v"¨gÔÎ>ã8s8ÜŸ§uD‡¬‰•j ^3¾BB¥yŸ’‘Žhߟ8Âó¿;{åU–Â쇕ʺïõ6´–­ßyÛøýs–Ç™çÌ;€YEÍQI\ènâC¡D0£œ;‚ç/3ÝÜ‘µ; J`¹¢U´.t>ôŒ(ÿIs†}W^2“·¸UX–'¬ŽEIjñÎþàAô¢Ü݇P3Í^©Ïããjy…4õ‘2­A«ÆwÈH@ô¢Ï3à’R1Íóð'^wço|ª€·Cw1·|¸jÆÝØŠ¡ŸS8øCŒáÌxãr|vÕzWÒn[V¥Ü!¿‰Ò’¥”¯VAÚÆ6¸ÝÝÊFÄl-ÖC ²W*ë¿ÔÙþÒZ·}çoãõÎYÿgŸ0î¬ÒOÙ¶•5zíÓ¤% ô²ÝÎ$$$gžæ©ÝøøØåºŽ%—á|Ë9‚æ‰VйÐûÒ0 Rwü$Îõ\ axÊNÞáUf!»˜Û¾\5cnìEPÏ©œ|!Æpæ;Nê‰Y*Ô¼g|„„J,ó> %#Ñ¿?q…ç~v÷Ê«-…Ù+•ußêlÿi-[¾ó·ñúç,ÿ3ϘwIQe5E%s¡»‰…ÂŽpx8ÏwrFÔì))‚æ‰VйÐûÒ0 Rwü$Îõ\ axÊNÞáUbXž²9%«Ç;úCÒ‹sv@HÏ5yþ¤c?©æÒCÖDʵ¯ß!!Ò‹<Ï‚IHÇ4oÏÀœayß½òªÝ ÜÆÝòá«wb*†}Lãá3‡1ãÉñÚwaÙEÍQI\ènâC¡D0£œ;‚ç/3ÝÜ‘µ; I…Ù+•ußêlÿi-[¾ó·ñúç,ÿ3ϘwbXž²9%«Ç;úCÒ‹sv@HÏ5yþ¤c?©æÐsÍ­¡s¡÷¤a@0¤ïø"Hœ3ê¸@Âñ”½ÂªÌCw1·|¸jÆÝØŠ¡ŸS8øCŒáÌxãr|vÕ²&U¨5xÎù ”Yæ|JF9£~~ã Îüíï•V[ ²W*ë¿ÔÙþÒZ·}çoãõÎYÿgŸ0îJúMËjÔ»„7ñ:RT Ò•êÈ €{C˜Æ×»¹HØ…ºÈ˜.h•m ½# …'Á@áŸUÂŒ¤íîUf’~Èõ´©«×hþ!(W¥–îq!!#<÷3ýHÆïÇÆÄo-ÖD‡¬‰•j ^3¾BB¥yŸ’‘Žhߟ8Âó¿;{åU qiþ&[¡»˜Û¾\5cnìEPÏ©œ|!Æpæ;Nì;(¹ª)+ ÜHt(†s‡p@<åãÁÀ{»’6§aI0»!år®»ýMŸí%«wÞvþ?\åŸñæyóìKÖG"¤µxçHp úQnnè æ¯?ÔŒgññµ<š’¦\ÁsD«h\è}éP );þ’ç ú®0¼e'opª³ÝÌmß.±·v"¨gÔÎ>ã8s8ÜŸ§uD‡¬‰•j ^3¾BB¥yŸ’‘Žhߟ8Âó¿;{åU–Â쇕ʺïõ6´–­ßyÛøýs–Ç™çÌ;€YEÍQI\ènâC¡D0£œ;‚ç/3ÝÜ‘µ; J`¹¢U´.t>ôŒ(ÿIs†}W^2“·¸UX–'¬ŽEIjñÎþàAô¢Ü݇P3Í^©Ïããjy…4õ‘2­A«ÆwÈH@ô¢Ï3à’R1Íóð'^wço|ª€·Cw1·|¸jÆÝØŠ¡ŸS8øCŒáÌxãr|vÕzWÒn[V¥Ü!¿‰Ò’¥”¯VAÚÆ6¸ÝÝÊFÄl-ÖC ²W*ë¿ÔÙþÒZ·}çoãõÎYÿgŸ0î¬ÒOÙ¶•5zíÓ¤% ô²ÝÎ$$$gžæ©ÝøøØåºŽ%—á|Ë9‚æ‰VйÐûÒ0 Rwü$Îõ\ axÊNÞáUf!»˜Û¾\5cnìEPÏ©œ|!Æpæ;Nê‰Y*Ô¼g|„„J,ó> %#Ñ¿?q…ç~v÷Ê«-…Ù+•ußêlÿi-[¾ó·ñúç,ÿ3ϘwIQe5E%s¡»‰…ÂŽpx8ÏwrFÔì))‚æ‰VйÐûÒ0 Rwü$Îõ\ axÊNÞáUbXž²9%«Ç;úCÒ‹sv@HÏ5yþ¤c?©æÒCÖDʵ¯ß!!Ò‹<Ï‚IHÇ4oÏÀœayß½òªÝ ÜÆÝòá«wb*†}Lãá3‡1ãÉñÚwaÙEÍQI\ènâC¡D0£œ;‚ç/3ÝÜ‘µ; I…Ù+•ußêlÿi-[¾ó·ñúç,ÿ3ϘwbXž²9%«Ç;úCÒ‹sv@HÏ5yþ¤c?©æÐsÍ­¡s¡÷¤a@0¤ïø"Hœ3ê¸@Âñ”½ÂªÌCw1·|¸jÆÝØŠ¡ŸS8øCŒáÌxãr|vÕ²&U¨5xÎù ”Yæ|JF9£~~ã Îüíï•V[ ²W*ë¿ÔÙþÒZ·}çoãõÎYÿgŸ0îJúMËjÔ»„7ñ:RT Ò•êÈ €{C˜Æ×»¹HØ…ºÈ˜.h•m ½# …'Á@áŸUÂŒ¤íîUf’~Èõ´©«×hþ!(W¥–îq!!#<÷3ýHÆïÇÆÄo-ÖD‡¬‰•j ^3¾BB¥yŸ’‘Žhߟ8Âó¿;{åU qiþ&[¡»˜Û¾\5cnìEPÏ©œ|!Æpæ;Nì;(¹ª)+ ÜHt(†s‡p@<åãÁÀ{»’6§aI0»!år®»ýMŸí%«wÞvþ?\åŸñæyóìKÖG"¤µxçHp úQnnè æ¯?ÔŒgññµ<š’¦\ÁsD«h\è}éP );þ’ç ú®0¼e'opª³ÝÌmß.±·v"¨gÔÎ>ã8s8ÜŸ§uD‡¬‰•j ^3¾BB¥yŸ’‘Žhߟ8Âó¿;{åU–Â쇕ʺïõ6´–­ßyÛøýs–Ç™çÌ;€YEÍQI\ènâC¡D0£œ;‚ç/3ÝÜ‘µ; J`¹¢U´.t>ôŒ(ÿIs†}W^2“·¸UX–'¬ŽEIjñÎþàAô¢Ü݇P3Í^©Ïããjy…4õ‘2­A«ÆwÈH@ô¢Ï3à’R1Íóð'^wço|ª€·Cw1·|¸jÆÝØŠ¡ŸS8øCŒáÌxãr|vÕzWÒn[V¥Ü!¿‰Ò’¥”¯VAÚÆ6¸ÝÝÊFÄl-ÖC ²W*ë¿ÔÙþÒZ·}çoãõÎYÿgŸ0î¬ÒOÙ¶•5zíÓ¤% ô²ÝÎ$$$gžæ©ÝøøØåºŽ%—á|Ë9‚æ‰VйÐûÒ0 Rwü$Îõ\ axÊNÞáUf!»˜Û¾\5cnìEPÏ©œ|!Æpæ;Nê‰Y*Ô¼g|„„J,ó> %#Ñ¿?q…ç~v÷Ê«-…Ù+•ußêlÿi-[¾ó·ñúç,ÿ3ϘwIQe5E%s¡»‰…ÂŽpx8ÏwrFÔì))‚æ‰VйÐûÒ0 Rwü$Îõ\ axÊNÞáUbXž²9%«Ç;úCÒ‹sv@HÏ5yþ¤c?©æÒCÖDʵ¯ß!!Ò‹<Ï‚IHÇ4oÏÀœayß½òªÝ ÜÆÝòá«wb*†}Lãá3‡1ãÉñÚwaÙEÍQI\ènâC¡D0£œ;‚ç/3ÝÜ‘µ; I…Ù+•ußêlÿi-[¾ó·ñúç,ÿ3ϘwbXž²9%«Ç;úCÒ‹sv@HÏ5yþ¤c?©æÐsÍ­¡s¡÷¤a@0¤ïø"Hœ3ê¸@Âñ”½ÂªÌCw1·|¸jÆÝØŠ¡ŸS8øCŒáÌxãr|vÕ²&U¨5xÎù ”Yæ|JF9£~~ã Îüíï•V[ ²W*ë¿ÔÙþÒZ·}çoãõÎYÿgŸ0îJúMËjÔ»„7ñ:RT Ò•êÈ €{C˜Æ×»¹HØ…ºÈ˜.h•m ½# …'Á@áŸUÂŒ¤íîUf’~Èõ´©«×hþ!(W¥–îq!!#<÷3ýHÆïÇÆÄo-ÖD‡¬‰•j ^3¾BB¥yŸ’‘Žhߟ8Âó¿;{åU qiþ&[¡»˜Û¾\5cnìEPÏ©œ|!Æpæ;Nì;(¹ª)+ ÜHt(†s‡p@<åãÁÀ{»’6§aI0»!år®»ýMŸí%«wÞvþ?\åŸñæyóìKÖG"¤µxçHp úQnnè æ¯?ÔŒgññµ<š’¦\ÁsD«h\è}éP );þ’ç ú®0¼e'opª³ÝÌmß.±·v"¨gÔÎ>ã8s8ÜŸ§uD‡¬‰•j ^3¾BB¥yŸ’‘Žhߟ8Âó¿;{åU–Â쇕ʺïõ6´–­ßyÛøýs–Ç™çÌ;€YEÍQI\ènâC¡D0£œ;‚ç/3ÝÜ‘µ; J`¹¢U´.t>ôŒ(ÿIs†}W^2“·¸UX–'¬ŽEIjñÎþàAô¢Ü݇P3Í^©Ïããjy…4õ‘2­A«ÆwÈH@ô¢Ï3à’R1Íóð'^wço|ª€·Cw1·|¸jÆÝØŠ¡ŸS8øCŒáÌxãr|vÕzWÒn[V¥Ü!¿‰Ò’¥”¯VAÚÆ6¸ÝÝÊFÄl-ÖC ²W*ë¿ÔÙþÒZ·}çoãõÎYÿgŸ0î¬ÒOÙ¶•5zíÓ¤% ô²ÝÎ$$$gžæ©ÝøøØåºŽ%—á|Ë9‚æ‰VйÐûÒ0 Rwü$Îõ\ axÊNÞáUf!»˜Û¾\5cnìEPÏ©œ|!Æpæ;Nê‰Y*Ô¼g|„„J,ó> %#Ñ¿?q…ç~v÷Ê«-…Ù+•ußêlÿi-[¾ó·ñúç,ÿ3ϘwISø¶&îå¹Í—%ÞsÉ 1–´…0zsÕÓ£7 e# ØRj´Ø’8}ûKÞŒG-¶–Y+ø>êB³”œ`nÏ^žÞÞöž]¡Õ9}øã »é—:$8€þrˆéÊë¸zþ ÞSXºZ,[‡àÁ-lH·\ZÞ T«œà‚HÇ€Æ1Ó©s"/ïˆvÚ¸h*aI$¥)_Â'Á i 6œíÉÜ£”§ó¿Tµý¢-¿H^d°äµ­öã¶ ü…½€‡²0VI¹éœwŽ+h)JJR€“Om =´R” ¥(Ð^þt¯èÆv·*Óxø!Ò¿£ýÚÜ«‘c­Ò”«•8¶´+¯ß—[ï¶´+¯ß—_Ÿð½£>Ér<*¶O…YHðªÙ>ïÑ0T+dx«“çV’< UÉó¯V†ed¯úgî2ÿº÷?üó¿¸Å|Í+ƾ™ûŒ¿î½Ïÿ<ïî1_Òô?n½‡—ŒìÏ )Uº‹PXtÜ$NÔW»mž*Ü !ùòÃjY„…,€U„¨ãÇû*²Á¯´N¡½¦Ë§õ]šó<ÆrQjß-64…!*R‹d„õuNN3´ãú“Ê6ZR””¥¥)@b^®í6y·Y{û<(îHw`ʶ!%GÌàåú{Ž ‹Ž#“®\$6Ô¢!¸R„¥°Þó´ŽæåôÈW«êƒ´×Yx8YXehC…'b–ÉÈÈþìñª=,.hÓzX*t0…¶ÖÔ†’QÈÈIøa¸„…õÚ¡’•lI®SUô^Õݰµ0Q‹Ú)ÊO†Y¨éùÂWó^ÃZG¸h­¹ºLFí¹Ì';¹ÙœàynVqù5c9Nï wxvÛ!®7V·V¼; Ü„­aI>*éµyè|¬ÜIéènæ6ï— XÛ»T3êgqœ9nOŽÓ»Ê.jŠJçCw !…áÜ9xðpžî䩨Ri—Þ^ëú}D_°©ú±þž=Çž¼ô5·q¸!зȄîI@NW‚:9õAÀõ^èã÷ ·7IˆÝ·9„çw;3œ-ÊÎ?&¬g)ݾL4J¶…·ޑ…“¿à‰ pϪá ÆRv÷ «1 ÜÆÝòá«wb*†}Lãá3‡1ãÉñÚw2â;ËÝPUú# Ÿ«á9FžãßÓI•s¸6µK}_ Õ¥Oå?Žç@•øx6 Žâ+!î<ðíç¡­»À!…¾D'pÚJr¼Ð)Ìx/ª¨ªÞô¯¤Ü¶­K¸C¥%J )^¬‚´9Œmp»»”ˆØ[¬‰‚æ‰VйÐûÒ0 Rwü$Îõ\ axÊNÞáUBŽ#¼½×õ:ýwþ…KÿV?Âhhã÷ ·7IˆÝ·9„çw;3œ-ÊÎ?&¬g)ÝánãÏÛd"UÆàÊÖêׇa;•¬)'Å]6¯=‚€;‰== ÜÆÝòá«wb*†}Lãá3‡1ãÉñÚwaÙEÍQI\ènâC¡D0£œ;‚ç/3ÝÜ‘µ; LåÄw—ºþ¢:þˆ¿aSõcü'<{<;yèknãpC¡o‘ Ü6’€œ¯t s êƒê*½ÑÇî+nn“»ns Îîvg8[•œ~MXÎS»|˜.h•m ½# …'Á@áŸUÂŒ¤íîVb¹»åÃV6îÄU ú™ÇÂgcÇ“ã´îeÄw—ºþ «ôG?V?Âs wxvÛ!®7V·V¼; Ü„­aI>*éµyè|¬ÜI=Çž¼ô5·q¸!зȄîI@NW‚:9õAÀõ]Ê.jŠJçCw !…áÜ9xðpžî䩨RSÍ­¡s¡÷¤a@0¤ïø"Hœ3ê¸@Âñ”½ÂªeÄw—ºþ¢:þ‰·aRÿÕðš8ýÃEmÍÒb7mÎa9ÝÎÌçËr³É«Êw`iî=ðí0T™W;ƒkT·Õð±QJTþSøît _€Wƒj(î"ºº¹»åÃV6îÄU ú™ÇÂgcÇ“ã´î«Ò¾“rÚµ.á üN”•(4¥z² Ðæ1µÀîîR6#an£."ÿ‰{¯ê/×ôF^§êÇøMî<ðíç¡­»À!…¾D'pÚJr¼Ð)Ìx/ª¨ª÷G¸h­¹ºLFí¹Ì';¹ÙœàynVqù5c9Níò`¹¢U´.t>ôŒ(ÿIs†}W^2“·¸UYˆnæ6ï— XÛ»T3êgqœ9nOŽÓºrâ;ËÝQU_¢8Щú±þ˜[¸óöÙ•q¸2µºµáØNä%k IñWM«ÏCà…`âIî<ðíç¡­»À!…¾D'pÚJr¼Ð)Ìx/ª¨ªèvQsTRW:¸èQ (çà€yËǃ€ ÷w$mNÂ’˜.h•m ½# …'Á@áŸUÂŒ¤íîS.#¼½×õ×ôM» —þ¬„ÐÑÇî+nn“»ns Îîvg8[•œ~MXÎS»ÂÝÇž¶ÈD«Á•­Õ¯Âw!+XROŠºm^z+wzz¹»åÃV6îÄU ú™ÇÂgcÇ“ã´îò‹š¢’¹ÐÝćBˆaG8wÎ^<g»¹#jv–\Gy{¯ê'¯è‹ö?V?ÂsǸó÷ž†¶î7„:ùÃi( ÊðG@§1ྨ8¢«Ý~ᢶæé1¶ç0œîçfså¹YÇäÕŒå;·É‚æ‰VйÐûÒ0 Rwü$Îõ\ axÊNÞáUf!»˜Û¾\5cnìEPÏ©œ|!Æpæ;Næ\Gy{¯ê ¿Dq¡Sõcü'(ÓÜ{áÚ`©2®wÖ©o«áb:¢”©ü§ñÜ迯ÔQÜEd=Çž¼ô5·q¸!зȄîI@NW‚:9õAÀõ[Þ•ô›–Õ©woât¤©A¥+ÕAö‡1®7wr‘± u‘0\Ñ*Ú:zF Nÿ‚$€9Ã>«„ /IÛÜ*¨QÄw—ºþ¢g_¢nÿЩêÇøM ~ᢶæé1¶ç0œîçfså¹YÇäÕŒå;¼-ÜyáÛl„J¸ÜZÝZðì'rµ…$ø«¦Õç¡ðB°q'§¡»˜Û¾\5cnìEPÏ©œ|!Æpæ;Nì;(¹ª)+ ÜHt(†s‡p@<åãÁÀ{»’6§aIœ¸Žò÷_ÔG_Ñì*~¬„çqç‡o= mÜnt-ò!;†ÒP•àŽNcÁ}Pp=EWº8ýÃEmÍÒb7mÎa9ÝÎÌçËr³É«Êwo“Í­¡s¡÷¤a@0¤ïø"Hœ3ê¸@Âñ”½ÂªÌCw1·|¸jÆÝØŠ¡ŸS8øCŒáÌxãr|v̸Žò÷_Ô~ˆãB§êÇøNanãÏÛd"UÆàÊÖêׇa;•¬)'Å]6¯=‚€;‰'¸ó÷ž†¶î7„:ùÃi( ÊðG@§1ྨ8¢«¡ÙEÍQI\ènâC¡D0£œ;‚ç/3ÝÜ‘µ; J`¹¢U´.t>ôŒ(ÿIs†}W^2“·¸UL¸Žò÷_ÔG_Ñ6ì*_ú±þCG¸h­¹ºLFí¹Ì';¹ÙœàynVqù5c9Nì =Ǿ¦ “*çpmj–ú¾#ª)JŸÊÎ+ð ðm@%ÄWWCw1·|¸jÆÝØŠ¡ŸS8øCŒáÌxãr|vÕzWÒn[V¥Ü!¿‰Ò’¥”¯VAÚÆ6¸ÝÝÊFÄl-ÔeÄ_ñ/uýEúþˆËØTýXÿ ¢=Çž¼ô5·q¸!зȄîI@NW‚:9õAÀõ^èã÷ ·7IˆÝ·9„çw;3œ-ÊÎ?&¬g)ݾL4J¶…·ޑ…“¿à‰ pϪá ÆRv÷ «1 ÜÆÝòá«wb*†}Lãá3‡1ãÉñÚwN\Gy{¯ê*«ôG?V?Âs wxvÛ!®7V·V¼; Ü„­aI>*éµyè|¬ÜI=Çž¼ô5·q¸!зȄîI@NW‚:9õAÀõ]Ê.jŠJçCw !…áÜ9xðpžî䩨RSÍ­¡s¡÷¤a@0¤ïø"Hœ3ê¸@Âñ”½ÂªeÄw—ºþ¢:þ‰·aRÿÕðš8ýÃEmÍÒb7mÎa9ÝÎÌçËr³É«Êwx[¸óöÙ•q¸2µºµáØNä%k IñWM«ÏCà…`âOOCw1·|¸jÆÝØŠ¡ŸS8øCŒáÌxãr|vØvQsTRW:¸èQ (çà€yËǃ€ ÷w$mN’ˈï/uýDõý~§êÇøNx÷xvóÐÖÝÆà‡Bß"¸m%9^èæ<ÕÔU{£Ü4VÜÝ&#vÜæÜìÎp<·+8üš±œ§vù0\Ñ*Ú:zF Nÿ‚$€9Ã>«„ /IÛÜ*¬Ä7swˆ¬m݈ªõ3„8ÎÇŽ7'ÇiÜˈï/uýAWèŽ4*~¬„å{|;L&UÎàÚÕ-õ|,GTR•?”þ;WààÚ€J;ˆ¬‡¸ó÷ž†¶î7„:ùÃi( ÊðG@§1ྨ8¢«{Ò¾“rÚµ.á üN”•(4¥z² Ðæ1µÀîîR6#an²& š%[BçCïH€aIßðD8gÕp…ã);{…U 8Žò÷_ÔLëôMßú/ýXÿ ¡£Ü4VÜÝ&#vÜæÜìÎp<·+8üš±œ§w…»<;m‰Wƒ+[«^„îBV°¤ŸtÚ¼ô>Vî$ôô7swˆ¬m݈ªõ3„8ÎÇŽ7'Çi݇e5E%s¡»‰…ÂŽpx8ÏwrFÔì)3—Þ^ëúˆëú"ý…OÕðœñî<ðíç¡­»À!…¾D'pÚJr¼Ð)Ìx/ª¨ª÷G¸h­¹ºLFí¹Ì';¹ÙœàynVqù5c9Níò`¹¢U´.t>ôŒ(ÿIs†}W^2“·¸UYˆnæ6ï— XÛ»T3êgqœ9nOŽÓ¹—Þ^ëú‚¯ÑhTýXÿ Ì-ÜyáÛl„J¸ÜZÝZðì'rµ…$ø«¦Õç¡ðB°q$÷xvóÐÖÝÆà‡Bß"¸m%9^èæ<ÕÔUt;(¹ª)+ ÜHt(†s‡p@<åãÁÀ{»’6§aIL4J¶…·ޑ…“¿à‰ pϪá ÆRv÷ ©—Þ^ëúˆëú&Ý…KÿV?Âhhã÷ ·7IˆÝ·9„çw;3œ-ÊÎ?&¬g)ݧ¸÷ôÁRe\î ­RßWÂÄuE)SùOã¹Ð%~^ ¨£¸Šêènæ6ï— XÛ»T3êgqœ9nOŽÓº¯JúMËjÔ»„7ñ:RT Ò•êÈ €{C˜Æ×»¹HØ…ºŒ¸‹þ%¿_Ñ{ Ÿ«á4G¸ó÷ž†¶î7„:ùÃi( ÊðG@§1ྨ8¢«Ý~ᢶæé1¶ç0œîçfså¹YÇäÕŒå;·É‚æ‰VйÐûÒ0 Rwü$Îõ\ axÊNÞáUf!»˜Û¾\5cnìEPÏ©œ|!Æpæ;Néˈï/uýEU~ˆãB§êÇøNanãÏÛd"UÆàÊÖêׇa;•¬)'Å]6¯=‚€;‰'¸ó÷ž†¶î7„:ùÃi( ÊðG@§1ྨ8¢«¡ÙEÍQI\ènâC¡D0£œ;‚ç/3ÝÜ‘µ; J`¹¢U´.t>ôŒ(ÿIs†}W^2“·¸UL¸Žò÷_ÔG_Ñ6ì*_ú±þCG¸h­¹ºLFí¹Ì';¹ÙœàynVqù5c9Nï wxvÛ!®7V·V¼; Ü„­aI>*éµyè|¬ÜIéènæ6ï— XÛ»T3êgqœ9nOŽÓ»Ê.jŠJçCw !…áÜ9xðpžî䩨RYqåž¿¢/ØTýXÿ ÏãÏÞzÛ¸Üè[äBw ¤ '+ÁœÇ‚ú àzНtqû†ŠÛ›¤ÄnÛœÂs»™Î–åg“V3”îß& š%[BçCïH€aIßðD8gÕp…ã);{…U˜†îcnùpÕ»±C>¦qð‡ØñÆäøí;™qå*ýÆ…OÕðœ£Oqï‡i‚¤Ê¹ÜZ¥¾¯…ˆêŠR§òŸÇs Jü¼P Gq÷xvóÐÖÝÆà‡Bß"¸m%9^èæ<ÕÔUozWÒn[V¥Ü!¿‰Ò’¥”¯VAÚÆ6¸ÝÝÊFÄl-ÖDÁsD«h\è}éP );þ’ç ú®0¼e'opª¡GÞ^ëú‰~‰»ÿB¥ÿ«á44qû†ŠÛ›¤ÄnÛœÂs»™Î–åg“V3”îð·qç‡m²*ãpekukðÈJÖ“â®›Wž‡Á ÀÄžž†îcnùpÕ»±C>¦qð‡ØñÆäøí;°ì¢æ¨¤®t7q!ТQÎÁó—îîHÚ…&râ;ËÝQD_°©ú±þž=Çž¼ô5·q¸!зȄîI@NW‚:9õAÀõ^èã÷ ·7IˆÝ·9„çw;3œ-ÊÎ?&¬g)ݾL4J¶…·ޑ…“¿à‰ pϪá ÆRv÷ «1 ÜÆÝòá«wb*†}Lãá3‡1ãÉñÚw2â;ËÝPUú# Ÿ«á9…»<;m‰Wƒ+[«^„îBV°¤ŸtÚ¼ô>Vî$žãÏÞzÛ¸Üè[äBw ¤ '+ÁœÇ‚ú àzŠ®‡e5E%s¡»‰…ÂŽpx8ÏwrFÔì))‚æ‰VйÐûÒ0 Rwü$Îõ\ axÊNÞáU2â;ËÝQDÛ°©êÇøM ~ᢶæé1¶ç0œîçfså¹YÇäÕŒå;°4÷øv˜*L«Áµª[êøXލ¥*)üw:¯À+Áµ”w]] ÜÆÝòá«wb*†}Lãá3‡1ãÉñÚwUé_I¹mZ—p†þ'JJ”R½YhsÚàww)°·Q—Ľ×õëú#/aSõcü&ˆ÷xvóÐÖÝÆà‡Bß"¸m%9^èæ<ÕÔU{£Ü4VÜÝ&#vÜæÜìÎp<·+8üš±œ§vù0\Ñ*Ú:zF Nÿ‚$€9Ã>«„ /IÛÜ*¬Ä7swˆ¬m݈ªõ3„8ÎÇŽ7'ÇiÝ9qåª¯ÑhTýXÿ Ëbqó‡±á,¿2æÞ·Ò¡¹¼¥K N2¥U};Àa#jN×byÄð⇋Rv°…íqÌ5Ð%H$‚¬t#¨ÈèJ¸¶&îå¹Í—%ÞsÉ 1–´…0zsÕÓ£7 e# ØRiìK}žCqM.Sˆµ%Ii‚¦Ô±ÊÊP’ PV02:稺SUó´ýŠß»1b§„’ŽÍ Gži)_ÙhFÜyüõkÜ)Ví~‰&ÝÙ>ðâV‡[^^ÛÐ6Óhœ´î=˜Uú‡«cò´Þ _£®±7G†7N•Ï߇ÕÑ'zñŒõ¼ÇAâ¯ËÊèc¥()JM=´4öÐJR€R” ?E¸=?MX¸¢îWùÈ,9kh.Lée„n%@ ÅiNpŸ È×ÚÇO«…Z®ý¢®69òí¶ç–܈S‘Ý„¤¤äx€ AÇPGJÔ´¯á¼>–Ò:ÇQØSͰ´ÜÈ2e$-)QR€PÎRpR¡àz¤#Tú³Pð‡Oðÿ£4f¨²+6·ÐË(˜…;!Ò“•(þ2Õõä+™cëšR•b§Í:IÏÕ:uw©ZãRCqËŒæCS 4Ú–óH|u+ÕB|Tzæ®ÂFr½o©Ô½«yÿþZ±àgàñ¥®¿ÿ±“T*°ÿ·&_=Åi?û~óþÜ紿벑êöÿCïާͬ« An‚òGnº§yù™GƒÐÏŽ²Ô‡ÿà[¿”¯äðjÞ|u~¢?ü5»ùJÔnÚãX—ìl÷MI&öFÎq‡im¥²RTˆ‡6J‚R;APø@Wµ*ÙÙ¼kYQ¬–—®3-¤jg-ÎIÜ'¥®(·½#áÉq”9¹ cÕJŠp¢“mš’ÿjòDu³ï3ÆõÂ?h³Í»Üµ•ý˜Pc¹&K½ŽÜ­¡%JV2N'_Û<ÓÒ]Ó:Âðó‘œ >”G¶(´²”¬%@Dî«J°|”[Å™——ô_"=¬†ÅŽÔaˆï17ä4©NºvâœSiåìHRCêÖÅxÔWÅ^.v†®ÞmÝVÅ¥©¡–Ê¡°«c2HN䔕)Ò¤°®®Ž‡Tõû«È޲\Ì#ÀëñÔ—³þ0­ŸÊU—…ë²4¦¬Ü@ÕÖÖÖ¢¥""`4N2HLQ× ýB¬xar¹Í{UB¹_èZï†y<¦Ðyb,e”«–J‚ÜXQÇŽz€7*²„bôD97½š4tôg¤q?\<äW ±Ö· ©L¬¡H*A1»ªÚµ§#®¡àM .‹šÔåñ?\*S-­¦Ÿ.A.! )+HWfÈJŠH Bsà+y¥^äg¸»÷ÊÆ¾úxËSÜ]ûåc_}ŒnmÙhB“‘‘U‘ЃVUϵwÿ´Mý²ÓîÚÍý³eÿ<ßÚ«w•ÍŒ‰0Ìi,/;\iÀ´« Šùóˆ¿÷ñÿ—WîWLûž?Úcÿ(}T²ûÛæ|]¿×þ´íó>.ßëÿZšRÈÛæ|]¿×þ´íó>.ßëÿZšRÈÛæ|]¿×þ´íó>.ßëÿZšRÈÛæ|]¿×þ´íó>.ßëÿZšRÈÛæ|]¿×þ´íó>.ßëÿZšRÈÛæ|]¿×þ´íó>.ßëÿZšRÈÛæ|]¿×þ´íó>.ßëÿZšRÈÛæ|]¿×þ´íó>.ßëÿZšRÈÛæ|]¿×þ´íó>.ßëÿZšRÈÛæ|]¿×þ´íó>.ßëÿZšRÈÛæ|]¿×þ´íó>.ßëÿZšRÈÛæ|]¿×þµü¦ã)YÚËJÇŽþµU­?îÄïÿp~ð­MÿÞÈ£ÕÿÝ5¶Ž T£*·ÜyøŒ{£‰§C-óq¹»öùŸoõÿ­;|Ï‹·úÿÖ¦•ŠÈôíó>.ßëÿZvùŸoõÿ­M)díó>.ßëÿZvùŸoõÿ­M)díó>.ßëÿZvùŸoõÿ­M)díó>.ßëÿZvùŸoõÿ­M)díó>.ßëÿZvùŸoõÿ­M)díó>.ßëÿZvùŸoõÿ­M)díó>.ßëÿZvùŸoõÿ­M)díó>.ßëÿZvùŸoõÿ­M)díó>.ßëÿZvùŸoõÿ­M)díó>.ßëÿZvùŸoõÿ­M)díó>.ßëÿZvùŸoõÿ­M)díó>.ßëÿZvùŸoõÿ­M)díó>.ßëÿZvùŸoõÿ­M)díó>.ßëÿZvùŸoõÿ­M)díó>.ßëÿZvùŸoõÿ­M)díó>.ßëÿZvùŸoõÿ­M)díó>.ßëÿZvùŸoõÿ­M)díó>.ßëÿZvùŸoõÿ­M)d ½KWû|h3SmǸŸ ´°\Žèqç=ÒGQã*/°ÝL-ö”ÓŒ“µm,R|Rsžÿ…ZÒ«(Fk,–…g5–Jè »Zd] Fƒ6uÁÖb…AuNqç·¯‡LøV}ƒdµ3m…rš¼µeKQ9R”|É$Ÿª¬)Q0ƒºEaJwŠÔµ÷]xøœOÔ~Õ*ª•ÐèÿÙxymon-4.3.28/docs/manpages/0000775000076400007640000000000013037531512015735 5ustar rpmbuildrpmbuildxymon-4.3.28/docs/manpages/man8/0000775000076400007640000000000013037531512016600 5ustar rpmbuildrpmbuildxymon-4.3.28/docs/manpages/man8/xymonlaunch.8.html0000664000076400007640000000771213037531445022215 0ustar rpmbuildrpmbuild Manpage of XYMONLAUNCH

XYMONLAUNCH

Section: Maintenance Commands (8)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

xymonlaunch - Master program to launch other Xymon programs

 

SYNOPSIS

xymonlaunch [options]

 

DESCRIPTION

xymonlaunch(8) is the main program that controls the execution and scheduling of all of the components in the Xymon system.

xymonlaunch allows the administrator to add, remove or change the set of Xymon applications and extensions without restarting Xymon - xymonlaunch will automatically notice any changes in the set of tasks, and change the scheduling of activities accordingly.

xymonlaunch also allows the administrator to setup specific logfiles for each component of the Xymon system, instead of getting output from all components logged to a single file.

 

OPTIONS

--env=FILENAME
Loads the environment from FILENAME before starting other tools. The environment defined by FILENAME is the default, it can be overridden by the ENVFILE option in tasks.cfg(5)

--config=FILENAME
This option defines the file that xymonlaunch scans for tasks it must launch. A description of this file is in tasks.cfg(5) If not specified, files at /etc/tasks.cfg, /etc/xymon/tasks.cfg, and /etc/xymon-client/clientlaunch.cfg are searched for, as well as ~/server/etc/tasks.cfg.

--log=FILENAME
Defines the logfile where xymonlaunch logs information about failures to launch tasks and other data about the operation of xymonlaunch. Logs from individual tasks are defined in the tasks.cfg file. By default this is logged to stdout.

--pidfile=FILENAME
Filename which xymonlaunch saves its own process-ID to. Commonly used by automated start/stop scripts.

--verbose
Logs the launch of all tasks to the logfile. Note that the logfile may become quite large if you enable this.

--dump
Just dump the contents of the tasks.cfg file after parsing it. Used for debugging.

--debug
Enable debugging output while running.

--no-daemon
xymonlaunch normally detaches from the controlling tty and runs as a background task. This option keeps it running in the foreground.

 

STARTING TASKS

xymonlaunch will read the configuration file and start all of the tasks listed there.

If a task completes abnormally (i.e. terminated by a signal or with a non-zero exit status), then xymonlaunch will attempt to restart it 5 times. If it still will not run, then the task is disabled for 10 minutes. This will be logged to the xymonlaunch logfile.

If the configuration file changes, xymonlaunch will re-read it and notice any changes. If a running task was removed from the configuration, then the task is stopped. If a new task was added, it will be started. If the command used for a task changed, or it was given a new environment definition file, or the logfile was changed, then the task is stopped and restarted with the new definition.

 

SEE ALSO

tasks.cfg(5), xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
STARTING TASKS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man8/xymond_sample.8.html0000664000076400007640000000345013037531445022522 0ustar rpmbuildrpmbuild Manpage of XYMOND_SAMPLE

XYMOND_SAMPLE

Section: Maintenance Commands (8)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

xymond_sample - example of a xymond worker module  

SYNOPSIS

xymond_channel --channel=status xymond_sample [options]

 

DESCRIPTION

xymond_sample is a worker module for xymond, and as such it is normally run via the xymond_channel(8) program. It receives messages from xymond via stdin, and simply displays these on stdout. It can be used with all types of xymond channels.

xymond_sample is not designed to actually run, except as a demonstration. The purpose of this tool is to show how xymond worker modules can be implemented to handle different tasks that need to hook into the xymond processing.

 

OPTIONS

--timeout=N
Read messages with a timeout of N seconds.

--debug
Enable debugging output.

 

SEE ALSO

xymond_channel(8), xymond(8), xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man8/trimhistory.8.html0000664000076400007640000001060013037531445022233 0ustar rpmbuildrpmbuild Manpage of TRIMHISTORY

TRIMHISTORY

Section: Maintenance Commands (8)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

trimhistory - Remove old Xymon history-log entries  

SYNOPSIS

trimhistory --cutoff=TIME [options]

 

DESCRIPTION

The trimhistory tool is used to purge old entries from the Xymon history logs. These logfiles accumulate information about all status changes that have occurred for any given service, host, or the entire Xymon system, and is used to generate the event- and history-log webpages.

Purging old entries can be done while Xymon is running, since the tool takes care not to commit updates to a file if it changes mid-way through the operation. In that case, the update is aborted and the existing logfile is left untouched.

Optionally, this tool will also remove logfiles from hosts that are no longer defined in the Xymon hosts.cfg(5) file. As an extension, even logfiles from services can be removed, if the service no longer has a valid status-report logged in the current Xymon status.

 

OPTIONS

--cutoff=TIME
This defines the cutoff-time when processing the history logs. Entries dated before this time are discarded. TIME is specified as the number of seconds since the beginning of the Epoch. This is easily generated by the GNU date(1) utility, e.g. the following command will trim history logs of all entries prior to Oct. 1st 2004:


    trimhistory --cutoff=`date +%s --date="1 Oct 2004"`

--outdir=DIRECTORY
Normally, files in the XYMONHISTDIR directory are replaced. This option causes trimhistory to save the shortened history logfiles to another directory, so you can verify that the operation works as intended. The output directory must exist.

--drop
Causes trimhistory to delete files from hosts that are not listed in the hosts.cfg(5) file.

--dropsvcs
Causes trimhistory to delete files from services that are not currently tracked by Xymon. Normally these files would be left untouched if only the host exists.

--droplogs
Process the XYMONHISTLOGS directory also, and delete status-logs from events prior to the cut-off time. Note that this can dramatically increase the processing time, since there are often lots and lots of files to process.

--progress[=N]
This will cause trimhistory to output a status line for every N history logs or status-log collections it processes, to indicate how far it has progressed. The default setting for N is 100.

--env=FILENAME
Loads the environment from FILENAME before executing trimhistory.

--debug
Enable debugging output.

 

FILES

$XYMONHISTDIR/allevents
The eventlog of all events that have happened in Xymon.

$XYMONHISTDIR/HOSTNAME
The per-host eventlogs.

$XYMONHISTDIR/HOSTNAME.SERVICE
The per-service eventlogs.

$XYMONHISTLOGS/*/*
The historical status-logs.

 

ENVIRONMENT VARIABLES

XYMONHISTDIR
The directory holding all history logs.

XYMONHISTLOGS
The top-level directory for the historical status-log collections.

HOSTSCFG
The location of the hosts.cfg file, holding the list of currently known hosts in Xymon.

 

SEE ALSO

xymon(7), hosts.cfg(5)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
FILES
ENVIRONMENT VARIABLES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man8/xymond_history.8.html0000664000076400007640000000764513037531445022754 0ustar rpmbuildrpmbuild Manpage of XYMOND_HISTORY

XYMOND_HISTORY

Section: Maintenance Commands (8)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

xymond_history - xymond worker module for logging status changes  

SYNOPSIS

xymond_channel --channel=stachg xymond_history [options]

 

DESCRIPTION

xymond_history is a worker module for xymond, and as such it is normally run via the xymond_channel(8) program. It receives xymond status-change messages from the "stachg" channel via stdin, and uses these to update the history logfiles in a manner that is compatible with the standard Big Brother daemon, bbd.

 

OPTIONS

--histdir=DIRECTORY
The directory for the history files. If not specified, the directory given by the XYMONHISTDIR environment is used.

--histlogdir=DIRECTORY
The directory for the historical status-logs. If not specified, the directory given by the XYMONHISTLOGS environment is used.

--minimum-free=N
Sets the minimum percentage of free filesystem space on the $XYMONHISTLOGS directory. If there is less than N% free space, xymond_history will not save the detailed status-logs. Default: 5

--pidfile=FILENAME
xymond_history writes the process-ID it is running with to this file. This is for use in automated startup scripts. The default file is $XYMONSERVERLOGS/xymond_history.pid.

--debug
Enable debugging output.

 

ENVIRONMENT

XYMONALLHISTLOG
This environment variable controls if the $XYMONHISTDIR/allevents logfile is updated. This file is used by the event-log display on the nongreen html page and the eventlog-webpage, among other things. You can disable it by setting XYMONALLHISTLOGS=FALSE, but this is not recommended.

XYMONHOSTHISTLOG
This environment variable controls if the $XYMONHISTDIR/HOSTNAME logfile is updated. This file holds a list of all status changes seen for a single host, but is not used by any of the standard Xymon tools. If you do not want to save this, you can disable it by setting XYMONHOSTHISTLOG=FALSE.

SAVESTATUSLOG
This environment variable controls if the historical status-logs are saved whenever a status change occurs. These logfiles are stored in the $XYMONHISTLOGS directory, and are used for the detailed log-display of a status from the Xymon "History" page. If you do not want to save these, you can disable it by setting SAVESTATUSLOG=FALSE. If you want to save all except some specific logs, use SAVESTATUSLOG=TRUE,!TEST1[,!TEST2...] If you want to save none except some specific logs, use SAVESTATUSLOG=FALSE,TEST1[,TEST2...]
NOTE: Status logs will not be saved if there is less than 5% free space on the filesystem hosting the $XYMONHISTLOGS directory. The threshold can be tuned via the "--minimum-free" option.

 

FILES

This module does not rely on any configuration files.

 

SEE ALSO

xymond_channel(8), xymond(8), xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
ENVIRONMENT
FILES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man8/xymond_client.8.html0000664000076400007640000001224113037531445022515 0ustar rpmbuildrpmbuild Manpage of XYMOND_CLIENT

XYMOND_CLIENT

Section: Maintenance Commands (8)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

xymond_client - xymond worker module for client data  

SYNOPSIS

xymond_channel --channel=client xymond_client [options]

 

DESCRIPTION

xymond_client is a worker module for xymond, and as such it is normally run via the xymond_channel(8) program. It receives xymond client messages sent from systems that have the the Xymon client installed, and use the client data to generate the Xymon status messages for the cpu-, disk-, memory- and procs-columns. It also feeds Xymon data messages with the netstat- and vmstat-data collected by the client.

When generating these status messages from the client data, xymond_client will use the configuration rules defined in the analysis.cfg(5) file to determine the color of each status message.

 

OPTIONS

--clear-color=COLOR
Define the color used when sending "msgs", "files" or "ports" reports and there are no rules to check for these statuses. The default is to show a "clear" status, but some people prefer to have it "green". If you would rather prefer not to see these status columns at all, then you can use the "--no-clear-msgs", "--no-clear-files" and "--no-clear-ports" options instead.

--no-clear-msgs
If there are no logfile checks, the "msgs" column will show a "clear" status. If you would rather avoid having a "msgs" column, this option causes xymond_client to not send in a clear "msgs" status.

--no-clear-files
If there are no file checks, the "files" column will show a "clear" status. If you would rather avoid having a "files" column, this option causes xymond_client to not send in a clear "files" status.

--no-clear-ports
If there are no port checks, the "ports" column will show a "clear" status. If you would rather avoid having a "ports" column, this option causes xymond_client to not send in a clear "ports" status.

--no-ps-listing
Normally the "procs" status message includes the full process-listing received from the client. If you prefer to just have the monitored processes shown, this option will turn off the full ps-listing.

--no-port-listing
Normally the "ports" status message includes the full netstat-listing received from the client. If you prefer to just have the monitored ports shown, this option will turn off the full netstat-listing.

--uptime-status
Generate a separate "uptime" status column. The uptime is normally just reported in the "cpu" status column, but if you would like a separate status column for the uptime, you can use this option. It is useful if you want to generate an alert in case of a reboot, without having this alert mixed in with the cpu load alerts.

--config=FILENAME
Sets the filename for the analysis.cfg file. The default value is "etc/analysis.cfg" below the Xymon server directory.

--unknownclientosok
Expect and attempt to parse clients with unknown CLIENTOS types. Useful if you're submitting custom host responses with file or msgs data that you'd like to parse.

--dump-config
Dumps the configuration after parsing it. May be useful to track down problems with configuration file errors.

--test
Starts an interactive session where you can test the analysis.cfg configuration.

--collectors=COLLECTOR1[,COLLECTOR2,...]
Limit the set of collector modules that xymond_client will handle. This is not normally used except for running experimental versions of the program.

--debug
Enable debugging output.

 

FILES

~xymon/server/etc/analysis.cfg

 

BUGS

The "disk" status cannot handle filesystems containing whitespace in the filesystem (device) name.

 

SEE ALSO

analysis.cfg(5), xymond(8), xymond_channel(8), xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
FILES
BUGS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man8/enadis.cgi.8.html0000664000076400007640000000543613037531445021655 0ustar rpmbuildrpmbuild Manpage of ENADIS.CGI

ENADIS.CGI

Section: Maintenance Commands (8)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

enadis.cgi - CGI program to enable/disable Xymon tests  

SYNOPSIS

enadis.cgi (invoked via CGI from webserver)

 

DESCRIPTION

enadis.cgi is a CGI tool for disabling and enabling hosts and tests monitored by Xymon. You can disable monitoring of a single test, all tests for a host, or multiple hosts - immediately or at a future point in time.

enadis.cgi runs as a CGI program, invoked by your webserver. It is normally run via a wrapper shell-script in the secured CGI directory for Xymon.

enadis.cgi is the back-end script for the enable/disable form present on the "info" status-pages. It can also run in "stand-alone" mode, in which case it displays a web form allowing users to select what to enable or disable.

 

OPTIONS

--no-cookies
Normally, enadis.cgi uses a cookie sent by the browser to initially filter the list of hosts presented. If this is not desired, you can turn off this behaviour by calling acknowledge.cgi with the --no-cookies option. This would normally be placed in the CGI_ENADIS_OPTS setting in cgioptions.cfg(5)

--env=FILENAME
Load the environment from FILENAME before executing the CGI.

--area=NAME
Load environment variables for a specific area. NB: if used, this option must appear before any --env=FILENAME option.

 

FILES

$XYMONHOME/web/maint_{header,form,footer}
HTML template header

 

BUGS

When using alternate pagesets, hosts will only show up on the Enable/Disable page if this is accessed from the primary page in which they are defined. So if you have hosts on multiple pages, they will only be visible for disabling from their main page which is not what you would expect.

 

SEE ALSO

xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
FILES
BUGS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man8/xymond_channel.8.html0000664000076400007640000001171113037531445022650 0ustar rpmbuildrpmbuild Manpage of XYMOND_CHANNEL

XYMOND_CHANNEL

Section: Maintenance Commands (8)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

xymond_channel - Feed a xymond channel to a worker module  

SYNOPSIS

xymond_channel --channel=CHANNEL [options] workerprogram [worker-options]

 

DESCRIPTION

xymond_channel hooks into one of the xymond(8) channels that provide information about events occurring in the Xymon system. It retrieves messages from the xymond daemon, and passes them on to the workerprogram on the STDIN (file descripter 1) of the worker program. Worker programs can then handle messages as they like.

A number of worker programs are shipped with xymond, e.g. xymond_filestore(8) xymond_history(8) xymond_alert(8) xymond_rrd(8)

If you want to write your own worker module, a sample worker module is provided as part of the xymond distribution in the xymond_sample.c file. This illustrates how to easily fetch and parse messages.

 

OPTIONS

xymond_channel accepts a few options.

--channel=CHANNELNAME
Specifies the channel to receive messages from, only one channel can be used. This option is required. The following channels are available:
"status" receives all Xymon status- and summary-messages
"stachg" receives information about status changes
"page" receives information about statuses triggering alerts
"data" receives all Xymon "data" messages
"notes" receives all Xymon "notes" messages
"enadis" receives information about hosts being disabled or enabled.

--filter=EXPRESSION
EXPRESSION is a Perl-compatible regular expression. xymond_channel will match the first line of each message against this expression, and silently drops any message that does not match the expression. Especially useful for custom worker modules and during testing, to limit the amount of data that the module must process.
Note that messages for "logrotate", "shutdown", "drophost", "renamehost", "droptest" and "renametest" are always forwarded by xymond_channel, whether they match the filter or not.

--msgtimeout=TIMEOUT
Modify the default timeout (30 seconds) for the worker module to handle a message. If a message is not handled within this time, it is considered lost. You normally do not have to modify this unless you have an extremely busy server.

--daemon
xymond_channel is normally started by xymonlaunch(8) as a task defined in the tasks.cfg(5) file. If you are not using xymonlaunch, then starting xymond_channel with this option causes it to run as a stand-alone background task.

--pidfile=FILENAME
If running as a stand-alone daemon, xymond_channel will save the process-ID of the daemon in FILENAME. This is useful for automated startup- and shutdown- scripts.

--env=FILENAME
Loads the environment variables defined in FILENAME before starting xymond_channel. This is normally used only when running as a stand-alone daemon; if xymond_channel is started by xymonlaunch, then the environment is controlled by the task definition in the tasks.cfg(5) file.

--log=FILENAME
Redirect output to this log-file.

--md5 / --no-md5
Enable/disable checksumming of messages passed from xymond_channel to the worker module. This may be useful if you suspect that data may be corrupted, e.g. when sent to a remote worker module. Note that enabling this may break communication with old versions of Xymon worker modules. Default: Disabled.

--debug
Enable debugging output.

 

FILES

This program does not use any configuration files.

 

SEE ALSO

xymond(8), xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
FILES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man8/xymond_filestore.8.html0000664000076400007640000001064713037531445023243 0ustar rpmbuildrpmbuild Manpage of XYMOND_FILESTORE

XYMOND_FILESTORE

Section: Maintenance Commands (8)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

xymond_filestore - xymond worker module for storing Xymon data  

SYNOPSIS

xymond_channel --channel=status xymond_filestore --status [options]
xymond_channel --channel=data xymond_filestore --data [options]
xymond_channel --channel=notes xymond_filestore --notes [options]
xymond_channel --channel=enadis xymond_filestore --enadis [options]

 

DESCRIPTION

xymond_filestore is a worker module for xymond, and as such it is normally run via the xymond_channel(8) program. It receives xymond messages from a xymond channel via stdin, and stores these in the filesystem in a manner that is compatible with the Big Brother daemon, bbd.

This program can be started multiple times, if you want to store messages for more than one channel.

 

OPTIONS

--status
Incoming messages are "status" messages, they will be stored in the $XYMONRAWSTATUSDIR/ directory. If you are using xymon(7) throughout your Xymon server, you will not need to run this module to save status messages, unless you have a third-party add-on that reads the status-logs directly. This module is NOT needed to get trend graphs, you should run the xymond_rrd(8) module instead.

--data
Incoming messages are "data" messages, they will be stored in the $XYMONDATADIR directory. This module is not needed, unless you have a third-party module that processes the data-files. This module is NOT needed to get trend graphs, you should run the xymond_rrd(8) module instead.

--notes
Incoming messages are "notes" messages, they will be stored in the $XYMONNOTESDIR directory. This modules is only needed if you want to allow people to remotely update the notes-files available on the Xymon webpages.

--enadis
Incoming messages are enable/disable messages, they will update files in the $XYMONDISABLEDDIR directory. This is only needed if you have third-party add-ons that use these files.

--dir=DIRECTORY
Overrides the default output directory.

--html
Used together with "--status". Tells xymond_filestore to also save an HTML version of the status-log. Should not be used unless you must run with "XYMONLOGSTATUS=static".

--htmldir=DIRECTORY
The directory where HTML-versions of the status logs are stored. Default: $XYMONHTMLSTATUSDIR

--htmlext=.EXT
Set the filename extension for generated HTML files. By default, HTML files are saved with a ".html" extension.

--multigraphs=TEST1[,TEST2]
This causes xymond_filestore to generate HTML status pages with links to service graphs that are split up into multiple images, with at most 5 graphs per image. If not specified, only the "disk" status is split up this way.

--only=test[,test,test]
Save status messages only for the listed set of tests. This can be useful if you have an external script that needs to parse some of the status logs, but you do not want to save all status logs.

--debug
Enable debugging output.

 

FILES

This module does not rely on any configuration files.

 

SEE ALSO

xymond_channel(8), xymond_rrd(8), xymond(8), xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
FILES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man8/xymonfetch.8.html0000664000076400007640000000726113037531445022033 0ustar rpmbuildrpmbuild Manpage of XYMONFETCH

XYMONFETCH

Section: Maintenance Commands (8)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

xymonfetch - fetch client data from passive clients  

SYNOPSIS

xymonfetch [--server=XYMON.SERVER.IP] [options]

 

DESCRIPTION

This utility is used to collect data from Xymon clients.

Normally, Xymon clients will themselves take care of sending all of their data directly to the Xymon server. In that case, you do not need this utility at all. However, in some network setups clients may be prohibited from establishing a connection to an external server such as the Xymon server, due to firewall policies. In such a setup you can configure the client to store all of the client data locally by enabling the msgcache(8) utility on the client, and using xymonfetch on the Xymon server to collect data from the clients.

xymonfetch will only collect data from clients that have the pulldata tag listed in the hosts.cfg(5) file. The IP-address listed in the hosts.cfg file must be correct, since this is the IP-address where xymonfetch will attempt to contact the client. If the msgcache daemon is running on a non-standard IP-address or portnumber, you can specify the portnumber as in pulldata=192.168.1.2:8084 for contacting the msgcache daemon using IP 192.168.1.2 port 8084. If the IP-address is omitted, the default IP in the hosts.cfg file is used. If the port number is omitted, the portnumber from the XYMONDPORT setting in xymonserver.cfg(5) is used (normally, this is port 1984).

 

OPTIONS

--server=XYMON.SERVER.IP
Defines the IP address of the Xymon server where the collected client messages are forwarded to. By default, messages are sent to the loopback address 127.0.0.1, i.e. to a Xymon server running on the same host as xymonfetch.

--interval=N
Sets the interval (in seconds) between polls of a client. Default: 60 seconds.

--id=N
Used when you have a setup with multiple Xymon servers. In that case, you must run xymonfetch on each of the Xymon servers, with xymonfetch instance using a different value of N. This allows several Xymon servers to pick up data from the clients running msgcache, and msgcache can distinguish between which messages have already been forwarded to which server.
N is a number in the range 1-31.

--log-interval=N
Limit how often xymonfetch will log problems with fetching data from a host, in seconds. Default: 900 seconds (15 minutes). This is to prevent a host that is down or where msgcache has not been started from flooding the xymonfetch logs. Note that this is ignored when debugging is enabled.

--debug
Enable debugging output.

 

SEE ALSO

msgcache(8), xymond(8), xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man8/xymond_rrd.8.html0000664000076400007640000005007513037531445022035 0ustar rpmbuildrpmbuild Manpage of XYMOND_RRD

XYMOND_RRD

Section: Maintenance Commands (8)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

xymond_rrd - xymond worker module for updating Xymon RRD files  

SYNOPSIS

xymond_channel --channel=status xymond_rrd [options]
xymond_channel --channel=data xymond_rrd [options]

 

DESCRIPTION

xymond_rrd is a worker module for xymond, and as such it is normally run via the xymond_channel(8) program. It receives "status" and "data" messages from xymond via stdin, and updates the RRD databases used to generate trend-graphs.

Clients can send data to Xymon using both status- and data- messages. So you will normally run two instances of this module, once for the "status" channel and once for the "data" channel.

xymond_rrd understands data sent by the LARRD 0.43c client-side scripts (the so-called "bottom-feeder" scripts). So you still want to install the LARRD bottom-feeders on the clients you monitor.

Note: For certain types of data, the RRD files used by Xymon are imcompatible with those generated by the Big Brother LARRD add-on. See the COMPATIBILITY section below.

 

OPTIONS

--debug
Enable debugging output.

--rrddir=DIRECTORY
Defines the directory where the RRD-files are stored. xymond_rrd will use the location pointed to by the XYMONRRDS environment if this option is not present.

--no-cache
xymond_rrd by default caches updates to the RRD files, to reduce the disk I/O needed for storing the RRD data. Data is collected for a 30 minute period before being committed to disk in one update. This option disables caching of the data, so that data is stored on disk immediately.

--processor=FILENAME
xymond_rrd can send a parallel copy of all RRD updates to a single external process as a stream on its STDIN. The data will be in a format similar to that used by rrdupdate(1):         <rrdtemplate> ts:<rrdvalue(s)> host <rrdparameters>

If the process exits, xymond_rrd will re-launch it.

--extra-script=FILENAME
Defines the script that is run to get the RRD data for tests that are not built into xymond_rrd. You must also specify which tests are handled by the external script in the --extra-tests option. This option can only be given once, so the script must handle all of the external test-data. See the CUSTOM RRD DATA section below. Note that this is NOT needed if your custom graphs are generated by the NCV (Name Colon Value) module described below, it is only required for data where you have a custom script to parse the status message and extract the data that is put into the graph.

--extra-tests=TEST[,TEST]
List of testnames that are handled by the external script. See the CUSTOM RRD DATA section below. Note that NCV graphs should NOT be listed here, but in the TEST2RRD environment variable - see below.

--no-rrd
Disable the actual writing of RRD files. This is only really useful if you send all of the data destined for the RRD files to an external processor (the --extra-script or --processor options).

 

ENVIRONMENT

TEST2RRD
Defines the mapping between a status-log columnname and the corresponding RRD database format. This is normally defined in the xymonserver.cfg(5) file.

XYMONRRDS
Default directory where RRD files are stored.

NCV_testname
Defines the types of data collected by the "ncv" module in xymond_rrd. See below for more information.

SPLITNCV_testname
The same as NCV_testname, but keeps the data into separate files. That is, it creates one rrd file per "NAME : value" line found in the status message. It is useful when the list of NCV lines is varying.

TRACKMAX
Comma-separated list of columnname for which you want to keep the maximum values along with the default average values. This only works
 for the NCV backend.

 

COLLECTED DATA

The following RRD-file datasets are generated by xymond_rrd:

la
Records the CPU load average. Data is collected from the "cpu" status report. Requires that a Xymon client is running on the monitored server.

disk
Records the disk utilization. Data is collected from the "disk" status report. Requires that a Xymon-compatible client is running on the monitored server.

memory
Records memory- and swap-utilization. Data is collected from the "memory" status report. If no "memory" status is reported, it will use the data from the Win32 client "cpu" status report to generate this dataset. Requires that a Xymon-compatible client is running on the monitored server.

netstat
Records TCP and UDP statistics. Data is collected from the "netstat" status report; however, this data is often sent via the Xymon "data" protocol, so there need not be a "netstat" column visible on the Xymon display. To get these data, the LARRD netstat bottom-feeder script must be running on the monitored server.

vmstat
Records system performance metrics from the "vmstat" command. Data is collected from the "vmstat" status report; however, this data is often sent via the Xymon "data" protocol, so there need not be a "vmstat" column visible on the Xymon display. To get these data, the LARRD vmstat bottom-feeder script must be running on the monitored server.

tcp
Response-time metrics from all of the Xymon network tests are recorded in the "tcp" RRD.

apache
Apache server performance metrics, taken from the "apache" data report. See the description of the apache keyword in hosts.cfg(5) for details.

sendmail
Sendmail server performance metrics, taken from the "mailstats" output. To get these data, the LARRD sendmail bottom-feeder script must be running on the monitored server.

mailq
Mail queue size. To get these data, the LARRD nmailq bottom-feeder script must be running on the monitored server.

bea
BEA Weblogic performance data. This is an experimental set of data collected from BEA Weblogic servers via SNMP, by the "beastats" tool included with Xymon.

iishealth
IIS webserver performance data, collected by the "iishealth" script. This script is a client-side add-on available from the www.deadcat.net archive.

temperature
Temperature data, collected with the temperature script from www.deadcat.net. To get these data, the temperature script must be running on the monitored server.

ntpstat
Tracks the deviation between the local system time and an NTP server, using the output from the "ntpq -c rv" command. A simple script to collect these data is included in the Xymon contrib/ directory.

citrix
Tracks the number of active sessions on a Citrix server using the "query session" command. An extension for the BBNT client that generates data for this graph is in the Xymon contrib/ directory.

 

CUSTOM RRD DATA IN NAME-COLON-VALUE (NCV) FORMAT

Many data-collection scripts report data in the form "NAME : value" or "NAME = value". So a generic module in xymond_rrd allows for easy tracking of this type of data.

The "ncv" module will automatically detect all occurrences of a "NAME : value" or "NAME = value" string in a status message, and generate an RRD file holding all of the name/value data found in the message (unless you use SPLITNCV, see above). The colon- or equal-sign must be present - if there is only whitespace, this module will fail.

Only the valid letters (A-Z, a-z) and digits (0-9) are used in the dataset names; whitespace and other characters are stripped off automatically. Only the first 19 characters of a dataset name are used (this is an RRD limitation). Underscore '_' is not allowed, even though RRDtool permits this, and will be stripped from the name.

When using the alternative SPLITNCV_testname, the dataset name is not limited in length, and non-valid characters are changed to underscores instead of being stripped off. The dataset inside the resulting rrd file is always "lambda".

Note that each "NAME : value" must be on a line by itself. If you have a custom script generating the status- or data-message that is fed into the NCV handler, make sure it inserts a newline before each of the data-items you want to track.

Any lines in the status message prepended with a "<!-- ncv_skip -->" will be skipped by the module. This can be used to prevent unneeded RRD files from an existing dataset from being created.

A line prepended with a "<!-- ncv_skipstart -->" will be ignored, along with all subsequent lines until a line starting with "<!-- ncv_skipend -->" is found, at which point processing will resume. This can be used to ignore explanatory or other text with a mostly-ncv message.

"<!-- ncv_ignore -->" can be used to ignore certain text at the beginning of a line, up until a closing '</-->' tag on the same line, at which point the line will continue to be processed as usual. Wrapping is not supported; but skipstart/skipend can be used to handle multiple lines.

A bare "<!-- ncv_end -->" on its own line will stop further NCV processing of that message.

All of these ncv_ terms are case-sensitive. Note that if you have full control over your NCV output, it is most efficient to have NCV data near the top of your message and use "<!-- ncv_end -->" once your data is complete.

To enable the ncv module for a status, add a "COLUMNNAME=ncv" to the TEST2RRD setting and the COLUMNNAME to the GRAPHS setting in xymonserver.cfg(5) , then restart Xymon. Xymon will now send all status-messages for the column COLUMNNAME through the xymond_rrd ncv-handler.

The name of the RRD file will be COLUMNNAME.rrd. When using SPLITNCV, the name of the RRD file will be COLUMNAME,DATASETNAME.rrd.

By default, all of the datasets are generated as the RRD type "DERIVE" which works for all types of monotonically increasing counters. If you have data that are of the type GAUGE, you can override the default via an environment variable NCV_COLUMNNAME (or SPLITNCV_COLUMNAME).

E.g. if you are using the bb-mysqlstatus script from www.deadcat.net to collect data about your MySQL server, it generates a report in the column called "mysql". One data item is the average number of queries/second, which must be logged in the RRD file as type "GAUGE". To do that, add the following to xymonserver.cfg:

    NCV_mysql="Queriespersecondavg:GAUGE" 
If you have multiple datasets that you myst define, add them to the environment variable separated by commas, e.g.

    NCV_mysql="Uptime:NONE,Queriespersecondavg:GAUGE" 

The dataset type "NONE" used above causes xymond_rrd to ignore this data, it is not included in the RRD file.

You can use "*" as the dataset name to match all datasets not listed. E.g.

    NCV_weather="Rain:DERIVE,*:GAUGE"
will cause the "Rainfall" dataset to be of type DERIVE, and all others of type GAUGE. If you want to track only a few of the variables in your data, you can use "*:NONE" to drop any dataset not explicitly listed.

For a more detailed "how to" description, see the on-line HTML documentation of "How to create graph custom data" available in the Help menu section on your Xymon server.

 

SENDING METRIC DATA TO AN ADDITIONAL PROCESS

xymond_rrd provides a mechanism to send a copy of isolated metric data to a single external processor for further processing. This can be used to inject metric data that xymond_rrd has prepared into other storage systems, such as OpenTSDB, graphite, etc. The data is printed in a format nearly suitable for injection using rrdupdate(1) and easily transformable to other formats. If the process exits, xymond_rrd will re-launch it automatically.

 

CUSTOM RRD DATA VIA SCRIPTS

xymond_rrd provides a simple mechanism for adding custom graphs to the set of data collected on your Xymon server. By adding the "--extra-script" and "--extra-tests" options, data reported to Xymon from selected tests are passed to an external script, which can define the RRD data-sets to store in an RRD file.

NOTE: For performance reasons, you should not use this mechanism for large amounts of data. The overhead involved in storing the received message to disk and launching the script is significantly larger than the normal xymond_rrd overhead. So if you have a large number of reports for a given test, you should consider implementing it in C and including it in the xymond_rrd tool or writing a separate stream listener that injects appropriate "trends" data messages back to xymond.

Apart from writing the script, You must also add a section to graphs.cfg(5) so that showgraph.cgi(1) knows how to generate the graph from the data stored in the RRD file. To make the graphs actually show up on the status-page and/or the "trends" page, add the name of the new graph to the TEST2RRD and/or GRAPHS setting in xymonserver.cfg(5).

The script is invoked for each message that arrives, where the test-name matches one of the testnames given in the "--extra-tests" option. The script receives three command-line parameters:

Hostname
The name of the host reporting the data.
Testname
The name of the test being reported.
Filename
File containing the data that was reported. This file is generated for you by xymond_rrd, and is also deleted automatically after your script is finished with it.

The script must process the data that is reported, and generate the following output:

RRD data-set definitions
For each dataset that the RRD file holds, a line beginning with "DS:" must be output. If multiple data-sets are used, print one line for each dataset.
Data-set definitions are described in the rrdcreate(1) documentation, but a common definition for e.g. tracking the number of users logged on would be "DS:users:GAUGE:600:0:U". "users" is the name of the dataset, "GAUGE" is the datatype, "600" is the longest time allowed between updates for the data to be valid, "0" is the minimum value, and "U" is the maximum value (a "U" means "unknown").
RRD filename
The name of the RRD file where the data is stored. Note that Xymon stores all RRD files in host-specific directories, so unlike LARRD you should not include the hostname in the name of the RRD file.
RRD values
One line, with all of the data values collected by the script. Data-items are colon-delimited and must appear in the same sequence as your data-set definitions, e.g. if your RRD has two datasets with the values "5" and "0.4" respectively, then the script must output "5:0.4" as the RRD values.
In some cases it may be useful to define a dataset even though you will not always have data for it. In that case, use "U" (unknown) for the value.

If you want to store the data in multiple RRD files, the script can just print out more sequences of data-set definitions, RRD filenames and RRD values. If the data-set definitions are identical to the previous definition, you need not print the data-set definitions again - just print a new RRD filename and value.

The following sample script for tracking weather data shows how to use this mechanism. It assumes the status message include lines like these:

green Weather in Copenhagen is FAIR

Temperature: 21 degrees Celsius
Wind: 4 m/s
Humidity: 72 %
Rainfall: 5 mm since 6:00 AM

A shell-script to track all of these variables could be written like this:

#!/bin/sh

# Input parameters: Hostname, testname (column), and messagefile
HOSTNAME="$1"
TESTNAME="$2"
FNAME="$3"

if [ "$TESTNAME" = "weather" ]
then
        # Analyze the message we got
        TEMP=`grep "^Temperature:" $FNAME | awk '{print $2}'`
        WIND=`grep "^Wind:" $FNAME | awk '{print $2}'`
        HMTY=`grep "^Humidity:" $FNAME | awk '{print $2}'`
        RAIN=`grep "^Rainfall:" $FNAME | awk '{print $2}'`

        # The RRD dataset definitions
        echo "DS:temperature:GAUGE:600:-30:50"
        echo "DS:wind:GAUGE:600:0:U"
        echo "DS:humidity:GAUGE:600:0:100"
        echo "DS:rainfall:DERIVE:600:0:100"

        # The filename
        echo "weather.rrd"

        # The data
        echo "$TEMP:$WIND:$HMTY:$RAIN"
fi

exit 0

 

COMPATIBILITY

Some of the RRD files generated by xymond_rrd are incompatible with the files generated by the Big Brother LARRD add-on:

vmstat
The vmstat files with data from Linux based systems are incompatible due to the addition of a number of new data-items that LARRD 0.43 do not collect, but xymond_rrd does. This is due to changes in the output from the Linux vmstat command, and changes in the way e.g. system load metrics are reported.

netstat
All netstat files from LARRD 0.43 are incompatible with xymond_rrd. The netstat data collected by LARRD is quite confusing: For some types of systems LARRD collects packet-counts, for others it collects byte- counts. xymond_rrd uses a different RRD file-format with separate counters for packets and bytes and tracks whatever data the system is reporting.

 

SEE ALSO

xymond_channel(8), xymond(8), xymonserver.cfg(5), xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
ENVIRONMENT
COLLECTED DATA
CUSTOM RRD DATA IN NAME-COLON-VALUE (NCV) FORMAT
SENDING METRIC DATA TO AN ADDITIONAL PROCESS
CUSTOM RRD DATA VIA SCRIPTS
COMPATIBILITY
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man8/xymond_distribute.8.html0000664000076400007640000000422413037531445023417 0ustar rpmbuildrpmbuild Manpage of XYMOND_DISTRIBUTE

XYMOND_DISTRIBUTE

Section: Maintenance Commands (8)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

xymond_distribute - xymond worker module for distributing commands  

SYNOPSIS

xymond_channel --channel=enadis xymond_distribute [options]

 

DESCRIPTION

xymond_distribute is a worker module for xymond, and as such it is normally run via the xymond_channel(8) program. It is used if you have multiple Xymon servers running in a master/slave configuration. xymond_distribute runs on the master server and receives "drop", "rename", "enable" and "disable" messages from xymond. xymond_distribute then forwards these to the other Xymon servers as standard xymon messages. So if a user on the master Xymon server disables a red status, xymond_distribute will forward this to the other Xymon servers so that the change happens everywhere.

NOTE: xymond_distribute does not check to see if a message has already been forwarded, so you can easily create forwarding loops.

 

OPTIONS

--peer=HOSTNAME
The peer that messages are forwarded to. If you have multiple peers, repeat this option.

--debug
Enable debugging output.

 

SEE ALSO

xymond_channel(8), xymond(8), xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man8/xymond_alert.8.html0000664000076400007640000001505313037531445022352 0ustar rpmbuildrpmbuild Manpage of XYMOND_ALERT

XYMOND_ALERT

Section: Maintenance Commands (8)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

xymond_alert - xymond worker module for sending out alerts  

SYNOPSIS

xymond_channel --channel=page xymond_alert [options]

 

DESCRIPTION

xymond_alert is a worker module for xymond, and as such it is normally run via the xymond_channel(8) program. It receives xymond page- and ack-messages from the "page" channel via stdin, and uses these to send out alerts about failed and recovered hosts and services.

The operation of this module is controlled by the alerts.cfg(5) file. This file holds the definition of rules and recipients, that determine who gets alerts, how often, for what servers etc.

 

OPTIONS

--config=FILENAME
Sets the filename for the alerts.cfg file. The default value is "etc/alerts.cfg" below the Xymon server directory.

--dump-config
Dumps the configuration after parsing it. May be useful to track down problems with configuration file errors.

--checkpoint-file=FILENAME
File where the current state of the xymond_alert module is saved. When starting up, xymond_alert will also read this file to restore the previous state.

--checkpoint-interval=N
Defines how often (in seconds) the checkpoint-file is saved.

--cfid
If this option is present, alert messages will include a line with "cfid:N" where N is the linenumber in the alerts.cfg file that caused this message to be sent. This can be useful to track down problems with duplicate alerts.

--test HOST SERVICE [options]
Shows which alert rules matches the given HOST/SERVICE combination. Useful to debug configuration problems, and see what rules are used for an alert.

The possible options are:
--color=COLORNAME The COLORNAME parameter is the color of the alert: red, yellow or purple.
--duration=MINUTES The MINUTES parameter is the duration of the alert in minutes.
--group=GROUPNAME The GROUPNAME parameter is a groupid string from the analysis.cfg file.
--time=TIMESTRING The TIMESTRING parameter is the time-of-day for the alert, expressed as an absolute time in the epoch format (seconds since Jan 1 1970). This is easily obtained with the GNU date utility using the "+%s" output format.

--trace=FILENAME
Send trace output to FILENAME, This allows for more detailed analysis of how alerts trigger, without having the full debugging enabled.

--debug
Enable debugging output.

 

HOW XYMON DECIDES WHEN TO SEND ALERTS

The xymond_alert module is responsible for sending out all alerts. When a status first goes to one of the ALERTCOLORS, xymond_alert is notified of this change. It notes that the status is now in an alert state, and records the timestamp when this event started, and adds the alert to the list statuses that may potentially trigger one or more alert messages.

This list is then matched against the alerts.cfg configuration. This happens at least once a minute, but may happen more often. E.g. when status first goes into an alert state, this will always trigger the matching to happen.

When scanning the configuration, xymond_alert looks at all of the configuration rules. It also checks the DURATION setting against how long time has elapsed since the event started - i.e. against the timestamp logged when xymond_alert first heard of this event.

When an alert recipient is found, the alert is sent and it is recorded when this recipient is due for his next alert message, based on the REPEAT setting defined for this recipient. The next time xymond_alert scans the configuration for what alerts to send, it will still find this recipient because all of the configuration rules are fulfilled, but an alert message will not be generated until the repeat interval has elapsed.

It can happen that a status first goes yellow and triggers an alert, and later it goes red - e.g. a disk filling up. In that case, xymond_alert clears the internal timer for when the next (repeat) alert is due for all recipients. You generally want to be told when something that has been in a warning state becomes critical, so in that case the REPEAT setting is ignored and the alert is sent. This only happens the first time such a change occurs - if the status switches between yellow and red multiple times, only the first transition from yellow->red causes this override.

When an status recovers, a recovery message may be sent - depending on the configuration - and then xymond_alert forgets everything about this status. So the next time it goes into an alert state, the entire process starts all over again.

 

ENVIRONMENT

MAIL
The first part of a command line used to send out an e-mail with a subject, typically set to "/usr/bin/mail -s" . xymond_alert will add the subject and the mail recipients to form the command line used for sending out email alerts.

MAILC
The first part of a command line used to send out an e-mail without a subject. Typically this will be "/usr/bin/mail". xymond_alert will add the mail recipients to form the command line used for sending out email alerts.

 

FILES

~xymon/server/etc/alerts.cfg

 

SEE ALSO

alerts.cfg(5), xymond(8), xymond_channel(8), xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
HOW XYMON DECIDES WHEN TO SEND ALERTS
ENVIRONMENT
FILES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man8/xymond_capture.8.html0000664000076400007640000000566113037531445022712 0ustar rpmbuildrpmbuild Manpage of XYMOND_CAPTURE

XYMOND_CAPTURE

Section: Maintenance Commands (8)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

xymond_capture - catch selected messages from a xymond channel  

SYNOPSIS

xymond_channel --channel=status xymond_capture [options]

 

DESCRIPTION

xymond_capture is a worker module for xymond, and as such it is normally run via the xymond_channel(8) program. It receives messages from xymond via stdin and filters them to select messages based on the hostname, testname or color of the status. By default the resulting messages are printed on stdout, but they can also be fed into a command for further processing.

xymond_capture supports the status, data, client and hostdata channels.

 

OPTIONS

--hosts=PATTERN
Select messages only from hosts matching PATTERN (regular expression).

--exhosts=PATTERN
Exclude messages from hosts matching PATTERN. If used with the --hosts option, then the hostname must match the --hosts pattern, but NOT the --exhosts pattern.

--tests=PATTERN
Select messages only from tests matching PATTERN (regular expression).

--extests=PATTERN
Exclude messages from tests matching PATTERN. If used with the --tests option, then the testname must match the --tests pattern, but NOT the --extests pattern.

--colors=COLOR[,color]
Select messages based on the color of the status message. Multiple colors can be listed, separated by comma. Default: Accept all colors.

--batch-command=COMMAND
Instead of printing the messages to stdout, feed them to COMMAND on stdin. COMMAND can be any command which accepts the mssage on standard input.

--batch-timeout=SECONDS
Collect messages until no messages have arrived in SECONDS seconds, before sending them to the --batch-command COMMAND.

--client
Capture data from the "client" channel instead of the default "status" channel.

--debug
Enable debugging output.

 

SEE ALSO

xymond_channel(8), xymond(8), xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man8/msgcache.8.html0000664000076400007640000000745013037531445021421 0ustar rpmbuildrpmbuild Manpage of MSGCACHE

MSGCACHE

Section: Maintenance Commands (8)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

msgcache - Cache client messages for later pickup by xymonfetch

 

SYNOPSIS

msgcache [options]

 

DESCRIPTION

msgcache implements a Xymon message cache. It is intended for use with clients which cannot deliver their data to the Xymon server in the normal way. Instead of having the client tools connect to the Xymon server, msgcache runs locally and the client tools then deliver their data to the msgcache daemon. The msgcache daemon is then polled regularly by the xymonfetch(8) utility, which collects the client messages stored by msgcache and forwards them to the Xymon server.

NOTE: When using msgcache, the XYMSRV setting for the clients should be XYMSRV=127.0.0.1 instead of pointing at the real Xymon server.

 

RESTRICTIONS

Clients delivering their data to msgcache instead of the real Xymon server will in general not notice this. Specifically, the client configuration data provided by the Xymon server when a client delivers its data is forwarded through the xymonfetch / msgcache chain, so the normal centralized client configuration works.

However, other commands which rely on clients communicating directly with the Xymon server will not work. This includes the config and query commands which clients may use to fetch configuration files and query the Xymon server for a current status.

The download command also does not work with msgcache. This means that the automatic client update facility will not work for clients communicating via msgcache.

 

OPTIONS

--listen=IPADDRESS[:PORT]
Defines the IP-address and portnumber where msgcache listens for incoming connections. By default, msgcache listens for connections on all network interfaces, port 1984.

--server=IPADDRESS[,IPADDRESS]
Restricts which servers are allowed to pick up the cached messages. By default anyone can contact the msgcache utility and request all of the cached messages. This option allows only the listed servers to request the cached messages.

--max-age=N
Defines how long cached messages are kept. If the message has not been picked up with N seconds after being delivered to msgcache, it is silently discarded. Default: N=600 seconds (10 minutes).

--daemon
Run as a daemon, i.e. msgcache will detach from the terminal and run as a background task

--no-daemon
Run as a foreground task. This option must be used when msgcache is started by xymonlaunch(8) which is the normal way of running msgcache.

--pidfile=FILENAME
Store the process ID of the msgcache task in FILENAME.

--logfile=FILENAME
Log msgcache output to FILENAME.

--debug
Enable debugging output.

 

SEE ALSO

xymonfetch(8), xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
RESTRICTIONS
OPTIONS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man8/xymon-mailack.8.html0000664000076400007640000000667313037531445022426 0ustar rpmbuildrpmbuild Manpage of XYMON\-MAILACK

XYMON\-MAILACK

Section: Maintenance Commands (8)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

xymon-mailack - permit acknowledging alerts via e-mail  

SYNOPSIS

xymon-mailack --env=FILENAME [--debug]

 

DESCRIPTION

xymon-mailack normally runs as an input mail-filter for the xymon user, e.g. by being called from the xymon users' procmailrc(5) file. xymon-mailack recognizes e-mails that are replies to xymond_alert(8) mail alerts, and converts the reply mail into an acknowledge message that is sent to the Xymon system. This permits an administrator to acknowledge an alert via e-mail.

 

ADDING INFORMATION TO THE REPLY MAIL

By default, an acknowledgment is valid for 1 hour. If you know in advance that solving the problem is going to take longer, you can change this by adding delay=DURATION to the subject of your mail reply or on a line in the reply message. Duration is in minutes, unless you add a trailing 'h' (for 'hours'), 'd' (for 'days') or 'w' (for 'weeks').

You can also include a message that will show up on the status-page together with the acknowledgment, e.g. to provide an explanation for the issue or some other information to the users. You can either put it at the end of the subject line as msg=Some random text, or you can just enter it in the e-mail as the first non-blank line of text in the mail (a "delay=N" line is ignored when looking for the message text).

 

USE WITH PROCMAIL

To setup xymon-mailack, create a .procmailrc file in the xymon-users home-directory with the following contents:
DEFAULT=$HOME/Mailbox
LOGFILE=$HOME/procmail.log
:0
| $HOME/server/bin/xymon-mailack --env=$HOME/server/etc/xymonserver.cfg

 

USE WITH QMAIL

If you are using Qmail to deliver mail locally, you can run xymon-mailack directly from a .qmail file. Setup the xymon-users .qmail file like this:
| $HOME/server/bin/xymon-mailack --env=$HOME/server/etc/xymonserver.cfg

 

OPTIONS

--env=FILENAME
Load environment from FILENAME, usually xymonserver.cfg.

--debug
Don't send a message to xymond, but dump the message to stdout.

 

SEE ALSO

xymond_alert(8), xymond(8), xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
ADDING INFORMATION TO THE REPLY MAIL
USE WITH PROCMAIL
USE WITH QMAIL
OPTIONS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man8/xymond_hostdata.8.html0000664000076400007640000000460013037531445023046 0ustar rpmbuildrpmbuild Manpage of XYMOND_HOSTDATA

XYMOND_HOSTDATA

Section: Maintenance Commands (8)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

xymond_hostdata - xymond worker module for storing historical client data  

SYNOPSIS

xymond_channel --channel=clichg xymond_hostdata

 

DESCRIPTION

xymond_hostdata is a worker module for xymond, and as such it is normally run via the xymond_channel(8) program. Whenever a status column in Xymon changes to an alert state (usually red, yellow or purple), this module receives a copy of the latest Xymon client data sent by the host, and stores it on disk. This allows you to review all of the data collected by the Xymon client on the server around the time that a problem occurred. This can make troubleshooting incidents easier by providing a snapshot of the host status shortly before a problem became apparent.

Note: This module requires that xymond(8) is launched with the "--store-clientlogs" option enabled.

 

OPTIONS

--minimum-free=N
Sets the minimum percentage of free filesystem space on the $CLIENTLOGS directory. If there is less than N% free space, xymond_hostdata will not save the data. Default: 5

--debug
Enable debugging output.

 

FILES

All of the host data are stored in the $CLIENTLOGS directory, by default this is the $XYMONVAR/hostdata/ directory.

 

SEE ALSO

xymond(8), xymond_channel(8), xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
FILES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man8/xymoncgimsg.cgi.8.html0000664000076400007640000000512413037531445022750 0ustar rpmbuildrpmbuild Manpage of XYMONCGIMSG.CGI

XYMONCGIMSG.CGI

Section: Maintenance Commands (8)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents

 

NAME

xymoncgimsg.cgi - CGI utility used for proxying Xymon data over HTTP  

SYNOPSIS

xymoncgimsg.cgi

 

DESCRIPTION

xymoncgimsg.cgi(8) is the server-side utility receiving Xymon messages sent by the xymon(1) utility over an HTTP transport. The xymon utility normally sends data over a dedicated TCP protocol, but it may use HTTP to go through proxies or through restrictive firewalls. In that case, the webserver must have this CGI utility installed, which takes care of receiving the message via HTTP, and forwards it to a local Xymon server through the normal Xymon transport.

The CGI expects to be invoked from an HTTP "POST" request, with the POST-data being the status-message. xymoncgimsg.cgi simply collects all of the POST data, and send it off as a message to the Xymon daemon running on IP 127.0.0.1. This destination IP currently cannot be changed.

The CGI will return any output provided by the Xymon daemon back to the requestor as the response to the HTTP POST, so this allows for all normal Xymon commands to work.

 

SECURITY

xymoncgimsg.cgi will only send data to a Xymon server through the loopback interface, i.e. IP-address 127.0.0.1.

Access to the CGI should be restricted through webserver access controls, since the CGI provides no authentication at all to validate incoming messages.

If possible, consider using the xymonproxy(8) utility instead for native proxying of Xymon data between networks.

 

SEE ALSO

xymon(1), xymonproxy(8), xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
SECURITY
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man8/xymond.8.html0000664000076400007640000004147113037531445021166 0ustar rpmbuildrpmbuild Manpage of XYMOND

XYMOND

Section: Maintenance Commands (8)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

xymond - Master network daemon for a Xymon server  

SYNOPSIS

xymond [options]

 

DESCRIPTION

xymond is the core daemon in the Xymon Monitor. It is designed to handle monitoring of a large number of hosts, with a strong focus on being a high-speed, low-overhead implementation of a Big Brother compatible server.

To achieve this, xymond stores all information about the state of the monitored systems in memory, instead of storing it in the host filesystem. A number of plug-ins can be enabled to enhance the basic operation; e.g. a set of plugins are provided to implement persistent storage in a way that is compatible with the Big Brother daemon. However, even with these plugins enabled, xymond still performs much faster than the standard bbd daemon.

xymond is normally started and controlled by the xymonlaunch(8) tool, and the command used to invoke xymond should therefore be in the tasks.cfg file.

 

OPTIONS

--hosts=FILENAME
Specifies the path to the Xymon hosts.cfg file. This is used to check if incoming status messages refer to known hosts; depending on the "--ghosts" option, messages for unknown hosts may be dropped. If this option is omitted, the default path used is set by the HOSTSCFG environment variable.

--checkpoint-file=FILENAME
With regular intervals, xymond will dump all of its internal state to this check-point file. It is also dumped when xymond terminates, or when it receives a SIGUSR1 signal.

--checkpoint-interval=N
Specifies the interval (in seconds) between dumps to the check-point file. The default is 900 seconds (15 minutes).

--restart=FILENAME
Specifies an existing file containing a previously generated xymond checkpoint. When starting up, xymond will restore its internal state from the information in this file. You can use the same filename for "--checkpoint-file" and "--restart".

--ghosts={allow|drop|log|match}
How to handle status messages from unknown hosts. The "allow" setting accepts all status messages, regardless of whether the host is known in the hosts.cfg file or not. "drop" silently ignores reports from unknown hosts. "log" works like drop, but logs the event in the xymond output file. "match" will try to match the name of the unknown host reporting with the known names by ignoring any domain-names - if a match is found, then a temporary client alias is automatically generated. The default is "log".

--no-purple
Prevent status messages from going purple when they are no longer valid. Unlike the standard bbd daemon, purple-handling is done by xymond.

--merge-clientconfig
The client-local.cfg(5) file contains client-configuration which can be found matching a client against its hostname, its classname, or the name of the OS the client is running. By default xymond will return one entry from the file to the client, looking for a hostname, classname or OS match (in that order). This option causes xymond to merge all matching entries together into one and return all of it to the client.

--listen=IP[:PORT]
Specifies the IP-address and port where xymond will listen for incoming connections. By default, xymond listens on IP 0.0.0.0 (i.e. all IP- addresses available on the host) and port 1984.

--lqueue=NUMBER
Specifies the listen-queue for incoming connections. You don't need to tune this unless you have a very busy xymond daemon.

--no-bfq
Tells xymond to NOT use the local messagequeue interface for receiving status- updates from xymond_client and xymonnet.

--daemon
xymond is normally started by xymonlaunch(8). If you do not want to use xymonlaunch, you can start xymond with this option; it will then detach from the terminal and continue running as a background task.

--timeout=N
Set the timeout used for incoming connections. If a status has not been received more than N seconds after the connection was accepted, then the connection is dropped and any status message is discarded. Default: 10 seconds.

--flap-count=N
Track the N latest status-changes for flap-detection. See the --flap-seconds option also. To disable flap-checks globally, set N to zero. To disable for a specific host, you must use the "noflap" option in hosts.cfg(5). Default: 5

--flap-seconds=N
If a status changes more than flap-count times in N seconds or less, then it is considered to be flapping. In that case, the status is locked at the most severe level until the flapping stops. The history information is not updated after the flapping is detected. NOTE: If this is set higher than the default value, you should also use the --flap-count option to ensure that enough status-changes are stored for flap detection to work. The flap-count setting should be at least (N/300)-1, e.g. if you set flap-seconds to 3600 (1 hour), then flap-count should be at least (3600/300)-1, i.e. 11. Default: 1800 seconds (30 minutes).

--delay-red=N
--delay-yellow=N
Sets the delay before a red/yellow status causes a change in the web page display. Is usually controlled on a per-host basis via the delayred and delayyellow settings in hosts.cfg(5) but these options allow you to set a default value for the delays. The value N is in minutes. Default: 0 minutes (no delay). Note: Since most tests only execute once every 5 minutes, it will usually not make sense to set N to anything but a multiple of 5.

--env=FILENAME
Loads the content of FILENAME as environment settings before starting xymond. This is mostly used when running as a stand-alone daemon; if xymond is started by xymonlaunch, the environment settings are controlled by the xymonlaunch tasks.cfg file.

--pidfile=FILENAME
xymond writes the process-ID it is running with to this file. This is for use in automated startup scripts. The default file is $XYMONSERVERLOGS/xymond.pid.

--log=FILENAME
Redirect all output from xymond to FILENAME.

--store-clientlogs[=[!]COLUMN]
Determines which status columns can cause a client message to be broadcast to the CLICHG channel. By default, no client messages are pushed to the CLICHG channel. If this option is specified with no parameter list, all status columns that go into an alert state will trigger the client data to be sent to the CLICHG channel. If a parameter list is added to this option, only those status columns listed in the list will cause the client data to be sent to the CLICHG channel. Several column names can be listed, separated by commas. If all columns are given as "!COLUMNNAME", then all status columns except those listed will cause the client data to be sent.

--status-senders=IP[/MASK][,IP/MASK]
Controls which hosts may send "status", "combo", "config" and "query" commands to xymond.

By default, any host can send status-updates. If this option is used, then status-updates are accepted only if they are sent by one of the IP-addresses listed here, or if they are sent from the IP-address of the host that the updates pertains to (this is to allow Xymon clients to send in their own status updates, without having to list all clients here). So typically you will need to list your servers running network tests here.

The format of this option is a list of IP-addresses, optionally with a network mask in the form of the number of bits. E.g. if you want to accept status-updates from the host 172.16.10.2, you would use

    --status-senders=172.16.10.2
whereas if you want to accept status updates from both 172.16.10.2 and from all of the hosts on the 10.0.2.* network (a 24-bit IP network), you would use

    --status-senders=172.16.10.2,10.0.2.0/24

--maint-senders=IP[/MASK][,IP/MASK]
Controls which hosts may send maintenance commands to xymond. Maintenance commands are the "enable", "disable", "ack" and "notes" commands. Format of this option is as for the --status-senders option. It is strongly recommended that you use this to restrict access to these commands, so that monitoring of a host cannot be disabled by a rogue user - e.g. to hide a system compromise from the monitoring system.

Note: If messages are sent through a proxy, the IP-address restrictions are of little use, since the messages will appear to originate from the proxy server address. It is therefore strongly recommended that you do NOT include the address of a server running xymonproxy in the list of allowed addresses.

--www-senders=IP[/MASK][,IP/MASK]
Controls which hosts may send commands to retrieve the state of xymond. These are the "xymondlog", "xymondboard" and "xymondxboard" commands, which are used by xymongen(1) and combostatus(1) to retrieve the state of the Xymon system so they can generate the Xymon webpages.

Note: If messages are sent through a proxy, the IP-address restrictions are of little use, since the messages will appear to originate from the proxy server address. It is therefore strongly recommended that you do NOT include the address of a server running xymonproxy in the list of allowed addresses.

--admin-senders=IP[/MASK][,IP/MASK]
Controls which hosts may send administrative commands to xymond. These commands are the "drop" and "rename" commands. Access to these should be restricted, since they provide an un-authenticated means of completely disabling monitoring of a host, and can be used to remove all traces of e.g. a system compromise from the Xymon monitor.

Note: If messages are sent through a proxy, the IP-address restrictions are of little use, since the messages will appear to originate from the proxy server address. It is therefore strongly recommended that you do NOT include the address of a server running xymonproxy in the list of allowed addresses.

--no-download
Disable the "download" command which can be used by clients to pull files from the Xymon server. The use of these may be seen as a security risk since they allow file downloads.

--ack-each-color
By default, sending an ACK for a yellow status stops alerts from being sent while the status remains yellow or red. A status change from yellow to red will not re-enable alerts - the ACK covers all non-green statuses. With this option, an ACK is valid only for the color of the status when the ACK was sent. So an ACK for a yellow status is ignored if the status later changes to red, but an ACK for a red status covers both yellow and red.
Note: An ACK for a red status will clear any existing yellow acks. This means that a long-lived ack for yellow is lost when you send a short-lived ack for red. Hence alerts will restart when the red ack expires, even if the status by then has changed to yellow.

--ack-log=FILENAME
Log acknowledgements created on the Critical Systems page to FILENAME. NB, acknowledgements created by the Acknowledge Alert CGI are automatically written to acknowledge.log in the Xymon server log directory. Alerts from the Critical Systems page can be directed to the same log.

--debug
Enable debugging output.

--dbghost=HOSTNAME
For troubleshooting problems with a specific host, it may be useful to track the exact communications from a single host. This option causes xymond to dump all traffic from a single host to the file "/tmp/xymond.dbg".

 

HOW ALERTS TRIGGER

When a status arrives, xymond matches the old and new color against the "alert" colors (from the "ALERTCOLORS" setting) and the "OK" colors (from the "OKCOLORS" setting). The old and new color falls into one of three categories:

OK: The color is one of the "OK" colors (e.g. "green").

ALERT: The color is one of the "alert" colors (e.g. "red").

UNDECIDED: The color is neither an "alert" color nor an "OK" color (e.g. "yellow").

If the new status shows an ALERT state, then a message to the xymond_alert(8) module is triggered. This may be a repeat of a previous alert, but xymond_alert(8) will handle that internally, and only send alert messages with the interval configured in alerts.cfg(5).

If the status goes from a not-OK state (ALERT or UNDECIDED) to OK, and there is a record of having been in a ALERT state previously, then a recovery message is triggered.

The use of the OK, ALERT and UNDECIDED states make it possible to avoid being flooded with alerts when a status flip-flops between e.g yellow and red, or green and yellow.

 

CHANNELS

A lot of functionality in the Xymon server is delegated to "worker modules" that are fed various events from xymond via a "channel". Programs access a channel using IPC mechanisms - specifically, shared memory and semaphores - or by using an instance of the xymond_channel(8) intermediate program. xymond_channel enables access to a channel via a simple file I/O interface.

A skeleton program for hooking into a xymond channel is provided as part of Xymon in the xymond_sample(8) program.

The following channels are provided by xymond:

status This channel is fed the contents of all incoming "status" and "summary" messages.

stachg This channel is fed information about tests that change status, i.e. the color of the status-log changes.

page This channel is fed information about tests where the color changes between an alert color and a non-alert color. It also receives information about "ack" messages.

data This channel is fed information about all "data" messages.

notes This channel is fed information about all "notes" messages.

enadis This channel is fed information about hosts or tests that are being disabled or enabled.

client This channel is fed the contents of the client messages sent by Xymon clients installed on the monitored servers.

clichg This channel is fed the contents of a host client messages, whenever a status for that host goes red, yellow or purple.

Information about the data stream passed on these channels is in the Xymon source-tree, see the "xymond/new-daemon.txt" file.

 

SIGNALS

SIGHUP
Re-read the hosts.cfg configuration file.

SIGUSR1
Force an immediate dump of the checkpoint file.

 

BUGS

Timeout of incoming connections are not strictly enforced. The check for a timeout only triggers during the normal network handling loop, so a connection that should timeout after N seconds may persist until some activity happens on another (unrelated) connection.

 

FILES

If ghost-handling is enabled via the "--ghosts" option, the hosts.cfg file is read to determine the names of all known hosts.

 

SEE ALSO

xymon(7), xymonserver.cfg(5).


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
HOW ALERTS TRIGGER
CHANNELS
SIGNALS
BUGS
FILES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man8/xymonproxy.8.html0000664000076400007640000002253513037531445022124 0ustar rpmbuildrpmbuild Manpage of XYMONPROXY

XYMONPROXY

Section: Maintenance Commands (8)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents

 

NAME

xymonproxy - Xymon message proxy  

SYNOPSIS

xymonproxy [options] --server=$XYMSRV

 

DESCRIPTION

xymonproxy(8) is a proxy for forwarding Xymon messages from one server to another. It will typically be needed if you have clients behind a firewall, so they cannot send status messages to the Xymon server directly.

xymonproxy serves three purposes. First, it acts as a regular proxy server, allowing clients that cannot connect directly to the Xymon servers to send data. Although xymonproxy is optimized for handling status messages, it will forward all types of messages, including notes- and data-messages.

Second, it acts as a buffer, smoothing out peak loads if many clients try to send status messages simultaneously. xymonproxy can absorb messages very quickly, but will queue them up internally and forward them to the Xymon server at a reasonable pace.

Third, xymonproxy merges small "status" messages into larger "combo" messages. This can dramatically decrease the number of connections that need to go from xymonproxy to the Xymon server. The merging of messages causes "status" messages to be delayed for up to 0.25 seconds before being sent off to the Xymon server.

 

OPTIONS

--server=SERVERIP[:PORT][,SERVER2IP[:PORT]]
Specifies the IP-address and optional portnumber where incoming messages are forwarded to. The default portnumber is 1984, the standard Xymon port number. If you have setup the normal Xymon environment, you can use "--server=$XYMSRV". Up to 3 servers can be specified; incoming messages are sent to all of them (except "config", "query" and "download" messages, which go to the LAST server only). If you have Xymon clients sending their data via this proxy, note that the clients will receive their configuration data from the LAST of the servers listed here. This option is required.

--listen=LOCALIP[:PORT]
Specifies the IP-adress where xymonproxy listens for incoming connections. By default, xymonproxy listens on all IP-addresses assigned to the host. If no portnumber is given, port 1984 will be used.

--timeout=N
Specifies the number of seconds after which a connection is aborted due to a timeout. Default: 10 seconds.

--report=[PROXYHOSTNAME.]SERVICE
If given, this option causes xymonproxy to send a status report every 5 minutes to the Xymon server about itself. If you have set the standard Xymon environment, you can use "--report=xymonproxy" to have xymonproxy report its status to a "xymonproxy" column in Xymon. The default for PROXYHOSTNAME is the $MACHINE environment variable, i.e. the hostname of the server running xymonproxy. See REPORT OUTPUT below for an explanation of the report contents.

--lqueue=N
Size of the listen-queue where incoming connections can queue up before being processed. This should be large to accommodate bursts of activity from clients. Default: 512.

--daemon
Run in daemon mode, i.e. detach and run as a background process. This is the default.

--no-daemon
Runs xymonproxy as a foreground process.

--pidfile=FILENAME
Specifies the location of a file containing the process-ID of the xymonproxy daemon process. Default: /var/run/xymonproxy.pid.

--logfile=FILENAME
Sends all logging output to the specified file instead of stderr.

--log-details
Log details (IP-address, message type and hostname) to the logfile. This can also be enabled and disabled at run-time by sending the xymonproxy process a SIGUSR1 signal.

--debug
Enable debugging output.

 

REPORT OUTPUT

If enabled via the "--report" option, xymonproxy will send a status message about itself to the Xymon server once every 5 minutes.

The status message includes the following information:

Incoming messages
The total number of connections accepted from clients since the proxy started. The "(N msgs/second)" is the average number of messages per second over the past 5 minutes.

Outbound messages
The total number of messages sent to the Xymon server. Note that this is probably smaller than the number of incoming messages, since xymonproxy merges messages before sending them.

Incoming - Combo messages
The number of "combo" messages received from a client.

Incoming - Status messages
The number of "status" messages received from a client. xymonproxy attempts to merge these into "combo" messages. The "Messages merged" is the number of "status" messages that were merged into a combo message, the "Resulting combos" is the number of "combo" messages that resulted from the merging.

Incoming - Other messages
The number of other messages (data, notes, ack, query, ...) messages received from a client.

Proxy resources - Connection table size
This is the number of connection table slots in the proxy. This measures the number of simultaneously active requests that the proxy has handled, and so gives an idea about the peak number of clients that the proxy has handled simultaneously.

Proxy resources - Buffer space
This is the number of KB memory allocated for network buffers.

Timeout details - reading from client
The number of messages dropped because reading the message from the client timed out.

Timeout details - connecting to server
The number of messages dropped, because a connection to the Xymon server could not be established.

Timeout details - sending to server
The number of messages dropped because the communication to the Xymon server timed out after a connection was established.

Timeout details - recovered
When a timeout happens while sending the status message to the server, xymonproxy will attempt to recover the message and retry sending it to the server after waiting a few seconds. This number is the number of messages that were recovered, and so were not lost.

Timeout details - reading from server
The number of response messages that timed out while attempting to read them from the server. Note that this applies to the "config" and "query" messages only, since all other message types do not get any response from the servers.

Timeout details - sending to client
The number of response messages that timed out while attempting to send them to the client. Note that this applies to the "config" and "query" messages only, since all other message types do not get any response from the servers.

Average queue time
The average time it took the proxy to process a message, calculated from the messages that have passed through the proxy during the past 5 minutes. This number is computed from the messages that actually end up establishing a connection to the Xymon server, i.e. status messages that were combined into combo-messages do not go into the calculation - if they did, it would reduce the average time, since it is faster to merge messages than send them out over the network.

 

If you think the numbers do not add up, here is how they relate.

The "Incoming messages" should be equal to the sum of the "Incoming Combo/Status/Page/Other messages", or slightly more because messages in transit are not included in the per-type message counts.

The "Outbound messages" should be equal to sum of the "Incoming Combo/Page/Other messages", plus the "Resulting combos" count, plus "Incoming Status messages" minus "Messages merged" (this latter number is the number of status messages that were NOT merged into combos, but sent directly). The "Outbound messages" may be slightly lower than that, because messages in transit are not included in the "Outbound messages" count until they have been fully sent.

 

SIGNALS

SIGHUP
Re-opens the logfile, e.g. after it has been rotated.

SIGTERM
Shut down the proxy.

SIGUSR1
Toggles logging of individual messages.

 

SEE ALSO

xymon(1), xymond(1), xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
REPORT OUTPUT
SIGNALS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man7/0000775000076400007640000000000013037531512016577 5ustar rpmbuildrpmbuildxymon-4.3.28/docs/manpages/man7/xymon.7.html0000664000076400007640000007024413037531445021020 0ustar rpmbuildrpmbuild Manpage of XYMON

XYMON

Section: Environments, Tables, and Troff Macros (7)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

Xymon - Introduction to Xymon

 

OVERVIEW

Xymon is a tool for monitoring the health of your networked servers and the applications running on them. It provides a simple, intuitive way of checking the health of your systems from a web browser, and can also alert you to any problems that arise through alarms sent as e-mail, SMS messages, via a pager or by other means.

Xymon is Open Source software, licensed under the GNU GPL. This means that you are free to use Xymon as much as you like, and you are free to re-distribute it and change it to suit your specific needs. However, if you change it then you must make your changes available to others on the same terms that you received Xymon originally. See the file COPYING in the Xymon source-archive for details.

Xymon was called "Hobbit" until November 2008, when it was renamed to Xymon. This was done because the name "Hobbit" is trademarked.

Xymon initially began life as an enhancement to Big Brother called "bbgen". Over a period of 5 years, Xymon has evolved from a small add-on to a full-fledged monitoring system with capabilities far exceeding what was in the original Big Brother package. Xymon does still maintain some compatibility with Big Brother, so it is possible to migrate from Big Brother to Xymon without too much trouble.

Migrating to Xymon will give you a significant performance boost, and provide you with much more advanced monitoring. The Xymon tools are designed for installations that need to monitor a large number of hosts, with very little overhead on the monitoring server. Monitoring of thousands of hosts with a single Xymon server is possible - it was developed to handle just this task.

 

FEATURES

These are some of the core features in Xymon:

Monitoring of hosts and networks
Xymon collects information about your systems in two ways: From querying network services (Web, LDAP, DNS, Mail etc.), or from scripts that run either on the Xymon server or on the systems you monitor. The Xymon package includes a Xymon client which you can install on the servers you monitor; it collects data about the CPU-load, disk- and memory-utilization, log files, network ports in use, file- and directory-information and more. All of the information is stored inside Xymon, and you can define conditions that result in alerts, e.g. if a network service stops responding, or a disk fills up.

Centralized configuration
All configuration of Xymon is done on the Xymon server. Even when monitoring hundreds or thousands of hosts, you can control their configuration centrally on the Xymon server - so there is no need for you to login to a system just to change e.g. which processes are monitored.

Works on all major platforms
The Xymon server works on all Unix-like systems, including Linux, Solaris, FreeBSD, AIX, HP-UX and others. The Xymon client supports all major Unix platforms, and there are other Open Source projects - e.g. BBWin, see http://bbwin.sourceforge.net/ - providing support for Microsoft Windows based systems.

A simple, intuitive web-based front-end
"Green is good, red is bad". Using the Xymon web pages is as simple as that. The hosts you monitor can be grouped together in a way that makes sense in your organisation and presented in a tree-structure. The web pages use many techniques to convey information about the monitored systems, e.g. different icons can be used for recently changed statuses; links to sub-pages can be listed in multiple columns; different icons can be used for dial-up-tests or reverse-tests; selected columns can be dropped or unconditionally included on the web pages to eliminate unwanted information, or always include certain information; user-friendly names can be shown for hosts regardless of their true hostname. You can also have automatic links to on-line documentation, so information about your critical systems is just a click away.

Integrated trend analysis, historical data and SLA reporting
Xymon stores trend- and availability-information about everything it monitors. So if you need to look at how your systems behave over time, Xymon has all of the information you need: Whether it is response times of your web pages during peak hours, the CPU utilization over the past 4 weeks, or what the availability of a site was compared to the SLA - it's all there inside Xymon. All measurements are tracked and made available in time-based graphs.

When you need to drill down into events that have occurred, Xymon provides a powerful tool for viewing the event history for each status log, with overviews of when problems have occurred during the past and easy-to-use zoom-in on the event.

For SLA reporting, You can configure planned downtime, agreed service availability level, service availability time and have Xymon generate availability reports directly showing the actual availability measured against the agreed SLA. Such reports of service availability can be generated on-the-fly, or pre-generated e.g. for monthly reporting.

Role-based views
You can have multiple different views of the same hosts for different parts of the organisation, e.g. one view for the hardware group, and another view for the webmasters - all of them fed by the same test tools.

If you have a dedicated Network Operations Center, you can configure precisely which alerts will appear on their monitors - e.g. a simple anomaly in the system log file need not trigger a call to 3rd-level support at 2 AM, but if the on-line shop goes down you do want someone to respond immediately. So you put the web-check for the on-line shop on the NOC monitor page, and leave out the log-file check.

Also for the techies
The Xymon user-interface is simple, but engineers will also find lots of relevant information. E.g. the data that clients report to Xymon contain the raw output from a number of system commands. That information is available directly in Xymon, so an administrator no longer needs to login to a server to get an overview of how it is behaving - the very commands they would normally run have already been performed, and the results are on-line in Xymon.

Easy to adapt to your needs
Xymon includes a lot of tests in the core package, but there will always be something specific to your setup that you would like to watch. Xymon allows you to write test scripts in your favorite scripting language and have the results show up as regular status columns in Xymon. You can trigger alerts from these, and even track trends in graphs just by a simple configuration setting.

Real network service tests
The network test tool knows how to test most commonly used protocols, including HTTP, SMTP (e-mail), DNS, LDAP (directory services), and many more. When checking websites, it is possible to not only check that the web server is responding, but also that the response looks correct by matching the response against a pre-defined pattern or a check-sum. So you can test that a network service is really working and supplying the data you expect - not just that the service is running.

Protocols that use SSL encryption such as https web sites are fully supported, and while checking such services the network tester will automatically run a check of the validity of the SSL server certificate, and warn about certificates that are about to expire.

Highly configurable alerts
You want to know when something breaks. But you don't want to get flooded with alerts all the time. Xymon lets you define several criteria for when to send out an alert, so you only get alerts when there is really something that needs your attention right away. While you are handling an incident, you can tell Xymon about it so it stops sending more alerts, and so that everyone else can check with Xymon and know that the problem is being taken care of.

Combined super-tests and test inter-dependencies
If a single test is not enough, combination tests can be defined that combine the result of several tests to a single status-report. So if you need to monitor that at least 3 out of 5 servers are running at any time, Xymon can do that for you and generate the necessary availability report.

Tests can also be configured to depend on each other, so that when a critical router goes down you will get alerts only for the router - and not from the 200 hosts behind the router.

 

SECURITY

All of the Xymon server tools run under an unprivileged user account. A single program - the xymonping(1) network connectivity tester - must be installed setuid-root, but has been written so that it drops all root privileges immediately after performing the operation that requires root privileges.

It is recommended that you setup a dedicated account for Xymon.

Communications between the Xymon server and Xymon clients use the Big Brother TCP port 1984. If the Xymon server is located behind a firewall, it must allow for inbound connections to the Xymon server on tcp port 1984. Normally, Xymon clients - i.e. the servers you are monitoring - must be permitted to connect to the Xymon server on this port. However, if that is not possible due to firewall policies, then Xymon includes the xymonfetch(8) and msgcache(8) tools to allows for a pull-style way of collecting data, where it is the Xymon server that initiates connections to the clients.

The Xymon web pages are dynamically generated through CGI programs.

Access to the Xymon web pages is controlled through your web server access controls, e.g. you can require a login through some form of HTTP authentication.

 

DEMONSTRATION SITE

A site running this software can be seen at http://www.xymon.com/

 

PREREQUISITES AND INSTALLATION

You will need a Unix-like system (Linux, Solaris, HP-UX, AIX, FreeBSD, Mac OS X or similar) with a web server installed. You will also need a C compiler and some additional libraries, but many systems come with the required development tools and libraries pre-installed. The required libraries are:

RRDtool This library is used to store and present trend-data. It is required.

libpcre This library is used for advanced pattern-matching of text strings in configuration files. This library is required.

OpenSSL This library is used for communication with SSL-enabled network services. Although optional, it is recommended that you install this for Xymon since many network tests do use SSL.

OpenLDAP This library is used for testing LDAP servers. Use of this is optional.

For more detailed information about Xymon system requirements and how to install Xymon, refer to the on-line documentation "Installing Xymon" available from the Xymon web server (via the "Help" menu), or from the "docs/install.html" file in the Xymon source archive.

 

SUPPORT and MAILING LISTS

xymon@xymon.com is an open mailing list for discussions about Xymon. If you would like to participate, send an e-mail to xymon-subscribe@xymon.com to join the list, or visit http://lists.xymon.com/mailman/listinfo/xymon .

An archive of the mailing list is available at http://lists.xymon.com/archive/

If you just want to be notified of new releases of Xymon, please subscribe to the xymon-announce mailing list. This is a moderated list, used only for announcing new Xymon releases. To be added to the list, send an e-mail to xymon-announce-subscribe@xymon.com or visit http://lists.xymon.com/mailman/listinfo/xymon-announce .

 

XYMON SERVER TOOLS

These tools implement the core functionality of the Xymon server:

xymond(8) is the core daemon that collects all reports about the status of your hosts. It uses a number of helper modules to implement certain tasks such as updating log files and sending out alerts: xymond_client, xymond_history, xymond_alert and xymond_rrd. There is also a xymond_filestore module for compatibility with Big Brother.

xymond_channel(8) Implements the communication between the Xymon daemon and the other Xymon server modules.

xymond_history(8) Stores historical data about the things that Xymon monitors.

xymond_rrd(8) Stores trend data, which is used to generate graphs of the data monitored by Xymon.

xymond_alert(8) handles alerts. When a status changes to a critical state, this module decides if an alert should be sent out, and to whom.

xymond_client(8) handles data collected by the Xymon clients, analyzes the data and feeds back several status updates to Xymon to build the view of the client status.

xymond_hostdata(8) stores historical client data when something breaks. E.g. when a web page stops responding xymond_hostdata will save the latest client data, so that you can use this to view a snapshot of how the system state was just prior to it failing.

 

XYMON NETWORK TEST TOOLS

These tools are used on servers that execute tests of network services.

xymonping(1) performs network connectivity (ping) tests.

xymonnet(1) runs the network service tests.

xymonnet-again.sh(1) is an extension script for re-doing failed network tests with a higher frequency than the normal network tests. This allows Xymon to pick up the recovery of a network service as soon as it happens, resulting in less downtime being recorded.

 

XYMON TOOLS HANDLING THE WEB USER-INTERFACE

These tools take care of generating and updating the various Xymon web-pages.

xymongen(1) takes care of updating the Xymon web pages.

svcstatus.cgi(1) This CGI program generates an HTML view of a single status log. It is used to present the Xymon status-logs.

showgraph.cgi(1) This CGI program generates graphs of the trend-data collected by Xymon.

hostgraphs.cgi(1) When you want to combine multiple graphs into one, this CGI lets you combine graphs so you can e.g. compare the load on all of the nodes in your server farm.

criticalview.cgi(1) Generates the Critical Systems view, based on the currently critical systems and the configuration of what systems and services you want to monitor when.

history.cgi(1) This CGI program generates a web page with the most recent history of a particular host+service combination.

eventlog.cgi(1) This CGI lets you view a log of events that have happened over a period of time, for a single host or test, or for multiple systems.

ack.cgi(1) This CGI program allows a user to acknowledge an alert he received from Xymon about a host that is in a critical state. Acknowledging an alert serves two purposes: First, it stops more alerts from being sent so the technicians are not bothered wit more alerts, and secondly it provides feedback to those looking at the Xymon web pages that the problem is being handled.

xymon-mailack(8) is a tool for processing acknowledgments sent via e-mail, e.g. as a response to an e-mail alert.

enadis.cgi(8) is a CGI program to disable or re-enable hosts or individual tests. When disabling a host or test, you stop alarms from being sent and also any outages do not affect the SLA calculations. So this tool is useful when systems are being brought down for maintenance.

findhost.cgi(1) is a CGI program that finds a given host in the Xymon web pages. As your Xymon installation grows, it can become difficult to remember exactly which page a host is on; this CGI script lets you find hosts easily.

report.cgi(1) This CGI program triggers the generation of Xymon availability reports, using xymongen(1) as the reporting back-end engine.

reportlog.cgi(1) This CGI program generates the detailed availability report for a particular host+service combination.

snapshot.cgi(1) is a CGI program to build the Xymon web pages in a "snapshot" mode, showing the look of the web pages at a particular point in time. It uses xymongen(1) as the back-end engine.

statusreport.cgi(1) is a CGI program reporting test results for a single status but for several hosts. It is used to e.g. see which SSL certificates are about to expire, across all of the Xymon web pages.

csvinfo.cgi(1) is a CGI program to present information about a host. The information is pulled from a CSV (Comma Separated Values) file, which is easily exported from any spreadsheet or database program.

 

CLIENT-SIDE TOOLS

logfetch(1) is a utility used by the Xymon Unix client to collect information from log files on the client. It can also monitor various other file-related data, e.g. file meta-data or directory sizes.

clientupdate(1) Is used on Xymon clients, to automatically update the client software with new versions. Through this tool, updates of the client software can happen without an administrator having to logon to the server.

msgcache(8) This tool acts as a mini Xymon server to the client. It stores client data internally, so that the xymonfetch(8) utility can pick it up later and send it to the Xymon server. It is typically used on hosts that cannot contact the Xymon server directly due to network- or firewall-restrictions.

 

XYMON COMMUNICATION TOOLS

These tools are used for communications between the Xymon server and the Xymon clients. If there are no firewalls then they are not needed, but it may be necessary due to network or firewall issues to make use of them.

xymonproxy(8) is a proxy-server that forwards Xymon messages between clients and the Xymon server. The clients must be able to talk to the proxy, and the proxy must be able to talk to the Xymon server.

xymonfetch(8) is used when the client is not able to make outbound connections to neither xymonproxy nor the Xymon server (typically, for clients located in a DMZ network zone). Together with the msgcache(8) utility running on the client, the Xymon server can contact the clients and pick up their data.

 

OTHER TOOLS

xymonlaunch(8) is a program scheduler for Xymon. It acts as a master program for running all of the Xymon tools on a system. On the Xymon server, it controls running all of the server tasks. On a Xymon client, it periodically launches the client to collect data and send them to the Xymon server.

xymon(1) is the tool used to communicate with the Xymon server. It is used to send status reports to the Xymon server, through the custom Xymon/BB protocol, or via HTTP. It can be used to query the state of tests on the central Xymon server and retrieve Xymon configuration files. The server-side script xymoncgimsg.cgi(1) used to receive messages sent via HTTP is also included.

xymoncmd(1) is a wrapper for the other Xymon tools which sets up all of the environment variables used by Xymon tools.

xymongrep(1) is a utility for use by Xymon extension scripts. It allows an extension script to easily pick out the hosts that are relevant to a script, so it need not parse a huge hosts.cfg file with lots of unwanted test-specifications.

xymoncfg(1) is a utility to dump the full hosts.cfg(5) file following any "include" statements.

xymondigest(1) is a utility to compute message digest values for use in content checks that use digests.

combostatus(1) is an extension script for the Xymon server, allowing you to build complicated tests from simpler Xymon test results. E.g. you can define a test that uses the results from testing your web server, database server and router to have a single test showing the availability of your enterprise web application.

trimhistory(8) is a tool to trim the Xymon history logs. It will remove all log entries and optionally also the individual status-logs for events that happened before a given time.

 

VERSIONS

Version 1 of bbgen was released in November 2002, and optimized the web page generation on Big Brother servers.

Version 2 of bbgen was released in April 2003, and added a tool for performing network tests.

Version 3 of bbgen was released in September 2004, and eliminated the use of several external libraries for network tests, resulting in a significant performance improvement.

With version 4.0 released on March 30 2005, the project was de-coupled from Big Brother, and the name changed to Hobbit. This version was the first full implementation of the Hobbit server, but it still used the data collected by Big Brother clients for monitoring host metrics.

Version 4.1 was released in July 2005 included a simple client for Unix. Log file monitoring was not implemented.

Version 4.2 was released in July 2006, and includes a fully functional client for Unix.

Version 4.3 was released in November 2010, and implemented the renaming of the project to Xymon. This name was already introduced in 2008 with a patch version of 4.2, but with version 4.3.0 this change of names was fully implemented.

 

COPYRIGHT

Xymon is

  Copyright (C) 2002-2011 Henrik Storner <henrik@storner.dk
Parts of the Xymon sources are from public-domain or other freely available sources. These are the the Red-Black tree implementation, and the MD5-, SHA1- and RIPEMD160-implementations. Details of the license for these is in the README file included with the Xymon sources. All other files are released under the GNU General Public License version 2, with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. See the file COPYING for details.

 

SEE ALSO

xymond(8), xymond_channel(8), xymond_history(8), xymond_rrd(8), xymond_alert(8), xymond_client(8), xymond_hostdata(8), xymonping(1), xymonnet(1), xymonnet-again.sh(1), xymongen(1), svcstatus.cgi(1), showgraph.cgi(1), hostgraphs.cgi(1), criticalview.cgi(1), history.cgi(1), eventlog.cgi(1), ack.cgi(1), xymon-mailack(8), enadis.cgi(8), findhost.cgi(1), report.cgi(1), reportlog.cgi(1), snapshot.cgi(1), statusreport.cgi(1), csvinfo.cgi(1), logfetch(1), clientupdate(1), msgcache(8), xymonproxy(8), xymonfetch(8), xymonlaunch(8), xymon(1), xymoncgimsg.cgi(1), xymoncmd(1), xymongrep(1), xymoncfg(1), xymondigest(1), combostatus(1), trimhistory(8), hosts.cfg(5), tasks.cfg(5), xymonserver.cfg(5), alerts.cfg(5), analysis.cfg(5), client-local.cfg(5)


 

Index

NAME
OVERVIEW
FEATURES
SECURITY
DEMONSTRATION SITE
PREREQUISITES AND INSTALLATION
SUPPORT and MAILING LISTS
XYMON SERVER TOOLS
XYMON NETWORK TEST TOOLS
XYMON TOOLS HANDLING THE WEB USER-INTERFACE
CLIENT-SIDE TOOLS
XYMON COMMUNICATION TOOLS
OTHER TOOLS
VERSIONS
COPYRIGHT
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man5/0000775000076400007640000000000013037531512016575 5ustar rpmbuildrpmbuildxymon-4.3.28/docs/manpages/man5/xymonwebaccess.5.html0000664000076400007640000000621413037531445022670 0ustar rpmbuildrpmbuild Manpage of XYMON\-WEBACCESS

XYMON\-WEBACCESS

Section: File Formats (5)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

xymon-webaccess - Web-based access controls in Xymon

 

DESCRIPTION

Xymon does not provide any built-in authentication (login) mechanism. Instead, it relies on the access controls available in your web server, e.g. the Apache mod_auth modules.

This provides a simple way of controlling access to the physical directories that make up the pages and subpages with the hosts defined in your Xymon hosts.cfg(5) setup - you can use the Apache "require" setting to allow or deny access to information on any page, usually through the use of a "Require group ..." setting. The group name then refers to one or more groups in an Apache AuthGroupFile file.

However, this does not work for the Xymon CGI programs since they are used to fetch information about all hosts in Xymon, but there is only a single directory holding all of the CGI's. So here you can only require that the user is logged-in (the Apache "Require valid-user" directive). A user with a login can - if he knows the hostname - manipulate the request sent to the webserver and fetch information about any status by use of the Xymon CGI programs, even though he cannot see the overview webpages.

To alleviate this situation, the following Xymon CGI's support a "--access=FILENAME" option, where FILENAME is an Apache compatible group-definitions file:
svcstatus.cgi(1)
acknowledge.cgi(1)
enadis.cgi(1)
appfeed.cgi(1)

When invoked with this option the CGI will read the Apache group-definitions file, and assume that an Apache group maps to a Xymon page, and then - based on the logged-in userid - determine which pages and hosts the user is allowed access to. Only information about those hosts will be made available by the CGI tool.

Members of the group root has access to all hosts.

Access will also be granted, if the user is a member of a group with the same name as the host being requested, or as the statuscolumn being requested.

 

SEE ALSO

The Apache "Authentication, Authorization and Access Control" documentation, http://httpd.apache.org/docs/2.2/howto/auth.html


 

Index

NAME
DESCRIPTION
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man5/protocols.cfg.5.html0000664000076400007640000001002613037531445022414 0ustar rpmbuildrpmbuild Manpage of PROTOCOLS.CFG

PROTOCOLS.CFG

Section: File Formats (5)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

protocols.cfg - Configuration of TCP network services

 

SYNOPSIS

$XYMONHOME/etc/protocols.cfg

 

DESCRIPTION

protocols.cfg contains definitions of how xymonnet(1) should test a TCP-based network service (i.e. all common network services except HTTP and DNS). For each service, a simple dialogue can be defined to check that the service is functioning normally, and optional flags determine if the service has e.g. a banner or requires SSL- or telnet-style handshaking to be tested.

 

FILE FORMAT

protocols.cfg is a text file. A simple service definition for the SMTP service would be this:


   [smtp]

      send "mail\r\nquit\r\n"

      expect "220"

      options banner

This defines a service called "smtp". When the connection is first established, xymonnet will send the string "mail\r\nquit\r\n" to the service. It will then expect a response beginning with "220". Any data returned by the service (a so-called "banner") will be recorded and included in the status message.

The full set of commands available for the protocols.cfg file are:

[NAME]
Define the name of the TCP service, which will also be the column-name in the resulting display on the test status. If multiple tests share a common definition (e.g. ssh, ssh1 and ssh2 are tested identically), you may list these in a single "[ssh|ssh1|ssh2]" definition, separating each service-name with a pipe-sign.

send STRING
expect STRING
Defines the strings to send to the service after a connection is established, and the response that is expected. Either of these may be omitted, in which case xymonnet(1) will simply not send any data, or match a response against anything.

The send- and expect-strings use standard escaping for non-printable characters. "\r" represents a carriage-return (ASCII 13), "\n" represents a line-feed (ASCII 10), "\t" represents a TAB (ASCII 8). Binary data is input as "\xNN" with NN being the hexadecimal value of the byte.

port NUMBER
Define the default TCP port-number for this service. If no portnumber is defined, xymonnet(1) will attempt to lookup the portnumber in the standard /etc/services file.

options option1[,option2][,option3]
Defines test options. The possible options are

   banner - include received data in the status message

   ssl - service uses SSL so perform an SSL handshake

   telnet - service is telnet, so exchange telnet options

 

FILES

$XYMONHOME/etc/protocols.cfg

 

SEE ALSO

xymonnet(1)


 

Index

NAME
SYNOPSIS
DESCRIPTION
FILE FORMAT
FILES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man5/hosts.cfg.5.html0000664000076400007640000021263513037531445021542 0ustar rpmbuildrpmbuild Manpage of HOSTS.CFG

HOSTS.CFG

Section: File Formats (5)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

hosts.cfg - Main Xymon configuration file

 

SYNOPSIS

hosts.cfg

 

DESCRIPTION

The hosts.cfg(5) file is the most important configuration file for all of the Xymon programs. This file contains the full list of all the systems monitored by Xymon, including the set of tests and other configuration items stored for each host.

 

FILE FORMAT

Each line of the file defines a host. Blank lines and lines starting with a hash mark (#) are treated as comments and ignored. Long lines can be broken up by putting a backslash at the end of the line and continuing the entry on the next line.

The format of an entry in the hosts.cfg file is as follows:

   IP-address hostname # tag1 tag2 ...

The IP-address and hostname are mandatory; all of the tags are optional. Listing a host with only IP-address and hostname will cause a network test to be executed for the host - the connectivity test is enabled by default, but no other tests.

The optional tags are then used to define which tests are relevant for the host, and also to set e.g. the time-interval used for availability reporting by xymongen(1)

An example of setting up the hosts.cfg file is in the Xymon on-line documentation (from the Help menu, choose "Configuring Monitoring"). The following describes the possible settings in a hosts.cfg file supported by Xymon.

 

TAGS RECOGNIZED BY ALL TOOLS

include filename
This tag is used to include another file into the hosts.cfg file at run-time, allowing for a large hosts.cfg file to be split up into more manageable pieces.

The "filename" argument should point to a file that uses the same syntax as hosts.cfg. The filename can be an absolute filename (if it begins with a '/'), or a relative filename - relative file names are prefixed with the directory where the main hosts.cfg file is located (usually $XYMONHOME/etc/).

You can nest include tags, i.e. a file that is included from the main hosts.cfg file can itself include other files.

dispinclude filename
Acts like the "include" tag, but only for the xymongen tool. Can be used e.g. to put a group of hosts on multiple sub-pages, without having to repeat the host definitions.

netinclude filename
Acts like the "include" tag, but only for the xymonnet tool.

directory directoryname
This tag is used to include all files in the named directory. Files are included in alphabetical order. If there are sub- directories, these are recursively included also. The following files are ignored: Files that begin with a dot, files that end with a tilde, RCS files that end with ",v", RPM package manager files ending in ".rpmsave" or ".rpmnew", DPKG package manager files ending in ".dpkg-new" or ".dpkg-orig", and all special files (devices, sockets, pipes etc).

optional include/directory
Both "include" and "directory" can be prefixed with the tag "optional", which will preven an error message being logged if the file or directory is not present on a system.

 

GENERAL PER-HOST OPTIONS

noclear
Controls whether stale status messages go purple or clear when a host is down. Normally, when a host is down the client statuses ("cpu", "disk", "memory" etc) will stop updating - this would usually make them go "purple" which can trigger alerts. To avoid that, Xymon checks if the "conn" test has failed, and if that is true then the other tests will go "clear" instead of purple so you only get alerts for the "conn" test. If you do want the stale statuses to go purple, you can use the "noclear" tag to override this behaviour.

Note that "noclear" also affects the behaviour of network tests; see below.

prefer
When a single host is defined multiple time in the hosts.cfg file, xymongen tries to guess which definition is the best to use for the information used on the "info" column, or for the NOPROPRED and other xymongen-specific settings. Host definitions that have a "noconn" tag or an IP of 0.0.0.0 get lower priority.

By using the "prefer" tag you tell xymongen that this host definition should be used.

Note: This only applies to hosts that are defined multiple times in the hosts.cfg file, although it will not hurt to add it on other hosts as well.

multihomed
Tell Xymon that data from the host can arrive from multiple IP-addresses. By default, Xymon will warn if it sees data for one host coming from different IP-addresses, because this usually indicates a mis-configuration of the hostname on at least one of the servers involved. Some hosts with multiple IP-addresses may use different IP's for sending data to Xymon, however. This tag disables the check of source IP when receiving data.

delayred=STATUSCOLUMN:DELAY[,STATUSCOLUMN:DELAY...]
Usually, status changes happen immediately. This tag is used to defer an update to red for the STATUSCOLUMN status for DELAY minutes. E.g. with delayred=disk:10,cpu:30, a red disk-status will not appear on the Xymon webpages until it has been red for at least 10 minutes. Note: Since most tests only execute once every 5 minutes, it will usually not make sense to set N to anything but a multiple of 5. The exception is network tests, since xymonnet-again.sh(1) will re-run failed network tests once a minute for up to 30 minutes.

delayyellow=STATUSCOLUMN:DELAY[,STATUSCOLUMN:DELAY...]
Same as delayred, but defers the change to a yellow status.

 

XYMONGEN DISPLAY OPTIONS

These tags are processed by the xymongen(1) tool when generating the Xymon webpages or reports.

page NAME [Page-title]
This defines a page at the level below the entry page. All hosts following the "page" directive appear on this page, until a new "page", "subpage" or "subparent" line is found.

subpage NAME [Page-title]
This defines a sub-page in the second level below the entry page. You must have a previous "page" line to hook this sub-page to.

subparent parentpage newpage [Page-title]
This is used to define sub-pages in whatever levels you may wish. Just like the standard "subpage" tag, "subparent" defines a new Xymon web page; however with "subparent" you explicitly list which page it should go as a sub-page to. You can pick any page as the parent - pages, sub-pages or even other subparent pages. So this allows you to define any tree structure of pages that you like.

E.g. with this in hosts.cfg:


   page USA United States
   subpage NY New York
   subparent NY manhattan Manhattan data centers
   subparent manhattan wallstreet Wall Street center

you get this hierarchy of pages:


   USA (United States)
     NY (New York)
       manhattan (Manhattan data centers)
          wallstreet (Wall Street center)

Note: The parent page must be defined before you define the subparent. If not, the page will not be generated, and you get a message in the log file.

Note: xymongen is case-sensitive, when trying to match the name of the parent page.

The inspiration for this came from Craig Cook's mkbb.pl script, and I am grateful to Craig for suggesting that I implement it in xymongen. The idea to explicitly list the parent page in the "subparent" tag was what made it easy to implement.

vpage
vsubpage
vsubparent
These are page-definitions similar to the "page", "subpage" and "subparent" definitions. However, on these pages the rows are the tests, and the columns are the hosts (normal pages have it the other way around). This is useful if you have a very large number of tests for a few hosts, and prefer to have them listed on a page that can be scrolled vertically.
Note that the "group" directives have no effect on these types of pages.

group [group-title]
group-compress [group-title]
Defines a group of hosts, that appear together on the web page, with a single header-line listing all of the columns. Hosts following the "group" line appear inside the group, until a new "group" or page-line is found. The two group-directives are handled identically by Xymon and xymongen, but both forms are allowed for backwards compatibility.

group-sorted [group-title]
Same as the "group" line, but will sort the hosts inside the group so they appear in strict lexicographic order.

group-only COLUMN1|COLUMN2|COLUMN3 [group-title]
Same as the "group" and "group-compress" lines, but includes only the columns explicitly listed in the group. Any columns not listed will be ignored for these hosts.

group-except COLUMN1|COLUMN2|COLUMN3 [group-title]
Same as the "group-only" lines, but includes all columns EXCEPT those explicitly listed in the group. Any columns listed will be ignored for these hosts - all other columns are shown.

title Page, group or host title text
The "title" tag is used to put custom headings into the pages generated by xymongen, in front of page/subpage links, groups or hosts.

The title tag operates on the next item in the hosts.cfg file following the title tag.

If a title tag precedes a host entry, the title is shown just before the host is listed on the status page. The column headings present for the host will be repeated just after the heading.

If a title tag precedes a group entry, the title is show just before the group on the status page.

If a title tag precedes a page/subpage/subparent entry, the title text replaces the normal "Pages hosted locally" heading normally inserted by Xymon. This appears on the page that links to the sub-pages, not on the sub-page itself. To get a custom heading on the sub-page, you may want to use the "--pagetext-heading" when running xymongen(1)

NAME:hostname
Overrides the default hostname used on the overview web pages. If "hostname" contains spaces, it must be enclosed in double quotes, e.g. NAME:"R&D Oracle Server"

CLIENT:hostname
Defines an alias for a host, which will be used when identifying status messages. This is typically used to accommodate a local client that sends in status reports with a different hostname, e.g. if you use hostnames with domains in your Xymon configuration, but the client is a silly Window box that does not include the hostname. Or vice-versa. Whatever the reason, this can be used to match status reports with the hosts you define in your hosts.cfg file. It causes incoming status reports with the specified hostname to be filed using the hostname defined in hosts.cfg.

NOCOLUMNS:column[,column]
Used to drop certain of the status columns generated by the Xymon client. column is one of cpu, disk, files, memory, msgs, ports, procs. This setting stops these columns from being updated for the host. Note: If the columns already exist, you must use the xymon(1) utility to drop them, or they will go purple.

COMMENT:Host comment
Adds a small text after the hostname on the web page. This can be used to describe the host, without completely changing its display-name as the NAME: tag does. If the comment includes whitespace, it must be in double-quotes, e.g. COMMENT:"Sun web server"

DESCR:Hosttype:Description
Define some informational text about the host. The "Hosttype" is a text describing the type of this device - "router", "switch", "hub", "server" etc. The "Description" is an informational text that will be shown on the "Info" column page; this can e.g. be used to store information about the physical location of the device, contact persons etc. If the text contain whitespace, you must enclose it in double-quotes, e.g. DESCR:"switch:4th floor Marketing switch"

CLASS:Classname
Force the host to belong to a specific class. Class-names are used when configuring log-file monitoring (they can be used as references in client-local.cfg(5), analysis.cfg(5) and alerts.cfg(5) to group log file checks or alerts). Normally, class-names are controlled on the client by starting the Xymon client with the "--class=Classname" option. If you specify it in the hosts.cfg file on the Xymon server, it overrides any class name that the client reports. If not set, then the host belongs to a class named by the operating system the Xymon client is running on.

dialup
The keyword "dialup" for a host means that it is OK for it to be off-line - this should not trigger an alert. All network tests will go "clear" upon failure, and any missing reports from e.g. cpu- and disk-status will not go purple when they are not updated.

nonongreen
Ignore this host on the "All non-green" page. Even if it has an active alert, it will not be included in the "All non-green" page. This also removes the host from the event-log display.

nodisp
Ignore this host completely when generating the Xymon webpages. Can be useful for monitoring a host without having it show up on the webpages, e.g. because it is not yet in production use. Or for hiding a host that is shown only on a second pageset.

TRENDS:[*,][![graph,...]]
Defines the RRD graphs to include in the "trends" column generated by xymongen. This option syntax is complex.
If this option is not present, xymongen provides graphs matching the standard set of RRD files: la, disk, memory, users, vmstat, iostat, netstat, tcp, bind, apache, sendmail
* If this option is specified, the list of graphs to include start out as being empty (no graphs).
* To include all default graphs, use an asterisk. E.g. "TRENDS:*"
* To exclude a certain graph, specify it prefixed with '!'. E.g. to see all graphs except users: "TRENDS:*,!users"
* The netstat, vmstat and tcp graphs have many "subgraphs". Which of these are shown can be specified like this: "TRENDS:*,netstat:netstat2|netstat3,tcp:http|smtp|conn" This will show all graphs, but instead of the normal netstat graph, there will be two: The netstat2 and netstat3 graphs. Instead of the combined tcp graphs showing all services, there will be three: One for each of the http, conn and smtp services.
COMPACT:COLUMN=COLUMN1|COLUMN2|COLUMN3[,ditto]
Collapses a series of statuses into a single column on the overview web page.
INTERFACES:REGEXP
On systems with multiple network interfaces, the operating system may report a number of network interface where the statistics are of no interest. By default Xymon tracks and graphs the traffic on all network interfaces. This option defines a regular expression, and only those interfaces whose name matches the expression are tracked.

 

XYMON TAGS FOR THE CRITICAL SYSTEMS OVERVIEW PAGE

NOTE: The "NK" set of tags is deprecated. They will be supported for Xymon 4.x, but will be dropped in version 5. It is recommended that you move your critical systems view to the criticalview.cgi(1) viewer, which has a separate configuration tool, criticaleditor.cgi(1) with more facilities than the NK tags in hosts.cfg.

xymongen will create three sets of pages: The main page xymon.html, the all-non-green-statuses page (nongreen.html), and a specially reduced version of nongreen.html with only selected tests (critical.html). This page includes selected tests that currently have a red or yellow status.

NK:testname[,testname]
NOTE: This has been deprecated, you should use criticalview.cgi(1) instead of the NK tag.

Define the tests that you want included on the critical page. E.g. if you have a host where you only want to see the http tests on critical.html, you specify it as


  12.34.56.78  www.acme.com  # http://www.acme.com/ NK:http

If you want multiple tests for a host to show up on the critical.html page, specify all the tests separated by commas. The test names correspond to the column names (e.g. https tests are covered by an "NK:http" tag).

NKTIME=day:starttime:endtime[,day:starttime:endtime]
This tag limits the time when an active alert is presented on the NK web page.

By default, tests with a red or yellow status that are listed in the "NK:testname" tag will appear on the NK page. However, you may not want the test to be shown outside of normal working hours - if, for example, the host is not being serviced during week-ends.

You can then use the NKTIME tag to define the time periods where the alert will show up on the NK page.

The time specification consists of

day-of-week: W means Mon-Fri ("weekdays"), * means all days, 0 .. 6 = Sunday .. Saturday. Listing multiple days is possible, e.g. "60" is valid meaning "Saturday and Sunday".

starttime: Time to start showing errors, must be in 24-hour clock format as HHMM hours/minutes. E.g. for 8 am enter "0800", for 9.30 pm enter "2130"

endtime: Time to stop showing errors.

If necessary, multiple periods can be specified. E.g. to monitor a site 24x7, except between noon and 1 pm, use NKTIME=*:0000:1159,*:1300:2359

The interval between start time and end time may cross midnight, e.g. *:2330:0200 would be valid and have the same effect as *:2330:2400,*:0000:0200.

 

XYMON TAGS FOR THE WML (WAP) CARDS

If xymongen is run with the "--wml" option, it will generate a set of WAP-format output "cards" that can be viewed with a WAP-capable device, e.g. a PDA or cell-phone.

WML:[+|-]testname[,[+|-]testname]
This tag determines which tests for this hosts are included in the WML (WAP) page. Syntax is identical to the NK: tag.

The default set of WML tests are taken from the --wml command line option. If no "WML:" tag is specified, the "NK:" tag is used if present.

 

XYMON STATUS PROPAGATION OPTIONS

These tags affect how a status propagates upwards from a single test to the page and higher. This can also be done with the command-line options --nopropyellow and --nopropred, but the tags apply to individual hosts, whereas the command line options are global.

NOPROPRED:[+|-]testname[,[+|-]testname]
This tag is used to inhibit a yellow or red status from propagating upwards - i.e. from a test status color to the (sub)page status color, and further on to xymon.html or nongreen.html

If a host-specific tag begins with a '-' or a '+', the host-specific tags are removed/added to the default setting from the command-line option. If the host-specific tag does not begin with a '+' or a '-', the default setting is ignored for this host and the NOPROPRED applies to the tests given with this tag.

E.g.: xymongen runs with "--nopropred=ftp,smtp". "NOPROPRED:+dns,-smtp" gives a NOPROPRED setting of "ftp,dns" (dns is added to the default, smtp is removed). "NOPROPRED:dns" gives a setting of "dns" only (the default is ignored).

Note: If you set use the "--nopropred=*" command line option to disable propagation of all alerts, you cannot use the "+" and "-" methods to add or remove from the wildcard setting. In that case, do not use the "+" or "-" setting, but simply list the required tests that you want to keep from propagating.

NOPROPYELLOW:[+|-]testname[,[+|-]testname]
Similar to NOPROPRED: tag, but applies to propagating a yellow status upwards.

NOPROPPURPLE:[+|-]testname[,[+|-]testname]
Similar to NOPROPRED: tag, but applies to propagating a purple status upwards.

NOPROPACK:[+|-]testname[,[+|-]testname]
Similar to NOPROPRED: tag, but applies to propagating an acknowledged status upwards.

 

XYMON AVAILABILITY REPORT OPTIONS

These options affect the way the Xymon availability reports are processed (see report.cgi(1) for details about availability reports).

REPORTTIME=day:starttime:endtime[,day:starttime:endtime]
This tag defines the time interval where you measure uptime of a service for reporting purposes.

When xymongen generates a report, it computes the availability of each service - i.e. the percentage of time that the service is reported as available (meaning: not red).

By default, this calculation is done on a 24x7 basis, so no matter when an outage occurs, it counts as downtime.

The REPORTTIME tag allows you to specify a period of time other than 24x7 for the service availability calculation. If you have systems where you only guarantee availability from e.g. 7 AM to 8 PM on weekdays, you can use

  REPORTTIME=W:0700:2000
and the availability calculation will only be performed for the service with measurements from this time interval.

The syntax for REPORTTIME is the same as the one used by the NKTIME parameter.

When REPORTTIME is specified, the availability calculation happens like this:

* Only measurements done during the given time period is used for the calculation.
* "blue" time reduces the length of the report interval, so if you are generating a report for a 10-hour period and there are 20 minutes of "blue" time, then the availability calculation will consider the reporting period to be 580 minutes (10 hours minus 20 minutes). This allows you to have scheduled downtime during the REPORTTIME interval without hurting your availability; this is (I believe) the whole idea of the downtime being "planned".
* "red" and "clear" status counts as downtime; "yellow" and "green" count as uptime. "purple" time is ignored.

The availability calculation correctly handles status changes that cross into/out of a REPORTTIME interval.

If no REPORTTIME is given, the standard 24x7 calculation is used.

WARNPCT:percentage
Xymon's reporting facility uses a computed availability threshold to color services green (100% available), yellow (above threshold, but less than 100%), or red (below threshold) in the reports.

This option allows you to set the threshold value on a host-by-host basis, instead of using a global setting for all hosts. The threshold is defined as the percentage of the time that the host must be available, e.g. "WARNPCT:98.5" if you want the threshold to be at 98.5%

noflap[=test1,test2,...]
Disable flap detection for this host, or for specific tests on this host. Flap detection is globally controlled by options given to xymond on the command line, but, if enabled, it can be disabled using this option.

 

NETWORK TEST SETTINGS

testip
By default, Xymon will perform a name lookup of the hostname to get the IP address it will use for network tests. This tag causes Xymon to use the IP listed in the hosts.cfg file.

NET:location
This tag defines the host as being tested from a specific location. If xymonnet sees that the environment variable XYMONNETWORK is set, it will only test the hosts that have a matching "NET:location" tag in the hosts.cfg file. So this tag is useful if you have more than one system running network tests, but you still want to keep a consolidated hosts.cfg file for all your systems.

Note: The "--test-untagged" option modifies this behaviour, see xymonnet(1)

noclear
Some network tests depend on others. E.g. if the host does not respond to ping, then there's a good chance that the entire host is down and all network tests will fail. Or if the http server is down, then any web content checks are also likely to fail. To avoid floods of alerts, the default behaviour is for xymonnet to change the status of these tests that fail because of another problem to "clear" instead of "red". The "noclear" tag disables this behaviour and causes all failing tests to be reported with their true color.

This behaviour can also be implemented on a per-test basis by putting the "~" flag on any network test.

Note that "noclear" also affects whether stale status messages from e.g. a client on the host go purple or clear when the host is down; see the "noclear" description in the "GENERAL PER-HOST OPTIONS" section above.

nosslcert
Disables the standard check of any SSL certificates for this host. By default, if an SSL-enabled service is tested, a second test result is generated with information about the SSL certificate - this tag disables the SSL certificate checks for the host.

ssldays=WARNDAYS:ALARMDAYS
Define the number of days before an SSL certificate expires, in which the sslcert status shows a warning (yellow) or alarm (red) status. These default to the values from the "--sslwarn" and "--sslalarm" options for the xymonnet(1) tool; the values specified in the "ssldays" tag overrides the default.

sslbits=MINIMUMKEYBITS
Enable checking of the encryption strength of the SSL protocol offered by the server. If the server offers encryption using a key with fewer than MINIMUMKEYBITS bits, the "sslcert" test will go red. E.g. to check that your server only uses strong encryption (128 bits or better), use "sslbits=128".

sni
nosni
Enables or disables use of SNI (Server Name Indication) for SSL tests.

Some SSL implementations cannot handle SSL handshakes with SNI data, so Xymon by default does not use SNI. This default can be changed with the "--sni" option for xymonnet(1) but can also be managed per host with these tags.

SNI support was added in Xymon 4.3.13, where the default was to use SNI. This was changed in 4.3.14 so SNI support is disabled by default, and the "sni" and "nosni" tags were introduced together with the "--sni" option for xymonnet.

DOWNTIME=day:starttime:endtime[,day:starttime:endtime]
DOWNTIME=columns:day:starttime:endtime:cause[,columns:day:starttime:endtime:cause]
This tag can be used to ignore failed checks during specific times of the day - e.g. if you run services that are only monitored e.g. Mon-Fri 8am-5pm, or you always reboot a server every Monday between 5 and 6 pm.

What happens is that if a test fails during the specified time, it is reported with status BLUE instead of red, yellow, or purple. Thus you can still see when the service was unavailable, but alarms will not be triggered and the downtime is not counted in the availability calculations generated by the Xymon reports.

The "columns" and "cause" settings are optional, but both or neither must be specified. "columns" may be a comma-separated list of status columns to which DOWNTIME will apply. The "cause" string will be displayed on the status web page to explain why the system is down.

The syntax for DOWNTIME is the same as the one used by the NKTIME parameter.

SLA=day:starttime:endtime[,day:starttime:endtime]
This tag is now deprecated. Use the DOWNTIME tag instead.

This tag works the opposite of the DOWNTIME tag - you use it to specify the periods of the day that the service should be green. Failures OUTSIDE the SLA interval are reported as blue.

depends=(testA:host1/test1,host2/test2),(testB:host3/test3),[...]
This tag allows you to define dependencies between tests. If "testA" for the current host depends on "test1" for host "host1" and test "test2" for "host2", this can be defined with


   depends=(testA:host1/test1,host2/test2)

When deciding the color to report for testA, if either host1/test1 failed or host2/test2 failed, if testA has failed also then the color of testA will be "clear" instead of red or yellow.

Since all tests are actually run before the dependencies are evaluated, you can use any host/test in the dependency - regardless of the actual sequence that the hosts are listed, or the tests run. It is also valid to use tests from the same host that the dependency is for. E.g.


   1.2.3.4  foo # http://foo/ webmin depends=(webmin:foo/http)

is valid; if both the http and the webmin tests fail, then webmin will be reported as clear.

Note: The "depends" tag is evaluated by xymonnet while running the network tests. It can therefore only refer to other network tests that are handled by the same server - there is currently no way to use the e.g. the status of locally run tests (disk, cpu, msgs) or network tests from other servers in a dependency definition. Such dependencies are silently ignored.

badTEST[-weekdays-starttime-endtime]:x:y:z
NOTE: This has been deprecated, use the delayred and delayyellow settings instead.

Normally when a network test fails, the status changes to red immediately. With a "badTEST:x:y:z" tag this behaviour changes:
* While "z" or more successive tests fail, the column goes RED.
* While "y" or more successive tests fail, but fewer than "z", the column goes YELLOW.
* While "x" or more successive tests fail, but fewer than "y", the column goes CLEAR.
* While fewer than "x" successive tests fail, the column stays GREEN.

The optional time specification can be used to limit this "badTEST" setting to a particular time of day, e.g. to require a longer period of downtime before raising an alarm during out-of-office hours. The time-specification uses:
* Weekdays: The weekdays this badTEST tag applies, from 0 (Sunday) through 6 (Saturday). Putting "W" here counts as "12345", i.e. all working days. Putting "*" here counts as all days of the week, equivalent to "0123456".
* start time and end time are specified using 24-hour clocks, e.g. "badTEST-W-0900-2000" is valid for working days between 9 AM (09:00) and 8 PM (20:00).

When using multiple badTEST tags, the LAST one specified with a matching time-spec is used.

Note: The "TEST" is replaced by the name of the test, e.g.


 12.34.56.78  www.foo.com  # http://www.foo.com/ badhttp:1:2:4

defines a http test that goes "clear" after the first failure, "yellow" after two successive failures, and "red" after four successive failures.

For LDAP tests using URL's, use the option "badldapurl". For the other network tests, use "badftp", "badssh" etc.

 

CONNECTIVITY (PING) TEST

These tags affect the behaviour of the xymonnet connectivity test.

noping
Disables the ping-test, but will keep the "conn" column on the web display with a notice that it has been disabled.

noconn
Disables the ping-test, and does not put a "conn" column on the web display.

conn
The "conn" test (which does a ping of the host) is enabled for all hosts by default, and normally you just want to disable it using "noconn" or "noping". However, on the rare occasion where you may want to check that a host is NOT up, you can specify it as an explicit test, and use the normal test modifiers, e.g. "!conn" will be green when the host is NOT up, and red if it does appear on the network.

The actual name of the tag - "conn" by default - depends on the "--ping=TESTNAME" option for xymonnet, as that decides the testname for the connectivity test.

conn={best,|worst,}IP1[,IP2...]
This adds additional IP-addresses that are pinged during the normal "conn" test. So the normal "conn" test must be enabled (the default) before this tag has any effect. The IP-addresses listed here are pinged in addition to the main IP-address.

When multiple IP's are pinged, you can choose if ALL IP's must respond (the "worst" method), or AT LEAST one IP must respond (the "best" setting). All of the IP's are reported in a single "conn" status, whose color is determined from the result of pinging the IP's and the best/worst setting. The default method is "best" - so it will report green if just one of the IP's respond to ping.

badconn[-weekdays-starttime-endtime]:x:y:z
This is taken directly from the "fping.sh" connectivity- testing script, and is used by xymonnet when it runs with ping testing enabled (the default). See the description of the "badTEST" tag.

route:router1,router2,....
This tag is taken from the "fping.sh" script, and is used by xymonnet when run with the "--ping" option to enable ping testing.

The router1,router2,... is a comma-separated list of hosts elsewhere in the hosts.cfg file. You cannot have any spaces in the list - separate hosts with commas.

This tag changes the color reported for a ping check that fails, when one or more of the hosts in the "route" list is also down. A "red" status becomes "yellow" - other colors are unchanged. The status message will include information about the hosts in the router-list that are down, to aid tracking down which router is the root cause of the problem.

Note: Internally, the ping test will still be handled as "failed", and therefore any other tests run for this host will report a status of "clear".

route_LOCATION:router1,router2,...
If the XYMONNETWORK environment variable is defined, a tag of "route_XYMONNETWORK:" is recognized by xymonnet with the same effect as the normal "route:" tag (see above). This allows you to have different route: tags for each server running xymonnet. The actual text for the tag then must match the value you have for the XYMONNETWORK setting. E.g. with XYMONNETWORK=dmz, the tag becomes "route_dmz:"

trace
If the connectivity test fails, run a "traceroute" and include the output from this in the status message from the failed connectivity test. Note: For this to work, you may have to define the TRACEROUTE environment variable, see xymonserver.cfg(5)

notrace
Similar to the "trace" option, this disables the running of a traceroute for the host after a failed connectivity test. It is only used if running traceroute is made the default via the --trace option.

 

SIMPLE NETWORK TESTS

These tests perform a simple network test of a service by connecting to the port and possibly checking that a banner is shown by the server.

How these tests operate are configured in the protocols.cfg(5) configuration file, which controls which port to use for the service, whether to send any data to the service, whether to check for a response from the service etc.

You can modify the behaviour of these tests on a per-test basis by adding one or more modifiers to the test: :NUMBER changes the port number from the default to the one you specify for this test. E.g. to test ssh running on port 8022, specify the test as ssh:8022.

:s makes the test silent, i.e. it does not send any data to the service. E.g. to do a silent test of an smtp server, enter smtp:s.

You can combine these two: ftp:8021:s is valid.

If you must test a service from a multi-homed host (i.e. using a specific source IP-address instead of the one your operating system provides), you can use the modifier "@IPADDRESS" at the end of the test specification, after any other modifiers or port number. "IPADDRESS" must be a valid dotted IP-address (not hostname) which is assigned to the host running the network tests.

The name of the test also determines the column name that the test result will appear with in the Xymon webpages.

By prefixing a test with "!" it becomes a reverse test: Xymon will expect the service NOT to be available, and send a green status if it does NOT respond. If a connection to the service succeeds, the status will go red.

By prefixing a test with "?" errors will be reported with a "clear" status instead of red. This is known as a test for a "dialup" service, and allows you to run tests of hosts that are not always online, without getting alarms while they are off-line.

ftp ssh telnet smtp pop3 imap nntp rsync clamd oratns qmtp qmqp
These tags are for testing services offering the FTP, Secure Shell (ssh), SMTP, POP3, IMAP, NNTP, rsync, CLAM anti-virus daemon (clamd), Oracle TNS listener (oratns), qmail QMTP and QMQP protocols.

ftps telnets smtps pop3s imaps nntps
These tags are for testing of the SSL-tunneled versions of the standard ftp, telnet, smtp, pop3, imap and nntp protocols. If Xymon was configured with support for SSL, you can test these services like any other network service - xymonnet will setup an SSL-encrypted session while testing the service. The server certificate is validated and information about it sent in the "sslcert" column. Note that smtps does not have a standard port number assignment, so you will need to enter this into the protocols.cfg file or your /etc/services file.

bbd
Test that a Big Brother compatible daemon is running. This check works both for the Xymon xymond(8) daemon, and the original Big Brother bbd daemon.

 

DNS SERVER TESTS

These tags are used to setup monitoring of DNS servers.

dns
Simple DNS test. It will attempt to lookup the A record for the hostname of the DNS server.

dig
This is an alias for the "dns" test. In xymonnet, the "dns" and "dig" tests are handled identically, so all of the facilities for testing described for the "dns" test are also available for the "dig" test.

dns=hostname
dns=TYPE:lookup[,TYPE:lookup...]
The default DNS tests will attempt a DNS lookup of the DNS' servers own hostname. You can specify the hostname to lookup on a DNS server by listing it on each test.

The second form of the test allows you to perform multiple queries of the DNS server, requesting different types of DNS records. The TYPE defines the type of DNS data: A (IP-address), MX (Mail eXchanger), PTR (reverse), CNAME (alias), SOA (Start-Of-Authority), NS (Name Server) are among the more common ones used. The "lookup" is the query. E.g. to lookup the MX records for the "foo.com" domain, you would use "dns=mx:foo.com". Or to lookup the nameservers for the "bar.org" domain, "dns=ns:bar.org". You can list multiple lookups, separated by commas. For the test to end up with a green status, all lookups must succeed.

 

OTHER NETWORK TESTS

ntp
Check for a running NTP (Network Time Protocol) server on this host. This test uses the "ntpdate" utility to check for a NTP server - you should either have ntpdate in your PATH, or set the location of the ntpdate program in $XYMONHOME/etc/xymonserver.cfg

rpc[=rpcservice1,rpcservice2,...]
Check for one or more available RPC services. This check is indirect in that it only queries the RPC Portmapper on the host, not the actual service.

If only "rpc" is given, the test only verifies that the port mapper is available on the remote host. If you want to check that one or more RPC services are registered with the port mapper, list the names of the desired RPC services after the equals-sign. E.g. for a working NFS server the "mount", "nlockmgr" and "nfs" services must be available; this can be checked with "rpc=mount,nlockmgr,nfs".

This test uses the rpcinfo tool for the actual test; if this tool is not available in the PATH of xymonnet, you must define the RPCINFO environment variable to point at this tool. See xymonserver.cfg(5)

 

HTTP TESTS

Simple testing of a http URL is done simply by putting the URL into the hosts.cfg file. Note that this only applies to URL's that begin with "http:" or "https:".

The following items describe more advanced forms of http URL's.

Basic Authentication with username/password
If the URL requires authentication in the form of a username and password, it is most likely using the HTTP "Basic" authentication. xymonnet support this, and you can provide the username and password either by embedding them in the URL e.g.

    http://USERNAME:PASSWORD@www.sample.com/
or by putting the username and password into the ~/.netrc file (see ftp(1) for details).

Authentication with SSL client certificates
An SSL client certificate can be used for authentication. To use this, the client certificate must be stored in a PEM-formatted file together with the client certificate key, in the $XYMONHOME/certs/ directory. The URL is then given as

    http://CERT:FILENAME@www.sample.com/
The "CERT:" part is literal - i.e. you write C-E-R-T-colon and then the filename of the PEM-formatted certificate.
A PEM-formatted certificate file can be generated based on certificates stored in Microsoft Internet Explorer and OpenSSL. Do as follows:
From the MSIE Tools-Options menu, pick the Content tab, click on Certificates, choose the Personal tab, select the certificate and click Export. Make sure you export the private key also. In the Export File Format, choose PKCS 12 (.PFX), check the "Include all certificates" checkbox and uncheck the "Enable strong protection". Provide a temporary password for the exported file, and select a filename for the PFX-file.
Now run "openssl pkcs12 -in file.pfx -out file.pem". When prompted for the "Import Password", provide the temporary password you gave when exporting the certificate. Then provide a "PEM pass phrase" (twice) when prompted for one.
The file.pem file is the one you should use in the FILENAME field in the URL - this file must be kept in $XYMONHOME/certs/. The PEM pass phrase must be put into a file named the same as the certificate, but with extension ".pass". E.g. if you have the PEM certificate in $XYMONHOME/certs/client.pem, you must put the pass phrase into the $XYMONHOME/certs/client.pass file. Make sure to protect this file with Unix permissions, so that only the user running Xymon can read it.

Forcing an HTTP or SSL version
Some SSL sites will only allow you to connect, if you use specific "dialects" of HTTP or SSL. Normally this is auto-negotiated, but experience shows that this fails on some systems.

xymonnet can be told to use specific dialects, by adding one or more "dialect names" to the URL scheme, i.e. the "http" or "https" in the URL:

* "2", e.g. https2://www.sample.com/ : use only SSLv2
* "3", e.g. https3://www.sample.com/ : use only SSLv3
* "t", e.g. httpst://www.sample.com/ : use only TLSv1.0
* "a", e.g. httpsa://www.sample.com/ : use only TLSv1.0
* "b", e.g. httpsb://www.sample.com/ : use only TLSv1.1
* "c", e.g. httpsc://www.sample.com/ : use only TLSv1.2
* "m", e.g. httpsm://www.sample.com/ : use only 128-bit ciphers
* "h", e.g. httpsh://www.sample.com/ : use only >128-bit ciphers
* "10", e.g. http10://www.sample.com/ : use HTTP 1.0
* "11", e.g. http11://www.sample.com/ : use HTTP 1.1

These can be combined where it makes sense, e.g to force TLS1.2 and HTTP 1.0 you would use "httpsc10".

Note that SSLv2 support is disabled in all current OpenSSL releases. TLS version-specific scheme testing requires OpenSSL 1.0.1 or higher.

Testing sites by IP-address
xymonnet ignores the "testip" tag normally used to force a test to use the IP-address from the hosts.cfg file instead of the hostname, when it performs http and https tests.

The reason for this is that it interacts badly with virtual hosts, especially if these are IP-based as is common with https-websites.

Instead the IP-address to connect to can be overridden by specifying it as:

        http://www.sample.com=1.2.3.4/index.html

The "=1.2.3.4" will case xymonnet to run the test against the IP-address "1.2.3.4", but still trying to access a virtual website with the name "www.sample.com".

The "=ip.address.of.host" must be the last part of the hostname, so if you need to combine this with e.g. an explicit port number, it should be done as

        http://www.sample.com:3128=1.2.3.4/index.html

HTTP Testing via proxy
NOTE: This is not enabled by default. You must add the "--bb-proxy-syntax" option when running xymonnet(1) if you want to use this.

xymonnet supports the Big Brother syntax for specifying an HTTP proxy to use when performing http tests. This syntax just joins the proxy- and the target-URL into one, e.g.

    http://webproxy.sample.com:3128/http://www.foo.com/
would be the syntax for testing the www.foo.com website via the proxy running on "webproxy.sample.com" port 3128.

If the proxy port number is not specified, the default HTTP port number (80) is used.

If your proxy requires authentication, you can specify the username and password inside the proxy-part of the URL, e.g.

    http://fred:Wilma1@webproxy.sample.com:3128/http://www.foo.com/
will authenticate to the proxy using a username of "fred" and a password of "Wilma1", before requesting the proxy to fetch the www.foo.com homepage.

Note that it is not possible to test https-sites via a proxy, nor is it possible to use https for connecting to the proxy itself.

cont[=COLUMN];URL;[expected_data_regexp|#digesttype:digest]
This tag is used to specify a http/https check, where it is also checked that specific content is present in the server response.

If the URL itself includes a semi-colon, this must be escaped as '%3B' to avoid confusion over which semicolon is part of the URL, and which semicolon acts as a delimiter.

The data that must be returned can be specified either as a regular expression (except that <space> is not allowed) or as a message digest (typically using an MD5 sum or SHA-1 hash).

The regex is pre-processed for backslash "\" escape sequences. So you can really put any character in this string by escaping it first:

   \n     Newline (LF, ASCII 10 decimal)

   \r     Carriage return (CR, ASCII 13 decimal)

   \t     TAB (ASCII 8 decimal)

   \\    Backslash (ASCII 92 decimal)

   \XX    The character with ASCII hex-value XX

If you must have whitespace in the regex, use the [[:space:]] syntax, e.g. if you want to test for the string "All is OK", use "All[[:space:]]is[[:space:]]OK". Note that this may depend on your particular implementation of the regex functions found in your C library. Thanks to Charles Goyard for this tip.

Note: If you are migrating from the "cont2.sh" script, you must change the '_' used as wildcards by cont2.sh into '.' which is the regular-expression wildcard character.

Message digests can use whatever digest algorithms your libcrypto implementation (usually OpenSSL) supports. Common message digests are "md5", "sha1", "sha256" or "sha512". The digest is calculated on the data portion of the response from the server, i.e. HTTP headers are not included in the digest (as they change from one request to the next).

The expected digest value can be computed with the xymondigest(1) utility.

"cont" tags in hosts.cfg result in two status reports: One status with the "http" check, and another with the "content" check.

As with normal URL's, the extended syntax described above can be used e.g. when testing SSL sites that require the use of SSLv2 or strong ciphers.

The column name for the result of the content check is by default called "content" - you can change the default with the "--content=NAME" option to xymonnet. See xymonnet(1) for a description of this option.

If more than one content check is present for a host, the first content check is reported in the column "content", the second is reported in the column "content1", the third in "content2" etc.

You can also specify the column name directly in the test specification, by writing it as "cont=COLUMN;http://...". Column-names cannot include whitespace or semi-colon.

The content-check status by default includes the full URL that was requested, and the HTML data returned by the server. You can hide the HTML data on a per-host (not per-test) basis by adding the HIDEHTTP tag to the host entry.

content=URL
This syntax is deprecated. You should use the "cont" tag instead, see above.

post[=COLUMN];URL;form-data;[expected_data_regexp|#digesttype:digest]
This tag can be used to test web pages, that use an input form. Data can be posted to the form by specifying them in the form-data field, and the result can be checked as if it was a normal content check (see above for a description of the cont-tag and the restrictions on how the URL must be written).

The form-data field must be entered in "application/x-www-form-urlencoded" format, which is the most commonly used format for web forms.

E.g. if you have a web form defined like this:


   <form action="/cgi-bin/form.cgi" method="post">

     <p>Given name<input type="text" name="givenname"></p>

     <p>Surname<input type="text" name="surname"></p>

     <input type="submit" value="Send">

   </form>

and you want to post the value "John" to the first field and "Doe Jr." to the second field, then the form data field would be


    givenname=John&surname=Doe+Jr.

Note that any spaces in the input value is replaced with '+'.

If your form-data requires a different content-type, you can specify it by beginning the form-data with (content-type=TYPE), e.g. "(content-type=text/xml)" followed by the POST data. Note that as with normal forms, the POST data should be specified using escape-sequences for reserved characters: "space" should be entered as "\x20", double quote as "\x22", newline as "\n", carriage-return as "\r", TAB as "\t", backslash as "\\". Any byte value can be entered using "\xNN" with NN being the hexadecimal value, e.g. "\x20" is the space character.

The [expected_data_regexp|#digesttype:digest] is the expected data returned from the server in response to the POST. See the "cont;" tag above for details. If you are only interested in knowing if it is possible to submit the form (but don't care about the data), this can be an empty string - but the ';' at the end is required.

nocont[=COLUMN];URL;forbidden_data_regexp
This tag works just like "cont" tag, but reverses the test. It is green when the "forbidden_data_regexp" is NOT found in the response, and red when it IS found. So it can be used to watch for data that should NOT be present in the response, e.g. a server error message.

nopost[=COLUMN];URL;form-data;expected_data_regexp
This tag works just like "post" tag, but reverses the test. It is green when the "forbidden_data_regexp" is NOT found in the response, and red when it IS found. So it can be used to watch for data that should NOT be present in the response, e.g. a server error message.

type[=COLUMN];URL;expected_content_type
This is a variant of the content check - instead of checking the content data, it checks the type of the data as given by the HTTP Content-Type: header. This can used to check if a URL returns e.g. a PDF file, regardless of what is inside the PDF file.

soap[=COLUMN];URL;SOAPMESSAGE;[expected_data_regexp|#digesttype:digest]
Send SOAP message over HTTP. This is identical to the "cont" test, except that the request sent to the server uses a Content-type of "application/soap+xml", and it also sends a "SOAPAction" header with the URL. SOAPMESSAGE is the SOAP message sent to the server. Since SOAP messages are usually XML documents, you can store this in a separate file by specifying "file:FILENAME" as the SOAPMESSAGE parameter. E.g. a test specification of
    soap=echo;http://soap.foo.bar/baz?wsdl;file:/home/foo/msg.xml;. will read the SOAP message from the file /home/foo/msg.xml and post it to the URL http://soap.foo.bar/bas?wsdl

Note that SOAP XML documents usually must begin with the XML version line, <?xml version="1.0">

nosoap[=COLUMN];URL;SOAPMESSAGE;[forbidden_data_regexp|#digesttype:digest]
This tag works just like "soap" tag, but reverses the test. It is green when the "forbidden_data_regexp" is NOT found in the response, and red when it IS found. So it can be used to watch for data that should NOT be present in the response, e.g. a server error message.

httphead[=COLUMN];URL
This is used to perform an HTTP HEAD request instead of a GET.

httpstatus[=COLUMN];URL;okstatusexpr;notokstatusexpr
This is used to explicitly test for certain HTTP statuscodes returned when the URL is requested. The okstatusexpr and nokokstatusexpr expressions are Perl-compatible regular expressions, e.g. "2..|302" will match all OK codes and the redirect (302) status code. If the URL cannot be retrieved, the status is "999".

HIDEHTTP
The status display for HTTP checks usually includes the URL, and for content checks also the actual data from the web page. If you would like to hide these from view, then the HIDEHTTP tag will keep this information from showing up on the status webpages.

headermatch
Content checks by default only search the HTML body returned by the webserver. This option causes it to also search the HTTP headers for the string that must / must not be present.

browser=BROWSERNAME
By default, Xymon sends an HTTP "User-Agent" header identifying it a "Xymon". Some websites require that you use a specific browser, typically Internet Explorer. To cater for testing of such sites, this tag can be used to modify the data sent in the User-Agent header.
E.g. to perform an HTTP test with Xymon masquerading as an Internet Explorer 6.0 browser, use browser="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)". If you do not know what the User-Agent header should be, open up the browser that works with this particular site, and open the URL "javascript:document.writeln(navigator.userAgent)" (just copy this into the "Open URL" dialog. The text that shows up is what the browser sends as the User-Agent header.

httphdr=STRING
Xymon can be send additional headers when performing HTTP checks, to allow for validation of any custom configurations needed for your site. Note that this is a host-wide configuration. The string will be added directly to the headers for all URLs on that host. There is currently no way to have this occur only for specific URLs checked.
The string should be encased in quotes, like httphdr="X-Requested-With: XMLHttpRequest". Newlines can be included, however the string MUST NOT end with a newline as that may cause premature ending of the headers sent.

 

LDAP (DIRECTORY SERVER) TESTS

ldap
ldaps
Simple check for an LDAP service. This check merely looks for any service running on the ldap/ldaps service port, but does not perform any actual LDAP transaction.

ldap://hostport/dn[?attrs[?scope[?filter[?exts]]]]
Check for an LDAP service by performing an LDAP request. This tag is in the form of an LDAP URI (cf. RFC 2255). This type of LDAP test requires that xymonnet(1) was built with support for LDAP, e.g. via the OpenLDAP library. The components of the LDAP URI are:
  hostport is a host name with an optional ":portnumber"
  dn is the search base
  attrs is a comma separated list of attributes to request
  scope is one of these three strings:
    base one sub (default=base)
  filter is filter
  exts are recognized set of LDAP and/or API extensions.

ldaps://hostport/dn[?attrs[?scope[?filter[?exts]]]]
LDAP service check using LDAPv3 and STARTTLS for talking to an LDAP server that requires TLS encryption. See xymonnet(1) for a discussion of the different ways of running LDAP servers with SSL/TLS, and which of these are supported by xymonnet.

ldaplogin=username:password
Define a username and password to use when binding to the LDAP server for ldap URI tests. If not specified, xymonnet will attempt an anonymous bind.

ldapyellowfail
Used with an LDAP URL test. If the LDAP query fails during the search of the directory, the ldap status is normally reported as "red" (alarm). This tag reduces a search failure to a "yellow" (warning) status.

 

PERFORMANCE MONITORING TESTS

apache[=URL]
If you are running an Apache web server, adding this tag makes xymonnet(1) collect performance statistics from the Apache web server by querying the URL http://IP.ADDRESS.OF.HOST/server-status?auto. The response is sent as a data-report and processed by the Xymon xymond_rrd module into an RRD file and an "apache" graph. If your web server requires e.g. authentication, or runs on a different URL for the server-status, you can provide the full URL needed to fetch the server-status page, e.g. apache=http://LOGIN:PASSWORD@10.0.0.1/server-status?auto for a password protected server-status page, or apache=http://10.0.0.1:8080/apache/server-status?auto for a server listening on port 8080 and with a different path to the server-status page.

Note that you need to enable the server-status URL in your Apache configuration. The following configuration is needed:


    <Location /server-status>

        SetHandler server-status

        Order deny,allow

        Deny from all

        allow from 127.0.0.1

    </Location>

    ExtendedStatus On

Change "127.0.0.1" to the IP-address of the server that runs your network tests.

 

DEFAULT HOST

If you have certain tags that you want to apply to all hosts, you can define a host name ".default." and put the tags on that host. Note that per-host definitions will override the default ones. To apply to all hosts this should be listed FIRST in your file.

NOTE: The ".default." host entry will only accept the following tags - others are silently ignored: delayyellow, delayred, NOCOLUMNS, COMMENT, DESCR, CLASS, dialup, testip, nonongreen, nodisp, noinfo, notrends, noclient, TRENDS, NOPROPRED, NOPROPYELLOW, NOPROPPURPLE, NOPROPACK, REPORTTIME, WARNPCT, NET, noclear, nosslcert, ssldays, DOWNTIME, depends, noping, noconn, trace, notrace, HIDEHTTP, browser, pulldata. Specifically, note that network tests, "badTEST" settings, and alternate pageset relations cannot be listed on the ".default." host.

 

SENDING SUMMARIES TO REMOTE XYMON SERVERS

summary ROW.COLUMN IP URL
If you have multiple Xymon servers, the "summary" directive lets you form a hierarchy of servers by sending the overall status of this server to a remote Xymon server, which then displays this in a special summary section. E.g. if your offices are spread over three locations, you can have a Xymon server at each office. These branch-office Xymon have a "summary" definition in their hosts.cfg file that makes them report the overall status of their branch Xymon to the central Xymon server you maintain at the corporate headquarters.

Multiple "summary" definitions are allowed.

The ROW.COLUMN setting defines how this summary is presented on the server that receives the summary. The ROW text will be used as the heading for a summary line, and the COLUMN defines the name of the column where this summary is shown - like the hostname and testname used in the normal displays. The IP is the IP-address of the remote (upstream) Xymon server, where this summary is sent). The URL is the URL of your local Xymon server.

The URL need not be that of your Xymon server's main page - it could be the URL of a sub-page on the local Xymon server. Xymon will report the summary using the color of the page found at the URL you specify. E.g. on your corporate Xymon server you want a summary from the Las Vegas office - but you would like to know both what the overall status is, and what is the status of the servers on the critical Sales department back-office servers in Las Vegas. So you configure the Las Vegas Xymon server to send two summaries:


    summary Vegas.All 10.0.1.1 http://vegas.foo.com/xymon/

    summary Vegas.Sales 10.0.1.1 http://vegas.foo.com/xymon/sales/

This gives you one summary line for Baltimore, with two columns: An "All" column showing the overall status, and a "Sales" column showing the status of the "sales" page on the Baltimore Xymon server.

Note: Pages defined using alternate pageset definitions cannot be used, the URL must point to a web page from the default set of Xymon webpages.

 

OTHER TAGS

pulldata[=[IP][:port]]
This option is recognized by the xymonfetch(8) utility, and causes it to poll the host for client data. The optional IP-address and port-number can be used if the client-side msgcache(8) daemon is listening on a non-standard IP-address or port-number.

 

FILES

~xymon/server/etc/hosts.cfg

 

SEE ALSO

xymongen(1), xymonnet(1), xymondigest(1), xymonserver.cfg(5), xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
FILE FORMAT
TAGS RECOGNIZED BY ALL TOOLS
GENERAL PER-HOST OPTIONS
XYMONGEN DISPLAY OPTIONS
XYMON TAGS FOR THE CRITICAL SYSTEMS OVERVIEW PAGE
XYMON TAGS FOR THE WML (WAP) CARDS
XYMON STATUS PROPAGATION OPTIONS
XYMON AVAILABILITY REPORT OPTIONS
NETWORK TEST SETTINGS
CONNECTIVITY (PING) TEST
SIMPLE NETWORK TESTS
DNS SERVER TESTS
OTHER NETWORK TESTS
HTTP TESTS
LDAP (DIRECTORY SERVER) TESTS
PERFORMANCE MONITORING TESTS
DEFAULT HOST
SENDING SUMMARIES TO REMOTE XYMON SERVERS
OTHER TAGS
FILES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man5/xymon-xmh.5.html0000664000076400007640000001433613037531445021606 0ustar rpmbuildrpmbuild Manpage of XYMON-XMH

XYMON-XMH

Section: File Formats (5)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

Xymon-XMH-variables - Configuration items available online

 

DESCRIPTION

The hosts.cfg(5) file is the most important configuration file for all of the Xymon programs. This file contains the full list of all the systems monitored by Xymon, including the set of tests and other configuration items stored for each host.

Although the file is in text format and can be searched using tools like xymongrep(1) it can be difficult to pick out specific fields from the configuration due to quoting and other text parsing issues. So Xymon allows for querying this information directly from the xymond daemon via the "xymondboard" command. So the information can be provided together with the current status of a host and/or test. This is done by adding a "fields" definition to the "xymondboard" command.

 

XMH items

Except where specified below, all items return the text of a particular setting from the hosts.cfg file, or an empty string if the setting has not been set for the host that is queried.

XMH_ALLPAGEPATHS
List of all pages where the host is found, using the filename hierarchy page path.

XMH_BROWSER
Value of the "browser" tag.

XMH_CLASS
The host "class" (if reported by a Xymon client), or the value of the CLASS tag.

XMH_CLIENTALIAS
Value of the CLIENT tag.

XMH_COMMENT
Value of the COMMENT tag.

XMH_COMPACT
Value of the COMPACT tag.

XMH_DEPENDS
Value of the DEPENDS tag.

XMH_DESCRIPTION
Value of the DESCR tag.

XMH_DGNAME
The text string from the hosts.cfg "group" definition (group, group-only, group-except) in which the host is defined.

XMH_DISPLAYNAME
Value of the NAME tag.

XMH_DOCURL
Value of the DOC tag.

XMH_DOWNTIME
Value of the DOWNTIME tag.

XMH_PULLDATA
Value of the PULLDATA tag (including IP:PORT, if any)

XMH_FLAG_DIALUP
Value of the "dialup" tag.

XMH_FLAG_HIDEHTTP
Value of the HIDEHTTP tag.

XMH_FLAG_LDAPFAILYELLOW
Value of the "ldapyellowfail" tag.

XMH_FLAG_MULTIHOMED
Value of the MULTIHOMED tag.

XMH_FLAG_NOBB2
Value of the "nobb2" tag (deprecated, use NONONGREEN instead).

XMH_FLAG_NOCLEAR
Value of the NOCLEAR tag.

XMH_FLAG_NOCLIENT
Value of the "noclient" tag.

XMH_FLAG_NOCONN
Value of the "noconn" tag.

XMH_FLAG_NODISP
Value of the "nodisp" tag.

XMH_FLAG_NOINFO
Value of the "noinfo" atg.

XMH_FLAG_NONONGREEN
Value of the "nonongreen" tag.

XMH_FLAG_NOPING
Value of the "noping" tag.

XMH_FLAG_NOSSLCERT
Value of the "nosslcert" tag.

XMH_FLAG_NOTRACE
Value of the "notrace" tag.

XMH_FLAG_NOTRENDS
Value of the "notrends" tag.

XMH_FLAG_PREFER
Value of the "prefer" tag.

XMH_FLAG_TESTIP
Value of the "testip" tag.

XMH_FLAG_TRACE
Value of the "trace" tag.

XMH_GROUPID
Number of the group where the host is listed - first group is 0. If a host is present on multiple pages, this is the number of the group for the first page where the host is found.

XMH_HOLIDAYS
Value of the "holidays" tag.

XMH_HOSTNAME
The name of the host.

XMH_HTTPHEADERS
Value of the "httphdr" tag.

XMH_IP
The IP-address of the host (as specified in hosts.cfg).

XMH_LDAPLOGIN
Value of the "ldaplogin" tag.

XMH_NET
Value of the NET tag.

XMH_NK
Value of the NK tag (deprecated).

XMH_NKTIME
Value of the NKTIME tag (deprecated).

XMH_NOCOLUMNS
Value of the NOCOLUMNS tag.

XMH_NOPROP
Value of the NOPROP tag.

XMH_NOPROPACK
Value of the NOPROPACK tag.

XMH_NOPROPPURPLE
Value of the NOPROPPURPLE tag.

XMH_NOPROPRED
Value of the NOPROPRED tag.

XMH_NOPROPYELLOW
Value of the NOPROPYELLOW tag.

XMH_NOTAFTER
Value of the NOTAFTER tag.

XMH_NOTBEFORE
Value of the NOTBEFORE tag.

XMH_OS
The host operating system (if reported by a Xymon client), or the value of the OS tag.

XMH_PAGEINDEX
Index of the host on the page where it is shown, first host has index 0.

XMH_PAGENAME
Name of the page where the host is shown (see also XMH_PAGEPATH).

XMH_PAGEPATH
File path to the page where the host is shown.

XMH_PAGEPATHTITLE
Title of the full path to the page where the host is shown.

XMH_PAGETITLE
Title of the page where the host is shown.

XMH_RAW
All configuration settings for the host. Settings are separated by a pipe-sign.

XMH_REPORTTIME
Value of the REPORTTIME tag.

XMH_SSLDAYS
Value of the "ssldays" tag.

XMH_SSLMINBITS
Value of the "sslbits" tag.

XMH_TRENDS
Value of the TRENDS tag.

XMH_WARNPCT
Value of the WARNPCT tag.

XMH_WARNSTOPS
Value of the WARNSTOPS tag.

XMH_WML
Value of the WML tag.

 

SEE ALSO

xymon(1), hosts.cfg(5), xymongrep(1)


 

Index

NAME
DESCRIPTION
XMH items
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man5/xymonserver.cfg.5.html0000664000076400007640000010037713037531445023002 0ustar rpmbuildrpmbuild Manpage of XYMONSERVER.CFG

XYMONSERVER.CFG

Section: File Formats (5)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

xymonserver.cfg - Xymon environment variables

 

DESCRIPTION

Xymon programs use multiple environment variables beside the normal set of variables. The environment definitions are stored in the ~Xymon/server/etc/xymonserver.cfg file. Each line in this file is of the form NAME=VALUE and defines one environment variable NAME with the value VALUE.

You can also append data to existing variables, using the syntax NAME+=VALUE. VALUE is then appended to the existing value of the NAME variable. If NAME has not been defined, then this acts as if it were a normal definition.

 

ENVIRONMENT AREAS

In some cases it may be useful to have different values for an environment variable, depending on where it is used. This is possible by defining variables with an associated "area". Such definitions have the form AREA/NAME=VALUE.

E.g. to define a special setup of the XYMSERVERS variable when it is used by an application in the "management" area, you would do this:

  XYMSERVERS="127.0.0.1"            # Default definition
  management/XYMSERVERS="10.1.0.5"  # Definition in the "management" area

Areas are invoked by using the "--area" option for all tools, or via the ENVAREA setting in the tasks.cfg(5) file.

 

GENERAL SETTINGS

XYMONSERVERHOSTNAME
The fully-qualified hostname of the server that is running Xymon.

XYMONSERVERWWWNAME
The hostname used to access this servers' web-pages, used to construct URL's in the Xymon webpages. Default is the XYMONSERVERHOSTNAME.

XYMONSERVERIP
The public IP-address of the server that is running Xymon.

XYMONSERVEROS
A name identifying the operating system of the Xymon server. The known names are currently "linux", "freebsd", "solaris", "hpux", "aix" and "osf".

FQDN
If set to TRUE, Xymon will use fully-qualified hostnames throughout. If set to FALSE, hostnames are stripped of their domain-part before being processed. It is highly recommended that you keep this set to TRUE. Default: TRUE.

XYMONLOGSTATUS
Controls how the HTML page for a status log is generated. If set to DYNAMIC, the HTML logs are generated on-demand by the svcstatus.cgi(1) script. If set to STATIC, you must activate the xymond_filestore(8) module (through an entry in the tasks.cfg(5) file) to create and store the HTML logs whenever a status update is received. Setting "XYMONLOGSTATUS=STATIC" is discouraged since the I/O load on the Xymon server will increase significantly.

PINGCOLUMN
Defines the name of the column for "ping" test status. The data from the "ping" test is used internally by Xymon, so it must be defined here so all of the Xymon tools know which column to watch for this data. The default setting is PINGCOLUMN=conn.

INFOCOLUMN
Defines the name of the column for the "info" pages.

TRENDSCOLUMN
Defines the name of the column for the RRD graph pages.

RRDHEIGHT
The default height (in pixels) of the RRD graph images. Default: 120 pixels.

RRDWIDTH
The default width (in pixels) of the RRD graph images. Default: 576 pixels.

RRDGRAPHOPTS
Extra options for the RRD graph command. These are passed directly to the "rrdgraph" command used to generate graphs, see the rrdgraph(1) man-page for details of the options.

TRENDSECONDS
The graphs on the "trends" page show data for the past TRENDSECONDS seconds. Default: 172800 seconds, i.e. 48 hours.

HTMLCONTENTTYPE
The Content-type reported by the CGI scripts that generate web pages. By default, this it "text/html". If you have on-line help texts in character sets other than the ISO-8859-1 (western european) character set, it may be necessary to modify this to include a character set. E.g.

   HTMLCONTENTTYPE="text/html; charset=euc-jp"
for a Japanese character sets. Note: Some webservers will automatically add this, if configured to do so.

XYMWEBREFRESH
The default HTTP page reload interval for many xymongen and status pages. Note that while this can be overridden in the header template files for regular pages, dynamically generated status logs displayed with svcstatus.cgi(1) use this value in the HTTP response header and for security reasons the value in hostsvc_header may be ignored on many modern browsers. (default [seconds]: 60)

HOLIDAYS
Defines the default set of holidays used if there is no "holidays" tag for a host in the hosts.cfg file. Holiday sets are defined in the holidays.cfg(5) file. If not defined, only the default holidays (those defined outside a named holiday set) will be considered as holidays.

WEEKSTART
Defines which day is the first day of the week. Set to "0" for Sunday, "1" for Monday. Default: 1 (Monday).

XYMONBODYHEADER
Text that is included in the Xymon web pages at the location specified by ~xymon/server/web/*_header templates. If this is set to a value beginning with "file:", then the contents of the specified file is included. Default: "file:$XYMONHOME/etc/xymonmenu.cfg"

XYMONBODYFOOTER
Text that is included in the Xymon web pages at the location specified by ~xymon/server/web/*_footer templates. If this is set to a value beginning with "file:", then the contents of the specified file is included. Default: Empty.

XYMONBODYMENUCSS
URL for the Xymon menu CSS file. Default: "$XYMONMENUSKIN/xymonmenu.css"

HOSTPOPUP
Determines what is used as the host comment on the webpages. The comment by default appears as a pop-up when the mouse hovers over the hostname, and is also shown on the "info" status page. This setting must be one or more of the letters "C" (COMMENT), "D" (DESCRIPTION) or "I" (IP-address). Including "C" uses the COMMENT setting for the host, including "D" uses the DESCR setting for the host, and "I" uses the IP-address of the host. If more than one of these is set, then COMMENT takes precedence over DESCR which again has precence over IP. Note that DESCR and IP only appear in pop-up windows (if enabled), whereas the COMMENT is always used - if pop-up's have been disabled, then the COMMENT value is displayed next to the hostname on the webpages. Default: CDI

STATUSLIFETIME
The number of minutes that a status is considered valid after an update. After this time elapses, the status will go purple. Default: 30 minutes

 

DIRECTORIES

XYMONSERVERROOT
The top-level directory for the Xymon installation. The default is the home-directory for the user running Xymon.

XYMONSERVERLOGS
The directory for the Xymon's own logfiles (NOT the status-logs from the monitored hosts).

XYMONHOME
The Xymon server directory, where programs and configurations are kept. Default: $XYMONSERVERROOT/server/ .

XYMONTMP
Directory used for temporary files. Default: $XYMONHOME/tmp/

XYMONWWWDIR
Directory for Xymon webfiles. The $XYMONWEB URL must map to this directory. Default: $XYMONHOME/www/

XYMONNOTESDIR
Directory for Xymon notes-files. The $XYMONNOTESSKIN URL must map to this directory. Default: $XYMONHOME/www/notes/

XYMONREPDIR
Directory for Xymon availability reports. The $XYMONREPURL URL must map to this directory. Note also that your webserver must have write-access to this directory, if you want to use the report.cgi(1) CGI script to generate reports on-demand. Default: $XYMONHOME/www/rep/

XYMONSNAPDIR
Directory for Xymon snapshots. The $XYMONSNAPURL URL must map to this directory. Note also that your webserver must have write-access to this directory, if you want to use the snapshot.cgi(1) CGI script to generate snapshots on-demand. Default: $XYMONHOME/www/snap/

XYMONVAR
Directory for all data stored about the monitored items. Default: $XYMONSERVERROOT/data/

XYMONRAWSTATUSDIR
Directory for storing the raw status-logs. Not used unless "xymond_filestore --status" is running, which is discouraged since it increases the load on the Xymon server significantly. Default: $XYMONVAR/logs/

XYMONHTMLSTATUSDIR
Directory for storing HTML status-logs. Not used unless "xymond_filestore --status --html" is running, which is discouraged since it increases the load on the Xymon server significantly. Default: $XYMONHOME/www/html/

XYMONHISTDIR
Directory for storing the history of monitored items. Default: $XYMONVAR/hist/

XYMONHISTLOGS
Directory for storing the detailed status-log of historical events. Default: $XYMONVAR/histlogs/

XYMONACKDIR
Directory for storing information about alerts that have been acknowledged. Default: $XYMONVAR/acks/

XYMONDISABLEDDIR
Directory for storing information about tests that have been disabled. Default: $XYMONVAR/disabled/

XYMONDATADIR
Directory for storing incoming "data" messages. Default: $XYMONVAR/data/

XYMONRRDS
Top-level directory for storing RRD files (the databases with trend-information used to generate graphs). Default: $XYMONVAR/rrd/

CLIENTLOGS
Directory for storing the data sent by a Xymon client around the time a status changes to a warning (yellow) or critical (red) state. Used by the xymond_hostdata(8) module. Default: $XYMONVAR/hostdata/

XYMONCGILOGDIR
Directory where debug output from CGI applications are stored. If not specified, it defaults to $XYMONSERVERLOGS, but this is often a directory that is not writable by the userid running the CGI applications. It is therefore recommended when using "--debug" on CGI applications that you create a separate directory owned by the user running your webserver, and point XYMONCGILOGDIR to this directory.

 

SYSTEM FILES

HOSTSCFG
Full path to the Xymon hosts.cfg(5) configuration file. Default: $XYMONHOME/etc/hosts.cfg.

XYMON
Full path to the xymon(1) client program. Default: $XYMONHOME/bin/xymon.

XYMONGEN
Full path to the xymongen(1) webpage generator program. Default: $XYMONHOME/bin/xymongen.

 

URLS

XYMONSERVERWWWURL
The root URL for the Xymon webpages, without the hostname. This URL must be mapped to the ~/server/www/ directory in your webserver configuration. See the sample Apache configuration in ~/server/etc/xymon-apache.conf.

XYMONSERVERCGIURL
The root URL for the Xymon CGI-scripts, without the hostname. This directory must be mapped to the ~/cgi-bin/ directory in your webserver configuration, and must be flagged as holding executable scripts. See the sample Apache configuration in ~/server/etc/xymon-apache.conf.

XYMONWEBHOST
Initial part of the Xymon URL, including just the protocol and the hostname, e.g. "http://www.foo.com"

XYMONWEBHOSTURL
Prefix for all of the static Xymon webpages, e.g. "http://www.foo.com/xymon"

XYMONWEBHTMLLOGS
URL prefix for the static HTML status-logs generated when XYMONLOGSTATUS=STATIC. Note that this setting is discouraged so this setting should not be used.

XYMONWEB
URL prefix (without hostname) of the Xymon webpages. E.g. "/xymon".

XYMONSKIN
URL prefix (without hostname) of the Xymon graphics. E.g. "/xymon/gifs".

XYMONHELPSKIN
URL prefix (without hostname) of the Xymon on-line help files. E.g "/xymon/help".

XYMONMENUSKIN
URL prefix (without hostname) of the Xymon menu files. E.g "/xymon/menu".

XYMONNOTESSKIN
URL prefix (without hostname) of the Xymon on-line notes files. E.g "/xymon/notes".

XYMONREPURL
URL prefix (without hostname) of the Xymon availability reports. E.g. "/xymon/rep".

XYMONSNAPURL
URL prefix (without hostname) of the Xymon snapshots. E.g. "/xymon/snap".

XYMONWAP
URL prefix (without hostname) of the Xymon WAP/WML files. E.g. "/xymon/wml".

CGIBINURL
URL prefix (without hostname) of the Xymon CGI-scripts. Default: $XYMONSERVERCGIURL .

COLUMNDOCURL
Format string used to build a link to the documentation for a column heading. Default: "$CGIBINURL/columndoc.sh?%s", which causes links to use the columndoc.sh(1) script to document a column.

HOSTDOCURL
Format string used to build a link to the documentation for a host. If not set, then Xymon falls back to scanning the XYMONNOTES directory for files matching the hostname, or the hostname together with a common filename extension (.php, .html, .doc and so on). If set, this string becomes a formatting string for the documentation URL. E.g. for the host "myhost", a setting of HOSTDOCURL="/docs/%s.php" will generate a link to "/docs/myhost.php". Default: Not set, so host documentation will be retrieved from the XYMONNOTES directory.

 

SETTINGS FOR SENDING MESSAGES TO XYMON

XYMSRV
The IP-address used to contact the xymond(8) service. Used by clients and the tools that perform network tests. Default: $XYMONSERVERIP

XYMSERVERS
List of IP-addresses. Clients and network test tools will try to send status reports to a Xymon server running on each of these addresses. This setting is only used if XYMSRV=0.0.0.0.

XYMONDPORT
The portnumber for used to contact the xymond(8) service. Used by clients and the tools that perform network tests. Default: 1984.

MAXMSGSPERCOMBO
The maximum number of status messages to combine into one combo message. Default: 100.

SLEEPBETWEENMSGS
Length of a pause introduced between each successive transmission of a combo-message by xymonnet, in microseconds. Default: 0 (send messages as quickly as possible).

 

XYMOND SETTINGS

ALERTCOLORS
Comma-separated list of the colors that may trigger an alert-message. The default is "red,yellow,purple". Note that alerts may further be generated or suppresed based on the configuration in the alerts.cfg(5) file.

OKCOLORS
Comma-separated list of the colors that may trigger a recovery-message. The default is "green,clear,blue".

ALERTREPEAT
How often alerts get repeated while a status is in an alert state. This is the default setting, which may be changed in the alerts.cfg(5) file.

MAXMSG_STATUS
The maximum size of a "status" message in kB, default: 256. Status messages are the ones that end up as columns on the web display. The default size should be adequate in most cases, but some extension scripts can generate very large status messages - close to 1024 kB. You should only change this if you see messages in the xymond log file about status messages being truncated.

MAXMSG_CLIENT
The maximum size of a "client" message in kB, default: 512. "client" messages are generated by the Xymon client, and often include large process-listings. You should only change this if you see messages in the xymond log file about client messages being truncated.

MAXMSG_DATA
The maximum size of a "data" message in kB, default: 256. "data" messages are typically used for client reports of e.g. netstat or vmstat data. You should only change this setting if you see messages in the xymond log file about data messages being truncated.

MAXMSG_NOTES
The maximum size of a "notes" message in kB, default: 256. "notes" messages provide a way for uploading documentation about a host to Xymon; it is not enabled by default. If you want to upload large documents, you may need to change this setting.

MAXMSG_STACHG
The maximum size of a "status change" message in kB, default: Current value of the MAXMSG_STATUS setting. Status-change messages occur when a status changes color. There is no reason to change this setting.

MAXMSG_PAGE
The maximum size of a "page" message in kB, default: Current value of the MAXMSG_STATUS setting. "page" messages are alerts, and include the status message that triggers the alert. There is no reason to change this setting.

MAXMSG_ENADIS
The maximum size of an "enadis" message in kB, default: 32. "enadis" are small messages used when enabling or disabling hosts and tests, so the default size should be adequate.

MAXMSG_CLICHG
The maximum size of a "client change" message in kB, default: Current value of the MAXMSG_CLIENT setting. Client-change messages occur when a status changes color to one of the alert-colors, usually red, yellow and purple. There is no reason to change this setting.

MAXMSG_USER
The maximum size of a "user" message in kB, default: 128. "user" messages are for communication between custom Xymon modules you have installed, it is not used directly by Xymon.

 

XYMOND_HISTORY SETTINGS

XYMONALLHISTLOG
If set to TRUE, xymond_history(8) will update the $XYMONHISTDIR/allevents file logging all changes to a status. The allevents file is used by the eventlog.cgi(1) tool to show the list of recent events on the "All non-green" webpage.

XYMONHOSTHISTLOG
If set to TRUE, xymond_history(8) will update the host-specific eventlog that keeps record of all status changes for a host. This logfile is not used by any Xymon tool.

SAVESTATUSLOG
If set to TRUE, xymond_history(8) will save historical detailed status-logs to the $XYMONHISTLOGS directory.

 

XYMOND_ALERT SETTINGS

MAIL
Command used to send alerts via e-mail, including a "Subject:" header in the mail. Default: "mail -s"

MAILC
Command used to send alerts via e-mail in a form that does not have a "Subject" in the mail. Default: "mail"

SVCCODES
Maps status-columns to numeric service-codes. The numeric codes are used when sending an alert using a script, where the numeric code of the service is provided in the BBSVCNUM variable.

 

XYMOND_RRD SETTINGS

TEST2RRD
List of "COLUMNNAME[=RRDSERVICE]" settings, that define which status- and data-messages have a corresponding RRD graph. You will normally not need to modify this, unless you have added a custom TCP-based test to the protocols.cfg file, and want to collect data about the response-time, OR if you are using the xymond_rrd(8) external script mechanism to collect data from custom tests. Note: All TCP tests are automatically added.

GRAPHS_<COLUMNAME>
List of GRAPHs that should be displayed on the corresponding colmn page. Note this will override the default, so to add multiple graphs you should include the original one (e.g. GRAPHS_cpu="la,vmstat1").

These are used together by the svcstatus.cgi(1) script to determine if the detailed status view of a test should include a graph.

GRAPHS
List of the RRD databases, that should be shown as a graph on the "trends" column.

NORRDDISKS
This is used to disable the tracking of certain filesystems. By default all filesystems reported by a client are tracked. In some cases you may want to disable this for certain filesystems, e.g. database filesystems since they are always completely full. This setting is a regular expression that is matched against the filesystem name (the Unix mount-point, or the Windows disk-letter) - if the filesystem name matches this expression, then it will not be tracked by Xymon.
Note: Setting this does not affect filesystems that are already being tracked by Xymon - to remove them, you must remove the RRD files for the unwanted filesystems from the ~xymon/data/rrd/HOSTNAME/ directory.

RRDDISKS
This is used to enable tracking of only selected filesystems (see the NORRDDISKS setting above). By default all filesystems are being tracked, setting this changes that default so that only those filesystems that match this pattern will be tracked.

 

XYMONNET NETWORK TEST SETTINGS

XYMONNETWORK
If this variable is defined, then only the hosts that have been tagged with "NET:$XYMONNETWORK" will be tested by the xymonnet tool.

CONNTEST
If set to TRUE, the connectivity (ping) test will be performed.

IPTEST_2_CLEAR_ON_FAILED_CONN
If set to TRUE, then failing network tests go CLEAR if the conn-test fails.

NONETPAGE
List of network services (separated with <space>) that should go yellow upon failure instead of red.

XYMONROUTERTEXT
When using the "router" or "depends" tags for a host, a failure status will include text that an "Intermediate router is down". With todays network topologies, the router could be a switch or another network device; if you define this environment variable the word "router" will be replaced with whatever you put into the variable. So to inform the users that an intermediate switch or router is down, use XYMONROUTERTEXT="switch or router". This can also be set on a per-host basis using the "DESCR:hosttype:description" tag in the hosts.cfg(5) file.

NETFAILTEXT
When a network test fails, the status message reports "SERVICENAME not OK". The "not OK" message can be changed via this variable, e.g. you can change it to "FAILED" or customize it as you like.

FPING
The command used to run the xymonping(1) tool for the connectivity test. (The name FPING is due to the fact that the "fping" utility was used until Xymon version 4.2). This may include suid-root wrappers and xymonping options. Default: "xymonping"

FPINGOPTS
Options used for the fping(1) or xymonping(1) tool for the connectivity test. Note that xymonnet will still expect the output to match the default format. Default: "-Ae"

TRACEROUTE
TRACEROUTEOPTS
Defines the location of the "traceroute" tool and any options needed to run it. traceroute is used by the connectivity test when the ping test fails; if requested via the "trace" tag, the TRACEROUTE command is executed to try to indicate the point in the network that is causing the problem. For backwards compatibility, with prior versions, if TRACEROUTEOPTS is unset, TRACEROUTE is assumed to have whatever options are desired and no addl options are used. Recommended defaults are: "-n -q 2 -w 2 -m 15" (no DNS lookup, max. 2 probes, wait 2 seconds per hop, max 15 hops).

If you have the mtr(8) tool installed - available from http://www.bitwizard.nl/mtr/ - I strongly recommend using this instead. The recommended TRACEROUTEOPTS for mtr are "-c 2 -n --report" Note that mtr needs to be installed suid-root on most systems.

NTPDATE
Defines the ntpdate(1) program used for the "ntp" test. Default: "ntpdate"

NTPDATEOPTS
Options used for the ntpdate(1) program. Default: "-u -q -p 1"

RPCINFO
Defines the rpcinfo(8) program used for "rpc" tests. Default: "rpcinfo"

 

XYMONGEN WEBPAGE GENERATOR SETTINGS

XYMONLOGO
HTML code that is inserted on all standard headers. The default is to add the text "Xymon" in the upper-left corner of the page, but you can easily replace this with e.g. a company logo. If you do, I suggest that you keep it at about 30-35 pixels high, and 100-150 pixels wide.

XYMONPAGELOCAL
The string "Pages hosted locally" that appears above all of the pages linked from the main Xymon webpage.

XYMONPAGESUBLOCAL
The string "Subpages hosted locally" that appears above all of the sub-pages linked from pages below the main Xymon webpage.

XYMONPAGEREMOTE
The string "Remote status display" that appears about the summary statuses displayed on the min Xymon webpage.

XYMONPAGETITLE
HTML tags designed to go in a <FONT> tag, to choose the font for titles of the webpages.

XYMONPAGEROWFONT
HTML tags designed to go in a <FONT> tag, to choose the font for row headings (hostnames) on the webpages.

XYMONPAGECOLFONT
HTML tags designed to go in a <FONT> tag, to chose the font for column headings (test names) on the webpages.

XYMONPAGEACKFONT
HTML tags designed to go in a <FONT> tag, to chose the font for the acknowledgement text displayed on the status-log HTML page for an acknowledged status.

ACKUNTILMSG
When displaying the detailed status of an acknowledged test, Xymon will include the time that the acknowledge expires using the print-format defined in this setting. You can define the timeformat using the controls in your systems strftime(3) routine, and add the text suitable for your setup.

ACK_COOKIE_EXPIRATION
The valid length of an acknowledgement cookie. You want to set this large enough so that a late-answered acknowledgement for an alert is still processed properly. Default value: 86400

XYMONDATEFORMAT
On webpages generated by xymongen, the default header includes the current date and time. Normally this looks like "Tue Aug 24 21:59:47 2004". The XYMONDATEFORMAT controls the format of this timestamp - you can define the format using the controls in the strftime(3) routine. E.g. to have it show up as "2004-08-24 21:59:47 +0200" you would set XYMONDATEFORMAT="%Y-%m-%d %H:%M:%S %z"

HOLIDAYFORMAT
How holiday dates are displayed. The default is "%d/%m" which show the day and month. American users may want to change this to "%m/%d" to suit their preferred date-display style. This is a formatting string for the system strftime(3) routine, so any controls available for this routine may be used.

XYMONPAGECOLREPEAT
Inspired by Jeff Stoner's col_repeat_patch.tgz patch, this defines the maximum number of rows before repeating the column headings on a webpage. This sets the default value for the xymongen(1) "--maxrows" option; if the command-line option is also specified, then it overrides this environment variable. Note that unlike Jeff's patch, xymongen implements this for both the "All non-green" page and all other pages (xymon.html, subpages, critical.html).

SUMMARY_SET_BKG
If set to TRUE, then summaries will affect the color of the main Xymon webpage. Default: FALSE.

DOTHEIGHT
The height (in pixels) of the icons showing the color of a status. Default: 16, which matches the default icons.

DOTWIDTH
The width (in pixels) of the icons showing the color of a status. Default: 16, which matches the default icons.

CLIENTSVCS
List of the status logs fed by data from the Xymon client. These status logs will - if there are Xymon client data available for the host - include a link to the raw data sent by the client. Default: cpu,disk,memory,procs,svcs.

XYMONRSSTITLE
If defined, this is the title of the RSS/RDF documents generated when xymongen(1) is invoked with the "--rss" option. The default value is "Xymon Alerts".

WMLMAXCHARS
Maximum size of a WAP/WML output "card" when generating these. Default: 1500.

XYMONNONGREENEXT
List of scripts to run as extensions to the "All non-green" page. Note that two scripts, "eventlog.sh" and "acklog.sh" are handled specially: They are handled internally by xymongen, but the script names must be listed in this variable for this function to be enabled.

XYMONHISTEXT
List of scripts to run as extensions to a history page.

XYMONREPWARN
Default threshold for listing the availability as "critical" (red) when generating the availability report. This can be set on a per-host basis with the WARNPCT setting in hosts.cfg(5). Default: 97 (percent)

XYMONGENREPOPTS
Default xymongen options used for reports. This will typically include such options as "--subpagecolumns", and also "--ignorecolumns" if you wish to exclude certain tests from reports by default.

XYMONGENSNAPOPTS
Default xymongen options used by snapshots. This should be identical to the options you normally used when building Xymon webpages.

 

FILES

~xymon/server/etc/xymonserver.cfg

 

SEE ALSO

xymon(7)


 

Index

NAME
DESCRIPTION
ENVIRONMENT AREAS
GENERAL SETTINGS
DIRECTORIES
SYSTEM FILES
URLS
SETTINGS FOR SENDING MESSAGES TO XYMON
XYMOND SETTINGS
XYMOND_HISTORY SETTINGS
XYMOND_ALERT SETTINGS
XYMOND_RRD SETTINGS
XYMONNET NETWORK TEST SETTINGS
XYMONGEN WEBPAGE GENERATOR SETTINGS
FILES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man5/analysis.cfg.5.html0000664000076400007640000007643113037531445022227 0ustar rpmbuildrpmbuild Manpage of ANALYSIS.CFG

ANALYSIS.CFG

Section: File Formats (5)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

analysis.cfg - Configuration file for the xymond_client module

 

SYNOPSIS

~Xymon/server/etc/analysis.cfg

 

DESCRIPTION

The analysis.cfg file controls what color is assigned to the status-messages that are generated from the Xymon client data - typically the cpu, disk, memory, procs- and msgs-columns. Color is decided on the basis of some settings defined in this file; settings apply to specific hosts through a set of rules.

Note: This file is only used on the Xymon server - it is not used by the Xymon client, so there is no need to distribute it to your client systems.

 

FILE FORMAT

Blank lines and lines starting with a hash mark (#) are treated as comments and ignored.

 

CPU STATUS COLUMN SETTINGS

LOAD warnlevel paniclevel

If the system load exceeds "warnlevel" or "paniclevel", the "cpu" status will go yellow or red, respectively. These are decimal numbers.

Defaults: warnlevel=5.0, paniclevel=10.0

UP bootlimit toolonglimit [color]

The cpu status goes yellow/red if the system has been up for less than "bootlimit" time, or longer than "toolonglimit". The time is in minutes, or you can add h/d/w for hours/days/weeks - eg. "2h" for two hours, or "4w" for 4 weeks.

Defaults: bootlimit=1h, toolonglimit=-1 (infinite), color=yellow.

CLOCK max.offset [color]

The cpu status goes yellow/red if the system clock on the client differs more than "max.offset" seconds from that of the Xymon server. Note that this is not a particularly accurate test, since it is affected by network delays between the client and the server, and the load on both systems. You should therefore not rely on this being accurate to more than +/- 5 seconds, but it will let you catch a client clock that goes completely wrong. The default is NOT to check the system clock.
NOTE: Correct operation of this test obviously requires that the system clock of the Xymon server is correct. You should therefore make sure that the Xymon server is synchronized to the real clock, e.g. by using NTP.

Example: Go yellow if the load average exceeds 5, and red if it exceeds 10. Also, go yellow for 10 minutes after a reboot, and after 4 weeks uptime. Finally, check that the system clock is at most 15 seconds offset from the clock of the Xymon system and go red if that is exceeded.

LOAD 5 10
UP 10m 4w yellow
CLOCK 15 red

 

DISK STATUS COLUMN SETTINGS

DISK filesystem warnlevel paniclevel
DISK filesystem IGNORE
INODE filesystem warnlevel paniclevel
INODE filesystem IGNORE

If the utilization of "filesystem" is reported to exceed "warnlevel" or "paniclevel", the "disk" status will go yellow or red, respectively. "warnlevel" and "paniclevel" are either the percentage used, or the space available as reported by the local "df" command on the host. For the latter type of check, the "warnlevel" must be followed by the letter "U", e.g. "1024U".

The special keyword "IGNORE" causes this filesystem to be ignored completely, i.e. it will not appear in the "disk" status column and it will not be tracked in a graph. This is useful for e.g. removable devices, backup-disks and similar hardware.

"filesystem" is the mount-point where the filesystem is mounted, e.g. "/usr" or "/home". A filesystem-name that begins with "%" is interpreted as a Perl-compatible regular expression; e.g. "%^/oracle.*/" will match any filesystem whose mountpoint begins with "/oracle".

"INODE" works identical to "DISK", but uses the count of i-nodes in the filesystem instead of the amount of disk space.

Defaults DISK: warnlevel=90%, paniclevel=95% DefaultsINODE:warnlevel=70%,paniclevel=90%

 

MEMORY STATUS COLUMN SETTINGS

MEMPHYS warnlevel paniclevel
MEMACT warnlevel paniclevel
MEMSWAP warnlevel paniclevel

If the memory utilization exceeds the "warnlevel" or "paniclevel", the "memory" status will change to yellow or red, respectively. Note: The words "PHYS", "ACT" and "SWAP" are also recognized.

Example: Go yellow if more than 20% swap is used, and red if more than 40% swap is used or the actual memory utilisation exceeds 90%. Don't alert on physical memory usage.

MEMSWAP 20 40
MEMACT 90 90
MEMPHYS 101 101

Defaults:

MEMPHYS warnlevel=100 paniclevel=101 (i.e. it will never go red).
MEMSWAP warnlevel=50 paniclevel=80
MEMACT  warnlevel=90 paniclevel=97

 

PROCS STATUS COLUMN SETTINGS

PROC processname minimumcount maximumcount color [TRACK=id] [TEXT=text]

The "ps" listing sent by the client will be scanned for how many processes containing "processname" are running, and this is then matched against the min/max settings defined here. If the running count is outside the thresholds, the color of the "procs" status changes to "color".

To check for a process that must NOT be running: Set minimum and maximum to 0.

"processname" can be a simple string, in which case this string must show up in the "ps" listing as a command. The scanner will find a ps-listing of e.g. "/usr/sbin/cron" if you only specify "processname" as "cron". "processname" can also be a Perl-compatiable regular expression, e.g. "%java.*inst[0123]" can be used to find entries in the ps-listing for "java -Xmx512m inst2" and "java -Xmx256 inst3". In that case, "processname" must begin with "%" followed by the regular expression. Note that Xymon defaults to case-insensitive pattern matching; if that is not what you want, put "(?-i)" between the "%" and the regular expression to turn this off. E.g. "%(?-i)HTTPD" will match the word HTTPD only when it is upper-case.
If "processname" contains whitespace (blanks or TAB), you must enclose the full string in double quotes - including the "%" if you use regular expression matching. E.g.


    PROC "%xymond_channel --channel=data.*xymond_rrd" 1 1 yellow

or


    PROC "java -DCLASSPATH=/opt/java/lib" 2 5

You can have multiple "PROC" entries for the same host, all of the checks are merged into the "procs" status and the most severe check defines the color of the status.

The optional TRACK=id setting causes Xymon to track the number of processes found in an RRD file, and put this into a graph which is shown on the "procs" status display. The id setting is a simple text string which will be used as the legend for the graph, and also as part of the RRD filename. It is recommended that you use only letters and digits for the ID.
Note that the process counts which are tracked are only performed once when the client does a poll cycle - i.e. the counts represent snapshots of the system state, not an average value over the client poll cycle. Therefore there may be peaks or dips in the actual process counts which will not show up in the graphs, because they happen while the Xymon client is not doing any polling.

The optional TEXT=text setting is used in the summary of the "procs" status. Normally, the summary will show the "processname" to identify the process and the related count and limits. But this may be a regular expression which is not easily recognizable, so if defined, the text setting string will be used instead. This only affects the "procs" status display - it has no effect on how the rule counts or recognizes processes in the "ps" output.

Example: Check that "cron" is running:
       PROC cron

Example: Check that at least 5 "httpd" processes are running, but not more than 20:
       PROC httpd 5 20

Defaults:
       mincount=1, maxcount=-1 (unlimited), color="red".

       Note that no processes are checked by default.

 

MSGS STATUS COLUMN SETTINGS

LOG logfilename pattern [COLOR=color] [IGNORE=excludepattern] [OPTIONAL]

The Xymon client extracts interesting lines from one or more logfiles - see the client-local.cfg(5) man-page for information about how to configure which logs a client should look at.

The LOG setting determine how these extracts of log entries are processed, and what warnings or alerts trigger as a result.

"logfilename" is the name of the logfile. Only logentries from this filename will be matched against this rule. Note that "logfilename" can be a regular expression (if prefixed with a '%' character).

"pattern" is a string or regular expression. If the logfile data matches "pattern", it will trigger the "msgs" column to change color. If no "color" parameter is present, the default is to go "red" when the pattern is matched. To match against a regular expression, "pattern" must begin with a '%' sign - e.g "%WARNING|NOTICE" will match any lines containing either of these two words. Note that Xymon defaults to case-insensitive pattern matching; if that is not what you want, put "(?-i)" between the "%" and the regular expression to turn this off. E.g. "%(?-i)WARNING" will match the word WARNING only when it is upper-case.

"excludepattern" is a string or regular expression that can be used to filter out any unwanted strings that happen to match "pattern".

The OPTIONAL keyword causes the check to be skipped if the logfile does not exist.

Example: Trigger a red alert when the string "ERROR" appears in the "/var/adm/syslog" file:
       LOG /var/adm/syslog ERROR

Example: Trigger a yellow warning on all occurrences of the word "WARNING" or "NOTICE" in the "daemon.log" file, except those from the "lpr" system:
       LOG /var/log/daemon.log %WARNING|NOTICE COLOR=yellow IGNORE=lpr

Defaults:
       color="red", no "excludepattern".

Note that no logfiles are checked by default. Any log data reported by a client will just show up on the "msgs" column with status OK (green).

 

FILES STATUS COLUMN SETTINGS

FILE filename [color] [things to check] [OPTIONAL] [TRACK]

DIR directoryname [color] [size<MAXSIZE] [size>MINSIZE] [TRACK]

These entries control the status of the "files" column. They allow you to check on various data for files and directories.

filename and directoryname are names of files or directories, with a full path. You can use a regular expression to match the names of files and directories reported by the client, if you prefix the expression with a '%' character.

color is the color that triggers when one or more of the checks fail.

The OPTIONAL keyword causes this check to be skipped if the file does not exist. E.g. you can use this to check if files that should be temporary are not deleted, by checking that they are not older than the max time you would expect them to stick around, and then using OPTIONAL to ignore the state where no files exist.

The TRACK keyword causes the size of the file or directory to be tracked in an RRD file, and presented in a graph on the "files" status display.

For files, you can check one or more of the following:

noexist
triggers a warning if the file exists. By default, a warning is triggered for files that have a FILE entry, but which do not exist.
type=TYPE
where TYPE is one of "file", "dir", "char", "block", "fifo", or "socket". Triggers warning if the file is not of the specified type.
ownerid=OWNER
triggers a warning if the owner does not match what is listed here. OWNER is specified either with the numeric uid, or the user name.
groupid=GROUP
triggers a warning if the group does not match what is listed here. GROUP is specified either with the numeric gid, or the group name.
mode=MODE
triggers a warning if the file permissions are not as listed. MODE is written in the standard octal notation, e.g. "644" for the rw-r--r-- permissions.
size<MAX.SIZE and size>MIN.SIZE
triggers a warning it the file size is greater than MAX.SIZE or less than MIN.SIZE, respectively. For filesizes, you can use the letters "K", "M", "G" or "T" to indicate that the filesize is in Kilobytes, Megabytes, Gigabytes or Terabytes, respectively. If there is no such modifier, Kilobytes is assumed. E.g. to warn if a file grows larger than 1MB, use size<1024M.
mtime>MIN.MTIME mtime<MAX.MTIME
checks how long ago the file was last modified (in seconds). E.g. to check if a file was updated within the past 10 minutes (600 seconds): mtime<600. Or to check that a file has NOT been updated in the past 24 hours: mtime>86400.
mtime=TIMESTAMP
checks if a file was last modified at TIMESTAMP. TIMESTAMP is a unix epoch time (seconds since midnight Jan 1 1970 UTC).
ctime>MIN.CTIME, ctime<MAX.CTIME, ctime=TIMESTAMP
acts as the mtime checks, but for the ctime timestamp (when the directory entry of the file was last changed, eg. by chown, chgrp or chmod).
md5=MD5SUM, sha1=SHA1SUM, rmd160=RMD160SUM
and so on for RMD160, SHA256, SHA512, SHA224, and SHA384 trigger a warning if the file checksum using the specified message digest algorithm does not match the one configured here. Note: The "file" entry in the client-local.cfg(5) file must specify which algorithm to use as that is the only one that will be sent.

For directories, you can check one or more of the following:

size<MAX.SIZE and size>MIN.SIZE
triggers a warning it the directory size is greater than MAX.SIZE or less than MIN.SIZE, respectively. Directory sizes are reported in whatever unit the du command on the client uses - often KB or diskblocks - so MAX.SIZE and MIN.SIZE must be given in the same unit.

Experience shows that it can be difficult to get these rules right. Especially when defining minimum/maximum values for file sizes, when they were last modified etc. The one thing you must remember when setting up these checks is that the rules describe criteria that must be met - only when they are met will the status be green.

So "mtime<600" means "the difference between current time and the mtime of the file must be less than 600 seconds - if not, the file status will go red".

 

PORTS STATUS COLUMN SETTINGS

PORT criteria [MIN=mincount] [MAX=maxcount] [COLOR=color] [TRACK=id] [TEXT=displaytext]

The "netstat" listing sent by the client will be scanned for how many sockets match the criteria listed. The criteria you can use are:

LOCAL=addr
"addr" is a (partial) local address specification in the format used on the output from netstat.
EXLOCAL=addr
Exclude certain local addresses from the rule.
REMOTE=addr
"addr" is a (partial) remote address specification in the format used on the output from netstat.
EXREMOTE=addr
Exclude certain remote addresses from the rule.
STATE=state
Causes only the sockets in the specified state to be included, "state" is usually LISTEN or ESTABLISHED but can be any socket state reported by the clients "netstat" command.
EXSTATE=state
Exclude certain states from the rule.

"addr" is typically "10.0.0.1:80" for the IP 10.0.0.1, port 80. Or "*:80" for any local address, port 80. Note that the Xymon clients normally report only the numeric data for IP-addresses and port-numbers, so you must specify the port number (e.g. "80") instead of the service name ("www").
"addr" and "state" can also be a Perl-compatiable regular expression, e.g. "LOCAL=%[.:](80|443)" can be used to find entries in the netstat local port for both http (port 80) and https (port 443). In that case, portname or state must begin with "%" followed by the reg.expression.

The socket count found is then matched against the min/max settings defined here. If the count is outside the thresholds, the color of the "ports" status changes to "color". To check for a socket that must NOT exist: Set minimum and maximum to 0.

The optional TRACK=id setting causes Xymon to track the number of sockets found in an RRD file, and put this into a graph which is shown on the "ports" status display. The id setting is a simple text string which will be used as the legend for the graph, and also as part of the RRD filename. It is recommended that you use only letters and digits for the ID.
Note that the sockets counts which are tracked are only performed once when the client does a poll cycle - i.e. the counts represent snapshots of the system state, not an average value over the client poll cycle. Therefore there may be peaks or dips in the actual sockets counts which will not show up in the graphs, because they happen while the Xymon client is not doing any polling.

The TEXT=displaytext option affects how the port appears on the "ports" status page. By default, the port is listed with the local/remote/state rules as identification, but this may be somewhat difficult to understand. You can then use e.g. "TEXT=Secure Shell" to make these ports appear with the name "Secure Shell" instead.

Defaults: mincount=1, maxcount=-1 (unlimited), color="red". Note: No ports are checked by default.

Example: Check that the SSH daemon is listening on port 22. Track the number of active SSH connections, and warn if there are more than 5.

        PORT LOCAL=%[.:]22$ STATE=LISTEN "TEXT=SSH listener"

        PORT LOCAL=%[.:]22$ STATE=ESTABLISHED MAX=5 TRACK=ssh TEXT=SSH

 

SVCS status (Microsoft Windows clients)

SVC servicename status=(started|stopped) [startup=automatic|disabled|manual]

 

DS - RRD based status override

DS column filename:dataset rules COLOR=colorname TEXT=explanation

"column" is the statuscolumn that will be modified. "filename" is the name of the RRD file holding the data you use for comparison. "dataset" is the name of the dataset in the RRD file - the "rrdtool info" command is useful when determining these. "rules" determine when to apply the override. You can use ">", ">=", "<" or "<=" to compare the current measurement value against one or more thresholds. "explanation" is a text that will be shown to explain the override - you can use some placeholders in the text: "&N" is replaced with the name of the dataset, "&V" is replaced with the current value, "&L" is replaced by the low threshold, "&U" is replaced with the upper threshold.

NOTE: This rule uses the raw data value from a client to examine the rules. So this type of test is only really suitable for datasets that are of the "GAUGE" type. It cannot be used meaningfully for datasets that use "COUNTER" or "DERIVE" - e.g. the datasets that are used to capture network packet traffic - because the data stored in the RRD for COUNTER-based datasets undergo a transformation (calculation) when going into the RRD. Xymon does not have direct access to the calculated data.

Example: Flag "conn" status a yellow if responsetime exceeds 100 msec.
       DS conn tcp.conn.rrd:sec >0.1 COLOR=yellow TEXT="Response time &V exceeds &U seconds"

 

MQ Series SETTINGS

MQ_QUEUE queuename [age-warning=N] [age-critical=N] [depth-warning=N] [depth-critical=N]
MQ_CHANNEL channelname [warning=PATTERN] [alert=PATTERN]

This is a set of checks for checking the health of IBM MQ message-queues. It requires the "mq.sh" or similar collector module to run on a node with access to the MQ "Queue Manager" so it can report the status of queues and channels.

The MQ_QUEUE setting checks the health of a single queue: You can warn (yellow) or alert (red) based on the depth of the queue, and/or the age of the oldest entry in the queue. These values are taken directly from the output generated by the "runmqsc" utility.

The MQ_CHANNEL setting checks the health of a single MQ channel: You can warn or alert based on the reported status of the channel. The PATTERN is a normal pattern, i.e. either a list of status keywords, or a regular expression pattern.

 

CHANGING THE DEFAULT SETTINGS

If you would like to use different defaults for the settings described above, then you can define the new defaults after a DEFAULT line. E.g. this would explicitly define all of the default settings:
DEFAULT
        UP      1h
        LOAD    5.0 10.0
        DISK    * 90 95
        MEMPHYS 100 101
        MEMSWAP 50 80
        MEMACT  90 97

 

RULES TO SELECT HOSTS

All of the settings can be applied to a group of hosts, by preceding them with rules. A rule defines of one of more filters using these keywords (note that this is identical to the rule definitions used in the alerts.cfg(5) file).

PAGE=targetstring Rule matching an alert by the name of the page in Xymon. "targetstring" is the path of the page as defined in the hosts.cfg file. E.g. if you have this setup:

page servers All Servers
subpage web Webservers
10.0.0.1 www1.foo.com
subpage db Database servers
10.0.0.2 db1.foo.com

Then the "All servers" page is found with PAGE=servers, the "Webservers" page is PAGE=servers/web and the "Database servers" page is PAGE=servers/db. Note that you can also use regular expressions to specify the page name, e.g. PAGE=%.*/db would find the "Database servers" page regardless of where this page was placed in the hierarchy.

The top-level page has a the fixed name /, e.g. PAGE=/ would match all hosts on the Xymon frontpage. If you need it in a regular expression, use PAGE=%^/ to avoid matching the forward-slash present in subpage-names.

EXPAGE=targetstring Rule excluding a host if the pagename matches.

HOST=targetstring Rule matching a host by the hostname. "targetstring" is either a comma-separated list of hostnames (from the hosts.cfg file), "*" to indicate "all hosts", or a Perl-compatible regular expression. E.g. "HOST=dns.foo.com,www.foo.com" identifies two specific hosts; "HOST=%www.*.foo.com EXHOST=www-test.foo.com" matches all hosts with a name beginning with "www", except the "www-test" host.

EXHOST=targetstring Rule excluding a host by matching the hostname.

CLASS=classname Rule match by the client class-name. You specify the class-name for a host when starting the client through the "--class=NAME" option to the runclient.sh script. If no class is specified, the host by default goes into a class named by the operating system.

EXCLASS=classname Exclude all hosts belonging to "classname" from this rule.

DISPLAYGROUP=groupstring Rule matching an alert by the text of the display-group (text following the group, group-only, group-except heading) in the hosts.cfg file. "groupstring" is the text for the group, stripped of any HTML tags. E.g. if you have this setup:

group Web
10.0.0.1 www1.foo.com
10.0.0.2 www2.foo.com
group Production databases
10.0.1.1 db1.foo.com

Then the hosts in the Web-group can be matched with DISPLAYGROUP=Web, and the database servers can be matched with DISPLAYGROUP="Production databases". Note that you can also use regular expressions, e.g. DISPLAYGROUP=%database. If there is no group-setting for the host, use "DISPLAYGROUP=NONE".

EXDISPLAYGROUP=groupstring Rule excluding a group by matching the display-group string.

TIME=timespecification Rule matching by the time-of-day. This is specified as the DOWNTIME time specification in the hosts.cfg file. E.g. "TIME=W:0800:2200" applied to a rule will make this rule active only on week-days between 8AM and 10PM.

EXTIME=timespecification Rule excluding by the time-of-day. This is also specified as the DOWNTIME time specification in the hosts.cfg file. E.g. "TIME=W:0400:0600" applied to a rule will make this rule exclude on week-days between 4AM and 6AM. This applies on top of any TIME= specification, so both must match.

 

DIRECTING ALERTS TO GROUPS

For some tests - e.g. "procs" or "msgs" - the right group of people to alert in case of a failure may be different, depending on which of the client rules actually detected a problem. E.g. if you have PROCS rules for a host checking both "httpd" and "sshd" processes, then the Web admins should handle httpd-failures, whereas "sshd" failures are handled by the Unix admins.

To handle this, all rules can have a "GROUP=groupname" setting. When a rule with this setting triggers a yellow or red status, the groupname is passed on to the Xymon alerts module, so you can use it in the alert rule definitions in alerts.cfg(5) to direct alerts to the correct group of people.

 

RULES: APPLYING SETTINGS TO SELECTED HOSTS

Rules must be placed after the settings, e.g.
LOAD 8.0 12.0  HOST=db.foo.com TIME=*:0800:1600

If you have multiple settings that you want to apply the same rules to, you can write the rules *only* on one line, followed by the settings. E.g.

HOST=%db.*.foo.com TIME=W:0800:1600
        LOAD 8.0 12.0
        DISK /db  98 100
        PROC mysqld 1

will apply the three settings to all of the "db" hosts on week-days between 8AM and 4PM. This can be combined with per-settings rule, in which case the per-settings rule overrides the general rule; e.g.

HOST=%.*.foo.com
        LOAD 7.0 12.0 HOST=bax.foo.com
        LOAD 3.0 8.0

will result in the load-limits being 7.0/12.0 for the "bax.foo.com" host, and 3.0/8.0 for all other foo.com hosts.

The entire file is evaluated from the top to bottom, and the first match found is used. So you should put the specific settings first, and the generic ones last.

 

NOTES

For the LOG, FILE and DIR checks, it is necessary also to configure the actual file- and directory-names in the client-local.cfg(5) file. If the filenames are not listed there, the clients will not collect any data about these files/directories, and the settings in the analysis.cfg file will be silently ignored.

The ability to compute file checksums with MD5, SHA1 or RMD160 should not be used for general-purpose file integrity checking, since the overhead of calculating these on a large number of files can be significant. If you need this, look at tools designed for this purpose - e.g. Tripwire or AIDE.

At the time of writing (april 2006), the SHA-1 and RMD160 algorithms are considered cryptographically safe. The MD5 algorithm has been shown to have some weaknesses, and is not considered strong enough when a high level of security is required.

 

SEE ALSO

xymond_client(8), client-local.cfg(5), xymond(8), xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
FILE FORMAT
CPU STATUS COLUMN SETTINGS
DISK STATUS COLUMN SETTINGS
MEMORY STATUS COLUMN SETTINGS
PROCS STATUS COLUMN SETTINGS
MSGS STATUS COLUMN SETTINGS
FILES STATUS COLUMN SETTINGS
PORTS STATUS COLUMN SETTINGS
SVCS status (Microsoft Windows clients)
DS - RRD based status override
MQ Series SETTINGS
CHANGING THE DEFAULT SETTINGS
RULES TO SELECT HOSTS
DIRECTING ALERTS TO GROUPS
RULES: APPLYING SETTINGS TO SELECTED HOSTS
NOTES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man5/graphs.cfg.5.html0000664000076400007640000001457613037531445021672 0ustar rpmbuildrpmbuild Manpage of GRAPHS.CFG

GRAPHS.CFG

Section: File Formats (5)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

graphs.cfg - Configuration of the showgraph CGI

 

SYNOPSIS

$XYMONHOME/etc/graphs.cfg

 

DESCRIPTION

showgraph.cgi(1) uses the configuration file $XYMONHOME/etc/graphs.cfg to build graphs from the RRD files collected by Xymon.

 

FILE FORMAT

Each definition of a graph type begins with a "[SERVICE]" indicator, this is the name passed as the "service" parameter to showgraph.cgi(1). If the service name passed to showgraph.cgi is not found, it will attempt to match the service name to a graph via the TEST2RRD environment variable. So calling showgraph.cgi with "service=cpu" or "service=la" will end up producing the same graph.

A graph definition needs to have a TITLE and a YAXIS setting. These are texts shown as the title of the graph, and the YAXIS heading respectively. (The X-axis is always time-based).

If a fixed set of RRD files are used for the graph, you just write those in the RRDtool definitions. Note that Xymon keeps all RRD files for a host in a separate directory per host, so you need not worry about the hostname being part of the RRD filename.

For graphs that use multiple RRD files as input, you specify a filename pattern in the FNPATTERN statement, and optionally a pattern of files to exclude from the graph with EXFNPATTERN (see "[tcp]" for an example). When FNPATTERN is used, you can use "@RRDFN@" in the RRDtool definitions to pick up each filename. "@RRDIDX@" is an index (starting at 0) for each file in the set. "@RRDPARAM@" contains the first word extracted from the pattern of files (see e.g. "[memory]" how this is used). "@COLOR@" picks a new color for each graph automatically.

The remainder of the lines in each definition are passed directly to the RRDtool rrd_graph() routine.

The following is an example of how the "la" (cpu) graph is defined. This is a simple definition that uses a single RRD-file, la.rrd:

[la]

        TITLE CPU Load

        YAXIS Load

        DEF:avg=la.rrd:la:AVERAGE

        CDEF:la=avg,100,/

        AREA:la#00CC00:CPU Load Average

        GPRINT:la:LAST: : %5.1lf (cur)

        GPRINT:la:MAX: : %5.1lf (max)

        GPRINT:la:MIN: : %5.1lf (min)

        GPRINT:la:AVERAGE: : %5.1lf (avg)\n

Here is an example of a graph that uses multiple RRD-files, determined automatically at run-time via the FNPATTERN setting. Note how it uses the @RRDIDX@ to define a unique RRD parameter per input-file, and the @COLOR@ and @RRDPARAM@ items to pick unique colors and a matching text for the graph legend:

[disk]

        FNPATTERN disk(.*).rrd

        TITLE Disk Utilization

        YAXIS % Full

        DEF:p@RRDIDX@=@RRDFN@:pct:AVERAGE

        LINE2:p@RRDIDX@#@COLOR@:@RRDPARAM@

        -u 100

        -l 0

        GPRINT:p@RRDIDX@:LAST: : %5.1lf (cur)

        GPRINT:p@RRDIDX@:MAX: : %5.1lf (max)

        GPRINT:p@RRDIDX@:MIN: : %5.1lf (min)

        GPRINT:p@RRDIDX@:AVERAGE: : %5.1lf (avg)\n

 

ADVANCED GRAPH TITLES

Normally the title of a graph is a static text defined in the graphs.cfg file. However, there may be situations where you want to use different titles for the same type of graph, e.g. if you are incorporating RRD files from MRTG into Xymon. In that case you can setup the TITLE definition so that it runs a custom script to determine the graph title. Like this:

       TITLE exec:/usr/local/bin/graphitle

The /usr/local/bin/graphtitle command is then called with the hostname, the graphtype, the period string, and all of the RRD files used as parameters. The script must generate one line of output, which is then used as the title of the graph.

 

ENVIRONMENT

TEST2RRD Maps service names to graph definitions.

 

NOTES

Most of the RRD graph definitions shipped with Xymon have been ported from the definitions in the larrd-grapher.cgi CGI from LARRD 0.43c.

 

SEE ALSO

xymonserver.cfg(5), rrdtool(1), rrdgraph(1)


 

Index

NAME
SYNOPSIS
DESCRIPTION
FILE FORMAT
ADVANCED GRAPH TITLES
ENVIRONMENT
NOTES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man5/clientlaunch.cfg.5.html0000664000076400007640000000265113037531445023046 0ustar rpmbuildrpmbuild Manpage of CLIENTLAUNCH.CFG

CLIENTLAUNCH.CFG

Section: File Formats (5)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

clientlaunch.cfg - Task definitions for the xymonlaunch utility

 

SYNOPSIS

~xymon/client/etc/clientlaunch.cfg

 

DESCRIPTION

The clientlaunch.cfg file holds the list of tasks that xymonlaunch runs on a Xymon client. This is typically just the Xymon client itself, but you can add custom test scripts here and have them executed regularly by the Xymon scheduler.

 

FILE FORMAT

See the tasks.cfg(5) description.

 

SEE ALSO

xymonlaunch(8), xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
FILE FORMAT
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man5/tasks.cfg.5.html0000664000076400007640000001631413037531445021523 0ustar rpmbuildrpmbuild Manpage of TASKS.CFG

TASKS.CFG

Section: File Formats (5)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

tasks.cfg - Task definitions for the xymonlaunch utility

 

SYNOPSIS

~xymon/server/etc/tasks.cfg

 

DESCRIPTION

The tasks.cfg file holds the list of tasks that xymonlaunch runs to perform all of the tasks needed by the Xymon monitor.

 

FILE FORMAT

A task is defined by a key, a command, and optionally also interval, environment, and logfile.

Blank lines and lines starting with a hash mark (#) are treated as comments and ignored. Long lines can be broken up by putting a backslash at the end of the line and continuing the entry on the next line.

An entry looks like this:


    [xymond]

          ENVFILE /usr/local/xymon/server/etc/xymonserver.cfg

          CMD /usr/local/xymon/server/bin/xymond


    [updateweb]

          ENVFILE /usr/local/xymon/server/etc/xymonserver.cfg

          CMD /usr/local/xymon/server/bin/xymongen

          NEEDS xymond

          GROUP webupdates

          INTERVAL 5m

          ONHOST localhost

          MAXTIME 10m

          LOGFILE /var/log/xymon/updateweb.log


    [monthlyreport]

          ENVFILE /usr/local/xymon/server/etc/xymonserver.cfg

          CMD /usr/local/xymon/server/ext/monthlyreport.sh

          CRONDATE 30 4 1 * *

The key is enclosed in angle brackets, and must be unique for each task. You can choose your key-names as you like, they are only used internally in xymonlaunch to identify each task.

The command is defined by the CMD keyword. This is the full command including any options you want to use for this task. This is required for all tasks.

The DISABLED keyword means that this command is disabled. xymonlaunch will not start this task. It is recommended that you use this to disable standard tasks, instead of removing them or commenting them out. Upgrades to Xymon will add standard tasks back into the file, so unless you have them listed as DISABLED then tasks may re-appear unexpectedly after an upgrade. There is also a corresponding ENABLED keyword, to explicitly enable a task.

The ONHOST keyword tells xymonlaunch that this task should only run on specific hosts. After the ONHOST keyword, you must provide a "regular expression"; if the hostname where xymonlaunch runs matches this expression, then the task will run. If it doesn't match, then the task is treated as if it were DISABLED.

The MAXTIME keyword sets a maximum time that the task may run; if exceeded, xymonlaunch will kill the task. The time is in seconds by default, you can specify minutes, hours or days by adding an "m", "h" or "d" after the number. By default there is no upper limit on how long a taskmay run.

The NEEDS instructs xymonlaunch not to run this task unless the task defined by the NEEDS keyword is already running. This is used e.g. to delay the start of some application until the needed daemons have been started. The task that must be running is defined by its key.

The GROUP keyword can be used to limit the number of tasks that may run simultaneously. E.g. if you are generating multiple pagesets of webpages, you don't want them to run at the same time. Putting them into a GROUP will cause xymonlaunch to delay the start of new tasks, so that only one task will run per group. You can change the limit by defining the group before the tasks, with a "GROUP groupname maxtasks" line.

The INTERVAL keyword defines how often this command is executed. The example shows a command that runs every 5 minutes. If no interval is given, the task is only run once - this is useful for tasks that run continually as daemons - although if the task stops for some reason, then xymonlaunch will attempt to restart it. Intervals can be specified in seconds (if you just put a number there), or in minutes (5m), hours (2h), or days (1d).

The CRONDATE keyword is used for tasks that must run at regular intervals or at a specific time. The time specification is identical to the one used by cron in crontab(5) entries, i.e. a sequence of numbers for minute, hour, day-of-month, month and day-of-week. Three-letter abbreviations in english can be used for the month and day-of-week fields. An asterisk is a wildcard. So in the example above, this job would run once a month, at 4:30 AM on the 1st day of the month.

The ENVFILE setting points to a file with definitions of environment variables. Before running the task, xymonlaunch will setup all of the environment variables listed in this file. Since this is a per-task setting, you can use the same xymonlaunch instance to run e.g. both the server- and client-side Xymon tasks. If this option is not present, then the environment defined to xymonlaunch is used.

The ENVAREA setting modifies which environment variables are loaded, by picking up the ones that are defined for this specific "area". See xymonserver.cfg(5) for information about environment areas.

The LOGFILE setting defines a logfile for the task. xymonlaunch will start the task with stdout and stderr redirected to this file. If this option is not present, then the output goes to the same location as the xymonlaunch output.

 

SEE ALSO

xymonlaunch(8), xymond(8), crontab(5), xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
FILE FORMAT
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man5/alerts.cfg.5.html0000664000076400007640000002456613037531445021700 0ustar rpmbuildrpmbuild Manpage of ALERTS.CFG

ALERTS.CFG

Section: File Formats (5)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

alerts.cfg - Configuration for for xymond_alert module

 

SYNOPSIS

~xymon/server/etc/alerts.cfg

 

DESCRIPTION

The alerts.cfg file controls the sending of alerts by Xymon when monitoring detects a failure.

 

FILE FORMAT

The configuration file consists of rules, that may have one or more recipients associated. A recipient specification may include additional rules that limit the circumstances when this recipient is eligible for receiving an alert.

Blank lines and lines starting with a hash mark (#) are treated as comments and ignored. Long lines can be broken up by putting a backslash at the end of the line and continuing the entry on the next line.

 

RULES

A rule consists of one of more filters using these keywords:

PAGE=targetstring Rule matching an alert by the name of the page in Xymon. This is the path of the page as defined in the hosts.cfg file. E.g. if you have this setup:

page servers All Servers
subpage web Webservers
10.0.0.1 www1.foo.com
subpage db Database servers
10.0.0.2 db1.foo.com

Then the "All servers" page is found with PAGE=servers, the "Webservers" page is PAGE=servers/web and the "Database servers" page is PAGE=servers/db. Note that you can also use regular expressions to specify the page name, e.g. PAGE=%.*/db would find the "Database servers" page regardless of where this page was placed in the hierarchy.

The PAGE name of top-level page is an empty string. To match this, use PAGE=%^$ to match the empty string.

EXPAGE=targetstring Rule excluding an alert if the pagename matches.

DISPLAYGROUP=groupstring Rule matching an alert by the text of the display-group (text following the group, group-only, group-except heading) in the hosts.cfg file. "groupstring" is the text for the group, stripped of any HTML tags. E.g. if you have this setup:

group Web
10.0.0.1 www1.foo.com
10.0.0.2 www2.foo.com
group Production databases
10.0.1.1 db1.foo.com

Then the hosts in the Web-group can be matched with DISPLAYGROUP=Web, and the database servers can be matched with DISPLAYGROUP="Production databases". Note that you can also use regular expressions, e.g. DISPLAYGROUP=%database. If there is no group-setting for the host, use "DISPLAYGROUP=NONE".

EXDISPLAYGROUP=groupstring Rule excluding a group by matching the display-group string.

HOST=targetstring Rule matching an alert by the hostname.

EXHOST=targetstring Rule excluding an alert by matching the hostname.

SERVICE=targetstring Rule matching an alert by the service name.

EXSERVICE=targetstring Rule excluding an alert by matching the service name.

GROUP=groupname Rule matching an alert by the group name. Groupnames are assigned to a status via the GROUP setting in the analysis.cfg file.

EXGROUP=groupname Rule excluding an alert by the group name. Groupnames are assigned to a status via the GROUP setting in the analysis.cfg file.

CLASS=classname Rule matching an alert by the class that the host belongs to. By default, the classname is the operating system name; you can set another class either in hosts.cfg(5) using the CLASS tag, or a client running on the server can set the class (via a parameter to the client startup-script).

EXCLASS=classname Rule excluding an alert by the class name.

COLOR=color[,color] Rule matching an alert by color. Can be "red", "yellow", or "purple". The forms "!red", "!yellow" and "!purple" can also be used to NOT send an alert if the color is the specified one.

TIME=timespecification Rule matching an alert by the time-of-day. This is specified as the DOWNTIME timespecification in the hosts.cfg file.

EXTIME=timespecification Rule excluding an alert by the time-of-day. This is specified as the DOWNTIME timespecification in the hosts.cfg file.

DURATION>time, DURATION<time Rule matching an alert if the event has lasted longer/shorter than the given duration. E.g. DURATION>1h (lasted longer than 1 hour) or DURATION<30 (only sends alerts the first 30 minutes). The duration is specified as a number, optionally followed by 'm' (minutes, default), 'h' (hours) or 'd' (days).

RECOVERED Rule matches if the alert has recovered from an alert state.

NOTICE Rule matches if the message is a "notify" message. This type of message is sent when a host or test is disabled or enabled.

The "targetstring" is either a simple pagename, hostname or servicename, OR a '%' followed by a Perl-compatible regular expression. E.g. "HOST=%www(.*)" will match any hostname that begins with "www". The same for the "groupname" setting.

 

RECIPIENTS

The recipients are listed after the initial rule. The following keywords can be used to define recipients:

MAIL address[,address] Recipient who receives an e-mail alert. This takes one parameter, the e-mail address. The strings "&host&", "&service&" and "&color&" in an address will be replaced with the hostname, service and color of the alert, respectively.

SCRIPT /path/to/script recipientID Recipient that invokes a script. This takes two parameters: The script filename, and the recipient that gets passed to the script. The strings "&host&", "&service&" and "&color&" in the recipientID will be replaced with the hostname, service and color of the alert, respectively.

IGNORE This is used to define a recipient that does NOT trigger any alerts, and also terminates the search for more recipients. It is useful if you have a rule that handles most alerts, but there is just that one particular server where you don't want cpu alerts on Monday morning. Note that the IGNORE recipient always has the STOP flag defined, so when the IGNORE recipient is matched, no more recipients will be considered. So the location of this recipient in your set of recipients is important.

FORMAT=formatstring Format of the text message with the alert. Default is "TEXT" (suitable for e-mail alerts). "PLAIN" is the same as text, but without the URL link to the status webpage. "SMS" is a short message with no subject for SMS alerts. "SCRIPT" is a brief message template for scripts.

REPEAT=time How often an alert gets repeated. As with DURATION, time is a number optionally followed by 'm', 'h' or 'd'.

UNMATCHED The alert is sent to this recipient ONLY if no other recipients received an alert for this event.

STOP Stop looking for more recipients after this one matches. This is implicit on IGNORE recipients.

Rules You can specify rules for a recipient also. This limits the alerts sent to this particular recipient.

 

MACROS

It is possible to use macros in the configuration file. To define a macro:

       $MYMACRO=text extending to end of line

After the definition of a macro, it can be used throughout the file. Wherever the text $MYMACRO appears, it will be substituted with the text of the macro before any processing of rules and recipients.

It is possible to nest macros, as long as the macro is defined before it is used.

 

ALERT SCRIPTS

Alerts can go out via custom scripts, by using the SCRIPT keyword for a recipient. Such scritps have access to the following environment variables:

BBALPHAMSG The full text of the status log triggering the alert

ACKCODE The "cookie" that can be used to acknowledge the alert

RCPT The recipientID from the SCRIPT entry

BBHOSTNAME The name of the host that the alert is about

MACHIP The IP-address of the host that has a problem

BBSVCNAME The name of the service that the alert is about

BBSVCNUM The numeric code for the service. From the SVCCODES definition.

BBHOSTSVC HOSTNAME.SERVICE that the alert is about.

BBHOSTSVCCOMMAS As BBHOSTSVC, but dots in the hostname replaced with commas

BBNUMERIC A 22-digit number made by BBSVCNUM, MACHIP and ACKCODE.

RECOVERED Is "0" if the service is alerting, "1" if the service has recovered, "2" if the service was disabled.

EVENTSTART Timestamp when the current status (color) began.

SECS Number of seconds the service has been down.

DOWNSECSMSG When recovered, holds the text "Event duration : N" where N is the DOWNSECS value.

CFID Line-number in the alerts.cfg file that caused the script to be invoked. Can be useful when troubleshooting alert configuration rules.

 

SEE ALSO

xymond_alert(8), xymond(8), xymon(7), the "Configuring Xymon Alerts" guide in the Online documentation.


 

Index

NAME
SYNOPSIS
DESCRIPTION
FILE FORMAT
RULES
RECIPIENTS
MACROS
ALERT SCRIPTS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man5/combo.cfg.5.html0000664000076400007640000001306213037531445021472 0ustar rpmbuildrpmbuild Manpage of COMBO.CFG

COMBO.CFG

Section: File Formats (5)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

combo.cfg - Configuration of combostatus tool

 

SYNOPSIS

$XYMONHOME/etc/combo.cfg

 

DESCRIPTION

combostatus(1) uses it's own configuration file, $XYMONHOME/etc/combo.cfg Each line in this file defines a combined test.

 

FILE FORMAT

Each line of the file defines a new combined test. Blank lines and lines starting with a hash mark (#) are treated as comments and ignored.

The configuration file uses the hostnames and testnames that are already used in your Xymon hosts.cfg file. These are then combined using normal logical operators - "||" for "or", "&&" for "and" etc.

A simple test - e.g. "Web1.http" - results in the value "1" if the "http" test for server "Web1" is green, yellow or clear. It yields the value "0" if it is red, purple or blue.

Apart from the logical operations, you can also do integer arithmetic and comparisons. E.g. the following is valid:

WebCluster.http = (Web1.http + Web2.http + Web3.http) >= 2

This test is green if two or more of the http tests for Web1, Web2 and Web3 are green.

The full range of operators are:


        +      Add
        -      Subtract
        *      Multiply
        /      Divide
        %      Modulo
        |      Bit-wise "or"
        &      Bit-wise "and"
        ||     Logical "or"
        &&     Logical "and"
        >      Greater than
        <      Less than
        >=     Greater than or equal
        <=     Less than or equal
        ==     Equal

There is currently no support for a "not" operator. If you need it, use the transcription "(host.test == 0)" instead of "!host.test".

NB: All operators have EQUAL PRECEDENCE. If you need something evaluated in a specific order, use parentheses to group the expressions together.

If the expression comes out as "0", the combined test goes red. If it comes out as non-zero, the combined test is green.

Note: If the expression involves hostnames with a character that is also an operator - e.g. if you have a host "t1-router-newyork.foo.com" with a dash in the hostname - then the operator-character must be escaped with a backslash '\' in the expression, or it will be interpreted as an operator. E.g. like this:


 nyc.conn = (t1\-router\-nyc.conn || backup\-router\-nyc.conn)

 

EXAMPLE

WebCluster.http = (Web1.http || Web2.http)
AppSrvCluster.procs = (AppSrv1.conn && AppSrv1.procs) || (AppSrv2.conn && AppSrv2.procs)
Customer.cluster = WebCluster.http && AppSrvCluster.procs

The first line defines a new test, with hostname "WebCluster" and the columnname "http". It will be green if the http test on either the "Web1" or the "Web2" server is green.

The second line defines a "procs" test for the "AppSrvCluster" host. Each of the AppSrv1 and AppSrv2 hosts is checked for "conn" (ping) and their "procs" test. On each host, both of these must be green, but the combined test is green if that condition is fulfilled on just one of the hosts.

The third line uses the two first tests to build a "double combined" test, defining a test that shows the overall health of the system.

 

FILES

$XYMONHOME/etc/combo.cfg

 

SEE ALSO

combostatus(1)


 

Index

NAME
SYNOPSIS
DESCRIPTION
FILE FORMAT
EXAMPLE
FILES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man5/cgioptions.cfg.5.html0000664000076400007640000001022213037531445022544 0ustar rpmbuildrpmbuild Manpage of CGIOPTIONS.CFG

CGIOPTIONS.CFG

Section: File Formats (5)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

cgioptions.cfg - Command-line parameters for the Xymon CGI tools

 

SYNOPSIS

$XYMONHOME/etc/cgioptions.cfg

 

DESCRIPTION

cgioptions.cfg(1) controls the command-line options passed to all of the Xymon CGI tools through their respective shell-script wrappers. Typically the options listed here are used for system-wide configuration of the CGI utilities, e.g. to define where they read configuration files.

The exact set of command-line options available are described in the man-page for each of the CGI utilities.

The file is "sourced" into the shell script wrapper, so assignments to the CGI-specific variables must follow standard shell-script syntax.

 

SETTINGS

CGI_ACKINFO_OPTS
Options for the ackinfo.cgi(1) utility.

CGI_ACK_OPTS
Options for the acknowledge.cgi(1) utility.

CGI_CSVINFO_OPTS
Options for the csvinfo.cgi(1) utility.

CGI_DATEPAGE_OPTS
Options for the datepage.cgi(1) utility.

CGI_ENADIS_OPTS
Options for the enadis.cgi(8) utility.

CGI_EVENTLOG_OPTS
Options for the eventlog.cgi(1) utility.

CGI_FINDHOST_OPTS
Options for the findhost.cgi(1) utility.

CGI_HIST_OPTS
Options for the history.cgi(1) utility.

CGI_COLUMNDOC_OPTS
Xymon-specific options for column documentation. This uses the csvinfo.cgi(1) utility with the server/etc/columndoc.cfg configuration file.

CGI_CONFREPORT_OPTS
Options for the confreport.cgi(1) utility.

CGI_SHOWGRAPH_OPTS
Options for the showgraph.cgi(1) utility.

CGI_HOSTGRAPHS_OPTS
Options for the hostgraphs.cgi(1) utility.

CGI_CRITEDIT_OPTS
Options for the criticaleditor.cgi(1) utility.

CGI_CRITVIEW_OPTS
Options for the criticalview.cgi(1) utility.

CGI_REPLOG_OPTS
Options for the reportlog.cgi(1) utility.

CGI_REP_OPTS
Options for the report.cgi(1) utility.

CGI_SNAPSHOT_OPTS
Options for the snapshot.cgi(1) utility.

CGI_SVCHIST_OPTS
Options for the svcstatus.cgi(1) utility when used to view historical logs. Note that the "--historical" option must be included in this setting.

CGI_SVC_OPTS
Options for the svcstatus.cgi(1) utility.

 

SEE ALSO

xymon(7), the individual CGI utility man-pages.


 

Index

NAME
SYNOPSIS
DESCRIPTION
SETTINGS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man5/xymonclient.cfg.5.html0000664000076400007640000000575113037531445022752 0ustar rpmbuildrpmbuild Manpage of XYMONCLIENT.CFG

XYMONCLIENT.CFG

Section: File Formats (5)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

xymonclient.cfg - Xymon client environment variables

 

DESCRIPTION

Xymon programs use multiple environment variables beside the normal set of variables. For the Xymon client, the environment definitions are stored in the ~xymon/client/etc/xymonclient.cfg file. Each line in this file is of the form NAME=VALUE and defines one environment variable NAME with the value VALUE.

 

SETTINGS

XYMSRV
The IP-address used to contact the Xymon server. Default: Chosen when the Xymon client was compiled.

XYMSERVERS
List of IP-addresses of Xymon servers. Data will be sent to all of the servers listed here. This setting is only used if XYMSRV=0.0.0.0.

XYMONDPORT
The port number for used to contact the Xymon server. Default: 1984.

XYMONHOME
The Xymon client top-level directory. Default: The $XYMONCLIENTHOME setting inherited from the "runclient.sh" script which starts the Xymon client.

XYMONCLIENTLOGS
The directory for the Xymon clients' own log files. Default: $XYMONHOME/logs

XYMONTMP
Directory used for temporary files. Default: $XYMONHOME/tmp/

XYMON
Full path to the xymon(1) client program. Default: $XYMONHOME/bin/xymon.

Commands
Many extension scripts expect a series of environment variables to point at various system utilities. These are included in the file when the client is built.

 

INHERITED SETTINGS

Some environment variables are inherited from the "runclient.sh" script which launches the Xymon client:

MACHINEDOTS
The hostname of the local system. Default: Taken from "uname -n".

MACHINE
The hostname of the local system, with dots replaced by commas. For compatibility with Big Brother extension scripts.

SERVEROSTYPE
The operating system of the local system, in lowercase. Default: taken from "uname -s".

XYMONCLIENTHOME
The top-level directory for the Xymon client. Default: The location of the "runclient.sh" script.

 

SEE ALSO

xymon(7)


 

Index

NAME
DESCRIPTION
SETTINGS
INHERITED SETTINGS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man5/client-local.cfg.5.html0000664000076400007640000002373313037531445022747 0ustar rpmbuildrpmbuild Manpage of CLIENT\-LOCAL.CFG

CLIENT\-LOCAL.CFG

Section: File Formats (5)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

client-local.cfg - Local configuration settings for Xymon clients

 

SYNOPSIS

~xymon/server/etc/client-local.cfg

 

DESCRIPTION

The client-local.cfg file contains settings that are used by each Xymon client when it runs on a monitored host. It provides a convenient way of configuring clients from a central location without having to setup special configuration maintenance tools on all clients.

The client-local.cfg file is currently used to configure what logfiles the client should fetch data from, to be used as the basis for the "msgs" status column; and to configure which files and directories are being monitored in the "files" status column.

Note that there is a dependency between the client-local.cfg file and the analysis.cfg(5) file. When monitoring e.g. a logfile, you must first enter it into the client-local.cfg file, to trigger the Xymon client into reporting any data about the logfile. Next, you must configure analysis.cfg so the Xymon server knows what to look for in the file data sent by the client. So: client-local.cfg defines what raw data is collected by the client, and analysis.cfg defines how to analyze them.

 

PROPAGATION TO CLIENTS

The client-local.cfg file resides on the Xymon server.

When clients connect to the Xymon server to send in their client data, they will receive part of this file back from the Xymon server. The configuration received by the client is then used the next time the client runs.

This method of propagating the configuration means that there is a delay of up to two poll cycles (i.e. 5-10 minutes) from a configuration change is entered into the client-local.cfg file, and until you see the result in the status messages reported by the client.

By default, xymond will look for a matching entry by matching the client hostname, classname or operating system name against the section expressions. Hostname matches are used first, then classname matches, then OS matches. The first match found is the one that is returned to the client.

If xymond is started with the "--merge-clientlocal" option, then xymond will instead merge all of the matching sections into one, and return all of this data to the client. So you can have host-specific entries, and then supplement them with class- or os-generic entries. Note that the merging does not remove entries, so if you have e.g. a "log" entry defined in both a hostname- and an osname-matching section, then both entries will be sent back to the client.

 

FILE FORMAT

The file is divided into sections, delimited by "[name]" lines. A section name can be either an operating system identifier - linux, solaris, hp-ux, aix, freebsd, openbsd, netbsd, darwin - a class, or a hostname. When deciding which section to send to a client, Xymon will first look for a section named after the hostname of the client; if such a section does not exist, it will look for a section named by the operating system of the client. So you can configure special configurations for individual hosts, and have a default configuration for all other hosts of a certain type.

It will often be practical to use regular expressions for hostnames. To do this you must use


    [host=<expression>]

where <expression> is a Perl-compatible regular expression. The same kind of matching can be done on operating system or host class, using


    [os=<expresssion>]

    [class=<expression>]

Apart from the section delimiter, the file format is free-form, or rather it is defined by the tools that make use of the configuration.

 

LOGFILE CONFIGURATION ENTRIES

A logfile configuration entry looks like this:


    log:/var/log/messages:10240

    ignore MARK

    trigger Oops

The log:FILENAME:SIZE line defines the filename of the log, and the maximum amount of data (in bytes) to send to the Xymon server. FILENAME is usually an explicit full-path filename on the client. If it is enclosed in backticks, it is a command which the Xymon client runs and each line of output from this command is then used as a filename. This allows scripting which files to monitor, e.g. if you have logfiles that are named with some sort of timestamp. If FILENAME is enclosed in angle brackets it is treated as a glob and passed through the local glob(3) function first.

The ignore PATTERN line (optional) defines lines in the logfile which are ignored entirely, i.e. they are stripped from the logfile data before sending it to the Xymon server. It is used to remove completely unwanted "noise" entries from the logdata processed by Xymon. "PATTERN" is a regular expression.

The trigger PATTERN line (optional) is used only when there is more data in the log than the maximum size set in the "log:FILENAME:SIZE" line. The "trigger" pattern is then used to find particularly interesting lines in the logfile - these will always be sent to the Xymon server. After picking out the "trigger" lines, any remaining space up to the maximum size is filled in with the most recent entries from the logfile. "PATTERN" is a regular expression.

 

COUNTING LOGENTRIES

A special type of log-handling is possible, where the number of lines matching a regular expressions are merely counted. This is linecount:FILENAME, followed by a number of lines of the form ID:PATTERN. E.g.


    linecount:/var/log/messages

    diskerrors:I/O error.*device.*hd

    badlogins:Failed login

 

FILE CONFIGURATION ENTRIES

A file monitoring entry is used to watch the meta-data of a file: Owner, group, size, permissions, checksum etc. It looks like this:


    file:/var/log/messages[:HASH]

The file:FILENAME line defines the filename of the file to monitor. As with the "log:" entries, a filename enclosed in backticks means a command which will generate the filenames dynamically. The optional [:HASH] setting defines what type of hash to compute for the file: md5, rmd160, sha1, or sha256, sha512, sha224, or sha384. By default, no hash is calculated.
NOTE: If you want to check multiple files using a wildcard, you must use a command to generate the filenames. Putting wildcards directly into the file: entry will not work.

 

DIRECTORY CONFIGURATION ENTRIES

A directory monitoring entry is used to watch the size of a directory and any sub-directories. It looks like this:


    dir:DIRECTORYNAME

The dir:DIRECTORYNAME line defines the filename of the file to monitor. As with the "log:" entries, a filename enclosed in backticks means a command which will generate the filenames dynamically and a filename enclosed in angle brackets will be treated as a fileglob. The Xymon client will run the du(1) command with the directoryname as parameter, and send the output back to the Xymon server.
NOTE: If you want to check multiple directories using a wildcard, you must use a command or glob to generate the directory names. Putting wildcards directly into the dir: entry will not work. E.g. use something like
       dir:`find /var/log -maxdepth 1 -type d`

The "du" command used can be configured through the DU environment variable in the xymonclient.cfg file if needed. If not specified, du -k is used, as on some systems by default du reports data in disk blocks instead of KB (e.g. Solaris).

 

NOTES

The ability of the Xymon client to calculate file hashes and monitor those can be used for file integrity validation on a small scale. However, there is a significant processing overhead in calculating these every time the Xymon client runs, so this should not be considered a replacement for host-based intrusion detection systems such as Tripwire or AIDE.

Use of the directory monitoring on directory structures with a large number of files and/or sub-directories can be quite ressource-intensive.

 

SEE ALSO

analysis.cfg(5), xymond_client(8), xymond(8), xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
PROPAGATION TO CLIENTS
FILE FORMAT
LOGFILE CONFIGURATION ENTRIES
COUNTING LOGENTRIES
FILE CONFIGURATION ENTRIES
DIRECTORY CONFIGURATION ENTRIES
NOTES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man5/critical.cfg.5.html0000664000076400007640000000365513037531445022174 0ustar rpmbuildrpmbuild Manpage of CRITICAL.CFG

CRITICAL.CFG

Section: File Formats (5)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

critical.cfg - Configuration of the showgraph CGI

 

SYNOPSIS

$XYMONHOME/etc/critical.cfg

 

DESCRIPTION

critical.cgi(1) uses the configuration file $XYMONHOME/etc/critical.cfg to determine which of the statuses currently in a red or yellow state should appear on the Critical Systems view.

This file should not be edited manually. It is maintained by the criticaleditor.cgi(1) utility via a web-based frontend.

 

FILE PERMISSIONS

Since the file is maintained by a web front-end tool, the userid running Web CGI scripts must have write-permission to the file. Typically, this means it must have a group-ownership matching your webserver userid, and group-write permissions (mode 664).

When editing the file with the web front-end, a backup file is created. Therefore the critical.cfg.bak file should have identical permissions.

 

SEE ALSO

criticalview.cgi(1), criticaleditor.cgi(1)


 

Index

NAME
SYNOPSIS
DESCRIPTION
FILE PERMISSIONS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man5/xymonweb.5.html0000664000076400007640000001554713037531445021517 0ustar rpmbuildrpmbuild Manpage of XYMONWEB

XYMONWEB

Section: File Formats (5)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

Xymon-Web-Templates - web page headers, footers and forms.

 

DESCRIPTION

The Xymon webpages are somewhat customizable, by modifying the header- and footer-templates found in the ~xymon/server/web/ directory. There are usually two or more files for a webpage: A template_header file which is the header for this webpage, and a template_footer file which is the footer. Webpages where entry forms are used have a template_form file which is the data-entry form.

With the exception of the bulletin files, the header files are inserted into the HTML code at the very beginning and the footer files are inserted at the bottom.

The following templates are available:

bulletin
A bulletin_header and bulletin_footer is not shipped with Xymon, but if they exist then the content of these files will be inserted in all HTML documents generated by Xymon. The "bulletin_header" contents will appear after the normal header for the webpage, and the "bulletin_footer" will appear just before the normal footer for the webpage. These files can be used to post important information about the Xymon system, e.g. to notify users of current operational or monitoring problems.

acknowledge
Header, footer and form template for the Xymon acknowledge alert webpage generated by acknowledge.cgi(1)

stdnormal
Header and footer for the Xymon Main view webpages, generated by xymongen(1)

stdnongreen
Header and footer for the Xymon All non-green view webpage, generated by xymongen(1)

stdcritical (DEPRECATED)
Header and footer for the now deprecated old critical webpage, generated by xymongen. You should use the newer criticalview.cgi(1) utility instead, which uses the critical templates.

repnormal
Header and footer for the Xymon Main view availability report webpages, generated by xymongen(1) when running in availability report mode.

snapnormal
Header and footer for the Xymon Main view snapshot webpages, generated by xymongen(1) when running in snapshot report mode.

snapnongreen
Header and footer for the Xymon All non-green view snapshot webpage, generated by xymongen(1) when running in snapshot report mode.

columndoc
Header and footer for the Xymon Column documentation webpages, generated by the csvinfo.cgi(1) utility in the default Xymon configuration.

confreport
Header and footer for the Xymon Configuration report webpage, generated by the confreport.cgi(1) utility. Note that there are also "confreport_front" and "confreport_back" templates, these are inserted into the generated report before the hostlist, and before the column documentation, respectively.

event
Header, footer and form for the Xymon Eventlog report, generated by eventlog.cgi(1)

findhost
Header, footer and form for the Xymon Find host webpage, generated by findhost.cgi(1)

graphs
Header and footer for the Xymon Graph details webpages, generated by showgraph.cgi(1)

hist
Header and footer for the Xymon History webpage, generated by history.cgi(1)

histlog
Header and footer for the Xymon Historical status-log webpage, generated by svcstatus.cgi(1) utility when used to show a historical (non-current) status log.

critical
Header and footer for the Xymon Critical Systems view webpage, generated by criticalview.cgi(1)

hostsvc
Header and footer for the Xymon Status-log webpage, generated by svcstatus.cgi(1) utility when used to show a current status log.

info
Header and footer for the Xymon Info column webpage, generated by svcstatus.cgi(1) utility when used to show the host configuration page.

maintact
Header and footer for the Xymon webpage, generated by enadis.cgi(1) utility when using the Enable/Disable "preview" mode.

maint
Header, footer and form for the Xymon Enable/disable webpage, generated by enadis.cgi(1)

critack
Form show on the status-log webpage when viewed from the "Critical Systems" overview. This form is used to acknowledge a critical status by the operators monitoring the Critical Systems view.

critedit
Header, footer and form for the Critical Systems Editor, the criticaleditor.cgi(1) utility.

replog
Header and footer for the Xymon Report status-log webpage, generated by svcstatus.cgi(1) utility when used to show a status log for an availability report.

report
Header, footer and forms for selecting a pre-generated Availability Report. Handled by the datepage.cgi(1) utility.

snapshot
Header and footer for the Xymon Snapshot report selection webpage, generated by snapshot.cgi(1)

 

SEE ALSO

xymongen(1), svcstatus.cgi(1), xymon(7)


 

Index

NAME
DESCRIPTION
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/0000775000076400007640000000000013037531512016571 5ustar rpmbuildrpmbuildxymon-4.3.28/docs/manpages/man1/xymonnet.1.html0000664000076400007640000007155013037531445021514 0ustar rpmbuildrpmbuild Manpage of XYMONNET

XYMONNET

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

xymonnet - Xymon network test tool  

SYNOPSIS

xymonnet [--ping|--noping] [--timeout=N] [options] [hostname] [hostname]
(See the OPTIONS section for a description of the available command-line options).

 

DESCRIPTION

xymonnet(1) handles the network tests of hosts defined in the Xymon configuration file, hosts.cfg. It is normally run at regular intervals by xymonlaunch(8) via an entry in the tasks.cfg(5) file.

xymonnet does all of the normal tests of TCP-based network services (telnet, ftp, ssh, smtp, pop, imap ....) - i.e. all of the services listed in protocols.cfg. For these tests, a completely new and very speedy service- checker has been implemented.

xymonnet has built-in support for testing SSL-enabled protocols, e.g. imaps, pop3s, nntps, telnets, if SSL-support was enabled when configuring xymonnet. The full list of known tests is found in the protocols.cfg(5) file in $XYMONHOME/etc/protocols.cfg.

In addition, it implements the "dns" and "dig" tests for testing DNS servers.

xymonnet also implements a check for NTP servers - this test is called "ntp". If you want to use it, you must define the NTPDATE environment variable to point at the location of your ntpdate(1) program.

Note: xymonnet performs the connectivity test (ping) based on the hostname, unless the host is tagged with "testip" or the "--dns=ip" option is used. So the target of the connectivity test can be determined by your /etc/hosts file or DNS.

By default, all servers are tested - if XYMONNETWORK is set via xymonserver.cfg(5) then only the hosts marked as belonging to this network are tested. If the command-line includes one or more hostnames, then only those servers are tested.

 

GENERAL OPTIONS

--timeout=N
Determines the timeout (in seconds) for each service that is tested. For TCP tests (those from XYMONNETSVCS), if the connection to the service does not succeed within N seconds, the service is reported as being down. For HTTP tests, this is the absolute limit for the entire request to the webserver (the time needed to connect to the server, plus the time it takes the server to respond to the request). Default: 10 seconds

--conntimeout=N
This option is deprecated, and will be ignored. Use the --timeout option instead.

--cmdtimeout=N
This option sets a timeout for the external commands used for testing of NTP and RPC services, and to perform traceroute.

--concurrency=N
Determines the number of network tests that run in parallel. Default is operating system dependent, but will usually be 256. If xymonnet begins to complain about not being able to get a "socket", try running xymonnet with a lower value like 50 or 100.

--dns-timeout=N (default: 30 seconds)
xymonnet will timeout all DNS lookups after N seconds. Any pending DNS lookups are regarded as failed, i.e. the network tests that depend on this DNS lookup will report an error.
Note: If you use the --no-ares option, timeout of DNS lookups cannot be controlled by xymonnet.

--dns-max-all=N
Same as "--dns-timeout=N". The "--dns-max-all" option is deprecated and should not be used.

--dns=[ip|only|standard]
Determines how xymonnet finds the IP addresses of the hosts to test. By default (the "standard"), xymonnet does a DNS lookup of the hostname to determine the IP address, unless the host has the "testip" tag, or the DNS lookup fails.
With "--dns=only" xymonnet will ONLY do the DNS lookup; if it fails, then all services on that host will be reported as being down.
With "--dns=ip" xymonnet will never do a DNS lookup; it will use the IP adresse specified in hosts.cfg for the tests. Thus, this setting is equivalent to having the "testip" tag on all hosts. Note that http tests will ignore this setting and still perform a DNS lookup for the hostname given in the URL; see the "xymonnet tags for HTTP tests" section in hosts.cfg(5)

--no-ares
Disable the ARES resolver built into xymonnet. This makes xymonnet resolve hostnames using your system resolver function. You should only use this as a last resort if xymonnet cannot resolve the hostnames you use in the normal way (via DNS or /etc/hosts). One reason for using this would be if you need to resolve hostnames via NIS/NIS+ (a.k.a. Yellow Pages).
The system resolver function does not provide a mechanism for controlling timeouts of the hostname lookups, so if your DNS or NIS server is down, xymonnet can take a very long time to run. The --dns-timeout option is effectively disabled when using this option.

--dnslog=FILENAME
Log failed hostname lookups to the file FILENAME. FILENAME should be a full pathname.

--report[=COLUMNNAME]
With this option, xymonnet will send a status message with details of how many hosts were processed, how many tests were generated, any errors that occurred during the run, and some timing statistics. The default columnname is "xymonnet".

--test-untagged
When using the XYMONNETWORK environment variable to test only hosts on a particular network segment, xymonnet will ignore hosts that do not have any "NET:x" tag. So only hosts that have a NET:$XYMONNETWORK tag will be tested.
With this option, hosts with no NET: tag are included in the test, so that all hosts that either have a matching NET: tag, or no NET: tag at all are tested.

--frequenttestlimit=N
Used with the xymonnet-again.sh(1) Xymon extension. This option determines how long failed tests remain in the frequent-test queue. The default is 1800 seconds (30 minutes).

--timelimit=N
Causes xymonnet to generate a warning if the run-time of xymonnet exceeds N seconds. By default N is set to the value of TASKSLEEP, so a warning triggers if the network tests cannot complete in the time given for one cycle of the xymonnet task. Apart from the warning, this option has no effect, i.e. it will not terminate xymonnet prematurely. So to eliminate any such warnings, use this option with a very high value of N.

--huge=N
Warn if the response from a TCP test is more than N bytes. If you see from the xymonnet status report that you are transferring large amounts of data for your tests, you can enable this option to see which tests have large replies.
Default: 0 (disabled).

--validity=N
Make the test results valid for N minutes before they go purple. By default test results are valid for 30 minutes; if you run xymonnet less often than that, the results will go purple before the next run of xymonnet. This option lets you change how long the status is valid.

--source-ip=IPADDRESS
On multi-homed hosts, this option can be used to explicitly select the source IP address used for the network tests. "IPADDRESS" must be a valid IP-address on the host running xymonnet.

--loadhostsfromxymond
Instead of reading the hosts.cfg file, xymonnet will load the hosts.cfg configuration from the xymond daemon. This eliminates the need for reading the hosts.cfg, and if you have xymond and xymonnet running on different hosts, it also eliminates the need for copying the hosts.cfg file between systems. Note that the "netinclude" option in hosts.cfg is ignored when this option is enabled.

 

OPTIONS FOR TESTS OF THE SIMPLE TCP SERVICES

--checkresponse[=COLOR]
When testing well-known services (e.g. FTP, SSH, SMTP, POP-2, POP-3, IMAP, NNTP and rsync), xymonnet will look for a valid service-specific "OK" response. If another response is seen, this will cause the test to report a warning (yellow) status. Without this option, the response from the service is ignored.
The optional color-name is used to select a color other than yellow for the status message when the response is wrong. E.g. "--checkresponse=red" will cause a "red" status message to be sent when the service does not respond as expected.

--no-flags
By default, xymonnet sends some extra information in the status messages, called "flags". These are used by xymongen e.g. to pick different icons for reversed tests when generating the Xymon webpages. This option makes xymonnet omit these flags from the status messages.

--shuffle
By default, TCP tests run roughly in the order that the hosts are listed in the hosts.cfg file. If you have many tests for one server, this may result in an exceptionally large load when Xymon is testing it because Xymon will perform a lot of tests at the same time. To avoid this, the --shuffle option reorders the sequence of tests so they are spread randomly across all of the servers tested.

 

OPTIONS FOR THE PING TEST

Note: xymonnet uses the program defined by the FPING environment to execute ping-tests - by default, that is the xymonping(1) utility. See xymonserver.cfg(5) for a description of how to customize this, e.g. if you need to run it with "sudo" or a similar tool.

--ping
Enables xymonnet's ping test. The column name used for ping test results is defined by the PINGCOLUMN environment variable in xymonserver.cfg(5).
If not specified, xymonnet uses the CONNTEST environment variable to determine if it should perform the ping test or not. So if you prefer to use another tool to implement ping checks, either set the CONNTEST environment variable to false, or run xymonnet with the "--noping".

--noping
Disable the connectivity test.

--trace
--notrace
Enable/disable the use of traceroute when a ping-test fails. Performing a traceroute for failed ping tests is a slow operation, so the default is not to do any traceroute, unless it is requested on a per-host basis via the "trace" tag in the hosts.cfg(5) entry for each host. The "--trace" option changes this, so the default becomes to run traceroute on all hosts where the ping test fails; you can then disable it on specific hosts by putting a "notrace" tag on the host-entry.

--ping-tasks=N
Spread the task of pinging the hosts over N processes. If you have a very large number of hosts the time it takes to ping all of them can be substantial, even with the use of tools like fping or xymonping that ping many hosts in parallel. This option causes xymonnet to start N separate ping processes, the IP's that are being ping'ed will be divided evenly between these processes.

 

OPTIONS FOR HTTP (WEB) TESTS

--content=CONTENTTESTNAME
Determines the name of the column Xymon displays for content checks. The default is "content". If you have used the "cont.sh" or "cont2.sh" scripts earlier, you may want to use "--content=cont" to report content checks using the same test name as these scripts do.
--bb-proxy-syntax
Adhere to the Big Brother syntax for a URL, which allows specifying a HTTP proxy as part of a URL. See "HTTP Testing via proxy" in the hosts.cfg(5) file for details. Beginning with Xymon 4.3.0, this behaviour is disabled by default since URL's that include other URL's are now much more common. This option restores the old Big Brother-compatible behaviour.

 

OPTIONS FOR SSL CERTIFICATE TESTS

--ssl=SSLCERTTESTNAME
Determines the name of the column Xymon displays for the SSL certificate checks. The default is "sslcert".
--no-ssl
Disables reporting of the SSL certificate check.

--sslwarn=N
--sslalarm=N
Determines the number of days before an SSL certificate expires, where xymonnet will generate a warning or alarm status for the SSL certificate column.

--sslbits=N
Enables checking that the encryption supported by the SSL protocol uses an encryption key of at least N bits. E.g. to trigger an alert if your SSL-enabled website supports less than 128 bits of encryption, use "--sslbits=128". Note: This can be enabled on a per-host basis using the "sslbits=N" setting in hosts.cfg(5)

--sslkeysize=N
Enables checking of the length of the public key in SSL certificates. N is the minimum size of the SSL public key, typically such keys are 2048 bits, but some older certificates may use keys with 1024 bits or less. If you specify this, SSL certificates with keys less than N bits will result in the "sslcert" status going yellow. Default: 0, i.e. this check is disabled.

--no-cipherlist
Do not show encryption cipher details on the "sslcert" status.

--showallciphers
List ALL locally available encryption ciphers on the "sslcert" status.

--sni=[on|off]
Sets the default for whether SSL connections use SNI (Server Name Indication). This can also be set with the "sni" or "nosni" options in hosts.cfg for each host - the hosts.cfg entries override this option. Default: off

 

DEBUGGING OPTIONS

--no-update
Don't send any status updates to the Xymon server. Instead, all messages are dumped to stdout.

--timing
Causes xymonnet to collect information about the time spent in different parts of the program. The information is printed on stdout just before the program ends. Note that this information is also included in the status report sent with the "--report" option.

--debug
Dumps a bunch of status about the tests as they progress to stdout.

--dump[=before|=after|=both]
Dumps internal memory structures before and/or after the tests have executed.

 

INFORMATIONAL OPTIONS

--help or -?
Provide a summary of available command-line options.

--version
Prints the version number of xymonnet

--services
Dump the list of defined TCP services xymonnet knows how to test. Do not run any tests.

 

USING COOKIES IN WEB TESTS

If the file $XYMONHOME/etc/cookies exist, cookies will be read from this file and sent along with the HTTP requests when checking websites. This file is in the Netscape Cookie format, see http://www.netscape.com/newsref/std/cookie_spec.html for details on this format. The curl(1) utility can output a file in this format if run with the "--cookie-jar FILENAME" option.

 

ABOUT SSL CERTIFICATE CHECKS

When xymonnet tests services that use SSL- or TLS-based protocols, it will check that the server certificate has not expired. This check happens automatically for https (secure web), pop3s, imaps, nntps and all other SSL-enabled services (except ldap, see LDAP TESTS below).

All certificates found for a host are reported in one status message.

Note: On most systems, the end-date of the certificate is limited to Jan 19th, 2038. If your certificate is valid after this date, xymonnet will report it as valid only until Jan 19, 2038. This is due to limitations in your operating system C library. See http://en.wikipedia.org/wiki/2038_problem .

 

LDAP TESTS

ldap testing can be done in two ways. If you just put an "ldap" or "ldaps" tag in hosts.cfg, a simple test is performed that just verifies that it is possible to establish a connection to the port running the ldap service (389 for ldap, 636 for ldaps).

Instead you can put an LDAP URI in hosts.cfg. This will cause xymonnet to initiate a full-blown LDAP session with the server, and do an LDAP search for the objects defined by the URI. This requires that xymonnet was built with LDAP support, and relies on an existing LDAP library to be installed. It has been tested with OpenLDAP 2.0.26 (from Red Hat 9) and 2.1.22. The Solaris 8 system ldap library has also been confirmed to work for un-encrypted (plain ldap) access.

The format of LDAP URI's is defined in RFC 2255. LDAP URLs look like this:


  ldap://hostport/dn[?attrs[?scope[?filter[?exts]]]]

where:
  hostport is a host name with an optional ":portnumber"
  dn is the search base
  attrs is a comma separated list of attributes to request
  scope is one of these three strings:
    base one sub (default=base)
  filter is filter
  exts are recognized set of LDAP and/or API extensions.

Example:
  ldap://ldap.example.net/dc=example,dc=net?cn,sn?sub?(cn=*)

All "bind" operations to LDAP servers use simple authentication. Kerberos and SASL are not supported. If your LDAP server requires a username/password, use the "ldaplogin" tag to specify this, cf. hosts.cfg(5) If no username/password information is provided, an anonymous bind will be attempted.

SSL support requires both a client library and an LDAP server that support LDAPv3; it uses the LDAP "STARTTLS" protocol request after establishing a connection to the standard (non-encrypted) LDAP port (usually port 389). It has only been tested with OpenSSL 2.x, and probably will not work with any other LDAP library.

The older LDAPv2 experimental method of tunnelling normal LDAP traffic through an SSL connection - ldaps, running on port 636 - is not supported, unless someone can explain how to get the OpenLDAP library to support it. This method was never formally described in an RFC, and implementations of it are non-standard.

For a discussion of the various ways of running encrypted ldap, see
http://www.openldap.org/lists/openldap-software/200305/msg00079.html
http://www.openldap.org/lists/openldap-software/200305/msg00084.html
http://www.openldap.org/lists/openldap-software/200201/msg00042.html
http://www.openldap.org/lists/openldap-software/200206/msg00387.html

When testing LDAP URI's, all of the communications are handled by the ldap library. Therefore, it is not possible to obtain the SSL certificate used by the LDAP server, and it will not show up in the "sslcert" column.

 

USING MULTIPLE NETWORK TEST SYSTEMS

If you have more than one system running network tests - e.g. if your network is separated by firewalls - then is is problematic to maintain multiple hosts.cfg files for each of the systems. xymonnet supports the NET:location tag in hosts.cfg(5) to distinguish between hosts that should be tested from different network locations. If you set the environment variable XYMONNETWORK e.g. to "dmz" before running xymonnet, then it will only test hosts that have a "NET:dmz" tag in hosts.cfg. This allows you to keep all of your hosts in the same hosts.cfg file, but test different sets of hosts by different systems running xymonnet.

 

XYMONNET INTERNALS

xymonnet first reads the protocols.cfg file to see which network tests are defined. It then scans the hosts.cfg file, and collects information about the TCP service tests that need to be tested. It picks out only the tests that were listed in the protocols.cfg file, plus the "dns", "dig" and "ntp" tests.

It then runs two tasks in parallel: First, a separate process is started to run the "xymonping" tool for the connectivity tests. While xymonping is busy doing the "ping" checks, xymonnet runs all of the TCP-based network tests.

All of the TCP-based service checks are handled by a connection tester written specifically for this purpose. It uses only standard Unix-style network programming, but relies on the Unix "select(2)" system-call to handle many simultaneous connections happening in parallel. Exactly how many parallel connections are being used depends on your operating system - the default is FD_SETSIZE/4, which amounts to 256 on many Unix systems.

You can choose the number of concurrent connections with the "--concurrency=N" option to xymonnet.

Connection attempts timeout after 10 seconds - this can be changed with the "--timeout=N" option.

Both of these settings play a part in deciding how long the testing takes. A conservative estimate for doing N TCP tests is:


   (1 + (N / concurrency)) * timeout

In real life it will probably be less, as the above formula is for every test to require a timeout. Since the most normal use of Xymon is to check for services that are active, you should have a lot less timeouts.

The "ntp" and "rpcinfo" checks rely on external programs to do each test.

 

ENVIRONMENT VARIABLES

XYMONNETWORK
Defines the network segment where xymonnet is currently running. This is used to filter out only the entries in the hosts.cfg(5) file that have a matching "NET:LOCATION" tag, and execute the tests for only those hosts.

MAXMSGSPERCOMBO
Defines the maximum number of status messages that can be sent in one combo message. Default is 0 - no limit.
In practice, the maximum size of a single Xymon message sets a limit - the default value for the maximum message size is 32 KB, but that will easily accommodate 100 status messages per transmission. So if you want to experiment with this setting, I suggest starting with a value of 10.

SLEEPBETWEENMSGS
Defines a a delay (in microseconds) after each message is transmitted to the Xymon server. The default is 0, i.e. send the messages as fast as possible. This gives your Xymon server some time to process the message before the next message comes in. Depending on the speed of your Xymon server, it may be necessary to set this value to half a second or even 1 or 2 seconds. Note that the value is specified in MICROseconds, so to define a delay of half a second, this must be set to the value "500000"; a delay of 1 second is achieved by setting this to "1000000" (one million).

FPING
Command used to run the xymonping(1) utility. Used by xymonnet for connectivity (ping) testing. See xymonserver.cfg(5) for more information about how to customize the program that is executed to do ping tests.

TRACEROUTE
Location of the traceroute(8) utility, or an equivalent tool e.g. mtr(8). Optionally used when a connectivity test fails to pinpoint the network location that is causing the failure.

NTPDATE
Location of the ntpdate(1) utility. Used by xymonnet when checking the "ntp" service.

RPCINFO
Location of the rpcinfo(8) utility. Used by xymonnet for the "rpc" service checks.

 

FILES

~/server/etc/protocols.cfg
This file contains definitions of TCP services that xymonnet can test. Definitions for a default set of common services is built into xymonnet, but these can be overridden or supplemented by defining services in the protocols.cfg file. See protocols.cfg(5) for details on this file.

$XYMONHOME/etc/netrc - authentication data for password-protected webs
If you have password-protected sites, you can put the usernames and passwords for these here. They will then get picked up automatically when running your network tests. This works for web-sites that use the "Basic" authentication scheme in HTTP. See ftp(1) for details - a sample entry would look like this

   machine www.acme.com login fred password Wilma1
Note that the machine-name must be the name you use in the http://machinename/ URL setting - it need not be the one you use for the system-name in Xymon.

$XYMONHOME/etc/cookies
This file may contain website cookies, in the Netscape HTTP Cookie format. If a website requires a static cookie to be present in order for the check to complete, then you can add this cookie to this file, and it will be sent along with the HTTP request. To get the cookies into this file, you can use the "curl --cookie-jar FILE" to request the URL that sets the cookie.

$XYMONTMP/*.status - test status summary
Each time xymonnet runs, if any tests fail (i.e. they result in a red status) then they will be listed in a file name TESTNAME.[LOCATION].status. The LOCATION part may be null. This file is used to determine how long the failure has lasted, which in turn decides if this test should be included in the tests done by xymonnet-again.sh(1)
It is also used internally by xymonnet when determining the color for tests that use the "badconn" or "badTESTNAME" tags.

$XYMONTMP/frequenttests.[LOCATION]
This file contains the hostnames of those hosts that should be retested by the xymonnet-again.sh(1) test tool. It is updated only by xymonnet during the normal runs, and read by xymonnet-again.sh.

 

SEE ALSO

hosts.cfg(5), protocols.cfg(5), xymonserver.cfg(5), xymonping(1), curl(1), ftp(1), fping(1), ntpdate(1), rpcinfo(8)


 

Index

NAME
SYNOPSIS
DESCRIPTION
GENERAL OPTIONS
OPTIONS FOR TESTS OF THE SIMPLE TCP SERVICES
OPTIONS FOR THE PING TEST
OPTIONS FOR HTTP (WEB) TESTS
OPTIONS FOR SSL CERTIFICATE TESTS
DEBUGGING OPTIONS
INFORMATIONAL OPTIONS
USING COOKIES IN WEB TESTS
ABOUT SSL CERTIFICATE CHECKS
LDAP TESTS
USING MULTIPLE NETWORK TEST SYSTEMS
XYMONNET INTERNALS
ENVIRONMENT VARIABLES
FILES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/ghostlist.cgi.1.html0000664000076400007640000000400613037531445022404 0ustar rpmbuildrpmbuild Manpage of GHOSTLIST.CGI

GHOSTLIST.CGI

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

ghostlist.cgi - CGI program to view ghost clients  

SYNOPSIS

ghostlist.cgi

 

DESCRIPTION

ghostlist.cgi is invoked as a CGI script via the ghostlist.sh CGI wrapper.

It generates a listing of the Xymon clients that have reported data to the Xymon server, but are not listed in the hosts.cfg(5) file. Data from these clients - called "ghosts" - are ignored, since Xymon does not know which webpage to present the data on.

The listing includes the hostname that the client reports with, the IP-address where the report came from, and how long ago the report arrived.

By far the most common reason for hosts showing up here is that the client uses a hostname without a DNS domain, but the hosts.cfg file uses the hostname with the DNS domain. Or vice versa. You can then use a CLIENT setting in the hosts.cfg file to match the two hostnames together.

 

OPTIONS

--env=FILENAME
Loads the environment defined in FILENAME before executing the CGI script.

 

SEE ALSO

hosts.cfg(5), xymonserver.cfg(5)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/xymonping.1.html0000664000076400007640000001145213037531445021656 0ustar rpmbuildrpmbuild Manpage of XYMONPING

XYMONPING

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

xymonping - Xymon ping tool  

SYNOPSIS

xymonping [--retries=N] [--timeout=N] [IP-addresses]

 

DESCRIPTION

xymonping(1) is used for ping testing of the hosts monitored by the xymon(7) monitoring system. It reads a list of IP addresses from stdin, and performs a "ping" check to see if these hosts are alive. It is normally invoked by the xymonnet(1) utility, which performs all of the Xymon network tests.

Optionally, if a list of IP-addresses is passed as command-line arguments, it will ping those IP's instead of reading them from stdin.

xymonping only handles IP-addresses, not hostnames.

xymonping was inspired by the fping(1) tool, but has been written from scratch to implement a fast ping tester without much of the overhead found in other such utilities. The output from xymonping is similar to that of "fping -Ae".

xymonping probes multiple systems in parallel, and the runtime is therefore mostly dependent on the timeout-setting and the number of retries. With the default options, xymonping takes approximately 18 seconds to ping all hosts (tested with an input set of 1500 IP addresses).

 

SUID-ROOT INSTALLATION REQUIRED

xymonping needs to be installed with suid-root privileges, since it requires a "raw socket" to send and receive ICMP Echo (ping) packets.

xymonping is implemented such that it immediately drops the root privileges, and only regains them to perform two operations: Obtaining the raw socket, and optionally binding it to a specific source address. These operations are performed as root, the rest of the time xymonping runs with normal user privileges. Specifically, no user-supplied data or network data is used while running with root privileges. Therefore it should be safe to provide xymonping with the necessary suid-root privileges.

 

OPTIONS

--retries=N
Sets the number of retries for hosts that fail to respond to the initial ping, i.e. the number of ping probes sent in addition to the initial probe. The default is --retries=2, to ping a host 3 times before concluding that it is not responding.

--timeout=N
Determines the timeout (in seconds) for ping probes. If a host does not respond within N seconds, it is regarded as unavailable, unless it responds to one of the retries. The default is --timeout=5.

--responses=N
xymonping normally stops pinging a host after receiving a single response, and uses that to determine the round-trip time. If the first response takes longer to arrive - e.g. because of additional network overhead when first determining the route to the target host - it may skew the round-trip-time reports. You can then use this option to require N responses, and xymonping will calculate the round-trip time as the average of all of responsetimes.

--max-pps=N
Maximum number of packets per second. This limits the number of ICMP packets xymonping will send per second, by enforcing a brief delay after each packet is sent. The default setting is to send a maximum of 50 packets per second. Note that increasing this may cause flooding of the network, and since ICMP packets can be discarded by routers and other network equipment, this can cause erratic behaviour with hosts recorded as not responding when they are in fact OK.

--source=ADDRESS
Use ADDRESS as the source IP address of the ping packets sent. On multi-homed systems, allows you to select the source IP of the hosts going out, which might be necessary for ping to work.

--debug
Enable debug output. This prints out all packets sent and received.

 

SEE ALSO

xymon(7), xymonnet(1), fping(1)


 

Index

NAME
SYNOPSIS
DESCRIPTION
SUID-ROOT INSTALLATION REQUIRED
OPTIONS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/confreport.cgi.1.html0000664000076400007640000000555413037531445022556 0ustar rpmbuildrpmbuild Manpage of CONFREPORT.CGI

CONFREPORT.CGI

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

confreport.cgi - Xymon Configuration report  

SYNOPSIS

confreport.cgi

 

DESCRIPTION

confreport.cgi is invoked as a CGI script via the confreport.sh CGI wrapper.

confreport.cgi provides a plain HTML (Web) report of the Xymon configuration for a group of hosts; which hosts are included is determined by the hosts available on the webpage from where the CGI script is invoked.

The configuration report include the hostnames, a list of the statuses monitored for each host, and if applicable any configuration settings affecting these. Alerts that may be triggered by status changes are also included.

The report is plain HTML without any images included, and therefore suitable for inclusion into e-mails or other documents that may be accessed outside the Xymon system.

 

OPTIONS

--critical
Report only on the statuses that are configured to show up on the Critical Systems view.

--old-nk-config
Use the deprecated NK tag in hosts.cfg to determine if tests appear on the Critical Systems view.

--env=FILENAME
Loads the environment defined in FILENAME before executing the CGI script.

--area=NAME
Load environment variables for a specific area. NB: if used, this option must appear before any --env=FILENAME option.

--debug
Enables debugging output.

--nkconfig=FILENAME
Use FILENAME as the configuration file for the Critical Systems information. The default is to load this from $XYMONHOME/etc/critical.cfg

 

BUGS

Client-side configuration done in the analysis.cfg(5) is not currently reflected in the report.

Critical Systems view configuration is not reflected in the report.

 

SEE ALSO

hosts.cfg(5), alerts.cfg(5), analysis.cfg(5), xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
BUGS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/xymonpage.cgi.1.html0000664000076400007640000000333313037531445022375 0ustar rpmbuildrpmbuild Manpage of XYMONPAGE

XYMONPAGE

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

xymonpage - Utility to show a webpage using header and footer  

SYNOPSIS

xymonpage [options]

 

DESCRIPTION

xymonpage is a tool to generate a webpage in the Xymon style, with a standard header- and footer as well as a Xymon background. The data to present on the webpage, apart from the header and footer, are passed to xymonpage in stdin. The generated webpage is printed to stdout.

 

OPTIONS

--env=FILENAME
Loads the environment defined in FILENAME before executing the CGI script.

--hffile=PREFIX
Use the header- and footer-files in $XYMONHOME/web/PREFIX_header and PREFIX_footer. If not specified, stdnormal_header and stdnormal_footer are used.

--color=COLOR
Set the background color of the generated webpage to COLOR. Default: Blue

--debug
Enable debugging output.

 

SEE ALSO

xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/report.cgi.1.html0000664000076400007640000001122213037531445021675 0ustar rpmbuildrpmbuild Manpage of REPORT.CGI

REPORT.CGI

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

report.cgi - CGI front-end to xymongen reporting  

SYNOPSIS

report.cgi [--noclean] [xymongen-options]

 

DESCRIPTION

report.cgi is invoked as a CGI script via the report.sh CGI wrapper. It triggers the generation of a Xymon availability report for the timeperiod specified by the CGI parameters.

report.cgi is passed a QUERY_STRING environment variable with the following parameters:


   start-mon (Start month of the report)
   start-day (Start day-of-month of the report)
   start-yr  (Start year of the report)
   end-mon   (End month of the report)
   end-day   (End day-of-month of the report)
   end-yr    (End year of the report)
   style     (Report style)
  The following non-standard parameters are handled by the xymongen version of report.cgi:


   suburl    (Page in report to go to, if not the top page)

The "month" parameters must be specified as the three-letter english month name abbreviation: Jan, Feb, Mar ...

Start- and end-days are in the range 1..31; the start- and end-year must be specified including century (e.g. "2003").

End-times beyond the current time are silently replaced with the current time.

The generated report will include data for the start- and end-days, i.e. the report will begin at 00:00:00 of the start-day, and end at 23:59:59 of the end-day.

The "style" parameter is passed directly to xymongen(1) and should be "crit", "non-crit" or "all". Other values result in undefined behaviour.

All of the processing involved in generating the report is done by invoking xymongen(1) with the proper "--reportopts" option.

 

OPTIONS

--noclean
Do not clean the XYMONREPDIR directory of old reports. Makes the report-tool go a bit faster - instead, you can clean up the XYMONREPDIR directory e.g. via a cron-job.

--env=FILENAME
Load the environment from FILENAME before executing the CGI.

xymongen-options
All other options passed to report.cgi are passed on to the xymongen(1) program building the report files.

 

FILES

$XYMONHOME/web/report_header
HTML template header for the report request form

$XYMONHOME/web/report_footer
HTML template footer for the report request form

$XYMONHOME/web/report_form
HTML template report request form

 

ENVIRONMENT VARIABLES

XYMONGENREPOPTS
xymongen options passed by default to the report.cgi. This happens in the report.sh wrapper.
XYMONHOME
Home directory of the Xymon server installation
XYMONREPDIR
Directory where generated reports are stored. This directory must be writable by the userid executing the CGI script, typically "www", "apache" or "nobody". Default: $XYMONHOME/www/rep/
XYMONREPURL
The URL prefix to use when accessing the reports via a browser. Default: $XYMONWEB/rep

 

SEE ALSO

xymongen(1), hosts.cfg(5), xymonserver.cfg(5)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
FILES
ENVIRONMENT VARIABLES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/appfeed.cgi.1.html0000664000076400007640000000632313037531445021774 0ustar rpmbuildrpmbuild Manpage of APPFEED.CGI

APPFEED.CGI

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

appfeed.cgi - Xymon CGI feeder for Smartphone apps  

SYNOPSIS

appfeed.cgi [options]

 

DESCRIPTION

appfeed.cgi is invoked as a CGI script via the appfeed.sh CGI wrapper.

appfeed.cgi is optionally passed a QUERY_STRING environment variable with the "filter=FILTER" parameter. FILTER is a filter for the "xymondboard" command sent to xymond(8) daemon. These filters are described in detail in the xymon(1) manual. Typically, the filter will specify hosts found on a specific (sub)page to be returned, e.g. "filter=page=webservers" will cause appfeed.cgi to only return hosts that are present on the "webservers" page in Xymon.

If no filter is specified, appfeed.cgi returns data for all red, yellow or purple statuses (equivalent to the data present on the "All non-green" page), or if invoked with the "--critical" option it returns data from the "Critical systems" page.

The output is an XML document with the current status of the selected hosts/services.

 

OPTIONS

--env=FILENAME
Loads the environment from FILENAME before executing the CGI.

--critical[=FILENAME]
FILENAME specifies the "Critical Systems" configuration file (default: critical.cfg). appfeed.cgi will only return the statuses currently on the "Critical Systems" view.

--access=FILENAME
In addition to the filtering done by the "filter" parameter or the "--critical" option, this option limits the output to hosts that the user has access to as defined in the Apache-compatible group-definitions in FILENAME. See xymon-webaccess(5) for more details of this. Note:Useofthisoptionrequiresthataccesstotheappfeed.cgitoolispassword-protected by whatever means your webserver software provides, and that the login userid is available via the REMOTE_USER environment variable (this is standard CGI behaviour, so all webservers should provide it if you use the webserver's built-in authentication mechanisms).

 

SEE ALSO

xymon(1), critical.cfg(5), xymon-webaccess(5)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/snapshot.cgi.1.html0000664000076400007640000000662413037531445022233 0ustar rpmbuildrpmbuild Manpage of SNAPSHOT.CGI

SNAPSHOT.CGI

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

snapshot.cgi - CGI program to rebuild the Xymon webpages for a specific point in time.  

SYNOPSIS

snapshot.cgi

 

DESCRIPTION

snapshot.cgi is invoked as a CGI script via the snapshot.sh CGI wrapper. It rebuilds the Xymon web pages to the look they had at a particular point in time, based upon the historical information logged about events.

snapshot.cgi is passed a QUERY_STRING environment variable with the following parameters:


   mon (Start month of the snapshot)
   day (Start day-of-month of the snapshot)
   yr  (Start year of the snapshot)
   hour (Start hour of the snapshot)
   min  (Start minute of the snapshot)
   sec  (Start second of the snapshot)

The "month" parameters must be specified as the three-letter english month name abbreviation: Jan, Feb, Mar ...

"day" must be in the range 1..31; "yr" must be specified including century (e.g. "2003"). "hour" must be specified using a 24-hour clock.

All of the processing involved in generating the report is done by invoking xymongen(1) with the proper "--snapshot" option.

 

OPTIONS

--env=FILENAME
Load environment from FILENAME before executing the CGI.

xymongen-options
All options except "--env" are passed on to the xymongen(1) program building the snapshot files.

 

ENVIRONMENT VARIABLES

XYMONGENSNAPOPTS
xymongen options passed by default to the snapshot.cgi script. This happens in the snapshot.sh CGI wrapper script.
XYMONHOME
Home directory of the Xymon server files
XYMONSNAPDIR
Directory where generated snapshots are stored. This directory must be writable by the userid executing the CGI script, typically "www", "apache" or "nobody". Default: $XYMONHOME/www/snap/
XYMONSNAPURL
The URL prefix to use when accessing the reports via a browser. Default: $XYMONWEB/snap

 

SEE ALSO

xymongen(1), hosts.cfg(5), xymonserver.cfg(5)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
ENVIRONMENT VARIABLES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/findhost.cgi.1.html0000664000076400007640000000552213037531445022206 0ustar rpmbuildrpmbuild Manpage of FINDHOST.CGI

FINDHOST.CGI

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

findhost.cgi - Xymon CGI script to find hosts  

SYNOPSIS

findhost.cgi?host=REGEX

 

DESCRIPTION

findhost.cgi is invoked as a CGI script via the findhost.sh CGI wrapper.

findhost.cgi is passed a QUERY_STRING environment variable with the "host=REGEX" parameter. The REGEX is a Posix regular expression (see regex(7) ) describing the hostnames to look for. A trailing wildcard is assumed on all hostnames - e.g. requesting the hostname "www" will match any host whose name begins with "www".

It then produces a single web page, listing all of the hosts that matched any of the hostnames, with links to the Xymon webpages where they are located.

The output page lists hosts in the order they appear in the hosts.cfg(5) file.

A sample web page implementing the search facility is included with xymongen, you access it via the URL /xymon/help/findhost.html.

 

OPTIONS

--env=FILENAME
Loads the environment from FILENAME before executing the CGI.

 

FILES

$XYMONHOME/web/findhost_header
HTML header file for the generated web page

$XYMONHOME/web/findhost_footer
HTML footer file for the generated web page

$XYMONHOME/web/findhost_form
Query form displayed when findhost.cgi is called with no parameters.

 

ENVIRONMENT VARIABLES

HOSTSCFG
findhost.cgi uses the HOSTSCFG environment variable to find the hosts.cfg file listing all known hosts and their page locations.

XYMONHOME
Used to locate the template files for the generated web pages.

 

SEE ALSO

xymongen(1), hosts.cfg(5), xymonserver.cfg(5)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
FILES
ENVIRONMENT VARIABLES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/xymondigest.1.html0000664000076400007640000000452613037531445022204 0ustar rpmbuildrpmbuild Manpage of XYMONDIGEST

XYMONDIGEST

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

xymondigest - calculate message digests  

SYNOPSIS

xymondigest md5|sha1|sha256|sha512|sha224|sha384|rmd160 [filename]

 

DESCRIPTION

xymondigest(1) is a utility to calculate message digests for a file or document. It is used when defining HTTP- or FTP-based content checks, where xymonnet(1) checks that a URL returns a specific document; instead of having to compare the entire document, the comparison is done against a pre-computed message digest value using the MD5, RIPEMD160, SHA1 or any of the SHA2 (SHA-512, SHA-256, SHA-384, SHA-224) message digest algorithms.

The optional filename parameter is the input file whose message digest should be calculated; if no filename is given, the data is read from standard input.

xymondigest outputs a string containing the digest algorithm and the computed message digest. This is in a format suitable for use in the hosts.cfg(5) definition of a content check.

 

EXAMPLE


   $ xymondigest md5 index.html
   md5:88b81b110a85c83db56a939caa2e2cf6


   $ curl -s http://www.foo.com/ | xymondigest sha1
   sha1:e5c69784cb971680e2c7380138e04021a20a45a2

 

SEE ALSO

xymonnet(1), hosts.cfg(5)


 

Index

NAME
SYNOPSIS
DESCRIPTION
EXAMPLE
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/xymoncmd.1.html0000664000076400007640000000370213037531445021463 0ustar rpmbuildrpmbuild Manpage of XYMONCMD

XYMONCMD

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

xymoncmd - Run a Xymon command with environment set  

SYNOPSIS

xymoncmd [--env=ENVFILE COMMAND|--version|--debug]

 

DESCRIPTION

xymoncmd(1) is a utility that can setup the Xymon environment variables as defined in a xymonlaunch(8) compatible environment definition file, and then execute a command with this environment in place. It is mostly used for testing extension scripts or in other situations where you need to run a single command with the environment in place.

The "--env=ENVFILE" option points xymoncmd to the file where the environment definitions are loaded from.

COMMAND is the command to execute after setting up the environment.

If you want to run multiple commands, it is often easiest to just use "sh" as the COMMAND - this gives you a sub-shell with the environment defined globally.

The "--debug" option print out more detail steps of xymoncmd execution.

The "--version" option print out version number of xymoncmd.  

SEE ALSO

xymonlaunch(8), xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/acknowledge.cgi.1.html0000664000076400007640000000753413037531445022660 0ustar rpmbuildrpmbuild Manpage of ACKNOWLEDGE.CGI

ACKNOWLEDGE.CGI

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

acknowledge.cgi - Xymon CGI script to acknowledge alerts  

SYNOPSIS

acknowledge.cgi?ACTION=action&NUMBER=acknum&DELAY=validity&MESSAGE=text

 

DESCRIPTION

acknowledge.cgi is invoked as a CGI script via the acknowledge.sh CGI wrapper.

acknowledge.cgi is passed a QUERY_STRING environment variable with the ACTION, NUMBER, DELAY and MESSAGE parameters.

 

PARAMETERS

ACTION is the action to perform. The only supported action is "Ack" to acknowledge an alert.

NUMBER is the number identifying the host/service to be acknowledged. It is included in all alert-messages sent out by Xymon.

DELAY is the time (in minutes) that the acknowledge is valid.

MESSAGE is an optional text which will be shown on the status page while the acknowledgment is active. You can use it to e.g. tell users not to contact you about the problem, or inform them when the problem is expected to be resolved.

 

OPTIONS

--no-pin
acknowledge.cgi normally requires the user to enter the acknowledgment code received in an alert message. If you run it with this option, the user will instead get a list of the current non-green statuses, and he may send an acknowledge without knowing the code.

--no-cookies
Normally, acknowledge.cgi uses a cookie sent by the browser to initially filter the list of hosts presented. If this is not desired, you can turn off this behaviour by calling acknowledge.cgi with the --no-cookies option. This would normally be placed in the CGI_ACK_OPTS setting in cgioptions.cfg(5)

--env=FILENAME
Loads the environment defined in FILENAME before executing the CGI script.

--debug
Enables debugging output.

 

FILES

$XYMONHOME/web/acknowledge_header
HTML header file for the generated web page

$XYMONHOME/web/acknowledge_footer
HTML footer file for the generated web page

$XYMONHOME/web/acknowledge_form
Query form displayed when acknowledge.cgi is called with no parameters.

 

ENVIRONMENT VARIABLES

XYMONHOME
Used to locate the template files for the generated web pages.

QUERY_STRING
Contains the parameters for the CGI script.

 

BUGS

When using alternate pagesets, hosts will only show up on the acknowledgment page if this is accessed from the primary page in which they are defined. So if you have hosts on multiple pages, they will only be visible for acknowledging from their main page which is not what you would expect.

 

SEE ALSO

xymongen(1), hosts.cfg(5), xymonserver.cfg(5)


 

Index

NAME
SYNOPSIS
DESCRIPTION
PARAMETERS
OPTIONS
FILES
ENVIRONMENT VARIABLES
BUGS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/clientupdate.1.html0000664000076400007640000001370213037531445022307 0ustar rpmbuildrpmbuild Manpage of CLIENTUPDATE

CLIENTUPDATE

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

clientupdate - Xymon client update utility  

SYNOPSIS

clientupdate [options]

 

DESCRIPTION

clientupdate is part of the Xymon client. It is responsible for updating an existing client installation from a central repository of client packages stored on the Xymon server.

When the Xymon client sends a normal client report to the Xymon server, the server responds with the section of the client-local.cfg(5) file that is relevant to this client. Included in this may be a "clientversion" value. The clientversion received from the server is compared against the current clientversion installed on the client, as determined by the contents of the $XYMONHOME/etc/clientversion.cfg file. If the two versions are not identical, clientupdate is launched to update the client installation.

 

OPTIONS

--level
Report the current clientversion.

--update=NEWVERSION
Attempt to update the client to NEWVERSION by fetching this version of the client software from the Xymon server.

--reexec
Used internally during the update process, see OPERATION below.

--remove-self
Used internally during the update process. This option causes the running clientupdate utility to delete itself - it is used during the update to purge a temporary copy of the clientupdate utility that is installed in $XYMONTMP.

 

USING CLIENTUPDATE IN XYMON

To manage updating clients without having to logon to each server, you can use the clientupdate utility. This is how you setup the release of a new client version.

Create the new client
Setup the new client $XYMONHOME directory, e.g. by copying an existing client installation to an empty directory and modifying it for your needs. It is a good idea to delete all files in the tmp/ and logs/ directories, since there is no need to copy these over to all of the clients. Pay attention to the etc/ files, and make sure that they are suitable for the systems where you want to deploy this new client. You can add files - e.g. extension scripts in the ext/ directory - but the clientupdate utility cannot delete or rename files.

Package the client
When your new client software is ready, create a tar-file of the new client. All files in the tar archive must have file names relative to the clients' $XYMONHOME (usually, ~xymon/client/). Save the tar file on the Xymon server in ~xymon/server/download/somefile.tar. Don't compress it. It is recommended that you use some sort of operating-system and version-numbering scheme for the filename, but you can choose whatever filename suits you - the only requirement is that it must end with ".tar". The part of the filename preceding ".tar" is what Xymon will use as the "clientversion" ID.

Configure which hosts receive the new client
In the client-local.cfg(5) file, you must now setup a clientversion:ID line where the ID matches the filename you used for the tar-file. So if you have packaged the new client into the file linux.v2.tar, then the corresponding entry in client-local.cfg would be clientversion:linux.v2.

Wait for xymond to reload client-local.cfg
xymond will automatically reload the client-local.cfg file after at most 10 minutes. If you want to force an immediate reload, send a SIGHUP signal to the xymond process.

Wait for the client to update
The next time the client contacts the Xymon server to send the client data, it will notice the new clientversion setting in client-local.cfg, and will run clientupdate to install the new client software. So when the client runs the next time, it will use the new client software.

 

OPERATION

clientupdate runs in two steps:

Re-exec step
The first step is when clientupdate is first invoked from the xymonclient.sh script with the "--re-exec" option. This step copies the clientupdate program from $XYMONHOME/bin/ to a temporary file in the $XYMONTMP directory. This is to avoid conflicts when the update procedure installs a new version of the clientupdate utility itself. Upon completion of this step, the clientupdate utility automatically launches the next step by running the program from the file in $XYMONTMP.

Update step
The second step downloads the new client software from the Xymon server. The new software must be packed into a tar file, which clientupdate then unpacks into the $XYMONHOME directory.

 

ENVIRONMENT VARIABLES

clientupdate uses several of the standard Xymon environment variables, including XYMONHOME and XYMONTMP.

 

SEE ALSO

xymon(7), xymon(1), client-local.cfg(5)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
USING CLIENTUPDATE IN XYMON
OPERATION
ENVIRONMENT VARIABLES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/logfetch.1.html0000664000076400007640000001032113037531445021413 0ustar rpmbuildrpmbuild Manpage of LOGFETCH

LOGFETCH

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

logfetch - Xymon client data collector  

SYNOPSIS

logfetch [options] CONFIGFILE STATUSFILE

 

DESCRIPTION

logfetch is part of the Xymon client. It is responsible for collecting data from logfiles, and other file-related data, which is then sent to the Xymon server for analysis.

logfetch uses a configuration file, which is automatically retrieved from the Xymon server. There is no configuration done locally. The configuration file is usually stored in the $XYMONHOME/tmp/logfetch.cfg file, but editing this file has no effect since it is re-written with data from the Xymon server each time the client runs.

logfetch stores information about what parts of the monitored logfiles have been processed already in the $XYMONHOME/tmp/logfetch.status file. This file is an internal file used by logfetch, and should not be edited. If deleted, it will be re-created automatically.

 

OPTIONS

--debug[=stderr]
Enables debug mode. Note that when run by the xymonclient, debug output may be written into the client data report, which can cause false positives and other unintended side effects. Use '=stderr' to cause the output to be written to stderr instead.

--noexec
The client-local.cfg(5) section for this host, class, or OS is automatically retrieved from the server during client submission. Logfetch can be requested to execute arbitrary commands to generate a list of log files to examine dynamically, but this can present a security risk in some environments. Set this option to prevent logfetch from executing requested commands

 

SECURITY

logfetch needs read access to the logfiles it should monitor. If you configure monitoring of files or directories through the "file:" and "dir:" entries in client-local.cfg(5) then logfetch will require at least read-acces to the directory where the file is located. If you request checksum calculation for a file, then it must be readable by the Xymon client user.

Do NOT install logfetch as suid-root. There is no way that logfetch can check whether the configuration file it uses has been tampered with, so installing logfetch with suid-root privileges could allow an attacker to read any file on the system by using a hand-crafted configuration file. In fact, logfetch will attempt to remove its own suid-root setup if it detects that it has been installed suid-root.

 

ENVIRONMENT VARIABLES

DU
Command used to collect information about the size of directories. By default, this is the command du -k. If the local du-command on the client does not recognize the "-k" option, you should set the DU environment variable in the $XYMONHOME/etc/xymonclient.cfg file to a command that does report directory sizes in kilobytes.

 

FILES

$XYMONHOME/tmp/logfetch.cfg
$XYMONHOME/tmp/logfetch.status

 

SEE ALSO

xymon(7), analysis.cfg(5), client-local.cfg(5)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
SECURITY
ENVIRONMENT VARIABLES
FILES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/statusreport.cgi.1.html0000664000076400007640000000776113037531445023156 0ustar rpmbuildrpmbuild Manpage of STATUSREPORT.CGI

STATUSREPORT.CGI

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

statusreport.cgi - CGI program to report a status for a group of servers  

SYNOPSIS

statusreport.cgi --column=COLUMNNAME [options]

 

DESCRIPTION

statusreport.cgi is a CGI tool to generate a simple HTML report showing the current status of a single column for a group of Xymon hosts.

E.g. You can use this report to get an overview of all of the SSL certificates that are about to expire.

The generated webpage is a simple HTML table, suitable for copying into other documents or e-mail.

statusreport.cgi runs as a CGI program, invoked by your webserver. It is normally run via a wrapper shell-script in the CGI directory for Xymon.

 

EXAMPLES

The Xymon installation includes two web report scripts using this CGI tool: The certreport.sh script generates a list of SSL server certificates that are yellow or red (i.e. they will expire soon); and the nongreen.sh script generates a report of all statuses that are currently non-green. These can be accessed from a web browser through a URL referencing the script in the Xymon CGI directory (e.g. "/xymon-cgi/xymon-nongreen.sh").

 

OPTIONS

--column=COLUMNNAME
Report the status of the COLUMNNAME column.

--all
Report the status for all hosts known to Xymon. By default, this tool reports only on the hosts found on the current page from where the CGI was invoked (by looking at the "pagepath" cookie).

--filter=CRITERIA
Only report on statuses that match the CRITERIA setting. See the xymon(1) man-page - in the "xymondboard" command description - for details about specifying filters.

--heading=HTML
Defines the webpage heading - i.e. the "title" tag in the generated HTML code.

--show-column
Include the column name in the display.

--show-colors
Show the status color on the generated webpage. The default is to not show the status color.

--no-colors
Do not include text showing the current color of each status in the report. This is the default.

--show-summary
Show only a summary of the important lines in the status message. By default, the entire status message appears in the generated HTML code. This option causes the first non-blank line of the status message to be shown, and also any lines beginning with "&COLOR" which is used by many status messages to point out lines of interest (non-green lines only, though).

--show-message
Show the entire message on the webpage. This is the default.

--link
Include HTML links to the host "info" page, and the status page.

--embedded
Only generate the HTML table, not a full webpage. This can be used to embed the status report into an external webpage.

--env=FILENAME
Load the environment from FILENAME before executing the CGI.

--area=NAME
Load environment variables for a specific area. NB: if used, this option must appear before any --env=FILENAME option.

 

SEE ALSO

xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
EXAMPLES
OPTIONS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/csvinfo.cgi.1.html0000664000076400007640000000555213037531445022042 0ustar rpmbuildrpmbuild Manpage of CSVINFO.CGI

CSVINFO.CGI

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

csvinfo.cgi - CGI program to show host information from a CSV file  

SYNOPSIS

csvinfo.cgi

 

DESCRIPTION

csvinfo.cgi is invoked as a CGI script via the csvinfo.sh CGI wrapper. Based on the parameters it receives, it searches a comma- separated file for the matching host, and presents the information found as a table.

csvinfo.cgi is passed a QUERY_STRING environment variable with the following parameters:


   key (string to search for, typically hostname)
   column (columnnumber to search - default 0)
   db  (name of the CSV database file in $XYMONHOME/etc/, default hostinfo.csv)
   delimiter (delimiter character for columns, default semi-colon)

CSV files are easily created from e.g. spreadsheets, by exporting them in CSV format. You should have one host per line, with the first line containing the column headings. Despite their name, the default delimiter for CSV files is the semi-colon - if you need a different delimiter, invoke csvinfo.cgi with the "delimiter=<character>" in the query string.

 

Example usage

This example shows how you can use the csvinfo CGI. It assumes you have a CSV-formatted file with information about the hosts stored as $XYMONHOME/etc/hostinfo.csv, and the hostname is in the first column of the file.

Use with the xymongen --docurl
The --docurl option to xymongen(1) sets up all of the hostnames on your Xymon webpages to act as links to a CGI script. To invoke the csvinfo CGI script, run xymongen with the option


   --docurl=/cgi-bin/csvinfo.sh?db=hostinfo.csv&key=%s

 

SEE ALSO

hosts.cfg(5), xymonserver.cfg(5), xymongen(1)


 

Index

NAME
SYNOPSIS
DESCRIPTION
Example usage
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/orcaxymon.1.html0000664000076400007640000000443013037531445021643 0ustar rpmbuildrpmbuild Manpage of ORCAXYMON

ORCAXYMON

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

orcaxymon - Xymon client utility to grab data from ORCA  

SYNOPSIS

orcaxymon --orca=PREFIX [options]

 

NOTICE

This utility is included in the client distribution for Xymon 4.2. However, the backend module to parse the data it sends it NOT included in Xymon 4.2. It is possible to use the generic Xymon NCV data handler in xymond_rrd(8) to process ORCA data, if you have an urgent need to do so.

 

DESCRIPTION

orcaxymon is an add-on tool for the Xymon client. It is used to grab data collected by the ORCA data collection tool (orcallator.se), and send it to the Xymon server in NCV format.

orcaxymon should run from the client xymonlaunch(8) utility, i.e. there must be an entry in the clientlaunch.cfg(5) file for orcaxymon.

 

OPTIONS

--orca=PREFIX
The filename prefix for the ORCA data log. Typically this is the directory for the ORCA logs, followed by "orcallator". The actual filename for the ORCA logs include a timestamp and sequence number, e.g. "orcallator-2006-06-20-000". This option is required.

--debug
Enable debugging output.

 

SEE ALSO

xymon(7), clientlaunch.cfg(5)


 

Index

NAME
SYNOPSIS
NOTICE
DESCRIPTION
OPTIONS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/xymongen.1.html0000664000076400007640000010424013037531445021470 0ustar rpmbuildrpmbuild Manpage of XYMONGEN

XYMONGEN

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

xymongen - Xymon webpage generator  

SYNOPSIS

xymongen -?
xymongen --help
xymongen --version
xymongen [options] [output-directory]
(See the OPTIONS section for a description of the available command-line options).

 

DESCRIPTION

xymongen generates the overview webpages for the Xymon monitor. These are the webpages that show the overall status of your hosts, not the detailed status pages for each test.

Note: The data for the webpages is retrieved from the xymond(8) daemon, and xymongen uses the values of the XYMSRV / XYMSERVERS environment variables to determine the network address where xymond can be reached. If you have more than one server listed in XYMSERVERS, make sure the first one is the local Xymon server - this is the one that xymongen will query for data.

 

OPTIONS

xymongen has a large number of command-line options. The options can be used to change the behaviour of xymongen and affect the web pages generated by it.

 

GENERAL OPTIONS

--help or -?
Provide a summary of available command-line options.

--version
Prints the version number of xymongen

--docurl=URL
This option is deprecated, use the HOSTDOCURL setting in xymonserver.cfg(5) instead.

--doccgi=URL
This option is deprecated, use the HOSTDOCURL setting in xymonserver.cfg(5) instead.

--doc-window
Causes links to documentation for hosts and services to open in a new window. The default is to show documentation in the same browser window as the Xymon status.

--htmlextension=.EXTENSION
Sets the filename extension used for the webpages generated by xymongen. By default, an extension of ".html" is used. Note that you need to specify the "dot".

--report[=COLUMNNAME]
With this option, xymongen will send a status message with details of how many hosts were processed, how many pages were generated, any errors that occurred during the run, and some timing statistics. The default columnname is "xymongen".

--htaccess[=htaccess-filename]
Create .htaccess files when new web page directories are created. The content of the .htaccess files are determined by the XYMONHTACCESS environment variable (for the top-level directory with xymon.html and nongreen.html); by the XYMONPAGEHTACCESS variable (for the page-level directories); and by the XYMONSUBPAGEHTACCESS variable for subpage- and subparent-level directories. The filename of the .htaccess files default to ".htaccess" if no filename is given with this option. The XYMONHTACCESS variable is copied verbatim into the top-level .htaccess file. The XYMONPAGEHTACCESS variable may contain a "%s" where the name of the page is inserted. The XYMONSUBPAGEHTACCESS variable may contain two "%s" instances: The first is replaced with the pagename, the second with the subpagename.

--max-eventcount=N
Limit the eventlog on the "All non-green" page to only N events. Default: 100.

--max-eventtime=N
Limit the eventlog on the "All non-green" page to events that happened within the past N minutes. Default: 240.

--no-eventlog
Disable the eventlog normally displayed on the "All non-green" page

--max-ackcount=N
Limit the acknowledgment log on the "All non-green" page to only N events. Default: 25.

--max-acktime=N
Limit the acknowledgment log on the "All non-green" page to acks that happened within the past N minutes. Default: 240.

--no-acklog
Disable the acknowledgement log normally displayed on the "All non-green" page.

--cricitcallog[=Critical log column]
This generates a text-based log of what is shown on the critical.html status page, and sends a status message for the Xymon server itself reflecting the color of the Critical status page. This allows you to track when problems have appeared on the critical status page. The logfile is stored in $XYMONSERVERLOGS/criticalstatus.log

--loadhostsfromxymond
Instead of reading the hosts.cfg file, xymongen will load the hosts.cfg configuration from the xymond daemon. This eliminates the need for reading the hosts.cfg, and if you have xymond and xymongen running on different hosts, it also eliminates the need for copying the hosts.cfg file between systems. Note that the "dispinclude" option in hosts.cfg is ignored when this option is enabled.

 

PAGE LAYOUT OPTIONS

These options affect how the webpages generated by xymongen appear in the browser.

--pages-last
Put page- and subpage-links after hosts.
--pages-first
Put page- and subpage-links before hosts (default).

These two options decide whether a page with links to subpages and hosts have the hosts or the subpages first.

--subpagecolumns=N
Determines the number of columns used for links to pages and subpages. The default is N=1.

--maxrows=N
Column headings on a page are by default only shown at the beginning of a page, subpage or group of hosts. This options causes the column headings to repeat for every N hosts shown.

--showemptygroups
--no-showemptygroups
When groups are hosts are made, display the table and host names even if there are no tests present for any of the hosts in question. Use --no-showemptygroups to hide. (Default: yes)

--pagetitle-links
Normally, only the colored "dots" next to a page or subpage act as links to the page itself. With this option, the page title will link to the page also.

--pagetext-headings
Use the description text from the "page" or "subpage" tags as a heading for the page, instead of the "Pages hosted locally" or other standard heading.

--no-underline-headings
Normally, page headings are underlined using an HTML "horizontal ruler" tag. This option disables the underlining of headings.

--recentgifs[=MINUTES]
Use images named COLOR-recent.gif for tests, where the test status has changed within the past 24 hours. These GIF files need to be installed in the $XYMONHOME/www/gifs/ directory. By default, the threshold is set to 24 hours - if you want it differently, you can specify the time limit also. E.g. "--recentgifs=3h" will show the recent GIFs for only 3 hours after a status change.

--sort-group-only-items
In a normal "group-only" directive, you can specify the order in which the tests are displayed, from left to right. If you prefer to have the tests listed in alphabetical order, use this option - the page will then generate "group-only" groups like it generates normal groups, and sort the tests alphabetically.

--dialupskin=URL
If you want to visually show that a test is a dialup-test, you can use an alternate set of icons for the green/red/yellow>/etc. images by specifying this option. The URL parameter specified here overrides the normal setting from the XYMONSKIN environment variable, but only for dialup tests.

--reverseskin=URL
Same as "--dialupskin", but for reverse tests (tests with '!' in front).

--tooltips=[always,never,main]
Determines which pages use tooltips to show the description of the host (from the COMMENT entry in the hosts.cfg(5) file). If set to always, tooltips are used on all pages. If set to never, tooltips are never used. If set to main, tooltips are used on the main pages, but not on the "All non-green" or "Critical systems" pages.

 

COLUMN SELECTION OPTIONS

These options affect which columns (tests) are included in the webpages generated by xymongen.

--ignorecolumns=test[,test]
The given columns will be completely ignored by xymongen when generating webpages. Can be used to generate reports where you eliminate some of the more noisy tests, like "msgs".

--critical-reds-only
Only red status columns will be included on the Critical page. By default, the Critical page will contain hosts with red, yellow and clear status.

--nongreen-colors=COLOR[,COLOR]
Defines which colors cause a test to appear on the "All non-green" status page. COLOR is red, yellow or purple. The default is to include all three.

--nongreen-ignorecolumns=test[,test]
Same as the --ignorecolumns, but applies to hosts on the "All non-green" page only.

--nongreen-ignorepurples
Deprecated, use "--nongreen-colors" instead.

--nongreen-ignoredialups
Ignore all dialup hosts on the "All non-green" page, including the eventlog.

--no-pages
Do not generate the normal pages (normally used to generate only the non-green page).

--no-nongreen
Do not generate the "All non-green" page.

--includecolumns=test[,test]
Always include these columns on "All non-green" page Will include certain columns on the nongreen.html page, regardless of its color. Normally, nongreen.html drops a test-column, if all tests are green. This can be used e.g. to always have a link to the trends column (with the RRD graphs) from your nongreen.html page.

--eventignore=test[,test]
Ignore these tests in the "All non-green" event log display.

 

STATUS PROPAGATION OPTIONS

These options suppress the normal propagation of a status upwards in the page hierarchy. Thus, you can have a test with status yellow or red, but still have the entire page green. It is useful for tests that need not cause an alarm, but where you still want to know the actual status. These options set global defaults for all hosts; you can use the NOPROPRED and NOPROPYELLOW tags in the hosts.cfg(5) file to apply similar limits on a per-host basis.

--nopropyellow=test[,test] or --noprop=test[,test]
Disable upwards status propagation when YELLOW. The "--noprop" option is deprecated and should not be used.

--noproppurple=test[,test]
Disable upwards status propagation when PURPLE.

--nopropred=test[,test]
Disable upwards status propagation when RED or YELLOW.

--nopropack=test[,test]
Disable upwards status propagation when status has been acknowledged. If you want to disable all acked tests from being propageted, use "--nopropack=*".

 

PURPLE STATUS OPTIONS

Purple statuses occur when reporting of a test status stops. A test status is valid for a limited amount of time - normally 30 minutes - and after this time, the test becomes purple.

--purplelog=FILENAME
Generate a logfile of all purple status messages.

 

ALTERNATE PAGESET OPTIONS

--pageset=PAGESETNAME
Build webpages for an alternate pageset than the default. See the PAGESETS section below.

--template=TEMPLATE
Use an alternate template for header and footer files. Typically used together the the "--pageset" option; see the PAGESETS section below.

 

ALTERNATE OUTPUT FORMATS

--wml[=test1,test2,...]
This option causes xymongen to generate a set of WML "card" files that can be accessed by a WAP device (cell phone, PDA etc.) The generated files contain the hosts that have a RED or YELLOW status on tests specified. This option can define the default tests to include - the defaults can be overridden or amended using the "WML:" or "NK:" tags in the hosts.cfg(5) file. If no tests are specified, all tests will be included.

--nstab=FILENAME
Generate an HTML file suitable for a Netscape 6/Mozilla sidebar entry. To actually enable your users to obtain such a sidebar entry, you need this Javascript code in a webpage (e.g. you can include it in the $XYMONHOME/web/stdnormal_header file):

<SCRIPT TYPE="text/javascript">
<!--
function addNetscapePanel() {

   if ((typeof window.sidebar == "object") && 
       (typeof window.sidebar.addPanel == "function"))

      window.sidebar.addPanel ("Xymon", 

            "http://your.server.com/nstab.html","");

   else

      alert("Sidebar only for Mozilla or Netscape 6+");
}
//-->
</SCRIPT>

and then you can include a "Add this to sidebar" link using this as a template:


   <A HREF="javascript:addNetscapePanel();">Add to Sidebar</A>

or if you prefer to have the standard Netscape "Add tab" button, you would do it with


   <A HREF="javascript:addNetscapePanel();">

      <IMG SRC="/gifs/add-button.gif" HEIGHT=45 WIDTH=100

           ALT="[Add Sidebar]" STYLE="border:0">

   </A>

The "add-button.gif" is available from Netscape at http://developer.netscape.com/docs/manuals/browser/sidebar/add-button.gif.

If FILENAME does not begin with a slash, the Netscape sidebar file is placed in the $XYMONHOME/www/ directory.

--nslimit=COLOR
The minimum color to include in the Netscape Sidebar - default is "red", meaning only critical alerts are included. If you want to include warnings also, use "--nslimit=yellow".

--rss
Generate RSS/RDF content delivery stream of your Xymon alerts. This output format can be dynamically embedded in other web pages, much like the live newsfeeds often seen on web sites. Two RSS files will be generated, one reflects the "All non-green" page, the other reflects the "Critical" page. They will be in the "nongreen.rss" and "critical.rss" files, respectively. In addition, an RSS file will be generated for each page and/or subpage listing the hosts present on that page or subpage.
The FILENAME parameter previously allowed on the --rss option is now obsolete.
For more information about RSS/RDF content feeds, please see http://www.syndic8.com/.

--rssextension=.EXTENSION
Sets the filename extension used for the RSS files generated by xymongen. By default, an extension of ".rss" is used. Note that you need to specify the "dot".

--rssversion={0.91|0.92|1.0|2.0}
The desired output format of the RSS/RDF feed. Version 0.91 appears to be the most commonly used format, and is the default if this option is omitted.

--rsslimit=COLOR
The minimum color to include in the RSS feed - default is "red", meaning only critical alerts are included. If you want to include warnings also, use "--rsslimit=yellow".

 

OPTIONS USED BY CGI FRONT-ENDS

--reportopts=START:END:DYNAMIC:STYLE
Invoke xymongen in report-generation mode. This is normally used by the report.cgi(1) CGI script, but may also be used directly when pre-generating reports. The START parameter is the start-time for the report in Unix time_t format (seconds since Jan 1st 1970 00:00 UTC); END is the end-time for the report; DYNAMIC is 0 for a pre-built report and 1 for a dynamic (on-line) report; STYLE is "crit" to include only critical (red) events, "nongr" to include all non-green events, and "all" to include all events.

--csv=FILENAME
Used together with --reportopts, this causes xymongen to generate an availability report in the form of a comma-separated values (CSV) file. This format is commonly used for importing into spreadsheets for further processing.
The CSV file includes Unix timestamps. To display these as human readable times in Excel, the formula =C2/86400+DATEVALUE(1-jan-1970) (if you have the Unix timestamp in the cell C2) can be used. The result cell should be formatted as a date/time field. Note that the timestamps are in UTC, so you may also need to handle local timezone and DST issues yourself.

--csvdelim=DELIMITER
By default, a comma is used to delimit fields in the CSV output. Some non-english spreadsheets use a different delimiter, typically semi-colon. To generate a CSV file with the proper delimiter, you can use this option to set the character used as delimiter. E.g. "--csvdelim=;" - note that this normally should be in double quotes, to prevent the Unix shell from interpreting the delimiter character as a command-line delimiter.

--snapshot=TIME
Generate a snapshot of the Xymon pages, as they appeared at TIME. TIME is given as seconds since Jan 1st 1970 00:00 UTC. Normally used via the snapshot.cgi(1) CGI script.

 

DEBUGGING OPTIONS

--debug
Causes xymongen to dump large amounts of debugging output to stdout, if it was compiled with the -DDEBUG enabled. When reporting a problem with xymongen, please try to reproduce the problem and provide the output from running xymongen with this option.

--timing
Dump information about the time spent by various parts of xymongen to stdout. This is useful to see what part of the processing is responsible for the run-time of xymongen.
Note: This information is also provided in the output sent to the Xymon display when using the "--report" option.

 

BUILDING ALTERNATE PAGESETS

With version 1.4 of xymongen comes the possibility to generate multiple sets of pages from the same data.
Suppose you have two groups of people looking at the Xymon webpages. Group A wants to have the hosts grouped by the client, they belong to. This is how you have Xymon set up - the default pageset. Now group B wants to have the hosts grouped by operating system - let us call it the "os" set. Then you would add the page layout to hosts.cfg like this:

ospage win Microsoft Windows
ossubpage win-nt4 MS Windows NT 4
osgroup NT4 File servers
osgroup NT4 Mail servers
ossubpage win-xp MS Windows XP
ospage unix Unix
ossubpage unix-sun Solaris
ossubpage unix-linux Linux

This defines a set of pages with one top-level page (the xymon.html page), two pages linked from xymon.html (win.html and unix.html), and from e.g. the win.html page there are subpages win-nt4.html and win-xp.html
The syntax is identical to the normal "page" and "subpage" directives in hosts.cfg, but the directive is prefixed with the pageset name. Don't put any hosts in-between the page and subpage directives - just add all the directives at the top of the hosts.cfg file.
How do you add hosts to the pages, then ? Simple - just put a tag "OS:win-xp" on the host definition line. The "OS" must be the same as prefix used for the pageset names, but in uppercase. The "win-xp" must match one of the pages or subpages defined within this pageset. E.g.

207.46.249.190 www.microsoft.com # OS:win-xp http://www.microsoft.com/
64.124.140.181 www.sun.com # OS:unix-sun http://www.sun.com/

If you want the host to appear inside a group defined on that page, you must identify the group by number, starting at 1. E.g. to put a host inside the "NT4 Mail servers" group in the example above, use "OS:win-nt4,2" (the second group on the "win-nt4" page).
If you want the host to show up on the frontpage instead of a subpage, use "OS:*" .

All of this just defines the layout of the new pageset. To generate it, you must run xymongen once for each pageset you define - i.e. create an extension script like this:

#!/bin/sh

XYMONWEB="/xymon/os" $XYMONHOME/bin/xymongen \
        --pageset=os --template=os \
        $XYMONHOME/www/os/

Save this to $XYMONHOME/ext/os-display.sh, and set this up to run as a Xymon extension; this means addng an extra section to tasks.cfg to run it.

This generates the pages. There are some important options used here:
* XYMONWEB="/xymon/os" environment variable, and the
  "$XYMONHOME/www/os/" option work together, and places the 
  new pageset HTML files in a subdirectory off the normal 
  Xymon webroot. If you normally access the Xymon pages as 
  "http://xymon.acme.com/xymon/", you will then access 
  the new pageset as "http://xymon.acme.com/xymon/os/"
  NB: The directory given as XYMONWEB must contain a symbolic 
  link to the $XYMONHOME/www/html/ directory, or links to 
  individual status messages will not work. Similar links 
  should be made for the gifs/, help/ and notes/ 
  directories.
* "--pageset=os" tells xymongen to structure the webpages
  using the "os" layout, instead of the default layout.
* "--template=os" tells xymongen to use a different set of
  header- and footer-templates. Normally xymongen uses the 
  standard template in $XYMONHOME/web/stdnormal_header and 
  .../stdnormal_footer - with this option, it will instead use 
  the files "os_header" and "os_footer" from the 
  $XYMONHOME/web/ directory. This allows you to customize 
  headers and footers for each pageset. If you just want 
  to use the normal template, you can omit this option.

 

USING XYMONGEN FOR REPORTS

xymongen reporting is implemented via drop-in replacements for the standard Xymon reporting scripts (report.sh and reportlog.sh) installed in your webservers cgi-bin directory.

These two shell script have been replaced with two very small shell-scripts, that merely setup the Xymon environment variables, and invoke the report.cgi(1) or reportlog.cgi(1) scripts in $XYMONHOME/bin/

You can use xymongen command-line options when generating reports, e.g. to exclude certain types of tests (e.g. "--ignorecolumns=msgs") from the reports, to specify the name of the trends- and info- columns that should not be in the report, or to format the report differently (e.g. "--subpagecolumns=2"). If you want certain options to be used when a report is generated from the web interface, put these options into your $XYMONHOME/etc/xymonserver.cfg file in the XYMONGENREPOPTS environment variable.

The report files generated by xymongen are stored in individual directories (one per report) below the $XYMONHOME/www/rep/ directory. These should be automatically cleaned up - as new reports are generated, the old ones get removed.

After installing, try generating a report. You will probably see that the links in the upper left corner (to ack.html, nongreen.html etc.) no longer works. To fix these, change your $XYMONHOME/web/repnormal_header file so these links do not refer to "&XYMONWEB" but to the normal URL prefix for your Xymon pages.

 

SLA REPORTING

xymongen reporting allows for the generation of true SLA (Service Level Agreement) reports, also for service periods that are not 24x7. This is enabled by defining a "REPORTTIME:timespec" tag for the hosts to define the service period, and optionally a "WARNPCT:level" tag to define the agreed availability.

Note: See hosts.cfg(5) for the exact syntax of these options.

"REPORTTIME:timespec" specifies the time of day when the service is expected to be up and running. By default this is 24 hours a day, all days of the week. If your SLA only covers Mon-Fri 7am - 8pm, you define this as "REPORTTIME=W:0700:2000", and the report generator will then compute both the normal 24x7 availability but also a "SLA availability" which only takes the status of the host during the SLA period into account.

The DOWNTIME:timespec parameter affects the SLA availability calculation. If an outage occurs during the time defined as possible "DOWNTIME", then the failure is reported with a status of "blue". (The same color is used if you "disable" then host using the Xymon "disable" function). The time when the test status is "blue" is not included in the SLA calculation, neither in the amount of time where the host is considered down, nor in the total amount of time that the report covers. So "blue" time is effectively ignored by the SLA availability calculation, allowing you to have planned downtime without affecting the reported SLA availability.

Example: A host has "DOWNTIME:*:0700:0730 REPORTTIME=W:0600:2200" because it is rebooted every day between 7am and 7.30am, but the service must be available from 6am to 10pm. For the day of the report, it was down from 7:10am to 7:15am (the planned reboot), but also from 9:53pm to 10:15pm. So the events for the day are:


   0700 : green for 10 minutes (600 seconds)
   0710 : blue for 5 minutes (300 seconds)
   0715 : green for 14 hours 38 minutes (52680 seconds)
   2153 : red for 22 minutes (1320 seconds)
   2215 : green

The service is available for 600+52680 = 53280 seconds. It is down (red) for 420 seconds (the time from 21:53 until 22:00 when the SLA period ends). The total time included in the report is 15 hours (7am - 10pm) except the 5 minutes blue = 53700 seconds. So the SLA availability is 53280/53700 = 99,22%

The "WARNPCT:level" tag is supported in the hosts.cfg file, to set the availability threshold on a host-by-host basis. This threshold determines whether a test is reported as green, yellow or red in the reports. A default value can be set for all hosts with the via the XYMONREPWARN environment variable, but overridden by this tag. The level is given as a percentage, e.g. "WARNPCT:98.5"

 

PRE-GENERATED REPORTS

Normally, xymongen produce reports that link to dynamically generated webpages with the detailed status of a test (via the reportlog.sh CGI script).

It is possible to have xymongen produce a report without these dynamic links, so the report can be exported to another server. It may also be useful to pre-generate the reports, to lower the load by having multiple users generate the same reports.

To do this, you must run xymongen with the "--reportopts" option to select the time interval that the report covers, the reporting style (critical, non-green, or all events), and to request that no dynamic pages are to be generated.

The syntax is:


   xymongen --reportopts=starttime:endtime:nodynamic:style

"starttime" and "endtime" are specified as Unix time_t values, i.e. seconds since Jan 1st 1970 00:00 GMT. Fortunately, this can easily be computed with the GNU date utility if you use the "+%s" output option. If you don't have the GNU date utility, either pick that up from www.gnu.org; or you can use the "etime" utility for the same purpose, which is available from the archive at www.deadcat.net.

"nodynamic" is either 0 (for dynamic pages, the default) or 1 (for no dynamic, i.e. pre-generated, pages).

"style" is either "crit" (include critical i.e. red events only), "nongr" (include all non-green events), or "all" (include all events).

Other xymongen options can be used, e.g. "--ignorecolumns" if you want to exclude certain tests from the report.

You will normally also need to specify the XYMONWEB environment variable (it must match the base URL for where the report will be made accessible from), and an output directory where the report files are saved. If you specify XYMONWEB, you should probably also define the XYMONHELPSKIN and XYMONNOTESSKIN environment variables. These should point to the URL where your Xymon help- and notes-files are located; if they are not defined, the links to help- and notes-files will point inside the report directory and will probably not work.

So a typical invocation of xymongen for a static report would be:


  START=`date +%s --date="22 Jun 2003 00:00:00"`
  END=`date +%s --date="22 Jun 2003 23:59:59"`
  XYMONWEB=/reports/bigbrother/daily/2003/06/22 \
  XYMONHELPSKIN=/xymon/help \
  XYMONNOTESSKIN=/xymon/notes \
  xymongen --reportopts=$START:$END:1:crit \
        --subpagecolumns=2 \
        /var/www/docroot/reports/xymon/daily/2003/06/22

The "XYMONWEB" setting means that the report will be available with a URL of "http://www.server.com/reports/xymon/daily/2003/06/22". The report contains internal links that use this URL, so it cannot be easily moved to another location.

The last parameter is the corresponding physical directory on your webserver matching the XYMONWEB URL. You can of course create the report files anywhere you like - perhaps on another machine - and then move them to the webserver later on.

Note how the date(1) utility is used to calculate the start- and end-time parameters.

 

ENVIRONMENT VARIABLES

BOARDFILTER
Filter used to select what hosts / tests are included in the webpages, by filtering the data retrieved from xymond vi the xymondboard command. See xymon(1) for details on the filter syntax. By default, no filtering is done.

 

SEE ALSO

hosts.cfg(5), xymonserver.cfg(5), tasks.cfg(5), report.cgi(1), snapshot.cgi(1), xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
GENERAL OPTIONS
PAGE LAYOUT OPTIONS
COLUMN SELECTION OPTIONS
STATUS PROPAGATION OPTIONS
PURPLE STATUS OPTIONS
ALTERNATE PAGESET OPTIONS
ALTERNATE OUTPUT FORMATS
OPTIONS USED BY CGI FRONT-ENDS
DEBUGGING OPTIONS
BUILDING ALTERNATE PAGESETS
USING XYMONGEN FOR REPORTS
SLA REPORTING
PRE-GENERATED REPORTS
ENVIRONMENT VARIABLES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/hostgraphs.cgi.1.html0000664000076400007640000000526213037531445022553 0ustar rpmbuildrpmbuild Manpage of HOSTGRAPHS.CGI

HOSTGRAPHS.CGI

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

hostgraphs.cgi - CGI program to show multiple graphs  

SYNOPSIS

hostgraph.cgi

 

DESCRIPTION

hostgraph.cgi is invoked as a CGI script via the hostgraph.sh CGI wrapper.

If no parameters are provided when invoked, it will present a form where the user can select a time period, one or more hosts, and a set of graphs.

The parameters selected by the user are passed to a second invocation of hostgraph.cgi, and result in a webpage showing a list of graph images based on the trend data stored about the hosts.

If multiple graph-types are selected, hostgraph.cgi will display a list of graphs, with one graph per type.

If multiple hosts are selected, hostgraph.cgi will attempt to display a multi-host graph for each type where the graphs for all hosts are overlayed in a single image, allowing for easy comparison of the hosts.

The hostlist uses the PAGEPATH cookie provided by Xymon webpages to select the list of hosts to present. Only the hosts visible on the page where hostgraph.cgi is invoked from will be visible.

The resulting graph page can be bookmarked, but the bookmark also fixates the time period shown.

 

OPTIONS

--env=FILENAME
Loads the environment defined in FILENAME before executing the CGI script.

 

BUGS

This utility is experimental. It may change in a future release of Xymon.

It is possible for the user to select graphs which do not exist. This results in broken image links.

The set of graph-types is fixed in the server/web/hostgraphs_form template and does not adjust to which graphs are available.

If the tool is invoked directly, all hosts defined in Xymon will be listed.

 

SEE ALSO

hosts.cfg(5), xymonserver.cfg(5)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
BUGS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/datepage.cgi.1.html0000664000076400007640000000760513037531445022146 0ustar rpmbuildrpmbuild Manpage of DATEPAGE.CGI

DATEPAGE.CGI

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

datepage.cgi - Xymon CGI script to view pre-built reports by date  

SYNOPSIS

datepage.cgi?type={day,week,month} --url=URLPREFIX [options]

 

DESCRIPTION

datepage.cgi is invoked as a CGI script via the datepage.sh CGI wrapper.

datepage.cgi is passed a QUERY_STRING environment variable with the type of time-selection that is desired: Either "day", "week" or "month" can be requested. It will then generate a web form with appropriate day/week/month selection boxes, and based on the users' selection a resulting url is built from the URLPREFIX and the time selection. The browser is then redirected to this URL.

The URL is constructed from the URLPREFIX, the type-parameter, the value of the "pagepath" or "host" cookie, and the users' selection as follows:

type=day
The final URL is URLPREFIX/daily/YEAR/MONTH/DAY/PAGEPATH.

type=week
The final URL is URLPREFIX/weekly/YEAR/WEEK/PAGEPATH.

type=month
The final URL is URLPREFIX/monthly/YEAR/MONTH/PAGEPATH.

YEAR is the full year (4 digits, including century). MONTH is the two-digit number of the month (01..12). DAY is the number of the day in the month (01..31). WEEK is the ISO 8601:1988 week-number (01..53). PAGEPATH is the current value of the "pagepath" cookie if set; if it is not set but the "host" cookie is set, then this host is looked up in the hosts.cfg file and the page where this host is found is used for PAGEPATH. These two cookies are set by the default web-header templates supplied with Xymon.

 

OPTIONS

--url=URLPREFIX
This specifies the initial part of the final URL. This option is required.

--hffile=FILENAME
Specifies the template files (from $XYMONHOME/web/) to use. The default is "--hffile=report".

--color=COLOR
Sets the background color of the generated webpage. The default is blue.

--env=FILENAME
Loads the environment defined in FILENAME before executing the CGI script.

--debug
Enables debugging output.

$XYMONHOME/web/report_form_daily
HTML form template for the date selection form when type=daily.

$XYMONHOME/web/report_form_weekly
HTML form template for the date selection form when type=weekly.

$XYMONHOME/web/report_form_monthly
HTML form template for the date selection form when type=monthly.

$XYMONHOME/web/report_header
HTML header file for the generated web page

$XYMONHOME/web/report_footer
HTML footer file for the generated web page

 

ENVIRONMENT VARIABLES

XYMONHOME
Used to locate the template files for the generated web pages.

QUERY_STRING
Contains the parameters for the CGI script.

 

SEE ALSO

xymongen(1), hosts.cfg(5), xymonserver.cfg(5)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
ENVIRONMENT VARIABLES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/showgraph.cgi.1.html0000664000076400007640000001040013037531445022361 0ustar rpmbuildrpmbuild Manpage of SHOWGRAPH.CGI

SHOWGRAPH.CGI

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

showgraph.cgi - CGI to generate Xymon trend graphs  

SYNOPSIS

showgraph [options]

 

DESCRIPTION

showgraph.cgi is invoked as a CGI script via the showgraph.sh CGI wrapper.

showgraph.cgi is passed a QUERY_STRING environment variable with the following parameters:

host Name of the host to generate a graph for

service Name of the service to generate a graph for

disp Display-name of the host, used on the generated graphs instead of hostname.

graph Can be "hourly", "daily", "weekly" or "monthly" to select the time period that the graph covers.

first Used to split multi-graphs into multiple graphs. This causes showgraph.cgi to generate only the graphs starting with the "first'th" graph and continuing for "count".

count Number of graphs in a multi-graph.

upper Set the upper limit of the graph. See rrdgraph(1) for a description of the "-u" option.

lower Set the lower limit of the graph. See rrdgraph(1) for a description of the "-l" option.

graph_start Set the starttime of the graph. This is used in zoom-mode.

graph_end Set the end-time of the graph. This is used in zoom-mode.

action=menu Generate an HTML page with links to 4 graphs, representing the hourly, weekly, monthly and yearly graphs. Doesn't actually generate any graphs, only the HTML that links to the graphs.

action=selzoom Generate an HTML page with link to single graph, and with JavaScript code that lets the user select part of the graph for a zoom-operation. The JavaScript invokes showgraph.cgi with "action=showzoom" to generate the zoomed graph webpage.

action=showzoom Generate HTML with a link to the zoomed graph image. This link goes to an "action=view" invocation of showgraph.cgi.

action=view Generate a single graph image.

 

OPTIONS

--config=FILENAME
Loads the graph configuration file from FILENAME. If not specified, the file $XYMONHOME/etc/graphs.cfg is used. See the graphs.cfg(5) for details about this file.

--env=FILENAME
Loads the environment settings defined in FILENAME before executing the CGI.

--rrddir=DIRECTORY
The top-level directory for the RRD files. If not specified, the directory given by the XYMONRRDS environment is used.

--save=FILENAME
Instead of returning the image via the CGI interface (i.e. on stdout), save the generated image to FILENAME.

--debug
Enable debugging output.

 

ENVIRONMENT

QUERY_STRING Provided by the webserver CGI interface, this decides what graph to generate.

RRDGRAPHOPTS RRD-specific options for the graph. This is usually set in the xymonserver.cfg(5) file.

 

FILES

graphs.cfg: The configuration file determining how graphs are generated from RRD files.

 

SEE ALSO

graphs.cfg(5), xymon(7), rrdtool(1)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
ENVIRONMENT
FILES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/xymon.1.html0000664000076400007640000005711713037531445021010 0ustar rpmbuildrpmbuild Manpage of XYMON

XYMON

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

xymon - Xymon client communication program  

SYNOPSIS

xymon [options] RECIPIENT message

 

DESCRIPTION

xymon(1) is the client program used to communicate with a Xymon server. It is frequently used by Xymon client systems to send in status messages and pager alerts on local tests.

In Xymon, the xymon program is also used for administrative purposes, e.g. to rename or delete hosts, or to disable hosts that are down for longer periods of time.

 

OPTIONS AND PARAMETERS

--debug
Enable debugging. This prints out details about how the connection to the Xymon server is being established.

--proxy=http://PROXYSERVER:PROXYPORT/
When sending the status messages via HTTP, use this server as an HTTP proxy instead of connecting directly to the Xymon server.

--timeout=N
Specifies the timeout for connecting to the Xymon server, in seconds. The default is 5 seconds.

--response
The xymon utility normally knows when to expect a response from the server, so this option is not required. However, it will cause any response from the server to be displayed.

--merge
Merge the command line message text with the data provided on standard input, and send the result to the Xymon server. The message text provided on the command line becomes the first line of the merged message.

RECIPIENT
The RECIPIENT parameter defines which server receives the message. If RECIPIENT is given as "0.0.0.0", then the message is sent to all of the servers listed in the XYMSERVERS environment variable.

Usually, a client will use "$XYMSRV" for the RECIPIENT parameter, as this is defined for the client scripts to automatically contain the correct value.

The RECIPIENT parameter may be a URL for a webserver that has the xymoncgimsg.cgi or similar script installed. This tunnels the Xymon messages to the Xymon server using standard HTTP protocol. The xymoncgimsg.cgi(8) CGI tool (included in Xymon) must be installed on the webserver for the HTTP transport to work.

MESSAGE
The message parameter is the message to be sent across to the Xymon server. Messages must be enclosed in quotes, but by doing so they can span multiple lines. The maximum size of a message is defined by the maximum allowed length of your shellaqs command-line, and is typically 8-32 KB.

If you need to send longer status messages, you can specify "@" as the message: xymon will then read the status message from its stdin.

 

XYMON MESSAGE SYNTAX

This section lists the most commonly used messages in the Xymon protocol.

Each message must begin with one of the Xymon commands. Where a HOSTNAME is specified, it must have any dots in the hostname changed to commas if the Xymon FQDN setting is enabled (which is the default). So the host "www.foo.com", for example, would report as "www,foo,com".

status[+LIFETIME][/group:GROUP] HOSTNAME.TESTNAME COLOR <additional text>
This sends in a status message for a single test (column) on a single host. TESTNAME is the name of the column where this test will show up; any name is valid except that using dots in the testname will not work. COLOR must be one of the valid colors: "green", "yellow", "red" or "clear". The colors "blue" and "purple" - although valid colors - should not be sent in a status message, as these are handled specially by the Xymon server. As a special case (for supporting older clients), "client" can be used as the name of the color. This causes the status message to be handled by Xymon as a "client" data message, and the TESTNAME parameter is used as the "collector id".
The "additional text" normally includes a local timestamp and a summary of the test result on the first line. Any lines following the first one are free-form, and can include any information that may be useful to diagnose the problem being reported.
The LIFETIME defines how long this status is valid after being received by the Xymon server. The default is 30 minutes, but you can set any period you like. E.g. for a custom test that runs once an hour, you will want to set this to at least 60 minutes - otherwise the status will go purple after 30 minutes. It is a good idea to set the LIFETIME to slightly longer than the interval between your tests, to allow for variations in the time it takes your test to complete. The LIFETIME is in minutes, unless you add an "h" (hours), "d" (days) or "w" (weeks) immediately after the number, e.g. "status+5h" for a status that is valid for 5 hours.
The GROUP option is used to direct alerts from the status to a specific group. It is currently used for status generated from the Xymon clientsaq data, e.g. to direct alerts for a "procs" status to different people, depending on exactly which process is down.

notify HOSTNAME.TESTNAME <message text>
This triggers an informational message to be sent to those who receive alerts for this HOSTNAME+TESTNAME combination, according to the rules defined in alerts.cfg(5) This is used by the enadis.cgi(1) tool to notify people about hosts being disabled or enabled, but can also serve as a general way of notifying server administrators.

data HOSTNAME.DATANAME<newline><additional text>
The "data" message allows tools to send data about a host, without it appearing as a column on the Xymon webpages. This is used, for example, to report statistics about a host, e.g. vmstat data, which does not in itself represent something that has a red, yellow or green identity. It is used by RRD bottom-feeder modules, among others. In Xymon, data messages are by default processed only by the xymond_rrd(8) module. If you want to handle data-messages using an external application, you may want to enable the xymond_filestore(8) module for data-messages, to store data-messages in a format compatible with how the Big Brother daemon does.

disable HOSTNAME.TESTNAME DURATION <additional text>
Disables a specific test for DURATION minutes. This will cause the status of this test to be listed as "blue" on the Xymon server, and no alerts for this host/test will be generated. If DURATION is given as a number followed by s/m/h/d, it is interpreted as being in seconds/minutes/hours/days respectively. TodisableatestuntilitbecomesOK,use-1astheDURATION. Todisablealltestsforahost,useanasterisk*forTESTNAME.

enable HOSTNAME.TESTNAME
Re-enables a test that had been disabled.

query HOSTNAME.TESTNAME
Query the Xymon server for the latest status reported for this particular test. If the host/test status is known, the response is the first line of the status report - the current color will be the first word on the line. Additional lines of text that might be present on the status message cannot be retrieved.
This allows any Xymon client to determine the status of a particular test, whether it is one pertaining to the host where the client is running, some other host, or perhaps the result of a combined test from multiple hosts managed by combostatus(1) This will typically be useful to Xymon client extension scripts, that need to determine the status of other hosts, for example, to decide if an automatic recovery action should be initiated.

config FILENAME
Retrieve one of the Xymon configuration files from the server. This command allows a client to pull files from the $XYMONHOME/etc/ directory on the server, allowing for semi-automatic updates of the client configuration. Since the configuration files are designed to have a common file for the configuration of all hosts in the system - and this is in fact the recommended way of configuring your clients - this makes it easier to keep the configuration files synchronized.

drop HOSTNAME
Removes all data stored about the host HOSTNAME. It is assumed that you have already deleted the host from the hosts.cfg configuration file.

drop HOSTNAME TESTNAME
Remove data about a single test (column).

rename OLDHOSTNAME NEWHOSTNAME
Rename all data for a host that has had its name changed. You should do this after changing the hostname in the hosts.cfg configuration file.

rename HOSTNAME OLDTESTNAME NEWTESTNAME
Rename data about a single test (column).

xymondlog HOSTNAME.TESTNAME
Retrieve the Xymon status-log for a single test. The first line of the response contains a series of fields separated by a pipe-sign:

hostname The name of the host

testname The name of the test

color Status color (green, yellow, red, blue, clear, purple)

testflags For network tests, the flags indicating details about the test (used by xymongen).

lastchange Unix timestamp when the status color last changed.

logtime Unix timestamp when the log message was received.

validtime Unix timestamp when the log message is no longer valid (it goes purple at this time).

acktime Either -1 or Unix timestamp when an active acknowledgement expires.

disabletime Either -1 or Unix timestamp when the status is no longer disabled.

sender IP address where the status was received from.

cookie Either -1 or the cookie value used to acknowledge an alert.

ackmsg Empty or the acknowledgment message sent when the status was acknowledged. Newline, pipe-signs and backslashes are escaped with a backslash, C-style.

dismsg Empty or the message sent when the status was disabled. Newline, pipe-signs and backslashes are escaped with a backslash, C-style.

After the first line comes the full status log in plain text format.

xymondxlog HOSTNAME.TESTNAME
Retrieves an XML string containing the status log as with the "xymondlog" command.

xymondboard [CRITERIA] [fields=FIELDLIST]
Retrieves a summary of the status of all known tests available to the Xymon daemon.

By default - if no CRITERIA is provided - it returns one line for all status messages that are found in Xymon. You can filter the response by selection specific page, host, test, color or various other fields. The PAGEPATH, NETWORK, HOSTNAME, TESTNAME, and *MSG parameters are interpreted perl-compatible regular expressions; the COLOR parameter accepts multiple colors separated by commas; the *TIME values accept unix epoch timestamps. Other variables identified in xymon-xmh(5) may also be used.

Because host filtration is done before test filtration, it's more efficient (with very large data sets) to use PAGEPATH, HOSTNAME, NETWORK, and other XMH_ filters when possible, before globally filtering with COLOR, *MSG, *TIME, or TESTNAME.

You can filter on, for example, both a hostname and a testname.

page=PAGEPATH Include only tests from hosts found on the PAGEPATH page in the hosts.cfg file.

net=NETWORK Include only tests from hosts with this NET: tag

ip=IPAddress Include only tests from hosts with this IP address. This is a regex, not CIDR.

host=HOSTNAME Include only tests from the host HOSTNAME

test=TESTNAME Include only tests with the testname TESTNAME

color=COLORNAME Include only tests where the status color is COLORNAME

tag=TAGNAME Include only hosts with a certain tag specified in the hosts.cfg(5) line. Note that only items known to xymon components are included here; arbitrary text is not included

XMH_string=VALUE Include only hosts with a xymon-xmh(5) variable matching this value

Advanced Filtering

msg=MESSAGE Include only tests with full content matching MESSAGE. Use "\s" to escape spaces (or other PCRE strings)

ackmsg=MESSAGE Include only tests with acknowledgement(s) MESSAGE. Use "\s" to escape spaces (or other PCRE strings)

dismsg=MESSAGE Include only tests that have been disabled with strings matching MESSAGE. Use "\s" to escape spaces (or other PCRE strings). (It is most efficient to pair this with color=blue.)

Timestamp Filters

Certain fields (explained below) can be filtered with unix timestamps and with the following inequalities: >= > <= < = !=

These filters are: lastchange, logtime, validtime, acktime, disabletime

The response is one line for each status that matches the CRITERIA, or all statuses if no criteria is specified. The line is composed of a number of fields, separated by a pipe-sign. You can select which fields to retrieve by listing them in the FIELDLIST. The following fields are available:

hostname The name of the host

testname The name of the test

color Status color (green, yellow, red, blue, clear, purple)

flags For network tests, the flags indicating details about the test (used by xymongen).

lastchange Unix timestamp when the status color last changed.

logtime Unix timestamp when the log message was received.

validtime Unix timestamp when the log message is no longer valid (it goes purple at this time).

acktime Either -1 or Unix timestamp when an active acknowledgement expires.

disabletime Either -1 or Unix timestamp when the status is no longer disabled.

sender IP address where the status was received from.

cookie Either -1 or the cookie value used to acknowledge an alert.

line1 First line of status log.

ackmsg Empty (if no acknowledgement is active), or the text of the acknowledge message.

dismsg Empty (if the status is currently enabled), or the text of the disable message.

msg The full text of the current status message.

client Shows "Y" if there is client data available, "N" if not.

clntstamp Timestamp when the last client message was received, in Unix "epoch" format.

acklist List of the current acknowledgements for a test. This is a text string with multiple fields, delimited by a colon character. There are 5 fields: Timestamp for when the ack was generated and when it expires; the the "ack level"; the user who sent the ack; and the acknowledgement text.

flapinfo Tells if the status is flapping. 5 fields, delimited by "/": A "0" if the status is not flapping and "1" if it is flapping; timestamp when the latest status change was recorded and when the first statuschange was recorded; and the two colors that the status is flapping between.

stats Number of status-changes that have been recorded for this status since xymond was started.

modifiers Lists all active modifiers for this status (i.e. updates sent using a "modify" command).

XMH_* The XMH-tags refer to the Xymon hosts.cfg(5) configuration settings. A full list of these can be found in the xymon-xmh(5) man-page.

The ackmsg, dismsg and msg fields have certain characters encoded: Newline is "\n", TAB is "\t", carriage return is "\r", a pipe-sign is "\p", and a backslash is "\\".

If the "fields" parameter is omitted, a default set of hostname,testname,color,flags,lastchange,logtime,validtime,acktime,disabletime,sender,cookie,line1 is used.

xymondxboard
Retrieves an XML string with the summary of all status logs as for the "xymondboard" command.

hostinfo [CRITERIA]
Retrieves the current configuration of a host (i.e. the hosts.cfg(5) definition). CRITERIA selects which host(s) to report, and is identical to the CRITERIA in the xymondboard command.

The response is one line for each host that matches the CRITERIA, or all hosts if no criteria is specified. The line is composed of a number of fields, separated by a pipe-sign. The first two fields will always be the hostname and the IP-address. The remaining fields - if any - are the hosts.cfg tags in no particular order.

download FILENAME
Download a file from the Xymon serveraqs download directory.

client[/COLLECTORID] HOSTNAME.OSTYPE [HOSTCLASS]
Used to send a "client" message to the Xymon server. Client messages are generated by the Xymon client; when sent to the Xymon server they are matched against the rules in the analysis.cfg(5) configuration file, and status messages are generated for the client-side tests. The COLLECTORID is used when sending client-data that are additions to the standard client data. The data will be concatenated with the normal client data.

clientlog HOSTNAME [section=SECTIONNAME[,SECTIONNAME...]]
Retrieves the current raw client message last sent by HOSTNAME. The optional "section" filter is used to select specific sections of the client data.

ping
Attempts to contact the Xymon server. If successful, the Xymon server version ID is reported.

pullclient
This message is used when fetching client data via the "pull" mechanism implemented by xymonfetch(8) and msgcache(8) for clients that cannot connect directly to the Xymon server.

ghostlist
Report a list of ghost clients seen by the Xymon server. Ghosts are systems that report data to the Xymon server, but are not listed in the hosts.cfg file.

schedule [TIMESTAMP COMMAND]
Schedules a command sent to the Xymon server for execution at a later time. E.g. used to schedule disabling of a host or service at sometime in the future. COMMAND is a complete Xymon command such as the ones listed above. TIMESTAMP is the Unix epoch time when the command will be executed.
If no parameters are given, the currently scheduled tasks are listed in the response. The response is one line per scheduled command, with the job-id, the time when the command will be executed, the IP address from which this was sent, and the full command string.
To cancel a previously scheduled command, "schedule cancel JOBID" can be used. JOBID is a number provided as the first item in the output from the schedule list.

notes FILENAME
The message text will be stored in $XYMONHOME/notes/FILENAME which is then used as hyperlinks from hostnames or column names. This requires that the "storenotes" task is enabled in tasks.cfg (it is disabled by default). FILENAME cannot contain any directory path - these are stripped automatically.

usermsg ID
These messages will be relayed directly to modules listening on the "user" channel of the Xymon daemon. This is intended for custom communication between client-side modules and the Xymon server.

modify HOSTNAME.TESTNAME COLOR SOURCE CAUSE
Modify the color of a specific status, without generating a complete status message. This is for backend processors (e.g. RRD graphs) that can override the color of a status based on some criteria determined outside the normal flow of a status. E.g. the normal "conn" status may appear to be green since it merely checks on whether a host can be ping'ed or not; the RRD handler can then use a "modify" command to override this is the actual ping responsetime exceeds a given threshold. (See the "DS" configuration setting in analysis.cfg(5) for how to do this). SOURCE is some identification of the module that generates the "modify" message - future modifications must use the same source. There may be several sources that modify the same status (the most severe status then becomes the actual color of the status). CAUSE is a one-line text string explaining the reason for overriding the normal status color - it will be displayed on the status webpage.

 

EXAMPLE

Send a normal status message to the Xymon server, using the standard Xymon protocol on TCP port 1984:

   $ $XYMON $XYMSRV "status www,foo,com.http green `date` Web OK"

Send the same status message, but using HTTP protocol via the webserveraqs xymoncgimsg.cgi script:

   $ $XYMON http://bb.foo.com/cgi-bin/xymoncgimsg.cgi "status www,foo,com.http green `date` Web OK"

Use "query" message to determine the color of the "www" test, and restart Apache if it is red:


   $ WWW=`$XYMON $XYMSRV "query www,foo,com.www" | awk aq{print $1}aq`
   $ if [ "$WWW" = "red" ]; then /etc/init.d/apache restart; fi

Use "config" message to update a local mytest.cfg file (but only if we get a response):


   $ $XYMON $XYMSRV "config mytest.cfg" >/tmp/mytest.cfg.new
   $ if [ -s /tmp/mytest.cfg.new ]; then 
       mv /tmp/mytest.cfg.new $XYMONHOME/etc/mytest.cfg
     fi

Send a very large status message that has been built in the file "statusmsg.txt". Instead of providing it on the command-line, pass it via stdin to the xymon command:


   $ cat statusmsg.txt | $XYMON $XYMSRV "@"

 

SEE ALSO

combostatus(1), hosts.cfg(5), xymonserver.cfg(5), xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS AND PARAMETERS
XYMON MESSAGE SYNTAX
EXAMPLE
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/xymonnet-again.sh.1.html0000664000076400007640000000456313037531445023202 0ustar rpmbuildrpmbuild Manpage of XYMONNET\-AGAIN.SH

XYMONNET\-AGAIN.SH

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

xymonnet-again.sh - Xymon network re-test tool  

SYNOPSIS

xymonnet-again.sh

 

DESCRIPTION

xymonnet-again.sh is an extension script for Xymon that runs on the network test server. It picks up the failing network tests executed by the xymonnet(1) program, and repeats these tests with a faster test cycle than the normal xymonnet schedule. This means that when the server recovers and the network service becomes available again, this is detected quicker resulting in less reported downtime.

Only tests whose first failure occurred within 30 minutes are included in the tests that are run by xymonnet-again.sh. The 30 minute limit is there to avoid hosts that are down for longer periods of time to bog down xymonnet-again.sh. You can change this limit with the "--frequenttestlimit=SECONDS" when you run xyxmonnet.

 

INSTALLATION

This script runs by default from your tasks.cfg(5) file.

 

FILES

$XYMONTMP/TESTNAME.LOCATION.status
Temporary status file managed by xyxmonnet with status of tests that have currently failed.
$XYMONTMP/frequenttests.LOCATION
Temporary file managed by xymonnet with the hostnames that xymonnet-again.sh should test.

 

SEE ALSO

xymonnet(1), xymon(7), tasks.cfg(5)


 

Index

NAME
SYNOPSIS
DESCRIPTION
INSTALLATION
FILES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/reportlog.cgi.1.html0000664000076400007640000000623013037531445022402 0ustar rpmbuildrpmbuild Manpage of REPORTLOG.CGI

REPORTLOG.CGI

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

reportlog.cgi - CGI program to report service availability log  

SYNOPSIS

reportlog.cgi

 

DESCRIPTION

reportlog.cgi is invoked as a CGI script via the reportlog.sh CGI wrapper. Based on the parameters it receives, it generates an availability report for a specific host-service combination for the requested time-period. The availability report includes a calculation of the availability percentage (split out on percent green, yellow, red time), and an eventlog for the period listing the status changes that have occurred to allow for drill-down to the test reports that indicate a problem. Access to the individual historical status logs go via the svcstatus.cgi(1) CGI script.

reportlog.cgi is passed a QUERY_STRING environment variable with the following parameters:


   HOSTSVC (the host and service to report on)
   STYLE (report style: "crit", "non-crit", "all")
   ST (starttime in seconds since 1-1-1970 00:00 UTC)
   END (endtime in seconds since 1-1-1970 00:00 UTC)

The following non-standard parameters are handled by the Xymon version of history.cgi:


   IP (IP address of host - for display purposes only)
   REPORTTIME (the REPORTTIME: setting for this host)
   WARNPCT (the WARNPCT: setting for this host)

The REPORTTIME and WARNPCT options are taken from the hosts.cfg(5) definition for the host, or the defaults are used. These modify the availability calculation to handle reporting against agreed Service Level Agreements re. the time of day when the service must be available, and the agreed availability level.

 

OPTIONS

--env=FILENAME
Loads environment from FILENAME before executing the CGI.

 

SEE ALSO

hosts.cfg(5), xymonserver.cfg(5), svcstatus.cgi(1)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/history.cgi.1.html0000664000076400007640000001132213037531445022064 0ustar rpmbuildrpmbuild Manpage of HISTORY.CGI

HISTORY.CGI

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

history.cgi - CGI program to display service history  

SYNOPSIS

history.cgi

 

DESCRIPTION

history.cgi is invoked as a CGI script via the history.sh CGI wrapper. It is passed a QUERY_STRING environment variable with the following parameters:


   HISTFILE (a Xymon service history file)
   ENTRIES (the number of entries to show)
  The following non-standard parameters are handled by the Xymon version of history.cgi:


   IP (IP address of host - for display purposes only)
   PIXELS (width of colorbar when in pixel-mode)
   ENDTIME (when the colorbar begins, a time_t value)
   BARSUMS (which colorbars and summaries to show)

history.cgi analyses the service history file for changes that have occurred within the past 24 hours, and build a colorbar showing the status of the service over this period of time. A statistics summary is also produced, listing the amount of time for each status (green, yellow, red, purple, blue, clear).

Finally, a summary of the last N events is given, with links to the actual event logs.

Unlike the standard history.sh script, history.cgi provides a colorbar and statistics summaries also covering the past 1 week, 4 weeks and 1 year of data. Via links it is possible to browse the entire history of the service at the requested interval.

Note that since the resolution of the display is limited, events may be too short to show up on a colorbar; also, the exact placement of an event may not fully match up with the time-markers.

The graphs should correctly handle the display of months with different number of days, as well as the display of periods that involve beginning and end of Daylight Savings Time, if this occurs in your timezone.

All dates and times shown are in local time for the timezone defined on the Xymon server.

 

PARAMETERS

HISTFILE
Defines the host and service whose history is presented.
ENTRIES
The number of log-entries to show in the event log table. Default is 50; to view all log entries set this to "ALL".
IP
The IP-address of the host. This is only used for the title of the document.
PIXELS
The width of the colorbar graph in pixels. If this is set to 0, a percentage-based graph will be shown, similar to the one provided by the standard history.sh script. Pixel-based graphs can have a higher resolution, but do not resize automatically to suit the size of a browser window. The default value for this parameter is defined at compile-time; 960 is a good value for displays with a 1024x768 resolution.
BARSUMS
Defines which colorbars and summaries to show. This is a number made up from a bitmask. The 1-day graph uses the value "1"; the 1-week graph uses the value "2"; the 4-week graph uses the value "4" and the 1-year graph the value "8". To show multiple graph, add the values - e.g. "6" will show the 1-week and 4-weeks graphs, whereas "15" will show all the graphs. The default is defined at compile-time.
ENDTIME
The history display by default ends with the current time. Setting the ENDTIME parameter causes it to end at the time specified - this is given as a Unix "time_t" value, i.e. as the number of seconds elapsed since Jan 1 1970 00:00 UTC.

 

OPTIONS

--env=FILENAME
Load the environment from FILENAME before executing the CGI.

 

SEE ALSO

hosts.cfg(5), xymonserver.cfg(5)


 

Index

NAME
SYNOPSIS
DESCRIPTION
PARAMETERS
OPTIONS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/svcstatus.cgi.1.html0000664000076400007640000001224413037531445022426 0ustar rpmbuildrpmbuild Manpage of SVCSTATUS.CGI

SVCSTATUS.CGI

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

svcstatus.cgi - CGI program to view Xymon status logs  

SYNOPSIS

svcstatus.cgi [--historical] [--history={top|bottom}]

 

DESCRIPTION

svcstatus.cgi is a CGI program to present a Xymon status log in HTML form (ie, as a web page). It can be used both for the logs showing the current status, and for historical logs from the "histlogs" directory. It is normally invoked as a CGI program, and therefore receives most of the input parameters via the CGI QUERY_STRING environment variable.

Unless the "--historical" option is present, the current status log is used. This assumes a QUERY_STRING environment variable of the form

   HOSTSVC=hostname.servicename
where "hostname" is the name of the host with commas instead of dots, and "servicename" is the name of the service (the column name in Xymon). Such links are automatically generated by the xymongen(1) tool when the environment contains "XYMONLOGSTATUS=dynamic".

With the "--historical" option present, a historical logfile is used. This assumes a QUERY_STRING environment variable of the form

   HOST=hostname&SERVICE=servicename&TIMEBUF=timestamp
where "hostname" is the name of the host with commas instead of dots, "servicename" is the name of the service, and "timestamp" is the time of the log. This is automatically generated by the history.cgi(1) tool.

 

OPTIONS

--historical
Use a historical logfile instead of the current logfile.

--history={top|bottom|none}
When showing the current logfile, provide a "HISTORY" button at the top or the bottom of the webpage, or not at all. The default is to put the HISTORY button at the bottom of the page.

--env=FILENAME
Load the environment from FILENAME before executing the CGI.

--templates=DIRECTORY
Where to look for the HTML header- and footer-templates used when generating the webpages. Default: $XYMONHOME/web/

--no-svcid
Do not include the HTML tags to identify the hostname/service on the generated web page. Useful is this already happens in the hostsvc_header template file, for instance.

--multigraphs=TEST1[,TEST2]
This causes svcstatus.cgi to generate links to service graphs that are split up into multiple images, with at most 5 graphs per image. This option only works in Xymon mode. If not specified, only the "disk" status is split up this way.

--no-disable
By default, the info-column page includes a form allowing users to disable and re-enable tests. If your setup uses the default separation of administration tools into a separate, password- protected area, then use of the disable- and enable-functions requires access to the administration tools. If you prefer to do this only via the dedicated administration page, this option will remove the disable-function from the info page.

--no-jsvalidation
The disable-function on the info-column page by default uses JavaScript to validate the form before submitting the input to the Xymon server. However, some browsers cannot handle the Javascript code correctly so the form does not work. This option disables the use of Javascript for form-validation, allowing these browsers to use the disable-function.

--nkconfig=FILENAME
Use FILENAME as the configuration file for the Critical Systems information. The default is to load this from $XYMONHOME/etc/critical.cfg

 

FILES

$XYMONHOME/web/hostsvc_header
HTML template header

$XYMONHOME/web/hostsvc_footer
HTML template footer

 

ENVIRONMENT

NONHISTS=info,trends,graphs
A comma-separated list of services that does not have meaningful history, e.g. the "info" and "trends" columns. Services listed here do not get a "History" button.

TEST2RRD=test,test
A comma-separated list of the tests that have an RRD graph.

 

SEE ALSO

xymon(7), xymond(1)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
FILES
ENVIRONMENT
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/criticaleditor.cgi.1.html0000664000076400007640000000450713037531445023373 0ustar rpmbuildrpmbuild Manpage of CRITICALEDITOR.CGI

CRITICALEDITOR.CGI

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

criticaleditor.cgi - Xymon Critical Systems View Editor CGI  

SYNOPSIS

criticaleditor.cgi

 

DESCRIPTION

criticaleditor.cgi is invoked as a CGI script via the criticaleditor.sh CGI wrapper.

criticaleditor.cgi is a web-based editor for the critical.cfg(5) file, which is used to configure the Xymon "Critical Systems" view.

A detailed description of how to use the editor is provided in the Xymon Web documentation, available from the "Help" -> "Critical Systems" link on the Xymon website.

 

SECURITY

Access to this CGI script should be restricted through access controls in your webserver. Editing the Critical Systems View configuration will impact the monitoring of your site.

 

OPTIONS

--config=FILENAME
Name of the Critical Systems View configuration file. The default is critical.cfg in the $XYMONHOME/etc/ directory.

--env=FILENAME
Loads the environment defined in FILENAME before executing the CGI script.

--area=NAME
Load environment variables for a specific area. NB: if used, this option must appear before any --env=FILENAME option.

--debug
Enables debugging output.

 

SEE ALSO

criticalview.cgi(1), critical.cfg(5), xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
SECURITY
OPTIONS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/eventlog.cgi.1.html0000664000076400007640000000334713037531445022216 0ustar rpmbuildrpmbuild Manpage of EVENTLOG.CGI

EVENTLOG.CGI

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

eventlog.cgi - CGI program to report the Xymon eventlog  

SYNOPSIS

eventlog.cgi

 

DESCRIPTION

eventlog.cgi is invoked as a CGI script via the eventlog.sh CGI wrapper. Based on the parameters it receives, it generates the Xymon event log for a period. This log shows all status changes that have occurred for all hosts and services.

eventlog.cgi is passed a QUERY_STRING environment variable with the following parameters:


   MAXTIME (maximum minutes to go back in the log)
   MAXCOUNT (maximum number of events to report)

 

OPTIONS

--env=FILENAME
Loads the environment defined in FILENAME before executing the CGI script.

 

SEE ALSO

hosts.cfg(5), xymonserver.cfg(5)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/criticalview.cgi.1.html0000664000076400007640000000675613037531445023067 0ustar rpmbuildrpmbuild Manpage of CRITICALVIEW.CGI

CRITICALVIEW.CGI

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

criticalview.cgi - Xymon Critical Systems view CGI  

SYNOPSIS

criticalview.cgi

 

DESCRIPTION

criticalview.cgi is invoked as a CGI script via the criticalview.sh CGI wrapper.

criticalview.cgi matches the current critical statuses against the critical.cfg(5) file, and generates the "Critical Systems" view.

 

RELATION TO OLD CRITICAL PAGE

This view is a replacement for the statically generated "critical" page provided in versions of Xymon prior to version 4.2. Although the "critical" pages are supported throughout Xymon 4.x, it is recommended that You switch to the newer Critical Systems view provided by this CGI.

 

OPTIONS

--acklevel=NUMBER
Sets the acknowledgment level for acknowledgments sent via the ackinfo.cgi(1) page. Note that this may be overridden by the configuration of the ackinfo.cgi utility.

--tooltips
Hide the host description in a "tooltip", i.e. it will be shown when your mouse hovers over the hostname on the webpage. This saves space on the display so there is more room for the status columns.

--hffile=PREFIX
Define the header/footer files used when building the webpage. The actual files used will be PREFIX_header and PREFIX_footer found in the ~xymon/server/web/ directory. Default: critical.

--env=FILENAME
Loads the environment defined in FILENAME before executing the CGI script.

--area=NAME
Load environment variables for a specific area. NB: if used, this option must appear before any --env=FILENAME option.

--debug
Enables debugging output.

--config=FILENAME
Use FILENAME as the configuration file for the Critical Systems information. The default is to load this from $XYMONHOME/etc/critical.cfg

--config=ID:FILENAME
Allows the use of multiple Critical Systems configuration files on a single webpage. "ID" is a text that will be shown on the web page prior to the critical systems from FILENAME. This option can be repeated to include critical systems from multiple configurations.

 

ENVIRONMENT VARIABLES

XYMONHOME
Used to locate the template files for the generated web pages.

QUERY_STRING
Contains the parameters for the CGI script.

 

SEE ALSO

ackinfo.cgi(1), xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
RELATION TO OLD CRITICAL PAGE
OPTIONS
ENVIRONMENT VARIABLES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/xymongrep.1.html0000664000076400007640000001456013037531445021661 0ustar rpmbuildrpmbuild Manpage of XYMONGREP

XYMONGREP

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

xymongrep - pick out lines in hosts.cfg  

SYNOPSIS

xymongrep --help
xymongrep --version
xymongrep [--noextras] [--test-untagged] [--web] [--net] [--loadhostsfromxymond] TAG [TAG...]

 

DESCRIPTION

xymongrep(1) is for use by extension scripts that need to pick out the entries in a hosts.cfg file that are relevant to the script.

The utility accepts test names as parameters, and will then parse the hosts.cfg file and print out the host entries that have at least one of the wanted tests specified. Tags may be given with a trailing asterisk '*', e.g. "xymongrep http*" is needed to find all http and https tags.

The xymongrep utility supports the use of "include" directives inside the hosts.cfg file, and will find matching tags in all included files.

If the DOWNTIME or SLA tags are used in the hosts.cfg(5) file, these are interpreted relative to the current time. xymongrep then outputs a "INSIDESLA" or "OUTSIDESLA" tag for easier use by scripts that want to check if the current time is inside or outside the expected uptime window.

 

OPTIONS

--noextras
Remove the "testip", "dialup", "INSIDESLA" and "OUTSIDESLA" tags from the output.

--test-untagged
When using the XYMONNETWORK environment variable to test only hosts on a particular network segment, xymonnet will ignore hosts that do not have any "NET:x" tag. So only hosts that have a NET:$XYMONNETWORK tag will be tested.
With this option, hosts with no NET: tag are included in the test, so that all hosts that either have a matching NET: tag, or no NET: tag at all are tested.

--no-down[=TESTNAME]
xymongrep will query the Xymon server for the current status of the "conn" test, and if TESTNAME is specified also for the current state of the specified test. If the status of the "conn" test for a host is non-green, or the status of the TESTNAME test is disabled, then this host is ignored and will not be included in the output. This can be used to ignore hosts that are down, or hosts where the custom test is disabled.

--web
Search the hosts.cfg file following include statements as a Xymon web-server would.

--net
Search the hosts.cfg file following include statements as when running xymonnet.

--loadhostsfromxymond
xymongrep will normally attempt to load the HOSTSCFG file by itself when searching for lines to transmit. If the file is unreadable, it will exit out. With this option, it will query the xymond server (set via the XYMONSERVER environment) for the hosts file. This can be used if you're running this on a client or remote system and can't or don't want to have the hosts.cfg file synchronized across your servers.

 

EXAMPLE

If your hosts.cfg file looks like this


   192.168.1.1   www.test.com  # ftp telnet !oracle
   192.168.1.2   db1.test.com  # oracle
   192.168.1.3   mail.test.com # smtp

and you have a custom Xymon extension script that performs the "oracle" test, then running "xymongrep oracle" would yield


   192.168.1.1   www.test.com  # !oracle
   192.168.1.2   db1.test.com  # oracle

so the script can quickly find the hosts that are of interest.

Note that the reverse-test modifier - "!oracle" - is included in the output; this also applies to the other test modifiers defined by Xymon (the dial-up and always-true modifiers).

If your extension scripts use more than one tag, just list all of the interesting tags on the command line.

xymongrep also supports the "NET:location" tag used by xymonnet, so if your script performs network checks then it will see only the hosts that are relevant for the test location that the script currently executes on.

 

USE IN EXTENSION SCRIPTS

To integrate xymongrep into an existing script, look for the line in the script that grep's in the $HOSTSCFG file. Typically it will look somewhat like this:


   $GREP -i "^[0-9].*#.*TESTNAME" $HOSTSCFG | ... code to handle test

Instead of the grep, we will use xymongrep. It then becomes


   $XYMONHOME/bin/xymongrep TESTNAME | ... code to handle test

which is simpler, less error-prone and more efficient.

 

ENVIRONMENT VARIABLES

XYMONNETWORK
If set, xymongrep outputs only lines from hosts.cfg that have a matching NET:$XYMONNETWORK setting.

HOSTSCFG
Filename for the Xymon hosts.cfg(5) file.

 

FILES

$HOSTSCFG
The Xymon hosts.cfg file

 

SEE ALSO

hosts.cfg(5), xymonserver.cfg(5)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
EXAMPLE
USE IN EXTENSION SCRIPTS
ENVIRONMENT VARIABLES
FILES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/xymoncfg.1.html0000664000076400007640000000465313037531445021465 0ustar rpmbuildrpmbuild Manpage of XYMONCFG

XYMONCFG

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

xymoncfg - output the full hosts.cfg file  

SYNOPSIS

xymoncfg [--web] [--net] [filename]

 

DESCRIPTION

xymoncfg(1) dumps the full hosts.cfg file to stdout. It follows "include" tags in the hosts.cfg files, and prints the full contents as seen by the xymongen(1) and xymonnet(1) utilities.

If no filename is given, xymoncfg displays the file pointed to by the HOSTSCFG environment variable.

 

OPTIONS

--web
Show the hosts.cfg file following include statements as a Xymon web-server would.

--net
Show the hosts.cfg file following include statements as done when running xymonnet.

-s
Output only the lines that look like environment variable definitions, in a format suitable for use with Bourne-style shells (e.g. bash, ksh). You will probably not use this with the default hosts.cfg input file, but e.g. xymonserver.cfg. To define all the variables in xymonserver.cfg inside your shell script, you can use


   eval `xymoncfg -s /etc/xymon/xymonserver.cfg`

-c
Similar to "-s", but for C-shell.

 

ENVIRONMENT VARIABLES

HOSTSCFG
Filename for the hosts.cfg(5) file.

 

SEE ALSO

hosts.cfg(5), xymonserver.cfg(5)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
ENVIRONMENT VARIABLES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/combostatus.1.html0000664000076400007640000000573213037531445022175 0ustar rpmbuildrpmbuild Manpage of COMBOSTATUS

COMBOSTATUS

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

combostatus - Xymon combination test tool  

SYNOPSIS

combostatus --help
combostatus --version
combostatus [--debug] [--quiet]

 

DESCRIPTION

combostatus is a Xymon extension script that runs on the Xymon server. It combines the results of one or more of the normal Xymon test results into a combined test result, using standard arithmetic og logical operators.

The resulting tests are sent to the Xymon display server as any normal test - so all of the standard Xymon functions (history, statistics etc.) are available for the combined tests.

The tool was born from the need to monitor systems with built-in redundancy and automatic failover - e.g. load-balanced web servers. But other uses are possible.

 

OPTIONS

--error-colors=COLOR[,COLOR]
Specify which colors trigger an error status. By default only a "red" status counts as an error color - all other colors, including yellow, will count as "green" when evaluating the combined status. COLOR is "red", "yellow", "blue", "purple" or "clear".

--quiet
Normally, the test status sent by combostatus includes information about the underlying test results used to determine the current value of the combined test. "--quiet" eliminates this information from the test status page.

--debug
Provide debugging output for use in troubleshooting problems with combostatus.

--no-update
Don't send any status messages - instead, the result of the combotests is simply dumped to stdout. Useful for debugging.

 

FILES

$XYMONHOME/etc/combo.cfg
Configuration file for combostatus, where the combined tests are defined
$XYMONHOME/etc/tasks.cfg
Configuration file controlling when combostatus is run.

 

SEE ALSO

combo.cfg(5), hosts.cfg(5), xymonserver.cfg(5), tasks.cfg(5)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
FILES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/manpages/man1/ackinfo.cgi.1.html0000664000076400007640000000546113037531445022004 0ustar rpmbuildrpmbuild Manpage of ACKINFO.CGI

ACKINFO.CGI

Section: User Commands (1)
Updated: Version 4.3.28: 17 Jan 2017
Index Return to Main Contents
 

NAME

ackinfo.cgi - Xymon CGI script to acknowledge alerts  

SYNOPSIS

ackinfo.cgi

 

DESCRIPTION

ackinfo.cgi is invoked as a CGI script via the ackinfo.sh CGI wrapper.

ackinfo.cgi is used to acknowledge an alert on the Xymon "Critical Systems" view, generated by the criticalview.cgi(1) utility. This allows the staff viewing the Critical Systems view to acknowledge alerts with a "Level 1" alert, thereby removing the alert from the Critical Systems view.

Note that the Level 1 alert generated by the ackinfo.cgi utility does NOT stop alerts from being sent.

In a future version of Xymon (after Xymon 4.2), this utility will also be used for acknowledging alerts at other levels.

 

OPTIONS

--level=NUMBER
Sets the acknowledgment level. This is typically used to force a specific level of the acknowledgment, e.g. a level 1 acknowledge when called from the Critical Systems view.

--validity=TIME
Sets the validity of the acknowledgment. By default this is taken from the CGI parameters supplied by the user.

--sender=STRING
Logs STRING as the sender of the acknowledgment. By default, this is taken from the loginname of the webuser sending the acknowledgment.

--env=FILENAME
Loads the environment defined in FILENAME before executing the CGI script.

--area=NAME
Load environment variables for a specific area. NB: if used, this option must appear before any --env=FILENAME option.

--debug
Enables debugging output.

 

ENVIRONMENT VARIABLES

XYMONHOME
Used to locate the template files for the generated web pages.

QUERY_STRING
Contains the parameters for the CGI script.

 

SEE ALSO

criticalview.cgi(1), xymon(7)


 

Index

NAME
SYNOPSIS
DESCRIPTION
OPTIONS
ENVIRONMENT VARIABLES
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 00:13:25 GMT, January 18, 2017 xymon-4.3.28/docs/clonewarn.jpg0000664000076400007640000001046511070452713016642 0ustar rpmbuildrpmbuildÿØÿàJFIFHHÿÛC  !"$"$ÿÛCÿÀqƒ"ÿÄÿÄ6!"123#AQBaq$7S‘’u“±´ÿÄÿÄ$!Að1BQq‘ñÿÚ ?þ©"ÉÈDŒù2ó¦•{lÉ 4£c¤ì¢*MŸ‚³+?ƪé¢3Tàˆ™ôJ#²²ŒÙ‰o¸JQ$¼%%jQŸ‚IêffDEû˜„ŒÇÅdâð¼Ô”«7›ioºÁ!JK–J#NäTDIA¥&uz_Ìĸ$Srÿ¢5EÇ®’_£’+ÿHIÿÉEú¤g9>)Ù~®ñÎB†=°±òÒ¥Õ’UhJHÿ©“«¯ìcã·½Ò‰»6³Å1?±GõÛfÍXÊç§£:ö"ZÍr"\?›­ŸÐ¿û—Ïö22ý¦Î¸þíåµ?ŒÔ”——?+Oõ2­‹û(‹êÑÝCì¡æ”JBÈŒŒæCÕØwJw 6}Ôñ-Z›3j¯·±†á_ļŠåÎò‡â³‘Cs‹n×JKjQ§´ÜÐÈD²-¬õ¯r2øþÞ:kgä9ظÖßïN)·šøbVÛjFmö’/ù ÂMxªð=Ç;7ijÓñø¶°Ø\S9,¤üÞ}ô6ü³ŽËl³“x–µ,³úm$D“³WèDf,Ï2“ÞÂCÁñ–äÎÉGž·›—èD7!¾Ó¡jKk5cŠI)$Ix£3MƒÜD€Ëeq³#L›)™±–×r~-õ<ót¶ÔƒA©EDi3-æÊÄÌ'Åâ%âäÃ\­ñ°åEo±ÂWoĺӮ¸á™Z–kd•vEîW%U|·ªàañHcÈä_˜Á³•Ë¢fWÓeò7Í*Ú—D’J ÔGtDGSqÞ ¹œÅ`Ýã8˜ÙÙtJq-9&ã´ˆÎO«¹^é'„¤Ò“Ûb?,\áS”ÀÊe1Ó#Ë›)™ÑÖßr[êyæéhRƒR‹Ú¤ŸÐŸÔ¬}'qåFÇsù¸ù,i5“C­ªJ’鑸•nÚ›4¨É>Ý(µNµD£/=#„.DˆÊŠó¹¬ºÜaJ%J<”“4™—ƒ2?_°Ñàs˜NA s09Œ~V26”ô)(} Y¤Ôƒ2#£#¯ê_¸øpþ?‹à[ÃB‘.C(}÷û%8KuJy庻UûœWõª³3ò-Äž?Î]ËsY|| cã¦4‡™RÉ‘N"lÌ»Ž1 ¿)FEª’µY)'DFuCèï$ÌEá^žã2˜bãòx¨Ñ ËDîÇTãpÍÒ7Љ RY‘’Ô"2#?ñ&UÉãg%f²ó> ÷dC†û›1œq B&H' µZˆ’¥©$GàŠŠ½ãøŽ6+Šãš~Zšã|©iÙÍ"¹»=¾}ލükî"ý<½@Êɉ \Y%4ÃÎ`–™ö䥥•¾ÚG_åv6Ú”FFåW’#ð=»êv%Æe–63’䵇.3f½%rT’CDª:27cÙÑÑ<E–‚ã±R[ÉådÅÆïød  ãÁÜ'ת gIR’[©Z¤ÌŠ„\w¦\jqdÁͼnEÉí#5©uM/Ç–Ñ£:§Á—C^NŽÜPùžMs!bpq3dÍ‘š39™u¥ |âaJR͵«U›–II#Ú‚-JÓ*?8Èd"b˜ÄñöÞÌÎ\Ô»Lî¦cüÝ ÝJj"pÒ”Ò=Ûû|‹|7Æâ²±ò1ß–§cþ#¡8´šOã¥"K·I/’ÐDŸÙ7{‘IÉ8™ã±‘d`Ï;>4ù’Pî:LdIJe¼·žA|Au)µ'Ú¯$II‘š“ä/ø&}îKÇ•‘V5Ȫtœ6Ôć;Q™›wãåugVyO¨¼žv+dƒ°Û<™,rK0JZ\S |‰Òê"C}m¸­’kU$½„gCIéfgá1“ö)]Òdº•½Ú¤ò{U/ùÔ]”jýLŒÇÛÄq°q\WÓòÔ×ÓàKNÎiÈÅÙíóìuGã_qéàÂ¥|âcœ™Øœl†/ P&¢V] BeFÒK‡!H#ÐÐë&Í[*µ¢3*Äz­î ¼ÔX˜©3•ü.C­e‰xæWÔNöªZ[?ÊÔÒ[idµLˆìh2üv\„ä20åÈË#,‰ )³TyŠˆÄh%¡I4õ£ä´«ÊŒÿjóá{0ù?!j\üdŸÜÒŸ7zPÉ•)³lÐil½¦ƒ"?‘$‰ÂªXå<®6âÑàÁ«‘ÄÌ•(‘–ìIõÈŒŽÖÖ†¹%Z ÐKíVÚ ã+ÕÜGñ़9°YbÄO0ÙOïìêØ¢k·_g·m¶¯vºùøþ ¬+˜ì¦R+Ø¥H§P¦”©Iò^}’›2ÕkBLô$)¤Hgˆ·.¹³¹¨pÜ”sƲëeÇ[©Vh7”«R’•’LÌ켑ã†r,¿!•=×pqàâãM™ ¹8Üu÷#É[;dÙ ôQÙ®Èʵ2÷R9¬ØùnNoakÆT¯È*iö)% ¹'ÖÉ6{vL”´•Q‘™ÚKIÇñ°‡n­·&I–f鑞ï¾ãë/^ N(‹úY™ùÛã˜ÂN}·¹,çÞ7g2é‘ î;QÍDFI42Ÿš¼üˆŠÆq¿WqÉ|jðä˜X—²êü+0Þ@ÐÃZö%ÒBSÖálŸo¹'gJ:1z÷(Îc¸ä¬¶wŒ"„¨í O)÷pšm¥¡$Ú÷Zþ¤–ÖJ:1'Ä[f4¨y,îk7DEÃøYî¶m¥•‘“ìBT³2*Ùf¥Uùòwá®XxlŽw7”Žù4M.SèìÔ­›6Ô„'Ü•+ul£4¦ÌèVGžeqp2MdxËeš‚þ9 6C±§Û›$˜ihuM§ÎÄå’^Qó£±.W(äÍÏ,L~-^V<2e¼©“L´·CImjdÇÔ³ÔÒ„‘¤ÈÕò3û3Á`ôHøü¶W%2LÈRž›%mw+áKÌ·HBP”’vD’3Ý^lìJä\MŒ¾P²Meò¸™Jð’Ô'âX³Q6½Ðª£RÌ”T[*”V/£_å ÿ Aÿç@Ö þ3ˆÇøÞ3 n¹ ¨Œ©Ó#ZÚ 5]a`" “rCXÙ.Ãl’†”¦̲#¢ÿq ª3"q*Èœ“ŒA‚Ô&gJÕ¢£5ã¤ì¥Ú”ªn¬ÔfgýLÅ.J_™É!æÿˆs-.+Jl¢·Zc9µùZ:¼™_ÏúìCUÔßúhÿ`êký4ćÎ\é«UÌÌ×<ùòë\Ço?È0¤á-¼‹¤¤‘þ+Áÿâø‹í©ScDJÿiÛŠjmH¤HÍ$J"2$¨Ô’²#¢!yÔ×úhÿ‰IJSô¤‹ûÛµôý­¶ìÜ·\óÙ/j¦í8˜~€÷Ü žW,ˆ™×1qøô©zT·›I¥¦Ò§I²µ­Ä’”EºÍ(ØÉ-‘›Jâ±”çVü2s[é¶ï3ù{u]Ôƒú{WuaÊ»o²á€Ac;)έødæ·ÓmÞgòö껩ôö®êþÕvßaŒì§:·á“šßM·yŸËÛªî¤ÓÚ»«ûUÛ}…NŒì§:·á“šßM·yŸËÛªî¤ÓÚ»«ûUÛ}†3²œê߆Nk}6Ýæ/n«ºOjî¯ì9WmöàXÎÊs«~9­ôÛw™ü½º®êAý=«º¿°å]·Øc;)έødæ·ÓmÞgòö껩ôö®êþÕvß`NŒì§:·á“šßM·yŸËÛªî¤ÓÚ»«ûUÛ}†3²œê߆Nk}6Ýæ/n«ºOjî¯ì9Wmöàî#ʤr.s˜e²m¬[x\TÈŒ!H^ªrTµˆRÉfd†ÊÒµ#ÚFŸ™™ìDö«Ô ÓÝ5¼Xéìê­©Ù'®ýeuµ×bëkѽ¶vp‚ûUêiîšÞ,töuVÔì“×~²ºÚë±uµèÞÛ;8Y@V[;•ÏIåÆøÚ±±ž fKžÂßChqkCHKhZ F£iÓ35$’^üPd}G{ ñQ#:Î}x|©²•¸•À»%£`¾­œÿD“ØífŸ'JLÿÉ?F{æÅä¾¢?ñ0ÎK´J5 ”‚Z²MKÔÉEõªÈüUcžÂ—YyiÊ)9W²y3‘&™Ër#ÑÝ!)Kˆ×ê¢h‹ÉžÂ¢ÿ‹HÏLˆìÌìHÐ;—´hhµ:Ãuà^Æ•,þfI"$ü­U±Ü n)ˆ›ƒ†î=ü»¹(h_ø/ˆA›ìµ_mnl}µú(È•Uf£òw"(9¥÷ó¼ÓÝÝÝœg®ÎÞÍí2ÏmûÚþwØåü÷_Ô}8sJïçy§»»»8Î]½›ÚežÛö;µüï±Ëùúp² ç™x¾¤ä3ÎæKŒðæ$®“»\’sjSitB4FI8IQlUKq4Iqd¨Œb½Mg«LG>­5ß—åzõUÛ'·ØEÝín]ö¹¿NG1cêk=Zb8áõi®ü¿(«×ª®Ù=¾Â.ïkrïµÍÌb½Mg«LG>­5ß—åzõUÛ'·ØEÝín]ö¹¿N1cêk=Zb8áõi®ü¿(«×ª®Ù=¾Â.ïkrïµÍÌb½Mg«LG>­5ß—åzõUÛ'·ØEÝín]ö¹¿NÅŒW©¬õiˆã‡Õ¦»òü¢¯^ª»döû»½­Ë¾×71Šõ5ž­1pú´×~_”UëÕWlžßawµ¹wÚæý8s1^¦³Õ¦#ŽVšïËòнzªí“Ûì"îö·.û\ÜÆ+ÔÖz´ÄqÃêÓ]ù~QW¯U]²{}„]ÞÖåßk›ôà„ôãŽò\o$ÌæyX¶>.QÛ‡‘~bª9¿jqÇ›JŒÌO“5™™ù°ÿÙxymon-4.3.28/docs/criticalsystems.html0000664000076400007640000002624411535462534020272 0ustar rpmbuildrpmbuild Critical Systems

Critical Systems

If you are monitoring lots of hosts, getting an overview of which hosts need attention can be difficult. Most likely you've split the hosts among several pages, and the "All non-green" view is just cramped full with systems where a logfile is showing some errors, a filesystem needs cleaning up etc.

The "Critical Systems" view lets you define exactly which tests on what hosts need attention. In other words, this is the view your Operations Center will be using to decide whether to call out people in the middle of the night. It might look like this:

This document describes how you configure the Critical Systems view, and how it works for your operators. By "operators" I mean the people who are doing the 24x7 monitoring. Where I work, these people normally do not resolve the issues - they just raise the trouble-tickets and assign them to the "engineer" on duty. It may be different in your organization.

The Critical Systems editor

To configure what goes on the Critical Systems view, you use a dedicated editor.

The default Xymon setup has nothing on the critical systems view. So to use it, you must configure some of your systems and tests to be included on this view. From the Administration menu, pick the Edit Critical Systems item. This is usually in the password-protected area of Xymon, so you will need to authenticate yourself before you are allowed access. If you haven't set this up yet, look at the installation guide to see how you do that.

After authenticating, you are presented with the editor page.

The editor form

Let me explain what the various fields are for:
  • The Host and Test fields are text entry fields. This is where you enter the name of the host and test you want to configure. If you would rather not type too much, you can enter just the beginning of the hostname and use the Search and Next buttons to walk through the currently configured tests.
  • The Priority field defines how important this test is. By default you have three priorities: 1, 2 and 3. Priority 3 is the lowest - things you must fix, but it can wait until you've had lunch or finished the department meeting. Priority 2 is for more important things, like one of your RAID systems running in degraded mode. Priority 1 is the highest priority - the kind of problem where you want to get a phonecall at 3 AM in the morning.
  • Then there is a group of time-related settings. The Monitoring time defines when this test should show up on the Critical Systems view. By default, that will be 24 hours a day, 7 days a week. But you probably have some systems that don't need attention during week-ends, or perhaps you only want to support a server during normal work-hours. Then you can use this setting to make sure it will only show up on the Critical Systems view during those periods. If you are migrating from the old "NK" settings in the hosts.cfg file, this is the equivalent of the "NKTIME" setting.
    The Start monitoring and Stop monitoring settings are used if you have systems that go into production at a certain date, or which are de-commisioned at a certain date. Instead of having to update your Critical Systems configuration exactly when that happens, you can configure the dates when monitoring of the systems should begin or end.
  • The Resolver group is a text field. You can use it for your operations people to see which group of engineers the should call about this problem. If you have multiple groups handling different parts of your IT systems, use this to let the operations staff know whether to call the Unix admins, the DBA's or one of your Webmasters.
  • The Instruction is a text entry field, where you can place a brief instruction to the operators handling the problem: If there is a simple thing that the operations people can try to fix the problem before calling the on-duty engineer, then you can place instructions here - e.g. perhaps the issue is with an external partner, so they just need to call them and let them know there is an issue. You can use HTML tags in this field, so if it's a long story then just put in an HTML link to another document.
  • The Clone fields at the bottom of the form (not visible in the screenshot) are described later

Setting up a disk status

Right now, there is a yellow disk status on my system.

But it is not on the Critical Systems view, and I want it to be. It is a priority 3 event, and I only want it monitored between 7AM and 8PM on weekdays. Most likely it is just some logfiles that are filling up, so the operators can try and clean out the /var/log/ directory - if that doesn't solve the problem, then they must escalate it to the Unix admins.

So on the Critical Systems editor, I enter the hostname localhost and the test disk, then hit the Search button. I get this warning:


telling me that there is nothing configured yet for this host+test combination. If there had been any previous configuration, it would have shown up on the form.

So I fill out the fields of the form and hit the Update button. The form changes to look like this: As you can see, there is now a Last update text showing who has changed this configuration, and when it was last done.

If I now go back to the Critical Systems view - from the menu, pick Views and Critical Systems view - you will see that the status is now showing up:

Template definitions - cloning records

If you have many hosts that share a common setup on the Critical Systems view, then editing all of them can be tiresome. Instead, you should define a template and then clone it to all of the hosts.

NOTE: A cloned definition is not a copy of the original definition. It is in fact a pointer back to the original definition, so if you change the original definition after you performed the cloning, then the clone definition will also change.

Defining a template is just like defining the Critical Systems view for a host. Just call the host something that looks like a template - "Standard Unix", for instance. So here is a definition for a Unix cpu template.

Now we have created the template (if you haven't pushed the Update button to save the template, do it now). To apply this template to a host, scroll down to the bottom of the editor form, and enter the hostname that you want to apply the template to, then hit the Add/remove clones button:

After it has updated, you can see that "localhost" is now listed in the scrollbox showing the clones.

NOTE: Cloning happens at the host level, so even though we did the cloning from a cpu test definition, it will also affect all the other definitions we have for the Standard Unix host.

The Critical Systems view

The critical systems view lets the operators filter active alerts in several ways. It might look like this:

Filtering the Critical Systems view

The drop-down boxes lets the operators filter the alerts that show up on the page.

  • The Priority limits alerts so that only those with a matching priority get displayed.
  • The Color removes those alerts that have an unwanted color
  • The Age limit can be used to only see the most recent events.
  • The Acked selection can be used to toggle the view of events that have been acknowledged by the operators.

Tip: If you have a preferred default setting for these, then you can bookmark it in your browser - the settings are part of the URL, so your bookmark will include the current settings.

The detailed status view

When looking at the status of one of the items shown on the Critical Systems view, a number of additional items show up. On the example Critical Systems view above, you will notice that the instructions we entered about what to do with the disk status is shown here, so they are available to the operators. There are links to the host documentation and host information. There is also an acknowledge function, so that the operators can acknowledge an alert right away.

Critical Systems acknowledgment

From the detailed status view, the operator can acknowledge an alert, after he has assigned the problem to an engineer or has handled it in some other way. This serves two purposes: First, it removes the status from the Critical Systems view, so the operator can concentrate on the new problems that appear. And second, it lets everyone else see that the problem has been noticed and is being handled by someone.

When acknowledging an alert, the operator can add information about what the problem is, or who is handling it, and when it is expected to be resolved. E.g. like this:

The Host-ack checkbox lets the operator acknowledge all current alerts for a given host, e.g. a full disk could easily trigger alerts for both the disk-, msgs- and procs-statuses - a Host ack lets him handle all of those.

After the operator has acknowledged the status, the acknowledgment will be visible on the Critical systems status view:

(If you are wondering why this image says it is a "Level 1" acknowledgement, then the answer is that a future release of Xymon will allow multiple acknowledgments by different groups. Level 1 is the operator who sees the alert on the Critical Systems view. Level 2 could be the engineer who gets paged by a Xymon alert going out).

How acknowledgements are visible to everyone

The acknowledgments that the operator enters from the status page will show up on the status visible to everyone. E.g. here is how the overview page will appear to a normal user: Note that the "disk" status has a yellow checkmark, indicating that it has been acknowledged:

And the detailed status page also includes the acknowledgment information:

xymon-4.3.28/docs/howtograph.html0000664000076400007640000003302311535462534017223 0ustar rpmbuildrpmbuild How to setup custom graphs

How to setup custom graphs

This document walks you through the setup of custom graphs in your Xymon installation. Although Xymon comes with pre-defined setups for a lot of common types of graphs, it is also extensible allowing you to add your own tests. For many kinds of tests, it is nice to view them over a period of time in a graph - this document tells you how to do that.

The NCV (Name-Colon-Value) and SPLITNCV methods

In many cases it is quite trivial to collect some data and send them to Xymon in format like this:

  Name: Value

e.g. if you have a device that collects weather information, it might look like

  Temperature: 19.2
  Humidity: 53
  Wind: 9.6

In Xymon, this is known as NCV - Name, Colon, Value - formatted data, and Xymon has built-in support to pick up data formatted this way, and collect the data for graphs.

Make a script to collect the data

First create your test data. Typically, this is an extension script that sends in some data to Xymon, using a status or data command. If you use status, it will show up as a separate column on the display, with a green/yellow/red color that can trigger alerts. If you use data, Xymon just collects the data into a graph - you must go to the trends column to see the graph. For this example, we'll use status.

So we create an extension script. Here is an example script; it picks two numbers out of the Linux kernel's memory statistics, and reports these to Xymon.


	#!/bin/sh

	cat /proc/slabinfo | \
	   egrep "^dentry_cache|^inode_cache" | \
	      awk '{print $1 " : " $3*$4}' >/tmp/slab.txt

	$XYMON $XYMSRV "status $MACHINE.slab green `date`

	`cat /tmp/slab.txt`
	"

	exit 0

Get xymonlaunch to run the script

Save this script in ~xymon/client/ext/slab, and add a section to the ~xymon/client/etc/clientlaunch.cfg to run it every 5 minutes:


	[slabinfo]
        	ENVFILE /usr/lib/xymon/client/etc/xymonclient.cfg
	        CMD /usr/lib/xymon/client/ext/slab
		INTERVAL 5m
(On the Xymon server itself, you must add this to the file ~xymon/server/etc/tasks.cfg)

Check that the script data arrives in Xymon

After a few minutes, a slab column should appear on your Xymon view of this host, with the data it reports. The output looks like this:


	Sun Nov 20 09:03:44 CET 2005

	inode_cache : 330624
	dentry_cache : 40891068

Arrange for the data to be collected into an RRD file

This is obviously a name-colon-value formatted report, so we'll use the NCV module in Xymon to handle it. Xymon will find two datasets here: The first will be called inodecache, and the second dentrycache (note that Xymon strips off any part of the name that is not a letter or a number; Xymon also limits the length of the dataset name to 19 letters max. since RRD will not handle longer names). To enable this, on the Xymon server edit the ~xymon/server/etc/xymonserver.cfg file. The TEST2RRD setting defines how Xymon tests (status columns) map to RRD datafiles. So you add the new test to this setting, by adding slab=ncv at the end:


TEST2RRD="cpu=la,disk,<...lots more stuff...>,xymond,mysql=ncv,slab=ncv"

slab is the status column name, and =ncv is a token that tells Xymon to send these data through the built-in NCV module.

By default, the Xymon NCV module expects data to be some sort of counter, e.g. number of bytes sent over a network - it uses the RRD DERIVE datatype by default, which is for data that is continuously increasing in value. Some data are not like that - the data in our test script is not - and for those data you'll have to make an extra setting to tell Xymon what RRD data type to use. The RRDtool rrdcreate(1) man-page has a detailed description of the various RRD datatypes. It is available online at http://www.mrtg.org/rrdtool/doc/rrdcreate.en.html

Our test script provides data that goes up and down in value (it is the number of bytes of memory used for a Linux kernel bufffer), and for that kind of data we'll use the RRD GAUGE datatype. So we add an extra setting to xymonserver.cfg:


	NCV_slab="inodecache:GAUGE,dentrycache:GAUGE"

This tells the xymond_rrd module that it should create an RRD file with two datasets of type GAUGE instead of the default (DERIVE). The setting must be named NCV_<columnname>.

In some cases it can be useful to use multiple RRD files - one for each dataset - instead of putting all of the datasets into one RRD file. E.g. if you want to add or remove datasets over time - if they are all stored in one RRD file then you have to dump, modify and reload the data from the RRD file. If you store each dataset in a separate file, then you can just delete the file. Xymon supports this if you call this setting SPLITNCV instead of NCV. Then Xymon will store each dataset in an RRD file column,dataset.rrd, e.g. slab,inodecache.rrd, and the name of the dataset will be "lambda". Apart from this, the setup is identical for the NCV- and SPLITNCV-methods.

The xymonserver.cfg file is not reloaded automatically, so you must restart Xymon after making these changes. Or at least, kill the xymond_rrd processes (there are usually two) - xymonlaunch will automatically restart them, and they will then pick up the new settings.

Check that the RRD collects data

The next time the slab status is updated, Xymon will begin to collect the data. You can check this by looking for the slab.rrd file in the ~xymon/data/rrd/HOSTNAME/ directory. If you want to check the data it collects, the rrdtool dump ~xymon/data/rrd/HOSTNAME/slab.rrd will tell you what it got:


	<!-- Round Robin Database Dump -->
	<rrd>
		<version> 0001 </version>
		<step> 300 </step> <!-- Seconds -->
		<lastupdate> 1132474725 </lastupdate> <!-- 2005-11-20 09:18:45 CET -->

		<ds>
			<name> inodecache </name>
RRD datatype------>	<type> GAUGE </type>
			<minimal_heartbeat> 600 </minimal_heartbeat>
			<min> 0.0000000000e+00 </min>
			<max> NaN </max>

			<!-- PDP Status -->
current value----->	<last_ds> 330624 </last_ds>
			<value> 0.0000000000e+00 </value>
			<unknown_sec> 0 </unknown_sec>
		</ds>

If you go and look at the status page for the slab column, you should not see any graph yet, but a link to xymon graph ncv:slab. One final step is missing.

Setup a graph definition

The final step is to tell Xymon how to create a graph from the data in the RRD file. This is done in the ~xymon/server/etc/graphs.cfg file.


	[slab]
		TITLE Slab info
		YAXIS Bytes
		DEF:inode=slab.rrd:inodecache:AVERAGE
		DEF:dentry=slab.rrd:dentrycache:AVERAGE
		LINE2:inode#00CCCC:Inode cache
		LINE2:dentry#FF0000:Dentry cache
		COMMENT:\n
		GPRINT:inode:LAST:Inode cache \: %5.1lf%s (cur)
		GPRINT:inode:MAX: \: %5.1lf%s (max)
		GPRINT:inode:MIN: \: %5.1lf%s (min)
		GPRINT:inode:AVERAGE: \: %5.1lf%s (avg)\n
		GPRINT:dentry:LAST:Dentry cache\: %5.1lf%s (cur)
		GPRINT:dentry:MAX: \: %5.1lf%s (max)
		GPRINT:dentry:MIN: \: %5.1lf%s (min)
		GPRINT:dentry:AVERAGE: \: %5.1lf%s (avg)\n

[slab] is the name of this graph, and it must match the name of your status column if you want the graph to appear together with the status. The TITLE and YAXIS settings define the graph title and the legend on the Y-axis. The rest are definitions for the rrdgraph(1) tool - you should read the RRDtool docs if you want to know in detail how it works. For now, all you need to know is that you must pick out the data you want from the RRD file with a DEF line, like


		DEF:inode=slab.rrd:inodecache:AVERAGE
which gives you an "inode" definition that has the value from the inodecache dataset in the slab.rrd file. This is then used to draw a line on the graph:

		LINE2:inode#00CCCC:Inode cache
The line gets the color #00CCCC (red-green-blue), which is a light greenish-blue color. Note that you can have several lines in one graph, if it makes sense to compare them. You can also use other types of visual effects, e.g. stack values on top of each other (like the vmstat graphs do) - this is described in the rrdgraph man-page. An online version is at http://www.mrtg.org/rrdtool/doc/rrdgraph.en.html.

The GPRINT lines at the end of the graph definition also uses the inode value to print a summary line showing the current, maximum, minimum and average values from the data that has been collected.

Once you have added this section to graphs.cfg, refresh the status page in your browser, and the graph should show up.

Add the graph to the collection of graphs on the trends column

If you want the graph included with the other graphs on the trends column, you must add it to the GRAPHS setting in the ~xymon/server/etc/xymonserver.cfg file.


	GRAPHS="la,disk,<... lots more ...>,xymonproxy,xymond,slab"
Save the file, and when you click on the trends column you should see the slab graph at the bottom of the page.

Common problems and pitfalls

If your graph nearly always shows 0

You probably used the wrong RRD datatype for your data - see step 4. By default, the RRD file expects data that is increasing constantly; if you are tracking some data that just varies up and down, you must use the RRD GAUGE datatype. Note that when you change the RRD datatype, you must delete any existing RRD files - the RRD datatype is defined when the RRD file is created, and cannot be changed on the fly.

No graph on the status page, but OK on the trends page

Make sure you have ncv listed in the GRAPHS setting in xymonserver.cfg. (Don't ask why - just take my word that it must be there).

More advanced: Sending a "trends" message

The NCV method works fine in many cases, but you may run into a situation where it isn't really suitable. One possible problem with this method is that you can only store data in a single RRD file using the NCV method, and there may be situations where you want to use multiple RRD files for flexibility - e.g. if you are reporting performance for a number of applications, then it is useful to have one RRD file for each application. And since there are different performance metrics for each application, you cannot use the SPLITNCV method.

Xymon supports a different method for collecting data in these cases - you can send a "trends" message to Xymon with the data you want to put into a graph. All hosts appearing on the Xymon server already have a "trends" status column, but if you send a "trends" status message to Xymon, it will not show up in the "trends" column - instead, it will be used to create/update an RRD file with data. And inside the "trends" message, you can define exactly what RRD files you want to use, how they are formatted, what data goes into the RRD file and so on. Here is an example of a "trends" message, using the same data that we used in the example above for collecting some data about the current weather:

data berlin.trends
[weather.rrd]
DS:temperature:GAUGE:600:U:U 19.2
DS:humidity:GAUGE:600:0:U 72
DS:wind:GAUGE:600:0:U 9.6

This creates an RRD file for the host "berlin", called "weather.rrd". The RRD file has three datasets: temperature, humidity and wind, all of which are of the GAUGE datatype. For more information about the DS definitions, see the .I rrdcreate(1) manpage. The current values for each of the datasets is specified after the DS definition.

If the RRD file already exists, then it just updates the data.

You still need to create graph definitions on the Xymon server, and if you want the trend graphs displayed on the "trends" status page then you must also add the graph name to the "TEST2RRD" and "GRAPHS" settings in .I xymonserver.cfg(5) but it is not necessary to restart the xymond_rrd program.

If you want to create more than one RRD file, you just add more data in the "trends" status message. E.g. if you have three applications with performance metrics:

data appserver.trends
[salaryapp.rrd]
DS:usercount:GAUGE:600:0:U 210
DS:payrollgeneration:GAUGE:600:0:U 29
[bulkmailapp.rrd]
DS:customercount:GAUGE:600:0:U 1922
DS:mailsize:GAUGE:600:0:U 61293
DS:transmissiontime:GAUGE:600:0:U 88

This will create 2 RRD files, salaryapp.rrd with performance metrics from the Salary application, and bulkmailapp.rrd with performance metrics from the bulkmail application. Note that the metrics collected are quite different - you have total control over which RRD files get created, what datasets they contain etc.

To view the graphs, you still need to setup a definition for generating the graphs in the graphs.cfg configuration file, and the graph definition must be listed in both the TEST2RRD- and GRAPHS-settings in xymonserver.cfg - then the graph will appear on the "trends" page.

xymon-4.3.28/docs/editor-nohost.jpg0000664000076400007640000001026211070452713017443 0ustar rpmbuildrpmbuildÿØÿàJFIFHHÿÛC  !"$"$ÿÛCÿÀqƒ"ÿÄÿÄ3!1"#23Aa$BQSq‘’“±ÿÄÿÄ$!Að1BQq‘ñÿÚ ?þ©"ÉÈDŒù2ó¦•}6d…Q±ÒvQ&ÏÁY•Ÿ°Æªé¢3Tàˆ™ôJ#²²ŒÙ‰o¸JQ$¼%%jQŸ‚IòffDEþf!#1ÇñY8¼/5%*ÍæÚ[î°HR’å’ˆÓ¹PiI^—îb\)¹ˆQ¢ã×I/áÉÿÄ$ÿì¢þR3œŸì¿Wxç!CL,|´©ud•Z’?êdêëýŒ|v÷ºQ7fÖx¦'ö#Èþ»lÙ«\âôg^ÄKY®DC"K‡îëgø/ÿ%ïþFF_À²Ù×ݼ£v§áš’’òã'åiþ¦U±²ˆ¿!mÔ>ÊiD¤,ˆÈÈýÈz»éNá¦Ïºž%«SfmUöö8î›òV=›73J¹ øŠó˜Ü0„”‹‹ØA›´âˆ5F“Aÿ*"ìC˜ôï”ôæüôB…£ÊiĦJ–ºLÉZëjlÔ•}4d¥xëñä|ân.^iè¸ÌÃñý~o-S:ÜnÚKËêkC'4ihYÚ‘ïEf.¹Öyî7ÇU”ŽVIã—+q’ñ6kSò`©FFEFåù÷ª²÷(î ŽËäfIs'•#§ÌàGuv‰$—e ÖV”¥'¢“²Hˆì]ò DlÜ¡Ê[¨m¹‘¥‘´dG»¶ú ɃSi#þ†td~@aù_©«ãS#ârÑøÔ<ÁÃ9²™È“’lÜZ–œq¢7\VŠñ¢R“ðjòFvóiyW 'Š`Ó•)¨ùgNDÂŒMÇn¢OÒ­œVŽROT–¾TVB×=ÆQ’Ê'+3”ÂÏé(î¿M[ÍIBÒê“£RŒŒˆ”[*Èød¸{¥Æ™7šÇKj"a="4„›’˜I™’]7«23Q’ÓªÈÖªQX þGÎ&âåæž‹LÌ?׿òÕ3­Æí¤¼¾¦´2sF–…©ôVcÔžk6>W“©ì#-à¸Ê•ñùM>Ť¡·$úÙ&Ïc.ÂI’–’ª23;IIÏp\v_#2K™<¬h¹>g;¨(ó´I$»-²´¥)=’DGbÍo§ iô9%œûÆìæ24Æj9¥4Dd“CI÷3;5yö" Ž/#ŸŸêî ç¸q*.;’q’jwĉR ZUô'U¦ŠÈ¶/¨©Gæ¢æ§=Õüîw/‡ÅÈÄñî;kr×)J“µ|i¸ã-Uºú -Óô!'²¶4'MÇøK8žC:÷ ÎåeF€î=‚œóJCl­m,ÊÚmDl§ê35žÆ¯e/ã&d²Óe¡ÇË-Žk-…™u©–Íó"""»?ˆpϱ&«Í‘˜Èsܶ•qváJ‹‚•šˆÃYâÜt¤ÜmjëO[„klމeõÙÑF._ ‘…‘&n 9ô¥E‰ó-*-HÐN¸M}µ¬”I'ˆ¬^ˆý;Ç¿ÉÂÉç3™CŸŠw—å<ѹ3¥KKf–Ȭé&jY)FhM™ÐÚ¸ä<ç,ÉðïJ³™d)¹‰yži-MÕ2IÌD£ípú’Mš”¥!)Y$‹é5{ \.Zô̦/“êI¾@æ*Cqò+S-8Xçe%d¢J{mšKU¤©J%U „ü …Šƒ‚‚YLœ¸øKæ×ÙGÃ9,ÚI©´¡Õ]®êÔdT$dq¿>ùÏ|¿ˆù¿ÍõÝ:w|ÁkZÞ~jïo7_H"«Ó®rï.”ú-µØl£&NËŽvDMÉ`Гeggàeô™_µÁÉNäý\Ζ*µqìjÝø‰ÿ ”dO¤‘’f¥YÑQÒv¢ñz gžùÓù¬¾VSqW9Îqµ|;*RT¤¡ R¬Ð©ÃZ¼{ù;´ˆŒÏ$›žJÝ93!LjâLËBC+yi2*»3}wçøO‚óee‘ÎçeY€¾)ÇK*©hù—“&iF6Øn¤'è^Î+­ÏªK_*+!+êkMËÃ' ãe±Ìd#½’É}.Þ­3hR\zˆŒÐjAÉóçÄòôïÆ7 œÎbÎ)¬BŸŠóDä¨Í!.›2²µ)•­TebF{‚ãò¸¦pÉÊeqødCDqÑ\o¡æTH=Ð¥'ÇiQ•yðTḞ{‘=Éù£yÆq­aq9n;蘥8Ò $gI&Ž”‘¤ÉÅ8j5™¥J4))% ^¢f CÀÅÉB€äì¤dMÌŽA0 ]Î,Ѷiqä'TšLÑþ5¨Ìh9O ~l~Gò¬´–¡-MŠêQÊÒÓ.<“&ÍÂs¡½H¶Ôάˆþ¢Ë¸|~HÊ¢HÌebcžŽQ¥Aжə Yý*%!Fs-›4*«Ï‚¢³<ÛÕÜGäkËÃõâI³žR³ Ç”­Ð—?»°i3xÉ Iû¢Ìé6eB~_œf¢dyÆâìÈÄñÙ-µ>Z²&—TÙÇeõ­¦‰¥l¤%Ó3I©7©Q™ÆSˆ·+-'# ;šÄÝNsP]m(’iI$”­Ð¥!Z’S³fƒ¤—Ÿ,±¸Xeæd ÜtòòÊT”;F’Q0Ó’¯ÇVRtwäÏø¢"3Ü»–³"Ö9ˆ.MacU"C3TÏR¤Îe–õ‘ÚÖ¤Ù¥“#Kž&à¹S3™|¢`Úù2ß„s×67YR³&t­;¤^ûY^µäGÄú…ÆñÒÁ³' ã%‹;¹×R§MQœel·¶µ¢I†ÑUz—¾Æj±œYœnuìŒ,¾U¨¯>ä•ã Ä|)¼åîåi¿“Q«]õØöÖü‚²œ3ÕÜG%äxìleáÔÎTÝ(%0ÛòËD)Ï¿)#dQþJ£¢V¦t:XÍà8‹xIl<îhñ±¶(¸µºßÃ0FFD’¤ŠIøJ–¢**/Z@|›’ÆÉvdì”4¥4ƒÿÈŽ‹þD€¨ÌLd‰Ä«"rN1 P™+VŠŒ×Ž“²”gjR©º³Q™Ÿõ3¹)|rg$‡›þÐæZ\V”ÙEn<´Æskò´uy2¿è_äCUÔßúhÿ€êký4Ô‡Î\é«UÌÌ×<ùòë\Ço?È0¤á-¼‹¤¤‘ü¾WƒÿÔ=ñÛR¦Æˆ•ü½§n)©µ"i#4‘(ˆÈ’£RJÈŽˆ…çS_é£þ¤=%)Oâ’/ö!·kéû[mÙ¹n¹ç²^ÕMÚq0ýï¹@<®Y3®bãñéRô$©o6“KM¥N“ek[‰%(‹ušQ±’[;"56•Åc;)έødæ·ÓmÞgííÕwRñí]Õþ‡*í¾Ë„NŒì§:·á“šßM·yŸ··UÝH?ǵwWú«¶û ge9Õ¿ œÖúm»Ìý½º®êAþ=«º¿Ðå]·ØTàXÎÊs«~9­ôÛw™û{u]Ôƒü{Wu¡Ê»o°ÆvS[ðÉÍo¦Û¼ÏÛÛªî¤ãÚ»«ýUÛ}83²œê߆Nk}6Ýæ~ÞÝWu ÿÕÝ_èr®Ûì1”çVü2s[é¶ï3öö껩øö®êÿC•vß`NŒì§:·á“šßM·yŸ··UÝH?ǵwWú«¶û ge9Õ¿ œÖúm»Ìý½º®êAþ=«º¿Ðå]·Ø€c¸*‘ȹÎa–ɶ±máqS"0…!zªAÉRÔn!K%™’+JÔ¤>æg±Ú¯P3OtÖñc§³ª¶§dž»õ•Ö×]‹­¯FöÙÙ íW¨§ºkx±ÓÙÕ[S²O]úÊëk®ÅÖ×£{lìáeYlîW='”ãjÆÆz<$M™.{ } ¡Å­ !-¡h5§LÌÔD’Ix;ñA‘õì$xÚ¢FuœúðùSe+q*?vKFÁ~[9ý܉'±ÚÍ>N”4™þ?’:Œ÷Ì3‹É|1Dâaœ–h”jA)´+dš—©’‹óU‘øªÇ=;….,²òÓ”Rr¯dòg":M3–äG£5ºBR—¯åDÑ“=…Eÿ‘ž™ٙؑ w/hÐÑju†ëÁ:½*Yû™$ˆ“íj­ŽàSqLDÜ7qïåÝÉCBÿ¹|B ßeªýkscí¯áFDª«5“¹@Ì}(w¿æžîîìã8vvöoi–{oØî×ï}Ž_¾ëü§céC½üï4÷wwgÀ«³·³{L³Û~Çv¿{ìrý÷_ä}8Ys̼_Rrçs%ÆxsWIÝ®I9µ)´ºN¡#$œ$¨Ž¶*¥¸š$¸²TF1^¦³Õ¦#ŽVšïËòнzªí“Ûô"îö·.û\ß§£˜±Šõ5ž­1pú´×~_”UëÕWlžß¡wµ¹wÚææ1^¦³Õ¦#ŽVšïËòнzªí“Ûô"îö·.û\ß§ƒ˜±Šõ5ž­1pú´×~_”UëÕWlžß¡wµ¹wÚææ1^¦³Õ¦#ŽVšïËòнzªí“Ûô"îö·.û\ß§bÆ+ÔÖz´ÄqÃêÓ]ù~QW¯U]²{~„]ÞÖåßk›˜ÅzšÏV˜Ž8}Zk¿/Ê*õê«¶OoЋ»ÚÜ»ís~œ9‹¯SYêÓÇ«MwåùE^½UvÉíúw{[—}®ncêk=Zb8áõi®ü¿(«×ª®Ù=¿B.ïkrïµÍúpÂzqÇy.7’fs<‰¬[(íÃÈ¿1Ußµ8ãÍ¥FfN§ÉšŒÌŒÌüØÿÙxymon-4.3.28/docs/editor-diskchanged.jpg0000664000076400007640000023617011070452713020405 0ustar rpmbuildrpmbuildÿØÿàJFIFHHÿÛC  !"$"$ÿÛCÿÀª"ÿÄ ÿÄj  !1QV“Ó"ATU”•²ÑÒ2357RSqu‚’£Ô#a¡¥BDWƒ–¢¤³Â$46rt‘±%Cbs„´ Áðdv…¦µÄ&8EceáãÿÄÿÄ: !1Q24ARSq’Ñða‘"B¡3ÁáCbr±ÂñÿÚ ?ééòå¦t„¦SÉI:¢"'ÄW1cvÌð·ùà ÂóUÿS†•AÝúWÅUN²°Ws×âÿÚ“ÞË6.X•ú$îuß-ó'ôˆîŒýϺ>ilæqDgªlSX¬©é/·!ÆÒÓªYGq !¦4ËQªÏÂúJlñ1RbQéÊŠˆ–2ÐìD¬Öµ-&¾íN)¤dRH”Ùß6ÒÊÆ"®*±S¤5VÞöÝÅlRZšL¶j†Â©ŒÉ2NdšMJtÔ‚5’¶º[Ä@6†í™áoó†¶g…¿ÎÒ’qv(ƒN«Àf±&¶óx¹V§Ef"eÂÓÆE¬40nk3"ëÙ™gdû”lzÆ7•‹H~¥.‘*F'rœ¹/· ékˆT÷¤~‘,›Œ¡ÜÉ"+[bR£M”i0ÛÛ¶g…¿ÎnÙžÿ8cÇ §†ËÉvS¶”)÷I$·LŠÆµ )¹ðžR"Û°ˆ¶ UŠ|Jµ&].{DôIl­‡ÂBˆÈËþF dwlÏ œ1j%YrÚS±jjÚ\[F¦ŸÌD´(д܅*J’eÞ22=¤5iO›^¤ÁÑä÷ÔíT¥.mÎ.|Š[§ÿž…°ŸéÕor,M®bùtˆ¯Â¨KÕ7T­7)4â„™¦ÔyÎ4έ2KV¦Ð„ÙÂ>ãmÌîConÙžÿ8a»fx[üáŒ>œÝS RêmJÝmˆËéU«Ö’ÐJ%äþ ï{w¯a‘vÌð·ùÜs¤&0†çßUdkYzJ÷1‘êXg&µÕfZn”ë±9”wØ“±ˆTJ=#³ˆçÕh´Jþ%‰U’Ö笿‘KÆLeVG ”›#J;¥(ÌÏi™a± YŒG‡ðÛ‘¢T S@‡ZjiòŽ8•dq×ê "QSMÑ•}ÂŒÕ݃znÙžÿ8c\ŨäʪVU¸ÐÞšáªRõ ‘® êQ'2ob?t’á2ûTeb~¦ZiN®ŠŽ\ç79$ìk‹¬Seœ•ܪæ“ïØÎÆGc/–äTéøV©@rµ*§ü_’ûÒ[dœ}ÆÊ16£6„–T¼âH’DFFW¹•ÀmýÛ3Âßç 7lÏ œ1`%vÌð·ùà Û3Âßç sv ¢.™‚´sXN”D¾ºA*³M’gQYª"%£PÝõ¦d— X»%k>ê×®¸ëÛ¯~úà,to.ñjɪÝZŒÙ²ëu¹?Ò/›._àÛh”6¾í™áoó†¶g…¿ÎÓÕ\Eˆ¬šÛx´¡‘âö(»Ï¹˜4½ ]I75‹jî_5‰ ؒآ¥úŽ6<>þ#c­*äb5¦•ݳ&I'ö‘¥E´Î%¢|U\F‹Û”fQœÃØI‡aÐõdnOJb%H’¥™\УNT¥³+ÉFjîRßvÌð·ùà Û3Âßç iÅxâÄUŸ©dN™T‰.¡½—D–Fƒaœ^v1Ÿé VÊ’5k ¯‡àÔ A6êu™i+^u:ëM6H¹dB[Jl‚23,Ù•´î£Ù`ÌnÙžÿ8a»fx[üá‹TR¨;¿Jøª©ÖVªîzü_ûR{ÙfÅË¿Dλå¾dþ‘ÑŸ¹÷F{vÌð·ùà Û3Âßç k1töðje9Ue5%c-éMÒÙ(ÙßN«-¸w7~Ù­Ý^ûGŽ-W7MëìNóÌ-r”TÓ†Á2q•VT$‘¨‘¬Î”™(”EÜ‘ÜÌ6*¼UX«“¢ûÍ"CÑ”¬ËMœeÕ4âlvàZWà;\®V1uú²Øv;OÔÔÓ’\6˜JßÊn¬’¥šRF}ÑåB•bï$Ï€ŒiÍTëÍC QÜ;ª¥ièζÓk~¤gQ”J6ÍÄ) KFetØÔg”̉ïÓ£):F´Q©Sª› ¾—ÛgôlïKî“ 46›%.2ƒ#;¯a‘¨Ë` ¿»fx[üá†í™áoó†5F Äué20}Nf )éÄúÝÓKÔ4”ÓìÂÝý¥$¿Ñ©Êó©WRËÜð x«‹ —£ºÍ_½U,NÓmÌŠ¸l4ÓF¸ÉJÛ4 ”J»6;¨ÒyŒÈ“°ˆ6Þí™áoó†¶g…¿ÎÓš6ÅxÒµU¡TgÇ©"ŸW7ŠSR•NDhÆM­iL}[§!KJHR\#;ŒÉl%Zr»?Q«õüA"«.­L‹)HTvZi“[d£ÈM Žç˜³f3+—rI-€';¶g…¿ÎnÙžÿ8bÀ×ÓdbF4¿[ë~•I¨f S5Ûº¤äLŸé ¹r0îk÷W¾[X¸o°6õe°ìvŸ©©§$¸m0•¿”ÝY%K4¤Œû£Ê…*ÅÞIŸ»»fx[üáC†jµèØÒS3Z‰EGîiñâ¾rZSe‡ÐêRN-´+Ý4Ò®IIÜŒ¶•ï«cŒboÐ$ÑꘒL*쌚ã‡Im¥²i5‘ã¤ãfj$¤·A¨¿HDw^T¨7ÔêñA•4ª‹í»Pq¢§2ÏXá4㦛—pÒÎçbîmÂdGêݳ<-þpÆ£§O®Í©á«íIDˆ˜µöTµÅ9+kz%¬âŒµ4•Ýj+®IJ²–agFxJ§à*G•uXš1”È»™†ÓIŒ§MÄjÒJ,«A6²Q¨³8V$ì ‹vÌð·ùà Û3Âßç X _ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÃvÌð·ùÃýÛ3Âßç 7lÏ œ1`_ݳ<-þpÇžUeÈë&Üœþ±Df”†jU»ÅúϽÆ?Fÿëßö†çÿ켫ÿ£ïð „=ð1’PÖ²[ì8é™% tÎöï‘ñw¾›å/þ!d¿XÁí½!׈ò)ZÌÉ&jjæWཋþD:‚½“XÆ£S»¯ú,Ü6ýWÙ{ð_õÛh厯Üûñƒõ¹sîI9²ð_3w·êG\ÕjtÖê’Ûr¡ KË%%O$ŒŒ”{h…»Fo|gL‡¤Ú¥?vÈ7Ýj:)dœÖ$–ÕE5*ÈJF¥)YP’3; ÌÝèí¹¶àÂJ\QoM„Gÿ–-v>Ñïòyƒ?«ñ:1Ùxb;è~:èìºvE ÛJ“®Y8팸3¬‰JùJ"3¹J^ˆ‰È‰NÃQÓPB›š–˜a%%*#%%ËvFFw#½î?{h÷ù<ÁŸÕøv>Ñïòyƒ?«ñ:0K/¾Ô¯ÂçÓë ö¥xÎ>ŸXÄv>Ñïòyƒ?«ñ:0ì}£ßäóWât`12hŒ¹:¡&6’êP‘=õ<ó,7KÈfi$‘ª)©VBP‚5š*RFgaM¹–ÝAšIê[ ³L¦#’ˆ9RIGì‚Ixˆ¶ Ý´{üž`ÏêüNŒ;h÷ù<ÁŸÕøÚÌ Z’™UˆXr¢úS)v[Lº´¶¢2RÔFyLŒî\sb8Ô¥£‰tœž´¸ú¤ÇjCO-$‚#u³2Öw-¥LŽÄV2±Z®ÇÚ=þO0gõ~'F´{üž`ÏêüNŒ3P0ÍΤM™B¨7Qr&4ˆí3G‘ ¥bê$¡(m "3W¹¹™™ŒÍ>>§F‹žÍÝ7£4ÂZm,8iR h"Ø•V¤Ü¶ÙF]ó{h÷ù<ÁŸÕøv>Ñïòyƒ?«ñ:0}ö¥xÎ>ŸXµ6£N~Ì5\b#Ž6¤%öžhÖÑ™X–’Y)7.ÌF[6‘–Áì}£ßäóWâtaØûG¿Éæ þ¯ÄèÀ`[ÃL7Rv¤Þ”jÈœóiiÙ)bN¸„ÜÒ•+r\È®v#=—1Ÿ¨Óð5J"!ÔaaÉ‘òä%—ÚeÄ%Õ¨Ö· &FD¥)JQŸ ™™žÓ´{üž`ÏêüNŒ;h÷ù<ÁŸÕø ³uJChJQ‚”$ˆ’”¼‚"."Ú?wÚ•ã8\ú}cØûG¿Éæ þ¯Äèñö“Ìý_‰Ñ€‰Ö° ·-©uœy"¥!¢³n˃Fyh/Ôj†fBHÝ=uÉœC*÷<Ú“1ò;«–\ˆJSm„YR[¯sÚ=´{üž`ÏêüNŒ;h÷ù<ÁŸÕø!ïbFbœŠkÒš‚Û$Â#!m“Il‹) ’[ $[-k[`ñGãÓÓNbj#½1ÐÓ)m,¼d§[$‘X³"5'FE{‹Oà=°Ã»£ì–ÛI­GÖüC±\ÿîÄ'º›~cE¾k…Ñ‚[C}©^3…ϧÖ-M¨ÓŸ†ó Wˆã© }§š5´fV%¤–JMË„³–ͤe°kMþêmùù®FýÔÛó-ó\.ŒÚ>Œð¥r'Ò1S¥¢ù‹L¢4âoÃe& ÖçÁÛù¿ºŠûeÉ»²5º2ÚÖÖ{«[e® ýÔÛó-ó\.Œ7û©·æ4[æ¸] Õs Ñ*øÑšìоK-ÈbJ‰)«S&•!+=õyЕåË}–Ím‚WŸ n]Ëž¹÷FéÕ]¼šín·Yn úÎï7në‡h×[ýÔÛó-ó\.Œ7û©·æ4[æ¸] ‰1X^féÝgF‘ºÙKu¦ÚõÍ$ÔiBïî’Fµ™ì,Êã1v‹£×ilRœ¤áeÓã,Üb*£°l´£áRQk$ÿY…ï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6K°ó!‰¶ž[HeN!m’´3-¹Rk]‹€³*Ü&,°XQ…BSEhà2lC4j“¹›2"ÈݽÂl”•ŠÅb.!¯7û©·æ4[æ¸]o÷SoÌh·Ípº0ˆ”¼‘†£¦ …75-0ÂJJTFJK–.쌌îG{Üf7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬Zbm‡d:ĺkNIp}Hq 7VIJ J2÷G• Mϼ’.!­7û©·æ4[æ¸]o÷SoÌh·Ípº0×°겪îãÇÜ©-HZ¥ªÞ5!D¤¯qæºT”™mØi#.8φ7.åÏGÜû£tê®ÞMv·[¬·}gw›‡7uôk­þêmùù®FýÔÛó-ó\.ŒÃ2†–ReE4±%RÙ/ÑY·Ô¥)N§‰f¥¬ÍE´ÍF}ó©ñpe;)SãP"e”©…¨C(³êA¡Nìþ Í&®#2½„º›~cE¾k…цÿu6üÆ‹|× £?ƒ@ªIªÁbƒ¡/ýbS(i½¶ýÚËj¶ñ˜¼ÒðÃ,Aa¥ÑÛjŸmÄÚM²Lk Û-YÈR“²ÝÊŒ¸ k­þêmùù®FýÔÛó-ó\.Œö4L²íj4l>ÅQâ2vkm²—Ü¿e—tÎcÝ m6a×M†ÒÓ,´â†Ð’²R”–Â"""".­7û©·æ4[æ¸]o÷SoÌh·Ípº0C}©^3…ϧÖ#5ZdyuÙ5hzDJrCm´¦â&šdHEò§3±Öá‘–«)GcZ­b;®ÿu6üÆ‹|× £ þêmùù®F9 DˆéõYñU&âÌ\÷–Ô$-Ùq’¼ì6×NbYžFìi$™+8Å/0™Éb†šMCýtÃR{ÿ¤±wÏqßî¦ß˜Ñošáta¿ÝM¿1¢ß5ÂèÀOéì`êth±©ìÐb1 Óv3L%¤%…šTƒR¶%F•©7-¶Q—|Æ+P0~¢Ó¢Ãr„uÔö!H¨´ÓL½(šm)̳#3Û–ö3;q˜Šï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6†ûR¼g ŸO¬7Ú•ã8\ú}cWï÷SoÌh·Ípº1˜Âq´‹*Цa¬?£ª´Ä4§–ÔZ45šMˆÖ«7ܤŒÈ®v+™ ÆûR¼g ŸO¬7Ú•ã8\ú}cØÏ'øÌð}á­à­Ñb7*¥ð+ ;%˜­™Pá¬ÔëÎ%¦ÒD–ÌÎëZK‚Å´ÎÄFdÀÏoµ+Æp¹ôúÃ}©^3…ϧÖ1´{üž`ÏêüNŒ;h÷ù<ÁŸÕø ¾ûR¼g ŸO¬7Ú•ã8\ú}cØûG¿Éæ þ¯Äèñö“Ìý_‰Ñ€Ëïµ+Æp¹ôúÃ}©^3…ϧÖ1´{üž`ÏêüNŒ;h÷ù<ÁŸÕø ¾ûR¼g ŸO¬7Ú•ã8\ú}cØûG¿Éæ þ¯Äèñö“Ìý_‰Ñ€Ëïµ+Æp¹ôúÃ}©^3…ϧÖ0¯à=°Ã»£ì–ÛI­GÖüC±\ÿîÄ'º›~cE¾k…Ñ€ÚíJñœ.}>°ßjWŒáséõ_¿ÝM¿1¢ß5Âèú›~cE¾k…Ñ€ÚíJñœ.}>°ßjWŒáséõ_¿ÝM¿1¢ß5Âèú›~cE¾k…Ñ€ÚíJñœ.}>°ßjWŒáséõ_¿ÝM¿1¢ß5Âèú›~cE¾k…Ñ€ÚíJñœ.}>°ßjWŒáséõ_¿ÝM¿1¢ß5Âèú›~cE¾k…Ñ€ÚíJñœ.}>°ßjWŒáséõ_¿ÝM¿1¢ß5Âèú›~cE¾k…Ñ€ÚíJñœ.}>°ßjWŒáséõ_¿ÝM¿1¢ß5Âèú›~cE¾k…Ñ€ÚíJñœ.}>°ßjWŒáséõ_¿ÝM¿1¢ß5Âèú›~cE¾k…Ñ€ÚíJñœ.}>°ßjWŒáséõ_¿ÝM¿1¢ß5Âèú›~cE¾k…Ñ€ÚíJñœ.}>±ç•*…!dã•ZÄ‘’VRJMûå·„»ÜC[ï÷SoÌh·Ípº0ßî¦ß˜Ñošát`6¡FCZÊœ'ÜhÌÒµ>’µûÄWàïý71Ë_2#ɬa'#>ÓÈ(òHÔÚÉDG™½›ñ¡? íUŠU£zŒ÷ïª Çdš”d’nö$‘™ŸxˆÌöÐ]J«…X¡aú-·’· Nf6°ó6E›V’Ínõïk¸LLuC´j?IÿÍWýLEªõj„¸S¥*Üí;i&Œäó©IÙ¦’^ìó\ÀYŽäRJôtJr|W ICÆãj4ŒˆîGcï×x–¡7ÀS5&ˆÙa“(ï²’Co%)Ø‹Yµì൅=ô–_”ïÞ³o6ã—®{2¼­©½§µºˆåëžßÒøõ¸Šz,wÑ.;òU‘²zÍ¥K$š$¥$ŠöJ‡¼2bI VηNœó,¢;RJBÏuÎÄÛˆ""ÈŸœ¿xN¦Çn\7¢º§RÛÍ©µN©¥‘XÍ+A’’{v)&F\$dcѤ¹zå½N'/N†õû¶æ«ôíœôý—E™rYˆÁ¾ú(%%;j35m;™‘Îpk¸:.<œSˆq$‰2æé«Î[êm²3Õ¶”™šSdŸt¢"5ªæv,©Nz½ù”Å3&´œmÄ’ÔdG‘Ī×";{ž!ë{^IµK”ÖàJÒÚ[Zœ)ÖÚV« ’œÊ"±™¶•ø6ÈSæ³5µyãg•Ö–V[jâ2ÿçÀ|$!“ŠU)æ–Ò[7’£oVé¸j4šHÊÙHïÝÏaø2·ITeþ‰Z³m ŒÉ7¿t}óý…Þï™Ìàg€XŸ3!»O>É8›kpдŸxÈË€ÿú;±C€ªm9¸®L“5ÒÚãϸjRÕßµÌì\D_´îgQû]©F£ÑåÕ%™“YS«· ‘~³àê‹*U—Z}ªü˜¤óš¶ÐÌ4¦2œù´­ÖO9ßg»,Ýâ.–éIT1”˜ÑeK4IR‰£#BYuÂ#Ö%I"Ì„íÞ´i QÆ}2*±ØBWOeO7QÞ±’–jm(Ùcï_eömÙô¾HÒÑú?©UTÌúûtåÎxäùß*ê§õ¢Ô\š1,þó×ü%J£[‘‰jPª³"Èi£¾ÂX`Û$f[ÈUîfw=Yí2.ã9X†h² ÓNz­%¬²e+!(žqÌÌ¥G’Ƴ32Ú£#Ù|×± ˜Èò–Î&¨·ˆÄz½Q=?v¶‚.pôþ¤ægž~3–TÉÓ$¸Å4"d–jÕ¥&µå;(ì¢=„{8.gÁ³‡ÌÝJ¡S"¡®\gÒjN±(#4— “”‹ƒˆËim/×C•*¸§ä°óŠinºÊU³š–f“¿Éî¬vÚGÞ2=¾\C0ë’YyžjbÙSN!Gt(íb4_iÛŸóp™íòaëKÈÈÈŒ¶‘ð%Z{tøÉqHSŽ8âZe¤ì7W¹MÏa}'À=,¥”$ö$ˆÿä1øž#3hÎG“åG7[Í З¥m-¶#ꊪŒS8”ÄÄs–»P©A†No²Ês·KM¥- Uö™æFlˆ¹\ÍEÔgbÉa êêÑœ9´±T‹b’ÒHÉ*#÷."ûr*Çn##.ú‹) è⫈(²Û3ZÓQ_›wÉ ›¤Ñeö—°ø÷.êÓ#ÕfÓªfìI—A‹»`“d¼«›‰ÙîNäWOê.!æÐè¯i¬ÏëÜšëÏ9õ|!{·©¹WôSˆÿ,µ{à9ÿðÎz&1øSÄÁ=L¸&µ!Ôùáú\xq ÒB¤<¸í’S}¦IIfZ̉F–Ðⲫ-†B½ðÿøg=÷azÖ$êDÀáæ_•Q£Ri•Da¼ÎIFá6\J,dy’‡ÖáFÙ$ˆÍD4ôt[®ýÝœS3žÑžró_ªºmÕ4Fg‹XV:¢1ªJ¨BÆvÜA”&(ìî'­À”¡I\ƒmd•]IxÌû³B’DDž‘ê|ÒŒ}(`åÎu¨ñkKìºJBŒÒJCí•ÍDÒÊöÍÀ¤8’5äÌ|—™T}zq £nÆyˆ™¶Îº»·ê ÁõZ>­âÚš_e¬@¨É‚ÛÍ’TìvRá¦EÈøSë",©¹6K+¥iqþ§ò^ƒI£¢«4Å5rÆ1Î>UÕüÿžlO%ju.ÕÌÌ~þ¯ñ Ỻ1ÅS î\»‚›vèÖ_Yº”Œ™m³.æ½îwÏÀVÛìf©êäª#oæŸ32Ÿk"»†žS©mWµŽêaÒ±Ë.Û\¯¬`Z&)Òõv^'íÔà¦1r™53¬Ýs%ûbIM˺A,¬e›lKFXZœæ'£OƸ(åU«8‘Ù³hJy[­ JDÔHtÛ2ijim6¢tÓœˆ‘¶ÙGÁ·Û¦…T\¡À­ÒßÝ*›•ÜŠN±§JB¬¢#+¤ÈìdGÆ=£›#Ѱí3E:(¢ÎÁ3ZDZë ×é­QeÙ2Û£Ê'Ü6òÊ+¤KI,œJLˆÕ´†ÁÁ”ØQð…E0½]8uÜQú)1œiè­Ñ5njLÒ¦šD¤¸ù¤È²¶GtÛ¹8ªbª 3}÷lý^óÇnDë2µjælžå'™Gû”Ý\;¢¾hihßöþäþ]øÉsÿO÷³ÿq{Ÿý£õ˜óo+½w_­š·^ývnüÜNj·¯ug˺­“W¸ÿC©Í|ûrò`<ä˜1ä=ènºÒV¸ï ÆLÊæ…¤š‹€ò©ErØf[FÃc¦é±r"PdMTšŒ×¦TfО&"—“)ùµRX5P†lf”©v4µ¡¼ËÕ ;?á•©úVÃlÅ9ñÑå´rÔá,¬—Û=_þ4f. ÛCsÀyÉ0cÈz#ÐÝu¤­qÞ4Œ™•Í 4)I5åRŠå°Ì¶Œf2®õ»Hb¡¹wV¶¥MfKn™lÇÏ{¹Öæ·-®W¹h9Øn\l€å?†'UkQ0u:#t™øyùMèoºCo¶i:|‹”êìDD’vÚšcaÌCC{ "U‚©Pd<óL¨šq•ÕÖ’“¾fÐÊ–»["T…_nÀØ 4Ö"Á0iïcz":“‡%R©PÍ"œkirJT­~VSbrí·m=Òv±šŠøXP17Ä­al$ˆUUi0!"ê{oÇ• ”Æášã¡2 …-'bÊÂ×bÍpü=ÍÁø‚¥L•G®SêÓ›¡L¢Ð¡ÉR¬™ªÌ<ô’Zv™ntÆÎ²÷*eÓ3îvO(”¸˜ ã9<1)Š43ÚJ…ÜÈ”•Î×%†ÊÉSÊB#‘¤¬ffÝýÑ ~;®õ¯ëØ›rî½è¦È¹õ™5º¦”¼™¬yo–×±Úüz»¾õ|GOܺä©"}fmvh‘ägµ‹/úÆ[m÷¾Û•Óµ™ñ´ŠÝ[Öëõ¹ÔóN• šìK[‘)6êÉ“'Éå)&i7²"%ß(ÊÍ¡V¥lEV®R*\æ!ae˜ëUŸÞønb›"3’ÊV…"Årmh5YF“6ÃdV1”8¾‘†XFê›6rbÉ"5$¢¥q%ÈBï–Ë3ÜŠNR22%¼J“ Xyœg&‰YŸLr£N¬c©s$§"”ÙCb2#å¶KÕ4v>åFõŽù¬µ<2tȵzBpÜ×0d,fÓÏRbCZÛvœªc&¢i„—é)‹Î¦ÐFG‘±ØÈÕÄ5Ýè«áÊ~å×oÝIpsë2êrÄ‘#=¬y¿ÕòÛg»½öX؆»½|9Oܺíû©.}f]NX’$gµ7ú¾[l÷w¾Ë•ªÐZ]ˆoàÚÛø=årâÒNuNF§oc홪1t2r Åj%t¸”eî‰&ªPYU†o`ÊÛø=årâÒMtÜOÞÇÛ3Tb,èdäŠÕJéq(ËÝL7쇜ièÈDGŸKΚ¶Í– "•y”FiºI=É(î´ìË™Eb…T\¡À­ÒßÝ*›•ÜŠN±§JB¬¢#+¤ÈìdGÆ5*Z葆eµ…Æ2݉L™IDjrè²™Q8ÊËôM-õ9d,ˆˆžBlW"m ÑgÓt1A£áTü%X†Ìvk%RÃo^”ˆèKëÈK`ÝR”Iý9)iVS+™íHm`_Q55V‹A‘X™&£ÌåО^åd’ÚVìjŠHa´)je{V¢YZË+áZÃx€´¦¹u›U^¹·S™Â’Ÿ¸¢èk|JA0†umM©nêÈR¬¥AÕ¸›N‹ç¹\Ã71bª³]n´¨)£„¥8l$¥[!6L›mês\–WÉü!†Átg™ÀµˆÌ;T¦é%T ,O¬? Æ“&y¦ÄæéQÌïvƒI«"n]džåžó‘ ÈÌG¦:ÓJZ#²h'2+’kRRJ>̤•Ïi‘müiŒ a·¢C4nª„©0ÛLb5&Í?6;ò\#NÔ‘)÷‰J+X™¹™nt 62®õ»Hb¡¹wV¶¥MfKn™lÇÏ{¹Öæ·-®W¹kK„£?Œé8G? ‡"ŸE’¸TÖ–äÚdÞ†I6Nµq›BTI±žd_jˆÏˆ¨,ÈÂ8¥8_VâáWêG¤1Nv¯:ÕA ˜ã1ÔH[i6µDj²Jí­\P ÕŒ«½nÒ¨n]Õ­©@ƒ“Y’Û¦[1óÞÇîu¹­ßËk•îY9¯8Ã)[Q”£u´4ˆ”²I¬ó©%•$f£Û{$ò’•dž‚ÄTda,Tœ/ƒ+qp«õ ˜¤1Mv¯:ÕA ˜ë1ÔH[i6µDj²Jí­WµÔ2-ÑIqªÊÂ^¥IÃNW0Ó‘`*˜ìOÓ³SmrßDu%*m½V§2²¤Tµp]F–TX†äºsúö[’üU+"“gXylº›(ˆû—ZoÀv¹\ŒŒ{F©Ñ&fƒAÄÔl-B§ájúk3¹R0ë…èêŸ!ÈÖ4E!)Ž¢JI~ŽäFEîNôœOÄÚQªÈÆ´8µ¦Ñ†)QÑ!ÈjLUÈ'ç›Êi*R‰+NfÌ»¥-²Yw]ÕÌ&ð뻣U0Îå˸)°çneõ›¡ÙHÉ–Û2îkÞç|üm¹‘Î1(XÊaQ*uº]j}%8/#Óu+Dª‚Ñ»ÖîewÚ–•9b–K">‹½¤œ7YŒêò˜nCQzÙ”Þ—P“ a•‡›}´CY.Reêô12ñëDdFãdòn ŒÊêEÈ®[v×5쉓\Æ)Õ¬P¥Spü–¨5­Õ¹jßvËM4fh"+\µÅ˜ìei)ÔœÆXã I¦Q+p£Q$?2lª•5Øv%Æu’Ž’u)7 ÔêVf‹ µEÝ\Èb‘°ŒÚƒ0ãO–á>ñ0Ä­í’PÝpÕ”’‰&Þ¥FjØVYÜö±MÒn¨WDŒÎ&ÝêÕšw TšÕ¥Õ)-­Ã\r&ÐjBË:Œ“Ü+orv…áçª4YôjF ‡ L•žU3Ͼ”´¢uR™Q>Ñ ÍûLÒ²2ŽÒ‹fà ¬SAN4,ª‚Jºp ¢QMµ•ãšÔ‚Y.ÙLó%E–ù¶ÚÛF2¡¤lUv#ÕW\‘ArUcÂ}õ¶äµäŽ„¥´¸¥¯¹²3ð€1HÅx«9Šš¤#C¢Ñ]ŒsÚq˜ç-©$KŽk$™šÛª+‘rëK±Ý7Ãb,X B­²H¬?!Q°´™•Jm=rvR+rdLy”j׬R3ë2d^Tš.“+†ëÖˆ·F÷Æ­3¹òçß4¸Í{eÝ #?¹;å½¶^×+æF³¤&e{ W!SëxÏIVçÈÞ!bFÉÝ™žªLxL»´ˆÍYI~å)<¤³»áLKMÄñ&Ô(ûž3yó¹Ù±SËt(‹ýCIiͦEÝe÷E´ˆÏ×zâ¤?PÜ»—URŸ&³=÷4·£ç½‹Ýj³[½š×;\ó#F;E$F¤«áz•[ 7[Ä®J€šc²ÿLõMÅÄ}q•)ÆÍ­vUeQµ ౕI¢¼ÞÁÅ0ÝZ«†#ïž¶–¨nOr>±òU;^ jsW;g±YT¤™ð\ƒxˆf&Ç[ˈfÒw¯_¹w“ô›£.mñ¨9ƒ)ÛW«ÏÃÝ^ÝÍ®5þ•)¥>}* 0Z]€TFJ•9.²¦ÜºËs¥ ¼„Äu)ÈfòÖF¬ÄY¿GrÆï#®á˜ˆ®Ò+HŸ@ÀÍÔ l:—TëuG\–J2"RVÚU|‚;¸@t( 1‰pƒÔgñ'áçáPäSè²W šÑ²Ü›L“»ÐÉ&ÉÖ®3hJ‰63Ì‹íQù‘‡ MøՊ¹@Â2›§îXLQÜijÛªT— d…›JN¡+A$ÂC–#3¹†ã¨Õ SæSbLTõNIņœŠ=c¤ËnEbý.*çbîmÂdGMWøð”j ‡zN¨3ƒáSQGÅ2ÔÔˆÔw)ÄpÜ¥>…:˜Î™®2Vñ´…7r%)´®ÛHmê¯ðÿáÿ(‰Ö·0uqÀ­bÊ 2ZRJ6%ÔZeÂ#à<ªQŒEô—X¤W0­}©§ñU!ü9 y³QNfå™&ertÇ¢\3¤èÐJ°NÅ— Ô›r㑆Öb5´wá#+ÛäžÒï‘ÚÒE&BÁx^HˆÜ811%¦l¬HIMkþgß3=¦w3Y±„_Wç·PU.ŠÓJ}³h¤>êMIiN«+hJKjÖ£þ Ȉ¶™•ÊòÄOª…ŠMÙDi6«  Ó½å“FÊ]h夘ÎIá2YÚö;x<¡z»V³Gx‰žÑÝàòúìÙÝOxÌö‚.©Aœ”U߉6!º–^u¨«ŒôU™‘±¥)FEs"=¤i¹\­s)ÄÙq¡BzlÉ GŒÃfã¯:¢J‚+šŒÏa|k=!V_ǘøt†`È}¥Æh²‘Ê6ÖYTãÊ#±!f¢-¤Gk™‘ †’iÓ*˜FDj|}Ôûr#J(Ù‰;¡,ÈmÕ3sÙÝ¥»;­»?'^ªæøš·SÊzgÿÇŸÉzšï~¤nÝLO)ïßø~Ññ­Pj G§%çï¨94Ù1ÐýˆÔzµ¸ÚR½„gÜ™ì#1ŒÂ¸ƒOÆõJ]R¹©‘õú—·­äÈé%¯Ò¨Íë[3sôdZ¼¹Us1åMz©YÆôÑOE„N­x3hÇ*Z&2^µÖIJs]¨M›pÓbàá1Àñ*èÒœÎÞ•¹!öëΔ˭ â¼d‰pÓ,µ‰o»$™¬yŠäJÓÃYºÝ¨Âj±·­6Lwd²ÖSî›iM¥j½¬V7›+Üól½ŽØò¯8X®ŸBršë ™t¢q×t”g˜h»”šˆÉÂ|–Gr2""4‘™’cxÊ‹HsKV½SÃh¨%¸Rb"Zig)Qä›ñWJRP£l“•ó'ÉFem,ǦT£ccò)òÙitçqÆT”§]WeÆ®f[3 IùI#2¹Ÿ×¾Ÿÿ ç¢c €*ë¦è«Få"ºí˜ŒÜÉo!-Ö™„”ÜÜB»Î¯ap™—êš÷ÀsÿáœôL@ÕC©âM`j5ÇP‘£¯ôt¬N)%M^KžÎë.]»6íÏ'Ú¢íø¢äâ™Îg·)çòyõsTZ™§¯ý§ MÒ$ºj*ð¢N(klÝDiSã39iÚiýä4%J+%N®D¬¦FBEƒçU]¯MƒQ~rКd)‰jb'X[«KB¤’NÚ¤—mìf#ÍigÌÂç6-R‰N­ ˆŸ¤Wgîc¸VÎÚÈÒk¹m"2I‘ìTiËa¬Bš¦;¬u½P¬P)Ϧ©Ó]Si3éwdÆU•žJLÒge¡Ä"º-Ë{jš6Æf:ÏoÞgù_KM¨ßš¦g³>¼Çüe½@Y%¹°cÌe/%§ÚK¨KÌ­—”W"RD¤+nÔ¨ˆÈö‹Ã‹ <¿õdý¿ð–8cÿˆØKþO¤Øîzßú²~ßøK1ÿÄ áÌ%ÿ 'ÒlWÖŸS°ª?IÿÍWýLy$°Ì–ĆëK+) MÈþ’GPÒ¾”·d¯UMÇkU™Ž’¹Ïa4D_AéKK}ìw7›g£M¬ÿHkôtÓUù¦˜«8Í]q×Õû¸×¨·O*Ø„¥$$¬’+ÑÂ=”´»Ë¹œÛ]ü쥥î]ÌæÚèÆtùô}?Ïý+ÅZîîðÙKKü»—͵ÑÎÊZaåÜ®m®ŒR|‘z?ºŸåÊZjåÛœÛ}ü쥦¾]¹Í·ÑŠð—½“‰µí;ÜvRÓ_.ÜæÛèò–šùvç6ßF%ïdâm{Nær…GrIÉ]::ž3¹¬Ñ¶ÿýk,2Ͻ4„w¶àÎÊZkåÛœÛ}vRÓ_.ÜæÛèÃ…½>£ˆµÝݵfœ~•-†“™ÇZWµÌÒdC!£rs hó áÉBvM*“ Î4ㆅ­¦R…nÙŒÒv¹à.ÊZkåÛœÛ}vRÓ_.ÜæÛèÂ4·£ûN"×w~L¡`i¸…8ŽfÃkIu·SQvW$–݉ 'M¬Ù“•6;ܲ•¸ƒ~šãcï¯Ø8û)i¯—nsmôaÙKM|»s›o£Ã_öN"×wÑÍúk¾¿`7é®6>úýó²–šùvç6ßF”´×Ë·9¶ú0á¯û'k»è}Eê]Be6\ÆXuêd“• ZçKVé²ã&«l£yÄØî]ÕøHŒ½»ô×}~ÀùÇÙKM|»s›o£ÊZkåÛœÛ}p×ý“ˆµÝô>"è±7ä¦Ò£îU&©³NçiYs6Ý›îRyr+rž"Ýúk¾¿`|ã쥦¾]¹Í·Ñ‡e-5òíÎm¾Œ8kþÉÄZîú9¿Mq±÷×ìý5ÆÇß_°>qöRÓ_.ÜæÛèò–šùvç6ßF5ÿdâ-w}ߦ¸Øûëö~šãcï¯Ø8û)i¯—nsmôaÙKM|»s›o£ÿ²q»¾ŽoÓ\l}õû¿Mq±÷×ìœ}”´×Ë·9¶ú0쥦¾]¹Í·Ñ‡ Ù8‹]ßG7é®6>úý€ß¦¸ØûëöÎ>ÊZkåÛœÛ}vRÓ_.ÜæÛèÆ¿ìœE®ï£›ô×}~ÀoÓ\l}õûçe-5òíÎm¾Œ;)i¯—nsmôaÃ_öN"×wÑXéð!3h1b°‚m–%!¶ÒEbJRM؈‹¼Bþý5ÆÇß_°>qöRÓ_.ÜæÛèò–šùvç6ßF5ÿdâ-w}ߦ¸Øûëö~šãcï¯Ø8û)i¯—nsmôaÙKM|»s›o£ÿ²q»¾ŽoÓ\l}õû¿Mq±÷×ìœ}”´×Ë·9¶ú0쥦¾]¹Í·Ñ‡ Ù8‹]ßG7é®6>úý€ß¦¸ØûëöÎ>ÊZkåÛœÛ}vRÓ_.ÜæÛèÆ¿ìœE®ï£›ô×}~ÀoÓ\l}õûçe-5òíÎm¾Œ;)i¯—nsmôaÃ_öN"×w~ášFÓŸ›JˆH’ûidÜ~|™ CI32i½i+VÙÜ‹'õ Ä9ôøM­¸q ÆBÝ[ËKD¤œZKY‘7µJQ™™ð™™™]”´×Ë·9¶ú0쥦¾]¹Í·Ñ‡ Ù8‹]ßG7é®6>úý€ß¦¸ØûëöÎ>ÊZkåÛœÛ}vRÓ_.ÜæÛèÆ¿ìœE®ï£›ô×}~ÀoÓ\l}õûçe-5òíÎm¾Œ;)i¯—nsmôaÃ_öN"×wÑÍúk¾¿`7é®6>úýó²–šùvç6ßF”´×Ë·9¶ú0á¯û'k»èæý5ÆÇß_°ô×}~ÀùÇÙKM|»s›o£ÊZkåÛœÛ}p×ý“ˆµÝôs~šãcï¯Ø úk¾¿`|Ù©é‡L´øéyìrú’¥e"CMÞÆ}öÿPÇvyÒç-fó,û•tWDâ§Jk¦¨Ì>›ïÓ\l}õû¿Mq±÷×왞t¹ËY¼Ë>ÀvyÒç-fó,û¼Öäúo¿Mq±÷×ìý5ÆÇß_°>dvyÒç-fó,ûÙçKœµ›Ì³ì3“é¾ý5ÆÇß_°ô×}~Àù‘ÙçKœµ›Ì³ìg.rÖo2ϰÎO¦ûô×}~ÀoÓ\l}õûæGg.rÖo2ϰžt¹ËY¼Ë>Às9>›ïÓ\l}õû¿Mq±÷×왞t¹ËY¼Ë>ÀvyÒç-fó,ûÌäúo¿Mq±÷×ìý5ÆÇß_°>dvyÒç-fó,ûÙçKœµ›Ì³ì3“é¾ý5ÆÇß_°ô×}~Àù‘ÙçKœµ›Ì³ìg.rÖo2ϰÎO¦ûô×}~ÀoÓ\l}õûæGg.rÖo2ϰžt¹ËY¼Ë>Às9>›ïÓ\l}õû¿Mq±÷×왞t¹ËY¼Ë>ÀvyÒç-fó,ûÌäúo¿Mq±÷×ìý5ÆÇß_°>dvyÒç-fó,ûÙçKœµ›Ì³ì3“é¾ý5ÆÇß_°1xš¼¸Ô‰s!Ó^ªÉDu6Ô(Ž%.<¥šKbž6ÐD\&f®;ˆþnvyÒç-fó,ûÙçKœµ›Ì³ì3“¶ºïÆ_É=ÎtïÌ 6*—Œ±JhôóÑÍ^šÛ5Ê|Çd¿P‚´6Û2›qfd‡ÍGÜ¥\gÞ°ãîÏ:\å¬ÞeŸ`;<és–³y–}dËè¢C,ÈŽ¸òYiö+-§PKB‹õ¤öùáÙçKœµ›Ì³ìg.rÖo2ϰdœKèM6N¦4¦i”Ø0YÝH‰ ¥GúÉW‘ó·³Î—9k7™gØÏ:\å¬ÞeŸ`DQˆÄ"")ŒC轞t¹ËY¼Ë>ÀvyÒç-fó,ûvÊrú$çog.rÖo2ϰžt¹ËY¼Ë>Àm“/¡fœ~•-†“™ÇZWµÌÒdCóQbS0&¢ÕœiÊ… ŒÅ8äC%’3KM¥ÌªBRf“SI=¼E°‡ÏŽÏ:\å¬ÞeŸ`;<és–³y–}€Û=U4Õª2ú=¹i>QóÜïXðÍÃX6}^™V©R˜©N¤È)T÷§Ì‘$ã:De™ÂV^=œ*Cj÷M Óó¿³Î—9k7™gØÏ:\å¬ÞeŸ`D[ˆœÄB´Û¢ŽtÆM÷é®6>úý€ß¦¸ØûëöÌŽÏ:\å¬ÞeŸ`;<és–³y–}nkò}7ߦ¸Øûëö~šãcï¯Ø2;<és–³y–}€ìó¥ÎZÍæYö™Éôß~šãcï¯Ø úk¾¿`|Èìó¥ÎZÍæYö³Î—9k7™gØg'Ó}úk¾¿`7é®6>úýó#³Î—9k7™gØÏ:\å¬ÞeŸ`9œŸM÷é®6>úý€ß¦¸ØûëöÌŽÏ:\å¬ÞeŸ`;<és–³y–}€ær}7ߦ¸Øûëö~šãcï¯Ø2;<és–³y–}€ìó¥ÎZÍæYö™Éôß~šãcï¯Ø úk¾¿`|Èìó¥ÎZÍæYö³Î—9k7™gØg'Ó}úk¾¿`7é®6>úýó#³Î—9k7™gØ#©Ïé+IºD<3UÒ-b…é$ôf#šÈÛ±ÚÊEŒŒ¯ÅÞg'tN©3!“I­”Ø”e”ÖffhRH¶¤¸Çñøs ÃIô›ë±Î#þYñ‡›áû""þ„(šKÇ5\=Œñ¶0««A‰"<›ÄŽw”§ÉHÊLªäEs>µÎ#¨åÉÞð¯ d©´­ÝDªÔ‘g©ÉiÕ1“Ý´¥êÔ¼×Ù•jh­m¹øJÛq³½á_@Ìຜ*]k5Q2M’ñf%„’œÕ¸ƒNd’ŒˆÔ“ʲ#2+¤‡öõÖGMýý:œoŒ²0TÒ¦°ìMÑ.c›ˆœe Ò¥6û­¤ÔkÍ}SI]ò岕˜Ó”³ãäajÛ,¸ùÆeÖQrMÖ%4ê ´­(Q’£%MiºHÌÈŽæVÚ%Ô#ƧÔ+“×j]JªÜ†š6›q¶ci±ÍWt¨Ò™HÊ•$Òy g 31Å-Uº*ä™ÔXÊ™­5E‡L55% iâCQû“^DìZ”{I;m¿Îw\ÏGQŽ¨Ë˜+77q.ñI6c>–³§2“ ÐLå+÷JQ­%”¶–Û‘e;x1} b"T .±mëqåµ!›š}ÛJRot™^åm¢cWÒ&ûƦªIM‰=º¹Ê•*)¤––òÝe-\ýÚ!û_aY®-˜ Õ©Š´i†VDÜRnL…Âj"¥;j7M–ŒÐƒÊ¤§aòf=¦bÔÍyçª)Ç$lG0ßàšu~‘LzErT9õj”ŠtQO'YÎÓl,ÖëºÔ›i=zJä…X’fb?LÃUª”DJ‡ C¦²e*Ú|ÒWQ6…(”á—þ=»8DƒcÙ4,E\ÅF\ù®ÕaëM LŽû1›JÇîËTé’Œ»“RL¯´†cé™K¦Óc0óñ×CS…Ow­ê|§ŸI¾·£yìËŽ²7 »aˆÈ¯{ñ™®2ëD¢s0F%‰Kßá0–w+s2Öñ°â´ºMÍÃFU$ÍYl[okªoâ—„ÓTö\zd†c¶Â&0§[qÕ[K¨%æg1™„’Ú$ØŽ·†)õê°§ÍVs D§*:lâ¡NR›Œáë‰ÃQ©¥£VVZlg°zhøÿ S1»Ø½ Õ—V©Ç—RŠq›Kq‰¬Ëp™^°ÍÃ52INd¢Ägs¾¼f!;hÏ9E¢`j‹ø>­ˆU6˜ÑÓd°Êã9PŒ•¨œe×LÊîç"BH›"5)F´‘fmdX¼I†«uL¢®Ã,-ÓRI´JiÕ¡I¶d8”(͵–bºVDe~ë¡Õ)HÁ•Ê IsYrTˆÓb»”ºFë ÈA6²RÓ•*×û¢Ìe—ÜÇ»Hø‚^D€s%ÍmO.UBd6c¾ù+&D/T£'MVzÕYJÏ´ŠÄ/Vìz•˜§nPðÀ|„WˆhÕŠ†ï(ª‚ßú3FÖc”é6ë¦ÙË/èÙpï·nR·tB0'ØGÓpÕ&…œ5 ¦ü9ÎO’ôÕ>“Kª4¤’Þ©ä¥IÕ¡>ø“+©EkÞ•ÍXþ•¨ˆÏ7‡F¸n*Ä4fdj˜¥Í¨³×9†[jq)pÙKŠÌ∌ýÊU·½ÞÑ£œ^¸K*|RiÈíJºª1’m°ê´:á—m³%'»YHÎÆd{b¬᪤ү¡¼34Žã2£“3! qJp²,µŠ#I‰V"Ìžˆ¨âÊtýÈÌ²ß 5M¤µt§¹z6áÎ¥w^à÷+–2¹íMÈ®v¦ê÷r_al´qŠfŠz·C5Mœäã2*‘™$©fƒRÜ$çÌGdÞê+(ˆÒdg™¬â ĬaÚ[t¦¤Sš˜´¡hŽË})h—ÉjmÃ";fͶ×1ií Å{ “d³‹QM!4­ST 5 £î|Ç5Do§28Sc=¦D¤•­ÇuÎθ£»Ç‹ôe]¦â:¬j\T»Nfl¶©æüèå"SLHu“4·˜”âÈÚUÉ)¾ËÚÆB761Æ8BF*Ãøá™•5ϊ쪄jz#4¤\êÓ$4ÛëÖÝ¥Yi3I!}ʈÈöÜi‘6ªªcú‘r)‰äêæÁã?‚ÚÿÏ/EB"%ØÏà¶¿óËÑPˆŒ]wû­mû@#Ô õÔ%ñèSLôHhQ»º‹i‘+:az›?tîg¨Òµ…[±–dD•[XÒ’²#µŽÊ+•ÈîFd"GQW´}ªR‹bi'qG†Z¦)EJ5±¨3,èYë‹1ªÄf«Ü“ke+Kôeñ×>©£zS†3±†ñu_úËTüÈ»¡jE6‡¥œsN¥0û1ÑJ£ªÏN‘)Ff¹Æg÷¢úȶp\Ìΰ— Î÷…}Âu& øȽcÝ;ÞôÛœ#ô—•|“§ò…‹sz'úfq‰ï³2õ1U|ÙMõòÿ‘zÇáÕ£ðÿ‘zÆ Å #{ý?££¤Oòˆ±D³'WŒ_À{þEë‡YŠ_÷oȽc¡mC.ï’tôô‰þW5 é×"ýÛÿt½cðë± þíÿº^±P¡C6îŽÕ=ám¤[ÿæŸû¥ëpBù©t½b6bƒ –é§¢cKm&ë†ÍHû¥ëqBù©t½b0b‘䮩މá-¥qÁù©u>°ë–ÍIû©õˆ©ŠO„yk¿\tO m+ëšÍIû©õιà|ÌŸºŸX‰˜¤yjÖÝ„ðv’î¹à|ÌŸºŸXuÏædýÔúÄDq×NÒ]×<™“÷Së¹à|ÌŸºŸXˆ€q×NÒ]×<™“÷Së¹à|ÌŸºŸXˆ€q×NÒ]×<™“÷Së¹à|ÌŸºŸXˆ€q×NÒ]×<™“÷Së¹à|ÌŸºŸXˆ€q×NÒ]×<™“÷Së¹à|ÌŸºŸXˆ€q×NÒ]×<™“÷Së¹à|ÌŸºŸXˆ€q×NÒ]×<™“÷Së¹à|ÌŸºŸXˆ€q×NÒ]×<™“÷Së¹à|ÌŸºŸXˆ€q×NÒ]×<™“÷Së¹à|ÌŸºŸXˆ€q×NÒ]×<™“÷Së¹à|ÌŸºŸXˆ€q×NÒ]×<™“÷Së¹à|ÌŸºŸXˆ€q×NÒ]×<™“÷Së¹à|ÌŸºŸXˆ€q×NÒ]×<™“÷Së¹à|ÌŸºŸXˆ€q×NÒ]×<™“÷Së¹à|ÌŸºŸXˆ€q×NÒ]×<™“÷Së¹à|ÌŸºŸXˆ€q×NÒ]×<™“÷Së¹à|ÌŸºŸXˆ€q×NÒ]×<™“÷Së¹à|ÌŸºŸXˆ€q×NÒ]×<™“÷Së¹à|ÌŸºŸXˆ€q×NÒ]×<™“÷Së¹à|ÌŸºŸXˆ€q×NÒ]×<™“÷Së¹à|ÌŸºŸXˆ€q×NÒ]×<™“÷Së¹à|ÌŸºŸXˆ€q×NÓ;ˆ+ªË-¼•%ÂQšÈˆ­c.ñþ±‚{—*¹VêíÛ‹qˆs\ë¨KãÐþ¦™èУ}u |zÔÓ=$;Œ`teñ×>©£zS†x`teñ×>©£zS…!. ï ú÷@8r&#ÂXú:©ª€„SÍö¥¶òÛ|“‘K÷j$í¹pN÷…}[¡¬aIÂøKÇ™TrF¡(¦›hs:žKo‘YH#Èd¥¢Æf\?¨~ÿRQz¿$ÌX‰Ýºœc>Õ=¹ãg‡—êóI°&ŒªX{GØúV3Ã0þõ)Ês¯ê$-µ!§ÍJA¤Ôh23Aßgq–ÑThTz…kâH®¬ÓIŠäu:©k•ÌŒ‰ÙntžùØ{ôu¤t·ñÍ7âzŒ©U i±Ln[H̳i䨒}Ñ"æ¤\ÎÅÁų)EÆøµBÁbZ´ÊUG©&†N¦Y ‘”’¤ìO½ öÛ¾]û„ÔÕå;7nÍYçTfi¦f<Î[bsË8‰žùèéNÙˆ~h“Gf“¨– ,ª4èhi©r™K‰Š¥4ù“¨Q‘šJÙUr±Ø‹¾B8±CÄø±«aÊÕZ3Döæ4%G­I)µ¶»ì2%Þ%‘ FÒv¨Ut•?É~šÆ"ŽÓYC*qÕ¶†]jÅ”$¬¦tdW>˜ÇU1ƦS´{„¨•gêÊešŒú‹‘VÕ¬é¨ìƒ,ÇmbÎÅ~"¸Ë¹V·õªÌOõc1Ž^gQŠO„xn%IŠEF)ú¬  ­Ôïƒèùxƒâ–W&†àî·£$̵ª²ÔW±•ȉµ®W;w®G“ÆËD8³ÔPŒŒ-_Že½»¤ž»ˆÖ¤¥)¶Ë*æW#+ˆæ‚ñõ?ÕªpëÐÝ™A­Å8“ÛkÝ‘m"QÊåe(Œ®[rà±ÈqlíP°=J3Öj$IjLöÖG o ¥¶Ûe#¹Úæd‰ôOJú=£âº–7e—*ô™ ©êÎã¦Ò&ID³+wFF³""Ù°ï³tÓ4o†Ó›´üE È\|:Ô¨ÔêuPã¹y.%N©:Ťԋ%=Ñ÷Dálî.zcMx¿b,£šU£º¥Ñ©fÅA½KˆÔ¹ªŽ›]I"VÔ,®“2ÙúÈm :bÀMu@±‰Û«¸ýÌ5½®JDGKTöé7v¤ÒJ2±Ò#÷Eúì%áJLm㥧B®SáUYiš“´59ÌÛÔMº§.ÒINršöVÞïg’N„w.35ÅÚ(ÇÇb:M5X´ƒ†í˜ËIºñf4©/r”’–£Û{•®[ Œ!z0Ñ¥3EŠ©˜Ò%2l×”ÔX,D\ÇÎÆE™Ô ËR›žÅ.Åm¼u€´Ñ´ÇEÄúeN}”…Å’ät¸m£Èq+lÔWA™d=›nEÄ,èHX èÖ 7ª“(U¨•4˨nHFãµVµ),çàJL);™{“ÙÝËÕt•VÒܦ1 ]F%£Çf›ho‘¸ê":ÒwAe<Ƨbî‹nði}Rèu­%Péx‘Òn—"FW®¼„£Êf„÷‰J$§ùÇCé*…©4ê´*æ…‰Deµ”ZÕ ,:ñ[Õ‘dSd\=Ñ™wŒs•E‡‰ IÄtÕÔ©wý.2R´&Gr½Ëi\Êǰt…/IÚ'Á´šŒœ=‰q-a2#©è3ë‘Ø3àJMÄ÷%Þ3έ—á¤±^÷§G8wSªÇS…WQ²ò 6¬â¾Eïfy•›jVW±{’Ù´K›Ð,·q… #0UIt³©Ô[\[î”å+,õŠ5(Ëø>æýñ!êN•µF®a,AOR!:Íe§V_£aÆÖ“23ïåIÛ¾D¾3úf=¥VtéPÅø†·]¢Ã}KLITµ$a%d¶•¥IVdd+(‰'s;ñ€õAÑŽ…Žp¤uãÚef™Pª",¸ÛLËBîyZ\|úÄ%Å'Wœí—9ì&h¦•[Ó‡ZØ&£;Î6NN‚PÖÓT¶Ë6V~MÌÙ»ž;í¸ôi/I8&\Ü6=G®JÕ®ÄÉõ–é§n0Úójò™Ìûž —Ið^ÃÕ#Iø&‡§õãê]aúµ>µrÔD'\"JJL³ÛYshŒíÀWáÙp×xãEñèø5X¿ b¨˜šŽÄ³‡-Ö£)…0îÂ÷*3ºndW¿ð’er;‰C©æŸFÂÎijS¢©øL*š²qÓNcUÈ–iJH“rQªçÝY=ÎÛZ`ÒD ¦‘A‹¤ZÆ+‘5ôšÐt–!Æi¤­+"]Ù'²4–Ô¨ˆûö-‡šÄÚMÁ:¥ð¾0[ÏCƒJ\y2·+Å‘ÃL’"ÈhÎ~ø¤F[Q€…MЪ›ÂøŠ|,_M¨UðÚ ujs /+D¥§bRˆ’­„›]&Wé†xJ\Äxò‡×Zc_ ÅR˜¶RZIÇÍICfi2ØA\ÈÆK cì' ³Fê«júåÝ;ÑþŽéîœû«/{‹ëQîòðþ£¶oDºCÀt,%M‡TÆõ…DDe"£@©ÓŠ[.¬ÓÀÂÒßèÑšæIRŒŒŽÇnñQŠpªa›ì>l:¦Ö%¶¼¦e™ -ŠIÚäeÂCpAÐ3Žou&~2§ÀÅU(G2-q–« ˆÎÊtŽÉ=‡r±û•Zö1©qˆ2ëÕ Tȧ Òr3ÿtѨÍ(þb2/æ8­9P*ñ`U]ÇÕŒ8¦¡ä›F‰Giç|¯Ý¶ó­)#3µ„ˆ½ÉÜšÀš.z·LÄ5ŒA\g Òè.›ä=Ož¸ŽÆ‚JLaØŽ×;¨¬F7cÑ£âMR©tì0§¥Ó¥”©NR“"4Õ7 £Ö8‚4·<ÊI©Ddj¿cÜ/VÁ˜ßã¬ÊS5ú‚ªLOÜÚõ¦´¬Éim$W»h=„”Õîv ‹úLÑÓ8¿ER W^:fƒ.<Ž â[¨ˆi²QO1™¦Ç“1¶€¡`4cŽêUª•:5œE",Š›‡ Ì’”´Ó$£îTYL²ŸrOe3<† xOBåRÃôJ•{B ÉÄ+ËG†äe:©k–e‘"û-Ãî“ß; lq*ø3HøN©ˆ]¥¢·ˆäTàÌ(.¼—ZS­­ÉÈÏT^êÖÍú¬.P1ö+¸{½Škhõ<¤š#· o&a ‘”’¤ìMõM™æ·ð‹¿pl¡YÕŠ†1§Vk¬Q$át Þ5G7Zt”—J͘)ÊÙìgepl°×š6Ÿ\“W*Ä̵3J:™×¤ŒÏ"ŒÍ632ÛÄ7e#Jør¢½.Ôª’UMÀC¨êekS™#¼ÒHÍd“ÚÝîdWWÁ @üêM¦á™4|qTÄÔJeMŠdxòæEmíZI2¼¹ÈírI^ÜEÄ$zÑÝ •¤ŒWÑ ÏŠUS¥Ó™£ÞÜ“˜’¢2¾©ÛÿˆÆ·Ð¦.ÃØwi—Y¨nY•šQG§·©qzç5Rk¥&IÚâ6¨È¶þ£Êv˜p³ØG¦T73pX}ü@öæpÿÒŽçA™LÖ{-tßb‹ˆÀBœÑƒ5ü]k2j°°Æ¢V%2äÌn%yD–ÛiØDi+¸RDF-+B“›Ò] ¹]atÚüw$@«0Á­.! )Ï{5݉ٛDw>ž¥ãüT¤\^ªÈ§Rq qúŒ £QVég’¤ælˆ—·VÙÚÝó#°É#J¸5:UÀ-ƘûXc Á~&ø<Âó:kŒm²$Vî. ÜÏa½_BL±BÅ3)ÚZvS‡>qŒˆNc¹¬ÎÙ²¥Fi"2##NmƒO é…±ö…Ù£uU²u˺w£ýÓÝ9÷V^÷Ö£ÝåáýGh…qØݹx¾«Hy…°òЉÉ™‘“„…‘™m³mŒíÄa/Âtj;ýIؾ´õ* •Hõ†Ûfjã ßm¸—J\2ÌEÝ+aðŒÅªÎ„·»L´MuÍ­ßH*—»·µV'.¯Y·ÞxsºàÙ·+¤,c£J.ˆjG“*$Ug&SîÈmI&l¤(ÊêJLýé ""=—3;ðÌÒNŠªºRÃZE™‰fÄ™œ¨ŽÁÞçT–htó-d[KôªMJ¹šOa€×Ý Å‘‡±Ujn3N‡koÒÞ[ðThq )nÝ+3#2^Ä*æDWÛriwG+À[Í)ŠÓšef1ȇ)¶M£Q$Îé3;–ƒ#¿¼&õÜ}„äè›IT6*Ùª¬Rôú{;Ò×0§ØY/1¦ÉîP£²ŒgÁi³aìG€4sK£T7TÊ5(ãÔÔ¸Kš¨éµÔ’%mm{Rf[?YÉhn“A¤hƒi&­A§×$A˜Ô8Ñç5¬e$jh–yOa™ë‹o{.Îz¾Œðüªz]ˆ1‘C~.ú»Ä’™JHœ#FUl4šÐ[e•n ‚¢,_…Q£ŒC£ÌaP~•§!¹mMn:ž$©*lÔ“JvíÕ"Çn>ýÝ"ã, ¤M3C½W‹†[Š˜lIˆ”“Å”ÍDµ%IWrjRö^ÆGÆ@)ꇣÕc5H©«à¸4WÖöᙆ™$¡òQ•’ò‹b”D–+m]¯ÞüêuôiÐñŽ+¬Ó#U‡)J’ÄI)ÌÊÜ48¢5'øEfŒ¬+èi_anÆ8wGJ¢ýf-.Bå=Qv2˜Î£7 ’”«oýê¯ô{É |gCÃ¨ÄØ>ôJV#§*#’ÚhÜ6•i%Ki•œW~ß̽£ì)ZÒ>Œg¢™™MÅNTÈQ¿FÎvÙKÆ”‘{’Vt¦ÅoùÅ­0áj OFX›ÂÂÐ0üÌ3ˆ§4¨ljŠTbZ%,¸fnæÿÃúÄoH˜÷ Õ1V¦SjUbÃø^3q÷Ê"52 DHIºÚVGkjÐv2¹ØËˆÆSLzQ¤Ô43 R±]G=Rœ—Ü™*F(ÑÑ”ÐÎRJIJÌ’3Q$ˆîgÄ_Upf€X-hÇ4éi¯êΤM/H%j³k,áÜËX¿tH÷³þmƒ¥Ü;©ÝO¶†—PýlÚß9 ¤¥IJJBf«\jlŒ“°¬E²ãXch8%=…k3§Õ$EÍZfB ‘ìžT¶›–cp¶½Émã–bl]‡¦u4a|¡ž¹ª¹bê\,š¤™sNC÷Äl#3ÛúŒÓÀ¸/1@Ñíü%O«#SäH¨ÔhÔüu¥„º’C…µTiÙosÇq¤â`::äã˜õ_ ‘# -äD$‘ž¤´¥‘ZN÷m%°•µe³chŸIXW àúBÞÆø*€N®N\TºÜ‡ &I&ž$Fó«*”{{Û.zμˆÑŒë¸Ê±6Zxœ—Hb2 MȽjÍ =Z¬œú²ÚiØ£Ûľ¦\D—Z§Vñ|V$³Suè´h2'%m´¥ºò’­†„M%°Ë2‹ˆxðÆÀstÙ‰#bYš<|LPi´ˆ­’JQ»)Äv{–IMÈ­°ÈˆËa³Dšjf!ÃPqM Ä¥RbDUSMqsBYRS•d¥•bVTØó+a\FkøÚ“WÓí?nje>‘ ¶Û›¢55¯aÍÐêv©N©'uˆÎŲà<½Rê}+Lõè¸1`ÃksêØŒÒ[mŒÑ’’"+™™ý&bö‡ëX^™ \7°bq>,Ÿ%¶iKŽ—¢%&i#%$Õ|Çum±ð'iǃOuúN'ÒÍj¹C—ºéòu—µjFl¬6…w*"2²’e´»ÂOÔçYÀ¸_}kÕüFÕ.¾mª5,ݧ½%1ÉIîž2AXÌï–ÙˆìJï ñh×Ïê¡v‡ K…J*„Êz}é/æ$’-ÞM–Úòðm·ÁÆøVŒ°Vñ}*‰€ýz²T™LÓÚ&Ú2[Î!*$ð–¬ö÷ómà!‹ÀØËhÿM%_N-‘‹iõ(‹EJ¢PŽâqy¸YÝV4!FeÞQ‘ʬu¤3HÃ8/ `™ÏÖ"áÚžú.[±ÔÁ8á8¥¡•mþîvâáïóàüQ£iSpµ2˜ö ƒT9±ÛÊû™˜SÊ'½‰2Û~ðÜ £ØT܆…ƒð¶"›Z§¹6iV$ê¤=™ [mÆ<ªÊdJÚv"ÙÂFw,6:Òž:4ªaÚŒÉuœcḕ&)¤xkê°€}u |zÔÓ=o®¡/Cúšg¢B$‡qŒŒ¾:ñçÕ4oJpÏ Œ¾:ñçÕ4oJp¤%Ás½á_@¹Â$“½á_@¹Â?RÞôxøË:çž¶b… ÌP¡óz…©è¡BÚ…Å jZ‡X[P¡Bµ 1o¯ Pb³ɺ´)1H¨Å#:âaIŠO„Tb“á‰Rb‘QŠG†¾«(7×P—Ç¡ýM3Ñ!¡Fúêøô?©¦z$"HwÀèËã¯}SFô§ ðÀèËã¯}SFô§ B\;ÞôÛœ"I;ÞôÛœ#õ-ïGŒ³®yëf(P¬Å 7¨ZžŠ-¨\P¶¡…¨u…µ +P¡Cúð Å+1AŒ›«B“ŠŒR3®&ðÃJ¸…EÂB±Î‹ÜŒÉ3…“B¸‡æ­|_´_äûsëŸÏ’7ÊÆ­|_´5kâý¢øðë]çóäo•Zø¿hj×ÅûEðµÞ>FùXÕ¯‹ö†­|_´_ðë]çóäo•Zø¿hj×ÅûEðµÞ>FùXÕ¯‹ö†­|_´_ðë]çóäo•Zø¿hj×ÅûEðµÞ>FùXÕ¯‹ö†­|_´_ðë]çóäo•Zø¿hj×ÅûEðµÞ>FùXÕ¯‹ö†­|_´_ðë]çóäo•Zø¿hj×ÅûEðµÞ>FùXÕ¯‹ö†­|_´_ðë]çóäo•Zø¿hj×ÅûEðµÞ>FùXÕ¯‹ö†­|_´_ðë]çóäo•Zø¿hj×ÅûEðµÞ>FùXÕ¯‹ö†­|_´_w©ïG8GR1m[Ôª´øT§!-%fÍ/)Å(µš¬M‘$¯Ãðs»£³j‰®©œ~~ÉŠ¦ZoV¾/Úµñ~ѹ4…@Ð,,:N ÆÕú•y½ËK*Kn]Ä’îg5º-¤\<уñ&&¯P¤bJ%V©“Š9ÑÖÚ\$êV¶ÕcÌiJ””‘“cͳ„‡/ÐÓÅ]S1ñåÿg-7«_í Zø¿hÝ2tOê/U—‰'T)˜¥tJl’• 0Ïý!–—‰JK¦áë=ÒRHº“ÀD«yú 45/F{ß6²*g›m—gº¦Ñyj7LÛKdy‰9Gs¹píï6tµUîœÏÀÍM=«_í Zø¿hښьLg­ˆñl¨xbŽEºåHÖµ_"o°¬V¹ØøRDG}™=+hÓÓ0$|m£ìfuzj¤nw#ÍRRùªö3AeBŒÈÌ®“Mìwà64Ñsôó9ÿ휜e¦5kâý¡«_íM:Ç´š½?®|/5Šc³¢G¨³#Š'ž&É-™¬ÓœÏa_a‘ªÄwŠ_SÉÖªXÛp³\§±Fm,Ò¡Îz*äÉ–¨©wVâÛY¶”’–ÖÒØip¶‘¥V­V´”óßþcóÖœÔçMZø¿hj×ÅûFÐÆZñ\…"Æ–jÛ¿Õž±ÐÍMg«_í Zø¿h™â cj#¦áêÅø•›Èfâ ­J$’Rá(Ѥ‘÷[.W°ÌMÐŽ•!±9÷ðtÍ\»Æ‡ZY™e%w•¹°ÿ›mË„Œ…§K¦Œ__Þ Õ5¦­|_´5kâý¢kŠôgŽðµ šæ ÃràSÞ2J]Y ò™ðÒ“5 ÏÿȆ´šxw®´fî N»6±½fK^ú¬ÚÎ ¾ä8]63¿üÁºZëV¾/Úµñ~Ñ|_µÞ>Hß+µñ~ÐÕ¯‹ö‹àk¼þ|ò±«_í Zø¿h¾áÖ»ÏçÈß+µñ~ÐÕ¯‹ö‹àk¼þ|ò±«_í Zø¿h¾áÖ»ÏçÈß+µñ~ÐÕ¯‹ö‹àk¼þ|ò±«_í Zø¿h¾áÖ»ÏçÈß+µñ~ÐÕ¯‹ö‹àk¼þ|ò±«_í Zø¿h¾áÖ»ÏçÈß+µñ~ÐÕ¯‹ö‹àk¼þ|ò±«_í Zø¿h¾áÖ»ÏçÈß+µñ~ÐÕ¯‹ö‹àk¼þ|ò±«_í Zø¿h¾áÖ»ÏçÈß+µñ~ÐÕ¯‹ö‹àk¼þ|ò±«_í Zø¿h¾áÖ»ÏçÈß+µñ~ÐÕ¯‹ö‹àk¼þ|òóšEs-‚‘}ß{1`gê¬Óf¸¦žËS9y–úêøô?©¦z$4(ß]B_‡õ4ÏD„Iã|uãϪhÞ”áž|uãϪhÞ”áHK‚ç{¾s„I'{¾s„~¥½èññ–uÏ=lÅ ˜¡Cæõ SÑB…µ ŠÔ0µ°¶¡B…j(bß^ Åf(1“uhRb‘QŠFuÄÃð¸HV(½Žã÷9~±®SM<åB kÄcóZž#M¨þäm•Àõ©â0Ö§ˆÃгíep½jxŒ5©â0â¬ûFÙ\oZž# jxŒ8«>ѶW[Ö§ˆÃZž#*Ï´m•Àõ©â0Ö§ˆÃгíep½jxŒ5©â0â¬ûFÙ\oZž# jxŒ8«>ѶW[Ö§ˆÃZž#*Ï´m•Àõ©â0Ö§ˆÃгíep½jxŒ5©â0â¬ûFÙ\oZž# jxŒ8«>ѶW[Ö§ˆÃZž#*Ï´m•Àõ©â0Ö§ˆÃгíep½jxŒ5©â0â¬ûFÙ\7Ô;¾;Ѥèܻ娉¹7VmN»,œšÌ½ÖLÖ½¶ÚöÁ­O†µ¦þÐ Ê>(Ñ,Ñ4ÊÄZEJ©! =%YPêËTy/ô²œ6Q™ØÆJz!¤hã·&¹‹cÊÅoÈJY§Ã²šÕÏ1öÜÆDW±[¾4Þµª­EÖ¯P•Ó–HÍÜÝS—s·ëÈŸù”)•Tô“§Œ; m.©T£Cju8”)Õ=hÙs"¶e Œø åqÅÔñkSÄcÏú6vE?©Ò1Ó÷‰ÿ…³=C8ÚÃMº1:ëD–©xÔ·s{dµ&f°¶l?r|"½>Ðq;•ÌeŽàãtü+R¤0Ôu&RVšŠI(#Œ‚#3+¨–«‘XóZö5[–õ©â0Ö§ˆÅé¢Õ5nýHë>®óŸÉG>ÎÑÐmK¢` ETzÞ댦&U*U˦›ÊÜ8­š¬›¸£Eˆ¯°øÊѼcغÓCO4¦”xáå’TVîU&"’A¤ÈËõå-jxŒ5©â1Hµk~ù¹ë‰éÚsÜÌã£bu>¥Õé6cc4áfÚÊ<åÇKÍ­{?D´©IM”Wá>"µÌ‡Hi‚ Õ¢ @ö–•„©·÷Že5+Kî;cɱer3V[’ ÊÙ¯°‡ëSÄa­OŽ·âÕÛ‘_êc·?äŒÄc¶ÐÃT]&`<%X¯Êm4}1[­NÞFKf¶ŒÿQáù¥ñˆþ‡qž'Æ:LÇ•Jk4 ŒjËdOѪ“ÙqÒKCm²¢J‹2PyUšÅÝ—ÒZÙ:X…MÑtœ…p‹GjL4Õ^¤Só“ )"Q’TE•Ýw$fDJQm¸ÖZÔñãE6ªßº¬Dôý£9õwŸÝ<ù:úd >êŠÑ±oôöR¸²µ´z…På"’¥Æ4!´)J<¤¥$ˆŽÇ­²ÃóGL7†tÇ¥J ~,tÔ±=2Ó‰ØÊÝdÙ:“3mKΞè¬gmƒµ©â0Ö§ˆÅ¦Õ©§sÕóŸÏþQ™ìëLi-Ê|­a)xj“‡\Š!=uõÔeÇk]e%wlˆ’f¤™±\DV#Ë%ÁÒå;Õ£c9!Õ2Õ¤¶Ù¨ò¤²ÃVÂúV£ûGÆ8›Zž# jxŒDس4ÌoëÌç<å9žÎ†ÂòäÏê.Çrf>䇕_Bn(Ôw7!¨ÎçÆj3þsmP*8—*³Œ*hî±F»XË Wœiµ •}RÐdƒ=½ÝŒ”ž#Iì=­O†µ©£zS†x`teñ×>©£zS…!. ï úmÎ$ï úmÎú–÷£ÇÆY×<õ³(Vb…›Ô-OE Ô.([PÂÔ:ÂÚ… ¨P¡‹}xPbƒ˜ ÆMÕ¡IŠEF)×e;2ªÌ0ú3¶¬×+™^É3ï VðR<ñë¬/ðìoµè˜œŒESrZ¾·é ø‹õη¨þ ø‹õŒ¨2X®·¨þ ø‹õ‡[ÔüEúÆTbºÞ£ø'â/ÖoQüñëPŠëzàŸˆ¿Xu½GðOÄ_¬e@+­ê?‚~"ýaÖõÁ?~±•®·¨þ ø‹õ‡[ÔüEúÆTbºÞ£ø'â/ÖoQüñëPŠëzàŸˆ¿Xu½GðOÄ_¬e@+­ê?‚~"ýaÖõÁ?~±•®·¨þ ø‹õ‡[ÔüEúÆTbºÞ£ø'â/ÖoQüñëPŠëzàŸˆ¿Xu½GðOÄ_¬e@+­ê?‚~"ýaÖõÁ?~±•®·¨þ ø‹õ‡[ÔüEúÆTbºÞ£ø'â/ÖoQüñëPŠëzàŸˆ¿Xu½GðOÄ_¬e@+­ê?‚~"ýaÖõÁ?~±•®·¨þ ø‹õ‡[ÔüEúÆTbºÞ£ø'â/ÖoQüñëPŠëzàŸˆ¿Xu½GðOÄ_¬e@+­ê?‚~"ýaÖõÁ?~±•®·¨þ ø‹õ‡[ÔüEúÆTbºÞ£ø'â/ÖoQüñëPŠëzàŸˆ¿Xu½GðOÄ_¬e@+­ê?‚~"ýaÖõÁ?~±•®·¨þ ø‹õ‡[ÔüEúÆTbºÞ£ø'â/ÖoQüñëPŠëzàŸˆ¿Xu½GðOÄ_¬e@+­ê?‚~"ýaÖõÁ?~±•®·¨þ ø‹õ‡[ÔüEúÆTbºÞ£ø'â/ÖoQüñëPŠëzàŸˆ¿Xu½GðOÄ_¬e@+­ê?‚~"ýaÖõÁ?~±•®·¨þ ø‹õ‡[ÔüEúÆTbºÞ£ø'â/ÖoQüñëPŠëzàŸˆ¿Xu½GðOÄ_¬e@+­ê?‚~"ýaÖõÁ?~±•®·¨þ ø‹õ‡[ÔüEúÆTbºÞ£ø'â/ÖoQüñëPŠëzàŸˆ¿Xu½GðOÄ_¬e@+­ê?‚~"ýaÖõÁ?~±•®·¨þ ø‹õ‡[ÔüEúÆTbºÞ£ø'â/ÖoQüñëPÄ4jlZ;ò#ÆÈâråVu®¢.ùˆˆžâÏ€$ýL„úêøô?©¦z$4(ß]B_‡õ4ÏD„Iã|uãϪhÞ”áž|uãϪhÞ”áHK‚ç{¾s„I'{¾s„~¥½èññ–uÏ=lÅ ˜¡Cæõ SÑB…µ ŠÔ0µ°¶¡B…j(bß^ Åf(1“uhRb‘QŠFuÄÃ#…þö½‘ÂÿÆû^‰‰ÈÈÔùë@Îe+Tc¦SéS£QTã†ÛdœÌÒIjA’ó!%|èZ{“W¸3à23V¨ÇL§Ò¦F¢©Æ9 ¶É9™¤’Ôƒ%æBJùд÷&¯pgÀdg°=• sð¢S¤º¦ÔŠ„cÑ$ÎéI:ãVVÎÍ(ö_a—Ð^0Y¡=hÿašCˆÈMbTE¾ÓmÆoô­2ˆÄâÍFÙ•ÉR[á;žm„v3-ØGž®eŽŒ@àÐåØGž®eŽŒx«:Ñurê1ÔÃ.Ib*U¹™UÝ}ä2Òl–Œû§BoÀW¹ØˆÌHá ËFÐÆ‹«Ü—NާÙnKñT­ÌÊlë-—Se4GܸÚÓ~µÊädcÛØGž®eŽŒ€ï.Àz<ðs,taØGž®eŽŒ€ï.Àz<ðs,taØGž®eŽŒ€ï.Àz<ðs,taØGž®eŽŒ€ï.Àz<ðs,taØGž®eŽŒ€ï.Àz<ðs,taØGž®eŽŒ€ï.Àz<ðs,taØGž®eŽŒ€ï.Àz<ðs,taØGž®eŽŒ€ï.Àz<ðs,taØGž®eŽŒ€ï.Àz<ðs,taØGž®eŽŒ€ï.Àz<ðs,taØGž®eŽŒ€ï.Àz<ðs,taØGž®eŽŒ€ï.Àz<ðs,tc‘ôùF§aý,Vhô¨è2c“hIÎ;jQض\ÌÌöq€‚€˜OÀ¨ƒ¾«áö÷ºaB•ÜL=[Ǭ²vGÛïNm+—sô¯®SŸ£Ö§Rd©µ¿ K‘ÜSff“Ri3#2#µËˆ„EQ#Æ=”:sõŠÔLe6‡æÉn;jpÌ’JZ‰$fdFv¹ñ‘ãÇ/@)†ŸezÌ͸‚RNͨÊä{8HxrÖt1¢ê<6åÔc©†\’ÄT«s2«ºûÈe¤Ù-÷N8„߀¯s±˜¿ AÚ2šÊž†ËrZK®2¥´˜ËI-µšƒ2oÝ%iRL¸HÒd{H €îVt1¢ç«’¨ÇR§ÄŒÌ§ÚÜÌ÷ <§RÚ¯ª±ÝL:V#¹eÛk•ý½€ôyà æXèÀphòì£ÏW2ÇF€ôyà æXèÀphòì£ÏW2ÇF€ôyà æXèÀphòì£ÏW2ÇF€ôyà æXèÀphòì£ÏW2ÇF9—ª— Ñ°Ž Ò¨qS9ÒÐê씑­fóŘò‘ì”–Â.©Àw´¬Ú}M§ás"· %ž/÷E®³°G!°·šYöEw'Þ=g`ŽCao4³ì‡YØ#Ø[Í,û!º 88xõ‚9 …¼Òϲg`ŽCao4³ì†è0ààÍJ hò«r``Ì,óHôe+yÚMœeÕ4âli.¡E~µÊåc¾³°G!°·šYöCtpp ÕÌ(úD[ú]:›¶2%ˆQÃ}ËŽÌ’Eu¶™íþb".°•‚°;O©´à|.dVᤳÅþ蜘pHñë;r y¥Ÿd:ÎÁ†ÂÞigÙº 88xõ‚9 …¼Òϲg`ŽCao4³ì†è0ààãÖvä6óK>Èç.ªht¸‚•D¤Ò™m.¦ 41¬3KJºÍ$YiÚüî¼ÄäÃM€”‹>“ö=2!=ÅŸIû™ õÔ%ñèSLôHhQ¾º„¾=êiž‰’Æ0:2øëÇŸTѽ)Ã<0:2øëÇŸTѽ)—Î÷…}6ç’N÷…}6çýK{Ñãã,ëžzÙŠ+1B‡Íê§¢… j-¨ajamB… Ô(Pž¼(1AŠÌPc&êФÅ"£Œë‰†G ü;íz&'" …þö½‘‘©óÖ€ šU*aaœ(Ôœ9K©¬én(”䔩%»ew%ªu ¶Ëð_iíà¶I*‰Q¬à×L‡•D’¨ÐÛζô¿4ÙEœR”¬Î’6ÍVàØ ³êµJ„h±§Ô¦Kb"5q›yõ-,¦ÄYPFvIY)+qÙµj¬æ"G›S›%˜iÉ·ŸRÒÂlEd’VJv¸ ˆSh’F±Yµ×1™RÑ-n7e©MH7’Z´í"6ÍÓ4ÎàŽÛ‡ʨ¿Kݵò˜DMYJ£O`”ŠwéE¹J6#²xt)GÝZã]Õ+5zªZMR«:q4Vl¤È[™ õf3°ý[¬Î„ÔÕyò¢³ïL=%kmBLì_ÌD§Uñ;øO S¢U+Ã]Ó~;R6Ô†åI#Ì’;RÚR[vR]â!¯¡´ï~®Šõ*ð›5kµn£ÛwÓ˜ŠÉWx‹fÍ‚ÓUŠ»4·)MU'7Op²iGÆh½þCÏ*\©z­Õ%çõ-Mk5dAp%7àIwˆ¶ ˆÀê ÕePpý"¹)K•NÁUél0dg­[h¤-(Ù·i‘ó†æ(ÄxdêœJXÚøF]y«Çe·™ÕêÐJSvžÖ+)+2¿D®èûΦXðÛÑ.t¨­”¢k$wÖÍÖM-¦3¥*µò©M&ä[ Û+û’¶Â Ñðµto —JÝKÏ#qBC:å|¥dIf=§´øÄˆŒª¤ü?€§U¥é ÊÓµ lÈje­¥>é6J‘&— D–ÍÓQ$ÊêRÈŒ„%ÌK]¨·YÃU·+ª•^Â’[U\ ´îŠ»dh^áQµbÔŠä•÷gr¶S=½ `ØP'SááÚ,hu5MŽÕ=´7$Ï„ÜI&Ëþ{ÊfÁT¸ç™†èY3eFÜzsm¤Í— ÖŽÉIpášÓòTfecÚ$k,6æ%¡a÷1\LùÁV=—éB™“_v2ÍK4ku„n©dd²NÂ#Ií3ÈõÓˆ÷o\r§']ûÁÖîçgW©Ý{›>lºín¯ý&ùòäÙ–ÛFÊÜ”-Ǹ÷-ͺw^§sM~»]­ËkgÖþ“7~ê÷Ú,o>뇮-å¥ïÖL›ã¸‘ºrÚÙu¹sZÛ-pŒR½ 9I¬â:¤8õYÓáÒœ€Õ=èY[CªBPf“}¹-¥•­%6jB“m¤C3ÔçDM`íÑW™R×Qa:Ò–Ks$ã6Z”jЋ¡6;ó/iÝGÞ’E£aHµç«ñ¨”¦*ò•éíÂBd8\Jp“˜Ëé1z‰ÐÙ}Š%21©ªCè‡,¥×TDJqD’+¨ÈŠê=§bâ–cvGùÏì˜nÈÿ9ý“|Ùç?²a»#üçöLð7dœþɆìóŸÙ0ÀXÝ‘þsû&²?ÎdÀ_cvGùÏì˜nÈÿ9ý“|Ùç?²a»#üçöLð7dœþɆìóŸÙ0ÀXÝ‘þsû&²?ÎdÀ_cvGùÏì˜nÈÿ9ý“|Ùç?²a»#üçöLñÀ}Sÿx‹ÿMÿµhw®ìóŸÙ1Á]Sÿx‹ÿMÿµhVÅÅgëzø3oI‰MÁ.Oj¯W¤ÍUAMH“L†—KDÚ ´šÍÖÍ´©Fïžl»}ɃUZ£4§©-T¦7N}zÇb%õ.+gt¤_)Ÿr¦]â┺J• äÒêà¾e”ÜŒò›U¸®“#šr6&°£âª,F¬ë€O˨"3,L`Í䤥%¢qV3N­'ÝŒ–¥ì#¸¦,Ê’t¯¦¹TÝ*yq ¹ÉmL?!•HZo‘™™¬ÈÖƒ;™)¦Gs×ìÕª¬TΦÍNksÔfg%¨3>ÎGÚ-LŸ:dã.l™Ôd£}×T· Ë€óÞâ»ÏÄ›]«Öiòq*Þ(fî¶Ìwä<¥:iMÔ”/i–S4¨È¸Šü#óE¿íÝ;ú_ð–1’1 ~Döj+•7¦2“KR-jq²222JŒîEc>1•ÑCn;¤ [M!N8µ8”¥%sQ›k±wÌ[uF2ªVkÙªLÅ¥„i-4C$ŒŒUÙJ,¬ºÝj’Ú_¾|¹bOð†F¡ˆ±ÄÚ,I0j“uMÕëíMM0 &z™‹Pu–5h”Z¥6†Ó•f]Ùž¯mÌÌö,¼=ƒeÖ·îV£?U»g»]§¶§îÚ’¦ÏXiÍÜ©)2Û°ÒF\?*˜{Õa" SÑgEnC’PÄš{n6—–³ZÜ$©&Dµ)JQ«„ÌÌÏi‹ G;TKH,I¥Ô‘!ÂÔ=‰¸iqÚŠ½IÜ’·MYSŸôhQ÷WîR­ôÊÛ(mn­Õ%$Fâȳ(˾v"+Ÿê"!~}2Rý: ©—1$â¤ÉæŸ+K¹wH-c–Iì,êÙ´Ç­‡¡Ga¶$4Ói$!FT¥$V"""ØD]à 7dœþɆìóŸÙ0ÀXÝ‘þsû&²?ÎdÀ_cvGùÏì˜nÈÿ9ý“|qgVÇÆÌ©ÛÿñÙ›²?ÎdÇuk+JðGr:3f\ûà:†¡þ¸¿æÿ¡ ¤Ê«U*2I4*‘4—Ì蕇 M¾¯ô›»©»X®…‘kO€ìbQ[ÄÔ8µWã½=$ãj$¬’…(ˆìW+‘\¿`Á×*x»¢ÖاÕ#¤óS È#ã²eqÏÖ²ö"r„“OÂÔ(òˆÊ•5Škì>ˆË65¦¨Ê}HdˆÈ›A‰$KZ‹!«aûQ‰13UQª²*ñ*K­ït=[T÷ª2Plk‰*$8qZwÝíVÃJ/”ei2j8S¢&==4³NC„P ˜4ÞöÕäËk÷¬,ktq¼[ý´é¾mý…¹ï{ßW“/ê"4lQŠë,À£µY›O’œ\íD·Ø†ä•0šk’Œ–Mg`œ%X®Á]>é"ML•X•‹ª0ŸÅÎÄb…"RŽãóT m4³yÓÈFFµ8¦ÓªÈD¤Ã÷#Ýv§¡¤@‹Mˆ–^×´LSòÕj³•‘±Z¾âå·/sÁ°U2¥fÕ#Uf1O“P‰²4§`ÞgýÅš.Ÿæ0ʘ‚C]z6!{q«J†t³ŒÎ¥M?[r:Ì×—YœÃY,‹aSÚg·Äc~ðfåܿ蛟tnVãVMv·[¬¶[gÖwy¸sw\;G¯®ì=ãÁsÙËQŸ/ÿå«ügGeÔ?×üßô!ÆP7#H+}•fmÆMh;Zän¸dc­ëxš‡ªüw§¤œmD•’P¥Šår#+—ì=/H4™]&á“$¢Ô¡Ñj’ <«åCÉ~,‹… J”…ÉQÚÇc(íWJj¡‹ñ *"Ú©1D¢Å~2òἩӚp•IAä%šÈÔ¤ È‰W$ÆÄ^$«˜ÜÅHiRZmm6ñÆY­Y¤Ô’V[‘¡eßÊž"SYÁi•6RS ¤OBQ1Ò„yä%$d”¸yn²"3"#½ˆÏŒ@‰Dľ?R“:9ÓT#«”È–k5¥Q–ˆJYViI!D”¬Ô»/)‘ãæÊ­âéø>¥*»PÃÒÈŒªtV£šéÊM>]‰fëKÌé‘pûƒKÝÉp±3¥¿£ª[)f™O¤Ái/„¢=7V’tˆÈ–D”uc2¿ÓÕfèþ¬ÓíUaÓ'·$Ðo¦M;ZNš/ÔJAæËsµø/°¼rïUûYíÿ†Èèn»°÷Œ?Ïds—U¸óñ qÖ2½fUe2½ÑÃÛÂBiêKN€ºŠÅŸIû™žâÏ€$ýL„úêøô?©¦z$4(ß]B_‡õ4ÏD„Iã|uãϪhÞ”áž|uãϪhÞ”áHK‚ç{¾s„I'{¾s„~¥½èññ–uÏ=lÅ ˜¡Cæõ SÑB…µ ŠÔ0µ°¶¡B…j(bß^ Åf(1“uhRb‘QŠFuÄÃ#…þö½‘ÂÿÆû^‰‰ÈÈÔùë@Î{¥U¥3Vv›1ºsëÕµ-L(™q[{”®ÙLû•l#ïñ‰ÿ‹Š7Öõða.‚©Õ”#{7ɦзdä”te"±)nÄ$”i¹Ü¯Ár3#žYzõ•­ê„ö ÒãMžìiȦOLÆÓfÉ›‰Q-Ã%etû“QŸrGm¢Ö2§@AL†¨1b8s ¸ói³ŽLWšÊ£RVjZ.ß!‘w7,×IXDU"2~;„܆\ef„¸IZM&iRIIU¼i22>ù¶&zK©B~{1šÃôÈ®ª™NYIiÉâHá²d‚%:h±å+¤ÎÄW3;™â0ìhrh•R!¶ëñ`5&3æµ’šVêe³""Q$ÈÒꯘ€­m·E\²0`$µœAª2:¤oŒ¶df[¶”†Ói%‘/g¾­7F]–ïí:¬0ö‘¦`¸XyY]MÈ LÝN©ö—¬4$ö«! •m†›åþö†á¯¢£m6cª0äC”ݳ²ûFÚÓr#+¤ÈŒ®FGôΡ4š-—"]Ьš›KfûΡ,¶—VÑ%$Ú“Ý]µš®V4ìá¾^¿ ™úCi1i.O„Ý" »Ùi`’ÙAd’n:v$‘¦çÜ߀ŒŒÈÉ»˜‹’X~,—cIeÆefÛ¸“J¢;LiË f.¥Å¦À£Vw®”ÊŸ”ûOC‡QÝq–M*.í­IÌN™sßaZä3‘ˆKµj:©0 ¥ºœçdIfCˆqôµ­Z‰JuÃm¬‡Ý$ˆÎüaÆ·ˆPfÎ×î(r$îvTûÚ–z¶Óî–«Ä•Êæ{Kq Ð<**D\Še0+­J9k$š 瘳fÌ›’«—¼38åŠVrÒâãïeGZ–ÎÊ4n'îDg{„îå‘&Ri5š%NLJ+¹Æ›Z‡ZlÝCF•ŠQ滉24™‰[8-œTZ ^*ú°Å;yŠO%|«“V¯.mvlÚâ=—¶¬Œí~è7 z=†nöï–㑸uÚÓª=V²Ù²fµ³[m¯{mfG€Ý6ˆõzSÚÍÓ™Rw5•dwg±y‹nÎü5"\\zlÎ$Õ jÙ[ŠB z©žï!’Œ­}„dw¶Ñ3<„LÙŒ?K«â*玘*t×g?22¥•H%¥.:g””QÎÆ³<¹¶ˆ~b < L˜¨T Tˆ¹Ê`WZ”rÖI45Î+1fÍ™6+%W. Fè Q0»øÖ‘‡[ÃL2Š»4òuäÊ|ÕÉ,4£6®³,¤§/eç>½­l¨Í`š•J}‰ÒâÔb´ÂÖó¨%%Öß5!d••ÒZ’2Ë•W?te°7ê"¾¸.ÍKwŽÓˆik¹lRÉF’·ÒB¿åô ª0fÓf9 £D9MÛ;/´m­7"2ºLˆÊädA‰ Lèµ)TªSè RÜf¥ ¦‰¹.ºiK‘ÞÖ&ëQ‘¤ÖÉ,®Y‹1–c+ &' ™IM~¥G‰W9tÊ[§œ-Êe ›¸æ©Ä™f²‰)WºÊgr"î£w1¬Ò“R‰)#5؈‹iŒF]¦ÄDº¥:ö!×â­´+è3"#ZdÙ4Ú”ZŒ'uR¢¼‡™^RVU¤ÉI;Èìd[`’a÷j-@¬â*£ï.¸¯Å3yf{µ÷d’+û£BŒœ3ïd.ù•í300(õipŸ—:D6=ùö£©M·ßî”EbþqE.›QªÉ8Ôº|¹Ï’sq™SŠ·’Fvu2»AM5çL*|'"¥dD·C®X¿[‹]øø³´Õ*•R‡K=Tgq4æ\&ÎĦØ&õ$¨µŽÝ"ã·%QœeÄ>•ä6Ô“%¯k[†÷ï]V‹X¥%µÕ)3à¥ß{91ÖÙ/èÌEq:„pÖ†+µIQ)¼/ºó67”áL8ɱŸ¬¥˜ïou¶Ã /WPÂ&Õ TØôõUXDˆU M-)}hwTé=•’2'IW$‘XŒÌöZ7¼rçÊDH1_•!òe³ZÕôm0\ K‰:+ñd6v[O6hZ~’=¤$íÀ—BÂÕñS¯CaK‡5©¨^½KI­¥(Šêe»•ïÁÞ2¾S "<øxf]YåÅ:¡%ÓN±IjoPµ=([P¸¡mC Pë j(V¡B†-õáAŠ Vbƒ7V…&)¤g\L28_áØßkÑ19l/ðìoµè˜œŒOž´<é‚%aŠ Z<¬3GžÌgy>¹IY­Ì„£=[É.ÐVµ¬ž33;«Æœ– ª5)˜M@8)uL¸É¼§Œ”kp×}b³\”V±ZÖ ¶•Ìa%,ÓƒH¥SŽ—PÝð×›pÉ#εÈÍ´usîlFE°y+X…u*‚Å*›LŽãå!äCK„N¸D¢J:Õk×bM‹º=ƒ ¶n£ˆœL(Ò©›£PÌuNÕ¬ßSmR‚Ú£Bl”$®”‘™ŒÎç-®õ"CÎ7<¦¤2lH!&mºÙ™SÊdeÝ%&FFFFE´c€1AQÄY¦Á¡9“L‡ZaæÐ÷ú98HJÈû¥š‘Ü%FfJ^͇mƒ7ñƒ.ã ÄúDjD‡’ê£Ušaä=ªY»•šRK$žSV¯5ÈÌŒö(à€#l Í7*5=¸3)Tê£ ©JŽRÒåÙ5på4-&dg·*®W¹ÛißÛ/ΗZr©"›KZ¤AnÆ5K&e6‚A$Ô’Wr£oÜb-·Œ€°3•¬E¾TXô„Q©pcÆ’ä†N1:JA­)JÓu-Yˆò ¬DFE°_¨âù’æ•Aºm.õI9OÊe•’22V|êQU™WBI);í#±Z8¶n~"Sôשð©Ê[R '$â%ÌÏå;‘(ÜZ¬›Øò¦År-›YÂÕÙv¦ºŒH±qÝa³…)-ëhR‰$dFyT¢²‰IÚw#ÙlP# ÌÔ±¤ÓÜ•N¥°ò’¹.]ãOcqj2"3¾Tدc¶Â¶CÏ…… Ñ«GV§³-Ù‹’L-¤­j²PD•‘Y)¹÷®â¬gkœXld¹û¢™â„ÎäÖ~¦²ºöu_ôŠ¿unâ!èY60ÄÊ÷CZ%InB¤¨Ü×!M’‰$›,‘b%¸[R~ìø“lXrF&’´Ñw4(P¤0l4ëDâÔš”³ÖÔ¤Ô· Ȉˆó™ZÖ"üŸˆ”ý5ê|*E2–ÔƒIÉ8‰s3ùNäJ7«&ö<©±\‹fÂ@ @’+;×u;·E¥´ý= %˜é7Í“6RIiJ»†£4’QÀ¢#ÈW#º¯çˆ[f‹R¤•–¦'I)”©˜RR´¶H2vÖA8»f%_7ušÅlØHÕ“c L ït5¢T–ä*JÍrÙ(’I²É"[…µ'îω6Ì7pªOÌV¢­)íSÝŒ£’l©¶ÒHA™k®j$¥s=™ Ee]GÛó!©­ÈTV]B%› Í«Qß!ØÉYOƒaÞÝþø“Öq¹UT·$aL>—w2ã2´”“Lt)ŸÑ¶§´™f3.æÄ«®"@#?NÅRbFŠ…Ói²äÂ,°åÈiJv9\ÔDVQ%V33,éU»Ûš“^zR#ɇ©C„ëŒL%šM½–JB’¢VÓàVÛí¾Á‰Ä ÂñõÖŽ¦´FUÚ&1µú I')5—䨋¿{í½öŠkÅÏ„Üôø4ÈHs[¹âò­Ë[2”┥È®v+ˆ®cˆYêS’cÇ—Cz¹¤$Í·Sr2¾S%‘‘LŒ¸ö˜¿/Nz£\v£BDË;=SI¹™•”j5\Ìï˜ÌÎö=›3UB©ç`C¥Sil¾¤ªNäK™ŸÊw"Q­j2"=¹Sb¹Í…o ¥&•8¥Æ&ÔyÛºœÈq +) .ùÿ2±‘ñ€byÜQ12éÏSbB¥·N’Rã± 4Äi<êÖ)JQ÷)á3""±\ÅS±BÞjIC¢R)oKA·!ø¸KZUî’Dµ©(#à<„›8 ÈGÀ6ÀôSfɧObt75rY-µXŽÆ\d{ ¿Qì1‘ªâÌ€¨1©têdw\'_L4,µÊ+ØÔkRŒˆ®vJl¼ $¬ã U9&ª•JR”J)3£´´ºîb²ŽÆ³BMDgsJRgsã1‡Ýÿö&õî(_ë;£uj¿OîrêóßÜwín£Æ3˜‡·X§Â†š.žP‘ªaȪj&ÍkY õެŒn)Wµø öØ=bù.3K¤ÒU> Çb¡ª^¹(m$”lÏ«5$ˆˆ”h3Ø[vØØØÕf›>¡Ã|æfrk3ÌåUÿF«÷9¸†ä=x^ºš ï¾Tz}AÇ™[$râÈ…¶¶Ü$êÜGºJÌŒÎæ[-cp ±Mb¤ÂpÍCu ¡Òyr»–µˆpšNW‹¹%6“#;«fÕøD`H V,øOØôÈ@„÷|'ìzd @7×P—Ç¡ýM3Ñ!¡Fúêøô?©¦z$"HwÀèËã¯}SFô§ ðÀèËã¯}SFô§ B\;ÞôÛœ"I;ÞôÛœ#õ-ïGŒ³®yëf(P¬Å 7¨ZžŠ-¨\P¶¡…¨u…µ +P¡Cúð Å+1AŒ›«B“ŠŒR3®&/ðìoµè˜ØiÒæ¶§Ü„”«)ë§0É™Øa8´™–Þ[‡ˆk¼/ðìoµè˜œŒOž´2{ÅQùTÏ;DéCxª?*™çh(Æó¥“Þ*ʦyÚ'JÅQùTÏ;DéF0d÷Š£ò©žv‰Ò†ñT~U3ÎÑ:QŒ=â¨üªg¢t¡¼U•Ló´N”cOxª?*™çh(oGåS<í¥À“Þ*ʦyÚ'JÅQùTÏ;DéF0d÷Š£ò©žv‰Ò†ñT~U3ÎÑ:QŒ=â¨üªg¢t¡¼U•Ló´N”cOxª?*™çh(oGåS<í¥À“Þ*ʦyÚ'JÅQùTÏ;DéF0d÷Š£ò©žv‰Ò†ñT~U3ÎÑ:QŒ=â¨üªg¢t¡¼U•Ló´N”cOxª?*™çh(oGåS<í¥À“Þ*ʦyÚ'JÅQùTÏ;DéF0d÷Š£ò©žv‰Ò†ñT~U3ÎÑ:QŒ=â¨üªg¢t¡¼U•Ló´N”cOxª?*™çh(oGåS<í¥À“Þ*ʦyÚ'JÅQùTÏ;DéF0d÷Š£ò©žv‰Ò†ñT~U3ÎÑ:QŒ=â¨üªg¢t¡¼U•Ló´N”cOxª?*™çh(oGåS<í¥À“Þ*ʦyÚ'JÅQùTÏ;DéF0d÷Š£ò©žv‰Ò†ñT~U3ÎÑ:QŒ=â¨üªg¢t¡¼U•Ló´N”cOxª?*™çh(oGåS<í¥À“Þ*ʦyÚ'JÅQùTÏ;DéF0d÷Š£ò©žv‰Ò†ñT~U3ÎÑ:QŒ=â¨üªg¢t¡¼U•Ló´N”cOxª?*™çh(oGåS<í¥À“Þ*ʦyÚ'JÅQùTÏ;DéF0d÷Š£ò©žv‰Ò†ñT~U3ÎÑ:QŒ=â¨üªg¢t¡¼U•Ló´N”cOxª?*™çh(oGåS<í¥À“Þ*ʦyÚ'JÅQùTÏ;DéF0d÷Š£ò©žv‰Ò†ñT~U3ÎÑ:QŒ=â¨üªg¢t¡¼U•Ló´N”cOxª?*™çh(oGåS<í¥À“Þ*ʦyÚ'JÅQùTÏ;DéF0d÷Š£ò©žv‰Ò†ñT~U3ÎÑ:QŒ=â¨üªg¢t¡¼U•Ló´N”cOxª?*™çh(oGåS<í¥À“Þ*ʦyÚ'JÅQùTÏ;DéF0d÷Š£ò©žv‰Ò†ñT~U3ÎÑ:QŒ,yP©R£­èï))iF¦'F£J­™; Êö;\®G´ÆºÜYðŸ±éß]B_‡õ4ÏD†…ë¨KãÐþ¦™è‰!Üc£/޼yõMÒœ3ã/޼yõMÒœ) p\ïxWÐ#np‰$ïxWÐ#npÔ·½>2ι筘¡B³(|Þ¡jz(P¶¡qBÚ†¡ÖÔ(P­B… [냬Å2n­ LR*1Hθ˜dp¿Ã±¾×¢cfÒ0æ!«ÆTšM©Pa+4)رu$¢"3IšHÊö2;~²Ë ü;íz&76‡n­µ&­˜„Õ (ž’—T“=TÎäµHYßmö•¶Þ ãêç/ÌèràJ\YÑ_Šú=ÓO6hZ~’=¤? Å~tæ!EoY"C‰i¤\‹2”v"¹ì-§ßªcôzž$ÁøjCÝp°‰ûžKï­¥M¾´$›AÝ.eGt¢3·t³Ùn&“†*¸–‹EV’EY†Tú¦HÎã 3mIYȳ]IQ)9H±‘™.ïØB€HiSiØeºÜÚcUG¥Lr+,¾ëˆi²m ©jV­IQ™ëREÝ•ÃÞÌÒ©T×¢¼ý,ݦԨRç¦9¾²\e´ÛçÜ,Œ®yã³’‹*¶‘žÑ3V.Wæ<¦£7imÇL®EÜ¡µÞ$¤Ïù…*aôÆD•2á0âÔÚ4žU)$“RHø È”“2ïf.2Ú$Œ?Z}P‹ BˆãtÚ‹«u¹r™HŒ§ZY%N”•4wÚiQ,û„b¢©B£;oaúdÕNz ÇÜJ#ÕÅ<ýé+ÙD\²²ùMÂ}FƒD𯩫Á*s-È*Áë¤]Å2œÊ3=orf… Ó—)Ôe´¶œÆéS¨³!¸Ò×0ÒŠcm,ÒÛ&›’ÉÅ܈ûœ¦f}û„U‘!‡:šÚ®Ñ˜ªÄ«- ?›*]D¢Ê£IÞÍp‘÷Ç7¢š2D—t] ¨rJÚ–^[zͳq̪4ܳŽ×+ñ°ÑªŽxå>SÿüE©Kz„’œ­$“Ǻ¶‚7®UKI“0³ØŠ±[žëÒ—W¥" ¾—„îl­5¯dÈܺȖ’³vYç|Iþ ýwÈDŽ`ígãö¼°ºÒ6†)¸W×*íWS*U)¸ë[ ½¬±¼òP’WèÓm†£á¾ÂÙc#+é'Ót¢Æ‰¢ÝÝ»3;¤UƒDeÇI‘)å«Pz¼™’KNÓ#RH³gA«É¦_ö'J?þþ"D¥ÊÀ,€b±gÀ~ǦB'¸³à ?cÓ!¾º„¾=êiž‰ 7×P—Ç¡ýM3Ñ!C¸ÆF_xóêš7¥8g†F_xóêš7¥8Rà¹Þð¯ FÜáIÞð¯ FÜá©oz<|esÏ[1B…f(Pù½BÔôP¡mBâ…µ -C¬-¨P¡Z… ·×…(1YŠ dÝZ˜¤Tb‘q0Èá‡c}¯DÆÍY60ÄÊ÷CZ%InB¤¨Ü×!M’‰$›,‘b%¸[R~ìø“me…þö½‘‘ªŒÖ´2nªå½ °ÌXò^„ò^i·ódΩ3ʤžÃ±Úö¹m¹\ÑL®¦›ŠââTz{JŠòf%ÞS ZH²ž× ge*Æ»_õlpl%™_8©“tŠtª{ïå ýi¶ÊöØÐ¢Y8V#·»;‘ïbˆX²KÅÕ^¦S¥Þ›Œâ\C,²´f”kI—p¥•ÌÏÝû­¢<ˆŠu4ŠÌš‹4z{é}—Ù(ÏÚ¦êM $åp—©Fv;ðØÊº>"rŸMDiTʃm>¹Îck^¥Å¥ Q‘‰*¹6‹%sÁÂ0€)—>'9F¤ÖŽzªÊaù©K l£äEõG˜»£Ö(îi¹6“ïØ°[¿þÄ޽Šýgtn­WéýÎ]^{ûŽý­Ã´xÀ"}ÑŒr—¢øqë̓;ٸˆ‡™Ç éQmJŠû ¸ |ê›4›PáâD²ÃIÊ„&ŸÄ\ÞÓý}ñ#·pîE2¹¿“ñj½QDeÄaꊙ-ÎÊÔ…-K-¶žèÛlÍFF£È¢ö=ªÓèô5L©JDfs J¹š”f[‹ižÃ;xŒøqg}+r«÷|nŒ;;é[•_»ãtbMuÿ„¼mýÝßdk­(T"U4u¤Ùð×Gwz²/)¦öy{ ˆøHƪìï¥nU~ïÑŒn(ÒÎ15 E¹_Ýtù9uÌî6›*‰iî’‚2î’G°ûÂ"0œ à,€b±gÀ~ǦB'¸³à ?cÓ!¾º„¾=êiž‰ 7×P—Ç¡ýM3Ñ!C¸ÆF_xóêš7¥8g†F_xóêš7¥8Rà¹Þð¯ FÜáIÞð¯ FÜá©oz<|esÏ[1B…f(Pù½BÔôP¡mBâ…µ -C¬-¨P¡Z… ·×…(1YŠ dÝZ˜¤Tb‘q0Èá‡c}¯DÄäA°¿Ã±¾×¢br25>zÐó¤ŠÅŸIû™žâÏ€$ýL„úêøô?©¦z$4(ß]B_‡õ4ÏD„Iã|uãϪhÞ”áž|uãϪhÞ”áHK‚ç{¾s„I'{¾s„~¥½èññ–uÏ=lÅ ˜¡Cæõ SÑB…µ ŠÔ0µ°¶¡B…j(bß^ Åf(1“uhRb‘QŠFuÄÃ#…þö½‘ÂÿÆû^‰‰ÈÈÔùë@Î{¨¹ª³4È«i=›*œ3$•’j;ØŒø ˆlÁ:CñZ¼þŒE´[þÝÓ¿¥ÿ cè<Ä.áº%C§•J£&S0àB7µ[¡÷I$šì¬©"̵*Çd¡Gc°'ì¤?«ÉßèðNüV¯'£vxÅú«:9©RÔ¸‘«õU³::Ò•))*t×Tʌ˹Re$fV; Ë€Ì%¢úÜš¦‰0¶#®LB¤Ë Ä›:JÉ-¤Ö¸è[‹2"$¤®f{ˆ¿P2ì¤?«ÉßèðNüV¯'£] I”z®éñ)Õw¢·‡j59û® ‘SfÞ„M>Jy 3o+Ùi<‡´îyJÙ¶t‘ƒÜbkÎO™0ZKï”Êd¨Ê&T²A:”ºÚMm‘™]Ä‘¥<&d[@q·`!ø­^NÿF‚t‡âµy;ýí¬E‹°îylÕê%ÄFÝJI2· ›Ö!¤û”Ÿt§”¥>égrIŽÞ¬7^¦â+™MT¬ºm8‰0ÝŒëk"#ʦÝJV“²’{H®FF†ûéÅjòwú0ì¤?«ÉßèÇ{€ì¤?«ÉßèÆ)ýâ[ʦ´ëj4- qÂRTGc##FÃ!ô0j¼cŒé¸OÄšƒ‘ Æ•4ò¡vS«9oåB ûT|ûlDf"RäNÆUÏ¥sËöáÎ ©±N­´–¤?¤!%˜!­hÚJ"2;¡[ ¸¾:/iF’:šqmn:KKÞ‰ ̆·ÌÜŽ³lÈЫp¤ÈÎÇÀdI«[ã^ÔÍÿŽøDP V,øOØôÈ@„÷|'ìzd @7×P—Ç¡ýM3Ñ!¡Fúêøô?©¦z$"HwÀèËã¯}SFô§ ðÀèËã¯}SFô§ B\;ÞôÛœ"I;ÞôÛœ#õ-ïGŒ³®yëf(P¬Å 7¨ZžŠ-¨\P¶¡…¨u…µ +P¡Cúð Å+1AŒ›«B“ŠŒR3®&/ðìoµè˜œˆ6øv7ÚôLmì;…Ú­áz¥MŠŠÑ> ¨B!œr4¾JmÇ;—3\”IeÓË—m’Dfg³U8©xF€gðV)Ä,SYAajB]’mç&ó­(Gsr¹šÔ”Úýû÷ŒcâR¦Tê/E¡BŸS$šÔS7M{¤ Õ—e®W2.3|Àðö3Jª="Lvi³z#jvKhaF¦PŸt¥‘ÒEr¹ŸýªQêÔ¢hꔹÐIâÌÖ鎦ó—f"¿óGˆš„jâÙ¸σ€‡º—…ëI§»'לƒ)ä¥* f§“cR‰£2²•‘*2ú øÃ00@=ð(µšƒ~&|¶\{s¡Æc-iS¹sd#"±«.ÛpÛhóÍ…2 Å›Di(2%2óf…¤Ï¼i=¤'"À ³øc0JSøz¬Ñ%…HQ®‰³I¶gåîJåupÈS„¨Ïâ,OM¡Ç7¹²PÉ­ †ÚLû¥å.Jn£Ú[öŒÇQ‹N­Ä’ëul=]a(ˆôƒIBZV”¥'g ”[%š3+¼F}û,<=_šËáÔäµ!+[+j"Ö—ƒ²Í&E´’fDf\ÂŒì~•TbœÝIúlÆ¡8¬É[ &”®"Q•ŒöÏÔ+‡E¬M€ìøt™òb3}kíGZÛE¸s(ŠÅüá‘à $Ú-ÿnéßÒÿ„±ÝØÇž,Å´ÉUiR[£R£¸äfàÔdDsî Ã[*B‰)k:JÊÛ®]Ëa_„t[þÝÓ¿¥ÿ cnÑêºAªÐªµx¸Æ±ª¦jõ­*¨ù8¼ä³î ö;%µ¨îeb+ímZýLóÆ®ÝýŽªLELE6[jÃÔìDºÓ ˘óòQ®)‡ÑÌÆ»¾ú]º–fzÇ.ed’²ô|ùh.Žª’ÛCå†QE•"1š’•nRekEÈŒÊ÷2¹ðprr©¤ðŠ12ña1-1PÙÕÖ¨Í+2Yí’í­7¿ O`óÊ­i6,ˆ±¤Õ±{Ë2(͹"JTñ™‘ Œî«™‘lã¸Iöœx¨ìß}l駈ÓX¨ÊÃty°ÍB‘ ús®¾´Ê}q”‰•¶‚$‘±}]Ï-‹ºVc˃¥á Xj¸þ.Òúd<<Õ]2zfbiÕ$¸©F²¯(’†Ò½Z“‘ IÝI.îå—NTq’)Í2õB·‹!¶ùfeoÊÙ8\i3=¿Ì=tJÖ1¨Ó¥ÔÒ-B™+Í2¥Ê¨K<ËpœRH‰¤¬øUïnðžqœœ\gn\‚jr4O%uv™«V+ G47X5¶h†Â‹r2âYÛq(,æ²#R^qj±ÚÂg£ %v…C•½,[³ôXåPzqCdЂ&JCäN;Ý%jºˆ­Ÿ)lIaMsHÏ"Kð1(Ÿ:œÍ.4™JdÒÝJ¹ØÈˆ&yˆŒ‰Er+5Kc8•1:ìÄéÔ¼¶í"cÍ:YLÊËFsÊ­›Ss±ì¹‡=Î.;;HõíŒù]_ó“ÞÐuíŒù]_ó“ÞО ®èã)ìí¡§ªµÜOt˜Ô½UjÑ›™,ŠZ*PC¦rž3Ê—_JìWµÔ’ÚGk•Œô7^ØÏ•Õÿ9=í‚ÑÛïIÑõ L—œy÷c¸·qF¥-Fû†j3=¦f{n<÷ìM¨‰™v³~.LÄC_i𷋦h›G›£š::éR5’œ«ÓV–ˆg˜Ò™£ààIŸxŒö'V·Æ¼©›ÿñ¸týñ)Œ>©Ñ1§ºµ¾5à}LßøïŽ»ËF€²ŠÅŸIû™žâÏ€$ýL„úêøô?©¦z$4(ß]B_‡õ4ÏD„Iã|uãϪhÞ”áž|uãϪhÞ”áHK‚ç{¾s„I'{¾s„~¥½èññ–uÏ=lÅ ˜¡Cæõ SÑB…µ ŠÔ0µ°¶¡B…j(bß^ Åf(1“uhRb‘QŠFuÄÃ#…þö½§ ¦­ G•JäòR˜•Ê{©’–ŒÐ…!¹;MV¶Ãq²?÷Ò_Â+él/ðìoµè˜œŒ}Tf¥á³pÔÊdœy…éØU‡”ÜÊÌj”æÑÝ¥%dz’ãm¤ë›‰FgîF 2¯3¹D¥B–ºœz£ª¨ÁmµkÍ$„%»·îŒ¢xgrjÛkˆx6Ñ´(lÕ]Ætö¢5&Urš™ŠŽ“uÄ=¨’MšoÝVÃïY<;jj”Öf*<§¢³Y†­vE)3jA8y¸ j™#ýjEøHE6•*Ÿ>&‘؇.˜òdabe–hз:9´I"=¦zÂ4[å— U.‡[‡E¬PÊñë²Ê3¨‰Á!ÈÄn“ä÷YZ¥d2Ìd›ÚÛD(m3 è7‰ôIõV#Uõ®0i5:ÄRq¥%+.å4¾»NûÆ'·ˆËJ”J]Eª¢e*µT¨!d¼ÉY/X´Û’ G˜ËbLÏ€B@6‰•:nŒ±1î)ñÛMZyfl­$œˆ’KBÎÛ,µ4FGÀjI ³MK…3Ï©4ôU?Cˆ²¤¤Ð~²QGVelîsÇQy&ƒà°Öâì7Õ[2P†œS.%ÂC­’У#½”“Ø¢ã#Øa4‰Í6“‰iX3a‰ã¿•Rn“ye2?é“Ú¢"3#Qlî‹nÑÑÛ­±¤ 8ûÎ%¶›ªÅZÖ£±$‰Ô™™Ÿ¦£ˆŽDá£Ó)MÉ˺N"\Ìñæ$™¸µeNb#²lW"â!„8œ‰Ö Âx–!q©49í¼õ"§‘“dÍÓ-Èâò{¢#[ˆI•”j±\ÅË^FŒ°ú¡D¨rkÒ•4Òì뺸Ék)‘mQ©.’mÂiQˆ`'#hâXU©“Ji\)î6³-J-¤¦²¦ÏƒajIj#ù£-—DaºŠh3i4,E-áGBeÁ«6Ìx®¥%­5‘°­Oé3¨ÍJÛ|ÜCV‰J&“òŲi´zc´Â–…9 ¬µCA¼­Y2£Ê¬ª÷&yv‘È„\Z#H“h·ý»§KþÆÌÂÕæè”I&ƒJåo¤7Òˆò¼Ê’‡RgkXÉԤ˄É[8 k=ÿ·tïéÂXìš¾ÐÍ#ѰíF˜˜õ:Þ»{™T™fOjI&çtJÊ›Ó{Ìz,]¦ŒÅ^¼8_µUxš}M/Sr¡×"1âU©ŽÅ§æ7?Ñ£¦FrÍb#3S„g{\Ögn_¤Ö(ôŠ•,žÄ;êƒÄQjNÈ&]-ÎÓf¬æ¢RHÍjÌFd’Q~Œ¶˜Ü)ÀšV4<šbU](Q8¥&YÚ9-(5šóe#̤–[æÚGkmžÃz7äç÷Ù í:‹_»„iî~Îd‰XlðÄö'¹»%9V‰-,>k2u)D‚tÍI22¹©²;(”wÙÁrõSñ+0¨5„Â…K‰"\èkj"¡”¦I¶ÚKRJF²Ç™hÚg~èí²ä]#ØoFüœþû#¤Yš8Ѽ|qKÃ=ifÝôÙ“·FøÈ-^çv*2eÏ·6é½îVÉÀwÙiÔÛŸT¢4×#×|©V V‰O×’_:¬¹rm½[dKn9!D”‘ Šépˆ‹ƒˆˆÈXÆÓcTqr¡ ÍliU2¼¦Y§¤i\Œ¸GRvÑ¿'?¾Èé°Þù9ýöGHª·©DénO®ˆ®û èß“ŸßdtØoFüœþû#¤ã(í(á+ïD;£/‹l;ÿ¯ñœîÃz7äç÷Ù …½€j©i¦é¹B¦±"CàES¶Cî$ˆqÖ³¹‘ÔµÞ+yuWé»ôiìÕnfeù§ï‰LaõKþ‰=Õ­ñ¯êfÿÇ|Oô]€kÓq”q\ÚC4÷—221©æÉ™ #ŠE˜ø im2Ú\"Õ­ñ¯êfÿÇ|yiz¥£@J‰C©VTá@m“KF’[Ém†Òj¾R5¸¤¦çc±^çcâè†4¢§ M6¥*5­T¨¯-—‘˜••i3JŠår;ÒØ<à:Óõ£ÒdT¦O^¥„æQ!‡J3;éxLÌ‹m‹nÓ"”áÊÀ&:hÃ0–’ª˜z™›rÄKs™™©†Ö£ÚfvÌ£Ùs°‡ @Ðä)-ÓY¨­«E}çmy‹º[d…,­ÂV'·ƒnÎpÓz!ÐfƘ"jB÷3ÊBáYÅæV© 5lpˆ®jà°—v°a? ü'z`l²{X0Ÿ†þ½0v°a? ü'z`l²{X0Ÿ†þ½0v°a? ü'z`l®åu9à¸Î›nͲ¿òžéG–^€° HJ‘QÈË-©Ç¨|ì’+™Ø¿ÊpäàNXZ…kÔhô2t£O£³<õ—½ÜqËl5*ÝÊRV¹í#üJ¬YðŸ±é î,øOØôÈ@€o®¡/Cúšg¢CBõÔ%ñèSLôHDî1Ñ—Ç^<ú¦éNáÑ—Ç^<ú¦éN„¸.w¼+è·8D’w¼+è·8Gê[Þg\óÖÌP¡YŠ>oPµ=([P¸¡mC Pë j(V¡B†-õáAŠ Vbƒ7V…&)¤g\L28_áØßkÑ19l/ðìoµè˜œŒOž´<é›E¿íÝ;ú_ð–;[JxVn'Æôvâ%ØëcÔÕ¡«3n$Ò•Mv2”¢+æeG—…IB˂㈴y6;ÓåÔ$¦,T)dãÊB”H%!I#2IŒ®eÀF;;¶#E<¤þã'¢Œ™ƒñ”ZÔŠ‹DƒÅul3ˆVô膳k«§¦#)uI+PÊI9ˆŒõkU‹m°ÕJ wð®0k`ºÝ Ø¥|G©G\Ú‚ÛNç$¡I#}ä‘>Ju$¬ÚÄ–ew¥±)å'÷=vÄh§”ŸÜdô@)Ä8%ê~C::¤ïKõ!Wirc Ð‡'¥Q "ÞsO]o™-G˜Ë9ÜìvÑ©TÈø¹SðNŽq=¶pMU‰-= úqJ˜§!šÖ™$õêȲ7Òfjá%«!å“vÄh§”ŸÜdôAÛ¢žRq“ч`l+"³‹&R†š=«‡e&[Ôü'*ŠÛsPücaJ7ÜVµôfqIs*/eìy'ú]g'¯ÌLË(š¨ÅL€–Žíê›UŸŽ"}äæ/ÿ¶Û?¬`ëúqÐív‘"“PÄ’w,‚$ºQÑ::̈ÈìN4„¬ˆíc"2¹\ŽäfCÑOš§Áu¸ñc4–Ye¸I-¡%d¤‹U°ˆˆˆß©»b4SÊOî2z íˆÑO)?¸Éè€m‘©±´ ARÂS£ajáÑ+ªj¢Ê6uŠ[ýÊÒ´¨²Ÿ™Ë„¸Û¢žRq“Ñ }]Çz/©ÔߘΙ±-§[‰‰ "ËYÖ¥¨“ž”wR”}ÒŒöÚö""‰KËˆéØæSV,^«åV­È¥>ãˆC ¶ÜRÈvm&Ú˜øÌï·al+œ?«[ã^ÔÍÿŽøÖk:%¬ReÒªzpÇ’¡KeL¾Êã5e¡Ec/õ.!êŸÅØi[ Ïݱ¦!…¹©q»8Nº£M–’>'m­´D@ÕB_@ªÊ£JÒj ÈêЋôðYxû¶e_jÐgü±ÿêµ³*ñ”_©A¢Ê£1¸Î¥ëK°YuF¬¦’Q-h5$È”«eÌ£+˜š£0„–]x¨Ô¬'%ŠCÎÓMÉ'&˜Ó‰H”ûi%–^­‘ÊËW}F,KšÝE2•‹M›èq__;)O6•¨‰Ã,豨ÐY 6ËÇq©×êUT:d½Æ¨ÐMÇÉ–ÜBK1åÖ%³+©J23;¨ÍGsÚ/S±MrŸ ¨±e¶HfäÂ×¥ºÅÎÿ£qI5·´Ìû“-§q]¢FöæÃôlS,:tÕSq 1¡É“ §””šeŽêIæ#&Qܪé#ÚDG´z¦®Šìš*(´¶"É Ez¸©Ö&AÓ·Vd.Ù’^Ì„d›w„%šÕAªš"áJy/¼JŒÚœRÓîLœ4ç+\Ëb‹Ý+å*þþ¼«Ûó¾úÊ~ëÜ{‹6õÆÉ©Ë“.M^_qÜ^×ËÜß.Áe(øˆwå*«2ƒÔóQ®SÒK™N¤Ô%ÇI¦än7­ZJÝý¤Cò‰J]#ÅÂéÄ5Ú­:·‡%I˜äš£Î8—šr;dëNfÎɸ™ ØÙ¤ˆÛ#I$ÈfôW¹œÑÅ=‰¥¡iy+mv2Q«¹ fÂX[ :óÔXêeÇ[C&·¦»!Hi4´ƒujÕ¶W;!6IqîèÌ5ŽqJ—R¯»H‚’¥2ÜêìÉͽ!'žC¤RYSÈÑXÉHt»ãÉ2%sbuÐñ-zU"U/ Úê¨sžŒÁÎ}ró©;’œm³Žœ¨ré³ÒLÆÀ¡Sé4:S4ºZ[b#97Mgu(Ô£5(ÍJQ¨ÌÌÌÌÌÌÌÄ~vp<ÊM*”õ<Ó•4ø¨f ûFQI)N¡jBÉN·d&èpÔGm¤`!´)U= 7~+•Z.LM¬÷Ì\Oô¹zíc‹Èeœ›Ô&ÈUÑÝÒ{ÅÑÅVe{G˜n¹PA"eF“\„’lD㌥j+w¶™6&Á¸Kîmô†JÜìª:74Çc]•[3+Õ-9Ú;ÛUÓ³€HYTVYC,©–ÛBI(BLˆ’E°ˆ‹¼@5ž–Œ£M‘[¤¿Zg+F©6³jBI;[%%hȳÙešnV;æN¸QÒcCU ¾ Riråj8î¶ë ëµìî*ËVÃÈDF’.ëº3JvV"ÄŠbµ%†°æ#––ÔI×G§¨ÛY‘ò™™\¯r¿÷®V1Æ•YÕ¬3.™ bd<öLªrœ¢IYiQÞÆgÀ\B‹9ëªãÏé¿ö­ j6WTÿÇž"ÿÓíZÔ]TÌ«s`èÆŽË,Ó“©ÏlÍúlw•m\S¾e ÌŽë>ê÷±$¯d¤‹ò\Öèr)”¨´ZlØÏCŠûúøˆqÙJy´­DNgEF‚Èi¶^;Œ%Öhñ·=>KM œ7PkŒÛŠiÃ"#[jZLÛU‰;Rd{ ˆ…tìS\§Ãj,Ym’¹0µÆin±s¿èÜRMmí3>äËiÜShóbˆ,S1-R›Ãuˆ“aµ™ß2P³Ió‘ p™™™™™žÓ3xåÔµñMýä€Ð¿E„qô•Ä‚¨PMι^RrLk)¥jÙ$(õm¿¬6ו¤¤’„«1t_ÍÔºãhÑ<2RÒ“º6Ûþá¡#Â:<ÂRK/P¬ÆK+qÄG^#œôsRóg52ãêmFf£;šOi߇h~•SB4q‰Ý®UeÌÆ÷Ú,‰‹r:5ž”Z¶”f†uKi-–BMÉGšç´g±uºÆ/ÃøV»Qv iMÕ§:tiESÈaöQ³u&— Z™µ’LˆÖÙÚéØ3ÔL„¨µÇ+4èdÔµk2f˜ë1¬Vg5-)fÛ9Œ®­ZS~øü¨`¼%6˜Ý=Ø«m¦¦ÈžÓ‘ç¼ÃÍ>ûŽ8òÐëkK‰Î§\¹ˆ¬«ZÄD A•SÄë¸b«\ª¦ïî¾TI‹‹"nàšˆ¬fu£Jû¤,Ü<¦Y;v\„ãDÓæÔ0C+¨Krcñ¦Î‚R\±­ôG–ó ¸£.) ¥F}ó;‹• „¦ÐéÔeÃ(ñ)–Ü;Žc±]ÜšO#­-.&äfGewW;ÜfhðétzTj]1¨ñaElše–̉(Ipÿï¾'¤TÖÕ aaÇiíUµ&q=¥®9¬”ge’•Xø.G²÷²­”õ&«i^¹ƒñ,í#Q¨”6‹&Ÿ)šŒf[\’y¦ßRŠÍ6²<Æ”Øö™jÕ|·,Þ8XpÞŠRäÖitøÎ¸¦ã9%N–èÊv3A% Q&ÿÂQ$»Ü$vnƒ!„§É‘WŒôÈŸ¤¶—¤"CŠ,ÍÒƒZ”šTEÃu‹)(^sJ]VDZΪ¡椬Ù7T´!RPÙäÌÚr8•ÉV<Žl½ÎѺ`™A[Ž™-üCDŒÕM‚v)º·ˆÔyÔ… È›3I¥I25‘Ä£˜vk³çÅ”ìzziË4LzJŒ›eD¬¹O)(ÔfddD’3;ð˜Ð0à3µÌ4å*‰°ujdÈÓ$-˜Ån)NdJMk²YHi+*ʹìM¶ŒDäH÷P)r+Ufi‘VÒ{6U8fI+$Ôw±ðØ=‚t‡âµy;ý‹h·ý»§KþÇzi+=ƒÙ¢:Íê¶øÔŽ#²æWi1Ÿã©NSÖ)(Ž«6V5ØŽû 8Ó°NüV¯'£Á:CñZ¼þŒv£Øºq"žÒ£»O©Q¦UÓQ)M¡¦$|4¨¥fÍr±#¿{—’¤¬>;òª<„2L­[¢†¦Þp›mÔ%Ä­£Zˆµ‰#Ap™‘mÆÝ‚t‡âµy;ýüV‚ô‚’º©Š"ýl?ю╉(q–⨶kj Í5Ä jD—I†Ì’FdfN øˆŽædDf=uƒ4ÀpÈÌŒˆÌŒ¾ƒ8G°n?ñwà¿Ñ=KC8âŸL™Q• ;’]RêHÚ jÚ¤^É>þÞÑøÛM×UDÄø’U6z[K¤ÚàÊQ) àRT–Í*-†WIŒŒ¸Hȼ¸æ¢åA¬Hî¶QÇ^˜óMÈBÛR3Þ÷mdJBŒ‰7#"2±–Á)ÃGºK‘Z«3LжóÙ²©Ã2IY&£½ˆÏ€¸‡„I´[þÝÓ¿¥ÿ bÈJ{éÅjòwú0ì¤?«ÉßèÇeé+=ƒÙ¢:Íê¶øÔŽ#²æWi1Ÿã©NSÖ)(Ž«6V5ØŽûÒö.€œEH§´¨îÓêTi•tÔJAhi…ÅI*)Y³\¬HïÞäWØ'H~+W“¿Ñ‡`!ø­^NÿF;&¤¬>;òª<„2L­[¢†¦Þp›mÔ%Ä­£Zˆµ‰#Ap™‘m‰X’‡n!Ú‹f¶ª Ó\JÖ¤IthlÉ$fFd∈îfDF`8{°NüV¯'£Á:CñZ¼þŒw¸àŽÁ:CñZ¼þŒ;éÅjòwú1Þà‚;éÅjòwú0ì¤?«ÉßèÇ{€=iŽÇN2?ÖÃýv Çþ.üú1Ú˜ÆfàmrR ¶›[‹&[‹Q%$vJF¥ŸRFgÀDf5– ÓFÆ•ÔÑ0Æ$•Rž¦Ô鶈2’IBxT¥)²JKiÔes2.":å.vÆÇ¥œ žU|Yˆ#5+XÜd"§%6&É,ª4™–›l·ŒöAǼ·Ä¾uÚª×_ÑöŸ}պ늪-kZJRöÌÌÌøLϾ4°²Gv^Æ1]~‡Œ± æÒÍ lªr”²±$Ìì›ìî‹h‘õ•§þQâ-ì‰oPß¾Õ?Ý{ÿÛçFÇh™¤ZÖ—LT$Â’˜°f›Ù‘5ÒŠÄ—µ‹"Ò‰ 2MÏ1%f^äÈ rÿYZå(òÙÞÈu•§þQâ-쎟¤J+t4ÔªÉ~"Ý«T)±âÆaÙ¾q%<––ÙA¬ÈÉœçd™$•c3á<Œ|q…$CvkU¸çšiU|ÉIm1LÖZÌÆVØm¨>é6ÚEr¸rYZå(òÙÞÈ ÓùÏâr/øÙÞÈìXµXªó),?žd&ÚrB ²îlÕ²™žEl#¹Œír¿­ïz_û¦„jšÒuVs“êh“:[¶Ö?$¤¸âìDEu)³3±ÐD<½ƒ±÷‹ÿþŒu’t‰‡p [—Šªò©Ñd¾¶™u1_y¼å·)›hQ$Ì®dGk‘*×ÊvÂ6¦c:6¬aº¤Ét¹†3:Õ°ó {*ŒÎÄâRkI(‹i–d™^é;FRãzÝ:Mµ:‘4’R Èr3Ä•\‰hQ¥V>ù\Œy—Jß8³ë¹Ÿã¬F… ô kŒ©ðÚ…×¢Ee9ZeŠ‹¨B ˆ’J±Ð/öAǼ·Ä¾uÚ %ìƒyo‰|êÿ´qï-ñ/_ö„hI{ ãÞ[â_:¿íd{Ë|KçWý¡^È8÷–ø—ίûAÙòßùÕÿhF€ºµX«Öå&]f«:¥!&Òì¹ yd‚32IŒÎ×3;~³¬YðŸ±é î,øOØôÈ@€ož¡e¡½8­Ç”!4Y¦¥(ìDD‚ÚcC ¿Ô•N§Õ´ ý>©,ønÒÝÖG’Ò\mv[fWJˆÈìdGô‘ž„;Ç}©^3…ϧÖ1z+y§ôÍŽÝaÔ:Ú©4k) ##îçwÈDû`Ca4±ìƒ¡Ü;‡è;ë¼T*e+_©×n(³¬ËŸ.l„WµÎ×๊B_>g{¾s„I'{¾s„~¥½èññ–uÏ=lÅ ˜¡Cæõ SÑB…µ ŠÔ0µ°¶¡B…j(bß^ Åf(1“uhRb‘QŠFuÄÃ#…þö½bƒå9/–#U°Ô…)æÝ6TÖTå4©¤)iY+=îV24ðXï©ð¿Ã±¾×¢br1õQš×„åÊõ1ì[ù5~Ô‰0%ÔÔÊ‹^ó¬¾Ù:¢¶s"'P“3,ÆH½®vh]nÒÎdvët§ç-¶”Ìù”LjÝzÆÉ mJ32Õ™-M÷”V-†pÀm£d.±Ds`j“µúiµKÈSÜbžät4mJqîå¶Ú"²’²$å+™ÜÔI¹˜Šaùðþ;¥M\ægÄ><…¿.eZR´­YIÄ¥W+m"Ú\[F)ÀÉVàÓ`¥”Á­±TqyÃa‡†Ëf]®%&f{nYlV-§}™'Nœþ¢ÀߨmËMRK¯²¶Þ» º†•¨É³I‘jTfI5”›È£`'{WD“^Ò ¶«Ðͪ¢¨l¿þk–ÔŒ¥ú>äÉ-šO6RÌec4ÝEŽªmÈ)µÄÓÔÄXñåE8î-Õj[KdmRh<ÉBOºRlf}í¢&"œ }N­«‡q<ÇgÆ>¥\f{pMšÍR3YDŒœ2 ×QlB¿ðæ÷RgQ#W´}-Úô2j–„*y“/žç4KvFSýtf— %—1f#¹’l£mj6õ.‡W J®D‰¬ŸC2ÖËÊiÔ´™VRJ dg­I–d–Â;ØÅÙB«Ó ÃU}¸JK±¹Q]´–M底‘6KÊ¿Ò(*±l.èÄPh1Q£U%bRr³–Ìš\Zt%Liã7I—#Ùj&¼½Äs3ýk"+í2ÂáW`7DÄÍ˩LjôšrYŒÛˆuFòÊCNØQÆL®£"º“Þ¹”|h’b§J¦aHÑëPÖ¶`œyg«xŠ*•%×n»·Ý%â#É›jk÷&¬ÝZE:¹^ÆPâÏÖ@ŸP*«U¢¼¶šJV嵩É)´ƒIžS²ˆ¸Hî ÑO6)2©ó$CŸrëš_A‘Ü&‘'űaÀÀ˜~,Y»°Îtç”é4¦Ð¼ÈŒ’R dJ4wW2+šU³`ˆMJ¡>§(åԦɛ!EcvCªqf_JŒÌy„Äb€ 6‹Ûºwô¿á,}ÅTIUZîÆRÕ®äÙá™)HTQÈ‘b;«;è=¶+¶ÞÄ;°]º#‰Uv*¥6•™”»«5‘¤ÒdJ²¬{xlc¡ûm$r#÷©t6­WE³¥â*œVj1£áY˜z­MŽÉfÝÝž¸Æá ­”Ù-B–E˜ŒÃIR+zd`¬OŠ˜î0:$%•EŒš[Î:K9Ò–úhF¬ÈØo* 6[«º=ƒPöÚHäGïRè¶ÒG"?z—@há Wi¸¦‹\ªT >¥•*ólç³ÕC'‰ jäWl“)Ä÷V2&±l;lÚÏÁîÿºô1Ì=¶’9ûÔºä¬uQ¢­Nz?-Èϧ+ˆEhÛ5|®–Hì|WÚW#Ø nJÞ Öê4ª^“lºDƒ“×›%*;†VÌŸØv=™’…{¤¤Ê)¤õÜ]ÿÜi¿õPÓ}—°OòSÿæ½ù+L¸u4:Ì FŽ÷¹ú¥9ø ‘¿N;‘.¦ÆyTÝŽÇcïppˆ„´Ð“h·ý»§KþÄdep]º#‰Uv*¥6•™”»«5‘¤ÒdJ²¬{xlbÈ}ÅTIUZîÆRÕ®äÙá™)HTQÈ‘b;«;è=¶+¶ÞÄpª®‹gKÄU8¬ÔcG³0õZ›’ͺ!»=qÂA[)²Z…,‹1†’,¤VÕ]¶’9ûÔºí´‘ÈÞ¥ÐÛÒ0V'ÅLw‹Ê¢ÆM-ç%œƒiK}F´#Vdl7•›-ÕÝÁâÂ2®ÓqM¹T©@}J7*UæÙÏgª†OÕÈ®Ù&S‰î¬dL1bØvÕݶ’9ûÔºí´‘ÈÞ¥Ðê «Ûi#‘½K ÛIˆýê]ªʽ¶’9ûÔºí´‘ÈÞ¥Ðê «Ûi#‘½K ÛIˆýê]ˆÅþßóÿЄB‰†è4JV£H¤Ä….¯ ¤Ïu–É*á³+ö‹fe-^éJ3Ðø›ª ‹‰dµ"·£•Ë[I4·zóˆJHøl”¶EsÙsµÎÅÄCÙ{ÿ%?þa{ؘI§ß‹}ÿøŸøÍ2'ÚWÒiM¡S©ØoxâÑ÷FDn㓟\hQíRHÊÆ“ãáïX@Eê¡¿}ªº÷ÿ·½ÌäÅc™) *¯Yf§L“Ì݆ãp¢2‡6‘,œŽ£¶Ò4™ìR’8ÿB:Z-·/-U7d¬­ÚL’R¬—#-Z®}Ám¹wÆÌí´‘ÈÞ¥ÐÚ˜ãz$:%a£Ã³q9¥Kй/5ÖêwQšÕ)iR –ÔÈÖWàPµ+EåÀðå΀ëi“1x‰²B‰™“,¦­–ŠÇtëЄYVýœïXvÚHäGïRè¶ÒG"?z—@|h› Tð¥k©ìÔ'È•}ÐÙ¨ó0ÓHaŒÆdGŸTÒ®öu.×½Î`÷½/ýÓ¯Ûi#‘½K ‡Õg ÈÈðFÃÿü©t 7./¢Rq6£C®Aju:ffßaÒØ¢½Èî[HÈÈŒ”V22###"1Åq£Bo C‡¨Ñ˜­Ãi–ZA! ¡7$¥)-„DDDD\C?¦<ûî>þ‹–ë®(Öµ¯>¥)Fw334m3>ø®™ð„)¬L¢Ý[ì8—ZVÿºyT“¹»ÒïŠíK\i[ãG}w3üuˆÐÉbº®þâšµsQ¹÷ÆkÒõ9ójõ‹5åÍb½¯kØ®1¢Èb±gÀ~ǦB'¸³à ?cÓ!ºz~7×õ[þ’–§¨×ã}U¿é Dô!ÙÂ[£¯ãÿÑÿ˜D„·G_Çÿ£ÿ0¤uL¾sN÷…}6ç’N÷…}6çýK{Ñãã,ëžzÙŠ+1B‡Íê§¢… j-¨ajamB… Ô(Pž¼(1AŠÌPc&êФÅ"£Œë‰†G ü;íz&6}&†©°N|ª” \=i²‡¥›†N,ˆŒÒ”¶…¨ìJI™Úضíà ü;íz&6í%é‘p²^¨P›©ÐU5Ä6µ-HS227Ÿ*ÐwIšu~è'm„fGl}Wœ¼-JÂsØ©3 ¥A}/ÓÞ¨±!—MM:ËHuj2;\ô+MŒˆî[mÂ0aáÖW‡ñcR(RªPSP󤥥:i}“ÜÒ2¡JI'7vÒ“±_¸;ØxéÓñÑ*Õ÷eTž®cZÖú!™ºN8ÚÕ´ˆ––Ó˜¸3_i.é€3 ͨ;‰ôV!ôÖ$ÕõN>j4ºüSq¤¥K>f5>‹Ÿ JÇr!މPÄ«tÌF¹ §Åƒ%nGu6j©AêuiànîêÐYmrQ–Ò0Ü €$š,}øúJÃNGyÆVuH횣IšTâR¤Ü»Æ“22ï‘™ ´\Q]^©N:ƒÉ•§¨o$츸ܓZ2ÚÚOT‚²lV/ÖbffÄ‘X¶©PŒÒWVëz$è¤M‘š¤¸Äeºá'åVòïÞ2¿ \ê^fnµU›-u8õF“NœãŠ×šI S–sÝ!DÉ–ÞäղרCÅå¶ÁAiÔÉÍ!N-+g!–D‘$ҬܘÍEnö_ÖCfW+u9úHÆ92–º]ªæPïúSM>âHà%çBU›„Îûvˆ¬¹Ó[Ñöu¹’ä:¼ýÊ´ºdlYYýÏtf­ó3á1TÈÁ×)ÏÑëS©2TÚß…%Èî)³3I© 4™‘™ÚåÄCÆ6•jUn­¥Š³) >%Rr`±%kv2d^8ÍUt÷JJH“ß-œèîe²ÆV!f©=½$»5Ruçð¡.Iº£YH=æ',åýÙÒ•*÷2# ÓÔk Ù•ZoGó¤Uæ¿9èuHÇuõšÖÚjI­g´’fÒܺPÄ i’›A¦.AÐÛ©3¹¡’oâÈÐö_rfh²óðßmîV¤rKïÊ’ì™/8ûï,ÜqÇjRÔgsQ™í33Ûql\›E¿íÝ;ú_ð–;ª£ƒtwMTTÔcĆs$&,b~{ëÞQ¥´]e™fI3$–Ó±ñÑoûwNþ—ü%ŽßÓ& v«€©&ز± Èp‰F•ý“P2RL¶¥DdFJ-¤dF[H@È/à4Nj à2™o4·š`æ¸N-4’ÖIÏsJMÄ™l#ZoÂB÷c¬âï/{c]Uk8¥Œu¼èmRñ…WŽ#š¢ËP3vžq_"àºÔƒJ“ÞZEÜå3Å`7±& UJ ÂTç9:¶qdʫɨ4ëKeO±Ú(©Wv‡¹‰V$%Bp6×c¬âï/{aØëøŸûËÞØ×•ìYˆ±V®c\&äèÑbC¨ŒM¨jœM).»M×äJQL(æÒÉlYDös²2–’#I06¿c¬âï/{aØëøŸûËÞØÄèzžëÌÕñê½ftÇ«•˜­·&¢òØa†êO¡ ¡“V¬²“I"V\ÄWI'¹0"ްo‰ÿ¼½í‡c¬âï/{bVìuƒ|Oýåïlyê?ÁìFS©£íIÿ¬»·aÿâ1ã¬üïû§ÿC#_u±„üCýíßX‡ifŸ‰ipèM2láYÓ‰å¾ã‡Ÿ"’"QØ­Ýì{mk[oƒJ:0ħÓ*ô"âl9 N*Ñ"TžJi);-„’²¶áØ’{2íÏlÉ2sÙ#·ñ ÕBu^¡*c$IjCÒV·DfdIQÊÆf{8Ì~K­ÖfTY¨Ë«Ï‘5ƒJšì•©ÖÍ'r4¨ÎåcÚVˆF±!fªõYªõQº‹èÕ»-2Ü'œNÎåK¾c.å; ûÅÄ<îÕjR™¤»R˜å9…눧Ôl¶­½ÒQ|¤}Ò¶‘wÏŒxÀ1Ý>³X¨2Ã3êÓåµczBÖ–¿Ý#>çù‚©Y«ÕRÒj•YÓ‰¢³e&BÜÈ_«1‡„2Šåj³ªßŠÅB£©¾«uI[¹/kåÌgkدn"Žº±Fùo—\•Ý©ÔnÜæ·W|Ù3f¾[íµí}£ˆƪµFiORZ©LnœúõŽÄKê&\VÎéH¾S>å;L»ÅÄ$ô¼pšm:Q"Uô2Bšk}Ü8ZäXÉÓŽi>ë1¬K$ß½m‚4Ä€ $Ñ“¬³Ži«‘!ˆíæZMÇÝKhI›j"º”dDW2Úf;˲†9k‡|èǶ>t€¢Ý”4yË\;çF=°ì¡£ÎZáß:1í è·e r×ùÑl;(hó–¸wÎŒ{cçHú-ÙCGœµÃ¾tcÛ æ7nEZC´ìk£vâ¬ÑH¬fs)®¬¦Esµì\µÏ„ø `uÝ~¸uªCôÉXóFˆeì¹”Ý^Ê+(”V¹™p—нQu]2WgÓ'FÝÏ«~3©qµÚ;DvRLÈìdeô‘|€¥Ôïð}F0bUqM…ªv¢Ê’&›NԚOaâÐ>‹vPÑç-pïöò†9k‡|èǶ>t€¢Ý”4yË\;çF=°ì¡£ÎZáß:1í è·e r×ùÑl;(hó–¸wÎŒ{cçHú-ÙCGœµÃ¾tcÛÊ<å®ó£ØùÒ>‹vPÑç-pïöǃé+?GÝ/aELRLš)5vRÙìº*3±^ö"Ûk\¸KçÀ쮼dòçEþv?ha±jœí#TêxÓH}ü12xôê¢V·¤š’D•ÌÌî[‹`äà„äM:Ë8æš¹ŽÞe¤Ü}Ô¶„™¶¢+©FDEs-¦b6Pú-ÙCGœµÃ¾tcÛÊ<å®ó£ØùÒ>‹vPÑç-pïöò†9k‡|èǶ>t€¢Ý”4yË\;çF=°ì¡£ÎZáß:1í µë˜Ý¹iÓ±®Ûˆj³E"±™Ì¤Vº²™Î×±p^×>Á×ë‡Z¤?L•4h†^Ë™MÕ좲‰Ek™— qDN[ª.¡«¦JìúdèÓ¢;¹õoÆu.6»GhŽÊI™ŒŒ¾’1¯€ ¬YðŸ±é î,øOØôÈ@€nž£_õýVÿ¤¥†éê5øß_ÕoúH=vp–èëøÿôæ!-Ñ×ñÿèÿÌ)S/œÓ½á_@¹Â$“½á_@¹Â?RÞôxøË:çž¶b… ÌP¡óz…©è¡BÚ…Å jZ‡X[P¡Bµ 1o¯ Pb³ɺ´)1H¨Å#:âa‘ÂÿÆû^‰‰Èƒa‡c}¯DÄädj|õ çH‹>“ö=2!=ÅŸIû™ ÓÔkñ¾¿ªßô4°Ý=F¿ëú­ÿI'¡ÎÝþüÂ$%º:þ?ýù…#ªeóšw¼+è·8D’w¼+è·8Gê[Þg\óÖÌP¡YŠ>oPµ=([P¸¡mC Pë j(V¡B†-õáAŠ Vbƒ7V…&)¤g\L28_áØßkÑ1´hØj©V¦»QˆtôÅeâaÅÉ©G•j#RJÎ-'´‰V>þU[€í«°¿Ã±¾×¢crá–énàÚjÓ&Dc} W*_Q«U3a¥N ˆ­}·ïÍ»1õsŠ—†·F©Qiº„ro\Œí8‡Pën&öºVƒ4¨¯³a˜Ç‰ìª}.i`ê4 /»C•PZU5â$:N¸¶PêT‚¹#*RÙ‘fQwW¾Û¢kt‰ÌTâ*~[,Æyر鴹I’›I©%¬8é5seŠ2"3=†C˸k ´Ã] QaS©’hºÇ©ò¢j'¡ÍFc”‡q7ý)$—cF̶Ú0g-4 =Fv>!Ú‹.?!épÛ‘î^[dÑg#$‘ WM•Ýð𠊆2dÊ|éñÐÚØ€„9&ï!*JT²A(g™E™I#4‘Û1^×!ã©PãAs5­CNP¢H&HÌÉ“vDÞݽɬӷnÁí!¹u*^,vHÞøÔ×W5„Ó#¥•:Í’mš LÜRÙ;Ú宨eb´nà†PcaúmG|°¬)•Mt™EP¥­ã÷å ÚPÂÛmH½“•]×x‰#ñ´S)s±ŠbÓàLŒÕ.<¸äü5ZuOF+·®I8H-rȈìKN\Ä¢°nøF½Wr°ôwž…NжX&OqDDt»e)YÔ”'7uk‘ÄOšÝ Úm*%›2;У>ù¿;%O6•¨‰Ã,豨ÐY >çŽâÙà&¤üX¸¯I½—„Kܬœ‰ s™e³AK-’³¹Åÿ 0ıV)”Y¸…Ú=w@(КKTöÐÑ“†òÔúÚ"Õ©e•(¹¦ÖQl¹ŠÅBaa²‹;ળôÚrŸW83Üêl–ÉgÕd+“ÊNÂ"#EÊÇ´GðËd¼7‹ìV&©ìº‡ÂT¶œ)l +2Ì‹¥k#"2¹ÛØ­;„tâ¯XU3 agcQhºé4Õœ‰ÓY½’Kí¤Œ6ÌIBn²"YÜ®g°cq:CPjKSiÈ ÈŠÌcIêd:ËnkÏ·V“Z’ÂØA †…°å;ãvhµ6ó2ú”ÔY§PœÝÉ‘‰G²ã¤ûX0Ÿ†þ½0нL_4ÿ÷›ÿ¡Ó»ñSí>ßÍô™¾ýak÷nèVèÝ;‚ùõ—ͬϷ5ï›õ‰ÎÖ 'á¿„ïL¬Oà ޘIñN3ÇëôáÒ¢à׳*;ñžT™­¢yn¤–N[WéTIVU‘ì#IXÍWêøÝü5+ÖJ§ª™JÄLCœˆ¬fKK° ©—ug^%F‰¯¢RM,¬®‚AÉDFDv´Ž¦¼èÌÈ«2˲6c¡Âq*yd…,Ђ7»¥dBÕbÛd¨øÅîÖ 'á¿„ïL2‘k˜«WôSˆêGEE±Vzl(±Úq2c%T™Êm.-K4¸f…c$£*ŠÝÕîWpþ3Ò„ü=€êïõ¡ÿñ›m!¦QBw × ÉZÕ(Ý=jr2¿Ñ‘ ÈÔ’Îv5Ãv°a? ü'z`í`Â~øNôÂ_ÖÄtŠ%zeF/rì¶b­(":3ÓPû ZÔm8iZ[;©]Êœ+÷[<øã‰ð0g'ª1e LxžmØŽ* ²Ò£qn(–“K*#NTšMEÝ*ÆfŽÖ 'á¿„ïL¬Oà ޘoР»X0Ÿ†þ½0v°a? ü'za¿@‚í`Â~øNôÁÚÁ„ü7ðé†ý µƒ øoá;ÓkðßÂw¦ôh.Ö 'á¿„ïL¬Oà ޘoРWÔɃÙ"uÙ*q´¨³%)q&e}¤G­;뱎7Oçÿª/ù¿êCæ V,øOØôÈ@„÷|'ìzd @7OQ¯Æúþ«Ò@ÒÃtõüo¯ê·ý$ž„;8Ktuüú?ó–èëøÿô掩—ÎiÞð¯ FÜáIÞð¯ FÜá©oz<|esÏ[1B…f(Pù½BÔôP¡mBâ…µ -C¬-¨P¡Z… ·×…(1YŠ dÝZ˜¤Tb‘q0Èá‡c}¯DÆÉb³=Š šj¸d¼—IÅiK5§bLœ4ç+™‘YJùJ¾¶ÂÿÆû^‰‰ÈÈÔùëCÝ­9ŠCô¦Ülâ>â]Rʤ¬¸…{,f“+–ùlÜU]— èKk#å•÷¤<ù^öqÔ¤–½¤GÝÜay± fÜÅuç)‰§.bÒc”b^æk\L‘X›ÖåÖd¶Ì¹­mœÍ#U©qN,W˜SÍÄ·"+O¥ 2"5 œJ²+amMaq P ecb´tURtêÈ4M\ˆí¼·K6ot´š’y¬«¤È HÊÃ5j‹4WèÍÊR`Hu/:ÍŠÊZxö¹}v;ø Þ @ÊÒ1R—ãÅv:ÙÎkKrb5!(QØI'¢J¶Ò±ì.!v*­Â“P‡ãHv¥b–©Ù’n‘+5Z…X³‹¾”ü’¶i‡q-:$y5 ³OÆÍÜ¢gÎÆ£;2òìä}‡üÛn¢á°…€LdHOU›­VêQQY}NÊmøLÉI‘¸neý*³5ŽÅkšRgÀVÅÑ곩2ô’ƒqBÛK¸›‘åRF•ÈŽÆG´ˆx€1!Q­TçÎfl‰FOG"&5HKIdˆîD„ ‰(+™žÂ-§q‘‘Œñ ìLaÉ1 ©¬›RŠ|t“ÄfJÌ¢$ÖF’2Y÷D{HÈgðþˆq•z’ÅN—c<„¬”Ûn¯.d’¬f”ØËeÇ¿°NüV¯'£ @ÀMÅÛ–A§Ñe8ᆦ¤·:šÂÛC¦óŽçhÖk±þ”ÓšÉ;!'ß²pk•hÒ§ÊjjÍú‹.1-Å‘-N¡ÃºÈÍD{NÜ%·õ‰÷`!ø­^NÿF‚t‡âµy;ýˆˆ¦3"ÒÅ<ÌìDmÜÿ§hv'c¬ »wFâ{U¯Ý‹|änflù·.³Q|Ý׸áÚ9‘¡Ý+QæÚB'SåM$ôR’ÒÈ„³%²; ÏYZå(òÙÞȑֳpæ™OÄ4ù1›\lGŸ}‘º[£4tGVÒUÑv›B{›p_„ÌÇáa¼4U¥Öw+jš¹§=KSëRwF¡¸ú܆¬¤¢i¤ ŽÛ 5¬jQŸ%õ•§þQâ-ì‡YZå(òÙÞÈdv ŸI£Gz=1 Æe××!M¥Ó4Öy–i#;$ŒîvMŠægk™ˆíGX‘V§Õ Áu)Ž-Êy9SëPó6¶Ô–Z[††ÐhqE‘)$ðlºSn`ë+Oü£Å[;Ù²´ÿÊ4fÑdÞ”n…žçËqÓ´ÕuÙ§žêü7á"1É]eiÿ”x£Ëg{!ÖVŸùGŠ<¶w²kÖæß}öÜÍîÝòßMfè_úÖäÜzËf·¼wm—¿lÛBÃéøzŸ3h‡2oJ7BÏs厸éÚjºìÓ‹Ou~ð‘䮲´ÿʳIUWœ¸ïÀ§ÖZ[iLF’áÅ#ÛÉ$¤Ô’Q¬“Â[ÿ¨^ݸUf±JbUiµ?-‰sÄiÂV¥—SݨœN\ëyG°•”’[Vf'˜óU¨t†¨Ój”ŠÛõ¢Ìµu´¼Êܾՙ’’¦–ƒM­°Œ”w±†‰Ù6¡N7T€©Ž-öue·Ríì¥fJu+Vm†eü=‚Þ¨R“F¨Ñk ˜ÌyO1!Åi.­4N$ˆÐ¥$ŒŒWðŠÆEÂ2²ñ‰}ÚcÖÔ {ôél¾” ÜiŽ™HY(û¥%õì4÷&EµAÍ lÊNM5ª„Oþ"™Êª¥œŠÕéGæ²Ô”F‡â BÖ•©VZÉI2m{nG³ƒhÇUisé{—w1©Ýq‘)Ží*ÎÒï•[ í{ÃÚ2§RÛÀÕ*[¯L*Œ‰Ñä4”ÇI³•¤:›)yÉDg®QìIû‚ù]Î>«½_è»×»Õ‘º·N_ÛŸ&_àpZûxn&2;A8ŽU'Ft*E"”UZÍIF¨Ñ×#PÒ[j;Ç\s*(I­´ìJŒÍi".)ìêþ)j«ƒcTéñèÏT1°¦3Reµ!„Óe¾“CŠBTE¬iµ(UÐeîOn»Ðe±#aÜK‡ê´Ä9sÎZ̘ï±ÜA­ R›VfZQ+*½É•¶Ü¶SÔ|UYŸ…ªU¶è±¤VÝœëä:êR IŽ”¥Å!&âõ’ŒÍ(,·ï—uhú.:ÂÕŠÙÑéÕ»(ÍÂiJˆòmœ&^R ·'ÂM©VÛqMazÕ]ªU>|…¾ú¸Ër í1))+™°òÐM¼D[F¥lÛÁ´B4q¢Ú†­PÛ”†¦@ ç(s]Ä•) Q+e&PœVçeydf“QXÕ•)¹e±†tuŽXƘ^µ^©±/yæ<üÙJÄäìñ$2KDE¤£Ç<Τò ŽÅr%‘”\+¤¬Š%AEª>ùÔY7 ¸å>C-JI'1“n8ÚPµ\Í)3Rlw"±ÚDõR5È´GË>\g¥0ÖEwm2¦’â¯k”ûEc;žm—±Ú‡°MR…´[KuøFöÔîõ!jÊæJdˆŠÕw7;¸òOº$÷$gÃb<Ž2£â5âº.(Ã-R¥Jd¢T$¹5!qÖkKˆmÃ%%Q‘°Óc%ÒûSÒN§®#oÔ¤¸ôÇf³˜Ôé2ypÞ&d¥(mµ(ò8v=›HEt‘˜‘Q*”úÕ&5V•)¹p¥6N2ò8GûHûÆG´ŒŒŒiº}áÌm„"GF¨W7)%>ëœDšœGˆ²mjB‹\Ž+I¾ÒPÚ:=¡IøUšlÙ ¿1R$Ë’¶Rio]!÷q(#Û”ê‰7Ûb l%¤ªT=`Úž-ª¼åV©‡¢Te)ˆ¼®é”)ÇÜK2i¼Ê;¨É(/Õa$Äë P—5 ’Œå0r[ܱ]’DÁZï,ÚJµmm/Ò*Éýb‡°F6”Š!P•‡fÏo ÓèÍêiÈ©^Wš4¶£q&o9t(‘˜‰ÒvŒv"aZ(j–ô:æKJÃQ¨Fu·ÜdÕ¸³êÜh…ë\V½wbé5ز«a€¿?J'c ¯SñNŸ@§áVklÈërCðäìÉtž½Q(šCm6´¥4k^v󒤦1jPÆÏb*¢ 2¾Ä(K·2®Ÿ Òim&·Tn<á‘)]Õ‹a; èëHÑ4êS‡$ʾ)˜q¶¤)I6%´Äį[dG%r¹÷*Ù°¯˜ÅÚ7©Ö­Lj[I}ÜNÍrmÔ$ÄΔSY„¦ÜyŒ®4g•Ó#A«ø##R@JWð¢0ûU³¨HTge$4˜(ä›;˜‘®Ö%FhÉr"3µ¶ŒÝ© µKf¥OqÇ#=›)¸ÒÚYTiRT…‘)*####"22;pÖj à·á õEúÁT–ÌŒIRuD¢a,’ÓPYét’’"RPE–éË´ÔsmÓ+|# ^¨o…A£pÜ{\·l•8¥!ÅÙNdA¥ÔD¥eÌ{LÀ`XÒ–N¦nêÓ³¥Ê£Æ«éôYj'#µ; Y£ÎfdVJLÎÖ;gcšV-ïÖ4Ã(÷[͸£ý*N±—MJJHÒ¶M\®E˜Ós4˜´î’ðk[K©JÕ>Û.åM’l°N¥*o^á7‘ƒ4­gMD¢3"¸ÄbI“*Ÿ¿úsTjã)D§ ´²SinÄdjÊo4w2î_QÞé"<—´sŽ1j±$:uJ: ÔáãwO„Ü °HSj‹:·ÉK̬Î(ìK±¡D›lXøÏIÅÒ°¤i2Ÿ«Cp›”ÛP[qÔl¥äë$jÐJB’djQŸrWQžÒ1Tª•šÕ]öé˜uœ=O©ÆCŠ%Pôª‚ ìÄ’Q›±ÉlgdÜÌÍ^ŒKG®Ñðö‘¥Óº'â)¨U0¢¡Kq£rHiRÈ‹fGZÎ×"A\̶ÚÕsG2žz¦šDˆqcoM5-æQ!êl¹R—EïjÎÒv³ì+ÂIaYtJ•a5%Ç‹Lÿ^)‘Œô{‘s4êáf#,½Ïu}—0¦4ø¢tèyRU2žÛ.K& ñ]a.šÉ¼Èy QfÕ¬ík؈øFpÚîÄ5 ^'Äxú=2¦ûtçc±ÇeFe4çÕ)³qfÚæw¢VT’lE˜Ëm«OÄÚCÅø™ç(’!»O¦Aeú4¥JŠkeRÖ´êB5ª-z Ì’DYÉ<)3µ€‰ÿê‹þoúù€>ŸÏÿT_óԇ̬YðŸ±é î,øOØôÈ@€nž£_õýVÿ¤¥†éê5øß_ÕoúH=vp–èëøÿôæ!-Ñ×ñÿèÿÌ)S/œÓ½á_@¹Â$“½á_@¹Â?RÞôxøË:çž¶b… ÌP¡óz…©è¡BÚ…Å jZ‡X[P¡Bµ 1o¯ Pb³ɺ´)1H¨Å#:âa‘ÂÿÆû^‰‰Èƒa‡c}¯DÄädj|õ çH7¾:¡Õ‚°”Z 8MRÍ¢NwޤH%¨”Ü“©;’[.}ñ%í´‘ÈÞ¥Ðc9Ûi#‘½K ÛIˆýê]æ0Ó¶’9ûÔºí´‘ÈÞ¥Ðc9Ûi#‘½K ÛIˆýê]æ0Ó¶’9ûÔºí´‘ÈÞ¥Ðc9Ûi#‘½K ÛIˆýê]æ0Ó¶’9ûÔºí´‘ÈÞ¥Ðc9Ûi#‘½K ÛIˆýê]æ0Ó¶’9ûÔºí´‘ÈÞ¥Ðc9Ûi#‘½K ÛIˆýê]æ0Ó¶’9ûÔºí´‘ÈÞ¥Ðc9Ûi#‘½K ÛIˆýê]æ0Ó¶’9ûÔºí´‘ÈÞ¥Ðc9Ûi#‘½K ÛIˆýê]æ0Ó¶’9ûÔºí´‘ÈÞ¥Ðc9Ûi#‘½K ÛIˆýê]æ0Ó¶’9ûÔºí´‘ÈÞ¥Ðc9Ûi#‘½K ÛIˆýê]æ0Ó¶’9ûÔºí´‘ÈÞ¥Ðc9Ûi#‘½K ÛIˆýê]æ0Ó¶’9ûÔºí´‘ÈÞ¥Ðc9Ûi#‘½K ÛIˆýê]æ0Ó¶’9ûÔºí´‘ÈÞ¥Ðc9Ûi#‘½K ÛIˆýê]æ0Ó¶’9ûÔºí´‘ÈÞ¥Ðc9Ûi#‘½K ÛIˆýê]æ0Ó¶’9ûÔºí´‘ÈÞ¥Ðc9Ûi#‘½K ÛIˆýê]æ0Ó¶’9ûÔºí´‘ÈÞ¥Ðc9Ûi#‘½K ÛIˆýê]æ0Ó¶’9ûÔºí´‘ÈÞ¥Ðc9Ûi#‘½K ÛIˆýê]æ0Ó¶’9ûÔºí´‘ÈÞ¥Ðc9Ûi#‘½K ÛIˆýê]æ0Ó¶’9ûÔºí´‘ÈÞ¥Ðc9Ûi#‘½K ÛIˆýê]æ0ÓNuX¼â À÷Ið–ú—B9”+|'ìzd B{‹>“ö=2 §¨×ã}U¿é iaºz~7×õ[þ’OBœ%º:þ?ýù„HKtuüú?ó GTËç4ïxWÐ#np‰$ïxWÐ#npÔ·½>2ι筘¡B³(|Þ¡jz(P¶¡qBÚ†¡ÖÔ(P­B… [냬Å2n­ LR*1Hθ˜dp¿Ã±¾×¢br Ø_áØßkÑ19Ÿ=hyÒuW­ÊTJ5*uJBn)¨‘ÖòÉdF£$‘®dWýdÂKØûò#ù©ÿd;cÞDb_5?쀒ö>ǼˆÄ¾jÙÇØ÷‘—ÍOû #@$½±ï"1/šŸöC±ö=äF%óSþÈÐ /cì{ÈŒKæ§ýì}y‰|Ôÿ²4KØûò#ù©ÿd;cÞDb_5?쀒ö>ǼˆÄ¾jÙÇØ÷‘—ÍOû #@$½±ï"1/šŸöE©xÄŠì¹x?ÇŽÊã®»My(mW5(Í6""+™˜ø V,øOØôÈ@„÷|'ìzd @7OQ¯Æúþ«Ò@ÒÃtõüo¯ê·ý$ž„;8Ktuüú?ó–èëøÿô掩—ÎiÞð¯ FÜáIÞð¯ FÜá©oz<|esÏ[1B…f(Pù½BÔôP¡mBâ…µ -C¬-¨P¡Z… ·×…(1YŠ dÝZ˜¤Tb‘q0Èá‡c}¯DÄäA°¿Ã±¾×¢br25>zÐ󤳨ÜÌ´•V2;Pž±ÿLÀÒcvu|dÕþ¢{üfHê={ß<çÞ1ä¥VªÅ\˜y¤Hz2•Ý&Î2êšq6;p- +ð®W+¾5å¶æ‡S¢Ï WäM*­BT]ÇLyö¤¢D§_nΡ&ÚÎ’O:“c#ïmY<£V¬QáUéÓ~èíÉŽïtœí­$¤ªÊ±•ÈÈìdF=z÷¾yϼcŸX Ñéu¸´L]…ç×dS°- ’‰©\´²êÖf“Ê験ewI¾ÜýJ’ò\¤uÿA©b%# ÅŽÁÅŠ¹Zš’sî…]z§vr¼yH²+º.ølÜ_{a . Èä]ó§±3S­5êµ­¥ysX¯lÖ½Šöà!ëj°Ëµ‰4„LpæÆŽÔ—šî»–ÝS‰B¯Àw6\+ܲíµÊú"M"rð† ¥Tpš[R Däì=*¦hMå[)m6˜®&É3qf“<ÄW,›$4£´Æ1¢×1wjN”EQv’¥8ÜÖÛR‰×²¥ÃBšAç4šˆ‰;lDn-{ß<çÞ0×½óÎ}ã3E´ Ü,]GzªFÅaƒ{~g HeS M¬]9o©§‘¬Ê´åIÉ$IA\ŠqŒpÌE¤Œ:uŠ:*T¸ôŠ–±/³¬­S°²%de”ÌÈœ2J¸r‘w7 ëÞùç>ñ†½ïžsïÑP+e¤uÉžFÕK® ÐÌÆ°Ô‡ŸT-uÒÞï'É”5©²…$­ÝY U”rœ |m5ÊÆ¨/*¥-ÆêÇ Å4q¥›))ÈH&´j¯|å|¿Â¶V½ïžsïkÞùç>ñ3£ÚC‘«˜`ÙÃõ88†.»®ª‹Ñm.ÊÒ«¼¢Ë#3æÚєՕ)?sÀ,Ѱt*FˆðY;…žSjn˜¢#pÔ¹R›LU–G["Ö:M¼´¶dvJTD›l6µ ¾õN©^…‘Æ·¢ ˆyõ¦­nhÌ?šÖ,¾ÿ–Û}Íï¶ÅÓ܉Œêh×»•m8•§9ÙEªYØøö‘󳡈,ÂN,8TIÔzlŠöº yQ–Á›[Ž*s! "4£2TD›[e±L‹÷OŸÕü·?Áp=iqŠ€‹>“ö=2!=ÅŸIû™ ÓÔkñ¾¿ªßô4°Ý=F¿ëú­ÿI'¡ÎÝþüÂ$%º:þ?ýù…#ªeóšw¼+è·8D’w¼+è·8Gê[Þg\óÖÌP¡YŠ>oPµ=([P¸¡mC Pë j(V¡B†-õáAŠ Vbƒ7V…&)¤g\L28_áØßkÑ19l/ðìoµè˜œŒOž´<éËêvÆ\‹jµjÛÊm§iÇd’Ú”kuN´džäŽÅd¨î|]ó±´YÙû ñ‹Ñgì'Åþ/D9LvÂrê´Ùš¬I«¡‹M“¨Ï;îé¶”â›jìV7œ;‘\óm½ŠÞ¾ÏØO‹ü^ˆr˜Ø2êÎÏØO‹ü^ˆ;?a>/ñz!Ê``Ë«;?a>/ñz ìý„ø¿Åè‡)€mƒ.¬ìý„ø¿Å胳öâÿ¢¦¶ º³³öâÿ¢ÏØO‹ü^ˆr˜Ø2êÎÏØO‹ü^ˆFô“¥ì1‰°„ÚTwuO-§5}ˇ™FÚ’EµEµ\7îvÁ ¬YðŸ±é î,øOØôÈ@€nž£_õýVÿ¤¥†éê5øß_ÕoúH=vp–èëøÿôæ!-Ñ×ñÿèÿÌ)S/œÓ½á_@¹Â$“½á_@¹Â?RÞôxøË:çž¶b… ÌP¡óz…©è¡BÚ…Å jZ‡X[P¡Bµ 1o¯ Pb³ɺ´)1H¨Å#:âa‘ÂÿÆû^‰‰Èƒa‡c}¯DÄädj|õ çH‹>“ö=2!=ÅŸIû™ ÓÔkñ¾¿ªßô4°Ý=F¿ëú­ÿI'¡ÎÝþüÂ$%º:þ?ýù…#ªeóšw¼+è·8D’w¼+è·8Gê[Þg\óÖÌP¡YŠ>oPµ=([P¸¡mC Pë j(V¡B†-õáAŠ Vbƒ7V…&)¤g\L28_áØßkÑ19l/ðìoµè˜œŒOž´<é{JÁX§ÔÚp>2+pÒYâÿtpHú'Pÿ\_óÐ…jL#½g`ŽCao4³ì‡YØ#Ø[Í,û";ŒètJþ”ðÔ:õ"ŸTŒÝªêZ›!+'éäJ"QØÌ¯Ã´ÄnlÇ臉)ئ˜”öªH±Ö’) Ó"jZ’Ò«‘'T¦LÐVÊn–S1^ccu‚9 …¼Òϲg`ŽCao4³ìˆ]êë5çð÷_Ri¨¦Ñ“Q:„ˆÑMÉk[¯ë VH&š&ÐFHJUgu_iâ£b´¨Å…å}ÕH֚ԙꓑ¢+¹²“¶óÌl³°G!°·šYöC¬ìÈl-æ–}‘ƒ­â:©è*v.e;ßVëeÊ’•¹ßܦáU‘åWxÈø6Œ>1Ÿ‹hRèT*µÊ¬Šª¤¾ü¸LS›}³m-Y†Iü Ö¥wZÇ,“ÚesLsN³°G!°·šYöC¬ìÈl-æ–}‘ \Å5V0½}Tèê¨*TÆS×–¨Î¥¶Û-®²—•Š"Í—V´•¬vôÖªU‰UÅR˜ÆRƒ@f¥»ÛŽÂ“9kS‰RÏXJ"iÒTd‹鋺-—s®³°G!°·šYöG’uGe@+afݨH8ÑS¼í±ÂiÇM7$ìîYÜì]͸Lˆã¸R­‰qN'„ëµyxIÔš«ôö#²f·ä.I¸Ú–â¢Eš$™•°¬¤ï¤ÔjµzÖŒk•,LR•V¨È”ªN¥¤¦"÷º]ÐÙ¥$¿Ñæ6לÔf£/sÀÆËë;r y¥Ÿdq¶•Í“ÒP㇠£Sf–"0–šl´lJRV"ÿ¯ ÜöŽã5¥/öî£ýøH¦IFEÈÍ¡é-4ãíÇBÖIS®-‘žÕR5X¸vŸ¶ÈL:ÅG\}nõ߇÷Óvn-FIžýŸ&\ÛŸ/ºÙ{ÛõˆxظÚtzŽ<Äøz¥ª¥Pª;4´:é=­9i2WéSdjÊi<¤‹g=¤WIãðªë“ P’J…5¹Qš7”M¡µ¨áÚöîT¤/õ¸}óЧ”¡@6‹x‰ªÄÜI^v±XjDSŸ)† T–!–r5wh32o2ÉW»‡òÌÅtÉfxßÔØ›X~dŠ¢[]BdtFvK&ëi±’Z–]Ó‰5ªÙˆòíÊvoý†« ¶ÃÓ˜jTÍn%.½×«IYKiضظD®n§\ÃXš5NRäF‹¹1XQþŽ2÷[ þ‰<,Ž,¬›Œx´Xûñô•†œŽóŒ¬ê‘Û5!F“4©Ä¥I¹w&deß#2žR‡†…D]Q‰¨Á¦Ä޶ÚrD³^B[™ ²¥\É > $îd<îAb=}TÙUû©FócÝæ²’ò›¨µi·tVá!! VjôíV›§ÕgCAÕ¡$ÒÄ…¶FKfVr±ð²"üyS~M>ü}%a§#¼ã+:¤vÍHQ¤Í*q)Rn]ãI™wÈ̃3ÌaÙ§>íUY*l˜%˜ëI™æ5:—T“"µ­fU}½òáÛoO“„»÷Y¯·5ï{í¸˜žr/W)ÏÑëS©2TÚß…%Èî)³3I© 4™‘™ÚåÄCÆ6•r·SŸ¤ŒaC“)k¥Ú®eÿ¡%4Óî!dŽ^t%Y¸Lï·hÅa‡&Q°ý9}qÖ)èª:·˜b—MKæí–mš\Q¸Þm¨ØÙšŠÇ{mµŠ¹s 0Œ¨˜ƒ"¨Ò¢F¬ntT©‰I¹ µ¯’Ë™'«Y'i¤ÊÆÚKmÈŽ'¤]××t¥N\WSL(ÜŽÑ´—ÙA¥fƒÚ•¨Œ”¢ùF¡1VdGÆAºSŽaÇ«h•Ûbcq\cºÖ¤ÜBÖ…ûœ¦“Õ¬½Õî[JÆF$°ªÊE+ =)•Ì'7Fæ#»òI多]½ÙdÑä;—vgm¦,ÔÜ}Ü1ŠÝ•4g׈¢)Öc[TÚ®”X̲‘ì+ì¶Ó  gdn¶ó½Ö®».ä·ú6÷Ûßòû›êû½g öÞã Þ!­S4iEM>§**ÓUž†ÝiÓK ›Š¬ˆQmJMKR%b3Úb7H…ÙqʱÅFt…:̳Ãñg0¸Ñû…%Èñ–ãˆhÔ’5Yo/„­cQm [ɪ³C˜•Vq<½üa˜îUbµ^G|Ñó›ËRÈÌ›áîQs¹–m­ãZŸcy³gá7\:¬ÚŒFªˆmHªÆÉ.š·,ÚJ4›fDyˆ­cJ;”ßlR¾†Ó½úº+Ô«ÂlÕ¬ZÕºmßNb+%]â-›6 ‰È»„påCU·²™ª993¥+ÍÝwIIHÌÌÍE²ÂoØ'H~+W“¿Ñ‡SÆÍ?ýæÿÇhw¸‘ó;Ð*8^¿"‡UB2:[S‰I™‘Е§„ˆïeÃ-ƒ6WTÿÇž"ÿÓíZÔH V,øOØôÈ@„÷|'ìzd @7OQ¯Æúþ«Ò@ÒÃtõüo¯ê·ý$ž„;8Ktuüú?ó–èëøÿô掩—ÎiÞð¯ FÜáIÞð¯ FÜá©oz<|esÏ[1B…f(Pù½BÔôP¡mBâ…µ -C¬-¨P¡Z… ·×…(1YŠ dÝZ˜¤Tb‘q0Èá‡c}¯DÄäA°¿Ã±¾×¢br25>zÐó¤÷[ÄÔ8µWã½=$ãj$¬’…(ˆìW+‘\¿`à@1‘Û8‚FŽñ°x‚ŸI«î|ÚÝM×ê³[6\è;_*onô3VÁ Óš¦²Ü&á2´8ÔtA2i BÉhRRI±T’Qp–Ò<6§.Ý­T0lØ:ÔjuKs«;®žoj•ÆœÈ;ÂÚC=Œ TŲëÕ“§Õì(‘™.˜n“ aÉ Ö$Ô“Ú{¢Û­“„ï³€6™wLÌI…fÃzÉ ÉŠûjiæ]Œµ¡Ä(¬¤©&›‘‘ð‹š¾ ­A85”B©DQ’‰pÖÌË€ò©&C‡@6™vÜÉz>™Gj..E1«já»NÎÂ-Ád2•¾€ªËÑõU¨­U!Rç7 Èã&M;XLZÙ H<¼ÁÄ8i—t£aTLrb$2™.¶†œx£,–´ ÔhI«-ֳ̈"ïfWŒ|y;VU^=>’ÍIn›Ê–ŠnW”á¥I5šÉ³eZŠ÷½”eß1ÄÀL»¿®ì=ãÁsÙm¥/öî£ýøH€#>üY-IŒóŒ>ÊÉÆÜmF•!Dw%–Ò2=·ÀJ¾1¯,1œžö†$©PÝ7bIz;ŠB›54³IšTFJM˼dfF]ò1db _2d H—Sñ$#Ü:ˆ…§è2ÚCÕ¿µ½÷Mc~j;ä’2LÍÒ½q\ŒŽË¾n2áà1Ž8k•¦w~¦±Po|o»²ÉYn«ÞúͽÝó+Ý_ÝóÓ§M¦Ìnm:dˆr›¾G˜tÛZnFGe‘•È̾ƒp £x·dfëÕD15kr[i–á&B–VZ–W²E°Ìï~øñÓ§M¦Ìnm:dˆr›¾G˜tÛZnFGe‘•È̾ƒpˆuÚÜ)Ò'C¬TcË’fo¾Ô•¡ÇLÎæjQÕsÛ´y“%‰ˆ˜Ì‡[’Û„êBÌ–•‘Ü”J-¤wÛqhàeÄx…š«Õf«ÕFê/£Vì´Ëpžq;;•.ùŒ»”ì3ïµ·Y ØPjõ±^¾µ–d­]öwI#±ÿ8ðŒ@Ê7ˆñ u7jתˆžñ]”™n®—{ˆˆ¶ŸxcŸyÙ­÷Ý[®¸£RÖµ”£>3>`{iµŠµ1§š¦Õ'Bmò³©!M“…Ä¢I•ÿœ~5Uª5Jz’ÕJctç׬v"_Q2â¶wJEò™÷)ÚeÞ.!ãÀ÷ïÕgz·§}§ï‚î…êxoî/oØ(v«Tz”Í%Ú”Ç)Ì/XÔE>£eµmî’‹å#î•´‹¾|cÆïŸ[¬Ô'µPŸWŸ.c$IjCòV·DfdD£;•ŒÌöq˜¦§X«U$7&¥T5öÊÈrD…8¤ý£3!âÄuV³W«j·Ö«:~¨¬Þé·2f3°óÊ—*^«uIyýKDÓZÇ Y\ Mø]â-‚È ÀÊá\EWÂõdÕhr“b•.)”:DW#÷+#+܈ïm–^ÎúVåWîøÝÖ %Š+Õ\M]‘\®JÝu 9uÏjÒŒÙRHOr’".å$[ ¼1 ‹>“ö=2!=ÅŸIû™ ëÔ;©zn6^Ï«:L¥C">ä’®#â(ož¡e¡½8­Ç”!4Y¦¥(ìDD‚Úb$‡nïm/ææséö­ÕušCÅ8y–5q)Ôút„-kÌâÖò¥®dDYHšEŠ×¾m§r"Ö5íhÒ³¥(¸ö[ðŽCEødê5_#,ެ¯Â[n\ <¦|šs¢·šLØíÖC­ª“F²¢2>îw|…a-„´.Î,¢.®Ìº$ë2;qܧJyIK2]dŒÖSFfMßbK„{Ï©ž)ðÕhh™ùñ³´ñx­ª¿þ£$athReâsåRqŒ‡[«4U'k¦ªq!ä6„îc•À”¥-‘j6(ˆËaf~;å9ŒN¦¼ï«î¬ÑLú®ÖXž5 y¦gçÇçk$?P<Ó3óã;WÒ–$6–ˆ.Óg1V’qÛ\l5Ty¨ÝœÎÛÉ,³K+j+6H3¹+bIFYö1–-™O£Ç‰ ,z„Úúég&¡J•§YL7dkÛaÓK¥î 9ĽҲ%m%9ò¶¾z߯ꟺvÓÙ¯fõ6Ò¡C~dÚæ†ÔëÏ;L˜„6„•Ô¥(çØˆˆŒÌÏ€]íbƒã:šfþ|J´­VÅ“°?…êå£R‡P7#8—%º¸IuŵúC&RIy9R­a™‘‘¨¸Fz^$¨±Z¬Ré©1ê±;T¶$¸Â²ý˜Ì•<ù%Dn,• ¬i¹%´Ü­qIò޲zݫꟹ¶;5·kÐ<Ó7óãðú—éþ2 yªoçÆâÑýb·S{B¯ïqʤUw ‚…¡£sGx”d¥(ÉFoËìØ[ms”Žs­ÔÏ[•2œCœûW©Þ2 yªoçÇçjå;ÆT5MüøèÐMéë\ÿ2båÚ¹MñÍS>?;Véž1 yªoçÇG¬Þ¹?Ý?ɇ;Eêbƒô¾ÅN€‡{ôÍ;\­ßž=ݯ ñÝÌÒÿ<7Ø MUOYµá~; yš_烵á~; yš_ç†û”´'kÂüw@ó4¿ÏkÂüw@ó4¿Ï ö™µá~; yš_烵á~; yš_ç†ûÌ Úð¿Ð<Í/óÁÚð¿Ð<Í/óÃ}€fF„íx_Žèf—ùàíx_Žèf—ùá¾À3#Bv¼/Çt3Küðv¼/Çt3Küðß`‘¡;^㺙¥þx;^㺙¥þxo° ÈЯ ñÝÌÒÿ<¯ ñÝÌÒÿ<7ØdhN×…øîæiž×…øîæižì24'kÂüw@ó4¿ÏkÂüw@ó4¿Ï ö™µá~; yš_烵á~; yš_ç†ûÌ Úð¿Ð<Í/óÁÚð¿Ð<Í/óÃ}€fF„íx_Žèf—ùàíx_Žèf—ùá¾À3#Bv¼/Çt3Küðv¼/Çt3Küðß`‘¡;^㺙¥þx;^㺙¥þxo° ÈЯ ñÝÌÒÿ<¯ ñÝÌÒÿ<7ØdhN×…øîæiž×…øîæižì24'kÂüw@ó4¿ÏkÂüw@ó4¿Ï ö™µá~; yš_烵á~; yš_ç†ûÌ Úð¿Ð<Í/óÁÚð¿Ð<Í/óÃ}€fF„íx_Žèf—ùàíx_Žèf—ùá¾À3#Bv¼/Çt3Küðv¼/Çt3Küðß`‘¡;^㺙¥þx;^㺙¥þxo° ÈЯ ñÝÌÒÿ<¯ ñÝÌÒÿ<7ØdhN×…øîæiž×…øîæižì24'kÂüw@ó4¿ÏkÂüw@ó4¿Ï ö™µá~; yš_烵á~; yš_ç†ûÌ Úð¿Ð<Í/óÁÚð¿Ð<Í/óÃ}€fF„íx_Žèf—ùàíx_Žèf—ùá¾À3#Bv¼/Çt3Küðv¼/Çt3Küðß`‘¡;^㺙¥þx;^㺙¥þxo° ÈЯ ñÝÌÒÿ<¯ ñÝÌÒÿ<7ØdhN×…øîæiž×…øîæižì24'kÂüw@ó4¿ÏkÂüw@ó4¿Ï ö™µá~; yš_烵á~; yš_ç†ûÌ Úð¿Ð<Í/óÁÚð¿Ð<Í/óÃ}€fF„íx_Žèf—ùàíx_Žèf—ùá¾À3#Bv¼/Çt3Küðv¼/Çt3Küðß`‘¡;^㺙¥þx;^㺙¥þxo° ÈЯ ñÝÌÒÿ<¯ ñÝÌÒÿ<7ØdhN×…øîæiž×…øîæižì24'kÂüw@ó4¿ÏkÂüw@ó4¿Ï ö™µá~; yš_烵á~; yš_ç†ûÌŽ—Ôà‰QÕEf€¶ÕlÉÞye{ûÓ†?µb•ã šæþ|t€dsjÅ+Æ5Íüøv¬R¼a@ó\ßÏŽÌŽoíX¥xÂæ¹¿ŸÕŠWŒ(k›ùñÒ‘Íý«¯P<×7óáÚ±Jñ…Ís>:@29¿µb•ã šæþ|;V)^0 y®oçÇHfG7ö¬R¼a@ó\ßχjÅ+Æ5Íüøé Èæ½Nøf·‰ñ\JKtªt-eTÖQ*<É.¸Ia—3©i–Ù_ô¶±'¼3=SðŒé.Á©áGyD†¤aYjÍIY›r[‰#Ì„™ˆöl>²ð¬…C«iRZLbi&üL§ÿÈzêsdD¡™Å¦Ë[féGaÕ$­)õXˆ®]õ)DW;\ïkØÇ‡[«®Æ"Šs2Î×ëjÓâ(§3(=7FeQJÕ ý:h;-=Ž#¥HâÌ“xŒ¿œ†ÌÐæ™‡÷Öõ -Ñ©ÿg°Ôjf|¹ý÷kšËfîx2Ý\9¶Dë*†ñ… =Å;)‡X‰=üê2ã«J]Øg±$j¹pHnl%ügìó=點±Ê]ô׿í3˜ç¥ªtñx­ª¿þ£$KiTèT¨«KKô•'1ªî<êqW3>­Gn½ŠÅblJ¦F¤G¦Ãe+Ї”M°”’–²Îµ‹j”¥)F|&ff{Lfw?c›!ÛKPGÑÞqÛ¦½ª4’ZB§>¢ŒD¢QYê,dGú,¼ÄC!O´8)„LÆ}k…1SYuùo<æ½L­“Z–µ–zµ©=ÑžËq¶~â‡àŒsdŠ‚1Íœ IŠ0ÄÏIv³Nuó–É1) Ìy”HA‘kÚÒ•šnyMDf–2±ÜQ…aN¤Ué“¥µ9zùO2J}m²Y:ÙçeZ¶’’R8 ¯c¹ßmn(~Ç6A¸¡ø#ٟц{ Òê)’–“R¨.sÍ1!ÇÐÚ¶Û"ֻݸyZI©j"3Q¨ì%‚i¸¡ø#Ùâ‡àŒsd°MÅÁæÈ7?c›!°MÅÁæÈ7?c› À…€šn(~Ç6A¸¡ø#Ù,ÓqCðF9² ÅÁæÈ0!`&›Š‚1Ín(~Ç6A 4ÜPüŽlƒqCðF9² X ¦â‡àŒsdŠ‚1Í`BÀM7?c› ÜPüŽlƒi¸¡ø#Ùâ‡àŒsd°MÅÁæÈ7?c› À…€šn(~Ç6A¸¡ø#Ù,ÓqCðF9² ÅÁæÈ0!`&›Š‚1Ín(~Ç6A 4ÜPüŽlƒqCðF9² X ¦â‡àŒsdŠ‚1Í`BÀM7?c› ÜPüŽlƒi¸¡ø#Ùâ‡àŒsd°MÅÁæÈ7?c› À…€šn(~Ç6A¸¡ø#Ù,ÓqCðF9² ÅÁæÈ0!`&›Š‚1Ín(~Ç6A 4ÜPüŽlƒqCðF9² X ¦â‡àŒsdŠ‚1Í`BÀM7?c› ÜPüŽlƒi¸¡ø#Ùâ‡àŒsd°MÅÁæÈ7?c› À…€šn(~Ç6A¸¡ø#Ù,ÓqCðF9² ÅÁæÈ0!`&›Š‚1Ín(~Ç6A 4ÜPüŽlƒqCðF9² X ¦â‡àŒsdŠ‚1Í`BÀM7?c› ÜPüŽlƒi¸¡ø#Ùâ‡àŒsd°MÅÁæÈ7?c› À…€šn(~Ç6A¸¡ø#Ù,ÓqCðF9² ÅÁæÈ0!`&›Š‚1Ín(~Ç6A 4ÜPüŽlƒqCðF9² X ¦â‡àŒsdŠ‚1Í`BÀM7?c› ÜPüŽlƒi¸¡ø#Ùâ‡àŒsd°MÅÁæÈ7?c› À…€šn(~Ç6A¸¡ø#Ù,ÓqCðF9² ÅÁæÈ0!`&›Š‚1Ín(~Ç6A 4ÜPüŽlƒqCðF9² X ¦â‡àŒsdŠ‚1Í`BÀM7?c› ÜPüŽlƒi¸¡ø#Ùâ‡àŒsd°MÅÁæÈ7?c› À…€šn(~Ç6A¸¡ø#Ù,ÓqCðF9² ÅÁæÈ04Æmâ}%´êIh^,y*Ið(—!ù¼g…'©T&wÖ¸n ŒË½œ–¤–bùD{mÞàC S)¨‹:B)ñôª”·d8L¤”êÉå ”£µÔyP„ÜûÉ"à"ÅÁæÈs¹f›˜™ë7lSw=c¤´NÂ5W«¨®b"KFÓ†ëQó’Ö·NýÛ†WNË™‘žÛÊÖ=Á„¿Œýþc-¸¡ø#Ù Œ²Ë7Õ4ÛwáÊ’+‰³j›QŠSjÕ6©ÛKÿÙxymon-4.3.28/docs/xymon-mrtg.html0000664000076400007640000001301612603243142017147 0ustar rpmbuildrpmbuild Integrating MRTG data into Xymon

Integrating MRTG data into Xymon

This document describes one way of integrating MRTG graphs into Xymon. It's simple, doesn't require any additional scripts, and provides all of your MRTG graphs as part of the "trends" column that is already present for all hosts in Xymon.

Another way of doing this is the bb-mrtg.pl script. This is an extension script that gives you some more options for controlling where the graphs show up, and also lets you generate alerts based on data collected by MRTG.

Simple Xymon-MRTG support

MRTG by default uses its own fileformat for the data files, and continuously generates PNG- or GIF-images of the data. This is a waste of resources - most of the time, these images are never seen. This was in fact one of the reasons that RRDtool was developed, to separate the data-collection from the graph generation.

Xymon uses the RRDtool format for all of its data. You can configure MRTG to save data using the RRDtool data format, instead of the default MRTG log-file format. This lets your MRTG save the data directly into the Xymon RRD directory, in the same format that all of the other Xymon RRD files use. You can then use the normal Xymon graph tools to view the graphs.

To configure MRTG to use the RRDtool format, you must setup the mrtg.cfg file like this at the top of the file:

# For Xymon integration
WorkDir: /usr/local/xymon/data/rrd
LogFormat: rrdtool

Note that the WorkDir setting points to the top-level RRD directory, i.e. the one defined via the XYMONRRDS setting in xymonserver.cfg. The Logformat: rrdtool makes MRTG save data using the RRDtool data format.

Each of the network interfaces you monitor have a target-definition in the mrtg.cfg file. You need to modify this slightly, to make it save the RRD data file in a subdirectory matching the hostname you have in the hosts.cfg file, and with a filename that begins with "mrtg.". Like this:

Target[mrtg.myrouter.eth0]: /10.0.0.1:public@myrouter.sample.com:
Directory[mrtg.myrouter.eth0]: myrouter.sample.com

This defines an MRTG target, where it monitors the interface on myrouter.sample.com that has the IP-address 10.0.0.1. It uses the community name public to query the SNMP daemon on the router.

The Directory[mrtg.myrouter.eth0]: myrouter.sample.com instructs MRTG to save the data file in this directory relative to the WorkDir directory, i.e. the final directory for the RRD datafile will be /usr/local/xymon/data/rrd/myrouter.sample.com which is where Xymon expects all of the RRD-files for the myrouter.sample.com host to be. The name of the RRD data-file will be mrtg.myrouter.eth0.rrd - i.e. the name of the target.

The reason for naming the data file mrtg.*.rrd is that the showgraph tool has a built-in definition for generating graphs from this type of files. So if you stick to this naming convention, the graphs will automatically show up on the Xymon "trends" page. If you have more than one device that you collect data from, you'll need to modify this; you can use any name for the target as long as it is of the form mrtg.*.DEVICE - i.e. first "mrtg.", then some random text (e.g. the hostname), then a dot and the device-name. The device-name is used as a legend on the graphs, so you probably want to make this something recognizable, like the name of the network interface, or some sensible description like "DSL", "LAN", "T1" or whatever you know your devices as. Note the MRTG converts this to lower-case.

Here is the full mrtg.cfg configuration used to track traffic on my Internet gateway (currently a 4 Mbit/512 Kbit ADSL). Note that even though MRTG does not use the Title and MaxBytes settings, they are required - MRTG will not run without them:

# For Xymon integration
WorkDir: /var/lib/xymon/rrd
LogFormat: rrdtool

# The external interface on my router
Directory[mrtg.fenris.dsl]: fenris.hswn.dk
Target[mrtg.fenris.dsl]: /80.62.63.88:public@fenris:
Title[mrtg.fenris.dsl]: Traffic Analysis for External DSL
MaxBytes1[mrtg.fenris.dsl]: 500000
MaxBytes2[mrtg.fenris.dsl]: 62500

# The internal interface on my router
Directory[mrtg.fenris.lan]: fenris.hswn.dk
Target[mrtg.fenris.lan]: /10.0.0.1:public@fenris:
Title[mrtg.fenris.lan]: Traffic Analysis for internal LAN
MaxBytes[mrtg.fenris.lan]: 1250000

With this setup, I have the MRTG graphs readily available on the "trends" page, together with all of the other Xymon graphs.

Running the MRTG data collector from xymonlaunch

Normally there is a cron job that runs the mrtg command every 5 minutes to collect the MRTG data. But you can run it from xymonlaunch - this also has the benefit that the RRD files will be owned by the xymon user.

All that is needed is to add a section for MRTG to Xymon's tasks.cfg file. Mine looks like this:

[mrtg]
	CMD /usr/bin/mrtg --lock-file $XYMONSERVERLOGS/mrtg.lock /etc/mrtg.cfg
	INTERVAL 5m
	LOGFILE $XYMONSERVERLOGS/mrtg.log

Some Linux distributions setup MRTG with the expectation that it will always be run by the root user. So you may have to change permissions on some files and directories e.g. to permit the xymon user to read the mrtg.cfg file. Check the mrtg.log file for errors.

xymon-4.3.28/docs/bb-to-xymon.html0000664000076400007640000001313412603243142017202 0ustar rpmbuildrpmbuild Upgrading from Big Brother to Xymon

Upgrading from Big Brother to Xymon

First, you should realize that this is not a fully automated process. You will need to do some work yourself - especially with the handling of alerts.

First step: Install Xymon

To begin, install Xymon as described in the Xymon installation guide. I recommend that you configure Xymon to use the same user-ID as your current Big Brother installation, but have it use a different directory for the server- and data-files. The default is to use ~/server and ~/data respectively, which is unlikely to clash with the directories where you have Big Brother installed. If you do need to change the directories, you must edit the top-level Makefile and change the XYMONHOME and XYMONVAR settings near the top of the file.

Step two: Move the configuration files

A couple of configuration files can be copied directly from Big Brother to Xymon:

  • The bb-hosts file, must be renamed to hosts.cfg
  • The bb-services file. You need only copy this if you have used bbgen before, and added custom network tests to the bb-services file. You must rename it to protocols.cfg.
  • The cookies file. You may not have this file - it is only present if you have used bbgen before and have setup HTTP tests that require cookies.
  • The bbcombotests.cfg file. You may not have this file - it is only present if you have used bbgen before and have setup the bbcombotest tool. Copy it to combo.cfg.

The bbwarnrules.cfg and bbwarnsetup.cfg files cannot be copied over. Xymon uses a very different configuration file for the alert configuration, so you will have to re-write your alert configuration for Xymon. See the Xymon alert configuration to learn how Xymon alerts are configured.

Any server-side extension-scripts can be copied from the $XYMONHOME/ext/ directory to the ~/server/ext/ directory. You must also add entries for them to the Xymon tasks.cfg file. Beware that many scripts rely on environment variables that Big Brother defines, but which Xymon does not define - in that case, you need to setup those environment variables in the xymonserver.cfg file. It is probably easiest to save this until you start running Xymon, and can look at any error-output from the scripts.

If you have modified the webpage header- and footer-files in $XYMONHOME/web/ then you can copy the modified files over directly to the ~/server/web/ directory. Note that Xymon has a number of header- and footer-files for the various CGI scripts that are not present in Big Brother, so you may need to setup a few extra files to get a consistent look across your new Xymon installation.

Step three: Stop Big Brother

You are now going to move over the data files. To avoid confusion about files being updated by Big Brother while they are being moved over to Xymon, I recommend that you stop Big Brother now.

Step four: Move the history logs

You may want to save the historical logfiles and the history of your status changes. To do that, move all of the files or directories in the $XYMONVAR/hist/ to the ~/data/hist/ directory, and all of the files or directories in $XYMONVAR/histlogs/ to the ~/data/histlogs/ directory. If you prefer to keep them in the Big Brother directory, you can copy them over with "cp -r" or "tar" instead of moving them.

Step five: Move the RRD files

The RRD files are used to generate the graphs, if you have installed the LARRD add-on to Big Brother. Xymon has RRD support built-in, and it is obviously nice to keep the historical data that has been collected over time.

The filesystem layout of the RRD files is different from Big Brother+LARRD to Xymon. Instead of having all of the RRD files in one big directory, there is a subdirectory for each host holding only the RRD files for data from that host. This is easier to manage, and also speeds up the graph generation when you have many hosts. Unfortunately, it makes migrating from Big Brother to Xymon slightly more complicated.

In the Xymon source-tree, you will find a script xymond/moverrd.sh. This script moves or copies the RRD files from the Big Brother+LARRD structure into the Xymon structure. You must edit a couple of settings at the beginning of the file, especially to set the correct directory where Big Brother stores your current RRD files (the SRCDIR setting). By default the script copies the files over to the new structure, if you would rather just move them then change to "OP" setting to "mv".

After setting up the script, run it and it should copy all of the RRD-files that relate to a host currently in the hosts.cfg file to the new directory structure.

Step 6: Start Xymon

Start Xymon with the ~/server/xymon.sh start command. Look at the logfiles in the /var/log/xymon directory (or elsewhere, if you did not choose the default logfile directory when configuring Xymon) and fix any problems that show up.

Look at the webpages generated. For the first few minutes, there will be some missing columns and icons for each host, since it takes some time for all of the tests to report a status to the new Xymon daemon. After 5-10 minutes all of the standard tests should appear.

xymon-4.3.28/docs/xymon-config.html0000664000076400007640000004103711535462534017462 0ustar rpmbuildrpmbuild Configuring Xymon Monitoring

Configuring Xymon Monitoring

The Xymon configuration is kept in the files in the ~/server/etc/ directory. If you look at this directory, you will see these files:

  • hosts.cfg is the one you will change the most. This file contains a list of all the hosts you are monitoring, including information such as their IP-address, what network services you are monitoring on the host, what URL's you are checking, what subpage in the Xymon web-pages this host is shown on etc. The name of the file - "hosts.cfg" - was chosen so it is compatible with the Big Brother system which uses the same filename and file format.
  • analysis.cfg is the configuration file for data reported by the Xymon clients installed on the hosts you are monitoring. This defines the color of the cpu-, disk-, memory- and procs-columns, based on the information that is sent to Xymon by the clients.
  • alerts.cfg holds the alerting configuration. In this file, you setup the rules for sending out alerts about services going down: Who gets the alert, how is it sent, how often, whether to send alerts 24x7 or only between 10 AM and 4 PM on weekdays etc.
  • xymonserver.cfg is the configuration file for the Xymon server. This file defines a lot of environment variables that are made available to all of the Xymon programs when they run. Some environment variables that are defined in the Big Brother system are also setup by Xymon, so that Big Brother extension scripts will work.
    The initial configuration of xymonserver.cfg is setup by the configure script when you install Xymon, and in most cases you will not need to change it.
  • tasks.cfg is the configuration file for the xymonlaunch tool. xymonlaunch is the master program in Xymon, it is the only program you start to run the Xymon server. xymonlaunch reads the tasks.cfg file, and starts the programs listed here to run the server. Some of the programs may run as daemons, some of the programs may run at regular intervals. If you want to use some of the advanced options for the xymongen or xymonnet programs, you change the tasks.cfg file to add these options to the command line.
  • graphs.cfg is a configuration file for the showgraph CGI. It defines how the graphs are generated from the data in the RRD files.
  • protocols.cfg is a configuration file for the xymonnet program. It defines how network services are checked.

Setting up monitoring of hosts

The hosts.cfg file defines which hosts Xymon monitors. When you install Xymon, a simple configuration is setup that just lists the Xymon server:
Simple Xymon hosts.cfg file

There are a few things to notice here:

  • Lines that begin with a # are comments.
  • Each host you monitor is on a line by itself, with the IP-address and the hostname of the host.
  • You can add extra tags to each host definition, by putting in a #-mark and then some keywords. These keywords define how Xymon handles the host.

The hosts.cfg file shown in the example has only one host defined: www.hswn.dk which is the server running Xymon. There are a few extra keywords thrown in:

  • BBDISPLAY, BBPAGER, BBNET are compatibility settings for extensions written for Big Brother. Xymon doesn't use these, but puts them in the hosts.cfg file to avoid problems if you mix Xymon and Big Brother modules.
  • bbd is the name of a network test. This keyword causes the Xymon network-tester xymonnet to check if the bbd network service is running on this host, and send a status report to the Xymon server with the information about this service. So you'll get a (hopefully!) green icon on the Xymon webpage for this host, showing the status of the bbd network service.
    Network services are defined in the protocols.cfg file, so this file must have an entry for bbd defining what TCP port to check, and possibly also what data to send to the service and what to expect as a response.
  • http://www.hswn.dk/ is a URL, obviously. This also triggers a network test, the Xymon network tester will try to request this URL, and send in a status report showing if the URL was accessible or not.

By default, Xymon will always check if the host is up and running by trying to "ping" it. This results in a conn column on the Xymon webpage for this host, showing if the ping-test succeeded. If you have a host that does not respond to ping - e.g. because there is a firewall that filters out such requests - then you can disable the ping-test by putting a "noconn" keyword on the line in hosts.cfg.

As you can see, the syntax is pretty straight-forward. Need to monitor an extra URL for this server ? Just add the URL to the line. Need to check if ssh (Secure Shell) is running ? Just add ssh to the line. The full set of keywords you can use is described in the hosts.cfg man-page. Many of the keywords relate to the way Xymon displays the information about the host on the web-pages, other keywords deal with how the uptime percentage is calculated for availability reports, and some keywords - like the bbd and http://... mentioned above - describe the network services that are tested for this host.

Monitoring network services

As shown in the example above, adding a network test for a host is as simple as putting the right keyword into the hosts.cfg file. The default set of network tests configured in Xymon 4.0 is as follows:

connSimple ping test. Enabled by default, you can disable it by putting "noconn" into hosts.cfg.
httpWeb-server test. Enter the URL to request from the webserver.
ftpFTP server test.
sshSSH (Secure Shell) server test. Supports ssh1 and ssh2.
telnetTelnet server test.
smtpSMTP (Mail server) test.
pop3POP-3 test.
imapIMAP test. IMAP version 2 and 4 are supported, for version 3 use "imap3".
nntpNNTP (News) server test.
ldapLDAP (Directory server) test. Enter the full LDAP URI if Xymon is configured with LDAP support.
rsyncrsync server test
bbdXymon network daemon test (historically named after the Big Brother daemon, bbd).
clamdCLAM anti-virus daemon test.
spamdSpamAssassin anti-spam daemon test.
oratnsOracle TNS listener test. Will attempt to do an oratns "ping".
qmtpQMTP server test. For qmail's qmtpd service.
qmqpQMQP server test. For qmail's qmqpd service.

If Xymon is built with OpenSSL support, the following SSL-enabled services can also be checked:

httpsWeb-server test. Enter the URL to request from the webserver.
ftpsSecure FTP server test.
telnetsSecure Telnet server test.
smtpsSecure SMTP server test.
pop3sSecure POP-3 server test.
imapsSecure IMAP server test.
nntpsSecure NNTP (News) server test.
ldapsSecure LDAP (Directory) server test. Enter the full LDAP URI if Xymon is configured with LDAP support. Note that this is only possible when Xymon is built with the OpenLDAP v2.x client library, and only for LDAP servers that support LDAP version 3 and the "starttls" command. LDAP server that use the older non-standard method of tunnelling LDAP through SSL on port 636 will not work.

There are a few network tests that Xymon can run for you, by using external programs. This is not a very effective way of testing, so it is only done this way for a few very specialised tests:

ntpNTP (Network Time protocol) server test, using the "ntpdate" command.
rpcRPC service test. This queries the portmapper service on the server, using the "rpcinfo" command. See the hosts.cfg(5) man-page for details on how to test for specific RPC services.

Monitoring host-specific data with clients

You can install a client on each of the hosts you monitor, to check host-specific data such as CPU utilisation, disk usage, if certain processes and services are running etc. Xymon includes clients for most Unix-like operating systems. A client for Windows is planned but the programming has not yet started.

First, make sure you have installed the Xymon client on all of the hosts you want to monitor, and you have these hosts listed in your hosts.cfg file. The Xymon client will pick up the hostname of the box it is running on automatically, but it is not uncommon for the name it finds to be different from what you've put into hosts.cfg. So if you know that the client is running but no data appears, check that the hostname used by the Xymon client is the one you expect. See this FAQ item for details.

With the Xymon client running and reporting data into Xymon, you should see the cpu-, disk-, memory- and procs-columns appear. The color of these status columns is determined by settings in the analysis.cfg configuration file. Here is an example of how to setup a host:

As you can see, there's first a definition of what hosts the following criteria applies to. Here, it is only a single host: voodoo.hswn.dk - but you can use various filters on hostnames, pagenames and time of day to determine what the thresholds should be for each of the criteria monitored with the client data. The analysis.cfg man-page describes this in detail.

After the host filter comes the criteria used to determine the color of each of the status columns.

UP Sets the cpu column color, based on how long the host has been up. After the UP keyword you put two time limits: The first one (30m in the example) defines how long after a reboot the cpu column is yellow. The second (optional) value causes the cpu column to go yellow after the host has been up for this long - it may be useful, if you need to reboot your servers regularly.
LOAD Sets the cpu column color, based on how much load is on the system. After the LOAD keyword you put two limits: The first number is the limit where the cpu column goes yellow; the second is the limit where the cpu column goes red.
For Unix systems, this threshold is matched against the 5-minute load average value, as reported by the "uptime" command - it is therefore a positive number.
For Windows systems, this threshold is matched against the CPU utilisation - this is a percentage between 0 and 100.
DISK Sets the disk column color based on how full the filesystem is. This takes three parameters: The name of the filesystems; the threshold where it goes yellow; and the thresholds where it goes red.
The name of the filesystem is the mount point. You can specify this either with the full path, or you can use * meaning "all filesystems". You can also use regular expressions by prefixing the expression with a percent sign, e.g. "%^/ora.*" would match all filesystems that are mounted on a path beginning with "/ora" - "/ora/db/vol1" for instance. As shown in the example, you can have multiple specifications with different thresholds - these are evaluated from top to bottom, so it is best to put the most specific ones first, and the general ones last.
The yellow and red thresholds are percentages - they trigger when the filesystem has filled up to the percentage you specify.
PROC Sets the procs column color based on what processes are running. This takes at least one parameter: A string that is (part of) the command line that the process runs. You can have a simple string here or a regular expression - Xymon will scan the "ps" output for the string or expression, and count how many times it appeared in the ps listing.
The process count is then matched against the thresholds that are the second and third parameter - the second parameter is the minimum count (by default: 1), and the third parameter is the maximum count (default: -1, meaning unlimited). Note: If you want to set a maximum count, then you must also set a minimum count - even if it is 1.
The last parameter defines the color used for the procs column, if the process count does not fall within the thresholds. By default it will go red - you can put "yellow" as the last parameter.
You can have several PROC entries for the same host, if you need to monitor multiple processes.
MEMPHYS
MEMACT
MEMSWAP
Set the memory column color based on the thresholds for memory utilisation. Each of these keywords takes two parameters: The first is the warning (yellow) threshold - in percent - of memory used. The second is the panic (red) threshold - in percent - of memory used.
By using one of the three keywords, you can set thresholds for the physical memory (RAM), the swap space, and - on platforms supporting this, e.g. Linux - the actual amount of memory used for applications.
LOG Set the msgs column color. This takes at least two parameters: The first is the name of the logfile, the second is a pattern defining which logentries trigger a change of color.
Optionally, this can be followed by a third parameter defining which color this LOG entry causes, and fourth parameter which is an "ignore" pattern you can use to filter out lines which do match the first pattern of lines that trigger a change in color, but that you really do not want to trigger a color change.

More about logfile monitoring

Configuring the LOG entries in the analysis.cfg file is only one half of the configuration - you also need to tell the Xymon client running on the monitored system that it must send in some data from that logfile in the first place. For that, you must configure the client-local.cfg file with the name of the logfile.

xymon-4.3.28/docs/install.html0000664000076400007640000006700112603243142016477 0ustar rpmbuildrpmbuild Installing Xymon

Installing Xymon

This describes how to setup a Xymon server for monitoring your systems. It assumes that you are setting up a full Xymon server - i.e. either you do not have a Big Brother server, or you will replace it completely with Xymon.

Note to Big Brother users: Although some of the Xymon tools have evolved from the bbgen toolkit that was used on top of a Big Brother server installation, the Xymon versions of these tools now require that you run Xymon - not Big Brother. If you are migrating from Big Brother to Xymon, then you should follow the migration guide.

Prerequisites - before you install Xymon

You may want to check the list of common systems which has brief instructions for installing Xymon for these types of systems.

There are a few things you should check before you begin to install Xymon. Don't be scared of the number of items here - it is likely that you already have most or all of it in place.

A webbrowser capable of handling HTML 4, JavaScript and CSS

This includes most browsers available today - Internet Explorer 5 or later, all Mozilla/Firefox versions, Konqueror, Netscape 6 and several others. The old Netscape 4.x browsers are known NOT to work.

A Unix-like operating system

Xymon is written for Unix-based systems, e.g. Linux, FreeBSD, or Solaris. It will probably work on any Unix-like system that supports the Unix System V IPC mechanisms (shared memory, semaphores) - that should be just about anything Unix-like you are likely to have.

Sufficient SYSV IPC resources on your system

Xymon uses 8 shared memory segments, ranging in size from 32 KB to 512 KB (2336 KB total) in the default configuration; and 8 sets of 3 semaphores. Experience shows that some systems need tuning to provide the necessary IPC resources that Xymon uses. Specifically, when installing on Solaris you must increase the "shmseg" kernel parameter from the default 6 to at least 8. Since other programs on your system may also use shared memory, a higher value may be required. See http://www.xymon.com/archive/2005/08/msg00183.html for more information about these issues.

A webserver

Xymon is designed with a web-based front-end. So you should have a webserver such as Apache running on the server where you install Xymon.

A working C compiler, GNU make.

Xymon is written in C, so you need a working C compiler, e.g. gcc. You will also need a "make" utility - many systems have one by default, but you need to use the GNU make utility. On some systems, this is pre-installed as "gmake" or "gnumake". The configure-script checks this for you.

HP-UX users should note that the HP-supplied C compiler is known to mis-compile the lib/environ.c file, and produces an output file lib/environ.o of length 0 bytes. HP-UX users on the Xymon mailing list agree that the default C compiler shipped with HP-UX should not be used to compile Xymon - it is only for re-building the HP-UX kernel. The GNU C compiler works fine on HP-UX. More details in this e-mail from the Xymon mailing list.

PCRE, RRDtool, OpenSSL, OpenLDAP libraries.

Xymon relies on a number of Open-Source libraries - these must be installed before you start building Xymon. On many systems you already have these pre-installed - they are commonly installed by default on Linux systems, and FreeBSD has all of them in the "ports" collection.

Note: Although many systems have these libraries pre-installed, they often include only the run-time libraries and not the files that are needed to compile and build programs such as Xymon. So if you think you have all of these libraries installed but Xymon will not build, do check that you have the development files installed as well. Often these are in packages called "something-dev".

  • PCRE - Perl Compatible Regular Expression library - is a library for matching text-strings. It is available from http://www.pcre.org/
  • RRDtool is a library for handling the Round-Robin Databases used to hold the historical data Xymon gathers. It is available from http://www.mrtg.org/rrdtool/. Xymon has been tested with version 1.2, 1.3 and 1.4 of RRDtool, so use one of these - many Linux- and *BSD-systems have pre-packaged versions of it.
    Note that RRDtool requires various graphics-libraries. RRDtool 1.2.x uses libpng, newer versions rely on the Cairo graphics library.
  • OpenSSL is a library for communicating with network services, that use SSL encryption - e.g. secure websites. Although this library is not absolutely required for Xymon, I strongly recommend that you install it because sooner or later you will probably need it anyway. It is available from http://www.openssl.org/. Note: If you are building on Solaris, you should check that you have a random-data generator, either the prngd daemon (available on Sun Freeware) or the Solaris /dev/random driver from Solaris patch 112438.
  • OpenLDAP is used to query LDAP directory servers. If you would like to test that your directory server is up and running, you will need this library. It is available from http://www.openldap.org/

The configure-script will attempt to locate all of these libraries on your system, and complain if the required ones are missing.

A "xymon" userid on your system

A core element of Xymon is a network daemon. To keep your system secure and limit the amount of damage that can be done if someone finds a security problem in Xymon, I strongly recommend that you create a dedicated userid for the Xymon programs. This user should not be a member of any other groups on your system.

Xymon will install the xymonping tool as setuid-root(only on the Xymon server). This program requires root privileges to be able to perform network "ping" tests. It will drop root privileges immediately after obtaining the network socket needed for this, and will not run with root privileges at all while handling network traffic or doing file I/O.

Building Xymon

After unpacking Xymon from the tar-file, run the configure script. This script asks a series of questions, but all of the questions have a reasonable default response. So if you are in doubt about what to answer, use the default setting. You can see what it looks like.

When the configure script finishes, it tells you to run make to build the Xymon programs. If your default "make" tool is not GNU make, you should use the command for running GNU make instead, e.g. gmake. You will now see a lot of commands being run to build the programs, it usually takes a minute or two.

When it is finished, you finish the installation by running make install.

The first time you run make install, besides installing the Xymon programs it also creates the default directory structure used by Xymon, and installs an initial set of configuration files that you can use as the basis for setting up monitoring of your entire network.

It is safe to run make install when upgrading a Xymon server. It installs the programs, adds new template-files that were not present in your previous version, and updates your configuration files with any new sections that have been added. Any changes you have made yourself are preserved.

Configuring your webserver

Xymon uses a web-based front-end. So you need to configure your webserver so that it knows where the Xymon webpages can be found, and what CGI scripts can run as part of Xymon. This usually means adding a few lines to your webserver configuration that sets up a URL which points at the ~/server/www/ directory, and which tells your webserver that the ~/cgi-bin/ directory holds CGI scripts that the webserver should run when they are requested.

If you are using the Apache webserver, you will find the necessary additions to the Apache configuration in ~/server/etc/xymon-apache.conf - it looks like this. After changing the webserver configuration, you probably need to restart the webserver.

If you configured Xymon to put the Administration CGI scripts into a separate directory (recommended for better security), you will also need to setup the password-file that controls access to this directory. Use the htpasswd command both to create the password file and to add or delete users:


	# /usr/sbin/htpasswd -c /usr/local/xymon/server/etc/xymonpasswd admin
	New password:
	Re-type new password:
	Adding password for user admin
	#

The -c option should only be used the first time, to create the password file. See the Apache documentation for details about how to use htpasswd.

Starting Xymon

You can now login as the "xymon" user, and run the command ./server/xymon.sh start to start Xymon. After a few seconds, it should have started and you now have the following processes running:
Xymon processes

Quite a few, but all of them controlled by the master xymonlaunch process. A quick run-down of what each of them does:

  • xymond is the network daemon that receives status updates from the clients and the network test tool. It also provides the current status of all your systems to the tool that generates the webpages.
  • xymond_channel provides the communication between xymond and all of the helper modules that implement other server-based functions.
  • xymond_history takes care of recording the history of status changes for each item you monitor. This is used to track what has happened with a single status over time - when it was red, when it was green, what the error reported at 2:51 AM last Friday looked like. The history file format is compatible with the format used by the Big Brother package.
  • xymond_filestore stores files with information about the current status of the systems monitored by Xymon. There may be several of these running, but normally you will only need the one that stores information about hosts that have been disabled, which is the one you see here.
  • xymond_alert takes care of sending out alerts when your servers begin to report a critical status.
  • xymond_rrd updates the RRD database files with the numeric data collected from the status reports, to track e.g. how the disk utilization of a server changes over time. There are two of these processes, because the data can arrive in two different ways.

After a couple of minutes, you should have data available for the Xymon server itself. If you open a webbrowser with the Xymon URL - usually http://your.server/xymon/ - you should see something like this:
Xymon main window

Each of the little faces indicate an item that is being monitored for this host. Here you see the default set of items that the Xymon installation sets up for a Xymon server:

  • bbd is the availability of the Xymon network daemon.
  • conn is a simple "ping" test of the host.
  • http is the status of the HTTP-server running on the Xymon server.
  • info contains information about how the host is configured in Xymon, such as what IP-address it has, what network tests are being run against this host etc.
  • trends is a collection of the various RRD graphs available for this host.
  • xymond is the status of the Xymon daemon, with statistics about how many monitored items are being tracked.
  • xymongen is the status of the xymongen tool, which updates the webpages.
  • xymonnet is the status of the xymonnet network tester that performs all of the network tests you configure in Xymon.

You can click on each of the green icons to see a more detailed status.

Next steps

Congratulations, you now have a running Xymon server!

The next step is to configure it to monitor your servers and applications, and to set up the alerts to send you e-mail, call a pager, or send an SMS in case of trouble. For that, see the Xymon configuration guide.

Appendix: Installing on common systems

This appendix details how to install Xymon on some of the more common types of systems.

Red Hat Enterprise Linux 6 / CentOS 6

RHEL6 has all of the necessary tools except fping included in the core distribution.

groupadd xymon
useradd -g xymon -m xymon

yum install gcc make

wget http://fping.org/dist/fping-3.2.tar.gz
tar zxf fping-3.2.tar.gz
cd fping-3.2
./configure
make && make install
cd ..

yum install pcre-devel openssl-devel openldap-devel rrdtool-devel
cd xymon-4.3.10
./configure --server
make && make install

Copy rpm/xymon-init.d to /etc/init.d/xymon and make sure it is executable. Edit /etc/init.d/xymon and change "/usr/lib/xymon" in the DAEMON line to the directory where you installed Xymon - e.g. "/home/xymon".

Configure Apache with the Xymon definitions:
ln -s /home/xymon/server/etc/xymon-apache.conf /etc/httpd/conf.d/

To enable automatic start of Xymon and apache:

chkconfig httpd on
chkconfig --add xymon
chkconfig xymon on

Red Hat Enterprise Linux 5 / CentOS 5

RHEL5 does not include RRDtool in the core distribution. So download it and install it in /usr/local/rrdtool. Also, fping is not included.

groupadd xymon
useradd -g xymon -m xymon

yum install gcc make

wget http://fping.org/dist/fping-3.2.tar.gz
tar zxf fping-3.2.tar.gz
cd fping-3.2
./configure
make && make install
cd ..

yum install freetype-devel libpng-devel libart_lgpl-devel tcl-devel
wget http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.2.30.tar.gz
tar zxf rrdtool-1.2.30.tar.gz
cd rrdtool-1.2.30
./configure --prefix=/usr/local/rrdtool
make && make install
cd ..

yum install pcre-devel openssl-devel openldap-devel
cd xymon-4.3.10
./configure --server
make && make install

Copy rpm/xymon-init.d to /etc/init.d/xymon and make sure it is executable. Edit /etc/init.d/xymon and change "/usr/lib/xymon" in the DAEMON line to the directory where you installed Xymon - e.g. "/home/xymon".

Configure Apache with the Xymon definitions:
ln -s /home/xymon/server/etc/xymon-apache.conf /etc/httpd/conf.d/

To enable automatic start of Xymon and apache:

chkconfig httpd on
chkconfig --add xymon
chkconfig xymon on

Red Hat Enterprise Linux 4 / CentOS 4

RHEL4 does not include RRDtool in the core distribution. So download it and install it in /usr/local/rrdtool. Also, fping is not included and some of the development files are in a non-standard location.

groupadd xymon
useradd -g xymon -m xymon

yum install gcc make

wget http://fping.org/dist/fping-3.2.tar.gz
tar zxf fping-3.2.tar.gz
cd fping-3.2
./configure
make && make install
cd ..

yum install freetype-devel libpng-devel libart_lgpl-devel tcl-devel
wget http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.2.30.tar.gz
tar zxf rrdtool-1.2.30.tar.gz
cd rrdtool-1.2.30
./configure --prefix=/usr/local/rrdtool
make && make install
cd ..

yum install pcre-devel openssl-devel openldap-devel
cd xymon-4.3.10
./configure --server --pcreinclude /usr/include/pcre --sslinclude /usr/include/openssl
make && make install

Copy rpm/xymon-init.d to /etc/init.d/xymon and make sure it is executable. Edit /etc/init.d/xymon and change "/usr/lib/xymon" in the DAEMON line to the directory where you installed Xymon - e.g. "/home/xymon".

Configure Apache with the Xymon definitions:
ln -s /home/xymon/server/etc/xymon-apache.conf /etc/httpd/conf.d/

To enable automatic start of Xymon and apache:

chkconfig httpd on
chkconfig --add xymon
chkconfig xymon on

Red Hat Enterprise Linux 3 / CentOS 3

Follow instructions for RHEL4.

Fedora 17

Follow instructions for RHEL6.

Debian 6 (Squeeze)

NOTE: Pre-compiled Debian packages are provided on Sourceforge, along with the source distribution file.

Debian 6 has all of the necessary tools included in the core distribution.

apt-get install apache2 rrdtool librrd-dev libpcre3-dev libssl-dev ldap-utils libldap2-dev fping

# Enable mod_rewrite in Apache
cd /etc/apache2/mods-enabled/
ln -s ../mods-available/rewrite.load .
/etc/init.d/apache2 reload
cd

tar zxf xymon-4.3.10.tar.gz
cd xymon-4.3.10
./build/makedeb.sh 4.3.10
mv debbuild/*.deb ../
cd ..
dpkg -i xymon*deb

Ubuntu 12.04 LTS (Precise Pangolin)

Follow instructions for Debian 6.

FreeBSD 7,8 and 9

Perform a standard install, make sure to install the "ports" collection. FreeBSD - in a minimal configuration - does not install any of the Xymon prerequisites, so starting from a minimal configuration you must run these commands to install the various tools and libraries needed. For those packages that have some configuration items, the defaults work fine:

cd /usr/ports/devel/gmake; make; make install
cd /usr/ports/devel/pcre; make; make install
cd /usr/ports/databases/rrdtool12; make; make install
cd /usr/ports/security/openssl; make; make install
cd /usr/ports/net/openldap23-client; make; make install
cd /usr/ports/net/fping; make; make  install
cd /usr/ports/www/apache22; make; make install

Next, run the "adduser" utility and setup the "xymon" user.

After this you are ready to build and install Xymon:

setenv PATH ${PATH}:/usr/local/bin
setenv MAKE gmake
cd ~
gzip -dc xymon-4.3.10.tar.gz | tar xf -
cd xymon-4.3.10
./configure	# All defaults, except group-ID for webserver is "www"
gmake && gmake install
chown 0:0 /home/xymon/server/bin/xymonping
chmod u+s /home/xymon/server/bin/xymonping

ln -s /home/xymon/server/etc/xymon-apache.cnf /usr/local/etc/apache22/Includes

To enable automatic start of Xymon when the server is booted, you must create the /etc/rc.d/xymon script:


#!/bin/sh

. /etc/rc.subr

name="xymon"
start_cmd="${name}_start"
stop_cmd="${name}_stop"

xymon_start()
{
	su xymon /home/xymon/server/xymon.sh start
}

xymon_stop()
{
	su xymon /home/xymon/server/xymon.sh stop
}

load_rc_config $name
run_rc_command "$1"

Make sure the script is executable with
chmod 755 /etc/rc.d/xymon
and add the line
xymon_enable="YES"
to the file /etc/rc.conf

A similar script can be used to start/stop Apache automatically. Use the commands
/usr/local/sbin/apachectl start
and
/usr/local/sbin/apachectl stop
in the apache_start() and apache_stop() functions, respectively.

OpenBSD 4 and 5

All of the necessary packages are available from the OpenBSD "ports" collection. Note that when installing OpenBSD, you must install the "xbase" package, since this contains a library that is needed by RRDtool.

After installing the core OpenBSD system, use the ports-collection to install the necessary packages. See OpenBSD FAQ for details about using this.

export PKG_PATH=ftp://ftp.openbsd.org/pub/OpenBSD/`uname -r`/packages/`uname -m`/
pkg_add -v gmake pcre rrdtool openldap-client fping apache-httpd

Note: Check permissions on /usr/local/sbin/fping* - they must be suid root. On OpenBSD 4.6 it has been observed that this is not the case by default, so you must run
chmod u+s /usr/local/sbin/fping*
for them to be usable by the xymon user.

Run the adduser utility to setup the "xymon" user.

Configure, build and install Xymon with these commands. Configuration can use all defaults, except that the webserver group-ID is "_apache2".

gzip -dc xymon-4.3.10.tar.gz | tar xf -
cd xymon-4.3.10
MAKE=gmake ./configure # All defaults except webserver group is "_apache2"
gmake && gmake install

In /etc/apache2/httpd2.conf, add this line at the bottom:
Include /home/xymon/server/etc/xymon-apache.conf

To enable automatic startup, add these commands to /etc/rc.local:
/usr/local/sbin/apachectl2 start
su xymon /home/xymon/server/xymon.sh start

Solaris 10/x86 (using OpenCSW)

All of the necessary libraries and tools for building Xymon are available in the OpenCSW archive. This appears to be a newer collection of Open Source tools, replacing the Sun Freeware archive which is now a commercial project. See below for instructions on installing Xymon using the SFW packages.

Follow the "Getting Started" instuctions on setting up your system to use the CSW archive. Briefly, this means running these commands (as root):

pkgadd -d http://get.opencsw.org/now
PATH=$PATH:/opt/csw/bin
export PATH
pkgutil -i -y cswpki
cswpki --import
vi /etc/opt/csw/pkgutil.conf	# Define mirror, enable use_gpg and use_md5
pkgutil -U

After setting up the CSW archive tool, you can install the necessary tools and libraries that Xymon will use:

pkgutil -i -y gcc4core gcc4g++ gmake
pkgutil -i -y pcre libpcre_dev
pkgutil -i -y rrdtool rrdtool_dev
pkgutil -i -y openssl libssl_dev
pkgutil -i -y openldap_client openldap_dev
pkgutil -i -y fping

The "fping" tools must be installed suid-root so that the xymon user can run them:

chmod u+s /opt/csw/sbin/fping*

Now, create the xymon user:

groupadd xymon; useradd -g xymon -d /export/home/xymon -m xymon

Configure and build Xymon. All tools and libraries should be automatically detected, but it is necessary to explicitly point at the CSW OpenSSL libraries, overriding the default Solaris version of OpenSSL:

PATH=$PATH:/usr/ccs/bin
export PATH
cd xymon-4.3.10
MAKE=gmake ./configure --server --sslinclude /opt/csw/include --ssllib /opt/csw/lib
gmake && gmake install

Install Apache and add the Xymon webserver configuration:

pkgutil -i -y apache2
ln -s /export/home/xymon/server/etc/xymon-apache.conf /opt/csw/apache2/etc/extra/
Add
  Include etc/extra/xymon-apache.conf
to /opt/csw/apache2/etc/httpd.conf.

The CSW Apache implementation supports the Solaris SMF (svcadm) setup, but conflicts with the default Apache version that is installed with Solaris. So disable the default version, and enable the CSW version:

/etc/init.d/apache stop
rm /etc/rc?.d/*apache
svcadm clear cswapache2

To enable automatic startup of Xymon when the server boots, put this into /etc/init.d/xymon:

#!/bin/sh
su xymon /export/home/xymon/server/xymon.sh $*
exit $?
and then enable this via the "legacy" startup scripts by running these commands:
ln -s /etc/init.d/xymon /etc/rc3.d/S80xymon
ln -s /etc/init.d/xymon /etc/rc0.d/K20xymon
ln -s /etc/init.d/xymon /etc/rc1.d/K20xymon
ln -s /etc/init.d/xymon /etc/rcS.d/K20xymon

Solaris 10/x86 (using Sun Freeware)

All of the necessary libraries and tools for building Xymon are available in the Sun Freeware archive. You must install these packages to build Xymon:

  • db (SMCdb47)
  • freetype (SMCftype)
  • gcc (SMCgcc)
  • libart_lgpl (SMClibart)
  • libpng (SMClibpng)
  • libtool (SMClibt)
  • libiconv (SMCliconv)
  • libintl (SMClintl)
  • make (SMCmake)
  • openldap (SMColdap)
  • openssl (SMCossl)
  • pcre (SMCpcre)
  • rrdtool (SMCrrdt)
  • sasl (SMCsasl)
  • zlib (SMCzlib)

After installing these, you must set PATH and LD_LIBRARY_PATH to pick up the new tools, then you can compile Xymon the usual way:

groupadd xymon
useradd -d /usr/local/xymon xymon
PATH=$PATH:/usr/local/bin:/usr/ccs/bin; export PATH
LD_LIBRARY_PATH=/usr/local/lib; export LD_LIBRARY_PATH
./configure
make
make install

The SunFreeware libraries are installed in /usr/local/lib, which is NOT searched by default by the Solaris runtime linker. You must either set LD_LIBRARY_PATH globally to include /usr/local/lib, or you can use the "crle" utility to add /usr/local/lib to the set of directories searched by default. Typically this means running this command:

	crle -c /var/ld/ld.config -l /usr/lib:/usr/lib/secure:/usr/local/lib 

The latter method using "crle" is the recommended method, since LD_LIBRARY_PATH settings can be difficult to setup so they work for all invocations of the Xymon binaries.

Mac OSX 10.6, 10.7 and 10.8

Xymon is available for OSX 10.6, 10.7 and 10.8 through the macports project.

The ports can be found here:http://www.macports.org/ports.php?by=name&substr=xymon, and there's a page on how to make xymon server on a Mac.

xymon-4.3.28/docs/xymon-hosts.png0000664000076400007640000014503311535414771017176 0ustar rpmbuildrpmbuild‰PNG  IHDRÞ±Š,úY pHYs  ÒÝ~ü€IDATxÚìýhSiÞ?þ÷î͸#$¢¼“¹š¢LïL—æ0…5‡t\hªÃÇD…i.ÛÆÛŽË´Õ›u’.Œi§í°N[aµñ5)¬6~M|óqIÊ­$½›r;4}Oò¾°Ûœ/Óýþñòèé&­9IOLëó›uN®ž\çuýÈ9W®suñªø`¼Š†af0qñÌ`â@& šdA€,0hM²À  ¼F:Àͤ½îsæ^7Ã̧x;ˆ4 ·ÝÝn3nܻٸѸqÏ?7²†Çì„ëhÁu´ø`Þ¿ïWæý¥\õøÖVõ8E‰ݻٸ1Ü©·­ìgiÖoÿV³^ŠÈtδ':gŒŠ½›Œ †)SH1KíG–þ@êö| •ùî`âû¦ÁDëЉ©Ö¡â—~fiRÍó^»7æ};»ÍzÍ׋k]©ñØGozì‹Ûàž6n¤í¥™çBúÒÒì—¯'Òõ]«¥–@)[¯ŠÆ«rÿºPì½Ô°÷’Þ¥»£wÑö÷ã1N#ÛvN#CX ¬Çæb'cs´%¨¿³!¨ïœ9ÅuΞÝþ9ðlå>kû·šõ±¹‡ÇøÏZ†+/ž® êïî êû.ûMß%á»æýo7ïïœ>ÅuN³aÃ#6üfK3Î>Æÿ_ÆÑë÷?‰^G /Ôͧ @ ï¸|~x‡Ò¡Ø£t$;S·“¶©ƒ¶©¶Ѷ£bO™QQJQ] m9÷z"õñ–r-€R6˜¸xf0!z¦ ]r¨ƒêzuP¸=s¸$Ùùt4Ùi›²6Ú¦„ó,&}÷÷MúgåBû`‚¨þ;;A)éò8—w3E¤KYú­’O¿ïWæý´}Qž×k¾Ö¬§Ë*Ê›®g÷]]nIt6\ýœ ǸÇ=1.¿Xñê¯fú8*NË™Ÿ•™7s*Æñ»w³q££¢Kí¨Èü¥7÷üЧÐ0¥¡¡üâc¶ì{ßl ¤n> ¤„·ÑQÇÙÄ…8+.É<ÆåkËÊJv>ŸHvjd[Ž/®ù¹×ÀÜK„Ž”n’¢#ÖUªÃ™Û…{ Ò\™}¿2ïóÞøqÌk›:ò‡¥Ë:—RNf#é€pŸo¶.õºû­½nGùi™£œ†Kh;ý›¶ó7-•‡W¹Í,»åkZ~Ѧ-\`v‚ пÅöT™-"÷¿Í½6J-ó( ©½Kí?—R=hÒ ú¼¿Aeܸ§Ì¸±áÝÆïÞ®¼üýpeæjmC퉶¡fëï/7[iVEï¥s÷^²j·¦týFë::võÚŒ]¥”ôËp.ïfjjÿ?mC¶Iëç¶IJOÿ¦í”\`>Å42Íi,ðìæ“À³ÁŸÎÿ~ð§Î™ÓòÎ)ÂM·rhÍÛÎiÍùÅŠŽ¢AUßÕ ¢”Ùösàf¸ÀòŸÞ9sêÿ×9Ólmìo¶ÒñjÍÛÏiÍ™›{~(†:—îŽÎEû¤¡üâC´z×îzט÷æSþÂÛc÷ÞòØëzk÷Öõ.¿±µ%wt¤ü9Õg'L?ÚlÚH—ßùÕÀÜK„>]T¦ú®Þxè»:¼cè«áÔ© ·gÖaW}ÁUÜuç—Á]”+Wý7;\õGß­ÿÓÑw›­¿w/.ë¶¡S|n—/eH­ë?ø»ºþ¶/|m5–·ÕXÞl]Š´=ØiΆÒ»vß×»¢¾©ÃQ_f´fíE­™rKm-³ì^ÓkåmÚ"3¾³KfÎD+¤§Êýos¯…´Ì×\VJ*¤ö.•Ÿ\J@ôí9„~“¤ß‡+Ýç‡+5²íßjdÂ[*´Ÿh/j?QUÿ0'%Ù9IvFZî¾i¡-táG§æ–ÞÚ-½u½ûv×õÒ Ë¿›9õš~¼~ßäu¹QV.7ÒI¹ö“×´ŸD¯Gó·QðKÓÂ_­Ö±RÓÅi "¡£N°‰ vìê_ÿcìªðr.÷XQÊpK¤:Ü"<:>ÏÂ8ä™Ì¿Í=?tŒñªØÉxÕJ­xBëMÐ/á}—úö]¢‹«ÞKç~Ó{©Ò¼óZ¥y©c\¾¶"ó³(‡4£ÁÛ4úƒ·I| ̵D–ª«|üu/nÅ™u˜V#¢¹ öéh‚•Ë2cÔ7u$êÓšwüeñ@ž°¬—*eÊ•FV~Z#£Á£ÌaŽ7U—øD/ŽXfÞ„%By˜ž{xlznù²[¾¦í̲˽§ÊÖêsÿÛ\kcámgùºš™¾°xþãÞr/ex›Ñí9eùý1]&i&Ëͤ¥·öŠ¥Wß³û‰¾'3åØÕÇ®ò'¦ Ã0L óÓ²(+?ÿýàOAkhkÐêÑŒxôÃýîÆá~oÓÈoÓòï®D(¤ZÜ”Në_übܼǴ –_ø—Áò>÷·æ>÷ 3ôÕ èXS.ù¡cdæÊÌŠ­`¶|¼ÝléìiOtöÐ4{î]î;î]ápÉ’ÕZòÚò -ŽÛÐÖ´¯¡a˜cÅ(“¬«2£¬\fdææuñ·úâ†ýý¯ßµû—ú]̳ù'Ì35³•Q34³`Ñþe½|)ë\»ïë\>ãÍrŸ‘-¯–±å¥P—t®÷®é\áéH<zÓûâéÕ##ÕtÓÇ› wƒê³®UœÅYá]÷¹ÇŠŽBxt4/ƒ&œ/ÿéŸ÷ÆCßËÛ^®ÝÍö·¹çG ti͆«gÙ°ýÐÿý¥·v¯¥7—¿[[ A¿~kd[Z¯i’{ ̽D ÷r5¢Ïøƒ‰‹ß &ůú·0=Í&ËeÏÝõßìè®§µK覕R¨K ªÆþ­[AÇ.Œ=ÊnmrÛ­™›Ù¾¨¤r¯i…DûÅàQѳ6–BíÍ¥”DšðËó òÑš½—zªz=ë„î9§'¡ÑÚ}ô,۽貪ùбÿ§ù¥1müøÿ2m¤'¤äòn&W}×ÿpÕWº¿®¤¿¢ÓöRz³µér³U‡ÜcEG1˜jLPÊHÛý}‘¶3–E—v}îsæ>7-|õÝÿmÔ§p¼³Káȯì¤C%4ý¾®×òÚÕLò«-¹Ë\—ÖM XåWs/‘ÂÑí3æýµñËÓNúîÿvÒxv{>ðŒn5 å¾ÿ¾Kç>î»i{ðÛHݲôfë­«BkUÔõ×~T×OŸNÿ¦!þAگЀEŒ‹Šq”¾Ï}¾©ÏM%•{M+$ÚFÅÞÍF­›SÌ~©˜µñÍÖÞÜK Ï5M`5£eË CÏžLœoLWå”ÈÛ §}³µ1àfÒ}GºµEPÊ‹‚Ö4Õ‹~­Mu¦n§:™ FÍT üÔÿ/?!2(€7[M÷n6mlèý¬«¡—a˜(ÊÞ4Ì4X„fšüÈ„A€,0hM²À  @e´, „Gd±naaaaa*£ÿ«ë³ì­ëC8àmæiöÞô4GZ'ª#­eÂ7¼öÑ[^;o›Ì{qÊrIP ÜÚËçÝÚâ|V «‹Ùòñv³…aæ“ Ãèó©Wïϧ&˜O¥/·$ùqù¦Œ´ÝßiËü”_ Й0hÅŠ šDZï½i]·nݺuë„“^Þ”RËO©)$>¥[”>3M rT]ßuT]!ל®ËMrܤtn¶(´=Õ‘ºê(dÿœ6ÂùmQk£-*7mÐñû':c”ÂaʉðµmðD´m°ðãõ6Œx›Íû÷ýʼŸ¶P~ØHõ,ÁðÄRjêÌÛkꜚ?©œD£Ôâ›:Ówï~ ïF}XK*Ök¾®X_È0hR…cS­Â1võÚݱ«i:–öÇ«b'ãUé7“Ôõ[öÖõ²û¡–ýP‚M %Ød{|(Ù½ù zÝ]yù¼»r0þ}Ó`<ó¯Òþçá´ŸòC¯®†o´®†BrB@¶©#'lSÓ§ÒÓ´=^ŠW9ÊO¥å¨™h0+¨m ê[ŽÝh@LJ-ž\`6Â"m÷vFÚ¤øC}(õøÖVõ8ý»¡IMœš3Z§FR׫C4?Â=rÂåü\Œó S& {“ÒXfR*Ê=J'ÍŒ0)?ÚlRÆÒ?‹¥3÷ßÝpÖÐÝÀï_®‘›Ô¡­-êÐ`üB{¶A„¾áï¬}Ã4'‚^½Í£7½Í…) FhkÞ»¦­¡-2Ó;:™ÉnmrÛ­Ô T¾ûžO2ÌpåÅ3ÕŽòÓ2G9íYÚÒ¢ 5[¿¸ÑlísŸoês§¼âìãž8˸. wí¼¦wñÇ[¦™ŒÊ½›J†)S–“TÇSoª£®ïÓOëúø™5Ê=JçR3eøúóÑf“’jÍúñØÿzÏc/…†Ú9sZÞ9Ó6Ðj ,¤>ÓÌ#šÇÄ·—åÚ—pþÍΊ¢8ó)'ª#­´·ÌýP{¡¿-N~ò‹§ØüÐç²Õg'ø-ô‹giR?ó«Põ¸º.ªX¿½WüЉ$ƒ&“¾è‘I_l.v26¯zÔ¯Šq¿ˆqmC'¦Ú†„)éñ?Žò.•£<Ù‘¼ìH¶'ÉvUPõ™*X×ðw‹gjÐErÛPËxÛ·i䊷‰fRÐü ½Kw‡¿˜Ju¦n§:“O¼ÉŽfëçýÍÖÌœ¬¬@êö| e¿ßÎo±ôÌ©Xš)^D£Ï²—¿¤Ô¹vÝѹ¢¾û¢¾,U$´µU¢Ë9þrq6²ørQlyidÛÎid4³f01Ô>˜ íœ>µôžÅªë·¾,qšYC¥fTTÏ™é-ý-ýÙ–ãͯ ·Ü}/ÜâóÞøÑç}³ 5:ö`_tŒjB³õØfkf±õ™fúĸ™S1.6;›K¶?ñ&Û©†Ó~–ÊÏpåÈÈp%Ň>¥súÄ$?cH׽뎮[TÕ«ƒ™Ñ®¼üýp¥uò`£u²8ùÉ/žbóCŸÜuç—Á]ü–œ¥UHý›(ÄRÃ%B¢‡N,½µZz…[Ä ·Üý·p íaz.vrzNø®§Éûƒ§‰.¹sÙS¦XœŸxU|0^EÛ~újà§ô­çáô­åó“lâI¶ó{ý+´ ÿ³þÛÿŒŽtòzôÐäõ|ãù`q@.†w¸ÿ<¼ƒ®‚éZ ^õį¢óvþõQw¼Š®ùׇvþ•®Gø×ûŸL^§} ?…®,rši’¹°èòé5ò-Ç5‹¦ñkd[kd©Î§£©NávŸçÚ]Ÿ‡³átzãÆ·72Ì|jñžU!U½*äiºrÅÓ䮼ø»RÙ¥®WvUÖh/VÖø<7ú<™ùQ8{Nþ"¿L!3òïd_¿@ìñòÇrã¡ÏC¿Eû®^ûßUmÍŽ‹üm;b)ïìR8èßJ‡bÒ1~xlúÅÍJÉÎçÉNº”£ðéFZmÄk½éµ^^t#ÒàOßÿ~ð'ÚBÃ[ôK¾¥ÿÀ§–<×p‰³‰ q–ÏOùéÅùy]úìù/|œ2ÎÆ‡âll.z86½=½®ªëÕAvbÏ?³šõÛ¿Õ¬×ȶ¶,þ,ZXÔç½ñÐçm8m[rÝŠÜë³ðxÙ‰êYv‚Z ½Öì·|T³ŸÖæXê³´5Ûν®6ÒàšÏ{í®ÏK³“¨æhÍ;þ¢5 kWqò“{< ÏÏÊÖÏüꔚ²\eNS_^,ýøl,-¼´ˆqÎÆ8…cÓwü@@ÂJjÆ-­5ãž&÷yO“¥¯Ökéc:Ê”LG y{>4m4þ³i#?´ñj½ K_í^KŸ¥¯vÞÒGï:5R;5¶)«Á6•d’· [ËQìñÒê ï6]nx7ðìÆžé"ï?ÖE ÉEOf”]—é6ƒóƒYˡڢ5¿wMk.¼äR^K¡Û:::Onèè|Q^ ̳ 6ê ê3ua˜¿ñ·&iäÛ¾]úÒtqúìùgæ£Â"#\@Wfb™©•ù2ÚÊ´~É´òkX^üï%GÅi¹£¢Ùú{w³UÑ Ð*^³o.õùåñ^gZlXáÜdá‡W Å\k~ïwZ³×~-èµÓ9¶Ië¬m’a˜hFü%ÍOîñ,,?¯_‹Glý,¤>@édM“ΙS\ç -»HO]qýFë:Ú :üeƒŠÒÐóeh.‰Â¡øµÂA—.4˜â¬øZæ¬ÈÜ3½K¿ÀóË:ÒO™‚adF™æÕ,’bèþî`ß0 —wÝþ9¸K×ýþÝk\J«d.«¹X™’al“‡¿´MÒâ‘ôË?­‚Ñ}´ÇÐ}´ÙÚØÏ¯Œ@KTÒåœp‹³âOjg…Ùòñ6³¥ò¢Eyéy=\`>ÅÿbÏù¹ÎO³$t®÷ïë\ùE’æ\{7mCíÿ§mˆ_‡e>ÉÏâÉLO79+NËœ”’ŽÚQÑ¥vT¿9Q”¼ökw½öÎéÑ¥Wè[ŸiÀlÙ÷¾ÙÒ|¨e¼ùðÖT+hð®ð£°MZ?·Möºû­½nZßÄ6yðsÛ¢ÕLŠ“ŸÜãYH~ÔÁMµê ý;¤»·3¤+¼~æW ÔH2hBOWѬ×|­Y¯ßÚ¢¯4kÿRi¦_) Í  5#lSGþ`›¢aŒ÷n6n4[öíÎ~‘?Ÿâ¹Uvm¶(»è¯<ö+#;-¥YÌðÙ5ýOû!º9Eß³û¾'—[{¸ã1næßcÜò8í½Ôc轤 nªUéÆ í'º¿i?¡%9ÔŸ÷7¨)e²sv"ÙiÚ¸w³i#Ý’ ×|­W86YŽÁŸ†Úùjò+/ºEˆnÖ 2z±½k³EÙãŸqž¦‘+ž‚âïirÿÙÓD1¡ã¥§Ñò™™é½M—Ï{›èÓé¹'£bÏ?½naN)Ðð-6œÛLqõ™ædɲr¹‘nzùü—Yv"ê›:œma`±hˆ$¤ÿÛ†Þ®zdÓ­^YËKÒüˆg~ù¡£ë˜>™î˜6ïß÷+ó~z’½R?Å×(-ëhz2‹×>zËk§- ,…«ïÙýŸúZ8³ð‡ ¯v4ǧò“×*?‰Í=<›£¹ ¨-ogïÖJ±gkô`£õŲ‘Ö‰êHkÙj ”ºi¡{YèF4ÍœJûŸŸNû Äõ@j4ÀAK4p†á‹&3Ÿb˜t`>•~ù8ˆW÷yˆ³ñ q6Á&†læ§üb­† 4ȃ&Y`Ð šd±bƒ&ôÚuëÖ­[·N¸&í›Rjù)5…ı-<&RÇeP8Ì4)ÈQu}×Qu…\sºB.7É5r“Ò¹Ù¢tÒöTGêvª£ýsþÙç·E­¶¨Ü´AÇï¿3ÖžèŒ S /’)'Â×¶ÁѶÁÂ×Û<2âm6ïß÷+ó~ÚBùa#Õ³ldµ\œGǦGÇôÝ»èñÈdÄ`I4)ˆÂ±©Vá»zíîØÕ´?KûãU±“ñªt€›Iêú-{ëú Ù¿ýPKÈ~ˆžl%Û£×#D¯»+/ŸwWÆ¿oŒgþUÚÿ<œöS~èÕÕðÖÕPHNhÈ6uä„mªsúTºsš¶Ç«âCñ*Gù©´£|µ”˜pHÛ½‘6ÌÂ@ü–"É ‰SsFëÔ¨CêzuˆæGØ¢GNØ¢œŸ‹q~aÊ„áqOÂ`RËLJ¥S¹G餙&åG›MÊXúÇc±tæþ»ÎºøýË5r“:´µEŒ_hÏ6ˆÐ7üµo˜æDЫ·yô¦·¹ð#¥ÁmÍ{×´5´EfzG'3Ù­Mn»5º³!ÊwßóI†®¼xf¸ÒQ~Zæ(§=«B[ZT¡fë7š­}îóM}îâ”Wœ}Üg¹7Ãô®×ô.þxË2“Q¹w³QÉ0eÊÂr’êxêMuÔõ}úi]?³F¹Gé\j¦ŒØúCï²Õg'ø-ô‹gå³þç—^¬Üë?ų¦Î¼½¦Nš9µT~roùÅ_l{X)’ šLú¢G&}±¹ØÉØ\¼êQO¼*Æ=ü"Ƶ ˜j¦LæS連¼Kå(Ov$o';’íÉ@²]T}¦ ÖõüÝâ™tQ×6Ô2Þ6äm¹âm¢™4ÿBïÒÝá/æ…R©Û©ÎdÇo²£Ùúy³53'++º=HÂïß7„óÛC,=s*–¦AŠÑè³ì­ë£wu®]wt®¨ïÁ¾¨/óoÕ¡­­ê]îò—ß³‘¥/¿s)/lÛ9ŒfÖ &†Ú´óϧVâžÔõ[_–8ͬ¡R3*ªgŠÌôbëÕ–à®;¿ îâ·ü㬜bÖÿüÒ‹•{ý7ï¯ýȼŸJ9ÙþÄ›lÍ=<›£R»+¤=Š~í`¥H2hÂÏŒid&…S±Gál8m®¼üýp¥0¥F^~Z#7Dª"´…þÊnmì·[#mÕ‘¶Åû.S𯓾‡_Lúh8@áÜdQ8uÝ»î責’Ðlý½»ÙJÿ®±üöýKŒûñ‹'ű’7Ÿ’®£çÌ®£ƒ?]øjð§üö“êœHu¾']J£²‹tè7¿ãMC C uói åªïú®zšYCÇn®Û·Û\—ùWâëO1ä^ÿóK/V.õŸâO·Ì,ÎÏ&Ë«üŒŒüc~òibH½€åä4h’¹°èòé5ò-Ç5òE[d[kd©Î§£¯†a|žkw}6bxÌFøÛ+6èä&ãÆ·72Ì|jñžU!U½*äiºrÅÓ䮼ø»RÙ¥®WvUÖh/VÖø<7ú<™ù¡ Qú·ÌX¦ùw²¯§ öxùc¹ñÐ硹¾«×þÃwU[³ã"ÛŽX Ç;»ú·Ò¡Ø£tL§›~q³I²óùD²Sf”•óÇBÇ(üDº‘‡VñÚGozí…—݈4øÓ÷¿çƒhÖÍe°ôøÔ’ç.q6q!Îòù)?½8?KÇ\\ý)ŽÜã™_z±õ3—ú¿8þ¹æ'¿ö˜;©÷°¼œM„“çs¹…!–~|vñZ1îÑÙGÓþi ý²]³ßòQÍþ¶–PÛÝ>ö?¤ýcWÿzwì*ÿ×ÿ8´aé«Ýkéó'óþdÚŸ ¤ý¶Iëç¶IÛ”µÑ6UxPÄ/=SÆ6uä¶©À³ÿx&œû8 a‘ÌÛph‹ÖüÞ5­¹ðãÍ¥¼–B¿öwLŸä:¦Cúñ­!}~yPUŸ©ƒ|~fNe[ËF¨úSøÚ++O±éÅÖOññ—ñíQ\ü¥nïK‘äöœÎ™S\ç -IO]qýFë:Ú :üeƒŠÒÐóeh.€Â¡øµÂA—Rt1ì¬øZæ¬ÈÜ3½K¿0óËRÒX™‚adF™æÕ¯èÅÐ7üÝÁ¾á†w›.7¼K·®èºßðº[¢cöEÇèAÅK§*S2Œmòð—¶ÉΙÓòκ1né>Úcè>Úlmìço» %T…à ´ÅYñ'µ³Âlùx›ÙRHyÑ¢ªô¼.0Ÿâo âüÜ ç§Y:×û÷uy®1As ŒŠ½›ŒŠ¶¡öÿÓ6įÃ2ŸägñÓçWˆ:¸©– éîí éŠ_ÿ I/Š?•àRù±M8`›,¼=æÿRkïð¶‘dЄž®¢Y¯ùZ³^=¾µE=^iÖþ¥ÒL vRšIáªï©rÕÓ ºÑÀ¸qïfãF³eßîìùó)†qTœ–;*”]›-Ê.ú+ýʈÇNKE3|öCMÿÓ~ˆnNÑ÷ì~ ïÉåÖ .ÀŸ@Œ›ù÷·ü#W{/õz/©‚›jUAº1Aû‰îoÚO¬“­“ êÏûÔ”2Ù9;‘ì4mܻٴ‘nQQk¾V+›, ÇàOCíK¯®’KyÑ-Bt›•Ñ‹í]›-Ê®÷ølŒó4\ñO“ûÏž&Š /=í…̷֦þ0 ãRÇôÉtÇ´yÿ¾_™÷Ó“Yèµ8õ¿ôÒ¡L°‰ –JV³^sZ³^#Û~N#sÕ³ÃU_x{ÿÒjïð¶Y·°°°°°@ yzí£·¼vÚ‚ÐÀR"­÷Þ‹´ê{vÿ§¾gaáçg Rßð@ÜÚËçÝZkô`£5J÷Xp†á‹×µœOñO\}¹åå”áýq6~!Î&ØÄP‚¥}ÒöHëDu¤õoC@aeÑ-Hüà†K`m  @4ȃ&Y`Ð šdA€,D šØ¢ÖF[Ôç¹v×牴Þ{/ÒÊFªgÙ‚kˆA“þîÎ^ïÚ}_ï êïî êÙ°áF`íÉiÐ$Õ‘ºêH¸X:  ©êU¡ >´5¨gû`ÐÖ¢²åß–›6èä&†™O1 ×5ŸâºäÆ ·åF.0;Á¼ÆÑ]^#cªïbLiÿóHÚ€ÀÚðš™&4Òl=æk¶ö^ê©ê½›{x,6§‘•ÿQ#£w1\kON·çõw6õl¸z– Ó¿ áêYnÌ€5kÉÛsøs†aèfÖX½‹5r®‘ Ȧʲ)93zSÎ`¦ ¬=KÎ4¡¡O“û¼§ÉÒ{à€¥—¶hd[Žkd±¹ØÉ؆K`­zÍB°^ûèM¯½NQûa"Zþ`_´\áØô'…CÕªzOÕŠðÀZõšA“øPû@üå62L¸æ.®Aà`mûB ƒ&Y`Ð šdA€,0hM H춦Ëv›Ü$×ÈMôºTÊHëDu¤uù4o³µŸ•®óI†îmݺuëÖ­£í«ëxߎ:|ï½Hkîe$6=ú“•ŠÞJ|:úóÕ]‚ bÐĵ6Ú¢>ϵ»>}…³‘êY6’ß OlÑ#'lQổ5;¯UÖ¼©S„èØÔá蘾{÷}7ªHá†Ç= CŸû;kŸ;Üù Ü’ö§ciÿRéuÝ»î躗O³–ˆ­o«=>ÒÔ‡2%ÃPšà®;¿ îZ½Ç[ –¿H[]—pbÛ úÿåëƒpàOß­»£ï¦a‘Rî¯ É¿ÔPßJŸˆA“þîÎ^ïÚ}_ï êïî êÙ°á.<Qßý}Qý›.0¸Àl„ ¼© Ð§GÚî팴áWÂÅÙ§£q–þ­­ÙvN[ƒ˜¼Íõím«¨ÿhkIÚÿ<œöÓ ˆÙ²o·Ùb›:Øh›BþQßÖªœMR©Û©Žt€‹¥ªª^ êC[ƒz6¼ûÁJ š°aÃc6Òo é<öÑ›;Êd¦¤!“ÒXfR*Ê=J'ý^dR~´Ù¤Œ¥<KgþUwÃYCwƒ:¤®W‡(½:´µEŒ_hŒ SÒ»ìDõßÙ ~Ë=ÿ«TæcÎ?áüGÕõ]GÕ|~6èä&š;Ãù¹·è·5áï]Þæ‘os…\sºBN{®ëûôÓº¾B"™êxêMuÐ~('”«¶ÁѶÁ¥âYSgÞ^S'LOG$Ì¿0çÝ g´Ý Jçf‹ÒI¯ÞæÑ›ÞæÌýóñ4<ÎÏlé7èÄÜ^‘0$†*}aÉÒñ ÷°Ôoã¹ÿ¢žKy‰­Ÿbë›øøH[¾bI]ÄÛ~¥>ÞÜË«8ý‰XbóOœš3Z§†ïŸ_ÿÜÓ‹­?bÛc~ñÉ¥ȯ=òûÕR}ðØÿzÏc—¢Äk,æm5–¨oêÿ³Gqúóâä?¿þ?÷úŸ_}ëþÎÚ7œK}(µó€Õë5ƒ&ô«W׫ÇlâB‚¥-îÊ‹gÜ•¶©ú.Ûm)$f˾÷Í–1ï_ïy}Þ?ú¼fËÇÛ² š¤ó©tÀQÞ¥r”';’·“Éöd Ù® ª>Sëúþ®®_˜žNbÚ†ZÆÛ†¼M#W¼MôûRôzäƒèu½KwGïZ´ÿŒéýÂ_¥2'Û¦Žœ°MŸ™S1.6;›K¶?ñ&ÛS©Û©NúÜ¥Žz¸rdd¸2Ür÷=~º~çô‰ÉÎéB"Y×o}d{|(ÙžìxâMvÕ³FE–Èï¯ýȼ_áØT«pPÎcsÅæ&}Ñ#“¾¥òϸ =7[?ïo¶¶ ˜Ê–rùxfKÿ<"æö Û”µÑ6¥ nªU©&D¯ßß½ÔßÙÔ¯lSÉ¥¼ÄÖO±õMl|¤._±¤®bÒ~¥8ÞüÊKºþDtOžWþéÝØ\ìdl.^õ¨'^ã~ã–ªu¹§[ĶGÑõAdÿ ¶=Zú6Zú5²-Ç52Ê9ÕúV]éÒžO2ŒÇî½é±ËŒ²r™quõç¹ä_lû[ÿó«oÔ;åRJíü`[XXXXX°ôÖ~hénjør²u ÷Ò¹ßô^ŠWÅãUYù5²…„[îþ[¸…>1}+=¾¥síúu.£bÏ?Âw~~öº½ñ§eŠÅù§ÜÒöŸ†¾ø)}ëy8}+÷¼-õéÉö'žd;¥¡u „ïúŸýðßþgtò´Ôž'¯GM^_X!ü‘2 ÃLÏ=´OωI;¹8½§Éûƒ§I˜aÎéØùȇþ•?á+$žbÓç’á–ÚçòŸµRåµTý|³ñY©ò-¤í¯Ôñ§ýJw¼bËKêþD¸g™ñ]2cæ«ðˆ ©oR¤/f}+\fÿ ¶=ŠíW¢>ÈÊù׎é¯âÓÅìÏ‹“ÿÜÛW~í7÷øˆ­¥v~ …áî?ï Ów_¼ê‰'^EßËüë£îx};ó¯íü+}ßÑ«ÿYàgÿ3á> }“æt{ýÎÆ«gÙ0ýÛ®ž5¬À9/NbLe ™I#Ûþ­FfTìÝ”mN¡ehÙˆá1N75nüx»q#Ã̧§§›‰2âµ~cާùÊOsGì«DG,ó]ºÛ™¾ìÛZBm4=•NâÇ®þõîØU>í?^ÚYúj÷ZúüÉÀ¼?I'L¶Iëç¶Iš œ-/eÊ×åVT}¦Ò¿ãU±“ñ*áEÿZ¼çóKϜʶ¶ËÒéŸ]œ>Æ=:ãè—¨Ò¬¸¹ä?—2Mv>ŸH®À‰l!õ3—ú&E|J¹| ó*žœ>•m]ŒÒn¿k³=.•©ÓRVJaýƒýáÊ  x»µÉm·º+/ï®”®þ¬öü/]?¥íÿK¡Xí–4¡¯UO“û¼§ÉÒ{à€¥—¶ÐýÒt?9m)NFÓn& ßâů:Õ “QgÅ×2gEæ_Ñ»4£„_öŒNPÊ #3Ê4ÙîdV7Õò'!ݽ!]f…s“Eá¤ÕXšµŒ7¢årùÏ}Ü“0ÐRjʼnÍ©¡y:mCíÿ§mˆ£SðÌ95”^çzÿ¾ÎÕ9sŠëœ¡øÐQ¸Ž~£uµM8`›,ÍŠKù7„?xnwδ'þ1ÿ=×Qaz­yÛ9­™Ê]X¦^ûèMï ,‘˜_ý̽¾åŸÕ[¾…–õR«9”fû]íí1¿ü/•¾AuøËUáéÅ’¢=Ò?ˆí§eÎ êùiipGE—ÚQÁH€Ja¸Òýýp¥FV~:ßù bûóÒÌ~õ_ŠúVjýÀj÷šÛsè’²®·öúÞèØƒ}Ñ1…c“Eá S„bf”n9qÕ÷T¹êmSGþ`›¢Ý÷n6n\êi;t’ê¨8-wT(»6[”]ôWû•–†ÍüUhK‹*Ô1}2Ý1mÞ¿ïWæýô¤z¦¤A%¹QV.7jÖoÿV³þåzø³ìDÔ7u8ÛšüÒñ4¹ÿìi¢Óeº‰VפnÏRÙÒ\ñ4Ñ¿ÍzÍiÍzlû9ÌUÿÍW}1ó/öiT‚ öéh‚Uv)Ê.}‡ž‰À§*S2ŒÌôŽNfrÕw©\õT¦l¤z–¼éú)®¾‰O©•¯ÔõPYïújxGûß5¼ûb?%^zíwu—W~ù×»v^Ó»4ë5_kÖ«Ç·¶¨Ç+ÍÚ¿TšiÁÔBÒçWroÅérçmº|ÞÛãŸqt¤ÚOtÓ~B+…­\«¤¾Z$žž>3vuô‡Wóe¤íÏ‹“ÿâÔ)ê[iöo«×:Zमϲ·®Ïk½åµÓ„V¯@òæ“@’&Ãs>¬,ôçÉ­½|Þ­µF6Z£4»– 0 X¼NÜ|Š‚áË-/o…æó)~…¯8¿glb(ÁÒ>i{¤u¢:Òú‹·! °VÑäön| ?¥™&!;+ÎT:+,½ûvóÏ„€R†þJM`£•Þýü»†wùéÖ[[Ôã ‡bÂÑw©ÿ`ß%D  ô¡?€ÒT†ÀêE+LŽÝg&džهˆ¬NèÏ 4a¦ @4ȃ&Y`Ð ƒ&¶¨µÑõy®Ýõy"­÷Þ‹´²‘êY6‚ ÀÚ#bÐ$¤¿»3¤×»vß×»‚ú»;ƒz6lxĆDX{r4Iu¤n§:Ò.–¨BªzU(¨m êÙðî4€µ¨lù·å¦ :¹‰aæS Ãuͧ¸.¹qÃm¹‘ ÌNp¯qt—×Șê»SÚÿ<’ö# °6¼f¦ …4[ùš­½—zªz/Åæ‹ÍidåÔÈè] —ÀÚ“Óí9Aý A=®žeÃôoC¸zÖ€s`ÍZòöþƆaº‡5Vïb\€k䲩2…lJΌޔ3˜ikÏ’3Mh(ÄÓä>ïi²ô8`é¥-Ù–ãYl.v26‡áX«^³¬×>zÓk¯SÔ~X§ˆ–?Ø-W86ýIáPµªÞSµ"|°V½fÐd >Ô>ùŸ ®¹Ë„k8XÛ~d  @4ȃ&Y`Ð šd±jM"­÷Þ‹´®[·nݺu 3Ÿ÷·Õ‘V¹I®‘›Jçˆì¶¦Ëvåjù¼å–ÿù$Ã÷–_¬J¿4‹OXÛJ«½¬½þ `m1hb‹ZmQŸçÚ]Ÿ‡NñÙHõ,É—+‹–Ìí…¤®{×]wÚŸŽ¥ý¥ô„áqOÂÐçþÎÚç·D>·,Ÿ·Üò_¦dJÜuç—Á]oO%–&ž°¶¯½DǦGÇôÝ»軥Ø?ê3€tD š„ôww†ôz×îûzWPwgPφ Øp~L§ø™-iÿó0¿}­^ÄÙ§£q–þ­­ÙvN[ƒŠˆxÂZÅf#\ Òvog¤­4g~ÀRr4Iu¤n§:Ò.–¨BªzU(¨m êÙðîùš¢oø;kß°Ò¹Ù¢tÒ«·yô¦·93¥Ü´A'~ú}wÃYCwƒ:¤®W‡èoÕ¡­-êÐ`üBû`¼œÓÞØ ÃcvâeõKÏ©É/ÿ¹ãü³ÎT]ßuT­t*÷(ô‰¶è‘¶(ççb\AƒV4Ĥüh³IIGQ!ל®{ì½ç±žéâ)¼]¢»áŒ¶»!—ú–_<¥«ob÷Ÿ{þù[B6èä¦Ìã¢øPYa)x›GFø}ÒQÔõ}úi]_¶úf,3)ùýË5rÕÀXúÇc±t1{*¾~Vÿ=[ý\ª–JÑ¿åWŸ†ÄÐâöK5§mðD´mp©O[Ÿi&N…|û·‹k @)xÍ  ”«ÇÕõêñ›¸`i‹»òâw¥mª¾Ë6E[Š™éTgêvª3ÙñÄ›ìh¶~Þßlm:1Õ6”™2í3ýž.ºÚ†ZÆÛ†¼M#W¼M4Û%z=òAôºÞ¥»£w’óågÖž±lSGNئbÜÌ©›‹ŠÍ%ÛŸx“íaŠC!û·ôl´ôkd[Žkdt¤á–»ï…[|Þ?ú¼…ç§8ñä\Œ äRßÄæ_êú&vÿ¹çŸn QUõê`fiW^þ~¸Ò:y°Ñ:¹Rõm¸rdd¸’êEçô‰ÉÎéEå˜O¥Žò.•£<Ù‘¼ìH¶'ÉvUPõ™*X×ðwuýÅì©ò›I']ÿ&¾>[mSªà¦ZU"½~_ôzPgCP¿Rý'Íĉq?~ã0J΂¥·öCK¯p‹PëÀ—“­½—Îý¦÷R¼*>¯ÒÈÊÿ¨‘-¬pËÝ ·ðŸþó³×¥I¶?ñ$Ûi{pWè_ù †BöOèè¦LÁ0? }5ðSúÖópúÖŠÊ=?Ò¥§RZDø®ÿÙÿí¦plªU8ò;F>’ Ã0Ós±“ÓsÂw=MÞS†¹Î0ñªØÉx•¹ÉÂ_JîåþÿÆ0±ôã³±´F^~š¿ôŠqÎÆ8†a>*V~¤VHþ¥®o¹ì?¿ükäÛ¾Õȵæ÷~§5{íׂ^;ݘc›´ÎÚ&†‰«|iõšqKk͸§É}ÞÓdé«õZú˜Ž2%ÓHÞž$MÿlÚÈ ¼j#¹´—•j«®>çØ~×Vÿ ðÊ’3Mh(äÅåGï–^ÚBëSÄæb'csko¸„.½èQ~YJºà)S0ŒÌ(Ó¼úU¶tiÍÛÎiÍ”ç¥V¡KV³eßûfKó¡–ñæC´Ü/‡Ç= -½™_è7gCøƒç†°³â´ÌYA—O©Ž§ÞT‡£¢Kí¨(f~¤–_þ¥®o¹ï¿øÛ&­ŸÛ&{ÝýÖ^7Õ7ÛäÁÏm“Å,ßt€›Ih.‰Â¡øµÂAGJpV|-sVÒ^ ¡nªUéß!ݽ!]é÷!ÂöÛ9Ӟ蜡úC¥æ:Úcp]©þ3:ö`_t,sÙ`€RðšÛsh²}]oí‡u½tj«pl²(tJ]ú‡'þéó)†qTœ–;*”]›-Ê.Jã±_ñØiiÃÒÎ?Ã0ŒÌôŽNfÞ1ôÕðކw¿kx÷Å~"Õ³lD˜’ÅäFY¹Ü¨Y¿ý[Íú—Ÿ8ËND}S‡£¾Bòïmº|ÞÛãŸq”sí'º¿i?1*öü“Q‘™^êüäÏ܉ϿÔõMÜþó‹? ‘„ôÛÒÂU aUhKK¶þAºò¥y®úž*W½mêÈlS´gãÆ½›Í–}»Í–¥þ6÷ö’ŠFÇôÉtÇ´yÿ¾_™÷Ó“eèµ”ë3Õût4Á*»”Fe—¾GwGßSc1o«yOá<š|ê3-Lãfþ Á@éYG œÔõYöÖõyí£·¼vÚ‚Ð@¦@òæ“@’V¢Y{ó  ô¹µ—Ï»µÖèÁFk”îfà ïc8ŸâŸ°ùrËËŸè¸À|Š_Q1ÎÆ/ÄÙ›J°´OÚi¨Ž´þâm(ˆE·Û„tã[ø[ŠèögÅ™Jg…¥wßnþ™kkM Z)¦áÝÏ¿kx—–WomQ+Š= Gߥþƒ}—%XÛÊÈD+ÅLŽÝg&džهˆÀÛ3M²À  @4ȃ&Yˆ4±E­¶¨Ïsí®Ïi½÷^¤•TϲÖƒ&!ýÝ!½Þµû¾ÞÔßÝÔ³aÃ#6Œ ÀÚ“Ó Iª#u;Õ‘p±t@RÕ«BA}hkPφw?À  ¬EeË¿-7mÐÉM 3Ÿb®k>ÅuÉnË\`v‚ x£»¼FÆTßŘÒþç‘´€µá53Mh(¤ÙzÌ×lí½ÔSÕ{)6÷ðXlN#+ÿ£FFïb¸ÖžœnÏ êïlêÙpõ,¦ÂÕ³ܘkÖ’·çð7æ0 ÃÐÍ8¬±zkä\#M•)dSrfô¦œÁLX{–œiBC!ž&÷yO“¥÷ÀK/mÑȶ×Èbs±“±9 —ÀZõš…`½öÑ›^{¢öÃ:E´üÁ¾h¹Â±éO ‡ªUõžªá€µê5ƒ&ñ¡öøËÿld˜pÍ]&\ƒÀÀÚö „ M²À  @4ȃ&Y`Ð ‹U9hb·5]¶ÛºÎºP„¹ˆ´Þ{/ÒºnݺuëÖ1Ì|²°ô‘Ö‰êH«Ü$×ÈMk5°¶kxé×gêå(WËç-·üÏ'F¸7´…µQ{‹UÖ~ÄPOXýZHAÄ ‰-jm´E}žkw}êDØHõ,)<u}–½u}J§rÒ™KÇÔ9}*Ý9í¨8-sTpþÙç/<ÂnQx¢©ïÖÝÑwÓת ÑuﺣëNûÓ±´Ñ(\tlêptLß½û¾ù)~~J­>' {†>÷wÖ>w¸%òA¸eù¼å–ÿ2%ÃPšà®;¿ îB»[«¤©?+ôç«+?°<±ýÊÖ*ƒ&!ýÝ!½Þµû¾ÞÔßÝÔ³aÃ#6\x&ŒŠ=eFEߥþƒ}—rI¯ ©êU!6lx̆Ú+”´ÿy8í§/ ³eßn³Å6u°Ñ6…êRà³.i»·3ÒV ¿c ?oVœ}:géßÚšmç´5h#€ú³Z ÿ\]ù”/@.r4Iu¤n§:Ò.–ЀEPÚÔ³áÝVbФÙvìF³MkÞ~NkÎý¯ŒŠ½›Œ ¯ýÚ=¯]ºÕXÌÛj,QßÔ‘¨O¸ÝÛ]8TD¯ôÕ’-2ǃ­|'ûªÀh€‰ IŠ*¯JP¦àÊ…òOB˜ÞÓäýÁÓ$Œ­ØôbKJ˜FøÅ¶T©’±å»Rù¡K¸lU¦`:ÅIßzNßZ©šŸßþ¥h‰ùÅGºüˆ-ßÕ©ÓóýØ«“xá»ü€õÊ”oîrïoÅÖO©MÄöo…Ä_êA“\Ú—ÔõýyéôŸ™2ÏO ©Ÿ…[*?œÐéòR{(f}¦ {aä3·Ò¿I÷ý˜{úüÚ£tå%õù'H§˜ƒ&9ÝžÔßÙÔ³áêY6Lÿ6„«g +pcN!Òç‘t€fš¬ðžýÉ¿¦I¼*>¯Šq{bMê¦lPÕw5¨†+GF†+i²ßpååï‡+ŠêçF…*´¥E*$'´ì.MÎN/4nüx»q#Ã̧ø”q6q¿]#ßr\³hšºF¶õ¸F&Ü"6}!NÅ…“*Sð3•„S=Wc~ROGSÂítóš§éÊO“»òâ7îJe—º^ÙUY£½XYãóÜxèó’s©÷Ÿ»üâS¹”ïj1Ë—¨že'ø©ÚtrSÍ~ËG5ûéÞõbæ*÷þ¶Ôêg!ýséÄ?¿þSêü£?Sýgîç'ÅQH~–_ý§˜õYf*SÈLÂÈgn)¤“îûqeûÃåûç•-¯bžÀêµä ‰°‹ éÇ·†ôÔõÔõ[ëú½ö‘¯Þ}SY´=øm¤MïÚý@ï’îSè ÆnmrÛ­îÊËß»+…ïjkÞ»¦­Ñš·Óš½öÑ›^û`â/g ªÏºT…|.­îA{Û@K¨m ÙñÄ›ìHûŸGÒþ±«½;v•O;ŸduPõ™:HÿK?>»øÞÝ÷èlŒn›^j«1?ôKEæßZúj÷ZúüÉÀ¼?Ip¶Iëç¶IÛ”u‰å„Ë”bò&~ÿb½>?…ÄGŠü“ôñ—Ú«xrþùT¶ûð…寊ŒWQϳøµØÏ[ɽ¿_?³×±dçó‰ä ¬Ò?—Nüó;ÞRÈ?úó•%öü¤´óóvÕgé½ùó±åUjçŸPš–4¡nÅÓä>ïi¢»i‹F¶å¸F›‹ŒÍÑ–Â3A¿rù?îK§òË/¬HÝ|HYz÷½ÏßX$þ÷L÷÷ÕYùélãÍôû§£¢Kí¨ˆú¦G}±B>7àfÒúm„ŸMS¦äOœ_ËœÂôô›Ý“é¬8-sVÐÉAªã©7ÕAy+$½Ô„ùéœiOtÎPäib×уëhñóC÷²vΜâþ1?ßh]Gm“Ø&…E¥C¿òµ—N h= ™æÕ¯:¯¨ƒ›jù/ìîÞÎn©\å·±rÉO~ñ‘.?ÅQœøK(Ï>ï}ÞÌ4 ç&‹ÂùâÞïC-ã͇¨dù8<îIh)¾Ì¿]ÙÅSóëoÅÖOaL„uŒ†fV¶Ë¥¿-$þ¥ Ôòþ|eûO±ç'¥œŸ·§>G)œ?ˆ-¯R;€ÒôšÛsè”±®·öúÞèØƒ}Ñ1…c“Eá .f¥2!ÿP^!ÿ0üï—kn(¯H¯™éé‹0¨m êm“‡O¬ô¿â÷ܤW׫Çéé9cWGxõ{Å+”Jcé­Ýké•™dYAsp4òòÓ¹«¾§ÊUo›:òÛ­æmܸw³q#=9Ky5]>ïmŠqÏÆ8: í'º¿i?¡¥° O/õê÷Þ¦‘+Þ¦ût4Á*»”Fe—¾GwGßCÏ0âSoÞ§i䊧)Á&.$Xe×f‹²K³^sZ³^#Û~N#sÕ³ÃU¿ø/æS ã¨8-wTPzЉÇ~eÄc§£Ëüº­ cúdºcÚ¼߯ÌûéI ôZøþÅÊ=?âã#m~Ä·t±õ¹ñ—2ÿ Ã02Ó;:™ixÇÐWÃ;Þmü®áÝû‰Tϲ‘Ååë>ïi’eår£fýöo5ë_~â,;A™ûçÜ à— _ùÖš{›{ý¤˜¸ê»T®zªc™Ñ(œØþ6¿øK]ÄôŸÒæýù›ê?ó;?)Íü¼Mõ¹ýCéœ?ˆ-/±ý3¼mÖÑ'u}–½u}^ûè-¯¶”r¦í¶¦Ëvu¬­ƒÇC­ƒ¥+zx›§ÉýgO“Q¹w³±¤n)XÝÉ›OIš|»Ró›@ NÍŸTNMŒ{øEŒˆµÄ¥øô·o3·öòy·Ö=ØhÒì0.À0\`ñ:Vó)†IæSé—+O½š-¼Ó%ÎÆ/ÄÙ›J°´OÚi¨Ž´þb5¨w¸ÿ`ïpé — Æ¿oŒ+ïìR:pú^šCÒoá§tÒ¤JgÅ™Jg…¥wßn)oÅ€ÂÑbátûG ÅT†‚náQ8ÞÑ)Ã?¹Û‡BL Aw&7ìÿü»†ý1ÓŒ.öbò§Ùññ³£ïRÿÁ¾KŒ“a'bPšÆ<¾‡c’<õý-M ‚[EVÝ™<9vŸ™cf"<ô·P|«òö©aÐ šdA“"­÷Þ‹´®[·nݺuÂáx =¨In’kä&Ô4ÄíV ƒ&¶¨µÑõy®Ýõyè…TϲQ Ë_®®KD]÷®;ºî´?ËmÇèØÔá蘾{÷}wqrXSgÞ^SçÔüIåÔ^^4üA¯únÝ}7 ‹¬T|¤®obó/µâ×"bÐ$¤¿»3¤×»vß×»‚ú»;ƒz6lxĆDXY\`6Â"m÷vFÚ¤¢Á‚ >´%¨o8v£u ð}¦ýÏÃi? ‚˜-ûv›-¶©ƒ¶©ÕÿRË1ë€PNƒ&©ŽÔíTG:ÀÅÒUHU¯ õ¡­A=Þý`-š85g´N:¤®W‡ä¦ :¹É=rÂåü\Œ{1ÀÛý´®¯ú™_}èþÎÚ7¬tn¶(ôJ­53%çŸp~útÊÉòõYìñÀj÷šAº„P«ëÕã 6q!ÁÒwåÅ3îJÛT}—mж¬¥ Lú¢G&}±¹ØÉØ\¼êQO¼*Æ=ü"Ƶ ˜j¢4–¾}ï[ú¸7ÃÉÛóEªƒ‰‹g ªzgƒª˜97ï¯ýȼ_áØT«p$ÛŸx“í±¹‡ÇbstDmC-ã|þÅo~éÓþç‘´?¸ëÎ/ƒ»rÉ?Ín¦ÎzXÙX¢cöEÇ©ÛóT³õØfëJ—Æ|’aMu ·7¨ê»Tô›3M殼üýp¥QQýܨP…¶´¨B…ç'íOÒ~Àâç&ÜþyñÜ„8›¸gÅæ¿8éK -,êóÞxèó¶ œˆ¶ ¬ìþùòJÇÒþxU|(^ã÷Ä8ºé#¿}æR¾o6ÿÚšmç´5…ä¥êpøCf,S¼š#óêÆ%a~؉êYv‚¿UjƒNnªÙoù¨f?­¥’ßñÀÚ°ä ‰ð"¤ßÒÓ¥E]¿µ±®ßkñÚ×Þ9$–~|6–^´…{t6ÆÑmÂíÚš÷®ik´æmç´f¯}ô¦×>˜øË™ÁDƒê³®âÞ˜£ª>SÅæ¿8éÅ+SJ+GÅi¹£‚æ#/°¥@û·[›Üv«»òò÷îJéÊwµçéú³òõA˜ŸxUìd¼J8(É¿¾Éç@)XrЄ.zËk§-XôpSO“ûÏž&£rïf£1)±ôÌ©Xºò“×*?¡'¶¬¥¿@òæ“@’VâX«ó¿ˆ[{ù¼[kl´Fé!\€a¸€ðqôït`>•~¹R᫟0¹À|Š_Á0ÎÆ/ÄÙ›J°´OÚi¨Ž´þâm¨Ôãß7 Æ•Žwv).)MyùiœVïp =ƒ&¤ßÂߢB7•8+ÎT:+,½ûv[VËV š„na 5~jø 1é¤ÜL:Ððîçß5¼Ëß>³µE=®p(ö(}—úö]B”VJBPÜ ÅDóe&Çî3“c ÃìCD¤„™&Y`Ð šd±*M춦Ëv[wÃYCwŠ0‘Ö{ïEZ×­[·nÝ:ác–òKO^’›ä¹ ±…·¡E u‚¾µé[cùï©¿_Vûþíåm«o¥÷}=Ÿdaéà\àm bÐĵ6Ú¢>ϵ»>ual¤z–òñGÕõ]GÕrÍé 9u=Jçf‹ÒIÛéqª™Õ9}*Ý9í¨8-sTpþÙ·K± ;eaW¨ïÖÝÑwÓת ÑuﺣëNûÓ±Õ¶®°”éÁ½kû«®ÔŽ÷m‹?êêâ“0<îIúÜßYûÜá–Èá–å¿;¤þ~»ÿèØÔá蘾{÷}·û(åö"5±í«4”)†bÜuç—Á]oOý\å°2D š„ôww†ôz×îûzWPwgPφ Øp!¯plªU8Æ®^»;v•: xUìd¼Š­Z×oÙ[ןùWªª^bÆÇlx0q¡}0±²AIûŸ‡Ó~ÊÙ²o·Ùb›:Øh›BuÈ]œ}:géßÚšmç´5«+ÿ\`6Â"m÷vFÚ0œh/h_o3”¼Ír4¡éKhÀ"¨m êÙðî… š¸¾Ñº´5ï]ã¿d¦wt2“ÝÚä¶[©;©¥þ֨ػɨðÚ¯ÝóÚ¥ Pż­ÆõM‰ú„۽ͣ7½ÍêÐÖu(ó¯Üڋ߸µòíßVÈ ùtúÍÁ¤4–™”J§rÒIó_LÊ6›”±ôÇbélé?ÚlRRJšÅã±ÿõžÇ¾ôþsM/7mÐå6QøiwÃmwÍ!¢WŠ^¶ü$†ç‡"Ü6x"Ú6XÌ_Y…ùç'ÊnÐÉM4¾Nù\‰òw¼4¯Šæañûß “›lÑ#'lQÎÏŸ5øÛ&݈§©ëÕ!a”ãÚã™å%ŒX.Ózš3Z§†ßöx¢>”±ñ–š·ydÄÛ,œÕX×÷é§u}™åUSgÞ^SG‘¤¨R„—ª¹Ô·üêôñ×ÿ‹­o´OvÂð˜xù ¢_úv©¿_rßÿâüWÿ=[þ3Bìþó«o¹oîý§Ôò;_’®=¢½äR¤þ~Û¾HßðwÖ¾áRȾõçõç¥Ù^ò+/€5eaaaaaÁÒ[û¡¥W¸…ÈŒïì’eFY¹ÌÈ0e †¡-”’÷]2ãŠr”ŸþG¹!\õÈ^*ÿÙÿí¦p(~­pþ‰á–»ÿná#ðó³…zmør²u€"°ø/~~¶°@3eüÏ?ûŸ ߣGy×ÿp”’«é¹ØÉé¹à®Ð¿wÑ–ô­ôtú–uòð—ÖIëýû:—0½!üÁsC¸Aõ™³AE9L¶?ñ$Û)åâ£Ë'ýÒ±Z.žTš´½cú«xÇ´F¶íœF–ùWFÅž2*¬“?·NÒ‘&Û“d;Õ„å?qe-•ʽ^^b—Ú)ý¥¤¿2[ö½o¶4[ïn¶.¬!ñªGÝñ*ŠM‚¥íTKiêòòu2—íT:™ño¶óññD}(bã#,5Kï–^ª9Âw…û§Y\žx^Õ‡Wñ,¤¾å^¤&¶ÿϯ¾åò}Qœïéò“_úüê[îÇ›{ÿ)½|Η¤kh/¹ÔŸâ|¿¼ ù'bÎJ·½¬l›(Üð÷Ÿ‡wп©ÎÇ«žxâUñªøà«×GÝñ*jƒüëC;ÿ:y=zhò:½R‹ù‘Â-¯4!4pÐ{éÜoz/ÑÇkdå\ú¤¤üPȦZ…ƒ`©”Ôõ,•çB:>áP½Rל-2ǃ­ü—è«£&*$)¢ÄßEY¦àÊ…òOB˜ÞÓäýÁÓ$ìæÄ¦Ûi Ó/T–*µBò#aþ)o´}ìªï¿Æ®Šª+¼¼øzÅ0 “y²+l5k©+ä£T¦`˜Ÿ†¾ø)}ëy8}kùò{»Tü…ñD}(š ®–Úòß&¹ì©ú ¶¾^ŠÏBê›Ô¹|¿H±é ©o¹oîýgqä~¾$u{D{Y¾þóûåmÈÿò2ÏJ¹½`ÐJM1Mrº='¨¿³!¨gÃÕ³l˜þmWÏ º1'“Ïsã¡ÏS×oý]]¿ïêµÿð]ÕÖ츸ôýœéÀóH:@§›+›“´?à×4‰WŇâU1îqOŒ£I}” ªú®ÕpåÈÈp%M~®¼üýp¥QQýܨP…¶´¨B…ÅäÚ]Ÿ‡³áôBãÆ·72Ì|ŠOgøû`5ò-Ç5‹¦íid[kdÂ-bÓBáTìQ8ù©2?SI8ý¯˜ùKÚTË—£:¸¹VLu¦þWªóM•;Q=ËNðSs7è䦚ý–jöÓ½¦ÌB7zš®\ñ4¹+/~ã®Tv©ë•]•5Ú‹•5Ôcþ)KÅ?Õùt4[)£>_áýÃò«ä²ÿ¥êƒtýIéij”ë[.ß/«±>/Ußr?ÞâôŸ¹Ëý|©˜íí%³þ ÿRÈý|`µ·€µjÉAaÒo é©ë©ë·6Öõ{í##^;½[x&ènsÛÔ‘?ئÏnüWà™!RõØðšçòDÚü6Ò¦wí~ wI ê iwååïÝ•Âwi5­yÛ9­Ùk½éµ&þrf0Ñ ú¬«AUÈçÒ]îÔ¹· ´„Ú’O¼ÉŽ´ÿy$í»ú×»cWù´óI†QUŸ©ƒôß±ô㳋×JˆqÎÆ8á±é¥VjùY\OGùâì“Ñ8›9TWÌòz±X²ÿy$í_üº6Ÿ×`é«Ýkéó'óþ$ hÚ&­ŸÛ&mSVÁòÌeÊl›ì|>‘|͉ÂRñ§_fPJÔýC.û_\ò¯o¹ÔŸR‹çÛÜÿ,UÖÅ­oR÷ŸÅûùR1Û#ÚËòÇ+}þ¥m_ÅÌ?çŸOe['Eìù@i·—•//€ÕbÉAjÌž&÷yOÝ N[4²-Ç5²Ø\ìdl޶òñ}Ãßìnx·érûÁ]·îÒu¿ÿ@—Óƒ¬©›O)Kï¾÷ù‹¤Àﺿ®ÔÈÊOgû=“ƃ]jGEÔ7u8꣈ò¹ôü {æO©Ë”|çë¬øZ欦§ß”èž[gÅi™³‚:ßTÇSoªƒòVHz© óÓ9Ӟ蜡ÈÓ"Ä®£=×Ñ7ÕHß7ñOh®¼xf¸Ò¨Ø»Ù¨X©òÊåxÎM…󎸇ZÆ› ÈM €ÑàcáÇ»²‹ç‚¢G¿ˆò˘Ñ6­¯$Óð¿2щméîí éh;j,ÿ)3§¸Œÿ7Z×ÑÕá/³ }¢>ŸÔýíŸî _ª>Ø&°M^ßr©?ÅŒg.ý1ë[©Q7Õò$².f}“ºÿ,f{Ïå|©˜íí%S1ó/Eû*fþ…uÏç½ñ£Ï›™Fìù@)·)Ê `µxÍí9Ô„êzk?¬ëŽ=ØS86Yj¢…¼ýPÓÿ´Ju¦n§:õ=»è{„ë0/µ3u4A}hKPo›<|¢°‹LüŠÐtr“z\]¯§§çŒ]ýáÕxð+”Jcé­Ýké•™dYAsp4òòÓ¹«¾§ÊUOsp(Æ{77Òƒ³”WÓåóÞ¦÷ølŒ££Ð~¢û›öZ «ðôR¯žím¹âmJ°OG¬²KiTvé{twô=ô #>U±Ç¹“Ï#ÉNªQßÃ/¢¾¾K=U}—V¢¼Ä/ bʲr¹Q³~û·šõ/Kd– /Ô— p3\€_òùÍþª0ŸbGÅi¹£Bٵ٢ì¢ãõدŒxì=JGOÝrÕw©\õæýû~eÞÏFªgÙH.Ÿ¡wí¼¦wiÖk¾Ö¬WomQWšµ©4;Ê»TŽrÔ‡Ò©R÷ž¦‘+ž¦›¸`©¾iÖkNkÖkdÛÏid®úov¸ê ¯o¹ÔŸbÅS\ÿ/u}“úû%¿ýÓ4øŽé“éŽi*kz ½²ÿÜë›Ôýg1Û{îçKÅih/K÷‡Åø~ɽ}•fþ©î ïújxGûß5¼ûâS50¿óÒl/Ò•À*@ œ,¿l©¡U ©*\ñ+]ÿðß~,´Â(ªR<§i)ov±«â¯­Ê.\~ PJ¹>¼Ùø”~ý(µöŽó%´€Â•ÜB°¥¦w¸ÿ`ïpëàñPë`)äg0þ}Ó`\éxg—ÒaTîÝlÄy¢9D!Ýø~ÊM/tVœ©tVXz÷í–òV,/¡ÅžiR(ê$êCéÔ‡·­X{íçKh/«QBPšb­p¼£S8†r·ÿ„˜‚îülØÿùw ûc¦]ìÅD³ãã=fGߥþƒ}—'Ã0N¯tÆ<¾‡cž êÿ[^Þ¶þ ø¤kï8_@{X½ÖÑ´“º>ËÞº>¯}ô–×N[(5níåón­5z°Ñ¥Å¹¹ÃpÅñžO1L:0ŸJ¿|Ðø«eιÀ|Šyœ_ˆ³ 61”`iŸ´=Ò:Qi]•·çH ƒ&Y`Ð š¬»­é²ÝFO_§×b~z¤õÞ{‘ÖuëÖ­[·Nx§ÖZ%öx ‰ÝÉVü2]=eø ý">Pº¥¿Úëê?êÿR¥/õ÷oáû—ºö¢u@qˆ4±E­¶¨Ïsí®ÏC©že#bÂð¸'aèsgísÓ“œÓþt,í_©ýGǦGÇôÝ»è»WKL^÷5¿š¾ätÝ»îèºs/Óâ—WMy{MSó'•SSxy þôݺ;ún:mZ©øH]ßÄæ_j«±ýäýÛ›%õ÷o)|¿”ƒ&!ýÝ!½Þµû¾ÞÔßÝÔ³aÃ#6Œ ÆÙ§£q–þ­­ÙvN[³²ûç³.i»·3Ò†qôÒWÌò¢Á‚ >´%¨o8v£u ð}¦ýÏÃi?$™-ûv›-¶©ƒ¶©ÕÿRË?Ú/¬UèßàmÓ Iª#u;Õ‘p±t@RÕ«BA}hkPφw?X[ƒ&4g„~·§g¤+Ê=JçQu}×Q5ççbÜ¢±vú5›0_[ÿsÿþåo±Ù “›2óIõ‡>«°ïwqùO©û‡üú·šºß£”ÔºÙˆá1¡-TÛŶÇ|ûÏbŸ_¼m^3hB [=®®W'ØÄ…K[Ü•ϸ+mSõ]¶)Ú²6ÂaÞ_û‘y¿Â±©VáH¶?ñ&ÛcsÅæ&}Ñ#“¾¶¡–ñ¶!azú5;¸ëÎ/ƒ»ø-¯~å.1Ù9-]ÿðfÛo.Ç›;£¢zÖ¨ Áô¥ÒðCíÕ³üP{~ùÛÞÕAõgê ÕU­yû9­¹u¨e¼5KÊt`>•8Ê»TŽòdGòv²ƒj©*¨úL¬ë?ø»ºþBê³Øã¥“lÚîm¹âm¢’Š^|½®wéîè]ÅìŸÅƇp.Ær©Ï–þƒ–~lËqŒZ ÕOŸ÷Æ>ïJEîí+÷öž_ý/üçWßÄöoR×çüêgîý¡ÔçKbëîß¿t‹:¨ªW3÷6\yùûáJëäÁFëd!ßïbó/6žR÷ùÕGùi™£¼÷RÿÁÞKÝGϲÝGû.}û›¾K´Åu´Çà:š_{Û÷ü à­´°°°°°`é­ýÐÒ+Ü"Ô:ðådë@ï¥s¿é½¯ŠÆ«4²ò?jd kE`z.vrzNø®§Éûƒ§‰:»Ì¿ ·Üý·p ½ŸŸ­tÞrÙ¿0M²ý‰'ÙNÛƒ»BÿÊá ÓSÚNë°ßõ?ûá¿ýÏ–:^±y–ßÙ%3f¾ Hlü…û—"}!å+u}àÛì–ÞŽé¯âÓ+[Çø2’•ó¯ËJ.Ç›Kù±üò/ü«ÉëÑC“×ßTÿPœö›ûñŠEßT'i‹Îõþ}ËUßS媧£f˜2tbó_H{§²£ícW}ÿ5vUáPüZLÏÆ_6”)øR[Ÿó+/þSÊ 3ðÓÐW?¥o=§o•Ú·gf|ÄÖçbö+•ay‰­ÿ¥–ÿBê[îßwoª>gÖO±ý¡ÔçK…ÔÿÜãï(?ý/Žra-MßJO§oÑ·äRâû]l<¥î éß(†Â–˜¹¥óÛRè?JÙð÷Ÿ‡wûêxÕO¼ŠÚÿú¨;^E­ƒ}hç_©÷£Wÿ³ÀÏþgÂ}ò­2òA¸%§Ûshœ’~!¡ÂÕ³†5ucNœM\à×%ÑÈ·×,𦍑m=®‘¥:ŸŽ¦:KÿXNÅ…“¿€,S¼úýÕÄ<áñ²Õ³ì?sƒNnªÙoù¨f?Ý«\x~Òþd í§_-øß.nÿ¼ø·‹Bâ/uúRC ïù¼7ú¼m'¢m+»¾¼Ò±´?^ŠWŸÇ=1Ž&ÍJ×¾Þlþ—_¨˜ýCqÚïÊ®¾Ä;„¶õt;'m¤n> ¤hr¸FV~Z#S87YÎBò/6þªÐ¦ZUˆþ­n®US©ÿ•-%-sN“«…ÓÅ?ÞnÜÈ0ó©|ës~ÇK7Ãzš®\ñ4¹+/~ã®Tv©ë•]•5Ú‹•5>χ>O1{žÜãSH}–ºX©üë›Øú_jù/N}“zÿùÕO±ý¿çKÅ©ÿÖɃŸ['}Þkw}^º5Æk½éµkÍ;þ¢5kkv\Ì÷Aêþ°8ñɯþÈLe ™IØ3·rþPjý'ÀÛlÉAaÒo é©k«ë·6Öõ{í##^ûZº1GT}¦Ò¿céÇgßûãq4ü&rW¦”òxãU±“ñ*á ÿZ¼õÒ ‰¿ÔéK¡¼„§åŽŠfëïÝÍVáªhÿvk“ÛnuW^þÞ])]ù®öü/]Ö~û¥éß4­z0q¡}0Ñ :òeƒŠ¦û¼7Ÿú¼†°á?Ô^HþÅÆ?ax:ʯ`gŸŒÆYši²8Mb(a “uZ!ˆ¦CSNÆ®þõîØU>í|R|}.äx-}µ{-}þd`ÞŸ¤AÛ¤õsÛ$MÆ.NùŠÏjéVª½‹­ÿ¥–ÿÂ꛸þMŠú\Ìú)E[œú¯‘oûV#ך߻¦5{í×îzítcŽmÒÚh›”º¾O©ãS ý[!知Ö¬UKšPgáirŸ÷4Ñt>ÚB÷Òýä´em‚~¡)µ3§¸ÎZ–‰~5rýFë:j›F÷ÓÒh¥ÿ¥Ò7¨Ù *<})”¡¥Èèt§súD4ß(rGQ®t?\I¿”R¾†ðÏ áΙöÄ?ÆÿÕ}¿¥œÿüêçÛÐ~ 6çw¼ôéô <¿L ] –)Ff”i²­Ô#ÅÝÅÆ§þÁYqZ欠œ§:žzSŽŠ.µ£‚)¢üÚ{îõ¿4óŸ_}˽Ëoÿ¥P?¥îo‹Yÿiˆª×ÝoíuÓj ¶ÉƒŸvf+6ÿbã)u|ŠÓ¿Iw}ñ¦Î¯Þ6¯¹=‡&ïÕõÖ~X×K O*›, 5ѵOÓÈO-y«ìÚlQviÖkNkÖkdÛÏid®úov¸ê‹Ÿ+UhK‹*Ô1}2Ý1mÞ¿ïWæý´ò<½v¼îóž&¹QV.7jÖoÿV³þåzø³ìDÔ7u8Û3GJ-þz×Îkz—f½ækÍzõøÖõx¥Yû—J3-èUHúüž ]yѳrh1°Â§y/…?ÆW‹@ÓÓgÆ®Žþðê÷–|âC‹ÿ%ا£ VÙ¥4*»ô=º;úzÆ ŸªÐy¹ç¿8õóíi¿FEõs£âE~äÛ¾ÕÈé‘Ï16\ý|ñ˜ùå_l{Ov>$;©>D}¿ˆúú.õTõ]¦ÑÈËOkä´…mêÈlS”ãÆ½›é(2÷,¶>‹?Þù?³Œê¥÷دŒxìô陹âÜ à×Z™YNùÅG,oÓåóÞ¦÷ølŒ£V¬ýD÷7í'FÅž*ÖpC!í]lý/½ïÓ|ꛘþ-Ÿý—Ný”º¿[ÿó;?¡!’þoBzC¸ê‘!L%XøþÅæ_l<¥ëŠU¤½¾(ÎùÀÛl-pR×gÙ[×çµÞòÚi BP:bé™S±tå';¯U~B+®¯¥Ë@òæ“@’&Ç®¥ùkð¦Ðl }ÏîÿÔ÷¼\†³h'‹o¶>;5R95ôD¡øPû@QK ¥çW°¶¹µ—Ï»µÖèÁFk”fŸq†á‹×!šOñOÈz¹åå<\.0Ÿzµ‚RüBœM°‰¡Kû¤í´6Ù/Þ†€¬vôK}á­ÞášìÒoá§pÓôQgÅ™Jg…¥wßnþ^¨Ïù¡ÅÚTõ]+q³!”>œ_H ƒ&P$tçpûŸ×ð.ûÌÖõ¸Â¡Ø£pô]ê?¸ø¦ Ôg±Æ<¾‡cCäƒYCeð6Àù€ÔÊ(š/39vŸ™cf"ÒÐu¿ÿ@׽нÀ,t£>ÀÚ†ï#©a¦ @4ȃ&Y`Ð$OôHËuëÖ­[·Nøà"È«‰êH+=÷Ñ@}CüŸBâ‰þñA{€b1hb‹ZmQŸçÚ]Ÿ‡N)ØHõ,»×çŽMŽŽé»w?Ðw¯½£+>]÷®;ºî´?ÃóáíýMägù‹ÀÕu‰(¶?)~ùÖÔ™·×Ô95R95…— Ы¾[wGßMÃ"+)’ÿ·­½Ã›…ú¹1hÒßÝÒë]»ïë]AýÝA=6´5¨gû¬­Aú5Œ¨þ;;ÁoÙ ç%[jÂsßðwÖ¾a¥s³Eé¤WoóèMosfJÎ?áüGÕõ]GÕJ§rÒIOS·Eœ°E9?ãòümŸ’½A'7eî‡òS!ל® ·' {“ÒXfRòù‘kä&“ò£Í&e,ýã±Xzñ§¼úýÐÛ<2Âï“þª®ïÓOëúÇsƒŽ[.¿cS~èwZú[ÊELx\Ký6žËoæÝ g Ý êº^¢¼©C[[Ô¡Áø…öÁx~ñ§=„tã[Bº¥ÒØm_ܰÛÚ[Bmƒ…Ô§æŒÖ©áóŸ=½0v[Óe»RÒïi Cb(aX*þ¹×Ú½+ŒdÛà‰hÛ`f)äw¼R”WqÚ»Øxæ—éäÞÅÖÏüÒ‹íOŠÏΙÓòΙ¶–PÛ€ÌôŽN¶Âû¯±˜·ÕX¢¾©#Q_¶ãÛߊk¿Rç_ì÷‹ØúYjßïbW|û•ª漻ጶ»¡â#u[jß_PL¯4¡¯õ¸º^=ž`,mqW^<ã®´MÕwÙ¦hËÚýÜuç—Á]ü–W¿’-5á9Õ™ºêLv<ñ&;š­Ÿ÷7[Û†NLµ e¦´M9a›Šq3§b\l.v*6—lâM¶ÓÚ†ZƳýU.hJ¶:¨ªW}Þ?ú¼Âw‡+/?\i<Øh\t¼ùT:à(ïR9Ê“ÉÛÉŽd{2lWUŸ©‚uýW׿Ô'WŽŒ W†[î¾n¡ÈtNŸ˜ìœ^Ïç‘Åñ\žyíGæý ǦZ…ƒ"›{x,67é‹™ôB'U´oÓÈoå¯ÒÈÊÿ¨‘-¬Qá–»ÿná£ñó³×¥I¶?ñ$Ûi{pWè_ù/`azJCÛÃ-‘Â-ÂwýÏ~øoÿ3:ù+$çŽòÓÿâ(·ô8`é¥-é[ééô-:I¼=4y=—ýð§eŠÅG!<êÜ÷–K<©^Qšé¹ØÉé9Ở&ïž&a|–ÚçòŸÅJ™‚a~újà§ô­çáô­Âë µaäu®÷ïë\®úž*W=å„>—j‚Øú <.±ñ¡£¦ícW}ÿ5vUáPüZLMˬ¹”—°ò«ÿÒ•—Ôí=¿ö•{~ 9F™ñ]2cæ«ð iR¤/$>RÄ3µýŽé¯âÓÒ”—¬œ]þSVª¿-$bùå?÷ï±õ³4¿ßóû>Í…ÔýóêŠOáým)¼Í†w¸ÿ<¼ƒþM}u¼ê‰'^E=0ÿú¨;^E߆üëC;ÿJß/ôêøÙÿL¸OB=N·çÐïô 9ýÛ®ž5¬ÁÕLò£p*ö(œü b™âÕoh¯&¾ÆÙÄ…8Kÿf'ªgÙ ~*õÜT³ßòQÍ~º·¶œX'~nôy¯Ýõyi*©×>zÓkךwüEkÖÖ츨­¦§e}Ùˆá1N75nüx»q#Ã̧–þ,mͶs‹÷Va|4ò-Ç5‹n#Òȶ×ÈROGS…| Ý\æiºrÅÓ䮼ø»RÙ¥®WvUÖh/VÖø<7ú<ùí™o¡-A=ÝÎFÛ©›O)ºyJ#+?­‘)œ›, g!õAl|T¡Mµªý[Ü\«¦:Sÿ+[ÊÜëC.åµTùæ~¼Ò•—Ôí½ðö%´?HûiV?7áöÏ‹ç&Ò¥N_jh!IŸ÷ÆCŸ·màD´m`e÷Ï—W:–öÇ«âCñª÷¸'ÆÑMÒõ·o6ÿË¿çû"÷ö^ø÷{ñ¿O ïŸK->Òõ·kéû ò³ä ‰ð+!¤ßÒÓWE]¿µ±®ßkñÚ×Ò9‹•)Wzê ê3uþ¯ŠŒW /Zø×B§‹käÛ¾Õȵæ÷®iÍ^ûµ»^;ݘc›´6ÚݘCw;Ó—=ÝOÓk)'cWÿzwì*Ÿ¶K£ ãK?>»øÞã÷èlŒ£_r–/£dçó‰äkN”-}µ{-}þd`ÞŸ¤zÛ¤õsÛ$MfÎ/ÿt{MÓL\hL4¨Ž|Ù ¢©Ë>ïͧ>¯!lxÄ5Rr‹°¬ŸŽò+˜ÄÙ'£q–fšRr)¯•ªÿR”—Ôí½°öµòù‘¾=æ_?Ŧ/…òrTœ–;*š­¿w7[…R ýÛ­Mn»Õ]yù{w¥tå»Úó¿týY­ßïÒ•¯Ôù—zÿR÷·¥ýýÅ°ä  } xšÜç=M4ñ˜¶hd[Žkdtÿ9mY{AQ7Õò_!ݽK/í™;š_`¶ì{ßli>Ô2Þ|H8î}¥¥Î ÿ,úJîu÷[{Ý´¾‰mòàç¶XÍ„›Iè·þºLÉŸ|8+¾–9+ŠsúM†niéœ9ÅuÎвj%×Ño´®£¶Éø£Ðš·Óšiâ«°ŒhfÍRŸBGG¿ðð覄 S™‚adF™æuwÚ/ ³aÊ­Ùòñ6³Å¨ØSfTôºÏ™{Ý´îIáõa©ø4¨Ù ÊL?˜ø¾i0Aÿ®¼xf¸Ò¨Ø»™ÏI~õÊËþà¹!Ü9ÓžøÇüô\G ¯ÿR——tí½ö%E~¤n…ÔO±éK¡| --IÃÓÓ'¢…­@‘ ŠÒp¥ûûáJš¹VHùæÞ~K3ÿùÕÏÕþý.EùJ©÷/u[Ìï/Z)sÙ~x³^s{]‚ÖõÖ~X×K]¹Â±É¢pÐWòZ Š*´¥Eê˜>™î˜6ïß÷+ó~Zùœ^ Ù3 Bɲr¹Q³~û·šõ/×oŸe'¢¾©ÃÙž)  ‘„ôÛÒÂU a:"a¼ü´FN+nئŽüÁ6E91nܻٸ‘ YxNÄ®Nïi¹âi¢%‡•]›-Ê.ÍzÍiÍzlû9ÌUÿÍW=¥¤'S¸ê»T®z*#6R=ËF^—£ùÿË0íŸòà±_ñØi©¶BŽ×¨¨~nT¼(_ù¶o5rŠ$®~¾øiSùÕ½kç5½K³^óµf½z|k‹z¼Ò¬ýK¥™ÀËLŸì|IvÒ¼°¨ïáQ_ߥžª¾K…׊X‚}:š`•]J£²Kߣ»£ï¡gdð©^ýŽ'þx¥-/éÚ{!íKºþG|•k{,¤~æž>¿§ŸHOzV-~I—UR”Œ¯e§§ÏŒ]ýáÕïçùÄGlû•:ÿÅ©Ÿ«ýû=wÒ÷Ï¥Ÿâô·Åùþ¢Ù©1næßc P:ÖÑ'u}–½u}^ûè-¯¶ 4«=¬Qß³û?õ=/—¡-ÚMäÍ'$M–^«óÑàmKÏœŠ¥+?Ùy­òzbËZú!íwmCùÀÚàÖ^>ïÖZ£­ÑTÇSoªƒ 0 X¼ŽÕ|ŠÂÚË-/‡¤¹À|Š_‘*ÎÆ/ÄÙ›J°´OÚNkSþâm(H¦‡tã[ø)Í4iÙYq¦ÒYaéÝ·›&ÀZB¿lÓçê.Aû]ÛP¾+ƒ&'º“¼áÝÏ¿kx—Ÿ~¿µE=®p(ö(}—ú.¾ Ð~å °º”!k®ûýºî…îf¡[ºO¡ßÛ'Çî3“c ÃìCÜV´_”/ä3M²À  @4ÈbUšØmM—í¶î†³†îa±Ì'Fn’kä&z]·nݺuë„m*eôÞÕ•ç7{tÔÊ„%¾ô§OTGZ—OSØÑ­îýÃÛÖ~×vo#¶€â×·¡Âê­bóƒöR¶è‘¶è`üû¦ÁøJí×k°–ˆ4±E­¶¨Ïsí®ÏC] ©že#…|<= Oß­»£ï¦ÕÝéô‹³á£ò„:§O¥;§§eŽ Î?áü+º|¢ã¢œ(Ê=J'm‰¥<K¿­U¥LÉ0i:–öwÝùepWéä,:6u8:¦ïÞý@ß]:¹Z½†Ç= CŸû;kŸ;Üù ÜBå¾Tz]÷®;ºîåÓBìþÅÖ©óð6÷Bø¾F<¡ÔÊ—®}©ÛóTƒú3gƒzñ»¯•„åôÚ6x"Ú6¸Ôž¥»^(>ƒ&!ýÝ!½Þµû¾ÞÔßÝÔ³aÃ#6\ÈÇkÍÛÎi;«×îú®¦ýÏ#iÚÿ<œö×XÌÛj,æýû~eÞŸùWªª^bÆÇlx0q¡}0Qx 8?ãüÆ{77Öõþvw]/å$Ù‘¼ìè®?³£»ž ÔpÙˆ´ÝÛiïj…‹³OGãì‹Z³íœ¶õÖFÿoúgÄJ­|ûÜç>îs7¨ŸhP-¥CWF4PN¯®†o´®%g‘Hq½ð¦ä4h’êHÝNu¤\, Ô‡¶õlx÷ƒÂMÎM…SÚÒ¢ ½è üó)ΟüœJÔÁMµêàRkTìÝdTxí×îyí…"ÆýøEŒKu>Mu6[ïn¶ ;C¤ê±!Bðþ›U×wUÓœš/C“Üh †Rò·lÐÉMÂíÄÛééô-ëäá/­“:×û÷u®låõêS~~¶°bèéÓ)'”C¸ê‘!œy¼¹çG˜ÆQ~ú_å´bNåRxùŠ¿X†ðÏ áÕgÎ)íŸâ–±ùϯ|¥‹¿tùÉ/}îõ3¿ãW=êŽWÑ_ÑMp´>…úÉBê¸PͤŽwìê_ÿcìjfúÜû‡BÊ7·ïˆWû_ÿdàUüù×çüê¿tíQêú#õñJ×^ŠÓŠØïÇÜÛW1ÛKîû[^ùõWÒ?ˆ%6ÿbëOé´ÇRëOÄöçùõÿo[{Éoÿ¿ö·KåAT}¦ ÒµìÔY8IÁIDAT×-ge¯×„†w¸ÿ<¼CXÛãUO<ñ*Cà_uÇ«è;}hç_'¯GM^§Wÿ³ÀÏþgÂ}ò­ òA¸å5ƒ&¤uàËÉÖÞKç~Ó{‰>^#+ÿca_êK¡Nºéå;A:•Y*Ïù¡QG@]íŸNŽé]aÁл™ßAlª]ÜAPwL'U´…ºZ–*|ÿ®M¸7±øUKÊÙb+ÅIÕ+Ú'Uhá»4Ì”y¼¹çG˜FøÅ°T-z³ñÏ/>Âä—ÿüÊWŠøK±éÅÖÏüŽ—ÿ”2à ü4ôÕÀO¹œŽˆ¯?í‹ó_xÿPHùæB¸ÿ\â_Hý—¢=J]¤>^©Û‹ÔýçÊÆ'³þ‹m_Ål/¹ì?¿òʯ¿*¥A“\ó/¶þ”Z{,µþDl.6ýÛÙ^òÛÿäõûŸL^§ýÓõH¶úŸ $Û…}2]‚Ò•‘uòàçÖÉ×õ™+½@Š9h’Óí9Aý A=®žeÃôoC¸zÖPÐ9KQ8{Nß]þþ·tày$ ‘Ë•útmÍŽ‹Úšaí_¾ÖÆ ñ¡¸‚«t(÷(uý>­ë§”q6q¿¯›¨že'ø©þtrSÍ~ËG5ûé^Dáþ©sñy¯Ýõyiê£×>zÓk§™5ôé…ìñ±¼þnsZÖ—–ÝN¿4nüx»q#Ã̧Š5ãIx¼ù–ã‹oƒÒȶ×Èèæ©•ªcül©2?¿IxkFq⿲ñY*}~ù—N.ñ/5…ÔÏÜ—n~ô4]¹âirW^üÆ]©ìR×+»*k´+k|ž}ž•Èÿ?Þf¸²ýƒÔå›Kü¥®ÿ…´G)êO©µ÷ÂûséúÏÜã“{ýϯ}§½ˆ­?¹——týUqäž±õgµÿ3ÿbû±é3.]«í%¿ý+Š=Ê×PK•)ÅDx…B‹*8ÊO¥åt³|Þ¤¸^(¾%M„]dH?¾5¤§®³®ßÚX×﵌xíô®”Ù[î¢=Òöà·‘6½k÷½KºÐ Pçô‰hçtÔ÷à·QmWUŸñë­Ä«b'ãU/²¼þã34òmßjäZó{×´f¯ýÚ]¯}¸òò÷Õ¶Ik£mR˜2¿ýç.aH % ôå×6ÐjHv<ñ&;hÏcWÿzwìêËRÈ8u{µÚ ­ASxœ…ÇK?>»ø^ñ÷èlŒ£‘ûl½ò ôJ)âSÊù/.iëƒøú)Ž¥¯v¯¥ÏŸ Ìû“i2öÛ&­ŸÛ&mSÖFÛÔJäæÔëÖ**¬V.ñ—ºþÒ¥¨?«±¿Z©ö"E|ÄÖ±í«ÔR^âû«ÒZP?—ü‹­?Åm«ûüGl}›^¸déJå¹”Û‹ØýÓð g„Ûîÿ6Ü&E++Îõ€Ô–4¡nÑÓä>ïizq®ÿy$í×ȶ×Èbs±“±9ÚRÈÇ÷ ûqßptìÁ¾èm¡¥ÔœR;+Ì–}»Í–¥þ6ºù4²ôî{Ÿ¿±¨´¨-¡D'L|~R·S½îóM½náê´„í‹{;µŒ7¢”ô.-EKÙe~ua½î~k¯Ûç½ñ£Ïk›<øùâA“BöŸ‹t€›IhXŠý-Sò'‹ÎНeΊ¥þ–žyD“)ÿ…ÇŸÆÈ)Â3§¸ÎZF‹ŽÚuô­ë¨mòÀÅQ"ƒCº{;³=¦Z,©ãŸ_|h2¤³â´ÌYA'ëÔ^]jGE)翘¤¨…ÔÏÜQë£_„øeä脉֓’i^ýê•OþiÍ…¶¡öÿÓ6Ä?üo>É0™¿AÒ?Hm©ø7¨Ù *NýÛ¥®?¥Ù_IÝ^¤‹Øú/¶}•šüÊ+¿þJlÿ,\xe‡hsÏ¿ØúSÌö¸ÚÏréÏ Iÿö´—BÎêzk÷ÖõÒUUæ»ô½&^|¥öñ¶¥¯ÔÈÊ^¯¼)¯¹=‡¦]ÕõÖ~X×KC Ç&‹ÂA]Fáãb§bMv¥‰sšõÛ¿Õ¬W·´¨‚ƒ?ÿýàOKu A}hKPo›<|b%N¼äÆwtr#=¥\ûÉÎëÚOøühNkÖÓ¤5ßÕÑ|W…EƒJr£¬\n¤œ¿\ïz–ˆú¦ó3S„hˆ$¤ÿÛ†ž–Œ>?¨ðýç‚fиê{ª\õ¶©#°MÑžé¡ËËWÉLïèd¦áC_ ïhx·ñ»†w_ä*R=ËF )OÓÈOS‚M\H°Ê®ÍeÅ_#Û~N#sÕ³ÃUŸùW½Žé“éŽizL5­N¯…åGªøçÇÛtù¼·)Æ=>ãhuí'º¿i?¡5€ŠŸ©Ÿ†ßþs¯b÷Ÿ_ýc>Å0ŽŠÓrGíŸòà±_ñؽM#W¼MÖç?{šèƒ&îÒÓ¨ß[©þAjz×Îkz—f½ækÍzõøÖõx¥Yû—J³£¼Kå(/fýߥ­?¥Ö_Iß^¤ŠO~õ?÷öUšÄ—W>ý•Øïk.ÀÍpþA+;«B\þŶ¯â´ÇÕ~þ“{ž_ú·©½äþÐlýâF³u0qñ›ÁDæÐd²sv"ÙiÚ¸w³i#Ýa ×|­§ëÁÁŸ†Ú³]©)®×Þ”u´ÀI]Ÿeo]Ÿ×>zËk§-¥œi»­é²ÝFSëàñPë `-qjþ¤rjbÜÃ/bÜ@|¨} Ž˜H–l êÏûÔ…ï×k 5·öòy·Ö=ØhÒ(.À0\`ñó)†IæSé—«ö¼äó©W+RÅ/ÄÙ›J°´OÚi¨Ž´–­Æõ÷ìfæ * ÀZDèœnïêœf¦†ƒ’¸^ƒµdUšÀÚ6æñ=+éaàmð „ M²À  @4ȃ&Yˆ4±E­¶¨Ïsí®Ïi½÷^¤•TϲÖƒ&!ýÝ!½Þµû¾ÞÔßÝÔ³aÃ#6Œ ÀÚ“Ó Iª#u;Õ‘p±t@RÕ«BA}hkPφw?X+ƒ&4wfݺuëÖ­«©ûíîš:¹I®‘›Ú[BmƒlÄð˜Ð–†îú«„áqOÂ`RËLJ¥S¹Gé¤4&åG›MÊXúÇc±tæþ»Îh»”ÎÍ¥“^½Í£7½Í+•»­é²Ý&7mÐÉMúîÝôÝ Cb(aÈü«ÜóϧO % ô.¥T‡¶¶¨Cmƒ'¢mƒôé 3ŸäÓsþÙç?ª®ï:ªæ÷¿A'7Ù¢GNØ¢œŸ‹q~4B(M¯4¡K\õ¸º^=ž`,mqW^<ã®´MÕwÙ¦hËZ Š£ü´ÌQÞ{©ÿ`ï¥î£gÙî£}—¾ýMß%Úâ:Úcp¥”éÀ|*p”w©åÉŽäídG²=H¶«‚ªÏTÁºþƒ¿«ëÏÜ?àb\ ÙñÄ›ìh¶~Þßlm:1Õ6´RùWÕŸ©ƒiÿóHÚ¯5o?§5·µŒ·fÙ¿ØüÛ¦¬¶)UpS­*H)£×ïï‹^êïlê3÷o›:rÂ6ãfNŸØ\ìTl.ÙþÄ›lOu¦n§:Û†ZÆWî¨VÖkMè»ÙzÌ×lí½ÔSÕ{)6÷ðXlN#+ÿ£FFïÒëZ ŠÖ¼ã/Zs¥Yû—J3¿å½kü–ûøl‚¥íyùiÜ©zlx±¶‹Ì$ÓÈLvkc¿Ýi›¨Ž´eî¿Ùú{w³•þ]cùíû5–÷ã1n¥òß ú¼¿AEÿ¶MþÒ6éóÞxèóf¦Ì=ÿ4Ç$ºýÿR4ÈB)NÅ…³màD´m@¸çTÇSoªÃk½åµ»ê{ ®zJIÕ:pÌ×:0\922\‰F¥)§Ûsh®žeÃôoC¸zÖ°fW3‘™Ê2“ÌX¦—ÚBhY\ºyGxû‰qãÇÛf>•mÿ4|ðbÏ‹öùêÆ!ºFøº|þU¡Mµªý[Ü\«¦:Sÿ+Õ™™2÷üÇÙÄ…øË¡¢-Ç5rá~4²­Ç52áazv¢z– =ÓkÍ~ËG5û¹Àl„  @i*[ê áM7\`v‚ °Æê]¬‘ p\@6U¦MəћrfíÍ4Éͼ¨·´ÖŒ{šÜç=M–¾Z¯¥é(S2äíù@Ò´ÑøÏ¦K …ä.íOÇÄD8ax:š0Ðê3qöÉhœUlT4*6’uPõ™:È0Ìß&–~|6–¦Y*´·÷èlŒcæ#~ÿ/Ó_g˜xUìd¼JáÜdᇊJß’3Mh(äÅåtï–^Ú¢‘m9®‘Åæb'csoçpÉ‹ø¸™t€æb(Š_+ S¦ä#œ_Ëœo*oƒ‰ï›ôïáÊ‹g†+н›ŠBòOC0†ðÏ áΙöDç -ãJ‹ ×y!4Db¶ì{ßli>Ô2Þ|ˆRÒ»´­·yd$Ûò·Ñ±û¢crÍé 9š(¼)¯¹=Çk½éµ×õÖ~X×K—² Ç&‹ÂA—Ðosàhž…«¾§ÊUo›:òÛÝ8cܸw³q£Ù²o·Ùò¦ò–ì|IvÒ\¡¨ïáQ_ߥžª¾K…çßÛ4rÅÛ”`ŸŽ&Xe—Ò¨ìÒ÷èîè{j,æm5/Ó—)ùÑ ›Ü(+—5ë·«YOŸB7ìD}S‡£¾ÌO¡…rcÜ̿ǸÂçéägÝÂÂÂÂÂB]Ÿeo]-ÛI[šÕ…9¬ïÙýŸúž……ŸŸ-,/¤HÞ|HÒJ%oóü#š[{ù¼[kl´Fé!$\€a¸ÀâuEçSüc_nyù“<˜Oñ+lÆÙø…8›`C –öIÛ#­Õ‘Ö_¼ …•B7ï„tã[B:ÚB7Ý8+ÎT:+,½ûv[z%X0h"ÐJ( ï~þ]ûtûz|k‹z\áPìQ8ú.õ\|ÀêU†¬ ºî÷躺˜…né>…VB™»ÏLŽ1 ³q€µ 3M²À  @4ȃ&Yˆ4±E­¶¨Ïsí®Ïi½÷^¤•TϲÖƒ&!ýÝ!½Þµû¾ÞÔßÝÔ³aÃ#6Œ ÀÚ“Ó Iª#u;Õ‘p±t@RÕ«BA}hkPφw?À  ¬EeË¿-7mÐÉM 3Ÿb®k>ÅuÉnË\`v‚ x£»¼FÆTßŘÒþç‘´€µá53Mh(¤ÙzÌ×lí½ÔSÕ{)6÷ðXlN#+ÿ£FFïb¸ÖžœnÏ êïlêÙpõ,¦ÂÕ³ܘkÖ’·çð7æ0 ÃÐÍ8¬±zkä\#M•)dSrfô¦œÁLX{–œiBC!ž&÷yO“¥÷ÀK/mÑȶ×Èbs±“±9 —ÀZõš…`½öÑ›^{¢öÃ:E´üÁ¾h¹Â±éO ‡ªUõžªá€µê5ƒ&ñ¡öøËÿld˜pÍ]&\ƒÀÀÚö „ M²À  @4ȃ&Y`Ð š¼"­÷Þ‹´®[·nݺu 3ŸÄñŠg·5]¶Ûä&¹Fn¢×¥?}¢:Òº|xù$ãýöÔ^ôÅ?ÞBâƒö¾ÖëÒj,ßBûÏÜ¿ïÐÿÀÛ@Ä ‰-jm´E}žkw}ú d#Õ³lDü‡Î'¦B¾ýÛ ywÃYCwC¶Ï:r­©ûíîš:R©‰ŽMŽŽé»w?Ðw¿ Ç›0<îIúÜßYûÜá–Èá–´?Kû—J¯ëÞuG×½|Ô‡×)S2 Å0¸ëÎ/ƒ»ŸµÔ—¿ˆZ]—XbÛûÛÖ®v«³|óï?Å~ß¼ D š„ôww†ôz×îûzWPwgPφ ذø-S2ÌÀOýÿ÷ÀOŽŠÓ2GEª#u;ÕAïÑé²×>2âµ÷^:÷qï%R©á³.i»·3Òö6üjgŸŽÆYú·¶fÛ9m êÀÛ\J->ˆ?ê |W ¾ï2å4hBƒéKT!U½*Ô‡¶õlx÷ƒ|M†aŒÊ½›J£bO™QÑ9sŠëœ¡í͇Ž7êœnwNkäå§5rá_Ño 5uæí5urÓܤt*÷(GÕõ]GÕœŸ‹q/~Yê·Ê•ú S¸Ÿî†3Úî¥s³Eé¤WoóèMosæ_qþÙç§ÜRÎé(hf0ÿù¥§ø˜”m6)iJm…\sºBî±ÿõžÇ^xu¡}²Õg'ø-ôüôÝÌI¼¹—W~įØxòÇkxœíx³Ågƒ.·éÐÅ©?ùÆÓXfRòû—kä&Šp,ýã±Xºú µ|ÛK®ÇKh~œ:¤®W‡(½:´µEŒ_hŒ3>ùí¿oø;kßp)Ô·üê§ØþÄ©9£ujøòz}þsOŸ{{/f{ɽ~Š-_a¯åmñ6SKŸR×÷é§u}|Jº¥eƒNnÊÜÕ7úÛâä'ßöUŒò•®¼òíOrý¾ËtýØúPjý”²× šÐWˆz\]¯O°‰ –¶¸+/žqWÚ¦ê»lS´%¿ï»tîã¾Kƒ‰ íƒ §æk™S“`÷$ØÖ/£­™éÍûk?2ïW86Õ*Éö'Þd{lîá±ØÜ¤/zdÒ×6Ô2Þ6Tü r.Æ’O¼ÉŽfëçýÍÖ¶¡SÙrb›:rÂ6ãfNŸØ\ìTlŽŽ"Õ™ºêÌÌ¿Øô–þƒ–~lËq,íNûÃ-wß ·ø¼7~ôy ?ÒÌé¾ô)´=s¯Ôå%öxÅÆsùãÍŸçñÓ¡¥«?¢Ë70ŸJå]*Gy²#y;Ù‘lO’íª ê3U°®ÿàïêú ©R]¾"—.Úi?Þ¦‘+Þ&:ÆèõÈÑëz—îŽÞUÌøä·ŠF)Ô7±òëOèÝØ\ìdl.^õ¨'^ã~ã–:êÜÓ‹mïR×±õ³ò®®¤þ–>¥súÄdç4½K·´¨ƒªzu0³7®¼üýp¥uò`£u²8ùÉ·}I[¾Å,¯Âó¿R­¸8ýO.õ¡Ôú7(i –ÞÚ-½Â-B­_N¶ô^:÷›ÞKñªø`¼J#+ÿ£F¶°Bå§ÿÅQNŸ>vÕ÷_cW3ÓÐçRšé¹ØÉé9Ở&ïž&:™¦-á–»ÿnáèçg|Ê¥¶‹%ÜO²ý‰'ÙNÛƒ»BÿÊŸpÓSÚN÷ ßõ?ûá¿ýÏ„ù›>—ø~Ô¹ÇPly‰%öxÅÆSìñŠM/uýYYüit™"[ÿ°Rmªx®l|–:^¾Ö•)fà§¡¯~JßzNß*<ÿRǧÔê›0?2ã;»dÆÌWáÒÿK‘^êþ¡°^ñõõ3¿òæ|òzôÐäõåóCßì–Þ,½´%}+=¾%3ÊÊeFናéÚW~é¥.¯Ò©ŸÅér¯oöûVÊð÷Ÿ‡wп©oW=ñÄ«è–}Ô¯¢³;þõ¡¥ï zõ? üì&Ü'¡oв\V‚ú;‚zÛ¥ïfm—è߆¡êYÊÁ›-o3[:{Nýgg¹nï&s–Å_ãlâBœeƆ×È·_|ÛŽF¶õ¸F–ê|úŸ©N¦ƒa˜Žb<)œŠ= 'P¦™ æ3üTÞ2åËü3 Ã0ìDõ,;Á˜ó3tæS/òÞ‘gúeãS̘H]^bWlŘÌvf#ÃÌO”À8ïrõAd|Ä/Ýœèi¾²ÕÓÜWùíÇ}•vý7ìzMÏ–M«¾§ÊUo®ûx»¹¤—¯.úFÒþd í§Ï%4Í^ØÍè…÷'R§/¹×ÏÂË7—Õ.¬“?·N:>éºîø„Û1ávxí×îzíÚ£;þ¢=ª­ÙQÍï¡8ùy›Ëëmë–¯k)žPKšoºá³\€5Vïb\€k䲩2…lJΌޔ¿˜Â*uFÕAÕgê Ã0c˜XúñÙXZ¸âIŒ{t6Æ)›¾S8^š2Û~’Ï'’LóÏLO1ý2ÿ×&^;¯R87YøS‡L¿L|†ùh…ªråËkåëƒðxÅÆ³ÔHÿ„!1”0ÔŒ[ZkÆ=Mîóž&K_­×ÒÇt”)™Ž@òö| iÚhügÓFá©mîõa¥êçŸOq~™©L)3ŸBŽ×ÒW»×Ògé«·ôÑ»NÍŸÔNmÊj°M%™äí¤èö"u{,µú&E{_ª?‘:})”—P.õ³8å«‘oûV#ךßûÖìµ_ zítcŽmÒ:k›d&ºVúçBÊWúòz}ÿYj¤®k«¾@1,¹¦ …¼¸œè=pÀÒK[hýºß»8Ã%„~“ѹ޿¯sѱ´L-Rë:úÖuÔ6yà€íÅ=ÒZó¶sZ3M| éîí éh»×>zÓk/~ é+ÙlÙ÷¾ÙÒ|¨e¼ùð™Ato3-]–_zŠ!üÁsCØYqZ欠ӯTÇSoªƒ~K_©cQ7Õªƒôoal )¯üêCîÇ+6ž¥Fêü§ÜL:@¿­)Š_+tªMƒ Ί¯eΊBêC!„my©ÕjÄÆ'¿ã¥w}ž}~™@º )S0ŒÌ(Óð7•3>Rì¿ÔÚK!ýÉRéT‡¿lPž¾ÊKlý,fùÚ&­ŸÛ&{ÝýÖ^7µ_ÛäÁÏ—ÔjïŸó+ßâ”W.ýg©‘º>²ÿèØƒ}ѱÌeŒ`m{ÍB°4ÄP×[ûa]/}U(›, Â?»ž¦‘+ž&Z’Vٵ٢ìҬל֬×ȶŸÓÈ\õßìpÕSJ™éÌäªïR¹êÍû÷ýʼŸTϲ‘7n„’eår£fýöo5ë_®·?ËNÐ …¤÷6]>ïmŠqÏÆ8Z÷^û‰îoÚOŒŠ=ÿdT¬ÔQ¨B[ZT¡Žé“éŽiŠ-­üO¯ù•W~įØxŠ%õÓ1¤Ë?ý®NÂmSGþ`›¢=7îÝlÜh¶ìÛm¶^òCmyxÇÐWÃ;Þmü®áÝGÑ¢sO¾Ç;ŸbGÅi¹£‚ê3ý•Ç~eÄc§¥‹éö/u{‘®ÿÒ»v^Ó»4ë5_kÖ«Ç·¶¨Ç+ÍÚ¿TšiàBÒç×Þ¥¬âêgqÊ—†HBú¿mé áªG†0E ôë›ôå[Œòʽÿ,5RׇüöO ·Ç¸™qxd8ÀÛc-pR×gÙ[×çµÞòÚi B¥Æ­½|Þ­µF6Z£t·`îÅ\rÞ|ŠbæË-/‡¼_¬fÈ0 ÃÄÙø…8›`C –öIÛ#­Õ‘Ö_ Ü™0hM²À  @4ȃ&Y`Ð šdA€,0hM²À  @4ȃ&Y`Ð šdA€,0hM²À  @4ȃ&Y`Ð š¬€Hë½÷"­ëÖ­[·nÃÌ'lÑ@”`yb¿)Vö›¥ð½á›PÄFQ‚Ò÷šA“n|KHÇF ÙˆÜ$×ÈMrÓÜTS÷ÛÝ5u±ôÌ©XZ˜žóÏF8¿-jm´E)¥Ò¹Ù¢tvÆÚ±•Èð|’aì¶/nØmJ§rÒI¯¶è‘¶hfê£êú®£ê ¹æt…œòOù¡í©ŽÔíTG1óCñÔwëîè»)>”+Š0½[HnÄ–—ØôPš¨×õy®ÝõyèäƒTϲ‘üö&<}á{¹Fn¢¾+Ò:Qi]ÙôÔsš”Æ2“2¼ù$å”I¸çÌÏÊvÕ|„ŸB[béñýÛRù§ôKõ‡ùä¥:žzSôWÙÊh>É0òíßVȻ겕õ‘¶(åjµ”o.ñÌ->ÿh0þ}Ó`¼²F{±²†>EÚÚ¢u7œÑòÑ[*?ÿÿöî?´‰|ßø×óôp'{\˜ˆò$> MÙÓg…&¬‡&á:==<¦ëBS=|:vºMj~µþz¿ ¡L¾™|ç;ßL&Ÿù|¿£~”bSI¥×¥+Oß•¡‰[ûBù|Z׳ýéȰz¿Í¶}V>›îµ82g+41{(4aîÙuËܳå×_Uíݪš.Ã7º.ÃZ”@ÿõ‘6hBáaSåaS•ýÃ÷«ì‰ÉGÓ‰ÉX{d8Öλø=¼«f º²f@ý*çÁ–€ó`ÔŽZ©dèRðw¡KžÒs§<¥tr“OuÛ†ŽÎ¶ Iñ+¤øtËõ÷¦[b±©XGÿÙÞòþ³+Ëó®ÍÕ¼kbôâõ‰ÑÄd"œ˜Œ”‡¿Š”'$y>!Õ ØQÿµ®ÑöÎ £Í7zñºo41ù(˜˜¤V­²ÛÞ©²Ûöïû­mn5Évå¶àå0_ß0›Ý»nšÝ~óõ~³uÚrÇ:ÿšéÈ@ÇO›}ß.›½n¶öpÝlaËÇ:î{cÍŽÏ.7;jþøÇšõ4¥d"œ˜ô—]ý¿lå{©KÊ“rX9¾Õô}¸«¦Oy—ØT¬£§þ/;zê+Ò>¯þá'·? ?á]M…;Ž9ÇsšÜeÿfrÌ×¶Ì&Pž/Ò26xoàÞs•tr®upŸ~Üz.x}gOìí;ûªìßÌÛóyí³„Î(ºJºu]%cMÎ5Ñ»[Û‚-ô-¶z}Ô‚vO‘ M_þÑtbÒì6]5»kjî›q­Ûßë¼xÝëŒZîöF-ÙÖ']û¨—§û<®üTB&déqP–‚m?í ¶eŠÍ¶üz¢ã•ߨæ7·~v¹u°°åÐ`]-,,,,,ØûªoïS/™¹tóƒ™K´$ñã£éÄ *“¥§“+â•ò O.,pWÌ ô%ª.ï®ï-w×›Üïß4¹òÀ Ë8abÔ÷Ÿ£ù¬GùšW×ÿÅÔ'ñcb.ñcÇÜW‰Ž9£mÇ£-·õd»¿²ß¿kKçßö¹Îï/ üå=G­Ùñ™¯ÙÑ:ø¹¿up­Ëg[ÿé–ëÿsº…Ú³ïì‰ÿÕw–vô8ÖäýëXSº×Ò§Cç×}¬óÓ'ˆj;xoøËÁ{¹µº>îúã;Üõ™×'s‘ò;=‘r¯Ü,ðTsWü õgåxòôaªVR/§òô3)Ö~,Ö¾‹µÇ¤X;õZâ˜9ô…cf¬éüù\÷rº=E=PýMQØòÄUÜùw®bêW™×-óãa¶ëTÿ,̶&+Ùì{ß±ÙéSI}^ýIW£ïeú\ÓËôïY¦©}òé3/vÿ¦kÏlÛ‡Ž™™ôól÷Túí-Ì™Ãz¶³ãSÏòﵕkË­'çó)È|®âîÿî*V¾7–qßèÜ)·ò¹}åVÿÌϨôH¯U/¡ÇÜʯìÔ2tN) EÊÓmËÌ¥ÐÁ™Kî.Ûv°Ù÷½o³g~¼JWç‡8?Ìäü0Ûþ¯‡‘žÙAÿS‰”ß‹”Ó‘My¼Ó)Ÿ{þjî‰òxÛ©<ÒQŽé÷¯zJÿ þnº%m¦‰±jÇcuÓ~ÏIG¿‡bØ”¡0=Ý>mÐú¢AGå)ÕV–äyY¢wM¿½²¦Ÿž5¹Ë®šÜ!ß­}!_nÁeýoÈRÄz÷Ûˆ•˜)Ý—Þ+Ýõ¨•¤øTRŠ[¦ß¿i™^ÿúP2íâðœßkJ4¿§+‡Òé§ÒÃÜê“íþʶüZøÝÞol÷›Ó•¡g­Ó»[§×º|>ÛãSqQ¹rþÉ@³£møèlÛðÊ’tõ¯m¸åZÛ°·éÂyïâ•RÊÏ¢«š¹µz¹,ÉaYʤ>Ù²Ô¶¸mŸ8ºÆHùV>ïåŸ}ÞLÖÐ6t4Ô6D奇SIé!ßµÙÎw½¶Qê‚¢cˆþš¾^-jžŽZi‰§ô‡¿xJëfë»ëfiI!Þ-clÌé½2æTŸ¦®üËtùË4]/Ê­®®¸ÓÀñ.þïyWÍ€ãpÍ€oìòmßX¶C2éînšñ…Ÿ„¿ ?‰”ß锇åÛGÂrºo±ÌËçÿý•QŸÏø| ÛÌÜ2}ô~ýÇz?e:mïž0ÚZ‡[®µ¦= L–°üó‘°œy& a£3mȨ̂<Îq~¸úùa¶ý GAY™iB(CQLõ«è¤ay¤?ø;%FH¯RG¦—Gs¡^?$ÑõUºŠHñEz\}=“ÿú'R<•¢J/¶>ô*ZƒúŠbn2ß_¹•_;}·÷8`ï£%t „¢ìu¦ë{G\ëòÙ÷‡¥®^Cº+J$>2)§÷¥ë鮊g[ÿÜê“9¥æKŸwõ³t¥By—ÔW¨·SßË$Òiüb¦uzíºž“Ï:Õ{Š®Iª¯^vÌ}é˜+Tù•×rWÿ¾ÈüÊ6áé:3…ò•ãÛïY¦ÕÇÿTõßXÆ ôMA?àéŠDn5Q_¡š(ßGÒÓɇÔJ鎷tÝŒÞ%ÿ,Ëõß¿™·gæí£þþ]~MòËHǽ—:$]}Ôô]œ®<­Žºê’¯Ê狾;( cõL“LÚ'ŸOA¶í“îû…úRnåsûþZëóÜÚ3“òê2ê¼:žPp¹°ßJÔßVöÌÜÊãü燅íoð:y)2M(¢\±©rKÅ&§£ÉãtPç¦/N÷î G#Ï©4ïÚX¦ŒÖºø=Z×\âögs‹Ó¼ÅÄG7bb¶×ÕÔëoü<Ð:Èwñ{ø.®b£‰«hüÌ×:Hs‹¤[]i¬pü©fÀ7zño¾QcÕŽŒU/ª>‹ëéâ÷ð]ôQ§kA¹†¿²Û_Ù—_[ÿ¦kËê«aÔ†”›³xõ¸k³ïZëòùl íSå´ˆ_êó¿¼J£ èêuJ/÷”þpÜSªíÖ×k»iRCê±¹µOnõÉ\Ä=±ÒÿÍ¶Ï õ³nûçnõ5„|³…|t‹®¼VÑèuä7_}[¹‚Dÿ[¦w?.Ü•ðÄdLR®[FÊ#Ñò°|·7,§›î:Ûò+ÅÄØTLT~¬æŽŽð#Æ3ÇGŒKd8b¡/K­K»Gëª8òø¦ÔÿQP™iebÌw{bÌ yç»åý<[4[eOÐA»û‘2O„Ï{ñ§T×ß(İøMåf[ +¨µÞ¿™·gæí£ž¯D}_âÜÑq®ÏsÂÖç‘¥d\–žWŸLÛg­¥û~‰‹ÆãbnåóÿþÊÜZ|ÿæCØ\­ Ðÿzÿ–j½?.Æÿ5UKæ†&¦õy/ßöyÛ†Úó/óCœª¿äãWé;âÏGB”’§L¨S¤U>`ô3[deÐw4Y9 ‡–mï]4Úr«(­Ÿb¥Ùò6_¸àm®›ýèÏu³ÒÃËÿ)=´ËïZ‚ù4\>õI/Ïõ•Ùî¯l˯5SOÙUS%.*ƒƒ>ú¢AG©ƒ”°m™¶©›©›u<›Þïe«¿Þ¯ûX¿xÝ>œ¸ûíò»`„å;߆åÕ×01ú/›í?;PÛ¶n¶þ›ºÙ¨%:œÙT… Ü{ëm“¦‚&Ë´ÞØýØzƒ†¢Ðp¿Â ÌY¢>>xJÏ}ï)-ly²¸EÓ–»Ö÷g:n‹sGCâ\ÈwëÃ\‡‹f/cŒNì¨6løµvÆ 4%6аÖ1çø•1ç‹íWë³óoÚ”“²zRzáZf³ïrwr®bqþ˜,οZíoêyÿ–©‡òGJÏüe¤”½"Ò}¿PæHnåóÿþZK©'¨.Tù¨åÁ¸ò=±ÞX)Ó¤Pµw•tj\%4sJ&¶LÊãüç‡éγíoùH41pÛZ Az¿ÛÛÓ¸|΋SMCQš¸TyE‘–±º™C_Ô͈óqžJÒ¨¼žÆ^KOc³ãð@ª‘f4n œ¾ªEZÆ38f\%Ç®Z?Ý%fåP_¡"ý#'kûG¶6kØJWŸèÔaõFYËú|··D}ÃBãÝUò¾«„fÂÏ­>Ùî¯ì÷ïz ŸIîÆãFw£2¦}O‘ÀÓõ1·¹žå³é¹ ¯ºb@=G9*âãΰüJ{nõÏV&ÛK×@h˜CWI'×UBý‡ú³«¤[ï*Yý]¸Š"ž«p„j;B´-ê“X]ûkòœk¢ÄTZBã‡icÌÛ<~ÅÛìn쵸)ÿ.·zÒí„é–½ê“-º ×ç9ÕÔç¡æÂµL2®ÿՋေ+|côã?ñcLJü¸°ð4¶°@#;ÎüãȺËÉ‹½ÿÅZîßÕäÖ>t]‘Fà«o ½v?zíýÕ¿·÷ÇÄøTL¤¾újµ¿8×óÌi]o¢¢-¥Ï/}¦›s-“òù­½sµòƒ3`úigÀTØòCÑï›”½?RúÃ_FJ¾rKú3‡ÌÏè3HŸS L¶<Îq~˜OÿÈ߯ÒwÙ&®‚¢}cNïcNMÅÛfM¥‡…å»ß†å‰Ññ¿NŒª_Õw¶×ÒwVçß\­óSIã¦7~à˜©=ì˜iÐ2Р_ù^ Ëóÿ𼉦(î¨÷ëëõ‹ë×vo±k»)ÝtdÇð—#;Ôå›þÙyâ¯æÞ]·Ì½š AS¡~\Ïú„åð±°,lÚû®°‰ÞÝðÖ»ßÞÒù·µèüC÷N}:t/·úd»¿rÛ¿kMàw?xÀkJÞ¦@MøgÞýhù•çµ.ŸmÈ^2®DÊ©çP¯sž¿0椩¿ò¯¶2ß^oÓ¹SÞ&ê-ÔèóžíÔŒC÷j‡îѧ£Ëð®Ë€Cs&h‚Ìš¾êß×ôÑ© ïÚlç]tÊR¨w¡=«žt–RgÓr-¯4ýžïöö{(!yå-`éÓa½±û¿¬7–¿ö—Gr°Ñ¤(­×øÁÎKƔ㭡Óð%ýúFÇÿê+Øñ¦ô^ù(†;5b˜rè䎽ê×Úûª+í}2Xy£åµ¶Öû7³žœKû´}hjv4yš4Ô”örÛpK m˜Æó¯¼¯î3êÇÌZ¾HËevÐ ¡_­ö·Õì}×V³zx%¿ö)<³{çE³Ûð–ákÃ[úkÛ[ô×JmÆ3¥6Wq·N™ë'·ò…úþ*,]`[‹.@w ±íß÷[Û~}@_¯Ðcþåcâ£`L¤þòÝ>òõŸí-ïO{óòÌÏèr)M&šÉ0–lËãüç‡êóÃlû@þ6Ð't·¯süG¯“– i^]ÁÖŸÞ ¶š{wý‡¹÷Ù´ Ú­Ÿî&YúÁ΋¥„ŸÜþ,üdõÀ}¶åÐ ñÜ)‘ò’(›I–“¥åS^$ãŒ%¤d<ñl>¯¥Ÿzž¯ˆ5r:bZ£ÃQ+­“–ÓÜ@EhnÈÍ1”˜|Ô™Ù€ÐlË ÿÀËàWh€•4x Ñ ”¡÷…˜ðæ@Ð MR@Ð MR@Ð MR@Ð MR@Ð MR@Ð MR@Ð MR@Ð MR@Ð …"4¼ 6lذaÆÌË/,,,,, Ý`í Ó MR(XÐ$ØúÓ{ÁVeE2ö¢7ìe«ÏË&ŸöAÛÀ›™&yiÔ×w7êK4†Î¦BcÐTh»¶Øµ]´<ÞŸŠwä³~yòqPž¬ 9×…4o›”õ‹áö¨V—T2¨&êǶ¡£¡¶¡ü·×Û|á‚·Ù¶ßomûi ÕÇÜýØD^'˜6/¼ks5ïšÐ]<:¡3V½6VQ˜£Á~ødƒ½Æj?Vcì’’“]¹­ßy°%à<•£ÃQ96¹‹ñ©¸huí>euæ QÃ\ƒþ“½úU‰ÉGÓ‰IÆŠ´…ÛR ÕÍ~t´nÖ=×[îžs²&æd‘òÈp¤Ü_|5á/F€×Éšdštþbì2èúz}€ò#êB­ É“rXžT—ŒZîöF-Z¡¨B«íÒîÑvQfD…ö[*´áÄÏŸ…+×ßÓð­¥§AY¿Æ ©Ð¶·èC‘ÓíC‘•åûGN:úG('‚½ÍãW¼Íùo©»á¸ÑÝ`¬zï¢±Š–pM\…ÓÑäq:¤øÕ·¥x®ëNÆ)ýá/#¥®âNÎULkÖ¶µèÍŽ#—›ýžSMýžõÙ_ëÝÞˆU–äyY2»w^4»•í-â¹ A[¹EÐ6Lðb­IÐdÆúhÆ~þ*ü$R~§7R–o ËmÃGgÛ†Õ%R2ž\ÅÝ:Wq¬#6눵ǤX»Î¯ûX篨ýSÍ€º<YÚ†[®µ {›.œ÷6%&áÄdèRðw¡Kf·éªòc^²3b÷½±ŽfÇ'ÍŽ•5),)>•”â–é÷oZ¦s[C81,œ  ÅbkôÛ+kúéY“»ìªÉòÝÚò­|­>°½U  ”þx\®Êv¸wN8ʬŠ·Ei¹<™Œ§_3À«kM‚&Jfgà*ø.~ßÕ6x4Ô68Rzîû‘RuIƒ¦¸Ó ±ËïZ‚´„^åtp:‚m7vÛ–¯»ˆWg|·Ìø(Àwm¶ó]¦ž²«¦ž•õiv|êivÐÿUö߯²‡åŸ„嵨v)vå¾s7ž°¹‡îþrè^n뉋oÄÅg[­e,ØvóC¥5´®·Ë´. ©,¶$÷ÎwnæRèàÌ¥ˆ%2±„.Ýܺ–ÃÇÂrÃÖÃ'¶æ³¿èYÙÔSÙt[p÷´R“n­ í¦€…´ð¡€×CFA“•‹®^Þ Ùö¹A³l ·ýsŒ/cÌ7vñºo̴ܵ•á9o›4¦½ï ›KÆ—¯YÐÕëcMçÏ5yJ8î)ÕvëëµÝ¥UÆJ«|c—oûÆVÖ‡ô?'ñœ <“zâÒl·WÙ–Ë·}c5Ž?Õ øF/þÍ7j¬Úñƒ2l'[¼kcï¢ÿµ.~Ö5—¸ýÙÜâ`¥˜øèFLä®XÙÚFõ;Ò@Wñ±„«Øë¿âuæ¿¿h Òнï?U‚Aþ²«¿ñ—Q.}àÀíøPÀë!£  Q?®^>œ¸ûíò¹HÂòoÃ2 î %QKt8j©ÚoÿCÕþ¶Á–@Û ŸIL> &&'FÿåúĨòê_†6ìýÕ•öþɘ”œŒ%&cRb²nÆñIÝLݬãpÝlþ’íöÒ=eêf?úsݬôðòJÕ¹3¹¡ ‹¬†CKŒ¶÷.mùoo&û+Êîé˜ûJî˜ ˜¯m˜ñ¡€×Ú ÏçÉâ´—wo±k»ÃòÝoÃòXÓ…ócëÚþkgÃÂÂÂÂÂMäéuŽÿèuÒ4 ¤lýé½`«¹wט{ž>\XÈÿfÃ6lذaCæåÑKÞLã¹S£#T{Ø¢1²Ä˜,-Ÿ5WîØûlɳ”õø‰ˆ5r:bZ£ÃQ+­“–[oì¶þêMhP(,‚¤„-ò —¼œ4HA€ŠÐð2À%ð²A¦ @ 𤀠 @ 𤀠 @ 𤀠 @ 𤀠 @ 𤀠 @ 𤀠 @ 𤀠 @ 𤀠 @ EhxÉR2.K©ž)âÓE¼Fx¶¨XùG³øÇc_„E|éÖ  ¼b<Æs§<ƬÈʆ™5Ý“šÀ+Æfßû®ÍÎX2Ƙ,Ñ_2¾ô|2ÎXBJÆÏòP’1å¿åù)É8cÁ¶›û‚m+ßs𤀠 @ š¤€9Mà•§¿¦oÐ_[¶è­Å¿_˜¹:8s)“u"Ó^y‘òÈP¤|õ2sOn;çžd¾NMà5‘.t’m¸„ h¯•Hù%t2÷$üUöá‚  ¼†ò —MR@Ð MR@Ð …"4¼Z|ÞË·}ÞU ldŒ™ÙFf~¶d[öï²,h²°°°°°€¦€—“#T{ØZŸ÷Ú€@ €Z°õÆî`kQÔŽZÐ?]@W¯   õÑ&bžŽXÑ&ð2Û) EÊÑ — «“âSI).ð{Š­/¿´ÁúÍí~óúWÈ:m¹cΤ$ýÃ.\ê½—@¶=¡xU¤šP¸ÄÞ_]iï_ÿ yŒçNyŒ«ÿ Â® ío‚eAu¸$ÞŸŠw¬…Ô×¢6ãF›Þ¯ûXï§gÕ?×1'‹bdFfd’oêäs°Zæ@“Àk¨¨°«ã»ÎÒv3Æ‹wTWÆÚóY[LŒMÅD½MwFoîzL·EOó.­kcW‘äyy’±dœ«%9Lÿ3&K‰°,1–Œs‚,Éóô?c1QV/«–Ï'¤¸Ž‹âÜÑhÈÍ*A“dìy/æ».\ÐvÓÿñŽ–B$ɸ²¾küÇ¥2Õ¿Ï/Œ¯ —X‚ï|ÇXhböW±>Æ;´®"ž+â㾞¨<ç¦åŒ1Æ œïbŒÉ“Ì^´‹ïb¬ˆ—'õ~]½Nãr}Í…]ÌÁ˜€v€|ä˜i¢„K>=gà»¶-,ó]ãZZ¢ó3Ƙ㻾oÒšÛu“1ÆÊ®šÜ|×÷MÚ¶:‰Xå°Óº6Wó]…ÍqˆZÃÇâb³ãðºÕó(-ÏWá7w[Í.Ãc’ùêÛ’G–e)á|úSb±…ãâã`\¤6OHo$$Y’Ãòl\||#¾_çß\­ó1OýHu˜n»¾sº­m¸=Ú6¬ìw9,Kö¾ì}mƒ-¶A*ixËðµá­ð“ðWá'ùo{&kÓ_ÛÞª¿f³Wn¶Ù‡î 9toùÞýÎðVøÉíÏ QŸ†­õß4l ùB‡B>Nà œÀ Mœà®?¾Ã]_j3ž)Ež¼¡ÒMd‰þR‹Zˆ”ë'kõ×ûônƒŽ±rf´1Ƙi‡òúOÂgcÌofìd­§”^¥<ûbP¸dMrü_saëc»ââÊ÷n»¹oº­§±[ßÓ(Kɸ,Q&ŽÀï}Wà›‡š§±Þ°ÜµÞð—¶ùËòßÞ®­p’q®‚þÓEZNÐóÅZWƒPÌ„~ö}S?Ó¿æ5BB’ƒ ‰ãê“¡ˆ×²È˜,rB¯°¸fƘQÊ´΃G.;ö¨í;kv›®šÝ¬Œmceᾟw…ûÇN0îEµm×t[p÷tÛô½àîé{‹5\u3µŸÔÍe•›…2ö=eýsWCþ9çÁ¦ ó Ä¦Ø û°¼`« ω?ïÅQKuåRèd×M6ÌØû·¦yÆãÆ®m«ÚÏØÍ—ïP°àEzQ9â|{Tœï™;Î÷Ì›ŒçM´<,‡-aùMëv‹y=5Œq IÇEfOi¹°ü`<,SÈ &&æc"c,¼<„—’ñ„Ä$Ƙô,ügLÞ‘Œ±æÌëãS1Qï×_Ñûc+Ë Ü;' \úþó8˜jjÿT3Ðìhò4;ªì{ß©²×Í:×͆å;ß*õÏ?_CœkˆsbôØÿ£>v‘ùÒ–¤ì•º™C_ÔÍÐtήâc²«Ø:½ûÑónà-ð•›—ßÉäÞuÓäŽôF¯FzÙ%vˆ]ÂÞL¿ÊçźÀøý5Æ>=× cìý[îzÆ‹‰Œ1–+¿Ûw–±O3êÙO^´9þâN½¿AWûIƒNYþk^#P&å8<+Ïkže¨r*{^ö …c(È¢^nà é¢Ó«¶~Üݰ•îDË›~z®ù`Í@ueÍ@ÍÀ?Ö P™°|ûÈ«‚Q‡ä’qƤø•R|¤t¸}¤”B!1 „E~ù*ey"ÌcòhÐ ›ö ›¶>Ù°u¤ôÜ÷#¥éÂ…d¡pIÛà_Û …KèYw}¯Å]ï/»ú™ôpê©ôÂ%mÃGgÛ†sk£š¾jú¨Pû¤ï'ɸ,™Ü¦«&·ôðÊ}éa&á’tú=µý¯Ü‚[JÀ›-Ç ÉR¸„æ4Š2ö}ý8¬›eŒ1W c'kûé=O)cŸž3¹u‹?é¯½Ø Væ.aŒ±Å–Œ3–£§•„ô4ž”ò+r—'ãòb¦ƒ<ùüIsëfj×ÍTí·ÿ¡j?ýsz¯Œ9ÓM¸cbÃÖOÏ5lmÐÕw7èèFËô¬«¸óï\ÅcMãWƚƚ.œkçÚ£âœ8ßɉó/·SfQöHÄ–ïö†e­kKµÖµ´w”|ŸÅ ‰îŸŠ‹´$&Ê”B{$–MhÖßèåÛ¾QßýXàGJÏ)m>Ør­ùàÊò5Õ¨玆Ĺ•ÙëÞˆÕ>Pýû€õÆîÿ²Þpl:ç<òÍ ùòi+qîXBœç;5ÏÛ³5}ûvÕôåó^cÎñ+cN¯ó¯“ú‘ð&[%h²xœ”Q˾]‘rÆNÖ†eÆ‚»‹Zö¾CK¢VÆNÖÌJ™ë;cìdm°M)³Úš×Þ‹ÉqhÐhÐ5yN5Y¦ß¿i™¦Ÿ¦é~ 7nýø›Æ­4Ä:½ûñò¬¨5z:jmØúÉɆ­”oBš†åŸ_‘L“¥ü¥õ–ÄÄûã1‘‚#ëƒñˆ•FÑP)ÚØRò}“%Z_¶Ã¿ \q§£-~’âWî§Êé A+>ï•û>ïÊgi†P£ä›\¹/=Ì¿WS°Œr””\˜•m¹4#On&¼šðö47ö4R0Nëâ÷(,€7SÖ™&­ÃíÑÖáÖᣳ­ÃúÀö]]èêÛŽZ®”Zú\ lwÌPš×ƒ^»¼üúy±9zÿö½¿¦ïjú†îþrèžzКɽó_LnšŸ"Ý^ Š’orîŸÆš–z^^²ôø†* S‚ kätÄJÁ‘˜øøFLTf–YÊ ’¥dìÙ<&‹÷0ZÜ ñlêà7_}{yÛ†|¡B>­k³=U° §þøŽžú˜ø`<&ºÝêg©¶z¿þcýâð«¡èLJ¢…Ú#”o²ò}óGáÊQ¢°‘Þ¯{¶o²´AŠ¢~¤`LjñÌñ#Ý•î<2bþrÄHC(8NTnž{’Iy*£~—õØè‘ãà7¶-ÿ‰>ã»}dƧ÷o®NõUœ;&‹sqñÁx\¤9&ÔÏRàFýãv¤ôü…T9¯Nˆ‹Ñᥠwåù¥ …Hh«)DB=Ë2†bŒ)y™†N†¢§Û‡¢tw!aÓž_ ›([§ïloyßÙt¯ê?{boÿÙ`Û­ƒm}žGßâ~qK¸Šmû«ÿ`Û/lªÜ"l¢'pÅKý-wt÷³{×M³[¹ öóÙöïû­mÿêe·6kÜJíV7{èÏu³Ô¶ý{ß}Þk^oE¹½Œ«à ÊtªÄäÞyÌä›׌Íç_~í<Ëq¨ä*Ô9žE9(‹êí)rÄdœ-þ¼×°·™f)ÇA“þ}i0N|üXLÁn¶ˆçf]Å‘ô3G¸Š»u®âfñ³šÅ!÷Ó»A÷ÑÑÍÇÑà©ÿ¦Á£åkg­˸ÕS¨Ÿèk-¡Ê‰‹oÄŘOÞóÊVy^¶*wÆ¡2ꌒ§qÆs|¤dŒIêðÁâ^(Ym/¨Q •1ÆoµË»Ïs³ûlÙÍ}ÃOÂ_…Ÿ<ûÈðŒì8ó#;˜ƒyØâ¢iÒÖv€Õ°ÅõÆØ®g­ªcŒé‡·ècº„”ì^ÊE’ÃŒ1cÌ¡ø°¸¾y|¨ 0V š,ÍÓ±x«Ýc,Báõ=eÔŒ¶wOm¡È¨ê$Çá:‰m-âÙVJÆYHs°ˆ×T†áñŒ1g2Μ‹ëŸKÆØc¬x-7øeÈq€/|,&ÆçâS<3Š;ÃÆ*fcÌX•b^+zÖÂnúñ™wŸõRŽÝd!¿ù狌Å>Ø+K¬žqØŸŒ2M#gŽF¢–ùcQKBb,±x™•ÿk…&­Ð1×É:æ4Ó©Êè4BbޱDÚåŒ%ë±ÉÈqxñlö=EaÄwîTHd^y>«»Þ˜Ó,÷1ÆXƒpà'0Æ.2Üùò’QÐ$41{(4Œ_ߌ33[úÙZÐÿ-Ó–˜ez­7xÍsÑ©ž¯Ôf<ÃX)3Vü¦¶6„K 0ÒM–ß*u) à:ê­EU(4£alMG¹X§MWãb¿ïû#AÆj‰G-kQ-ã÷h™ŸJJq_W¯ók]Ú=Zcìcì(X_)2M~O‘ÀSðbý+¤—èýºõ~ì$Xi‡çmÆŒ¶˜›Š‰ëY!„Kàe6hBa ½MwF¿ÞS›>w0Ž. «×tLW¯Ã|aL=eÌÔƒv€×Õ†Hyd(RކPûš`¥ÿH¯°:QyIEND®B`‚xymon-4.3.28/docs/upgrade-to-430.txt0000664000076400007640000001512511535424634017271 0ustar rpmbuildrpmbuildUpgrading from Hobbit 4.0 / 4.2 / 4.3.0 beta 1 / 4.3.0 beta 2 ============================================================= Xymon was renamed from "Hobbit" to "Xymon" during the 4.3.0 development cycle. That meant there were quite a few names being used for Xymon for historical reasons: - "Big Brother" or "BB" (really the original software from Quest) - "bbgen" (the precursor to Xymon, which used the Big Brother server) - "Hobbit" and finally "Xymon". This was evident in the names of configuration files, programs, tools, commands, webpages, status columns etc. etc. The forced change of name from Hobbit to Xymon was seen as a good time to clean up this spaghetti of various names. So with the 4.3.0-beta3 release, all references to the old names have been eliminated from Xymon. However, that means upgrading involves a bit of renaming stuff. A script has been provided to help with this task. For it to work, it is essential that you perform the upgrade like this: 1) Make sure you have a backup. It is not necessary to backup the data in the hist/, histlogs/, hostdata/ and rrd/ directories (if you use the default directory layout, then that means the entire data/ directory need not be backed up). 2) Configure Xymon 4.3.0 using a directory layout that is identical to your previous version. Make sure you keep the directory names exactly as they were in the version you are currently running, even though that may include "hobbit" in the directory name. 3) Build Xymon 4.3.0 (run "make") 4) Stop Hobbit (the current version). 5) Using the "bbcmd" utility from your current version, run then "./build/upgrade430.sh" script. I.e. run a command like ~hobbit/server/bin/bbcmd ./build/upgrade430.sh This will perform almost all of the file renaming and configuration file updates that are needed when going to version 4.3. A few updates cannot be done automatically, you will be notified what else is needed after the script completes. 6) Install Xymon 4.3.0 (run "make install"). Your installation should now be upgraded to version 4.3.0. Run your normal startup-script to launch Xymon, or the ~hobbit/server/xymon.sh start command. If you don't feel comfortable doing the upgrade using the script, the rest of this document describes what must be done. It assumes that you perform a clean installation of Xymon 4.3.0, and then move your old configuration and data over manually. The ~xymon/server/etc/ directory ================================ Copy over the existing configuration files, then rename them as follows: Old name New name -------- -------- mv bb-hosts hosts.cfg mv bbcombotest.cfg combo.cfg mv hobbit-alerts.cfg alerts.cfg mv hobbit-nkview.cfg critical.cfg mv hobbit-rrddefinitions.cfg rrddefinitions.cfg mv hobbitgraph.cfg graphs.cfg mv hobbit-holidays.cfg holidays.cfg mv hobbit-clients.cfg analysis.cfg mv hobbit-snmpmibs.cfg snmpmibs.cfg mv bb-services protocols.cfg Four files will require special attention: "hobbitcgi.cfg" is renamed to "cgioptions.cfg". Three settings in that file have been changed also: CGI_HOBBITCOLUMN_OPTS is now CGI_COLUMNDOC_OPTS, CGI_HOBBITGRAPH_OPTS is now CGI_SHOWGRAPH_OPTS, and CGI_HOBBITCONFREPORT_OPTS is now CGI_CONFREPORT_OPTS. "hobbitlaunch.cfg" is renamed to "tasks.cfg". However, most of the programs have also been renamed, so it is probably easiest if you use the standard tasks.cfg file as the starting point, and the merge your local modifications into that file. If you have too many local modifications, see the "docs/Renaming-430.txt" file for a list of all the new program names. "hobbitserver.cfg" is renamed to "xymonserver.cfg". However most of the settings inside that file have also been renamed. As with hobbitlaunch.cfg, I would recommend that you start with the default xymonserver.cfg file and use that as the basis for merging in your local modifications. If that is not possible, then you can use the xymond/etcfiles/xymonserver-migration.cfg file together with your current hobbitserver.cfg file. "hobbitclient.cfg" is renamed to "xymonclient.cfg". As with xymonserver.cfg, a lot of settings have been renamed, but since this file has very few it is probably easiest to setup this file from the standard file. Finally, if you use the "nobb2" tag in your hosts.cfg, then this has been deprecated. Please change it to "nonongreen". The ~xymon/server/bin/ directory ================================ Most of the programs have changed names, so if you have custom scripts that use some of the programs then these will probably break. I recommend that you setup symlinks for the following programs in ~xymon/server/bin : ln -s xymon bb ln -s xymoncmd bbcmd ln -s xymongrep bbhostgrep ln -s xymoncfg bbhostshow ln -s xymondigest bbdigest The ~xymon/server/web/ directory ================================ Some of the web template files have been renamed, and since the menu system has also been completely changed it is not possible to automatically migrate your local changes to the templates over. In the docs/Renaming-430.txt file you can see what the new templates are called. The ~xymon/data/rrd/ directory ============================== Some of the Xymon-servers' own status-messages have changed names, and therefore the RRD graphs have also been renamed. So if you would like to keep the history of your Xymon server before the upgrade, you must renamed some of the RRD files. In your ~xymon/data/rrd/XYMONSERVERNAME/ directory: mv bbgen.rrd xymongen.rrd mv bbtest.rrd xymonnet.rrd mv hobbit.rrd xymon.rrd mv hobbit2.rrd xymon2.rrd mv hobbitd.rrd xymond.rrd mv bbproxy.rrd xymonproxy.rrd If you have multiple servers running Xymon tasks, do this in each of these servers' RRD-directory. The Xymon internal statuses =========================== If you have alerts defined for the internal Xymon statuses, then you will have to change them since the names of the internal statuses have changed. So in alerts.cfg, check if you have any alerts for the "bbgen", "bbtest", "hobbitd" or "bbproxy" statuses. If you do, then change them: bbgen is now xymongen bbtest is now xymonnet bbproxy is now xymonproxy hobbitd is now xymond The Xymon webpages ================== The three top-level Xymon webpages have also been renamed, so if you use links directly to the "bb.html", "bb2.html" or "bbnk.html" webpage, then these will have to be changed: bb.html is now xymon.html bb2.html is now nongreen.html bbnk.html is now critical.html xymon-4.3.28/docs/editor-makeclone.jpg0000664000076400007640000002304511070452713020072 0ustar rpmbuildrpmbuildÿØÿàJFIFHHÿÛC  !"$"$ÿÛCÿÀº†"ÿÄ ÿÄT  !1"2QUV”¥Óã37A³#5t´$6BRau²%4Crs„±SWbcqv‘•–£¤ÑÔÒÿÄÿÄ1!ÿÚ ?ÁHPi¥Q’öóÆÄX̪D—I9#"äW+™©IIÈ®¢¹‘sÈÊtL¨²›ÿ-S$·ÅÇuç‘!·œJLÒƒJ[I£#+^ê"¿>\ǯGgkNø!‰Ž?U€N©•,œQ¼Rdɤ¹Ñ'™•ísïD Z¶«R┩L°¦3&ÔäyM>”,ÈÌ’³mJÁ\’¬|Ì=ïè}JËŠmpã›dêLæ·h%’šI,ÍÔâwº2.ÿÄŒ:‚¶FD©UÒêá4ÖÓ6'~Cl4ƒ;Øn))#;Š÷;ú7§k «;Kè˜IiŽn:„6„XŒ–n(Ƀ¹YW±Ü¬|È6 úå£E”Üz”rin´O4iq.!Ä™’´™¥I¹\ŒË‘Õ‰Q«%ÕÃi¢i›?!¶AìF·”Üìv+Üìa³Ñͦtœ©Ú©tZ™&nj짉rZhÔ„4n!k¥eÅ6¸qͲu ¦s [È4ÉM$–fêq;ÝâF#(ÔJ•].®Mm3bqçä6ÃH3½ˆÖâ’’3±Ø¯s±†ÁÓS.›5pç0¦_EŒÒfGr2¹r22222ädw!<ΓzNŒƒ]&]~T–ÜCõ8ÌÙ ¥“M’µ’²º×rævÀìD¢5-V[dh÷æShShŒ&¡q™9”fú_u¥%£V_m*À²QdDf|ŒCÁ¥ÉT ÛÎ@K‡¤ÙÈKnEQ¼„ç¶g’ùÝDFI5‘¹PE›oJWœ¦*¢Ü$)”Ç9*AHox™"¾æÖ[˜[žXÚÜïaØL–•%·`–FâY!JMù‘(ÈȎߎÞc ÑólÕº&§I¬V›ˆÆä*|—’’\–ŽFÂiKŠhŒ—c+X‘s¿pˆ¤iÚµR)ÊŠË c3m.H”Ó ZȈÍ(7œÕ̹&ç̼áÔÍ@%`éÚÄÉr¢¢*Yr"°’ržDt´«™T§”’ŒÈìW¹ØüÂJ¤fÊÕ(54)1 É¤;%¦|dGSøËá 4 h8ƒY‘J\—#¾œv”K$§ÉqG—Š£îG+”W_Ó…òªšShKfl",Æ¥8úÿ¢œ[Qš ÎkµŠüŒìG`eø´åèç¥N„Mª‰*#Ž3%*+9+-(3R %!µØÈ¼»Òd[eG=2Ÿiù#ÇXú12 Ê]IÇÿHÛIm©%’”µ¥ "É¢.õy–oªÅ "hv²ÔÊ…:Cµ[b;1&7 üWáºx’H‰›*Êñû»ÄâI ñJ¸íJ˜qã·J7_ME…2ÚYe¤ºFá,ÒFFÛ…kÜùX"½ó³Äù)ßù”OþÇâŸÀHêxú~eBT)oÄvbRrÙtÍ–Üi Qm¥V27‘bQ¦üì|ŽÓq§žŒzqÍ<í?ON¤ëÊMB ¦[ZT„"íºÛͶ«jïQÜ–FŸÄ{Ó1‡kˇ^™d™¢UD3s¡IVù8qÍç3¹_"s2+¶I.VQç¢Ã®Ê'Af¨³pÒ—cµ3¤³ÃZÌÛiË™9’ù‘)jæ}ãëLi Õ<ÈQ¦Åžì“D©(Ž—ãm¤Œ–³$ÝÙò3#ý'+óσB¤ª3Ú‚=ª•9J§éɰޒìÆÙiÇ\jI%)[ŠI*Ê} òþ©Ÿ’W,®<—c¸m©m,Уmĸ“2;”“4¨¿´ŒÈÿó“¿SÓ ªäJ¬Z¥#itú|fÛr{iuN¦;,­&ƒ; ’¤¨ÍKÅ6+ߺòî’%qƒT¼š•0ØÝUM>º‹ eļéd’á¯37+ܹ܋¶rr.´›GÓ:NG†!@[Z÷”ò_m×b%E’ò™%gb6\>d^IY7kDBj‚²½*,çg%FÅ"¡¿J ý2›%¨›RLÈ’W.N+Å+ P"ËÃdµ ê)Q"™S'%.I–Üt渮6‚%8¤•ÍkIZþsî#2SÛ%pÒ°g&TuHn!•Jm/)(nBV¤¶jÌÈÖù‘~'ýUZ´Ø4;ÄëëÇ…i¾ é?k¥£åѶoÿÑßmÎöæ?zUPœ£ÐܨT)+–k’Sz-B•g–¯Ñ,îýÄÙ æ³.]ã9žE›M°šŽ‘«R™<·'—)¸éShnJVd¥™™¨å{ùØyæØúMèI­ÓdS›«*ÑZY®8MÛ}$i%mšy™—?Ââ°Q3¥eÆeu&©C8ª|ÈÌšQ8‡P£"çŽm¤Ž×2#3±÷«úp¡Ã~UB³Jm lÍ„E˜Ô§_ôS‹j3AyÍv±_‘ˆì\Ð q³"”¹.G}8í(–IO’â/GÜŽV!°öTsÓ)öŸ’21Æ_‹N^ŽzTèDÚ¨’¢8ã2Pò¢¸ó’±RÒƒ5 ÒR]Œˆû˽&EQ@Óµ–¦T)Ò¨²ÛÙ‰1¹⼇ ÓÀÌ’DH4ÙVWÝÞ7~ÊŽze>ÓòC²£ž™O´üÅd‰$3Åý*ãµ*aÇŽÝ(Ý}5Ëie–’鄳In¯såb<Šþ<ôcÓŽiçiúztèµ'^Rj2ÚÒ¤!mÖÞmµXÛWzŽä²4þ#iì¨ç¦Sí?$;*9é”ûOÉ‘€ëé1ߨBÁ¤Q!%…"žn)”+5¬ÒKqk7-²½¿äDgè§Ân±¢`Aj§LˆäJœ·¤tÉhgÜj1%D“<—Í¥òA(ùws!»vTsÓ)öŸ’•ôÊ}§ä‹Ÿ©c¸å#FÇfd¬éêkOdö\T§œ"rÊýŠëff¼mÎüÒ«MV›iÝEÄÇš¨R”Ô”8¸Ê*ƒ|•5—Ó·ãøç¶…“s#,NÊ2#×{*9é”ûOÉÊŽze>ÓòDädŽªèi•2¡Iw)4ÍB$݉ÉscŠã³5¤ôF¬ è畹 ö3+‘%¨í›i[«$$Üq-¤ŒÎÅu(É)/í3"/ÄtïeG=2Ÿiù!ÙQÏL§Ú~H²b2GI¸Áª^MJ˜lHnª¦Ÿ]E„²â^aÔ²Ip׉™›•ˆî\îE‰Ú â&¿§hÍC¨S£»NeÆ$3.cqÏÆyn©ÌÈ”FK$Ù7W‰ÝÜ7~ÊŽze>ÓòC²£ž™O´ü‘9VHÌØµ)µ¦ãK¢Îg-J›½–M¥HCªZ ##2#23'OÍcð0õ5¾"ÊDzŠUÚlˆ="VhC‹€¶’Þê¬F„­DÚTv,RGÜ6®ÊŽze>ÓòC²£ž™O´üäs]fšº\”Gr\.)²Zú$„¼–ÌÌüSZn“;Šf\ËîE=R„ÝSKPå3S¦4Šu1Öd!éhK»…&C„„µ|ÔjKˆ±’q¹ó2±Ûvì¨ç¦Sí?$;*9é”ûOÉ âuõã´ßôΟµÒÑ¿òèÛ7ÎÿèïŽ6ç{s]ÙÿR6|)  xK.’zFîÕ·mká‹{Úÿ€èŽÊŽze>ÓòC²£ž™O´ü‘\¼¨{*9é”ûOÉÊŽze>ÓòF‘ËÀ:‡²£ž™O´üì¨ç¦Sí?$/êÊŽze>ÓòC²£ž™O´ü¼¨{*9é”ûOÉÊŽze>Óò@rð¡ì¨ç¦Sí?$;*9é”ûOÉËÀ:‡²£ž™O´üì¨ç¦Sí?$/êÊŽze>ÓòC²£ž™O´ü¼¨{*9é”ûOÉÊŽze>Óò@rð¡ì¨ç¦Sí?$;*9é”ûOÉËÀ:‡²£ž™O´üì¨ç¦Sí?$/êÊŽze>ÓòC²£ž™O´ü¼¨{*9é”ûOÉÊŽze>Óò@rð¡ì¨ç¦Sí?$;*9é”ûOÉËÀ:}Ee¡ QÖSb+ŸòŸ’9×XÒÛ¡êêͧTótùïÅCŠ+É·’3þÓ° Çпï ßÝù/ŒoBÿ¼7wä¾³„F®ýTÇ÷Œâšâ·Ä·e1£ä=Æ[–܈ªao6n6•”†Í&¤’’jMír%$Ì¿ï )uçõRjqSC£µ&j%I[’™lÜ#þŠIk#+wÞÝöü;üQIEô€¦Óо¨Ï¹dGoåy\ŒËÿÝž(zó@ÿÓjÿõ žÐu"¸‚zQê87#Ñß‚Ëqij‹buøë5›Ë½¶­k”|Ç8Ó‰Àtd¢ð—ù¥Äû·?ø c°µO§Ò&W߇§:‡¦pðÜÕNÚu«²‡×²ÖNàˈZ®´wز2»ô[¢EÔµšÞœœãÍĪÁvëdÈœJ! 4™‘‘*Ê;\Œ¯øêíGú]n©>SµjÄHuM¿ S£<ÙF¨`’InäƒY] J¶¤d”‘ÈßëEbf°›G¢éæ¦À¥Éf-Nk³É•¶ã¡Û4Þ ÜÅ·[Z®¤rU“‘•„cŠÑéâ>ž¨5§™DŠ“Tä3õ‰•U3uÂm·:$ÿF¥)'É̉*ÈÒV2+4Áê·5*Õbš©.4ìøq]l£Í[DIBœ% ÖGŠR“ÁHÉ)"UÈCHám1Ùêpµ¡j«MÖüÛ¬&?KL”É5ín)*q74©fEsÄ’d“ ¡é‰u¸šÒ‚t Dj¤ÇÖÈÛ“4â´Ú|<ÁšÖ²BÔEÈŠÉBŽê.⹕æ7ªu8Txô]2Óõê‚ç¥ØRª,Fè/ôy&§’ÚÍDNš›#ÆÈŒñ+Ún…¢©TzÄZ¤iVôo `—“IøBb%½{$Åq²$ó䛑ä|ljþSÊ4oVk4©ÑfÏ˜ÄøŽ4o#¦È[ïµgSjlÖ¢±)e‚÷+€ƒ­ñg¡PèsÛ¤Aˆº“²ØºÍP¡D„üWv]er ·ÖnÉb%w+nÔzơũô§©´¶ôú(TÙ¸G'ã­ó™’’”²ipÔ¶‰[¸’[JÒfkR Mݽ9‡IÔ5ê;1RêVìWšZån«'Mâyµ¥JRJ5bJ#R¬esZ.†§Pë4Ú…¡R‚ÔTzJ¡¡M­™Q£“„Â\5¡Kº Õ™“3?"äÔ??ÍÜÿPÿà?œ]V©.§=Ýés[﹉'7£RŽÄDEs3äEaæÇпï ßÝù/ŒoBÿ¼7wä¾³…o‰_Ìù´Eþ!±d¾%3ä~Ñø†Ä¾Bš/õ„ÙÏühbsEþ°‘û9ÿ_Ïà¼} þðÝýß’øÁÆñô/ûÃw÷~Kà;8Vø•üÏ‘ûD_âA[âWó>GíˆlKá!9¢ÿXHýœÿÆ'4_ë ³ŸøÐ1üþÑÇпï ßÝù/ŒoBÿ¼7wä¾³„\2¨è4’Ý— 5w\ä´\ÄøˆÕߪ˜þñƒüSAE+À‹ô„?ýÏÿ€ Ì‹NÖíéå>OÌ—J~jM¤«6ÓÌ ò5s3x¬DGäªöår©eV""º˜0–«J%²Ú¶ÒEsRn“33µ­~ó/ûÇ’Ÿ¤ 1(SŠIi)äJ]²?åyˆŠÿöçÃÀ: Zú2jý;£ulŠ–£©& ”š ÙuÃYàâl[iW?¿’€ííŸY?ø2~ðj:ð¦¯Ivk0Vµ!mÉãq•¡d´©$ã A™)$vRL¼äcˆ@O}káŸüüëÿfkÿÀ=úO[ð†ƒª>±¿Å-I\š˜Àlªq Hm·iÅ[j#g{²Žó2.|¹ŽR2.€*lá¯ÛÖ›©ÜÕþéÛ¶àÝÜ0uMù[…{ã~âß^ú=ÒÚ˜¨ª×Uq.fhÒò‹™´W%’Í&_¦G{œ;Ù§1ø±À:;ÛXkбnáŽzFRm–Õ¯u?n‹ÞØÙËÛiÌ&˜ÂnìpŽöÖâ¬[¸cž‘”›eµkÝEÛ¢÷¶6röÚs£½µ†¸«îç¤e&ÙmZ÷Qcöè½íœ½¶œÁ¦0€»£½µ†¸«îç¤e&ÙmZ÷Qcöè½íœ½¶œÀÇèïma®*Å»†9éI¶[V½ÔXýº/{cg/m§0iŒ îÇèïma®*Å»†9éI¶[V½ÔXýº/{cg/m§01À:;ÛXkбnáŽzFRm–Õ¯u?n‹ÞØÙËÛiÌc»±À:;ÛXkбnáŽzFRm–Õ¯u?n‹ÞØÙËÛiÌ pŽöÖâ¬[¸cž‘”›eµkÝEÛ¢÷¶6röÚs˜ÂnìpŽöÖâ¬[¸cž‘”›eµkÝEÛ¢÷¶6röÚs£½µ†¸«îç¤e&ÙmZ÷Qcöè½íœ½¶œÁ¦0€»£½µ†¸«îç¤e&ÙmZ÷Qcöè½íœ½¶œÀÇèïma®*Å»†9éI¶[V½ÔXýº/{cg/m§0iŒ îÇèïma®*Å»†9éI¶[V½ÔXýº/{cg/m§01À:;ÛXkбnáŽzFRm–Õ¯u?n‹ÞØÙËÛiÌcÐT¿£>¢Á½^KBKR4ãÌ+ÆBV^+Ž$û–D|¹(”“²’¢,£ŠšJ.ŠÕ‰XUY)d–·Î.ÁòRM$œ•r,{ù~<­ÌÚ*€(Ðú;ýÆiŸ÷¿â^;Cèï÷¦ÞÿŠtO׋H™ˆÞª¬OOG‰IÊyݬrB"3u_mòM¯“½ØæVÛn+Fjê’éÕo®ìC¥N¦Gn úY%Æd£¹™™¡Hyµr3ḧ®D>Õ]6Þ¡ðÍ6V @zµDÆ•å5¦ã°{ffÚ2J”„’•w®”©Ù·ç™Ã /Òð52C‹2šuN=>l”ÆA )&DiQ‘ØEý+Œ*=½l©@€ôøº 2>›©OŠ‚R†Ým.ÃÅì[ZŠéNç%Yi%Ȳçö¦j¹5n'R#¹L­Ñbx¡)lÏ$!–ü"mÛ!j+¤Â²¬´’ÎäYsúž‚ªÔê=ªõ;uhˡ̢› Sú1›R “[†­ÅÝË5c±NåbMŽñÚEë,Èœö¥j­8èÒ(‘Ûf bà‰.ÇÎB”§Uu¥-ŽÖ#±b’2²ˆ’ÒZþEYÊl(3æÂb¦¥Dm´±$‡K*qN8G‘!²5]GÌÒ“æI’¡ëš}Z¥;tÚ¤x•YSj¶‚8ГQíÙf²ºR¥iNII™\HRôûTýM2¯ÒK2)éíÆ&ìM&:ä(+ó¹Hµ¬VüïÊ©¢xYMÒµÈrà1§SemPn~*JIrQ(ÍV%w’¥[Æ3¹Ü¯­;ŠpgA£ÎoJj„F­¡'KZã3ü­fÙ¸M‘¦i%=PªeÈyøËjShI±!¤%Ãef•f¦Õ¸œMI4¤Îý×ùÊ×0Q!q`RªµI}1è¬Gˆ†²l’wœJ–´¤…(›3R“ã‘‘ò¿•zS” ¹\O‡åTÑUðšbY IBP„YÏÈÛm-šMff“UÕs¸òêRªTz D"™"E§eUzb'°ñ9‰º§R“u©HJ²J’w¿y‘¾*ß§jñ+´v*‰Ô´é©&‡Q‹­ 4- /ÁIRT“/9¤êýfº¯ utú4 Ô[ N“O«RÛo`Ò±q¥%f´ì¤š’ƒ2曑\\4…½=§bÒL$¥ŒÎÐá¢+$jZ–d†‘Éu+™þ&fffu¤hZ¡hЦ‹V¥iTWéÒ©èð}ŒÚÐhA¸½Ë;‚y"åßsæA!^×TêEJdg)µY1iØxN|vqàæD¢ÜºÉgd©*<¬Rdgaæ¬ñ2}i…Ы¯Å¡:”Tç²ËG2TËoffn”’C„g‚T¢±™•¬gùÔšmRUi˜µääj |/P÷rÍ%•í;™y´„ î•÷\¬cÕVÑÝ>‡®)žÛúÕ»úM‹ô\á5»/ÛY÷§Ê·ás|ªþ¹§Ò*#®›T•œH:œèí Ø‚JI(·2Y(ì“%ž ^)23°ú«XGVª“§âQêÓ Ö™™)„4lÆ[‰J’J#Y8eŠÒf¤¡I+ó2±Ú¿ªøYM­jyÕ´1§VåGlåR€Ô÷’¤!-’™qj,æ`Ðlnô0eu$ÜÖ-«¹|Ö$/bKbŠ—ê8ØðûøŒ^´¨ñK´–a.žÂ£¥…UU &«$œRГ%’È)‘ÌÃqîÙöÿ8a»fwÛüá]Q­Ö0ÛØ–—QIJæ¢$Jl˜³\‚¤%R¤<ƨ’‚m³3S)$)Ed›—VbNØ‹›HNã †jN/6âCD–‰LÐ÷^±Fd¤ºzÒiM$‰•— XY$h5ÿݳ;íþpÇ–^*Å^Q}øS£·&;¹–œí­$¤ªÊ±•ÈÈìdF5þ¨b|CŒ#¢MiT¨ŒaúUJLhŽò\û’uˆÖšWvÌ™$žCÚDF•Ó8–‰ñUq/nQ™Fsa&‡CÕ‘¹=)ˆ•"J–esB9R–̬w%«‚Þû¶g}¿ÎnÙöÿ8cH+Çð®"¨¼ýK"p¬Ê¤Iu ìº$´‚4Œâó´yŒÿHJ¶T‘¨óXm|?¡ ·S¬È«IZó©×Zi²EÈ‹"ÚSd‘™fÌ­§uËcvÌï·ùà Û3¾ßç X¢•AÝúWÅUN²°Ws×âÿÚ“ÞË6.X•ú$îuß-ó'ôˆáûŸta··lÎûœ0ݳ;íþpưsOo¦S•VSRV2Þ”Ý-’ùÔê²ÛswmšÜ+ßhñŪâÆé½s½‰Þy‚Å®RŠšpØ&N2ªÊ„’55™Ò“#%ˆ¸$FFw3 £J¯V*äÀ¨¾óHôe+2ÓguM8›¸–…øŽ×+•Œ]~¬¶ŽÓõ54ä— ¦·ò›«$©f”‘Ÿò¡J±wgÄF4æ*uŠf¡† ¨îŒÕR´ôg[iµ¿R3¨Ê%fâ„¥£2ºlj3ÊfDwéÑ”Š#GÚ(ŠŠÔ©UM†ßKí³ú6w¥÷I„šM’—A‘×°ÈÔe°ßݳ;íþpÃvÌï·ùãb:ô™>§3ôâ}né¥êJiöanþŒÒ’_èÔ‚eyÔ«©eîx…¼ UÅ…KÑÝf¯‰Þª–'i¶æE\6i£\d¥mšJ%]›Ôi<ÆdIØDovÌï·ùà Û3¾ßç iÍb¼iZªÐª3ãÔ‘O«›Å)©J§"4c&Ö´¦>­Ó¥¥H$).FdŒ¶­¹]Ÿ€¨Õúþ ‘U—V¦E”¤*;-4É­²Qä&ÐGsÌY³•Ë‚I-€';¶g}¿ÎnÙöÿ8bÀ×ÓdbF4¿[ë~•I¨f S5Ûº¤äLŸå ¹r0îkð¯|¶±qß`l7êËaØí?SSNIpÚa+)º²J–iIð*«q&|Dbîí™ßoó†5ª×£cILÍj$ o¹§ÇŠùÉiM–C©I8¶Ð¯tÓJ¹%'r2ÚW¼f­Ž1‰¿@“GªbI0«²2kŽ%¶–ɤÔNDCŽ“™¨’’Ý¢ý!ÝyR ßS«ÅTÒª/¶íBAÆŠœË=c„ÓŽšn\\–w;ÜfD~­Û3¾ßç j:túìÚžj¾Ô”H‰‹_a¥K\S’¶·¢ZÈÞ(ËSI]Ö¢±Z䔫)ftgˆñª~©ÔqiWU‰£L‹¹˜m1Ô˜ÊtÜF­$¢Ê´k%‹3…bN¸·lÎûœ0ݳ;íþpÅ€•ýÛ3¾ßç 7lÎûœ1`_ݳ;íþpÃvÌï·ùÃýÛ3¾ßç 7lÎûœ1`_ݳ;íþpÃvÌï·ùÃýÛ3¾ßç 7lÎûœ1`_ݳ;íþpÃvÌï·ùÃýÛ3¾ßç 7lÎûœ1`_ݳ;íþpÃvÌï·ùÃýÛ3¾ßç 7lÎûœ1`_ݳ;íþpÃvÌï·ùÃýÛ3¾ßç 7lÎûœ1`_ݳ;íþpÃvÌï·ùÃýÛ3¾ßç 7lÎûœ1`_ݳ;íþpÃvÌï·ùÃýÛ3¾ßç 7lÎûœ1`_ݳ;íþpÃvÌï·ùÃýÛ3¾ßç 7lÎûœ1`_ݳ;íþpÃvÌï·ùÃýÛ3¾ßç 7lÎûœ1`_ݳ;íþpÃvÌï·ùÃýÛ3¾ßç 7lÎûœ1`_ݳ;íþpÃvÌï·ùÃýÛ3¾ßç 7lÎûœ1`_ݳ;íþpÃvÌï·ùÃýÛ3¾ßç 7lÎûœ1`_ݳ;íþpÃvÌï·ùÃýÛ3¾ßç 7lÎûœ1`_ݳ;íþpÃvÌï·ùÃýÛ3¾ßç 7lÎûœ1`_ݳ;íþpÃvÌï·ùÃýÛ3¾ßç yåV\޲mÉÏëFiA8f¥[¸_¬ûœ£ôaÿþ½ÿhnþËËú¿ú>ï˜Cß9% k%¾ÃŽ™’P§Lïné'sé¹Rÿâ&KõŒÛÒq(Ò•¬Ì’f¦®e~+Ø¿ÜC¨+Ù5Œj5;ºÿ¢ÍÇoÕ}—¿ÿ]¶ŽXêýÏ¿?[—>ä“›/ó7{~¡1ÌuÍV§Mn©-·*´¼²RTòHÈÉG°öˆ[´f÷ÆtÈzMªS÷lƒ}Ö£¢–IÍbImTSR¬„¡jR•• #3°ÌÍÑÞŽÛ˜ûhÑÞ $¥ÅðDØDøb×cíÿG˜3û¿£=‘׆#¾‡ã®ŽË¨×dZ ´©:哎ØË‹:È”¯”¢#;˜ñD¥à(ˆœˆ”ì55)¹©i†RR¢2R\±pÈÈÎäw½ÇïcíÿG˜3û¿£ÇÚ=þ0g÷~'F e÷Ú•á8\ú}a¾Ô¯ ÂçÓëŽÇÚ=þ0g÷~'F´{ý`ÏîüNŒ&M—'T$ÆÒ]J'¾§že†éy Í$’#5E5*ÈJF³QåJHÌì2 £àw#RÛ¨3@©=Ka¶bÉ”Äcq²A§*I(â½I"îÁ{±ö£Ìý߉чcíÿG˜3û¿£ûYëRS*± T_CJe.Ëi—V–ÔFJAˆÏ)‘ˈîbŒGƒT¢Ô`1.€Ó“Ö—T˜íHiå¤Dn¶fZÎ iFÓ#±Œ¬V«±ö£Ìý߉чcíÿG˜3û¿£ŒÂ 3Eó©fPª Ôd‰";LÅQäCiBº‰(JBHŒÕînffc3Oƒ©Ñ¢Å§³A†Ä7MèÍ0–›KTƒZ¶%F•©7-¶Q—tÅžÇÚ=þ0g÷~'F´{ý`ÏîüNŒ_}©^…ϧÖ-M¨ÓŸ†ó Wˆã© }§š5´fV%¤–JMËŒ³–ͤe°c{h÷ú<ÁŸÝøv>Ñïôyƒ?»ñ:0ðÓ Ô©7¥²'<ÚZvJX¤®!74¥JÜ—2+ˆÏeÌgê4ü RˆˆuXrdd<¹ eö™q uj5­ÂI‘‘)JR”gÆffg´ÇçcíÿG˜3û¿£ÇÚ=þ0g÷~'F,ÝRÚ„T`¥ "$¥/ ˆ‹¶Ýö¥xN>ŸXÄv>Ñïôyƒ?»ñ:0ì}£ßèówât`"u¬B­Ëj]gH©Hh¬Û²àÑžZ õ¡™’7GÂD€ÝrE'Ê}Ï6¤ÌE<ŽË.D%)¶Â,©-„W¹íŽÇÚ=þ0g÷~'F´{ý`ÏîüNŒ÷±#±NE5‡éMAm’a¶É¤¶E”I-„’-–µ­°x£ÀÀñéé§1 µ ÞŒ˜èi”¶–^2S­’H¬HY‘“Ä£"½Å§ðŽXaÇÝÑö Km¤Ö£ë~!؈®êÄ'º›~cE¾k…Ñ‚[C}©^…ϧÖ-M¨ÓŸ†ó Wˆã© }§š5´fV%¤–JMËŒ³–ͤe°kMþêmùù®FýÔÛó-ó\.ŒÚ>Œð¥r'Ò1S¥¢ù‹L¢4âoÇe& ÖçÁÛù¿ºŠûeÉ»²5º2ÚÖÖ{«[e® ýÔÛó-ó\.Œ7û©·æ4[æ¸] Õs Ñ*øÑšìоK-ÈbJ‰)«S&•!+=õyЕåË}–Ím‚WŸ n]Ëž¹÷FéÕ]¼šín·Yn,úÎn<Ü.=£]o÷SoÌh·Ípº0ßî¦ß˜Ñošát`6$Åay›§uFëe,IÖ›k×4“Q¥ ¿ºIÖdG°³+”Æ=Ú.]¥±Jr“…—OŒ³qˆªŽÁ²ÒIE¬“ýdB¿ÝM¿1¢ß5Âèú›~cE¾k…Ñ€Ù,JÃÌHT†$RÚym!•8…¶J6Ðj4 ̶åI­v."Ì«q˜²ÁaF L£€É± ѪNælÈ‹#v÷ ²RV+ˆ¹¼ßî¦ß˜Ñošáta¿ÝM¿1¢ß5ÂèÀN"RðDNDJvŽš‚ÜÔ´Ã ))Q).X¸ddgr;Þã1¾Ô¯ ÂçÓ뿺›~cE¾k…цÿu6üÆ‹|× £´7Ú•á8\ú}bÓh,;!Ö%ÓZrK„ëêCˆIº²JPJQ—º<¨Jn}Ä‘q i¿ÝM¿1¢ß5Âèú›~cE¾k…Ñ€ö½€¨/U•Ww>åIjBÕ-P(¦ñ© % Í{5Ò¤¤ËnÃIq Æ|1¹w.z>çݧUvòkµºÝe¸³ë8y¸óp¸öu¿ÝM¿1¢ß5Âèú›~cE¾k…Ñ€ØfXPÒÊL¨¦–$ª[%ú+6ú”¥)Ôò,Ôµ™¨¶™¨ÏºbÕ>. §e*|jL²•0µe}H4)ÝŸË4¤ÕÆdfW°€ï÷SoÌh·Ípº0ßî¦ß˜Ñošát`'ðcàèI5X,PbÔ%ÿœJe !׶߆²Ú­¼¦/4¼0ËXitvÚ§Ûq6“l“È6ËV_Ȳ¤ì·F\F5Öÿu6üÆ‹|× £ þêmùù®F{& ‹Yvµ6b¨ñ;5¶ÙKî_2Ë„ÖcÝ m6a×M†ÒÓ,´â†Ð’²R”–Â"""".!­7û©·æ4[æ¸]o÷SoÌh·Ípº0C}©^…ϧÖ#5ZdyuÙ5hzDJrCm´¦â&šdHEò§3±Öá‘–«)GcZ­b;®ÿu6üÆ‹|× £ þêmùù®F9 DˆéõYñU&âÌ\÷–Ô$-Ùq’¼ì6×NbYžFìi$™+8Å/0™Éb†šMCüôÃR{¿¤±pÿ®â¿ÝM¿1¢ß5Âèú›~cE¾k…Ñ€ŸÓØÁÔèÑcSÙ Äb¦ìf˜KHK 4©¤lJ+Rn[l£.éŒV `ü!E§E†åê1©ìB‘Qi¦™zQ4ÚS™fFg·-ìfvå1ßî¦ß˜Ñošáta¿ÝM¿1¢ß5ÂèÀm ö¥xN>ŸXoµ+Âp¹ôúƯßî¦ß˜Ñošáta¿ÝM¿1¢ß5ÂèÀm ö¥xN>ŸXoµ+Âp¹ôúƯßî¦ß˜Ñošáta¿ÝM¿1¢ß5ÂèÀm ö¥xN>ŸXoµ+Âp¹ôúƯßî¦ß˜Ñošáta¿ÝM¿1¢ß5ÂèÀm ö¥xN>ŸXoµ+Âp¹ôúƯßî¦ß˜Ñošáta¿ÝM¿1¢ß5ÂèÀm ö¥xN>ŸXoµ+Âp¹ôúƯßî¦ß˜Ñošáta¿ÝM¿1¢ß5ÂèÀm ö¥xN>ŸXoµ+Âp¹ôúƯßî¦ß˜Ñošáta¿ÝM¿1¢ß5ÂèÀm ö¥xN>ŸXoµ+Âp¹ôúƯßî¦ß˜Ñošáta¿ÝM¿1¢ß5ÂèÀm ö¥xN>ŸXoµ+Âp¹ôúƯßî¦ß˜Ñošáta¿ÝM¿1¢ß5ÂèÀm ö¥xN>ŸXoµ+Âp¹ôúƯßî¦ß˜Ñošáta¿ÝM¿1¢ß5ÂèÀm ö¥xN>ŸXoµ+Âp¹ôúƯßî¦ß˜Ñošáta¿ÝM¿1¢ß5ÂèÀm ö¥xN>ŸXoµ+Âp¹ôúƯßî¦ß˜Ñošáta¿ÝM¿1¢ß5ÂèÀm ö¥xN>ŸXoµ+Âp¹ôúƯßî¦ß˜Ñošáta¿ÝM¿1¢ß5ÂèÀm ö¥xN>ŸXoµ+Âp¹ôúƯßî¦ß˜Ñošáta¿ÝM¿1¢ß5ÂèÀm ö¥xN>ŸXoµ+Âp¹ôúƯßî¦ß˜Ñošáta¿ÝM¿1¢ß5ÂèÀm ö¥xN>ŸXoµ+Âp¹ôúƯßî¦ß˜Ñošáta¿ÝM¿1¢ß5ÂèÀm ö¥xN>ŸXoµ+Âp¹ôúƯßî¦ß˜Ñošáta¿ÝM¿1¢ß5ÂèÀm ö¥xN>ŸXoµ+Âp¹ôúƯßî¦ß˜Ñošátc1„ãh;ULÃXGUiˆiO-¨´hk46›­Vo‚’3"¹Ø®d\f@'íJðœ.}>°ßjW„áséõŒc<ýà_3Áö†·‚´cEˆÜª–À¬4ì–b¶eC†³S¯8–›I[3;­i.+Ó;“=¾Ô¯ ÂçÓë ö¥xN>ŸXÄv>Ñïôyƒ?»ñ:0ì}£ßèówât`2ûíJðœ.}>°ßjW„áséõŒGcíÿG˜3û¿£ÇÚ=þ0g÷~'F/¾Ô¯ ÂçÓë ö¥xN>ŸXÄv>Ñïôyƒ?»ñ:0ì}£ßèówât`2ûíJðœ.}>°ßjW„áséõŒGcíÿG˜3û¿£ÇÚ=þ0g÷~'F/¾Ô¯ ÂçÓë ö¥xN>ŸX¿€ôrÃ>î°b[m&µ[ñÄEsÿV!;ýÔÛó-ó\.ŒÐßjW„áséõ†ûR¼' ŸO¬jýþêmùù®FýÔÛó-ó\.ŒÐßjW„áséõ†ûR¼' ŸO¬jýþêmùù®FýÔÛó-ó\.ŒÐßjW„áséõ†ûR¼' ŸO¬jýþêmùù®FýÔÛó-ó\.ŒÐßjW„áséõ†ûR¼' ŸO¬jýþêmùù®FýÔÛó-ó\.ŒÐßjW„áséõ†ûR¼' ŸO¬jýþêmùù®FýÔÛó-ó\.ŒÐßjW„áséõ†ûR¼' ŸO¬jýþêmùù®FýÔÛó-ó\.ŒÐßjW„áséõ†ûR¼' ŸO¬jýþêmùù®FýÔÛó-ó\.ŒÐßjW„áséõ†ûR¼' ŸO¬jýþêmùù®FýÔÛó-ó\.ŒÐßjW„áséõ<©T) '¨BÖ$Œ’²’RoÝ-¼eÜäߺ›~cE¾k…цÿu6üÆ‹|× £°  2ÖTá>ãFf•©ô•¯Ü"¿w鹎\êù‘Mc 9öžAG’F¦ÖJ"<ÍìØ7 ý×j¬R¨´}Ôg¿}TxÔhn8»$Ô£$“w±$ŒÌû„Fg°†„êè¢P¨u\*Å Ñhí¸Ä•¸Tês1µ‡™²,Ú´–kw/{\íÆbcš£QøBOþ*¿êb-W«T%˜xu)VçiÛI4g'JNÍ4’÷g˜¬jâ."Ìw"’W£¢S“â¸jJ7Q¤ìdGr;pƻĵ ¸v™©4FË ™G}”’y)NÄXŠÍ¯g¬|iý'~õ›y·ÞÙèÊô¶¦öžÖê#»Û=?:¥ñëqôXï¢\wä«#dô7›J–I5IJIì•pdÄ“@­n9æYDv¤”…žê5‰·DE‘?9~>àMŽÜ¸oEuN¥·›Sj6SK"2±šVƒ%$öìRLŒ¸ÈÈÇ£IrõÊ3zœN^ ë÷mÍWéÛ9åû.‹2䳃}õPJJv$Ôfj2"""Úw3"à×pu:\y8§âId)ÍÓWœ·ÔÛdg«m)34¦É>ˆˆÖ«™Ø²¥9êôWæSÌlšÒq·KQ‘G«\ˆíîy­íy&Ôe.S[+Kimjp¤G[iZ®‚Js(ŠÆdjÚWâÚC!OšÌÖÔmæCžWZYYm«ËÿŸñ†N)T§˜f[IlÞJ½[¦á¨Òi#+e#¿¸†{Á•ºJ£/ôJÕ›hh¬fI½øGÝ?Ø]ÎéœÎx‰ñ“2±”ó쓉¶±— I÷ Œ¸ÿ£¹ 8 ¦Ó›ŠäÉ3]-®<û†¥-]Û\ÎÅÈEûNæuµÚ”j=]RY™1•:»q™që>!®©Ø²¥Yu§Ú¯ÉŠO9«m ÃJc)Ï›JÝdóö{²ÍÜ"â)n•AƒéIT³D•(š24%—\"=bT’,ÈIÞÝÁ«F•gÓ"«„%töTóq•ë)f¦Ò–>åö_fÝŸKè-£ú•QLÏ·§.è˜ÆsûÇsç}+ªŸÖ‹QrhÄ}3ûÏ?ð”a*nF%©BªÌ‹!¤BŽû aƒl‘™o!W¹™Üõdg´È¸‹”åb¢È+M9ê´–²É”¬„¢yÇ32•KÌÌËjŒeó^Ä&c#Ò[8š¢Üb#ìöDDòýÚÚ¹ÃÓú“™žüüç,,©“¦IqŠi:DÉ,Õ«JMkÊvQÙD{öq\Ï‹g™º•B¦EC\¸Ï¤ÔbPFi.5')!–ÒÚ_®†*UqOÉaçÒÝu”4«g5,Í'“±ÛipÈöùq îIeäFy©‹eM8…УµˆÑ}¤[nÕÆg·É‡­/##"2ÚGÄ<•iíÓã%Å!N8ã‰i–“°Üq^å7=…ôŸô°F–P“Ød’#ÿpÇâxŒÍ£9Lc•Üio4\kB\J”E´¶ØŒsª*ª1LâSß,v¡Rƒ œße”çn–›JZ&«í3ÌŒÙr¹šŠÿ¨ÎÅ’ÂÕÕ£9sib©Å%¤‘’TGî\EöäUŽÜ†F\d1õSAÑÅWQe·:fµ¦¢¿6ï’7I¢Ê;ì%/añî\cÕ‡&GªÍ§TÍØ’'.ƒv8Á&ÉyW7³ÜÈ®ŸÔ\ƒÍ¡Ñ^ÓYŸ×¹5מùö|¡{·©¹WôSˆÿ,µ{à9ÿùg=ü)‹â`ž¦\ZÆê|ðý.<8„é!R\vÉ)¾Ó$¤³-fD£KhqYU–Ã!^øþYÏDƽÆ^µ‰:‘0øy—åThÔšeEo3’Q¸M—‹d¡õ¸DD£Q¶I"3Q =ë¿E7gÌÆg¤g¾^kõWMº¦ˆÌâqók ÇTF8UIUXÀîÛˆ2„ÅÄõ¸’”)+m¬’«©/Ÿ Ф‘'¤zŸ4£J9sj'úÈ‹*nM’ÊéZGÜ©ý ÒhèªÍ1M]ØÆ;ãé]_Ïùïbz+S¨¹v¨®fc÷öˆouÝÑŽ*˜gråÜØs·F²úÍÐì¤dËm™w5ïs¾~"¶ßc5HW%Q4ø‘™”ûYÀiå:–Õ{Xî¦+ܲíµÊð:Æ¢b/Weâ|:ÝNaÚcW)“S:ÍÑP72_ƒ¬I)³¹pK+fÛÑ–§9‰èÓñ® 9UjΤGvlÚžVëC‘56ÌšZš[M¨4ç"$m¶Qðmöé¡U W(p+t·÷D „fåEw"“¬iÄ’«(ˆÊé2;òhæÈôl;LÑNŠ(³°LÖ‘ºÃ5úkTGYvL¶èò‰÷ ¼„rŠé#RÒK'“"5m!°pe6|!QDŒ/WNwD~…JLgz+DôM[š“4©¦‘).>i2,­‘Ý6à€œU1U™¾û¶~¯yã·"u™ZµHs6Or“Ì£È|Ý\[8E|ÐÒÑ¿íýÉü®»ñ’æ/ÿ!O÷³ÿa{Ÿý£õ˜óo+½w_­š·^ývnüÜNj·¯ug˺­“W¸ÿC©Í|ûr(ò`<ä˜1ä=ènºÒV¸ï ÆLÊæ…¤š‹ˆò©ErØf[FÃc¦é±r"PdMTšŒ×¦TfО&"—“)ùµRX5P†lf”©v4µ¡¼ËÕ ;?á•©úVÃlÅ9ñÑå´rÔá,¬—Û=_ýôf.,ÛCsÀyÉ0cÈz#ÐÝu¤­qÞ4Œ™•Í 4)I5åRŠå°Ì¶Œf2®õ»Hb¡¹wV¶¥MfKn™lÇÏ{¹Öæ·w-®W¹h9Øn\l€å?†'UkQ0u:#t™øyùMèo„†ßlÒtù;)ÕØˆ‰$íµ4ÆÃ˜††öE«!R Èyæ™Q4ã+ª7­$-'|Í¡•-v¶D© ¾Ý°@i¬E‚`ÓÞÆô:Eu'J¥R$¡šE8ÖÒ䔩Zü¬¦ÄåÛn9:ÚxJAÚÆj+áa@ÄtÜ#µ…°’!T!U¤À„ˆTw©í¿Td6R7†kŽ„È&´‹+ ]‹5Àoð÷7â •2U¹O«Nn…2‹B‡%H^²dB«0óÒIiÚe¹Ó:ËÜ©—Lσ²yD¥ÄÀX¯È¡á‰LP ÁžÔ T. ‰I\írXl¬•<¤"9JÆfmßÝ€—ãºïZø½‰·.ëÞŠl‰ÛŸY“[ªiKɚǖùm{¯Äa‡«»ïWÄtýË©ÞJ’ çÖf×f‰F{X²ÿœe¶ßq{í±i];PYŸH­Õ°mn¿[O4áyP©®ÉÔµ¹“i Œ™2|žR’f“q+""]òŒ¬Úa:VÄUjå"¡UÁÎbP޵Yýæ)²#9,¥hR,W&ÖƒU”i3l6Ec@ƒ‹ée„n©³g&,’#RJ*W\„.ùl³=Ȥå##"Q(û„©0Ò‡™Ærh•™ôÇ*4êÆ:—2Jr)M”6)Ó"0n[a4½SGcà¨Þ±ß5ö§†N™¯HNšæ …ŒÚyêLHk[nÓ•LdÔM0’ý#%1yÔÚÈò8V;Ú¸†»½|9Oܺíû©.}f]NX’$gµ7ù¾[l÷w¾Ë×w¢¯‡)û—]¿u%ÁϬ˩ËDŒö±æÿ7Ëmžî÷ÙcÒµZ K¢Ñ ü[£®\ZB)ΩÈÔíì}³5F"ΆNA¸­Q¤®—Œ¼"Iª”UD¡›Ø2¶þF9\¸´„S]7#S÷±öÌÕ‹:9âµF’º\J2ð‰&öCÎ4ôd"#Ï¥çM [f‚K‘JμÊ#4Ý$ž (î´ìË™Eb…T\¡À­ÒßÝ*›•ÜŠN±§JB¬¢#+¤ÈìdGÊ5*Z葆eµ…Æ2݉L™IDjrè²™Q8ÊËôM-õ9d,ˆˆžBlW"m ÑgÓt1A£áTü%X†Ìvk%RÃo^”ˆèKëÈK`ÝR”Iý9)iVS+™íHm`_Q55V‹A‘X™&£ÌåО^åd’ÚVìjŠHa´)je{V¢YZË+áZÃx€´¦¹u›U^¹·S™Â’Ÿ¸¢èk|JA0†umM©n¥YJ‚«p=6Ïr¹†*nbÅUfºÝiPSG JpØIJ¶Bl™6ÛÔæ¹,¯“ùC ‚èÏ3k)˜v©MÒJ¨XŸX~&LóM‰ÍÒ¢$?™Þ &¬‰¹p8Œ7,÷œD†b=1ÖšRÑ“A8ñ‘\“Z’’Qñe$®{L‹hãLe ½£uT%I†Úc©6iù±â¦¬¦E•R¢IØÕ”ȸŒËDb M ù5¨'Ö¨ò$hҾÑ¥½É2TpÉ($)$o;}†âIYÌÓe*Û&¸Ö’æ0“‹e&$™Œ~EB%·{Øýη5»¹mr½ËXâ\ õügIÂ8yøT9ú,•¦´l·&Ó$îô2I²u«ŒÚ¢MŒó"ûTFx’œ‡‘‰iº•¢UAhÝÆëw2»ŠmKJœ±K%‘EÞÒN¬ÎÆuy aL7!¨½lÊo˨I€„°‚ÊÃ;Ú!¬ž'dêRGrÌ¥!»ñÝw­|^ÄÛ—uïE6DíϬɭÕ4¥äÍcË|¶½Ž×â1zEn,JŒh3Ûz#³g(á“-eR ÑÕ•$†Ý/Òd;´«­§j 3ãiº¶ ­×ës©æœ/*5Ù:–·"Rm!Ô“&O“ÊRLÒn%dDK¾QíÆØZŸ/Ì­âlºÕ..9)’苞¥D^eƒRJ§Ý)d*L³4F{Q°7°ÃbîôUðå?rë·î¤¸9õ™u9bH‘žÖ<ßæùm³ÝÞû,x*%ºÞ®á·a×[m¸Ðä®TH&ú%HUÚJîö]EÝh¶›nÍdC_Q0¹Vé8R•;µŠÆ1y×H~ŸøÅJ’Dúâ8f¨í©Õf…Y+=¶ý%Œ7.$¯S0ôLª9 ã¤ËHÙ.¸³#<¨m¤©j;%G°a÷š‹‹põeÚsTʉH]J4‰QRM-&¦Øq¶ž½È²) u 4ªÊ¹™[‚«CiÙ˜[ i6ú\XrŸv‚Ì~¸ÛIÓ#9þJÁšRçùA½fÈÉ&¼É¹mµ5\%Œu„iør©] ÀƒC«“µM²úÔã²`/+«Ó©5¸¢uÃ3"Z ;Ø”y3QaÌ©D™Qf3”¸MOšnÝb;†êPâ–e–Æl;ݹeÛk•üoá¼CP:}:\¤ËÕèbdâ-ÖˆÈÆÉä ÜA•Ô‹‘\¶í!®kØ;&¹ŒS«X¡J¦áù,;Pj;[«rÔ%¾ì4)–šhÌÐDV2¹k‹1ØÊÒS©9Œ±Æ“L¢VáF¢H~dÙU*k°ìKŒë%$êRn©Ô¬ÍAj‹…s ˆZFÂ3j Ã>[„ûÄ÷¶ICuÃVRJ$›z•«aYgsØBÅ7I¸Z¡\M38›w«TjiÜ-RkV—T¤¶· qÈ›A© ,ê2O[x'h^z£EŸF¤`ÃÇMÆj[Ý¡VhǸaÃÎDæIfÑ[VÞcA%÷Í)I‘ܧt¨’‘¦G9qžLG°ý%–Ÿ6Ì›ZÑ"¢kA+ˆÔ’qd[H–›ñ ô¬w„ê˜ ìu®—ðó]–ì²eÂ44ÚMKQ¶iÎFI#;e¹•¬Gr¼AЍ *›W¨&4º»ÚˆM›kV±wJvšHÉ%™hMÕbÌ´•îdG¤ê˜kÐú›Yr‘C¨È•UÀR«4v£,䔓§“-<–­›X•Y§kš,gïDG%ÅX7ãÌAŠ'GªSèp”ÉQ©åQ£<ûéKJ'U)•í ß±¤Í+#(í(¶l0Ù Å4ãBÁª¨$«§ª%ÛY^9­H%’í”Ï2TYo›a­´c*FÁÐeWb=UuÉ!µQf<'ß[nK^HèJ[A›ŠZø6Fc#Øv)¯bg1ST“¤bHtZ+±Ž{N3åµ"¤‰qÍd“3B›uEr#àºÒìwMðØ‹Ö(«l’+ÈTl-&eR›O\‡]”ŠÜ™eµëŒúÌ™•&‹¤ÊÄaºðÆ%§b-ѽñ«Lî|¹÷Æ.ó^ÙwCHÏîNùom—µÊù‘¬é ™^ÃÈTúÞ3ÄRU¹ò7ˆX‘†²pÌÏU&<&]ÚDf¬¤¿r”žRYÝ‚p¦%¦âx“j}ϼùÜìX©åºEþM!¤´æÓ"áe÷E´ˆ‚£¤l#¡"‰òÏr¸mI’Í6K±c¬½Ò\†Í¤wIJ+wl3ôê¤ „Ê”Hoë^¦I(³‘E«tÙmâM̬£yµ\®\+q‘‘j\@õFƒ>¬Œxê%]s_ÅÚ1È¥L}ǵ,äF–[qfk3'Ñ—9ž[ðG¦›B§Q1V•$@ÀêUz¡®›øÔõÆÝÌ. R[)œ„‘!K”‡ ÒK%æ3rÜj·€réQ«Ž@Æ1¨Ø\â©`*ÃN³LÁó)(~u™&[R^qG!ë-ÒJ‰ 5]V5í˱ñ z_ÎŽ©;ÒýGUÚ\˜è4!ÉéTBˆ·œâS×[æKQæ2Îw;ƒaL®î|qKÃ;—6ï¦Ìº5–Õîwb£&[mͺo{•²qöfF€£R©‘ñr§àâ {làš«Zzôâ•1NC43­2IëÕ‘do¤ÌÕÆKVCË*5qÈÆ5 œXU,XiÖi˜>e%γ$ËjKÎ(ä=eºIQ!&«ªÆ½¹C¨‡‚«ü¿ü£ßáäá(˜á4Ph»š†ÑO\¢ˆœ¥»–ÓIjKöÚá›HÙ­W<Î"ûl&5_åÿåÿ‰Ö·0uqÀ­bÊ 2ZRJ6%ÔZeÂ#â<ªQŒEô—X¤W0­}©§ñU!ü9 y³QNfå™&ertÇ¢\3¤èÐJ°NÅ— Ô›r㑆Öb5´wã#+ÛäžÒî‘ÚÒE&BÁx^HˆÜ811%¦l¬HIMkýçÝ3=¦w3Y±„_Wç·PU.ŠÓJ}³h¤>êMIiN«+hJKjÖ£þMȈ¶™•ÊòÄOª…ŠMÙDi6«  Ó½Å“FÊ]h夘ÎIã2YÚö;x=!z»V³GX‰ž‘ÕàôúìÙÝOXÌô‚.©Aœ”U߉6!º–^u¨«ŒôU™‘±¥)FEs"=¤i¹\­s)ÄÙq¡BzlÉ GŒÃfã¯:¢J‚+šŒÏatk=!V_ǘøt†`È}¥Æh²‘Ê6ÖYTãÊ#±!f¢-¤Gk™‘ †’iÓ*˜FDj|}Ôûr#J(Ù‰;¡,ÈmÕ3sÙÃJ vp¶ìýz«›âjÝLOtòÏÿÇŸÑzšï~¤nÝLOtõëü?høÎV¨5#Ó’ó÷Ôšl˜è~Äj=ZÜm)^Â3à™ì#1ŒÂ¸ƒOÆõJ]R¹©‘õú—·­äÈé%¯Ò¨Íë[3sôdZ¼¹Us1åMz©YÆôÑOE„N­x3hÇ*Z&2^µÖIJs]¨M›pÓbâã1Àñ*èÒœÎÞ•¹!öëΔ˭ â¼d‰pÓ,µ‰o†I25XóÈ•§†³u»Q„Õb5!oZl˜îÉe¬§Âm¥6•ªö±XÞl¬gsͲö;cʼábº} Êk¬*d9Ò‰Ç\MÒQža¢à¤ÔFNä²;‘‘¤ŒÌ“ÆTZCšXµêžEA-“ÓK9J$ߊ¸ÊR’…dœ¯™8vJ3+if;ø°52¥Ó‘O–ËHë§;Ž2¤¥:ê».5s2ÙjOÊI•Èþ½ðÿü³ž‰Œ6«®›¢­”Šë´zb0;s%¼„´{ZfSsq î:½…Æf_¨fkßÏÿË9蘪‡SÄšÀÔj5Ž¡#G_äè5XœRJš¼—=œ,¹vìÛ´{=j‹·â‹“Šg9žÓßôyõsTZ™§Ÿý§ MÒ$ºj*ð¢N(klÝDiSã39iÚiýä4%J+%N®D¬¦FBEƒçU]¯MƒQ~rКd)‰jb'X[«KB¤’NÚ¤—wmìf#ÍigÌÂç6-R‰N­ ˆŸ¤Wgîc¸VÎÚÈÒk¹m"2I‘ìTiËa¬Bš¦;¬u½P¬P)Ϧ©Ó]Si3épÉŒ«+<”™¤ÎËC‰;Eu:[–öÕ4mŒÌsžŸ¼Ïò¾–›Q¿5LÎ;³>ÜÇüe½@Y%¹°cÌe/%§ÚK¨KÌ­—”W"RD¤+nÔ¨ˆÈö‹Ã‹ <¿ódý¿á,pÇÿ/‡0—þZO¤Øîzßù²~ßð–8cÿˆØKÿ-'ÒlWÚŸc°ª?IÿÅWýLy$°Ì–ĆëK+) MÈþ’GPÒ¾”·d¯UMÇkU™Ž’¹Ïa4D_AéKK}Ìw7›g£M¬ÿHkôtÓUù¦˜«8Í\ñÏÙû¸×¨·OuNìBR„VIˆ‡èáÊZ]ñîg6×F?;)i{ǹœÛ]ΟBÞï§ùÿ¥x«]]Þƒû)iǹ|Û]ü쥦åsmtb“è‹ÑýÔÿ)â­uwk¬2êзB”‹åQ–Ò¿…ÁÁ½”´ÇãÜžm®ŒJZdîc¹Û]ç>‹½ØþN&×WyàÎÊZeñíþm®Œ~vRÓ7oómôb³èëÑÓùOk«ºªTè5$²™Ñ[–'š%•É+"2%}63ã˜|ÎÛÞD×Ì«&y»äýƒ‰»)iŸÇ·¹¶ú1ùÙKM=½Í·Ñ‹ÓcWn1MXùKU髜Չú;Í´%´’JKˆˆT8+²–š|{w›o£”´ÕãÛ¼Û}á:+Ý8›]]á.$Yh$JŽÛÉ#¹ÒGcâS ÄY®4FšQñškŽ쥦¯ÜæÛèÇçe-5øöç6ßF+Â^÷N&×¼ïpÙKM~=¹Í·Ñ‡e-5øöç6ßF%ïtâm{Îær…GrIÉ]::ž3¹¬Ñ¶ÿýk,2Ͻ4„w6àÎÊZkñíÎm¾Œ;)i¯Ç·9¶ú0áoO°â-uwmY§¥Ka¤æqÆ„•ís4™ÈhÜœÃZ<ÃxrcГJ¤Å‚ó8á¡ki”¡F›¶Gc4®D8 ²–šü{s›o£ÊZkñíÎm¾Œ#Kz?´â-uwäÊ›ˆSˆæa,1&´—[u5`%rImØ¢tÚÍ™9Sc½Ë)[ˆH7é®V>úýó²–šü{s›o£ÊZkñíÎm¾ŒO Ý8‹]_G7é®V>úý€ß¦¹XûëöÎ>ÊZkñíÎm¾Œ;)i¯Ç·9¶ú0á¯û§k«è}Eê]Be6\ÆXuêd“• ZçKVé²ã&«l£yÄØî\+ñ‘{wé®V>úýó²–šü{s›o£ÊZkñíÎm¾Œ8kþéÄZêútX›rSiQ÷ *TÙ§s´¬¹›nÍðRyr+<„=»ô×+}~ÀùÇÙKM~=¹Í·Ñ‡e-5øöç6ßF5ÿtâ-u}ߦ¹Xûëö~šåcï¯Ø8û)i¯Ç·9¶ú0쥦¿ÜæÛèÆ¿îœE®¯£›ô×+}~ÀoÓ\¬}õûçe-5øöç6ßF”´×ãÛœÛ}p×ýÓˆµÕôs~šåcï¯Ø úk•¾¿`|ã쥦¿ÜæÛèò–šü{s›o£ÿºqº¾ŽoÓ\¬}õû¿Mr±÷×ìœ}”´×ãÛœÛ}vRÓ_nsmôaÃ_÷N"×WÑÍúk•¾¿`7é®V>úýó²–šü{s›o£ÊZkñíÎm¾Œ8kþéÄZêú+}>&`À,VM²Ã$¤6ÚH¬IJI»w_ߦ¹XûëöÎ>ÊZkñíÎm¾Œ;)i¯Ç·9¶ú0á¯û§k«èæý5ÊÇß_°ô×+}~ÀùÇÙKM~=¹Í·Ñ‡e-5øöç6ßF5ÿtâ-u}ߦ¹Xûëö~šåcï¯Ø8û)i¯Ç·9¶ú0쥦¿ÜæÛèÆ¿îœE®¯£›ô×+}~ÀoÓ\¬}õûçe-5øöç6ßF”´×ãÛœÛ}p×ýÓˆµÕôs~šåcï¯Ø úk•¾¿`|ã쥦¿ÜæÛèò–šü{s›o£ÿºqº»÷ Ò0ΜüÚTBD—ÛK&ãóäÈRI™“MëIZ¶ÈÎä„Y?¨f!ϧÂmmÃ2êÞZZ% ”âÔjZ̉½ªRŒÌÏŒÌÌÌ|ê쥦¿ÜæÛèò–šü{s›o£ÿºqº¾ŽoÓ\¬}õû¿Mr±÷×ìœ}”´×ãÛœÛ}vRÓ_nsmôaÃ_÷N"×WÑÍúk•¾¿`7é®V>úýó²–šü{s›o£ÊZkñíÎm¾Œ8kþéÄZêú9¿Mr±÷×ìý5ÊÇß_°>qöRÓ_nsmôaÙKM~=¹Í·Ñ‡ Ý8‹]_G7é®V>úý€ß¦¹XûëöÎ>ÊZkñíÎm¾Œ;)i¯Ç·9¶ú0á¯û§k«èæý5ÊÇß_°ô×+}~Àù³SÓ™iñÒóØåõ%JÊD†š3½Œû­þ¡Žìó¥Ïfó,û•tWDâ§Jk¦¨Ì>›ïÓ\¬}õû¿Mr±÷×왞t¹ã¬ÞeŸ`;<ésÇY¼Ë>À¯zÝϦûô×+}~ÀoÓ\¬}õûæGg.xë7™gØÏ:\ñÖo2ϰçsé¾ý5ÊÇß_°ô×+}~Àù‘ÙçKž:ÍæYö³Î—dvyÒ玳y–}€ìó¥Ïfó,ûÞw>›ïÓ\¬}õû¿Mr±÷×왞t¹ã¬ÞeŸ`;<ésÇY¼Ë>ÀwϦûô×+}~ÀoÓ\¬}õûæGg.xë7™gØÏ:\ñÖo2ϰçsé¾ý5ÊÇß_°ô×+}~Àù‘ÙçKž:ÍæYö³Î—dvyÒ玳y–}€ìó¥Ïfó,ûÞw>›ïÓ\¬}õû¿Mr±÷×왞t¹ã¬ÞeŸ`;<ésÇY¼Ë>ÀwϦûô×+}~ÀoÓ\¬}õûæGg.xë7™gØÏ:\ñÖo2ϰçsé¾ý5ÊÇß_°1xš¼¸Ô‰s!Ó^ªÉDu6Ô(Ž%.<¥šKbž6ÐD\ff®";ˆþnvyÒ玳y–}€ìó¥Ïfó,ûÞw;k®üeý×üçNüÀÃb©x˦O=Õé­³\§ÌvKõ+Cm³)·fH|Ô|«ˆŒû–}ÙçKž:ÍæYö³Î—|vyÒ玳y–}€ìó¥Ïfó,û¶y"ªiª1Teô{rÒ{æ£ç¹Þ±á›†°lú½2­R¥1RIR©ïO™"IÆtˆË25„¬¼d{8Ô†Õî›A§çg.xë7™gØÏ:\ñÖo2ϰ"-ÄNb!ZmÑG}1‡Ó}úk•¾¿`7é®V>úýó#³Î—ÀvyÒ玳y–}€ï;ŸM÷é®V>úý€ß¦¹XûëöÌŽÏ:\ñÖo2ϰžt¹ã¬ÞeŸ`;ÎçÓ}úk•¾¿`7é®V>úýó#³Î—ÀvyÒ玳y–}€ï;ŸM÷é®V>úý€ß¦¹XûëöÌŽÏ:\ñÖo2ϰ6GSž7ÒV“tˆxf«¤ZÄ7 ÒIèÌG5‘·cµ”‹_“¸çsº'T™É¤ÖÊlJ2Êk334)$[R\£‰¿ø|9„¿òÒ}&Æúìsˆÿ¦|aæø~Ȉ¿¡ &’ñÍWc–³§2“ ÐLå+ð”£ZK)m-·"Êvðb ,úÄD¨]bÛÖ$ãËjB 74û¶”¤Þé22½ÊÛDƯ¤M÷MT’›{us•*TSI-,%åºÊZ¹û´*Cö¾Â³\›0:A«R+hÒ) ¬‰¸¤Ü™ „ÔEJw:Ôn›-¡•INÃ;äÌ{LÅ©šóߪ)Çr6£˜oƒpM:¿H¦="¹*úµJE: (§“¬çi¶kuÝjM´ž½%rB¬I31¦aªÕJ"%CŠ…¡ÓY2•Hm>i+¨›B”JpËþéÝœbA‡1ìš ‡‡¢®b£.|×j°õ¦†&G}˜Í¥c÷eªtÉF\RL¯´†cé™K¦Óc0óñ×CS…Ow­ê|§ŸI¾·£yìËŽ²7 ¸:Â+‘^÷ã3\eÖ"‰Dæ`ŒK—¾/Âa,îVæd)¬)ãaÄ%itš%›†ŒªI𲨶ÞÖ;TÞÅ.9 ¦©ì¸ôÉ Çm„LaN¶ãª$¶—PKÌÎc2"7 %´I±o Sê-ÕaO›:¬æ‰NTt0ÙÅBœ¥7Ã׆£R J#F¬¬´ØÏ`ôÑñþ¦cw±z«;.­S.¥ã6–ã!Y–á2½a›†jd’œÉEˆÎæ#}xÌBvÑžùE¢`j‹ø>­ˆU6˜ÑÓd°Êã9PŒ•¨œe×LÊîç"BH›"5)F´‘fmdX¼I†«uL¢®Ã,-ÓRI´JiÕ¡I¶d8”(͵–bºVDe~!ë¡Õ)HÁ•Ê IsYrTˆÓb»”ºFë ÈA6²RÓ•*×û¢Ìe—ÜÇ»Hø‚^D€s%ÍmO.UBd6c¾ù+&D/T£'MVzÕYJÏ´ŠÄ/Vì{˜§nPðÀ|„WˆhÕŠ†ï(ª‚ßù3FÖc”é6ë¦ÙË/èÙpï·nR·„`O°Ž=¦áªM +8jMøsœŸ%éª}&—TiI%½SÉJ“«B}ñ&WRŠÖ3½+š±ý+Qž÷‡F¸n*Ä4fdj˜¥Í¨³×9†[jq)pÙKŠÌ∌ýÊU·¹ÜÑ£œ^¸K*|RiÈíJºª1’m°ê´:á—m³%'†²$‘ŒÈö þÅX&!ÃUI¥_Cxfi&#ÆeG&:f.Bâ”ádYkF’%¬E™ •)%™•–æ…ð/WÛÄoaé ÓãTÙÎN3"©’Já¶h5-ÂN|ÄvMˆ&FyšÎ#Âõ8–œÌi´øóŸ…2Ç„ÑߎÃÍ«;d´¥¤º§”³Èj$q(‡±¼a…žÆx¾½2žöj­MÉ”ç¦Ç˜¦›S®-M©§•«J”JG‡—!ØŽâwWùôFÚH:3«½M¤Kyøí=:¶í!Ø%&6êihq†ø--ä©k5¼¢4\¤”©FIY(GúÔ®ï&ünVw6«]“u5¯Õ|æ£6·'ýü¹m¶ö³ÇøfF/f½!vŠ6‘ˆc4Üf×®a÷£©HY›…‘iK+f#5Zä\!ƒë¦…—~­QßÍäÞ}ɨFå˸÷·[Ÿ5õ|,™=×ò¬"*¯ÚM4{¬C1E<Ǫkp»ª–ÛsXuØç›)ÛBÍII«a(È’w+Ü„hM+X²7é Ó2ÒÖ%Öî4©)ÌÞzƒ2KYÂÙÀiE³7˹´¡c¥TÇõ)TDOpê€TÆÖ郄÷ÆÛ⦅å:ŸzÝ2ç¹ÍÂÉ®·fË}—ÙŒN­*™¾­AÉÈr'¢;„ÖlæŽ3Í–Ö#>-¢oLÒÍj5ÃS#â JÆ¥·JjE9©‹Jˆì°‡Ò–‰y –¦Ü2#¶lÛmsžÒ W°Ù6K8µÒJÕ5@€£Z >çÌsTFús#63ÚdJIZÜw\èëŠ:¼x¿FUÚn#ªÆ¥ÅK´æfËjžoÎŽR%4ćY3Ky‰N,¥\’›ì½¬d Cscc„$b¬?Ž™S\ø®Ê¨F§¢3JEέ2CM¾½mÚU–“4’ÁQÛ2&ÕULR.E1=À®` 3ø-¯ürôT""]Œþ kÿ½ˆÅ׺ÖÑÿ´ò=@ß]B_‡õ4ÏD†…»¨¶™³¦©³÷Næz+XQå»fDIUµ)+";X좹\ŽäfB$u{GØÚ¡¥(¸Ö&’wxeªb”T£[ƒ2Î…ž¸³¬Fj±É6¶R´¿F_xóêš7¥8c;`Uÿ¼µOÌ‹º¤ShzYÇ4êS³ª:¬ôé”fkœfyßqj/ Œ‹gÌÌë pÌïxWÐ<'R`¿çû‹Ö=Ó½á_@¹Æ?IzWÑ:HX·7¢¦gž¸òf^¦*¯½”ßXÿ!ß÷¬~Z1!ß÷¬b P¡ò7¿Óú:9Dÿ(‹K2uxÅü‡¿Ü^±øu˜¥þ­ï÷¬a-¨eÝôNžžQ?Êñ¦¡:äBÿVÿÝ/Xü:ìBÿVÿÝ/X¨P¡›wGjžKp¶Ò-ÿ‡óOýÒõθ!|Ôº^±1AËtÓÉ1¥¶“uà æ¤}Òõθ¡|Ôº^±1HòWTÇ$ð–ÒŽ¸àüÔºŸXuËæ¤ýÔúÄTÅ'Æ<µß®9'„¶•õÍæ¤ýÔúÇç\ð>fOÝO¬DÌR<µknÂx;Iw\ð>fOÝO¬:çó2~ê}b"8ë§i.ëžÌÉû©õ‡\ð>fOÝO¬D@8ë§i.ëžÌÉû©õ‡\ð>fOÝO¬D@8ë§i.ëžÌÉû©õ‡\ð>fOÝO¬D@8ë§i.ëžÌÉû©õ‡\ð>fOÝO¬D@8ë§i.ëžÌÉû©õ‡\ð>fOÝO¬D@8ë§i.ëžÌÉû©õ‡\ð>fOÝO¬D@8ë§i.ëžÌÉû©õ‡\ð>fOÝO¬D@8ë§i.ëžÌÉû©õ‡\ð>fOÝO¬D@8ë§i.ëžÌÉû©õ‡\ð>fOÝO¬D@8ë§i.ëžÌÉû©õ‡\ð>fOÝO¬D@8ë§i.ëžÌÉû©õ‡\ð>fOÝO¬D@8ë§i.ëžÌÉû©õ‡\ð>fOÝO¬D@8ë§i.ëžÌÉû©õ‡\ð>fOÝO¬D@8ë§i.ëžÌÉû©õ‡\ð>fOÝO¬D@8ë§i.ëžÌÉû©õ‡\ð>fOÝO¬D@8ë§i.ëžÌÉû©õ‡\ð>fOÝO¬D@8ë§i.ëžÌÉû©õ‡\ð>fOÝO¬D@8ë§i.ëžÌÉû©õ‡\ð>fOÝO¬D@8ë§i.ëžÌÉû©õ‡\ð>fOÝO¬D@8ë§i.ëžÌÉû©õ‡\ð>fOÝO¬D@8ë§i.ëžÌÉû©õ‡\ð>fOÝO¬D@8ë§iĈÕHe–ÞJ’á(ÍdDV±—pÿXÁ=Ë•\«uNöíŸÄ9® õÔ%ñèSLôHhQ¾º„¾=êiž‰’Æ0:2øëÇŸTѽ)Ã<0:2øëÇŸTѽ)—Î÷…}{ 9á,}TˆU ‰@B)æûHRÛym¾IÈ¥ûƒ5vܸ‹@§{¾-ÐÖ0¤á|%Žc̪9£P€”SM´9O%·È¬¤ä2RÑc3.?Ô?Fÿ©(½_¢f,DîÝN1ŸzžøÇ?Ùáîý^ô›hÊ¥‡´}¥c<3 ïRœ§:þ¢BÛR|Ô¤MFƒ#4öq ‰aF…G¨V±L:$ŠêÍ4˜®GSªv¹\ÈÈ‘}–ã÷IGZGKxÓq~'¨Ê•P¦›Æå¸ôŒË6žJ‰'Â$\Ô‹™Ø¸¹6e(¸ßÖ¨X!ìKV™J¨àõ$ÐÂ")ÔË$2’T‰÷¤ÛwK»qðšš½'fíÙ«=õFfšfcÁݶ'=ÙÄLõÏ'JvÌCóD˜;04@İieQ§CCMK”Ê\LU)§ÌBŒŒÒVÊ«•ŽÄ]ÒÄèÝŠ'À•ˆÕX˜“VªÑš'·1¡*=jIM­µßa‘(¶ò(ŒˆJ0¾“°•B«¤©ø–KôÖ1v˜ŠÊSŽ­´2ëV,¤i%e4{£"¹ñØŒÆ:©Ž0}2£Ü%D«?P¦Pë,ÔgÔ\ж­gMGdf;kv+ñÆ]ʵ¿­Vb«Œwx;ñ?µ]ÝÒéÃÝ¥Së8Ûž«Ò¢Ô!ÆjStÑ »4M Œó’•)Dg”ˆýÒL̳Áôª–´w&µ¼l@©bŽëÒS^áÉÊÓ’åÔ•©rœ¹’wàmLÒ>éïé‘]™>«6ž˜qán‡Ho†KQ“vÐFJ"2Ê£+Ü„F>Ã0tC£úIÍ[µJ$n£2"^d²—Ÿ]ÉFDƒ;-;û¿¨ÆdΦmSLç»ã¿Ã9ö{'ëweƒê“Ãøgièøzk)Z‰"–Ô54˜6e¬œ3Øæ{šŽÜG{í1«Llލ:¦Ä8íÜK†«Š¨¦¢”ìª#ŒîcCm¶Eu‘g¾S=…°ks·ŸÑ§vsiíRb‘QŠG–á LR|b£ŸðÜJ“ŠŒR<5óX@[©ßÐ+òñ#Å,®M ÁÝoFI™kUe¨¯c+‘k;\®vî\'Œ1–ˆqf¨¡5Z¿Ë{wI=w!­IJSm–2UÌ®FWÍãê~ «Táס»2ƒ[Šq'¶×»"ÚD¢+•ÊÊQ\¶*åÅcâÙÚ ¡`z” f!¬ÔH’Ô™í¬ŽÞ23J-m¶ÊGsµÌÈ7èž•‡t{GÅu,nË.Ué…2$SÕÇM¤8L’‰fVá̈‹fþÍÓLѾNnÓñ,7!qðëR£S©ÔUCŽå丕:¤ë“R,”ð„NÎÏLi¯áìE€4sJ£TwTº5,ب7©q—5QÓk©$JÚ…•Òf[?Y ¡'LX ®¨1;uw£9†·µÉHˆéjžÝ&îÔšIFV"ÚD~è¿]‚¼)I \cT¡ÔèUÊ|*«-3Rv‚¦§9›r‰·TåÚI)ÃNSAÞÊÛÃÙä“¡ÅKŒÍOÓ bitõÔ£¼Ê’FÚHÌÉOåJ¬GÆV¹Ó"3’Ę* ¤ÓªÐ«šv%–ÖQkT4°ëÅn'VE‘M‘qðŒË¸c˜°|ª, ¤ÔdáìK‰k ‘HA˜§\ŽÁŸRn'‚]Ã<êÙ~0Kèÿzts‡qµ:¬u8Uu/ £jÎ+ä^ög™Y¶¥e{¹-›D¹½ËwQp¢1#T—K:EµÅ±AnéNR²ÏX£RŒ¿“îoݤéQkTjæÄTõ"¬ÖZueú6mi3#>áT»¤Kå1¦cÚUgN• _ˆkuÚ,7Ô´Ä•KRIÖVKiZT•fFB²ˆ’w3¿(TáXç G^=¦Vi• ¢"˹ÔÌ´.ç•¥ÇϬB\RuyÎÙs‘žÁ˜ÒfŠiU½8u­‚j1#¼ãdäè% m5Ki ³egâtÜÍ›ƒÄgc=·%é'Ë›‚&ǨõÉZ£ÕØ™>²Ý4â-Æ^m^S"¹Ÿ‹eÒ|W°õHÒ~ ¡éýxú—X~­O­Cܵ‘ Æ×’†R“,öÖ\Ú#;qøö\5Þ8Ñ|z> V/ÃXª&&£±,áËu¨ÊaL;°½ÊŒî›™ïü¤™\ŽâgPêy§Ãư³šF†š”èª~ ¦¬œtÓ˜Õr%šR’$Ü”j¹ð¬žÛZ`ÒD ¦‘A‹¤ZÆ+‘5ôšÐt–!Æi¤­+"]Ù'²4–Ô¨ˆû¶-‡šÄÚMÁ:¥ð¾0[ÏCƒJ\y2·+Å‘ÃL’"ÈhÎ~ø¤F[Q€…MЪ›ÂøŠ|,_M¨UðÚ ujs /+D¥§bRˆ’­„›]&Wé†xJ\Äxò‡×Zc_ ÅR˜¶RZIÇÍICfi2ØA\ÈÆK cì' ³Fê«júåÝ;ÑþNéîœû«/xÖ£ÝåãýGlÞ‰t‡€èXJ›©ë ˆˆÊEFS§¶]Y§‰…¥¿Ñ£5Ì’¥ŽÜ`9â£áT$Ã7Ø|ØuM¬8KmyLË2[“µÈËŒ†àƒ gÞêLüeOŠªPŽdZ:ã-WA”é’{åc÷*µìcRâ eת©‘N$¥:äfýSF£4£úˆÈ¿¨tâ´å@«ÅUwV0⚇’m%§œyò¿ ·œmiI¬|dEîNà4ÖÑsÕºf!¬b ã8n—AtØ—!èê|õÄv4Rd{Äv¹ÝEb1¸ëhz•K§a…=.,¥Jr”™¦©¸m±Ä Ý¹æRMJ##UùHà#áz¶ Æø?ÕfR™¯ÔRb~æ×¨5¥fKKi"½ÛAì$¤î¯s°L_ÒfŽ™Åú*‘ºñÓ0äqæ-èoØ%DCM’ˆ’yŒÍ6<™ˆ¹m´ èû¹£wR­T©Ôé¬â)dTؤ8h¦d”„¥¦™%E”Ë)ðIì¦gÄ è\ªX~‰R¯bèT8…yhðÜŒ§U írÌ¢2$_e¸ýÒ{§a#Ž0%_i Õ1 ´´VñŠœ…×’ëJuµ£‚Er3Õºµ³~« ” }£ÊîÀ/bšÄÚ=O)&ˆíÃ[ɘH$e$©;}Sfy­ü¢îÜ[èVub¡ŒiÕšëI8](7QÍÖ%%ųf#Jr¶G{Ù\[,5Æ&‡M§×$ãÕʱ³-LÒŽ¦uÄi#3È£3MŒÌ¶ò ÙHÒ¾¨¯Kµ*¤•S_İÅ*:™ZÔæHï4’3A$ö·{™Õǰh¿:“i¸fMU15™Sb™<‚9‘[{V’L…/.r;\’W·!r …´wB¥i#ÅÄth3â•TétƦGC¨÷·$æ$¨Œ¯ªB6ÿÞ1­ô)‹°öÀG¥Öj–ef”Qéíê\^¹ÍT„ÚéI’v¸ª2-¿¨Äò¦,ö#ÑÄ©• ÌÜ=¹œ?ò£‡¹ÐfD“5žË]7Ø¢ä0§4`ÍcÚÌš¬,1…蕉L¹'s‰EžQ%¶ÚE¶JÅn4‘‹JФæô—@®WX]6¿É*Ì0kKˆCJsÞÍE·bvfâQψg©xÿÕ iWª²)ÔœC\~£¨ÔUºE™ä©9›"%íÕ¶v·tÈì2HÒ® N•p q¦>ÖÂp_‰¾0¼ÎšãD¬‰#U¸ —îg°ˆ^¯¡&X¡b™”Œm­; ©ÃŸ ¸‹FD'1ÜÖglÙR£4‘‘§6Á§†ôÂØû ÂìѺªÙ:åÝ;ÑþNéîœû«/xÖ£ÝåãýGh…qØݹx¾«Hy…°òЉÉ™‘“„…‘™m³mŒíÈa/Âtj;ýIؾ´õ* •Hõ†Ûfjã ßm¸—J\2ÌEÂVÂ?å)‹U ov™hš:ë›[¾U/wn j¬O]^³o¼ñæ/uųnWHXÇF”]Ô0&T*HªÎL§ÝÚ’LÙHQ•Ô”™ûÒDD{.fwã˜?¤Ut¥†´‹3͉2%9Qƒ½Î©,(ÐéæZȶ—éT› •s4žÂ#®)º‹#bªÔÜgÖߥ¼·à¨ÐâRݺVfFd½ˆ"ܯ¶åÒîŽW€·šS¦+4ÊÌc‘Sl›F¢"IÒfv+-G~ïpMë¸û ÉÑ6’¨lU³T+X¥éôöw;¥®aO°²^cM“ÁBŽÊ2=œ\C¦Ì]‡±ÑÍ.PÝS(Ô£PoRâ5.j£¦×RH•µµíI™lýd%¡ºM‘¢ Q¤šµŸ\‘cPãGœÖ±”‘©¢Yå=†g®-½Ì»8ÌIêú3Ãðz©étv ÆE ø»êìGJe)"pU°ÒkAl=–U¸¶Vˆ±~FŽ11…AúTœ†åµ5¸êx’¤©³RM)Û·T‹¹x»·t‹Œ°6‘4Ìu Bõ^.n*a±&"ROS5Ô•%\R—°Šö2>ROT=«ªEMXÁ¢¾·· Ì4É%’Œ¬—”[¢$ì±[jí~ççS®£N‡Œq]f™¨Œ9JT–"INfVá¡Å©?Ê+4ecù_@£Jø» v1ú8ÂUë1ir)ꋱ”Æu¸d”¥[ÖªÿAq÷<šÆt<:ŒM‡ñ#ïD¥b:r¢9-¦ÃaYV’Q¤¶™YÅqwmýA°+Ú>•­#èÆz)‘é”ÜYåL…ôlçm”¼iI¹%gJlVÿyÜZÓ Ôôe‰± ,-ÌÃ8ÊsJ†Æ¨¥F%¡²RˉFfáoû¿¬Fô‰p­S`ze6¥V,?…ã7|¢#S ÔD„›­¥dv¶­c+Œ¹ e4Ç¥MCGó0¥+ÔqcÕ)É}É’¡”bM å$¤”¬É#5HŽæ|€5¶(ÁÔÊm3 ½GÅp+sk¬¥R!±•OpÒÙ“nYj;ÝÅÒO¸=œ›ŸN¸EØ:§ aœ õ"™3seÆŽ÷aIÊ¥8¥&Ä’2"½î£I¨øŽãLbˆ:=‰L¯ЪõJŒ§ÙJñ ,‡y[3CF¦Ò\féÝeÁ/ëØMbà}âÊn ®Uk2±4Vãi‘M ˆœ‹JkÊ”¨ÿH£,¥òKõ€™à,ƒ©Ômẖ¦TÞÆPdÊ™6CyŸo+ y$򿄱d[-Å~1¦#`::åã¨õ _ þ[ȇI#YRR ÒÈ‹­'{¶’ØJÚ²Ù˳ð.”ð!P°]ST&Ĭàè’#5 ¸Šp¦Ú&’iYpSÁJ}Ñ–Û÷6WKsâN½+ØÆ¯:›XY.‘:MH‘!zÕšdÚ¬Yµe´Óîo Nz™p=]j[ÅñX’ÍMעѠÈhœD•¶Ò–ëÊJ¶I4–Ã,Ê.AïÑöîãÝ,Ö%PàÔ:Úrc”Ú[Ç3'4–¬¶­)"â,ß@ðh“MLÃÄ8j)£a˜”ªLCˆŠªi®.cK*Jr¬”£#R¬JÊ›el+…7H¸rn˜kÕç+N`öV‡ãÓªTJyjä–µjK²™Zn­d¤¨ÎÉ;¤¸i'ª3 R©laOJ¥3H,EL) °œ­²ñ%µ+*“ï¤Vÿ»úÌbô?ZÂôÈRὃ‰ñdù-³Lj\t½)3I)&«æ;«m‰;H®/iûÂÆSh”údÙUthz“Ÿ%½Zæ<¬ºÇrÿ$"vëýC%ÔçYÀ¸_}kÕüFÕ.¾mª5,ݧ½%1ÉIácÒ²;’5‹5[ú®7OP—Ç¡ýM3Ñ!C¸ÆF_xóêš7¥8g†F_xóêš7¥8Rà¹Þð¯ FÜãIÞð¯ aàÒêu#p©´é“uvÖnvæKÞ×ÊGkØÿÜ?R_˜+Ö<~ ì­wÁ¯íŸ#}=Qà²1Šõ#_¨:ÈÆ>+Ö<~ ì­wÁ¯íŸ#}=Qà²1Šõ#_¨:ÈÆ>+Ö<~ ì­wÁ¯íŸ#}=Qà²1Šõ#_¨:ÈÆ>+Ö<~ ì­wÁ¯íŸ#}=Qà²1Šõ#_¨:ÈÆ>+Ö<~ ì­wÁ¯íŸ#}=Qà²1Šõ#_¨:ÈÆ>+Ö<~ ì­wÁ¯íŸ#}=Qà²1Šõ#_¨:ÈÆ>+Ö<~ ì­wÁ¯íŸ#}=Qà²1Šõ#_¨:ÈÆ>+Ö<~ ì­wÁ¯íŸ#}=Qà²1Šõ#_¨:ÈÆ>+Ö<~ ì­wÁ¯íŸ#}=Qà²1Šõ#_¨:ÈÆ>+Ö<~ ì­wÁ¯íŸ#}=Qà²1Šõ#_¨:ÈÆ>+Ö<~ ì­wÁ¯íŸ#}=Qà²1Šõ#_¨:ÈÆ>+Ö<~ ì­wÁ¯íŸ#}=Qà²1Šõ#_¨:ÈÆ>+Ö<~ ì­wÁ¯íŸ#}=Qà²1Šõ#_¨:ÈÆ>+Ö<~ ì­wÁ¯íŸ#}=Qà²1Šõ#_¨:ÈÆ>+Ö<~ ì­wÁ¯íŸ#}=Qà²1Šõ#_¨:ÈÆ>+Ö<~ ì­wÁ¯íŸ#}=Qà²1Šõ#_¨:ÈÆ>+Ö<~ ì­wÁ¯íŸ#}=Qà²1Šõ#_¨:ÈÆ>+Ö<~ ì­wÁ¯íŸ#}=^ˆúBÆQðY`Øõ×™¡’VÊÛhMÒµ”“Y'9‘šŽägm¶âa!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕ!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕ!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕ!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕ!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕ!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕ!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕ!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕ!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕ!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕ!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕ!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕ!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕ!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕ!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕ!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕ!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕ!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕ!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕ!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕ!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕ!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕ!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕ!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕ!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕ!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕ!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕ!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕ!ë#ø¯Xò5úƒ¬Œcâ½cÈ×êÊ×|þÙò7ÓÕë¨KãÐþ¦™èÒzlêDõÀ©F\iHJ¶—î’JI)7ä;(¶q—í¿¨KãÐþ¦™èð×MTLÓTbaxwÀèËã¯}SFô§ ðÀèËã¯}SFô§P—Î÷…}6ç’N÷…}6çýK{Õãç,ëž5³(Vb…›Ô-O% Ô.([PÂÔ:ÂÚ… ¨P¡‹}xPbƒ˜ ÆMÕ¡IŠEF)× LR|b£ŸðÜJ“ŠŒR<5óX@¾º„¾=êiž‰ 7×P—Ç¡ýM3Ñ!C¸ÆF_xóêš7¥8g†F_xóêš7¥8Rà¹Þð¯ FÜãIÞð¯ FÜã©oz¼|åsƶb… ÌP¡óz…©ä¡BÚ…Å jZ‡X[P¡Bµ 1o¯ Pb³ɺ´)1H¨Å#:âaIŠOŒTb“ã‰Rb‘QŠG†¾k(7×P—Ç¡ýM3Ñ!¡Fúêøô?©¦z$"HwÀèËã¯}SFô§ ðÀèËã¯}SFô§ B\;ÞôÛœbI;ÞôÛœcõ-ïWœ³®xÖÌP¡YŠ>oPµ<”([P¸¡mC Pë j(V¡B†-õáAŠ Vbƒ7V…&)¤g\L)1IñŠŒR|cÃq*LR*1Hð×Í`úêøô?©¦z$4(ß]B_‡õ4ÏD„Iã|uãϪhÞ”áž|uãϪhÞ”áHK‚ç{¾sŒI'{¾sŒ~¥½êñó–uÏÙŠ+1B‡Íê§’… j-¨ajamB… Ô(Pž¼(1AŠÌPc&êФÅ"£Œë‰…Üûgóèò±«_'í Zù?h¾;:×YüúåcV¾OÚµò~Ñ|³­uŸÏ¡¾V5käý¡«_'íÀ;:×YüúåcV¾OÚµò~Ñ|³­uŸÏ¡¾V5käý¡«_'íÀ;:×YüúåcV¾OÚµò~Ñ|³­uŸÏ¡¾V5käý¡«_'íÀ;:×YüúåcV¾OÚµò~Ñ|³­uŸÏ¡¾V5käý¡«_'íÀ;:×YüúåcV¾OÚµò~Ñ|³­uŸÏ¡¾V5käý¡«_'íÀ;:×YüúåcV¾OÚµò~Ñ|³­uŸÏ¡¾V5käý¡«_'íÀ;:×YüúåcV¾OÚµò~Ñ|³­uŸÏ¡¾V5käý¡«_'íÆÝê{ÑÎÇŒ[VÅõ*­>†d)ÈKIY³KÊqJ#mf«DdI+ññìîèìÚ¢kªgŸ²b©–›Õ¯“ö†­|Ÿ´nM!P4 Γ‚ñµ~¥^F¯rÆ’Ê’Û—q$»™ÇG Gî‹i´G üI‰«Ô)’‰U……êdâŽtu¶— :•­µXóR¥%$F¤Øólã!Ëô4ñD×TÌ|û¿àÌå¦õkäý¡«_'í¦N‰â=AÅê£Òñ$ê…3®‰M’R¡¦ÿ”2Òñ)ItÜ=gºJIRxˆ•o?T†¥èÏ{æÃvEBŒóm²ì÷TÚ/-Fé›il1'"îw.=½À¦Î–ª¢Ó™ù©§µkäý¡«_'íSBÚ1‰ŒàÕ±#­• QÈ·\¢IÖ£+äMöŠ×;Hˆï³'¥m`zf´}ŒÎ¯MTÎäyªJ_5^Æh,¨Q™•Òi½ŽüBfÆš.~žg?ã=3ƒ3Œ´Æ­|Ÿ´5käý£i§B˜ö“W§õÏ…æ±LvtHòdcqDóÄÙ%³5šs™ì+ì#25XŽâqKêy:ÕKnk”ö(Í¥šT9ÏE\™2Õ.êÜ[k6Ò’RÚÚ[ .Ò4ªÕªÖ’žýÿæ?=©ÍNtÕ¯“ö†­|Ÿ´m e£ÄáÍS«Ó(õøÕ¥Õž§LyÙ1ÖÚä!Hm-¨ÝÎFÉÔYO*ìv4ß^ÑV¨Xh±[ Ì‹LÊ•)Õ)¦Èøh%Ð[KÝ”é´Õw·á¥Õ¯“ö†­|Ÿ´Oðƈô‰h)®Ñp¼™Tõ‘›n›­·¬"Øf”­D¥ÎáÌÑtqK“ÔÿŠ1ìçjlVèÕTÁDlÉK$Yã¥YÒh͘µËþQqÎ;ªÓi£»tóˆçä̵>­|Ÿ´5käý£ah3GǤ¬tš§îíG\©.’s/V“Jl’=™ŒÖ’ÛÄW=¶°™ãh8^«;iKªÒÈÍÈu¡•H2Úhl–†Ôj±¬J¹Ø»·¯O§¢½“3ŸÎ}Ægh­Zù?hj×ÉûDŸà¼M„jQ)Ø‚–¨²f2—ã%6ñ:…‘TÚ”G´¸¯~.R¾ÃúGµ(’IK„£G’GÂÙr½†bn„t© ‰Ï¿ƒ¦jà•Þ4:ÒÌË)+€IQ››ù¶Ü¸ÈÈZtºhÇõóýàÝSZj×ÉûCV¾OÚ&¸¯Fxï P™®b 7.=ã$¥Õš)Ÿ-)3R ÿïr hkI§‡zàëFnàÔë³kÖdµïªÍ¬âÛîC…Óc;ÿÌ¥®µkäý¡«_'íÀuìë]góèò±«_'í Zù?h¾ÙÖºÏçÐß+µò~ÐÕ¯“ö‹àk¬þ} ò±«_'í Zù?h¾ÙÖºÏçÐß+µò~ÐÕ¯“ö‹àk¬þ} ò±«_'í Zù?h¾ÙÖºÏçÐß+µò~ÐÕ¯“ö‹àk¬þ} ò±«_'í Zù?h¾ÙÖºÏçÐß+µò~ÐÕ¯“ö‹àk¬þ} ò±«_'í Zù?h¾ÙÖºÏçÐß+µò~ÐÕ¯“ö‹àk¬þ} ò±«_'í Zù?h¾ÙÖºÏçÐß+µò~ÐÕ¯“ö‹àk¬þ} ò±«_'í Zù?h¾ÙÖºÏçÐß+µò~ÐÕ¯“ö‹àk¬þ} ò±«_'í Zù?h¾ÙÖºÏçÐß/9¡DW2Ø)Ý÷³~ªÍ6kŠièµ3™`o®¡/Cúšg¢CBõÔ%ñèSLôHDî1Ñ—Ç^<ú¦éNáÑ—Ç^<ú¦éN„¸.w¼+è·8Ä’w¼+è·8Çê[Þ¯9g\ñ­˜¡B³(|Þ¡jy(P¶¡qBÚ†¡ÖÔ(P­B… [냬Å2n­ LR*1Hθ˜~ űÜ~ç/Ö"ÕÊi§¾QT*F±<†?5©ä1yÔÚîFÙ\oZžC jy 8«>ñ¶W[Ö§ÃZžC*ϼm•Àõ©ä0֧ʳïep½jy 5©ä0â¬ûÆÙ\oZžC jy 8«>ñ¶W[Ö§ÃZžC*ϼm•Àõ©ä0֧ʳïep½jy 5©ä0â¬ûÆÙ\oZžC jy 8«>ñ¶W[Ö§ÃZžC*ϼm•Àõ©ä0֧ʳïep½jy 5©ä0â¬ûÆÙ\oZžC jy 8«>ñ¶W[Ö§ÃZžC*ϼm•ÁÓ}C»ã½AÞ˾Zˆ›“ufÔë²ÉɬËÂÉš×¶Û^Ø5©ä0Ö§ÇŸS]›ö¦ÞøŒù¦"brëî¨^̽‡ëuõƒ¼ßäû§{7^éÿ8o.MgÝe½û—î‰L8rñ™°;Ãõ½iï‘’Úe¤ŒÜ4:z¢n÷5XÐfD[5'{X‡ kSÈa­O!'èZÙ¶.G·ÙÖ1ÕlÏGTâ¯ÿ—ý5÷îOþî(ÁumSeNÄÔ.1^Ÿh8Êæ2ÇpqŒ:~©Rj:“)+ME$”ÆA™•ÔKUȬy­{­ËzÔòkSÈbôÑjš·~¤sŸgYÏ䣿£´tE§Rè˜G•·ºã)‰•J•G2醦ò·+f«&î(Ñb+ì>R´oÇv.€ôÐÓÍ)¥8yd•¸*“I? ÒdeúŒr–µ<†Ôò¤Zµ¿|ÜöÄòé9êfqɱ:ŸRêô› 1±špŒ³merã¥æÖ½Ÿ¢ZT¤¦Ê+ñŸZæC¤4ÁjÑ {KJÂÔÛŽ{Ç2š•¥÷±äز¹«-ÉelרCŠõ©ä0Ö§Ç[ñjíȯõ1Û¿ù#1í´0ÕI˜ V+ò›DÍLVëSŸë#%³[F¨ ñüÒùDC¸Ïã&cÊ¥5šF5e²'èÕIŠŽì¸é%¡¶ÙQ%E™(<ªÍbá—ÒZÙ:X…MÑtœ…p‹GjL4Õ^¤Só“ )"Q’TE•Âà‘™)DE¶ãYkSÈcÚ«~ê±ËöŒçÙÖt÷÷:úd >êŠÑ±oôöR¸²µ´z…På"’¥Æ4!´)J<¤¥$ˆŽÇ­²ÃóGL7†tÇ¥J ~,tÔ±=2Ó‰ØÊÝdÙ:“3mKΞ.XÎÛ!kSÈa­O!‹M«SN&ç³ç?Ÿý£3ÑÖ˜Ò[”ùZ(ÂRðÕ'¹Bz4ëë¨ËŽÖºÊJîÙ$ÍI2=b¸ˆˆ¬G–Kƒ¥Êw«GÆrCªeªIm³QåIe†­…ô­Gö”q6µ<†Ôò‰±fi˜ßÎ&?™Î{å9žŽ†ÂòäÏê.Çrf>䇕_Bn(Ôw7!¨ÎçÊj3þ³mP*8—*³Œ*hî±F»XË Wœiµ •}RÐdƒ=¼;)ñ¶W[Ö§ÃZžC*ϼm•Àõ©ä0֧ʳïep½jy 5©ä0â¬ûÆÙ\oZžC jy 8«>ñ¶W[Ö§ÃZžC*ϼm•Àõ©ä0֧ʳïep½jy 5©ä0â¬ûÆÙ\oZžC jy 8«>ñ¶W[Ö§ÃZžC*ϼm•Àõ©ä0֧ʳïep½jy 5©ä0â¬ûÆÙ\oZžC jy 8«>ñ¶W[Ö§ÃZžC*ϼm•Àõ©ä0֧ʳïeúx°.­ÂRLˆŒZZë”×r&™ÏrôÆ ãXë¨KãÐþ¦™èУ}u |zÔÓ=$;Œ`teñ×>©£zS†x`teñ×>©£zS…!. ï úmÎ1$ï úmÎ1ú–÷«ÇÎYו0ê0åN1Èm¶IÌÍ$–¤/2WÎ…§‚j÷|FFq‘‹ ÙP§? %:KªmH¨F9 L®5elãÌÒeö}ã×: ÑN Åš=…TªSѺr¶Ù›lµÂýj¹æA™™šmÄç°;Á\ËÁ ;˰;Á\ËvÑçx+™c£84r×´1¢ê}n©QàSã9*S»™•jÚm&¥ªÉhÌì’3±Ÿ ööÑçx+™c£Á ;˰;Á\Ëñ=¡3\‹Dr:“>\g¥0Öæg†Ó*i.*ú«”ûEc;žm—±Ø8hyvÑçx+™c£Àz<ïs,t`84vHÐvŒ£=™ ¶Ë²6c¡ÄÆJžY!K4 ¾²!j±m²T|Db÷`=w‚¹–:0¼»èó¼̱ч`=w‚¹–:0¼»èó¼̱ч`=w‚¹–:0¼»èó¼̱ч`=w‚¹–:0¼»èó¼̱ч`=w‚¹–:0¼»èó¼̱ч`=w‚¹–:0¼»èó¼̱ч`=w‚¹–:0¼»èó¼̱ч`=w‚¹–:0¼»èó¼̱ч`=w‚¹–:0¼»èó¼̱юGÓå‡ô±Y£Ò£¢<8ÉŽM¡$DW8í©GbÙs33ÙÊ a?¢øn¬_‡ÛÞé… WaêÞ=e“²>ßzsi\¸<{Jñºå9ú=ju&J›[ð¤¹Å6fi5!F“23";\¹DU<`ÙC§?X­A¤ÆSh~l–ã¶§ É$¥¨’FfDgkŸ!‰0!Ѽxòñ¤ò˜iöW¬ÌÛˆ%$ìÚŒ®G³Œ€G€w—`=w‚¹–:0ì£ÎðW2ÇFƒ@w—`=w‚¹–:0ì£ÎðW2ÇFƒ@w—`=w‚¹–:0ì£ÎðW2ÇFƒ@w—`=w‚¹–:0ì£ÎðW2ÇFƒ@w—`=w‚¹–:0ì£ÎðW2ÇFƒ@w—`=w‚¹–:1̽T¸^„t•CŠ˜ñΖ‡Wd¤k7ž,Ç”ˆ¯d¤¶q N½¥`¬Óêm8 ™¸é,ò²-u‚Ènƒ±º¢…H‹bŸK§Sc¶ÆD± 2o‚ã…s$‘]Gm¦{¨ˆ‹¬%`¬Óêm8 ™¸é,ò²'&¼zÎÁ#ao4³ì‡YØ#Äl-æ–}‘ Ãƒ€wYØ#Äl-æ–}ë;x…¼Òϲ Ãƒ€wYØ#Äl-æ–}‘Î]TÐép1:%*‰I¥2Ú\#LhcXf–•ušH³Óµø»œgy‰É†›(+|'ìzd B{‹>“ö=2 ë¨KãÐþ¦™èУ}u |zÔÓ=$;Œ`teñ×>©£zS†x`teñ×>©£zS…!. ï úmÎ1$ï úmÎ1ú–÷«ÇÎY׫T¨F‹}Jd¶"#W·ŸRÒÊlE•gd•’’±r ý›VªÎb$yµ9²Y†œ‘[yõ-,&ÄVAÙ%d§a[ˆ¹6‰!Ôkœ+]sÉ•-ÖãvQš”Ôƒy%«AžÒ#lÝ3AlàÛ`ãYUéx–¾S‰«)Tiì‘Ný2·#‰Q¦ÄvOn…(øV¸×uJÍ^ª–“TªÎœM›)2æBýYŒì?gVë3¡5u^|¨¬ûÓIZÛGГ;õÑ)Ä|NþÃTè•Jð×Dtߎԇ µ!¹RHó$ŽÆ”¶”–Ý„”—pˆF«èm;ß«¢½J¼&ÍZÅ­[¨öÝôæ"²UÜ"Ù³`´Õb®Í-ÊSUIÍÓÜ;®*d,šQòš/cÿpóÊ—*^«uIyýKDÓZÇ Y\IMø’]Â-‚b0:¯FxyUýádpõT™'Lðýqõ7}Ø‹ú[Wu5kÛY<{ìc0¨‘jSpm:€ä̺v3•\jKѤÆjAÒ$9…<ÊÑ—!’ $„$×HÑœ‰IÊè‡@­hjPéõHª4:ÓSá¥öÏô-b%¤ËŒŒ¯úŒly8{ÉÃèÃÒpíê3fFŠ{”öÕ&Gr2lÓ”¶™÷e¦<{^ÃÒ1=R‹R®<Öm ~J”‰i2#£BÃñcÁ–ië5Âm¸©Jc(Ф›"+ ò­i¹[bÔ\F`5Üþ(cEÂÒqòMœ`íÚ‚£0—ߌª“j"A6KKŠFÔ¡$z²¹XÔGéÑv3®âœJ¸) F2×Öš±WѬS{­¼ÅÀd²¤ò¤Ìó-'|†ƒrq&›†å-ÕÉ¥SŸS¯‡ ȉQ­ÓgPk;–Õ?¢¿NÁè6¨æäG,lðÈÊ*µvÓ”Én Ó³e¶lcvGùÏøL7dœÿ„À_cvGùÏøL7dœÿ„À_cvGùÏøL7dœÿ„À_cvGùÏøL7dœÿ„À_cvGùÏøL7dœÿ„À_cvGùÏøL7dœÿ„À_cvGùÏøL7dœÿ„À_cvGùÏøL7dœÿ„À_Õ?ñ爿ôßûV‡zîÈÿ9ÿ Ž êŸøóÄ_úoý«@"°>.+?[Óÿƒ0fð„˜”ÜäöªõzLÕTÔ‰4ÈiyÔ´M ÛI¬ÝlÛJ”nñæË·Üˆ5Uª3Jz’ÕJctç׬v"_Q2â¶p”‹å3à§i—p¹å.§R¥H94º„¸/™e7#<¦ÕnK¤ÈÅfœ‰¬(ø…ê‹«:àòêŒË3y))IhœUŒÓ«Ið‰FKRöÜSeI:WÀÓ\ªn•<¸„Ü䶦ʤ- 7ÈÌÌÖdkAÌ”‚NÓ#¹ëöjÕV*gSf§5¹ê33’‡ÔN™Ÿç#¿í¦O2qΗ6L‰j2Q¾ëª[†eÄyŒïq]‰gâM®Õë4ù8Šo3w[f;òR4¦êJ´Ë)šTd\…~1ù¢ßôîý¯ð–1’1 ~Döj+•7¦2“KR-jq²222JŒîEc>.Q•ÑCn;¤ [M!N8µ8”¥%sQ›k±wL[vþ ©V+uùÕY¸¬£°Åfm1a‚FVâf£N·Z¤ Ÿ÷Yr*Ù”"š&Åž]3Fõj¦4N"V,ˆe:åŽÚ"©1ñºÞ© Qe[dÒÉF¢ÌéX‘°†Ñ*^,@x„©Ò¬›z£¨4î“E­—Y—5­Ü¸ÂhÛáŒ@¥Ãƒ˜u8”Èð%U§¡—æM¥–dF­¹Hìj;r˜°á|mR†´:·ë,»RÄz½õI%²\Œ´©.½Á"àe} ß)Œ²ì#2=¨#°pÞ VU^¢E¨­ã}RÙ§6‡ÃJ’k5’sf4­e{ÞÊQwLf÷dœÿ„À_cvGùÏøL7dœÿ„À_cvGùÏøL7dœÿ„À_cvGùÏøL7dœÿ„À_YÕ±ñ³êvÿŽøìÍÙç?á1Æ]ZÆJҼ܎ŒÙ—>ø¡¨ž/ú¿èC_é2†ªÕJŒ’M ¤M%ó:%aãCo«ý&Ä®ênÖ+¡dZÓâ;”Vñ5-UøïOI8Ú‰+$¡J";ÊäFW/Ø0uÊž®Å(µ¶)õHé<ÄÔÈòùl¤\sö¬…½ˆœ£a$ÓðµÊ<…b2¥Mbšû¢2Íiª2ŸR"2&ÐD¢IÖ¢ÈjØ~ÔbLLÆTj¬Š¼J’ë{ÝVÕ=ꌔâJ‰V÷{U°Ò‹å#YZLšŽEè‰OM,Óá& 7½µy2ÚýË Ýoðïm#zo›pïan{Þ÷ÕäËÇúbºË0(íVfÓä§;G‘-ö!¹%L&šä£%“YØ' V+£g®Ÿt‘&¦J¬JÅÕOâçb1B‘)Gqˆùª¶šY¼éä##ZœSiÕd"Raû‘î;ÓÐÒ E¦ÄK/kÚ&)ù êµYÊÈØ­_å·/‹`ªeKͪFªÌbŸ&¡diNÀ5¼Ïû 4]?Ô`!”1†ºôlBöãV4• égJš~¶äu™¯.³9†²2YÂ,§´ÏoˆÆýàÍ˹É7>èÝ:­Æ¬šín·Yl¶Ï¬áæãÍÂãÚ=}waï~ žÈXêŒøÉÿ _Ætv]CüñÕÿBaÕór4‚·ÙVfÜdÖƒµ®Fë†F:Þ·‰¨qj¯ÇzzIÆÔIY% QØ®W"2¹~Á3ÈBôƒI‘UÒn8J-J©*ʾT<—àȸФ©HQ|•¬v2ŽÕq¤¦ª¿Ò¢-ª“J,Wã/!®Ê9§ YÔ”BY¬JJ ˆ•rIÜlEâL*¹ÌT†•%¦ÖÓoešÐ…šMI%e¹šf]Ü©ä!e5œ™Se%0ÊDô%(GžBRFIK‡–ë"#2";ØŒùD”LA‹àQ1õ)3£1¥B:¹A\‰f³ZUh„¥‘%f”’IJÍK±ò™>lªÞ.ŸƒêR«µ = ñ,ˆÊ§Ej9®œ¤Ó娖n´¼Î™¸4½Á#à,Léoèê–ÊY¦Sé0ZKÅ!(MÕ¤"2%‘%±™_iŠê³tViöª°é“Û’h7Ó&­'MÈj% óe¹ÚüWØ^9wªÇý,‡öÿ†Èèn»°÷„?Ïds—U¸óñ qÖ2½fUe2½ÑÃÛÆBiæKN€ºŠÅŸIû™žâÏ€$ýL„úêøô?©¦z$4(ß]B_‡õ4ÏD„Iã|uãϪhÞ”áž|uãϪhÞ”áHK‚ç{¾sŒI'{¾sŒ~¥½êñó–uÏÙŠ+1B‡Íê§’… j-¨ajamB… Ô(Pž¼(1AŠÌPc&êФÅ"£Œë‰†G ü;íz&'" …þö½‘‘©ñ­:@Æ©UG©OUš¦ÌrœÂõnËK 6[VÎ —l¤|$ì3î—(ñ‰‹ŠÏÖôÿàÌÊ EάĊˆNÎÎéfŽÓ„…8’Ú¢%'‚GÂ22.3âžcÄkŠè‘›ÂÎÕÓL¤Ó^b{1‰ºuY3âCªºÈpТ6¸î’<ÇbØ=ž•Cf…R~›Feømj÷¾« iº³ºÒ_åMšÏVjFn$&ʱm#¸ð ΰû-²ã¬¸ÚF±¥)&Dâss$û¥™*+—tŒ»‚ؙ⊔"ÂX^1áúb]D™&äcfS$¤Í%­És25Òeu¬V"Ä`¨ÐæT¦F› ¹(:\ç5-i6œn3Ž¡iÊ¢¹’Ee\ŒŒöq3Ý‘ƒœ¸¡1PÛ)‘ª‘ZD’Rónµ Ôƒ,Ùmv’dyo´ö™X‹;ˆÞ´ê¼HiÂlêdÁ‡"J‘-üí)èí¸¢bë2",û3’öß¹b Ýøaè›lFí‡"6èe/³®hѬm^åi¹mIØìe°Ä¢u&Ÿ…Ùšìø,Ö_EZM5¤<ãˆi$ÆLë2mIQ™ënY\}Ëøˆõ9X)šm*C¬;L5$?eÙFâIÃ#Ê[e‹iÞÆ„ \ÃñÜ&ä2ã+4%ÂJÒi3J’JJ¬}ÃI‘‘÷HÈÄÇÑ#7…«¦™I¦¼Äöctê²f%Ä8‡Uu‘:á¡DmqÝ$yŽÅ°{1J¡×±u‚Í—éñ©-&ckklœŒÁYNš2¤”Eµ7±ÌÎæmÃ_E: Ú”ÆáS¡È™)Ëäe†ÅªÄfvI™ØˆÏè!8©P©k‡Pl P)ÍGaÇbÊk°ü‡ j$¸‚yD³Y[! ²Œ»—!ѧÆ>úÞ'ñ’³+ˆšovÓaÑlD~Liiâ^¥µ8dé)FƒÌ”(¸)MŒË¹°dèÐh“XÃÕ5aø%Ne¹X=t‹¸¦S™Fg­à™¡H4åÊFµm-5`@@d¦7LzœíE™ Æ–¹†”Sif–Ù4Ü–N(ÎäGÁÊfgݸƋÅbÏ€$ýL„OqgÀ~ǦB}u |zÔÓ=o®¡/Cúšg¢B$‡qŒŒ¾:ñçÕ4oJpÏ Œ¾:ñçÕ4oJp¤%Ás½á_@¹Æ$“½á_@¹Æ?RÞõxùË:çlÅ ˜¡Cæõ SÉB…µ ŠÔ0µ°¶¡B…j(bß^ Åf(1“uhRb‘QŠFuÄÃ#…þö½‘ÂÿÆû^‰‰ÈÈÔøÖ€ å·N¢È¤¿@¥Ô˜‘%©JJÌ„©("6ÝAX‰Å÷6æ;ÞÅoJ±{íoziÔjU9˜NHp™džqkÛCn’õ®,Ì$ØŒ¶÷Dhm ‰Ó"….ŒÆ£Â%æŸ3ŽOgCç"Q)n(Î䵕r"=„G´\®bù•V§šé´È²jF[¾TvÖ—$Ùd¾Í)ºÒ•D¦æB6¶m¼DáQZ¦½J¦I[ 9<§›Zeµ©K2IfÉ|ËY’&¢3Øeb·†‰R‘H©µPŠM©ÆÉI4¸œÈZT“J’¢î‘¥FGúŒx€1A;Š ª#4:L8rjA%„½™§PJ,éRœ3;¥jI’³íÌU‰áG©@ÞæhU¥D§Ce‰ÇòS i”!E•y¾¢Î…”_ì” m˜§b ÛÌØq*Ñä=¯q©¹Ìµ½Õ’¤¬Œï¶Ê±ì½ìCÝ/Ï~e*ZiÔÈîSc¹²i•޳]ÚZMFF›8´Üˆ”d£¹™ØÄdí ‰Ó"….ŒÆ£Â%æŸ3ŽOgCç"Q)n(Î䵕r"=„G´S+H~Mïm9¹­´Ã%PJº22I&ÈŒÔiI‘!%™)#2+í;à@6À?Š^\i)H¥C•-µ7&dv–N¸•{¢"5š›ˆò%; ˈì1ønªå½ °ÌXò^„ò^i·ódΩ3ʤžÃ±Úö¹m¹\ˆé˜ç£ICª\Ðh•*3kKޤÎê+#îäJoÅÄfC×.|*N rI­õU”ÃóR–ÙGÈ‹ê1pX£¹¦ädÚO»b‹mìÝÿö&õî(_ç;£uj¿OîrêóßÜwmn=£Æ$+|'ìzd B{‹>“ö=2 ë¨KãÐþ¦™èУ}u |zÔÓ=$;Œ`teñ×>©£zS†x`teñ×>©£zS…!. ï úmÎ1$ï úmÎ1ú–÷«ÇÎY×èS£Ôñ&ÃRë…„OÜò_xm*mõ¡$Úés*8J#;p–{-ÇäÂ’pÅWÑhªÂ1²H«0ÊŸTÉÜafm©+"Yk©*%')¢Ö23!åÝûP 1ªm; ·[›Lj¨ô©ŽEe—Ýq 6M¡µ-JÕ©*3=jH¸DEeq÷34ªUuè¯?K7iµ*¹éŽo¬—m6ùðFW<ñÎÙÉE•[HÏh™«+óSQ›Î´¶ã¦W"ࡵÞD¤Ïú…*aôÆD•2á0âÔÚ4žU)$“RHøŒÈ”“2îf.RÚ$Œ?Z}P‹ BˆãtÚ‹«u¹r™HŒ§ZY%N”•4wÚiQ,ø;ÅER…F4vÞÃôɪ:œô¹ ”G«Šyø¤¯eqZÈNËæ57` õ kz¦¬?©Ì· «®‘wÊs(Ìõ¼4)œ¹HÖ£-¥°Dæ7LzœíE™ Æ–¹†”Sif–Ù4Ü–N(ÎäGÁÊfgݸEYÑÒs©­ªíЬJ²ÐÃù²¥ÙJ,ª4ìÑ—tsxú+£IwEðÛ‡!ä­© eå·¬Kk7Ê£MË1Øír¿) Ú¨ç†Så?ÿÄZ‘Ô·¨I)ÊÒI<»«gðFíÁò«Œim xžV'§F‚kŸ"Lf83 hÕ²•2„$ó6n(ТRIlÌød%X“üÀÿúî‰ÁÚÏÃíyat"+¤m Sp®®UÚ®¦TªSqÖ¶{Ycyä¡$¯Ñ¦Û GÇ}…²ÆF6V!ÒN=¦éEŒ E»»vfvH«ˆËŽ“"SËV õy3$–¦F¤‘f΃W“L¿èN”ü#øˆ—+²ŠÅŸIû™žâÏ€$ýL„úêøô?©¦z$4(ß]B_‡õ4ÏD„Iã|uãϪhÞ”áž|uãϪhÞ”áHK‚ç{¾sŒI'{¾sŒ~¥½êñó–uÏÙŠ+1B‡Íê§’… j-¨ajamB… Ô(Pž¼(1AŠÌPc&êФÅ"£Œë‰†G ü;íz&6ljɱ†&PwºÑ*Kr%Fæ¹ l”I$Ùd‹-ÂÚ“÷gÈ›k,/ðìoµè˜œŒTfµ¡ÃuW(uèU†bÇ’ô'’óM¿›&tíIžU$öŽ×µËmÊä~Šeu4ÜWB£ÓÚTWó1.ò˜JÒE”ö¸k;(‰V5Úÿ«`Àóa,Ì ùÅL˜ë¤S¥Sßxß(OëM¶W¶Æ…ɱ½Ù܈¯{ôBÅ’X®.ªõ2.ðÜ„Ügâe• Û4 ›ZL¸ Y\ÌýÑŸºÚ#À˜¡WSH¬É¨³G§¾—Ù}’Œñ½ªi¤Ð¢NW ~áJI”gc¿Œ«£â')ôÔ@v•L¨6Óë‘æ6µê\ZP•(’«“hزQpx¸Æ%2ç¤àÇ(ÔšÑÏUYL?5)am”|ˆ¾¨óõŠ;šnFM¤û¶,ïÿ±7¯qBÿ9Ý«Uús—Wžþã»kqí0€D´qSôQ &I„¹ Hi2c)$ë&§,è5‘(¯r¹\ŠäcçhØp4Ù¤ØÚ‡%–NT!4øÖ"æöŸë£¼ ¬ãbÚõNžÛjJ"Nj –¥Ó[1ÛqnÞêRÏ1©Fw=¥ÇµZ}†©•)HŒÎbA)W3RŒËam3ØgbîŸ#ìï¥o¿wÆè󾕼jýߣ:k¯ü%áoùw}‘®´¡P‰TÑÖ“gÀ{]Ýêȼ¦›Ùäì2#ã#«³¾•¼jýߣÜQ¥ bjŠr¿ºéòrë™Ül#6UÓÂJË„’=‡Ü„åd‹>“ö=2!=ÅŸIû™ õÔ%ñèSLôHhQ¾º„¾=êiž‰’Æ0:2øëÇŸTѽ)Ã<0:2øëÇŸTѽ)—Î÷…}6ç’N÷…}6çýK{Õãç,ëž5³(Vb…›Ô-O% Ô.([PÂÔ:ÂÚ… ¨P¡‹}xPbƒ˜ ÆMÕ¡IŠEF)× Žøv7ÚôLND ü;íz&'##SãZt€1X³à ?cÓ!ÜYðŸ±éß]B_‡õ4ÏD†…ë¨KãÐþ¦™è‰!Üc£/޼yõMÒœ3ã/޼yõMÒœ) p\ïxWÐ#nq‰$ïxWÐ#nqÔ·½^>rιã[1B…f(Pù½BÔòP¡mBâ…µ -C¬-¨P¡Z… ·×…(1YŠ dÝZ˜¤Tb‘q0Èá‡c}¯DÄäA°¿Ã±¾×¢br25>5 çH=Ô \ŠÕYšdU´‡žÍ•N’JÉ5ìF|EÈ6`!ø-^NÿF"Ú-ÿNéßÚÿ bu†©H«TTËòŽ$VY[òdjóê›Bng–ås3²H®W5Ölþ¦{ñ‡·OÙËØ'H~ W“¿Ñ‡`!ø-^NÿF${ÂÜ'1\I‰KîÓ!%Èî¤Ì’fr£ œ+ÒSn¯}Š¿‡ÓÙ‡Ž+4ªs &X©?;)3Q’Rê’”•îfv".éŽÑ¤‰þïðã:¹íÿ,G`!ø-^NÿF‚t‡àµy;ý•HÂáaiOË‚…ÔU‰6¢B;­¹¶Œ›Q‘/2ZàŸ¶q\ïs ×RävÓ‡ÎBͶÎ<Æ^#Y'6C4,É+±lIØÏ¸F${ߟÊx©÷X^Á:CðZ¼þŒ;éÁjòwú1ï¥PêµFÒä¦êö¤ŒÖ”–lŠYû£-„”™™ñ$¸Ì®BÍZ›.—%,K&s)´)—Ðò›™\–ƒ4žÒ2Ø}Á<g•âçž×›°Nü¯'£Á:CðZ¼þŒRx/ý¿ÁÆëþUv Ò‚Õäïôcþ‹q -‡åSZuµ…¸á)*#±‘‘£aÉŽ†¤c:nÐe'VjDƒÏ*e:³y̨A_jˆ¿mˆŒÇ ö?J"s—k7ÿVf0æ>ÆUÎÿ¥sËöáÎ ©±N­´–¤?¤!%˜!­hÚJ"2;¡[ ¹º:/iF’:šqmn:KKÞ‰ ̆·ÌÜŽ³lÈЫq¤ÈÎÇÄdI«[ã^ÔÍÿñç‰z4 ¬YðŸ±é î,øOØôÈ@€o®¡/Cúšg¢CBõÔ%ñèSLôHDî1Ñ—Ç^<ú¦éNáÑ—Ç^<ú¦éN„¸.w¼+è·8Ä’w¼+è·8Çê[Þ¯9g\ñ­˜¡B³(|Þ¡jy(P¶¡qBÚ†¡ÖÔ(P­B… [냬Å2n­ LR*1Hθ˜dp¿Ã±¾×¢br Ø_áØßkÑ1·°îj·…ê•6*+Dø.¡†qÈÒù)·๚ä¢K.ž\»l’#3=˜ú©ÅKÂ4?€°Ú±N!b˜rÊ Rì“o97iB87+™­IM¯Ý¿pÆ>%*eN¢ôZ)õ2I¨ÐME3tÐG±JB YvZås"å1çÌc4ª£Ò$Çf›1Ç¢6§d¶†je ÷JY]$W+™ñÚ¥­J&Ž©Kž,Ín˜êo9r–b+ÿPdx€I©ØF¡SÄÏÐãSªÑ䯧®KÌ= FòVˆúÃI ¬d•¹d¤ÏmœGíºÕU4—hµ&ê NdÅTU“Ê.RE®eýAº4½4JʪåGM" u#½¡”eëŽÅsà[7ñq÷Rð½qé4÷dáÚóe<”¥Q¡,ÔòljQ4fVR²%F_AŸf¾³PaÀ¤Ï–Ënt8Ìe­*w.l„dV5eÛn;my°¦A˜¸SbH%D¦^lд™÷ '´„äX– bF JUš$°© 5Âq6i6ÌáܽÉ\®®"¹ p•üE‰é´8æâW6J5¡£pÛIŸ yKŒ’›¨ö–Â=¤#1ÌbÀgS†+q$ºÝ[WXJ"= ÒP–•¥)IÙÃ%ÆÉfŒÊîŸvÃËWæ²Ãðèu9-HJÖÊÚˆµ¥Ä ì³I‘m$™‘—ñ†`c{¥U§7R~›1¨N+#rV‰¥+”ec=‡³õ áÑk`;>&|˜ŒßZûQÖ¶Ñn<Ê"±XdxH 6‹Óºwö¿ÂXØ´@TJ$Æ`²ÒçÍu yRb4ûDÂxY .ˆÌ×”Îå³V›ÓëE¿éÝ;û_á,vÖ'ìk‡q~ÃULÝýyF}¦ †£i6uGcNe¼Úb;©DGmƒ½›±o9ŒåÂõ©¯—=OÅQj©Š–ÂÓT•JM=Å3¶ÙV®K.6¬©±&Ͷh±'ù(å;xgâÏHò1T6¦÷ÝUZvÄfZãq)U®D|Dv¸é6OF¯i-ÜÖ ¥®¤Í5u*S•´“hÕǬ³í.Ùm•dwÛaí§ÆÑ B Bt04¸”Ô©SßaVÜRI¨ÝQlA™æµˆŒwUìq5sís~ûá8t£š´öž«Åœûr†Òl¶—IM]+QšYlÛ/ÈVÛ‘™]f¯Nn‡…£L~ªº›#xÑ $ÒÙfLÔ£Nr<Ê3ØF|ú‰MÑUrL¨ÔX.¦ü5d”Ü6c<¦·bÉ$f“Ø||ƒ‹#`úr›D‡¢ÆkÓê¤ÊCTè«i…2•©G!Æ‹ÝHlˆˆÌøùq4ôO WV„ÄØ†XÙ¤Á[`@[¹—’²SîëœI+‚¤š)$ÎÆÚRW.1€Æ5 mJ¢ËÔÖ C‡8­Æ×¹™Fnj›3B6JÄg|·ã1ÔŽDÑtW Ã¬Qp©5 tÙÍÃD’[Æim¼¤fJQ©+Id5”…MVúÁ•* Z˜M{ª3oæ…™Õ™$«¶î­:Ämà¯)f+Šöªc؉ÓU>×í®²pgŠ46³ì‡Y83Å›YöE¸Úz+ÁÕÕÄ£|`Êî'‹‚hq©z>ªÕ£7É2ÑR€Ê3qfyRëé]Šöº’[Hír±žâë'x£@ók>ÈAa˜ÐS3-²ÃRe¡¶ÛI%(IKx‰$E°ˆ‹e‡›S~.ÄDC½‹nffZ›LÕ¼]3Dت<ÝÔéÑ×J‘¬”å^š´´Dƒ<Æ”È5HÌû„g°A:µ¾5à}Lßñ߇OߘÃê—ý{«[ã^ÔÍÿñæ¥é–d‹>“ö=2!=ÅŸIû™ õÔ%ñèSLôHhQ¾º„¾=êiž‰’Æ0:2øëÇŸTѽ)Ã<0:2øëÇŸTѽ)—Î÷…}6ç’N÷…}6çýK{Õãç,ëž5³(Vb…›Ô-O% Ô.([PÂÔ:ÂÚ… ¨P¡‹}xPbƒ˜ ÆMÕ¡IŠEF)× Žøv7ÚôLnœ6š´-U+#ÉJbW)î¦JZ3B†äí5ZÛ ÆÈÿÛI(¯¥°¿Ã±¾×¢br1õQš—†ÍÃS)’qæ§aVSs+1ªSšCGv”•‘êK•¶“¬VnEŸ¹(4ʼÌå• Zêqꎪ£¶Õ¯4’–îߺ2B‰â=œVÛ\CÀy¶¡Cfªî3§µ©2«0ÔÔÌTt›®!íD’hŒÓ~%l7þՓǰF¡F©IÑ]fb£Êz+5˜j×dRƒ6¤‡›ˆ¶©’?Ö¤_Œ„PhÙR©óâiˆráI&F&YiÖ qã›D’#Úg¬#E¾QqÅRèu¸tZÅ ¡?»,£:ˆœRŒFé8ÞOu˜ÕªVC,ÆI½­´B€Fѳ0Ì:ƒxŸGô™ÑßUb5_Zã“S¬E'RR²ãNSKë±ñ$ï°Œbp;xŒ´©D¥ÔZª&R«QeJˆòKÌ•’õ‹Aí¹ ÔyŒ¶$Ìø„$h™S¡VàèË⟴աG–fÊÒIȉ$´,í²ËSDd|F¤‘ñË4Ô¸S0<ú“OESô9‹*JM ×ë%ufVÎxê#î$Ð|VÜ]†ú¢ËfJÓŠeĸHu²Zdw²’{\¤{ &‘9¦Òq-+c¬12wಢjMÒo,¦Gý"R{TDFdj-œ"Û´G´vëli>ó‰m¦ê±Vµ¨ìI"u&fgÈ)¨â#‘øp¨ôÊSrr—3¨Q*Üšô£eM4»:î®2ZÊd[TjK¤›qšTEÄb‰ÈÚ8–jF$ÒšW {°…,ËR£Ki)¬©³âØZ’ZˆþA(ËeÅQn¢š ÚM KD8QЙpjͳ+©IkMdl+SúLê3R¶ß7Õ€#bR‰¤ü†qlšm˜í0¥¡NH+-PÐo+VL¨ò«*½Éž]¤Er!ˆÂ$Ú-ÿNéßÚÿ c¸ô‰ƒ_Ř²8•µN,?S†¹ˆRsÅ’äˆGZRgsRN:ÖFEb6ÊæW+ðæ‹Óºwö¿ÂXúWÅ4F#£aÚA1êu½v÷2¦Ödö¤’npˆ²¦Ä´û£+ÞÅs®j3®“ŽGf¤RfÔ°æ P­d&o>kµJÕ’”¤¤Ê’’,ÙRÊHÎö¿á|Q‰hX€âà’ÃŽ§Ô(1¡œ¨Ç»d<”j’ƒmf”´Þ­II¸h?Ó+‚’¸ÚIÅ4cCÁ©¨%UÒ€uŠM¬í–”ÍvÊG™I,·Í´ŽÖÚ3 !u.ùcú<Ê;;×Oc Ôi«— -%Q–·arJFG”›|Ót)%c#.ZÀRª¸Ë .«VÄ(4ÚEM™6êgO’§ž~šBα™9t¬IËú4š¸V3ØÃ 2»¹ñÅ/ î\Û¾›2vèÖ[W¹ÝŠŒ™m·6é½îVÉÄwØjU?J*ÑÃRá§Si¦>ù¾ñ›OMS¨5­Fáœ`ÍJ>™ÌÈíìÑ=.}E˜J‰TcsϧÑ!E”Öt«Vël!+MÒfGe•È̹˜@Ú÷¥ÿç&ÿïÁ¥k:»X©ÌžÎ‘k”xë›,™‡s“m¤¤ºGkÆZŽêÌ{Tg·¸V"­I‡›OߘÃê—ý{«[ã^ÔÍÿñ?Ò>v¯MÄzQÅsi ÓÞ\ÈÈ8Ƨ›$d$Ž)câ-¥´ËiqˆV·Æ¼©›þ;áI-2TJJ²§ lšZ4’Ü~Kl6“Uò‘­Å%7;Š÷; ·$1 =8Riµ)Té­j¥Eyl¼ŒÄ¬«IšTW+‘ØÈö–ÁçÖ˜G©ã ×ðôZ¾³skóþ‹+«Ë•jO´¯Å~!•í`Â}ûøNôÂìžÖ 'ß¿„ïL¬O¿ Þ˜Hã`“ÚÁ„û÷ð郵ƒ ÷ïá;Óã`pïS¶ iÃmɶQq–©î”x+š Ñõ“"¥2zõ,'2‰ “ö=2!=ÅŸIû™ õÔ%ñèSLôHhQ¾º„¾=êiž‰’Æ0:2øëÇŸTѽ)Ã<0:2øëÇŸTѽ)—Î÷…}6ç’N÷…}6çýK{Õãç,ëž5³(Vb…›Ô-O% Ô.([PÂÔ:ÂÚ… ¨P¡‹}xPbƒ˜ ÆMÕ¡IŠEF)× Žøv7ÚôLND ü;íz&'##SãZt€M¢ßôîý¯ð–;[JxVn'Æôvâ%ØëcÔÕ¡«3n$Ò•Mv2”¢+æeG—IBˊ㈴y6;ÓåÔ$¦,T)dãÊB”H%!I#2IŒ®eÄF;;¶#E>2ÈÉè€c&`üeµ"¢Ñ ñ][ â½:!¬ãGšêééˆÊ]RJÄ”2’Nb#=ZÕbÛl5Rƒü+ŒÀ˜.·E‚ö©DŸêcÑ×6 ¶Ó¹É(RHßy$O’I+6±%™]ÉglFŠ|dÿ‘“ÑlFŠ|dÿ‘“ѧà—¨ù èꓽ/Ôp…]¥ÉŽƒBž•D(‹yÎ%=u¾dµc,çs±Ú7F¥S#âåOÁ:9ÄöÙÁ5V$´ô7éÅ*bœ†hgZd“׫"ÈßI™«Œ–¬‡–MÛ¢Ÿ?ädôAÛ¢Ÿ?ädô@!Ø ȬâÉ”ƒ¡¦CªáÙI–õ? Ê¢¶ÜÔ?ØR÷­}œR\Ê‹ÙFF»Iþ†YÅ ëó2Ê&ª1S %£»z¦Õgä#Ÿy9‹ÿí¶Ïë:þœt;]¤H¤Ô1$Ë ‰.”tN޳"2;!+";XÈŒ®W#¹ô@Óæ‡éðcÀ…]n22œ3ƒp–Ý;× ‹t²˜în™ŽÉ³)¾VS­Z²4YŽÍ¦É+ñ ˆþÒ6‡½V«ÃªPdM’ª„ç%>ÃÑ—Pk3Õ“…!wBlÑ•’[GŠdJæ$Äë¡âZôªDª^‡5ÕPç=ƒœúä!çRw%8Ûg9PåÓg8I3Ü'„°¶u稱ÔËŽ¶†MoMvBÒ.iiêÕ«l®vBl’ä)Ú=Àó)4ªSÔóLJTÓ⡚ƒíE$¥:…© %:Ý›¡ÃQ¶‘€†Ð¥Tô‚tÝø®Uh¹0]6°[ß1q?Êå뵎/!–roP›!WG î“Ø6.Ž*³+Ú<ÃuÊ‚ *4˜²ä$“b'e+Q[¹´Ìy±6 ÂXso¤2VçeQѹ¦;ìªÙ™^©iÎÑØ®Ú®œBBÊ¢²ÊeL¶ÚIBdD’-„D]¬ô°¼`ÍlŒ Ý%úÓ9\j5Iµ›RIÚÙ)+FEžË(ÌÓr±Ø2uÄ Ž«¨Uô…“K—+P¸°!Çu·XoX¯gqVZ¶B"4‘p¸FiNÊÄX‘LV¤°ÖÄrÒÚ‰:èôõk2"¾S3+•îWâ>åÊÆ"øÒ«:µ†eÓ"áLL‡žÉ•NS”I+-*;ØÌø‹Qg=uOüyâ/ý7þÕ¡­FÊêŸøóÄ_úoý«CZ‹ª™•nlÑÙešbÒu9홿MŽò­«ŠwÌ´‘Ýg½ìI+Ù)"ü—5ºŠe*-›63Ðâ¾þ¾"vRžm+Q†YÑcQ ²m—–ã Eĵš$g¢°î´ø <¦”âm{ÔÃGs+–]–¹ßPÁxJm1º{±VÛMM‘=§#Ïy‡š}÷qå¡ÖÖ—N¹r%YVµˆˆƒ*§‰×…pÅV¹UL3ßÝ|¨“DÝÁ5XÌëF•ð³pò™f4íÙrO›PÁ ®¡-ÉÆ›: IrÆ·Ñ[Ì6⌸Ԥ6•÷Lî.T0n›C§Q— £Ä¦[pî9ŽÅv?Òyiiq7#2;+…s½Æf—G¥F¥ÓVɦYlÈ’„—þû "zEMmP¦vžÕ[RgSÚZãšÉFvY!IUŠä{/{*ÙOR`J¶•ë˜?ÎÒ5‰Ca¸²cƇ‡ C‹A(”â”n­$ÞÃ$Ø=ó’ršöŽ5ĸ¨ìЫµJ 3°à©ÆîfgbVÂ3±—Ëm¸ÈÈ£Êü©ÔIЙÂX¥.HŒãH5SŒˆI2+íâÚ(—>uM|=„û© Òtjq¶ú¨uŒI…X}µ´ëxZ…¤ÉIQ-Ò22>#!©Ñ V,øOØôÈ@„÷|'ìzd @7×P—Ç¡ýM3Ñ!¡Fúêøô?©¦z$"HwÀèËã¯}SFô§ ðÀèËã¯}SFô§ B\;ÞôÛœbI;ÞôÛœcõ-ïWœ³®xÖÌP¡YŠ>oPµ<”([P¸¡mC Pë j(V¡B†-õáAŠ Vbƒ7V…&)¤g\L28_áØßkÑ19l/ðìoµè˜ÜxnœÉá·*ŒPˆ%&JÛ~:”îX­PiqIiIWÔ¢ÌgbÉúÆ>ªqRðŠ€šPàá|AˆÉ¨ì•!„Ñ¥½!©N:¶Ó%¶^Qf‚Rò&ÈrÊÛÀYp¶°mQ#=Sr#XŽŒl4εs§›j×"ÊD¶ÉÅ+ilJ øÏˆŽÞmÃA ÊS(ˆ¨ÓÿíL›Šfg ‡s(О$ÊëI£jJÇÇb#1•˜Bø–ŠÅB¿DÓõf!Ë„ÛÏkH”ffž ,dyMУ"RÓs";’jˆ êİ\m1k0*„²3R¢¡ä’?Që[Aÿºã)Nª—E‡W]r‘4·ÜŒ[¡n’›u"ˆ›>2ZTJ+¤ˆøF“Ø'0# $5\%:›rß™r©Ê" ·oG#Y ”®C,Æ’<ª3#Q\ˆ~BÂÏÈb1½U¥Â“1$¸±$º´¸òL쓹$Ђ>æu&ü|FF GÀgé˜ZDÊ\ÚƒÕ*|àKDYˆ”n%lš‰F•%˜ŒÐ¤Ù7UËjH¶E/ ÊgQ)©—H‘»ÜiÈO¼N.$‚5™$”DŒùT´š %c½ìW0Ý0Q‡èTº† ©TeÖ)ôùLÔc2Ú䔃ȅ6ú”Viµ‘æ4¦Ç´ËV«å¹fñÂÆôR—&³K§ÆuÅ7É*t·FS±š (R‰7þR‰%Üã#³t  %>Lмg¦@„ý%´½!QfhÖ”Ф¤Ò¢,è>;¨”YIBó˜x¢Rê²"ÖpýU§5%fɺ¥¡ ’†Ï&fӑĨFJ±äseîvÐ#$È ÜtÉoâ$fªl±MÕ¼F£Î¤)DÙšM*I‘¨ìŽEðÄó]Ÿ>,§cÓÓNY¢cÒTdÛ*%eÊyIF£3#"$‘™ØÏˆŒÄa§)THµƒ«S&F™!lÆ(ËqJs"Rk]”‚ÊDkIYVUÏbm´`‚' @ºK‘Z«3LжóÙ²©Ã2IY&£½ˆÏˆ¹Áì¤?«ÉßèÄ[E¿éÝ;û_á,w¦’±ƒØ=š#¬Ñ^«oHâ8Û.eq¦“ù:”å=b’ˆê³ecQˆï°Ã;éÁjòwú0ì¤?«ÉßèÇj=‹ 'R)í*;´ú•e]5DÚaqRGÅcJŠVl×+;·¹y)ÚJÁ“ã¿!š£ÈC$ÊÕº HaJmç ¶ÝB\AÚ5¨‹X’4™ÐmØ'H~ W“¿ÑÅh/H)+ª˜¢/ÖÃýî)X’‡n!Ú‹f¶ª Ó\JÖ¤IthlÉ$fFdâˆîfDFc×X3L ŒÈÈŒÈËè1„{ãÿ~ ýóÔ´3Ž)ôÉ•Pˆñ#¹%Õ)¤‰  Ö­ªAì“îíâ´Ñp]uTLO‰%Sg¥´ºM® ¥®%%IlÒ¢Øet™ØÈËŒŒ‹ËŽj.TÄŽëeuàI4Ü„-µ#=ïvÖD¤(È“r2#+lœ8Ô{¨¹ª³4È«i=›*œ3$•’j;ØŒø‹xD›E¿éÝ;û_á,Y O`!ø-^NÿF‚t‡àµy;ýì½%c°{4GY¢½Vß‘Äq¶\ÊãM&3òu)ÊzÅ%ÕfÊÆ£;ßaú^ÅЈ©ö•Ú}J2®š‰H"m 0¸©#â±¥E+6k•‰Û܃ŠûéÁjòwú0ì¤?«ÉßèÇdÓ´•ƒ'Ç~C5G†I•«t@”ÛÎmº„¸‚5´kQ±$h.32-£1+Pã-Ä;QlÖÕAšk‰AÔ‰.’ ™$ŒÈÌœAòÌȈÌv Ò‚ÕäïôaØ'H~ W“¿ÑŽ÷Ø'H~ W“¿Ñ‡`!ø-^NÿF;ÜpG`!ø-^NÿF‚t‡àµy;ýïpÀÇ Í ØéÆGúØ£Á¸ÿÁß‚ÿF;SÌÜ ®QªA6ÓkqdÃkqj$¤ŽÉBÔ³äJHÌøˆŒÆ²Á:hÀ¸Òºš&Ä’ªSÔÚ6ÑRI(O”¥6IIm"ºŒ®fEÆdG\¥ÎØØô³cSʯ‹1f¥kŒ„Tä¦ÄÙ"å•F“"²Óm–ãäžÈ8÷Ç|KçWý¡±:¡uýhù÷Ý[®¸ª¢Öµ¨Ô¥(ßlÌÌÏŒÌû£K !´pGeìc×èx˾m,Цʧ)K+LÎɾÎm>²´ÿã(òÙÞÈ–õ ûíSý—¿ý¸Þtlv‰šE­atÅBL))‹i½™](¬Iq»X²-(“$ÜóVeîLŠ/õ•§ÿñG–ÎöC¬­?øÇŠ<¶w²:~6‘(­ÐÓR«%ø‹v­P¦Ç‹‡f>ùÄ”ó Z[e³#&s’d’UŒÏŒò1ñÆ‘ Ù­VãœVi¥Tqó%%´Å3Yk3[a¶¢4û¤ÛiÊáÉýeiÿÆ­¥éõH1gÃv–î²<–’ãk²Û2ºTFGc"?¤ˆDò!Þ;íJðœ.}>±‹Ñ[Í?¦lvë¡ÖÕI£YHQwt„O±æñ y¥dláÜ?Aß]â¡S)ZýN»qDmf\ùsd"½®v¿ÌRùó;ÞôÛœbI;ÞôÛœcõ-ïWœ³®xÖÌP¡YŠ>oPµ<”([P¸¡mC Pë j(V¡B†-õáAŠ Vbƒ7V…&)¤g\L28_áØßkÑ1¶(1éS’ùb5Qk HQ’žmÓeMeNSJšB–•’³Þåc#OŽúŸ ü;íz&'#U­xN\¯Sű_“Q7íH“]ML¨µï:Ë퓪+g2"u 32Ìd‹Úçaf…Öí,æGn·J~rÛiLÏ™LqèØ×¬l¶Ô£3-Y’ÔßqEbØg æÚ6BëG1–©;_¦›T¼…=Æ)îGCFÔ§à¶ÛDVRVDœ¥s;š‰73L?"Çt©«œÌø'Ç·â¥Ì«JV•«)8”ªåc-¤[K“hÁE8*Ül²˜5¶*Ž/1¸l0âÙl˵ĤÌÏmË-ŠÅ´ï³$éÓŸÀÔXõ ¹iªIuöVÛ×a·Pµ6i2-JŒÉ&£²“b3¹làOjó¨’kÚA–ÕzµTBÕÍ—ÿÊ rÚ‘”¿GÁ2Kf“Í”³XÍ7Qc¤*[rJmq4õ1æÑN¾§VƒUøžc³ãFŸR®3=¸&‡Mf‚)¬¢FN9k¨¶!_÷s{©3¨‘«Ú>–íz5KB<É—Ïsš%»#)þ„f— %—1f#¹’l£mj6õ.‡W J®D‰¬ŸC2ÖËÊiÔ´™VRJ dg­I–d–Â;ØÅÙB«Ó ÃU}¸JK±¹Q]´–M底‘6KÊ¿Ò(*±l.ˆ Ñ:b£FªJĤåf=-™4¸´èJ˜ÓÆn“.G²ÔM!yxÌÏõ¬ˆ¯´Ë …]€Ý7.§#ÒiÉf3n!ÕË) ;b4!D[2ºŒŠêOræQð ¢Iˆ*™…#G­CZÙ‚qåž­â(ªT—]ºî߉/LÛP«_‚jÍÕ¤S«•ìe,ýd õªµPj+Ëi¤¥n[Zœ™Ò›H4™å;(‹ŒŽâ=ùÓiÒ“*Ÿ2D9 ÷.°é¡eôÂi|[ ‡âÅ›» çNyN“Jm ̈É% –D£GÊæEsJ¶lé©T'Ô应Ù3d(¬nÈuN,ËéQ™0˜Œ@&ÑoúwNþ×øK@1UUV»„çGq”µF«¹6A8fJRTr$XŽêÎúmŠÄ­·±Îì#Wn…ˆâU]Š©M°¥fe.êÍdi4™¬«Þ;è~ÛI$~õ.€Õªè¶t¼ESŠÍF4|+3U©±Ù,Û¢³×Ü$²›%¨Rȳ‘¸i"ÊEoLŒ‰ñC“ÆD„¢Ãò¨±“KyÇIg ÚRßQ­Õ™ åAfËup`Ô=¶’çˆKM 6‹Óºwö¿ÂXŒŒ®«·BÄq*®ÅT¦ØR³2—uf²4šL‰VUoŒY¢8ª‰*«]Âs£¸ÊZ£UÜ› œ3%) ƒ*9,Gug}¶ÅbVÛØŽUÑléxЧšŒhøVf«Sc²Y·D7g®1¸H+e6KP¥‘f##pÒE”ŠÚ«¶ÒG‰½K ÛI$~õ.€Þ‘‚±>(rc¸Àè”X~U2io8é,äJ[ê5¡³#a¼¨,Ùn®ì,!£*í7Ñk•J”Ô£r¥^mœöz¨dñ!m\Ší’e8žŒ‰†,[Ú»¶ÒG‰½K ÛI$~õ.€Uå^ÛI$~õ.€;m$x‘ûÔºT•{m$x‘ûÔºí´‘âGïRèuPUí´‘âGïRè¶ÒG‰½K Ñ£ßÛþ¿úˆQ0݉QªÔi˜¥Õä™î²Ù%R"¶e~Ó±lÌ¥«Ý)FzuAQq,–¤Vôr¹ki&–ï^q I’–È®{.v¹Ø¹b;/`Ÿè§ÿÌ/{³ 4ûño£¿ÿþ3cL‰ö•ô…ShTêvÞ8´}Ñ‘¸äç×{T’2±¤ùxû–d:‡¨oßjŸì½ÿíÆïs¹1XÀ¦JC «ÖY©Ó$Ç37a¸Ü(Œ¡Í¤DK'#¨í´&D{¤Ž?ÐŽ–‹FmËË@UMÙ«+v“$”«%ÈËV«Ÿ¶Ü»£fvÚHñ#÷©t6¦ÁxÞ‰‰XhðìÜEEiRâ®KÍDuº„ÝÔf‡uJZTƒCeµr5•ø”-JÑDùp0ì9s :ÚdÌ^"l¢D¦dË)«e¢±Ý:ô!U¿D§;§cÖ¶’«9FG‚6ÿåK¡¹q}“ˆéµr S©Ó36û–ÅîGrÚFFDd¢±‘‘Œ+xR8íFŒÅnL²Ò m ¹%)Il"""""âý1àçßq÷ô\·]qFµ­x‰õ)J3¹™™£i™÷EptÏ„!MbdmêßaĺҷýÓʤÈìmØö—tWjZãJß8³ë¹ŸÇX –+ªïî)«W5Ÿ|f½/SŸ6¯X³^\Ö+Úö½Šã,€+|'ìzd B{‹>“ö=2 §¨×ã}U¿é iaºz~7×õ[þ’O"œ%º:þýŸø„HKtuüÿû?ñ G4Ëç4ïxWÐ#nq‰$ïxWÐ#nqÔ·½^>rιã[1B…f(Pù½BÔòP¡mBâ…µ -C¬-¨P¡Z… ·×…(1YŠ dÝZ˜¤Tb‘q0Èá‡c}¯DÆÏ¤ÐÕ6 Ï•RK‡­6Pô³pÉÅ‘šR–е‰I3;X³Ý£Xa‡c}¯DÆÝ¤½2.KÕ u: ¦¸†Ö¥© fFFóåZé3N¯Ý¤í°ŒÈíªñ/ R°œö*LÃ)P_Kô÷ª,HeÓSN²ÒZŒŽ×#ý Óc";–ÛqŒØxu•áüXÔŠª”Ô0ìé)iNš_d÷4Œ¨R’IÍÃi IدÀ;ØxéÓñÑ*Õ÷eTž®cZÖú!™ºN8ÚÕ´ˆ––Ó˜¸³_i.é€3 ͨ;‰ôV!ôÖ$ÕõN>j4ºüSq¤¥K>5f5>‹ŸJÇr!މPÄ«tÌF¹ §Åƒ%nGu6j©AêuiânîêÐYmrQ–Ò0Ü €$š,}øúJÃNGyÆVuH횣IšTâR¤Ü»†“22î‘™ ´\Q]^©N:ƒÉ•§¨o$츸ܓZ2ÚÚOT‚²lV/ÖbffÄ‘X¶©PŒÒWVëz$è¤M‘š¤¸Äeºá'åVòïÜ2¿ \ê^fnµU›-u8õF“NœãŠ×šI S–sÝ!DÉ–Þ «e®P‡‹Ëm‚‚Ó©“šBœZVÎC,‰"I¥Y¸1šŠÝÌ¿¬†Ì®Vêsô‘Œ(re-t»UÌ¡ßô$¦š}Ä,‘ÄK΄«7öíYs¦·£ì6ës$!Èuyû•itÈØ²",²ø<#5lˆŠ¦F¹N~ZI’¦Öü).GqM™šMHQ¤ÌŒÈŽ×.B1´«R«um,U˜©H¨Tiñ*““‰+[±“ ’ñÆh’«§„¤¤‰=ÒÙÄ#ÇQ¬Vp­uÌG&T´DK[ÙFjSR ä–­{H³tͳ€Gmp½1¶y)'t ÛmF¼†›(ÐF¤ØþJŒÓ~í¯Ý|qŒ1,z¡Gf±% K¡ÂnZs\¤ë`µ¬S—÷j<ÇÂ;™l±•ˆdªOoI.ÍT§]yü(K’n¨ÖRy‰Ë9vF´¥FJ½ÌˆÃtóȶeV£[Ñüéy¯ÎzR#qÝ}fµ¶‡’kAí$™´ƒ·Á. T1d¦Ði‹t6êLîhd›Ç8„²4=—Ü™š,¼üwÛ{„Õ©\’ûò¤»&KÎ>ûË7qÅ”µÜÔf{LÌöÜ[&ÑoúwNþ×øKÕQÁº;¦ª*j1âC9’1?=Æõï(ŒÒÚ.²Ì³$™’KiØù è·ý;§kü%ŽßÓ& v«€©&ز± Èp‰F•ý“P2RL¶¥DdFJ-¤dF[H@È/à4Nj à2™o4·š`æ¸N-4’ÖIÏsJMÄ™l#ZoÆB÷c¬àù—½±®ªµœRÆ:Þt6©x‡‚«ÇÍQe¨»O8¯‘q]jA¥Iî- "àå3Å`7±& UJ ÂTç9:¶qdʫɨ4ëKeO±Ú(©W 3r%¬H"J„àm®ÇX7Àÿó/{aØëøþeïlkÊö,ÄX«W1®rth±!Æ6µmå[4ºƒªÊ…žf[=Y(µ!M½dìxj}N¯3ÖØ§bæ7µ¬?+Ô|Q&®ìU=Ri©ºÞiÂA¤µW^[®äIY$Øs±Ö ð?üËÞØÁKÂXM‰ kxóe¶ÝÖéw?ÚÊ%6="˜Í:+³]e¬ÙW.c²;¨ÔyœuJZ¶™Úæv+Xˆˆk,a§q]m"5z­A–¬«>›%lºË„†yœèÛcAŒ¸¬¢Jв˜cq7 Q0ÔÊ›uºÊH•Ìw.e(’FvVÒ#;Ûeík—æ©‘ iž»)e†“(Bxˆ·3_ï?×ݪ «àí T#â,SVÄ•©:‡&I™9×ÚmDâlÛ)pÏ* ç±)g´ìYR9Õ?ñ爿ôßûV‚’ZÔv¿SÆ Wte]Vè} m´«\´Ù$Ëgk%D\fcŠyu-|SCÿiÀhJˆØcF2pùâÇNzŒ–VùÔ©©Q‰´_2õ„æ\¥c¹ÞÅcäÇX7Àÿó/{cHImxC©@§0…¿€ܶÒW(s—N$¡â.â<¨W#™üµ˜ÌiZ¹Š#齫”ê3ÑÊ9áÛ‰¥@K…©B”¤Ãj;ˆ›wÄ)&jU’I$£b•8_±Ö ð?üËÞØv:Á¾ÿ™{Û*ÍJµÔthÝFyL­NLºtÒyzÖ)®š—++—ºTÒëh2>¾9«5ÌN­).<ºå>ŸTF&Ô5N&”—]¦ëò%(¦sid¶,¢{9ÙG™KI¤˜_±Ö ð?üËÞØv:Á¾ÿ™{ÛSÝyš¾"W¬Î˜õr³¶äÔ^[ 0ÝIô!´2jÕ–Ri$J˘Šé#$ðFÁ §c¬àù—½°ìuƒ|ÿ2÷¶%`NÇX7Àÿó/{cÏPÑþb2MjHÏüåÝ»þð™gà÷Ù?ú‰û­Œ'àù·}b¤8}š~%¥Ã¡4ɳ…gN'–ûŽ|ŠBH‰Gb·ïcÛkZÛ|Qц Å8¶™W éaÈjp‘V‰¤òPãIIÙl$••·ēٗn{fI“žÌi¸‡‰â´§TÛ8 [i7]S«2,ÄF¥¬ÍJ=›T£3>331XYÇBM¢ßôîý¯ð–#"M¢ßôîý¯ð–/*»ª£ƒtwMTTÔcĆs$&,b~{ëÞQ¥´]e™fI3$–Ó±ò «À¸ š‚¸ ¦[Í-æ˜9®‹B $µ’sÜÒ“qf[Ö›ñÇ銓»UÀTŠ“FìYX…ä8D£J‹þɨ)&[R¢2#%Ò2#-¤"ZÎ)co:T¼aCÁUãˆæ¨²Ô ݧœWȸ®µ Ò¤÷…‘pr™°6/c¬àù—½°ìuƒ|ÿ2÷¶5.{bT Ðq|%HÞs“«gLª¼šƒN´¶Tñ;¢Š•pÐã7"Q*Ä‚$¨eëØ³b¬!\ƸMÉѢćxÚÕ·•n<Òê«*y™lõd¢BÔ…6õ’w±°6c¬àù—½°ìuƒ|ÿ2÷¶5>§W™ƒëlS±sÚÖê>(“Wv*ž©4Ô‚Ýo4ƒá ÒZ«¯-×r$¬’{î‰MH¦3NŠì×Yk6U˘ì§Nê5gR–­¦v¹ŠÄV"" ¼%„ئ·6[mÝn—sý¡ƒÆ4Ü1DÃS*laÔ:ë)"BW1ܹ”¢IÙ[HŒïm—µ®\c%¥Œ4î+£M¤F¯U¨2Õ•q§Ód­—Yp“°Ï"“lh3±—”IQkˆ6¯ƒ´5Pˆ±M[V¤ê™&dç_iµ‰³l¥Ã<¨+Ÿ Ä¥žÓ±eJh³JõHDLõØpÙK,4˜ÉBÄE¹šÿyþ¾è׃euOüyâ/ý7þÕ¡­EÕ+|'ìzd B{‹>“ö=2 §¨×ã}U¿é iaºz~7×õ[þ’O"œ%º:þýŸø„HKtuüÿû?ñ G4Ëç4ïxWÐ#nq‰$ïxWÐ#nqÔ·½^>rιã[1B…f(Pù½BÔòP¡mBâ…µ -C¬-¨P¡Z… ·×…(1YŠ dÝZ˜¤Tb‘q0Èá‡c}¯DÆÇ¤Ök…-Tš´úy¯Ýi k7Ó”Êã\a‡c}¯DÄädj|kCÕ¾5 òß=ß+wóîrµ¹¹s^÷ýw•\­ªªUeV* ¨––rW®.绽ÿhÇ€óa,å½ÀÄ•s™Vv$”IQ.Q“Ž©™$n(•²äWÙ´®[8ËÍU­Ôg2PUR©¹Lifq¢I˜§RÊ’]ÄÜ‹eÉ%ôÆb¢:m6csiÓ$C”Ýò<æÚÓr2;(ŒŒ®Feôô9\­9T'+Řñ¿)•IY¡÷ ÈÍkMì¥\ˆî{nEÈ1à'!>·ZŸPj¡:¯P•1’$µ!é+[ˆ"32$¨Îåc3=œ¦?%Öë3*,ÔeÕçÈšÁ¥MHvJÔëf“¹Tgr±í+Ä £X³Uz¬Õz¨ÝEôjÝ–™nÎ'gK¾c. v÷ yݪÕ¥3Iv¥1Ês Ö5O¨Ùm[xIEò‘ð•´‹º|£ÆˆéõšÅA–ŸVŸ-¨ÛCÒ´µþÉð¨*•š½U-&©U8š+6Rd-Ì…ú³Øx@1!X®V«:­ø¬T*:›ê·T•»’ö¾\Æv½Šöä!èë«o–ùuÉXÝÚFéÝÎkuwÍ“6kå¾Û^×Ú0àìj«Tf”õ%ª”ÆéϯXìD¾¢eÅlá)ÊgÁNÓ.ár =/&›N†ÔH•D= ¦šßw¹2tãšO…˜‰V%’oܶÁ šb@€’hÉÖYÇ4ÕÈÄvó-&ã$͵]J2"+™m3åÙCGž:áß:1í è·e xë‡|èǶ”4yã®ó£ØùÒ>‹vPÑ玸wÎŒ{aÙCGž:áß:1í è·e xë‡|èǶ ÌnÜŠ´‡iØ×FíÄ5Y¢‘XÌæR+]YLŠçkظ¯kŸñ@ÀëºýpëT‡é’±æËÙs)º½”VQ(­s2ã.A¡z¢ê*ºd®Ï¦N:#»ŸVügRãk´vˆì¤™‘ØÈËé#ø#;K©ßàúŒ`Īâš9 $+TíE”-$M6©5Ý'tžÃ!Å $}ì¡£Ïpïöò†þ™ê[BLÛQÔ£""¹–Ó1(}ì¡£Ïpïöò†tøèml@B“w•%*Y ”H3̢̤‘šH혯kñ‰Ô¨q ¹ŒšˆÖ¡§(Q$$fdÉ»" ŠonÞ ¬Ó·nÁí!¹u*^,vHÞøÔ×W5„Ó#¥•:Í’mš LÜRÙ;Ú宨eb´nà†PcaúmG|°¬)•Mt™EP¥­ã÷å ÚPÂÛmH½“•\.áGãh¦RçcŧÀ™ª\yqÉøj4´êžŒWo\’pZ周–œ¹‰E`Ü5ð z®åaèï= l°LžâˆˆévÊR³©("Nn®D[BA>kt7i´¨”zlÈïBŒûæüD8ì•<ÚV¢' ³¢Æ£Ad4ûž[‹dC€lš“ñbâ½$ôR\f/r²pZ$0mÎe–ÍI,¶JÎä[ü¬ÃÅX¦Qfâhô]Ý£Bi-SÛCFNËSëh‹V¥–T¢æ›YE²äF+` …†Ê,ìC‚ªÏÓiÈv}\àÌcr7¨}²[%ŸTe®O);ˆ+ÑÃ-’ðÞ,K±Xpš§²ê[ RÚp¥°‚4¬Ë2.•¬ŒˆÊä{ob´îÐнaTÌ5…E¢ë¤ÓVr$;LeföI/¶’24Û1% ºÈ‰gr¹žÁÄèPq A©-La§ 7"+1'©ë-¸M¯>ÝZMjIÿ+aT2ÔìWÙ¢ÔÛÌËèJRwQdRBspLŒìJ=—'ÚÁ„û÷ð醅êbøÙ§ÿ´ßñÚ;¿>ÓíüßI›ïÖ¿vî…nÓ¸/ŸY|ÚÌûs^ù¿X‘í`Â}ûøNôÁÚÁ„û÷ð鄟ã"1{µƒ ÷ïá;Ó ¤Zæ*Ä•ýâ:‘ÑQE¬Už› ,vœL˜ÉU&r›K‹RÍ.¡G˜É(Ê¢· ÷+¸éB~ÀuwúÐÿøÍ¶Ó(‰!;…k†ä­j”nžµ9_èÈdjIg;€a»X0Ÿ~þ½0v°a>ýü'za/Škb:E½ ‰2£ ¹Hv[1V”é¨}„­j6œ4­-Ô® œ+ð¶yð3Çà` Î$NTbʘð#<Û±Te¥FâÜQ-&–TFœ©4š‹„«˜F;X0Ÿ~þ½0v°a>ýü'za¿@‚í`Â}ûøNôÁÚÁ„û÷ðé†ý µƒ ÷ïá;ÓkïßÂw¦ôh.Ö 'ß¿„ïL¬O¿ Þ˜oР»X0Ÿ~þ½0v°a>ýü'za¿@_S&d‰×d©ÆÒ¢Ì”¥Ä™•ö‘´ì®Æ8Ü}?Ÿþh¿êÿ©˜1X³à ?cÓ!ÜYðŸ±éÝ=F¿ëú­ÿIK ÓÔkñ¾¿ªßô"yìá-Ñ×óÿìÿÄ"B[£¯çÿÙÿˆR9¦_9§{¾sŒI'{¾sŒ~¥½êñó–uÏÙŠ+1B‡Íê§’… j-¨ajamB… Ô(Pž¼(1AŠÌPc&êФÅ"£Œë‰†G ü;íz&6K™ìPdÐÛT}Ã%ä¼êN+JY­;dá§9XŒÈˆŒŠÊWÊUõ¶øv7ÚôLNFF§Æ´=ÑêÓ˜¤?JmÆÎ#î%Õ!l¡jJˉHQ‘©²Æi2¹l;öÍÅUÙpžˆô¶²>Y_qšCÏ•ïgJIkÚD|#;Œ 6!,Û˜®¼å14åÌBšLrŒKÜÍk‰’+z̖ܺٗ5­³ˆY¤b*µ.)ÅŠó c9¸–äEiô¡fDF¤‰VEl-©±ì.AŠÄ ¬lCVŽŠ¢JCNY‰«‘·–éfÍî–“RO5•t™Ò“ãIXf­QfŠý¹JL ¥çY±YKOÞ×/ ŽÇb¿[ˆZF ªRãœx®Ç[9ÍinLF¤% ;©$âTIVÂÚV=…È.ÀÅU¸RjüiÔ¬RÕ22MÒ%f±ëP«b#±wRŸ’V€bM0î%§C¢Ä&¡ViøÙ¸(ó±¨Î̼»9aÿ'6Û¨¸ì!`ÆfëUº”TAAÖ_S²›~2Rdn™J…lÍc±Zæ”™ñ±tz¬êL…½ä ÜFG¶Òãn&äyT…‘¥Er#±‘í" @ÈTkU9ó™›"Q“ÑȉRÒY";‘!("J æg°‹iÜddcX뎦«®Í8´ð¯Ç~2#•ÖVŸücÅ[;Ù²´ÿã(òÙÞÈdv~¹Ÿoïk™ùÖþñ0ë+Oþ1â-ì‡YZñylïd2;?\Ïη÷ˆ5Ìüëx‡u•§ÿñG–ÎöC¬­?øÇŠ<¶w²Ÿ®gç[ûÄæ~u¿¼CŒ:ÊÓÿŒx£Ëg{!ÖVŸücÅ[;Ù ŽÏ×3ó­ýâ s?:ßÞ!ÆeiÿÆoPµ<”([P¸¡mC Pë j(V¡B†-õáAŠ Vbƒ7V…&)¤g\L28_áØßkÑ1·iΑhÖ²Í K*¤6Òò¢¶§’•·!JJ\4çI²ÞÂ>áü¥_Qa‡c}¯DÆÕ…:–Þ©RÝzaTdN!¤¦:Mœ­!ÔÙKÎJ#=rbOÜÊàãêüKÃ2î£oäJ,|Hû“j,Çv UN$¤Íö¶ÐéëOV£5‘pIeÄwäÅÑ(0$QX«Õ$@ˆäµDmlC×åZR•¹ÃNDÙek\Îʱl=þÃÍi…^iú£”êz ›¹¡¶—”¨Í¡J5¦›+T“¹¨­˜ö^¼/\£QãºÛ³IUWœ¸ïÀ§ÖZ[iLF’áÅ#ÛÉ$¤Ô’Q¬“Æ[ÿ¨^ݸUf±JbUiµ?-‰sÄiÂV¥—SÃQ8œ¹Öòa+)$¶¬ÌOxóU¨t†¨Ój”ŠÛõ¢Ìµu´¼Êܾՙ’’¦–ƒM­°Œ”w±†‰Ù6¡N7T€©Ž-öue·Ríì¥fJu+Vm†eü’=‚Þ¨R“F¨Ñk ˜ÌyO1!Åi.­4N$ˆÐ¥$ŒŒWòŠÆEÆ2²ñ‰}ÚcÖÔ {ôél¾” ÜiŽ™HY(øJKëØià™ÕzÙ”œ:škUxçÛ)h%‡!%¹J‰Fn¶a“‰,¦[T¦’;^âKT¤ÐOL›ÛF«O%xl Š’Ñ5zã&òºËI/)m$ðvÛù"#WVnžˆôrŸ&BÎä™m¥£BHŒ‰´¡+QÌîj3¾Â±ÛÉ ¿„» ÆÅ¦åoZºÉTä7¹šÊÑÍÃi¬ý!šò–s4X®yT{NRŽÒ)¥ª«W¨»¼qÚÔF'ÝuÂI)VI©d’“s5º+÷24ü%Mx©Ë¬“q¤S^ŸaG3C‰m Y’Ë1 ôN$̳YIØF[Gšê´·(uê(†ÄÇ$–Äd)ÎR•Ú7¸DÛg±|#÷Wn ¡¦ºÑÈ:Œj\:<šl][yåk›u&µ‘­\'Ü]ˆÏˆ“ÿx¦r†*©F§"†uzEQù¬µ%¤!ø„Âе¥jA•–²RL›^Û‘ìâÚ1ÕZ\ú^åÝÌjw\dJc†•giwÊ­†v½aíS©màj•-צFDèòJc¤ÙÊÒM”¼ä¢3×(ö$ýÁ|®>«½_ä»×»Í‘º·N_ÛŸ&_äqZûxî&2;7©š»¹ðöÃ;—6ï§Iº5–Õît@FL¶Û›tÞ÷+dâ;ìØµLkM¤bÝ>¬E&›råÝK7SòYKDÚRj5fŽ’+\Ôn\¶êQk®àœ7Š0Þ÷=P§0ô5ÄžêÙiö$3 Jý"³B‰QÛ2<Š+f+m¹Nd`üAWcU1,>ýN¯F©¥!åDm˜®¸êß$%Ía­ç œJ !’ ˆòí´ c¬2XyÊë’å1¹M¿OÔqÛ+EH'MfJI’I222#!’Ãuê^"¦ï…&BÞdœSKKŒ­—q'e!m¸IZ]Ô¨ˆöÖÒ4o‰ª2<*LÎt îúÓ¢zr’ËZƒgsòË$Ëôެ—k‘¨“•I+ÃEønF¤NDȌŕ>qËy-Õ¥ÔŒÏTÛdj‘+ô‹VVÒ\I""""ØfaŸ¥–*:<—‰)íÔh…NÄ‘ Ërm5ö‘¹·á1\Q)æ’J52•š’›©£^UYDF&”ü{…fÓ*uÔ]ŠÅ))TäΆôGXJˆÍ*6ÞBWeXò™•c"¹ˆÛx3+Nï ¢§³[‡%2œ5ºÉÖ  òlÚ"B’›¡6RÉgkä±ö¦âzŽ&u3šŒÍN™If*ë¨q/™&OÛ4©(QºÒs!D¢áZÆDf¼/‰èØ•¹*¤¿ ×d‰ IˆôWš3+§3O%+"2ÚFecî\b0Ö?¦Vq.)¢.B áéjaÙRaHn;ˆK 8¥›«m-¤ÈÞ2$æ3RNТ1æÑv‡æÕj58LÆ•9¶3N!ŸWqHhÝ2Ìì»JîªÈJJ×UÍW+Y›ƒjó¤i%PQBÅÍ-e-¹ ÝQÝ\!š5Y2šr²k%ë/s"ËÝ ÈÁÒN ™KªT›ª¼Üj\Teð$2­Ê”šô%h%:Ý’vSd¢>"¹™vƘsJz-k®>ÓI{#ñŽn4£2K­ëPcfe±hºXÖºN¡â·´Œ±+M3”ü V¦Æj–óŽ¥íkI[ެքd÷†É-–k]\#¸šaš*{ÇÄ8¤¨±ÕN¥»MŠÝ1×'õ®2·^t'Wï ’[,ùn®€Ëâlc‡°ÜÆ!Õ¦<‰¶§RÓ¤4“"7VM%Z¶ÈÏj×d—(³\ÇxV‹Z*=J¤¶¥¯ZiŠóŒÇÖ›×:”læ>-b“~àñWèØ¢.7wa„Ѥªu5š|¶j/8Ñ2L¸êÛu³BŸßÜ% òæ²xea„Æ8'TÅÔªS´c¢ã ›¾D—\L˜WŒÜg5HJ .ݶ’iºÑ•Fg­i7QêÕ ]BªûR)Ž¡ª‚“O¶¡šÛCˆ7KfÛi4¸“Î¥xÊ÷I‘TÆ’pkÑj’ЍûLÒà9R§àHk4Tšßk;e®lˆ½Óy‹ir•ñ¸ƒU*_JT¶_„—ñv»p)kQ%¼ôÈñ­2MÊÎ4£à’¸&GÇr&•ðMS”¦? ’Ö¨ˆ×­I³ó7.©G•'À-Bó\¬G¶ÁéN•°:žÔ&£PT…#Xà £Ì7e#å°‚k3èåSd¢"±™íñöj¬ÜùãÔRµED($¾á É.¥¤)ÂÈfIUÒYLÈ•cØ/N¡HH´\F…G()ฃ3ÖßzÐi+[)wö‘íMˆîv„Ô°&1n‘:twXEZ±2T&«ré„òeÍrDunˆè7HÛBÌ»Tk>ŒÂU;I:$zKʪ?#~yú{q H’ì„4hK¹[i ^d›‰ºL³ gV½'áF(têÉT‘¦¥"bÂ~Cï)7ÎDËhS—NSÍÁàØóXFtc£ú晇ŸªL… é±k­>¦ä<ꔩÕd´d§nµY ¨”kQ«1–ÕÜÔ?aà¼QD~X£eJúáœYr\e‡#T'œ¤™8–Ö¤¸‚CDeËjÊüJ˜Ñ–*:æ¤âyRÝŸ5±²ìxÊZ×™ÒÉ!¶Ó™fM6‚"$š•nêm¬)¤ÚcF´Ìm=©Ô–&µñÞƒ Ü7Ým &™I´K’W]’¶’¤®Æiâ;d4WA«a¼šeqè/TPŸ1åÂÌLÿ”Lyò$’ˆŒ¬N‘[¸desã8Åbè:=£M}ðl† n·U{MD\[º­Q)•©¸vJ\$©);«iO°Õz•ˆé›ãH’o°N)¥’Ú[N6âNÊBÛYТ>4¨ˆËkÝcµâ îJ•[©µ»ñ ºtZ|ü>ôv’Û7#l8¦›=j‘Xḧ2 ³KjQ vè•JSU™õµC*•j¤sä3 j[ ¥¦RÚ¤¤×d2ƒ5SuŽÄ0´¬U‹Öæ²D#Þ¼]V­¿•já1+|uiOjËv5˜ŽÄYWc;Ã#…t•ƒ1D¨1èµGß:‹&ô§Èe©I$æ2mÇJ¢+™¥&jMŽäV;aê:H¥Ô1¾¡aÚ«®nÚÔˆòïij)† ËZµO-‡ /6ÕÔÒŽÆDFv3#¿‡°MR…´[KuøFöÔîõ!jÊæJdˆŠÕpnwq䟓Á#>;âpæÆ&à:\¥aó àé ÕHm÷N\ÆŠˆÍ Û$¶²'S˜³¨•µW+L&Ø«aü3> >­&QM¨6ó±#E€ü§_KF‚s*B”fjÖ½ŒÏˆŒÊ×_xW®^·wÉ{»tn\Û•íϯ˛S¯ÉªÖÛý^|ߨ]ŸC“#HÔ\F•±¹`RjœBŒõ†ãîÃZ %kXŠ;„gr=©±ÎÑ.²qFéÞm­®¹7ÿvk\Ý·Ý›·QªÉ“߸:Íg¸Ù–û@H*HÁ°+…F•Ty2ŽsTâR`È[)Õ¥c\”zË­7Nk¤®fDDfYNºh[Ѿۻü‹|·¯Yª_ùÖëÜz»ZþÿÀÍl½ÛåÚ4æ*]F £È3ðüĽ"V ‚}Íó&—Pns·c&RmYëóšr§&RWš^ Ç;›­Ø‡‡N„X­ºîërKÅ)MQ3ÜgTMå%DKÎddDF”ÜÔA2V:ÂÉÄoE{»^QsGŽ9>iÌL›ù5Dí¿ÕçÍú‡«bªEvc‘Ñ:QCŠMÆuõ¼ñ¡niKiRF–×b¶Ó""ÚdG¯ÑmB6/qìN¤¹^:Ñ:þ$©7©YÉÝ&À…nuš\¾U¤¶$Ô…lÞ™ ¬u \¨'­M"bÔ†WjdóRT¤’7I‰*±™ŽÖ•‘¤|ÅaÚ£ÅlåSØIA|ß9IBÖl$b\³kà©$w"+\ÈŽ©ºEÂ0¦Ç‡2¡&;Ï6˪ÖS¤%1‰ïz) 6íJ¿¹xШ`éX&ºuz]v¨í1»]¨1Å©¦t·`¡¶”¤­EvTjRQsÎv-„vqŽ Å±u*”íè¸Ã&ï‘%×&ã7ÍRƒK·m¤šn´eQ™ð€KªÇAÄmaçæ;‘5i"—„ð~)fUØø‚Dˆëj ·óifƵd…4Ù©dYRá–m›âC¤º¤ú>‰.œþ¡ç+t˜ªVDªí?QŽË©²ˆË„Û‹MøÊ÷+ˆ~‘ðF4©SñÝ# «®0Ž­kõÝmÈŽœDF2JPÚ‰Ä) Èó$УQÙ|B[¥L,¼gƒ•‡‰hCoT <ù©Õ´fË3yÒJ‘ÂJÍ ¨’en–Òã ­¬cDŸSƒ™XedåUtå™ÃuÄIyÞuM4éY¤ê”¥.ëIjÔÙ‘-EhÎ…qMwn øºµ¸"T_è‹Ê“»5îpH½Ö©¾¹,»®w¿EÁx‚ á*kÒioSpµ]OÄ}m<ô3*:¶Ò‚A:•>‚3I’T”š¬“àÝમÜ{ã"ºŒ#E¢+s­J»ð÷VµE™%À=z2ŸÙW"ÙpÆb½&©Ü3¥(ôXµ:}_ Á›¹¥»MRµµ ·‰Â[Y‰nØ›3Q­(' #ê;ÂÕ¹R#A¨¸—#Ç9jÝQŒ•°Gcyµ:„“–Î IÚ[vâ\‰gÀÒm!Rw/†ú¢IvS‰u‰+§³ ›[dÑ–¯ô9ÍÂY¨¯l‡Æ2˜÷;Škj”Üj{Øf­D}I3×%S*ÐV±’R×¹–ÓMˆîv ðô“ƒeÓ*•&ê·—u*~†Lâ¥&£}´­o7dŸ ²QÂ.2dé[©íBj5HR5Œ0š<ÃvR>[&³>ŽU6J"+žÑ N‹+ò0î$…)˜-T'a™ÔHrÞÄÕ:‰)R’Í’MÓ³RjJIÅl++e•²'P¤?¤Z.#B£”H‰ð\A™ë o½ h4•­”Š;„{Hö¦Äw;NW¦×¨ñêô™I• BLÛp’i½ŒÈÈÈÈ&FFFFDddddFCÜ#ø‰+Ф@˜ã qÚ½JjM“3I7&sò-¤\"C©#î‘ØÌ¶œ€XŸþh¿êÿ©˜éüÿóEÿWýH|ÀŠÅŸIû™žâÏ€$ýL„éê5øß_ÕoúHXnž£_õýVÿ¤ȇg nŽ¿Ÿÿgþ!Ý?þÏüB‘Í2ùÍ;ÞôÛœbI;ÞôÛœcõ-ïWœ³®xÖÌP¡YŠ>oPµ<”([P¸¡mC Pë j(V¡B†-õáAŠ Vbƒ7V…&)¤g\L28_áØßkÑ19l/ðìoµè˜œŒOhyÒ ï£N¨u`¬%‚ÎT³h“ã© j$%7$êNÅd–ËŸtI{m$x‘ûÔºÌ`§;m$x‘ûÔºí´‘âGïRè1€œí´‘âGïRè¶ÒG‰½K Æ:s¶ÒG‰½K ÛI$~õ.€séÎÛI$~õ.€;m$x‘ûÔºÌ`§;m$x‘ûÔºí´‘âGïRè1€œí´‘âGïRè¶ÒG‰½K Æ:s¶ÒG‰½K ÛI$~õ.€séÎÛI$~õ.€;m$x‘ûÔºÌ`§;m$x‘ûÔºí´‘âGïRè1€œí´‘âGïRè¶ÒG‰½K Æ:s¶ÒG‰½K ÛI$~õ.€séÎÛI$~õ.€;m$x‘ûÔºÌ`§;m$x‘ûÔºí´‘âGïRè1€œí´‘âGïRè¶ÒG‰½K Æ:s¶ÒG‰½K ÛI$~õ.€séÎÛI$~õ.€;m$x‘ûÔºÌ`§;m$x‘ûÔºí´‘âGïRè1€œí´‘âGïRè¶ÒG‰½K Æ:s¶ÒG‰½K ÛI$~õ.€séÎÛI$~õ.€;m$x‘ûÔºÌ`§;m$x‘ûÔºí´‘âGïRè1€œí´‘âGïRè¶ÒG‰½K Æ:s¶ÒG‰½K ÛI$~õ.€séÎÛI$~õ.€;m$x‘ûÔºÌ`§;m$x‘ûÔºí´‘âGïRè1€œí´‘âGïRè¶ÒG‰½K Æ:s¶ÒG‰½K ÛI$~õ.€séÎÛI$~õ.€;m$x‘ûÔºÌ`§;m$x‘ûÔºí´‘âGïRè1€œí´‘âGïRè¶ÒG‰½K Æ:s¶ÒG‰½K ÛI$~õ.€séÎÛI$~õ.€;m$x‘ûÔºÌ`§;m$x‘ûÔºí´‘âGïRè1€œí´‘âGïRè¶ÒG‰½K Æ:s¶ÒG‰½K ÛI$~õ.€sé§:¬^q…à{¤øË}K¡Ê‹>“ö=2!=ÅŸIû™ ÓÔkñ¾¿ªßô4°Ý=F¿ëú­ÿI'‘ÎÝ?þÏüB$%º:þýŸø…#šeóšw¼+è·8Ä’w¼+è·8Çê[Þ¯9g\ñ­˜¡B³(|Þ¡jy(P¶¡qBÚ†¡ÖÔ(P­B… [냬Å2n­ LR*1Hθ˜dp¿Ã±¾×¢br Ø_áØßkÑ19ŸÐó¤ê-¯[”¨”jTꔄ ÜSQ#­å’ÈFI#;\ȯúÈ„—±ö=ñ#ù©ÿd;cß1/šŸö@F€I{cß1/šŸöC±ö=ñ#ù©ÿdh—±ö=ñ#ù©ÿd;cß1/šŸö@F€I{cß1/šŸöC±ö=ñ#ù©ÿdh—±ö=ñ#ù©ÿd;cß1/šŸö@F€I{cß1/šŸöC±ö=ñ#ù©ÿdh—±ö=ñ#ù©ÿdZ—ñ¬H®Ë—ƒñ xì¡N:ë´×’†ÐEsRŒÓb""¹™€€ÅbÏ€$ýL„OqgÀ~ǦBtõüo¯ê·ý$ ,7OQ¯Æúþ«Ò@‰äC³„·G_Ïÿ³ÿ‰ nŽ¿Ÿÿgþ!Hæ™|æï úmÎ1$ï úmÎ1ú–÷«ÇÎY×±A£Òëqh˜» Ϯȧ`Z<4&'%R¹i;d#Õ¬Í'•Ó±&Êá&ûsõ*KÉr‘×ý¥ˆ”Œ7;*åjjIϺtêœ]ÙÊñå"È®wCfàÚûØ‹QqG"ï=‰ši¯U­m+ËšÅ{fµìW·[U†]¬I¤"c‡64v¤¼× ‚Ûªq(UøŽæË…b;–]¶¹_DI¤N^Á´ªŽC«c Ahœ‡¥TÍ ¼«e-¡ÆÓÄÙ&n,Òg˜Šå“dƒF”v˜Æ4Zæ"Ã.ïíC Òˆª.ÒT§šÛr Q:öCÔ¸hSH<æ“Q'mˆ ů{çœûÆ÷¾yϼcFh¶[…‹¨ïUHج0ooÃÌá© ªa©µ‘ë§-õ4ò5™Vœ©3¹$‰(+‘N1Žƒˆ´‘‡N±GEJ—‘RÖ%öu‘õªvD¬Œ²™™†IWC2. È'z÷¾yϼa¯{çœûÆ4cT Ùirg‘µRëƒt31¬5!çÕ ]t·»Éòe jl…!I+p¬…*Ê9N>6šåcÔ‰•R–ãuc†âš8ŠRÍ””‹d$FÚ5W¾r¾_å[+^÷Ï9÷Œ5ï|óŸxÆ™Ñí!ÈÕÌ0láúœC]×UEèŽ6‰—eiUÞQe‘™ómhÊjÊ”Ÿ¹âhØ:#Dx,ÂÏ)µ7ÌQ¸j\©M¦*Ë#­‘k&ÞZ Û2;%*"M¶Z…_z§T¯BÈã[ÑPD<úÓV·4fÍk_Ëm¾æ÷ÛbŒiîDŽÆu4kÝʶœJÓœì¢Õ,ì|»HúˆYÐÄa'*$ê=6E{]<¨Ë`Í­Ç9…Q™*"M‹-²Ø&Eû§Ï‹j‡þŸÁp=©qŠ€‹>“ö=2!=ÅŸIû™ ÓÔkñ¾¿ªßô4°Ý=F¿ëú­ÿI'‘ÎÝ?þÏüB$%º:þýŸø…#šeóšw¼+è·8Ä’w¼+è·8Çê[Þ¯9g\ñ­˜¡B³(|Þ¡jy(P¶¡qBÚ†¡ÖÔ(P­B… [냬Å2n­ LR*1Hθ˜dp¿Ã±¾×¢br Ø_áØßkÑ19ŸÐó¤/©ÛQpN-ªÕ«o)¶¤;’KjQ­Õ:Ñ’x$v+%Gsäîˆõ êÎÏØO“ø½v~Â|ŸÅè‡)€®ØN]BÖ›03U‰5t1i²cµçs½Âm¥8¤&Ú»çäW<Ûob·¯³öäþ/D9Lluggì'Éü^ˆ;?a>OâôC”À6Á—Vv~Â|ŸÅ胳öäþ/D9Lluggì'Éü^ˆ;?a>OâôC”À6Á—Vv~Â|ŸÅ胳öäþ/D9Lluggì'Éü^ˆFô“¥ì1‰°„ÚTwuO-§5|2µ$‹j‹j¸î9Üíƒ @1X³à ?cÓ!ÜYðŸ±éÝ=F¿ëú­ÿIK ÓÔkñ¾¿ªßô"yìá-Ñ×óÿìÿÄ"B[£¯çÿÙÿˆR9¦_9§{¾sŒI'{¾sŒ~¥½êñó–uÏÙŠ+1B‡Íê§’… j-¨ajamB… Ô(Pž¼(1AŠÌPc&êФÅ"£Œë‰†G ü;íz&'" …þö½‘‘©ñ­:@¬YðŸ±é î,øOØôÈ@€nž£_õýVÿ¤¥†éê5øß_ÕoúH<ˆvp–èëùÿöâ!-Ñ×óÿìÿÄ)Ó/œÓ½á_@¹Æ$“½á_@¹Æ?RÞõxùË:çlÅ ˜¡Cæõ SÉB…µ ŠÔ0µ°¶¡B…j(bß^ Åf(1“uhRb‘QŠFuÄÃ#…þö½‘ÂÿÆû^‰‰ÈÈÔøÖ€ ïiX+´ú›NÂæEn:K<ŸìŽ Dêç‹þ¯ú­I„w¬ìâ6óK>Èu‚´¨Å…å}ÕH֚ԙꓑ¢+¹²“¶óÞ6YØ#Äl-æ–}ë;x…¼Òϲ0u¼GU=NÅ̧{êÝl¹RBr·;û”Ü"Ê¢2<ªîчÆ3ñm ] €ÅV¹U‘UT—ß— Šso¶m¥«0É?‘¢AšÔ®±Ë$ö™\ÓâiÖvñ y¥Ÿd:ÎÁ#ao4³ìˆd æ)ª±…èóê§@—PEAR¦2˜®¼µFu-¶Ùmu”¸´¨ÜQlºµ¤­c·¦µR¬J®*”Æ4jÄ5-ÞÜv™ËZœJ–zÂQH&’£$XÿL\"Ùwx•u‚’°Ó‘Þq•R;f¤(Òf•8”©7.á¤ÌŒ»¤fBsÝ(xhTEÕ‘)ÚŒlHëm§$K5ä%¹˜Ð›!*U̳â±NæCÎä#×ÕM•Q¹Ú”l;6=Þk)/)º‹XÖ›pŠÜd$4 Í^£JÓtú¬èh:´$šX¶ÈÉlÊÎV#þVD_—*oÄCÉ¢Çߤ¬4äwœegTŽÙ© 4™¥N%*M˸i3#.éf{ÆšsîÑeU’¦ÉˆÒYŽ´™žcS©uI2+ZÖeWÛÝ.=¶óÆmIi§n:²Jp”ilŒö¨ò‘ªÅǰŒùÄ» Vk´ÝÖGªÔ¡¨ªðr”Y lømJ%[)—º47~\©ä!œ™Hšú'%äÊKŠ'Éâ2p—~kíÍ{Þûn&'¾Eêå9ú=ju&J›[ð¤¹Å6fi5!F“23";\¹xÆÒ®Vêsô‘Œ(re-t»UÌ¡ßô$¦š}Ä,‘ÄK΄«7öí¬0äÊ6§/®:Å=GVó Ré©|ݲͳKŠ7͵3QXïbͶ±WwxÙ„eDÄà¡F•5cs¢¥LJMÈe­|Ö\É=ZÉ;M&V6Ò[nDq="î¾»¥*râ¸úšaFäv¤¸FÊ +4Ô­Dd¥Ê5 г">2 Òœs=[D¨æÛŠã-jMÄ-h_¹Êi=ZËÝ^å´¬dbK ¡\¤Q0â°³Ò™\Âstnb;¿$žZI¥ÛÝ‘6MC¹pÌí´Å𛻆1[²£ÆŒúñE:Ìkj›Q¢uÒ‹–R=…c=–Úa¸Dlý×SìÖÞwºÕ×eÜ–ÿ&Þû{þ_s}_YÇ}·¸Â·ˆkTÍQSO©ÊŠ´Õg¡·ZtÒãh&â«"[R“RÔ£IXŒö˜Ò!@6\r†¬qQ!N³,ðüYÌ.4D>áIr1b³WÁ5¨'²ˆU(Š2Q±.ºÙ™qU$ÈpèÓ.Û™/GÓ(íQ¥Â¥È¦5m\7iÙØE¸¬ƒFR·ÐYz>ªµª¤*\æá™dɧk ƒ+[!)—ˆ¸¹m2î”bL*‰ŽLD†S%ÖÐÓe’Ö„ 5e¹‘Öd]ÌÊå1#GqêʫǧÒY©-ÓyRÑMÊòœ4©&³Y#6l«Q^÷²Œ»¦8˜i—wõ݇¼!ø.{#´¥þÔ²þdÄ`ÈÏ¿KRc<ã²²q·Q¥HQÉDe´ŒmŰ„ƒ¯Œkㆠó“ÞÐÂÄ•*¦ìI/GqHSf¦–i3JˆÉI¹w ŒÈ˺F,€ŒD ð&L)àJ~$„{‡Ypдý[Hz·ö·¾é¬oÍG|’FI™ºW®+‘‘ÙwÍÄf\|F1À' Ír´ÎïÔÖ* ï÷vY+-Õ{ßY·‡|Ê÷W÷GÊ<ôéÓi³›N™"¦ï‘æ6Ö›‘‘ÙDder3/ Çœ(Þ#Ä-Æ™ºõQ MZÜ–Úe¸I¥•–¥•ì£Ql3;ߺàÇ>ó²[ﺷ]qF¥­j5)F|ff|f(ÀöÓkjcO5MªN„ÛågSB›' ‘D“+ÿXüj«Tj”õ%ª”ÆéϯXìD¾¢eÅlá)ÊgÁNÓ.ár¿~«;Õ½;í?{û×t/SÇq{~ÁCµZ£Ô¦i.Ô¦9NazÆ¢)õ-«o (¾R>¶‘wO”xÀ0=óëuš„öªêóåÌd‰-H~JÖâŒÌˆ”gr±™žÎSÔëj¤†äÔª“¦¾ÙYH§Ÿ Ôfd<@îªÖjõmVúÕgOÕ›Ý2æBä,ÆvyRåKÕn©/?©hškXá«" ‰)¿K¸E°Y8\+ˆªø^¬š­RcLBr¥Å2‡HŠä~åde{‘í²ÂkÙßJÞ5~ïÑj2X¢½UÄÕÙÊä­×P“—\ö­(Í•$„ðRDEÁIÂî hÅbÏ€$ýL„OqgÀ~ǦBzõÆj^›—³êΓ)GÈ‚IW‘ò 7ÏP²ÐÞœVãŠJš,ÓR”v""Am1C·w¶—ós9ôûÖjºÍ!âœ<˸”ê}:BµæqkyR‰W2",¤M"Åkß6Ó¹köŠ4iYÒ”\{-øG!¢Îü2u‰/‘–GVWã-·.%S>#Í9Ñ[Í?¦lvë¡ÖÕI£YHQwt…a-„´.Î,¢.®Ìº$ë2;qܧJyIK2]dŒÖSFfMßbKŒ{Ï©ž)ñÕhh™ùñ³´ñx­ª¿þ£$athReâsåRqŒ‡[«4U'k¦ªq!ä6„îc•Ä”¥-‘j6(ˆËaf}»é9ŒN¦¼ó«ÍY¢™ö!]¬±<+@óLÏÏÎÖH~ y¦gçÆv¯¥,Im-]¦Îb­$㶸Øj¨óQ¸ s;o$²Í,­¨¬Ù Îä­‰%gØÆX¶e>$(±êk륜š…*TVe0Ý‘¯m‡M.—¸$å323JÈ•´”\çÒÚùç~¿º|Ó¶ž{7©¶• ó&×0ÜhÌ6§^yÚdÄ!´$®¥)G>ÄDDff|Bïk Ð<Ó7óâU¥j¶,€±ü(ïP÷-ì:¹Ĺ-ÕÂK®-¯Ò2’KÉÊ•k ÌŒEÆ3Òñ%EŠÕb—H…IP•‰Ú¥±%ÆÿìÆd©çÉ*#qd„©cMÉ-¦åkŠO¤u“Îí_tù›c£[v°@ðÍ3>?©~Ÿá*š¦þ|n-Ö+u7±*þ÷ªEWp¡È(Zê74w‰FJRŒ”fñì¾Í…¶×9Hç:ÝLó¹Wó)Ä9ϵzá*š¦þ|~v®S¼%@óTßÏŽIÔÞžuÏó&!Î]«”ßÐ<Õ7óãóµn™áš¦þ|tp Íë“ýÓü˜s´^¦(1_KìTèq7±ïLÓµÊÝÙãÝÚð¿ Ð<Í/óÃ}€¤ÕTó‘¡;^ẙ¥þx;^ẙ¥þxo°™KBv¼/Ãt3Küðv¼/Ãt3Küðß`‘¡;^ẙ¥þx;^ẙ¥þxo° ÈЯ ðÝÌÒÿ<¯ ðÝÌÒÿ<7ØdhN×…ønæiž×…ønæižì24'kÂü7@ó4¿ÏkÂü7@ó4¿Ï ö™µá~ yš_烵á~ yš_ç†ûÌ Úð¿ Ð<Í/óÁÚð¿ Ð<Í/óÃ}€fF„íx_†èf—ùàíx_†èf—ùá¾À3#Bv¼/Ãt3Küðv¼/Ãt3Küðß`‘¡;^ẙ¥þx;^ẙ¥þxo° ÈЯ ðÝÌÒÿ<¯ ðÝÌÒÿ<7ØdhN×…ønæiž×…ønæižì24'kÂü7@ó4¿ÏkÂü7@ó4¿Ï ö™µá~ yš_烵á~ yš_ç†ûÌ Úð¿ Ð<Í/óÁÚð¿ Ð<Í/óÃ}€fF„íx_†èf—ùàíx_†èf—ùá¾À3#Bv¼/Ãt3Küðv¼/Ãt3Küðß`‘¡;^ẙ¥þx;^ẙ¥þxo° ÈЯ ðÝÌÒÿ<¯ ðÝÌÒÿ<7ØdhN×…ønæiž×…ønæižì24'kÂü7@ó4¿ÏkÂü7@ó4¿Ï ö™µá~ yš_烵á~ yš_ç†ûÌ Úð¿ Ð<Í/óÁÚð¿ Ð<Í/óÃ}€fF„íx_†èf—ùàíx_†èf—ùá¾À3#Bv¼/Ãt3Küðv¼/Ãt3Küðß`‘¡;^ẙ¥þx;^ẙ¥þxo° ÈЯ ðÝÌÒÿ<¯ ðÝÌÒÿ<7ØdhN×…ønæiž×…ønæižì24'kÂü7@ó4¿ÏkÂü7@ó4¿Ï ö™µá~ yš_烵á~ yš_ç†ûÌ Úð¿ Ð<Í/óÁÚð¿ Ð<Í/óÃ}€fF„íx_†èf—ùàíx_†èf—ùá¾À3#Bv¼/Ãt3Küðv¼/Ãt3Küðß`‘¡;^ẙ¥þx;^ẙ¥þxo° ÈЯ ðÝÌÒÿ<¯ ðÝÌÒÿ<7ØdhN×…ønæiž×…ønæižì24'kÂü7@ó4¿ÏkÂü7@ó4¿Ï ö™µá~ yš_烵á~ yš_ç†ûÌ Úð¿ Ð<Í/óÁÚð¿ Ð<Í/óÃ}€fF„íx_†èf—ùàíx_†èf—ùá¾À3#Bv¼/Ãt3Küðv¼/Ãt3Küðß`‘¡;^ẙ¥þx;^ẙ¥þxo° Èçù}N•QäVh mVÌç–W±ß¹8cûV)^ y®oçÇHfG7ö¬R¼!@ó\ßχjÅ+Â5Íüøé ÈæþÕŠW„(k›ùðíX¥xB湿Ÿ ™ßÚ±Jð…Ís>«¯P<×7óã¤3#›ûV)^ y®oçõb•á šæþ|t€dsjÅ+Â5Íüøv¬R¼!@ó\ßÏŽÌŽa‹Ôï†kxŸĤ·J§A¢ÖUMe£Ì’ë„–s:–™m•ÿKk{ƒ1CÐu?Î’ìžqטÔHjF‘QF¬Ô•‘)·%¸’<ÈI‘ØfÃã/ ÈT:¶•% ˆÔÆ&âoÅtÁŠü‡®§6DJœZlµ¶n”vRJÒŸUˆŠåÝR”EsµÎö½Œxuººìb(§3,í~¶­>"Šs2ƒÓtfU­PßÑc¦ƒ²ÓØâ:TŽLÉ7ˆËúÈlÍ`Y˜}oP ÂÝŸô{ F¦gËŸßv¹¬¶n[«6ÈeQðÞ0£A§¸§e0ë'¿FRuiK» ö$W".#I Í„¿œýþcѧ½7bsÎ;¥ßM~nÓ9Žøî–©ÐgÅâ>¶ªÿúŒ‘-¥S¡R¢®4u-.CÒTœÆ«¸óªuÅ\ÌøÖµ¸Šö+ˆI°E*™R‘› ”®*Q6ÂRJZË:Öv-ªR”¥ñ™™™í1™ÜPûÑŽl‡l=-AGxFôc› ÜPûÑŽl„àjLQ€°®&zKµšs¯œ¶I‰HncÌ¢BŒ‹X†Ö”¬ÓsÊj#4챕ˆ~âŒ+ u"¨ˆtèÏL-©Ë×Êy’SèCm’ÉÖÏ;*Õ´”’‘Äe{ÎûkqCïF9² ŽæÈ04þŒ0³Ø^—QL”°Üš•Asži‰>†Ôm¶ÙµÞ‡•¤š–¢#5ŽÂX&›Šz1Ín(}èÇ6A 4ÜPûÑŽlƒqCïF9² 4ÜPûÑŽlƒqCïF9² X ¦â‡ÞŒsdŠz1Í`BÀM7>ôc› ÜPûÑŽlƒi¸¡÷£Ùâ‡ÞŒsd°MŽæÈ7>ôc› À…€šn(}èÇ6A¸¡÷£Ù,ÓqCïF9² ŽæÈ0!`&›Šz1Ín(}èÇ6A 4ÜPûÑŽlƒqCïF9² X ¦â‡ÞŒsdŠz1Í`BÀM7>ôc› ÜPûÑŽlƒi¸¡÷£Ùâ‡ÞŒsd°MŽæÈ7>ôc› À…€šn(}èÇ6A¸¡÷£Ù,ÓqCïF9² ŽæÈ0!`&›Šz1Ín(}èÇ6A 4ÜPûÑŽlƒqCïF9² X ¦â‡ÞŒsdŠz1Í`BÀM7>ôc› ÜPûÑŽlƒi¸¡÷£Ùâ‡ÞŒsd°MŽæÈ7>ôc› À…€šn(}èÇ6A¸¡÷£Ù,ÓqCïF9² ŽæÈ0!`&›Šz1Ín(}èÇ6A 4ÜPûÑŽlƒqCïF9² X ¦â‡ÞŒsdŠz1Í`BÀM7>ôc› ÜPûÑŽlƒi¸¡÷£Ùâ‡ÞŒsd°MŽæÈ7>ôc› À…€šn(}èÇ6A¸¡÷£Ù,ÓqCïF9² ŽæÈ0!`&›Šz1Ín(}èÇ6A 4ÜPûÑŽlƒqCïF9² X ¦â‡ÞŒsdŠz1Í`BÀM7>ôc› ÜPûÑŽlƒi¸¡÷£Ùâ‡ÞŒsd°MŽæÈ7>ôc› À…€šn(}èÇ6A¸¡÷£Ù,ÓqCïF9² ŽæÈ0!`&›Šz1Ín(}èÇ6A 4ÜPûÑŽlƒqCïF9² X ¦â‡ÞŒsdŠz1Í`BÀM7>ôc› ÜPûÑŽlƒi¸¡÷£Ùâ‡ÞŒsd°MŽæÈ7>ôc› À…€šn(}èÇ6A¸¡÷£Ù,ÓqCïF9² ŽæÈ0!`&›Šz1Ín(}èÇ6A 4ÜPûÑŽlƒqCïF9² X ¦â‡ÞŒsdŠz1Í`BÀM7>ôc› ÜPûÑŽlƒL`6Ðî'Ò[N¤–…âÇ’¤Ÿ‘‰r‘›ÆxRz•Bg}a«‰êÌ»™ÉjIf/”G¶ÝÎ!´0¥2šˆ³¤"Ÿ/J©KvC„ÊIN¬žR J;]G•Mϸ’."!˜ÜPûÑŽl‡;–i¹‰žpãvÅ7q3Î9KDá<#UzºŠæ"$´m8nµ9-ktïÃpÊéÙs2"3Ûc¹ZǸ0—óŸ±ÿÌe·>ôc›!q–Yfú¦›nüyREq6mSj1JmZ¦Õ;iÿÙxymon-4.3.28/docs/known-issues.html0000664000076400007640000001600113033575046017501 0ustar rpmbuildrpmbuild Known issues in Xymon

Known issues in Xymon

This describes some known problems you may encounter when using Xymon to monitor servers.

How to report bugs

If you think you have found a bug in Xymon, please report it to the Xymon mailing list at xymon@xymon.com. You can do a lot to help getting bugs fixed by providing detailed information about the bug:

  • Always include the version number of Xymon you're using
  • If one of the Xymon tools crashes and leaves a core-file (usually in the ~xymon/server/tmp/ directory), please use the gdb tool to pinpoint where the crash occurred:
    • Login as the Xymon user
    • $ cd ~/server
      $ gdb bin/PROGRAMFILE tmp/COREFILE
      then at the gdb> prompt, execute the command
      gdb> bt

Internet Explorer complains about Javascript errors in Enable/Disable

This happens for some, but works for most people. One workaround is to disable the Javascript validation code in the enable/disable function: Edit ~xymon/cgi-bin/enadis.sh script and add the option "--no-jsvalidation" to the hobbisvc.cgi command - this disables Javascript validation on the "info" page - and edit the file ~xymon/server/web/maint_form so you remove the text 'onClick="validateDisable(this.form)"' from the input-tag near the end of that file.

DNS error reported for network tests

The xymonnet network tester uses the built-in ARES library for DNS lookups. There have been reports that this library fails on some systems; one confirmed case is on "OSF1 V5.1". So if you suddenly get a lot of failed network tests that report "DNS error", try running xymonnet with the "--no-ares" option to use the standard DNS lookups instead.

Network tests fail sporadically, or report long response times

The xymonnet network tester runs many tests in parallel; by default it will typically run up to 256 tests concurrently. This may be more than your network test server or network infrastructure can handle; if you see sporadic timeouts of network tests or the graphs show increased responsetimes, you can lower the number of concurrent tests by adding the "--concurrency=N" option to xymonnet in the ~/server/etc/tasks.cfg file. This has been especially important for sites doing many http checks, since these typically have much more traffic going on while testing than simple TCP services such as smtp.

Network tests fail on Solaris with "Failed to find enough entropy"

OpenSSL uses random data to initialise a key that is negotiated when a new SSL-encrypted connection is being setup. Solaris 8 and earlier doesn't have a standard way of getting random data, so OpenSSL cannot get all of the randomness it needs. Solaris patch 112438 solves this by adding a /dev/random device that provides random data to applications.
Thanks to Scott Kelley for the pointer to the Solaris patch.

Asif Iqbal notes: Patch 112438 only works for Solaris 8. For Solaris 6 and 7 you need to either install SUNWski pkg or ANDIrand pkg. See http://www.cosy.sbg.ac.at/~andi/SUNrand/. I have been using ANDIrand since that did not require a reboot and easily available.

Xymon fails on FreeBSD with "Could not get sem: No space left on device"

Xymon uses some kernel resources - semaphores and shared memory. If you get the following error message in xymonlaunch.log when trying to start Xymon:


2005-05-29 20:25:14 Setting up xymond channels
2005-05-29 20:25:14 Could not get sem: No space left on device
2005-05-29 20:25:14 Cannot setup status channel
2005-05-29 20:25:14 Task xymond terminated, status 1

then you need to increase the number of semaphore sets and individual semaphores available to applications.

The current settings for your kernel can be found with "sysctl kern.ipc.semmni" (semaphore sets) and "sysctl kern.ipc.semmns" (total number of semaphores). Xymon uses 6 semaphore sets, with a total of 18 semaphores.

To increase this, put these two lines in /boot/loader.conf on your system:


kern.ipc.semmni="40"
kern.ipc.semmns="100"

Adjust the values to something reasonable for your system - considering the current settings (from the sysctl output), and Xymon's needs (6 sets with 18 semaphores).

More information about tuning the FreeBSD kernel parameters is available in the FreeBSD Handbook

Xymon on Solaris compiles but aborts with some "ld.so" error

This info was contributed by sladewig, with a few modifications:

The system loader/linker can't find your lib.

Assuming you have the .so lib in /usr/local/lib, You can add -R to the Makefile

    PCRELIBS = -L/usr/local/lib -R/usr/local/lib -lpcre

The -R "hard code" the path to the library into the executable so env variable (LD_LIBRARY_PATH, ed.) will not be needed. The -L told it where to find it while compiling.

Or use crle to add /usr/local/lib to system wide runtime linking environment. See man crle. Be VERY CAREFUL with this or you will end up booting from cdrom to repair. Be sure to include the existing library paths!

Command line:

    crle -c /var/ld/ld.config -l /usr/lib:/usr/lib/secure:/usr/local/lib

I usally use the latter as nowadays gcc uses a .so for all its generated programs and then dragging around the LD_LIBRARY_PATH isn't needed.

Note: This information only applies if you are using the Solaris linker. The GNU linker uses the "-rpath" option which is defined differently: Add

    RPATH = -Wl,--rpath=

at the bottom of the top-level Makefile.

xymon-4.3.28/docs/xymon-tips.html.DIST0000664000076400007640000004165512603243142017731 0ustar rpmbuildrpmbuild Xymon Tips and Tricks

Xymon Tips and Tricks

Here you will find out how to do some common questions raised with Xymon.


What do the little red/yellow/green icons mean ?

ColorRecently changedLast change > 24 hours
Green: Status is OKGreen - recently changedGreen
Yellow: WarningYellow - recently changedYellow
Red: CriticalRed - recently changedRed
Clear: No dataClear - recently changedClear
Purple: No reportPurple - recently changedPurple
Blue: DisabledBlue - recently changedBlue

My client-side tests don't show up on the webpages

Did you install a client ? The Xymon client package is installed automatically only on the Xymon server - on other systems, you must build the client package by running Xymon's configure-script with the "--client" option and build the client package on the hosts you want to monitor.

If you did install a client, then the two most probable causes for this are:

  • The client is using another hostname than what is in the hosts.cfg file.
    Xymon only cares about the hosts that are in the hosts.cfg file, and discards status-reports from unknown hosts. If you check the "xymond" column on the webserver display for the Xymon server, you will see a report about these unknown hosts.
    Either reconfigure the client to use the same hostname as is in the hosts.cfg file, or add a CLIENT:clienthostname tag in the hosts.cfg file so Xymon knows what host matches the client hostname. The Xymon client can be started with a "--hostname=MYHOSTNAME" option to explicitly define the hostname that the client uses when reporting data to Xymon.
  • A firewall is blocking the client access to the Xymon server.
    Clients must be able to connect to the Xymon server on TCP port 1984 to send their status reports. If this port is blocked by a firewall, client status reports will not show up.
    If possible, open up the firewall to allow this access. Alternatively, you may setup a proxy using the xymonproxy tool (part of Xymon) to forward status messages from a protected network to the Xymon server.
    Other methods are also possible, e.g. bbfetch (available from the www.deadcat.net archive.

My silly clients are using a hostname different from the one in hosts.cfg

Add a CLIENT:clienthostname tag to the host entry in the hosts.cfg file, or re-configure the client to use the proper hostname.


Where are the bbrm and bbmv commands from Big Brother ?

They have been integrated into the Xymon network daemon. See the next three questions.


I accidentally added an 'ftp' check. Now I cannot get it off the webpage!

Use the command

    ~/server/bin/xymon 127.0.0.1 "drop HOSTNAME ftp"

to permanenly remove all traces of a test. Note that you need the quotes around the "drop HOSTNAME ftp".


So how do I get rid of an entire host in Xymon?

First, remove the host from the ~/server/etc/hosts.cfg file. Then use the command

    ~/server/bin/xymon 127.0.0.1 "drop HOSTNAME"

to permanenly remove all traces of a host. Note that you need the quotes around the "drop HOSTNAME".


How do I rename a host in the Xymon display?

First, change the ~/server/etc/hosts.cfg file so it has the new name. Then to move your historical data over to the new name, run

    ~/server/bin/xymon 127.0.0.1 "rename OLDHOSTNAME NEWHOSTNAME"

Getting the Apache performance graphs

Charles Jones provided this recipe on the Xymon mailing list:


From: Charles Jones
Date: Sun, 06 Feb 2005 21:28:19 -0700
Subject: Re: [hobbit] Apache tag

Okay, first you must make the indicated addition to your apache
httpd.conf (or you can make a xymon.conf in apaches conf.d directory).
[ed: See the hosts.cfg man-page for the "apache" description]

Then, you must restart apache for the change to take effect
(/etc/init.d/httpd restart).

Then, manually test the server-stats url to make sure it's working, by
using your browser and going to
http://your.server.com/server-status?auto  (you can also go to
http://your.server.com/server-status/ to get some nice extended apache
performance info).  You should get back something like this:

Total Accesses: 131577
Total kBytes: 796036
CPULoad: 1.0401
Uptime: 21595
ReqPerSec: 6.09294
BytesPerSec: 37746.7
BytesPerReq: 6195.16
BusyWorkers: 43
IdleWorkers: 13

Scoreboard: RR__RWR___RR_R_RR_RRRRRRRRR_RRRRRRR__RRR_RRRRCRRRRR_RRRR........................................................................................................................................................................................................

Now, assuming you are getting back the server-status info, time to make
sure your hosts.cfg is correctly configured to collect and graph the
data.  Heres what I have in mine:

1.2.3.4    my.server.com  # conn ssh http://1.2.3.4 apache=http://1.2.3.4/server-status?auto TRENDS:*,apache:apache|apache1|apache2|apache3

 From what you said of your setup, I'm guessing your only problem is
 using the wrong url for the apache tag (you used
 "apache=http://192.168.1.25/xymon/" which just won't work - that's the
 kind of URL you would use for the http tag).

 Hope this helped.

 -Charles

How can I add MRTG graphs to the Xymon webpages?

There is a special document for this, describing how you can configure MRTG to save data in a format that Xymon can handle natively.


I need the web-pages to update more frequently

The ~/server/etc/tasks.cfg defines the update interval for all of the Xymon programs. The default is for network tests to run every 5 minutes, and webpage updates to happen once a minute.

Note that if you run the xymonnet-again.sh tool on your network test server (this is the default for a new Xymon server), then network tests that fail will run every minute for up to 30 minutes after the initial failure, so usually there is little need to change the update interval for your network tests.


I want my temperature graphs in Fahrenheit

Edit the file server/etc/graphs.cfg, and change the [temperature] definition from the default one to the one below that shows Fahrenheit graphs.


How do I remove the HTML links from the alert messages?

Configure your alerts in server/etc/alerts.cfg to use FORMAT=PLAIN instead of TEXT.


I cannot see the man-pages on the web

A common Apache configuration mistakenly believes any filename containing ".cgi" is a CGI-script, so it refuses to present the man-pages for the CGI scripts. Stephen Beaudry found the solution:

   This occurs because by default, apache associates the cgi-script
   handler with any filename containing ".cgi".  I fixed this on my server
   by changing the following line in my httpd.conf

   AddHandler cgi-script .cgi     ->to->    AddHandler cgi-script .cgi$

My alert emails come without a subject

Xymon by default uses the system mail command to send out messages. The mail-command in Solaris and HP-UX does not understand the "-s SUBJECT" syntax that Xymon uses. So you get mails with no subject. The solution is to change the MAIL setting in etc/xymonserver.cfg to use the mailx command instead. Xymon needs to be restarted after this change.


Does Xymon support receiving SNMP traps?

Not directly, but there is other Open Source software available that can handle SNMP traps. A very elegant method of feeding traps into Xymon has been described in this article by Andy Farrior.


How can I create a custom test script?

Anything that can be automated via a script or a custom program can be added into Xymon. A lot of extension scripts are available for Big Brother at the www.deadcat.net archive, and these will typically work without modifications if you run them in Xymon. Sometimes a few minor tweaks are needed - the Xymon mailing list can help you if you don't know how to go about that.

But if you have something unique you need to test, writing an extension script is pretty simple. You need to figure out some things:

  • What name will you use for the column?
  • How will you test it?
  • What criteria should decide if the test goes red, yellow or green?
  • What extra data from the test will you include in the status message ?

A simple client-side extension script looks like this:


   #!/bin/sh

   COLUMN=mytest	# Name of the column
   COLOR=green		# By default, everything is OK
   MSG="Bad stuff status"

   # Do whatever you need to test for something
   # As an example, go red if /tmp/badstuff exists.
   if test -f /tmp/badstuff
   then
      COLOR=red
      MSG="${MSG}
 
      `cat /tmp/badstuff`
      "
   else
      MSG="${MSG}

      All is OK
      "
   fi

   # Tell Xymon about it
   $XYMON $XYMSRV "status $MACHINE.$COLUMN $COLOR `date`

   ${MSG}
   "

   exit 0

You will notice that some environment variables are pre-defined: XYMON, XYMSRV, MACHINE are all provided by Xymon when you run your script via xymonlaunch. Also note how the MSG variable is used to build the status message - it starts out with just the "Bad stuff status", then you add data to the message when we decided what the status is.

To run this, save your script in the ~xymon/client/ext/ directory (i.e. in the ext/ directory off where you installed the Xymon client), then add a new section to the ~xymon/client/etc/clientlaunch.cfg file like this:


   [myscript]
	ENVFILE $XYMONCLIENTHOME/etc/xymonclient.cfg
	CMD $XYMONCLIENTHOME/ext/myscript.sh
	LOGFILE $XYMONCLIENTHOME/logs/myscript.log
	INTERVAL 5m


Server-side scripts look almost the same, but they will typically use the xymongrep utility to pick out hosts in the hosts.cfg file that have a special tag defined, and then send one status message for each of those hosts. Like this:


   #!/bin/sh

   HOSTTAG=foo          # What we put in hosts.cfg to trigger this test
   COLUMN=$HOSTTAG	# Name of the column, often same as tag in hosts.cfg

   $XYMONHOME/bin/xymongrep $HOSTTAG | while read L
   do
      set $L	# To get one line of output from xymongrep

      HOSTIP="$1"
      MACHINEDOTS="$2"
      MACHINE=`echo $2 | $SED -e's/\./,/g'`

      COLOR=green
      MSG="$HOSTTAG status for host $MACHINEDOTS"

      #... do the test, perhaps modify COLOR and MSG

      $XYMON $XYMSRV "status $MACHINE.$COLUMN $COLOR `date`

      ${MSG}
      "
    done

    exit 0

Note that for server side tests, you need to loop over the list of hosts found in the hosts.cfg file, and send one status message for each host. Other than that, it is just like the client-side tests.


How can I make the menus work on my iPad ?

The menu system uses the CSS "hover" tag, but this is not supported on tablets and other touch-screen interfaces like the iPad. Mark Hinkle provides this solution to the problem:

In the ~xymon/server/etc/xymonmenu.cfg file, I added the '<a href="javascript:;">' anchor around the top-level menu items. Like:
  <span class="menutag"><a href="javascript:;">Views</a><span class="invis">:</span></span>


How can I send data to Xymon without installing the client?

If you cannot install any "foreign" tools on your system, then sending data to Xymon may be a challenge. But if you have access to either Perl, BASH or telnet on the system then it is possible.

Perl version:

#!/usr/bin/perl
#
sub sendToXymon {
	use IO::Socket;
	my($server,$port,$msg) = @_ ;
	my $response;
	my $sock = new IO::Socket::INET (
			PeerAddr => $server,
			PeerPort => $port,
			Proto => 'tcp',
		);
	die "Could not create socket: $!\n" unless $sock;
	print $sock $msg;
	shutdown($sock, 1);
	while ($response=<$sock>)
	{
		print "$response";
	}
	close($sock);
}

$host = $ARGV[0];
if ($#ARGV != 2) {
  $port = 1984;
  $msg = $ARGV[1];
}
else {
  $port = $ARGV[1];
  $msg = $ARGV[2];
}

sendToXymon($host, $port, $msg);

BASH version:

#!/bin/bash
#
HOST="$1" ; shift
if test $# -gt 1; then
  PORT="$1"
  shift
else
  PORT="1984"
fi
MSG="$1"

exec 3<>/dev/tcp/$HOST/$PORT || exit 1
echo "$MSG" >&3

exit 0
NOTE: The BASH support for using TCP sockets may be disabled at compile-time - some believe it is a security risk to have such an easy way of doing network I/O without requiring any special tools.

Bourne / Korn shell (requires telnet):

#!/bin/sh
#
HOST="$1" ; shift
if test $# -gt 1; then
  PORT="$1"
  shift
else
  PORT="1984"
fi
MSG="$1"

( echo "$MSG"; sleep 1 ) | telnet $HOST $PORT 2>&1 >/dev/null | grep -v "closed by foreign host"

Both of these take 2 or 3 parameters: The Xymon host (hostname or IP-address), optionally the portnumber (1984 by default if not specified), and the message that will be sent to Xymon. The Perl version will both send data to Xymon and print out any response that is sent back - the shell-versions can only be used to send data to Xymon.

Oyvind Bjorge provided the core of the Perl script, and Jeremy Laidman provided the core of the shell-scripts in this thread on the Xymon mailing list.


xymon-4.3.28/docs/Makefile0000664000076400007640000000151712271166170015611 0ustar rpmbuildrpmbuildall: cat xymon-tips.html.DIST | sed -e 's!@XYMONHOSTURL@!$(XYMONHOSTURL)!g' >xymon-tips.html clean: rm -f xymon-tips.html *~ install: mkdir -p $(INSTALLROOT)$(INSTALLWWWDIR)/help/manpages cd manpages; tar cf - . | (cd $(INSTALLROOT)$(INSTALLWWWDIR)/help/manpages; tar xf -) cp -f *html *txt *png *jpg $(INSTALLROOT)$(INSTALLWWWDIR)/help/; rm -f $(INSTALLROOT)$(INSTALLWWWDIR)/help/man-index.html cp -f man-index.html $(INSTALLROOT)$(INSTALLWWWDIR)/help/manpages/index.html ifndef PKGBUILD chown -R $(XYMONUSER) $(INSTALLROOT)$(INSTALLWWWDIR)/help chgrp -R `$(IDTOOL) -g $(XYMONUSER)` $(INSTALLROOT)$(INSTALLWWWDIR)/help # These may fail if no files installed (find $(INSTALLROOT)$(INSTALLWWWDIR)/help/ -type d | xargs chmod 755 ) || /bin/true (find $(INSTALLROOT)$(INSTALLWWWDIR)/help/ -type f | xargs chmod 644 ) || /bin/true endif xymon-4.3.28/docs/xymon-clients.png0000664000076400007640000010354011535414771017474 0ustar rpmbuildrpmbuild‰PNG  IHDR'S=ùçƒ pHYs  ÒÝ~ü€IDATxÚíÝ{@TÕÞ?~AðÆUQ#T‘£25A9BB– ¤ÈÉ[FXJÒ Í5¯uJL£¼2/xÉPB/Š`àQ‘;¨ß?ÞÏù=ëùígæÌ0 2ø~ýÑ™³fÍžµ×Þƒë³×M«¾¾¾¾¾¾Q¢SWWWWWÇŠ """"¢ŽD›U@DDDDDC"""""ê€êQÄP‡ˆˆˆˆˆ: †:ÔFNžï%éòÜsÏ=÷Üs£G=z4JþÌü5ëPD©©©©©©¯¼òÊ+¯¼Ò»wïÞ½{ãõñãÇ?®)gñꫯ¾úê«ÏÚuT¤äêû«Ûñ~ DDÊR:Ô™3gΜ9sÐBØsæÌ™3gÎèëëëëë/[¶lÙ²eíçôîÝ»wïÞ=ͽ<÷$ ÜÝÝÝÝÝçÍ›7oÞJ‡:.\¸páÂŒ3f̘ѭ[·nݺáYþéÝ·oß¾}ûÄü÷ïß¿ÿ>zÐ#áëëëëëûàÁƒˆ9ÑÆ3K333333<LOOOOOoYNés¬;wîܹsgòäÉ“'OÆóoŸÊÊÊÊÊJégׯ_¿~ýú_|ñÅ_Ä7âÛŸÖ322222úè£>úè£ÜÜÜÜÜÜ–ÕöÝ»wïÞ½ëíííííÝ¿ÿþýûÇÅÅÅÅÅI¿QZ‡žžžžžžƒ 4hÐ?ÿùÏþóŸÒœŠ—Ÿ]½zõêÕ«ÝÜÜÜÜÜÔ]“ï½÷Þ{ï½·cÇŽ;vHßýé§Ÿ~úé'ä‘UŠß‡m ¿ÊÀÀÀÀÀÀ[·nݺu«e÷¿âW)Û¶mÛ¶m›µµµµµ5òã¯AZZZZZÚСC‡*딞 Ü'ëÖ­[·n]~~~~~þßÿþ÷¿ÿýïHG'Ý Lñû'&&&&&féÒ¥K—.mÿw)êaùòåË—/Ǧ®]»víÚuìØ±cÇŽˆˆˆˆˆøê«¯¾úê+i9ùå—_~ùåùçŸþùç'L˜0aÂ\ý–Ýê\#ñž‘¾Väo¬¬»N‘Ï*~'·Ò²©þ‘õ-ŠÜ'DDšKéPgüøñãÇÇ?½h&bUçÎ;wî,R…H|‰0é‹/¾øâ‹/ÄœhV®ZµjÕªUeeeeeeŸ|òÉ'Ÿ|‚'š-Ë)…~'4ï®_¿~ýúȗՅÆbVVVVVÖ÷ßÿý÷ß‹Íß¶‡ñîÛ·oß¾};zZVÛȉ殞+R wÂÅ‹/^¼ˆ¾&iNÅËh|§¤¤¤¤¤¨»&'Mš4iÒ¤Ó§OŸ>}]¤WUUUUUafš¼²Ž Ê}¨> øm~øá‡~øaËîů2 oáܹsçÎ[³fÍš5k0d)h¨Éú¡<î”êµ×^{íµ×Ð +)))))ÁÈÿú¯ÿú¯ÿú/eï±iˆ{²ýߥ¸?äHßEÃ÷ªô]ôXâªùûûûûûþùçŸþyËîaU®‘ØG!í¯Påo¬"ŸUöNnŸZë7Ò²û„ˆHsi)ÛQŽüh WáüùóçÏŸÇp ØØØØØXä[TTTTT$}©î²ž8â™.ž¼¢A‰>ek{È!C† Aõ€†¯½½½½½½xvÒóÅ,—ŒŒŒŒŒ cccccã›7oÞ¼yÓÎÎÎÎÎNÌ©xyð-‰c¶Íà³Ï>ûì³ÏP‡³fÍš5kL………………+V¬X±b…¬zPü>lûû¢£££££çÎ;wî\eïů2Ê€áIèhnnnnnÆk4Ëð]²j}Œ‡>|ø0†âμzõêÕ«WÑÃ3{rèQƒsY÷Òñ÷j×®]»víB/S—.]ºtéÒþïRÔ!‚â“x”™ûõëׯ_¿‡>|øpøðáÇúŠßíu¤wŽ"cUù¬âwrÛÿB¥ÿ¶ªû7"ýEî""Í¥t¯þ8®]»víÚµ˜,‹lÞ}÷Ýwß}÷ý÷ßÿý÷Åüø°ñÙ^½zõêÕKÚEŽ0 ƒFðl Í2é0-ÅsJá½ØðÂkéñ|ŸÖåAiQ6 ©Â0ƒ-[¶lÙ²E r”­mäÔÓÓÓÓÓC ™P¤TååååååJ‡<ç–æT¼<ЖAàù=ÁHAHPPPPPüϪrªã>ÔmBBBBBÂÆ7nÜØ²û_ñ« ˜×„×ÄãË/?ž"ûí·ß~û- ¨[¼‹PD\–á“â÷–gëGSîR”G:”pÕdý²´´´´´ÄküÒ¥ÍzÅïáÖºF­û7V‘Ï*{'«û*¥ÈÔWÿŠÜ'DDšKGÙ ÷ÃðgO1VxåÊ•+W®óã/žŒêêêêêêÊ:2šJIIIIIIx.õ¯ýë_ÿú—ŸŸŸŸŸŸø„IñœR(Æ1wïÞ½{÷îÕÕÕÕÕÕ&&&&&&íó"iiiiiia¬ùíÛ·oß¾Á Òy&Š×6vx†ghhhhhˆŸ"åA]¡y„f²j[‘ò<-X?÷ð¯¿þú믿¢iŽŸüϪrªêË?H›,ŠßÿŠ_eñ.mY™ããããããѯ‚¢>ч‰çÖøkƒ•ñćŠ@£ð»ï¾ûî»ï0œ ³5Úÿ]ŠëxäÈ‘#G޼ýöÛo¿ý¶ø.Ò1CúYÌQÁ“~ôÝáuËîau_#õQöNnŸÔWÿŠÜ'DDšKé^LhÞ´iÓ¦M›ðÔͦ 6lذAº¾FHcp †[üøã?þøã¸qãÆ'ætuuuuuÅÓh Õ5TLñœRcÆŒ3fÌ¡C‡:„òà8íÿ‚a$:ê ”–Õöĉ'Nœ¸wïÞ½{÷âŸLôÔ)R]´äVñò<]3gΜ9sfXXXXX˜âóT¹Õ³¹0 ïå—_~ùå—[vÿ+~•U‡'îüñÇüÐ K`þÚÔ×××××c–â-ûí ¿Ë«´ÿ»444444ð0§×¯¶a¡ég1e×îçŸþù知»Z)~«~p|Å©´–¶¼“ÕG}¿Eî""Í¥t¨ƒÑÿèÇ?“x.Ž1Á›7oÞ¼y³˜Ýî‘‘‘‘‘‘SŽç©Äœlƒ~! 0@Ó¶–å”B£9ûöíÛ·o_üƒ!k rû„5—PæÚÚÚÚÚZeky8pàÀÌIÀE¾«W%'''''ãS¨Iq8œ²åyºÐÂ@¼VäSªÜ‡­KÜWÃ¥M:Åïů²êP‡èÆ^FþùçŸþyD€óÂ0N ãQö[0¬5€9Zíÿ.Åoó믿þú믗,Y²dÉÜ¥¸:¨qn¤ç‚5Ç0CI\wNÙ{Xõk„Ѓ¯Ú²ÛòNVõýF¹Oˆˆ4—Gå’*ššššššvîܹsçNôIûšˆW™ÚR{è]ä¬,ôÉ`e?œê^ô™÷ = tX¤,|¸4B[ˆ>Q/!I!È7nܸqã;<<4777777  ¬±&¿HûYªd"""""zV0Ô!""""¢ˆ¡u@ uˆˆˆˆˆ¨]055555m­£1Ô!""""¢§¬W¯^½zõÂk333333ÕÉP‡ˆˆˆˆˆž1È©ð0Ô!""""¢§ÀÄÄÄÄÄD~žÞ½{÷îÝ»eÇ×aQÛ«¬¬¬¬¬wé”îÛ©ÊžìÕ!""""¢ˆ¡u@ uˆˆˆˆˆ¨â\"""""R»‡>|ø°-¿Q¡PGKKKKK‹—‡ˆˆˆˆˆ”Õ¿ÿþýûgfffffªãȲÞý¡Ž*+=-ÀFDDDDDjTRRRRR2f̘1cÆ´î‘SSSSSS‡>|øpé» uˆˆˆˆˆHí:wîܹsçæææææfY;çÈßWG|ýèÑ£GÉÿF…V`Ó’Ÿˆ±œœœœœœºtéÒ¥KGGGGGG¤‹9Ïž={öìÙ‘#GŽ9²k×®]»vµ²²²²²Ú¹sçÎ;-,,,,,ä—G–Ž}»hÊ™>;W¤eõÀú!"""R…BEâ*ñuzzzzzzddddddlllllluuuuuõ¶mÛ¶mÛ¶lÙ²eË–:uêÔ©SÈïãããããóÕW_}õÕWÈyéÒ¥K—.!@BЬRÉ;6M9SÎø’_¬""""uP˾:ÑÑÑÑÑщ‰‰‰‰‰ÎÎÎÎÎÎZÐÃóË/¿üòË/+W®\¹r¥ø©‹/^¼xñþýû÷ïß×ÓÓÓÓÓ{ë­·Þzë-é²tŠ4 Å<={öìÙ³§¬ž¼‹œòû…d½ÛØØØØØ¸hÑ¢E‹Y[[[[[8pàÀ ,X°`ACCCCCƒxeó×ÔÔÔÔÔ¢ìÂ… .\ž»ºË£ŠcÇŽ;v¬oß¾}ûöÅ]‘ æA ÞE=ã~puuuuuEŸ"×E‘ô7nܸÑÔÔÔÔÔTVy”¥ìõ’z6{)‰ˆˆˆZ—Ò¡Ž"ͯüüüüü|4¥ïš›››››çååååå!CÚ222222Ð(DGÈÍÍÍÍÍUå$ïÝ»wïÞ½'2à]äD šÔ(x¤¸¹¹¹¹¹‰¡ÔâÅ‹/^loooooåÊ•+W®\½zõêÕ«H £l~¤ ‰_YYYYY™’’’’’rèСC‡IÏWÝåQErrrrrrAAAAAÁž={öìÙãïïïïï/æ ôòòòòòÂhÎòòòòòò%K–,Y²äÁƒ<óãZôîÝ»wïÞb`ŒtÜK?Ät¼.++++++-----•Ue){½¤¾ûî»ï¾ûõ€3bÏ‘ÒV¬X±bÅŠúúúúúú©S§N:éÒ@ñt4òžÈ5hРAƒÉz÷Î;wîÜùüóÏ?ÿüs1´EVÙÀÈÈÈÈÈHV à]1ÿáÇ>tèСC‡Ê:‚™™™™™Yxxxxxø™3gΜ9£Jy0(NVÕã]1ÿ¸qãÆWWWWWWwB€€ÐÃÃÃÃÃCÌ/MúíÒô–å—æ”5´LÝåQ…ŽŽŽŽÎX÷oÒ¤I“&M°:„[èÙð &L˜0Aú)‡ýû÷ïß¿)*9xðàÁƒ·åãe¯—ƒ6ÏŸ?þüyüÔù8†ˆˆˆ¨eÔêDDDDDDx{{{{{ggggggãY~NNNNN!@ƒü'Nœ8qâÚµk×®]‹Fá¾}ûöíÛ‡•ÙÚ¾j¢¢¢¢¢¢"H‘æ زeË–-[Ät,É€wUÉïççççç·fÍš5kÖˆºbbbbbbÚ¾<¢—­UóèÁƒù0·gÈ!C† ‡¢‰0ÜîÀ@ ¢|›Ö*›"ç«ìõ½÷Þ{ï½÷f½ýöÛo¿ý¶tÀ)B‰Å¦íîîîîîŽÀ 88888ÓÊ1÷`ùòåË—/}}}}}ý™3gΜ9sÆ 6lÀüŠÍ›7oÞ¼ù‡~øá‡”-›ê0 JD4zôèÑ£GKs®^½zõêÕ˜ßòœ °°°°°朗f¼‹¡\J7}úôéÓ§KÏ]Ýå¡fPK­uÿ ÇïôéÓ§OŸÆ`H¼‹Y4˜Q#ýôê`®^ÿùçŸþù§4ÔQ¶<Êž¯²×Kú](?º_1€Ë)K ãØBCCCCCñü>>>>>>¾u‡-ѳ Ó 0I¤u·ÍÌÌÌÌÌĨ1¤§¥¥¥¥¥av·ö³SÅDDDDDôì`¨CDDDDDC"""""ê€êQÄP‡ˆˆˆˆˆ: †:DDDDDÔ1ÔÑZʦwéÒ¥K—.ØÝ¥´´´´´´=Ÿï¥K—.]º4mÚ´iÓ¦uëÖ­[·n(BBBBB‚4ÿï¿ÿþûï¿c×&,5(žµ¬OQǦÃ*hÿ°‚8šïÒ•ÅIÇúå;)~§µîݨŽ;\„ß5~ãÒßÔ·ß~ûí·ßŠù±kÖ´iÓ¦M›Ö­[·nݺ)ò÷A}åIIIIII‘æG ÞåoˆˆÚ›Œ@Ü¡¯SSSSSS?üðÃ?üPVƒ[mJ?+Ý‚[v~õÕW_}õUuuuuu5Ohš E~yð:.....nÆŒ3fÌhݾ‚7nܸqÁ‚ ,ŸS•=j4K=zôè¡îúT–âõ¯Jù¥÷^kålû£IùûûûûûcC^q‹Ø|(ÿ³8pàÀÞ½{÷îÝÛZϼÿý÷ßÿÝÆÆÆÆÆÆÜÜÜÜÜ\šçÎ;wîÜqqqqqqAÉŒŒŒŒŒfÏž={öìššššš1¿‰‰‰‰‰‰¡¡¡¡¡¡˜®¯¯¯¯¯ß«W¯^½z‰éâ“éÇ>|=]øF4àÄüجMOkkkkkë8¡ECCCCCƒ¬ã£á8}úôéÓ§H7QEÉëêêêêê”íIS¤>Å£!(255555•ÕW lý+[~!(((((Ÿuttttt¼páÂ… déÑ£G=ªHÍH{-p®®®®®®èá”_«Z2´ìžojjjjjÂÆ¯Òz;sæÌ™3gÄôß~ûí·ß~1bĈ#¢£££££óâ‹/¾øâ‹ªÿ•-Ï£G=z$½îüNDDmƒ¡Ž333333CCD•ã (#####H4bÐÀÍÍÍÍÍÍ•õY|jíÚµk׮ݵk×®]»ÐÌj­s\³fÍš5k>úè£>úHVž… .\¸pÓ¦M›6mBCª¼¼¼¼¼Ü×××××wþüùóçÏóŸ;wîܹsîîîîîî7oÞ¼yóæµk×®]»6|øðáÇK›nâS|~¥¥¥¥¥¥‘‘‘‘‘‘è[ó/^¼xñâÅööööööW®\¹råÊÕ«W¯^½Š”°°°°°0YÇG™'L˜0a„bþªªªªª*ñ³"ÕëS"{#:qâĉ'0ÌéÈ‘#GŽ;vìØ±cÅ<Æ#¦cÞUý‡á|/_¾|ùòe4@U©Oe)[ÿÊ–ßÏÏÏÏÏéâ3  R½üè5ÊÎÎÎÎÎÆ „}ûöíÛ·/ëÒ9'¢÷Þ{ï½÷ÞÃŒ¦·ß~ûí·ßVdÀ›|¨C1ÆÜ¹sçÎ;kÖ¬Y³f‰ï¢O©     )û÷ïß¿?êJõúQ¶<×¥ Tూú‚y""¢ÿ°µÒ«†f"–Èú–~ÓÅœ˜žŽéùçŸþùç1E{ôèÑ£G–®¤$=¦ø.žcbwËνI?ÿüóÏ?ÿ¬H~ÌVÂÊr½{÷îÝ»7¬–öÅ_|ñÅb~ !ð+1)ò˜eeeeeeõéÓ§OŸ>˜×„ÀỈ_ ½HÁ»òëSVÝŠÄaEè•7nܸqãЫ¦J}Ê*ƒ¬teë_Ùò£_H\ªýÒYd-«U ÑÄ\#1t—õ+Süÿ£¼ôÒK/½ô7`F4NNNNNÎ+¯¼òÊ+¯ gR‘¿ê+tÀ›âµˆˆ¨£zZØþ{—•ÐÐÐÐÐP}úôéÓíg׬©¥Y¿‹ö\ŸDDDôìÀ£.<>ø±M%}-ÿ]¼F;'33333[§ =----- ³muž*¦öϤ±ˆvû)•t›TM xÚg}µ †:Dÿ{8‰ˆˆˆ4‡²QÄP‡ˆˆˆˆˆ: †:DDDDDÔ1Ô! €}WœœœœœœÙ³…XŸDDDD u4€–ö½Áö‹²>õß«‰KH·ø<{öìÙ³g±WvD±²²²²²Ú¹sçÎ;-,,,,,ä—G~ºê°@!69årÉê®Ou\Áö,%%%%%¿)é¯ ï*ò«Äž?ùùùùùùª”¿kiyàÛo¿ýöÛoÛ²}út<•ÿøã?þøc1?J^WWWWW§lOš"õ)Â~Ã}ûöíÛ·¯¬¾DÅÏW,çºuëÖ­[‡sÄæ_[·nݺu+® ø-Ê^_ea2éq Úò×ÝÔÔÔÔÔ4eÊ”)S¦H¯û™3gΜ9ÿDDDŠ`¨£ÁÌÌÌÌÌÌÐ0Rå8è#ÊÈÈÈÈÈptttttD£ÊÔÔÔÔÔ477777WÖgñ©µk×®]»v×®]»víÒÑÑÑÑiµýšÖ¬Y³fÍš>úè£>’•gáÂ… .Ü´iÓ¦M›Ð0-/////÷õõõõõ?þüùóÅüçÎ;w»»»»ûÍ›7oÞ¼yíÚµk×® >|øðáÒ¦¤ØËÀ¯´´´´´422222}kbþÅ‹/^¼ØÞÞÞÞÞþÊ•+W®\¹zõêÕ«W‘&ëø(ó„ &L˜€&¾‡‡‡‡‡‡˜¿ªªªªªJü¬t_aUêS”œœœœœ\PPPPP€~ih­øùJKøÃ?üðÞžžžžž999999è¿EÙ뫬-[¶lÙ²åwÞyçw¦M›6mÚ4\SôOÊ0†¡žÊ+U„®®®®®®xœ²²²²²²˜˜˜˜˜˜£G=z´-ËCDD¤Á0s£¾¾¾¾¾~êÔ©S§NEújgd]E®—²×ìÏ?ÿüóÏ?wsssss“uÌ#FŒ1""""""B:äFyyyyyyÞÞÞÞÞÞòsÊÊ…¾é§JJJJJJT¼þú믿þzqqqqq±ü:D¨ƒüjÐ/!æ466666F/˜Ž¡€xW‘ã·î5U¼>Åã#–ÿ½Êž¯ôòSZv}‡~3Ô˜Žø“O>ùä“O9ú÷¨¨R̤ÂqpŽèEDæåååååÕ–å!""RÆþ sïÞ½{÷îU î ******Êw·x`#‹ß…1)ˆqØ«£Á0v_lµô…‡‡‡‡‡Ë0ƒÛ 7r?~üøñ㪗aõêÕ«W¯V¤ÿaذaÆ “õÓ’5ýÖ½{÷îÝ»wîܹsçÎÊ–S:+Iüvi~YébÃ]w‹âõ)R¤N•óUDË®¯â~üñÇüQ:§ÅÁÁÁÁÁ½LЧÿþýû÷W½—C×0,çˆ?åè‘C€Ý–å!""Ò\ u4†aöúRT9ú%°†¢a~ž}ûöíÛ‡•Ùd}ÖÒÒÒÒүь–®ð¦¬[·nݺu«°°°°°³’äç?~üøñã1Óãúõëׯ_—¿(†«Íœ9sæÌ™Û·oß¾};>"{#:qâĉ'š›››››9räÈ‘±cÇŽ;VÌ€aQb:f1á]Õïq˜Î÷òåË—/_FƒX•úT–ºÏWÙë«,„—ÒKƒOWWWWW×èèèèèh”鸪?z xæÎ;wîÜY³fÍš5«-ËCDD¤Á8€­ý“^54_0ÐEÖ§°Ì€ô³˜˜.æÄôt„LÏ?ÿüóÏ?Qþ£G=z´te*é1ÅwñLÓÇ[v¾èMúùçŸþùgEòã¹5V–ëÝ»wïÞ½1oÃÒ¾øâ‹/¾øBÌ!U%¦#Eþ³¬¬¬¬¬¬>}úôéÓóš8‰9ñkÂ’Þ¤à]ùõ)«nEâ0'ôJ7nܸqèUS¥>e•AVºâç«È‘Å”–]_eIŒÉÿ•!œÀÜ, ø¯R¸Ž±^z饗^z ¾ûî»ï¾ûNš_Ýå!""RÝÓÀöß»¬„†††††âùk|||||<²2¤¶„AexJ}úôéÓ§O·Ÿ]t0Õ[³~í¹>‰ˆˆèÙGoxœ‡Ñ1b›JúZþ»xvÖqÅÖ)HOKKKKK;uêÔ©S§tž*¦ö³e°ˆvû)•t›TM xÚg}µ †:Dÿ{8‰ˆˆˆ4‡²QÄP‡ˆˆˆˆˆ: †:DDDDDÔ1Ô!""""¢ˆ¡ŽÐ’À¾7Ø"PÖ§þ{5q éŸgÏž={ö,öîÀŽ%VVVVVV;wîܹs§………………üòÈOW¡¡¡¡¡¡úêS¤££££ó¿–ëÀNDXÊPñ« ˆ”””””Mz•ñ®"g­`óóóóóóù«!"""â l+€‰ËŸ8qâĉâ>ôظSüÔ§ùK$£ùŽ-D‡ 6lØ°ÆÆÆÆÆÆääääääêêêêêjùåAz\\\\\\jjjjjê¶mÛ¶mÛ¦ÊYãŒLMMMMM±áTHHHHH6R=ÀÖFiiiii)6¦ÓçÌ™3gάÚÞ³gÏž={"=#####+ÄKkIq¢°U«XÞºuëÖ­[ÎÎÎÎÎÎØ$K‘³ """"`¯ŽFzõÕW_}õUì—âïïïïï¯ú1/^¼xñâÅû÷ïß¿_OOOOOï­·Þzë­·fÈÿì8€ÝjccccccUïÕAà„>–!C† 2;Áûí·ß~û­*G–lß¾}ûöíb õõõõõõbè«©©©©©Q¥<ØKzœGÞóDDDDÊb¨£ÁÌÌÌÌÌÌššššššT9úaÐGáèèèèèˆcèQÉÍÍÍÍÍ•õY|jíÚµk׮ݵk×®]»¤ÀZ¦°°°°°ñ¾ùæ›o¾ùæÌ™3gΜéÝ»wïÞ½[·&ü ¸š9sæÌ™3Åw¯_¿~ýúuõ]Ç-[¶lÙ²åwÞyçw¦M›6mÚ´?üðÃ?œ1cÆŒ3d…vj¨ì°F"""¢gCê4pàÀnݺuëÖ­7nܸqãÆÕ«W¯^½úÁ|ðÁï¿ÿþûï¿/볡¡¡¡¡¡#FŒ1bľ}ûöíÛ×Z¥êܹsçÎÇŽ;vìØQ£F5jðàÁƒ¾råÊ•+WZ·0§oß¾}ûö}á…^xáñ]u÷«¤§§§§§ÿðÃ?üðÂů¾úꫯ¾Z³fÍš5kN:uêÔ)é§Ð×ôD€à°µzùˆˆˆˆ4C öàÁƒèêêêêê¶î‘Ñ_޾Y91h K çñãÇ?®z,X°`Á¤|ýõ×_ýµµµµµµuëž/fµìª„C?þøã?þˆAzÒ@_“"Çéß¿ÿþýUïå#"""êêh$ sqqqqqÁrª +wMœ8qâĉŠÖÐÐÐÐЀ^ÌH‘õYKKKKKK¼þè£>úè#é oªhݵפ0éÈ‘#GŽÁÜ$ižîÝ»wïÞu.¦c®JøøñãÇ·¬ úúúúúúµµµµµµbz]]]]]ÞÓ]]]]]]££££££ÅÁuº¦ŽÐ—ˆˆˆHq6 ]ÐÍY9Òµ×àÒ¥K—.]zñÅ_|ñEñ³¬…… ŽÆ4æ¨|üñÇüqDDDDD„»»»»»;VÉ/Pa –4À1UY—¬m`A…É“'Ož<¹G=zôæÙ±cÇŽ;0ˆ}&˜Å„¹1U 0V­ZµjÕ*,{ öɈWYÌž4\)\_±OõЗˆˆˆ¨c`¨£Z¶ °"ŸÅ¢Æxíççççç§Jy~ùå—_~ùESêöm¬<&±·:Ê ìñÑ“†Œ¿""""Y8€ˆˆˆˆˆ: †:DDDDDÔ1Ô!""""¢ˆ¡u@ uˆˆˆˆˆ¨b¨CÔ!é³P""""E0ÔÑZØÑeìØ±cÇŽ------•Ÿ_GGGGGç7Þxã7¤ù!55555ÕÉÉÉÉÉ ÇwtttttDº˜‹MoذaÆ Xø¸oß¾}ûö4iÒ¤I“°»¯šâ°ý(® vCBͳ<­ûÛQG~"""jÏêhq¼®­­­­­]¸páÂ… §OŸ>}útùùëêêêêê° ¦4zzzzzzddddddlllll,¶þܶmÛ¶mÛ–-[¶lÙ²S§N:u ùׯ_¿~ýú+W®\¹r%77777÷úõëׯ_ AÙxÕwþüùóçÏŸ;wîܹs¶¶¶¶¶¶/^¼xñ"Ë#¥ìÝ¥ìžT-ÛʈˆˆÚ'†: ½4žžžžžžYYYYYYòóëêêêêꆇ‡‡‡‡KóGGGGGG'&&&&&:;;;;;£W=<ØtåÊ•+W®DþÍ›7oÞ¼yéÒ¥K—.555555Eº—————Â$UÎÙœ9sæÌ™chhhhhhaaaaa±}ûöíÛ·÷ëׯ_¿~b~ñI|eeeee%Â9ƒ?þøã?óc³ÎE‹-Z´ÈÚÚÚÚÚzàÀ\°`Á‚ dãÆ7nÄY£–T9_ô™Lž}úôéƒüwîܹs王‹‹‹‹‹žžžžžž‘‘‘‘‘ÑìÙ³gÏž]SSSSSÓ–õ£Êý#Ö§¬t"""j- u4æN$%%%%%!8‘ŸáÇîÝ»wïÞ=nܸqãÆ‰ïæççççç‹A‹ÈÜÜÜÜÜó‹Oâ}}}}}}'L˜0aÂ4‘=<<<<<Äü‹/^¼x±½½½½½=ú¦®^½zõêU¤„……………É:~YYYYYwíÙ³gÏž=þþþþþþ¼'wòäÉ“'Oº»»»»»cæ˜1cÆŒƒ»ÚÁÁÁÁÁáèÑ£GE~ô^nÚ´iÓ¦MÈS^^^^^Žk=þüùóç·eù[vÿà÷"Þ½HG0ßöÑ3aÅŠ+V¬¨¯¯¯¯¯Ÿ:uêÔ©S‘þ„Úñªikkkkk»¹¹¹¹¹¡±%??ØÙÙÙÙÙUTTTTTˆ9­¬¬¬¬¬äû Aƒ „×xÝÔÔÔÔÔ¤Ž3Å3û`, `Ë–-[¶lÓQ~¼Ë»EÝ<>|øðá˜u† 0`À1çøñãÇ¿uëÖ­[·b ¬÷´JÞ²ûÃÛ8pàÀ¤à)ð~ ""R†:@:•¹eùñO—Å™6˜5§éèùÁ<™ÀÀÀÀÀÀåË—/_¾|äÈ‘#GŽD~?~~~~~~lLLLLLL°°êÓô1+³tÌÌÌÌḬ̀˜5æ­^½zõêÕòÏWþToó+ž*rü–]E®š¬syZwºËƒ€ý“èá‘•óµ03 CÚ°¢ ú‚T/¿âù•½¿; 7Åë?ÿüóÏ?ÿd¨CDD¤>ZxB‰àxßñ†ñQ{ƒÑ·xÍ:!""êx06‹ca’‚kH_˯1å!33333⑞–––––†RtXõDÔö¤½% uˆˆˆ¨u1Ô!¢§€ýÆDDD¤n uˆˆˆˆˆ¨MaÎ*^2dÈ!x]PPPPP€×âŒVÌwÅkù닸,=²VîU6]†:DDDDDÔ¦°í6àӱ㶒ӭ­­­­­±ý¨âßÂP‡ˆþ¬pÂò‘fa¨£¤{ÅtéÒ¥K—.cÇŽ;vliiiii©üü::::::Ø¢QšRSSSSSœœœœœp|GGGGGG¤‹91¡[|ZZZZZZbß›I“&Mš4Iܱ‡×KÇß±cÇŽ;´µµµµµÅûAõtâ>¹téÒ¥K—p'<­úloåiË{ãéî­DDD¤> ÄtÌÕ¹|ùòåË—ÅtÌÕÁ.vŠ C ]M¼¶¶¶¶¶váÂ… .œ>}úôéÓå篫««««Ã–‹Òüéééééé‘‘‘‘‘‘Øñ‰Û¶mÛ¶m6vÄÚäÈ¿~ýúõë×ã†ËÍÍÍÍÍÅö!!!!!!(¯WË>«HíÍ›7oÞ¼yÉÉÉÉÉÉø®={öìÙ³Çßßßßß_õòŸ?þüùóçÎ;w­­­­íÅ‹/^¼ø´ê³½•GÙë¥Ê½Áuꈈ¨cS÷\NØB´¾¾¾¾¾~êÔ©S§NEújg¤×0uëÖ­[·nŠäÇU–æóÍ7ß|óÍòòòòòréqnݺuëÖ­É“'Ož<)Xõ¢¬¬¬¬¬L}çûþûï¿ÿþû—‰2£WêÈ‘#GŽ‘ž):tèСCææææææÃ‡>|øµk×®]»¦ÊñÑœ 600000Àñ ¢GKVý£O }_ººººººØBKÌyûöíÛ·o£´ø”¡¡¡¡¡á¬Y³fÍš…°S~]áNxùå—_~ùå¶¹÷ÚÛoAõ£ÁÑ£G=š’’’’’"¦[XXXXX´ÖõR¶üòó744444|ðÁ|ð~› 0`ÀüùóçÏŸ_½¬ó,+ˆˆHu{÷îÝ»wïÇ>|ˆù6•‚»‚ŠŠŠŠŠŠrÁÁmÁÍ›7oÞ¼‰#‹ßuìØ±cÇŽ!Æa¯ŽFÂ\…¤¤¤¤¤$ggggggùùÑüÚ½{÷îÝ»±O­øn~~~~~¾©©©©©©ô³hÖçååååå!¥¨¨¨¨¨HÝÕV­ZµjÕ*t_VUUUUU-Y²dÉ’%ÞÞÞÞÞÞ²jø a°ú©>üðÃ?üP•㇆††††êééééé•””””” ôõõõõõñ²Î}/芕Õ÷‚Þ¹M›6mÚ´ W?l______4Xå×v>xðàÁƒùëPÖÉ“'Ož<éîîîîîŽA¡cÆŒ3f ®…ƒƒƒƒƒB Öº^­kñâÅ‹/¶·····G_ëÕ«W¯^½Š”°°°°°0éï¿_ñîE:Â¶šššššÞDD¤ñØ«£)Ä«†ynnnnnnhÜÈÏvvvvvvˆ•ÅœVVVVVVò¿O‹ñ3ššššššÔq¦µéááááá£{÷îÝ»wÇùʺ?‘ަRpW£F•ãa%e¯—´–¤ÇïÑ£G=dýBPÉú„Rxª¡î{Ow²,mY@¿% %.....>[ëzµ¬üòó#8Óñ€ïJ?…pNì¿:{öìÙ³gûõëׯ_?þ½%"¢Ö%íÕIˆ½:bºØ«#¦³W§ÃÂ%ij䌌ŒŒŒ ù›(‰C°Š‹‹‹‹‹Å<˜ÿ€ÛKz T€HÁvNb?Oëš2eÊ”)SÆ?~üxô¢ Ñ–˜˜˜˜˜¨ìÑ0©]•㣶1HLÙoÇ‚òó 6lذa²þ4Èê5úþûï¿ÿþ{ UÂð*ͺ‡åkûR}ùå—_~ù%f¦aHXttttttTTTTT”ê׫mêSÖ»ÒtôVíß¿ÿþýHÁÐJ,ñÉ¿´DDÔ6¸¯µ ¼Á³j1="""""·²³³³³³Ñ‘“““““ããããããŽüˆ’‘‚±¤ÒÓÅ$\a•-ôÉ`À–CÿÙ'Nœ8qa fÝ`H’*ÇÇÀ$¬8‡ xCÓPõÅtmݺuëÖ­XàAž‰~úé§Ÿ~ú nqa®Ó¥ ó˜ãéééé鉹[&U¹^ê°eË–-[¶ˆéø=â]é§0¼íÀ@ žŠ‰w‘ú´Í¾:À¦¤WM•üh™™™™™™‰éÊ‚èÑ:|øðáǥ߂Iù‡a`^^^^^^˜'£ÊùîÚµk×®]}úôéÓ§ ˜8qâĉ1§HÖy!%+++++ ŸÅ¹H—%PöøxN„Mð{A¿PËž¬#å§Ÿ~úé§ŸbE×®]»víúú믿þúë_|ñÅ_|!Ãídý¢Õwשã[Ú[y05|ãÆ7nHó({½ZV~Åóã¯7æõÈZ–ðPGC^¯[·nݺuü«KDD­ëi-K …ÿÁÄk<ÿ‹GVFœ¤)ЧÁû–Tƒ?¦xÍ:!""RÆÂ`q,Œ¾§B 2dÈ!x->zÆX´îð8阾)™™™™™™…„w±\6JÑaÕ“¦n1à!Õï"`¨CDD¤n˜ø éŠté06¤+>Œ¡i<6Ä»ˆˆˆH³´Í\.K@DDDDD{uˆˆˆˆˆ¨MaŸC¼çê`ãu¼×•ÎÕQä[Ø«CDDDDDO÷Õ!¢V†KX"""zZ8W‡þ›–D—.]ºté‚Í1±üü::::::ØQšRSSSSSœœœœœp|ìKƒt1'&pcKMKKKKK˾}ûöíÛwÒ¤I“&Mž¼jí6¸Äu¿téÒ¥K—peYžÖýmª#?©‚¡Ž׆ÂëÚÚÚÚÚÚ… .\¸púôéÓ§O—Ÿ¿®®®®®nÔ¨Q£F’æOOOOOOŒŒŒŒŒÄ눰±Iè²eË–-[†µÉ‘ýúõëׯLjÉÜÜÜÜÜ\삲ñªµçÏŸ?þü¹sçÎ;gkkkkk{ñâÅ‹/²}úôA~lб¿¸ŒŒŒŒŒŒfÏž={öìšššššš¶¬ŸÆÆÆÆÆÆE‹-Z´õ8pà‚ ,XÐÐÐÐÐРÈ}.ÿ×ADDô,`¨£‘0·!))))) Á‰üü?vïÞ½{÷nìS+¾‹]iÅ Ednnnnn.îh[TTTTT¤¾jœ°Ÿnyyyyyù’%K–,Y"ŽÝÄ3r„(âqâæææææ&>MWüøŠFpIIIII j@______ºé¬ZµjÕªU—/_¾|ùrUUUUUŽïííííí-æËVVVVVV†Á]{öìÙ³g¿¿¿¿¿?ïyÅ|Z1)GŽ9räˆ*ÇÇ3~„@Š”‹'zxxxxx @B¯®—¬ß—²éªßKê¸3eiËòzp­‘‡œbÎ=zôèÑCVÉжnùåç766666Fp"¦ãÞ•~ áz±pü³gÏž={½ŽüûIDDO×Þ½{÷îÝ‹GrXZ RpW€–j¹àŽà¶àæÍ›7oÞÄ‘Åï:vìØ±cÇã°WGÃàâÙ3z-ä¯,.^øààààààâââââb1æKàö’ý X%)”%öó´.,o€a|øðáÇcVV 0`À€ÄœJ·nݺuëV,°5âžVɶlÙ²eË1¿/¼+ý†·8pàÀHÁS.qó5""¢g C jܲüx§¿âLÌj@`€ž »Âœ–åË—/_¾|äÈ‘#GŽD~?~~~~~~l0 ½ªO£G#õôéÓ§OŸÆà:”Af°H?…Õw¥Ô‘_þqÚò>|ºÇyZ{u Ø{ .]ºtéÒ%üÒYÍý @DD²0ÔÑÒÕÄkkkkkk.\¸páÂéÓ§OŸ>]~þººººº:l‰(ÍŸžžžžž‰Ù««««««·mÛ¶mÛ6l¼ˆµÉ‘ýúõëׯÇf…¹¹¹¹¹¹Øc>$$$$$eSå|QBGZZ©‚‚‚‚‚‚/¾øâ‹/¾ÈÉÉÉÉÉA™±å¢üúTß•RG~UŽƒm1ÛòìÔwu\AÕëGSœ?þüùóçÎ;w­­­­íÅ‹/^¼ÈòH)û×ìiý ""™°…h}}}}}ýÔ©S§NŠô'ÔÎH¯ 6`êÖ­[·nÝÉ«,Íÿæ›o¾ùæ›ååååååÒãܺuëÖ­[“'Ožøàƒ>À¹0`À€óçÏŸ?>jUzäk×®]»víå—_~ùå—»wïÞ½{÷iÓ¦M›6íáÇ>T%?9räÈ‘#âoYÖ™Èú Í@wæÌ™3gÎÄg_z饗^z MÒÖúû xý+{¾8ކœ¸—FŒ1bĈçŸþùçŸW¥~Zv?ÀÝ»wïÞ½ûî»ï¾ûî»úúúúúú‹/^¼x±¬üG=zôhJJJJJŠ˜naaaaa¡¾¿-ííoêGS¼>oß¾}ûöíáÇ>ïΚ5kÖ¬Yøu´nùåçWå~¬È½MD¤>{÷îÝ»w/Z5÷îÝ»wï^¥à® ¢¢¢¢¢¢\pGp[póæÍ›7oâÈâw;vìØ±cˆqØ«£‘0–=)))))ÉÙÙÙÙÙY~~üó¼{÷îÝ»wcŸZñÝüüüüü|SSSSSSégÍÍÍÍÍÍóòòòòòRTTTTT¤ú@5Y0·)zf‚±4ÿñãÇ?nggggg‡Aþw%'''''£_hÏž={öìñ÷÷÷÷÷ó 1jooooo¾¬«W¯^½z)aaaaaaÒ#ïØ±cÇŽ‰‰‰‰‰‰èõêׯ_¿~ýЧz~ü¤åŸcUUUUU•¬Æ4?ÎÈÊÊÊÊÊ €Ð4>>>>|ëÖ§ô,¤÷¿±±±±±1b:H¼+=‚´´È>UòË:Õó@Ïž={öì)íMƒ„¶¬eÏÄ^kkkkkk ÅT¥~”½ÄãË꣓B?*Î)qqqqqqÒ©Ž¿-êøK%K[–GÙú”?”}q­[~ùù[v¿!œû¯Îž={öìY<@yBDÔæØ«C Á%ijƌŒŒŒŒ !Š4)‚ƒƒƒƒƒ‹‹‹‹‹‹Å<ÛKz T:tèСC‘bccccc#öó´®Ï>ûì³Ï>ì,30cÆŒ3f`NQë~lP¼Y&ë]E¾ Ó¯¦ª#ëÞcÒt ¤iûúWúÑĀƠ     ô¨¨^?-»ÐPVä[¾üòË/¿ü³ÎPóÑÑÑÑÑÑQQQQQQíÿo”|m_*ÅësذaÆ “Ur±Ÿ¤íëSñû ½Uû÷ïß¿?R0°sðàÁƒnÏ÷Qëb¨ó ÁÀ <ËÓ#"""""¼½½½½½³³³³³³ñ¬Á†Oxxxxx8ò#JF <@³K¸¸¸¸¸¸´V™•]¢@¶lÙ²eË1ç‹w¥ŸÂ»xꀧhZùùùùùù©ž_YèåÀŠv¢._¾|ùòå5kÖ¬Y³F̉oDº8,&&&&&¦ýßçè•Âܵk×®]»b…À!C† 2DÖÐÅë§e÷ƒ²ðp3F<=====öcžÿš©¯>Ç?~üø­[·nݺCIq?<­’·ì~Ãð¶8p)xê‰U¼ˆèÂlíŸôª©’ÿdš™™™™™‰éê€e^ÑìÃ?–‡>|ø°ô[°>ÅaahÌŽÀ¢±­uîÊ.Q J}ÊJǯcô{ ¤Ó‚ÅÏ¢÷ –ÀdtqZ³²ù..«&qeq|ÌÚÂL'ésk–>‡'ÄèQü>l­úWö|1°s-Äù]ò—=P¼~¿Zv¥DžŠòܸqãÆêû«¢ú•mÿåQ¤>ñ çÓO?ýôÓOqe0¿þú믿þ:VzT½üŠçWö~„ú8~¿x½nݺuëÖñ_U"j{Ok›þ'44444χ0/Y =-èIÃwMéUc}‘)â1"ÆŒˆ±†ôµüwñ:2333331 éiiiiii˜«óìT1‘¦n+ɦ9듈ˆ”ÅP‡ˆ¨Ýa¿:듈ˆTÇe ˆ¨…°€–zõêÕ«W/Öµ%öêQ aZ!눈ˆÚ'öêQÄP‡:”3gΜ9s†õ@Ï2¬HÃz ""b¨£¤3ºtéÒ¥K—±cÇŽ;ûØÈÏ=é±ež4?¤¦¦¦¦¦:99999áøØcébNLðݰaÆ °o ¶hÄ.õØóA•óÅ6ŽØ«¯ùÔ¯¿þú믿âøàƒ>øç>`À€ÈÚ­G¾víÚµk×^~ùå—_~»³O›6mÚ´iØ'X•üpäÈ‘#GŽˆ¿eYgj````` ë/€4?Ý™3gΜ9Ÿ}饗^zé%4©Uÿû ~;öE~÷Ýwß}÷]}}}}}ýÅ‹/^¼X•üê.¿~‰¸víóoEk]¯£G=z4%%%%%EL·°°°°°@~ì`=|øðáÇã]CCCCCÃY³fÍš5 W§uË/?Ë~¿Ò߈"¿""’eïÞ½{÷îE«ËU î ******Êw·7oÞ¼yó&Ž,~×±cÇŽ;†‡½: cñ“’’’’’œåçGób÷îÝ»wïÆ>µâ»ùùùùùù¦¦¦¦¦¦ÒÏš›››››çååååå!¥¨¨¨¨¨Hõj²` nSôÌ ‰4ÿñãÇ?nggggg‡AþwáÙ<ú…d=›GcÚÞÞÞÞÞ}YW¯^½zõ*R¤GÆ0§ÄÄÄÄÄDôzõëׯ_¿~è‹S=¿‡‡‡‡‡~ÒòϱªªªªªJVãLšgdeeeee…?@hÚ:tèСCª__ñ{}}}}}}'L˜0aÂü Ãy©’_Ýå—®Ìò‡Mj®“'Ož|Xú-XŸ ƒâ°0´—————½m­sWv‰UêSV:~˜cÐ[ Ö,~½gü°Ì&Ó‹Ó²•ͯøs}Y5‰+‹ãcÖf:IŸ»#°Äð9<áÆbŠß‡-ë‘P=¿ºËÚS¼ýôÓO?ý¿”®]»víÚõõ×_ýõ×±Rb[ÞŠÿ~Ex胣áþÁëuëÖ­[·Žÿ*)ëi `ÓÂÿ„†††††âùæE +CA""ôŒáMéå#"¢ö\ñ˜c.ÄXCúZþ»x ™™™™™™…„t,„RtXõDD$ŸtxC""jÿêÑÀ~~""ÒD\–€ˆZË:k) W¯^½zõbQ[b¯µ¦²ˆˆˆ¨}b¯u@ uˆˆˆˆˆ¨b¨£¤3ºtéÒ¥K—±cÇŽ;ûØÈϯ£££££ƒ-ÿ¤ù!55555ÕÉÉÉÉÉ ÇÇ;Hsb‚ò† 6lØ`iiiiiÙ·oß¾}ûNš4iÒ¤IسBSê³=‡ˆˆˆˆÔ¡Ž®&^[[[[[»páÂ… b«DùùëêêêêêF5jÔ(iþôôôôôôÈÈÈÈÈHì Žm+±Iè²eË–-[†µÉ‘ýúõëׯÇf‚Ø–{¢‡„„„„„ lšRŸíá8DDDD¤ u4zi<=====³²²²²²äç×ÕÕÕÕÕ —æŽŽŽŽŽNLLLLLtvvvvvF¯zx°åÓÊ•+W®\‰ü›7oÞ¼yóÒ¥K—.]jjjjjjŠt//////„Iªœ]BBBBBÊ€>======WWWWWW++++++Uò‹°Ÿ.z¥pMÌSSSSSSdhhhhhˆþ® .\¸pw#QûÄPG#awؤ¤¤¤¤$'òó#üؽ{÷îÝ»±O­øn~~~~~¾´ˆÌÍÍÍÍÍóòòòòòRTTTTT¤¾jœ°Ÿnyyyyyù’%K–,YòàÁƒ¨’_”œœœœœ\PPPPP°gÏž={öøûûûûû‹yÂÂÂÂÂÂ2UVVVVV¦¤¤¤¤¤:tèСC¼‰ˆˆˆÚ'.6­aÐk¡­­­­­=bĈ#FÄÅÅÅÅÅÉÏ×vvvvvvÇ?~ü¸˜GÙXÈp ýK­{Ž;wîܹs§¯¯¯¯¯/Žobbbbb‚½Y¤†²ùEè­Â§¦L™2eÊ”¦¦¦¦¦&1B ’’’’’äDXˆ{üñÇÌ;“ˆˆˆ¨½a¨£aZ–à5æØ‹[:ÚÚÚÚÚÚÞ½{÷îݻҭËÊÊÊÊʆ:tèP¤ØØØØØØ ŸÇÁÁÁÁÁ¡uÏË466666bðöoùñÇüñÇ &L˜0AÜÑEÙüÿë @¨&«ÎxOµOÀö Á2Ò^ ˆˆˆˆˆoooooïìììììlôlääääääøøøøøø`žò¯X±bÅŠHÁ‚3°¤‹‹‹‹‹‹*åìÙ³gÏž=Q’®]»víÚsi† 2dÈ3ªäW–ŸŸŸŸŸßš5kÖ¬Y#‹‰‰‰‰‰á}EDDDÔ>1ÔÑâ 4E–6–•¯Ñ#δqwwwwwŠŠŠŠŠ Æ´~ÌY¾|ùòåËGŽ9räHäGðƒ Œaaé´~e¡éôéÓ§OŸÆ ”³h0œL•üòëGúANaaaaa!ÎË|‹kÙqÉi"""¢öF OèCCCCCCâããããã¹.©+úbq,Œ‘‘nŽ"¾–ÿ.^cÞxfffff&Ä#=----- ¥°W‡ˆˆˆˆˆ: †:DDDDDÔ1Ô!""""¢ˆ¡u@ uˆˆˆˆˆ¨b¨CDDDDDC  %Ñ¥K—.]º`w—ÒÒÒÒÒRùùutttttÞxã7ÞxCšRSSSSSœœœœœp|GGGGGG¤‹9±Ì߆ 6lØ`iiiii‰-;'Mš4iÒ$qÇõÕïÖ‘| u4€t5ñÚÚÚÚÚÚ… .\¸PÜÈRVþººººººQ£F5Jš?======22222266666¶ºººººzÛ¶mÛ¶m[¶lÙ²e˰69ò¯_¿~ýúõW®\¹råJnnnnnîõëׯ_¿‚²©»x?´ì³ê»:DDDDí C„^OOOOOϬ¬¬¬¬,ùùuuuuuuÃÃÃÃÃÃ¥ù££££££Ñ«ƒlù´råÊ•+W"ÿæÍ›7oÞ¼téÒ¥K—šššššš"ÝËËËËË a’*gWSSSSSdhhhhhˆþ¥ .\¸pAš_ì娏qãÆQ*œEBBBBB‚˜)xŸÒÓÓÓÓÓsuuuuuµ²²²²²ó#Pœ3gΜ9sP ‹íÛ·oß¾½_¿~ýúõ“–jîܹsçε±±±±±éÞ½{÷îÝG=zôè£G=zTõãñcÇŽ;†^5Yç{çÎ;w¸¸¸¸àLŒŒŒŒŒfÏž={ölÔ6SDDDÔñ0ÔÑHØ6))))) Á‰üü?vïÞ½{÷nìS+¾›ŸŸŸŸŸ/-"sssssó¼¼¼¼¼<¤©o ZXXXXXBŽÊÊÊÊÊÊ””””””C‡:tHš_ìå(+++++à ½={öìÙ³Çßßßßß_̈À ûõ–—————/Y²dÉ’%”–jÕªU«V­º|ùòåË—«ªªªªªp|ooooooÕÉÉÉÉÉɲν›6mÚ´i¯¯¯¯¯ïüùóçÏŸÏßu@+V¬X±bE}}}}}ýÔ©S§NŠô'ÔΈWM[[[[[ÛÍÍÍÍÍ Éäç;;;;;»ŠŠŠŠŠ 1'‚ ùß>hРAƒá5zBššššššÔq¦={öìÙ³'šøbº„È:_EÒ"¢§ ˜˜˜˜X[[[[[c¨ž˜} øvEÊÿçŸþùçŸ`Ыƒë%-²ÇÏKz¤ÇïÑ£G=dý@@Åß©ÏÞ½{÷îÝ‹Öݽ{÷îÝ»W)¸+@Kµ\pGp[póæÍ›7oâÈâwaÌ böêh\B<›ÏÈÈÈÈÈ@"??‹ylmmmmmq{I€~’¡C‡:)”%öó¨ã¥é ªË'466666¢¿ 3Ž0dn„ &Ló£¶Ñÿ£Èñ§L™2eÊ”ñãÇ?½4ø ”æWöø" e”ŸgذaÆ “õ§G~¯‘æb¨ó Á@¦¸¸¸¸¸81="""""«²³³³³³ÑW“““““ããããããƒy>È()˜g‚°K`Nˆ*åôóóóóó[³fÍš5kÄf111111ª×zp¦]»víÚµ+æº 2dÈ!Ò¹+è…ç‚i˜Å$0†àó‹ 0 Ë9HË£ìñ•… këÖ­[·nÅ?~üø1DDDÔ±1ÔÑâ²ÂŠ,1,+?^;88888ˆ3mÜÝÝÝÝÝ£¢¢¢¢¢ÐóƒaW˜Ó²|ùòåË—9räÈ‘Èà  C¯…tZ¼²äâÈXV[\;Nþ9ʪӧOŸ>}ƒ÷ð.‚ Ìx˃Y.èŸ133333Ch„¹O«W¯^½zµ˜ÿ›o¾ùæ›oP{Xfàƒ>øàƒ¤åQöøÊž/‚R„[˜Ù…!mX‘‹RðWFDDDžÐcb4šbññññññ²)cU°8Æìˆ±†ôµüwñS233333ñ éiiiiii˜}Í^"""""ê€êQÄP‡ˆˆˆˆˆ: †:DDDDDÔ1Ô!""""¢ˆ¡u@ u4€–D—.]ºté‚ÝfJKKKKKåç×ÑÑÑÑÑyã7Þxã i~HMMMMMurrrrrÂñ± &ÒÅœXæ[^ZZZZZZb˜I“&Mš4IܱG}õ Hz{¾Ž¼«‰ˆˆˆÔ¡Ž®&^[[[[[»páÂ… ŠkÊÊ_WWWWW‡-#¥ùÓÓÓÓÓÓ######cccccc««««««·mÛ¶mÛ¶eË–-[¶ k“#ÿúõëׯ_åÊ•+W®äæææææ^¿~ýúõë!!!!!!(›ºëA‘ôö|‰ˆˆˆHÝêh$ôÒxzzzzzfeeeeeÉϯ«««««.͘˜˜˜˜èìììììŒ^ôð`˧•+W®\¹ù7oÞ¼yóæ¥K—.]ºÔÔÔÔÔÔé^^^^^^“T9»šššššš      CCCCCCô/]¸páÂ… ò?{ìØ±cÇŽ¡— g‘ æAà7gΜ9sæàøÛ·oß¾}{¿~ýúõë'æ{c>|øðaäwqqqqqù믿þúë¯Ö*?µV&Âî°IIIIIINäçGø±wïÞ½{÷bŸZñÝüüüüü|1h™›››››çååååå!¥¨¨¨¨¨H}Õ¬¬¬¬¬¬*+++++ïß¿ÿþ}ô2ÉÿlrrrrrrAAAAAÁ‘#GŽ9âïïïïïßØØØØØˆ<¡¡¡¡¡¡zzzzzz%%%%%%]»víÚµë8ððáÇŠÇDo B¼‹A€ø®?üðÃ?D@¨zù‰ˆˆˆ¨µh­X±bÅŠhüÄÇÇÇÇÇs°M»»TÂmmmmmí#FŒ1".....nРAƒ ’•ììììììŽ?~üøñ^½zõêÕ é/¼ð /¼P\\\\\,ëÛ­­­­­­1h ߎàýK­{¦&&&&&&Bôõõõõõ‘^UUUUUeddddd$½?q¾MMMMMMb©.æ766666ÆñÑë¢xý#ÔA©ÌÌÌÌÌÌP6UÊODDDÔQá¡0¸777777K'\ˆ¯å¿‹×xôŸ™™™™™éãããããƒô´´´´´4L¾`¯Ž†Q¶‰,æÇ„4b¨ckkkkk{÷îÝ»wïŠéPVVVVV6tèСC‡"ÅÆÆÆÆÆý<msŽ-äV‘Ð ? üÌT/íãÇ?~ÜZå'"""¢Ö¹:Ï,c€^ 1="""""ÂÛÛÛÛÛ;;;;;;}#999999ˆ’1ÏùшÌ{A–4À UÊéççççç·fÍš5kÖ )/////‰‰‰‰‰Q½|}}}}}±‚RÐß‚ç ð&ë³'Nœ8qâJ…rX¯-ËODDDDŠ`¨£Ä¡hŠ,U,+?^£FœiãîîîîîŒy,Ë—/_¾|ùÈ‘#Gމü~РG`ƒ![XØ@º €²$âÈ'ĵã䟣ü×›6mÚ´i˜aø–1ؽ{÷îÝ»W¯^½zõjYeÃŒ¦çŸþùçŸÇšuè+S¥üDDDD¤œ«C¤ØOE2燈ˆˆˆñ´æê°W‡è?P¶WˆˆˆˆÚ.K@ô°'‡ˆˆˆH±W‡ˆˆˆˆˆ: †:DDDDDÔ1Ô!""""¢ˆ¡u@ u4€–D—.]ºté‚ÝZJKKKKKåç×ÑÑÑÑÑyã7Þxã i~HMMMMMurrrrrÂñ‘.æÄ4}lÁiiiiii‰}i&Mš4iÒ$qÇÕÏW}5Ù–%i›uÛÔWoDDDDšˆ¡Ž®&^[[[[[»páÂ… ŠSÊÊ_WWWWW7jÔ¨Q£FIó§§§§§§cCÌØØØØØØêêêêêêmÛ¶mÛ¶mÙ²eË–-ÃÚäÈM3¯\¹råÊ•ÜÜÜÜÜÜëׯ_¿~=$$$$$ek­óU_M¶eI9N=zôèÑ>눈ˆH1ÔÑHè¥ñôôôôôÌÊÊÊÊÊ’Ÿ_WWWWW7<<<<<\š?::::::11111ÑÙÙÙÙÙ½:èáÁ–O+W®\¹r%òoÞ¼yóæÍK—.]ºt©©©©©©)Ò½¼¼¼¼¼&µÖ™;vìØ±cè5B©Ä<‹-Z´h‘µµµµµõÀ¸`Á‚ 444444Hü×_ýõ×_#FŒ1bÂŒwÞyçwÞ‘U~eó=zôèÑ£Šô´"•öÈIó×ÔÔÔÔÔá³è»páÂ… øë """†: »Ã&%%%%%!8‘ŸÍñÝ»wïÞ½ûÔŠïæççççç‹A‹ÈÜÜÜÜÜ>>>>žƒaÚÝ¥žñkkkkkk£‡!.....nРAƒ ’•ììììììŽ?~üøñ^½zõêÕ é/¼ð /¼P\\\\\,ëÛÑ[‚@ߎ¾ô/©ï|›šššššÄoAºxöìÙ³gÏž7nܸqã†8 ½èºwïÞ½{÷Ä#ܾ}ûöíÛbÀ†übø¡l~Yç"ÿ7¥H011111))))))Ñ×××××G:Ê`dddddÄß/µ%„îÍÍÍÍÍÍÒ âkùïâ5ýgfffffúøøøøø =----- “/tž*îT™m‚96iÄPÇÖÖÖÖÖöîÝ»wïÞÓ¡¬¬¬¬¬lèСC‡EŠ úyÔw¾Š„Ròû@¯±Ç?~üœ:ò«û5TˆˆˆèÙÄlÏ µB/˜áííííí¾”œœœœœDɘçƒüè D f˜ ‡K¸¸¸¸¸¸´åy¡7rË–-[¶lÓQ¼+ýÞE_ ú|0gÉÏÏÏÏÏOõüÊÂ|*ÌDBuùòåË—/¯Y³fÍš5bN|#Òñ\¤¼¼¼¼¼<&&&&&†÷90ÔÑâP4E––•¯Ñ#ÄrwwwwwŠŠŠŠŠ ÖÓÓÓÓÓ \¾|ùòåËGŽ9räHäGðƒ7 ©Â<é²­u¾²^¯^½zõêÕ˜Ÿóœ °°°°°ïJ?…E°@6–ÌÆ œ¯¾úꫯ¾jY~éYHË,ë Š3‘0, Ë*HCG98;Ô<–×Öã’ÓDDDDœ«CDDDDDjô´æê°W‡ˆˆˆˆˆ: †:DDDDDÔ1Ô!""""¢ˆ¡u@ÜW‡ˆˆˆˆˆÔîáÇ>lËod¨CDDDDDjÔ¿ÿþýûcµ4uYÖ»À¦´$ºtéÒ¥Kì¦RZZZZZ*?¿ŽŽŽŽŽÎo¼ñÆoHóCjjjjjª“““““Žïèèèèèˆt1'–ùÛ°aÆ °ÃLß¾}ûöí‹=gÄ{T?_õÕd[–D}»Ü¨¯®ÚçýÏ¿DDDšhРAƒ ’–( GÑeåa¯Ž@h¦^c=òƒ|øðáÒ<ìÕÑHè¥ñôôôôôÌÊÊÊÊÊ’Ÿ_WWWWW7<<<<<\š?::::::11111ÑÙÙÙÙÙ½:èáÁ–O+W®\¹r%òoÞ¼yóæÍK—.]ºt)‚¤{yyyyyUWWWWW·Ö™;vìØ±cè5B©Ä<‹-Z´h‘µµµµµõÀ¸`Á‚ 444444Hü×_ýõ×_#FŒ1bÂŒwÞyçwÞ‘U~eó=zôèÑ£ŠôHÖÕÕÕÕÕI{äZ«&çÎ;wî\›îÝ»wïÞ}ôèÑ£GF9Åœ²¾]‘ô7nܸw…¬ë…33gΜ9spîÛ·oß¾}{¿~ýúõë§Êý@DDDí ‚l!Ї˜x ß$h4ÜÜÜÜÜÜpdYßËPG#áVHJJJJJBp"??šã»wïÞ½{7n2ñÝüüüüü|1h™›››››çååååå!¥¨¨¨¨¨HõjŠHNNNNN.(((((سgÏž={üýýýýýÅ<‹/^¼x1z¢®\¹råÊô8!%,,,,,Lzä;vìØ±Þõëׯ_¿ŽFöÂ… .\¨z~Eúsªªªªªªðú‰DkÕäªU«V­ZuùòåË—/ã—,Y²dÉoooooo1§¬ïU$½¬¬¬¬¬ ƒ$e]¯ÐÐÐÐÐPôâÏî(}}}}}}ù¹ˆˆˆˆþ5Õ×××××O:uêÔ©HBíŒxÕ´µµµµµË¢q¯HÙÎÎÎÎή¢¢¢¢¢BÌieeeee%ÿÛ1RJ„8[Ýç+ýéýilllll\SSSSS#¦#ÀûÒ#ܾ}ûöíÛÒüªä—u.ªçiÙgÿüóÏ?ÿü¡ ôêàþ‘õYõ¥=xðàÁƒê¸ˆˆˆ¨½Ù»wïÞ½{ñ@óÞ½{÷îݫܠ¥Z.¸#¸-¸yóæÍ›7qdñ»01{u4 .!zu222222äOÆ/|ppppppqqqqq±˜ÇÖÖÖÖÖ·—ôxN?tèСC‡"ƒ Ä~õÁP=Eêd½«Èw¡ a¤:ò?-S¦L™2eÊøñãÇ^iè¡Rü88_ÕË#vO«ã~ """†:Ï µŠ‹‹‹‹‹Ó#"""""0);;;;;ÏÎsrrrrr||||||0Ïù%#ó.0zK¸¸¸¸¸¸´åylÙ²eË–-b:ʃw¥ŸÂ»x*€§ ˜³äççççç§z~ea>fž ¨À`³5kÖ¬Y³F•##XÅzzèƒÂ€1,/¡HynݺuëÖ- |øðáÃÒoÙ¶mÛ¶mÛ0(â°,æi¨ã|e¥ãî?þüùó{ ‚w¥G@ï3 èz÷Ýwß}÷]ôx´,¿ü³ÑÐGÍãø˜U…µòT9þ®]»víÚÕ§OŸ>}útëÖ­[·n'Nœ8q"æhÉúÊÓµk×®]»b>B_ů‹¬tt^áÏ0üýA¿“*÷µ7Š `“þË®ú6-üž×âùw|||||<²2²$"""""Uà*ãb»k˜˜˜˜˜˜Èú,‚¼?…!ñØ–£ŽON:uêÔ)`#""""¢§@~ª¬úË ¾DDDDDô`›ØW#ESZv|öêQÄP‡ˆˆˆˆˆ: †:DDDDDÔq®©›nËod¨CDDDDDjÔ¿ÿþýûcahuYÖ»ÀFDDDDD{uˆˆˆˆˆHJJJJJJÆŒ3f̘Ö=rjjjjjêðáÇ.}—¡©]çÎ;wîÜÜÜÜÜÜ,kçùûꈯ=zôèÑ#ùßÈlDDDDDÔ1Ô!""""¢ˆ¡u@œ«CDDDDDO‰‰‰‰‰‰"9ïܹsçÎeÏ^"""""z *+++++åçiY uˆˆˆˆˆè©¹{÷îÝ»w¥éååååå媙¡=ebÀ£z uˆˆˆˆˆ¨]¨¨¨¨¨¨h­£1Ô!""""¢ˆ¡u@ uˆˆˆˆˆ¨â¾:DDDDD¤Fýû÷ïß¿ÿ‘#GŽ9âæææææ¦ú1333333qdYyê‘ 4hРAxEõc"È,õ„:Ož êäääääÄ ÖÞœ;wîܹs¬""""jN:uêÔ)GGGGGGqbÞhŸ…njjjjjzùå—_~ùe^Âö +++++ëÌ™3gΜamQ{€ 1ŽÖ½{÷îÝ»×þ ýÍ7ß|óÍ7ÎÎÎÎÎÎ xž.1Èyÿý÷ßÿ}Ö µ72C¬¬?þÈξpáÂ…K—Ú²@öööövv/¿ìâòMWBÀZWWWWWÇKØ–0\ ½ rˆˆˆˆ¨=û?V`ƒœààÙ³çÌiËmÙûÝwx-+à!""""¢ö©°°°°°°¤¤¤¤¤¤m¾QÖÂÓÿG¨ƒ gÖ¬Y³‚ƒ>¬©©©i˪ñöþÛß||ýõ—_êi 1È7nܸqãÚæ{±9)^‹Ì-DŸÿš¾}ýµwï'O´µ»v½qcòäÒRe Úº»úœ~ÜÔÔÔôøqSScã“'HÁ»MM 5666>yÒЀœ 7444wîܹsç~òÉ'Ÿ|òÉĉ'Nœ˜1}úôéÓ§óFDDDDíMFFFFFFZ‰éýõ×_ý%M—ÏÒÒÒÒÒRÖ»-ìÕùŸ su~ü±S§¯_‰Ú IDAT¿F¯ÎìÙÍÍÍÍ‘‘Ož|óMDÄ“'™™»w77Ï™ãìŒO=­lÍÍMM÷ï—–––––ŠAúj033y>|øðáæ¦ÆÆ¦&1øS¼Wá ‚¨ï¿ÿþûï¿9räÈ‘#ðœ?þüùóÒOmÚ´iÓ¦MññññññØ8UìQÁ&žS¦L™2eJ×®]»ví:uêÔ©S§Þ¿ÿþýûü ÑÓ"«=/9ådddddd$9b:Æ.YXXXXX`çä0`À€ÿ½r‹{uþï]½:aBiéÀ_ݯŸ4¥sg-­òò¢¢ñ㋊ 8|xÀsçΜAù="ê[–@K Êÿ NC`€¦^Ð À€7±6þÝ«£hpÁÖ®]»víZ¤ |BØóþûï¿ÿþûX®@üTNNNNN–¸sçÎ;wúöíÛ·o_¼[^^^^^Ž#`€\^^^^^ZDDDDÔˆ­z9/¼ð /¼€0ïææææææJÓ1–Jz4<úW¼›Df¨ƒ àñã'Oþ*ÀgŸ-[þ?ÿÚ´¿:yòãwîtwðøñ»ïž8ñÖ[bñhQQÿøÇ—_þïÓxüø£*š›=ú÷‘;uêܽ7!Ø4 š$þg@[§NŠ—ïâÅ‹/^ÄJkÿûßÿþ÷¿¯\¹råÊ•ÒOa¸Úwß}÷Ýwß}ñÅ_|ñÅ?ÿùÏþóŸx}8&L˜0af!Æ1bĈ#ÔwËr®)A&qˆéx¬/MGk£®´x·¢¢¢¢¢¢ªªªªªÊØØØØØé­Ð«³|yddDÄÎ;wî܉ž1rrrrrò;ï$$tê´|ù矯\¹|ù²eááòó#pB~ùmlŠ×=zôä úCÄ9MMMróeæê`Qi H B¨ƒwww÷ÿ ÿÿÞ{ï½÷Þ{oÛ¶mÛ¶mCï½½½½½=fø`hºð>ÿüóÏ?ÿœ?'""""jÄV=:0íBÌ#MGƒ¶:ôB˹¦¦¦¦¦SQ0Ù ŒaMcYePb®Žø®¾ÄàÁƒ,=1Åó«g®Îÿ `«©©­­­E5‰CÔehnnjjnF؃€Çùw¯Ž¢eÀÎ9¸0®®®®®®N°4ÂæÍ›7oÞ,본„ÿøÇ?þñ|öÙgŸ}öÒñ),c=lذaÆIÇ,µ=i{-p¼{i¤éèÕA7&q\»víÚµk………………rÌÌÌÌÌÌþ§ B…^ÇŸ<ùüó¨¨%KdõÏšÚ˜(õÙgŸ~ªlþÈÈÏ>‹ŽnÝP§¡¡¾þßUàà`ook;dÈ€=z<–á‘ x#•-B;ôá(’_ºÝçXRþ&sbe6ùG#""""jK;wîüï‰$b¨#+­îäéÝ»wïÞ½±Ž13ÿ½J/K Æ^Rb_Í;ï¼óÎ;ï(^êèÕ)))-­®¾u«¼üÉ''g熆æfggôЈk©=zô?¯Å”ÿ=9Ožtêtþ|QÑãÇ••·o×Ö>k·)çê‘"Ķ=BôÕˆK ÈJÇÐ5é‚aHAWD«ì«óäÉ“'èŸ)*****’JèÁÀ4ze«£¾¾¡¡µCoïqãôôöîýå—‚‚G°ýgëÿý÷gÌ01áMLDDDD$’¶·Ò ˜WW“¦ëêêêêê"î@xƒø½:èÉA¨#.K ‹B¡ö~ÁÜõUŠ‹ËË/»»·n¨cook«§‡ÿò¶#""""jb«^ i¤ØÄô7nܸq[³˜›››››c“P¬½†uÛ0º´B¯Ž˜>sæÌ™3gª£:.^¼té楅 uˆˆˆˆˆèiÁ¢\ЧcÛPôäôéÓ§OŸ>˜3t¬EŒUÚÉÿön!ªmÿ¤,ÎÕ!""""õ1H×X³(r´ÿ#Ô±····³KHøå—Ÿ~íµ×^5 évv/¾èäôÇÙÙ¹¹ê;½ßÿý÷ß~Cx±‰ˆˆˆˆ4Eÿþýû÷––––ææææææÖ6ß›™™™™™‰oÓÿPçå—]\†ÇkmYArÄ2Qû7hРAƒá5¶ù^9â·ƒÌl6r‘â žnIt4«â×®]»víZ''''''ÞLméܹsçÎÃU`mQ{¦a¡Ž8æÍn^¶„ §-G^µŒÖ½{÷îݻNJ """"¢ŽD›U@DDDDDC"""""ê€þb|ÞÕ›m§IEND®B`‚xymon-4.3.28/docs/configure.txt0000664000076400007640000001063412603243142016665 0ustar rpmbuildrpmbuildConfiguration script for Xymon This script asks a few questions and builds a Makefile to compile Xymon Checking your make-utility Checking pre-requisites for building Xymon Checking for fping ... Found fping in /usr/bin/fping Checking to see if '/usr/bin/fping 127.0.0.1' works ... 127.0.0.1 is alive OK, will use '/usr/bin/fping' for ping tests NOTE: If you are using an suid-root wrapper, make sure the 'xymon' user is also allowed to run fping without having to enter passwords. For 'sudo', add something like this to your 'sudoers' file: xymon: ALL=(ALL) NOPASSWD: /usr/local/sbin/fping Checking for RRDtool ... Found RRDtool include files in /usr/include Found RRDtool libraries in /usr/lib Linking RRD with PNG library: -L/usr/lib -lpng Checking for PCRE ... Found PCRE include files in /usr/include Found PCRE libraries in /usr/lib Checking for OpenSSL ... Found OpenSSL include files in /usr/include Found OpenSSL libraries in /usr/lib Xymon can use the OpenSSL library to test SSL-enabled services like POP3S, IMAPS, NNTPS and TELNETS. If you have the OpenSSL library installed, I recommend that you enable this. Do you want to be able to test SSL-enabled services (y) ? y Checking for LDAP ... Found LDAP include files in /usr/include Found LDAP libraries in /usr/lib Xymon can use your OpenLDAP LDAP client library to test LDAP servers. Do you want to be able to test LDAP servers (y) ? y Enable experimental support for LDAP/SSL (OpenLDAP 2.x only) (y) ? y Setting up for a Xymon server What userid will be running Xymon [xymon] ? Found passwd entry for user xymon:x:1000:100:Xymon user:/usr/lib/xymon: Where do you want the Xymon installation [/usr/lib/xymon] ? OK, will configure to use /usr/lib/xymon as the Xymon toplevel directory What URL will you use for the Xymon webpages [/xymon] ? Where to put the Xymon CGI scripts [/usr/lib/xymon/cgi-bin] ? What is the URL for the Xymon CGI directory [/xymon-cgi] ? ********************** SECURITY NOTICE **************************** If your Xymon server is accessible by outsiders, then you should restrict access to the CGI scripts that handle enable/disable of hosts, and acknowledging of alerts. The easiest way to do this is to put these in a separate CGI directory and require a password to access them. If your Xymon server is on a secure network (Intranet) and you trust your users, then you can keep all the CGI scripts in one directory. Where to put the Xymon Administration CGI scripts [/usr/lib/xymon/cgi-secure] ? What is the URL for the Xymon Administration CGI directory [/xymon-seccgi] ? ** Note that you may need to modify your webserver configuration. ** After installing, see /usr/lib/xymon/server/etc/xymon-apache.conf for an example configuration. To generate Xymon availability reports, your webserver must have write-access to a directory below the Xymon top-level directory. I can set this up if you tell me what group-ID your webserver runs with. This is typically 'nobody' or 'apache' or 'www-data' If you don't know, just hit ENTER and we will handle it later. What group-ID does your webserver use ? www-data Where to put the Xymon logfiles [/var/log/xymon] ? What is the name of this host [osiris] ? osiris.hswn.dk What is the IP-address of this host [127.0.0.1] ? 172.16.10.100 Where should I install the Xymon man-pages (/usr/local/man) ? The Xymon history webpage by default displays a 1-day graph of the history. It can also show a 1-week, 4-weeks and 1-year graphs, or any combination of these. Which graphs to show by default (1d/1w/4w/1y/all) [all] The Xymon history webpage can use a new method to create the summary graphs on the history page. This method gives a more accurate view (more detailed), but uses a fixed-width graph instead of the standard Big Brother graph that automatically resizes to fit your browser window. Use the new detailed Xymon history graph (y/n) [y] ? Tell me the display width (in pixels) to use for the history graph. This could be anything, but to eliminate as many rounding errors as possible, it is best to use a multiple of 24. The default value (960) is good on 1024x768 displays What width should I use for the graph [960] ? Using Linux Makefile settings Created Makefile with the necessary information to build Xymon Some defaults are used, so do look at the Makefile before continuing. Configuration complete - now run make (GNU make) to build the tools xymon-4.3.28/rpm/0000775000076400007640000000000013037531513014011 5ustar rpmbuildrpmbuildxymon-4.3.28/rpm/xymon-client.init0000664000076400007640000000353512652231300017323 0ustar rpmbuildrpmbuild#! /bin/sh # # xymon-client This shell script takes care of starting and stopping # the Xymon client. # # chkconfig: 2345 80 20 # description: Xymon is a network monitoring tool that allows \ # you to monitor hosts and services. This client reports local \ # system statistics (cpu-, memory-, disk-utilisation etc) \ # to the Xymon server. PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DAEMON=/usr/lib/xymon/client/runclient.sh NAME=xymon-client DESC=xymon-client test -x $DAEMON || exit 0 CMD="$1" # Include xymon-client defaults if available DMNOPTS="" if [ -f /etc/default/xymon-client ] ; then . /etc/default/xymon-client else echo "Installation failure - missing /etc/default/xymon-client" exit 1 fi if [ "$XYMONSERVERS" = "" ]; then echo "Please configure XYMONSERVERS in /etc/default/xymon-client" exit 1 fi set $XYMONSERVERS if [ $# -eq 1 ]; then echo "XYMSRV=\"$XYMONSERVERS\"" >/var/run/xymonclient-runtime.cfg echo "XYMSERVERS=\"\"" >>/var/run/xymonclient-runtime.cfg else echo "XYMSRV=\"0.0.0.0\"" >/var/run/xymonclient-runtime.cfg echo "XYMSERVERS=\"$XYMONSERVERS\"" >>/var/run/xymonclient-runtime.cfg fi if [ "$CLIENTHOSTNAME" != "" ]; then DMNOPTS="${DMNOPTS} --hostname=${CLIENTHOSTNAME}" fi if [ "$CLIENTOS" != "" ]; then DMNOPTS="${DMNOPTS} --os=${CLIENTOS}" fi set -e case "$CMD" in start) echo -n "Starting $DESC: " su -c "$DAEMON $DMNOPTS start" - xymon echo "$NAME." ;; stop) echo -n "Stopping $DESC: " su -c "$DAEMON $DMNOPTS stop" - xymon echo "$NAME." ;; status) su -c "$DAEMON $DMNOPTS status" - xymon ;; restart) echo -n "Restarting $DESC: " su -c "$DAEMON $DMNOPTS stop" - xymon su -c "$DAEMON $DMNOPTS start" - xymon echo "$NAME." ;; *) N=/etc/init.d/$NAME # echo "Usage: $N {start|stop|restart}" >&2 echo "Usage: $N {start|stop|restart}" >&2 exit 1 ;; esac exit 0 xymon-4.3.28/rpm/xymon.spec0000664000076400007640000001320312266740721016044 0ustar rpmbuildrpmbuildName: xymon Version: @VER@ Release: 1 Group: Networking/Daemons URL: http://xymon.sourceforge.net/ License: GPL Source: xymon-@VER@.tar.gz Source1: xymon-init.d Source2: xymon.logrotate Source3: xymon-client.init Source4: xymon-client.default Summary: Xymon network monitor BuildRoot: /tmp/xymon-root #BuildRequires: openssl-devel #BuildRequires: pcre-devel #BuildRequires: rrdtool-devel #BuildRequires: openldap-devel Conflicts: xymon-client %description Xymon (previously known as Hobbit) is a system for monitoring your network servers and applications. This package contains the server side of the Xymon package. %package client Summary: Xymon client reporting data to the Xymon server Group: Applications/System Conflicts: xymon %description client This package contains a client for the Xymon (previously known as Hobbit) monitor. Clients report data about the local system to the monitor, allowing it to check on the status of the system load, filesystem utilisation, processes that must be running etc. %prep rm -rf $RPM_BUILD_ROOT %setup USEXYMONPING=y \ ENABLESSL=y \ ENABLELDAP=y \ ENABLELDAPSSL=y \ XYMONUSER=xymon \ XYMONTOPDIR=/usr/lib/xymon \ XYMONVAR=/var/lib/xymon \ XYMONHOSTURL=/xymon \ CGIDIR=/usr/lib/xymon/cgi-bin \ XYMONCGIURL=/xymon-cgi \ SECURECGIDIR=/usr/lib/xymon/cgi-secure \ SECUREXYMONCGIURL=/xymon-seccgi \ HTTPDGID=apache \ XYMONLOGDIR=/var/log/xymon \ XYMONHOSTNAME=localhost \ XYMONHOSTIP=127.0.0.1 \ MANROOT=/usr/share/man \ INSTALLBINDIR=/usr/lib/xymon/server/bin \ INSTALLETCDIR=/etc/xymon \ INSTALLWEBDIR=/etc/xymon/web \ INSTALLEXTDIR=/usr/lib/xymon/server/ext \ INSTALLTMPDIR=/var/lib/xymon/tmp \ INSTALLWWWDIR=/var/lib/xymon/www \ ./configure %build PKGBUILD=1 make %install INSTALLROOT=$RPM_BUILD_ROOT PKGBUILD=1 make install mkdir -p $RPM_BUILD_ROOT/etc/init.d cp %{SOURCE1} $RPM_BUILD_ROOT/etc/init.d/xymon cp %{SOURCE3} $RPM_BUILD_ROOT/etc/init.d/xymon-client mkdir -p $RPM_BUILD_ROOT/etc/logrotate.d cp %{SOURCE2} $RPM_BUILD_ROOT/etc/logrotate.d/xymon mkdir -p $RPM_BUILD_ROOT/etc/default cp %{SOURCE4} $RPM_BUILD_ROOT/etc/default/xymon-client mkdir -p $RPM_BUILD_ROOT/usr/bin cd $RPM_BUILD_ROOT/usr/bin && ln -sf ../lib/xymon/server/bin/{xymon,xymoncmd} . mkdir -p $RPM_BUILD_ROOT/etc/httpd/conf.d mv $RPM_BUILD_ROOT/etc/xymon/xymon-apache.conf $RPM_BUILD_ROOT/etc/httpd/conf.d/ rmdir $RPM_BUILD_ROOT/usr/lib/xymon/client/tmp cd $RPM_BUILD_ROOT/usr/lib/xymon/client && ln -sf /tmp tmp rmdir $RPM_BUILD_ROOT/usr/lib/xymon/client/logs cd $RPM_BUILD_ROOT/usr/lib/xymon/client && ln -sf ../../../../var/log/xymon logs mv $RPM_BUILD_ROOT/usr/lib/xymon/client/etc/xymonclient.cfg /tmp/xymonclient.cfg.$$ cat /tmp/xymonclient.cfg.$$ | sed -e 's!^XYMSRV=.*!include /var/run/xymonclient-runtime.cfg!' | grep -v "^XYMSERVERS=" >$RPM_BUILD_ROOT/usr/lib/xymon/client/etc/xymonclient.cfg rm /tmp/xymonclient.cfg.$$ %clean rm -rf $RPM_BUILD_ROOT %pre id xymon 1>/dev/null 2>&1 if [ $? -ne 0 ] then groupadd xymon || true useradd -g xymon -c "Xymon user" -d /usr/lib/xymon xymon fi if [ -e /var/log/xymon/xymonlaunch.pid -a -x /etc/init.d/xymon ] then /etc/init.d/xymon stop || true fi %pre client id xymon 1>/dev/null 2>&1 if [ $? -ne 0 ] then groupadd xymon || true useradd -g xymon -c "Xymon user" -d /usr/lib/xymon xymon fi if [ -e /var/log/xymon/clientlaunch.pid -a -x /etc/init.d/xymon-client ] then /etc/init.d/xymon-client stop || true fi %post chkconfig --add xymon %post client chkconfig --add xymon-client %preun if [ -e /var/log/xymon/xymonlaunch.pid -a -x /etc/init.d/xymon ] then /etc/init.d/xymon stop || true fi chkconfig --del xymon %preun client if [ -e /var/log/xymon/clientlaunch.pid -a -x /etc/init.d/xymon-client ] then /etc/init.d/xymon-client stop || true fi chkconfig --del xymon-client %files %attr(-, root, root) %doc README README.CLIENT Changes* COPYING CREDITS RELEASENOTES %attr(644, root, root) %doc /usr/share/man/man*/* %attr(644, root, root) %config /etc/xymon/* %attr(644, root, root) %config /etc/httpd/conf.d/xymon-apache.conf %attr(755, root, root) %dir /etc/xymon %attr(755, root, root) %dir /etc/xymon/tasks.d %attr(755, root, root) %dir /usr/lib/xymon/server/download %attr(755, root, root) %dir /etc/xymon/web %attr(755, xymon, xymon) %dir /var/log/xymon %attr(755, root, root) /etc/init.d/xymon %attr(644, root, root) /etc/logrotate.d/xymon %attr(-, root, root) /usr/lib/xymon %attr(-, root, root) /usr/bin/* %attr(-, xymon, xymon) /var/lib/xymon %attr(775, xymon, apache) %dir /var/lib/xymon/www/rep %attr(775, xymon, apache) %dir /var/lib/xymon/www/snap %attr(644, root, root) %config /var/lib/xymon/www/menu/xymonmenu-grey.css %attr(644, root, root) %config /var/lib/xymon/www/menu/xymonmenu-blue.css %attr(755, xymon, xymon) %dir /usr/lib/xymon/client/ext %attr(664, xymon, apache) %config /etc/xymon/critical.cfg %attr(664, xymon, apache) %config /etc/xymon/critical.cfg.bak %attr(4750, root, xymon) /usr/lib/xymon/server/bin/xymonping %attr(750, root, xymon) /usr/lib/xymon/client/bin/logfetch %attr(750, root, xymon) /usr/lib/xymon/client/bin/clientupdate %files client %attr(-, root, root) %doc README README.CLIENT Changes* COPYING CREDITS RELEASENOTES %attr(-, root, root) /usr/lib/xymon/client %attr(755, root, root) /etc/init.d/xymon-client %attr(644, root, root) %config /etc/default/xymon-client %attr(755, xymon, xymon) %dir /var/log/xymon %attr(755, xymon, xymon) %dir /usr/lib/xymon/client/ext %attr(750, root, xymon) /usr/lib/xymon/client/bin/logfetch %attr(750, root, xymon) /usr/lib/xymon/client/bin/clientupdate xymon-4.3.28/rpm/xymon-client.default0000664000076400007640000000134412603243142020003 0ustar rpmbuildrpmbuild# Configure the Xymon client settings. # You MUST set the list of Xymon servers that this # client reports to. # It is good to use IP-addresses here instead of DNS # names - DNS might not work if there's a problem. # # E.g. (a single Xymon server) # XYMONSERVERS="192.168.1.1" # or (multiple servers) # XYMONSERVERS="10.0.0.1 192.168.1.1" XYMONSERVERS="" # The defaults usually suffice for the rest of this file, # but you can tweak the hostname that the client reports # data with. # CLIENTHOSTNAME="" # Red Hat EL version 3 uses a different vmstat layout # than all other Linux versions. So for a client running this # particular OS, set CLIENTOS as below. # Do NOT set this on any other Red Hat version. # CLIENTOS="rhel3" xymon-4.3.28/rpm/xymon.logrotate0000664000076400007640000000042211535462534017112 0ustar rpmbuildrpmbuild# # Logrotate fragment for Xymon. # /var/log/xymon/*.log { weekly compress delaycompress rotate 5 missingok nocreate sharedscripts postrotate /etc/init.d/xymon rotate endscript } xymon-4.3.28/rpm/xymon-init.d0000664000076400007640000000244112652231300016263 0ustar rpmbuildrpmbuild#! /bin/sh # # xymon This shell script takes care of starting and stopping # xymon (the Xymon network monitor) # # chkconfig: 2345 80 20 # description: Xymon is a network monitoring tool that allows \ # you to monitor hosts and services. The monitor status is available \ # via a webpage. PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DAEMON=/usr/lib/xymon/server/bin/xymon.sh NAME=xymon DESC=Xymon test -x $DAEMON || exit 0 # Include Xymon defaults if available if [ -f /etc/default/xymon ] ; then . /etc/default/xymon fi set -e case "$1" in start) echo -n "Starting $DESC: " su -c "$DAEMON start" - xymon echo "$NAME." ;; stop) echo -n "Stopping $DESC: " su -c "$DAEMON stop" - xymon echo "$NAME." ;; status) su -c "$DAEMON status" - xymon ;; reload|force-reload) echo "Reloading $DESC configuration files." su -c "$DAEMON reload" - xymon echo "$NAME." ;; restart) echo -n "Restarting $DESC: " su -c "$DAEMON restart" - xymon echo "$NAME." ;; rotate) echo -n "Rotating logs for $DESC: " su -c "$DAEMON rotate" - xymon echo "$NAME." ;; *) N=/etc/init.d/$NAME # echo "Usage: $N {start|stop|restart|status|reload|force-reload}" >&2 echo "Usage: $N {start|stop|restart|status|force-reload}" >&2 exit 1 ;; esac exit 0 xymon-4.3.28/xymonproxy/0000775000076400007640000000000013037531514015470 5ustar rpmbuildrpmbuildxymon-4.3.28/xymonproxy/xymoncgimsg.c0000664000076400007640000000260411615341300020172 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon CGI proxy. */ /* */ /* This CGI can gateway a Xymon message sent via HTTP PORT to a Xymon */ /* server running on the local host. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: xymoncgimsg.c 6712 2011-07-31 21:01:52Z storner $"; #include "libxymon.h" int main(int argc, char *argv[]) { int result = 1; cgidata_t *cgidata = NULL; sendreturn_t *sres; cgidata = cgi_request(); if (cgidata) { printf("Content-Type: application/octet-stream\n\n"); sres = newsendreturnbuf(1, stdout); result = sendmessage(cgidata->value, "127.0.0.1", XYMON_TIMEOUT, sres); } return result; } xymon-4.3.28/xymonproxy/xymonproxy.80000664000076400007640000001736213037531444020050 0ustar rpmbuildrpmbuild.TH XYMONPROXY 8 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME xymonproxy \- Xymon message proxy .SH SYNOPSIS .B "xymonproxy [options] \-\-server=$XYMSRV" .SH DESCRIPTION .I xymonproxy(8) is a proxy for forwarding Xymon messages from one server to another. It will typically be needed if you have clients behind a firewall, so they cannot send status messages to the Xymon server directly. xymonproxy serves three purposes. First, it acts as a regular proxy server, allowing clients that cannot connect directly to the Xymon servers to send data. Although xymonproxy is optimized for handling status messages, it will forward all types of messages, including notes- and data-messages. .br Second, it acts as a buffer, smoothing out peak loads if many clients try to send status messages simultaneously. xymonproxy can absorb messages very quickly, but will queue them up internally and forward them to the Xymon server at a reasonable pace. .br Third, xymonproxy merges small "status" messages into larger "combo" messages. This can dramatically decrease the number of connections that need to go from xymonproxy to the Xymon server. The merging of messages causes "status" messages to be delayed for up to 0.25 seconds before being sent off to the Xymon server. .SH OPTIONS .IP "\-\-server=SERVERIP[:PORT][,SERVER2IP[:PORT]]" Specifies the IP-address and optional portnumber where incoming messages are forwarded to. The default portnumber is 1984, the standard Xymon port number. If you have setup the normal Xymon environment, you can use "\-\-server=$XYMSRV". Up to 3 servers can be specified; incoming messages are sent to all of them (except "config", "query" and "download" messages, which go to the LAST server only). If you have Xymon clients sending their data via this proxy, note that the clients will receive their configuration data from the LAST of the servers listed here. This option is required. .IP "\-\-listen=LOCALIP[:PORT]" Specifies the IP-adress where xymonproxy listens for incoming connections. By default, xymonproxy listens on all IP-addresses assigned to the host. If no portnumber is given, port 1984 will be used. .IP "\-\-timeout=N" Specifies the number of seconds after which a connection is aborted due to a timeout. Default: 10 seconds. .IP "\-\-report=[PROXYHOSTNAME.]SERVICE" If given, this option causes xymonproxy to send a status report every 5 minutes to the Xymon server about itself. If you have set the standard Xymon environment, you can use "\-\-report=xymonproxy" to have xymonproxy report its status to a "xymonproxy" column in Xymon. The default for PROXYHOSTNAME is the $MACHINE environment variable, i.e. the hostname of the server running xymonproxy. See REPORT OUTPUT below for an explanation of the report contents. .IP "\-\-lqueue=N" Size of the listen-queue where incoming connections can queue up before being processed. This should be large to accommodate bursts of activity from clients. Default: 512. .IP "\-\-daemon" Run in daemon mode, i.e. detach and run as a background process. This is the default. .IP "\-\-no\-daemon" Runs xymonproxy as a foreground process. .IP "\-\-pidfile=FILENAME" Specifies the location of a file containing the process-ID of the xymonproxy daemon process. Default: /var/run/xymonproxy.pid. .IP "\-\-logfile=FILENAME" Sends all logging output to the specified file instead of stderr. .IP "\-\-log\-details" Log details (IP-address, message type and hostname) to the logfile. This can also be enabled and disabled at run-time by sending the xymonproxy process a SIGUSR1 signal. .IP "\-\-debug" Enable debugging output. .SH "REPORT OUTPUT" If enabled via the "\-\-report" option, xymonproxy will send a status message about itself to the Xymon server once every 5 minutes. The status message includes the following information: .IP "Incoming messages" The total number of connections accepted from clients since the proxy started. The "(N msgs/second)" is the average number of messages per second over the past 5 minutes. .IP "Outbound messages" The total number of messages sent to the Xymon server. Note that this is probably smaller than the number of incoming messages, since xymonproxy merges messages before sending them. .IP "Incoming - Combo messages" The number of "combo" messages received from a client. .IP "Incoming - Status messages" The number of "status" messages received from a client. xymonproxy attempts to merge these into "combo" messages. The "Messages merged" is the number of "status" messages that were merged into a combo message, the "Resulting combos" is the number of "combo" messages that resulted from the merging. .IP "Incoming - Other messages" The number of other messages (data, notes, ack, query, ...) messages received from a client. .IP "Proxy resources - Connection table size" This is the number of connection table slots in the proxy. This measures the number of simultaneously active requests that the proxy has handled, and so gives an idea about the peak number of clients that the proxy has handled simultaneously. .IP "Proxy resources - Buffer space" This is the number of KB memory allocated for network buffers. .IP "Timeout details - reading from client" The number of messages dropped because reading the message from the client timed out. .IP "Timeout details - connecting to server" The number of messages dropped, because a connection to the Xymon server could not be established. .IP "Timeout details - sending to server" The number of messages dropped because the communication to the Xymon server timed out after a connection was established. .IP "Timeout details - recovered" When a timeout happens while sending the status message to the server, xymonproxy will attempt to recover the message and retry sending it to the server after waiting a few seconds. This number is the number of messages that were recovered, and so were not lost. .IP "Timeout details - reading from server" The number of response messages that timed out while attempting to read them from the server. Note that this applies to the "config" and "query" messages only, since all other message types do not get any response from the servers. .IP "Timeout details - sending to client" The number of response messages that timed out while attempting to send them to the client. Note that this applies to the "config" and "query" messages only, since all other message types do not get any response from the servers. .IP "Average queue time" The average time it took the proxy to process a message, calculated from the messages that have passed through the proxy during the past 5 minutes. This number is computed from the messages that actually end up establishing a connection to the Xymon server, i.e. status messages that were combined into combo-messages do not go into the calculation - if they did, it would reduce the average time, since it is faster to merge messages than send them out over the network. .SH "" If you think the numbers do not add up, here is how they relate. The "Incoming messages" should be equal to the sum of the "Incoming Combo/Status/Page/Other messages", or slightly more because messages in transit are not included in the per-type message counts. The "Outbound messages" should be equal to sum of the "Incoming Combo/Page/Other messages", plus the "Resulting combos" count, plus "Incoming Status messages" minus "Messages merged" (this latter number is the number of status messages that were NOT merged into combos, but sent directly). The "Outbound messages" may be slightly lower than that, because messages in transit are not included in the "Outbound messages" count until they have been fully sent. .SH SIGNALS .IP SIGHUP Re-opens the logfile, e.g. after it has been rotated. .IP SIGTERM Shut down the proxy. .IP SIGUSR1 Toggles logging of individual messages. .SH "SEE ALSO" xymon(1), xymond(1), xymon(7) xymon-4.3.28/xymonproxy/xymonproxy.c0000664000076400007640000010310212603243142020100 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message proxy. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: xymonproxy.c 7678 2015-10-01 14:42:42Z jccleaver $"; #include "config.h" #include #include #include #include #include #include #ifdef HAVE_SYS_SELECT_H #include /* Someday I'll move to GNU Autoconf for this ... */ #endif #include #include #include #include #include #include #include #include #include #include #include #include "version.h" #include "libxymon.h" enum phase_t { P_IDLE, P_REQ_READING, /* Reading request data */ P_REQ_READY, /* Done reading request from client */ P_REQ_COMBINING, P_REQ_CONNECTING, /* Connecting to server */ P_REQ_SENDING, /* Sending request data */ P_REQ_DONE, /* Done sending request data to server */ P_RESP_READING, P_RESP_READY, P_RESP_SENDING, P_RESP_DONE, P_CLEANUP }; char *statename[P_CLEANUP+1] = { "idle", "reading from client", "request from client OK", "request combining", "connecting to server", "sending to server", "request sent", "reading from server", "response from server OK", "sending to client", "response sent", "cleanup" }; typedef struct conn_t { enum phase_t state; int csocket; struct sockaddr_in caddr; struct in_addr *clientip, *serverip; int snum; int ssocket; int conntries, sendtries; int connectpending; time_t conntime; int madetocombo; struct timespec arrival; struct timespec timelimit; unsigned char *buf, *bufp, *bufpsave; unsigned int bufsize, buflen, buflensave; struct conn_t *next; } conn_t; #define MAX_SERVERS 3 #define CONNECT_TRIES 3 /* How many connect-attempts against the server */ #define CONNECT_INTERVAL 8 /* Seconds between each connection attempt */ #define SEND_TRIES 2 /* How many times to try sending a message */ #define BUFSZ_READ 2048 /* Minimum #bytes that must be free when read'ing into a buffer */ #define BUFSZ_INC 8192 /* How much to grow the buffer when it is too small */ #define MAX_OPEN_SOCKS 256 #define MINIMUM_FOR_COMBO 2048 /* To start merging messages, at least have 2 KB free */ #define MAXIMUM_FOR_COMBO 32768 /* Max. size of a combined message */ #define COMBO_DELAY 250000000 /* Delay before sending a combo message (in nanoseconds) */ int keeprunning = 1; time_t laststatus = 0; char *logfile = NULL; int logdetails = 0; unsigned long msgs_timeout_from[P_CLEANUP+1] = { 0, }; void sigmisc_handler(int signum) { switch (signum) { case SIGTERM: errprintf("Caught TERM signal, terminating\n"); keeprunning = 0; break; case SIGHUP: if (logfile) { reopen_file(logfile, "a", stdout); reopen_file(logfile, "a", stderr); errprintf("Caught SIGHUP, reopening logfile\n"); } break; case SIGUSR1: /* Toggle logging of details */ logdetails = (1 - logdetails); errprintf("Log details is %sabled\n", (logdetails ? "en" : "dis")); break; } } int overdue(struct timespec *now, struct timespec *limit) { if (now->tv_sec < limit->tv_sec) return 0; else if (now->tv_sec > limit->tv_sec) return 1; else return (now->tv_nsec >= limit->tv_nsec); } static int do_read(int sockfd, struct in_addr *addr, conn_t *conn, enum phase_t completedstate) { int n; if ((conn->buflen + BUFSZ_READ + 1) > conn->bufsize) { conn->bufsize += BUFSZ_INC; conn->buf = realloc(conn->buf, conn->bufsize); conn->bufp = conn->buf + conn->buflen; } n = read(sockfd, conn->bufp, (conn->bufsize - conn->buflen - 1)); if (n == -1) { /* Error - abort */ errprintf("READ error from %s: %s\n", inet_ntoa(*addr), strerror(errno)); msgs_timeout_from[conn->state]++; conn->state = P_CLEANUP; return -1; } else if (n == 0) { /* EOF - request is complete */ conn->state = completedstate; } else { conn->buflen += n; conn->bufp += n; *conn->bufp = '\0'; } return 0; } static int do_write(int sockfd, struct in_addr *addr, conn_t *conn, enum phase_t completedstate) { int n; n = write(sockfd, conn->bufp, conn->buflen); if (n == -1) { /* Error - abort */ errprintf("WRITE error to %s: %s\n", inet_ntoa(*addr), strerror(errno)); msgs_timeout_from[conn->state]++; conn->state = P_CLEANUP; return -1; } else if (n >= 0) { conn->buflen -= n; conn->bufp += n; if (conn->buflen == 0) { conn->state = completedstate; } } return 0; } void do_log(conn_t *conn) { char *rq, *eol, *delim; char savechar; rq = conn->buf+6; if (strncmp(rq, "combo\n", 6) == 0) rq += 6; eol = strchr(rq, '\n'); if (eol) *eol = '\0'; for (delim = rq; (*delim && isalpha((unsigned char) *delim)); delim++); for (; (*delim && isspace((unsigned char) *delim)); delim++); for (; (*delim && !isspace((unsigned char) *delim)); delim++); savechar = *delim; *delim = '\0'; errprintf("%s : %s\n", inet_ntoa(*conn->clientip), rq); *delim = savechar; if (eol) *eol = '\n'; } int main(int argc, char *argv[]) { int daemonize = 1; int timeout = 10; int listenq = 512; char *pidfile = "/var/run/xymonproxy.pid"; char *proxyname = NULL; char *proxynamesvc = "xymonproxy"; int sockcount = 0; int lsocket; struct sockaddr_in laddr; struct sockaddr_in xymonserveraddr[MAX_SERVERS]; int xymonservercount = 0; int opt; conn_t *chead = NULL; struct sigaction sa; int selectfailures = 0; /* Statistics info */ time_t startuptime = gettimer(); unsigned long msgs_total = 0; unsigned long msgs_total_last = 0; unsigned long msgs_combined = 0; unsigned long msgs_merged = 0; unsigned long msgs_delivered = 0; unsigned long msgs_status = 0; unsigned long msgs_combo = 0; unsigned long msgs_other = 0; unsigned long msgs_recovered = 0; struct timespec timeinqueue = { 0, 0 }; /* Don'T save the output from errprintf() */ save_errbuf = 0; memset(&laddr, 0, sizeof(laddr)); inet_aton("0.0.0.0", (struct in_addr *) &laddr.sin_addr.s_addr); laddr.sin_port = htons(1984); laddr.sin_family = AF_INET; for (opt=1; (opt < argc); opt++) { if (argnmatch(argv[opt], "--listen=")) { char *locaddr, *p; int locport; locaddr = strchr(argv[opt], '=')+1; p = strchr(locaddr, ':'); if (p) { locport = atoi(p+1); *p = '\0'; } else locport = 1984; memset(&laddr, 0, sizeof(laddr)); laddr.sin_port = htons(locport); laddr.sin_family = AF_INET; if (inet_aton(locaddr, (struct in_addr *) &laddr.sin_addr.s_addr) == 0) { errprintf("Invalid listen address %s\n", locaddr); return 1; } if (p) *p = ':'; } else if (argnmatch(argv[opt], "--server=") || argnmatch(argv[opt], "--bbdisplay=")) { char *ips, *ip1; int port1; ips = strdup(strchr(argv[opt], '=')+1); ip1 = strtok(ips, ","); while (ip1) { char *p; p = strchr(ip1, ':'); if (p) { port1 = atoi(p+1); *p = '\0'; } else port1 = 1984; memset(&xymonserveraddr[xymonservercount], 0, sizeof(xymonserveraddr[xymonservercount])); xymonserveraddr[xymonservercount].sin_port = htons(port1); xymonserveraddr[xymonservercount].sin_family = AF_INET; if (inet_aton(ip1, (struct in_addr *) &xymonserveraddr[xymonservercount].sin_addr.s_addr) == 0) { errprintf("Invalid remote address %s\n", ip1); } else { xymonservercount++; } if (p) *p = ':'; ip1 = strtok(NULL, ","); } xfree(ips); } else if (argnmatch(argv[opt], "--timeout=")) { char *p = strchr(argv[opt], '='); timeout = atoi(p+1); } else if (argnmatch(argv[opt], "--lqueue=")) { char *p = strchr(argv[opt], '='); listenq = atoi(p+1); } else if (strcmp(argv[opt], "--daemon") == 0) { daemonize = 1; } else if (strcmp(argv[opt], "--no-daemon") == 0) { daemonize = 0; } else if (argnmatch(argv[opt], "--pidfile=")) { char *p = strchr(argv[opt], '='); pidfile = strdup(p+1); } else if (argnmatch(argv[opt], "--logfile=")) { char *p = strchr(argv[opt], '='); logfile = strdup(p+1); } else if (strcmp(argv[opt], "--log-details") == 0) { logdetails = 1; } else if (argnmatch(argv[opt], "--report=")) { char *p1 = strchr(argv[opt], '=')+1; if (strchr(p1, '.') == NULL) { if (xgetenv("MACHINE") == NULL) { errprintf("Environment variable MACHINE is undefined\n"); return 1; } proxyname = strdup(xgetenv("MACHINE")); proxyname = (char *)realloc(proxyname, strlen(proxyname) + strlen(p1) + 1); strcat(proxyname, "."); strcat(proxyname, p1); proxynamesvc = strdup(p1); } else { proxyname = strdup(p1); proxynamesvc = strchr(proxyname, '.')+1; } } else if (strcmp(argv[opt], "--debug") == 0) { debug = 1; } else if (strcmp(argv[opt], "--version") == 0) { printf("xymonproxy version %s\n", VERSION); return 0; } else if (strcmp(argv[opt], "--help") == 0) { printf("xymonproxy version %s\n", VERSION); printf("\nOptions:\n"); printf("\t--listen=IP[:port] : Listen address and portnumber\n"); printf("\t--server=IP[:port] : Xymon server address and portnumber\n"); printf("\t--report=[HOST.]SERVICE : Sends a status message about proxy activity\n"); printf("\t--timeout=N : Communications timeout (seconds)\n"); printf("\t--lqueue=N : Listen-queue size\n"); printf("\t--daemon : Run as a daemon\n"); printf("\t--no-daemon : Do not run as a daemon\n"); printf("\t--pidfile=FILENAME : Save process-ID of daemon to FILENAME\n"); printf("\t--logfile=FILENAME : Log to FILENAME instead of stderr\n"); printf("\t--debug : Enable debugging output\n"); printf("\n"); return 0; } } if (xymonservercount == 0) { errprintf("No Xymon server address given - aborting\n"); return 1; } /* Set up a socket to listen for new connections */ lsocket = socket(AF_INET, SOCK_STREAM, 0); if (lsocket == -1) { errprintf("Cannot create listen socket (%s)\n", strerror(errno)); return 1; } opt = 1; setsockopt(lsocket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); fcntl(lsocket, F_SETFL, O_NONBLOCK); if (bind(lsocket, (struct sockaddr *)&laddr, sizeof(laddr)) == -1) { errprintf("Cannot bind to listen socket (%s)\n", strerror(errno)); return 1; } if (listen(lsocket, listenq) == -1) { errprintf("Cannot listen (%s)\n", strerror(errno)); return 1; } /* Redirect logging to the logfile, if requested */ if (logfile) { reopen_file(logfile, "a", stdout); reopen_file(logfile, "a", stderr); } errprintf("xymonproxy version %s starting\n", VERSION); errprintf("Listening on %s:%d\n", inet_ntoa(laddr.sin_addr), ntohs(laddr.sin_port)); { int i; char *p; char srvrs[500]; for (i=0, srvrs[0] = '\0', p=srvrs; (i 0) { /* Parent - save PID and exit */ FILE *fd = fopen(pidfile, "w"); if (fd) { fprintf(fd, "%d\n", (int)childpid); fclose(fd); } exit(0); } /* Child (daemon) continues here */ setsid(); } setup_signalhandler(proxynamesvc); memset(&sa, 0, sizeof(sa)); sa.sa_handler = sigmisc_handler; sigaction(SIGHUP, &sa, NULL); sigaction(SIGTERM, &sa, NULL); sigaction(SIGUSR1, &sa, NULL); do { fd_set fdread, fdwrite; int maxfd; struct timespec tmo; struct timeval selecttmo; int n, idx; conn_t *cwalk, *ctmp; time_t ctime; time_t now; int combining = 0; /* See if it is time for a status report */ if (proxyname && ((now = gettimer()) >= (laststatus+300))) { conn_t *stentry; int ccount = 0; unsigned long bufspace = 0; unsigned long avgtime; /* In millisecs */ char runtime_s[30]; unsigned long runt = (unsigned long) (now-startuptime); char *p; unsigned long msgs_sent = msgs_total - msgs_total_last; /* Setup a conn_t struct for the status message */ stentry = (conn_t *)calloc(1, sizeof(conn_t)); stentry->state = P_REQ_READY; stentry->csocket = stentry->ssocket = -1; stentry->clientip = &stentry->caddr.sin_addr; getntimer(&stentry->arrival); stentry->timelimit.tv_sec = stentry->arrival.tv_sec + timeout; stentry->timelimit.tv_nsec = stentry->arrival.tv_nsec; stentry->bufsize = BUFSZ_INC; stentry->buf = (char *)malloc(stentry->bufsize); stentry->next = chead; chead = stentry; sprintf(runtime_s, "%lu days, %02lu:%02lu:%02lu", (runt/86400), ((runt % 86400) / 3600), ((runt % 3600) / 60), (runt % 60)); init_timestamp(); for (cwalk = chead; (cwalk); cwalk = cwalk->next) { ccount++; bufspace += cwalk->bufsize; } if (msgs_sent == 0) { avgtime = 0; } else { avgtime = (timeinqueue.tv_sec*1000 + timeinqueue.tv_nsec/1000) / msgs_sent; } p = stentry->buf; p += sprintf(p, "combo\nstatus+11 %s green %s - xymon proxy up: %s\n\nxymonproxy for Xymon version %s\n\nProxy statistics\n\nIncoming messages : %10lu (%lu msgs/second)\nOutbound messages : %10lu\n\nIncoming message distribution\n- Combo messages : %10lu\n- Status messages : %10lu\n Messages merged : %10lu\n Resulting combos : %10lu\n- Other messages : %10lu\n\nProxy resources\n- Connection table size : %10d\n- Buffer space : %10lu kByte\n", proxyname, timestamp, runtime_s, VERSION, msgs_total, (msgs_total - msgs_total_last) / (now - laststatus), msgs_delivered, msgs_combo, msgs_status, msgs_merged, msgs_combined, msgs_other, ccount, bufspace / 1024); p += sprintf(p, "\nTimeout/failure details\n"); p += sprintf(p, "- %-22s : %10lu\n", statename[P_REQ_READING], msgs_timeout_from[P_REQ_READING]); p += sprintf(p, "- %-22s : %10lu\n", statename[P_REQ_CONNECTING], msgs_timeout_from[P_REQ_CONNECTING]); p += sprintf(p, "- %-22s : %10lu\n", statename[P_REQ_SENDING], msgs_timeout_from[P_REQ_SENDING]); p += sprintf(p, "- %-22s : %10lu\n", "recovered", msgs_recovered); p += sprintf(p, "- %-22s : %10lu\n", statename[P_RESP_READING], msgs_timeout_from[P_RESP_READING]); p += sprintf(p, "- %-22s : %10lu\n", statename[P_RESP_SENDING], msgs_timeout_from[P_RESP_SENDING]); p += sprintf(p, "\n%-24s : %10lu.%03lu\n", "Average queue time", (avgtime / 1000), (avgtime % 1000)); /* Clear the summary collection totals */ laststatus = now; msgs_total_last = msgs_total; timeinqueue.tv_sec = timeinqueue.tv_nsec = 0; stentry->buflen = strlen(stentry->buf); stentry->bufp = stentry->buf + stentry->buflen; stentry->state = P_REQ_READY; } FD_ZERO(&fdread); FD_ZERO(&fdwrite); maxfd = -1; combining = 0; for (cwalk = chead, idx=0; (cwalk); cwalk = cwalk->next, idx++) { dbgprintf("state %d: %s\n", idx, statename[cwalk->state]); /* First, handle any state transitions and setup the FD sets for select() */ switch (cwalk->state) { case P_REQ_READING: FD_SET(cwalk->csocket, &fdread); if (cwalk->csocket > maxfd) maxfd = cwalk->csocket; break; case P_REQ_READY: if (cwalk->buflen <= 6) { /* Got an empty request - just drop it */ dbgprintf("Dropping empty request from %s\n", inet_ntoa(*cwalk->clientip)); cwalk->state = P_CLEANUP; break; } if (logdetails) do_log(cwalk); cwalk->conntries = CONNECT_TRIES; cwalk->sendtries = SEND_TRIES; cwalk->conntime = 0; /* * We now want to find out what kind of message we've got. * If it's NOT a "status" message, just pass it along. * For "status" messages, we want to try and merge many small * messages into a "combo" message - so send those off the the * P_REQ_COMBINING state for a while. * If we are not going to send back a response to the client, we * also close the client socket since it is no longer needed. * Note that since we started out as optimists and put a "combo\n" * at the front of the buffer, we need to skip that when looking at * what type of message it is. Hence the "cwalk->buf+6". */ if (strncmp(cwalk->buf+6, "client", 6) == 0) { /* * "client" messages go to all Xymon servers, but * we will only pass back the response from one of them * (the last one). */ shutdown(cwalk->csocket, SHUT_RD); msgs_other++; cwalk->snum = xymonservercount; if ((cwalk->buflen + 40 ) < cwalk->bufsize) { int n = sprintf(cwalk->bufp, "\n[proxy]\nClientIP:%s\n", inet_ntoa(*cwalk->clientip)); cwalk->bufp += n; cwalk->buflen += n; } } else if ((strncmp(cwalk->buf+6, "query", 5) == 0) || (strncmp(cwalk->buf+6, "config", 6) == 0) || (strncmp(cwalk->buf+6, "ping", 4) == 0) || (strncmp(cwalk->buf+6, "download", 8) == 0)) { /* * These requests get a response back, but send no data. * Send these to the last of the Xymon servers only. */ shutdown(cwalk->csocket, SHUT_RD); msgs_other++; cwalk->snum = 1; } else { /* It's a request that doesn't take a response. */ if (cwalk->csocket >= 0) { shutdown(cwalk->csocket, SHUT_RDWR); close(cwalk->csocket); sockcount--; cwalk->csocket = -1; } cwalk->snum = xymonservercount; if (strncmp(cwalk->buf+6, "status", 6) == 0) { msgs_status++; getntimer(&cwalk->timelimit); cwalk->timelimit.tv_nsec += COMBO_DELAY; if (cwalk->timelimit.tv_nsec >= 1000000000) { cwalk->timelimit.tv_sec++; cwalk->timelimit.tv_nsec -= 1000000000; } /* * Some clients (bbnt) send a trailing \0, so we cannot * rely on buflen being what we want it to be. */ cwalk->buflen = strlen(cwalk->buf); cwalk->bufp = cwalk->buf + cwalk->buflen; if ((cwalk->buflen + 50 ) < cwalk->bufsize) { int n = sprintf(cwalk->bufp, "\nStatus message received from %s\n", inet_ntoa(*cwalk->clientip)); cwalk->bufp += n; cwalk->buflen += n; } cwalk->state = P_REQ_COMBINING; break; } else if (strncmp(cwalk->buf+6, "combo\n", 6) == 0) { char *currmsg, *nextmsg; msgs_combo++; /* * Some clients (bbnt) send a trailing \0, so we cannot * rely on buflen being what we want it to be. */ cwalk->buflen = strlen(cwalk->buf); cwalk->bufp = cwalk->buf + cwalk->buflen; getntimer(&cwalk->timelimit); cwalk->timelimit.tv_nsec += COMBO_DELAY; if (cwalk->timelimit.tv_nsec >= 1000000000) { cwalk->timelimit.tv_sec++; cwalk->timelimit.tv_nsec -= 1000000000; } currmsg = cwalk->buf+12; /* Skip pre-def. "combo\n" and message "combo\n" */ do { nextmsg = strstr(currmsg, "\n\nstatus"); if (nextmsg) { *(nextmsg+1) = '\0'; nextmsg += 2; } /* Create a duplicate conn_t record for all embedded messages */ ctmp = (conn_t *)malloc(sizeof(conn_t)); memcpy(ctmp, cwalk, sizeof(conn_t)); ctmp->bufsize = BUFSZ_INC*(((6 + strlen(currmsg) + 50) / BUFSZ_INC) + 1); ctmp->buf = (char *)malloc(ctmp->bufsize); ctmp->buflen = sprintf(ctmp->buf, "combo\n%s\nStatus message received from %s\n", currmsg, inet_ntoa(*cwalk->clientip)); ctmp->bufp = ctmp->buf + ctmp->buflen; ctmp->state = P_REQ_COMBINING; ctmp->next = chead; chead = ctmp; currmsg = nextmsg; } while (currmsg); /* We don't do anymore with this conn_t */ cwalk->state = P_CLEANUP; break; } else if (strncmp(cwalk->buf+6, "page", 4) == 0) { /* xymond has no use for page requests */ cwalk->state = P_CLEANUP; break; } else { msgs_other++; } } /* * This wont be made into a combo message, so skip the "combo\n" * and go off to send the message to the server. */ cwalk->bufp = cwalk->buf+6; cwalk->buflen -= 6; cwalk->bufpsave = cwalk->bufp; cwalk->buflensave = cwalk->buflen; cwalk->state = P_REQ_CONNECTING; /* Fall through for non-status messages */ case P_REQ_CONNECTING: /* Need to restore the bufp and buflen, as we may get here many times for one message */ cwalk->bufp = cwalk->bufpsave; cwalk->buflen = cwalk->buflensave; ctime = gettimer(); if (ctime < (cwalk->conntime + CONNECT_INTERVAL)) { dbgprintf("Delaying retry of connection\n"); break; } cwalk->conntries--; cwalk->conntime = ctime; if (cwalk->conntries < 0) { errprintf("Server not responding, message lost\n"); cwalk->state = P_REQ_DONE; /* Not CLENAUP - might be more servers */ msgs_timeout_from[P_REQ_CONNECTING]++; break; } cwalk->ssocket = socket(AF_INET, SOCK_STREAM, 0); if (cwalk->ssocket == -1) { dbgprintf("Could not get a socket - will try again\n"); break; /* Retry the next time around */ } sockcount++; fcntl(cwalk->ssocket, F_SETFL, O_NONBLOCK); { int idx = (xymonservercount - cwalk->snum); n = connect(cwalk->ssocket, (struct sockaddr *)&xymonserveraddr[idx], sizeof(xymonserveraddr[idx])); cwalk->serverip = &xymonserveraddr[idx].sin_addr; dbgprintf("Connecting to Xymon server at %s\n", inet_ntoa(*cwalk->serverip)); } if ((n == 0) || ((n == -1) && (errno == EINPROGRESS))) { cwalk->state = P_REQ_SENDING; cwalk->connectpending = 1; getntimer(&cwalk->timelimit); cwalk->timelimit.tv_sec += timeout; /* Fallthrough */ } else { /* Could not connect! Invoke retries */ dbgprintf("Connect to server failed: %s\n", strerror(errno)); close(cwalk->ssocket); sockcount--; cwalk->ssocket = -1; break; } /* No "break" here! */ case P_REQ_SENDING: FD_SET(cwalk->ssocket, &fdwrite); if (cwalk->ssocket > maxfd) maxfd = cwalk->ssocket; break; case P_REQ_DONE: /* Request has been sent to the server - we're done writing data */ shutdown(cwalk->ssocket, SHUT_WR); cwalk->snum--; if (cwalk->snum) { /* More servers to do */ close(cwalk->ssocket); cwalk->ssocket = -1; sockcount--; cwalk->conntries = CONNECT_TRIES; cwalk->sendtries = SEND_TRIES; cwalk->conntime = 0; cwalk->state = P_REQ_CONNECTING; break; } else { /* Have sent to all servers, grab the response from the last one. */ cwalk->bufp = cwalk->buf; cwalk->buflen = 0; memset(cwalk->buf, 0, cwalk->bufsize); } msgs_delivered++; if (cwalk->sendtries < SEND_TRIES) { errprintf("Recovered from write error after %d retries\n", (SEND_TRIES - cwalk->sendtries)); msgs_recovered++; } if (cwalk->arrival.tv_sec > 0) { struct timespec departure; getntimer(&departure); timeinqueue.tv_sec += (departure.tv_sec - cwalk->arrival.tv_sec); if (departure.tv_nsec >= cwalk->arrival.tv_nsec) { timeinqueue.tv_nsec += (departure.tv_nsec - cwalk->arrival.tv_nsec); } else { timeinqueue.tv_sec--; timeinqueue.tv_nsec += (1000000000 + departure.tv_nsec - cwalk->arrival.tv_nsec); } if (timeinqueue.tv_nsec > 1000000000) { timeinqueue.tv_sec++; timeinqueue.tv_nsec -= 1000000000; } } else { errprintf("Odd ... this message was not timestamped\n"); } if (cwalk->csocket < 0) { cwalk->state = P_CLEANUP; break; } else { cwalk->state = P_RESP_READING; getntimer(&cwalk->timelimit); cwalk->timelimit.tv_sec += timeout; } /* Fallthrough */ case P_RESP_READING: FD_SET(cwalk->ssocket, &fdread); if (cwalk->ssocket > maxfd) maxfd = cwalk->ssocket; break; case P_RESP_READY: shutdown(cwalk->ssocket, SHUT_RD); close(cwalk->ssocket); sockcount--; cwalk->ssocket = -1; cwalk->bufp = cwalk->buf; cwalk->state = P_RESP_SENDING; getntimer(&cwalk->timelimit); cwalk->timelimit.tv_sec += timeout; /* Fall through */ case P_RESP_SENDING: if (cwalk->buflen && (cwalk->csocket >= 0)) { FD_SET(cwalk->csocket, &fdwrite); if (cwalk->csocket > maxfd) maxfd = cwalk->csocket; break; } else { cwalk->state = P_RESP_DONE; } /* Fall through */ case P_RESP_DONE: if (cwalk->csocket >= 0) { shutdown(cwalk->csocket, SHUT_WR); close(cwalk->csocket); sockcount--; } cwalk->csocket = -1; cwalk->state = P_CLEANUP; /* Fall through */ case P_CLEANUP: if (cwalk->csocket >= 0) { close(cwalk->csocket); sockcount--; cwalk->csocket = -1; } if (cwalk->ssocket >= 0) { close(cwalk->ssocket); sockcount--; cwalk->ssocket = -1; } cwalk->arrival.tv_sec = cwalk->arrival.tv_nsec = 0; cwalk->bufp = cwalk->buf; cwalk->buflen = 0; memset(cwalk->buf, 0, cwalk->bufsize); memset(&cwalk->caddr, 0, sizeof(cwalk->caddr)); cwalk->madetocombo = 0; cwalk->state = P_IDLE; break; case P_IDLE: break; case P_REQ_COMBINING: /* See if we can combine some "status" messages into a "combo" */ combining++; getntimer(&tmo); if ((cwalk->buflen < MINIMUM_FOR_COMBO) && !overdue(&tmo, &cwalk->timelimit)) { conn_t *cextra; /* Are there any other messages in P_COMBINING state ? */ cextra = cwalk->next; while (cextra && (cextra->state != P_REQ_COMBINING)) cextra = cextra->next; if (cextra) { /* * Yep. It might be worthwhile to go for a combo. */ while (cextra && (cwalk->buflen < (MAXIMUM_FOR_COMBO-20))) { if (strncmp(cextra->buf+6, "status", 6) == 0) { int newsize; /* * Size of the new message - if the cextra one * is merged - is the cwalk buffer, plus the * two newlines separating messages in combo's, * plus the cextra buffer except the leading * "combo\n" of 6 bytes. */ newsize = cwalk->buflen + 2 + (cextra->buflen - 6); if ((newsize < cwalk->bufsize) && (newsize < MAXIMUM_FOR_COMBO)) { /* * There's room for it. Add it to the * cwalk buffer, but without the leading * "combo\n" (we already have one of those). */ cwalk->madetocombo++; strcat(cwalk->buf, "\n\n"); strcat(cwalk->buf, cextra->buf+6); cwalk->buflen = newsize; cextra->state = P_CLEANUP; dbgprintf("Merged combo\n"); msgs_merged++; } } /* Go to the next connection in the right state */ do { cextra = cextra->next; } while (cextra && (cextra->state != P_REQ_COMBINING)); } } } else { combining--; cwalk->state = P_REQ_CONNECTING; if (cwalk->madetocombo) { /* * Point the outgoing buffer pointer to the full * message, including the "combo\n" */ cwalk->bufp = cwalk->buf; cwalk->madetocombo++; msgs_merged++; /* Count the proginal message also */ msgs_combined++; dbgprintf("Now going to send combo from %d messages\n%s\n", cwalk->madetocombo, cwalk->buf); } else { /* * Skip sending the "combo\n" at start of buffer. */ cwalk->bufp = cwalk->buf+6; cwalk->buflen -= 6; dbgprintf("No messages to combine - sending unchanged\n"); } } cwalk->bufpsave = cwalk->bufp; cwalk->buflensave = cwalk->buflen; break; default: break; } } /* Add the listen-socket to the select() list, but only if we have room */ if (sockcount < MAX_OPEN_SOCKS) { FD_SET(lsocket, &fdread); if (lsocket > maxfd) maxfd = lsocket; } else { static time_t lastlog = 0; if ((now = gettimer()) < (lastlog+30)) { lastlog = now; errprintf("Squelching incoming connections, sockcount=%d\n", sockcount); } } if (combining) { selecttmo.tv_sec = 0; selecttmo.tv_usec = COMBO_DELAY / 1000; } else { selecttmo.tv_sec = 1; selecttmo.tv_usec = 0; } n = select(maxfd+1, &fdread, &fdwrite, NULL, &selecttmo); if (n < 0) { errprintf("select() failed: %s\n", strerror(errno)); if (++selectfailures > 5) { errprintf("Too many select failures, aborting\n"); exit(1); } } else if (n == 0) { /* Timeout */ if (selectfailures > 0) selectfailures--; getntimer(&tmo); for (cwalk = chead; (cwalk); cwalk = cwalk->next) { switch (cwalk->state) { case P_REQ_READING: case P_REQ_SENDING: case P_RESP_READING: case P_RESP_SENDING: if (overdue(&tmo, &cwalk->timelimit)) { cwalk->state = P_CLEANUP; msgs_timeout_from[cwalk->state]++; } break; default: break; } } } else { if (selectfailures > 0) selectfailures--; for (cwalk = chead; (cwalk); cwalk = cwalk->next) { switch (cwalk->state) { case P_REQ_READING: if (FD_ISSET(cwalk->csocket, &fdread)) { do_read(cwalk->csocket, cwalk->clientip, cwalk, P_REQ_READY); } break; case P_REQ_SENDING: if (FD_ISSET(cwalk->ssocket, &fdwrite)) { if (cwalk->connectpending) { int connres, connressize; /* First time ready for write - check connect status */ cwalk->connectpending = 0; connressize = sizeof(connres); n = getsockopt(cwalk->ssocket, SOL_SOCKET, SO_ERROR, &connres, &connressize); if (connres != 0) { /* Connect failed! Invoke retries. */ dbgprintf("Connect to server failed: %s - retrying\n", strerror(errno)); close(cwalk->ssocket); sockcount--; cwalk->ssocket = -1; cwalk->state = P_REQ_CONNECTING; break; } } if ( (do_write(cwalk->ssocket, cwalk->serverip, cwalk, P_REQ_DONE) == -1) && (cwalk->sendtries > 0) ) { /* * Got a "write" error after connecting. * Try saving the situation by retrying the send later. */ dbgprintf("Attempting recovery from write error\n"); close(cwalk->ssocket); sockcount--; cwalk->ssocket = -1; cwalk->sendtries--; cwalk->state = P_REQ_CONNECTING; cwalk->conntries = CONNECT_TRIES; cwalk->conntime = gettimer(); } } break; case P_RESP_READING: if (FD_ISSET(cwalk->ssocket, &fdread)) { do_read(cwalk->ssocket, cwalk->serverip, cwalk, P_RESP_READY); } break; case P_RESP_SENDING: if (FD_ISSET(cwalk->csocket, &fdwrite)) { do_write(cwalk->csocket, cwalk->clientip, cwalk, P_RESP_DONE); } break; default: break; } } if (FD_ISSET(lsocket, &fdread)) { /* New incoming connection */ conn_t *newconn; int caddrsize; dbgprintf("New connection\n"); for (cwalk = chead; (cwalk && (cwalk->state != P_IDLE)); cwalk = cwalk->next); if (cwalk) { newconn = cwalk; } else { newconn = malloc(sizeof(conn_t)); newconn->next = chead; chead = newconn; newconn->bufsize = BUFSZ_INC; newconn->buf = newconn->bufp = malloc(newconn->bufsize); } newconn->connectpending = 0; newconn->madetocombo = 0; newconn->snum = 0; newconn->ssocket = -1; newconn->serverip = NULL; newconn->conntries = 0; newconn->sendtries = 0; newconn->timelimit.tv_sec = newconn->timelimit.tv_nsec = 0; /* * Why this ? Because we like to merge small status messages * into larger combo messages. So put a "combo\n" at the start * of the buffer, and then don't send it if we decide it won't * be a combo-message after all. */ strcpy(newconn->buf, "combo\n"); newconn->buflen = 6; newconn->bufp = newconn->buf+6; caddrsize = sizeof(newconn->caddr); newconn->csocket = accept(lsocket, (struct sockaddr *)&newconn->caddr, &caddrsize); if (newconn->csocket == -1) { /* accept() failure. Yes, it does happen! */ dbgprintf("accept failure, ignoring connection (%s), sockcount=%d\n", strerror(errno), sockcount); newconn->state = P_IDLE; } else { msgs_total++; newconn->clientip = &newconn->caddr.sin_addr; sockcount++; fcntl(newconn->csocket, F_SETFL, O_NONBLOCK); newconn->state = P_REQ_READING; getntimer(&newconn->arrival); newconn->timelimit.tv_sec = newconn->arrival.tv_sec + timeout; newconn->timelimit.tv_nsec = newconn->arrival.tv_nsec; } } } /* Clean up unused conn_t's */ { conn_t *tmp, *khead; khead = NULL; cwalk = chead; while (cwalk) { if ((cwalk == chead) && (cwalk->state == P_IDLE)) { /* head of chain is dead */ tmp = chead; chead = chead->next; tmp->next = khead; khead = tmp; cwalk = chead; } else if (cwalk->next && (cwalk->next->state == P_IDLE)) { tmp = cwalk->next; cwalk->next = tmp->next; tmp->next = khead; khead = tmp; /* cwalk is unchanged */ } else { cwalk = cwalk->next; } } /* khead now holds a list of P_IDLE conn_t structs */ while (khead) { tmp = khead; khead = khead->next; if (tmp->buf) xfree(tmp->buf); xfree(tmp); } } } while (keeprunning); if (pidfile) unlink(pidfile); return 0; } xymon-4.3.28/xymonproxy/Makefile0000664000076400007640000000255512050700262017127 0ustar rpmbuildrpmbuild# xymonproxy Makefile XYMONLIB = ../lib/libxymon.a XYMONLIBS = $(XYMONLIB) XYMONCOMMLIB = ../lib/libxymoncomm.a XYMONCOMMLIBS = $(XYMONCOMMLIB) $(ZLIBLIBS) $(SSLLIBS) $(NETLIBS) $(LIBRTDEF) XYMONTIMELIB = ../lib/libxymontime.a XYMONTIMELIBS = $(XYMONTIMELIB) $(LIBRTDEF) PROGRAMS = xymonproxy xymoncgimsg.cgi PROXYOBJS = xymonproxy.o MSGCGIOBJS = xymoncgimsg.o all: $(PROGRAMS) xymonproxy: $(PROXYOBJS) $(XYMONCOMMLIB) $(XYMONTIMELIB) $(XYMONLIB) $(CC) $(CFLAGS) -o $@ $(PROXYOBJS) $(XYMONCOMMLIBS) $(XYMONTIMELIBS) $(XYMONLIBS) xymoncgimsg.cgi: $(MSGCGIOBJS) $(XYMONCOMMLIB) $(XYMONLIB) $(CC) $(CFLAGS) -o $@ $(MSGCGIOBJS) $(XYMONCOMMLIBS) $(XYMONLIBS) ################################################ # Default compilation rules ################################################ %.o: %.c $(CC) $(CFLAGS) -c -o $@ $< clean: rm -f *.o *.a *~ $(PROGRAMS) install: install-bin install-man install-bin: ifndef PKGBUILD chown $(XYMONUSER) $(PROGRAMS) chgrp `$(IDTOOL) -g $(XYMONUSER)` $(PROGRAMS) chmod 755 $(PROGRAMS) endif cp -fp $(PROGRAMS) $(INSTALLROOT)$(INSTALLBINDIR)/ install-man: mkdir -p $(INSTALLROOT)$(MANROOT)/man8 ifndef PKGBUILD chown $(XYMONUSER) $(INSTALLROOT)$(MANROOT)/man8 *.8 chgrp `$(IDTOOL) -g $(XYMONUSER)` $(INSTALLROOT)$(MANROOT)/man8 *.8 chmod 755 $(INSTALLROOT)$(MANROOT)/man8 chmod 644 *.8 endif cp -fp *.8 $(INSTALLROOT)$(MANROOT)/man8/ xymon-4.3.28/xymonproxy/xymoncgimsg.cgi.80000664000076400007640000000305513037531444020673 0ustar rpmbuildrpmbuild.TH XYMONCGIMSG.CGI 8 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME xymoncgimsg.cgi \- CGI utility used for proxying Xymon data over HTTP .SH SYNOPSIS .B "xymoncgimsg.cgi" .SH DESCRIPTION .I xymoncgimsg.cgi(8) is the server-side utility receiving Xymon messages sent by the .I xymon(1) utility over an HTTP transport. The \fBxymon\fR utility normally sends data over a dedicated TCP protocol, but it may use HTTP to go through proxies or through restrictive firewalls. In that case, the webserver must have this CGI utility installed, which takes care of receiving the message via HTTP, and forwards it to a local Xymon server through the normal Xymon transport. The CGI expects to be invoked from an HTTP "POST" request, with the POST-data being the status-message. \fBxymoncgimsg.cgi\fR simply collects all of the POST data, and send it off as a message to the Xymon daemon running on IP 127.0.0.1. This destination IP currently cannot be changed. The CGI will return any output provided by the Xymon daemon back to the requestor as the response to the HTTP POST, so this allows for all normal Xymon commands to work. .SH SECURITY \fBxymoncgimsg.cgi\fR will only send data to a Xymon server through the loopback interface, i.e. IP-address 127.0.0.1. Access to the CGI should be restricted through webserver access controls, since the CGI provides no authentication at all to validate incoming messages. If possible, consider using the .I xymonproxy(8) utility instead for native proxying of Xymon data between networks. .SH "SEE ALSO" xymon(1), xymonproxy(8), xymon(7) xymon-4.3.28/RELEASENOTES0000664000076400007640000005142613037531072015037 0ustar rpmbuildrpmbuild <<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>> * * * Release notes for Xymon 4.3.28 * * * <<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>> This documents the important changes between Xymon releases, i.e. changes you should be aware of when upgrading. For a full list of changes and enhancements, please see the Changes file. Changes for 4.3.28 ================== OpenSSL 1.1.0 is now supported. Specific TLS variants (1.0, 1.1, and 1.2) can be selected for an HTTP test using new protocol tags (see hosts.cfg(5)) OpenSSL 1.0.1+ is required. The bundled version of c-ares (for hosts without a system lib) has been updated to 1.12.0 Xymond_alert should now provide more stable behavior when hosts are dropped or alerts go stale between launches. Summary messages are properly working again. SCRIPT message sizes are now limited only by environment memory and can be increased by adding a MAXMSG_ALERTSCRIPT variable to your xymonserver.cfg file A number of typos have been corrected. The RRD definition for the netstat graph has been tweaked to give a more readable layout. Changes for 4.3.27 ================== Fixes for CGI acknowledgements and NK/criticalview web redirects. Xymon should now properly check for lack of SSLv3 (or v2) support at compile- time and exclude the openssl options as needed. Completely empty directories (on Windows) are no longer considered errors. Changes for 4.3.26 ================== This is mostly a bug fix release for javascript issues on the info and trends pages, along with the enable / disable CGI. Several browsers had difficulty with the new CSP rules introduced in 4.3.25. XYMWEBREFRESH is now used as the default refresh interval for dynamic status pages and various other xymongen destinations. Non-svcstatus pages can be overridden by altering the appropriate *_header template files, but svcstatus refresh interval uses this value. (default: 60s) Set in xymonserver.cfg(5). Incoming test names are now restricted to alphanumeric characters, colons dashes, underscores, and slashes. Slashes and colons may be restricted in a future release. Unconfigured (ghost) host names are now restricted to alphanumerics, colons, commas, periods, dashes, and underscores. It is strongly recommended to use only valid hostnames and DNS components in servers names. Files matched multiple times by logfetch in the client config retrieved from config-local.cfg (such as a file matching multiple globs) will now only be scanned once and only use the ignore/trigger rules from its first entry. (Note: A future version of Xymon may combine all matching rules for a file together.) CLASS groupings in analysis.cfg and alerts.cfg will now reliably work for hosts with a CLASS override in hosts.cfg. Previous, this class was not used in favor of the class type sent in on any specific client message. Changes for 4.3.25 ================== Several security issues have been resolved relating to "config" messages and Cross-Site-Scripting vulnerabilities in the web interface. We would like to thank Markus Krell for reporting the following security issues and for his assistance in working with us to resolve them. (CVE-2016-2054) - Buffer overflow when handling "config" file requests. (CVE-2016-2056) - Shell command injection vulnerability in useradm.sh and chpasswd.sh. (CVE-2016-2055) - Credential leakage with "config" file requests. The default suggested location for htpasswd files used in securing the CGI interface had been $XYMONHOME/etc/ and documentation did not mention that this file should ONLY be readable by the apache/webserver user. Administrators should verify this file is not readable by the xymon user and modify ownership and permissions as needed. Additionally, the following restrictions have been added to files requested via "config" messages sent to xymond: - They must be regular files as returned by stat (no symlinks) - They must end in ".cfg" The restriction on file names ending in ".cfg" can be overridden by setting ALLOWALLCONFIGFILES="TRUE" in xymonserver.cfg and restarting xymond. Note that config files are processed through normal xymon file reading, so features such as "include" and "directory" still work when retrieving files over the network. These included files are not subject to the same restrictions. (CVE-2016-2057) - The xymond feedback queue (or BFQ) had been being created using insecure permissions, allowing any local user to write messages into the queue. This has been resolved and the queue is now created 0620 to the xymon user. If present xymond will attempt to re-create it using the correct permissions, but this process may not succeed on all OS's. Administrators should verify queue permissions using ipcs and delete the key manually with ipcrm if needed. (CVE-2016-2058) - Dynamic and historical status pages generated by the CGI interface now include Content-Security-Policy headers to prevent javascript execution from the payload of status messages themselves. The built-in functionality can be overridden by setting XYMON_NOCSPHEADER in xymonserver.cfg, if you wish to override this via an apache configuration. Additional changes: A bug introduced in 4.3.22 that could cause xymond_alert to fail to alert after seeing an unknown (newly added) host alert for the first time has been fixed. Additionally, xymond_alert now regularly reloads the hosts.cfg file to pick up changes. The "Actual" memory value on Windows systems will be reported more accurately. (Thanks, John Rothlisberger) A trends_header and trends_footer have been added in the /web/ templates directory for use on trends display pages. The xymonclient.cfg file now has a section for passing options to xymond_client and logfetch without having to edit the script. The logfetch command now accepts --noexec as an option to inhibit running commands from the client config used to list files to scan for messages. The logfetch command can use a file glob(7) in client-local.cfg (or localclient.cfg) indicated by angle brackets. This is more efficient and more secure than executing an `ls` command when matching known file or log patterns. The xymon.sh script now better matches LSB exit code expectations. The --processor argument to xymond_rrd, allowing RRD data (ie, metrics) to be easily sent to an external system such as OpenTSDB has been properly documented. All users of previous versions are strongly urged to upgrade. Changes for 4.3.24 ================== Fixes a bug introduced in 4.3.22 where the non-excepted HTTP status codes were always seen as Critical instead of OK/Warning as intended. All users are urged to upgrade. Changes for 4.3.23 ================== Fixes a bug in 4.3.22 where RRD tracking of number of matching processes or ports open on a client was not being performed. Changes for 4.3.22 ================== The default rules for HTTP response codes have been simplified and made more generic: 1xx = Warning (when the final code received) 2xx = OK 3xx = Warning (except 302/303/307 = OK) 4xx = Critical 5xx = Critical The specific changes from previous versions are: - 401 and 403 response codes are now considered Critical (were OK) - 301 Permanent Redirect response code is now considered a Warning (was OK) - "Extended" or new HTTP status codes in the 4xx and 5xx range are now considered Critical (unknown codes were previously a Warning) In the case of 301, 401, and 403 HTTP codes, if you're expecting to receive this HTTP status from a URL query, you should add the code explicitly to the check by using the "httpstatus" syntax (see hosts.cfg(5)). Basic HTTP Authentication is supported for testing logins to a site. *** Special note: Many vendor-supplied default "Welcome" pages on unconfigured apache servers are actually generated by a 403 error handler. Generically testing for these pages will now show a red status instead of a green one. To fix, simply place an index.html page at the root of the site so that 403's are not generated. The 'sslcert' test will now indicate the signature algorithm and cipher that was actually used in the connection, instead of a list of all ciphers. Use --showallciphers to restore the previous behavior. On new installs, the default apache configuration no longer requires a trailing slash when accessing the xymon pages. http://www.example.com/xymon will work. NTPDATEOPTS, FPINGOPTS, and TRACEROUTEOPTS variables are now present in xymonserver.cfg and will override the default options for the associated xymonnet calls. Note: The suggested options to 'traceroute' were never actually used as the default on a standard installation. In a future release, '-n -q 2 -w 2 -m 15' may be used unless overridden or otherwise specified. Darwin clients (Mac OS X) now exclude AFS and read-only volumes (which are usually just mounted disk images) from processing, properly handle volumes with spaces in their names, and correctly process inode details. A chpasswd.sh file is now provided which allows a logged-in user to change their own .htpasswd password (after verification). Because it verifies their existing password first, it requires the '-v' option to htpasswd, which is only available in Apache 2.4.5 or higher. By default, it is installed in the /xymon-seccgi/ directory, but can be moved to the /xymon-cgi/ directory to allow all users to change their password. Basic input validation is provided, but this CGI should be used with caution and only with relatively-trusted user bases. xymongen used to skip over host groups on pages when it calcuated that there were no test results to be displayed in that table. These groups are now displayed, but you can restore the previous behavior by passing it the --no-showemptygroups option. Changes for 4.3.21 ================== RSS feeds should now display the short description of the event again. Changes for 4.3.20 ================== Remote summaries display had been broken for a while but should now be working again. Summaries are now also displayed on the nongreen.html page The "Actual Used" memory figure on recent Linux kernels is now taken from the "Available" memory reported back from free (or /proc/meminfo), which should give a more accurate response. Physical Memory Used is still reported as the combination of Kernel Physical Use + buffers/cache, however this may change in a future release. Documentation for various directives in hosts.cfg(5) has been added pulldata=IP:PORT directives are honored, if the defaults for the host are incorrect cgiwrap is now installed via hardlinking (or as packaged); FollowSymLinks is no longer needed for the xymon cgi-bin directories and can be removed. Planned downtime settings are now applied to 'purple' statuses as well http checks can now be performed using a HEAD request if desired. Which RRD graphs are displayed on a status page can now be customized on a per-test basis through the use of environment variables. For example, GRAPHS_cpu="la,vmstat1" will cause an additional graph to be shown on cpu tests. (Submitted by Werner Maier) A new column will be displayed on all xymon pages allowing direct access to a server's raw clientlog (similar to the special info and trends columns). This can be disabled with a "noclient" tag in hosts.cfg Additional sample protocols.cfg services are present, for svn, amqp(s) and ircd. (Note that different ircd servers respond differently and the included protocol conversation may require modification to work on your server.) Changes for 4.3.19 ================== This is mostly a bugfix release (see the Changes file for a full list), but there are some enhancements: Apache 2.4 syntax is now supported by the sample xymon.conf file. EXTIME= syntax in analysis.cfg and alerts.cfg files is now supported. Note that this exclusion is applied *after* any normal TIME= specifiers. (If a TIME= modifier is present, then times outside of that range are already excluded.) An Acknowledgements report CGI is now available, similar to the Notifications report. (Thanks, Andy Smith) Client logs with multiple trigger lines found are guaranteed to have all the sections returned, even if this exceeds the "maxbytes" specified (up to the compiled-in limit). Additionally, the "current" location of new log data written since the last time xymonclient was run is now marked for reference. (Thanks, Franco Gasperino) A new "deltacount" option is available in client-local.cfg. It functions similarly to "linecount" for a given log: entry, but only counts matching lines written in the log file since the last run. Additional filtration options are available for the xymondboard command, including the full body of the message, and acknoweldgement and disable comments. Also, inequalities can be used to filter an epoch timestamp against any of: lastchange, logtime, validtime, acktime, or disabletime. See the xymon(1) man page for details. The process list visible in the 'procs' test of Linux and FreeBSD clients is now generated in ASCII "forest" mode for increased legibility. Changes for 4.3.18 ================== 4.3.18 fixes a buffer overflow vulnerability in the acknowledge.cgi script (CVE-2015-1430). All users are encouraged to upgrade. Thank you to Mark Felder for noting the impact and Martin Lenko for the original patch. In previous versions, the Xymon web CGI programs were run through a shell-script wrapper, which took care of setting up the environment for the Xymon programs. In light of the bash 'Shell shock' bug, this is no longer the case. Instead, a binary 'cgiwrap' utility is used to load the xymonserver.cfg and cgioptions.cfg files before invoking the CGI programs. This means that the cgioptions.cfg file is no longer parsed as a shell script, so if you rely on this then it will no longer work. In that case you must replace the symlink(s) in xymon/cgi-bin/ with shell script wrappers which source the cgioptions.cfg file. Changes for 4.3.15 - 4.3.17 =========================== No significant changes. Changes for 4.3.14 ================== In previous Xymon versions, a client-only configuration (i.e. one configured with "./configure --client") would place the client files in a "client" subdirectory below the directory specified during configuration. This is the same directory layout as a server installation, where the server and client parts of Xymon are in separate subdirectories. In 4.3.14, the default has changed so a client-only installation now installs in the directory given during the configure-step. The "/client" has been eliminated, so if you are upgrading an existing client you must either move the old client installation one level up from the "client/" directory, or change the Makefile generated by "configure --client" and add "/client" to the XYMONTOPDIR setting. The SNI support added in 4.3.13 causes problems with some older webservers, whose SSL implementation cannot handshake correctly when SNI is used. The failed handshake causes Xymon to report the site as down. In 4.3.14, the default is changed so SNI is disabled. A new "--sni" option was added to xymonnet to control the default setting, and two new tags "sni" and "nosni" can be used in hosts.cfg to control SNI for each host that is tested. Changes for 4.3.13 ================== This is mostly a bugfix release. Apart from simple bugs (see the Changes file), there are some enhancements: Alerts sent via e-mail have line-endings converted to plain , since the carriage-return characters would cause some mailers to send alerts as a (binary) attachment to an empty mail message. https-URL's can be forced to use TLS only, by using "httpst://..." similar to how SSLv2 and SSLv3 can be chosen. SSL connections (e.g. for https URL's) now use the TLS "Server Name Indication" (SNI) if your OpenSSL library supports it. This allows testing of systems that have multiple SSL websites located on the same physical IP+port (i.e. virtual name-based hosts). Changes for 4.3.12 ================== NOTE: This release includes a bugfix for a security issue in the xymond_history and xymond_rrd modules. A "drophost" command sent to the xymond port (default: 1984) from an IP listed in the --admin-senders access control list can be used to delete files owned by the user running the xymond daemon. This is allowed by default, so it is highly recommended to install this update. Changes for 4.3.2 - 4.3.11 ========================== See the Changes file for a list of significant changes. These releases are mostly to fix bugs. NOTE: Some configuration parameters have changed, so you must regenerate the top-level Makefile by running the "configure" script before compiling the new version. The inode-check introduced in 4.3.8 and 4.3.10 requires that you update both the Xymon server installation and the Xymon client on the systems where you want to monitor how many inodes are being used. Changes for 4.3.1 ================== This is a SECURITY BUG FIX release, resolving a number of potential cross-site scripting vulnerabilities in the Xymon web interface. Thanks to David Ferrest who reported these to me. Changes for 4.3.0 ================== IMPORTANT: Most files and internals in Xymon have been renamed with the 4.3.0-beta3 release. If you are upgrading from a version prior to 4.3.0-beta3, you MUST read the file docs/upgrade-to-430.txt and make sure you follow the steps outlined here. That also applies if you are upgrading from 4.3.0-beta2. Xymon 4.3.0 is the first release with new features after the 4.2.0 release. Several large changes have been made throughout the entire codebase. Some highlights (see the Changes file for a longer list): * Data going into graphs can now be used to alter a status, e.g. to trigger an alert from the response time of a network service. * Tasks in xymonlaunch can be be configured to run at specific time of day using a cron-style syntax for when they must run. * Worker modules (RRD, client-data parsers etc) can operate on remote hosts from the xymond daemon, for load-sharing. * Support for defining holidays as non-working days in alerts and SLA calculations. * Hosts which appear on multiple pages in the web display can use any page they are on in the alerting rules and elsewhere. * Various new network tests: SOAP-over-HTTP, HTTP tests with session cookies, SSL minimum encryption strength test. * New "compact" status display can group multiple statuses into one on the webpage display. * Configurable periods for graphs on the trends page. * RRD files can be configured to maintain more data and/or different data (e.g. MAX/MIN values) * SLA calculations now include the number of outages in addition to the down-time. * Solaris client now uses "swap -l" to determine swap-space usage, which gives very different results from the previous "swap -s" data. So your Solaris hosts will appear to change swap-utilisation when the Xymon client is upgraded. TRACKMAX feature removed ------------------------ For users of the TRACKMAX feature present in 4.2.2 and later 4.2.x releases: This feature has been dropped. Instead, you should add a definition for the tests that you want to track max-values for to the rrddefinitions.cfg file. E.g. to track max-values for the "mytest" status column: [mytest] RRA:MAX:0.5:1:576 RRA:MAX:0.5:6:576 RRA:MAX:0.5:24:576 RRA:MAX:0.5:288:576 Changed behaviour of http testing via proxy ------------------------------------------- The Big Brother behaviour of allowing you to specify an http (web) proxy as part of the URL in a test has been disabled by default, since it interferes with URL's that contain another URL as part of the URL path. If you need the Big Brother behaviour, add "--bb-proxy-syntax" to your invocations of bbtest-net. BBGHOSTS setting removed ------------------------ Setting BBGHOSTS in the xymonserver.cfg file no longer has any effect. Instead, you must use the "--ghosts" option for hobbitd. The default ghost handling has also been changed from "ignore" to "log". xymonproxy: Alert support for Big Brother servers removed --------------------------------------------------------- The xymonproxy tool no longer supports forwarding "page" messages. This means that if you are forwarding messages from an old Big Brother client to a Big Brother server that is sending out alerts, then these alerts will be dropped. Status updates will be forwarded, only alerts triggered from the Big Brother server are affected. Webpage menu: New menu code --------------------------- The Javascript-based menu code ("Tigra") has been replaced with a menu based on CSS/HTML4. This means that any menu customization will have to be manually transferred to the new menu definition file, ~xymon/server/etc/xymonmenu.cfg. The new menu-system is known NOT to work with Internet Explorer 6 (IE 7 and newer are fine). If you must have a menu system that works with the ancient browsers, then the old Tigra menu can be downloaded from http://xymon.svn.sourceforge.net/viewvc/xymon/sandbox/tigramenu/?view=tar together with instructions for using it with Xymon 4.3.0. xymon-4.3.28/configure.client0000775000076400007640000001527512276356321016417 0ustar rpmbuildrpmbuild#!/bin/sh # Configure script for Xymon client # $Id: configure.client 7426 2014-02-11 08:18:25Z storner $ echo "" echo "Configuration script for Xymon client" echo "" while test "$1" != "" do OPT="$1"; shift case "$OPT" in "--help") cat <&1 | head -n 1 | awk '{print $1 " " $2}'` if test "$MAKEVER" != "GNU Make" then echo "GNU make is required to build Xymon." echo "If it is available as \"gmake\", run configure as: 'MAKE=gmake $0'" exit 1 fi echo "Xymon normally keeps all of the client configuration files" echo "on the Xymon server. If you prefer, it is possible to use" echo "a local client configuration file instead - if so, answer" echo "'client' to the next question." echo "NB: Local configuration requires the PCRE libs on each host." echo "" echo "Server side client configuration, or client side [server] ?" if test -z "$CONFTYPE" then read CONFTYPE fi if test -z "$CONFTYPE" then CONFTYPE="server" fi echo "" if test "$CONFTYPE" = "client" then echo "Checking for the PCRE libraries" . build/pcre.sh echo "" fi echo "" MAKE="$MAKE -s" ./build/lfs.sh if test $? -eq 0; then LFS="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" else LFS="" fi echo ""; echo "" MAKE="$MAKE -s" . ./build/clock-gettime-librt.sh echo ""; echo "" echo "What userid will be running Xymon [xymon] ?" if test -z "$XYMONUSER" then read XYMONUSER fi if test -z "$XYMONUSER" then XYMONUSER="xymon" fi if test -z "$XYMONTOPDIR" then if test "`uname -s`" = "Darwin" then # Use "dscl" for locating user information. From Isaac Vetter # http://www.xymon.com/archive/2008/02/msg00173.html USERDATA="`dscl . -list /Users | grep $XYMONUSER`" if test "$USERDATA" != "" then echo "Found Directory entry for user: $USERDATA" else echo "FAILURE: The user $XYMONUSER does not exist locally. Create user and try again." exit 1 fi echo ""; echo "" HOMEDIR="`dscl . -read /Users/$XYMONUSER | grep HomeDirectory | awk '{print $2}'`" else USERDATA=`getent passwd $XYMONUSER 2>/dev/null || ypmatch "${XYMONUSER}" passwd || grep "^${XYMONUSER}:" /etc/passwd` if test $? -eq 0 then echo "Found passwd entry for user $USERDATA" else echo "FAILURE: The user $XYMONUSER does not exist. Create user and try again." exit 1 fi echo ""; echo "" HOMEDIR="`echo $USERDATA|cut -d: -f6`" fi else HOMEDIR="$XYMONTOPDIR" fi echo "Where do you want the Xymon installation [${HOMEDIR}] ?" if test -z "$XYMONTOPDIR" then read XYMONTOPDIR fi if test -z "$XYMONTOPDIR" then XYMONTOPDIR=${HOMEDIR} fi if test -d "$XYMONTOPDIR" then echo "OK, will configure to use $XYMONTOPDIR as the Xymon toplevel directory" else echo "WARNING: $XYMONTOPDIR does not exist." fi echo ""; echo "" echo "What is the IP-address of your Xymon server [127.0.0.1] ? " if test -z "$XYMONHOSTIP" then read XYMONHOSTIP fi if test -z "$XYMONHOSTIP" then echo "** NOTE: Using 127.0.0.1 (loopback), but it is probably not what you want **" XYMONHOSTIP=127.0.0.1 fi echo ""; echo "" XYMONHOSTOS=`uname -s | tr '[A-Z]' '[a-z]'` echo "# Toplevel Makefile for Xymon" > Makefile echo "BUILDTOPDIR=\`pwd\`" >>Makefile echo "CLIENTONLY = yes" >>Makefile if test "$CONFTYPE" = "client" then echo "LOCALCLIENT = yes" >>Makefile else echo "LOCALCLIENT = no" >>Makefile fi echo "" >>Makefile echo "# configure settings for Xymon" >>Makefile echo "#" >>Makefile echo "# Toplevel dir" >>Makefile echo "XYMONTOPDIR = $XYMONTOPDIR" >>Makefile echo "" >>Makefile echo "# Xymon settings follows" >>Makefile echo "#" >>Makefile echo "# Username running Xymon" >>Makefile echo "XYMONUSER = $XYMONUSER" >>Makefile echo "# Xymon server IP-address" >>Makefile echo "XYMONHOSTIP = $XYMONHOSTIP" >>Makefile echo "# Large File Support settings" >>Makefile echo "LFSDEF = $LFS" >>Makefile echo "LIBRTDEF = $LIBRTDEF" >>Makefile echo "" >>Makefile if test -r build/Makefile.`uname -s` then echo "include build/Makefile.`uname -s`" >>Makefile echo "" echo "Using `uname -s` Makefile settings" echo "" else echo "include build/Makefile.generic" >>Makefile echo "" echo "Using GENERIC Makefile settings" echo "" echo "If this fails, change the compile settings in Makefile" echo "" echo "I would appreciate it if you send the changes to" echo "xymon-owner@xymon.com so I can include it in the next version." echo "" fi echo "" >>Makefile if test "$INSTALLBINDIR" != ""; then echo "INSTALLBINDIR = $INSTALLBINDIR" >>Makefile fi if test "$INSTALLETCDIR" != ""; then echo "INSTALLETCDIR = $INSTALLETCDIR" >>Makefile fi if test "$INSTALLEXTDIR" != ""; then echo "INSTALLEXTDIR = $INSTALLEXTDIR" >>Makefile fi if test "$INSTALLTMPDIR" != ""; then echo "INSTALLTMPDIR = $INSTALLTMPDIR" >>Makefile fi if test "$INSTALLWEBDIR" != ""; then echo "INSTALLWEBDIR = $INSTALLWEBDIR" >>Makefile fi if test "$INSTALLWWWDIR" != ""; then echo "INSTALLWWWDIR = $INSTALLWWWDIR" >>Makefile fi echo "" >>Makefile if test "$CONFTYPE" = "client" then if test "$PCREINC" != ""; then echo "PCREINCDIR = -I$PCREINC" >>Makefile fi if test "$PCRELIB" != ""; then echo "PCRELIBS = -L$PCRELIB -lpcre" >>Makefile echo "RPATHVAL += ${PCRELIB}" >>Makefile else echo "PCRELIBS = -lpcre" >>Makefile fi fi echo "#" >>Makefile echo "# Add local CFLAGS etc. settings here" >>Makefile echo "" >>Makefile echo "include build/Makefile.rules" >> Makefile echo "" >> Makefile echo ""; echo "" echo "Created Makefile with the necessary information to build Xymon" echo "Some defaults are used, so do look at the Makefile before continuing." echo "" echo "Configuration complete - now run $MAKE (GNU make) to build the tools" exit 0 xymon-4.3.28/debian/0000775000076400007640000000000013037531512014434 5ustar rpmbuildrpmbuildxymon-4.3.28/debian/xymon.preinst0000664000076400007640000000163611535462534017232 0ustar rpmbuildrpmbuild#! /bin/sh # preinst script for Xymon set -e case "$1" in install|upgrade) # stop the client when the server is installed invoke-rc.d xymon stop || true if test "$2" && dpkg --compare-versions "$2" lt 4.2.0.dfsg-2 && test -d /var/lib/xymon/www ; then if test -e /etc/logrotate.d/xymon-client && ! test -e /etc/logrotate.d/xymon-client.dpkg-old ; then mv /etc/logrotate.d/xymon-client /etc/logrotate.d/xymon-client.dpkg-old fi # we want to replace directories with symlinks, prod dpkg to do it move_dir () { test -d "$1" || return test -h "$1" && return test -e "$1.dpkg-old" && return mv "$1" "$1.dpkg-old" } cd /var/lib/xymon/www move_dir gifs move_dir help move_dir menu fi #446982 if test "$2" && dpkg --compare-versions "$2" ge 4.2.0.dfsg-1 && dpkg --compare-versions "$2" lt 4.2.0.dfsg-6 ; then chown root:root /tmp chmod 1777 /tmp fi ;; esac #DEBHELPER# exit 0 xymon-4.3.28/debian/xymon-client.postrm0000664000076400007640000000205611535462534020343 0ustar rpmbuildrpmbuild#! /bin/sh # postrm script for xymon # # see: dh_installdeb(1) set -e # summary of how this script can be called: # * `remove' # * `purge' # * `upgrade' # * `failed-upgrade' # * `abort-install' # * `abort-install' # * `abort-upgrade' # * `disappear' overwrit>r> # for details, see http://www.debian.org/doc/debian-policy/ or # the debian-policy package # Before deluser so debconf still works #DEBHELPER# case "$1" in purge|disappear) rm -rf /var/lib/xymon /var/log/xymon /var/run/xymon /etc/xymon \ /etc/default/xymon-client if test -x /usr/sbin/deluser ; then deluser xymon || true fi if test -x /usr/sbin/delgroup ; then delgroup --only-if-empty xymon || true fi ;; remove|upgrade|failed-upgrade|abort-install|abort-upgrade) ;; *) echo "postrm called with unknown argument \`$1'" >&2 exit 1 ;; esac exit 0 xymon-4.3.28/debian/xymon-client.config0000664000076400007640000000151411535462534020262 0ustar rpmbuildrpmbuild#!/bin/sh CONFIGFILE=/etc/default/xymon-client set -e . /usr/share/debconf/confmodule if [ -e $CONFIGFILE ]; then . $CONFIGFILE || true fi # if there is no value configured, look for debconf answers if [ -z "$XYMONSERVERS" ] ; then db_get xymon-client/XYMONSERVERS XYMONSERVERS="$RET" fi # still nothing? set a default if [ -z "$XYMONSERVERS" ] ; then XYMONSERVERS="127.0.0.1" fi # in any case, store the value in debconf db_set xymon-client/XYMONSERVERS "$XYMONSERVERS" if [ -z "$CLIENTHOSTNAME" ] ; then db_get xymon-client/CLIENTHOSTNAME CLIENTHOSTNAME="$RET" fi if [ -z "$CLIENTHOSTNAME" ] ; then CLIENTHOSTNAME="`hostname -f 2> /dev/null || hostname`" fi db_set xymon-client/CLIENTHOSTNAME "$CLIENTHOSTNAME" db_input high xymon-client/XYMONSERVERS || true db_input medium xymon-client/CLIENTHOSTNAME || true db_go || true xymon-4.3.28/debian/docs0000664000076400007640000000007411070452713015310 0ustar rpmbuildrpmbuildREADME README.CLIENT Changes CREDITS RELEASENOTES docs/TODO xymon-4.3.28/debian/copyright0000664000076400007640000000063311535462534016401 0ustar rpmbuildrpmbuildThis package was debianized by Henrik Stoerner on Fri, 29 Oct 2010 22:31:25 +0200. It was downloaded from http://sourceforge.net/projects/xymon/ Copyright: Henrik Stoerner Upstream author: Henrik Stoerner License: GNU GPL On Debian GNU/Linux systems, the complete text of the GNU General Public License can be found in `/usr/share/common-licenses/GPL'. xymon-4.3.28/debian/init-common.sh0000664000076400007640000000257611535424634017242 0ustar rpmbuildrpmbuild# common init functions for Xymon and Xymon-client create_includefiles () { if [ "$XYMONSERVERS" = "" ]; then echo "Please configure XYMONSERVERS in /etc/default/xymon-client" exit 0 fi umask 022 if ! [ -d /var/run/xymon ] ; then mkdir /var/run/xymon chown xymon:xymon /var/run/xymon fi set -- $XYMONSERVERS if [ $# -eq 1 ]; then echo "XYMSRV=\"$XYMONSERVERS\"" echo "XYMSERVERS=\"\"" else echo "XYMSRV=\"0.0.0.0\"" echo "XYMSERVERS=\"$XYMONSERVERS\"" fi > /var/run/xymon/bbdisp-runtime.cfg for cfg in /etc/xymon/clientlaunch.d/*.cfg ; do test -e $cfg && echo "include $cfg" done > /var/run/xymon/clientlaunch-include.cfg if test -d /etc/xymon/xymonlaunch.d ; then for cfg in /etc/xymon/xymonlaunch.d/*.cfg ; do test -e $cfg && echo "include $cfg" done > /var/run/xymon/xymonlaunch-include.cfg fi if test -d /etc/xymon/xymongraph.d ; then for cfg in /etc/xymon/xymongraph.d/*.cfg ; do test -e $cfg && echo "include $cfg" done > /var/run/xymon/xymongraph-include.cfg fi if test -d /etc/xymon/xymonserver.d ; then for cfg in /etc/xymon/xymonserver.d/*.cfg ; do test -e $cfg && echo "include $cfg" done > /var/run/xymon/xymonserver-include.cfg fi if test -d /etc/xymon/xymonclient.d ; then for cfg in /etc/xymon/xymonclient.d/*.cfg ; do test -e $cfg && echo "include $cfg" done > /var/run/xymon/xymonclient-include.cfg fi return 0 } xymon-4.3.28/debian/xymon-client.lintian-overrides0000664000076400007640000000011111535424634022442 0ustar rpmbuildrpmbuildxymon-client: package-contains-empty-directory usr/lib/xymon/client/ext/ xymon-4.3.28/debian/changelog0000664000076400007640000014474313037531326016326 0ustar rpmbuildrpmbuildxymon (4.3.28) stable; urgency=medium * rev 8005 * Catch addition possible errors during SSL handshake for standard TCP checks * Fix misparsing of --timelimit and --huge options in xymonnet (Reported by Foster Patch) * Fix memory leak when processing netapp test reports (Reported by Peter Welter) * The included version of c-ares has been bumped to version 1.12.0 * Fix for building on OpenSSL 1.1.0 (Thanks, Axel Beckert) * Add TLS variant specification to http checks, using newer funcs in OpenSSL 1.1.0 (From Henrik) * Fix overflow when skipping >2G pending data in logfetch (Reported by Sergey, a_s_y at sama.ru) * xymond_alert will no longer exit and be relaunched if started while there's no actual alertable condition. (Thanks, Franco G.) * Fix mis-parsing of PCRE regex's in client-local.cfg when char ranges are present (Reported by Erik D. Schminke) * The size limit of message data passed to SCRIPT alerts is configurable with the MAXMSG_ALERTSCRIPT variable. * Summary messages should work again (Thanks, Axel) * Many typos in comments and man pages have been corrected (Thanks, Axel et al. at Debian) * Change netstat RRD numbers to be slightly more human-readable (Thanks Roland Rosenfeld) -- Japheth Cleaver Tue, 17 Jan 2017 16:30:00 -0800 xymon (4.3.27) stable; urgency=medium * rev 7957 * Don't treat empty (0 byte) directory size as invalid (Reported by Bert Willekens) * Fix looping redirect on criticaleditor.sh * Allow NK-critical acknowledgements from status pages * Fix redirect to criticalview.sh, which is just a regular CGI * Properly recognize https URLs as summary links (Thanks, David Steinn Geirsson) * Add compile-time check for SSLv3 support -- Japheth Cleaver Thu, 24 Mar 2016 15:00:00 -0700 xymon (4.3.26) stable; urgency=medium * rev 7906 * Fix javascript failures on info/trends pages caused by CSP fixes * Fix incorrect HTTP refresh on rejected enadis.sh POSTs * Do not auto-refresh info or trends svcstatus pages * Revert default svcstatus page refresh interval from 30s back to 60s * Re-introduce XYMWEBREFRESH variable to control refresh interval * HTML encode most fields on info page * Restrict characters allowed for hostnames and testnames * HTML encode error log output on xymond/net/gen pages * HTML encode ghost hostnames output on xymond/ghostlist pages * logfetch: only evaluate the first config of a given type seen for the same file name * xymongen/reports: fix vague error message around missing history files and properly exclude clientlog statuses (Reported by Magdi Mahmoud) * Ensure configured CLASS overrides in hosts.cfg are always passed on to client workers, regardless of 'class' for that specific message (Reported by Steve Hill) -- Japheth Cleaver Fri, 19 Feb 2016 15:00:00 -0800 xymon (4.3.25) stable; urgency=high * rev 7890 * Resolve buffer overflow when handling "config" file requests (CVE-2016-2054) * Restrict "config" files to regular files inside the $XYMONHOME/etc/ directory (symlinks disallowed) (CVE-2016-2055). Also, require that the initial filename end in '.cfg' by default * Resolve shell command injection vulnerability in useradm and chpasswd CGIs (CVE-2016-2056) * Tighten permissions on the xymond BFQ used for message submission to restrict access to the xymon user and group. It is now 0620. (CVE-2016-2057) * Restrict javascript execution in current and historical status messages by the addition of appropriate Content-Security-Policy headers to prevent XSS attacks. (CVE-2016-2058) * We would like to thank Markus Krell for reporting the above issues, and for working with us to resolve them. * * Fix "TRENDS" entries in hosts.cfg improperly handling partial matches with other graph names (Reported by Jeremy Laidman) * A possible crash in when loading confreport.cgi has been fixed (Thanks, Axel Beckert) * Improve error handling slightly in the CGI wrapper * Fix missing network interface graph data on FreeBSD (Niko ) * In xymonnet, a rare SSL error state that could occur after a connection is opened will now be considered "service down" * Fix a crash in xymonnet when handling certain malformed SSL certificates (Reported by Thomas Leavitt, originally via Jeremy Laidman) * Add new trends_header and trends_footer for use on associated Trends pages * "Jump to page" redirect functionality fixed on findhost.sh (Reported by Francois Claire) * When a note is present for a host, the info page no longer has a spurious hostname on the text link * xymonclient.cfg: Add variables in for overriding config files for xymond_client and logfetch when in local mode without editing xymonclient.sh * xymonclient: Allow LOCALMODE to be set in xymonclient.cfg w/o passing --local option * logfetch: Add --noexec option to ignore commands to dynamically list files for scanning (Suggested by Jeremy Laidman) * Add file globbing capabilities to logfetch to avoid need to fork commands to create dynamic lists (Suggested by Jeremy Laidman) * The "Valid Until" time for an acknowledgement is now displayed on the ack log report page (Thanks, Dominique Frise) * The xymon.sh and runclient.sh scripts are themselves now more LSB compliant (Thanks, Nikolai Lifanov) * Windows systems now have a better calculation of "Actual" memory usage (Thanks, John Rothlisberger) * A bug in xymond_alert that could cause pages about hosts.cfg not present at inital start to cause inconsistent alerting has been fixed * xymond_alert now reloads its hostlist at regular intervals -- Japheth Cleaver Fri, 05 Feb 2016 13:00:00 -0800 xymon (4.3.24) stable; urgency=high * rev 7774 * Fix occasional crash in xymond when handling group names (Thanks, Franco Gasperino) * Fix non-special HTTP <400 status codes red instead of yellow >.< -- Japheth Cleaver Mon, 23 Nov 2015 17:40:00 -0800 xymon (4.3.23) unstable; urgency=high * rev 7740 * Fix broken 'TRACK' and 'OPTIONAL' identifiers in analysis.cfg * Prevent logfetch from segfaulting if a file we're tracking line matching deltacounts for wasn't found * Fix a type mismatch compiler warning in display group name alert matching -- Japheth Cleaver Thu, 12 Nov 2015 12:00:00 -0800 xymon (4.3.22) unstable; urgency=medium * rev 7723 * Ensure we don't leave xymond_hostdata or xymond_history zombies lying around after dropping host records (Reported by Scot Kreienkamp) * Fix up HTML list layout to reflect current standards (Thanks, hallik@calyc3.com) * Fix documentation incorrectly describing multigraph syntax as (e.g.) GRAPH_cpu. Should be GRAPHS_cpu (Thanks, Galen Johnson) * Supports scientific notation for NCV data (Thanks, Axel Beckert) * Increase resolution of xymonnet poll timing results (Thanks, Christoph Berg) * New clock skew RRD files will allow for negative delta values (Thanks, Axel Beckert) * Fix lots of typos! (Debian) * Don't skip over "mailq.rrd" (Roland Rosenfeld) * The signature algorithm used on an SSL-enabled TCP test run by xymonnet is now shown on the sslcert page. (Thanks, Ralph Mitchell) * The cipher list displayed in 'sslcert' tests will now be limited to the cipher that was actually used on the SSL connection. The --showallciphers option to xymonnet will restore the previous behavior. (From idea from Ralph Mitchell) * Provide configurable environment overrides in xymonserver.cfg for standard xymonnet options to fping/xymonping, ntpdate, and traceroute binaries. In regular installs, the intended default options to traceroute (-n -q 2 -w 2 -m 15) were not actually used. This may change in a future release, so it's suggested that users move any custom options to the new TRACEROUTEOPTS setting in xymonserver.cfg. (Orig. thanks, Axel Beckert, ntpdate issues pointed out by Matt Vander Werf) * Enable latent additional SHA digest strengths (sha256, sha512, sha224, sha384) * Don't crash generating wml cards for statuses w/ very long lines (Reported by Axel Beckert) * Flip SenderIP and Hostname columns on ghostlist pages to allow easier cutting and pasting to hosts files * Fix multiple disk volumes reported in on Darwin (OS X) clients. (Thanks, Axel Beckert) * Fix COMPACT parsing; update docs to match expected syntax (Thanks, Brian Scott) * Trailing slash no longer required for URL alias ("http://www.example.com/xymon" should work) * A new XYMONLOCALCLIENTOPTS variable in xymonclient.cfg allows options (e.g., --no-port-listing) to be given to xymond_client when running in local client mode. * Add a method to indicate lines which should be skipped by the NCV RRD processor or which mark the end of data-to-be-processed in the message. * Ensure that nostale is passed down during graph zooming (Thanks, Stef Coene) * Add missing XMH_DATA in loadhosts (Thanks, Jacek Tomasiak) * Search in more locations for default environment files when using xymoncmd * Add a "noflap" override to disable flap detection for any/all tests on a given host (Thanks, Martin Lenko) * Simplify default HTTP error code settings for xymonnet (2xx = green; 3xx = yellow; 4xx/5xx = red) * The protocol.cfg entry for RDP network tests has been updated and should work again (Thanks, Rob Steuer) * Add UDP ports to netstat output returned from darwin clients (Mac OS X) * Fixes to df/inode parsing on darwin clients (Mac OS X) (Thanks, Jason White et al.) * Add httphdr= tag to hosts.cfg to inject arbitrary headers into xymonnet HTTP tests for that host. * Turn memory test yellow if nonsensical numbers are found (>100% used for 'Actual' or Swap) * "optional include" and "optional directory" support actually added * xymongrep: load from the hosts.cfg file and error if unable, unless --loadhostsfromxymond is specified * Collect number of total cores in client data * combostatus: Fix parenthesis processing (Thanks, Andy Smith) * Add per-group anchors to generated pages when a group title is present (Thanks, Thomas Giordmaina) * xymongen: Display group tables even if group has no test results yet unless --no-showemptygroups given * Add chpasswd CGI for user-level htpasswd file updates. Requires Apache 2.4.5 or later (Thanks, Andy Smith) * Fix memory/display on multihost hostgraphs.cgi reports; remove multi-disk (which won't work as-is) * Add ACK_COOKIE_EXPIRATION for environment control of cookie validity duration (Noted by Thomas Giordmaina) * combostatus: fix core dumps on Solaris when dealing with erroneous config -- Japheth Cleaver Fri, 6 Nov 2015 06:00:00 -0800 xymon (4.3.21) unstable; urgency=medium * rev 7668 * RSS feeds should now display the short description of the event again. -- Japheth Cleaver Fri, 22 May 2015 18:15:00 -0700 xymon (4.3.20) unstable; urgency=medium * rev 7661 * Summaries should be properly displayed again, and will display on the nongreen.html page as well. * An icon for green acknowledged states is now included -- ironically, the original icon that the other checkmarks were based off of. * The various utilities in cgi-bin and cgi-secure are now hardlinked to cgiwrap at install time instead of softlink, to allow for FollowSymLinks-less apache configurations * The protocol section of URLs in hosts.cfg is now case-insensitive, and ftps URLs (FTP-over-SSL, not sftp) are recognized as a protocol. * hosts.cfg docs have been clarified to include delayyellow and delayred as allowable options (Reported by John Thurston) * 'optional include' and 'optional directory' syntax has been documented * pulldata directives in the hosts.cfg file now honor a given IP address and port * confreport.sh not displaying time-restricted alerts properly has been fixed (Reported by Gavin Stone-Tolcher) * Planned downtime settings are now applied to 'purple' statuses as well (Thanks, Torsten Richter) * Column documentation links should be working again (Reported by Andy Smith) * Fix missing null termination in certain logfetch situations (Reported by Johan Sj�berg) * New httphead tag to force an http request using HEAD instead of GET * Fix a memory leak introduced in parsing Windows SVCS test data * A divide-by-zero condition when systems erroneously report 0MB of physical memory has been corrected (Reported by John Thurston) * Parse either critical config or xymond-formatted acknowledgements on the report page, and add documentation for the --ack-log option in xymond (Thanks, Andy Smith) * The graphs to be displayed on a specific status page can be customized with environment variables - see xymonserver.cfg(5). From Werner Maier. * When clients are in "server" mode (sending raw data to the xymond server to be centrally processed), a 'clientlog' column will now be shown on xymon pages (similar to trends and info columns). This can be disabled on a per-host basis by adding a 'noclient' tag to the hosts.cfg line, or globally by adding that to the .default. host. * Add protocols.cfg entries for amqp(s), svn, ircd, and mail (submission). (Note that smtp testing here may suffer the same occasional issue as regular smtp conversations with regard to out-of-order commands.) * Fix a crash on non-glibc systems when testing xymond_alert configs with a host not in hosts.cfg (Reported by John Thurston) * On newer Linux kernels with recent procps-ng, use the "Available" memory reported by the kernel to give a more accurate reading for "Actual Used" in the client's memory status. (Reported by Dominique Frise) -- Japheth Cleaver Fri, 15 May 2015 08:15:00 -0700 xymon (4.3.19) unstable; urgency=medium * rev 7619 * Don't crash when receiving an AAAA DNS response (BSD, thanks Mark Felder) * xymonclient.sh running in --local mode was generating reports that were marked as duplicates (and thus being ignored). Reported by Guillaume Chane. * Building with old versions of libpcre not supporting PCRE_FIRSTLINE should once again work * Memory reporting on FreeBSD and OpenBSD has been fixed (Mark Felder) * The process list visible in the 'procs' test of Linux and FreeBSD clients is now generated in ASCII "forest" mode for increased legibility. * clientlog, hostinfo, and modify messages are now tracked in xymond stats * In environment config files (xymonserver.cfg, xymonclient.cfg, and cfgoptions.cfg) an initial "export " line (as if it were actually a shell script) will be ignored and the remainder of the line parsed as normal. * headermatch will now match the headers of an HTTP response even if the body is empty (eg, matching for a 302 Redirect) * --debug mode in most daemons should cause *much* less of a performance hit, and output will be timestamped in microseconds * xymondboard can now be used to PCRE-match against the raw message, and acknowledgement and disable comments. Inequalities can be specified against the lastchange, logtime, validtime, acktime, disabletime fields (in epoch timestamps). The existing net= and tag= filters have been documented. * The sample xymon.conf apache snippet now supports apache 2.4 syntax * Fix missing newline when returning upcoming 'schedule' commands. * EXTIME= syntax in analysis.cfg and alerts.cfg has been added. This is applied after any TIME= filter. Use (e.g.) to exclude Wednesday afternoons on a line which is already restricted to 9:00a to 5:00p on weekdays only. * The included version of c-ares has been bumped to version 1.10.0. * Support for older EGD (entropy gathering daemon) has been removed (Thanks, Bernard Spil) * A crash when xymond_rrd was run in --debug mode on non GNU/glibc systems has been fixed * The msgs and procs tests are now HTML-encoded to ensure that lines with brackets are properly displayed * An acknowledgements.sh log report has been added in (Submitted by Andy Smith) * A number of logfetch issues have been addressed: - --debug syntax is now supported. (If modifying the command line in xymonclient.sh, use --debug=stderr to prevent spurious lines being sent in the client report.) - Invalid POSIX regular expressions for ignore or trigger lines will now be reported but should not cause crashes - Null characters in a log file will no longer cause further processing to stop (Thanks, Franco Gasperino.) - All lines matching a 'trigger' regex will be reported back, even if the total size exceeds the "maxbytes" limit. (Up to the maximum compiled buffer size.) As much of the final section as can be fit in the space remaining will be included, similar to the previous behavior if maxbytes was exceeded but no trigger lines were given. (Thanks, Franco Gasperino.) - The current location (where the previous run left off) is now marked in the status report. - The '<...SKIPPED...>' and '<...CURRENT...>' texts can be overridden by specifying values for LOGFETCHSKIPTEXT and LOGFETCHCURRENTTEXT in xymonclient.cfg - The "scrollback" (number of positions in previous "runs" back) that logfetch starts at can now be specified with the LOGFETCHSCROLLBACK variable, from 0 - 6 (the default) * "deltacount" can be used to count the number of lines matching a specific regex in client-local.cfg, counting only since the last run. These will be shown on the trends page. NOTE: Unlike the "linecount:" option, deltacount is specified after a specific "log:" line. See the client-local.cfg file for details. * ifstat and netstat output from the new Windows PowerShell client is now graphed properly. * Hostnames beginning with a number (allowed by RFC1123) are now supported in combo.cfg * When a Windows service's status has been changed (ie, stopped or started), the relevant line in the 'svcs' test will now be updated to reflect this. (Reported by Gavin Stone-Tolcher and Neil Simmonds) * Various build issues, compiler fixes, and valgrind complaints have been fixed. -- Japheth Cleaver Mon, 30 Mar 2015 22:39:17 -0700 xymon (4.3.18) unstable; urgency=medium * rev 7494 * Fix CVE-2015-1430, a buffer overflow in the acknowledge.cgi script. Thank you to Mark Felder for noting the impact and Martin Lenko for the original patch. * Mitigate CVE-2014-6271 (bash 'Shell shock' vulnerability) by eliminating the shell script CGI wrappers * Don't crash in XML board output when there is no sender for status * Fix IP sender-address check for maintenance commands, when the target host is listed with IP 0.0.0.0 in hosts.cfg. * Linux client: - Generate 'raid' status from mdstat data - Include UDP listen ports in netstat data - Include full OS version data from SuSE clients * FreeBSD client: Handle 'actual' memory item, once the client starts reporting it. * Additional bugfixes: - xymond_capture: Fix exclude-test pattern handling - xymonlaunch: Guard against cron-times triggering twice in one minute - xymond_client: Fix DISPLAYGROUP handling in analysis.cfg rules - xymonnet: Handle AAAA records in dns checks - xymond_channel: Fix matching in --filter code - xymond: BFQ id may be zero - xymond: Fix bug in hostfilter matching code - xymond: Fix memory leak - xymond: Fix list manipulation for "modify" commands - xymond_rrd: Fix restart of external processor - Linux client: Set CPULOOP for correct top output - AIX client: vmstat behaves differently -- Japheth Cleaver Tue, 3 Feb 2015 11:35:11 -0800 xymon (4.3.17) unstable; urgency=low * rev 7446 * Fix crash in xymond when using 'schedule' command * Configure/build/install fixes: - Allow specifying location of the PCRE include/library files for client-side configuration build. - Pass IDTOOL to client installation (for Solaris). - Fix broken configure+Makefiles for client-side configuration - C-ARES: Fix wrong call to Makefile.test-cares during configure - Dont error out if www-dir or man-dir is empty. Mostly an issue when building packages with non-standard layouts. * Fix wrong timestamp on a new status arriving with a non-green status while DOWNTIME was active. Such a status would appear to have been created on Jan 1st, 1970. * Fix hostgraphs so it obeys RRDWIDTH / RRDHEIGHT settings * Add upper limit to showgraph CGI when generating self-referring URI's From Werner Maier * Extra sanity check on extcombo message offsets. * The Enable/Disable webpage now permits filtering on CLASS value. From Galen Johnson -- Henrik Stoerner Sun, 23 Feb 2014 10:44:18 +0100 xymon (4.3.16) unstable; urgency=low * rev 7394 * Fix xymonnet crash on sending http test results * Fix xymond crash if client-local.cfg contains empty sections * Fix RPM-based initscript for clients with explicit hostname * Fix misleading error-message when testing for C-ARES library * Fix client-local.cfg handling, so by default it will not merge sections together, i.e. behave like previous 4.x releases. NOTE: The new regexp matching can still be used. * Add "--merge-clientlocal" option for xymond, which causes it to merge all matching sections from client-local.cfg into one. * Use native POSIX binary-tree handling code -- Henrik Stoerner Sun, 9 Feb 2014 10:16:02 +0100 xymon (4.3.15) unstable; urgency=low * rev 7384 * Fix xymond_alert crashes introduced in 4.3.14 * Fix missing C-ARES build files * client-local.cfg: Support expression matching of sections * acknowledge.cgi: Acks are enabled for all ALERTCOLORS, not just red and yellow -- Henrik Stoerner Fri, 31 Jan 2014 13:49:02 +0100 xymon (4.3.14) unstable; urgency=low * rev 7376 * Fix critical ack not working for hosts where the display-name is set (via "NAME:" tag). From Any Smith. * SNI (Server Name Indication) causes some SSL connections to fail due to server-side buggy SSL implementations. Add "sni" and "nosni" flags to control SNI for specific hosts, and "--sni" option for xymonnet to control the default. Reported by Mark Felder. * Fix build process to fully obey any XYMONTOPDIR setting from the top-level Makefile. NOTE: Client-only builds no longer install the client in a "client/" subdirectory below XYMONHOME. * Fix showgraph so it silently ignores stale rrdctl files when trying to flush RRD data before showing a graph. * Fix xymond_alert crashing when trying to strip characters from the alert message. Bug introduced in 4.3.13. * Fix Solaris client to report memory even when no swap is configured. * Fix bug where alerts that were initially suppressed due to TIME restrictions are delayed until REPEAT interval expires. * Fix crash in xymonlaunch when trying to find tasks.cfg * Fix HTML generated by acknowledge.cgi (missing '>') * Fix Linux client reporting garbled client data if top output ends without a new-line (causes CPU load and other vmstat graphs to stop updating) * Fix Debian installation so it enables Apache mod_rewrite * Fix merge-lines utility crashing when first line was an include * Fix "make install" failing when server/www/help was a symlink * Document existing OPTIONAL setting in analysis.cfg for file-checks on files which may not exist. * Document existing CLASS setting in alerts.cfg * Add new INFOCOLUMNGIF and TRENDSCOLUMNGIF settings so the icons used for these pages are configurable. * Enhance Solaris client to correctly handle Solaris zones. * Add new search facilities to xymond to select hosts with the 'xymondboard' and 'hostinfo' commands. * New --ack-each-color option for xymondd changes ack behaviour so a yellow ack does not apply when status changed to red, but a red ack applies if status goes yellow * New "headermatch" tag for http tests so content checks can look at HTTP headers in addition to the HTML body. * Use system-wide c-ares library. NB: Now requires libc-ares2. -- Henrik Stoerner Sun, 26 Jan 2014 13:49:02 +0100 xymon (4.3.13) unstable; urgency=low * rev 7339 * Fixes to FreeBSD client code, from Mark Felder (FreeBSD maintainer) * Fix crash on "client" data sent via status channel when host is unknown * HTTP tests now use "Cache-control" header for HTTP/1.1 (default) and "Pragma" for HTTP/1.0, so it is protocol compliant. * xymonnet network tester supports Server Name Indication (SNI) for SSL enabled virtual websites. * Strip carriage-return from text sent to mail alerts, to avoid mail programs treating the message as binary and putting it in an attachment * netbios-ssn, snpp and lpd protocol.cfg entries (Tom Schmidt) * "temperature" status strips html tags from sensor names (Tom Schmidt) * Extra "total network I/O" line on ifstat graph (Tom Schmidt) * New "backfeed" queue for high-speed transmission of Xymon status updates between modules located on the same server as xymond. Note: This is disabled by default, see the README.backfeed file. * New "extcombo" message type allows for combo messages of all types (usually "status" and "data"). * New setting IMAGEFILETYPE removes hardcoded ".gif" on the various image-files in the "gifs" directory. Directory name is unchanged, though. * New modifier for https tests for selecting only TLSv1 as protocol * CGI's now return a proper HTTP status code in case of errors (e.g. "404" when requesting a status for a non-existing host). * Fix problem with xymond_rrd dying if an external processors crashes (from J. Cleaver) * Fix configure/build problem with detecting POSIX realtime-clock functions. * Fix for FreeBSD 5+ vmstat reporting (from Jeremy Laidman) * Fix for "make install" not setting correct file/directory permissions * Re-add the "--hf-file" option for criticalview CGI (removed in 4.3.7) -- Henrik Stoerner Wed, 8 Jan 2014 16:43:32 +0100 xymon (4.3.12) unstable; urgency=high * rev 7211 * Security fix: Guard against directory traversal via hostname in "drophost" commands. * Fix crash in xymongen introduced in 4.3.11 * SCO client: Fix overflow in memory calculation when >2 GB memory * Fix so "include" and "directory" definitions in configuration files now handle after the keyword * Fix for the Xymon webpage menu on iPad's and Android (touch devices) * Fix "drophost" handling so the host data directory is also cleared * xymond_rrd now processes data from "clear" status messages * Xymon clients now report the version number in the client data * Linux clients now align "ps" output so it is more readable. * New "generic" client message handler allows log/file monitoring from systems that are not known to Xymon. * The Xymon client now works if invoked with a relative path to the runclient.sh script * Other minor / internal bugfixes -- Henrik Stoerner Wed, 24 Jul 2013 10:24:01 +0200 xymon (4.3.11) unstable; urgency=low * rev 7188 * Fix wrong file permissions when installing * Linux client: Fix handling of root filesystem when mounted on "/dev/root" * trends webpage: Fix case where hostname disappears after zoom. * FreeBSD client: Memory patch for FreeBSD 8.0+ * xymond_alert: Fix problem with UNMATCHED rules triggering when there are actual recipients, but their alerts are suppressed due to a REPEAT setting not having expired. * xymond_rrd: Dont crash if called with an empty status/data message * xymond_channel: Report cause when channel-child exits/crashes * xymongen: Geneate an overview page with only reds (like non-green) * xymongen: Optionally define env. variable BOARDFILTER to select hosts/tests included in the generated pages * links: Add pdf, docx and odt as known document formats * Fix potential crashes after an alert cookie expired * Fix potential crash after deleting/renaming a host * Speedup loading of the hosts.cfg file, noticeable with very large hosts.cfg files (100.000+ hosts) -- Henrik Stoerner Sun, 21 Apr 2013 15:24:01 +0200 xymon (4.3.10) unstable; urgency=low * rev 7164 * Fix build problems with "errno" * Fix build problems with OpenSSL in non-default locations * Fix build problems with certain LDAP configurations * Fix build problems with RRDtool on FreeBSD / OpenBSD * Fix problem with ifstat data from Fedora in graphs * "inode" check on FreeBSD, OpenBSD, OSX, Solaris, HP/UX, AIX in addition to existing support for Linux * Document building and installing Xymon on common platforms (Linux, FreeBSD, OpenBSD, Solaris) * Enhance xymoncfg so it can be used to import Xymon configuration settings into shell-scripts. -- Henrik Stoerner Sat, 4 Aug 2012 13:47:00 +0200 xymon (4.3.9) unstable; urgency=low * rev 7120 * Fix crash when XYMSRV is undefined but XYMSERVERS is * Fix error in calculating combo-status messages with forward references * Fix error in disable-until-TIME or disable-until-OK code * Fix documentation of DURATION in alerts.cfg / xymond_alert so it is consistenly listed as being in "minutes". * Permit explicit use of ">" and ">=" in alerts.cfg * Permit building without the RRDtool libraries, e.g. for a network-tester build, but with trend-graphing disabled. * Full compiler-warning cleanup * Various configuration/build-script issues fixed. -- Henrik Stoerner Tue, 24 Jul 2012 18:21:00 +0200 xymon (4.3.8) unstable; urgency=low * rev 7082 Bugfixes * Workaround for DNS timeout handling, now fixed at approximately 25 seconds. * "hostinfo" command for xymond documented * confreport only shows processes that are monitored * analysis.cfg parsing of COLOR for UP rules was broken * RRD handlers no longer crash after receiving 1 billion updates * Using .netrc for authentication could crash xymonnet * "directory" includes would report the wrong filename for missing directories. * useradm CGI would invoke htpassword twice * "include" and "directory" now ignores trailing whitespace * SSLv2 support disabled if SSL-library does not support it * Minor bugfixes and cleanups of compiler warnings. Enhancements * Service status on info page now links to the detailed status page. * Add RRDGRAPHOPTS setting to permit global user-specified RRD options, e.g. for font to showgraph CGI * Add check for the size of public keys used in SSL certificates (enabled via --sslkeysize=N option for xymonnet) * Optionally disable the display of SSL ciphers in the sslcert status (the --no-cipherlist option for xymonnet) * Improved build-scripts works on newer systems with libraries in new and surprising places * Reduce xymonnet memory usage and runtime for ping tests when there are multiple hosts.cfg entries with the same IP-address. * Add code for inode-monitoring on Linux. Does not currently work on any other client platform. * Added the ability to disable tests until a specific time, instead of for some interval. Disabling a test also now computes the expire time for the disable to happen at the next closest minute. -- Henrik Stoerner Sun, 15 Jul 2012 17:00:00 +0200 xymon (4.3.7) unstable; urgency=low * rev 6803 * Fix acknowledge CGI (broken in 4.3.6) * Fix broken uptime calculation for systems reporting "1 day" * Workaround Solaris breakage in the LFS-support detection * Fix/add links to the HTML man-page index. * Fix "Stop after" value not being shown on the "info" page. * Fix broken alert texts when using FORMAT=SMS * Fix wrong description of xymondboard CRITERIA in xymon(1) * Fix missing columnname in analysis.cfg(5) DS example * Fix missing space in output from disk IGNORE rules in xymond_client --dump-config * Fix overwrite of xymon-apache.conf when upgrading * Fix installation so it does not remove include/directory lines from configuration files. * Add client/local/ directory for custom client script -- Henrik Stoerner Tue, 13 Dec 2011 13:15:00 +0100 xymon (4.3.6) unstable; urgency=low rev 6788 * Optionally choose the color for the "cpu" status when it goes non-green due to uptime or clock offset. * Allow for "include" and "directory" in combo.cfg and protocols.cfg * New INTERFACES definition in hosts.cfg to select which network interfaces are tracked in graphs. * New access control mechanism for some CGI scripts returning host-specific information. Access optionally checked against an Apache-style "group" file (see xymonwebaccess(5) CGI manpage). * New "vertical" page-definitions (vpage, vsubpage,vsubparent) for listing hosts across and tests down on a page. * Fix hostlist CGI crash when called with HTTP "HEAD" * Fix svcstatus CGI crash when called with non-existing hostname * Fix "ackinfo" updates being cleared when host hits a DOWNTIME period. * Fix compile-errors on Solaris due to network libraries not being included. * Fix "logrotate" messages not being sent to some channels. * STATUSLIFETIME now provides the default time a status is valid (in xymond). * Critical systems view: Use priority 99 for un-categorised priorities (imported from NK tags) and show this as 'No priority' on the webpage. * useradm CGI: Sort usernames * New xymond module - xymond_distribute - can forward administrative commands (drop, rename, disable, enable) from one Xymon server to another. * New tool: appfeed CGI provides data for the Android "xymonQV" app by Darrik Mazey. -- Henrik Stoerner Mon, 5 Dec 2011 08:00:00 +0100 xymon (4.3.5) unstable; urgency=medium rev 6755 * Fix crash in CGI generating the "info" status column. * Fix broken handling of IGNORE for log-file analysis. * Fix broken clean-up of obsolete cookies (no user impact). * Devmon RRD handler: Fix missing initialisation, which might cause crashes of the RRD handler. * Fix crashes in xymond caused by faulty new library for storing cookies and host-information. * Fix memory corruption/crash in xymond caused by logging of multi-source statuses. * New "delayred" and "delayyellow" definitions for a host can be used to delay change to a yellow/red status for any status column (replaces the network-specific "badFOO" definitions). * analysis.cfg and alerts.cfg: New DISPLAYGROUP setting to select hosts by the group/group-only/group-except text. * New HOSTDOCURL setting in xymonserver.cfg. Replaces the xymongen "--docurl" and "--doccgi" options, and is used by all tools. * xymond_history option to control location of PID file. * Critical Systems view: Optionally show eventlog for the hosts present on the CS view. * Critical Systems view: Multiple --config options can now be used, to display critical systems from multiple configurations on one page. * Detailed status display: Speedup by no longer having to load the hosts.cfg file. * xymongen / xymonnet: New "--loadhostsfromxymond" option. -- Henrik Stoerner Fri, 9 Sep 2011 10:35:00 +0200 xymon (4.3.4) unstable; urgency=medium rev 6720 * Fix crashes and data corruption in Xymon worker modules (xymond_client, xymond_rrd etc) after handling large messages. * Fix xymond lock-up when renaming/deleting hosts * Fix xymond cookie lookup mechanism * Fix xymond_client crash if analysis.cfg contains invalid configuration entries, e.g. expressions that do not compile. * Fix showgraph CGI crash when legends contain colon. * CGI utils: Fix potential security issues involving buffer- overruns when generating responses. * CGI utils: Fix crash when invoked with HTTP "HEAD" * CGI utils: Fix crashes on 64-bit platforms due to missing prototype of "basename()" function. * svcstatus CGI: Fix crash if history log is not a file. * Critical systems view CGI: Fix cross-site scripting * Fix recovery-messages for alerts sent to a GROUP * xymonnet: Include hostname when reporting erroneous test-spec * Webpages: Add new HOSTPOPUP setting to control what values from hosts.cfg are displayed as a "comment" to the hostname (either in pop-up's or next to the hostname). * RRD "memory" status handler now recognizes the output from the bb-xsnmp.pl module (for Cisco routers). * Web templates modified so the menu CSS can override the default body CSS. * Acknowledge web page now allows selecting minutes/hours/days * Enable/Disable webpage enhanced, so when selecting multiple hosts the "Tests" column only lists the tests those hosts have. -- Henrik Stoerner Mon, 1 Aug 2011 23:26:00 +0200 xymon (4.3.3) unstable; urgency=high rev 6684 * SECURITY FIX: Some CGI parameters were used to construct filenames of historical logfiles without being sanitized, so they could be abused to read files on the webserver. * SECURITY FIX: More cross-site scripting vulnerabilities. * Remove extra "," before "History" button on status-view * Critical view: Shring priority-column to 10% width * hosts.cfg loader: Check for valid IP spec (nibbles in 0-255 range). Large numbers in a nibble were accepted, triggering problems when trying to ping the host. * Alert macros no longer limited to 8kB -- Henrik Stoerner Mon, 6 May 2011 07:51:00 +0200 xymon (4.3.2) unstable; urgency=medium rev 6672 * Bugfix for problems caused by the XSS fixes. -- Henrik Stoerner Mon, 4 Apr 2011 07:34:00 +0200 xymon (4.3.1) unstable; urgency=medium rev 6667 * Web UI: SECURITY FIX - fix potential cross-site scripting vulnerabilities. Initial report by David Ferrest (email April 1st 2011). * Solaris Makefile: Drop guessing of what linker is being used, since we get it wrong too often. * configure: Add missing include to fix compile failure on some systems. * get_ostype(): Check that we have a valid OS identifier. Dont assume we can write to the string passed us. * xymond user messages: Improve error message for oversize messages. Document the MAXMSG_USER setting. * combostatus: Make the set of error-colors configurable. Change default set so BLUE and PURPLE are not considered errors (only RED is an error by default). * xymon(1) manpage: Add missing description of some fields available in the xymondboard command. * hosts.cfg manpage: Fix wrong NOPROP interpretation. From Thomas Brand. * Demotool: Change Hobbit->Xymon -- Henrik Stoerner Sun, 3 Apr 2011 12:03:00 +0200 xymon (4.3.0) unstable; urgency=medium * Critical view and other webpages: Make the 'All systems OK' message configurable. Also allow the header/footer for the Critical Systems view to be configurable. Suggestion and preliminary patch from Buchan Milne. * xymonnet: Improve error report when HTTP tests get an empty response - 'HTTP error 0' sounds weird. * report / snapshot CGI's: Fix buffer overrun in the HTML delimiter generated in the "please wait..." message. Also, fix potential buffer overrun in report CGI if invoked with a large value for the "style" parameter. Reported by Rolf Biesbroek. * Graph definitions (graphs.cfg): Multi graphs cannot use a regex pattern. Problem report by Brian Majeska * Solaris interface statistics: Filter out "mac" and "wrsmd" devices at the client side. Update RRD handler to also filter "wrsmd" at the server side, like we already did for "mac" devices. Cf. http://www.xymon.com/archive/2009/06/msg00204.html * Documentation: Document the XMH_* fields available in xymondboard commands. * Documentation: Document SPLITNCV and "trends" methods of doing custom graphs. * RRD definitions: Allow override of --step/-s option for rrdcreate, from template supplied in rrddefinitions.cfg. Suggestion from Brian Majeska. * mailack: Remove restriction on how long a subjectline/message body can be. * Build procedure: Add notice about running upgrade script before installing the new version. * xymond_alert: Document --trace option * Alerts: For recovery messages, add information so you can tell whether the recovery was due to the service actually recovering, or if it was merely disabled. * xymond_alert: Fix missing element in array of alert status texts used for tracing. Spotted by Dominique Frise. * Add support for FreeBSD v8 modified ifstat output * Documentation: Update information about the Xymon mailing lists following move to Mailman and new archive URL. * HP/UX client: Use "swapinfo" to extract memory utilisation data, instead of the hpux-meminfo utility. By Earl Flack http://lists.xymon.com/pipermail/xymon/2010-December/030100.html -- Henrik Stoerner Fri, 4 Mar 2011 11:08:00 +0100 xymon (4.3.0-0.20110120.rc1) unstable; urgency=low * 4.3.0 RC1 release - rev 6627 * hosts.cfg badldap documentation: Document that for LDAP URL's you must use 'badldapurl'. Reported by Simo Hmami. * xymond flap detection: Make number of tracked status changes and the flap-check period configurable. Change the defaults to trigger flapping at more than 5 status changes in a 30 minute period. * sendmessage: Enhanced error reporting, to help track down communication problems. * xymond_client: Fix Windows SVC status handling to avoid coredumps, memory corruption and other nasties. Will now report the real name of the service, instead of the pattern used in the analysis.cfg file. NOTE: Slight change to status message format. * Client handler: Fix owner/user check parsing. Reported by Ian Marsh http://www.xymon.com/archive/2011/01/msg00133.html (also broken in 4.2.3). * xymongen: Fix broken --doc-window option handling. Reported by Tom Schmitt. * Xymongen: Fix documentation of the --doc-window/--no-doc-window options. * Webpage background: Use a CSS and a new set of gif's to implement a background that works on all displays, regardless of width. Uses a new xymonbody.css stylesheet which can also control some other aspects of the webpage. From Francois Claire. * Documentation: The xymon 'rename' command should be used AFTER renaming a host in hosts.cfg, not before. From Tom Georgoulias. * Memory status: Add some sanity checks for the memory utilisation reported by clients. Occasionally we get completely bogus data from clients, so only act on them if percentages do not exceed 100. * Critical systems view: Add "--tooltips" option so you can save screen space by hiding the host descriptions in a tooltip, like we do on the statically generated pages. Feature request from Chris Morris. * Solaris client: Report "swap -l" in addition to "swap -s" for swap usage. Backend prefers output from "swap -l" when determining swap utilisation. * Webpage menu: Use the CSS and GIF's by Malcolm Hunter - they are much nicer than the ones from Debian. Distribute both the blue and the grey version, and configure which one to use in xymonserver.cfg. * Graph zoom: Use float variables when calculating the upper/lower limits of the graph. Fixes vertical zoom. * xymond: Make sure we do not perform socket operations on invalid sockets (e.g. those from a scheduled task pseudo-connection) * Installation: Remove any existing old commands before creating symlinks * xymonproxy: Fix broken compatibility option '--bbdisplay' * Fix eventlog summary/count enums so they dont clash with Solaris predefined entities * History- and hostdata-modules: Dont save data if there is less than 5% free space on the filesystem. Also, dont save hostdata info more than 5 times per hour. * Historical statuslog display: Work-around for crash when status-log is empty * fping.sh configure sub-script: Fix syntax error in suggested 'sudoers' configuration, and point to the found fping binary. From Steff Coene. * namematch routine: Fix broken matching when doing simple matching against two strings where one was a subset of the other. http://www.xymon.com/archive/2010/11/msg00177.html . Reported by Elmar Heeb who also provided a patch, although I chose a different solution to this. * Xymon net: Fix broken compile when LDAP-checks are disabled. Reported by Roland Soderstrom, fix from Ralph Mitchell. * xymon(7) manpage: Drop notice that renaming in 4.3.0 is not complete * Installation: Setup links for the commonly used Hobbit binaries (bb, bbcmd, bbdigest, bbhostgrep, bbhostshow) * Upgrade script: Setup symlinks for the old names of the standard webpages * xymonserver.cfg.DIST: Missing end-quote in compatibility BBSERVERSECURECGIURL setting. From Ralph Mitchell * xymongrep: Fix broken commandline parsing resulting from trying to be backwards-compatible. Reported by Jason Chambers. -- Henrik Stoerner Sun, 23 Jan 2011 12:36:00 +0100 xymon (4.3.0-0.20101114.beta3) unstable; urgency=low * Beta-3 release - rev 6590 -- Henrik Stoerner Sun, 14 Nov 2010 19:00:00 +0100 hobbit (4.3.0-0.beta2) unstable; urgency=low * Xymon version 4.3.0 BETA 2 Core changes: * New API's for loadhosts and sendmessage, in preparation for the full 5.0 changes. * Always use getcurrenttime() instead of time(). * Support for defining holidays as non-working days in alerts and SLA calculations. * Hosts which appear on multiple pages in the web display can use any page they are on in the alerting rules and elsewhere. * Worker modules (RRD, client-data parsers etc) can operate on remote hosts from the hobbitd daemon, for load-sharing. * Various bugfixes collected over time. * New client support: z/OS, z/VSE and z/VM. Network test changes: * Merged new network tests from trunk: SOAP-over-HTTP, SSL minimum cipher strength * Changed network test code to always report a validity period for network tests, so it it possible to run network tests less often than every 30 minutes (e.g. once an hour). * Make the content-type setting in HTTP POST tests configurable. * Make the source-address used for TCP tests configurable. * Make the acceptable HTTP result codes configurable. * Use and save HTTP session cookies. Web changes * Support generic drop-down lists in templates. * "NOCOLUMNS" changed to work for all columns. * New "group-sorted" definition to auto-sort hosts in a group * Use browser tooltips for host comments * "Compact" status allows several statuses to appear as a single status on the overview webpages. * Trends page can select the time period to show. Buttons provided for the common selections. * Ghost list report now lists possible candidates for a ghost, based on IP-address or unqualified hostname. * Enhanced eventlog and top-changing hosts webpage Report changes * Number of outages as SLA parameter Miscellaneous * hobbitlaunch support for running tasks only on certain hosts, and for a maximum time. -- Henrik Stoerner Fri, 24 May 2009 10:39:00 +0200 hobbit (4.2.3-1) unstable; urgency=low * Xymon version 4.2.3 release * Time-out code changed to use clock_gettime() with CLOCK_MONOTONIC * Bugfix for hobbitd/hobbitd_worker communication going out-of-sync resulting in "garbled data" being logged and worker modules stopping. * NCV module now works with negative numbers. * Several bugfixes in DNS lookup code - could lead to crashes when performing DNS tests. * Switch to C-ARES 1.6.0 - drop support for older versions. * Run more TCP tests in parallel by not waiting for very slow connections to complete before starting new ones. * Added "hostlist" web utility for spreadsheet-reporting of the hosts in Hobbit. -- Henrik Stoerner Mon, 09 Feb 2009 10:46:00 +0100 hobbit (4.2.2-1) unstable; urgency=low * Xymon version 4.2.2: 4.2.0 plus all-in-one patch * BBWin support added * Project renamed to "Xymon" - preliminary changes in documents and web templates, but no filename changes. -- Henrik Stoerner Thu, 28 Sep 2008 14:52:00 +0100 hobbit (4.2.0-1) unstable; urgency=low * Hobbit version 4.2: New upstream release. -- Henrik Stoerner Wed, 09 Aug 2006 21:48:00 +0200 hobbit (4.2-RC-20060712) unstable; urgency=low * Release candidate of 4.2 -- Henrik Stoerner Wed, 12 Jul 2006 23:13:00 +0200 hobbit (4.2-beta-20060605) unstable; urgency=low * Beta release of 4.2 -- Henrik Stoerner Mon, 05 Jun 2006 16:53:00 +0200 hobbit (4.2-alfa-20060404) unstable; urgency=low * Alfa release of 4.2 -- Henrik Stoerner Tue, 04 Apr 2006 23:30:00 +0200 hobbit (4.1.2p1-1) unstable; urgency=low * New upstream release -- Henrik Stoerner Thu, 10 Nov 2005 17:32:00 +0100 hobbit (4.1.2-1) unstable; urgency=low * New upstream release -- Henrik Stoerner Mon, 10 Oct 2005 22:30:00 +0200 hobbit (4.1.1-1) unstable; urgency=low * New upstream release. -- Henrik Stoerner Mon, 25 Jul 2005 17:49:00 +0200 hobbit (4.1.0-1) unstable; urgency=low * New upstream release. -- Henrik Stoerner Sun, 24 Jul 2005 23:27:00 +0200 hobbit (4.0.4-1) unstable; urgency=low * New upstream release. -- Henrik Stoerner Sun, 29 May 2005 12:08:00 +0200 hobbit (4.0.3-1) unstable; urgency=low * New upstream release. -- Henrik Stoerner Sun, 22 May 2005 09:34:57 +0200 hobbit (4.0.2-1) unstable; urgency=low * New upstream release. -- Henrik Stoerner Sun, 10 Apr 2005 19:39:15 +0200 hobbit (4.0.1-1) unstable; urgency=low * Build problems fixed on Solaris, HP-UX * Zoomed graphs could lose the hostname in the title. -- Henrik Stoerner Fri, 1 Apr 2005 07:43:42 +0200 hobbit (4.0-1) unstable; urgency=low * Upstream release of version 4.0 -- Henrik Stoerner Wed, 30 Mar 2005 21:31:03 +0200 xymon-4.3.28/debian/xymon-client.init0000664000076400007640000000472211535462534017764 0ustar rpmbuildrpmbuild#! /bin/sh # # xymonclient This shell script takes care of starting and stopping # the Xymon client. ### BEGIN INIT INFO # Provides: xymon-client # Required-Start: $remote_fs $network # Should-Start: $all # Required-Stop: $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Xymon system monitor client # Description: Client to feed system data to a remote Xymon server. ### END INIT INFO PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DAEMON="/usr/lib/xymon/client/bin/xymonlaunch" NAME=xymonclient DESC="Xymon Client" PIDFILE="/var/run/xymon/clientlaunch.pid" XYMONCLIENTHOME="/usr/lib/xymon/client" test -x $DAEMON || exit 0 . /lib/lsb/init-functions . /usr/share/xymon/init-common.sh # Include xymonclient defaults if available if [ -f /etc/default/xymon-client ] ; then . /etc/default/xymon-client fi [ -z "$MACHINE" ] && MACHINE="$CLIENTHOSTNAME" [ -z "$MACHINEDOTS" ] && MACHINEDOTS="`hostname -f`" export XYMONSERVERS XYMONCLIENTHOME CLIENTHOSTNAME MACHINE MACHINEDOTS case "$1" in start) # do not run the client script on the server [ -x /usr/lib/xymon/server/bin/xymond ] && exit 0 create_includefiles log_daemon_msg "Starting $DESC" "$NAME" start-stop-daemon --exec $DAEMON --chuid xymon --umask 022 --start \ -- \ --config=/etc/xymon/clientlaunch.cfg \ --log=/var/log/xymon/clientlaunch.log \ --pidfile=$PIDFILE log_end_msg $? ;; stop) log_daemon_msg "Stopping $DESC" "$NAME" start-stop-daemon --exec $DAEMON --pidfile $PIDFILE --stop --retry 5 log_end_msg $? ;; status) if test -s $PIDFILE then kill -0 `cat $PIDFILE` if test $? -eq 0 then echo "Xymon client running with PID `cat $PIDFILE`" exit 0 else echo "Xymon client not running, removing stale PID file" rm -f $PIDFILE exit 1 fi else echo "Xymon client does not appear to be running" exit 3 fi ;; restart) if [ -x /usr/lib/xymon/server/bin/xymond ] ; then log_action_msg "Xymon server installed. Please restart 'xymon' instead" exit 0 fi $0 stop sleep 1 $0 start ;; reload|force-reload) [ -x /usr/lib/xymon/server/bin/xymond ] && exit 0 create_includefiles kill -HUP `cat /var/run/xymon/clientlaunch.pid` ;; rotate) for PIDFILE in /var/run/xymon/*.pid do test -e $PIDFILE && kill -HUP `cat $PIDFILE` done ;; *) N=/etc/init.d/$NAME echo "Usage: $N {start|stop|restart|force-reload|status|rotate}" >&2 exit 1 ;; esac exit 0 xymon-4.3.28/debian/rules0000775000076400007640000001117711535462534015533 0ustar rpmbuildrpmbuild#!/usr/bin/make -f CFLAGS = -Wall -g ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) CFLAGS += -O0 else CFLAGS += -O2 endif Makefile: configure dh_testdir # Add here commands to configure the package. USEXYMONPING=y \ ENABLESSL=y \ ENABLELDAP=y \ ENABLELDAPSSL=y \ XYMONUSER=xymon \ XYMONTOPDIR=/usr/lib/xymon \ XYMONVAR=/var/lib/xymon \ XYMONHOSTURL=/xymon \ CGIDIR=/usr/lib/xymon/cgi-bin \ XYMONCGIURL=/xymon-cgi \ SECURECGIDIR=/usr/lib/xymon/cgi-secure \ SECUREXYMONCGIURL=/xymon-seccgi \ HTTPDGID=www-data \ XYMONLOGDIR=/var/log/xymon \ XYMONHOSTNAME=localhost \ XYMONHOSTIP=127.0.0.1 \ MANROOT=/usr/share/man \ INSTALLBINDIR=/usr/lib/xymon/server/bin \ INSTALLETCDIR=/etc/xymon \ INSTALLWEBDIR=/etc/xymon/web \ INSTALLEXTDIR=/usr/lib/xymon/server/ext \ INSTALLTMPDIR=/var/lib/xymon/tmp \ INSTALLWWWDIR=/var/lib/xymon/www \ ./configure build: build-stamp build-stamp: Makefile dh_testdir # Parallel building does not work as of 4.3.0~beta2 PKGBUILD=1 $(MAKE) -j1 touch build-stamp clean: dh_testdir dh_testroot rm -f build-stamp [ ! -f Makefile ] || $(MAKE) distclean dh_clean # debconf-updatepo S=$(CURDIR)/debian/xymon C=$(CURDIR)/debian/xymon-client install-clean: dh_prep install: install-server install-client install-server: build install-clean #################### Installing server ######################## dh_testdir dh_testroot dh_install -a dh_installdirs -a PKGBUILD=1 INSTALLROOT=$S/ $(MAKE) install # Static content in /usr/share cd $S/var/lib/xymon/www && \ mv gifs ../../../../usr/share/xymon && ln -s ../../../../usr/share/xymon/gifs . && \ mv help ../../../../usr/share/xymon && ln -s ../../../../usr/share/xymon/help . && \ mv menu ../../../../usr/share/xymon && ln -s ../../../../usr/share/xymon/menu . # We depend on the -client package rm -rf $S/usr/lib/xymon/client # This needs root chmod 4755 $S/usr/lib/xymon/server/bin/xymonping mv $S/etc/xymon/xymon-apache.conf \ $S/etc/apache2/conf.d/xymon # Make xymonserver.cfg use the settings we have configured during installation echo "include /etc/default/xymon-client" > $S/etc/xymon/xymonserver.cfg.debian sed -f debian/xymonserver-setup.sed $S/etc/xymon/xymonserver.cfg >> $S/etc/xymon/xymonserver.cfg.debian rm $S/etc/xymon/xymonserver.cfg mv $S/etc/xymon/xymonserver.cfg.debian $S/etc/xymon/xymonserver.cfg # Autogenerated on first install rm $S/etc/xymon/hosts.cfg install-client: build install-clean #################### Installing client ######################## dh_testdir dh_testroot dh_install -a dh_installdirs -a PKGBUILD=1 INSTALLROOT=$C/ $(MAKE) install-client cd $C/usr/lib/xymon/client && mv etc/* $C/etc/xymon && rmdir etc && ln -s ../../../../etc/xymon etc cd $C/usr/lib/xymon/client && rmdir logs && ln -s ../../../../var/log/xymon logs cd $C/usr/lib/xymon/client && rmdir tmp && ln -s ../../../../var/lib/xymon/tmp # the only command needed in /usr/bin is xymoncmd, its PATH includes our private .../bin # but install xymon also, since it is used so much. cd $C/usr/bin && ln -s ../lib/xymon/client/bin/xymoncmd xymoncmd cd $C/usr/bin && ln -s ../lib/xymon/client/bin/xymon xymon cp debian/xymon-client.default.dist $C/usr/share/xymon/xymon-client.default # dynamic list of installed client extensions echo "include /var/run/xymon/clientlaunch-include.cfg" >> \ $C/etc/xymon/clientlaunch.cfg rm $C/usr/lib/xymon/client/runclient.sh binary: binary-arch binary-indep #binary-indep: # #################### Building dummy packages ######################## # dh_testdir -i # dh_installchangelogs -i # dh_installdocs -i # dh_compress -i # dh_gencontrol -i # dh_builddeb -i binary-arch: build install-server install-client #################### Building .deb files ######################## dh_testdir -a dh_testroot -a dh_installchangelogs -a Changes dh_installdocs -a dh_installexamples -a # ignore missing dh_lintian for older dh versions -dh_lintian -a # move some files into the client package dh_movefiles --sourcedir=debian/xymon -a cd $S/usr/lib/xymon/server/bin && \ for f in * ; do \ if [ -f $C/usr/lib/xymon/client/bin/$$f ] ; then \ rm -v $$f ; ln -s ../../client/bin/$$f ; \ fi \ done rmdir $S/usr/share/man/man7 dh_installdebconf -a # use the old file names for now dh_installlogrotate --name=xymon-client -a dh_installinit --name=xymon -p'xymon' -- defaults 98 02 dh_installinit --name=xymon-client -p'xymon-client' -- defaults 98 02 dh_installman -a dh_link -a dh_strip -a dh_compress -a dh_fixperms -a -Xbin/xymonping dh_installdeb -a dh_shlibdeps -a dh_gencontrol -a dh_md5sums -a dh_builddeb -a .PHONY: build clean binary-indep binary-arch binary install install-server install-client xymon-4.3.28/debian/xymon.dirs0000664000076400007640000000011612266740721016476 0ustar rpmbuildrpmbuildetc/apache2/conf.d etc/xymon/graphs.d etc/xymon/xymonserver.d usr/share/xymon xymon-4.3.28/debian/xymon-client.install0000664000076400007640000000004611535424634020461 0ustar rpmbuildrpmbuilddebian/init-common.sh usr/share/xymon xymon-4.3.28/debian/xymon-client.files0000664000076400007640000000063311535424634020117 0ustar rpmbuildrpmbuildusr/share/man/man1/xymon.1 usr/share/man/man1/xymoncmd.1 usr/share/man/man1/xymondigest.1 usr/share/man/man1/xymongrep.1 usr/share/man/man1/xymoncfg.1 usr/share/man/man5/clientlaunch.cfg.5 usr/share/man/man1/clientupdate.1 usr/share/man/man7/xymon.7 usr/share/man/man5/xymonclient.cfg.5 usr/share/man/man8/xymonlaunch.8 usr/share/man/man1/logfetch.1 usr/share/man/man8/msgcache.8 usr/share/man/man1/orcaxymon.1 xymon-4.3.28/debian/xymon.init0000664000076400007640000000434611535462534016512 0ustar rpmbuildrpmbuild#!/bin/sh # Startup script for the Xymon monitor # # This starts the "xymonlaunch" tool, which in turn starts # all of the other Xymon server programs. ### BEGIN INIT INFO # Provides: xymon # Required-Start: $remote_fs $network # Should-Start: $all # Required-Stop: $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Xymon system monitor server # Description: Xymon system monitor, server part. # (Also monitors the local host.) ### END INIT INFO PIDFILE=/var/run/xymon/xymonlaunch.pid DAEMON=/usr/lib/xymon/server/bin/xymonlaunch NAME="xymond" DESC="Xymon Server" test -x $DAEMON || exit 0 . /lib/lsb/init-functions . /usr/share/xymon/init-common.sh # Include xymonclient defaults if available if [ -f /etc/default/xymon-client ] ; then . /etc/default/xymon-client fi case "$1" in "start") create_includefiles log_daemon_msg "Starting $DESC" "$NAME" start-stop-daemon --exec $DAEMON --chuid xymon --umask 022 --start \ -- \ --config=/etc/xymon/tasks.cfg \ --env=/etc/xymon/xymonserver.cfg \ --log=/var/log/xymon/xymonlaunch.log \ --pidfile=$PIDFILE log_end_msg $? ;; "stop") log_daemon_msg "Stopping $DESC" "$NAME" start-stop-daemon --exec $DAEMON --pidfile $PIDFILE --stop --retry 5 log_end_msg $? ;; "status") if test -s $PIDFILE then kill -0 `cat $PIDFILE` if test $? -eq 0 then echo "Xymon (xymonlaunch) running with PID `cat $PIDFILE`" exit 0 else echo "Xymon not running, removing stale PID file" rm -f $PIDFILE exit 1 fi else echo "Xymon (xymonlaunch) does not appear to be running" exit 3 fi ;; "restart") if test -s $PIDFILE then $0 stop sleep 1 $0 start else log_action_msg "xymonlaunch does not appear to be running, starting it" $0 start fi ;; "reload"|"force-reload") if test -s $PIDFILE then create_includefiles log_action_msg "Reloading xymond config" kill -HUP `cat /var/run/xymon/xymond.pid` else log_action_msg "xymond not running (no PID file)" fi ;; "rotate") for PIDFILE in /var/run/xymon/*.pid do test -e $PIDFILE && kill -HUP `cat $PIDFILE` done ;; *) echo "Usage: $0 start|stop|restart|force-reload|reload|status|rotate" break; esac exit 0 xymon-4.3.28/debian/compat0000664000076400007640000000000211535462534015642 0ustar rpmbuildrpmbuild7 xymon-4.3.28/debian/xymon-client.postinst0000664000076400007640000000402411535462534020677 0ustar rpmbuildrpmbuild#! /bin/sh # postinst script for xymon # # see: dh_installdeb(1) # summary of how this script can be called: # * `configure' # * `abort-upgrade' # * `abort-remove' `in-favour' # # * `abort-deconfigure' `in-favour' # `removing' # # for details, see http://www.debian.org/doc/debian-policy/ or # the debian-policy package # . /usr/share/debconf/confmodule set -e case "$1" in configure) getent group xymon > /dev/null || addgroup --system xymon getent passwd xymon > /dev/null || adduser --system \ --home /var/run/xymon --no-create-home \ --ingroup xymon --disabled-password --disabled-login \ --gecos "Xymon System Monitor" xymon test -d /var/run/xymon || mkdir /var/run/xymon chown xymon:xymon /var/run/xymon test -d /var/lib/xymon/tmp || mkdir /var/lib/xymon/tmp chown xymon:xymon /var/lib/xymon/tmp test -d /var/log/xymon || mkdir /var/log/xymon chown xymon:adm /var/log/xymon ; chmod 2755 /var/log/xymon # Do the debconf stuff db_get xymon-client/XYMONSERVERS XYMONSERVERS="$RET" db_get xymon-client/CLIENTHOSTNAME CLIENTHOSTNAME="$RET" db_stop # Update configuration file CONFIGFILE=/etc/default/xymon-client test -e $CONFIGFILE || cp /usr/share/xymon/xymon-client.default $CONFIGFILE if grep -q "^XYMONSERVERS=" $CONFIGFILE ; then sed -i -e "s/^XYMONSERVERS=.*/XYMONSERVERS=\"$XYMONSERVERS\"/" \ $CONFIGFILE else echo "XYMONSERVERS=\"$XYMONSERVERS\"" >> $CONFIGFILE fi if grep -q "^CLIENTHOSTNAME=" $CONFIGFILE ; then sed -i -e "s/^CLIENTHOSTNAME=.*/CLIENTHOSTNAME=\"$CLIENTHOSTNAME\"/" \ $CONFIGFILE else echo "CLIENTHOSTNAME=\"$CLIENTHOSTNAME\"" >> $CONFIGFILE fi ;; abort-upgrade|abort-remove|abort-deconfigure) ;; *) echo "postinst called with unknown argument \`$1'" >&2 exit 1 ;; esac #DEBHELPER# exit 0 xymon-4.3.28/debian/xymon-client.templates0000664000076400007640000000114411535462534021012 0ustar rpmbuildrpmbuildTemplate: xymon-client/XYMONSERVERS Type: string Default: 127.0.0.1 Description: Xymon server: Please enter the network address used to access the Xymon server(s). If you use multiple servers, use a space-separated list of addresses. . Using host names instead of IP addresses is discouraged in case the network experiences DNS failures. Template: xymon-client/CLIENTHOSTNAME Type: string Default: Description: Client hostname: Please enter the host name used by the Xymon client when sending reports to the Xymon server. This name must match the name used in the hosts.cfg file on the Xymon server. xymon-4.3.28/debian/control0000664000076400007640000000313412271200770016036 0ustar rpmbuildrpmbuildSource: xymon Section: net Priority: extra Maintainer: Henrik Stoerner Build-Depends: debhelper (>= 7), libc-ares-dev, librrd2-dev, libssl-dev, libldap2-dev, libpcre3-dev Standards-Version: 3.8.3 Homepage: http://xymon.sourceforge.net/ Package: xymon Architecture: any Conflicts: hobbit, hobbit-client Provides: xymon Replaces: hobbit, hobbit-client Depends: xymon-client, ${shlibs:Depends}, ${misc:Depends} Description: monitoring system for systems, networks and applications Xymon (previously called Hobbit) is a network- and applications- monitoring system designed for use in large-scale networks. But it will also work just fine on a small network with just a few nodes. It is low-overhead and high-performance, with an easy to use web front-end. It handles monitoring of network services, and through client packages it can also be used to monitor server- specific items. Alerts can trigger when monitoring detects a problem, resulting in e-mails or calls to your pager or mobile phone. . Xymon has a great deal of inspiration from the non-free Big Brother package, but does not include any Big Brother code. Package: xymon-client Architecture: any Conflicts: hobbit, hobbit-client Provides: xymon-client Replaces: hobbit, hobbit-client Depends: ${shlibs:Depends}, ${misc:Depends}, adduser, lsb-base Description: client for the Xymon network monitor Client data collection package for Xymon (previously known as Hobbit). This gathers statistics and data from a single system and reports it to the Xymon monitor. You should run this on all systems if you have a Xymon server installed. xymon-4.3.28/debian/xymon.postinst0000664000076400007640000000477012263613525017430 0ustar rpmbuildrpmbuild#! /bin/sh # postinst script for Xymon # # see: dh_installdeb(1) set -e # summary of how this script can be called: # * `configure' # * `abort-upgrade' # * `abort-remove' `in-favour' # # * `abort-deconfigure' `in-favour' # `removing' # # for details, see http://www.debian.org/doc/debian-policy/ or # the debian-policy package case "$1" in configure) # Setup permissions for the newly created "xymon" user to write # data where he needs to. # And for the Apache-run CGI's to generate reports. test -d /var/run/xymon || mkdir /var/run/xymon chown xymon:xymon /var/run/xymon test -d /var/log/xymon || mkdir /var/log/xymon chown xymon:adm /var/log/xymon ; chmod 2755 /var/log/xymon cd /var/lib/xymon; chown xymon:xymon . acks data disabled hist histlogs hostdata logs rrd tmp www cd /var/lib/xymon/www; chown xymon:xymon html notes wml rep snap; chgrp www-data rep snap; chmod g+w rep snap cd /etc/xymon; chgrp www-data critical.cfg critical.cfg.bak; chmod g+w critical.cfg critical.cfg.bak if ! test -e /etc/xymon/hosts.cfg ; then if test -e /etc/default/xymon-client ; then . /etc/default/xymon-client || true fi cat > /etc/xymon/hosts.cfg <&2 exit 1 ;; esac #DEBHELPER# exit 0 xymon-4.3.28/debian/xymon-client.default.dist0000664000076400007640000000115011535424634021376 0ustar rpmbuildrpmbuild# Configure the Xymon client settings. # You MUST set the list of Xymon servers that this # client reports to. # It is good to use IP-adresses here instead of DNS # names - DNS might not work if there's a problem. # (Internally this will be translated to XYMSRV and XYMSERVERS # variables in /var/run/xymon/bbdisp-include.cfg) # # E.g. (a single Xymon server) # XYMONSERVERS="192.168.1.1" # or (multiple servers) # XYMONSERVERS="10.0.0.1 192.168.1.1" XYMONSERVERS="" # Hostname used by the client for its reports. # Must match the name for this host in the Xymon servers' # hosts.cfg file. CLIENTHOSTNAME="" xymon-4.3.28/debian/default0000664000076400007640000000114011535462534016007 0ustar rpmbuildrpmbuild# Configure the Xymon client settings. # You MUST set the list of Xymon servers that this # client reports to. # It is good to use IP-adresses here instead of DNS # names - DNS might not work if there's a problem. # # E.g. (a single Xymon server) # XYMONSERVERS="192.168.1.1" # or (multiple servers) # XYMONSERVERS="10.0.0.1 192.168.1.1" XYMONSERVERS="" # The defaults usually suffice for the rest of this file, # but you can tweak the hostname that the client reports # data with, and the OS name used (typically needed only on # RHEL or RHAS servers). # CLIENTHOSTNAME="" # CLIENTOS="rhel3" xymon-4.3.28/debian/xymon.lintian-overrides0000664000076400007640000000034511535424634021177 0ustar rpmbuildrpmbuildxymon: package-contains-empty-directory usr/lib/xymon/server/download/ #446982 xymon: possibly-insecure-handling-of-tmp-files-in-maintainer-script preinst:30 xymon: setuid-binary usr/lib/xymon/server/bin/xymonping 4755 root/root xymon-4.3.28/debian/xymonserver-setup.sed0000664000076400007640000000031311535424634020674 0ustar rpmbuildrpmbuilds!XYMONSERVERHOSTNAME="localhost"!XYMONSERVERHOSTNAME="$CLIENTHOSTNAME"! s!XYMONSERVERWWWNAME="localhost"!XYMONSERVERWWWNAME="$CLIENTHOSTNAME"! s!XYMONSERVERIP="127.0.0.1"!XYMONSERVERIP="$XYMONSERVERS"! xymon-4.3.28/debian/xymon-client.dirs0000664000076400007640000000016511535462534017757 0ustar rpmbuildrpmbuildetc/default etc/xymon/clientlaunch.d etc/xymon/xymonclient.d usr/bin usr/share/xymon var/lib/xymon/tmp var/log/xymon xymon-4.3.28/debian/xymon.postrm0000664000076400007640000000225111535462534017064 0ustar rpmbuildrpmbuild#! /bin/sh # postrm script for Xymon # # see: dh_installdeb(1) set -e # summary of how this script can be called: # * `remove' # * `purge' # * `upgrade' # * `failed-upgrade' # * `abort-install' # * `abort-install' # * `abort-upgrade' # * `disappear' overwrit>r> # for details, see http://www.debian.org/doc/debian-policy/ or # the debian-policy package case "$1" in purge|disappear) rm -f /etc/xymon/hosts.cfg /etc/xymon/xymongroups /etc/xymon/xymonpasswd \ /etc/default/xymon if test -e /usr/share/debconf/confmodule ; then . /usr/share/debconf/confmodule db_purge fi ;; remove) ;; upgrade) # The server package doesn't use debconf anymore if dpkg --compare-versions "$2" lt 4.2.0.dfsg-2 && test -e /usr/share/debconf/confmodule ; then . /usr/share/debconf/confmodule db_purge fi ;; failed-upgrade|abort-install|abort-upgrade) ;; *) echo "postrm called with unknown argument \`$1'" >&2 exit 1 ;; esac #DEBHELPER# exit 0 xymon-4.3.28/debian/xymon-client.logrotate0000664000076400007640000000044611535424634021017 0ustar rpmbuildrpmbuild# # Logrotate fragment for Xymon (client and server). # /var/log/xymon/*.log { weekly compress delaycompress rotate 5 missingok nocreate sharedscripts postrotate /etc/init.d/xymon rotate endscript } xymon-4.3.28/configure.server0000775000076400007640000003711112674126516016443 0ustar rpmbuildrpmbuild#!/bin/sh # Configure script for Xymon server # $Id: configure.server 7954 2016-03-22 02:26:22Z jccleaver $ echo "" echo "Configuration script for Xymon" echo "" while test "$1" != "" do OPT="$1"; shift case "$OPT" in "--help") cat <&1 | head -n 1 | awk '{print $1 " " $2}'` if test "$MAKEVER" != "GNU Make" then echo "GNU make is required to build Xymon." echo "If it is available as \"gmake\", run configure as: 'MAKE=gmake $0'" exit 1 fi echo "Checking pre-requisites for building Xymon" echo "" . build/fping.sh echo ""; echo "" . build/pcre.sh echo ""; echo "" . build/c-ares.sh echo ""; echo "" . build/rrd.sh if test "$RRDOK" = "NO" then ENABLERRD="n" else ENABLERRD="y" fi echo ""; echo "" . build/ssl.sh if test "$SSLOK" = "NO" then ENABLESSL="n" SSLDEF="" else echo "" echo "Xymon can use the OpenSSL library to test SSL-enabled services" echo "like https-encrypted websites, POP3S, IMAPS, NNTPS and TELNETS." echo "If you have the OpenSSL library installed, I recommend that you enable this." echo "" echo "Do you want to be able to test SSL-enabled services (y) ?" if test "$ENABLESSL" = "" then read ENABLESSL fi if test "$ENABLESSL" = "" -o "$ENABLESSL" = "y" then ENABLESSL="y" SSLDEF="-DHAVE_OPENSSL" if test "$OSSL2OK" = "Y" then SSLDEF="$SSLDEF -DHAVE_SSLV2_SUPPORT=1" fi if test "$OSSL3OK" = "Y" then SSLDEF="$SSLDEF -DHAVE_SSLV3_SUPPORT=1" fi else ENABLESSL="n" SSLDEF="" fi echo "" fi echo ""; echo ""; . build/ldap.sh if test "$LDAPOK" = "NO" then ENABLELDAP="n" LDAPDEF="" else echo "" echo "Xymon can use your $LDAPVENDOR LDAP client library to test LDAP servers." echo "" echo "Do you want to be able to test LDAP servers (y) ?" if test "$ENABLELDAP" = "" then read ENABLELDAP fi if test "$ENABLELDAP" = "" -o "$ENABLELDAP" = "y" then ENABLELDAP="y" LDAPDEF="-DHAVE_LDAP" else ENABLELDAP="n" LDAPDEF="" fi echo "" fi echo ""; echo ""; . build/clock-gettime-librt.sh echo ""; echo "" if test "$SNMP" = "1" then . build/snmp.sh echo ""; echo "" else DOSNMP=no fi MAKE="$MAKE -s" ./build/lfs.sh if test $? -eq 0; then LFS="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" else LFS="" fi echo ""; echo "" # Pre-requisites completed. echo "Setting up for a Xymon server" echo ""; echo "" echo "What userid will be running Xymon [xymon] ?" if test -z "$XYMONUSER" then read XYMONUSER fi if test -z "$XYMONUSER" then XYMONUSER="xymon" fi if test -z "$XYMONTOPDIR" then if test "`uname -s`" = "Darwin" then # Use "dscl" for locating user information. From Isaac Vetter # http://www.xymon.com/archive/2008/02/msg00173.html USERDATA="`dscl . -list /Users | grep $XYMONUSER`" if test "$USERDATA" != "" then echo "Found Directory entry for user: $USERDATA" else echo "FAILURE: The user $XYMONUSER does not exist locally. Create user and try again." exit 1 fi echo ""; echo "" HOMEDIR="`dscl . -read /Users/$XYMONUSER | grep HomeDirectory | awk '{print $2}'`" else USERDATA=`getent passwd $XYMONUSER 2>/dev/null || ypmatch "${XYMONUSER}" passwd || grep "^${XYMONUSER}:" /etc/passwd` if test $? -eq 0 then echo "Found passwd entry for user $USERDATA" else echo "FAILURE: The user $XYMONUSER does not exist. Create user and try again." exit 1 fi echo ""; echo "" HOMEDIR="`echo $USERDATA|cut -d: -f6`" fi else HOMEDIR="$XYMONTOPDIR" fi echo "Where do you want the Xymon installation [${HOMEDIR}] ?" if test -z "$XYMONTOPDIR" then read XYMONTOPDIR fi if test -z "$XYMONTOPDIR" then XYMONTOPDIR=${HOMEDIR} fi if test -d "$XYMONTOPDIR" then echo "OK, will configure to use $XYMONTOPDIR as the Xymon toplevel directory" else echo "WARNING: $XYMONTOPDIR does not exist." fi echo ""; echo "" echo "What URL will you use for the Xymon webpages [/xymon] ? " if test -z "$XYMONHOSTURL" then read XYMONHOSTURL fi if test -z "$XYMONHOSTURL" then XYMONHOSTURL="/xymon" elif test "$XYMONHOSTURL" = "/" then # For Xymon as the root URL, we must clear this setting. # Otherwise, gifs, menus etc stop working because we generate # URL's begining with "//" XYMONHOSTURL="" fi echo ""; echo "" echo "Where to put the Xymon CGI scripts [$XYMONTOPDIR/cgi-bin] ? " echo "(Note: This is the filesystem directory - we will get to the URL shortly)" if test -z "$CGIDIR" then read CGIDIR fi if test -z "$CGIDIR" then CGIDIR=$XYMONTOPDIR/cgi-bin fi echo ""; echo "" echo "What is the URL for the Xymon CGI directory [/xymon-cgi] ? " echo "(Note: This is the URL - NOT the filesystem directory)" if test -z "$XYMONCGIURL" then read XYMONCGIURL fi if test -z "$XYMONCGIURL" then XYMONCGIURL="/xymon-cgi" fi echo ""; echo "" echo "********************** SECURITY NOTICE ****************************" echo "If your Xymon server is accessible by outsiders, then you should" echo "restrict access to the CGI scripts that handle enable/disable of" echo "hosts, and acknowledging of alerts. The easiest way to do this is" echo "to put these in a separate CGI directory and require a password to" echo "access them." echo "Even if your Xymon server is on a secured, internal network, you" echo "may want to have some operations (like disabling a host) be password-" echo "protected - that lets you see who disabled or acknowledged an alert." echo "" echo "Where to put the Xymon Administration CGI scripts [$XYMONTOPDIR/cgi-secure] ? " echo "(Note: This is the filesystem directory - we will get to the URL shortly)" if test -z "$SECURECGIDIR" then read SECURECGIDIR fi if test -z "$SECURECGIDIR" then SECURECGIDIR=$XYMONTOPDIR/cgi-secure fi echo ""; echo "" if test "$CGIDIR" != "$SECURECGIDIR" then echo "What is the URL for the Xymon Administration CGI directory [/xymon-seccgi] ? " echo "(Note: This is the URL - NOT the filesystem directory)" if test -z "$SECUREXYMONCGIURL" then read SECUREXYMONCGIURL fi if test -z "$SECUREXYMONCGIURL" then SECUREXYMONCGIURL="/xymon-seccgi" fi else SECUREXYMONCGIURL="$XYMONCGIURL" fi echo ""; echo "" echo "** Note that you may need to modify your webserver configuration." echo "** After installing, see $XYMONTOPDIR/server/etc/xymon-apache.conf for an example configuration." echo ""; echo "" echo "To generate Xymon availability reports, your webserver" echo "must have write-access to a directory below the Xymon" echo "top-level directory. I can set this up if you tell me" echo "what group-ID your webserver runs with. This is typically" echo "'nobody' or 'apache' or 'www-data'" echo "" echo "What group-ID does your webserver use [nobody] ?" if test -z "$HTTPDGID" then read HTTPDGID fi if test -z "$HTTPDGID" then HTTPDGID="nobody" fi echo ""; echo "" echo "Where to put the Xymon logfiles [/var/log/xymon] ? " if test -z "$XYMONLOGDIR" then read XYMONLOGDIR fi if test -z "$XYMONLOGDIR" then XYMONLOGDIR=/var/log/xymon fi echo ""; echo "" echo "What is the name of this host [`uname -n`] ? " if test -z "$XYMONHOSTNAME" then read XYMONHOSTNAME fi if test -z "$XYMONHOSTNAME" then XYMONHOSTNAME=`uname -n` fi echo ""; echo "" echo "What is the IP-address of this host [127.0.0.1] ? " if test -z "$XYMONHOSTIP" then read XYMONHOSTIP fi if test -z "$XYMONHOSTIP" -o "$XYMONHOSTIP" = "127.0.0.1" then echo "** NOTE: Using 127.0.0.1 (loopback), but it is probably not what you want **" XYMONHOSTIP=127.0.0.1 fi echo ""; echo "" XYMONHOSTOS=`uname -s | tr '[A-Z]' '[a-z]'` if test "$XYMONVAR" = ""; then XYMONVAR=$XYMONTOPDIR/data fi echo "Where should I install the Xymon man-pages (/usr/local/man) ?" if test -z "$MANROOT" then read MANROOT fi if test -z "$MANROOT" then MANROOT=/usr/local/man fi echo ""; echo "" echo "# Toplevel Makefile for Xymon" > Makefile echo "BUILDTOPDIR=\`pwd\`" >>Makefile echo "" >>Makefile echo "# configure settings for Xymon" >>Makefile echo "#" >>Makefile echo "# Toplevel dir" >>Makefile echo "XYMONTOPDIR = $XYMONTOPDIR" >>Makefile echo "# Server data dir for hist/ etc." >>Makefile echo "XYMONVAR = $XYMONVAR" >>Makefile echo "# CGI scripts go in CGIDIR" >>Makefile echo "CGIDIR = $CGIDIR" >>Makefile echo "# Admin CGI scripts go in SECURECGIDIR" >>Makefile echo "SECURECGIDIR = $SECURECGIDIR" >>Makefile echo "# Where to put logfiles" >>Makefile echo "XYMONLOGDIR = $XYMONLOGDIR" >>Makefile echo "# Where to install manpages" >>Makefile echo "MANROOT = $MANROOT" >>Makefile echo "# How to run fping or xymonping" >>Makefile echo "FPING = $FPING" >>Makefile echo "" >>Makefile echo "# Username running Xymon" >>Makefile echo "XYMONUSER = $XYMONUSER" >>Makefile echo "# Xymon server hostname" >>Makefile echo "XYMONHOSTNAME = $XYMONHOSTNAME" >>Makefile echo "# Xymon server IP-address" >>Makefile echo "XYMONHOSTIP = $XYMONHOSTIP" >>Makefile echo "# Xymon server OS" >>Makefile echo "XYMONHOSTOS = $XYMONHOSTOS" >>Makefile echo "" >>Makefile echo "# URL for Xymon webpages" >>Makefile echo "XYMONHOSTURL = $XYMONHOSTURL" >>Makefile echo "# URL for Xymon CGIs" >>Makefile echo "XYMONCGIURL = $XYMONCGIURL" >>Makefile echo "# URL for Xymon Admin CGIs" >>Makefile echo "SECUREXYMONCGIURL = $SECUREXYMONCGIURL" >>Makefile echo "# Webserver group-ID" >>Makefile echo "HTTPDGID=$HTTPDGID" >>Makefile echo "" >>Makefile echo "# C-ARES settings" >>Makefile if test "$CARESOK" = "YES" then echo "SYSTEMCARES = yes" >>Makefile if test "$CARESINC" != ""; then echo "CARESINCDIR = -I$CARESINC" >>Makefile fi if test "$CARESLIB" != ""; then echo "CARESLIBS = -L$LIB -lcares" >>Makefile echo "RPATHVAL += ${LIB}" >>Makefile else echo "CARESLIBS = -lcares" >>Makefile fi else echo "SYSTEMCARES = no" >>Makefile fi echo "" >>Makefile echo "# PCRE settings" >>Makefile if test "$PCREOK" = "YES" then if test "$PCREINC" != ""; then echo "PCREINCDIR = -I$PCREINC" >>Makefile fi if test "$PCRELIB" != ""; then echo "PCRELIBS = -L$PCRELIB -lpcre" >>Makefile echo "RPATHVAL += ${PCRELIB}" >>Makefile else echo "PCRELIBS = -lpcre" >>Makefile fi fi echo "" >>Makefile if test "$ENABLERRD" = "y" then echo "# RRDtool settings" >>Makefile echo "RRDDEF = $RRDDEF" >>Makefile if test "$RRDINC" != ""; then echo "RRDINCDIR = -I$RRDINC" >>Makefile fi if test "$RRDLIB" != ""; then echo "RRDLIBS = -L$RRDLIB -lrrd $PNGLIB" >>Makefile echo "RPATHVAL += ${RRDLIB}" >>Makefile else echo "RRDLIBS = -lrrd $PNGLIB" >>Makefile fi echo "DORRD = yes" >>Makefile fi echo "#" >>Makefile echo "# OpenSSL settings" >>Makefile if test "$ENABLESSL" = "y" then echo "SSLFLAGS = $SSLFLAGS" >>Makefile if test "$OSSLINC" != ""; then echo "SSLINCDIR = -I$OSSLINC" >>Makefile fi if test "$OSSLLIB" != ""; then echo "SSLLIBS = -L$OSSLLIB -lssl -lcrypto" >>Makefile echo "RPATHVAL += ${OSSLLIB}" >>Makefile else echo "SSLLIBS = -lssl -lcrypto" >>Makefile fi echo "DOSSL = yes" >>Makefile fi echo "#" >>Makefile echo "# OpenLDAP settings" >>Makefile echo "LDAPFLAGS = $LDAPDEF" >>Makefile if test "$ENABLELDAP" = "y" then echo if test "$LDAPINC" != ""; then echo "LDAPINCDIR = -I$LDAPINC" >>Makefile fi if test "$LDAPLIB" != ""; then echo "LDAPLIBS = -L$LDAPLIB -lldap $LDAPLBER" >>Makefile echo "RPATHVAL += ${LDAPLIB}" >>Makefile else echo "LDAPLIBS = -lldap $LDAPLBER" >>Makefile fi echo "DOLDAP = yes" >>Makefile fi echo "#" >>Makefile echo "# clock_gettime() settings" >>Makefile echo "LIBRTDEF = $LIBRTDEF" >>Makefile echo "" >>Makefile echo "# Net-SNMP settings" >>Makefile echo "DOSNMP = $DOSNMP" >>Makefile echo "" >>Makefile echo "# Large File Support settings" >>Makefile echo "LFSDEF = $LFS" >>Makefile echo "" >>Makefile if test -r build/Makefile.`uname -s` then echo "include build/Makefile.`uname -s`" >>Makefile echo "" echo "Using `uname -s` Makefile settings" echo "" else echo "include build/Makefile.generic" >>Makefile echo "" echo "Using GENERIC Makefile settings" echo "" echo "If this fails, change the compile settings in Makefile" echo "" echo "I would appreciate it if you send the changes to" echo "xymon-owner@xymon.com so I can include it in the next version." echo "" fi echo "" >>Makefile if test "$INSTALLBINDIR" != ""; then echo "INSTALLBINDIR = $INSTALLBINDIR" >>Makefile fi if test "$INSTALLETCDIR" != ""; then echo "INSTALLETCDIR = $INSTALLETCDIR" >>Makefile fi if test "$INSTALLEXTDIR" != ""; then echo "INSTALLEXTDIR = $INSTALLEXTDIR" >>Makefile fi if test "$INSTALLTMPDIR" != ""; then echo "INSTALLTMPDIR = $INSTALLTMPDIR" >>Makefile fi if test "$INSTALLWEBDIR" != ""; then echo "INSTALLWEBDIR = $INSTALLWEBDIR" >>Makefile fi if test "$INSTALLWWWDIR" != ""; then echo "INSTALLWWWDIR = $INSTALLWWWDIR" >>Makefile fi echo "" >>Makefile echo "# Add local CFLAGS etc. settings here" >>Makefile echo "" >>Makefile echo "include build/Makefile.rules" >> Makefile echo "" >> Makefile echo ""; echo "" echo "Created Makefile with the necessary information to build Xymon" echo "Some defaults are used, so do look at the Makefile before continuing." echo "" echo "Configuration complete - now run $MAKE (GNU make) to build the tools" exit 0 xymon-4.3.28/client/0000775000076400007640000000000013037531515014473 5ustar rpmbuildrpmbuildxymon-4.3.28/client/xymonclient-osf1.sh0000775000076400007640000000325411615341300020244 0ustar rpmbuildrpmbuild#!/bin/sh #----------------------------------------------------------------------------# # OSF1 client for Xymon # # # # Copyright (C) 2005-2011 Henrik Storner # # # # This program is released under the GNU General Public License (GPL), # # version 2. See the file "COPYING" for details. # # # #----------------------------------------------------------------------------# # # $Id: xymonclient-osf1.sh 6712 2011-07-31 21:01:52Z storner $ echo "[date]" date echo "[uname]" uname -a echo "[uptime]" uptime echo "[who]" who echo "[memory]" vmstat -P echo "[swap]" swapon -s echo "[df]" df -t noprocfs | sed -e '/^[^ ][^ ]*$/{ N s/[ ]*\n[ ]*/ / }' echo "[mount]" mount echo "[ifconfig]" ifconfig -a echo "[route]" cat /etc/routes echo "[netstat]" netstat -s echo "[ports]" netstat -an|grep "^tcp" echo "[ps]" ps -ef # $TOP must be set, the install utility should do that for us if it exists. if test "$TOP" != "" then if test -x "$TOP" then echo "[top]" $TOP -b -n 1 fi fi # vmstat nohup sh -c "vmstat 300 2 1>$XYMONTMP/xymon_vmstat.$MACHINEDOTS.$$ 2>&1; mv $XYMONTMP/xymon_vmstat.$MACHINEDOTS.$$ $XYMONTMP/xymon_vmstat.$MACHINEDOTS" /dev/null 2>&1 & sleep 5 if test -f $XYMONTMP/xymon_vmstat.$MACHINEDOTS; then echo "[vmstat]"; cat $XYMONTMP/xymon_vmstat.$MACHINEDOTS; rm -f $XYMONTMP/xymon_vmstat.$MACHINEDOTS; fi exit xymon-4.3.28/client/xymonclient-sco_sv.sh0000775000076400007640000000347111615341300020671 0ustar rpmbuildrpmbuild#!/bin/sh #----------------------------------------------------------------------------# # SCO_SV client for Xymon # # # # Copyright (C) 2005-2011 Henrik Storner # # Copyright (C) 2006 Charles Goyard # # # # This program is released under the GNU General Public License (GPL), # # version 2. See the file "COPYING" for details. # # # #----------------------------------------------------------------------------# # # $Id: xymonclient-sco_sv.sh 6712 2011-07-31 21:01:52Z storner $ echo "[date]" date echo "[uname]" uname -a echo "[uptime]" uptime echo "[who]" who -x echo "[df]" df -Bk echo "[mount]" mount -v echo "[memsize]" /etc/memsize echo "[freemem]" sar -r 1 2 | tail -1 echo "[swap]" swap -l echo "[ifconfig]" ifconfig -a echo "[ifstat]" ifconfig -in echo "[route]" netstat -rn echo "[netstat]" netstat -s echo "[ports]" netstat -an | grep "^tcp" echo "[ps]" ps -A -o pid,ppid,user,stime,s,pri,pcpu,time,vsz,args # $TOP must be set, the install utility should do that for us if it exists. if test "$TOP" != "" then if test -x "$TOP" then echo "[top]" $TOP -b -n 1 fi fi # vmstat nohup sh -c "vmstat 300 2 1>$XYMONTMP/xymon_vmstat.$MACHINEDOTS.$$ 2>&1; mv $XYMONTMP/xymon_vmstat.$MACHINEDOTS.$$ $XYMONTMP/xymon_vmstat.$MACHINEDOTS" /dev/null 2>&1 & sleep 5 if test -f $XYMONTMP/xymon_vmstat.$MACHINEDOTS; then echo "[vmstat]"; cat $XYMONTMP/xymon_vmstat.$MACHINEDOTS; rm -f $XYMONTMP/xymon_vmstat.$MACHINEDOTS; fi exit xymon-4.3.28/client/xymonclient-openbsd.sh0000775000076400007640000000427512611270023021032 0ustar rpmbuildrpmbuild#!/bin/sh #----------------------------------------------------------------------------# # OpenBSD client for Xymon # # # # Copyright (C) 2005-2011 Henrik Storner # # # # This program is released under the GNU General Public License (GPL), # # version 2. See the file "COPYING" for details. # # # #----------------------------------------------------------------------------# # # $Id: xymonclient-openbsd.sh 7707 2015-10-19 22:34:59Z jccleaver $ echo "[date]" date echo "[uname]" uname -a echo "[uptime]" uptime echo "[who]" who echo "[df]" df -k -tnonfs,kernfs,procfs,cd9660 | sed -e '/^[^ ][^ ]*$/{ N s/[ ]*\n[ ]*/ / }' echo "[inode]" df -i -tnonfs,kernfs,procfs,cd9660 | sed -e '/^[^ ][^ ]*$/{ N s/[ ]*\n[ ]*/ / }' | awk ' NR<2{printf "%-20s %10s %10s %10s %10s %s\n", $1, "itotal", $6, $7, $8, $9} NR>=2{printf "%-20s %10d %10d %10d %10s %s\n", $1, $6+$7, $6, $7, $8, $9}' echo "[mount]" mount echo "[meminfo]" $XYMONHOME/bin/openbsd-meminfo echo "[swapctl]" /sbin/swapctl -s echo "[ifconfig]" ifconfig -A echo "[route]" netstat -rn echo "[netstat]" netstat -s echo "[ifstat]" netstat -i -b -n | egrep -v "^lo|$XYMONTMP/xymon_vmstat.$MACHINEDOTS.$$ 2>&1; mv $XYMONTMP/xymon_vmstat.$MACHINEDOTS.$$ $XYMONTMP/xymon_vmstat.$MACHINEDOTS" /dev/null 2>&1 & sleep 5 if test -f $XYMONTMP/xymon_vmstat.$MACHINEDOTS; then echo "[vmstat]"; cat $XYMONTMP/xymon_vmstat.$MACHINEDOTS; rm -f $XYMONTMP/xymon_vmstat.$MACHINEDOTS; fi exit xymon-4.3.28/client/netbsd-meminfo.c0000664000076400007640000000505211615341300017537 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon memory information tool for NetBSD. */ /* This tool retrieves information about the total and free RAM. */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: netbsd-meminfo.c 6712 2011-07-31 21:01:52Z storner $"; #include #include #include #include #include #include #include int main(int argc, char *argv[]) { int hw_physmem[] = { CTL_HW, HW_PHYSMEM64 }; int64 physmem; int hw_pagesize[] = { CTL_HW, HW_PAGESIZE }; int pagesize; int vm_vmtotal[] = { CTL_VM, VM_METER }; struct vmtotal vmdata; size_t len; int result; int swapcount, i; struct swapent *swaplist, *s; unsigned long swaptotal, swapused; len = sizeof(physmem); result = sysctl(hw_physmem, sizeof(hw_physmem) / sizeof(*hw_physmem), &physmem, &len, NULL, 0); if (result != 0) return 1; len = sizeof(pagesize); result = sysctl(hw_pagesize, sizeof(hw_pagesize) / sizeof(*hw_pagesize), &pagesize, &len, NULL, 0); if (result != 0) return 1; len = sizeof(vmdata); result = sysctl(vm_vmtotal, sizeof(vm_vmtotal) / sizeof(*vm_vmtotal), &vmdata, &len, NULL, 0); /* Get swap statistics */ swapcount = swapctl(SWAP_NSWAP, NULL, 0); swaplist = (struct swapent *)malloc(swapcount * sizeof(struct swapent)); result = swapctl(SWAP_STATS, swaplist, swapcount); s = swaplist; swaptotal = swapused = 0; for (i = 0, s = swaplist; (i < swapcount); i++, s++) { if (s->se_flags & SWF_ENABLE) { swaptotal += s->se_nblks; swapused += s->se_inuse; } } free(swaplist); /* swap stats are in disk blocks of 512 bytes, so divide by 2 for KB and 1024 for MB */ swaptotal /= (2*1024); swapused /= (2*1024); // printf("Pagesize:%d\n", pagesize); printf("Total:%d\n", (physmem / (1024 * 1024))); printf("Free:%d\n", (pagesize / 1024)*(vmdata.t_free / 1024)); printf("Swaptotal:%lu\n", swaptotal); printf("Swapused:%lu\n", swapused); return 0; } xymon-4.3.28/client/xymonclient-freebsd.sh0000775000076400007640000000467712634277577021052 0ustar rpmbuildrpmbuild#!/bin/sh # #----------------------------------------------------------------------------# # FreeBSD client for Xymon # # # # Copyright (C) 2005-2011 Henrik Storner # # # # This program is released under the GNU General Public License (GPL), # # version 2. See the file "COPYING" for details. # # # #----------------------------------------------------------------------------# # # $Id: xymonclient-freebsd.sh 7847 2015-12-16 15:13:03Z jccleaver $ echo "[date]" date echo "[uname]" uname -a echo "[uptime]" uptime echo "[who]" who echo "[df]" # The sed stuff is to make sure lines are not split into two. df -H -tnonfs,nullfs,cd9660,procfs,devfs,linprocfs,fdescfs | sed -e '/^[^ ][^ ]*$/{ N s/[ ]*\n[ ]*/ / }' echo "[inode]" # The sed stuff is to make sure lines are not split into two. df -i -tnonfs,nullfs,cd9660,procfs,devfs,linprocfs,fdescfs | sed -e '/^[^ ][^ ]*$/{ N s/[ ]*\n[ ]*/ / }' | awk ' NR<2{printf "%-20s %10s %10s %10s %10s %s\n", $1, "itotal", $6, $7, $8, $9} NR>=2{printf "%-20s %10d %10d %10d %10s %s\n", $1, $6+$7, $6, $7, $8, $9}' echo "[mount]" mount echo "[meminfo]" $XYMONHOME/bin/freebsd-meminfo echo "[swapinfo]" swapinfo -k echo "[vmtotal]" sysctl vm.vmtotal echo "[ifconfig]" ifconfig -a echo "[route]" netstat -rn echo "[ifstat]" netstat -ibnW | egrep "$XYMONTMP/xymon_vmstat.$MACHINEDOTS.$$ 2>&1; mv $XYMONTMP/xymon_vmstat.$MACHINEDOTS.$$ $XYMONTMP/xymon_vmstat.$MACHINEDOTS" /dev/null 2>&1 & sleep 5 if test -f $XYMONTMP/xymon_vmstat.$MACHINEDOTS; then echo "[vmstat]"; cat $XYMONTMP/xymon_vmstat.$MACHINEDOTS; rm -f $XYMONTMP/xymon_vmstat.$MACHINEDOTS; fi exit xymon-4.3.28/client/xymonclient-netbsd.sh0000775000076400007640000000366012611270023020654 0ustar rpmbuildrpmbuild#!/bin/sh #----------------------------------------------------------------------------# # NetBSD client for Xymon # # # # Copyright (C) 2005-2011 Henrik Storner # # # # This program is released under the GNU General Public License (GPL), # # version 2. See the file "COPYING" for details. # # # #----------------------------------------------------------------------------# # # $Id: xymonclient-netbsd.sh 7707 2015-10-19 22:34:59Z jccleaver $ echo "[date]" date echo "[uname]" uname -a echo "[uptime]" uptime echo "[who]" who echo "[df]" df -P -tnonfs,kernfs,procfs,cd9660,null | sed -e '/^[^ ][^ ]*$/{ N s/[ ]*\n[ ]*/ / }' echo "[mount]" mount echo "[meminfo]" $XYMONHOME/bin/netbsd-meminfo echo "[swapctl]" /sbin/swapctl -s echo "[ifconfig]" ifconfig -a echo "[route]" netstat -rn echo "[netstat]" netstat -s echo "[ifstat]" netstat -i -b -n | egrep -v "^lo|$XYMONTMP/xymon_vmstat.$MACHINEDOTS.$$ 2>&1; mv $XYMONTMP/xymon_vmstat.$MACHINEDOTS.$$ $XYMONTMP/xymon_vmstat.$MACHINEDOTS" /dev/null 2>&1 & sleep 5 if test -f $XYMONTMP/xymon_vmstat.$MACHINEDOTS; then echo "[vmstat]"; cat $XYMONTMP/xymon_vmstat.$MACHINEDOTS; rm -f $XYMONTMP/xymon_vmstat.$MACHINEDOTS; fi exit xymon-4.3.28/client/hpux-meminfo.c0000664000076400007640000000244711615341300017251 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon memory information tool for HP-UX. */ /* This tool retrieves information about the total and free RAM. */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: hpux-meminfo.c 6712 2011-07-31 21:01:52Z storner $"; #include #include main(int argc, char *argv[]) { struct pst_static sbuf; struct pst_dynamic dbuf; unsigned long pgsizekb; unsigned long kpages; pstat_getstatic(&sbuf, sizeof(sbuf), 1, 0); pstat_getdynamic(&dbuf, sizeof(dbuf), 1, 0); pgsizekb = sbuf.page_size / 1024; kpages = dbuf.psd_free / 1024; printf("Total:%ld\n", sbuf.physical_memory/256); printf("Free:%lu\n", pgsizekb*kpages); } xymon-4.3.28/client/README-local0000664000076400007640000000116111671476413016451 0ustar rpmbuildrpmbuildThis directory - the client/local/ directory - can be used to install Xymon client add-on scripts. The Xymon client will run all files in this directory that are executable, and include the output from each script in a separate section in the Xymon client message which is sent to the Xymon server. This output will have to be processed on the Xymon server; there is no default processing done by Xymon on the output from these scripts. They are merely added to the client data. If you want to install an add-on script that direcly generates a status column in Xymon, this should go in the client/ext/ directory instead. xymon-4.3.28/client/xymonclient-aix.sh0000775000076400007640000000426012411752470020164 0ustar rpmbuildrpmbuild#!/bin/sh #----------------------------------------------------------------------------# # AIX client for Xymon # # # # Copyright (C) 2005-2011 Henrik Storner # # # # This program is released under the GNU General Public License (GPL), # # version 2. See the file "COPYING" for details. # # # #----------------------------------------------------------------------------# # # $Id: xymonclient-aix.sh 7472 2014-09-28 09:30:32Z storner $ echo "[date]" date echo "[uname]" uname -a echo "[uptime]" uptime echo "[who]" who echo "[df]" # The sed stuff is to make sure lines are not split into two. df -Ik | sed -e '/^[^ ][^ ]*$/{ N s/[ ]*\n[ ]*/ / }' echo "[inode]" /usr/sysv/bin/df -i | sed -e 's!Mount Dir!Mount_Dir!' | awk ' NR<2 { printf "%-20s %10s %10s %10s %10s %s\n", $2, $5, $3, $4, $6, "Mounted on" } NR>=2 && $5>0 { printf "%-20s %10d %10d %10d %10s %s\n", $2, $5, $3, $4, $6, $1} ' echo "[mount]" mount echo "[realmem]" lsattr -El sys0 -a realmem echo "[freemem]" vmstat 1 2 | tail -1 echo "[swap]" lsps -s echo "[ifconfig]" ifconfig -a echo "[route]" netstat -rn echo "[netstat]" netstat -s echo "[ports]" netstat -an | grep "^tcp" echo "[ifstat]" netstat -v echo "[ps]" # I think the -f and -l options are ignored with -o, but this works... ps -A -k -f -l -o pid,ppid,user,stat,pri,pcpu,time,etime,pmem,vsz,args # $TOP must be set, the install utility should do that for us if it exists. if test "$TOP" != "" then if test -x "$TOP" then echo "[top]" $TOP -b 20 fi fi # vmstat nohup sh -c "vmstat 300 1 1>$XYMONTMP/xymon_vmstat.$MACHINEDOTS.$$ 2>&1; mv $XYMONTMP/xymon_vmstat.$MACHINEDOTS.$$ $XYMONTMP/xymon_vmstat.$MACHINEDOTS" /dev/null 2>&1 & sleep 5 if test -f $XYMONTMP/xymon_vmstat.$MACHINEDOTS; then echo "[vmstat]"; cat $XYMONTMP/xymon_vmstat.$MACHINEDOTS; rm -f $XYMONTMP/xymon_vmstat.$MACHINEDOTS; fi exit xymon-4.3.28/client/logfetch.c0000664000076400007640000013441413007426256016443 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon client logfile collection tool. */ /* This tool retrieves data from logfiles. If run continuously, it will pick */ /* out the data stored in the logfile over the past 6 runs (30 minutes with */ /* the default Xymon client polling frequency) and send these data to stdout */ /* for inclusion in the Xymon "client" message. */ /* */ /* Copyright (C) 2006-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: logfetch.c 7982 2016-11-05 19:02:06Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* Some systems do not have the S_ISSOCK macro for stat() */ #ifdef SCO_SV #include #define S_ISSOCK(m) (((m) & S_IFMT) == C_ISSOCK) #endif #include "libxymon.h" /* Set via xgetenv */ static char skiptxt[512]; static char curpostxt[512]; /* Is it ok for these to be hardcoded ? */ #define MAXCHECK 102400U /* When starting, don't look at more than 100 KB of data */ #define MAXMINUTES 30 #define POSCOUNT ((MAXMINUTES / 5) + 1) /* 0 = current run */ #define DEFAULTSCROLLBACK (POSCOUNT - 1) /* How far back to begin processing data, in runs */ #define LINES_AROUND_TRIGGER 5 /* Default = use default */ int scrollback = -1; static int allowexec = 1; typedef enum { C_NONE, C_LOG, C_FILE, C_DIR, C_COUNT } checktype_t; typedef struct logdef_t { #ifdef _LARGEFILE_SOURCE off_t lastpos[POSCOUNT]; off_t maxbytes; #else long lastpos[POSCOUNT]; long maxbytes; #endif char **trigger; int triggercount; char **ignore; int ignorecount; char **deltacountpatterns; char **deltacountnames; int deltacountcount; int *deltacountcounts; } logdef_t; typedef struct filedef_t { int domd5, dosha1, dosha256, dosha512, dosha224, dosha384, dormd160; } filedef_t; typedef struct countdef_t { int patterncount; char **patternnames; char **patterns; int *counts; } countdef_t; typedef struct checkdef_t { char *filename; checktype_t checktype; struct checkdef_t *next; union { logdef_t logcheck; filedef_t filecheck; countdef_t countcheck; } check; } checkdef_t; checkdef_t *checklist = NULL; FILE *fileopen(char *filename, int *err) { /* Open a file */ FILE *fd; #ifdef BIG_SECURITY_HOLE get_root(); #endif fd = fopen(filename, "r"); if (err) *err = errno; #ifdef BIG_SECURITY_HOLE drop_root(); #endif return fd; } /* * A wrapper for fgets() which eats embedded 0x00 characters in the stream. */ char *fgets_nonull(char *buf, size_t size, FILE *stream) { char *in, *out, *end; if (fgets(buf, size - 1, stream) == NULL) return NULL; end = memchr(buf, '\n', size - 1); if (end == NULL) end = buf + (size - 1); else end++; for (in = out = buf; in < end; in++) { if (*in != '\0') *out++ = *in; } *out = '\0'; return buf; } char *logdata(char *filename, logdef_t *logdef) { static char *buf, *replacement = NULL; char *startpos, *fillpos, *triggerstartpos, *triggerendpos, *curpos = NULL; FILE *fd; struct stat st; size_t bytesread, bytesleft; int openerr, i, status, triggerlinecount, done; char *linepos[2*LINES_AROUND_TRIGGER+1]; int lpidx; size_t byteslast, bytestocurrent, bytesin = 0; regex_t *deltaexpr = NULL, *ignexpr = NULL, *trigexpr = NULL; #ifdef _LARGEFILE_SOURCE off_t bufsz; #else long bufsz; #endif char *(*triggerptrs)[2] = NULL; unsigned int triggerptrs_count = 0; dbgprintf("logfetch: -> logdata (%s)\n", filename); if (buf) free(buf); buf = NULL; if (replacement) free(replacement); replacement = NULL; fd = fileopen(filename, &openerr); if (fd == NULL) { buf = (char *)malloc(1024 + strlen(filename)); sprintf(buf, "Cannot open logfile %s : %s\n", filename, strerror(openerr)); return buf; } if (debug) { for (i = 0; (i < POSCOUNT); i++) dbgprintf(" - fn: %s, pos %d, loc %lu\n", filename, i, logdef->lastpos[i]); } /* * See how large the file is, and decide where to start reading. * Save the last POSCOUNT positions so we can scrap 5 minutes of data * from one run to the next. */ fstat(fileno(fd), &st); if ((st.st_size < logdef->lastpos[0]) || (st.st_size < logdef->lastpos[POSCOUNT-1])) { /* * Logfile shrank - probably it was rotated. * Start from beginning of file. */ errprintf("logfetch: File %s shrank from >=%zu to %zu bytes in size. Probably rotated; clearing position state\n", filename, logdef->lastpos[POSCOUNT-1], st.st_size); for (i=0; (i < POSCOUNT); i++) logdef->lastpos[i] = 0; } /* Go to the position we were at scrollback times ago (default corresponds to 6 -- 30 minutes when 5m per run) */ #ifdef _LARGEFILE_SOURCE fseeko(fd, logdef->lastpos[scrollback], SEEK_SET); bufsz = st.st_size - ftello(fd); if (bufsz > MAXCHECK) { /* * Too much data for us. We have to skip some of the old data. */ errprintf("logfetch: %s delta %jd bytes exceeds max buffer size %u; skipping some data\n", filename, (intmax_t)bufsz, MAXCHECK); logdef->lastpos[scrollback] = st.st_size - MAXCHECK; fseeko(fd, logdef->lastpos[scrollback], SEEK_SET); bufsz = st.st_size - ftello(fd); } #else fseek(fd, logdef->lastpos[scrollback], SEEK_SET); bufsz = st.st_size - ftell(fd); if (bufsz > MAXCHECK) { /* * Too much data for us. We have to skip some of the old data. */ errprintf("logfetch: %s delta %zu bytes exceeds max buffer size %u; skipping some data\n", filename, bufsz, MAXCHECK); logdef->lastpos[scrollback] = st.st_size - MAXCHECK; fseek(fd, logdef->lastpos[scrollback], SEEK_SET); bufsz = st.st_size - ftell(fd); } #endif /* Calculate delta between scrollback (where going to start looking at data) and end of the most recent run. * This is where we place our "CURRENT" marker */ byteslast = logdef->lastpos[scrollback]; /* If lastpos[0] is 0, then all of the positions are 0 because we rotated above */ bytestocurrent = logdef->lastpos[0] - byteslast; /* Shift position markers one down for the next round */ /* lastpos[1] is the previous end location, lastpos[0] will be the end of this run */ for (i=POSCOUNT-1; (i > 0); i--) logdef->lastpos[i] = logdef->lastpos[i-1]; logdef->lastpos[0] = st.st_size; dbgprintf("logfetch: Current size (ending): %zu bytes. Last end was %zu. Looking %d spots before that, which is %zu. bytestocurrent: %zu\n", logdef->lastpos[0], logdef->lastpos[1], scrollback, byteslast, bytestocurrent); /* * Get our read buffer. * * NB: fgets() need some extra room in the input buffer. * If it is missing, we will never detect end-of-file * because fgets() will read 0 bytes, but having read that * it still hasnt reached end-of-file status. * At least, on some platforms (Solaris, FreeBSD). */ bufsz += 1023 + strlen(curpostxt); startpos = buf = (char *)malloc(bufsz + 1); if (buf == NULL) { /* Couldnt allocate the buffer */ return "Out of memory"; } /* Compile the regex patterns */ if (logdef->deltacountcount) { int i, realcount = 0; deltaexpr = (regex_t *) malloc(logdef->deltacountcount * sizeof(regex_t)); for (i=0; (i < logdef->deltacountcount); i++) { dbgprintf(" - compiling DELTACOUNT regex: %s\n", logdef->deltacountpatterns[i]); status = regcomp(&deltaexpr[realcount++], logdef->deltacountpatterns[i], REG_EXTENDED|REG_ICASE|REG_NOSUB); if (status != 0) { char regbuf[1000]; regerror(status, &deltaexpr[--realcount], regbuf, sizeof(regbuf)); /* re-decrement realcount here */ errprintf("logfetch: could not compile deltacount regex '%s': %s\n", logdef->deltacountpatterns[i], regbuf); logdef->deltacountpatterns[i] = logdef->deltacountnames[i] = NULL; } } logdef->deltacountcount = realcount; } if (logdef->ignorecount) { int i, realcount = 0; ignexpr = (regex_t *) malloc(logdef->ignorecount * sizeof(regex_t)); for (i=0; (i < logdef->ignorecount); i++) { dbgprintf(" - compiling IGNORE regex: %s\n", logdef->ignore[i]); status = regcomp(&ignexpr[realcount++], logdef->ignore[i], REG_EXTENDED|REG_ICASE|REG_NOSUB); if (status != 0) { char regbuf[1000]; regerror(status, &ignexpr[--realcount], regbuf, sizeof(regbuf)); /* re-decrement realcount here */ errprintf("logfetch: could not compile ignore regex '%s': %s\n", logdef->ignore[i], regbuf); logdef->ignore[i] = NULL; } } logdef->ignorecount = realcount; } if (logdef->triggercount) { int i, realcount = 0; trigexpr = (regex_t *) malloc(logdef->triggercount * sizeof(regex_t)); for (i=0; (i < logdef->triggercount); i++) { dbgprintf(" - compiling TRIGGER regex: %s\n", logdef->trigger[i]); status = regcomp(&trigexpr[realcount++], logdef->trigger[i], REG_EXTENDED|REG_ICASE|REG_NOSUB); if (status != 0) { char regbuf[1000]; regerror(status, &trigexpr[--realcount], regbuf, sizeof(regbuf)); /* re-decrement realcount here */ errprintf("logfetch: could not compile trigger regex '%s': %s\n", logdef->trigger[i], regbuf); logdef->trigger[i] = NULL; } } logdef->triggercount = realcount; } triggerstartpos = triggerendpos = NULL; triggerlinecount = 0; memset(linepos, 0, sizeof(linepos)); lpidx = 0; /* * Read data. * Discard the ignored lines as we go. * Remember the last trigger line we see. */ fillpos = buf; bytesleft = bufsz; done = 0; while (!ferror(fd) && (bytesleft > 0) && !done && (fgets_nonull(fillpos, bytesleft, fd) != NULL)) { int force_trigger = 0; /* Mark where we left off */ bytesin += strlen(fillpos); if (!curpos && (bytesin >= bytestocurrent)) { char *t; dbgprintf(" - Last position was %u, found curpos location at %u in current buffer.\n", logdef->lastpos[1], bytesin); t = strdup(fillpos); /* need shuffle about to insert before this line */ strncpy(fillpos, curpostxt, strlen(curpostxt)); /* add in the CURRENT + \n */ strncpy(fillpos+strlen(curpostxt), t, strlen(t)); /* add in whatever this line originally was */ *(fillpos+strlen(curpostxt)+strlen(t)) = '\0'; /* and terminate it */ xfree(t); /* free temp */ curpos = fillpos; /* leave curpos to the beginning of the CURRENT flag */ force_trigger = 1; /* We'll force this to be saved as a trigger later on, so it always gets printed */ } if (*fillpos == '\0') { /* * fgets() can return an empty buffer without flagging * end-of-file. It should not happen anymore now that * we have extended the buffer to have room for the * terminating \0 byte, but if it does then we will * catch it here. */ dbgprintf(" - empty buffer returned; assuming eof\n"); done = 1; continue; } /* Begin counting lines once we've reached the end of the last run */ if (curpos && logdef->deltacountcount) { int i, match = 0; for (i=0; (i < logdef->deltacountcount); i++) { match = (regexec(&deltaexpr[i], fillpos, 0, NULL, 0) == 0); if (match) { logdef->deltacountcounts[i]++; dbgprintf(" - line matched deltacount %d: %s", i, fillpos); } // fgets stores the newline in } } /* Check ignore pattern */ if (logdef->ignorecount) { int i, match = 0; for (i=0; ((i < logdef->ignorecount) && !match); i++) { match = (regexec(&ignexpr[i], fillpos, 0, NULL, 0) == 0); if (match) dbgprintf(" - line matched ignore %d: %s", i, fillpos); // fgets stores the newline in } if (force_trigger) { /* Oops. We actually wanted this line poked through */ /* At the moment, we're only entering this state when we've added 'CURRENT\n' to the existing line */ /* Since we're guaranteeing to downstream users that we're ignoring this, just truncate the line */ /* to the first newline. If we start using force_trigger for other purposes, we might have to change */ /* the logic here. */ char *eoln; eoln = strchr(fillpos, '\n'); if (eoln) *++eoln = '\0'; // still need the final newline } else if (match) continue; } linepos[lpidx] = fillpos; /* See if this is a trigger line */ if (force_trigger || logdef->triggercount) { int i, match = 0; if (force_trigger) { match = 1; dbgprintf(" - line forced as a trigger: %s", fillpos); } else { for (i=0; ((i < logdef->triggercount) && !match); i++) { match = (regexec(&trigexpr[i], fillpos, 0, NULL, 0) == 0); if (match) dbgprintf(" - line matched trigger %d: %s", i, fillpos); // fgets stores the newline in } } if (match) { int sidx; sidx = lpidx - LINES_AROUND_TRIGGER; if (sidx < 0) sidx += (2*LINES_AROUND_TRIGGER + 1); triggerstartpos = linepos[sidx]; if (!triggerstartpos) triggerstartpos = buf; triggerlinecount = LINES_AROUND_TRIGGER; if (triggerptrs == NULL || (triggerptrs_count > 0 && triggerptrs[triggerptrs_count - 1][1] != NULL)) { dbgprintf(" - %s trigger line encountered; preparing trigger START & END positioning store\n", ((triggerptrs_count == 0) ? "first" : "additional")); /* Create or resize the trigger pointer array to contain another pair of anchors */ triggerptrs = realloc(triggerptrs, (sizeof(char *) * 2) * (++triggerptrs_count)); if (triggerptrs == NULL) return "Out of memory"; /* Save the current triggerstartpos as our first anchor in the pair */ triggerptrs[triggerptrs_count - 1][0] = triggerstartpos; triggerptrs[triggerptrs_count - 1][1] = NULL; if (triggerptrs_count > 1 && (triggerstartpos <= triggerptrs[triggerptrs_count - 2][1])) { /* Whoops! This trigger's LINES_AROUND_TRIGGER bleeds into the prior's LINES_AROUND_TRIGGER */ triggerptrs[triggerptrs_count - 1][0] = triggerptrs[triggerptrs_count - 2][1]; dbgprintf("Current trigger START (w/ prepended LINES_AROUND_TRIGGER) would overlap with prior trigger's END. Adjusting.\n"); } dbgprintf(" - new trigger anchor START position set\n"); } else { /* Do nothing. Merge the two trigger lines into a single start and end pair by extending the existing */ dbgprintf("Additional trigger line encountered. Previous trigger START has no set END yet. Compressing anchors.\n"); } } } /* We want this line */ lpidx = ((lpidx + 1) % (2*LINES_AROUND_TRIGGER+1)); fillpos += strlen(fillpos); /* Save the current end-position if we had a trigger within the past LINES_AFTER_TRIGGER lines */ if (triggerlinecount) { triggerlinecount--; triggerendpos = fillpos; if (triggerlinecount == 0) { /* Terminate the current trigger anchor pair by aligning the end pointer */ dbgprintf(" - trigger END position set\n"); triggerptrs[triggerptrs_count - 1][1] = triggerendpos; } } bytesleft = (bufsz - (fillpos - buf)); // dbgprintf(" -- bytesleft: %zu\n", bytesleft); } if (triggerptrs != NULL) { dbgprintf("Marked %i pairs of START and END anchors for consideration.\n", triggerptrs_count); /* Ensure that a premature EOF before the last trigger end postion doesn't blow up */ if (triggerptrs[triggerptrs_count - 1][1] == NULL) triggerptrs[triggerptrs_count -1][1] = fillpos; } /* Was there an error reading the file? */ if (ferror(fd)) { buf = (char *)malloc(1024 + strlen(filename)); sprintf(buf, "Error while reading logfile %s : %s\n", filename, strerror(errno)); startpos = buf; goto cleanup; } bytesread = (fillpos - startpos); *(buf + bytesread) = '\0'; if (bytesread > logdef->maxbytes) { if (triggerptrs != NULL) { size_t triggerbytes, nontriggerbytes, skiptxtbytes, lasttriggeroffset; char *pos, *lasttriggerptr; size_t size; /* Sum the number of bytes required to hold all the trigger content (start -> end anchors) */ for (i = 0, triggerbytes = 0, skiptxtbytes = 0; i < triggerptrs_count; i++) { triggerbytes += strlen(triggerptrs[i][0]) - strlen(triggerptrs[i][1]); skiptxtbytes += strlen(skiptxt) * 2; } /* Find the remaining bytes allowed for non-trigger content (and prevent size_t underflow wrap ) */ nontriggerbytes = (logdef->maxbytes < triggerbytes) ? 0 : (logdef->maxbytes - triggerbytes); lasttriggerptr = triggerptrs[triggerptrs_count - 1][1]; lasttriggeroffset = (fillpos - lasttriggerptr); dbgprintf("Found %zu bytes of trigger data, %zu bytes available space for non-trigger data; last trigger ended %zu bytes from end. Max bytes allowed is %zu.\n", triggerbytes, nontriggerbytes, lasttriggeroffset, logdef->maxbytes); /* Allocate a new buffer, reduced to what we actually can hold */ replacement = malloc(sizeof(char) * (triggerbytes + skiptxtbytes + nontriggerbytes + 1)); if (replacement == NULL) return "Out of memory"; dbgprintf("Staging replacement buffer, %zu bytes.\n", (triggerbytes + skiptxtbytes + nontriggerbytes)); /* Iterate each trigger anchor pair, copying into the replacement */ for (i = 0, pos = replacement; i < triggerptrs_count; i++) { dbgprintf("Copying buffer content for trigger %i.\n", (i + 1)); strncpy(pos, skiptxt, strlen(skiptxt)); pos += strlen(skiptxt); size = strlen(triggerptrs[i][0]) - strlen(triggerptrs[i][1]); strncpy(pos, triggerptrs[i][0], size); pos += size; } /* At this point, all the required trigger lines are present */ *(pos) = '\0'; if (nontriggerbytes > 0) { char *finalstartptr; /* Append non-trigger, up to the allowed byte size remaining, of remaining log content, starting backwards */ /* Figure out where to start copying from */ finalstartptr = (fillpos - nontriggerbytes); if (finalstartptr < lasttriggerptr) { /* * FIXME: We could have included inter-trigger data here too. * At the moment, duplicate lines are the worse of two evils, so just start from there. */ finalstartptr = lasttriggerptr; nontriggerbytes = (fillpos - finalstartptr); dbgprintf("logfetch: More space was available than between last trigger and eof; reducing to %zu bytes\n", nontriggerbytes); } /* We're already skipping content; so don't send a partial line. Be sure to decrement the subsequent length we feed to strncpy */ while (*(finalstartptr-1) != '\n') { finalstartptr += 1; nontriggerbytes -= 1; } dbgprintf("logfetch: Delta from end of final trigger to beginning of final section: %zu bytes\n", (finalstartptr - lasttriggerptr) ); if (finalstartptr > lasttriggerptr) { /* Add the final skip for completeness */ strncpy(pos, skiptxt, strlen(skiptxt)); pos += strlen(skiptxt); } /* And copy the the rest of the original buffer content */ dbgprintf("Copying %zu final bytes of non-trigger content\n", nontriggerbytes); strncpy(pos, finalstartptr, nontriggerbytes); *(pos + nontriggerbytes) = '\0'; /* re-terminate */ } /* Prune out the last line to prevent sending a partial */ if (*(pos = &replacement[strlen(replacement) - 1]) != '\n') { while (*pos != '\n') { pos -= 1; } *(++pos) = '\0'; } startpos = replacement; bytesread = strlen(startpos); } else { /* Just drop what is too much -- buf+bytesread was terminated above */ startpos += (bytesread - logdef->maxbytes); memcpy(startpos, skiptxt, strlen(skiptxt)); bytesread = logdef->maxbytes; } } /* Avoid sending a '[' as the first char on a line */ { char *p; p = startpos; while (p) { if (*p == '[') *p = '.'; p = strstr(p, "\n["); if (p) p++; } } cleanup: if (fd) fclose(fd); { int i; if (logdef->deltacountcount) { for (i=0; (i < logdef->deltacountcount); i++) { if (logdef->deltacountpatterns[i]) regfree(&deltaexpr[i]); } xfree(deltaexpr); } if (logdef->ignorecount) { for (i=0; (i < logdef->ignorecount); i++) { if (logdef->ignore[i]) regfree(&ignexpr[i]); } xfree(ignexpr); } if (logdef->triggercount) { for (i=0; (i < logdef->triggercount); i++) { if (logdef->trigger[i]) regfree(&trigexpr[i]); } xfree(trigexpr); } if (triggerptrs) xfree(triggerptrs); } if (debug) { for (i = 0; (i < POSCOUNT); i++) dbgprintf(" -- fn: %s, pos %d, loc %lu\n", filename, i, logdef->lastpos[i]); } dbgprintf("logfetch: <- logdata (%s)\n", filename); return startpos; } char *ftypestr(unsigned int mode, char *symlink) { static char *result = NULL; char *s = "unknown"; if (S_ISREG(mode)) s = "file"; if (S_ISDIR(mode)) s = "directory"; if (S_ISCHR(mode)) s = "char-device"; if (S_ISBLK(mode)) s = "block-device"; if (S_ISFIFO(mode)) s = "FIFO"; if (S_ISSOCK(mode)) s = "socket"; if (symlink == NULL) return s; /* Special handling for symlinks */ if (result) free(result); result = (char *)malloc(strlen(s) + strlen(symlink) + 100); sprintf(result, "%s, symlink -> %s", s, symlink); return result; } char *fmodestr(unsigned int mode) { static char modestr[11]; if (S_ISREG(mode)) modestr[0] = '-'; else if (S_ISDIR(mode)) modestr[0] = 'd'; else if (S_ISCHR(mode)) modestr[0] = 'c'; else if (S_ISBLK(mode)) modestr[0] = 'b'; else if (S_ISFIFO(mode)) modestr[0] = 'p'; else if (S_ISLNK(mode)) modestr[0] = 'l'; else if (S_ISSOCK(mode)) modestr[0] = 's'; else modestr[0] = '?'; modestr[1] = ((mode & S_IRUSR) ? 'r' : '-'); modestr[2] = ((mode & S_IWUSR) ? 'w' : '-'); modestr[3] = ((mode & S_IXUSR) ? 'x' : '-'); modestr[4] = ((mode & S_IRGRP) ? 'r' : '-'); modestr[5] = ((mode & S_IWGRP) ? 'w' : '-'); modestr[6] = ((mode & S_IXGRP) ? 'x' : '-'); modestr[7] = ((mode & S_IROTH) ? 'r' : '-'); modestr[8] = ((mode & S_IWOTH) ? 'w' : '-'); modestr[9] = ((mode & S_IXOTH) ? 'x' : '-'); if ((mode & S_ISUID)) modestr[3] = 's'; if ((mode & S_ISGID)) modestr[6] = 's'; modestr[10] = '\0'; return modestr; } char *timestr(time_t tstamp) { static char result[20]; strftime(result, sizeof(result), "%Y/%m/%d-%H:%M:%S", localtime(&tstamp)); return result; } char *filesum(char *fn, char *dtype) { static char *result = NULL; digestctx_t *ctx; FILE *fd; unsigned char buf[8192]; int openerr, buflen; if ((ctx = digest_init(dtype)) == NULL) return ""; fd = fileopen(fn, &openerr); if (fd == NULL) return ""; while ((buflen = fread(buf, 1, sizeof(buf), fd)) > 0) digest_data(ctx, buf, buflen); fclose(fd); if (result) xfree(result); result = strdup(digest_done(ctx)); return result; } void printfiledata(FILE *fd, char *fn, int domd5, int dosha1, int dosha256, int dosha512, int dosha224, int dosha384, int dormd160) { struct stat st; struct passwd *pw; struct group *gr; int staterror; char linknam[PATH_MAX]; time_t now = getcurrenttime(NULL); *linknam = '\0'; staterror = lstat(fn, &st); if ((staterror == 0) && S_ISLNK(st.st_mode)) { int n = readlink(fn, linknam, sizeof(linknam)-1); if (n == -1) n = 0; linknam[n] = '\0'; staterror = stat(fn, &st); } if (staterror == -1) { fprintf(fd, "ERROR: %s\n", strerror(errno)); } else { char *stsizefmt; pw = getpwuid(st.st_uid); gr = getgrgid(st.st_gid); fprintf(fd, "type:%o (%s)\n", (unsigned int)(st.st_mode & S_IFMT), ftypestr(st.st_mode, (*linknam ? linknam : NULL))); fprintf(fd, "mode:%o (%s)\n", (unsigned int)(st.st_mode & (S_ISUID | S_ISGID | S_ISVTX | S_IRWXU | S_IRWXG | S_IRWXO)), fmodestr(st.st_mode)); fprintf(fd, "linkcount:%d\n", (int)st.st_nlink); fprintf(fd, "owner:%u (%s)\n", (unsigned int)st.st_uid, (pw ? pw->pw_name : "")); fprintf(fd, "group:%u (%s)\n", (unsigned int)st.st_gid, (gr ? gr->gr_name : "")); if (sizeof(st.st_size) == sizeof(long long int)) stsizefmt = "size:%lld\n"; else stsizefmt = "size:%ld\n"; fprintf(fd, stsizefmt, st.st_size); fprintf(fd, "clock:%u (%s)\n", (unsigned int)now, timestr(now)); fprintf(fd, "atime:%u (%s)\n", (unsigned int)st.st_atime, timestr(st.st_atime)); fprintf(fd, "ctime:%u (%s)\n", (unsigned int)st.st_ctime, timestr(st.st_ctime)); fprintf(fd, "mtime:%u (%s)\n", (unsigned int)st.st_mtime, timestr(st.st_mtime)); if (S_ISREG(st.st_mode)) { if (domd5) fprintf(fd, "%s\n", filesum(fn, "md5")); else if (dosha1) fprintf(fd, "%s\n", filesum(fn, "sha1")); else if (dosha256) fprintf(fd, "%s\n", filesum(fn, "sha256")); else if (dosha512) fprintf(fd, "%s\n", filesum(fn, "sha512")); else if (dosha224) fprintf(fd, "%s\n", filesum(fn, "sha224")); else if (dosha384) fprintf(fd, "%s\n", filesum(fn, "sha384")); else if (dormd160) fprintf(fd, "%s\n", filesum(fn, "rmd160")); } } fprintf(fd, "\n"); } void printdirdata(FILE *fd, char *fn) { char *ducmd; FILE *cmdfd; char *cmd; char buf[4096]; int buflen; struct stat st; int staterror; ducmd = xgetenv("DU"); staterror = stat(fn, &st); if (staterror == -1) { fprintf(fd, "ERROR: %s\n", strerror(errno)); return; } else if (!S_ISDIR(st.st_mode)) { fprintf(fd, "ERROR: Not a directory\n"); return; } /* Cannot handle filenames with a quote in them (insecure) */ if (strchr(fn, '\'')) return; cmd = (char *)malloc(strlen(ducmd) + strlen(fn) + 10); sprintf(cmd, "%s '%s' 2>&1", ducmd, fn); cmdfd = popen(cmd, "r"); xfree(cmd); if (cmdfd == NULL) return; while ((buflen = fread(buf, 1, sizeof(buf), cmdfd)) > 0) fwrite(buf, 1, buflen, fd); pclose(cmdfd); fprintf(fd, "\n"); } void printcountdata(FILE *fd, checkdef_t *cfg) { int openerr, idx; FILE *logfd; regex_t *exprs; regmatch_t pmatch[1]; int *counts; char l[8192]; logfd = fileopen(cfg->filename, &openerr); if (logfd == NULL) { fprintf(fd, "ERROR: Cannot open file %s: %s\n", cfg->filename, strerror(openerr)); return; } counts = (int *)calloc(cfg->check.countcheck.patterncount, sizeof(int)); exprs = (regex_t *)calloc(cfg->check.countcheck.patterncount, sizeof(regex_t)); for (idx = 0; (idx < cfg->check.countcheck.patterncount); idx++) { int status; status = regcomp(&exprs[idx], cfg->check.countcheck.patterns[idx], REG_EXTENDED|REG_NOSUB); if (status != 0) { /* ... */ }; } while (fgets(l, sizeof(l), logfd)) { for (idx = 0; (idx < cfg->check.countcheck.patterncount); idx++) { if (regexec(&exprs[idx], l, 1, pmatch, 0) == 0) counts[idx] += 1; } } fclose(logfd); for (idx = 0; (idx < cfg->check.countcheck.patterncount); idx++) { fprintf(fd, "%s: %d\n", cfg->check.countcheck.patternnames[idx], counts[idx]); regfree(&exprs[idx]); } free(counts); free(exprs); } int loadconfig(char *cfgfn) { FILE *fd; char l[PATH_MAX + 1024]; checkdef_t *currcfg = NULL; checkdef_t *firstpipeitem = NULL; /* Config items are in the form: * log:filename:maxbytes * ignore ignore-regexp (optional) * trigger trigger-regexp (optional) * deltacount label deltacount-regexp (optional) * * file:filename */ fd = fopen(cfgfn, "r"); if (fd == NULL) return 1; while (fgets(l, sizeof(l), fd) != NULL) { checktype_t checktype; char *bol, *filename; int maxbytes, domd5, dosha1, dosha256, dosha512, dosha224, dosha384, dormd160; { char *p = strchr(l, '\n'); if (p) *p = '\0'; } bol = l + strspn(l, " \t"); if ((*bol == '\0') || (*bol == '#')) continue; if (strncmp(bol, "log:", 4) == 0) checktype = C_LOG; else if (strncmp(bol, "file:", 5) == 0) checktype = C_FILE; else if (strncmp(bol, "dir:", 4) == 0) checktype = C_DIR; else if (strncmp(bol, "linecount:", 10) == 0) checktype = C_COUNT; else checktype = C_NONE; if (checktype != C_NONE) { char *tok; filename = NULL; maxbytes = -1; domd5 = dosha1 = dosha256 = dosha512 = dosha224 = dosha384 = dormd160 = 0; /* Skip the initial keyword token */ tok = strtok(l, ":"); filename = strtok(NULL, ":"); switch (checktype) { case C_LOG: tok = (filename ? strtok(NULL, ":") : NULL); if (tok) maxbytes = atoi(tok); break; case C_FILE: maxbytes = 0; /* Needed to get us into the put-into-list code */ tok = (filename ? strtok(NULL, ":") : NULL); if (tok) { if (strcasecmp(tok, "md5") == 0) domd5 = 1; else if (strcasecmp(tok, "sha1") == 0) dosha1 = 1; else if (strcasecmp(tok, "sha256") == 0) dosha256 = 1; else if (strcasecmp(tok, "sha512") == 0) dosha512 = 1; else if (strcasecmp(tok, "sha224") == 0) dosha224 = 1; else if (strcasecmp(tok, "sha384") == 0) dosha384 = 1; else if (strcasecmp(tok, "rmd160") == 0) dormd160 = 1; } break; case C_DIR: maxbytes = 0; /* Needed to get us into the put-into-list code */ break; case C_COUNT: maxbytes = 0; /* Needed to get us into the put-into-list code */ break; case C_NONE: break; } if ((filename != NULL) && (maxbytes != -1)) { checkdef_t *newitem; firstpipeitem = NULL; if (*filename == '`') { /* Run the command to get filenames */ char *p; char *cmd; FILE *fd = NULL; cmd = filename+1; p = strchr(cmd, '`'); if (p) *p = '\0'; if (allowexec) fd = popen(cmd, "r"); else fprintf(stderr, "logfetch given --noexec option but config told to run command '%s'\n", cmd); if (fd) { char pline[PATH_MAX+1]; while (fgets(pline, sizeof(pline), fd)) { checkdef_t *cwalk = NULL; p = pline + strcspn(pline, "\r\n"); *p = '\0'; for (cwalk = checklist; (cwalk); cwalk = cwalk->next) { if ((cwalk->checktype == checktype) && (strcmp(cwalk->filename, pline) == 0)) { dbgprintf("logfetch: file %s already seen in config; ignoring this entry\n", cwalk->filename); break; } } if (cwalk) continue; newitem = calloc(sizeof(checkdef_t), 1); newitem->checktype = checktype; newitem->filename = strdup(pline); switch (checktype) { case C_LOG: newitem->check.logcheck.maxbytes = maxbytes; break; case C_FILE: newitem->check.filecheck.domd5 = domd5; newitem->check.filecheck.dosha1 = dosha1; newitem->check.filecheck.dosha256 = dosha256; newitem->check.filecheck.dosha512 = dosha512; newitem->check.filecheck.dosha224 = dosha224; newitem->check.filecheck.dosha384 = dosha384; newitem->check.filecheck.dormd160 = dormd160; break; case C_DIR: break; case C_COUNT: newitem->check.countcheck.patterncount = 0; newitem->check.countcheck.patternnames = calloc(1, sizeof(char *)); newitem->check.countcheck.patterns = calloc(1, sizeof(char *)); break; case C_NONE: break; } newitem->next = checklist; checklist = newitem; /* * Since we insert new items at the head of the list, * currcfg points to the first item in the list of * these log configs. firstpipeitem points to the * last item inside the list which is part of this * configuration. */ currcfg = newitem; if (!firstpipeitem) firstpipeitem = newitem; } if (fd) pclose(fd); } } else if (*filename == '<') { /* Resolve the glob to get filenames */ char *p; char *fileglob; glob_t globbuf; int n, i; fileglob = filename+1; p = strchr(fileglob, '>'); if (p) *p = '\0'; dbgprintf(" - searching file glob: %s\n", fileglob); /* Some of these are GNU extensions */ #if !defined(HAVE_GLOB_NOMAGIC) || !defined(HAVE_GLOB_BRACE) n = glob(fileglob, GLOB_MARK | GLOB_NOCHECK , NULL, &globbuf); #else n = glob(fileglob, GLOB_MARK | GLOB_NOCHECK | GLOB_BRACE | GLOB_NOMAGIC , NULL, &globbuf); #endif if (n) errprintf("Error searching glob pattern '%s': %s\n", fileglob, strerror(errno)); else { for (i = 0; (globbuf.gl_pathv[i] && (*(globbuf.gl_pathv[i]))) ; i++) { checkdef_t *cwalk = NULL; dbgprintf(" -- found matching path: %s\n", globbuf.gl_pathv[i]); for (cwalk = checklist; (cwalk); cwalk = cwalk->next) { if ((cwalk->checktype == checktype) && (strcmp(cwalk->filename, globbuf.gl_pathv[i]) == 0)) { dbgprintf("logfetch: file %s already seen in config; ignoring this entry\n", cwalk->filename); break; } } if (cwalk) continue; newitem = calloc(sizeof(checkdef_t), 1); newitem->checktype = checktype; newitem->filename = strdup(globbuf.gl_pathv[i]); switch (checktype) { case C_LOG: newitem->check.logcheck.maxbytes = maxbytes; break; case C_FILE: newitem->check.filecheck.domd5 = domd5; newitem->check.filecheck.dosha1 = dosha1; newitem->check.filecheck.dosha256 = dosha256; newitem->check.filecheck.dosha512 = dosha512; newitem->check.filecheck.dosha224 = dosha224; newitem->check.filecheck.dosha384 = dosha384; newitem->check.filecheck.dormd160 = dormd160; break; case C_DIR: break; case C_COUNT: newitem->check.countcheck.patterncount = 0; newitem->check.countcheck.patternnames = calloc(1, sizeof(char *)); newitem->check.countcheck.patterns = calloc(1, sizeof(char *)); break; case C_NONE: break; } newitem->next = checklist; checklist = newitem; /* * Since we insert new items at the head of the list, * currcfg points to the first item in the list of * these log configs. firstpipeitem points to the * last item inside the list which is part of this * configuration. */ currcfg = newitem; if (!firstpipeitem) firstpipeitem = newitem; } } globfree(&globbuf); } else { checkdef_t *cwalk = NULL; for (cwalk = checklist; (cwalk); cwalk = cwalk->next) { if ((cwalk->checktype == checktype) && (strcmp(cwalk->filename, filename) == 0)) { dbgprintf("logfetch: file %s already seen in config; ignoring this entry\n", cwalk->filename); break; } } if (!cwalk) { newitem = calloc(sizeof(checkdef_t), 1); newitem->filename = strdup(filename); newitem->checktype = checktype; switch (checktype) { case C_LOG: newitem->check.logcheck.maxbytes = maxbytes; break; case C_FILE: newitem->check.filecheck.domd5 = domd5; newitem->check.filecheck.dosha1 = dosha1; newitem->check.filecheck.dosha256 = dosha256; newitem->check.filecheck.dosha512 = dosha512; newitem->check.filecheck.dosha224 = dosha224; newitem->check.filecheck.dosha384 = dosha384; newitem->check.filecheck.dormd160 = dormd160; break; case C_DIR: break; case C_COUNT: newitem->check.countcheck.patterncount = 0; newitem->check.countcheck.patternnames = calloc(1, sizeof(char *)); newitem->check.countcheck.patterns = calloc(1, sizeof(char *)); break; case C_NONE: break; } newitem->next = checklist; checklist = newitem; currcfg = newitem; } } } else { currcfg = NULL; firstpipeitem = NULL; } } else if (currcfg && (currcfg->checktype == C_LOG)) { if (strncmp(bol, "ignore ", 7) == 0) { char *p; p = bol + 7; p += strspn(p, " \t"); if (firstpipeitem) { /* Fill in this ignore expression on all items in this pipe set */ checkdef_t *walk = currcfg; do { walk->check.logcheck.ignorecount++; if (walk->check.logcheck.ignore == NULL) { walk->check.logcheck.ignore = (char **)malloc(sizeof(char *)); } else { walk->check.logcheck.ignore = (char **)realloc(walk->check.logcheck.ignore, walk->check.logcheck.ignorecount * sizeof(char **)); } walk->check.logcheck.ignore[walk->check.logcheck.ignorecount-1] = strdup(p); walk = walk->next; } while (walk && (walk != firstpipeitem->next)); } else { currcfg->check.logcheck.ignorecount++; if (currcfg->check.logcheck.ignore == NULL) { currcfg->check.logcheck.ignore = (char **)malloc(sizeof(char *)); } else { currcfg->check.logcheck.ignore = (char **)realloc(currcfg->check.logcheck.ignore, currcfg->check.logcheck.ignorecount * sizeof(char **)); } currcfg->check.logcheck.ignore[currcfg->check.logcheck.ignorecount-1] = strdup(p); } } else if (strncmp(bol, "trigger ", 8) == 0) { char *p; p = bol + 8; p += strspn(p, " \t"); if (firstpipeitem) { /* Fill in this trigger expression on all items in this pipe set */ checkdef_t *walk = currcfg; do { walk->check.logcheck.triggercount++; if (walk->check.logcheck.trigger == NULL) { walk->check.logcheck.trigger = (char **)malloc(sizeof(char *)); } else { walk->check.logcheck.trigger = (char **)realloc(walk->check.logcheck.trigger, walk->check.logcheck.triggercount * sizeof(char **)); } walk->check.logcheck.trigger[walk->check.logcheck.triggercount-1] = strdup(p); walk = walk->next; } while (walk && (walk != firstpipeitem->next)); } else { currcfg->check.logcheck.triggercount++; if (currcfg->check.logcheck.trigger == NULL) { currcfg->check.logcheck.trigger = (char **)malloc(sizeof(char *)); } else { currcfg->check.logcheck.trigger = (char **)realloc(currcfg->check.logcheck.trigger, currcfg->check.logcheck.triggercount * sizeof(char **)); } currcfg->check.logcheck.trigger[currcfg->check.logcheck.triggercount-1] = strdup(p); } } else if (strncmp(bol, "deltacount ", 11) == 0) { char *p; p = bol + 11; p += strspn(p, " \t"); if (firstpipeitem) { /* Fill in this trigger expression on all items in this pipe set */ checkdef_t *walk = currcfg; char *name, *ptn = NULL; name = strtok(p, " :"); if (name) ptn = strtok(NULL, "\n"); if (name && ptn) { do { walk->check.logcheck.deltacountcount++; walk->check.logcheck.deltacountnames = realloc(walk->check.logcheck.deltacountnames, (walk->check.logcheck.deltacountcount)*sizeof(char *)); walk->check.logcheck.deltacountpatterns = realloc(walk->check.logcheck.deltacountpatterns, (walk->check.logcheck.deltacountcount)*sizeof(char *)); walk->check.logcheck.deltacountnames[walk->check.logcheck.deltacountcount-1] = strdup(name); walk->check.logcheck.deltacountpatterns[walk->check.logcheck.deltacountcount-1] = strdup(ptn); walk = walk->next; } while (walk && (walk != firstpipeitem->next)); /* Initialize buckets since we may not re-walk this later */ if (walk->check.logcheck.deltacountcount) walk->check.logcheck.deltacountcounts = (int *)calloc(walk->check.logcheck.deltacountcount, sizeof(int)); } } else { char *name, *ptn = NULL; name = strtok(p, " :"); if (name) ptn = strtok(NULL, "\n"); if (name && ptn) { currcfg->check.logcheck.deltacountcount++; currcfg->check.logcheck.deltacountnames = realloc(currcfg->check.logcheck.deltacountnames, (currcfg->check.logcheck.deltacountcount)*sizeof(char *)); currcfg->check.logcheck.deltacountpatterns = realloc(currcfg->check.logcheck.deltacountpatterns, (currcfg->check.logcheck.deltacountcount)*sizeof(char *)); currcfg->check.logcheck.deltacountnames[currcfg->check.logcheck.deltacountcount-1] = strdup(name); currcfg->check.logcheck.deltacountpatterns[currcfg->check.logcheck.deltacountcount-1] = strdup(ptn); } /* Initialize buckets since we may not re-walk this later */ if (currcfg->check.logcheck.deltacountcount) currcfg->check.logcheck.deltacountcounts = (int *)calloc(currcfg->check.logcheck.deltacountcount, sizeof(int)); } } } else if (currcfg && (currcfg->checktype == C_FILE)) { /* Nothing */ } else if (currcfg && (currcfg->checktype == C_DIR)) { /* Nothing */ } else if (currcfg && (currcfg->checktype == C_COUNT)) { int idx; char *name, *ptn = NULL; name = strtok(l, " :"); if (name) ptn = strtok(NULL, "\n"); idx = currcfg->check.countcheck.patterncount; if (name && ptn) { currcfg->check.countcheck.patterncount += 1; currcfg->check.countcheck.patternnames = realloc(currcfg->check.countcheck.patternnames, (currcfg->check.countcheck.patterncount+1)*sizeof(char *)); currcfg->check.countcheck.patterns = realloc(currcfg->check.countcheck.patterns, (currcfg->check.countcheck.patterncount+1)*sizeof(char *)); currcfg->check.countcheck.patternnames[idx] = strdup(name); currcfg->check.countcheck.patterns[idx] = strdup(ptn); } } else if (currcfg && (currcfg->checktype == C_NONE)) { /* Nothing */ } else { currcfg = NULL; firstpipeitem = NULL; } } fclose(fd); return 0; } void loadlogstatus(char *statfn) { FILE *fd; char l[PATH_MAX + 1024]; fd = fopen(statfn, "r"); if (!fd) return; while (fgets(l, sizeof(l), fd)) { char *fn, *tok; checkdef_t *walk; int i; tok = strtok(l, ":"); if (!tok) continue; fn = tok; for (walk = checklist; (walk && ((walk->checktype != C_LOG) || (strcmp(walk->filename, fn) != 0))); walk = walk->next) ; if (!walk) continue; for (i=0; (tok && (i < POSCOUNT)); i++) { tok = strtok(NULL, ":\n"); #ifdef _LARGEFILE_SOURCE if (tok) walk->check.logcheck.lastpos[i] = (off_t)str2ll(tok, NULL); #else if (tok) walk->check.logcheck.lastpos[i] = atol(tok); #endif /* Sanity check */ if (walk->check.logcheck.lastpos[i] < 0) walk->check.logcheck.lastpos[i] = 0; } } fclose(fd); } void savelogstatus(char *statfn) { FILE *fd; checkdef_t *walk; fd = fopen(statfn, "w"); if (fd == NULL) return; for (walk = checklist; (walk); walk = walk->next) { int i; char *fmt; if (walk->checktype != C_LOG) continue; if (sizeof(walk->check.logcheck.lastpos[i]) == sizeof(long long int)) fmt = ":%lld"; else fmt = ":%ld"; fprintf(fd, "%s", walk->filename); for (i = 0; (i < POSCOUNT); i++) fprintf(fd, fmt, walk->check.logcheck.lastpos[i]); fprintf(fd, "\n"); } fclose(fd); } int main(int argc, char *argv[]) { char *cfgfn = NULL, *statfn = NULL; int i; checkdef_t *walk; #ifdef BIG_SECURITY_HOLE drop_root(); #else drop_root_and_removesuid(argv[0]); #endif for (i=1; (i 1)) { fprintf(stderr, "Unknown option %s\n", argv[i]); } else { /* Not an option -- should have two arguments left: our config and status file */ if (cfgfn == NULL) cfgfn = argv[i]; else if (statfn == NULL) statfn = argv[i]; else fprintf(stderr, "Unknown argument '%s'\n", argv[i]); } } if (scrollback == -1) { char *p; p = getenv("LOGFETCHSCROLLBACK"); if (!p) p = getenv("LOGFETCH_SCROLLBACK"); /* compat */ if (!p || (strlen(p) == 0) ) scrollback = DEFAULTSCROLLBACK; else { int scroll; scroll = atoi(p); /* Don't use DEFAULTSCROLLBACK here in case we change or lower the default in the future */ if ((scroll < 0) || (scroll > (POSCOUNT-1)) ) { errprintf("Scrollback requested (%d) is greater than max saved (%d)\n", scroll, (POSCOUNT - 1) ); scrollback = DEFAULTSCROLLBACK; } else { dbgprintf("logfetch: setting scrollback to %d\n", scroll); scrollback = scroll; } } } if ((cfgfn == NULL) || (statfn == NULL)) { fprintf(stderr, "Missing config or status file arguments\n"); return 1; } if (loadconfig(cfgfn) != 0) return 1; loadlogstatus(statfn); snprintf(skiptxt, sizeof(skiptxt), "%s\n", xgetenv("LOGFETCHSKIPTEXT")); snprintf(curpostxt, sizeof(curpostxt), "%s\n", xgetenv("LOGFETCHCURRENTTEXT")); for (walk = checklist; (walk); walk = walk->next) { int idx; char *data; checkdef_t *fwalk; switch (walk->checktype) { case C_LOG: data = logdata(walk->filename, &walk->check.logcheck); fprintf(stdout, "[msgs:%s]\n", walk->filename); fprintf(stdout, "%s\n", data); if (walk->check.logcheck.deltacountcount) fprintf(stdout, "[deltacount:%s]\n", walk->filename); for (idx = 0; (idx < walk->check.logcheck.deltacountcount); idx++) { fprintf(stdout, "%s: %d\n", walk->check.logcheck.deltacountnames[idx], walk->check.logcheck.deltacountcounts[idx]); } /* See if there's a special "file:" entry for this logfile */ for (fwalk = checklist; (fwalk && ((fwalk->checktype != C_FILE) || (strcmp(fwalk->filename, walk->filename) != 0))); fwalk = fwalk->next) ; if (fwalk == NULL) { /* No specific file: entry, so make sure the logfile metadata is available */ fprintf(stdout, "[logfile:%s]\n", walk->filename); printfiledata(stdout, walk->filename, 0, 0, 0, 0, 0, 0, 0); } break; case C_FILE: fprintf(stdout, "[file:%s]\n", walk->filename); printfiledata(stdout, walk->filename, walk->check.filecheck.domd5, walk->check.filecheck.dosha1, walk->check.filecheck.dosha256, walk->check.filecheck.dosha512, walk->check.filecheck.dosha224, walk->check.filecheck.dosha384, walk->check.filecheck.dormd160); break; case C_DIR: fprintf(stdout, "[dir:%s]\n", walk->filename); printdirdata(stdout, walk->filename); break; case C_COUNT: fprintf(stdout, "[linecount:%s]\n", walk->filename); printcountdata(stdout, walk); break; case C_NONE: break; } } savelogstatus(statfn); return 0; } xymon-4.3.28/client/mq.sh0000775000076400007640000000152411535424634015455 0ustar rpmbuildrpmbuild#!/bin/sh # Xymon data collector for MQ # # # Collect data from the MQ utility "runmqsc": # - queue depth # - channel status # for all of the queue managers given as parameters. # # Wrap this in a client data message, tagged as # coming from an "mqcollect" client collector. # # Requires Xymon server ver. 4.3.0 # # # Called from xymonlaunch with # # CMD $XYMONHOME/ext/mq.sh QUEUEMGR1 [QUEUEMGR2...] # # where QUEUEMGR* are the names of the queue managers. # # $Id: mq.sh 6648 2011-03-08 13:05:32Z storner $ TMPFILE="$XYMONTMP/mq-$MACHINE.$$" echo "client/mqcollect $MACHINE.mqcollect mqcollect" >$TMPFILE while test "$1" -ne "" do QMGR=$1; shift (echo 'dis ql(*) curdepth'; echo 'dis chs(*)'; echo 'end') | runmqsc $QMGR >> $TMPFILE done $XYMON $XYMSRV "@" < $TMPFILE rm $TMPFILE exit 0 xymon-4.3.28/client/xymonclient.sh0000775000076400007640000000733012651601152017402 0ustar rpmbuildrpmbuild#!/bin/sh #----------------------------------------------------------------------------# # Xymon client main script. # # # # This invokes the OS-specific script to build a client message, and sends # # if off to the Xymon server. # # # # Copyright (C) 2005-2011 Henrik Storner # # # # This program is released under the GNU General Public License (GPL), # # version 2. See the file "COPYING" for details. # # # #----------------------------------------------------------------------------# # # $Id: xymonclient.sh 7878 2016-01-26 05:21:46Z jccleaver $ # Must make sure the commands return standard (english) texts. LANG=C LC_ALL=C LC_MESSAGES=C export LANG LC_ALL LC_MESSAGES if test $# -ge 1; then if test "$1" = "--local"; then LOCALMODE="yes" fi shift fi if test "$XYMONOSSCRIPT" = ""; then XYMONOSSCRIPT="xymonclient-`uname -s | tr '[ABCDEFGHIJKLMNOPQRSTUVWXYZ/]' '[abcdefghijklmnopqrstuvwxyz_]'`.sh" fi MSGFILE="$XYMONTMP/msg.$MACHINEDOTS.txt" MSGTMPFILE="$MSGFILE.$$" if test "$LOCALMODE" = "yes"; then if test -z "$LOCAL_CLIENTCONFIG"; then LOCAL_CLIENTCONFIG="$XYMONHOME/etc/localclient.cfg" fi if test -z "$LOCAL_LOGFETCHCFG"; then LOCAL_LOGFETCHCFG="$XYMONHOME/etc/logfetch.cfg" fi # If not present, fall back to dynamic logfetch location below if test -f "$LOCAL_LOGFETCHCFG"; then LOGFETCHCFG="$LOCAL_LOGFETCHCFG" fi fi if test -z "$LOGFETCHCFG"; then LOGFETCHCFG=$XYMONTMP/logfetch.$MACHINEDOTS.cfg fi if test -z "$LOGFETCHSTATUS"; then LOGFETCHSTATUS=$XYMONTMP/logfetch.$MACHINEDOTS.status fi export LOGFETCHCFG LOGFETCHSTATUS rm -f $MSGTMPFILE touch $MSGTMPFILE CLIENTVERSION="`$XYMONHOME/bin/clientupdate --level`" if test -z "$CLIENTVERSION"; then CLIENTVERSION="`$XYMON --version`" fi if test "$LOCALMODE" = "yes"; then echo "@@client#1|1|127.0.0.1|$MACHINEDOTS|$SERVEROSTYPE" >> $MSGTMPFILE fi echo "client $MACHINE.$SERVEROSTYPE $CONFIGCLASS" >> $MSGTMPFILE $XYMONHOME/bin/$XYMONOSSCRIPT >> $MSGTMPFILE # logfiles if test -f $LOGFETCHCFG then $XYMONHOME/bin/logfetch $LOGFETCHOPTS $LOGFETCHCFG $LOGFETCHSTATUS >>$MSGTMPFILE fi # Client version echo "[clientversion]" >>$MSGTMPFILE echo "$CLIENTVERSION" >> $MSGTMPFILE # See if there are any local add-ons (must do this before checking the clock) if test -d $XYMONHOME/local; then for MODULE in $XYMONHOME/local/* do if test -x $MODULE then echo "[local:`basename $MODULE`]" >>$MSGTMPFILE $MODULE >>$MSGTMPFILE fi done fi # System clock echo "[clock]" >> $MSGTMPFILE $XYMONHOME/bin/logfetch --clock >> $MSGTMPFILE if test "$LOCALMODE" = "yes"; then echo "@@" >> $MSGTMPFILE $XYMONHOME/bin/xymond_client --local $LOCAL_CLIENTOPTS --config=$LOCAL_CLIENTCONFIG <$MSGTMPFILE else $XYMON $XYMSRV "@" < $MSGTMPFILE >$LOGFETCHCFG.tmp if test -f $LOGFETCHCFG.tmp then if test -s $LOGFETCHCFG.tmp then mv $LOGFETCHCFG.tmp $LOGFETCHCFG else rm -f $LOGFETCHCFG.tmp fi fi fi # Save the latest file for debugging. rm -f $MSGFILE mv $MSGTMPFILE $MSGFILE if test "$LOCALMODE" != "yes" -a -f $LOGFETCHCFG; then # Check for client updates SERVERVERSION=`grep "^clientversion:" $LOGFETCHCFG | cut -d: -f2` if test "$SERVERVERSION" != "" -a "$SERVERVERSION" != "$CLIENTVERSION"; then exec $XYMONHOME/bin/clientupdate --update=$SERVERVERSION --reexec fi fi exit 0 xymon-4.3.28/client/msgcache.c0000664000076400007640000003411612603243142016410 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon client message cache. */ /* */ /* This acts as a local network daemon which saves incoming messages in a */ /* memory cache. */ /* */ /* A "pullclient" command receives the cache content in response. */ /* Any data provided in the "pullclient" request is saved, and passed as */ /* response to the first "client" command seen afterwards. */ /* */ /* Copyright (C) 2006-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: msgcache.c 7678 2015-10-01 14:42:42Z jccleaver $"; #include "config.h" #include #include #include #include #include #include #ifdef HAVE_SYS_SELECT_H #include /* Someday I'll move to GNU Autoconf for this ... */ #endif #include #include #include #include #include #include #include #include #include #include #include #include "version.h" #include "libxymon.h" volatile int keeprunning = 1; char *client_response = NULL; /* The latest response to a "client" message */ char *logfile = NULL; int maxage = 600; /* Maximum time we will cache messages */ sender_t *serverlist = NULL; /* Who is allowed to grab our messages */ typedef struct conn_t { time_t tstamp; struct sockaddr_in caddr; enum { C_CLIENT_CLIENT, C_CLIENT_OTHER, C_SERVER } ctype; enum { C_READING, C_WRITING, C_DONE } action; int sockfd; strbuffer_t *msgbuf; int sentbytes; struct conn_t *next; } conn_t; conn_t *chead = NULL; conn_t *ctail = NULL; typedef struct msgqueue_t { time_t tstamp; strbuffer_t *msgbuf; unsigned long sentto; struct msgqueue_t *next; } msgqueue_t; msgqueue_t *qhead = NULL; msgqueue_t *qtail = NULL; void sigmisc_handler(int signum) { switch (signum) { case SIGTERM: errprintf("Caught TERM signal, terminating\n"); keeprunning = 0; break; case SIGHUP: if (logfile) { reopen_file(logfile, "a", stdout); reopen_file(logfile, "a", stderr); errprintf("Caught SIGHUP, reopening logfile\n"); } break; } } void grabdata(conn_t *conn) { int n; char buf[8192]; int pollid = 0; /* Get data from the connection socket - we know there is some */ n = read(conn->sockfd, buf, sizeof(buf)-1); if (n <= -1) { /* Read failure */ errprintf("Connection lost during read: %s\n", strerror(errno)); conn->action = C_DONE; return; } if (n > 0) { /* Got some data - store it */ buf[n] = '\0'; addtobuffer(conn->msgbuf, buf); return; } /* Done reading - process the data */ if (STRBUFLEN(conn->msgbuf) == 0) { /* No data ? We're done */ conn->action = C_DONE; return; } /* * See what kind of message this is. If it's a "pullclient" message, * save the contents of the message - this is the client configuration * that we'll return the next time a client sends us the "client" message. */ if (strncmp(STRBUF(conn->msgbuf), "pullclient", 10) == 0) { char *clientcfg; int idnum; /* Access check */ if (!oksender(serverlist, NULL, conn->caddr.sin_addr, STRBUF(conn->msgbuf))) { errprintf("Rejected pullclient request from %s\n", inet_ntoa(conn->caddr.sin_addr)); conn->action = C_DONE; return; } dbgprintf("Got pullclient request: %s\n", STRBUF(conn->msgbuf)); /* * The pollid is unique for each Xymon server. It is to allow * multiple servers to pick up the same message, for resiliance. */ idnum = atoi(STRBUF(conn->msgbuf) + 10); if ((idnum <= 0) || (idnum > 31)) { pollid = 0; } else { pollid = (1 << idnum); } conn->ctype = C_SERVER; conn->action = C_WRITING; /* Save any client config sent to us */ clientcfg = strchr(STRBUF(conn->msgbuf), '\n'); if (clientcfg) { clientcfg++; if (client_response) xfree(client_response); client_response = strdup(clientcfg); dbgprintf("Saved client response: %s\n", client_response); } } else if (strncmp(STRBUF(conn->msgbuf), "client ", 7) == 0) { /* * Got a "client" message. Return the client-response saved from * earlier, if there is any. If not, then we're done. */ conn->ctype = C_CLIENT_CLIENT; conn->action = (client_response ? C_WRITING : C_DONE); } else { /* Message from a client, but not the "client" message. So no response. */ conn->ctype = C_CLIENT_OTHER; conn->action = C_DONE; } /* * Messages we receive from clients are stored on our outbound queue. * If it's a local "client" message, respond with the queued response * from the Xymon server. Other client messages get no response. * * Server messages get our outbound queue back in response. */ if (conn->ctype != C_SERVER) { /* Messages from clients go on the outbound queue */ msgqueue_t *newq = calloc(1, sizeof(msgqueue_t)); dbgprintf("Queuing outbound message\n"); newq->tstamp = conn->tstamp; newq->msgbuf = conn->msgbuf; conn->msgbuf = NULL; if (qtail) { qtail->next = newq; qtail = newq; } else { qhead = qtail = newq; } if ((conn->ctype == C_CLIENT_CLIENT) && (conn->action == C_WRITING)) { /* Send the response back to the client */ conn->msgbuf = newstrbuffer(0); addtobuffer(conn->msgbuf, client_response); /* * Don't drop the client response data. If for some reason * the "client" request is repeated, he should still get * the right answer that we have. */ } } else { /* A server has asked us for our list of messages */ time_t now = getcurrenttime(NULL); msgqueue_t *mwalk; if (!qhead) { /* No queued messages */ conn->action = C_DONE; } else { /* Build a message of all the queued data */ clearstrbuffer(conn->msgbuf); /* Index line first */ for (mwalk = qhead; (mwalk); mwalk = mwalk->next) { if ((mwalk->sentto & pollid) == 0) { char idx[20]; sprintf(idx, "%d:%ld ", STRBUFLEN(mwalk->msgbuf), (long)(now - mwalk->tstamp)); addtobuffer(conn->msgbuf, idx); } } if (STRBUFLEN(conn->msgbuf) > 0) addtobuffer(conn->msgbuf, "\n"); /* Then the stream of messages */ for (mwalk = qhead; (mwalk); mwalk = mwalk->next) { if ((mwalk->sentto & pollid) == 0) { if (pollid) mwalk->sentto |= pollid; addtostrbuffer(conn->msgbuf, mwalk->msgbuf); } } if (STRBUFLEN(conn->msgbuf) == 0) { /* No data for this server */ conn->action = C_DONE; } } } } void senddata(conn_t *conn) { int n, togo; char *startp; /* Send data on the connection socket */ togo = STRBUFLEN(conn->msgbuf) - conn->sentbytes; startp = STRBUF(conn->msgbuf) + conn->sentbytes; n = write(conn->sockfd, startp, togo); if (n <= -1) { /* Write failure */ errprintf("Connection lost during write to %s\n", inet_ntoa(conn->caddr.sin_addr)); conn->action = C_DONE; } else { conn->sentbytes += n; if (conn->sentbytes == STRBUFLEN(conn->msgbuf)) conn->action = C_DONE; } } int main(int argc, char *argv[]) { int daemonize = 1; int listenq = 10; char *pidfile = "msgcache.pid"; int lsocket; struct sockaddr_in laddr; struct sigaction sa; int opt; /* Don't save the output from errprintf() */ save_errbuf = 0; memset(&laddr, 0, sizeof(laddr)); inet_aton("0.0.0.0", (struct in_addr *) &laddr.sin_addr.s_addr); laddr.sin_port = htons(1984); laddr.sin_family = AF_INET; for (opt=1; (opt < argc); opt++) { if (argnmatch(argv[opt], "--listen=")) { char *locaddr, *p; int locport; locaddr = strchr(argv[opt], '=')+1; p = strchr(locaddr, ':'); if (p) { locport = atoi(p+1); *p = '\0'; } else locport = 1984; memset(&laddr, 0, sizeof(laddr)); laddr.sin_port = htons(locport); laddr.sin_family = AF_INET; if (inet_aton(locaddr, (struct in_addr *) &laddr.sin_addr.s_addr) == 0) { errprintf("Invalid listen address %s\n", locaddr); return 1; } } else if (argnmatch(argv[opt], "--server=")) { /* Who is allowed to fetch cached messages */ char *p = strchr(argv[opt], '='); serverlist = getsenderlist(p+1); } else if (argnmatch(argv[opt], "--max-age=")) { char *p = strchr(argv[opt], '='); maxage = atoi(p+1); } else if (argnmatch(argv[opt], "--lqueue=")) { char *p = strchr(argv[opt], '='); listenq = atoi(p+1); } else if (strcmp(argv[opt], "--daemon") == 0) { daemonize = 1; } else if (strcmp(argv[opt], "--no-daemon") == 0) { daemonize = 0; } else if (argnmatch(argv[opt], "--pidfile=")) { char *p = strchr(argv[opt], '='); pidfile = strdup(p+1); } else if (argnmatch(argv[opt], "--logfile=")) { char *p = strchr(argv[opt], '='); logfile = strdup(p+1); } else if (strcmp(argv[opt], "--debug") == 0) { debug = 1; } else if (strcmp(argv[opt], "--version") == 0) { printf("xymonproxy version %s\n", VERSION); return 0; } } /* Set up a socket to listen for new connections */ lsocket = socket(AF_INET, SOCK_STREAM, 0); if (lsocket == -1) { errprintf("Cannot create listen socket (%s)\n", strerror(errno)); return 1; } opt = 1; setsockopt(lsocket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); fcntl(lsocket, F_SETFL, O_NONBLOCK); if (bind(lsocket, (struct sockaddr *)&laddr, sizeof(laddr)) == -1) { errprintf("Cannot bind to listen socket (%s)\n", strerror(errno)); return 1; } if (listen(lsocket, listenq) == -1) { errprintf("Cannot listen (%s)\n", strerror(errno)); return 1; } /* Redirect logging to the logfile, if requested */ if (logfile) { reopen_file(logfile, "a", stdout); reopen_file(logfile, "a", stderr); } errprintf("Xymon msgcache version %s starting\n", VERSION); errprintf("Listening on %s:%d\n", inet_ntoa(laddr.sin_addr), ntohs(laddr.sin_port)); if (daemonize) { pid_t childpid; reopen_file("/dev/null", "r", stdin); /* Become a daemon */ childpid = fork(); if (childpid < 0) { /* Fork failed */ errprintf("Could not fork\n"); exit(1); } else if (childpid > 0) { /* Parent - save PID and exit */ FILE *fd = fopen(pidfile, "w"); if (fd) { fprintf(fd, "%d\n", (int)childpid); fclose(fd); } exit(0); } /* Child (daemon) continues here */ setsid(); } setup_signalhandler("msgcache"); memset(&sa, 0, sizeof(sa)); sa.sa_handler = sigmisc_handler; sigaction(SIGHUP, &sa, NULL); sigaction(SIGTERM, &sa, NULL); do { fd_set fdread, fdwrite; int maxfd; int n; conn_t *cwalk, *cprev; msgqueue_t *qwalk, *qprev; time_t mintstamp; /* Remove any finished connections */ cwalk = chead; cprev = NULL; while (cwalk) { conn_t *zombie; if (cwalk->action != C_DONE) { cprev = cwalk; cwalk = cwalk->next; continue; } /* Close the socket */ close(cwalk->sockfd); zombie = cwalk; if (cprev == NULL) { chead = zombie->next; cwalk = chead; cprev = NULL; } else { cprev->next = zombie->next; cwalk = zombie->next; } freestrbuffer(zombie->msgbuf); xfree(zombie); } ctail = chead; if (ctail) { while (ctail->next) ctail = ctail->next; } /* Remove expired messages */ qwalk = qhead; qprev = NULL; mintstamp = getcurrenttime(NULL) - maxage; while (qwalk) { msgqueue_t *zombie; if (qwalk->tstamp > mintstamp) { /* Hasn't expired yet */ qprev = qwalk; qwalk = qwalk->next; continue; } zombie = qwalk; if (qprev == NULL) { qhead = zombie->next; qwalk = qhead; qprev = NULL; } else { qprev->next = zombie->next; qwalk = zombie->next; } freestrbuffer(zombie->msgbuf); xfree(zombie); } qtail = qhead; if (qtail) { while (qtail->next) qtail = qtail->next; } /* Now we're ready to handle some data */ FD_ZERO(&fdread); FD_ZERO(&fdwrite); /* Add the listen socket */ FD_SET(lsocket, &fdread); maxfd = lsocket; for (cwalk = chead; (cwalk); cwalk = cwalk->next) { switch (cwalk->action) { case C_READING: FD_SET(cwalk->sockfd, &fdread); if (cwalk->sockfd > maxfd) maxfd = cwalk->sockfd; break; case C_WRITING: FD_SET(cwalk->sockfd, &fdwrite); if (cwalk->sockfd > maxfd) maxfd = cwalk->sockfd; break; case C_DONE: break; } } n = select(maxfd+1, &fdread, &fdwrite, NULL, NULL); if (n < 0) { if (errno == EINTR) continue; errprintf("select failed: %s\n", strerror(errno)); return 0; } if (n == 0) continue; /* Timeout */ for (cwalk = chead; (cwalk); cwalk = cwalk->next) { switch (cwalk->action) { case C_READING: if (FD_ISSET(cwalk->sockfd, &fdread)) grabdata(cwalk); break; case C_WRITING: if (FD_ISSET(cwalk->sockfd, &fdwrite)) senddata(cwalk); break; case C_DONE: break; } } if (FD_ISSET(lsocket, &fdread)) { /* New incoming connection */ conn_t *newconn; int caddrsize; dbgprintf("New connection\n"); newconn = calloc(1, sizeof(conn_t)); caddrsize = sizeof(newconn->caddr); newconn->sockfd = accept(lsocket, (struct sockaddr *)&newconn->caddr, &caddrsize); if (newconn->sockfd == -1) { /* accept() failure. Yes, it does happen! */ dbgprintf("accept failure, ignoring connection (%s)\n", strerror(errno)); xfree(newconn); newconn = NULL; } else { fcntl(newconn->sockfd, F_SETFL, O_NONBLOCK); newconn->action = C_READING; newconn->msgbuf = newstrbuffer(0); newconn->tstamp = getcurrenttime(NULL); } if (newconn) { if (ctail) { ctail->next = newconn; ctail = newconn; } else chead = ctail = newconn; } } } while (keeprunning); if (pidfile) unlink(pidfile); return 0; } xymon-4.3.28/client/runclient.sh0000775000076400007640000001054312652231300017027 0ustar rpmbuildrpmbuild#!/bin/sh #----------------------------------------------------------------------------# # Xymon client bootup script. # # # # This invokes xymonlaunch, which in turn runs the Xymon client and any # # extensions configured. # # # # Copyright (C) 2005-2011 Henrik Storner # # "status" section (C) Scott Smith 2006 # # # # This program is released under the GNU General Public License (GPL), # # version 2. See the file "COPYING" for details. # # # #----------------------------------------------------------------------------# # # $Id: runclient.sh 7884 2016-01-27 21:12:32Z jccleaver $ # Default settings for this client MACHINEDOTS="`uname -n`" # This systems hostname SERVEROSTYPE="`uname -s | tr '[ABCDEFGHIJKLMNOPQRSTUVWXYZ/]' '[abcdefghijklmnopqrstuvwxyz_]'`" # This systems operating system in lowercase XYMONOSSCRIPT="xymonclient-$SERVEROSTYPE.sh" # Command-line mods for the defaults while test "$1" != "" do case "$1" in --hostname=*) MACHINEDOTS="`echo $1 | sed -e 's/--hostname=//'`" ;; --os=*) SERVEROSTYPE="`echo $1 | sed -e 's/--os=//' | tr '[ABCDEFGHIJKLMNOPQRSTUVWXYZ/]' '[abcdefghijklmnopqrstuvwxyz_]'`" ;; --class=*) CONFIGCLASS="`echo $1 | sed -e 's/--class=//' | tr '[ABCDEFGHIJKLMNOPQRSTUVWXYZ/]' '[abcdefghijklmnopqrstuvwxyz_]'`" ;; --help) echo "Usage: $0 [--hostname=CLIENTNAME] [--os=rhel3|linux22] [--class=CLASSNAME] start|stop" exit 0 ;; start) CMD=$1 ;; stop) CMD=$1 ;; restart) CMD=$1 ;; status) CMD=$1 ;; esac shift done XYMONCLIENTHOME="`dirname $0`" if test `echo "$XYMONCLIENTHOME" | grep "^\."` then # no full path, so add current directory to XYMONCLIENTHOME # This may give you "XYMONCLIENTHOME=/usr/local/xymon/./client" - if you # run this script from /usr/local/xymon with "./client/runclient.sh" - # but it works fine. XYMONCLIENTHOME="`pwd`/$XYMONCLIENTHOME" fi export MACHINEDOTS SERVEROSTYPE XYMONOSSCRIPT XYMONCLIENTHOME CONFIGCLASS MACHINE="`echo $MACHINEDOTS | sed -e 's/\./,/g'`" export MACHINE case "$CMD" in "start") if test ! -w $XYMONCLIENTHOME/logs; then echo "Cannot write to the $XYMONCLIENTHOME/logs directory" exit 1 fi if test ! -w $XYMONCLIENTHOME/tmp; then echo "Cannot write to the $XYMONCLIENTHOME/tmp directory" exit 1 fi if test -s $XYMONCLIENTHOME/logs/clientlaunch.$MACHINEDOTS.pid; then echo "Xymon client already running, re-starting it" $0 --hostname="$MACHINEDOTS" stop rm -f $XYMONCLIENTHOME/logs/clientlaunch.$MACHINEDOTS.pid fi $XYMONCLIENTHOME/bin/xymonlaunch --config=$XYMONCLIENTHOME/etc/clientlaunch.cfg --log=$XYMONCLIENTHOME/logs/clientlaunch.log --pidfile=$XYMONCLIENTHOME/logs/clientlaunch.$MACHINEDOTS.pid if test $? -eq 0; then echo "Xymon client for $SERVEROSTYPE started on $MACHINEDOTS" else echo "Xymon client startup failed" fi ;; "stop") if test -s $XYMONCLIENTHOME/logs/clientlaunch.$MACHINEDOTS.pid; then kill `cat $XYMONCLIENTHOME/logs/clientlaunch.$MACHINEDOTS.pid` echo "Xymon client stopped" else echo "Xymon client not running" fi ;; "restart") if test -s $XYMONCLIENTHOME/logs/clientlaunch.$MACHINEDOTS.pid; then $0 --hostname="$MACHINEDOTS" stop else echo "Xymon client not running, continuing to start it" fi $0 --hostname="$MACHINEDOTS" --os="$SERVEROSTYPE" start ;; "status") if test -s $XYMONCLIENTHOME/logs/clientlaunch.$MACHINEDOTS.pid then kill -0 `cat $XYMONCLIENTHOME/logs/clientlaunch.$MACHINEDOTS.pid` if test $? -eq 0 then echo "Xymon client (clientlaunch) running with PID `cat $XYMONCLIENTHOME/logs/clientlaunch.$MACHINEDOTS.pid`" exit 0 else echo "Xymon client not running, removing stale PID file" rm -f $XYMONCLIENTHOME/logs/clientlaunch.$MACHINEDOTS.pid exit 1 fi else echo "Xymon client (clientlaunch) does not appear to be running" exit 3 fi ;; *) echo "Usage: $0 start|stop|restart|status" break; esac exit 0 xymon-4.3.28/client/xymonclient-irix.sh0000775000076400007640000000353012611270023020344 0ustar rpmbuildrpmbuild#!/bin/sh #----------------------------------------------------------------------------# # Irix client for Xymon # # # # Copyright (C) 2005-2011 Henrik Storner # # # # This program is released under the GNU General Public License (GPL), # # version 2. See the file "COPYING" for details. # # # #----------------------------------------------------------------------------# # # $Id: xymonclient-irix.sh 7707 2015-10-19 22:34:59Z jccleaver $ echo "[date]" date echo "[uname]" uname -a echo "[uptime]" uptime echo "[who]" who echo "[df]" df -Plk echo "[mount]" mount echo "[swap]" swap -ln echo "[ifconfig]" ifconfig -a echo "[route]" netstat -rn echo "[netstat]" netstat -s echo "[ports]" netstat -na -f inet -P tcp | tail +3 netstat -na -f inet6 -P tcp | tail +5 echo "[ifstat]" netstat -i -n | egrep -v "^lo|$XYMONTMP/xymon_sar.$MACHINEDOTS.$$ 2>&1; mv $XYMONTMP/xymon_sar.$MACHINEDOTS.$$ $XYMONTMP/xymon_sar.$MACHINEDOTS" /dev/null 2>&1 & sleep 5 if test -f $XYMONTMP/xymon_sar.$MACHINEDOTS; then echo "[sar]"; cat $XYMONTMP/xymon_sar.$MACHINEDOTS; rm -f $XYMONTMP/xymon_sar.$MACHINEDOTS; fi exit xymon-4.3.28/client/clientupdate.c0000664000076400007640000002120112000773065017311 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon client update tool. */ /* */ /* This tool is used to fetch the current client version from the config-file */ /* saved in etc/clientversion.cfg. The client script compares this with the */ /* current version on the server, and if they do not match then this utility */ /* is run to fetch the new version from the server and unpack it via "tar". */ /* */ /* Copyright (C) 2006-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: clientupdate.c 7085 2012-07-16 11:08:37Z storner $"; #include #include #include #include #include #include #include #include #include "libxymon.h" #define CLIENTVERSIONFILE "etc/clientversion.cfg" #define INPROGRESSFILE "tmp/.inprogress.update" void cleanup(char *inprogressfn, char *selffn) { /* Remove temporary- and lock-files */ unlink(inprogressfn); if (selffn) unlink(selffn); } int main(int argc, char *argv[]) { int argi; char *versionfn, *inprogressfn; FILE *versionfd, *tarpipefd; char version[1024]; char *newversion = NULL; char *newverreq; char *updateparam = NULL; int removeself = 0; int talkstat = 0; sendreturn_t *sres; #ifdef BIG_SECURITY_HOLE /* Immediately drop all root privs, we'll regain them later when needed */ drop_root(); #else /* We WILL not run as suid-root. */ drop_root_and_removesuid(argv[0]); #endif versionfn = (char *)malloc(strlen(xgetenv("XYMONHOME")) + strlen(CLIENTVERSIONFILE) + 2); sprintf(versionfn, "%s/%s", xgetenv("XYMONHOME"), CLIENTVERSIONFILE); inprogressfn = (char *)malloc(strlen(xgetenv("XYMONHOME")) + strlen(INPROGRESSFILE) + 2); sprintf(inprogressfn, "%s/%s", xgetenv("XYMONHOME"), INPROGRESSFILE); versionfd = fopen(versionfn, "r"); if (versionfd) { char *p; if (fgets(version, sizeof(version), versionfd) == NULL) *version = '\0'; p = strchr(version, '\n'); if (p) *p = '\0'; fclose(versionfd); } else { *version = '\0'; } if (chdir(xgetenv("XYMONHOME")) != 0) { errprintf("Cannot chdir to XYMONHOME\n"); return 1; } for (argi=1; (argi < argc); argi++) { if (strcmp(argv[argi], "--level") == 0) { /* For checking what version we're at */ printf("%s\n", version); return 0; } else if (strcmp(argv[argi], "--reexec") == 0) { /* * First step of the update procedure. * * To avoid problems with unpacking a new clientupdate * on top of the running one (some tar's will abort * if they try this), copy ourself to a temp. file and * re-exec it to carry out the update. */ char tmpfn[PATH_MAX]; char *srcfn; FILE *tmpfd, *srcfd; unsigned char buf[8192]; long n; struct stat st; int cperr; if (!updateparam) { errprintf("clientupdate --reexec called with no update version\n"); return 1; } if ( (stat(inprogressfn, &st) == 0) && ((getcurrenttime(NULL) - st.st_mtime) < 3600) ) { errprintf("Found update in progress or failed update (started %ld minutes ago)\n", (long) (getcurrenttime(NULL)-st.st_mtime)/60); return 1; } unlink(inprogressfn); tmpfd = fopen(inprogressfn, "w"); if (tmpfd) fclose(tmpfd); /* Copy the executable */ srcfn = argv[0]; srcfd = fopen(srcfn, "r"); cperr = errno; sprintf(tmpfn, "%s/.update.%s.%ld.tmp", xgetenv("XYMONTMP"), xgetenv("MACHINEDOTS"), (long)getcurrenttime(NULL)); dbgprintf("Starting update by copying %s to %s\n", srcfn, tmpfn); unlink(tmpfn); /* To avoid symlink attacks */ if (srcfd) { tmpfd = fopen(tmpfn, "w"); cperr = errno; } if (!srcfd || !tmpfd) { errprintf("Cannot copy executable: %s\n", strerror(cperr)); return 1; } while ((n = fread(buf, 1, sizeof(buf), srcfd)) > 0) fwrite(buf, 1, n, tmpfd); fclose(srcfd); fclose(tmpfd); /* Make sure the temp. binary has execute permissions set */ chmod(tmpfn, S_IRUSR|S_IXUSR|S_IRGRP|S_IXGRP); /* * Set the temp. executable suid-root, and exec() it. * If get_root() fails (because clientupdate was installed * without suid-root privs), just carry on and do what we * can without root privs. (It basically just means that * logfetch() and clientupdate() will continue to run without * root privs). */ #ifdef BIG_SECURITY_HOLE get_root(); chown(tmpfn, 0, getgid()); chmod(tmpfn, S_ISUID|S_IRUSR|S_IXUSR|S_IRGRP|S_IXGRP); drop_root(); #endif /* Run the temp. executable */ dbgprintf("Running command '%s %s ..remove-self'\n", tmpfn, updateparam); execl(tmpfn, tmpfn, updateparam, "--remove-self", (char *)NULL); /* We should never go here */ errprintf("exec() failed to launch update: %s\n", strerror(errno)); return 1; } else if (strncmp(argv[argi], "--update=", 9) == 0) { newversion = strdup(argv[argi]+9); updateparam = argv[argi]; } else if (strcmp(argv[argi], "--remove-self") == 0) { removeself = 1; } else if (strcmp(argv[argi], "--debug") == 0) { debug = 1; } else if (strcmp(argv[argi], "--suid-setup") == 0) { /* * Final step of the update procedure. * * Become root to setup suid-root privs on utils that need it. * Note: If get_root() fails, we're left with normal user privileges. That is * OK, because that is how the client was installed originally, then. */ #ifdef BIG_SECURITY_HOLE get_root(); chown("bin/logfetch", 0, getgid()); chmod("bin/logfetch", S_ISUID|S_IRUSR|S_IXUSR|S_IRGRP|S_IXGRP); drop_root(); #endif return 0; } } if (!newversion) { errprintf("No new version string!\n"); cleanup(inprogressfn, (removeself ? argv[0] : NULL)); return 1; } /* Update to version "newversion" */ dbgprintf("Opening pipe to 'tar'\n"); tarpipefd = popen("tar xf -", "w"); if (tarpipefd == NULL) { errprintf("Cannot launch 'tar xf -': %s\n", strerror(errno)); cleanup(inprogressfn, (removeself ? argv[0] : NULL)); return 1; } sres = newsendreturnbuf(1, tarpipefd); newverreq = (char *)malloc(100+strlen(newversion)); sprintf(newverreq, "download %s.tar", newversion); dbgprintf("Sending command to Xymon: %s\n", newverreq); if ((talkstat = sendmessage(newverreq, NULL, XYMON_TIMEOUT, sres)) != XYMONSEND_OK) { errprintf("Cannot fetch new client tarfile: Status %d\n", talkstat); cleanup(inprogressfn, (removeself ? argv[0] : NULL)); freesendreturnbuf(sres); return 1; } else { dbgprintf("Download command completed OK\n"); freesendreturnbuf(sres); } dbgprintf("Closing tar pipe\n"); if ((talkstat = pclose(tarpipefd)) != 0) { errprintf("Upgrade failed, tar exited with status %d\n", talkstat); cleanup(inprogressfn, (removeself ? argv[0] : NULL)); return 1; } else { dbgprintf("tar pipe exited with status 0 (OK)\n"); } /* Create the new version file */ dbgprintf("Creating new version file %s with version %s\n", versionfn, newversion); unlink(versionfn); versionfd = fopen(versionfn, "w"); if (versionfd) { fprintf(versionfd, "%s", newversion); fclose(versionfd); } else { errprintf("Cannot create version file: %s\n", strerror(errno)); } /* Make sure these have execute permissions */ dbgprintf("Setting execute permissions on xymonclient.sh and clientupdate tools\n"); chmod("bin/xymonclient.sh", S_IRUSR|S_IXUSR|S_IRGRP|S_IXGRP); chmod("bin/clientupdate", S_IRUSR|S_IXUSR|S_IRGRP|S_IXGRP); /* * Become root to setup suid-root privs on the new clientupdate util. * Note: If get_root() fails, we're left with normal user privileges. That is * OK, because that is how the client was installed originally, then. */ #ifdef BIG_SECURITY_HOLE get_root(); chown("bin/clientupdate", 0, getgid()); chmod("bin/clientupdate", S_ISUID|S_IRUSR|S_IXUSR|S_IRGRP|S_IXGRP); drop_root(); #endif dbgprintf("Cleaning up after update\n"); cleanup(inprogressfn, (removeself ? argv[0] : NULL)); /* * Exec the new client-update utility to fix suid-root permissions on * the new files. */ execl("bin/clientupdate", "bin/clientupdate", "--suid-setup", (char *)NULL); /* We should never go here */ errprintf("exec() of clientupdate --suid-setup failed: %s\n", strerror(errno)); return 0; } xymon-4.3.28/client/xymonclient-unixware.sh0000664000076400007640000000357311615341300021237 0ustar rpmbuildrpmbuild#!/bin/sh #----------------------------------------------------------------------------# # SCO Unixware client for Xymon # # # # Copyright (C) 2005-2011 Henrik Storner # # Copyright (C) 2006 Charles Goyard # # Copyright (C) 2009 Buchan Milne # # # # This program is released under the GNU General Public License (GPL), # # version 2. See the file "COPYING" for details. # # # #----------------------------------------------------------------------------# # # $$ echo "[date]" date echo "[uname]" uname -a echo "[uptime]" uptime echo "[who]" who -x echo "[df]" df -P echo "[mount]" mount -v echo "[memsize]" /etc/memsize echo "[freemem]" sar -r 1 2 | tail -1 echo "[swap]" swap -l echo "[ifconfig]" ifconfig -a #echo "[ifstat]" #ifconfig -in echo "[route]" netstat -rn echo "[netstat]" netstat -s echo "[ports]" netstat -an | grep "^tcp" echo "[ps]" #ps -A -o pid,ppid,user,stime,s,pri,pcpu,time,vsz,args ps -A -o pid,ppid,user,pcpu,time,vsz,args # $TOP must be set, the install utility should do that for us if it exists. if test "$TOP" != "" then if test -x "$TOP" then echo "[top]" $TOP -b -n 1 fi fi # vmstat #nohup sh -c "vmstat 300 2 1>$XYMONTMP/xymon_vmstat.$MACHINEDOTS.$$ 2>&1; mv $XYMONTMP/xymon_vmstat.$MACHINEDOTS.$$ $XYMONTMP/xymon_vmstat.$MACHINEDOTS" /dev/null 2>&1 & #sleep 5 #if test -f $XYMONTMP/xymon_vmstat.$MACHINEDOTS; then echo "[vmstat]"; cat $XYMONTMP/xymon_vmstat.$MACHINEDOTS; rm -f $XYMONTMP/xymon_vmstat.$MACHINEDOTS; fi exit xymon-4.3.28/client/xymonclient-darwin.sh0000775000076400007640000000442512611270023020661 0ustar rpmbuildrpmbuild#!/bin/sh # #----------------------------------------------------------------------------# # Darwin (Mac OS X) client for Xymon # # # # Copyright (C) 2005-2011 Henrik Storner # # # # This program is released under the GNU General Public License (GPL), # # version 2. See the file "COPYING" for details. # # # #----------------------------------------------------------------------------# # # $Id: xymonclient-darwin.sh 7707 2015-10-19 22:34:59Z jccleaver $ # Use LANG=C, since some locales have different numeric delimiters # causing the Xymon load-average calculation to fail LANG=C export LANG echo "[date]" date echo "[uname]" uname -a echo "[uptime]" uptime echo "[who]" who FILESYSTEMS=`mount | sed -E '/[\( ](nobrowse|afs|read-only)[ ,\)]/d;s/^.* on (.*) \(.*$/\1/'` echo "[df]" (IFS=$'\n' set $FILESYSTEMS df -P -H $1; shift while test $# -gt 0 do df -P -H $1 | tail -1 | sed 's/\([^ ]\) \([^ ]\)/\1_\2/g' shift done) | column -t -s " " | sed -e 's!Mounted *on!Mounted on!' echo "[inode]" (IFS=$'\n' set $FILESYSTEMS df -P -i $1; shift while test $# -gt 0 do df -P -H $1 | tail -1 | sed 's/\([^0123456789% ]\) \([^ ]\)/\1_\2/g' shift done) | awk ' NR<2{printf "%-20s %10s %10s %10s %10s %s\n", $1, "itotal", $6, $7, $8, $9} (NR>=2 && $6>0) {printf "%-20s %10d %10d %10d %10s %s\n", $1, $6+$7, $6, $7, $8, $9}' echo "[mount]" mount echo "[meminfo]" vm_stat echo "[ifconfig]" ifconfig -a echo "[route]" netstat -rn echo "[netstat]" netstat -s echo "[ifstat]" netstat -ibn | egrep -v "^lo| "$XYMONHOME/etc/logfetch.cfg" ## # # The file defines a series of rules: # UP : Changes the "cpu" status when the system has rebooted recently, # or when it has been running for too long. # LOAD : Changes the "cpu" status according to the system load. # CLOCK : Changes the "cpu" status if the client system clock is # not synchronized with the clock of the Xymon server. # DISK : Changes the "disk" status, depending on the amount of space # used of filesystems. # MEMPHYS: Changes the "memory" status, based on the percentage of real # memory used. # MEMACT : Changes the "memory" status, based on the percentage of "actual" # memory used. Note: Not all systems report an "actual" value. # MEMSWAP: Changes the "memory" status, based on the percentage of swap # space used. # PROC : Changes the "procs" status according to which processes were found # in the "ps" listing from the client. # LOG : Changes the "msgs" status according to entries in text-based logfiles. # Note: The "client-local.cfg" file controls which logfiles the client will report. # FILE : Changes the "files" status according to meta-data for files. # Note: The "client-local.cfg" file controls which files the client will report. # DIR : Changes the "files" status according to the size of a directory. # Note: The "client-local.cfg" file controls which directories the client will report. # PORT : Changes the "ports" status according to which tcp ports were found # in the "netstat" listing from the client. # DEFAULT: Set the default values that apply if no other rules match. # # All rules can be qualified so they apply only to certain hosts, or on certain # times of the day (see below). # # Each type of rule takes a number of parameters: # UP bootlimit toolonglimit # The cpu status goes yellow if the system has been up for less than # "bootlimit" time, or longer than "toolonglimit". The time is in # minutes, or you can add h/d/w for hours/days/weeks - eg. "2h" for # two hours, or "4w" for 4 weeks. # Defaults: bootlimit=1h, toolonglimit=-1 (infinite). # # LOAD warnlevel paniclevel # If the system load exceeds "warnlevel" or "paniclevel", the "cpu" # status will go yellow or red, respectively. These are decimal # numbers. # Defaults: warnlevel=5.0, paniclevel=10.0 # # CLOCK maximum-offset # If the system clock of the client differs from that of the Xymon # server by more than "maximum-offset" seconds, then the CPU status # column will go yellow. Note that the accuracy of this test is limited, # since it is affected by the time it takes a client status report to # go from the client to the Xymon server and be processed. You should # therefore allow for a few seconds (5-10) of slack when you define # your max. offset. # It is not wise to use this test, unless your servers are synchronized # to a common clock, e.g. through NTP. # # DISK filesystem warnlevel paniclevel # DISK filesystem IGNORE # If the utilization of "filesystem" is reported to exceed "warnlevel" # or "paniclevel", the "disk" status will go yellow or red, respectively. # "warnlevel" and "paniclevel" are either the percentage used, or the # space available as reported by the local "df" command on the host. # For the latter type of check, the "warnlevel" must be followed by the # letter "U", e.g. "1024U". # The special keyword "IGNORE" causes this filesystem to be ignored # completely, i.e. it will not appear in the "disk" status column and # it will not be tracked in a graph. This is useful for e.g. removable # devices, backup-disks and similar hardware. # "filesystem" is the mount-point where the filesystem is mounted, e.g. # "/usr" or "/home". A filesystem-name that begins with "%" is interpreted # as a Perl-compatible regular expression; e.g. "%^/oracle.*/" will match # any filesystem whose mountpoint begins with "/oracle". # Defaults: warnlevel=90%, paniclevel=95% # # MEMPHYS warnlevel paniclevel # MEMACT warnlevel paniclevel # MEMSWAP warnlevel paniclevel # If the memory utilization exceeds the "warnlevel" or "paniclevel", the # "memory" status will change to yellow or red, respectively. # Note: The words "PHYS", "ACT" and "SWAP" are also recognized. # Defaults: MEMPHYS warnlevel=100 paniclevel=101 (i.e. it will never go red) # MEMSWAP warnlevel=50 paniclevel=80 # MEMACT warnlevel=90 paniclevel=97 # # PROC processname minimumcount maximumcount color [TRACK=id] [TEXT=displaytext] # The "ps" listing sent by the client will be scanned for how many # processes containing "processname" are running, and this is then # matched against the min/max settings defined here. If the running # count is outside the thresholds, the color of the "procs" status # changes to "color". # To check for a process that must NOT be running: Set minimum and # maximum to 0. # # "processname" can be a simple string, in which case this string must # show up in the "ps" listing as a command. The scanner will find # a ps-listing of e.g. "/usr/sbin/cron" if you only specify "processname" # as "cron". # "processname" can also be a Perl-compatiable regular expression, e.g. # "%java.*inst[0123]" can be used to find entries in the ps-listing for # "java -Xmx512m inst2" and "java -Xmx256 inst3". In that case, # "processname" must begin with "%" followed by the reg.expression. # If "processname" contains whitespace (blanks or TAB), you must enclose # the full string in double quotes - including the "%" if you use regular # expression matching. E.g. # PROC "%xymond_channel --channel=data.*xymond_rrd" 1 1 yellow # or # PROC "java -DCLASSPATH=/opt/java/lib" 2 5 # # You can have multiple "PROC" entries for the same host, all of the # checks are merged into the "procs" status and the most severe # check defines the color of the status. # # The TRACK=id option causes the number of processes found to be recorded # in an RRD file, with "id" as part of the filename. This graph will then # appear on the "procs" page as well as on the "trends" page. Note that # "id" must be unique among the processes tracked for each host. # # The TEXT=displaytext option affects how the process appears on the # "procs" status page. By default, the process is listed with the # "processname" as identification, but if this is a regular expression # it may be a bit difficult to understand. You can then use e.g. # "TEXT=Apache" to make these processes appear with the name "Apache" # instead. # # Defaults: mincount=1, maxcount=-1 (unlimited), color="red". # Note: No processes are checked by default. # # Example: Check that "cron" is running: # PROC cron # Example: Check that at least 5 "httpd" processes are running, but # not more than 20: # PROC httpd 5 20 # # LOG filename match-pattern [COLOR=color] [IGNORE=ignore-pattern] [TEXT=displaytext] # In the "client-local.cfg" file, you can list any number of files # that the client will collect log data from. These are sent to the # Xymon server together with the other client data, and you can then # choose how to analyze the log data with LOG entries. # # ************ IMPORTANT *************** # To monitor a logfile, you *MUST* configure both client-local.cfg # and analysis.cfg. If you configure only the client-local.cfg # file, the client will collect the log data and you can view it in # the "client data" display, but it will not affect the color of the # "msgs" status. On the other hand, if you configure only the # analysis.cfg file, then there will be no log data to inspect, # and you will not see any updates of the "msgs" status either. # # "filename" is a filename or pattern. The set of files reported by # the client is matched against "filename", and if they match then # this LOG entry is processed against the data from a file. # # "match-pattern": The log data is matched against this pattern. If # there is a match, this log file causes a status change to "color". # # "ignore-pattern": The log data that matched "match-pattern" is also # matched against "ignore-pattern". If the data matches the "ignore-pattern", # this line of data does not affect the status color. In other words, # the "ignore-pattern" can be used to refine the strings which cause # a match. # Note: The "ignore-pattern" is optional. # # "color": The color which this match will trigger. # Note: "color" is optional, if omitted then "red" will be used. # # Example: Go yellow if the text "WARNING" shows up in any logfile. # LOG %.* WARNING COLOR=yellow # # Example: Go red if the text "I/O error" or "read error" appears. # LOG %/var/(adm|log)/messages %(I/O|read).error COLOR=red # # FILE filename [color] [things to check] [TRACK] # NB: The files you wish to monitor must be listed in a "file:..." # entry in the client-local.cfg file, in order for the client to # report any data about them. # # "filename" is a filename or pattern. The set of files reported by # the client is matched against "filename", and if they match then # this FILE entry is processed against the data from that file. # # [things to check] can be one or more of the following: # - "NOEXIST" triggers a warning if the file exists. By default, # a warning is triggered for files that have a FILE entry, but # which do not exist. # - "TYPE=type" where "type" is one of "file", "dir", "char", "block", # "fifo", or "socket". Triggers warning if the file is not of the # specified type. # - "OWNERID=owner" and "GROUPID=group" triggers a warning if the owner # or group does not match what is listed here. "owner" and "group" is # specified either with the numeric uid/gid, or the user/group name. # - "MODE=mode" triggers a warning if the file permissions are not # as listed. "mode" is written in the standard octal notation, e.g. # "644" for the rw-r--r-- permissions. # - "SIZEmin.size" triggers a warning it the file # size is greater than "max.size" or less than "min.size", respectively. # You can append "K" (KB), "M" (MB), "G" (GB) or "T" (TB) to the size. # If there is no such modifier, KB is assumed. # E.g. to warn if a file grows larger than 1MB (1024 KB): "SIZE<1M". # - "SIZE=size" triggers a warning it the file size is not what is listed. # - "MTIME>min.mtime" and "MTIME86400". # - "MTIME=timestamp" checks if a file was last modified at "timestamp". # "timestamp" is a unix epoch time (seconds since midnight Jan 1 1970 UTC). # - "CTIME>min.ctime", "CTIME0 MTIME<600 yellow # # Example: Check the timestamp, size and SHA-1 hash of the /bin/sh program: # FILE /bin/sh MTIME=1128514608 SIZE=645140 SHA1=5bd81afecf0eb93849a2fd9df54e8bcbe3fefd72 # # DIR directory [color] [SIZEminsize] [TRACK] # NB: The directories you wish to monitor must be listed in a "dir:..." # entry in the client-local.cfg file, in order for the client to # report any data about them. # # "directory" is a filename or pattern. The set of directories reported by # the client is matched against "directory", and if they match then # this DIR entry is processed against the data for that directory. # # "SIZEminsize" defines the size limits that the # directory must stay within. If it goes outside these limits, a warning # will trigger. Note the Xymon uses the raw number reported by the # local "du" command on the client. This is commonly KB, but it may be # disk blocks which are often 512 bytes. # # "TRACK" causes the size of this directory to be tracked in an RRD file, # and shown on the graph on the "files" display. # # PORT [LOCAL=addr] [EXLOCAL=addr] [REMOTE=addr] [EXREMOTE=addr] [STATE=state] [EXSTATE=state] [min=mincount] [max=maxcount] [col=color] [TRACK=id] [TEXT=displaytext] # The "netstat" listing sent by the client will be scanned for how many # sockets match the criteria listed. # "addr" is a (partial) address specification in the format used on # the output from netstat. This is typically "10.0.0.1:80" for the IP # 10.0.0.1, port 80. Or "*:80" for any local address, port 80. # NB: The Xymon clients normally report only the numeric data for # IP-addresses and port-numbers, so you must specify the port # number (e.g. "80") instead of the service name ("www"). # "state" causes only the sockets in the specified state to be included; # it is usually LISTEN or ESTABLISHED. # The socket count is then matched against the min/max settings defined # here. If the count is outside the thresholds, the color of the "ports" # status changes to "color". # To check for a socket that must NOT exist: Set minimum and # maximum to 0. # # "addr" and "state" can be a simple strings, in which case these string must # show up in the "netstat" at the appropriate column. # "addr" and "state" can also be a Perl-compatiable regular expression, e.g. # "LOCAL=%(:80|:443)" can be used to find entries in the netstat local port for # both http (port 80) and https (port 443). In that case, portname or state must # begin with "%" followed by the reg.expression. # # The TRACK=id option causes the number of sockets found to be recorded # in an RRD file, with "id" as part of the filename. This graph will then # appear on the "ports" page as well as on the "trends" page. Note that # "id" must be unique among the ports tracked for each host. # # The TEXT=displaytext option affects how the port appears on the # "ports" status page. By default, the port is listed with the # local/remote/state rules as identification, but this may be somewhat # difficult to understand. You can then use e.g. "TEXT=Secure Shell" to make # these ports appear with the name "Secure Shell" instead. # # Defaults: state="LISTEN", mincount=1, maxcount=-1 (unlimited), color="red". # Note: No ports are checked by default. # # Example: Check that there is someone listening on the https port: # PORT "LOCAL=%([.:]443)$" state=LISTEN TEXT=https # # Example: Check that at least 5 "ssh" connections are established, but # not more than 10; warn but do not error; graph the connection count: # PORT "LOCAL=%([.:]22)$" state=ESTABLISHED min=5 max=20 color=yellow TRACK=ssh "TEXT=SSH logins" # # Example: Check that ONLY ports 22, 80 and 443 are open for incoming connections: # PORT STATE=LISTEN LOCAL=%0.0.0.0[.:].* EXLOCAL=%[.:](22|80|443)$ MAX=0 "TEXT=Bad listeners" # # # To apply rules to specific hosts, you can use the "HOST=", "EXHOST=", "PAGE=" # "EXPAGE=", "CLASS=" or "EXCLASS=" qualifiers. (These act just as in the # alerts.cfg file). # # Hostnames are either a comma-separated list of hostnames (from the hosts.cfg file), # "*" to indicate "all hosts", or a Perl-compatible regular expression. # E.g. "HOST=dns.foo.com,www.foo.com" identifies two specific hosts; # "HOST=%www.*.foo.com EXHOST=www-test.foo.com" matches all hosts with a name # beginning with "www", except the "www-test" host. # "PAGE" and "EXPAGE" match the hostnames against the page on where they are # located in the hosts.cfg file, via the hosts' page/subpage/subparent # directives. This can be convenient to pick out all hosts on a specific page. # # Rules can be dependent on time-of-day, using the standard Xymon syntax # (the hosts.cfg(5) about the NKTIME parameter). E.g. "TIME=W:0800:2200" # applied to a rule will make this rule active only on week-days between # 8AM and 10PM. # # You can also associate a GROUP id with a rule. The group-id is passed to # the alert module, which can then use it to control who gets an alert when # a failure occurs. E.g. the following associates the "httpd" process check # with the "web" group, and the "sshd" check with the "admins" group: # PROC httpd 5 GROUP=web # PROC sshd 1 GROUP=admins # In the alerts.cfg file, you could then have rules like # GROUP=web # MAIL webmaster@foo.com # GROUP=admins # MAIL root@foo.com # # Qualifiers must be placed after each rule, e.g. # LOAD 8.0 12.0 HOST=db.foo.com TIME=*:0800:1600 # # If you have multiple rules that you want to apply the same qualifiers to, # you can write the qualifiers *only* on one line, followed by the rules. E.g. # HOST=%db.*.foo.com TIME=W:0800:1600 # LOAD 8.0 12.0 # DISK /db 98 100 # PROC mysqld 1 # will apply the three rules to all of the "db" hosts on week-days between 8AM # and 4PM. This can be combined with per-rule qualifiers, in which case the # per-rule qualifier overrides the general qualifier; e.g. # HOST=%.*.foo.com # LOAD 7.0 12.0 HOST=bax.foo.com # LOAD 3.0 8.0 # will result in the load-limits being 7.0/12.0 for the "bax.foo.com" host, # and 3.0/8.0 for all other foo.com hosts. # # The special DEFAULT section can modify the built-in defaults - this must # be placed at the end of the file. DEFAULT # These are the built-in defaults. UP 1h LOAD 5.0 10.0 DISK * 90 95 MEMPHYS 100 101 MEMSWAP 50 80 MEMACT 90 97 xymon-4.3.28/client/xymonclient-sunos.sh0000775000076400007640000001432613033575046020561 0ustar rpmbuildrpmbuild#!/bin/sh #----------------------------------------------------------------------------# # Solaris client for Xymon # # # # Copyright (C) 2005-2011 Henrik Storner # # # # This program is released under the GNU General Public License (GPL), # # version 2. See the file "COPYING" for details. # # # #----------------------------------------------------------------------------# # # $Id: xymonclient-sunos.sh 7999 2017-01-06 02:00:06Z jccleaver $ # Work out what type of environment we are on # # this will return the zone name on any non-global solaris zone # or the word "Global" on any global solaris zone # or the word "global" on any standalone solaris platform, including LDOMS (/usr/sbin/zoneadm list 2>/dev/null || echo 1) | wc -l | grep '\<1\>' > /dev/null 2>&1 && ZTYPE=`/bin/zonename 2>/dev/null || echo global` || ZTYPE='Global' echo "[date]" date echo "[uname]" uname -a echo "[uptime]" uptime echo "[who]" who echo "[df]" # Bothersome, because Solaris df cannot show multiple fs-types, or exclude certain fs types. # Print the root filesystem first, with the header, and those fs's that have the same type. ROOTFSTYPE=`/bin/df -n / | awk '{print $3}'` /bin/df -F $ROOTFSTYPE -k # Then see what fs types are in use, and weed out those we don't want. case $ZTYPE in global|Global) FSTYPES=`/bin/df -n -l|cut -d: -f2 | awk '{print $1}'|egrep -v "^${ROOTFSTYPE}|^proc|^fd|^mntfs|^ctfs|^devfs|^objfs|^nfs|^lofs|^tmpfs|^sharefs"|sort|uniq` ;; *) # zones are frequently type lofs so deal with them specially FSTYPES=`/bin/df -n -l|cut -d: -f2 | awk '{print $1}'|egrep -v "^${ROOTFSTYPE}|^proc|^fd|^mntfs|^ctfs|^devfs|^objfs|^nfs|^tmpfs|^sharefs"|sort|uniq` ;; esac # $FSTYPES may be empty for fst in $FSTYPES; do case $ZTYPE in global|Global) /bin/df -F $fst -k | grep -v " /var/run" | tail +2 ;; *) /bin/df -F $fst -k | egrep -v "( /var/run|^(/dev|/platform/))" | tail +2 ;; esac done # This only works for ufs filesystems echo "[inode]" (if test -x /usr/ucb/df then /usr/ucb/df -i else df -o i 2>/dev/null fi) | awk ' NR<2{printf "%-20s %10s %10s %10s %10s %s\n", $1, "itotal", $2, $3, $4, $5} NR>=2{printf "%-20s %10d %10d %10d %10s %s\n", $1, $2+$3, $2, $3, $4, $5}' echo "[mount]" mount echo "[prtconf]" case $ZTYPE in global|Global) /usr/sbin/prtconf 2>&1 ;; *) # provided by the firmware (PROM) since devinfo facility not available # in a zone /usr/sbin/prtconf -p 2>&1 ;; esac echo "[memory]" case $ZTYPE in global|Global) vmstat 1 2 | tail -1 ;; *) # need to modify vmstat output in a non-global zone VMSTAT=`vmstat 1 2 | tail -1` # cut out the useable parts VMFR=`echo $VMSTAT | cut -d " " -f1,2,3` VMBK=`echo $VMSTAT | cut -d " " -f6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22` # get the total memory for the platform TMEM=`/usr/sbin/prtconf 2>&1 | grep Memory | cut -d" " -f3` TMEM=`expr $TMEM "*" 1024` # get the total allocated and reserved swap SUSED=`swap -s | cut -d "=" -f2 | cut -d "," -f1 | cut -d " " -f2 | cut -d "k" -f1` # work out the RSS for this zone TUSED=`prstat -Z -n 1,1 1 1 | \ nawk ' NR == 4 { do { if ($4 ~ /G$/) { sub(/G$/,"",$4); print $4*1024*1024; break; } if ($4 ~ /M$/) { sub(/M$/,"",$4); print $4*1024; break; } if ($4 ~ /K$/) { sub(/K$/,"",$4); print $4; break; } print "unknown" } while (0)}'` TUSED=`expr $TMEM "-" $TUSED` echo "$VMFR $SUSED $TUSED $VMBK" ;; esac echo "[swap]" /usr/sbin/swap -s # don't report the swaplist in a non-global zone because it will cause the # server client module to miscalculate memory case $ZTYPE in global|Global) echo "[swaplist]" /usr/sbin/swap -l 2>/dev/null ;; esac echo "[ifconfig]" ifconfig -a echo "[route]" netstat -rn echo "[netstat]" netstat -s echo "[ports]" netstat -na -f inet -P tcp | tail +3 netstat -na -f inet6 -P tcp | tail +5 echo "[ifstat]" # Leave out the wrmsd and mac interfaces. See http://www.xymon.com/archive/2009/06/msg00204.html case $ZTYPE in global|Global) /usr/bin/kstat -p -s '[or]bytes64' | egrep -v 'wrsmd|mac' | sort ;; *) # find out which nics are configured into this zone MYNICS=`netstat -i |cut -f1 -d" " | egrep -i -v "Name|lo|^$" |paste -s -d"|" - ` /usr/bin/kstat -p -s '[or]bytes64' | egrep "$MYNICS"| sort ;; esac echo "[ps]" case $ZTYPE in global) /bin/ps -A -o pid,ppid,user,stime,s,pri,pcpu,time,pmem,rss,vsz,args ;; Global) /bin/ps -A -o zone,pid,ppid,user,stime,class,s,pri,pcpu,time,pmem,rss,vsz,args | sort ;; *) /bin/ps -A -o pid,ppid,user,stime,class,s,pri,pcpu,time,pmem,rss,vsz,args ;; esac # If TOP is defined, then use it. If not, fall back to the Solaris prstat command. echo "[top]" if test "$TOP" != "" -a -x "$TOP" then "$TOP" -b 20 else prstat -can 20 1 1 fi # vmstat and iostat (iostat -d provides a cpu utilisation with I/O wait number) nohup sh -c "vmstat 300 2 1>$XYMONTMP/xymon_vmstat.$MACHINEDOTS.$$ 2>&1; mv $XYMONTMP/xymon_vmstat.$MACHINEDOTS.$$ $XYMONTMP/xymon_vmstat.$MACHINEDOTS" /dev/null 2>&1 & nohup sh -c "iostat -c 300 2 1>$XYMONTMP/xymon_iostatcpu.$MACHINEDOTS.$$ 2>&1; mv $XYMONTMP/xymon_iostatcpu.$MACHINEDOTS.$$ $XYMONTMP/xymon_iostatcpu.$MACHINEDOTS" /dev/null 2>&1 & nohup sh -c "iostat -dxsrP 300 2 1>$XYMONTMP/xymon_iostatdisk.$MACHINEDOTS.$$ 2>&1; mv $XYMONTMP/xymon_iostatdisk.$MACHINEDOTS.$$ $XYMONTMP/xymon_iostatdisk.$MACHINEDOTS" /dev/null 2>&1 & sleep 5 if test -f $XYMONTMP/xymon_vmstat.$MACHINEDOTS; then echo "[vmstat]"; cat $XYMONTMP/xymon_vmstat.$MACHINEDOTS; rm -f $XYMONTMP/xymon_vmstat.$MACHINEDOTS; fi if test -f $XYMONTMP/xymon_iostatcpu.$MACHINEDOTS; then echo "[iostatcpu]"; cat $XYMONTMP/xymon_iostatcpu.$MACHINEDOTS; rm -f $XYMONTMP/xymon_iostatcpu.$MACHINEDOTS; fi if test -f $XYMONTMP/xymon_iostatdisk.$MACHINEDOTS; then echo "[iostatdisk]"; cat $XYMONTMP/xymon_iostatdisk.$MACHINEDOTS; rm -f $XYMONTMP/xymon_iostatdisk.$MACHINEDOTS; fi exit xymon-4.3.28/client/Makefile0000664000076400007640000001037712263072434016143 0ustar rpmbuildrpmbuildOSTYPE := $(shell uname -s | tr '[A-Z]' '[a-z]') #ifeq ($(OSTYPE),hpux) # EXTRATOOLS=hpux-meminfo #endif #ifeq ($(OSTYPE),hp-ux) # EXTRATOOLS=hpux-meminfo #endif ifeq ($(OSTYPE),freebsd) EXTRATOOLS=freebsd-meminfo endif ifeq ($(OSTYPE),netbsd) EXTRATOOLS=netbsd-meminfo endif ifeq ($(OSTYPE),openbsd) EXTRATOOLS=openbsd-meminfo endif XYMONCLIENTLIB = ../lib/libxymonclient.a XYMONCLIENTLIBS = $(XYMONCLIENTLIB) XYMONCLIENTCOMMLIB = ../lib/libxymonclientcomm.a XYMONCLIENTCOMMLIBS = $(XYMONCLIENTCOMMLIB) $(SSLLIBS) $(ZLIBLIBS) $(NETLIBS) $(LIBRTDEF) PROGRAMS=xymonlaunch logfetch clientupdate orcaxymon msgcache COMMONTOOLS=xymon xymoncmd xymongrep xymoncfg xymondigest all: $(PROGRAMS) $(COMMONTOOLS) xymonclient.cfg clientlaunch.cfg $(EXTRATOOLS) xymonclient.cfg: xymonclient.cfg.DIST cat xymonclient.cfg.DIST | sed -e 's!@XYMONHOSTIP@!$(XYMONHOSTIP)!g' >xymonclient.cfg ../build/bb-commands.sh >>xymonclient.cfg clientlaunch.cfg: clientlaunch.cfg.DIST ifeq ($(LOCALCLIENT),yes) cat clientlaunch.cfg.DIST | sed -e 's!@CLIENTFLAGS@!--local!g' >clientlaunch.cfg else cat clientlaunch.cfg.DIST | sed -e 's!@CLIENTFLAGS@!!g' >clientlaunch.cfg endif logfetch: logfetch.c $(XYMONCLIENTLIB) $(CC) $(CFLAGS) -o $@ logfetch.c $(XYMONCLIENTLIBS) clientupdate: clientupdate.c $(XYMONCLIENTCOMMLIB) $(XYMONCLIENTLIB) $(CC) $(CFLAGS) -o $@ clientupdate.c $(XYMONCLIENTCOMMLIBS) $(XYMONCLIENTLIBS) orcaxymon: orcaxymon.c $(XYMONCLIENTCOMMLIB) $(XYMONCLIENTLIB) $(CC) $(CFLAGS) -o $@ orcaxymon.c $(XYMONCLIENTCOMMLIBS) $(XYMONCLIENTLIBS) msgcache: msgcache.c $(XYMONCLIENTLIB) $(CC) $(CFLAGS) -o $@ msgcache.c $(XYMONCLIENTCOMMLIBS) $(XYMONCLIENTLIBS) hpux-meminfo: hpux-meminfo.c $(CC) -o $@ hpux-meminfo.c freebsd-meminfo: freebsd-meminfo.c $(CC) -o $@ freebsd-meminfo.c openbsd-meminfo: openbsd-meminfo.c $(CC) -o $@ openbsd-meminfo.c netbsd-meminfo: netbsd-meminfo.c $(CC) -o $@ netbsd-meminfo.c install: if test ! -d $(INSTALLROOT)$(XYMONHOME) ; then mkdir -p $(INSTALLROOT)$(XYMONHOME) ; chmod 755 $(INSTALLROOT)$(XYMONHOME) ; fi if test ! -d $(INSTALLROOT)$(XYMONHOME)/bin ; then mkdir -p $(INSTALLROOT)$(XYMONHOME)/bin ; chmod 755 $(INSTALLROOT)$(XYMONHOME)/bin ; fi if test ! -d $(INSTALLROOT)$(XYMONHOME)/etc ; then mkdir -p $(INSTALLROOT)$(XYMONHOME)/etc ; chmod 755 $(INSTALLROOT)$(XYMONHOME)/etc ; fi if test ! -d $(INSTALLROOT)$(XYMONHOME)/tmp ; then mkdir -p $(INSTALLROOT)$(XYMONHOME)/tmp ; chmod 755 $(INSTALLROOT)$(XYMONHOME)/tmp ; fi if test ! -d $(INSTALLROOT)$(XYMONHOME)/logs ; then mkdir -p $(INSTALLROOT)$(XYMONHOME)/logs ; chmod 755 $(INSTALLROOT)$(XYMONHOME)/logs ; fi if test ! -d $(INSTALLROOT)$(XYMONHOME)/ext ; then mkdir -p $(INSTALLROOT)$(XYMONHOME)/ext ; chmod 755 $(INSTALLROOT)$(XYMONHOME)/ext ; fi if test ! -d $(INSTALLROOT)$(XYMONHOME)/local ; then mkdir -p $(INSTALLROOT)$(XYMONHOME)/local ; chmod 755 $(INSTALLROOT)$(XYMONHOME)/local; fi if test ! -f $(INSTALLROOT)$(XYMONHOME)/etc/localclient.cfg ; then cp localclient.cfg $(INSTALLROOT)$(XYMONHOME)/etc/ ; chmod 644 $(INSTALLROOT)$(XYMONHOME)/etc/localclient.cfg; fi if test ! -f $(INSTALLROOT)$(XYMONHOME)/local/README; then cp README-local $(INSTALLROOT)$(XYMONHOME)/local/README ; chmod 644 $(INSTALLROOT)$(XYMONHOME)/local/README; fi chmod 755 runclient.sh $(PROGRAMS) xymonclient*.sh $(COMMONTOOLS) $(EXTRATOOLS) cp -fp runclient.sh $(INSTALLROOT)$(XYMONHOME) cp -fp $(PROGRAMS) xymonclient*.sh $(COMMONTOOLS) $(EXTRATOOLS) $(INSTALLROOT)$(XYMONHOME)/bin/ ../build/merge-sects clientlaunch.cfg $(INSTALLROOT)$(XYMONHOME)/etc/clientlaunch.cfg ../build/merge-lines xymonclient.cfg $(INSTALLROOT)$(XYMONHOME)/etc/xymonclient.cfg chmod 644 $(INSTALLROOT)$(XYMONHOME)/etc/clientlaunch.cfg $(INSTALLROOT)$(XYMONHOME)/etc/xymonclient.cfg ifndef PKGBUILD chown -R $(XYMONUSER) $(INSTALLROOT)$(XYMONHOME) chgrp -R `$(IDTOOL) -g $(XYMONUSER)` $(INSTALLROOT)$(XYMONHOME) chmod 755 $(INSTALLROOT)$(XYMONHOME) endif install-localclient: chmod 755 xymond_client cp -fp xymond_client $(INSTALLROOT)$(XYMONHOME)/bin/ ifndef PKGBUILD chown $(XYMONUSER) $(INSTALLROOT)$(XYMONHOME)/bin/xymond_client chgrp `$(IDTOOL) -g $(XYMONUSER)` $(INSTALLROOT)$(XYMONHOME)/bin/xymond_client endif clean: rm -f $(PROGRAMS) $(COMMONTOOLS) xymond_client xymonclient.cfg clientlaunch.cfg $(EXTRATOOLS) *~ xymon-4.3.28/client/openbsd-meminfo.c0000664000076400007640000000511312465557020017724 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon memory information tool for OpenBSD. */ /* This tool retrieves information about the total and free RAM. */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: openbsd-meminfo.c 7505 2015-02-08 03:54:56Z jccleaver $"; #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { int hw_physmem[] = { CTL_HW, HW_PHYSMEM }; unsigned int physmem; int hw_pagesize[] = { CTL_HW, HW_PAGESIZE }; int pagesize; int vm_vmtotal[] = { CTL_VM, VM_METER }; struct vmtotal vmdata; size_t len; int result; int swapcount, i; struct swapent *swaplist, *s; unsigned long swaptotal, swapused; len = sizeof(physmem); result = sysctl(hw_physmem, sizeof(hw_physmem) / sizeof(*hw_physmem), &physmem, &len, NULL, 0); if (result != 0) return 1; len = sizeof(pagesize); result = sysctl(hw_pagesize, sizeof(hw_pagesize) / sizeof(*hw_pagesize), &pagesize, &len, NULL, 0); if (result != 0) return 1; len = sizeof(vmdata); result = sysctl(vm_vmtotal, sizeof(vm_vmtotal) / sizeof(*vm_vmtotal), &vmdata, &len, NULL, 0); /* Get swap statistics */ swapcount = swapctl(SWAP_NSWAP, NULL, 0); swaplist = (struct swapent *)malloc(swapcount * sizeof(struct swapent)); result = swapctl(SWAP_STATS, swaplist, swapcount); s = swaplist; swaptotal = swapused = 0; for (i = 0, s = swaplist; (i < swapcount); i++, s++) { if (s->se_flags & SWF_ENABLE) { swaptotal += s->se_nblks; swapused += s->se_inuse; } } free(swaplist); /* swap stats are in disk blocks of 512 bytes, so divide by 2 for KB and 1024 for MB */ swaptotal /= (2*1024); swapused /= (2*1024); // printf("Pagesize:%d\n", pagesize); printf("Total:%d\n", (physmem / (1024 * 1024))); printf("Free:%d\n", (pagesize / 1024)*(vmdata.t_free / 1024)); printf("Swaptotal:%lu\n", swaptotal); printf("Swapused:%lu\n", swapused); return 0; } xymon-4.3.28/client/xymonclient-hp-ux.sh0000775000076400007640000000553712006523030020440 0ustar rpmbuildrpmbuild#!/bin/sh # #----------------------------------------------------------------------------# # HP-UX client for Xymon # # # # Copyright (C) 2005-2011 Henrik Storner # # # # This program is released under the GNU General Public License (GPL), # # version 2. See the file "COPYING" for details. # # # #----------------------------------------------------------------------------# # # $Id: xymonclient-hp-ux.sh 7156 2012-08-02 16:08:56Z storner $ echo "[date]" date echo "[uname]" uname -a echo "[uptime]" uptime echo "[who]" who echo "[df]" # The sed stuff is to make sure lines are not split into two. df -Pk | sed -e '/^[^ ][^ ]*$/{ N s/[ ]*\n[ ]*/ / }' echo "[inode]" # HPUX once again proves they never do things like everyone else df -il | sed -e 's![():]! !g' | awk ' BEGIN{ t="Filesystem Mounted_on itotal ifree iused iused%" } { if ($1 ~ /^[0123456789]/) { t=sprintf("%s %s",t,$1) } else { t=sprintf("%s\n%s %s %s",t,$2,$1,$3) } } END{ print t }' | awk ' NR<2 { printf "%-35s %10s %10s %10s %10s %s\n", $1, $3, $4, $5, $6, "Mounted on"} NR>=2 { printf "%-35s %10d %10d %10d %10s %s\n", $1, $3, $4, $5, $6, $2} ' echo "[mount]" mount echo "[memory]" # $XYMONHOME/bin/hpux-meminfo # From Earl Flack http://lists.xymon.com/archive/2010-December/030100.html FREE=`/usr/sbin/swapinfo |grep ^memory |awk {'print $4'}` FREEREPORT=`echo $FREE / 1024 |/usr/bin/bc` TOTAL=`/usr/sbin/swapinfo |grep ^memory |awk {'print $2'}` TOTALREPORT=`echo $TOTAL / 1024 |/usr/bin/bc` echo Total:$TOTALREPORT echo Free:$FREEREPORT echo "[swapinfo]" /usr/sbin/swapinfo -tm echo "[ifconfig]" netstat -in echo "[route]" netstat -rn echo "[netstat]" netstat -s echo "[ifstat]" /usr/sbin/lanscan -p | while read PPA; do /usr/sbin/lanadmin -g mibstats $PPA; done echo "[ports]" netstat -an | grep "^tcp" echo "[ps]" UNIX95=1 ps -Ax -o pid,ppid,user,stime,state,pri,pcpu,time,vsz,args # $TOP must be set, the install utility should do that for us if it exists. if test "$TOP" != "" then if test -x "$TOP" then echo "[top]" # Cits Bogajewski 03-08-2005: redirect of top fails $TOP -d 1 -f $XYMONHOME/tmp/top.OUT cat $XYMONHOME/tmp/top.OUT rm $XYMONHOME/tmp/top.OUT fi fi # vmstat nohup sh -c "vmstat 300 2 1>$XYMONTMP/xymon_vmstat.$MACHINEDOTS.$$ 2>&1; mv $XYMONTMP/xymon_vmstat.$MACHINEDOTS.$$ $XYMONTMP/xymon_vmstat.$MACHINEDOTS" /dev/null 2>&1 & sleep 5 if test -f $XYMONTMP/xymon_vmstat.$MACHINEDOTS; then echo "[vmstat]"; cat $XYMONTMP/xymon_vmstat.$MACHINEDOTS; rm -f $XYMONTMP/xymon_vmstat.$MACHINEDOTS; fi exit xymon-4.3.28/client/orcaxymon.c0000664000076400007640000000543711615341300016656 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon ORCA data collector. */ /* This tool grabs the last reading from an ORCA logfile and formats it in */ /* NAME:VALUE format for the client message. */ /* */ /* Copyright (C) 2006-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: orcaxymon.c 6712 2011-07-31 21:01:52Z storner $"; #include #include #include #include #include #include #include #include "libxymon.h" int main(int argc, char *argv[]) { time_t now; char *prefix = NULL, *machinename = NULL; char datestr[12], fn[PATH_MAX]; int i; FILE *fd; char headerline[32768]; char vals[32768]; int gotvals = 0; char *hp, *hdr, *vp, *val; char msgline[4096]; strbuffer_t *msg; machinename = xgetenv("MACHINE"); for (i=1; (i < argc); i++) { if (strncmp(argv[i], "--orca=", 7) == 0) { prefix = argv[i]+7; } else if (strncmp(argv[i], "--machine=", 10) == 0) { machinename = argv[i]+10; } else if (strcmp(argv[i], "--debug") == 0) { debug = dontsendmessages = 1; } } if (!prefix || !machinename) return 0; /* * ORCA logfiles are names PREFIX-%Y-%m-%d-XXX where XXX is a * number starting at 0 and increasing whenever the columns * change. * We will look for the first 20 index numbers only. */ now = getcurrenttime(NULL); strftime(datestr, sizeof(datestr), "%Y-%m-%d", localtime(&now)); i = 0; fd = NULL; while ((i < 20) && !fd) { snprintf(fn, sizeof(fn), "%s-%s-%03d", prefix, datestr, i); fd = fopen(fn, "r"); } if (!fd) return 1; /* Grab the header line, and the last logfile entry. */ if (fgets(headerline, sizeof(headerline), fd)) { while (fgets(vals, sizeof(vals), fd)) gotvals = 1; } fclose(fd); msg = newstrbuffer(0); sprintf(msgline, "data %s.orca\n", machinename); addtobuffer(msg, msgline); /* Match headers and values. */ hdr = strtok_r(headerline, " \t\n", &hp); val = strtok_r(vals, " \t\n", &vp); while (hdr && val) { sprintf(msgline, "%s:%s\n", hdr, val); addtobuffer(msg, msgline); hdr = strtok_r(NULL, " \t\n", &hp); val = strtok_r(NULL, " \t\n", &vp); } sendmessage(STRBUF(msg), NULL, XYMON_TIMEOUT, NULL); return 0; } xymon-4.3.28/client/freebsd-meminfo.c0000664000076400007640000000350112465557020017703 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon memory information tool for FreeBSD. */ /* This tool retrieves information about the total and free RAM. */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: freebsd-meminfo.c 7505 2015-02-08 03:54:56Z jccleaver $"; #include #include #include #include #include int main(int argc, char *argv[]) { int hw_physmem[] = { CTL_HW, HW_PHYSMEM }; unsigned long physmem; int hw_pagesize[] = { CTL_HW, HW_PAGESIZE }; int pagesize; int vm_vmtotal[] = { CTL_VM, VM_METER }; struct vmtotal vmdata; size_t len; int result; len = sizeof(physmem); result = sysctl(hw_physmem, sizeof(hw_physmem) / sizeof(*hw_physmem), &physmem, &len, NULL, 0); if (result != 0) return 1; len = sizeof(pagesize); result = sysctl(hw_pagesize, sizeof(hw_pagesize) / sizeof(*hw_pagesize), &pagesize, &len, NULL, 0); if (result != 0) return 1; len = sizeof(vmdata); result = sysctl(vm_vmtotal, sizeof(vm_vmtotal) / sizeof(*vm_vmtotal), &vmdata, &len, NULL, 0); // printf("Pagesize:%d\n", pagesize); printf("Total:%lu\n", (physmem / (1024 * 1024))); printf("Free:%d\n", (pagesize / 1024)*(vmdata.t_free / 1024)); } xymon-4.3.28/client/xymonclient-linux.sh0000775000076400007640000000620012611270023020525 0ustar rpmbuildrpmbuild#!/bin/sh #----------------------------------------------------------------------------# # Linux client for Xymon # # # # Copyright (C) 2005-2011 Henrik Storner # # # # This program is released under the GNU General Public License (GPL), # # version 2. See the file "COPYING" for details. # # # #----------------------------------------------------------------------------# # # $Id: xymonclient-linux.sh 7707 2015-10-19 22:34:59Z jccleaver $ echo "[date]" date echo "[uname]" uname -rsmn echo "[osversion]" if [ -x /bin/lsb_release ]; then /bin/lsb_release -r -i -s | xargs echo /bin/lsb_release -a 2>/dev/null elif [ -x /usr/bin/lsb_release ]; then /usr/bin/lsb_release -r -i -s | xargs echo /usr/bin/lsb_release -a 2>/dev/null elif [ -f /etc/redhat-release ]; then cat /etc/redhat-release elif [ -f /etc/gentoo-release ]; then cat /etc/gentoo-release elif [ -f /etc/debian_version ]; then echo -n "Debian " cat /etc/debian_version elif [ -f /etc/S?SE-release ]; then cat /etc/S?SE-release elif [ -f /etc/slackware-version ]; then cat /etc/slackware-version elif [ -f /etc/mandrake-release ]; then cat /etc/mandrake-release elif [ -f /etc/fedora-release ]; then cat /etc/fedora-release elif [ -f /etc/arch-release ]; then cat /etc/arch-release fi echo "[uptime]" uptime echo "[who]" who echo "[df]" EXCLUDES=`cat /proc/filesystems | grep nodev | grep -v rootfs | awk '{print $2}' | xargs echo | sed -e 's! ! -x !g'` ROOTFS=`readlink -m /dev/root` df -Pl -x iso9660 -x $EXCLUDES | sed -e '/^[^ ][^ ]*$/{ N s/[ ]*\n[ ]*/ / }' -e "s&^rootfs&${ROOTFS}&" echo "[inode]" df -Pil -x iso9660 -x $EXCLUDES | sed -e '/^[^ ][^ ]*$/{ N s/[ ]*\n[ ]*/ / }' -e "s&^rootfs&${ROOTFS}&" echo "[mount]" mount echo "[free]" free echo "[ifconfig]" /sbin/ifconfig 2>/dev/null echo "[route]" netstat -rn echo "[netstat]" netstat -s echo "[ports]" # Bug in RedHat's netstat spews annoying error messages. netstat -antu 2>/dev/null echo "[ifstat]" /sbin/ifconfig 2>/dev/null # Report mdstat data if it exists if test -r /proc/mdstat; then echo "[mdstat]"; cat /proc/mdstat; fi echo "[ps]" ps -Aww f -o pid,ppid,user,start,state,pri,pcpu,time:12,pmem,rsz:10,vsz:10,cmd # $TOP must be set, the install utility should do that for us if it exists. if test "$TOP" != "" then if test -x "$TOP" then echo "[nproc]" nproc --all 2>/dev/null echo "[top]" export CPULOOP ; CPULOOP=1 ; $TOP -b -n 1 # Some top versions do not finish off the last line of output echo "" fi fi # vmstat nohup sh -c "vmstat 300 2 1>$XYMONTMP/xymon_vmstat.$MACHINEDOTS.$$ 2>&1; mv $XYMONTMP/xymon_vmstat.$MACHINEDOTS.$$ $XYMONTMP/xymon_vmstat.$MACHINEDOTS" /dev/null 2>&1 & sleep 5 if test -f $XYMONTMP/xymon_vmstat.$MACHINEDOTS; then echo "[vmstat]"; cat $XYMONTMP/xymon_vmstat.$MACHINEDOTS; rm -f $XYMONTMP/xymon_vmstat.$MACHINEDOTS; fi exit xymon-4.3.28/include/0000775000076400007640000000000013037531512014635 5ustar rpmbuildrpmbuildxymon-4.3.28/include/libxymon.h0000664000076400007640000000600512503132277016652 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __LIBXYMON_H__ #define __LIBXYMON_H__ #include #include #include typedef struct htnames_t { char *name; struct htnames_t *next; } htnames_t; typedef struct strbuffer_t { char *s; int used, sz; } strbuffer_t; #define STRBUF(buf) (buf->s) #define STRBUFLEN(buf) (buf->used) #define STRBUFAVAIL(buf) (buf->sz - buf->used) #define STRBUFEND(buf) (buf->s + buf->used) #define STRBUFSZ(buf) (buf->sz) #define IP_ADDR_STRLEN 16 #include "version.h" #include "config.h" #include "../lib/osdefs.h" #ifdef XYMONWINCLIENT #include "../lib/strfunc.h" #include "../lib/errormsg.h" #include "../lib/environ.h" #include "../lib/stackio.h" #include "../lib/timefunc.h" #include "../lib/memory.h" #include "../lib/sendmsg.h" #include "../lib/holidays.h" #include "../lib/rbtr.h" #include "../lib/msort.h" #include "../lib/misc.h" #else /* Defines CGI URL's */ #include "../lib/cgiurls.h" #include "../lib/links.h" /* Generates HTML */ #include "../lib/acklog.h" #include "../lib/eventlog.h" #include "../lib/headfoot.h" #include "../lib/htmllog.h" #include "../lib/notifylog.h" #include "../lib/acknowledgementslog.h" #include "../lib/reportlog.h" #include "../lib/availability.h" #include "../lib/calc.h" #include "../lib/cgi.h" #include "../lib/color.h" #include "../lib/crondate.h" #include "../lib/clientlocal.h" #include "../lib/digest.h" #include "../lib/encoding.h" #include "../lib/environ.h" #include "../lib/errormsg.h" #include "../lib/files.h" #include "../lib/xymonrrd.h" #include "../lib/holidays.h" #include "../lib/ipaccess.h" #include "../lib/loadalerts.h" #include "../lib/loadhosts.h" #include "../lib/loadcriticalconf.h" #include "../lib/locator.h" #include "../lib/matching.h" #include "../lib/md5.h" #include "../lib/memory.h" #include "../lib/misc.h" #include "../lib/msort.h" #include "../lib/netservices.h" #include "../lib/readmib.h" #include "../lib/rmd160c.h" #include "../lib/run.h" #include "../lib/sendmsg.h" #include "../lib/sha1.h" #include "../lib/sha2.h" #include "../lib/sig.h" #include "../lib/stackio.h" #include "../lib/strfunc.h" #include "../lib/suid.h" #include "../lib/timefunc.h" #include "../lib/timing.h" #include "../lib/tree.h" #include "../lib/url.h" #include "../lib/webaccess.h" #include "../lib/xymond_buffer.h" #include "../lib/xymond_ipc.h" #endif #endif xymon-4.3.28/include/version.h0000664000076400007640000000145113037531104016471 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor */ /* */ /* Copyright (C) 2002-2015 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __VERSION_H__ #define __VERSION_H__ #define VERSION "4.3.28" #endif xymon-4.3.28/xymonnet/0000775000076400007640000000000013037531512015073 5ustar rpmbuildrpmbuildxymon-4.3.28/xymonnet/xymonping.10000664000076400007640000000713713037531444017221 0ustar rpmbuildrpmbuild.TH XYMONPING 1 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME xymonping \- Xymon ping tool .SH SYNOPSIS .B "xymonping [\-\-retries=N] [\-\-timeout=N] [IP\-addresses]" .SH DESCRIPTION .I xymonping(1) is used for ping testing of the hosts monitored by the .I xymon(7) monitoring system. It reads a list of IP addresses from stdin, and performs a "ping" check to see if these hosts are alive. It is normally invoked by the .I xymonnet(1) utility, which performs all of the Xymon network tests. Optionally, if a list of IP-addresses is passed as command-line arguments, it will ping those IP's instead of reading them from stdin. xymonping only handles IP-addresses, not hostnames. xymonping was inspired by the .I fping(1) tool, but has been written from scratch to implement a fast ping tester without much of the overhead found in other such utilities. The output from xymonping is similar to that of "fping \-Ae". xymonping probes multiple systems in parallel, and the runtime is therefore mostly dependent on the timeout-setting and the number of retries. With the default options, xymonping takes approximately 18 seconds to ping all hosts (tested with an input set of 1500 IP addresses). .SH SUID-ROOT INSTALLATION REQUIRED xymonping needs to be installed with suid-root privileges, since it requires a "raw socket" to send and receive ICMP Echo (ping) packets. xymonping is implemented such that it immediately drops the root privileges, and only regains them to perform two operations: Obtaining the raw socket, and optionally binding it to a specific source address. These operations are performed as root, the rest of the time xymonping runs with normal user privileges. Specifically, no user-supplied data or network data is used while running with root privileges. Therefore it should be safe to provide xymonping with the necessary suid-root privileges. .SH OPTIONS .IP \-\-retries=N Sets the number of retries for hosts that fail to respond to the initial ping, i.e. the number of ping probes sent in addition to the initial probe. The default is \-\-retries=2, to ping a host 3 times before concluding that it is not responding. .IP \-\-timeout=N Determines the timeout (in seconds) for ping probes. If a host does not respond within N seconds, it is regarded as unavailable, unless it responds to one of the retries. The default is \-\-timeout=5. .IP \-\-responses=N xymonping normally stops pinging a host after receiving a single response, and uses that to determine the round-trip time. If the first response takes longer to arrive - e.g. because of additional network overhead when first determining the route to the target host - it may skew the round-trip-time reports. You can then use this option to require N responses, and xymonping will calculate the round-trip time as the average of all of responsetimes. .IP \-\-max\-pps=N Maximum number of packets per second. This limits the number of ICMP packets xymonping will send per second, by enforcing a brief delay after each packet is sent. The default setting is to send a maximum of 50 packets per second. Note that increasing this may cause flooding of the network, and since ICMP packets can be discarded by routers and other network equipment, this can cause erratic behaviour with hosts recorded as not responding when they are in fact OK. .IP \-\-source=ADDRESS Use ADDRESS as the source IP address of the ping packets sent. On multi-homed systems, allows you to select the source IP of the hosts going out, which might be necessary for ping to work. .IP \-\-debug Enable debug output. This prints out all packets sent and received. .SH "SEE ALSO" xymon(7), xymonnet(1), fping(1) xymon-4.3.28/xymonnet/contest.c0000664000076400007640000013421613034012341016714 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor network test tool. */ /* */ /* This is used to implement the testing of a TCP service. */ /* */ /* Copyright (C) 2003-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: contest.c 8004 2017-01-06 22:06:25Z jccleaver $"; #include "config.h" #include #include #include #include #include #include #ifdef HAVE_SYS_SELECT_H #include /* Someday I'll move to GNU Autoconf for this ... */ #endif #include #include #include #include #include #include #include #include #include #include "libxymon.h" #include "xymonnet.h" #include "contest.h" #include "httptest.h" #include "dns.h" /* BSD uses RLIMIT_OFILE */ #if defined(RLIMIT_OFILE) && !defined(RLIMIT_NOFILE) #define RLIMIT_NOFILE RLIMIT_OFILE #endif #define MAX_TELNET_CYCLES 5 /* Max loops with telnet options before aborting banner */ #define SSLSETUP_PENDING -1 /* Magic value for tcptest_t->sslrunning while handshaking */ #define SLOWLIMSECS 5 /* How long a socket may be inactive before deemed slow */ /* See http://www.openssl.org/docs/apps/ciphers.html for cipher strings */ char *ciphersmedium = "MEDIUM"; /* Must be formatted for openssl library */ char *ciphershigh = "HIGH"; /* Must be formatted for openssl library */ unsigned int tcp_stats_total = 0; unsigned int tcp_stats_http = 0; unsigned int tcp_stats_plain = 0; unsigned int tcp_stats_connects = 0; unsigned long tcp_stats_read = 0; unsigned long tcp_stats_written = 0; unsigned int warnbytesread = 0; static tcptest_t *thead = NULL; int shuffletests = 0; int sslincludecipherlist = 1; int sslshowallciphers = 0; int snienabled = 0; /* SNI disabled by default */ static svcinfo_t svcinfo_http = { "http", NULL, 0, NULL, 0, 0, (TCP_GET_BANNER|TCP_HTTP), 80 }; static svcinfo_t svcinfo_https = { "https", NULL, 0, NULL, 0, 0, (TCP_GET_BANNER|TCP_HTTP|TCP_SSL), 443 }; static ssloptions_t default_sslopt = { NULL, SSLVERSION_DEFAULT, NULL }; static time_t sslcert_expiretime(char *timestr) { int res; time_t t1, t2; struct tm *t; struct tm exptime; time_t gmtofs, result; memset(&exptime, 0, sizeof(exptime)); /* expire date: 2004-01-02 08:04:15 GMT */ res = sscanf(timestr, "%4d-%2d-%2d %2d:%2d:%2d", &exptime.tm_year, &exptime.tm_mon, &exptime.tm_mday, &exptime.tm_hour, &exptime.tm_min, &exptime.tm_sec); if (res != 6) { errprintf("Cannot interpret certificate time %s\n", timestr); return 0; } /* tm_year is 1900 based; tm_mon is 0 based */ exptime.tm_year -= 1900; exptime.tm_mon -= 1; result = mktime(&exptime); if (result > 0) { /* * Calculate the difference between localtime and GMT */ t = gmtime(&result); t->tm_isdst = 0; t1 = mktime(t); t = localtime(&result); t->tm_isdst = 0; t2 = mktime(t); gmtofs = (t2-t1); result += gmtofs; } else { /* * mktime failed - probably it expires after the * Jan 19,2038 rollover for a 32-bit time_t. */ result = INT_MAX; } dbgprintf("Output says it expires: %s", timestr); dbgprintf("I think it expires at (localtime) %s\n", asctime(localtime(&result))); return result; } static int tcp_callback(unsigned char *buf, unsigned int len, void *priv) { /* * The default data callback function for simple TCP tests. */ tcptest_t *item = (tcptest_t *) priv; if (item->banner == NULL) { item->banner = (unsigned char *)malloc(len+1); } else { item->banner = (unsigned char *)realloc(item->banner, item->bannerbytes+len+1); } memcpy(item->banner+item->bannerbytes, buf, len); item->bannerbytes += len; *(item->banner + item->bannerbytes) = '\0'; return 1; /* We always just grab the first bit of data for TCP tests */ } tcptest_t *add_tcp_test(char *ip, int port, char *service, ssloptions_t *sslopt, char *srcip, char *tspec, int silent, unsigned char *reqmsg, void *priv, f_callback_data datacallback, f_callback_final finalcallback) { tcptest_t *newtest; dbgprintf("Adding tcp test IP=%s, port=%d, service=%s, silent=%d\n", textornull(ip), port, service, silent); if (port == 0) { errprintf("Trying to scan port 0 for service %s\n", service); errprintf("You probably need to define the %s service in /etc/services\n", service); return NULL; } tcp_stats_total++; newtest = (tcptest_t *) calloc(1, sizeof(tcptest_t)); newtest->tspec = (tspec ? strdup(tspec) : NULL); newtest->fd = -1; newtest->lastactive = 0; newtest->bytesread = 0; newtest->byteswritten = 0; newtest->open = 0; newtest->connres = -1; newtest->errcode = CONTEST_ENOERROR; newtest->duration.tv_sec = newtest->duration.tv_nsec = 0; newtest->totaltime.tv_sec = newtest->totaltime.tv_nsec = 0; memset(&newtest->addr, 0, sizeof(newtest->addr)); newtest->addr.sin_family = PF_INET; newtest->addr.sin_port = htons(port); if ((ip == NULL) || (strlen(ip) == 0) || (inet_aton(ip, (struct in_addr *) &newtest->addr.sin_addr.s_addr) == 0)) { newtest->errcode = CONTEST_EDNS; } newtest->srcaddr = (srcip ? strdup(srcip) : NULL); if (strcmp(service, "http") == 0) { newtest->svcinfo = &svcinfo_http; tcp_stats_http++; } else if (strcmp(service, "https") == 0) { newtest->svcinfo = &svcinfo_https; tcp_stats_http++; } else { newtest->svcinfo = find_tcp_service(service); tcp_stats_plain++; } newtest->sendtxt = (reqmsg ? reqmsg : newtest->svcinfo->sendtxt); newtest->sendlen = (reqmsg ? strlen(reqmsg) : newtest->svcinfo->sendlen); newtest->silenttest = silent; newtest->readpending = 0; newtest->telnetnegotiate = (((newtest->svcinfo->flags & TCP_TELNET) && !silent) ? MAX_TELNET_CYCLES : 0); newtest->telnetbuf = NULL; newtest->telnetbuflen = 0; newtest->ssloptions = (sslopt ? sslopt : &default_sslopt); newtest->sslctx = NULL; newtest->ssldata = NULL; newtest->certinfo = NULL; newtest->certissuer = NULL; newtest->certexpires = 0; newtest->sslrunning = ((newtest->svcinfo->flags & TCP_SSL) ? SSLSETUP_PENDING : 0); newtest->sslagain = 0; newtest->banner = NULL; newtest->bannerbytes = 0; if (datacallback == NULL) { /* * Use the default callback-routine, which expects * "priv" to point at the test item. */ newtest->priv = newtest; newtest->datacallback = tcp_callback; } else { /* * Custom callback - handles data output by itself. */ newtest->priv = priv; newtest->datacallback = datacallback; } newtest->finalcallback = finalcallback; if (newtest->errcode == CONTEST_ENOERROR) { newtest->next = thead; thead = newtest; } return newtest; } static void get_connectiontime(tcptest_t *item, struct timespec *timestamp) { tvdiff(&item->timestart, timestamp, &item->duration); } static void get_totaltime(tcptest_t *item, struct timespec *timestamp) { tvdiff(&item->timestart, timestamp, &item->totaltime); } static int do_telnet_options(tcptest_t *item) { /* * Handle telnet options. * * This code was taken from the sources for "netcat" version 1.10 * by "Xymon" . */ unsigned char *obuf; int remain; unsigned char y; unsigned char *inp; unsigned char *outp; int result = 0; if (item->telnetbuflen == 0) { dbgprintf("Ignoring telnet option with length 0\n"); return 0; } obuf = (unsigned char *)malloc(item->telnetbuflen); y = 0; inp = item->telnetbuf; remain = item->telnetbuflen; outp = obuf; while (remain > 0) { if ((remain < 3) || (*inp != 255)) { /* IAC? */ /* * End of options. * We probably have the banner in the remainder of the * buffer, so copy it over, and return it. */ item->banner = strdup(inp); item->bannerbytes = strlen(inp); item->telnetbuflen = 0; xfree(obuf); return 0; } *outp = 255; outp++; inp++; remain--; if ((*inp == 251) || (*inp == 252)) /* WILL or WON'T */ y = 254; /* -> DON'T */ if ((*inp == 253) || (*inp == 254)) /* DO or DON'T */ y = 252; /* -> WON'T */ if (y) { *outp = y; outp++; inp++; remain--; *outp = *inp; outp++; /* copy actual option byte */ y = 0; result = 1; } /* if y */ inp++; remain--; } /* while remain */ item->telnetbuflen = (outp-obuf); if (item->telnetbuflen) memcpy(item->telnetbuf, obuf, item->telnetbuflen); item->telnetbuf[item->telnetbuflen] = '\0'; xfree(obuf); return result; } #if TCP_SSL <= 0 char *ssl_library_version = NULL; /* * Define stub routines for plain socket operations without SSL */ static void setup_ssl(tcptest_t *item) { errprintf("SSL test, but xymonnet was built without SSL support\n"); item->sslrunning = 0; item->errcode = CONTEST_ESSL; } static int socket_write(tcptest_t *item, unsigned char *outbuf, int outlen) { int n = write(item->fd, outbuf, outlen); item->byteswritten += n; return n; } static int socket_read(tcptest_t *item, unsigned char *inbuf, int inbufsize) { int n = read(item->fd, inbuf, inbufsize); item->bytesread += n; return n; } static void socket_shutdown(tcptest_t *item) { shutdown(item->fd, SHUT_RDWR); if (warnbytesread && (item->bytesread > warnbytesread)) { if (item->tspec) errprintf("Huge response %u bytes from %s\n", item->bytesread, item->tspec); else errprintf("Huge response %u bytes for %s:%s\n", item->bytesread, inet_ntoa(item->addr.sin_addr), item->svcinfo->svcname); } } #else char *ssl_library_version = OPENSSL_VERSION_TEXT; static int cert_password_cb(char *buf, int size, int rwflag, void *userdata) { FILE *passfd; char *p; char passfn[PATH_MAX]; char passphrase[1024]; tcptest_t *item = (tcptest_t *)userdata; memset(passphrase, 0, sizeof(passphrase)); /* * Private key passphrases are stored in the file named same as the * certificate itself, but with extension ".pass" */ sprintf(passfn, "%s/certs/%s", xgetenv("XYMONHOME"), item->ssloptions->clientcert); p = strrchr(passfn, '.'); if (p == NULL) p = passfn+strlen(passfn); strcpy(p, ".pass"); passfd = fopen(passfn, "r"); if (passfd && fgets(passphrase, sizeof(passphrase)-1, passfd)) { p = strchr(passphrase, '\n'); if (p) *p = '\0'; } else *passphrase = '\0'; if (passfd) fclose(passfd); strncpy(buf, passphrase, size); buf[size - 1] = '\0'; /* Clear this buffer for security! Don't want passphrases in core dumps... */ memset(passphrase, 0, sizeof(passphrase)); return strlen(buf); } static char *xymon_ASN1_UTCTIME(ASN1_UTCTIME *tm) { static char result[256]; char *asn1_string; int gmt=0; int len, i; int century=0,year=0,month=0,day=0,hour=0,minute=0,second=0; len=tm->length; asn1_string=(char *)tm->data; result[0] = '\0'; if (len < 10) return result; if (asn1_string[len-1] == 'Z') gmt=1; for (i=0; i '9') || (asn1_string[i] < '0')) return result; } if (len >= 15) { /* 20541024111745Z format */ century = 100 * ((asn1_string[0]-'0')*10+(asn1_string[1]-'0')); asn1_string += 2; } year=(asn1_string[0]-'0')*10+(asn1_string[1]-'0'); if (century == 0 && year < 50) year+=100; month=(asn1_string[2]-'0')*10+(asn1_string[3]-'0'); if ((month > 12) || (month < 1)) return result; day=(asn1_string[4]-'0')*10+(asn1_string[5]-'0'); hour=(asn1_string[6]-'0')*10+(asn1_string[7]-'0'); minute=(asn1_string[8]-'0')*10+(asn1_string[9]-'0'); if ( (asn1_string[10] >= '0') && (asn1_string[10] <= '9') && (asn1_string[11] >= '0') && (asn1_string[11] <= '9')) { second= (asn1_string[10]-'0')*10+(asn1_string[11]-'0'); } sprintf(result, "%04d-%02d-%02d %02d:%02d:%02d %s", year+(century?century:1900), month, day, hour, minute, second, (gmt?"GMT":"")); return result; } static void setup_ssl(tcptest_t *item) { static int ssl_init_complete = 0; struct servent *sp; char portinfo[100]; X509 *peercert; char *certcn, *certstart, *certend, *certissuer; const char *certsigalg; int err, keysz = 0; strbuffer_t *sslinfo; char msglin[2048]; item->sslrunning = 1; if (!ssl_init_complete) { /* Setup entropy */ if (RAND_status() != 1) { char path[PATH_MAX]; /* Path for the random file */ /* load entropy from files */ RAND_load_file(RAND_file_name(path, sizeof (path)), -1); /* shuffle $RANDFILE (or ~/.rnd if unset) */ RAND_write_file(RAND_file_name(path, sizeof (path))); if (RAND_status() != 1) { errprintf("Failed to find enough entropy on your system"); item->errcode = CONTEST_ESSL; return; } } SSL_load_error_strings(); SSL_library_init(); ssl_init_complete = 1; } if (item->sslctx == NULL) { #if OPENSSL_VERSION_NUMBER >= 0x10100000L item->sslctx = SSL_CTX_new(TLS_client_method()); #else item->sslctx = SSL_CTX_new(SSLv23_client_method()); #endif switch (item->ssloptions->sslversion) { #if OPENSSL_VERSION_NUMBER >= 0x10100000L case SSLVERSION_TLS12: SSL_CTX_set_min_proto_version(item->sslctx, TLS1_2_VERSION); SSL_CTX_set_max_proto_version(item->sslctx, TLS1_2_VERSION); break; case SSLVERSION_TLS11: SSL_CTX_set_min_proto_version(item->sslctx, TLS1_1_VERSION); SSL_CTX_set_max_proto_version(item->sslctx, TLS1_1_VERSION); break; case SSLVERSION_TLS10: SSL_CTX_set_min_proto_version(item->sslctx, TLS1_VERSION); SSL_CTX_set_max_proto_version(item->sslctx, TLS1_VERSION); break; #elif OPENSSL_VERSION_NUMBER >= 0x10001000L case SSLVERSION_TLS12: SSL_CTX_set_options(item->sslctx, (SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1|SSL_OP_NO_TLSv1_1)); break; case SSLVERSION_TLS11: SSL_CTX_set_options(item->sslctx, (SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1|SSL_OP_NO_TLSv1_2)); break; case SSLVERSION_TLS10: SSL_CTX_set_options(item->sslctx, (SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1_1|SSL_OP_NO_TLSv1_2)); break; #ifdef HAVE_SSLV2_SUPPORT case SSLVERSION_V2: SSL_CTX_set_options(item->sslctx, (SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1|SSL_OP_NO_TLSv1_1|SSL_OP_NO_TLSv1_2)); break; #endif #ifdef HAVE_SSLV3_SUPPORT case SSLVERSION_V3: SSL_CTX_set_options(item->sslctx, (SSL_OP_NO_SSLv2|SSL_OP_NO_TLSv1|SSL_OP_NO_TLSv1_1|SSL_OP_NO_TLSv1_2)); break; #endif #else case SSLVERSION_TLS10: SSL_CTX_set_options(item->sslctx, (SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3)); break; #ifdef HAVE_SSLV2_SUPPORT case SSLVERSION_V2: SSL_CTX_set_options(item->sslctx, (SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1)); break; #endif #ifdef HAVE_SSLV3_SUPPORT case SSLVERSION_V3: SSL_CTX_set_options(item->sslctx, (SSL_OP_NO_SSLv2|SSL_OP_NO_TLSv1)); break; #endif #endif default: break; } if (!item->sslctx) { char sslerrmsg[256]; ERR_error_string(ERR_get_error(), sslerrmsg); errprintf("Cannot create SSL context - IP %s, service %s: %s\n", inet_ntoa(item->addr.sin_addr), item->svcinfo->svcname, sslerrmsg); item->sslrunning = 0; item->errcode = CONTEST_ESSL; return; } /* Workaround SSL bugs */ SSL_CTX_set_options(item->sslctx, SSL_OP_ALL); SSL_CTX_set_quiet_shutdown(item->sslctx, 1); /* Limit set of ciphers, if user wants to */ if (item->ssloptions->cipherlist) SSL_CTX_set_cipher_list(item->sslctx, item->ssloptions->cipherlist); if (item->ssloptions->clientcert) { int status; char certfn[PATH_MAX]; SSL_CTX_set_default_passwd_cb(item->sslctx, cert_password_cb); SSL_CTX_set_default_passwd_cb_userdata(item->sslctx, item); sprintf(certfn, "%s/certs/%s", xgetenv("XYMONHOME"), item->ssloptions->clientcert); status = SSL_CTX_use_certificate_chain_file(item->sslctx, certfn); if (status == 1) { status = SSL_CTX_use_PrivateKey_file(item->sslctx, certfn, SSL_FILETYPE_PEM); } if (status != 1) { char sslerrmsg[256]; ERR_error_string(ERR_get_error(), sslerrmsg); errprintf("Cannot load SSL client certificate/key %s: %s\n", item->ssloptions->clientcert, sslerrmsg); item->sslrunning = 0; item->errcode = CONTEST_ESSL; return; } } } if (item->ssldata == NULL) { item->ssldata = SSL_new(item->sslctx); if (!item->ssldata) { char sslerrmsg[256]; ERR_error_string(ERR_get_error(), sslerrmsg); errprintf("SSL_new failed - IP %s, service %s: %s\n", inet_ntoa(item->addr.sin_addr), item->svcinfo->svcname, sslerrmsg); item->sslrunning = 0; SSL_CTX_free(item->sslctx); item->errcode = CONTEST_ESSL; return; } /* Verify that the client certificate is working */ if (item->ssloptions->clientcert) { X509 *x509; x509 = SSL_get_certificate(item->ssldata); if(x509 != NULL) { EVP_PKEY *pktmp = X509_get_pubkey(x509); EVP_PKEY_copy_parameters(pktmp,SSL_get_privatekey(item->ssldata)); EVP_PKEY_free(pktmp); } if (!SSL_CTX_check_private_key(item->sslctx)) { errprintf("Private/public key mismatch for certificate %s\n", item->ssloptions->clientcert); item->sslrunning = 0; item->errcode = CONTEST_ESSL; return; } } #if (SSLEAY_VERSION_NUMBER >= 0x00908070) if (item->sni) SSL_set_tlsext_host_name(item->ssldata, item->sni); #endif /* SSL setup is done. Now attach the socket FD to the SSL protocol handler */ if (SSL_set_fd(item->ssldata, item->fd) != 1) { char sslerrmsg[256]; ERR_error_string(ERR_get_error(), sslerrmsg); errprintf("Could not initiate SSL on connection - IP %s, service %s: %s\n", inet_ntoa(item->addr.sin_addr), item->svcinfo->svcname, sslerrmsg); item->sslrunning = 0; SSL_free(item->ssldata); SSL_CTX_free(item->sslctx); item->errcode = CONTEST_ESSL; return; } } sp = getservbyport(item->addr.sin_port, "tcp"); if (sp) { sprintf(portinfo, "%s (%d/tcp)", sp->s_name, item->addr.sin_port); } else { sprintf(portinfo, "%d/tcp", item->addr.sin_port); } if ((err = SSL_connect(item->ssldata)) != 1) { char sslerrmsg[256]; switch (SSL_get_error (item->ssldata, err)) { case SSL_ERROR_WANT_READ: case SSL_ERROR_WANT_WRITE: item->sslrunning = SSLSETUP_PENDING; break; case SSL_ERROR_SYSCALL: ERR_error_string(ERR_get_error(), sslerrmsg); /* Filter out the bogus SSL error */ if (strstr(sslerrmsg, "error:00000000:") == NULL) { errprintf("IO error in SSL_connect to %s on host %s: %s\n", portinfo, inet_ntoa(item->addr.sin_addr), sslerrmsg); } item->errcode = CONTEST_ESSL; item->sslrunning = 0; SSL_free(item->ssldata); SSL_CTX_free(item->sslctx); break; case SSL_ERROR_SSL: ERR_error_string(ERR_get_error(), sslerrmsg); errprintf("Unspecified SSL error in SSL_connect to %s on host %s: %s\n", portinfo, inet_ntoa(item->addr.sin_addr), sslerrmsg); item->errcode = CONTEST_ESSL; item->sslrunning = 0; SSL_free(item->ssldata); SSL_CTX_free(item->sslctx); break; default: ERR_error_string(ERR_get_error(), sslerrmsg); errprintf("Unknown error %d in SSL_connect to %s on host %s: %s\n", err, portinfo, inet_ntoa(item->addr.sin_addr), sslerrmsg); item->errcode = CONTEST_ESSL; item->sslrunning = 0; SSL_free(item->ssldata); SSL_CTX_free(item->sslctx); break; } return; } /* If we get this far, the SSL handshake has completed. So grab the certificate */ peercert = SSL_get_peer_certificate(item->ssldata); if (!peercert) { errprintf("Cannot get peer certificate for %s on host %s\n", portinfo, inet_ntoa(item->addr.sin_addr)); item->errcode = CONTEST_ESSL; item->sslrunning = 0; SSL_free(item->ssldata); SSL_CTX_free(item->sslctx); return; } sslinfo = newstrbuffer(0); certcn = X509_NAME_oneline(X509_get_subject_name(peercert), NULL, 0); certissuer = X509_NAME_oneline(X509_get_issuer_name(peercert), NULL, 0); #if OPENSSL_VERSION_NUMBER < 0x10100000L certsigalg = OBJ_nid2ln(OBJ_obj2nid(peercert->sig_alg->algorithm)); #else certsigalg = OBJ_nid2ln(X509_get_signature_nid(peercert)); #endif certstart = strdup(xymon_ASN1_UTCTIME(X509_get_notBefore(peercert))); certend = strdup(xymon_ASN1_UTCTIME(X509_get_notAfter(peercert))); { BIO *o = BIO_new(BIO_s_mem()); long slen; char *sdata, *keyline; #if OPENSSL_VERSION_NUMBER < 0x0090700fL X509_NAME_print_ex(o, X509_get_subject_name(peercert), 8, XN_FLAG_COMPAT); #else X509_print_ex(o, peercert, XN_FLAG_COMPAT, X509_FLAG_COMPAT); #endif slen = BIO_get_mem_data(o, &sdata); if (slen > 0) { keyline = strstr(sdata, " Public-Key:"); if (!keyline) keyline = strstr(sdata, " Public Key:"); if (keyline) { keyline = strchr(keyline, '('); if (keyline) keysz = atoi(keyline+1); } } BIO_set_close(o, BIO_CLOSE); BIO_free(o); } snprintf(msglin, sizeof(msglin), "Server certificate:\n\tsubject:%s\n\tstart date: %s\n\texpire date:%s\n\tkey size:%d\n\tissuer:%s\n\tsignature algorithm: %s\n", certcn, certstart, certend, keysz, certissuer, certsigalg); addtobuffer(sslinfo, msglin); item->certsubject = strdup(certcn); item->certissuer = strdup(certissuer); item->certexpires = sslcert_expiretime(certend); item->certkeysz = keysz; xfree(certcn); xfree(certstart); xfree(certend); xfree(certissuer); X509_free(peercert); /* We list the available ciphers in the SSL cert data */ if (sslincludecipherlist) { int b1, b2; b1 = SSL_get_cipher_bits(item->ssldata, &b2); certsigalg = OBJ_nid2ln(X509_get_signature_type(peercert)); snprintf(msglin, sizeof(msglin), "\nCipher used: %s (%d bits)\n", SSL_get_cipher_name(item->ssldata), b1); addtobuffer(sslinfo, msglin); item->mincipherbits = b1; if (sslshowallciphers) { int i; STACK_OF(SSL_CIPHER) *sk; addtobuffer(sslinfo, "\nAvailable ciphers:\n"); sk = SSL_get_ciphers(item->ssldata); for (i=0; imincipherbits == 0) || (b1 < item->mincipherbits)) item->mincipherbits = b1; } } } item->certinfo = grabstrbuffer(sslinfo); } static int socket_write(tcptest_t *item, char *outbuf, int outlen) { int res = 0; if (item->sslrunning) { res = SSL_write(item->ssldata, outbuf, outlen); if (res < 0) { switch (SSL_get_error (item->ssldata, res)) { case SSL_ERROR_WANT_READ: case SSL_ERROR_WANT_WRITE: res = 0; break; } } } else { res = write(item->fd, outbuf, outlen); } item->byteswritten += res; return res; } static int socket_read(tcptest_t *item, char *inbuf, int inbufsize) { int res = 0; char errtxt[1024]; if (item->svcinfo->flags & TCP_SSL) { if (item->sslrunning) { item->sslagain = 0; res = SSL_read(item->ssldata, inbuf, inbufsize); if (res < 0) { switch (SSL_get_error (item->ssldata, res)) { case SSL_ERROR_WANT_READ: case SSL_ERROR_WANT_WRITE: item->sslagain = 1; break; default: ERR_error_string(ERR_get_error(), errtxt); dbgprintf("SSL read error %s\n", errtxt); break; } } } else { /* SSL setup failed - flag 0 bytes read. */ res = 0; } } else { res = read(item->fd, inbuf, inbufsize); if (res < 0) { dbgprintf("Read error %s\n", strerror(errno)); } } if (res > 0) item->bytesread += res; return res; } static void socket_shutdown(tcptest_t *item) { if (item->sslrunning) { SSL_shutdown(item->ssldata); SSL_free(item->ssldata); SSL_CTX_free(item->sslctx); } shutdown(item->fd, SHUT_RDWR); if (warnbytesread && (item->bytesread > warnbytesread)) { if (item->tspec) errprintf("Huge response %u bytes from %s\n", item->bytesread, item->tspec); else errprintf("Huge response %u bytes for %s:%s\n", item->bytesread, inet_ntoa(item->addr.sin_addr), item->svcinfo->svcname); } } #endif static int tcptest_compare(void **a, void **b) { tcptest_t **tcpa = (tcptest_t **)a; tcptest_t **tcpb = (tcptest_t **)b; if ((*tcpa)->randomizer < (*tcpb)->randomizer) return -1; else if ((*tcpa)->randomizer > (*tcpb)->randomizer) return 1; else return 0; } static void * tcptest_getnext(void *a) { return ((tcptest_t *)a)->next; } static void tcptest_setnext(void *a, void *newval) { ((tcptest_t *)a)->next = (tcptest_t *)newval; } void do_tcp_tests(int timeout, int concurrency) { int selres; fd_set readfds, writefds; struct timespec timestamp; int absmaxconcurrency; int activesockets = 0; /* Number of allocated sockets */ int pending = 0; /* Total number of tests */ tcptest_t *nextinqueue; /* Points to the next item to start testing */ tcptest_t *firstactive; /* Points to the first item currently being tested */ /* Thus, active connections are between firstactive..nextinqueue */ tcptest_t *item; int sockok; int maxfd; int res; socklen_t connressize; char msgbuf[4096]; struct rlimit lim; /* If timeout or concurrency are 0, set them to reasonable defaults */ if (timeout == 0) timeout = 10; /* seconds */ /* * Decide how many tests to run in parallel. * If no --concurrency set by user, default to (FD_SETSIZE / 4) - typically 256. * But never go above the ressource limit that is set, or above FD_SETSIZE. * And we save 10 fd's for stdio, libs etc. */ absmaxconcurrency = (FD_SETSIZE - 10); getrlimit(RLIMIT_NOFILE, &lim); if ((lim.rlim_cur > 10) && ((lim.rlim_cur - 10) < absmaxconcurrency)) absmaxconcurrency = (lim.rlim_cur - 10); if (concurrency == 0) concurrency = (FD_SETSIZE / 4); if (concurrency > absmaxconcurrency) concurrency = absmaxconcurrency; dbgprintf("Concurrency evaluation: rlim_cur=%lu, FD_SETSIZE=%d, absmax=%d, initial=%d\n", lim.rlim_cur, FD_SETSIZE, absmaxconcurrency, concurrency); if (shuffletests) { struct timeval tv; struct timezone tz; gettimeofday(&tv, &tz); srandom(tv.tv_usec); } /* How many tests to do ? */ for (item = thead; (item); item = item->next) { if (shuffletests) item->randomizer = random(); pending++; } if (shuffletests) thead = msort(thead, tcptest_compare, tcptest_getnext, tcptest_setnext); firstactive = nextinqueue = thead; dbgprintf("About to do %d TCP tests running %d in parallel, abs.max %d\n", pending, concurrency, absmaxconcurrency); while (pending > 0) { int slowrunning, cclimit; time_t slowtimestamp = gettimer() - SLOWLIMSECS; /* * First, see if we need to allocate new sockets and initiate connections. */ /* * We start by counting the number of tests where the latest activity * happened more than SLOWLIMSECS seconds ago. These are ignored when counting * how many more tests we can start concurrenly. But never exceed the absolute * max. number of concurrently open sockets possible. */ for (item=firstactive, slowrunning = 0; (item != nextinqueue); item=item->next) { if ((item->fd > -1) && (item->lastactive < slowtimestamp)) slowrunning++; } cclimit = concurrency + slowrunning; if (cclimit > absmaxconcurrency) cclimit = absmaxconcurrency; sockok = 1; while (sockok && nextinqueue && (activesockets < cclimit)) { /* * We need to allocate a new socket that has O_NONBLOCK set. */ nextinqueue->fd = socket(PF_INET, SOCK_STREAM, 0); sockok = (nextinqueue->fd != -1); if (sockok) { /* Set the source address */ if (nextinqueue->srcaddr) { struct sockaddr_in src; int isip; memset(&src, 0, sizeof(src)); src.sin_family = PF_INET; src.sin_port = 0; isip = (inet_aton(nextinqueue->srcaddr, (struct in_addr *) &src.sin_addr.s_addr) != 0); if (!isip) { char *envaddr = getenv(nextinqueue->srcaddr); isip = (envaddr && (inet_aton(envaddr, (struct in_addr *) &src.sin_addr.s_addr) != 0)); } if (isip) { res = bind(nextinqueue->fd, (struct sockaddr *)&src, sizeof(src)); if (res != 0) errprintf("WARNING: Could not bind to source IP %s for test %s: %s\n", nextinqueue->srcaddr, nextinqueue->tspec, strerror(errno)); } else { errprintf("WARNING: Invalid source IP %s for test %s, using default\n", nextinqueue->srcaddr, nextinqueue->tspec); } } res = fcntl(nextinqueue->fd, F_SETFL, O_NONBLOCK); if (res == 0) { /* * Initiate the connection attempt ... */ getntimer(&nextinqueue->timestart); nextinqueue->lastactive = nextinqueue->timestart.tv_sec; nextinqueue->cutoff = nextinqueue->timestart.tv_sec + timeout + 1; res = connect(nextinqueue->fd, (struct sockaddr *)&nextinqueue->addr, sizeof(nextinqueue->addr)); /* * Did it work ? */ if ((res == 0) || ((res == -1) && (errno == EINPROGRESS))) { /* This is OK - EINPROGRES and res=0 pick up status in select() */ activesockets++; tcp_stats_connects++; } else if (res == -1) { /* connect() failed. Flag the item as "not open" */ nextinqueue->connres = errno; nextinqueue->open = 0; nextinqueue->errcode = CONTEST_ENOCONN; close(nextinqueue->fd); nextinqueue->fd = -1; pending--; switch (nextinqueue->connres) { /* These may happen if connection is refused immediately */ case ECONNREFUSED : break; case EHOSTUNREACH : break; case ENETUNREACH : break; case EHOSTDOWN : break; /* Not likely ... */ case ETIMEDOUT : break; /* These should not happen. */ case EBADF : errprintf("connect returned EBADF!\n"); break; case ENOTSOCK : errprintf("connect returned ENOTSOCK!\n"); break; case EADDRNOTAVAIL: errprintf("connect returned EADDRNOTAVAIL!\n"); break; case EAFNOSUPPORT : errprintf("connect returned EAFNOSUPPORT!\n"); break; case EISCONN : errprintf("connect returned EISCONN!\n"); break; case EADDRINUSE : errprintf("connect returned EADDRINUSE!\n"); break; case EFAULT : errprintf("connect returned EFAULT!\n"); break; case EALREADY : errprintf("connect returned EALREADY!\n"); break; default : errprintf("connect returned %d for test %s, errno=%d, %s\n", res, nextinqueue->tspec, errno, strerror(errno)); } } else { /* Should NEVER happen. connect returns 0 or -1 */ errprintf("Strange result from connect: %d, for test %s, errno=%d, %s\n", res, nextinqueue->tspec, errno, strerror(errno)); } } else { /* Could net set to non-blocking mode! Hmmm ... */ sockok = 0; errprintf("Cannot set O_NONBLOCK\n"); } nextinqueue=nextinqueue->next; } else { int newconcurrency = ((activesockets > 5) ? (activesockets-1) : 5); /* Could not get a socket */ switch (errno) { case EPROTONOSUPPORT: errprintf("Cannot get socket - EPROTONOSUPPORT\n"); break; case EAFNOSUPPORT : errprintf("Cannot get socket - EAFNOSUPPORT\n"); break; case EMFILE : errprintf("Cannot get socket - EMFILE\n"); break; case ENFILE : errprintf("Cannot get socket - ENFILE\n"); break; case EACCES : errprintf("Cannot get socket - EACCESS\n"); break; case ENOBUFS : errprintf("Cannot get socket - ENOBUFS\n"); break; case ENOMEM : errprintf("Cannot get socket - ENOMEM\n"); break; case EINVAL : errprintf("Cannot get socket - EINVAL\n"); break; default : errprintf("Cannot get socket - errno=%d\n", errno); break; } if (newconcurrency != concurrency) { errprintf("Reducing --concurrency setting from %d to %d\n", concurrency, newconcurrency); concurrency = newconcurrency; } } } /* Ready to go - we have a bunch of connections being established */ dbgprintf("%d tests pending - %d active tests, %d slow tests\n", pending, activesockets, slowrunning); restartselect: /* * Setup the FDSET's */ FD_ZERO(&readfds); FD_ZERO(&writefds); maxfd = -1; for (item=firstactive; (item != nextinqueue); item=item->next) { if (item->fd > -1) { /* * WRITE events are used to signal that a * connection is ready, or it has been refused. * READ events are only interesting for sockets * that have already been found to be open, and * thus have the "readpending" flag set. * * So: On any given socket, we want either a * write-event or a read-event - never both. */ if (item->readpending) FD_SET(item->fd, &readfds); else FD_SET(item->fd, &writefds); if (item->fd > maxfd) maxfd = item->fd; } } if (maxfd == -1) { /* No active connections */ if (activesockets == 0) { /* This can happen, if we get an immediate CONNREFUSED on all connections. */ continue; } else { errprintf("contest logic error: No FD's, active=%d, pending=%d\n", activesockets, pending); continue; } } /* * Wait for something to happen: connect, timeout, banner arrives ... */ if (maxfd < 0) { errprintf("select - no active fd's found, but pending is %d\n", pending); selres = 0; } else { struct timeval tmo = { 1, 0 }; dbgprintf("Doing select with maxfd=%d\n", maxfd); selres = select((maxfd+1), &readfds, &writefds, NULL, &tmo); dbgprintf("select returned %d\n", selres); } if (selres == -1) { int selerr = errno; /* * select() failed - this is BAD! */ switch (selerr) { case EINTR : errprintf("select failed - EINTR\n"); goto restartselect; case EBADF : errprintf("select failed - EBADF\n"); break; case EINVAL: errprintf("select failed - EINVAL\n"); break; case ENOMEM: errprintf("select failed - ENOMEM\n"); break; default : errprintf("Unknown select() error %d\n", selerr); break; } /* Leave this mess ... */ errprintf("Aborting TCP tests with %d tests pending\n", pending); return; } /* selres == 0 (timeout) isn't special - just go through the list of active tests */ /* Fetch the timestamp so we can tell how long the connect took */ getntimer(×tamp); /* Now find out which connections had something happen to them */ for (item=firstactive; (item != nextinqueue); item=item->next) { if (item->fd > -1) { /* Only active sockets have this */ if (timestamp.tv_sec > item->cutoff) { /* * Request timed out. */ if (item->readpending) { /* Final read timeout - just shut this socket */ socket_shutdown(item); item->errcode = CONTEST_ETIMEOUT; } else { /* Connection timeout */ item->open = 0; item->errcode = CONTEST_ETIMEOUT; } get_totaltime(item, ×tamp); close(item->fd); item->fd = -1; activesockets--; pending--; if (item == firstactive) firstactive = item->next; } else { if (FD_ISSET(item->fd, &writefds)) { int do_talk = 1; unsigned char *outbuf = NULL; unsigned int outlen = 0; item->lastactive = timestamp.tv_sec; if (!item->open) { /* * First time here. * * Active response on this socket - either OK, or * connection refused. * We determine what happened by getting the SO_ERROR status. * (cf. select_tut(2) manpage). */ connressize = sizeof(item->connres); res = getsockopt(item->fd, SOL_SOCKET, SO_ERROR, &item->connres, &connressize); item->open = (item->connres == 0); if (!item->open) item->errcode = CONTEST_ENOCONN; do_talk = item->open; get_connectiontime(item, ×tamp); } if (item->open && (item->svcinfo->flags & TCP_SSL)) { /* * Setup the SSL connection, if not done already. * * NB: This can be triggered many times, as setup_ssl() * may need more data from the remote and return with * item->sslrunning == SSLSETUP_PENDING */ if (item->sslrunning == SSLSETUP_PENDING) { setup_ssl(item); if (item->sslrunning == 1) { /* * Update connectiontime to include * time for SSL handshake. */ get_connectiontime(item, ×tamp); } } do_talk = (item->sslrunning == 1); } /* * Connection succeeded - port is open, if SSL then the * SSL handshake is complete. * * If we have anything to send then send it. * If we want the banner, set the "readpending" flag to initiate * select() for read()'s. * NB: We want the banner EITHER if the GET_BANNER flag is set, * OR if we need it to match the expect string in the servicedef. */ item->readpending = (do_talk && !item->silenttest && ( (item->svcinfo->flags & TCP_GET_BANNER) || item->svcinfo->exptext )); if (do_talk) { if (item->telnetnegotiate && item->telnetbuflen) { /* * Return the telnet negotiate data response */ outbuf = item->telnetbuf; outlen = item->telnetbuflen; } else if (item->sendtxt && !item->silenttest) { outbuf = item->sendtxt; outlen = (item->sendlen ? item->sendlen : strlen(outbuf)); } if (outbuf && outlen) { /* * It may be that we cannot write all of the * data we want to. Tough ... */ res = socket_write(item, outbuf, outlen); tcp_stats_written += res; if (res == -1) { /* Write failed - this socket is done. */ dbgprintf("write failed\n"); item->readpending = 0; item->errcode = CONTEST_EIO; } else if (item->svcinfo->flags & TCP_HTTP) { /* * HTTP tests require us to send the full buffer. * So adjust sendtxt/sendlen accordingly. * If no more to send, switch to read-mode. */ item->sendtxt += res; item->sendlen -= res; item->readpending = (item->sendlen == 0); } } } /* If closed and/or no bannergrabbing, shut down socket */ if (item->sslrunning != SSLSETUP_PENDING) { if (!item->open || !item->readpending) { if (item->open) { socket_shutdown(item); } close(item->fd); get_totaltime(item, ×tamp); if (item->finalcallback) item->finalcallback(item->priv); item->fd = -1; activesockets--; pending--; if (item == firstactive) firstactive = item->next; } } } else if (FD_ISSET(item->fd, &readfds)) { /* * Data ready to read on this socket. Grab the * banner - we only do one read (need the socket * for other tests), so if the banner takes more * than one cycle to arrive, too bad! */ int wantmoredata = 0; int datadone = 0; item->lastactive = timestamp.tv_sec; /* * We may be in the process of setting up an SSL connection */ if (item->sslrunning == SSLSETUP_PENDING) setup_ssl(item); if (item->sslrunning == SSLSETUP_PENDING) break; /* Loop again waiting for more data */ /* * Connection is ready - plain or SSL. Read data. */ res = socket_read(item, msgbuf, sizeof(msgbuf)-1); tcp_stats_read += res; dbgprintf("read %d bytes from socket\n", res); if ((res > 0) && item->datacallback) { datadone = item->datacallback(msgbuf, res, item->priv); } if ((res > 0) && item->telnetnegotiate) { /* * telnet data has telnet options first. * We must negotiate the session before we * get the banner. */ item->telnetbuf = item->banner; item->telnetbuflen = res; /* * Safety measure: Don't loop forever doing * telnet options. * This puts a maximum on how many times * we go here. */ item->telnetnegotiate--; if (!item->telnetnegotiate) { dbgprintf("Max. telnet negotiation (%d) reached for host %s\n", MAX_TELNET_CYCLES, inet_ntoa(item->addr.sin_addr)); } if (do_telnet_options(item)) { /* Still havent seen the session banner */ item->banner = NULL; item->bannerbytes = 0; item->readpending = 0; wantmoredata = 1; } else { /* No more options - we have the banner */ item->telnetnegotiate = 0; } } if ((item->svcinfo->flags & TCP_HTTP) && ((res > 0) || item->sslagain) && (!datadone) ) { /* * HTTP : Grab the entire response. */ wantmoredata = 1; } if (!wantmoredata) { if (item->open) { socket_shutdown(item); } item->readpending = 0; close(item->fd); get_totaltime(item, ×tamp); if (item->finalcallback) item->finalcallback(item->priv); item->fd = -1; activesockets--; pending--; if (item == firstactive) firstactive = item->next; } } } } } /* end for loop */ } /* end while (pending) */ dbgprintf("TCP tests completed normally\n"); } void show_tcp_test_results(void) { tcptest_t *item; for (item = thead; (item); item = item->next) { printf("Address=%s:%d, open=%d, res=%d, err=%d, connecttime=%u.%06u, totaltime=%u.%06u, ", inet_ntoa(item->addr.sin_addr), ntohs(item->addr.sin_port), item->open, item->connres, item->errcode, (unsigned int)item->duration.tv_sec, (unsigned int)(item->duration.tv_nsec/1000), (unsigned int)item->totaltime.tv_sec, (unsigned int)(item->totaltime.tv_nsec/1000)); if (item->banner && (item->bannerbytes == strlen(item->banner))) { printf("banner='%s' (%d bytes)", textornull(item->banner), item->bannerbytes); } else { int i; unsigned char *p; for (i=0, p=item->banner; i < item->bannerbytes; i++, p++) { printf("%c", (isprint(*p) ? *p : '.')); } } if (item->certinfo) { printf(", certinfo='%s' (%u %s)", item->certinfo, (unsigned int)item->certexpires, ((item->certexpires > getcurrenttime(NULL)) ? "valid" : "expired")); } printf("\n"); if ((item->svcinfo == &svcinfo_http) || (item->svcinfo == &svcinfo_https)) { http_data_t *httptest = (http_data_t *) item->priv; printf("httpstatus = %d, open=%d, errcode=%d, parsestatus=%d\n", httptest->httpstatus, httptest->tcptest->open, httptest->tcptest->errcode, httptest->parsestatus); printf("Response:\n"); if (httptest->headers) printf("%s\n", httptest->headers); else printf("(no headers)\n"); if (httptest->contentcheck == CONTENTCHECK_DIGEST) printf("Content digest: %s\n", httptest->digest); if (httptest->output) printf("%s", httptest->output); } } } int tcp_got_expected(tcptest_t *test) { if (test == NULL) return 1; if (test->svcinfo && test->svcinfo->exptext) { int compbytes; /* Number of bytes to compare */ /* Did we get enough data? */ if (test->banner == NULL) { dbgprintf("tcp_got_expected: No data in banner\n"); return 0; } compbytes = (test->svcinfo->explen ? test->svcinfo->explen : strlen(test->svcinfo->exptext)); if ((test->svcinfo->expofs + compbytes) > test->bannerbytes) { dbgprintf("tcp_got_expected: Not enough data\n"); return 0; } return (memcmp(test->svcinfo->exptext+test->svcinfo->expofs, test->banner, compbytes) == 0); } else return 1; } #ifdef STANDALONE int main(int argc, char *argv[]) { int argi; char *argp, *p; int timeout = 0; int concurrency = 0; if (xgetenv("XYMONNETSVCS") == NULL) putenv("XYMONNETSVCS="); init_tcp_services(); for (argi=1; (argihost = hostitem; testitem->testspec = testspec; strcpy(hostitem->ip, ip); add_url_to_dns_queue(testspec); add_http_test(testitem); testitem->next = NULL; httptest = (http_data_t *)testitem->privdata; if (httptest && httptest->tcptest) { printf("TCP connection goes to %s:%d\n", inet_ntoa(httptest->tcptest->addr.sin_addr), ntohs(httptest->tcptest->addr.sin_port)); printf("Request:\n%s\n", httptest->tcptest->sendtxt); } } else if (strncmp(argp, "dns=", 4) == 0) { strbuffer_t *banner = newstrbuffer(0); int result; result = dns_test_server(ip, argp+4, banner); printf("DNS test result=%d\nBanner:%s\n", result, STRBUF(banner)); } else { add_tcp_test(ip, atoi(port), testspec, NULL, srcip, NULL, 0, NULL, NULL, NULL, NULL); } } else { printf("Invalid testspec '%s'\n", argv[argi]); } } } do_tcp_tests(timeout, concurrency); show_tcp_test_results(); return 0; } #endif xymon-4.3.28/xymonnet/httpcookies.h0000664000076400007640000000234611630612042017600 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor network test tool. */ /* */ /* Copyright (C) 2008-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __HTTPCOOKIES_H__ #define __HTTPCOOKIES_H__ typedef struct cookielist_t { char *host; int tailmatch; char *path; int secure; char *name; char *value; struct cookielist_t *next; } cookielist_t; extern cookielist_t *cookiehead; extern void *cookietree; extern void init_session_cookies(char *urlhost, char *cknam, char *ckpath, char *ckval); extern void update_session_cookies(char *hostname, char *urlhost, char *headers); extern void save_session_cookies(void); extern void load_cookies(void); #endif xymon-4.3.28/xymonnet/xymonnet.h0000664000076400007640000001717512611123532017134 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor network test tool. */ /* */ /* Copyright (C) 2003-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __XYMONNET_H__ #define __XYMONNET_H__ #include #define STATUS_CONTENTMATCH_NOFILE 901 #define STATUS_CONTENTMATCH_FAILED 902 #define STATUS_CONTENTMATCH_BADREGEX 903 #define MAX_CONTENT_DATA (1024*1024) /* 1 MB should be enough for most */ /* toolids */ enum toolid_t { TOOL_CONTEST, TOOL_DNS, TOOL_NTP, TOOL_FPING, TOOL_HTTP, TOOL_LDAP, TOOL_RPCINFO }; /* * Structure of the xymonnet in-memory records * * +->service_t * | testname * | namelen * | portnum * | toolid * | items --------------> testitem_t <----------------------------------------------+ * | next +------- service | * | | host ---------------+ * +-----------------------+ testspec | | * dialup +-->testedhost_t <------------+ | * reverse hostname | | * silenttest ip | | * alwaystrue dialup | | * open testip | | * banner nosslcert | | * certinfo dodns | | * duration dnserror | | * badtest ////////// | | * downcount repeattest | | * downstart noconn | | * privdata ----+ noping | | * next | badconn | | * | downcount | | * | downstart | | * | routerdeps | | * | deprouterdown --------+ | * | firsthttp -----------------+ * | firstldap -----------------+ * | ldapuser * | ldappasswd * | sslwarndays * | sslalarmdays * | * +---------> */ typedef struct service_t { char *testname; /* Name of the test = column name in Xymon report */ int namelen; /* Length of name - "testname:port" has this as strlen(testname), others 0 */ int portnum; /* Port number this service runs on */ enum toolid_t toolid; /* Which tool to use */ struct testitem_t *items; /* testitem_t linked list of tests for this service */ } service_t; enum multiping_t { MULTIPING_BEST, MULTIPING_WORST }; typedef struct ipping_t { char *ip; int open; strbuffer_t *banner; struct ipping_t *next; } ipping_t; typedef struct extraping_t { enum multiping_t matchtype; ipping_t *iplist; } extraping_t; typedef struct testedhost_t { char *hostname; char ip[IP_ADDR_STRLEN]; int dialup; /* dialup flag (if set, failed tests report as clear) */ int testip; /* testip flag (don't do dns lookups on hostname) */ int nosslcert; /* nosslcert flag */ int hidehttp; /* hidehttp flag */ int dodns; /* set while loading tests if we need to do a DNS lookup */ int dnserror; /* set internally if we cannot find the host's IP */ int repeattest; /* Set if this host goes on the quick poll list */ char *hosttype; /* For the "Intermediate HOSTTYPE is down" message */ /* The following are for the connectivity test */ int noconn; /* noconn flag (don't report "conn" at all */ int noping; /* noping flag (report "conn" as clear=disabled */ int badconn[3]; /* badconn:x:y:z flag */ int downcount; /* number of successive failed conn tests */ time_t downstart; /* time() of first conn failure */ char *routerdeps; /* Hosts from the "router:" tag */ struct testedhost_t *deprouterdown; /* Set if dependent router is down */ int dotrace; /* Run traceroute for this host */ strbuffer_t *traceroute;/* traceroute results */ struct extraping_t *extrapings; /* The following is for the HTTP/FTP URL tests */ struct testitem_t *firsthttp; /* First HTTP testitem in testitem list */ /* The following is for the LDAP tests */ struct testitem_t *firstldap; /* First LDAP testitem in testitem list */ char *ldapuser; /* Username */ char *ldappasswd; /* Password */ int ldapsearchfailyellow; /* Go red or yellow on failed search */ /* The following is for the SSL certificate checks */ int sslwarndays; int sslalarmdays; int mincipherbits; /* For storing the test dependency tag. */ char *deptests; } testedhost_t; typedef struct testitem_t { struct testedhost_t *host; /* Pointer to testedhost_t record for this host */ struct service_t *service; /* Pointer to service_t record for the service to test */ char *testspec; /* Pointer to the raw testspec in hosts.cfg */ int reverse; /* "!testname" flag */ int dialup; /* "?testname" flag */ int alwaystrue; /* "~testname" flag */ int silenttest; /* "testname:s" flag */ int senddata; /* For tests that merely generate a "data" report */ char *srcip; /* These data may be filled in from the test engine private data */ int open; /* Is the service open ? NB: Shows true state of service, ignores flags */ strbuffer_t *banner; char *certinfo; char *certissuer; time_t certexpires; int mincipherbits; int certkeysz; struct timespec duration; /* For badTEST handling: Need to track downtime duration and poll count */ int badtest[3]; time_t downstart; int downcount; /* Number of polls when down. */ /* Each test engine has its own data */ void *privdata; /* Private data use by test tool */ int internal; /* For internal use, not to be reported back to Xymon server */ struct testitem_t *next; } testitem_t; typedef struct dnstest_t { int testcount; int okcount; } dnstest_t; /* Custom list of status code => color overrides */ typedef struct httpstatuscolor_t { int statuscode; int color; struct httpstatuscolor_t *next; } httpstatuscolor_t; extern char *deptest_failed(testedhost_t *host, char *testname); extern int validity; #endif xymon-4.3.28/xymonnet/httpcookies.c0000664000076400007640000001240311707504633017601 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor network test tool. */ /* */ /* Copyright (C) 2008-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: httpcookies.c 6902 2012-01-24 10:36:11Z storner $"; #include #include #include #include #include "libxymon.h" #include "httpcookies.h" cookielist_t *cookiehead = NULL; void * cookietree; typedef struct hcookie_t { char *key; char *val; } hcookie_t; void init_session_cookies(char *urlhost, char *cknam, char *ckpath, char *ckval) { hcookie_t *itm; itm = (hcookie_t *)malloc(sizeof(hcookie_t)); itm->key = (char *)malloc(strlen(urlhost) + strlen(cknam) + strlen(ckpath) + 3); sprintf(itm->key, "%s\t%s\t%s", urlhost, cknam, ckpath); itm->val = strdup(ckval); xtreeAdd(cookietree, itm->key, itm); } void update_session_cookies(char *hostname, char *urlhost, char *headers) { char *ckhdr, *onecookie; if (!headers) return; ckhdr = headers; do { ckhdr = strstr(ckhdr, "\nSet-Cookie:"); if (ckhdr) { /* Set-Cookie: JSESSIONID=rKy8HZbLgT5W9N8; path=/ */ char *eoln, *cknam, *ckval, *ckpath; cknam = ckval = ckpath = NULL; onecookie = strchr(ckhdr, ':') + 1; onecookie += strspn(onecookie, " \t"); eoln = strchr(onecookie, '\n'); if (eoln) *eoln = '\0'; ckhdr = (eoln ? eoln : NULL); onecookie = strdup(onecookie); if (eoln) *eoln = '\n'; cknam = strtok(onecookie, "="); if (cknam) ckval = strtok(NULL, ";"); if (ckval) { char *tok, *key; xtreePos_t h; hcookie_t *itm; do { tok = strtok(NULL, ";\r"); if (tok) { tok += strspn(tok, " "); if (strncmp(tok, "path=", 5) == 0) { ckpath = tok+5; } } } while (tok); if (ckpath == NULL) ckpath = "/"; key = (char *)malloc(strlen(urlhost) + strlen(cknam) + strlen(ckpath) + 3); sprintf(key, "%s\t%s\t%s", urlhost, cknam, ckpath); h = xtreeFind(cookietree, key); if (h == xtreeEnd(cookietree)) { itm = (hcookie_t *)malloc(sizeof(hcookie_t)); itm->key = key; itm->val = strdup(ckval); xtreeAdd(cookietree, itm->key, itm); } else { itm = (hcookie_t *)xtreeData(cookietree, h); xfree(itm->val); itm->val = strdup(ckval); xfree(key); } } xfree(onecookie); } } while (ckhdr); } void save_session_cookies(void) { FILE *fd = NULL; char cookiefn[PATH_MAX]; xtreePos_t h; hcookie_t *itm; sprintf(cookiefn, "%s/etc/cookies.session", xgetenv("XYMONHOME")); fd = fopen(cookiefn, "w"); if (fd == NULL) return; for (h=xtreeFirst(cookietree); (h != xtreeEnd(cookietree)); h = xtreeNext(cookietree, h)) { char *urlhost, *ckpath, *cknam; itm = (hcookie_t *)xtreeData(cookietree, h); urlhost = strtok(itm->key, "\t"); cknam = strtok(NULL, "\t"); ckpath = strtok(NULL, "\t"); fprintf(fd, "%s\tFALSE\t%s\tFALSE\t0\t%s\t%s\n", urlhost, ckpath, cknam, itm->val); } fclose(fd); } /* This loads the cookies from the cookie-storage file */ static void load_cookies_one(char *cookiefn) { FILE *fd; char l[4096]; char *c_host, *c_path, *c_name, *c_value; int c_tailmatch, c_secure; time_t c_expire; char *p; fd = fopen(cookiefn, "r"); if (fd == NULL) return; c_host = c_path = c_name = c_value = NULL; c_tailmatch = c_secure = 0; c_expire = 0; while (fgets(l, sizeof(l), fd)) { p = strchr(l, '\n'); if (p) { *p = '\0'; p--; if ((p > l) && (*p == '\r')) *p = '\0'; } if ((l[0] != '#') && strlen(l)) { int fieldcount = 0; p = strtok(l, "\t"); if (p) { fieldcount++; c_host = p; p = strtok(NULL, "\t"); } if (p) { fieldcount++; c_tailmatch = (strcmp(p, "TRUE") == 0); p = strtok(NULL, "\t"); } if (p) { fieldcount++; c_path = p; p = strtok(NULL, "\t"); } if (p) { fieldcount++; c_secure = (strcmp(p, "TRUE") == 0); p = strtok(NULL, "\t"); } if (p) { fieldcount++; c_expire = atol(p); p = strtok(NULL, "\t"); } if (p) { fieldcount++; c_name = p; p = strtok(NULL, "\t"); } if (p) { fieldcount++; c_value = p; p = strtok(NULL, "\t"); } if ((fieldcount == 7) && (c_expire > getcurrenttime(NULL))) { /* We have a valid cookie */ cookielist_t *ck = (cookielist_t *)malloc(sizeof(cookielist_t)); ck->host = strdup(c_host); ck->tailmatch = c_tailmatch; ck->path = strdup(c_path); ck->secure = c_secure; ck->name = strdup(c_name); ck->value = strdup(c_value); ck->next = cookiehead; cookiehead = ck; } } } fclose(fd); } void load_cookies(void) { static int initdone = 0; char cookiefn[PATH_MAX]; if (initdone) return; initdone = 1; sprintf(cookiefn, "%s/etc/cookies", xgetenv("XYMONHOME")); load_cookies_one(cookiefn); sprintf(cookiefn, "%s/etc/cookies.session", xgetenv("XYMONHOME")); load_cookies_one(cookiefn); } xymon-4.3.28/xymonnet/c-ares-shim.sh0000775000076400007640000000100012524545555017545 0ustar rpmbuildrpmbuild#!/bin/sh # Separate $CFLAGS and $CPPFLAGS for c-ares, which is now a bit more strict about things # # This will be moot if we get around to autoconfiscating the build process. # for i in $CFLAGS; do if [ `echo $i | grep -c '\-I'` -eq 0 -a `echo $i | grep -c '\-D'` -eq 0 -a `echo $i | grep -c '\-L'` -eq 0 ]; then CFF="$CFF $i" elif [ `echo $i | grep -c '\-L'` -eq 0 ]; then CPF="$CPF $i" else echo "REJECTING '${i}' in CFLAGS" fi done CFLAGS="$CFF" CPPFLAGS="$CPF" $* xymon-4.3.28/xymonnet/ldaptest.c0000664000076400007640000004031012603243142017052 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor network test tool. */ /* */ /* This is used to implement the testing of an LDAP service. */ /* */ /* Copyright (C) 2003-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: ldaptest.c 7678 2015-10-01 14:42:42Z jccleaver $"; #include #include #include #include #include #include #include #include #include "libxymon.h" #include "xymonnet.h" #include "ldaptest.h" #define XYMON_LDAP_OK 0 #define XYMON_LDAP_INITFAIL 10 #define XYMON_LDAP_TLSFAIL 11 #define XYMON_LDAP_BINDFAIL 20 #define XYMON_LDAP_TIMEOUT 30 #define XYMON_LDAP_SEARCHFAILED 40 char *ldap_library_version = NULL; static volatile int connect_timeout = 0; int init_ldap_library(void) { #ifdef HAVE_LDAP char versionstring[100]; /* Doesnt really do anything except define the version-number string */ sprintf(versionstring, "%s %d", LDAP_VENDOR_NAME, LDAP_VENDOR_VERSION); ldap_library_version = strdup(versionstring); #endif return 0; } void shutdown_ldap_library(void) { #ifdef HAVE_LDAP /* No-op for LDAP */ #endif } int add_ldap_test(testitem_t *t) { #ifdef HAVE_LDAP testitem_t *basecheck; ldap_data_t *req; LDAPURLDesc *ludp; char *urltotest; int badurl; basecheck = (testitem_t *)t->privdata; /* * t->testspec containts the full testspec * We need to remove any URL-encoding. */ urltotest = urlunescape(t->testspec); badurl = (ldap_url_parse(urltotest, &ludp) != 0); /* Allocate the private data and initialize it */ t->privdata = (void *) calloc(1, sizeof(ldap_data_t)); req = (ldap_data_t *) t->privdata; req->ldapdesc = (void *) ludp; req->usetls = (strncmp(urltotest, "ldaps:", 6) == 0); if (req->usetls && (ludp->lud_port == LDAPS_PORT)) { dbgprintf("Forcing port %d for ldaps with STARTTLS\n", LDAP_PORT ); ludp->lud_port = LDAP_PORT; } req->ldapstatus = 0; req->output = NULL; req->ldapcolor = -1; req->faileddeps = NULL; req->duration.tv_sec = req->duration.tv_nsec = 0; req->certinfo = NULL; req->certissuer = NULL; req->certexpires = 0; req->certkeysz = 0; req->skiptest = 0; if (badurl) { errprintf("Invalid LDAP URL %s\n", t->testspec); req->skiptest = 1; req->ldapstatus = XYMON_LDAP_BINDFAIL; req->output = "Cannot parse LDAP URL"; } /* * At this point, the plain TCP checks have already run. * So we know from the test found in t->privdata whether * the LDAP port is open. * If it is not open, then don't run this check. */ if (basecheck->open == 0) { /* Cannot connect to LDAP port. */ req->skiptest = 1; req->ldapstatus = XYMON_LDAP_BINDFAIL; req->output = "Cannot connect to server"; } #endif return 0; } #if (LDAP_VENDOR != OpenLDAP) || !defined(LDAP_OPT_NETWORK_TIMEOUT) static void ldap_alarmhandler(int signum) { signal(signum, SIG_DFL); connect_timeout = 1; } #endif void run_ldap_tests(service_t *ldaptest, int sslcertcheck, int querytimeout) { #ifdef HAVE_LDAP ldap_data_t *req; testitem_t *t; struct timespec starttime; struct timespec endtime; /* Pick a sensible default for the timeout setting */ if (querytimeout == 0) querytimeout = 30; for (t = ldaptest->items; (t); t = t->next) { LDAPURLDesc *ludp; LDAP *ld; int rc, finished; int msgID = -1; struct timeval ldaptimeout; struct timeval openldaptimeout; LDAPMessage *result; LDAPMessage *e; strbuffer_t *response; char buf[MAX_LINE_LEN]; req = (ldap_data_t *) t->privdata; if (req->skiptest) continue; ludp = (LDAPURLDesc *) req->ldapdesc; getntimer(&starttime); /* Initiate session with the LDAP server */ dbgprintf("Initiating LDAP session for host %s port %d\n", ludp->lud_host, ludp->lud_port); if( (ld = ldap_init(ludp->lud_host, ludp->lud_port)) == NULL ) { dbgprintf("ldap_init failed\n"); req->ldapstatus = XYMON_LDAP_INITFAIL; continue; } /* * There is apparently no standard way of defining a network * timeout for the initial connection setup. */ #if (LDAP_VENDOR == OpenLDAP) && defined(LDAP_OPT_NETWORK_TIMEOUT) /* * OpenLDAP has an undocumented ldap_set_option(ld, LDAP_OPT_NETWORK_TIMEOUT, &tv) */ openldaptimeout.tv_sec = querytimeout; openldaptimeout.tv_usec = 0; ldap_set_option(ld, LDAP_OPT_NETWORK_TIMEOUT, &openldaptimeout); #else /* * So using an alarm() to interrupt any pending operations * seems to be the least insane way of doing this. * * Note that we must do this right after ldap_init(), as * any operation on the session handle (ld) may trigger the * network connection to be established. */ connect_timeout = 0; signal(SIGALRM, ldap_alarmhandler); alarm(querytimeout); #endif /* * This is completely undocumented in the OpenLDAP docs. * But apparently it is documented in * http://www.ietf.org/proceedings/99jul/I-D/draft-ietf-ldapext-ldap-c-api-03.txt * * Both of these routines appear in the file * from OpenLDAP 2.1.22. Their use to enable TLS has * been deciphered from the ldapsearch() utility * sourcecode. * * According to Manon Goo , recent (Jan. 2005) * OpenLDAP implementations refuse to talk LDAPv2. */ #ifdef LDAP_OPT_PROTOCOL_VERSION { int protocol = LDAP_VERSION3; dbgprintf("Attempting to select LDAPv3\n"); if ((rc = ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION, &protocol)) != LDAP_SUCCESS) { dbgprintf("Failed to select LDAPv3, trying LDAPv2\n"); protocol = LDAP_VERSION2; if ((rc = ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION, &protocol)) != LDAP_SUCCESS) { req->output = strdup(ldap_err2string(rc)); req->ldapstatus = XYMON_LDAP_TLSFAIL; } continue; } } #endif if (req->usetls) { dbgprintf("Trying to enable TLS for session\n"); if ((rc = ldap_start_tls_s(ld, NULL, NULL)) != LDAP_SUCCESS) { dbgprintf("ldap_start_tls failed\n"); req->output = strdup(ldap_err2string(rc)); req->ldapstatus = XYMON_LDAP_TLSFAIL; continue; } } if (!connect_timeout) { msgID = ldap_simple_bind(ld, (t->host->ldapuser ? t->host->ldapuser : ""), (t->host->ldappasswd ? t->host->ldappasswd : "")); } /* Cancel any pending alarms */ alarm(0); signal(SIGALRM, SIG_DFL); /* Did we connect? */ if (connect_timeout || (msgID == -1)) { req->ldapstatus = XYMON_LDAP_BINDFAIL; req->output = "Cannot connect to server"; continue; } /* Wait for bind to complete */ rc = 0; finished = 0; ldaptimeout.tv_sec = querytimeout; ldaptimeout.tv_usec = 0L; while( ! finished ) { int rc2; rc = ldap_result(ld, msgID, LDAP_MSG_ONE, &ldaptimeout, &result); dbgprintf("ldap_result returned %d for ldap_simple_bind()\n", rc); if(rc == -1) { finished = 1; req->ldapstatus = XYMON_LDAP_BINDFAIL; if (result == NULL) { errprintf("LDAP library problem - NULL result returned\n"); req->output = strdup("LDAP BIND failed\n"); } else { rc2 = ldap_result2error(ld, result, 1); req->output = strdup(ldap_err2string(rc2)); } ldap_unbind(ld); } else if (rc == 0) { finished = 1; req->ldapstatus = XYMON_LDAP_BINDFAIL; req->output = strdup("Connection timeout"); ldap_unbind(ld); } else if( rc > 0 ) { finished = 1; if (result == NULL) { errprintf("LDAP library problem - got a NULL resultcode for status %d\n", rc); req->ldapstatus = XYMON_LDAP_BINDFAIL; req->output = strdup("LDAP library problem: ldap_result2error returned a NULL result for status %d\n"); ldap_unbind(ld); } else { rc2 = ldap_result2error(ld, result, 1); if(rc2 != LDAP_SUCCESS) { req->ldapstatus = XYMON_LDAP_BINDFAIL; req->output = strdup(ldap_err2string(rc)); ldap_unbind(ld); } } } } /* ... while() */ /* We're done connecting. If something went wrong, go to next query. */ if (req->ldapstatus != 0) continue; /* Now do the search. With a timeout */ ldaptimeout.tv_sec = querytimeout; ldaptimeout.tv_usec = 0L; rc = ldap_search_st(ld, ludp->lud_dn, ludp->lud_scope, ludp->lud_filter, ludp->lud_attrs, 0, &ldaptimeout, &result); if(rc == LDAP_TIMEOUT) { req->ldapstatus = XYMON_LDAP_TIMEOUT; req->output = strdup(ldap_err2string(rc)); ldap_unbind(ld); continue; } if( rc != LDAP_SUCCESS ) { req->ldapstatus = XYMON_LDAP_SEARCHFAILED; req->output = strdup(ldap_err2string(rc)); ldap_unbind(ld); continue; } getntimer(&endtime); response = newstrbuffer(0); sprintf(buf, "Searching LDAP for %s yields %d results:\n\n", t->testspec, ldap_count_entries(ld, result)); addtobuffer(response, buf); for(e = ldap_first_entry(ld, result); (e != NULL); e = ldap_next_entry(ld, e) ) { char *dn; BerElement *ber; char *attribute; char **vals; dn = ldap_get_dn(ld, e); sprintf(buf, "DN: %s\n", dn); addtobuffer(response, buf); /* Addtributes and values */ for (attribute = ldap_first_attribute(ld, e, &ber); (attribute != NULL); attribute = ldap_next_attribute(ld, e, ber) ) { if ((vals = ldap_get_values(ld, e, attribute)) != NULL) { int i; for(i = 0; (vals[i] != NULL); i++) { sprintf(buf, "\t%s: %s\n", attribute, vals[i]); addtobuffer(response, buf); } } /* Free memory used to store values */ ldap_value_free(vals); } /* Free memory used to store attribute */ ldap_memfree(attribute); ldap_memfree(dn); if (ber != NULL) ber_free(ber, 0); addtobuffer(response, "\n"); } req->ldapstatus = XYMON_LDAP_OK; req->output = grabstrbuffer(response); tvdiff(&starttime, &endtime, &req->duration); ldap_msgfree(result); ldap_unbind(ld); ldap_free_urldesc(ludp); } #endif } static int statuscolor(testedhost_t *host, int ldapstatus) { switch (ldapstatus) { case XYMON_LDAP_OK: return COL_GREEN; case XYMON_LDAP_INITFAIL: case XYMON_LDAP_TLSFAIL: case XYMON_LDAP_BINDFAIL: case XYMON_LDAP_TIMEOUT: return COL_RED; case XYMON_LDAP_SEARCHFAILED: return (host->ldapsearchfailyellow ? COL_YELLOW : COL_RED); } errprintf("Unknown ldapstaus value %d\n", ldapstatus); return COL_RED; } void send_ldap_results(service_t *ldaptest, testedhost_t *host, char *nonetpage, int failgoesclear) { testitem_t *t; int color = -1; char msgline[4096]; char *nopagename; int nopage = 0; testitem_t *ldap1 = host->firstldap; int anydown = 0; char *svcname; if (ldap1 == NULL) return; svcname = strdup(ldaptest->testname); if (ldaptest->namelen) svcname[ldaptest->namelen] = '\0'; /* Check if this service is a NOPAGENET service. */ nopagename = (char *) malloc(strlen(svcname)+3); sprintf(nopagename, ",%s,", svcname); nopage = (strstr(nonetpage, svcname) != NULL); xfree(nopagename); dbgprintf("Calc ldap color host %s : ", host->hostname); for (t=host->firstldap; (t && (t->host == host)); t = t->next) { ldap_data_t *req = (ldap_data_t *) t->privdata; req->ldapcolor = statuscolor(host, req->ldapstatus); if (req->ldapcolor == COL_RED) anydown++; /* Dialup hosts and dialup tests report red as clear */ if ((req->ldapcolor != COL_GREEN) && (host->dialup || t->dialup)) req->ldapcolor = COL_CLEAR; /* If ping failed, report CLEAR unless alwaystrue */ if ( ((req->ldapcolor == COL_RED) || (req->ldapcolor == COL_YELLOW)) && /* Test failed */ (host->downcount > 0) && /* The ping check did fail */ (!host->noping && !host->noconn) && /* We are doing a ping test */ (failgoesclear) && (!t->alwaystrue) ) /* No "~testname" flag */ { req->ldapcolor = COL_CLEAR; } /* If test we depend on has failed, report CLEAR unless alwaystrue */ if ( ((req->ldapcolor == COL_RED) || (req->ldapcolor == COL_YELLOW)) && /* Test failed */ failgoesclear && !t->alwaystrue ) /* No "~testname" flag */ { char *faileddeps = deptest_failed(host, t->service->testname); if (faileddeps) { req->ldapcolor = COL_CLEAR; req->faileddeps = strdup(faileddeps); } } dbgprintf("%s(%s) ", t->testspec, colorname(req->ldapcolor)); if (req->ldapcolor > color) color = req->ldapcolor; } if (anydown) ldap1->downcount++; else ldap1->downcount = 0; /* Handle the "badtest" stuff for ldap tests */ if ((color == COL_RED) && (ldap1->downcount < ldap1->badtest[2])) { if (ldap1->downcount >= ldap1->badtest[1]) color = COL_YELLOW; else if (ldap1->downcount >= ldap1->badtest[0]) color = COL_CLEAR; else color = COL_GREEN; } if (nopage && (color == COL_RED)) color = COL_YELLOW; dbgprintf(" --> %s\n", colorname(color)); /* Send off the ldap status report */ init_status(color); sprintf(msgline, "status+%d %s.%s %s %s", validity, commafy(host->hostname), svcname, colorname(color), timestamp); addtostatus(msgline); for (t=host->firstldap; (t && (t->host == host)); t = t->next) { ldap_data_t *req = (ldap_data_t *) t->privdata; sprintf(msgline, "\n&%s %s - %s\n\n", colorname(req->ldapcolor), t->testspec, ((req->ldapcolor != COL_GREEN) ? "failed" : "OK")); addtostatus(msgline); if (req->output) { addtostatus(req->output); addtostatus("\n\n"); } if (req->faileddeps) addtostatus(req->faileddeps); sprintf(msgline, "\nSeconds: %u.%.9ld\n", (unsigned int)req->duration.tv_sec, req->duration.tv_nsec); addtostatus(msgline); } addtostatus("\n"); finish_status(); xfree(svcname); } void show_ldap_test_results(service_t *ldaptest) { ldap_data_t *req; testitem_t *t; for (t = ldaptest->items; (t); t = t->next) { req = (ldap_data_t *) t->privdata; printf("URL : %s\n", t->testspec); printf("Time spent : %u.%.9ld\n", (unsigned int)req->duration.tv_sec, req->duration.tv_nsec); printf("LDAP output:\n%s\n", textornull(req->output)); printf("------------------------------------------------------\n"); } } #ifdef STANDALONE /* These are dummy vars needed by stuff in util.c */ hostlist_t *hosthead = NULL; link_t *linkhead = NULL; link_t null_link = { "", "", "", NULL }; char *deptest_failed(testedhost_t *host, char *testname) { return NULL; } int main(int argc, char *argv[]) { testitem_t item; testedhost_t host; service_t ldapservice; int argi = 1; int ldapdebug = 0; while ((argi < argc) && (strncmp(argv[argi], "--", 2) == 0)) { if (strcmp(argv[argi], "--debug") == 0) { debug = 1; } else if (strncmp(argv[argi], "--ldapdebug=", strlen("--ldapdebug=")) == 0) { char *p = strchr(argv[argi], '='); ldapdebug = atoi(p+1); } argi++; } /* For testing, don't crash in sendmsg when no XYMSRV defined */ dontsendmessages = 1; if (xgetenv("XYMSRV") == NULL) putenv("XYMSRV=127.0.0.1"); memset(&item, 0, sizeof(item)); memset(&host, 0, sizeof(host)); memset(&ldapservice, 0, sizeof(ldapservice)); ldapservice.portnum = 389; ldapservice.testname = "ldap"; ldapservice.namelen = strlen(ldapservice.testname); ldapservice.items = &item; item.host = &host; item.service = &ldapservice; item.dialup = item.reverse = item.silenttest = item.alwaystrue = 0; item.testspec = urlunescape(argv[argi]); host.firstldap = &item; host.hostname = "ldaptest.xymon"; host.ldapuser = NULL; host.ldappasswd = NULL; init_ldap_library(); if (ldapdebug) { #if defined(LBER_OPT_DEBUG_LEVEL) && defined(LDAP_OPT_DEBUG_LEVEL) ber_set_option(NULL, LBER_OPT_DEBUG_LEVEL, &ldapdebug); ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, &ldapdebug); #else printf("LDAP library does not support change of debug level\n"); #endif } if (add_ldap_test(&item) == 0) { run_ldap_tests(&ldapservice, 0, 10); combo_start(); send_ldap_results(&ldapservice, &host, "", 0); combo_end(); } shutdown_ldap_library(); return 0; } #endif xymon-4.3.28/xymonnet/contest.h0000664000076400007640000001517513005713337016736 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor network test tool. */ /* */ /* This is used to implement the testing of a TCP service. */ /* */ /* Copyright (C) 2003-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __CONTEST_H_ #define __CONTEST_H_ #include #include #include #include #include #include #ifdef HAVE_OPENSSL /* * OpenSSL defs. We require OpenSSL 0.9.5 or later * as some of the routines we use are not available * in earlier versions. */ #include #include #include #include #if !defined(OPENSSL_VERSION_NUMBER) || (OPENSSL_VERSION_NUMBER < 0x00905000L) #error SSL-protocol testing requires OpenSSL version 0.9.5 or later #endif #else /* * xymonnet without support for SSL protocols. */ #undef TCP_SSL #define TCP_SSL 0x0000 #define SSL_CTX void #define SSL void #endif #include "libxymon.h" extern char *ssl_library_version; extern char *ciphershigh; extern char *ciphersmedium; extern unsigned int warnbytesread; extern int shuffletests; extern int sslincludecipherlist; extern int sslshowallciphers; extern int snienabled; #define SSLVERSION_DEFAULT 0 #define SSLVERSION_V2 1 #define SSLVERSION_V3 2 #define SSLVERSION_TLS10 3 #define SSLVERSION_TLS11 4 #define SSLVERSION_TLS12 5 typedef struct { char *cipherlist; int sslversion; char *clientcert; } ssloptions_t; typedef int (*f_callback_data)(unsigned char *buffer, unsigned int size, void *privdata); typedef void (*f_callback_final)(void *privdata); #define CONTEST_ENOERROR 0 #define CONTEST_ETIMEOUT 1 #define CONTEST_ENOCONN 2 #define CONTEST_EDNS 3 #define CONTEST_EIO 4 #define CONTEST_ESSL 5 typedef struct tcptest_t { struct sockaddr_in addr; /* Address (IP+port) to test */ char *srcaddr; struct svcinfo_t *svcinfo; /* svcinfo_t for service */ long int randomizer; int fd; /* Socket filedescriptor */ time_t lastactive; time_t cutoff; char *tspec; unsigned int bytesread; unsigned int byteswritten; /* Connection info */ int connres; /* connect() status returned */ int open; /* Result - is it open? */ int errcode; /* Pick up any errors */ struct timespec timestart; /* Starttime of connection attempt */ struct timespec duration; /* Duration of connection attempt */ struct timespec totaltime; /* Duration of the full transfer */ /* Data we send */ unsigned char *sendtxt; unsigned int sendlen; /* For grabbing banners */ int silenttest; /* Banner grabbing can be disabled per test */ int readpending; /* Temp status while reading banner */ unsigned char *banner; /* Banner text from service */ unsigned int bannerbytes; /* Number of bytes in banner */ /* For testing SSL-wrapped services */ ssloptions_t *ssloptions; /* Specific SSL options requested by user */ char *sni; SSL_CTX *sslctx; /* SSL context pointer */ SSL *ssldata; /* SSL data (socket) pointer */ char *certinfo; /* Certificate info (subject+expiretime) */ time_t certexpires; /* Expiretime in time_t format */ char *certsubject; char *certissuer; int certkeysz; int mincipherbits; /* Bits in the weakest encryption supported */ int sslrunning; /* Track state of an SSL session */ int sslagain; /* SSL read/write needs more data */ /* For testing telnet services */ unsigned char *telnetbuf; /* Buffer for telnet option negotiation */ int telnetbuflen; /* Length of telnetbuf - it's binary, so no strlen */ int telnetnegotiate; /* Flag telling if telnet option negotiation is being done */ /* For testing http services */ void *priv; f_callback_data datacallback; f_callback_final finalcallback; struct tcptest_t *next; } tcptest_t; #define CONTENTCHECK_NONE 0 #define CONTENTCHECK_REGEX 1 #define CONTENTCHECK_DIGEST 2 #define CONTENTCHECK_NOREGEX 3 #define CONTENTCHECK_CONTENTTYPE 4 #define HTTPVER_ANY 0 #define HTTPVER_10 1 #define HTTPVER_11 2 #define CHUNK_NOTCHUNKED 0 #define CHUNK_INIT 1 #define CHUNK_GETLEN 2 #define CHUNK_SKIPLENCR 3 #define CHUNK_DATA 4 #define CHUNK_SKIPENDCR 5 #define CHUNK_DONE 6 #define CHUNK_NOMORE 7 typedef struct { tcptest_t *tcptest; char *url; /* URL to request, stripped of configuration artefacts */ int parsestatus; weburl_t weburl; int gotheaders; int contlen; int chunkstate; unsigned int leftinchunk; unsigned char *headers; /* HTTP headers from server */ unsigned int hdrlen; unsigned char *output; /* Data from server */ unsigned int outlen; int httpstatus; /* HTTP status from server */ char *contenttype; /* Content-type: header from server */ int contentcheck; /* 0=no content check, 1=regex check, 2=digest check */ void *exp; /* data for content match (digest, or regexp data) */ digestctx_t *digestctx; /* OpenSSL data for digest handling */ char *digest; /* Digest of the data received from the server */ long contstatus; /* Pseudo HTTP status for content check */ /* Used during status-reporting */ int httpcolor; /* Color of this HTTP test */ char *errorcause; char *faileddeps; /* List of failed dependency checks */ } http_data_t; extern unsigned long tcp_stats_read; extern unsigned long tcp_stats_written; extern unsigned int tcp_stats_total; extern unsigned int tcp_stats_http; extern unsigned int tcp_stats_plain; extern unsigned int tcp_stats_connects; extern char *init_tcp_services(void); extern int default_tcp_port(char *svcname); extern void dump_tcp_services(void); extern tcptest_t *add_tcp_test(char *ip, int port, char *service, ssloptions_t *sslopt, char *srcip, char *tspec, int silent, unsigned char *reqmsg, void *priv, f_callback_data datacallback, f_callback_final finalcallback); extern void do_tcp_tests(int timeout, int concurrency); extern void show_tcp_test_results(void); extern int tcp_got_expected(tcptest_t *test); #endif xymon-4.3.28/xymonnet/protocols.cfg0000664000076400007640000001272012611140603017574 0ustar rpmbuildrpmbuild# protocols.cfg # # $Id: protocols.cfg 7700 2015-10-19 10:10:11Z jccleaver $ # # This file defines the way TCP services are tested by xymonnet # # A service definition looks like this: # [NAME] # send "HELLO" # expect "OK" # options banner,ssl,telnet # port PORTNUMBER # # The NAME is the name of the test, and of the TCP service. If # multiple tests share a common definition (e.g. ssh, ssh1, ssh2) # then these may be given as "[NAME1|NAME2|NAME3]" # # If the send-string is defined, this data is sent to the service # immediately after a connect. # # If the expect-string is defined, any data returned by the service is # matched against this. If it matches, the status will be green; if it # does not match, the status will turn yellow. Only if the service does # not respond at all will the status go red. If a expect-string is not # defined, the status will always be green if it is possible to connect # to the service. # # The options can include "banner" (to grab the banner from the # service), "telnet" (telnet options are to be negotiated), and # "ssl" (perform an SSL/TLS handshake and pick up the SSL certificate). # # The "port" is the TCP port used for this service. This OVERRIDES # any port number listed in /etc/services - but this also means that # you need not define "unusual" port-numbers in /etc/services. # Of course, you can always define your test in hosts.cfg to use a # specific portnumber. # # The send/expect string definitions must be in double quotes. # The sequences "\r", "\n", "\t" and "\xNN" are recognized and # converted into a carriage-return (ASCII 13), line-feed (ASCII 10), # TAB (ASCII 8), and any byte respectively (NN=hex value). [ftp] send "quit\r\n" expect "220" options banner port 21 [ftps] send "quit\r\n" expect "220" options ssl,banner port 990 [ssh|ssh1|ssh2] send "SSH-2.0-OpenSSH_4.1\r\n" expect "SSH" options banner port 22 [telnet] options banner,telnet port 23 [telnets] options ssl,banner,telnet port 992 [smtp] send "mail\r\nquit\r\n" expect "220" options banner port 25 [smtps] send "mail\r\nquit\r\n" expect "220" options ssl,banner # No default port-number assignment for smtps - nonstandard according to IANA [submission|msa] send "ehlo xymonnet.localdomain\r\nmail\r\nquit\r\n" expect "220" options banner port 587 [pop2|pop-2] send "quit\r\n" expect "+OK" options banner port 109 [pop|pop3|pop-3] send "quit\r\n" expect "+OK" options banner port 110 [pop3s] send "quit\r\n" expect "+OK" options ssl,banner port 995 [imap|imap2|imap4] send "ABC123 LOGOUT\r\n" expect "* OK" options banner port 143 [imap3] send "ABC123 LOGOUT\r\n" expect "* OK" options banner port 220 [imaps] send "ABC123 LOGOUT\r\n" expect "* OK" options ssl,banner port 993 [nntp] send "quit\r\n" expect "200" options banner port 119 [nntps] send "quit\r\n" expect "200" options ssl,banner port 563 [ldap] port 389 [ldaps] options ssl port 636 [rsync] expect "@RSYNCD" options banner port 873 [bbd] # send "ping" # expect "xymond" send "dummy" port 1984 # The AV scanning daemon from the ClamAV antivirus package [clamd] send "PING\n" expect "PONG" options banner port 3310 # SpamAssassin spamd [spamd] send "PING SPAMC/Xymon\n" expect "SPAMD" options banner port 783 # From Mark Felder [svn] expect "( success" options banner port 3690 # From http://www.mail-archive.com/whatsup_forum@list.ipswitch.com/msg06678.html [oratns] send "\x00\x57\x00\x00\x01\x00\x00\x00\x01\x36\x01\x2C\x00\x00\x08\x00\x7F\xFF\xA3\x0A\x00\x00\x01\x00\x00\x1D\x00\x3A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x08\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00(CONNECT_DATA=(COMMAND=ping))" options banner port 1521 # qmail "Quick Mail Transfer Protocol" [qmtp] port 209 # qmail "Quick Mail Queuing Protocol" [qmqp] port 628 # Advanced Message Queuing Protocol [amqp] send "PING\r\n\r\n" expect "AMQP" options banner # Advanced Message Queuing Protocol over SSL [amqps] send "PING\r\n\r\n\r\n\r\n" expect "AMQP" options ssl,banner # vnc "Virtual Network Computing" - method from bb-vnc.tar.gz # From Richard Finegold [vnc] send "RFB 000.000\r\n" expect "RFB " options banner port 5900 # CUPS print server. It answers to HTTP requests. [cupsd] send "GET /printers\r\n" expect "HTTP/1.1 200 OK" port 631 # AJP (Apache JServ Protocol) 1.3 - sends an AJP "ping" request. # Ref: http://tomcat.apache.org/connectors-doc/common/ajpv13a.html # From Charles Goyard [ajp13] send "\x12\x34\x00\x01\x0a" expect "\x41\x42\x00\x01\x09" port 8009 # Microsoft Terminal Services / Remote Desktop Protocol # Originally From Chris Wopat (http://www.xymon.com/archive/2010/01/msg00039.html) # Updated By Rob Steuer for current versions of RDP [rdp] port 3389 send "\x03\x00\x00\x13\x0e\xe0\x00\x00\x00\x00\x00\x01\x00\x08\x00\x0b\x00\x00\x00" expect "\x03\x00\x00\x13\x0e\xd0\x00\x00\x12\x34" # NETBIOS Session Service for NT Authentication [netbios-ssn] port 139 # Simple Network Paging Protocol (SNPP) [snpp] send "quit\r\n" expect "220" options banner port 444 # Internet Relay Chat [ircd] send "NICK xymonnet\r\nUSER xymond 0 * :Xymonnet\r\nTIME\r\nVERSION\r\nQUIT\r\n" options banner port 6667 # de facto ircd port is 6667 # line printer spooler (lpd) [lpd] port 515 xymon-4.3.28/xymonnet/dns2.c0000664000076400007640000003563512603243142016116 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor network test tool. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: dns2.c 7678 2015-10-01 14:42:42Z jccleaver $"; /* * All of the code for parsing DNS responses and formatting these into * text were taken from the "adig.c" source-file included with the * C-ARES 1.2.0 library. This file carries the following copyright * notice, reproduced in full: * * -------------------------------------------------------------------- * Copyright 1998 by the Massachusetts Institute of Technology. * * Permission to use, copy, modify, and distribute this * software and its documentation for any purpose and without * fee is hereby granted, provided that the above copyright * notice appear in all copies and that both that copyright * notice and this permission notice appear in supporting * documentation, and that the name of M.I.T. not be used in * advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * M.I.T. makes no representations about the suitability of * this software for any purpose. It is provided "as is" * without express or implied warranty. * -------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include "libxymon.h" #include #include #include #include "dns2.h" /* Some systems (AIX, HP-UX) don't know the DNS T_SRV record */ #ifndef T_SRV #define T_SRV 33 #endif static char msg[1024]; static const unsigned char *display_question(const unsigned char *aptr, const unsigned char *abuf, int alen, dns_resp_t *response); static const unsigned char *display_rr(const unsigned char *aptr, const unsigned char *abuf, int alen, dns_resp_t *response); static const char *type_name(int type); static const char *class_name(int dnsclass); struct nv { const char *name; int value; }; static const struct nv flags[] = { { "usevc", ARES_FLAG_USEVC }, { "primary", ARES_FLAG_PRIMARY }, { "igntc", ARES_FLAG_IGNTC }, { "norecurse", ARES_FLAG_NORECURSE }, { "stayopen", ARES_FLAG_STAYOPEN }, { "noaliases", ARES_FLAG_NOALIASES } }; static const int nflags = sizeof(flags) / sizeof(flags[0]); static const struct nv classes[] = { { "IN", C_IN }, { "CHAOS", C_CHAOS }, { "HS", C_HS }, { "ANY", C_ANY } }; static const int nclasses = sizeof(classes) / sizeof(classes[0]); static const struct nv types[] = { { "A", T_A }, { "NS", T_NS }, { "MD", T_MD }, { "MF", T_MF }, { "CNAME", T_CNAME }, { "SOA", T_SOA }, { "MB", T_MB }, { "MG", T_MG }, { "MR", T_MR }, { "NULL", T_NULL }, { "WKS", T_WKS }, { "PTR", T_PTR }, { "HINFO", T_HINFO }, { "MINFO", T_MINFO }, { "MX", T_MX }, { "TXT", T_TXT }, { "RP", T_RP }, { "AFSDB", T_AFSDB }, { "X25", T_X25 }, { "ISDN", T_ISDN }, { "RT", T_RT }, { "NSAP", T_NSAP }, { "NSAP_PTR", T_NSAP_PTR }, { "SIG", T_SIG }, { "KEY", T_KEY }, { "PX", T_PX }, { "GPOS", T_GPOS }, { "AAAA", T_AAAA }, { "LOC", T_LOC }, { "SRV", T_SRV }, { "AXFR", T_AXFR }, { "MAILB", T_MAILB }, { "MAILA", T_MAILA }, { "ANY", T_ANY } }; static const int ntypes = sizeof(types) / sizeof(types[0]); static const char *opcodes[] = { "QUERY", "IQUERY", "STATUS", "(reserved)", "NOTIFY", "(unknown)", "(unknown)", "(unknown)", "(unknown)", "UPDATEA", "UPDATED", "UPDATEDA", "UPDATEM", "UPDATEMA", "ZONEINIT", "ZONEREF" }; static const char *rcodes[] = { "NOERROR", "FORMERR", "SERVFAIL", "NXDOMAIN", "NOTIMP", "REFUSED", "(unknown)", "(unknown)", "(unknown)", "(unknown)", "(unknown)", "(unknown)", "(unknown)", "(unknown)", "(unknown)", "NOCHANGE" }; void dns_detail_callback(void *arg, int status, int timeouts, unsigned char *abuf, int alen) { int id, qr, opcode, aa, tc, rd, ra, rcode; unsigned int qdcount, ancount, nscount, arcount, i; const unsigned char *aptr; dns_resp_t *response = (dns_resp_t *) arg; clearstrbuffer(response->msgbuf); response->msgstatus = status; /* * Display an error message if there was an error, but only stop if * we actually didn't get an answer buffer. */ switch (status) { case ARES_SUCCESS: break; case ARES_ENODATA: addtobuffer(response->msgbuf, "No data returned from server\n"); if (!abuf) return; break; case ARES_EFORMERR: addtobuffer(response->msgbuf, "Server could not understand query\n"); if (!abuf) return; break; case ARES_ESERVFAIL: addtobuffer(response->msgbuf, "Server failed\n"); if (!abuf) return; break; case ARES_ENOTFOUND: addtobuffer(response->msgbuf, "Name not found\n"); if (!abuf) return; break; case ARES_ENOTIMP: addtobuffer(response->msgbuf, "Not implemented\n"); if (!abuf) return; break; case ARES_EREFUSED: addtobuffer(response->msgbuf, "Server refused query\n"); if (!abuf) return; break; case ARES_EBADNAME: addtobuffer(response->msgbuf, "Invalid name in query\n"); if (!abuf) return; break; case ARES_ETIMEOUT: addtobuffer(response->msgbuf, "Timeout\n"); if (!abuf) return; break; case ARES_ECONNREFUSED: addtobuffer(response->msgbuf, "Server unavailable\n"); if (!abuf) return; break; case ARES_ENOMEM: addtobuffer(response->msgbuf, "Out of memory\n"); if (!abuf) return; break; case ARES_EDESTRUCTION: addtobuffer(response->msgbuf, "Timeout (channel destroyed)\n"); if (!abuf) return; break; default: addtobuffer(response->msgbuf, "Undocumented ARES return code\n"); if (!abuf) return; break; } /* Won't happen, but check anyway, for safety. */ if (alen < HFIXEDSZ) return; /* Parse the answer header. */ id = DNS_HEADER_QID(abuf); qr = DNS_HEADER_QR(abuf); opcode = DNS_HEADER_OPCODE(abuf); aa = DNS_HEADER_AA(abuf); tc = DNS_HEADER_TC(abuf); rd = DNS_HEADER_RD(abuf); ra = DNS_HEADER_RA(abuf); rcode = DNS_HEADER_RCODE(abuf); qdcount = DNS_HEADER_QDCOUNT(abuf); ancount = DNS_HEADER_ANCOUNT(abuf); nscount = DNS_HEADER_NSCOUNT(abuf); arcount = DNS_HEADER_ARCOUNT(abuf); /* Display the answer header. */ sprintf(msg, "id: %d\n", id); addtobuffer(response->msgbuf, msg); sprintf(msg, "flags: %s%s%s%s%s\n", qr ? "qr " : "", aa ? "aa " : "", tc ? "tc " : "", rd ? "rd " : "", ra ? "ra " : ""); addtobuffer(response->msgbuf, msg); sprintf(msg, "opcode: %s\n", opcodes[opcode]); addtobuffer(response->msgbuf, msg); sprintf(msg, "rcode: %s\n", rcodes[rcode]); addtobuffer(response->msgbuf, msg); /* Display the questions. */ addtobuffer(response->msgbuf, "Questions:\n"); aptr = abuf + HFIXEDSZ; for (i = 0; i < qdcount; i++) { aptr = display_question(aptr, abuf, alen, response); if (aptr == NULL) return; } /* Display the answers. */ addtobuffer(response->msgbuf, "Answers:\n"); for (i = 0; i < ancount; i++) { aptr = display_rr(aptr, abuf, alen, response); if (aptr == NULL) return; } /* Display the NS records. */ addtobuffer(response->msgbuf, "NS records:\n"); for (i = 0; i < nscount; i++) { aptr = display_rr(aptr, abuf, alen, response); if (aptr == NULL) return; } /* Display the additional records. */ addtobuffer(response->msgbuf, "Additional records:\n"); for (i = 0; i < arcount; i++) { aptr = display_rr(aptr, abuf, alen, response); if (aptr == NULL) return; } return; } static const unsigned char *display_question(const unsigned char *aptr, const unsigned char *abuf, int alen, dns_resp_t *response) { char *name; int type, dnsclass, status; long len; /* Parse the question name. */ status = ares_expand_name(aptr, abuf, alen, &name, &len); if (status != ARES_SUCCESS) return NULL; aptr += len; /* Make sure there's enough data after the name for the fixed part * of the question. */ if (aptr + QFIXEDSZ > abuf + alen) { xfree(name); return NULL; } /* Parse the question type and class. */ type = DNS_QUESTION_TYPE(aptr); dnsclass = DNS_QUESTION_CLASS(aptr); aptr += QFIXEDSZ; /* * Display the question, in a format sort of similar to how we will * display RRs. */ sprintf(msg, "\t%-15s.\t", name); addtobuffer(response->msgbuf, msg); if (dnsclass != C_IN) { sprintf(msg, "\t%s", class_name(dnsclass)); addtobuffer(response->msgbuf, msg); } sprintf(msg, "\t%s\n", type_name(type)); addtobuffer(response->msgbuf, msg); xfree(name); return aptr; } static const unsigned char *display_rr(const unsigned char *aptr, const unsigned char *abuf, int alen, dns_resp_t *response) { const unsigned char *p; char *name; int type, dnsclass, ttl, dlen, status; long len; struct in_addr addr; struct in6_addr addr6; /* Parse the RR name. */ status = ares_expand_name(aptr, abuf, alen, &name, &len); if (status != ARES_SUCCESS) return NULL; aptr += len; /* Make sure there is enough data after the RR name for the fixed * part of the RR. */ if (aptr + RRFIXEDSZ > abuf + alen) { xfree(name); return NULL; } /* Parse the fixed part of the RR, and advance to the RR data field. */ type = DNS_RR_TYPE(aptr); dnsclass = DNS_RR_CLASS(aptr); ttl = DNS_RR_TTL(aptr); dlen = DNS_RR_LEN(aptr); aptr += RRFIXEDSZ; if (aptr + dlen > abuf + alen) { xfree(name); return NULL; } /* Display the RR name, class, and type. */ sprintf(msg, "\t%-15s.\t%d", name, ttl); addtobuffer(response->msgbuf, msg); if (dnsclass != C_IN) { sprintf(msg, "\t%s", class_name(dnsclass)); addtobuffer(response->msgbuf, msg); } sprintf(msg, "\t%s", type_name(type)); addtobuffer(response->msgbuf, msg); xfree(name); /* Display the RR data. Don't touch aptr. */ switch (type) { case T_CNAME: case T_MB: case T_MD: case T_MF: case T_MG: case T_MR: case T_NS: case T_PTR: /* For these types, the RR data is just a domain name. */ status = ares_expand_name(aptr, abuf, alen, &name, &len); if (status != ARES_SUCCESS) return NULL; sprintf(msg, "\t%s.", name); addtobuffer(response->msgbuf, msg); xfree(name); break; case T_HINFO: /* The RR data is two length-counted character strings. */ p = aptr; len = *p; if (p + len + 1 > aptr + dlen) return NULL; sprintf(msg, "\t%.*s", (int) len, p + 1); addtobuffer(response->msgbuf, msg); p += len + 1; len = *p; if (p + len + 1 > aptr + dlen) return NULL; sprintf(msg, "\t%.*s", (int) len, p + 1); addtobuffer(response->msgbuf, msg); break; case T_MINFO: /* The RR data is two domain names. */ p = aptr; status = ares_expand_name(p, abuf, alen, &name, &len); if (status != ARES_SUCCESS) return NULL; sprintf(msg, "\t%s.", name); addtobuffer(response->msgbuf, msg); xfree(name); p += len; status = ares_expand_name(p, abuf, alen, &name, &len); if (status != ARES_SUCCESS) return NULL; sprintf(msg, "\t%s.", name); addtobuffer(response->msgbuf, msg); xfree(name); break; case T_MX: /* The RR data is two bytes giving a preference ordering, and then a domain name. */ if (dlen < 2) return NULL; sprintf(msg, "\t%d", (aptr[0] << 8) | aptr[1]); addtobuffer(response->msgbuf, msg); status = ares_expand_name(aptr + 2, abuf, alen, &name, &len); if (status != ARES_SUCCESS) return NULL; sprintf(msg, "\t%s.", name); addtobuffer(response->msgbuf, msg); xfree(name); break; case T_SOA: /* * The RR data is two domain names and then five four-byte * numbers giving the serial number and some timeouts. */ p = aptr; status = ares_expand_name(p, abuf, alen, &name, &len); if (status != ARES_SUCCESS) return NULL; sprintf(msg, "\t%s.\n", name); addtobuffer(response->msgbuf, msg); xfree(name); p += len; status = ares_expand_name(p, abuf, alen, &name, &len); if (status != ARES_SUCCESS) return NULL; sprintf(msg, "\t\t\t\t\t\t%s.\n", name); addtobuffer(response->msgbuf, msg); xfree(name); p += len; if (p + 20 > aptr + dlen) return NULL; sprintf(msg, "\t\t\t\t\t\t( %d %d %d %d %d )", (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3], (p[4] << 24) | (p[5] << 16) | (p[6] << 8) | p[7], (p[8] << 24) | (p[9] << 16) | (p[10] << 8) | p[11], (p[12] << 24) | (p[13] << 16) | (p[14] << 8) | p[15], (p[16] << 24) | (p[17] << 16) | (p[18] << 8) | p[19]); addtobuffer(response->msgbuf, msg); break; case T_TXT: /* The RR data is one or more length-counted character strings. */ p = aptr; while (p < aptr + dlen) { len = *p; if (p + len + 1 > aptr + dlen) return NULL; sprintf(msg, "\t%.*s", (int)len, p + 1); addtobuffer(response->msgbuf, msg); p += len + 1; } break; case T_A: /* The RR data is a four-byte Internet address. */ if (dlen != 4) return NULL; memcpy(&addr, aptr, sizeof(struct in_addr)); sprintf(msg, "\t%s", inet_ntoa(addr)); addtobuffer(response->msgbuf, msg); break; case T_AAAA: /* The RR data is a 16-byte IPv6 address. */ if (dlen != 16) return NULL; memcpy(&addr6, aptr, sizeof(struct in6_addr)); addtobuffer_many(response->msgbuf, "\t", inet_ntop(AF_INET6,&addr6,msg,sizeof(msg)), NULL); break; case T_WKS: /* Not implemented yet */ break; case T_SRV: /* * The RR data is three two-byte numbers representing the * priority, weight, and port, followed by a domain name. */ sprintf(msg, "\t%d", DNS__16BIT(aptr)); addtobuffer(response->msgbuf, msg); sprintf(msg, " %d", DNS__16BIT(aptr + 2)); addtobuffer(response->msgbuf, msg); sprintf(msg, " %d", DNS__16BIT(aptr + 4)); addtobuffer(response->msgbuf, msg); status = ares_expand_name(aptr + 6, abuf, alen, &name, &len); if (status != ARES_SUCCESS) return NULL; sprintf(msg, "\t%s.", name); addtobuffer(response->msgbuf, msg); xfree(name); break; default: sprintf(msg, "\t[Unknown RR; cannot parse]"); addtobuffer(response->msgbuf, msg); } sprintf(msg, "\n"); addtobuffer(response->msgbuf, msg); return aptr + dlen; } static const char *type_name(int type) { int i; for (i = 0; i < ntypes; i++) { if (types[i].value == type) return types[i].name; } return "(unknown)"; } static const char *class_name(int dnsclass) { int i; for (i = 0; i < nclasses; i++) { if (classes[i].value == dnsclass) return classes[i].name; } return "(unknown)"; } int dns_name_type(char *name) { int i; for (i = 0; i < ntypes; i++) { if (strcasecmp(types[i].name, name) == 0) return types[i].value; } return T_A; } xymon-4.3.28/xymonnet/dns.h0000664000076400007640000000275512603243142016036 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor network test tool. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __DNS_H__ #define __DNS_H__ #include /* dnslookup values */ #define DNS_THEN_IP 0 /* Try DNS - if it fails, use IP from hosts.cfg */ #define DNS_ONLY 1 /* DNS only - if it fails, report service down */ #define IP_ONLY 2 /* IP only - don't do DNS lookups */ extern int use_ares_lookup; extern int max_dns_per_run; extern int dnstimeout; extern int dns_stats_total; extern int dns_stats_success; extern int dns_stats_failed; extern int dns_stats_lookups; extern FILE *dnsfaillog; extern void add_host_to_dns_queue(char *hostname); extern void add_url_to_dns_queue(char *hostname); extern void flush_dnsqueue(void); extern char *dnsresolve(char *hostname); extern int dns_test_server(char *serverip, char *hostname, strbuffer_t *banner); #endif xymon-4.3.28/xymonnet/xymonping.c0000664000076400007640000003476413033575046017313 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor network test tool. */ /* */ /* This is an implementation of a fast "ping" program, for use with Xymon. */ /* */ /* Copyright (C) 2006-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: xymonping.c 7999 2017-01-06 02:00:06Z jccleaver $"; #include "config.h" #include #include #include #include #ifdef HAVE_SYS_SELECT_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" #define PING_PACKET_SIZE 64 #define PING_MINIMUM_SIZE ICMP_MINLEN #define SENDLIMIT 100 typedef struct hostdata_t { int id; struct sockaddr_in addr; /* Address of host to ping */ int received; /* how many ICMP_ECHO replies we've got */ struct timespec rtt_total; struct hostdata_t *next; } hostdata_t; hostdata_t *hosthead = NULL; int hostcount = 0; hostdata_t **hosts = NULL; /* Array of pointers to the hostdata records, for fast acces via ID */ int myicmpid; int senddelay = (1000000 / 50); /* Delay between sending packets, in microseconds */ /* This routine more or less taken from the "fping" source. Apparently by W. Stevens (public domain) */ int calc_icmp_checksum(unsigned short *pkt, int pktlen) { unsigned short result; long sum = 0; unsigned short extrabyte = 0; while (pktlen > 1) { sum += *pkt++; pktlen -= 2; } if (pktlen == 1) { *(unsigned char *)(&extrabyte) = *(unsigned char *)pkt; sum += extrabyte; } sum = ( sum >> 16 ) + ( sum & 0xffff ); /* add hi 16 to low 16 */ sum += ( sum >> 16 ); /* add carry */ result = ~sum; /* ones-complement, truncate*/ return result; } char *nextip(int argc, char *argv[], FILE *fd) { static int argi = 0; static int cmdmode = 0; static char buf[4096]; if (argi == 0) { /* Check if there are any command-line IP's */ struct sockaddr_in ina; for (argi=1; ((argi < argc) && (inet_aton(argv[argi], &ina.sin_addr) == 0)); argi++) ; cmdmode = (argi < argc); } if (cmdmode) { /* Skip any options in-between the IP's */ while ((argi < argc) && (*(argv[argi]) == '-')) argi++; if (argi < argc) { argi++; return argv[argi-1]; } } else { if (fgets(buf, sizeof(buf), fd)) { char *p; p = strchr(buf, '\n'); if (p) *p = '\0'; return buf; } } return NULL; } void load_ips(int argc, char *argv[], FILE *fd) { char *l; hostdata_t *tail = NULL; hostdata_t *walk; int i; while ((l = nextip(argc, argv, fd)) != NULL) { hostdata_t *newitem; if (strlen(l) == 0) continue; newitem = (hostdata_t *)calloc(1, sizeof(hostdata_t)); newitem->addr.sin_family = AF_INET; newitem->addr.sin_port = 0; if (inet_aton(l, &newitem->addr.sin_addr) == 0) { errprintf("Dropping %s - not an IP\n", l); free(newitem); continue; } if (tail) { tail->next = newitem; } else { hosthead = newitem; } hostcount++; tail = newitem; } /* Setup the table of hostdata records */ hosts = (hostdata_t **)malloc((hostcount+1) * sizeof(hostdata_t *)); for (i=0, walk=hosthead; (walk); walk=walk->next, i++) hosts[i] = walk; hosts[hostcount] = NULL; } /* This is the data we send with each ping packet */ typedef struct pingdata_t { int id; /* ID for the host this belongs to */ struct timespec timesent; /* time we sent this ping */ } pingdata_t; int send_ping(int sock, int startidx, int minresponses) { static unsigned char buffer[PING_PACKET_SIZE]; struct icmp *icmphdr; struct pingdata_t *pingdata; int sentbytes; int idx = startidx; /* * Sends one ICMP "echo-request" packet. * * Note: A first attempt at this kept sending packets until * we got an EWOULDBLOCK or a send error. This causes incoming * responses to be dropped. */ /* Skip the hosts that have already delivered a ping response */ while ((idx < hostcount) && (hosts[idx]->received >= minresponses)) idx++; if (idx >= hostcount) return hostcount; /* * Don't flood the net. * By enforcing a brief sleep here, we force a delay * between sending packets. It is easiest to do before sending * a packet, because if done after the send completes, then * it affects the RTT measurements. */ if (senddelay) usleep(senddelay); /* Build the packet and send it */ memset(buffer, 0, PING_PACKET_SIZE); icmphdr = (struct icmp *)buffer; icmphdr->icmp_type = ICMP_ECHO; icmphdr->icmp_code = 0; icmphdr->icmp_cksum = 0; icmphdr->icmp_seq = htons(idx+1); /* So we can map response to our hosts */ icmphdr->icmp_id = htons(myicmpid); pingdata = (struct pingdata_t *)(buffer + sizeof(struct icmp)); pingdata->id = idx; getntimer(&pingdata->timesent); icmphdr->icmp_cksum = calc_icmp_checksum((unsigned short *)buffer, PING_PACKET_SIZE); sentbytes = sendto(sock, buffer, PING_PACKET_SIZE, 0, (struct sockaddr *) &hosts[idx]->addr, sizeof(struct sockaddr_in)); if (sentbytes == -1) { if (errno != EWOULDBLOCK) { errprintf("Failed to send ICMP packet: %s\n", strerror(errno)); idx++; /* To avoid looping indefinitely trying to send to this host */ } } else if (sentbytes == PING_PACKET_SIZE) { /* We managed to send a ping! */ if (debug) { dbgprintf("Sent a ping to %s: index=%d, id=%d\n", inet_ntoa(hosts[idx]->addr.sin_addr), idx, myicmpid); } idx++; } return idx; } int get_response(int sock) { static unsigned char buffer[4096]; struct sockaddr_in addr; int n, pktcount; unsigned int addrlen; struct ip *iphdr; int iphdrlen; struct icmp *icmphdr; struct pingdata_t *pingdata; int hostidx; struct timespec rtt; /* * Read responses from the network. * We know (because select() told us) that there is some data * to read. To avoid losing packets, read as much as we can. */ pktcount = 0; do { addrlen = sizeof(addr); n = recvfrom(sock, buffer, sizeof(buffer), 0, (struct sockaddr *)&addr, &addrlen); if (n < 0) { if (errno != EWOULDBLOCK) errprintf("Failed to receive packet: %s\n", strerror(errno)); continue; } getntimer(&rtt); /* Check the IP header - we need to have at least enough bytes for an ICMP header. */ iphdr = (struct ip *)buffer; iphdrlen = (iphdr->ip_hl << 2); /* IP header always aligned on 4-byte boundary */ if (n < (iphdrlen + PING_MINIMUM_SIZE)) { errprintf("Short packet ignored\n"); continue; } /* * Get the ICMP header, and our host index which is the sequence number. * Thanks to "fping" for this neat way of matching requests and responses. */ icmphdr = (struct icmp *)(buffer + iphdrlen); hostidx = ntohs(icmphdr->icmp_seq)-1; if (debug) { dbgprintf("Got packet from %s: type=%d, index=%d, id=%d\n", inet_ntoa(addr.sin_addr), icmphdr->icmp_type, icmphdr->icmp_id, hostidx); } switch (icmphdr->icmp_type) { case ICMP_ECHOREPLY: if (ntohs(icmphdr->icmp_id) != myicmpid) { /* Not one of our packets. Happens if someone else does ping simultaneously. */ break; } if ((hostidx >= 0) && (hostidx < hostcount)) { /* Looks like one of our packets succeeded. */ pktcount++; hosts[hostidx]->received += 1; pingdata = (struct pingdata_t *)(buffer + iphdrlen + sizeof(struct icmp)); /* Calculate the round-trip time. */ rtt.tv_sec -= pingdata->timesent.tv_sec; rtt.tv_nsec -= pingdata->timesent.tv_nsec; if (rtt.tv_nsec < 0) { rtt.tv_sec--; rtt.tv_nsec += 1000000000; } /* Add RTT to the total time */ hosts[hostidx]->rtt_total.tv_sec += rtt.tv_sec; hosts[hostidx]->rtt_total.tv_nsec += rtt.tv_nsec; if (hosts[hostidx]->rtt_total.tv_nsec >= 1000000000) { hosts[hostidx]->rtt_total.tv_sec++; hosts[hostidx]->rtt_total.tv_nsec -= 1000000000; } } break; case ICMP_ECHO: /* Sometimes, we see our own packets going out (if we ping ourselves) */ break; case ICMP_UNREACH: /* We simply ignore these. Hosts get retried until we succeed, then reported as down. */ break; case ICMP_REDIRECT: /* Ignored - the IP stack handles this. */ break; default: /* Shouldn't happen */ errprintf("Got a packet that wasn't a reply - type %d\n", icmphdr->icmp_type); break; } } while (n > 0); return pktcount; } int count_pending(int minresponses) { int result = 0; int idx; /* Counts how many hosts we haven't seen a reply from yet. */ for (idx = 0; (idx < hostcount); idx++) if (hosts[idx]->received < minresponses) result++; return result; } void show_results(void) { int idx; unsigned long rtt_usecs; /* Big enough for 2147 seconds - larger than we will ever see */ /* * Print out the results. Format is identical to "fping -Ae" so we can use * it directly in Xymon without changing the xymonnet code. */ for (idx = 0; (idx < hostcount); idx++) { if (hosts[idx]->received > 0) { printf("%s is alive", inet_ntoa(hosts[idx]->addr.sin_addr)); rtt_usecs = (hosts[idx]->rtt_total.tv_sec*1000000 + (hosts[idx]->rtt_total.tv_nsec / 1000)) / hosts[idx]->received; if (rtt_usecs >= 3000) { printf(" (%.1f ms)\n", rtt_usecs / 1000.0); } else { printf(" (%lu usec)\n", rtt_usecs); } } else { printf("%s is unreachable\n", inet_ntoa(hosts[idx]->addr.sin_addr)); } } } int main(int argc, char *argv[]) { struct protoent *proto; int protonumber, pingsocket = -1, sockerr = 0, binderr = 0; int argi, sendidx, pending, minresponses = 1, tries = 3, timeout = 5; char *srcip = NULL; struct sockaddr_in src_addr; /* Immediately drop all root privileges. */ drop_root(); for (argi = 1; (argi < argc); argi++) { if (strncmp(argv[argi], "--retries=", 10) == 0) { char *delim = strchr(argv[argi], '='); tries = 1 + atoi(delim+1); } else if (strncmp(argv[argi], "--timeout=", 10) == 0) { char *delim = strchr(argv[argi], '='); timeout = atoi(delim+1); } else if (strncmp(argv[argi], "--responses=", 11) == 0) { char *delim = strchr(argv[argi], '='); minresponses = atoi(delim+1); } else if (strncmp(argv[argi], "--source=", 9) == 0) { char *delim = strchr(argv[argi], '='); srcip = strdup(delim+1); } else if (strncmp(argv[argi], "--max-pps=", 10) == 0) { char *delim = strchr(argv[argi], '='); senddelay = (1000000 / atoi(delim+1)); } else if (strncmp(argv[argi], "--debug", 7) == 0) { char *delim = strchr(argv[argi], '='); debug = 1; if (delim) set_debugfile(delim+1, 0); } else if (strcmp(argv[argi], "--help") == 0) { if (pingsocket >= 0) close(pingsocket); fprintf(stderr, "%s [--retries=N] [--timeout=N] [--responses=N] [--max-pps=N] [--source=IP]\n", argv[0]); return 0; } /* fping compatibility options */ else if (strncmp(argv[argi], "-i", 2) == 0) { char *val = argv[argi] + 2; if (isdigit((int) *val)) senddelay = atoi(val); } else if (strncmp(argv[argi], "-r", 2) == 0) { char *val = argv[argi] + 2; if (isdigit((int) *val)) tries = atoi(val); } else if (strncmp(argv[argi], "-S", 2) == 0) { char *val = argv[argi] + 2; srcip = strdup(val); } else if (*(argv[argi]) == '-') { /* Ignore everything else - for fping compatibility */ } } proto = getprotobyname("icmp"); protonumber = (proto ? proto->p_proto : 1); if (srcip != NULL) { /* Setup the source address */ src_addr.sin_family = AF_INET; src_addr.sin_addr.s_addr = inet_addr(srcip); src_addr.sin_port = htons(0); } /* Get a raw socket. Requires root privs. */ get_root(); pingsocket = socket(AF_INET, SOCK_RAW, protonumber); sockerr = errno; if ((pingsocket != -1) && (srcip != NULL)) { /* Bind to a specific source address */ if (bind(pingsocket, (struct sockaddr *) &src_addr, sizeof(src_addr)) == -1) binderr = errno; } drop_root(); if (pingsocket == -1) { errprintf("Cannot get RAW socket: %s\n", strerror(sockerr)); if (sockerr == EPERM) errprintf("This program must be installed suid-root\n"); return 3; } if ((srcip != NULL) && (binderr != 0)) { errprintf("Cannot bind to source address %s: %s\nUsing default address\n", srcip, strerror(binderr)); } /* Set the socket non-blocking - we use select() exclusively */ fcntl(pingsocket, F_SETFL, O_NONBLOCK); load_ips(argc, argv, stdin); pending = count_pending(minresponses); while (tries) { int sendnow = SENDLIMIT; time_t cutoff = getcurrenttime(NULL) + timeout + 1; sendidx = 0; /* Change this on each iteration, so we don't mix packets from each round of pings */ myicmpid = ((getpid()+tries) & 0x7FFF); /* Do one loop over the hosts we havent had responses from yet. */ while (pending > 0) { fd_set readfds, writefds; struct timeval selecttmo; int n; FD_ZERO(&readfds); FD_ZERO(&writefds); FD_SET(pingsocket, &readfds); if (sendnow && (sendidx < hostcount)) FD_SET(pingsocket, &writefds); selecttmo.tv_sec = 0; selecttmo.tv_usec = 100000; n = select(pingsocket+1, &readfds, &writefds, NULL, &selecttmo); if (n < 0) { if (errno == EINTR) continue; errprintf("select failed: %s\n", strerror(errno)); return 4; } else if (n == 0) { /* Time out */ sendnow = SENDLIMIT; } else { if (sendnow && FD_ISSET(pingsocket, &writefds)) { /* OK to send */ sendidx = send_ping(pingsocket, sendidx, minresponses); sendnow--; /* Adjust the cutoff time, so we wait TIMEOUT seconds for a response */ cutoff = getcurrenttime(NULL) + timeout + 1; } if (FD_ISSET(pingsocket, &readfds)) { /* Grab the replies */ int count = get_response(pingsocket); pending -= count; sendnow += count; if (sendnow > SENDLIMIT) sendnow = SENDLIMIT; } } /* See if we have hit the timeout */ if ((getcurrenttime(NULL) >= cutoff) && (sendidx >= hostcount)) { pending = 0; } } tries--; pending = count_pending(minresponses); if (pending == 0) { /* Have got responses for all hosts - we're done */ tries = 0; } } close(pingsocket); show_results(); return 0; } xymon-4.3.28/xymonnet/httpresult.h0000664000076400007640000000253112174246412017466 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor network test tool. */ /* */ /* This is used to implement the testing of a HTTP service. */ /* */ /* Copyright (C) 2003-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __HTTPRESULT_H_ #define __HTTPRESULT_H_ #include #include #include extern void show_http_test_results(service_t *httptest); extern void send_http_results(service_t *httptest, testedhost_t *host, testitem_t *firsttest, char *nonetpage, int failgoesclear, int usebackfeedqueue); extern void send_content_results(service_t *httptest, testedhost_t *host, char *nonetpage, char *contenttestname, int failgoesclear); #endif xymon-4.3.28/xymonnet/xymonnet.10000664000076400007640000005700713037531444017053 0ustar rpmbuildrpmbuild.TH XYMONNET 1 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME xymonnet \- Xymon network test tool .SH SYNOPSIS .B "xymonnet [\-\-ping|\-\-noping] [\-\-timeout=N] [options] [hostname] [hostname] .br (See the OPTIONS section for a description of the available command-line options). .SH DESCRIPTION .I xymonnet(1) handles the network tests of hosts defined in the Xymon configuration file, hosts.cfg. It is normally run at regular intervals by .I xymonlaunch(8) via an entry in the .I tasks.cfg(5) file. xymonnet does all of the normal tests of TCP-based network services (telnet, ftp, ssh, smtp, pop, imap ....) - i.e. all of the services listed in protocols.cfg. For these tests, a completely new and very speedy service- checker has been implemented. xymonnet has built-in support for testing SSL-enabled protocols, e.g. imaps, pop3s, nntps, telnets, if SSL-support was enabled when configuring xymonnet. The full list of known tests is found in the .I protocols.cfg(5) file in $XYMONHOME/etc/protocols.cfg. In addition, it implements the "dns" and "dig" tests for testing DNS servers. xymonnet also implements a check for NTP servers - this test is called "ntp". If you want to use it, you must define the NTPDATE environment variable to point at the location of your .I ntpdate(1) program. Note: xymonnet performs the connectivity test (ping) based on the hostname, unless the host is tagged with "testip" or the "\-\-dns=ip" option is used. So the target of the connectivity test can be determined by your /etc/hosts file or DNS. By default, all servers are tested - if XYMONNETWORK is set via .I xymonserver.cfg(5) then only the hosts marked as belonging to this network are tested. If the command-line includes one or more hostnames, then only those servers are tested. .SH GENERAL OPTIONS .IP \-\-timeout=N Determines the timeout (in seconds) for each service that is tested. For TCP tests (those from XYMONNETSVCS), if the connection to the service does not succeed within N seconds, the service is reported as being down. For HTTP tests, this is the absolute limit for the entire request to the webserver (the time needed to connect to the server, plus the time it takes the server to respond to the request). Default: 10 seconds .IP \-\-conntimeout=N This option is deprecated, and will be ignored. Use the \-\-timeout option instead. .IP \-\-cmdtimeout=N This option sets a timeout for the external commands used for testing of NTP and RPC services, and to perform traceroute. .IP \-\-concurrency=N Determines the number of network tests that run in parallel. Default is operating system dependent, but will usually be 256. If xymonnet begins to complain about not being able to get a "socket", try running xymonnet with a lower value like 50 or 100. .IP "\-\-dns\-timeout=N (default: 30 seconds)" xymonnet will timeout all DNS lookups after N seconds. Any pending DNS lookups are regarded as failed, i.e. the network tests that depend on this DNS lookup will report an error. .br Note: If you use the \-\-no\-ares option, timeout of DNS lookups cannot be controlled by xymonnet. .IP \-\-dns\-max\-all=N Same as "\-\-dns\-timeout=N". The "\-\-dns\-max\-all" option is deprecated and should not be used. .IP \-\-dns=[ip|only|standard] Determines how xymonnet finds the IP addresses of the hosts to test. By default (the "standard"), xymonnet does a DNS lookup of the hostname to determine the IP address, unless the host has the "testip" tag, or the DNS lookup fails. .br With "\-\-dns=only" xymonnet will ONLY do the DNS lookup; if it fails, then all services on that host will be reported as being down. .br With "\-\-dns=ip" xymonnet will never do a DNS lookup; it will use the IP adresse specified in hosts.cfg for the tests. Thus, this setting is equivalent to having the "testip" tag on all hosts. Note that http tests will ignore this setting and still perform a DNS lookup for the hostname given in the URL; see the "xymonnet tags for HTTP tests" section in .I hosts.cfg(5) .IP \-\-no\-ares Disable the ARES resolver built into xymonnet. This makes xymonnet resolve hostnames using your system resolver function. You should only use this as a last resort if xymonnet cannot resolve the hostnames you use in the normal way (via DNS or /etc/hosts). One reason for using this would be if you need to resolve hostnames via NIS/NIS+ (a.k.a. Yellow Pages). .br The system resolver function does not provide a mechanism for controlling timeouts of the hostname lookups, so if your DNS or NIS server is down, xymonnet can take a very long time to run. The \-\-dns\-timeout option is effectively disabled when using this option. .IP \-\-dnslog=FILENAME Log failed hostname lookups to the file FILENAME. FILENAME should be a full pathname. .IP \-\-report[=COLUMNNAME] With this option, xymonnet will send a status message with details of how many hosts were processed, how many tests were generated, any errors that occurred during the run, and some timing statistics. The default columnname is "xymonnet". .IP \-\-test\-untagged When using the XYMONNETWORK environment variable to test only hosts on a particular network segment, xymonnet will ignore hosts that do not have any "NET:x" tag. So only hosts that have a NET:$XYMONNETWORK tag will be tested. .br With this option, hosts with no NET: tag are included in the test, so that all hosts that either have a matching NET: tag, or no NET: tag at all are tested. .IP \-\-frequenttestlimit=N Used with the .I xymonnet\-again.sh(1) Xymon extension. This option determines how long failed tests remain in the frequent-test queue. The default is 1800 seconds (30 minutes). .IP \-\-timelimit=N Causes xymonnet to generate a warning if the run-time of xymonnet exceeds N seconds. By default N is set to the value of TASKSLEEP, so a warning triggers if the network tests cannot complete in the time given for one cycle of the xymonnet task. Apart from the warning, this option has no effect, i.e. it will not terminate xymonnet prematurely. So to eliminate any such warnings, use this option with a very high value of N. .IP \-\-huge=N Warn if the response from a TCP test is more than N bytes. If you see from the xymonnet status report that you are transferring large amounts of data for your tests, you can enable this option to see which tests have large replies. .br Default: 0 (disabled). .IP \-\-validity=N Make the test results valid for N minutes before they go purple. By default test results are valid for 30 minutes; if you run xymonnet less often than that, the results will go purple before the next run of xymonnet. This option lets you change how long the status is valid. .IP \-\-source\-ip=IPADDRESS On multi-homed hosts, this option can be used to explicitly select the source IP address used for the network tests. "IPADDRESS" must be a valid IP-address on the host running xymonnet. .IP \-\-loadhostsfromxymond Instead of reading the hosts.cfg file, xymonnet will load the hosts.cfg configuration from the xymond daemon. This eliminates the need for reading the hosts.cfg, and if you have xymond and xymonnet running on different hosts, it also eliminates the need for copying the hosts.cfg file between systems. Note that the "netinclude" option in hosts.cfg is ignored when this option is enabled. .SH OPTIONS FOR TESTS OF THE SIMPLE TCP SERVICES .IP \-\-checkresponse[=COLOR] When testing well-known services (e.g. FTP, SSH, SMTP, POP-2, POP-3, IMAP, NNTP and rsync), xymonnet will look for a valid service-specific "OK" response. If another response is seen, this will cause the test to report a warning (yellow) status. Without this option, the response from the service is ignored. .br The optional color-name is used to select a color other than yellow for the status message when the response is wrong. E.g. "\-\-checkresponse=red" will cause a "red" status message to be sent when the service does not respond as expected. .IP \-\-no\-flags By default, xymonnet sends some extra information in the status messages, called "flags". These are used by xymongen e.g. to pick different icons for reversed tests when generating the Xymon webpages. This option makes xymonnet omit these flags from the status messages. .IP \-\-shuffle By default, TCP tests run roughly in the order that the hosts are listed in the hosts.cfg file. If you have many tests for one server, this may result in an exceptionally large load when Xymon is testing it because Xymon will perform a lot of tests at the same time. To avoid this, the \fB\-\-shuffle\fR option reorders the sequence of tests so they are spread randomly across all of the servers tested. .SH OPTIONS FOR THE PING TEST Note: xymonnet uses the program defined by the FPING environment to execute ping-tests - by default, that is the .I xymonping(1) utility. See .I xymonserver.cfg(5) for a description of how to customize this, e.g. if you need to run it with "sudo" or a similar tool. .IP \-\-ping Enables xymonnet's ping test. The column name used for ping test results is defined by the PINGCOLUMN environment variable in .I xymonserver.cfg(5). .br If not specified, xymonnet uses the CONNTEST environment variable to determine if it should perform the ping test or not. So if you prefer to use another tool to implement ping checks, either set the CONNTEST environment variable to false, or run xymonnet with the "\-\-noping". .IP \-\-noping Disable the connectivity test. .IP "\-\-trace" .IP "\-\-notrace" Enable/disable the use of traceroute when a ping-test fails. Performing a traceroute for failed ping tests is a slow operation, so the default is not to do any traceroute, unless it is requested on a per-host basis via the "trace" tag in the .I hosts.cfg(5) entry for each host. The "\-\-trace" option changes this, so the default becomes to run traceroute on all hosts where the ping test fails; you can then disable it on specific hosts by putting a "notrace" tag on the host-entry. .IP \-\-ping\-tasks=N Spread the task of pinging the hosts over N processes. If you have a very large number of hosts the time it takes to ping all of them can be substantial, even with the use of tools like fping or xymonping that ping many hosts in parallel. This option causes xymonnet to start N separate ping processes, the IP's that are being ping'ed will be divided evenly between these processes. .SH OPTIONS FOR HTTP (WEB) TESTS .IP \-\-content=CONTENTTESTNAME Determines the name of the column Xymon displays for content checks. The default is "content". If you have used the "cont.sh" or "cont2.sh" scripts earlier, you may want to use "\-\-content=cont" to report content checks using the same test name as these scripts do. .IP \-\-bb\-proxy\-syntax Adhere to the Big Brother syntax for a URL, which allows specifying a HTTP proxy as part of a URL. See \fB"HTTP Testing via proxy"\fR in the .I hosts.cfg(5) file for details. Beginning with Xymon 4.3.0, this behaviour is disabled by default since URL's that include other URL's are now much more common. This option restores the old Big Brother-compatible behaviour. .SH OPTIONS FOR SSL CERTIFICATE TESTS .IP \-\-ssl=SSLCERTTESTNAME Determines the name of the column Xymon displays for the SSL certificate checks. The default is "sslcert". .IP \-\-no\-ssl Disables reporting of the SSL certificate check. .IP \-\-sslwarn=N .IP \-\-sslalarm=N Determines the number of days before an SSL certificate expires, where xymonnet will generate a warning or alarm status for the SSL certificate column. .IP \-\-sslbits=N Enables checking that the encryption supported by the SSL protocol uses an encryption key of at least N bits. E.g. to trigger an alert if your SSL-enabled website supports less than 128 bits of encryption, use "\-\-sslbits=128". Note: This can be enabled on a per-host basis using the "sslbits=N" setting in .I hosts.cfg(5) .IP \-\-sslkeysize=N Enables checking of the length of the public key in SSL certificates. N is the minimum size of the SSL public key, typically such keys are 2048 bits, but some older certificates may use keys with 1024 bits or less. If you specify this, SSL certificates with keys less than N bits will result in the "sslcert" status going yellow. Default: 0, i.e. this check is disabled. .IP \-\-no\-cipherlist Do not show encryption cipher details on the "sslcert" status. .IP \-\-showallciphers List ALL locally available encryption ciphers on the "sslcert" status. .IP \-\-sni=[on|off] Sets the default for whether SSL connections use SNI (Server Name Indication). This can also be set with the "sni" or "nosni" options in hosts.cfg for each host - the hosts.cfg entries override this option. Default: off .SH DEBUGGING OPTIONS .IP \-\-no\-update Don't send any status updates to the Xymon server. Instead, all messages are dumped to stdout. .IP \-\-timing Causes xymonnet to collect information about the time spent in different parts of the program. The information is printed on stdout just before the program ends. Note that this information is also included in the status report sent with the "\-\-report" option. .IP \-\-debug Dumps a bunch of status about the tests as they progress to stdout. .IP \-\-dump[=before|=after|=both] Dumps internal memory structures before and/or after the tests have executed. .SH INFORMATIONAL OPTIONS .IP "--help or -?" Provide a summary of available command-line options. .IP "--version" Prints the version number of xymonnet .IP --services Dump the list of defined TCP services xymonnet knows how to test. Do not run any tests. .SH USING COOKIES IN WEB TESTS If the file $XYMONHOME/etc/cookies exist, cookies will be read from this file and sent along with the HTTP requests when checking websites. This file is in the Netscape Cookie format, see http://www.netscape.com/newsref/std/cookie_spec.html for details on this format. The .I curl(1) utility can output a file in this format if run with the "--cookie-jar FILENAME" option. .SH ABOUT SSL CERTIFICATE CHECKS When xymonnet tests services that use SSL- or TLS-based protocols, it will check that the server certificate has not expired. This check happens automatically for https (secure web), pop3s, imaps, nntps and all other SSL-enabled services (except ldap, see LDAP TESTS below). All certificates found for a host are reported in one status message. Note: On most systems, the end-date of the certificate is limited to Jan 19th, 2038. If your certificate is valid after this date, xymonnet will report it as valid only until Jan 19, 2038. This is due to limitations in your operating system C library. See http://en.wikipedia.org/wiki/2038_problem . .SH LDAP TESTS ldap testing can be done in two ways. If you just put an "ldap" or "ldaps" tag in hosts.cfg, a simple test is performed that just verifies that it is possible to establish a connection to the port running the ldap service (389 for ldap, 636 for ldaps). Instead you can put an LDAP URI in hosts.cfg. This will cause xymonnet to initiate a full-blown LDAP session with the server, and do an LDAP search for the objects defined by the URI. This requires that xymonnet was built with LDAP support, and relies on an existing LDAP library to be installed. It has been tested with OpenLDAP 2.0.26 (from Red Hat 9) and 2.1.22. The Solaris 8 system ldap library has also been confirmed to work for un-encrypted (plain ldap) access. The format of LDAP URI's is defined in RFC 2255. LDAP URLs look like this: .nf \fBldap://\fP\fIhostport\fP\fB/\fP\fIdn\fP[\fB?\fP\fIattrs\fP[\fB?\fP\fIscope\fP[\fB?\fP\fIfilter\fP[\fB?\fP\fIexts\fP]]]] where: \fIhostport\fP is a host name with an optional ":portnumber" \fIdn\fP is the search base \fIattrs\fP is a comma separated list of attributes to request \fIscope\fP is one of these three strings: base one sub (default=base) \fIfilter\fP is filter \fIexts\fP are recognized set of LDAP and/or API extensions. Example: ldap://ldap.example.net/dc=example,dc=net?cn,sn?sub?(cn=*) .fi .sp All "bind" operations to LDAP servers use simple authentication. Kerberos and SASL are not supported. If your LDAP server requires a username/password, use the "ldaplogin" tag to specify this, cf. .I hosts.cfg(5) If no username/password information is provided, an anonymous bind will be attempted. SSL support requires both a client library and an LDAP server that support LDAPv3; it uses the LDAP "STARTTLS" protocol request after establishing a connection to the standard (non-encrypted) LDAP port (usually port 389). It has only been tested with OpenSSL 2.x, and probably will not work with any other LDAP library. The older LDAPv2 experimental method of tunnelling normal LDAP traffic through an SSL connection - ldaps, running on port 636 - is not supported, unless someone can explain how to get the OpenLDAP library to support it. This method was never formally described in an RFC, and implementations of it are non-standard. For a discussion of the various ways of running encrypted ldap, see .br http://www.openldap.org/lists/openldap-software/200305/msg00079.html .br http://www.openldap.org/lists/openldap-software/200305/msg00084.html .br http://www.openldap.org/lists/openldap-software/200201/msg00042.html .br http://www.openldap.org/lists/openldap-software/200206/msg00387.html When testing LDAP URI's, all of the communications are handled by the ldap library. Therefore, it is not possible to obtain the SSL certificate used by the LDAP server, and it will not show up in the "sslcert" column. .SH USING MULTIPLE NETWORK TEST SYSTEMS If you have more than one system running network tests - e.g. if your network is separated by firewalls - then is is problematic to maintain multiple hosts.cfg files for each of the systems. xymonnet supports the NET:location tag in .I hosts.cfg(5) to distinguish between hosts that should be tested from different network locations. If you set the environment variable XYMONNETWORK e.g. to "dmz" before running xymonnet, then it will only test hosts that have a "NET:dmz" tag in hosts.cfg. This allows you to keep all of your hosts in the same hosts.cfg file, but test different sets of hosts by different systems running xymonnet. .SH XYMONNET INTERNALS xymonnet first reads the protocols.cfg file to see which network tests are defined. It then scans the hosts.cfg file, and collects information about the TCP service tests that need to be tested. It picks out only the tests that were listed in the protocols.cfg file, plus the "dns", "dig" and "ntp" tests. It then runs two tasks in parallel: First, a separate process is started to run the "xymonping" tool for the connectivity tests. While xymonping is busy doing the "ping" checks, xymonnet runs all of the TCP-based network tests. All of the TCP-based service checks are handled by a connection tester written specifically for this purpose. It uses only standard Unix-style network programming, but relies on the Unix "select(2)" system-call to handle many simultaneous connections happening in parallel. Exactly how many parallel connections are being used depends on your operating system - the default is FD_SETSIZE/4, which amounts to 256 on many Unix systems. You can choose the number of concurrent connections with the "--concurrency=N" option to xymonnet. Connection attempts timeout after 10 seconds - this can be changed with the "--timeout=N" option. Both of these settings play a part in deciding how long the testing takes. A conservative estimate for doing N TCP tests is: (1 + (N / concurrency)) * timeout In real life it will probably be less, as the above formula is for every test to require a timeout. Since the most normal use of Xymon is to check for services that are active, you should have a lot less timeouts. The "ntp" and "rpcinfo" checks rely on external programs to do each test. .SH ENVIRONMENT VARIABLES .IP XYMONNETWORK Defines the network segment where xymonnet is currently running. This is used to filter out only the entries in the .I hosts.cfg(5) file that have a matching "NET:LOCATION" tag, and execute the tests for only those hosts. .IP MAXMSGSPERCOMBO Defines the maximum number of status messages that can be sent in one combo message. Default is 0 - no limit. .br In practice, the maximum size of a single Xymon message sets a limit - the default value for the maximum message size is 32 KB, but that will easily accommodate 100 status messages per transmission. So if you want to experiment with this setting, I suggest starting with a value of 10. .IP SLEEPBETWEENMSGS Defines a a delay (in microseconds) after each message is transmitted to the Xymon server. The default is 0, i.e. send the messages as fast as possible. This gives your Xymon server some time to process the message before the next message comes in. Depending on the speed of your Xymon server, it may be necessary to set this value to half a second or even 1 or 2 seconds. Note that the value is specified in MICROseconds, so to define a delay of half a second, this must be set to the value "500000"; a delay of 1 second is achieved by setting this to "1000000" (one million). .IP FPING Command used to run the .I xymonping(1) utility. Used by xymonnet for connectivity (ping) testing. See .I xymonserver.cfg(5) for more information about how to customize the program that is executed to do ping tests. .IP TRACEROUTE Location of the .I traceroute(8) utility, or an equivalent tool e.g. .I mtr(8). Optionally used when a connectivity test fails to pinpoint the network location that is causing the failure. .IP NTPDATE Location of the .I ntpdate(1) utility. Used by xymonnet when checking the "ntp" service. .IP RPCINFO Location of the .I rpcinfo(8) utility. Used by xymonnet for the "rpc" service checks. .SH FILES .IP "~/server/etc/protocols.cfg" This file contains definitions of TCP services that xymonnet can test. Definitions for a default set of common services is built into xymonnet, but these can be overridden or supplemented by defining services in the protocols.cfg file. See .I protocols.cfg(5) for details on this file. .IP "$XYMONHOME/etc/netrc - authentication data for password-protected webs" If you have password-protected sites, you can put the usernames and passwords for these here. They will then get picked up automatically when running your network tests. This works for web-sites that use the "Basic" authentication scheme in HTTP. See .I ftp(1) for details - a sample entry would look like this .br machine www.acme.com login fred password Wilma1 .br Note that the machine-name must be the name you use in the http://machinename/ URL setting - it need not be the one you use for the system-name in Xymon. .sp .IP "$XYMONHOME/etc/cookies" This file may contain website cookies, in the Netscape HTTP Cookie format. If a website requires a static cookie to be present in order for the check to complete, then you can add this cookie to this file, and it will be sent along with the HTTP request. To get the cookies into this file, you can use the "curl --cookie-jar FILE" to request the URL that sets the cookie. .sp .IP "$XYMONTMP/*.status - test status summary" Each time xymonnet runs, if any tests fail (i.e. they result in a red status) then they will be listed in a file name TESTNAME.[LOCATION].status. The LOCATION part may be null. This file is used to determine how long the failure has lasted, which in turn decides if this test should be included in the tests done by .I xymonnet-again.sh(1) .br It is also used internally by xymonnet when determining the color for tests that use the "badconn" or "badTESTNAME" tags. .sp .IP $XYMONTMP/frequenttests.[LOCATION] This file contains the hostnames of those hosts that should be retested by the .I xymonnet-again.sh(1) test tool. It is updated only by xymonnet during the normal runs, and read by xymonnet-again.sh. .SH "SEE ALSO" hosts.cfg(5), protocols.cfg(5), xymonserver.cfg(5), xymonping(1), curl(1), ftp(1), fping(1), ntpdate(1), rpcinfo(8) xymon-4.3.28/xymonnet/c-ares-1.12.0.tar.gz0000664000076400007640000660062713003327002020120 0ustar rpmbuildrpmbuild‹EþìWì½XT]×0L H—’#ÝCww7RÒ ÝÒ RÒHwH7H Hw7ÒHKˆðw<Ï›ßûßu½£3sfŸ½×^½×Úçp–­žÈž–Ž‘ŽñäE~±±°Ü}3°±ÐÿþýóÁÀÈÆÆÄÀÆÆ@וÀñÿÐë'!?¿ÿyüAþwÇ:¶Ž ;W:C£ÿNÖ°23ÿù³°22²ý&FzFV&ÄÿÊÿÿø‹T^X,}fxÒî½È,x=ÀZß ž›( ²2v0°‚[¢¦ ;PÔBÏ$ 2°6ñòÂÛ;Øô,á]RÔ-íçêPoJu|’<)âÊm\,:p®UÆ—Õ¤T®;YíÉæÂE8I@él/¼$o œ!ÑPö:~î "!yDãtîš¶0­¯$jq=vj!º¤³Þ‚3³îy ê\—½Ž³è9GPCYõë2ËiÑ#Y& ÆÃ5,º Ö­:v™Ÿþ5œèsÐäÙ©ÙõPW$10£Æ`-ŒÔbOžë¸gÕÔðÛKsŽZ»´Å8ÛKníkóNîtÑ–üøÙº­Wïb8iC_t^²~@7r׿9á~Ãu̽dîG.gññé“ïýÇÖBGë&íIЄ®†«.¯Y¸>ŒY¾èåÞ‰¨x߸zòyu>¯? níØñEèÎXB Ez¯WzÚ¤é ´ª&6L YYc{¢„·‡ö² âŒÐ¶ó·&Ÿ0éq0]ðÐúøÒR.ÕJ¸¼äÓ`c WÔx*¢Ø—ÅÎ%«µeÙè×4R‡j·ÜéJ¥cÜNl5ÕZøÇÏù›ßi}X eŠF~ ƒ{B÷â±V;Á—´wïsŸ±¡–?¬ªâÕýèÿüÍçÚøk>~¡/ôñ CÚ-5w.KRˆ jVóµÇHKÎì"›!W曺ô÷–9ޣݘÔñ°­‰>¶Uh ³x£Ä~=ÀQÝ_LV\ûiœMô C³—Wp¦«O¢CÁq«6¼‡•¸–a2t öIt^2É$?ŽÒ›ú–³úÜGkž(0<Ø5I°ƒùMöŸZ¸+IöÓŒÈ7g§F±TÙGY+g!×±RœëÖÒ-ÉåŸÄWF†Uö©§os}¬ÆÚÕ+åßx8¿¨"žÿì"FÜàEãã±÷ç¸êÐä—Š·ÏÃ+¢«¢#vH÷‡én´6è …/É|™ßo+®;^áÚŒ,Øïž?{DÎëMÊè{ȉâ±31K¶õÄD£r«CöƒËšW¯¿”o²-ëTÞƒ©Žþs'†ÂHßåÆŒ¥üfwH-N|‚O t†•îoŠX·çS…kY\ÕX?Pô—‘ë’ <£‘²,jð¥/B œ„Õ'Az¨q¨˜ÜÕ„¢Øg®…ðœ3sž+ì@øyô*¤„‘Ϊ¬œis ß¸ÕÁ›Ö•-<ÁGüo½Å'£Pêhô2çƒ-jømœ}ƒ©Bæç´ÃBh2ØC[¡sz>ÙáJÒÜãm1Ö"¦FHVKŵtŸÛ$û Ùð)¾¡ë{f¡€ƒÇºüV¿Ë¯V8Þ'°ˆÛ #‡Õ~`ì+tÓD2ªç ¨‘]Þœ-š®oמ¼–ªPKíQ¼LÛzžDOaCÌ·O¯îü Æ õâ«ÿ)?1wEIÍ#èd¸«8~φЀ›ìF¸žٚkY#C«ÄÔç$”¬ÈO„aª –¾‹FÐúVHØk½ÆŒÞG|É1™O¢ô‰%G2~&®¬žé]3–p@ï´¼ ËŸó둇{[ ËÃX…¶¡Îì»Išâ½{À`JÀ^ª²×ãÊéM¥-a,›Ÿ!VêV #XB‰óŽ]¸ÜûbK¹æs-n¹Rÿi¦³A`ô7ºvŸâ—µ2!ÞA( TaˆÎ6_Œ¡ÅŸ¿ØÌ…>VÁE•]A`¿(üèøVÚóTyÿqcÖ“pâ\ñ·¡4Ô= ÕÁC<ÁiKwb†H–ÙÁ¥— º<ëíuà=po¡NÀž­§uƽ)6«„‡e·§m°'%»2–1NÈO r5Xbu0hÇ1&ö” LÂnÃâà‡cIrf3²sAWÓ4ÉmŠkò•öÎ)HËw‰É%¤+£ËSUÕY‹_¬OŒU[ŒP_#4œ ‘eÃl 5'6MEÊVå?)¢`³EÄm±0f*HÌW5R¼9G^{ǰr±÷ò=fÉÑãý–æ÷KÍ0N½ ´ðÒ—ÚÅý–„€’hƒbúí. gš¼kPÃ˱55ŽPn­¢ ˆÃÚlœ(|1hÔñèךô¼%Ê^¸úr;N*Å…WÄ”ñ=’eÊoE^[H­ûk-‚ž@–Jp~鸢ãðiÀ÷B‰Z“gs*†:¿ÍH¯èÇ +‡ ÈÚܤQ'¹­>‚hÞý6‰­íF†ˆîÍ¥V‘ÏPq€äP&÷Kï' §`ÓªCÂ*A¤,2žÄ& 6sžÖDm¼¢ÏÀ.7õ:ÀG®Tí@óG³šCi©ÒCC: ³ú^Ô)ñÁ4îæ„6œ©ÀR’Ø(Ç2¹õHÈ xÊ­V—†*k,/“ëˆÜеèœ)ãØå ª£Â5ªà§Noí ” BŸîø—¿´fcÿl®›´Ì/Mjc=¼ðA1‹÷EGaûƒø ü8(¥Û:ˆDPïrﶈm‡ØX×ùʼnN÷gy•á|tU³þˆ®Ù™é¶1°ý%äf`ÿ÷ÄÜ*ss¬(Sª‡ÑP“)C±y¬jmßÍ´÷…ÊqTHϙњªf­^påXÕ(=€¢ILéã`2=F ,ptÖ†%œ„ߟóÎò8$ ÷ TÕÎZR¤þ X€iF¢¤Z&§ õÃ~ÙªÍëñŒD‚¨ðèÄßS†Fõcá‰D-J"zò£Ø4¨ësê²gn¬2“)§éÞph”nJ;¯´ µâæ²J5NU´œc¿‚F±MŠߌÑÞa&*ÚPûJ¥§t2Žù ¸:q[U\ëIJÐÕ¾’È9…@?hUžLõR«4Y0Ð}ýЬ†Bfa¦† Ǽƒ%Ӯ´_sa ß̸KbõxSà±8…¦µÕ©#¶´{Ì wqi 'Ý““¾ð%i†™Bà"×XJtGˆ7šec^Á—(Û5nìa·•f˜ºî—‡7zyïT/_lWµë­2Ü6õ/Å_˜e¶#PÄ–iÙÆñ£¶Q²ŸÃµ¸§§Sª H‡ ñ˜ÂâÆ4V³EC½ù±¤ÑöE‰fj>A"64¼äÂA˜×9BÔú˜‘q þš/áFUä ¥<‰’‹qs–› œƒ\áÈŽ.ŽŸì3þ鬥}h"X@ò*¸3ïÛØ[æRû±¶N³ŠÃ ªo¢Ÿóå;ú1±PÒkÓÛæù†ˆ°é×_&²¥x^7µlà)dÕ­Ý\VÖÏ3Ъ0N>9àÔóá•úPêwÜaee»ÿþyÌ FíŽsà÷ŸèïîÎp€yzß Ÿõžˆ{î²°þýößæ¤¿›ë^ à¾÷rûñýû»ßßåöóˆýî øø^nwß?GÜIïç~ÂÿOÈŽýoD§.­¤$ ðCtŠÖ–zV–Ç¿StlLÝ_÷S`wÇ÷½à*ñïïß?*øwfÝÿƒÿÉîŸB¸Í{~ ä~¶{AÞaÝ÷ÿMü÷"¼û=œ;1ÿ½7¹Ÿß¿DøËô~±ýÃ(Ñõ—ß ö7½‡HÿeÿD‰(Ä¿êóoÁCaýÝäŒ÷NÿŸi ãŸÝ_êu§<ÿT÷„MŒ@àe ¼Ži‚=9=ÐÈhd§–¦VŽöZ¿ù¦?ÍðGÍ»ÿ)«g ú§~U¼¸jÒ20±h~—ƒIë.m0/HŒð@{ƒ»Ü ^õlÄA¦Æ&?~ÞMtwîn(<ð;T+c ð TrY>0гƒ4S{{0a÷º}§³ð@µ`˜™Á§ï”¼RSõ€ú@ !4M€¦@s Ðh´Úí€ö@ #Еòsp‚[ߢßÖØï)Ðïü%%ô3gbdgdâåý•ž»*+©âx1q'8‰ŽŽçÌr›aï:½•JPÈW±mC”GQxðú]dÅÁ®Ì£gÞoÕ§±a°2f5ªé0ßuÛ¾1ãJM’cjªOÛnÚÚNâ0t÷j²_ò8÷8ÿj™8â3bR•5ÆsIíŒ.bÚëãÓµ…So{ɉO+ÜžßžÏõD—¿?u¦ÎfPœÞaЯ}©­gÉÀÇRé5;3—XrBük*$WçÛh©xZÍ›¥è‰ƒ Ü×$ßöez°<5$Ÿ÷p ùðǦÆPö åƒÈ$Ž…¾€ŒÉŒüoŸ:÷ð „ Ç&bgåܦ{ëMS«Ïp¸^êKè¿fN¢äåä‚h Â:¿è+¨1׆µ±dªáÕÀÌ…ZvÔèM#Y×àÎùX˜mNK÷‡ó3ÊãIŠæYÃÒ¿uÌ mÓ[g¨—AaÚ"£k?Luôü vÍh:’úɽ—cÓoe:gíóËç|IÈ›ï²kL™½wç‚r!”#QÓ}úNý̬Te‰½6mNÛˆè§V§Ë(éËâí? l¾•tú^ŸeõmV×#F²$!Ë$¯å>©¥TB^˜ÃÆpeËþá\ô X‘X•‡U/ž“¶Jz¾Ìè=ßG$P‰ø Vz6’ü¹#⫃Kä+}rˆ2…kÑu2fÿeóúi/¾eY®ìÄ¥颵Ö:_{¤5x/̽®pVš;Òó·áãB.15ˆZ×ò´H¤$mYîB»èÚ"KœŽôLŽ•EQOŸ9‰2Œ­Ryã™øoÉ<[]/¡»PC- Q5E{[‡w\ì‡4²âßo¼’ìè S)©‡\¶{ÈçC(Mþ8ð3{쑃‘/Ù ¦@X$:µPZÖÓ4èf4§²‰„¬÷5ýÕbNøáÁè]Üïf½VIÖ«äÐh§øð93?®Bëû¥üæUï‡g?ûÅч—ì'Õ¨í·<†j*©)ÍÎîyC;øÜp-$$dÅ®E°ç©V·Q܇õ8˜ËTÙFÜåÉå\¹Qc4ÂŒg°Õ-©Ï¢‹wÃšÚø<&øXÒAÖ>¤[¢ˆcZkT”»ùSgÌÛÕ‰„„ªsÚü¤ ”ò®Vɵe4áW-“_· ް¶2j#ÆT#/éR$ºå¶½ÍžäÌ!Oøü"7Û¤m£ŽXo»%›g¤s{z#* ;Œ1B8Ä­EõP;p?YïÂü!¢6Ymùƒ¦’Ããézºâ±þJFZi¦wjÒ¢7m GO]9ýPMlÖö3 „2‡ ŒJ;É­ ¸GŽú¸ULç­ ¥‘ê8 ¶B ‘=á5âÖ…¥'౉_wñ Ê[ùÀu¢þ°—&tèkG,Uèleñ<Œ÷õ*ž…¡h– ìe¦ {±—©Ë^Û) UFñ;Õ™>ö¥&ÚЏa½e*¿KˆØ7’4¤œºnJi¬*Þ‹«VŒ9Дtocœðê!ßspO¶=N’ÐFŸè}¸ËÃ×”qj“’ðb Ùª y­ž‚yÐz6»-ŠRÑ´b W+wò‰– ´oI,)3±²[·Üi[Îè ›–¿XáFã™òè§7ÍäËMÝþÄÅ늒}œyVÛV‡ÜI«™Ž6¡í;C —;žœŽNÊ”|ZÏí­ÀzDJ mïµs뻕ö„{ÑÀ•.Èí5416OFÇŒœÐ4v BDª(Víô¹ß€!‹Ýp–1écû(IfHUù·KHS/"q[HÉàæûq¾Î—øÙTövqd`âtœ²cd‰:é(]ݤ2´¼AÀ7à¤Ú:]7[¿ÞJ'`gÁ7 Asé5ÖÆ¹|ÎÖìóâc)Ó5?òa÷WÍ)ÄgâPv~‚ ‰¶U¹lJ”â3IÝôÃ5m¥•²`ëÔÈÐ7¯r,UéüÄ~uH›Õ‹PB.îÚÙ:¥(} é¡›#±;Þh$GSe"a¡Ë«o(êd!m˜ÆŒ*!ЇçüMJžÐÀ›g0Ê`_ÖDNÞ¢$[H|îôÚâ½?Ï;›9|f¸J42é™÷ùñ{Ü¢Sª˜‹Q4ظ ˆ*ÏêŠò™MKîѧÏ3ØFЪŒ.MNk•°góé`êø%lƒ_VóÖ¡¾ÊˆU®§õk¶NÂÔ=×y®`7¸ï/uTz;ÈÞŸq…S‚…ãüÔV}øÁEù=Y$ç«IûÓæŠdCob$Ȭ‘ãá±Õ²3ÂÛØL^“hh[ˆK Sƒ“¡’îÓgMV•ϱ}0Þ­£$WóÄ®ÊÈ–ŠG7DæÇ=ιSì÷aGF>Ž]eAB“Ô¦9m *kçÆD .âE?Ë×'ßk_£rIT±¯Àvæµ YÉ)Ñh¼ZÃuÌVp¶’uÖiìâ°aiº°#ãðMT‰QÁ(äX«p±£ÁÁ,(›GKn¤+Æ=n6GCé„;š³R=%.Žöq]MŒ» š0ïÕùx/oäœÍh bžUÜŽ-Ä¥ö?¹8Ž:åÓ±5ì˜q75,®Yé>DzÓXy·Dºd˜~ºÞ0PøÀ1"*êÀôéµÕêg•U¯µëë©R®Ö.×S§ê+×”Æ>j3¾2üg³­'²¾d×Ò²L^b[HU.”Ȱ1ådSÚ¤Kubr®1Í‹ÚùðtòŠž 0orma›Þ†ž\h ù<$ÚÒrãŠ]«bö>‘ƬÒˆf[ø8ãƒz\}õq¼}ê@$¯»ÕqozSÕÙ¶üC['«ä‘Œ É\ø’ˆ >ÂÆvõýc$Õò¹O¨šˆ.ÅrŽÁ F³bú9xŸÉ·ô˜²öñLëÐ1VÛ“ÛkÚ”,ÏÉ]ìì^¥ªP ¢¸Âkhîà&ÏuÊp{w‡,êÆ΋¢²ƒ"Gä…{óÙoËò$»$fžÖa ¦Ó~0—¯ã.rz5ÊGÁý¤‘[9S¡ ‡=Rz#ñE´¤'f½Z€œ?|‘®R‘ã£K̸#æÊÛðà¯Ò",†O>ïìðÎb|^±WOæ±\ô„YÈ(4=ÔöÞÅZZ$#YÚ¸oi¤ú6ôªlÓ•ÒC‘?lÄw~Ц²ÎSI-HIïÏw«¤šÏ<÷ ßgÑmRodºàtÞ<ŒS”SóÖ)îüXiÅþ­q䃘W¦¨]Ó7ù Óz»Ž;•'9RYrÃ;·j¸ð3bçâ¦R´Õt£6OôEBÊ5QšMŒð\Žèl…fÓ†é«\8Ф«ÙÛ'`òÎ$‹Î }Ö™âÕRa?ºN¸RËD¼REJ¸½:5ç]9Lõ\øI­¥B”ÑLôÆ™naòº…‡P–_`Tâ–G¦4Êjy”@”QŒÊ<¯. ~$&9 v| I_)¹ÈìRsL©J¹2ůÏÅ!»Lê6–*Ò9)Öö©³:Ó~{èÃ]i ÿ×mE†g²ñ÷›ßS p€NËHÏàCcegý•i0ÿ#Ó`gýC¦ÁÆþ{¦AÏøÏ2 VÖ™i°2ý–iB@a P(J¥€Ò@ ,P('t@e  ð9Pœ“€Ós©½ù}rb`mi©÷+E1³ç.Åø™ªX€ìíïó+GK}½©ñ÷ÔÅæn—ÒdäðýÈî#  ªµ!Ðö>±±·Ð³7ÚÛè€î“G+Cðxk;ÐéOãŸ2ÆÿLÆÃBÏð{ƧÎxŒg[¢ÜUr$Ý0‡É"4wK ̵f¨©ˆV¡ ö<òg¡DT{Íæï‰ö(Ì"”òÅûåùÚ†ªÁº~i1.Y|cÎ}÷¤ŽMwëw•)/½^nn¤¬o´œ7å:¨Çk׃j[±!#DéÍ‘bë–jŸƒé—Fb2‡:dĹ1ø¼e$¶Ü #‹Ô\™7äèã• Ë´ä7—‡öÉxL¯7þâëkvF*×/b=^bÓi7­/Ý^»u}Œ4úèUÏè^,NñêM3Ä­8¦Ä*º¾ˆm¯öêô0ƶEúÅtTÝŒö‘¹±ûà"1R­×#€3N9ŽõÍÐsçÆöÚÝÅ£ F1Ìl=éäw«c1I»1Ÿ|C+ZTg3Ù$>ÝÄM±^¦aG\e,yÎYÁ¯75t=X6‡›²…ÿÌÅû Y «L¡¡`&¯"öë¤Éå}åçŒEò ˆ²Šï’~úŠw3ñdpš£!ÁG'‹PDt½““%OKðcݰÅîñ¡^A«ÃðOZŽd–ªuµáY‰X}ü¹€UOÙ¼Ê6(zµ5 "Õƒya©´É{òѰå‘§¥¨KÌìcì F¿ÛÖ÷Mq­1ò€6žÓEe†Ažç³l'v½·œ¤Ë­ÍcXžÒÜv±9™.“JúÉKRž³#ÓùÔ½‹‚Ë©ê:‰âJþ¶#$.Ô„x ß"ò2“7¾EÙÅëïúå—ÜÔ6Ë·ø DU›Ð\ËTŸ º·ˆpºt+ídfH=ŒÙ¹™Á~N Yô´ùŠzŘVg¹ Ÿøuž½ËZï¸&sÕb>å_ªËrÍqŠ¡Úµg/{»nLªþ©á!Æ)`EÛ¥wZ^sQ}/0œkàº2ÕÒj5~Yp¶[êõKvZYÒÞ‡ÞªÆóòóïVé\„Ú–‹ù:$ü<Žƒy}dÆQêC*]‰€Ä’©q°ã€Jú\‹Ö3ñ.þg:U´‚>(ƒ"öºôuŽPhÖ6QƒÔ-†uØìKúâo}Oêߺ…5w¬¥¤È=d¦²ðö·¾ßì@fmƳ¶ vqÇ#©_É›I‹ì´WL@¾Õ4²ƒñ{ͨRIÍMëú`ãÇæFÈA¾wb½õñXUŒëLÛ%µ§>굯yRÙ‘.É5&,ðX°2ƒI=KÒš¤–Nˆ?<7@Á°ïዳÁº ¯:âqþ¢?BV &ÝA :¾—7.‰=¹W^ ´Ès²¤ÿ¤ÿ¡eŠ;6ßâfËl?ÉqPA¨ëk+öeëe|H«­oq'6&ó„tß¶Œå"QˆÝ+&Ü•§Ÿ‡¼\æà¤L&ƒUÝcyõ´¶fNÕ=™D,€¦E3i ïÕÊ| ößðΛÂùx!‰¤FC¶ÇNÒËNy]b]E 8kPåÓŽ%ß Eóù(®*„º¢¡9üÅG”äETâÛTŒ;MܲßÃë.=NyjÝ?f4ˆ°‡€W5º "­“lãY—·×qW/$Ë”OP+±z ¬jpRx³õ¢•¢°[a½ŠDj#M‘5ñ!"ÏzxKâ ž‹µ¼Óds×Hw@ÈÁ4Íz,Be#%?ူ’”Pç=¹AÏÝãƒô¤ƒªÂôíé—Q•†J t±!ué)Jj·g¤ÖILð×að°Ñ0›ýyoöâò5è`sùÞ(/¬<c•ÝQ¢®/!i–tŽð¥”P/¹eàYŠÇsL} sþ ÙùØ{lT,ƒ¢ˆŸÆKð¦w=©I2Ž7QÐÒPZ:™ I~å©£àž«~(¡ÀV„ßûúâí’u gÑÖÙ×¢’€)I Ïvq8+A+ Òr®ÇS’Öt±*»{ŸkJŸÃ¿)Ë]OµuVËþJÒTßB6ãkµAß˱Õa¨^#ߔӂiéü Š ·t ÓM^KÛ‚å H‹² À’Q=]õ-í ãÖC¬äöeaC{ËÕ¶¸Wš%%U9ÕÃ- '"o¤¨K±dmÈì‚>3]8?9bᤦæÓ)JJVŒA‰–cC|FÞ¹°ÞÊQ%0;66?lÚ¹ÎWÑw&À²bME9ÔÑ2“ž§žÌ Q3Œ–h+7øÏr¡8|[õ¾ÜKðµ»u›yª ]2¡Õ\·Ÿù {ûAˆt@Ê›ÉyòÚsͰá4$£1mÝÜ\7Pt"·jÝÃÏ|zß”(‘&$(/ÃóÄÃ:lh䈣 h‚¨ê6e³ ·L”®k:9“—øJŸ‡_mÞâ‡.CVôÂ;gäÌ®±È×Cæ‘k' s6Ö:±W1¦lr·»\èõÒ×^B¹* |€õ”¥ñ,!.ýóxV,eìºr:þÛ×Éò\t£cÈR¤½ïeRµ44 NÝüäuÀ  N¼¶À##…uè~±gQXÀ†@sæ˜/Ûä‹ðÄYUÉÚUÝüY@ŸÃ†Œ‘õ&;†M)ßXtfH’ž·†Ç!‡Ã­ÔÜij…l,¬Â3E13EÙ3VVW7;väJÏÚ'-燂»S o§?n,e&úHÕÝ&šç²Å÷UŸSQ—?˜¹{B†\Œ¢ïŸ*..àÅø†G»RÇ⪗ö•÷SÄOlV’¦‡k›f‹xråíú‰=^Êìœ:VSÍÊÃ`è$@žiÍ 2F—wÙèbl\ì!ý‰;å|¨ø‡#àÆy“‡OQ4ñƒ©åžH¬sßÚV ƒædŒ4öú}È¢NÜõ$θ†tØâÂY7Ì-Æ0¥4-2ä¿” Ñx¿¡ÓÙ1‰}^®Ïo5™\.^ŰkÉt§F@¦îúæãzuC#1‰-ä,ÏäÆt?÷²O˜ŠÊÔÇò9TÅã´)ð5J[Ü!ÚLæø ±ª͘`Ï• Vr¬tõ5kxðÏ—?ÇØ€¨ƒ’ S·³ËQP¶,¦ä†–ÉMšjçÇvžo(80Ç0Mx½y’+ŒP“Ã6xÕáS[yƾ7 ÄuœUAÊmó"hK’0 !ÙÃ^–!qõë¼Ó60 /ÍUx”©‹ñ`3Ó•þ‘y²ëÅ£@±‘—¨œ4ã]ÃQudk¤>îÆÄv‡WO |ˆ£J<ûŒSlœÉ°¦Žï©¬cÓËŽ«*+^ÈX3cOºUóÊÊÌþ8±±n7þÔU_D'†«ám89ðëéÛ™Oäˆ(9¡,zº,Õ|Dníc0ÅÊ®ã.K·îä›bó*¼é¶»ùäÏ+ö÷§0æEÙ<‚ÚžŸX¾Ù§>Lôè+Ë®†rÐüا§ð.gNt§‰QÉÏîD žUJª okA·hëBFìONEX0ÀA+Z‰(OÃ=—Ø×±óÅ[$šV¸±aúdi³R•‹=ò2NQ8|òÇéÄhмÂ4HpV‘5gÎUs«ƒ(¬¡‰Øƒ%Œ•}3é™h²)m:~_k‚WÙ¹Ĉ»%Aâ] ÕrJyÅWc5VÐÉ n&È9_¬%Ó‚ÔѽËÞtGg„`N ÁèLWvÈYÊ[U°B(Ë)Ì ) Ò"bÏÙ,Õ1H~âåŸï‰ú¾R&xcáö-Wü`]ø©ÓÞVœHŠCpñM#eͧådv3ä½åd"•ú/¨]ÊÑÔÖìÃþdŠ´Üø§ÎxîmcD^ÝXip²xÞJð…åTŠ qÕñ%ñ^ÄûåÅœyÁû쨽Mk®,®"——xÏgV}óǢ¨+‘öeÉæª?84÷ Å>®÷·,§~*Ÿ¢ù–r‹ŸUMçÙŽi9šac!# ”ûÂàè'œñ8(†ú›ÃÚÉŹ\¸i+׈¥ÞÎó#Zy#AõñÊïâ;H’½t&×.Ðß“¶ LÔÚ>µ¡ÎôôK‹Ò-ÿÔ·,pÄréqÈRg¹½‹³eöB[ñ¶ðö£ %®ØƒM¤b ÛD’¦­¼Äîꤽáäõ«GÔ¨ÇÊpïÖÞkwr¬Á†ä4¹×°@vWÕ›P¹m…’7ß4Iê:@#N|Ò‚¹¢Ò5¬^´Î]ŸÙc ?Ðà¹(ª0ÜhqÌ)²+À@nG¾Ùµ„q·“ÓÜ~ÔÜ^ppù)<@N84?ð¹¨NùðA›DVsì·3«€×*Y{ýÙ8é®±ÏÝðÆhXÂdªU07Ì”$3dUÈ tt¶DB_Qì»Ì½¢“O\¤¥eœP‰Ó”Î{­Á­ý­‚ùEôÓ^ºN›º®ª³‘¥¥e #ø›Á^Y.ÝÕ{¤s¦É½¶rG^攽Ò»ò2ª#êF#= 7R^Ð51_=ÝÇL"ƒÿv:åcBÄO§ Z#Ïgûb]к(VõUNWÉÒ–8ÉëÁ0â{õl ß&?”5:}?à’ý¼*¾etDŸwâë^#¤8äT‹”›í©Þpóò箄B—cýX–´—ó}uPçëÞkz=wÌ#\)´SÙ'G¼%Ò¬ iö¨ßù2z€lµ ÆÃ%&;1Tœ,’ 9½¯úXëv$é‘3 òòr‹Úäa‹ Ô=^¼03{é¦Ï ¡‹õTùŠ^¦ÅÜ_D‰f_v·§@ür“4.HéÂ×iW»Ô,¬*qØEÙH}Dk´…´+ž‡½+l¬ª*®'™RÁ.xWx9³ü„´TʔêO;I'„•s¶þ|sF2ô…&£$‹ã¾Ø«FüÕ‰´´øTK‚zºzFz9pÝ=Qñ˜t63%O¯—ˆŸãp.²»Csg[!ºF„pÐ,kBEH]…†ú´ˆ¿Gž\ƒä«ÌR.Á ²üÒå1“á½ËÎZ†Ù¯È)NÏíFt|º]ãç—¥¹‡@¾îÖaHì|5™Øî×Éü:Ils5)¼4Sõh¸Üë³Ó5²µÂêÈà.oŠ-²ÛJÙãš‘bW›Àµ]÷ôÈùnÄ&vü„©ã²˜zÍÖÍÜì§ö5/­ù¼,Zaë›\^÷xN™P³›phX—t}åèÛIŒ‚¢˜<™%h[gÊl“WS¶¢g瘑Εé ÿ ›OéFnì{Aˆ¡1Xø×ýWŽçöë?¹!é~ÿ•þîf v#€•ý×}¿o¾þñ6ö?ÞæÁþÏ6_™8þnóõ·ýÖ?î¶JþØmUøµ×ªz¿×ú}‹ÕÂÚê·Ö{L€Fßï‚Y;ÚÝßbâjc²úuÈý1w;¯¦V  5ÐüùïÚwYš~ŸÐÞÔå×þ«ƒ‰üílýçXg  ÐètÙYÿaS–éO›²Lÿ™MYVF&öß6e=Ôà”•¦x6R²UŠt”¬å~Bæø;ò"š›…¡Ð~€ éÜC>$$>$Q{QĽéý]cŸ Ød„²×hìÊWkONš[»7ïïðÎxìgXŸ5;¸ùÇÁÌ»ß~[ºý¶ÔªÞ9Nù ¬+y;¾¢“éÉâÍ-Ô‡¸®þÔö¦^XŠBón6»÷YªÍKwéÄŒ®, \ñ?§ˆ¼S;i«‰ŽÆ“MD¤´I˹µýuqµ‹ðú¨7ôai2vòåñIM@®°Hç¦÷­8r˜Œø+„0¹lLìäxFk»#ׯhóõC'ÃÄÃ%n¦P}¬–r‡sÉu´¦îDZ©…£¼2K©¨DðŽCÜ l»Ó-ïEŠQýÊm[v'f^rç>ž½£àIÕêw²]Í­ZêóÙz«‰5I¹ œÀÉéC®ˆÐ4…ˆt ¬ò´¹¤’b¡Óú–Ç© ^ Ïç C”§ª‰îœÐƒ1;ó;%õÙÊCÕdêÐ QÝC<:5Ú㥤‰qB¶…ñb‚Éñ‚§Bd:-Ú£mˆ6P^´袾\EÔg‚MM”ôGuV·®¤QÚ¢L¦|Ìõú›ÉÎUáY iŠçk™¼dJcII­¬Èá[Žöý©mÜ<äÖcsl#‹$¾¦N½€ŽžÝ]íƒôOôÅî“|Æ~3·/v/ü”*”æðÜ9ìwêÃê¢çuR)7ÍSûRêhœ¶/°{VÂ2Ûô¸ñ¦—3y7hqÍçóCqMä‰<'@?án2C÷a¨$vþl[**@vN}§üsy*<ÿ1öaÉ/´t̤”„$ÆŸ®LLQi²È*2“(§˜ŽwÚêû„¯¤{0ÁÖ†—S§êåÄ2K #ÎfÆT“vCz4Ð}QzŸÍÜÒ¿}©©Ny åò…‘©ÐX€øMd§Ñþ ¥ ?åÙM’‚5_s¢#?¦Ôu€¸˜)rOå·cÓ¦Œ¬õ‘N³‚x¡@X²Ä°¼/^=0ù‰IìðòCp±ÂØ$‚žË‡ËÉ–Á =Ú§‘¡lW›ìq˜µoÙVëcízÒDaã—¡á0ÖMº‘îá­C"pDvjšÑŠÞDryQÎòœÈ´¾½Çv*0ïTÔÞ,>ꟕ]Ε¼ ªtëu~`r¥hKÇã6Äɹ6Ö‡HYú–y¼Ää*Ûúê°=h~9ï[Û˶èm ­Ê?/ÎÒB›À‡û>#€Œ:é[îòíÿ80Ç®‰pñù}Öü¾çwˆæùoÄ9+×ÛÝn0– “þE Nòx¯”ªð"Úªºédsa("&âÖÉRûß6‹v S’+8—¬úS¿Ü§LßìPŸ»½nQ•uŽ:$È%”Žìÿ2¸V¨Ÿ ‡ݰÃN“œãù–_„+Õ_*é¹UŸøærêî³ÏØ3æ.¯±ÉŽ´TÚzg†%ÇrO¶¨¨.:ç@-’œ6ëî²W/=Ëw‡–É=®=ÊN¸Z…ßÊž’e(”¿Ì ù8a™EŽ$?KË8CƂȓd>ÿÜ~$„|ªS!ÿÁ9ò—Ø`·­dÇ ä.÷žçWoëdLŒ{@FNèÅŸ0"ËWœÀ±½{VzA‘6}Ý)z2²|Î˳dcÆ|x­´ºïꀛ ðP*–L†o€;{së”;gDm7ʘ *`‘$3ékŒ–ùì2§ÜÌì”V‰zQÙèË¥<ÞÕ½9;A`=yìÙ.€^„—=0Ù>Æ÷{þÐÍäѲ¢™´µc¶y&I\lIÌÇI“* ²˜¬ìr¸áa̵¬r‰>Õá3CÞ—AL#$DÖÅRgšûâ&5FRµúv Z±Ð/_X•„Ÿ=i|ÿ”ªd®¹NÚ>:ÐTy.„I& Ë,@Dž®¼@ R˸Ą3Í* >Dnnxí£¸ë1JT|hÿ4Ô‘Ô»ˆõ.Úgô¢Hù³tÒÐÍT¼bFb˜PÞ:¡±Ä‚MÏ ¹ë“d支·þM©£ž9QÖÊk/ÙµE,™ÅûªjMŸ o*EV}}íèò¬%KÔÈàùgZ3Ô‚Uƒ.Ñ‚÷T½ë¡LDŠò§¢“ ~ 7W33ø ¾/§ ;N§+&b¢"ðÁŸv‘àÍ¢Î|#RˆöIIÄÌtsÙqB’&kp±¨„#º²N}U³N“ài)S 6‡ûôÚm¸çÀܯií›^Ijö¨öƹös\’$W¾òîoË/”c%U±?í°nSy­bU=#Yi1–‘{(‹+«cÚ)úþ©‚³°ÔKWÅo¼ ñý¨)ÌŠqÑI©Hüý4«(á;ç¹^u>ƒ÷,³ë\Áæò„÷Szaìxê4L<ªSû‚~é C¿‰ÁBÛ8­ÞË:€L2 lõ{™Ê/ã_*ê‰;âøÞÎ.lð2´°\å¹ ý^ËÎk×Iz@Úf¢ãÌŒ!“ Tòñi$*˜Ô0¡H¶®hècŠèBW«¢Ïl/±Rh Å›ÂWWƒªR“€Ð->Ðñòû’•h†!Têi§Ï$7J| Õý ¼y Ê¥ÙçpqªDµøÌ!ÒYíýŸ(¼kÅJb1ÒÝð3“RBå«–œ0 Å` Ê ¾B(#©¡hDÁðÎzýZôí­ä¢ImàöÙ{6ßÕcm o¾*¹'ð.p}82ê–9>îà‰µ„¬v‚¾x´ ¼þ8ŽÆŸOÕë?œÕ±c$¡¥al3ÉœÙ;HÓˆSPUµ,f0C¨"ËÌSÓ| í` )s°ýáÂÏ×C£š†V&Ë©ùÁV1A ÕeAÿ–½åà Rü—G´;xùñù}¯sCê·½#¤M°q(r}¬ØK"=·¥Ÿk¨¿›xJPþºÍí1àä²ÔþT%œö“%g fI”<-N%¼¸t|<^ñó^ÆJ&;)—׳)Šá ãE4Ý]‹ÓYQøqJ´Üg‡L§tÈÑ=´tÊ™¯7¥–_Rc,˜ññ*„ï§Ò³\Eã´c_Fö‡MJ“‰âžÌªL&ЯÉYÔ^£—jIôó¤ D} .LEM„XPE'J¡È×ïÎ"\D`‡i6¶¼¶]áo}ì34ž–9¸’çP 1Œ¥Y‰n‘‹Ê¥ùÆZW¦ÃrGϳ|FiFbêÈzWì¡#¼Õ ILÐ’¬à<·v½@ºù°Ó¨4^n«–†Ûû6Îjwb_¢3ÜaÛ®Å4âÁ±¢ã¸ös¦,ÝÌ"š²þÁÉâBȸ8EDWÌã,q"Ú2…|ZyæË¸ h8”üÏ}¡q$ùa9jMvïÒŒ“Ãõùóƒ…{GJz¿±Áu\nL‹¼”Ÿ5b˜zzḠÏ>ðöÊÝbò.÷Qúpß|«ÏxÙ¦5ïM\Л€S‘£8uï%y-® “ðÛÌWÁò™:òí²ïÒDçJ=ûjhíjžŸQ^STø‰hÿ02©,Çå½²þÒy1~>©ÌVtâˆ}TkðËXãèÝr‹&9ÓŃv•aÙoCguc•Íod™(MRž¬ÆF¿K¬ïM:ì˜%Oðº.úhÉb”`J†©ìUœsê)z a¢·h¢Ç@( j•Ç`¢\Þù€ä­ÞâšÚP™7y°$¬…ªR{dLž?«(äœ͈ D>@"Š^|ÄÐÿÞŒ ÷“‘¹ yµ>^à™=âÔ±÷[ñ.‚FêQL_"~gLjÁÌÉx“rw3ÊՌڑ®b€{Îë8ݼÐÓ“•v=$—!±’I‚iqÑ9ÁO5¬—w£ì¯§6eñ¿ êoGÏÙíér̶ip,¯’àœWw¢G/HU>¶Ùr7óí f7ÉÞ{ªoÚi¾Åª®Õ"¦·Â”¦5½¨®Zõé_•z²[(‹U Uú ÖâqÄ4·€ýu@¿èÍ<"0¦>:9fn•3Rù+Ÿ ;ÍŽÉ*ë²(q[ÉD”›ç&‰ì£a 驋ξƺÇ;h’ª#@­Ñ9KúœÓò³…ל¥ØÅ æ’˜Gq¾Ç9h"0_ÄãâªS¿.x CÇøKøÔ£ÎžUiö;¤Ž[(öÔÎ4Æ+R2ŠÒ|¯…£„4núÂ[uWÏAN½x› cÉÜBŸiäqä\¥äCE¡@Ê’àYš÷ð­'5 ÏˆzSÙ”ÛO]= øxdH»5ÒŒ¢Ó{¦wÞ` ¶›¦» ,Z³3ÐlY•˜@/,\Aƒ¬ÙÃU G ûé½SSvyS«döC­Œ©ÙY—¦ÞYÈAo#Ç’ªpÑ!luûy{ºqsµ¬1tª¯ÌpËkZìóÒxóÙY×°vÅ!Ñú,SìÇ¡¸Zomí“™¼”%/Æ×Ì@Œ2Œtψ{!Œ3‰üö뾨©q—îA*°!]¶æ©O¦ëCו©§tðne]û«râšT)…›pwWúQêàc¡èw·Ñ<øx?î?ôËŠ˜¶‡´ ƒ\õ9:‰$€C>“9ƒ…5 8SlCäûmxíãîᳫðÀk›ÖpLî3Ô!éX|" yþ¦Jg„ÞûŠö4eÎ'*ö›ØƒC¨\VáÞ×öÍׯqa_|ܺɚ×]~<ÉãXšF¨û6§Úäð\e<¤->”€?½0ršNø&ÖH3b^)œ0´³Æô©öìÝ.„ÄpÜø£•yz¡@Žü€vA‡">gØkˆ«ÊÆ×ÉW“¬4mê“4DëÉöšÚ®ÏºÈ0ó¼ò¼ ”§Ï®ˆÝýèì—Í숼]û-+0ÎÚg²Û¤®G…ˆ„}‰%¢‹ºpo;Ì#[l®?w‰ÐÉêLr Ä]Wñ«[¤?Pt…­êCÜÖ«œÀ„ö\ÈqLOàM½¬s¶Ù¹°³Ò73|)£¡$%#coo&Ãý9”7Æ)oæÉ86Èþz‡!öf kúƒùKZ¶T‡ä7Éä ÆõTüñ ÅÁNœÚXÚû8P¾YkÄLBÞ@5¾e˜|‚:G‹ 5['Nñ<¾3®ŠOÍ›™~é€8 èœÑÞfIUE#ÇjïÐ&*Ò4‰Ñ…„¹5øm>ž‹¯ÄC¨ñ‡ûÏ —¹=n„§âbÈ…Qñ}'+rŽ¡ëÜ-rÓeßeÀ¹ç ©¼`3p¢\dQrˆhçu|ލ?â˜oµ,ý‚LÅ:?âmÀÛxñím{ôË'Çýp-GYE`Råø7æ¬ÔI™ =4³t¼ùËÜUK¬ˆ—×D0ã²’d(ºMq;Ÿ¤ˆHe —Õ£*áö•™¾Sz¯È£!EÐËÁ13jqJf·Ì`^Èí‘HÃ;%ÔYÉ„L2øjnmubE˜3÷¬wh‰,ýÔú±A>ýõ&„ûu†–)ÑqÚlr¦öy#ÆtácônRؽ…5· ™ý¬ ì:ÉŽ¹ϯ¸KŸ1µ9ކ(«.3qç!Ô¹¬NíÈb ûº3ÓdŸ¶ª$ÀjÍAÝ-3Ø33¦¨}ý¶^KÿÀüä´E]/¿NCK+ ûk%Æù±Dì— å6䇚™kˆ•‘Î_Ëšõäj^9è‡Õ$âc c'Éä]ÍÞ„"ñ# ¯^‡d3§Á×'h‘*•ÄbGÅ›—޼ó6Û¶.ƃ: øØY-ˆ!`ŠTK@u-ï'9ÚÑS’„,DÉþm:ñáõkn$xF 0 Á¥ûÁ]î8!šHo3é5MѸ¼a+ŠÖÃG Ïr>Æ»„_t³Ö[¾Ì ?‹¬vR¶=â-.õŽÊ”T&ɘÙzH°Úfœì›‚Sâ“®TRÔ^¤¬jÎkÜú¾<¤AÃ^öëÕšU“kts_¿üó ™ÅÓñؤÁÙ7ƒ9‹kŒœh}’Ϻ>GÓŒ=³™èt‹ˆ»FŠOz@@RAÔ åcšHb`Ý}fX¹ò‚,7!]'}~~V~j4y…\Ød§õe`kAEˆW€FSçRìYûþ~s×·Šæ[´:áôð=¤Wâ2ahìŸÄ¦‚¤ÉRKå—1 Ã©æ ™TldÏ®uëÞ½©r”¼68¾ÚPá#ðšúÀy–ˆ(·â°´G˜€çi8WÔ!m";õÕ+y {8ŠOIqPÓ‹%“éHö£ã¥Ö!Û¡ævöjU Nëp}Ò–Ç‘^ôwV >û÷EG—å@FÎ,˜pnÇ_•¶•¥9\C-3ClúßV‹læà,±&%ž‡»Žå5hÅËèBºp¹[®ÞŸO—8O¸[};ƒ;ui·ÒkªW`¦•ܤ<Ê?!¡ïJ»Âíd]€ÁYô-÷ž¤l4!¹=¢§1Ó‘õ5*ÆÒL/ë)Ì,¦Å MÄð0,¯€fù„éøw`7z­èS0PYiX÷á*]÷»‡^az­ž×ë Ç_“zÒÞ÷Ä*?vwì'|÷ðVgú¶›@˜µ»•Ûçkz;EÅÁZƒ¡öªžAË2õ“ÛnÞ/·åbÜñ׌7fø²£b±šÌÝ”5d¼£x«nþy¢_Éñã® œoÜV_F»)̰Vnj<¨éAaɳÏlyç-j=k1¤òy¼Â=#i©Zu®#Çp¡ Ýî ðö£XcX’G Èk3-©ç¼R*¿Jo¾ÜGå/ž×X,œíj˜‹KÀ3³×,JÄn=ÅÔ[)Ø®¨9¹D‡œ…pÞ'1?VGZ¤ó½&ù<-±ÇÝ!¯6Ü4QìçÔ­;.Áþ©ÜFñM·±Þga=YYçÀçvÐ=&r#ýrÊ¥ûƒmæ%L˜Ð jhÄXški¤ ©t˜ªÕ· Xc –Ö°ýÝ{₪_ÆJµG®ÔðÝNŸ°¸¼¿u]hvnò‹DÐÏ"aPŸ+šhZluªZxpêLœfÎË[a1ÿlÖ‡›q#¼—Ö™QÈÑ^Fà¿Ð®‚Mç³dôÕ±œ·¾ó»é1Úð¬¤UQ‹›G3¿&™³ýÍ”­ÕsxØY’}\•¾ÔOïHWÐÜ-¼€¤^uWèLksÑeÝÓ³PGþ¹´?€NáulËRr÷n³}Å>UFë“G‹èÏB¤eÑ>t‘Š;å5rÙ¬°l ïÕÉ-.Ù um‹‘a…ÖŸ< i¥.ïùì›ð|:­u·ù†€¶ßðADjÅþ«LSUHgÙ-*N«1SÚÚ›w®J.Á5x‚ÐÁ¶ßÙ‚Zuœ‡ëc©½+ naØÎæK–2Lž~¤wÖ#~ñJÓ Êsš?[~¼ÃÃÎzrˆ²û‹¥ŽëáÓN5½F˜Ïj± fº«’_ØÎgöÚ®ïî;ë¶',ê4²/ø}{Üõí²2}öÛ~MŠùBé§ÆâU/M2›+&ý™È¥£îçÎhƒuç]K0²çï¿¡L½¤;¯±Öz`tùùýû\äpÞ›¦†ƒUʶm÷yÌlT?]žç3Q¯á‰L.?›²7ȘßúÇÉž÷!ï…™¾`¯>}9>Öêéñtj8.Ъo…yý•¶f9D=Qæ.ÀöFØuÉØW¾ ¶|3ùµ‰ j„½€¨v7ù3–8[áÎ+æØ*l¨-Îâøù8êqð ð„L`>€8åí¬  @v<äbòÒ1k{‡ïóÀìà þ7cfüßcè6pƒûpÊXš¹ ë9€xéXié9h9”˜8™9YØ©é9éé¹ê ?Tèþï+þ=CëùÛPk;e°JðÛYœîþ L3##ÓoÃ~ôâþ‰;ÿÝüÒ³‘‘ù׳´¼Sé»~œÂÖŽ– + áÿÈTÿÝ264ø…°£Å½uA ;ÜìÁH3€164à4²¶³ÔÏ gccaj w7ñv‚U|ÒÁÔÁÄ{˜€…Ã÷ Ó»)8-ô¬ŒyÈ]h AFzŽä¼*V÷½ ¿KÃÂô‡XîÇÿëodüaÛw‡¿</<à¿éõßèîìzyÈïœá_Ýñ?¼ñO»¦ø;³¦„Þ+1˜wÚO!Ìyg)ôŒ`Íxo$äôôäàn`ëú7zü°Š¿³Ê_Ïr±ÁÓYáÿñv+  À𣙉ƒðýŒÕ6FFv6–?µûÝ=ÑäOmôwhöÇ6zz†¿Œeä`ü+ÎÔánM»Je‰•µ…µñw—ü !Ê{L þàøßHâ#‰ÿ'" i AEEu!iYù»ˆœ4ËèÝGŽ&þä#ïžô×msÕÁTÏÂÔížÖÿX<ádmjø»™(îÎPþ ; Fà¼Î@kap×ýoc‹»Î¿Çù8ÃÑêΠïË㉺Ûîƒ °ÒÛý|T7<˜ÇN¦ÖŽöwa‡­£é]¨¶,pØó‡ùî€S0Q‚c €³ ÈêÑ–óð~MþGkÝ)ø¼µxk+°®˜ÞÿíÊÏiwè8XÃÿó ïc›@²GCwæcuî?‡æ»Rþ›ƒÿ©÷8›½Ô®Þw¸›Äò.Œ¹7ºŸ-ÿrZ0¿LÁÑÌo úó(íQ­+X+ìîâÑï€ÿ… ÀAÜ[î»Úÿ]ߟz÷=°CÛ1ÈÈdà°¾{ÇHxp¬dw¿¥ü=½íÀ¡(Ø:ÞÒýPÃß¹géhï©î&¿³ÌŸJ–=Ø+[‚=ذ:xÁÁƒ§¶°¶º 1­@wAØü8ý(@ÎÊô0&zö?¦€ÿ×ÔÙ;}š)˜ˆ;E3ºsk÷QäOGûKª`"þ!yû;uË×ÞäŽÝwÎ÷ÎÝÝãfäh÷‹»wÌ·Áÿ߿ዡ5èGD©¦Åâ»ÛYþÆ kksG›{Çf²uÙ;üÁ ÁzMÿÁ€ïŒ¯¿¤ûð²ï<ë÷åè‡kýé^þ6ʽûË*=C€½ž¸£:8]¸× 0q÷D‚ù`ýgþ›þòóÖ‡» öÓ€3‡ïÓ~·0Šð`]¸Ãü¯ îDøk¨!t¯ä?ÜÀ„î…dz·â:ZÞ#ÿ]Bà?2ðÿ;fÝû§;iÜ{Yë»j`Aìô îV{0Ÿ¿/NàEø§…ýÙ›_€õ,ìÁk¦ã=õwØé8|Çã_ê¼å}œtOöOî‚ùlgmùà¾2½÷(``zv¿ˆt´ºãû÷Ùï …ãk^Ë~¤`Mùi”¿q,‹»Ÿ®?L ܬ šì»ØUM­˜¬Ì€ß®„¥¥íÓï{Ìÿµ)ÝQÇa p€ñ›} [ß§gÖßs2›ï—FÀ륞¡…µù÷(ê;jàsàdÊògõ\@BZ@PBZBYýOsçÓ¿»<°Ûùð>Ùýa,ÿ¸ÂFGf؃|g×M‚Œîeû=â±¹‹P¬Á‹š=Ø(ì]-õ­ï)ºÄž‹èü]´pGñ} V9ßLû±Ÿ ç¤gjñÈæ @ôãIáßåkÀ1Ûßzì{ÆÞq矱þû õ}­ø¡èöð¿<û½†ZÛY‚û‹qàæû¥ð‡^wi>8û¾®îõ;[3Áÿ…Ÿ ôtôtð"zvàÐÊîg;ØWßÛàoFúÃö…õw7ÿE þ_,<÷Ë÷½j*™þt ?¥ü>ÿÆSš‹­ž¾½µ8o»CK0×¹þæ§à”¿4þï–ï3ËZ[ÑþêfïjïVÊ;ç 'D``wžõoUígz7å] ÿ¯mæŸyG;»û5é®ÓwÚ¬ÀI‚…+¼Ø]Ò‚-ò>”ø%Ôûlâ7„mÀò¼ü;RH+É=¼"àïâšœùµNü¾¡®žMÙtÏšÿZâ¨oÿïOéþ÷²ÐÿÄþž=HÇÆÁNì -þ*AÿëýfVfÆßê?3Üíÿ°2²þïþÏÿ;õŸsUg¬ÖX1<ÎUQ¶„rFõÁYã”ð9!s½MƒÜ÷J(‘„CéÎúl7XÀ÷Ì—’è*ÿ×’liA²ŠŠìA Y:Ù8·ð@º‰Ÿ'ü²w~ë£ø˜+üP¡ÑÍé…wIóšäµ•—káûLÌé<‹j#k+ß |=_îðW ð®õíêŒV÷ñM9;j[EfmN?¦_ši#\NÒï6•EóØZ¼ª—Ìf…Ò 4Å$û¢Œ%ê™U®*)n°ø€ž4Qá³/wÁà㯂›Œ XB^¹úb- UrÎÇYrŠ>C»òoû’nZú î¡„äÅnwŸ?O,^µÅÝp›¿4(­éEúne±£»„‘K˜‰2üñ1ošÖÀH¾ä'®XZ…ú9ª#Ùì,ÈSê EUÌm‘‚âùã]i!æ7G;WFž¼eÙL›§Ïìóàöß°‡¿6ËFÖ³R‚ÛV\R„ѾU³7Ö’öÍvGHÉnꈵØQç¼zH Å(©œ+Ò$9%²K/&fYðV(x–Ç{³×¨³(~ÅDï½4Æð6ꬮž3ž8 `Óä²BþÌUÆrûÉ\·^Ö(*’î—sÍŽ+JùϬ¥ƒOI 9_Ï\íÒc…ºÀjÎï"šªÑîíìÐ&¹|°ÇÖ‹×°Œ¡$9­Ú ø†}&|Y_™’©j„ ÒK;80W)­žŽ®›vä"#ØsöÛ,© \SûèÓ0dt26wòfùúʬõÚÍC³M#\Ë5QȲf´ølã3®›U•ÌW$²‹XK¡ºÒ¸ú"0!&²ÏˆãO¯,X5½’a­0ì©U ³°Lï˜ø¹šÇźN!÷cªÎp°Ç`“ª”Ãð;†ÔL‡V\ÌÊiT㔆ºÖÓA`^Ödñrª6åuâè÷æ;8÷TPu{Ø÷AQ˜°GO§ûQw¥FZ7§ø©·d¸_ȧ’SAÞH‹\P>m)1p/ñý%W »¨¢1½)ùŽÚUµõ¡< ܹNáÒäçñgò ü³¡½…Æ&å* Mó™ Žx%Ѳ˜0n…îikšzzë¸Bl:F—\ˆ#>dKäHûV™ý2žÆ›ÂDQÇÑãÀÓ?˜õšì~ñ°1G¥,¢0¥I€_h#bDôüƒ¯W:P,†¾ ášôý‰cù›u,%–¼Õh¢gd/÷‡âÞ”W¨Zñ’Y%Œ¾›Ï`qx`zž…I\WöšQVÕ`óÁIË.¾ÛAjû®C«`¨>Ò<|¸¥—¨  YIŸ56Èxœ¹dÁ´¤z˜a性+þeù°AY· ¡™B…øÆ‚©9âÀ—´¨Äï5nL蘩Ïc<>'²¯÷ïtFvê¢)M[ÛãQ ²cÒëÆš¤îL{ˆ®‹bÈøw² >DAó*7–æ¡ÛBÃ|êÆ©Žõ¾¡´i8Õñ–8ubòuI¼H0O¢žØ)% ÷}Ì5&júóuKÔ«Ì (GÕ®g½H¸4O×|*ÇíEXôãk7S«d0ÞcC¢•­oUB½9å“3I¤Tù‹Æiͳщ‡ÃÝw°æ´Á~ô1OÐ Çv®¼´ÉĆ޺* šŸ4ŠÀ+ñcðCµ!±aShiX8% <(‡œ±I­ŸÊ2¡4) åœeÁAµÁ'ÒÅQµCP6âxšÓŸû^.lo[ð.)¯,üV ¼Ê=šóì3¹ôDP«b@qü@Fzˆuƒ2ÅÇm¬tÆ|3Òol!v™.V7¼7€G-pè&moÞÑÜX®í\½}ZÜ9?ᜊ5LÙåà 'ïUý4ö-´TvkÙ©‚Ât£Ò4Ûø¾ø-0ï$‘“1,r?ÔÍã¦=hœ`mo¯~^Ïó"VÙ«´£èIö&TnÇîˆE ,ÝÆTz=Á~±g®¤V¶Óíùå ž wê¢LAäã7´µØöæo¸tFàqì֚ݼŽƒ.É7ŽPk|ϧj:«õj-Z†¶®›É×f<.Ó1y~¤$ÿÅ]¾š¢âô‰VÚÃ-î’€âÚõK¤Š9 G¶3½gû,NÖ©FsŸkªûÖ&„u‡ýF Nžb‰<)ÑC Ðkæ šSñ-³}¾Šª<¬À‰É-€öÈŸ òõ ‡Ó±]Ô”ú×€žÜeH¢GðPÅLœ; BƒðÏ{㥚Ÿ ËJŒ'¬²Yª5«'¾‰MíN•µ.mYênÌÓ£ÁÚõ#‘(-pébUOV¶s0ÓCÅoËÚ”Éö=‰º¿`EJì‚­LÞÁXÃK¼y&}ñÈ RíÍ(hä&”HÂ(žÆÎöøsó÷*ƒq*ée/ГJ/öeÖÊI˜€ÇJ™Â$ÀÌO½«$õÛÇ«= —õ¦®Ñ¶—^¯æQë5c)ò0EZ‚Noq饶¨‘ÉI©wª£™ÒvÀ©Åû“¸¿£ Á‘êªÑÕ,b[ƒ?Ò¥gŸhVŽÒô-&î}râ—|ÓÚõ½„gnƒúHËÇu©™'B}‡¶’e”¥žzºmÄѳ3~~ÉÍvM¤õØø­vÇAÒWzÁBÜ©“уîðP <£8ƒÒàëöÓ.¨äwQvd»’o‹Å!ŸºÍ<·„Í}ÿˆâÍSd ¦?À8… bJùÁWϺ›¾¸¶Jˆ²Âaʪ ÙÃæPo7òß­Qâòf¢» Òɰòé¡'#M»k/^•Zî%NžóðùØ^÷–ŽT ZÂJm”ʼæÃ &íì}*éIŸo~!ð5¬Í½ó²Á²"]Á;]{ÃX ­[UÏAËyIxÓDÊÿÐ×μ~1ÿTýº¸ø`‹âd³ïXå2@XCC/)íDLòÓ«Ñ-  Fæ-'®—ÈÏw1q . mOX:dõ…¤YO²¸=©¤»§ œq‡ÓàÚù!ÂbNíñ¤½æí'Hr›Gܬµ*&kŠ/¨3(Â8 –"šÑ ¢Û a9篧æãpí½UÈQä_åj¯÷óä×d2å_óëÒ»Gr@Ú4„`Âl>u.Rêp޼ôš~Or}µ2èá@@œ²®VˆÑ»Sx R'ÇHœRVg’2ß ‡ÜZÇLÒqò‡}R„×y­³ò1©õͪ ”£I-¾·¤‡Š™nÆv¥°É³V‡J\ Ûæ¬ÝÅa•:ìAŒÀƒ> Æç7!UÚ3‹KÓ‡;ÍN°JßNwtÕÆ”ݼ$?ŠÐûçÉÅPªìBZ1»7Ýð>q‡³"y‡”_Ù¾¾zÀ¬kÕz$­½L’ñ¨ ¾+›Es0o©Éy…9åÄ7ÊÔÉWPtÔµ»ŠvG[öш{—%–Í;+ä+Ý>UiS4¶¿Úâ(›Ýç³®ƒàÏå7J<¼0o£7+¶`†¦m>¼_dye§›ÁlĪJÚÃz“‰ÕD»©&Be¨ƒò„1XÞá*ôcxsž“E±B?¿o¾¤€…ìU¦mÁ²*ÿ*Ù¥y`¦wîà4$HéÜÞ£]TdÖ4y¹h»ºj¸4ãC9CˆN÷Ü5Ahœ!ßÊm2KR€qã÷«xVïø ÍÇ?Y¹h4…˜T„S+DÚ\š‰¾Ñw‚A«k™1Wñùù*äK›§Ü8:ñÙóÏÄè½k±Y$Â$â^nCãèù šC˜E¥•ë!jÈê𑷟QykÖ;qÁм7Á~óúôyF¦r ¥þ“ŽÇÄl,&®t¬ìß|ÐU†xaý¶ ˆÆØQnä”ýÂcƒ~‚Ü´kú¿ŽÑá”'G—9 ñå h_Á›˜wÖûõðñ–½i­•÷Ù]æ‚X4?ëD:§ÈXÀJa٣Πï)£bJè$Ý^Of²äm+Lå8ÂhJóÏž/a›<LL¹æ†9a˜¦ÄpÔ7Ó…ÎhYñágš .ð^?s¯­Û5+©¬X}<²H …ò望ݥa¢*,KaêIdrÞ&¶¯ (˜ïUšÓ»ÉÐÜ6/HûèÐ7×Ѳ¤£íªñŒiÂ:!¯\’øÑ0°¦ºñ{}toû¶·Ÿ6Rµ—CÌŸÁâF­…”_œbãŽoµÜæÊé §þœf›fËÃöóÕ&¯w ^φ'{p—¥Ÿùà>ä…mz—I%S<9(×tS]àcÖ+\_ãNZÊB±O;Ûç³IæJbÎß"úSGr#{!øç<)ù¢¸ *Þi)Á%šõ:Šô3º~ÙÖûÊrdn8+Wð‰h¾wãøÓTQ2¤düð7|y8ïd;‚wêFBLÉ·5ñp®gÛŸq…"?¿œƒ1{o[¢M;Y4 üÒ1”ò¡ÉÑáN;gÅ'»ÍÞM¶E™j©Ss¾Ýì¸8€AêØD·fÁÌQÜ':¸Í-TÎáù>6n/xóH_öä§„a0î*„¶1Z”UÌJù,UÄæeFEº n‘AÚ­cç/&eñ³¹0b®+éîâb¤wϹ€-ŠY" 3•swß·‹Vãz©õÚê2ÔÙ8€êv·ÿ--jEbA§úIoÂi°‹©¢ °þNZ¢ÿ0ó ¡© øê[žÑ‰J§Y|T‚˜øC/9yŒê—«d…·9´šJ†…Ú¦scB‚ΔNA!Ó¸Ûø˜ûè•·ïÛ.„ÌùÔοø„%À$ )T6ã}|£!4ûEá¤àrÜsÂ1Jƒ? K±eœÌŒ©ÚŸSÚ23^Q³4.6ng†[í{œU£t ÏUà\x^7nµãaFvFFš™R2NbÆÈ0ËDAnÖåI±ƒz(³òíó·tr~4Ä%ãHeß@>Me‚Ê]е˜‰=Ü{úd­k:5ƒx³Uzž½\ïu_Ž^)OL*Ù”ÌMÌ.Ý”ôÔW¥x™R³…”‡: ÷Æã”jeª±OK³£{ påì 5\²w-,èß µa¤ô¨4J°ë½¥¶Swšyü¯|äëcS•‚§O4i„ªy>G‘ì½ÐÁz‡«¤ì]Q­Þõêñç1*ö-þó¶¥ïãƒiRvi7éÑÞKóNdK*“i!C{n8Û,.ˆ7±ÅÕ˜¿ªo@=™jš×ET—µÌÎF,ÒpõÑÀyú‘ššú-bÍl§Ã)~ìò ÜBN¬Í:{Ø}ΆÇÕöKé6Ðo½»Þ¡ y#燉âä·i={ ³˜ÿžPþ‹p­TÖœ¾Ìœô«­‡(g©®{—¡R.qOtâᬱñ‡hŽ@жõ[û÷"™c´Ó~ñ—?@ 2¢…çºf°oõïsä4-â ÅúfSÆc¸ÝÄNéDùºÎNDÝrÞݲ‰5AJŽðñ‹'aùtÉaKâŸÉjr2\ȸŸ‘šhò߆9Ø¢iϼµ  .æ4Õe½£u_MäÓ"¼\ûÜÐüÚ²DB¦ fÛ¢<ÕÊêy_‰~q“¤)¼Ñ‹‘/½ƒîëÛh›Ýt~,”‚ç~Nº¯ƒŽ ÝTu¦SçŒgÓ¾ƒTŽƒ¥U8ŧÎė祈¾¹­‚°a]—…Ϲr²ËË ŸFN˜=¡‹žL­M¶Æy‚ëù,Û[ƒQêú žÿŠpBJm¢5×àKÒlk ”žkü(Sd㢦cqã–ŠÍ>&³ªÍ§âÐ,²Ùaß" k8]Î}O÷ô'e¼Âæš§6XµÆª¿”?#-Âï~¿TîEåQúN£ÁȆ ›\•œˆŒ»ÒS jèˆÎWHÛ•n…Qô´QÈSÉy2­•jQâ|bö1Ûǧ £âårÈAèÃ9xÖlO1ªgWŽìèÔ%{òtz·ÜËúl-fu¢«» 7©gõD°$¯‚—$1¿`ªšF=am[´Ö—ù»ži@SóWÇX› âv_qæ¡bç"€º@n ï¡ìŸ°4ºW¢<·!èÞÿpÌê×}Ñ>ßàTËšMGíî»é0ÂC·û&FIYù--?:N¶:æ©*nP9†õéÆ,—}^nyŸp1Ö¦ V\&ã‡Q}^J,û\J×2C¦ðÔìHŠ,E_ôõr ÿ.‡“coЖm®—ß*^EvÍìgmýi—[+¥v&·tTíé‹ÏûßÚwcß:}kz„v€¶fù³ü›k'U{RyÂÄiŒt&9SPÔCéÛäC¬þéCÚ4æ+5—œË‘y/85§4­?ó÷‹Eê_M‚kt «M÷(ÙÊ"H}@ùVùI£6*!:!–+À_¿)ŽÅ.–î²_ù[\ı5ã•ѳò¨)ï P!ͪ;Dd‚ës› ûÑÛеԄ€æ…Úv§KWÿ¨褢pÒjÒÏ­"΀¥øb$lkïhx1]×7ž†“ŠçI9äöxK&M*KI+ÛÙ)óËÍ*,‚ ›ž•÷ºZg£O?q`;þ¼êé}BõÚúBË&tÀ†}˜—Q¶`Le;Jåñ²ýáµù×3½J‰-2ʉgñ ¥¸æÆ§í-¿ÎÄMÛ·½àƺî J<¾PœËWí,mµ°¥/L(öëºÖÙ˜žFŒ«ëB~b… u<¬ì¾”I#lÐZ.¿×ÿN–¬)Ýú9Ǻ€y³Ê .•Òë异)^Ã:]œáéM(AÎNâ'ÔaçÅl\jß.ë–é4ØÏ¥ü=O ÛC¿°'Ä- OÞÕ™³3Æ.PÂé²r2Y£^™í[TX‰…y6 ëàÄîå<4K–,C» “ùrËëÓ¦aÊ1s='&CKE1=æ|r™ö¶E‚È;lð¨¢Å³¶öÁ’j9lÒhñh}t«·òS‹Æìp29­öoµ†ÛyвúXXب$f¢¯|>¼ŽàÕ?Ái]}Ž`S ­aŒôÙøC»é~‹ôÄd“-;ÁûA¥wYáݰª¬×&¾ŒD2:9/%Dó*‘z%Û¯—Œ‘>¤Gì"Uá0e´«Q†ÚìÓè §€ƒÕ­M”mqïâ'::ÒžKZé½b£8íÍHB²VvxÕàpx¥K|×ïbµ±e†´ìºŽùÊO—. AÀi´L—=t³mîâ0n7”#´‘Ü<BùXZúÊ#áHo¸#sF?î½å9Qý iÏf“ ¸Úíq•YÍǯ¸kËü%N»ócUpl==#ØÙ*é&]äZiŽó?ß?Œ 3`Ö3!­ä»`ô¤‡-žȡ柼=§[”ëZ B¾@[.”©k!*˺P‚u^ÎÜŸÛm1©õòM£¨9ʵFÆ•Tßäþ×%ýÓÏ5É©y 2}ÂØÄ`ŠZÐÃPIÕq‚ZÌ–DÏÿ¸Æ¬‰ºe¤Ëå|&hõFs3Ìqnì=ÏN¯C4vB»kö»`¬Tú‡RRƺ›\ ¢ªÝs¯I&c¯öº‚$VP{&(­s³Ò’ëÖéåÒå VÕÎ^^Ó÷Þh-æjæöшдÌΫ©h…Ët—^;|%t¯#©–FžŒÜ7²†!²'V.¼mÌmj¨ Ò¸~(Û†4)F§YúŠ×MÙõøSßZþ ¤v÷No-~ª~ñ ‹WtÅH©Ï\ã<7¾i,QD¦?Ñ(w¦â‰ÒŒ—³;S¹M(>#QUÕ(iíàˆx‘úTõÔ¼”Ì'ö+W/kÌ£'ÚïâùvŒ âÄUâ5ý¾ev|3óPr”R2¯¼|¼C.OƒÓ¦­ÿ2’¢y8V¥bRä(o>Å6—¯r¤•óžIžÄi™7ÄÊ4ÙgްÉ<ÔÕA–”½´:ÎAý q˜¨ tƒÁK¤™©Y°µ‚º\"„®Î3^Å– •Š,<ÞÜ+O3î¿d™õ7;öµëET©Úâȃ[Ò×ôåÒßÿ–Šïä.­œ&Œ]j 67<…88&RÜÓùJ÷Yô Ôà…D–ÊîXˆ 7Ãà ¨<“o»­ßâ-"ö{öî_lêÕ¬ï®8’˜t´ËlfuŽ* ¾j|…]ß÷¦/ÜÈPXEäùÀÌ+«pâ±Á¯Ÿ©]ÖÆ2ÄgI]>w »Zl¥t‹[Ÿïûh‹ŒKØK[f9’¯=áèTêÃWJǨ+RÖR¿~Ú11¼¬èòløUjÒóL¬k ×´Î0³ßId¢…î³­UÄ” ¤Úë7Ь]‹Kºó•'bÎ×W$Guï“#jè/ Â7ñ§S7êÀ 3pçJ¼1k±yõΘñJÖ3."(}Ô$ú¬§z¹-÷cЖ’ÃÔìÏðÂé£fÃe¬’¯†….áÒˆk£÷?˜3Ñ­¤-ó:—«†ákç0ò„¯1Xå5Má†FÁb$Ëss>‘Áí»ô>rAÇ«høV” y\MsFK±¨X€Llö²ùÁÇâái$_½½$â„;dKb–‰QäU±K,ÒBG‚·¶î°æH Ï®¾¡Zë Ø˜oa¹}˜GÄ=Å “DîîÂG2 ãÉ#N -…û€ùa~/xúLËëîy¯Š¬œ÷==ï‰ó³‘œœ‘‘DI•ë;ªÏË—F bôXØžN>Ꙃ¢Á|KÆ´ñ¦“?k™ú÷RMÐ>æ(¹¼×¥Ú{ÏìÔÁúÑÅË:Æ+ÈFrV Ô«›¨r¦v+‘1wc¶Sëò ÖÙîªÑ¯r½É£û!Äê^¢Ë>ºyÛ_ã‹ã=5ÇÈyúËvß“UÈãjhïZT§|öørAÿh~xŠÁ‹ä†2_¹EEœ ›{]ÒFþ%1žxObQÝšt?æaßëæüçlœ‘oÇ>ˆTàOš é„ ªlõí„oÀ:¤˜J–“æž ­¯®?’ÑVÖO[ÔÒ”e+6ëèXÂ~¯Üç@ƒ†>6–û4O)t-Su·Yäsôs™¤·b‹Iêq¯ž F£Xн>ÅNF¢¨Æ9÷wpÔ+ˆç¨K”l—ÄçÔw›ìYQm¦`±6)ô+ÆÂއÈòxKÎü«W„D"Dhø”ä5M€@Gëf³ÜT1éÚ`Ój5M.L–X‰Œg}( 2žÑH¦÷ˆñh{~|—:Ó\ÞØao!ÉW¿JöE•*ÓÀOFÏ¿Q8“;ì…§Rë¨ìÀáMº‘šÎ~ŸMž=˜¶ÏËÂþÄ–óý‘w$ÏÁa÷^ïâS%בuøc\×ãé”<>o» ®FEµ‡c0eMäÜ™¾gíÂÒ¯‘u¦¯†ü84[0–·}gÞ´âóy2z"]Rr\X\© v+ŭ묮ò¨Šð`+B1pê}F‘3›Â=u2ÍÕ>XÕgÃ}Ó—L…˜ë–Ðˉ­zõðÂ|æ?_ìŸÜ=ð{Y0vV&+;ûß•cÿcY0ö_Y0Æÿ\Y°ŸÛiÿž’`¦N ?ÖûOVûÇuð²Åö¯‹‚ýaÃíÏ÷±ÿg6ÜXXXÙþX LMiª†—ÁnpRC™^2Tæm‰9~±Ê8çê+ È$ᤠztƨh€™$q?ÿÆSÁƒêö Ëj,Û¢¸Ù¶¹Å/5`'ëáòæ ÙÙ×ãÜó`ÑØ›ìå5Þ¯žºšj½ÁÄbðÀiÓ/7rëÊ{ŠÑI(÷ÎCG’«r+`lkj…\º)ѦگrÚfò4"@öRpZ˜Q¶‡ý#Ö°j&zÏÚ»JpœŒTŽ#ÇÙi-ÖejGŸù¼Ôkö¯Dô’n+zX¸I9õF7„Ü\R ¼ÜÏ&x8yihA#ãaó0taóX®by]ør7瘾Öi”‹Y™Ù˜&6ÎÎMôöC¦„ŽyF9<Þm‚Ô§ŸžîÂÇnuí«ød¼8ÙÒh§Ò3ëx`©VÕÀB'D#è4Z¥]}TîH¦ÝÉØþFMt‘ìe°ó#}˜±=¢ë…NI"oÒç¨îÁÚú„åñÓrx€Eb$´ÝÄN½öT2,4ïDf¦—U•ö´D™=Þ#1}†t]Ô«,úèúúœ¨²ó´Fêy>¦;¦Ì\¡ß>ÒŽíî=Ÿ=‹¶`L})=Ÿ3îhóøúüqÇ+l¦Ú<7PõeeºBeikúJ˜Gη˜ÈÊÆ ¼T%žÍ£ì硸HHqH©H­\¡xñ­9nö.–Njú©—m8Œ"@7M—ð9µéÁÞq=eAžÙ¯YV”Úà&©C³>¼‹¸é¤ôë$'*&±Ë`fyÃSÑgתé˜Ñ¬ gäÒòmÀljË#×GIñ;Õ](㘡Bjr…*TlÐIa·›â”âýz/òÖ5E±?|"U¢Û= ×ðƺá£;Èd> ^Ÿ³Orc×°œ’’bq†”ä—*²€FWúE_ˆT¿}½(¿v8‚¸ng 3·…EŽÜlEN®ÂQY/ƒÉYÏ0‘b&í£[œ`U6‰®s\ö¡ ›ÿžÝJüí{kkåÍå´'e”ÏdD`ñí‰ÄøhžOMgš ;xºœì¤"æ/Ì]&^¨É“ú!ΧÅúP0˜›[<‰sku®Ô@•^…ð¬DznêÚ“]ÒO¥dÏ!~UÞ i<ü þÌÇÌ»Ë7´Ë畽ŠˆíŸ=’püœØ/ídšCEÌDO•1¥ŽbÁc„dô»3ª—ïÊ©#Bù&ßÝ ^lly eÀt× šÂ4\-´ì‰7™Âã‘J uƒÇa¦„ƒŠzˆªyœ ^:øŠ—*&F­›O¸±Ô£qß•¥¼Åçè«È! ©° ŽÚÄD6ÜÈ6çÜÚ+h~}öÕžù:E‹°Z9Š Þ°+YÁ»}˜þ È.–öö}|v<üN$æ¬ßè"-•›®¾x©ˆ8<&eä—¶ŽÇo¾õ~TÎË;]t@µ/ojþȽ{¦jŠ<áñ0å@²€·gç®ðxøµ>ÌéC5QRe*9é°˜.!Æ/Ò@Bžv©Üq@Gá,¿wøø¤½§3WÃG§7~W‚ ÆOÙŠŸ1®ó߸Y™sbS‰c§V)ó¼p.˹I;:𺢚ʺð­é[ÇÍ¿ ªz½¨Ñ›“¸¬ßâo1PK•B5ÊÝe÷b¯êf‘䉔Þ3ì´ŠÄÙÓ÷¡ßH”ógsž¸ ´/ÈrÆié¥Iz”Ò eLv@™P•;e¸šôn;ùª[C×TÅÜ?´ùIë¯¨Ž·zv©J „£R»«õ•´Ë-ò¦Žη³j¼sçH•1tãØô5‡¨ÞÊ”®Ð†T5’TÓG"R »Z_UXä\–Â…Yôà°ŸkJû‘}X@›ˆV¥)ã6CKö‡I2·É³SNVÍ¡óy¡b¨}šXüEª§Z]a?(åH'5t­_føÑ@Wâã[êÔ4½z– æ¾/Й±â‰ ®f¶•ËÕz-fÆB©ÓTMó5‚VÈM. òlLÏå8ˆ iT¡Š*ªÒ#_R²ÇΑʘ#—zë~„¨}5;[ôÑÌïCÃÑD³OàäÎçD81×ÏÚŽj±è8iñϤς^ž+#†âI½|•Ïè–2ô¾hµFÖ®ÌhšƒW5N*žl#G…”}¬›M~v÷[ª‰(²K¡ôbe…|ßK‡~Ém¯*ê<¹‘/9x*©p’û4ª_Pk“g&OˆPQ0ªkؽ(•ŒOŠ‹VÚ#)ì¥SÀõ§ýȘ7£)Ÿ\-Ý#+_h¤?v íÙ3MÊ+ùªwSr:ÀŸ/)Y|9¼gì-Û Iׯ¼ÑUŸçù‰l·Ò6ö·$åÂ;¦˜‹N¢îã*ÙútH!T d2`‹Á˜pS.^Áv!2zÌž±9dÃâÖ3ék4Åíã´¡ÓÒ¶/™8Þ…Ná¨6#†MÄwééb«kð,ÂtiUžÇEœåŸú’ÿ-;œ3Èi†4F L(†žy¼vÛî4Ù‰¿[©¡‘”Q©è™^ ž ù;ÌP&% ÐÌ*w8•N¯×C6=xÌÉIË`NËÙvâ¡¿DáU“]½º¿ø[[*Ùq³W¡¢·(|V•RH8´(@=ÔoVN¤•ò „Ê'⽞wv_fÔ°K*v–Ò ©v+EÔË®ÒB/þ ùFûÕ¤ Ô¹pž‹à»Ù}áæº—›¶î!ÜYÁ:QF²ì¤EóWE¡É+<~¸Ð׌D7Ï|=lÞ§ˆ£|µpV—âúÿØ»p(×ö_iq&I}i³½%ÂØcÆžµìk„˜,ƒÉ`šEY&©¤”¤²´è„$T:Z¥P)¢ˆã(kÖ"”£ã{ßwÃh?çüÿßu¹®jzß{}žû¹ŸûyÔýËMÍHËû°òâøc‡ñÓüö:ô}Utâ6ÄšmÕéü1„"ü‡q펭ê?«6¥ÖxFo&¶Je¾¼bÍÆ.ÜÌëûõ~.×ýÕf±`õöÉ+úâ\ù³ª-Pè’I­-ßy!9ù"ß“1NâY/¥+¶,·Lˆ?k}[“w5E–'tÔ#ClÞ¾´%‘ÄŠl¹]^¼êA·ÐâŸæuÔù…ˆ†—¥;šê‚ïŠöe k–謨º´J£ø•ú<™¥ˆÍGâÒ7ìÚ?²ÌGõ’†Nàxu ¦­/6PAl!ÎÛ™~†tçy g⡱ÕW ÒÃxšûÏóË”4DxŠÉ>zÍ?+>rü]ë|içÊÞ ™¾>ÆX/¹Å´Æ[*UкW6XäÅÝŸE“H¼ÁwždìE&ž¨°Z°Ë¨,År‰yyÎÛÞûçCSuø*øò#L©ò30@×ý<ߨζ—‘.±mU‰Ã‹°³|çHtß6=›UP$ÀsÕ-•ÒUl¥×µW…ûÚ+»Þ‘vu´ÉKK©RË´¨-ˆ¬ ëlO^žr×Q]Cœ)Ÿ‡{圩׷5YÓ$ûHŒ«øÈŒk=¿3É÷–Ç™×f=@½YT¼©Æ!äz¶aÛ:d¯Q½êæmñ¹d£5WÉ+Í2涆Šwæl×C%¬ªí² ²¥Ñæü–­r¹gdß"²fç“'e>k-ž«Êˆ˜ ­ÈPÉ·u·N‹#ÌÏ ¼v!0káMÁKãLJʯ¾&Ȩ=Q-;дÿ·Æ(ÅYï5y?¼m*mZåêm„ìًټ½ •yëõ9ù³GoW<õ[Ð><†(ä¼åïkZòÚÈW¨xF2Ù7=gr-®%ÅZÛæDdsýëì2ñK÷_i'Í?¢#žõQBÅGORròüNŸu]‚»—uivÉn™ ÐzHuku\zÆL³m);~¥®BÍé¸ou(¿0ä\'±ì`‹´˜hK*Òî‚¶ÓÑ”‰vÉu•§k•{ç¾K¤è}ˆÏãôµïIœ]êø‹ø=ᘤ"œá¿Ê±íº¤TyòB±yV[Ÿ‹¼å)ÖKÄýì•´û·h…Å^:žm.›Õ¼·[yßâÊfE»æ½ÂÝò.»ÂÂéŽ"Ææ/µ’»ü ‹{¨Žo ^vÜgLTæ ?¼ße¹ ÛJU4O_¨¬|ݨtf•{Ÿ%÷ç ï,uD¥[EL÷ÙäX5¨¬Ì©íàÇi………†·x£ã*ÊÌ÷3HȼŸu½wjY·IAÄ!g ‰\‰#ÁÞ—ÝqÚ¤1„ù©M%Æfæ‚àÖ‰VupÀ ÏÚ¯UŒ`Hq’8’†ÑÛ—†k~/ß‹Î‹Ž·P—7{¾®DH)E=¼õ–J0Ø«vï–oQéƒR¼hä ’éÍeI}¨`r§Ë·£(É=<ÞÌÑ ]QÿÇ M¹—0ÞÁ\ýÚFŸӜʥ›N:¤zÊ«‡¯¥,zß^•‹ Û}ÂèCL®pä±ÛmM±BÞ!q~ÅGëªÓ•½´\ ñÎòº¬§;õnÎýÒCï¤$©âÒŽ«6±;àxú¨]ª_`¼x:" ?KÂW ë¼°µ:‰ tª†XfO,È«pÜ*³?ûæü¬vñ¢êÓ1*%—ë‘–H„CþýÅ]—|b ùV]^jœ¤]-œ`²°•vn÷¶BÔU¸¨ÞõrªR½É(¡t©9fß’šÄ³ŒkI7TyG³Î,»k»Õ2¢ñÁ½Y¿ØWÌ7yPó°Õ7=é'Ëz¤6»W’Ú±é5¢2m‹)q·L$^» #{^¥)"iÑ“#êãÎ?DV-Xï¦hVñboã™#ê:nÎw­%‚ó{-cFõ¶bˬ¶æÊþ‚)˜i[·!¦.û~Ô#£ù¯,BÉd¢ž ÙÖ”îG1µ¡kе¼¢œ9o36‹ Ð^dû¬ðÖ¶ñþ÷ *½½G/”t7Ÿ9WÙ\VSàsÒc§YáÅÏê­ówÄZ«ŸYºõÄ£9çS6éÞ­âݹöã¡–ãï-[hæaËÃL†wG ÓòÆ÷4•ÑF{x=õìHv&[©=:|+iûÕx‰Ãî³ãökµß‹¾"ãØqòR•ÚÜ žWñâ±E:Í}ËÕA+|tøä­Ñ‚ÔºWJ™r˜9½ÑÒWZGš Smô)®jÔN ‰w¾3\êy’,‰×.Ø?V"‹­è»‚õèHîVŸ«=~­wY”×:…W™#'#O˜žöKˆ>qƒäµµÑú×ß/ñÈGÄä«Jì<Þ¹tYÑeªÚOèÞ6ϾI?úÈ?ãºZÕ•·Rg‡–xÏnÝ£ù“I^{ÜÌàmg‡ëΔ%v=_bܼsW[ØÎÒóçtý¶2cQ˜Eì•…MDy‡»öƒ]iˆA»c χ?¨øÝæï~¾EW>Ã9àASI+òÝOñ¹aÑróºN½¤ñ}|Š _§qtÙPÒ§g(ŒI/"ä—¯‹¢ÝŸ{ªèæ˜F0‘Žï›s´÷ÅMé÷SI¯Ú¢ÕÌ4Ï$j>J9˜”ݪ*uɧræèZ™õ‘#¹yñ6.ÏœlWÍÞqx“¶¸gÿê׎Þ°|¾?ïI~&Ñi—k‡ç ñزÝ•ò•«ªì[G{G\F^Š÷=N+~Ý›¸z÷2!¹hÁ"û6uÚxNÎÿlÜ‚ÿÆ`âÐ=Zhñ2±¼øªÜzÍן>¾ qú±XÄA¥âhû´µ)¾\âéÊ…Oç÷Íéy!]¦Xkôf¹µ÷bTü^ƒ$ÑÚcžsïØí“ײÞ,^¼×©:+¢4UïX“hv÷Õw/Žùsøå.ô6úpú»…9A¿yx;è½!„u¦n0¶#/ÖÑvê)¡g>qÍ Gà‚#särº^4èœIŒ_#î\jV…M¹+›ýä\êÜóE2{^4¾8û°«m•Œ{™ˆ<R»1­O<ÛQú,C0C8Tq¸džMŸÎ ¿÷âÖçoth¦ce„y¯ T÷;îñ¶Giž¾âׄuû½S14ìñòÅ¡íô°ðžšõ¶)§.ÝihŽî.<{¼0h·¤¤¨2ò…UUæ‚BB©a¹àŒPX%ì×À-¡°Š\tJ(”7t‘"—-(” 7Ä‘ 7”*h57d’2Z•[/ ­Ìý ËõL«Ä „Æ*qÙŒFsA!)«pé@a”8᪸¡P_€BªbôÑúºFh4ZEWQEEQ £ª¯¯¬j¤~7TÒþ2Å($ƒÅþ#PHŸìÿFÝAeöóø{ûÿ£”1ŠŠpÿŒ¢*R„ú¿)+þ‹ÿó| 2?Öûáný7o4qó¥¹ÈÁx_@s«üeïéãF…öpp£‘¸¿ äûû»1@Þï†ààýFóû@æèÿÏ9ÔßÒþäûîîÿ ïw6ÿ9¿ª÷? £€@°Û﯆é4’¼Ïjè…X_p¿_ C;cðÎØ·!ì–ýþxpjðT‚?Ô¸_êÏí5•Ó@›ÉÓýôº6Vº8X×d72ÉMRõ9>›ÀÖÐf:V(:(x2ƒ›HÁsR¬f¿\ýEÑú–æVºvŸÑ€c àp˜9I˜­±ÅzÛ)p=”ÉLœó›6y¦<ý§} ž½§y †f XÆÁKBÏêÌÀq˜ºÙR $'š?ô?9ÁˆaB:¹Ó¼d!.p©ãýe?UÙBø² ôH*ˆÒˆ–8påÐÜA‡q  ð![ ĹÍî -mæD3½A$*ù“/AÌ×XÈeE “qÐüŃ&wøÓ¸%6ó;CT5ÃiE‹ %Rs<€(AE4*£S0ä,~€½öZhõkè ÈÜ­lñ̇̎ò3#?@íÔÁÚF†(`à@‹˜ f)bÈYOó:3@Ó 7Ý÷_Ke´³'ø1„/Ö, $–‚BÐ6o24°u’†£+Å€1ÔÓ5ÿ´bi2ÂSa<7ꇻ îñþ”í6Ü” îþΤâPÇ Ðr pÝê€ËÐÚ@ßr£…hh¶44nÌ€™L¦k1• 2ž%q•€úœåLWY‚µÅi¨-, títYn‚‡4ωýˆíËkƦEñ% ˆ1ê¤wL‡¡¸Ý€'ÉbFl@a ½ƒ¢ëbÄ£Ä$ 0Ö(¼>IVô‚_Álï™B@çal7êëÚÚNòŒAûdZàïÖL{m–…:{3)ÀæA0)€ËXýç†è,ß‘ZStMŒ®›¸x7ÖŒ:,ð‹GÙ²±‘†1Þ@-Ì…bXŠ›¢@£–9£à_ÈɆƒ:ÿšžhm0»‘íÿ¼x¢'S*ôù¶ a&Žù€ææ„Ó>èãž·}5Øè¬1Ÿ9NÉ̹³±ùÌ´MÕÀöjšIú¬ ÌôÊ\ƒ668;G+C† óÏ̼Dúfº¶¶ÜTP°iÌ -¦P°üe{6×L)Ë!£ïƒ÷ð…ônÇÃ8 %DÁ“À@0`6ì6Ù±"”=¥á胅 )91ŒZ€dœÞdÎ-X°ƒ‘}üÜ‚ ²×F¤HDÎÐm²ÕŒ—à1ˆŠ_ °0!˜p?P%À‡˜ÐFr "¸yÊOd%Xh—‡Št ëPg*—ƒäS˜¸ˆ0; *Lï…%Š…«DðŸ¬P1)0ÈÌtÌ,'XŸí>p¥˜ï5§Äœ´ô¤ú(dJµ4Q’¥&•.ҥˤºÊ‹­ ÉÉPP€ORÎU›…LS­}9ä?ú\K`""]"1Àjà mºyã'pu ˆc¦lètÇò!PÙpà©kbe°>¬º‡•aýÜ ùp‘+…ßè0l‡âÊ4ÐZÁ‚zÔ¿õÚ•[Œ¡•™£ôt“°ŠeÔw ³…¥¹¡ù7 2·¬ªñë `QËiûCµ¤0QL~I|PúZÌz÷ë¥s¿“êÛ©îâwp;ÊbÓfd1|o-&Ö‚e¬X®œ`d¦'­)Ǒ鉩ðÈqÄ ¨hÒcß>qAaíOƒ€VÁ¼Fô´14E0£(ÿ‡âiÊ#$rú|ã‡÷ó gA)ÆQHzò`È2£,ÇèIkL“Ì!0 t7GÈK96„Õ§—;¬ÂyB² \»M•ÎʆŸžAú´Ûµ9€äæ Ó1NK”ÉÛòdÅdtš"BwoàxBØ; ôa^Šp(ulÝ•3³Zä,‰&='´˜C·sŒ«C¶ì©µ«\"s UೋtÄçªwf¹2-ᄱŒJõÊÐ,<™ nì£ãç†61y@9ebÐÙúà €ƒbÊÙ‚u|aû£¥10‚ º ‚Êò‡îìêa™¥ö‹óèÂ4[*`ߤü•)Sï§\¨0-šöGŠóì¡( H1od+ÿIëᛇº >q›ñ> >åÃ?€ÿü7ãÿ •U”Ñø?ðÏЪèþó¿ƒÿ“ãXïßX&HïÏ•–ð×Û :¼@Â(¼Ø kEÉ¡Y{Üók^4NŒÙ[‰Áž:ö°¨D(7ÝÎgìo/ØXYtå]t¼·(=ñTýηƒø»}/"î÷-=µt³–gûúËÞ Ï6 <×Ý«×ÿRv±¬IºÐZâu6ó˜·ƒ˜B%nóIWùçãN{S…îŠÊ¹,½A¢¯¸8ÔrçÛ·m¥õ¯“q¿ÿ†ð*—ß× éÇ_°ç¸îÁuýo|Þ^¹Qq-í‚Ó°zÎhÁæ ¡b¹|w{h©ý’Ñkc+]ÿ¤|)­ Ì‰ _ÑÓÑ—<»µÄ„m>Ó¹üPSG±š„¦S9fCúå’ ºÑ©ƒ•ó]ʹjuð©d€ÎÑÑK*B†qGs:g*/¬“T8Ÿ†¬¾ô~»I_§¸÷ð­ý‚ ÿËÞ_ÀÕµ]ûû0Npwww—àîîîîî‡àî ¸{H€àînÁÝ‚Ë É9íiÏiooÛ{÷ÿy»“ {¯9Ç”1Ç\k¬ |ŸeµLïëË®ª;ªñÎubåò'í.OJJêó¶WÉuêço>v÷kº^«°©~*&¢CloMn »:Z `}ïÒ;¢Hf“BrÑ27'6ñéK·%ÙàÜ£+S%“¡Àa»xùSškåH…ŽNV‡fv‡7SôÑnvíÊ–èÔqðRtù^­*.–­TÕ)Aá‚ò4Ò¾ÂRÚ†7K¸øË­ü“ÒÛV\ëüОb+E²Åj ö˜µô1N騄Õê:j Ø÷¤]öבážßwG寭KVªÏß®ƒùÃI°E%š_•Ð¥yuÙÀ‘Rv6¡ºUìô!¢`¬Ç§,Ssø Á…,aW3€‘£V¼4uøF[©„nõÈC‹D¿W@ƒeXÏá/ùÑíŒ{½+Fªûi/¬L ÃQq鹟-‡%B<£ª=>°6QÑ8|h",>jïzÐçkedx²$y¡Ö;rHŸ5HÝP¼ðwNo9yÓ‰$´|×*,{ßêJŒ‚³ 4(z:uÎ"É©J/m#5^³ð치z‘ SÆqîÐÑÍ`à‚Ùg³#õ8š~v}î`gC¶:” 0tlÍ3y“ ÑwÊž±‰¿N ¾„–yj0…bxÛ"Ûj%Z…Îã'¾÷u󎃷t ŨM®‡÷8ÜJô»efw¾9s;DýáÜ]–ÿZÏž¦ îa®°+ F,±Úà·SòÐßåUôHÇÔ쥾“¼ðÙ;—CàM¦ÿ"±¿îÃÌWŽÎLSÉIspwý„+°œ£y;µc=‹Ù^s¡£¹EëYaÞ 9¶:Èî€ ÇÊKú'þ²Cˆváfgÿ ÁfVdBÔM);Ñ›koGÝÆfÏ)ÌŠÃ,ñS n†Nn (íF¦#¢÷âleÒÍÆËl²û ÉzôéÍpõQ ¢½¥u6‹{®IMRÝæ‰uˆáCʼnžz·)ÈÐâ¥ôŒçŠûï¼fÞL¾W_ãóмÆIÄ}c¥«džœ]µXHÿˆú–0yä›Âa¾â™¨Çg+ìAƒ„Å"[ÂNô•*ý[hŽNAÙ#ÍNtm å^àe.¿ê½[xûð:Ž ç$,b­;ÃbGµjòYj8T‘y){Œ‰'yÓm¡”‘ìY’¥§°ÊÍÅŸ' @ûBÚÍL0—1Iá ¥¯EÓ€pÌ„hJýIß~@F ù„ćҭÛÀ²xÙ<€—׎£yP¦¸îDòÓê.ÀˆjDV Ù•kò“Uˆ¿çâ”'QáB¾Àw1Ýè½CªwQWREÈÕ7²±æy •éß Ç¶ (žòߢ𖒉L±€`'\® h–™]hÇk G¦Pûõ1~å<‰ ìõ¢TædMDæ PŸ¼¿¯éSÂ/ˆHŠôÈ÷cMV¢§™cxÊbÁŒœ¸È€Q-­ñÊÌÛîÉZS–þbfYž Ò á·pûAtÏþK͈­2¤óåéaÃÐ5©›ßÃè€SA/¡¬åôž­U› I`£g»·½ý§'z¼»Üª‰ì(O¸lC–€ž°"ªiÛüÔI«7."¼Ý%ï›"ÆòUƼ”=‘¥ŸšB…Á$À“rÇR¯ª:ÊɘRs$¾gWf&ïoì%+B{$ì=¸\Ù{ }ýv†¹ÏžZÝB]»6é0¶ßàduãL±‡‹I¸Â'¹˜thÁØN3ǵ«n^é–j˳,¯w¹þ„~A̘TÿU‰OØYibJÀžô©á~¸ˆ+"o#Ê>`ç‚+ë¤s˜þáNžíD¨©KùeW¡aVZLÉ™ðšpÅ8.†æ‚q—ä ëƒn¼ŽðãâÍ“j•3Í äcƒa¦íòóU öÆðójš\‰ž…z§Ñ¯×4ïoƒ­0IÍûñ{ht½Ì,ܱJàÂʇdz¸Gᙉ±¥-eÜgùº·TÓ )#ü»+¦=xßb*±3"?‰î]ŠåøÒ§’ŽË)l´ú°]¹åT’U@.~Us@çgñï kN³]l9lÅ~<ÂNqayHsÒrÓ(žÆãÇÇ%­¿žì!–:ÄAV/8Á†$¯íƒ¶6»íáB%Svg_ZøTR:}¿%+AøM¾ÉyÖμóC¬_=ΗÆyµÄÔ'&B¸YÛ({Ü\,§äù :‡4i‘ùw.:“Oãð2ν2}.ï$JHh{z†ç£ÐäGMaÆQÌ±Šš¿æ•>ò©¯Æ GarG[ʼn ……çfKŽãVæ\ìoXè=”*ÙxÙJ1TɼoÕö7äKv™žÇàjoò¸O”|Ú¡k¡Ê‹?»zrËÒ¯ßk4ZäxtæÜ —[øbÿ8¸( SÏ‘-0N„1@@‡×Óf‡©)P6cmÓÂ÷¨wÞü½ý^T£™Òu˜Ô×C•Õòv™EÖa—âuØ€]÷ ¸c?…wgî2YG[ÊN`÷éxí×ÒÒÃ$x½¿D^¼äd bvA¶íÊ()9•cC«ÛÛ•ä ì®Ûu¡ù'¤Iɬ:ÜþÖàœÄò|D÷v±£{ùµß7ðnîðÈ3èÿ&¿‹‘•ý?ü®?àw1üçw‰‰È«ð+þÓü.fú?æwý‡ô—Ÿ¿‚ýUWlÑçVÕ¯£_±G†ý(ÿ…VõDÿk½_mþúkVÕ/°£_¿þ™MEÿÆØOÐÑÿOLFEUš_êßÁ{YŠ„'öG€ª¿µ.ÿ—xbÿMìÅQý~£´ÿ>ÁL@HCBMð˜`ö·ÃãÅÑ¿å—ý%Çì/ÐÿÃìu¹ÿšbök_ôÅ/{yþÁìg€püبÿ<Åì×WÿŽÙoOÿÇì—¹ýûHf?É+ü~÷·pÿtøÑ™Xýkø²¿uù‰/cc|åH¼¬1;Ó?H/û+ÇßÊc`ûÇée?¿(~UËû=ñª—güCÏæoiÞýýÔ³û -»ÿò+ÓoUìŒU!”wZÞ2ÄePzdO˜åY¿ëªU¶¬T¬ŸõÐ4å§ V–Ã'G܌ɀg”Õ }Lìô’2ôB­\¥T§pÚÒú¤þÇëzáúofKæòÓ÷M×ò²²²ø ÞûûOGípè\ÁzÕjHqŽçÝ$P…ž$©ëPŽ»{Ôwå —‹‡õjÜŒˆX€±V¡Ø‹w3•ŒdùYâŧªä뺯Zvœ‚- 9ròµ¶ÌwË ÝGŽ;£¾'ÏÔ:MfæNÁ¾a:d´ýóÉxoCnå(“‘·Ã. Ï8Ü1jâv»ßµµßŽŸv„EEÈ ŸÄ‹_¡Švˆ\Žò⿨ãô©:ˆ,`¨™kǰr;KêÎ(@îopÝù@Gš*Ä¡Æ?DÚ€èJL˜*F°¸êÞi@Sí'F2ƒÐAÊ JÒMj@Qýþ&AM¦ÿ=‘ ‚-⸔ihµéYÜf^¾ÉÅœ¶!Q¯J$NX•ÃGFö”Ò͸˜äUµ§`ߥ2û·ßL£ðÞkáÍÃßtz"9“F '"™ƒó äáÍ^4´@ë|à¸|냞îüˆ*;©b´ Š,Q¶cãxi÷& û¸'?!$Z‚ŸÚÎìs JO·Ù&>¶@ŽÄÕ Ìb#·¹xÙ&4ELÓ©¨èòÆ1~¼0$ŠL1_fœÄŒ›Î<@$DÁôTÉà!YH5vÇ!ø3Ý.…ÕðB.]:E[@8u²t‰;IN“iy½HL.µ †ò¬‡ ™¹²ÙÚÈ÷ì‘Ì=Ð ÝBy%tGgp¡Ö3 å8ep ~%kœi;ú›oªvõ8—QýNˆ˜ñ—S#»èà4ü݆ÌOú6'm>ãª08,™ÖFS™ *¾ª«ueo£A´Dí?ÑOïà  6àÖgª\2 'µè/¶…YÞYTüóIÖ&NlH'‚ì8önÑ»(½áîn)·¥t(N.fvº)øvs÷)©pÏSBè~«ä.ÈÅЈȨ hÒ-ù{bROAï >/àe¼ñGt$¦Ú­âª>sºÊ)F$†ÛTã™™"ØÊ.C×úçÌhȱ܊o:¶¢™9¸dŠKD|‘ãÖöûüà ­&ß Âòù ‹ÙÍKTt(<4Þø˜•Øëº.îßÎu§²Ÿ[~x”ŸìÖ¦. iíãèaÃÌÏàüFî\x˸ÌÁg!ÓÓZL'`5$áó´½I7*Þx‘àÈ “onö€ŸFÿ æä±+²h}1BrOÿEÉrœyX¯ÄÇP΃ù/áq: ŸÁñ"×/·s:ÍSL?Ï}Åt÷4µ’±·Á|ô ÷ƒTÌ’¿ò8Ö„39F>úæÅ£äájKI-‘ Uƒ‚UßÊXRЄá1xM˜Üqeu4?‰úäW¾{ãÕñ­¡ÝSúfDÑï–Ñ8»©J¿g7 ˜‰†çÓ±¥(Xà@¢95/ɳzK[h ù¯e=WgÂÜãg/‘ôKKÆ]>«“d„ÂZŽä<å¦_‚­@ÊÜ®ó¿Ó^kà êídøjÀhrº˜•O7ƒñ>‡ ²ã[Eg¦Ò;´! õNf·‚#Y¶ Y‹ q>ÓË)vl™qÇKî ÁS+‘K› ¾\€†hwîÃöYh–õ屮õ1u¾ô>f\Oû^éM:£ÕŠá _£ çÔw‡FˆÃ Ü…_PýhZ]9Ñ”+ ÓÚ»Þæ}Ça¯&k_j3´ï2åhÈmçä×{ì솭r†U鱤úQ·¼3è¨ÈÜGï|Œ^ãû÷©b'žü8 †- ×z,ü¾Kípµ¯óïÐ0ŠGUâå‹¶¿ž,Ùëµ`:ñxf¶‡?›z”}-a%FÙZâÁâ«ï7¶ßû à¡XíÒ>º=¨Šë÷nÈFér‰ËÁZô[<—Czx¬t<3%+Û#QÂî¼%…ƒ,¿KT¹O„è¿Kð;[g¶ðÅèËÒiý/ÅFE• |+ÏC¥(h.¤,|tÒ6¨…ýZ›?>+¢Oã»\÷Ÿ´°¦®ä$\t ¨G7—LâgµO0²jÏ“¹ØÆO—Vꋟ éd½ ö[ç¦mÝAËR·3õÇ™²«Ç›bÍVXJÇÔ§DR…mYæ¤TˆðF±…Sš'Dã¨Ìó°ÆãZKLY+“ü{+tøÂV®øëz6·mgM° /‰zÊÛâÁá ¬‚çÏìó¬ì5Ì9c+o5v"âá„‹‚Á=BÖ'®Ç耩=ÄS¼qžá1úy]cò šUå¬J¸N&Üuªñ%ã>>Á÷5åí«T2m†¦è[݃‹“MhV±óE3öŽ6Ž]¸Õ'ê´ÂÝåŠÏ'L|2xAL A2º¬¨Q6ž Au¹¥bXØSúq¼‰Ò/2q"/'ïêFþ-9ŒpèqžøÑµ~(·Ö%E®’Â@)ÌÇ iÌhØ¢ƒüB7 Ì^ÕGˆr9@óí9+Tzÿ•$k±™4~kyõTF3]_˜ï©ëy§nº¶šÔ %üÆíËUÏ™‹®D˼¨®^, U«’ÉRiÖZq*Æâr°±8’§óÁ/Ÿs¿Ô»µŒv:žÅ]Ó?ßìn¬‹Î½W-ú@¯L&z„!ÜÚœ¾¡Å0mÁY:C^›j­RÕÆ4ðÍBÃ?Y1cr;§…©ƒáKv\Õjš‰«-=Œ}¤Ó,$mÀ+pî’ì¡"Z'Ôl3'µ®\Ú¹Åæ®ËzzìÉÌÙ‰ü­5ë°°ÕJZ V8†“ËèWQçiyùt$š7„èŸ.wp–ÂV¿à­%º} ‡×]Å:¾?oGËûÚvÌ˃ÍeT%CòV.)3 ñ‰*¹¯o¶¤¬í»KÕiþuªÝ´\Q€À+R˜"[{Pµ+²2‡ ýv^ËØA À Vö{µ£WÇôœÅQHÑ©qWØ“è"]§òùW24»:x.³o¨Y\j߬¾•B}„MšÃGaퟘ'§öÆ&OAØnÖÎ5 :Cc}¬ËJV¡°ÉÎŽÆ~X¦õ•5UõüÆÀ.üd>ÍAl|8n|ÑFê ªä×£dEîu” !¥2Á v=ÓD™Ô*wT\rÜìwua›:–~#’Öû…ÿκNC-Fö¾–ÇÇõ–[=·žKRHß’G'm¯&6¶-;Ÿ¿T™\I'ŸÐ#zvç²5]Ö•$¿’7§òµ— ²„c²3°Š5{ž¼\Ý8«}˜#U›îýðèæ*<&îì|kBK\ÑÜSÓq0vï‹RxÂjÚ8ó–'+M”[»zœÃ€¤3)…bÞŒ¼Iy\“ƒF³G×±ïS¤Zl&¹5µe[?NRnf½pŒŒOFFÓ]Àðõó`cµóæ†B°j–‰®3¼—œ)O–.£ ã'YŸkh{[ñèŽçüÝG<'vÁ•]^—¢FAmDÄàðRlbC½pŸ»Žfø³Œ·ˆµ<‘N^*Ù+¦—Å|0yê­g½ÛµĪ= ©…êöýÍ~Z λ¥+6Ìß8èj¸2ë×Þ¬”_¯ž¶enx™_b`P¨j*“n¹´efG‡…W%g\Orv ¾[]<É„çá”2sh±™‚èT„¨¢…©M…çk4oV!V°t˜õ ²ÔŽÌ³ƒ¯]G£ÉËN[†Ø2äþ ³4âW±dŤáDÈíY7™WÍ@KÒgC~À½ºü4»¸^Pñæ}[ÿ£CSK9²éç¹bà _uu‘ÏÏýº¢EsZk ÑQSÊË—ÁPUrƒ`!…¢oñ¬×Ùì͵}‹«æG¼]ž©X¢f/j|*š@}‘çƒM2… [>í¡79«í|+q{ˆJig’à™&þLySìb<¸Ðòö{³hjT¾)y|³÷zŸÂJu*KºìZ7Ntÿ£X •‹ ÍWQEùÍùÅÇçñóæLn¿Þýõ¸û-2¥Ì MýŽ/ñèú+î¦"4\ÍC ] ˜™)ï}<2®§Š¹Ì ¼£gïÄÖ@bÐç¦7Î,òŸxz”7ÊÌ `\Í{>??{¯>ãà3Fnœ¹1]Iæ½+”Ä1$ xŸ Õ<Ïm3ÂlC‹§‹MŠ Ú÷>zH l[ME£³ëßœ”}4ï†{e[0VÓÀ@1JB k㈗{í¸ÚìlƒäÙqç o5œØí’g‘^ 1ó‚‡8tÔû°HȨ(×D!Pb±£eü‡ü#mÙ…“šUlbñл8òpjކKɲø yó6ÉÎ+¡g?m ÿÖ­€ëÀ¦ fÉ«#^xw».4É)Ôq3²ñU,ç﹎Y‚=T<ÁNÊÂ|„‡þ2¼¾œŽSÐ 1Ù…¬..æÏŽDyµ«ŠÃ}õêLtüÞ8 ÜGqxÊ2®à¢†Žã t…(L¹ÊNp.hY3ÅCÊ9Á{A“Ž ìfõ õ³V/ZÊ©¸]4òªTl8µ3E‘²ÿ<¤­¡š†Ñì`^ ¤´³´ a<ÖNÚò©n•ð¡ÎuhÊöÊeÉ{Gº7_2ª¤Ïh=×ëiðëºoȽ?£Be÷ìtV·;Õ³1¥ ­6ÆeMEÈÒ±Ó{XØ6ÒJHv¶Îß5V;ÉÙ —ÃKÇ•Á\&óË2Q¶8ö”ó‚›8ƒpÚïf>åžÊØŽÒ— "œ¶qeñ¤ªÒ(‚ËŒSÓSMf¿$¡FXó#4Çû-Ÿ1¶ºCðÖp¡.wÛÞ/qc ‡wÖÅõ P¨ÍÕšôúŽ>mhŽ—‹Ê#!;O¹¦_]ÉS딣©°&&©ä((}(ë³ÅŽm$Ø^­Œz\Ì\û Ö½¸`ð½8bÏbú{}]_<¦p¤¸2E½Ï{PîÑ6àt·ëHí5îù­ªãâ±£ZüÕÌûÔ&y¯ätvŸ £ûo>±u”ìÚI¡V†[ß Ø/ÞÉuø›Í7+rÓ$a•Äç6&M‹ Ó¦©d[OiÑ™8Ý4'|J­”¦»4ª¢K  ÓvS)m6÷:’Ð$"¹`L’r&×ÞŽ“f¼åJ.œ)aŒpÈà£jŸ0YzKÆÁ•m¿,ié~_Þ¤®ùÝÁ: Ì7· †ñë*¼htSupÚú8‡ˆ0ns<BÂ¥‹©-bŠ UŠ¿ê=ÂcèŽk¾¶³)]„ËD€sˆ¥ñ{åC5ŒXYÍ|Ä1bì¨JCœˆø¥|Åõ Ë©%ât’BÛ˜Þ&óÊMh2CÝqЉó&·8Ñþ6;9õÄ€r&Þ·lÓ¶õ·@°¦lÅáò©4K©§QPr›ÓÌ{ÜZ(:”ÔÓ” pu @­ªÌ:%F®RrÛÊÚç\, Ž#`]ì˜R">,ì³’5÷˜£ “+»÷±iCÞõoË[ߦ·c§’É6°ºÎ"îš Í'‚'Œ7Xx©ÐÑí}» m›c>´sØ•ï(.°Û=ĸj÷±Wã:/,ž(¥¸…f̹jY$œs[feeT—±COœZðµ×[“Ï—WdäljÞq_‘ðl4ï Ç U@è–úTüOvW¿AïñÖ €‰í„,b*2a0ã¡L×§8f3N¦™jàZ7™© m@{œ¢Õó;š2“Ïò¬"èŸ81Ðkx¿Cu7NA‡7´œ¦/ì“ àû&NÌ^„¶Ñ„š{Qñ#¸«ÁzÇξùàE»í«*\‘`J֤dže:—å„J daQ:ø=È9ˆÕ·â ¦†½r¬Rô”àDŸ›Qi-…s¬šö»pyˆIÔÊÄÀž¯A×¢Z‡6¥á˜é˜w:##"Lrêã:Cð·}Mýí³#\°„<›®¬Ìø´Dð ¥pÜÀ­ÎZ8ÓSÛFIá’È@)]ß!¼ï¶Ÿ¨e+{\"¶¿¹»tЧÂÑÖùz‹…Ä#ä’k½¥^^Ï1dS¦¤LtÅ £mSÕtíí£2í8üú¦Jƒ²-¾4ãIªtÉ(5ý=µ$Ay s3¿sôúƒ_ü*ä›]økúTQªë~ÆFtùÇ#äuZ3Žt((±Bˆàæ$þ™¢P;¿õе·¸çó [0ÛüÇü}/1ª¼™Q¢Å†ÖŽ›dÇÌ´XÅÌK»ÈO›ú©;jÍŸ-Ðñü…›ÕKÔâ¸qp'OqÕ´>MMÀ”3°Æ —+H¾ò×´­j'IÚ(–ij&ÜJÙ‡í 3xÌŒÇy§rü ^»¬¤YE¼6vÂÕ±.ÌŒ*`tò¥QŸ ̉úqŠÇ„1TåH:™ÃT6ñí!7 Õ¢ûw•^@”PáM¾²vöTüRìd"¯L[ýõý¥b¬7B;ÏÂ#1á ž>øá©…7çäÙF ºj§GÛ³×Ñ9¬5BîFöòØâŽ-òXñ\dCœîUO"Ül¦4g@7úº)Ñ;t{ýëࢧ@7ðxˆ¥„j9ëF¡£¸žÔݤ]úo°€ Æ òf Àç1?çgÎ}äx¸»æ¯D²Q,UbCG÷4QƒaÚ¥³L÷Ø/uØtXZ¢Ž%|Ë ÕŸ*æí¥Z)ã»QsßÏÂÅ]øT'$.ƒ¯1|xÑŠ¥ìãÐlËÓsë{´ý(pùÀ4÷ÙÖ÷ ‹ª†*A—©*LÓY56÷I>dê2ðËù[ù›Õ8ÈÞ ‹ ¨ÌTqS­´ØÝtU¿šu 0‡fûuÅéïÚÉ«mÚç1s ò^ BQL+iJé=ì/ßÚ£‹™öÇÅ7žv‹pu+®ßH»\#óc¹D… 6wÊ >øÒÖ‡6M ôôð6OQçKJG“»í(„µó!’у¹ ãv¶‚ŒK¤´¨BsZвSmÜ_Ô`&‡‡°:CwAX_ d»­ÇÒ|ïOƒ¢®Øæþ1õ æªq¬»O Á¯Ñn"Ö³'obc!obb qÈg÷{v;¡*Ôg¯ã̺µH–ˆË‡HГ0 JOJ¤¹Ù²!S£¬ —‹Ä’K§&; vÂY…6zg0&èFZXË;jÛꇵ€Mc¶w]+x·Šº„“ec¶zq»Ê²©(¾Õiy`Ÿeè{’MëÒÁžè3ÇB(#Áä¶avp‡§q8Ží(d6š•NûV”‰„gáNôy§«0 ¦ÌÒÍJÁî³)Þ½žb ͸ÄcQ Æ;#ã…]o²‚;!ÁKµžè7VC%ÞËê\“¾Ó£méàØýBGn4ž…¥Ò‹l§—!úzðjyxQ<¼çŸ¯+tŸ7¥ ½¤Ðfw]—ê]@;]6“ÏøWˆyÍ34Ǹ,4a»¾°öòñXóît2[REQm^UßlÚvb-lG–êÞËm–*ݪoh¥*ø×¤¼ñÍÖ™uœÞa]܈EÅ¥†ŒI€gc_» Áý…ã¸õåV Û:/ ±ò%òžE4Û¹Suã —†ô:Jø{ ¤Ö PåJ¥ýQ’ª¬–N¨»ß­õôÁ\&4£¸ É uÄ*ç_Ÿõ}‰S( EP¿- ãR­ T5 çô@OLö„t/âÿ³kR ÅO@Ì4¨‡3 ppSàJcìàu˜Å³ì¹1U²Æcûm‡¢kÇ~~. ';¡Y*µáx‚Hr\”¾ºÁÃ%±Tヌ3}„pÛBw챿†ÜóÑÛItÂй•èÃÊuU¦ch´¦—ƒ²i y›† :"Çò\tU°×·4¿®’Kÿû<ÚrΪ,‚Ú+¶:íÏm—«á¨T\äØò¸ú0}×vð×/‰ìÓ|»zªP_4N÷‹:¿ÁãÏ‘¿ïé¦? ²~ö^_»Œ§Gфڶ¾5ß¿[ŸbZƒ2ìûʦhÛŽˆ™Ž‘. «{K‡Åþ,S„3ÉÏœŸ_ÜT\ÜTPSÜ74”CaK1­ŠšŒœšZ:LM¾ß@Ë ±òÏ“ÿÆoAý–ÄÈÁĈÏÊÎôG$Æ¿ü“×·ÿ‰‘é¿"1 ü‰ÅøGE©þÁGQ¿¥0ZÑ™Ø:;ü%ˆÑòŸE1þä/º¼4âhîFçh¥ïhöPÝé<è<Œlÿý(FVzf¦¿D1þüÐj3ã›Ê{b$ËÒ†ú¨iH {3ac\ã¬â¸L7Ä|èÜ£ùk~Hì*–(¥.|GvGÖ¶š6­+{IªI( =„O_òîéWC„Ù럕ôæmL*¨ Ñ~ÚP{w9‹‚«`^MÐÿ| ¬ßzÕs"yºš½ç„«'a± º‡A[‘Z 9Š Å…{ŒŠ°‡°µ‡ò kçÞ¥—káÚé`Üv®Éüâ^“G­z¸£KÅ ·šÍŠë u;ª¼“»j:…¬좳ïP{í¢ëJÿ¾ÚY `û]y/P5ðØ!~W u'¬!žþ‰!ž¡fUy Õ  2W0‡¾cµˆ.jM÷ƒæ!‹\ÃÍ÷óúWsˆï#9ô ßØWÏÙp.§À ¿5xƒñͱaÔÜ´ÂPeŽº*vQª¶öø·–¿.± ÂN_üæV3Ôöþ¶Û¨i–þSÞmÿÅ {KŽõúyoí[ÃûC–¢ÙOju&ãŸ7X"P•çÞ6Þ¯ô?µ=Å-‘lIŽÐ4×nb5@iöøÔ1›•ÌëWt“…ð¤ËÙráÀRUf{tu¦\•€ïmõôAäÛ1Ú9™ˆx€”'…MkB1I¤I^ƒ>è³'ƒ»=/Ä "ÆØñ×Ð÷Š Bê!0ăFZ‰}&Ë#M¢I§F¾‡ü!¾ËØ_¦I4ÜÔ¡£Ù"6Çÿ>£œÆ|ó¶e.ú†ü½œ/5 èf¬[rŸóŽxŠø¼—óI¿Úz¬`[Q Z É¢}PîJ1 `M‰ögQ o¤ƒç£DÖEl~6àêŠr,õ8ˆ°WtTpæâ)ãµZC2쉘=k FÜ/Mt᣿ìGU°ªÛÁBCܤ}ÃD’ä¡Å£)gQŽ¿ê˜™MiKâO—64ƒƒ«ÿFà=øMÕÚ]ð8hY™+š xrÉT¤hÈ(èÈdäWÐ wo•36³‰¦bR‡}¯K èÛk{ÁX5IgT\Oh›ÇÊÆÖ`¼Ê›ÅùU6}†Wãɦ.À…÷ ö6¦v¼.0;ñs¶n„Ž¨ÛØú[Ó΃»‰[ˆü¼û5¦óÊ.6¼S*ö·½~×R&³&OjäßàM+mú!ã&|Ý•Ná·í2Ro®JiÊùXV, ÷þsI©\«{müû?ؾˆ€+„´ëÚZ¶í‰[ŒJBÖƒ©´^âK‚µEúÇ6´‹f§(Á©Õ{t§ÈÔIô­Á‘`ó2'­TÚ8?+ü™( ʇÓ5ìƒ}ç5³90¿í˜]äͼ-zøŒ§sNºZ‡ÊAQ{¿Hnš"¶‘^püø@¼Ž@b-gkæG)¼Jšž ¹ïÕ,†ä°=ý‹ä‹.Ѥú Žà÷@ȽÁ%¼¢U,¦–H×I;uà—•©ðì/:BXíP´^Ò×·Šmïn£! G¸Þ2Jö¡ |Õ&3 á÷yÇ‹$€—º$-¾tP¢â28]±vÑ:®•ÕŽ—†Teú ]‘4Ïìª8Ú‚Ñ!-ÏnD?˜Üiƒ·v}•®zòÞÕÊhõ+ïY›Ã®b÷®@%0â4äiQx^/A£,år>a.¸sú²5¦›½&²sÔuw«/:ß…@£5ï:Ú í2Pߤ&ŸJàR*Ã~–à81Òˆ^MæF¸ì$\ƒ'Ã8eÝMü0ï{msv¶nÑË‹·LÂàâ ‰+$1>øF3<—,X›&ýµ“Œù…Õø¨Ä˜L 4&lZ‰3\÷ÖkÓËÇñά(Ä.>÷Q[êºqà5"[ó·!Égc1"|ú “ÚN b÷–¡„61‰3¾^.#\²Q²`qŠX.ÞÞZÒÇ ?—(­^XáSjYïÅZzY*)à“œr\á¢íp ‡o’/ íÇôª Qs»zžl#Tê H&52JÅèxúH3¬¦1%µ²¸t·-ƒøÈ1ÎÛᮜ$•ļžžtß$ŽÑJó%×Jé–ÑyW“§D_.¨–8%ŽÇ4_vHø²¶ 4(’Ûhl³pôðŽO |ΦÁÃgÆë3nUvâ­SEhýÇ8,ˆØÓ¥Ü­šæ ÞïâAPÑ&b‘Û0³ Ý‘yÂ5Æ×~Rã¸~@Q1$¿Uâ‡Øç\ón*oê2ßñåéòɼË:¾/u S>!h·C€!â¬È•Tá¹™!… ýöÁnèá£T޶eЇšj‚͙ٛ¹G¨’£Þ–›7­™r´à‘KO3=ë–4ãéî UÊ<4f†Rc¡¹^s¥aXÓ(£ÞšZJmrä(÷27ͧ=XÜ!´{ë30yWÙF IÂj&Ø´–Ü"à<}IÊÞ`çR«lð°÷t£ÍQró‘O¼9­S[¢ŠöE‡ˆÉ‰3 3¯ž`çË ÛC_ë*2«DÏuÆË2ØáèYnߊŒlûŸ„[ùIoQ›úÛˆ€^R{(E)»Vqg¦sãwñf„ÑBÝóð|ü¬ÇøvWIãÅó²÷øÕr\4ДaQÈg_Ý4³ÔaAø*’vVEH2”«ÔÔ“TÁ›s&Œv§âM6ÉH=¦ÀnO5í÷¿í&xñ„<)ï*·,yÕã" –4cÑú#el{£¾¥![÷¥uŒÖ‘r"‰b`\CmŽ$±mPÒ©ÀG6•Mæ«Ç0ž©IXë†Ư¿-‚Ü玕´…9-¢·ùÎBQÞ”Ç{VŸA¾”6nö†_ôRUFÜJ^…€@˜„$’Ù‘‚}•(•Cªˆ 9ùš÷!U‘#‡®jLrì«}¼îz>»³‹jG°­¯¸`ç„&yìÇn?)嘳\:@åá–º Ee?­F¶Ï,õ”ù ñ•cè7ûÒô1‘Ö,Þ;XßÚÝ{ßÔ=Óï(©iC Mî:â@~b˜Ò}ë`ª»¯(—:~2øQ’ÓsWÒ x˜ÊžR½…Y=.%¶¯/0Šß‡'·g xçjTB ‹åõÛ¤xÊ REúSLùDP(’£Œ‘ý7G5Â<¹t8h¿CºØõѤêøq]ä àÕÀ—-Ç¡·¼;†“\, JthJ –°þÄ`¸öW0ÍSHÊuöÑ"êÛ×C•o9Ÿi&wÖxT} ¶Jˆ»GHྵ:qxH£‰Eh ),”=7ýNâ×Â?Ëñ’LSfk>O+’Qö‹/ *å Ã`J3˜³¨ ‰ MP™Øû‚õb ÐsÒçs;|°¼)ÃN5{‡>kMÖåÛÔà!/|Ew›»3›_<»T×>RyiØ®PY3a\jY ãÉ•™ˆ<’Ö#Úㆊl‚ÍÒáŸ-&Þëº$tF>tÖåÝHèì±*©Në¼¥¯¡ùLGD˜p‚—a÷æá~Ï£{Queá«eY¹…™õ³ÚiCp±ÄÁƒÉ°"~Tœ‰“˜Ðž9ŸŸo¢eÜÞî¶G²\G,‰SƒBf]ø\"]…ÊsfÁ <½¯I rp—Á>eOö¶`ªÕN¶W/o©Ô£^ƒ&^BuÓ˜F±1 ô>ðnßÈШYlÅð7B\XËbW5“K¨Øíjʳ¼Ñ!6gâÍõb‹mœ¤ öAŽü©R‘oŽ)üŽQNï3 åßiñ‰l¦ßNY§}Š='RA ›@}GÈç‚6(xkF„0“dV󑨷zL¢ÎÈÊHç¨ú½Ói4ü­»Ý09Tyûd-’ qÿ7À½Íï ^05#²^>·Kx<ËûŒ’ ,ê.3Fí¼›zt)Wõ$)?wÈ%B~·Ùå2–†P3kÀ1æð&ëKÍfµ„°”p/ͱ°´-D‘…™Yêã :³ŽÙ5KÏEâ²».¹!ú œaÕ‘4Ÿo¦¸J¼ýÕÆÑLSq`TOw NÆØ•'HÚ`Šx†kÔô k-—ìômÞ¹è,ŒðI‚MêÖGÚ}ÞVtø"þ ˆg†£n‘,3kÀ€™zë¦Ã/xŽWClub÷][u]ÐwOͳì«ß'­µ-÷ˆ¡Ö‡*RËÒà–j`MnLȠ≈½?‹Ã+aŒï³a?RM~Vš”&2:Y»M£òó*Ü¢ZÔCŽ«{â®i·¬ˆT­¿œJøFå¾%Nr©ÑOEeÙú+ªõŽŒä,þ!3—ØNJ嘶V»(­cõݳÓzYrêg"Ä• †n*šÊã´—\AŠ?vÚo<ɇ°ˆ]³õ$QˆªÆ•J‡ßŒ? bAfRØ ’ü ¢q<ìZÌ1]ÎÚ\CÔ°(¤Wk.LÈ©Í}£Üuù!–`|_Á½ÖËfåcÈx;¨ôû÷r—MÕaâŠØ.'´„8b—Áu„2y Õø1×-VvÖoZ±†PΚ÷Ì%0hÍIçùz|V Ìàeî¸aŸÎÆãƒýåud-…±vÙd¡§‰\z5“ ü Ûk«‹©*%Ê—sF—æVŒŽAÐøj?ªLˆ~bt Ù(9çÆï° ·[õ«fõd†›FM¿9ƒZ“¼rSܱ³  ¯ÈPE1‡* ì‹F^ÇÝnÖj8ɶ–qA}ÅaF]WšFR? ct,x·Tš ­Ñ”3«r¢ôÒ}‰°YBÉÈ¥Aa)T¿ n¦W%HKè ®¨6˜5r«qZ‹‰“„ÀƒåƒV hMm-±ú¥•å`nF¨–v 3O¯vwd-a4mØŒœùWuÿ‡T'oñÉ;„é[Má5cŽè½ðŽ ‹£€OjÆ#cíÂ²Ú ìo¾’€á†-kññioˆ™¤ça-® Ü™=tòq О)™'X^ÇíÂú_ùìA»ò÷äx¶·µøoèóÁµ»*Î'­Ôë¾Y$®õ HHµWm*n¶È¬ppþÔI˯ ß $!Ÿ./ › Ø£IÈ‘&iÛ.ƒcšpæ…Ø¢ñ\fhXƒq=.•ƃè‚ȧjÄŒ¾o NÅ È¡„$~-‹{3È]NbAÊí_ %=Ú*4¨§¹õ¿R™”óL$×E‘r)ñR„PMŸ)@‡šd­iÖµù–¬Ùó‚±R˜Å#?&¡þèÍm¨Üîˆ<#ƒªXÂ~D™(Ì×<>Jâ©,uDº´®g»Xõhè¾ìêµX%0Ä@0„Ü4Þ?uòcß´à·ŠäR•úALMcÒiF#Pm¤õ¤,Wç/§Ö9ç5ƒ†,Í_§1v —FªB…FP:š\sî¾üÂð­îq°qèP/õÌ´jhîÀbJÉ«ß,1~¯‘ú½ãhê)ö²š'ðF\—l‹U˜ð˜–_’SÇýðǧÏÁuã)q#QšÚaH®ÆÑŸ+×®'*1mY—­ö<èE`æ|Âø§»v1JàH¾>{QC{òƒÏ!íhî·†ðzŽßBù9j!>MÞ+æîÄYx-Ž UDÆJ{îæ_ùMë')nœ ÍÎ…>W‚I†Ï¤aøz.ëÒk’Ó¹L½½ôóe:ïÓbbØÙôˆöŒ „Ë!b(`ÿ¢Øÿôø9€=)3g¥2fÈôÆh¶¯< Ò] ¦’§FM´/í<¼…?{§ÏfP¤{‹jw\½².Ô§6ËçPÖ;rEoÕš×X‹ŒNè LøCÈÙa©¡È2X€Šf_-o!ÕP¹¡|.#)ÁWÆ3Ãj_oÀ軪çš~Ì^mKì¬<'hwƒ£‘ûdö¨g&‘;óÒGUË=—›p»(“ùÞ™nQLAìe>3 '¾ ó0ÞSâÚP4ÉÞ°’'„®ÉîZ¡¤¾Ró5ä}H(±Ë–ïÈwK—0µh˜órŽƒ˜YÐŒ×ñhÏQ’2Qa•²66ÖÅ–æÒ¡µ¸Ñ9_ÑÐgT¯‚R¹}ï Ê™£i­©`’ñ±Ÿ¾á[¢7†ÁLºÀ¼oÁÓß‹–2Ë¡óð‡—w l5E'4ùÂ\„K”µüM±ç³0½Úø4‡K!x-±~ŸÈ ˜ÃÚI5ÙèD#thå\ Ë ïº3êˆûH6Iïžðe‹<³ÒMа‰|óŽØ>¡h¬­Ñ¸‘i2pM‹vWÑcí‚2ùü[OÈ7|H¶]سӑJ`ÙU(߸|,¯=âÁÏÖþ>×p±l~»‹ï`*^b¬ÒòAzízöhÍT¶ w¬|öKåü·ítoªú^$lbÞSî6‚.9´‘|Sˆ€\ô¯q—}_êî³y­wy{ñö*ñ€]¿›±ç²´‹È9| Oêô$ú¾œœì½åaÜî[EOú-™\F‚×fdëR:ú´O6X' ^””ììÛbwˆ‚I~íg–Æ8s.ï«þŠ^Ø+º5rƒÊ¼¥{'מLg—œÀÇÊèõ( lœOÃ"Ø”kÑ3‚†âHÆLC»n† ¸“žso’[¡®n ¬’±:5À˜?ñî®"yql‘Z›¢½}¦zKP{íë¿ fJÞ©uiGóVÔÐN8L@žîþëí#³ÿ0‡ãáçûÞÏ0hiÔ&>Îî–öEÓ­û{(ŽÔS]`(bŠ«ÐQ­¹,(®¥•Íô°¢€Ltê®vèíçÓǬÓ+||ô€H½ö¿7<²‹!fÓ9ÃúynÎÒ~+E0¼_ÄSýúüÉßô™Æ€½°Oëj$¾ > ×÷Ü5ëÑð”Ø„æ!kÈ+âq¬‘öMBtÀ;ž•#¶«ç玕ÛÞÃaC„®5J—†ç™ö/k½qp š‘Ø p ¬Òï“:è{'çÆ>\JL·_txûÓÅŽ`­kÕ!¯¶ar.‚/¸ç´=#Ò![ ¡ì¶#Fu™³öõ '“K4s"dø–?x8wt*ØZ€mFÔjŽË|*/xÎÐ™ÃØfº2{qpquy;“ åI}{üîÁëÛ» ô+ݪær?àº1ü³ù¿‰ÙäÐ7ab£ÿì݈™Åф٘•Ñøÿfó¿1ª f“õŸÇl²þ_Àlþwüõ/b6ÿ‘®þÝküÌæÿÇ1›¬ÿ%f“õŸÅl2þÌ&ýïЖŒ ,€ä`þ=*“ýÂl2²±þ®=Ûïp—Ì ŒmËÀÄò¸K¶ßa,ÙÙ_ãwcafccû}=†?°eþÝ1úß!?9gËÀü2åßõûòïwÇX7—g¢ÿ{èMÆÿ½ÉÈÌÁÁ$(ÌÌ.À*$H/ ÄA/ÀÎ"ÂÁÏÏ,ÈÌ ÌÀó_×ø+ô&#=Ûÿ zóÿÄãôŸÌ­_ÎÊ´LÿNiä¿­ÿüŠdeüÁÿdx­ÇÊ@ÏÀÈÌòýçÿ•­!äËó_c€þÚÈ?…ò|5üXž¯æÿ4ÌóÕøŸ¦yþÖø¿‰ó|5ýçyž¯ÖÿÐó/þß!z¾þÓHÏWã’éùjúA=Ä¡’ØOJ’¸´°¬²>>áËuVÂÙÊýGh¿ÔPÃEZBþöl‡¯Eó«¿µ¾›¹µ³5þkÉ«]õÍ~)ªËÈÊ)Š+BÒÚ¼ÌGŸè7LãKZ9¹×‚_”ÿ_pѷ§ümGä?ÞšéÛØ[ák™ˆÿòRËDŽúÅâ¯m_j¼ ÈÉåµÿ ”P@Òš˜ÿ£°¢ ‚¸œ’¸¬ ¤Òëb àÿ¶wHgÃÁ`düFò²Œ¯«õ“~]W3ó_ …†/ÂØßñÅÿVF?¼ñŒ/UŒ!Ím\~b¾^Æñ jÓÖðeuÈ™(^õê»_àÿÒ½ãË"¿Œ ßNÿõþ÷e´âø?¦ùK¾nº—E~ ÛŸ®?êÅœúeÙ_gô 47ùíè^é?ö‰«¹£Ùkϯ ¿ûK[ÕÄ à¥wkgG'|;ÛW¬Ã«íM o`eŒoàüªPöcë¸Û½ºSŸð/WŸògྼ17zuÞŸgõ²«éá¥ÙdÉ[ãu{¿Ôv6¦ý2â&¯[ÉÞÙØáuþ?«ýâ0ü_qQ޶¶6Ư<)ýŸÈSsã?Å*ä¯úÝzÿŒéŸkü£Ç{Q\áçø¸ m_1`/>û}¤¼R¬~ Ž_:ؾœ^ÕMÝ/?{qØOðÊ/~úáÂ×3®íË%ä—™¿žÙþæ0œ\^Ü÷cs ãóK)ÊþpñOÚ‰‘#þK$QÿùȯÑôrô‡ ¿²’˜¬¤¨ƒ±)¾˜³‘ãëyTZ\ ÿ5M|½í{sEwG'cë—ËŒä¿t‘ûÿ›üÏÔØI×ÑØáõ6ë_gü×ù3=#ëŸøôll¯HxÖÿäÿßá|U?°YìCyª,BÏáMÒP«Å^™GÅm=øœ<¥"£ÿ¾8¶;˜°¾mnœGðŽÜ»7‹‰ ;.îÐÊUÐ@{$cÐõÓEæ]÷‡÷s7²ÏR ùxÇ5"¬êÑ> ·1»xýImi]ïÞt¤TŠì㈄VKæ§ 5<ØpzÞ˜sú¦HŸô\øF „ÜÙ`¸u@îž:óbôÅT?)r­Nº·—ª˜î|Kk‚›ŸuRú•µ¢µÑÇê¼@&¢p–ÛÖ5+ú² .:ÜÊ‚‰n÷ çÙðÉ„¹º¤ësÈ¡É.D¤w÷}rÏ©û˜[’³cÔÎbSÜíT´¶q€óÛ¯'\E8é.b¤C_z¯Qé„¿W¡~$èe¸ÐS$«RÏŒ ýT‡ûö0¼¦¢¯£?³xP©.˜Q7 7„Ù€h*±Ú™ødÊ ½pšaC“ˆÂewƒÂHU³Ó1nÛ<óœúQ™:Qº?x§¹o³9DÿÌÓÏ0²à¾Ž­ÑÖ4™ ¤y¶™ÍŸ·Ð=ŽE’ÿi`Š€ºAH˜Í7¼¸¼Bäâ䤜¹²_O  ȉþMI~þ3ùûEg@‘,;ÛÄiQ¨Æð±Õ>ÎÓ!$+—ºa€îîa ÖöÌ̾C«é5Œµ†¬TOð/ÈA¦‰óyòSµå´éÝì˜Í¸½ÉƒçtøR«¾«`ŸêßÏg‰ß¶¹†ÒGî|Ì&5ꢇ­Gñs¬2Ø¢hé`ƒ©*ƒ`¿˜·…`˜¯îmÍŽä‰s÷%Þ¯nãS‡¿þ¸óÝÉÅÞõÖÅÇÝ“É(¶Â§ìV-p.ú°©¾Ìªù›ªwòBÅð§81uFËæu&·Yý`[¯dñuó ’Â<ònµt<¾.ûK{3@®ëé|CG¹ìj?F"²¤÷‰È·ÉΊî5•D¡=êçiñNçœ@J s¼mØû=Yç¶€º»"éÅ‚ºsAßß«IÓïv–òÚoÊ}¯úU|ÆÔŒrmò!ÞʆpdÁÞð–=®PY:b.|ï>Óù\ƒö—³¤0“ëÏ1†°ÀîÉÇÌwQF)“Ë €þ? cê4íuJŠ¿èÜ’„³tñvÞ9ÆïÃÊWÀ °OI‘„‚k9ÔYëê1¶N(-7É?2ïÃy ^9êA®{ú˜ŠÏ „¯"Á7Å䆩 ´*¼Ç¡!ÇÌ+©ñÖÌ3pæ·ÐâgLè%÷y·Ëü¡ ròÔC8qW˜žWN hÚƒx],+?Ú¹¿wÕ™çÝD YoüÄ ‚ÍÝ€Dß¾Üö;ë[ˆcX¡O°±©cŸQÍ¥“Ì)â0ß}ÎíI«ÛŽ€þ4ê*-ÏÙ;är9÷1ZˆpttÌÓù#i ‡õõõx+ð¡•çø‡æª.—äi¾ç ºÄ¢£àÌOÎüî﬒ä¾óq¥à¯×ð‘ h[`}ö¼=C"÷;­ç™%ÔP¢ºô?/§b;•ÊXCº#}ûu2‡TÄj3|uŽ¥‹Ý ‚Êr >’P—#k>²wÅ0×?ïˆê û †8Ê`W¥¹Lƒf‚gÍRWÅ àÍ`xàlñê—.šÑ[ V¾8©¦’Â0žºrýÐÚ´:Ú-Àšøw24³“ËKÑí3G ™¿  ¸8¿ ³w—@3Ošñ<.U¨CQaQ Äo·ªO(ùðá©hç€K.gCÓ>…×™PÖÑ{pœ&x½,SN—ñ-•ùJÅôPæ¾øÄ‰1øð±hpb3‚ÿT@ÿÔk£'þ®.šê÷e¾I†˜íÊ›–䄺“Å2ÊkòdÁÉ,e|e7¹áÇ^À͌à ŹU%˜¥ÕIÎð6Ù×b”b{ ¡ÞyÀ±bÍNl™­­'½C ¾@&™ºíé¸wLèlw7Ûî6à—ÄHD¡äê?nU0ÂÒG>·ƒ~­£ôËÚCÊ»DЩu› Ý æÕ§mè_)&VdòtµgÈ?™Ã,Í—­{Œú²{j„®â²Oì/¡Æ’òé¼;2ùB™_Ÿ&ú3\÷×Ýâèàr½9™WÊnë½±y|‚Y¼m}ª[|lótq´<>ì½Û™a~YmHuk×¼ll¥T”2uñH&¡ª[ ðÎtEhå«y±] ”Φ -}Rö€çÆ&C]­S!]àõn¨|g@Aš.؉eáØww†‰¡Ífx¶‚u”®g\üàa}h |³± Ñ1t.¸Aße©ªƒÇ¤‹µ,í“-Ü¢6šÁ¬ÄÒÙ¢qš¦àgýì߀X.µØÊKd{oþÆð¤¯H:-VUX1˜­NÕrwòÍ3ϤKXý§÷~©Ä»ˆ(àQToÊí!¹ÃÇ󡪩'Û6Ì]D|#j¾\²çŒœía=•¨Çdn¨ž…Å-fh] аÝÞ;éaE“T1½–è7d_e½yLþ$fÙs)…-lŸ¤VÀ9+¸{¾ «?>…8{Ãa@FFtx}ϨmkÑyš!õ5²М^ƒuLV¯w°íãdKIáCv´à"b?)]A;¸Æ!UìÍÐ ^yD´aê½8V @¨v¯F£`bË—÷Õ›¤C*ÆÛº×tlËQËRÔÆ·žÈ‘°ël“·»'§'¼Ÿge`þ¯ƒþ?¼Ž?àuÐÿçu ( ñKÿÓ¼¶ßØÿÄëø)àÿ—\Œ?‹úÿ–‹ñ[*Æ¿™…¡$Ä/'%øï`aüyf—…ñóØÏÿWYô¿#aüJÈøo²0þ‰Uú#…´Š€¸‚ìÿ0â×úï)þèùêš_Ýô÷¹¿.ů<ˆ„NAÿwï_cSüm2Å_BlþŸ°)þçÑ(LtöζNÆ?òóo"Uü­sç¯* ìøÌ©``b` gþ›¨ Žß* üM!6¦T¡ÿEaöEñú7ý.ÿ~¼#ãoññævŠÊȽ«–iW…L tÅ} ä¥R8õÔ = cÈ©* Ši´Ì’ɤÃYmVíêi¤4æi7qÂi@Ö…ÆTr±ï`óB¥õ±A…ô¦èØ=²/nÖCÆ1LC˜v2øM uoÁ|³Ž&‰wøA¡ð".DÍ}&FTq!›DµèêbŒ¢>‚,»ùÄ1NÑõ‘Î\îÀ—а%qiocÉŠ–W‡¿½—‡±cUmš6³JI5ƒ©‚Oëæ 0ÐÂ&X‘³v½½:½lI¾™ÕËìjœ39e.1Í䧺Wóë2ÿÊþñ+³‘lQF°%Põ™¥"Ù6°¹žVË6ðͽS”Ê.30R4õÉ6ÆIÏMZ¶Ì€8 ™|ŸçÐ2.†l7ïÑ\€Ê˜-Ãmú+¢^HW¬? …j_ý9§1"ŠÙ@=Ê™~yWf)§#LÛ‡©”Ùƒs`jTæ’ïIŒȺ¢Ù&L'âÎ Ç ±Ñ6ïI¶íµ¼í TÅ+]?ÜpyÓX¯á‡Î‰cõćDÙm•ôwŸõ yÒnlħùŒ…Àôä]„|åô1…4処5²T¤æì¬0NH_ÚGÝþÐ!³ó’¤&/»àß}1cði#Ö‚0šÃÖÉ5º4¥Éw I+Ð!“— ÿÂ)bl¿¨}ôNÆïêþQ ‚œq(a¡ €ÙPn ԩ¯ÿ!Eè;É9>íJ¥Üiªt¯žÐàÕÜkÄÏ ¶s5( ZF¼ù÷*ß¹Lô€“L"-GÙ”æé{¬¿¥*Äià î>&­¸m¸¼•Ú¶` LÄ/@lž•ˆê².Òƒ=6wl^ìdâͶc¢5w=RP»'à1œdhœ­ûl?ò¡je§Á‡ó­å0'×vsLôÉ˃HÊ<³Lt¦Crtþ¬£´¼Ò&ÎX…ü¾‡,šó¯Ùí¼¯8Ã*Ä>TY¸÷˜o‘:ü\µÉ°#Y«T´r·Å÷ ѧɗºJµ½|Þ†i=p¥?´S åx…|ÞÓÁ¶Ío$O÷CòD©jOLÓXvŠGù7ö¯!'Ëʨ‰êKK˜Ã<~(ÊÐÚ»N QÞ:)(A}ÐM]X‰W c{õN°™õgm§ÛßScéŠnœh†¶{N¤G3@ÕêKÙs>ÇnlHØOZ\é“ÚÜÚðßX¬Û?X­S­;º= :`^êuÕ·o¹§Ÿï~¼¡ ¬¾uÙ(¿E ÎÁUM¦2ÑÀ›ß—f\«;(“0)¹ììÍ„–Ì·3¶³ÛŽéèñùùúqõ9H˜]Š@z¦Np$Öª¤‘™g§Å/uØ`[JŸÇù<}¶‰ œ½Ú?^ð[5’ÊëP*ÖÛÞ Õrpü¦|BH¸†“ôëÅ·.p TZ¶MßÊû¯²Ü](ÏÞ½Žéb¤QIn´Ÿy'„Î&ºAb‰¿ÊfÀgQ^pãK¿‰w»Ÿõ8>[¢ G."}XÅá§^$†]›Q4TX`]šš¤að žGu¦ÿ!¾ â§n”ꈛÀ›5éC"b@"†Äv¤É°án¼7¨ë|ÔÙŒ·(ÒÜ&8&Ó²öiq [8ž¼÷ïºÀaa¯Ùy2TF¨Ž5ŽÑ9â¡ÉNä¹JPE+ «¾Ý–@}àÉl0\°&û?¼×‘‘ŸQš¹Úb§Ý¦µ¡u÷ëÃjöÓôÕû2 &?ä3r½`ÍúìtõoXåuðÅïEלˆõ-– ´èÇqê¹ÉîÕ²Z¡Á4ûƒ§,Æ€,¨4†»œÛmècëKH1 Þ9g55ÁošÕ²$@¯‘%ÐÇû_¬ärGA9B¤`$/–U®c³cè3©p¶™O}W€¡¦+_$“:Þà¹WKo!”EÉTÀJÊ&Sú¶¥¤ÂØ“S\D¡& $讬\X8®1ù¦øø®» (AÔ"?!Õþ*“I,ùl+'ÀÝu¥fM¢ ¤B¤v}§Ö-_ši]›V N=ßSnk’ Ô<šå˜^¡-¿È3ç$¬W–Š.ŸÅËI¸§]Ñ‹°”Ø/-&&ísYÆ‘$ê—ÅKqÚ“ûìàh7Ú(öæI'•Ï›Œ3Yë>-³ V>È(PZ)‡.Û“.*\àÉ_Ü­ÌôÍ.¿l¸÷»û<#è€ù¼¹•ôàö§õÿ´`‡îŽ: w(Ûá§»àe°Ù¢‡ˆ†zø®tîÛ§ofÈ!]”Ì[À1¦½PGN‚Šúü‘J0—±(=`”ùT‡ólŒTí#òPïò*—Ǹj…ï›Û“V5ûa¶š•z‘/IÖyܦçœò>¶áœñö>˜’0.uâît]vÜ$äï!*{ù#ù,Ç!ô oyŸF½ëÄêè,/ü$=…¼ØT# ŒÈFEJdž³éo%h±Åoi÷/ €F€€Ä#·Yî N ÿíÉô=ãƇnJöl˜QB]_ñˆ#mÈó~ÇÞôDV>þ«Y߀‹õ[øAÝ |»ë·Â”ŽÎëSáS"›;8EƤl o™É+™§§XÕ0–šæ6£Ÿü´¯ñBãY¿I«Ô¥»O~½ÃZ©F¶1Ò4éL×B‡yg Îã-„Æp­«"tÍH#ã7S¸# Òn)Ém¹~ jÂY~Hâû¦RF†éù ¶oÃDi9 y¸diºâRM­RÞ£½çk Àç% Hbxß.×'¾Ùs"•Ü#&˜md6…+) àØ¯ËŸ] f_brC™š„M˜¿³ONNæiA%ºöñ€¹6Õ6ˆ‰­‰ö=ïñÇï&3–Kòv}÷ŽŸa ID5À9©¨¦Ô§‚ ZÚLø¾37fq`-ºsÓ‹l{JbIÜCZ&´„ö³Fô Ctùј²=6PqªYð tôÑë:YÄ‘&ª…‚LÌØL4JêQ-Ä4òÓ¨·\MÓ~$à †8–ЈççFIÁnùv3?kþ T×’ª9­¦¢1À×ü¡¦ø­©Ú4X±o;ÃÝÎ}ž¿ðã;ë°áœˆ}‹ú,ssùBÍ›¤K‹ y±æÏ³×ët¬3†ž2É©|ZÉCߟ©® (ÍAÞâ_C ½_Þ³ô]LV.ЍI0ÿüV^y•ÊogumÆö³†‹}((}7¥çAqùåUøÆýW1±eЈ½$ÿš¼YÆs™XŽRâ\1PÁþ8(“IœûL4Æs‚`ê>ØÔ+³¤ 6<Õí ÄKŠÑâi=J¥\%¤„’Ëê‹c–ŠùÂCM~“YÏ“¯Ö¨•!æX9] õz~ï|Eù)6oó0eÄraiiµI•ŒTºB> xÒÃÞn¹§ ¾‰É†÷ašPv]Çôeã3eY¢.r ËßRãY>’àÛpBoH¼bí;¨#ŠßÓªKÁMXËYèó<™¬Ç!]1 ¹ 1O&dŠÿâ,„WhÎpiõŸ· ÙT·”Íqå†Xk6s«?e:ú ù#­“ûAìàg¾÷ìø\PNBXÿ41ìòDQe–ÜUG!"&@ÆÞ˜rÂT°ÃhZŠsRIVâÆ±4Ô¤Ýóy(${nž½¯zŒÀc¨Ç'¼9*OÁne?îò0 éT^,éÌèW}On‡Á¯2“§1zlj‹Z8tvuﺰ„D?åóóÛK¤f¥UH*ùb>´4hµ.LDTÔK–v–1|‹µ4œY49C<«’nphT¢”1;Q|ï×-]í™09À½ýŽª¾ž­ÔnAžñÜ!¬Aq1l…Ñ’ƒ\«Ç€¬&V)¶ÀÅ7i‚,»¦ë à˜Fµ¡6¥y,(Š;)ç 0!~‰,/ɉœ+J¤>ÚšVKò')-ÙÐ[ø‘>÷aÂÍ ¶,º ÚÑ×¶f>e»·å!Šž!üX+y„+ø³d댦óÊ‚+ÇSý˜~škºg—†Ûï+ åÑÓ¢á ƒ.ƸÑÃɺ¹½Þ¬30ãù¼‚¬³g&¶É3¿‰ñÎ À~ð úBo‚ì@@ñY"xz~ x¡z=¥«""½| ‡S¹þŠTTw^¥Ë|­§Gñû´…rî‡üäìdå(%%/G ÕèúÛËz`oKÐNÄ[sg5idþÑf\ ÀR ³»çñá;PªeS;àV{R/›-›C•SÜyk´ˆ--— w¦8 t_!’V,ow+Þs©¨¥+oJßÄhtÖuÄ”öOËUùaä§KMk¯:AìË “|8Wœø6Å`«ü^€3ÅíbA»UÇ6׎Ô)‡3bg˜ ÷R¸›ÈLZÀÜ|Ój³Éåº&%ÍÍ2ïsÜR ñ37ƒÈ;>¡ö ȯË¥Q’á§ì§ä¨#~–:‘÷ªààÛI§×»3»5ü¥\fÅ ,ʳ @vPrm¥KÍ;+ñaÖ@+ÒHž{’4©Õ½pdtwÄý&´•æ–ȧIa±“‚0òƒªäQ8ŠÛÝ{Žï®ƒ'o£ÚÏO`LkQjøñ\6ýèfÀ…á@Îõ±Îe À/ «¾e?=cárPFlec›V,Û›|Ey>f¯V6|Š*zb†¦ÓÅ…«›€Ì¡,毚<Òt”¶tÔŒ(Ëø*G+üÉË ÎÕ#–¡Õ¨2ÒUçØ¨¨£.®ƒ „{JÀ@Ñ!8Ú‘¬-U•™œ ý»±±²s¡[žï,«­l9­tL‚f•z„¨)8l­};`2>çÁj€1»µ· În.º¨ç‡†‡ð¥ÕŸ&N^f8Ûbb÷Jø0ÉÀ÷Ì'ÃÞUÿžI«÷ /TlB-ªl$Ã"GE ┌/ †iM'Fù–ÖóÜf°kç'ÿ«i)´ ß«^øÍ71Tjó{Íæó„«ÇE }EÆÃæ¬ýfWºNàvQgÚ,ê–ÉíS'|¶mr\’º'LÙ{¾·ËøN «$çV$¢¸FsWŒ¥Ôvº°G"­€ö!ª±|r¿ÇdkÍÇx’ÄA$)¢¯ïj…?äñ©%Å| „œU)87+!)ÖRœ·A¨»TQº¬KBk1dnv°—Ѱçé+è†)±&£‰$³ §r~¸üÔÙB¨é^¢©©Ô¿€b5dª”>?1CR CÿFz>Ø ©"öÓç2?*­õšjuîõd3,ŽÆÛ€ä©åP‚ç|{{Ñ[îÁ³ø3àBc>Õç¹Ú=UÕÍ­P¢6àÓ©qªuÎ$˜ Ão·m °(aQ™á<®;—c1»Cö÷ÙŠ› =ç±àoYs/3ëB»†¦M+N‘/σakÝ*mè/SÇGz üZìINh«ÝÔßáÇ?¨LĺkH;‹¼õÊxPܜδ÷’î,ÁJL ä97Ò]Ã|€›ô€1þ.Ù j>3”êY¹ð’'MK|ŠFõÀÓ¶ ŒüêiØz| ?âðX%é‡siaó6ã«ûýšâ±8úÈ|w"¾UøÜRÃ3ÇÙÂ0ððÆÐò]׿íd¿gÌpâF|%éªÇ`=œ•†vgeÖçƒæ>¬”*Dò{®Ou°íü•l *{ßedX…%Õs•N6ËB}‚Iž§þyqå¿ñ#½ßŠ+³³2á³²³ÿ‘¸2û_Š+³ÿcâÊŒÿ¸¸²è­$~÷±ÕoY_V¶6CfÙÜÅøß«µü§Ký"ºlmþ³ûB~ÙíR€™™‰ã·Ìnjг-WQž¶d»ùY«f8-,qì‹óñóßå ]`3‚#â«càû迹( `WAèU±D)jP°>¨î2¬öÝÖ]º_Â9|ÛþüvçÖ?¼æJç^óäÚûäÞ'ÝŸCª º‡z5%0´ÎxEB?ìêM±Úâ ó¾3)_·š*ÒîFÕÙ€;íT˜ëð—èž™µÀ#ñþùùñ=¨UŽÍ£çã‰Â“çïýû‰¥3´Ð£O'‰A¸æ òaPh“¾F"Ýd$dBÄN¢ÅߌŠi²? º_B󠽌 …“|œEîân µ‘„\Ê:¬&r6]¨¸\ÆÀ3=î‡D ö4Á[$ãüÄ»ÁW ªTçú>ÚV«M·3.¹Íñ\{ùþÎxPPµL«ÞcxÁÚIó$JßÖ¼ª‘žÎ øŠÕ^3¦Ç«Š$…î Öå'ÚE×J×Cu¡@ Twƒá`þ°f¨!WÊœŒI”fÐQOÏŒžgUýçÒbH³þ=ƒª ˆÁd5©X’ßp"ƒè!‹+xz‡¾•nÏ— ´÷þö ¸¬x‹üdŽŸ «î¡¾ ÔÁLÊÐ'3PálsspUût/Ÿ²ÀV‡ì’«3{_®cHšŒ¸q8ž Õ2•¨§Ö⎸¤/°Ï2ì°dÏÚ ÍsyÏ4{©’ñÁ^!4=:¬Ü_(lo´öœmîfhg$sž8ófl{GI Ò-]7Áp³Ž¦6F^÷?­±#@XÑçD{tõ¤œ–n¢'Œç‹Éz wŽŸ‰ßêÔ©ÑÂΜÒ§½¡´¦`I@K‚^sB­Û𖔌—¦à.ÉÓ⥡41P“dñަý0G>BÒ“l8fø^} :¿Ü-‡_ ŒSÜ-ŽÝûcÅ%þèL¯/5B I´¶ŸÄš=‚R1ùt‰>ë™àîé ÑY^{ëM4D"9—È:ÕvX(¡`ØPß¶x ÀÞ›òdT5>N™2í©¦aˆšý•0±¦*]%™&»žsj‰eT‡‰ˆ1›Øþe¨]½l¸/Ëiñ™G ŠkÐèÈß{ꉙI’KšäTtk|-‹ë]®FC`KEÆPy8ý»ð/qvLé ŽbÑ’'Ó;¯‡ÁC£ñ$£aGÑcø'6\ýT-©?NÁì7®âOžšÞ¿Õ3ä›S ȳú ÂƤñ)dk•)ןs€Ÿ¶4‰GãÔÂé ï#,hLë8³,¾äÆ{mõpQ·¾cš^¢O&Pq´n×Ïh›Ñ‚³'çEŒì Ã=~½©H2k<™¿94г…ëN¦3Â=ÙjìUÿx=‡ AÏ?/áãÜ ƔÕR5)¾­¼®étŽx$XA8×97ÂiÜA•q‹ÍùYØn$êdåBú…›xêN0uœQAV ù@*=†Lz ë]¿Ð E‚ŽEœ7$mÑ{yW¦`¾)[þž— @jñ½þÉÈ EJk±m :]/6c ÊHTñÍc÷÷uÙJ'op°U2žóæºÇî]¡Wmfˆ³^JÇãl’FiÚÕ8QÛ}Ò¢òî¥çÃìÛÐÏ㹟œô†ß¸.Ú±ãŸåxÑàG÷ï9à/'«ÞëÙ³}K¶'ýüÞ¾2×£ V{ÿy«;åƒ”Î¶Ì ¿8'í*~b«¹Xö‡•üjŒ˜±Ä(EÃx•2R¬S TËõÐÕAªÄ½ÆE¢I«dñÆÉþ-oDoާ¿³ö0˜ä2)©Ÿ-{Ø7oCB0…^=9 u—€ê0è§6j¯¯¹ú@CJÍ`è³f+”µBG$±MR°NÆ| 8/G ‹‚œ{¦ZúÅ ’÷Ö7*ì+6§‘@µ<±s‘ 3JÍ—±2¢õwϲ}\oŽÀ%¾ns·ðÈ*!¥ÃL8½E$íîž]€4ß»ãç6._)/uäôÅiYµÏEòÄZÙØìšU‡ÔÊLWŸâ+QEþ> 5 Ð<¾èÛ*{_mû”¨G=Ñ? 3¹Š©Å“;“N„jÐN1L^6;G°0Ó³¤8óº"ÚæýG²o€>[<%1LNØìì ³S3‹‹rf»IAû^û{—PE(_N^ö¾ŒHÞ¦}¶ø]`Âc¾sÖÍ »g¸áQðÑsðQÛ˜à/ú®J–Â]>5°£AòeÐZ™‰4ƒ ø¬&hAjÑ)‚»„\Rl׈N—ËhºtÞº‹Þbdž“fgÐ]q‹÷kAw“vñˆò·cóf“)Üæ'õ=$`œU‚³a]‰õ ;ªª^²zy,khÊ 04b7Oeˆ@¾ùmªUþÂ%á*5m9Øp÷œƒ}úd|‚Ò­±E;Ôý­ýi°D‚ä'ŒóË[‘H@d@ÅÔz¨‘€ü¥¤Eá*íU…ËS¾€Ç¹÷¦I™ûžA7ªƒÈ½¡ðî&áJÖ6rg‰8áÈ|¤¦d!ßIÞó.h³«ò­_2„GtP%ÞR®-:}FÜ(ø(*Ä—'£\P&P¢Å–B‹ pÆWþÕiA(‹’ å\¥A4W\-¡ÔqÕë–$ Q®˜Õ1$ö“Ec`ñdJb=àÊcM$Û`8}rë¸WÙ(¤e Ï(ˆ©œšÖ8Ôí)šrGî˜ï;»‚¶„ävQr›öÉS¤›U§o ÷¼ßB ι!ð'•·€veý ÜiâîÞäOëøi5°ô1µs–~úÔ£b9…j! $]=-e¤èi}2ÿ¡[ðáDã“l‚'3!‘$&°Áî6t;뜪ã:f¶ö¶ªZâôŽâT‚‹Ó¤¤ÙW$X±>E£ÅÂþæT¿÷2œ/÷ˆ-¥Ëvx·ÃeÕŒzéLÜ_¿ñ«?à§7É®•í˜ wÁ W‘ U‘Ãó×ÊŠÅÌ.J2¬qlŽkÉ`Œ”Ÿûð1ç묆ÊÔÇ|.R R þ ²£S¸]kÚÎXO&ÍÏñŸ…UååÕL()©*¸ƒ+ߊBEZxãÊñ5Pòª0M£M a½íÕ›i”j²Ú ’É⑊ËðTë‘2 #ÌDH˜7@’R?3¬Öå?fÏ[}çÈÚ¡Vó¬ç¤‡º:š»ã´´ VX¼Š«Û eE†ÀäVÙê+fM´J+üvª’•˼kò*ïà¦ñnœ?ÃQ­äf-ú¾ O3ÖjÁ(‹—8¥ÿØ*•§Q†ÂY7Ã>¦¶«ø•ˆ}!V!¡hF¥2Z1ÈI.ªÐgBgwŸæö¼eßÂÈ6%˜ U*¥Ëjؘ×Èh[Á–…‚ âˬ҅'˜@2»oyeY°†¦’"èi(„]ÂmAÓFûø²mZ V>תÎi‡Owš¹õ¬Rq|áÊ›hlî¼kksÚ)a6 Ë!ïÊP#ùÚÖ“¶ß²ŽS´ü¨&¯Ô?W¼õsñ·lj‘Õç­´óôp¹ªXï3׽쾴‚rœ§y/º(E¼ñ‡KjdâFòKfë6Q³•˜°¥£MòJRV –4ߘ)D L2ÙÚ{5©e}i°‰¥"9«Å­,ã­4 °éUšVU1¢=P’ÛòWýê~VºødÔSx¼ú©Vjª»Dr>&5å¦Û‡ç··ì³¼’IrM®òšù†mM˜ß©3§ˆ²3–cn3RÎ2çØLhàR‡«×k’ÔV¼IœW.ƒFËIò¬ÙB/çêvè°ÍsÏ·$plZt¹+Уӧö“¤­›(ÅÎQèO„”W gDˆ9ðî¬äŸ™GžB›Ê¯ÚšûâPPo2D“qÚØE‚¶¡»m³ëi'¡nV °ÕÜÒßïýŒZ˜Id¶DY¹tZSv^Ýyî˜2&VY±b˓քæO–\Ûª|”v@ܼãóÑJÜZv—[áЗõÃД®õ~ÜÏ™B­øg“»(¡ß/ƉnxzÏoŒvXì`¦ÈË37Fdöy¹0ÈÌ•WAìI¢Ã¾co Ži`×”y¶ýºãÚÛQX®Š¯Åw£‹˜}§ƒàæó’ã'€Íë¿6víц¶Ð“Z#YLÝÊŽ§”–Ž‚í¿åSVÒü,wh[‡öm˜÷:›ÔldFh“*äÊ„ ÚÒ„/õâþŠÕ#Rå‚jº|¹Þx ›ÒGX¢¤&îÊTYÙ937œû1^P„‚ Y~Nüº©rœF«V¸ä´JVÝX¥s9§Ê 'L¶üZÖÁ'ìW—tI8™üæ¯-Ö•›j‰µêß?³MLãsŽ—L±¾ë]‹ó¿+=b–Ëö÷1wu¬þR?<¸«QR0 ^Ôodñ®b®ã1KŸ°¦€Ó›Ó7޶ †¾¡¨*uÜ <•…©D-|po^Ȩ„`0A›4™m¡Á«´r´'T³ú]BÝus~vrj®ÊXg¢¾ü¥©õµlhlÁj×Xö1¯ÅaÇç›R+ðåµ»õ§r°nР܉"”H=®ñq£cêâ™]~´Ýú–L³?Ç’J™ÂéM¯ñiÃïê|<¼œM·ìåW6eT WYÈhTÃ8‚Ö‘y>Îu$ ØDÞqyчPÏ—dOTÞvŸúšØÀ®'ËI`QvRëtcèSnÞ>䵪ª-øy¹¥ö1u÷):zw·qIb9ƒiö:Ë1Â.qo^¡ää?SÙÐÓ¯\­$½ Ñ òp¯ °EÀŒÆrÅõ–gÖÏv·žrC3ôÂØ-“¦.ÙB¯‘@”ͳSë: ŽØù¼úÙ¯Œª$ÏÖ;ÿ-€sãfvذ¼üd˜u¡fiŒ‹e]>,qðwzpmÃ/Î7Fôß&­®;›‰D“AM‚…!nEò¦%Y\lÅy=–öÒÏàz´æ²g9 Qž›ä”­VAoÁê:_6zX’î*°¶»’j>³†mrW”˜CÛœ®n kGKkkIIk·€Þ„GCUòÅt=Û—_ɇƒy¶5HGtb²*åBµùŒSůÂÎûÄË,Ñß |%é5 ô=]Ïs:mñ|è¬5P×'#á…å®±žþ$9Ɠ՘g¦B3rU6“˜¤©M“ÃØ¡!|B¼wfl±öÌJÅ3%¨ŸQk§ðÛŒ»œå¢å÷p fåú™ª`NáGõËÞ @HÕmäßìW]˜a\~k`þÒ<–[²ñ!Ø…@´P(z&ΟL”41w6–(YCvó€h3¬ükˆçÖ8ÅxâX¾]5µ}ª¸Ù#$$7reÜÀÍ=zmeYS¿|i Þnú£0Â@f#2ªvITRð"Å[á"øA…½O^á«d&‹èH÷‡¸¤Ýt(J|ˆð¥q[fýÄñI;ÕùÍõŸ€Î7\¼ ªvO?u«/Á•/ôT „”Lõ…õ¢bh´}4÷kBC—íÍ)zìåyW¤q9—wD¢x¹_’k“SP?î”L i[ØÙ;â¼§Ò .FÅÌ&®&V[§š ¶¹õqó;²°YÛÔÇ‹»ÌnÃÐøÚ<%Ü=ïë?áY€ïÌ„)Îî¾¾**ìí~tìxÛŽƒtÿ•Txü~œM¦ÍÚ0Ã} Ðtu 3!Ó½ÛÐúÑï0såA»-ÚwP6­Pªò57¢&w棤 ž˜+çÉïÛå™®¢fúŸÀd½:s0×G –¢ã¾ùÚ@d3¶ŽÃŽìÎÏWäÒe9?@®9ì?µ™p?HI”û¶j =NÔR´¸K>Ú ¢V¡·Qhf{áÏ3ñXÜQ¥C%GŸè¼¹gr;ŨM<ßê^q…Èld§*öJþÌlɃk¿è”,î†Ö‚°€1'Møµ£#ØþÞ1Žy±¾núï€Û;¿^CuÐ6”VE¸¦!¯Æçså–àf É„R ó\í6ˆêÄ-ç]àÈìsgÒhÅ-”ÎÕøsfå³=Xîð^¯éég&´+Õá+Ç¥šì.Ñ ñ^5|Š™wÏöQÀ¾™±:’Þ(¾‘Q6Ó•×j¨\ŸXZˆ‡¦¡‹zÁ ±ãÁ€ðD¸? ¼WýžÙ îXCã¥éTR¦Æû©8F¨rqˆ¿ë=n±ñÕgÄ(²©•*¼è “O’ÑÇïºP󴛎£ ‡;¤P@{X  <™ ¬-Zv x\ê‚MÞr6vFSÏ ƒ>Hí»PݱòàÞ„ð ÊR“2øçu²ª»·uv¸ÐJ..ïµöƒ‰ýjÅÑ?ùkÝ€RdT+ÖFò!äBÍ–C=ã†0­Õ½£ÀÌLäe ¦Æ©ún Dq-þ(µ¹?~œH†Zþýƒß ²äHÝäŒ[xAzÑÊÀ;p¥er`ß‚¸µluýMþ ýª¤û&¯ë¼@·¡{ã®®F¯G¦(áóoÄö„ÑiÜ6'«\ 'çéú¶‘¢*Må¨9™»ø’2ÃH\ÖhÙºÎït¹£š$¡ˆµÀ²í*ü8¥µG"/mðªâ>›žÌP+zggqJzL%Š1åƒ3s»-Í¹ŠØµTêƒ,¡u Š[§ÖwNäO×™­ð,9Û?Íf%'‡oäÝ@ôÇ% ÏxÙœì–\aù=X;Y„ãˆ×PMïB&/ðäE^—ˆ¦ã¶TéÊÉ © á@/ï(k?%¾‹Ñ{¾‚÷aÊ_fã DyèBÔ]Ööò›Â!}H¹‹>•ÐÃZ^µw”Š+Ãv[Ë}ƒÍ£P ¨‘³^‰éè-13"´ô¨Ñ|ù9)RÝ@ш·‚'Ÿ'F\ÁÝ¢[n!€Ì5}$-ƒSÙƒÀ5HG¼ý`ì}Z ÕpBü·M(³‡,qwY«u|-w¹&ýô6xØ1¯ªóa>=×ݯuu[Y—¢}!Gºy{¹êßÈò#iAâàƒ©²Ä‘c·ËÊ\ŽÚÎ3ï½>QsÜoÚhkž7A™RªCqS_äãe˜YÆ2–ûRç#½Ñ„¦¡ºèZÚb¥ÖÁ™æõå9dÉVf}‚{}îùA¯—\ênéÚêž;çÍ]¶ÓeÀâ&R4U‚a×q¢çG$_Ý/¦¾!èLH®#¾×ã6¡]êp¼÷àÙðÜá‘&¼dµ«ÛK•ÑyšN²b}YÀD²¼å{­Á¾W¦ßŦàÑIEe¾/7½…oqô•¸©kÈM¿cÛN„†u"oUò¾?Ÿ]ÃÐßý„(#:b¶½ÿµ…ce ZòÅ;û´+Ë€Vè¤(æ2cͯì[XFÁ£€2&=à¤+5™ªb†’Ò& •‡«Ö™]b¢]!ÊuÔ±ö‹53ú‘n­‰3ÚÂ{ÅÜq5FKÖàG´y²ÖÔ?P_¥ÿöÿª6«>=ûï%‰™9LŒL8 XMXÿ_ˆaÿã£ú·ˆa³üóbØ,ÿ'İÿþúWŰÿ®þÝkü1ìÿ‹a³ü—bØ,ÿ¬6ÃßÃfä`ükqhFÖ߉93²³þ6ý?&†Íú{ÑlFŽßõÁÄÆò»±Ð³³þNDš‰‰éw}°Ò³2üÈõïŰ™oËDÏô{1lzV¦ß‹W³3ÿ®_fæ¿´f``úƒ~™~'ÖÍÀÆÎÄñ÷„¯þ ákf~AF&!V6!!6~VV6VžÿºÆ_ _3p03°þÿðõKÿQ×ÐÊÖÑX×ÑöõìçHkø?®ÿÍÊüSÿ›™ž…å¥óËŽþþãÿÆ’Žò_ÓþƧ|ùÿÏ)¿Øý Âß/Öÿ´î÷‹í?-ûýÛÿ¦ê÷‹å?/úýbü/h~ÿÖÕÿÉï»ZñûÅöŸü~±ü‡ô¾ñ)é !ÿ¤ÂMøãìõ®Îv´f„]ðz诪¾L×å%×úQÙÅÖÜÿN)×ýË÷? qÿ”ÉÕuü¡#Eùó¤çKú§ 6FºÆöÎÆŽN¯lŒ^ÞpA¾TxÙw"/ñûv¿j<¿LØîeÎ?µ”i_§‡ÿ*ÄmeŒOþ³q{3c}#Šy®ç/ÙîKSüF.ú6/q÷µ¸^<ýÒú«_µ¥Ýñ_ÜëjŒojûK˯_†„ÿö¯LÿTü›ƒ?*ý¨NÃccìæôk%s“×áýRðúa„î«v´¾©1>ÁÛZÝJË ;¿Ìû (~mòwõ~)ñ†ü͘^bÞ ÿg¿ºTá%2~ÙŸ4ÄÍmþìÓ_&þsÀ?[q2´ÓýYøs”¿íùw5¸~ÓýŸÿi YhelóR®ûê/èÿr„¶–Æ/¡ôÙ?Fô«¹£îϢߚ¾ä¦$(÷㜡,$‡ÿëõù§ô³ôu~ˆá+Ê J +é ð ýeè¼×UTâWÖä—’à”$ÿsÿ®=j|ú—ÿZ%Ç[åú¥øëøùÍ~7¢?ªkhû2„Bõº¦Æ6Æ?/oñ©¨~Ýß©öçHù­Sœþ½Nùs{ß)®÷;§üfHÃ)ÞÞÿëùŸ©±Óë¥Èüå–ãßüý—ùßË+ó«þ7= 3ëþ7ÓKõÿäÿëù#==Ëkþ'dký’NZâK›Z™Ûþ'ÉûO’÷ÿ4Éû;9ž‰‘± ¾¿Š°®¨°’¢°‚Š€ºœ¬‚’®$Ñ ÁK¹¹±ù_ëò+ˆ*Rà{yáký<-ÿa|n|æ•þ¸”Ÿ•âµ||c‡—ѺÛ:ãK++*ýê÷WÉO,ÈOyš×¥Òw0ýŽ?|õr¶}½¸¿®áks¯é  $ÑÏo1Ga%ñ—§®¸Œ®Ø þJ ±1~‰>c':s›WÍ/¦e)$ð{##ƒ¿QŸ_AŽ_÷G_i£ï`§O÷ÚÕß³{Åë¼xëL_7ÀË„Z[9ÿ¶០ÿ˦e¥åø•þN/ɵþo‡ù×þÐyµÿ­;èÌMþÒ࿸…0·saýƒÃ6¶/ñkó_Ürür‹ðëµV÷gŽþš„ülã×㯄ý—“ñ¯/^sƒ÷+”/¡ôúÆÙæõ,ð3}ùõÆã%¯Ð72rÐ}=é½|gæú¥¬?ŠY_‹½¼|}õÊÁ1Ñ·6·rÿӻ׿³ûõͯp.Ho®¿ôêkÃ/$¤ð9¬ºŠ?¾ÊÊ ëŠ Aý܈øârÊ"Šâ¿î»×­çhîalkBNhòòàü›_YXhó$¤À§ÂYÂ!®!Lñk@ýû;¢øSD¼Þê™þtÿïVˆüO«òÿcï‰¶ÛÆ•Û‡ö¡|ï;Ö¹K¶,K²-'ëØ]Y–ÝU$]IN6'ÎÑ¡(ÊfC‘Z’rìÓ›oè´/ý™öœ¾ôCú$H‘’ìd³·{ì‡D$Á`0Ì ƒÑ ÏýBŒf…[b„pÏ,náÐE»f*ݲ]÷ã|F—´À:”›;˜õ „¦ 2„¡ )Dƒ¶¼AìÐl6C²”Àr&×W•"¸"‚ÁëÃBjZã\·m»Xˆ4ŠWXŠê2Lùà ÊÞ¬ øqÚjˆ|ŀŒïÞäÀf[œó˨Â(Ï€¦øU8ÃÀk': €ô¬¾pt   }ðuø?«l4†«DB!qÿƒ"ˆòª­š9:‹…Bj˱è>Ê@"辶ë\ûÐ9"ì+=.¤ÙÂûä„, Vë˜&ÝÏÆÎÚ}…á¾ v!}Q€dz¿·÷¡À}‚ÐGCû”•nqIʯZ6¤œå#0ü·£˜2îý‹z½Ñï+ã.Y:ôƒä8󎬤ç"­pÀP/6=X?”¡;hpÛfhFÃÅ2Zh_¼nôšu¥‰h@ÄX3©|8ŠõAçc–ø° ˜‰B6¼Ò‡PÚ…¾Ø>©þwh¨¡yÆš §Ž™R`6êTŠ¿x 9Æ–D¸{ ¯Ó¹cÛæ•n•’»>@—²€fÔküå,¯0Ï¿Ä)MœÖÎÎ[µ—ý,y°Èüïs —µ¤^&^\¹…|èî,'ek=UEþ.ð‘(„ê^O.¬Èr¥›¥­îs¥ƒ5Ï`ÖÌQªÜÒ\Ké‰áWz„~#æ£@Nžò‘Æ’F¼Pb¯OA¾`­&Êg•[i:ë¶ïÊ9-~oÅ…¤ý7“pŠ”ãÓ5$+Ì+\!íä¨$Ä]’«9¡ˆH:-Ø'ôBP ‰I=2ÁÎD§‰‰WSê¨qÂ)ã¡Ð›pÉÆ‘œ𮑋O‘¸®¥öŠSâ~sºÝyÝxýð -ÚÜ9 Ïã˜5š( S¯R¾q>:Ž ÊÄ÷ðâS’«q‰’¡fR"jTÔ‘Uâ=ŸšScv—{áS¨HVsñé$F(¥D>AFi7 HÝa‘hï 9KWq|œ/D­|Aöbeý{¡ I’!–ÊžLjV×%g•“³º„žÕ{Ó3¶Ü¢BšVt­~mÂ~7s~'ÿjf˜rе‘,‘—S9EUJW’´´ ½}¬8ŽÄ”¦Ò\VDôÂrʦ×–(„•0+W*•¹ãõ— ˜%ë[Šp(J ²°^`j¼k¬s Sö^øU‹¡Åø[!ø9Åvçü/gmºCqüžkùÒš1 fE-mìNu°ÉiŸ„öT\§ÈØ[ü¡H[£»ðs<á1÷“£(5ÛÔ=ãš6NP „æpŸ&T)\ÃS[æwVOÝŠ B•;¡!¾l Ðæ Ûä×àDNtŒ ÇÊÁÁ‡£…/[½Ø!ã T‹O²–DÇŽ±ëƵNjn7óùŹb:«T\b°sr=äçm%d¸@*äÙL€-%ª|VX(¦-/è"9UïH*{ b(›Ñs¼—ùX–¨¥Ií1ŠI®q3š&Ã[Ü©œÛcg3`‹vMÅ<´‚MŸu~.àã^‹lN”–aŠó"ÃR^WFfš(YòQ5X²ˆ½`ÇÄĞʯٖc¦ü[ ÷6&bºj””­«ZaS~~\?ÿ@ëç—J½UÜôpa¶ 3©Ä¦à”°EÓÚŒTæo·õEÚ²º-4óÜÀU·L0€Ë¡€ÎÙÑÒ„…*¾©LT‚LIÞî—žW×j‘c†PHª5Î6ìi\v§:¹_QŠ&! ðff Ó4˜gÝø„&êÄùx¶‘œZ© úõA ßÖrV¯gÆ"ô¢•\>„Šaë›Aî)>•¢9kÆ 'ïSß1í%==X ä×î+K!ýR”ö¿ø+)¢bë4Áþyî£?ãš_§J Ï­þ÷ªo6•L*N‘fð°†/s2ˆ Vó·0ù¦˜|9ÃæM£…LpZóùµ#u{+áGî½JU{xìï …ÿvNøîyºú„€†Â•Ÿ,À‰éͱ hq…΢:y»uÚ’$ 41ˆ3xLB ±ñÃ|h¤n®çA¡½ö¹äI¯š¢:ˆµƒ€ð#G”ˆéõ²È‹p T°ç+>n@Y1ÅGÖ3w~u­öC¸þ¨Ü !o³rºò è4_´íþ75l[ÑI¤¶©?“i0œ¿G² Se–±e!›—Rµ%L 8¡òAQm飄ÂàÈɵêå%:­qžH9›#ùⱄτ:éL>º?l&ÂÖI„ä¢8¬ÍþÆXìçV§^kåüÎÄÙ‚–‰Z¯ë«+.ÙÒ&žÂTùò=G å¯h0aÇ¢ä©èsùCéQ`©t\*‚xY`ѱy¸äeJ‹^ØR̸GéaèÈåàþµiñÍËý¥¯S±¬NvdÄHFâÂ-´í}Ù–_䪗• \Cšh¾sO#ŸóRÞ9-töÀŠk9T @=IžM’¢ t¸}‚ØbÐaÑ"Š ‡Í ç'H8í—1lا˜ ÅÏIÑéXlußܱß„ÉX7f›û*s Ö’e¶Œ þSR®7j»ðÉv+Êì÷Ëñ¥É/ƒúéW/+ù£(ðˆG¡ànÉÚ®se¢Wç4à‘7øV@b:úצz`(fú‰h›_LÒó¦þ<ŸÎÐ?PqH]"2]Ð@ïDྮp貿ˆyy›ƒßáÍ‘„+£PSI•W)dT°Gœùƒ7/àÍ6Ÿæ@K(>è´:o½:\]À±/•ØRõ¾GßF%ŸØõ^Ï$4ÊÛÛªòaTÔçÏ¡40s ýü˜]àoûü?ªC~DÍ'×–_œ'¿áùÿýÊAÏî•Ë¥½ïJåƒJ©ôxþë[üýÐ=;‡Ñß×~øÏÿý×ÿТ„6òÞL:"îyaêE/”zèAÛãYPz¦ïÎ=Ãôyî£oïw¡3”Õd·î:±9 ÒÑå5{a‹ŒšdÔ¦Ïv¶`ñ|Oõ´ Ì¡±²R5qù6ÑÝv¯$˜ÌÈÆMÞ3uÛþcê¶/IÝ6:|6ÑSh•’Q*›¥É³ÉïºíX}•ÔmÏžºíùÚ©Û.œŽûÉ©EižRâ¶ûPë ·­ÓÔ×áÇÄmÿÏ·=_™¸-,‘ÌÌölIb6Ì–L"†Ã®Uö¤•Ê•ê:‰Ù0½Ú»=5ñÙBR²g+r’íí=«ž5*‡åçÕF½þlÿ|¿\:G2œWÎ+“Õ%r’•S’}KýÙ¿Xþ Tãeù¿÷)ÿWËUQÿ/—õÿoóW¼b5Œacå ¶Q›y–Í@‚áç 6ð´¿eúZ±ÿŠ‘‡”…]î0rÏ‘;¤†Ç÷kð¦¿ázc<æÈD~Gsá <Œd‡ jÿ]»Óí7ûZñ”píýå¤Ùéšöå¤÷¡X,2x˜Â#a0°WÇt(ÐUt3ìZc:„Áì'´ËƒÉFx’‘ÒdtÇ^zæ{5ûPŽjç5C÷¼;9¨×¶ÝOâLže˜?Ò8|QæCð”8 ùp´µóád$ÃÑV&ÃY+Ž–’ ç>ip´( ÎäÀyxœ°Ú=²ß$Sßh릾IÏ{£…yoÒÓÞ¬—óY«í²ÉܣɆaëÖ”ïhL¤ÄT›’oõ9€ör~>ÄNLª¢vÿ/ú¤Š×ßNÿ«–@çCýï°T=%ô¿JéQÿû=òåêyÌö|4À=J¦;–i³>L‘é]=&{Löûf{EuÃ6Lg>¥}IŠ—8« jƒwÝÆð¢ýs»ó¶ÍŽY¹@›¸sîšdä‘']ÿvp;šû}H¡(‹%¾‡‡×bþÔzW{üêÉAß»}@ï[Þà—A6¼à6x¼Æ/ƒBJ•„æAjËåt€³Òîœ5Ò¤ˆ%”²TËið^ÿ’Ýßé­ènú€TÒàµkÝAO€L€sôYà-!`5u€;µ%ìê™ðžsúatd)•ŠÕÁ U`T [¦oX¬VL«Y¥ª)5ÑYкXE€Ä0xòèiPQJÂ)Ø»ÖÌ6IBúø†6&q »ƒ…Ê2%+ ÊöO×Ú°BL`EÆäÓ²yúÁQ&Ô¥T'цL/ÐB¢LæŽÁ¹ƒàÉQf.õC!uÔ/"Sˆa¡Áœ÷ÛTa9¼*­{ª “UOŽºÄ‘çâ9 6-çVå‘mn.é=%§ÖÉ\P@B €_-XDmN1Æ#0›!׋ðÌ ¡ËG®&µƒÜà™†iÝàðyî +mY%ù©9±Þªó˜ óÊYE<ÃÃqkDue­…uÞ @ë3oÇB\AËð>òš]žQ(§ãŒk.ä8L,šx.X>¥–ã‹¡(&0O_Òñƒ|X,­„"[=d”‹D‹?/–W–D ÏmVóêRÇ”‡”…K~<Û#Ò™§p”y”$œ›Çãð7MþØñ_°hé±Nñ£_#øªýŸƒÒaâþ—½ÃÊá£ýÿxÿË£GàÑ#ð÷¿|¼Ù_9Ÿõ}n¥Aňg'1ñdíñQ—1É R à *ãÑè; ˆ»HJ »%Ôf!Ç1 ›Xª˜w| Æà¤XÉ vå O?(ÕzÁµ&Á¡Z`ŠL„ªIg­®Í¨}?‹ã‚‚ãV›´0ø†6 NϵÅŵI„Ò‡:¥ÌRBÈ<:•ZI_vp”Z_’¦7 l+ûÜžV Ãs扺¿.äó–%,™MM¼€Š\3Õsárüöi[Ožps<ö=ª…Õ‹Œ‡´;ŠÛ¦"€Àv™¬ VÔݦ§-?‘òN¶º]@mùñÃC1È”ÀKâUE[¾8ŒïàIyÄà×BxÚ@ò@Ø9jä×÷ò1:ö#qã—2‰‘Ác8Rù\Ôs~EÅId[ ƒ$ýo¦{¾9t|n*÷¾AüÏ~"þg¿TyÜÿù6ñ?—5óe;áȃ´@¬øj V°ˆ•¬ª•ï© bÕ‡«‚Xû tÁÁï£ bÅkƒXùê V]oÛùÚP(~}îÞg{l£\bçæÈ›c’ÖJ©t¨Æ³- >Œnëâòqâ tÕR”Ï‹èŠà%xAD]ºÚm΃ڞ(j#ê}'<`í”…ºM¼ùtåærÒÄõ÷rÒåinð–(|FXÿÌþˆð ÀVœX asäˆÓ4 ´ÐHï¹~Åf€˜É‰‘AØcq\6XÛBXÀܨjÅ&)°>ý†ŽhWÖú§éPeÃäë6¥âˆü¸÷û‡Ž` ´e×ã× ÄüÇV¾Ûݳô‘-ý¥cRvïŸOI^d„¶ÐäñPé¸I0Ôeݶt$”6±L{,1` o*95µf¨s£»Õô6}ÙGKÌž]Ù}ôÑì&H! ÜÀ¼õÐ,‡?·—×>aD‹Úr\yZá£nÌÐk .zmö¦Öºhô³XsРݧ¬èYTÅcå~Äp@(ªŠ¤ TÎùÓÚŸ˜.ëÞqö“•Q›„ÿ»‹µA‡ä'"‚´jínìÄk1ݪÈ]Ü Ðÿç ì qr,P;µ×œ°ióöZŸû$ž v‹€O  |aÉ `ÕÚÅàU§§½bØÞØú˜YÎÜ6}cÎ^ÜÀsq,ŸÒo,OÇ-' Ž™×@ŠÚ›f¯Æ^NG×L9k×î©ÿ‰+å¿^Ð ý¯\)—”óŸÿs°_yÔÿ¾‰ÿï‰5qÐÙAü>|ÓèõaU@G‡ºSª¼×”tè8q®lw¤Û Üà¯Q¨n«0ÂxO¶‹ï>ÛÁ0ój2¨À^ŒéÍO"Þô¤¸‘ض•¸¼®ý¹ÓcåŒÍ6~¬¤íÖõW¬”ú‘år‹Í¼xQ®æÿz™eÖçÛ~ñâÙÚ¼d* W0¨Au¡ùÉZñÊì䘕nKåÒa©DwÑ u*$\Xð«Õ<íÕzï†Ívs€D[Y°ÞjÔÚ],+ýZsâ”eW—`#ÿÿq'æoÁþ›3¼5ï7‡òÿ  bíÿjùà°¼_ÅýxzÜÿù&O¾g»#ËÙõ¯aêŠáÑŒÿa  pÁ ž2y¿2Æv›˜âÆt ‹‡“ø`­í𠾦ñ£6B‰8Æ@ÒÒÁÎ^©X:sŠÂ1ætŸß‰Þ—&â¹ ÂDÈMÇ(bMZ|$V–ÏUdiT1¼“k«Š£ÁÂ;ÁÇ»`4rO€±TÜ»ŽþæÐÒxÙ¾`/©·6ëòˆXò¨FBgÉÒö¯)<À`…,œä1A V) Ýš#ÿ޲•Sh mÔ©1³BX4µ§Q‡Æ2ƒÈÚ§<4( ÿź0•ôÛ&è™Vk¿cok½^­=xwÙÓ7&‡”´¦ÑfÂ^7zõWP£vÚl5ïýóæ  :=;‡õµÆÀÊ4ë­Zu/zÝN¿ZŸ-P -'4ž·Á‹Ü}êò;=ÿcóôðaÈŠNšÅê!Bb’“]ÄÁDDÿ¼÷ÌpEU¾rætöÚæ0üÝB¦FÉúÐ1͘·†ÉOú‹!‡º³a„qF%Ž~LhRùhòtl8¾Â¹Dæ ´ ucg˜8”,¦!ªÍKˆë§ú]¸ó$¹[p¨þ¤˜/ˆs<5Šuçb@„©pBÃGI<¤G&¬ÅÃÉ”“75Û¼…ÉÙ±­½pñ¿ŸÆ†Qœ;–¡OgÅ‘‡ÅTìOeÚÌd››ÜÉo×.ÛøSéÿØûàÈ®êÀl9Þb^BRÙ7B]·4nIîZ­‘ìžÑ,©g¦±~èc{ÍÈOݯÕíé~¯Ý¯[Rۚʷ ¶* ĵ¡ d“PlR,ËnŒS›  1˜]²IXH±8N°¤ølPIÅÙïùÜ{ß}¯_k4öx€d¬é¾ŸsÿçžsîùÄ’‡X§  Å*9<.Òd±– 6 Z!ç‡g$!r§ïž`0û0â?œÄÒ5q€µÇ¸™2 åÔ©M4$ÞðN-h\w‘›¸„_äá»$VV—Ï­Î.Š‹èô’e­v]•¶&È/hÇ3p$®jj†´"f¢èo湤¦äÀ<#IÖjJ¥"1¯`ôD§ Ô5Y{@&Æ"`×'2Z=§ÕFc6X“d¨³I¬âm?‚dôYæïT…íTš/®Ì—V¹R¥‡±C|0EA¢È |~ƒÁfx92JƒJÊ@‘\²é²ëN³å¡Ù£.‡[’„\¡o^B£¾>I¨©k![•†æ/(0éÁv½Q˜÷ˆåÛ)ø’¶á ¡4óu ÀNÅ]¢7Õð¿66Õ.mªÝ1sïª4ºøqß.ãA:ç°ˆ4˜R„๸$†C9 Þ:5 ûˆ QŒãJÌ*ù.½}ุ$œ%¯ã*†qàM׃£n(˜}Dùm =­°§-’Ùdð’«´L¦³Lx(c¡»(hc‹” G¤;8󍣿ðØ(öcæayÜs ˜H\œ´#’þAöâå쥱áƒìAòá“Ê™˜¬B¿i⮚Sçw«Õú~šb‡´B‹Jj~ØüÅNÌÖOò`ðkh4˜0¨ë—3cÙƒƒ$ÿÊnf.^ÎÀH²ÙäÃÜ_ºr‚}+·7J’´Šj™\«h%a‰VðÉ`דʤheŽxÁ«°)\ ©Òm6{êÔ¥H0Kú|’<°=ÆÛö9µŸP÷„š¶ÌJÃKÀSsà»…ça‹Àn©*§‚'aˆòâ4̇,àážµq« zQ@ëdÄè(@ƈp• Ì^,ä"éËLBɈUÖ•õ¥IÛ~½QG´Ð¿dúHJ X½Œe×÷·°½-Ù^tCʇ žh½pùÀÝ@"àë“ãô†×.E ÌÉø0pçwðæLWaV‚¾%NRÚÔC¢h—k€¡\z¯ÒRÔvS$«ž—ñ Fk™Z2#kÍű}²} NRäºHn›Y]áL^Vb˜ñ} ÌÅó aø¬FÂ(VW6ëd*«{“;o§ÂsÄÛŒM¦,#ܤ6’Ô01°DMîþãê´$üœ8"à oÏi_+¤T/S q*å¬xK.: ]~K+ô/‡ Ð/nN¸.^Þܤë+9ü8Li‚v5™½ûर™Ù¡kastø ³²™ÃÄ4 áÆ»j»Z ~èFÕ•7]4Ìlf}3—E8VܶÆýH•^Á¤­»5®M51š±vÊetœ;#*¶_kÒW°†¸¼IšfäìPO£~Å‘Þ(‹#uéµ¥JíH/Ö¿  è§?t&„4$×àk Ý °¦5#ù[tÙMÄĶ›ïAX/<Geš“±ý:?ä Wâ„( ¸5Çʶ \ßõÌ&hF6ï”m­¤x3+õR„ˆ’z€N¯ž%µÿÍ?#j-½¯‡Äù•àz!oúéEÚÅèÉvØíDj¾Ó‹õ?‰´—c›Á…y¨éw*€ Œe¬ ­ —Sä\°.Ð|—Ç"Œ¥Nï›Ý0Pwʽ¤§¶º3 ùU¤»¸ßÒ‰ø®6ýÝrÓïù‡v Õ}¸~Ë­톽,6„ÀaÒ‹óðߊôDê³´ª0 À4ÀÜ@ ç›@BA œ‰Nõa½‰Ϭ͋ò½÷éŠR)­ï€šdò< à~ÙÃê’ÖEÉ “žêð³âI ÔbW˜c’Á¯9=¬h01ä‰ ÓL6°# ç ZgÑmSÜrt´„ÕY족*É´`Î^Sò#pu?;»¶·çqŽäTÆ€¡ˆ•qéIQ¨Ì^b”aÉ`¦Ë£Hˆª‹N‚ï¢pqݸ®Õtãô†®GøpB²ÀtF… 'J”i­^íÀ§’¡”aÕW©F„!C&Ì$@šaLiXqƒEˆ'L•$«0% 4ênßHŒÐ]Üó´å£¹!™°¥jŒ·í{0r$Bt>³/ÎÍÍé;̧}ˆ8Š"…£&›Æ‹S`\VZ<£·Ò‡«0DpF|Gëøh]ÀÛÔwX$à‡åqg½Qª¶ÎÁ·Û¬³ƒv‹{vp:Ñ7ޱD*DáIŽð`Ë!¯5¿¼–ö;½†!sÈ"+íú®C@€»ïè+{ùâåpâ"+²I¡4TVr˜˜Çä¥ÂfÖ,áÏÅéP‡‡$䢥n«îðµÖ´w€!&iK…RÞ ¤¼Ai©ã õ[\“0Ù6ë(vºà|>¦™Ê¢›ÚW‚TøˆÃ=fUOœ©ÙÂV ˜ ÄSuB7^KÏå/lÛÙîÖ2â+uf”#+y Ç6Fÿ…îѾ0_ë ,É Êg1Ê‘]¡3¬Ð<Ü™DÔ¹V××LJfŠX;)´&‘ÖEô‰O_v9¯ª'z’”//Ëà%5Çk÷¶"¨J$‡:t™bØ"}¡Ê÷3‰¥mFËN£ k-ÍçÓEÕäâQÕTpÁ6®Ö÷¥”ð•ÙõóÔ šNήO™ã?6jÃ$òc©d0ÕkDÜLðíµñÈg&Æiçs@%øc—ZL‹@Ê^[N®g”‹j®ÃB<ÖáVUˆ°‰©¶ÛøpLï"m‘„ÿ%†ÝFŸ\L´ónn¢À™~e/g+I™dÆ$n>8`)Y¶@Ùý0†³¢ NGÐG¾‡ê3ÕU$I PI£h6ÎÑš0 bá@g*‘/Á $ýv­y r!Œ‡Iõ‹:’TII9g<©eã¨W·“ê]LSGôš<‘G„NC⩺5Å~µ‡“a®‚$Ž·p-}Á»²™s„ (Øn¹|ä§ÇêL7’71Ÿž§:€'À(!y”¡™»ÿÈ ÌË÷åÉ[ñ¥_€è•Üø9þ™¿¥ÉÐ6u»N¨Rð{£b,FòÆ}½A˳Ö)Kl_ÄÈzÝíÁ‰S'm”5· ÿpÒ’,¸:+ø™›´R'ÏÜ—™˜"@gK- pvaU6¿«°’c°CÃkÑíd«w–¦Ô7Ág4Í·øõ—>‹ÄÙh™‘~üÀ«Ž4Ô:í®¼üHøÙA B rŽMÞÇPêà3ü’ÔSÜkÛ-yE¨ÃH=èYLjòxlÜHAéÙÊæykKOÕÉÍ$Ñuß©‡d³ô–Ž4Šê&”Ã?kü3Ô'f{Là¬é1¯Ð°}¾ÛSÒ§×GŸ 6±j„sOÑR%"9d6¾û¤ü‰SÔÑè™ زãùû&Ëvušà$Š˜$¡á ÃFH¼B‘˜ý²Ì›%wj ®ç¦Yoh°B.B×d98éIÞ@9iEVaའ@£ òŽ%4z—ÕµV°8…M“ôS }âY·PÔoåž‚Él’8VÕ;×ÁIê~!I@" y/uTm긫T‡„ÛòeþÝ>ØÌZ×’F„H¹ûTô‚tO/ÙÝðK&y2D½;À5¨K;’T…`#ײƒ®ºÔr{ÞõHÃÑ òä±ò(œ^ýnK}@0ø¬«Ô•å­w9ú¯‡4DoIÕÅ=RûEýeÆžG²Â&zÕ&ÎZJ Sø`±'5×ï¶%{}K!I&ÊUá_éÆ2cµvò]q7 ?éjùúÜ=¹_É« “+Rroü´;iP@eò³ ß0ÒZÃåjiŒ" …MÆÎܸÔs'Œ§W*t¢ˆoJ%A¤i5ÏP椦èÝ …üò2(')öUQÜC'„$¼´ZHcJ¯@ŒCÕ·š¥4‰ lîQì<Æìœha ( é¡/ 8’Ž¡>!¬†Ä†”+y ¢£YQ‘råéïÈèä´ãùF«.‰rìŠ|ìãy¡ÁUðÅÃËÄqRË%¤Ë*ɰŠÅ³GàzcWZøGZÙæn`™5‰Š‚§z“oeäÝ‘6w @Ëcįccré-ˆï­$¡äeg¬D[ 3 §Á}C} Ò•hxüêw‰ÛéhN'lY¼ž]K1¹4-‘‚.@@-N9'iüM.Ø./™Dpè>ãÇF …6‰õ»-ØÀ†JUïvB :ièãí(rbBäòhÅ+ËÇ8ÆþLnôÖg†UŠ²Ë—d]¤w:xCV” ]³tŽä¶,›†=Ÿ&ECQ— &TbâtÈ­¬Ûm4ŒW3‡Jxh—IÏ‘·VÎÈrê‚W*púJg «LbõUãy ú!“e é«u ±0…Ü `5´ZGѳ±ýdwáN´ë]½ëqIöêüø¢•!}"‚ñÎÝ©7¯ÛQ}4¦<]1ç Hèø… h8N‹VWúcšyß1¨°È=,Ó%é-É–¸R²m¾thŸhb Ê6”R` PÅph¬øÈKdzÇ÷ÞXiX Šü„Þ±bÃÕ¡0ö°QVmdf\^~*.Žv{8¢ŒÚÉÔ’,S€U52s€­áŸ ¢ëȶéaüçäIƒÜ». Ö!ñpŸú*v!Fqõa#¿ iCTåG§”&SG _ú /nÀ«ù©Q&‡S›¹ÔI%ð?I²þ“R¤íg‚!âŸ$B‰Z+¨È}Ì–^t4™AÌœÍ͉‘¹{:¿jÝžš”³¢É7~u#uwX¼…®dhV½¶/½|È©”Ôß4Ò2Djµû´yïAvµBñ’HÐï{Ž·‰™SâO*IÕ›|ôîzD’¶=DÚí2GÇwq _ Ù+÷¶¤¤»Š"f/Ø£@ÕiÀ1OM~’,д˜ û¨œ—[~T‰é˜r¢JXNÄ“|mYQåY‘Rƒ».™ÐQ„B\𥋮_îs€#)ÃЧˆ­Tˆ% pÞ™  ˜¸äDjøñ¨ Àb,›íO››(9ïÏ@¹y4µN¸š¼×úâ¤ëý Bâ3rk6™Dž0[åÌ!hûª?C†Šë‰k^$²*n“+Î^Ýw2×|£¨¨vbÎMôùbþFÜIñï+‘ñEòÿ ²óQÃ=v5à«€ýN¨,“¯ñòAÊãGÔ»€3µWb;E†VÚL1×<\2R*PØ6sèV$<ßZ­}“—Y¿›Í%q°lA$ûê~7¨ù±ÐÜ'Zš Õ [œ”å5f(ùQ|²à—[Ó~×UšHZ\ ÈMðæ;°\ä!–5ŠjóÇ¡µe—ËÝ&šÎaë†vW@HØ|®y(‰è¢"*GÞP¬)ìòäÖQzêMœƒ® É"½©k¥­ó/9{\°•&$ ß6ð¡Ü¨VuŒòUi¸”­ì€m¡äùYòÝìg³›¹,}ÙÜÌ¢)E‘rËbé@ kc äÒP…7ÝUü¶¸ê¨Õj2F‰äfö@¶ù~€ðs@¤·†eÓ™1]»pN5ÜG—õ©r ì ÿ¤\ÃÑØ;ôZ žéWGtÖ[æPNRÂ|ëH ¹’L1šc‘z?Ì+Ç(H“ΈÄ÷ÄÑî œ<8(©ûMi¤ç‡€4 úŽ0¬²¸%õ€ƒÌ8ÛUè㢴ÃiVš¬4PÊcø‚2Æ‚|~Ù æ™å˚Ǒ.¸Y|åݱۨ”N“¹HÒ’ †ª$¾GuŸ’@æKœJô{éìÚL‚dÒG07ñFûÚÊBD=¤Ä˜Î‹³41ë…ìKú,L Ò,…m Ó:W÷Ñ%o˜ú-ÊÉ`I¦~•&r7Ј“Ê¿.›¾åÊgPùÖ×A¼Éo †‹rÒ’‚š°Ž9Ý>ü.2¯W¬“å>¡5n€ÈWA`–\ ^ÆÍ%ËIÖQTô$_ñz„d¡«Ä—•½øÅËþ†’5–®©¬-t:rôCÆåèÔÝnè Gr’žÂ½ócéÒá(TvPuÎ º‰aÏÅÒ‡Ò~Á4‘ï, .©_ÿasñº|´$Áa!Sî1Á°9 G­’3ï»Ìõ¦•Ž3`L\Z#¡Ñë¹2"ã5/rü´ÅÞrfúœ(w$ŠÌfÐk  ñpô°?¾8{‘mÉÒÁ¯ÂeHe@!W£"¼×%½@EV‰Gš ’MGà¥À|&'#lêAЖ]C¤ É£‘‰GàÄR’‘2qâ>•ø&,²Ù“ô†3L_®›3“ØT¾ÈÃó~1]»ï–übº)—ç‹—zåFË‹'‰q‚uÂìiù×Ö!§ô2ÊŸSM—(«TFj€E{‹öì9›œM*¹F¬Ë1ß2µî‡XÙ[HÒ;â5Z¹p‡iP¾Ü ýÈEs•,‰,š\E­š¸5ušnŽŠAÜ+ÅÕEp§&‰«;î< ¿ûnñx¸]"0N*ô⪥§ÓÚçÓùz¡GÃu->hléÃÆæw¼–Z1] ¬Èc‡AîJŠKkêö­Hà¬ß ¿Bü‡8>ë6 É!´`¬M_G‰šc îRK Ý¥u3‘«éÓÊ”c×*% .ð{ Œ7çoÎñQ¸éÕ}ÍkÍè‹{“¾4 I·#‘ƒ‹êB¤}»êp Š× ÊØÙmÒ^2“ÊŠ¦&³¤ÜR¬°Æ&IN‡M»l4ND´W§¥D©¨¼F…”‡ð»üœni>Ó8Çfå;Œ¢!gñ¤2s`oâÆûž­ý+‘®2æôxm¢2C\;°0B„Á*säNMmùàÆÛvX€‹®Ýˈ©½nÛw»¬ÇQ7h–RGjsvå:ÉóŽ5¡u`‚ƒ–3Â`K'NßÓÆ(wá^ÉduÑðÛímž N&p&f–æÅC68Ë®X†i­ã´hö—çÂlá•$IG•¾½®®ß°Œ‡ É¢ÕI·¦ã´áZí¦´DwKª¾©*ª7‚ D‹o­Û„ò¥z" ÊíNtOCད1Q#ÏX ç ’ðW=ûf9•h¾Ñ™‹®ª¨Ê%N\{5•tâ:µl£Ã¸¿/–{•-Ñ‘[ Å.=U3ŠŒÈèo“çÕœ»D&«[>©­ ´,FM÷p%˜åáÊk)ÇÂH“O“T9¤‚Ê0HÌdMä­S D,„‡Ñ0ü‘b³¬eÊ—†¥Ú˜Â¿T«(ÇJDu1±?\!7³8&ýdHùºýaõMŽ–¡Õ@øFÓ•`.u SŠzǼ‹oU01póE,™«ÌuŠ9ñÝë K:ÐÒ±€ –•Uë¸ÕŽÕ3ö¥ª­:Y®Ar°½ÞBÕ)üÎ ~ÈŽ…zÍË\£y!bpŒvá1¹õ–dQkܺf•l‘¯f&„4à[2œÍÿ«!`n,k<8þk.bz’øÿéñ©é¹qäÿá·øÿ›ÿunmycu®¸8•¢ÿn•žïlù^ùŠw{ù¾}qÎŽÓQQŒ!ý˜‘ƒdÁ¹' §ãf…ÓN-£»jN +vÇŽ&! èõ•ýÜ—[¤l—T£»ΪVüh3 s¤,æÄÁ;înÎz ö;Û=@í¾òœÕßUÈÂDô5Õ—óND'z‘fÙ|¦d9èo#Rºy…ƒ[‡¨½­˜`ãì¶¡Üg„JrŒp›C„ÇfÁ'Èd6÷WtíV§=°¦ŠJWó°z¾7¸7~{w`^g¿—×°;ˆÉ#½`®:œÌrÆ*•}‰n%šÔi#ýRn¶Â0!½Òmõf>-TTá‡U ÉP"ÝtÆ&ß®w\Õ2%Àïlá­ŽQ—S;žQp®Uoæxˆ PQçÏgç‹« Ídjf³äv‚’"!’äú‘y(Éá>ÖÌœV­Ñ²[õpëõÖîTDè€ÕúX¸´<1áD½=jáíQßŨi¡Ä6xT7–½³ìáÂ:b{ÌZÖ¢k©H ×iGv:&|ú¹åÆÎÔ,kqvieö\pYHTžÁÚùT®ÑH¨4—?6Ççãø|Ççûq<í¢ü@ÔŸ„úó‘]ÓÒÆY˜A½?Û¸òƒo‡ÁY[Då\ù¸Ë#ßwyäE“Ì…èßõdÈ«"òq×K~àõ’|iä½4òƒ/üá—F~ð¥‘?ìÒÈriä¹4ò‡\ù˜ë!ß=„W ãƯ’¼8òýG4©³EaÃàôíFA¨¬zkrpÖTVì102¶ÊþnhÀ~Üœ_ŸhÑ-1¢½ÑÀ|å£Ì,)ØîþÎÇ^šù¸K3‡h!QIYÂ×]9ùx!vä‚Âë2ãúâBN­uš´ÊɃ1k´âr®_£ðÂ(6 ‘l´ÏFa…Pm”l£õL|{HžÜO1% ¬i6ŒwËdÌÛ_B#ߘv ÿFÓ™†ˆI´fQ4< Û€Û‡‹£Í…Ðq43Œ‘#ûprl¾F˱¹õÆæÈ76;À¿ñÙÇfX8š-qt2â§(„#$>î«‚¹?ÑÄÉ}€L¬|HæT\æ E΃«8Oñ8:¶TOÇ55UÇ–躯1…±£ iGÓ5 éGÀÍÌ8Ä—ÁâXÒ²VæÏÆáñV¥ƒÆ)u0T$ÀâqxX…‡A!‚ xPÇå™MÄ£ïÁYr·õ0w¸ïaÜ}H£î¾s÷·Iˆ;’Lø5:W!¼©ÅÛá„Ðv¤¦BÛ‘äÖŽä…‘v¸©>œ—­Qv\¦ÆØq™ÂŽË ðul®F×q¹¶ŽäJd™ƒØ‰ ¡êh£ê¾TÀÔÑ…cêpwˆzpÞTLÞ€ƒÅÒ+Æ›xW(‚¢cÚˆ¡ãÊJmIáçHºBÏ‘d…!Y;(ƒ¡¤e­Í.®,#¢n8ø°QBB½Xá§)‚S Ââ,ªv-©)Ö±¾ûô?ÂRÝè÷Ÿñ‰‰S‘÷ŸiH¼õþs3>™Í„•Y?/fW‹k[kÅõ­µå¹û៹女¥s«Å­¹Ù……3³s÷‹¼HL‰³Î¶˜ÏMA­µóbiv±h]{ӈʹXs(¤ÑîÄe uYŒ@®]XZ^Y+­Y·jeΈ!å#æËO[™•ÌèôZNÅ©¢ž‹ãNtÙ¼n{tDgAß:b³Z’ß«•ÍêJÊGý`CPÛ½¾Šä1y ªvG#¡ÕGÕ0(óÚSÈ£@Ç ®ÓÀnȯ×îÉÀ™!(òûµÁ:ˆr™ œË"ÝÀpk¾•©Öi9ç‹ks«¥•õÒòf]Ý®[¦•‡!£&Y¸#Jl§ŽžÐšPãfO=RB³ô848Ò{ÚvÈ*mHWðrßÕltiêj¬[L®‰,éä¢næ{кÍSvÆᩃN(ð’5tÏlWÔ+ŽÝ wy‹œ^(Où*J©l[Ñ$Ò³©ê¸Òhî±jhˆ© )3\Çb¦”YÏÈ8ÊìU¬îRm»÷P§NN1ÄYÅÔ;=ìš¿ÈÓz²±G2IhÂå4*ËrŠlµ;ÚÔ°-³ê‡ŠvQO Nõ`†»Ro½[ïØÛõvÊ«Re6 UMGVU{óÑË–ÀÀN>o-ÕOÀÇŒþüêèÕn㊫}¨ˆÙsE¸?ÖÖÏ\˜Ÿ_EâubR¼¾ÛèÑ’¯!œ‡äj‰BW’bËœ9¦hPf¤)£stË!uC~§3Cc=Œ®DZ†ô ÊËŽÕLk8®ÙãªÝ¬7z”Ò?Ð>¢aEÆ>K=®ãÖ=3KÓu¹hþ US‘¼è|!-‡'TŽØª£(YG¡us¦´ªÉÎŒEñ¤í6TC·hI-´Úßa,¤XÏÈæØC*öpú¶{ô5,kñ5=‰çzzbrb:?>Aþ?¦§nÿ›âÿ£^u‘3ÝÚš#êéÌFia~ë¼5‰è¸!šnYÙ1CX427*Ð÷^Ió¶[fi ®Ímhl²<¶ÄüÿEI†ú¤BèÈ‚¡k …Ø ¹ÐuÊ„TÝë EÇv=¡ˆ4a]‡@èaB(G!œ°<èÅÊ‚°CG‰±,mÕ™—øA8&ü槸&Î.¯ ýL*æfWfÏ,ÅÚ…µõââZôùŒÁ܈ÞœìƒÈðkš?ò¨-yôl ¹Lžaÿ»IV;|ðpÎpæ+û% KÚÏé•~°ÂmEzF²éÊpÐnº \`?®ðö½¦ÃÝR^ºÉU¯ Ÿ'c@ÂéT=A(dˆ¾ ;,RÒÒüR¤#{dºGMʵT ¢Öé´ Ùl=GÖìýýŒïd±@Y,ÚaY”•C¡÷JÈ›fÒ¯‘;vMN}ð{Ím¯áË7AÜÍIzå¸ç„>“t$ÛÇôÍÇT²¨ì=ˆ‚Ýò.î |"fÁW%ÚÙc¯"ôk›¢|·¥k>êxän§u7’RŒÙ¹G¥«,ÒŠ¶c£R­" Ê 0[- §ºÝu5¿¼„²5t*’*&>Ò8§€ÃG¡ÁeP õ“C¾(¨ HÄØ¥A{—8M‰ÂÔ0ôN%N_w‚$8´};Æ£®ŠbFÛP» ŽN ò¯(öR¾½Çn8Ò™/ž--•P!–ÏŠõóÅ5Ä/‹g–ÖÄÚùY`FaSˆõÙû‹beav8Ò¥ ž/6*.@щt€N@2‰õ +Åå³[,¬Zž»¡¸´µn ùæœ8¤”´^\]š]¥%ør§­¸¾^Z:w­«ayiá ¾`‚"ÇJέŒ€§ ÇÒPÖ1Ö)_͈›é«™¸nÏŸè”[õœ:RS Õ záÐ2g¿ã´QÜÍTƒeÐP× ¶ËÊÆÂÂÖƒkës+¥¤-ͽԗ‰^$¨òƒ¥¥üÄÖBqvikvi~k¾X^’¦òy¥ŒzŒ‘¶¨øIFý„‰¾t=êÓæ¾¹33Å•Ei«#æ6‡µØIåã5ºpÃ<`Ĭr£†,UÖ9ÈŽ Zõ"4êG$nÔqâ'¢²«ê¾ÄZ ÇÝêô÷(/"Ôy Œæ°®Èïˆê­ð0$®†‘©hZŠ0lñ:ùÃí¦ðÿù‰©é¨ÿÏéé[úŸß!ýfésù–þ–¢Ç-Eï>EÒ`÷•u ’ó"‘›V*Êù¨Ž‡Æk¨ßÎ+ªN–Vv'±øwJ¿Ü3Õ/ÃÁo×]äðmæúô>X㩉±pFPY®¦BEü6, +CTüÎèÉzÚ#Æg@ÆK9„#®—„UЖҰ¹ Gž§(™ö.p¿b³ZÒ}£Çwý|lôy4Pµ•óç‡Ôê.iŠŸd·+4–¹mh 9‚ tá\´G3æ7C¯‡›Õ3vuÔ£%³ o^&äÓ´’Ö™Àê³giSÐQ“ß•Åzpæ-æDSæóŠoö²qXˆPëÁ;)mx2{“¬dËÆPVÝÕ•aéT¶ƒ¦ð‹ÙMŠÖ‡îx¨ÃA˜AÎìöIy¦TŸ9X©ãzÝ‚¦€©1õ¬‘üºþàˆ®r2R"7qo_êÔèaúÀágMm^«ÿÛjO7à”FO¢,øì¶@á·J*ÍDèém ÄÈxX 8zÝzšz¹í3µ—›þ›œžÈóûO>7='ýßé©[þßnÊçøÊüYXýIëø3_{˯['Ä8†T³NÊ.8î\'S²š=[o ~Wö, ¼æ²WqNŸ¶ÐÎÏnZûïúè…Ϲ_øø\ý̃“o}Ó¯ÝñÀ›žý`röûÞò¾ÿùÈ_\Lõ~âç’ã#¿Î½ç|:û×}ÈþæèóϬwŸì=yêÉ“ùw~xüÀ~ò÷¾òéßZÛx߯¾¹ôªÜ7Þûü«¾~÷ð¯?þžw½½’¾þ_œû_÷æÝ/~ݺãoþæ-öíùÿö‡o~æßü«‡>ýÃd:÷óïÿò'~ïK·?÷™OýÙ‡îþ•ÒÕçž~ê½?úÂ+Þô~åîý¿çÿê›?m_}ûOV.ýÌGó™êï_åzûŸæÙ;ŸûÌ…õ㽞øÖø{ÿ°SøVêsïþ¡W¿öK·O¾báÏ¿~òÛ_þʳ•êêø?½âkÕ¿<öÊ×|àêÇÞqûWlâÉÍSŸø/÷~ì[‹›ÿý5_ùþ·ýöGîýÕ/¼pòßÿn©ù©¡üǾñ÷ýÈ¿þÁ{Š·?÷Ñ/ü‹Ë'ÿdbþ ¯ý…O½ú¿ðÚÓÿõs_.n<ñÂ[‹o[/½ýî½âŸU¹úW>¹ðîáØû©dÿöç.ûÄÈŸœv¿’˜?õîzÿ‡ßñ*ÿ·²‹[¿ÿhï©ÍÔ/ÞÖþ±ÌWîüê o­¼áÏüÔßO½çnû ¿ù ÷…±½/þòâÏ={gé_øHâë¿ô±wܵûï_|ó™Ûþü7j³¯üMçößßk?gñù|øÙƒ§?1]xæsϾëîÚs¯þÍòßþäs_{Móñ“þ‡žýìÊ;?œ_úåËÿÛùË{ÛwÕîxí/~ý‡N`çâÆ§ßðÕ÷zŸ­]úÑg>zém·­>WÿüSöì뮾çÒ~ŸõôÓ•ß¹òo¿=^ºçà+½ŸüÌCÿdòö{ªw|ÿgs?îÎfñwïðÿég¿uÏøŸzä/lýÑ'ÿïƒ?±óš§ÿàïïüü¹Ï–ßù³¿´ô§÷ÿÚ§žÿæ{ô©7n^þAçßÝŸ(?õ/ãoû™ÛþÏS?û§—rãýOÒžü‹÷üÕ;îýïþÏøÒûÄ…OÿöÞ.®eÙÆ Npgpgpwww·A‚» ‚ ¸;$¸HàÁÝ ð $Ù;[Î=çÞwî{ß{¿K23k­îê®®ê®êîµÖ¿\E*—íûQ¤QÚP}´A”c¢×}Û‚kx±®êó3Š{ÄSÄS!–ÐM^žKNm[ºÞǾ±XDí©—#4Jg1¨µpN$ Ÿ‚¶±ÛÞº3_TNÂòh#Ê$ þHf¶;Ø3·ñE@­ÒFa4#Q£òË帧P€>Y™ JßÔ2>hÒ®ä±oáb¦DRÂ0ÕܶM†Ez{²¹ßƒÇ‘lU¸…|þpPPdBiÕ?0l%3¦–tˆÔ[îBêРL’ØtÕ}Ì\šâ@4:jÁd¡Ó§©çGVÀ¹èYz°O GkMšØ çbƒhýŒöÈI…üæÉ1}´Z7üp(*­çµ‘HïüZà¸=»Ò.×!¹7rÁKl«a™µ#2{ÔO¸4IñY¬Q¢'“êÙÁëM‡· : ]a°¨®Ø•u!6²ñEI˜¼ÜYrý¥.À¼Mó‚/Щî®>°×Š Z4ÚõBqŠoß´Àô©ç=æÞ?~ÛØ„š0¿-|°Ç8ÎoÙ§IÖulZIX«µC©o¿•4cú‚6‰‰´´RP¨îZZty_$Jxñ—TÉËP\ð«ö&fïuÎÆceÙúç­}ì¯%"ë3Á¡àx†±JWàrO÷%Ð}5Øíµ£(ß䚀DeŠzY;lñɉ4¶…yM‚ѹN”¸1ۨìÏT.ùâá$J ™æ§:WÃëBá×­"5á©OÍf5²'¹NœŠ?ÐGXÍâF±‰¶R^¤Ö;`™‰-}̱O:2/Ž7™OQQV'ßK’..UJ}Ë„¶N´ÙJ®yÎâÇÞ¡Qf7 OÑ: ½œŒµ8¥êì?xº`‹`hãöbnŠ—òäÅœ†‚€bsåfP‚TqJ‹=û"‰Y-„È[sôXAä–~ ÃV`È[¸<µ£Q/ˆ!„ H®Æ0%íËLA{I¸q£\¯¼©avñ5· ˳Ñ]^$æHˆ …=è¥ËzÓäSWø¤ xØ1®áÉáûâ£d—Br<Íüü4äŽÎ̼›†ÛyúÔ5#› €H ÌŸéøÅËRʆÏ £el7nˆÌ½ó CMuÊk¡†:BÏb\†³Z–ËÒÃÜ'W9–9žÅ˜É7LN½’íŸe=•CïŒÁßeô¢Ô Xl…?6m7¼ .Žæ ªƒëƒsé)IèÙÀþp¸åcc©>J:ñ>¹Ô+|l`d^Cñš$ÞžW“)»“ä¹Õé53 ×+ÂgK8žÐ[Žg2-<,òÞ¥Ëʉ©1§q¯U<¼Âì‘§Â:Þ¯›Uëe3ݰ £Ñv‰™I°g˜ç>îÛŸÉ}: £˜+ÜCˆeK7m=n|âÍNܨÝÚ¢a¼ÉX”ÜÚ±ÈYö€Œ£wã )¹”oÿ°ÈÇñ.¼¸èC@5Ýõ<j>¬Á%"pÃgå5~äò&èÊiùÓ¢‘›ia)ß˯m”[9ô¨“ÓŒ#1+Ì#8夽pA¯Úo¯´Ò¡ûùJø²å¦pž„5@jGbô–Ûc„©öu Ç |aÚ{­‡Û@<~²(„w]Jñº˜õ-¶‰ñ‹#EýpZ{{^t‰¨ tyè~Úµu…¦)€T”åÁ¼Æ‚D1µ$„=+Þè‰ð>Çø]ã €\§œG»^ ½ªÈ‚æú0ê­ËràQE«Ý[bù‹cÁ/ïöY|T¸óÎuÃ!U¿f ýö@~%ˆsÌ`38ÁL¼äÝ‘»‹RÔ´Dà â9×»rÖ€ÃóUîb Z¯¡sc"è&VŽ8 9sBD+Jâ—ˆÇÀiÉèñ5j â¬v$Ò=΋ܾ€‡hI–›Œy•>ŒŠ¯ h«Z‰h™½pfÅVÔl½‰?¾ý¸]Ÿ|£Û2D˜Ì-X•H}&NprMb£VÞa•ŸøxŃT²fN F® ÛÁ u)ße™Ÿ¹¦F®¬%!qòÑ^Ç3<ûZaîQõF›sMÏ/Ó¤ÏÑÔûC_HíBAE¦[>S§;€K fGK¥†tyøºífÎzüù”'í²x7Víi߈Ûo§é@?f¦à£»Ù,×Y-7 ÇÏk¿Ït5¼@@S+Pñî=1G/€> 8™“—ÀÃÁfˆTst»»ÑËÎår·¤g¿›ƒ/ƒ¾‡%v¢ââh®rÓ‚'Ô ÈË L'éå&­~OÊÊñDÊLÎÊyžAÅïË/Ä»ôƒ?ößøÜ3¸çД·±pè#~/Ï.Áý®È_HYÿØ4pS7S;G«ŸEüà^äfz“ƒåOusÿI6¿5¨¬¢`úYÓ/RTã¾§Sû…_Vj¬lˆ¬l÷k 5VDV–ï‡<ˆ<¢aûFÌÔt'/ ¤˜¦„¨"ƒÆÝÃóL²à¶Ø˜ß RôýÉGë}£¾³{—–ô]Äñ»}5^n ‚écVV ¶…›µ«>€“åŽ Žß¾Y~\»ûÇÆÍóóñ÷þóƒæN»àuƒ¸@QW›ßÎÕÝÍîîâÜsÃúKÛXþ¦m2r22:Ú?Ú&æhgñ—–±þã–±³ýmËÙ8YþÔ0ÿìì÷Ÿï×¾ç¸ÿFükÞŸÿ8¹ûçâfcpqqßÿþ<¾KçKê§dî®ñ‚eyŸ‡›‘ëžý»3NN®?P³XþPÊY~ÑËÍwÍÜ]»;û®•ß´¾rGs÷ûâ^Kw­üžò_ÐÏß(IOLZG]ù‡’Ôïžú“–xÿE%q³ÿEIVÐÝç§r+é^ÿÂçN0?…ôGµýþJîÄóS÷uÞ«ï.…|ô#å‡Xïèî•Ný³òXþ¤º{¥±üñ÷g§ûÉÝïGwçG âw¥ÿä…í÷”ïçÇñÏaú³mÿï^ù÷¼ÿã<ÿ¬ p)\¿rëwÿ£±Íûg›ù³›Ýu¢Ø%lîöƒA`¢ÈÎ tvwt}¿ëÄÊÁ´´ZÚ!Þu{wWÃ_êcÿS}ì÷§J¦ö h;ÅÀnìå˜Xy¼ì.^vûÝ+W°)eeûI ¨«ù¯§€Ý”©“ èþöàýé]Ewi`jDà÷BE¬ìÀ¨î²×pƒs)~Iußßïz1"PçG!`º»ö˜´@S 9´Ú€.@W Ý=‡wá§Ø¬\r\¿7üû®Ô¯›RˆÔøÏ],V6^6!¡ßö«@‰6NêšX½+¶ig…rìÍX%}óø´å ÄõŒj= cX/´`ÔÓ˜9äS ¨‡³ZíÚtÓ¨™lÒÎ&$õÒ ì A *ñOPó"M‰`%L¦€<>Ù'ç«âáãøV‡áì;¾;ßFooT(yDUÝ”œë5㞣˖}–eÌcS}$ŠqJŽTB7™ím×eÓ¿„4+Ï–cÁÌèƒ#þJåK%Û;jïÊ–ö–92šrë¯[ƒÚßÒûšEç(\בÏ2:”T%!žHUK1`bÁ¾Ÿ`çÈ0c÷ÃÀÏÀ=xÚý\.²ÄèӨȭ£ú&¾®Ÿx¾õ›&¹'€Ðt:)Šæ>K †„ðMŠZ<]¶uiqÎÝ|Ê8·Øúhw~oè/ê¨'¥. i‚ñ4ÅK+ÃÏTQœ¸´›Þ[ÛA¥¾°F©ƒBOë63"„&[V±÷¼8;€ýÒ’r>c’ÙÕ68k=:ý‰£Ô*S”á]'°ËæOÙ; åâŒ0[¨ê϶êh4#DÐ:´&„œÛÐçWn1Z»И±˜ŒGcDøG‘BçiÙJŸ!d™hTû|o ±Hð•»…öÑ‚µÆÌY/Ò¿qa˜„wÅAbÓi÷ÕóPb`[ÔcŸÐ˜Vve–só¹¢´M¥ÎìC3âp”ž&³EaKg[²í˺' ªÅãÇ:<£Úv6ðsBЖ} ò,:ç÷c²_DÌÊöÄ£‡‹Å8m”öwîÁôe^_OLó GéÉû|þŽÒß ÑJ™ÙÂV‘¯³ ””¾¸‡³]ôFiG ´|¸ä¸ì°fõo¥4@°˜%‘6ʵøbÅ”ïžV`D£*ÇÒÁ'r^0ö¡Pp‚Ϭ†S~#?:w ׃_^ùÒ!¤E{ÕC+LpEÚìuÜWŒo%Ù{(²ÀÍøô^»ÉüM– ¹ôË’–€ÏþM56<ïöÅÂÄ–4qž#ê..v bk"îº5ÂÆ¬û¥b‡ö!7u>?K‹úPYÿ¹õÓöé‹x`ñ¹ÓÐvÏ‘âh¬Nx9ONYIüúºœóä#ª3ã0j‡ !Pɹ}ðšcØ7ûƒ5†5W¯[q‚/&]õm[ÞéÇ»ïÏY‚é«/<ö*/pÂrH´SÌ`ôHÆæöÙVëö+ä,K¿töf"Ëç;œœ6›õ ñ¡ÈÆLMÚÇM_q¼;q§’@a1É01Ô™ôäZöýÊ&L|F(ëæ›¾fpxvJ]‹aBÜý £OÞ4¸ÜdÊ]•×Þx…èn–¸jÓY ] kåØÀ7Äs=°^=‡üÀHR‡Ó‰ùæóKí‹{êyaÍè¤-‡‡½Z‡>{CÛØ<8ÆM™t½FüËb‰•õ_ô,?sýéWØXؼಸx¸~:ö_œ ל x¦ø»S“þ¯ÂÊÅõº.ö_ÜŠ(P (”Je€²@ "P ¨ T‚}8P¨ ÔêõÀÎç> •«-Ø ÝÇÚZ€½‘Ðê"Êì—lÀžÉäê vOîöfww)­€Ž@' ÓÝrÐdéöýèÞqÀ¥9ZÜ{²ûGºnÀ»…  ;ðîa1WsGПœÜŸWNÜÿ'ÇÁÆÃõ‹“s×FÐPŸib¥ÜÉ L^T‡´ïĬvŸ¶Ý7€—x‡à #±ÍŠŒ€@€^ô1ŽþA‚Ìr1É:T칆y¾Å†™³‹½ƒ6¿Æ+'Ïe=Gø¶£¥úeŸ}‹ÊMßÛÛ[¿Û¯¦QÕàDqä°PiÕÌJg™ gö™±Ö³VC"^…Ï„ ÁóT%v­ÚÍxiŸ¯B§ò;dŠ¾Ò­–NhŒPßúÐy‚<ªŒz€–ñÆi-ï¶í¸4(|ú,áö$¦Ø±Bxœ`ñŽ:J]ÝLÿ¦3©D!rÇßY® oÒ¸µÇµq'kÏÔrà¶M½;a˜œÔùSòE»þ$¾ÿ þrOé£ÈϱK„èÙ¯Œ½VWs7»ö¹³täQ­1´=0C­NùDQßm`FZó‰zû!|Dp7™™sªŽ †P·YgŠŽ˜U2ÆB¨Û¥3vV´à‘‘ý!R°›~BL„C=Ò&„5sVâ[ÉCÔî ºDãÏÝæÓdZ'XÅtsêË5¸Õîv›¯fÖ˜{CÕ»/‚wädiŽ6y%j{¾Òƽ=¥¨ê•“­Å§ µ¼ïùüö?îg¬=^º€ÇMDM)û@7©¬ô†ûúý3 v1+ƒ`½”H“teÖlB]LÂ!7.’°Éøˆñבʹï¦q9„¬s_Ä¥öûµ ùŒA<â‹ÎW„v`yn;W ÿB¤Œ+ùyàcw#^ª ¯²éPÛc/M×ô5úœM™¡(6\¢NQ2P¬:æìŠzµi 8¡±`6£r¢l¿JÀv&ÍoÃ/ÐÔT/‰,C/a¤¦²¶•dÉ&Zl EC7+eènhXYú¾ÂVÃØu ’žò½óÓ Ê«‘¹‚Ánµ±®VÁCD]'^í<ÝO'/Z?7 ­2ÀëÆ|u„âÆ(dv•ì—e>û‡f´çN* øú#TnçbÔ˜7c%)J$Ãom;ª«¾ÂZ΋uõ¾æó™u5ýºÆÆU4¶&aÞE't4ã+/ßšØÝWª°Ú™´åΞí^Û²fÐ3'ÆTÌGÑ$é;)Ž%CùÌö‰¢ÏøÃ:Ý—çÉâ»ìu*8uÙ_üm&««mŸÈèŒAi¿¢ùF3F‹®iF E”O’ Ù_ +³©62e®„?=¬Tä„náË)ÝIoĘP›&s” ñß%äæHa\©`<_4ÌÚ¼Ü{ÂwjŽxïl˜õ¨¨z9@|DÃ?øM¸±8”µÚuñÅÿvó…Z<[³²Ô­Ðxêî“u!/ùŽˆý7]¥âÇMdíœ LÕŽì °c1Ó ,¬'†–®2ת"¹"hL"¦´È>¹¼,P|‹¼‘M2¸ØÆ,å+ŠS1r¸ ³Dý¿´?ýh¾÷k3ÑJ|[KDôŒ; tùEöL6`h1›±é*†¼6v ˆòý¸dhîYݳM©¢l¸÷õp~âQ¥ïG¢‘ì!wÑú¨ÜWn(õªÞ*=š†}îFÀMTɇK>@KÊ,ΆÜkRNQ«‚Wå‹3Òp&rä"øÊZIk¶h¯‘hǦ7?ÖÛÞô»Wû•"i'¡Ú-Š:rXþܬ,ìî“~£‰„r„B;5ŒbY´2º³Ã {¦S诣4öGž0œåseŸºÇò_¼†À®²æaÇ7á>ééì2ìpHw*¼ ò¾Ð¢CpÍ& |˜¡ápŒZÊ#J„Àc…™ã1xªÉ€/6?¯ïJù°h°‰Ž),-.Š?·¢Â§™‡¶pa‰g÷zÄÝÊI¹Š½ÆhÍ?„Â’O$ý%ü ]S8Ñ>Ñ^e¥êÖô‰þDâäû•eï=3Gk•'ÝG%«øó‰¢YÌã ㉊†q¤‘ÐÁ(HYV¦É§5-Aµ–]¤kâ#ý”òÇOå±rð°´65¨g@{”zÕ®G{™Á¦o$ŸòMвa'&´ ~*gô§×›©´­,+ƒÕÌiim¨ãИƒ-!­Š ö°îÈ1ñÕ~ÄÿJ%Yé¤4µpª›[v+úaÒãç¤7– Á†·H„¼”Îú‹š¬k¯QÕlÌw!›}i/G&—FáÎ|lìªÈ‘šŠéÓáa>-Ú>sBÒêD¢`Ü $Óš'T5¾ßä(‘¦“’x4’ŽÌ힄ߖ×(ÝŒ-Š…(-‡§¤•ÁMà°p$Ç-ÇbÑáÑ7%í‚í/ÙÄ6:¼9½÷îÔÑRŒj€r0ØKÿ Â/ÔÖƒõÈòÕøé2¿MFÿ¾UKØn¢$4^Þꊪœw•ÆË) •’p¹zÉÀ§ýöø˜oS¬¹{rKZÐ=¡ 6‹óEWbtÓFŒ·ŽÈÃÓ†ZßcÝ[ ¢^¾6”–É@íâšâÓMô±cËD¢î F$úBˆà}dÈw– òn÷àY‰ó c¯IE6þâ çYÒjK xÃÑȳ€kïº!þToŠOå5m¯lH©dzʺ„K#K´!Yë¹6¶5g× ÊøØCÝ%¾&'Þ ÿ!=õ¥J×lƒÔ¹±y”¶ÌŒPœ^…eA)¯`fZZ툯šÑ¢¶ý;é½q˜fލg‘3„–æ¦g"J­Vqß?× ¢˜µá騹v+´i‚I„)fñùÃCº tÙbÔ7ÞÞ³<—°o˜›4=PuD=Õoɾn«l™iŒêf$E2üðÌh¨Bœm¶íž™Ü¬(E“fëRº5,¼|‡&gp"°}„a0 XºŸ5óošq´V¨6‡ÕwŽÊp’ŠÃr-VË`7—,…v-‰ÃsÕîzò Ñ3 TÐÚBH>4 YZkli#Ð#qBH¨’ ¿(†[X€«:àyá=”µ3 ÷ X¸yêzqe‹´Ýã#Ü Ë¦ˆk4 {[iÕ«ªoïΰÑÓxáe°,¢Ä‚°àm(¯ÞÁ… –è¨çô­XìdÉû?¯¼Ž3#—y`·âÄBxiÎ@6ˆF{Ü8ûùÆ2áiJÞ³g TÈϸ¿Mô˜™G Nšq¡ª qb¥%V©j†¨YóãófL`…QeépÇ|öZsÄõAɧxb¸é$î»Å9ô&ç3ª#ñM<Ü;Ø9¹Põ²!œMúo-mf⻹g¥3uº¡*jG6 ×U3¶ªž“ª¯ãAF¦›¥T†Oö l?DAáÞsšwÆ8H…mPÝ%\f±å¡•ë´‡ìu‘FUiÀSkjW×GÔt}†8äCHñ¬Må áM#…©™b$ÛWÕ•;2Aëdºaö¤¼ÐP Hý éó>…Ú mÍb cV=mm§qw"® UO‡—Å]Σ֥™,Zcۙןæ_›$x’¾fü飅¥rE®*åq4 b¸ë¸^ M·Ác‰·ù}„þObLÉrP:äØœÇ¿jËŠˆ"úNÆbJäBÙKѽ÷-Û¯båFå“ý¹JÒN+ËÞù¼ùci¬EY1ÏhI[{ÿyókŒÇŠ¢#éÖ(¤KÏŽ’86µì íôe댴¼dñii´Å&¬®áìSúíõCs•Ïä‡7­d5ô!™Uð÷M«Œh?zÔ·ÎC®†1Ý쿦Îüœôó;D k÷ ‰ÅØz0ɎѤ«Ã}Iþöpn§”µ€'Á=èh¡Ò$XVPg{‹±†Üt¹5ðØÝÄZ 6 Ñ²žºí%§-·ÒÈá­¢ÈçªoW_¡/zÕ_ôÂÚûîFóFæ†Oà>&˜¶äÔÚ­Û*`fñEF~qt’/½EcôFÈã¸b53Ó­=:zÑ—Ρ(4­ÕÒ‰àŠãXrwjt|þ Ö"®+TóݬòüÀ°pé;ÿš‹K\a]“¯‰Í² £kJ.³¡•ÏYaŸ‚÷g1E-õP±4CQhñÎZ ímf<<Ýñ”‚Ùñž†nôÅÆ®)1Ú•Ïš…ç-¿2©Á4NíÿJŒŒæ7Ëa°ñV¥j8Ü[6˜Þ0¿¡¬¬ªCy‘ôŠbçp$Jq£Dƒã¨¶1>\eð²K²op9í« ¶’~ú Ì%]ÏxVi}IÑêµJŒv(î: 6å9+Ehg_IJÄ>¾üË÷ô£ê´žLê[º_o‹÷¾h}¯³onC‹/ióŽž×ÃEÎÇaã%Ši¿&žÿ×zÂñgÏÍ}î"Nü :^l˜–«ÐÇyÜ æ, Pé+‹•Âî’‚(ý%UCsΜö¡¾ô¥—5¾¼GÆY]ø±¤G‡sšÑfÐ,Ò:x¿~î¸Yè ®9Ç|õJÖb^rÎÏÖ¨ÞÏh F[›~àM^*ßs£ì鲨ò°¢^Äÿab ²¸1È0ÈM‡4=ûþ££Ç¬ÅŽN@ðઠƒ¯ÙŽ/üuAwìc:· ‰eøFŠ^ï‡Ú¹ü¤B Y\õû—HÞÅMFAAâ£2¯Æ°\˜Ì$¼ÄoР<ů»®b;l—É9¹zlWȺZ¬<‰x-Ü"« Íô ×%n¦5Én¿ë¯Mè $I4ëõÁU©¹Ê)¨~@œqŒáý -(«É”ôBÁ¿H`IT_Ý0@²°’c~ç‹'†K]‰Hƽ÷,2­C€#–{·÷Ñ'‰¶®/Èã‰\VMaÎa¶¼çV®Ó&šoÌåÙ©Tº½c^®½|G¹ñlz>cœÕC3O7?n8L›zzò&²tb¶D3Y<¢ùÉÖAvæ’[Ï Á‰%é{I:›Ñš§='7È9üµ„+FœY¬¼"mÆð—«¡-ã—i…ƒ^>½‹íŠƒÃþ–z³·›ø þ!4ÒK5³c—'¼ÃX΋oœñEHο:ï Ù„P2z˜¥0—½2¨c9?¸‹c[ª”k×Oáéu°– .e$—2ÊÅOšiJ~Î#¯Lo!¨U@â£OOM0_WŸ¹÷¼þ©„®îº¡¨9ß ^¹æ£ÎÝ$RPT‹Æ÷㨇ìòs…®„‚ªÜCirRÐÜRû}½3K •£¿6dÁOª³úz †Ê«Áðnzæee$Š=õ|)½HD²^ÍÉÌ×ZIïŽ=ÀÅgqߘ` £pÎn}û†Oäeü¢¨s6`0#?Ö¡èS4“¡¶€\Æ­Wûh¼wøF+wÃä ÚÚüéUŸõ¬øËM®®ÜhB$áªÑ;‹B‡.³1+ÙÍsÖÔV#ÉÙ4£o²Záç X….Wr\‰nÓ}ÛcmÍŠª¬Ci´¢ßTÞß«Ó3ejíoZpN¹iÔÏ| ¯W! Á}rîȆt¸ý×m)ÞqWêܪûm[Š•ÀÃÅàâáù¹-õë®Ïv¥xþ°+õïu°²ñþÝ®ÔßlDI¥ï7£äþÁv”)Ðì~ÊÎÑá—½¨{n€–÷wƒl<@@K; ¥£» Ð h ´öv²9m€¶@; ý÷ÛDwûT6  #ÐüýïRý~Ãéû†ÈÞæ{õ® p¹®6^ÚÄrótüÓFÐèôú}@.ŽØÕúó½}žÿÊ®'믻Z~º:ê3 B¬›ØÈ”f˜ü%ö•µ8ÕFÒªãTEU¶½Qñe â>"lj²„xkl‹:•‘¼×“×+m8_kØš_ðóJ÷]áïh_øºÜ¶-$d’];:o{½{ënbÂ5ÉÌ:ÈÀÆÅáýBú±SÆé×wI˜Áz,Ñ>‰*‹ÝåÚ8©ï`jíøpi«ó‰¶Åfˆžõ›Ø¡D,‘dÇÅcá“Ä×|jë":^®‘è¶¹¼Ÿ%ÿm«ãäàepX3» ¯K=™kJ‚ޝ&+íG*&iÿ$Ò:(ÖJ’»VÊÚ!{ÛòÄ4uºÉþ³ÿ¦'åÂòó~wåùå/&¢ú=Ÿ¯;1áÅКå½$||$Ic>Ç,}úœðU©íå…Êk;ï±Íò™ ïãb;§Ìxg\è¾ð®½\&Gfá¯$g͆0õŸx›™†Weuü=¯ÿôÂlEØŽ¿ù¤× zK¢Z?è [Ëìõ+ÍY;´¸…¨ÊwÓ¦³Ò³þCøü¼¦H,é1œ&ì¯tì¸pÂçÌMô_5§[ÆwͦBoG°² ö¼Û6çß…2áÒ¡= $³0xÑ`:/»ÍfÙÁ¯ºáplÊGa"GŠtÂÊvÚ9rÒJ™±aâT“A’Eè6h¼Rù(ÿ Ø“³WÛ )•ê,œYS—ø ‹Õ«¥èœ0:Ýóq-_E¬^›þx”âݧŸFS°ËGX‚Ï™­­÷ÇñÖÚ [{CÄö³Ò`8‡JUɘCY˜çÎfÇr„Ì&H‘žWª€ žjz‡ZÓc:r'Ã3ÿ†1ÛÉ"v+u3i³€?w9ν??ØOéÙ_Mâây}¦âü1àLJ§ö2´Ëú¹e% Oën «æ—ùIç+¤ô½v)Q¯Ç¹?’vÖ*Ì¿i͘@¯ âÉðX÷’s“’9#¹”GÔ¿xµ‡ˆ Xßžc0ùrmöêE‹~{ùNpt{‡ü{ÊL,oŠú–øñ/LŒ×ÉîS¬\.õXŸÇž¤Èç×]­i÷…g`¯äzò:›}^¸«¸ìB^ÑÀM ê†ûXÉ_ØéšÄ±ì æ$#²—UïïgHÂwHŸöŽíâ7›ÕšñÚ‚'xvS)Ô“¡1q5’ ôë}T`j02±Ð­4 ²ÇõÇz;q‰µQ3Ø‚˜3³žw?²/’”s„j‡Ÿ¬ò34ö3-teüP|3?œc;”ñ––ÔGT¸6ÀÏAlY­”qd|h%e(ÿ,}&æ:—"M*Ï<. ç-Dߥ÷j¿¦‘Ô;­Áê}È/½wŸÌè j„¯í!”nbó‘F¶u¼í./9ÍiqzôéÊ=ÐzLöØ¥¯c †ñbŸãD×Éø%†”?ðÕðnAy i¿JÎcÕËMêGå ûY¡ðÌIO¢(%Ž‘NåAŸ:ÜÅà ÈV‹'•Ms±Þì°ø4…wþ_cŽá€Á3 ’ƒau›Ãœö=“V‚b§>“dÞ·¨D «3‰3á†Îá¾=höÝô¶™±ŠY†¡,{¸‹Ýóq…¬Q‘~)A\ múuaßìÕ·"Úcä£ñµ,wSˆáÎËNÝ܇qnL€Xyˆ9µ¸ÃÁrÁW¯?Oò$^¢ÞDÇ·b§†,«&"œóóÕùţ¿ÝêN-“Ð[›qFd^Äó•ËÔQ¯¥Y¶µ?Œ‹ŒQÅ'URï8Gµ­Q \¥™rh”*šÏ¢›SÂMߨ­±·hÏèã¡õ¦^ ª˜öxÚJ–1P*PéùŽrâ`m÷)¶²UÓÃÄÕo÷$Ú$÷­6MÜ|ÆäÕ;šú¤à ™¹¬f˜[„çššxHOZ8¡(•ò)ñÖ½À‚Öl’ ³&Z,‰ø8¯4νE ÷›0Ù`Š´”îjý8«‚’kŸ²pïŠòYpTð=(aåKpÓñ£ÒP=msÏ>·æ}Ü3ÔÖá‘PÇ‹&6~ ¨NÇ/6„ÌéÁÅç@Âu¿^~²ÜúWì̱E =çXÁ$9@깤˰†w>YšáÍð€Fa±Gõñ Ȫúiß+5•PïHÇu=b¾O\ˆpÎ{±u£j¢óx¹Às¢H‰ä8ŠhØÍÈ]õ¶ÇçxLÉèÁ½6P2IÊv¾oòË+rƒffzõ”w5wŠN éΕYéX°Ë\Ÿ7Ei©•TKUù©¨}ÓîõTy|ž`—øñª!’»k\¦XŠb½ï¼A›yˆ«ñ♽ÏeÙ’Yž(IûJŒæ‹`1OOª.ÄqPuSSж9ìl ñz^¸·œß:kú‚…é}Ü/p.†0m1¿ùȪàüè ,«ókÖX´<ñyS’Œkw ‚jÒÙI.$ó&G¤­úB¬f ´ËœV@cÒÀ—ùyzùz£Ì—\Ÿ4CQ°Ä¡T¾_²"\G=AE·¾ð7=«›r“¥ŒÈó­ÞÕ P~j+p…qôíé’bõœ²¦ÊD#1†¬Q»FÅ4JÙ>%h ‰o¥BíYcG!“¾}3–Ñ/ õ‰VUÙI 'Í.Çv½­4¹8Rê5YÖé)p”?M*˜˜*H%*ä `|JQÕO¯ú–é)›Þãa*Øa>Pï»P vÚA;ÞcbŸ”`§M Brm‰-çwNñ/"·RðåäÊÏc×cbmjéÐXq¹}ÑjŠœR œ'pµ¬©7œ˜Ìéç˜üÒ„ŒJ}B ýу–‘PÑ$xsæCˆÛÊÉYÍU•VDJÁGoyÓ™yh;™;ö“œ³þ¹ÕJÌ%ëõ=GP ²Ýȳ;ë˜:†£µrª¸§µï俯[ÊIí»ñ›¢Ÿ‡z_é›í$¼þ¬8o—Ù’Y`†pp }I‡K˜_5ÞÕÈõs‰¤›gPϦÜq ÁI…C+ï*_QÆBxYçæ#F)áçÐ4¹b:h KèÙf(8ºÉäûր=è2Ò=Á Ìï–eÂPÕÃ9Æ]5ÞN³ÐKãh8‚ +6i+)¹>¼Ó,{“0…µG¯[ÈÃXpXC}m}˜ØÏuSå²pú¢°Œîý2ss¶²Õ1‡úI:þ”ôXdfî¨u<óð9 jyéW]Ë/ìñá–¯è6v ·÷õ0Ž4x/„䆩+ršE†-8‚?p¤Ë…ϽxDÕkáÕ`¨¼TP/ ‚G¶bU/'¥ÉU“¯BÒ)Í96 3é¬ç±º,u"5-¶­R ú„@š;,Ïüjl¢Ü.GEf‹ÍÔ'O5n¿­=ÐQdz.>w”èóöäE­…n"ÈJq:Í_Ú·#$–ÓP òFR)Rå+Nd;õ\R`(Ò'!•´%¿ŒÅ[ÇÚ†ÀW.0™.ep3môtv¯¶¥nðŸÙ†Jðë¡ÌÔBs‘F-À ¼­.jÄÏ|ªõÞè«Ö±?=AÏ|!VëB؉’‚ãXFæ ƒÙãe>™o,.°fm_ø÷q ½÷G1€®ÿLe[ÜT›y)Í¿U¹— ÈÖ•ʲ†¬|4¨§mðeíµŸëºí¼ÏEl],Ú7ºÃ3Øí V#ò(ƒžíFÝ0 B¤!,²{]YP!$ª©‘“C±·v¨¢ë<\^çG?E:ëðÚˆm ¶Ð^™Û“||0¶ìÚ,3avóv^Êqì‘aMsm‹‰vƒPÕ4]y·BÓ®õ§ÀÆ\¦Ïó¹šî]®Äϲ{sû¹~è°¡|Í"_{POÄPÃÅ`$îBÁ½÷p¾ó´ÌÅ]Ð Yˆn¯¼m^ŽfO}Œáƒ‚5ßò›güèç.ó‹M5„Èap»n×}¯I›®ÈÈ óÆ‹>¯²µªÂç·âG{æZ×åÆËJªyÌP“£È¸}Ó  É¥%ËN®ÝÒ7Ônz¾³NC]\(òn^¬Ó(|†S¥‘XÁí÷ZÙ ëE›t°¿×§’ö¯P/k [±ÝžìKû4î¡¿tÕI7x0¸e¡\-øR­–8gaq©f|n$¨(ƒ@–!+ñd®+ö¹äź…åyî0 ºm½´z€bnó²0i»…±¡u)nOògz … Užø¤În}•¤^/O;ÖÈ7nðD“û†„ RÍU”:!Ög⢘;úácWAäÒ¸tŠgXΘŒ•3»Ö/(¯žÍõž'Žso[øÒîB½K¿˜£Æö{“°KlÍ|µÙÜò‰øñ¦r‰A­ ïɇ!îÛõ*ÄÏ>;§ÊjÛ›ÉRñk¤ay"†¾…B­{ùÚ õþ%WèYÅËF­BÙÀX ÜëÚWºÇLr-¯†Ýl·&¢=¦ü»ãp,sm›P³‘s²ª {x<ÏgÙÞÔ­:AY›…¸”ì1}°B‹]ðã¼OÍ¿¶âDUqèùºÉ€X™.B®®åUÝÍe+ϨÏωð~šñ¢J`â†Áš½:!3.ƒT;s~ÖÀpi*IXZY$[f^ k/²nÖïYÎß¹î6î¸@Ÿ ¥Ñ8.!!sS¤—@ö*±ÐÔ´‡¶ØòÙÓ¨ˆþpB«þÊÖþGÝ¡/.l‘‹žn e×)9•¤@XG©‡—+ÕÔ y°/ÊÁ¶%6ÕÒ¼DH0¾ÙO1jDß!¹=ì¸^Åð.mܸü`$êEø’ª…£z(3K¡(Œc¯×Žc̨1á o”1WYˆñå›U…r Žv§bE¿m†½ÙûuÎ8UMT&og64í—ƒ üúøŸ x™ž{SáàSmz&9;øJe—:B` "P÷\Ýx[ªT«ÔŸ±1ÈÓm!t³Œ<ƒÿ`F<šKŸœ‚ØK«I§Ÿ%JD7|¤ÎÜ£«û"Aá uÍ–Ê~¤} óU\¡­$‰!†âCAD\K¸O4“ê=²Êížn\Ò ˆ)¿þtt=Ù¥åƒôiœÈµåÌЧê-³d -™‰ñÎ*â7[L8v=lâU8„#eï `…Q»¡ˆÀÍÒÖ ùØ4 ³¦…€õëÉwåLDù”ŒTuoÒä²±ÚÃn͇èáiÙ7øtã}" Úó»N† xNèiˆ¤r¼#Ð{¦Eùe1K¦MžòʵŸNòEª½©ÂÇÆ0|Æ·À-Í>t:Œ‚jë~ÊÄàäN\Uй÷o‡`“':µì…Xlä*…éa»u}ØvõQÞ'B±£&–¬%Æ*±×首Èw6¿õâ‚[ª0žÎîvõH‚ÚaáA'>²;§ß–}àÇ—19WlÉ*Þ} ,-EVÌ,µ¢ÙÎÇyÍ/ëÍÐãR0¦OTyr]´éQé>D­Käqñ[Âà‰½Å§©rpù*/à–šâÌ[³Æò&òÅÈU|ˆØ>CD’wd³Xž„U]ûy ö“*dîñP’—n}®$Ü èÏhâúCJvjjn†jêò~ö®òf~Œ¤dé„~ùä>°ïãl¤Wè\êV® }¢®çJÛËWé½…òØY¨8¬²q5™vYð8Ò ²üB¸Œ¡9”z @ng×XüiN#ì³?õn»+¾q¼yvùúpÏì&z¾£Ýïø §Ï¨ëCà‡ýtñã·‹,ÆòŽð2ûþªŸ×¾ø‰Æ<ÒóÊb]ÃoùÐxÙKJìnHX “óbxÿ|u_Rò´7/j‡t%ÂQO¶ÉÂòMòã9§¶Ï>®Wm¦óˆÁ4¦*îŸð}Õöe?¯4†BަfZÃûnÚ¹ö¾Ý]ð‡sâ <éô7`'q¡®ž/Ö¤_¼6>ÞTèÑhƒ¤ƒ¼øûÊÍìßn&[ŸJûÄ^¯ø\Dz?`ôX‡Ï柶©ËÚh8%ÊÊãàë`UàØ¹Žu%ú¶ñì‹ÞÄþy9‡[¹¿l“DõGó² ò§O2Eeä’Ö#I?Q²Gî jG|~š%ÅËÐÕ]+5Xˆ€et,û¥è´ óK{Çî“G–¸Œf¯EOQö?[s°êÅ |Ý €­yÏ7$ØûÊß*;}褣¤À¿³*Kõ šñ"…úUä-ã·8+Zò"öJrxAþ'#4hÁ'9/[ÛìÏÕh(!3;WŸbÚì”·ˆÍ,j³§EDÑkr0süóL¥XpC™õK7<µÏ[jöv„Š{ì”§ñ•’¯µk¬{8g!u5ic¶'©¶¨“ì²|ÖHÔ8)Ï×ñŸ†;Ö°Ÿt¡öcIO$EwE¦§¢u˜*J­|>–$鉊Á’F2,wáY °±mCê{&ÁMb¸Öšë‘'ÎHǰ×w0Uîñé¤7÷«õAèàªú¶J~YKüÄRïÂl‡”qèhQåq3Y= ã½¥ðØ}ß‘Oð¾{aöN¢è+ ZL´BZ²ûŸ3;Zb¢NÞ¸½®[ÊàD)¢Ós츴H+5.Cl_÷ž…FQ$`\TW^7ìYlÖ´I}J3?™í_g35~C… -ùQr*@´”%Ð=¯œ‹pe,µÖ»Á3ï—Å£ñ–´â–4ÎM%…”àž‚ðUÅøU.ÐÕ ³ú„P)Y4#«PÖë)\B¹¦ІA¡Èî@ÍâìðÐc BGŒY° dÞÒ§B<U¥È¤iÑ*‘†Å÷íÓ‡¶°“‹bemC8´ÁŽÀÛæÿXŽüG{…Š ö·<§{o@j$˜ú³RH1ìN$g©=C 9H+ìu&wfðÝX/ø¶w®H޾W¸Ö>*-äSÑ+)b„š§”ˆ¢†w¬ó›­ç#¡ù§‰nP«xíêR/4AL¡öZ>ÓãÊC *_¥ñ4 ˜4yc’“¬¾.V1âO8™2Æ|£1®qXc1[?(måPšåšG\d…Ú>ñÙµF¼¢}r=Icß¶Šz1u:`Ö=ûÊwky ÉXûÓÇ7¢ÏNmœùwÞÜZsw¯UŒ+ßÔ’ÂÆ’ÃĵèyýñJ¨~Í xˆ‚¼øzÎó|®²,‹ÁÊËJz®<¼ þ-:ïã–žÌöœLx qX]?Ƥ¯ª\Ñ϶…Ù_Ôä*öð[ ¶Âí@ìJˆ¥ÉxèJvÉ¢½ CX°cÙ_³®ÞI¹¸Hô b¤ÕÀ£¾,ËØ¡”òøâƒ»5ÅŠ–šœ7nÇ[µVמÉî>~íJŽ×©œåì+y3„ǧ—yºµ¬ß@ˆì;ÿõ^ËŸnÆý|•ô÷{8:Š ¿½{ÃÎñû a/'Óûx¸f +Aš£×oh6‚4ÚœŠ,ŠNâ kº’†¹­9¯°˜Ê\1ˆÉËÔ‰ÉòþΑ+äj.H.®¦ E~—Á‹ÏËÞÉÌÀËÞÎÁ•ÏKæž„||wH¸Ïâf+H££¨pst´³µq°1ó2³2±²3,y:ºØX™¹hÀEºXXò©IHý(|&Hó@ÜÓÓ“Ù“ÙÑÅ ÈÊËË da²±1s0¹z;¸™z19¸RÐü ³ÑùÌÁ•ùž'fsG{ •™ø³¢Ÿ·2ïð¯îÎïáõiÜÝm,ø¸Ì¸y,My8™Ì@œ\L¬¬–¬LwCL<, °Þ@5GG7À=xžÀö=BV / .&ÆÆÊÃ!%É-ÉÂî*â\ìl¢\œlÜl¼œbœBÿ<‡!â=œ©‹Û}gaå7‘ŠJRYê@ÿÏà?:™º¸‚Œ\]@NvÞÿÈ‚ÿÈÎÅÎò þ#ë]ü?vŽÿÁü¿ÿ1S{Áaƒ Ýï«6ú®x¡ÉpDAÉ Gu‰ç†½:¥Ò#::YÓ>6âò¸Â fç´ëç7æáZ5y2Ýäœ)ìV#ÏÞ0-ú³·[³3˜ ¿¨(1~a¹`#ÛCç X¼Dï„UzЈy*Ê,Y5új'ßI¸™ÝrÐûU —â-ìÉ{r¦Üí£5 ÉhG;04Á*•%¦³«ûü±ã+_LCÊ}rú¬áOhM»fƒë—ETÀ%üì=ƪ†qPÒ{ÕGJ¼žxÛu_=kÅ|4TQ„S³þŒ …³K(¥TÎ_Z}[&¥ÇŒºëÕ¦b'ëרïš2wá¦:¶òèrÏG"U«Hòó°Ê+ °×Yý¤òm1Ÿét{ {?!/@+#ºÔ‡Ù•gzj•ä¨zú]@†Í½apPÎâ9¢K7/ꙆFÇλ÷îN$»³S‚Þ²K6PWÌýëu˾0Ó+¬‹ÕtsKDz¹ƒ’J£d½\¬]ÝÜlââd æN‘_¼m{(ÎK¯a:Ž‹Dyꩤ4ïd3ˆ¹òŽë=”˜m¢žT›f#ív°YÉ óv–$AÓ ¥!¾ÁGŸä-Nxˆ§#õ®b,'ßÎxä$¹  ‘Å?\O¿-sú†C™_ñ”¯Joj¼¿¿/\Þ‰0µ•ÝcÕ¤÷Ñbº0òÈBÙÃCóbC;’ÇYÆá;ÚQæf§õì™x¯sˆÞkàBûûµé(jê]µ‡r¡„­i¾\(êcSË{DX¾E‘¤kÝâZ–Awrémпt9`%é›m˜\êj¿µ³s]^/«NÇ*éjC¥ˆàž’ÃÚ*±äk÷sïš!.¾â?¶Hgm|Ûpð0#+28ïFŠe#úèÁL÷Vs_h¹äñö®ꪤßjä˜F½š©-<Üuâ°XeÄcƒbl99 -oȶT Z¹IúóW¸WDp/DK“Ð1öLW¶™s¢§…H]iKi-šËáH ¯hçs¦`§©Æù°eVVú®öwœÔ‘|zˆ9QfFÂÞ‡+àž±h½¶å b+q¡{Jêé¬àOB`et‚Ø”FAÊ:uRÝËûA.MâíWU$=Þùšu`¼C\š_2‘‘_øÙ6“ÝUR»J³1é˜ã(~‹8èc‹úž˜‰[UnÞlõÑÒ¶Qž>{bÔº¯wuõCy »ù’Á¼Þ ‚°ݤŠDŽÒ)Êy±:hjª¹àG:S¡!{$1„™b~ÄVCÉruÄ´q:Aõ¥Û$®Aëc{ÄÉ »(êëÞ£qÞ¢´Qy'ÖÁ@ÔzŸA( ‡ÌF øK:R=žP¢iòìq!YfÄݦDŽøˆnîáÌŽFá!ÀwÛ ÕöxÁ„Áø@°´ ÿ…/zÖ{›IW5|}ÁCÍ~ʦLìB¸"ŸÛŽà 7Jx¨™¼Çü#P–³#„õô°Ü¤Â#Á«x.)_ñÃÅç„Sã¢zñy K7t’¶”LTU Í_hÀ7¹ðÞš¨ÙôÀµŽ®vœ>xéxÒ;aoô1¿ìØ=óî½nþ»v¨Åø+c¤Ý$¦wµè§ûË!€—Bk*µÁ U·t hŠ$i5ç-Gï±=ºtÙhùɵÚ¡óžTàNŠñËáÂäc ƒy`a¸°§ªaÌø‡4±0ùÇ1–¸ïß0F÷Í4Í ‡!lz h ^n×·•Ð|®ÆÅ`õ¼ú(ÊtùNŽé¤¥„ÈòlФ¨x‘¾i9Å{ï• TؘÉXÁ%…·"|µ‘²Ä2?fO`?¦›ð¾”vƒ Í÷ɨפÿ +[aÉ`Ãc¹§z/n® aʧô>6¸<qmrömÏÈÍ>Û'ž×|¿±09ÙµÌêó:ò&yŒÀZËõéVŽå°6æƒ/‰:¸œ5ŰâÔ}Ög_¡rê>¼° QòÍ€x4—÷ñÔX9ÿOíÿF<5 ui …ž÷ðÔ~¢ˆÝ5ý‚ ö'Dµï`Q?QÕ~€=ý»Õ$Td4T¥ÿˆjl¬ÿIDµßáºþRê>÷ÿL5–Ѝö(׈©ö[î_PÕ~+÷ß„­&¥¨ $%û[íû7¸ÑÁVû£ªˆ…‹ãç7âÝŽÀ ì~ATcù­Ž_ÑÔXþKí;-ï=¢ÙKíï‘Ôî>ÿ Kå_DRcùGí DíÌû·Š˜XÙ¹î^bù_R“ÿ[ÔÌ€  å,5G +Ð èþ߀¦ÆÉó4µ$_um¢^G&&Ï'>åsÛ‹RE¾xµ|ù°Ù&úŒIOê$åèü–3„hѶlô±Ê5ÞÂ÷‰«Æ±.-.NÑæ°¶³5Øp¥ĺ¦˜×60ê×l~s>æ“ø­ýÍÊÎW)Ù NT=@]‹\µ‡²üx«¦Í5䆓%ý¦Gj\FŽ0@y;Љë/Áð&¤fÔêHŠé<^ú»§@•J ÓdÒ â×R GPácÀN¦çmtw•> ýØ·òy€ê"v÷ ùP #=p%jT° iÛê(Éäè®eêt“˜é4O%R¾Ü wubÊ=ç{#B¾DÓûJƒe°»æ•#¤~¬}7Fµ…ÎH_—Ø+¸¸ZTû7­j\# ÕÙa%œ`t¾pƱöŲ†•ËRÔ pù9©—“Áƒ×(ùŸbHFùÜÇ3N±·ÛN4N<­wÔ shË%[í]c† È™Þê†T‰‹Ú—5ãÍÂ<Ê>›•Q^ýÀiªè·l©øçBò¥¸D†ƒΈ ‰óo–kVÌ)ƒÔ ýCæmû|ì!“Ú7Î!Ùôâ~èÀ#.gR%§içÉ19µ×‚$;(m™ ¯+iËàRQùôˆ¢ãGwÑ^¨RP©Ë1×½Á ¤¶%Ö´‚¢dÑŒ¾¢Ü=íƒþlñpluUq¥²z> Á{áéCýôÍeÕ÷‚Þç+µÄÃ'åßJ“v¶.¸–<ïB÷¯O®‹³ˆlí±†iš[/ýŠÚUpâÄ´öÈ…'3º€ÁIV5ì`[qÅ ¢J‹S˜×¤¬ŒkðÚ½ ž9Jƒt~ØD88c=Nh,`óÓ×I±:8¥ßþT³ðB}RHB×!ñZZÌåj²ïƒÖ"Ùß úI~QŽÉ ÊùÔÜÉgsCet²s˼n\íK›G]Ö“W4äQ3ý¨Q"¯¸ÇÓ ò¾î1FÏ[erw GgqHDYô˜®/a,{‘C¬rL²–Drãª7&ÚªÓEvÝJs 2T¯éñ·ÞÃó¿„ É ³ S6NíbfQ@âÓµÊYrç"Fœû2eÆ”˜Î|ðzqÛî‘€$Ì"K|5þ'•‰çQɹﭙžê²g9V¸åÖ-Aî9ö}“žÖüÀÉX¾¾¬DMÏ@L‘J³|ŠGœ(ár—F´ä´Vå ·[ÊÞ5u@òÕrTìsk#ÕmÀXú~ºjqyŒÓ ÿâÛà+΃=DûBµi}.ß^b¬å v¢¾mŸ'DÝëYÎVJ­…fغ1´\+±SAåÓ+? S¡lnhÅ!ÊŸi}Löš7Ýž¦Ëð¼ýœ>$Ñv|ccÍ7{ºÂ¿Î÷Dt[³Œ‰Lœ¡É9"™ÂdÚžÚ½dÒz¶àÆËGL §ÂÁ&ûjÁ ‡³ Bï8/ús&dS^sñmTµ/wûGèÊIc}芤e­zlYr÷f Ö±Öíëƒù·ï–Í•ÛÏméÚ*"ñ¹*B£ÎÓ…XÒ¦ ¸õ‡Qª¶[P;×<šˆPñµ'Ðì²42CÈ`çÏÆrf jßëÑb<,@®²|Ppð¼£zyCØ—yÊmŒPÏ4(Û×åFA§xpË2¦w $Æ4êº~ÿoîïçõÿwáÍý´9Ë?àÍýöNïvÎùÏïñþx{÷ïìzÿ7€Ïqp°ý |s.­ OM“6/AÑš¦!oéàp²ai~ ‡[Ââ¹_¸H „,ºØÓA~QŒèA9}’íSŒ“ì\´+eºd;B9kõ¶Ú*ÍHÔÐÜ[¾½}st{ó’'dïI×Ú³…ô8"ŠoDŸzdX»ÌژϢ5A„Þp¹zA£59¥Ë¯pÜØ¡[`$)¦Ó` Z]CŽK9— ’1 ™_ö^AA ¿à÷\¾5¸ØÈ{'_,=p{5òE‘5!¤)éCíçØ ¼xN^jª. /›:› HQ<Û’r«ÙeÌ~óýÙC/¸Dg¿¼€a ž•¢üù<­:=U½6R°ÛÈŒô3Buvª¸`>B±ÊŒ½:îü‰Ž„f{·–Bu´ŽÜc9F Œì‡“hÈÖäžQõ<Ü@ð4ƒªŽYEgî^gÍ7vî¦RêÂkd3_vöt½2rëw»mLšQŠ¡âŽW.E£ã7QýiF³ ¥J8zIÐÃÉ` éh‘|é²çÏXпÛ/Ë·ý éë µÂ t®®j“õ­ÈÅoW‰Ô["™WNŒ,]§4³£ÃkœZÔD´ÑWk0IÓÞOe“&°_³¿Æ ÈC¡é•.]é!"kÚow\’(§ÊÍÏL¿ Rh–`È=É¢nLJ~ë;Ebi$þž¿`½¹v'è…û›~oÄâŽR'‚ûF6gb~CxX ÏC7ÿ­ªO·:u Á.%åóNÕÓ" 4›€ÅujŸ}$y”º|wl•1)N·P‹xrb’cFj)¹f(6£aˆ?¾Î'‰ƒÆíòvÂOCÎî|3/€¿L¶Fßçý ¹xSð3qçù™ÄÅðíÃã–K_RßÛ¦s(=f\ªÍÊ ^PÐDM‚¤Ä¯¡iaï>Q»&m¾¹pvºýÒ¬ ¯NÌ•‰UCŸb.Õ…yÛûšø!’%Ud¼~äX&S¿½•°ýN8iÄ¥SnV´ÙXA³P¡bÀÉC €œ?ìI€Äã\®ÍSMh~O·ž@yÈ®‡Oã·½ …>pBðœõôB NpÒ‘,‚Šƒ²hŽLéÕסeªP׉²­ÔV÷ÓŒm‡³¶…ÕúRR“R7@ˆ™ ôÙ‹|\2q:ðm4³þ±y¡–ööŒ5ÉøXʓ׫Tæ'ñiUˆÀÖìWÙ™HN‚ž:¦Pß$ðá èäTsñì ý éÄév°¾¾å'3¾ÂŽ!ÞMé=C"bŽ4Ü·aH*Žçý\ö˜N%ÈÀÏò”d¿c^03^à^#\#¨±µ*uòœ“Qƒh‘Å'søÇy¼ëKX¥ ÅbeèГ©—ÊssÓÚº8¸§ÏùÓë åÇ,$ÃÖŒ&tbˆ£‚àÝR;&^hzŸ£*¡eDrw(4æ+è–éMÊ׎º”Ôû“w‰®†Þ¼š…Oé¹úüÍXÉóý×3Äq¹ÚZ‘zõÈDV5Zˆ,б9ՌȕqoÆç½&×ÊFM7™ÝMOþ«é‘ŽoFö$g&7‘•AÍÞéH6¾±{Ak­jušô1¸á=­¨cü›î¨dCÅþ°m¬îú«ƒnlðͽÃc*Rî„eá« ìÖ.Qoƒ¥«â+„5-G2ˆ^±Ý´´ò9E‡ñ—æ6ÜŒìÑ»+Uæ°V½‡Ú=LnÀ¤Áä²NÕ2:6‚\ÖX¢”M`¿Uò­õ‡Êa…vU¦áT¿Í-RÆ4®?)‹“µf’¾ND¨ˆ¦G“Fbi „Oƒá`ãiè •˜M!qÄîîæ—WLd4Æ µñœš¢Ò¼<À‰½õ³VÑB”±[—ƒ½ì£w_F?`:T6@ðÛ;ÖfYÛkÊ1AEÕi9 /­•·ú~²‚߉g/F²C¯E¯R ¹ŽB]hOQ"ûZJ|­ÚèxÚ ¼ÿPæQ!+ïSÆÕçev»;Ù_V·r˜µ p¿ bÆ3-¬|¯µUÖ7 .R™¯Å™D´—|I9Ui檤‹Ý‡¦ ².Òᥚ:%GÖ}…É6DêY5äÊPß̶Ã+ߥP"ñBÃæ“é;KšFcU%£¥\¾‹~Àõó¥ŠÊìHZu<a”Ñü©ë|…\RÄj / vw3zÈÈGz˜!Òk6£ç$£Âùñ[¼öÕ}•¹÷²qï¥öÄ·©òç:ymÄ×ÜtªžÏ夼· “šäµb]v‰¾y®â¹R¼Ì§“üºaG€ÎÓÒC1\š¿¨•0ãikîW¬C®5¾Älc5µ2:(£æ=úDt-õÑ42înCÒV²݉……éEP72+â#9zX{vbÌO+d¨eÈf΃kš¾|²°!ÈñÌD|íü9Éû“¼¨¢SâGd§À³ËC¡Š%ëQIjMJu³Jùæ³S?sïŠ#B /"«n‹u½´¢Xد¹}Qr®·ÂüÉeŸûÙWøVuõ_§‡´¨>Ó¿ñsm²t·r¡Ý$ï…2l®Àc‡õK=K™. ‚¡•û¢½oÅ•}‘^ ¢äª§¥,¹æ’mÔR#M”[;Iksÿm¿7Jü6¯@-t-šŒþ[yMMM¸:½L}Ô/9  TÌõ‰‰u1Ÿf¹GéCPòê‘掫vÓ “SÚêKUÅÎ ÛËf4õ®1b)™_0q_$Âî‚®ŒÄŽÞx²á¿÷ÆîtyŽ(si"¾Ùž¼Å ¯ _Î>ÏÁ·žÏÞîDˆÖ ·R:ÝÚ'bÚ§5@ŽlÜpMT”«¾OZ.žSÔ˜ƒ6¿¤‘‡ }"E® ì×Cð~9Và4M6qÎp<Í‹ÏЛ_ 6]â-R»†C¡ì]I ó‘pYæ¡f‹t|ãx\qþfº¥ Ð$fè‰|æ7Áw gì¹|C+BimOÌØ®Ë§@dób’rUhïòƒu8¡Ã®­Gwøƒ¡;¦èÄå/°‡fsÊ5nèên}á°¶­°'JÙ Ç‚0¾X·=î_&‹dç5v`æ4§X5Ñæ-ú¤^ +Ó˜°_¾%ÍñÕZKfk^h¢ÃÖœ4~5¯Ã© ®˜˜!÷°|Xw‰ ³xLßMR®OʉÒÊMCÑÆc‡– ÷Y§3©ƒ0*n£ë,þXf¤Pc,+ PÔGa:·w¥g9Œñ³•ˆy)ÿT+®‡ÿæðc.Ò–×¢S²² rî<±üÁ‰ÒM’§<⪳ÍÐò ïö¶è Ý·-;8®·!Xe€J¦^TÒÁN¶ÏÝXôeo?ùVDQ3Î#|ìÔÏKQÖ@ßÝòe±[: f²Z‡Yß@ô=#Ö{öÔÎd zŽ 4uéæÑ8ÿAÔêz‹7ãœåãx *Ù±÷«šIÄ/Ãýv÷2eOååj»âL xÛG…®OÖaRRlåÞéBÃ.= M‹c°§àdIå>~Ê(Ù!@hó¤jG©ã³O·Èó*õí—Ne[+¯úGœnàp;^£~jXÉ¼Ý —Ç™•ÈwÅJ«÷DrÉ$öÇ÷AXe/ûX=þ)Ú5¤-N¥ÉçË3(W&ø—!h”)ÂhÄò_K“¥W9QÕæ_>+*¿¶èî ª’I´‡丂¹©œ©%ò´êx'?x¶ÎJ_”ñòLß•d*\>j~\âË,æë«ãÄwîowaÓöm[êáLÜøÂ(§LDëç[Ðö¤¼ÖÆw½2âœBÑô6¤çt®ª]•‹ÅuÚºYh KÇë{Íë…Ùšs$rŽt¾Ÿ€ROsöÈ]¤÷xö¾U®¦Eî9n"^=™Êyê5—2Jt4Š —ÀáϯoEì¸=>Ú7äg_à£i¿ÚX“#¹Ñ énÅö¢^òȰœ%Oíô½ƒã»Àâ'©$ÂÕúä¤ÑEšÎ7š¦ÍîY:‘Ú7zƒ÷Ôò"J_H°íp“ZúËÂR]ô¼«ÁD–LsÚÕKHžá󪃚‹‚ú­r’˯î«p­*üzÕ C4—F' |&‰}ˆ<„[­Az †Ï‹t;c/ñq!7£…›I “Ãä'¾ågªq ½œéaËLæó x­a»OOP® ¸ú`)ÁAqP‡RÖ†uïISTfq†«¼Þ !]˜¥!gI1?H‘ŽîϯÕÐ$fœ®^ucT'ªEl‚¢~gªR1‘ª7ý8L.„&Jñ]›Kô<;¯¼.Qiî×§ g3ùäaí%‡‡ gšîš8ÞÄäO@ÞºT°«,™c©6üløô´Õ2qd|£ö¢ˆŸoe5dлçÏú¥ÎÀY§Ï™Õ"ù˜–i“ZurND³½…f~;púæ•'pU_,æéå C`ƒÁ[´™=„¢éèÇ oZÊ.JâØ¸Y†Èjde2­5PU›<«r̰'/^¥¦Ž‰÷®+e ± »’w_äÅ´:ºÎBm/’¨ž«#RâV¾ƒªØqžtM›“¥ânÇôr™À¿ ž¥þˆîç …Ù»ð”øÀ+óY®!_h V!.xÛžm³Áj¬šv „úL,Úv¬=oyf=øÞÍÚ1Âùvët¼Öã“gßç¶Ä89û8\;ZÛªóŽ1±ó „ÿóC|Ù˜Q]–^ðæWaïw'ØW o†£|ÝÊOf†µ™uêæ¢3bÓ’¯qpuqý^í6G½tÀ­ß§›)ŽJ.×Î::w®óÛe÷Ü$__ch[gc#=2Ô·†±b« £rÓËmÐÄ]&Få³OÖPX?W *ÛB4•á|˜¦?­gÉȽp±³J„ã¶¼?0ÁøAdŸƒ%ÆÀš‰&?È'ÁTq¡ñ°$wV?[Y쥬å{ ¼£·ÁÑfü»d¦¸¬> í˜q¸ h'ªÈ¹×‰ Djr«øðÍ’S>0DZÄz‘8Û–ZŒÇ·ö†  '¤„ɶŸF˜™—.Ãõ%cÈ> ý€+ ÜQÀ­Q§’®W¹Òq|”:&#Y3>¡¸ŽÖvÓõhÊÐÿö1™U—k]j6ÐDyY'|YÄëùæAÃã©‚}Ý]¥úÚ…ªÓŒô¦WHÃkÍp¹ºd¯¿†^œÖ Ã,É ~};~ÒI¬[ s¶óÆc¹ý¬#zÙ±CyõõÔè·—$ß°úŒJœŠ}«(›:¢.ö{°dô®1,Äêêã™ÚþØÌQæÈ‰?o69§yœä(¶ðr ⸮¢ ø¨b†é‘*Rþ–2ÛÇ©´‡—º\¿iJãCÌJ‰(¡Åoß.ßP<–xy”M³l,ó4§5ƒG·¨Æ:\v—l¦ö,ïå, –ÅX5.3…V®PÉÑÈWÊ´ãç”â ~ìòZð3‹£¬M÷ Q•ß³7í&j£k¤sPnÞ^p>êÒEkŽî>cÊbK‘²•†–_)÷s)‘RÚhž{[Ën¢²;ù¥÷OAÉìJíHêSTÎ*p­K~Rœv‹B(¡äþèj)öhÜËÌù^~(\ùó¬V×¹E‚”&ê·8Qƒª6ÑN»<ó]3yçH)Ó M;~!Ñs¦L^NÕÒ¹+±óLqƒöØ8f«æj c¸¾ gR|û½¦b²€‹€Ð$„wv—}!ÃeödI½·†â£{pŒobZ³ÇÚÊãŽ&Æv?VP{ànµ„S*„2Dݱ'j¾îF7=åÓE©¯_Þš°ßõ C)ðýÄü½½#aãQa‘ ô”ˆi\zm…î¶‚Èá'¤ÅçKYÚ[3OµÌ¶%ÂÔî¯m}ë‘ãRütœø»Áv9 úG!E-Í¥¯zjùgŽŒ‡ö¦»¤g¯ž ÊRXo£6pg:Ê/ju—¸^ÚŽC:?šS*59'$Ô=ù4Ê¡UhйL•S| IRN†+èèÍåÄí²æq"è„b€uö®¾P«€›„bß™ê™9hco±õQ„™º‘sÓFgFÞÒ|¹ê&iš§ñÉZ€×j1Òc”ÕÎà  )ô0ý†gL^Ò†žoâg- _lÊÏj•ª]'§2²2Øýš83ÈÛ¦K¨€ù MÒú›ÑH~(æ™­õ=Zš„NæTÞç¯nCj±«Ô™9•ªXú (qçºsjö¤dÏ)æÉpŸÓ‰°DZÀ [¨yëyÔ0ÂÆY%´„bÕ£¢’²iOèSøÈCúåU㛼æÜCóR©u¸¶>v)Íì:dœë¡‰±@­,8›f'tQøÎiK¥53#FÒ¤¯ÍZ¦JôR)¯ ›WíÊ™ø óÐø‰'/–È,=É\3úŠª½ã<•NXM.ùÆx·Âxq=íHìN.dŒ¨½þó/±%¬XiuR*ÈŒÒ@džÊ¯O™ì¥&tSóãÑ ËÔ°Ñ!#ùijÚ@N&É»DoG`ݹKB—)Åľà$÷Û*é…à˜:/Ka èB"É׿$!=²ŸvÀ¼ž"CP}YO¿÷$‡ð’½˜q.Íyè­žÖ´‚zÉÓä~bV¸hX'¦·j¬ÞŸ^f”‘å7‡-?aމ5[<â{gãÔ|†mpí·7n¯QÁ&¯)Ôƒ7Y'GPãK^îÑì¯á©åî .n¯˜)k5­{>‘‰­Ó·Ó„4\JãÝû`Ó_£àÙ³þ‘çÔ-(­ÒäÑÈÓ1KëÍóÐCšÍÁ†9 ¯cÛC¹Æ`RòâwúØ lˆDzZÂ.¨Å\ ÐFð)åøQá쌡”y?YÄéÇ <ÁéŒh;¹»êK†g틤SI¤7h ˆPŽÈL—€¼/šØb ÚßVq",hb×ùð~|gïÃ*¦¢’ ,ésDóY^yI0hDJ |¨mY¾.œ52 @ÆTx WÒPÖL-ÉT]GÝ{Îÿ lü÷bí¢ÉäŠwŠèuÍòt¡pDPõòÎ'±%Ž-ÖqãN Fž8v†¾ö×ñââIÁeyPgUQ¨JV±åN9C s%Ó,¸Žg4Ãѵ}=5Ê©´œ¯txÓˆµ¨˜î«‹ï5û´Ï­›™mE.¿*¼@íA—øëköÄ“&Z÷„É ¥ÕFB”£§PιJ†ë/%+#ßíwºÐä•%›BgfYÓkèÐ5>ĸeÔp´TX#TEÀbFø¨å’-6ºÝâŽ%¥Zõ³GB¾ Ã²¤l°B^á÷Ä®j(=·÷ ¯¬ëès'ÿùîˆÃ @ëmôDZkçþ‹«×¼”þÍ>·Q$¯’Œ3ì+1ÞC:¨Û»_×_瓉6;[}Ð!ú*Sâcïaœ·GN^[øŒñÒ„GpÆm¬v€£WÏMIÂÆÞˆïT/ë #é ‘B|"Ù»@/}´E88~_¬mñ¾[)±@ëÊ3AOQdò m9Q8Քߴ –ËEÌJ¨Y6݃+“0A’¤9Ò4+Da©¶éNkDW’DC«ý©ô8g¹^¡S!&›Ü<¯w‹Å«÷¢‚°ãÚ¨žZ ÍËt»ÌeL(7Qàèá(Û Ùúqæ~£)}PEbžëÎ='R˜@·™·è&IhÌ<'b¬@ÂÌ6à%Åy[üAÜH}yöþ'~ yÃPõ ‘8Ø7×hC ¥¼£.*‹\C±ÇxI ð}òo¹Žg¬²'«µÕN›>ãún™#}`œ’f©‡ÆD~ľ؃º„ýÂæ<¨ozês«fø‚ãÚV%>1`ñ#hQ–ƒQ²¢”N ²(×g#IiDì"Â…‚kíc_û8é爚¬ˆµs 1ð™h A'ÔU ¸t:C21r—-\î}|:Eo$éó"/¡QSóTð¡boôdçäҵž% öòn¸3‡Z}mZó‡hB/‰Î×NBŸ'§PßFµ=Ë6©ž\Sd)ÓÊ#~ñ5öÐì`~?8q˜*Ê-Ú)üPq^ÎÓ ™9•{ñcÚ^ÂYa}ÉÜDMV•6Ue­ÑG˨Bü–%T_ÛJer—BqÇ¢—=k™R©³Ž¦u‹áëÊéú©äïL¿QºN¥Úö7¸LÈM}t[Ù¨ïxM·í@.,ÈN£M ¤ßܶ(ߪƒ°XØo¾‚šÄeÄÿdÓ+dK@°qZ¯í(äÄogû°:Š—åUÔ”›·¾ïÓ²z¸1$8¢ƒáL¦§‡uö ‰)Õßôª jClÖŽ|ãY1´B·­5Þ—ñ‹4_XA0Y±þ 4³L)WºªÙ»ÐÙa3aŒ°gý^øØèøcóðÄOx(ŽÕÁ~5æã~ *ë3» YBª/z•?¯òä²R÷±%ݘ9¤%(øP0qo¾ÒÄïÏVÊk–Íÿ¢>+çÞnY¨(`¬ˆœi[þ~ó]OÓõc,1ë6ÄM‚Ë\/³›)8Ÿܶg¸@!ÃúÒ÷ï?â™;Ø<Â}öŽhwÞk‹üœyçkQc²ƒ­‹V¡fXQ·Å¯`Ÿ.=jyeÏÑ:\ÃVÜŒD]…oÙòî‰þç*{t¯ßYFUIW¡D>ÅvúTÚ–czì­ëEøÔêýZÕòûË—ðt ­òÝç”~ÁþÜ2þ'çGÆYçÎ$Ÿ´ŸIG–o¾Ï]^° q^j=+8þ‚H:O9:„4¥,Žl[é®Â¹0™äXœ_T¡ý`^næéz°ÝÛ÷N4¶—8URüº(^‚SZb"F/˜;Ýõ‘°H”´xå‡ â?§ÈZ`Ðz®.Ky—¦¹>¦ã€yj†o-ÄHmwÉ&¨A\¨æc!OãFS8‘º‰\®Ø&§üA:S‡ªû%ŽfD„¦M VOZ¿èþjm7ˆØÉITÑ[6¼C-×cO‰’y¬ÝÉ‹}J1{ƒÇ)UÔðè±]mf±¤UYj,{B[¦ãNkÊÚÛà/fé!K0,:òLÉ=—k"1Sï&›Èêü›ß$Ö…ÇiYÈR¨CñÔˆ†ri¥·'$}÷P´~@[Q˜Ò ýCeí"äe3KZ ëèââÌŒCß„Ç!Á_ÇRlRø´ aLL¶…dH•»¶8Ò? ?VeÍ=MÉ‚¨KönSènàAš¡BÉ ãˆ+WR0FþEÞyÕµ²9GÉjgª¬<…c*Åȹ(WJæÙ¾RKƒ§Kr®ÃNeMMö†™çú̼ö/µd &xŽ}fº' GšÕÖ’?0ÂßÀ$§4ˆÀU’Ô>7`v? !bË%aÃ7¡ÆlW’|¥ÎÆ– FÈ®·N0??™®vþ`ø&Åö¤T_ãûŒ‡µ NíK¸{fªVcòKW¥¡ËPH´3öÛàùÑöï3œ&Y£gGh±£Cr2e˜gzŒ>~¬£vcЂ€J°SÌZT¸2ØÉ!°[á¼+i£uJ»yµ«Y¼\fš0²óaz3!á¡ï€­ü·GÛuMžÜ ðâé5½ ô< G|&¨ÙŽHƒÞs­84/MŸ¬ò1ù4šì€àÞ?È®)A&!ßúéâ]&Í…ŸÕÒ0×qže]ïfCf@¯®Ïf/{?ôjc~%N½ýøp‰h¥æõZœ=·¬Ö¦£<Öv&Qãh ó®– dñÓvÄ€fįg¯üI}ü•¼³ ÷øx±ÛBÛN“^zq+‚X­9!&s«ž± “„”Çñ/d·ÑpE#dq© Ù4õ–ßëŸâ܈ŸGÔc¦„[>‹<°‚àÆËèŽü$Hô§)±ªÜ™´ÍcÍå«pÔ}b… Ïweä†Ý®±¯¶=J)ßÀ –"qMÔHN¸MÕês<Úû ý($€¥—âïÃÞÃøÄÔ´uœL¡óµ¥y4_© âàëh¦ùvÞwûOÖ*Ÿ½yŒâ÷ƲA•fáë´ØÍ 9ˤjD8Þ;ÎKg ¡@‡îˆ* (Ôx™›£ì\¼îj¨ ì˜iÒDÁ|ÏyzlY÷Öžs MNÀ>==a´^#E áÔ—yã3ÎA„W)-Rþ¡É·Æ"Ÿ lo#éfd‚_H=OÇÔ}¢CS’/ųю¹å£íÄÿÜo\2ì„ûjÝMõUâJ§ºæÇH§sÒ×lx§ÅYŽ­‰nëó‡óbH~'0½=—½3¸ÐZ¾‡¼{+„Ît'|M0a ¾-/‚)_&°<¢0ˆI>~:1—he£lFžl¿Dð™Ps¤SWù‚ý©@}Ü2wPÏù"Õ«÷AG0ä釲״(»cRÉI»ž:rºúä²ë“8ZûL ‡à ŠÙ*§˜Èçé1ÞrÏ^lë7Ó+ôJÊ­ÜŒÝ"x ]ïûf·{“³\¹1éD(ËÞ;ÁÝL,9“Æ)W]xä©ï0g'%igÄ?MsMJ9SuhyKÚ+ƒYn\íècïבY!àøxæ¶D´ª,YzÁ;*"‹Œj"ã|íãU¶€À()±]+êáÖϼ¢¾J™¯kÒ´Æ}ó£Û´®&®Ê|BhébR¨eGyi7‘2š ûФÉc»e×Ù'.èè ú;Ò ž}QMâœêB€Ã–Sßæˆ¹Êyÿ| ãõû3[f…Õ¾/hhNxÂõO8õ”`“:?¹´:j¿äHS°Ìï¿Hã~9j`Φ;D­þ¡Uûû Tòæ°¯þOc_™rp›[üÈÒ‚…×ÌÌ’ ÄkÎûûê?ÁÕ¿ûŠû¿Ž}Åýÿì«ÿŒ¼þ±¯þ•ªþÝ:þì«ÿ˱¯¸ÿ)ö÷ö+Ï_±¯¸¹XþŒçtwñ/øUw¼ý+ØW¬œžbåù+ö÷_p¤Àóü%û_®q²ýƒŠåNzÁ´bgû+¼žbåý+ö;'Ï_xæäâdý Ïœ¼ÿ++7÷ÿö«¨¤”˜I^)6^Qn6Q ^nq.QIn6Q¡žãÏØWÜÜœÿ›±¯þÿÉÜ™ÍÿÍÐHÿÿ‰…››…‚•‹“¬;° XXÙXØXÿÿéÇ" îèä}ÿ<£ã˜yܬAESWWSskwW››+@ÖÁìRÜÝ@GK€ÈÜÚÁÑÎÑÊ›@þP¹Øß=綃nŽ0 #À\*#Àþ~®Â0u°XØ€m·Ù]!nÖ6®wt®Ž–nžà^wŸn®Çâ‡?¿·Ô°»§xÀNÕÉÑõ{.O7k°—¾£¶6®k Ì´•‹©ƒÈ‚àäâèac²×bêvß°_÷Ýsôýp0­ƒ£›98ÅÉ dê°q˜ÚÙÝå°¹ÞWsOkæžÃßý-í}60N¿·þ/źº;99º¸Ù8XÝQþ¡yŒ¿WtǤx~']EfYf æ»’Àë„;Y‚%ãpGljö5n6wOÓÀ‚qr7Ï!lܼïêw3µq¸»–þob¾ã\¸ì?ˆú‡®N sKsF€§‹›È,8›»rkÍv²coj –Œƒ#Àä¶?Ûà ¸Ÿ3Ý7ÀÕÝÆÍÔÌÆîŽ%GË;Ú{éüVñŸ´É ȺÝéï7}‘›º‚ÏÉï(2 òº«Íõ®½6öà98¸¬;Mß÷= ""…ƒ¹»LýÝz¹¹;1[“ß%X‚§KQ-Ic%I YðÇXVÉX‘øI#à«ä´q`¶B¤›>Ë?PŠª©ˆ+‰*JªKªý‰ÖÔÅÉx§5WËwj;WЯ9ÈK$ÿ§E‹++ªˆjü5ƒgÀN¦n¿°ù§¦ß×òGaX8üÝU°š=À3œ{!y8ÚX~3û´÷GæÖ¦ ðhøþ{7”Á£àîp÷"XæwhôÎfî–Œ`VÝÎv Æ?Ïû¾—Tfà9àç#à¾BzS+:D_0 ¸«º›ƒ‹p¹xƒË¼ûáGÜkÉ÷ó?WþßsºÙ؃·È•în ßqÆ|Ÿøçî Ö¸nÚ?5:ÚïÝVHÀC °xYþ±aß)YÿŽòžð{½¹“÷U{7ß ç]þ?•}W‚ àçÀùM*6à‰ x"ñà ¸XÝO \ÿ¤—ïð/µýRóïÅÿrõ7 -ø[¿ú%\Ûý±úÉŒ¬ƒ›©ÝÝé;?àÕ‹›ûŸ˜qsñ;«;µ_”+níx7ƒ»Ÿ'܈;ýÜùœ_z¡›#3@Öàâøcú6á S3»»I-ä¯ÒÌm¿«üûĬy/·Ÿz‚ç6à‰Áèyú‘EðÛ˜·;ãï—ÙßÒ\¾ãÓ X¿Ù¿£ºë{L üź܋âζÓÚÜK`v5Ͱa`ø£¥øKccÈìjkãô;+,üÿafp—ë\“ùd­@ —ïBþôÞ:üô¸hœåýãàÔßm”‚¨´±$ØÐ„çžj8Éø*¢âò’êz¿t#÷»)«1˜…Rª¦º¤–8ÝïN÷ÿÿ{a Gãïý\Þwû'®¬¤¤&).@⯶Æõ×~øKvtwØ'Ë`kgúÙ‡ï­.Xl6nÆwiÆwi´Ô?ÇñÝx…`læm 6…tŒ¿Kü~,ÿËÄ?8ðŸ%vsü¡ó»ÊÿUbðÈ6þQÀžaûçø¯ ~>9€‡ÑÝ齄À£ín}ô£Œ?‰ Ìøç¾âT'õïzÿ5ážwpíò¿î»ª~¤‚­ÿúÁ&lÿÁâf/%î¹¹éÝRÅÑün]î‡ßí˜'ð4Låìncnkçý»Ýÿ[>ï»ü?ÔëÔßxþcºþ/Þê{ûAc Q1IcuY=ÉûiÀ÷–WÆ–?ýšånÝOC~?H<™ý951vóŸÑþ¢Ô;#y/0oÚßfä÷§`©‚³‚sú!þ;÷îVƒ fëÿ]û?l¬¬÷û?¬wù¸Øïöع¸þgÿçÇx=êp¿ ý>¿ïÌÚj²’ZwkQpxyüRÿgóè6þßÜ<úëÎ âo#ånëæû¸ê÷‹m÷,º‚Wêw¯xY™‚å*ß›ø+rpO2¿ß÷ø¾ >763uñwŽ`§û}b|÷@Áßp·Ú4¾'5¾›ºßçüñtX?ß3Þåô{ðdäî6?h~1çßwv\ï*8Åõç¦Î¯ŒÝóó}K|`îàvçÄ~Ûkºÿ½«üoÁÿMãÿøß§Vÿ†Àÿ’ÿçdecãø%þØÿ³ƒóÿÿÿ¿'þG¥Î¾ÃFöÍËb¼1ØéöVÏt¨‘ªyžú™ªBØù*Äà"Ú(ݧSÇf¢Žá¼Ÿ·›¿iŽÇªw‡æ…t[ŸêeezsÓ ÿ ýÞ<ä VfÒ^M=áål²ûiߢ?”k´Â, aBåÇIùcÙDŽÚÓå9;Ÿç•öUÈ<,nŽì¯:£{‘ðÌb"'å“°þ#×âÆ/‰pi_bk Þ…Ñ»ŸI¿;bSR|²l÷ò polmñóÐô»Ð´ç›€Aæµz³‚ŽÌÇl/^Øf \Ul,Ií˜{œÏ›¡º/P)«õqaûuý'Çîˆg¾S§³Vxª}g…v¢Ñqriv)bÿ©OîiD5–òB 6ÏEw„˜¦u?K`ÙðH0á” ‹ô”k±G§mN3¨èÆÝEjÜõ8æ㮼X½u0iÅyUôMq!§.ɋۿžOm‡‘›l8zËMÛdj̵‹ÚB”¾íecÙPœ[8Ï#JÅU¥9¾%|²oÒU‚룺ÓãÓm&b€4yË™ÇFÑ JzÁÀG§Dñå´Áî„SÅþ‚¯^ˆh¯kô(iF\˜U›õhFH +Ô—l­Î IÏa`ž¸Ï5éFÒä7­ú¥!×}IžÃc:ÏIÌÓ™°æLY;k&pÈgá9{‡îŒZ&y[ó>ŠÁ4ómCyÕ·í‹gR&•s UAÈ à¢öv2 °‹Îi‰ ŠõjÈC£^”—̾«¡þŒ _#Ö›ÁP2­AÊMöDèK~\/²·$¦1̇r¢%½·L¾©?oŸn–¹zOm?¦ØX_A7›ÕRmñÇ$p#*VCX8‚cÃJzI˜×[ø•™d}™ûªš­!‘›$Qa×DÆ”ÜEŒU«<ðK¶‘Þ %2Og­£˜OÞÉ€bzÌb”¥\ à‹~AÙg™\À†µsažñX%±ÄT½«jNªÀÝw[äInõ† Äb}õW­æ…·Ô¥ ^-6'ßd–»¼YØV¼œ(µÐ/‚‹Â“L›.v7 Øñ.æèÂðD[ŠyÓ†?0£s}A?xƒÄ8'NT¤ð'ž¦ì£óÀidDO¤ƒü–Peà:½4OQ`-•·('ƒ| b§F8?Dls“a¬o‚Éu•½hþÝ` HþÌÚ?aM®´W$8ÁÓ]nS¨®Éï:åâx-¼tãé8Ý+敾Çþ¡O¢¶Ö^Òê"Æì:…'ÔT`¢ëFëY© »…ó9«ž{ï5T+qjÈŒœ¸¢$½YúÚ$¾ ½D<´Œ—9!÷!+$çu*НyÝ (/…>¬ËÒ¤\>:aŒ|/ÖJ÷“b¹yʋԑ6Ñè‘[oWOA£ÑÏO¼¸ dš‚,÷ÄÈ(©pJ±…X¨d, š}샯€ˆpAѯǡ²¨Z0ü_N¬MÊYº%¨p¼Ü¤Ú¢/jDgD/Gš£súŒˆ”¦É­™Î‘ÀùY]å ²Ö¡Ã3¯åÙ”Y6GÝó,ë.“)U¦s±VjϘø£Âçµ mV˜×\еqÔ#sì®]Ž1Ó¯ÓÆÞ_:ÀǸ¿®iŸö¯*zi‘”¼’%Xl¢¤Kî±éKŽë2—è> ì›1\ ’yäÔ>÷?ò5ëšp„ Z¯DxsCmÀÅ×¢4þÁûêð’€/ÍŠŒäH—-žÇ½bâj‚脾Àv0,»ýmbP蛬9¼'&ç¥&B4)3Q ·ŸJW“¬ÞxΧ¡XΤQž=ÓÏš·÷oÿða,š¤Àã%m)AFaÖÅ“.ƒrãN[s ëòëB$u<2~܃@´ò¡ólg¯ ²™ãcã«bÒQõ”÷Uû5MnmyÎÔzœÞYÏz43ISÒ…™-£3LÈ óç‚ö„PAdÛJ²ÛÜ«gn—c8ˆ«8¨€êÓ}È臤¦éC°z%âf{p%¨xdXô²; üÈÊ|èÑì㘖ÐÙr’@¥f Úy#lˆâóH·%>p²Ê'3þÊlt­‘êƒg}€3²zf[CaÒ,d%þs{ÅÈ Š%q†b"_᥆<f«ëC0Ô¾@{‡Å| äõCW½TªÞ40V²bºfñ¶”OWþÔ$Ø Ú²þÂM ,N,Ù 0®z:™fF;à(ؤËÈBÖþü—Ãæk¤³Çß³NÂW“ýû`NI2wÚ„:{µå§-ˆ®Ó“8`€uí ·ª«Å–åžAq¬bîè ž‡Žl°kÛÈy®íÜ1á ÐÄ$±Ìªnã[àöüš’²²mR*dd„ÔÔÔÐ0‹B°ðò±H³ Ëü õØmXÜ>àæŽv ›1|‚côŸ^f½\}4V5N£ŸwOK@)EÞu 'å¡ÁHhû×¢c‚I"A3†ˆ¤º™ëûD’Ü_ô(&ý­Mð<)7 ÌM˜ãþ¸ÔFb.WcD††<_H´«Ô~ˆ¢$±C/±ŽÓL¿åâÁ׸DPÛMöýöS¨vÁ;p/…˽.©ol÷UÔèíbVºU†Ø/³›@RnVPã}õôTfLéµÓg£ ‘Ä9½’wÝóùÔBq¹*͵>yž÷*ÖÊ®fÖ}N®@67Ägº$R,ÐÜúœºc fghqÛÑœ0óëÚb½ Û'QÊ%%}tjœ³Ø@ΡÁ65Y©JhHÙÖªÅëâÒÃÑrÀž‘ùc²½±Ðuìò3@úq±egMÀ2–•õJG¾PGˆZ5¸ÝÂå»RàvšsD×ÜÝwðW ö/ULAC*C’©™`YpB2Qp^vؽ٘ðµ'Æ©u°¾*W¿À #Õ!¸D(ªÎ˜F:Vëµ5b‹œÍclÄÎþT~yçÅL—áĸKi§âés <;ûmVİp8¹Ó1Þ†»9ÌyÈ?TŽJ^ùC¡¬PŠqCçÔ 1p.l –¢£ÏÊ>5o¤ÓˆC¬u¤fu†_‚÷ŽuýÀBK2¤=|5I„Eý„½­/hוú«t:Î׈6DJ_]‹Ânzt!þ)pÿÁí¸®{¬ÍR'ÖLEaãàI³Y/+VjXL òÐYRˆŠE­‰Ùeÿþgã€k„t@DyDœ¹€Gõ(Îì­Ü›0Ïäó ìë¥=y"2òÁ²÷"¹¹5ÚRÞ×Úè§ØÕr¡DæîƒMÀõÓë|WXìƒ÷$Dlâi€ç™®ÀMÙ×Ü_®‘&']k ;Õ ÍêVõæ>7Œ¾sh.К]Â>o‚óžŒQÊa™¤G¬ó`¼y* Ï”O66‘¢Û¥|¶78–OüP˜!‡æ>oìæ¹Á. ()Àqà+‘w£{þÊJIëÎZ‚î{È€ õÛêJÅú“¯fl-N¯´?Œ*€&b¸ÜäesÇÈ1‹”ó#ŸÉT9$nf‹N~»£ÃÆ(ö#êš¾óÂÑ0¬Ê-[Úg¦(¿âO*Ÿ(#†boxÚö×Rpù±H¢0>é„ì0OKq–;ÐcN-bÄC"&4ŸÀ_kYØ()c‘ð[5ãÔ˜žc9óÎ$E%åÁM²×ë}3zYž~a¡¾’ù 1zúp¼síê~”0õlÇç²±N¡gÀÚ«Hø.Fº-ÿ£@¸U YÓÁljñœÖ«¨ŸÑn16ˆFd—ú7;VÍÄ€åc`8ì–!1¤Ý¸ö¬<ùqb/?Ñb—» Fà©Ô,j°<:Ž´ŽP:Ÿù‡°ôÌ-v]æ…ÑNÞD¡·8Ø(S µO œ²J‡^›ô WÞ™ÝÀã/븎eÂWC³L‘Ú,Qï3yîIø0¼j?qqàQRyFƒ :Ô“/×å}àMÏ_œ,£–‘…FN2Œ“¥Íï¥Á Aõ¡0¾ÑFsµ9>Ö’;btb¢•/ø´z©ØZ`b£di›ïÐQür˜¨lçôÜ+ÝF/ìR~%!œ)E­|tH­¥Ù¶f`ã¦Á]|ÆÖ>^Þ´ýˆžâ®‰Vá|Ï×£§‡PðŽ8 >=Ô°y‹kK^­&òÞç>æžÒ{Ž=0<ÜöPˆA=ø ⚬{„.üöBëO"8ø¹N ûõêZQ'ò'Š*P­L­*Vº ûŒV¬w - œ‚y[%ºÖ¾M+O¯ŽQ’Ü5=ÆAÑûm¢]ñv ežX4kí´© ®k;ÑÄw§éôÀi"q>ÀV¬|Þ[:‘厼ò_à:B 4}Âé…£‰©¨°fÀ†6QZ†3ä¡Ô|G—öX§'0ZVâø`e>5l]ÊɘÈ’¡µ D•nâ­A}zù`ÊÖqmÜÉ÷ä5èö®økÓ¦óêæ‘ò§ãÈψ ;ÓãJgˆFD89™vSùuf‘¶ˆè¸0¶½j¹°ÒŶ±dFŽÀ¬R]`ð)eff¥™£•­F¼X–#+¼jS1Ü }åÒQ€z‘ôµ>Á×ô§ ðæh -è†cÙI4³ßu È,T8vªs1§O*ñµL@¡¹–} |š¨‡54 †º;¦uø¾b*;ÀbbuÔþ†Ãe ì%x6O^¶Ë‹ðîòª¡äQ.‡ý6«í£m`éé†f=šg@ùþÄòªÃò‰djeÇ §jö Ìf1]†ÌNyä1¾é‰‘ä3^ìkï„ À‡poþW }°3½i­k<µOÐë…¬áÚjÞ.÷µ:˜8'AËêh1¦ô§‘rît1…äŠÈÑ*ÓŒ€äbG3•µj2 +:ߘæô©Ö;cWw+\%Kl(ÜP}öbaÒò¤Sp¿8Äâ(#Í¢bËØP@8w‡ßP›G©]¸ É_{;ÖŒ}…9ùÀ1'™|¦ü‘ñH®&;Z|¬ä̇Œ´ý‘"ƒ–1&™±ó.DM.Ú*Gƒ–&\=&J€J&Õ¾Ô¹ v1Œ÷jÑ_o 2w~T?æ^Ö§%ï5Ã(Û˜«[Cv¿vS´>±© ÿ­zôa§Ä¤i ˜tÀëž…e웯ŠîVƹCW…í© Úv‰,ŒéGÒ9a†jÌöÖ`ðÒÒoŽÄÆ iöTºÒ,öÊ.iõ…Å:”y"‡(«å_6‘(6Õ¯¨\"¡â7³éÔõu(Ó`=cù}Æ›•ÅÒ!#&g>ùÔ¨†qA¨·'-­qO7bî6 ÏYƒPtÁ֔L‚Û7“+Yr„&«@²̯Rt»š£]l¯’òhÈ|à‹ûèPJÛ7é< Eºc`7Í£øQ¾€nð ¶\á£V¦@ø€6_ö'X[2¤Q*^­ÐÁºD…8®Æ#ÝæçzÔÏ»{m:3Š•4XAÖ‘ÀÖì°-.ºEÝì6‰~›¾•fe•9Ië ³9ŽÀ¥ý«N[fÊaÇ|]úõR·‰s%‘ú7É2 ¨Á,`–4XŸŽŠ’kؽ|¦µk6ïÎ±áÆ†ðĉ Íd€ê‘‚ɧÍíFèy©Öíw_Sp¶@š-q3ÅF¢Vá=/]©y*lìÍÓ¨’Ìtj£ºÒœx_–g)ÞÜD«s´« ¹¦aZKN™çCç”"»ÉÍ®Žh<´\À_·t¹th3‹ \Å7,¬DBk–ïdT¿P£ÑÇØ\ k÷oku”+á‘ËìûuJHêWdyù2åB„¯´à!_w“ÍÑæÛ_0«Ã-B“ªñ£³›UÊÀ0Œò ûÙ‹AD1Æ~Â’B"m°Ó —QKJlôzTÑËJ/­a`£Ø1j“äÇ&ão÷ÑsÏ‘ökÛ>«QvI¥Û³UtÙšÂv«§Šrn£/ ä+–Ðàà´¡#z~ ¦Z? ‚ßt5·+\¯¢Úˆ!Èܘ ÇʪÍ-¼7ÛĽvYÞ3C•‚®&ŒA‚OIc8Š3jPÿF†ýÒ}Ø­šðvðW v±’¥ž‚+¦Á±þBö˜“v§>Jà9Õå9„ÞK˜ÕÈØ¤Vô)|Џ&Ÿjš%ˆe ëÑK ’ãG ‘?`fXKû¬ L žMúsÍ•Â^¥ô±4dzaÙ0_ûZç›Ú,)¼-×ߣW}úÔ®aM êKž9Kí3»óu¼†E´·iàñqI-jNÿhñ¡—iY'ÓòVßã-eU•Ct'ÓŽ75ƒjD¦ÀÕl_çäÊ?Š!ûÊfBV²^A½2°ó´‰Š4ÞÏqàsÅJg¿ ~8¨QW“G“OÈf9«((o…Æ’2ùÞ_(M…ÊÚ}É?ðKÆqm6¼ ¸åéÐpŠw¬r9æ_ý™;6)ÙÐü'$6ÈHL™µâ6׿ŸjÚä“,ô ˜Æsïù’‚µ¶S²/‘GœlYö±˜WrMCÃõžLHŠ#½:AQ,Í™Pâ"ÚËìwüF#«1i¶™}¿‚ ´•L NU—ñbiHÐ6C5áŸ9V¨N$'»ÐÐÀ†øÈÚJ,–S·…~mÚió˽F0墋âB,H„š°`|ºÐ;x:pØ?Rž?—°á×?C›ˆJ®.JO,¢ÄÜfJÐ$àÖ,l|Eræq{ ǰ¿ ¬±MÖ· Nñ§Áã ÙëvžôòÅ‹57Ádž¯³'Þ¯šÐÞL±µÃ#ë še›&`W¹«Iaê]¥>EÎ/š;'­â¼*÷A?Nfš;b,|Œ‹ÃïhÌ)gòÉ¡©½­—Û‹¬Ýz·ñ£ª1r¹8ŧÕn¨ºyܽaܬ7žèZ¯.±»Ï)«ÏÈ'[•eÔ•sëÅÌð`èm’Y}"™Y4,ˆ;”Ÿ£”.&©ÐîŒJ*rðSÐaˆarKW¦ìd h¦ä«:Íkæ¼—©2òD‡F6‡‘L[ux#ŸZEYP1·;ƾm…F– OˆtÑ_šöì›ãÇ%nÆz,DuïìäÌÉùE®š<ð08[œ˜eŒ½ž„¡ê+Ç(½Â鋼aÝM„¢.)5qÁní6™ ÈVSlÈÅ·UŽ®®™“ÐU*O(q·F•k)ÖÄÁM!GÎŽÊ£<¸î⪠´ºHf£Mã@äÙ oY3¨™aTØz½÷”^ÉxŸHJ¥“˜­V»æƒ!K²&ª±ãŒDÍ_—Êß C…ÚXR x-SÏâ?#oAõø9°ï8L¿Á…éð :6…ÛVÏ6£šbÖ¾¶mxûN¤>&œQªuðÔ¦óž²Ê»ÏÅU=C”[|5”cä“»ºût»[yO}ØñV¢ •ZÁÄU¨k€%«~‡ãð©¸ø6Ǿ 7m°ÍÒ$W…ý³«M¤dä–ûJ Jªß:!͆3[叨û8F_6!2Œ¶ÜÙZGAeÀ¶O­ÛëWk§zD¬SYŰ6ÉG˜é–êµB5×ÊÉç¿¥åY^“q è‹¬)pÌ䳿·¸!öšî/åÞµð±JD.}|q“œ$v÷"îW¡Ÿk:+Z'lB&Ý-‚ïc×y˜È! ñÑŠl¤öôìeŽïñkwè“+Ó4¨/œ "=jlÖÊóN-|n¦Ð*ñš‰Œ&&¹ÄŽû çùĪݬuÝ-í†AÌÚ}`ÙËyH;‘ݾ‹2“`r…K=æŽs“u 8ú‡œxdzãMN`4SJ§;¡Oé€ÝL‰ ¯=Ü~ê¯>æ›Õ…}|îç§×GsôM¹´­«uô³ÈA øZîš…TAÊéø›k_©¨kË¡NxÜë¸iHËA±F;!÷‡›[|Hé!ˆÐñÊ0u'Ÿ÷¸#Èß ú¢D€ #¨tNRV²Zflé jpgÙÑO#}Ø'q×{1£#ðù¼ڵ ”>}ûWQϲh–áä>«{ò†šöI‰ˆA@‘Õžåp pÂÎ^CHÚ¯ŒíÞ˜,ÎN‰.š³ØÅ,Á&kãí|^/.+@)ZŠ¿ŒUeKxͱzŒ—C ó!%-­ä}¯÷µô%Ø\ûþëùÌc|:gh•³ì·ÓmzçJ;¡`À ­7ýe¢~Ñä§p­£;W÷YŸ€+¶4O­œ3¼_p ®×yxîO4uϺÅÚc¶†ì £æh€MÐ_?­ ®¾ªí†¯‘JŒé½r˜m§6ÎtÍé-tL".ûŒ†Y´²XYŽ)iä—M4…D"& D®AO<¡¶¸°`eN§èV*¾H»³'v5*t³è‰èõßÄ$¡œ=áïÒØq?»u- €¾LåûiÌç¶CŽ/-ÏxÙ.ÕU×À-ñXãàX#UEfzp±ÞPC÷"3:]*Ù`l*Œ·áØEwºŒ±W‚è~éÙk|=‘¬j~0!7žëSÖ¿[àò·¨D\÷àº3§žvuuAôº¡ÍW^ìWä­‰]f¼$qJ!Žo©í3¸¼¸X¨¨@vŽl™Úa<ØÿCÁŒû¯óŸþÆs¿æ?±23à2³²þÿ‰õ/ùO¬ÿÿ‰þñŸ~!¦g@}_°£ÿE+µïKV–6†vöºV^¼Ò£Ñ³ÓÕ7üq!êÇW?-DýõcÔ4†¶Žº?¡£ŒL iŒZ7ÿñ&õ/ì(+S+Ãÿ @Ê@Ï⯱ëÿ,Bêßbf¡eû5@ÊBE~¾õ6*ös²@‰_¬ …xƒãœ|Y#v0d+ =”}´.t*°(®ª¨Hwmôgˆ–my,ë¬Ø7S÷¥å¬Æz.Íô6Ö»çê;žñÏûœ(..µu·ZÇkgîëÖu!‡ÓïÙ–Y˜éè- íô\â¶Ý ¾å¡Håkë d0^#dŒÕ;SyP­î )OV²¤÷.ag4°q01³{N.‹´¿¬«vxôò|Qm2úÖŽ_ûæn+b fá0•G4<2°“Ð3Pp \úÍ4¼VÛ×u¿Jh-v b³ä­•ÿ}Àþm\¼sˆë;.yç¢obë™5$öÖJ÷ïªN¶Ÿ¤1C8QIø”ŸëgyýÈ¿õ„Cùpµ\¼¦j¤Rc§¸pÄ×plà­öÅd#ýÝÌî±mˆK8«„/%q{(Q\MÂ9ÑqÔû³÷^=ôÝÙ*R ïqà)B°zÄðCÎq•>dõ˜é‘Ô-•9!¸‡ð|pu½ @¹À®ÉfåmF€‚Û@`!Ö#¦ ÿH¨…—ªjÙƒ©Gý¿ù}¥ )]tŠtõ;ì.bä÷©˜ï§C?nቴ²[n×çš"œ Þn>7qŒÚ—'ǘî°$ ¾‚1û,3ÄO01»¹'ÙÍÝŸì,:k«^ ‰î§ŽÅ)ÖúÌi|œ1Õr6>Û:b?Ùªá ik™)2ÖÆx5¦7åбþ\lµ¢Ô‚ee?ìàÞ£Ù¹­µÑrqå…LýI…vï4Pb Av" èñ`þ[9ÉLy(Z¯ð£¾r¨´ùí&¤hu ?39kÙ3-bT~† ÐŦvÆ^Êzl ¤ýÇCßwªŸDÙÈ7q!™|Ò33=LŠÙ’U²#ñ¢éœn<åùÀÒ «rägR§ IðP+¥:c¬ªøáà A‘>QÎÂ'Hz¢8¹>M‚\th>',¡&`•]'ž÷(Ä–ôèæ´¨ v‚‰y$ƒC(ÓEá²ræ“ÚþÈñÊ·¢ñ¥"Íf;´‚ü+3­kÈ”u<ó.CŸ—(WÐy«”cã²ô×:™Œõ¸…¹Ö¦KUIQO›—–ÜÆ¼:oÀ´'ëííxBÈnm[/4)2›—[17ùžWÐó{¡Û‡‹ZÜqßÅ!5AÉœ9A7€ )ñÏß÷0{bV[®`¾ïЀKÉù”vè8ZžT%û0oam[½¼´›âՆ؂›|æ-Ô£ù‚•ECbßWIÝ_¥Kïp׈ {ó9Õoç*®íû>:ãî!âK-ßc²2‚õ-ß“½L¿wœBÈoãî-—zFi–äVT·{ó†ìe¦â]»¦’R-|V[¨{&yœàådÐûú„(ŒtÆo£ÑåÓûíøzÅHéŠM?_ôqºM„ò^s€«×’¨‰WÚRtžÉ^€Ës÷`$áÃcÝW>¤wé¾nœGqœÓs’EYI–"2c8P‡9 á2©.^J|ò‹ó;É›ËO’sÇ»—lGÄq/6]Þð[æðœÞH~?zxð €4‚^«)I‹ `쓤cVÖêºaŽºØ“m.oÒ„Úë&Lh¨^¡Z¾.œõDªÃPÇG+.'Çæ¶×gÑŽ•4¼„^­„úÃ"€›g‰ÏéuþŸ¦Ç=15±—÷ò™1Z*>Ê–~“ixIÅÜ%};M|ÔäDÃNHàdưBf""ÿêäórn¸sw¦TDÏÕžÿ(l‚ÒæïãUczÈ•M_JõÈà=Z‚ñPHŽú®ÚÏoP-U"5.6çcÀ†às‰ [XòÀ'†V»T<Ô ~³«EpM®DIÉg_ÀâHßÓŒÏÓ²lÖ¯Ó'”‚‘O3"W …±’0p’¹Yèn3dµŸãÉ0.±nO®8‘é»zȳ´sýð?M•\*XoËê)”“Ó÷rªX29§ð‚ÂÆÈ­²×™P1bÜÙE¢Ç/% ?—JªékùŽ„ç´”çA ä¯$qí)Å/ÔZ=~A¾£¿ap×C¿ 0F?V¨’Ï “È•Ð7•¹RÄŠÃ!C;$Ûô %iöÂEš ܶ½¨ÃßàÝ÷?£/‘?‚gB(!V$Ó—oÁiuyǯÒçß t…Æ o•’p4D¡¸"d$+{‹Ž9≑¸Ÿx ¦7§B…:¢ÙV¨9–W Ã{zÏÓ\ìú2 ijŠ8ˆgfźºê“@2²ò->÷c¬úª5y=ƒˆÌØ5Þ,ÒÙ‡4õ3»6·'4ùækßẻÜDþ˜JjD\oȬùÆÇ ìÑ‹°|Õvî1Ê­Te}Zê943é ­zŸAÓøäÝ-Ïlä§>¼BV-ÑŒq!§Æ…ÚJÀ¸Ãi✔±ygž©í)«dÎî{AÎ%890ˆ»0Mg"4 I•R± ø¥ìÈû ÙXVcŒË/dû @£ ÙQ­ÇOë»åYÜö·fÐsRÚ‚,µ¡RšW@nÓÔ”{¨~Àb6Ïí.Å=ÀU¹ºcÁ¶ü|1í"C¬LrØ ‹Ä¬—ÿ SÇÄ£ƒFoËÂî°¿-6œÉŸÃÁŸ8nsWž^.Ý/3§½`²Û“ͦ¦ßÌHÄ"8&>ä'#d”3‡@R^ß·•…wÊš´&hßèÕvݹ™ÒIÙ±~ŹŸŽ¡‡îåÎÿºXÇé¼Cò5·!RsFàÍÀÙÁܡϷ1Ê[kFõ:Wží²ooÇwuY¿Rtâ@pè>§üD´+aå#z~ƒ¸“B‡<^"[çgbm*• uÚÀ0Æ]×]XREåðè|}­Ä)|aÂ9{qyèG~E{CÄ~ÑG@[?F&yBýV%ØéºÑEPøwS‚y3Í3¾É[â@Â^夿MI3é.°&«Å™j*0Ñ‹×&0$ ì£~³ZÙxGóâÎÙŽIdùb BhIf¶T;Ls GÔîY‹ïc°ðÞA‹¯ò¤\9 éeŸVXï°Ì.¦©Wí¿yìÂñVƒÙ23xÑÙBרL…ÕOB€‡Œ_•‹LÓ$ɶÎïnIÂB“¢B#~4wøàFI<Κÿ)¥ã˜4aÔ{b9 ȵŪÔý,9‰‹4Ã,pÿt´¼…4Ü40ìC”F•¯ë{Á}µ`kª ÿ^ºROXM#:D>(ÍÞÒw€ZBÅ*X~j™ç.km!ž-Ë^{ :8Š1ÑIYÎÝÃU¶9j2d½ªüŠð ž<UøÅ›“"(ãA÷¨Ïߨ`ƒ51aßL'F7ÏlTñðy¦“B%«€Ÿ™˜s…¤\ÊB0}v[>ã騽}¹ñÀÛ%µé»#ob|QSº™Æ }D$j (ªÀ`ëR&úæ¿v®">•xbåØv Æ;?¸­HUò-4SÄüYz0*&ôã…O:ÀÞºvô§3‘*ü¼ìèì$ÌãiùÌùMG•lÛS…íã‚·²xǰܪƒ|o ‹œö¼©‰Äoe4nPÂíì(Â, y>p/t‡gоóÅìÉ |YÜ ÁµÛ4` .Èœ„ë©»ÙñäR’ÒÑ¡£·þ"º&Žê2+ã×AÛ£<×Ù€\À_’q]ȪÖLD6G)AP‰½H•ÑÈ;ÌÌ¿URÉ)^Q–’ k(*Ï;1a__JC Aä¶L>ÂuÝ_X¥‹n¢V ‘’$.Dâ9@Ø‘øœ Ìôù@叨–ÐÖD¯ˆ'ryõõ€ç(£â(¹ziä<-ÿí¤ÝQñQøQ‹íÓ—¹1#æ“dÇâzL&W"ÿDráT›´‘=â/‚ Ã` ºD"Ôéy&OÐU ^[®ÀÑò½¶—Í%©’ý“RãÈäCª{ÐP,…„…1›yŠË\JîLÂ^ð$ï‹ È\ÛG #ãt3¡Ëjỹ¿Ð ~é×]çñ˜ZðÎZ_Uš…mÛŒŒyýFé}£¾ÓÂ]·ª¤0Á)š¡õ âªxôöÞ’¬rò4rA´®ÞA¹/Ü" ]““Rò4±uCc–YÑ;HIx+=2(p®²&¸Ur˜L%8Ç |ÕbâóeÏ…äø‚Rá-6q6¢—§öò%›Ú!=$„o*\e`íívèÙ¼`8ì#²èäbÜUºÅp£ECsRÛÂw»ü%ÄÎ’³Ïr3Žlý-…õ¯£ùn{>ˆx'… ô/…Qn«àJti}Õ;ï°œ›-δRvîJàJßÊf p)q{ |Ké^ζäW¬ÛŸ‰íåé}ñÞZ†ÍðyTíµüž(BÅC~Ddrj¸€rRÛ ºÝUØÛ¶ÀŒä«P¬Œ™ÎÀ§Ï‚Èø)ˆrô‹¯œ}*ì§®sát;»÷ö—%H>|z³w@3||ù…=VŸ0>ùèT3•d ŠíWÈ=²¶ê¸î&¶ª ÉU›5Æm–ˬ•õÉ'[Å‹|¬j!kñƒG߆JDªÆ'e¼êi   Ž>¯«êaÆòÍ•!]¯†ã,˜é-ŸRB7$ßUЯ!Tñ 'ÍŒÖØ;>Ø´ëë1â°`Vûl //¿.§¾„~¬¾ Qü6ì<âÞ¶£\ b²'*~|º~qœ!- £á?ß)B·š;yˆVã1ÿܬ&›¼hA‹x¡©fbÓ„hj·Ÿ%ÑzH‚9Ÿàmµ6qiw‘þÜþÆõèÚ&þ¦}Æ)dNÓÜ+ 2­ÎÊŠÏYL¥Ü%ˆJ|½Þ¶¶?}Ý­…{©·nꂳrÅÖäúR©yL@u!¹|‹V…óîÜÃ…ÂÊõíõDíë·`åõô¯ÝîÔÏż¹J1¼9°aÎ[_¥ ÝoÖ£ ÑDö¥Ëw=ðKÄi-@SlO¸ÔLnb?~Zßhž³–”^  ³-Ø/¸8øVí\†aµ|«`Ìrp´#ºK€_‹õÅ!!öa]Þï.KxÍ8F-4˾²›]SslôÚ §¡}¿ÎÚÝ.©…;l\ÂÈäPNÕh„·oUDãi rìš)¢SzÃuPÆNݨâÓuJäç1FMó–ùBE_Ý­{/½0…×jüèe·Öb&ðèoáI} ¡¡ƒSš¦òN“ÊYµï=“#o'²meTA%Áâ Ÿ(¬¢TÓó}81Eõ•eà9%}ǦÖò“î®> 9¾h@&á¬4²‰ëUJîôÏ# ÄPÊÃr¹y}9Ì)–ž×ðÞ𜔙h©æ;cç¬ Â#ß>߃Ø7JŽæ‘½,îˆ^ÑÀÉLÛzvÉÍÇY窤î*¿s®Z4´dZ¿¡YJI­·ïâv"€õòxBé8Ö¿'¼…öÚňyAÞ÷õæš~êZ›˜ø¬,¬å¡1í|Cé}Og¼úñú};´°ÔÝj;ÃûÆ+Z=eÔü"e Çþ«kب’!+ÊJ˜F5YG·4RMŽF74œ/\oo*†¼¥€nn e7U'eh˜ŒŸOâ¾WEW2òžXªùm<¸Ìµ-`q¬{ã|H~¤x¢>'8Ñ P~ØFÌJKA#’ŸM¤c~.Àx,¶Û&Ì—ø¹k ¨+¹x~{ÈX•훲ÿðàiê¸1""b$&O±3ÊäH ((Q6^È8ô©pýØwÿÏÙw†´ÌŒ´¿!Ñêëêê³00Ðþ¿`ßýóQý!ì;Ö}Çú¿‚}÷_Ðë¿Ë¾û'õGŸãÿ°ïþ³ïXÿ!ûŽõßÁ¾£ÿ¡æ¿b²ÑÓ2ÒÑÿ–7÷[î==Ã?þ£§£ýí¾Œ´,¿åÒÑý†}GÇB÷Ž=+ëoØwÌlôt¿)ÇÄðËïÄÂø[¾ão™{Œô¬¿©…á7ü?:z:¶ßhÀÀú›úèXÙ~Íü¯³ï˜èèù˜Ù˜„„™˜hYiÙè™Ùøé…øiéøøé¹ÿq‰¿bßÑÓ213ÿ³ïþóõ»þ¯VÖκvV ðïû¿Ò1|·KýîÿJÏHÿC§¦ÿÑÿý‡·ÿãÿú?Îÿ# Ãý!óÓ~ÿ[T†ï^V¦†¸ò†Vz†vÆÿ1lÿaûÿ[Ãö÷Ç'//$÷˜žýwÈ_òóþ¼‹„¨¤¨‚ü÷]þ´ƒ…©åô¯vÀý ‰`@ª­-*¥ $ñ#¸OTBHŽ —˜øWo:Z™ºhk“ý¡Â÷ýBà÷]ÿ"Ì?yµÿußcü%¶Ÿ ð&<ð+ŠJŠJ‰hÿèê.%­Ì''¥-€K÷Áþtø#þŸôûá¨ö®ö†–ö:­Vò;¾ÅØñû)6ÑýaŒÒ1ãêýp1noòر§Äe ÿþ›éwóÆÆÊ÷ÙôO[¾ãû쿇ûCËŽ÷'÷yI>yqmyùÒr ¸¸´.,¿_FñOe„ÿfù¤ú>ùþ©ž¿]NñOå„ÿn9y i)‘¿¨OâoTø§‚¿T¨(ñg˜äßn°üÇú¸$ŸÊßo²âß/öK«øñwêú¹âß-õKƒ¿ÿø;uý\JñÏÅ~î¶4äääÆLþ 1øŽ ûiÃ÷nù½ÓþˆsüÞ]´Ý¬í-H.ëèfåhù,ùóÐùëîÿ=";]cKÝïyå{ %µq´7!ûí?äÕïä1vV:Z²ï#IßÚê—«K]×bùáê{\ßsêwè˜Þ÷ϳï]ôçÆüBÞÃ%ý-é¡áãþ*Ùo„û¶ðχmmCö˱<ÿ±t?Œ©•ûÎvø•p¦ÿ«…û!Ø ÛAþ[eû11ý(ܯ~-ýÿjé~ ÷ˆ÷c~øäûsû‡ÊÙ›þ¨Ü÷¢?Ìkþ÷È&(į(òÓ¤ôÇÀ¾_bhþ•¢?½KüSçüwÊùcŽû{ØÞâÇüc9{‹ÿ­bZü®˜?ŽìŸÞ#þ9AþÆõ/]ñŸÈ†ö?gߋڻýoÕÓíïèù§ÁþïK•¿•ôOÉóQ½áWê:þßU÷×-ú2+þ¡2ÿœRÿüùô§¤ú—›~•]ÿof׿lÏßI³Šÿý4û¯\Äý¹/ j‹þÐ…e62 üáÿ÷‹P\r#ƒ~ü5'ø]i»ýié™Ù~ÒÖÂZOÏð‡‹_c+k»Ôøö³F:ðOý~0Žß;Ö÷Æzþ ìþcÈÿ£ÿ|¼%N5!9iÒ? @&6†ãsÒµ3ý¾á‡ö¸ß+ÕûárÔÊð;2÷Ç¥–_âýù¸ÿ(Øßv&ÖVöÕƒ¨ýÏ÷7Ýì;Y˜íûxú‹ÞfÊÀÊü½·ýíaAJúc½ßAô?ª……i¨Æ÷—wþŒ®¦¥þŽ!ýéBò¿.áu¼ÿ)êŸõøQ€¿)柇ãïjjå`mòMÿõÏzü³šþó @¿³þoiþ#]ö»ðø¯t,´¿á¿21Òÿgýÿ~ýÿ?×ÿÜøÿ1Âõ—YÜ/)Žô'ªþwzùwù‚ŸXÙë[üÐûúíûcm”5Ç55 üíÃßKÛüªìO“ë9ýTÕ÷W†V?Mi~Îì?Æ£ÿã£I?C¾ äÏAüÀwüù÷ʬì§z(œD{BþÁ÷íu µ­|dæ€þýüÏÈLÏDÿWüOF:úÿð?ÿñ??«,[­ |ðÌ®29á¦ìŸphu5~ó¡Hæ›8PðÉ$ífŒZAÅ%ÌÅS4Ûª$3M4¨0Ï*ó±]éÑŒé+?ênÀ ÷êúuõýWGÞÓ4Pçpmd .ÂÕìkÞµ~Ö÷C8[«ü_¾ŠêÄãÚ™ ÆÞWWKUͧ/Ò¿îwï2Bæ¿Þ²Ølc4ÀÅA™Û¿ù6ÛrdwÕk×A9èÚQÿ(ÚÑ œN)_EëúØ÷8\#±ÜNŽa›Ð_ RùÜ©;³Ý‡âÌ9ÔÌÂÒþ,ò<ß&›NPkŸ ɉö2´yþ–¸-nµ|àÀLœ§m_ ¡³„W/¶Ý®6%$7¬‚^«·>§¸n}¸‰(Ƭ?» ²¹/›f: •gõÜñ$Å.ö]ÿ:\‚Qú°äÈ)`4M‰1A÷ÑÔ;' ×mD’šôëL@î^ô×Alr÷8ÑôNÃô· ¶nÉö(qÃ|, ³QI3?ŒØ$IÀ:ÙìΖz¾E¥¡O}æRsE¨p#2'&{uCÆqDV“ºÍÈVÔ¤áxôˆ>R´m“6'HCæª( ,w¥Œ±ç²ÞPŸ÷gáæøéÙ ñ÷ÛÜÒwqè¢jS¹@¥r·®!KnA™ER3;qÁf—½­Òiºüf5 nÑËçËý­r¦ÍN=ë$cÕó$@ç¶”}`<Ðav3 «Ðš¸-KŸmØj?e};ò‚&ЦÁÇ·ˆJ÷!z|FXMU$Å}‰#\æÿHÙèç°hèJ5Õè÷¥” EœÇ1œ½GCdn}w™6wp=i¦Š>ñÙš³[\56œ(ªð}ê€Tý¤D\½¥M9É×ôÑväÔÉ0  ÜM*nåJöF‡êC˜TîH5¨ÇèÛÈYFÅ4ªÌž\?ì‹61mµð¨è·Gà‹U•ùãûé¢h¶­­;ƒÅ7Fϧ’¯U¦°ù jV¢¡üMý­ çÐm=þ[—nÐYä`FßÔ Á"Ò5‚ •‘@Çð`ËûÛÛåí("yÆÀø©m0+ÞQ-s{ÞW¯Y}ðßf½È ÇI޽>Vò›Â™V`=UÉyJk,º©©e¶míhoUÑöX-¦æn·%Æ %šÉ9jÓ¾¬1]?Úï*Ä­¥Q4Û “§ Ö§‹­vª‘Ë·ƒßpYÞ³¡õ¶ÖÂ$`wêwx&5ôÊDi›oÕŎ‹µä®ÕÜAóäcf¥ÌñàäLVIš›Çêw†ß©Òö„`UŠÃ~WÌm–ƒ¤.ጲ˜¤øúPùI®7–9¡fY„ÚòH/ä„c†›Ì£é©€È5œ¸óa¢8ÈtçzçÝì=KÝ´Urcôý'ºÔl¸/y#Œò…³ Wú–O­ƒù¦]G¦d„å•Ë(âœir:mYˆ°ÇBšæ}jŹ„kû0tKût4=€É WïÙðÔ‘à€‘=´ ˆ:e}‰ ŠÈ˳ å\q&?—ž'Œ7Ù-®äKhJÄä5™êÕߘuœá1[Š$_,ï˜ÖS5šñmnlv¼¯X[TÙ{ª‹4ZBÖ|Ï¡–lÜÿ´ Ķ% ÖhÞ„TìW^nP&éHF`Ó½UËuqèAbÖrhÚ¦le~"6ÔZÛ[ÅØ $"c´0y§HÑ‚G6°Øž0ȧ'ÇCé­² Å›ŠpÍV]é—gqdº³þM½AófT®¡¢RÕ¸wf<¡ÃŒú KC$"äÉû„KBnÆ=ýö¶YÀ7ªÌws•–„pýH(0 ½ „¯j/Ÿz•Dl¬~kïì]]eE-z}çOŒ‹éÊ1ô7(j^^Gê"NY¬¦/›_ W½AQÉPx­®Z£?µ §@'0ªO°{Nå+^LòÒÌ¿.|º8›]¾C: ¢‘žÈ4±ÞÔ—S‰€sÐ=N óµ 6+9„R]·Øßéuô—-ÛÁès“”gQÖ~¢³”+ä…KœÌa ‰17ø¨AdGÿåèqæn±Nu¢9òæjÄÁöòK×5K¢Z¤Œ2-Êë“LgÕQ4( ­±…¬¶zuG7 ÷6>f¸X†F†v(¹:,í§·“ò§$8Ðx¬òõ[Á¼ä|@zQ+Ó ýl©¿‹/ë©ùV Í.zóL¼šEO$â’×ø¾ÒóôìM]U¢ïvºyÛM‡ý¥| ¯,‹\Ûô]n+µJº×=ôî‹âi ÔÊ]œCôüR#žqJ};—Þ´Þpß°*þj²¢ìêæ¡h¯}›¸¼sÿ†aêb³Ý!k{8]hd‡ Ó\Û(ëôÜÍU‰ÆkmŠ÷×/o«êÓo›BJÇDÿ éÿ= ©‚Š šü¿L!ecù5!“ùOÒ?s&ùþk<á/lÐ_“@-þŒ&ü£øŸŠRr*ÿ“žî€ÿù Bò¿Gý5ô@†[þ‰Jû+èߥþRëD•’PVù7S@ÿ|¢~äþšJûèoi ¿ÆÙÒþ”öOüOÚ?Ñ?ayþ}òçOåÙ~.´(ùóos?yÍøëãþÿ‹ûÉÀö“GèO«‡ôo¥ÍŸ( ,ôßQB¬ e ÿ' ´¬ÔðO ¡ŸñŸßIŸ<Ô“Žõ/¡ž î2òÊè_èW” )# jZšW“–†ÕçÙ—É“üüÔbüxá#9p ñªÒ÷¿¾—yMÈëù©=ÑT¶LÝœ"§n;¿náTßh>sÑ>óxä4’#s55Óý­Ù~¬eýÁ«*:(À‚ׄqiO"VP-žr%ÒÊú},£Þ2Ø–¢Р7±GÒ@úŽüÇùFgÖkß–ªÎm\ôo¼¾Œ¹õZxäìT‘nW “k^îûÞÊzÎߢ¢ÉcÞÚ?Ê‘“‡ºù?~‚&ôƒ'“&$‹QÆ¢JÜI¼óÆp$<ú”ó‘x¬*äQZäÍ€/f”¨Ð0qꙿËT¶FÅ·ä#z\”~ŒÿáQaX‘Ä€àYÔØ÷=‘Ï?LÜχÀÈ<>‡xqÐîPDÓ9ðŠ êΞî飨´±í} ®(̓·20&4cl˜Ý¼¹pA®¡ÉíÜu~ô fИëåñHéx2?e©^±à)*¡ï%g ›`Tæ¢U‡&-#N ˆ@ÚÛ§íèâ¹½”V6¢œ™Î‰-ƒémeX0Þñ2 ¯ÇTBø¢j«K¾ñt¡N=Õ'Òódâl³‡ÅK¿àêS5˜l%ÍÁÛ’7ÑÜ»-må¹Útt77ZÓ¯êã姬ً}F&ƃëÆE€½­¼x]·µØör\ç\[xÑáÞ„°éâ˜é¢ë¼€ kÔ¶Z™ó!® b0$l¡tÌ5-ƒ]2 T‘·ƒäº b†t%+=3ر¢Hʧ‹Ù `]s8]ê#·j; ÒñSÛ¨©=øÂ(l]â Q¸šûÊ”,=o!÷]¼|ÉâÖ6UÅí=8MwÈ+RùþmröxjI#«£VKtÈ·OA†^HE·0]N^ní–†fIÐV€s䬳ÔO,¬wZêÖ6>l:Å•(oÍQóˆ¿R+/šãÃíg^d¢÷P7 ûÂ3Šhd¤ãa?ÕÅa€=1Õk3ºø48Ó¿}%y·ÀJ>ÝÓ@;*@› öZ,"rľÀøiÓê xÇ_QZ3Uz’‹káªc¥õñ„àR tãúfÿÀB滆1§SÊè-¼íëye0íÓSÎ:¹Î;õ’NVêó¦?t ›5²Fà;ý(áôÕ5|9›:U{9ïšždpVB4ñ¢¸ Mòf[c÷VªýîTn2R•;í­Æõu/ƒäÉ+àÊ‹þÈÞD¬0kRV¯À LªJx¥T¡ˆCnEÈ4<™Ïèši´È x’ í§ù’ÜA}g ÛÙ'õü¦Ì¼ÓBúÎØ0<ªÇÇ8¦€&Æuc&Lh ¨ZÆ]¾ÈןZ[=×NWð°Ñ:„Oq·¨ ^›…ÞŽèYT\Ã6&„½|JÕð§ÁåÑ„¢!ƒ¿˜Ô°0kô¸eÐöÇ2§0CÄNî`Ûñ ÕYãm¯e6L®ÓØÒ£c?n-aòzŽŠ¦¢ëÖ€ B˜m¼ÝyÎΖÏx¨Q{Áï=í³¯˜W߯yÍn§Àõ‰Jp¼ŠGˆªo£<½qÐððÔT g¢¤~ì3YÎ<[ï÷NY z†´¬¤]q’eæåkJV^–›é¼Ò ¸¬SË€yƒ]‹\Y¾ÃÜ|Û8W¥ÓÈ©]ó·S’s­€Elªä4ÈQ¨9{bs¦‰´„¾#ÊËíwl㸀³Ÿª [­åÖ¿Uú©$+ˆ‡÷~SüÌ…•¹ê9Å‹†\àνŽ16õ>qZˆ ¬l€÷ôU;Br(¼àœªÙ±“g›Wýc¾C·ÛÈïM±*Bz¡Z¡¯zH÷»| ÉÞ~yÛ¨<&‡÷õ– ÈlZECtCÂú0C1;œUùïR³#à\¤@]¾yÀŠÇOíWEb‚úv^3†¬Š«kä P¬ts?g)‘š;0³ãHkÔíòխ˽•iNwѱ+,a=ëuÖÊ2`JqD}Hß6ŠT·‰ªn0ÒñútWÕÔ¬;@SïåÊ¡SÞõùެ&«¸GÊ Gfe6U#RÊXÜå–Êa9ã–Yf­ò€[^3‚¼Euë¹\€«zÎÉeR×´˜”/4bmP3¨xÔ)«uè¾#,Ïk’7³¼7XF¹€p1‚ü.u¶Áä½cÆþåùó¬È°r0À’B•ü'Áš‡*ÚŠö¸ÀJz‘M«·çË£ÔЃ°Ì%Y sZì’© ú2­OÑ:|Z.†ëU¤Ê²¬ÄÖ°®:¾Ù®›» ‘X°ÁñnšcA’éïwÖÏñòþ`Äß¿Úù3‘þ_#Òÿ1`Dþ¿‹FTúÛhDã¿@#þ FüC±ˆ4®ÿ0"ãïé÷s|ÄÜ'ˆ9eÕ?7ΕÀ’†!l½ y'ï ŠÊïCkð¾è=¡/í@AHD˜ ¹Yïbãûʓڷ«Ùe÷'«»Üô¦¹e¾3wÏãŠ&©9±±ú;õ7OÝNòß=à¿U“ò‘ªî‘EE×gRìU§´È§À-€¾ÒÂZlèÌsÌ·Ì£­eCL T¡}w€w£ôJgÍ‹u|»àû"$žDù’Má­Ör„pgóÀsÖl"&8z uí ÛÎJÆ—’rD öN:¾‘$€¨õ)d¾åÌq$±èy„r=í€ v!©~•B(î(³‘‚Ë¢ŠSO» Úæ‹µÃßdîW‘­h«•닼^ñäàr§;Üׯnÿs¢9„«Pà =<ÛV L<ä"¡½8›¢”Q–CwPjüøÊ •>¬õPë1Õ¤ßÜ'¨œpp‚pÑ%¦³ÂO‡Rõ€ƒ„W(I¤>‡c×DU±J ¦\&yúxvYe®R÷‡Ow»viöcÇÂìŒ+àÞLx~^{í//ª).”ð‡mÃÔb§¶›áðÚd6MŒ–Oœ®;Ü/’¹·é»D«`X2öhÚ–í„nÊÒåf©ëcQ=”ÉaÄœ–Å—ÿ†¿—Zù ‰m±ÿJƒˆvB {¢PÑ×HFß„nþ¶¹“ÐjïÈ$¬ ŒSÖo@Ö8YÞ%:C¦SâiÄ=ü’Uj„HÇ(£CÏj¿›Í†:Ý´nj²2¿(ØÏÇãÔÛôåuÂ`ô• ž'ñDí’Qñˆ`V÷Á5—¼=cJ¬ï±aƒÔ\4‡¢ª¼¼šQ¥ `V1ÙAÐçò£c>ÃX£=Ø!cP=ƒµ4»²hr7“ ì³³u½-rû×@ Üc<¸!w½%P:Ëš¾Lá°;¨‡›LÏ“ÛáÒa*ÍXk”ìò›|bøAø·ò ,rH䮪ƒxµcí èVšPÖF:ÂiF\Ë)4ó±s×/+–pê¸R˜a R¶NW¦e0cÁÛÌ3tÓZ ¸íN«xü{†;áð¼iBH&'”£s¤'áSߺ€§ î ©H„+¡ˆŸºý2m˜ÜWÜ=è"·lT‹ÖÏeyœ%o$·çiš½lH\QÉR/ñ䳆? VŽŒ$!o»®táYdÛãáPIÞTºeš΃{ì)ÆŽ'&߆êÑa9?ÃmÿÔ ¾&G{Ýgms$“ÍY½NcñmIL5—35)>™ÔW=YÉv]ÅSfŽJ0\–2Û:ÐI¿÷å0n *È3õD@I£3x [&Í–ß3ØÏãRC&>G&æåÛúÐ}î>EÏ%R!VÊŠ+xl˜†$+S.áì‡W¾Æú‘£¢t°]¤¢£47q  ÏIð²ÃÎ.V[}ç9¡¶åÌò/›XÃĆÈ탓çÚ´¤þºïÒ 2c|¨ÅšóoTÓpÍøÅüb u™@G°Zk:J÷×›35Ÿ¼·™«‘)“=‘Qà18-árø™€0n—RX2)#>ÏžôÙ?Â}¼» Ï!᪲‹k¾h+ØBµµ¹ž¡òY¢¨:EéÔ¸d±QR‰lV@ðˆíåwмbDLˆ]eB"°¹qý6ÛÓÔ튡AÒ‡RgæŸzÏ «jªm)ÅÔÌ×å¹óQ\[$/Q±·JºrÔHÁY~8Õw! ÷ 5ôζK¾ž&‘S]¥bBPbŠŸ…Ìü#IS[¼êb—ÙÚØK(Œ·œ +M$å5©‚PŒrš*²vjQ<€ÙÍ鋹óØ&qsüBÐVÉ@@BL&0Íôƒ¨‰$BS-_U€›Œ–œìLC¹èÌ—5Ô—a.Ýõ-­®±¹â QÇF•qFŠBä!5"– 9©sÃ1®{sžãXªâážÏ@•Ò›^Èhµû´‰œ~§ñîOø}VÙ–îK_“DUÃ6Ò Ê?t^UÑÞ_P¶±öø95÷Ša8*(¹ãÕ sIÐ…ìùõ:ˆ‹¨NŠC¸¶ d(Iç¾/À38­;lü6ÆáZ÷¾‰²sŽþ¦†2Й»r„âP1K6¿ƒ·‹ñ“ ©(oQ÷pP[r³Qr­5hJæY†U몄9–Ré'@OÄgpÈDã(ŠL¹ˆf$Û[C‚¼BF³Ñï6 êQîð¾pÂé£^Æë¾ ³›ÓhlŸá=™U´¦ï"Ò˜ÖcFK+/âÚ²C/‹¹4Å:P«I܉ÛNXî¬:.øÁÆZ75\Á˜b!LJ‡p‹íÞ&*”ø€ì "Xˆph0wu>»5À&´ù-‰}V,ÝE÷2$*1ˆíÌ.›…¦¦âuŸ9› ,CGx ºdÎ<Þé)rÚg>ÄÚÀÜ[5º:¥ÏKw°²²µ m}ßlTM XŽ›m‰Åò™©“¡]ÖîÖB\?ùƒÀxÏxå0—¡]æÖ•–¶¥ØÍ‚0þS ¯ªƒ˜‰#r€ì¸€•&#œwW´IL&øKNEc œ…Ãd&"¼&ñGu·Êë[îšv‚u޽Hi²úŒ6Udš°èöŒ™ŽË4n@©$/Ër¯¢^Å'ײwWÏš³Ïu‰6e©é¥¹9”PõÆ [ošì†¡ô<£­.]šSPþ´Jibæâš¯*Ì´ÕõÔµh^hý„%L4ë:¤ è‘J9dÀì2 EiB“ƒƒ“|\¶Ê­jeè#â/©òU›ü}£½3ꪓEù´ýuÖ Ë*$xÙ£”/‘Q°ÒcQ3i49ËÚËÖ)¥˜Ÿs(¥yY‘T’ŠšJjö+íÍc–óL°Óžö‰l·‡-áª.3½Ö­üc5iäÁ“k½ïª§ÔɯÈÅOåGœj¯}kn³`^}_6¢!öq#Ü«: ªgE>–z"±©[(Äè¿L Í‘'èl©Ã ƒéhÙCÆ „eX2xr † oõíÒ÷ ݇F¢úKØã`•÷ö¦“’#ͯçÃäMHÑ[Ðæ2£ƒÖèbÃ.›ŒÓ¦qJ qèJ+ª=N|̓µ~õâ Ú‚&È(Y*š½ƒž‘™^¥ùÍ"Yp~¡¨}EC¯ïh}Üâ {T¼»5[oת"&[f=0ô¡Å8/sº›sË‚‰‰…ÂvIþ²c(ÖIæ>tö˜•T£»œ¤6V!¶à‘7©›Â»ën3kÚF#<<ó``â’$ÔqJ¾ÖIÑx•™qÅï¬.hk¼Ç<n;sžZ{`ûþàzÇã©LH‚eBµ¡Òµ~‹ ú‚=•-™m˜¹Ók«œ»é ŠŽÁÙ+²{È# ï=+Îh0žJùÞ6"¶ÔFÿA /–ˆÀqZÄÚYTóÀØ> ê;}a<”8s<ä°·½—°à-c‚6]d³]«Ê*R×]«„³fOÇYõwÞ¹¸Æ½TõQѧ›õ™T µfPJn¥àÈ(ÁZˆZˆ)uú„å÷3s¯nÉóã¦îK¦XQr,f ¬Œ+5GÌíO=Z Z»T'ˆÓ9­‰móið±9L!‘’…Æøno)£K¢šˆ!(ÉnØjÇãñqg­‹äÚ³wÔ6B‡¿Á­ê^ÝAmO¢Õ€ªÏ¨.Û¾/´)¹‚iFt]øäŠrd»´”¡6!IwÛ(ñtÓröÂ×LÎCgý וæ}( 1|` SÏ-œƒÓõ]xk·…bO³£Y|jf°·?Û„³5UŒP¨—¯X”e®\z”és$«VôòY«CZ‘N,„Uÿ—jb@å³Î*p ô1‘«Þb¤L4gR:r‹Ý$–d ‰N€Ò0ªR{´Uòt:ó+ÖmÝüÏ߀ߺú²)XÏØ—–=Ý«•‘=ÃÖÉJ%ëOr-â|ŒµZ$Ùmý̇‰´å%` °Â¨ÁÒc¸f‡¿Œõˆ[A@nÔÛIN¼ná:ÌÈ"0 "ž²/3>µUXÖ^•ùšxnÅãîqçÎñÚ<Û(€ŠŒ¹z‚¤å_éqŸ@éiQ²oWž#拜§JtîvsPô èòîTå±¼-ÛWñ9lÆÃ”1R©ýú¸rôyÃf{ÍhB€n7[¡¶®‡p^PŸF, Žø‰ŽíDå ^¬ù*òÛ qxúzT}©øÒ7ÏLÇ4²!qµÐ0 ]§^5èŒhÇÆ+pÈ äˆ8k¹‡+ÑU«¢›NÇGéé {B¤9Ê6à˜íÞÞ~n³„{Î;ÊR­#èKRlÏfÈœmµ+ÆÛÂzs;{Gìm¨däWž'yÚZð´r³Çë•$ßo/±Ö°2;¹ÓqEׯ=“'8€ 6•–ÃLW> ‡ÃØG/ì43As“óê£ÆnÙo´ïÈ2»àÈh¢y`[p–êvЉˆ«zTâ©rI<#(í¾fŸDÇÁ~ ìˆmÔe쨚îœÄJ2ÓÔ.AR0)½¹“fåc*T‰ŸNx€óª•IÄÉL©r”MÖO0å³WÕÔ4—Ìoš‘ê êé¹v° ¢žOéfj“ (] Ê›w+ÈTUô6€ +ʈÕëâ-9(ר°ý¨ŒXVòUOµ~!nͬ²Ò¤î]š;tÐiÒ%?Š£h¥DB¼V=™¬§Ú±¨ø×Á£­0 m·ÆêÆO_ÚG ™†sJQœÁÐíÕfÍë†Ìžüt4©—Ì ¨h‡7ÅŒ›=,˜i®Åë3ƒ2ª‚¾—p|èèßÚŠºpMʉ¿ð4tË!Û¾âgZX3ÝS@»´ ¨ùåÔîTi|óõÆ¢<{øà}.íý}Éý~«4 Ä8Èâk?~r|ôÊA Dà]A:¦Q%·mPqN0I}ú¨»­IÎx„£ÀL$Cì“S¸à0HêÎ]è·Ôb!Ä3«¶fj‰Q òE¥Ùý(N$i´ùqòB"_">Töz}Ëé—Qªj±-ú”^ÊuS¡¼ªu¯uo»_(òÀªÐÎâtË ·qò4®¾ônAªjs®k1ƒåŽg7+`3ctE0@*}ùq{Ù{Ë(g1ÃuÙ+óÍèÛÀ¾÷~çx°iÍÆÒOløBþ~Á…‹D• A RÝêIa {®rÖ´¡µV¬b®+wÝÀdŽEñh¨6 œÄïžÆ/yò_‡%þÛÁ¿†%²1Ðÿ±°D†–ø•ø{ËWJ4Ê4º4z~øgì¡‘µ£ÝÃ>ü…|øçÛ›?-s™ºü3àC—ïèÃü‰™ù÷à‡xîÖ$f]:øY=K¥–ú ü °½5yB¼Â |©ûl°„¾Dx„´® ®ð˜Ÿ ¥¾•4 74&.M»]×Sï¯5°…»g{ƒ?½í?œ±ƒbc,¹W5¬iž=y¥û¶Œ|E…îËë HH)¿y5%“-{›—É‚6ëå<‚“ð‘{Ûdª‹E¦ëÂOÎBÖ\%MNÖ?߀Ô9‘¾— ×zx„xÛ`™«p?ÎζX¬w=:x~㨵ӖPâ×8bºÆi¡4=$£+Y쇗˳¯U“ì¸TI»[O|¥³e”M}c÷Ó]¨ü\rVüPp6ΓèIºoc¥•€»Äò6"»¹¨O‡Ó÷ØÛûDBL^ò¥íöfŒÅÁºbý}‹éURS“•»qá<¹5´z gÈç°Ý*Ýþ&€Fd¨)k¾…tZd¿ÏÑzÜ n”ÐËÁ–Ý5/ Â'!–}°ºÁ5M5pÕ Ì#(a–ýQºZ)$ÂzW5F€I~T}5ÉÕ\ Ã){QT½ )àÐú:¡TýNÓ6úÔ*ÐNÙxÙûLÖ-¾%ú¯Áá3»úsÔJÇt8oa11áƒÐ—[Ïw{êÈPkÚç“ÝŠPHPoæ²÷yÒÈÊmÔŽL­Üîí×:¢#qKD3ÃTVê+q+è«Ymxw\§ÛâšIvInT\íõž‡ò·R·Íà{x×.§Óµ=†«HìP˜´>n½])¥º"¨ˆI÷¢ÅÜ›;›'å'ïÔÍ›P•ö›’0È#˜_ßeŒû9yèhº¶’lÆ•WA- ­ŽHIä‡Â€¯û¸+† ÞÛ1toyš®§äÞéÂmö~‘—‚#tòêfwÀµï§÷}œA^µžôøR(m~»†{lÀCÏÕ€¹»4T4æ~Âcõ3ˆkN¡ r&R •‘-*ÎỊl t5‰Ö1 ®™ú¯0µE¹nš)í½•˜ê"¸ ÉÜTyøÛDȯ¨‹Pž°.Þ¯”};<9µÉG鬮æ)a*dûüì?D§^Q˜›äðÖP3¶ÆÕŒÙj‘Åëîr€ ûuâî$»3¤T]¢•cÜ*Š»3c€Ë˜ƒŒ§õœ÷+á,÷‰³/?¿²²œZ!ÆœíŠw ÄW<õ$ÿL<ÙãzB˜°¼À¥©n“@¥çΰ#F ªåvØ‹‰0có\ ‡§‹³86ŒìüBSt÷£GökðÌ%{æÆ\žälfâV(n’7z»cìèµ*ƒ”Guÿ¾t6Ù® ”¯C½Š-øªØ¤zþ ¨JHjNð.Àgë/"úÌ@ŒÑ‚Åx(>›17Ãó,.³îwXR@Úï7XW1\èÀR Ÿ7Ð7.jVê^Ú£ÝÕFÁÇfóSòr4¬›W³ýؤ“Z–#Hafgï±3Gò^RÒ!œùôœ?ëM P{@jn˜5¼ÝYƒ  _âÀ“¿„®¸˜æÄPà°#Ð×N°fG’ðÆhl㯎…Qàhû¦v7°Ó»jÂ=Î2 µ¼m?õ¥-r_Œ/­ž,§%ùâŠ1Þ v]¿xs³JÐ O¹Á€ýµ”¯ ؓĘ®°fÐbÍ€ Ñx»Ö™¨ö:¼¥OjseEAhÌBpA^É ?óVï¹âœE8À¿&õìkjÞE¬˜GØGÀYænÆØÏ˜àòùà Kn²{ìö!Q]âT…F ÝCeˆê³Ì¼Ì ejc»ìðyröÝ÷ÞÄ39¬%Ù>kÖ]åàùªˆƒ"`üårC¦¢ÂTåê §=¸K™,™‡¬‹òðßö^NÎå8^ÈÊÜÆ‘¾Óôç{³2€Ýh)f?Ùݳ\ö%#&êèQÚÖu3LuJàÉ£âßR²m ˆû(ìÃØ ˆ/=.šTpi!·‹ÃÍoNØó©ˆ?Š$6vÁo'<«chÏhmâýp8餆ƒ:²Í¾ Ãx—OO½<'ÍìÆš›h ÑT‹Ý‹§úƒ>ðçq ­eïÒe«T÷{Oxð†é®z›ÚΈËH¼ˆèB±[Ž cª0£¥a[:{~fe%üK²!)³)ˆU]BŸ²ó•Ñ‚øÕMeŽÃÅÁd %˜Ýá4 IØ*œÅ$-ÁÔ¬ô½³÷`¹"SÔxßõ”J¸ö% .ÂÖ` Ì¨Jæ»Å}¤›”W vΠ…ð›z–$͸b/'­5¡ììm˜«­„,ÐËÓ’/úå›u@“q¹CoJFëW{yi¤&™QüÑ*z²LÒÇHØÞg§+›mÖ,ß?ËϦðqû±¸ëÛ’þýã<ãp‰¾·}jÌâP˜.74qgJ«âJÌ´gk\Ìñ]ЃÑüã û‘X½pEhù°O¨Åé§ã/ n~μQPÒý;;¢ð¼ø’.ë›é_ôY\Oqõ×|ŒI>QOôõ[Ää%íѶøDHcn%¿oÅøúÙæà¡e½‘A§ œÓ°?žOËð’V R€5z3/m¯qk>ª1$”9R”—xxPB©Ìàaª½Û.ª¹£³ˆìC=…/è‚e¡%;z-ƒÃ$yá7’ìüyÖw"kd?̉õ蔡•—CZ&Èg.qº’³ò‰È?£“¶àj«&|JÍ·o8gÞ®#K¹#!Öà¹ÂV¯ˆ†/FÉJ°“‡RÅÏSP’ðÁ$¥ÙW‚”ÕcÌ×wâQw?qñ0Á¦(´®w//”Åû´ëH8ÂM¨„sõÉÕóTF팙.ÖóìÜŒö2O+%! uzªÓûÜO“`œëÚ‹k£æ•U¦¦mR­¯úgàYtŠÒ Æ^ö[ˆQùª\ð²nÈ눪»nÕ_DM´b!?gÆÿCÌ™¼ J@(S± 7&$V Gƒ¦Âˆ’ÏžWá=Ä ÒØV§×)š hâ³½½'s ÒêI]òr) ¾fDä«‹‹ÚˆÜZ}¢‘PP­Vð‹ã0˜–š’7™R0Mï$85ü´) 3ƒÓ•SÀòùfä|.é†Q¹ÔÆÅ§mÑÀ,(«Iªã¶H›ÿ’Ý“ÙZ ®oó›pÊ‚±…nýJ`^ð(•yìVõ“Ó‡^½†ÝÛ)ªÃ>h^«…6ë|kù‘âÐçˆòÎÔöæôôü¸é¾DýD¸½cB?úÝè»/è˜Û7ÊŽ>Z6Ç;ZÀzÉvRu#9ð¬cŽLÉŽ(ó&×9à×ËËéã mD¥•É1ÙÚ2VK< Zß ïØö;g •S½V|½1ríøÀ­¯m}ˆnj _¤pi¶Uña-ÙûÈäš„çRëÞ¿©EþÕ³^Ðé¢n©à%#`³g=¿ÊåIÈÐÓ% ¼¢/Iw«ˆC±UÐ8Ç2“œ‚s4[2IQó ª*Á‚$ ªýÑ ‰ŽuJi|@<Òöé4bâ„"æ©ì0| Âøn'§ÈuzZFLÙÒȆ£/ÆXô›àduð*F•7˜ÀTVÄ\ `±±¢è½AîîR#oˆJc$·š0»þäCBsQ0è1”ÕWã¯%$'Èæª<®[×+ŸXÏ„ÛͰ,ùª3³Üõ–¾-:%µx+"9=WËš:qƒÀ ÕÓÅhXO§6éR „CŒ®õvéM½¨Ð×…ffef&©%OO))Ï/¥i&’ŽÙʘàvmÞ> >8¦>©+xÎØÙÞ!- ÙµLÈuÓO½hYX¨æ#† õ‘ì‹øêTë³´Þ¯rp8ÑõQ2íùI\Ú”ܱà|†Ôp]tÁ3žÝ<í`j½„l+FR@š%=$ u‡|âÄ{(ñ~">Gèié×fÂf‚®ŒSw·ÊÄAìq¼XŠ'§'9@噟”á¡Ï …}Ãc²8ƒ/‰\cRt ÌùêUQ K7¦ê\cd½E^>ë3/ l‰Dx½“¸¨§ÑVÁ[³Zb²Š2²¸¡ãÁÐËèÊ[‚5>-„f d ‡òoCôX-h)ƒÖbéùiÐ(1‚äýWlÓ•¡­s_q¥Ì<ÐZ•½ÊsåL!&‹ÉHIcÄ hކrÛCð=#(Îèå[Øšð™V;#S6¯Ô¹0äÔk$Þ² }ÚÅ) Ø2Výž0vá·è¢\ÅÖ°È}¤°c2b*Ž»ìKèì”ð­à#¸õ$„qùB;ã”N´FQìB\b>ÚT•IþŒ¸rEÃrKªÄàþÒ$PÇ>™P˜H{°Ÿ?¨82ca…šƒô±kÂYú.-~ˆÂ NéiQ:]j563ñaÕ ‘Ÿ˜øZ~í“êÄ)HRkö$º à™Úk`VŽSz´c£Éé)&÷.ò ?öÆL«ÇÂDôÖa&xK¬Ù|Ì*©»­|Vþíb9låI”ÂÅPhÏ8Y+pO TÉNPcë“K¨QV/¿dž¬  AèÃ[‚Oþ¸„À½xº lÚ&Œ©B› b&@q¼j%o5g ÐoçvݼËo†L0ìò…SÃã˜=¾ãL}~ì¾ê2e¥€J2Ö-[]x¸} I~cXûíl²(n‘jåÔ¥@JìQÊ)Ôéà‘>ÍåûwåÁ$F™-sœ:+ê8TœžÕUtM}¡YÕŒ˜¼ l‘åaSeÀS#ªðâ!”ebOFF fúFæn‹‚o#йù©ß.Ѿ1Ï¡ÛèâÞó–yZÌÎâðFXÁ¥é½ê16$!œ…p“ άL0ž9ö1,,íî©oF¨Ã0Ö²§¥æÔ톺ö]ÅHŠCs7[Ÿ»o71O÷Vãz¿–À¤ 5¸hËQÁáI,ÿàyNqßö-}Oªi©õLr‚Ù !ë)„©›äDUõ=ÑWooJhïî¡§Åx”etwaî·Êc€}àfÆÛâ¦â|ƒPçÁŒ*ômõ[FÌÚS@óNòåÇàÃŽA[î~íëÄ*ázú×G,ÎW¬ºHH’¾»w™_HiÊS(á¿RºÀ6zÏæ°MØÎª[! ûñõ¬*µ§Æ12: V8{[~5¿i¹QÔ±½Ï¥®,Æ1QF€¯‚#fyN2dX¾r"Ç.ÄËÞ?ý1©%Û+Bë!{árÅü ¢êÉôs,ØÂt¨µœÚ ”‡î„¥0Î ýSNà7¨†¦Ìñ‚²‘æãòóá/Ïæ¾™ZO—DAW,OS¶Ÿäm %¬$#‚pr¿‰3N&B‚Èæ-4oÒ…¤P̶ۇ`„¶g0Rûç–žV†–}ޱ¡ƒÈgîRž ×²s?âÄÓ—‘ز\ÆCÈ „Øßl'yfMWåG¡ô%î‚[0ëwÌUt÷-ð‡¼9˜ F¦’½‹G‹i0²…Ï–úŒ®kp·ÒÆ|îSšmÐY,¢€þ ¬nÁE­œ5c'‹ëÜí¹Îsì€mëíu·YæÛÅf¬ç* ±E¸Ù¡ÆTüV¥‰å øðé퇴åJG`4lÎ6%Zƒ‡ÕðêÌ4†Õù•ÝIßñ¦þ­£LU Msæ*lÌæbz’±YÈî$–èǦL=Q«g™±Uðè40êspt’Îb Ƹ¹,uRMŒ…Ìɾ,Šá/Ÿ[ñåRûÅEQŒw¼Lh¶®¥³Îšax`³¹áI¢ÆG6Š BáŒ>›l.E—ܼ÷xÖ„KnáÉË ùœÆŽš/m]Õ)Uïoóvƒ·B™/€S ,vŸ5[^ŒîÝã3£IÌ)áÙ„ç‚D{møyÝRb«Hv#“.†¿ P-g³TŒÑËSì¾F¿¿SÍn5ØÝi/T‘¬½ Óžwš°v$%¶<úŒI»c„ǻà “à„@7?øåxÒo©Å*aø]þ僯èÃø‰.†­Æ¹×»n§<Ìœ]ó«eÜϱʵV“΃ñ_&°¸—÷)yè¥Ñ¶‡­ƒŽs z6öˆá…ò¹oQ“‹ä7 Ŭg®9]j!)Ä€ +l|†Â¦± $£CËÐG¾AÇ"""Ö 5œÔƒ~âñ›.úî)Ž…E_Ÿ•U×þî÷¢ú׿‡ ÷‡ú£Ïñ¨pÿ¡ÂýKT8FæßÐÊXÙ~‡’FÇò[RË?E…£gøí¾LŒt¿C…ûM,´lltÿŽî·7zffÆß¡Â±ý6ÖßRð˜KÆcüv031ÿ&f:FzÆß¡Âý†xÇÂÈÂôߡ 2ñ ñÓ±0Ñ3Ñ±Ñ 2ðñ± 1320 °Ð³qÿãE…û¡ ý¨pÿ³ü·ïéÄÎÎÚîñþûÇþ L ô¿öÿû¡= Ãüÿþïøÿ*tY-³¾ÿ|L¶¥ØCI Z«Úä» ©Î…8–'c°45—$Æ¿}Äs‡@Ó:á ôÀzµ7Šá.ÌF{iîúN‹†aÁÐ_óœkãõ}_!gg6PÁò@S—M°2_‘9ÒN°uqYU™›&õ×çuÜÑOðï†Y|h¢}(“š;`6[;ÙØq¥å†â> ašI®ÝHš7n™<êáHD@¾ŠwK]t{_FwL†$×؉¬}àméWØ|#”Ò„¥ÿâàš*`WP´…ÇÒ’ÚúÒÏN ŒÔ òÚLÛú´¤ši óp·äWÁhá œö¸vè% ñ”+ˆºaØ6)pM23P¬ðRFsÕ[欫“²“bzÀ“È¥f(\ îeW‘(¥ ¬"*Yo@Ê`Bó¾õûšÓkÔð+Çz´º/·À\•žnðÑ>[«Õ«¹7ÓXx6ÍŸç7&ΙaÆm©‡ð†€2CB.Ì,ÓŠÑJ&ÄV0·ÖLlÒ¶lÚz´½ú¸cqE6|ÜÒ1p¢æÉwHè[$ÕzÕ­y6,¯cÄñ¸]‹xùðêÄoX¾ãâ~·IgÁÏP)|ë5Ý0 º2b—´<‡ IÓ{´ êyàaŒ/Øù®T³áoªŸ.bpr¦m,ÁÆù:ó3Yk%iv!/ð˜›ù²ú7ƒÁ¯4•$Û¬ûi%3Ò Ð@¶T¬¾îKžoz†ƒxœÜ‰à¬(kHnC‰7/§íu­ß¿€Ó^FkýM¿*¶ÿØUý´«’“V‘—“ü×íªØ~mWõ'C§¿ðÔù¿šÉâèwí¨De¤$åÿ;*:–ÿ‚Õ_›Qý3VT´׈ŠöŸ°¡¢ý/™Pý= *ÚßPýA¦S2ªÒò¥þ-¦S¿þ÷· §~Ïbê×VS´¿1š¢ý+›©_NÓ/O¿µš¢ý+£©¿<%ÿ^›©_bþm[þUû¨ÿuöRÿ-'©¿•Ñ~yÎý‡Š˜Ù~m#EÇ@÷ÃýŸ³’¢cøº³Òÿ}#)–_=ö®ÿãCìÖ¼m3+Ó¯×7ÐÑÕÓ10Ø‘¤š»¡”ƒøôcôŒ÷õZ ©¥í´,;«|•sd•“RÜëÊ3úÃ3öÈÛª²ojì$]IÛ—œZR®|A>FR yuup<=“¼ˆxYQª1‰qy`ú!9ûK(;ù+±gzûx±p$¿K{„+ÄçK*$D?¹iq{øpDÜÓ.…ξâ²3â†:ßwnto môuB^ƒC àµê#ìË_º÷r`¤¼×­õ±=ô?+áõþòF ÂØÁQˆW#H×yÁbÜ|±Y½¿?VÎé¦qº²XÝZe¿Ç©G®¬MÜjéê–£_dì¡f"&ëÁ"bqûè?¯Äµì®êu5iIÑälþòÎDåMÀp;Jd}¹’öMç…3F~vôCJËÍå×›ñhìdí³«•ÑUÌpcæùdž&¦¡¦ÇF;ÄñRÍZ‹®gö­¹‡—¹—Šgõ«¦š±®ØŠV[~؃“Ö‡Dw¯*xµËû¶7ÛÍ0œÞuU!ÿöô4Š66ôôb‰ôÏ{ã­g—â§ÔíŽ;îNË‚¡1õJgJQä·™­âmÇ­m¥þúÞêâŒÖei™+£ê[M7g1ëìcéðã™ë5{/D!QG§ð°›X öäÉÍ7C^-ë{ëU¡•'Š“™kh/éÓ«©Íy9´ÅÄÚìŸ “Úž¾Øg!üâ±ÛçJÁÞX}¼ƒß7ýe>Kÿµë5Suf§ U…Ïônô4“ÝÐÿùòõ¬ªƒaåÄ‹°…ÉÙtÇúf½è‹¥×±t‡ãÃ^ÒÉŽŠ ¼æÝõã¨ç*&”Ñ\‚báþPqQ±Z²Ý¹âØË&ý±û#“K ÊÍÍ ðdÏ+''44@ð.“Ìâå÷gíÌLmÑòãpgþçlZ~Øý±iù³IË_[´ü•AËÖ,ÿؘ埴eùõ_¨üñf, ŒôaÆ¢¥ ?ŸöÝŒÅ'„ª\¾k*@¶þF±A‰âÈ’¯p j´ô2àÃG1~Ÿó!Xˆ3åAx^\R|Üy¡Ï÷MŸ¹O#ò5¥pì9æß&FË™88ÌGÓÇÔöO>{=¿Ý½¬;»$,#†õoK®RIÆ“"W$7§Ù·8»f¼!žrqwó}ÅÖ¦àÍòØ9dÞ8›=…°8rxç¾uå‚§]T_¼o$WĽPÇ ·æ õV¼ŸO$Î2þÒÿ±Ó-”?*E\ËŽ°äòš1”’B# 9»âÝ™tx5QT¤*åŸÝm(Ô|Ø¯Ï yH>ÎóP¦gõæmÏeXÂŒÈÿêTûY³¬>¬|èq¥H¥*kw=P;³=¸2…Ú6öDO%‘låU”doU¢ï]‡ˆ5§ù‰Â|¾WlžÙàôîKñ/¨c9ŸûÔE5µYGY€jæ„ô3#_Ú÷lò_1¿š|u-{( ­Ù4†t+Ÿ‰Sþ0¸ZˆÚºÕÞ˹‡îZžcð~ O#æðËÈtRìgãdîl0úÍ>ÚÕXÑp>¬9¿æŒ—°“¬'ÃЖç¾dîøùá6;øb3¤$ºÁÆ+y8·úRS}sº”¨¬™aˆè€9Ö‡¯òí2 š&!Æ´y<Ü(/!ùÏŠ“FnÕ‹F­²£÷ÑJdöŠD’Ý›÷ÌN¢³å8©Ðû~³U~˜‰~WĘó¹ù G7Ô¬Ú’C~OõËmPFþ$íáÆÝ#hÜά‡099ååÚ~Ï3­èu¨f‡ýx Wys}MdR™G&Ç–øÐtáaGC¥2Hú‡´8(íízã ÄZ"úw;ŸK Fwùû-0¢Z\]ìN£óZ?å—Ö „¶¦=¡fkŸW[¸•ЉÄ|á¤=ÏT”p)ÃÞ^;ÝÂþ­~Ÿ&6.ƒÃ;Æ%­»7¾:/2"ÙúLnk˜ ˜ëbd-~;è®þÖi¬´‘ztAyò6Jûr,® WÒî¥~&¹ 0õðe´±¦Ë1Ðq÷ÕŠKÓöKÉC%”œàö@¨ fW/T5^»ºÅêÇ"Âz¯6bžPkêÉbrŲWS>ÄHõP€¶4 DÔ’¯ìÊì_2åÚ¯> ³ƒs;ùr4ÀÕN Ý|Õüªz=:…®Ùëf³4–Š-[f«?îѼ1ŵg_Ü›~¸)ì¾Ëd½cÙiŒê}‘!Ô \nØ(—˜ò®WÑ£}¹JËÖ"]s(Ñœ¬Éx|°Âiì\Ôڜ޲;fi…à± š¤bŸYÚн9˜ß¡¥æB ‚C–o}ZÕnbºãã¶²F @?E@ÅÁǵCÍA ŠõØb*= ›ÿQS”ètP-‹îŽúVB¾Zä][Ŧ1Y·pÔ¤ê{×byé¢k!u§ø¢ŠŒhãíÅhdßygã6íÄmv•Qô®üÂ7Ì#Bõ™‚4…>è¸=NeÙR·>.wÿ÷@<¹ûÏýþ*˜Áû1Èý¼¸°¨ø¾;až.°>_åUr¬6Jvâ,UBV»µ¿j}ÄÅ›äí9ãqsýÇÿ2wÝmÑ=nn6ŒC[ ÆãÿõÀâ¡rùé1°k+õc€5E@“ú9j¨ŒNåX(™è.è.4¢}Ó³ýçmw‘“rª¥žk Ù$z!”°)nˈ» )«¦9ÿVÐL½œ/ø‹þÙ¢¥™±ø=Ëu›Ý¥ÿ{Gr®ÃbÙb‹Ñ133333333YÌ̒ųl133ZÌL–_y7›lâä@²ç¾ó]™¹¤é®®§ªú)èªé¾£¯ÿÉè{v"VXâ¼ZÅ÷á!hMå¬dùÛ¾!­÷#ß2UÕÑËw£E–4 JÈ-{ä&¶=êg×&ôÎ,Y²ù?ç³Jž!h'3—PÌ5ƒPèh¨Ò‘0?Þ¹û®ž0Ú5Y€,Ðd¨sÉ%– ª*)ÍkŠoºéhn Ö‰dØíëÚ}ÊÚ·ea§¼î€ƒ¾°D›<ãEy»œ²þá}l¥¤öcц dØÊì ÂŒ<\еÝv7“¬éàÚ>ñ,=FÂ]GÂÂŒ‹ŠÀž2Nubض·ÌÌRÛW–ÏÌ%~OÝÄ4;§lG°ê;•,–…—ó3é²Ç&ÚGNëüÖE+É@‡éèö©0PëãÐYÄ>ü„EéÇ!ýr_´î“ÕA]½›sÓÁ»ÍÖÊ¢{×\­Ò)½^•Žù™!ŽÜ+/ÇeÞâíý»HTÕ;í.ªöX\.ÞÆŠ¯n¯Û}pPŸü¶ þ ùð3ìÁÙè<üÌ-ý æàò7ìÒ?†à@ËDÿ{‚ÃoìÒŒÙÒ R2æê¥Ò 'ËŠ)wò±oÞ€ HÒã9ø‚ÅeÆðúÒ²Á q¾á/ÙZQ¶È9´:ªol·2k=ånm?˜踙Ө:222"Z|:þ¿þýÛú8~†1%ªE”Ž%¿á’xvAà¹`ÿYaG„6k€w$¬ÝÖNU|6kì«õNCKNÕÞà°é¼¦ÿ¨¾´ôBVBF&&N|‡éƒ^¶o£r¹ëžÏ‹Z£ñ‰G~Íw£XCuKÇ­¼Â‘ä‘û‚ÀžkÐê·ï0Ì"Šhtƒ±óøÙûîÏg¾·ò#ô´.#Æ7œ‰®¦6Px¹ôeµ«m¾Ó^ì¿ËfEp£%gï#™›§9µõ캜¶i¯µWÚ_r:«Ô©›  "A¾µÙ‚ÝB¨N8'JzçÝc¿E{º)Ó&UˆBÀ}·–(ˆ°)VŽïŒP–Ùƒ©V¾ Ð&qL´F0‡¤ÝóÔã½DoŠoüŽæÝXÏprW-‘6Þ.¥¿H›x[¿`¼->~XkyoùÆ ÆÍBÈ|f‡“}’-cÝ%QMÖ_½ìg?˜ó‡‘Q†“ 1©1¸”ZϨ¢»ä©Œ=ÖïÏö=ÃJí»¨£ÙOúk—né»8™É´UFk>-;­5š™šš>ü{ƒ¤¦"îóVåbßÍ­CùÔ ÆWjD=õÅ;ài#˜8ñ J‹ükÅÓ%`¿öÑwÒù”k\„ÌjÈÀÅÝh•ŽªÀù ‹Š ?FŠ-³9×M®\•‹l8dh1áöªò4Á89¦a²+¨¸Cùo>Þs`‹™ÝõòóúK«–òó9`d™o´ö .ò¼ZïáK8½dË»dFä„‚3ÁA<ª E}æ4ð )F‚Ä9ÚÇÆÌ_P}†…!Ø?D •kù=¸nF €7{~ÇB4ήoª€ÕžÞ¢Ü3I¯¹ã—v(Ä0’w¼ý æƒÛæqÆÙ¬ÎÎû}ª[ßSOшÒÈ–^L©H5 Ü!§@¡‘Í¿ÿîìk£ÏŽy¨ v°«+”pF6®Î®‰ŠÕÕJü§w—m9UTåÃ6¬/¡ @'^~@îW]¦»aï½52˜JÜ«ºÝ3|¬ê®Œ’[·I·Aæé ¤7ðPš•Hh&½¡&Ô‡”\kò¥÷¢ŒyD¤÷¥]úYlž‚‹‚ NÈ¿mŽ §f‡’…;«ÂtšÅ_~Ô%ö*l„jÊâ+ÛW¶VíßÈܤr%^¿y“õ®ÎéI.; µƒ!WóT¨W«—dáÚeŸf…þþ&F±M:n¢Îl’Ü\S˜æ ÈI4Nzˆ'fˆÅH;H^LKB/dG?§ZŒb΢ˆjSr1hÇÊ©Dò3ޤ›BÚ ýÁ­' €ƒÌäúð 0ÖÑë2+îWµÁUw»æ]D^ EõÐöªu焨N`7sâO%’–®ú}·€ÎuÒú5õ]*Ãg*ä#q‹!Q±Ü¬‹›Pð$óCìf&¦Ýå\ÍVWÂo3~pÀÄÜR¥1Œ_ˆµm,¦7‚’â-ŽÐW„Å<ö}n?-!ˆÑ<úqa„¾ öîZ^ú-e”­ƒœ?)®tîDŸ… BvÔòà¢ïÂÃèXµ÷o„~¢h!ªÆ/ÜúHà ÇH hd4LŸ‹]Á_Þ?‚‡°‘ïúV;¸{Í|‰}—êÞs>Öâ™BÐaÙc ªðZ…² ÊÁ\)jÊaIÕ¥oñcÂíµ/å$ú̳¢>’P8gbø[1?iƒ _™s6{‰…ÂÍÊÇIÏT"¡Œx`7¹¸" ™o 7*™8¼8Ìs<$ `­îÜæĨƒõ@Ἤ¾ƒrQ[4QØõÊ >åk §Îbƒ^Hû*ø;JK–!>ñ¼xñi Ï<8PÀ6´u®f[°ØcMOú`;kÃ=^޲ïÑ&-¨EEªÔÅëûYR^¢0|烫É–ôÝÛ 6EqX³¡Â]ßÈ™¢ZkgF¦‹§'6¬þÑЊîK;6Ì—xKJA)Vtû‚´ë ‰a&줣³¤Dn&ÚÛÈ7%U3¨…Öeù®u;á°p5Ûb­û> 2§F¾\&—VÔ§ï⢕’ÌX¢ð.GK†VbúU"(ä¢c¢2pgRM¡¡œÀRô{hh<Ô p ûR̨^bñì™*qB²yâJå½%ÖX²-¦üª}õ¨Ó1oUí>ŽÐ(-À¥ëÉÝbb7`'î%›Šë¾…ŸS9 ©\E,•6Pž{Ïwzf]xa¬öŽ‘ßÁÌ ©[ÓÍz¼º ³D%0Ù‹ÂííXvÈ€n5‚’ÀpRѶáë\æ‚ážÄcLÎ}ΦB˜XF„P°—ÿF\dv4îñCÔ's›7ÊÖЗâUc¥UUÕ³¨æ‘êñ¼ åLH¦æe'Öâœ#<¼›JOBÍz±jSª®qdÔU~ íLù*÷•F/}¥åÚwÓŸŠêÚ#ԺʲíõüÕc_§¶Ä{ÆüñŽ-:²¢ÔðŽ¹©íÓoÌòMt ¼è¢j:Œóã}6Ko6ãvVòéµõ©E$Q rßúk;H7é–ú‡ãò< 7Kå`˜¾MkýÚ[¢R{ÿ"½*€“ Qø)xU§Ú2§mœPÐ`—ßzm wË/EØø,¶AÁdR$CñrëòÈ(dëàè£f@èÄÛ„gµÅ€®ƒ—8Vi½ËŒžŒV‰†pl»e¥W,(”’¡«aŒòš´ÇI‚EïÂ.J~¹–Dâ£:áB®OøPâ9¬ß|IµãÒÈè•2º4ÈZeaøÒdSÜk˜ê¿÷m¸]ïºOÛ¬‘YÔ&Ì`¹F}XËc-~²t§Sï†]{—¹ Úi^%úxó<Úcþ‘O.˜­Z\Ú-’iÖÉ€#˜ g0< ,˜øÄdÄ« ªzüZ±Îù<ý°ô„*Ù÷ʧíZ¶b¿ô-s>k*+x<«‘xto]V@@àN¼gÿøÌør®Sê@w'⥹¹CnðtN²ÜG[óPé<ýGbò<à ýi\ÇÏí²Ê•©Eˆß*¦j–ûz¢§ª–Ô¤ÆeQ`/#4S•Á¯ðBÇêa öeRû)ÃåNõk+ߤáíS* ¿9Ç$¯¡Z´ÏÀ“3GÙÝè½Oä8ûUM¶Ú¯ÓÅURõMŠ´?ÖLI&Q!T#|ÃüÈÅOC0vžé±7öþök駯¬ØÎv¬Ï§_@T6 }»šc< ¨‘0´!ï5ÌÃ% Ù\#bŽC¾6s‰tμðÜxâ}ýHÑw'ÞÅø¬®ü0†öBÔ€W T%€ÕܩхxLJ‹>—áŠ×JQ%倒Caxj2´;ÓeÀL‹ð~4êfìñ[. Ýuõèggšü‚¸¸<¼g¶Tð2.š~*º^ò‹ÓžÓ|ß[œÒÌäÒß O[èípÅ›VåWn¨àÞ#hÚ¿ «ÂÀyŠJNµÓßcâ ¦­c¹¯Ú ¶h†gìÒ“ m®õöÂrŸj9%&ž\\J&:ìíàmH¿®¨’ãQlg<ƒúë,Ög dõ[wýÞ½–5¥µÀ¦3*ˆ¤IËiPrêœcIKaYƒdªjo•(™’2½~~ii%AÝEŽ ¯½h8€ˆEý ï<Ôÿ*>­B<¨X ,I >  ä ćMašÈXË‚—¤5Ò9é1âºMMíA|V£CâÛÂ`J…àEªfÂÅÚËR«¬²vL‚ªlä‚#ãAð‡¶˜DÿÍ5˜ˆ< Þ!1tðç³oŸ;>ƒuÒÏeõ5°Îe"O ´'Ÿ¸+Еy—Kn‰Døê…á9ô¢ëëV—àDtk[¤— l×fÊV¦Ýà•º8yˆ"¸ë¾‚í–_™½ÿHÑp›‚> }Jäñ¤k‘Ošë¯ƒcðÖ¯ßÏF~¤úÛ»l¯ñïZ]ã<ý-\Qp´¢hÍ!³Ä'É@à Ÿ…2®Îád8\?DSËš ”s2Í«ŒH8#èäŽ}¡åÚgÙ ~[´…ž&¿÷¸CwÞ(ò¡öª-ü˲ä8X·Ï=Rs;(:m¹»îiv¤)³<ì-¡åíN¹u^ác¯õ@ýæÊ›g¬ãd§"F‘[kKÍAdÅÚ˜¶x¸ü§ýè÷•+¥ú1k]€ÕR`á py÷„€*Û w{òï¾z.ÓµÞO‰~©›“ü/Õ è³P‘´.:¶æ[ß.À+ufFEÄ)šûSTŽYÁä Ú–¢ ô[uŠ(‚ÛÍÉr—íZ¡|TÌìaYظ¸Èª™»×ä5–W2´ÓIu >Öt o¯©¦'Ç\ïWžMtÀ\2ˆÍ<@ h½ Âg°åRzbÄ}ðN@ˆÉ`«¶[èÙö ›Û:;{^ªñH`‰®ÌFuôÜ)OtèÃ!tÔæL\¥ölË”}Y+¸ò®Ê‰X‹»Cëê»ûÇM™gînëF°š@ø/Wž:{³ ^]ûÎÞšnâA,ùîÅ@!ܨôtq[¢Lóù²Ê}®Réãr˜+ßÍê£~$Q2e09„*éJg»1ÄÑŸUć“B‰Yºa‚…ógø•¡Ä<o×`Ƨ6H©ÕÄg=é|ƒ„ºd°$û…–ü#9›)_˜2ý ‚Î vØójZúçÎŒâEI°I¯ž|©†Å`}JuI-y Im!™Ñ2¦å(:íÓ·û„&‡©“:c“&O²þ©zŒÛ ¿&­œ¨@çʓƣ‡Ï»ðê¤jýÖz=’¢Âöé\]^ä2³î(¼õÜä^c1¾¨ì¶Œ §‘šžjŠýæm„5ïx“‚½ºô‹%”wßiG“K°&;äçg‹'„ÑÀýĸk™¡¬éòXÄh­\—æáÕ6ëV‹PÉ]½5‘ƒñí[ù¸ú– -·t´&ÒNÁ+õd.ŽVŽŠÇ4ý’;E%]D%ÕÝ)×ë‰+•Ìè…<çiÛå Nwñ•¬5åg6I À.?÷ «;³oºã0ë3‘"¤;!U/š®É¬ÎÌ4õÏìÎõ=&Í%ôùå¿ÁÒcãn&P÷ûœÜµ£Ù—¬J,\»›oLÑŒN¹Tëûâ74»½jÁ SWqCl¬[E–Ôó8ïQ¬ÑGt-ÿèôÓÄ•‰%ûÛö¾DŒ|8²Ë(s7ÖdÁô˜=š–³Î6\ž¦Ï=4€mWdjeD’Ër¹Ö›çüöb0ÈËGË›`'6$Ü­T:œû#´ë¯Ý0ƒ¹‰ûdwˆåÓ3_5%Î.ƒ8:Ÿ:žˆŒRóï? 3„¡÷RÅ÷]›¬´Ý}ª¾+×ýظ‰ß'Ò V‘Zß5õÉ<øÞ†É1Ëã&lþAÉ/7¯ÉÔ›¿†è*‡i½bo,µÁÁ“¡F1> _TT4îXÜÁ•䤀†Óï‘ë$×nò] "¦#„Ã<‹5±˜rT8¨a˜šjÉ,/Õ̹b¦ƒ†KVytôÇ“ ¶ªv¶GE”Õ%Ì~¸*Ùrp|qŠY˜l)ÎgEÑ<¨l Àk|¹ ÜN®Ê‘ èQÃ'ñcÎÉÕ§94ϧT¶íÑfáOÛ$'^箇nfdÆ^Ÿw–G¦†qèxuZ;g9|¿Ò¹¯¼Û XÀ{žrˆùqçÌëÅx î!ÀkÍf±hÂÔž‡¼Ð\Q{|Âð» œÔcãèéB¿½øàùÖ½¥ ËÇ»çÙ.´ÈÝñÊý;›nè¤*<’÷/<³nêø4“ý„Uñ–¬Py1±í®Ý<[ð±"èà@dù¨t~}ífŒÐ/&v¿ÔZ¤Ï×’˜ñ‚ ¦¯Üo/pó ôsny¼Ã”ÛÕ&N–W.·lV†ãzk™1@à/1 Áþâ0m¢ûÁö°zwtîS \\ÖM¶ä…C¨¹T;Øw6ß;ú*@ º'„ëT:1,ý•”‰¼Ä±CÈ(––(XYILó \øm»™h hݽó÷ºÊ´Ç5„{Ó/ëûœ£‡õü<„Æ¢€âåâ5OÕÉì]šd3ª0Ÿ­ÈÁ½œ, m =‘Ï'y·¶ œ!}f²Ä]IJÊÊÇßÕ=VéÉIX´©%¾%{¾BÚ*èS ãåIÉ­šª}ÃÍ#T¦ôæSÊ™zx˳·£ówàÏÔo9¨¯ «Æ„>5vùÚN.?»mµO‡ è}HuÙî=ù¶£À™:®ýtNˆårÈ/u°†óE™xbm6Gh9-ã^Íñ]MÑ[+¤<Æ ¥<ÂቢJó|L4õiwyU4u‰*du'ƒ3óâá±("C­“ ýŽ¶Ô‘Sáö®pº¼÷$œìeÞærÖZ›_.à°moÜì9ˆIƒo Ñßa>Ö•ù5ö3‰»©ß9UN¤’Ùjät­Q‰¤ðN°ª-§/­…’¼Þ(h¯ÙK&îc´ÉOÓözfB=ªsl06~®Ngà½ì#_êjRÍ3ÝM#IojÕ¯š3Í.àÈpèÒ Ä#ëMz£ˆ¡}[Åùä?ôhK* ޶±©¸w££B ì')§¸¯['Ñ(v‚¹ó‘A…=(„êÀÕ¢r2Ò½²ÞÏô 9iy‹£ÒxA|œ˜X—ì­|2Iz®ƒ]¶Úç;ÆÅ¦[ذu#«HÄ彎}ªØÐéà7 k8ðL¥å/ WÙʽÀ kV}å0¶yµˆ\[dʃP¡êd&vŠ–|©íÔ8‚¢øÓT!ïCT¨Cè!j€ýC‡)B Ý€ c«ê=]¹ãú ¹´F¾~ž~´½¦ñ@'Î>n€±vÞêÍ8Ïöø1ú¥ºû;ÊS¡Þ.ä- ÷Æ¢ç@.aTDDÊžûÑm÷n¯5Ë ¿Ò§UwXw~‚B‚V¯wÇ [.ùç½*Iß(âª|8Ö¯)wVÉÃ|R×?«ÝÆZ­5°|ròa–kÀÅ7µ†£˜…ïl<º›aW u›qØ ÊæÒ[XL^Ùv=§ð|Onµøò•ö¯³CÆKíÿïIíEÄDEøÿy©=ÓïÅꬖÚÿ$ÿìþwbõÚârrZÚ? À{¿Æþ£äøêR*ò¢‚ˆŸõ¿!Çÿ5Æ_ òÿZýýωò„ý¿”åÿøüI˜ÿOâþž8_ZHIV^ýQœÿ{iþïù#fÿ8ÿ‡“sôïú´ÿ y>íßèÿòü+Ðÿñ÷»®ö_ÙÿZñÿ×dúŒ´4ÆfÿšZÿ ŠÖïÒ3ýZõÿ¤\ŸþêwiYÿë‚}½? sMyàø‡÷÷?üöÇëøé˜~÷¤°Q‚›¬‚ rŸŒ_1€jBŸ™¦A©´K¸Ì)UÙ˜ŠÃÜ®<ž—PO ÏPÇ#„6„ÿ‘J¹¥Ü7j{®e¤nZÚdé)ÃÂäñÓvÃ'D2Îp÷î2¯p0w™!ó'M¯Àñ³YåÓ(‘±Ó`)‰@MwòØv<}=µ/u„é}Ñp\›™¨íuŽ ‰¸m¿kÐîZ}η 61þ^b&?&ÒºuG©Q¿¿.:0¤¤—‘ðÌB“AÅ` ¨MhÙ¹ LUÃ×fTˆÆÚn1 bdìȰéØn¹•°uÒíexùÜM;þadeG@S;MÖ¡[ÿ“ª%|Ʋ¿Uoƒ^¬*2j¤W”›œc –rð7a‰Ì€ÑE‰âÉæëÏ+ˆ|"?õ¤3–Ž;dìÅÐ`§’w|þRÀ+cÜÅ\X´anUÒŽ Ôÿæ‚jgñ°âæK§½“½Ëq¨pvÛxÇÛÚÈÞÖ„æ` ‰]:ÓÒ?^ÐÄ8§Éh¡ƒ¡o 0µówëØtŒ¶˜p­ô:¹*¸Äp9°Ao‰™d«ŸÉ›•j¢^ŠZö,ÉqŒp0”E,Üß,ãNm‚Òû¹!Ø&NõV§Oh~éqæÁú¼æþåñü”Õ¯ åƒÀÒ’V1`tÛPÐg…H¹ˆËwîb× ì Xuº^žöË;²·9Róõˆ¯~¶Ï¶Þ/Ô5*Ið«Íá?æ…Ž&^ž´ô(½ßÅòÅ ¡œ\2×Ìä‘®õ þ@' ªr~{l[÷‰´øKQybuYx¹zÈÛlO·Tj:˜³oÀ¾˜û~}åt¨˜yÈfîžIfºUñ0wVžoî^h)ªÑ[è Ô3•)QKæ÷- ǼÑíÞ[ć¨z{­Â|æLO§3†>r¼Q% ÊAGn¸qr‰o'ÉWào™+^L˜ÁX'Uo‰Æõ`>Ú`¼*(Ñ™ú’¶jú27nû¹ƒ²:@à›==Åc¿{×q$x÷Õ‡«O+Ú^ §âŒnf½(þOêÛêà÷$û©ž;îÎP“KsJËàçÛJiøí‹9*ï–ð‘À#%°/ûvÙM®š«Øóåh¨rùвetÌÓß§SÄ2|y°°ÙFBghÿB}HÁà]¬o›Ø§-· ÜΞË1éúùå”Tr~ù ÅsUG{ƒÎ¼ƒŽÄX­ ¸nMgZCÖëÍÆn…H)é³äå}dG”É›ÞdaŒ˜1¹–[íãf®a‹ ã²ÁXHùÎ/ÓÓ[[ñ¬rK==cÞÒº’§„ë6:¾ºº,nç®ku_ï¸YÞ#w¯ÛŽS S©éSFŠW=WZÉ¥Ã'Å¡¨0• 0®#‡ï˜ˆryë0­x;¨‰W23:èú„Õh¦gF_ŽJ¡ C®îðý“‡(ÞŒv~?ªÊõhhµyNlÒÊu=©ª¹ O³`ê\†ÞC6íj­IkŽÝŒ%µeÃzŒs×ÈÈ(‹˜’=5¯aT5Ỏßq¯&M±×‚Aý\Zä9ª¢œuÜÁîy6Ç„fëK>Ûëžß%‹âúrIhÅ.»á¸ÈT“Ô9¶K¢²¸öIê  rd"ã‘Ö¥\®Äác×¾U¢Q¢ˆÅÛˆYyýêÞ÷¶(_t#b¯ê&Õ“ÊûòWK’°FØóÓxq;ÌYÈGÍsŒ.,.—B8džéÇn½}F9l’ G¾Ôß‘n$·’m„Þø¦Á6-éR4ª—I`…½U5®F÷—O’Xñ¼­T&Ö#yßpŸ–¼!µÝ¢>°ãStƒ‚Ñîd4°«ÃWù¬--6i‘£é2#¸(‰¼ý*öOÍDqànCá”vÆ®‰óÑÔ²i#±ÐœÓVîå# ›³“Öoð«mõkp·wsîGñõö·‹{Çíß¿?½œ}wM˜¦ ïßn>M N($a †nVqÍ8£ñæ@D’·gx9’“`7ŠM§`6vðwàŠX}ÿ™ÐÎd¿S‹¬õîXJ§õ4R("¹ãjLüóòW™“þ’YE aªTùÖ®mów7tõ)PÅ %FŠ7Äõ©êÒV¹Ê²6r¸r6 %.]Jgà•Ä%ÙjÉІ"Ó¬rT‡"¶ä¤g¦Ô|g¸²hdúŸ¬’ç¨^ =󧇥s¥ÑÀ Á;iŸ‘pÄuŒQiQF@÷¨ÆòkUÆçšÁš ZWœœìQZ+f›¼œ{NhN©O;N«OWÏFÕàÝïJ ƒ#û›áGÚJœ”•ýg*p»±)¿¦µñgÐy1š¹ÙMúÉã²7Né¯Ï¨zŒ/·ã)˜j¬g|°åWJ“Wò ¯šý€m=9MÎÚÃ0•m[ò%ó 9•íŽÆmÝŸ¦ ¤Ã³r}ˆxþ£ºS7 àQ®§¸ÌE¼†?^ðî| {©²„f¶—Þ5a®/)QœÑ­>‘ÛT¶>צnr@v~aA÷ ŽÙ×ÔcW›Žº°^¬TÀ,*ÚÔ¥²ôc¶Gcö<<ð91Øyç—ÞÚû¯DÀ®ïoŸ^œt;¯ž²7•¨ž0<Â0Ž¢ÚïµÚ1ª)$í‚=ë6Ïw„.$µ]u:"Ô2ˆÑ´ËhñÈäQ ‡¶iá}v"MòÚÔŒ*,ù¥¸3­nºƒ… ,Õ.\ì—”gã×c¡:ï5l°yUl“=7B¿zP´7TÈyDûéb:w=ÌUvGŠDrò|;åtÛÓ%ð‹XÐÂ;`{B–wro†±Â)ŒŸª-ÕØ' Lö ZDÊËÇ÷ÐW9œŒü€rY)!üÃËY㎇®úB;2_ûò-«Öw°Ù=`ˆ³&Øß±Ï¸ýv¬T¿„ÐaÏ"cÏ­éò f8T^|úlózcö‹I ZZ\+…–ç6¸ ,Q «±º”Åö°x>¶^êÁÍ BÄ!¦ä(N’4$³I+ÿÅgÝ»‘OZf5•¹]©ÞÍZtõ!à˜ëbï0¢Ö|ÇOß&,ú–nm¥šÿÃøPP29;”“ÜH¿0Z8—:ã lCY¾Ùý\j|t¸;¾:KîÝdúÐÝ”¾|>ÜŽµ€ä‡R£–ÕØ7ãVœïVZŠ8,”B -ºRÍÈ´p´Ûš3b÷õbÞÐà’BMââ.ù¦œ<Œ:Ó%L|ÎC UpìÞ¶ÔÃs½§Ë)QÇ$ÞÁ´ßß³ܰʼnRDgÛðä&2~Ÿ,pª3þ.J™Å,E5 l“jíH×G-dÎ÷ÐSV#²t>Ÿ]«=ê k–ÍѤ°zI5o>’†¾7€¡ÁãîÍ&ÕØÞ§öŽÊõ †ZÚFë/ù¸»mþ{œ4ãéšC( ¥¥ê~žáŒ7ÄtŒð,Òú*#ëèèóDx{ÁìÞVØz‹¿©ÓSèî·ÇúrO1$5C.TÉŸbûîŠÁéNÑ;¯=•fSÉì4>VQíáfì<dYfk ð¢wBŒ4]@Ú ÿƽكÿÚMb8QÑ9.££‚n/— æ%¡o¼Y ›Í9§;©5õLKùã’fëFìrT§Æ7Î1Ü•Å@PŒ‡jÒwbË(Ù¤Œ CGÐÃßUYc½9­H—ÚBwn_ô9qÇ}>Á¬œecº:+}ÀÒƒ- Y<é.–Ã]Ìã^Í™1‰eDcW`cýÊ>€y®2õu½D‰2ªz€¨“Áì d/¶¤ d³á¥o… =ƒr̯¶v´@¶£²Iã‡`:µáûñÊûë7þ„}.Õá³ høò®X#ØYŒñ€è±¢ÆÆuÜO>~z¼ŸžÉµ‰ºXvºŽP¨‚˜ÒSFë˜ HiŠò “dÇ´LZ%¥Î,¿ŸŒhÊEáKÕbÐÑG.3­­ú,¥[S¤çQ˜‹ ,À òi æTk¦àóbe yOÔ„äàuóý‹ë‚%uøû% œBŠòM×:뇷wðSÛš¢¦Ÿ‚yPôŒ®b‡T—ü ô&žøE\l\t¢À0 ü¨š„î‰7Œ,äF‰Etgý ‰Ú¼ }ª ¦âQ=å€äºxOé">+·O.,(K<ÎOç.øž…™¹m•ûÏ\ªO‘B à™ë–ô©†ïq„z#} ´ô²ÃÂÔg5)¸­yŒ[×ÐÌ(¢,J°ü˜Ç…kö+=‘C²>zâä6!¿N„_uc­ŠÑ#ã%¼sqøÊ+/#Œ²@ô ¦Ü^ŠÛŽÙÜë=Y¸ääA_ Ê§ñÛûÂÄxßEªŽ¤Öµ´°./ÿ»~Ë7Ëë^äj„E5(+º†My2ªó *6ü7K†òØÔh ì\ÓÁy¸“OûV–¹}À.sp{ê“dÙó}" ƒÙ¡–dVòÃÌ}¹æ‚|‡Ø‡2 žŸ•WU¿1u×Ol¨»1/f¦rç¢âƒOËβÊO0ú]-ÚÙ2ÐNS9Þ@8 ’‡0?¯§_"Ÿ}±^zPÐðqIÐQR½”EŸríÌ‚¯¾â?× Ú²[6—ô—èIX\•ÌRòÆö82IõV'A²@sðsÀiVÒdîEî©Ç>¨ÎTËëŠ-SÐÝz°¿¾Ót°€iÜdc+ gUÆüõ(Î8%9!;9ÊøÜv¯Ò4ÿþº«|kE·ÞwEY7U7Ñ`È;î+9/¹«hVìg#ƽ`™ÖM%}”¢5Ú+iÐlø½â¹¼’Ô𞦻„ÈÌw·¼6NŸ=ì»Uc¸6ÝЧEθ‰ÏÆj%hP¾aà‚uTðÜhÓF«µ~F7öÖäÿæŠâ19gÂÍ}¹ÀJû†sbú˜²#¼™ CÛÞ/v2·ÎXP„_]Àý®=£ º£–û¶ª¬5Æé±™Ðybʽ¢:B«¶:m& Žauq®\ÓI-˜?!ñ#™DRÒA{½S ‚ûŒÂòÚÚüT¡ ¯ÕHNùèp< º¸z­Ð®`»:ZUÉ¥té‡K½ ŠOdÐtô…ôÛ9%®5âœÊf¥œ±U³®&;%Ûu#ïSéÕŒXX®5z¸ºonÚPÖ–öÄí´•0Ø{ wnqªß›Uš“ÒE “/‘Ÿ8Õ¯yݤÁ¥ZùXØÑè?Ž$q§×­¢˜‘1â¤Eí¸ËÏ}Yª<ÜÄ;¾ðQ¾éàüFäÞ³šýf59©AfÇ,Œ=Ž[ÝB°E=¶XPd$ð4±èqj«gæþ‹-x™›³ê(I¤V| º×FüNÕ< x ÓÉûöÔm‘ìGÒ3é`WŽ ¯÷Aµ˜\ þ ú8Äp(+õ–ƒ˜…§J3 -ȸ:n°Ûºû€bÃD•Îoãßá¸7j,Fd†Ë(Çp|yÖBDÐ5C­ŽëÇÚ]Ùœ©“ÞÇàšÓ–õ†@HXç›ìÇ]hjYeVÏN„c§ºÛÇpl8añ‡>…‡;~Âi·ùLÁ bçÃOF\‘EsütÖùœƒ¾ ±ñù $õ‚…Áá ÚÐÀÆQjU4ŽUè(‰M¬ |üÍJ"ަ%lÁ~ h-ß}ËþMð’pûÚì¬ué3 ¦ùM¥5»ŠKø#M=‰Ì?ODù÷À~&¢0ü="Ê_ßk`eøƒˆ(üú.äåg&ŠòOL”4”?}ò(ÿŠÝ¯_…9¿Úÿ'LgW7w#{›ÿ8 #+ãïá(ªŽH*-ïñº1¾¢1°¹ ÒoÚ!@­›ü±š4N…”“©“*Óˆ4â¾âß…{tCð“‚Iú²|2Ô‹g\äðž·ÇJ=^¼[¾²ÄÅYfh¹J>ûÞq†šÎ k@‹^ ‚F—Zö,.Gvúy=•á#ÑôG• BÉgîêHpcºÎò- TvÎ ›«œK£&ê>CZçÀ·Î…E_{zM¨¼®>êLè(Wz>­Wûì¼\8éö½¥ÆÑEÒ˜_shŠe_Ç^?NaŒŽL- lr1U¢ø}ǵmé¼üY¡7Ýâ Æ÷;¨`½t—‚cÉÕÄ/™¾µ/µEH{î‘HDa½LVÇKÛ‘Ø…&×Ï`ß} vx;ÓO|&?·›;õ,9­/~rD ¦êŽÒ­Òã^8J¡iÀ¾ê^ûò\¢ tKìŒ Ý³Öåÿ)Q•¶ ºÓY¯ì“¬%Kær@Eç­¾Eµ×‚÷1Ð-Ü-^ðr¨›AÈ'©=Kˆ¹ÐѰKK¸[úœô7ݬÏ‘t´p»BhhéQ½ºwèø}‰féŰtë†ìEãYYŒß¨XÞ¾Ài¯ã­(îà_Üah1LHŽ´Òœ¸L•­U¬­^Üt˜1ót[Îk®‘JÞ«È.¾:¿ŒqKáæàæ\æâ¹ñdôYö¼x^>Fp&[î쀉t Ö÷ƒ†¸“«jAGòS:¶Í¯aôFÆø(ÃÚÌÊÎFƺÑ]§‰Sße2êlºØ‰ëÏ :vWQW¬6å—M/îÇ.ÿ¦¢§&©8–¦êð#o C'²sÕ`dœv-,½nB¬ËYÿÞ±â2`|Žw#ÿ)W[]P|CŒä¹ò‚“‰XŠÈ3²Yÿ…ád§W[HàBZrÎ!ÁêjEPC…0„èëÀ1ªÞkrZê*Rî/ê:ÛÇÇ:`ÅUX|ËnûÈp“ðÇ{º¢«dx\ÙÚcæ¸ëÞ`²¹áSÑ´l ‰¬<8pÂßxE–4ñó|Üs}Jí“ñŸ§ÑðÏW>m!"6÷BÊQ½%@Â,eVo²&ÚÊ%’Qá…ß¿8†É`âÉ}ðT#÷8¿†êê¾³áÁИOï–á¢é€í|gvü=¦Â.úmn8çh4ãËG€3÷ˆñ×CìjN´Ð09}¸Š7ÕïAµ¿P,rèŽç¦0IÈîäÑÂÔxc<>’ÓTÙ÷Ÿ‚úúÁ>kÅ®›Äû€ÅˆuÁgó#RöäÞ3¤©¢LU¿Éåp'ô1ÂbÚ+ío§Kùæš[ÜýÌòcIOãÑ×–tBMW($‹Äo›2ŽMØc«WÝ/ïRß=?.Ù2’h£¶ÂÃÛÁ€jVó8û²?ðæðäsÉtÏ*R´~•ß›Ø_´2…g@—‚^í8JÑ1‡]¢>\¦î;ÛF†Ã¹ÿBx¿=s#‘­yðÌ ÉSÄyþ¹éÌ¡g_° qê"„Ü¢3ûd,Ùf>f"ºeКªþÖÇE!Ã6ønÃt]Ø—Ö×XØÆýLÕ6¼Ê 3p`ÜÒê™6ßóѦ×@’UÌë œ BBFü­+ݤ=ãÙô O¤¦%+ÀÈõËÛWPÁò¡Ð|çD!^yžwP\$î=©AôFÞÎÚyœ„uS+¥Ié¨oM¼=ï–* ]HEÇwf¹U§FïÝ2ľñèoéU›äÌ;b¾¤ÉCr‚Ù2Ñ9 àhR%n^Þ\J©#Vc4uôšƒjJÎ Å%U‘]àßcZÔˆ…®Ï.kŠ›º ´B‰áÍ øE°­ë{²õ1Òø’“t¬¨§µñô˜'ç|*Kšóë.†ˆ˜#AcœÆÂ‹Ø*?&kå>FÄÐuÎm¬QÍk­éÄîæÇ*Pö 0ð|þ,?¨ÏŒCŸ»€ç>‰G“ µhj9o;øéò=ÿ]¥|µ”Àøi ¹~ºœzQ«DrSƽ° uýgžÐ²òØÖ‘õïqµB´ѦxaÖôѺTT¡4µrȦ€˜d1‘w)-’Øb4žý3ï™?ðÄ-Äjľk~'VÒé±ÝÚ_ëª_7ç§!.ÁN0®‹õÉÂbuB‘…¹•§‰ÎþIs®¤;Ó3pU’*y&@ØZÇb{âkRS½õqŸkú%€4•×XÆ¿ïºï_x ¨h- &[§bë2M§¡B»»y˜¸08‡±8=Ú/lßf 9÷×$Ïã[\€ ÷õÍ6»Õ`ç€é+hÛ5]51eô­Ñ]cªûáŸjúÿ}º}Ü`ƒñÇ×ÃC½rñ8Yj{¡”SfÔÜàÃÔD½‚ß1 ,Ù<3댘?\4W¾ì ù ^˜ê®Åׯ<¬Í¾¡õô™,k$)“zlbEUl–ûø!Ñ6ºëÍ×MûÚ‡5:b"¶þ¹\ˆD%É.ÓöÐ&mCÄÁ·1¥±â(f‹ƒöÀâú»«Mëàô¹$±=Bz$1°õ“C2ËX˜OÌHÄ'l*Å'ùô§È¨$EÍè1è.}Íä+ê騸x½¦½O<ôqJû1÷·ë R• Š;EÄ%K[ú²ŽE¡4Ëáâ0ñŠÙ⇤nD'59 ÒMñôÂnQv¹Oûsê UÝj“ d±”ú@5ŒfС¤Ô H!PCj¡ÇBò3vÇ騄Y† Vgx€x :9-¶¨˜Q¶tÊLcâIBmݤ[­*T.p¶.y‹ŒL …nÞ œOà2ú‹mÙ#ãâª"ÄX$µÁž1p>šª$–ú¾Á¿v" ¨}k Gý±Z-˜Ê±éb^ÙD¥-Nýª®­¶zÒWÄ””³IþòÔÔ8$¯µžˆ+æJËßGL®³Þ–•£§øÍZÛ ªöºù#¡ô4¡êR“qÞ3׬›:OFç,ç·³ðÛrRsùÛxKɼsºWh%ŸJ-$ÇÚé€dÌ3JÖp”y5›‹|tQV²ÖÒª/ë+`8¢ô´ ƒ¢44Ð:[ìKÈoëS÷UDÀˆÏ¤ »æuƒÖÄ:.ãö‰Ü;xè²{Ke 9{eýˆ¨. PÈ›?k": e„‘½Äý…åÝcYÀª­0îC—rÛ¶á—9ðó&$ˆæ¯ƒ¦Ü0»œþµ¥˜CËך$ê4xêu…æp{7gáaªñø¯¨ lqKž!s„–J‰òŽÈûq™1 T9šsîÇ$×웊D¨vD¶Íñ¢r)8Iú"jLßñ<Þª›Ëc1òö‚»•v ž$ä5ÊѬêzrC8|6éRBÂýÄL*¦ÞI‡ÁRèKD~C¬ l˜ÍÄΣ&MMä ˶m‹é ;¶zëØ«·~£©½qµ9v%u#®ÇTEÕlŒ» „o¼ÀW•sžL¦µŸëm׌ ×Ê7;ØÀ êRCn0Œ?ý®5f%Ú† Ý)“ã‚YDöV#¿r²I ~Hß]vèª7ˆÝ)6ü;ª¹0¥r2JRó;¥ƒ:ôýKA‰°à.¨ %0»‚í…éköÚ²NTQ_Ö£O¤jq± S’q2ñYDㄆE²)± itç‹BMÏøÙI×8V Sìó‘Ÿ8ËRå|²Å¨,õ<¶è¿5÷=Qˆ>{_ÜÎg Y’}f]N“'+^ >,]’ðf ‚ØëºÀ—¿ó»ëñn¤—¹Kjt¾Ä´(KS¯Œqx±¸ÍžéD/ ïO½æŸ'ƒ9ˆ‡ ,‚¡D&ïùLVGÃhÕ&dª“Ö¶bŽ_…ßF8»´.j,ß]N$Û¨W·CЬñ’¡E¬–z;† ¿ZÍqšVŒé“¥>Ócê ã`&œýɈ‰ÌPÓÏ*Tfµ —N¹Šsÿ–]Ù‹îHM™ ƨˆEXJcú² BÙ;h*+ÞÝBëy[Žï=rŠ±Ú‰¡2ËùÁD(9ëzð˜tйÅIš 6ÔâÍ!’ãMéûÌΠ¬®0€Ë=ÞKb}‡xn˜3‘a®¿'PÊõ{øoý#ɧlÅU9ævÛgQá!¨S«ÇõıÙ1fÜ›Rq¨è¿ÎAcGÉ’¯Z”¬–ŽÛ‚Ñ<ó,ÇL‘ßWÁàm¨jKvUï×­~‰lãÀ»°¼†êytÛöL·òXXsƒÕu*‰‚UxžûV?)=¼£ʰé#ciLàSˆÚx®deA}!ÒæÃúÀubÄ¿¸„ò=ã’ujýéJ*“â_DÀ-S _Cøñ<ödvhÁÈШ·?dÜÐF_ÉäJz¡²4æQ´÷­ÛpüËbZ„¯§ž[R}çGbB3§¶½÷AÉfnmò³SZÛ²EŠ—CÓ'CPKçŠÊsÎÂŒØpâÐ2{Å!h=k$íq|¶'Î…úFv¬oiò» NcÏQ3$#Œ\óßߦ¤£K5æÞ{ Å‹°gUÂÅ`:P-*K«›¥¥*‡Îr8W]X‡6'ÈŒ &R„C5³-šƒW€/2 ùœVæ\ "H@¬E»:Ÿñ |wÓv±ÂÚ‡˜¾9£Åw¦ÛûˆW –:_%la"—8ÔÂ[U[¡_ š:š¦n†¦±pRrXëëi/Žº×zB¨_qgñ¾œÊî6k3}Sá6±(*w"6'CÅ’DôûÌývH[Ÿ_345íiTg7ãT¯ôí$b¤ÐøÛîPž<×A£÷lcÉo#éø²ä6hv‹šÃÆ X¦†àT¡ñâť̠žÛã2«š¿®W?†¨“»¹Ur[Ãã!.­>@ñÀz)pn®íiθ¢xb™ÖòTç…ãŒPI™‰L~Jå:¢Éõ­©¼ÞMé…-Û÷3GÝÊ/|x̤Á6è°oMv‡Žt¬]9uþ€×C:"2¯jKÀ!Ìe̲XÞn»&ºS“ñ‘ïÌսͽpî$sß$úƒ‡'ÇËéÿø¸o!®rb¼Ÿ`·ºbûÍ X؈_*ÒkÚù[ tš«B¯ŸQ¥³U‡¥‡‡Ä¥J­ÍKJ̬ÇJÅrY£ 3©¡nˆš8;\a ?S_{¦_ÇfxP’+’ F$ò"ª‰+UWÏõôÊøR³3ÐÀý¿<¼Ø¶ŒgÆïÉÌô' Œ°8ì=÷ZÐ63´Q×ü·Ô˜šŠ]×´w5-AQ‚”È Å\tøÆõE½¿Ÿ7Ú€póep<%çCt ]êûÌßLëj‚Ó¶Wso†?i+NB8tãU7@Òì½¥ÄvœK¸á{º2—ƒÕqj´6’Òîž5¥(ƒ« úp%Š>/ÔdýêÓøt]i$š˜Ú¥Þ{ãfj@FÒœ*¸F ËŽZšûR_ ÷CÅ fÐ#š” å` ½;ÔÇÄuÑ¢i‰U„¼•;y¥2 ‹Y’Ög¦ºÞ“¹;6ð@èK>¬EíÙ~ÌÅÎ’ß Ø…ZÈ×È£)TFTC÷¡™GE9Qn3%ß>39—Ýìi —_%º V6}ƒØKz7%¨%¹píÌ5:cU(ïN!Eâ(R8%´ƒ¼*=âLG ×ÌÆ,ªCYªè«P.7í%ŒPî" Ëgú2^YÇ€±p Çu¢RØ£¶ôWÒ2ˆ…‚13P¼Œ¡KRºb7Æð>šÏæ.Ú£pÔv«Ó½Zj^¢ ½¼UÂë„Wi±u@öA§°k]ŠKMº Wt¸þzÍŠXb‰<Ø­™ÞŠ·÷:nýŠÔzÂ!ᬘqÒµ­#°IV[Ë, áê)Í™=ÿ¶Ü”Q:\ÜÝ›D<Õ”œ71¶BݦN>=S²øpÛùúüG4ñ’ïözލûRû%]ƒûŽ£dù„/V±¶T€As´l¼>·Ñ”ã=yƵg\½DÎŒÕMŽh„{l¨œ‡l§÷IÍk°Ÿ}˜è²‡ÍzLá›íî?sõçD æ2vÎç:ž¬¥ºÑÐñœ¿€öeÊÀ}zμØg8`â³²§Û£8ë»/:qz²ZîÄÒMµtXŠe<ÛiÒê a– Ÿ‡ëNÇðù÷èÝo™ ²ð6;—#pM&K]U\·¨ž)\ëq˜°  ) Eþí‚ ~¯OGˆ>BÈ•B}«c¢_´ܺi‰,ñìùá¶„¢’o9YÕG¬7–Þ¸n–ªMž(íX³Ôgïm­ÆùÇDö•n+Š«üÊvšï³ÎïGÊÁ²Lœä#? ëOE¸eÅBÔ¾ßGÓˆ˜+©1xpÄÓÝ€†Ÿ¡óÐ%[Æ:´nWä%Þf6¤ßlÓYðÿð¡ áñÃî\pKÒÜ5„ß“ãv÷·!n5ä­÷ìfÝ" ù§ŽœüЫ%@DQ‘W7Ñ|=ŠeE™ü;Ÿ|TzDR 6he'éì«±â€ÆˆõfÔïÉÕ(ÄM¢3‹NÄ`ÂÃT[ì zx6ÄRl1¥=F²ÓÚ»M#š@é™÷Ê€šƒ±˜‡¼/¾·UF“ ‡åµ¯+óÁ¸žâö„9 ÂUæ`ôû¸R£/$Ñ©ŠäžAT ýäŠýŽšŠ¾ÝT¶wð2`ðÍ<Ÿ]¾×ûæ#U·€‰Å™ºÔO?ÝE5,û>߯­QõÏ[ª‹xÄÒHHS¥‰7Ç»ÛÏ‚z_ÐîÂÎÛ¢xöt€˜××?°Ô´|ëÔ¾ÔúÀ!ï@åT͹¤¢.xMO»Ûo¸þr©'°Žñb«óíMøXDˆ¼†ƒyàíyZ7VåY˧}¬³ˆ2|A1;N¾4B®½ÐÚ˜i÷–ÎNt’°qÑ=h°’8¯Tš$¤¦-â`«aižwŸÜ=rŒðÅa²õ7Ø«i×F8'û^]WóOçßì°O> “c—n0 ®š<ž€Sž’@å«#ö{M„‡ûwh(EI¸S#o:^’!a÷ÉPŒÆ&ÉùÒ¶Áœe=ìºÇZ266=dn•$ŽX4$ÏdÂê~ô¶ ø7Ìæf£ÏÂj¬ÇúR„ÞˆŽŽ™Åˆ…Þðfóß(Õ¿³¡ggbû'a6kú¿³ùïøë_„ÙüW²ú£ëøß0›ÿÓ0ú_:ɳù« ̆ñ'ð 3ÓÏ€:F:¶¿|aû¯Àlèè~¶ebü4Ã@÷à†ž–ùï@oÿ6Œ‘•ág83óO¶ôlŒ?Ãl˜X¶¥û)Œþ‡pø¯Ã˜èé~:6&¶ŸÎ—ž•éomé˜è˜Yÿ˜ §0=?+?½0³  #‹ 0+«€+3½-÷ão¡6Ì,ŒLÿÓP›¿æ¿Xšéüا¶5 6³þ#Ñ(ÿ˜ÿBKG÷zŒŽž™‰îG<æüzFÚó_þŸ¼Èÿ¸àuÐ572pümÐÖÑÑùóà—·Î¯a?þ½FÿëÍk°§ÎC¯[ºO‰ŽÎë@ó—Ý@úkl_¶¿¾_cÒh¾¦ ùSêš¿ÄüÓå«©çŸÂ~$BEeûÚéÌ\¹xýä…2r52Ðù-ðw;¼P¯ÝÄÐÌž‹÷×O^(3kK'C£_Âþ²Í õã!vÀ¯} JI^’ð§i¡žµ™‘%µ©ž«+µƒí¯ns ù5* Ôï®Ñì½×©´©½µ“@PZ`iccád xÍÞ^ÏÞ Jù×K;€WYH^ALFšJÞÈÎÉì5%vÀŸ7©míÍœ_¯d¯AÆ?žÕaP‰zü¥¼^^YYaI>>y!E>E1I1~^(I3ýñ% =~=g/•å/#Å/Gþ’4ﯖ²òbÊ|ŠB:¯¶ ¼ÿ&rýŸá¹˜½NV\tlmì© þÿ´Ìô ;þ3±Ðþ{üÿ2þÿ©ÿðc¿9ÙR›âCAAÑl¬-݆6GS#€±¥¥ËXÂëäöOí @þ:pšH_"fÖF†¤*bÒ ôdOOÀŸCø_ƒÈÄļߥeÈ ~ؾ½ŽÙ¯±d¤tt^³}M ¢çøºÂX:ô‚––RzfÖ¤d3k€½¡‘=ÀÑæuÛÌÑLÏÒÌÁè—¼M€_¦O¯cãÇç¨)¿ŒŒ$Ôk¹ødÅ~K@**&ý:ºI L­ )‚*2ò‚€×y¼ƒ5%@RVYFìÇ®ƒ‘½³‘!”Çë*†ÔÙÆÌìGtŽ¿ìýjñW¿Úü²õ¥ýk^ŠòJBdP^P¯K3c¨?}^ü‹»úNf–¯§ù‹·_ üÿ ü?‡×àÕ±Žþï?ãÿѳ¼v—¿ðÿðÿè™þÝÿÿñÿT–­—…¼æU(§B(Aj[ÛЄ€‰ä€Pj2Õ%}É>0 ©Y’Éã‘q²ì¨f)åMíd§|ü°jZVC)-††òuqþI ÷S{€œsL™æîWnUå:ÕÞ06ÄzfoøK‚¡œ»jÿš:ˆ.œ ïvœ•Ï,éŒñfŠTMøáŸ<×q“ î$›jdiÐBK5Ýå‘DXåɆnZ]Ä%k–C¦,ñ4L™0X¨´/¦Ÿü­n(x¿×UD@3ƒ.cQû:%(Ù$:¦îøbʼKöy£ëàÑÑ‘úzo^ÅêúË´-V¶%øÂb Þx83ïï o#ò Ú-ñ² [-¯i¢Pœc9SõœE޲[–‚aÒ*‚³¬}X¯S=…9fÐÙ°jÚ+ $U4š›—eN ‘+Ý­q tçÎ÷NÈP[Ä™S3 ò1„õĪĘü©o Þû¤Âz}]3>ø“¯`eÎtïÓbÒpó»ûehÔÙ¢Ï ý}JŸ¬¾%ø7h¬. Eóš†L¢ƒMVÛ±^÷ˆ„ñä‘ãnЕN h¾x¦}&ËðUÓÝŸ1I»«ÒO®¾ä*®bÂN_¸Åjtö*õ… yÓ¤j 7ðÑÛ½|1ž³„m¤²’Æ$y]œÏÈ8x˜—¿¯óáI¯sN¬x²|9è1BA#¹à:rzíkï;rÿ½ V}=¡j¼ŒÇl 'Ò2‡úœw­·©îkŒ‹`ìXh2ÁVg’æFRS¸`ÝÆïåõzÏÓ·=mº™î×ã‘“Y1 bÄá/ò1shr zkfÛVuAèZìZÖŽý®½| ªçße ¦eJª*t½Óx¿¬YéåX´ùlþ~¬8â·–…$ïJÚþÂ&^ì3Ð5LEIÆW¶>”Å~plcç‹Ç ‹7xÁ$_?H¢ e$ô3ûi¬Í!•sJÍuaLú—píl]Ù¤Ÿ?ùÊÃm[ÿÔiñƱïn¼-øÍ­)Øåã Ã7Z]|IåùwVôW½×³žtðÁÛÁ_½#„¾Œñ,iÀ_Ž…1dAÄJ… æ¨*°”g= øÈ±So(sf êØ·­ü- >º=¨ß›‡²v3‘6)«Q«¬â㚪Š$ïë-ÊN h%©ñub£ƒóé!sÛ`8EyˆU"‘Z§læ'¦´/{_€Ê™‘Äã+£`÷÷EsÁ6RÜ­¬îP9£7êÍ}ŠE<þ'$S nÌ\t¦‘Ľa›pß§ÏRbë¼9ge]àι³DxÞ°ª7ªÝo¡|áWè»ãLmYd²Kd»¹Ù   Xo®É*)ÉË~›´k¹KµÞJA¶ â裶¾yÚ!}fôg9?¹–šÙþ¼˜ùø¦qÔHoé£r)¸j…1Ò^¼–‡Dõš)ˆúŒ#É.~Á}0´À¡ŠcÔ5˜OK§â<ÊIœ €M)Ç!Ð—Í®Ý ì¯xN/òùBÜœD1/@¨«YhQèÂÓ‰Pùƒ¦Èç³ì8¼°Ä.™6觬Ӵ&«›YØ“™Õ+–d`I‚^|ùQc[N/"¸l'±‰ÝÆPÞ¿6÷íïðD4FL×MY3€VôïÖÝ~¯¿Ù/·$Ûœ¢B%I Ò/ÃÛ+ù!½N¸2£â¤;ùIL :çÁƒ^ú!3+ÙKTl{m㺻ƒI¥ºòôeÎÛ÷½ýÇQ&ÔZ8†R+áŠt¥“Lo½¿5Iü0×U¡‚rŒaÌŽœ,Ã1•÷}V/ý²LB}€Ô¬,¥¢PSªÆ‚3ûˆüÜBTÇNBAãN‚¾œœüU¾r’©Ð)7—bÈŽTCį´©kOÛ#Çà¾é q5qôÀ}T_•‹E'¿o¹^d=ò°îú”O¶õLNŸݵÜ!Î}aeŸx¹”–îK‚Ñïm•LñEK[e#2kÄ1i]+‡MíeÇû¤¦HlfXÒSƒFõŽòuyÞ—åg‘|êåÑÏ@,‰™R)áש•GΘ +nQ~NîæÎ«ãQB†kæ™c±ÿ8ÉÞŽœÃ^Û:¹mYnÕ{LÝ:m-‚Cg‹ã½¾5&o™*Ü……ty ”„¯ýÎæóµz&w]ÃW£\‰ö~ŸTý¾a‹ŠÑO¬¼\ÕºÌ £ŽBYËJ¸h!`Úý´¸zø÷g½¡ÒÿóÔCú?†zø›ÖÿïQ•iÔhÔO>ükÙ¿ÉßZýèÿRúÿ•Êßí‡222Ñþ~¨ògøaN¨¸;9@Ê3¯Áév‰}¸>.‡^À—–×—o$qÁŸÂ/ÇW’<Ïé#ëøœ¹ÆÍÚ¼yv•öÙIûjHëÕœ;‡éY«MûÍÜ :ÛS†×Ë·³ïß?bްMü¤ZNö$Æ O#ÆŸàÅšÚ«ÏIL‡[ õ²×„ÉZí/ðÒ& Ú“´H&`¹ÉÕâj3*ŽP(œ”˜Ùé–ò”[«Évò;çCwÍ×ìÑ(Ùçã[å\Ed‚,.Üõh$B±0~»Ò*R:|)öe8tê¬ 5†e“[k½Rª‹ï€7úÆÕÉ;IÝ…¢ ÓÎ"÷¤ø."Pw÷½=·'<1¶´vß‚e¸µ>™Ší‡/fÑ…,¸"z÷¨ëSW'«ŠŒì"=…~ëÞTûžã7 D„u÷(ë¿­ŽT÷£$HBZëÓ¯Ž¿ÿpŸ¡*vL¬ü®£G$Ð×–I!´¤‡Qé¸;Ô(žøE?4¤´%M&•t}gcÑಂLG²yãÚ/~öÀF! È¼¨ÃbÌj ­X*µÁæqê`pš¢XÃØuaDV âÊ•‘¶s´}xîB18À‘Á]å-ÑRK~ò®!ä×f±ÍwÐÍ*ÉÊÐê|ZJéfã(ÄvX7tØ·¼8ü…´Š¢‚sj3….ÉG¢€KÖ±7]ý ›OAïmQ¯upPÙ‹$Í&®åbÆAÆ«V‘’ŽÑF}Bo âÀ•ÜÒl¡`c 7ÜôÀ2†øûn6ÀÀÄrÊÊKJ˜YÔ®¥|­EÙ¼n†fuô köœÈŽô6Qͼ¨šph‰¦¨ÏúÄ6å®éÐó|s {¡ô9¶`–a‘Ϩvá3 {Ü8ïlņ̇c†€IfuÛ hÑdßÝJ›Üǹ] î(âÛ‹×p¤Œs¨âØRk‚ìÕäF…L~rˆåHûvh *` á ö±ŽŸÅ/ªcÎéË-ýÕïÅÃÈäB$=*JûäNx…-¸ÇЇ'päVµ†PŸ'âò˜Õ L?§Ò”>å01iK]öhNQg¶¸ 8M½Ü‹„¨‚¨"¼u?²ÃIÈAìÆXéíVµ£&æˆÂÁBW~"=ÐcƒHàj2튥-ë™ñJG«Ú–Á#ž§ð›’<üpOi ÿÛ…·ž­½ù[C­°àÝ•/$Ù˜²‚ðçA£v«édЊ„µúWöFxã©Ò;µ¨`(ðœS`(>¼ ¤Q?½‰Í9;ѶN>öªçp=]®N¢j1ƒn¼©3ªaVu÷tÏKGÛ{Ù˜o':œ÷±ó=—H…$o¬?SÄjJ)ÄÆ>¸uÞZ¥DJÂÃ’—E>¶;Ä·31=åÂÇ8LiwsIú¢¾ZnUºohMªî€J”ÕÖ 6DšT(ÊGæ¸c¼F?¼šq×Í ­•j «LÊŠ¶Þ-L¼A;¶a[ùÂìó¦ÊNæ™Es Ùׄ)ÇAþTUÎ ‰8¥fP!rYG¼d—yuEuÙåÎòùÖÚÛ"GZ6i@¥7¤²ðDñcµiW'Ün}b… x«ÛJÐK2;ÌÀØ¢²¨Xj«!.Ì6¡’óau\LJ@j:Ð×ü x(]ê,V²êYìbÛÚÅlXð¯†2Z7¤švÂÜ–›xËJ• Û!tÍc=î~odÔLy¬¢ÞknXÛ×Y唵”Ê’ÖS4³çA>f%5¬å6Un|Q-q‰Ù [ÊÏ¢œ¢`ŠEDŽŒ¾íêdŸJµn nQÅù̽x.âšì05wÜ…OD æf”úõ-“;YŽòñJ­»‰ÏͦÿòVr ¯QQ 5ü{÷Ø1~ &&)”ÙÅÒ²{aÅßÇ»2Ÿ lÕ š…µ¬ò„úÑ©å¥Ò¸ÔcµŠ.a¶n46—ͪ€ò[.-]ƒB[+¨y%ÅýÊoŠ—¤-"0‚k-n5Ûf¸:êHÆdÓ~q¥¹2@ãm=§ÙãÞ;ö{ZÉiƒGzKûçôF8è9ë“¹Š—’ÕÚ…oóeI0pi€QgYÉ}ÇcááļÞS‹ƒ Œ ƒ|ƪŸËnY‚›Ñpœ''ÓžR%: °vgm†Yæ÷8ع)ÌG& fÚéó0JoOŠs —R3ò»MH~gbS/rËdvFFl,P,y(m‹jrÊàæ‚>ÉÄÎÒX ¨¥¶R]úDUêå“2Þí®€ö»Ñ©x’å´VXV5aoo)1ð9’V}ÛžkeTƒ`¢;è‚ïã“H#@7g²6'ŽÐB¤t.,à˜Ç}ù&äÖ§£±—\b¥ÅcÊlw¬¼Ðžž²SNÐÇN ¹ÙÇ! VöÓúÜ®e¹ƒ‘=3~rÛááªRrPÌHå2HvYéúâ4AºÁAºN¯ ´Öe‹tIOƒ³ [îíSóãª’Ó 9tÛE–T œrƒ˜qcÔoÂý‚„&" æ_ýö&¾gªˆDûg@ñ¹eAø¾9P·ñ‘pXOÄ)VÁ¿“ÙËcØŽ†Þ¬Ac¯¹ÅñÝ ¬=û1¢)ô¼ t{ q•°W´~CœÑì‹+±¯ _Ãä/‚¶1ÂCí¦ŠKÛ„ßØÒm=s@ø‚Úª¯¹{c:¾ÖÙãéjÛY ¸gÓ›D´ßwd~é zƒ´íœ¼Î™a©Wää 7©oz­0‚‚œ¾­£$‹*™{bxo«ïõÆú[O Û‚Õ]´×¼6Ñ‚Ü|}‚N§îì²­óàÉN\3Ù”ô\ù¡)ÃRE^pQšnŒ‰Â›K"‹bÆ¢1i?¨ø¥À0Ï5Öøä@2ÎÞ®UÍŠ×Q7YŒPxŸZƒ¤8Òmíè°rvÃJDbмÈñœ(h,~Ÿ©68¿`EØ–ñh†{U(étTÞz8[´Ÿ«éLs­S—ׄœTî\ ï €ƒúŒòêz×R Æ½×\IàÚ}´w[~I@fçÁ‘ÎÑÛ¾èê«p©ß‘)UÆÊ ÈÒ¢Ò[öffŒ6è+¡ü6‹•’& –ni#ξù RìÑnt¨ ‡IMôðTêŽ.]„4H¾ð FÂÊ\2Wñ¬ÅÐlOŸÝcô~D¸­ÊoÖsU)Ê7ÇEð› Ð.NÞõÀà.qR³pÌœØÏ˜œE“§ºàhk‰æÆðÚ¡¹+ÃgwS¹·J{¥dª+yé‘õsgåzžŠ“bfÏŠjžÌ¼‹¹HSƒšÜÉó›ú^ÕÀ-Ýð¹#Û©œ6ÄAvÅãxï9ŒaâDFù£,œ©ÂfITãÀvú2.iâò7B-e5% ]½Z¡·â V¿áötØÞ\M~6^ÿ’Aßm\O\†]×ì'Ü^ݬ¬÷ʼn÷‚ú›ûUWö£}Q=´ëó’óôžö?|å=eÛ„b‰ â9ê·ØØébÌüdj…p²¨Ïžn×=f©l7Ĩ®gFÆA¨f5X_ÄÊ×L€u* CcŸ /õ8.%ˆB®È¡ªÇêŸ}Ø"œŒ#ŸiØæ+j·$ÖŽ$)'R>4dùÇoÂÎW÷ƒRÕR\Nà-|uo®ZŸ›Z3ç|lKŽ…gÃÝ«j9@½¬/´DAã6N¹ãÖý­‚I…•6ÅâJ?k:‡ßdBYqf&Ù€ø¥šÄ³R¦–[+&ãJS ²‚6‰s µ}3ž ãÙ¨6++i®ý\t‘'iÈ«2ûõx'A>oÓ÷Ú²b—Yˆh†M¢ÈïçPXX O0±‘B–óC暬í1`wyûSÛf%É rE%wIÐPI?u)˜MÓ}ÀÅ@$·}\³œV‰: žáî Ü‹M"DØØõ"tœ^# 2Ñ¿C·è³÷_jN¬HT–7—/fp‡:Æ´Y£áùrÏûè5±òtô4E¹ñaYÕg|tÓÛmÄ®CI‘†ù,ï8Á×C»0“óB%¹Ì|f]Vçmføxz,ÁìUPkš&{ SÆ;ö,¬`§„Š(Eù¯•Õ.µŸ—¦‰yº)4!Î`jú]:Tæ¢ÃGt)‚ÆbM×^N켌öûBdkD‚[HœÃ݈‰lPæÈí¶&)q›Å¥ìp9GA¹º¹¨à;% ÖL:X fÏè»[ TðV§`öóSúXëJ#¡¤®¿ QL!}ä&NÃ9Êà'»ÓŽÅÃ%ô•tŠÝz“õ¾YßëA‘N±‚eBSgZA¹²¢Õô^[Ã|§"N-1­°"WïîL³yFB²«Y<Ÿºw_b¡#þ z‚°ó&Zuíòá@J@2_û¬piЋ¤€ê `«ú8Èt¢û¼è¤Æl`êÒ ÷f îº+˜}ó1¼~ufùûq¿ž(ð>ˆ·¤Û»kÒkmÕõ®á„À6t 1æœ+&JМï5<ÒKÐñÄOB‹Ë»÷œ–ÅaE­#©àŠ×(‘J}Ķ æbÕ„Å%—HFφz|ÞXuŽÔÕÃ.rÀ+¾Âž8.™ËÊ8 ¦÷l];ŠSÏÇt±¼­'—2ä ³¨kÎá_"©5ž%ÇO&éÃt–èíÛŠŸ™ïqT²$«×ÁŽM™^–z<„«Í©¯*--®¨¨g̤@ûZ¼ )>“2ç=²â(©#Ÿi±5,:‹¯œÔÚ`¢„Â(^.ÃfåkÎ’º\qÙ” L®ˆ ÛB7ƒ–‚j§nfŠG»eZ‹ŒÅÚÀpâ¸LXß¼¿ïöÌb»WíâuŸH¸rÓì@55žUþúõÍ6~;Ø‚?b¥lW½åÈuÄl.-á¾ëÈÁ4‰t&â-Ä2üøÀ7ÔˆA‘Ókªô)þ‡(Ú䬦/ÛÓÐì#;\Ÿ‡§Û ´¤L€êYÌï¤cMÅòñÏÚ+©nü‚§Žâ˜üÑM6p‰óνWA\újŽö¥ûóÕ<³÷`§@\2F7-àI’^† A·L :ö>§.·Û2ípã<ý•[õ~o×BÎøt"Â3¯Å­A3ݼÎNéÐ;P(«Vn}à8_FFyØž9é¼9/àjš9ï·Êæ59n¦¡8¡}Ü‘—’Xè7d 6¥ƒŸÉ2Õ3•Ë(ª&Í33 "•*P¨˜Zì+¦#ãøžY$OePÿy4æ?¸ ù3“õï¡1YÿÉú¡1@1þªì7 ¦¥õOXL3g£?†ùãš¡¾åïî¥ýå‡C,õLÿËÄÌÿ)f&=-Ý_33]T’¼ù÷Û!ñ ,Áä% ùùEŽobhR’:ÑÑlÁ±@OÛ‡kˆ§”j)5j4w´ízÁÓ·&$è yaÞ¾e-¢7Œ£<õZ;Z\¥ˆ_}pfXW}¹Vk9kw8óy¹Êþž"$™-üIµ\ I^¿F¬¨P°¸…çókmJÐt Ú"P¡ô3}u<¨qugùôÞk×çÑ ÒEÛqlÿQý“PÑ 1‰ñqÉЈqíë¥Ü/1óÉ4>Û¸ëåZíÆßò ¾×Ö˜šH*ókæ©\à6Ó šÑ•,z¿%ë·¯A•×ÙInp‹=Ëû’Ò”±³?²^…Vm&b®þX9²ª¶Èv¶»+õ°‹»Ný‰æ˜ã¡æ¦ÅÛו·ÒÐ9ò\=ï O”+S®RkµþÌ‚FEÚÛÜ•ý MäZØÃ·…ðN’’€?Tv ÿÃ9ž2Âf´>Ñ;¾c|åw­a³=ïõa«“]“UEžcUe,žaßq7¥&z`òRSÄ Æ‘Þ÷XêsÐ…¤H¸"j÷púKŒ "PúKYöm N‡¡o½· +ÓôQ?­³sæôÐm¹»˜·aûg~ÉaŽ3+3žgt}þ!’ܘ–¡ÖdÍmÌd®MmÃíð4Úì½÷ûìqmÚ§ÃãïiµfQ–Qncý{ì»YO+!>7œ;j[&UŒUQn»‹»‹{^pR¿€ <¥&k–‡m`Zˆ)¡òlãDÌLQ<¨"'|ÇÞñ&x^öÛ­rkI×\7ö>áSòòtodêV—.•áLv’¸ Rõ½$-ÝJDùxßæ˜ó'úa·$"ä~‘ “}Ëš7â„ VÜ:JºøHa[JR’4ùJ^ÝÑømö#÷áTÁà–—ly¦LQPÄùÐÏ4î±M»wBóº8°ÍmH[±–M8X/ÞÄ’HXЪÂ<÷‚.î&²«¬J2Âù€èÍoö!Ä~û+d¯ç[#U?؉LåY½MCNpÿDrŸ× ,f¥áR³UrKHÿ˜µ˜v®©ú½sv·ßª•+(Bñž:OÝM·çqGˆÏFQì;!ã¼äGö‡1 /F0["¦JRìôwÒQb›Ad,'Fõ· bé‹+ ¦ûRüê{qJ•…Xƒú÷ô&5B‚ÞåõÑÜ×<…W±Ãžá¦ï¦ܾô³¥k–?m[{~tŽóˆŒƒZUÂÜ•ÅÝS·TWjΑW¯tjéT›µ§ŸODÈLÛF¢~f(d‚Øëü&t߆BœÞ ·/œN(*™@-˜¡´õÜvç•N¤Ùf$Þ,D¹ü¡±ÍÐ|˜X!Â/ú{o’‹Ü#‹Ò•úHs<Ó s|9ÿw:X…MÄÃÜychÈ­²Cdjcö½,Û«pôøM*ëwž±ù„LAKúT@‰rfƒÔ£ †À2²ý4ø*ˆ­—¥5¼ô<ädTŽ.žgÓ–~`Î1sôµï²(ê°œnNWÌÒÒÃ5ײ×ÚìŸ4oÅ>[ãá¯É”%0û{ûx\mèaº_¨Ä42vúÔ×·81æ ĨVÄ`Œ¥€(ß+^/à"o9‘êxí±Ò\}²?[Û›O~y™#Æ·Ñ/žn¥·>ž¾¦‚.“Üšå]‹qÀV™ÃR*qCÀèé?^‚ÕëŒò&?ÖÄL=U25+¾\ø:¬` ÏÓW;QŽ *Ï_Õ|8u"Úã‘<=< C*AÍelV˻ßGÈ/ÌŒµ «ÅâV¶y‘´l"ròQÛÚá$Ó~Fè#¿F%½¥ ’èg©ÜV%oz´ÚÞ^}ús±XYqgd%^0Ev¥ØC&Ã=*?f)!;ðO|NÍõÂrgÕ”º«¾¨í#¤+‘ º/d6‹2Î|›TÖ½º×I§}B4ÇŒétÔH‹»E+_ª U¡˜5$g˜Ë‘\N¡zÄzŸS¹Â®ßË—W («uÀnˆ¢&DôP&vƤ*§XDjä)«¡½dÔ§r’(Ó"¯¤Ez-ì³¹/ñ•è ˆøÉ­±æ’ùZ£èÁ:ó _pT¯d¤¾<—¥’¨hp~ñÛU-Ø®A›L®Úî`:OØ QOH*” ¦…¾cÊ*0oõÞ€ ×WLgœæ3½øjW¬°´WåæÎ)™Ìi\+çŽÑ€+·4çŸÎ,î΀ð@U¬ÐPsbÆÇ“H…¥xuÈ͇§m1þ’vÆÎΞž†Þ´¬ øeÛK!H>1°Y Ï´´üw°Y­oöMÖôí ?XëñaÞu{œÒ§Ebmͦ5¬±‡×«Ë¦ê©(é™Èii­ãÌ:~a!ä¢Hy§†^쓾–q°Šï´¬4”i¾o+Ÿ.5doܘy3¢1“å¿ç®ÊÄ8 ¯"M¹…²sÆY sèouh’°â•æý!ا ÍQ鑸¨M…yÁ¶ô†„p$eÃÅ]×a¾+Žòö›³}zÅœñ¾×ö9Åðs7B" zm1Œþ¡‘kí;â[5uUªÆÜø]Tæøó&/MÃW5q·£ƒ$Þª•j‡D…‘ A=aeë,~5ÍžñÑIR»í!2¸‡@CBUöûø$wÜV˜è(× *N¾Ú¶Ûç_à¶’Îá0j-s›¤™’Ñæ÷?ä@fØ7°d[Ú9û9ä(iÐåĺ_‚[?úíRæ|æ"‹†^p±›ƒh€›]Î({CuÎq:›T¹yKl'^˜CÜÁ‰ˆ]0µ}ÌsÛ‰ÔYûBûähÛn?DBbkç}YÅ#ã‡o.g½ZÇ9?×Ô©4DäÔ >DïÂQ$ëøk]³M¹MCÄ9E+½LÒE1pU¨a§{oX&ÚåYÈ}‡H»Ö@ÒŒ©JYó ¡‹„þrì[3ø£Ò~µtUõîHº¯‰…ÎyŸ!Û1 !.³>Ì¥¼HI–×…TwÕ|—²ô3o… i€MNÒsñè¤=Œ{‡šs„Ýä—ñA÷½ƒÆ„Lg³JTå›áÈ(¤·Q†=IÛ¨`ËvÇ2\Ÿ]wïAª¢÷ã=çóšqAJð‘ÔbzùõYØa˜¿Ø¤Ð×É‹7æóÖ§Ü>‚Hg«ŽJIKT ›™••YXVJ èÓµ8hÂÊØº­¹ÁñМ»¼í*L’p§¡–'ï]#0GH˜UÅ£TW†­MÄ3R0³3paù¿, ðÙ¶|_EÊïÇ2°´— (X‡å¸Kû†–+’H·¸È`ŸnìÓ­²uO(ÍÃdòŽ«küüikJ‡ë~¹;°¦µ¹5<)°ïe—³×w,§™œÃU‚Ÿ?…ëqXráÿ ç ^±2gË’þÎÓ¼è$(Ó¥¢ ®zB´Ñž¸*³.qšwN@Ù ¥àÃuР¾üç\ÞúÉ Ó⓵}.l=æøÁtä¯ï¹¯ 7ð¿”3™Iõ>Ë'ŠÖ9òù ã!ˆé•Æ 'šÌ¡Ð¥­ªÇ šN§XŸ×C³W¾9ŽðÅFF0²ç,r;O‘RŒ¥ŽUGl7¥†(è“v+$J½ÇË)¼îìíåHz³¿g^7mžœóºƒ:µ›ß¼S•$ðÉTc€ºlìï í?Ö®‹àpn¨¨6¹KÖâfýâVÍSîá~,)¬%Âßõ4ÒÈÖaäѽvy²¡ôIµƒìo‹}†Ì—Úƒ¸wŽ]Ês:Ÿuj–SVá'µ†H¡iŠ" h‡ÕƒÓ ©»0ׂÖfb:$¡n§DÆ«ôTtøÒÆD¢µºqìÛC:¶t¯^9[qˆïÕ»vNµà÷½°ìg '”{Ywq»scÜ\ì1wÁ‘Y˜Gƒ÷7³Ôä•…É+¢g=!ÌñwÏ3ÑÞëÔUr™OŒh8wî ¦É÷ß‚9½7³ÌÑ—•œÉƒÅÊ{ÁÉò}[¼Y×ßE†‘’°M¬ë=’¯‘¹£  žÏÎMÅýÈO°Ôš0¼´¨[Ü2G,…¨_üñ e¸á 88þIò:´÷SÊhA'Z³½„¥¯¼—êøëÊ|ÄÅû›Öº×¹ï÷mì6OZÂ=×r_ášZÙ×ÌG •~+^;2Ûí$‚2æJ”¼URß|]m[h¤Žuí«@—÷=+½ ð*_DVÊr´UtlZYÞ­Ã,5P/!P|©\$ïËOSLÂâIqxz (zaèŠ}飨@EO„)®ß› ;±ø´ïÃ:µà°Ò¦,¿Fv0õat ­¤z‡ø[qnþÓVÁE*FWBãAV¹I>šæ#÷¤%¶ŒOËM<¸ö:Ý l—V˜`ìþœ! î± ‚6Ⱥ·x^û™ClZ ù}Ï7F5x‡`húÆÅs­]j¢2ßA]ò“oi*º‰»(¦ö@¸½1¡AŠî8 8:s‰Î×%_AAD{£ý ¯/A—wÄÊÈü ‚±5˜s¦ ÃGR6ËŸ¢O™³yh8½Zné›àOûDž`ÁçòSë®<¡¼Rfp}ºAHÞ•@!´#…‡V¼„‚íƒêp[ÕUµ™ *ÇZ s{FãDqðâ`È»œ¡ëè2nÂÓœÌ7øýôU —MŠc³Ñb5÷l³ôªŠºøSCÍêÜWe†xÈ«¾¸ôÜš ‰Õ]¦em6­êìrNÎI¤<šÕEî©@íÌßuÊÝÈS6èÑÕønÇ<¯5ó-éRWyjoÔ5kgõ™“Gݳ/Xèm÷\ÿCþoƒ! èèØèhÂó±ÐÑë°±³°þ/€!ÿ¥ú×Á ì´´ÿ$òoMÿ·Àÿý‹`ÈÿJVtÿ ù ÉðK'ùÀãC²þE¤c¡£gýÆHÏôwÀ‹Lÿ%0$3ãÏalŒ?ÃYèÿîøÜô¤’žží'$-ËÏHZ–Ÿ@Ž ,?C/Ù~Nžö§²Ð20Óÿ †dü >IGûw š ôÌ?ƒ!Yh™þ0$-##­¿“Ÿ€° ¿ «¿?-÷ãoÁ,ô¬ôòïð~`•tl~¨þÇù_¯õÏÌðÿ‡ŽŽ–ˆ–މŽáßüŸÿ/jM|¨×?€€­Û/wí¯ýŒ ïö RKJÏÁAÏÀÔÉÁÈÑÑ fíðz¹pr4Ø L­m,mLܨÿ&R2=--#Õë¸Hû#%Á_`‡G#k}#{¨ßò”5²·úñ4Ãë èhxÍ„`ðš %Àê—‰ %@ÏÚ`hö:›éÿÈÕÑÔÌáCcG—×¶úK³×’þéêþ˸ x½x¾q¼^bmm~åbæhúzÍþÅÜØÈ`æ05²7z-‰½žµ£‘!%ÀÖÞÆÙÌÐÈð5=Ç_Nÿõ2ïlôK™~ÿ0¶¶q43x=dkk¤gÿG¦giù#Š™‘Ã/ýb¬oó:§ÿeëïÿïµ¶ñÀOé:8ÙþÀð™Yÿâ°¿>EÊ¿dõ£œÖ¯³òu"E-F­Hý#©×•ǾzÇúk=Ã×Ë£™Ã/ü6ûWÏè¿N+ÌÝ~”ÀQïµÇ¿†¿ÖÁŸý£D¯ ¾&þ×ÿ“¶FfÆf”{3Ç׊}õžÙ„ÿ|B¿¶Š?•ÈJÏâÕ=Ö6{#Ûˆ´?†à—‰Ô/çààd樧ofù£P6Æ¿ÿâ¢?gý7µJ ˆ9þ¨Æ?W¾žÃëþ¯Më·r¹þÈÏáÇ9›Y½N¥^£½&ö£Æm¶PÔŠ¢€_•bÒbŠ>Ók£·70üh¼¯‡DÒ|RBP?ŒMª×ñ+€îõ2 ÷ýfcùêe€©žµµ‘å/¶ jÒ2² b PÔÖÆPfíqþÂØ5冂2³vü”4é/!J@®i,ö§m[G{McYÊ0uz­:'ƒ?%÷[!ÿiû?°üQŠ_#Zé9X¼F$ƒ¢66ûå…äÅdÅd¤¡_«IÓ˜ÿçò2½ÚŒ¬ ~i8fvËvß'Žœ¬ÿ4‰uø³w~Tç/íö0ïGËÿjêð£^_;õŸðy¯ ÀÉÀൠ,-Ý(¡þƒü]Ì^{âëHõKsrÖ³7ÓÓ·4ØÚ˜ýèÞ?Z·¾ÔßúòG°à5ÄÐòOæWÐðµ¾@é[¿•ñO¶¯e|õ”Ák×­o‡×–fù£§9ÛXüpØ/44z­·?•íÇ÷šØŸ2r15úuÿ·:~×^;‡¥µÉkz? ‡F†ÔPò÷ïª`«÷cþƒÄfbdmdÿš¿Ûo]ñÕ×.¦ÿ{××ÔÕöíçuk­¶®˜Z‹ "â !H”@°"&äR3àÞ‹{ ¸¥VE[ÔZ±µ®âÞ‚UÜÖ­"îUëÂ-®ï<çÜ{“@°Ë÷ýÞ~?ýõ'ÜsïÏü?Ï9œGý· êÉD(¬Œ=!(dõäd(‡Ì Ë]ôÈvEª¡yv¡Üý‰‚„)ÂcárX<á$ß#‹:ð£Ü5 E޹řMhá6)h:A ¶ØAOU44£ÑˆrSZ»0 ½ÔœÕaÄQƒi³i…ËCdaáv³è4Òaj@JòwŸÐ1K£I"ÑÈ·ÙŒÚ9‰×'ÓØ¡y&šMZ"!IVšIá¸Héà2‘…IAKp‘è€ø†Lþ±þ•›òñfd#Œh©HŸŒf ÙHB;p=0©HœP#¢rˆ¯`Â8QF ‡i;¬ËÝ•!éÁÔá0¿6wÔˆC£††hÁþâA9m(KÃÈÆšð>’"‚QØâíÞñuÔQýaú‘¦êÿ:(jÿW3!ÔŒq öÓìàµVk‚E4 8#Ž•´‘\½ÊÑòœp l:ØJà/çG¹!4Qd` abR5|q*"=`¾8 ÌP4´Z«Å‚¿¿ú5 ”Ë¸Ï sTïq›ƒ! †± ›u¼²RAihD$š­‰Ä‹ì)o¶2¤{§“  ·Ÿ$о-Mš8sj´²Mq¸#>Ôn„kdñüÀt!€¡)Q`*<äð‡ŒP;–_˜=÷‰Ày~¤[ІKð‚ƒ&ðŽ«%ÒˆÖì)²šàÛ±ßC “f†Âu¸H· uÝIu€~`ŽÈ•«D´)YϘM€(_é”lŠXE˜W« þj-¹<ѪMÄ—E;Ðpˆ/•É0õçD4ÑœHÖ¤@<WúºSN—èÝIäâô}W7ÎÃ!§ªf´˜ï©ñ ÖNeUúºõXâþìzPÿ§ëQÉ”pë;<ãl‡Þ‹T—ÁØ(MÌíÄ¿lL®üù—+’½8ÅcaåœbÂBY ­Öò¾œÅfÍø:‘<ƒÙU¼ $Ér»+œÕ€5„hBÍ{~Z¢Lái .пíëF"¥Èvc1iAx‹€(¯»\$„§î”ˆa!y(&b\ ÖhG´Ñ)íÊ6aF“g°*–†¢µø7ì©%²£ÅQ‹³.ˆDÈ— [˜øùš°KLŒ×êmpXXß…ݒм9ˆíÈrò ¦‚7p5XÆa^ÐQÿrþ=ŠC»š@mðË3B\©ã1-ƒdÄB¬ûÄ:±`^d¾Ñóh±ËÅ{Ûª@D‹ÞÙ7sM–Å©Zä+X±*LÚ×,ÅJý¡®ä¹`50Ç ‰eáæÄØ8 Ä7øºnQ;ØsÃ\eÉ? bù âZÚUàÉ w£çÊQä¤C’Þæð’`RƒO0áØ™³}îN§©PÊC$Êh* ú#=Øu>ä7ÙÙyâœw,ï.¥ä:û™p –&ÈÄ6i´ NÅ‘×aÐAêÜ5…^F«öCšiL48ToÇe²iåÇp>-$r2i„R%ÈŸ’£ XÉ0R>=k1ˆ ‚”/Þ üæøá†¤Â1½Oq”"ic¿€Ö£@üŒ–¡£-qd¾j;}€ÝŽ ²êu”‚Mš5µµˆ†˜ )`ûcuCŠ»È=™w<œ?F#Ea(ÛŠ@!SÌV$HJá¿IÖSËo*ÙiÀ€ „ zãp¤$Ø0ÁÊ9!9}Ña Y(Oñ8@¥2‰gb¾Y[òÕîCÎÙ~Žø”–1@ ‰Z“U2‰RÄÈ› >Ú#ø9›N$‘‡ïHƒØö g Ƀ^Íò™‹ò£I‚å•LÅ—`6q1( -ž4:éݸ4†‰SoʆfÔJÃú…ˆÂ‚pk «h*Ò ™´/ú]ÁOF«gã ^åÕ‚µé §y°›(4,\‚"e4m¥,™®JPUø³]£Bë"z±„wZ3HªQÍ˶ÐBq–ƒ¡ñ#$~ FoDk'¶Kg5ÀëA/yçR;x»RCS|☈–ÖXãNçÄÀ>XÎmꨉÿ%²´UknÏpwÒƒÙAÎAä¢ ”Š:vöñÄ5ŒHúžÀÄ7ÛÛ¦›ýCk¢ãNvœ|_&~r«(ÅT¶Áá©J"ƒ”To†ŽYµ¸¨Xˆ<\$·Ñ@¤JAând1jÿ{‡/:ø½Ãîõ{çP´ÀÒ±‰M ýý#@¿Sÿ €•©ÿç…–ðöüÏ?éüÏÛ=oôüwèQHPä«WÆ*eŠàh8ÛÓÑ[ÔÇŠ!ˆxÙ³=e¬ïQÀ#|²à€· ˆ E}ÐóÁÇHÌ µ”?øƒFù³?*àòEÎ&à‚U ðÕnÛׯJÁ'j¸À‡H[¹EB܃Ì"2X|’bwˆ®¹€†ï×ÙŠÉAr/ت^^AÝ,f†d’¼Á䨹sA¤ ªÅö:A¢T稀Lx‹È"J‹ ŽÏCµeyJë9퇥1êÙfK>’ˆ(#Kà`|Ë‹!à*¶“£åJ•*É?7y—‹›Âí%8o:ˆ9ÂØ>–ùKpÀ\îk’DhqöYhX€$\âø•VOB.œ¦šø¼ :Ø%Ìû‚H,ÄyÄå] [X3Ao9îüÇQïÛÊÝÿ¶ú¿\õFJÿþ‘ú¿ž|<…ú¿>áü¿çÛóÿÿ¤ú¿ #‹L—:×K{Ü¿Öщûe¯È2ƒ²]f´1̸~ý#õÌ÷jÊtï9™AL•WÒ‘K_ýÒÊ:Õ§èýñ-µéyæuНó°Z¦Gö£“=fî™>Øýí|Å/Á_µ9ØÞÿYPÇ'¾»+ѱgëêŽ!Í©ÞïÃņ‹ ݯ}ßáÚýˆÜ#ƒu™Aé³ä;Óüëvú‰†wJŒY’<ºÆâñ‘‡Æè&4yÕ±ÄÔ=Éo|ƃ•SŒªó¯˜nd<8õña7r÷}²qÊý´­Y‡sä⽢Ó{wÒNãÆ®Í;ÊÅëÆ¾õl´ghÉ“zº)[®lô*ürÝòkW'm­ükß‹u£êŒ\øx“oÛvÙ[c|Ïîõª¿$-Éw0%o’P¼âÌùŸ4»Ñ=Žõ)ýʵթŸRLÉÓ¾[â?ïHú‘zI½2l)ýÜú"i]”÷øMQMÓr#Ї[š²¶hUíçéMî~˜÷“´àѲ•\ĸvhs–õ|±½òwòºcÆÿ°ušøKùÓÑý›™ºop™}påô’¢›ko5¹3nÕãÚ{¬¿&k¸ÒƒÞrôò°˜÷;N«rt¡û·K®Lkšæ_˜Þ*³øSâ9``ì¶Û/wÎllÖ$/8¨õ„Çq…©Ò«Zj±aQ»Y—¯¯Õñ¼ÍcÒ®Ü`ÝrÇÏ.ùŸ.£¶G$<È{¥JŸý‘¾·tþÐ šßjNRd&ÿX:0wÈŠE«†¿: –ïËzœ¼uËçݧøì5Ÿ¯é%¿ºo-­¾04éžbWZ¿1“f·ï6ÿs£kÊé¬{•\2ú=m{·IÿÚjEaÒ¶UÙ‰Ýçy†–ßøðàkSóJs\>¤îŸw|+-©÷mþ>Ÿ…»—·éÞ¼ujõØÉÛOŽ.¾~¾HåF†Ÿ={ΪߢZÌFå™ñ=›æìm³¢uËŽ÷VÕ˜s,çéæ^óæv™øâ£ü§»™ÎÓYâèèͧNԮܧ~ATÏEÃj¬ÍëRó˜zsS}®uåæ&§ó³›f5;â6ÀûÂàÅíT'çäZÞO8U¸¿èf§fû'ïÔÇV×>ûnÂÖœVƒVµòépT×/'Ñ8¾ÝÞ{G¬¼só‰WÕCÞ5Ò<-E®õ·‹£®‰Ü;±ðü¸£›6ílöþ:ï×=7J[º?yöU}š—»8Àúàˬ¦9³ã¦4½sgÇ¥ÌI·®ÞvY>}Pës —®:»±ðVÛw^6_ñüÁñ(e·zÅ7ضcÐ뺉âë5Žhè‰éQÉýe;²|îLÌíQãÝwϬú^ÜsôYµŒf½;g,dWÕ‰0®Ý¯Þ»]¾¼°×Íè’_ªµ½«°«J›ð…?Æ\ ¸tfɩœ ²A…úm½G7~\/Dz3ií¡Œ˜5¾ÁcÍþ5åÝnç¯köÕQÒ%ýÂSŸÕYùÚ¡OŒ¹²oÛ‚øG…Ýæ?Ÿ°cGåM¯¾n]qZÏ.^oëÐþóêÐFJ£ûExCuh=þlÚ7Us6$"8Ð?ê?XsVXÉŸ®7ëQ®Ú,”ýsõf=„j³¡Ö,ÿSÙj³üûöõfùâ¥o²ælˆ²¯* ï¿¥æ¬ýeëÍò̪¨Ælùš³Žµfyâóõfy6VTsÖ£LÅÙ×3îïU…ÿÕu"–ÿ¿*™@¡Æ¬çߪ1ëùkÌú8¯1ûækËúzw²/-;Óü)ýÞ¨;K{™Ç-:êµR2ü{ÓÅf­›fŸ¿qkþœ’¥•—Ô\ÚøzBßE·ªõùÕ8üÙž¢é&³¦ý%éÓm_¿:jjð)/vò;›÷ä|j¹4qäó Ã×ÍÐË¿ü¼‹ïµË—}¯íZó¯÷jí-iîÍ|¼ÔÕåxg—ËS‹ÆÇÜ÷˜¹»GAe¯!¥KÜjk™^º׿¾ØÌåЄuÓýKâš¼»7ö‹ÏênX¾¥ëåCíc×E˜oÚâóê\Ÿ Û_ìëOæMËÉüy_VÄâøÙò>ǾT¶û!`eæ ¯Åßu¦Çöi­ý`BÎäÏN¸~Ø5àÕÝç#+å­¶DH?*\¼s5u³^ääæ{ö{xþÒbìRMÕa=Ly”]k\/Ð4¿š±Ö#kÍ‚ªý}ΜëyøS­·ÇØØ´Ìo·TVëJ_¼¨T­ÁÑ•ŒÔ%"—ôå½é+W<¸x|wÖêâ +—†®ù°J÷¡¬óxTõ. "Çœœ7qðéÀÒe«i9õÜÀ¢Û--êIzÓ¹ëç‡Í¸“=ë«Ï–}0·ÚÖQ† žÍ[fœy87Q‡Â‰§'¾>}õË-Æuæî¿s¬Sä„~íRCÚôŠZ±ýeb³í#êÏ™ñ•äË¢[ñÝüöLÉ“ì0ú.›ÜìÝ*™T¿êíz0ƒJ÷”¶íäñ¬±òÙ¬ãUNÏŽúîøO“žþØòLÑ{‹Ç&ÎîyiÊg½jv¹ÛætÒåFc6äÜž1ô{&ËÒ°¤púÈOŸÏZ°#UºK¢]³÷z“-~c:œ½Þìk8}çù¸©§S{…ïo|bääâ-¥¾O]>s·™èpèTcZrÖ$mêÂZõçg«-Ý´Øq÷öŠj²ã¶Ï¹éêË«_ò¾ðèj—OšìºvÛ?¯v㛽\49òER¯pï=+$Õ-=2³á ¨z££ªœ©ïæ²÷†¢Ejå/²ÇŒýò{óm¯îÐPìívùÈË­3£ªhsz_üãò¹òPøÐ™Óž¬º|¥hû§u?>¹Uçõ²}Êà»/Ž>Ÿ£#élmI{ë³ß§šwÖ,$šÈ#ˆ•ûÐC%0I¨OŠ}—‡ñ ˆtÖXQܼWë«‘},cI?9,é O¢húõ3çk÷ŒŒô‡´&E=Çÿºôσ§ÿ—Ð¥?À¥bŠ.Uÿ‰ÉðGNéÛ’Túîï±J¿ñþ;x¥Œì,Î+]õ†âF%#áÖ4i…s0M3“D$•3†@€0‚€°s„„PŒЋ~D¡ÖKáœV«qTëzR=ðÖ:pæXÕº¬¾æd©yÙõÀ°lsó°úæùåå¡íe§Ë«sÍÆ­?$—Ò©W²knxÄ §Ï‹1ZnÕ:´Ïé¬CŠ&ÑìóÁzåO2´¢±`=;HB÷œ‹ÖGNžWÌâ8˜Äš§ˆ’ ´ºgí/f£óWЊ/ÎßDŠQD„iV‚¼ˆ!Н#ë ¿c }gaúÑÞGÖÝBl¨âvš Í9¤«w°êå¡Ä©¯÷áHföÃn³â¾AO1LÑYVHgíÊgýp0HxN*‘VåPÅ<ÿ̶dâ: ó€ùšqfô0ƒÙC¥»´}Á>|ùÝõéaÅvÃXôyª"§Ó²ÖN㜜5+àˆÍû¶£‰{Š?Ø~qŽ KˆÎÆ™c6£¾CÀ'Ý "RªÍÎìMÛ  ØÑíÐ/Kt>+U­„HDÀ¯ÇÆA15Œ‰ýo Q¹ÄÛ’O¢LúµÀŒûŽÇSi³ Ýá›l’T qÕ ‹?9("Dé>è,Û°Mr œBàFEO[ø‰  dñ(`ÇäAŽõ}.¢6TŠ.ÆJÍ{à "Þ÷±ÉUR˜;“ã-RDtÀ”H¡L_%eA´£TÛǸ¹‰!3ÿrTû­.B’0»„fB“šÕч¨8kO7[ðü…¡y¢æ‘™°¦]3;™HžfýEY]ƒ-6oÀµúqðuEr0È_TÊÉ¡{ý4°BØL+^'Ãm±£RHê°“9W°Ø£cú”k½á׌xÌŸš7Ýh³*7ì”qØî· ²¦ÚÍK9z Õôá§ÈœÍèê]×9XÒ‹ùŽ–gãPCìõYÌ@ÄðÆTLªs%¼³Cl/lÉ±Ï 9×=e*ÏDÖ$ieV6§“Zbò€lä'Ã!0²Ð˜a8u™Ø`(\AÉ ”  5Â0Á”‚³V„¡+ÌîÖ.—Ép4Û]iÑ¢²Ç±¢æþÊŒƒºü‘…@gE"·„Á]¯Ñ÷É š)†V› õ/­r:€žHDîÃXÇTwˆ#@áÔL­=D@1ò2IÙ§gtŒdhѧHTÞb~ù2ë~ìnïæm;µ¤{ ã24¾Gc#¡—„ùÊÙ é¢[|®³Ôl§Æ\»m«KõäCãPªê`rׇ^$Ûh¹ƒkÜÙš ÖÓf„µ´†m"‚¬.ƒ¾<°l/ ÂQÞ,,çáWÄÄF™ ±h±[µÆZJõû+¢ÖGé…Öê§Ÿãß‹Lð;0iŽ13m9ør¸¸˜+Óë/úñj²GÎ&–Óµ]š7Ÿ<é9OxçV„ï”9n¢ÇS@¢£%[~˜.Þ‘ºÚòu¥>é¾qtÍ¿Mƒ‰DèRØÀg’˜¹œNžtȱÄÏŽ–, 5Õ_Xý(58t “(Ô‘SOI¤/®Ö³Vcé}.SvˆÌe¸¶Q²ã Ü.9˜â¢FV@°V¢äåûn$¬*ŠP•Ýa"~¸ç…’f t¿ÔÐióhìfˆF&³¸kBMM{÷v<`Gu꽌>á‘Úü»"!°T&u0ÁW{—Úôd@½J¡#TRRa0»ós :ÖhS_fÒ9/ÀhôRq¥[û>NBA'ž£1ÖÇÙaA5Œ„èî Lad²à¹¦½L²p‘!¢½µx¯@j3~ÅÂb¯»ÂÙ€ÈNë =¬û5²ÑÕ2ó`#¬|°„FLÑÉ+_}®8¡3½!7†W¿Í,¾Ç¶ä#\ –³ƒÜz•ëEÛŸ«ñš°v¹8 —j\ñ0ü”9¾œdgOŒ[GËšôf h f³ºŽ»øe–qßTÀо–ÙȽg~Q$Ü”ÁôˆÊ«î;VCt0¹]E†\Þ:V-ýËÑa/<+Vm„cÒJìÐ ƒô‡eºSœûÉIU¦A)Å’ÍAÛZ¹þÜ™U-Ó{ËÜi,õÁºA%;Ÿ9<ÛÒ•®À÷Nz1þíÕTW±×x½âT<¤óΣ#¯y4ÔÙ{ôDÅæ¶QN!ýi>ìRW' ä=jØPx¬"0#ʘÃç—,~$~‡Ì =Sg›è?w) Hˆ úš7Çtøx 9“w‡v8ÆŽ^Ûg»›-[=%>KØt²:nâxÏ¿n†Õ¢þ“+[kþ¡i§$‘0”¡ŒGÉXÈõYÒQ*Oò30'fŸ‘;c¸À„¾;hÁnˆ–Âñuù-TÀ³)ý#.º¹©XX¦³ØªhP¤E‹§?é›)Ø@¢|œíS^Nv^ƒÞÏž2/tžêÓú£8T®ÜU$Ž=ޝn]`9=Þ‰ u®²"”ºëÅYÏÐ:žlóºVg(6sÑ=J=J¯g›eé ÅÉmñkç¬@ÂWêú ›CòdÞ`ÛYª}6_9³Å¶8è ½ÀYL"êKÂËí6S´qwë6àxñ¬,Š$é[ISÄbÀwöN âÖ§2yŠskâ( ÷ÆöáÖ˜OŠÌSÿ† 44(^“tÓ¥þÄ!ˆ9¥ìj/À"Hl÷Àx}ùc熽@èÄÚó5¤ì½íçÁ]ï×âÃÓà,j£y¨ÔW¨^F(—|–=ûÌEòÏÏE&:í<ŽrlFå&Kë\ÝZ¬¦U2êÀ®d‰¢ž‡Õeý„¨4.9¸J=Ç6[Ò_@;ò2ÚÐ/®©7TøË€#IŸûE̘cS&ck&Kq¯rÑôžch{ë“l+“C;Uç‘Íæ ¦®Ï ;uwK±xϸÐyóV…ºðûÅdSxˆW5ap¦¨j¿*Ç“— ¡£§æ0 DÓ bi hèòD)ç U3_ö'f³ðaÞÍÆÐdQxÿêÂé99 5·ºX,=¨Ç1TÐw!§l‡s¾Lå DŠp˜f³ŠÿÜózðü˜Ýì{·â €u6JzRNÔóZÐÏ·Áär ¾Ã'5FœÉÕïß×ÑvQA®&~xÎÄ—eÒ BéÉPvÈ]ÊZ—·‚n¯)šz&—®›À87ÊqлÂh‡Æ}nŠL8Žï@ªÙZ€Ýª]ï†m‚»¾ßÐô„²€T¹÷± ¼¡HÍ’ÊYŠ>Ž(5‰ÇT N ZúÉ™öt r¦‹•aÍ“­$(¹Ú±‘µÚü™=8F¼¿¥÷•@ošêÕTÝØŠq=i|4"æäÐCÜ$jÓö0 ÚB‰ÏÁ$zHéé“«£‰‰ßxû²úmÁÚ–FÇzS‘Ö2pòÓ•$Íkµæ¹™|ØpâežÃ"»þº4\ kŸh4n n£RF*ÃK”G5´¸Dåø”éhn•uïºW#.ÜJ׬á¨7³ª?õ¡¼]„ÝbàÜU¸ò¸`¾p‘ÜØYš:¹èÐvÎV©Ij[žÔç™y¸*ñ4…×!n½|!Üõ´¹9«ÄåÂ<£†î>_bË7v›ãλ–É¥–¼‹±3Y²Šjµ¶îX‡ ô4.瘆‹ðñÓ{J·á+“ûë÷CŸæt EÒç»m&iLÇ×zÉE2š'u¼ årvº¸o‚{KôýIÛ{jÓ¸(óqŽëzg@ÒlC!.ãɇ @²ËÙË…²¥Ü// ­WIÜ£ª}BÁ>¹mpú“Ç@ÕcFI¯m®3ê¹ó¿É»I8æhÛ,°F­—ÅÔ_my˜€^8 ›±Þœépi©¿a=•í–[vôÄéÂó¶¾ËHvkÛ*ÈriñonOkñb¸ƒ±½;»Ý>ÛÔ´¾³xÉQ<#{Ü'çÊHËŽ‡$¯ÛnÉ2bú}ïJ¸W¤Õs[ªdpBé“)Åôxj^Š™( ¬L³÷?Oý+_Eý‘<ÊøgäÑßžú³1þ›È£?N»DhEsâõûó®¿ÐG¿·ÿƒôgüèï¹£VfVFÿ|ôÇá×7ቿuùïŒ2ѳþ0 ©¤¨ZßF¿½¼!„£ü¶¤®®V#WCGC> ШxÁS ˆ(*•hˆdDOn›_N´³J£„l^ü ÝãÚZraÆÎ%ð¥ÌIÐã ¬^gXm°õ&µúæùúƃ“JÿÇ·WŸú2"ZRç°¦UW³jÕn7aºÀ+c¹×zÎfm1uØãh’V2jÔÞ†¾Ó¸ê¤ç(Tv@,$$HJýnþìÊÌL™Û…Ï\Ë^5¥ ãóÃÄLåf!ÄÚó¯™^Õä;½®ØùwYEƒ”&¬º.LËFy ã•AS³Q¹/nþ;Ü]ÎíåÁàˆð¥Øcï=5Ä 5ûEeða9Ñð÷0·¶pí¸XŽkí*–jöÊF­­Õ÷ZFý Tû!œÖµ×•»üÔ¤‘ÞBÐêS¯I·ˆà꺱BèêÓVEªÉÞ"—÷€éóVE³ñYÂ!Ý×ÃQ÷¨t…;² ào#†÷¸F¨ µð’Ä#\¿®Š]E¢êŠ^E¤EZHA² ¦[|‹:Ì>29’5}HjW?^¶SºsmÁþè«!2è `è·p1Z=æ”j*K{ªmc½¦ºM5¤vyâ(zèé¡×ÍŠv¢–Úf8“Hü‘¸ûüðËuøõ\Ü2µ$+-*´–kÀAϨ Xóž)?©ënu©>#ëD&U8N¿ë}¼G°ìøü³­¸w©À³1Akiшœ¼ ßÛ€Ðu)¥$™Ä{<)$“STEÆ¤ÂØP2CaMvG{¼š‰E½é1Ƙ!LÑž`âìà»8ÌÎmu‡T èú+è«t>Zë๻5Áç´r±f´@±üOLw”JoOùŸ (DO2óNãO{”²²”LÞwh^¡¿ÁÍsP5¼ß4Ì‹[¶0bö¤h3x Œ;Ò;¼¢xçÜ ÿ6šû£×58A8ïzžïˆóñæ,Ç# 0ü®ÎLI~Ì¢†vƒg$oJÚ;Zcoúu²§_è†ðfT6‰ Q¹yoÅ*“è#–„‚Rqqf4ø(joÙ½»T8Ç›>á)PiÿCôGˆVÜ3‰G•é|-ycójžÏ…iY5oW˜¦ÜcÇ«S–É ¼Œéï d‘khY¡ól?‰)' ¥ÃUgNPŸVœSò@jgJ–¦Ü<¿ÖÃ~•lC·¾†JðÎóv‚wcoæf£Ž?ûò#ˆ“«nØ! þ£7€†‡Ù‘=k;sŠõsG<=NàzlYÍ’òø²«=ÛÀs œ~á}ÆM«´%7äÌz2py{·²3Ô·x£Â%“ëO+mk¨±‡¸D‰™J÷fÑIËúéï)&Q;‘ ÆPÉe¡Œ ÉwsäšJ¼»]j|¬ÖX"kàÃtýwÎpeVÙŸ›oÒ.-¬Ó¥íÀŸ”ÁnÈ“…¨·¦ø ^ØÜ<6§ÕúëOIoÓN£gN;eéKpÛAËQ£#íBªš;Ã8ó–(NT€7ÅW6ëbÑn<=‘|^vÇU‚ ƒv9ÚÝÎßO¶úÂo—a ”OJ––6ˆ1 Š0^º-v4ÄÀ'ù­ôX´`ÑÞ^Dætâ߃&ª¯P ~äEŠÎöåЉWÌݾŒŒèŸ mßìÚ\”2R1©áBëëzÿÉÞNÊn^Ú;óåeßUòòÁ‹žÛ±<Îþ£gºþgÞ웆3ÃŽañ[Tj1]zS‡Jh‚ ¹ɶ.ЅŸPžË¥ŽK%FïîT ¢? ‡ «4bN}pÙE SZVM0Ú¿™cÈšK _è÷=Î<œPÌ?©SWƒ'–‹æÊMP2íÈÓp£U‡–œ’xÝ®`®” (gRü1]ºZÈBñæú™¿èЧ1é˜0?5IäŠ8†EK7nHº“o{ãU!Æ&éµb®~´Ýæ—jQŒRo•G^ÑeY³y Ç¢$O¶·ùŽ˜†¨ó“æûÁu *×4Õˆ²ê¯ë'4ßñ6EhÓ˜xÛƒ/mog'°A)Ä•) ¢*í£‚’÷’ƒ"ž^.í|¹_SôÜ­»,6Ć æ}GðюŸ¶3eh0û“;7rt7äkªÏSó™EæµlÜMô®7 Cs9G@R‹a±ÓÝ":²’qÛ»õæ–qŸ½«5Å+ƒ¹Ÿ7××aΣ›Ø4Û¡W  ݪ.4„²sx5ÚOÚNÚ[Ïàp|„ÒG»†zîs2ãGDS•âÒ£“Àâäb2ä1L9”qÞœ ’¼}wzÞ,ºšsK3ê£+XÓPÖ ›I á5ªæHŒ?›…¶…ÐZÇ<ÆWv½VÎïMõcÊ~§,K-:Gž|ð³ Ö)}›+x¤öa)6Çð8S>‰ÄG…W´Zó΂ÞMžyÏÙ/ÐO…K]÷vPáRU£Ãr¡I‹Úd´Ÿ—ÉPÂßèæ‹¨‡ÜX0›Ó+ŽWLÇ{ší ! ÚRš (O΂GÒY\³ªSr7‡”=ˆ˜¹…J#ÀI}4Û#.O¾œÙAy èÀZtàb$± ^™ê{fž$…Eé·j?Ò¨è63PÈ è€.ÇI“Ú°2©<7;pr°a‘sΜ@uÔIá\}šade>D‘0’ª£’…YŸ¦õ’Ùr( l×&I¸OY+—*â8ˆ:V}ÿªz‚“ŠŠ#ZœMlpšëRH¦BΈr[À0Žj’²°(ÕZ'c_6 0ݲB±¢b.Ž3*uÏR„kÜ«þ¨ÑÇmŒ©ûE÷p@´®l[Ep>Ü”c4fìDËÅ8U.Q³~އhÚÉ·ºtù‘ž]¨Ã›æä äì¨O@›’¯>ÔÐÔrÏÂuÞs?[‘o_65™KJ·ÕñiMÄš†ê!šZ”íµÍ’qñJ¬ÁŠöÌuêí}$Ã}³XÆ»«á%{5ÁÜ&Ø(Û™t‰W`WÙTZö¡ñ=+Ã!jJîàCÈ93¡¾ŒäMŦ’§4Sq‹,=PVµ ™ìKëYÓ§K7­Z¡ä(†¤#Ûb…Ú88—P-µ¢Ü„OŸîxìšÁK¯$ä™Û™ë¶ Áé8W+C­ßHwS1;N¶«Yù‚YÞÏ_×»O‹h󹱋o*w'¦@ÃEs^ÍYrfn==Ÿ‹ÞUS¤æVÐû‡Ö£Ž“kÅ©– #¶ø¤ÐùC)£6¢VÆ’§ÊŽÇR+‰0oª‡ôõhôI«ã3»* T g§ˆˆ#É 6”b4¢Œ‘¦õ!P'’±ßof¤ S‡ÆPv«nù¢¦a²:Gá¹ÍTµO:{IQŒ]ÉK8‡ìn•ñzÿf­Y·&²KÔ¿¨·‹qkàm!ËLÄ!¾ý5o4"Å)t/D=ðˆG `Õ¸“j]ÍöÛÑémú77ø¡é‚I_d3ôÜNê¸@£ØÞ‰Dפû= o~ÐÊ︅•¸°ÍŸí.µe¬eÔÕ(»ƒxKËË8PD é‘À¸Ñ™-PµÁ~p<<^:1âXó¬£~÷ä;×?I«¡.+Ïñ9ë\Þ*_ÔîUÐ ÄnJHÐë¸@K[ÝRÊ÷½ö±d‚ ÎȨÓÉojöÈjíN)ZìÝ¡õ#í5ÀÆ!áï\LÀ+š‡üÙÙmóRÓ Q*Gì.Öµp¼œïºÄñÅ¡$ã©ß¸ivXßÐ:!H?Ì Ä‡ŒÙÒïðµ1C?AŠö¨$l~ Jd?¯®È´ðèíÑž‰ X.ÁC­[.› )tDkÅ´Ü;„Bà H§kw&Îa,P¶ÃÍ|kxMm¤¨ðVë¡È\w\Öø½pŒ´? Àʼn¥ðTõ½ÐåùÙëK’™Û[­fgØéÞk@–<Ó‚—ê4‡ù´ Ã/ië }Úßµ›Ž«2lZ7(‘¥6î'Ø×;ž¦ ÂÀ^hö+¥Dï$$ ßÀs Õ¤b=ǽ³·ºWëà"±R{“‘Rø¯}£,¾étvÚçŒÃI…{ëÃ(ò%½Ì‰ ûb¨óƒI"ŧ22¸ê¡j_”ƒ>ù 3ºä:¾ÿ4'B·SÔUÝÙåÊ0H£À mØDÓCÀjÎé<.@yVå^Ëo9°J KQ¦®NÁ®K$,€ŒiÄèþ~æ5~¾H ȨeiKÑZ’MeØþ',;=’‘¡¡X#Á¢´×­áC_ýçðtRa]¤ÄíóFì•c0 Åsjx\\ÊCÔ‡ö Ì ù²¼®ª "v(I§òíŸJF„:ýØõbÞ{wW5gQ^VHbŒ˜Žîy³4ñ¾á©Ÿ«uD¼ºmŒn^ãÖmÈL ºÊ<’Ao/¯7`ø`š÷Ò­v&<¨K§ÿd£Ý C.•›Â/_Œ[.Üèªû.ñà5¬¬¼j¾AMV­R_˜opìuƒ”#Q{i’xÚÂÁ‘mõÓÜv+²‹)½y3 yNf[CMaa[]E1¬ïs²X¾×:YxšÑë<ä-P£8,c2êÌäq›-©.ÀˆL¦ãbxT;Å–`‰©~2©ÊÐ@r¦—Ë/iÇžÁxýw˜ªÙX‘Ý|‰‰{î\™¶—¤BòPÖä²RqØ!–+¤L±b@ QŸœ†ZLÈî•¡ºYš:2]"½´nÉg¨£ß¾J?ûÁÚ¦¾„<Å¢¨²×ð$âîÖå|nÙ |Kù˜ó(¾áppµ}í–¶©%hÂk¦/ ŸÎ¡m4¨TQLqx÷àÄw9CG }ÌdÑ(:óUîÇš¶©fx|ÖK-˜ë©È®1„••×Ð,ŒRž&•m硲‹¬· Á„·ï ?õÔäkõŸ]”±ÜæòÞÚ¼gb —G@G§åNäÂN-koïO¬¾ˆt”¡rºõ‰02~ùR#Šl=îl—cç̹uz2Ï#¼.ÈÚÈ(ľ‹XÄxá\ç߯;– Œá›üJÜ©¥Ž¢y§®Ñ]¨_ðÑuÆ]¨Pôç‹ì¡ÒÏŽ*ÑýòËð œR™<ÉëÏï4i[€Ûìq5ýÔOðæ/}ÔoûEÚºëk©¥W{gðqõINý‘3ûœ½#³ÁβOøûJÚ' Ý0n;Ë‘sd­•o´WuSW­ðÂ1¼_¿¹tçôà Àƒùˆ œ{˜³£¡>úò&2Ïvrñ\ï"-´·%Mp$j˜„ ž¶š¥¢Sföx¹9ã¸ìð.?$ÞØ“1“žiÔ¯Q=¤ô6ÖF¤/T•¢B…¢˜êª¢§õavÂ4CEßqìÅ–ßÃÓÓçÕÊuµž‰1o{!o»ý¡ï--Ÿ¨‚øÀ©ÿÛàT6V#:½?â+õ˜XÙ èõÙÿÀ©ÿ…^ýëàTf¦œúûGÿ·À©ÿ{ý‹àÔ¤©÷ÿœúœÊð}’ü-pêoJüÁ©Ìt¿‡¤Ò³0}ûU÷ßÁE™þ:¥g`cÿ‡À© ,|–™•ñ°RF†ßC\éØéØÿø,ûÊ110þ± ûaªìÌRŽžéO`¯L„ŸÒýœÊÄBÿÈ,;ûÊ1°±üPËÄþë÷ø¯ƒSè™™è™ÙùÙDX™Xé…™˜¾6Â"B'ÀHÏÈÂÄÀÂó÷KüœÊÂÌJÿo§þÿWÿå‡d’­ãÿ”þ#ËõYþ£ÿòýÇÿè?þGÿñ_ÓTTPù‹þ#¿ƒÉ7Qz†¯»ØŸ @þ²ìýÃ_[ø—iñÏ)þŽâã_ý÷kì/MP|¯ïÛ?ø…ÿ°¦ã/5ü—5¿šçgMG 3«o¤ŸQß@ÖI‚§Êã½A‚?B„úÇ… þ†âOöüçµ]Ë_¸*Còà»\âíŸä—û.Î÷ýÀägÌ_ªün¿ßXê'%A»ß !þÀÈr@ÑØÙ@Ñ|5%“ÕwÏþó!sƒú«>G@@aeälÏù½Äïˆ{Nß ðOo}_~¾ZìÏo~ýß?dQ¿å"œP?yó·%òÛTû;¢¿2ÁD!ÿT’_…_\Š_@\J\Iê;ô—Ùÿ­ô„‹Ù7Üï·¼ðW¬Ð_ål¬4tMaòÇBñ]>ò7Â’ßEˆ~§*©úÓ®ôu—Ð{ë O fkíjô–€ËÜôû¾¯“õëîù탇êRåvØÂøÛX*|환ž=Õ×øÅ€àW‡lyê?ñÿ¯âÿzÿÿzØÿÆÿôôôtŒ¿‹ÿ˜þÿÿ'þÿOüÿŸøÿŸÿš¾Ë¾3ýuÙ÷Ÿ@M_ƒýH{£ßùßIF?ñXý¯ÅúßB`C#ãŸQ¤ß›üú3„ô;+Òä×þ7H¦ƒÝÏšì¿Eª¿üË“ÿÜ“ïmýê•É~ôåOïÛ?}ü^ÇLä—º‚Wþ˜ÿ©~C+;‹¯ËïÛüö¶ßþÍ{~¯ü§Ï?¿ÓïÞœüï¦!?ÿ—øÃì§Ñú†±²û ÇlLðm:XQÿŒ‡úe ¿ß¶ú-LíÛäüùõ¿º›•ý$ïO1ýÏw¨ þiÿtÔîwx¯oüC§o”õo¯ºæßq^?0IßYöP?-¨¿àºþÀý;eúoÑú÷þš|gî|_Á¾Wüc}øAÓÿFÒù)dýá´ßï~²µý·lõ=Ýüª÷ÇŸÎPÛ}kí[>c¡§odaÇùögöý»Ÿ¡£?Šþ`.ÿUü‚†ûi¡ú†âúþÜUôÛàÛ}õS£oŒÛ¯ Á7î÷&ÁÄÙèÙüuú˦×Oð³ûýœ~s½_%…ßnýXR¿å ¿±Î_ÆóGXÿÙffõÓÊú5ý:…môhâ<~Ê_Ó:ÕŸ‘q?j°û†ìú†8újµþº }Gx§ò;åþa+‚_ƒª~ np€8ØÏ³ƒJðGß—hÛï5|KÕ~Óé_š´ÔsùÚÎ7*ü×õÏò›<©½Ñ7h£µ-Ô¯n:|æoþ–Ñ~këënð—0û'×÷ ÛÚöü¤o×aYþ¥§?óx$‘&Pß_߯ìWˆêßO×_=ñ­“ŸZãEïWtè¯éïw$ÕŸXá«wþЉûK¶õ£Ø7— úæÆ_½‘êëttú³~ŒÓ=ç‡á~•üAý•äýÉÿO5ÿ솿Éþh~ÿØÏù›Œõß|Žó/˜ÂŸ6¢olä_`­P¿™ßof¡ú~`õ«|òÐðw{}ݳä†v웈¬‚´°‚Ÿ¼“þÏ›ú å×ùõu7úUÀòK'¡þ${ýU ?ÿ[ßÿÏ:jýc„¿†ßv«oÙªÔOSí«}Ïn¿ƒA/g™ý){÷×ÄïÞïIÿ/Tw=û¿l,¿ÅÓ}ÛÃ9Ð8¿`©¾½³)Ô_¸‡ß¢¯ûú÷“§–ý5hìërömÂZ9YÐÿ‰g)‰È*ËýOÙökè÷5œý½|­†ú«@ýôä÷½è[߫ߨ»6%¾±!ÿ¾×}#–~¯ç[ä÷ý‹ÿDn£XB¨ŸXŠAþ8÷øÿÇðþŒÍü»f²52vø™ÿç€ú•þ‚!ÿ¿b‰¯Î",«¬ôÍÍèüiÑ3ü1Ûõ~Àÿ„Ôù)€þ)œù£ ÊÊÈüläß×mð3¿ùòñß8Mû}[ü2‚ÂRR_[RúÍ44ø†c´°ø³G¾FÆJ Ê‚?GÆé߯ÙoûèÏ¿Ž÷XðO›º‘!ç¯çü¯Âµ_<éïìù?g P?f¾Ý÷½ÕòÛ¦ùíŽÝ/6·ÿ¾ä~3õOqÈ·fœ ~“†~‹·~où;Ëùo-]T¿œ­ÿ1 ùö Á÷³y»ãÿÓÉÿO@÷¯Z|ÿÁ¡È7¼Í·öþb‘¿¢þÑý¦á_šøn8;‡o0ÝoÆûbKüú›‰ß £ú>A¿%ßHßzßýßê[ ÷»Àåç.G ¾>hc¡gðSXú­Ë_'øk'©¿ŽçþƒâùÏ¿éü÷7à§èoŸÿ23б2þÂÿ¡ÿv„JÏÄÀÌðŸóßÿCüõ«E6$U„Yt‡‰QTa…„´^ Ì“uZõf¿Þ[É£i jûà‚=O£—w¡¹ÎÑMG ¡\lñd÷•¾)^ªnøºŸYß6.§=]±È%E¦µ¥#Þ!ÁòNs^^@¡õ¬wšÛå·½"ƒ’‹•Ã!5­å¼X^¡9i{lÒòhiÔ|z|°¸Ê¨f룧Ò22Yì\3½æqoð8Ýí†ÑF‹”žÇé‘@²‘B*G{Ð_j½‘Ô-kÎ.×°SñÐCã ‚0>»$Bºuœ™kWmO£îy÷æ VI,Œ›ßZ¨·\jÇ : ©ËÌIï^›š8Û6¤2š³ªäÙ¢+Îmâ¢F_›LJËÓy¬ÓBÓ¼Y<ónûn6Eá‘m,áŽÇÑŶ7¼XËø‚Êx©ZRÊò“§ÇÅÞñú˜:)Ú óù¬Û ­p-Í•¨—l fpjŒ³KhýK”UI͸ÊÉqëqåxµ»_Û(RjO˜\ Ãåj+¶Ç°Ú½QZü–A“§g"·³­Òû*­™cèiŽKù —B¹&pc¦®6ø’ŒÍ!;p‡;ÀÞT¢Aïƒ:gQ¶¯øŠ}°úQ~Ïl“ 4G÷޾R|ôyƃZ-Ú (RbR™!˜$YU”Ž.KN¶; ä›uµzËX w©{ÒÉžKƒ‰;ÊàQáð0À¼Óp%ùé=ÇüQ=]¨ò)6Ó¾•‹â±Öµô úy€“HYá­fæ<Îçìפë[®)*Ê:û¯æßú!ú ¸”Ù©¬²•]³AjpÕ½Òåä¤3wl¸É¬á¼Ls7x5kyt,•ùúõ®=Ò{6"ÞtPý† q ßàð•—”Ž{ÕØ@ÕÓu× %pžø°Møñ”ÅÁ±„žÇõ„Õ {!AîÒdÀÈ»÷þËÕ}sâWtÙˆa€À6þØhIžéaK Šéñ”ú 6½%DYç^q aZM•-œí­·5M xvµÄRÖµ£‘ŸýË¥}¡ ø 5˜ý‚]?³uñ£À;ß¿±$J™3Þ•/Äh÷B¤Ú¯c/þ¤1ßr§RjÇKHÁ°ú~}œëC2~”Áth¿\¿|‘ŽØ£g™-}­°ÅÛ/ÛÁªu¸ R¼ñº>õožy,;|h¬çͺ|\  ¾°“ÁIcæ)³Œ¢ñË]·–‰‘VÂØiÊËöBÄAØ™G¿ÑU¤M[X+bïr$Cô›EAèsîôs›„ÔÄ\Ž Xx§b˜ôn›Z²Sà,&ä)b}ÚÑ*1ÃTEŬõ @1µÔ€„H¬=Ò¨®3[?Ç»€'¶³çÚQe¼âG*šr§$Â}0K@ŸpóMB¼‘Üf_ ê!®”áq <$›Ý<²W%Ã|ú°oæµz1’e‘¨¡ZM†ßÒ4"ì܆J¦,Já1bð81²L"nÕ&»u? öÈ(4õ6`|½>1þ "`^µ`ÑκD3.t'HH†Ô: `àý4°›ç TÈ–á6*S‹SµGX³`졨$õØb‰Àdߌ,¸h*šXd•ìÝ)ònù[1’(j«WÞ«‘Ø…Õœ›j¾Ê™p¡ÝÏêËŽ6 ȸ\çû݃ON%)E[Û¶'E+[¢£Ø1Áü¶@_ ‚™môQäÉb‡´B¹Sò—ƒs“.³Èº„ÂÈ>ˆÍE2rç/6Yg¸ã€ñ_¿ÖJ:DCbŠ`‰{'I†•Üõ13€#˜B §SOLÊÄΨum Tï ‡å°¿iêÛ¹7ºuð±~e=uºv‰Ž _ì”,ä”ìv»C4Èᕨ}³óÑtC0ýK!3ÑšÃCåÒ…fÖOËòyÂhr%ô:̘廂²œõ³Ó_ écìJîÁÄr¿Ç«€+ŒG º0dz¯G?³d¿q ˆ&Z)ª¸ÔÃâ N¨'’ï±MDblöÉðVd8ol¬ÇŒÛ(£Þ+eóP€¶ŠPJfÝ)c|<ÁÉiƒN&ÀE>@=ÎáiñDzfPétÞñs_ú+U¢È¨wÑlÈ­N.Œ¾™.ëe4å<ÒšãxW%¥ºÂvÊœ1©ÏYV´ ˆæƒ‰ÀœâäÛɲÚÑͲËkŒ€Ý=·KàL@`ŽÔ‹`'«#!Œ!,'ÄÓ^¡„#j;cњ権,`7<Ù^ÜÝwÓÛFø¦/êšn°ê:ÝÚÀ‡äÅhË}Ý¡4¥‚öqòÄg~Ê#÷N >ââb³†NÚXŸÛ ÅÊoeÁcH3 k×E§ R®é2M¬wVlÆî.¶¶¶Î»'ÕóµËaD[ɨaÁ‹·UßÉHcWÀ!¿!0â[Á'‰•n( ¹Ï/u1õlD S ™Bx% çrý¡{Y;ÄÜ}”šjªp ‰jWHÉ"«©51 ×to†ƒÛ¯ˆfy_œNé–‰ÃSLÒ´* “:‘öɯÈ]—Uûí¼Ôú0¶(%Œ -gÊT•V¶<ŽSÀíDcB_ð4Å›4 y«®iŸZ R(± y{~ôÕ‰šCÞsU¦ã¸õ%Ó¬™òa‚æ=ðat‚Ò‘NåX `eó¶§YGJl~‹_¬|hw0Nòm›ü¬0§üý88σm1rk^=7öÊQòÖ]|Žvö±Ø°&…B.ŽXÙÅߨ ³—/~£‹Žj(®šcߥ›™òz8óhë]Ë;¡"eUm ¥¦`éu²ºZ|:z½r,°BÃËórk ±äþn Þò6dê‘z,³Ü'2Óðç>}jN˜T2:õ¾ÌN¹æ²ÛÛÚƒó¥6d‹d®ð“ó4¬N±‘Ͳæ´Î šÎI$öY”6w.©lÄΠ^[Xç±âà¾}ë¤CÔ9?¬;Ç‘ §!¤™[±ytåTíñOj£„+Ã3 Å4¤üôÅ6,v@[¢D&vWN5ÞY+÷ç¬ éïÖ>lSâQ«š¼¼÷zÖj Fø«´6F¶ÿÐÚþïÑÚ5%”¥þiZÝŸ’Îþ@5ûÛL3ºõ;^Ùï°W¿XýÀ^ý|õ;íWØ+º¬²_A¯~ü÷µü¿‹,'¥$ϯ¦ú?H–ûqí×À²¿jÁ¿Ã–û‰÷ßL—ûRöwùrtJ—£û·²åÔ5„ÕEÕÿÇÙrß>ÿ˜æàÐÓ@»;©nÇG§ªÝ+0'þå.¹Ê^ñ'¤Ýã¢]ƒÍcàÐj&b0&¤3æÃ€å¬*ʪ€«iD<@N•„-‹Ï]*ÏåÚU»O½-´zÑ_u5õÕsV)ºÆæö¥2Q0¼¿w©I".Et:|錦­p·ó|$êhý¢ÑØ[0N‘>’‚·ÛPÊáÙšm’K}z‹§ÁÂW=1×y,j%õ¦¨EûÞõј \hí-)j?WNišüdÓSîÓp2ž!r•z£‡3y§*êß šªµZÓTêX£Ñçã‰é6°M ù¦Ùyi2òÓzŒ08€ŽÜ>ìuºwjy³ÐÃUdÿ˜zÑdžÙòÓÏ7&èzöö+Jnª¯ ââ%Ò  ®[ª«Šš›Gt ¨åÐP÷ööª Ú’Þû«ì ÕN× wSÃC«(±qÀOïmš ðKµDöaLÝ|ñtñÖú¬µùø|´J%ÊéžB-xB•˜ædË–LåÉ8†„©Ù2ÝçY!%“A)Ó(!‚ª‰{ vOcÅ¢r•X*ÌË!8ÈT†Fì_7F^‘kì¢4öÑ_3&²oìr°¢x¸:¾,â®4¬gÉæ¨Ÿöü»Û +¬Ç°Å1ñÃÛWSô««M–¨héáfFÞ_ÌYÎàx Ȧ±¥ùBSŽß[ ,…° âUÚöžM._óº÷)ªŸÄ'P¨Zslƒt¨ósùËbF&½ £Åá’´}Œ6`´ùÜ Z*hÈÓ»óDOÁÜk’Ó«½F`“â @Š™’x¶«³~jœê`ìbñ)kÑß<³Âaг˜}%¦ºl ¤vÃd³¸ ì`*‘²,Îõ ˜]¦÷òj¬Ë6;EÌÍJj|— Þ^6¥¾aEpòP³HŠÇÊ“ØÞ™!o# ÆÜ=É y)Ƙ1%ªÈ‡I2´"ol©cŠˆ0vhV¤r¬ÀÏê–öï®1ÊTŽôºƒù(V³ýMaCêÒFn·åhS_b£sÕàÉT»YòC€áãðUX<0×Öt­§ž?ú ¨? lŒ»ËÀhaaÖ´Å 2âD‡â^[Ü‘?f©Gð^.f,K™´ªKb3= • –â nQ•/]œÑ‘Å[©ºâKnõw<¾°ë¢6fÝÉ”1 ¡_• Ò˜ë¶l|pÂ廜]z/gSó^!GL}Á½ña¼Û)˜‘ñ5i¿€y˜(ï]—ìëŒÌú¨á9šÈ4 ÝFk¯þ{z"L>=% É‹O!µóHE}™@$ol͸‡ æ%`;ò¶¶>e{·\Plv ž’"̬=Fh¾9¡°BG‘(êÊ.t᱌Ã+äóêæ¨i€Û"óʘ¡´Ò›?RyÖ<‘XX P«l­œDº31æ:Z¿K´qrøþVÊŒ¡ãffÙ}ñåð“Qvõýg3ïú)ì)ãæÞÒ×aæ)ˆ»6Áª_\¹Vyy\khÑÊ$'j·ü{* h¥u!ßùĬcÜUoL“ÒE(ècnÕÁ\·E^‚±w8ìÏàaL‚' ø­¶’'Š^1Ë¿fò0ìîÎ÷|/ {òþµ)p?Òr¤M?¶¡¦ÅÓ<º‰k[3¿)œ:*–@›ü2‡½Þé´ Þ=À²žÓ|‹4gØöaP¾³¢‘ÕHL,|w{Sú¥Ãã¬7bÌ‚çHqùä ˜‰uð°¢Ý1òµ®…Í´RÁ<åj1@q‡ê"ÿ;M$eAìÉâ+t¤ã¥TÌÛu(xÔ.æÃ¶••4vðS¾V…dM’dd_*þ; L™$@$°Ò%9ÄÜ,aÝ(È™=äMÍÂ'G _ã-’|Àò>9å [6í8!Ḡ†³Ìy•l²›—¨p¼­g¸aØÛK>Œ0b&M͘A}‡ïd–Aœ[û-*çÈ_€qúÓ€†ÎÞ€ÊB,|ˆa4"Hg«Þ 2Ål£ØÄCx¯ þæÓÞý›\·/xZï„í½2rÃÜ[Å{ÌlЙ¶¦O‹¬—ï¶B€;‹iu ˆø¶&ïc­((Ï,U½¼Kû¼nöÖÖ¶,[¦æ³ÁV{[GûÒdÞ8[öÖ˜<]ÍÕ··Î˜^%=õ°}¸‚gŠx ¨9|&Œò%í3±Ðʰ=¯VqRô‹T]ašÚ„[­áµ´…|x/C8•oŒ<µ,kãSêq™" _Žø‚½³sÒ|òD:†ìdÊD»±¨¨¸pk¶2yþBcÚ-‹Ž·s¶O³Ó)Æ0x¸\²žrQHgmÇÄ™\Ã7J1trî3šÍ0H6–9£Ë$WÅ¡:sçÎðîå¾à©zŸÙ‘™N“9þ¼U¬CžóÂÌä *3Åüø®×ù ä¯¤çI‡mÜ‚ úVbGšVùÔù£’‹9e‹þš}3—Ì8£s¤Mœ$u’Jq<ôµFh+Ê.•„Ò|gtrO& :K¬cDú¡»}péÜ]Þ'®èŠÜœÖÆ-炚²(ˆ*gÂ%üÁO1 ä@&Gô˜Ãdw±×§/¦åŠéd¼° Ý KÕ4-€½]GýdO~ŸÅ)sâ4òDòü/¥"æp+Öø&1¦¡±`"lSÕ %臌í0Çæß7ÐN) ö­‰ .-×Ô©ág :Þ»L°§Â°´ÌÔš¹7ûÀhox1×Ì3±g;=zÌYRþ1ânl…_cñ…ýõÖIÓ“k\¯ÕÇ}È˾P«’i™¸Õ€r tZ²FÚ‚ʔï€]qPÇHäzhyÒ55ô•Ĝų/sË‚–Y>Ó>:·×›ÈÚÃh4Å8k¦U%#]€¡~¹–;O¢°Draî=@L!ô1lUÎá Tiv+öÒß?‹+âñžQÞC-ƹ¤ÀoÙš¢¿e²hÃNesJãàÐÑ,›I´Ä²ÃD Ušg*ÙߓӪ0Åæ^½‹m¡‡çisðƒƒÏ¶´x†O.Y¥©é&î¶Q‹.™ù¢§áÝß›ÛN3—œÒÐN=yeëBª_hÌ4uùe|¦J–š§ºTNP#&ÄxË!ïpQ§`µ”n}±¶³½Ö]Á s¬]~\̪( vÉ·$KNè¢H,·üð }:—μÃ9ä½`ôiÊJPÕÈÁ”ÃçêÖçWÞº‡è$¹q†ÁÁ—J[æþ‚I µ×,¸c®—E¥¤zOo †£ÊâÅ#7MäÌ…øßñ© g)fÊ¡BƒÖçÍÔÂ!݈öáù®øp®Oâ.5P†ÝSæxpë¶9r:ž£/8šlŒ~`Öl¥{=p˜Ä‰¼|h«,WМÍAÔý ›ˆ%’û/`qÿüäçÿ=,®ÈßãêÙ}Í­ÌìÞþŽbüo"åþš“û{4È—™žñÏù¸™AP'J|)·©&­–e‚y!A… J0€@z0Q â¯`á _ñy@yÃP ÙtLgÉ8XXZ•¹ž\˜gTt[®ñØ_L7?ð=,·”ÕËLaÞ<ß¼x¼Üx¥:K²áŒÅ>ÅØWYÌÅK™º5F%õêËêël¡\´LRs­vƒòèW?E>t2fºc-ò¤­Ú²¥ÀKÔ“Û ’7Úéð"àU™Æä½¸íÀSª¶²“êÜ=|`_èa·íKõ¿%Ò¥‘@7Ù ø´qah×Åøyƒaû½qy2ƒI=›|L³>H•­ˆñÔt©å‚Ýò‡-°Ö |tül©Ù4 Šå(ñ©H4sõ¼GÞLOi°´-ö.‡©. ô ³‚ï‚îztô«¢fE[DIáBƒàƒz…@ªüg%¨^Ã!-mõ8ꃞáUÅÌò—úß³¥õ¤ôh AT%ÏJ¿Gª@èJI”’z•ô9H$ð”PEëE’ÏÆØ.,U—ÔHª©ß#áíÚóf܆CL}”êØC~/¿ I÷ ¯B(YʽuÑMÙ é[R/ÖÞµƒ+eæ«“æ¶£6ø|Té·©Ž®ó^²+ôË0ga1ë0Ã=u&69“Apl.Ä·µÁMìýBÑ¥»Ám°†ÞX&¹Çò8R™ GïW²ÈÁ7´n·pLÀí—áFØ…?Ò…®4OÆÃœ{k•Å)ÅúúIÈ®rÛJÁFNŒg]»ånÝ1ào<@îH²aùV7J%„Ê”+±bµÔ´;¢—$H—}pW7&ÜÄIáº{*gvÌï ¢‘ éè;a€ù}ê¦ãEûTO‰Šk½nÊ …]ÉøZ±¦×6”ÂNg”g&«©Û[Ñô•F˜¾Ljà¶âe“Ò 4=Ñ~$Ʊð˜*F ë* W¸ï^kèh' J”Iö’9|&ÁÍp{èéêqDR©tÔå$ïÂüY Ùp31A`–díx¿ÅËÉ̦>«ëwugµL¡_|Ý«¯ Œê®P#L.1.Z.T¹ P;Ú€¬OõU¥B00Bu‰Ð³¡žk?Æ 01“ò[Ô¹·ûørlÃ-M+Ìx¸ÏGø^”½U+wæ¤fa¾·Y¦áë->Ý Wñ¦Ù6¢·¥³²Ìñ¼, Ùî‚0§ò›- ©KP`ØÆ›ƒn¡j»ôp1–0–:e¤2»€Ð£¿ƒf#®{ų k{ë?@IïRí õ±¢Í¤íНÎ;h-:óCŽ•ÈîR“U®Þ°€nŽ%Càò†œ=ŒÃ¢ª}¨ê¹p ÖÌûE\RÙ‚k!Ñü_xhü¬¥ÆÍ"†”ùD:™‹÷ëÙl8¥ý‹þÎ#ík·8^ÎlÈíýscù÷Ö4ç°>å·ô]ù­½o<£L¸•Ø$ަꪜsçmV ØCb³Û·Å(dÁ¹űÏ,NPŸëÞ»‡{އÎè”5cc¤RŒ‹/â'ŸPÁ+Š™ÞN2òv5ØIgæ×o E^ÜT  ç&u½Ü+¸ó¥ª™­°¬U3÷U:x;Ô2fÆxe=Sñt—îlsæm#j}©ÐŠ[þáè«Qq5v†[(–Ö]ÃþùpëÍÇèà\ÕöÇÊzd§£‚¢ †tk×eŠÚ‘÷ 9äÒઙ¤Ÿœ¯Ù÷8ç}{÷»èÀ]õàÌfç§woJE÷awÈHü˜Òæ­“ÉÑ])^[ÇqBQ¾&G e¢‹/å:©\ÑÏpýÚ:VOF¨Š‡J í}&V E*ªÚa9_ëͺÝðßá#H½KÀ_{k3o=™ÛM.Šôá}%–ÿ:í‚0Cnï¦éVäISGW11wÇ›$ȵD¹ðIrºÀ±Í+%1âOïsŸ@±PóKñQÎ ·Ða묥0¢¼¢Y‡ßÉ }j TïY|È?™À&³;jÄð‚‰®£ƒÖT×}³µ0Í7ñ¦º‰›øÑÆÕLñ‘Üè“B!u•¥Ï¤)V‰7¦’|Z#œ¸­££­½×|žAšCœOuíÖæºÍ+d”7ø…e{ ŠjJõ‰˜Ú©9rFñϤý&%Hµ÷È—‚7Wˆn~å„¥Ÿ°ƒ à˜·Òplê¯t=^FÌQjLy’C_Ì S¯ïzËÇi Ý½–ú¦Þz›ùJ6¶ÙM¦˜×ÖÞ? T‡—>Ödáiª{ Eœ‘ùï¼Ê óª˜*7¾xM«·Ÿ-mGþL&C!,èý›CI<Ü7:§}CbO<“*ñ_t#Ð{Á‘m?[Š`Í,"|æëO´…•QŽ ½°þ¢,¢h ŽÉ»Œáç†[åIǹÛ“A{9; í-xu\\Ò0DX¡îò,¸ëgÂDFM3Q¸åb+M“Ih¨º ³;ã¹ek]OÕ˜~$'¸¼ÎŽgÜj’沈@I×ß»¢•cÁ²˜ƒñ*XÒkFµÂÏ¥pÝèmB‹­%K’Ö úË‚dßZ¼SšwIÛˆÖ®$)žŒj ý€i ¾ªýë°µcí“ÁZ奡†n˜¯Îäsè$ÓÉ$Ãî×¹ãVÿB´òi[Åö‰à‚J‰Q(E»W%á!éòxc‹0^$¾IÜMñ"ïLy„ÈÐÆD/ô¨¬j.Î^ùNÝrp1åNF5øä¯ªê_ð»o¢ÞCs(–óóù«U¼„ºì¢3Qû˜¢ãc…î(¯hrûÞw&ÝY¥›|S¶¬?eß>™ÁÃ̬ŠOSM†)v*maaÇ6£ÉÓ|tLL]+ž@7[ ¤È#[rq…à“©þpQpÀMF?¯·v[·¥(íëtìÔ.oΪ –›tz~E7¾_ ÊfYCð4Ô.æ‹£º‡Þ–£¹§„òV¼²·¾GUºoÞˆeÓ¨Î̃C…©U 9¥l¥ìgKpÍdú¥‘8èyšöåì7î `D¼©{ø#›tü— ›²÷øµ¡ %H&¯Nj›ã fsË©² òLÕάT²1„|Þ“l…k µ{ÕÓPs¾"{¬VbÃ-wa8Ç×=ÄNÕ$‡ /§GSñ‰à›Ð¯®ÿ2W ÐIö2Ì»Òt»óœ£ž&ðò€Ýïø¿_<œ'ªúv4‘%2g~zŽâR÷žT„¾ž¨L­HŠÝ]ÍåñîbÙä=r›Ë>5ËrÛÜQ6±ˆ22›p§íù»у×1¨kÑ@³Á]¶ƒ¯ÊòP°wªB^ÆÙR*ß•;p¼t²¡W÷5Ò•éw±UG8-ºKu¾é¾ZœC/1­ÃîL÷¦¤¶Ò l®^ò„Jí“£j ðÝ¥)¿<SÞRAƒzB³=Ûd4¹—•žëC±OéŽÍ$¸¿NäHìÑ]usÎA¾'OuÁÐÌhÞûòHÂöáæüYó1‡.½>:çrrýœóeG¹ÎúÔ”ÄúxÚº¿?‚×OË“¤íVÿ±$Á}dBâí¹3r§ÄTo"«gà$T±IÚøÃ –ò[†»[çÃiÇÐæi-£ó$óË3â v`MãhóÊûW~‡ç×P^vF†/”—ñïAy~‡å•ø~âö3–WõWX^ k«¿ç5u±15²ú×½–f?Zû»œ^'ZçßÈý{0½l l¿Ãô"«.¤c00jHRbH÷8¾3[*+Ëžö(Y(¶j;‰âމI‚D Ѓ=LYõ iP}«]\7ß»¯Ú^WÃÝ*HûÂÐù\°óÒ~òرÆg¼=Æ9㲬÷FF‘Ì~‰“ƒ‡Ë¡ÈDßÝÔwã4Û/™ÓßÕR®+ãm?kU‡=Iâñ}ÂÁÐ$L¡3ì±+®†&ÐF=1‰Q¨HÞ¨¦ýì盥ÞЄǧÁbTJÕqèáçŒ×u"¢$#š|/шx ‰(øéQu¼8åJ-ÅÕq>m„q'e©ëáÍõ_ãÂó" bnamáb£Ÿ4[=eO;ÕJÆÓ@ë4î?}¹˜n2˜Õœ<´<$¨ƒsç|?ÚÏUšˆ^‡pч¦XåDÈ=‚®v§§Iïe]‡ÝQg0\‰;+cZ½îÖyÔ©b€ÿo–Ç‚·Í®{[_± Ì -²5„Ý B/…}5%¸Š¬¯wû ¶i,=)Nó8´:ëˆyu—YÓ‡E³ØÚløŽ£˜ë˜*ELÅ·­¼e†ó¬8n[S—ÄŸStÓî‹Ï¿X§¹éh>&?Õ¾¸¶n_e_6 5„5¶í$ï¸v_ԛ̛<Ó!W-ÍJÎÊVW;Ž %奎¦¦\m v€=¹²Z†½Ã§ä£e^äØ#Eí'Íu›*¢“õT!¤«Î­ÒU‘Â÷VTŸð½¡¢g ¦GÏ…°õ`2D£"$!šè ©DšSSâ©”?„£Y»–7Þ¢Â0ê|ºêR˜éRÑ?5”„äK/HŒì‚¼Â+¢#È@éÜ@#ÌäSÉf—î²Xw9=ÏyçÛÚì áOCÀ©±M½ $Ð*þ,·U ¥CTCÀNŽälœ4­?ÁÎ|dHÝ@޹©Z;C9lÜ8²xÄöÈØv kŽ*ºiçs¯§ €S1‡Æ‚¦i'ùín„e˜µÅœ"’†Qq¡¶WQI]Í͘ ¥è„1‡O7À%î(†\]¨ØŒ úg¬®ëQÀ@Æ|ÉÐQ¸á'Œ(Àõu4žCG_ MK²Ò‰ë·ìåí|ùÏ+ÅìoütwõaÅýëKÃúNôæn¤ fM¯‡zƒ·y4!´3‡#Ûy6©¼"ŒÏ‰ƒ'%C'±!àç[,Àx߉9c»‹<¬îã.oÂEÈVѯ–Ño7ÌܺYÄ&úÛQØòSDíˆo^² ­f Ó «”—ÓTÆ£ÖîÂt€Œh| ‘1D,˜2ZϘL±a9ßÎ,{¿ý”šŠêÂÄ“PÚC‘ÖSêÂ'€Dã‹©ÚVVÁóvõFèC‘n3æ%c?ýPBðguÌA²Qv¾\tT¥[t\Àãî±n·þ¶Ó-éWò›Ùt=ñnÏh›m‡¯#7f€ÊÁO?úÛ»fD<àñ‘@Þpù¥z½#Ûpf­ žŽ1]ÚàƒéívvÞrŸÛz&“òbX¨­è­Î*FZ)Kfšoˆ± 1«ˆ¾iêTM eÃokÛh¾iñUlõ»ƒ‡È;¶‰íÑì@EêÕxMfX"ïùžQ?é13Æž2A~ô0íÚÇ­€5«ˆK•—‰øÍEÝëô#étNrºNtžØ96oâÇ}qÙˆ:OHËáV¦ÎpÛdwôf ‚&#–ˆŠ»ðÉCl_²UŠì«CÞ§O98VÞ¤tí*¶ºñ@›jÌ&;ˆ>"Á‰«Ÿ'Æ’Dù½R-Ät9B&Ã1ê‚Üí(çá~F流@¼ƒ™QêÊc›õ¬Ä‹?yàfí´ DFù.,lŸ'ÆUf ¦´l—;w[|“}oŽþxŒTÒôl~ØÁ* dAZóÃÕ—íÄH—1”\‡U[xªcÃG¦¾ÜôîÈÙ`çÕ~ò]Kؤ÷íe3¦üè€Z"aÅ’yydž°(ykŸô÷°˜ƒã;Q´ éf!—Lµ¦XÞÝQ|„´®&9T¿ÕVªõyïš"ÔN‚þ…Ÿ­›´†¥´–žßmÄ ºM“”JQ—Pcò“[ŸŽZiLŠËau1JTm<ÔC0Œ¦½©À}À3ü{‰xäì‰ÂÖ&Imjš@Múztø{µ {¯rÈ펽¸(P>îÅ@Îù̦Ѹ<º¶jKv5¾ÈrBŒÚΑ .Á“–ö´6HÙ%¼‡´á9‹Ë×Òúц¨ªC]+?ÕÚ µd=žl½l¸ÓɪƠ•T2¤ Hu`j&lZ佸º×pFÄ*Cœ³ª=-²ò x+›c¢ãÈÌ £a¥úc_§ü;Ö+QÖÐõ©ô‘w^·àبFðÊÂMÒD÷QAÜQ5¨eêï^ŸÌ^Ìt^öJ`ë;èØ>|Áœ‹•KתÏ(í´Ó#¢ÄU56–dðÆ€óçÏægº‰˜Ðÿˆàß²PérKðò!¶k åÖ»¢Þ¡>š.qB›>A‹)j¬RGHÚZo1§HSஉµèŠb9‹ùl(I (÷ÕàLñ•ù9Gd…T£}Sµã.ˆ¬¾Œ,Úv.°ÕûÂ5,|Ç'–šBŧʥ¾[¸Hú²ê7Õ¨+ZdÔ“‹¯ô0pDÚ.ñ¶xlå«ãn ¢&–™“ð0̢ߎâ‘IÛ¡!ÝeêiŒ>F¦¥kõNz¼Ž ÕÓàMŠÝ…ÑôßENæGzR *¹#¶]•%$DRÖ¯¢"ç–Á‚ب*ku¿… F@ö«É7Wâ³`ÛrªÏ)iÉò™™é×Ę2±8Ú®6Z¿—¥`¥ß¦ëcTYÔ&¥Q\±S*oÖÕ8W“q" ½½·Þ™'Š+tš"­“Ƕ€¡HC?v–l†ûè­E=þV€8õ®RM=^,¤1ó“…Åçh›¤„_Dî:8m8ö·wc]ýyžUv•›¸ü4à¡|ª¦>št¹¥öiú÷‘´úÍ®ËìóîÝL<1.éQ/©ß&H\iô˜‰|TSW*X\x¿5è-%!+ uŒï3Çi–ѵ×OFóü1ʞ~×WX¨¤+ˆ@! F5e +‘ Ö–¿vŽÍ4w ×…˜aAÏ ž¾„Î j“Ê×È…¤2±!sHkÊ8s|žšÐ|JøÜœw7๓<˜2ÅHNIáßA»ïÊ ÕG¢MxffC öùªlꎇOxèšn¬î%N[-MwäZ6í^_ÞµWZP"Ág£'÷]IïWÊ9…,­Ü=®Q’õ ιêŒoß–X|“öéPEâmaZt̳e“XŸÁ7| i+Øõ™±w’ àX/òy•ò‰[YPÕ¹<4.‰Ûª,³8·ìÏûøÏû81FbŠ=â˜ÞaGØG[Ï2lµîIéËõto.¨œ§|û}FÎ<™ïßáuïM䟣QÏøª‘ÔŠCöðQHË+’çÍÅŒ,"E’(Y˜«Ä~6¶&§¶øô) Y:Së“û&»k ŸÍ&>‰jϦ°M›¿Xj,´äpñmäê[ÙI.?… (š•ÍÞBRì×-¬Ïò‰wÔÈ4¸/AeŸüCbl#Å ©^É2¼&p ±¸CÞZ4Iˆb+è¨_;HI§^ô"âý°³1Å<ËcXñÁDùLc½ØÉÇ’HìØá¶¸<£&›fß$E°f-ÓÏÞòešw>Hц’”÷\EŒA'ºù,¼I«5?-wriéÓ§À€Á©(: í,—„]SÖ&ù!»÷.XFm¾/xæB TJñ[qìÊfô×{¦Î]=B:þ¥bïr×b‰Ì˜Am›½\@õæ=ùSɈ_KJ…ªÂ•íÌõYø!D©«“Ó’{ÔƒÑtÜ¡ßÚ‡¨)Ìë³|Ùo„ XÊR k—Ú§nðÅmxÍð9j˜»Í»ÇÝÊkN‡"”î ús(èoM]£2Ìeú’ZF†°üÔèRRćI†®9íåű·…Uó)4Ñc^m÷ öt÷E7OÛ䢃ÈD¹öT(Qþ^q&ñ{¦sΑríäˆ œ=òæÄ,XBÊûºâæ¯a‘ýJpÐëÕ‘Ÿk® ±Ÿm-ÁÄ“\øœ$$NФ¬˜ûÇLÍ„c#*‰±ˆ€ Ë]¼eµ žØäˆW‚T…çä@"ô]0ð˺4cF"¨©.Ñ’]¬™ áœæÁ4ïÜ y´ØzBi«}^Å ƒ$ žƒð•_=µ©œxx>O!â·÷Éê @ÍcNQ4Äã6éÑž‚¼ ‡D¯æD¥Þ/!jñÝYŽbͯé©Ç/;}^st¾Œ®Ì=êHjáÄç[ïwK ˜„_Cª»“û€j:E_ž®Tà¸Ï»€YVcmõž ù¹ÿVƒå\ÀάZcþãc ©WÏFóÆÊ§µ>ü±¼.²²-´gÜ<ÚŸÛ:Ì` ëûÓáMu &(W3 Mò­eBˆ©©)(ÈÀq@ùã¢G=éÛ'îÐÂæt/áb´= JhÎÀ\K@æ1£rÎÛü +&=]ç§Ôµ)d 7ãH(wA”ÔÕ?ãiyut³’“%eàÄb©Ë6õ{ú[­ïÚÎ9ö/*™¿Z¼b`líJ™HJ´ð=ÕÀ Û£¨d<¬Ï:å÷Kï•Ãqœ!ºJê»$”‰!/òž>1Ò¬£½)„oÇì–•ˆ:¿hÀÜ“À,›Ú3V·ÞfYÙÄ@à¿ç‚x>{î¾_~¥cb' ½ ¢yi5ùÚñÕN%M-F,ðBp]@öµ{‰8_}^ãÚû¥O`cÞ"Êá þB!Áì‡*½¯·Ìøx¸_sÕì±é—[V×Ùg¬£w˜J^×ùl»ò»³cÁõ‹Uôæi »úÔ­1çhºÝ×ß½:ƪœ¤ z×Y@TÌK_ Üní "7½òh;ۊ̀ȰÈKÄÔíÄÔ6Ö¶j1×-2¬Ñûzm×bFö­1#èKŸü¡’‹kÍb qvs¹j15Øâü ᔦífó¹øLEÖç[(G }‡¦Ö¢¦¦*ú2«b»õk{l×lKš nŸu]ãfš¬Óm“Õr»Ïç† >)80¾„Ÿ®„Ô…„äÃ4É Ðzˆ„zt+ÛV 9p[ìÜwÕ´«r €s£ðð—šlW@wÇ%»SäPJ°œ®*Í%‡¨¬Œå¢M”'(ƒ9Ül› îŽrtÛÏÛ|Øœn­µaŽÀÑ [qUe¯…ëÎ’ †c†á?É»ÛRdé\2dFÃxªÔ5ó+Hð2+Û§g»ÅebÑhhA²~$)_•¨‰VáQ%²ß¼ v׺àpü,ƒD›T=Òwkk– JŒÆ¥ˆ]œÌŒ«µËßá²ëÍŸ§ºwÑ(lÛŠT8Š“›@ì ‰Æ¥†oË/€/cœ ˜†5TQb¶‹ˆ¬e‡åЬ&¹;†cN]@²‰‡d»;’S/ô6ÛdT_œÀ‹ÐoâvsÇ:¡uQ©W4I¹:sÄ×m׈d´ÒÀpøóT×§&5ÑÈ<uY5 =w> rr·þY—FY饟M†¬HVàF?}h¾š oÙDé‰6 ½0INUy~E6lÔÓy¦” ÈÚ­í­¨ &è5О-s×74É÷à€.U fÔøÂHû~½¯ˆ=²ýŦ{Ѩ2C¡»!ØŽn·ÂÁŸ>Àãné†Y±Áøò}4Õ9çÉš¸3nÖ”/¦µm‰,¢E;—•uÔjæó`×<Âò\~¶£(:Ùf¯¢L,N ˜D$+Ä8Óã3þ”ý 7k„¨±œ¦lj3«Þ0!¹{ÙlƒÝvË%³¶|ëRNÓˆóttäõõ8âfr.®É¡ªÕš‡òÀÒéjªÛ™ÊÃ@6S\ô Fv¾~’)’ ÉîF%:Nbb–,š¼ªÆ¶º"öFžôȨÏíî"º…5^~XöY±Ž£ŽKOஞÌÞ®Ù$qaÁDIŠÇµ,ۧêH[Î]c%ì?´8ÛÔø(³ÿjyï¤÷ëEãqð–“¥¯ˆTÊ9ĪðŒQ´¾"BbBÉÛØ±åæè1½ãþ2k6Ævìþmð‘ø‚õбŸnÇIž.³V­®¥y;£Àêó:Ž_±Ÿì,²¾DÈK-Œ{סçì ë÷ké…qPãžÐ›þ.bÕ‡:1ÿTZ.¬ìÔ·N)¬~ «Ôƒó¹Àâxï¢àZS³Èu(aÌ /°w±‘·F#Úü4dõŒùx’H}‹â¹¸øhkÌhcNáì_ß3“ ÎJεóê#<Ø!}Y`²'¼…Á·Äo™VzY¶ýE•²Ô»”¦¢ðèÂL+RK¥‚O«Í×&Àü–ÆÖmÀë:…TF'Kù *J\²H·êëá«tG,ˆ]»ðIPæS}7¾Qæþd&dŒz\ªÄ³‹ö˜ŽµÆ1:œö9’ó'ÝâþÛ¦ôÉKéPlê[º·2ÑSЄªŽo&Íß1£,VC.@Ž›$Xfº«ƒw—ù²hÐQ ›¨DèîGMÄF¤ˆ3i#OÇÚq´Â}põþ\sܹ°Ü¶×Oè\5™­ÖyMZðaI]xwU¹“ +šP¡Þ+Ê9ù*>6y£0ŽZ–¶¹cÏ%ËÆ?r./¼‰dGC£}VÜs·ÖIR?¿ŠÅW´@2ÇÏLh=¬°ír!ƒ·ø„½ÿ°µ3ʆ Š=‡£„¨G­·¬³)âÂ®í¼¡r„W {0T‰Ø§ró]ÓIšE#Ø€ì½àµHH¶BÌÝÙYp¶v­(JÃ)ÇUô(hº{ÃY§ÅŒ‰ÊÇÅ@ßwövëoi-„ gtñ:® Øæ=ÒÂQØ”:ðÕ/YØðºyŽ-œ0ŸÝû¹o‹nvªµñ;xB޼ؗ—¡/â[·×ÐOéTõ'Ÿ>ئ8U±¼ÖÛIuÂ?`K}^ý ëRßѽ˹¯Èð€{­½2/¶*| 5_=h½9^œ.Yà\€_©.ç­g»i8^«éÑÉyCxåØIv’“z–Ÿ˜ðin¢èÒ÷jzo…§H|"üý1åªtëGs@[Á1§iþCk—qv ¿Ä‹‰C$ß ‹¨¤„×ÃâR¡¢@¶Š«·C½çÃÊWPšiˆQ+©–«œ¡ÃdøÈ0ݜܞycoÈ&°qt?8¡Í€øt¾I~¦xby-/ñ‚òÿ6A™]Ϙ‘õ[CzVfV#V=}¶ÿ‚ò¡Wÿ‚2Ë?OPfù ü_±×¿HPþGšúwñÊÿÇ Ê,— ÌòßAPf`gù=í—Ž‘ùäaº?Y™ÿ‚2+ÃÊ1~½ú‡kìÌ¿ï =#ÛÅŒÌß¶Àß^c£ÿ#ݘ‘žù嘾éý¡/,lƒŽýטØéþ@dfûzñ}fú#õ™é»Åo˱3Ñ3ü+e:za!66&~VvFA&zvz&~~AFFž¿_âwe†¯oÍþ‚òÿÏùoöºvÖßV5]k+c3[£_`>ÿŒðßÖÿebþ:Õ¥ÿûÿÆÊÄÀúýßÿ;ú¿­* V "3ª0 µsÐ|ò|*[*ÁúyHÚ•Ð>„ªho“¤Ä†^:Û?yÆH*|\ØÎóDZ31Ob¬¯àƒ.~N^¹Õ;µÚëÔfÏ´a½åxsœq H#Àtú%І³ð„î”ÍÙ‡À`­»‹¶ äÊ«\5tü1‰ªœÆ„W—¶à`Й§#À F$v¡nýa÷µÔé²®ü“6ÂüHg ¦ä"ÜwDEC{bA !EúÚyT¯r² ±{ØGÁÕ|ÒÅ:àÞ!HŸÎõ†JD6J6"·z8"]_XËûÒ(Ù|L¹.áƒ'zk=ð>d6NϯY ­KÉC³NK‰Š³I ·ôë¡%S†J˜¥•ÅJ°Eå€.ô'›4ž {/¼›=iÕk…Ik¾lÙ%6aœdS}p WÒ{‡EW6¤öœ;|ecS*ÕÌ^è#9ˆLpËI,ÃA|àë–_Õç¾±¶‚ÛX,»P{,ÛMtºœ¢Ï¨µú2}/fð®”þSðš­8Lއ…¢ú๮f¿ìç/†ì(chªýòÇÉà,lÁ²À”‹yÄ)Û°‰,ÄB¤D2B í¯FÔ³-?™}‘éÒ6Ñ$E‘ÐcmRl"a‡\œq‰ÖîÞîqïÝô&‘ôB C2ųD·‚äÎ{à¶ ºnm[ÔbgÔ˜ÒHi:Ølãí$ ¤tAž©¸‹£Å†–ÇE~K“ÅR§#Ì*›ŒÊ@†˜Õ3)7P3Èn±?ë:¡ä\3 M4Á:í–/·ÅÑäï>@yI*JÐñ@EWi.§¦#ÀxdSEšÈàÌ¡¿NgW)¹ûF*擈[á'ð`xsß®iÆJ±w¯&`F…Þ÷¿r²Q{Ã,$œŒ?QÐrAëªKÐ-h¹®ÑHÆ ‰gäßS,ÍßÊ¡%Kòù Ô'j[™jÎ÷ã-†ç8ç]jjÜ÷ XîJ&l}…R' †ÞJ†ò›½§nac‚3´(†Zöñ¦ JÍ}¦ÃÂ)-…ö‡Ê%4ÓOrUgòY0Mzªr<8üϾºwधÒé“d‰rÅó ›Gd)k¡Æ©ã¤Ô&O;9œ²£Ê\Dâ4h18§Ú™fô~À}°Öø€ø©é˜0/?+än-‡æš”Ñ~ôê;ªGw†B\B ÷>"­4‹•¶³†Ó©iÜx…X¢Bòëç\fÃ÷¯øoq¨eD-Ý—VHúHªÜkå\»Ž¶‡Ù$Cò[w¹6YÒë]n§4µ{àFM‡dZ•רG(}ܼZWšž”ëï`m†´<Ôo{XÊ|Šh?ÛœR>?Z RPÿUÁʯ{û+ÿ(XIÿÿ¸`¥”˜ŒŠô?-XÉÎüç‚•[<ò/zt¿½ò?(É/¤&¢&üïd¢û/ÊFþZ‹ðŽüY{ðçÏtÿ”päϺƒÿºt$Ý?.ùêþohjÿm±JyA~ÿ1±Ê?s‘?«üSÍ×ß UÒýF¦’î'1ÌŸå+¿‰Tþä©ü­sü;E*ÿºDåÿª@åQá¿ælø‚áI ò¯-Ô¿¨dfbÿ÷ T²1üsú”¦ßÿxâ‡DÉÊÿnùIFFö_ËO*CÊ)šàyѹ¨,”*|èÝ–wSƒ7¦þdPö™BÍTé$†ádðɶ}SèUæ@„³ 4Eö5TÆÕ„Šé)¸:j¢U»Âv»ªs¦ˆ1“ÝíÛÞwt¼Ù“‹Ëb»jÄ´Ý›¼o,ÐÞjÇfª)'§Ø©!>9Î-I&Ðêž­ÄÍÆô›yz!·êhħ(b<¡]ÈÑÄ¡£¢‹A£7‚ª}ÜMMòŸ öŠXFkULΉ5‰á¥Ý{áí £úXYØP#•52¢`$™û±ûîÜ#þ=±g% ªd·£Þ™P¼OY?O'ËìªÑY Î:´ FnÄDøðá1W–Ó1§·ïÓ_oÆÚ kQG_lXo€µ@¹êd“v ÎHw¢G’‘j§لŸ4²I'0/´ú¨4£,ÇËï•·üÆa*Ô5T“X³Ž(û-´Ý—8–3œª¾ß\kT4 И½”­]Ò7Uü˜,¬ÎËá)0ÔÀ@GW°fÚ]¯ ¿l2ŸMªƒl}F<â­ l=h[ûkã¡WÀöZÞ_®©a<†"wQ:ù ^1¢VWÚñ3µ™ëÏT§è:ê´’´¹ä¼@&öà5œ—ÏÊÑ`˜ŽÏUÑÜŒz¤@¨'ç^tÜìÜD¬œ$c6K¦6sL°Cœžn2Ñdë¦é­d€PÓD.^¿õ‹b¸l‚”4æýDóp¹É^î㺬“0žØv`êü)ߺ&€M Ê`­ÿ´uÏï5dÊͶW”ýógå½s€zˆrø-!Ê8]U(0œQbP ² ÎÊ+9…wôŽÐˆ)ðfYA½¢IχϓÐ(Šñ·{[žh(­¶˜$L×°²WZf'æ _2‡tŒ.‹*¯r~¿@"|ÌœAƒBˆâ¯/ò°)5îÞ´æ‹)pæÓ #‘‡ŠÇXs“fêÉB,R²›¹€HØùÐ<šá>R£¢•\BC¾H:öÌuI<éä°©Ä{•‚£aÚ‰ªó˜«{K¬a3º–ç”HÖª,ž„‹V0ª‡šÝ[­ŒÃ)KOÜe€1mý¾ÄÊ$ÌR«Z¸'´MF·"¬ÞÅ¿9œá€„ΨP™n6>¡Î]ŸÔêµá'à­0¬­ùê/üT¢€üÀñ°€/‰a¹ž®ÓãÙ+»™ û\<3òðÉ_FÍpKD£Q Ã…K¸c¼ [b‰†QÁªáÔ|¾Þ×ôPw š×feî·úÛ°s°÷X6dnàaô6Khna• l0‚]®œ±'<×ÃÑÐÔE0o—ô)©¨·K“šõž#¯ÎÅ:â“5Ã]йx» Y³dð9Õ Z!¦`%zÁëæÝIuÉLÐX¹ô€çzƒºµÝ¼¥HW¶“š7"mÉLm:Ì­lή¸ý®C J™}úýÓÔVyÑ Nž®Y°…Ô b:«aÄÃEs†+¦K6Ð>šÉ{ºÛU¨“ídó(õzwÌ'CvΗEâs‘<(ÉàS°s¢—¯$„)‘ÆŒ—[˜í÷ 8ßëÁç†Ð‡Oûœ=»¡÷îz8ëNìV°¿ÙÓar2êNYGj¬#£œ¾9%Lu:€›\vÉoܸ0“‡>XT,lÌw‰¢’š¡£;Ž½Ò±²™™N%™§Ô“Ðÿ¼\ØžIKÍ’ÍLf|å<ä×üÙ£¾ õÒ•ÝpÕgCCXÇŸªÝ;j[ìKI,›˜ZfF@&É€@¨Õ$yý\Ân=ã"﨧RÀöf¡_cÓô†­[qй*ñé:¿rÎG-EùøE.6»ÒD&²6øö¨Ñ«¶ Þ£÷ïLN¤ÆÙ0_Y“úч’Ì®[Ã¥ÇטRÞ ö€Îm=lIža¿¬öZ·À{ÊvL…ƒu[Cî–pÏߺlg€¿™v£fÄZÈ̆ÅS!w‹q,m/e}P«OIz|kWÛ,–‰ ˆk€èß¡7£7’8ù¶V éº;ÎaÉ#Cû~ûz§5‡•íªCópWŒb*OóÜpg&ŽÉ|žö2Õý>‰-¬+OÊ‹(#—•`Ó¢^ƒã625æñ‹JwxB§Öª ü²7s ÿ}@ûê@ú%*¤†ÂÛ‰hÀ4ê—1•¡fX.K™‡ œJñúK<)CfÕÊ«µbL%&ÅØ~šàWóH)Ä„<­Ÿu—¿€ÏÏ‹àùW>•›±ØwúRŸ`KK”°X§+ª~zÿa|«k‰ëîiàXú“8up;.úyнcAânø‚0æ Ê ¥@‚+dz##X÷;ümŒ”¼O.´EÉ»WWt”ÜW]—-h‘1-qÌ;³^Á…›ÿ‚ôÞŸgÏCzåXyïç¿þså=•¿­½glöù½ßü5ðw¾ÿ—5øXX˜­Á§ö“_”œñÍ7 >œyŽ·ß5øz1ß(wq¾â‡xõþÕÜ+À."(ñèWÞ„ãµZán–uŽ.êêo®ë^²Rê§:Ûnî§5­ýkcìÆxÜN^^ÚOÚa#m“ùΜ[ÄÁõ‘ˆ>õ¦Ä¬¿ÆI°~Çè¼8¹˜âþÞÏ3±i³ñ<ºDqe„—Ê6ô3hLÞ-×r_÷Yʇ˜­"zùI³êeöÝV¯µ.á»%£á•T’— Òê:±\zùàêeB^¢3ñAȘžnzH½½OêmâYÁÕ×Deéµo§­Ä…¤\»^<øä§š±‘Y‰A-d–?2+'o§µq¿f²HàrwêÁ\Ë(4]I|_‡ëÿ·Yâ¼@ßE£ÖAâz '<š­`G†oËœ0/:š³œ}­^è7å¾Pë}žÃ"ŸRÔ;¥g]û~^‚:'?^~¡p+–µ6Mƒÿ(s9g¹ÀQž²hi |*%6Ñ6‹DáC!ˆ9Öˆt‹×P°½Þ#eˆkç@IÆ*Ç«·]ðv2ŸS‡RÙ­¬Þy’¨Q7Ž(îÒ÷¥T5S9ðÓx¥4¼Óß š]ªíFÂ)]žñˆ^Ÿc•°ôÌlôDî¢X.›Ærõ`Öø™'éúKîicsã0ß VðHåÓMtkÓØPÑÑ«D_äFóH"@Œƒ­¯9‡Ò¹ÿk׌W­PÌ9X¡. åýÀ1 i%9rCJ…ú!Ðòå,¢Ýbk<ÜùÞ‡ÐrOÞÊcV‹ †Û‹Vgm¾ItÀÆç,”ØÊÙ…_®è¼w žÑ§aÅÏ‚Q¸»Ü>›6Ï~òghȘØ.˜2äÈ‹‹`!ÛŸ Û75$«(-­dÒ(ÁFü¬œá.¦\âðŽj¬Ê툥 ¥ÖŽ7Õ*P¸iÜ;2º‚¹Ð ´Í9ÐKny‰&Â*´lIe d§üyy¼ÕS˱iMR¡óh}cŽØsD°ìl|ìIm”qQ_â=­Ó[½Û5x¿È$°žÔ¡=CËQ³èÓ~·£,Éí^b½ý*lÕÔÏ}­+}oý+A¶Ï;;ü«ç»g¡Ç]ïX*ùò}XùknE©Pf‡aÁÏœ³FVœt·ÙÏ?l¼VíÝpXã'-]t¤yógN%‹Ÿ˜P]¦” æâÔž ‘ºu:›BikNÍä^‰P;n ¤=úSZïèy€ÚiŸ®ËjcqÃÉkQ]=øá ŠÚHŒÓ|=Z­rK9åmñéikÏ9~Nˆ,ç¢ÂtWKÈŽlŒò˜ºQï3¹µƒ_ï ÞLÂü×z%»~ý ì(®h1#ÒuŽÂïXCA‹\$ñªU¿ýJì‹|ÏÞG4o?„‘ÎêW ©Ç© ûà1¹Ð!²lÏÂË3 H”oððÁ*Y›+ˆ®i€ ï¥2¥õDaNÛïÁGüXY[;¸2íWœÏ–fŠ>ûÓHh`§W@Ù¿7ÊŸ±[¢¢¨ SžaRÃÂe[Ùô{ñ^й¹ë#fv0‰4© u›|W¯B™>£¶î€êlG”ã§K‡´bS —Âþèà3¢Fî«ÈoŠ)gç4—Pœþ°³^çœüô–5GÙ4øÐ¯au¶#g¹´³r¦¯uñ°l•5¼©º]0FWæxHdh©À ‡]¡›‘œƒü«VÁÍWÔ…¾Š|½’(®ò®ê¬Vâgq J.3àqšQ 멦¿…M€4˜µJ…×û¢Áx®‡£®ŽïaÅÜ4Öa嚛מÓU8VŽÄœ;Ud´WW›ŠtqïŠÊÛ×üyw¹ËÜŸÆ=ÕxÍ¥1ËÐ@N°ù]:{ÚâG8…º NwhxõÄ4ôm 9@…8Êð )V1ÄjýþeeÎ{ß6xÔi qá3)!óÓºŸÌlÖO$…T”%|F…_c¯©xÎR áÝr݇ ñ_ž³ºiCì}CÍÒ‚””¸$´hâj 쮆΋ŇÓi7ˆŸ…Ç2´¡Þ*€òà œpu䆭‚_–?ŸrÖ»-àÝå*'ÅXƒK©Lß­B 5IêrÙŽuƳ|7O:vKÔ*WZñUçpe³þ´Rº¥ýÕÌââ<-‡Jö‹…g¾FPÏV*ܘa„ì°! 4ø´;åûûÇ‹j*ßП½ñã‹ráã¥Qª7Z(È©Gòߨ¯Ö)¾r»Õ(yæHÁÁeƒ}š/­ñ:}–\wµðùÇÅäMŽTcÛ‘§*L=er(²xcéS£o í ÚŸw|‰NóôafËe%¥©yÃïÈhOÞ¹îô#µ!2…åGWÛaÿå¡ó|ÿ„ϯÔœgÎà\5R?lwÆÁ=¹åOZåqbÊ*fly–$r¿#r–óçyÌ¡×_µ0¼Ôõw’÷]ž8zë–Qò5£ƒ³ˮ֡qຶ{»i5û%l,Ï™Õ6¼ðûƒåËÊ©®hNÊY«gÝpƒÔZ›–ËstTøå1¾O¶­pB±(©ùTËÚ|7ÏcâQÓºÜ;f.AøÌlò‡• ®M“]üúyòZ¿7s"¿Ðõ͉—~76yLl»ßÁMJÁ«W³ø×S.z¨‹>ÖrÀø¯·­”Y¢“v^š}y9áÏàì’ñª÷Îé¼X²ù or–á£{È{W¥^ }ñeÜ;X¢òg“lû? 7ÊL"î¦tp»y*çîëê³;®'GF•›¿*ïñÊù¬þÅó|!-Z1Òï$¬¿ÔBdg´ïY°hü ÚÉ{µÚ³—Ž<éÆœ^qöÊÁc¤±ÓGÛoö—çäÄM¹óÀ×TÏa‰ çþɵá*s“üý¹Ô-‡”3[3°ìRý0ÃåçUÐɸ3ÓgçïPŒÙyìëy竚û¥G< ˜Å5>qXÎzôÓ]6£^.ÖÝJ#¯[0jL»^¸Úw¡gpÜç~Ñ~ï³…ȤÑ;±lYÁ·sz¹kŽåLž~»ux†Ë‘5zûâ }ÍóçßÖk¨+}µ±)øú““Û2¸M\ÿb3iˆLäÉíñ¦IK-ëÕÒ7Ö—1&»9bVôð¡uæÃ†º‘N«bEÐÿc÷=ƒCëJó6ÖdokÿbrÆGžsCý@þñq'>]*5½zÇMãôœ<òŒaFƒ…*9ÍŸLÖo.È¿Â=ðö¦üC tÛ3wUîÞ0Ndê^ùFöäš)Ãò§Ú±å*¥ã>ÿ¸uîkôË󛦖4áÈçä]È»¶´âŒÌøY¢´°ðowÞ~"U' 7Õ)Š^Óä•UïHwªtñáÌ8x?>^ÎÓuÃ{ÃÐñRÒ'Ì9ñYÙR¯ÄÕžNØ\ùjwþ%Ó.å¦ûo^ñ2Ëó4.-–)¬Ñ´î ÿÔµTûg…5\m†‘’-·Ø)û,Jºeždµà¼Gü¹Ä›‘÷¦ÖZWʳòìëg&×ÇѯrEžv'’}ëʻ̞ðùîØ¯_}“Ö½ryuÄ~~Œªÿ~c#gç$%áh½³Usî·½H¿7ºò ãÑêÌÓµÃ.Ÿg Ý«¢³¿’«Ç 3lì·èøÃø›í“*36MÞºcióã¶,ƒÇw ÂÞX?§ÝõOݺ±úÙÍŒ…¼Ú·|GÎǘ-Ÿ¿Äì”ÿº§zuö‘?8¿þÇÚAÕâSןÓò®ÚÞœxüp©‘Þž{WËï•Î5EkŸ¿bÆ ëõúÎ#dVÊlš1¢ AÁcñѬ±#âÈš…‘E„¶Éô°ùŽ•>ÖꆩÔÐ'Äþ™+(CL¯G¿ÝRüc3õ„¯¦†Á͆ª‹¯í¢yŸ Ì…ïr'ÚzFšN›Q°huâ¸5AG¢G¹>]>Iá‘™LÃÃÕú£ ,ŽËˆ ¶Ç(“ËõMÞ{EÖeó ùü&ŽCëñL†%~&ã퀴IAáÄû•cÖŒåèýÚ¤7LûÆÚ6猷y±oÌþgåÕ­¦:—´ù}x®Û¦}¹kG\ZÞü¶Í÷Ñmï§/^-S )+V.8:÷Êú+9§‰£´9ò &I.¬Ë^¯Õ`àvß?j_Zë·ÑÉ_Üš2¼Þ2fµ>ŠšýÊExûƒ;­õm©…ÛMÛù¾D¯Ý,Õ'~fV”ªI^;žÈ¦ºe}Žxäï¨5sŠ÷Ymâ¹Ãú_a^4~bý= ÝUUŸqÉœEþ~—¥Xü£Ü¿ÇO¶®<±ã±Ý¤Iªú»÷ïϯqÊÑ t©b7kÄéðÀÅMW Oá)©™ñÊT”<&ç‰T®Ú N”OÜ5UjûËé¯íßÌ×Ѫ"|N¿8QtÄÏóø‡üµaÎFŸÅŸoý‘‹f¢û¡ÜíÁºâ½£¬ƒÛƒ">^Û²ª@·mÖÆ“j"½HŸü#])„˜´t¡Ç‡c"‹­×ƒ¥³Ç ÔmÓÛ¨àë9BqýÉ©+ÖYàƒµ¾Ý_}¿Àúå Çýîï;¶w±|ž\ééM1*Íuš ô:Í醧(Ì-¯•Îã£|Ë3–LÜcÚø1R…\ºúlÝÒ1›bÙÒϬ›¨í'› š•(;Æ9Ãt“º Ö‹œ}wL&飵úìí´]“–ÕP¢¦Ø=™ìžw‹ºi\ô”SeÇZ>¬fÆÓLo›ÆïXkZjTùcÒWÅÄk¬^¨>üÙ(ˆoN9\rÌ újuð¥Bzý‡Gï_F½I¯yJ´­Ü(E»æ~5ÿîW_ãáœÃÖ…uçó¯%Ù(~*_l¶‚P½Èç­¬Ö‚K\îî›}‰÷áÌtýù^^ø–c´ã]ø—·ˆî{Õdz®nZ>¹ÙãûH~ztñ˜‡Ãk¶×PN§ë¼Oúô¾øÒHözÒü@ë›CëNØ”‘^êÞ-í%r[]}s]¬Au±Ý)ý9S) Jó_XO{þzvþ³÷ÃnzºÓºßØ“7WDŒÊÑÓÓSVV¯Š[ª¡oßbçuâTòõÝÚñŸ¼ƒ|d"Óm§Û¯3~;&fðz"¡ˆ°Ny*ÞmÌ^–ŒJåî-šŠŸ7¬7Ž9qò¼ß®ºNË5)ö{o½“Šç>¿7úF܃°³×CvŸ:¡tUóâ­œG’’Âò}&Üa›fí/ðyÿ ?è¢ûðÇ>vêÅòÂDûVœé͆ïã.ôkÕæ¬ëuaÉ´{ËZ¿kž`qO©Œúþº%kûv¥ƒj$Ï×ö;Mík?'´Îgvè²*õ7§j]s¬Æ¤&OÀ‡…Õ”î$5!^G²æª«3®O=¶9qœt¶`|û6…â7Z—op¼/´Å 9×2ofûÇ‘&ׯ&?;tiRâ½mÚÃ?áÑK?ßnÒjI89Áâ©ÀTûÝ!¿¡³äÒÜ#…™Jôu±!Âû424ŒšP\yµz]kHˆïÜsQ7®cÈ+¬´›ëãrf|ú¤ÛMÑ«Ý.IÙ«à¬IóÒÌn,ó÷³áϼÖL’~#Š:ÿŒ©óéJòÙÔ鼸ð§-ù/¦Wô ¿pxêĺڭaÉïÚJ¿FŒù¼paܺèð'ÃÜ|e\IlèrêÛË7ÒV˜}Þ¡Âo>׿‘7PÆ·ôb¥Úû†%ú;RsV ÓZ5.mç2¥uÓ½V´+Ÿœ,:–ºá2«ÀŸõ@täÊ­»¿~:ñVæ¿~7àOŽLt½ÐÔØà÷Þ ¨ÿ+wb7ÚêØwä%ÙÀ¿Êþô>À_¹ Íþ±C~å ÀP0Ÿ÷¸ÐPߤÛ-€ƒ…ëSÅ–/L:3pÔÈè¹£ŽŒô·<3Ô>š=TjCxÿãõ‘/²ów· ósâs;Fõû¡ëm׌š_ßæ…|¾•9ððSMÕˆèëðåìÔG Q^¨r6zcšœ­•o¤ŽÜªr¥ÈÛœ©Ar‹£ï—ÏdÈN ‰Ù²¶Æf \Þ¨¯ÑÊ5w§…D„l¹ ”®ô|$iôÝèÐ5S‘.©*ŒÒ|ì<}_9QiÛ‰ó[å^ª™Å\SàýcÙÞü’³¦Ûi•®üˆ#«§Íô MÞðÀÇ¡ïFRýþÝ»&~Ê¥…_KÒ5Âx‚)Ênô'ÑÒ&è_ôà}(ûƒÊ‡ŠvÿöÍsë¼Ïká¥_M/ (^ýuø ÇÛ+ǼÄÍW}å;;§rw»Û[›Ó1-á…ŒQSÒÈïÊtÔ2‡;gètø\®cÒÉ w­‰¸£¦Ò=Ÿ]<½s»ì–œ2/ÈßnÕDO«]2ûÊxõŸmØúÇëø%ù‚í^%ý2OVúÍÖ&nc:7hRT=Çþyªåv⫇d;¦ÆÊá“D=—­U ;G5œn‹1õ¶ûôVnÖNýÉ[„ÎÉ :»4.ËdŒŽˆÕpÛ0r‚:þœWÿçÄܵËZÖœ—]2=ŽûØÈJ«eÕädœy® {ãÝRª.«&×IŠª›úmË)YžÉ§´¦O!Že®úÉÕÛn¥¿;”sªºúúöÜ~8IËÒà­âî 6ÓhFÓ{ç­^oíÿÃ:Iº.þ“NÄ#‚õCí j¶á£#Æ…:o9âŠÕ¨‹5ÞY92B¿ÏQ.ø\´DL}âþrg©3*„û8ÞËE¢å«ý‹éÊigÎ »“wö§ÕÒO£Ú‹È•ã½ )vÚ\6©äˆôœÕ•'ŠînÚ›?\a¨ bÏñú¨ú<å;¼aÉ!ÏÊZJ¹‹kãNªÔ"¬Ý®DöPqV(#«Tå艪?•éö“ò–Zû¶nG¡ÂcÅ~ªˆÅ†܋}›IyÒv Áo–,6x:¸Ô‰d¹¢¦öa h¹­<ðÚ‡¤Šõ±2Òaú÷ÌFð>m:ê”x**]p«ñ©ÆÒ×JêÖ=a³€Ä5јÜßô9fShê­} ª%ƒê~ïróDV¼ˆ:7¬‘âN ™Ÿ¢D<›Dvž7!'¢~Ã2WÓ­óJ‡lé:¬”a$49þzwðÓwµ!‰gæH_]W;9Ä´üî´d¼²TþÒîìå·7æ|1o±æÊ(~åxN^Èíwò)ÿhéÁý"üFåæ¹¸ ^é£2ÙšW¹5µ¥_.tÏá*Æ«•ý´¦Ë] zlÂÜn«{g–?”fO—n™J˜²?npâ½ûÖ—q²ŠïÓ!‹ñ¾c‘©÷o¹ý2¯Õæãö™wæ»eRÌÓß—;>B!Øë|³)ŒD_´¡I'áʘùÉÙC šo'Ø =ÄýÀžfKÎÞ–Íîqë+_íø¾Àæ³ÍEV1«ÀæiÿK‰;v<8R{>ЯòÇÑg^ œù§Æöom–òOu[È<1ÀÉ8,ýË%§ÁEšå LÔg·Tø”çf¬ô¶øÐªQPUm0Q>Kë†óË Ù‹WI‘-MŒ»pæZúñ’uò -n{x&É|nV4›úÆUéäÂÜ”|3ÍéÓ•~¨© _¥.óÝÀ›Ñªù½­â™Ç éØ)MÒzÍ\ǃ9òHAÇ7y6Ì,(ÞV°~iÜ÷óÈÁ›[®ŸSé×"«]7åõÖÞ€~%v¬‰—– ๯²ÖŸŽåE]•޼ºW2Tç¬àñ÷›¹oÜç¿î˜¸‹ê85KK{þœQ‚»Æ“{Öo–Œ¬/ 1[¸jô÷kÅß‡š®žž¢š¡Ød¿îù'™OŒ!mË5óJÒ\$Ó಩úh¸kðùÚ ë@Úܕ——g–îrp{U;jë¼,2™~3õc=©mÖɬ.Ö~O<üäµGT´´Ö´qû:bêø¶mï?±ê®>É8}ÿ Ç=(ö€2“8þ4}ÌÎÆf©¡¢¢³™‘Õýf¨'gÄW9Ÿ\»í¢æXŸí¦Ó¬d›†ñý©4e“Š?8™Û£OÝ0qºû@{ÜøÇœ½š_“ó>¤ÿn¨ êâº.¥i~ÃI)ý3*yÕ uY§¼ýroøø&3½çJLy©äcYgœæË+ÛM îqUS׸ç¯é_tÊó›RPsºµs]Êúñ®ç¢>:zä)žX’°¡áÎÝ›ÊWwÕ†Äù^O1z®ÿ]ÜïSäuÌZ…'%ï=·¦å[ž®ºu%pCd«–ËÉx‡™žÞÝy,;häÐk› ¿P|D¹E˜m_ô13®Ê0ï\ãã/Ï‘ßÜüýÒÖ [g*”’BŸº~O}r.å6ù¥ƒßÈEc“wFD>NLœGŠ?·È¨fÍÕ“êæ†“nÔ×~zXÚ_:¯VGÝÞF[3q_“¨8pÄyÚ‹ZÓ ‡zÚ$úA‹“m9Ÿ ’šê®žÔµß§A~^)¨ZØT™é©ä;U(ûæwÛVWëüÁæ1SWmÝàïuðPRÙRW×8y…µÁ6ÎJ°Ql4˶8èíx‚D¼Çlë^“å3–nmØT|¶1`gûVÇ2¯•2ä€+hŸª >œ^d1å¢| gµLöÎëûn&MØo“qïð;½DeÙµ;ëSoÕñÜ?¨™½ñÉä/•rd+æ7/à䇽ß䙦>?Ñ#ȵôªö›,»ŒAuˆ)[ÇaŒã-ò¶'ç-…C hY ŽÏv_Rïä.<Œ0žŸÙœ“á¬ÅÓâmüvÕª~G™­ƒ¬*ŒŽ9Ühë÷-þ¼uˆŸ?mlëwwo3¯ì41 }úˆ5Té’Öàðʃ{õ–{©yQ¸ïÔfU¾ kÓ;ãÎ+”À0£´e›Xc§IòþÜãBæýP¼‰µöÎ:C£Ã²Nå§÷aÙµS‚™n[k[ôóc'œža4g`Ä1ܤ!iØq‹.ÈÏ^´ *Ú3ôýÝñRtÞ¿?f´óö• ±WkÐ']4‚±crÎÛOÒu©fžÊ]iö£ùfãÊE#n|Í© „®ŸvØïâšÌüèÕÌò§¾Ï·Fg½ßšðÝm­Ê™¨þÓV÷É™ÿÃdnÞÎ8–¿[ã‹‚¯FØx5å ÖÍÙ=oExŠ1÷tv£ë¾ƒ•ãŠö¯¾õ}¤¼ÁÀ½…—œÇåšqSÿź¸åIÕG\mSÂvN¿­°ó‹Ú™g—¦RþzÿÓtÏw‡7’ëÖ)ûÐXQ3öëì Õ5_Õì¹ëU”Èåïš—A= rNId<0µÌGR¾R{zJÚ©å…zÚ3õƒÞ¼ÖöìÑÚï+mhìô>Gçº3–+Ôóö«kk=¯`ð‡ÜN1YŠòõGÀS{5Ú*ƒÃwª/ïùœÔpj°q½ù~Y§ ÙÝ…šaê.m¼ŸW$yfÍ•7öÓ¾¥Lþ&Z™»™Õ˜eþ!ìH¡õxeºá,Ï-Û—›ª«ï箼»¸$|ܾmÌ–Qw>ׯi_(åÁϦm›n¡ómÇÂÛCçÝ*PÚ²ñ»ÙÉm1øæQób»´æÌž¢T8±åcuÞ¸×ru§ë¼;ÿ&о` n ç}.cË,ÁÀØ„ƒ+ç…y‘m¶ãrj¼&º¥¨VÎP³±™½Òz‘ç2ÿà›ïP —R9yÇøAð¾©Ús›Rñn·W2w¢Ëºº@šdà”¹ë@I–{š—Î~ù“7Eædåñ>UŸ4|ý¥£‡–°²"ïàæVø¶-#—x¬{u´þWãLÿlx¿¢MÏnL zßp^*gRN¬‡MXIÑj‡)¡÷V¤Ê%¤Æ¬ Z˜«|G#bÑ娴ūë¶<œ3}̳±ò3œåŸµï¶<¸^n•å¾ê’E{^Ž#ö—k}RRÒºän–nE°—웨;²;êè÷ìžP/‘¾myµùAÐéã»q¼ˆe×îß_^XvØÕRG¯£…ƒ]¾©ônèåo݆Ïε™ÿVí9gÈ«‰Ü\¾lºœ{µò»­±6¿3¶u9¸sêeÅÁ¥v™±­?©µÕ¿â]z;m‰p%îÔÍË#ò®×ŸòÇûo)B ÄTïG½\ÿSV¯.½ºXxÄI}Îë¥ Û6OÔõÖ±éÈÒ5Ìœ1¬Z÷óE!%*‡å8ûà -‘ÿžÜ~‚ƒY§×˜F^oÔt^û2ÇNÈ›Ó|mô²œè¡{æj~zº^Š{ädÍæe¨î²›üž7{…Ì÷A2ê_¬Ò*UMŽô‘Φh Ưxñ™ü1HkuK.;=øóð…†¢ê5vÍF2u6Žç®ËžœäøI 6£‹„óÙ®V {½2[Ý&ù¼­½œF,œY|íÇêçƒlÞN˜ïŸ½4ɾ·áNäo¢×iâ­ ¼mAYúv%Ô¢}´­Xåã˜ûä¹Â˜§Þ&òAB##Q‚!k˜b«F«B˜ßRýûOZáU~„îúa/T[Ý®t}…-î¤Ý4·œÈQ1å2í›îìÙS³IËqMóf-{Û´hÝQÅ×ûH=´˜ù)h1ëY÷ΤV[?p-ùñGÊh-5ätàø}Ñ-²þº§üïŤÊ-Ä•]Ry=ÇÍøÐ¸Uy“Ûß=ÔªÛXX›YNéïiz+ø[‹úÿ¼æó¨.{ö*}Õò¥ë×r6™g8@s½ÿtÿºåéŒ7ÂŒ=CΖEð0£Ü±Ñzp‘=5UîÀa™ùÓ—gGr4yïå.±Lžæ4²˜à{WY›ªi<=EñÜÛ'ˆ´Ö¹ÁZ3^ñ,=~à²ûþ™™î™s5ñµ\ýÛkãÚdnT I{ë79¥vá×ÜôÆŠ¡|ÿ3õšQÒ®îÙq3’¹<™Mˆ[S·l­eEíiלò>YYof²K–ÜŒí»‡ËÉË›;ßH0 Þ˜|[gôËeo*§x],º,ítMËÄ3—ÇÜ˰MôyVñ®êžLðÙäÄ{Õ[&;L)ìmÒÅóÚÊ+B†æ%‡ííßhÞoù¦³æ#æzȽ^Øx¹?®*+[.dÊÎñ[}~#ûá¢ò/ôí÷Oô˺ççöL×s`Kð¥ åi• ÷7RÉŽUüð›ðWZDJGj'5êøß=³'Ö¤"Ì46b©NÐÛ?^LÏØ@ÞG¹s¡tʙԃÇB÷çŽx´×pïò#jËÖ¹Ë7(gþa"/ýìXØÞ²|²~öÇŒ‘žÙWïk–g%X¸0ÛÃ’zvB}³zY6¿¬¿…Ýîk£­ó¸#b&IMð´ãÉF-qÚS“/{/Ãp¯Ú’SÄŠ$§[>§},=¶º¬›¡¾l¿ådc‡¬ø«¡®¾“T+J]6gyOŽ}³tZÀ ò£HúÃãï¼ UÈDzNø‡æ=¼ÐüüÁå4‘ì÷á+~Ïùvþ£vãÛª O=ñç”ïö¨Æ¿KÐpÙRBŠaL9òµYûÝý£^—)OY^ûu´ÕQ$eÇû¶gÑ{ vï½093¡ÕÖ)Üýü§Ä¢+o› 6k]Äuòñ¯ŸºƒL"íÎ,;YAÎPhØe3ƒìãWþlÔþ?»Ûâ™ËðLÖZûÊN-þ_¶%ÖÌ«ÕH±Kµ«‹mö0xðq¤áí©uÞWBRuO¾O¶§zø<ô*®ò­'1[6úẳå·- ‡_ÿþÞI¸¢ýsûë i©_›òˆ§+G´¼º^ç¶Êà¡w«5öªO»öÅxe|S¿Öª£«B&§/i9“›TV‚_üðppȽ³uï²N©N~qañË!ƒ×˜úuG[{¥KÌ9ÿ‚¶ÉG}[=f+Ä\ö?lê3‡0òÇ«6×ú¸åHïŸKçþ›—Î1LL}覽¯þb2ú †©‘¾·ÁÿÂ¥sªßréœÙ¿~éœÙÿ…Kçþ¾þÍKç~eªßMã.ûüÒ9³¿¼tÎì_½tNÿO.ã÷¼NÏÔÀ¬×nzF††½Ê L åÒ9=ãÞ}{_ô¦odÚó²6=½>.„Ó×5èu©›‘4‹=æ01ëUf ßûÂ:=]³Þe½ç004ëuQž±ži/˜ Lz¯M×°÷¥xú=q¥glflögÑéÿùEtjžººž``UÃBOcwO}c'O}cÝÙÀOý/ô¸†NÏÔÈÐøŸkèþ3÷¿qyÁt>WÛï·^öóûßt t ûéééÁvÆðþ7}#Ãîûoü(³}¸Àx"6œLÃãÈ Í‘´Gv¤ÙH+ƒ*6—õ“Zii Ï EOw jxu˜]-ðKa„"Vt.›ÅA(B—ÁâûJ#àâÄâÀƒ)À4yˆHÀÒD˜` M$uß4:×ñfsÆfˆ„,DèÇÀ~ž0& ­g ˆ·ØÅA<PŠ?#'ÀZ³…~Àq½}X,„-@üX|€Ì—Oç YÞšH ŸÄöfyƒYèBð ôcð‚X(Dèª`_.OÈf‚šÀ@°¹Ã-Ø,: Ú—Áa úÔg_´ °sõ½†ˆy|!› QÕ}yšA ¹ ,Ax>ˆƒ¶­6UŽB'ˆK€.ìL÷æWȆÇ€˜@¸Ula(œ_Hgsa9À~š!<`<0v7T‹ˆYL¶›©‰óÙB@O€86·c5Ú°Ÿœúb€.á³B‘¬A€ n$ºˆ-¤3ØÏöE±Ó1qjj#ˆ­Ò¯ƒ^Jtø®{J€d…ÀÙp½ìàF‚V`,HéPŽ´4‡–@%B… yŽšØ/š…qEêæÒl®éւݳ…À¨k AÏÝšØh8. V¿ˆk9è(\Nïj1â ’ D\ø–%Jì®MEÖ´'P¢@E€`Òî­F£Ù:R DžäàdK$Õ‘éÓ»TЏìM½+¤ó¬h¶ ŠŽéËÇÞ#Šhøxƒ8~íÝÙøo4u'Ij½Úô¹.?!à2µU"ÁŸ¡‚+äùý¼‹D;Z:Û­l­i] ^ZADh="Y?,ëÌ”Ð5ê=ѤFW×Tc¨«w¢×Ý‘î¨ë»;ÄT÷þ(îè°{|‚®QÄuéŠ!ëˆtCnŽ(úºtÄÐÙ½#V†u1ÛGZü‰óÑ“Õ §I8 •ÙΦ}!Øæ/î·úºÆã¿Íü ÿÄ>z=ý?cãîÿýßóÿœˆ8ê<Ùág`—ú> ž™™)tý w  t¦ðJ„À[³å „l!t耟Ae1ý¸<ϵ̽|H”jAWR¯/f€ÎùÇ—üÇ—üßõ%•Ù\&Gäͽŗ¦‹µý”º;R l ôQïiª¤ÈbE¢ß îˆ@ÁcW —FЖæìh ›£¦ø««äɬãÉ‘*y¤—€¹ 8,]¿¢æ—Fóe %%jгBý‰îêô¡ÀÒà :@JЊÅ‚oh€Aà3#2ê¹Á(m@¬&¼ÏQàSÈë6zߦ»S{üc¼ÿÙÿŽûþµéÌßknÿ€¹7érÿ¿´ÿz&ÿØÿÿÆOs"È„ùjúÚF&@ò½¹ÄEœº‡¶ˆ¶7|“ƵwÚÈ<–é¾ÁwløˆŸ'Ö3ât¿¶Ÿ4ÒÖÑ–ªæñ–—&â±—Ô\âR ØÆ–ƒÌÆLD¼IÄäñ8Ú~ômK¶€ïJÁl®OG<ÒO#¹iîîFºÏƺҘ‚!¹Èd[+ çL%áIŽó¤!LðÁÖšF!ã­lÉj(ÐìÀ cm?0bg=¦ª(â˜@hûakdˆØïípx2‰†`k@ˆiÀ ñHVéCÛ¨Y5PIQŽ#•Fv&(5=ŠÔü»7x'§yDœ5&nðØS0Ð&€¬X¼Ácøe!€l Æ@“8‚ÎŒ`?˜<A$<Àé™N>àB–@ f!⤦úx`LvD‚ntŠ_ÄE§“ Ûs\0 €S92ªB±?— ìkU†N`æñ½YpE«ØbY]—аR‘Ål05X(6m¨6∥ Ñ\ àm—<.èRU-+'[¼*6#ÖFB/qê 5ˆ*AtÛñeTK‹`À|$Mì¢0„Ð9ÐâÁ¬*t‹PÌõDjˆ0·6”0È./x@iÁ¨<´é˜s`Y@t0†[`!œPŒúÐ1…œP¸0ÔÀuһϊÒÍ~B 0×M ¡þÕ#ÐV¨Ý—ØCÙÏ+Îra¡›¾Ä‚†ÍOƒpö–tɽ0Dgpºd®¡ £ b ذ rƒH(‚aÄHâvÑkœPI®Ea C»$âÂ+}ÿhû Šfwx¿‚¡ág£ÆíQ¤ÚÝ›ù¥Ä¢ÆoùA‡’d^uÄ2É^ ÐnÐ_ªA’ xûËï„¡›' ÙcRÔŽ"š%Žb‹‡Ñ;¥¯Z4ðÓZIò᧠Ĭ¾“Ö*¤Ðب!R¶‚Ç‚ïte•Áÿ>úpEJˆp&”à¾agsøc3™ˆž®¶+T™hÄ…Ö`ÊÄGb-ª…ñ©p)K,ΟÎdÖ÷Df` )ûž‡­å üG6Nx® º°}‘‡fƒ6&Qzåf:šàÈdœ‘îH°üëBè»!ð8©$ª›4ÝoÓw»îîm:2A=´^G…&†²•`à:Ò˜">Ç›Åù’BýýR…G)ƒíÕa>&?ðø†ˆã-ÙÃòæqYàÈK¼aÆ„Öþ­òõ›W†i}_l“¡É/ u£Ytx;Üôñæ ´ýàüS½Oúà ݳè ™ì@P&„òYÀi€ ¶+ÆÜÌG|D|ôSÒ™.ÃŒö£¡¥¡ t°>“¥ÑUd%ÃÁ Vüµ+ÿ››wóg=áý>{¢–> nî_-Mÿgkë5£>M2a§b™ñ.ºô3þôíäð. õg4X×þ:²Où‰(£û˽ xöN|6;˜C$ài8G+šxè8—×gvþ¦ã„ҬѢçL¨ÃNÕ¥­ØÑ=¢>ºôÕë€ÍÜí£C­vѽ5|Ú[*á1|­UIݼK_ Z%¢þ§ŠâO•Å_ŒÒ¡4zqa'»ÿLŸt1’(“‚_ÿ®~q`sÙ!ˆ¶Þ¯©û.]P@~UMëh $tʱÎâL4Ü' E¸,`áfqYB_W|z3±Ñó €ûÚ£{Ó\!iòÊÿç$ÿÏڃߠõYxž8M óa"`ÈÊ‘‚duœ´üu’Áñþ½:‘-z³y˜hÿÿÿ>G.æÉ Z(-Y$JOÿ‘ûr¹?÷ii?ÙªEãm®ªèl ZœïÅ7jê]üT,ó8A(&`C¶“pX¥qÀGj¹gt_-¾†ÍGmn|Ûž¥·¤Æ©Ø@âô¯„A%Û–¿Ì£JT´?¾ËÞ<*+æN3€îRi$´“ É‘€Ìžè#Âç@áÞ·;<Ãg E|.¢û·xfƒ 82ÞÕÝjØ!^~›É‚Ø…`aH£§ûî£xo ¦ýAwðH"º Ýà/gà•a}YüŽ49º/#Ùbвa¦¨ëø]8Á™‹&úAÇVÀ¨ŒegØIÈáô"UÇàê¿"’Ä·è¾b^½Mf@ &¢Ù3Z÷ÓD:[©÷ˆ 1ßnŠÓ:Û¢Ì(ná#â2»Vu•’?°W@- _$‹Âüº^7Ò«xPÑê$,-Ò3³€nƒ;ðÔßž$±åb~>š„° iO&º%¾p—^äð¸€,lÿ;TaÑ’tÀ€u^ºïLIÞëŠLá`¤A&ÑpÓ€ççàî‘d@ºÜ@Â<÷`¤ßÚð, ~ÁÙº"F Ü…ƒ©Á|%ºC%˜£.9lP„½¬  B¡ kw[>Žì„£Ao›÷S»  ;™;Ѐé Û×OC| n;AD_ƒÃN× "ÜÁ¤`vx®P’¸`Á]}¸OÕ“0cÛž”ðrŸôs$Páé6š­c·~]å©£Ÿ—´z/E&~½L€ºH"ô´{ñO²­¾µEg¢åEÈfbê}­B…è¦1ºÃLí¢!OuUwÀÜ:ã©h± Ž(Ý©¾`wìbø 5lþ3ºF"ÉÑþ‡Gø0yò°Â²Z·zh~é”À+~¥Q€NêZ· ¢ ÖöR÷‚Ábø6šVDé®®hZÃI;¥Ÿ¯†‚Œþ]k"5¬‚¿õ Á;à†‡¦ðð‘øwC—nh$vœ E7Œ{!ŒHüµ8]•»Ø+ñu=¨*.ÕÄ\çNh:ÊÙðX´ºÑIªä.0ž‚µñRWï>TØ( {Ìå+0À{,Û’D"Ò¨¼Ó“uС Ìíô‚%L" b.Íߢe©V(6Ýó1˜õé”ÏΗy:ŽÊb‡d€b €I£Ò„geEîøëÑ •„· ¥5 G%9ØâaËNQµv„ØE8aäÈŒwé³p™äЫ‚Bp´êZø?ìýy—Ç‘æÞ…O‘âôH°r¯$›ý6”$¼¥‘tëxFDf+6DDfU±GßýºG.n‡/F-ìž{¨>-‘U¿²ôŒðÕü13ÕQÞ¼=Û&‡ž—»ùW‡ùÍûËër.~mAއ¦Á/~ýâÍG ÿë÷WWê‰(-íð·òTáýåÕ›ßY~pΨ?õüZ­&Î_;)ןßýêïÞ¾ÿxm1ÞOñêÿßÉCë×ß¾süÊñWo_Ø]ÿc׫"¿t½ªòËHàí;ËŸ»ÌÊÕáÅóW/¾~gÿœB­¿xùý^¹,½ñ}Ìçç¼±üöý«W¿{dîÞŸÿºì CA%×Ëço>ª}ºœRyQ²RªÒÿ¾×:Çëóvç¯ßj²·8§+!åõzw|žòŸ¡MWôŸpŸŽŸšÓ¼\ñF7bŸŽNŒšÞŸ˜oîÝOoîïúæžsßÜsÆ›{ŽoÎxuj‘•‹k‘$ÞË‹<ìAÿoz>ʺ> ÷†wªŸWÿCÎðêOï"øê'ƒWoý¦Æ×ŽÙ&N¦­Cø¤RÀµ$ê ÿõ}¾n8ïieÇx:>;A|}õõ¯®Þ?¶™hUgkcyv¿Î’§¼ '-–»lõ_/ÞªÝúKÝ~Kó[Ó{ñ|ö³Ã¡îp˜ú©Ïþcû¬uVQïFEÜ‘ÅуNä3‘]÷¡OY]þt&ùÝýüI~òô§ŽñëGÝË_™uP_ º_¿½{Õÿ¸Îº2.êÞ¥|¼Ï«6‰xèm䬑¤÷]ÕG+GÈÁ¢.¿ê/MÕ?}fs]%iZ–ÿ¤ ¤/1ÝV½…ÑÔkª‹´Ñgäµ·¢¦éÏ\3îïå¹ì·×ß«hºÇ]Ʊñ‡ÛõGñ£ô¡­§«Òg¾¶®Uj.ËóÞ†kwêÉ )_zýDq¾…¥W¬ç¨ åVÑ÷RåòÚdû>ÃZÖG3lûLlí³ëå7W½¡÷^ºÉõ¯^ýæêÍËWÏßnˆµßòÈ__~¯]¨£?zïÏWqÑÍ!NSEÔuÇ[¨u¶UÅ2qŠ9ýó“ã£}zþ õ˜TàHRzõBŸh¡ÿë´UNå¶Ý‡T>]—§Ç_ý\ùb©_ºÿhã@ÒdÔÈçU£$U²‹ÓÅî·¯>þöñá7¶k]u×~ý•ŠÞèÿQÝPm«&²)vôøxÁñUŸ^cw`ž¨+àƒÿ½œß~}­Ø^ÚÝôwÁ§ÜçOÂo_Cå—ÛŒîÒU:¦’>c!%ê—£§ÇˆÎUâò®;Ü{÷V…ÃŒ’*mÕ+Hï³Vu/¥…QYìÀ’ŠÈÞ¨B‰õ,£¾ö)îÙ'anª×ç6J „ö8r´ÅǟѨ²ࣃßþy¤ïÐYG í屟óQœŸ+µ¢T/ùà‰~©{_Y•)QnEÂçÒª3žsO”ò{“ö~¦2ôõ¿ù½ñóŸ5ú}YŒ‡qŽ$%ìú[sV#ÜSã£uïý£8¦2Ì >?ô§ClЃEÝv¨}tØ[²/½yûæWJfa&g"??¹ìŽik à»÷¯~÷üãÕ5Q@|¦ãi‡Œvx÷q¶W¿ÿøþù% =½ùœûXÁ»^Ý¥úÜï媠#{-}{`!”w§œöÓ.M¿OU¯‘X‹ø0m© ˆJލSuûèщ<„jê=ÆÜŸ ß©þ—×/ñ—½þWÿíà }.éëß{E/‡àxõ¸Úê¥ÿéÓG?sª^&Ç¥¶Ò÷®TÍu?ûãÁøuO}²—?÷¿&ñØýüâ÷¿·fc=Zäom³Ç½œ>NCægªgÇõ«ÿÏŽ3Áð×J\õ³~øþìÏxo÷O„;|N“wú w“/4ô3”Øýâ¿ýê·Þ>É¡TŸÞÂù:M¾ƒŸ©V‘ϱ~yh”åó>ö£&ºãýœÊ-Úç¨À©íøy‡ÞœÈsøóxBÇkËC¼o~õò•Êr§ØãD¢«&&ù»S²¥šê‹Ïê£þêí7ß}ó±OLóµÜ€\¿|õáã u¦xüÇ}¦Rü”XóÿÊüŸçôߊNvÄ'ÿ÷r6ž˜ù¿ç‹ÉOù?”üß*yÿám>½­Óòü/ßfåtÒë~úI Ï“ÖÏêOþ—ÒÿÉ#—ü¯õÃè7»TåùøRÍ^ýéF®__ŒN)ìTæŸ]ÿ|×›ôóƒ¬ûÛç_¼ýš¦åÒNú)2í~.YµT¨ú«7/^Ëy-zõO†žüéæOòð'=ÛË4¿‘ŸËilz¹ø—ƒÊÏ8è€~~8Úÿ³RKª·´¢eCÇ>9¶èø»Ÿ}ux.'ûá³È“g‰üª®¿R­WRòúôäWº>§¼º~2ú·‘ÍÞ-[“¤ùèóO£Ï7£É¿¿ùæõñ1ö¿ê“½ì|­¾Oq›dÍ£÷/û_ª„^ê/Ûã_¾x'¬’£ËqH±!{Å´EÅfÝÄ£èûü‡ï·ê¿>Éÿ—Ö¿—?må‡4_Åò|ÝMä?×Ù(ª²¼é6Åè_ô±$º‹“¯&ãQ´î¾R½+ù¥üÿÞs&ÿ÷°»;—Qúÿçïÿ@ΟÔRòæãË—¯Nä«‹{•ï¸/¤½z&ŸÕ©WËuüõé‹r¿ä>D…®¢~ÚË“Ó{ËO•v±”§9ÝYûlúTªïDIÿ_OÿÔ·õô ~©€©üèþWONûKõzTÒ‘çÇCÿàâüŽéOO9Ã_½yóñøÝÙ‹^ôÉ.Õ.¶ßtªä?§Æªä`rðuÓ ˜’3ÁGõx¹»nªª{ò§¬ŒÏŸüöWÿ¯ÊS£ã·/®ûé陪(Ø;´ä ëGÜ zò§ä¡üS?(ž‰f«kÏÊ0¤¨uÉ–¿:‰ýdÛOÉ ÏË¢lÍèî¤l×ö9Fbù¸ÒCu€Q´µò⛟÷Ó]úI9•´O¥½¹¾–¿>Íz¨v£¯¿ùð±ÿë£ÁÞ‚rQ+ýkøùɳH›AÊaªyqHð÷á‹gñWê±<9ÿJ}[¹ÛûSÿ½?|AtL6¥"V¿}rLa™*uQzP9–iŸÒì@ôù’žôÞŠã^þáÍõ†FG#ÛC~tþÛþ·¿<Þ?EÜ)ßá£ÓgŒ,¨†bß»«æLš RÅäô9-&ÿtXÇÔœýH¾/äﵡ'”–ÿ|œÎŸô#FNÏOFÏgäW/ýì?ú®ß¦y\‚ù+Á#bâ‹G?‹þéñ×/¥ÿïÐ><úõmáßÓ¢ê‘Ö}1zvõ{¹ÝþðöÍë?<ú™|ïïzø™Ê¸ÙÄ#\v¾ ¯IþóéÁ<éŸÃÈy¢ ½–ŸÚ‡ÖI#£ÿø§?£%9D¾ÀÐÿòü×Ïß?Erª]¢˜X8­c_à;P_ìOýïdOµýJ½ÊmÚÉ©ðHÀ:i¶ö¨¥—SµüE?©<é](£ÿäØþãŒþrŽÓ’­~::D›÷õè¼[¿BÿËÿþßl¬_ãôûÿöß$ÎSQ~A‡ /ï¿~]Óü¡êùägÖ@»ó£}ÿ1Êí–?ððÛÇ’ùáüTäšMˆã´qü‡/ÔKøJ!Ç6½|2œ,m¿8̓Ÿ÷³„å7=»z/ÿáùÊ_÷ðM=T¦Ye9VÎÃÐø¹Dk!·‡×zpÜþÒD•„rÚôcв‘³ÿ îääOÿ¤þ5®ïN탽\sz ç²µ§ôú°p·gù˜úÝñg£_ÿáÉ#UüMUT˾|Ô+~ý{_~­9“÷½iÒtø{%ÊQëq&Ϻ_Ž²Ñ¿Îº4VqáòÇ¿ü¥ÓÔúcöçÞmÅñW¡?ü]+;²ªÝänþ 0ÿ2¯ªÛ]íþÄÓï¿|ôËc|¨Üt#Ê2ÍGÇÿ…Ç<:Éì>íTšù_ôÿC~¬u]VIú‹Ã?ª˜VϯÕ?ª_r¿=þùù#UóÉIúW{¶%ßÒ¿<>Rѿ˩äZµ@Î%úMž Köüwòe¦÷Ý—úS•>A·ð(³øÏ£ûñðå¾Ò´|U¢§¤ZƒO8 ‡OPEûäÌ!禃%IóCúo5rOísú9Ñ¿+_ÖZÄ·ÿ.šíÓQ¿¾zyuPB¾zûæéèâéèÍ7*fñâœßëP¨P½ãþA<Lý—³¬ñÍ! q߸_KÛsÌýÛª‘dݱ6Yž÷Œú†ª¢Ä)yŠª|Ýô›j²ë¹ƒy´&§ÔCvô²ºëÅ3ý·>̇~vµ×ýãë¹ÇŽ÷úÄ:Fû§ó¿^½¼þ¨.õû`[2JOï‘÷iÇOº^?\Ê5ŽŸœ ã“UÐîÛo>þ?½0î:lÁ)Ìúô®O3äqë½§'sOŽáHÛ?Í1Çf™_çÌY&;:ƒ˜öNÓé¿§æó/]“Û~Çô6øý—ççEoÎzŽgéžimÏæ@~qø·/¥ˆ4Ö¢Sçp¿‡#ïAÿ]Ÿ¥¡'ÔTh~†|+_ðð-ã\n®RÜöÔ¬§G+O€÷ôØ®ûkWÛbâ/î~CWÜ>§ñ ùuÔä¦Þà‰¨û™±z…ÿmÏý<¬üšr×ölú?ÿMÇòŸñþ:›ýtþûQþóìOŸ=’ÿÿ·OFþªsúÿá`§þü¯>Ù©?þ«vôàÙNýé_¸Sý7œîàÿãúÿú|§þø¯<à©?eðú~øñ·‡ÝJÐWt»zóq4}6™Žþß]þÐ÷o‰}øí¨ÚLy£?EýîòPAîÔ§š‰ûê_²õ¢úS@Û[ûð‡7oß}xõáѳR~Û_hΙC´Ê³wïÔ/ôÒM?ötH<µâÚ¼Rÿü§Í»'žm²þ3äFúÅûW½È÷ÑGõ*_ =:G'¨ŸÊ7¢>?‚º†þF#ù釮hä²+®å{ÎOŸÈæ<}düRþ~¯^"u×PâÙáñ¿ýxõáÑá«^¦ê²]¹~û´?ÇŸÆUÓ¤q÷¤·«×¢Úi¼šZ-ù}1®C ÀÃA„|› i&ÑìÛ#ühðk‚ulîèX³øNŠê”uª$ ìM}“ÚN+Õ¹6ÛOå/ãg£ÇŸ½úðâ³'CrŠX<•ÿµB;§µ_zö7Ü öÊÐi“Ø ªú ‡ÃÛ$*Kç­ÞÚæéíãé«}üíÕèÃÛ_üVîKF¯>ŒÞ½û»W/¯^Ž>{þAþûg£ço^Êÿ}1z)ÿëõóW_+ÃëÑ·ªÈ×›¯ä")¨¨¸Ñû«ß<ÿrôñ­´) i£o^¼þF©û?|õõ»×¯¤ym`ôö×½sþêý‹ßÊŸ<ÿիׯ>þ¡ÿÜ_¿úøæêõûz#—äÑÕïÔ~éÃo{C²M¿º½~¥D£_ËÅByþæ£ï®^¼zþú©lñû«egxsú§·ïG*±ÊÕÿúFÚ‘Ìèåó¯ŸÿF5á}ÿ§Çí¿ÒoŸüðV~àûÑ!¶A}••jôúíÕæÑ7®äg<ÿø\ýµ|l²±žÊ¿»’ô½jðó7}“z×¢úùÑß?Wíxsõ›×*zòÅ•úÛ·ý||û^‚ß|8þrO¾ú >ôí7•iàmoö˜–Jퟻzƒ²-}+®ÞËñõóÞð¯ñ=œïþÊCš2ù|U’!ç̓þùiöU— ‡a™•ý Òñ󧣿é¨TÃíg}ÒEÙóåïän¼½mG‡èS ôi Õ/úxÜv|¡þèß.žŽþý¢ß ]œ2¨«àŽQ׈CBàgÇ«´çå˜UIïäV+z/‹<„$&²¿ô#¡H…Ü_W“gsù“ÙÅç“K•ä@ýõÅýXþ§»fe¬ÛTªÎØ¨Š»´ë?In¦nª¦ÿ¬wb—~—Ýgéè±ìxOžÊíºÜ™ª‰¤¬Ê/uðéœG,'‘î°þE®¦ ý¯MŸ„N=*årÚ•ÇÅõÉÓuÿt´î]ëÑWò¡}>ºT¿¹Wúã´ÐÏ|}¼£=¾Wå·—£]>é3”S7¿üõÁk—+s-<¼Ê¸8úÅ“üÉ×½‡«ñQ͉êl‡æÉýR¶ôß•¿mE'w¨j×cù‘ÿ2º¸¿¼x¢n7ç}rv»)Ncgשíã³[ëô“hL|Èý·ú·ûj4>ü¬!ÿ¦~ú£‹ÞCyôøþ´Ãú¿NÿÑ&iuÿ.î¿Ðþo2™Oåþo¹œŽ§‹Å|®ürOøÓþï¿Æÿ7QóõOþ¿Ÿüÿÿàÿ;ÄE+÷ßlôëtÝì”{Io¬ÀäwvS‹ÿÃ<û;–?m^É÷yûÎ,úÇÿ•éò;6ÝhyÙöÙ?èòC·‡‹ðÞOtú¡|žžÐßîBú+f™Ÿëgý? p¯U5øáþo|±¼˜×ÿ¥<.Lúû¿ùOëÿÿU÷vèÅÊ&ýi»ðÓvá¿ÝváÆ{ýêÍ«þºp¼’½¿ß+¬Ì½ Õfáx;t \P?ÎDž}¨8Ø! ·Ú·AM?V?•k~Ÿi°ßعë"-LÖW-ú°ßx¬v¢èwÊøãCbþ'Á¿<ü¡Úhôv°Vw ÷/UPÕé3ÏüôX ÿŸ'ö-ÚDõ—ž¿>}é){ Ú{´ÆkPÿ®œÐý¥Ý¹äÕqš;¼ÀGçRmj\õ¾ŠÌ­s•=èX™^õÀ¾ ‰Þs;àúáѱ+‹žG Ü©ÚIª ÎñKdz iF ]q:>Œ·³ŸnÓò³±§ŽmR¿=þl$ân×Çô>å¤Ù’ýTï_*QWÂý³¡ =Ô—¥›M«Ê÷£]Ùe¹lÏ¡@†µê;¨Üç­êéõás»ú¸]•_ôÙÊúÉëô×£Ó_?ÂÏUƒÿøVUuõ?ìbuW¬qþHü£¤RÓàš×6Êç˜Ê.V•ùá}o²¦íúƾê!ýNtÊ”§ÞX)¿Ý¹É×rÉ©|ÇüèüžéžùjÔÀG}õ¤´;aë}´µPIÝÊ㤪F?±ë—-;(S7©èïi*i‡Ê¶§ àÄr–V=.Í«»g£ÇŒƒª2Nß­Õš({ãÛ÷'‰ì^ä»T=¦mŸ^ê™ s?”Ö©ò5‡uS%Q<~êa~P·â§Ù±Ÿ¯Ÿ¿~Ý߈¿¬T6º]KGDÿ!ò¹åjÆUÆä×{´…œÔÅáFénû•«y8®8qUvM•²r†èéÉŸÅ3ïÐWÓŸþ}A ö|ï~ŽãW#T¹t+Ùñ QŠm_¥•HN‹é#c”ôwþ‡±|.v+ûª|0‡¹ó¤yP“¯’ z¸ü’êÙ纳êáp ÄñÔ9êªZ±‘ß÷çt–Õ!G@vœèPïS w¢é7/ë~ÍÚ~šSTï¶ÍýŸÑ©áðéÏÎ5nÏ3¤JB¨féGu¥”#™*¨¦ÃøT˳.ö¥ï°Ky+7»ô4Þ7²·?ꟶ9Iô‹ÞáùýN²ÿ.DÅ¡݇ö꺨ʒZ–OpWªGx*u¤ú²*'w;ݱ^¯ñ/^ Ó\ýëã]{4ò…vxƒ}â‰Ï3µW“vcçåë×J4.úL¢Ç–{¾_ÿUTo{™ç_«Yõ<Ë‘¥>_>³¾çÉ7–ìb5´E¢J>6™‡vÉß­sy´>äåž}|7š«N6¶z–OG©Ü >fG¹—j3iæøîåN¿wxŒnËêît‰$Mö©?¨Ñós9máÁÙL¼yûæŠZ8ÍØé}×Ú ¹s”-9|Ï÷W¿yÿfô»ç¯¿¹zôM]©r¿lvyŸ=ME*ôoð쟞é©^¬ÜB¾Uò.SGñ¨¬Êèû´©F‡,Ç…é4þê0$2Ùùã>=†ìÐ=ýltu§uŸ`õ¬%’›éþ—§9â0ÁB¬Îçya'¿Ú#_Y~˜•#æwÏ_½>^ëû‹;9Mô žš^½©ß”?ïTšiülùìB¾yU™ê”‹äQŸJ6;jµ{ï3¢¨ÒPźêûø!fúXvÍØI÷s¡ê³ŽL,N™sO[~\ÀUA85 Å»¦_æ×©œå ãé£Ã2IÒô¢‹ûn3ÜI8÷!ê >ÊHª—$Õ«ìéZTýÅÓã?³#bðÁ=?_<“}éJ4ò|ÑèÒéwýìã2¬’´ž÷"}ƒÚ{Üúd§uàô:õ3…eå0©­Û*—ÛÀ¼_õÑU})âG§Eåt¨:ÝÓ q˜_õðÁoäèÐCü(QÝCþdµ>Z»Ôé(¦>Rf=]ÚX%F§UBv‚F>ÿüAA‡/VÊS²Ü„ ¹ÄEz£wüîýqš´V¥²9 Äq•¬å$Û¹ ÃM+Ó‘1M] ²Û´T›3ü¤!gÊßê5ü}:“øàóøÿ&‡üËñôb:÷ú¯ñlñ“ÿïÇøÏßþýSL÷O1Ýÿmcº7£ŸÒá'ûýê¥Þ9ÿ¤O9÷Ä]%«Æªüþ»§ÒƒQR]=Å+NÅŠéŸBÌ“ÒöÓcƤá/²z¿°üXîæESžžJI[©ŠíýÑÈxˆ]“õi£ã~öXùúFê@X?æ³}‚Êjx¼Á§þ¸?­'ú³ðÇÎO|ó×|d ÆŸ–úS¿9°ò ÉSNïÄœËÑÈ¿øöíû—£»ßöïåÑ mÕ¥÷W#•!Hýò1្îåmß~xÞkLïZñò /ôAùHdï˜}:ú—#)ÿZ6r?œvÿåøÈû@wåͮΉ ž´‡'{ÊWÛàÁ¡ý,;<þÑÏ¿:¡?|óâÅÕ‡F4®œ½Ën#Yy¨iž;=ý€/FÿÜþ©ü쩱•=bÊÿÆ'íŸüŸCõ…ÇãS»Ðã¾/ª>øô³¤ûâ¦ýâ³'½þ0cÛ)-•4Ü ¬FØè_“ýâôv33¹OHÖ»íñ ÿ¥.¨súÏZö½Û/ s­4§‘SÏÿ?ÇøöÝÇë—o¿~.»Á—ˆ©7õìGþË_Ú~{ü¥oGá““§Ï@|w"–ÿ˜¯íC:ŠBŸxšóÇÁ_G£ñŸe#Ó´üµ|Q`Áúà:xp}F 2ù¬<ýLÈ _Î9?ÐÒnsò?,‹ ¶É]ÐÞ7o”Ý4s˜†Ãí†<´cúÃfþ¢ÇšS£è¸Lõv¯Òä꟨/Ýsÿ6:Ž´óG ¦˜ÞK~ÊEó/çÐy=SÇßa²ùÛ&y9xžµc”þÓ>DQÕ²RéÅåŽ9R5ÐÎ¥”ž’rô2éÑ—ýÚ»ÿ²df.‹ÃCë›™v×uW•½êéáÏäCéW¡^Ù=¶ç-°D êGÚÿõyÞ?Øz::Èi—˜‹ú0!Á¹»Û¿Ä¿Åâoú ø ý-—¯ÁhTŸynÔñ›‘1LÚáø¨S§úVœ\]Ç,/ýÅAuò§´}ù¥ÑgJµµiO¦ýòú_½ûø_NÛ'ƒßœ·?ç_©=Ôi0Ê$OZoš,¦ÞôáOÏaƒ‰Cn§N–ÛKmýfç_º=sªmš§q÷ø°³³6áô·Ò:´&«¶H+ŽÖsbõ>bÞ·üË9ÇÉ){$±;CÛÀÏ_hFoÍNÿ>sÊßy×Þo½»€ºoóaÓ~ú³s&•¿jRýçö<›ž¶£¾•œ¹•<á¾k«ž¢ÚýûM¿§î3£È ³þrT›Seÿa=´Þmþ8[¨}ÄgÿÏÿóYÿuίºŸ‚J¹|LíªÂwrHÖOÏ`.Q?ÐM=~ãÏþ9šNÚ?uÿÜʯz2¦fmD½Rù /H<jžÉU¸ýãÅŸí³IjsþÏáƒGåç=?üù£Ï`…†ô6æGe6rÛŒŒïÓŽÈ7Ñ“ìdkÙ[öÙy`}•û>7è+=ðÅ¡`ÄèQ7úOñÔ¶êÿìþòçѪŸþõ(ÿ2zöì™ìQýç¤÷rK=~òß'ÍOÿù¯Ôÿª«òlÝõ¥n~ÿÿd9¹XôúßÉl²œöúßÉd1þÉÿÿcüçì<»zþòêý5­x,îñÛsé`ƒydO·VòêÈ;J;¹û»Ä~/ÎußÝAèâàຶßüÀ‹ƒ¿>’üïtq`ÜbäÙž[ƒÞKïº8ñ¯ ú» ¸9øQ® dýêoü²#ÍŒŽ7߯ü){ÿo{R#6Êyøíè\MëÛC•íCVÉ¿Sk”èoüÏù[9þs˜ú‚º¼ç¿Ïÿ^­QvŽŸÍbÏ:]ïH%AUÂ\U"GýÕyÞê¥)>\½ÿxýÛÑØkMn¥Ê*hìêýû7oƒ¶Nw4c’=ÝB]_ýêÍo¾•³è5ÜN]_¿{ûâ…Êlý›«Êw©>ûtÀñ4AÕŠêÚà÷yýêëW?¿ÐñdçøFå¡È؇ç¯ýöýKÙrüŒwïߪ·å*^äÁ–xõ›7Ï_[ÞW—'2ÃÞ±‹¢Å?2£*›¡¾g19lâɘ×Ò®”Soò×÷•C!½ƒŸ¿~qúÙŸ}“¾ÞõÍ›W>¾ä¾£»Ã|r“ðòí·áþ%í©Ÿ{êÄϵ7ùë:ìñS&ì§ÑNº¸Îê¿òÓ>L>¾x÷êùiÿØÉüå8¡«Êó?úd.Çùµèª"‹¯еò$ ”ÃSyäC²ûëçß~ýêÅõG'xþæÃ«Ñ úBZ0'»»ª¡¬À«¥^â&6JBwºMî÷v0§¨eþ4<3f•~ü«42ç©EO,ÿè¥Zù%¿yÓg²ù¯_ªû¾‡ ¾Dçi¾Ú¯ß~¸:T'÷¿Y¹¼¦åÞcI.•Wo~4¢<#ýÚkIe’ì+zÍeUÜåÁ¯øê틯C_QŒTêµ1§F-ßä¯^½å¿>ÑÞ6ë«3´:XÏbŽàÂx¸qô4ò ; ¶+4Ê´òªoNÀLÉý~o~À,Ã{n]“ƾ.üþê…ÑúX53öÑ`ò(=îOÊP{ýñï”,û7ãÑ¡KLM¦&GwwÀÔ”ajÚg¸òÛ™1ìÌvHìZÐÛ ˜{õñw¦9Û[ëC8üo®ÏeÆ{Êâ QÊû-ö²æSž ú6æo•ýNÃØ» Û›ùì_|þìÎÏ ñå «äÌÏXü€ÏXü5ý3`–ÓO[UäÌ3E]½yÉìŸÊî›äß²û¥Š÷Ì6Ù!8C÷L»Ñÿõ<Ðz¤JŒÆš±üÍûA3–ß¿WûíüàËcz‡£wîôX™üVt]4Œäáäó¬Vw›òˆu<”€Øêlù°3ÿô™ÏÄUòùË—ï?üï31#¿?½{~­¶L®Þ÷§Ûï•¢@þRþgð{ù›—¿:üÎõûþ¯_½é¡ÁïÕnû¸ú­ïïå±KÃöõ®Ïøý¡æd×êQy!ÕN)úí´¦õ|ܵÿ|2üÅù,ù£$UG|yõk9G½{ýüÅÕ×Wo>~ø‘ÏGéõ9¡8%ÿõx–L“íŒ%ý§ç,Œ*Î2>é°¬úÓ«ŠW¾‘ç¿\÷èõ¹rÜõ×´ÆäýQZÕcêyV0\_Çu¾kÕÿîPŠ:SqRÇk^ûâ—¿TW!é1Ûæºªòþ¨|þræÄþ«·o__´;-Úc¦þC:ù.>¨Aׯå{–ÿe¯¯ÞŒ[Pÿò/#úƒÑ¿5Of*åÙeqFÙ©}^ê#Óœ:ÄäXÌúŸŸÕܶvj©÷ñÛ__Ë7µ˜ ¶é7 &DõÇýþÑü5§¡6R-üOôÿèou˜å yýüãÕËÿB?ÅI{.gƒ¬ÜTÖcš°ÕdÝûËÆK§]åuÛUØjŸîÏu×>Á~àßüêíû×Ïß¼:jÍuãÃÇ·ïŸÿæ*è©D9¾óë)/Õïž¿>~»ìÛ—3Ä»W¯¯Þ²JÿúÕ‹÷íŸ2Œ~÷arq1?ˆW¢‡+Ju ÛO/t2‚¡kþë/®wõþ8õÿ­Ÿ÷fOH´Éõ‹÷òÅ]½øæ½Üƒ¼•“Ì;¹±—Ý^½;„Þ¼}Ó»'MJ¿á·¹ÕËT>’§£¯³¸©Ôé¿¶ç«Å/ÿ§H^<ûý1/ÊéjùÄ©)·ÏÈ'úä‡_ª£Î.Ë“‘’S§Ý³Ãº<É›ûlò“·¹Ç»XeI.)i±Nu3 Y<»xn„˜bù¬‹ÃMö‰í[’õ*©H† é7¶‡¶<½«ê].÷ök¹,È5*;&òXgå!=„úCµs=|àñ‚›ÏH9s¡-ýSé› ,[Ñ_L»Ãi$ñúÃûáQj•»>Ô’]Ü_H†¾çoU†•>uE~Øí§‰ùrL¼èßeò½==¦›ÉS9+´£þÆ|/?ã[ue"¿÷ïß=½Ú >RåY§’Ûf’~tÔÈ?û.=$K8²êír»‚ôSGïê¥Ä‡&ÝôŹ{î:=¿Õ ¿õËõüôˆÏÆ’ñßBÅ¿²€Ê^qú:ðLâ›T¨~HãNûªƒ†Fþ÷›¸!¿~²û8›’¨ü0røQðÏGáÓþmØ+ûÍÙã£9Ûï{Èqz–UÚÚæx€íQ<"ß7uÖÝUx¼Kó\~è‹Ñü™¹ò¥É*mp`a¬ÇÆa`<}+wör>hTÆ £3`—T­´\Ñžö²‡-ðáßÔ{ÿ«^ûi*ø!ïzð7úù=7rn¨”E§½ÎSurú—þÉÉW#ý¿ë4<‡™ùÓ.ëú4@û>ÁDò´_8³¼Ôrü&J"­ŒôÓ ¼¯óïÏ8½—íÒš|ëþT¶_²'ü^vÐó¯¿W® òûÁ9ãôNŽo–¾%ùvóÉAËÜóÌäØáþáí^ö?\/ìÔïM¤ÓÅyë¢Rÿȹ¿ïgŸÿïT÷©C¬MMe§Ï{ûúeïx¢Ÿ¡NÖr¯rìûª_ËøMÅüˆí€÷êÝïý–øùÇWÇ2-ÿEG!5(Ý1bî䣮CÓ e÷Ÿ…Î$rëØUq•Ÿ>éÝý¤wÜO:G‚Ї@g>WósÎg?ù?ô³ `àóÈvºm\Õi–ð?•|Üõ‡þ¿^¼}wuýêå)G9üç[åòºò3ßÞÿëW¿ÿúê‹ÑsÕq†ZǧÏnH9ð¸Iû„êr+pS©5­Ow°£ô§Ç|çÇI'®’´±ç‹«s‘ Áêòâ ÏÿTkH·³WoÞª"Mò?ò—oß_+%¦<$~¼þõÛoÞ¼¤à‡÷/ô('•ßÚÁ7o¿¾úZƒŠ‘?ûæ7¿½–?ûþÈ~x÷B³rÓñüõ«—Òø{9ç~T3ûi)èÿWEày¤ãêiü‡ñß$ÿ{\íÊ®yx6þ1ëÿM§ £þóx1¹ø)þãGÉÿ®ò_¿³ÁÇ÷}6þlôÙsyËû° ù/ÇŒn»Níš²´¥©°}EeÀîCÑîœãïTd…ò½z·Ÿ·rì£ÓäëX˜ÂHý«ÑÉì£?þióêmŸùùO›÷~öì™Ê§TXò_å¿YÓC«ÔßÏ“¤Ÿ™|3Ç„¹‡íjWϾs´Y}„ª@km¹Ú6>!ͪӅͨl—eÚ$Ï’ÛÑË7F‡\ }ÒHuäÉ6ô3IBèÃ3~PûѾÔìÑ?ö§Í¯â?õoA~ï‘hÊø¦©Êj§¶©m•ïÏ JÏäðÌúL äÿ)Jä¿mŸe·Ï®)ŸÉz·Ýö!!»®ÞuÏôÜÈ?P må?ÊIóZx™µu.Ž9¡Õ‡»ûŒþå^‘¿JG…J8+[¶î£5Ÿ}øØLW94÷³÷WïTY¾7¿ýê›ß|øìÑû´÷ÈÖµ§K·c/”²¿Sa«_¨¼éºú‹Ï?«*v#îéç *Dù¹‚Ô‡}ŸÞáãNéþ>럼H²íãñ“§‡¨IùOç\Ãêåýêõð¥öùùèg¿ÿüôIrûô‡÷¯~óÛøzå?®… Ì‘}Qí>—ÝB´}d‘jÔ©À—CÄÍ1¸fý0"%VáÿOÅ¢9¦QVºJ%>î³`öaD_üí%{•¿OdÖß–õ(˜Ï“õÈ’Ìí‡d=ÒYC·¿>‡ÛùÁ>ú ÜÌ0¬GÜìmŽ «ç,{³ò‚ìZoªSfvò6úÛ€¶÷­¯Sõ$ ‘¤§~{(ù¸}rnÝqP=ƒbDY›§£ß‰2-~ÚWþ5õNÙRÿny@}û¿ñòb²_û¿ÉbùSþÏå?Fàî_•ôÇ üý)ièOICÿ±IC 9Ïó£/˦ù7M¶—ç…sVR#))uú|ýáåÛOÝs¿»~÷úùGUsúà1iÏ>° 'sЏëô.æÍIâ9q3g7Üô‘Üt”çï~¬Ä¼M»ÓOHf’·~wõþƒ<„¨;‚«ßÞ¶û«û/iŽÄþ'4CbÿƒCR˜þŸ%wÒÊáR^ü ²§u¦ñÎyË~þ›´;þÑÕýãcRŸ'ÿr4ùm8-éä~`k ]£=$š|â×ß¼ùŸoÞ~û†dî9$N||jÇ»ãã~•ùzTºAWùÂöÓߟáXÿêÔy¬¼ ýñ›Ö¿{ó1ðw/®¬÷âêüwƒ´zîçöê{ìí÷ClÔ-Ÿûµ__=ó|ôm*'öÿÙÁxWõÅR¥É9d›Ž.¢ñÅdJÕS*•úÃëo¯^¿¾î[s­¶§ ÂÞèût+gÙTV±•&gÑl5ž­†ß_ýæÕ‡Wï¯^jÃÇ‹†zßɬ٫;×s>*â,oûTJ_~ó ù›cj¢/iôöFÁGrÞ’ÿû¥Õ`ió壿|yr|¿O7_ŒŽ§â»»»g™(ųªÙ~.·ÒªZ¾ÚÏ•½èP§¡=ÌÃÇG–/¢¾´âÛ?ªäSÿIS~Yô£ÿü¬‹ëbwÿÙS¸*øO•Ëì/OGã§#|ö—§r—Iu?¨Ö’2í4~"'ÔfäÙœ²mN©Íæ»Ôø:„œS›AòlSnóªz"—Ôf<Û”ûŒX4 Â'rEmI¾Í6î¸hŸ>_¹«@w £º­âA©/í ÃË£g«Ÿª.q>ÿ1¼ª0z¶Z´µ»§Œ/©Õ0ª{ÿÒ”Ž¯] Œž­nº:JD'€=¾ j5Œþ«ºkIÖý&c£”¶ €ê´í‡…É*Œž[Fu º4‡© YèÝaT· °<„3 “[=[-Û»h“ºc&Œ’1³²¸¶wÙÉ ÇL«Êÿeí‡Ó±iÕê¹È7h§8ѳÕáœEQx®aT¯oÂט‹Â¨¶šûPx[aôlu+[p“Å­õÌàm…QÝ_…çaÍ`t‡Q°Úo¹òn«~T[ÍâaÎ(ô¬0ªGA]D}…M ŸÑŒ‚ J­º_ìlnX  ÐÖ¶tl4f ³­~”<×h¸ œQœ³‚èÙªØ%Ù`SpFal…Q=ˆX› 0¶Â¨±i¤îø¢øÖÒ ç°Î‡Ñ³Õ\(´ì¬Ãp#6Œž­Þ—m4˜âÎ(Œ­0ªgíþJÙñ°æ8kQhk|ãBgf[ýèÙjÖfÑ6w¡0¶Â(´Õ¹ÄÍf[ý(XUýÅŽ^šVý(±òŒ.ÆÆˆ  zÄÆ¢uNð èYaôlõî¦ÊÚ_þÒÑèYa”œv÷™0[pFgxÜ ¡Æì%Ö ~1Î.>Tï4?å¿ìJÏ(ô¬0z¶º®ª®vMo ˜µÃ(Z]èåÀªÕÏuãÙ@/pÖ¢zGTÕ7°mÿÌÚaT­´k¾k£±u.qlQÓêÄŽN,V=¨iujG§«Ô´:³£3‹UªW˜´rOKaôluŸv]ìÚ,¡¿†Q}>ÎÊ­»»@ £g«Ê‘éüZ—Ð_èž_ïîÜÛG´F©ÕhЧÕúž€>õßo•°¸Ï ¢zuQ‘GIº·lß.aÄ„Q½uσÅÕ(ˆ2Û:ç·Ï›¸ZWŽ Á%ž!‚èÙêmÚ¬Ó¦²9/a†Q½rî"õͺ­m‘½„qFõLT¶Ù½kC°‚¾Fám%ÕÞá›oË깸ö8V¸nQýbŠ»ý z¶Z­¿SÅO_ FA%} Nv®i{…~º J¼û÷Yê|±¸QÝÖ»lÓEÍ~cë„+Ø“…Qº+-Ó»Öñ°.]iÕý5í„*Ëm†+ô)Q²w¸qìØÀŽ/p‘;ŠŸ­fÇãÈ’óau­¨ìˆAVï7ë:ëÊÚõÝ`Ø0Xrîj¢2-„£ 3ªžµå VÛ³'@ÁƒÅ³t}áC(9`°`7«ïbiÚ °g»ß‰f[9×”0X½/I“h>ž¸¾Œ7K÷¿‘û¼‰Ò«=íiá¾B£ø€Áêñæ=‹ ü€Áêç°-|,®oa–ΓmÉ• ±Í%só2+ÄvÑßNØùЮ—…ó¹tÖ¼,±Ú?¯Ü0qáðsÍa¼1X½ǽÛ¡Yo –è(Û¨©v*XͲfÍq} ³ÐÏ"yh¨­k÷âÂìg–ø‚|}% ìvË?‰¢ «÷©EVË#Né`1^ Ì¢]±E‹fg»~•DÕ®ÉèaO³ó”ÈÏêç;œQ)‹ã-ÌR¤ï/ dˆÕ¾ÌvïÚ£@ƒÁêç–>¯ÚÂ,Ù¯geg y€>Ç0«}ƒ»¼Ëê<½·³xÝfuÿÍ?{ðüfuÿ}P ˆþj”j0XýäŒúÉÙ'Q¬Á`µ®¢ðõõ%Œ7«ýiÙˆÄùÝ`¼1Xý|“"vŸ!—0Þ,Yçï»¶KsêÒ8¿Y½Úú|b(1a°?Ä®–X4Y닯AÝk˜Õ‡‘}Ê ƒ“Á¢¤ØÍNšb?«/®ãuV&††D³08,±;P¶SoÄÃ,‘+U—F·™uc‚Ê«7‰þw ƒ“Á’ ÎÌÇ.ñ‚3È’E È ‹±daV¾m:_`p2X=ù‰Ø³Ð£ò„ÁR§X[§Meï;¨=a°ºÿ¶»¨,ZW¤Œ7«7oÃú« Mìy¨@a°D0´ˆÊ¼ˆäœbÙP¢…Á‚ݶ(¢&µ² Ón€ÕvsߨD ƒ¥v£¢rFN^vC,¹¤„MS7Ÿa–ô3Ï;ž …Áêù¬‹š®pÅØ¡p…ÁR»åÚåèš p…ÁR»îËü W,µ;ŒÑÖḭ̀b©Ý¹§ sÃnˆ¥v¿ÏZç3[vC,µ»ô´aiØ ±Ô½4ì†X½¾yãYQ`Â`Ïv¿Ÿ®žÍ/\Ï & ölw5žÅŸo,Œ7K.›‡çÂâx ³zªï}áÕxyfÉ¡¬¾kcÇ;ÏðPdõ±0«÷ªjgŸrNè͉fñ‚(ÌŸn çy}Ð –Ê7ió#ÈĈM ³zxï[/ÐWÌ`µ:ZçU|ëj ¬ž««½Pår×â6Þ™ëñÏÒ V¯Ye×ìÚÓlh׬0KöEâ\ç§x–f°zmi³:ºK×")tÍ¢ï*Ìê³i›µ» 0.,™£”@@DyµÕÇCÍbÄn˜%{‘gJ7²®ºÁØœâYšÁê½gÝfîìSx–f°$|>Æ—hÖˆŸ²Úg#JwÆ´)ž¥¬žo³û>ùLÛiyƒfQfµ]¹¨òÖ5`Šgi veïI‘[Æ&ž¥¬¶›ù2|áYšÁ’ ¶Öí'˜gé0«÷é½hœìÔȶdõsðí'§x†d°Ú®¸sMñ É`õ¸’”…ñÆ`õº):_`¼1X”™EíöÎ.>˜â’Á’tï]à1Ì’y½“‹K÷P§‘Ω(|e°6»k ;vØu±d=®Ò®{p¼ ´Ë`õ¼Þ‰mÔviÔ®-s j,´W#{fÃ.ƒÕû¨¤õ¬-(Ôe°¤½‹ñØ9†P¨Ë`Ij\9KE¢µGMQ¨Ë`‰P¬eW)I N¤Ù Å‚,yƒ‹²˜×)Ìê3ïM#7wèæÑ,Z†Yâi<{9S¨du{ã*›TÊ£Zm‡cÓê†Yâ»’'ÙÎHê¡Yê†Yr×Üu‘šE¡n˜¥‚ÏúºÛÉ—m¯>K´TMÕˆ(.¶Å»Û0Kæ³[Ï}6 VïדÂãgŠ>«× y<ßÊsƒ* bé;0Þ¬¾c]g·Û¤v½co V÷‡:ž(—Äi³Ë†Yâ'H„š¬'Ö¹…º –Ì“©hbãN³hfõš*ÆW7Ulga¼1X}'‘ª3¤#§Û…º Ö´;q°3‹]«ýg¢msWé) u,I1é;‹ P—ÁêóEyõñígÐGfÉ—EmR˜%j«Uì\³P¨Ë`Á®ûL†~O«ûCÅUž§qW5Ã9 ýž –Ú•‹¡œü’¨¬’c'Òìİb©]‘‹¦ˆèâ¢Ù©a7Ä’;”ÒÔ6E¿'ƒÕïm]D¢vÍÕ¨½e°Ä/'|ùÅQ›fé:ï9“ÚÛ0K5Þ*ò7ÊK°òµ· Vϓ޳?jo¬n¯O¯]ñ ï ¬~Y¾OUI³Ó’DÍ¢Æ%Ìêy½´`hƃÕ瀇:m¢­£^ Þ2XrÈÒ|ìCx_È`I?«;÷€÷… Û;qµï ,Ú:ÙÉÀ®Ÿ%÷èqô]%×ïNhÑœf1v2ÌìÊßٙͮ‡Õã8I”:2Ï0ƒ¥‰öš®Mìwj3LÇ`µÝ}“W±ó] Ö2ÌÒØÔë¸Ø¹¾Û¥›bÁ®p³+Ón€Õû¾®¨Ý{DLÇ`ÁnìfǦݫû™h={#LÇ`IbKßš…÷ó –øÁ×Yž 94‹Z÷0‹vUþ[Á&‚c°$vR]H¸ÆæÔˆ ²´Œj;÷\˜ŽÁÿäf{ç\¦†2È’ûMï;Æâ§a–$ÊñÄÏfF¢œ K÷©û¢UY‹íp ÀDp V¿·}|­’„'öÚl¨Ë ³ Ouú^gSÁ`ˆ]RƒÓ–Û_Ã3ÌdIÍ‚¸©TD­c¤Y£ÄDÕ/9)¢&Y;œ€fÁn²)\ìÒ´`ÁnÛº&Ï0XâÔYè œfqófõ¡×’+‚” „ÁÉ`IVjÙˆ¢Ž¬•¡g(ra°`7®ÊMf=p¢…ÁêAߤ¢ËöX@R³øfÉ"Pvª¶8<9Í¢é ;ho-÷å° s[{=,=ÉVD†óS³XÔ¥gw‰‡¥"Œ›4¯]}giˆ0B¬u§ŸºØ¾F1 ƒÕv‹º‰š¸°Oì(Fa°ú9Ü6Õ üLÓÄÅ0ÌRq’hwÍr^ivlˆ“B¬Ín›ÆfßA1 ƒÕÏ7¯S÷¢…b«ÛµhÛ;g±Ro Voî›ÄãB1J¶-êý4Ï:[@ÎlaTÙfÈ£=M¡Y£|LÕãø¡Oü%êÄÚ¼<³ÚéxSu;3ƒ“fÑ™fµsÐWhfˆQÂ,™wîUÎûëØ\⯠K#e’Þ;Ë×¢84ÌêKËïnû ƒÒÞo –8ÅÖM–Due»xš¡…ÁFÔåÑ]¸2C1Ê‘xXm7®åvàF3È,¥Y, fön’±ý™-†íõ²$pYºç(£0Xm·nÝ–g(Fa°Ä©°îæ4‹—ua–ÚæIИ/ »!–Ì;Ã!OX ~³$àTe_ÏkŠQ,•Õî—ŠQ,¹<èÒm#ä~Ùø5»4.‚,©ès—6ë]ÓÚ2¨ÎPŒÂ`õ:¿ÏDéìë†%Ìêq!6ž £0X¨já,A9»Tµ°D$ÐvjqéªX—AÔ¬‘e?ÈÒswUDõÆ^HÅ( –TÄ.-„cIÜ K.YãMä¼A1 ƒE»Î £0X2.öQ#3£0XÇÎÌÂ3£0X$VDM%YkÛ#¢…Á’s@Ù}ï›F"¸0K.Eá›(Fa°XÀUr6£XbWÜ®€éù…!¶ ²¤*K±q~·9ŠQ,*á`~˜OŒ3ÙÜHfiÿm²²µWœ£…Á’ª7H\es£0XÈn¼®î£¼°¬Ys£0X}Iu“Î 9s£0XâßñŽæ(Fa°:ÆÞR8Y³0Þ,­`ؤnveT0 ±:ÈÑwÖ›£…Á’`϶ÝV®±‰b«Å‹÷©{>G1ŠºôÓ.áe›MÀ.©øe.ÆÀÂØ¼»©|Ï + Þ¤æ,IY¼;xhi•ÅÌî.¿ò…+ V'È’´êR{ÐÕ…+ –TÑÍo=ï…ba–T³ÀšÅÄa–\Lg…{¼Iã¬îëß¼ƒÂUUÃYÜ~ŽÂ•&«Ë­³ (\a°ôLæk¯èdAÈŸ¬Uzæ(\a°D@émƒ!Ì ²Tè8TqjvnC, ø/êÊÍ¢o%Ì’½Ñ½ï»áY/Ìê5v×vÙ½³Ob {˜¥É££A´½fWFòèKî’Œ3°FÃ0Kï¨6i“–ÖRs£‚a˜¥Âxw ñ9 W, î]ûõ¹!\ ³g»wY™4©£8ù…+ V÷‡¬rߣÏQ¸Â`‰g’½õ],l‰g<¬~¾>1ëܨ`fµO!© g²©9 W,¹L›n×Fyb N£p…ÁB¥b÷wCá ƒÅ È±KÓìxPÙÏRÁQ‘6±ÝŸ:Ÿ™{Ï«ïÔlJÍÂxc°Ú®mC©Y¼« ³ƒ;ayÖ÷ÍQ‹Â`µä&®÷‹(Î3’*A³xWfM»ö{ÿ¹¡E ³ú9lêJRx™¯Y¼³¤êùÆ××q} ³d^¿‹ó@rfQ‹Â`õ¸xX§*ÜZE|ŽZKhûö¦‰ÊΖ vn$\ ³Ä‡ç žœ£…ÁB¢';3=X*Hô칌Ä(aÖ(N³iïx1,Nãe!‰ëQ ˜Õ¦NaŽZ«÷©IÙÞº 4ÌÄ(a–ì«Ó¤Nv…ûê Krª2£ÛÀ¢…ÁÒ»ñJXón<Äêq|cY4‹ë[˜%Bh€r¾0„ÐAV¨7î`ð9jQ¬Þ§ÞT¢È\k!jQ,9g5iÚŽÍbàA˜Õ¾+Q>ˆ2j Ù¿f1Q˜ÕýLË›]×åÖ³jQ,µÛTEêê;+Ãnˆ¥Ó©3Éݵ( –kwüì¢Ö²*…‡E­e˜5ûÃÞ=G- ƒÕ¾ânX”°0Þ¬ö#¦Å`+†YRÜ#vkÌQ‹Â`u{Ká™KP‹Â`I{_.±½A– ù×î{Ô¢0Xr'!_òM*šn 3¸dŽZ«ûoâ󵡅Á­šòÅ»&#ÿ4‹ã-Ì팊…i£½uNE- ƒÕç·ôÁ­ š£…ÁÂÝÌ]Õ$Q|³µ|·…y7`iÑ…"kÛ¬*­ßÍ,ºbI"ïÜ÷ŽÑfµý!ÖªÐ,&„³D׺ƒ˜æ¨a°˜€]äödsÔŒ0Xýv‰J‡õ4 ã‚Áb{åN#Jëb >_ r¬~¾¶ì»šEMd˜¥ ã² Â΄ñ!–º{æê•pdI"ä¸EŠÅ 4»ÄDÈA–ƨ\âÊeSl§öÒˆ%±¤¸¨o®F̓¥ë¼{î[š‘0K¨;Vâbñ . ÍH˜Õ"W=}¦µ…ñÆ`‰ßèÞÝ׆f$Ìêñfä©4Xoa–ìEm|3ÊÅÌ‚,‰%(Ü}gš«Ï±ŸZ‹~û0K4Z›.ÚmìsõâÂÐhYÝÞº¨iƒEMd˜E»y…Kí™E̓E»Û]fÿn¨a°z*$›Y\5‹ ñÂ,Ú­¾ ê@,Ѻ{|ñ Cfa^ÏÊ´³&‡]ÅÃ,Øí#ë;^˜v,ØM°”5cÚB,9eQ'ÂñŽ1†4ÌÒû¡Z|ŠÒ}aýn+ã~(ÄÚ×c3¾p1¹p®Çv–ñŠë(sõIÔ0Xòò\¬å6Ñ–¬r11îÉ‚¬ö+WëèΔ„kcÚÚMÔ±];¾@HÜ'aƒÒ)”EMd˜¥çîë$/\Ïlnœ»C,- #Ük÷ÄH@d Í^Ôeû*ÏÌ»¯ê@,)bûɳ×@ƒ=Û*¹½(°X¦fa¼1Xí·OKï¢ibí;¸Ÿ ³zµNïÝïu V¯oišF…£Àéu VŸ³ä §ŠŒR¯šÅó[˜¥óC;ôš5 9Y½?«’½ç™aBó0KtÅ¥g Í ]q%1ОB¯ Ô0X¢ðð^ „Á½F¹©rç»À"«a–æf‰ÔÁ)¢Ûû3»0 ]YRøÁ7æQ¯Á`õüë+âµ@½ƒÕvwMZV™½¸Çõ Öv~æ¥Z…läù­¿KÉ1YrïTF‰+öaz «ûCò©õ<3ÌÕfõ:TU×.ƒ%¹NÚ8¯\{ZÔ0X¢PjVç3Ãýd˜%v›T N­¾ Cfõý¼ˆ“¶ˆÚ;›p:kÚÅ:š[ìúXm·®ÛèÓÎácBƒ%±žE›Ë·f1çV˜%÷8žb Ô0XÝcß…:‹ÏwŸ¹žÙbð|ý,µë™« H˜Õçãí&ÄiuüaV7ï]ê@ìàü&„°Ìë—Ö󛇵Ø-lìØn×Éêû·ïŒƒ:K x¯EdD˜hvjð±»$¡fgv»N–¬oqt,:Vòì-0' ƒÕûytºËTêdëwƒñÆ`¡ öah,ïxiİä ò"’ÝÇzvB} ƒ%q>¾¹ÏÈIfÉ:ä›ûVÆúd‰'½o"Jšƒ>5‹:Ç0‹ ãïÄ>2-z×ìd0ÞÏÒ¸º2-ɹ+c¼Y²_â|çÚk ¾„ÁÎÇ”T³sÛùØÃêþ»koÜ>RÔ—0XG•%Û´t¬-¨/a°ú·§ObBó0Kö%qÚ¶*"±jn‡}ÇЗY½ùÖî%êK¬ös^ƃ%ñ±YëÔJ,Q_Â`õsÈãÖÙw–¨a°ú½)°+öw‰:K k¸} Ë ³°FˆÕ÷-U“‹2‰’ö»¡z‰:;ØïÜ$xbXÂGËÿ#-“l3úü£o>\]¿zþæùõ·W¯__ÿÏ7o¿}sýîíûF¿øüÑÿÈ6IºÑÌû«ß¼úðñêýÕË£úm.שïDlõCÉ…ÌIOðÜ Kx=! “<y–DÅîÞÑ ,ÎÀ€Iµ¯Ä÷r§F¹¯0L-û^®ŒÈ€©å©6ꩇazŽT›jL'@`ó „ÉN¼¯7‹G ®±0¬ç÷ûûÆYCPÂ(²cÀÄÛߺ«‡Hxîþ0Lj³¶¾Î‰X?ÎÝ+a”’3`=×¹·80íu¢q­bã‹™éÆ Â´æÓ&Î寍°Î€Ifâ¦Úº_7^+s`¢}ÉÊØH»LaL.È€‰ú{§<­Ýƒ½óaŠ XïåëÌ×ù1P‘kïæ·éŠáÉJÂè¢fÀ¤×UÃÙœÀ˜l†ƒå‰¾4-‡`}Q5MÛ®¥ubÄËv¬×îBø,^·s`’«¸“Ç–ho­.atž1`R©¾ó6ÓW3`#os$Z{ç7ðÝ;I…ã†HÂ09°ž‘J•!«HÓ/r`}2ÛTÞG‡G3LòõЦkªÒÕ £0JÖc0+¼ÍÀ1È€©å&Ý: p`r²ÎSõ%_ÝטøÈªöÖ=É ›“̲ˆÍ8ychÖm~¨bÉË™€¨›ŒEðÙòwm—æž/cÓ|vqUä±½4%0Ya«hS¶®©C90©ƒØvùõºªºÖ6墈[,ÇVøÒnÙ }϶Lï#ù7ÙöÆÌu+aCà†µ÷¥hvu":P¬h%XÏüí§hÒh_eµe«†" LÎÝM"Ü[bC&Á€Éj¥bwNƽ(Öû:Ñm]u_o ÛÆ¥˜ä’ðMìêü(–àÀä4±ŽÚ.‹bû€E¹&>à­JêlŽALªWˉ±ì‹1ß?X^ ^1`+&±½ÀúFG%&Þžø¶uO¹FÚk¬WØý®Ìî²Ô1åEØ09ÑwQÚ&}ÆZKÅGL÷uÕ¦‹ò‚’&ðÔØ×a‹å‰žÙ-»aª·«Öߥ±µVŒ„MÁ]Ös]·q#Šuž6Q¾Eõ‚„ÑÇÈ€í–O"/–°ÝòÉUFàK§e¬w›H”å®tL2Æå¦–7Eë\&Œë9L-·…{Àâ&Ywš:ñÀL»†I}תÚ$î/ˆ ;°^­ä†Ç× ,iÄ€É9%&T'ðÏ)aX÷ç²$æ¦0ŽALóŒc=IžQ îÃ0É”“õ^eÑ‘„øÆðL- )¼2,a’eÎY<²DLòšO"•Ÿ„¦Þ¢0®ƒ X¯)IµNyôôD`\°ÕòÄO]–]°Vz4>gõÃ.90Ñ8È3©s{9ÆÀKL”nòd 4*cÀùÙ¥X Øny2„—NËX5ž"aP”0ŽAL÷")z‘eX„Ù¹õºMSUOtŸÚ<6"ˆå39¤†$°B†‰æÍw:F!Ömîê(‘߯­…F Ö3RVfQû)·/c ÄäÀzt7É®º¦´nÇŠÉ ËqÙåvx1´ì‡ ˶ƒÀË¡e?LòTÆMêÜBŒ16Ö'z:)ŠÔõR`µâÀ`y²§aL¢ÍÉ [û–6£œ:&§c‘åBžxiZsãjÅ€IDÓˆçKÁTÚXçΨ÷EaxY(ŒÉ30Z6KŠx>°€Ñ²K(áÅÀrÖ^â»d©„h¥½090ƒõMÕvqר6®ã‰1ðÍrk{)+‡e'L<­¯óÖ0X¦‰RLxlZÁú î •,²ÖÇ“0ŒA¬ýu›Ò·h¢š…­m~ï{tè9aÀ$²Ìö™£j—„ç(Ãz Þ¬£­èÒ;a;zŒQÍÂõ­t“¾/c“¸·¾@š\“$ ¾ÄÄaX[ÞÞש@°î»®*+ç6Õ,˜(ª¢uºYƨfáÀúi$]Uå­³¨ZdÀijýàëü3CÞ†Iž„6n²ºsl!Œ XŸWQïRç„1ÈIßH².ê#37–ªY80Õ^fê€׉^ÚË Lrm²OQ“Öö-1ªY8°Þ1î»aÑUã^”k˹øÞ™;Bž. kÖ»Êìû´lwv±ÇÕ,XŸa³²®jùJŠT[ÃäÀºoȽé$q›Z_ ªY80ÑÉÈÇÜOíhª|£÷’kïåÆ'1£š…õl{ÜGUцªY8°Å²ýÑ-í–ݰÞɬ‡­ 0TbÀz¿Ñˆ8O)‰0ŒALsÐí=“9ªY80ÉV/òî&ª«<fF”0¦ûfÀ¦e¬ÒFà‰Å²Ö{þ$ñm¶QÍÂu޶À [†1ÈÁ²YŽÂsÓrËÙœµ#¡š…Ó²ºÍ…õ¥,‡)Óüð²Ü*'üAê߈ν¨ ö…ÓÝv}—5.× j_8°ÞtqäÌR5£ö…ƒeQ×X_‡ÀcÓrÖ3c)|Cµ/X[Žâ¬L Ñ‚"ÆÓ#Ö;W}TžG qçÊ€IÞû¶Í\¹k$Œ ¾0Ñr%Ù¶Šœ/WM¬Û|«ö0i¹MÛ¸Bí Ösî6‹Ú®j û6µ/Xï/'^gj_80¹ó3Õü_w~aj¹©r“v9øµ/¢ìóÔÈ$ðÄ ³ïa'lÀú&#Wa}»*o2°Ýòpc‡ÚLNb]|£Ô¹Ž§a¹úo<´Ÿr32±\Öo0Ï„[D563`âù—s™uX¡ö…““XÚy&sÔ¾p`Ze´›ÅûHìmNsÔ¾p`­.­7­§¨}áÀ¤×e‰*3W¶•írbeh@ð^­²}*â¦jí›~Ô¾p`’–ûºt-@¨}áÀ$ÿÉ&r‡ëŒQûÂi¬Z!¶YìØP¡ö…So“íÚ¨¡õ† lxpÂ0±ü]uVp< aÔŸ1`½vY’yŒAL+òº³HŽ'fIÞ ¬ßàNžaå£k©AM`LÁ€éŒãÌ‘ÑXÂæ ¤^u›gqd¯é,a<=2`°\mÝðÌ´‚é® j ÇvØHZ†‰nµ»©ÊL4B`ô¢2`R/©­Ø¦®—‚É"0©ô*¶» â š…Û-·ñ¨fáÀzÞÈbyî7–é Õ,ØPj:ÍK‹Ô“‘¢\8®4sT³p`:‹&»¸#e+6³HaZ÷:ú´¹w~Á™Qø:Ó\–ÙF8]p¨fáÀô&}—u:Û„Í›ô LrjÈ“c¡”5ÖIÕ,˜ÔدwIòàú‚˜Uëœtw"¿5·Û†1Èi\Áw £š…›wš¹]>Y-wš^˜ì¾’Ò³h¢š…“JT]tÛ¬•Ž7‡›#“ &T‹¤ÉœÇ%T³p`=#ÝøR{LPÍÂõshÁƽ(&zw M`<2`}Ã[ÇÞ/cS­Zgî/¸2´jAX[žN¦}¯ÈóÖ¬g3ž¢š…Uú4R‰¹ú»¹ñ6J„‡a»åÉž8-;`Ý76]ë¬Ü)aô‹2`’;»*TЭuXMQÍÂÉPTd·®0¿)ªY80‰¡RE½Ê>\5˜d¦¨fáÀÄãT·dÂXž”ë³UÒºk²I}2 X¯ƒØFÎhŠj¬Ç஽}p '¦¨fáÀ¤zo1¬!L`£|o&7¼Y”–Fˆ7'xÆõH)âëZ¨[®dmƒ1³'Ö½.ñÔj’0úd0‰DõB˜¢š…“ý:S)cëµÎÔP³0`}7Ñt­Ü?Äö«Õ)ªY8°V 5ë¹:¤«LF6Æ &¹,ï£,nn–©¡faÀ`YܯQŒ­aT³p`rÒô‰=¦¨fáÀzÏ_a8ÆûAL²ëÆž«ÕéÄÈ®†é‰¾QÛ“gM'ÆÝDÖ–ûDÊ]³+È>Ñ/Ê€É9¥h3çÉÕ,Xk!ò®IïÝ0ŒA¬ç ys'Ÿ¢š…ÓÓq²ŽÒ{•XÍ2墚…“5¥IÓNΛ4¶¼T³p`rûߥM+\ߨxÄ€õèŽ35÷u´¶N˜#†“=RÛÞ5ªRFžÅƒë³)êd8°îÏMÖ¥æÖ•À˜ášë1˜m³NäQYu¢±4Ç ¦õs‡‘¨6² †a›Ò))Ûa3–¥“ÖϹˆ#¥Jo÷¶ÄñSÔÉp`½Â~×µY—:§¨“áÀÄä D°¾ÅÛ­SwpÖu2XÏuíº©nSGŽ©‘#†“Ðøbìi†Qm% “‹þG‡~QLô¢ßyá9êEÃ0‰Å“«±(DW£°Þo¬Ë¨(\ò†)êd8°aùÞ _-ûaRu¬ªn=¯Û¨:†IΣ¬[§e|cßö N†kËŸvý&jIï°ö}UÝ®-1…1º“1˜géÆ9™›ÂðÙòï?¼zÉÊ]ÕÜZ6'¨“áÀt¿q¸ ¥Œ <7öAXû¾äËÈE!š.³¥Q'Éi»®Dã(¼4E &Q«e™Çyæ‚1Ê“,ÆC…Ða˜Ü–f £N†ë‘’•žTbSÔÉp`}ß-›±‘ýßžÔiŠ:¬w‰Jtòi—ZC¶§¨“áÀ`y å"ðÌ´‚IVnQwQ[ ÇÄ(?LO@½7| 6ïƒ0©ƒèu ¡N†“x+y\*cÑÚ]¨“áÀ:bní<[5ÔÉp`}:n£­gÀ¢N†ëy£OOá\&P'éå6mÜðİ„õ,zÓT…Ø6‚^s¥1`Ýç—2êd8°Þ}=t…±¢3c]»Â ¦†N†“Û¥ø&Ïœ× K#OS&^bṞ.|…a˜dakRåbqLŒ†N†ë5%ÍÓ6k£<‹uÊ £N†“Lµuž" ðØ,'‚õ¼‘tוSî>E ÖsÝÝ',wŠ:¬ï­ZóÛ!Œ'0Ép•Þ_§FEMã:ȀɌ”Æ·í®plÕŒŠG ˜ä+HÚÌLâE`#ãD&•xT='µÙNÖCáÄu2˜œèóz%Îf`´;6,·Ž„ SÔÉp`Ó²£@ìu2ذ\»¾àj2´ì‡ ËeîjÆthÙ,Çxf³ìƒ ËwX0ŠÀó¡e?¬gþ}ŠÒ"¤[™: «®i/ÍŒÀ!˜DE%©Æ „ ˜Î·éƒ19xeÌAش܉už¯fË^X¯)Užä©Ø@CŒ'0QuÊãR•öë³êd80X.=ðÔ´‚õHÙfžä3ÔÉp`Ø16Îâ”3ÔÉp`zÌźŦØ<a²¯kÅàσ ˜T²¬o2'0ž0LL}ÍX‘‰AX[Î>y¼3C'Àõ\·²ƽ(&žÀ²"Á&×AlZ–S£­°Ç u2FJñI…ý¦–Оêd80íÏfap€çFÂT ‘æy”ïÏ&¶f, -D¦^µõî¶ÛEm³†óÏP'í–'øÒeÙ[-O-ðÊeÙ[-φ0êd8°^E™ˆ|ãšQ'áîE’¶·ö«¨™QK‰“›Çv-Z—œr†:¬çºU´ÚÙùZJ Xg#ɪÒ3å¢N†“êA™G273²¾0`í¡Ê+‘x¾ ÞÑ3`2‹nTfÝ.£/œÀF%ø0LsYø ‰™Ë"ë1X';Ï£C Öwm[ŸD†:Lê^ìÒuÚ4´7ãè°î­*å9BÕf¨“áÀ¦åÂÏ,–½0¬°q;›1Ø‹†`ƒî²Ä³é` †`ÝëÄz— ç°2òÉ0`=‹f±œeŒ‹£_”–ï'sûÆÕ¨¥Ä€Í6çŽC êd80=if­™ö•ÀF=³0lXž8áÉв&Q~­ï fÔRbÀz Š&…óè:Lcï³B¸¶¨“áÀ´r‰÷ .ŒÊ%A˜øÌ›Ì³£N†ë6[j&Pý¢ ˜è @ü9€W¨+Ãú4q·ñ-š¨“áÀ°+(„+¥ól>6w!Xïr»tÛÆÎ.Š:¬-§e–:Ýà3ÔÉp`TÏÞ$9\ x6PÏ`²Î}u2˜Ü¤ ïëF¿(ÖÞK‘gê(í˜ P'ÃõŽQÎ^ëOî×1¼ ˜ÎuíhÒ±^s]XžØaÔÉp`ºGº¾kryjºÎ‡—‰3ÔÉp`­Ë­š™0 ¹³äýÆÕŒ©™;+ƒb“•‰]813òÉ0`r¶Ê3•ˆÔátB ÖÏ9ßËÓãfëú‚xGÏ€át\ W)¥™‘O†›–±/øÒbÙ ÿsÚ¤Û¬í¬a¹3S'†iDsÚlªfg_è|2 XÏYãs”:L4®]zkîNMt¾pþ9ªY80)E§÷Î/ˆ™—0‰;Û¢*×KÁÕŠ“ŒmëX$.7ËÕ,Xï¾ö¾IfŽj¬ëiʳ£;uŽjL3¶y¶—ó±Y >“þü]Öµ»(éláÏsT³p`›år˜ôuŽj¬ç ¹…?ä;"UÞŒ·x ˜Äð ß°B5 ¦–c¼4,abyïmª:0µìmÆÊ°„‰6¾ˆ¾Ïê¨Últòl Y_°Þ×Å»µÛÁ>G5 Ö3’Ü«5IåØöÌQÍÂ!ò%3žš‘/!˜ìÌ·MÚª”ÀvظAÃô®Í“„mŽj ží:m*®º,s`’‡JÔ†`¬7Á€µ)ϼ_ïè09w‹]wS5®.ŠÊj¬û³ü~ê¬K³×Õ,,çÊc-=7Ô, ˜xNšJ*§qgm†á9 ÃDßt;‘Gu.ât`dŽjLÚ7U±kS«ƒ}n¨Y0ÉU7¦#Œ°iÙª6G5 &Y@ÛØs¨™Y@ðÞ}%>yÃÕ,îasÕGåN"/†¯{eÞÆ`=RŸ nŽjL-O<Ë1ªY80©Ô™%Û´Œ ZÀx“΀ußÈŠµˆœG<£:ÖýY.±y3G`ƒ˜Vê²]õ÷«Ãí¥‘õ…ë6¯×"Žw ͸Oaƒ ˜x\kUTÐ5¬PÍÂu›ï}²Õ9ªY80z!nªÖîøY_ÜV;8k°ž7Š(+Ä6µ;Øç¨fáÀ$"#.º:ƒ˜X–K›³´îu2˜¨ ;o3ðn‚kË*°ó¢yad}aÀd¤<´[Œ{QL´ñ»FÎ1wö× ÔÉp`ÝæaÑ €1ˆSUçZþA$× ‹Œd:<°|›>4imn‰ã©Í²XŽ›ÔrE²@ XV—Â6xn³ìƒ–UIR¼°YöÁÚrVH,[ª'0ŒA¬ÇàíC—æX;ˆÂ8°ö¸¶‘ŠgQW~b˜H|:L¼—}—»¬$á¹F &y¨6]":QßTåð*j:¬w2¥Jqír -P'Ãɉ>O«Ö% \ N†“Ì¥uÔ6Æ@x†™Kð~Î{ù¾ ì¡Æu“±*¾½Ž¸ #ë &õ»'—ƒjßF5 &qe'òÛ¨¬šÂc¥N<°¼k¶–ÂR ÔÉp`Ó«–v—¶äº‹é…Å«æ…éÝqÖwá±qw„‰Ÿ¿(Ñ9Ž £:F˵s{iVG Ãä ¹B¬SW3føÃ0©ë±>FÀmà u2˜ì¾èqaVG ÃÄrî…—h9 Ë…ÆÌK X{!R¹oÍʬ˄ŽJ"0jÕ0ZnÒ¶®H`§†Q'ÃÉ©Í(iÀFƉ0LžsÖFÂåÀY N†›–×ö¸ #ë †(’ôƹÏ ŸÌö¦Ë³Ò±¦ ô…“fD…<¨¸VØ™‘L) kNë«è´@é ¦’ñ®i0>˜Àf±• ¬‹Ž¥M‘uî—‚EǰÞlß&¾³J_80Êu®U z$ðx × Àz³]¾—‚ÒLÊlÕ7rßXo—(}áÀı µE’[Ò¦k‡_‡&e=ã¨X‹¤ …†(Œ‰=°Írt3ì¢F"< )Š:‰-ðÒ⃩KYn½vIcŸdPúµå­/óÒ¥/˜K³:*âh›Ý6é§ÁëFé ¦‡tµ_ŒDv s¢.Pú­–'xâ²ì‚­–§xê²ì‚­–gxæ²ì‚­–çxî²ì‚­–xá²ì‚­–—xé²ì‚­–/-ð¥Ë² ¶Z^Yà•˲ ¶”‹Á°Bé ¶[a÷tÀvË“!ìƒ.xZJM4–©`9µ¥–òÁVË–©¥/˜–˜÷mNPúÂésV¦IÆbiŽAO|0ÒW»ú.sHš(}áÀô9{4Û ”¾p`½+M\5µCͲ0¹0` “‘/j×–;ÍÅåÅ L&““(ugåZ ô…ÓÔ%JÃ.TðËÐÛƒÒŒR£(=§©@¦oy6NåñÃvû¿@é Ömž”MZ¸ª‹.PúÂIâ‹¢*Ý*£àÖmn¿ëê(îšÜÚEQú ËÊkn‡/‡–ý°Þ?gMº©î]ÓS0`Ýæm´+×íÿ¥/X»àŠZ6$’ÿ³+Äp2Gé Öý¹í‰)Œé)°ö4YÓ9ë ,Pú©åâ®pÃ3Ãr¦–s<7,ajySxà…a9SË­»jüÂHÀ‰·g_Gª fMR5ø½=aØfybƒWËNX¯ƒu5b㈛X¢ô…ëÕjâËÄ»Dé &–}é–Ã0ñB´·-gÀôB„a-<^ËW²u9$—(ªáÀ:å~ÜFƒZ÷†Ñ͉ô%+·íMÕ9šaˆj°¾ZM» ½f3aÝX_r%EÁgÆÄ ˜.QÞÓÄ _bá’0L®Ê®qfÑ_^a˜¤<ªSŒ¢¬÷üu§<¨i#'šáýE5˜‚WÉaw”-QTÃ!©à¡ ê:ÖÜ/QTÃõHI}¹³–(ªáÀzÞ¨vÉ@òK`ƒX{¶‹vë™QTÃõŽñ»è&1Ä,F+ÖOc:™*gµJù5\Ú–(ªáÀËm':¼²YöÁ`YE&Æ‚HË4Œ¢L÷²8vV¬^NŒaX·ùÖ—¯`‰¢Lç ßrŒ¢LR ¯{ÁP!H*WcÀ/Ö³h’–rßã¨ë±DQ &Ai“‰­#*j91‚,Â0HÞ»_Êr €izd‰ï™–(ªáÀ$1Q÷Pæîfà:È€Iz·Û´ûÞ Ég0 GŠãÚ p¤ l.qÓaá?Lî­²Ú}¨YN@§0Lf¤B%ë¼·Gd,§FÐ}&O#Û÷ ¢³ÂFš¦0LnK›4í"õ?bx9¾4J)1`-óË»¬ÎM Šj80Ù‹é6-^âåÔØ‹†at/☵!lÝaí“)U´´³#¥”0™7Ú¸Šä"*¶Å@‰º4J)1`¬ãE¥ÂlªÎ%Šj80is™nÍ´6’°…aôån\±KÕp`²3WÔH%|ÔYیެwŒr _gId¯E²DXž8à¥Í²6„šQ w5¾ 5ý0¤*##x‰À+3}P&ÞËÜ·¡BÖ–ï²MçÞÆ L„š›Æs\B¾Á‰õ¥ N†Ciƒ~‰ÈÊ­e:LVØz#Zù@`¼›`ÀÚryÓÔ΋Œ%êd8°Þ1n:%#mgt¸cdÀº×Õmë{ݨ“aÀz¼»‹r•“q{g{t¨“áÀú9oºèÂýèP'ÃÁòØOLË!,O<ðÔ´‚ÁòÔÏLË!,Ï<ðÜ´‚ÁòÜ/LË!,/<ðÒ´‚ÁòÒ_š–C°ö?q¿‰us‚:<°ÜîmùŸ—¨“áÀ¤¸›Ün›EŒŒ¡ ˜–Š–»b˜ž¥¢ƒ°ÖårãZvMe½^¢N†ëÓD^­E%µÉu2Xï¾Ò"sçßX¢š…ëó`u—6Ûh’LgW#0&‘`ÀôÜdÛ•b´9ïQlªY‚°¶|#šB¨è6ûKÁò| Xß[Õ·é}!£š…ë½h)»hcdY 0°3`íc¬£›8så¡Z¢š…ÅB™»ól/QsÂÁ«æqu^ÒŽ…`(ôåÕvk­€³DÍ 6,ËÃAIf0/‡–ý°îÏí ¾À8R0Ie™çî,KÔœp`Z¤Éw¨14' XÏübì»Â64' Rñ$枊À3O&º‚8jªµëÒÖМ0`B%¢uìV¨9áÀd®Ë"w•“%jN8°Þ¨ÊY]G4fÀ˜~“kO`!¼¯= ˜$諽0UgÀT‰Úd­K¨¹\™úç L×”*Jר9áÀäÜ]|rØË Æ!Þª*걫3Þ*›ë Ü>X&óKC€‰ÇÕ—ËâÒ(KÄ€©åHåòs}Á¹a9ë7¸k3ùø0tÀ˜ú“2[¾Éü•!Øô#ík«kèòÂæ ôÂCËc;¼²ZöÀDÓˆÒYÃè•!Xûdâ,-»LD-I.M`ô2`H‡µsæ¾4”! ذ‰ØZ»á•!Xû¾Tö†]æ_¢2„ë‘Rԛιí¹DeÖ3’h|•!X?çÛuTµ®,ú—¨ áÀdÜtµç ë`Ö»Ü\t•{BeÖo06ro ŒÊLÊz–åC_ÒÜ: 2„ÿ†/`árbø7°Þ#•™G,}‰Ê¬Ÿ³ÚœÄmT ›pâ•!˜¤kÒ¸Ž#HM`Ü‹2`’°=é<à •!˜Ü.e¾…•!˜$1.¢"–§±hg}t˜ê“bß]v+¢´H“LX®ƒ ˜îr/#’<Å€§f,^Ö½î¡érçö¥¡ aÀzM¹é"uaÔÒ8ÃäÀ41Ñ0A%§Fb¢ Lûó®•£ÖÏŒþ„Ñr±Ë]ð|`9eHµE»`C†‰V­Útc÷ëF??¦%æÍ‹U€/óA˜Ž”ª–;µ}eËTs95σAØbybƒgvËnØbyj…ÇvËnØbyf…'vËnØbyn…§vËnx°Z%4Ç!g¶ÕÊ“\DuÇ ÖýyW¶Ï£º´ˆx/QÂiÊШ¬ºlc­at‰ÊLôÏI'Ykw”]¢2„cÎ5Í8àÕ gHÖw@þ…•!XÏuÞÚÁ—¨ áÀƒ"zÓÀ[=L,'ò€·ïì"Þ˹Qž/ ë;Í]’z æ„“Yôûl§˜Å›ÀX*š“B¢lEì^¢æ„[Æ`bÉÒ|¹tŒA7L”{euÞË/, ÐÒˆÖ Ã6Ëc%ë7øP(IkX¡š…“»¶IÛí’¬²ÖL¼D5 &15‰g¿º0bjÂ0Ù#equi Ë\¡š…[,¯­ðÄnÙ “âÈå­[ì±B5 ¶´9¶6cfo³&{þ­÷¥`ž¬Ï)u‘ø`ô^2`Zø¯*w¯uX­P͉Oæ®ô5wŒ ØÔ™ßó—À+‹ÎÜ ÓHÛF¬…ãòe…j¬ç ¯dn…j¬µrŸeëÚÕ T³0`r#VˆÄf¾B5 &ë Ü^V…œÍw–4Ô+T³p`Z8;u_ ¬P͵·G)ÒKáØl¯PÍÂõ¾®òI2VFñ LOôQéLv·B5 ËI|ã„W¦å –7iÓ¤Ö€…ªY80}ΘDÜ€ÇÆsÂä¶´NåÙãÁÑ‘PÍÂIdb§Î£Ç Õ,XçíÉ2ß„jLîÛ¸’ÛË‡Èæê\™j–0¬ç­¯²á Õ,˜ÞÔ¤]ÅYm]èQÍÂIÉ616—£¢Œë¹(“»ìû¨}¦bøè0bŽoÜÁ+·“õ(½B5 ÖkJ‘´ñMêHn°B5 &÷ƒ'%Ý Õ,˜d¸ÔbxŠ®Â°¶,ü0ŽAL àÆMÕ+—¢MÜ_ ª:0͹)¼l€Íœ{AX[¾3@†1ȉå8ÏÌU“ÀXTkË{3` r`bÙÛ T³p`2?Ç‘Èá‚QÕÉ€Ifï”;3rî…a=×¥éCU&‘]Œ·B5 ÖóF^µr.¯Šµ- Û Õ,˜åî—riƈ…`ÃrôØ[¯Ï–«¡e?LüϢɓ*Žî‰MèfáÀÚò¤ö°¯PÍÂI”_' wç7Ô, XÏu7>Ñã Õ,X¯Ýëᨢ0*«°Vgµ·˜ƒ“™¿Ï´’ˆ”"0ªY0QHFMÛ¬#{0ø Õ,xhyb‡/­–=ðÐòÔ¯¬–=0Ñßx ˘ĈíÊÈÈô@`ÔÉp`ÃòÄ ‡–ý°ayê„'CË~X¯ÝrŸ]&F­—eLöuòè!ÿÔ.}Y¡‡OÃéº_͆OÃӛǞ7Ax8R(Oà…u¤x`}GŸÔƒVP«2`í3ŸÌU¨‚³0op`²ß¨£,q V¨íáÀFfé“¶ŸàÉj{8°Þ1ÆžHÂcÔ×}/Wî¬# * çe¢„'¦Ê"ë¶ÙuΔF_.&·Y¾v•“0ê Šáe© ÿss;˜Í <fPq·k7”ûêV`4…±B™}.NœÍXµ°IÍ™!¼X…† 8¾GgÔnhЬ9•™›09Þµ>˘7þ¦RIÁ©0ñl‹ÆÔ µ=uV§×æe¿¨z)±ëÑ™j¤Q3i¢ ë©{ÈÊMå´<¾ÁØ c›Ý¯ÛÌTãíuF¦š¦ÚlÜSj{zËíÆi3ñ>ÔQ$àù°Í~XîªêWsF+6ÛYKüHxiZÜã0¹ò+Ôö4iž×"¾uõ:¬ÝàV¨íëj×y^÷ 5'å®–§«T`rÚLF·„îÓØñQÛ£,§÷µ(Û¬*ÇCËX˯òH%inü_ãŽð²ÜÆÝi²ÛGi±Ž0ZSÓ¨1âÀz6¯ËÖ’!aÌ$΀‰fN¦÷Y[Ú'Ôq`R¥©_Ì£¤vubù‚x¯Ã€©rB ìJÇ‹#¬ç¯ªö½oÔq`½¶eÖÞ>¸–XÔq`23Æ7Q\;aô 1`êÁ¹ûÝ-Æ(e u\ y˜[RáŠÀƒ 1!˜Ö"MËlWÀ˜†QcÄ©¾¡¨va®„M}CÖ½.ÞFíó¥ Æˆƒe¹9O¶©u‰EËYݤP,À3ÓrMF]:§/Ôq`½sÝ5³•A¦m¾ó5Ã\ƒ°nó^ì:y*Ü×MçÃ.z‰kJÖkÊ>-;ó²†À09°nóM”¶u”–1‘Ëh5FX[Ž=×KƘL/ £Ö–ësé}©DeÖ«G ã¹”u«­° +Ôq`:óçÙ=Hž36, -¼ZöÃzæo›Bl‡XCcÄ€IÌv,Ç”ÓY€#Lò­Ü‰&šj×Ù±¨1âÀd®ëª$mo£2/,5F˜TK#•œÅÑEQcÄɉwS©=„cÀ^:¿0L³ù·©ûpuifóÂ4;XœïTÉøí0…·„gFv° ¬ß`""g+ £Þë©Ü¹å,†1ȉO9óm‰QcĉŽ$Zçw30“8&÷ Þm<*8°>5^•@˜ø³ü0êü0ñ)·*ÜÔ1¬P¯ÃõÌ¿¾\­R³3`°,vnxfZÁ`¹u»‰Q¯ÃÁr’¹á…i9Ó¨ÎMÕr»½ÏÒ»Á&õ:؈‚se$|9Œ‚óÃúŽd2™_D¢,ÓûÈrÄC½&QÊÙVÈ lcKÜ3•¥°^Sº¸ˆÚx|1³Ã09ðÙò÷i}óÐD˜)À09°i9Î;;<µXö¦åkù Ï,–½°Þ™geV —3dŒz¬-/ÜÂ\ ce)L¢†J³À¨`ÀD¯SÄÂUBR˜„ëµ»ÙVy¶½é/σ ˜Ôºk}ÎÈÅÀõŒÔ wÙ cü3&;óJ…ã©\ezûC`Ü‹2`r¬’‹V£ó£^‡Ó³ÕMª^Š}úB½Ö{þÄwq5F½Öý9®îâµ´Q¯ÃINº²¦‡ÀFNº0Œ–’²1êu80͹¿]z›¦µåˆ7F½>[þ”–±§ó£^‡[ª»‘ô³vTwsÃ$Ð®Ž£&-h<,ÆaX?ç®dˆ¥0úd0Í Ù 2QØÈ‡†É}J|+Žö„_žã}JÖ§‰Û.ë\eC¨[ËKÁ|X ˜œè¹I“ïånm}tFNº0L½ñrbLï@B`ãn" “JÈhN`̇ŀµ–+ñÝ&ŽQ¯Ã©—XÎ2Ût=±>:#¦±ÄªoZ6÷ìõ:XïŠ4‰¾¯k{çG½&O#-wNÑöب,Å€õ¼ÑøÄcÔëp`ªª¹«š{×6õ:˜*¼Ë4v¹:ÇFe)L"$åÖ5‰Ž.­Á¶gjÄ^†a=oˆ6RWŽé õ:,7éÖõQ¯Ã±ÍfšmÀ¤bh1ÌZM`ÌIÇ€õš²¾s_dŒQ¯Ã©åÍæÞÝŒ™a9SËugΗ27,aj¹¬:w3†å L-z(…—†å ¬ï€Ò&“ûËh[7'¨×áÀô®­kZg3VÆ][Ö§¶‡RY¾¥uÑ4*1`ÒŸÓ›ªHñ*ƒÀÇ€–oÒÜæžE•&jpŸ”k‚* ¬ûF×za™0¬÷ü¥ð-@(³àÀ Î3å^šágA˜–tªnwµm éH80 å*wm¤ÛòèMŒÂD ˜ˆ/ëÖ­¸š 4„“]Á:j»&…½¸2`ýëd½-Ê­c’1Ò‘0`}õ(g˜õð kçÇt$˜¤R¡{ÈRØH †µ¸ç&í„ÁRe÷ X÷çÉm¿•ܽ2ôOP(Ãí–'CøÒiÙS•J ©ÜÊ»¡ªf‚B¬ÏVû'E€§Fù ¬-ן¢»uêx)SÊp`šÌ"‘ }»«‰‡ÀF Ü0LÒÉíN¤‚ØïÄpÛ3E¡ &²¡NÄ7…„£ÝÙ@`<2`=#uQ+·ÛŽZS# ÖcPÔòฮîi¾-ãdÀ¤ì¨¸ðËŽ…a’âÚã^”˾ï…2˜XTf¡0 e80I ¡²Ôöo[kŒçA¬oEÙw$û4E¡ &a«µÇm8E¡ Ö3RÝ¥ëö¡íÒb˜)`ŠBLæ4ÎÚ4j76Ýê…2˜ørK&À˜²Ûf¤ít2|ÝKÇŒä„IšŒ$-ãSTS1`¸;ÎÕ©WØ6'SÊp`â%N×i•öCÍ…2X{‰“\¸·—SC(ÀµWmã»Lœ¢P†Ÿ-O“¨ð†1ȉ/·-*9äŽG‡c“»69XóÌÙ Ü‹2`’z)öM2¨“áÀ´˜Ò6nu2˜ž›ì^Í1…m’¤# ÂÌÀ‰)êd80I˜CÉF Ö}CU' MEÛ ˜ÜÅÑMÕº–cÔÉp`RNÖ²¶Ø('†ÉíR¹kÁMt$ ,ƒËЀç¦å E~ÒÝÖµL Ò‘a2ºÓÔˆ S1`"€nºªŒrQ¬SËÑu2XÏÏòp§¶'ÐK cë}]Ó^7é6k;âIÕ0êd80™ë*Ûp:3Êè…a¢fQ5—"¬ÑG`ôÉ0`â ì2åsª¬ÑYÓ™††µ¶'.é)( ck/ÄÚ—ínŠ:LôIŸúïú»*+‡[bÔÉpà¡å I@Cà¥Õ²Z¦ÅN |iµì‡–“Ll-ðÊjÙëÓD»öÈ¢¦¨“áÀÄrã…1M3&–s/E]Æs·’xSÅǃsw&wmq—Å"‡D‹Æ”š ØƒŽŒfÓ•m zaÓòÄÏ,–½0ŸWט=ŽÀsc~ÂzMÙµbë 홢®€ëcœû¶j¨+àÀz¤4ë¬sÖq™ 8°Þ?uSE›ÄžÑlŠºL÷Ÿv»6²_4ÏPWÀ‰bÁrÆ#0®ƒ ˜ŒÁöö H'»Lc0 ³-Oˆe,{™ÆqAË^2`’ø2V³—>Z ê 80)”d¾—²À‚@a˜Œ”¬rçz˜¡®€ÓhJu\Jí¨³ cÿ†‰Ÿ¿Unð®Š+Ë6~fè 0ÖéÓEƒVè+àÀôvIåa‹DM7›¥gƒ0)~^z&Æê 80ö¨)2šA›ÀÓAßÀZ”¦Uér³ÌPWÀÉmi";R„TÆRð XÎã(›¡®€Óhºj³fs/ÍsJ&º‚Öûº ]A¶i!ÚÉ@p5C]&òc$#ÙjuX{£Nä·®ÍÉ u˜èdŠVeC´oÕfF™¬{]Ùx.ÇgFL4®qµ{G×0¬÷HßÉo·um=zÌPWÀõþyצ~˜²ë¹®ó:ÍðöŸë§ÑE F+ Œ;FLÇ—ž }3¼ýçÀh9j•YgxûÏéü,Ü×Á³©™†MË‘=WÚ oÿ9°¾›¸‚(ã­†=’ruÆxnî‘B0Ih^ß{¦¼ýçÀôÖcPJ‰Âæ­G&§c_.øÞþs`½c|P9C“µJÞ{3Üœàí?Ö–ëT4wF¹B ãí?Ö½nßÞE™sKŒ·ÿ˜îEUËÜÕŒ‰± ºÍÕ]Ú´/q»,ÇxûÏõޱ«ëI«"ìD9—ÎðöŸ“¬åØÓùÛ¬Û¼KÛk cOàÝ0&ÀxjcÀ$mb]·Æ:Oa#mb&é°»Ü÷èðöŸC†Ê›ÏÍ”mA˜ZöHæfsóÔ„É6ÛlNÝØEñöŸm p%תldª ôܽ‘wà™Q .mü¶Š²*:ˆÇSÞþs`}NÉ;±W¹u‹­%Èb†·ÿÒ»'²!Ž…~¾4Ó»‡`Z¢l³ÉJgGº4J”azÒ,ä’Ü=8š±2NšA˜z¶»›Tt§Þþs`}w¬†ë¦ª]0ŒAlXN÷öŠ¡3¼ýçÀÚßfQ#²Ä~‘1ÃÛŒÛê8j3ûfl ÀºÍ^aÛ oÿ90±¼ñÂX”‹ëÕ*ÛÞDq£Ü÷:fÀ˜>˜ƒb¡h·Žlþ3¼ýçÀ$ú,‹ä†§ÏÏj™dŒ, Øð™—˜ªIè+àÀDe!ªdíJy4C]Ö3Òtø¶)ŒçA¬gþÛ´‰âÄ‘ï{†ºLn¥;‘‹RämfÙ^¢ƒÜãº_Ôà!-ïå ¯m¯{1°€i!„(Þ·Î×mBÂh¹mk»¤yfdÉ`À`9ÍÝÍX™–C0ž€ÌBÆ,Xï ²ÊçÜC5 ËF 6€'¦å¬g¤.öMæ¨fáÀÔò ž–ƒ0ÝóWëïäá±µ¥–š¡š…[,O¬ðÂnÙ ë^Wz]÷¨fáÀzµª"3G&…Ñ'ÀIìR–{Ž¥¨fáÀ°vJnbÇfÕ,˜âsu3×¶‰qe(ÊÂ0ÙóWÕÞ)œ˜¡š…“]A.䆧ŒŠO­­ÆMzÖþ"ŽDãnúd°ö™‹¶Sç°~}NŒ¨fáÀtÿ¼ÍZw3Œ Þa˜ä¬ÉÀÏB`,ÊÅ€µ·')£X~ÉF|²M†š…s}¹¨fáÀútܵôuðÕ,˜ZÆóxlXÂúF,Ußî¾— ;ÿÕ,˜æø9ï¶ŽfL¿AX{Nòµ'IæÕ,X¯)õðmS#2°V³ r"ŒjL¼ñU|ë\&æ¨fáÀºÍJ´ªB¬FsT³p`r[ZÔ­s’™£š…ˇkÕõ.·$öœ£š…“è†Ã÷³'&š›Y2°^a3Ì’Âãy– ß/§CË~˜¬VqûÐF¥]F2G5 6-7Õ®³ ÍÇs‹e/L¼ÄY9²ÆÌ¥ ˜hNò-íÍÀj2 ˜äûj£´pÉ樓áÀº×=t"ß‹]Þ­µ›ÀåÇ€-–÷ma—vËnØb¹Ö…|i·ì†I IѺ…šsÔÉp`²cô9~稓áÀºÍí6Ú%ÂŽ4G ÆÓ„‘ؓÁi"Ó„IVJ’Þ€xj ºoÄ*†QÕ2‹öã‹áÄûA ‘âStg/H7ŸÏ-Í^XÏYœÊBTä\C`¼›`ÀËö”ûsÔÉp`’ã7O 9¨²>ÂðÑ]bŽß0Lô¾B\ù-PúÂMQBã"Âs‹¨Æ “lÉ ü …q/Ê€ÉH)cwtð¥/˜ÛÚ²ê²Í }!ð% Û°>µÕmV›WsFùÖb&k»»j»+mºÜJ_8°¶¼ÎJ¹¼9®(}áÀ¸ZÕ¢»©E™jr-PúÂñÖ=™£ô…/D“æ×û2¦g×îa˜„ªmó3æqҬþDéÛ£ô…C¢Ú$kåk‰o,‡”¾p`°<8>øÒ´‚Áò§]긘[ÌÉuC°žùcôÝ0J_8°KçƒÃäÀ´p¶’#Å Ÿ%°Y8;›–;<µXöÂz/*T NT|ж–œ! ”¾p`‹åÒ Ïí–ݰžEï»´l3ÇÕêu2˜$€MÅJŠ óo,P'í–c |é²ì‚IòFá©<»@ Ö–UV鲬v¥-ËÜÂHÀ‰'ð.ÏîIîg6R¥…amùÆŸ²@ ¦>ƶS£™-ÇÂu2X÷绲ô¼ÔÉp`H|‘v.ÁÕu2˜œè‹VéP]0ž°žùU–¹N¥âëì—†1È-–'VøÒnÙ [öÏ$sWöý³†t²­¨ï+ûÏHÀ‰¶§ü®­Šµã¥ N†“°¯$—óÌZ¥2Vº_ š…mn÷®f̆möÆå8wÁó¡e?l>ç­ ^Xž³Ö}ãS”g†ü™Â˜È…ë6'Q¼íË[Ù;&raÀ¬#(ï]_pe&ëÁTÄ[–…Q/JÃ+ã&= “À½þÀ„N{a˜YÈv+Ïé­FEÖ}ã®iüƒã¾Ž“°¯º1o))<ǰ¯0LŒl̳F‚‘ ¬÷ü*GYYÔUSà2`=Rä-Û׎\ Ôœp`}:î=Nu¾kã¼:PsÂõ®àÓ°¨š†—¨9áÀä˜–÷Eýü ,ßo\[µ%jN80X¤â%ðÔ´‚ñi¤¤ðlð40)¢ç;¤//Œ"za˜®ÝEÖ4ªÚªEH¿44' ˜°ÇíC!¥Ö¨¨%jN80¹õ(D9¦Ü%jN8°~λ:mœõ4—†æ„“¤‚•Gú²DÍ ËîüKÔœp`½ZU±ç¢y‰šLÒ#«Õgí8¤/Qs ËIá‚gCË~x Ü³G/Qs‰/·Ú‹(«•‡/®ÌÉ|‰šLRÿÊzÚ®ƒ—c#õ_¶Zž ¬¡9aÀ$nBWÌz 0ŽA¬µj·¢q;«—¨9áÀdæM©bôeÕ5ˉ±†a¢í©TuÊ}j Y¢æ„å^ß$Õ6²ŠÄ–¨9áÀZ«VuµïÑÁäÀ$ÝŠ*zÕ]=±6ÃH·†I"Ä“ýl‰šŒe‰”kˆêñ<,K€u¯û”4¾f ŸŸ“¨¨¬¬F#&žÀ¸Ïg®¶®xj”cÃú¤ùФ‘ª,-JKpÖ5'Xû‘æ¾|æKÔœp`âUÛªï¸ÛX7'Fº¬Oq©3ÂhRۣû6LUÊÙ§¨pH2–S3(“µ;¹Ë¾WãD‹@`,¢Ç€õsnêh“¦‰’Àؾ Þµ1`ý4’<’UYmï†ÍÀ”G XÁ2겂î´Æ1È€ñnÂ=墿„“´½k_çGÍ ¦–'žéËМ0`=?ïš{Œq@ ˜D¾È£ÇíÎá Y¢æ„kÏI³ÎZSdD`¼ïfÀzÞ¨å?¦%æH"0ŒAL ÿÕu•Gí]“+¢.Qs–åÿëÈ{_Ú,ûàå¸lmKÛle³ìƒ-mnºñð Î/ìmvÃVË–Í6jN80)Ÿµ­ˆã´µ-Ǩ9áÀ$‰DÔÖ•+è~‰šLôüUžË3¯½.Þ5'˜ÜJ×ün5Tl#ðo¥Ã0½k«ó´Pùüºlx@˜›wmAXno Ð%jN8°ùœÛNt»ÖÒ‘.-ÏÙ ›–·v7ø5'˜h/×ü††ö2 S5xUDò€n͆½\±xaذÜåöüÏK#Ý &c°½íª:JJÛÉraŒÁ0¬-‹NDYÙîÛ•ßÒ(KÄ€!™¿Ø%»Úñçf2ÿl&Sjíù‘–¨9áÀzíɰ–1õ&–cß±5'˜ÌuÃÈ ¯p® Ã4O Ý’Ë¥‹„©ey†ŽÓØz9¾\ejðž‘vMæqY æ„ëv-nã]=v}Aô‹2`ÓòÄÏ,–½0ñ}Õ¾e5'X·9K¶ª>óØ>`Qs–îYÔœp`í+¸KKy––{y{GBÍ &…ÒâHII\/ÓŽ1`°ì¹@Í Ö>Æ›ªMóÜåºGÍ Ö3’±‰xh¬áuKÌÍÂõèÎÚÔ3`QÍÂõÓ¸»‹’Ôd±D5 &mŽ£Ò™Õv‰j –«2njÇ£[˜–C°ölgq\å•ó âÝÖ' æ!äµ!0ž0‰M2w`õÕ,X?|[7Õ½£úóÕ,˜”T‡»¨I·$› Q÷Å€õsžG*ݽÈiÔa r`r#–É]kÑ‚’„ÀF,^&ú{•άsl‰QÍÂI½¨KãW]Eô°žëÚ:2½,Æ›t¬½jEª’ñîêö¦²½n)X¿A¹F®(m¹Á—¨fáÀä9.ìÿÕ,X·yë»Â¾D5 ¦{Ѭ*MSmIÅs‰j–,ÿÚ ÓåÍw("xj¤(ÂúÔ¶o¢´-]ôÕ,X¯ƒò„w'»iëhf1bÀDCUïÊ̵´]¢š…SË}‚XWGZ–ƒ°.åªÒªóÑañ Lã­ä|[Å®fÃ0½j;¹'n¬SîåØ,ª„õþ¹Í<µ.QÍÂõ¼Ñ]ìñÔÆ€õš’Ñ Õ61{ËqëÚ^¢š…Þ¿HE»kl‰ËñÜÜó‡`°|’ X¦¯ñ´‚i¡´lë ê¼D5 ÖçÁ"/ÝÕ¾.QÍÂõ)Ž6*·û!ÎÕtg]¢š…Sõì>k1KQÍÂII”®Dç¨þ|‰jL¢)/îvÎ`ðKT³p`=×}Ú*Ÿœ­“ ªY8°Ård[ŽQ͵ç$W‡t•¸*×½ŸÀèçgÀ`Y­óM^Uõ ‰Ä%jN80ÑÆž0óKÔœp`rë‘ßÎ,€<'a-Oœ°™ç$ £å©,`´_®ûKÔœp`°™ºtÏMË!˜”èTõuÇåø%jN80)ãRçÙ]ºvÁècdÀºot¢Y;/@/<' ˜»Â¢æ„ë]Á4Rw ®Gg”øaÀÔrCU\&<6,ajùFÜݺjN8°öö$à 1†1Èõy°Žk¥mpñPsÂѲ™ÍŸÀóåL|ŒE]G7iN|6|Œaذ|ti},m¨9áÀ$#P­óصíAÍ Ö;Æ{_2ÿKCs€¡0k\•m•[·ñ¨9áÀúDŸ®Ó¢u…^¢æ„ë^—Ц.—\—¨9áÀ¤,‘ª·äJúz‰šL¼—›ª¨ö®I5'˜èŸ}’ŒË¹¡ä’E›d¥óðˆšLÕ,q—;]Fž¬wqéý‚090ñ1*}‘É^B`Ôœ0`¢ßy-’h_eq:L2¨9áÀvË“!L"q‰šLµñÙ½{ˆš¬ŸÆýá¤*âp’Ae¶[N2¨ áÀ¤ Uu»R'33`ôœ0`’Õv—ÒÌ&¼Ä¬¶aXÏH»UCeÖžÀ8-U²áÈZWú•!˜æ9uëª<{‰ÊLâ&ZßrŒÊL,{ ¨ áÀIJw aä9aÀzÏŸ‹ö¦hi@.QÂI¶¨z“WwΗ‚0ño´µ<¤yEò{ÕY ˜œÚšJy“Ä~@¸4Nma˜Ìq›äÕzý`‡êua˜hã«Â÷ºW¨Ãôæ1ÎÍëD £2„“ú)eºm6÷QšëúàÆêu Ø,#îH·r‰ÊL²‘¤Çú•%Hù•!X÷ºµˆw}N†Ê"P¹Ä *XÏJænæÃ"0FÌ1`rª×:ÛE4¶43ã1`£¶NÔt4¿.—ÃÚ:~˜VXÈ3µhFñÆr‘±2"°ޙ«"Û´°‡‹^¢æ„“š\Y|Ûî09ë^¡æ„“X¼¼•½3.[;ŒÕë0½£m9&óÕ…Y9+“,Y‹Ö‘¨vedPaÀzÿ<Ùy¨®PsÂåVîÄôÔO£Ÿ…kÓ*¸;mVÎ'½0kV‡`ê„+Òî¦JÚh=Y›;èJT80)ïVyv£+”¨p`½ñÙ•·*B^í,žÑJT8°Þø$FìÂ(QáÀƒ2§.xl+sêƒõt^+%œë¬¹B‰ Öm®*•|¼)Œ21L’,©¹I¢ð “,†aýo[ùì\q«+”¨p`ýœó}V^»ªd¬P¢Â Ë®ºj+”¨p`"PÞžøFN¥µdŽ_¡D…ë­kµ®ÒÆÝ‘pëÊ€Ñr"\ÓJT80¸«ã¤v=Ëj26ÝÕ!ذÜ5.x2´ì‡²Ç»®¶ä^ W0I“ÆY›Fû̶ÿZ¡D…“‚9ë,O£ú¯d9~…LåKžêQ ¼4äKA˜L¹K*å–±nmÅ\ ˜\úÝGráÄäj6Ê€„aÓ²Ü÷ßÛ^ JT80ÙÈ7±|Žœš«©qÈ ÃäšË§€^¥xðÙòL…27U]lï¬_F ZŽmu{V(QáÀúˆÐù‰),Zg%Ô™'4&ôcÀ:ñ ÖíØ|×j\¯e ;°ޛ׭'ûÿ å/˜$«£z×Þ¸ša”} ÃËmï†u¹V(áÀä4ó-AF™LfèÎ c‰L’‰oîZáÒ¬PþÂu›÷}f',úE`ߨbÙVãj…òL\á Œ4cŽ®ð0LÚÜÈf›¬é)À¸Æ2`ÞSˆ¸›;L(áÀhyá†/–0 ‡¨j±íœ O„ X_ oª{w-±•!aÀÄÑ'}Rl*8'0ze°ÞçÖ7J$™Å‘Þ÷¹ ØfY$Åž:,;aý4vy.Ê.j©“À(eÀË í$ðÜfÙë§‘Ô‘RÃuM–¹!aÀ$ErlÆaŒ4¬×”Ò—Ïb…òLV«Ö cÊLÎmIzo$Ä&0Ê_80½rÞ¥Þ[™e~°>©ró*ϼMÜYTe+”¿p`Ý7ö²!wUsk¿SÁ”+’{ŠÜ9墰†“oEnËŸ3`’ ¬O§éP*¯PXÃ¥‰"kÝÄ k8ðÐrb‡/­–=0ÙÇ/¦Ñ>KÒÊþºWxBÃz—›¾Í6 k8°Þ1>ä÷¢0Â2Œ4Lä‰ëèî&ëÒu¥cy Œë ¦óFÁxOy#“¤íYÒ:«†¬PXÃ ËÆ:Aàùв&á=U™nfÂ!0ŠÛ0Yae Ü[bÖp`ý4²ºÎ8± k8ðÙò÷¢¹­önÆ &;Æ6vkFW(¬áÀ$Ñ|Û•Qሶ]¡°†k?ñ>-*w30ˆRTì³Ö¹º2„5 ØfybƒgËN˜ôçÆ“Ãn…ÂLdFÙ}á^ŽQXÃÉíĺÊÚÜÕÊ ÃIJÈÁbÀƽG&–•ÌIÝG»¡>~…¬çuœ9_Êô…5ØÖæxpedZæÀ$b^D®É\ÂxKÏ€mmæ47-s`½¯Ûz*HÃã0–­jY®$<”­ ÀÚ{™–Ù®ÍíÕY$ £›ëy#H¢0ž4°­º][tö¸G ÃèæÀz_—%e¶½é oQƒÃ€¡ädÙ9z ¯Ì’“!˜$CÞr58uVnåQžÂþë=³k»4‰ dšÀ˜hžkËwmÒºòüJƒ°~Y.ºöö¡Ý5›AÍ cà=Ö;™¦ºM›k,E`ôö0`*]ÍäQ©stѱ)] ÂÚr¦•jÆÂc ˜¦†,»k#:ŠÀK#5d&e$öñõ!7ÞðšKÂx«É€©˜¾Ú5qz]l‡"# +l&÷ÿßdެ÷¢Û&sºg%ŒÒULÖùÜÜ‹¦¡ÁaÀDɸÍbÙ›ÒÖc±LZ®ÛÖ‘¡RÂ3# %ëçܤµˆ±q|ALîÉ€á Fªäñx°t$T÷pà³å×Yº~™î¿ÞÝõ‹açGu¶Z~ùõ`À¢º‡[-?·4cå²ì‚7‹Ö>1êL£uì°¨îáÀTEuWU V¿$°± Ã$ù…§î‹„äaXßâµE¥RTŠ4¶fàÍ#&×vmU|¢uã:›wô!XŸ€äÔ•GÉ®¨­Õ=˜HnEé¨-á¥Q 9“ e'nU&P{3pdÀ$eáVÿ»Ô±½œ) Ã0 „+DWEm­Š—¶ƒ©Õ=˜Þ«L'qj­ž%a#ð> ë^¹Ì—iêZ&PÝÃÉŽ±ö +T÷p`:#yá™1#áAÀ!\Fxn 8ôÁô š*/Œ7„õÌ›€q 2`=‹Æ²%n p2`½“iï|›@Tàp`}’ÛžÁ|®aTàp`…‹û‡Ÿ1m(&ájq$6q<:Tàp`ÝëÚªˆÌ7N`,¸Â€!9Q\nú<–IÆ(zÄ€Iˆ 8‚!$ŒÉ/°žù“<òŒ4 X÷Jܤ"‰69©ýB`TÁ1`í%V·}ëT”ö¥ 8X«‰•£Ìåø•0ŒALnÿ»´qw¤…qû†I*½üÃĵ¡‡“"å".UÍcš“—ÀÊÈ€©åd«à]b…§†å ¬W+3cÁL’{ö¯e «±à †Ñ®ñM›–Î LöÏ7õwµs2_Åÿ°ö¸¶Óµ<,uŽ)8˜ZömNPÃIIàûö.3dúF&ž“¤ßÃ&ƒÀ80Z®ÊŒ†ÒSx2°€õ,{ò”IoðÙòýºº÷Á09°>i6ëì>Ê«X¯H`ƒذWå&ÛZ&Tàpàa›£¶µ\r¡‡›mÞlð¥¥Í^XÁ}´iª²«IßC`ƒ ˜¨,ŠëZîybû°2RÛ0`}ÒÌÇQ¾wN_¨ÀáÀ`¹w®E8,wiŽ:?OMË!FqÜ:¦\Tàp`rÊnt¢Î!Œ{Q¬ÏÝr{™¬oÕ¤›–ÃŽ„ LÒÒU·YÔÂÑ‘0µ Ös/“‘„a r`ýœ»ÛH¸2’Hï0ƒ­ïð¸2Æ`>[ÇêÁ9;*p80IÄVgIñ)Ri´,F¨“áÀËMºµ-š¨“áÀú ŠR8C$Œ#…CùsQ»á…Yþ<“yc­³X®?¤&—Cµ+ŠÈLEMi,}É€õ¾çÆ#¾”0z$°^5kUöè¾¶;úǨPáÀÔó[ß×™=›¸„džç7“³G›‹}Šj5c¼!&E5»*Þ¥m‘Ùa,»Ç€MˤlÂ3‹å.+lç¥1*TbÑ$ƒ]#1‰›–#È’Là…Ų&ñmVºRH2`¢×©ú=nêè¢Xú’ëù+mÚÊHàHa\0MNì®f9ÒaXk@UùÍׯnŒ ¬3´ív‡å”(ŒET09ãE²ÿßD­Uf1F… Ö–ãb ø¥0ªÄ°>KÇ]ÚE…Jxbq2ŽQ¡Â ËÆ7CË~ذü–$ðrhÙë‘r;]o°öVO...nÓa r`´|—®ÁϨaT¨p`íYèš(-v¹°åÿ“0–ÝcÀú–Ë’`—Â0R80Mx¯VzÜŸxf$¼ÂzO#Q:'CG€õèîî£u_&ٺ¢ڃãþÒ¹£ÚƒC̉*õ%öf¬Ì˜“LW×û‰{úBµ¦m^WÕm!š[ÛëžšñuA˜$®Žš]žFi¹• þ`X¡Úƒ“ÜDY[DIZç•E646Ô ˜$¿ô]rC ˜ì7ÒF=;»ctŒj¬÷HÍníYÚPíÁõé±+»hì°F¹!Œ–'nør`9Ó BÕ¶÷[—6T{p`¢¸ÊòL‰p5<3WaX¯)E•¤…ó ¢ÚƒëçœÄÑÝM”VÖ Â1ª=8°Þå¦bŸ¥.WàÕXû E#Ê.ÍsaoŒALö¢Y”oŒ+¹°YRfâ‚–’2^X¿ÁMVyzT{p`R˜+R¹1À¸2àedžÊP{0`jY´mÚB;4Œj<°ÜZ¯—ƨöàÀúž2ͺL”Ê%iÙÆ£Úƒë1x2=Òu‚À80=[5EæœdææÙ*k?xn‹:Ý::?ª=80ÍA°k„» #AÖ»‚é1K™œjZËKAõ?&Þê½Çi>že÷Â0‰²Ø§[!O5Ž×cëù9«#Q×®‹j¬OmU<ÎÝK›Qnˆëç¼É Ï£Cµ¦ ¨µkiCµÖý¹¨‡Ñ¥Æ[.Löüwò^‹»Õ˜_jU~ü<§ùñ Œqæ ˜ÄöÜ)?™ˆ­„cT{p`Lñ^•åÎ~Cµ&{$ÕéÕÎ'–©ÕØny¸´¡ÚƒÛ,o7Ãf ÚƒÛ,7…ž8,;a›å,އ_pê°ì„Éž¿ÈÜÉ1ª=8°žEÇQ:ŽT‘¾(«-_3Q3`ÒæÖtGŒ8 X”›ªLï®!T{p`ZŠê°9±xQíÁI¾•í&º‹&…}ú2ó­„aâqÖÍmdO`7£ÚƒëÓD×B] P_*1ïZnÊýnøèPíÁI”…*‰•»®uPíÁ‰ZºÚ¦fO"0ŽAL2Öu8·¨öàÀ$üÎs<¾4¢Áð¾áM2/ŒŠ+Lâ7bu…Ù¾Äø0LT5yª2«¥÷öÎwm ˜œè÷R™ß?Xa³QFËm›OàñÀrÖçÁL¥Y(›8¶7σ ˜”¢¥*yäèü¨#áÀ4Æu-L®+êH80QKï^C ã^”ƒeÜБ0`},Ö*Þ*JH} ãyÛ,Ç6øÒaÙ ë³UQ%QŸf®Ãý1jN809Æ·‘«fûtraœðƒõ§¨ím[ËB?AÍ ¦ èÿË6¬&Fžù0LïSîT¶t¹UÓ"›yÇ‚°Í²Ža"ðÌaÙ “²Õ¥G7AÍ Ö–åY©Yn_€&FV¬}æ÷©€}úš æ„ëÕj³“«„*“´ñíð¥àyü•[ªzËE`ó~0ÓbEZÆ,oFÍ &ÙÁ) Š—À˜‘“’_ò¤ô•­õ>AÍ &Ϲ*'³û¥£#1†I~äOQ"ÔŠm_p†ù‘ðÍòÄÏ–0ñ?7h²hS‰Âc.xLë­t©sÑœŒÍz+A˜ìÌå$.מ۴kmÍ0j=„a­¡*Ú¾\´U–@Í jN8°VK— ?0aÔœp`°,wÅ¢‰ºô~°Ùž`V¬ïŽóµÇ¥ti¹ ¨LP'ÃõÓHÛÛADñn‚“}SÆž×Z5Lô¢m´m3”€NQsÂ-–I Ïì–Ý0Ñ1¦]—F›Îšv|ŠšLª¶Ÿœ®$Œû:lyu3NLQsµ—¸l=Ég§¨9áÀ`Y${Ç€¢æ„ÓID"Ž!—‹†QsÂÉH‘íP³Acs†LQsÂé­‡<,¹ŽÒÓ±‘y9 ëSÛð²`ƒ˜X¾©ZçÆuŠšLò#g‰¯Ë€õsVY¶b#(Àxׯ€ÉiBdnIó5'˜xã›ÁjLaÔœ0`r»¤ª‚»±SÔœp`=#m6YœªÜx*‡É`’AÍ ÖϹlÛ®qv$Ôœp`zG¿ót$ÔBp`­`_ OܵXïÌ·uçÞ¸NQ Ái^µ$UU³z™Ê𥬌¼jAö±Èê¶ÊâÍž^˜û –•,Jl3]ZÀcÓrFËrËcO5öH!˜ìãȬ»DaÔ#1`ó¤é(7E-X†\ìžÛ,ûàe%ǶÁ ›e<°‹.·½nÛ¹Û ë5EyCœúSC Á€Ñrî†WË-»§#gFË7nx<°€õíRºî²Ô ÃäÀ4#Pœ«º‰ ñäxjd Âzæ/»œÂ˜áŠ“HM¾KËØ~µ:E-&:™²­›²³ MQ ÁiœfZf÷QC=D6ã4ƒ0Íúº­ä"ÊE;tÝO -&9QåÂV+H¶CØÈ‰†I¼U™ì3Ñíí/µX÷º®ÉÒ½Kú2E-&{Ñᩔ¨GbÀúiˆ®Îjw3Ð÷Å€‰ž?ë¾s^ LQ Á·K -9Aà¹ívÉë³U}(j/$6E-&÷)ªN®<˜¶6µXÏ¢uûÐ6ìz(Œ÷° XÏü[5Õnª&N­Í@m<ÖùE÷¾k)j!80µ<Ì8Ià±a9ëÌwQæÙÆ£‚cÜ}æ¸b°žE›TâûÔ£‚“[²“OÎå A-´¹MWZš±°µÙÓL5ÏĈ7éXßʽ\4tWÞ ÖOã¸ç!<€ñ 2`â9)=eã§x“ΉéPÚ1¬–F­0Lk7ÊùË%§œâM:&¹”³¸ª]¢ô)Þ¤s`’'®šMë„ÑÛÀµe¥ºQzÊÜ"ðžõE0ɳ]¦ÕÎÙ ¼IçÀz¿±û.ëÚ\+le\§x“εO¦­=—‰S¼IçÀÔ'çYìü‚3Ã'„u ¶ò^.šfÁ%0ŒA¬ß`Ý´Ý*1 ¨‚ÛÌ‘WmŠ7é*°µ©ªÂ^örŠ7éX8åÔ¸IgÀô¤y·îœ®ûKCQ†I…ÅØ#<žâM:&7é{Qº]÷æMzÖ#e“ù:?Þ¤s`’gû6êDªzôãá£Ã›tlµ<±À3—eŒ÷VÎ+ìéà&=ӼĪ&Ë5¬›^y‰ƒ0ÙTòuW®-„q“΀õHI›XÒYžÚaiÆ­·‹böLn=’¬­Ö%Ö°‘½cÍ—Ü岘UN°¾›h“Ø3}¡bCôYÔŽ3T,p`¢cLËØyÄ›M Ug&÷ƒr ò|A£*d&½Î¬IŒ0ú7°YË/iðÒRËÏ “|ŒY#rcëJ`T”1`í¡j|‰=g¨XàÀDWЪg×V¹íZgf*Â0½A(Ó¸;V!L_¨XàÀËö‹Œ*8°)û¨, ¥Ö!™{ ŒÊjLôH¥È3—Ói†Š¬OôUé›rQ±ÀÏ–§r¼nÄ=(( cª!c+O`‹jÈkËeìëü¨XàÀz VÝNyØ]ÍÀ1È€IäKÛU¨á¹­†I­háÛª¡bïåºV.eÙQ­Í@ÅÖkJï܉—gFö¬GJ6(0fohÚ½gíFÖs¢óx‰g(BàÀÔ²§ºè EX«é]VVí&³÷g!p`šš5Ý6‘t67 x…aR`±ðè¾f(BàÀ`¹í¥ðØ´‚ ËItPž V+!p`°,7NxjZÁøœ·M¤ ÐZv2(BàÀ˱ì¥ùpDÖ±ª¹Ýä•#Fl†"¬éqÛy&LÈÀõ¯‹ •¼“«áùx ˜üîšl½k]_ƒà°NsÚÍΡ2p`´læÔ$ðx`9kËb·mÏîœÉ•À09°ÝòdO–0ée'OÇ;Å&0ÑcÀT*µ¢qäRž¡Œ„ëCz]žEe$˜&Ÿ)<'M”‘p`RÀkWzìÒ(à†õÜ5|ËÚ­Ó±Ï*ËibØæLœNÍ0(ÀlȀɌ”v7UãÈÊ5Cé &W«©(Ó&ÏäÑ*~A”¾p`½ûÚåò½¸Ô³3”¾p`ýó¬8FÙî€PúÂõè^·r Q;›óÖÏ9ÍÅ éQ@È€‰ë¾ÝD7k×$c[aÀú𲋻Ø¡?Cé‹„Õza}ÜFÍQˆÂ09°Þ™wµÊéä|)Xè7K¾[7™k¡7’H0`ÝŸïß¹Û¾0`=#í“]Ñ5âÁš=x†Ò¬W«÷ †ÒLSxÉÍ\/¥/˜$Œsñ6íÕ6’ †a‹e›Úp†Ò¬ŸF-'ó´™L'ö—‚ Í0IòÓÞÔ¢uMF ¬ŸF¬’ƒ) -ã5%&…³ ÏÍã¥/˜¤+ìs”Mj<Æt…a˜”PuDžS™21èžëù¹•ß„•š0ʰ0.Q~µÂñgfá’LÓ7˜žé ƒ0InGòg ×4\‡a"Pio"S¶M`,¾É€ÁÛÓˆX%€Ö!±¾4½=!Xᄎa ÃäÀú »m= Ðå:˜^«€f¬DEà±q„ußø^ž›í¹‘ø‚“Ëñxàp¥0^S2`ížÝµƒ9†ÂXtŒ£e%U®sQ8s”ëp`,\‹Æ^­`Žr|¶|y1‰Æã(µ-§Óå:˜¼Á.ÛÈaív¸´ÍQ®Ãõ¼±—”Ó?G¹ÎVäYžº„s”ëá¼ÚÚ\s”ëp`’‚`êÑBÌ'Frƒ0L’¾¶ª¬{gßBÌQ®Ãi2¥]ŸêQé÷†‹&Êu80ñœƒÙ‹ÂèËeÀÚrÖzaôå2`âßͧ]ö½]é47Œ0`-å:ÆÊ©Î} X#ÁÖžÀu%Š,«j{…1È-–ÉGà•ݲÖcp3<Óå:X·¹Ê»Ì=o \‡“BÃû´ŒšÂ±qE¹6-'.xj±ì…ur“'žm<Êu80 “É…{ú2Š­0`ª&<Ù)ç(×áÀzUѰ­ˆžðAE¹6Rg7"±ÆMÌQ®Ã-–­Ã å:XûEËÆwÄC¹ÖûçJιiš8&F”ëp`-œq®ê]f]eÉY=G¹ÖáuBaæKÃäÀÚ”6iâ¬è4G¹&bBx6Û(×áÀ$=r!JuYÔf…íÑ-1=rÆSÛ]%§kçŸ Om˜<ç<ߢ‹ÊÿuïoIUì}ƒeTDE@fÎîá’%#AÂCïîÞ{÷œNÓ«w8ƒÜ‹  *f¼ F¸FP/ ˆŠ‚‚˜PQQP øtï™9«ªz­îš÷ùãý<Þ 3ßStX½BÕ¯ª¡º A`À@\Äú€Q³IÄ¥Õ0¤·ˆB…,›¸«²\ƒÆÒF¬×Ž·°B…CË¡(kÄr%,Ué}ÃOôC+T80ˆùy±»D(|°X¡ÂAê¸HQv°±W1LÒ~£PßwôÌeÀríÛk6=JGY +T80È([ÛòUé4oa… £.ïš­m¡ªÖC‹´ÀaÀÀ[mcº·½dÀ ÄÕÚÈ¿áô¯»N VÃÐ2i?€aÒþ¹FãÙ¶µ +T80ˆ7”õkoÕI¼¡–_·ïõ‚îÞ  ¢/QÉ¡¦…*ø7²7’­œ^*Õë& Õ0Pÿçx¬½A¼2`ù¥dûž\‰:R ¿ZX¡Â¥¦9;‡ -ý@Bß †Å cmJM±âd«A‹VÂJ˦®é,ë`9‹Ž¦¯_Ú°B…ƒbCŽ­ ¾rÛƒ*è"âAÅ0Þ‹2`ÐÆµ¬Šq‹(T0RÒ‹d¬;–â‚2¸xÒ4ÜVž4K`¹GZY:1bí –ã9Ja\`”ÃÂÄ"ðV±?,V—’0Ö¾p`ù“ØÎ–Í——^.~VXûÂåîkj'ao¤ µ°ö…˽( ·°ö…ƒz+q’jk¥µ°ö…Ëy£g¥.]5Œ‹2`dy¥ÐU»kaí –¾¯`æúub³ gî1`PȰ¡t¸ † b}×Jp—4ˆ­„aDÌóŒ$Ü"Eªad¹ï&‰›ª£-¬}áÀà9eÆñA ³”Ë>+¬}áÀ ¥“0ÖÏV¾¬}áÀr÷¦¥0Ž2`pZ“)[±òuãø †žíÈjz¬“áÀ €ïI [Ž[¤{5 ËŸY¡˜ƒ@9™c ÙY¸t=±N†ƒ ¥ =ÖÉp`™ãê‰8÷ë 40ú90Žâ­‘£$®¢x0(´®Íâ5¼Ø.¤Ðv5 Ɔ柳5Õ Q¢“aÀ`íξ(6Ã0©ÂV KÝjîÅÂÉgÆ 0ÈO gàëœ!X'ÃÁÙj’F¡á ð €I±ûjTùÉÖµY[y¨!: Ú1 cÚ®ë iÇX ÃɬXÓ¡¼…u2Eñ\ýQëd80hô8i_òÃ: ZàL‹môŒ¨0`¹3ƒxlêo·DeÀ Rä{µx$T£ÖÉp`•e)pGcY \Y-ø©ä€a‹…² ÖÉp`¹¦XkÁ"±(c½(F9'>ªˆa“æœTÁ蜉íÈW¹°æ„Ãl–ìæìØV¦¾´°æ„ËYtb¬ù© ¬9áÀ ëÀµS?¶ œ Àx<3`©cŒCó'º)kN8°Ü#%"[¸¸Ç"ÜÆš }Œ¶ë»‰º­Z{Žú+aЀ°˜SaÜf›ƒÖ³Ñbîq½0DÛXs•– ¸¡³¬ƒ•–› ¸©³¬ƒAÅÃk{¾¶±æ„,B=Ú*Ëe0h¥Öšú`M—~aÀв¥]u±®†Ëoph%ÂM5‰$]¬«áÀrÿ„^žÞ¦Ðv±®†ƒá\*£KÊèb] †+l4+Ú— ·È [ ƒÂ¶Ñ`äYAxw޶­†Aœ8É›ñ–ªVëj80P8$ýµŸ•+nûQ0(.&îÌ+¯H¤ð †–³7’ŽÔÕKºXWÃAFRÎV ¡¾ ’‘T £;Iu¯ëj8°Òòb 7t–u°<§d'šT?}‘Â/ çVkûStIá,¯¹Ÿ–ºXWÃ娛Om«ç»A`ËŠJÆÅ¥°üºb7ñtR™.ÖÕp`˜o˜Ÿ>PÛ“fC äÝ'‘eŸ•𮏆óî«ap¶JŒÂ|`Ë`À`_ô ÑÓ}V´ðK5,W«Ø7féÇê¥ ëj8°ŒÛ–Ê»XWá'¼à‡p‹xÂ+a˜½Næê-v÷p›d@WÂPý’ÛŒxªJ{ìt5•0,¢2J‡ºãRëj80>MäÕ¡óWÂXWÃç$YÛ\ €qQM,OÇ ¡‘§O¨5]ÒlˆËYÔ_sošÁu5j5ûV¶Ý%º ÎVkbbǪ—Bš UÃ@WãùÙfmª{tDWS ÍÕìÑ9°]!„qp‚K˽µ[@è¥0N0`Ðt¯¬wI—èj°ô»vl„‘£. Ñź,×Á(pó×mùùg[xÝXWÃå¨Kœ²ĺ êH Ê– ¬«áÀ`í.KØé’*1 ´J·-GHo&ìÕ°ÌdœõÂrz u5Xž»K…Ê]¬«áÀ ‚àXz7K·A*TTÃòëN¼Ò„ý¢ ì 7…Íg…u5fQyqÜÇý\#YT•°<Ñ× á áE!ð‡çü2`·š¹B°óÀ¸B•@·äu7I1ÞjX>g3ÎËEB/U¤—v±®†Ës÷¸Lxßź,WØU®JàkÛ0²¬w±®†ÃÖÒî0ÛwIkéJXÎu®(›r±®†ŸLdMé˜ødªa¹¦ô¼²G‡u5X>çaR6°®†£jiùOwƒ…jiU°üºS/¯ž•FFhÇÅãÊp`ÑïÛóÚî`],”áÀrlÄ"Ð×Bìb¡ –ó³.L†nNì…E7 Êp`˜SæäBvÛ°E*VÃÐrâŽuBå.ÖÉp`bY×;»‹u2X>çlé)Y&°N†Ãy#¯åÙj'*ÖÉp`;Î+«Y ÊÿpÇŽ«a’ˆa¤u†` ÊU1)™¾°N†#ˤn/‚ÛÔr âƒö(û¦ìþÀãâ·MâƒÕ0ðÉLJäÄÝ6ñÉTà .([Ú°N†U³•ô=¡Iîb –' ¯,E¥‹u2Z.[Ú°N†ÿF¾1™¦åb`ìeÀÔrö7:E¸©°\ S˱B ·–Kaa—+Ï|Mï¿.ÑÉ0`X½Ä *?wHõ’J´¤7VÜdõ,p·¤¯†¡å’ É]¬“áÀвlT@®Ë•0´ì”]†I,WÂÐr‰è±‹u2Ô&3 /R‰˜TK«†a­­b“±Õ0ˆ+¬9áÀr<÷ƒR7ŸeÀ²Uz¶ÏFJ±G£ÕŠƒ ý¼¯n$P &cÝ––Å,ïy…g¥¶â¸„5'D¥]#;þ[©V!ãœtŒ, Jؤ–«`dyÖ¶GýR°æ„ãk¦4€…k®€Aý +L½¶«/Ç»0¨Îj•MæXsÂaù²ÏªEëÌWÂàlÕ÷Óž-4‡¢9aÀ°‚ý€ÔqAp—T°¯„çÄ‹]ýÔ&ž“jh!zó£X{¤6 ýƒòл÷lâþAÕ°|ƒÇîwÌ1%7ˆ¿A "¼«F^Þ¸×K<§p¨!š,¿7ñß 5 =©Í€~#±â¡þ¥àœt |2Ùbœ;øÔËic$DÙΜÈH²9&Š|¡»ÁîúÂrW%žmøÀ$a¬ áÀEˆpíâ2•!˜Z=æ0l*,— Ëà:\W[ÖàºN’z"žÉñÆAÆâÿÕ+„5p…¢²GãâÒ©¢Í<€[¤?8ù Â8U-.¢Xe‘×´£DOÁ  ’î-1Ð{Õ°p‚Ë眼K-ßWï °p‚ËÎ@ègQ,œàÀrbOóWh Í âp0‰{"Y¥÷#Ñ#Õ°ÿ§ƒ‘Wrƒ¸Ú–ÎêÄ-ÛÉ`I®û§X)êLáÎúÂ`l¸¥7ˆ8ž;Ö+Êj]*õâqK÷Ya]µÚM½Ë8ž’ÃFO“²]Sê ƒq'  ꋦ…õÂø Æ€åõÂÁpàk¾”:ÉýgÀÒâ ÏN¢Ð ÅB_Çf ÆsOs!öõ£Ã ¼hy•Èï.M¬P¹ Ä L,矕H“ dp`bÙÙz¥„[EËå0±œÍŒŽz µ‹–Ëab9Ù¾î-—Ã0­ —áñÓù@uƒ]’VP U¶Kš®À®Q ·Hå;Ô‹Kë8Ü`õ£<ĉ¡CÀhðO¦½Äsûº5ûŸ9°œÌã ¤þFûŸ90X&â$Z‘ŽÂÐU­°ØÿÌå2aÚ%a÷:)ÁÔeNad¹à-°Y°\ËÓ„Ø©V~Vlj{Ä&<#Nu•:ö™§‘Ÿº¶+t×Ü\_X¼²DÔ:v°s`P¯ÀñTŒÕA:öÆs`bÙ‰5ËöÆs`PqÂé•|)ØÏ¥ÀÛ sq*;K{/90èªæ¬P—ŸRÇ®N ¤ãÏðì¸0δÍádª…MG‘_Œ–Ö±«skÃguœè”·|ÍÝCQ芩â2š´?l,w2þBÙàljNŽ0H_7ææÖN§Öù‘ĉʀ¡eÛS-lË•0´<®þ2êÄr% -S¿6‚Är% -çíÏ´—Ñ$–+aôýXÿº ©  l}•æ Æj_ضvÛÓ(ÖDµzÞšmcA„Ð 95Ù‘Ô îN ×è (‰ìyw¡¥Ú16°‰ƒÖ3V¶ÝÀg!Œ—6 [V­^í»º×ýHQM1Ô÷ à…µ2=çD¬òK,c7–kŠˆ‹\£]/ýHçnsV¢/«žÁ¸·–ª¡•h›ªg0NËeÀ²NÒkš =Œ& *xcÏq#Í‹-s`éûŠÃ(õú j—Eû‘8°¼æšÑŸèg$ìGâÀÐr’—‚×Ý`›X®„a]ˆ<»ÈÑÁ8Ùƒn2ÞØJ݉§*2ŸÁ]ÜM¦–{Ѳv“Ù;ÁqX v¹žX©bP<µ5H%1 -çs+ð#«P`¤ýHŠ­\ï‹:@¸ND•0²œÏ¸:¸A-WÁ`lØC+%»ã * ˜ZÖl¶ØÄåcݼã‘f™À~$,}2eí&3w¯cÀRé Q2`†iŒÙØ7õ±´8^Yמ n­/ ^Š;5¨VÀ¸9ÅIJ ¸³¾0¨C%\Û³±¤òª5I ,NÃ2•r':q`hu¡p‹X®„ÁIäÉx8÷ÀXmÈ€åi2-)ŒßĉNX^s”øŽÈE;*ÇBï 8°¼æ¾QˆAKô0Œ.…nB~À4ºT Ó² ûa¸£(›P ËyÃ-¼ã4,ƒã³Cl{Eë™l•À^,¿n×uÀjÞp`EŽ,Ö+°©NÀÑà¡F"Õ}V$MFôKQ›x¡çÀÒK,JºgpĪaP°=4z£Ðñ]0ÿû $âq` }Y ûQOw•–K`X·Çöu}¥-,àÀrµ²3ÙCõÙª…s90Ìy,™Ÿ[…œÇJX:C¢Ôõ´e@Z8ç‘˃XÅe Y”w˜Ú¾—{e ¿-œóÈÊ"[‰AÖ%…ñá‘Ëo0HE0šE90´ì:BÿR:Är%\|P=à®òi”À@:êÓE[¤A9UæR7)q›Ë=Rß*¢XsÂåxžNJ\C-¬9áÀ°œ·Ê Þ/7H-¸JXžS†v:k¿1R-ô-,PáÀØòÌ›«†[˰ܙۥ“ ¨p`xšÈ³ü,_=` –_÷À£8Oy;Lã‚í Z^£H@ôQÂ8]”Ãl¾gé¢Ò-œ.Ê¥$à =aé¤-œ.Êå® öæõZâNåÀ`Þð#‰u›@ì¬æÀòë¥QlÙÚĹÿ XŽ úhi‹4(gÀ ø’–}V¤6–×õ<ß5bSY«…ÝàÖXˆÆVÞ-=‘-€»¤ÆB% ýüþÈÑé ZøÜÍÁž?,{tøÎáîKäÇ{Aùè°î‹C!ý4Ï[ErˆE¸=Ge$•0µŒ×6×–Kaj׃°©°\ ƒ^«\ašf®«*jzJ¹{Ë¢ÒddÏçUú” P+p80𴌾ýÁDuXTÓ·½’L‹jrX¯ lãä,ÛŠiÝ%c½(–Þx¤V¬‡±ëÞµJêB´±\‡#•rÉe`¹N4 ÒÄ ÔAÛvèŸE”ØB{Ä«æ$mXàöúÂr9Îe¢–áÇ¡úšq¤†ÃÞ:ž¾ðE»Nú–VÃëeYØ)¤µ«f»1W¸Ž xýLË£Ø(ð‚A¢¿´IžEl[nkåWÂQ+’Ú¤¬`ì†ÃØÓ^F6¾¨‚å;ì—õßhc}–³]P&phãH,›ˆ¨ŸmfKkSER5,ß °JòHÚ8öÈÁv;*©DÕÆ±G,-‡eM¹Û8öÈåñ±ïÁÈO=$}Hoä9°\¯Â²2íN±î¸AòKŒïÙžÀN߈}+,Ô}iãí¶ç•IT:DîÁ€åg5qí2‡š°´ì‹ÒËÀ0ôŒZw'€©gt£- å.i¥e„鸡ƒ¸ªSÙØèà]–9ÍVb9n¡î®“2?ÕpÑrM w”–Kà¢eS w•–K`°¦Ø#‹j®$Œ×ã5ðÈ)ƒe>å(–vúêà–Ë æÄ°„6¤ƒWXLŸ†/47X/>r^³ ô—Ñ ×\ ƒêYI^YÚ÷zÊ×M´N ¬lÉ\áÙŠTÔÖ:q`ÐÇÕ.Yè; Òǵ†®ß<臺ªC¸C\¿•°Òr1ѼC´N X.m£ÐÈCÓ‘ãZ‹Eh$Lö X:•ݤ·+-|Oq0íàý†5'ú †ãöFÜ¢-*a߸¾µ 90uH1KL-;=¥² ƒ;ôRÎsîíy$Z0ìp`õ˜¸ú8ØáÀ°OêÃVVÚîà€ýŸí²ý8p`ÐÁ[¤úZ¼C˜Ç×—&êàÂо§u-tpX@ds#ÕÃxgžÃ¶Æ™ô_¢Yè`üл"4Qúу3`9×õze/…¸Ø° b>Ò\é`‘–.œYΣ;2§”1`¹í— Ñ.> p`k›¬Ð§ÁuçH…Ñgkkuñžßv®QØ.ƒq—¹<‹¸n¬/ ¹”>:Ü´ÊJ…mCC•S¹‹wæî*#ê÷sqO£Û˜£óFïr9°Úr­×´–5°Ú²Y„M­e ,ƒ$Ùzê_ ÞÉp` 4ïY"ï%¨ZÁwÉN†˵{2˜ŽÞÆÁU 25ÓT8š2]â9aÀr÷ÕËCVÒóREBR«¶m[cU iòÓÅ› 6'9,t0ÝœTÃrµr{ –¶ùL/@7ÚZ÷l¯)AR&ï’H,F~$C¸³©¿V|)Ø5Ä•–MÜÑYÖÁPYwö5/Gb9°tîÄ‚mé2º8ËA×—² vGb90ZŽiUAwér\êAì»Ó¼ÈAH_JsŽ–®†‹–aI1×”–K` ³(i5œÁDŸU C×}’·×Í&¯Ð¢õƒ3¸N\÷•°Ü^ŽSc­GÞ¨)në³ðzYvl•iSA7uסƒ•סƒåuLD`hkd4®þÏ€Áh þÜV[ÖÃ0©ÌŠ…' ׸Š;¤Ie•08ò†}íž1ƒ»øÈ[ Ë#¯›Í‹±•óÀ~Z¸A\°ƒ-ÏúÒ­ýh\SZ.r(.ûdñFž“ï›Ôƒ°âû.‡¥5ŒE^¾Dy¬É`!œèWï Fáj7d“âr›K×SæÀ²wé"l*ášÚ²E®m·äq=e ‚$#ϧ%•Œ½ X~ÝvìÙ8UÌ`ܹ‡cˉ5Ñ]F³`¹ÍKwêÚ†£u&éžU , ÜVY.ƒedœ”}°X²“MuQ/!²pw×è¤[Bhžsx «ay Jg$ÜÕ¡5kî&ÅD^ ã#/†©æú’X\'©æ•°thM=Ç87Àءŀå,Z>™“^q@sFãÙ¶¥-{”ÁXäíN-O¿Â’ÚÄã(;!x«]õàÇ® ò=l»dbÄ® Š/[†Ö —Á8JÏ€‘ezö€°I-WÁr×_¬+€`\¯ÓŠáL:÷DiÙ£k®/ œ÷©›mŒX(—cœãÍ–•Ë1.æÂå×Ù£‚Àhã*QúRpç 4e¥SIÞcÀÐ2 a#¸F,W H_Þ_$û¾…«zÎ8yËôHb[?#áä=Û2j%Cçãq` ·5Ì2¸I,W°§f6Ùo·”Oƒö­„aîÄ0›¼¦š¥ ‡m90(°›æ%£E ·˜ÆËĬb»977g„qRX»IJ?–n§TX%çAììäÀÒ —÷âö0R•uÎ`ìfÀò¥,x VÉeàm–kw60â@»Ðã; ’C\¡-aŸÁ؅ÀIÕã$N…rÊÅÙ\Q(ìÄuu[5¶åÀ`2÷ 7ÕÎu8›‹Ë=¿]:?ãl.,-÷Ëaôº9°\ý¤ìŽ=ýX†¹B;YˆS×1À—ÄbÀ@°“"ÃÖÄHó?«ô ÖÅRs{š–ÝáÌ_-éÀÄž~»³D6ãz¡ë£ÚNÆ',½3­öˆ€Cï]s¶ÇÌf~SÎþîÒk®‚¡x"ÛXšË¨ÍQYF% ¦FßJ<+DÚGcÝ:± «a6׸ö():;ks´jA% ³¼½¾— iSu|¬a|60wVÇQ c¹íh0t…¡îü’ÁMüèÜ8× ©O±5âìdÀr ;p4åñ3÷gaÀršk;¨ åe4hÒhoäùŽÆ2ž“‚^îê_™_ŒblÔÐþkKsIIã<Ð^jÄ:åP³†“’8°|Îq>”ÆVê)BT$qÞ ÞWÓk¸havÊŒRk”PÎ `Ü:!ú܉ Æ­°<Qè¥Q²~Xƾ g$Ïò|B‹b­´¤\m³†XŽg‘x+„ãjvZp`°ñq ;c=–óF”Œ¦ºzéŒeF«û¾5ÐŽgì´àÀ°Hrž¢N¡Íà&)’\ ËQ7X…¾º*«\dzRý5c§rÄB uK9¦¯s•©jµÂ'o±¦A²Ör{Kê{dpƒÀúÖ6kaæ®ðì(Ñ,@ø0Ía81ÖêN2¸E‰•0e¤n¶Žj~ƒ Y®Ïé/£C-WÁrðG~ÙÄ‚ -'®Ë•0²l–À&µ\#Ëõ¸N-WÁà+ôµŒ2g¦[É`$Œ›‚*B‹°‰w¹lÕ \#K›Iw¹Õ°Æ²Y€M½e5¬±\/Àu½e5¼h¹îN­Îµiâo†ÆÆšZŠÕÊÄaÛa<ö’t ™‘L‰eÀ èwç‹Êbš¢årX6ôZó nbËÕ0²LÊ!¸E-WÁrãê&}§ä ¶I§æJ>ç$Št¬IŠ'×±\¨[Epks ã~÷nè¦úk&;s,Ù–uº°®‘jaÞÀÛx 䉎o Os¨1qíq,ƒ~³¾¡š| Æåã°ŒKG“0"_3êðaV5C\ Ã*‹6ïpKã>}&õ=,{¢Ýœ˜ RߣF–}+˜š§Ñ¥–«`p\²òªßkA9#E8×ìŽý ’î ”T[«qb‚±`‡ËR™±SrÄ3ñ ¨žG)ÕÙöl•$Œ7ÛX®ƒ6UpScY Ëöù¢©=â™8°3-Õ†˜8VÃ娹ÅÞ½Æcc ŒÏ*–sÝ|ñ* Œ=T ?º^„yÆ¡ŒQèD…Þ®‘Ê{¡¼¥;Ø\_ònhk &.eÌeôØè»—f0H¸Ámßö4®N²¹0¶<Z¸V°\cËv ¾Á:Þls`l9N¢žª1w× –+`lyÔWÂå [& Ü,X®€Q&v`xkàÍÄ®‚Á‰>2,m<¥NZ2`9×õgbTW÷ºñ®€/Z^'3A¿Fß –!’Qê[íàÇBl Õ˦/[å篓–ν¤lí®c¹4U'rá‹‘ôòˆ[a{YDZ L¾îÈ÷Õƒ¿VüR*`p\rŠ;*“#^5,…$¢¿6 aµ"6QÇïç$ìg`\{¼_<‹@9°\»ç£4ru• Fo)Ð(ÔKTêxgÎ¥›e”ð-s`tÍFÏZc/Zl.SvÍU0Дeû’€8 $Ü$ýî«ajY7Dñi‚Ë“f( ß_¥…q»a,Ï)NXâX¨“®@ YÎvkq:ÅÌÕ nPËU0’a¢H8øÂAñ^C~Ï[­þ¬Hð…ÃBVìéõ&I¢ª†‰eC#¥¯ãF>Y}pu–XkQ90zΞãŠa4Q-šX‹Ê‘åàµ\J>•gÐTÞ ‰ˆ1`Xwýwí´X{<ƒë¤n%Œ’N„Èw®ŠÌÕf½[H:©‚eìØwçÓ$ ‘(ÀhÔq`ðœíQ⥠öÐE5K ªayÍSÛMbMªy“4šçÀÔ²æ³"æ9°Ïý2•i4ÏÁî+× Ùžá‹´˜{LÍs`bÙ‰¤Ü(Z.‡á—"F1®¸aÚ½©¨yß^ÏÎæÙžÀøÔÆ€enb®h^H]Ãö]+)Þ ®ÕÌ€‹–…«p:‘®ôÔ³˜Å¬ 'µú:Òž,D"{IŸÚ80¶#¦íK*aTÃÎ GšèR£F˶WÂrížxQjù󚩟90”ÿgVG7}áó ÉÄeQ¼>r`PVß=€ñ7È€‘e}ÆU£Ö¦–«`Щ9LõáàFtj®†åž¥QÌã0ú9°Ï 3_µFTÓÀ§c¬˜ŸUyQ ³¦žŸõpaÞ@õælªæ2Xf{xI:²|u3ñ Æâ%,½îBvžÉkeFiqsÒÀaw,-'F¶ã CWéêlà°;ÕÇ=KxÚ×[1`佌]71RàdpÁ{YàVÞ-#ò]åKé •°|Ζ(ɤoàli +͹¶AôgÆÙÒú™/Ì_¦-„*a½$ÒA¶‹X¥HX±À¥å…$FÚé Ë8°uϰ’ÄZpÔ—×A Ƴk…ž­ÛÆ×I‚j(ؽ¸edk…æÑµŠ0‰\kã’*ÞÍIagÀ0ûßíESÝû‘80HÁ±ì÷šG×$تaj¹©ƒ› Ë¥0µÜÒÁ-…åRäÚúó›ê6T4×¶–³hêñ¨ç{b¨pÁ5°ƒCËq’mOâ$š.(à:±\ ƒúà–çÓ<€¸>x5 w2Qv&í%ѼòéI³½{bÃrò†.É8¡›Mì…àÀjËf®i-k`d9çf½—aRËU°Ú²â2êZËY¶ó3ú`¢P³4±‚Ëýóеç£Qê¨  g0NÚfÀrÞJÊ”g0ž70ZguŒƒl—Y¢M2?3`lYĨþ9„ +l ã°" -œ9à&‰ÃV J¬ëÚÞX³5ñüÌ¥e+) *Œýü¹¯5ߨe›s»xÍ8­ 0"}5Þ n¯/ ²uÒ²D20°”ˆ¥›8wœËðŒ^Ô³-寵‰sÇ£Ä*>ãBά²ºf«ÖÄ%¿³/DbNg ®8°\4gpM ׊–Ëa0Dm#™ÕñV€š¤(†×lxÙhFmú\'×\ ƒÊ˜¸=í â£4F–qWA 7©å*T”ñÂ5ɳ J¿„»¤¢L5 œNißuuþºf—8ªaHº#÷­fÀÀrP¨L$á ¾0`h¹à®ƒ0Ic¬†år\3¡Í‡mám†–{z-D‹t¨dÀÒrÝÎ(oí¡~tø¸Ä€¥åF9ŒK Xn¶½Ðêëo»†80¨n˜Œ„ÖÏß®! FÙÍWoÑ—[;ã †‚XÛ®r¿$\§m+aiÙ¶Â…IvbsUi_-âbÀ Ëy,¡›jËz8Q£Ä׿nìâÀRp'©ïh_7v q`96ú‘Æ®¡~`8=&0.1"DIQºNf±‚UqɼìœSV•š[¤Ú^/˲*ÊÊ ¬Z ï/9°œ8ò…í2AÀ8†Í€e¼¡9²Êî—ddÀëeY>»Ä*¨„t { «aà•É>l§g~h“âãhc¯L5 ô³VÙðow°~¶–qÛÊ`mcÀ \Zâ ,#‰F©êûÆG,—M{ªo¹’Á8ÚÆ€A|)/új£M?„Ñ';¬.û®pÏ,R0ö7Ò:ܳ€ÃƯb˜Õ­‘ãE…çÜÆw\°Œ.À •å2¸`ùúÜTY.ƒ –wö5’è6¼sà‚å0J½~!Ÿ²ïX~°qYõÒ6¼s`h¹$þß&w ʼn¾g»¡€mÛ$lRÙc%,¯9KЍ¶qàƒkvú"ÑíeÚ¤ò85®†¢ì2p£L «g9óÚ¹®ï¾AÏô7Ø$oÐË«”©«¶q,ÝÙ(êë-coA”g¦†æë&%¿×ƒlU‰‹“ >Öä-¿ËSw~Éà.í^Ãnn¨­¯Ó®“ÜÄjX:Zk1g»Ø°ƒôaçÀJ˦6u–u°T~Y©=t";Û1**~‘>ì¸`YóRp •(^ z.c7*Æ–…î ÔÆ±80ÈP ­”(T ÜÆ*Õ0²ì/¬ÖWÛ8“žË]®°Kª”‘Þñ¸ðuÔ—#*X¦›ssúäø6Ž{pàÂ5‡êYI8°<¦Š ÀX‘Ä€ ×OUâÄ6ލp` àH¬@Øš4å6NŽçÀIJÎOÜÆ™ôÆÒK|®í6UVÂrÛcùiÀ‰`ô90¬m*„KŸÚ걕î8Uk~Ûø Æe•…æšq¬†-+³Û8VÃå¢ÙSÔÁp£pI>£+?+~áÀ2JŸ/ÅFv©aœžeYÂöG(õÂhlLÓì,èäKm\ñ‹ƒo°,å·+æzvëKuð–ƒËH¼~i`©rŒ:D<΀åsν¾Ã(RÝœRÆA9R1òR7ª^ÛÍq`ЯWrx$­{9°¢AYm.N†àÀ tœãëÛtq2–[5¯Ì‹Jšs`é(s„Qv8&Æ€A$ÖYÐV]<68°<Æq”ÒŒqS1otñBÏ‹–eæ ‚»JË%0Hge{~]xœt\åÀ°S ê_ žÌ90¶¬Ý1’^®XZžz’!½\90¶Œ•Nî,WÀEËÊ].éåʱew£0.íÉå&p4úÐéåÊaz–ù¹&t*0MϪ„¥å±Å%—Kš1`ù4ß°òª…ªŠæ-ÒQ†£RµC+±¢¡âu·HG,u;-´0ú9°Œ ˆ’ªÕ-Ò÷…ËCzY[çiÃåü¼¦,¾%¬XõRðq‰ËÝ—pôYb-Ò$†Ëã’g Â(ïDÉU‹4‰áÀÀrâÚiì[ å Ö±åjX>gkªßB´H“Œýü¶¦þY“šôVà=µ*—0>Åfö±êj/µH§“ùlFг'bö”ß ^49°¼ '-ÏxÑäÀR}锤†d0Z490È‹šZÚ3l‹¶YÈcÆÑ¬fgAVÓ¢=0ìL¼NRZ!©E:{p`•åÑ≠À¦Æ²–®Ð=ø¸–_JÏé•Áhó8ƒ±¶šËu0µIeV £ÁÏa‰‘\Ç•wÊj wH‰‘JX®°~ÔsóÉËðŠ„ FŸÅYû©­‹ˆµj$¡Ÿ/DI~C‹´ˆáÀ ZšáŽþ2ð:È€CrÁ÷RW›È`ÖI²¹œfm мòlb§“Ÿ_‚Ö2Îâ]sÍi~ÒS¼n’—œŽ[5hî¹Ó\ˆ¥C6׉¹yÉüð‘׬)LŒ8vÌåŒöÊ&F;æÀrÏßK í† áb+ž*X^óÈQèMC_¨&™VŒ2`°ËM-C×%#ƒq9% :¨ÄîL«j;–Á¤Os5  n"†yƒ·@1 ¡ÕJÕ¶WÓ]F¡¨FL-›:¸©°\ ƒî³¡› ¤¾FS%®Ã,¿ÁA/…¶Æ‰Jʃå/DBâÒ&#õHÜ«K-åÊ`R¤F–Ý©k;ê$‡t,ÿ‚X5늢’€f0vV3`yÍó^ldï$5׆(ž%,ÜÐ)Â84öDþq«ÏÝ ¦äÀ¨ƒÊÚ×­ºA¬½äÀ¨†wö]§Ö@(á­á]ƒˆX^Ƙ®lâˆX5¼hù¸Qøºã3Ž=òP5Œ¾LŸ3΋pCñœKaj9›üÕ/¥©°\ «,«¦‚NKcY «,çzFOià˜&.>ç©úÑu”Ϲ¦–5>ó^Ž9°<.Eó%{$R¥Œ#Ë+òoËVÝ ©RÆ‹–5l*-—Àز퇩£†ëË0d8ÁŠ8Á奌ËÏ0`byÔSŸÚH-1,-;^RvèKáÀIJþ2:EËå°\av6ãöceKº ÆrJ Šñ¸‰6­ ÕÄP ó&ì(ì©2RÓÄÁÄl/êGÌB¸±¾0ÜåVÂŽ-{=x±pó݆šnâÆÕ0̯§zxËȱåQ qp4ñ–‘£B Ùïµup›­‚©åŽî(,—ÂÔrWw–KayÙ`ÅŽ%K\Ÿÿ90XK¼3oì°LöpÄÔÑJš¸½%ÍC·d.ÀzJ *bÅe7ˆÝÄ4Ì ½t…¦\‹” LâìËŽG)L ¡°uý¾ç{ð]#ààÀ° ¶pmŸò$Œ˜ZÎ •«žF§¦°\ SË+P>玩°\ ËPMdæN\ÿ¸<Fqƒ8Ä€Anüp¬Ío‘ oHƒì©ª¤y‹m›aGA? &óŠ$uØ"ÇMS×è#Á»„±Ÿ…ËÎËVè+aì”áÀȲ~Ý¢-«a°;é—èƒ[¤|–לº¾¶ÒiãNˆ ˆ¨RKØy71•R³…%8¶SÚ*=ƒ±ÞÝDqîA¸µ¾0Ø«Mn¨ü¤„£+² I¢ß"%ì8°ÓÈééÊ϶ EÛ„!úÆÈ3@ÚŽ„±#É 8·ŽÀXylùy{pº0ÎËÍûûæJ Aä;ÅËÀNs,§ÜÆšý¾²}p‹TKãÀ ÃHîûZ¡’ji˜ZvýÀQ=ºv]a¹––û½²IWÚÊa}è‘TÚŠÄ¢ÃD ãù™ƒà„;žM‰¥ðÝ·°g-œý»§ñ’ªU©°JöH¤§ôžëëo×}O=ó-gV½pƒm¼hr`¹c4WxƒÐ€“4€q”-ʼ®+-—À ˆ·m µ)Fí™Ð\–»Ëé „nh¿„n!ÚëÅI”Fv¤œ HÍ/ ²m{Qš·Iò ŸtŠ&5¿80RZÄnÒWÖKo‘â¸h9$ÅY—¿àÀ ~ìƒé¬@œ(.Ÿ°œüý…ŒÓEHñ ¬²¬ðA“âXn“qßp§öp HØÉÎåÉ4{)+u5 ZmâdgÀÈr¡’$€ÛÔrŒ,ÓüYw¨å*¸`Yh.£«²\Ë"£a™¨cÞZ.YƒÚ8Û–ƒ6‹ÅƉîÌ‘6‹Õ0h÷¦½hjO%>îÔHmÛž—ä¸)ázm}aèu ¢lê[#¿èüí4hµšJ˜X&ãÀfÑr9 JØÉH µ[¦ƒk¼n;â‘0lÕæ¼ƒ'óEX™$Ù!F%íÒ²ý.À€5³ª+Êo°‹‡èT%´..¿ÌAg¨$©¬‹ƒúXn¡S¿d*èbo'–.°ì´®½A,LçÀÀ²;†)ŒeÍ XÎÏOd»‡šúë&Õ=80µlêà†Âr)Œ,g[µX7©å*Y޵‰C]âUfÀ`*DäXZï¾ð¢å#£žç{éÂq0eM¸S–£•ÆÆÐ ãÄ+n¨º¸SÆ–Ã( ,_âî,WÀÀá#êFßóQá:¸=‡ý¨[¶-ßÏ3âèj•Áµ‚å [޵×"ƒÍ‚å [ûZ¸^°\cËó–n,WÀäš#_Ù%6ƒ›Åk.‡±e7I¢D(áVÁrŒ-÷"uÛ£ n,WÀØ2‰ãA¸S°\cËIŠõ v –+`©é……¾‡¶¯ÆA} 3Т:Ë\#h•0±ì†ƒìB ÓW›EËå°Üªyv-^ ™¾2¸Ž+eTÃ*ËE—E74–µ0y·§ž±ç„ƒº!3J½´µçpˆSËj…V×–KaéMK f0®‘Ä€e3,è錓°tA+öÚFcƒcˆ©½ŒfÁr ¿æÂ\’ø(a\äš˹.±Ë^ öPq`¹“™ je0.ŸÍ€a^M4qIf™„qäKÅŽµzÁˆÓ(VÃx÷Å¥Ç5 SmÔ¯MjÊp`ù4|;Ô?:RS†˱á cZkÏ©)22ö’Ü­–b·I ;b‡ž£)¨”ÁÒ»F–mí¼Q#Ͷ0´ôD€»gAx90°ìå:kà‚¢ŒÆS.–ma¸Û0„ñ”Ë€åà‰Þ˜Á¸g.–K[d€±³šƒ‰qÔ³t…æ3o‰0xÎ")t 0Ž'†ö¼åè-£ÁoÛÖÀˆ½žæƒÅGi,}Œ")™ùkx™àÀò &A¾\9#[Qç7ƒñæ„/Z^-\{”èöH5ŶýQêùŽn¬/ f~'Ðv@k›t毆å£óKr¼3?: e0–p`P>;M¼é(V/š&žÌaUt)ƒIñ G”\F|VVÙ5“Y”ã>k´Ív±tBþ›…>0h?c‰¯)ÿ—Á¤±M5L-BýRH×cŒ,J.£I-WÁȲW·¨å*˜ZÖÞ`[a¹F–;[†z*_‰Õ/—¦¾§‹ d0žù°ÜƧÖl²EYïÆ›m¬±làšÞ²–ÇÿÕ¶eXpÀ0V'Î`ßM”˱‰e®¾”l!êx¿ÁË"tfW¥©ŽC«XZN„HÜÐqW£QÁsRÇ…Œ9°Üô#ߡ嶌K1`°ctK6õ.Ù1Vðñª<Ç[w´q%,ƒãî4; ë>«:7p`¹§±XìE;ص¤U&–c¤ü ¼…àÀË6U–Ë`9oÌÊÌåqlÕ×ÝÀNT,¿”4_"Âø ËA! ÖÐ/ÀX¹Ê€åš2óÕÀxµbÀÀ²_ ãÕŠw–gˆÈž×Á¤\5,Ój‚xÜÖîŸØQÆá,™d¤É5†…$¼`¤sY4ê´D%,ŸsbÙ¾k e%ý6©†ÀA)½áD»÷¢X:Ø]?Ê&¤&0^9°ôöxþ0å‰*˜äs`ð¥ôFúSÉ=æÀ 8ûi Œ¿”ñ0¶t *Ú$e”ƒ¼¡>©’‰a’‘T ƒlµÄJ£¥±x‰ËG—Ž|ý¨#yXn{Òlg®t8¯“#Ë£¸I-WÁò€Ð/i™“Á¸<––'eÇ’‹ÊåTà9¥0ÖÒ3`ùœ}a¤¾þÑá¢9 XŽç°,DÒÄu80xƒ“²—‚ݳcáQà”ibm’Ê¥ÓÉõ}Ã]å–(V¶Í`O0Þ¹2`—_ÀË!Œ›x3`ØÅËqCM»û n“.^•0Èí) ¶µëXáÍ€å©Æ+¶1†0V=2`0ž/NÇž;QÍu¤Ý=J:5µI»û¼vƒQÓ~)¤‚#AÍUA”íO”{Û¤ƒ=í†eo8°œŸ{iɦŸt¢æÀ`››ºÉ„xfŒ%ì X*òFÚkÇ¢80ÌeùA¢¾ŒI«†aôÅ»¤J?€[$úR ˱Å£¼`M0;Ö:‹âÔD,½Ný~6ÇiùB1#áµ›/Z^U·WÿRpô…ƒ68n:« ¡~)xWÀ±e7´5/§dp`9êü´']ð¸E4«)“:uHJÍcÃö=ƈ¤Sr`9‹æ„¬0ŠÕ0v2r`T ¬Ýi4Õ/¥ƒ_˜Znéà–Âr) šÕô<ßµBË_X½¸1–0ö†äOC"*&Ùà¢Ì×é¬7,“ˆjÂèäÀ`ã:.l7$LZšs`¹U #aÝgEr/90¶ìèa³`¹¦–5Ù,]œbÄåüœ¢Ú6 ãÄ ,¯Ù4œDë)ëâÚ=Zî•Áub¹çîØMlX¤Á-rqIž#l„vñÞÅ;,ßàÈ©1ö,ä%aüus`Ð8QgÖ{I_‚0žùg09$Ø,º¬¡.ÊÄ#1Ô6Ko“ÜË‘ðòf–ÙUä?Vxt$C2qÏÔ[Æ’ [Öíd:$C’Ë-q^‰Šú¨ŒÅñ „K+?’F‰Ó è¨ë I J¼%.­ aœÅ€A0O¿ZuH#–Žß4;êšuHN –lYûÙl‹„F†±‘áÚyùmI{{8pÁ2ÚÛ¸¦²\Ë£ÇÌažºJ\‡ä}q` Ž7¬QނñTƒû‘8°Â²PÂ-µe= Žÿ‘áêZ¹væHÁ;ŒDqâ…©úÑÕëTXËÉÊ›‡Þö 0΂cÀr³Ä^A{ƒ¸k(¢@£èϰ‰E†¾òE× L›ƒ#ûëÜ0 ¼é\MmwxãÀ ÄØÔÀu•å2¸`¹®•7X,74pSe¹ .Xnjà–Êr\°ÜÒÀm•å2¸`¹­;*ËepÁrGwU–Ë`Ù˜ËrFù_šÏ Gñ80w9Æ»\ cm³N5(MÀ¤0w5,OÇ"_µ3Þs`hYÐæÙ®Ë•°ÔdÂõ{Qì½äÀP²ûÙ G™,Å£kÉB% {¨Z¡®UwHÕJX–²ß çu“9V Ë.Û^âs –ò†ÙZl¨K{tHÆ/¦M¼*¯ C2~ƒÔÏO#F`å¹Ttí& Þ9°ÜPå^Ãîqa¼¡bÀ`CåQ*c_.žÀì`‘ÚÆ[bL-«ë&tHSz ¢ÿ ¶%†kk^ Vàpà‚åI/VÞ`We¹ F"ªAdŒxF–p}ŽŠ¨ªà‚åž­¼ŒzMe¹ –³hÏêõ|W7ð6žËk޾ n‡4çÀ¤/·n™¨µæŠ}¹ËaÚñ[ òVõ/…A™Œ‰•¸Fß ”S^a90<ˆ¡ž‰®ÓŒ²¡v¬á6eX.šñBêÚÃx)Šàtj8áŠËÚ~\+80Ç¡e³ nË•°|Ýã¤Ð°Â8Ì€¡~cº©ºè^‡dVs`jÙÔÁ5…åR6¥ÏëO¢d¾‡ÍàiJ_ CË^˜·¿P®°&öªq`hÙI-ݼaâê`ZÚ É nË•0´:Ò†CËe7h’o5Œº³º‰‘ç(6'õf¡;k,O@ÉȈ³ŽŒ?+L-‹I - 3¸­°\ SËy@¯ wÏàŽÂr)L-ggÿbµª“ ˜ZÆõ%Œ',ìæº¦Ü*?ï9°¼æqI h‡äls`2׳¡©>Ó!9ÛXÎ Âø Ë€A‹…À K`œŒÇ€åÓÛ~4Òß ölóª³#u*D7I;×¥»~ cÿ†ôrØHT:¤u<–£n¡—D†e S ã –[{¦ŽW÷è\b¬²¬¼Œ†Æ²–¢ô¸$Û°ÓÀõë90(c”-k†5V¦PuDÊå†>8NZšs`™÷¥ã²‰çöp`yl‹Í²ÇAz@1`ùV²ºZjARã$,„AI »ÉðæÀ š…( N4qüŒß}ß m#©‰ãgéc}Ÿ“i×Én5u¥˜Â-ª[­†a#Ð(4‚~¨tô·°º”˽•!tЏV´\+,›JØT[Öà Ëu%\W[ÖÃ Ë %ÜP[ÖÃ( ÎyëàΕ0iòÀåŒ.Lõl‹8’°üó2úº6’6qæ*Ê7@;0P\Vkj=vÚ-¢¸ª†AÁ7\5rGêY´ pr`ÔôÓÄ®;—d£é‹ƒªÕ%U÷:¤wùHÛµ¯›${0`h¶Å+Àmb¹†ŸÕÄí‘z&©ø:G®­ÓÚfpû:«aù§"öM¾h§ƒ·XN_ŽÓ+,±&B œ¹TÚV¥©êÑuˆ§–OÃñò¶FMsèàÃÙO–Â˦îª,—ÁËj%Pw[g¹ .XnhàšÊr\°ÜÔÀ¦Êr\°ÜÒÀu•å2¸`¹­*Ëe0h‹÷ ßÓ„Ä:]Òµ—z†íM@…${p`jÙÔÁ5…åRXÎÏV¸….>>Jo/9pÁò4P‰¶»x{ÉeÁB»ÌgÑÅÛK J/[ƒ(ìû Ê×MÒH8°\S&%µx³±Ý—£`ä„¡–guñÙŠ«M…¢KZ,2`¬l›–úüßí•m0²,( àµ\Ë€Š]và%‰X.ÇÂ÷²S^¨ŒÌuIâ–ž²Ô_ërU°ï’Ä ,ÿBhžÆoØ%‰XN¹¡O§ì’.F9¬ jvIÆBìÙCK—2×%‰8°üRœ’äÒ.iL”ZA/J,ÝÓ0׆qÊl–ñ½<2·øüLD'Õ0°œèµã]’±ÀAg<«P‚¤O`5Œ,›%pƒZ®‚‘åz ܤ–«`d¹Q·¨å*XÿÝDxnbi^ væö½È°©¤Àh ü$¶õ—O”‹ÎVªXû ÎÔKÒ™ëæM«ãY&‚ì:h$%…Ï Âõ…¥wÃ&呈a« ìf4®ÔÄ€a_[ÓñDì[ J¸EúÚVÂr½ò-!<[7'ác:–ÕŸ+>´0Öÿ3`jÙÂWÞ`Wa¹–L·'ýˆÆ{ ªñúivÙ?Ëó ïe8ð¢å“ÿÐØ>ÖÚsMçXî¿b#vü™M¤4£¿KdÛX.A’”M„u–9°ÜÙYöÈ· ÇSn"ˆ œSË}e÷¬ 6–KajYèàºÂr) ~çµjuÿ³ ÆñD,Çs!B‚a4×q`QXê“w· •†ÉØ.Zî[Óâà¯a‰]0õRí®?;—v׎’ò¬]"ÛæÀ@xo…^Mûœ±šc˦®,WÀØr]›Ë0¶ÜÐÃõ‚å [nêáFÁr\Ū4Þn­[S…ŒÊ`ÐŒ';xë*t‰B˜SËÆD¥Cè…0.XVVàÌ`Se¹ V]³ü×5׬…‘å±m%Žæ2ÔrL-ûêù™¨š9pñš ¡|)-å5—À…k6T•N»DÕÌ¥ a¥íôÖ\HÑGÕ%ªf Š\­)e„RõLŠ\UèéQàk?+R•žS˺Á}®˜HFóò†ŠBl%£å0±,R+IU©V/Z.‡e\:vlW zºÄù, ¤\ OÛ± ƒñƒ‚~¾3Dãmµl½Œ*ƒqS  *®X Ý*q$l’Š+Õ0(&–8áL,âÀ`K<°ÄHè>+,úåÀÔ²a§ª“&i<Æ¥åA,J^7)€Æ€*[Óò÷]SN¹$yœ-›jØTZ.`Ç÷'ÖØõ¬@õè:D T ƒÆ½Â){t¸–shê}Û&v q``9qm׫K&ñö¬ éÆsGŒ*…AØ ÏÝs,|Æ^,R%¤º.‚ñ2Á€á5Ûn^ÎU•ƒÓ%ù,Xm¹¸âB,‡hbÙÚ£]’)ÃAªæÐ §«4;Æ:Þ®­ØSŽº:ÝÌ´!©ÐÀõ…e½Ž‘׳„FÚ%™2X.@±çغ&^Ý:Öxs``yèÇN`ëà¶\ ƒÎ—ÙGå{Ù`^8 ©NÛ0`¹…Xéžþ±N™KßW4-ño|,Ý,¦ƒ“uŒæº Î]Œib)"ÞŒk‰;QvXH’–äguëØ¥Ü_é…cý£ë¶ÖÆãÙ¤:¸]Ï0”‰i#¯" ª´,Â$»‡+,Û~ª€kjËzYŽm³oMÁu˜N_•°œ‘¼’ÂãÝžë8°ÜlÂA.P¶Éè’¬,é"2]ÑËsÛD´®€±Ë‚ƒP©?ï.$î”p“´€ª†A‰@_Ó¬Kò80hX`"žh–‰&9§dyDTb®ãs –ñRËF¯¯»Œ:Î4gÀ0£_ÄÙЉÊmHÒ,80¨Æ“{×'Ö‚ú9ãM Åÿ­Ž~ÊmâM F:å]uÖ nPr ‚\%•¨3¸‰ƒ\Õ0(.d›¤\€ÀXµÍ€Á5S_ Œ‹Ò3`Ð ¡¤Á[wp+„jXz£ž7Õîr›XÌÅÕE't%É=j’™;$@YM “ý3–£å¤Fê««gwI:‹›ŒÂ^ͯ€·”0œKŒQèDºÆ½ÜY_Xº:ž[ép¢”7.lX&p„^Áõa480p Evê':ÊÈáÈ÷µpä¾äC ãÄÕU¢ïGÝØh–ÀЫ¨Z8gŽ·¡Ý4„c+KØe0nfÉ€š%×kÞé-<™s`iÙõITŒ‹ñ2`pÊc)IöwÕ ’^X.ÇÍÐFl%öÐ*ºYH/L®yyÊ—Òn*®¹µ…åèŠ=f0î¦Ì€Õûçâ â@3–'Mk,´ ì»$!‰ƒÞ%il˜z¸VèU“kÖ9÷:DóË€AM†x¬×uvp¿B ”¹Å-„±‡ŠÃZQ2XÃ+—HB–çÁÔ˜\UO¹$!‰ÃIvZÒôþëvð†ŠƒögÙ@ZSu_á"‰2XnNFVÉ.—$Êpàõ² ä¥aR²¿$™29l[Ý#v-ŒMkŠ_ܬ­é‹"i' ,/L½@Õ[=£q¾Õ¨bטù³À6EÂ8"ÌQ ¡nvjVÒns޶ª‚©åš®),—ÂÔ²©ƒM…åRÄm½g`/XltCkçÆ.n\Íåä/‚lˆFj%·øº‰k”ƒ®š®>‘7ƒñæ<³œ'n£0vr`ê‘;Ö]–Qq`<á[¶kèF]—$OTÃÔ²nÔa¦–ë:¸¡°\ SË ÜTX.…©å¦n),—ÂÔrK·–KaùYy"õB;­+£Ø]¼"sà‚eÝetU–Ë`ùÁ:%¥~js$aEƒ}DlB0&}T´|"‘= ²ãÛ(ÐÐxË¡¶WƒA9]WÛ.¡AÇf; ¼Ä¶Í•`ÿÌZÝ^3§±y, ÛŠ³E&]P^I{½i9£ÚiëÄ9gv ¤"yÕ1ÖÞ%Þprhyž¤AjBcÍÝj«×󦤵  ›ëO/^ÉZ:ÛeÅq¡?bN×¶ËiÙ’)Ný@W&.§±à °BÇÒÓ¹õ¦e¤Ø »äycE‹–{üÔŠ ÇQoÄks$m„EËïruàºÙ´90ňr§×rh`{vªS×™ÈiÛfÐÀvâúÖ‚îK#É#,—ú·CÒGX4ÊÀ.dûBºMS°+i¹¦®eÌÕ:uÍÄß<‹†™xÞ*à 8ò 󜮓T¼jšØ^e]{^1ŸÔ°ïžE+®;U>A¬\eÑÄvîà³Ôt«h»‚–ßüªBóKL£q¢åÌ“Lݤ’©C ,ÙÚ4”XÕ3œž¡©`•Ñ8s‡Eƒ|Óx¢ñ.,£]øhMmÏ–)啘*Û§4 SGV¬»îbMûjZî D JÆ ÉYI„]MÓî'x¢tSÕþ¤œ–¶§ž0&^ ?MF“ / ŠŒGö¼Ð®ó&>»³hé_„—è×"Ôz±Z©‘ªgd¢×8òèã ?š¨Å£Z,Ù X®QÛ•4²m¦ºÛÄjY4²]ø ]§¶+é‚m¶2‡tCe»”ý×JÄrµ9JaÑ2;ƒ’¯¸CºBph¹öœò+éâ‡M{#ï8†®¯W,d4þæY´œ¯0¨M\p,´ö„¥½’Z¡‡0ƒ˜Ô*q cäîf²3—ᡚ’&»ÞE¶j4w <ß×=ÁInfÑ ±²[2óÿáÎÊ øŸHèˆÒØÛ¡aÊ«mÙV„Z&ºEs^«é¢í•Á4 U6sÚTÚ.£‹¶a¯.Hו¶Ëè¢m|n(m—ÑEÛyýŠ1雜ÓM¥í2ìEÉN)Û~ãÖÉnPú¼IÉîu´æ bú"­¹n†Ä*ýÙµFöƒ,Zªk½~âºÚ¯˜dª²h0æw9T+J3šÔÚãÐrþ¼_o­Ž+ °hdÛÈ…&¡[ ’f4éôÍ¡AîZÚÓQì5Y´´ÆhhiNGµ:E±h¹ÎÏ—ífju\ŸEƒÊ{!N\!2¢ð¥5° !uƒØ)Ε4Ñ=²hy—u³žçä o ËÐJºß<‹†MÞ7öTëÐMÚ彚–õN¢ÄZÐzAkD|¢¥mÓ-Ùf4ηX^ØÏ@•œªVëâ1È¢å\¸k² ¥”ѳx—T/Lòö¶";z÷F©·.“âŠgO<&:ë]¢¤HÝi:õ”Ų™C 49mÞ&ó gŽI«)rhb{è †ªGn’Ћ&¶³Ç®»ËzÑvMlg‡cÝ(Ú® ACÑl{¿6 £V˜ÂMÈbÑJÛ¦Šnélki î°Gye¢»K<ásè¢mCQ,!§;JÛe´|—NO¯ÃÈw(8O4ï§®2Ú\oäTç4.¿†èzÑv ú¦‚°®ác7‹–ÇÀQle×b¡¼Ò™Eƒ ö‰¥- ‘±XÍ¢AG¿±—ÐxSÍ¢¥ Å £A’—;*×L’}Ì¢A¥˜ÄFyú„ÅMžI¶m,ºh[ý]ÖMSi»Œ†AÉÂÒ& JVÓÒ.¬¾~Sm54‹–×m¬öâUš:¾Ù~»•X4î ?Ø:š3aÑÀuoÄž%ôt»î4gäE‚D^€¾¸AÉèg¬¡GŽž–²£h2‰&¤2 qq\MmãS ¤ Ûå4Ãd‡/Ú‡XÒ$¿w Mö²”–ã$Nô%4²3 > °h`;['µ_ZFãJØ^i-# ˆ&¢q-H Zû¸©Sv%¸ ‡×m—>Á¹n-¯;Š=W+AÉh¼Îshè^ï•^ ^shЂ-(âÆÁk u¶¶MEm’îàù„EÛ";Ò{Å*9Ý-Ú® ‰íØ"&#ºr×;ø»dÑĶMB?²]+Ú® éó¶Õ’ŸŒ6Ï»œ}GèwaE©EDÝÅá œ~Ž;Ž|uÅŸŒÆÙ„ÂŽÒtÁ諃© rŠfÑÀ•\’t‘ÓÄuÏ ×϶tkà½ÜeGA”ÆîEÆ¢AF MÝÐÚÖÑ j“—E×鵉Ú0h¹Å³ãŸlF£ÏEËH­”_ š’Y4¨q”ÔRG£zÍhÜÞŽCÃçmë•’VxŽ­²¸nF7Ö›–‡ÀX”Ñ&¾ ˜yÜCÓø¹ÖhЦ† Z0×ðíYš‡QtÎ4º¸2‹VÚ6Ut[g[KKÛ Ž¥?ê6ÉDÈ¢¥7öüH×`¤Ö$‡@½h»ž£õGÆfÇY4éÝ+BKÕŸ¥Ö$µ@X´\0Ý©1M´wÙÂL-²hiÛô\×ðÔ.¨ŒFÏ›Em+C’ÝRÚ.£Af˜%žngÚn·qö–çn8ÒŒïÙõ²hP/ȉ¾nTuˆZ7±ì’Y§†Ï®Qœ—þ´ÇêçÝ©á\F ÚÐçô¨¯¥Í¢í šØV £ëEÛ4±í»–ŽnmWÐÄvx:ºY´]AKÛCa—½yìægÑäº]_{—íâuWÐ`%qíùYö ‘¤´ùYöÞ±EKÞØˆûÚ}UÇħ# Ä-†íò†[ªù¤Ó Ý—8´üæax=í7ßÂ+ ‹Æ¶ãºY°]Eƒ\Æ‘[2ªÚ-¬¨åÐ`WÐÒHwªët:d×Ë Qñœì˜hfR‹EËëÎ"ÚQE&³héµ0Î0@c¯ÅÚ9ÖR—´÷‹–•%s‰q^×^Ug3§ÑˆeÑ‹¶ó’Éz©í‡Á¢‘í¡åhD~Ý:ÎfÑ2Œ•&\oÓ¤€‡†+…iß|£F[WVÓØ¶UB× ¶«hdÛ7´´ImWÒ²2ÃtTt„JºYÇžJ-÷ƒ4öDzhùÛe;ê.ÉÁdÑröɾál‹˜nŠSF¡dOc’ÒÝõ¦åé(,¹n“ÖáaѸŒ±°Ô»u“ÖáaÑÀ_©e§J‡Iëð°hµmêã0i öln8q{¡«Še˜´²‹§hÃs<ÍÙ5W‹›EZó5ät^‰ãÆ~´ ¾’Zc½i ³%á Ïѽy¼¯bÑRÊDñÐo©P_ nN¢A%ÌQ˜:ú'Ø ¥0´|&}‘8¥þŠsûL9ôúÙ–‡4òûVO{á5ìÒfѰc^ÓÆo’&­6Y4°=ò…kx¶úe’6q,(6óæ^P6y1³w‰sD84(@aÙÚPª9×j“ $’ ­Ð1‚ VÞ%YJX4H¼.l”]L¼fÐr™êiº‰a,(û‰A{B'£³hù.DZ¾0ŒY#…X4l£ÐÕÜeÿY4 5Å®5ox eXNÓÒ:ÕtѶ­¡ÛJÛetѶ4¤î(m—ъ뎅’»„ ÌV¶dº©©¾4šsÆ¢Á–#ì(L“HÑòѤ9g,ÙF"ÍvPjÚ¤¶+i…íºš®«m—Ð Û 5ÝPÛ.¡ù¶›ëe3lK/–3Íš‰åoÂ+þ¤q x¶Jl›íúzÓPðSrp0ësTðSMCÛkýʯôÌcÑ‹¶Oôz£ÃÝݬ㹊E/Ú> rÜ#ÝTµ—Ñ8Í¢Ášf[~š2'¹®›JL"°Z¤á Ai¹¦Y¾7oiR׳]¬,ZîO&Âè%}Ý$ë%‹–°¤o &º©IÊ|³hàÆ–®Emžr†÷>ºhÛÔÐ5¥í2ºh»®¡M¥í2ºh»¡¡ëJÛetÑvSC7”¶Ëè¢í–†n*m—Ñr¯Í™úY³nâ¼GןâÜ€®cq9‹ù'c+ÏéEI%Mò«X4±mùV¨éZÑvMlü¨gË'ä´Y´]AËÙÇ]5éäoy’$n†>£ Y ‚Ò¸ì±ë~ª[‹i>‹†™F_ÄF2U]I£P–ŠAl§:ÚTÙ.¥‘m1ŠÕàrºNmWÒÈv4žèŸ`ƒÚ®¤‘m[ë:kÐòØÙžõ)Ueíåt‹Ú®¤¥+Þó]]õÞ§aâÄ  {˜§–ÑøÊýIFwIójZÎÈ~I‚ƒÙ 9Ú,ËöV$¶§¾’:гh¹SŠBω¡± \òŠEËÝŒÎkʼnfƒxDX4Hã/뾆.:âåô-1̇V¢U-,áaÑPoÙ©7¶RÕ*•Ñè¼Ã¢å»´m= 4öø±hù¼…¯/úh6ˆÔ«ï…N Ý5Íõ¦Aê–o¤“(_çkÅõ’&«°h•mSI×4¶õ´Êv]I›ÛzZe»¡¤ëÛzZe»©¤ÛzZe»¥¤›ÛzZe»­¤[ÛzZe»£¤ÛÛzZe»«¤;ÛzZùíÌ‚ŒMÒN‚EKyPX’•j6mš•:JÝĉÂï*.¼‰'ðÅãÿ0R¸*›ín}½ià,Èvƒ8~ i¢ægÑò(àE½‚£Òø˜Á¡í\Ãc…–¿ Òâëé’c‡¶³¥§çǰƵü9´ìÈ1²æ]íBO3½X4è«£h,éÉuæÐ2˜†-ÃÑ…ƒZ´Z%‡¦}0´4Î%bÑÅþÊ aF«ûw”ÑRUQ?ÍËeû{Ú‹%§ÑdÑ*Û¶ï)èºÆ¶ž–ÏdeŸƒ‹ªÙº·ÔëhXͦ@CÛ…fMˆnÛÕ4´MçLw‰íjTµnÖ±h9N¢ØŸme‡n¡†Ùnâ ‹S…1;ªï’”…aÑrÝ™Ù84æ]En³MÝ,ZÎßÓbÓ#IÓ¼ [e—x:´´…çn(BÕ_Ìì˜DÿÆ¡A®œÐg¢›ÝZ ٌҒmŽU",Z^JÏ.½”¾o4ÌÿÅ"²‹;” Çú–ØD³ªTží Z”£Nej,4ý´© M­m-?Ílq¢@D¡_¬sW§M9X´ŒaŽ³Í’î‰×©N„EËÏ~”F¹jŰÕÎê5"^°&¡v¤ä4²=] íÇV¯5p8 Úǧ‰§Ûœf4ö÷²hYá00‚(Ô,&õZ ? ªMWd¸—FŠ&VÓ[V-^6*š·ÔkíÖúÓà„于¯Pz‡ëµnƒœ¾tÁv¢£»*Û¥4P6Yvöù ]?.V®«›D È¢å¨ªå¥Œ³-§Ýš+~ &ñ›²h@S$ÝÀ}-çä즽l?¨hBX7I ‹^´}à‘MgUÃUK}N£¯˜E#xî1£‰HhªRÝlãuŠEl§ªzZ9ÝQÙ.¥ ¶“ØVÓ]•íRº`;´‡J+Ytñºa¤kÊë.£‹ïÒR}Åm*ße]°mº®²]JŸ‰«¡ÊgRFŸ‰îí4•ϤŒ.Úv½H1³µ±[‰ElG½$šWÑÊï²”–15_”ì!²]5ŽrhX :.£qZŽçƒÄJÍÛÁý¥Y4ØW%Qb=Ë·ÜEwá"]¯áJ,4â±²-„ƒ¥×’Îx܈‡AKÛo¶éUß%U9¤³bäÑ(U~ õ^‹Y4Paz±!|k¬¦[8þÏ¢å:?JzQ¥®ªukÆGY´5ËqãY¢’Íð™Æàõ ¼ðyK¤n8½X7®·:ø„Ä¢ÆÜž·tåèêíF›´ËeÐ28ôÄ‚0fP?}I·p”™Eƒо5]hã‚Ý‹t‡4²bÑ µ·—Œ=w¢Y’#Ä¢åÄ‘ïÙ Z¯™Z1ã×o¾Û©ñ,”†í»éBˆ÷ëèMÛdÑ@`ë?‡Æ\‡”~àÐж=+ä:«å´IlWÓÈvßKÜI6FUNשíJZúÃ’<âI Ì÷8è cU¤Ó6hKD ¼PajÙ¾:§Q#ýA²Ç'²i34`%3I·q-Ÿ÷"ªé¦Úv HZo^u¶CH•4²èÒÀsºKmWÒÀ¶›JV`Ñà¤aÙÃl+«~óõ.‡Á¢åºãƬêƒÊ—Ó8·‰Cƒ“Ñ$(Ö”J«i’%Ë¢åˆõã¦~†Èht%,–©1zVâXÙÁdRƒMì­dÑ d\Ô[™}õš·CJ6³èµ¶wrCÇë/]¶ûÒŽ;hÅ¡ûµßŠc:äÐãŽ?èØƒ\qÌÑÇÜÒÝ—-9ciþãÚÅ,û¼ò_-=sÉ™{-Y’,Fvºt¶„„éÒÝkÞPo!ßîêe¿•ÿb¥Ù'+Ò¥öÐJ–îžíbÒh·%g,Yºt oºÎR1̰¥£9½WöÞŽü¥¯žý—ó?Î {{,u“$J²ßžË®déÚŸÎþ5L£¡ØuWl|·üw›ÙCØuíEÌîlÉš;/µ‡KwÍîÉwõÄn‹l[Â]ZÕ’u$·²CƆùØA¼æÖ¾œ=–ÖwÛm‰|zàf¾×⟹~fVkk4Oo+ÿsl €ëωÇíwÐÁûpÄñ’ìe‡”ù½à5w&Öœ ÚË™Ü{sÖ4bÒ[›ÿ×wç¸}kä§òö´?xæ’5_;Dv˜xŒô³ŸÜÕ› ¹¥ÞÒ½³Áâ­v£þ®ù×”0±ÛÒeKéï-Ÿ;5GÆÒZö3¯|¥¼Û3ÀÝäÿÁuøÕKåz§î)f¿ þÑÅW¶øìÞð†¥ùG<ûý= v× ñ%ô[OÜt”„³/}Ý»í ì…~îÌ%ôWà9uôŠ÷;~¿½ä>î ãWwô‡tì±G½ëš'ÿñÚÿôš=#夵âÄCª›+N<à |–Úàÿ§ÿÙ†•¸Â¨íY3÷œ[–ÿz…;­ÐYZ»gìôÿïÿ¹[°ÕhäÿÌë^ÃÎå•°æêæµ<²]k·çÚ­ æjõl»ÁÒ þ_úßš›™[üçÿ#ÿÛù˜ÎÞ~cÉηþá—.i.[š­ÀKöÞ{Ùn8H‡K[Ùï»ì`ÏOÝd鲃}+utíÈq÷Ù'_-]+X2ýà'Þþ²õœ3ÿzâs~{ÀǺãñK7?áy›\uþ}wî8¾öÊc¯~Í[Ïz··ü³†;úñû~æß?ÚatÙó?yÒß¾úþCWõïú`½þÏ·?ëoùíÑÿøÐ^±ïOÏwÔ³~rÄ>Gêä9ñªCµ´ô//ûÓêïÝpÀko;f»U{ìø¼G_ñ×»žzĪó_¾÷ůÝþ ·wó¶Ûo}ó?Nü窷ÛeCë±×Ýð·éž÷•#>øç§þðÕŸoµç—ŽúÈ’“·ÿéßÝì׽ꯗÜx`ôåÉ~ú ÿsØŸ¯8P\|oò›£6úÙVÿûŠÌo¿zºãíÓo¸h›;ví\ò{Èy;­¸µî¾ïëã—¹ðÑ ^õ6ñȳîÞëÓïü×[Úwuþ|ñÓÿµÁÙ[ÿáÝÏ9r·ïßþ×wìqüSŸzýô¼cöMnÚçvÿ‰‹¾uãþÿ¾ôâ…ý·9uÏ÷wáÎOöÙïîþ³Û¬~ÛŸâ_½àºúÇ7Üö›{ü;߸󓿾÷ªU_ýÃ÷/¹ãÃ?xzâ½ÿ_¸ÿ¾ßúÚÇw¸åÀ¹pú/toì>¼z›¯|yò½+ö?ä’—ÞûàÏyï?xþg¾`Þï<8¸êÂMVÿðúÛ^õÒßõƒÖkzñ÷~´×;º\:þÎŧ}È|È~à²'ÏýôCݵÍv{·¾ìæ§¾åÞòé~s‡“®:vå?—\¹ìY¼ýgšl¿dÿ¿ü®vzåûz{^žüÇã?ÑþàÞ9y¿ÿõÔÖON_~Ãø«›ïxÓ£GVw¿¹dóÚ ÷Ÿ~ЙÿäI<îÿyÉög÷ØÁmüþºQcóø™ÏZ'ýþ-¿ðY7á¶qwùi?=íÌ·~>ÜöÖ÷½ì·ݲ¼i°É“¯~ç“ÞÊ¿í|Ãé·|þý¯¹ÿâgüåk —œú®çýöÈœ7zåêŸ];ý?®1?ýØfmøûÇþ}éÿ¼øÍ§¿öÂèö-Nèîñ¹ÇWžò™ÁÉ·-yÿ²cN~¾wíWwydŸ[¯xâÓ›Þð?>mþÀ›/Úï÷üøž36yû‹½åœx»÷½å¹/zás¾±Ã+Nm\ò—]?}ó—mwß›¾o°ÝW–|ñŠ=¶ïìüînxØãSþâ’Wï·°rþ—»Üi¾eÛ_ÏÿÕooö®»ÞµçÉ«·~Fó”s¾÷Í…G/ßìúíïÞú[oxÙ+®YyáQç~ú·nòJ{·stÙý;Üø¼wî­Øê¦MêÝ~ÏF—[Ÿßå­sAÿïxÎk^·ßO_ô®w?üú ¯8b¯7|ùu½ðgý{é¯_÷’“/Æ«;ö—ùoløÙ?íô'_ÿ«¿~Û_4–üÍ+Ÿõ¯ðÔ Ú÷Vn~ÒòÇÚŸ9ïy[_vÈœcþ÷+N¹~!ÞâÈs6xæ{â›7ûmÇáÁO|nïüOÌ7ÞñµK¶1þø¹Ož~ÆGúçþ9ùâíÏýóíÞ~Öƒ[?ÿÔÇ—¾þ?þÚþ/ùø¡;<÷æ-~þæw¿nå­Kžºë½ï»äÃÞwÃWýoÇÿðìß}íüðK“pð§ûyÆ¿þxì«7ØôžîWnºÄxäî•{›gŠw>þÑkžxþ!¿<õSŸÙsƒñ¯yìâM¾½ÃyoxÎàþÆ&__vp횇¶{Kú¡>uãm§¥W~×{Ó{N¼üñ[¯üÍÜV7?Û~«?½ç£{îÙ¿ý×µÉ×n:²ÛÿË£ŸwúåUGmóñ·~ç—žºgû»íûŽøÉ£§në]·ÁOnóá_þÙÜ ß™Ì¾õ·-¶¼éº÷u®:ðŒëÏùÀõ?¼÷Y?9ò=?Ü+6>ÿÑ?ö±åß1|Å­ïúÑi×µgøÐžZÿt/qÍw>vÔW®ûÉùÇOÎë¯|Å“›B÷Ô×ítø«½ë5‡<þãghŲèéÁË÷}è‡Oä;×ì¾åNWñâ]Îk\ κã·?ô¢ ïýú;oÙà‰ƒž~ö›V¾gºë÷î¼vÿø£g}{þ5ûþ÷1÷¾'8õ3K6ýú+¯Kÿç„Swûìù?ÚâüËÞ¼ÿÑÇïüê{ß¹ùw¼íþã€ëNÞôïÉknØv‹ƒ¿»ãÏ~ÆSßïѼ µñ7¾ä}dë‹6¾où²7nyÀ>yï§¶Øçß>üë¯ÙžjíR”ý*_¾Zk—±Z«Õ\÷{ ¹´¿»Ëޱî²#sŸÞþÑtéò¹ì›ÝæÒNÃëþKà)Ûžýܱà:ÀöáØš¹¤fÎ6ÇÖæ–ÔæÖü²³¤C~Æ”?³¶ÁϟײƒŽ9ùuGóÊã½ Û›š~²gò@W؉§Ù>¼6»©5—›ÿQö¤½D¤äGìÆÜ²#¬µ¿®ÕÚËNôœt(–ç°Ù_sòÿ–¬ùgsnn©æÿ–hÿ„õç™å%kìç5ÅšíÎÚÿnþ+ùϵìÌn½Óýµ–ÍGX˜m¾¼pÝT¸_(¼Å?nÔKó‡‘?‘x¾sŠç»ß!ÇœpÂkŸïþ‘ïžnMÿtë&xºfmÝÓ]b6‹ÏrÝ_{ŸÍÅ¿kŸZ³½ø÷Œi›æÒV«=ûçº_çÞΞGþ\ò_ç¿×ÍžçŒiw–´fŸÿ[³ÙB?=·ö÷Uogí»É~"ÿçºkÎÿ}í[Yû«Nþ'Ù¯óŸœýsÝOäojíŸÍÉ·øÿáu/ì5'}Êñû­}aÇFÒ7Öe¾°v½ðНkÝkʽæu­Àëþpö׺!¼î“Xó˜×=üü•äfÝ‹X÷ßÈ¿“=¸½dÍ£Ëföâ²?S¿´u¯ ~Lëþ¹øâæðgÕ^û±Í^ÛÜâ½ÊOkö×lÐ̦ƒÿË) ìÏ›­"Kkk^£î[îÒyzÝPÊŠvœèõûn¶ŒeëÖò%ù¼p$NvëÄ.[³=Ê \í¼¼¶„.7jõÖRÃÌ&œf£»´Õ­ŸšÙòc.Y¶Ÿ°óu4ûÝl ´â׸Þ`¸ö_óÿPþgù.Y¶Æê~y½ìÁ-;.uƒ×-ídŽô„Èîf6xóA¹dÙIk­4Ìh6º³åx×eÖ²Þ2{™³Ì]Ö_6Xæ-ó—…Ë¢eq¾Žûn?]ó«$ÿÁeÉ2±,]–×]6Z6 7v”¸»Ín*;óºõ¥µY¯ZòY­9ÃCñüêXwŠ6ë¹}öYsÖÙ›¿eÇÿöþÿÝyÃý÷¿í¦û7~Ö†ÎÑgŸîlý¼_xÊÛß~íë®þÜé¿ßõš_š¯®?rõ'oüü¾xážúàé‹Ä ¿ùÐÏÎøëý?û×Óû|åÑw¾q“MOö¦¿üÆuGœÌ—’/ïqò/~Õ‹OÚÿÍæ§6Ùðž—]4Üp›×îôðÆ¥»óÅN{îû/ýÛ£—üïû{ýÕGý¨÷÷³ë]w¾÷YÂyíÅïyÞõ ò¹—w_±Çîý×ÿ¾Äúò›—¬JöûÑŸß÷ô¿7zöׯë^¿É±ïÝݹy䮇}çyËN}ÿÕ/úú¥Wn·Ç¶oûú“§Ÿqeì?÷ÚÞwvðk­­OzùµÏ½äœÏ n>ík§]úÎ 6éíù‡3~¶½ûƒçœuùÏ~è—7_ðÆ£OzÙ•á•Ë»rÇï~µ÷¯ÿùÖߟþÔÞß¾t¯÷>ô‰‡>¼ù¹OïõŽ3vø©uØ’ßlsåòæ¶9ë÷Ï>áÞ6hüí[ûð±ï/ÿù&[üó®½ú¶ÛvýË÷ÿjó¢hÕî~ÞNÜí©Ãîºõ¯Úi×g¬>ýÊ­ ÿ´ÍÆ'O~4øùV>zÛ5‡ý >ôŒé×üÚþ?pßýÌ»WŸpŠϼú á©§ÜxÕÿsÿŸõ¥³Ž:ä—ûÁt»G¶:ý‡írÃÑߨæÐ¥G¾w3šý>°Ñ×»÷éßùŠ}½èº]/ºÁ|¬yÝ9?ûÙèç/Ùïäj¿=üg×ÔþüÄ-Ï:öêW|véf>ó gÜMöyÑ—÷ûð‡·ûÃvÏøÛÞoÝê§÷$í_±ÏVíæï<â‰×?6j½q÷c¼ÏÝó¥Ã^¿Kûæ½>ð/é­÷_ÕëO÷¹øƒÜþãGwþô?/¬zÓåÍvËfÇv>ó‡÷ùç›~øýú;¼~…1tÄ ¦?¿|ç/_±rîòáÉ×lyÐÎ7~ïÂïºåGwž÷î_w÷~Î!O~£ýñs¶ßûµù—ß,ÞvÃ3ÿuÅØî/×î·púNw½ä?wÚý?ÿëuŸzÑoW>òÄ“+øâñýÆÖ—oûÂK·øç±G}e‹³^tÜÇ?~ì3ŸýÑîßí?ëîù.½àÜ=>zóAw¾õäƒçýãÁ×o8ù¯Vo÷~õù·\rø«Y¾ü¦3îºë¤³/9å‘-Â36xnx祯ß`£Í.üÞéí^Þ»æu›Ç7Þ}ò¯_úÆ­®¾ê†oþ1>þÅß^Øk‹mßöÐYO;ïxÅf½v×SÞ|éÝ0>yìž?Ûnï ³ïŽî]ýð~û\ÞõnsÅ¿ï~ÿ­Ç=ãêmÚúWœ¶Ûm<úÈA˧޵Ï)§í×?ô¨O½æ/þÓ_ÿ5÷Ïî÷­ýäÕ§uðÜù¿¥¶é5ñ¹›­øÛÎo¿n8:å¬í»ÇÊË~zé_äïrù»ÏÛvŸË‹»Wíö§_¿Ù¾oºïÁ‡—móÍkƒ.9û_ßä—ñÿ·]ŸÝî.üãêí7½ô¼ï9øÙ× 9ÿ§o»èµ{½æÝ³Ã7žtÂ}«¯üý˘Üöóß½û¸ÁàÊwÞý—c?Æv__qÀ÷Üå¿ø-záμáćn¾àân}î ¾õŽ»¾ç'7üÏ«Oû|ëÇwìbxÇ,ßâ?Þvø‹»ï ?½õà­ž8ðc·>åÜ×}~»wžaŽnïŠ_4|ú¿—ŸsßK¿6üÀ_{?Ùû¤[þøÎtõ&7_ó÷‡òÍp»{6ú±sß«½ó¹KîÚçsG8ÿ¼í-ÿï¹÷ öÛÂÿöξäè}OúÞEKâ[øý1ÛŸrå§—-<þpü×É¿uÕ¿¶Ýù]w>|ßÿ _¼ýË®[8ê¬Îùâù[ÎP{Í3oßò£ÝûZwßû­Û_pyrÀ÷ÝGþõ×»¾zý‰ŸïMï8θõ³_Ùlnÿ?-á'_öµïºË7ÞxÄŽ{¿jù¡o»fù=gÜt÷k;ó=9áæ _ú–#ÏùüS½çÉéÕßxÎ.»pþVûÑ.úãWVzÖãî~éo>?ùľ›^÷ÉÓv¾}÷mÝÃ_c}ék¶ÿäò-Ïßûž¯ïù©¿˜ß=ûòãÿð‚;ŽþÔ7nÙéÉK¾óôËÚðäUçmø•#Vœp\8y߉ïyþ O.yð–ߺËÂÇ®:é?~oû/¿ýûdnõkâõ…¥ï}ä½6ýòFŸûÝ—ÿøÌé·ÿÏòÛ÷ï|äêK6ûíï®ÚõÆÏþqÛG}÷²}v8áûnóšc7ßê­ÿýóWþ±Íf7>vþ3¿ù‘ÏýuÓ½þuãäçþ‹e\÷ïKuÏ%·uí&m¿zŠ×ù¢Ï¶~çVïô‰‡^ÛN—÷¼ƒþcÉa§~`Û{qÛ/ö7øY²óï¹íC×ÿíÎÁ3Ï}`ø‚—ßûPûìMoøØ'Ýøõ ý_Ÿ½ò÷[/7n¾þßoøç#+þØ:ù”#Âäíwþëù|ì#›ÝvÛoï|æùÓ×ñí¿_sþ'÷üb÷’/ßø‰;ϹÏÓŸ¹å%_?Wü×Ù‡ú [¾µ­wé§öøô®çüÏ+.Ý{£÷¿>úËïn¹ñÐäߺë˜}¯{áG°öÉ-çÿóˆËö»ü„]?å%÷ßþ÷ÝO :ç oN;·ŸºåíéVíñÚÛîøô¶«·¿à¾•w^»ãG›—qП†/>zk÷}gíøú{Nº§¶ú3¿üê›þãЧÎÿàŽ'_{ÝÇ»îóOüöÊ-O>ãhù—^ø´·ËÕ_}êÀ_qʇ>¸Ëu…¸ð‡'´Þûä’3®¿ÿ{u ¾éÇ/ræ÷Ä?}ïÕ¯øÎOo¸ëMÿøî¶;>rëU¯|ðŒ ÎyC|÷sžýÛ§¯²õí<¼éK—ì'þzÈË¿²ûýŸ>Óßü¥/=qHûÞ—…wìóÂý~ÙÜè¸ßý:ú×UçþvùôåÛì±é®»¾À8lÿ üû[οï‹?ØmanãMÏÜ»ûØ÷ï>z~ÙÙË|åWÿ¥ÿ»~æð©ûƒ³¾û†Ÿüço÷ª=yÇ6ßùØFçî³dËM¿þɇ¾ôÜøó_ÝîáMï>ã¡7ñœsÆAWž·y}ËÃoûÕ_~ïòþüžß<óškÇÆ]g>vñ {yåÒS?ò±÷ûØ­úŸïþù´Óvzò°½?ó™ÏúÍî‡oþ¦=~É îº÷š-Þµâ¼q«›6üâΗÝ÷¥Ç’-o¼ým—½úþžvýóý_ÿuû;îyäÇg/¼µ¿RltÄŸ®úòŠ‹>|ß)§¶ßŠ»ÞúðG—>û[Ýqögߺ¤àû©Õ˜›Yõ!x¶•Ë6£sæÒnf«Õi-îcrÛi¡}lvìûØ9S³­µZ¥ÙVld÷[¶ÿ²–¸ì e¯Yvè²#–¹ìÿ°÷pM-Ëã8,  ‚ z/ ½*%ô&½Š„’`:*ˆˆŠTP)* ( "¨HQDiÒ›ˆHëÿœ“Š×[Þû¾÷ÿ½|îÅäìÎìîìÌìÌìž)S)3)À=²”²’²–²Œ]ð¥<†à ؼ`þ ÔŒåë´N=ذ‚}Ђ”/` cý}]CãÙÅ [Æ~Nœ›ÔnÈD&ø¡\Ñ€¡Lm"KIÓ˜ÉsCA ÅL–U€+Q™Éþ6Œ€™|O~Œ`¦}‘á•àÑx“÷7”óÞØ¼¿oŽÔ~µTW&³¶ÅHS¯Œï-ê†}üÇè–j×eÝÚø%=}Âéãs×eîÚ„^P¾0à;…’̼ÏÐ[ëØêÛŸ|úóçÏ=ï~ú2uÈD·û)ÖO¢{W *Ä!3†>pU{ov¯eíõ—Üþ)"y[É[öÏ„½ž¿H²IÛ;Ò!.œ¸än ÁæÚ«ËR$:Uƒ5ÜCt:Z¦t‘ò‚>ø9ÝXes3)Qüç““…Ñ'ªÇ[ qí[+4+Jéžuà8~î¤#ÿ9.Zýg¸xvÊ(„ K¢¼ÜwÔþܳ}]ù!ãÂÄŠ[£ù½8±c¬ØöœâgL¸6dpdݰIœÑóƒÏZîK…>èïJšØZ4ý&E Š¥·Vè`p9ÖE}½þMëBFk³~Zq+¡QwH¨W]pãúÄX[‘Ý‘â|ùëq¶²TÅ~(gà=üù`PL£ÆMþ6²X«rÉN5Þ}AÖ­ /·tá„_8«áïÅüé¾ÈIçò=µá&U¬?E,vúMùÅì ï²è»óÑà¶Í²Íº­!-éÛ)†k7ÃU˜?ˆ±h0Í3úþ>WëÇ’Ï,®~LüÑyzÉÅMÙÕÊä UÕŸÏÅxìL’ó}S_zwiàrî5‡™7ï¿ùI¶=2ÑDú£Šb×Ö‚~íKù{Öx\r¼*b[­¥´a— ÊŒÑä¹×â*éµ|K©}Àb³êº5cA×\Z¥gu¾ú:ƒ™—Ù Èê"-“ôvÔ‘WEÛ9ßÑõnhßµT½/lm_iCûfÉú)õ7¬ä»èè—L ÷žÌ»¿aŒ¯þóTݰæË7ê9N ËqžÈ=¯½å¢É^™êëî~Iûjø¥äe_©4;ûFzW6Kmç|yìªrRM–£æŠÃÖ†œe×]Ƴ2+Ò°]tœ3,"à…í×#™³ö'IÁ¦N…ÁRuÕ]@7cS÷…G•ìy´ŸY3Âq÷’ÌÞÔ8–¶#×ù zzñ&¼z"l°íÕŽ–p“­=ôj_? =!°_Ûl›ì×n^êvôíM¡ÏÛÚ†õíó¥»±|‰ÑéÛ‰Áwëײ—¢ý–°Ÿ?ÇÊYc_DRø<œsðÚÞl­/·î8VzVËÙ«5¾ ‡†ïMë1äŠ?¼s½Ñ›èej#[†ƒ?ór¢»|­ó`ìOOÙp+רJŸšafß–†·’ß÷øX~ï½%„eÒò£NýS,/-^óàjö¡úßïÊ|…3O(~Þ;z.ÎÑÙáͮӇÒ,Ã|>èr~ç R{‹é}¢ÄÞ.8¬¸µ©‹<ÈÀ¬Gx‚‡7.áý‚×%<¿1ÉÎjTô…1I!nÊÕýÁnO¢0û©¾1ÖMç"/讦‡g¿ßÕųý²çø û¨ÎªIñ½µû cü;Ûù÷¤|9Õ±³=l?Ï'&ǧÑB;8НÝë>ر‘~º{@ñî3Fá§ß¿dûñ„í³(­?IJ[¥·çüÜy³“X3®­ÒÀîú¡8Üí|åf[Ÿ$\¼vö¥È"µo;'Ã+Üt¾ž½Æ]ëüéÜȲ¬1« #+ë;pÒÂ]¨¥ç—-;fYkäÊ–ÉàºYŽG@C³„˜¼wŸrïÆÖ¶&E¿>ÇÉIõpÝþŒ¶kÏT¶U™<=¤b™»Álµè{}yñ¡ê÷jIK·Jí;Þ_·:ï|È#X…ªå1®ÉŠä›ý°åÅ·]–˜÷￲-yØ›{3ë%¥4T‚õÃ#ûof¸˜Zõ’ÿ¥Ñvd·ã£³« ýýs´ˆz¥÷ƒ‡;v…=x仕9í'}fݳ—¾=§¢ µ˜Jµß©^ìçËPÔÚœüãSÇ‘H†…`úœÃßè×0$®‹Ç?zB¯J?ªoœì‘véðÐÝ7ñeµn)6­aì‡/Ÿ–1÷ /ô÷›^»–»k˜¶´ýäK•!©>u®zzÁá\YíÈ’„ó9„­§·>ÑñHD·&`ÛævCÎ+šÑ×9¢º3V,©¶—Ê´•zïw‰9+çü•kµÈÛÀF/ECxaÚ§¤úðV£ÂV§¾¼œ~ô²ÙRóGËoIz¾ÏhfT‘õ^ÃUgªý¶_f¨ï¬{Ï{÷õÛµ}¶Ë_§|õ„ÛÚ×õÖ÷(·ÝþjoÖ}½YË4èqïÀ@š×i¶5#¬z3|̹6ˆ¼Òr÷0|]i`•{”¡Ý•õèûK™¯w•À¶g©r}Ýa:VXõíB·ßª°Ì3 ϸnT°l)»¾6öª@2äŽÝŽ kúŠêÃïrâ¾F}Gl¨¿…è±ÎOz®o=¼¹z¥ÚÞVŽÑ#r¬ Z+[ÝÙuh´•UˆýªƒƒCKmMÃïcX§ù†¯6ÖT~8ñðaí¤:—ÎÁ Ù¾é·é{ús·v­T»ß]ûN¢Q“÷Ááý·Ç÷•oÆlÔK H6(ÿtªkèÚ·òo7µÓ·Ö|ײ½_×G¼¨wõ±_åñ&ÇÍœ_WzI3Å/ðŒ¶³IõÞΈB0*¦²YÜLÛ’)ÉojsvÍv&V´@°Rr´ãñæy–ö‡B_™˜1ß|Ãi*÷úèxtÚý2ó§{ï¼ø±kwHøl†y=ƒ¢…K„Pk±¦:V9ËCGÊõò*ÍšýøŸ[;fçzzç^]¼°ÙS#ãºcùQÓÉôá„åÜÉ+=áRÞûN‰è7ÛŒ.¹ÄÛóµä¤‘uÆûË›¨“?·²Œ†œIK¨Œßq}[ùATÖ­JÝÝìJ&ýOÐå•ýw£‹P{R™ô"í³ßlŒ¾ü´Ýw„o@‰n»Óª¹×…7oìJõº‘Û/ôÃë"ƵÚÚOôŸXƲƒgUçûÁë{ëZ=þíÛxÁÞ¡¸=NG|™JîdN”ßòY+(Û¨þÊìïÕKaœô{Jº<ÉUâÓÑ&¦µ6Wé¼^ÿx"=.¥f£ûAÞ)i– _zÌh‹ˆ2¼»µ`´nÀJx<“Þ“ûüØ“ ¿Çû[;W~Û#§“Ìs•^²ãÇž’¸¶ÆK˜ﮜÍt›PsÛr© ßP)|^©³ú£I¡SE¯®'¯Õ.;ÊÝ7î<µ_;%,x©]k¤¢ÄìÂ/¸(ÚÐÛ°®ÂQ­øÓÿÞ "ƒ¯ÐI“Ù']otn&ÆÜÝñÉ´/ôƒ‡îr•J ëÀ¶êô³·”ß]²èïúèi¶Ó:ÅZ?.mPs;ÒPò‘tNר€i<ë3yþB­¥:U7Çj™ž=Úx¥´¢ÙRj›K|)K}XŸv³Ó¯Ã2šU»czÚ !þÚ›Ÿ•,;ÅS8Þ§8 ÆðZþƒ›ÒpÙ…'‡°L2Ì+^dÄà»õ·¯Â;¤=qSS6í1*ê‰0;|ÐÄmê‰ÊdÇÁ«Ù;£zS§™Ê"qµãªÅ’Û×úmñÝgá°¢vŸd‘ö…§â2=]²b¶[NMý:…?Ð!ø™}hÓY¥.oÏSQ;ÅÖ ”Ò{.1*Ý㿤„¥ƒÇè¡BÝ’½<‰Êåd×2ǾScÿtÌ´\jVͱ_U!G¾+|Cgt]kãÕšŽü"†Vɶ€Ô{u#JôO¸Cmbº¯åç»JQö.)*:œ½ÃòÌ9<{ȧᮄÔ6çïù'ã/²‹-OáoÈSþë¯WŸV[÷ügòž¤äœ€+Í;£™ŠÖN4…|ggmÑ([—ú¤Ûwúꓯ›>ÚW‚sÖõþÜ&*ðNÙõô6c¾µëŸuF5»*Uo‘“T¨·™KíÁ-£Íµ¶OŒWÞÞótÉØôî‘£zöÓ¸ê4Ý2”ß›;ûËÎ.<¥¿ïé¥ÔIíÝÆƒÞOq5µèMƼ6Kí^Ø+ó†n“²Zå¢a÷Íž‡M6Ç0áB2 çrcÒj›mÜßÇBcú¬Æ¹qäç‹MKí‡>1–£s\iùâJ2Öñsýöº"I­k7Üï7Ufò¨ø e›‹(i}Ÿî;èµa¹Ä4_ª®}}ÛNÉçŠD½ð¡z¾'¦Œ;›Æ«ä`Ù/`,ó#5†"*uë’³âL#(öCâü¦ñžÆk¦–ß#Ô[£ö„쯟–R/><1phèºóeù‚êçOŒU¬Úÿ¾  .iÏd¹ñ[EY[{UæðU“@›˜=ë’ʯت(ûÜ/ïrÅØ®8Z":üÎUŸñŽÝÙ K¦ü5>sú½»(¶¦Ú•Ó¶ZþdÅËŽûÕž~×g,;]6䢮o=­³L~™ZІ×~úíVËk<2"¸ìý¯¾ta ÷IÛéëô6[^Ðîšñ‹vz+·®Ú.¥BhwAI÷`Óâ¶ê~ù¸³ìKZºíow‰Œ'nÉ=/â%[]-7Ý£¬ðÔË~&6{è/£dÄÓ¦µž½×뜎5‰ð„$u>[VǃZ¹A~X©_ýd-ûV›`ì˺ŠÒ3ïìW~aÛóê‚ä@Ã-îàæweçœù[˜?®¿D?õ†™µ°ôܱ[—p];à6ðäóÅê^Ç>“C¾J¶Þo™â—9:¥b_DèíY¾Ø\Œ¿Ë·ízœGä­’ ¦A!¬ï›+îh=»ÖN”‘C Lp½F{Ûæ}ãRŠ=¡ÿ±üUΡÌc¹·¯Ü¾úÌ-êñk£ªÜùè¥ûÏåyzð¼½q÷4GôIi}«§B_“Ÿ!Û‰ŠïŠÚ§îvÿý&ìq[ƒ½òÚ™¯z> ù߯6C½”E±û0ÿèÀ Ÿ¹áϪ®ôhšË‘ ZØ¥®¶^-ÝoãþLVeÓ”è¯ù|X¤­SÓ³Þ–c÷åÐÇ·:øNÑŽè%û¹Oìº5Ö~ºüxµ÷hh;£_•RKÄõw{¶ª^iïKû$“¸çæ^Å»v¸ƒõüˆSŠ¥taѼ úñm’ Wœ”Ú¸W³Ñ!žžQ,m­ ‰–¢öDƒå^ÞeQ¡5]ùLpã’5k¿¿–Ó˹ut™eôfþξ&æš ñûv{‹º >¾iœêÿY:àgÄ…³oãT›×6}ÊÙz­7=7e„#|øuõ¤l3ÿÆU'uû;=6óñV‰Ã÷— ÷žÞL8ëž¹µõ–¼òùy‘ÊuŽ1jš\Ñ¢È?ÐÍÕ×­ßFl±wÅåÉ+~˜lâkìüéêyÝà\-“•‹b‹[È•±~ke¶dMTl;Ö¸öëÓÐó²>Þý¼í[Þ)·«©yêë8oŽwá”=x¥Žd_ã»=šVÖ=ÎÿŽa¹XËÇ‹mAø ÓÜ×ãZB;%'{ŠüÜRºŽ®¯q'qg@±p×¥ð +±7ø§Ê³™&t•¿Hýh¢ÁPº}ÄéáI-f–aA&ñ£ØÊ¸MYau«šñ‘šŸt§›‹Ô^j뇻‰Š5t1~Rm5âl}ïƒ`¶¹¿½øVåK{Ü2]áÀ½bô2kŽŽE+û†d½aõI¯P•Ý{ôü™3’Þ÷3¸e-Šoç·´tºìŽ-¬¶. \eìåz(KT±&ãŽÞŠ4n¤«ú¥r„Ébb®ßí—;•„ú÷½>]¹Â+ÙöŒdÀÆ@¥óƒ÷/ì;º÷Þ½µM‡vi•±³w¼B“Qý&%+µ6?ÕØjÍTBÌI)|éà°¡åJz}Þ!µ•¾W.Dâï«"¼síÖá¬Ï×PÔ½ŠÙ,ÉU…­e2ø¶Æ÷Êå}ÛVƧ;ˆð_yûóÈþ¤ÝºÈGrwÝìX)Ài,¸+,ó–‰…hµÁÛÍG¾ÞÖ§oÀùI°«œ½BÜgÆÑoûe þû](¡NÛGG4qx †+8“ô2½oÓVǬŸjº/½ôþ'ÖF­ìμҷ%Ï?–T©0œÜ£0‚_€sÜÙ° ׋û~ÑfŸû×ÚæÑïÝßmN>‡%=Vp6)™Hz¢ÌhT·Ã&¾}z©[¦‘¹\µìhÈU͹Ü'ߺ!dÏýø±3Ô)¦¢uW|ÚTáËÊuåËvgŒïœITúÍ@â"‡3f"‰pE˜¢¼ L^qfGœ:H»!®H»!®¸X ¡´P ‘*vHŠêHéREgc‡¶ämrWœK8„z…=¥<ƒý<ÑXhÝ—td b°h)œøûëÐ!uà´ÃN Äц¤Á0¢T£‰%Î="¦øWb‰r2ÒòT±Ä=¶«--úòÕáøÚÝÂVÒçY5|ó޾ÍôOW´¬ãã?‰ˆG­Ù¤·T6-sœn5jãTðºSÊ0“¼<ëÝ^byw'òïûb¾~Ù:üÜáý…]ïBßg¶MDV0(ÅŒ},~Püàc3j¡oך®—#\¼|Þ(¿Õ/Û÷î†0óм0¦ Þ —rÞ] ,ŒŒ6ÊñÃN^ùÙ±"ÂqÍ•ç–ÅI î¿%$î Ñ ww Óœ<Ô°4lÿNçû“G~îñ{lì`]Þýsê4ÛÎ[v±Ÿ0bÖuRxW‹—2æ®õ·ã¯>îvË<«VQG|ÎÖ&æÚE0O‘ùBÿ(çîdýµ5#M …ÛÞoŸ|˜4EK¡‡·M MRåäêÛÜžØß·õ؉/“Þל#\[¿<=’(ÿ Ðå¾ÐâÃ{"ƒ]Ôo4Â}òÆY»þhô¶¥›TÞx0óᾜ]CjâË›ã2iÂ¥|Ôò™›#?[(£Ê¾-ª9Á¶Œò[C™Ÿ¸ÆÁª·8ìƒK3M.Í?")&ÏW1 ¹É£ïfb}eØqŒË„‚Ûpƒd¥¤ÇH^Èõ·ÎèÿyžžíûãütôX„C©³ŸGGoôã>Žç{z¿”¼ÿ<&¥ª+CÒÇ`ÏrþF„÷Lf%–g¾Ê|òáÄW±áãÃË Ûœn‡VÆÜÌ3û¨¼eåtArHeíY¦›hdOÏê zº­n}ý݇ǥíØ¢3”–rØFõØÙK|1H=­°¦¯p;WÛƒ7'PËV¯tcˆ[*—Fw>öÜRÛÚ}ˉÛY”3Xv]³MàH6ÕÌÖw¯1?»ë‘Ö8¯X?oÆ¥Ûh+ì¹ÜÕ¢çZ·¢¾³dµ×<ԡϵÞë”lŸÞYÓ°­Jù}A‡FF– ói^f¬1=5§¨™b霕I—–j´ù™–½fŸØ*™óµ®u©ˆf ÿŒô?½ÔmÙ-ÕmrÜ…0I•/Ïê„ì–]º¸lH~L$S«* ™°¼¼æç§më™/6Ê7E-•&Ê$yU&áË“5Óî/è|ò¯£ èJÿXi¿[9MyõA%˜3¿é+ÖeçtÅK=%ÖÛŠJÆsêþȉ^kóPKak“ÄÖMŠDn&¯;ûë¾HÜüvfõ„%+£DsîÆÝu£­µú'}<¶ò-W‰®aýÀÍJ1ﺸUñŠ_Ý]%¥¾õË>üíÉÈ„ŠcÃÀÚ<ƒ ê+œÜzeuèo1 ŽJfU³émçY÷¾âñ‹ÁuÅ‘åEÚ~|=ZŽ¥ódŠM­”ˆA½èéëÊÂyO'ßÛâW´7Yíú“ŸŽÏîÒ!ôƒúUôÊN'<ï»8ÔÀßüÒ›ù8q\˜íê3á†Ø)ATíIô°5ŸZÃjm‰ƒ˜DC˜v™qÔ}XÆ õö%ìªÑ„ƒÏw Þßxï|ã f^uE¦p¹Ôùéúõhû Â˺1'U“NnÜ~®EWÿ^òÞ÷ÖͶ #å…NžÜ j5«[‹ZîÞ8ò¾ÙáߺiíÄçÕ78JúyF^ga3[Zhâ^-ïÁu‡®ð‘‚g¶ó“Øì² .ý Á¯í`ÑÎ%qm»ì!š(¦É•YÑr)UÏœE·Ñÿ«S5ñ1 qñîÉÊMZºV‚/Êp¸M%-gr3¾•9¡>¯®³²<ƒmâšVûVq·Ú'[¯W#ï9ñ‡Äéý€u©åúÊ•wÔ}ÜbS»;¦Ö WHÿ¸4ý’P‰Dæ¡wÄS>¥q»Š ™²ª«¤žÒãaˆîÆ£‰|ý‚ŒºÙ—^ NœiuU/ŠŸúÉÁØ™½ÄñÕÛý2=ÍÀÌ2üÛí÷ʦƒ½P+]]N¬–°„y³ñÂçí¬PË—ƒ [Ÿ&êäzŸ/Š”ìlnJÉJzQ8ä`vü;[/IRAÏ æÉšª]Cw´rªj?»25†{'”MÚ‡f¼J)Ô*ãP<°Ïó0ú£2Ü+[àG‘æôº¦û==ÌFn^ìë˜Oõà?p³Ð§À9>̪æUûÊ*xÄ ÷1ÙͼsÇæ×"Õç׳üˆ”gŒ}/°QiÏñSt¢±ÚgŽŸä5¦ï®ì®_¦úyUæ‰u|ƒ±ò‡µu\ž¼m¿ßZl%!ÑòP#áC”†š×ÇëŸsNÈ4ÿ0x>¯Èöçí›2­/ ÜyžÁâÚÅÜË»àu©ò•1ÎÑŒ;¶:\{%6Ž¿«™ý’ëUˆƒ‘µƒ‚ãR¡ÆÌ»ƾ!×ò¿WK|á€ï¶ß‘E§ ³vö9ÑL0”«z#Ó2º››ÍœQœðºíC±Ã.qÕÜ»XÎ.¿2͵ƒã«œ­c–äÊžÍf6¨aÙ[X7¬õºS¤Îr)"GB¤wŸù®åîqW¢ÝwÐ9ñÖÅ_tCûÙÈ[7¯3ã;L‡Î/)®3ÙªQ`®>ZUÒÅz¿Îwö1¤%=uë(– ƒ5O}=ë˜W¬o/ºnÕr¶žÍêý²§þ¡šÅw¼Ç8¹ÞM¬8²Ãµ3£JÖ}¯ƒòà×Ú¼4z¿xÏïëQ;,}L.ò¯ç¯;Ù§Æì›þ`ø›\Ö}¹¶'>îæ|e§ÚoèùÈu£žU%þʹ‡S· ¦%swoZõáõenÅìä0÷¥m¹ð]_̓Z\‹,º~Š'wùŠ;[EçIøZm±?ºÖwãßA¼À1º Y!ä•S½ìÝlv4o4Á³È-»ô*#rß/äî!ùTÒé8’MÊŠÀ;î Ú‰:å*¦ Ež´îæå5È[±k©ÛƒBéó È4#Á=KÞZø1…ÑK6M´¦>aÑ-ØKÕ½W«r¾{Ÿ2V×àû’œíêœG5ÖOÔ8^‹7ßÖ|Á’Q7É:mìÝíp¡ÝKúNÄÆ<Ø\¡{ÓeVba“Ö@qù5GÏÑc×a+R†RËXw»gm×´0á©)›¾¶Õ1»¥î桽홆~=Ü™8[Ñg\›=bZ/;Úo2f>ûªÊOÌÇ9ìŒL!(‚)ödë”*Ñ8±¾Ó½gë½¢&"ëmš¥óqnž~;ÃÖHñ#¾ÓÅhßÔ}Ï3fälÊ~÷Êå7uÑÄï „&U׃×Ϲ¼tXætMzó'¢žö€£Y:ÝÏÛšWScö¬½ž±½ M#q«–eñÓÀüÆjϳ›vg”£6ù7££ÜÅÏù—‡4i—>cä³·ú÷×§˜6T™ÙR›ä@ ïìÛ‘š<§«¢‚Â9aw¿F0%ÇHö ;«rq?MÐr—" õ}®¹ŒÞ7óxf¾äGá3ÑW´Sp±›6 øiÜ_þ–.>È(äqô[su†Z¥k„쫜~ßqou_®~uM:s‹Ó/™–Z†f¶ÓŸ÷¥¿É­šV;Ä4áϲóQö™ƒŒŠùý£ ô{×­»¸5‘ƒûd½ª~yñ6–mFŽ{éØÕ¢p9¢Ü†ï­ÈÚû˜ø~ãè¹mÁ…ËtT8Ž¥]ºxgKòµ¼!_Ób«‹Ö2;º_çªdd`úùü(UæÛ÷¼K—µÂ»GíäíäöÁVü¹„únߨk;­— ÙÐo :&ä¿Ç/7ñÓ+«’qÛ8âö»Ë“Å.iÂ-W‚V|`²çÝk%pþõëóî#«…·ú5i¬ü ç86î–{‘£©ÓV·ËÊØð>û 7¯½Ü œº6ì;¨kPs᪠FƒrÊG›ÍÆ/U£ÑïǺ>ú*ãWß;àwç“ü©vóøû¡ ^§åãÌœo\J月ì~ÇýýË•ŸÆå%B§ñãë ´wrö—„»o_÷®Ò×4«ÛfúEIXòrøæ]Û7|èÝïmwñÀR± rè½ÃÅ&¶ñn|YQ*NîY¹õWÖã"ßóÒë'#Pàî}9,ñ¤U­¢š@±™y@Èý}?•Ê“˜ünŸ°Üföv”˜ýò>ë&adÆ&TŒEÀ2©uMgá'Þ]î_¡ øF%|xü¨ÓÒκä¬QÁ½“a«5×:·<Þ{5u:jxêÐ3©g—<ùÜÇ+rê­®ø¦£ŒŽù» ÷`¨›aÛjJ¯hG¿I¹"Rê¨ù16Lsìøf‘«¾¶¿ªvUòüPLxhÄÅ}“ÍÊó‹^£>Ý…Â7//Ž›ÃË»Íö,m½•Õd#9F5É?2²ì„¨\ñ-ÎØü‡Gϯ߾3«²±VëST“n†âÕ4œÁÝõaN·w¸/+ÞÌ¡U:-”=<¾ºc+c{¯³‰Ïjºõ‘Î9¤ƒãÍú÷ÑÇ""àºz¶î}B,5èinQWáô,íÕ–+Ι1ž;,;¹:ÁâøÍWÕÕݹW«ßLö>Î'ˆ2_.ŒŽ¿Ú<`óáðÓ³#â­A¡š2]GC}õm×¾PßöÕòÑòeê{ÊÒ^vÄÝ\êÚ?ÇëøH©Ø²¤¸d:kJ=¨|zàÃÊìÏ+{’v :½Ó_4àÝ6ì²Ñðw¾*Gqùçb&S]%ͣߞºŸ~ͦµÝ#Þå㋨• ŸÜ»¤ÑjÄwÿ óлQ•"!µç¯8ž\i=«¯—Mç¢-ÛUûáküù¯ÏGu¾$>~(Ô^ä©X¬vwç®ØëWôGÞèYLU°—Œ—äªó›ŸÝüܸfÝa[Û¯‚µÄºî'Z;bº*VŸ Ûéåuïóö3"<„blbš¿ïÙ ýÝâçת–­¥‡v}'^&еðn u²‹æÀmm J—ÿ0µÖq ·Î5Ûôƒ}gDб¶»ìêŸ?Ûd}]6"½{¹ÚÔ©êˆÓþ épîÏÇcxy™>0pGàïdý|f7\¸òfM×§G»oÞVÑõfW÷Ôog—7ÉÜ?ªá•µ¿n2°÷ôæIÞÅ–¡ï[pSÙ‘t!Ç^ø’bΤÐ'Úð0w‡ôùtâL|PzD£y>d¿i™˜ßyúÑCŒèè·»Omf¸¿’Ý1ëž}Cõ|«Ü¥£ïeê˜.ÞH;Á ³þtÐóoOϯY‘ÚÖþ; 牧‡‘ÎþËaŽIgÞl‘Þùai„ôœ¸4å½ÞÙH¨­±% —‘ ƒªn òC¹z£‰0´«&ôñþ!ÆMMÈFÎXÚØO í‰Ñ Á£-BL,]C¼]•Ü„¶©P( a´DÊOŠ¿`h‚«¯–¹‘/X!H9È×Ïè,È×KPR‚@”ïàc)!T…è­&dkl#âp>Þ" !©$ —€ËˆÃÜñ(_t ï ƒKÊ (ñnîÊæÚ:d„À/5!0 ²”T`` d Œ$ï!WRR’’FH!@ B0–ˆ ’Àø„ÈpÛ0,Aꓤ+ÎW c+—”–¢4D‰êcpXøå‚ó'ª ùûcÜ”åÐÒ(i9 ´œ¼î—/xz–WrsE+)(ºRšó£ê&M{@Р @à›²çæïŠÆ« éšÁt=q"©}@%!©¸Wáî0¡d2¨u”qn÷`m­Ž†ËKH+I ”,á2ʲe9Y1i„²´´ªÔœš ¨tØøw@©jRâð–K¨{àqîî°ðt20f¸$!)CF®¥*5‡:ÿ4½P~ÆÆ¿¦˜¯/ÈÒ`=emœ«¿/KÔ×þ3MýÓsìæ:Óa?¼$n®Rh0Q#‘tôØÍUÙ‡÷E- üü|0®(°a; ‰¢Zꘆ‘ôÅ6¡ìƒÂz¨ I¯R·ÂBµÝH³áƒ!O '5‹k¹’"Ë6øuFs¨Ï»µë¯~þ9D³êP½jB 2œ¯Žgµ1E®…k)ˆ‰€Ü/¬­ JŠ´B PÑHH„¤¥…€j€týA ²4/$/"3—5áÑî Ò0œAzæ“—““‘ƒ¹ÃÈÏàJà[ôP –ü ®¨ ';çPOFzÞ3…yÏ€§róëÉÍ«‡žßBI^fn_àr²ŠóêÉ!æöYZ^f|@ç>“‘›7^ /JróaóžÉ(·•W•×g%YéùíJÃçÖS‘¡zFÄ£0>h–XþD4 ç³D»zbq>8`I˜(ðÌ ÷²K`Àûuý‚Åa¾™)CaÝ``¶R<ÆDBôÄ@8J&y¨´ãF6Å EºÛ… †öŽ@ªˆ!‚©,@hw4†!À<Ñx4Ði< KD»‰Ã ”nh7  `’ ¡Aãa±8"Æ(ñóC£ð0 †òñk`Шָ_зa¡j@üfG?-Áß¼ƒõ!i†'>ÛØIð¶NºÆ’ú’–’ &ÀÅi P £Ü3ˆ ÁÂøù»æ† ¶ODa°às€ú3dûàpÓšL@ÁíŠqǸŠÃñ"‡ñÎŒœ]Jw|QÞe°8 æW¥ŒƒÌ]h å‚ñ»„sa!êÌ4†‘ŸW@ Z `‰÷——¥ À‰4±4×0±„VI ëV ÌÝë 19”âÜãÖ²™Œõ €Ãœ]F %>Ú$aVXL¤_Iía ¥ŠB¡¿Ož™îS‡æá,ihÏ%Ì?¥`úî°`œ?©ËÀ8)Z µ<‚äÙš¢EÅ)’à”‘íReŸ`h¥Ç²P *ÒàÑ»ý1x0ÍÌr ¤ùµÑ\'JZ8 ^’ôT§tU‹¤kaD `±›Xï]=Ñ®ÞdU µNѧ³Ë1dŸöÁ¸àQøà…ÛÂûƒlMjëo“—Â4&¸…¸ƒà jK*=K=Ç4Ê–Œ‡¬s-Aà°> ðøà8`œ¤©Ì>@û¨Iø± 5ßPì šYX¿Ýpí ”á|±0€>‡T ä×[(ë ´â’\`m@C¥5 DúJnCÒ“dGb°0ÄaÑÕ¸0R_ÀIO`ÁV$[”BúçƒÔY}¡fjQ$òýã¨ð]*¨o€ Z¯Á´‚=I³ªNpÛDäq#½¢ðÖ?&Œ–ô„©ü v M˜M„l‰£)%S“ffò'­4X4`€Óp ÄÙÎÎZvº€åì ®öä%J6cΡ)¦4¡!A…l‹CfþÌŒ@v€LÛÔÆÂYO|æ7˜‡fîoð€Ô/ DR™ÂRËL Rü¢wóMÆ™6©Ô<É6Bj˜8k˜h;_hôý"ådÅ›aÕ&Q'a§n•<bj2#©“K¨€f†H*¢›a:2ÜLg ƒw* e)˜æv`< ¬÷dïÌYFÆr0LyXa¥² ±a”ƒžˆ89_”(… sÀF‹äï¹((³ •QÌ›yª9X '²·À÷+Ò-_Œ\6€pkèIQ‘T3aÆë£’ó<ïØù>äÊÍøgP™……³¥¾1ÒYÖys6¶Ðr¶FšÏyêl£a©ej¬8{³ñZ<³.мƬLô-,µmŠ#¥2HœE1‚ÍZé›ÎEIvR©[h›Z,Ðiú7Ý6ÈúÆ{ì Ú Ð|.3¸Ó Å# %_l$O+šJ€^¡rZ¨<IÚ‰ÒEZê™ZXšh$´´3C:k˜ë"fùˆš%©™hA0ÐÔ¡•ã_Öœ9çs ™óÍLµ€ §QSàŠÙáEE)ðÇ~¢ù)¹Y¤…¹–Lfkk`Ýð Ç䬟3.`ø¡¤@jÐx`9$/Ô$ïÒÊD´+haºϲ>ˆÍ€î$'²Ô€ÕíëX[ ¨K9ôR±‰¶! ¯à“þºŠÃÓ P3tgIóBó4¶¹©¾öœ ù)%ìAÖæfÎ ™-æo‚´ðŸ•GÚÒ9d1'uå&yÃÎo PYžн!¹õ`°‹:\! ³LI!ȵ ½Èq&3ƒtóñÁ¸‘Â[ÓÕïC²Ì ¥ ʌד@cQ€+NJ-BM4r” èÇ,ñ(zÔLCËPC îè›èÎ}j©aÒ`îc@X蛚Ì}¬i¥k޳ZÎ- Æ±0,dë›ÈCqCŽº‘§™V¡hè8ë› -åE 2š"³Ù"ò\P*Ã(Eõ?·øb¬a+6£ÉŽ‚‘B6¤Ø/„€@ x’ì*’i p59ƙҮsõˆ39Bmj¢…¤‰jAûÎÄÂaª¢ÜÿÙ›7ÿ²ýg’­ëì ¸,.(À²ù[yÿ ÿŸœ,Uþ?¸4¸ÿ#'£€øßþÏOþ¿bëfl³Îº= 6k^°‹J+„v° 3<½Þ¤¼cè• Ãòž¯ \$N2é¿ÙöÙf4þ‚>øN}wÆ‹e<ø€Éê$™©í«—]¯‘)L,*GÙ˜ : EDõoyˆ‰Z±7d½¯ÐĦê+·±ò¯â¹—h{§ªÂ«Ø^ûýëŠojê½wzF‰œßen‰ì†Ž)qËÕx_øE{"T# ¶f¹šïòGÍqÅ[mÎ! UãWÆ ¡‡-XMlÌ%õ{@õ Ñš;,êåoáêF¾•Õw?ØÛ÷±ß‰ñ AGµ#|åŽý©±QwÌ슊ÝDÕø‰Vš>Ë‘+‚¾”Oß$ô°(°¹ÆÌ8Qbȯ {µ’+¾³OLLÒ­P'9ÖphX„ ÅøSèS‡ß¡»#lÖ·÷qäjè• ]¹Ýü©-zÉá+LÄ(–º·gßmwµÛ£þàs²Ã냹/å×&%¿WÚ¬À~4Ndì“üOƒÛ?‘¡ÙNBu‰b7Bî%pFËÞho IZ¦™ßn°¥Fy øØÛDµâ|NB/Â5kÿµ³‡6‚±/UËÖúz¶š=â<{éæt˜ïÒΕ§8MnLÈr„÷ìhãHZsîö¹ç«ú6>~»YáÒˆKÓ›iŽRŸ`¾)†óG¢;¢ö™ƒUøWàïíUèRq*[¶aè´¿8ÎV’{£ ò\¡“bú¸¼Dæy;Ó*ÿ³Üº±SnˆH–ó‰ëâz«ßçtÕÍ’³Ô¼Ljۈ q·ðÁÚ§Ì9߸NU–Ê= !žg΋ç uì`z„»³…gUÓ·7þÖ7ð°Ç»Ã3$ß ö?ö|få¤|Ñ_¥öìâ»”­ˆêÍ&û~ž{·$Û婘ÎÉÒ1ˇ´^ž ŒÔ¨½¡«¡Â+üEV¨WâÐ2ÎËKÕåÏ ¼ØëT°¶®¶¹]Ç¥ùýšÓ25yyG‡›×Kò(;&ÚìöKsžÆç¤Ø6ÇåH)í5É•¥-«©‘p5™.ág>ÔŲ¾ê&÷&—»ðZÙ¡Öäùº¾ºrb¬ß¾Ë¬á»t¯ß}ü$`ÿöâ'‰kGóÞ’‹/˜\ïuàØû¢•—ºjÔ'¦”†W×w§n“”t¾I,ÑÖýô1:©“ç>æ^{¦’œ‹ƒ[½Ðz­øJ`bô©HRßžƒâ€Ûj#áþr/{,åZB¼¯Ê.¿ê³±®ÛôÛwFׇS±‹'“CÈHÿ/™ÜüdrðÿðdrFz&ÖÚÆ9™œ’Ü‚éÎþ ±Ûl)Ú'Tù§hS»ÁfjÿcIÞ´mul‘ÿD’7Yé?™äm6oØZš7Jº¶?Nô&M“æMz^’7 ~7WóoÎôL›;Æé×‰å¬ Ì,4 ÿm‰åb‘…RË-N\ {X„:±E¨( ç(‰å€ÿ¤I,'ý—ÓÊQ¾ý~b¹?Å*ÿtb9RÊÏÅØmÞ+…™Ýþ^~¹ÅTõj~9O(³))™ÍwÁÿŠDr2Ô2ÐV«Í,<¸#àüÁÖÍYnæ'+zw„Ú2»K¼tͬµÅ-¡·Y~¶nxyåwüƒnÃ¥<—žž^®qtU£hÊkn/5Ñ]On ²6¸«rçÝû°j¢ó 1À# ·&Qá]èǯ?~þüè‚ZOÞ7áâ…Ý›+î~‡×âbâ–¶šº·ú‘„~›·žëOÔ=zàÓ9í#½-Å¿®¥M¯ß–N@êQ÷¶]>½Îð^N·µ:ŸH°]ÿ= ©¶Õ0AÊùÓ»Ó§?–#=2Â#6ï´?“hÁñ}㘙äiv6v=F¶ØBz»g·û/ éÏE×Å"#޶m,¶8ŸzÊãŒÎ6©ŸÛJ¥Åoç¤ä]®®6G¦Ý~4=ºŸãL”€«J«8›á£Ô'Û¥göf>Q(¿‹ëVM£¼JþÆ.5×õg™¿®¬ª ‘¿æY«–ø»wÔE¾îSx¤£D|ÕX®kECÈΑúàØä‹p£{[%»™ëÐ~aèeú×—`o[6X.3Û¦Æp¥mzÝ«¸8‡|þ”©qö œR9"~÷‰—6g½î¶ÍKÜ·+ÝT|à²z_’þ°ðá«™"ü¿ÇĹzÐítÖº¾æM˜÷­­™uWJ…;ôz›¬½K_ò€ÏýÏ2¢cäëI‰5{ªÄ÷³>Ô€ñȰe dk4dK¼\î$:ì,, Ný¹úlùÖ£Yf’žÏßÞ’œªÙ“¸Êî|Ú8¬tªoêè»ç7Ý7Lº¯üBiÕÈHo,üiŠóÔ»K®Ë%$Æ4Mzï]q 1~oÍjCתm/O|ïÖX™µ÷DHÛ΄¦•gKÞã’‚^^Åå&Ó):2¸v<)ØÏ·:qª7â˜6ñG½ÕÀ(ÝÝU"Ì=Úb§5ûmVl®€ÑûTÉ™03?Æ^wôÕÊû¦Z¨þºð¯õuŒ¬gV}è ßÈZŒß$(;¹ÖtÂóÑkùëKÏv¢Ç3öÈo+UáJÔ¼ÌqvɳeèI]ßî~ãnÓ¶5 b¼W™fV}ȺÕ,ÁŠ–K–\³y9/k´Ë–C_»Þ°®¼×±o“æ§½Öp\aã–ɺà./ s£ãÔ¥æõâËb~½ÿ".9¬:×Úñü ÉÃ'Dšc„j¨Ž Ôúw[n›HÜlïù#nç·³k? ØûÕt\‰d9+\l¥nËÆk5(¶”Š;V›ULá\9Þà¢n`=û:>cD–Ç=é0q~²êðÝàèûGïe˜ÐéVÒgòÑì.BX>·—Ëzsö4¥J4hFlMâ?p5æùá¯ÏN yó<å]¿kò¥„Õƒªê ;^0Ÿ]ƒÙrC÷8«Û’#Èj'"Ò‹NñW±­¸Ãd»÷µÖ—Ü'OE—•²yå¥ð_,Zí§¤J§Tî[p©‹›£â¾Cš3S³KfÅx§ûí¦åD˜á(j³½ãçu^ ÷ÞÈ£»K¸`ÂÐùVäNç‡í¦˜-ÏžîüRCçÝ¿:·Õµ>)‚ÑüĶMtïŽ7GLíþxçFÃÁÚ,‚q]xgŽÐä«S–h¹^êFCÞÅ5ŸMnî×׆÷ûç²fÚÃ/~ùþª'+ã=JRÚ|ógL¬Ï†“ÖÒØªõC-^ˆtXن;Šô}SÛ%ë¾Hng¨öè=ïuÌî®ýn¹ÏAã¥úoãÕYϯ|µö-®æ8RŒ¥Ö½­HŽ8xM% Å|eÉ!éÑ#×ßìýô#”½¢Oó‹ôl:¥];e]—>Jìd)ÌÕ­{35›øž©®-øja×4ÝÌÆ÷-é÷+¯“8hú¬AZzøÔÄN¬_Û$Á&1”K}{lúƒK[$4>¦È »O=Û¿~Ïݬ¸ðÃlãa J{–´ïí²GîŒy¬WïõSŠ®+ô6^J>pIð©f¶NäîÛ„þ»ËeZ¶Õ„[èí¾Â½”wá½7]øÐëŸyÙŒtjX¥Þv´Øq¦ÙBU‘Ð'tVV¸„ùšÒ±š‰Š+>DíöøhD÷­à¹{€â&w¡ý’Ëâ;qLÏä]óp›ª,§ÛóµÇðÇðOÁö \s¸ié«#+áV÷ßPkúÜ%ò~åO~ÏGÏÙ’Où˜4>#¾á‘žrkoëå“¶wÏ}ó&äœ×»Ä¶d‹ëúèRTƒÝéê³uÞwÖ±L>:íߺ'ÙéKïd_ñ%îÍ Š¥:›†·è‰¾ºâ0ºwI_ÃiY¯&©ñ¤°/ç—]1ŠàONS¦ëö¹k/Êñ9>éÄ·×Ö×Ô2ÕW&<Œ¾ÜÌÜÉ"W¤Ñ?ð ýéÅq¶ÕöæÞ/Žû-¹ ‘|ÒÿDN†3¸õÒÃ!sË3.­ê‰Ï0w¬Ú¿åéÉÞð¸Îµßa¥æDLK¢¯zaq½sÛú×+›št¸£oñ~¿‹‘'–Ñï“øÈelpà†<îÂs ›×ÚQ'Ÿ÷”µª~fúþtØø¥¾Dìƒ-죉Āk§ëû¼]‡TÞ4ÅZÉ)¦™¢ü#@F|Enäî­½’‰W^KeœïŸ˜{ª6Q6^´1þډ¢Órc}®t±šéÝ'?Ü‚þó/òÃÉÿ'§‡s™“ ÎC“#næ²ç™Tq*QÜ¢iâþ%iâäåå¨ÓÄW;7ÓÄ LYnOü¼¹IÙÛ7Së½OŦÝt–îeª1<«x¢xÞò,)ÛÌ¿wù1ýã<‘¼ö1ÊÏóN3Mµíü0–wj2ÿçåÄ»oš–L}y》Î;A¨Uýøóçƒ_¬ÇŸßþ)¨H¥ ÿËŠÄ|›p»e‚ZªW·$†Eí¿ s¯rSáèñ覆‰ãc„ê·«Óç›\ù¬ÚöøÑ§Ä“'z2à;ê0wÚ”úß+Dt”!úZÑUïÙf ÝÉ×Kƒïˆ½ÓÆ» ÁÿI¿rõ‰ò\5øjÔÀK»ýÕ—cïLòg^Ìó~ƒÕ×6 )û¹gûŽW÷¹6(Ðû˜´Ý–³:ß{¡DOÖ'A5,°œ»²M/9ÝóÝÙï+;™oýâת2ÆÞ¿Qb'‹ª7²æê¤9Ax«×Z¹„&ÝšÔ¶”I‹•éû_… ®Ë‹M•ß‘˜Qñ åŘÕd qEýê™Íé=§ò.Øk|¸Ô–Úv-`‡XFë«•¯OÅ_4?™¾Ü Ñ£c|YÞLõY¬=õMìPH¹ÊÓÉíÊ<ÞeÌßö|#˜Ô'=KVÂùcw‡ ÚJh=¿fÑœx뾸¿†dDbÁn—.þ}¾¬8§PAã¬äoìwS± ­?äÐ_O ¶È2½ ?ñSX¯~nòu®s«Páýªíå9c«s>ÉN?§p¯öÙúÏÙ} ½âù—˜p¼?äø–="Ñ|Ö!É<Å r©œ®qÁYO– ¿ðþFª™ò3Ët—CŒ;²äuéu¨«]tb4ûiU‹m¡wëmÁ~*ÙwNz™ûh¡¼—UJúë éÈþk?Øß ­Õÿ˪VZïy¿)ýe4¢ ùÍÞš¯Ü”¯œ>*/<øBdÅ §›pöÍ›9²ö7¸Ö×[%‡™¶Ê•7ß-^{ ¿ñƒü=Ö<¶$¿•Üâ1È–ç‘ñW³åŠ—Òçl J^aÖ¶¡Uò(6.³ÕºjUÄò¾¬mÏ‹ÃÃ×g³tš?üÐÙõV ¼Ú–7óÓóÚï¶5Û×·¸˜®Š’ŠØ¬.ëúÜÁ¼?þÜŠò¤gn¾5˜ã#OB?\6ì­@5¸Üâ²Iª\üî±÷þœ彣K£ï5•62>™–ÏÙ~u¯‚Fîg]qÖ÷,UkW~út¹ú] s¯ÒèË]|6]þB7ÛãCâ%wíÞüÖú²ÈV^;“›²kÆF˜U×#¯³½Iµìykë1·äu:ýôЃã//TÔŒ°yìÜ^˜ëžŠøÈ§+él?À\5&šÏ1r%å˜å«¼ó­U¯þ›“:~¤î\/?ª‹”NžhÝ (³c“󱨀KjN±|±}lSuÌk¢Ò 2MTñ}Eè[ø4èK|ô©µa]ÆÓúh¸«=×Ålbúj¡U\4[ÚªAÖ–sK£â»îý?#[OLM?ó÷ˆ÷È ­«üºÒîë›O¸ÒµK´>Xo¶BCúâj¬¢Åáç†ô \·ý÷VÛ Ùg`öÜdF|{õÀõ‹_û:óýcÏ÷VHµòŒÚ_ÐÞXš: ²~ÃÍôMëTrv¯ÊlW8rïέÎ&Ão–êW„Qw°Ì|-]páh\•¥ ¯ ï}”öšç#’æ1ßðl:ã¡~¼;L|sá>o“þTƒÝZ…g›P£yxÞä‹L—ô7¿{†E<ÌåëêHº{–ûÔ1ã'^NíŒéj$FŠ{Ä¥&e{ưž vä¬ä W1~‘aÎ'òLâ™äÓ¦}Û&mWêŽrå®°Ž­º¢&Ú°ÉßhÛ´º#HôùÛªÅX¿‘ÍŽ9­©vtUJÏ»\ƒÂ\°N÷C¹ª—ØœÝ[\ê}o„›°¿¦JLò'ãq£Mž,ZôßݺVT|;²$±ì|Zq±„±SÞòÁáèÝ›D]«%®žäí¨ªÊ?UÜY#«Îg°Vÿéaäåê¶‡í‰ +j%]Ɖö8¾%ïµÿÔú‡¿Jݪü„xˆÒt7|~¥¤$[‚ɸÓ×VTúuŸe§oÑ‘TÍX²r¹ÌdÊù£»+‡PÝ«ë~á+Z+##´ùˆúÆõ"ðC†û¥JjßLÉU^GÈܳÒýSu”Óý2ó¦çE½Þæñ&û,åõ×Ýß¹q놭ÜÁ0ï-.aÝrß]$KN§ä‰½ÈÚýîÊx //O6cgrê·³—Þï^ÅTT~'’1ÙðË;«^§¦ÚŸ¸Šù$ »íKhMrœG×¹ûUê'ߢ7g;l^å?Ø5ˆZÿ³AÉ:@ëÊuó±ÈŽüÌÞï‡UÎF{mÛxà{´ÇÍ“ ÃìgY~ÓóÌŒç Ü¿yþ™ÛÚ¦˜5ìšË8¿>;É´[êÂLM8rØ}åõœB-Ò2}»—â¸3d;Z` -ÏW ¬îûÂ1,zÔˆoZáºáÒMEG˜¶¥3òf´WIôi~_W–\xö@L¹ÊÀCN‡«2ÄOo˜ú¸DÃèíS‡ªÇМ.ßÒlvq(8¶¼•Ñ\Ü×㫊•/¸µ^wC÷e½},ïeLŸ5½¾€ l7³Ÿf¿{\ÊÄ©ê!$ô{ÇIÓº„5ŠRű6q#Ní&(ã€Jkw±ÌÖ“'×;Ú• æ\ÁP âs2ãúXbí±·÷O¯HÉ­Vœ°.WLßôªÖI)Û‹ð1¬„©¨}íÈÁ/ø{/ {ŠÇlõMÏjž0àsß•ðZ%AÛæ‰ÃÉŠ3¯´ð¼Õ­\ÏÂYö¾Gá%ê9ÖßÑ  á£Ç-i6k5®éfö¯_= XÜ6Ü'ä•./ge•ÀKÜ/«ÚÖZò¹ïbˆÊL—Žý®÷ß2Öu~ÎélÈõÕíunöJ<}¤®çUêÎN›káÉ7'âNL‰»Äö5­nÿõÛK;o<9ôs›s¦Pɽ—.Ó²k Ÿ‡ :ß…ÉÁÓZž—7ñVŒÈû¶#BLL÷Âj-S$S¼ØÚüÁÞw2Ø×3/:PŒüÌ ÙákRé®+"›hÜeáu%Âb•â £ ïý_oZJïšXà!.*ój°ê™è{ƒXÜt¾ q8k³¾ãE±ü]ûÏpDÜŽe±íß²±C‰iðÝ~K¾ú]&™¤8>óÐøGï Wk™­Ó³åŽlººº]ËÕESKÙåò [BlÒùâ¢Ø±¾ˆ;_G¤Ž1JÖGßÐ{r*gÝI½¾k¬é=åu¢›´Kdé+ކfÙÅ_ËÚüvmuø§Ÿ=:Þ¸u÷ ìázT—gGJšÅ¡Ú›÷X$}ØN)$p?=xýÄ Œ]«W̵ Sß7œýb7’êôÁEuª#FmÀšøfÌÞyêÃCu»Wú;<ŒœRÐB]žJÚU[œ’—\·´Ë˜Þ×áåé'¡¼Õ­LÒèÆvÆ%µ®Ïé97··ˆJï­šÖ8ë³ë±—gÍ t›WŒý“ܺ•É[¶!ŒýRÒKÒsÍnJùÙ*󨮽êç=R+{OË"ñÊÉÃøy¸³ýùŸ¬<Ãvæ2ÏŠ¤~Á÷†C;¤$ªÓŸmö¿íéxw,7:ÄJn’þä“©Ÿ¹¯GÇÊíÚ¶¡6µÜÓ ü°oºèʼn½ùÒŸUômi<àÔÆP¸ô"oQBØN‡±¼TõÓ/®³.—þ ?²Ñþ¨ãÚM‡ y"ªkJ|oÝßš¯ÛO¿ì®gëµ¼«ÞlÙëÞï‰ã7þÔ$.3ˆ*útQöž…ë‰÷¼O´bOy”§îÞ|8NñãÄ~ó‡ûËšÂXãbztG,¿®T¢W=ÃÌj•joúÊÒæ­“ùõyL º"jIΗó¹—?j´ˆÙjÐÅmŸýÚ2ž#vë½GySwÞÕ¹žDÉ)lz£x29Z±2X®òç–¯›ÎˆEi÷ usOÛN~:«2(O¦îy]`uª}¬c´?fèbc·‘~ãÊ+PìQ­uøæ¯òk|né5=É}ùÕTßwÓd¹·R²=v—ûf ›êeÖÍ×Ôªqc¥‚ˆ\;kv~ð‘Kýò&½ª¥înÆóøpîo°46ÁØV_ã[QI÷× ¤FÆFKª×a™Fi-×í;ÜT —ÿÈÜ·_êV ƒ“¿ÝþºWÊä[zÜClã±8Å»£OW ÷½ZnÏòÖWŽöÎïìëÓ²·ûÅÜ„Ãá||"UÇlE†ãN÷ù^¦Hžœt p·¹Ô4<(ßs”5nå!#d1>³‰GËŽõ*š‰¿2儸¦ÌÞÁCòq…O<‡°"Rã/V`FÝà…›*¦û96Ôk ){”r¯€÷¹ø³!‰›b·Brݹ^¯Õ¿ ëEpXWðÌëÛšN˜ÖQžgåEg §4_ þàxº„]û³ñYi§§»ZÂ7Ný/@cïñ³üx?ž‘”Ä›™/lêxéEº÷ÃmÁMîjÁ{ªD†î½ýh{S›5ñ,—VHHãÃK¦#0§ÛÛED\^òä?ÃÁpÝ@ÀùíÜÆ’! Ñšz7¿§Ÿ­zrl\GùÛÄ:…ìg{rª·œi9'¹fš‡z8ýfDbüT!—z7AQr8GÏsµêúwÎöˆWxQ[‹¦ŠÚ°p•T>¯‹@I¬ òØ^Sÿ¢Â…mc¤ÁvwëR΋[ÞŒÄî·«^aȯ¡kªsA©~—§^ùÅ'S†!ÿ˜'=®R“µgËqÇB»ÇsûxŒ"èBŸÞâÙÜôöô¾³Ãß~Ý·a]oÑÎccC»í~u©=óq¹]н±¡šwGœ#”~¬ù¼ÿ©â³Cör&‡Ï*…Gw#’oîe”ØËqáÒÞƒ‚yï׆_Î5ÏôÏK<\ƒÎ7ÐÊhó¿]ûúHÊ Ý›__ùë ß94ñ›ð Œ’¾HÎÄ)ÑÀ?ŠΉþÕ„o˜ ßIúö/Kù|hR¾­$ZØäïÑì/Ö…15®âßů¹ÔMSˆ§=êrù«]¥ì~Ë{DoTq3´©¹žïæ0L¿¿ëc´ª˜ƒfú–˜\ž ‚«OV·ôE¨E|Šø>Ñvˆ[÷Y°.”žñáÎ &TUŽ´ÒÆ£Å»ŽÛ²æ/{ÜVaí¢Ñ(*¾±yoæãï§F{…ü•ÍqÅ{‹cŠc}K÷ݺ›ó½q‰ÏŠ7Š#kÊoßb‡oðá’_9ödiNacØá½¥ò/ÑW]EÕÜnºŠá«~m¤6¶µ-¾­–³Âù±ÌêuFYü5Ý©›b<ÖåŒG÷ž»yî‰{¸’wUœTqú§Ä^ö÷SÙ “%Ĉɶ·×•pÕëkëj ÞmÊ…©lßô‚ㅂ®ᇅ™CVCöùmâžã‰zôÜjÛ‹‡PFÚoît1ýâävI½óT{cZØV{Aö'˜BMÓòÓŠ*I9 rËkwi°«ç”óXO'ÂÞ÷ŒÏ?m}¬þ¦Ü;æcKòí—0üQ޹«k¼1å‹Ï5xŸÿ±1±xµß~³B·ÂÄß;Ðãû(ÂßñÒ°ïPüÄØ=„SáÄÇéÝ·Òo‘ÓN˜â.V3§Ë§úÈ¿zÕÑ<Ž¿?¬Å’Å·4êI±ñ³‡Ñ~½~ÊŽ ¿õNäDíYþc™¦ïAa“„踗²«wé¸`¦v§b¦O,?h)¬õÊ­Sp^ùápQÿ–B•|¶švzíTÌ­æ}L1!*Áá¬i¡þtM!›¶©{˜¿{´íáSAB×X˜2‚9¢"½~¿:ËÒ‚ó ÖU7–U ‹”÷à {¸òøí׎íÞs­ò“^Áº˜´7|þÙB#Ÿ¼o;|W§ˆ>Ûjž«À˜Ñ‹¤…¬Úö9jŨ s×ÅzUæëŽŸ¹÷è„FG!µÚßNŠ&ê ´ 0ËÁò>Å©mÒWBjÜúö`§–ÛŽóâÚz}®¹"}nÅnøüTÏ3õÕà.z§zæ6ôfÕWµY‘/·+w_±àá:ò!„EòK„f›~›¹h>`™'ßÊç¼"wO…¿z¯aìslƘo_Öí×åe§DlYÑvÞÔæ‹à·³NK~–š·⯬Hßûò’4»=c }dËfN6Ö7þãUŠ?zºZòèaq‰ÇÎq‹Oó˜~cݵñ~åvÖuèL|O~zå›Év1:¹µ ì½OGå²êeêÕþ†öÛ¹Ûµ›Ÿ^©ízÞ³åªÁ׌ˆI™{0‰ðÇI÷þtãóùqî±=¶Ñ åîÁêýÁSŽTñ01‡½ûÑ:  i6ö[ŸÄ6yÕ¿·€^båSÁ¢ÍWoòó×ϸÉ!¼·ÑÒží£²Ë‘•üʇwjTíèÜڜﴦãgpÃVŵaôíCÃ?°,‚ëx3õ lXi*ü|Ç{OνÐGÞNÐ`¹ë}„³íò‘·›”x£ 2¯šg4pæu¯ìW-¹%óé™-n¬ð¤ê¹T=˜¤ØÒKýæµêC_ÏøO¢Ÿ½ëJ½ïÔed€?“ùÐu­è 쩨m—&x;C®X¬vÑãÚž¥#jÕ͆®¼³$X|ìl«ºvUZyz¾Îõx¾ãçÿ˜˜&ßÏ<¢ [Þ¤}6×Cm瓯rŽ!ì1MC(³¥Ê;ËÚNK ¬[zÅÚîrØZ%%ÃËÆNvË|Íúrˆ\úì‡Î¬+¶Ãw[)2NÖx¥>³5Ùf©särYšÜ>Ñ]¥…#’׺ÜO_©ït(7á‹)ó²]-ü›ò÷>¯¤Ê·ÞÀp·š˜p töT,ÍhjJé¹_];Ä0vbÅm)­¡&_ÅÓŽ¨Ž‹5“‡Æ·Lâ–¼K[vfÝ5˶uKb•ylcF•¸P—=—Ó™ÕÐa–Y& ÍqKE¶‹«â^ðÞuŠëTÌ~xžáþ¦!Çí9‰ý÷'õ fZ½åXËžòŸdgmÇ&½ìFý[ÂÑCc[Ì Ì×p2¶ÛG¾íŽQýÌw ûÂsò…˶”"Ös²_¿--™<;L?Xšü–7Ño‰Ûåëîg™SWù™Ôó`$GßÄÐá_O6¶—}9ÑÛ»Â4UßãÝgûÄZq7ן¶&Ë?ÒíµþÈ~Zè*ëi=™ÒÝ÷$öÅlÈZË,›tÿ1cúQÙ†ÓkÄUé9“Z‹Çr{埾>Ô3ý²hÔeûÕ¾‹œ‰«¾¿îØ©è™t¢/3¾ºú’i»¿}E–µ½Øö%¢ÕLñ:*u+˜Œxǧ†JxR¹y>mï:ÆÕöýÈ*ÖCÛ¦^º±ÑåŒ 1P?蘧ïç''¾:<ÿ¸œÞv:Oä¼D‡OÆ;g ¥Œ›mòÐc8²™ƒA Þß&KxÜ›¡ÁéU5×aÓǨÊ£¯NSŸ#<ú'lÂm׈xįН¶¥SÚ%aØiz/öæ§®xž>¥¤Î{ïÜUw o7 1Z-…y—>ågÞXúþ™WËÚ}z凛Ù9ØÞ5*#ßïyeʽuIÙŽ­M÷~J°nðh¿3ìÛÈ í%.6ÇBG$àSk ÍßFu˜øOx\‰}¶éZV]dÕ„ÿSÍ{Z-èN† ÷Ì+"¶øÃ–Zgx‹z…™]'ØX#{êÄmodf™è>Å—»“‚C.ؽåî2¡gIªÂžèfg¼"»þT]‹­—ˆ\ì;kïÖmÇ· ÝKCöš¾y6(Süö鄯{ùŠÁ]¹ª»Ì ÛíZjs÷™mÏZ¾<ÖY²%d(Ó:­iÚ ù&Iy_{¾ü+§¥{pù{üç¶žþù¥žßòò†+r+ýñm(›ôØŸêöî…mýö½¶gˆÓVðcvßïóŽNðô¿oþîm³mfuFW!½ ZâƒÍààù¢Õ™+÷§ŽvÒ‡i„ŸÞ‚#ŒÃ³Z¯ZØz±¯÷´T,Uc _óý`ÆÆûËq¹¥]{zt¾J‡¿xS›vÔbsÀ»)zGÎðŠ =¿èqõ jbr‹÷> uõZvVÖ„§l§ÙZ:yóömÜËã’Ã/là·9íÄqf–ð‚)»÷íJ;?Æ6I¾`ÌÚÊÝ‚Õ5‰º\º¢¥”pû~Í`æÍÎíÌý>õ“mz†LJn¦Ý¦î/e¯ˆ0[ÕM<ï©îa’ø¾G®øÒ®yåÓ;•iá3/†…-¢¼ú_®~WÔyùâ”ôÅm1ˆ§»Lij=®q)]3CÜì,<3æñйôØMÝÇ9þl­f[4¿a ‹~ªâCæó//BÇöŒÝ}Ü·2ì¥,³¨Óçwžõ:,gaÓÉL¸üµ “þ¦™înð³<ƒU&=ÈvCÅ=.*Ù9Ò ×n¥ß¹u+55czß.ãîS­Ë{×Äÿ¼fzi¼oz‰X†4çtEPiJC´f®ÙjmÁã§×(Ú<ï¥V"½šÿàѾ4Ó‚{…Gjý8’¸ñ_ S%DäÏrtŸ u=Ztû“¾Ÿý‘X¹Êåë™We5¨x;2n¹”Ÿ²™Í?°Eø£ÃªÊì­?¾Ä¯ë“¨¼’†òÛ[$ÝHø>~I:31÷ŽN;Óå#c¯Öh¨q¹mg̼Y71´ýäÍóµço_ò m…yi¯¹½Éæ‘ÄÍJïN_”\—ñ±:3ÆÕË‚Ão³4ø [`Ç×Wc:ºoNJ«oõ°ïÕ8Ç(U'´ Sñ¡£l×RI•Æœ©m+óDx]â©zö Ñl)Á1hü†úÀž\¼rSûfÅâšï—ϼ׌5O1íK§C˜Y ž|Ö?ð<^Ë—WtÈhÒ¨– 6Ÿ9xüxÿ‡ñ~·“Ÿ„âV;¹¡{˜*X{ÖXœŠùTEøœêÕŽŠ—Ðü¶÷±•KÐimãå™ë=ú*>T5­ˆlì-ª{)iÅ\ Q¦õãhë§š¡«³¥çMâþrp{óÖ•eÇvgußšüB~)÷±œÒßÓƒ}¾®Õ9üàˆ W¯F4#³¼èн8þ µ-ØSÂȸ3DË.b|ûo(™nïçM{ù˜3APìãÒœÉWŽ9åîz1q2'‘nÅV †óú‡Ý~®Ê­ÛÞFÉ[f¬;n~9nÕ2ó»g.*Öh÷™Ù´ ä^÷øv¦Êjr¥Xo1¯Wè¹·j/OýM¿½ê’F‚íŒO²°«c×o>Ô~zç3Ï8ºOÛaÍñEºékêÊÖ ¢Äx¯±~Ϙ)¿{óV«õMÒçdÙ 휮UE•ÉÈž¿ûĽï÷ÛOî_ð‘ît²wû&²˜Êó6^¨"ÞSúØòt¢·Uâ³ínæokÂ3}ù:aòñCUn·ã~¡m»Ì$FV‡šsëW~z—½Ûôl±§Ð×a[ÃçO¯9ûÿ\Þ¾†®ïªzhWðè& WËÇê`Ö–3m%™Áñ®\¶+Î<•ïÙRÍXkÀ¨Üm1˜|e¹ÜÁùªÍ2‰uéô£F§s4—³¦½¸ŽK¿K¿Nôò ºµ’RãuXeˆvµsżß5´Î,b:¶V.ë±u,ßÃ2Ó åaÖ‚ªš¤[ñè§/mzr÷[ßÖ” ot2ç=~JبìºËEµÖ$d`æa=ŒðnÃó=ÖMR§õ*¦'nßB„Ç_·°“"¤+VN»L¿ý|óª§^v'›Ý³²{ü‰çj¬o´zÉ'Fpiáx÷ðs³ÍÈ ›jѤ »7´ Ž_î<Ñhp[s)£#[ÐÍCuμ¾Ç8Þ¼ØÅËúó÷!ÍÂU¯W x†ŽŠ¨o)®³»QíÓ—Öl9éClgFíÿöÎ1® ŒMí×kîOR?ü|ß}‹,—zQ5oz±dEÖ ú¯õŒ 2AKÖž;RƇÌÎî¤ç笹äì™ižàÑ{U'mt€ïÀqŽ=fO†öH¿jÉ̈4z,ñÔ­LiÛ­;cc2ûQ“\ùÀ‹ërÝÇö°¨ô‰?šªVW±ÛÔÅljy!–:½Òöû² öžkìçßíÕt9‡UÛh¯_“¾öÑüEÎ~›Š˜x·&Hk²”²ëŸÍÝXr¸wL”~èS}®€¡†Èê8½ÏBª+dLaL?[ÉÃuv¬Xû‰½÷!{ ýÁÍ÷dø' +\Ró¶“•)æv(@ÖSñ{Äûá{ôO¥¤`[ÂÜjO„å2nq©Ì · Íø˜õå‘éÖ«-Wå²ö9çdG úZ¼=RÖ&&æón²…Å ?ùrãzµBý´Š-äÝám>[mÝâY¸F}E_9_¡Ð!®èÚòû»Ø£ùãIÎ#Á#ѯá«Sªew\Ô6 {aõpàAè½÷+`?U“ ¤ŒO\”j÷ðè3`ÿ|ûd¾E½.ǵ‹šõwD‰.\\Ï´ÊS×ç ,ï “ ÃåÃYëýJÚ•}ûÜ·M‹©aoïç¾¼iµÀõS»Â¹5˜¯p86¤¸½zòÃK|UFýÑ-Ó:åS~5_ßÄǽkWG½Ÿ\äxÛzјô‡kHg³ÞêdœPx^±¶v…Ïêe e›<¹Ï†o²?ø û`í-ÆýÃ{™ƒ*=ù\$uÄèù‹– 5^JK1ÚqÆá¬¨ñ²î7¡~½S¯X‡g^«¨[ò4Û·=q:ü%§èK¦.ï‘6ö’³o]玾{wÓ®Ø=¾Ò žh4i'åÒ±¤+1Ö~äJðÿåºûwæºsQPtG)ÎË8¦(ƒpCÀݤÑnèÿƒ\w¢WÿH®;¥¿žëNé?!×ÝŸ¡×ßÌu÷;MýÓsü¿\wÿå¹î”þ0×Ò_Íu‡øU®;¹y9âàŠ² óòËÁeç烃ËÈÈýV®;™žÉÃç眓›—#—FÀççÝSš—KNNQa~~>Yļœsp™ù}‘ŸŸÇO~~2²ósöÉ#æå°ƒËÎ/BVn~î<éyt†+HS×›Ÿÿñùï´•t4€V”Õ”ƒ+È#4u”tàŠ2ŠM¤¦†Ž†Žúט—ÿN^ñÿTþ;Úûßf®üǯF[üþ7„´Œ¼Üœü?pYùÿÝÿöïøÌ\›ÝzHu%'åGÚÇàE’Ô—¢Ï¤cq †ù`ðhìöL†€ñÅ&Äü‹xç\ü9ÓŒ‰…3xW%ÒÒÂZŽäàà/И/*ãëï #¯MàM­Ðµ•³pÆ¶Ú F!'O ç†ó¯æ„n§§5ˆ4 xQ&žtÇä/Qih" ¦åe¨‹ôtôm‘ÚäÑ@ƒ±óI¹Ñð>owLˆ¼A º:¢)-úÔ8da„c·?<…¹9¸ô¡s?¸âðns°è›XÂåÉýox¦.ÑÐÖ6§t‘¶D~¶.O]¤elfn¡c¤kI¹JCJÁ\À4~ä, àµ%Ñ)så¢í™6RGÃÊȼ`òøtÀËèÁdL–ZfÐe¢VÚf$è1‚̈ÆsììŒ%8»ú X(dH?1Ø”Æ ¦“'GP¢+œ7 !¡ª T‚‹S›Qà=«P–4‘¶.¨Š © Öõ³1à ŒRþXòýÕà…ðÔ ®ž(—§5Ö·„i%óÚòkËÎí ‡ˆ8‹xºb€qû£)‰rÜpÐeó³9EðäëÊÈ,B i ænF(7Û,€ÊH„GãÑ»%a´+)'€ÊßÏ ¼Õ Ì4ìFLàUþ "9šÑÚ`|Ü\Qcö¼«'íp‘ @[OžaŒ2¥* M6tiõÌ\{®‰Î¨yS ]‹3¸¹ÜI[K˜7á@} ¢'Óa ’às–Î×v¦És˜F07€V,dTÏq_p¾A`²ÍmÅ’+5-‘µPÀ4’ç‰-R@^œ¶ Ðr‚ ‘ 8aN÷\H……ºç‚ ¢Ö®sÀ<0ÅG¸þ~0_4øzò <¤´ °8ƒžßÖßÇœ]ib˜€Oçð<-\ 78Çpj®9 ÀycÁ\Jàüb\ç´æG»GÐBiS­1PÚ¹óÄ€Ö/(#>—ÿÀÐÏÏ¡¤~q0Pœàrâ ÑpØAµ¼(,1ˆËÓŽ¼Ï¦™Ãz̼X]aN[æh‚ * ìW~€Ã7·”;Á d*¸"õÀ4t,`® õÁÕÌE˜Cø „¢DÛ5[gà1xÍ1”âd!IÆÜ@= e} m“_ÃáAJ às‡PpîÜb ( -Zh˜-¦[P~d>BÙ"è£Ip>€ DDØ LÀ­/"säŠB––hWHŠÁ—þQDüz£IÊy( x³ƒ¬„˜«5l%e—Ïd(_`}sÊÐ@yøAëB†ºhœåç )( )é›0x‡»ˆ3@ð‘(ÒN›ŸX7RJ) ˜¶㎙Ç,_R_eTK– Æs#õ7‚€«ËÌ4pñþñ!-Ìs¨Gô©'#KC= Kc õhû„"q£Œµ<š |AáИYÌ€Y¢Íi9 䙹bð20|°hÚ… ‰• -kh¹.ÝÉ>*vv8ò âœV ñÉF%*˜ð¡AàF^0e”hFˆÃJÁü—`.’/! Ú< b‘9â†õiZ%bˆŒ4°P€¥Âè ð$=)ß§-8εì\^Ñ6±†áHUa0°(anN ˆò—6Ù9« eö?หˆ°¹Ž– !3gÜ))3‡pÚÓxˆm( €@hYiÙ9£&xºƒšM–f²°Ðƒ&Xà4Þr;}´ðx;E³‹3X0Gàn‘ ‹Y?‘2¥ àÉéKZ¨úc…B bî€%JIEfhŽÑxÊê •SÇH y(Y›A‘r¶2ÓÖ°DÒ ží·üÜ~ahÃ`m@ù£‰Ôž#¨úÍÁg TÇÎTWœWJ¯Æ2 ¸¹ÔuµÏM1qFå‘LÐåsAûàÑ(·`ê,pO“t•'M<—ŒdNo š3•tLÍj´•ÈZw“­¶©±†¾ -&²š%’–ólª¨.U¹–ž†©m9Ž¥ª¢g1…'u¹‰© rN9-¥ª¡ab7`ßÌvÓÒY6§ À¢*6±˜WŒ%P•kÏ+÷u£.×™_îNU®E#œ³Dª*¦sQpÔ}4֜߆ u¹îürêróùåxjXÍ¥¿U C‹¹½©Édfi>·à×RUÐÓ7Ñ1¥­Å娻9¿ŠïÜ*¶óGDUnik9·œD¤ª`n6Þš[t,´5çp 1£ªb‹›‹"!GUŠoÑVaÔ½°œß " Sj˜ÍcJ”ßœ³D§ mQs–¾î<ÎÂPs†!Ònn`Á£ž×ù÷£&¸®•ŒÏ† ¨) |æÊð¡ªadª5· œ+õ`çÏ*–fV‘úÚs+ 1ÔRj¢oLÕ U0ˆšXæÖóˆ… ‰¥ñ¼‘}i”‰µÌÆw¨)>Ÿ ÞÔÕBR3ÇLà†ºòóš£ãß9ÿÐà="ÎOÒõßvþ.#+-;çüBZæùÿ-RþU-œ_0t™ LØU†––ôPN2À,È)·µpXOÄøûŠƒFI˜0¯¾…¯È|p%%y ðÄ:-œ;1tegÉ[Ap30Œñ3®…8ÌÀ(ó…Ž_‹“rÂbÀMD"šä\(ø@ÿT"?<°v“sû)iÂÝÑhÐsô]òÀ£ÀЇøì&(Ï,”Ù%Tvè¹’²ªCíúÍv–R4sLåãBbÐÊÐ,õ0 SK@Áô-`fæ¦ÖúÚ€CÅ«aüæ…i˜hÿjÁ´?FúÆ0 À–ª›k˜Xê#- 4èú–z€'¦«a® ³4pˆf‘šhYië›èB€€Gg¤ ŸE3Õq~àϘXjhêé[ÚAíêè[š -,$aÀƒ!­‘&–0 =Ð'M$ÌH_CÓ :^PÒj@1[˜!µô5ŒÄ›#µ,ÅI.ô pß´L ðQ¦5Œ`ÚÆº`Ì!PòOhHz–¦@ƒæÀÀ,/€Ž¹©1ÌÈÔì3˜óhCÃR„ÈtÖB€C$5;¬auIËRßÔš¶4×ûa‚Ô5Ò×Ešh!AXSÀð¢õM­,ÈâÀÊ o6jje â˜Bh4&HRˆîà }z4=P ±í<Ì$"¦d¦¤Óõ÷3SÒ‰C — ÒLŒ 8 àa;ªôလ€ZPÅP qr¶d*HhɃ`i¡¼á è¯à¨øÍ9û©NÉá<[ƒw¦÷QÏÄ€kÁ™”„šª›sHµBKDŒ_€<…†³±'ˆ &–¦f”<ÒÀ,˜ª Ó€ÃÐh(ã<®#âƒÁP ^À€§!a„#@LýMJ¦ž3Ĺ c°D˜*Lê'ê0YP—€¦Š $ð ÞÄá}Ü„H‘FÌZÖÌ`€ã uƒ¹ñ0Ñ™eVV˜ôØ îîZˆTNÀ»Š“¿ºˆâäüôÐ?"*¿D(ÿW‚‡:I…àÐgp £Üš ä ¤éÁÐJ¸‹‚µ¡W™Hûã3Û©•Á3{Ðf&¨'IÅ I`x@ ðXe *òq—E f÷gw½u:äë ÐPÄ‹ÐtGÏ 5ÅÂl0X7\ ÌÔN âðPêwrèPÓàð†2” ¸÷C¤@“Ë1X06 JÂ,ÉA- ·¨Æ 0048$\ÛHyÎaHss@ã˜ÜÑDWOj P—Hìéî%mÿ¡‰äÔô$úm‚t€:¨ -CD Rðz†f(˜5&,ªàÂLbLjþa ÙÌ̃[²àì“ê@ãœÇC$åŒÍ¥ð¸}B·µaûˆ@Û)®(ÂL"xe(ML˜JfùL˜Äœ"B€;iÈ/‚Aþ—È/ò`-¥ÑJ©¡cbjae†W¡z³ˆAÒBö0öL-Í‘ZzÀº ÐnIf¨)H-9Ôá OcÁ#²Þ^@( fHH$ jF„Ââ„™:Âp™@#éÂLBFDy£ApU JROX ¯Î`ë0x ÓÏŸøÛl³€öaø;úŒÄ2óºûœ`j0^Iʼ3€¥D_?²BæEÈÉIRýÏ+âh4@†ÝaÂ3Œ2pÀÄAÌZsv"ý 'ÿ‹ ÿ+ãhx5RïÈûT,0Œ™Ö¯˜0Q]ý‚…¡ BÏ)‡Àï?àyá?PºÐ¹ …žQÀøæèOahÐ(`$¾ûgæXþ/Î1¸BÃ`ÐîšdmÝ“A8!»ø—¾cÑFÖ'æ®ýD˜P£¼€2Å{ê‹ó÷ð$áÖq`€ ÍM:º n»z›¼Ÿ [—„VÜò&ù1â0Œ7š„E Á…Ôë ,ùCÊÚv#d…ˆöV¨Ò“ä[Àå¡Óê’$<†h´yÇ óÅ€#r‡ãü!DÞ3ªœ|”ðH|Ü`ž¨40LÈF\™a+eU|¼ÐE`¿04`¤ÀyÂá|”ý³è‘ˆýTHÌìïJ„…‚4€g*Ú¡±*°=@¿ÁYvõǃÕfx¬×p y@Šê-¨ è„$§¶0ã_ÌàeeÒÈ£„ )(˜0øÎB †°3 ̉åQPsàcÒSòt€‡‹Ü `Öè* ïùC:HZZš$PÔ ÏQYœ<À“X0­é,9}fA…¡‰Ã„¥…Ä)v ôŒ´¸€(„1à1°©G<”‰,€'X˜ ”rŒLUPTp˜ˆC†ŸÈPƒD–É`—€Ï<¦jœ,É=Ô0N) Í6 ¶+2sL„ª;qª¾ÀUÈU Ï‚º6P.&F*Ý•.ÜÔÎL©”Š<`1,,l¦IõJ‰PaŸ½!sí¼.KÌtsåï†_õäO÷‚¶ä³( ì0AÁÙ‰Vx‚JÝS*á!Ÿ/ùXKg–‡‰à<@%üfƒ¨€z Eô¥ †\æIÕ6Êi„E†„—ÕÙç‚‚³“ vf¶Dl–l´l‡IrNÒ€{Ò¢3‰5œÉ|¡Æ ïTÁâxçj@%Ì«éÝk‰Éþ…àu~SOü³ˆü/"âÐ!<‡ék:Ûþ×ßck4|  ¡­”©Àé”]hŒ ܤ¼]¾ŸEÃè ôƒÂësÙô·°“Öc`2ç Ð ¥”Pfû79y1¾¥èaggO?ÿ 0^1óÈÖÔ iBÆ•Ð>ãmòÒP Š†ëÿVg¤­%ÒD©-òOŠÎÄ"K L‹…/?øL¬5#3ó¤…P5d; }[g ##ò¸þó™‘ŽŒ{«€­æƒr…Þ£ƒ6Ÿð(7H•vÐW EHõ’Œr,Ì‹7â»Иœ?*p0:ho”?šP” âd0²ú«ƒ—ŠÌ6ˆ÷÷AånÚáRx\ÏÙi®©a©o,ì@S ‘Þz·: ¬ŠpP¾L-@n‘n^"Ÿ¾¡&$ŒôÖ'íChþ)“¦‰Ô15XœÜrŠ…ÀüæºH@,fÌ…¹ÉÃ15ÑÑ×µ2GóŽw&À Ä<‘é0Lù<1U×f–$h†:k™™A Ò\ÊÿP˜ SÉ+HF4sjÌÇ®^HåR €ÙÑ7A SwbqHP¿’ø}!ûH©¡4w¶Ñ7Ñ6µ±øL<ˆ$ /¸¯ 2éB¤@ÒáIOòÍd‹ ´Ý™U¤ZàI RÒr?ƒ¬: €Õ!v&—8{’¡W˜³*pvtÍ5ŒAI~ÿ ƒõÁ€ïT‘ùè ÂÙ©aâ¬a¢íl |™9[¾`åLå¼ÚL)Wµ:Óå0GkÙéÈœÁ;õc¤®–ðt& EÉ4rÖƒ[s>—/âS@ÜZ„ÍIÓEÃä¿dñ9ÜCÃà|gÖ(Üõ2k”ÍJP ~1%¿Yv²©)EVV¿ÑX4:kÁé4A"µšÎŦzuf±)]@ìf[W!Ñ ÒdGÿ+u†465·ûª3´/ü7Ôˆ"a‚Ž“‚gž('GÝú¦à¯¹‡óTð(hC5)¿^:fyf–e¨æof€¼ó››Ûh ý€ïœ3,ò“êÇÌW' 3% ÅTZLþ½M6À‹ü‡‹ôvôb𦤛|IΜ¥-Ä" aZئÝ#CRm†ôô々ÃBø£¿ ‰ ‘+@éEÀ½2Ø.´«'î‡s«¤EÁÿ<„v‘1A-P·GiÁãN$ç£êèþBIˆ ~Pãw€;Í©µ@€eaÿÆ^}µÐ†ØŒ³M2`ˆ¹ÿåiÌ…]~°9™ßjŽ“…œù¿ÝªبìïQañÖ(”…¦ˆà ^&NPã—˜S ÅÄø©ëÌFÀ`0QwQjQT™Õ4ÏAÆ’p_¨"9d5¯E’r e ^ê–!’¦‘ˆ… ò9¥³ FâïÚ˜eé$+UJj†©mÓ‹¶º@{ ¿C‘?à‹™`8Õˆ ½úK¡ 9¼ÿÛœIéÁÌð~‹GáÌ£ÿŠý..Ÿ§öïo¼/#$iÏ`®Š¥r8¡Õ:ª Ñ4 Á+\œ-,MÍ5t‘ÿÈ֧̼kÊAf ææ¯ê“@cÁ¨.éÍQÐt Ɖ!ŠÃ@|WEVJŸf‡"åF¹¢¡ÄŽ4ñʇè5È–˜ >‚µ„镜}5…d=[š[iYÎC?'?3}À”-ÒÕÛ²N"â0ú¿%(ôࡺú/Þ ý뛡gœ—EÞ42Ñwï¾¶Ð25Cêkÿ#¢¾C ][KƒŒ Є_{·ê×áùyÁüÙøüLõ…eiÑ@>Ñ ƒ#ñ è;.äLÝHõÄÁ¨¦ƒ*ü?ÿ܂Ԣ¼©GRä:ÎÀ ît\ãF½ýlneò[›˜Týò$ÆL…`@¥@sT‡äÓóWPPÁ¨ "MçBg+(p¤S¤ØEÎpÌ‘ùSÇ18QALöOœÄXtOo†ž¿sãwaü¿«Of’­kYÏœ0Ó°¾ÿßèšúó«3gøg%‰va HwñÏÈ“8læ;‚ê» ÕwY‘…·í?r›†ÃÝö§ª…€.ãoÔ“ýâ´U=Ù_8€QÓŒtò" Üp‡®üêtÁÂç ;a°¸R¤šªI šƒÙñˆÏv˜w¡–çwgÎqƒyþå'~C[ÑÞóû;g@¤Ô‡¨4@ÓÒ/N ,°?7×ZOü‰ H°å_îxε¾ÿäAƒ?‡_æ÷OÀdþ~Ù?qˆ@öÏâ¿Üâøgܦ…Œ¢ùÀ‹mÇ‚mþþ>,Äá¿Ü€¥1É‚>{Í(HYa)¡0'Õ€ÈƯÞñ@šhÿ³î.XÍþïÜÝ™ñüwDB-À4¿s~Ϻ»4ÿ²»;‹…Ľ ¾¬AÎ?=A@»âÀêToë@è('3¿ôžÁªÿ-Þ3Èeÿóžÿs½gH ü]ïDò§½gÐzÏ`µÆ{†Xqaï,ú¥÷ùΦ(JÇš"e’º\.ôŠ\I“\fw)K¶¯A4qÒÂýðWÛ)â&q¿P'pŒäœ:I‹4£nÚ"-Ú"( 5Z.âu` è̼·»o?IJrj'w8@Òî{ófæÍ›7ofvÞÛåÄ܃êÿÄŒ@#NÌ4Þ^NÌÂñ'fÏH1'fjçÉ>ž>ŽGØî'-¿]ÞçÁŽ=8zíú¾¾ýÁïÿàÛü½|½Ã¼Å³óC„©Kz¾Ûƒ$ÏŸŸO¯]Á ú!Ãì.Cß7zôÀaCî6Iß{LÊäx¿ë)=zÂî êÐÒ‡Ã*\ ß:©øHiï¾ÒÕ±¾ϱgw¾çxçûAŸÕb©¸¼ÿéë†ÞüÿMypèÚkÚò§>xžMs©3áÐÉ4JIã’3Ç碎~ìÉ€pÁñ,ìPÐ-­†R%.©æÔ8wÒ½wâÂ{/mÄù>CÞ¾ÎÖøñ¢{פ Äîí”xzÉ}ôÖN¾ %QGcinW©¼cOéØtÿR2HH£Ó2ðu×Ô §Qdzµè'Eù›4 »oŸ©v·}K×°öçVò÷ž¬,â󞛄Žò!˜\:ê×p¾Ä2´‡äGbzs’õã(»ä,s¶ò·Z2ŠŒS¼ÓÌŸ”âêœhŽ~òh”$óüÝ[åO—#>3ýƒ˜õH%æ"aĹð€c]yÖ]Òe‚”Ç»í»ºƒŒ¡O,úè¢} eûãÛ»É<$BÁ„ž$›´G¿DÄ»(¯e·]Ö'Ð>yöɪOT}bèåeÒ˦Á(¼Ã ø=C}Ÿß4éVPŽ 6£¦ÖêX*†šZÜ ¢‹€ µ¡âYß´?òV u [*ª¡^+×Úl Ê}é²OÜA¡J˜ïm÷í»–‹C`tN »×¼* ÷î¹Užc¼Ån[˰Îbç-9³ì&³ÇÑó oSç{KãòŸþw‘Ê…cwMWòŒ³»”«þÇÙ]êUŸã؞裻LÁò÷÷FGˆc´·ɯß+âYÛ31äî¼Ó!˜Ä#5|Ožj§oÀÝ\ô.= ô‰KKÆl$ŒÙža¤"a¤¢`ô£G¦e³G‡¸ä—ófrö¾í€Ç¾u&º× €‘Ù=èŸÙ0>ÌöŇ½ Ÿ >Õ×ð©.jÊÝèƒóM<žÓýgëžD¨š+WO}ßE Þäýóˆ‰K€c.ÆP0»' f÷HÁì>PÚ©=Rê•‚·^Ä+ÄÄÞ­‘ÝÍÌ~qÛ7.ñÙqðûúœÅ ßÍÓR›Nhh«Óh©† ËÔ›d}4ÉA»P(ßk<bêÀ‰‹«á@…b9·THç÷¥¸`xFn"]¯Òs $¬JŽ&Ÿ£¦¹QméèuTûtGÜ¥0Ê~‡QüN)*›ÒP6ŽËsÚíVy¦c®¤ñ6ërܸ͜Ÿæd¼{W8r/¢¿×*¢öO%·œ=µO‹ØÒšê–Òa€ˆeì7$˜ ¿‹¸(¶é+‚ú&…[‘.øUüèE¯ˆ@ˆ`ˆ«Yøóªôü’n ×-ûXú Å(؉&Ó¡ŠÚ`q §‡ÔÞi¥ø#zìIë…©;¯„1Ëtí Ë·0ñ¿ÆÀì›ô?ïà éy”jôŠjŒrô7좽ÍûQ^ÍÑ»Šôª¥XýÈ«úå–ªéJq9—©Vö¬í¤!m£ªXzS«U-n%{r…06N¶TC[ßq¯©S†ªÔwœÊK ZÏXª¡†”ö”´h_r5—\òSÂQJðù”Fˆñ;{¨E*Z.­D=3.RXÒW@¶2ï¢8K "(WtØ‘­^ß²›0†t4ëåówØ¥6Ý«$öDdxìÍ´‡šƒ‹oîºö,ûðúJQ!Òº–àVíѾá×2z×ø–f¤pÊ}ó½ ÃÛCôºê¼æw‘o#ìÐ!Ä.ö›p×oÔ¦LeÕegoÈ}8û#Î~ º®ãt+Þf<‰÷@ô \½Ùÿê¶fLz4®o‰6S‰>ýâ²#»W÷ùVÿu³@¡ Èžœè…ãìRì$:0A^çº'Fç]wNоîâÄwF´¯…S'nww­ú4L’Ç . ÙÌ^œï§œ ]KµèúŽšÞj© ÙžJ"Xà:¼éÈbâfËÀÂ…ŽI‹Wª<¥Åðx“}VÁw)¯UAP˜OMs…L~u~ I|1»)ƒÛ2­ªxjlËïñX4·Éá­pvÌlîÖ‘ìk׺…ma |ì†BÜEäNrÌÖC5«Bý™UÛƒ&5±=y>ŸÿŽhØüž¤„ÈÑ$>÷è°.ÚT[u Û¢ ÊþtÜ«kžº(¾ˆé³Ù¦N„*5 e÷ÉüŒ˜S¡phœùÉ¡øolNæ–Òê”dÛ— Û‘1{h;Ñ4œL§wÇœF]ä6,©‹V¹O3³‘SéR.=1Îs§ÒùÕìùÄT^^»M Ñÿü믦ÖßÌ„«ZarXzM5MÝ æNsMoð20=¸é­w Òw³„Y©uLKoÂúo¶ ~g¦·ÖµŽ¡8ed׵̫8ã&Y§ÕÇ.éúêѵ¯ ¶FÝSdE|†ۯY34~g*+sL뎫Ê$Ygx³‘L08Ùxgy©„k¨R·A=˜Ú– v°MÙ&le5CYÇÄèÑñÍqMQ±)teô–EÎ,€t;2*„çHT’s ‚Ádi¬zÂ”Ž¥o¶£â¿˜íël£ ©TÃv»ÙS!FçÓcuÖ¨¥K6&¾]Ò ÓòNã æãlA' 6¯%¹P+ÐBUqX6YªRÛà,dlÁÜþ[Wi«´/àp­˜!{¢"mˆpì`'N â@zªo¸¡š-.œ»éà±›¸´žgCh Å82t ɦ¡ßÐ4ôžJ P[\i’)Q,,æ–VK<ÈòhE>[ØS4µ”Þ±˜ÙÑ,òÒ6ãÖC h Eʤɡr<ÚjŽO.Ømü<ÒÐP¦dù%9—…±ÖÑuIuñu%H®=Ù¼TŸTÕv¶RažÒqBœ•äG]BØÐLÅBâ4–(Dd©Æ:†ÞN®Œ­žá6–VÛd(· ¸Œ¸Õ¨Ø‰DÃj9Ã$—[¼/ˆâ‘i´°R3cóš˸ŽÌAw*cš4öjêu“åmvâòMŠZM I¢)7ÒZ„@SeˆÜ" [tvš’:¶ÛÌ Ë_ÉÅBBó*DÀ/ÂÇ“]Ǧ‡mžÚ> b#,Ë!_{ÏVãCÀt:± FOHÜ&Á? \Zk6#½ºÏj¶e}|0j§ðÖ\™“•¤ÍÕ~À¢ú Nñpù$õ ˜÷Š<1²Ÿô‘h·-¹Ë†<$èEÅÖ 1º#R·Ê¨¾iSèmœ7–{{&бî3»‘M±cllêü\l04^cÇÆ5ãtƒÇ` G”Ö ˆ{×èhì6ŠXè6Ð×êŒVétº UÍ>…Îw3ì…î_⡇`Çb_ÍçS@õ¤ß‘å_×ÝaIaª`Þż;h½õ²³C>ëéÇ+.†¥ºš ±`˹÷Æ‚=÷#×wRWÁ¤nj-ØÆì‰Új +TÔí`š¸Z Ý×xÆ'på–¥l CøçT#B¼’6<4Ÿ“8ÚºÞiÁÙã£$Åø'â‰àÐ܃hÈUFþдêW)µõ*¬K»à/nhZü:Ô´”VMymIŒñW<2MK %üö oëX$,¸l…Žpb^CGB¾ÉZºh3ã~%ßÇäQ±¥µ‡éƒ³U¹’.HèÀÜåÚã&ѽìR)»Rͬ¬8ŽæÓé2_ 4“öDM 8¡ÚïÜpI°«ÝÔ¿-üj¶2ˆ‰p°©–„À}Ä¥Q°¼™ÂpÙO¿Úª±±©ñ©éñÉ Rip ×ÛÖxm߯˜„©™ü9utvRþ‰¿Nžºlj:5;…íRG.›œš>2“ºŒ½­ɉ™t~¾MþMŒ°QV4´ óäWFíÃl)`,‡Î_x§5Ûºa¹.:ÌÔ;Öv7TAé-6=9ytlrfljjœ±¼F*©²ZÝȳãÓv)ûaò¦.+ææ0úR?€Q> Ò (|ßÔë\ΗXC«©-4£ôµFÛŒ<×õ- ‘ð}Cé˜ê8‚ÿœR‡¬±1þ†+¥2(“ºbÔÙj!wF4r+À€½€ßÝÁ¾@dÀè,ˆ (qÄFè¬wjꛄ‹mÔõ&yēÃ~0<êÐTÀª€%DXRe2D\fœTM|ÓÉ—¦#Q.ö›zƒ-Ý× ¯¤à(Ô0.‰uͺLÁþÐvdxª¢ÈJMÝRçˆ#À¹ ˜"§ž©¯[·£HØëOX>5誡ì(\-.f¦)èÁΕ“¹2++§Átað;œ»Oå² lþ,¼Ì²Lqål)·t²ÂNóø¡ Kài¡RÊͯVŠðàÖ[Óe„•+ÓÛtá,ËžYí¼ÌŠ%–[^Éç" Qƒ(—-'€!úcµÂ Å Ëç–s­“³lHOV\dËÙRæ$ü™žÏås•³4äb®RÀáa¼4[I—*¹Ìj>]BH+«¥•b9ËÂ…\9“Oç–³  Hr˜eOe V>™ÎçiÐRv æ2ç³,OÈ\È•²™ Òãþ–þvù$+¯d39ü%{& ¤¤Kg“–D ¬Ãì-«ÐÞ³…ôrz ˆ‰g NNfµ”]F„‹‹§¼:_®ä*«•,[*ër¶t*—É–çX¾X&Ž­–³I¤’Æá ° ^Ãïó«å2Žæ¯P£öêJ%W,$`ºOg€iè½@L.ˆf`R±tá"3h’ìôÉ,<‡É.ò*¥4²N2¹LEn £?+±¬]Êç€ë™,¾-" Ó¹r6Aª­”+c›ütF^Eòi²7þ«$ÆIšR–[dé…S9Dž7&YŽä„ÜÀÓòjæ¤àþ¸½3¡aÍ® „# L#ž¢Py‡ÌZÍÔêçΣÁ{ÓÈ„³‘]›éȼjܦ6Ô›™˜ž¸~fpûÛ¦6âÉ]ÕtžP’Î*=3@Áyž ÊöáæàÀFŠƒ¿T;SIÚL áÇbªi*p.Ѩ£Òõ@Åå)¾÷Bwô¯@÷9§{«®nsK£­Pò€bllýPõ…=qŸÆˆ’Ýy¥Ôð"òÚŠ¨öì¶uÜy¡«`*B€Î¸ÛZsÔ•~µ÷~hHlg£ð >gŸd ¡“z¢ —õBƒë”}ÂÙ-òhØ|zæ›1ÌK ß8ìy“.-ÙoŽIo²p2¡/ø½‰ÁAÛ|‘&€[0ØlEAå XÕ&ˆM~œ_\Ê`©7 ÛôIŠ+Sù铞m;/£â¸s@ª^Á_ð/mÆsþ°Jp¤¡Z8%"üˆû¦˜}¾¡Íu«|FÛ3d¸lÏ)»ë.v-Ç/Áî Öi×1“ÂDbd_@äÈ%säó£ Ìž8ÎyˆƒŽØÌà,äMÎ'0°9<6 Hx³Î…åûd‹‹Rdõ‚g|ê}nê<;tˆ>,€Ù É[ÀÇÆe¢ðßáû¹}@éëõ_` õÛ”mܬgEÓ¢àÓwø0¹¾íeb‡íh€äàÕŸ–QÛ4FPJ“B)$¨Oa5Ÿ—‹È +Ø>°‚ 0¼ê­aÛˆÙA>RÚSK`œ”ûÁ²ïàmh7¬Bàʸô~Â/)D‘MLP¬Åž¶ôv™91j`d‰Ü1ß@ü³§uR¿ë# ñ¡GðΉÁƒæ1¦5êœøÄl±ƒµ÷µ“¬Z]ÄJÕ᲋†Mé;ñü‚3± £8U¯àzt¤®ã4P:’£Æ¼++’ò™í›]œŠòQðᘴB‘!„†‰‚©€*›6®0ßbth"Psž/ˆh ®bn8îP#3ƒG>°Ñ«™ð&99"'¾É„-*ìÎ.ر7!sM˜È’7=Œv¤.´{Œ$FI£W‹röö ½ÌœG㻣…OA˜LÚøÚÄÄbTï4ÛlM©ÝæS§€Ý…½ûÿÚhNT›ÛULùÜo××ßTÿßÌÑé£èÿ;zôÈÔÑ£S“S—MNÍÌÌÌ^òÿý(þ\YX„ÙŸ8ø×¯üÖã³l’ék¸á†‰¼ÚÚ›6OJ‹Z%lb³OTtïœ8¦´¡*ÍíG;ý_­I½ë_}‚}þW¸ûá‰[zzäÁÔøƒy1yê™w?wëHªyÛŸ­ù¡ß»ãþâ£7¸çÔ üýko´ÚW<¾9÷Ìî}òÐS?üìÕÓ¯§yþ…ï½ð䡇Êo|éåïßSºûêŸùØãÿþ­w~ð¦ë>qÍâw?vîÛŸþÎÌÅÃ/®m,}í#Ê;î<ñsÿW«öì=•}ॳÿ›ÿôÞòÏ?œ™|âÙlþ[_=ø™‹ï¿~òÐïÝòßæO)+¿ô‹—_üYõù?üHæõ[7hwìÆ[W\¼Ïx>³ô•µÇ–_zíÄ;~óÖ‡^ßÌ?ü¾¯~áÅùû_{ãË#u××M|ãÂ3™}úæGžimìâÝkŸ¹ò¯úê§}áoŸxï»æîråé¯\ùò+Ïþ óo×^—úÜ5—ßÿž§~î?®|è©¿xkñû÷=òŸúæ}¯þnãw¾{ó‡ßÿ__¾0YÌÜ|ÿök¥Ì§ÿì“÷>þï9üÜè¿ôÜ=_ÿ܇>öìÓïþíÿcï-ÀâØ¶E]$@pBp‡àÖ¸wwwwww÷ Á ®!8îîN€àîú€dÉ^kï»Ï½ïœûÎû¾_wWÏÓÆ˜V³ªÇ5©’TB_Î&¡ŽUYAÄ\諾0®|.j¡ûÓDéì˜þµâ­ÇÑB·'·ð¥¾Â[}3?ß<óÄïòú~”­@¶3š”JÝáv0©}E¨l;Üà þP¯N…¤t³ýE(ÏJ¿p•ûè èNo³7Tg`îR…O@y‹!.nXV& È;õ0=×V„у±Vɱ‡jh=‡Ó›æÓÄú:+"øêök£¢„ ¾C3ÿ¤ D¿·†qœJ¨7ó‰K²>î§šOc>DwàéëÅ$ ¯Yb²OË2mD‚ÑéÅzÝ2±i"I²¡áÁ¾Ë xlVµ! ËÄ€ Çút¨É„daÑôØÙ¬¸íáIEŒ¢él¥R±Ÿ•ÿ’ÏÎãS©b&`ÛÇØY?.ƒÅP~|C¯ÿuÕmñ^CŸ…—Ü”ƒÙÚ×0Ýܘf£Úz¯€Þ¸Ñs$N`17xÞ»Ò¥ì+ùßj¿«¤å˜ÁïĦ!W dQ*9@õRR¿-æd¶+—Ôœ×üÎ[$µÒ¶§µlè™_Ü8Ó¥pÎX1y›GæO¾šŽ%9ïI6Õ~lã£2Ö¬‘+êö•þÈ2‰’—|".ÚkÃ/ÁFE°èÓ©ß&ØØ$Lœz¤0Ô]`ߢž‹µñ ×:º7+îi Ù[/é ñ‘c{Çc€ß籩øÅõou#ÓÅž)èá~ÔyšZa·Jž “z_ö-!Tm/ñØÓSÑauÕSÊDvUÏN;'c?ô$VJ¢Þ–á} ém•ö^ å5w2ÆÈßêì¾â b¿«B69 ¶ËÕÛMÜtóÇÊf…ØìUâ.=9(ge»¾Ï”.óq~ƒHî`Çs¯ŒIE<º…zug²–òŒšú9<ï??M:L¿&ZFVÚßÂþ˜ž|¤uŒ ú&:¼VÎxj4O§YñXè4 ²VöÏ—ô4OR/›FôÏs×S°ÁÏ»vO‰HÛZéÉØ«žæ=<€¼³ýS<g{!¹—¨´ ?£Z=E§e|ùò4ÑžÕór3ç÷ _å£ÿ½|x/Ä{)¡@ÌDßO êgzxO)8<'ù§¨´ÿXµ'{s+£ß’øUz {—ÇIéhþ’7ó_tó{5 RÒx´œœ¿åô'-Ê2¿Ä“ýS9þ4éËÒÒAÑÒ½Lù²´4P´4?Y Xþ‡î8¼:vÏú)òˆK RÈ?ÿ8œJä©.&z/ŠäÿõË,+[<Ú—Jý,îó©'M?ÿ.‰ïyˆ• ®ó똖Ž d¢ool§†ÇHCEóüþòzZâý|§c~.ÔoÿÏߘéè~“ƒzþ¤Á£ga}y=Ÿýò3îÓëÙî–O K£§¬,y,íL~ÿ.ç ûüìÐK9iÿTkšRk)aIÙ_µæµ2×ÿ[iÿuééþi¡è–õ·2¿Ô…žþåõ3ì§ÄË; Þ?û‘e~I…ù§Ô³~˜˜˜_>;~>Ïü¤g-=?‡±>ièE†™Šé¥ø/šedú‡Ø4¿ÂÿÈñKýÔòsŒçÏßJýüý7«=²<‡?…½Øëùó7ùg«ý:÷›ž^ÿcù'“—áWVøe0Y+ Ë¿ZŒõ?h0fú¿ì¯ÆúÃ`?Ã~ì·Æüç׿~~VÏK£eznî/ïP¬t´ÿ øgÓü¦¢—¼^LøÊòtô" õóü³Ù^Ì÷bLš? üOÌ÷b8šüüÝ€¿JöÇó¯Žõ[—{~ýVº?Îý¹k>7–?ÞÿUó¥ù½nÿZ‚æßžÒÜŸš íOÓþ«þÍú×õ·æõÜxþeÛãÿõǧF Šž`ã`õ|‡×ÈØþi䥚@=·”gð¢ÆŸ2£ÿKfÿØ_¾JêXüËa•÷iT£¢¥g£¢£ýÕ"Xé5ž¯ÑŒž/à±Ó{žŸBŸf0kaƒ—›Å/_Ÿ3zÙeyŠ ø™*¥‘ùÓì ³7°PÄ£¥ayš}L^öë_šùsã…(ÿJ†áéôs?xšNI:]€À`0X,Vk€-À`p<{Ï´µÓ³²58\È^ ÿtAi@GËô—i…éü¼äüó'Ô?Úï·KT::VVNÎß/F âݤå”pº­` kM÷A™ ™炪LÀn”w« ¦d•€7ˆŒ¢_ùø ƒ¬n¦¥¬“ÀÇx³¿Š9Š"¿zóŠ"+>IQ —j$M²8M·6mñÀÑèBýËxÓÌì,—ãAÒ{§!ÖKæ–îËËk›/ÈhAí.ì âÔ…WÜ*„ï+Ë}Túu¦JµÓW³„o¸oV@q”Áг]§9Ñ¡-hzÞҜ£%¶Ïj–ˆ—M‘ö‰F‘×ê›M¬µÏSz¨½šÛ\¿Òô’Zs6í¥ø®¥Ï5¨¢P­.[(ˆE-6ý~©ÐFþ}¼ø©å½gFŽ<…lÇãÁØ£V+ e^E‘ªL±<ò$ªY¤p ~ vÒÓut—íuJ°þnÙrsˆš·n¸ó~¹zó_”™´)¡ µWfX/•äKëÚãm½Â06ˆŽ?Ÿ2¥J *­:3•èŸÄàUî|Wfyø°YXw*N¥NÔ3gÂÀ´ ~rT5Œ˜Á؃õsv°êý¬±½q¾ІÝ¢-ÚÉ oÞ2®öeÓ®jíž´âŽfÎðí•X l>ÜŸ™x×2£3‚›Ô§^!XL²´†šQ™¼ãJÞ‚¾wøªCÛ‹/¹ìDs‚êÙ¯ ÅR.|m¾éx†Ükhw¸|e~´Ãx±«wÙÊþ°¿DQkÚVÿ0Ö4߯ÉòQPØN)èñ‹®þfñ§ÜíùŽÙâàÝÀÍæaø]¬ôb »â¾™ó§G 2¡é±Ÿdî#™¥­(íW)M¢8WL_1\ìr\Þœa_àx·Gмi†^V¦L¿_áîTCïXáÒÐL„¨h•p3&q• òç‰_IÍ.×÷I;YçóâL•ÁësVÐp»Z'#ÅJ&¹±ò¤sø`¸ˆèƒWIÖã“Å¥Xˆýº]é&ˆÍ—aSÂ'ЛêõQ[äp§rnɘâ$‚€€À¶~ˆ"yjÀdÕ{+û4~ØQ²id çºÉœQµP*Û5X†N½ý]¿d„Ø ÜðûóþSh©Îú›U1d×4§T\–3spªÌqœªUº¢ü´e7'KÇÕp×»^:8Ï;}vzÒÙ9BΡ(5ÔÀá“*÷°È ³YÓ”…dÁ‹aîˆ!¦ÜiU—­#e&â–l$ù5ä  }=.³N³•hŒ”ÕV©¤4_ª;/*#˜:~ΠijÇ#“f쑪AÕ /'Í$¼’Ö`µ–Ð¥@ýÀ\"ÝýG©ŒÐóßÅdpÄàE¯0L ÚDe_±Æ†» Œáu mÿ¶™BºýÝüµ úø’t»1{WÅá¸Åé=P¼3¢cØÔ ‹ïFYƒH.Úïqœ6Îîî7ÌÎ[Ý&7MøG(›âú2ù¿nÉ Ö~…!Õ.'"ÚrÑYt,Â2¶6É7\¿Èí§ÿŒØ½_Æ­N'q^UR©c\Ѱ›¸LÄ¡ ó­¼i¹Íø^8û•jL…lœzseùÍ]äGG`K"öAêÚ†“×—Ò ìÚ¬ è䯪Pˆ²`âפ¬2ÞCê%¼ÞPƒƒ.Ðy_ZÑ9Â57îàÅ^Ó Ö&"T‡‚fµ™Õ½ì–[ª*3%]¯X´“ñ‘ãt÷z8x´87‚j—zü òn*HÄ›ÝgV¿2V´¾MHUÛ2‹ßú}“dÙ‰P;ÌVÇ(¤{fˆeMµ´§ÐÛV>‹ýUk¾†,iÙP–BÅÇ|eX~QiÓ¡’J6ïñ3Ó€Øî™=͕ʪ}tnÚoÌ£ä¹_—^ó+j_ y¸¶Œê;§)Þ&" ’°C i>ÙÚÃsUŸ‰é^N÷à˜NÀ9·f~÷q“f÷ÐvµâØ× V¾U|·”|n-3•)H!xŠË|}6;º¢˜ÆÇbòRglÐwûÒi%»éfí£?SÍ0aužŠ5©@“ïqóIªF}pJsJ´(\¡ŠOU÷×2NN©T­TŽêðhqBH:x?¬ÍkKøÓŠÌÉ·ÖØ z™ÅŸ(Œ´û‘b¼u¹eU-4:uª¿ËSÀ¢`)îF©AÄRbb 5ãMnÛ•~ÍÜÆ-´àO êÔŠÄ™³?£J„Np¶F½ cŸY·¾¯_ÕŒóÉÔ«ÇW­ ¨ö4McÆ»“,·BÂ13¿:RhKGóµÍв_Í{õÀK+ÅÍ7À­— ‹Íïmwu­·Ì¨x_V©œ1å/6ù7ÖhL» ±Óº³`eþŒ;뿈‚N BÙìèO A“aþ±w)íä×ÏÏ÷(ÛWÿ´RŠÍöº®¡~iô0?˜Ê×-‹ÖE‹sÎ[SHMæ[BRI™ Ò““Dp’F†æ®ýn­Ó`Ñ8~ã| ŠŸ,ž°ÐVC·9Š›n€g—Ó¨ÂÒ@ €J¸*ãtÏG)%æ„ák™ýnë†Y¶¼ÆÉ^²-]Ø{3W±ºsœ«ÖÒns¬dý¢Þ]Ë?ˆåŽç£ûæeë<SX{oVÀ•Tó¹ç^k§/î¢sZÖüÒä ¸2^¤óÁ$G‰øÈëÔ¶ŸÞv½vl2¡+²¬¸VMŸê’ÔM:¡F=ˆ LI²Úo†IóÍçײ'4žšMSœÏü+hœK <'ƒ[ÏÀ~T‹¹ÆŸÕµ×'Vcõ¦ù5ÞV…:· væCHŠ µKS÷}SšµËbZ+C&•´LNN¿”EK1®Ôæ%J ˜ÇV®†„ÖÂY€"jìÀÞoî¢&2­åm\[#‹ßšâë‚E^L{—+v/ âê ôzûƒ…xïÚ›ÁœÏ0*¾éÄât¢œÍ­¸)í‰ÔKúÇÀÞ¸ft˜æp~¥éÂBlßuT/•ûç{š{¡Û8QnïöÌ?ÉÀ̇ï©ÑÜGEifoë;Vµ¯Ñ]˜=­»íÌžV¢zV:ý—©ÀèI)Ï‹Ic€ÉÓúÔÜÀÎîe‘jé`¡ûüH®ÑÏõêË£Fæ†ö?^Vðë§­ô6/«Y; =+s+KÀËýÀ·ºýëF óÿÉê–‰•öO«[%He9¥æÚ7~h; éê´©R¶ê©R‡vQ `yÞµt»T?“Ä|ØtèÁ¼œ¸°`7Ìúøøxy{ïÄ'žÎoÍ’ZèFgÇ?Ö‰I´&q»ÉGo†xʆšéß2ˆ=¿R‡§}²R¢Õ Ñ&TÆ}m_çÞ¶aÍ´‡j³NE7NeÔRÏ̶YzÉÕ¢ñÕüzO¿s9cU„~ÜΨÅÇ )¬#¦KÆRGßPÒöƒ½c! ™“cŽþäÞ~¥S°,}˜íÃ!¨/^‚EÏ"iÈ|jzK=·*šÌ™LŒ{iޱ‘ª¼« ýæ‡[ç­íTÉýÊ`- ¥j ‹5Ͼ#¢]©.#mÔŒÀIVsðbŽ.à¥æŒC;³E¤ |)Hi³bŠm•‘>4µc®.ª%²*2ÑK¾‘fj°…Dg¹`Ú2ÔÄ‚ôŪƒ¡ö¥1;ºOjSšÓ ¨u±†]w¯ÏGºG_ô…±JðKƒzÀ¹9‡ƒe‡¹õœu©Š‰¢va.†£(Ö+8VC(¦¼—–juöãüýpqKkŸma:Žþžã=*ÉiX›¶áå•ÿÞ¤÷Ϊñ9àôsâ÷€ÓD–(h*q¨Mø€O³ËàcR ZAwËÙÚ>dAÍ3_Q›ÂPúô²z‡Ö§pqš(?@C\´:Õé½Ñƒ6Ž‹¨UXñQÇS2‰}áä›Ç­â;§1ûƒo>y÷† ¶u¢Ç){Y¤7½NÀ %œ[+0Ó%GÇ/oσ)qùkouµlR8Þª¤óè’gݧiŒÐéØ(šG›8;Ë•ÈãU5{ûœ:ëJ¥wÔ‰Þ¥xÌN —©7ÔÎ<<«“«q«øsË$¦Ã;‹ÜõŸ2òFz½Q (Î!0àA :3™G@â¼WÔ  V×ÕºñŽAH¶õÎI`.ÙPÀ„8­¸S³‡liLEÔ’õ­q˜âfâ]ö㮸_Ýt¿WA¢BYð„üpC'GÇø?‚ŒÍ‚3!V½ûl4³fiTßÌ¡º|†e'À3äÔQÀHlî6î-ú¾Aú¹µg+ÅT+|Ýg¥UFñ –®Lqïc~:`6’ Bc…äµBtHÄS·p¤ úÚí‹©®‡£ÊÚ³“÷ºû)­¢_ø4uïÚ²,¼Eåç%+t 9 57ÏÚëß„ŸQW%I–LNaBn~ˆQ¯%"©Áú´¥Ô¿¹:áÏ¡~7.luÚê 4HñÞ~+<ôˆR#8Þ„œîF—¸ñå~1(öšÊ²æ¦ <Ä÷[lË[e„{)ã™xKêüœ \¨ûçµ(ýÞ›f¾]àjÑõ·­t'F4x¦¼ì} HGqƶ¦7XoÁ6ô3J=‘šíØÞ6í¬6è,\)hâ½ Hjèêu Õói·dëSŸ{õYÖ‚uŽÕ¾ªY²Ì|½v“ÙŒÃ{çÔ>%É“‰ÃFúèõ>)!yòD^$y~\<ñj&z‘ëÇ\!Ö%®v•e›Uæ#NØH‹N I!ævø× ¤Íëmwµ¿eľªµ{íýQtLxÑëÄ„– ¾ôèc®dÊU¬:ðFÔj]5óac'žk – É|»ïÔ§(Ü#+›ïݱF…`€†0Ø·ü\§Õ(Î!P¦¼SqÊ{&uÖ0W£Í<¹Òâ»ZøÜ…¯¬+ÉL}ü¢´¯ǫΠW¶”5UË5Ó17[{ë¾a$¤»2ßë,â§Ãt®ÇäURw;@oJ宊æW°%ð†ƒ¾íÝ©”ì–¸è–=Q£VÁR£ûî™ËÆDZ² ®¦KŸž«ýf"“` ÁI¸)©óB.¦sòœÅh$-„¾.j#+¶h’‰†¿-CZßåk…ˆ¢lAÊÀP‚‰-p|‘96r+‰ñûÏ~Ÿî}êïÄ÷Ý’‡5׬Þ%/&˜UË[/Å«RŽ~*™‹fÁ ÜÍcV]ì ±ªÇº,:ÎËë}h×aÆ&Q ¨Üp—¬°ý¡Ï¹w¢ÛÑ:-“‚îÔÛ(˜¯ €ŽŒ'Ÿ[f÷Z›ãú¨’¸Êq›pÜ»}©É6bÄk#¬è|Ô×vú*x!s.äÇ7rCôG˜ksëù>ðÎ)·àåŽÙ‹¨[ìåê~«1ïv÷ZhX®âÃ&µ±àÞ9Œ‹†5 .{o¶‹Fµv¥ÈûRK\…]JI(D> ˜ ÔWÓ˜jÛ$û‰2Á¡P¼´sµ‚IMBŠq2& 'ÿ›êö€OYf~ÌÙe©*Á7Š„>F¨w’ßÈÒÅwTW€‡[CVM+«kjV­Ó›ê4 &'·6`ûØÀF|dê?b—%mÉ,%¾ÂI‚6†˜¥©§’IŠÌËgf!ÕàÇŠ+zYZÝÌ…Ç>ZÉž¸%ä$öF)˜pvë|.ï:Fe¡Þ6 DëÝbhÄçËÆöéÊEÈ,ˆ-™}ú"_`IWæÌ*„—ÑOy“$)5¤” dÚ¹DB³XTÂvô(TÎfŽÇ6&c£Ý29l¹íBº˜bg€¼içe¹_u94B½öñ‚6eq‰6ñ «óJÙÍ›f6Æ„¹$%N-i¶²jî¯xMêÈŽÞIÓëÙC¸±HåT0{,¬÷Õž£ŸÌÒAÑ¥ø˜³óµÈë®–³ÝžV÷]fM Çb1æò×¶¾ê?bÓÄ{\ÂW¯­YûËäĻҴ»î0r>ö“–"üh‘Ô–úD¥?V˜ºùja.˜Ñ‡òîxA¦;I§é$nPΞüB4M눬ê#.1Þx¢‚ )AšvLìmÂf[Wª–a±‹‰0`|¥C°³»äxf¨%·up^ºŒÅ¼QŒqÜ}Þ¹V‹äÔ‚zÆ|ÃzÆDö$}I†3g¤›Ðu¨ä„¯WV“‚¥kI""?¦KCôÜp‘Ÿõ Í¢{•” º=áÇJˆROU¡wbé!µAµ×ä¼Ñ¢&¥IÄr¹œWªî½™U…ÒÞZ&éÄÕ@Í k k(§z3ìMÝÈŸ6CÀüã;… v.64Kº/æŠÖ#mÈÒ,Ää(¾¨ÿéûÇàÛvwÈUñ6æQOÚ”ÀFdx‘VÌã‘õžŒUà6`'xd­sá·ð]Îå).È® TÄÙÇà`eìÇ¥Þr½R{ݪçÉP|..èZÅ%” ¢{d{Ûvn‘Z¡8ÊõŒŠÉqÝ€¡‰|oä ËU°³`#$S†x „áÇæTÜrLjiÛyÍ€¨…F‡ó¯®íFH ¢ß¤å¢f§OjåŽÀÀî—š#G-È$Tš’0–Å1Þ)t† +dHfj³Ú…Y:1\Ü}b1j ¦* Ö"ퟲGô·Üc-e.ø± AÓ Å7Öò« ‰FçŒI׿5caþ£Â|‚>CÈ¢ ˆÙö—»ûFù7Á dT¡fòÖpŽž¢ÊgF*Öàê×úgR‡8ÉrƒË–ª&²SÞCÒ#sëÆVæEÀ+l™¾€çÓ;Ü[±¨uHßÃRÌe¯R O«6ß È}N# 9¥<çQ\4VŽ…ä‹ Y®6¿P½átlNNg“ñüE}úDZ<·û<‘Ið/D¸ÝîÄÄ8ØýA¤EÑì¹Õ zœšç×öôÛ°ÔÓ\×gtSù•ÅžÇÛ3+t\:¸ôȨï@>¯Fv~5“V«fB‚ˆ T7=gppýʆºBHÝù‚Ô7ê@;OiNa2eFÉ´ŸøãÃŒÄC‚µDHé‚Ú0ærû'ŸI]fµRØAÆ™l÷ñD«Ñ8 Ê@/¹–U‡a&¦U5ÔW(ÔOõ”ç‡Üpóês07¤]ùÅ·]„»!ª™É0ž¾Â0W9„«£”˽éÙœZ†Vˆ)aÜe èö›FÊP÷FàeúPèo`éíD4<ë5}°+ºÔà ֠…|gBûq¿ºb'—ëÚCä8B[†fäÔr‹wøtœ7À9KæŸuOrÕ’Am­M:NL±rc—Øn ‰Þœ•¥?þ([ FÄ5?DÉt¹œ¾@­oÛ¡ðó`–‚í:v£K±Ó˜'­ÙЖ(5xÏgm‘×vÄÚ9#Œ&íBÝæsWHþ¦ë:‚k]:U uø~8Íwœr¢.‚¡d:®Twò¤Ì|v=ŸÕ+@l×É|@„üYAò“ar‹ô‰Ÿ3dàÉ껊›O‹ÈóßpÄzÕ6"LÕY΂_Ak@PCÑ—‘ø ·ZLK/rƒ…û2 ç;vÇß$Ư.èp`,}žQ^{ut JIè@fâbªKû± Ûÿ£­¦¥ðÓˆYüe× ‹Nž.}Kçµãe EŠ7R3ó™ÂôGóÖ!¶”e±^ú¯®Mn€ªp.¸6ª¬èúÃf]3ŒÒö ,ˆÇïë}š åo˜Ó ¿åOû´dhf‡ÖtŸØ•ÖÍû|ᮊMféƒS`H¨h;oIN|¨0lê@{SüýKéèì^ðDÈæ7=™)BY zÀ¼’bõÜqÿ†PqéÓïN—âí!ŸÜd‘½cAhGŸÊüJÑ@P±Nûä­¥Nî5pÀøÈaWæ ­Ã{–P\õJ®÷n^YÌf­úàÄax,Ù£ëJýÅeã ¡²L]¯qèE ~åäa±¤sÒ-L3³§N c På¹?Dbe€+ÑŽ¯˜rÝU‚ˆÜ)®¸ô3óÒ#ÓLšÝá>¨ŠÓì›Çã.MΤH¡÷l| Ó3Ûî)aO"½nZ&Æóòöm¥nx·+x+›q˜õµg±;7]Wëy² j…ò6lHl(Ör8ÿ~pÚáLPÐ:ضMGs¿{Z[£½j&sv=ÒYãÐyü&çß½:äÅ?—‚ÈU´¼¾™{-SXB5Ø}êœÄpSPÜK'¿~žGlf–– ‹•ÇvpGA-Ô5Œºí°]Ïf\ŽR9ÃfªªúÕ|ÓuD;¾vcUL”Òà¤YNê£ì™¾ u“Â`W†iT” ñ‡>‹¨Pñ+ ìxP¨lNÂ|e¹$óœ áõmD%›ÄÊÂ¥]Dû³éÉs‡)E´·0'ckäØ,ü5(Ø6ÕØ&EE»PäÁøæ¹ähjƒ´f…1»VÍ9Èêüâb!˰ò׈”äb_Aô°ûxãÕ½šÖ¼Ú~,âPsöüBñì\Ð%Îx§ý©7œçHõ;Wh”‘tû$®ú`'§m)"{'ݘ“»³²=Azõ$éJÐè'š›©:6ì!vju–SœðŽô÷`ŽãÎTÖy˧n‡'‘­ú-êþ‰ÓçQ)õ«ËÇ¢#â-¬)Í)uºkèë'„W›§!µé§ÊÜG¤w;:ìZ™ñ"EIÄš—H=s5’Á+YñZì~qÅ dÜô6Éóæö½Hoèü}×õ?¸iø/¤ø}×–•ž‰å÷›ÒÞ4üÇ{Ò,ÿxOšå_mÒ³þ³MÃ?í>ï D¢¿v Û#T(ÿ㡎=@ k«£gð²å÷rôsËïy÷ðyïçî¡¡ ÀÐÊÁöv]¬ ,&³?¶_îï?o*šX¬VOïÿnKñþº»øì ú÷=F{c[ƒ§O'«Ümt8=ï8\ l­þaÛñ¯Ïj±üŸl;2Ñ2ÓüiÛÑCRYÎè+'­í Y鈱ìÿüWuµiÓøº2dª÷ ä¾e:°³ *Âæ„„Ü ·Ô)Á·Í€IÕÎ"‚´$ÉÄm{óK4\ø{ô§êx섬?n[.Õ–.oAÂ>²‡h—+¿¯Œ…F øaH²y•>¬ç«<°û‘yhãÎã|Æ•‹& 6OêÀë¾äc!}æƒAÝ=²ï ®EøðRjŠRrFz²"‹¼ó€WãéPÃãmßIn¿â€$ù}÷ûÊZBÔœüÍô GRÉ¡¾Á~É!²…Øô4yy·µ£Y7[?£ 8)Iª>ÑÇi§×¾3_h¬,Í—PV§î,ÀÞ‡qQŠ ÄáÌy8KÙŠ›ª:»òë*:@˜M iÕ®ôx™+«W±èêÏÚκQ–A3‡DkÄ]y¿~·‰¸ÚÁNàûQŠQ†Ÿ¡<: ÿ1%XY—¾<8ø] BXHi¢.fyš²àž#âá\DŠàxþ×å)3|%ľÁÓ!̯“ä‚™tÉiƒ> ê¿}èèï×/zÚQü*Hûú£î;86Ú$abœr[•|ª¤‰a”/T±$R’Éîó€±²9=ú×Ð <€)‰U)‘Œ“ö ¹(I5¦AÎýÄíOã€fýÓŒµ²ãǃ~'Í·NZ½þp7`{n[oºýÖìÖÌVŸë2Ï—”ñ6ÖökßÓñz5#ΔjÓ„¤÷±˜CkEu^>†åH+nAY5§”«‚ìZKls"ðÞÚ©ñfµÕ0NçE,û¢ (<(`šV5{E²ŠÄµE´T8T éqÒ¹1 ®új¢‹%Úw?ZpßóAìˆ.U¬dXh5AÆñ^üã&Þ` ƈPû»‰Â·“Þœã©ÕrÞ1d÷AP"ê`TAò© *,|í²;·þý˜—F!N?¸r'òêÆì rüIòÈá²ßŽì+Œ±ÓÉJç²×ø¦s30A¶C¢«õðœd-•‚p‘J xK4ÖüPi£éÕLlêž±\w!z㟥yó‘EµM _zâ„UuQ[úTZ'Aö½1µ’Ø£ ,õʃ·!nHi?,i|Á,[&©;0Ëî§,ŠÜH?%Bóïß\ŽÚßK5NÖR±cA*¼¯lL›<R¾bb ‡`5žªpBÀmzXtGõ¼ÃDâ>ˆ9-q¡6:›{¿Ë3S¾j-z:ªËsàÒëqDvßÞ›õø òÃ(JàÊ{3´ç4ð«­4<[€hèo§zÐ&Åb2ÛÊ:°TiÓ¼>0Ü ÃÎÄ»,É]3®lVk”Ðõ,‰¸Õ¦ŠŠ\6˜•ä U˘÷°Q&hm`_®ºÕ0‡%®¢*tjŠRŽ[pŽŒ‘P8R•õf± JI˜ÑáÚ-0¨³AÐ=$Šôx¬çj­éR¡µfo‚Þ@‚}€ôíŽëBRH%ŽB:%”/òèÈ›#A“Êæ®’E.ú*ÕÚ)Žšj»Üû~wÉsE“̲}ÓcÕ#ímæmRÙ­J §‘pnƒÑ7Oı+fÀrýÔ#Ä‘ÑQw*É›Ä/_e-Xîlâ7×òfËÌn>²vâ]¿„ÀÕ ÉÄvϽ”ù˜³ñ;> ` ääª?7»oH@Â2“TG»àôÙi“w0¢‚³Ö©×Ø?¸Í'ñÍYV4:íFã½¼Îew·¿ƒøï ʼnÖìÓÊOÉÊLš¦x~4lÎl‘Ø¢€#éU0ÈE¥Œ;Á"JZ›_¡†Í×t¾:üžæî¾¦ØÈùª\ÙËeȰ9¨åûẕÜzv-Œ=Îu¬ö+?†WÖ´ŒEe2¯Æ%¤U…É9£É·MªÐ6c»$Ãr±Gh^w Æ×'ŽS郹÷[5jðsN(öK¤x|±Jègú.OÇå8oWx>K:Ïö¶Hc.6GÑ+"P@þ²¼r?^A5>ö0­šÑÛÒq²úÉmü­](S7俉Ĩ@á‰ôI£Òú>eØ­r_ $2pÁ·Y9÷IвÀqÖ_úãlK•QÂ5Ò߯VÌ.Xæ¬î>Fõ«‘µß’o¸R}¯^¢,fdÏÑKó0±î/âj…8–€TV­,H ¹{¡Pç¸Q A,ÉÅ$ÛZ {÷åT¡ÌA—‚ykbâT²fÝŽLû£79€á…%F'58©Íµžò6¿¢*Å·€ ƒ|µ°ûjò†XËÄtNÕa)“¤öó—ÚLe¾”wð|½¥ ´ñwX‡ê´Æ±¤ò’CøùIÛ‹%oÔi'ÅŒprD‚–J6‚Jû$‡ßPLbÀ^ä|+`Þ݆Þ"¨/:]©¦üávekôAZVñ•3ÙXË•RŸ’RPYÔûÚˆ ôm•È„púÂý@9†»7T¨rÌE x ‚PPë¦tš2 ˜#AôQXo[óÓÃÙФÞQT_œ-ÝûÔ0=}Y6íËâÚÝ·K/Þˆk}•(=ìqç>Åž¢_}ó&2W<Ê´¨…Nï EVó›BKõ˜k€-ržjï¦Á”«J8Â;²YUYà7ÒÛ l“ òƒiÐÅ ÕÈÕ™¡;i5šôû¼n¹ÞKyl×L©‘‘¶•sê‘-“†¥"F£)WL†Ý ¸d’õ neÅ<¿iÚ·l?7ùÌQá»&š¿çŠ¢ÑìF|+ÔÞä¤ÅGÐÉ«cñæcs@Ãà% ÙÑðßJ¹ k\ß° ~*¢XUB·´kÝ([ñXÓ¹qn@•"ìÌ}Aãó9ƒ3±“Yæ‘"ÍDµ‡&;‹c`fvƤ/n#QBßk¬u`ÆáOxÛ¹Ì÷©³¡s"6LTtÚ¦çØ³;chybŠ_mW,Ð7Ò;pg øEÕ\­˜Rq½ÿ¤/ 8-ÁM_YûSøt|+ßô¯áN_ úUOÔ$0Ñ•îÑbkÀ%ËâøÔöÓ‰ºq}ÜÎÄ{np¤Ð¬;ÊRArYÙ¦hJŸéŠLâ\ÄF·‚ܬIþ{ÂÒ,6µ¥êC·3&Ô¤,ïEr‡ VDVÕQ㳫¦fÈÍL1_I­ö/gÍ¢Dˆ@O(›M~…iÆ¥ä·,çD j1jÐkùn,2Öxâa«)YŸá_Ä ê ;ÂwQÁßV—Ò‡1xb›Ñ.rDuÕws¸y)Fµ*$…Ã>éÔÜ$@dºâdÄh ‘bÒ¹ŒŒe—Yîà ‘”ÑĹæ›ï.0}kÅZ•ÈË|½{»ÄNÊ…Ýä§nDÎŒycLœBÇQRè¢{\f+˜„Yw`ëèÙ©A<ŠÎ€lÚÆ;áCª\X89yC^´d€É´zDØ[ ¨‘6FHHg]|^\Ä1•’Ã-['”J4@饉ӑ¤¨ŽW%ô¦F9¡ÿzt˜Öøê‡&¢6‘GmÞü¶1Ó©;ò…÷ñ®v5»!½Õ·ÜÔ«ÒB°UoMÄÖÏ&ûǰf ƒP>iýáBTfM3¿üí“)¹âµ‹„bHÝ·¶µ~Œ kì0³$‘_n®,$Ò/†Ìª—µn"Ø”»“\ÙCîvÂäØCü¿êˆ{’Jò{Ú‘K|dB‘½aµµùÕŒcš&0—ù`¸)7BçÙW–à¯0àÑr¬‚‘L35on“v¯KTÂÞ+ž\Ä;A¶wÑE2ÃQ.ìáŠØÕAL_ ç(`F@…|åîÔs+m+S‘B^Ô&D:tkòCF{â§å¤ÃÔéK¨T­gŸÎ® ®€ZœÜ3)» T𠸦§‚íŒÏ„LSÛƒïF\߰˜öGdw;=ª­—É5svÏì~$»3“X”ÃÜ› ¡ÉÇ”õ 4dU Ñò¢1B} ñÞös\AÃ9³‰³eKöNÏáÐÁü2¨n[óØú™‡ˆ‹7Mļ"ïN÷³h–.!©•¬ãï<˜[aGRÕ*}=?]X9¶w8¢ä”órœÄïWÎúìÂa&Ïzî^ûEU!¨º¹¹¹ðé<;úc#(¯Ï·K‘,vê5ÑW±æ‚85w>׈0(&Š´•7°‡¼^;sÌXF·*\\AˆËÁLLaô²š † g¼“»“Ù±pÿ@\ÙÒ6> g(j–À”2'=#.ðn}Pì È2c-ÿS¡oj,Lj˜0_ë÷>•“@—¸ iþ bUÝÎcö¾øž3ŽÝÒ̈&‘¾.’œÎ.¤´ghÐn]¥œ’r©Î@DØìdÆçKfÿ§’‘ãÐ0QJ Éò˜AÚo0ѼB\’WÇ£±Sz?®A5µœÌ³ÑmÈëeò|ÉWÀ—Ò—˜Ü´„¬@îW Š‹Kó'¡‡|á,bKRwާY„&¤€î-¢ØÍïuÖkÙ¿;ËÅïn™ø {v×O-¹U+¤îoº¥B´â³0[<ä¼ç:Ñ:Ú+ ʶ†§¶ {«[Ι«Ã~^›Öö) wÿG;EÜTêç@Tôщ»¹mrùÂHûʼnŸï±ø€Ä܉5£¤tBTeÂûó+OX‡=}£E¼ÌášKäLÑ–\qôϨ¹2zbGå÷*Ã|¬Cs3îð$³êk=¬¾1ÚD¨à5êìЯ7î¿E®š,m.±îù`ÛÍõV-o.³-d¿cÃBAþ6¯Ry§2ᦧ5+Î0û÷ª÷ûB«áŨ($y¡W·&ÉN4ñíÔî“?€µ¸¼¼ìWH$è?õ T» âåÒg}ð”]˜ÌÃÐC^a” ÿ(+ÚR.^Ýä w‡!‰£Ö×KA90hBizhn¾·Ej>Ð6~ ¦¢õ!‘‡o{É[*ƒgVˬ¹Ÿ?¼t)Ö§ u'NÔ&*˜J÷=öŒ\JŒîðkÑWká©U%cü SXQÞ±|¸Xœ^Dõ¢–Tà×gC3÷) ûͯîõ®ôIDÛÕ\µƒ»•5v¡l}ÙÒ„"¨D û üðîoó[ÜÑ] lp_/5Æ8c©g°w[\Ö>’V'.Ç«PØ­‘9é®=¸‡ƒY8žÝ]}¥¶ÎˆÆ¨×"¼ªRdz¬lO_è³{×eQ5T–dî[È&œ´ö9GÇ É4>JAR@nTžx¾A:Ïô¶OC?„v´ÄãÆ…Æß·rT¥TÅìóʬ‚!ìȘ˜a+5][ê†{J›±¥f*0Im½Õny2nœŒx>\J’:qwCW¢ŠÄ¶xohê $`^É……HBó{Ñú±ï±n‚†L¹À5AaI†à,,ý§1ÀñpíËL9ôÁ± ó4ï•d%õªßŒÛÕò2sãÇô:îo¶q×ýPÔ >ì®ÝÜhèi ·Ž lB¢™ÅfR·ÖdF1ç­šå­’øGÅBiÈ¿Š®?wF­–Mk_<ÏòÈ崪ʕ½‘Ž`÷ô9ÈðÊå)lƒø±äo+ *+ƒŽ@8+Ë©ðå&Õªóä/”pØî&“Ÿü¸ß,…©ZLx "/²ýn½BØÙ:lìýELâùå$'v«­“¤ZÙ+—LþØü>ú‘Œº`è–iµ~ XCM¿.ÐÔÌú^›ÑZ7 d¿ì½žätíó‰°%üâ]‡·ó®z¥û©V{SavªJ&hŒžþ»åe>]ÓWõ=e:¥ÙØ+dÃ.F“`A€-Ñž@ÁCàYó+¶ØÖÞ¡áá“ÞÃ-S‹ƒ=ÄCh„ä;@Ù*&£foÙÐ,ð•dçJI+öcÀ¦5'+;¶zþp.,–0¥èE}†Ð ¦ìò܆>´=š…dÃ!¢o`h¤X|\Ís¿Øl‚;~° ÀX~¥‡vwÔ ‘˜ÍÛB³|Ðë~Bm‰«ÿHRoWû£Ö}a¶ª Ô,`;鑽ßô 𜓼 %9'Ôü^SNŸN›?í}—9/í÷«Õ ÒȦ}ƒ4Ï®À|›Z«ðþ!©Ù9wï< 3ÓÇoËÃØ¡VTl*û›Ÿëãç™e­•®_ß!ß•nöפì3¿¿ÅQïds½Pצ¥:B7R3HÚ³<ðíÊh¸*žÞ6¯2÷q=ùìf HKâúÔm8VSï+2âÁ| “}Ìd'fo—‰ëƨÞ Yæ USÿµ¡Ö€îê6-@›„°”UûÊpÒÊÛJ¡îEkÅøXóÖ½äðÍv"xòö:°®Ö}kÕðoµ(â³=(¡ôÀiïNaæ"³%Ž8OÔ„È¿Ÿ‹™ÂjR²¨Ç¤"ÔÐ[à+‹C i½o¼=I‚nRº¹öÉ~Só)šÇúÞšI6vꊓÍ_tD) h¬më©›û¨˜$b¦t^츂L |øqQ*‡ýJ‘ÿÓ°³—I¸:Òí„Éyðžh ÃÜ$ãc7‰o¶NK]6ø–ô;yý"6Zé1‚Ú™qéC“‚’‚©©“¦`áyR5==3ð2¢bIø­@U%½â‰$í·„J†òЋŠIŽe3LÊ*û@¥ö±„ÈývÐW`¬×¶Õ‘ó¢ÕmIžš! 9üäT2ªüñîBɌЕթ¢–¤6Fñ {Î,ÔDÂN9Nè |=òûÞ9Õ‹\#>T€nè‚!Œu2ž;ÅOÊunÕ¨î;-šn›yC‚·sÀÛñ¼ôh?Ð'`ݾíC£& )ÎtU^û`c2í¯à°°í‹Í ûpk††RO©Ô2ëm4*Õ;Ú,W˶+Ÿq—PE^ 1qðusu+’‘T»S¶ãm‡H¶U9ø'Ž×Ø©ÆuZôß /oÂ3«‡=²GÃ+)—­†fC•3¸{T»ATU¹¾%ãÎŽº½C$••m'ˆyÃ8ŠëŠàAžÅµªÞ¦` 3}~®ÙÄd¤•¥³&Ë1¸¦ôš5›äè.5<æ­a™zÒ‘Ö80 G; J$U+ã7X/ž]–ùEÀa㺺ðPUæ©(göÒ.™e»ïF— U±¼eÞíè®ìôVÙ0jb§N ž”EÃÌ–¹£Š}áÁ>âWPÎ宑M¾°ùß#ÓÙÞ:Öõ8pï1¤æ%qÉmWéâ¢+U–B)IÇ3Èy;½öV®Y¢±94 íy>¸þ™ÅÖLô£lÓp+ß¡:tíÝjCÛp«Ü’§ó¢¾øè'$Oï r¹<ý7rV—Ü^¬î“s÷bŠT¨™¤Rm‚÷  i¬5ávJcqêRï`ö<¤„·?+o¸Y*k}¬æã¥ ƒÑÿÒ}–Á° ˆ~8]ë¾7«¢5§['Õ^*FÓ0 YÁ¹9¿ |4žß Dø µ­Œeš;¶¹pOq•ûÕŒ` n¹™žeH)k@Ô4C ÚH€¬ŠÍœõèýpz \J*†i=ÔïiLl½FgDÖŽ;öâûÉ1¯ãj5U¤‚QÞIåiηµ(u¶ƒÑokîýdsM®yy?Û»µ…y·_×&-¯Rýèˆuˆ2óìÖç4¢~›ÀÕð]dzaåMU ÔÝ®^Ý&kˆãÂ&#ää‘Ð@“¡»[}¢ Ë7ݵr¼ÈX}Òd-%Nûi9»Ù¿YÂPÌÇ¡C8Èñ®¥³{+ ¢À¤Þý’!®ò2d›•õd±t7#Ïû=p84˜,#Y°Aþñ„a>žžÇ6ˆè:û{Ÿ Eü ó³ÏÑÓ+hq[}qõdòÜeQ^¯ò5l´¬Œ‘'\ÔR±½6;D«WÅYØGÜT¬4çÅ&T(a“æÇœÚ窔LÅkyîàMoÐÿ~÷ˆŽæ/·~ûûw”%Ä»Í@KÏÀôûmv.gkgìž®‘‰%ÉaC ž‰>‰£„5Ÿ±‰°«­œ«¤¼ž«™«> çS,§Œ ¨œu¬© _îoØáØéqðÉŠ < 8³9[X[<ÏÙÂÜÒŽÍ™ƒä% ÛÓñs0€ïEÄÞŒƒDYBÏÞÊÊÜÌÄŽš•š–Š–žÏÐVÇÂàMKÍDò”¤­¾!›,¿à¯Ÿ¾qÛÛ[³NNNÔNôÔV¶FZVVV €ŽŽêI‚Êî@ei÷ŽäW<åߣYÚQ¿”‰ZÏÊ`¢  ¥¦ü–ÿhS¼çï:ºVö$&úlL: Ìzú,ŒTºŒLT´´†´TÏþ‡¨˜ õtôõ˜ itX~ËÎúOÅü‡üžN5§“ö&öæœ/ã1·ÿy`nòœ›¹Ž¥‰3•¾¡Žƒ¹= §‚å‹´þOk˜›ü2ËK<Àiý[~õíçÃßGN(¼ÿ¤¿ÿ¼„þ.Ÿ†^§çÁðïÃñ£ñoýšôŸuk2(ÀK#~ÒÁsë'åg{î)4¬t¬OC4ÝK'!¡¡!y{ê]ÿFâWo ýgý…ìw¯$ζ†P4xt´P4¿ÿá112Ò3ââý £e}öNòrÆòW-ëSf £¡eyöð—0&Ö¿…=…þ=.óßã²>û&øÇ0:fú¿–…–Ž…áorô ¬ c¢¥ý{z´4M†žñïrO’cü[=3ÝßêÁÄHÃò·2330ÿ-.=Ã_Ó£eyÊæ0{[sÛG7rϬ§Bd­¬ìñ^Ü›àD, ­ðè~ú¬áÇSc§e¡ã£gägædbbâgbdâa¤ãcb`¦cáãå¡çáü÷P/^ætlí_ -+#3+Ñ3Òèþþ‹ø/z/S –ƒ­ 5ý9ÿ…†ñ©?¿ø¤c c¦§¡¢yO˜iþÇÿãÿ?ju¨§×Ÿ@&O‹V<]—×È:vv:zÆvöövx"–vO³¦ƒý OÞ@ÏØÒÊÜÊÈ…ê·D¤g=¤ö¯¯n(òlruCiʱ<|NãIJßò7cg÷ï%Ÿ/´ÿR¿sÐ팟¡NOLôÿ}¢¶úÿ‘$Öé¹ROJú7‰þ’27°ü÷¹[è8k9è[¿ðŸ¤É ¨ M^ À/ Ç'+òz&/=Éþ]ßôdOq~g:=õã?µØ?õ…âð›Õ¡~³úSË|NÕZçyàÙ îæÂ32q|Jã¹½ÿLá¥ç>{ŽöPNõøˆàƒú Ôxî…?¥²3xNòù¤¹Ž®¹Ý/wÎOãËóŠþYøW~Fxÿëóe\‚zvm÷ÔŒŸò{¹~&ô“wô4`<]ÖèXÿ§Ðyqý êêc÷—–õ2ýÑ„^êø8ô,ðs¤zvXøk<ùYq‡—¡èYÊQÇüIqx¿h&Ï#Ÿº!ïSo°Ö¼p‰ lŸzÅSº-Æïð—Ruðž®ÔuMžÆý§ñå™fû“Ùü›²ÿY/-ôO´K+ËççcŸ–Ûè9ü¼1y.‰íó$ñÛÙ§1öWz¿5…§iàWòìÃû¥:/Sƒ•Þ‹Å~vÊgÛüâFØ¿8y×3þ-擽­lÆü©[]sƒ_ò/Ü¥§ÉêNò;\ÊüçÎØ“vÿHê©$ÿéýìNOõù9¢¾Øî©ì¶$/|1ë§¡Çä×ÐüÍÐÖàç\ü«V?m õ[/z>­õ³ñþêDNÆOóƒÉKÒOS€¹•¥ÑS¤gOùúí+Pï·ÿÄ:O…Ðyê–ŽÏ.8žº#5žÂ 5æiÞø×}Yýg»þg<]?%ùÓ´vxÏÞåŸåS#‚zY–<7Ôß’µ0ûSŠÔ/£‰¬€¼‚¬$ž"¸‚ÀÓ˜Îû÷±JOÇò7—íÏ3Ø/×T°Ÿ]€íi2’Æ£e|Nã'LVï|Ä÷<ô?³Lÿ˜•ÿ4Ù9èéýÔå_ã ðòð¿ÌZòÿ0Þ@Q‹üüÔ{Ñë¯Õ‚Á³{ºgxÁsOÒ·²x¦°ýäŠþâ‰éèé¼äì_à`:/½UêYkT¿ÚàÏáÄê_ÉþvÞðigûÜ„žÔÂDõ;ƒÇîï5”’€’0xŠðÔÇžÊfàlü”²ýKmŸ”Ï£È#"þ‹ÛÅ£¯ÿ³ÁÿB >]¥ÐPÓüœsðxÄ夞R–ýi §•ÁSÒz€ŸÌIùÇ™?5࿜ùeýçП¹+È KÉBýÏõßï×ÿï½ÿÿ»ë?FZ:z¦¿úÿ§¥ùŸë¿ÿùÿÏUžµœDò˜V‚ ’`MB?°á¶‘ŸHìˆ}%©#½.¬ûîT"ËsNƘ×^ý¿ˆHè7øþ“Ï?ÒÝq_g§ÒÜ? ÍžªE•„¾yW<ôF Uä0ƒjW×Ö»ÙÿÁ3ð­àKnôµ£½•¸e~eÐéü¶þk~øu—ûÍ‘ëºÁdxÃöþÕð5n6^&'´ûš(!êl§ž;ýF#åîu:•u†ôGƵ…¼§³4«¯ÌžÅcâUxJ:ª)åÛPró\Ö‡ óŸmÙªQ‘ƒ{ VÜ^Úˆ'€ÃåAYŽq¦$„¥GìB ¶IH“|±çïšDò:Ü!@«N§>:iz³Yál‹žp²ÊGtJrÏ:\ÓPMH(ó™iÌŒ˜_Ss8¸ÙŒvø{¶jd@)µÁç,œ(üä…Üf(ã‹‹›ÍÉ=ÝÜ„¯úwÑ9£y¡D×`zÙ»ZÇ’:±×=Âc1XüwCÁ™SD!S:’žX\|—Y>>2 ‘ÕX Àó?÷ó{ÜÃ’Sy„\0áê&†ÏÌe§8òª Ãt£á¹‡¬€ä1k4({.ç¨2ý´?ùC´…z»úª”N’SÅ(ëÉ–TºoµnD+›á…\ºMœêà] 4pŠÃ±Ó¾Æ6qa$Êè¦ÂzÏéÀ²¢Ï,‰qÜþÊžÙ«d1ćùõˆZu¡À¤«_[©—:œª!.ÞÜpDªm÷½§­Ðâ=Õ8Oƒ¹©ßëצÌ 5«ùAäKH½?€S9Œé·ª¦o .öoïÝ]¬MÞ­mÞ¬o NÛ¢Éptï²½S ×ÉÌ _æ+h¶éfºŸ±V*;vÐ Ã÷×7Œ%ó—únsú1n7ÁW˜G¾ÜgCnþ”ÍM}Ö益z@§O / ø vŽ?’ÆÇ„oŸ²awˆ¼°Ü{·ÍžE"#jÇä£M˜Òk4džfå8ldúêdn*1ˆ¯ ‘h´‡» bo³–ˆÉäéˆäÚõ¤ê‹UĺÄtâÓ27ÖA¢ÚÊE›A2§Œ£YMÛmȈÙ3ä1Å~¢ºWW{Uk"Ž¢sÖ ¢Æw}|M`QQê­€ÓCå´R{ðšÓ~K>Lk¯ò 4ådÄ7È.R³`Œ5¶ŽOn1h>|w‘0ÍS,@>‘Ù„MÔ.òÊá̵[þåbä’ Äg¡ƒ¤óK Áâç÷ß•Y\}‚0½ÉB6Põ¿îø8âqÌû–.§M£4®°V¥…ïBÐë®.ò{ÚiæÉ‹vR­ˆ©{òµÒ@ÏWH:î.vœÂ½3‡>¿vQRÃÛ™ZnZMË!¡§»&°«8ùœSàQÀ‘Ê:SÄVÚi‘y?i‰‡¤-«-¤˜‚ö&ÝpÛ(ɈP%F]PA‚h¦— ×À]0¹ØDq* ¨i£Ê@(bT¾Y§lœêI'ç )M±JŽ ó§ªwh«ŽrÉïØDI™”ξ֤4pÚߣ¼EŸžÔ®çvégÿk¼(§ò¹½Ð' ®#Ý:s6Ía%}›ó5xE¦BX¾4¢ÏQ©ºßƺ$œüÚNÕ¥<#~Gã‡m(ãׂÇïéüTq ñÂÕàǨ¹½J\`áĸ”Àa/LAfñK븿áæÙ6¯VÀŠ]ú¢þá2­AxãÆ—Ò1Ó1V B¤dÀ0I ¯’m*äš<•8]gB¬lÈ›ZBÔÔ;·kW{ºóà†ÈÝ®<ë[ô  _¯x 4Ëò’Òð3óÒwÕoÜ…gãáæö`<9²]ty7hr‰Œ½Ól¯+Ä,æ­VB'¸Uèû¯k,AÞ¬Ø4|ö-É¿ˆ†È,ÁŽßs}ýi\r< Ê£äç2>Fœ§]ÚVÉŸbÍOz•Ò´¾-„€Ù·Ï¡…¨À[Á/“ õ`Ó»5óíÖh ‚W1Ñù©~òHªÂõ§¹²Ž6.¨ò?Ц°"'«^Ï_’Œ;êð‚W2±£ðyØ`3U\.Õ¥ Z–õ¦ÐÖz¿Q·§>Ì«\5<àÿaŒ|b½›¾Rë Ñ”3?ÚJ3l ²!|ÉÑgÇOay‘sBŸ[‘ErCBŸËž€¾šÐ#cš90õ=ŸOgȦ¾1ÿr²8pvñúÚž‰ÅÌmÿ ~È%WÁ¹Ô’ LS^f"Âx9n4A¹>¹­]©ÙÓ¥t ®`XiŸ¯ê˜y&%Ϊ|6Ú v**u[mpOÈ4FGŒb1Y¿ Ì1Õ‚Oîêý -774z€þ‡Y”ŒÈ= ‰'‘¶gÜqG„s2ït¦0…ÍÖÍs›j›› ՔťU¼Í õ¨¤¡…×ËPª?oŸNžíÈ_DP@Ö𘅗ÏD‚my›`Û!dT†K™½.î80ƒ°xìI!rûâÓð±Ô6½‘‚¨­`—áÚ÷5Û“µµÝÇ/ŸÞÔp‘.Fž+FŠ»Ûðme:E‰<ˆemljS1û!¦¥Ë^›@ßó|Ò£I¡qutRTdÅü¸èV>¦R³çz¼ºáâY{X…tµÿ¸(0èÌW|ÕõÙ#ŽúýE9çE—÷¾L«ÆcZ¦u©àì€WK=ö5:Á—ÆÌõ³ñL?âÉÐ×,-äÄvXs¡¹‡ù§£fW·¨y}¾Ëÿï@GÃLó?x‡¿ãhÿ›ãä…ø„UEþñ 4òœÏðÞá7/ù÷çþgøÁÜãûäüß‘¿}þŠøéçþ·°ßü×ÿÉËý¿FKüSø·ÞéÿjðÁ;ý³â Í5þ ÒBFJF@^ð¿iñÏÿŸÏ>iò_³þ›‚,~2 ~YüßÄXðI(‰ ýa,þèzY<Ëük”ÅŸ*ú;ç㯠‹ßÔý›þ ² ùÆâ“ÿ†±øÃ`ÿß@,~rhþ]ÿ/@XüÄý«–ò·§/ÿ[ ,þÕÔñ aÁðâ-„î¯ †ÿ(Á‚î?`ñËç‡9Àè—wg?Áÿ‡Í/ÂÅOÿõ pýÏ']Ð30Ñÿ™t¡è"4\†Ò@æñ.-r1ÆþÄ'±©nÖPØÔïà,Ò՘цûK—ç¼N•L#Ða”x¡x¯É³FÃi†EÄ—Æ× O4鵩»IIßRYO»S‹äò‡J¿:Xy,[eëTé0`X,ùd!¦[ŸSËDf’Zj“¡K½ÓJhÆ @”^µ{8Õ°GÀÓ5ªmajÁƒ Dån;ÔÞáÒ–a˜ë®ÏꨰU1áùDª3Ûv”P¦^¿ó(8Õ|zpã¯>ûÈ)2Óõ9ޏQbQØÙ·âQ³´¾€P‰R|FK1F.9ZýBçÛ’ÿ}#H9^>Ýj-Õý#* Œš¼ª¦ Rˆ]‘­Ë‰;NKf²t…y=½v`®v†öm9Ã#‚Xw.º2ã«ù@ìν÷_Ò”k0çÃöÛcÊYgÔKæ}›|;åª[ õ8ç T‡Kê++µã,.Öfá··ÏZèéM³™… Ž7®ÊìB7ïØ”0iUh}”ÅÌÛ_m%K©žÿ8õÓèda¹¹vÆ?Å"ó§-©ÂV-ÅZqÍ®í‚ööй‚9a×qB»b½ßØ¿np"ɾDµ³j‡*>ÍTÔU)^!ÍÌ`ˆsCÁ´šÒ¯å¾Ã¥ëZ¹I>êÙßåRǪk¤ÿzÞ"5jh,oeÈç™å”óîì^ƒºÛ›0Ðd}W*Û2ºX¥îkØkðxnà*÷*ÿ¨™x3¢%b3úÉ9JÌÏÞ×[ÙpõðÒj§ËÆ·5|‹æ& ,êpÓߢVnÇU²C"Q¼¢yíWë¼cAS'#—ÞTêH`T€‘scÌÈT<̤ïŽóµ÷N¹_ÍÇkø?êò£²Z1u…ÜÜÇXØu-ÒìÖ¿2Ì;·r&½Ši%«Y]¢5ª§û, ½OœÍΔŸÚ¢/Bèx‹/.ôÁf~[/c—LËC´„U¾ªš^Øb´! - ‡j1¸4÷)ƒO=þX“t›íQdÌj‰€àÃR‚%wé00­A48k™f`È ß;9%6·dTyµ"Îúa¬WÎNvb„²È”oãÉúɃSSSõšc†Óý7(VOÕ(´ Z´ ‚_YO·èaŒC8̦e;÷pF!˜®QûîéimiŠ?> ™XÞ±Åáú¶}z½ð3Øyf'"ÃwqŸòA+‹H/[Û*}–Sò6L…3oÉ;}– æÑÁyõv ]-èvæ-Ñ@ƒ*R2î­Ô SÓ¼2Þ’Ðe×uå±cé‹YÐŽíðMéP#¨Ð¨\È¡‡‚õ¡ Ž9›«å7w¾ ms=[7yz­mÇ3 (Ÿ#t ”½'M™6p—Ü z¤ ™“½Q˜=ЛÀÈuµWƒùBßf“¼<SÚç¨P"VŠ\Z/uY±+µ*wó¶ ¦‹.d¶­®Ü¤nc”wS§"Î÷®0>Ù·qt­ðÁ•›=0öŒ*\þ쳌͙^ª‹¥€m×ê÷cÓÌ2;6Ó®˜ÊÒ!ÆåºëYû@ÉÅ¥“®Ú¯Àír?G-é‹q1á@Ð¥.ì¶8mÓ±¿Ò«hï$ý@¨Ihüá2¼Üóöü»ïúWkõ[æ£?tDÅo³”¹ßŒé0Ä^™¦Á­€ÇvcbùˆüX5ü¦°kÍfN}Á™=YÄaÊ¢€Ñ‚ei&¥ÚâwæÆG²ê›ï¿š,/­OY:mW–.a3*ÈÒÉf ̓?¹iñ|S}ÒGàb®µÀJçróÃîQF{Ÿã½ß­ü¾Ñ@ÉxÝTØhÛÁ0Vóùè7äluJlªcí"Õ&=°j .\x|AùTòn„¦l+_ăµòAÙÀ2ž*Á§4ùå©WýÀB¯ Î ecag$kc8T…à«@£>Ùh¡ª¶.yëæÆS­|ô^Ê=/hRM^‘Í••}#}Æ¿cöY `ŸÃ/vѧá!OȾJÃOÑ‚¢#ÿCX[ýð[åis Ð& D5X¦ìEsúòÑ5ÔI{±*cQkäÏy9º$êN?z®†,¶ë/^-îb¨ â\àc/Çé·âãVW¾Ä]H‹ÌйDt_¢Aiëû:eöÁ ×S85-eÕ”| ¬•ãzS[³Þwrå„u§U!ÎÑ‹=I0WV5•ªp”ˆ ‚L¼u}ì&î|ζUÀ¶¾€€p·xÖšˆ|»».s—­Ý|Œ7@6çh›×Ô’{w¹gp¹ ‡ê³¯ÝlW~[„¨·šcòGŸ¶!fœï¹¢ª¦=C®kÅ`Ç5ãf\1/ƒÜÜÍH »Ø¬ÊËô3®׈­Öq[ð‹ðêYKÚÝ×Ùs†¯ØÔ·”ª3^ƒI…ãìŠ "Va•ª1Ú¬ÜösÈM×ÎÛA5pºa<@­¾ð~øúæ=\"íHê©é™½aÍð®ý„ÒwëpZ˜Y{ôlû²ÑŠ^ŸìZ´#wÉ2>¿ÑNc8"EÑЮ%µïs-~dqˆ 2üFûËÙÌ=@Ÿé'&Ï¿ÍpöàÍáájøtʇÁ_åq«ãxlÔJûh|¸ ›ë`‚éM9Šœ1~Ëæ­H”>Tﲫ~(å9¨S l½Li†›ÌâöH€já­UñÕâ\(WÀΑX¶‘¬ ´ šÛ/ ðí£šSÈÐ÷´U5>kiý2Ïä )†`yM)ÿÞK-KÛ©©T¶Ek‡×ºã+jC³1‘0UHMALÙ“˜$c8‹)8ia}«ªŠË¸’ZuBeíCµÔy œOtSù:à?, dˆó•-Œðk,r”¸»á';Üq3­Ã,©&¶o/ha:})Q¡”‘‡ »é ÊXº‡Ìƒ±kñ·Gë<âß îÚ Ü•ZN{åœ=lþe–Œ–hü=RQ{¨µ gçáK ÉÐºØ aTÂ÷b#¤·ÇߎnXÆÑ"OÅ/¸|)Ê ›U{î²âŸuöõ¤•í0Ø ¨ºÍN MǧïÆûά·ãm ˆ”ˆÁx3OL@ûj”DZeÜo#J´ðN{«¹<<í ˜‹?gA^Ùxí†æ¿ÑXÀPkj‚[há¸=ÖÂaTÝÄ£Ò~ Áj©À+ýÒ¢¿!kÇl5€u•µ8>†´ÂTs~ãí'Kmô€Mý.ñ‹$˜’»DBUt¦ïÇ:„v›[ðJ¸Ë„†ì›ì×vÑAA2Òð6Šz Æ{õEÓÒeUü¦•~\¸ø?aõ^yW3Y/O\±®RL¯SV9“Ëm$“œ‹nL¢–`N,›ºL¸ƒ½õ°I®Ä#Y!š›¥ËÃ=69;瘥6!#9à½!+IYHä$ÍB6cD§(C±ùX\Ïã"ê þÙúÝê)u#$EVÐþ9’žÏ™uW®b¡ŒÉ*]”ÅENщрà(–":–mÊ€òç>†þ=C;ä¡_À„üF[ ÁÃ^ä:7gPáâ4vœ}'¼odäh™^.ìq~v&6µöþRæx™h,§Ÿ4íÛh,¸tØe¢–gYyv½“þ ž¦>]f•óW®§EÕrÄÝ«ÌJÔç÷ów?îñmrYb8a¹2½m\Ø ER€_ÛpZ:ÅÖ¦ÕA{ÀÕV‚9³ÞÇ“DŠ D§à÷ôÎf±å¥|öÆ[˜RÌ%~ôOø¼¦ hT!¨»”“%ÊE§÷%Ï4e^Ø$7Ï·œÔŠY•±ˆïj@«ì4ã Å~£÷œÂÈêh¹ˆàL”S•ëÕú’B3f³ý*œŒpãgÁ2Úy†MrôªYÅÉ~RÕ±‚-4Že¡^Ÿn± øŒ…L0øOû%wZ Ì­ZÀáûþb«%Ke_…,dngñCYSãN­3˜ÀÌS0˜j‰˜ ™‘3D³Bï_mÊŒ/»4§;¸ÚÜ[1q—‹ $+4ŠD×› ùù¢~›f~hÚ‡w˜n=:¯:j6F_]tNb­¼]uã±í€ís[“É !%Wtâ´‘´ê)¨œ£˜ˆ«4½)X tåÐm‰.M1>úæS›]‰´ÉT;qûî{üàÞŒX¼ý€¢SZ¿Ê"¢•ÝœÅý2lÛnØü®=Fe*Ç”ô~÷΢©9ØcWmdœÔÙ]²x9`¸{8óÙ>>3 × ÑÀt¡ÇŽÄ*eÕ_³·oØ*¾×௞Þæd'½ ë# ý‹üNiØ~™µö윇òè Ëð"ÛP[ðx¤¯´Âì.€ñ]2M:ñª4ÖÝjÑ2•þR`á:‡âãul¾·ÖÁ|1¨J±àÔ1Ê÷PA¾;{Øl©×ƒ?Ö–ª"¸}>IS!mx¨&‹ùH©S¼NôÓ„ 4€R ²’vìë ¼¨ìPz§§åÇåt´Vb¨îkm^šÃ!”ò¬ó°Zú¬{à®]?o×¾T?N[J˜ÂÆq<£ s‹;´šðÿ‚ºóÏ÷Ù~^ÓÑþ‰»ÃÌòϸ;Ï ÿܽ Ú1û´cýŒÎóSˆÿ7:´ô ÿ€Ðq“—›Næ2â–9Éd²q,vÝWž˜bFFF:#·yõ~õ ¾?‚°#âká׈xÀ¯x>½’7®ÖÔ:¿7.nR´Ê;´ßÛ·È_ ²ü:µç·ŸüÞlªäTHrhvwïÞcùðòÖ7èÈÙoÅšeü2ŒžlC­‚Pdo¹s Ëðs@mÁé´ß7Ä}¥LÇÏΈ3¬lпž^û à™ ƒ›`>Ø—ð#TNÖàôÁomd^,‘ú6ƒÄËÕh²áq½¥%©V‚9_H-ÜêD ¦dF&ϼ–å¾€€â§ÝÒAIõ)ôÇK01f#˹ä&*%rèÞù7ZhäR0bsTs±Xé1øKµ\÷­má—Ì%Á¬Qx›oÝ‚Á:ØtñË•ùùÂB<:<׀ޙl¢•yÍñ³‚7:tt1Ë}_+"â""̇(ð¿.÷S–Ø#\"zˆxM4…pø¦!¤ö5>­ß ÿ"–.úú*O<+Kâ²ò½ ‰sìíŒ^@7Y”Rã«%¢¥²;Œ)ý7Ù²ßÓyÒÒ¹$æYKÝØ8îC§1Êì–––ö—ÊÜù9™2Ž·ÃQ›qšÃܧ¯¯ùb‡ùé¬[>Âc¥†ÀJ²Á˜C¬ÂÄõ2\Ëté[ôŬe¯^*nLú9j—î[§Zí]ÍÞ¥GÀ’áÁ#‘N®‰R‘Ž¢î’’5ŠI’¯ÒÞ€É{M°ãn¾[ÑvçÜpþñyUz|#G.\4åS†¯÷ùI¶ƒÛší·X0øQôí©‰"Øc$ ‚ócƒ؇Ô>‘× Ö^[s¬³{/è¸x™ÖÒTS Ö, ^{À»4ñF´h9¼ƒ!"{4ܰ 8F`LÙ!@&Â5%UæÊ•:º×ôôzXiÌ ZŽâ0ä¢ÐŸÀÉ7Ÿ¢i9<´ï.SŽKh$ƒÜhÅ©K~ÿ†®Ü_pûÊMÕ ½çU@§ÉØ«ž÷w£ ÊÒK™öŠ~7ÞS]säÐ4Щ[bd³r³ÔV’~ø[Ð^UÑŠñž­Ä«¹±î-yY^Âmˆ>3s‘j®ƒÀÎ-ßd6§cSìéx–óÞ9ŠéAÓ)ÄœP~y»w0ˆÕ¥´¶,Cs07l=×Íî"¼‚R{n™—*Þ®”S$í¤´1¹o‡SÈEjÿšJPL&ÔzÄ ‚Ã2ͷÉW]l£æ’àíç Óº`èá,ײò­º&0°uã*±mp¤uÏcøº×ÍÕ`kþa§„ßæËÌÔ”L…3‰r8Ëű7ð˜é< +™•SÔTg³"k²¹ð2öšÞl«Xx„†_Ð\Y[ß+¶Ã.$Ì±áæµzµ‡ú”SŸñ€ñ2PohM2QÀŒNèCêÚA]ì’èXŽ[ žß;r¬‘«„æj|ñ¾d5ÍTme»4!W¥´“?»§ŒÃ£®HÐð¿—¡ÁVËþ</=ð¬ÞÆ+NM—dW‘ª£Ò½ê.t©Ë?Yl§½oB‡+<‚ÿ͈F2%¨©S—ƒp»÷Áü4ø‘P%MÃG+7´Åõo+·¼|g?­Å¬ØŠö-Ýê`R³2ÑñÉȱ¶G3ÄÜ}˜ ¼Ê¢0àü°ÁRõ+•êÍ .„¹ÌÒ_¢÷*§"Ú&t׈­øËÄN_qгä-¸Bü`‹dÙ¶–­l£±-ÑÛÒ×(”™È7MþØa±cÚ×·×/bX/8‚„Šý:ž‹oê’Kt|¥="zCÜÉ1ðž„U£le¡åâæÇ‡¹5ÛRÄ8ÐêcåêŽ%"°‰47_G¸®ÆPÔ¥¡½0Dr²wÌŽng³?®}Í«º:k«’ZaLí5ˆ~(¤yß\š)µ4S`¨Ò‘.,%íƒpÈKŠ»5e ŒÈJj;e8\z5®²SN£#¶ ÞŠ”ùïÚ^¯uÌIm„rÓß’^+MÕº»ùÀ›R¡ qÏë|6`HiÿýÖ–E‰îv¡ÍîNåΰœ8±I݈n‹Œë¨™Kå·O4‚²¤(…Ú”&+_–õ—Ùãc¦«ëôeÌ{Ï‚û¢éR“ò%éêòzŠZ¸ÛØ x]r¨w>Ò}ì¼°‹éœŒ í.y_o©…;ÎÊ߯øB¸‰ gWͤë)Hš @ÈEFÙ‰ý‡¥I?ó©D`œ‚Ÿ,ž~Њ m¦éÖ¤7Ù½êrz¬éýeL‰ ‰I}T¡ª¬¤ D}¶ šŒ“ê_5ß:ë² äV^™`BéŠèžâÊž‚%äL÷FQ*z¿iW7ŠÊبf’$ö~|$ÿ¿½ÃÈ %Ϧ ¢ùê>ð=5)¨wé§)s†)IU©$1‰•½Š¼W[! A¡pbDt™ÔÅ¥Œ ~m„ ò~äÒ}Xkq©©q[gbMiç¥p&Âz¾­píƒ%NÃÇý]KÓ½Ëê$\Ÿ[ÄhyÇݧõ™Ëü\z K¦vQ°+âómÖýàÉÎÞ„4LHûÆ-ÃDR^ÈÄŠäx–ñ¢«3)DºYO›Ô…µqÚ¸°#ø äùÊ,&§‡ªÍ0÷?f¡}H9 ³Ùë~ãAÅ=âKÒÿiø»Ý"Àòõ°ÏùÖªr.#!µñòÈɶÖÉÈ%p(é©Gl½è¾)«ËåFÚ›’%¹2ìªþe,HШY4(—“W¡~B´`ÁpÐçÛ „Ÿ³·EÒ]‚£Øa¢Z'Š£áEð§ ¬@ޤQ/”ìê%*?õ÷.[JOîrå®L0Z³]——žËË5 æNÆ'&BM„†ÊffR«HeŒ;ÜØvp ›¸×ài•ˆ¼2+ð°IyÛÌ)™ZÚªâsuû8ÙýÆìÒíÈÃr×üª£wYYI1ß»-†æìã‚DTâx†\tí ¸*wmîšjñ74q ðØ›ÅÎëò9Qé"ŠI™/©õµ³»nÍ{!)¸E¢CCo{ ÆÛ¼u ÑÇÕq”œw\šÁ¿ÍŽpmœ²zâ‹S¿ŽzÇ5vèÏA]̶-±^ï8:B¯63¯N'{Åãóšß§ƒøÚ}c7OdX&Ü9ÜCg¤²üñÎ|yÄ=oA_ZÞ/hdA۪ت|<óŽóúx³³ìVLRß êþÀ"&›Ë”+ÅÏ©·ÖÂRH‚ϨxÄjV+‰×5‡ÕeãýÉD¶ÐF¾f#‹§«üÕœ–Û²>ýãœVCjÕŒôÂ+ð/6D-lgÇ7|do>€Ì„|3Xÿ2§ {¡¿ñhôEbF[MUõ¡W;±\íƒæuJ[xâ5äíÇí:4|k'‚1‘~Ÿ±’š,Rç±GÛÊâO퓳–¸@F6d šø öôMßÍúxk4Ø:ÏÊR×­ €/kcgú4VÛŒÖQ6Ña˜bgÍMJºp6Rš¯>uf¹ëHʨ^s0.^!Ö™O1ÖÁPizA$ÛÌäÅŽѦ›çTÌ-›‹ûæQ*F0ËÇx#„ãPº»ÓÄí2öY·ÃܾÏRêj^Ù#³¦=¢'p³zò„‡¿•NI؈3[ŸÁ/¿V&æ¬í¨»Þe"XfÔÓ‰ž#i$sIØáì°œsëp ˆvP•³Oéã“ô”p“(Åžð½éC4–É<ï Óäh†×Å t„ýv{xùƒµ­Þ»ØÏƒ9ZNÒµ#"‰ªá'âFç=;MªÁ¨‡ ­"¢«Bx÷Ì’ÉÞévÒ¥u»f8c¶kÇ-VN˜¦âŠÂùrþ¢ øu$ѼƷrƒŽ©úèür ¹…©ÕVÊGòÆÄÉÃ%| úë"i¥=xɾ"1¼œ“q’ts%Œ~o \£-†{ZDL© €‹t%j´EkÅÎUc¿7h7<ãªKL›’9r²v_7ƒÖÕ¿}c¢vÒÆk<ú°ßcg³`€†ç-%üý]Ê9í<[KLLmßn<Í$dB V="3A3u <Ž÷<ŸG»Çç 00."X¯šÙ²)¹¬—&á¾–üêx`H–¼ñ¾(<­³\)H©u# o* *FÕ›ðIpŠ/åpÛÙw•´. E Ï(µˆðúÃFS ´âÎöÉöGƯ¨Nº"$˜GWlG·WRQ1Èz‰-¡A?áQ+U%'U•xéyTíTGQÛĘ”ÑöÉšsY–:1Ì™%9äÉÔ$¦Àä(\~…ÍC¿XNPœO)M@ihÚd©ÙkHÈ¢ä ³q±¢]ä;[K8Üu¾R «p6›U:Iý&¾$wóHI‚nUe9†YºqÍ‹øù{Ý*õMÿ¶òÒͭ¸ÑÑæñwï²èGKˆø|jYÄÑ¡r¬$Èù„Å›x»;@Â{ËCð\q±oPÍ8¢¥tèßZùë‚¶¸a ‰2)$‰+L¢Äöö÷[”Y07P*L¬üáyî˜ÝdëqþÏ©(ÿ⹜?SQX˜èÿs©(tÿŽŠÂ÷;åçŽÌï;8ÿÀDÑý}òg~²¡É~òg¢òÅÄù?ŒAù/¡0²0²ü„¢ ©,7]ÃI»™š]­ØfœÅT®Z<É6O^==[„\:åK7¬Ç»É(ìHŒˆÈëíï"OüæU>¼EõÔ§ÒRùùæ ǯ5N¸K›‡ûÚË Ë —žQÑ­C³F¥MÓÓ-ʯÂ:““c>D×R²P¼£gö Hj×Ý”ÔÖÔc½™ß"†ûø \Žøb`cúšöm~ûêÊÉ«”Î9Ä´r*ŠRf"2V¯¥µ/+ÁJ‰Ôû‡Ë%šõ¦ûWYõtVn¼š¢²›JG\Û*³èI×·²tkÐ'›ï3jÚš++þ9¾gu ^ͼ]TI*æ+jìõx¼´h;}"•ÄÂU¶×/[ßjöïÈÉ\_‰‹©úrÎÌÜXmü}í{5ms¹Ë^ŸBñt#­Õ"ˆïG©F±=’%BMbßà~šc¨7¼”¼!4Ïàe~ˆàR~ÂòeAþ7ó!ü å~Ê<{„ŽoŠC;0Ö°u©ŽÙÞ7òì]¼± ®ï{%ñ:D„š6É9²/$€²í»*5€gø†ÒWHœiÕú;dè”{‚—I%®ÄMyHeø»Uvb£XSSFþü¨ñœ,'b«´’ìêvFùI'ßOO~xe$sœß@›`$çi-¬çÊÆwó¹ÎÔ~ îAÜÍÝyžÜ÷é_Ñcº3~·ZHZX ;ØHª4bHæ4ë*¬üšé²cLpô ô~@Lsʸ.SOñ}Ìá»·§ÀRüYÙz}[ȹ ªÃ¨í¤ðÈTEæÅ J*ßðYB@õÇúÌÕà¢Oy>ç.p‡}JÃã†@•ý‚c-Ùq‚ñ£tÎ* ñô ”YÍQMUÒ_õ‡%ÛøDõBÉEeD¯‹öhØ€Uñà ÞÌ”Éò'ŒÎ|ú¯²Øgz ®èÑh¸Iƒ:¨Z9²pˆÂõuÙ~(ýÚ…¢YˆÞ?”ò g2wK€¿koΡü˜ÿÍnãÜÕLJþ‘ˆßã­pɣЕýü½ÑèQ"õ8"âaLSQnéDòIº* ä“ÝÅESS@$¸ÎE{iÄÐÖ@ù.2õtwªšE ]!‡x?±WÅÓ•Qkª„‚:Lò•2‘¥J™ I¶u~9º™<ÿAyW˜M±î7PF¢Ìâ¹'㲂Ò"‰_HG.‰Ö3@g&/‘s÷xÛçÓû â c8>Îdèlü‰ŸŸ!CMkÍ—ÓÊqŽ@y‚/­­¶’ά€ôÇÒñ`Q59µœÏü3éÓ6\ºQiã€é'Ò&Ì<áµÛbU¨)úVx5¨êg ìÑ–òWÉû´Rç39Y!8/©R_£~3yÿÐHHÈ`P¼"Ëe @&¦à%r'SЩòâÆ­-„‡êŽ!Cø,{8=ö¿b›ç7ïYè¶õ$aÓú”ŒPí2ß¶rpqLsIå¦ÜÂa Ü£«4ìÏA˜ÓvØm©~³b:œÑµ’20ÌK}p÷ºüëh˜· ¬îɧ.MÝñ¨ý|µø¾A6 púC»÷X±ZM Vª+Ê’Gï×ÞÄÝen§+>xªÜ¸2ŠöP¯ë‡Ä­ 9}ÆÞ0aé=tD˜ °øÂÞ6Îã'?¬î–©›sròÏx °"£ò)"'/‘Õ‡¸Œëë™ m^÷m” øZ—Iª7ÆS÷.bpÇ]ÈZ]¿<àhýðU&Þ‡¥ûóy{¨æÔ°ÔìÀå‘Ô%ÝMîGõªVn£Xèðw[ÙøÞý…ošÄ¶¡213)3ä›É”>³E죈Qd®ba¡6)i6%[ô¯€ )lÌ/–ÿXsMði9/Úª}E×µ ðr¨á\sŠäù®xMlƒøù½ŠtÉpM‚ÒÖ„$Oõ@¡ð×Qq×’‘ÄD•/T¢WVqCHšÑ93€®nƒÏ4Š _ y1(ø Eq?M‚Ñè/Ýr©õùÉRkÒ床À·Ši²4ëWÖO ·×?Ç8I2OI°¥Âw³OW6öYG&YãŸ÷HS•¹¿}¿V¼¯¹yÞbǬݚ¦‚&\»JeIæþ!› šè+öHµˆÁ`íµS {E뎚è¡wQÙJ² üŒ.xi¸) +ûëKù× dªÛϬ“ÞGï·ò;˜î#5 ‰®?ÜOûÒ*¯»/ ß{*V—@VݾW ¤®ÍÿlŠ €½s:'9åþQ”8õêvòöUi¿po\ƒ*•¦H’ŒÕÔøá'èõ¯íJÃgLé\ÄÒ,ж9`Þ¤fõdþ^¹î¯¿]¹xä\]¼Nù¶±ÓCÛe‰–· o\íÿUF±üƒ¬,žIbqôX<º7g²ã]'YO¡ÎE—1†Ja­$nÝô¸ÒâÚJI>åMå’åzò–W]³a®;ï–*qèZ ËÆ–ó“îã¶}ŠOÄèó *uwʇ ÞÅ3‘)ìv±Ê,T|Äj”#Œûf`ɈZ­©Q¤Nî­PST%ÄS:>e·¸å¾39?Áh'Ûz5œÃh6@t•K»+ž‹Ò„šÒ¿jÔzÛX3¿QãHqúÏ\[މî þ}2ÚÄNµXšÚ { HÝ]ú° vþK¬2ú¤œjáIàl“˨(Ò L±(¶+„õOÚø’A[¥cox“††ÐתBÞ<òF+Ô^|<ÕÇz†F«}iÚc³@Ëà%È“$™@Å&5®åÐî,·“‰~e4‚-bZß:µ´{ho9×E×EÓ`F®“‹xðÃ3[]4RJÊ3o¿qe&Z„@ \c`î6ž£øMj¿Ý¡€qÔÎVcÛ•J5é…y»—=rÒÓ Fà%ܹÞÄ9£åôðµuÙ²ù|˜n‡¼Áõ˜¨ äT4PR¡` Þ( „u÷Ê{„½ öâ›ÈýYeò×®A_lúU|æ$8þÉm?cpöÖ[DÉãª*%'ŒkË*UÁê]lU<Q˯’Å”²Á¢ä.º‰K#òßé6ãk1mz"{È ¥K·X®8\“‚„‘¢ß”Må$XJé“WѨ±URH;Âw_UcÎbÜö„eÈ-¼9Ž™ïewŠ=}ä1Ø/øØ1™´¦?K|7€GÎüÌ*¹¿XcYUfŒçŒ¹[çx»Âb1îvF$újõím`Ãp-Sa§ƒïÐÙMš6fĄ̈îNJ·HUÔuçn6&Ë^q‡ÆcÌõׂqk ’Dv–Gk¸µ„±†žˆ<ÄÊO)†t¤ã‰»ôýÎMýX:Ÿõ ®W8 Ú¾*«šŽ$˜ø‹Icfi××Uõ¨ÖZ´ú·¿ä'‹™É;B~ðQJ²`Pž,ý0 žs}K¸]±À[ŽõËÖ0‹@íƒÔ{9 sõ;§•‹º£,„é–iõ4I¡ì¤C¾Àñ.Ó›¸Á ŠúÑ÷1'¾ÀMGvÂ÷ŽÇC¨‹Ô Y|ÊšÚÃ%ñ žviù«c‘«2ü"ÇßzfJÒ´A#êàù. ßNb/ú&€K™Ý*¸îx±? }«OR-Qö<í$KægÕ#&4ÇB""ÆgS NÝ#½ƒñŽrÇ1ÍPÌŒ7D‘¡c($г ¢G ¹VÉuÝ…÷\2”‘ß>Œ¬ì^æ ˆ\÷°4¢µje] ¥«·5AÇ…Vnì³ÉÖ* cH’›ãúl»L3*ÍM0x.¨ß½þÚNW4sË»Jh ¥p¹DÑârÛ"1Ц8uÖª­pÂ9T=9EÛ4£:~ÒB”ËÂÄ€¾&j¾öù+ÛÊEíï+JY½5› nC[7ýÕ ¿¥6ò~UPìPŽÑ$¢²(ÌØÊò`?˜ìÁÃsšqºhŽÌËŒCº¶Eø‘Ô~|S›ŠjØW 4ÙêVRܹ¤±9šÂ ϲz`Ì:µsbÄ“ò™gIäÝàŒùÍ ß>:·—›ø¤ªmÒµ8KLóë ªªo‡uJj lÉDè“ RôàXŸø*bà÷#W 2:°ÒFÙàD ßÎfóâ~Ø„õ³zðœŸÔ ·_{jZŽ„^G£ÌBÍD¸KÓ,/«P_|·¶‹ä‘ÊŒÕ×Ð̉ 1 ‚j ôšd”9[©T[x!Þÿ«7Ö»Õ|!Ço®?áatL: ÂäßìèñÍKÝó‘€KMk{Y_ @—¸½³Æ l™„-™…Á§I¾áxàm}¨kt‚‡\15’”ÙLð¾žå$®F¬‹½ˆiÿVÎ0àö5F–³ÕžYŸÊfçø^ug]ÚM7s˜‰h!‹T´¥I¹¤=6†lAC»VÊMY*ƒ,a.;Œ}áUeϬÎv[œ3«¯Ö(w˜hÒgëUDgeVš•%âK$ÌZÎq³ÎAU˜GG¯âбüi‚B1båðÏv+»ëÊ §þó;UÞãeXš(*h‰„(X}"SÔ ŽÚËJé7ž7]=”Q†¼Õ) “òWáÜEáŠþ¶ú,³Ôz`+Ì‘a’è¹Ë²%K*‚·\o…”l+OO+év¡UçwwççNvéËÓ½¤–4V ¤½B§¿“H?L«<”ÑâgïÖä<.ÜÉÆ‹Ò Á¢„¤]p)Æ4–J{ ¡KT˜Ô»-`ƒbŽãóör™ÃõAXŽ7à›êkÛíÅA5ŸçÜÞHF ­Çî“&ÉIÝ@¸†Ç+°JJËíŒj‹U,=Ä4³F?ܬ–Eñrq76|»NüÞ&p³Ö›Ž™/ûõ¶‰ëämù¶ðG\©ŠLØâ PKoÕo †{¨¤%‘»„çÁÌ1ªuèÓ&²"R+€+vLñ ²áñ§Ã&wÝKìB]S74§²ßÔXË׉| *±Çp½¢‰ö=i@IS1¢þ>?iH52ÚÙ©šËMé—dI7•zò>(¡ÍZS :ޤF¾¥¬[tõKê=‹˜*Å:Ô¼Ôín¡¬œ/]%¡pßð>A¼€º&©5¡Ú8­ Y?›ŒƒjmŒI7›X ,º/a‚E^A:2·¡•gó0Ê_=Ä#íá—ÍËdò'¡“c(p¸§•¦àük-¸=Í”š¥ýŽõ/Vgà?w¼æ¼#<ââ]Ѻt’¿Æ}zõý]à*³ŠÇHëœ%ÃÂÙl‡Hç×ïbÛ-wvœ×9Ãg•”Ë$—{Ê*9QVƒÙžƒ%]¸™»LU:0¾,&º²Ò Y]<,«hYA|®ºÃÀ?Z¹%œ¦ãÚ¢Á\0ºJýŸT|+°zÈ(•ÞJóî5NkEÝc²CÉI¶AJù÷çdƒÍ&ãs?ŸÙ$f ·N6ôÌ7ž…#6vÊ.áËåM îøªŽKúÁŠ.¼?Xêcà-åÕþ[¦X0­uò’òAPÜøè#ªºûáåsœ/ÏÓq°OoÀ„ÁLÈ*z/ذ;¤4Òœ€î¯d¾Ö•*ת/ ò`Ñ»¹÷/ÔNß­tÿ=X“…MlÔ+ñø5º2ô´zíœâùN8òC)­Œ·RÊ+æ.:î¶4)¦Ë ¸Kf àÚV—miE!¦º“/‰‡óí¨†\PuìtŠ1 „== HÍ»Ôiu^E§Ä™\Xì$" ©)ïzzbö0½àFûıt±áT›uèÛ²SÊMå Bjq¸;ºîƒ_3)ÏWâU0_ð.Ár·›H=ø6¸Ô æ( Æ—žI\KÏð.N6AŠº©ÓJ› ̈ºÜW~{Á¡n3´´ã½[ôžü«»»YŽXã@Ó-%1jmÌBÊdÜÙòI5ú5¿ŒÞ² 'žÎÉÖQTͪO˜õ…Àœ%ñ¸ö;§7Û•¬-Zê¼5íh’I>º,ÁRŽáðc~½Ÿ¬AT‚ í°o˜ésí>Gwk³A uM{øÁ-{ ì…ºŸÆ:ÌlÊ» ¿=ð¦UÐ?\d˜U(—†õÅiOë–«P¡tÇý€\kþjXôO<ÈÓþÐã¿ЃـŅU‡Ñ€•Ùà¿Ð㟕ê€ÿ›úú¯züCVÿÙ6þ Çÿ=þЃîô £gý+0ƒŽ†áÏ ‰ßäèÿÌ`fü=èhÿÆÀÈúwØÆßÊBKÇÈò7ˆ= óßÊÇBC÷wP#Ëßäh™ÿ.GóOâÒÿ-ŒáŸäKÏô×ôhéièÿVf:V–¿åË@Ãð7 +3ëÿ òA÷o  ôôL¬,´|tyÆ!Tl„BÑZÛ\ކN.(çE£¿Á×ôn $Ùq¾dÕ¹ÒóìföS¢*)~WÜöX r¼=utÌãÌ1²l½¹s i>Õkή՘ÑVÛ~tØ,7$‚¯žx³Ê¼Š˜åì ßÍgëû-}•ÓåíM8€T/òi™ÐÛŸ”§d oyÌ€Êé€-„«ï¼ù͵¶÷;ÕIhªà5q_à»eG4´Ÿ3¥+· ‘×ÿ{ï×Ô²<Ž‹(vÅ΢„„^ J¥I@P‘’HB EÄŽ‚XÁ.vÅzmØ;öÞ*‚½‚½òßÝsNrNï½ïÝ÷ý~ÿÏó½ËÙ:;;;»;;;;g¹¤ÂZÂ4g7]ۨ߻‘'fwuò;s*5Ê<9ÈçJ8¿ðc€ó5ýÕÛT.'žöX1zXîUÀ;Ùr¬kÚõ~ö\¶þ˜×ç6úÒèÊ‘‰5v]æß(›e»q3gð8ãEÇE nÛ •ßÝwϳoÑŽ-»¸ïµ´Ò»3€³É©¿xÒ ÑœÒ>m¤êWl½X0õPù³×é¿â2Œ‚.\L ¹ý¨z{3†Ç‡ÕeÇUTaLíê/¼ÿ~á­¢SÕîNçVùð'ì ›mì78ñJ»Óa×÷Ù츀1"Úûkþý~ç[÷Yøn…ÕÑ(‹³m&†uÞ§âʼnb<æM6êe3âd²M¨Í¡ÀG[.ص:ºÛÖ¬€/ïö58å)ðœg-([ûuªH^ðhßÙDEñxVDL¯ç ï…¥ïŠ^;,¸±Íë=+gåg%lžÌù4whï+žYr.•)N.¾ÛÛ÷L´þäþÏíºûÏèØÜedÒÍð¿ö)\zé៱ Ãuû–\wXŽë>k«·rFœ‹õ¯ŽÍ*ÝÎo¿ðâç¾Sí0›šøÎ¦qkšÜ0ØærãDÒ!ñˆgK;ZÎlÌYÞèCèË”i—:wñu0Àîp¬Ê² ÇÞ0äÝæ†o_÷°K#Û ˜2ËQoeůW ÜÔ^jî|óÖ¡ì‡'ú:%fõód~ØÈm¥¾ ¿ÇêÇæòݢogÕÌ9ؤòCÖ°-+Æôš˜ü¬¬gŸ¥“6^èÈ»çS¶f’ñ¨>áms×β˜o6D¯Cr¸¡xÇ•RN/G.û³týóGasç(¢¶ämàô+KTúæd¼¯^Óö…þÅŸÑ/¯zäþÙàGV“ò m¶_ݼ-}’ÊõBk³§+Þm¾cm÷4ïK÷”3O}k¸éW(gTÄ϶Ûoßûõ¤èÆ{õ¦¤6¹bî+ËžxlßÛÓ<ÓüèÜúNË¬í¾›=ó’ÚðþÁ­·f¬Oì+XhàùJo„àÝÇ»g+Æonü¸›ä6uwÄôþ‘·6ä\¿Xñbà[×ìðƒK; ù|òÉAËÑ;{¹m2q¿¾§]Ìbá” 9Wl®dÝ37*Ftâëð·ââ”/‚T·V{'9—fÏ}8);®ÕâÈ»å5íN\K]ÚëlÃjgä1f'§žûžqÐOþÔ½Ù›§S\Ž’íÿíôÉûw½Ìyù.îõ€àèࢂwW߬køÙá^Ô÷öröí y{ýet§Õ×aGÖdŒèt6°å´¢Œâ ‡Û48÷eÆtÏcN®÷í’•zeéÌ“•"—þcc»}\±(xͪ…6Â3ƒ¢BšZ´b¼~TÃÔ;锿Ü÷扪½öke3Ƈ4íñ¬ÁŒ¤w¯îO}×uZN‘¬ßÏ×¥GZYz¿µ l|¿ý®šÎñw7Œ¹²mÙ û—•žc ;Ý2Su(—=µ-™$i_²æVônù¦à’}ÙÕ‹K¢ÒôÖ}¿”dvþn´ÁA3éÇÞ­ì·[^½¾¯O¿qG›uÕaË ÁuµwŸŒðµ‹‚äÓ›Oé ­rálÝÙc_ŸÁjÅ#ùák>6e ±Š›ÙxbÌá³wMƒ ¦{É<4ÐÅlȵ–íâÒZÏr9|¾¥ä‚İxКŸ6¬›v³ñôƒJOäœï6#øDùÃÖ_¾¶æªG×ëÿHçNÿõÿùÿžÿOw¯@Þ°!ÿ²ÿOgGŠËAkÿOªÓÀº]ãá9¸_GG§Áb^.=#‚üþ /—vV¿q hõ[÷‰õ÷ýÿªÇKÜe"éñ¹LDNu=^â°¨® ÿ‚³Äÿio¨ÐµáˆßûÙ îîóò³Y›IþÜæ–¤º~7µþëþ5É¡úÖ„qgäßòŸ÷­ùçž5­þÿêWóŸð¤Yß"Œ; q´ž?Y휩Ž4mmþ¢'M«ú^˜8ÙüGš"Žœ£à¨þyÿ—ÎVT?âYÓxêî'/Þ¾ñÆT|xžÇâÓAíW¦ta:°ZÙ×sþy‡7 E¼]ó¢nÜuäcþæ2ÉMå—»ÍV÷}½¯ãYiãSïvo#úf3;gê±IÇÙ´çOûö®ÿ—±—ìO|‰©Îúòäûwîèƒü|S3c¿ü{÷â¬$¯3»ö0_UÖ+}éæ×§S¿,)Ul*7\æÀÖreþ½eÃÏþìpí`³]íJ™_'ßéµ;r„ÃÄ_;%¡÷ÜQ+Ç·‘†õ˜3¸aAYåÕ•ÖúV »h­,ÿÇ…¾ÿèY•îÕ¦}Ѫ.œôÃ[ŽíWEÆnä¾_Q>öæÓ·L[_ar5y#8åa“1öÑÉAÃÒš†MyY°ãmÊÍüÛŠŸŽË_úòÝÌã˜y¶i7áÅG%AúgœJßGí3V¾nýo÷öcé-MÏ~?ýêU8sá·yÆ~½]<ϼbͬòDf¾´¦ñiž2/1bH5Ϭóe¹r¼à󻘦ëN_+}þüà´RAÕ°Q’¹×¼K8àrš+¯úèÖ?âG=?®¢ê”UÈízóg¶í3Ê(ºÓœf5–nÚåùºêÑÄ£gÇvðëe(¯’wd‰²1·Ìzâõ>¥‘°[óɇƒ³{Î=8c-w`Q³£¡O<]µæöÎÆðƒ+fÄÍ¿ÛèÊøK—¾š° Ú²J}¤õÑ£»v»Øü8{»úÞçu‹{tlqÀ`nNÉÒÓÎv]²Æ7 0µž3ÔK–5-zÐÈkååÙ1Õ©³Ä?—œ iè—Ò{séÀ¨›òÀ’o×XÜÙäÚJÞòChǬ'ï~Ý›ûábbølXû‹Š¡®…“ž|÷dò±°Ò ×ãä‹ûª/üxTòògtÐŬ}vÊU[Ù/Ïî™÷õuÅã½Ëf)’}½d¾ S]mPÑÐüð´ÑN.½"fͺÀ==f÷„QMÛçï3b™×ÞA{·zwdhðËÌ/³&-L›¹´!cл^÷&§Ý²ñ`úV«÷/=÷Õ4~©ç«gòøÌù%U—˜0â¶ Vœv»ä©fyøÕG?qËåÄõ×\Ùç¹{':pÓýž²¶¬á(þ4Ë̽6´ü\ñLÇé'c« z?21nëþàSÁòvÿ†ÿ£º%0ÍK9Òû‘“¹9P^Ê9üq~¤y<'üKæ’´^‘hå~ÿP½£½ƒÓy÷Ÿñ›ädoOó›¤É‹ßçf¯ óê­ì°.°ûî;]vÝX£v_¿§‚±gk³æƒNê=¾GóAÕñ½6é»·ókp{Žý„Ãæï{»s±mx¼Ô7³¤BUtõ×”¯{?ï­¡ÄöbÖeu¿Ó§¿^<4úí烾§ää¶oÞjŠíãåNáÌáLs…2CYÊ‚ÛíìÞÛÀûGÖ}¿å†ïž4|›û³ø9ÿûQCÛ˜7ví––¿ðívÄŽ[[U·«O…+Ÿ´=˱žÙ¼×¶ïs³Ž7Œí•2Îɯ»q§¶SrK½LÛúMj6ÇäøXç¶^|G{lÂvµí›ëºmê-÷Á£lê“ÚÞ¨]fÎný^Ö¹ z…殟ÔÚzú-¯S¶iŸû™5-«w›`§)NÛ`U¥+;Yb•rÂëìñfÑîÑ–Ñ33>ûé?_áÀóaž)üS}ætï‚'ñ2Ç›®Çº•¹}̾hl”wqíÕ¸ ýv¯ŸÛÅ}+z.¶}÷ãÕþŽÇË"*òF×ä-kèfRuXÏñ³•‘«“I·(U‡»­ŽIüŽ^ûæŸaªÞÑ÷WÉ„®c»ô{aüyañȶ[‡ìrºpóã·#vÑOOÜi<«‰"¬kÊP}ÓKO_šví7cCLÏŸíFÞǦÏo­Ôwê¼ÌµpKyÒ—N…çÅw¢T‹m?„¶™uñ(û»ÝæölÇIŸð).¿gòšmWè…X{åÑókl›Ë›64ZkéÛPé­VÏ-¾~·ùºÍßvxz¬îõ±jÃQêã¨+ñ•ÜK8?oá,ïňXµûáÉâ/Ž‹âŽ~ï·§§ÂmÊ=woYì~«m–§w÷©;.zD£,~ã[«m†™ ˆØ/fÍ922ÌãÅÑ9M–%˜E2Þ^beüˆè_Ø¿_¼ÿ«Ù3ß¿ŠŸ4-î‘Ù⾇kÊÝ3?T79Z9¢ÏÁ™ê» ZßqJ–»Eµzª\±0wÍåi½ßn°èý‹~žý FwcÌû9§yÖÎò6ßXΞòúÁ|¥Þ¡Ï¿S—wfw¿¥‘â;Á·ÓUÓ.²Ç£3,]ÆÌsï¾£¬uàdçÒæƒuU²M_ÙG4òœ~8{L_׳‹:ø[uÎz=åIÁ¾ó/ŽÎ¼yP1Û(¼Ã—ËB¬LÊ,~5÷;¯tð˜y_/¶º Þ³ÐÕx\Þ³Ÿ™¡63+ý®™•†nmôêy~ËAì ='8v˜¶ï«ma?»å9FmÒ½ýG,63 [ý~Nݗë}}†aó*û“ ²=.{ìèì½¼¹SëóÙƒåJx³Ò'NTù4;VrîkÓµÇÍ÷Œkqqy̨eÖŸ'ýrkÒ¤òv…tn³Yß?ò6ü’úpÐqý¶ñ¯ƒÛÞ7 ž½Áó¥ý†>·y/ªxµ­{¥OÑâ¦Ã? KœX<ûüô¼À^Ï"N±’üIx»+Gœ;tÿnêcy£›Îíï?:ÒøKb᜶VíÎOv3õÍaŸIwØuÎäŠk ­ô¯*[½0['~s5ÐÀ¾¤5‡){ÙÎnÊí]ãìcöþ8VyjuÅÉí© ÍCÅ\‘rËôŒ²ÓGöîžz×îÑ ^Ÿì'†;òlžôºÝbÕ+éfw•€s&ËXÜ`ç Á/Ûõ¨Ž¿ÄÚàÝïŒÁ²øwsb£ŽF5jòX´{çÈΛ]X>¶e [•œ~/ð°ÚxÃÕ‰cµêᬼVÖ¯MXÜá^`«Ý-Uaá#çÚO˜üÁez·²7ó–Úú÷8y¬øÈÉIÁ—ßlß²zˆ8§Çª¡Iw»ûwä»M;†U¼râÕO,§ï™ì­ÜŠÊïYlgÚãÕdêø "–†.ÏÓy}FIbêßfÃÒùWòõB×í¹6íTòÉ‹NuZ½âº4Z½ª4´‰Årˆð;CäÑeŒuc÷gT´níÝ(ï{öÝaWï-/x‘”òÑÎq£²°a|Ðô£¼¿6lÒº|fÏ í?Ì_hõ»‡=ѰZUyabØ7«Q^oºæ”¤íÞòZ²eÀ“Ð ÛÇ]´ï`Dó‹%ǯÉKMÉiĊ͹n¡ÞÁþVp¦ßÆ_ýJýüŽ5Yûs×BÅ C›jézOIËU!ÌÐc~WÒuû:Äç¾ù‘YÙųžÏ4 ?âídó`ß©åS£6þjؤxyWñì}ïú…·YœÆ‘Ÿc?~Ð*í‹[gÃÝCH‹Ôãf8lØ3nBÿ画$Üiã½"ÕÆÙÙ×R/¬p» ²ù²U#:OYÉ0¸ n|êóÅ)?S÷¿9j$H±ü‚ø`¸{ÕUiXÌ×ñsÇ?)ØÃv¹d±åjë™=ž®¼úëTŽãÏa>nû·Úÿ\žñkH§ 7™}½[µ*ȭȹºÒàÙÈš2Î-Ý;ü2kL·‡—W6-éöe⾑ygE ;NØèú$ÕB‘p½w¼™]—¦†·…åÌʪÄ'GæN«Ñ{/¾=6)6Îs¿¬[a³’òᦠšž{Ô?æøîgGn·Yr°ñ—§‰}_{DzÙŸÑ9ÃäÍ“w‡ôÊçâÍ7X»tDH؈8½Ng.ÇöïýðоAúÞóXéŸëûX¿ËàõÎþØ¢;®3¾ŸY^ñcí„ï|¾:?ÔKV—ýŒÜzy|_Õ°©QÓß[Ù¯]óyàØÇ !é)…æ Y´óñ‘;Ä}+µ«•ì‹/- ¨NÊõoÝaÀЋç Ûn>ç¶ó¾…JÝGøëÃîKº··ÿxè ¿lÛK½úKo|xå×ö¢Ÿß{ËïοëvÈüÝ×ïCγ>Ù~”›}~û>êCÑÈÀoÚ–&õž>3YÝzè¨†í²§ŸXÒçD‹.¢SJS;v3j»¾õàŽI±ë7þxÞXv©ÑÓv.o)‘?iødîÍýõ®ËÍo ­xi}#zFŠÕ˜ù)­8ãÞï!ZÔìYóö}¤ýK£|«:ýš;¬"…‘l²ª辰œkrãbéÝVéÛ+OæõøôÞóè’Êå×GŒéÁ³峯pl›¿f4-ÍÞ;2˜º³xļñÆYGW(cÒ ndÆU]ÝÊ9-¯rˆ0 zf:mÖñoÛ”;Ê6fgm±éÆðë_nUÙTϾ1ÛÀmÅ¥ÞíJânŒZѹ˽ÂV=–ûTøýt[c¾.¡å _ùSÉžíÓËvSÝÛæm×FÏ?ë‚YÆþ]Åz:DxôÀlJè¨üý&Ý›Uåm:íÉŠŒàùîËdv:`éu]ÎMžPð2óâÄ!¼ÄS‡Jž ÙÞ°ïÛÎUo¶<|þÝÅ[¦Vž7®˜vµ<Ñaê¤÷—GwÎÍ{>z´÷á‚ oWšxdÙäO`ôl·-­Õ£¹™c&û œš¸ºMž[ô«gç;“Kn'IKWíl¨âŸØÞuâºËXè!V×í«[vxÁPw°ˆ{s9ðÓ¢ R}Η­™|¶è 3qbƒÒPÛ•Kö¦¾úäîרF-ÇÙ®à(þr$ iû|¯Ñùc¯ôìm93³Eà°ýÊŒØä©}ŸK0íœ?¶°«a9¶+:¥oÁ£ÏonôY{²é«š~úAS—¶®99¿YÓ']›ìo™ØòŒâÒ£Ö]G¾´ßù¸Á½¦j^ÌLãÔ¬ØýP4l㬚„ŠgÒo¡Êè+Už]òÌL¨v29¼[ö5‡â+?„xþÈìÛ!÷ä ³ ’Ñ> -ßã¸lÔüé?ö8¦íOØÖëPÏ‚«ƒÜZüTe%L=vAƒ]+g(B„f'žŒÞñªÆöiŸ¤ —\kó4{“sDŸù?c/lÛ(s´©„ÑÔ¤óæ§3&íMh2ÔnH‡V®?6ÛïI~ïóŸÜäM=·U6etZÞlÁó5»FWtêı¼H>íùŨJC¯µCÁ­C#>O8™±jü9e×Ès¥¡#"fœ¿˜Vvù}Úã¼üâìç{ýK¸%ÞQع<ôÁb¹Ù¢“¡5z; 3^ p, ˆ ~a¶ÁâG©QiBž±}º{ÇÓcgø¾»›¢ óÍ?å¤É›©q«r2ʯöIû²´¦K§ÃþÅ_å·;^±è•w%o'#)ïzQ’E{þm“P‹ÎcjÔÝ.¸~l/õ€tÇÇ›úLúÖÌhú½o×}š0`Ô°ë 3—å¯Ìí­ô^Ó#lÂ"›µŸ’¤»çÙŸhñëƒeᯌʂ¯=ìjª|K†²åj|Æ~.;2&㨙ûÚ=AîùoëÝ,qd“ÄïônÎÙ¸QÍ6wÒý5†&¯Ú]?sõ˜|ËeÃ~=ŸG>¾]¾:o¢|î;ó÷¾8ºsÓ°_s³ÇÌx±§¡Û;¹oê+3F~t®ép3Õl¯­¤ž|FLüÕðË»1‚â1Çæm·©ŽN™Îh4ei~Lîûg×õª²,¾sÞó¶û³ž¯RûëqÌÒ§ØŽ+~°®«ïä÷ãìǦï7ûÕìÙš[.- ØÎ‹èüè¤ 'zö’†'ÞunÏ»ðe²—ÍýU톷õÓËØ×®t°]¬ò)–?y¥ ¯ ‹yß,P}½ì„bbÇ[‘g?¸vÉ8¸nàK—ÆçW]ŒTœî—Z¶õF«ˆGAÏNÚ±ñUiç—++ öˆ_÷=»¯¿[bÄ‚ Þ½Ý^5ÜeeɵÈ—PÞá®.7"7žœ®ŸÐõ¢å<ãNßõ§¯º=¸õº¥ûÎe%ÕŒl³~N깢°Ûc» “ʶq}ýijû[Çj„ …æýÇ÷X43ï·(kܯ¥Ý—0nÚðÊ]8?Šû—ÜØ>³_¼¤¨ñÀKkÊ·ˆ™¶ÿè¶dêQ‚Ò78·Þ•®®4:l†é“c¼–û7ø:aî›Ö¤.Å×Ûet}`O'Ke|&Ó±º¦ùòþ㊓eÃ6;_ØsoÙÇÐCç5ªòJN°Ì*)¾~ùjÍ«ýî~zÏZ<›žò*ï”ïà’A›‡V\Ù·¬‹Z13¹É½/5Awšå×½ïb“ïú%ô++ßdߺóˆågB%ëv8Nh?ÇõØÜ¥kØÏ·]·Ã[?߸`ÙÁ†ï4^töåËᙇøªOuëÿ*I²yï¥y½ä9#=7í:ǹ¿~ç©QJ—¹öÏÇåŸy¼>÷Ó„r›ò…¡™’e[>:?dþ‰gë'†fL¸¶°ìź?F*‹3ûöÝ?Ü|àm÷yì݃íßÔ¼rð£É›n\8Q°SžÝÊ=ˆï?býÚ•÷¶„]Ÿ<+µçÎŽ;l¸^žôzÎpÏóG›+: šÞbÓ[¬ß½ß;<:Ø•qé®ü¨…۱ΠÙ½øž›vò²ÊûpÍð‹Ïü-9¸#$rÓÉ€^s_]p¹^‘ºdßÞvÕ÷Û-šÏlÇôg¿Õäx÷©_:äŸ8»sÝœ3ºL_}**JxüqÒ;V~͆-;„ì^è1XèùèV¯¡ÓE¯¾´1J0O5}Èàïùqßb̵ø„¾%o 5Z:ø³pŠÇ &˨í»%'ƒ‹ZÎ>nEÔá™6o~7$pMÑ€9ºu>3$iOÏj§ø“[dÆN·Ëif߯_1csEúCö§~gŸùÍ6}tký¤âøýÁ­ rGÍ(îԣɽ +oÓq70z¾ ¹`q¨*{íÜR:Õ| ,šúfïåËéz!Ž™Rß¶É›¿–ñþÔÿ;ïƒòÌ~ML•dU^·üKά€Œ@ßí®Yn:ç_ì`ôË¢j¦Ü`uÊwG™ßmÎëvqû«G _šõK”y¾¼>îi/ÃûC;¤‹Êz÷_Djð¹ßäâžG¸{Rr²_Í-|üñÛåf ¬N$šOØz¹²zXÍÓ¸û7ÞfìM˜wóžåƒ™ecí?µTd„Ž~ÿøÖð-›ôWvLï0æcã¥}ïöê¶âÖáÄe-›ðîÆœŽŠN¶ÉÈÌ|5÷|§´{ïUr¯?|íÙ¦Æà{áÀ±ÿº#°z.©ŽÀœmm0'§ºÑ}»;9ý5G`¶Ï®ÉŒ@zÌX𵋫1ã$©bNœL­àÄëzÿ¢8þ’HÅÉåîå ùöú‹~½þ3^½lmmh^½âU¼›óz<»?HyØ+Í­œÒÎà±k›V–NÇ "7¹'ŸÉÛÝûö•ÁÅ¢ÓÛ“½)©˜h]Ò¿¹ÞÕü‡³–öâèûß(|™öC¸9 îü"{ÙôÕkz?Ÿ—uáþƒ_æŽ?_8Þºó´½Gü×§ ÝØ°ÉzkÉæ·gMƒ›~¼Óò…ºÏIMõÒâñ{¬ÒâÞ&æ(+ç´Xþ¡ãžx·"«T¯¢7VŠúôfÆeþáÔ¹ó·Ogæ¾ýu‘óòææ»;÷À÷ÀèŠíùí®˜wÙHQÚøùúÉífù¡BåöE3{´ù’þ5£É‰Þ•«‹~=0é<¹äI`›ƒ¶eiOÞlzU˜µ7Ãúë¶1M|û;w2\6«ó‚ ó»î[ù2ùõþC|ÿ±ûW‰A·‡Œï1·Ú½â3úÞ ³E‹ÃóbÏnÅ’œ;MëqÜckÚÖ‹–ß›·8™»qkós†Ã§¿>š*ÌÜZrËí÷•0©Ñ®¶ï¹isÿ–Ŧ.‹§¯‰}oåøªc’ë®Ê“ý¶fwî6|’µU«¥Ñ¥—%¥q±)·h7YÝÔÙ“;1¶ÈFvážÕû–‰}—\ŸÁ9<<'븰Ús»êƦ¡ÖÅnË^÷ßá€sðÓž…™i÷ï¾—îM¹·¨liIlá[çþ£Æ<ùQÞd±asÃÎ>X8=ý5ù»àsûž‹¹Õý¢Óì¼”¸b"·Ù‹²>ãÛO6‘9u)èÕêSÛ’{ùN3T×,ƒzΘèÿy•8T°zÑâÖ&ݽDÑÞ‰Ù¯$TÌ<<Ô"ád³!CV/¶· …M‹—÷b`•ì™ÁžÎM”—|'=)Y¹rgoÕÊÍN9]rÃßçLêÕ8JO¹%ënXÚÃêÅQ&=‹~9Yþþdáñu!©mÏ ?:µÂ®u½ÙÑ¢iëZ95t;Ì*å¤ßd¥$6Xä¾2á”÷–#~§¾%WžÝx`¢¿‡–èÝlÝØyÕ÷ ÁkG·Æ &Õ4ößóáJä›míÌí?\µ­¯Ð´cÑWÓÝß´îs¡¸´§ƒÉ@±g¸ÁÁ}w&Hóå=Êg=°6Úí™þÓ ⮑ÿÚüö¾þÔ3ŒúÏÙ7qonþCͳLo.àŒí¨öü±Þ«á¤S•¿^©`Fî,¾Ëþ4mÚ²û“ãªú½4-çµkë&Ÿv®Ý;ÿÛ¾ùUO[0¦´Œ»n|+ϳÝë?ýÑ·äÁxþáÏ’™Ù¯¾¶´uéå8¯_¿´ÏÞ¹Ia5ËÎÈÍÝpfËÕÒíw-Ÿ‘IAU=ºßjÞ¦é¥W·º3µ˜%mP9X’ÑìÁô vO¶´:\ívb gÁµ‹ï妳F$m˜/Ÿxñ™Û»T›žAVÓó–ñöº~ßë~ wŒÍ¾IOÝœ·}ù¬@ÎÂYÉf¾_íR"*9è=èèÍ_Ëz¿5¶{{V|7ÌÎ͵Çq‡’=¡Êe“$r³ª¹E£ªôzäôÝRà²~úÇ7ñ[<—íÏ{~ôþøÝ·{¿SÏkÑiãÀðú•. ­ï&ŸkX9ïð¥%î=|ͨä»Ý_±¤IèžÁ§'l-ËÍâlÏðØqcòb‹¦=JLfZõ]rsÿò•IRó”QnS¾¾YøêB#îèIeÂr»ºÛ¦-/ɨ ½[¥þØÏñÛhÕ“T«¬['0œ‰Léà—áÆ®÷—dÛd‡úoY¶ñÆÆÓÊgý®·üvæùÁÉÛ‚–_TÐËâŒÞ½ôÁï Ü^Õ,‘§œŸ){n¼¾¬}À@Õä?Žš¨Åqs&]¼üÍãÑ(Iv÷I~Œh1oÍÓÕ~<½ ‹½‰³Z/[.ŽóF™ÌÌv|Oð9óûÆE‹3<=-dG—»U¼Ú¶ôÊ Ï˜E9†lã~‡³T~tòÿÚ~_³]S׎Zds¡²=ã¦êC+JÍïڗIJv–ž^nól‰ñÁæoMwžuw›µñqïêŽë&w˜×·ï ¾îΆ×"ËF]™qÔËkÙ¦QF‹ Þ,'—5Ñ+8EË%#bC^ºw±ºýªDÞ«ûÓ÷Ílw>÷ß׺¦•rJ+ã}:51ml,.²ö8S™4áv¶IƒÝ ¯ \ÕÇÅoNÎ3Ëõ³œ[/ªü*n’8˜ßd“Ŷu–‡6Ù9D¹{¼[â–œu‹«—Úÿl¶Ö¸Ô¬‘OÌæu E ½Ž|Õ;ý*Åe®¾<ðpd´ºaõÃ-…‹ÜK.ûOYžWÁ9Ô!}á#»=üÑŒˆÑþž3\ÞµN]¹¡žÍðÁÎ禬hÜ™·sjWŨ•=~‹Úir”swöÍK!/7Ù&LëÚž?b³u£ö·ï N{¤RÞq¿¯×ð_«·:¹°YÁ…g\}ö¾ÛŒ}ýB\S§?´°¾Qiž:þÎÔ7nßÚ {?Ç 4|{”¤È©ÄÉpVî„ͽŽ¿ÝãÍÄ⦧æwý¼t‰Þ]Ã#ÇRû5© _ÓrU¶Õ´÷.¨ív‡«ö¦îˆöÚ±Þr Ö4T7u ™å¬ÊŽr¯Þ;{1Øûìä²!7ŠÖðRÂvŒ7÷ÿ¾bÙåáÝ'™,»¹÷QºYDãùwrí^Ž3/¿Q½ìpĘÑM×5é²ÜÔyóÒy‡[¼`p"¾½ÕÛá}¢ì¿ö¾&¯íC£|ùÕ©C=V$6è3 Õ‚¼Ø/¼p¯3Ç«8½ž6)Ô{0éýîŸ;~ ›Þ“#Š«I¸9hU¿CónÎÝÝì³­­âPð³Ùûú,Íóú¾þA!{ßøUlñ«_»ÏÝ ,œ`´Í¦ÊsÐJÛ6û'ÝË“]ïøÒžËœ;ðÙ›»I3 ®~+pp±*…%?r·`rZøì­^«,Âß=pÿ#gœøÌ™ü†+G¾*êÕcÉÒHëËa¡–¶†Ý%NŸ›>ø~»èŽ­½,ÈZnå=gábNÑ÷C9q+òÆ»7?µéÇs¯z¦ù°¯1ü²£gIâ˭ú~ˆ2<úfð¦!>&}v6Þ,ö}3ð£qe×C¬êiö~þ§[¢ªNc†Îpþ£hk+ùâ‘=>¦M—Nm~vPÎã)¾úŸÆgÆöj°¶óó»E/{X&Gøí{þûþò.Ç ¸î?žŸá1gØ©üüžGšÕl8n~õòù_­VŒñ }V±2zýÄ[#Û\ßPƒ­ÜØ.`úvó”È 2q`öÕÉ_/KëÊœû"óê«”-GS8øbýâz'Ÿ÷¶ |ß/ø`3|åà íôé0Ü÷˵ÀaþÆ-Ú?þ>Â#ùÆ<=[,óìãm£wÌËyé·»çš5s#§G&ès:¨gÃùäì»ÿËw}O³(·}·lïÑkîYÆ{›Jɸ­~5<ØpèÚ“FKû«M'½XoõG£vÜ–#¹â|¥yAw[7tW%ÞY3ÁÍ{Ê7ý-奻+ÿXØc=wJ¢§»“SX›ù*S‡2Ã/³rÒd&Ì¥3ùãoa­¹“ßnÿ#xߨÍã—»ÇÜp0ìRïVEÙzþ‹>í9\ÍüÑ=9Kí1Ì`‹ù*èÀ—ñYÁaW׎YñÜ׿Kß©ííû/«Ür)9ªdû½:pƒkùªùC4jw²ô¸]sΑnÓߥÚ–}YaÈ0²ßmµ¾¢Ã”²CsO5‰ÍZjvòœÿîÕÝlì5åm×CE{îžüÚeèތС}GG_³U·mNšw;w·Ë¢”îÇ zÍ\¹´ú=;§/·¼iõðÛŠ#=FgWt¿&ž;Ñüá«WR‡Ïs\®¹\jtëîb×á¯Ê¶L¿žçê·zÁ¨¹ekÒWö38eäÒ[_ïîŒ^7¾¾QþMñ=—7ÚäGnÖš5™«KÖ[íœúÔoGO=ßÓ˜û£òàX÷i s÷Ó.ŸYõº¶ðpý³÷Ìꯅ“fço{šõC¸Ý{nâüæsÝü íά,Ú¿îÈòëWï´Z˜·ê+ï´ÊdãÔFUC_yÛvkCÑ–ˆvM’¯ÿ×ïê‚­y3›ï”Ͷñ^6ÇïREߟ¼9¥-LWÄï=ý¸Uj¡ÛÅüÙ±‚.ÍFÙ-íßhLcÏüûÓnìÑ{[nW9ì}UUì ÙŸVÍoä7{ôþü¦éÝÊšøH²è³Ø/bÚî;1¡[Õz¿]ö—ŽtÓ3ŒšÝqi·‚Y] g¯‹òß3i­?¦ü×ǼϬN™£‡j~æõ·U+ï©ÛûÍyvyQ̼Ÿ1ÙŠ,›Ý›üÜl ×º´§?ÏÉïÉ?¶° ñöóÛ·'ìØW8o×¾}7n¼Úg×õÖÓã\ç †Ó¹¬ÿئ¥‡8ŸÒç3}ˆ{ú¨çñüS¢ì¥ŠS»‚žKæVU=©Xjmx—>,v {ËæMO™ø0 &óä‰'æš¶+¸g8æË*õ²¨qÒòI zo!oÝÊ®•WÞHš\ïݪIkðƒ)‡XÌCYÕ'#Žìnó´çØÓkäãXÝÊüY3ÆÃq w¯Íª3ËzVÅ{1ß½©Ýå þ‚‰¯…³n=Á{ò¾1÷ÍõN7z5½=®où×ì£rwmïúnÔ©uLž4£_ÿð©‰N;îM̬jç¼qÉ´-}y‡Äž|¿ÃzÔúð«g³Ç4þ౬kب¹ç$Î{9w€w§ŽfkŒnP\1ø[ßsCw0&ˇ-.oèT¼÷EÑ¢y¬/oÙ6¯¾©y~Nï劊û^¹ì ECºc•EûfùÎ÷J\±Äs/3¿ÿÜA e‰9yg¾n¸£ÁÏSîÝ¿߉ [{Y™7rn«˜&ç½g¯}~ŽÅ–XxXìšå½®[‰÷ùðks†_Ù7ðêЛ¢õX6¼jR²ñá‘õì=Öv”ÛÞ³Ú¹P|òÐä¹ó:·j†uâWç¼¼DÖ…MWx”gw.ÍkuÜ £Oe³öt_>´å«¬§w×4šè,<Ý1¼ð¼ccî󊡻ŭ¿}ȹqþæðÍ»?ÞÛ°ñ²ý­ŒîöGã_™Iš÷.­9h9mô‰WžûoU¬½Û5Ó×­¦è»cƒx½=V¿æŽ>¾ô̺¯g1œù_ìY»’d·ËZÍß»ÝÛÁW†¶KmzàƒK‡--zJÄ?ÞwëüΠx:#ŽUæþ¹yòr+ÎÊ9mXdê÷\aè²s¾_zëQíŽuÍkþª÷ìW–yZç4ònø1Èà±Ë*ÚsW9ÞÙðø´úÀ‰ãŠìF³Ôá× <{ý±xö÷É;sÎF\’mQ1jTS¿fzõ÷–m•¥-=Ðts~|»ï3™qbVU¿‘/«3ûü±kÚÓ¶ØŽãjT‘EP§ãFÓž^Í×˱óÏc¯¦tÚetíž¼Œ×tá´ý³NOj1F¸6.®ÏZû¸]»íw쌷[S=‚±óaËc/¸Ù†w}ó‚—ruufûUåÎ;¸ñíG¬ic2-¸yó©žÇUëãTÆ »uŽ/’nˆåZ†Vñ^òžè4s’uby·ë-v¹)ù7~8u0|¼3ExmìQ¡ÕsfaÕ´þ Þ?ŸÐûò€%ÍwÝ©úc9`iïÐCmJ]v¤YæI“2'æ:üØùx¥È»|ÝOFé]»«¶UžÆêM?±ºñ;õ®ã0^÷+òÁÖ­vxðvÌ‹±Í—ÊÇþ|xyñ‘ξ§ýWVz<Öñéñþû]ß4¬~™7~ñ®îÑÅ®Ñk= ³/>ÌË\g´yß±‹ËŽ—­2ë¹yBðíˆ%û>óIå·¹xÐhÇØ)ØÅkm.®šbÏëõº×£{ÇWîo½ÌΠðÑÌVvÑMwY ÷º´tø|~Û×Ë%5„o¿FªÞ¿Õ¥ß+çñó±Ïœúy-ú¨³õ˜íM±ëî%ýÝç,Xx$8°cÎ'QIá—òêÅצ¥¥WWÝðÍãŽYšpµd#çèå×ëÜs+Û¡}ÏCý',æ?Lxèú0DoÙþ_mÛ¿Ô SÏ×ÿ<˜¿UÐ9Úàð’½o]ƒfûωX½ú¼ÙÔcm¶¹\oäæ+ËÒ>ôeNìçw|fgOÏ]&}ϲ»¾¦:¿›âL±žY›A¶>Û{º•ÜýÉ¢¦òôA{í™ß¿]JŸ‘N[{žß¼fÿ°àfœÔÐÏ'»„1Ï[óœÞÌœaØú^ê-öȽV}Ûòúo“–[¥(NðÞ§lØ=ŽÛ=ûVM–5éõªªy«Á¿ßT–M|ØêëµÏglމy{gfÉØ?Ê3FOé|¯d??ë{Utα½3U5»XÑ6½Ðnꓟ:(=htgVƒ §fÎìþ5}ø­Çñ»G6Û\øhɘãÑc£˜œeÝ÷¤Ä›Žü<~Ú-îàÍ_›œ™²n¡å´]F #·äE¯'T\xÞß(zâ{½Ì‡9µ°ôPÞàx.=õú~³6û­"íå3 ózŽrœ8)â!³[åܧ§6¾]õ¨ñiÞèO£6ìv÷ø–T‡aÃõ¾ž?==¡ÅƒÀ(ÿìȇ³}ºê<½éÄÁ29÷É…×¶.M .Çl=·dŠ ¦ÉmÚEÿ×Óÿ¶'gkUmo:VqÎÎqÖ‚X¡ÀÙáÁÓßÀêñãdÿ¯ûq²ÿ¿àÇéïÐëßôãôWšú§Çø¿~œþ÷ãdÿ§~œìÿ~œ¬jù:²v´qÔõ§ÊÙØÖJsp°ý+~œ¬ìj×u¶«íOÉ©–ï$k+«:üG¡—‰:>‘œkûž²r´ªí+Ê¡\œœj×µ®•fëhU‹.öVÎöµp¶³­U´V?lmjùq²w²·þwü899XÛ8Ø9::ÚûxX9ÚøxXÛXùø8¡´wô±rûó:~œ¬ílœþëÇéÿ=ÿOñb•R&LdÛþ“®‘ê÷ÿ„\¤5¼eo Ë9Ø6°²¶±³µþ¯ÿ§ÿ‰ì(cøó”É3dc',6óH%â$Œ§KcÅŠxY2D¬H†&`ãPÉ0µRl Ae , w˜@*ÂD°ÙIbÕ*1¦J(QE¥,N•8 ¨”˜ˆ€ÐÞ†äd`@ ‘Ë”x©4‰*È5¨zœXŒI”X‚X!ØÅ+R•XdɲT‰H,íTà¨+K#œP‡Pe©L%‚,¹\,P`)&HJ‚E$b%jUŽ•s Õ]•(ȵ¨W©–Ëe •DŠF¶)ˆ§œ\0YÈög‡±!(pº‚Ô‘¢ÚØ¢Uh̓êÈÕ±@ô’¨2 *D ÓÁhˆ 1p:Á 2bJ¹X(‰“-°4…DPOk:ÄF Œ’‰€"Õ–Ò1MŽ–2)ªÊÂóç1ØRÐ-ÌD"&©Eb¬„ÇNpc°CB`†DªÂ¨M˜¢ˆ0A •‚ÙçO£âB,ð‚xã|fraD óHX MªN&“Í\ì8 ÂÈË›çêæÄƒ#ìAk—§– ñã€pƒ8 !ÐOÀuô8-A"L@e„`6@Ž¥Èö˜ŒD’ˆ¤ G <"O €‹9 yFad90¤B±gÖ8œ»•bE*œ)j±N590Q¾T;È2€+À !zlƒíJæ`l¯Ž^HÀLŽÅû)ÁÁÖê+™ð L× 8Ô2…ølêA (:á ‹—¤‚ù‚íàowa&€©d3À€Jš1 ÀL”&eÀÁP+¤ ~~‚yøìQË!Ö¶J6æ–P¸<*Ä ÐX0ÓYI¦–&IÅZ=$J3 ˆT, °s$­`¢‚ÅR?؈mB½ÃÂCƒ°!îáÞ<ÐO*ÓÀ¾â‚IÅJTÉe"Ð4ØŽ@ˆÏwrnÀ |è"±…J‹XÂL°H Dë8 „’3QT ×e) ¤ºÄ ŒP!ƒàât ² ñ5…F+9¨)p¬IÊpa ÙhŽ’©˜¶ðÝ#ƒÂ!=9æôùh†ƒ2øü…ÓZÉ’áêEô3çÔÝz¨·»—»G€·) ¡Òð††‚XÌÔá¦0É̬îÊ¡þaõVÆ`mTë‹Eýõ#jÄ‹IPpà:Ϧ•X ¡íÃåBp4´e[ã ¢·7æÀ ëN(N`•$Y 9ÙÔÖÌB›'Rê¤ëLýïAàÿ¶ü&gœ$^­ÿ㢱£½}ò¿­½£µ½Öÿ«½ ÿ­þ+ÿÿÏü3é…qb%RŽ2a‚ùªá}0ju¥Z%C(M§Ój¡Ãˆ:@ÄI'Ê™!qÇýuus<ÌFEX+$I*KP b‚­ã@Gبˆ;‚8ºý†TŒƒ3“1)$ècƒCH—@žDÛb¥@X-Ub¥ê %ƒYJÿ—ÈY­èýúghâæÇÒ°?$8²ý‹d‚°þW ¤ÓH!Л‹>Péñoó%1Ôa)ŒÅ6gji(óg´qüT¡wáŸa¥XÄÂÔ*\Å÷[iŠ’ø8ü«ô©½‚Qƒ[£1¨³4\.³¸ü=2þ}£u\CKLÓ닪ñ ±ü$«é_#&lÓÔúßœ¿ôþÿÓÔU)þmÚ33qi&ËÙIé¨vÚ íĶJ%Ômþm.V)0Kf ¤][;{G'gBT2þó0•ÿ4‘Ó„ÿcõ|ÿ…õ"MˆY¦ÑÒ5ÔוSÿñíþÙ©¤ù§É.¨þCë1€ŒõëÇ÷«‡®Iÿ]DSµ¾°?%ºíß :0ÿÕṜ¼Ub¡ ·PÁ ñyÞ!î¡îaÁ¡€Òà( Ïìt$A=l]j)N–< P‰o‚yI’ ÎBäª^ƒ–– †Úf¤Ù™IPù/– ÐR„MŽH¢P‚^—•®5pÌKåÃ#üq…§:. 9à_[ 6„ä5WL$½Dåu@Rë4£2ɘ!’IÅŒ:ëëÖÖ‘}4 (æoD)N–ü–( ÀŸÅõ lF‡( é¯Ö®‹(„–(’8 ÉØºE€”‚éé:¤ x‹€C·§ˆ”pÉbU‚L¤D ü.Þõ(ÄJu’ Kƒn£9’&”WÉ0¥ÀdÝÁdðÊVBë~¶g[¥^*´ó‚¸Åä2¥Rexö#û`9Š8'h§‹±eØO%“c"0_0ˆr<Ÿ+´—º3 Cš{‰ Ý‘þæP@­ò·q†8I)FÔà‘܆ÖVü ÷&‹‰t9¿­¢­2)µ‡4^UÿjXÂäkq2ÀDZÞB.,¼/g0ð;,xçUgWð9 éH®qheƒ•é`5Ó€ŽšÄL#\°^\Ê.@¯JE”>èPkS£ÈÐ¥¹ K¨„ uŒ 9ð€Bàÿ–nèñúôoø\â²2Ä@@®W5Hèùí” ˜?ä_ò‹ý Rû™`büFÒC¦VHáÕ]²T3¼ÂÝ<ÝyÞ\kWŒPy‘I`4áb8ˆ‡)4K :¶gãùñ‡x‡òüƒƒú‚Ì2†¿©8Y v€âfºgœöhÖ–‘ ð€Ï@/® š+! ±¥Û†4hTÂkÙa Ã`‘I“)ÀÖ)›²Š¸xffZ÷5f0βÀoÀ\¹«RÀ¤RÉ0Ð_À‹‚xh¯à%Q¢IŒnãÀ £9R Óci ²¸,ø…ìz'“«° `¾o@°ŸîÁ #'7:bLá†n)3£IHø€¢‡9XÓ$éæf„ì—ÅP"ˆ2d®FpüÄ`”|iR#ƒL|q``?‹Ç š|„ 2ð,O–,%æˆqÔJºÃql²>—õ?ó¥i‘Iþìû·+h*"ö‰ƒ –x@å" ´ ¤€Ç‘ö8 Ã)÷‰x… òA6 (V­Òذ¤ ”¤uD"~™ È MZF)Ø ÚÊèá®LÊ1&n|á$ÁW®È„f D_KŒìCŒ1Ö¯H2jLã)Íò¥D –6/ÕæHQZ1é Ça½•ÿV³@”´®fa‹œ"š¥:2Æq£ZËA«/XHÀÿÉ6é³LJ’M]»Éöbe¢ .Kœ ³dc¦5Í4‡i8ê–¥m„uÀÆ…­H¦5”¯Œ#£¢LÙæQQfº€)UˆË}"žË´v%bh­`‚4ÍÊÿ™h‚ãˆ>Ù(Do‹(ãÊЇ0ct˱ÍñÔb\ÉVáb¢ ×Þ˜rÃ[B5X„LC.=”~êÒÌK¡f°ˆBd¡Фa+ thA3ÊÃ@N¢˜X,ªãâ ƒ·EÆ`‚ƒ+ij¶±ìƒÕ24%JJ¥b¸O@Y^‹ŠEdŒ§%£m2‰°ÎÃm}P{– 9xAjê‡ñÝyø®á0ˆÃ ÜKŒ¤Ñý˜ZŠÔã@2LC†X"b‚€¢ÝÒb‘,„‚Ľ~ôC׸l3üŽ 36Ö' Ôö‘À3;àã4d²ú “%’öS`“O€30 Yë@CCh¨•:)!29P+Ž‹¥™V8Ÿ¢íixTg„9f†iK|â •‚T±ÎYIWøAöƒJÚ™‰¡=2Q`€$킊×@Òäâ²"^B¡)ÁaZ‘…H50=[‰ ¦öEm‘¾÷"öI½7$0"ÌT±ÚÆ‚†Á¦ Æ0¹B-Mc1€…=ƒ݃¼X è'nš‡(Š íÖÄZµ9TÚ͈°šžÀµ0ºkFN ²F/Ì2§QKSƒœPÔ\òZZTiz‰g¹‚³ìâ_4rSÊ’à6²ƒ†~¤ØKœvàÌ4ÁÂ!—S¬ МÓÑlE†ÀAà ˜ŠÙñlh'k'¡¥-Û ð‚[¸`g0ë”J€hh¶a[á’%fÏÏ; ϧ#ôú\©LsŒ¢ç¸çã19ç2Äp+Tª“!EDbäɬ˜­ç ‚TboBª Lè'«ÁÙFcö€¶ÜÀÖTj„VDwW­¥» I ä4$à hå!ªàvò8NøpI¥K”*𗝡‘¯³LE -Ó!~pú)Ä`§¢§†8\6ƒœ\­ —#¸‡,÷þ¡N0b{²$µ»ø•jžn¤ð7•اÀ¡MɵLM'¶)d"5–J–¥¤i68†Ð̃…hË®öT 5¿¢dh/JʰÀ‡ü?E ùî»R™DÆZ há+HGüÖ‚™Xžöàx âTh5‚†`%è°Ø ÊÚnå‚/^„ù0Áûø“L‡‡áú jÆIùhy±±·'E4|ïC“ ×èA¬q” âá©ªá’ ÖØX ŸUä¿LÝ9áJŒ¢Î„È¢îvtüt6¼X¤µàkµ\cŠ6"Ê8ª¶>"êC!Ç¢3 êTJР²ÀÉþ%ÝDTʉ¨@;aŒB øY!qq~"¬³M͘"æŠbZ›¹bY¿7xZ+m!Èäpݯ]ÈZ[¤Ð¡Õ†‹Ð`Q¡0 vб,×J7°“fbš\¨ƒ3Œ^Ÿ‡ìÚ8®«·2Y‹hõ©ÝùÔrµ vøwˆPËÑ‘zÄ`Ön0C³-¦ƒ9 ÑL43ÍT"y¯V³¡pƒ=´ò%‹‘ $:#•:ØéDlÈV¤œDB€K•VÂóÁBÍÁ(òâD¥l`Ϭˆâð(•ñ­¹Æ®´\&5Æ ðò þM c*,7ЍÁ ¶aó¶aCkɎȈ P…‚ Å€¤(”èäÛÐòûô!OU°®@¨Ö³ŽŠ‰2Æ~’¥;(QLSSÌÖÆÌÌ@eJÍ‘®¾Õš™IÕœ‘+8€ëI¼=ý‚ÿÇT–ÿcšQMÏ¢˜ðSßß¿ZŽRJÛ\®=ð¡D4²)LÃs´§é(ãÈ(ŠnJrB$7Æ¢ÈÇ+`xt*ÚÌz«šÑg-\l‡#ŠÜJêÒ>¢ ”"±vÏÉ+ɧVžTÆ ]\¡5­\Z\NÐ`¡”u£Aið/(=à em.8¹€jtTÌëT õõ:Éÿž¶Dƒ„ C£†Ô vx}Œµ`D übaø6?eãÚt{tÅ­i wÑ»8ê),E8<»@ïðà°‚kÎÙDUˆ;¬¢UÐ-ù`À2‰. TÜXÃn´d6%ÁÆW8}}\ü¤+§7‹ÞG¯¢ˆ*ðI1¾È!#‚d —+ ÖZ€¼/׬„(ìèO¨º‹gÀ³/þmLÛžk …¤v”¢l£7ã/…„WI„àô®°€·±õÎÌ8%®-FFwè¼q` «y¼B ”C0vl[¶¼á…jBTsCH¯’$† ¬Â¯šã-ĹñR5tÁ…[<ÑÞÀ1`½¿ýŽxë ëRh/º 7ü1®Õ'­¨2 ¯ÉÕÐXSÄ |hàKh\ózCªRV@,±l@5ÈÊ@Uá¥Yœ7мÀÓc‚†;À`Ü n-vÈDF{÷G^àÿ'VñL*+[³H3¾æ’— ˆù´7 øä#†ÔÈð ;>;4OÁdqèz‘'KKžg€¿gp@p(ß'8ÔÓ›‹ù†z‡ðƒ‘#—A¨ªiehEêµGµÍá!Røo±•¿3ÎÁëçl¼ù!Z…áZ Ènœ4ÅØ j=S3F&nÀH’eZk”nLk×,Ò 8—R‰¡i[ Ïø*J­Äxaîaá=ÀŠ$j°~„†iÍÈÂj7®EqKý¨€4oXB³Ðà#O¢¯r‘kÌl¯rÌÊ2³1Rn‰‘*Nœ®bSU ~°H_B¼§w€iM21 y˜¢E;9´|¹.ÊðÆ`«Ñá}íM,u£_Zû˜MR1T»$®D8ºuKóf‰ßÉ"ñŸCd¢­q9NDAžÊßÀhÊ‚ä5?4+ä¢HZ¼t!¬])v tiC G$bC— ñfÑ£c%‡ÅÑîY,N<´_ÀLX@Z(ÔÞP¤Z*šÆ,&QšE¢¥4¦•ÁqäµÌB*!ðMêG"µÉ.+ÚJ 挈2ãpPþgÎ1g²°¨ÑXkUàp¢Ì`©ß—ø€(3”ɦÛËÖJ ”*£ ®cq¢)èFq¢(ƒ0““‰ ìJм5§ÀOüƒ*ÃJ8òló¿\ü/6û3J(Áæ¸b)¬bäjó,åRŸ¸Ö×–Óž…•Zæ6FœMã‰,í±Fg:³m§`­3&$jâ¼Ö‚‚¬ÚE\(Ë”Þà¶&–€÷o××0ˆ˜ý° z ­ÖH` ‡òºŽ×.aøÄR¦=­YkÔ¶@(†qÚ¦­ªÁzÁr Øepw3õ¢ ¥b¼,\Šáª —T‡¾~þ‡ å……‰ˆ:LS”€Ê¤5¤Á!ŠŠ$ñh_û›"H’ª“I4x%¤Ç¦^p3É…˜zQ]÷=uí¢6Ô¢”ëfÜUs=L^ü’¬¨·ÂÚ<í5³q:¾DÔ î¹ø„­‹<}š`Ip2ˆÅ˜7  À°šZ;ÛZ[Z;;9›áêr±ˆ¥Äð`c˜‹¥çXK)aÅ.G9Ù#ðÎràq–…õÓêz©|N:”Úò€×úXrÈÆ£LDc‰¯ -5H“*“Ék„“ˆÅ¤ 9‹ŽZQR0£ Q¾'Ê&Ê:ʆÒ$Œe”`„g‚¥_ÿÙxûø(’e"¬o:¹9™h=©ëª†²}ÐÏ:´êtã`,$˜ç‰÷s`Çq¥n8¸• Cÿ8üéW«Ì¶Y 1aø‰ÊCU"‚B¾„g=´ë£›]Qnb%’ÁLA<4yÇ i,GkÙŽAJo¨/&I@2~<‘Ã%D"DfYÕܵåEÅ]9Ðoè,Fs¸Õ dÖŒô·`ùUBH2ô* ²ÉJƈ dÂjð\ˆ,É¡é8¼«ï*q:$#'iÈ¢ P‚LVh|ƒär ’IAŸ5îÜ$ðÇ\ Ca¨ê@ muðË*¨.6ƒýfcƸ.IËI2RÔ„؉“U’@©"]Ȱ åp´à{r‘I?ˆø†ÏbÈ<鄺²”¢×ú”¬ôŒ(! –WÈÛ0Q›¢õ"f‚Ù˜a^}CB°~ðÑ€šì`­Tf$vNTºðXIJµ³i ¸((ʘ?ùH0¤Ò‚z»Kü8 Æ嘥<”…WªRºc ‘5{Q†r±nSˆHÀ'_D'Iÿþ@$Iu¿éBÖ>d¯• ²þ„‹u¸’ÆÜŠäßð!äBœQ-åt•öW³qYš¢žæNN 6dÒâÍÂM‡•øé\¡2Ãß°RôdÜ:Tgè^DD:<'Ü@& äðr +Coà%?S='Âõ ¤*_(—s‘ø…ŒÞæt!²w]Œìíªì=<šO Fôæ÷Žgÿ]L´¾ (è(t°éÛ[.ÿ]›¿¿Îc0´Oǽzù‡âZY¸#:öëc…õÓ=Jtg)ôV…ØñàvLª¦àß ¥`+ƒnÇÑM¨3å µeÛX`²$ôWÊ HÕéfT·Ø²x°M‰µ[|ê ¶C5‚ÝLã—œ2 ƒO¶Ä1Õ4 ÐÆK[JÍtœØ@RY§Äà>_è/ô‘‹H‘XàÓÿ8I:Y{%É„‚$˜)Lñ¹_å¢8ò¤ãXYìH˜+Àß#Øc l–PÃ… kÐ24wSªcñ{š@Ÿw_P&Ð}7„!oìÈ»?ñãa"¼f„¸{r÷õæC'û`z£ëf–&5Ì=´î âšËÂÝ¿j3xa¡þÐí&Í;¬6Û#^ª‡†iJüËÎaµ@ÃC¸,ÒM-•¤¨Åˆ\cä·Z"Ou`'Àwa>¨¶‡m‘ 5îà×ÞöANU¢ñ'~(@I×8Š¡ýõ¥J$‘ÁŸ0‘ĘŸûÐõ¡<~ØÐoß½ÿ#Ëf(9ðgùÐÏ ˜Àj\­jPµU»äÓÚ•xa^ž|?ow/x ¤ÖP‰» ò´DP9Ei9Ì ðj·n0D»uàŒFÇ8ë…ûCÑPƒ .™Žêz‡Õi-Yœ,SdÐZ£¢G«>²!tijÔGiÿ °:ÆG"Uývx¼@=ÝfD V=ƒüAzÀ– Ž¶X4ÅR´yÈÐÏ¢ñ… ba"1—÷é v!°:C-E2ŸïéíÆ÷qày3( a¡áÞŒ€0be Wr5`x"ÿñžp5ÂBÝyDRH¨ÿ÷0o>¨’P>žÁèÀ÷óöexÃQ®#‡À¤þ|„X¨{Wp ÝyáEƒÜÃü‰"üAFE' ð3ÛˬDImÏ ¡¢æ¿'è#œçͯ'ô»8h”63˜Ëú†@/ÌaÚ‘ø³Rõ \âåíãäíU?(Z©ú@ 1àmŸàúAÑJá "#°X@¹Pw09‘©qpXpp€ƒþ<Ì ôöòcxAó»K¿7ôã É·-ß=”Äç*D‚Wx`ˆ‡ƒüx1|à&¹U, ó^(¸²xœ^7È¢¾§$’Ýðò ö¢g{ÖQÅ“¨áI­ •,†{ Hó» /Àç‡G xÕ„åSÔ2•…ˆ¹ÍÙ@¦AIj©J @!øu»'Š%ῸÂÉT žwîÍ ÷ˆA ò®8pÁaø6 @k[˜¤Á¾¡î c–Z@:C{;I†{xX0¾Ü¢   Æp÷ öt`cOî– Ï¡¾¸Ó¼J…Ö-@JkkbÌ@’  ¼Æ 05_zÈ‚žä,«Qžøxjúãåæ®íúýM”ì%”²ø2%þM…¿a¨ÀÃB¹Л‹ÁD< ¡Ã -ß3ôŠ¡áÞ<4 ž´Tk_ï ¿°@Àö ƒá ÿЋyÁùðª;•œ€uæ!á˜ýá@î|*çñÁ„wÓÔöæù‡ ¥%ÂÈÀ`KÂÿ‚ÿ¼CùŸ‰ÆuSQ³€„ËGï qªâAœxxí¸&ÿÚÀâ><ÔäH $±ŠQH7†\‰þŠâàG”*ŸUrüBi %Ë„ðdsbÖà™š ¼¡¬#Ö4 ‰)€'ÒF3”P2F0*ùUÈd*%x„@%Áñ~‰áéoR%¼Èæ£{\GçB.§ •µ¥V1WWÖ•›iÒ5~Lbè8Óîö¸ðÏB)ЋnµÌªGP “pŒS(øÐ‚“LV`R_¡N‚Ïdð4‘8VO—,¥©½ AÑIÇo‰˜P­H¢UWf$ÇÊ’ø ¨ UŠÑE£D¨d@ /?^(KÕ@‚?ð]H¼X‹þ« 88´¾%A®ÅUZD«ˆ41ÔÞŒˆd¸Þó‰ÕÏHÒùJp'©šV ¹GÓ¤$Ú‹ò“àoqiÓâ…D;€}D²d2G*“ÆÂ’œÑ ‚A^"[ %2µ’æ¨3Ž2i.ªô%—ÓÈ….ÆôÔ¨k'Ç7y’Ç@@\·üAhNªbü8­5°…ƱÎuä‘H¢â'ˆ“ä\MŒxMhPÐù tW/…F98×JUŠdÈ¡mW¡‘&áP)¡¾yÄQÀ MAEîç ×££[d ÓO¡ÌüüG×+çî à o†TÆÇU}\È©ñ~0¨…È5£®4¥:®V}má*-ÒÁÿøLä‚/l ì¶ð0Ï„‹s…ËHל4q`éÝø;kx%Ä̸©ÖüL36ˆ˜J\{š$ŽƒæÙ`*N#…?\L”È’Æþ Ææ›JNœLÏÈPJ>`Ðñç‚~¤ þ.¢’øñ51| †¼!RAAjš6ú]7pîF–äʱ W  ›B±’j“…¬_•2îíE™`Z%É«„lÜ D ŠåH]œŒÜ0A6‚Šp†‡&aJ-!ŸO$ÁŸ°ñ”¡»až tR )ÙfÄîÀe13)=È‚ª+¹ƒÔÊT¢\íVS«‘Å¢nM°\ÅXäs(³X”MŽZ €¥³R³…²d}ï¤æ‚¡dQwY˜G+œÅw¯”=™Z›HeÑ7p™š&ßäu»ÃÉf¦ÎƘÅ"eƒZåa:‹” P.‚ jàÂ- ;èIJÝ\P©k˜XZq¦x‹{jeƒd\㇡E®Kð?.þÒSHìØøËMtŠîë@q¸³ùFBVž¤Q›|I&‰—¢Ÿ ¢ø^…êS¢9š/SÜt›À#Š©mW»ÿ¤âæÛäÏÍàš}­9Yƒ¸Oãö‡6×(‘îpŽ,‡ŒH†GsG˜sñëjV ñÚŠk†·ITÅ´·j”TøìVk‘Žhã®™ÔÐÌZòIU˜gا©¿Ö¤Ùð7upAIñRèoX•Ö%6­SäxèvÐÒÒŒ¤fÈœ`.>ë±Ñ œnP"Ä׌Fk¢ê"‚kNGPÂÚ &Ä%Ü”õ˜jp…Â^˜"ÄW?­B" SÈVuÂÚ &¤AK ¨ÜÐFl‰®~`µú¢´á%^“@ kƒš ¾ø‡ÞW­4@tU‹Ñútâ ªƒ­5B kƒš ÉH‘XjSÑgmÏ=kUÂK°ñD5boA Õkƒtj‘%qR‘û“9 -F½!ËÕî eùÔT«;NÒbš1 (am°v¯Èv´=#÷es]\j¥è&PL£¡Å¨*ÈÖê îÈ’¨HÆ4‚â¨A.Ìé: sº¥9Y‡\‰‹ëPñHø+¸p­é ! ~ˆÛÓ® ßN”–ˆÖ ףã-û²é—‚´tÂíF1¬Ö“ ‰o“pz„sÁ¨ èt—ÍX¸”µÈA5i¢à‰ßͱ”œáÕ>'ž ˆf£Ð¶ñý÷ÌÊ0&t4œŒÁf¦y„o“µO©?ï]>MÔoòÓÍ»ÇW:Ó„¢èÛ5‰ ëüXnÝNÔíÓU¢`¯]N4<¸4ó—&«¼T—¯Ì`‹¾ZßÌ/zw»LnŒé£þ¤>ØNâÊ"·›¤e¹w?H}·¿î¥y[|É÷ÅúsòQíQ†wMv¹^Ö´«¬WôÝþjt†Ÿ˜_ŒÏÉGýI}H#.iXa.ñZNw.ó$ýÀÂ?³‹XßÌ/Æçäc‚̤ Ylr v‹U˜«@ZïoˆÖIÂö*f’‚'«Ò¥"CqD]¡GòybŽÂí,7~êï1îr;Õ›só©æ9ܨì¾RT½Y­ýø–×¼ù‡ÍW—Eu /µT(â†*%‘Ë7’æN¤x>šè•¨SìäéÞëç»2+ úqEÞ |ÏñîTñ ¾ZÏS+~ß:|±÷â%#QP˜1‘KÀŠ4éYÑB¦ŠHkíGÉTñv4Ón4¡3 ™dŠ„=6„ÙŒê4Wþ㺅>‰ò‡¬±‘|‘'îâ+“8iŠ(½3ÙoGWoÖjkN•Iv½v£&w¼4Ù ü˜ƒJ—!ôÆ3†ªâÙZígöµ¤3LÚùnÆjc B½öܑ۟i±ÇR.È4­@±kФI½T˜bóˆSÓoã@È¥1qœÔñÉ۵ǔ!«sUW®[¼ÂL£GùGj””fÉ0j1ý Z΂ò¦0Ρ)õ‰ma\¼buû*VZb+ƒ%e§&íŸ¥Š˜5±XYÚ %6(ÒÖÀt´'¿4â%4à>F‹ç¡;Ì*‘'ˆQ$ã3Å}ò»­›.VXYÈr#ár3ÀùkY0Hƒâç¼Õb¯Áè4—ƒf2“Eñ}R#OÅ .JJc+KƒfâyÝ~Ój5ÊĶÞÀÏȬO9I¦è‡ %€ÍWM ´ ,Kº¨•TH+ñž¹V3Ð9LLõ˜H³V“-m¨~—${!—ßHÅûÄø÷^8ìc ÐP†AV1ùñÂÿ4 ßyNŽ´!NÊÈç*f,½yϱÜÈ®þ¸Ò®½o½m‡r¿`—ñ® ˆ½ÆÊiçöf9ãâÞ,[®î“ÁÉú@fª>ÇJèg4o§‡M…L¸W§ž ž˜[ŸCÍN€†yÉ©’bvÚB@Þ0ÑïÌ1`Øy» ñº&cæ•Ê|+£‘ÙJeˆ<#\"9¡^t›'ð+‰V®÷‹.…f†} Ø<éÇèc$ê'ò1”P¯:]«’HŠRÊ4_pÆ'ƒreôàSL÷1ò¢Fÿ*9:|ºì‡k/›m—ò[€÷Àú¼XfÂ#¹FEÂÍ´^¢ Oeì[ £qÔñ("(fþè7$7Ð —RÜÛžÙ§õv‰ÙcX£iíÖüHƒ“©&U*T¢Wဳ›`×FI:½Î(A.À”ã)©Qç&”B07A‘JI˜ÍQ¤Þ\'M‘]§ SQ¶Ð03æ+ÒCù«¦,2â*XM¦þi’‰5ÊvÈB“ÇH(õºˆ5‡9Ûñ5ü%žÁldJÆP0™Z½^ÊY«ríSìi^{±XJµ_Å-S­/ì5¼ÄgÍ’ªàÒÉOY¡ÐÀ-äKòI%a¸þKvÐdñ,9 ÄÅd ?Œ8ˆµŽ¼lOeîSÉYîS=–ò;®\ÚX"æ Û+#EMS²W•í.³SLU£_WhYkèœo¹Kô¢p «áf¼ŽñÀ¨Þú2ô1Ÿlá[xJ']އŒ‘{θï=Ì‹9 Åx(ž×.ÅY÷ËïÜ…OAñF^Œ´Ü¨ª¾jyN¡6_žK¿EyNE¾¶¤kuäI¢ãÈÄrJ&…Ãk»üËÂt| ~Ð(Mhaiʦ‹­zb”켿&èL…,t)•Ñ\Ò.…Œ^ºý¨Œ›ðÚ"íSC$‚n? },ŠƒFªEQˆR\bwLk)5ê,Äá}ßq슃ÒǹÅ( 1%c¤=ÊÈûIÚÃP—GqÑ¡}™Å©ñê5ÿ×à¸ÂbóHüôS{k{÷à©kQÅc¨$¡ba…{E¸n×ޏwÁ•€ºSn'Ž×[wœWØkWÅN±ùC¿ùmë°I)Äð«ã€T(ÃaÀ øQ ¬LÆbÉ«ŸÕWÄö6ü£XHP«º"wvÚ™ÀÑPëByŒÓ‡!9v=ÞŸ ™ØÁ0‰: ²qoÜ7ó&;;Ì%ùähD'âè8Jž@Lbt›wF“u¶%žHúØ Ï¢EÖO×µ\±Ü@¯9•?’'"å´E>X©Jª'²Â_iêm‰c˜Õ.ÝAØÔ8&a“±€´}²†ÂOí·ã2.; õÆÐä™ã©ý¹¢lzV3ô&ö>’$Þ¯40³EűŒ¿RæÉмÌ8÷ñCzùFº[wßbûÛ+éø ||¥ S²þ;±à›*d¾b¾ëñóäS™‹ÄPÝkÉRwöU¥ž-¶RŸñõ›$þ‰Ü}['€ˆ·Ž“Ê÷(h¾¶0~y¸ ç+Ý5î7êœû#¨pkвŒÁ&»‰msE;å¹õ󦜉iMXµ|>wuû¹-ç´»;½a.x¢ãL­VÌØV<¥•T¬ZqXÃj÷ž¢>­ˆÜW+ˆƒP‰‡c =#YŒãê$Ê<RbBN“±"³˜!‰É'+´=,L#ž¼æ—ƒç»à$O¡Ä)…§cFöWHójr"âmXÖÇT)c:ˆH†æO$iÆd%þཔ‘!oä!¾xÆãÜšÌêa#€S`>€XC0\² ÒÆ2¿²¬"{ØSõ1›K- 0¯ ¥©ŒsŽXAÕœ¢# ¬%Ø&>Ð ì7åÔ‚E«Æ‚× rP–‘ê—oR¯`Óa(¦½\26ÊЋÐ<G ‚â¾b@ã]¨€½4’sæW Š›Q$×P&š¹¶á0a@Ø–1ÔåÒR½—…¹¦ím¡*§j"íaP;ëtÄ3°Ã0C¦$Í'ŒSSÏÎ …ŒQ¢ùMÀeqaƒ›0ÓÏöðààª+ä°¿§ O»ag¬Ó†ZU)Ô™A*iÜJõmmBë2J‘^_©ùE´ }€×%a'§¶]“ÑiVÇèn,û1åÚlƒ!¿ët'¶5údÐtÛïýI•¤sªZQOªçÔø¨Ž{µÜR^JÞD.µåZî,©­—½vH3+ßPözbÈ(W™ð,pÒÏâèÕÓ8™÷U¾˜ZÊ@F_f»\Rƨ'aPÏ9bÖNaóåÞA à'¯ööw„Œ5'¥\Øúì @¹Ì›³1ð+)ˆq€_ŽŽåÈH¿Zcý*éö9¼™ìz°»*½!˜z²ò®¿’³VêÚË|§­HXþ(!¹Êy¡J–(ÛªuðÙ(ñTû§Hæ€6h8Ç=åè*u*ïß5-ï 8õàE¸u¦B“4ØDmú §»[ǯwmiT}¨—K#]ìD¾iä˜~ü¦¹uøì­ÈÀyQúÖ¬“%®QPâbaŽ+ð–‚Ó AÇö¥®GžÄ–àå`xvù¨Aò#«ª2QÃl]-z‘Ù]>zÔ¸}Á'he­È”'…ø¥qÐ 7dÕßšk¥ª…xÎ,VK®IQ“Œg—‘ÃO%˜œù¶kíðÓÂZ²)ÿy© §ïªjJ.¹(•r{I%A©¬W3D‹`ì¶óÁ˜Í«pÓöHQA²ˆ¬®ƒR›MÚUU“«ªFYÉ—Bo¦ ® *™jתjAmÙ´ m7 OåDq"¡C`›-Û•uË“++Ú¦@Ý5Ô­–_±Èw•(™¸‚=tˆêÀŒ@dG88xMW¡§ܳgÔ¦2¢7:L°‡LXöÈèÓ(³[›PY æ¶;¢æØ_M…<¨Iæsa¨8ÉݺÅWŽF6OPñÑkÆüýHn±SŒZ® AŒÒ”}½&àà‹Ž$ã!ì¿^ ù-s ¤ÝÎg ÒeòØH  ×Z'’+ÀÞ4_þúìè­ 0*&̳‰âFém‡§+]çp†ê8¾&7 d4çÃñ`UûtmE£†CÌ£ÌÿNÈäö2ˆ¼X’÷ùpy‡÷„¸Uõy ±µSpLzó.ä£ ¼¬À´†)J4bÕ\ú1æë~ÇÍî1vmµh¦Õ–MSLüsØ Ve3€˜H>a0ô”m‡äÂ]ÂGM¬BS%ˆ¡AÌ!8,B¢sæË½í"þʃ¸AŸãx’ä„9(“a×\ÿ²Æ9šðñcü>zø‹LZÈæÂÒêZ"C÷+JGª»Te8™™M€Â9œâ<™*u%tç­“³`\ƒé7Ž1q '/Ò¶“íSÔv(«A¡1b™¹á žæ¿GÛ¥V_™“u•¤Ru‰•÷F£úA™¥©¼ÁµŒ̉æ´J-U ‚Ÿ(NÒí½Ö²Ý‘¹LÎT|ÕÓë1UÅ̹ðÀ…±½ôÓÀ˜Ì¶‹è&$S ×wI’I%XÅŒB½Zx™"jû?¡É2œ“ã˜ÑÆ“L«L¢™h w@ıŒ«o˜Bh@ØêÞ“#­ØÐ `1 ””ÎÝQéÿ$ië«ìXé€Ö ¬ÅªØnlû-­Y¦F³÷“:²È¥z®Ç§’âèŠÆc‚â>3aö_¾NNëØÅ¼‰’ <2EôTå$õ°»ÿ*†C–ʳ‡bÞÕšŽyI Ý]åq>¤KVW¬HŽ­Ì¡@áʦcÔyèw(k#<8½æu`Hr ¤Ÿ®þèN#™k<Ùé#<^M,“j¡¡ltðÚLÞ¤‚€Kýøé¦ #ו†­(h³ü³¥.ȹ—Õ:ór–ƒùË„Å2µÊŠ2P‚7hë©®áøÂÌ8øú›¯ÖÛôyYðú[Û¢q92cÛ@##x’ض¤‹éÁDÚü!m¦LÓЦø”À²Ú„´q³Ù $íûS¯ÊÁ©È là6ÔÕp¬Ð¬ùTÙ¾ •.Û†ÐH¹ñP¥ôÇ?Zu2Ùüø‘ÌnÅ–(Õë%B³‡ñá“…+­ ÐÒæ*Ó½lƒ²‚ÑnãÍd)ú±Q¯<Û„²Z£”ËŠ¥R©zM”°…tÞÛ¼V‰ñ³PÒÅ,Ú”Æ(ê]ú¹=ng‘5x ˜]à2E+ôÖàèjÃIuÃî—Ê“±*ˆ&ìw^@Óšº¢8m&#¿#hü*UL Ù(Š–„„iåküí(3\΄l·/»ncf3¯Sü·¨¦ó5Ì,‹àqá}A«9¸ÌíÉ4ìØu'#©atÒ¤ £”]1Õ¶µY0%“ãn&¦Òâ“tIa3}¤4T £i´ÞX-Z¡Û3­ÖI)+Mó9Á ÛÄq„²¯M¨›1Œ`•þ´†çm´°A-õOp‹Bw”¶±ðcƒß%Ž/§ê£5Ö\‘ÍoÎ\ÑY”'ŠŒœp»,P­³}²Ï®G wÖrÊÿÚÐÀ›úq¹½'7¬SwμÎXH oà‰`K¹(­×ýˆÖ5눎ÍKÛU±¾º¶.žFž'ŽÂÞèÙËÓp "¢fEìºCöPI;l„hëa½XÖ£n‚rð$‹qÐ÷>vnˆæÎ:åz:µ‚–0£È?E¶‚Â]Ú^Qb9fÁÆ0䪲‘ÿ#ñµ·oå¯Ëדjcf¯š9Wˆ®ÚêfeïÅî‹§¸n­æHçP §„8$€:9˜]bÂ"'ZGíƒ4|@Ëçq§ãy]´¯Îk}©ê|`;RÌÝ„Íòý¹V*¯•>%ïœ:ïšéïåÔ p©ZÄ“õåˆp?0C?”Y+u¦$š%²X…·%™ ©U"Ÿ¾Ö ÿi±ó0—&{¥À7ÅÒÍwÉ+b¤ÊšP¿/µJ-¹²Í‘—yV>±|¨J·J%Ç–MÔ’Ùót`‰Ú°Æ…‰ê52@—6Ä Ð .fAƒ­`‹*ˆåo+V)a_“ž’#³Èšì›ƒ÷ÖÌà«TÏ`ä°½|ä´Ê?ƒpœpš’l‡Æ’<†2«ˆ `MhÃù#Žd–Ë6·H†^Ð6Ôqºoôó)šã<c¤‰ Æ2¬ t„ZUÆÛY†Þƒ“Šq½záÆ<éøGã£hT2KŽŠ8 Ik¡N:LÙkbSäGßn|Ö…öËú¶è†§ weÝ‚ã|¹<$ÃZ†Ãil%a)Éùó¸ 4üy8J×€ÆÒ=þë±¼AÞóæ'“¶üæ"©›Rë‹™“ç|Q¦"_‘¯ ‡O¹¼¼®ÀrÛ"Kª÷B˽Ðòu… È{±eöb¯ä´à‚WSùKÂZ¨ø…‚ò…YŠ~Æö ¹ vî/ÇbhP÷ü峊â²Z)•S¾óÊÛ4i§v™O¡_AʲªE±ã‘ÿê†ö^n5ö^ˆ¥=4/ñ(ÓG@j[Û¿Šý¸q`ÀUM-Áb!Rl!¼—Ïö’+À%Õ¥¶?thë†aSD =`Çdv³ÈK=¼¢{5à($—¢ûÆMN Þåþ»ÆíBòÙŸòÇŸzçxuÝÚû^%Öݪ TÚw¥gÙ©×C UöÏ`‡w³½óó È îîÑ¿Ÿ‹Âq}aAqcndxÛæ[à”À)~ÙÝÚÙ=¿mнÛû¯vv¦¡SäS²ˆQ;„„î]úø·t0:ÕÆ…]é,d8â%®L‹ºG䬧=Útd)ìºÛé„^´ô¯’m(wØŸgKú0+Ó6Ðx!P^ç«ê¶QJ@ÏQ,ôõÔÀº‰ŒÐ£÷ÒIèÞ3ø† h‰ÐÔ­ruÅF·îz½¸~.jÚÿÕàì’Q8eVøIñ:ÃqÊE5W?•×+/ô.OZ’ƒ/ý”›Ö4p*©®é‡AHôj›<{ š´ñë¾c\¹ûF^ŒÍ8¶¸Æd±“å†\k±=Y¼§ÈÇøáF‹ÜZÆy´›–ëÐQ`f…ÔÜRØ"+¦@75]Ö–a5/S˜µq`‹Ø·/¦³úk‹sô"%Ä}>¡I!¶Rode• ±ºâ/†jÂÅôæõ¥½Äc”îäH2D»Õ‚KÖ«Ï, šqJ䉀e%"´~WrÐÓW/¶Q”˜IøÉÈ9T›¥œëÈ*NNî”› (Î"[ Bï€1agŒaXÊë ¶`9Ñnïl·Û΢–9¢»n€ðØY¤Ž¯Ü8ö¢¿ º~ÏYÆØöÇ1þs _l¦¥í’*ÞÁôЕ¥ê&Vʤ± “3>…~¡mBêa» xz牧96ÐÄšÖ#È­[Bð¿|²ºé|*ÌHø"RYËQ“©só_T\Ãõ›£áŸ~oønÆïïïïïÌÝ!Ðeþíá<Êÿ¿Íýa²š³üe&õþ­*øÍ†ïUü÷*þ¿àâ½’ÿ^ÉgO´ÿ-TóÂyÿ+¨ùWЕ”‚ø«ÈÈ`¾“ʶöŸ4‹Yý¿î(íL“Õ„…iW %ŸMž|ö½ûGð¯q “œoQìÅ4·2tSNïÏÎõçáqì²'Ïô™Å,$Þ[(g_D›;‰—œ~Ëá’oto2×4§ú‘7å9EÓNzâáp{ÁhÎYçÚoò¤«R·=ç3M8'O¶<åϵziOuÞ,û·;¹²á sk”PS{þŒ‘A0Ñi8©è¯XügGû¦hc# s£Àì”sa²"@ÖFnÈL3T»•×7pñ††<£:´"ƒŽ$oLïâdQ’riº!ìõÍO7ÁòÈQËVFžé™†03$Õa:>Á¤àÜ,ßhf$S ˜éY)bÆÞOq3<Ó9I»ú©ï%þ÷ËÝ€3‡^‚§,Ûz¨AÁTäë/#ÊgÍ×h²Ò¬ÆkÔÿ¿ù°uy[lÙ«TèéRìÿÇ áoy½Z…‘Ü¥Îv³:é0÷%ºMý®òJ¾½¾g殇oÁ@ïÞÀÖw–k ¼Á)°É·¶ž=;ÏwŸ?¹ýÝÉUÆÈïÉ ^¿«Ú‘l Ó¦ Â.¬H&ÇÜÕv nfö&z·\½ü`:+?(ds¿žeîw9 BF‰,¯Sd”³³h“x†ü©:·Éç$—xh‘|á±I~øE‡¨Þ’õò-3LJÿ…Ì‘¹)æË 5ýð,ÉØDÁNzÒ ƒr£‡Á•N¤ƒ§¤î¸Ãš%û¢ø†¦ÔÑ88´§Œ•²B©ü®™R¬g„RÁ°ÖOâ#øXwœ½¥[4.ÁäÙ…±*ƒ¼¬`ƒs,:%Þ Ðù^ð^er”·^xæQed"˜Sªü/GÑ,eÌüî±X*©ÕÑ+Œqi¢ä©êeßáE^&¼ ÅSÁˆõ” ±)N–ô—aÆ(mcPµ³ Ò9jíÏG¾PEõ%Uø#‡ï‚ð"Ðu"³N4[جÏVç½Yçý”:åê8õƒ†¬0¤Ú™§SÀ˜e9l"A1ŸÚð'§3XBZ?¾ÊÂÑ?Ùn©aÌÚ;^êUØ|x@ˆï½ËÆ™7НbÊ¢áe^MC›ê’ ÊöO½Êé`þ4¨|49ø“¯ŠPXÜ¿0î{ï½~þä«ÙðÇác$)/§êUA³£9€ì(vß{í½§GÍ2üÚô Cn¶v_nnrÃX…p¤·œH› 0”EÛ\Äm‘>ʈvÉ>€6„*¨bme€:lîÂÜþ›ï.ŸŽ%™Ö6îŒ~9'J1²¤¾øÕó†À»1¸Ng2XL;y4Šü!&3°2Ÿa ú.c™gŽ) ë•Îæ†Ðx˜!“¾zc"_ ÕAPÁ-ƒ³Úc拨‹×âe{Œi3(‰9ÚBK‡?Ç!u€²ºÇfòÝøÜƒ¹x#·†ÆÅnärª÷œò%^päYñݾÊÛá„íîxØÇPÖ^MçÃÆøå°qáèHB×»^f­æ<[£gƒqËÙü˜L¬þ¨?©ÕTŒQÕåVeÙH$ãKÇä„G¥D1YiTZò§Riœ•N ©Œ4p%1KתҎD&ÑÉNœ;*²¹JI]×]›Xyͪ,«({³r†€¢±<‘=R€ä÷,ÄPÐý1Èa)7@[£~]…DBZHSµËM¢;Ý!<ØÆ_*È;I¾a¦g|$øókóËHvøìŒ ­7dÒê%UÓä´œ¥zôž~yÑiR•ks›ÉGâ=yž|»”J$4mvJø“S`­´lÌ›(ahP“>4]-H7ü­a©ì”á„R M‡ÒÌo:õäMÔ´9Я9”ÛÜTç†Ì«ÍOy5ÖŠk¬mÒ5e@&û³hL´b÷ÒUº+¢Ó÷Ü`<â CŠ:-S®“#3œ(Ð `$ò7Û—Eœôw †XoÀË/d.Rbî±ÌK!²†\X5Pâ ÆÎôÃð“òd1¹¢ÀˆÖà ¼•¨ËM7î„"àôçž ÍÁÎ7´êïðæg™ÑKpʺQrEà]àÖ¸%ªr)`ä“£ñ°¾Š¡«ëÕ© ¶,óSØ1ê8 54P£2þ&Ñ<ÉnÓBÈUÉá —ýGÅuR2EÎÕ ,ýS\ARßtÔzŒJ°·KºWü³=qù)³38žÃü£šDM#1¯xÅYJö5™ úd èÜ ×$s‡ ç.nüÑZzãÖþ³Uûßö[ùaµöcûír«Ú¬/cBö!<ÙT»£:Õ£I'œê¹{/xO¹ Äâo:túúŸôÖcŒŒ‚P³AÃÆyýËÍ”ÒOONå SS/7¯i}ó“âƦ8a„mÀ?Èš‚2£ —on&/ŸlýÒÞ:|ö¼¦ÏG¯·w«J­AàšVB–õZqù=ÝÁØçk¥$DxdJˆæ<ÚsY:É[i`Í™ŒK²ÿŠP1çk2Q›N>ȧ]ÑŽ=Íä@bû)ÊÍÄÙîºøê?¹¾Oæ¢x6Ì´Ô0! ùs±ž†…[–‘fÄ{ó&Õù©)ˆ ùL¸—˜55ëy'çÛúûœžéÔ LþY€húGS¬!Ã3l„Üü¹¸0j:ùå9·!o`Aå&c(Ì—ëRoyu­_V=ႵD•¾¬ÇÆŸÊåeê ‰LGªn¦NE¬ªó­ŸpÅÚ±öܸYPÒEš•d¬ÀÍYf&Ðk ,'µVÇœ=N°‹ƒ#[Y '3àØ£™…¬]Øõ0òŽw‰vCug`~ºa¾Ëhc•\/#O9/[©jÎ*•: @Z»£\µežª6j¬`Âͯ%­É™Ì16$ùd`¿íí¼0€É'ó;:>IÇ€ÅæõäÕ³ÃÝ—‡Ç4ýl€¯÷ Pð­d*Ñö=>)í!]»Ä^sñá©£OyGJH¦×ìõ /ÔDÕ™Vz^$ˆQ å0ƒ9AòéÉ”¸îxâ¡ãöÍ×°â:/‡‘GËr­ùâàÅ®õhYûÔöÁ‹§{ÏÚG{Ç»f¦vÂSéä\šJ•WˆS ÑÙa×uXb}ŒgeNgbô­Þ0 +%Pƒw£\^©ª˜; ê4¥Ë2gà Æ{‰xУMµÈå8mxÃfªäº.é:V¹Ä.Ý‹y8X{ö²•ÒÁþ¢9¬¬‡¨—[j¾”z°^b%£‘vH¿£äCˆ Tþ!…ÊDÁ˜,¥ªjoÁ(ýÊØ…g>DõC—ì8iUÉ| ©óÏL3U|$ VmoÁRNXªžyÓrôõ‡ÙÇD˜8G­™€£²Q4ŽÂÂh»*·FJO[þY”¤;$:1Ãð‹ÇîyÀK´6£F± ëÁY²—’»}ñ_`¡Ñ–›°œbâh© F׆§ ƨ)8uãsqáÍ`'±‹q8Ž:žALK”9 D%›â÷hŒl®º‚÷ žÌšÙ YéàŽêBìüϳ—/…7÷]Òáµ9°«È;ƒ'«¯Ñý„t{㚃p™á[ÍL&ØÜ ŠP™É&ï’“Q^v£zj›ÉÁ<÷ÊÍÖG$4›`Æ6»í^K\ “k0O9…ŠL#DÒœôéøá86ÚáUZWj%pÊþ÷ÎÊÛ°íiìñ=5b2«>íÛã@¥£®iÕq*ìwÑc• áøîïÛ€*ªÿ ßeï");© åsZP@ ¬._TŸòdwWÊIw‰áãªsM#ɽ˜uA“² A¨Àø©LEM `ó=M]4¦0Å›€U¾ ´á¦gzCéRVP•t;ƒ&}2¡ó†ÃœhÆUµ,•º¥bY@¢d%~"ÉH1Ã…EÑõ{è”tXÅ{qÛ iÖ”àØÇ\¨hG Ÿòy-$ÛÍí¥0Ú;¡"²©TùŠXI5¼’–Ft}ÝÙÍÞ9š1»Á™‡[* 7ƒ÷ÙgpF`8‹ ùSè,ðeß5Æ$ÍAŒ8 ˆô÷ÉdqoâDÄ ~^s ·Û‚½¥;n“í,×_˜yø¤xóvøn³ˆ¢1ÍP:z~tÆQÄi} "”ä:¡S«%‹¾ç'‡” ^âÝwÎv˜\>±¦Æ‘Jûdzü1D ½YȨ ‚.ðÕÕ½šµ”zP1‘®ñ³°Ì6sïúK¢œw§šhíK^¾à[,Rއq²ê¢´*ï½ £É¢Ûp;WõD€ºÆM®ÈˆQ$FËy©õ­ýŽ×oÔXÙ¸ÍÌÕ¨OÃKà(øœ_˜Ó}NéÙœ¹ûéó†Ùm m*eä#e¯§P u Lù²Â4èÊS[' 3 <ø9š^Ÿ†]ºåCפ}dƒÅöÈMʵÙ›•2fi.«Œ×'I‚ï¶E­o9s´.•݆ªbY/Ì Ý“UV)Â30Ë”Æ[AVöÂí³`Ü”R¨ýÔ‘?‹2„ymk*¥t}ð_êu#=Õâ¦aœ¡ža¦ØX>Cµ.~£y¯Ÿ—Èõtü®P°Q ÙÍãªÕtúfôØT§W´ãkœbׇ@µœ%̼¨ ¦¶¾1@ÈÄ LHÔTÖ¸p;)ÜÆÂßÿdñs¶×§Â²6¿Þ¦xu´Û~¾µ÷âþí¶ŸììªÂ¸ËSa^)ÄàÌcWŸ.Ã; Ê(HÚ z7@f‰µÚ²V›+µu¥ù<¤HžÈ¨–—žl–—~«Vø°*ðq¬ÔœßškˆÖv7ôGp¬øWy «UúË_^ü{C¨w×ôPñbL6Öhg‘(Ò§Î Ü2Cqæ ðÿž9ÓÁg¥‘Ùê¨ù”†Ó+¥Ø@jÿ 6g˜d&íãÓ¼µPÕ<‡ê–óʤAålÂó'[Û¿íoý‚×í¸“Šëú@MØûÈTå3iË»ÖÞ™S?µK¼<†¡=yõ¬ýäÕÞþN³$ïIJ΄ý“ÁNä›Tdf†I¥731vGf÷Ò65UNN€?:¦*ïÜv³ÄŽÝ†…è5j,—%/=£ðuc9èÕ–Í,*û‡?rnÖtTÅã1¦clM!µlõJÛ>xþroviø²÷|ïwg£7r2É©R3Sª°YзIä—)]H„ÙšHÕ¸Ig×&¨š¢~¢EàÉÔ~“Ÿÿ&]6-ËT(3`—’½´“qÏ5ò‘Ç–$&`?‹’‰E \ÉaR§…~‹½FÉoÖn«²F¿µe|>£šJÆ ®=¤«ìöeyìÚ<ñv÷ÇxùQÂ{¤õz›dIüKÍÆ¿ÄÉüK•𙩠›}›‰©Ò“7QÕÔ¬ûhnU“SLßY“z·»¹æÓˆâcæ[c‹½Õ V“P©ÙâùvÚ,œ‰$»{xxp8#Á²öo2¹R™Ù‰•Šoæöi6B¥²SÈ”¹–°WXeyBá[¦H‚Z@úÝmSã8êËóÁÀPˆëÈ¥Â×#ÆB0y´øêpÿÚ‡ la†‡.63E꛹›H”vÙÉD©Û¹]Nªµ<¯—†|»t¬瓲õú–©ùÜ'³Ÿ°'úþ)yÑ‘»šJÇWƒÓ°=;\uýûù“ƒýö/{;°ŸÎFÛ ¬&››¬ˆ¤¢m.:»&Ò¬µ™ÓÍITn•¼îùÆjùëròúôeÄÞ‰ËõëuKKã7[~—Ã0öŒÕÁÁ’0I_Р¡RòìûÊ5 æ,ÂÝ×/ŽÐà}ëxo{Fñœ›¬qKS„t.Û–eg^‡vµÍ¼®NZ‰vÑÉÛÝÔYy_¥SË3`ç .¶ŒÎÄîKZy2ƒOÅöÖáîQŠ8Äšö§`.gѶ쬼Þn³•ÿ«ÃÝöËÃÝ­çOöwÙ¦ÊíGžÛ½âT»‹†2†a¹4í3†Pp€”-ã'—)ëIµ´Þ’^îÒ+½š±È Ã-c÷ÿÔƒ•€saWœØs»èuºk5:k‹S›³FŠ[Ÿ/,áÐÅ|¯ÞÐÜQM‰Oh¶8ñõÅÇ‚ÒâcöµusTºÌ”`ƒË “=†üÀ¡mýµ0•_)µw]gÙÁ¥Ñ–[B¶—&=»s€`àŽ:çsÐ^»ï^â)p$c~F1æaŠº(O—b¯["?NÖƒò]zŠb•qlˆè,®;HýÝñ`€Z˜œ©ÓF8Íòúœ^–¦ÅÞ”ÅrîÉH‘XÝ™7'Ú@uÞÆ3>Uö_2Úi–°xI$þqãoZ¤ÇÖÀ• Ãj`=´²“¹åxºgÏ…ñ³ÛM^r*È臷_Ké8^ªÞ byI‡Œ6H–R¶Â~ªI.x|áä #0 ¦tlÕ…†º•†šÇ²Ù¼›È`yR½|á|¢ë…ã +&‚ÓQ§°e½ë†Mcaø2‘JD—ôšìmêIÉIÌC#ø2UßvfD€×甚3QR¼H>3Ó1Ý®äGœÇÚu©É•ÈE_›ÂÀJá>ŒVµ¸ùò4)âj¨«Œ :¦‘ŒŸ„¼©~]6ˆÉçáƒXïŽ1Bt¾ 'Äú³±B, «ÿÜ3ÃÏÈ %žÿ;¹!S‡Íy@EüÞ¦AØ‘€Þ€%r§RÖsç8òMø‚1×ÑH.éŠ÷è3r ßÿE|(Y‹9cÉÈLF7àL )f³éŸ—K¥#‘Èf›âÒtž:L ·Úþ]FHŠÂ8–þÈ–B ZhxJa€L»\u®ÍYº3cAr@¡2­P̼"0ÛEß›ž±v€ü˺թX E}Vð&Ås ÖOˆ·¶Dy"*óÌ"'»Ñu„d7Ê“çÛ\Š(AìÝÐc$Ž¢q€¹<0éÈp<š²SÌáó\«%?¤B4ã†;ý§q:í§á˜Q€}}õx(¾Ä÷›I4f£qŽsGŸ9Îvò]šœH&ãÜ £B)'ÿÕ?þi¤²ƒ'Ž4[Iš4ðÑ$s1bÉ)ïL–ÒÁE–ý0B¹(Ÿë µóM6Æy ˜¤AƒAQæåáÁ3 ZÛß;:žyG½Ý´@* PQwF×ÇÝ𛨜ÛüËBl+»Š‚m·c\Û{б!•} v3·9ª‡B)‘£žbf:œ±ºaܦꚭ°÷ùIªåZMFÔAÞe¨™ýlÕÌ’ÌðL]žŒš«öš]][ðð»Gßÿð£x\Ò4ŒB’àdy´Èuz`—f¡Ô7Âh ·Þ û©H7p‡…`ƒtÙþ}ïø£°Â÷Ô*T˜„¼…os\))OQåžé@³lOƒbI{ Ån>P·¦ëNvõ¢mUtvw³Ö¦N©›óRÅÛqô²»Ì…‚ç)3…=k»/¶žìêWApòßfBáLÂq&Á¡~/ä–ÈGÄuhH/â<@™¥\Tˆ=0ü¤š×ü’ÒZ$9â€z:ZÊ¡U°°ðnÊÓVà­\Lmåi÷`tÔ¹¹cê–Æ:}˜ð›òýT^aÅãÅWÑÁxº>ÑÞ­Ç ¢”SCr&PÉö6DEi{ùðë\¨ÚÄ?âù¤¾MeTŸ…/ý—±¡i·ÀŒ`¹,ɘ «ì={*fOÎþ{x’¹sGãL%œùCФrBÉ«/{Y ¶¯ xN7î/ ò. Ê‘äbž  bn,¬'Ø_—ÚK¯7JWËbâÕÇ8‰^—3•tC‘HΙ»€……SÞ~¶½-o"léz!«=Paqè̇¨9ëtVPc×9ÇDÞŸc?´JR ·€vWäpwú¨Aê©"TïcU•褅ðA[>êˆGÍÒZý‘X«ÿ~€?¿µUüµVb¨6N„6ÏÞØ§#üÚþöogãÛ/Úòö™T÷ï·¹ÉÛã‰ëÎìaûéÝk?³oíßpÇÚÏÛ«ö¿Œ\=e‘ŸyÁùhП˩†«Þµ÷î‹_ŽŸï߯™›!å»ù]3)u¿ì'¾¶µÝCµìY9Û[g21ÌqºV”’>`'Ï?3/p,†%ÊÌ·|M9dÊ6‹æ,ãKœSŠ™g“à–Õôƒ÷nßïÒkëÅ ¡BÔÞ§ÌÈÛ¸æQz¾ú²h4*'TY ¤MCS`h¡f$0ZK R””ˆ7 ‘HYÎBÓéƒ F“WI,…ïª%®ƒYjà‡³æÍwé”i4{LÈ-ºj=ôzŸ5KÇF4>óÎ#ò(5†é Çb0,Q~4¼/…Mж­o¦°ˆ%õÒã‘Ûï{Ýä—òÄó²êO®œ-í)3ã¢Ô ¥ÒGIFÕ„ŽhlÿžÞs3'!VÌë²X"~—zU­ó¬Î8,Ê¢¥.^ݤژôš³^›|€ýÛ šx°Ù¦KP²±ò%Kf.zQ8 ‘ÒÌ Ýλ¢CÌBꎅs€4KµƒUQ;µð_LJQs£N _±ƒúv Ç`W— C ~ÿŒDJü±‹¾Úß=jVðÚÒ¤8 ‹r@¡½Ýþ|µÔÑÎÞáî6ìÄÿÞÇá°Ö÷Þ{}×a¸>NB›KØM~–v8¸ÌäÒ(rÚP­æ5wðêøå«ãöÓ½ýÝ J½Nbš¯ÕEo ×ý r6^À>4 Ç@nî”Ï]ÙŽÕ“žpÉò’™Â¹ZK¾ËÜÉUrjnR ,íX¸Ñ½³;Ã=`TQ(5)ë¢×½I?s»ˆ €âL¼8"Í™‹ÝU×P+A¸…t%6 € d¿Á²´ Cº¤IV±¤ ãe a†NÊgëan$˜±’1pãº/F7¼Ápt•ÛÐÞ³_iëøx÷ð…j笞âdaLdžœøZ£Œo¼šÏ5!IŒ“¾ü&§e-v1E\¸ÒF–ÄêbZŒº|iïv»œÂSæD;ó‘ÝÇçjàÔÌ åb¹ ({±ÚW"óÂá¾wý>m„a€pÝ1øQ’ÁÃ)àIâçfš«8…ü„ _oÍ;“Wû5A:3Ð=‚4—f©¼„¯@š™N²Ü™Wq¡©@ôú˜¸4Œ3‰¤ñ½cÝÙ·ÿûppÄÖsž·9‡JÞÑÌ}¼*“ô© ³Êg¾Ç´Pï8{ަi^B22œì)"I•ý¶ML6œ˜iÌ‚S”)?Ò.\µw²ÞBQ T­ãGcX½¸9óÇÔ–ÚuG®“[g#Tí< ©yœ¸j>B¡ŸµdOϸ&q,&¡Â'¶À®ÑÆ[J×1ÖZ•(k5’\h/M_(XDpB^<`ËáØ]­ïŸÒb˜D—ÕÛoä  ê,,5àOc¹”g{õ:¨ù®ö/¶L›Ögaëųæ6”ËoÂàù’bòÈe'<õ4©E³Œü~–fés[+øk PžaöÆZ->/j2ñùeÆâ=@ ÿâƒb{£Ñ(/¹§q²G4¦ªr½wYg ¬Ë_`= ̸%Xä¡ d/”+5³þV”Ö‹¶6I•6Ì)^®pԠ܈™%œgÌ‚˜âmÒ¶6D8Ø@A¤§h2AM¥61mЈêB®ùåúY§ë–0÷¡ñŽ(¦ºï€é=Û;æÅ‚íж‘zòms®n½rvöŽŽ·ÙÝþÕ]É9¡¹â—ß6 ±qÖÂÐÑù¹rö†|š˜À©sg¼Â¶ Žé®Žº¡8êÀ´~j˜9µ2N²ÜB ¢Ž/I'ªÒ¨Kåj©ÌµJúS£^·¾à÷D'ªºD7“X@ª `%§ÔŸªAYP=–åÛñ9ßnÊbQë”}&ÝOh¸~K ×gn8>Çméf2 ¥¿É4ldªµl‚dõb/°û{ÑzL0º"’A®`PFݼh©™n•’Ï0婯ô$'¾*˜Of€™?3T_bQ±™h¬9ëÔª~íé13±o4¯©äÓÉDâHÀéq°›ÕÈÎë‡RKÛ~GÄ¡£¨7ä/Wƒÿ0º£s™'#“ÚuN7º@|øà>´1 eJĸ5ÛA¤ç\³VjºÀ¾´:åÄç~oÄPÚá¸Y^“_Þ_#¼Ø¦"›‚K.ŠCoà N½hŸS×Ü» ­!ÇÌÖYÉ)ÊËÈ÷½Kô-âKõ—Ö¹×ïDzÍÈY^X&ƒ¨TEy/·0s­®t"çA=P‰î+qC4j³ÊÉæ¦Ê_p}†AÆ]³ñ‹tÑ"vånvM ‹7uWomº°¼³èõô%™´!—ãµd!w1ÞÐ/ ¡,Gõ*³i’n°pÎZ4QŽŸg]‰T–—aK®Cúüe—!59qÊÉ"TUÔ”ß'-Á¡› ÂúTÒé Ððô’}§Ûüë½×¨Íyµ¿÷Þáòþ­Ìój˶²üãåKE~Ò}}8­,Õú(ñWëE½» ¸<:ÛSÓíõݳ" a›Hv &^BÏ™{¨ôjžJ{óT*¦áÙ@Ì@¨\ùÆ´ÊßиŸB±yÅݽ## YDS’ü:™˜‚wÀËih+h|PÒ&m“èd¥¤hå*Ûã~w¢P·ö9M8]·(FˆäJYãÆ7ª¢¸ußx˜¨ºÁ#¾Ýq^jñ@÷ng ~Ð點VŠ »‘ζx¨Å|ä×›ûE~®¡Î¨`pÚ+Dò¸ìNÑ'l ›3ìZ~ä³`ÝF>ß·Ð_C8͹ʹL‚1}CPµoº#(Än$8ž¼'T(Úô2Û‚þ>i_ØFï#D;À<ÂéûC†8&oi¹ñÚ¢ì`#ÃÔ.xƒ7ôb3…ÆoŸ·1ö¿5{Ä\o(†wæÂ;sáëLbû·ÄôoÎòoÂðo‡ÝkÞ= «Ï.dó6“Ÿ…Åë¤íSÙû½ô/ýÿ ¤ÿ{¹ä^.ùÈ%Ó4±êfòX\ÊR•MVt€ÊÜ”l»0à ×ÅSÿRÕ¢p8 é0x]ßy°á¹§hlI¦džJÐY0h$"ÎÂP›³(×ܺ¿{ƒÁÈ‘ÛÚew©çÆ#/ªâ%GrÔI2<Ç« ‡À0ï/ôøÜ‹Î ˆü>ôÙ¼ý4 ßyh" õ{‘-ª}Ê =4Ž®âßDÃu”ùЊ Hîñ©¨GXlñ£,¼Ø;Ü{-Ò¥·ðYêÑÀ?sÄvÒŒ¤À_cq†£Ó~ØyÃXAT‡C\tq'–  m^Á8» Æ[Fà ÓwIthôG¹GOåÜ^|›PˆŸ»A·O›ïÒô#r˜Füv(;0«ŽHOBr0œEáx(JP¡×+¡‡ÀQcíxøn5‰29“Ä„†ý+ Žê‘ŸBì \ Á€¨§; ¾‘T/ÇPQzä 'Ú‹³ƒWÝ0«ÓÕÛÿQX]›&cŽa-­%ÔËÁ¸?° ì¸QŸ;Êö“£šAŽüÔÐÚùÕÒ×Ò‰™ÙÞ‹£ã­}í뛎µ-ëÏièòÜ¿„;¶•RP{!NÅ c¾Ž"—•Ä}7>gçrÈðú2.˜.yoÌØø~qi ×°%Õø»ñ¦³ý¶[T ^ÐJÇ/ CÐßô+ûq²´™»"Œ×é¯Dz:µÅÁ¿–S¦_S7Ô’[U#]âãàèé™ßmˆƒcñ ¾ÊŽ›0•€ôð" ¸X¦¢f‚‘•w´XÂLxX§¢öÕì){èJ/"àS,­.{CåFß>S+'î„øQ38óøô/ÌàÒŸ Ê­‘íàÇÔÓ¦^áß|ƒ%/ÝxˆBÁd° $Á×Vhª1w ìí¨oÉ[% Þó[çúø'1]ÖßáŰ?ŽoÔ_Éþj|tõ;"™@Úxéh “þËKÙZ­¦Í íN— ¯Òr= ’xF(å‹0ù‚ƶ :>–{lU3^b½Ç~9x‡¬& ÑïMÃJ­3¡‹¥“áE÷¤aÂ-iÔ+ÎÛ€yež#¬ Õ”µc¶²züÉTZ›å$NŽZO¦Ë²®ŠP½ ãm/ðoyÛH] ?¯ U\jˈþ›³qebÿRO$ µ²½(1̈]kå Ø,Fh‡F£-»Ä<šÌh$ÝÃÚenI{¡p%¶'B&%¹‹ì‘¥²6K^á„­›I°@‡NÅB ×$Á*§óØððä”TC»‰ø±¬ÏÞN]²÷ÙUŸû…B2ZY— ·zA‰U;KêsYo)9#}È2žs(öâS½B‰Öߦü ç°oâåp„©Á>¡¸¶‡¡iüà]lZJõÑÞ›j/èÆlÂ.âñi<òGcæ«éˆÂn='q#õ¬Y)>UœœºGÛ‡{/­ªühjÍ­ã-«>0k‰Ú@^p¿ô',}¡îÚݾÁF„†h5'.â¦(é« B{çË Ð0´Ó)E…‘.15]wƒé¤o6ôpR– ‹h!À}pÅixÆQj‘ªPñEËs`F7< <¾Ú¢‹)c¶¹›.˜Æ¥Ð¢øGS¬Z¢4Þ¡˜®qØô©¸¡Ð±1^Ý{ê†í—ð;²"8¾ë–‘eœ‚<ˆ¼ƒz.«Â˜T˜?jL5ÎìºwáÑ8¶·Qù÷èªO5%¨M­½¦À§*ÑùªQf—mzJ?¬}[•Oå•4ßüéÌQÌ$Y¦.<;ý:,ˆ$™íd±ÓªÁ\¢g>¨û=è^üÌ,ø|¢»A?¯*ì1dROâD)Ud>Ï!Z™ÊonÂ`î G¹×WÞu}åÝc0?¥¥#òÆ”° N®p¯Ú¼eÕ¦ ‡c^ÿK´˜}’¥›ø;¡µtÑ­l±°0õbvxÓIÉÎ ïyÀ“q€úáY…ØËçʀ¯v6õx…ï‘Æá- ¡Ê€r¯£Áø˜Ù¦j±î̳=¶òzà¦õš×¿7mpÛ’Ì‘£¾ã8k*¸9æN©ý&jÊï’/âtáìGW’ÿ«vË h¹Ä¦¥¥¥2—–îZË­Úr.·NøO CQs³%‹KÛNë]òŠ sš[ïK­Rk²¯„QºK×f@ê 0¸O’£.QÇYëµ­ï•ñÈãfùgsg5LÖ  ÁH(žÐÚªÛrpƒ<™pÔ…b‚ã Ž1ÛP"Ñø¯­þY±€ ³/k’)Ì"krh¤ á«ÖÛÔXf$Æ,¢&¡†G®¶$­ÑàÇ‚´ Ÿ$“U=“±’j:Z’1 iýâ4–ÑœÉ(^òh8ŽŒÄÀº]BWà©À»t"o4ŽhÌù¤¢,áb4Ú6¬ÓNÈL*y˜*# νþ˜3q϶è"ÿ E…ñ ™:cDTdÔ+\¾£1y$ 62šÇ4ÿâÜ#Žtî7 ð‡/WبöÂW‘p/0°6òÎ>Ù}½»ûúúeÉC `Œ\¤öI‹Ïu¦(}¸³úôÇè 7f3Ý®ôT#S]}.ÄS6@ŠFµŽu€Yqo/œæHò71Þè²1 )õÂG:^„V`k"uññ£y ð•W©³ —é÷ô-qxdèôU’ ÝcEœŽG’¡7áô 8`pE¨Ùñ"ŒèÜ¿‘vì~2ŠÔ—±Œñ8ƒ2ÍÆµ•¾²=à"%¼ÂMg‰t3ñg0‹5O¼Ëadb}CTÞüQ»ÜZjÕëË­*&ÚCÃy+¶gQ§g˜…{¢ïb¸GM>9:õ!€Øíaº:µ$ƒaðžÛ=kgd%Uë×€Sl¨C mó4>ŠF%ט£Û~åSâ÷ß‹’!ÓHoH)é% 5žç„8¯²ŽÝéqÉGJÝ1ŸVÒ§bE†pEšÑ) Ë Xá\ª$æ3YM’z®DM¹,¬¥ãH‘§ õ¦¹~§H@LŸÊ9g‹9Q/™K¦ ;·NZUœ'Ëý%e¸¯(»íõÄ)ÈYâÄÓè3l\w€¹Q¶ `œ#VýÜ‹½è['µÞ¡‚5ǪÍVçõHÏLB +9ï'í–ç"s»ø"Ç#à0VAœù|dV*²¥Á2—s&±ù²7Z© 2¢FÀòÎ|’,ÿªw³_íäWt:²gäºç£Í¯p@JŽDê<ÄË!÷<Ç zkI†„-%ÿôWÓN‰³âöѾ©¶õâhÏ ¬«âÆ"zã€Mo€ÂF!f%ŽéªŠbó²Áº*­Ë_~©ˆsïÒH# Sˆ×¨  Ÿ{:W<{b4ïÒ1oŒæú£q@ÞWèþ­æˆD`3 Fý+1âèÚÄpcQ¹ÄËÚc‹®ü€oIØIú¢ôIÑ)»]6?:óˆoóµ­ ñÂ.ám#ŸƒyÃVW+ÿhBC€¨ ÷Š4Žœ ¢±·Â* bJn¹WÐÕÿxhÒÔ÷ܘÑÄx˜iËe£å‹È‡,ƒn6We_hV0Ê$Iexýõ° ÎðB—Ð8^ H•aÜ{ˆëÛ}ÃE³)VÅÏbMlˆÚÐ)RÁÞ“çp{D}¥àÀqÁ´ódúœtاX˜œjdÓ ½ó"¢˜ò±EÐ[&…¼ gž!Óñ>=8Xº¬âŒQß/ûGºïoð¥[Å®#¢ÍÎcYÚ–h®íŒÑó’Ö0/ì5ñ_.-÷ª\Ì­n~J^¯›¯eu.‡®q°j¬ªêŠ`¾²´\ÎNè·â,>Ç®ïl:|y¿™#J©[E±T„…VÄ*Ý%âç7«oª¨¬×kÉkDN(&udÈ'دögß ÎúïûMàí°9\˜I^-g¡¶[m˵ö//_½n¼:ÜÞ-ÁÃ×|ØÞ}}¼ sðâ¨Ý.±¨ò¶“[ ‡ h3Ÿ[&Ä L¹¦d¦T}Ò—ÌI†¥K´œ³}Ð .«¥k•†ÅÖv{{kû—Ýöo[ûR¹›Û)/«×Ë •˜ûYIzݬݟõ % V$¸ælm`"!à¼ÙÖR¯’Öd,xéþ.r00__òP9QÔ•%TÏHšr(Ìà*9f¡¯Ü_98í_zp7ÓÛŒƒ.ìh°Yuc4îc0†QxFEfÔåL’#ò,’l‡ÿ `hs÷\Ǻñ9ßKÌ6x$™V+~¬±iT@جSŧZ6î‰A®¶·Û+¨0î†Ús]Œ.üNb›ŽòÕO Ï#¯GVë!yF°E¾_ <#üzÈV¯,,…+TÁÎα•+vù’¦Ä2dNf>¤Œ¶ÑAÛÇMtM¬ëätÛgSSz°Bú+²6ƺ±Yioò¥kV¬bEu—¾‚+è[Ñ•ˆ—¾yéVEVÚJ<uJ^n_¬Qâà×Ä®@ÆŒÊà7PY8T( yï.Ýès¶ûex {º2ÀŒÌ©BI÷#»³ä•H«Q²eRfH !dgoI·äû ]yˆ6Ék‚ƒüs•§{¯Ÿïnà™ ]†¢È!tži|{[ÃTS”‰ÏPÄ0àž`5ÃZŠXÀÅ‹±@ò"¬Š¡l‰>4àE5×ïÑØIé”–erqÇ£‚[ázƒA£hGÁ¯ü˜®JW’Ë~4ԇăŠË7K­òÒ(¶á$ßõ£jC €ðx{»JK:€¼.R–‘8ÿÒóýÖloÍçáý8~­fŽê »ñÄzÖ¼(Ìü¯ðiÛÇsᜀn’ꢞ ôòe)a…]ù$ÑŸ¾|ÙÌÓ1Kd¢R½|9߯¯Ò(Ñ2ÿsŽ0o…Ü2i$p8 œh˜—ŒR8°º„½E €ÏÁ€D OvüAÔF‘Û%‡f·_J„7¾ÚÀ2åŠc„$ô¶ÃwMê¾:q&o0Xi»å ôJ9îr.Wœ{nc>àZçœg¤U!ÞxÖéÇä[û1êÄt¦Cõ9Nè_?g°ZÊý™Š½dëûŸúþÀÄó1ò“Ç^4Âo>^êïl·ÛÈqYIÑ]áTÁ¨JòE,<ôFÃy‘ç‘Àg2yÙîÓà ïõñ jÛ·@—±´Ä¥0=‘GtÝJŒ è ,¨K“‘ö¸,ÌñÑU0reZÄvš<ùÐŽ|4k®ßŽt¸è÷øê›±ÄÙ YÓ«1ã,Q¯4†ÕÕø'÷1;_tg4N¸ƒ½Œ—Ù–…r¾wû>F ¢G¿öuÈÚoXº?{Ðç‰ûuE µ9v1Mà•X/€½¯Ñb¿™e)9fA•#[u½‡“ÄݘӭMˆFr§mt‘}Œš¸ŒÇd“‚"’äãSãÿ%έ”ùIy_wlf°á°@7Ç èÝ’| }© VeE´éа ç†íöÞÓÝý£]X.däÈËE*7ñ;8ôºõtÓþ6í÷d”15 Oz8vÖ)›‹7‘ÏËÌQôÕ~sE£+Í%ÇÒN”Ž&ÇÏ”Þ=ƒ¾gÐ÷ úžAÿÅôò÷³O¢EL¹U’‹èÕ]1•Îi”ú? Ë“—­\|¾—¡'\ö>5lWÒ¯¥ ‹P ãsì¨"jL9PäÇ1ìá1 ¯_Oœˆ×¯y&^¿¾ö\`Õ‚ÉÈB»Ñt\^¤´£ƒìëת·íä(PmM¶óœ”®ÐúìÛoEþt"áè!l×øœÏЧðìWøwÿ.ûÛí߇À.ýúõmÄÀ6ÉÀ†Þä·÷Ái'„Á&,Ýù8ظ‚í^;ÅD0Çé©$}zág_66¶95všàGmæp€”ÛãYçڷ—4¬IA´Õê“%ï9ÕÔ0Ú cw2ŽvŠMé§Î4ʘ;”vã²Þ|ù`Ú +ަÅRá´qj_݇ÔÎ ©­h‹ JÕV¾DiÜ3îÃL߇™þï 3}Û¾§Æ*˜ÛûÔ€Qèš:ü~Uƒ,‡ ²®ç}* Óÿ|¯,âô@M¡þ–}PSЋ¼PsŠ]Ë6 Ó¾Z~¨RUƒž¨òcÊUPŸnd×øúõuR­“”U7uI§Tû™r§K•ÌqLÅî(ÏT…Å[öM5ä-.4k¦sªÅ-»§Þö0LÖ3£yS.ªÖ$-ü—ÍÑ_ÄKuÖ麱§*"n¢ý¾*Pä«*©%ã­ªfš…y¬bCÅ.«|BJ9˜”šuZMñš\·Õ)P‹@êsÆßæ®usî¥ù?¯­µ#ïϱÁ!í„øÛ …7L¾ýåî†2ôä‰Q$^[=ä÷¯‹µó߬²ÂtH92Äej”<Á_OÔÆ£Ì`ˆ±ïÅOèÑJÔãÇ||c?¾­%?&¹³Ço›m(–ÐÓ3ì¡Û`UüÔòëquµ7#qêŸAÓhBADáçÓ¦c‚jýÞ0V½@? Ñ[ªŠŸT £Âö¹ßïŠ 1ŸöýÎÄúZŸ™b 8 Ï4¶Ÿø÷iö?æ¤mt ôÚ§‘ÛyçbY‹|¹+]¯ÓG è¯yš  ?æm|ÁՒ~òÍ7¢!‹gìvÜxô“ùöñR§*[B³tyšeoè{¾¿y»Tý ÙhˆóÑh¸ÑhÈÎ;ÄE¯^ÔôŽ:PmÚX{ðýúk?§²ŽÃEnáX<ŸÌ•ߟ¬èU\ôJâËeQYÔ$Û"±MIÇ)TW[Wÿ¤ŠV–L†û¥¾íˆa=uÎI[ ë¥Ù¡}E}\½ÜLÌÏi?xïFf"«‚®¶Ë ó[aáQÔŽÏUø¼Ï´™²/œj÷fÛ© +½¡’³UþPVø¸Ù™<Kµ\SJÖYÎ[=ƤÔý¦|¿)ßoÊ÷›ògÙ”‰ßifgîÅ©7·°çñ½4£$çDu_̺Ù*ë>8 âš{Œ©<‰²™†ŒÇT jÚ\©¼Ãíg·è™™xf/OûéÊk&í AßþÒ†©i™¨PEhÇp=Þg’„H›///‹-#©'¹Ô³ n‡AN@æ7ÆdgZ`ðÑAž;S·,ˆëŒUæ”®ý²õÛ.=·«×•œ^„©1p¿ÕHÐ&œ,EŠîù¯SÿÑæ§´ß¹Ñõ5ǯ%ïJÀaÄQør”4‹ÍîÐoË›ófe­¾$tƒkšÓ1J ^2B`‚<ŠËåÞ RcaÝ”¯ë¡G‘‘ÇfñK"4Åd£ÄNÙèN©óNã°q•eª¼ÄàP1!¶8–ïŠäøížrl*?P‰GhñØê÷š§Â&'Ëî‰4xÓjµJ­ÅV¹õM«‚VõXô­Œ&“^²ãÅ}“ùÑL[yiJÀÆ,rŒšn‰Ö”æ%Jò¹!*h%·YsE%öFÎìOãs¯ß—ÙÙi¿ÓOOeòÞÎ8Šp©T%v’Œ‰èÙòœœŒ` µ}iˆAÏqlÊ÷Ê£X^*Ñ¡‹™@¯È17e”·«vÿXÀþ=ð£®8sµ'ö`ÂLúd]ìÆ’w&žFž÷ähG^¦Ä™âÅ€«TÈÓcb³ÅdŽªäH½äp$ˆsžú@FòÒNÙÀ!¦ÂlÈ0ä¢=rÃAõ8ƒÔž0ytVãºl%ƒ©ºjû¨‹ç9kh¤•ìJbý±ht½÷`ÜïËb¢È_F5~I›-,âltý.¥î’¬; F{34'[;©Ý†¨z-2l%ŒÖ•$ÕÕìAe»!G€CÀTAœ&H Ð; ]ëT ¡a÷c ±G¾k¼ ~cß©4i+bûàÅÓ½gí£_v÷÷)ÛŸ£À”¢4åcÀG¬«A ’§9ô#R“ÁÔT«˜ÝS8ÖåxïhÜAWC¦q‚y„/ŒQ‡ûr‰Ø*ÌRzót!87"y~T—V¼jÞŸ¸L ÎÂÈEñ?ã„'H3"XÞP°©½ä¤H§üX {ƒ/«NÎäàÞÐÒˆ ¼ `>V§Ë>£€³°ß%&TÓõ1VàéX½Žÿáp–+Ÿš¿~Øyg#pmØ”TDúÈŠy¶(@O«Ü´^À€œŽø(¥Ï–´}Òpg@Œ‘¸Šhù W ˜‘;"5ÔúÝ&òóæ¨"9ZVRäðXs#Œò³¦ aIÍ®¨Šo8vQ·ü2SL™€Ñ„ª”¶Ò\\¹ß ÛxqðbW|ƒÀÔËQä1Ú4¶q{m–âoþø&Uó›Ír~iÌ_ÆÄ2Ðbw> $Ãé²aÕŒêéîp2‡™»Ó*“ª:±?2T†\‰Ê;eÌßýDßU‘ y¯\®\V0iã |O®`–Ʊ3Ên”­§Y‰ H”ß6¾ù¦q¶76©âJ¹Ñ¨8=64•E½ÉdÏ™ÔPéÄÑâ—¥ò‡ç{GG{/žÉ4ÒÃμ—ÉKteš)Ø&sAJ8æù@\úú)áw~Œ:‰V©d…ùË©—SKÖ!AˆÌd‘øˆÊH$¢LÕµ³T– E­æÇµ>*»@H߆)ÿ -hGã ™T)i-¦]â:W¥Ú–¸"!TdX&d`£0D&†4£‡8Å$yv0hˆŒËÕœdÚJûýv|~³yNà˜SV1çL©Åç{®óëæW-ÓŒ•_!Ÿúù’ŽcN‘)¢°Ô{Uè{…ÕrÊ `Ÿs Õ,ÁÆüKxáÁLW ¥¨A¶ó†!Qjõpw4¢°¡¶±eÇ+¼Í÷P[´%Ã^aNWÜÎÃ@ž*GLJ{/+Ö±ë= ý,T@ºhLÑ`Îå:¯OI_hœ¶gr“œì%ôÁ®ö‰ñ6ÏP.¤;æADóq ÞC'×sˆÞ4U‰{¡b!…©| ¼3¾CÜÍrºãÎ$z¸¾W’Kj§ÐO?³ŸPÚ‡1=Ø´C£Ä #b ‡™›¡ÜEþa ÿÖ|‹y‰‰l»ô=_™æ‰(±vǘ‰µ|òûìL'‘yÝó™LêÝçe59¾†²eÛÛPN߯½·až·¡A@ŠjL{b“cXlœ¦þí½8:ÞÚßç§]ùpë9…^M$ù*Þ¸Õâ’3'Ûu1Еçvk¤¼CîRNaÂù•rs{zþëÎÞa» b¦;:oˆ9í\æå©"p8jĽ‹pnÎVUäÆÍý!º0ã]H4s…|›´ùŸ‘• ð•Í”J‰O)ª§ðrG,.É{ï g ½ïð~<òûqUTðˆÚJ•™ö•WêýÃúQ’›j‹.š“:¬k1“ëŸÐ\Hâú%ºÑbƯç·+ê 0ÃÑ»l<´¼²„Ì'|Û±A¹ ’¯+àŠ39è¢ØÂ€µ}7Æl-虓`Ó¥L?¼ò≣L ±ÃwO¸<„+!Ð¥›l—Øß\…ã¨ã%÷8+ÚL†ÂâéXa¤R|i1t;ïÜ3`q‰&·ˆ˜ÀzÉÝ4´Y”*·î *H|¾Tâ~áͼÅ#û{o!³8J¸ÌIéÙ»ÿIïÆsÎÖŽûá^¼üà/ø÷÷Œè±õû¯· G”\ùž7ùí½¼\,/3–î\ÌìVÙî¦S<ë×_ºD©e+Ÿ}Á¨Ôb*Ç ÌŒ?<ßúu·†ÊÈO¸GÄ6Ug±+.¬l-aä)—Va”Vñƒui±®î'*qãÛÆ°œ'n¼ùíýg«ö¿«µÛoíÆYåÄ4L6fáµé 5цVçwûIl‰IEüÓO-iNÈ·ÎM¢Y#>w`OØpþEC¨üë_ÿúç?ÿÙ”8hò׊²D\¤H/‰ ?ŒüðFšè7ko7Än0ò(Ô- ØöŹß9—y°O¸3ŽO³üdM€yG­¬'÷{Ê0FöðçeÙ9©W&†p‰' S?K• TGÔm!é¾Y…”¶Ê“Á¥¼oûÆA»ÇmÄgóó¬d£ý6g¯¤/U£ž¨Æì9,™ekæÖ¥wæ]V»g"¼ªê†£fݸ²^´ÙŠ5¸³³ûDR·ÚÕ>u½!žòÈ´oªñh=ÀÌD*´‹õP@qº³.±‰-|‹Њã[ï ‹MTv_ìTÈ®ú#½ÀèÎÃg!õRŒ@pñFNýå//þ½¡Ÿ;"¹…'¡ c,^¤˜…DúV8Ì2vï[’à:]çyâѧGQ‘³^ÑŽzŠ,4µ¾Åaqв`³´X¢ï”³¡é´á3“g3ààºOIFDó„QkP Vµ,çEÙ@ zˆVºeÀýt¹KV nW¥vP±gÈÞ¦‚-T4Ç’ÝǨ6’# z¶a”<æ-ôôt¶ä<÷1‡+ÿʧrÐBÆQ¢·¾äD‹ÇG&gy£·²ð¨vÈ8kч˜ã×’J K•Mú˜;û ¡Ê„q {èõdìÂ~©¥¢:X€Ñò3bâÉ}êG˜jF²_m&¬·D LöJ»Vó”HkÀ,¼ ë+L"å 7g°Nsr>p…vR¡­*d½lÝO`¿i–‹ënZ×å¥Ë Eí$LP õŒÌÕU¶|ˆ“²õØê“­í_ö·Ž~iVZI¹0›a³+ä¾øöñá«Ý¦þötkÿh·YY¬¨]À(„OírL‹‹0#3ýˆÅE,-Ž(—0²•ÒÉ€¸}ÿ?|NºeékÀN¦â¤ÓÕ¶¶ ÿ¢¹/[$’å¯y{!µ½ò’Ì%3Û"$Ï bNŤ/ K¾E0¤5Þ0ì÷ÉžŒÎÈLÙ`•j{õ’âD²Y1¬pB8Ê5’^BöÜí£¶ò*±¬íšgÓ^ÊœRÚ€™Ç°”Q\Z’ÓÀ&;´ØÚmä(jz«$íIg¶(”Áèä(ŒØWdµÙ¹:CQ*Œé¿ŸÑ©÷wK·º$Ë&ʼªmw¦?›ñ+¨fEW¿¨Xq,t äHQòS¥4Ã>é“‹†Žn¿Æâ›áVð©ô z·õêø-i†ü˜ZÆè*RpU ª`g'5üËîÖÎî¡„Ã_ ±ŸUÄöö^<=²#~Ì©„Mc¬D¬‚9!#qê¡¿€8…¹¿p£.y{K:õû@hþK9¬¤zxE'±Ïkõë—dg.“q£lv†hüTEÓGÈgj6Vp±o@ùŸ¤"¦[ëgÁ¸Fg 7êœÃ6Ö8 ú …§ÆúêÚzmõûÆ >[…Ÿµ:¾~|# k%:8´ÑWjI*9èß™–PHCÂÅÁhI b é†!`ö¢Cã­—¢AÛQ•Ó¡“Õ–P‰±»”8‰Ñø0FKÈ-Nk.)ëùñÖ!µ\8-ÿöâácvr6™E˜2ŒP_.ȶ¶$p(ñ9Y¾W™Ö¡9ä¾°kgDW_8+`DjRþk0ØO‡QRVúa8$]˶AxÌ—r²3™ÓÓE$ 92ñ;æA”‰gP ¢•Û¬À¬aQà<—¢3ôCÊRaWxaõ#îõD ØA¾¢æ¯B ÀO—¼„r΀ÂE‡ò#—dLåX†tÓœG9”HÉ9¤LíL8µW*JN»½È4°¾’Ž£ÿè •¼¸!%rNÉL/Jr½É ©‰Ö<¹ÓÐV ädäy¿Ò<À>H˜3ÃBÉñ ÄÆix6Ž¥©6ßd¨S(Ò”ŒàŠ djÈ܇™ ‹ÒÝ’àºèqÇù±¬°_^Ö^½¦¾u:r—Æe’íŠ+údòúþ®¨ì€¼RÓW-•Úsx0¡ ¥¡<ýš²P vJu÷32ô8€%xÊÚ‰ÔCðÃ!Z?žIb¬j7h‰ÉÝ—©G+§›á+ã†ÆÈ¬¡=ŸéntºÙŽýî1ªØÁ ýs;£˜gÛ GíY•ˆV²ëŒLùÓÆÌc0ÑTp‡Ã¾ß![Mc9 @ò冡æ•`P ãhüè!ú5qRç½ímí{ÓB6Ÿ*’«Ñ9ôV!è~"¼^;@®Úút8"x4Z5¯©1ÊÜʼn‹X2Ü‹s¤êŸb ˜0£Ž X“¨stâã‰k5æ=fšÑñÛ¼È2ºTÔÔÿ±¸ÜZz£Ço—[Õj¹ÑZk +â'QWç±íYLL7¶‡*"–*}·ö^‹m#Æ6çž~Œ”ÝÐ\¥£¯äToñ@<߉GF<Ö-ZÚ¢Q<ª”ýJýuF¹@ù,‹C)YÍÆ£²Õ¤4óùÖx "$ B9 aîa¨k«êâ¢nu¬±,÷ˆåF%Û–P  MÔ'ÞÒYýôÉÈËÐ|eè‚9Õé•Z§B\°R +Z0qW–'¸R×Ïñ¨ L±$a {ÝæDþ£¬¿u™Ýƒ—Qh‡:2«BQ±¯ˆêšîÓv( ýÎ4ŸP¬dóDÕÚ8äü¾b/yÊLAžu¬º:M6S"³q ÞT$"v€‘6-´•?<ùŸÝ×ǵð“.4ðƒqLEKµ8~)vn c¡‡ T5 ©«Ä1ÐìA£$Bokèšf_ŒUGEöÐúP]Y2±J˶G:F@1îN¼9%=ÙêÈaùîÙ È@¼؃ü,®h_«qU©¦ñ®*Ò„Òü©Ô‹Ó²÷.qóõÑã@—1 œ°½"'kÓ¬ ©A‘ˆ¹¤Bw¿ï|/>òßø³ž)˜ƒßà‹Ô¼™+Q‚Ãä;\ L…¸‹»DläTòhÎÝXÃA´¡šçÊc—Vä©rº¯îˆc©ý]´FOÒú»ïôòm\ů¡€6ç¦ó«¶ŽdEÉ…Tœ¦ã4µ^UÞúËGÚ|æO¦©©¼¥¬©xƒ´PG 'MµN’âò:ª™âSb4æ¾:†wº2{–%2„0Öˆ5¸?O [ýeŽ!Dú!ÏÍKOwظ? ¹ ÕÍQ]cîí ió¶#]Éò:qpˆl™ŒÇ(ð|ˆÌˆàœ6Ô,ˆÒuÇcÌù!i& !¤Ó”‹<—(S+1ßÚï¤2EÅÅÅH` qª²§Ájàű{–d?§U£ÚÂU Ãû˜’«.)®' ¶5dHteBüËÞ÷õUÚQ¾¯¯Ñ‚ï»´ ÇqÿjCWXtÎN‰´¢†¸Áíâ:”}ª² ]ÐÁt`ƒ½àÉ=CVcpŽàŒ ž©G?ÔW'·ÌˆÜ0Ú{Y±‡œð×%v6Nõ1•fâãG#„W°ÀÙÅ«ùÊbcÓŒÀ2ÛC±IцèÊpÓÁœgÞä:}¶£4¢žÃ z Y‹òÙê6f{{g÷åóƒÝ¦f¯3TwðzJ%ÍtAEì/ %1S›(À<°Œz.®Ø!TTW\öÓÌUWN%¾òÊ«ÇZŸ†µÿ»ôi¯_ß+Ôîj÷ µ¿…Bmâb¿×¨ÝkÔî5j÷µ{Ú½Fí^£v¯Q»×¨ÝkÔî5j÷µkjÔ&Ÿ1>£Jm†ÃÍMuj›(RªM­ÄZµ×¯‹ÔjÜ–^mJ/'(Ö fžf OT­©jYÝš®ÉÊ5Ìj}p‡b:ÀX)Ðchq%é1—€­—vÈ9”˜é+Ó!íƒ_7•PyádoþÍ2Z©Ÿš ¬m “Uc8P ¿JQ+Ñ5¼ãI£pÄÁÜ€9¹g°˜âõ# Óž8–«µ 4¦ûå7ëâ§ŸØ ì Æÿpœc'¬®ÆFœj²QVC"!3]T´àI„Ðbèºßóaüa Ž¿š%¯ÞÓT|ÀJ­WQì™BìÜ—„ æó8,Ãèʱ*óÔ;wßûØ=8Q 04 NvR¼ˆÅB>Ë]¨¢%”}ð /Ôiuݨ»¡€aŠñÇŸ!ÐF\¼Qã½ï]Ô‡çßýnó»‡ëç%ž·Q»JÚ¸³š¢§Iëa©'5âá®HÇ'Gb"80*CžêÔq¤=ö:Ð6ÁòøuÊ1 iÒå~/±åP(g¯?JAÙ6˜§r­kJWÇ»ºC.{F΀Ryk{{÷åq{ïÅÓÝýƒÃöász†Nä¿iˆ=|ôÞ–´Ïn'¬g‹Â™;Wîœ~|ÔÃÙ!fGÿ Ò¨¸u+$#õ"U—¿aˆlšÞÂå¨#WXý¥®Æ-RGÆ~ŽÈü?ù}p'NP§•A‹° ‚]?t» ›ãU+< ÂDÓn(L+ ¦¤ï!/¥¦blDÍä˜Ìù„/..´zöF Dy »ñº²Gd£91Éd+¤ò‡)•ÑDkÈf¡;˜È¡î©ÙÖƒÊÛTàîdŠçÉQÓË/òjÈ$4sÔ$—u«É²6nÇ“s]Õ‹üefômR^S»A÷V}¦ÈcÊqæÀDò#‘+nbÑáiøƒµi~«3@( ï1hžî¾¼…›*cøÐÀÛ‚B«¤Å>ZüÎ#:Æ«pXèuDù'ªV£Âl!q½Øz¾[Ûß;:¾Í°Oã8j\ÏÞnÜ'š”f†Z}:_D£²99|“v&sÄc‡RŽ¡ØEd^fIš –wC$¿øú˜¦´ÎwdVe«GÇœ²Ï™r–¡.;Û„ÙL×Í!¬ÍMG×…'#ÊhcïêÚúƒ‡ß=úþ‡Åã’>ùâ‹/ˆ6èȤ7«Pê›a4Q ï…ýT¤›á[¾°A?Ñ¥‚£#…z¶P™/Wèc –j€"É‘Õ^Y@Ì þÙôD²HN”]¿×©Â)P)ŠU©v Lv¨¦F|+Öhõ¨©Â1ƒd¥.JJ×ÎF̬’9¸—µÕO)Íˬ†î@1æzˆ`Ëp9Ö;êßa`ý~줃Zl Ùå,EìHS÷Ô1à‹bmuyiýµÕ*åæ¡›N?@Áè otéŽ<ÐÑêi{äk«IÔ}y‘Šëá¤ÚzºK‘e4iw2ÍM©ü(Îq0=ûï½—0SvÕù¡Ñu©Èè¾ÍµM ÇäÆv‘Ž'¬ÔEÈÔ4ÉŠMG¦ç«›N^ví)¹µ?5ÂÑæðmŒß–ÔþU[b½IU>ÎØ ¨áÜBÎðE˨wj»då M{Öí, uω–|×^vekYèìc˜ã ÆÊòXÝpßÖ1~;|yX/|­Z9á!ÕÄ ãÞ2Œ3U$ʱjêj3µ”ˆ'öœ¥+Ò4¥.³>Ïr1Öüí/é×­ñß0Àà@ñ|ü7U9ů»Œ•ÒÜæs™—üÅîîŽÕÙÌ®™<ŒB‡ù½ ÃÜ…p¬Ç̼©Þg⿚œn›˜$Ýt7?ÜÝ}q|¸õâøú{ù¤ª_z'×}ùkïã‘ç¡iE0úz»øÄ.|¶=|B«·¶ƒÛô|­ý{RÕ™v%²›§øl{­Qü:;­®–Bæm-]í…òPAÖÏç®feع´ŠÖ{T4B䪄õ|K‹GOmd—Žñê–HÚF:ÁΓi¾$¶%ï¤2Ë…ŒóK±N ùô§=p;Q¨—»9O·…0%$ÛÈMp8‹_…˜¤ ©Æšw22~šëÜxÜ ’<¥p½ûOÞÎÃÉÙ…F½‘—m3±xÕîçâò ƒŠ¯âÚ­3±èÇØ<±­iS“aLT£¦q=ŒÂ²ìˆ5Ÿ…gOdÙw#ù8¹óMÔ¸y“$ùYÅÕÎp=ãé-3¾\ÈSyŸÙËögÉã€fó3Át÷Ä °ù¬Ð*ðe¹¡Ñô9C´F2O´þf‹×ÁK!fþÌ1E$ï[¼1yxˬ1ðTÎht±€1%òø¢Ñêìl1Õê-qÅj>S4ßYž˜´üÕX"¦rÎn¾øÍ¡ÌÀMœßI–øðR„™¿ K…ïÒ ‘Ý>;L…rçŠY!¿/`„ÜÞµØ`ÒÞí1A‚YÈåÛ/Ωݿû“™ùIlÿÕYßl8ÉÇÊßíÁ¿Q;…®ÅùŒ§·Ìür!Oåf/ X Y$ š ÏÎÓ ß/4Àæ³C«À—åˆFÓ_)Âã8ì¼óFösèv¯áös7º |ssža VjÍÔÝä¦ÿÈ,Dçß Ÿaö²xtzåv»ö©<õ涯kŠ O¿µIõ¸èò&U,÷'Õ‰k\åätâ¶ntlÐ;éB_ø~Çnþ«±kX³ÝÓ[¸ÕHg–ëžô ÜIü•4E+¶ŠÀóÙ*¿ù\l5 }v¶*{<­ÊbÙªìÄlÕèÄm³U=…­ªB_‰­r󶪆s¶ªfàoÁVgDÐDýMØ* 6Ÿ¯Z¯nŸ±€Ÿ…³Ú.f­v¹Þj÷ãZÌ5ÛÛã®ìBöš*õÅù«Õþ_€Á¦Æ3‡MMÂ_œÅ^E“‘ô7a²Àߟ^a\½45ßÜ>‹Í‡> ‡µz\Ì`­büÕêĵØk¦·Ç]MÐ…ÌÕ.ôÅy«Ùü_€µÚÙ³Ú3ðg¬×BÐD}!¶z-ú{‡ÛŒs×õÜm'Uèl;Íßm’«má:Ú&ݼ¾›­±ì'[ãá_ÁÅV…¸º8÷0Rµ¨Õ8ð|Ò[Q(mÌÑ@É(ž·œ’2>½.ömì>á´À_#ŒþÓ,§klRäšdú=ŹÂDš/Nþ—¤žR0¤#•âl^”6kJL»kÃ+Š<l{{{¾(xù°šÊg+Aï³ímÂh’’Gè0Pÿj•··ÕS6ŒÂµ-ˆE±w¸÷Z<ª¯SÐ4Ì~ƒ‰ŸÌìæHó+T;æØú /Á[%µàÁº¸Þ“Áƒ1`ªÝÂZ°_ (¾ô{½öˆâhGžŒù.Ö——=€61»H„éøúW ïwÊRYqcmå.ö·Ÿí¶ž>m˸û?®¯?xðýúêƒG?|÷ðûï¿ûaõûöˆ¥ä”ëÊL¤ƒäÿ9ö"—²ÃªÛNe ƒzª/ÐSLȓ׈yN¿–à‡ÆZ…aýô“x°VUp ßŠÂ÷諊²1½ÅðC4Ùo–Lèÿëk¿øÃƒGë?ŠfS|¿¾æ,,Hrúæ‘_öá÷Xv­ª‹þ moˆÚÚÛÍ\?Ú”Ì-¥œ1³ ¡JUr=ÙZ€õQ‚B4[º^‹‹´B°*›óöÈ̹’¤”ƒ\ÊɲVOS¡ÖYÿ¦ÁÃÒ+!–W,#"5÷5Äíí‚âZ œoËh?ÝÛ'J=Ú=n?Ù;>âÌóí×6i³ ÁÁ „¶} çïù6 “±‹{{Ïcgå±sñ»4Í6qÏÃîòøÖm¯’ë3«ôÑÃ{ʾ§ìkPö£‡·GÙš‘iü´Ó• Ñn²y§™°ç¥ÍŠƒ¿ÔŸƒP|TÉ«Áe¹š{çÙ)^¢ZSS«âĦÒÎ-;©½}nªŽÞ(‰LÀ8†›‰³Â™zì¤ÑÞ ÷¬öγZƒ\ï¬ü`.˵{r¾'çÙÈyísÈ fŸC\0àO;ê'¥r…£ÌÍås æ·1ƒT@©JéWN4»$–]Î}Ãîñv–sÓ #Õqœ:Î1¼èž0Ìå–À¸¶Ë­ónæ™ù}ëðÅÞ‹gbß?…aŸ2wÊ,“CLNÚïsæTØ­axC™”¾…·N²3GMÝÔõÍOÉp‡#sÉœÍÊzýaýQE>÷{˜nz䢽&Qb™ù5òd~RxŠé\±ã€õEÔo9þ‡˜§•=ãº{Ý6=kÇãÓxÔ¬ÄÖÒ›ÒI¹ÕzÛª6Z­ÖZ㬂m¹ÀFWº§á{ÓÊK}8ÕO2F^Ï‹<༞[Ím!Ûö ‹ø£1éÇ)”}߽œˆ.%S¡ôðâŽ;ÄÒç87ºaÌ®«Gj¶YÑ#†!Ķªcô)ù)7Ôß¹;MA‡¨ ªI~–FE¥U©à/Ù4}-nÕEöŒYü.&²ì‹³~xzJ7”Ð8ÇPúD¹|à v‚°%ŒQ.ãØ–©‰Ýí_š•Ö—ù©pseü÷kÊk.3Gâ¦óð7Œp‹“T?áÀ‘WÜ:W,Šc°MÚrTp7„ pÿ[§èòšc|ÅTÜŸtç²+œ±”Û¢iÇ„±°QÂìÂã½à=F1ˆÙË×ñŠ Ž_‹½!°Zàudž±„⥊ Ê¥FñVJhÏcl-W¯¯Í5Ó{Wò©’ez6w@¹ÈçI3ó´³—.)¸jï4~æS;¸¶4¦3½"˜1˜;™ÄyŠÂa3¼íî̧cH~ð*«ùÃQ3n¸Ó§Ó~Ž0R—ù¸]¬‰uñ@<߉Gâ{#I™Ñ8 ·ü{ô“ïÒ¦)¹ƒK¤aYÀÎME8ýñÇ?ƒ&çÏ=•3™ç¨åóÎɱš5³$óÌ875Ù#Ѹ GBûëdœÃÉýìùæ²Ä•]i‘Lsz±Ünž9‹—OË2‡šÍ1×"†;S"9œ/Ü>n%-- âäqò5[|hB1ßf' 7EÇÞèÝX_½Ž15>Æ”Ókqã×FéæRSo†Ü¶½©¹mŸÞ<·mÅ=]îT’·OÕ“òÛ>µòÛ>”ßöi~~Û§Ïü¶½[Îoûô–òÛ>=¿íÓ›å·}š›ßöéµòÛ>M¥}jç·}ú×Îoût¦ü¶'<[Qãé—In›Oay‹ï/"r<ý\ÉmŸ^/¹mï³&·åiå=é“Û>–Üö©Üöi6¹íS•Ü6A"×É Òˆ'ç'ëeJµÚY0® ó,°DJ´ûÝß ,AžFÑM®óÕ ²íF¡æ•kKãq¾åþÔìwu D'M&jTPè¬Ó5RÕ°j ýj¡> 5žˆ¾úÜö¸hŒ¢îé•(§­‹3r™]8“­MÝéÉË·Úrm5/äÝÛ"¤ï¹ÜíQäú}Üq£ÈwÏ8öwš Œ™y¬TRd³GÂUÈ%^á:RA‹‘ ¯!ÑpcŒw^–PÝšg‰-“<Ö —.^]J¨±çF@xHèˆuºrA’î‹|—!›k:¹ÿ7³¥%Wjeu’>ßrEQ²ß²L¹µ<%Gš¯Q ÇÚL '­ÆñÑù­?Òì~gîÛE@›6c¿O8÷è#‡yòÑÇ ªarlzåj%)º%Gݧž.Ô0×Çâ·‰›¸í0k!ª™®•0 6w Qœb/àP rHÞr&`\•®ˆ\ÚñòP2V4$”Ýá"‘]\À‚ë0(á% +¢ö¾žHž$-Ñ[> á¶‹½z„(ø¦ã;‰÷uíÏÍg!kÔpzÏõOÉ%¡b¾°˜ñT„¦ºB{òt§ë{AmÐÿH/»D€\Y‰!,èu:S ¹!H W2µ ÕHRMMâþžï½‘>Ö‹¦!ò»Ìã©#|(wt–ˬkÒ‚C-H­ëËpûY­ÒþÎÜLc&YSf ˜,÷»“õosùg#Î1zÌÃt£š,˜ÉÎÙÅõ²ú*9m°"•°9Ï[,\ÀžH™ôêå>Å™%Ë‹ ©±`}å¯,MÎÉ`HÒ¥¯à=ùɪóÖ\GŒ Ì µæ– 07êl±›j1ŸíÔü}~TCÃD#RIHëû1«—‚AuÊv9BºBvðâù ÷Qä!/ž›É<ªns¶Ï›PÝ`yÁ = Û4Ì&i-Ðέ ß¿ü ÒMÛˆÈCZµpÔ:S˜dª¢ã%å‡O§–Q›¢ hÇ·Ëê½Vù!W‚tïtb<ˆ7¼~ÏzÀ_ÆSß %f®¼1‹Ä!Ã{ Ñ@QgÃ5¤~“EøaVYÈ—+{ÌEð솄Ë+z}÷¬Ž•¶ºdâŒe+xF\û³‚û<½¡ ¨†±?¢S+°®_^Ö^½V‡½Ø½Š7Š€†6”…ªò^/=) ÿ,#¯‹eŽ£ñ£‡•»„è»~ m“ &TÆXðpB÷An9%Ãj´SEÏþ}„J! mè[R FüâÕþŠxîÏ~Gð#Øÿ¡yJãÕyÌE":u»dÛLP(ÚðÂ…T©¤q|IœrAÉCjÚjOˆjU©f¤ ª `™¸ö²Y„ù÷ž=U¢•X@‹y–Ò Yµ ¢¶Ô­ãGî9~Êtn(Ò ÐTÏÐt]•`Å KüÞhšgi-[5Å 5¨Ò'àd¤óLŽrwÔ9§Ý’!)M?ÇPP²)º Œ¢+$†žtI¡Jïd,†©ŸÈ>6»ÇS'’i”Y{}Ç:ÿæ,yùn#ÍØaÿüäÌ«œ³ íšÉ[µ·Xò³]Jó_ĺõ*‘Svü.Æ onpE˜ÊßÙVHM¼´; /ÖÓ[ÃΫç/Ÿì½0íügÛžôEܤF'uA%{#JZ¬†_KÉýǢؽ¡´AVaÔÅ3Rº }\AòòÙ… 6ÕðÁ2ÄÒ2ÿ³(µ‰=Åöšåõ9—²„0E4QÅ /aQ”’3t ˆ=׉ÎÚh¥™”𠍑¯hPuÍ+MôuɽžL®5q6¬kMóJ![Ôh_¦M¦>vMì‘‘ɲ‰çM¼+‘LMõ´œí½3™8®Ï5夡ñü³žxC•d)s¯Åª²„ÌrÆHϲz?##Z›ÊÃnÂ´î —²0v ¼Ê‚—˱ì9J׸ç^ÅÜ+sw‹i¥–_Q×Y(f¾+Wƒrî[­·Ÿ¥ 1ak„L3ÑeºhS\´ §~£dJr|æêDaKGP`z‹»p#ŒE §+/Þ¨:×wóãû#j@ H¶Åç­ ¿£«ÍQäûÞhª‡ß<×7?9öPǦUh&~l,:ê?AÖ‰ÚD-¾œbjçžÛEÿ½É6Ro<}ªo-3XfɼºÓwmIÕ û½÷XÑÆ;2ë„é¡&Ì 0@pxbÌ­Ô#‡©y°Uôö¢žÛñ&lDSj©ï‚A[—™oWÊÂi–ðÄÅê/<9—…O»!Âz[ÝÄÛÝ/gfË[¥–B#K²öÂn•!U]©d¼Ds*Óɺj„ÐŽ×̧µøâ¹hµZ¥/m|œÓ ¬[¼”‚p<š¿“ì§côÅo%œ{ºf¯ìR0n·__¶¦¦’ª•¬S[÷™™ôçGJÜÓzÏt0ß(̶ 4 é"Dës,BeÃӀð×Þ„…—SÚZlû/Ú¼‰÷ƒvl˜ÿàsR,SÅìÇSbÌοó®ÈíCv5½ g^ë=y‘u/È’î¥?Dß ÎFd* Ës@FÑ£„÷ñu³sòÊYÁOaœ³‚)⢄`´;ƒn`Ìë ç“U,Ò{â6·žlï8ÚöÇTö 1ˆ»aÜý¿³áP›”bçž½|¹Â.©Dhtrê‡b<$ƒ•Ñ•8u»]dì±ço‹~@ÁúþiG‚ZBÅ™ôêVÃÞeÇóH¿¾¾ºº*N¯ A®À19÷zê 1VæIÝ1„ܶçñj]ˆÝ÷^ ®é½O€ Œ¤@œ†Äw*Ê"‘B>Dl¶ âsù¢n°§Ô¬4×Ö×øaSÚ„®ÿJÚùSäq‘v>Rö3ð÷,kœ¾ @° {Ì_ÆQ×ĬÏÂTäý9ö#4G“^ÑÈ <¡;„‚’) ²éÚv) £ Î@ÖÄ×púDm /4Ћsw‡à|ÂÀkk›Æè:Wg~€Êy¾0€ï¬Ó1Éèw?øñ²ñ|×/RQŒdT«ÊǤ†˜/~Gî;O˜‘ú‚#…H+Œ„®ÅY„ €@.8B¸öïa{+2’ õbôã`´¡£$v˜ç $òPµO– •0÷!_}IÅ?¼öÝ‘ñ†øaíÇu±âÅqcýׯë—ÕI K›”0 ÿédÖŸû/ŽyÂéú¦FÚ‘Iú 0 +E ìÔÀ„ÑÕuÚsþ™Æf“[øèàHND÷]|n’QPÆY߇é3Iå(Ä›Zêb×µpkÌöç:ý=õ\ÏptÝH®™näž<Ó¿Â/½ÈóNã.~ ¼‘ü½?ªQãpÎaœz辑b€éûÁ@T^ ªõ=$.ËþRwo!I™v]ŠFŒw»ÐñΨŸc¬•щYÏÈï@䫯B'2ƒ ¯ˆ¯ÛBªNA+Úá;Ì£ï¾{ðhaæŽ2´8k‚` –bÛ¨ /wº]t^w{ìjÿQ—[ýÄ0!J˜L½­†xx2wåeñàÄ âÕþ¥žÿß=÷È´ˆ9œßú£õµ‡‰^ÏÝ¨Û »2–±cfýŽ~ÙÝßo–?ÐßZùÃöÁ‹§{ÏÚü•ì®âóOŸt·÷zÖYÁ•¼(VRÍG/¯ßñc¸RÂ+ «„. *uF%c_ZVž»ýž’Ýʬ©âlo¢@]¨@“#èLÝòÊøÀý}}âïUˆ“\ÔXÞŠ'@¯ :˜ …Pʯ„ÁoÒ®Šß|£êRÓkß3‘ûxEµÖXÏŸ3n¸è s*}Eœ>ú5žÜdŠQ.œvdOO‘’#Ç£XÝ“áÎQŸaÉXø(‰ Qª/—عÖÉôSwc‹Åÿ,ð{>LØH‰=˜ã0ÒN;Ô'‹î4„7h'Ž18ž;@oF²¥ÙÉG³6·Ÿ=ÕbbqV ä±Uƒb«c4ç'k_O:TÊóΫ•GòNýFZU!ŠðkÍ7½KTÍOÇT¾I¿k~ÊaèêŽü&iþvŸlïìm£yàÖÑöÞž´§Q¿þ8ŠÄkQi­­®É«¡­*®,(N]ÜßaÔ#o …·V Ø­ÖšP ßöô NŽåSü b£ˆ;yôrýÅ~³m¶V®Â¯µõ ¿y±¿~ôR¾Yû_PüWas ¶¨Æ’ê™ zm@YÀt_⿊a·~;qáOšJ-"[câ}Þ JIÔ)¸£éÁgU¤.…m ºJÁØRçÓ—{zŠªq]ËL\vŒR(Wt¤†g3¥wün6)ž=?ÅZXîâÁº®œxö@SJÙV½>l®Z ú¢–àÂG•0m`ãb9ð/¯ßT*hIXÎŒé b™¾uD°‹!üæ …bjxœ»Aã›"èò]Ü`]õK°Ü(Ø-a=6Ï$×®f.ÈŒ3Ëùç¾ÀK*ØGóŠñEÞçc¨gïœc8ð[aipØ YÜŒ .Jº £®¸Ñ•ií±‚;ªI+u'¿é"2ùgÉ[,À©ð`€ÇÛÛ?Ýßzv4C·ïŸŠòE£2 8¥?š iö0lùy&gŒÉ¶ÉiwBh”ìšç±U.€uÇl—žüڽ݂ղ„”k¯,ß5“R÷6ÊÅ6Ê ¶ŠèñÎX+«®–³Ýw&SÇõ÷M:©mÀxþ™í‘Ó¾ÙA§Ý(4~R¦p 0œ»É_,4ÜšoÄ$^c#>]ãžïLóИ»sÌ&µ¤ŠzîÌB0óºF1¡ÌÛÏËŠrütÛ¶¿ƒžNZx÷>y>I%td†8´ùIŠéóÑT¯o=°ÀU=¹˜nªê¼Nx`ض®7ôÌœƒ¦‘ùÞ ¹`&V/:BQ(s8 èêè<ìÞäÈ'÷ÌïÐ ¾R~¾õlo»½ý|§âdJ V9SÜ›fEÆs¨8‹â…‡/B2ñàxU^‡-[µ‡¦rÁ«Yelg¹ßº\`¼\iLuEð²‚W5´”4ß!j;>*§ú„Ec™p ëª|Sy3§â;DM °Àʈ̊ ^Øanƒ½¶ZÅ·ŠðƒÉ…{Iˆ“W‡T—/=O¯ÄÀeãhÎýCbÕH°.Þ¼‰¼3ïòí[»¦ÝU§}SxB_}¼óÁцA7V†±e{Ε9ÅÍ´£aTj“2ØôÈÜó£ËR·*¨ìBc\L …,É+²¶‚ïiL£åÑ¢¶Þ7PH·Ëœ³g™ úW¨%}IW±d§UÏI#çú—oÖ~|kD$Ê¥HÕ&_ô8§ž´¼F•¸ë¿yøÝÔ–ÌyÛÝ*Þ¬B÷è×ríDÈ7Ï÷ß=Kñ¹‹¦Ì¬úؽIj¼j¥piÒZ>´¶Ÿ[2Y¢øà5ÐÖ¼ËØLŽTjTIô% |}°¼îÔïò2[Nè4KÊ ‰KgŒ›\þðH`œEÔŒú\éÙÎþ~ñHÓ“7tŽ­ˆáA¨~ÞX¿/–†ž¿\óüðh©¾L#Áò³!ðaõçC¯æFƒÚZýâfíÑÃê¤a* AÔzåOEKE+ùµ-ùd¨‹#ϓں3×eÿëËl¼•&¼¬þ\¼pRcÁa$Õѹ;ŒÃîÕ5YŸa{ØdWÌ í6pºvãÊb”Ý]QÓ!fÕ«|ç6ƒŸw†cu­á/iVµÌ ¹‡èDŠ1zà1ýv`ôƒ$o Ê 7ðc´ÂM¬ÚöÉ9@ÆÅ; ÙJ¬nÆÁÈï3£9~ß#¾¶ê. ÛC¿ƒ_Maþ𬭶Mì Fÿv©$‚«eŽ}h“¬¿ñá%…@UËU½öwÔ­ñƒõË%ø-JUDá¤ù`iBš•\$H•yñ`]xôß?zh½~ô0a<Ð!®FÃ11;;^;ô-:õÄÎUˆºî€0c„¿[ÆÝ#üãtúQ¹£å3åE8{«‰òú=v+»Ú¼/éü[õWÃ,¼y2]Yà4+0~t[ÇšDë9Û™&ÍØg\ÎA?NŽ4ËÁ(¤ˆ—פåAµ¥ Z5tüdFZ8)} ÈÎÛÉ`2•i²ãÞò±‹{åßﮉܨ{íSv’þZµ ö¯±¼eÆy;~FéìÕ‹½×Ú‹fY9Ñ\¯¹‡Ú çÁ†I yï]ô‰ ×ñpF0¦kí†ó© Äs£ŽøMŒžm?Ï——O’3èDÕkH†ÊuÉûsì£ê„×^ü•£ˆÄ (òÈ] üÛéVi¶ný(M\lµê±ï `ë›c†9*2ÒhØ»ÞQn‘3WÐ&eóÚ&åµQ`¡TT” ÆŒ ÁP Muí ÄN‚Ð-R´:Çœ(«»’Šžø<„C)ˆ1è»—´4Qó#Dº_W2*€aÓ“ /swëôIg»»ãíöžž=;ÿÅßû¿ÿy÷kðÛlœ• \H8%¦µÄÊy ÏÉ¥• gÜóäÏë7߈\˜*—KþÏg0^êöûøõVŒ—$¬»vÿøà`ÿ6ÂÃ2¤üð°ü®™”º7"˜Vc«ˆïN|XÙÕr¶ûÎdê˜#>¬"t|Øäù×3^Ê¥þ‘žJÕÉiè çnò ·Øu¯±Ÿ®qÏw¦vU˜»sÌ&µ¤ŠzîÌB0sÇu-`B™·_ÜxI· Öª¦óÞx©8`«IR ™ÆK6?I1ý”ñ’ž Xઞ\L7vT…XØñÝ‘‡‘btÜ)Š~ #¦Y Fó££:k÷¢p€=~‡_æöКÕ°LÊÚ’Ìäî±(F!e‰ö0ûVÊV Î5–ؤz]¯ƒ{ç¿¡$#lV o‘;îÐ=…u3BK"ØÀ}^Eøå¢VƒV‡IÊpTÚ×|4ó{W5 nÐÙñSŠ1Â^`Wg8æ6PVv޶?ÀSQ0–¹€µa6û§nç]ž†A™£È"ÊTÂ{GB·:Ë4S²Ò[Ò,7SŸ`bZ“º> ˆÁ&µüb*‚®sØM¥p£û$)ùRêÖá-ˆ¦[‡¹òèÖa“ÞÝKžÅ’'áè®çBN–­>;…Ó}¾…’âLü苦<Á&§e;I“ùgžæò›¿q2“[á) Ô„“®Z;\îžËL;ß*|ÝÅœ%)£:ShbÞÃlÓ1_|ñÔ$û)ÌJ‚¥ì3.Néýñ¶ðx«¨ŠHIg!Á¨VðÆ>ÉmòEov¢ñ'óZe>~*-—#ñ¯§{û»Ê­c wͯTtu£¶Ë—¯79x&P8²Î §Â¸~.jâ§ŸÚ[Û»OÅãL:ŽÆ2Å$LŠ×1‘&¨ ²u R†°:ñ‡EÆ C@ƒ¬~_VꜮxôð¡ªVQgòã[–äÏ´sbæö¤TÎ{üÿZ²!Q‰V™æ‹ûYÊζ¦$ƒ –žù¨Ò@V¬¨Úý°ó®mBôxÏî­21tœP6³±®'ÿP5¨¶­sGQ”TÂû=s1Sn©íºƒ¡¼›åø§V*ooc‚ œÚ“;ædÎi D‘ˆo` }D€ônõ1Uõö6.byF%JVM7¡S4¢m B‡›¤ ªp þ)ç•v/D|58 û ®bkr Æ!ß Q¢õ9„"£Í¡Ἷx.8@9ƒ-k\±ðÉéÚ°&¥&G7K·ß涇þp®ûd ŠáÅ,vSE' £w5Q&³…Ùëy¸‚d>Š9ø`\áð<Ç«>ðˆËº¿ŸÓµ´ÌóµTzo.ñó?þ!6«oy–]${xßé»1Z7ÇÈ?E´’x°j:1b Š¿WüÔ¬¼y²½³ûìðèømAb4Á!b™‚ÈZr@J¨ît<   g¢ŽoÔ¡;jVZKoÚ[µÿukÿy«>§u«ZaÖ× 5¹6::Ò$rNAZôV¿ßÊð+3Ù„'U1‹ü³½£ãßUýs¦E1t R¤Ý…1v‘)þÙ€ò’  &&ãÒ »—Wâÿ3Š˜Œb;‡I 3giR$ÁQ*iQ‘Y‚2¤±™j$þé‹£ãWo­ä]Ä,/< =ɲ ¦“+¼öCú˜.w óèÚ¤+­ì²k¿%ÆõË‚¢‹Tˆ)>yºSÉõCšö¤+‰“8³‡`ЦXC=·ã‘Çøó#<'a5™º¯g˜1/iñðÙuGn²RB»/‰,—e9£°Í…š%\H ?Ô® ”m!è|EÝTï\g§´ö˜‹Û§ìœªÂ½Ǭ[ ®PŽ«ImƒŽ6,ìèBr?ÖÑÒÌž~›Ù‹ëÀV?91&-ÆJívÎ  Z®4‰×Ï~ƒ"ªaöO¤ ß<{ÿÂ`ß?×SÙØ³ôLúýWÁTOVŸpdµcÍòï¦PZeñàÓ¦.ÝøcûàéSqôïçOöÅñÖ“ýÝÆåå?‡‰©Â®Ô÷`ÊðËÿ­YùˆªÌÑõåEÌSÕ‰ëËKCª€ªjãU4{õ¶¹fuA,,kyC4>Äþ?Z‚ή®ÄÁJ«´Ñ*Ua~3ŸÆ£h)Þ¬¿]Y¯¦à_ rãÃ0¢]¨t ë;öWTU…û»„ÄY-{kboVØåü¿Æ.íd@@Ë­pk³±ú­xõbg÷©Pïà?€£Öß¶ªËKÕL½~o‰©ðXé½f«´Ó*@ìÈÿk´–ZÕ:õß㛤°dw¥Ñúø±5ËôØEÇæÐâ7koÿ_ã7ÿúù­BLoÒ¯Ít_¨81ÙÁdþ‹&SAF,}¶Q«áU>iþap–R62_Ñ*±Åòúò›ñ¶µ”ÙZU|ÿ–vÊÌËÌÈ˲duRृâ”E:é5žÐ {•0‹³`ÜîÂF·"ù%«|(•ƒÇÇv ÄŒÕP!'‰Ÿ‘Yàó6=G[x'm–»ì°uüãŒ}-ÚÈï·Ñ }ÑGSxèKgØÇøÏ‘‚Yi»$>8‹^"¦CR°f  |pÓ¡T=AÖʶó…/>|Êkë“j@™à/U?Í4+neÓ‚UÝd«ü¥Õêæ'G‚÷‘y̶QÛͺ§<»íäí5ܶö¹$Sù'7Þ1<Ê6õöl|ÀÉ<ÏB»õQL&ë’h=eêJ"oì¼ÜàÛàRû¶Éw ³Aò¨Ù=À7ƒd¤©mÆ^Ñ[†¢Øý¬ûŽæð Š²VCž*Ô5‡B9!fSÌQ”ž£T?™+‘I·öžÀgé°âäPk¹2‚=€3"PDjœÒcC[!ç0…(Æà@HÌÓæ»Œ•ñþŒöW™šZžÔÑA ÆÜ~yxðìpëyºøOî˜FÖëÊÑÇoÞŠ¦ónéKÿ’EÿeÍŧá޲t]FéšhNÜš„ehqÕR)8Ÿ6MÛ,(¹Ùf¾ Žl¤c™>‚Ôi^$™RáÓÃÝ]xÑþýàð×­ÃÎyfä à–ÃNA .Ui–¤ŸàôØLä‰ÂP†èqÿÇ^«½äp‚k,ÃF¡cU<ϰôôŠ­Nö÷ž5Ëø;ï­ºæä¿X‚ÊÀ–¥ÕMh™°ž)9*ja5'°orNi¬4¿ð†X)ÜðÕWÔlHc @N²ëY’;Æ”] [!¶œ7=jËùä,°d =OK° !k'ý„¹'“å–Ú“a4 Ú«ë×) ]Ùò 4ÂâZ@`ãS¤<‹ i8r†~ûm'lgêýÂ7’ºÊØ:éðK‹"SdÔêXæ³×ç´RYˆrNn2ï”ϷÖöJåO&ÖU€ŽÙޝ†‰Ý.X–—Ѩ›œªèÏXtN‚;}?ßÖŒg4m•<½‘uYø. ˜Ÿhë2¼3Ǽ}±ÇžÂÊ…}¾›E(D¡–ÿÏÊ¿* btã©BŠ%§e@êÊ›½EúJVH.‚šø‘Nþ™Ï¦: Ãiþÿ²”e¬¡íVT&©Z EÊš,KV9”ÑÄñ,Ò–E¾…­õâþX8{³l–ÝT¤a>De¡‡ôHªìÍbÈÊ—\ºd‘”^Ê϶·­#Ÿí„2TÔH©¥GfÌ+Eèf¦¸¹I4ØêÉ„!çÄìRI*‡0x>´ÿ‡#¯Mú2û-ÁáÇJ¥j<`ð×·ô´[O™&¦_>’úÒü6ŠÐ úgQ:&Iœ± ’̸pOã°?IódÖKIñ÷\^tÌÑí "7jAø)Óõ¼LŸ7ˆ‘Al¿u§™‰›E MÅ+mèæÎÎ|6âD}=±º¶þàáw¾ÿáG÷˜q/ý݃á;Öé›u©u(&1¼³³Ñ,ïì|Êì;;–z2’6YD7i0´©î‡!ÞA?;×FèÊfx®O朹ÑíPÂ8” _l=ß­íï¡Zã+¦«ÀXÝÃ7ŸÉº´;OðÔ´ÌÕ±Ëh\UÉ5s7á”PK3ÂôØÃiʼ?›¨’€i5×ÄOÆ,„Œë9[Og04eY“b° šl êRäÜÌt"F6-w–sÞëÀBâ•2-æ‹ çí¬Båt¿Ln¾aÙ>gFÀDN»H*ÔE‚‚õ:æ‹Y‘édž¹}º€ädsG¥DÞA ˆ/”È„¼ÂÐæV+2ÕT…ÛPøÎ1¸l›zõ¤°ýPNo²=ÁŽ<\ýñ‘êJÉ ²28Ó’¾ÙZ©°2ÉÃ?K7‰Èb·•“%]$Ù«I¢tûq)¯Óic0_< Ö…8zç)ox`˜}GîpèE¬f㼿l9Qw8tnA,UIÆl½ƒé`¾pÿX.• Ö-Hô{G…ú(–ß´Z·É÷Qtò‚¿VU.Pâh Ïw:ºˆþ:G~ïJ?—_­ª­Ú²õ¾¯Ô´Û‡ä—B¤ÇÞæ9Rv*%5¼’JCSŠÿY_nüóŸ›"þçlJëö}7®ýóŸ Šæ úv©šÔÈ×п@Þç’mY²% Ä~.I‚N¥ÍÄ5EFîÉ)D›dÎsR½(Ë;¶÷Çki­vzî™;â(º$6ê‘R!"Ýœ…!šYIÈÉ21ƒF’AC¾ÚrM+/Ч¨ZA.p×3[Oö(¦‡üÚîŽ;lËŸ\AJ#„ì°Ëâ›QÒÝ0êBU¾¦¥UÁ+U³"r5¨ÑëR¶/¶“¸ç(FO’U¼Œùh)YÔÂ//_½ncæÙöóƒ]`û΂^QTŒRɦ‹=z¨‹Ée—«m’Q¸8Ë艀Ip:,’±`E"·Û:tÉ?G^éïEé>ï<¤œ&CŒ®}Ã{RZXæô¯HBì£üa§Öï~µ×ï=X?Ëd¨`aùS\AY(à /vôŠúG“øÁ«Éù ÓT~Œ‡nÔùb«OˆáȰ†C=8CL£ÑEýïÞ“{ËD±?KÛ… LŽ–ï>~wûJlÓÍDlùà–âqç\¸T‡½„º!vž)UÊ~lˆÁ >ì¸~×p “í ˆ‰ç½ßñt0v«›JŽP.Cᵸk2(;^Náц/á&îŽÂåæs[.‡ (w…Tù¢6½ä€çµýP¡K\·¹ŠZ 3öoAvêKùr!§ÑëmnÚ\àùà—_œúh%bôV.øGá¼fw9·ñþpØ¡R¥\ ³€È…€\årzí6–³+" š­á6•5j3.ò¶™“—Ÿ‘8Šäay–‰‚é4çÕž¥nºjá0 HÁT-ÏÒÉ35ýpE§+Ë—vQâhû€Ü_¼÷‰ïV”Á£¨B»dX ÛPoÜï×z0LmM*NŸÝ.¶~ÛM[Ád ]Xé:×ÔZ¿ªT(ÈÔØÇXÂ-VÎN¯\¤¢ítÚTª…æÓÑòÓìP´šá°Y)o¿|)ð!¥â${¾ÛµŽPÓ¥r­6¨*nв^˜cR“ª¼¿S“ì›4dmŽ ZE×±ŸJKÚ¯_ž?ó‚ËçL ©³¬Xùök¾¿NXîï±Y´çâ/N 7P[ÓP ÿΔ‘wí¦Îâ͂▻YJÃÿh÷èž‚t|ÖéˆõúõÕáub±V_E fàÁư‰’'±Bj‰YÅì ÎgÄH6kÆ4ø"Gï{é¶PºMóº"£ÝJ„a &]Ø ud^mø?ƒ< »©œg}`¬™3¯~&I2I)ãÂBɳBKdƒ\pú„ÌKRÀx×ëëkè˪(° ­“ꂇÀœ_±±ß€‚ʽwá„§Ý;•'„îÈoÊZ‹áV\Ç"“OF¡êR…l6c(Y=zŽÉèÖëF2‘° õ|š–f•lºõér›é › {“8÷*æ³DžŒn%êì`tÇ"D>ßz±÷t÷è¸}Ki¶-x¹1"­Ítû(‘ÅQ"ӘˡÑ;3Òîk¹hÎ,Äs}q'ES)A'óöëŬ°\F©ù¶»=Íǯî{ÊAĭűΪò¦!¿ö=ÛšÜ6…ŻīrWÛä8³ÓÓ¼Ao'ó°‚2_<nªv$ÜÔœßÄÍ ˆ›Cxij3MDóØQîn’ –›š)à6¤Áh~üÚƒçmW ÜÀïaË8î ûÀ,Õ‹t†dˆº,,I¾I6Ç,4Îêh#ƒ0D¥ösEñŸœWp0²4\mƒÈ”¿• P‰+ûs…cèXÅ6Ý|,²ÖžF…º9ãŒe±n YÊ6T ^Ê/¨æ6OÔSCÓ¦àÄ)7n2ŒøÜÆa÷ C¾hÊ÷÷|¾˜ÏK<å’Þa÷ÔÉrª×ÎB¸>[gBIñõðëIYúñ”Qߦq”yÈäÉÐoMj,äš­²÷|dš¼È8»[ÌÃ\4¹v¦ÒƼRb.S±_}q ‘¶åCž¶{é0W:L(G’‹)LÂäØŸS* éúþ6ÄB‚tÇøüÁ-™'$H›Ÿƒ{£Ã)<ý ÀFš)ðÎ0øƒŒ±áAÖ¼ðঅ¹&„_ßüù ÏìYâä`3ç¹Ê]äÆðoMP<˜bÜ|`5ßó•ÙdE‰µ;ÆL¬å“ßgg:‰Ì+0L°S>øjöÉyvÉ÷öÈ„ÆÓù c|µ;>Hì?§àøèá퉎ÞEáñÑÃÛW…䣇ͤÔ=³Ÿ"D¶Šèñn ’ÐÕr¶ûÎdê˜SœDÒÉ(ùùW)ÓÔ?ÒS©:9“`9ù›üÅBÃ튗¼ÆF|ºÆ=ß™IÈDÌÝ9f“ZRE=wf!˜‰›9L(óö눜ØvŽÐ‰Óy/v‹Šœʈžš—¤þ”DDBÌ‹‚Ñàxa-Âî¸ïé€Û˜1n2_.®XäÓæaS'©y§¶pìÕfIéÈ ÷ÛÏ_íïa éWû»jy.,Š'W*¤$+»ðû} cI\:5>˜øw8¦ÍRñs„qz%<ŸBƒÁ.9R©½à½…æMÞ§:‚µƒ0¨yƒáèJH79Šs+0ƒ)†¶¤x>]ŒÒ#j覯úÃÁÒ¯¢¸êuÎWõ0Jºv£ë^Á·e•pŽòƒ‡¡L-Cc­mbæžÄó®£Jê¶·þN…zª…Ù6DË©u¯@tð;ø­ö{%…Ĥ™ïºð„˜¹‰”c¢ŽƒydTþòψÀ½¢Nî™É„pæ¥~xÆa”JVC%¬ÉqB)y+F"uãx<à=çCP>ZLŽ)ò€aƽIç1$IرÙ5²`hPÆÎí›q¯„¾à˜.üÈÈï™’)U@6Å‘bg®XÞ%E_ 3íb}3ÿŠJƇً(Ów<‡ÒtvÆUŠþ`»”ô¹xSšF•`1hgg™§ru,'¹oàšÓÕЂ’œhãlÚ»ÄtIŽSÊSwv=@ÛîwÛ¹uo»‹`& œ3rîÈiòƒ•õ’Üf-¶JEÔ YEn›+fý’îuwÃ"/™pš?[Â=kæÞ(´_Ñ8 Öà¤â7^ˆð«ãµ1áðuV_~­ K.©pÃu–JR·¹Ýu • ™¨ÓmsVe̾¬ˆ%]UÐ\‹é}¼Ö1ƒª™1Õ:fBÛkTS±6·a[›€kT¶šR6úáÖ‹ý½'v d^Î4$#k0q»:#nMIA7›!N—ÌúJ½Q<†Û/qÙòÖŒ’±^òÄž‚˜œ‹ÃNô …’T“]»Í¢€y«‹cO$ ž'ôшM˜W°\>‘šÒ¹YÙˆ#XïýûùMm2¢bîj—QùJgJ±V³º¶þ¶jмh»ý~xѰ‡úx„®”/ú5ýxãEÿf}‚.ÇUQA\ž ðÜQu›ñÐí`žÚYX®b¦ú(¾«_ŠP… \DRŽÆÊõðT¬­Ö¿£ÄU ^ƒØŒBt×öÃ+:ŽÜC`«,†Ì|upD ü0 ™À]þðˆ÷a\RÝ‹à°|]ì„Ae$®àÐÚ‡+ñ?[±K?<ßÚ>8zÝÞÙ}¹ðïç»/ŽÛÇ[‡ÏvkP}õÓJ¢¿¯,ÿðh¹ÆHøaù#?’ßßü¸ö–cŽ_g6åI)|7ʱ%¢Ž7+õY ^sFü­ô3哞èoùòNV8SÕ%ã8T)[GÀŠcpüV eŸÜ¦¸(Œ›Â^¾ˆ\æ³# ƒ¤q…H¯ÉBu¨+édH¹Íü?é_‡Ì6¸ŸçŽ}ƒcé$NÜŠÏË4uy+‹é·]S¨ILh·‘?(UÅìTBÎ"'Œƒ3O&—ÄÓÖo[‡{[Oöw©ðEmú”Òµü˜/fÂ^¢R¬´ H ûiÓh‹Øºï©Ñ°0»^gb¨}™xúFñ¢ù¤Œ€¥Ä”:·".ÎýÎ96"TZ,Šs÷=6ãâN9pG𨴳wøf~½Ý(ÁWyt£ üNà»kÖ(ÛŸ7„³'ûSãB8ÐLpPñ’J½$0/ßnl¼¿[oñw.Зõå´îq m…þÁê[T}k¶^¥Ç¦«ºÐrß•¼;¹t¤j¿,¯«Íö²šz¼¼‘<â€ÛkÍVI¦£„Š2 e%nl4Dã¬r"ZåòZ«”†s¹±œ ‹ в€–7Š!µ² jB«C­F£"¿eaO™¬²Q_Î(ëò5Q–…@\àÓ¼з^í‰mqîÁñ Š~bÖà‚E÷¥\¦ºùN–· YôƒNÜõÄOÐ `´õóÇö3hÒÏpýÙÏzÀÎGøh~M‹Ê$›§lÉ ËÔ¯d_^_¥’Á–¾R,gÀÃn­öEGãÄŇ ‹*ÔˆnèñmU×ëô1±ÕÀ,¯k04p%¤“úíÏ¡šËݟﲆÃÌXKì_|D’Û¥óW ºÛ9Jùg.˜’Yq¯"þÑÙ5Pºw´-Öë«õu¡¨2‹RLPôEPª–ÅÍPŠÝýz¥t ^ìEþeíaOGpT‰é–…˜Vgt5JuñÆUŒ`\±¼ƒ­¹Aì×Í;èôErÉl‘ÖìÆgaRÔÇ Ò| ff©"*â±z¹úôiU4›øi}µŠ‚$€¶ö~ß=\êTÅRÅ­ˆŸš?ƒ¸Šà[å?£øñÁ«—/eq£êÏ¢²UßB{ð¥&PD`øUiàyíµœÌô´TЮ_ÑE ¼K•ÿË+eŠÅ£˜e4€€¥‡«Æ‚®ßÙYV~}p¸k­u—–F9Ëö÷^‹ïêVD|7p™sB{ úR?§ ‘X·ïwðr¿îHû))kÑéªP?cžü¨6½AÃFWú –ç%e4µà| éw¡·ÝÅ‘í~¡V›'Ɉ-Ô”uÇ(Á<¾ÎOE$5ªÒé‡'C  ÖmÊ—’Æm©mrJ8K´3ÑTµJ—­rªf‹¬…J0a¦|EúqcZ4‹ÖÀå/˜!)wt°žˆ5µÔhjɼËÉNT·ßëFgĉ¬VJáš·Ï'âÅ´ÊV¤ØÛ×t”vöŸn¿hÿ’?j>1"… QYÐî=ÅYë'‹õåªH•ZzyÒ)•”ÔY§ÿóòÚ?ÿ¹)â¶à§¼Þ*ÿóŸ¥:î ù YPøÈ$E¶ÿÎlª’šXÄóõŽ7ò¢"KæÍÑ&>§ª0€*¨àŒ,»“†à“…óóˆøÜÅ\†¬'pG~[Ž(¯!*q'Œ¼A `d[Ù­wAx‹óð‚42c¿‡ÿpt.+_)]pÌ`%Š˜Èûsì ¥èÑvCœ8K38ØibÚ=8Èáãû0ªÃ€œËj±.Ü`Ô–9†x Í d%ï5K¾&”¼B»Ö{…j!OtýËu. Í4*°a¢@XV£%\›‹b ˆà2yO-î`V”¶H& ’Z¤T¤±p‹ú‹· AêûFYÝæ—ý‘ÅSb6¦%£òÏpœw>h0"'ÒTì£)˜xá8î_• ^õomy›"çxVDä]Vz#›ŽH%eû•·t_%=*®œ*®ãþ È€ÙSýâÌt¢R«Éò5W(ƒqŒƒdQ“FÈÔõÂ!ÓuÒ,d]±ÏHƃáí„ÐcXw-„Þ“ÿÙyõüåm„ÐcHù!ôø]3)u¿L¡§±UDw'„žìj9Û}g2uÌBO‘N:„^òü+†ÐË£þ‘žJÕÉ©!ôæg8w“¿Xh¸½zxøt{¾35„žÂÜc6©%UÔsg‚™;„^ʼýò!ôTÛ©zj:ïÐâ0z&I%td…ѳøIŠéË)Ñæ-ÉRGÅ3,󭣦sL½ä>1@%ßÊC_º¨ž[(ªz"—§« %øÆ¾Û‡^€FþÆ;öëßF&޶,]®VãÊœãxùï½ ž˜‘”?XæQߦó é þœœË¼wûMÛsS ›å/·¶Ýz¶[“¦fh]Qù›¢9‘°mµä”áÛ L¿ ÂŒeº€Žj°†ï0(ò{ØBÇAáÂgá¨.Äï´-·ßW‘ÊaÀÏÒ,6ŒâºÖ1‹ò{±¹GÀ¯Ô>±¢tƒ¾#Û“dÐÄÆ¨¦ÐYÐØ]†:ˆnüd„;Ë ˆ‚˜qK’âOrÖ¥TÒx ré°]ÓdÒ¡2³“¿!é°ù^éðË,é¤ßÿ…)Gãç¶('hÍrj´W+ eìT@.øšˆE•ÛDŒN!YÉ ”HPÃ`xM] ÍJt eåuWÇ,iBö}ŠàJ’(ð‹Az¤·@¬1•ôÜxTó $ÀÛD†‚%Û²äÌlŬt3æbB*`1V‘â=*Uì¯ËoÒ(»%®“kQïfm7êœ%898Eg¿¡×ivŒ+¶È‚>DßM4ZtýË7ßÕ~|»¼"Íœ¯ªæ¨']% ÃÌ”)³ôÉ¡(¿!žõßÑtÂñ{.xÖ9½ˆ'Ã`kqÈZ†bÖ ¥Ú\j&ßÌgÆPàcü>zø=•ªN~ØŒ´oË«]‚dmÀP3£°ÝX²¤$WHô©žfºn¨#T@Å4.nR1Ý:|Ô¹a2=Ë­"‹_ÿ`›‚“9„å¼—±ÙYÀKŽ˜”.jœCÅS´ŠVµµ÷hë É–bOÑ® _#¢Ãʳ„—¬à%+œºhˆ’8õG~Î|h¿‡>·ë£Ý20‚+Q‰Ï£zXAŸ1üØ~ô¾­H0èµBüÁÐ*‚ßW7À FÐzÿj…˜!6·7ÀxSâ©ß÷êÎ.šö“[À³¯t`ãXøgúRÃYmwûãrïŠÓñHt¾RŠ=¬P°NÕ#…<þuÎÑë##£sÀÍÄéhk‚CÅß’rA|°^­[¬=¤@UŒµëŸì(UX#c#£jr…$hý‚UFK7²³²!$’3„Ôx’¿,èÈc eÉN¸F4z]gï š1Ðmè«p¶ú@^1má8È#dõºªÓ¬”—Ž~ÙÝ߯ŠòÒ(¶©•®U²hÅ™ücÄÑæS>~h–ú¨Å¥TiK%õá~iÿ¶{x´wð‚ùg2-ð5ŽÄ‹ƒö³ýƒ'í£WOŽŽieϧÊåhS¹\¨(j,¿·qt: 4ëI¼gðU¦ÙçM]~©ñbv¥I¯T‹âùQmçà( ªB±÷(ZEðc¿ÄSï —&ï‚•Ú& !¿o7ˆ™7 :Œ\ò’0/»c½dšîƽL*©½ÃðFI»t;¦÷†Œ§ +ò-ÕEâ@è„…‰bq ¡;â¹Ô³mtµê÷A®«{ H‘½cU‚yn,ãM^xÄ«°æöÁþ>²£[Ïwrsp0JÕ&zï~|Nþ:b8îõHÜ„ï<3ˆ ¶@;Ыôê²{Àaö8Š ýÆàa*òÞ³~x ‹êh¼á„HbMå£|‹™ˆ©?!fÄ.Ùt:‹µ‹¬+*u·¢·9ËA, Å¹ä]v<àÏ~Û^!GoûûÅP£Û‡?Þå¨éJ¿¡³`Üîwýš’9NÛÞn–··ù£Œ§½-#i³çOì^ó;…CÇq2tƒ÷mo税Éå ü@ Zï¨AõÞî…Qn‡Kì4¡ïÖGáûõ­ÊNe&ÊjCvŒ§ÍrºœŒ+àpô†^„Áù`ER2â§[g=àǰPÎîšQXL#£§Ï·žím··Ÿó8ô·&‘‹£®Ÿ‘±"$4X‘X¤=pÏ|ÛYªTN^´;ö/NÚ©„>çÍ_úÂÛ›v ˜W§h3¡`ƒºÃóFŠCÔi ˆ¯7­Vcù­ø(ÄÏøù-¡-¯É¦QqÚU Ú.BÝhÔá4¨SxØN]ÒÍÝÜ6KqaT«TúZrôÅ ºfTå`Á‘ÙZ2ú¾±cÜ7­U¡F>Xbc>ZeýR>€t€îÀ¦e|Ø6[Z˜¼>JIeQâл¸È;ó.›'ÀÙ#h'HIlFk©¾Üª–N1¨¼¡b›&µE+wP Fˆ$VÚG‡¢]©Xjåt¿1÷„.èP0 Ù‚ ®ÁƒÀ¡ÝÅÚãoÖgyyYüÎé`6´ZÏ:J|B''å®7‚í;ã¾BR£ZÁý¸;F{™ë…$*í[ê(uE^'< üÿÀ¶Œ0ŽÏ=)‘[´Y}gÉ)›Ä{Y+â¡€ü;9ΜI©×ó¤ñå›A§mÃÕ5ñ¬ÇF ûõ’yz¼t*“2LÌ;´¼FÄvu„’¦nàé ºæF]Š.öØWÊ.Ðå0è&¾^ÁpÙG½åÇKLJäJ’bKf9]Z­n~ª$—{Jè`T]£ê \+t+±½]wX3öÿÔHö)·6e` + „fžIÚõ²Ží“TA†Шv19Ý¡Âܨ¦‰â‘(0Š˜½rTúÎØÇ€Jþˆƒo£ vù£‘º£ì x¹LQà`˜éÔ£[iÀ(·Iä¡Ç[Ï~Û:\J@¿y[åÄ©/^&}jïì>Ýzµ¬ú†‹Så?§!–b\%Ró´Ê,W]‰öRÒÚæD+v­|a•rÂ|ÑÓ¹x‰¢¡›ÑÑUf‡ÆåFwS4þËß6ºa§5ÃHOzœÆPš'é”_'Nùð¹@ýº³‰zò¨°ìM†ÄZïYT‹Ì1a¨ªí­ßv·ŽÅîó— voà“c•Q7ÀØwÛsp$cÉÅ“8o~v\ºꜻÁ™‡p°˜Î¯E1ñL嶃i~$Kí2„<æ¼Be>ð9·3ê_!¨ ³ðRw7ĘÌõº½ýªiU»/òÒÌëùBº<ùAW|39YªÇý.ŸZ:a„¹²úW²SÇ R|¼”á »â½ï<-¸ÀžíbúšCöˆ=Y2ƒpìNÜPÔ6$y4¥Ø¥EuFò§Ö‡Õ•µÖ'±ñM9MbH¹bVoþo—ž[uy«mVú&S©œSj£r‚8ß÷ó3I¶À¬ÀªÖ*Ñò®&µJÆÛR*/hU.¼CÇ2)hQ¶L›%©¶[åŸ×–5í«DiR0—yò®ª“ÂÕby-É+ÕRÓð‰ð«¶?íÈ:ï(çgÈbùº&ÜG^¿¯Ñ}R`“ª@C"ÖDý£¤(±TÛ¹yI,Qz·¤A—Löʉ*.]Ž«ucQcÌì3¶hãш3L*Fû1ž9 ÍPíLDHŠf2—ìw‹\õ= l) ÊíŽGaÍ'C᪡WŸH;;ûûíÝ×/+QµåcDru¿ÀT»Šc,L¢™&L'ÒžH¡ŒRbšFé²Ûìw¢­í/Y³öü—öο1=厜»`‹a/–4;wýwãédû «”ç‰RM%V Å"\<’÷H_Qø½ º¥v£TgpiMíË£‡µS â—[â——µW¯¹ID¾|°Ž/²P]Pî(Üd¥à§cyuáwhLN§GvÉãý# QîõIÎä $¥>œêSvƒóáÐ]~ô©mQ|û¿&dƒ²r‰Ñäö‰Ð0²úå›è\“ t‹õKZ’µ@l@—\œyG9jxiK¨â‘çvÉ«@†ö÷r2/ŒP„–®6wøûgáѭÿáT!•¯ì}…[ 1úÀ.†Æ®ã.pwñ1yzæ‚MAKçMéRNu¹›’ê©.3–¦Úg¬ÀéY k9…‰ýÏÀ$áÿïÅk¾¢D†ío¿]I\èÒ’L‹•{¸<¤ŒÂp%Ñ—%YëG|O‡9äÐ9½>]\:‹ÝYÀÎû‡ËÏ_ꎶát1x%d傯ýŠ2>ð*ŠšŸ’Ÿ4Jª×¨4!›ñÒZ8¥‡Cî8îºÈ"ùô·ùïáÏz}½¨Qb_Ë야ûû¼~Ú†c)ê¾|(982®–øaÁFõ|Wú‘i‰”¤†n«Ü|q1:ô.+oWU›õb Ü”¿§ú_^gc€â⧈9µÓ½ ô$iÀ ;°!RÎùJþWìÆ…ÔôîžA7Œä‹âÅÖ3ôEn g¼˜@՜⿕Š3E¶Î3ÏÛdú¯"ÙÞ¥qøamUZ›}iŠW‰D”¶QK×W"—–±f{>"7™[øùö p¢I¬Twʳ¯ÓLOì¨]oNÇA—îÓ·ž"µÒ<¹¢üá¢ÿIz˜¤wØIgÇkNÑõ°ö+|®¦ækšx]©A«í|@§z·ŒÉƒjgÁ¿`d›8ìƒ@«gð;¥àÈeT‹xx#³OdÁ™V¤c ö䙕~5T=ÿ?{ßþÐÆ<þ3þ+ÔÅ=ñ#G[8Ú#@R>GH¾@šÜÅ©YÛ ìÅÞuwíMÒ¿ý;I«}zm IïH›ØÞ•FÒh4æáÐâ_(@Hž$üO–„§«¤R| *•+d‚µ¡4Þ Οmor/ˆ£«÷µDj÷È{ˆ:€ú 8ZÖu9Yœ hÏ9°Ók lß>w®ôñ}sUÓÉéæì–$ º”Á»ôîµ³m-LÛ¯Š6ª2’EÔ™1“Ù¢xjw¶‘'Þ5ïÇ­¼Šc&r[ •·;qQ¿F2¹àèìô»ïä—î«/äÆ\Lx ÏȤŸ$82\¤—V€9¯«xéÀ1l2¤Óž6A$ðºøþûP¯ôád‡‚ÍI·#Û<’CÏJpG­>ŒÎí,òl|ÑèÈåQÞ=SŸ§øà7‘ÏÞ“çâÍ>Ê÷Íû-EÑ«÷›«u±ºÚ\EòåËmÚ=Ÿ &Î38OÏ…Ëߦáò7þ†§‚Zbó$F}Bön¿°…É'¼Û~;!{ã•£‰×Û°[†mµ*éü ÏWÔï¶x»Úøî]3ãÅ÷Í·÷Þ±¥ò¢€—Ãy@§TÀüL¼èºM\|iˆ§PÌÝK ¢ 9$CoÐx”Gü45–å[î@ãÿÉs=쎉Îl›èÛš?Üv_˜Þ Zj¡-çzûé»ÅûrÐRÌË\)l(FÖfNvÆGyãÏÄ’¶*.·=ç"ôÃÇSôÿ4ÎN¥ùß_RTxõQB¬E¶ýâèik5‹mÏ#Ì}ãnJä½).™å~/w{¹×‡O>ÇoüоÈn&)>DéÙ("xhÎN™Ò_+«T˜ya®1€ŸÍµÉ) ø×ƒòDwköÚjÔZLZ›ç²Úì QÏÄs/1K+a©ç?h®ñsøþèD_ÀïÕÁÞ›/‹<èg¯hÑNíC¾ª^71.¢aÃ(êÙì<{y®¾km;2tEÏIi õ-i\Ô5]¡6v¤/H\ï mÑNrż`É6Ñ)*•­çf­xÚé9ƒ"h½¹Þ¼”sŽpZx„âÚåÌN1晚Rfá,œÝœ%e™.aý$ËÑà3'7¯ç}æ@è@‡iH‡ôFWvo<¡X`¤FÃÜÊ3Ü¥\ÓvYw"›<©Ge­—ËÀ*MH*~£äÄ ¿ˆÍrÑ⿳Z¾³Z¾³Z¾³Zþê­–#ú§Ú+ëfËîÕQéò6ÊQ5,Of²nuî´pZ-Œ3 Að5[Ì1hÐÍ ÁE²f9!9fðÌ^Ÿù²ˆ¼ÌËGàQÍ8Upœx1ޤ„ÏÛ];c¿ã÷m«r]g+£§ÕtÛ³I,¥€•Ydµ–ZL¨Rp!OoéP½©<«ñ…zfiwëŒ!Y™’MÊÓ2S¬!FM¡-¤Ãer“0¹vÚ1<ͺ¥ Îm2î8‡ŒóÇ ÎòÅÖˆ‚Aà$ÅoÖêuöÂo|m˜ÞüVU Ä^ö,Mï"½Ì»Ð`çdú%hPsþHqbDÞ¡~r爹ÕÔ\5éýw³W¥6–d…ò{K¬¦ñõf¯¬z#~ƒnª=ŒÜ@–Ì8•³º¨fA)Ç+¡ôͱH&9c‚ŒbaqÑvŠ¢ùª·$Àöc?¹€?¹Îé/ÇeÕG°-UzÍÄûÝi®ø4ww3I§ð0–,xK²ÛÃ+Q# ]ob-ú‹«Ñ®¨®Kq˪¹öØr4Ênâ] uQÑQäú±ŠHIØ…°|Ê!ÍÍ窻ø,^D²ïf3ƒñßæa0]JZåXH¸Û¿ïöï»ýûnÿ¾Û¿ïöï»ýû/¹ŸÛAŸT9¨†s\8}øºÞ,‚£Ö”£ìhtÖø=S°¨¬T|:^YÀO&&.ª£¥¿¾Òñ‡ç/.Øù˼ÄhÅM-–( *Æ„! Ô1' xàEû°}íšâ06˜ªÜÇ8¬QÕbP{„‹7 cÞ¶g§ÆBŠã¯YË$qeæ ísScàÎZ$ (˜‰ƒ5ÚÔkt7ÐøOÒbJ/´O©i¯¯`³…¨"ôMÜbé­wò†cnÑZyºáФc©‘^ªîï,G¢rÒ=º0åáü`㙺}S´\ñâ‡\$;MUû2>ÇØöºëH¯;¦R•­7쇛Æo( åôã(´æì!i 7f1_mÎå'Õ™Ò)]¶$[ï_yöP^5Èì•úì·Z«<ív¡±1å}p</éq—?£,F²Fg䎽÷·kµ°Õ\­~Ek<¤12Öû $‚j¼±šä?(ïw0èÅ0J—¬Ÿó™ù°cwC0;‰·Ðq(fò¥Îo{9t½IØÙOÀ Ï¡’žlXÊ» åŽ;¾—\ ïk€:2~9Ô äMð ä…É šqù31á˜WIÑZœÀÄ_ä¿äÊ¡.0>Á¢ßÁ…ÇÀŹméºæ«Eví«®„êÄ@Î2”c¡ŽìžÓˆƒ¥¡\HÙ©f…)}Å×W1‘¹(A"œÅãHÝ™Ãþ¥xÀŒ¢¬¨+QÓ²^Å4ý†z=ñ.\K5NÖ¸\eFç{ŽNBަD®d(OîÇèäžÓb—]dÚŸº½OÍ•~s¥Æ)ã hœ!”’-v{”.r¢_ ¯Ò –Dåjõ)P›5Jã·µßyñôéÑ.ƹ}²¿Ûù¤žvž¾ÝÛy×þTbAi2kq<\[\5b›BøÖ1 g“Å¿EÃ*sÉî.c  t;öÈŽ WE]…q• £U°±NýiE夔-AÛ0¦Ûsáøiþ~( 0®*2ý!syŽO/SÁAå±.¡q¯ÝqC·C½+An@FpWtÆçAa$»¯‰WPs¢h昋'òà„îû; Þ-hBÿPóͳ6làIñõXÉô‘Žüõ˸r7=Äu +Ä!æoƒCmÚç6ùfv LÒ.ûz|øƒ1ªÜ¡Š³ðšr]™³§ˆ&½I¸Çi°Ãp2”j‰ >ùQQYÿ¹‹ÑoýÓ±øÅ%³èD<Å^®}“]Mf픹ä¤a°¼–$£ ºEZÿ.Êsä´t·`ÂáôêÃE ’ïK›!Ë•dKê¨Fm ›/ºý¢›;ܳ•tÙ5*Ÿí-y§x»YYEõ KzKùûpl/<Š%ô`œë:ù¹ƒÅd¥‘7.HC¸rµ«¶gcúXå?Æ«‰¦©FA°ÉõÛ‡ó.Ï­QƒP{j÷8# &D–¹*aeÊawtCò®ÔÀPÚê&'ÚÝ«%0RÑ)ðO9NÌÉÜÈ Ø¯G ݸã+òÕÌ9ð‡Ÿý \ÒuäŸø^*'Ôþ­ „.yBh¨®2X‡Jm·Ö\ý¡ùhš…½ ì”hJ#â¨CÂ(éxpÉ„&Ž'd–¨\÷wDã¹"²¢+mÑ^‚.¶Å ¯±;ÛËmÕ2M*(ôv"–’ÑT™eÎ3’7Ý”5]mÒ)LºÒä×KÛõ§I'@<“óÞiLFy:û;uZâÛÛÀ¥ðÞDœáˆ„/¾¡è2£Ì:‰ ,–uR§‰su)Ã5‘`uPd~p$X¨q p`éˆOPÆ8@áîõr2Ë8”X‹†g‚c€³$óõVÇ98zà Õ|«òûš‘•4Cì§: ~ݯk:«uÏÅ8w}·o•j4HŒl¨„£`Ðè ˆ¿qî FÊ·JÉrjpÌ‹U¬eäÊ‘›FŽ˜Z¥Y¯%:;›Ôt™TsÉ,Ô°ޤÔQ°c£?d&0ÏŠçÇÖ»<‘꺵ôërûÞr;l߃ƒPÄ ä£å{‚üÊr~¸–¢U KüþªôO&¦p|ôsõ~“V?L_¤YÍùþŽoW#0ø«ùÃæýæZ[Loþü]óh6›I kdµ,”ç°y¨]ø¾¹–Lõž yñ‘‚fL¥pÖBžà MJBÎ?ØÆJ–ƒ¶·ÖË—ÛõhçaìåЩ+N.+²Ô7™¡¥"qk¡Tv¨¨ÕzØt2âÔDø‹7»:ØËÃ*B‘IKW§† h'­ë$7Ÿ£V’u~²²f²ÈíU%µé"#¥|Å©½!˜Ù–HóÇ:¹å˜µæÚ}¼i³»ÀTéÎ NÓîégaBÆ©*Ù”¦Ÿ©SLÉÀÃú4G'¹±Ê ϘFå¥a<Ï øÕŒ27åø*þùQsc*%Î$Ñis¤ä)À:¬€‚2ùœó6ùµáSÕZf3¦â¢V*,o¢ƒ‡ÏE•íôU–q{ͽ”{t³oí?äÅ“JOŽ©µ©GØ;¼$ž±þþޓíÃuövÄ*TŸ¹þ/»‡G{/DuhÿÇæp¸û˃œ.ò°rP¶üí(ãa·«çôêáÖÆdÃ,õú `”0‚'Ö–ãZ ^4öc2Eª†R™¶§Ó£ŽÄ¹"úEI›ÖaËs§YÂÃB¦ÖÔÕXÿ~èŒÎŧ ºkÃFù÷ÿÝÿèâ­,‡éàÀ‚¤ä£$îÃé“NZÒͨw}ƒެë‚LŽa­"¿À´öxŒ‡.¦W§ç3—¹¡å)ã šJo*©‚@>däVÊ¥“ºàTKÊ;ÁðÓ­k@¶Š[ƹwBB)8i#ØÙß×Á¢g!Èrb.t«aè‰M#U,W…Ÿ ˜š­„ÖÆMjÛQÖl×j­_ß>ÙÞyvxôî­x×Bõ;|¶—È䢽Üj¯Š­ã­ÖFØú•^u:Þ°ÓÑà }‹ ¶~ÝCH}øòvkïøµ†;ƒZŸÇšÐc¾í¼»—©Ê4^tÞ>em&=²i¹#%Ûþ±\åS÷ý=F¹u¿,iκÅ#²ßºäšÒÜFL9 ÷³¦û3ËT •ÜbÂóÀ¹óà›}¶¨L#…åH¹:Dõ#ôÛªÜzÂg±w°w¼wpt¼u°½+ŽwŸ«²²£‘vþ¨,Hø;»GÛ‡{/QDE_A.C†te!À6"ž¿Ú?Þ{¹¿+^ý¼u¸»S€^dÓŠ;ÃK¼Ô"7Æ–ÕÁPµ{ž;>v‚¡Õê—h)îß,·ñï^0¦/ùke:INë7¬!E¡E…k•‚×A$‹Ãfvê^2z,¤ *Œ‚¢·®ÕßÒ»G”·;Ëø…{ÏjßÚ¨, ‹^(,×¶hkÃ-¬Úê´W[g€·?X˓܀zÍÚu’5-žÆÌj°œÐg”êšv™vf’¿ ÓFdÚœÄ^Ä-AÒï ´óõ™N-»Q¹ŸíÞûuÊêå´¨K ?¶g;r¼˜W©%àÌj«´p˜ËÈj‘y¯!ïÆQeæ ÚÿíÿK÷/WïóѽÒÀä]Ë2Ý̪}iE|EZ³Û«ÐÈ$•†˜F˜Ô¤Cgè0(N†œ5©/Nû _ø[éÛਭ"‚àµ0á`äöÞÔêøÃ褹öè±ø§û}]ŠÆÒuÆxo~ÿò‘6xÿòñÓ§ÛüsL‚FÙ=„xîÀÞLFÆ@‰=}uÙƒá‘EØ Þ£»YÌ4§K8#åÒ^NÖZ2…¶HP«ŸU<öñpë`çÅóFµúY|+Þÿá±h‰5Ñ^k×V>÷Äꃇk«ß}·öýý“¤¤”¹× E‡~úõSç“•–hsdR†ðÇ Ž5pÐTFzt¼)lüvP¤ØßÖVãÑéôPãŠÝ óßu >£v*‚×ÀwÐf/JHákóÒ…Ì`‹°ka%º“ÑÐùml,,&ò¥(‡X@rGÚ^ú_ã಼NÈîÙëÝ™v¢ ý4Œ®qtª³*ŸÚý¾L¬)§Æo˜ øeµ;…—z†Â]†¢^^€?©èÒÛFÐîü‹BÖ-Å.O8]½÷­L5NÛjüõ}2ž˜Û½o“õ9í‹Qi БxT—¥ˆçlˆÓ‰×cëV¼I—o['L÷é{Ц»l´²I@ÉðÜ ™ØƒªÌÀ¸ÅéþßB¤h<÷ü¡-Y/`Ðÿ:¥‚ÀPùúÇò¢L"Þ¶áË4ð†«$ ôÔJñ÷“`“!èËG…4ëD½wOÍÿ4ãÙà3À&aqX~&›Tìþ"Q°cK^­y3Ƴ Ã/rþPpþ§/Å£æCK“‚aù ð —ƒ·½íw*ZºúN¡Òéæi2£¥«ÐèK}Ç0«½œ‚ì2Âræh~¾ÏØÂR”EàlP Ù þ;—X¶ñ»´`Šì—JF—‹B> Ò’£ßåÐØøÝÀâ§O_S¤ø¬‹#áÌ|_T‘§$-îÖxŸªXü@ºU»¾ªO¯é¤IZžíˆ•RgJ¿ì»òQðeÌz‘ê`ÿ»)Í>ê#u6©[¬hµW7Z… ‘`ëbeC|Þ˜­þíÎ >•xn„½Àém~çÒ¦h]˜#èÊ'EÇèF -Û$¯l$º@Ne¼8U) $7Ó](n®ÜIS™Púp²“"õœe;³ÑßBꔉÂz¾]F¿’Wjâ’‹jaöå´p++é×ÒõW“×Bvr©”Y' ´DÌ0ãâªÌUŒçŒ¥‘<ZŽTaú =ÎîþÓNÏ|¸Õ¾WU¯~Lf¤)ò a‰lЦ"J–­~c×L7§R)ØS²oCo¶1ZÎiÕI{‚K¦ä'2<¨#û‡Ä=ø“§;b­Ýü>Ó˜fF“D4ú×ö2kÍïáÔ/ä £;É=•Å!A(°:<âq¨ ·dh“4?$eM_;bœ9d]8öÅdtØ}ê!QÆ…qÊû(°‘–ǪQøb ÖIv‡$²=$¹PEgˆ™šicnŽ€ ;AÑd( S憀Ç´žº[Iåo®uŠì¼ffŠTŠl'£hš¡7ü~¿—g^¢‡†9[baލà?nþ°Ú¼ß| œïØ`wºðÑö‹/¼R£®uëuŽSR¾ÄŒ¡Ó›î} m Û°.Sºž»gçäÉf¿xCM#"Ø aàò}&û9vwAi7³Ü7ÃM•죋 ~ Ž.5œKèûDR¥ÈH^ˆ'ÌÍA ø !p~›¸0ܨ“ê. }µ®ÆçäsáÂqÖ¼ÁâlJ©ò¦ø×\>2 ·lx’/ßD3ópºÅæR’¡”%gH–”!×a2¼`,F“ÀiŒËqLÒÓWÇÅŸbÇ1q/y3]èN»šMå°¹Û4ÿôM3ŒË£êÆU1‰ðÅë{Ú•zi§¯t‚úSt áDÚŸÍpOðOyëà-¯¦ÖS6v8Z.t+Š2z]ËÙ04ˤ$ôYLBâG¯îîzjú­®‰ÆÏôo÷ùúÑán¦gBf‹‘MFÂ[gçn‰95¹2ï³ŒŠ…r ï íS*>YdQNΘ±â8£î©Ë¡ûÍé6zIåú±GÙ~¹ñòµ¶$ rOTk¸ÿy~¼fuCƒÏp(?r]f{ž?Œ5Ø"“l/MiŸ#÷òíCÓ¨%怖éFNm˜ ½nd+åHA° ÉüAwp*­>(Æ…ƒúéÚœÛÈ¥¬ïc„ Þüi2Ð?túENÁÒ&G£H é«#µÈO˜ä€óy~ÇñÆÁ•¦q2ƒf?xv~ÇEç ë,‚©nI2”Õ€9e)°‰µÛ䢀ŽCý°ç ¶o ŠY}Û½!Áxíb¤  à“/švd·O¢\YŒQŽ&[ì Ç~/³[FñTî{GzB²–,Y¥)EGÁC“¼“«± ëµÅ]ç£xÄ›OUèàvthò錗b¿xÈóƒ¡=Àª¸\ÂñÕ@¿n"Sltƒ1ùå¢'Ú»[y*a®lÍ«e‡4p6¤”GYé2‚ËÒ8Syšé´{áH->ã§àcÕ>ùšÐH˜§À‹¾RI$"4°¶¡/œÄغEƈOæ8õlÔZ0úu¬dÁûºç[dýßmÚKøoè7Y–mÕàjÝóë"9P]ý Ê ®©úÍêW8úŒêÆjÝø-å)³Q[£…ûª:¹žM9ÙVèYFÑȦ4Vj`¹­S[á‡àa}EÍÁuÛ*@bRÔFQèaóíÚƒwŸô·æ ~ûˆ¤ÆÎ€…nºÂ—ë¯Ý¥†b‰¤§K^VÀ(.«²<ÝäË—h/’.°» Ëf:KÈý}t¥ƒ×þæÍ¡Q™’Ë š³ÌæY\Ñv½IÉŽ˜Õz,ûñ©µ(‘RpẂd~ÌIxjÌ Q``”ƒIqþ!;ãhy¦ —fF® ö…³Ú,‡ÁtŠ%=/VÆ]YJðìæžðÆóé·qé¢ `k€Ê‚˜ö,â‘lmÁÖ˜lÌrà :V †°qÌ¿Ã)Q18$šO9ƒÆÐã)(LÙŠcjX˜SŽ+=”Ni9X”5I¿Ø¦04§pì´„Ý;„3‘ ›Jcì÷`F4œí7o­mF'.–³{÷ZhQ]`Þ#­2o4¤$çÞ±"cZáD»—TC޲ÎÓuÝ3n[Mb³’©eª•×%CDfI…‚¬­—ðCÍH#ºÅÓz< zÉ‹ŸUWAPÆÝwQ<¶uŠÊÍr7¶«Üň§â¥rñe©6ËÉH\¦È·œ*›¢j(4dœ3‘uÅÚL¨ ÎÑqsås¾¿º¦¸3~mr 1`2˜9Çÿ@3*ä‹D8Øo§¯ûН×M}nTÖÄ‹iØäˆÆ–*§(M<r%vAC2…´Ž^3Ҭ󺧟ѩRêd1£ÃA²’І€oÔ-ÞBºy’²cŽg¡¬§æBaØôî° ý‰’öåI"Ÿºõšp¬ªñKXÄ:žÉcê8òŒãQæÇÔŽ¨nÏ?¼5D¬"¶îІFCê8pj“!h¦“r}ÝÛj ’ë‰3¶áD-oDˆßó=&mGÏ(*TAÕ,öƒÀr¨Fʱžœ×Í¢Z‰3“H˜¢ ó®&U€u¯† Pj¥ÒaP_R¬)vNCA H(Rç ”[HPï£`ã N+¸¢X»Hi 1å°‡TKÎ`Â×¢2Ò%ÐÜ™ã9|ØŒJl†¦ ä’s5Mò”7—d½¨.Øq…Hu`Œ“uxzû6|Y¹¾Drér”‘]6+ŽAER³E›ÔGÂâ…í¨?é9‘kŸ ”ý¦Æ€#ƒÊE±ã&‡%÷\KT\šï€£Äއì’cËzŠÄhH»Í”Ù-†PD|ÊEˆEÙÆ=xõ9ºê1ÞlVS…Udy#בñ¶3_š#•6Ïaâþþ÷ÎÖ6šMü˜J8ÔZ¡8ÐQqØÈVZ• *‚ЯA,¡;ârå#,‰g< âÒnýz_~#V?Ñ’Dx+ÕV{µ¥^ðËg ùsMç}2ß<éOÐ?÷çŒD±±Ü J{è‘ýe5=ë„ÂÖrbcäÁ¶xü°Ñ…uÍÇ"©ú’Q&iKR—M#²¨º…IôÓ¼2,Åز+Ë47gÂjãT˜½¶j3ÍL þbscÕ²¬ 2q¬êâÕÒÕµ¶­…Ì kán«ºÛªî¶ª¿âVµpíMе%ew‘–Üë\ýdvl:%² >`plBÉ=Éër²P‰èý‘æ”k¨1d ;æÚˆ¢¥ËC\NÀo©ŠŸÁi2vUœï¢u¥)‚a!sÁŒ&¤‘Žæ'•ë´¨ÛŠi}4zd MMs‡sYõ”Ž)[œáÄxÉMãsŒš?ªÏÿ¹³wXP¢¦ˆ ïŽìÓSËö6w4Ðz›5ga]>WS¢ÇÐŒ*Oqëc.ŸD´˜ð^ £>IÊA‰=Û2L¬ð[êZ8t]¼k·—¿å.´Û«ßžY'µä G¸Nœ¢x,Sz„îÐÅ쥨Šö/HOc¨³€Bñ²¤O¾u1»smka­§ŸZ5 BÔ°‡™RO4=Ų©¾µjº™¥Ìè2…¢¤]¶XUZ¼gÄFJ÷Û nCÛ1}’®‡W$„éˆå æÐvÑ®hÓÿ“Ð}t|¸÷É|Þ~þ±”ŽwÈ*”Œ×mX+¢zÒ¦´’£ëý>œ^-ú|¡¥ÈðŽ‹ Æ’jånZÿxñêøå«ãĉeÜ1ÈK<~ñb¿“Uš·°\ÓûžüDŒO+ÍÝ7»Ëfd¹˜©ÑºÑp0ÂIOv¶š~–Q1Ö”fÌA©sä:ŸëŸoì=Ý=J,~l§¬©5Ú‚

(6†¨—Õìu”*Z"¹~`Ÿa–“«2yÌ¢øðù‰3¥/C+ç£É婸!Y^]SïQ$‹ËËr1¸×¥kµ)ñP®“Æèê¬u™]ß’ºn—¡Ãx..hªVn´`¸¸ºw‘™ËãvÆ¥/ ‹Mªä,åZÊj½€Ó—r5¯cP •\zÉëŒýåö¡½"Œ‚bæ!—IúØÆj*ã(™…É\«÷³Ö†ò͆åQÏ´¾*, P}žÌ•¿Bfb!™,É4Er(vöm¦Š1Ã|e¡d&¢[(¢·…,R[(ô^˜:õ séÂlô¹P@šé„™H|«s_úÎá|4²W0aHFÔp“8“$9åIJÎK2¥™â5@öìˆJâ8{®Ùþu×`NŒîyæ¥{ëSÒ½½9`sÇ)ÙÅêjó~”3H ¡ì8Fa :våŒÄÒÏ/X{øèAãþªØjbÕÕæÚ}åä]Æë'øúMóÁ£Õï5ðßÇÍg/©$!ࣶÃGÿ‘°3tÖ«á}>=¿!íß?¯³99âžÒ]ZÔ3 •‡vû*¦Iqùf³É¶þâsÅpˆÇ™ëtçsȆ%E½äúŽ –¡beT²hté@/±PCÌý+•GÈ}:ȼð 4ÃHœ¢§8ìÀg¤0^ûÑ4C_Žn' ÃsóZ"¦WFs` ðØ–b™±í¶ õ{*8Úxχƒáï*`Þ¢8±Þ¾¢¸ 2š Ù[\°9xX‰ñV£_ØáøEÉ¢ØQêl8²Ù7•ù܉„›ÿLûF*_mƒ¿Š£n>Ø8‡rWíú8k#4èñèHѯ™è†]¬b^&s‘ ÑúU¬Üò±6Mô¯U¢ ¤¾{zƒiV[Kõ7¯´²Í0ÃQÛ˜y÷=­×á¥ñ›êÏŠI¨U“”ɇ ôjæÀ(뢚ݗørÖjò¬b´‚+ÙjõTyå9ïuwúÛÿØ5#¹Í}q°pcým~YqOŠÎÉ1a"S䜀f¡Ä‰ƒ7¸Ù%ÏYÏF!5ò&QgÏ ÜK z_(潇:@dh=gÐÜh,ã“ÈT«²éâ)íÿÙ±J^C ¢ œMk2êûíΙ¢áy:Qèw‚Í0Û°]AqűÞp¤O‹Tvcø'0åŽµŽ“¢ÝùÁûzÌ*PÖ'Sw'Ò‡R0zöAŠ×9dêàJ…]Àá*õ9ßТ÷ß›v¹{!bŽ|Þð¾ÚöÎ&öÞO‡(„‰‘40D<‰Ö‚+(g—.Îê,6ªÃÉmÝîõœÑ8Láª@´š\žä…´ÜI”Oúʰ²%,#J’Fª/ŸO}?õ®L.m7á-ŠÎ¢Ø ûŠ‚l¬ÝDÅŒn¢j“ÏÂ*±™˜¤šY î-º0ê?ÙÂÄ5d‰¬ÁäÈyE‰6²eŠÌ:åÒØý×pÚhµHŽX˜ô=.RWüZí=5•ÔTô$“y•EL+&JÒø(µíÜ@®‰/=–ø¬–Ì}•i@SóÊܵeg)«áv=Ø}Üq‡ §ž‚ðJ†âœáËÓëeªÃEñÔînÏOœÁz&ÜÚk¡8váü¹­“šéHž»á+©B§/˜I®ìI…ò4§iÆ%’ÊÕÞËûOg¸]¹…û;Ϲýðñm›ä÷ï¦WYé/ÞØ§¨˜¿yÑÊR/ÑõO’f×Þt–:©€˜¡në1THkÐo†~êpšyÁ>)Íø '%ĉá¢{ÓKz&y¡4༼2õ´áx9ê©›á§ßß(?ЛÇ֌Ռ |Ž9?Œ,Qæ²øI_(•Ì4“²AÎd#¬°”;pRafò­rÏŸÅÞÁÞñÞÁÑñÖÁö®8Þ=|®~e}…ÞýQYð•£:*¶-U¦m¦fCØ:ÞÏ_íï½Üß/Ž~Þ:ÜÝ) @:'M/î /QoªéGªl[Vg}AwÐMÍ.ÓNI7$«?}PNm𠦥Œ‰'#K“B©½R+þ³gÿÊjט<Ÿ« DÝ–¾À×rR6ˆý!ÊàðùheNµvÈ J™e÷9ÞX4†À‘„Wñ‹¯ÕfÔÿ¯ø¦bÎ ÿJa÷ëV¿á­Š‹7v'ûì 9JQ²Sa}ŠoÃvÛ³Ò×EV»ê²ˆ‚¹VÐÏ[zCEu©¢Õ8§@`–Q4å^ˆt˜t׃±ªI'k€e§¦¦ô$H1ìf‘O!rTok”X뉄Û#ëÞåedW¤Û1ióñ|pU¸Ô2ˆ¯¹™j>w 9é½–²6~Ç»]­)bˆœCr­´*€§{'Êß‹¿ç65Ë\|ýñQf6\'Á_ÑiŽ ªƒÑµXxmµW7Z±ÅðCE²¬‹• ñy#þ>{Løóø˜ âLÙÿqÆ‘_¢lð +–Ræ†âQó¾År6k* RêåxCÍ¡éËÓ}ñÉ¢p¨šçvbšb¶±…”©PºöËêã¾ü vfü.”C”¹ê9ÚãÌÍš£7\ãÑ;Š}a>h®á!ø~æ˜ ÿ”ùj³']àáacná^8~€Ö¯ÒHm@Bm8n‰Ö€#Zk À}7ìÁ00¦:K”©PÚ48½O*ûÚŠPVjœ¬@Žt²ÐE§ë#žXk>KCûªëÀ×GÍÕŸ–ÓÑæ3%¬dª˜,îzãT'ŸífþpfCà`à“MÏ·ª|Pj9f˜Fä›…¡¢2p§[Gµç‹Åç²1@އöBû*$Žè}EK?$rXåW°®l¾L›¥4òЦùéeÑù=”â3› ÊBTÂ/i:Û;É9˜—xJßZŸÚžµñY|ä60J<¥´(íø²D¸¿!gx ¢Réà醠¯?¢ø‰ßeÂñ¹ªô3‡°u¦þÙ´T1³à&¾1_E­ß»§4GŸ9!eTëG„^šõÍáÀFÇíð£(çG dÔn£a«˜ŸøïçŠnÛ b` ü8¿½åçï ó±¢Æ+ìð*V!v z¥?ט#m½þ§J1·À~1˜çø“p€  q£ˆ*°Yn¯·ú~Ø¢­ˆªãlÉÂèPl ›³I1³m,íŠ*,üÔÊzNbÜ 8ç[ÂËB1gÆÐ¯¤Ñ“‰†v5áyü2ž©ý5~ÊÌÐ;y7±9ñÞÖìU¤‘sg|5ràTLB)bY¸Þ´¢È5èqlU¢úƒ)¨²*|ª²ì­¥ÕêjL–ÝQjèÊ"ŠDž¸ò'˜Uš4¢Ú{Œxu¶1 1h»”H^Ø™FÛ‹mÁYX8§‘9³LVÌtçàOŠÂm÷’mbè¢ °FäE÷&-~ÜŸ*a»‡¦G]÷ „¿S[¢Ï ™Z2‹²áH6è“S@¢NìÙ´QûŸòý½'d<À+ïx@jL`eDZKÒÆœâ'¡¸!à ÊÖ) „Sß±¥ŠR=•è(A©ñ‰ñööaã‡w7‹»$YÑFl.ã™h"*ã =µCc¨µèf£7š˜Û3ãï‘ÂV(ö¶?”±1f›:Æël“k¼å;žÄ<ïtT’Všo#€á¢x‚% “¢u­ùãæe0=¦×Ô%7—Ǽî\Ð’OB@¦ß§ £ó‚ÌH °§€XEÝDSÖY¨}TÒךµººgÇîzÀë\]Cƒ¶QD¾$µµñÁø#Jzöec èŠÈýÒ§ôîš÷›•S[ a¼È²“1¿7M3¢¬\¬-Â÷NçÙÁ«mŒ"Ö0æù’~ûõÊ2òÁ󽃇XnSüðÝ2~I0¤±0,>ÜÓª3â0`éE**Éz¢?}W•¾ÚŒÝ¯¡(.Æ=žô§dï ¸–ê+Á)®áØFÇgVèbÀ“q<û2[ŠR² "Ó7ÌH,—Á•âôÃ2lŠ×çuŽ#J¢sH­]ô§¡ž§—n­¤'¢Œd”,ƒ,¢ðóhC¥f¤RÔIï\w¢‰QYÙ†$>•O$Þwc`Ô!Ì ËØñˆ­bdXe á²a‰C{#Ñm’n„AU¾‘ë7³3h$aà¬[`¡0ï•°´ÕÐW«ŽÂöÙÞ˜‘iZ”>…F{›bkúueŠ…$9~è,Žœî·q†0hÉdŒ]9<®përHÈF7«™‘Š=²Û‡ :ˆ“‘Ï`PÇ“m£ØmÀR”Î]›á‡à!V(9öYßLí瓟Þ[X掺7]L© ÃiþB¤ïiê§€!JÀÖe€¡”±f긡†ûo­¢TßdL #Ò««è™’âK°›Ú` ÷ÍD×_¸} ª¥kˆ·Ç—¹ÒR¼êÙ Ž Ü~ f3ÆjÊóO倊è$‚Ñw`³'f¯Uµ Ç~_ï+XÉýwÆ bTåigÿÅÖ΋ƒý1y€ÐWgï²=¶16`Ô&,ø®C“ìàêRY÷º•lŸ´Z0ן3–9W"}ítÐu¾bÆé÷HÕˆX@`õJ”üxq¯Ê–†ÄÅ ‚cäU1v"2úî0}׫øú¥¼õ5/0–%à1/ý ó¸‹~Q‚oV¸qR™”X¦8œ/ƒ~‘}‚ZÇMñ2ð»ðMA Õ\ºµhOW"µ¯©¿|=ºÄMÐ7–ýé$ÊëcGƒ„eäÿmÔìbþN¹w%Ž.5DÈÄ“=¢0\è¾j×ÇE¼ÌgÃ:M «K¼õ & — Fº–‰,Æß?â‘MÂ#šc÷q=Dïm2påú#h¼\øHm³m_d8p5œSÔnvvŸ›88”Q“Ò§ p:02@l´YâZJâA«„*ÌMd¯Ì‹&‰7Ò ]ØÜ²&x|bxØ©‹]°f=xĽª¾‚x<Å«^½uecÐRDÜ-)Øê‘Ù?u¤é/[sÒÉT  ©’yTS[(%­)Òò–GQàAD¼E‰˜g]l©BQ¢Ì ËT]Kõ$AÞ"Ú`|¼÷;JŒC-‰âú6É¡tªB#\ÜÃeåtfjCµ,3ÛRN%õcÓªâŽEÏÿ ˆtGìÛ²„…³î:¢ºì9ª 1É.†‰×ïðMy³ÊI„-JÅŽK”üCG“«Ž©ìtô˜žªüPúWùj¾ê2 qàñ=‚9·”Ù»#Q ƒuŽZP€6OÅÊî幂B8* U+Á½ä,hs†Á|Ǭ=¶Þ€ãOYnÆ*ªß—ºAî;m1²„ïõ³$5:Ì´J‘²û½F3—¯4.%"rçs/œ@ùlCsLê·ãº‹‰ØÄX³ïŒæ…b ‘„)Êñs½vÑ’|Ðç”QfŒ¡i÷©T5q£úfu5úú´Àíòƒ¬K×|æ-dV±Ú‹ñ$4H6M¢°¨Q&]©Î`¬­º|ø˜/©ß¨Ë´¥úÇ7J-³ƒ6ª&!+%+R³ˆê ,Œª—é^X7@ÊyqJªí]¡e"p}Ý>ºx°f\»'©Š÷ý‹°’87M®7kzS"7T xtÑF|Ð…éܘÂU*ö»³¿Oo,°îµºÄT¶Üj6[@¨¶KŠX•l¹ ûFÁù7Ot7ÛU|p¢Åô$üžT~Þ…Æ1¬‘hôˆÓ6Yïíª…?Ý ¾ƒiKƒ˜n-™´ÈuÿȆ¹-]PÙûà ´–Â\¸ï)ÕH=SEµ¬˜eI-Ú)'¬ó¡ßö½Ë¼†]v¿*Jüeº3ßaØ8ø‘HÞAæì±BÉ ¢bþíêOúŠ©VÉ“üÀ`7)8 Å@SJX¢¾ :,î‹j"’7©ÙG¢ü»@¹ü"ߣmz€DL79¢%j2nL_\3¢]Æø3‡WWkÝâ0¦¿ƒ›¿R^ö«³VíD–’<ܰąbo›ïZ 4íŒöŽØ†ùãå°ãjÞ«(;<ð{äZq7iñ£±òÜõž½Žb* AE¹ë 8ÖIbQ×ð§1]£‹©³•ÅʦMÚèâšs–}HªU_»Œ6/Þµp…–½õÞ@³ä{ŒWDÏ~ÙV¬ÙÄ7%ÝÚÒ%"ÄD’r¹à…„~à¾×KNó¬)¬—Ò‚™ÔÝÞš[j•XËy îŽ×?^ü%Döé~¥ä#%É( (‰‹¾ÁT©e~‰(R>jñ²”Dg8RéÕ`ÌG9ïËL»MÇÈ‘ƒR\·Ëk!¥¼1ôbÒ÷ƜۣÐï_¶r5ný«AßJ*HyCÝRJ2ÒVe¡s&õWJ\“•G]qtíü+CÛehWj]¼YRÐB±)šhœ ÂѪäñtLßn÷„DàùOh%õbµxi3ÖWÛý3™÷ï϶ÖþKhJ§)=ƒ§ãÈTnýÀ>ó½Ó/"ØŽè÷S ´ë9DÚþdÜt/Ób³H2Ö8dºŒ¬.4l«†@?¶ç†C¼¯¡c(‹6 ëöÆ%O.lq-¿ûA ¹E?Ûq8–r)æ~4¹ü×~Y½¯¿­Êï±+;b"…€}Ã>î}¦ô&}¼› ML0ÊYËðöÞÑ9胪H;`Œþ(”õÙjÌUN"_dgœg_T" †Ð¢îç—¯ÞtÐý®óüÅÎn܇¾àšYÝ^ %¤¸ô›ýÔJ@ÍXC °•„Ê¥d?ÌêÏㇳv@º$J ±äóÑÈ^É#ØÁ5 vP‚`ö/Ôᔂ~x}8ý ¥þWIº]ŒìµûE½^h>´*S¨"÷Œ˜Šø’MsLû ó‰±ëÅ= O8¿MÜ@ƺd§Œ ¿ÌœÆ•3?¿l¼zƒ"G(VØiE„ÿN{&ä”+z( ÑäãÑ£GuÁzþ´Ö‘oö¡ˆNš¸ˆÊÔSÛEÿ« f ?g—…xaý!z’ ®Ð!MS¯;Øæ&”»70'p/ß>øRžÚ ©,©¬Ûc¬‰ÍKiA´*–^îÖù>gwÿér)3©iâ\¡ÜåB(V:~yŒ_<ÆþH*q2OîF‘ ÿÀ/Œ{•Tv^G1!9¤­Ž\½pCd#þÅÁá1Ö_lÑ•$¯ÙçúO!Èt‰s{›Ö]w¬È®á1t/Àɱé&àYÔÈ]Èvà‡näñC®jâñî1þ•"àðCÃ~üÐÃrñ€= ùßbtþ¤GµJõ£úyæ“a¾ R•0EüGLRU§ZaÁ´¦q6Ìö`l˜Ú—Í ö‰‡øƒ>FYFu#9„÷üÓÓf…øË ½ÃÕÁ?±Lô fÝjްmYÉë¾ÛOoˆ%oø=©r1гêaäÖ3¼¿­p–­,iê{ÍÝIÚÊ-rø ¶M:mL€OI™Ã uàÙ½ž3b×aªx„!ò‡‚8çé²> ‡†ë¾*ÊXÚd}!½†h9t•±…«)äß,YíPÔntVêdz°ú$²qèðÈ‹<5ýðjëÅ”ðýLì„Ã!ªña,gó½„"g Ý÷+x§Ð€-ø#ÇSÙXå3ø÷Nv»¾…{ÛÉȽ˜åFTLÆ(¯ú$õñ3c¨«cL"qÖ àÏn}*X¥`&{/wcSEÂŒÞ0Š6%ª*Ú0Ø’/Z…îb°Ù¶²bŒ·AhlWT`MŒÇ­‚|TsWNÛ²¤øÂ )9͹hˆ¿ÿ½³µ½ûâ©ø1¾µ‚Ñ6âMØ›[tæC­é0`Ärå#Lì»3ž*ü\a˜@`z^g tNºGKF3¶ äC9±T}ñäÿv^=‰6ª/Üz³³îƒ58 `È™o®HlZ);#‚?}ê˺ø0Dg¼2ÉXÄ쌨ð‚£î¥;›Ž²å4I˜¢O" ƒ>(÷”eR:®¿Ú.³(öútþçP¶¤£¸ŠÇP´Ú,V ØŠÞ_``<6„Z”† †ÌXš¨‹sÿ‚2FQ×P)6Æqáu² ¿T¾¢&€î€8ÆÄ¢ …ÒstoÄúZºWèºòÁvì(ópPµZÄDãh|P´ûk«†!š@TvÇâ©Ó÷;ºÚ–cTràã‡õŠÌuåÉLU2f”¦M¡Xxgƒa½(ºâÕÅCèÙõ(Ý+Lš8"ýuЮL,á…lÖƒI£¨@Ðl*ƒd»+éÔ÷Z CÉ : ý$°7O( jëW X´ÄG™7d)äd÷Kä]À6ˆO}škÞª‹vumyyC„ïál±‰¾qŸöü-Kâvõ¾.ƒùkâïÉÆm›+­ÖFë×· âÝÊùEÏá·V#l½]¯/¼Cƒ=ø¾ùö×Íw+U(Êß¡°¯¬|´~­¶ú5=D­íÕüw2M÷˜ˆY5fÉä<Ò›ò¨áT Ò‘¨IÇ©´'8c}7$`JWæ{D:ÃFÉÝž¿—Ç/ò{uúéú*€ßG¼J‘z;’¢ &× ü÷Hëõ0©Îy2!³±'÷§Á"U׿DQŠ‚f RÒÂÐäÇŽ—– CÁs8Â]£!Q ss‘2# {8CŸRÌQœ3 Žå``-ÆG"F>Y~!þ›rpT‹¦B‰¥ž3æ»i’1³…Ëk ŠÚs´úQÊoŸñh«$¸Ï¦¸8µ¬rÆÛ´àXÞí*ñ’3qàŒŸí àà´“œŠ´€?ãí&ð²;ëtàtÑédÅT¯2moÕÎd!}(b Ðr°¸d7á࿵¾§ûË\1”¡ºü»îI~Š:Æs.B?|ü•…Àýäxm,!2VAèþ7/ÃVþY=Þûô{Æ„ziK fàžåsÀ7æyÓ¢¥Àß…uR’?ž˜féyÕœ&ÃtŽÖë-rÒyùèÍ,?\Sñ² oØ;Ò‹µÖH‚"m½„MžV «…Pá5¿²…שøÖ'Q¸t‡ƒÑüío:jGìëï?lV—Ø©FÏ_4i$P7ú¢ÙXæÒ^T:ò#íM Õ®hT—–¾’«~\üðyy™+7EGV•ռꇓÄÒ.±:èp)ƒLe]h#çƒ89PÞ‡(xͼÑòç¶a˜Ãg^WÆo†ÛJIOœÒ~8³:ùOqñ¿ÿyÝûÙ¹N?¡Œç¸ %}„˜óœRfYø|(?¥÷ xú—¿9žQ¨)¾ö3‚¥H££Èñ¿7 ‚žç­hÑ‚6Ä57Î^З€ònåÔ}ÇÝ%Ç-ˆiSŽ‹°/ôIÿ1 À8Ò )nÉù™˜1Ý»ÔVL4©(½=̗꾌˜„$îŒ{s>šŠæ¤I‘:%U&i“„Ç ¡’˹ýÕ%,ù –€aHÉ̕MTè¹Ë%BfN÷Б%Uû‡¯"ÃÆ(ú¯‹ž]árIwŸ¡SÜojùlo¢RÊÝ$jÜ'j~@šWž¿$4´Q]“·i¿1ò,@®YÌ#šóiqRÊemÑ1 edÎöüÍ5ýýѲêÈ Ð~gâW{oVÔJ_™\¬epОÿ…÷·¿ÄÎV’,„<„?™js„*¡–ŽÖLžP+ÊV£égùZaø´¶á®9ÝÁ8ÚÝÇ£Sétüò)ÇÆ£›”ÆØΜ1'ë⥎ÈËoqP0úV¢ù?"ñݪ©ðdœ%gýÏK¤Ï-8véÏžL<-•@<ýš’U'ò(×dªÆ‚ÊÈÞTQa¨B ÑÔïœúA' Ü ›yãTc(UCB±Š³c®æ¿ÄôZÝ7»Û—‡»O÷ÞˆíÏ_îíï²w9”>Qw-¡°Êø)‡9݃rŸ£^æÇü)S¦é4“Ëi<ëÀ; u`ot)4:š®LÎÐãŸÒëdÔRÆ Ê„B‡†½À1¹Î3ŸWøÀ2 œ¹¾ÆD‡ðŒÞT({1…µrÇ2)Áþqçè_Gqï®áÄ;C¶€`ßKÝ$YndAŠjŒEn‚å·ŽUé¶,ì'¡"Ë;Ô1[³zöÁL04@<­å‡I`EæÈUŒq“²rë„(Í\zçNì0†³ŒKcUŒi™@Ü çO„ ³lLÆÜ{OŽ(PæQ…¾ZØAr¬ÊMÝW]| :Þh0 ño³½ÐËm«Â n+xA¯ð°´¼‘aª/­ô2×´ÝÏÀ*ѵ«äkXu·fhÏ3‘=Cóm#Hm9eíqæ«Ëìb›âò 3ì$¼bk4c}"…1’3öÕ ?;'’jÕ+ TäÙ5f«rL»¹ÌÕCã,µÇ/Ÿb 6™ªÑ×Èç@Õ«,ŸÒò8¡ÓRÖÁZ!(eÃwÿÎÑ )‚ÌÈÁÒC•zûX@KEéL4x‹h]X°ŸR$øÊ3ȉŒÔÓô ÇßO™aUN­˜ù8¥‚¢Ø_ ³L•/æ—}=œ[e™ý/Å35: ¹f¬Ô òÍ»y¬Ó(ñ×åž}cM0Ðx±"ÚŸy‘å0Ò¾óF X¶Éä³&0 “¿¸•îD¥;QiЍt‹+ü0usM/Z`øþö—¶ò¿¶È Ìf/3³À_u¡c(Xj‰Rù‹-Vpîå†P®»àú<Å%ÅÙTùi⬪ðß)ÎjtLYtF©gä|qV—ø+‹³jSÄY³X±8•œ¶öäÌ剳¤vÍû'nx¿ã‰â”%Õ²IÅlÜY'þN{ëhEª “µ©ü}9 Œ±ýò¥  ¾E>JµÍè:w0(1@;íysºàו-][4v~Þúe·³³ÿtû ƒ7¢ÅÑ9.›Y7Ø®?3܆s‰Êù޲70¢m˜mEœ¢@w¨¦&NqŠ9µ¥ç](Ûêæ‘îV¾Ç¨ù(`¡%j§jJµ2/]H[’‘V¨£Ó,[9Ë€õ9TØÐî÷Rã¿yƒ{~g"oÙ\UOÐhI>[ãjx[0 ‰4„ Lù1ÅY}ïwA.âœ9#€Ru[ YE:°"Vn&]FåþNÝ<ÿQñrãúÍøøJí‡Çû;gû/žlíW^îc? S;ûüta!V„´ˆ¸ÆÚ;ûFÝìÚ±"ªvvÑûT„º¬z›ØkŒL}¥ïsÍŠû[ÿþWçÅaçàÅkܱenlŒš!€"¾¦lH>ÛUèèÄÅH×CGŒöÓ4qÜx8¼d#ÑÀ 'ø&=£¼Ä*^c/Q$V.ë‹ì]1¤dI–Ñ©¬|hÉ’qhùõîUx²S?ô×45à nœ~pC· «z|µyîöûÝ(¢…JÝŒÅ@WÁçIÂqPÙ ³nó%h<úàŠ¤? Or5ìúƒPƧa‘ —¦RÓ³ƒWÛnKKKúçæ¦x°Lå£ç{0ÞŽø_,£»VTøG|Dթ稸ö“OÆN§³´oÉ’7Öò2ÈW ±Ê•Èõpت–ÔPJ‚Ì&VË[TG¤ûusñ}JÎy:" fhP1ÆÒ6ä~¿„Pyóýew[êü²nQ7¡÷Ê6PsÕ¬ìi+ Ä%Á;È$´ˆ#oT"R$CуÒôa;`²—› Ÿe! ¬þ 7ð¡i'ß|6Å“ ð\©u©+$ôJ¦N]ÿÿÑÞÏû0îü´·­œÍ¸Mò ÊemËÂè4¸ß ±D@Ô+ dEá·Ús~26Ê)~»úâLW¶d#´Feì›Èy1ä](.1Dz‚ÞR³¥ o³â†XÆvÌâêvŃö.«úyd]}™ šåì[(å¸Uˆ£lIêŸ0JoÖýO"•ÑØzE'Ï¡ƒm0L´Ó/ºF2B†Eg•³g?\¤I+2K°IŠéÆ8l9¬Î.ð¦J³E[ÅÞ¿ŽÜÊ 0øÞé_S’^ ÙVŽô‹ˆ¸Ê’åNÒ½“tï$Ý;I÷NÒ½“tï$Ý¿²¤«vôÙÞ¢š…r¯ªx3âoíö¥`ÙÖtaØ(H’œLïDŸ‘r9¦kž˜—u·ÑAJsžVnSO˜`Ž>yþr–árF•|0ß̹TÓ Óz &0@~–ÕF·´µ·ñGÃÙ¬øh°£ÍV #Š^«£hÀÞªl Kœ¦@Hž"Ç›£ãý—táÀ_EãŽË£bœY•À[Yq u°´ª‰ ÃŽ¥À7èQ£ït'gV @¬rnʼnÇb‚5ËU¬Z‹WN˜\uòaFJS”Z[4ÐÜ Æ,«b'¶ ÅËÒ†ž‚ýs~'qæû} - eœml3:Ϙƒx*»Ôð/Õ‘4­G3ŸXKâ$!Ì Þó“Ðù‰ÉÐ’9in¾‘Ü{Ä!§¾À$“Ê+ =¢C™§7žÐw.·ã¹ŒØÉ€Ý4Ù&¬`¡—©[ås`±št*NíPY”¶f~ö‡^t|L­›@†yœæc7]†t†žØÚ{SÏHׇ[¹¯DÑœ4¶\áGvÏ©ëÏÉÆ¨óHEŽýåÞv3›_Øîå¹bŠ–¸o“ÙuC‚Ip˜Ã-Œ×g1ètë‚@A`ÆŒŸ´e YL˜é8NªXU‡¢ˆV3áíC•H.êæP•Ž„2·j¼gŒŒØ8ëŒvØï¿^Åï€ðŽLì«\!µÔ øªC™ú†|ߨXXXXTÓˆv½1ºC¿›¡/0ôùíuÃÁÃúÊÔªoB:n'€Dâ†)­¦À¹³54€áHIÝHeòJùpöUž  ÄO½½ÉõX03­ïDÝÄú^Ïí÷°ò&|Ì¥ª±‘“¦9(]±fÑòÂà†± dKù±ž-ú§Þ2ÖùÈÁŠËÍ~éF°ì@ÚÚ,¤FÏYï¶1¦bu[j¸µñHJ ] ªdµÄõü,+¤4(­?OÁ$› YkÕϼɦ4u‰?­T¶·IdçCÌv%RhDÜkûÍâsKq/dù˜½b‰ÞÝ»'Œwâ4>’+I·'bYùFõ4PTú(~¤p?Øó¦pÞ¼áxófæ9Àª9“†v­i¸¼ŒOÄÜ¡Ð{ 7½m@á(pFž´~0=Ü@^ÍìÓÊï<;0úh·0ì é‡ßÏw§¡Ã&˜râ·‰­j÷.9ッP8—#ØÖ¥:5™²Œ+)V4v-aqäÌш·Ð¾Š°]–îøï7©¯„C‰Qï.ìÀ##,„Z«!ªô9Ðñ«“¨³Ýo_”#¦Tå·8ëõ(¬ºÖ@ÄS61ª/#œ:O8­‘’>ä„9ŽIü}àÝqØ<ÿGÿw;ăþrÑzóèx5¬n¨4¶uNFŒªä rÒTÇL¬Íi[t>¦’»2œ7ÇuÑëaØmʦ«5Ìã󀲯Èûª[ƒ¯@×8'Þ7üÓ¨©²0@XGWÞØ¾¤N´°Ó°WÐ-Góp©?œã¬\µ+c Ž—úbHcF_ñèWÃJù¼°@„cv>mÑ ¤ƒ6­0Î “Ö(˜ÁÊf²®²{,ÅEǹÑdLAc@Ê›8¦k–«›6Oå©ûg)!‡¶ç6CÀÆ,{âzwWA0LÓ2G•)–úΤ# öˆ¦qcS¢ÑÜë]@tφS›á¤‡ì GízÙÕ3ðçØ‹yhP©Ð¬ÄYÂz¥8öûyæ ? [’uù§â„`Õê‡q˜^¾Øîì=ÝÝ?Ú…%Ó8¶ÇKP‚ye0×Ð3[%šv L™±i䯱axÒÑŒPF%IñîMÉãIðB=L•‹ag˜KW+7˜¤x=¦=éŽ}ß±ï;ö}ǾÿWØwäúT𣉝#ãkŸÔ‹~m=íVBò ¯m³ q"ùö·ú“°’§¼»eþܶ䚲uÇWL¬•#ǰÌF›ÿ¬FÒú=s€@±¼e¸D?BþŽÛÔõ¡[Î'ƾ2;;ãæÉ8V™C+ÿ3'ߊ©úìpLØ"U©”´3ñäÖÈ.1ø®ÂáÍ:ÒeFÚ°èj$¼…7 ™jé–é,ÙaýŸª•ç~ÃUêT¥äc»ú4iI¾OFáK@•¯C6a{ì‰×2Ô[ j,d½5£˜¥ãö)±ÐaêáÐïOŽ.ù …F¤šê¡ûÞƒ…²a6ýò؜âËjòi%p(ΕžÑªñ@½Œª*h ‘Aç>ôUµ‘ÀsL¯Ø!m6kû”[ÓNóÔN‚žÃ‚!zDz!Ù/ –¸G)¥"¼ó¨u 5_°B9£¦¤¼~öCÜôå‰/úŽ001µR8Mè¬ÇÁý2‡%Ì!³?x [UÿŠvþ`HÆ[(×bäÎsÒ¢haO^ž¢¤à0ã&Þ²ê@²bià¾wâ*Üå ß ô&AÛýàJšqîÞÑhp%“øFÒ(îæ$*SÃ:ÂÀ<2ù/š¤MF(£t¯0ðëX9R¦(ŒžR6F“”Õ ›•Tô·,njÆžÛ&Á7Š`Šf˜ÄXKÀŒJiÓJo£êà›.¤M‹ ÄY…,2²*SÚˆ‚Å …A¯);¶%øR§üXbåí»ÈÜméþ2¦ åÖc2y£€‡”ˆp?#«>ûìÌéë³ ™ß„xšj%=¥|¿ añŠ·éùb;"g` ¹§.KH·Ý¬ì£Öø#~4`óß¶>gÖÆˆ÷(ÐZíHZÊ|T_ }a [”úÊHü )5³ †ê ›š»Ã!t[^.£b[àI¨'lu}|ÔH¢œ¢# •KZ2¦\V¾Â•ÈT(B¬ Išó±W£Ñb#XrÊ \£¬¿¢õ«X¹‡é4…Æ Ñ¸ÚÂŒÁlž(Á^=©`^&Ãxjö¡Åi³x\ìd<ÿ 8´v™!5â&a8dz /?¾ï B1(ae±¥^ìï k¯ñàÖ}F•ùë›7Æ[#sÁ¦™ÆÀ(BÛ.‚e{)ù³’¸z‘~¤_a >%â^+k:£†«gZu¢è‚‚3NWVÙ2;ÂÝþš×‰Ìamvò׃§†£û†FSxÈÓÀЈÁ׆ջwÏÂ;H={R`Åã®É¢Ÿ¼ÃÒ#ŠªÔëutÞºª*T1žnV“å:¬³Š"%L©êñ ¼¯TºáŽk{˜ãkÎeÏ‘a$Ö®$ àŠ#ýb‰Se³R†,'`›dÅ–”yé !ÿæMüj?åo“Hˆ©qÿäóZÒ©Œ˜­äÔnÄÜŒtHq4zc4;oRÛ1H£Ë sb7}Ú¯Î@øó"ñˆÈX€’”6­†K+‹­Õ˜ÍŠ,ATh®n#…ù˜ƒP°VÂ?Û„EUÝ_ ¡ºŽÏ7°jƒ¨††Ã‡¸Všs‡A@$—€´…ûvq ”xáÄ…d1Ã&+•œU1q$Çæn›‰»g 69Rž©ÃLº½s˜{˜‘CÖVô îd‰éiŒ°5¸ÎæYkß_}T;‰Ù±•„q3èàɪʜö˜®V¡Nwš#H¾m·[ï0¾îOëüUå{ øP8oÖZom½Ã¿+­v³ÝlÕ4åoÛ ß¢_™û;[/!d•"U†Ý4†Âù-ÕAKm±á·møómëÛ³Ú‰rÇ;G¡6Y!²,­êþÁ¼Šø ý^–.$ZU0d›VømZ¶TÃúzÁäåû;d€,\‚1SVY–"#Ý1+’ê¼BG@*Çñ„ó2ÑIˆ¤ôl{»›g‰-“<u¡—ÀF>8*§=ÐN0§n=ÈŽé²¹¦#Ï6Ó(-;3mÑ|ËÙàÔPE\(¶<¯* [¥Ž ÆÆg¸<ʽ}>›€˜ñF§’¢ÜÓp³º÷ôhCÀ?›”2°s´ûrëpëøÅa… €:0ã+Ì+½ßPfTÃT‰Ó+W#šå¯›Í¸aß©.Ô2×§ü·†÷HrS6%§D­ˆQÐ1F‘€ÜüˆWHAÈ[ÎŒ«Ö°aâîˆg­FCfªkH˜Wì¶<Ƈúèò1rÅçJ›ù^ãCSW‚úp~ëÒâÂm{ƒY¢"¢à+µ ì$Þ‚5MëÂ+. Zh$D§‡¿k>tÙ®DÊò^#aþÉӬ9’¹ìpÒø`Aû´è Za0­FÜìO2µÕÄÂÀëIÜßÁL ,»á4B…Ηi #ò‘wtöy©¤O1áÒ\³ß®"ž7üh.¦QÊøÆ”Ú’7 0ƒLe¤MÂ9õ'1bN»¨Ìeú8ç#¦X‚n,G ¦Øæ;¿^ž‹·qšç-æ.`ºj­g®^îS˜Z²¼ØsÖWöÊÊ:Rêôe9ïcYº®á¨eÀÌñÐJ” ˆ¸ÓGZím`²R÷TŸ3H{&Ù–df¨aWìÓƒ ¯åõiŒ-ÊQÙ,“è„6k¨ŒÐ¹öXÁuñE¡º™0´œ’ó0i0Îç4”j«#yS!ÒÒ¶áPÞÇ,…Uà¼}g$o9B2‡ïðEªí¡–5‹èSk廙[|ãתüÚð “s³oÉ‹‚/×E|àý¢×wC RÊc‘øQ4=œâ;›Á¦,`-JG,·¢[$ªÛà" YÄh˜ÄUs¢Ùnc§NöÛÛp^À{#‘3¯ oÞ¼{¨uÇä§Oi '·”£[¾Ÿwé…'ö¶?¬›²>ÅË!÷L¢©è½{¥8&iæ/¤J?M‡ìñu‚:¾ü4w4êt†óœ9>’#PD!ΰYk¹SÆ[G3M†êÿRx4ýådë…Í=xjžF?¥ùÙŸÛŸxëìŪ¦ðÆZ/ƒú$OFFð°ùvíÁ»Oú[s¿¿}ÄüsAùR úÚn^™úñ…€ 9*¤ž¯ÐJW€ xN¶.#Õnc_0ôo úBaÁdí„Wãn®„k²bþ ©¯Iÿæ^ÊÓã&Á¤,¢´˜å†À³¦Ö»D3kZê,c?`ÆÓq‰P'2D "Æ·¢9zÿ€Yè¥Ù ë™ö eq¬âÑXÚn³ñzP§É²ä¤»ü¹‹ %ÃälHÝiñ|ú]3Ï2†8@‘Í@;sLŒˆˆw+9w$ºc®Ó‡H8ÔV›ˆP}Ê [’ Ö*ú§*cwÈÇHˆeùå#F 묜¢åc±ÆòøÅ6ANþ…GàùC8W»°6Æ~/~†V¦-)íââ:»w¯uÖëa7<}€ å Š„vΉj€á¸&Dî¥RüãXëܚͮ{Æí«ùnV Ž0µ´²Ã°k5¹q¡kfÁLSÖÚzÔd¦ù¨ "”§<¡99­G@˜ Í—€Œ ,€”T0à³.Âlõ¢¿`‘…ŽŒ’$:Á„ìñ»§.Ÿ«AÆù¸eäõ6E”kâüI»â¨¤±hãKvªÝEÁ6quMíøµiˆ×’U‘®™ÌYXÞ%ÎäSÀñ°¹F¢¬<ò•“7€ ƒ5¥¸$ºä+t0€¡®‘ü­ÌSY ÜC¥ÊÇÎÖ©"'•…ÄuY™|×t´Ž»ÉêŒ LÀ| ºîrшå¢]%báƒ}'L†ÈÖñƒäóDy,šE ¦i·°'ïÊ™9 tì%˜»Ì]<©ÖÖ¯ÒdÊ≮æXA(w?ºhŸC5i®`à9!êo_¡Lgru|H¦1»Þ§¦(]ûZÓº0Û`­7‹]時¯Ú§øW­’W·„,aª?j¤„~V“}Y@<ȔƎGV¸© >òdÒ×úµq`÷]Ô?؆?zPþsãìŠcÑGPM"šHž„N yg+ƹ,Åp¬X¹´‡¼å Ià0†‡\7Ž;ó%rPýV!"ç„ÊΆlÔ;£ñfêIžò‹Â`·Î(”A]ü"¯Ë5‘!=Ú§¯{[ <ê?qƶx cóZ\þ<ˆm§ÏšÄÖO}´-•—@ÎEQí׆±>«%ÂoÆEÖ(*9"#nF¡îóõ£ÃÝZ\¦KMYªdzÞó[K¦7ý®¥D ÄšyÅ1F†aÈÂŽ*)f :,m×9sÙééÕ€CŵKeÒÉ(=îx̱kHó²¼Mœl¾%XÓ`ÿç¶ ]o®Wñ)5—òD=Ïñ#¶‹²]:.;‚ÁšyàröIg§„o“&‚õ²K$»/×cÀ‘°²k4L’[ùž™ƒRÛjÛM¨o#™Æj<³´zä í|£ÙŒŸ2œsð¸Àäúïk±fv”§ Y]HÈ}‡Ctá‹ö`‚ºdø´;Ù^ââ‹Äd}†hfð´¤ÝŒL™q–d; [fãºK6¶I :8Úù.þo"¥B•( 2^ÈG±z³³°IÝœ¶Lp…– x='o·wd¥§Ì Òw}ƒZ5¦©¥®ûNbÆ]Y¾®j)’ûñÜ*-´;È)Îá—7§'ÜSm³ÞN?ÔDÍYó$´2rX©©8jb4 ‘\o_ èÍó‘ÕI…UÞ4Ym²81†dÕfš¶@äÆ&ΪedN€ª_ˆt+SN¼Îf¨ ОÛî¶À»-ðn ü/Ünj÷[˜á0"Ò§‘ºpýÈBÁBðiR"Š÷ ]Z-ah¹Tnr42°OOi„CØ8]åvñùY}Ö‘jej©QoY•¡óqÀ`ã›~çÔÀ+äþ'Iy,!XšS9è&EkÛ¯‹wíöò·Ü‰v{õÛ3뤖¾Ù4ü"ÅBŠL‘4Ѭº›ôÙÕ]†Î§cßs“IJˆ`D†>¬šÄ+;D$"îBu*iÅáE·K ÅsÓ:ñƪýBZLðÄqf jÑTËÚú®QÔª9ÓÆÜpw=!eÊqT·€ì¶;2àM¢WÐ*v£’ ±i—èwbݪ¤2Ó}3XF⚎f® àrdmbMÿOB¾ÌªàÌÝÏ?–’G¦Åo„œˆ¥ÂšË€x½σŽ<ðäWÉ9¢-‚$¥Žc©WÖ,<¡mÄ›´G_?Î;nw8šB¹j Í=ÿsw,s÷RÆþ`8”¦‹Ô¶c33ÙµÖÀó_D)¦+’³ÇÍÔð´Í-_½n\ìÊï]ÇÑ®O\èÌÙ»ëKÊÚºˆî߯hS1×›pHœfY½/HO‰kÆEñ~èŒÎ1(ˆk]8¹‰¿ÿ'è>øG%cXð?ŠÐ¾ U¦b‰äHˆ—9|e¥E%Ý×hë;¡ E ÕŽ`ó‚"d0JÍ6ÂFãkg°¥Ù|]{ó¦žìñB½7À¢ž_d§ØþùÑ/Ûü ÷¼‚ˆÎÔ2䘈' ëÒŸ >å½£ç+çkÖk€\½³¿Ï†PSÎ3¢6 áN¹ÌÉ63ùG{yìà1†#,)“û&šù“‘<ûãÀ¾O¿¨ëð£xáq.@ž™dò‹P^®þ‹r{`Éá¨x”h)·‰HÅs”ÝÌõÞ7 VJ XrŨ¥D¢0EõÆÞó—û{OÖ­*fÂéÄà)™;Žx²þÐ=ݬ™ýJ€©IÇëݧ¸Ùž¨C>þ! Ö®ÕÂÖ¯oÄ»•V ™oZ¿¶—6š+íå•j«Ÿ|âÛÝ7h×Ôþ}?Ü:üW{Dq&+A«­‘Yñ7ú’Ø–O,‘ºÁ£U‡‘Mú=LÇ•…ë&P¬µ‘ =20jTžÚNÀL(oi0ò0"qÒjнÁ˜Ygœþ=%‰ü(òÛŒ7yêþû­H.wT%ÈÎúGRpÔóf%nO£R¾ù”ÇFReÐ)Q…OŒÎS:#4.|©'S/ KM†i1·žý²u¸d@Ä8–/hÔÑLpy³6&|H(«ðJrìø6_Û“ü[K& âåÖ;ú}N ŒÉ¨”ïXVyêÈ‚ƒ±D$… ³þñâÕñËWÇÿHâoÜ1p.‹¿x±ßÉ.¯Ó Fâ&mš0¿Î§•æî›Ýå¸QªÜREâO¼¯qð+«B²ÛÕô³Ìª‰þàn"‰ûcŸÑ­x(QÇu>>ß:Ø{º{„X´¢D¤§I0Í!l³§ðÎÊäLq@¢¡J3˜äH5,X·ô­Þ0@åzVqÎÌséŽÅjrvPðÍïh‚kÔ¤h³ $޳{÷R+'W(à•“+z0 Cþ¸Žè·?+ïä ½RÈ7$¼°<8“vm¹'än 6nÍ9*üéN9¢ á•Þ¶Ïœб¢ñF2íÒ/»£ŸV£[Fr²Æã¥œ!µÛÑJU!TI®Â­—וӑ*n¸Ájñ 7„÷¬Ñl6§(?ÿòRORXÈy¦J'$Éþæ )H"S}òcy™RKš¤s¡}ýÔi[²Î”¬ß@ö˾6zg“ÉREçö(ôûWÀŸérª VwQ{Nj6ù/Ë:}‡Ã—c臄æÆ¼•2wÂÂŽÉì} ''ãz£mµ­ ²gǦp=¶-zߦ­˜„¶¨ô&¼L<¢y‹zT—•7È‹i#¡ LWoã€-³p54³À¥"wÇ¡É0ÕD‰J‘RÃ…¡W>yö|YY fõ”Ù;Í\âÙ%0üa,ê^rjÓuÌ™Íó0á¶’¹m±ˆ ½‹¦mÈë’²oò¿´¨ÛzU·S«XÉÙ„«v•ƒ´Új)·«ÇÌ„[HrJ¤q~ l2vl’ ÅÎýžÖ×FÞ œR}Îh4WωZÚZøé×OOxNl§Šík«c—Ú^› ô¯ÿð(V˜?'™ØÁ÷tó=ut‰Kòo"‹ÁÝ ~a,?—­¹Ê`{zïÀÞ7 Üö17v/4öV5 8œ„ð®éG#š“RLH7@.™ˆúóÖÉ §’¿¨hzé°dò)»ýp Œ3Úò½ÊÉÒÚÙŒ3[•·¨~dt|«®ÆÀg±w°w¼wpt¼u°½+ŽwŸ«V†ì«•WÎé؈[ØÙ=Ú>Ü{y¼÷âeYªmYYâoŒ­ã-ñüÕþñÞËý]qðâàèç­ÃÝ@h‘}zgx ó ÈÒ>¢euàÞÙóÜñ± ­V¿TëHÖÿF]zãß½`L_f1ÍMj§÷ÝE 5¾+**^‹ˆ"mírG90@¨{©2¡YX˜®x ’>#¯þ–>¦šºŠ8<ãîÒ«°wñÙ'£íDÙ¶E'i<1W[öjë °HÕ²žŸD¬þ_œŽMuõSS]ÍÔlÀJ€ù(á|î ÂÝžÒÌ,ºîˆû÷Ï&—å¯`Þ½{**Ål±ÙÇæ„ øì¼w8Ž'~v޵­Ò ÜVó·6²œkfL<Ù ûkÍXd'l&éf*GÙ#PbŽSÛ ðú„­>» t aÚ{Þ`wÿi©ÐOñ®4œÁ©Ñ™bE ÔuôûÌ÷NWñ˜UPàÉÑŽxÀíhHÚ@ŸÊȆC•’r‚¬Ì¢à#>eâÉ¢!êß¹í¾Ÿä.¥ˆ½¶Dé FG“ËŒN·I¾×ÍŒœYìÒ½>ƒ×éîá-b!Z?øcå /o 0q½²°°°SCÊÚ¡é·‘Ujà÷lINú׳ásYN¶½¸ûš#¤ZáÚJq;Õd>ÏٴȱA³-ç\xŠ‹¶»k«Vÿà —Ù `x‡Âx—5ü€l[o-÷ëÇc¼É¨Œec3Êr‰ZÇt?¦¢nÀqßasbJ¦taSb7˜ä_Ê ^åøÉ  VçÀí¹›Zõ†&ÆÇÓdØY Á1¢0 hÚëIb1ô‘ðèJÆ[BkA™“ÖŒ\ êcFts0mÇHnÌJè÷'M%éN\¹Œ‚ànœòdƒf}SlÐ}ãï¤pV`IÓÌ‹ž^$!.s]”â–«¿[bE¿Ä%pãÎV7s)«–¿Þ‹½T™ù¸BÆÕ¡Šý_Ç.2î¼æäÜSxw,æIi7ïÕû+Ÿès5#ˆ¦d-å/3óV¿0}—ÏŽMÔM’f"磑½òøáÊ'ôJMÙ„$¬4¢¨t3I°bˆ4ð]ÔÙ¢®NUxCV´w—h(vq†`_צËM e„¦"BŸI º­“™AOÇBœ2Ì ‰Ù>KQçRû 0¿ZVFI¬st ¿6Î(‡Ê¿å¾ÎßÏÜæÖz¶¼ž¹pòãÂ4Á‘ ¨r×nFF\¸áp!K*\¸ qð+—ó•Jòß rBÞ¹Þ"—+ SäÊLá±qúroûOâqΓÅ)g³˜3ÅÞ/ÂFÓº¥Áüy¼69¤ˆçFn]qW´Ù¶ÿ< #’nŽäíz˜/àòí|9G\(þÊæª©G2x) xaQül÷Þ¯S€|îªxмäɶ‡Vñ*o:®¼®Ó³Q+ BšöëÇ(·g3~ÔÓ bÜŠÐH #+£/¶ 7Jþ.–îÃÁ„ÿˆî‘ a™ö²À!Á¹ú)3|ä–°«ŒUNQ2á 1Æ(%=:C? 8P0œ i·ÃM1°Ï054þ†Yï9!†>ö…ýÁwû´‰Ñ ²ßÀêøÃ:ÂY{ôXüÓ}Ò°îFC3:ßuÆxpÿò‘¶uÿòñÓ§ÛüsL[ÂÁkhò¹O™¤&#Þ׌áÛØÙdð5L»#Ânð~imY„#»‡¦(…£EYJ= ´bš Ff‡õ @T?nì¼xÞ¨V?‹oÅÃû?<-±&Ú+bíñÚêÇâžX}ðpmõ»ïÖ¾¿b8Ùå^Ž¢8b±á„•¶èÌ÷BAK‰jFƨzaã7Ž!Í7\XpðV¿<.ÙežhŽží!+eÁAƒâ&œÁÒ¾ ÃV…XùyEºÒ¶!dR™J¡C’Åð4Š–&£>ÁÎÈ-°¤SúuX4³zIdl©ÐífY¥ÚŽIœÃ ô±ëè|EA°_v`Õe°n S(»|zÝ;Ü{#SV3”««åtÏAÞ‚;‰’õ),í†À~¨=’á³F%¸j›s–_ãFÌ‹ÚÄÜ‚hÞx}XoLXq6æÌƒ>NåŸ&ö•eNBV¸²4HµM2&%âû1B™2ô¸ üõ_У䀕d¤>so å§k¥æ+{Áèz°¾Ýq‡ Ü|Â&—ȣ߯à2¦¡ÇÆ ô â„êü[ž…ÿÓäáÿœ Ø²ÃVú=ä Žìy½¦XúçÖÞrÜÆ@Wâ!çEŠc$óY$ö*Á©<GÝf[ÍзÄUáÛÀ¢CëÏ/¯ÞpÀÝ€»ŸqªûpFÊÑTj‰ Jz)ît,óPQ8±œM 9"úUŸ“ˆa,e„ØaŸ «¶´|¿ñÃVãßvã÷Ÿßµ—[˜ w°œ½ù¤ÝUÐp!™‘zZíªl¯Ýl®´`ì-<±sËëïˆÉ-‘ì.e—6ä‚~`®ž\¹é;yù<ë Y±‹wÚ¶¿¬¶h¬@ÓÖÀä:]ÀÏX1WG Ä X ˜]ákÔÏ•Žõ—<éÏ›öfEæ'lÑ—)7Û§ µZ±H‹æ£½Q÷f‡>õ~ŠºŒAt*2sCjácQmRâû&Üí®ÿ”•s`ªgîJ$¢kóéõû)‰@“,±ŽñÛ`1â»æ*–Ð Ø.å%ähý>¯C iè >è%Ó~#¶~¡pbfé²T‚„ïšV‰k-ƒÞv2é……âàË·Ý‘yRF/,˜WP”ŒÂ Ì’è\(ÛOü3Ž:.¬³ÍB­ø‚Ò(Gåk¢áª5\Ã6Læ”É«YUc_;VR©‰º™F¯7)ŽŠŒBÿdîºp›ÁAcÇùÑœ$0 ÔYo4JY¾ÄHd½ø“QŒ §ÙHÄAVj[¼]m¡…Š!OĵX:Çù4¶˜‹´¸Y&Žña¦3fÂ'pašÓ!eÅX¯ýà½øL2ù;¤å7Œ¨±Ú|$0jtï˜@Ìå8sRoMC•õÆà¬×þ…oëëVÍœìoìÓÍÅožF&ŽÃ 8!'¤ëÂiëLæcQ±¹UB?L¾Ù‚Ièg¸ÉÎŒå™ ªòÎóæº23Ó'žä¯°³À©7ñèN_F1XÂö(!—ó²˜&,Uia׊®kºL¦ˆÂ¢x¹©¥³àøáé\ ðùP~>º3püê -°àë6q¼Ö|Yeâõm™ Ì•"ÃІÖÈò¼¦L1ßæ" Euci´þÍõwhs¢H×ZóasõÖâ é°c†QKq~Wà°¸#Nrß°þºFõ×÷Y¸–é|ÜÀ©ÔÔdÌËW0)!ºk}-NI)d¤¤܇\<«ždèOH2‚.ŒO…õm(¾ ÛmÏRW hã‚ÂjW]V"B³”¶‰Ôi½¡Ò>6ä]‰Q%«ð—›1$S×Ãý\’)vQäO¤ hz³˜‰Œw$ûS~Õ¥.ÈJÜß]˜Ý]˜ñ…™þ¥á÷úMÜ }¥hÉ` ™îŠuéH).ó½¯)YdJ/iùe†¸ †,ò•ùA.Ä#4Ì‚¸L‡ÈÛDáPùzÿpiì×¹.»ïÜÈÎsC{O‰Ý§€!Ïņ‘óþº Eܳ VD¦³nÅ£þ¨3î—82 ç½~˜!&s8ùpÎxòèaóòÖΠN„ÌÐ÷'=·ÿ_™[ùÏ‚{¼ŸxÙ“°Vš—´à¶ +Å!«ºÜÐ@¦g…v§*uYÿÕ\ÕÏd;¢ŽH9ù ­[Ò0DÕÌ3úÈ9|!yùóرè6ÐôGü SÎ ð0Gi—wës‹òCCÊ’D¾Ö|{¿ñèÙ\›š+ˉ¨€ œÒWoHýÀý rûÂÃ.Ò4òƒ¾Ôׇ?¢=¶N0L%"; à5~Æ\­‰.¸€dκ¨Ÿ?âеæc±4´¯àt³Ö|Ô\ý ;Wh(­ÀDÃŽؽqLçod4$ù¶0Ì`n¨…)”L[€s ×àKDR)¶ˆ§ƒ(Ÿ âO±K>Ï´®3Žà1dëy#Á Ð+ïVfÁVuGÊNòý¬águrÝ-ºYQ+‰—Þ¼g¿¼í‘õ»¨~¼|Ž‘aê\òVQ’»!ùÕ~]k7¿ËÍšûEC»œ¹W|íû\¾ƒŽ§Ô~—7ìÛÚönìðscÇŸR /sÊ |D¿a?üNªÿ‰óÛÄ…ÑÕÏjâàÅ1|‘>Åhš@²ùS?6§®¹gw‹,{‘=»[U·¿ªžÝÒ‚¢Ìˆ¥•=‡YŠž´°½PRÎ^ »„Á¯ÜYsäÙøÞ—kÓº­™ôáUøááÊäbκðãÑ‹‘ã½:Ø{£¼òÜË×0§ßÁØVß5߮އï&ðøSÁžÿ ¹öáQó>Z{øNŸ²sÄ Q‡Q«”ÍKU&οéU3ܱjJ PxæWý\Š©ú47‚š 4ÇÄ`?a¾¶žÊv‘: ‡¥ö³[›ÑÀ- 0Eà†ÚIØ$QùýÑ º@†çκx ‚þÖî¦èÌÈ“/\8bèžáA»n]Çò½pdĂ̌¥ðÆ W'†I — ̹‚í])¿bæ¡t§†vêÀĈ=¸°¯B:^è«®wèØ^(þƒÇ» œCK*õ5‚(:u¥çh9¸‚ãá†Ù©ãÆè8tÐÔÙ5Z\‰l÷ÜŸœ«Fñîzà+Û¯Ú:†ú]¾™ Źc¸jœÃ°ê<’(þ_‚ä'™•Å(ÎwXKÄòMF*¹~0èÃzFJÜLý~mŠäGiœnß(—@)`Z ¥õ÷³¾×*Ô7'##¨csR„«YÕ,0–tÝu0ºötà²\N (VÖìíqÞ/Ì{ w$ãE] 3,¯n?0Õì¾w4öGWoð¹Æ}ÿ¿æ"âÃå…¼¿ý»¦Ûk žH裨ÚaGZÔ·¡³^ýŸxâùêþÞÁîÁ‹Ïë°ÞB]×´LØpûÛ£Š"õö1Õ¨%3¦r¢Ôßþ†q÷;݉K/è±ÓTíÙö6[‹?{ó†¥ßû;\`ÎS[¿ìn‹Ýç/_®«§l‚ã†Ø(HâöÀé–p¯—jÒS7/ÜV‡v/ðáð$#Ñõ`CoT J¥3ÓŽ} m`•|ÐܔΠ1&Ëô)´P¾¸TYi‹Æé`ìÃ'œèd5KTO¼á­…k‚ŠÂ9o¦÷Qq¾¬­mŒ“3×+¨š*K`xº§€ þÙi¨Ø¶Ú¼ÛVÎbl[ˆs9KmË<ÒBb‰ào—ñøoàÚdOÂÍêOð³ä²oW‚‰ªêÊ–l‡VsôXN¦ÎŸ¸(^ÚAȺu­ÜÊ ¤ay¦÷úʃê逑F* /ò{ Ý‹²Ê.Š#Jmá ´Bÿ½ãŒ~ñ,•/*†*„Ñ*µ*Êê]±©3Á•‹£ƒÏ•Ï+ÑoIÆ„Fc#²a%„[Õ‰Eö¬•h E£¿*ÖdîÕØÇ#MãþD\F‡B»Â](ÙeÅÐ)8¬ÆÇýúágKYk´8tcRé4/ûÄGèalìªòå¡|©õþØùÍê¾áý˜ëMtêGÔÔèvw/GªGp‚ |À>ÌŽƒã— ‹2ã‘ç—OÓLù§S]Dg*BZ*9§ÄgLt.³uYA¢ Òéy§¢Öد‰ZMކ†Ñ؇/›ÕDaÞæb2LNÌÃÌò0y0)˜ƒ’0M‰%JÞ˜ÆÒfNÓ›fË›Õ ™4ySÛ6[NdOÈ]GQEë‚ïÂ&qE°`ÇQmtâÐ|Dñ¤öP„ç|LÇ墶F_êáQXúà¢M+Rð ¾r…•"÷;8·ŽÝ¿Š×Wµ± W—µ¢!ÛÎF‚…2º•éuH`µiŒ€‹6Ôø^áÖ+¹5. ëXÕEï?+–Äg©z¤_¡ZÅsÄú„.)”$EªÊâ9š±…q—Ä%z†/´z¸ˆ.“‚äÀâ ÀOL|ÅÄ–;7±÷€ ówläÑ‚‰¾Ñò«$Dó•& ‘!ðÆ’虇xQUì¿P[˜,®ŠVŒœÔ˜¿) 'C”ð¤!¶HîBìÿÔ}ŠÉ(ªí£RYJ¯‰­5Å<‰³Ã2Lªäc=gŸc§>?ûJOòô„H›Ø´›˜Ùt,˜"9½Ô•Û— é9“Ì’½I?ùÔ¦ ,NTtòÀ©«T V‹xe!h{àØÎ=·›¨b´›Î¥S‘Ù™åå™ÛE¯õæðáºp‚ÀÖ‘muplaB"kè$a^öЪà”ã]€F:2Ȩ¢dñ!½R9ðÅá1^A àÄ2X#S»'ÝBi+ã¢ZRzÚWR77‰´rzs ôm„̽ǮgìÀòÁ /š[^†¡Øgöµ‰!Ád‰õåF´g–g8w B¨3®IÍí8À­³{÷,dø;LJÇRPL¬² ¢’`Gä1FÄd*+yû[@úS *s31K¶©éº‹7-pB”Þ¸b0Óå7ü6ùoÄ7g5ùóWñÍ7µ¢´â?¤Üw6;º½‹-õ +²ß°wª<Îò:ºwO Ž×=u{´-1± *]ƒºpÆ=œö)ÙãóúXk¼ÔkÙEŒ>ÕüCÞ|¥V©Ý(ÀâØºÝÚ{#PçkèåÞ¶Ú TW1î:õUdר©PaÈÄÞ—bTŠûûDu8ÁÖrç¤FiMk Í£=tÏlÔ;/óøÈ¿p‚Q/÷;thOÄœ‡ò¦e ¾8z(š°â³²Î—ì ¡>þþ}²a©¡S^Xx[DZxüýýµû<)èü… ®TªÈ:^Ç$àÙý¾:"ÕC‚R£³/‚A9CúŽ… “>^ɈK©ž€8pß+XïךeqÀm‹lAÀ¼½ñƒ5Ñò]>ƒ£›Ó°f`)C­Üu`feÚ?#ÿ|ñ|àÝþˆ3N`X¤”œn,¯:-Tø ¤òâ}Ób]Ál˜§wuváz ‘nÌGè³çœ‘å|L>£ÝÀ M_9ø> @ø"鬻.l1­f{ ÀQxWv¬4ÉÄD7[ô¡âž‘åé…µúú~k8—6ncËMcó ‹~4LD*\’BNŒÜ íù`‚#A`þ ,åjàh`KFß 1\OÞŒý†;Ä,Gd9}ïììïwvßà_«äX[(ï±5TÔ²r"’Ld!‡Œð£orƒs{úý«bâfUÚ–ªbZáÂ8§ô#¨ fÈç?wvþ…ñÛIp(ÁÍ<¿Ñ#ˆµxWúÿ93R,Šÿ{öò%_Ïz7mÄsŸÊ Ký™Ör¼±sÛ}?™¾X~ÆbMƒàñ˜'SÙ0›q.ÑÚ¨.oŠ¥HÖÌ댹Æú“Ù¢L52ë.Qpã†ÓâD×Ò:]œ9ž }® ¼„L´i@‰w//7…ÁÄ£$´ñ~±åÌó—ºOZ.ês¸#Ïé©Ý1õ¢< $…O’ŸšdjSçãñÃFøÇË-ŽÏÂhGâÀ—ÖðeBj Ê_Œ»´¬”¼;aΤy­D;å8^òxÿH ÅyÇpJ×§®7 #øæ”ýØHq®—næŠOî®E+bXa,+Œiáðÿ¼AÅL¨,©%¶¤"†ôÝ)SFëªG÷5à\:K@ÙÉpÔ,'µè<0‰þ.Ï,ô—Gµ\ òÞÛ‡2¡v޼·0]Ô£}dº°7M<Õâ^V©°|׃}´ÑÝ[Ç8b-X}=<©Éx2þ’¤°sZ8ÈÌ+ç…Þeïüñ÷|í[ì„°(ðéxëÙ/[‡K9Ý«ãywyÓÂSÜ;±, ¢1ÎÐvå7ºô/k7QÝ~ñb¿³³wHcƒ¿/‚nÓÕç¿<ßÕ··ñc;õœnÊÜKüÞ»l†MÛRf_:ŒŸ”:K‹1 7!Á,Ü”ð²PV€ˆ†Ú?#ž™C¨Í¸wOÝû@ÿ'3˜È ãì¼¼ÿJܑ޷ɘ´ShCFÖëöfq¿âz ožíÄ™Q·°~Y½¯¿­á%²Á˜rü\˜zþDaÌ–f­±˜°1óM‹)Fà½gFR¶ÿŒîgd$3·¯Oœ›,òc¾÷os“L§"™a´y±T HÊOƪF¥ù÷?(#?øõüHüâ†åjÉó 1(ä½Â»òaK¼°ñ¼ˆ[¤‹—ìOùIÙc‡²?‡æ÷\m¬*ì˶]-è„€Ó,‰ÇYÓçŽ7ßO†L›Â:4"]`É0Î"”¤$¤h€‰|p¨‹r>Û½üþqçñCE| µÏ&!°yÙÊä­åôX©ì•鬕u}ß%¯FÌt2v1ž,'ØV}‡:@«÷£ð:½ž3KAKÝ!Ès73ÐÓk 4™£n¡drºëv9Ú Ê q%“Í,ŠçÚ#!¢›–&,Jg8“Áò8rw:ç#,«£s[&À¥Èž÷ þ8˜À^‚Ž :í'jЪ>ûÎÃTT^ Ê z9ØVi)Þö¶ßé\ô##OE]ü “UО &Î38©ÞÈÌýVvæ~ã_xÇZ»ÝlåxÀl”V„§ÿ'lÀÚÊÆ O„ 7Dfn<øñvƒö †ýZôê,ñ’çx¹ýGÆàÆ]•¾9ƒSÚpbçå¬ãîx‹Ž¼3z ]oŽÆ¶Ì&:ÛfÉx.ãs>ÆóvÜ3f¶•ä}e–ö, ek'zg)ç Çrc‚HœÍ€äáñFÎŽI‰®Í:ÚP Ù;#¾P)úŸ]>È‹1t3çeíï¥üs|¿à›öt¼½Ãɵ©,c„Ú±"·Óå\)fÑ{ ]dBËËÜqI¿´ºlxú Иd…=J>€°…÷ö ß dimY;ádõÍðU‘ñ§…5ÄÒƒe!o@ºnVT/‡¹²á:‚I à ]UK¨%óºt.3ºÎæÁá ¨«±¡Î„BƒE$ȹâüjDÀ¹'¨uœy…€skø=Wôµ´D ìsêQ¡/>¸6ÀSxÀµj£[Í$ûHÃa·ŸG6"Ÿ¶IkcQ²D[o2’?·?Þ¯¯¶?‹õ¿U“´ Öœkf%ñöWñnEá¹Ý” ͬô·T¥jF©õÚ XÊrZ—Œ!V­mÑ2_ŽjYÆ[ Îþzö X–ËÆô¢¼f!éà#â Jµç„ƒøçu¹‘!¬¢†S"G ÿÌswúí3#Bû -’9?JÀ>? ¨"ä1Y|JT›Çl§eLu²hÕSÓõñƒb®iš©µ~­¶ú5a øRZiï7DëW±r ÆqlüZ«Ä,¾Al™¯1ù_ß==fKñ©4]Ñ‘~ +½R¶-l¸Àÿ¢µ¯‚¿R¹Ù]7]z_ՠݧ’´¾œ^ÕÀ ˧¹ì\]¸[8ÕÙÝ*ÑÃzçJ”ù - €¤I}Ñ?Ŧ§´ ŽB·2-`dF–!æb!Óñ)‰}áåx8RÇÚÛ»btj[•kŠ:f«éög“sJ+'äÈj· ç$!KQ‡lêeèÁMƒ°BÎÐÊÝT&Ìš•) ‘‡âTAˆØºr)¥è$‰-Åäñ:g'ÕwDšÑˤ·Éæãü4ÎMƒ8ƒ\[#t·¦[#ò‰ Råêž5¾6~Jo•«róKî2€já¾!ÒǼ[ vÎ-¢$ê}"2qÓ|lfɽ¦ÛAÕU“îopJö¬ÔV”U©ün”ªmÌÂzÁ–`ZVJ?S؆^¨ì¾”¡‹œž££SiŽZ¥+…Ò7ËA%@É8ÔÌK/|=|ßw£·$ ÷c?¹€?¹Îq2û< °-UzÍÄÿÝѰøhxwª3I§ðd—,xK§»ôûbrïB4UxÄ¡qül/ªoŽ9l¶ ÝpEýtÝ9J´Pw͵U˜r3©­¨ð~¬"%4ƒ.Ä€­àÓ`(y°~®º‹ÏâE$ ç`: æ›'[‰íR‚„Q–击-ýnK¿ÛÒï¶ô»-ýnK¿ÛÒÿK¶ô F %EP×{”žˆ™RK­E(KŽðÁflqÖ¤†×¸\™ÎøËÄÁhQ(R÷JCš÷6ú‚½‡0o8XRíMQÇTŒ 0\¢é=IÌ#/§}íšâ06¹ÎŸôΪŠþösƼmÏN™„!Æ_I´%Ì(cð—ÒÝx½ux°wðl]`<ÚZÚg¹Fbb6ùÝ64þSC`â;´OT·¹½›½¶ÁÑE#BßÄý‚M‘¤Li¼“·%óJÜÊS×OÕˆGF*í¥êþÎr$A'‘ ÆuÀÆ– º‘Æâ›…žqÍ °ar®Y«3rGŽÞFÛµZØj®ˆV ¿R¶˜2Ñû S{ĬQÈ B5–Íwží¿x²µßyñôéÑ.ºe>Ùßí|RO;Oßîí¼ë4W°~†™áü*MòU\ô(&º7¬óIƒ‚»£_z<R­Æ¶%Åfµ±-ò÷¡†fYC‚Aûjù–™eÐ{Ö*0¯]ŒÉ Z¨VHö&Ç/žD/¸¾ã–J(Žý^rGAÚ)bßXóô$KÈ c¶‚½‡5¼e4ÚPX¯-Ý×só)¦6Xï+:? [‰i:õó.»t>uñà!£šT´¹,´7Ô…TQƒ™’™dkâ†8Á°ûœ úÜþ êr&i™@cÍj¼´¦‰møwç«™8Ÿ¨ûÕ‚yYe^ä­Y G7sº¼9ѱ?Ðï¨^äy‹±mrc¸÷¢À³Ù¼ûàÕþ~gï9:jwvv¶÷0Òö§ô#ÉÁ³‚"ÜôÆ$I±õëÛ'Û;ÏÞ½ïZ¸SÁ'§xlj¤ÄÎÖñVk#lýJ¯:oØéèð„¾E[¿î!¤>|y»µwüZÃaÌÅäÛλ{™¡ñ¢óö)ï…ôðܱû·[Ûßï7~€'˜øO©'—xnfh ù;Û –^ssiÊàñ¦UõW bÈÍh}­ösį75ò¢5T"{_Ã0É—€üž;\q6Œ ñ”ã—Õ¼ €,ðòÓ%œ–86âE¥àRï’³ÝïÓN^˜Ú8ß®®cÜmo׫À8ºGŽ2mV•L–¡XÌJíšÃ%Š—†= ìÊBíÿC˜'—â)Qœ ç· ’Q2´eÉ0Ác—MiZ Ó¨Ý5°ê|?2“-‚ò‡Qd—²E0@ѹMv!fÔ[¨ÛD1_« Â#;D?=x¥A­A¿.åHÀ>µ©A@e5¦ùO#ñNÐÉt%ÎÓäiÿóHi¾ €ø1a^ýÂSXý„ÍUhƒmmþNZn7ùÙq¦‰<¼–¬ž\ LÉ]™ýåû~,±¨)RÿfãwB'”V0ãì$¥3jZFχ~õÝ`³);žܘÃËfeœÚ¬æå¡¢è"y9ª("Áœ´’äukíÛp0i«“I›C·ÂGÛÐ q©LòºÀ?•"kQ´—b> ³ëDñʧçÀÓ2:Lî¼U‹h! K•m²G!§nNqœ¿%gꎋŠët9[ô0™" /¢pÃ×ù3ßf%“©iûOì· Çn¯H9V\1®þ’™:È8BJÙ¶Y‘|„ÕàW•eæ²PxC$Tn6CŸÒáÈxÒüž€<{ç†çñ¸’ž‘ÃÎü©Â`‡™8nsâa† ¯"SpwÆW#L2â9•ŽG¾ii•Ø }´* £P¬åþÀŒ¶L²0 G2„/V…ÉÊŽX&—ºQ&ެ~‡v\)E,e( 5ÐQ)ÂÇxáP7sÓ;cJ–Ø€Jª<Àâì³×eàœŽIö¢åÁÙ]¡ÂŠÙ‚î\%×Ôv/ÀCl@Ø’wÊØHÙ-~ÜŸ*–®‡iŠºî:ÙxÓE§¢ÍÔª’h0?¦-©Jƒ{¨^ņ'§€D¡J5m<’ħ|ï fäØÒ¨Äz@2$œdÇÉK‰•ºJ?fKSdÀíü@§¾ÛÅÒ¤ÛÂŽ”/ûJLzc¸K’csIO2¨Œït¦Æ+”6Ú°0¬PXg›:Æël“k¼åƒgbžw:0Õ‡[‡ÿ¢¬fGVS´æÉѺÖüáQó²˜ Ók*Á(_¾Úžà¼du#!  ´¯‚9†ÖŸ³˜$0`O/0¥ie›{GÔ¿ÍUtÃXnS,¢¢­F™–ƾ„Àíã ©Ö¬ÕU¢S쮼βE+Ð@ç€A:3hœ?¢¸Ü¡gà óèŸÊPÖ.*}ñ y¿9%æCÔ"Âe36¿7ÍH®YŠ«-Â÷NçÙÁ«íNN t/¿¤lnÂ8ºËÏ÷^b¹MñÃwËì@Ï`ȰÛ|°øpOk(¿}â,㻢¡õÑX:­^X¯˜ (²ôÙdµgQ¼¢»CíNIn¥ †Î° ä[—qaà ]éi>_$rAÒn °o2$˜‘xp<Äé‡eØäKM[š’Ȥ©Ó¼H³ ¯¯9½ŒÂ«2×U HF3W>:*9v/kU'šh"©{ãc`}7FÂð°ŒØ*š©aô&Úûh‰n z)áGÚ…T"}uÍò cƒ¬`cŠz *<`Ýbö³‘`<–¶ÚújÕQÊ2¾¿rÕæiÆë%„‘WSl B¿®cö"!Ç 0BŸ³qlN§7c—C¶ÕÑÖ62¶^£ŒÕÌH©‹£ØxÊ3ƒs+tÍÕh vÑÅÏfø!xH JŽ}ä©ý|òÓû¡¡cî¨{Ó=Øz¾ ÃiþB¤ïiê?¥«ªÈN¦DŸ=(e¬™:{ó¾Æ[k„(Õ7$½‘‘0®ŽŸäSÇÄ_‚u «*÷ÍD×_¸} ª¥k‚‚>/s3¶þÍñ}85Ûk¤  \Lœr*•°Æua¨ˆN"}6{böúŠ2~#áΤÌM¤«<íì¿ØÚyq°ÿ/&úê|±Gž…ä’µéª<•!†Î‘6(L]ŠJ¶ˆOZ-ŽÌc hšÀòNg$nLñ )`Õ+*ð>G®% ª(7ZNK7TÊUIP¢ñcŒ¼Ì̤¶úî0}׫øúÕ‘k[óS`YÂ(q˜¦°X,úõ& yy¨kcó\úJdRb™âp¾¼·!E±ZÇMñ2ð»ðMA EcºµhOW"µÉ&d-Ö"„.q“ÓÉ—ýéïq›*ïj„—‘ÿ¶Q“’ ©¾ñ£K 2ñdÈiÊžkQ@÷Sy•¯I@au‰· …ˆÒ.YŒ¿#>~Ä#›pÆ‘áq=DïmÒÃ:Èrý´NIYUTäí 1¼ÖÚ^ÜžÍ!¶S:¦èu%dÔ¤ô©ÅœÏOÎöoÁ4 âí%Fó—åh^;¸‡NŒ $m–¸–RÑõÇ祣¨07¥ëÄIâôBc—3ݦ&x|büìØ©‹ãÍz"23À^U_A<ž¢.Mo]Ù´wK ¶ÒÄ0û§Ž4ýekN:™J4U*z¥,ºÂ€¾Àq­šâ!-oyÞDÄ[¤‘ˆ|=Õ®Zð(Õ‘JN‘媮¥z’ om0>Þû%Æ¡–Dq}›dŽS”ê<…:áPB!T3BþÀ¨±ML¢*ÔML.oèùñšZÀB ŽY÷ª/{Žv(ÐwƒVvÎ&Ž•|; t¦DÉ?¢œwc*$;=¦§¨2ÂÇúWùj¾ê²2 !_Í­¨úÒ"à#Ì–‹vû˜à®mžŠ•ÝJz…pT@ªV‚!&[Ðæ ƒù ŽY{l½ÇŸ²ÜŒUT¿ .uƒÜwÚbd ßëgIjt4˜i•"e÷zf.5^i\JDäÎæ^89€òÙ†æ™ÔoÇyÆR¯-M²C¨ît0é¸Ð#É&ñÐ_.Zª™h+\I}Åêô"7VubÅO]ä¶\ãs¬]àyF0ÙÚèn¤bfŸËÊtË:·(ŽÈràÿ& v¯Ý¿ÿ]”kÎ)¯çÒ)H+-åÜ!Ñ"“©Ü›ä'¥¥ú:› `îxXðøºâUîz¡‚®ZQ»×¬|1‰”°åÄ+êCÓ½4 Âä#‹b›OgÕòÍçŽ. |ÎG$saaú¼ÕX4ï]j|æëRbv8c+H++Fˆ‰>åf×Í «G\g]+f£ôí¯Í•šŽµÐt¬­~Û^ý–L 7È€Aw±•=(…‰}…ëW—–o•8GfMkCÌ\×.yz­ò’KP1ñSv¾åi"ñÙŸvC•±æLU95öÝ·ÝÆÅDìâ ¬ÙwFóB±†HÚ´ÚUü\o…]4ãô9,¢ìŒ‹§Ô…„º&̸$¤ªúš¿¼Y]~ >-à¬F¸RôálÌ‹øÌ[ȬbµcJM"›&QØÔŒ°:/Lwö}ª­º|ø˜/©ß¨Ë´¥úÇ7J-³q?ª&!+%+R³ˆê ,Œª—§ì$Ý)[d6äPRm†¥m:›dŒš¡xß¿i¾Œ»æ>éÀÓäšq³¦7%²ÃK™ñ¢¥žv€.LçÆÐvÄ~wö÷É€ÅÖ½V—˜Ê–[Íf«ë’Ú.)bU²å.ìyömžèn¶«øàä%ÅHø=©ý¼ “M£Gœ¶ÉÒ~mW5(üénðL[ Ät#ˆh=¤E®øG6Ìmé‚Ê[_ ›!0Hv oŒÔ3UTËŠi!Q–Ô¢Î`†ž˜ö½Ë¼F¼Xì~U ”dûªpÍw0 ø#¸‰l†b…’ ²5­dþíêO:-•[«äI~`0È›œ…â  )%,Q_ƒ?th+ØÕD$oR³DùwrùE†ŸÛœ ˆ˜nrD JÔ¯˜¾ @2O.ìu®Ö†Ì—Aà­_)QÛÕY«v"KIËiÝzÛ|×j´Îj'ÑÞÛòÒÒ&²Ï>w½g¯£‘˜Ú=ê¼UÑéë:½ŒuÒpD k:øiàxt1ÅYüg¦G×Dt¶ôŸÔ…¾v= ì8 qk‰ÜëÚbQØc¼×y~ô˶â§&¾#“û[™‡©Ü›0m,¾QŽÖ Ùr]?[ˆÒV’E{nV÷žÉÇðm³¶¡3{£„=î(åG„ µø}Íš°JÕgäÙ‡wçE×/²lV2³ã ß8¡FåûæAI‹ùÚGÀDÙJhû #°üe%p§‰Vk[XØío]ìñºþ Üÿšoÿ]ëDƒÍ–ªy¯„n]#Âs*…ˆÀÔJxBBíó£ñ8›Ó&êDE?È+a™ËéSþ|j}NÈ¿E/vã÷­Æ¿ßµÛËëŸD«Ý^Þÿ ›Eí$¾~Ò¬6ê9fi@‚PŽ—”[.4Ÿ`ìXI#5¶ºÚÆ«¬ÆSM ìFvÏ ¿YŽ¥®Ô ÄÀ÷ßG˜$7IdÏý–j«×zyøâÙáÖ«ëü°ÙœŽV(HÝhÈjÌBâÖ´1CmMÑ™GйûVDŠÏXpÅS@çh÷åÖáÖñ‹Ã–hY'9.Z¹0V9þ— Béš¹ñ¶×ø}Èm½UËA¹ˆYq0éìò(ióU¦-^³ÌL³nczä㟛ÓWj©Ebpâ ĉ&{3ªå µ1e´Áv‹c`ßàƒlÀ-D¨øãa‚n;”ËoÙ4 ÎDÞKNó¬)¬—|zaµ…WÝ–Z%ÖrÆ~yw&¸¡3Á_BÎ.ŽàWJ>R²‘ô/CÙH\¨¥ ¦J-óKD‘ÆP‹—¥$:-«+@/1G¹;ñÒMºn m„ƒWÈòZHi\ eVߤZ 8·G¡ß¿"låªÉúWƒ¾•Ô0òÖµ¥4[¤bÊBçL:«$”¸ú)ºâèÚùW†ŠÊP‰ÔNh%6«pŠžÒ7EóŠc í ´ôðçvOH.PCÕâj'³WÒ2éôŸoý—PLNÓ1"s’]ÓFB¿ŸÂ¦®=ÈçÓö'㦠k[!’mäÀ!Ka¼gíœaÊ4„™·=7âõÈ&!K‘MؼqÉ“ ›SËïþ‡…CâÐÏ6OÒåNL îL݃æÛµhtl@ÃÁD"•ñ£êexãÄMBmTu5­î3Ë%:ÑÀ<’Ë_Öi¾ûßô:ˆ¢ø$–Œ!œ¨aß䘳Þfö2qK/§rÚÊÈ !9Š5e³^f¦&eÅdñŽëL>*ÏÊÌõÉHµµ†n#ÉÆÔÃvT ñÞÅJ¦ž=l®6WEàÉô~KR˜Öm¶äÂôK›ÆÛÁ]]óŸCqqvn»ï'_dëÈ•+¤]jgàÛ}'°þ¢»LRF˜B…@×÷Ç­sè´øezÊg%ãûþ+á —hîG“Ëpà—Õûú󻆿ž‘͸2Û%RáèÖ7ŒÏãÎ^JãÑÇ«°Òeþ%Ã]¶Æö^‰eh(Y‘vÀýQþÐò´”eï€nYš¥š6Ü-X%ù2¯¾žÎ<§®Ur·Àkâžç;ÞƒR:i¹Ê'ã‹ìŒóì‹J„c °ýüòÕ›z»už¿ØÙeÍ*ºÕ•’m ) Å¥ßì§VjÆJ€M“*ٟdzúóøá¬€fÔ¤óÑÈ^É#ØÁ5 vP‚`ö/tc‡­Óqô3”ú_%ét1²×îwaôz¡ùЪL¡Š\ \*lQ6EÌ1í3̧çÃtÞ 9áo71~Ø"è/3§qµÊÏ/1=1Œ8+ìû³"§½ rÊs†hañèÑ£º` }Z_ÈéP„z_£ÆÐÌvs9pÏÎÙƒF!^ØcˆŽƒ+ôÿRàÔë¶¹ åîíbªq÷òíƒ/åý—Ê’j¶=Æšxм”;«béånobv÷Ÿ.—²Jš&ÎÊ].t€‚ãÊî 4öGR‰“yr7Šˆd´~a܈,duâ^j?^X¸!²‘AKâàp€¯$¶èJ’×ìsý§dºD±fL£žùø„S×±+›LYô5µ0¼ý¼Ö6_ÍáCނ޿¶¾§|?¡dxáŽ{ç$~‹ý¦ŒÆƒµO+ü+¬O+!ž†×ºáÐáSã§° E²cølhŸ¹½Ík®;Vd×ðºà䋨ƒtð,j䀸²ø¡yüAÁ†«šxü°k €¥C…8üа?4ǰ\<`Ïši m@lfÂ)j•êG ôóÌ'Ã|¤*aŠø˜¤ªO5z,‚iMãl˜ÃØ0µë&0ìñ}Œ(‡êFò¿îù§§Í w¤w¸:ø'–‰~aÁ¬û¶-+yýÀwûé ƒÒཿ'U.µS=Œ¼¨cvî·³β•%-k¯¹;IÓ´EŽvAI§ ‚ ð))s˜‘<»×sFì©[áDCôg¦˜ ÄyºìïΡá)o¤Š2n ÙMH']#ø@]eláj ù7KV;¡}ƒú¢Ð=³ºÃñq˜ÄÈi;5ýp:Ö ¾'æˆ]8G#´±o˜.3Á‡¨Ê‡ñœa¼ËHФ“ñJßû#Ç ýX˜Œaz'¿]˨¼áÍdW^Ìv#J‡F&c”Ù}’üGÈü™Ö1ºÔÎqçðÕjÄ•,€ÜR%”̹évù £hS¢ª¢mq-ù¢uêûM1+?2ÇSlƒðØ®,èL§oPgð-\Am˪˜¹hûÎiØ< ñ÷¿w¶¶w_<5Īh˜­LþdoÂ>Ý¢óOeˆ)ž––+qÂpœñ$ðÄýÊç CÄ`ŸéÔëô./;c wÒCZ2Ê›eL”KÕOþoçÕó—h9‘N ¼³Ñƒµ8 lH h®H¬Z)k!‚?} ‘ãºø0D?¸2ÌXÀŒH˜œî)£³™9‘sòÓJY‰HàÎÍ]¼\ªSÇõWÛqÅ^ŸtÌ¥G1 Ù x gÀcŠ­è½Æã`s¦Eiž±YØ·‹%‹º8÷/P”䮡‚lŒã«eù¨|+D­Ýqx‡E…¤ç”ÜŒX`K÷ ½F>Øî€ýïdüaªV‹¸äh¼ŠvmÕ0:ˆÍîX‰q jm¯&à¿“izÈxÄE² V³øÆ¿"É1ÒM"‰šôJ“‚3ÖwCÒ¦ôf>ç|’~¨u Žàöü½<x‘Ë©ÓO×W±{**]H<¸&ÐÛ‘ód·nà¿wdNŽ^ëJÇ÷ ™Ùd“ûÓ`Ѫë_¢¼(ÅB³)qA‡ûBŽ—–ŒÉBqk8¸\£!QÐà!51# {8C`}¾Û½àÑØl†å``-ÆG"v(Ùo!þ›2qT‹¦B‰§ž3æ{j’5³…Ìk ŒÚi³úQÊqŸñ˜«$¹Ï¦Ø8µ¬rÆÛ´YÞí*ô’3qàŒŸí!ßà´“œŠ´ ?ãM'ð²ëtà”Ñéd…ðS¯2-–oÕæda}h ë¹X\²›þ„.MÔQ®ù¿ÊuCú ‹Àëžê§¨f<ç"ôÃÇ_YôÙÙOׯ"c„gó•ß¼ »Ixø?fysìoÐì;ê;¤]%H˜{–ÏKÜžçM‹–ÖIIþxbš$¤çUsš 3:Z¯·ÈIçå£7³8üpM…RÈr¼aÇp^µÖ¢ì»h÷%lòßšÑaB¨È–ßGQÔC ©ŠThé“(R ºÃq`þö70#ö‚uù6«Kì£ç/š4¨}Ñl,si/*yƒö&ÐjW4ªKKßÉU?.~ø¼¼Ì•›¢#«Êj^õÃIbi‹X˜*IÅwʺÜ$)éOSÚ›fVÿú)Þõ7â[?¯g=ûÕÏéíS€ñgŸ¤§sžÓ¸SÀçCùù(½_ÀÓ¿ü-òŒBMñ §D éåÛê Gƒ „çy+Z´ Mqųôe ž¼:uïqwÙq bÚ”#À"ì }Ò (&4nŠ[5EÞb&M÷.µEM*Joó¥º/#&!‰;ãÞœ1‡¦¢9i^c¤ÆKI•IÚ$á1C¨$d^…0K}6¿º\!_Á0Œj>8 {Ê>*ôÜåÑ*§{ëÈ’ªýÃW‘‘cx×E/¯p¹¤ëÏЇ)î7µ|¶gQ©ånµ Nîµ Ÿ M‡+Ï_j©¤Ïu=§gÐø‘géØmÍbÑœO‹“P.aŠ¿ˆ(#Ó®°ç?h®éï>…Æ=¸€ðû 8¿:Ø{³¢VúÊäb-ƒƒöü/¼¿ý%v¶’¼¸`y$ä!üÉT›#T µt´Ž` ð$€ZQ¢M?Ë׊ë§µ… ×ÍéÎÆÑî>Jg ã—O9,ݤ4ÆvpæŒ9O†/u0\~‹ƒ‚ÉзÍÿ‰ïV͆'ã,9ë^" }nÁ±ƒHöäˆqh©dˆéש<ËÉ"y‰–U0©-õ;§~Ð (-ǦEž9Õ DÕP¬J’ý=ÛÞŽØ^èjþKÌlÕÙ}³»Ýyy¸ûtïØ~ñüåÞþî!{ ™`‘ˆêZDa'”Tsºå>G½ÌÜS ¦LÓi&—ÓxÖw(êÀ"ÞèRTr4]™œ¡÷?e¶É¨¥Œ”9Eí {;c^›f„¬ðe8rƒˆá½®`FI NåŽe>€ýãÎÑ¿Žâž^Éw†l;Á~˜ºI²ÜÈ‚*P‹:ÜåîÉo-ªÒmYØ)ÎÿD–v¨Ã¥fõìƒ=˜`˜€xF7JÍ’À †%ã¾cÜd€¼åÄ YF]¥ «*N3ö'Œ_-È:”XÊP½]CÇ RJD«Øã¢W´º‹œ%U@1˜¨ÑÉØbÊ3**”²Am¾ç{ çèIß°Ë5 x€i~ÏåTŽúJ”iw3º(ÐÑ4È 36©&en³߬³±AQ9Û™ÝÕy\¸!eZ¢g{+ËTpF)95 J%W¦"òêâÊ7Æ~£ë4":ÂÞâb|ì àã­g¿l.i4$ÆèXŽð‘¹!ìýagßœ¾Pe‚cCU!”*˜ ÉN‘Ÿ%ÔŒ»ŸÔÆL$ŽäÙ×ÄÈ"Ѽ(»—…PÎ\7ó[t‡C§ïrV5`¿²]Õj,û”í]Ï©IL7àÙÕ×Lº˜j˜À$¨3«O)Í—w9hJ¾È)Ù‚Õš‘»õf^ùŒÕëz@éî¸C6òq YOmLgÊtj#\D”7DXH ÊŽil‰b t%!‰H»ªkc ™E£Rýòœž†¼3û{ ê9i£V|þÔ‹ÏS6a¾ÛÞŽ"^ncÔÔmi,«*sÙýÊfMžUû;QzðÌ„óŒÇÒè•ñPÛÆ$ôØ“d‰Lª@äç×»¼ÜL{ÿe•ÌîU„,œVæRXsbΘZ‘Ç&Æ›=üÒ@ºß~ùRà?„²=g\ã»m¼CªnK«qU*e²Œë‚ª’ÐÊõü,[ç4(m“ž‚‰!4dmÝCÞÄ"€—øÓ,YÒ˜a1K:ÒØ6±:ýPÉ0U^/ýPäXÜ zÎ:>]¬?°Gà;±ë©¤p$3ã’ïrëUàµø–û)¥É6ž‰/銆 d+Ú!!q/^îm›ÂÈÈíQ8-‡°$"Uky² öP×ÀRZZ1Jy¾2'âÆ ›‹[ɽ)ßå•P'¦SöJ€Ž•,MN¯·öž­‹ ©NM£è¢yM·0?°µÏó­†Yyêõ ‰±—y×næ”ç,Ýܲ³õ `¨é£ÆøÊr“øŠ~1¾ÒegÚ'cÇ-ôEÇA#êwô)ì6èµ€×¢Uºü6ñ®·¯ š¢Í Ù+o³ÊÉc”K‹}1òƵÄGúÏÜBòàq#+(°ìÕ£ÊRBáÁ[QcüÆ)!ÙöÌ”  %D3\L ÅäR/¼)”`ºJˆ –á qJ¨01lѽÑ{ l ²ƒ…äãê0M!3  @š†§Þ‹¥)¹q{ëp÷¯W8já«£ÝÎ/»‡G{/:{O_tŽ_ín–(÷tkÿhw³¶¨Ñ] 0–/ ›.Œ4~.)3ÒƒW;»OafwŠF+Wf¤iÀ¹#Í€=u¤qºÌHŸï=ùêp·s¼ûæ¸h¤±reFšœ;Ò Ø|ý€´¿3¡{GE㨶ÕrÚ½s˜Tº€ºcºèQé‹üóxIµ¨’¸#g ‘×äB+½ý@^YðÕd”žc…ôÆ”Ž`PôŠÙ¬ãÅÁIBò[€‘äpMÄ¡z"T%3䓭§ç šhc ÁRBô\€‚q£)þÆÎpÌ`rz ŸÞ8kT| Ù”âúì}'`#©²7‡*@ªxïjí9%>ôÂá`ÕÀg—¾Wá|®µÆT5n‘Ëh;ð?à=–ºQÛí‹3—bp®/€ÄÈkdêÃ¥=¤ç¾:e„¹ŠTÞ?Gºð'}AO›¦=œIœÒ+ž+i ­ %¶øv“f€zãÁŒìõèò7ÞîÍ‹Úbùæ|¬£žöü Ì„¹7³Yp¿O­T\²w^1GÇ[Ç{Û¸dÔ*-*“Z¡Sòêœ3Z™„ê42u¦? F2&ó×£]K|p)R Qád<š€|¢&Ç3ö6 #ÄCè÷„3¯L@*ÒìOWÎà7+sMc4X0‰G5uá*Ä"jÕ]šÛß´ä1Ú2Ÿ{“á¦uß’ÅQKvúÝ3Le«½Žå¼ñOO3Þø£q4|“ ß$¡Eý‘Í+^uÒïMËó¹@eC"÷Tc™ËÎîvk~Û¿µ~~)ŠŽˆÅcBi2ƒïïй£ÝÓF$y…áiÈÀ7Å6ÛW  ›ëÁF¦Œ;°&ÂbÉ{(ÒÃÅÚD/ì¢FÉK{j«Tª°Y®‡£Žs9Ú¤¸c7u¬²èâÑ馷+Û¯÷áÛÓÎñ‹î¨§‹Õè §BQ2 ™Œøcìy*û{Â1Ùª|—žºÁ¶aÈÚrj%nE¢[y…qò1ôPs%^á­xÿ¯´Zµ©UßZT>Z­³Z:9dlâåèÐúC{ô£Ma1öâ™bȳjDGË Œæf…=Ëì†ÑPo ðÞ Ã:0¿î‹ åTÊ)¦Âð«÷Æ+ÕZEÒäÝ"¼éEˆ§¨ì…Hoîã5#bðkZØŸ’‹’Šæ/Lz\œÆ T5,!ç ‘J#Ìââ„@UÅßÌjj2®q‘ho熘w¶åÅ婯™hœÝ‡¿«ðw þ>H#qÞ%Ÿ“0uÍçZ°j¼ö€}`_<€¿“Eô‹Õäsý‚@ë™I^Ê~Áó Iþ{m錓FÌ •É wÒØ­m?¿ìôzé]€ßmsn„¾¯…ÿSgJ0.—ÍùùÝŒlŸ±ð%˜8´üêMs8w6ãóøö=àÛ÷€oß¾}øö½¾ ï3ùö½¿ßÞ{ò|®MÅïxö­ñlÀïv§“fÚòùמ“k3þ¾¶Í½)Á·eÁlÆ-_Îȹ%&¾놦¯+grñdoøû(³x5ö[4~ó|øîÝßråUéÍû3–_±üÚŒåÌXþáŒååœg²÷Å<ĦTÇHIÂz[¨7v3m¢\án½½môàxw¿£\ô3¶Óøû»muÞm5†Ç¯f{õªÌ6¯³ÝÆ ÍºíÆ1õgo¿t›X-uÇ‚n”at«,I^>¿c9s±œ¯…Åð,–`-²`6K‘/Ó¬d 3ázYL$)qÓÇÀjJðνÓ/cw¾Æ»œÜ¦ Ç¥Ä<½w,%yÆÐ^ïì¼x}”;ºÖ¿÷Dëß®hýŸ¿Ãç¿wào¾Ãçïðùïïàþ¾¸Â¿0ÕØoÜœÍRv=#gª0t=whfªƒF.îŒuN1ƒÏ,Bgh{hŽÑøëLµaÅçsú9Gs•9D23Šil½€·÷áï*ü]ƒ¿à/Lö‹3üÛ€°·‘C•­\ª(VäIõ8›ô6LPé“ ¿;—ÜšP@øÍ’ Ô‹;±`ΓˆDà×"Èî”TÉl A½ñ´¡°ñ%´|Ûû[ÏdNKìÆ'Ø<¡ %ýÉp$NŒ÷çî&'(©ªò*kD_4aªVÍ¿¸ðÚIúàs²˜ TsWX+–X½_ÜSÏþršgÖQfm{³³~·\ÁplwÊÞ+W³D—+yY¾hÿÂNkå Îv)WÖš"œbQ~I‹ŠÙ¾1¥ß ŠE*~·}ßÚö øÍ¼“Ïï6ï97oÆßײwsoJlݲ`öÎ-_θqKLäÔEû,QFøæö=T§í³^¯`sÇ·ÑÖÎe37v|mëY‹6unÆÜÒÞ݆þ×ÛÐ UQÙëDÜÌï6¹Üä^ï¼[Šs.E@Þײ¡+%!–Ê^øæFĺüòˆ­¯Ø(E lwÒÚ­]žM¼—3ªêe;9íÖ¶…£WtFIï úÍÝ1ç¡0øµìª?%¶ ]4{¿Ð¯gÜ44F¾Äݪnü–?5.éï*þ³†ÿ<Àâ?9‘..s8û_‚­»ÞÕ,LËß±ô[céÇ{ÿÊ<{«w }N†.øµðsÙì\•ÌææêíŒÌ\aãKðrl»€“wÿˬe®Í¤_Ûcø9 ›V5îõ­1ê×[ÇÛ/²£õE¯î˜õœÌZ£ðka׺C%vT6›eGïgdÚVþ¶}Ç.n’]P– ^!Ÿß1Š9ãïkáÜ›,BÌæòåÌq$.¦Çb>2-0jKWïÅU¦ù1ñs$³Œ3vLgzó‘äঅÊÏlƒÉé}N×ÿ¬Ø1œ“É •i*zduÀÝ·­þø·µÊÊÊ þ12ð€c®‹ãsŒ£óØ…½ÀEßw8éÒ À<“Árô »‹<S¿!-™^ùJWG òêœÏÒý@ùß0q¡ žþ6qʨL•2ùÁé»!ý«Q¡  œ4«7@ÇYW¬Íj5Å2 ò/‘ªE‹°ï{ŽBuºnTç3žž¸_ù¬¯³ ÖÕ7Ùw_‹I¶X‹ìO­-£òŠqT 7!™MZ¤Ú6Ï«P&̾£Ò·ñ‹ÞùY‡V`–—†D$®.?è¯ÒÇJêiF:Ð*hAIùXˆÆžÌHíܱ.È0Àêå°§YÇ”íøEΡ‰ìý0>¦É€cO†Øòkc¯%.'æ ¹œÌ IäAÚVŽW–oåB”¥"*žeâdöл©»ñ©“˜:y²\4}J²“s¹¨'.DÁ΀Ÿ¼¨D֪ķQUãYì ·%'8ÆŒi^T#Dv±œzœÿÇl¯ýÿ7ñp7…ýæl‚;–A&šH¢(kSQ»¹í„ãþªU¾¸çÛ^è‚\çÚá ÕP´€-~ìÏRižuNí1ì;cß?uÆYX‡¯°#_á÷BŒwŸ#…@e^•¹ý»571Ü{-®­}W¸öèQaÿ(yÀÔÞÅW¡N–Üøm|8¶wrúŸbxL,9´RĹ bŠS§£Ï-£&LN<}LÆNŸ$õV¯×8µÝÁºhÕâºZU2VÕÔëNŽr1éwÿÈÌÒò&ñ.g@nyö2æož„õù>oúÊM`ñfL¢1Øú”‰¼æT¶¥]¿a|;9s,ÏVz¢/«½ÀC96ŒaNê›Ë óær$a¨b’€7ñžM£ùiiŽJw\ëx:oŸà`FýÚzRû+!ä^Ûø\IÞ™õø–,˜xÜo8ÀœöP\œã¢§1=†Ê‘ãPVÿ6þYTCœ¦¾3†Ic×iÈ¥VîfîÐÔ²PV¯Ç;t·.¢õBÚñwsn·yþ£~)¯ÕJ,¶ûÑbs.Ýñ’»\~­!ÿì¥Æ e¹Ìbóˆ#€¥ˆ—Ÿ"ÛãI(ÍüÕ*¹Wšr%NSÏÖŠ8ú^ÕûÝ.}d,A\›…ì·ë@'SÀªäb-±õÌ݆éÒlB’[ÔåƒÝ‡Sçº)N$‘œå< ÇŸõÅãü8™rÃ4#Ô×[‡{Ï2F8x/2v® ™bRH/’#I=Ob´*ÙÊ<ÃnþûƒéÚ¾bmaEâ)K)X A4À± F¯óÁ€ŸîhäôZZŸ¼W&›µp!÷#§ê®QÝØU­¡‹ŽP'ÕÑ›òk"ºbfS†>ZNO†:UOùHÅ৆_M<²ƒ©»¦ÆÕ°|Æn6œË™ºÃz ë9Oû:áe^á]ØÞ¸Ã)€2ï'næÄÌ×ÚtŽEæ;5gÉ89ÇXC5fa™- ÉɺI$ð½ÿu±‚2¢8Ên&Id&1ͦŽ<•gÕh;S;argãÒ;^ˆŒ¦ä°25wú;ýÆ~ãN¿q§ß¸ÓoÜé7¾¤~ãv´7£ÛÈ”ÌJª3ŒºŒÛÐ_ܼöbÊøç“ÔQ”ÑO”ÒNü7ª%ðå¹ïùAGÚ;¦qÍ7œÈ<â)@´í0œ R’¶ÕœZú††ª 8Ùü¾2^C÷ì|¬Ì”KžŽJB‹»Vô1|h{ç1}ÂTýO–ºAšÒ_GÝ`ö$WÝ@• ¥CT;W«œCW8jîjFÄ$•4ÿŨ™“‹W3A§økn)ƒÛGË)uN/Å2j +°ƒ•˜/Ïm¦Ad(¸ü’£¬(…„?OÍ{d~§æ½ÃúµÕ¼Å+2c¥ßŒŠ3Ú†¯©ëÍ”¡èÌVuJ¶ÄL#&Í£n/×Uÿ@š 3Z œ‰™TÀ³) ÔÀ1EðTUpYe°1¼;“·;•ðJøN%|§¾S ß©„ïLÞ¾"µð_ǰíOP ÿeÌ×¾~wÖÄYGEŽÈ“ä ÀàÄ ÜžU¦ðkJ­ýxB`—«0ò;AÃå5^_À§ÓÀ³®w–žÛ}ÿ¢\Y×Ã_<ÀŽÓo@OÀ+ÙÐÐ 1äG£ïô6‡î˜±&¹ØŽ¯FNÉz°T>ÔÃÊÕ8øö¸áü6±¥›_q{çv€Ètϼ’8åL<ØÝK·ÅÑUž¨/ÛK» Ì{ ôÑÏŒNcâö)’n¬ºo—Ërܰ€£Òf/ûÆ9:î¥)ÚÆŽ×xü°1öÖÌZÙ×?üÌ› -Ñ86²z5½à‹§”n`ŒÒ†Æ×ø:‹£ûÌ©¤º ®3ÀØ1¬’½Ìu>Ÿ¹—Ó"”;ºD—q™áS¢©|pÿþLS™Å½ Ôäõƒ¿6A>œ Kï7€ü9Ð?}-enS‰©(1/…X]»ÿÝlX-±~}øœ¶ _g#¾é ùáÑl’·Ý_¿#gëHŽqrÄ QÊI×ÇÍw3OR¡sÝ安AáÍöôÁl¨›EŠ»~çfÜcJ ‡×í×Ãwp…%ŠÒ¬kóÁÍöfm¶ÞdKÀ×ïÆŒ”„äÒ¸CwŒ„äú0YWÇÜÊ2.½%@½¡ƒóŽÀ‘Z‡£ñU£ë÷¯Ê‚ê ün× h» ùð­<Ô=u²!ßûÅ1ø#Ÿ ˜•? ì›Åþ£i§(bëë½8¢Êñ…ÜTɨ ÎKÎ:ûžlÙÀ³ÇÓÅžÂX[|2½X›3Ùk2¾˜»²?LÊ ³Tï;£Àé°ÑŸÂ4z/iôøáÜUÍSú¼@øÖŽöàyAdq°òµ'@Åî£âý>ÿ|È৯—”E²¹ÍT®v \Íy§qŠbJCâÚš @B–œ¥ö¨1ôû΃K÷Ü0cn¦lRÅË;·ÝN¯Áq¤ï—f†_$’Þ56€k䊱Q¢ï6´²§“ÁÍÚÃÜ|N'gS.üÓS±ºvÿ‡ÒÃ,:x#üP¶cùQ o£[¸O[3V)¡î-ÒÉHõ&7/ÆÈÔˆ‹·…˜ôÝi©ŽÞEo,½‘6?•EaÞŽ™@î¢8Þ™´Þ™´Þ™´Þ™´Þ™´Þ™´Þ™´ÞEq¼‹âøµFqÌO¸d*|£%Ç\¶X·“0€x«€·a¨´pºâB˜?”é6úWž=dã&åbåF’cN‹s“ñÎÃFVÙÓB„ÄQá–8Ø{Nº7%{ßüzNI ¥Fš¾Á8µñ|¨ÆžvãYe¯+ëÏØ­b"óœ3Î@¢ÊZØA`_ÍL©™@nƒX¥Œq5rP„"s¡®ÝïŒßbÃþé>Y››BþÚ^?‰ÆªXÇÞm;ýÉpxµñß@ãÙ“ò?Jæê2EèK.1tC ï1+±€º ’_Ì;Db`{}$uá-od?Vº0C ¹ä™¹ë$©ß»çmäÙ$È"ºÀçiš›·kïÌîüÄîÒÛûž.ýg9©øÏÅ,"”¿Ú2¼îB”jôPœ»}NËÚ ìàJÐE¤gDx5ìúƒ²;OYp‰©ªuøu‡k«jìa̳*þf÷Íñîá¿Iú`áoó}/VÂÿJžUíNÇ·;;ŽXZêt>¸¡Ûuîø ´-à6@ÛZ^^¶*iE}ã4ª± }ï;úÆ*Fè ©ÑOx;Ìc: å«ÛۢѠ¼ÀÆ'èú€–µÿ¶*>‰³À ³«âGåOÏ4¯ºŽfÀSI\¥iüeÂLEcÆææÑ˜ïn˜sj*FÔ*ÉÒ1×Ç]¯HÆF9]²Ü^ÏćÀØØkù¦”Ï7I3‘䢼MôtõÁÔ%‘¼Ì–„£cʃþcD¿û?¿¥.ý°çœM³d‚Òã³s6ð»¦Å} ç\á%8@|Œòò3ZáÙ²4ðÅë²ü5_F®ä< nËç°:9-ñ÷îäôt9’$s DJ¸ŠÁ—âïLáßDPSF³²\¼ÔçB–ÁGÈ·«ß%{ÀäpÿÖ5Vêb!;Óas%¸1ѵÝéüñ§±ežX´ZjKIÞdéÕ“a¤ðìHÎoÂÊ0Á*§Ò\ vQ0½rѽ\¯×ƒ^üRNÒnNqè­ÝáeòÉ"IX™‡=ÜÆÅ@¶Ü›æ(™B°Á¬Š±$oúà¥BŒ2#ƒJîÄôûn°y2ºèŸ˜Ò=ºPÆ‹˜±BÂîF*¼½¬²p‡uÐò~{&¯WEaÁùÃßê›9¯Õ6§^,L¯]!d!PGPtó3¶ÑG¸bÌ‚·€??bÒÕçCL5]˜Çœ ÕHPŽ$Ç‘*/{Á Ây·3 1yõ¬V‚À¿’IQc¼™yÉ„v½©¡i†2ÛIe¾kaè }·ÆÍo{¶‡y/X$–H£,˜”‰{2¢}µêcöl Y%¨ »ˆîuñò¹N Ȉ³A« L•àœ}HõÆ).qÌ™™B*¾þäÕÞþô°³¿÷y‰X…ü)ùÙ°5v4lj‰Ž y=Ì]?fCÔõ¯\KÝÊeÐÐ¥6—†ÂzãÃW»›±'O·öv7k‹5elœ(ŒoÒåÙZmNƒ5J‡àz}ÿ"lÙ?ÄÊÅ1êì?Ú= æ@± :²\çüÞúgqjÃP cqúRφúËR×éoæþˆŠ‚ÃSUÝSúIa&:û»[­ƒÎsøRQ™ùŽí­õý“ÆBö ´#äùt©ÓÙþ×3Úé,#3ï>ÛÞ†§zøyë—]íõ3)Š«jMèŠ©åÆ¶I+½¹¶5Ù=ÜP½1µsö´f{畤ä7×6<³sùì.¥¹en1m»C÷yåä> d¹RAÂ5Y˜&\Mc‰™^USS¦n}’·NóZM]œ;@®ÅØΜ1lá±Ùk¼ð=§€cÌ&¡pI…í¹ÙI,ëJæ$f§^IõÀp÷Š–â­ÙÞÆYÉsØ)_Ãô'y‰|¾½+ßÐî’~ÿüh»¼aïM£§DIq@ðèñÃåeó:+b1« î#Äp§Ô\š“ݼqv”7)ivT4}7r¥ƒ{î5¸R¼_ÿŸ½¿ïkÛÈÇáï¿Oý*T‡­‚yHB[Xw/$åZ\@ÚtCê[€6Fr-;À6¹_û}fF3ÒH–ŒmH6Ù-¶¥™3OgΜsæ &‡»4”ɉ‹å39²ÜˆLŽXíñó(Ú^-º×W‹nöÕÿÂݾ:–ížÍ™X Áê¢ÎîááÑÁÉAsçøp:¤`µ8-X}€Ä`µ 5X-JVïHV'G¢Õ~«ëw‡UpAÿ[ ‚öTMÙ4ÉÄñêÉÖáîáHd¢yøÏ“Ýý瓦 E†S ­èƒ¡ªOC¨„Q.JhG¢ñšçP õs~®2Œ3J­‡.”hM¨Qƒ_/t=tÆë£Ç쨂ÞüÞ°;–áõ—+ý¨ßDó ¨Ò”eäˆÆB—Ò„À¤—ÝÁ iԣׇ;ûÍãƒWG[;¬“09?7œµåe\Ôx§>¢Ûô¢PÉq{g;„HE–+³ ˜Ö}´øAöÉV·T{»ÏД?œÅ–‹&¢üö·v4µù3K±+YEÎ !hýÛ47¶ê…׿ £þ:Ö{ð›w–jš¯*)M†¥¡Í “—(Å‹“_ŽOžý¾¿ùr§Q]‘¤wdþÁhm«;AÔÂKØ+eñ8¥ðÚà(¼S,š|„IFÅ„b„aÆ6ê ÀÂ_ÕÊx8²¦Õí "ü¯Âù>œêVUn"2›7'÷4µÛ3]4yT—òÉ‘ÔÜ:Ù À$} ³Šáä|gx¡ì x—3Ý:’Œs=³¬DYs[f/º3sƒcš¤·\…U†‰@#iØl©ðï`‘±‰‘C]zós½¼ýÏ%¦F¸¹ÿn*`›r;!°–ü\im09ä «x6E°×‘(˜d@ì?&ø_:0*@‘ÆÎBøƒ‡¨ û@ì$xTŠ.äBJðìW·MŒj–ØËrrø@W{Zl鉇ÿ1†3;&§ÙIø/åò…ŠÁË”X· :Þ–Ý ¯¿3Ã?f] Øb“B`qEO3;¿8¿x[ãúñjË›×/˜%8˜2DnñS§ Z4áÜšøÃÌp©jªøÃ)ÿœLõ¦ml©W›²Á`ˆX«`BÊÚãÔêÆ»|Œüѹ’<Ž^×±xœ †i,3!ŧђÐPgéC‰XªØjpnÙøÈ\`Ûêõõu”š‘ßÇ •Wã Z0©à’ÃéðäÂ8û4&Ó&Óº¥ly’=ŽmŽO^úã<.µÅµz“ˆb/:@pE"YâÖ <¯íü=ðúK^°ŸmŒoå\z=¤Rêê)b£|ŽÙûz}¾Æ±^ò";Ÿ}Í‹«”wÕ+$>ÒBÆë×½2ébêÂ×2o\ú 9êQœ±1yõ›Q¯_Ç)ã®ñ‡>'¸Uç—ª_c¸|áò5†Ë×.ãôþ ák(„¯¡¾†Bø ák(„¯¡>«Pw Ð…Àk¡v|ç<„6تX<ŠE1MsQUÊú{´åïµÔØð-]5éÎPsÄm—‘)Ý‘´I¨aZ-ú#[˜±v¸:NK娆`&CþÕŠHú•yÍ»ŒW1àò‚ƒÿŸ3ÓÏ r±2>»â <ëR†Ý-ÝêaE„Gr‹ch² l[üõ¢À¹¹ÊˆÌ"/Ý9‰v’)£ˆf✲0I׈Ž›Ù¼¸2Ü$^/Ž<¨B6ᢙù‘[ÉZ‹ßºµ”Ö J¨¢CH†NG¬Ù÷¯< 8ä v-‰ŸhM^bgžT µ Ä×,lˇ5GÓhj†±8ˆÛ®—`Îâ±éOå „ÎÎFýÞ¶Cÿ 0èžfîSLKÍ&%ØìHZ;­¿,¯’¶ÙÞ‘žäó@²„¡FN80i¹¢?Ù}‰'ÜÉ/Íãß›ø+}CO÷GD¯Ùø…Á#ÉÒp@Gjþ¨´Cžÿ}9~¡JwqŒ¾Î(¸Uç#Í]¿×Œ.ß%®ÄEé«0¸èyýr\@3®Ú/Õy/òyÒ]¹÷ÁíðÔVoNgOI﮹˜¼¨ÓI„up­n÷ÆUâ$ÓQ8²j&%ì‡ßrZ”/01ÖP㱌Z“1Œ•ò„m¿îY&M‘Â`¢bì/™‡ §±ÚB‹”³WÒW,ÕBªÆ–NR3¨u½°Y’#ä’ÆLÏní¡ÊáåÁ>Ȉû»[ ÎwýhîAÛ9j·KÆPÒBç’¹g¶=)–1Ód5ió?}tYP^J"̬˜òûäþqžVÙ0~{Ñê¼OK†6|Ó¼AßøXBìõé£FþÍMP4rg'Ág‹‰ ‹JÑ\:÷ŒBjX±ýx"(¶¨ ûŸWS%~ùJËQÁa´pbqx p †+äšx.nPBî•Û)…Ŷ•ò¯e )?þ”ô{Wù7›™HÈ´É‚†»oùÄ:„…Œ /vNJ8×~J;4¿Î(õ$QùGO*žA,ªt:n[ºT =w²BÀå—4Ö`ȹÉÁ Ãi$F‘cDB‘SŠÒæò—e%ÈZâ3ª"\R¼­#krú'¬{Ý®­gш̸ÿ3y½AÀýîö‹ž{…6阷 Çà¨1TŽ=€Š${ð¢&Įҙ¾ëwL;uœ–ñ©kìÆÉ6`±É6ôÛ@2ò/™=ÉgNP3µŒj¸SSïÝøýÙeã AîD™•l âÛc„L%È WÍÞ%ØÍùºà:{(@ìòyçˆjsYžÑ‡…ÝD>4WÆ=óÜ+»“¼v–jœfÞ9£ØÍR÷©YÓœ¼\µŸ˜"Sà4ú¡3€‘É»hµŠ(íõòÆÑõÈÙªäâ"çm\ä²Îµ9þ/¨k¦÷‰¼ñ\æûÈëÂ3>µ3ŽË|p;£ø†ZUB¬­ÝE‡Y™l!ß{R4"¾Ê$tüŽ[üo4¥Íæþñ®³å8æ^¦­±Ôrã‡të!ܸļ‚þÌí]$Ÿõ0K©ñ켺ý̘)ã½ãÁéʼ㡗c¸ãɸsAðÆ P,çx;Oê7Žœþ=ÎáÞöZzpå]Í/ 7ùráA<© åÚh³GÖ•³ßŠ'ø`é…é?Ò~6¤ò7„ÉÙ¬h²¼áøÎßÕ§púß?'MÍf¡(uÂk‹Î-È©Ãs•o ±~8èvù-êOÄ ø½aEµºa¤øTNè*~²Ü ?ϱ ïhƒ€ãÉ·A%rlR´Æbƒp|²½Õüegs{çè8Ãú`ôKq·‚ËP{kYl#ÆÅîÝÖZQ6ÙíŸsõøÀ™ïÂ2pùÙ]5Áoÿ„·-ùvÁ(€çÒl7ùàÏñ]Q'ö‘œä¡&ÌqÁ‡bÀ,{”¿môRBÒɈu—4õºEåí—›{ q§¬—M56è³ÆE©¢!SC;¦é™_œ1x‰Œ ½L^£#èföwv¶³p%­Œæ`#Òcï*ìݧǢØ0zLÅ=Ýþ²è±˜äáôX|0ôXôh=ÖJ ¡ÇªäˆôxçåÁÑï_éñ鱉iCéqƒ§C®ŒHí¸’AsMsOeMÍF×xy¯ÕO=åI‰§~Øêw’»nϽJ>`àäø‘E^Ï')|Œ*î¶§ýV7ñxÉ?ןÀF“–þËœèDCJÎQÇ¿òûF%·×u—0¦Œ)ë9á¶ÛO½ÆÁLÔ<:µ§†˜GOåÒ7]góèp³‰ÁYwŽŒzæäþk ¢oÞÎIªI¹êÖF÷wN`NNš»ûF=óâ+ÖH|ÄÛ 7׋ص°‡é^¾EÃ"ÊfWÌbÑZMz}o÷žÁA2¨’ã€W  7ΕߜV έ=Œ Ç~D¤×wÂsü\0l °Øá:zéö"¯ÿfõí«l"õÌiE€‘7Ÿóiƒ“×+õ•dc<ÅubHóâ£Ûê¶ZòÝü|·Ûðöw¶œã_ž:Ü6 U˜;tCìõ_øçfÁ¹Ý ~E}·ï·Ì"Üò¼^ˆƒX^X–#ØÜ}í¼Þs¶œ•ú2já—Íæ˜Úíöc•|¦â68Ñà¬ßs¡ ÓÈà_ÏskxÖ ¯ÓBºP•§&`ž §5,Æ>_ônºÀìa. çú2„ãžu1R‘ÏM¹ × „½¥Vž§V­3| UÍ1<ûî·Î?œ‹Å gÝa–þËá«×Î0^c†NÕø÷ß«e‚õqPå ÍÏÏ9ñsÑÆ¬e籪žl8뫞CIý›øÇ|Gc<M!^.£v—ËÍÁu³OsmíûßOzY¥‰æ4ÞÎ!–™»^y:öž¦±–½Û…¥jwnÅEP=¶¯à¡˜Êjá›7oñVŸ.8+?|Úv¶”µ :x"^~wófù-¿ûþ{xdö?Þ,uÌvÙ\\tÎ}Bì°{~ëot­]¿Û€oN7žX~£ùü}b.ス·h0&X…êûz«ºà =wVë«?¬;+O—×—WŸ:³ÇsÎA×ë¡/áÕ "ë×¹ áÌò)^jN¬A<±©#èàßúhÜî›Çov;gKTéù3œ^xìœ-þüoøþÔÜ«½“£Ý׋W_%›=ò>8?Í9’È*‘S5Éë¶¢¡Ó·ð(Qâ÷·­V˜®Õo²ƒ(Œzq,Ϊô¥±|q¿N¢R¬öÖ¦ˆ¯8ЯMÏe–æç—lúw“ˤ[@=.­ÿ¯ÙW1iñuS=Ët½3ãÞ•¬!j ÈM\ß‘xmD6ƒuúê üÕø«'ð8<Ë{…¯®ÁÓu ÖìœÉjpXÈ]­pfê*Õ¥Xð©/7'åfž?ªF'O¥mâ¯aÓßê}LŽÐrbž=~>À1æ˜Q)'Œ½’}’,wï×(f‡²S¤ Ù"r%KŽëøäèÕÖ áÖ¯›{¹!¹ò9Öþ1™V|ÒËð­Z½$ëš>g9ŠûÁþ ü/}Ä¢¶ áÚu…žbêV$渙‘ïšàƒ«3¯··WÄ·Ë,;‰(Ù[[­šƒû%Èåå½½)!sí÷r“ <°¼$„|_˜=`)k˜Lh G“ óÅÂô,‹ (þYX}4xóC:ž!ãÁræ`Ä“qœÈ'ÛÏö’~y|)yYóÃINNöQK' d;»dl¼hµßêúÝ/ 6¼Yéxõdëp÷0 ¯ÕcþþkXø¯aῆ…¿ß°ð_cEý5Vô—+úAñ%Â*8Œ ˆ‚ÿ­á‘•ç›™PLèd¢yøÏ“Ýý瓦 E†S ­èƒ¡ªOC¨„Q.JhG¢ñšçF”OÈa B6Y ZH3äPM´)¢ŽU°‰Š)%¬M*p-4…K ²3™Óý€-Žt{^·¶=µ¿µ¹··u°ÿ«Ó$ï=€©V-¥4dÐÚS±¢^F–i”¸/h tû.il†Y,fTKé,±¾Ï›fTB·w±‚”˜·‰ p)^¯R(LiA€Üv»W#;z-&%W ­¡º‡ …Úª¦Û/ÔXá?ß)€†ßuö€òmŽ=Í‚5Õ‚ žCŠiÛÏZЂò‰‚"S&ΪŽÑ^¿ëÁ ÷Ê›ÁÕ\pfhÕæá š¼m géPA˜N4ý2.‘ÌTzSœÎë$"E–×aè.W4·gúcò„0ñ©¨–â‹ø°c¼%È0ìÅ51QwÂÙA¬¸(Ì>ß$QBvn¬Ë>%×wŒx1o“!ó˦ܵ á0è-šâ3/·‡:i,ÇP*µ‡ˆi5ÊوǙEçÌ q*Ú+XÏC,š J<ètÏ’U0ÕNg¤ÓA+1¹‡›¹»¨Q иXV­©¢trÊ2Oð¹’œr!Áæ&οˆäF0Õš\/™‰&vúL¢¼Á$:© é^ÙÃeg/HÞyNÂËŒ¥qɉ4¤þUW‘¿F5ë¯u6ôcPÎj°Hf©R>\^¤²€¹Väù<ˆ™õTpº‰pO3z/ÌîÉÓ'‡p¥Î%²ö§3j÷Þ0ŽÍš5)BŽBpçΊ³î,®¼Î)Mü¬B¬T§«©Yd+µ_ÆÆ"™A¿ïxtfëÑ™Y6ãè,EhòŽAŒj“qâd‚L´òÖH°˜tY5/º˜½µy´sÜ<|µ·—о$u/:å*UÓ¶d‚•„ë®pËÖ—Ú[ÇX×T öãày“¾#̽ýæI.*×áãÝe÷⤄_aÛíÛ ?h¢ž´FÑÿ—˜&«nA:i×Û”Ÿ0ÕL9 ³+u*ès–©Œ¶ävc¢Òq‰ •“ï`þ.àé0¿Z[•ô­Œ/ J7©ôÈ·6q˜„ÄD¦Mp¯¨ª®°2Þdi¥ìíMA#õugI;»ˆvŽð†ƒÙœÙêJ}µþ¸þ¤:Ö,29»hMKÙ<2I­Ûh×e™3#†¥œŠÖœˆ†’*ª„ÏT†š$#¹¥1’B™"BqÃÒw;n‹ØJýO%L5󘸟‹IqÖr±È@ÒÎ0v$q;ÐŒúaϽð¦²l.o)ô¹´¯,GþBô>8øÍíí#ø}p´ù"Ë7¯b½€…ÓÙíh®ýæd½jâ.–Ÿ£â®¨wªbbðEnKy6v_ìoî—çºwÜ0?勦Û¯üVÚ[Ùxc¢žhRG;11Ãm³MÀEm´¡ÉææÉÁËÝ­LKí„u‚¥1Ý:!¾‚9Cm¸,ê­4V î|;nßïxù$%Yr?'N‘å’D†"§ÈN›$­W9§²aŒÇd2±/-­ïM9"K”µ‰%“ÈïÇHáÛÊòUR*øœ>¥"ØÒÍ_ö6Ov÷v¬Þ_:_w·4æ׈ †çâp.Ý ÝAÕfö.ͯ˜eT(iP0š;𔂨½mÙÔbÜó³bÄtq?7Ÿ¤__ m®¥ÂˆA ¿Ä®Ýg­/t‰ìu6ü8?Ú9=œ ¥©Ø"¿R)làkh»†ÝB«çµ> Ñsa‘‰äÿªÝ™Œ5ŒóÁ†MD%ÇÃßL‚«Â<öxÊÍöF±„.ñ˜©Êõ¶mvå÷7ÛGÐÞED1‹tî Àî/ [çMÙç°HŒAåm´j¼é-tó™s’fMx× ·*,MC…o8³–YmF9 Tà˜ËÉ f•Çlf*ÛmÊ›±Z„4ÊöDë÷°z6\3ç3_£ÿU³_–ö+viëWeÆz¸y ßïç\°ôG¾s¬ÿ„)îL¼§ŒºöJtºÌ¨µà¨ï«Ú÷ÇÚ÷'…lwÕ-A¼i£Fʆ7UjÕ9œ(÷| ”{âœwÜ‹¡-ÓlÁ¹[Š&$ZÀ~%ñC˜»Ípòj#I-µEÑÖD[’x ñ(ÆhjlÉý0=Îx`üÔ~Œáò$I3îNÒÅð¸s9›[‹[›[¿ì,Â[ÿ¬ÜÎæÝ¥t{!fÇâ3YܨȳÀa°É›Íïö¼ÍÝçÇø³áà·ÚBM”ÀǬòz7dì¡l­¥ÓyüÿEíA –$ìKÿ<ÖÑ1·~%rØÜFdfÞ1e öUêÿL¤~ŒØ]@òÇb_¥ÿ/LúÇEÕ4Ÿ•û>m]·yúÞ«ÓÓ ¡ ÅÐ `±±ëÐL•(£' GÑȺ%õ²ÚØt`9½A²öS›§¬> "Å$O±ÂO·°Æ-(Ëñy5}êý¥”1oB h@ÆÓ‚|Õ„Œ¨ y~tðò¡iCô>åkD’Z‘˜Š¤àdP'ðŒAWã÷êBSÛ èDÄ“ò ž&@¬•ÒͤÀåêhR¥‡èjÒãÍ×Ù¤ÊÕݤ§ÃAÂU¢ÂU(Ñ-©(Ê/k’qÒÚ¤jwA¶>9åÒ°ã6Ó ”N k[˜hNì‚9gPKYUSVõTÆÃ‡ ÆÒαaª,£h¶:둳ﹽέÓqáè¼òƒAßCÿÃà‚y=Êb¶‡Vm­$r.½žWJ]¤3¡²H(,4¾¿t¯€¤‹>Ý (¼F¿míïî¿XwŠjñ8‡–m鸙;B\ÝødÓ ÒïªÔæm¸vÐhѪ!Lö®ßëýh̬&ßý9p;ªÀÓÆÌÓ¬Êk™µ²*HÄÊ;©! £h £hc¬Uü!¥UäOZè²vûQcf1ñ–½;õ2º;úü¹á…­ùYÏÏm5wl£Eí41×¹ª7O†ђY‹ƒ ÙŠÄ¸ÃØÕdŒØˆŒKK µ³ÇléI~'²š¯™4U— ²hÇ$¥öR<¶i<–Œ§™0ž†±– c- Æh›tUkBMÂH{æÿ^mî!ħIŒ Õ¸Ë6~jéãÝ ®Y ®elôøôKOT*NÏHKÐÜ=nþz°»º‚PÌUNžŽ¥OïÔ‡µ±ôamxÆN^¿N^ïÈ• ãËÌˤòÌRÞuSZ-iኬPùîýzkÀ»â ˜gžóaÐ ¼žl5 ¯ˆ»" éöþ±CzKÌ”…¦+6‚1µÁƒüz%÷y\ÉE £ ËîE¾^Å}AWq¸ Ÿ—!.öxš—oÜÞý\¼ñŽœÎ¥ÛÝ_ ÀË6,2Ö‹6ÐzÉFo‹^°IPe/×d=ûÅš¼‡RÏùgÞµ›8–+7 l,fºj¶¿šéNärêxgû!]Léý)f¦ï8£®½=3jß-8êûªöý±ö½¤™n¼¥óŒeãý–o~o¥aæ·ñ,ð¥ 4’a|§k|«QHmªµ™Ö&:âB<†ÿã[°åÝXÅJß ž£ß"ØáÆ·Ôø]TìZïóÕëFK9ªu*GÚ¬XS¨të…tHbFV•˪ÅÊeUâqå,#Û­·¬ÛUx\ƒ9©§×)m±¥™ÑÔ߉ֳ¶5Y¹³"‹V[*rWõq•U H'!¥Ì_­‡ÉSéiÞè¶á,ÎXmÿ*¡h¢ù—Ç/šûSeˆ"J/šRâ*ºháè1%¾¦˜ÿìÕ[œ÷ ù톎1cÏÑ®£Zvª+³Ô½g¹Ò»“ž#YÄ–ÛÊ,3JZ+}iÊ%¶šBR+kB«q$³ú Y=ø$V1³ƒ±×‘ˆš­Ny34­ Egï…ý0·ÍYn ·Ó ¯3KŒvý¬„‰ ðÆ Çãµó¢eV›Ä5MF^&qˆd¼X”M¤eÒ#m(³ËZ¦£òަ}7‘|“¿¤Èhxº·ÖNŒçÚ"à~äЦÅ÷…Q-p;ãN#ÆáY¢²|°v»©™¯Î9«0fóÍì¼8Ú9„1ëSþóRÛû° :,¸’äU&u/ƒ®¦™ I„Ìh<¹xç+zºS@&…À|(£ÐZ ãjAàJfÒ=‡G ïà üD’ØMÙ-,ÂôÝÒøX‰Ì‘jp"c¹žC¬UÊnTKm -ª.#mÛRÜ[1³z“Ð$ñÇÂ@*e—¦²ŸYšG Rª¶;$•K¬Î•qI9©Q™E5ª%µ(×á|÷¹‰·•ÎÆ{[i ZÝa—D©¢òõÖÞÁñ ²Ù.6|,oDY³ZfTT&ƒ™¢]³å^yá^F¹Ôêf”K­«¥ÜÈ{e Á—ù2«MOäÓòš—ë´þ~ rÄ€{’îdó@Æã®ŒÐñº„¤—YmŠ’ž¾î$ÎiƒyHâ\ÎOQ¨ËÂûD»ÉâmQ/³Út¼B¤|81ÿÜe¸écxf¦,ÏMp7”ê2«&ÕÉAÝ»lgàÕ}Ix:fIÎÓ׫„œ—Y­œœ—ÀÙBÒ^:ÃöF!Éo ûirò_skóåÎ^!)0¹S—M¤ÕœÈRRa^+ó²/ã­X댷bU-oG׌0°R—{¶*çb/æîzóÇ㔎HŸ«Œ(±eª’¡lôÞäAîÀø´ÂçËÜõÙª< {¾¢ûänrî[jÌÚ—³vBa qr˜\øÒÏVå¡]ø%Ñùnw‚™¤ÿó”(§ý‰†§"=Nh§”¹´U)#+Ê!Ü“„hàÉtåBSÆuë'V£ÌŸ­J)0{9²_’v|ΑóÆ€ùã–îö÷w¶ònö¸6%IÎD3’ßÇÄy+èw&j½ûj÷ød;QiøQ¿QãùÖþÉ^¢õónÖ¾²MGÀzÀV¿ÔÇnôkj"Yåû;Þ÷öw¼ÓÓïF¦ŽªŒÜo©0‘¨+bA¸9?ÂÖ H »¢Ù„´ÕlÂŽP¢ã_ùýHs‰_¹Qäõ  ö}IÀlu;ƒÿ«×ñêVUÖ X ܧٹ ¬£Ò;7›QpÆt>~L>oŠ®Ã”¾÷œ+/ÇAD0“q3^½ ršÊÑä}©¨ù±1™Ë‹«,¦¨T`L¾›N@Là=k2wÒú€ ä-ª ˜òÕX*LW ð¯€O%¿~êÈj4; á}ˆ]Bp·T(!¶‹ÎßЮãÆTEv ;Æ$°ó*”×- ë&®e‹êÃËÙp7[L¿;ŽYH'±2[D7¨N,ÝhƒnŠ„ÁY'l½ÏX²Š=’^»3—!ÔUˆh„Ñ“y¼\ÿæ1~žyad„ÀšéMh´¤¶„$AÉñŽ™4÷öŸílý³ü9›U÷Á¹Â›£Jiñ§R'ñóæñÎÉó=j 5àq@§‘oÚgµÑƒ©ÛZ«“Û=¥ó¬ºeÏuct÷xÄÛIÛtOû~õà×V¬4U7—‚ÃCNòq¡ý$õ¦6ùç» ­¦£‹ÏÂ(ÔªNµy·×oŸMô6`çdûY¢µz7ݾñ€UúÔÇÇ#¥Öïyfóƒó0K»ŸWD¼"‚ÈdÌjKiþ3ëMÑì/Zí·º~wTs&ƶl6VãìC9ž…‰SUÁ-ß›&^ëÅøO×Ëèå3ëMÓæo<›änê}cUî[ËŸ»E&®ìÏÝ&…uþÓ@óš‰ÌzS641}$ƒÀaGÂ…ûWHÜâÛZŸŠ"b⛤Œ"³^åƒ1¢{R<¤±hºJ‡Ká ¯PeCf½"÷6͹~(ZÚÝ~£º°!æ”Tœ´i¢~»ãOVup|²½·›Ôp»w *`<ä0 ÔҬ>HuPæbÂøÛæE °ÝÜÇÖ*Ñ]qˆÛu´MØÇÏAeSI]xý!©¼||䕸{CZá3%¯D?rϽÌ#äÀ2­Ìj_ŽBK^¿jCÕsê}žÞ¬þLSãe4|_ /­c“qôPBÝ•Yí¿LÛe,É=+»r7Ǥu]¹¤¨ªk ^TÑ•YíKÔs>+>Kãœ{Ú–ÆÇ­ 3õG½0ŠÄlSªk¥3’Z€”Î`Òû-ò¼+Ê ‡dñýfTËV™¥GÜ@ÔÐØò¿Š’7­£súgº{Ý®­g¥$Ï,Œ¹Å“É Zœ/¯7¸ß@ê.zî•s}‰»‚Æà¨1TŽ=€â¢ûõNxQ#)ë Q¥ SäwÌ”z8)BïqÏtˆåñì×$`M”ŠAƒVßQht e£Ì×ó®Ÿ0Xдl1Ì+ÀD¯?ûÁ"rˆ¹oÃóYz07צu×oJSÈÍÝæþ«—;G»[¿ŸØ ºW~çK>o¾Ú?>ÜÙ²ÂY¡lÆ ‡Òľ³ù2.Èxf’îêÊêõeøßJ•º,{ÿëÏö™\ùãGç[xSÑ3§úýÙ•¹ ðäpqC½‹•¿ªh™«Ü÷pXdØé–Æ-GÁ|]œ=¯®vì¼sqõpÐwÎÎèÃ"C p‘{vœy@pRT€-­rïUl'„å8I Oä8“W0™ÕJÜÀ¤†3ý ˜4¾Nõþ%…±cº~ÑW§ÄíKfµ—/yˆ\Lɾz)ZÚ‚V9¥Ç»§Æ|Móbçdø- {§sIcE\ûûfÿ²ç¹mTOj×99n"SRã.•Rãj!Õâfã {Í›•ÕÇOÞÖ…³ÍÓú›åø5—ʡĕ“kd`@Å!hn:ˆ¶Û»öêÜÓ;÷‡ÝµKxówµµ O`ÒèÙ{) Ýµ›—Ý/êÓµ~ü‰;ŠÏV–ã¯+õeíûÊò{ŽpîÚmàïÅäÞy¹Ô];4_ †µ#QØq{~´z·®¨|Ææ¹–ªm¤pW'Šc’°Àíû¼¦ÈÇj#`ÃûFô±\wüJezÃK ’âbôe÷ ¬8š4óH[ ‹·<© ¤”Î$BÉkR8?GS‚áF·Wga§)¢‡¤Å[™1)”Ì•4±¡HkÐëÐ]­ ¨åšbÎPÎpÞÈ,ó«\=JŒ*vTåiEšWn«gn"CZµ·­@ê1ãg! EÙáH<…iYÝÐK]®xmRž hoÓÂ>ðQOÞì|p;Ï&f­2&´ÛjÚB‹4Û<<8Þ}ÝÜj¼:ÚÚ™âë$:?ÃB-/ÿ¸üÓžEŸÎ4Fùúàpgߨ?Bp?,/g‚2”4CÈÖ„p!:ŒŽ¢×üa8…Ǹþ&i3v?Q$,ñQéX '´hEmL²Š…xå2)ú•Ï3"&>ÊçàÎ8ÈZðÌR}6k Ñò¤ÎæÉ/G;›ÛÇ›ÏwRÙ¹ z6]Jaù0ÖØâ¾A]/ømˆc{©ô¶—Jm|yý À*i0“ª1Éèo¢½8ü?sü·$СàD·2"À‰·¶p¢¥â1à´–>«BÍ)äP›÷h‹íSDø^Ê'UcšÉÅø¾ïÎÖ34‰÷o8cÅß)ØÌXq¸„¹Ìdp°„‘LªÆ”… 4,fÜýÌY¦Œ­f»Ópçš f—»?LÕ(wuHý¿·[ÃC¦}a¨pd|w…¸å® S5ŠÝê8—{98¬ ‹s¯ïŠîã¿ßÛÙÿ5÷jOG±©ÝêiØ¥%ßJ `xÑuv‹"\¶–SF-_Nµreî‚ð1È’2ZVÅ“ž«„×B<–ÙÏÞiAÇ‘)KIzÓ÷(,ÅÝç©®á{9Ñ)«âÃIÐ5&ï}Þï_ÌÊÛS¶òöB ¡k¸\B˪øÀRt•rCÈ%þŸ«Øv?Øom~JBÜÄwJ9‘.«b9ÉNÔ½ x)\š¶œ—Ä¦ñ‰{Ú*•“ú²*þ,¸š+,Ÿ·r%Â1íñ †èÎðìw¼ˆË•-:511œÃ¥ÅÀ½ò†I‹Ö2‰¶–I¬jªÌÝ÷ ‚IZLWü|¥EËìg/'2vÜ‹œÈMß»œˆÝ?Ç@˜>Šœ˜®ø…ʉ<ïEN´ïƒ©É‰ö½PZNœ,.—–Ó?91Eö?o qÚxom~ªâ÷È(bºâ("êž%D —îGBŒ±iÜ"­Ò(bºb ÑÀÕâÐòy{¡€„xç½3) qóåN ÑÀÐ)Kˆ:rÚ‚8r†ä úÙpØ=îâç—BàÏpÁp}ÁpmÁØu#j °ž@àQaEó‹Ÿýò½é „–`<㈂‡¬{c ‚‡¤¸WåÀXT“Dà’j¯Já ÑøÏY-p¯J©«Æ·7GÖ±Üí]8«NÛí»Rêœí1¤fj‡à ´òM,Ô„J«÷Æ\;qy½‹dÚkäZ4_sjƒ ò/ÐoH=A,‡/N;¬(_NY{•jÖЫòOŒRÖìëõ’Ómí©Íg_ϸ;VÏèB„ —X u{Ù–‡¡‘†|HÎ]HKž¿ÚßÚÜÛÛ:ØÿÕ 3rùuƒœåzd¦BtÆ‚ˆj0cs°Õ<çIh2¾Œæšš/ÔÌ’ž¨念Dª.[ Eª9Hòon½XÍ¡ 1aS¡„‰ã¾¼btjÑ ½g•褢#ªCï¢ -§ -§-§} JÐB*ÐûS€¦ÔŸVUWäõ>œÝvÃ^¿™ãN‘[J­ln)µ¢¹¥ ¥ùýºËNÒ–T’eW°§¼Ñ°á2¯¿¿ï¼z'z£ÇÙÞôF± ·z£¥üëSøô~&ÒOY÷g6~ú?½#ãdŽÌTJ˜]uŠºÀ1™Ó{ÿú¾|¤Ÿ‚Î/ñKèý†!®YÍzÔeËècÁú¾ûÞ‹œ'¨íˆêå°Þ¨šÂú‰GV+4MÏõ®ge»˜>™-“Ëj%sب'©(]“Ø\¹][ô/kœÊûÛSOGßSO?ï=õu[=ýº­&µ­ÖFßVkŸý¶úº³Ö¾¼5.é¥Ä%pvÕœüK™SbÕ; $š¨ò¶Ž~*¢h9]}vÕrúzsh÷¦³Ï  ÓÔÛ§÷ûøt÷Æj•ÓßgW-¦Ã·ân®¿püý‘«ÏÛŽ¿Nÿxçè×g¿4uç×b—…ze¼+§âׄò!¡ü|ñ1É’Q>"™î~÷Úûfeíû•·ÙEž¸ož%`H0Çì  O+ˆÞçÞËëë«+OÖŸœŸŸ¯Ÿ{Ëgë?¬µ~¬æV]ŪëëPÃ[ÿá|yy}%¿üc,ÿÃù*\__Z{’_ú‰QúöÓ¯=ù)»Ö9œ•ŸVë+k?ÖW–1m|nùÕDù¥Ç«ù§°÷ hQO5»ÖëÏÒª,8+ RUEæÌTöWÓgÏæsÒe,8r ü `=™+šî>Ù'hÊá¼Y¾Y^~‹­.ß´–ç@Þ1îáâB+¢ûcN¡UQhíIN¡Ç¢ÐòJN¡'Z¡QG9î™_ýbf~ùÍüâÊð™<†™û´–ìÓZ²O+«?fvjú²¦v"A[»3B¬qîYWhÍ@ˆ—s ý(—q5§ÐO¢ÐÊ“œB®(ôä<§Ð™ìx^¡V‘ѵeÇÏr y¢Ðk9…Îåîú1»ÐÊòÐÝ\C¹óVçq2O ”yZ ÌZ2?ÄeƳ¿–sö—6õ<ó#ì½Õñï=· ŸAa‰ç?œÀÎŒcpRع\V ”ù̱|8Ý,@6—‹±Tll».ÿT[{R`c=ecÙQ,ý%Ž­B •"+¶RdÉV œt¹…Ίj)Ô.RÈ+Rhb´¤üÉöÐöóÓÝc9Ül¼ÇžŒãð¢²ËsÅu¨j¹½£õ6uzzGkó½ã|]¨{^])†æ‹«0¨‡ƒ¾svF–Ë$¼eÊUTžyîUZm‰·ÝC óìêH‹öÒ2HVwšÉºÇ ½,a×S±„ŸePÓ·ß³aïT­÷,ø;&Û=s•JXîåT,`·—ÚEoµ²möŠ—·¢YNùqïµ1Û÷‘Ýþwxr°ŸíµoÇèé©Y‘YKma·úé‡Ý\‹Û{lïõµ´½×q#ùþŽ;À•·îIUš¼e6™´êg±è1à´æÁþåZò`l+l²¬lò3±Þ!ľå5{¿V;Ð…1_âÒn(k­“ªôÙZêЄ>++ROÇBÇŠØå¬s&†˜å¬rR•¾Etù‹³Æ™2.§š~˜V8“Ù#¥­oR•¾ZÞü·XÞ(ƒ¨øFèüªçd'“õgõéÓºö_uN·Á‘Æ918§š¬gÕ³æ¾Y]böó4Ù YÕtû=¼j³¼z’z•º>=¦ÛºÚér͸ÉC›¾Æk-'_¬ð ÷Çä‹U~±ö$ùâ±åF­™Ò/lýäÁÄ'…aGà.ȱöð;¡ÃýV€*¡$—ã9%`¯,Ûƒ™,QëÊ»j]ugÕÆO ÎÊã9R}|o(0ß²ðeïzyõνä !?.'_ü(Ö{5ùâ'~±ò$J4òä<õF´rž~³šÙ1‰‰g©7XK½y*6ÂÉ7«O ¡ïZú®©ë±$Æ|Ûñw­4þ®Åø»V×<¤l[ÄgõÉÝPùs¼+™2W˜jú³º#Ñ™Å!÷#Tt¬w#È"–¾IU*}'¢r_÷!1†ÞÃ]ˆÂѱރઔ¾IU*|ÿaCÛ":ƒa÷ÃʦШà}Ç]÷ÎDî:N‡Ýsè˜:Í; I‡Ýo óhæÍ<Ì“y˜ó˜=˜Gò^¾Ïe›×ò¤<–GñV꩜ï¥<Їògæ|OžÉÀ+yüNj#y#9žÈÇ ù=Çà}<9Ä,u¿ñzëÞÆ_ÄåÆ=º?`ã m²—_ÝŠ¿ºÕ­8êµFó*~"jf9ðÞÅÁpŤ®Æ4+.ÆâÑ9Ôs¸/çpGÎáþ³ãuá,à.ia¡¶–S¼æŽÅOë­3ÌkEÉöüQÉöŽüIÉöTÙž‘++CÊVV‡º”­<ê¹òd¨GäÊÓ¡þ+kãõ7[UóœÕâã¡%ž -ñth‰µ¡%~ÐJüÝ2Ü£7Æçç‰Q cü#y_ÜÝóâÞ½.îÕãb2Þ#yZŒîeQÆÃ¢ŒwEÏŠ2^Ò£¢€7Å}yR¤¼(ÒÂ@ØíG óûj÷ød;Q‰ó=00ÖÜ=Ø:Ù³TôÃV¿“Uïäèàð$52ž»…–#5ckrT380°èãC œ¸<à κ8³¾$ÌúN¬Ô»Ñ >‚*u–®0ÑK0jN»Ãßã¾ü2a¿ø¢>e]zÑKë…5Sâ²K5óð/º!§zÉÅMÞÛ6?>)cy‰‹­t…)^jIB|Ç+-žÂû¾Î²£îį²ìè[øk2èWøú*]aºWW ‹\\ag¿˜K«i£«Ñì¸/«¬ªŒ  v½DºBwþžônLWcǸô´ eté Eô®å膖³ánŽÎáÎ8>nÊ«9úêÄŽ6èæ¹g~˜'±X˘d Ùæ˜éÀó݃ýg»å:kÅxäÁ«óŽ{™.S©“P gÁùŽJ‡bŒ]÷r8ÆÍOí”MNh“”>4­Ëžñ îñMàÒôS›Æz¨ÊU*}¸Z+æ²y¸:äp nOâlÊiÈ?,S4%…» y„i¿íÔŽàãÂ?wÛí^îÉUnª§÷1,À‹Ýç›ÛÛGåOðÌÊ÷sŠ+O =mà’ŽÚɼ^$ôÏ{ÞŸø7ç×F =”ý2Žyïç¨7º0½ã^kv‚;«ô±ŸY¹ôÑo ð>ÿ4ŽÝ ²±²úª•f2+fl¸<Œ%þO„-Чdk`îi²Äb£)v"åvh¹5å‹ê¼»ÓŒ¢e”ÐÐÊRân[‹–¾SµU›Äͪ/¹öìÀjóa0Ü[‹V½<_qÏ×–rý§~y)¾×+LîÄxÙ Ée¯3mÕ¦x©ßjÊY}w›Yø=•Î,/uÏ9Y-%FÚªMW€,@¨‹’êÏWœ>N[Ÿšà7Aü/+ìÙª•óäpîQÀ3ðgú¢ŽAãêÄê”çlÕŠ^ž&psÈjÒÙx?D<Ã.™„`È6ÄCDB“žYUµ\¤È5kNÉ|uíę́¯yÕâ¹[àþ5>Ž¿Ä[Ø$òÝã }7²fÃÝI#žÜc¹£MóÞOò{¿¯µaÜNöQïnóªUÙfàv¡SùÁÞæ Ÿbwº¸6E­©ͦ®¼5ù×á*Üf˽ò:ùåÒHh/—F»t¹‘·á.‚=.­Úͬ6I§½ÑØuF{:f+ä¡n4z/3œiô"6—½áâŽ5Ɇ?'=µDé{ÒVËæ€Îš»26ËØ3Å5×™Õ>;wm$Iq…ðST_g!ýJìÉ"mQÑ:³ÚÃuâѺüj²§ä™]˜¶¬<¹ QBBά6¢d,uÿr±ŽW÷&k˜5&™X_¯²pfµrÚîÎÒy¨3lo“´ï¾Ÿ&(gom¾ÜÙ+&e1O#NKèųËÑŽO^ #ZýáèºþUGžFÄ{?ûïO_n4?ѽ5"O0N­yb°„Gx(t &N€gA>´zI=ºçKœñ]§Ng}9ͺ§¯_·"á=iÙMîYËÒbjÛ#¯åáøÍP³ç`äÌ)À˜Q`ä Ã+£PϪu¦ÒLÐ-üÇ*éá¶Ôñh´¬ÁŸ¯AµŽ"ÓÔPëíÞ—j:îÃØ8 ×K¨¤³j݇-õð-r'µ>ç÷¬²ÎCýIëªóп¨’zâè[T¦ÍªuOæ^™²n2_ŠÐ–íý }ºíiˆ¬“Ý"%DÓ¬Z%$R},÷#‚¦0gª2gwÆ$dj+SB¶ÌªU@-mÁÉl}tÁ™؞-ŽikŒY=Þ9Aaôà0Çþ:MÀ’Êæ¸üfBa~’2 gª™'K_Žšû ‹ïÁ„ŒxgBø’Žæãƒ=÷{Að—vZ›Øy'·ÙéžâzÛ“Þq£î™F:éÍñÞ÷©oÁÀ{âÒ88~n@_ÉÑ8ƒLÏCp¾È¹>¶Í2±3¾©ÏPóÞŠ€ÓÑïæãÞ45Íi>8'xn@ŽÜX¹a8Æ£|ðwc(+“Q °¦ùKØq±:î;Lǘ½2Ëçx(q9î¸Cî¦h~vÑ÷Ëã®a<&†Ã…¥Ø‡·£€ÔšY¤„PûE™JßW¼i†ú˜Ì)#wÞÍþù~ÃzÜ_D ó(ÇcÄ…£wÜQ8fÇà ×1,RGŦ$Ÿqµú½–y­«n–l–]@,[v±\ö££¸‚WJV˨5IgZ­ÍØ—6~8fWZ࡞´Z3iµ6?Z­Õân´‰V¾ð¨¡ðTH­Ý{"UÆÇ`hû¢„0™Qkºî²Ð™» „Ú„Þ·P˜ƒ× sp»°p8iÜ,,$fÔšº ¡g!Ouxö‹òî‘ÓmOEÚ›(Ò—‘ú2j•‘ü´±Ü“ô—ÄœéJ€ Ü—¯LI0£Vi0“9a±Â™Øž#ŽgkŒ[:<9ÚÚ<ÞÙzy˜#!¦ÑpJRb s$EX1Ñö6^DÛÛxÕ’oï„ú¬¬h˜ª2i¹4…Bx2‰Ð€ZHÄžåÈ‚ø:KÄÆÊI²±ÏB$$¶üGÞ§ð+£A˜_NìKUùe>šÇ ðY±xÒž“ˈzÂÄ2B^ªÊƒ–ð “_Œx7e´M4<-Án(^R¤KU))ÏÑîO˜‹ñd꒜”1Šq¸%e¸T•‚œŽ{ùÒÛ°’v|ΗÛîŠùÚ^îæKl:®MO\ÓÐ,[Vkrnôl/ÕšÙ^ªeJ¾¼ n¬’bZªÆ„¥4lÏÒàÁøe4h »•-¡áÛ  [*%ŸÉ–>ñŒPsÊÒµy´?Nvð½”h–ªñJf4‰÷/˜Yñw r™‡Kˆe“ÁÁBYªÆC–É ³³_‚<6el5Û’46Ì.'‹¥j”Ũÿ÷&‰Å2mALáÈøä0\‰rbXªF1)Lǹ\!lXA+çŠ`wE÷ñK`Û¯ò¯Ìt›šü¥aW¶øåçZTú¹æ”~®-¥?NCJ¿¼¥?mJ?e?éOÄxÒ/m9éç›Mú96“~iƒIÿs²–ôïÃTÒ¿o;IÌ69~y IÿK0ôˆm¤_†‘þ]­"'…‰%¤2ÿ³2†ô¿ KHÿ¾Ì ýiÚ@NÅˉgþMýûµ{ôïÏèÑŸ€Å£_ÞÜÑÑÖÑ/lèè¶rô ›8úϾqw˜q£/–~!³Æ`¨\0Ô.êŒÛ .Í .¸7¸ÀêLÌ.É.î  ñ… Fr† >7o¸à¾ÜႇàLÀÿ"Í#.øR\â‚äܧS\0¯¸Ich 90øìãÝ3îË ƒûôŽ ¦í7Qì/'"cð îßE.¸_¹`BNrÁh^rÁÜä‚R~rA)G¹ ”§\ð0]åö‹øÊ÷æ,ö– òÝå‚|¹ ßa.«Ç\0‚Ë\0uŸ¹ í4LÆk.(ï6 ñ› òç‚òžsÁgå:Ü‹ï\pïÎsÁ¸:‚Üç‚/Â.x(tÁ½yÐwv¡›>–’?+/ºàKr£ îÍ.˜ª#Ý„½¬ðwG_ºàžé‚{ô¦ &áNŒàOŒêP÷¨ Š»ÔÅ}ê‚èT·?Ô«.¸·º ˜_]oÙä›vù¶ÁX;ƒ¬;ƒ©›wiûÎ`2žAy Ï`ˆ‰ggã”7ò >++Ïà^Ì<ƒ{·ó Æm{Œ`é|¦žÁC±õ îÍØ3¸³µçäð±ŒT÷y|_’Ågpo&ŸÁTm>'„è%¥º»š}÷l÷Ü£ág0 ËÏ`ÓÏ`TÛÏ ¸ñgPÜú3(nþ<@ûÏý¡ ÁýX€)PKîœ6ª§xâÈÇ€!n¯çx ¿7O~?Ü9nþ"G,sŒ%dÀ"]ìHÔ{µ{`©-kuôàÙ7¿D½{8¨KÏm{=(àhÍ9 H¥‘ÚPø*ÜxÏO iÎ(xUç#­@¿×Œ.ßUäÁF›E–NpÌåI´nªMümŸâJNâ ­O«7§3‰Ê§ˆ×7bÓ˜†ã¡6Pšqë-}§á(bC; ଴‰ú×=¿ï}Èô3^ònÎxÉû×òrdÊǰÊø¶“ïE{±pÏÆ,Ú'ìE·2ÄzñÖ&Ô‹–Š‹ôZK^ —¨9Mq^¶y_Â<·?6ŽRâ{qAÞVcšb¼ Íw“ãå,Þ³Ÿ…À“–᳸¨?1$,*½ÛjLYv—xX@xçÞ~)ƹÓGZ³ÝiHî“AðR»­F ™]öÿ~$vC¦*¯ë82&i]¬D YÝV£€¤žÀ¹l9½@A+gËèc@÷1Kè¿ížìüš-Ÿ'Pl:Ò¹‰]$›WFB+Ÿ7áùÉZ.éÅ&"ô°4âØSCþÿmwûà7ÒøçTž<^mîílî77÷·›/á‹Z1ë;©T²Ðµ´Ãk–“Ì–0å*5¥•¥üÁºäIJU–n£”fƒ“_¦ªqúI£M–™`䊨Sü×Í£ÝÍg{;¿moï<‡wÛ²‚F÷gÿwNÔ |'6Ýl6?ËhQß dVOÑ9ãEC“,­FL[Í £QÉ‘EFÝÿ›Åöÿæ×ýÿÀöÿæ×ýÿ0÷ÿæ½ìÿ‘ @Ôï Z}Ø}kM·Ýî ¡‰Ò Ÿ5Ð ¯žlîš…£Õ~«ëwÓÛx\P Ñ pͨx}}É,$SIXVñ»éÓöjyµ@Y­íp›Úøç!¬9ïú» Ôày8>9zµ…˶ÖÜÜÞ>ú<¸ˆÿˆ€kÅ…^ã+±ø¢ˆ…¾´_ ÆÄ â ¤1Ñ  n÷ƒ×ÔW£ÍLš˜wÞWÞÕ™×ÓﺭD£á!µÂ®×ôÛUy¿ÎµÅôƒi&+|ÝôÜôdj µ¹e—¦á ’7¾(Šàf7éÏÖÁáNsw[?Ë vÐÎCD/¿yÞq/¢ L“%›Z¹¯6 Uø5ÛÛ~–lª}f•‡â±eáGE_¦ÏˆÁ»ûφ2ð—ÍPu‹FHg~=fèþÂë÷ý+/ŸóæÜ™ýVˆ(³M. ÷OææPx19w–o–Ÿ.¯ÌÉ®éoUsF®ð0Ž7Ñ¿û»[›{{[û¿:¿onî~'_ºóò•cù'¤W<'õáê‡ãŒ$ Žüºº`–ñäáù¸ö“µiV—Õ~À=‡°ÕYu"(JNÿ¼b@Ž.è_¬däõ>(ùƒCzý¬b88³Â$øê0±0¢Kô]4ºÀ@çÆè(c¬TþÙ#RŒGÚ¢ª‘Å3Å ó¾ñ€tb?µ¬:ƒº¥™¨aÇ‚ÉV /\óÈÙÜZÜÚÜúegþÛúge,'Qá±ý¶y´¿»ÿbÝÙrƒ ìÜÂQÔí…(T1ÓÑI#ÉÙ8Ö!sKwººñiäA}±s²¿ùr‡®¾®™µ%wqÒ íxQ ²£š1+¢{·ç}hî>?nÌÀŸ ¿ÕjÒRÅë;íÁÕÕ­¼v¶Èê&átÿQ{' Q z{²…Kÿ\n–GZ·þ¸&.m×ÆÌŠ*SàŽD› :››G/V™Õø:c4@;gßÈÎÌÃ&8ÍMtÙ »ý¨1³˜x‹ñß½ Ð`E6æÏçu‡Ä˜hÏqEÏm½ÈmÙZd¢i®GUo™˜o£UÖŽÞ'ÞÆ+ˈeiC»•bö~iIaSöøÌ¦3[µ´WÉŸ‘’«ý¯6÷pµW´¡Q+wÄ/Ɔ+ßÇ•¢÷ü:Jö[»Mët@¼·+/;__zpâôœ³Û¾ç„½¶×#¿È9ó/3uƒÙyxå´ìÌãi5U‘Qäe9-˜†8B9nˆsìyä©èÕzHëÝõ×ï_:®3ü^˜1á[íõêãÒ/JI®ÙÜ<<ÜÛiná×7Iðä1Zw»èÖ­z! ‰€Pô’Åy³17øÍ#g ׌ŽênØ÷‚¾í/º½Ö%sÐûÝ>®ö1îá èxQ„õq=8Ú῾Óñ\ :ýëPÁ³ =?‡’ÐÛng2Våè$–jÐ7ÜxðMÜ._Ò l?³µÿ=ßÛ|q Ÿ‡‡âÛÞ6}!)ÿÅO-|Ë $ÃôÚÙ1T1ƒþ?~\ŠyóãZsí |év[üwíÉœZû? ;\EÙ9¶ßäG þM¨¶¿qäå+—°• ¤ÐUL2¾>ëyî{U 6ó71]ùFR•o˜ˆЦu ûwC‹¢ÏŒ¬…ÏáAÌr=~^ve&5Pè‘Ø™o«v(ŠÕ]·ç^ÁŽcša9çÙï';̓£í# [½°^›R&C vŸñRôìg›tŠj—oYy5¬uø»ïÔ…ñ³ÝÍýíÝÍ}çWÿi¯÷vON€Lˆð„’QÛ¨¥ø,¼P*œuš³È¤(c0œ~„d¢¢-,)œƒž:ü¾ZÏa«UB0ɵû¦ÜºiÓümCë,N2 þ…˜I=¶éK“´§Î<Ò‚ðΛs›[ЋÑ÷xlÙ¡¶xÓÄ|À‘¦†2³^ý¢¾à‡·çGsÙû±µÉð½è­n÷úanÄæäwâ°™dŽèë&›Ð&ÛsárÍn/¼@âWI݇Fbæ€F^A7JFP'½[Ä™ `Ü€‰¿u.z^·‹œ33sÎy/¼r +8ª„:Þ˜°)º {}ârݨåûÍ««7oy9Ë7OVŸü´€Ÿ?¬=Åϵ'Oèó§µþýô1~þð}:Ÿ€oú& Ó÷ ˜k?=ÙÂ:OŸ|ú}þôt‹:öãO[Oø÷+–Á  ‰ÜZÝ¢ÜúáǧØF@à÷Î*~nþHŸæh¤}¸qs4ÞxHñ€µ‹Œó0ÜÈ1Ó¦JÎ9†Ñ>>Û‰€¢ˆÚxð{Á6l®ãÛcëVÝÍ5vÚÉ¢1ßèÜ»lcÏ?9éx;ÔÌ6³Ó!Ýh®š¢ß|c%mßrÈ#Òââ†> AXãðÜÊ} éùï½mÿK·ÛÅû´)¸¾ l&ú‡µ)tcJ.ðyWš(èõH‹ÍØvÙÄc ›ÐákŒÅÙïwP¯¡TÿpœçHq{g~ß÷=ˆ 5Ä@° å„ü¥¹Nˆšh´³¡žÑåYë Þ”‡çά,2÷Vùä ä×A½K¾"ÊíR·T‡IZy‹;g¥°¯doòúŸþ§¶U°pI­è†ãmîo¼l>ßÝÛiTgD¡ªaõ“ý/—wC®”á û3<‡sÏâÏO›U:lÜ¿jÂùb4'„Sæiuˆ'B²xREL>§3ÍÄcMEœËör¨8€4Î$tÉút”¯:[JYŠsæx7~Ô÷‚‰Xp†#@G»¥e®€+Xá°mXËÆ«™†6äËð1o…]‡m‘Mä½ ÛyAŸ‹É “«]Ÿ·‚~§ªáòåP*V®>gTÅ9Pø'ƒÛÚðÃ4p[ñÌ @§òÎó]¾{P4OBÙÄÔ•n¦å^yeF³‹uK4+‹M…] uQfUâŠÎqrm„Ú°üÆ‹Hm9óUËŒã3^'lÛë{½+<² ÄËÊÍÖ‹ׅɃ9ާ\t¸ÎÞWÇ;MIÏ…iñqÂУütY9•4¼:OÉèѽäY{铯)<áì¬çön‘¬y½¸Éèöê,ìDl˜ç¶ú·Ó¹ú§\ˆô“ìš[$„ÿþòÙÁ^ó—Ýmâ pµCh£ÉðšÜ¢DÍ¥i³ ‰C4»·|$ÙÎXxݲöPéÕ(•vG©”ÃÅ@@T®|g\å_Ws?cmÅ%Þj½»Šà E&‰ŸùȼG‡xÚÚJTULž<<ÉÁ”®”˜ s«aœWQLN±“\‰{`ŸÆ;]Ói†¶Ýw&²_À%Dãg¨ÙÝÏ@¥OÛïy­~ˆ$l#löP³éÈ®(6÷‹(üHC-(cpÊ_@иôIÑêvsŽ 9›Ί^×í_ÚI°jÃNÆ÷Œé_D8‘:ò` ?dí»žrb×ã9Î?2*d jˆcAýÎ;¶ÐªÛ [@<ÂáçC 9òˆ$‚ÜyoÝ:½A€a(ÓT@ž‚wØp£@Ï&1Cp| s1™9ÇØÿ«Ékq½#Þ oÀ„çÖÉ#ûc"úw'ùw!øã!÷Šv!õé™dÞ$òEH¼tNÞ¿rÿ_¹ÿÿîÿ+_ò•/ù/àK†ibµì¦YG`v)CU–,K€%I!à™é}ðv¦³0r0Ö@Œäuuåµ}·æçîYøÁƒ6ý•`Þð{Ìñ4¡ÝuÞÉøélàwÚ4§­œ´ Ƶd¦ÁÍ7U¢"…”¨ô†Ã=á_jlœ¤ìu+ŠZ°õúõÊ ›/¬Ä–j˜ªÙb¬zƒ7jº{ƒÑ]S~#ÝR¯ñ¶õ±<ôGëŠV06¥P-e÷y9.ôMÒ t~~Þy†p)@ MxÏûsàcP'×!ŠK3Í?¿A=kµm*ŒZ?¡6Ñ€AÜÿ ·=ýfT«wcû-ñŽM¯ŠÎ¥ Îà$@Œߨ"G‘ªpžÅsÿ‚l“£†Ì¼¨ž8/Ý÷ÙठàõnK^McA2üuþþ÷Sy+éœà¾¦*>.Vtéu:NÔêùÝ>ô ½I° û˜óPôGnuÐèãbÅ0éL'¢Û¨ï]9QˆÕnѸY÷èzÔ†oýkÏ Ü`DÑmÕs-¯¦zVƒÖ»H¤`‡óÃEê`½òHÈyçƒv'$jÀý¡¨ çèï 5û®DjD·á–ZÀàõ)’š÷ž×] 7(ô¼+$ƒ€t@¡¡>´…¹õ¨ïö )]÷Òï31EH8w<ó<ÑçéÀ©P°œÿDÂÄø ^ÏÃIUcçß±é„|hž‡aÍ3ÈGÚ9³h „YóúslÊÓÝîõüv‰="Ù#§º¼UåÚ/ˆyš§ªó² ‚/Á¸‘$ %Æyˆ‰Âc_ÇºŠ³AHåi®Q|ã,èܪœ+P"hcßïºCŽÎ ¨1À€CU9T!„ t€Oxïö0éc'"›ÕÅ!à¾Ç‰X ,òÎÏý–k€˜q.J<_ ÈÞX4…_uú=ÿ°•l )Å7ÅîŠúmôÆ"uѵâ wóm0-ü¥s‹ýÆ2h…Fc½ô/.1× - /»Æ³+‘ú]™­¨´ð«¿›¥•ÅL®"¨Ñb@qNg߸‹ÿÙ\üWó­ø‚É7ÞΟÎ5êóK§+KÝÚ;%øJ«x<ÕÐ*žÀÇ~ЉÝpœy¢‡Aç“â(µ‚=­ E¼™ŸÉœ­Å#§ÕQÀÕVuå"°e+ 8k4¢Ì6aæwŸÃ_𓹨 þ=Û<þƒ+ý ¯éûñÁ«£­9žs®aT¡É2^oð–¿“´©zàSG }1±“ïf1¡^×myšSÛpTÑw¶UVeOc;  ;P©F.ôDbÿ„}òTXÄÞm·ùy´È~ÑOδ¨ï÷Là=XŒSøÇv»§§ bã´Õ;ñ¦®¢ÈÆŸV¾©FKµ¥V®Õ–.ÈÍ·ìƒ&¹Õkº`põ–ð1ùì¶­ã—¥ÓÓ•Z­-u«Ig±ôøyxñ¸ $¯ÓFðÃãÝ×4í©9I ¢ºôG‘¾6ôn©uKÉ«ÌÑŠpÆ—þˆˆ¥3ôí¢‹Óêxb§;ëÚw& 4ˆ^༼ùëÓ[˜¹™%É*Ÿ®è 2FtønIBU ¤à ˜^¬Þ8]ý$j¬C…š0“¢½ŠüBBï#üMÌLÕ‰–Œ,ÖÒ†M9„\› 4iLg2µ6ÈâPAÑ$wÐm»t´qo2ô¢¹5b!Xöú[t5gG[Z¼´Žùé ,fÐ(S±ø1¹ˆ DýuQ¹ðõy ÛqõA¦gðô™4ÊT¥’ïÌaè¤öÛ0èãI#Ô¢›>Ê›4·(càiÏ1ÆŠ®d)ʺÉȨÎ{ "ѳÛþ†ÄööwPRäG.Kø¨4ùð{h˜ l¿ãÝt‰ñ¹ñZâm]ÁÔ€µçÚÌ_üíS­RAã¾Æâ6 ûÏw_4!‹ðìßQƒ¾÷Õ¯W ™]ÏGÄaó´ƒgÿKêvݺߧö×±ñ«"<ò7Z©;GÌb#„Ôøò‘0ó w‚Ûéyn–Ýî ÙµHMKÂCc…μ:­/Õ—6àk=œY_Îþ _k\Ø×=E‡˜•⬳«úŽú´Zw{^äy4Û»G Cü†Ä‡î!8@Þ âüÜX©¯,Ç% z é¦à爐ï9òž'ê‹8!ÅCA±_WN—d‰Ývâpªèõ©ZûDc м¿«¶Úý¼úÕè„5ε%ºEx'jU*{'Æã¾zQ1‚ÂýõrswÿþÛ9j¾<ØÞ!ÛÛO±ÞÃ^ˆlo?Åd8åpmºò@Ÿ×j¢öi•ô< éS¯¼ŠØ–„+Ï ˜+ç»,OB›|ß{$|Ê:·uS_›Öâvyëà×£ÍìhóÙÞζ} ö¢å†k…1…AaE³ /ðz.ŠF¬›@¤Æõx—®&Öæ%›('éæeÆ?¼jFè›]¿mœòœ_ü¶sÒ (¶‡{†®ò=ö÷áî¶dÛ®]9r °"Šq¨¨ƒ¨´6©mñ¦•Ϥ+±†H›/·wí8ƯÊáÕ™úÆilž»(Pw·¶ìƒ1‹””Q÷^÷úõðÑA™Ñ‡÷úõÆgn¥×;;¯O´ÎBwø™rÖÐ¥¼3’ÅÙ#UÃtôfJ^{'Íã_àj¢—ÆèØ=Øordc+áR©$ ·6ý(ÝŸýƒæ«}`ß Òvá)1*ÝyJthaJ^î¾<|u,ˆDº"SbTºó”èЦ>%ØaH =žN6Ov·°sÖéÈ«Pn*r M3^ímï<{õ"Ôë’«-ëM}@ìöó©¥G²ŽÍZ²Ü0m ¦0bë³|û2ÆéåWrð8Ó˜u HÇÝóê¸Q_2.ž>UQ§« à üNc™î ;Ð2_ 6#÷ƒG›ö0QF\'Æœ£Ñj AuRˆ$ dèPrŠ£ÆJC£ÛL³(ùYc˜»¤—×ʯT}ëÌÿ²³·Wyä¼PÂÄÙ­ÃíãÏÑ ˆoÃøê:ÅÚˆÖ G!Ú¥¨AáT°Ú–4=™¡; X¢íA‹+¹dA^G¢‚¤í ..`¬êîJøtñ%Ö´^ ÇòER«5ªÖ ˜N´jQSÜÏ"èKÐ*4äÆiŒ:ø{‘gâSÅ»Áû2‡ç…çNx¯¦fö4gj9‹–ΣGøêå“èÒÙEE·ãÿ‡gM¼ÊªÓò 6 FÁ{zGû‡ªg¯²ýjso úÒXÙpDÿå#çMïË;Ñ¥ è¯ÿ"¹4¡Ä"1ë] :¸ÀÑå\–~5Šªüص··õr»ÁÁ_{Þâ“úªƒáäÐ6o(ÿnÓ-eÛ‰º\îg毕ï«3ÿSý´€±Z—Áç;H²ÿœƒñª¸q›# ¤L¤û_ SÈÇâ…SSk~Öè Q/€ÿz±wð¬yüêÙñI2òøÑY çtá5¾šï†‘3?'\f¹¬C•¢V½EE,éaÉÄ„®ŽµJMb=¨à4ùÍ‚ËA9ˆ&ìy7B»³ÚùÁYD½¥3?XêbózEЉ]óLá_Mµ(IÔ°ÏÒTEBŸsÌçë¼Ç›f2» •¬ÞØcØ`Ž ψ UŒø$¦M]’ûýKÔ[ÀÙÒãÞsbÎ3˜f4 øOtY7ÏRºŸûbFÛ#U‘¸7 +n_¿£`6Ø¥r ïÈ~åµüY5pJ?Wy5µøy3ˆßôŠÂÁ˜ Ÿ;‹îÔ,8 lÍâ%šª;¢×ïf ­³%:ª€Àÿe›æîáþh¯uý’lï,lß6jtÍ›‚\YákÚjͨ}L–­é—ذ÷z89+U¸†×ò’3 X«"Óæô.3+æåwï¼ۯŠnâ-l ™m‰2•oæ»d¹ú<P]{g\n«ïYàQ[ß$j;²7Tƒ“mœÉ9…ý°ØÒâ!R!Y &ãW$@ @ ­@LGáš ÀßßP]éáyà¶à¨ï»gt§x×dO¹€sÜ…ãÜ(ž0ª<)7œÿ7ûœ"¨"SÊÀ9¹IAC$4Û¤(ãxLv„5 ë0©½Eh9•ÙÝsŽñæáæÉ/Íß6÷þé\#´Ý£ð=5áÁ²×@T¸¡ Í´Ô‘ ”¤¯XãÏ]uû·l»SŸ«`–6àd«ßÈE‚ÚÏ1#H¾¦Ì80¾½0|/ÍbÐR›SIK ´÷‰oJ"“TÀW:®na¶ÎÆÔeÆS:žÞœž.½w朸¼'$›§‡È 'òÔÍдïnmžñUVÔ„ÆÉqßVÈx† k0dØL΃C5ˆ»à¯zš\ŠK3˲ì zÏ9»°ìHµhž½„^m¿í¨”ƒÀEÌ^´lÇ·?ƒ5¼Å‰¥5G›2à!Þ o¼|¹¹¿]0~ÀŒ ï}^!ŠF·hÍ…&WÚRÕu£F5ºÜÓ‰°Z]z·Ùq-U#!ÐÛué ÔÒ+ò« a"Ç÷p0¬³(ì úº £J‰mgÀéÚ™œWd^‚Ñžƒ! “ Ú­.á*Ofmþ;â<è&ô7áâãú²ó Da<ÂçŸ ú†V &áÕú2s–N8iîP7•ðoÁ«àÖ©{hˆMì²ÃA†Œ1d-Õfgkã CÏ¿¸ VÚ#jÒFžâi}µ¾ò¤.‘YØ1Ñ©¿³ÿ«ƒÿ½ÜÜÝ£?õ˜¥7"¤,T#¦g yä œYi¤De(q2)ÅNcy£0–]ç+ÆÃã•FmÈ÷áñj£ö3}yÒ¨}_`dû{ÇN0´Ð~fo«¹ "Í–d1ùweosÿÅ«Í;Ú ñ„‚oãàêÑ_þ™ÓG.@ô[× ihçèèàÈyÃ’®³wð¢ù|ûmÅ.ÏØþAÑ–«ï+<ÄQ _ï’SÕØÞ°Ž&«¢9ÄInw'!aøÁo{í ¢PJ¡tN(\~Á!nÓ Z@ÁÕÑL3àEc›NaöK»‰Ç» <øVˆ7¢m¤c™H°ššY O»µÈHȬò™³èýé, ª'Š­ᕞ$Ø&V*4tCuæqõSüလü=“x@ *.Ä"̬"ݘy"™´ÊÂ(¸ën|}ÔLu«M•†U€jrjxª³‘ Xqóü×S®‹äø‘Ó‡’+¢Ë"¢ÙϬh‰KihŽ]Ïî <Û˜"¤MÈ—È‹ëTAží:pÂfTI‚dS®>H3 o’èå†ôÔ j T­<£zçñIÜmÞ´¿n¥;BÛß:ª˜ì?}˜+±íåÊÆ§ ©žèwC«¤šFþÛ{µ“¹‚ðb“ËâìáDàTQi‚/Ãs6Q~’òÚ\þ¶¬ûwªÛþàÂ+8 ž¼$h:~%4-âXsÑ Ûq¯`"üÿ Dy À½ð–%M‡F.¤ã!E dc㹪OýÛ®¼¢óçÀm£ú«%àÉ…¼(rk®ÿûFæØê‹ˆQ˜å(ÝLþQ}#N–Æê†:nÄÙçÌʪMªc} ©ó?‹6šÅ–Í3+ß7NgpO~Š/ó+ ôЍ<‚c®pŒlÀ1À˜7^Ôëuëj#Êy=Ø“W•½òp®°•Ÿç!sP"Ö®}ÔuÅÞ‚Ç@`Ü:âÌìðÒ› O‹I7 Ø|˜›ƒe"î(Õ p%P|¸Dd².Íä—cffgçæØdd.}µ8v9¼òÿ=üÅNÁ¥¡‰Ò&šÑ@`3ÀœÏÙV'£Ž!gþ'¶yRˆçÉʻԂ! 6E¢Z.ÈŽµÓY÷t®f9ñ+*näkndþ­`5ga¡‰÷¯—ë&U P¸´Ð3V½Šk‹YuÀ/.:KV–C¶n”dËlV+,7²XC~ÑÚWïÌ>IäüQ ¼ÓšVR Œr)CÊ  ñ©5-ßÄ-Ó)É–vúЪ(ù|üÈW8á0>|D3¾„¶ÃKoñ¿ùÓ¹¥ù™šsúm½1¦!z}:»´t:—ñž×uüT­áé-Z¶Óh0½ô¬´Ùð)´¼$ÑDKè;ÁßÿÄOøgé×Xþþ-;#Ì--A‰úÒ†ógí’œMÚÍm²?$ãÒ.­K‚[}àöÜà™b¶ï€0îõ¢FÍ=kÁrqéÿû}ç*»ö¢þàÃõÍíj¢èÞÎÉÉÎÑq£¶ùlk{çù‹_vÿ÷Ÿ{/÷ÿïèøäÕ¯¿½þý_ª¨€:c42cÀEÛþ…߇ö—WV?yºöÃ?I dÈ.Aì ¸R¥²³õËAs«áÐç¾ø<Òý;©'»ŠjüWY È6_+Q»¹=mÕÞq‡ùûLí›ÚÆÆ7ÄOv .P¹îžQR!šP”ÕonçGt¦À¤Öˆ¶Àí€lõã$jÁzlî¾vÖê+à ÿéÍ‹˜ïð…º-Z[ jR’× ‚gfÄGÝ»ñäWicn[>†½§6©_,éUÅvM–GWïQÑ?2 ÛXlŸ¥‘ÿ¬Á³«]¡h'p#½ÓrH¶òÌé×רQ½šHG¶|g,ʈ4ʘ=ù"ìÃrEë¢Hšóòøwà?)?×;n›…qÔèTÇñ¼·ª‹ú«sÎöÿ¾8_ÙÆš8×L©D˜ $¦]ot#DØÀÃð`nïVŠ¢*š#•Ð’B|‘•‰¤å[/õÔr›ÆAÉÁÐÉ&à™âuÈï—~pv”õd¤šdH'ZãŽüI§¼)¨r³lÜ®ü¥¤Ï*ÞG5Í MBÑG“ðŠ“Ý¬ÖfDéšì–Jp!9Ž™˜3à³?žˆó)^ŸÇsÎÿ¥yu('x³2X*¿D€á|ƒÖwwк‹Ì@Üáb<„à °Æ0Þ@+^p9vÉc[8«i£Uì´Ê;Š‘»Ê‡‰ŽŸbW¥ÄvÈJ'ÅÛ8VýË:@b5€$°ƒ¹ÍÅ®¹„†š 7jª¨êHÍÈ]¬/Ák8“#üeˆ¹\Mw"ØÓ˜$(W™ƒÑ ðPn!ôº´óÄÀ‹AÇí‰d±øBgÁÝE=ºMbñ†~Ú’¸*BÃbÍ›FMç;o­LÃRP,r&<Ë®Ü.Æ àÛüÝ4]¼ý–u ŽTÜõÔû>EHiT ;hßÜþmÞä'ÿvhr”ÛˆþöæÓòoÍ¿]Ôªe{¢|€õîD—‰Þ|ÿ·n7¯Í N†³âP–åJ†ù ÞaÑÍ Èê «VµæYÃX` 3¥ZMq@z#åjëò*l;ßß$›ÃÍÖ2Mwr¬}¶¤µO¢ L¾+´ÐFI\J,È` xG*9c4{ƒ9tXÑÑYÑD·ª”`2TW‹\É0G¢+¸/Ž¯ßª'ÔP>êªDq÷… Ž•9F€Õ ­&ô­Q­Ä-PeMema™µˆ‘1„õ—³R_îO˜å`ÙÊ…n#öbÿ•³9è‡È–›¸ö‘>„œS‹2láèP­F•1ƾ> ø×P«Aâ¿ìln¾ë%Ä£¸ÌÞîþ?PèQ\B\âk%ä#T]ãªÌüO¥bø€Ë0êÓ «;à“9˜3Ï=Ú+¾«Tãˆq¦N=Ø`÷|µRÎ5¦7©NtéŸ÷7œdÜ’™y%ô$!_ÂjIȃ-ŠX ‹7:ü,,ÏCò羺4Ã{ "]A¨b«WòC±T+‰NUÓCPe™…äCcÊnY6 $«²Fõ´rúޱ¾ÆN”Aß'ÁF8V¡šâ€†Ž¸[q“UÈΠï¡IC­VØã8"aŽ™¤ã¼â(}õ"ª¸äŠÈ;e;Žåè£þ9rN6I5ŠihzžÞMÚŽB˜ªW*¯pLëˆÝoOvöß¢Ðøªã܇‹— @Y/½NWälhD&uøtu—tŸ¥ÅÒ˜/.-ÀpæõŒ5<; "2¡Q<6¡FkÛ¨šhÿOlÿÏ‹‹lËiKy*n˜ ™„áì bŒAÛ€LFe W""Øà†drÈ‹!û*ÃÏ`Ž\ôgö$<Ãà7²ãdÂ:ìɇ²]Ž!ØRº7ë';/÷6OvÞÚÆ¡--£1­D¹‰•’pyÓÜ2ÃaØ•­T£ÑzeFßÈÉ2bïÆ¥Äƒd9¹}ã‚òI¥rÄÇ ™Àæù»8‘®\ŠR‡IÔ_w.ûýîúHËa§~éÞÜÔ#o KŒ%,áçá×ü¹‰ÒI÷±QMxG+å¦Û»ˆ¤4‰!gœ%¢¥7§§Õêé»Ó™·K(Y~·tQ{W0ÅÞÂsZC4 *Ÿ½Õ[eÃaœ/ˆüÁêø‡>œÎè〸ÝÛžqÙwf·à[^Yuž÷<Ï9Ïû×H\ž£Q‹ØŠ»A«Î<ƒÙEq'޼ÖD]6äÈWÁØNœ$þÊÇQt1«šbX[б´­–õ ÍUªã†ñlý>®%Œ¥{ÝnÔføK­õZ(T×føK­²»K»·OÄ·Zåå?·wš‡ðH|«U6û'ü„¿µŠ2ˆ>Åß$á[÷úýŽõ$5\ˆ•Þ!¢s_"ô‹AcdÐ^¼±òM«‰æ62¬AÔX¯°öƒ™ÜG c™m¯˜UXaýîââ|ã": ú»"ÄÖ†+R¸—ÑH„ŒËE ÃDQ” Š %qab1¬p$}¶{‡V3ᦆB—ßzUºÔ*Óߊ™Q´¢Å-aÄh¶9¿Y^芃ŠHEù?j§@ü=þª¾É/â“?Ô4ç„u9iòý¨¾Ç_Õ7ùE|òþýÕ™Kq覺Áf¢1qê~”_Õ7ùE|òGl†’͇êGñM~ŸüÛ(»m¨Y 3í#Ÿü¡ú × ÆÅ £S _ŒÈfÏùižÚOÆªÕæR"Rh?Ž=•·ÇÕDÄ©Äuº!îTZÜ‹ZUℹÇ979ω8?ʯê›ür/s“;R)¶0VÔœ¸3@†¡ã·ú*$¢àVñ83£õ"^&÷ê ÎËp ƒ!®;ÀدÔ*'ÀÕÁ·e¨FäLƒÌBïŠ9òªê´Å³Lèx™µH|0wŸX˜U‚`~“_Ä'å |cÆ–ž%¿ªoò‹øäÀO'ÚYDßèäº4œ¦z¬¢7fn /{-ÌH“'šT°ãÐ*‚ÍClÀØU5qN6VH×¹9š›Áxy7ýžKìWƒ®ôgô)PJN¡£Ò/!³ $»øZN8*C }”ܘ8T/Q˜-¼ñ`÷,ל4“)*Ûû„‹B=Lßþ€Ž5ŽsãooA¼î×­ŸÎÌ“ƒa¬Há×5~_‹}ô×r¦‹úŸ"³”Ã;œ§½þH¯KîAâŠár#Zª/-.]Àç Õ.=zä`L#ø:³äF¦zõòP«/ž¬/"vsÜa Šñ¼$,´jlY`Ñó‚°º~«‰‰é50òQ¹Þ`˜¦‡–î“þ¶ \ž ¶­KLÌ|å¡Ò«‰b›>»PÁV¡UéwÁºXE«Škš>> óEAh¨Io’7®)~XJ¢~™öÃTãaÑ–9yrÚÓ2p’Jõ!Lw ð( „ŽG;Û뽎 ‚€? Ö|q´£$üYsUwJÔ}ž¨û¼DÝ=}ŠöŠÎÐþK­ÖþË¢mí7õ“>¯nš­«vØOã°RO ÂQÁ5(q@Ä‚ÔõÆ3ðƒ‚µ;}á3×—ŠC8>\Ýß3!Уâö÷VMô¨8„Ö‡f?lYA}.„ ÏR ,ô~vr¡ BïyᾉiY4ÚÓrp á( Ÿ„Óöº˜–¦I²œ—ýËP«íuAÈ41Wîpæü™/ÊCCç;8|S%¢BTÖ$à%Þ”âN`®šx‰Þ[ïñ‡9òìBEy]7Ø<*\«IùšŒºM‘ï®åb~ SÁ†Jð\é—EOÈ“£] Ðï‚u6÷÷vŸi•ùAÁÚ!äÝ煮Mn#Ûë’ÁØfÐ%ok«¿*JíBØ×z]RiиNò²KlgkK·µU´Vo·Ê`­Ìë£ÕSý㨌n¿(Üo>"¢Û¨ÉžRðõê ‹®ßõR'‰½Ø[‚ã©ÕöZ­É¢woÑÇëû~±&¹ìFÙD[¡¦Ûn£­AÁáuÆÝŒG­——ïŽV½TÏ‚+¨û^ïœRi$ÚÕ_„ Uèhµ‘üÔ»â=…è…aIÄÃrZo´\x~æiîL{Y”¶žý›®±cŠJ Ö~¹ùbw«‰¸bêYñq¡ÍLS)àBš"îR’aVtÔ»†ÉözTÈ×<À×Qᦴ^%Já– D´‚¥JÝUxׂǩNªâ‡…±m÷ùÎñI3¡Ã4žÕ„ÿþòÕÉ®¡  Ëã;Û»'†LŽŠÊ廇ºÖ ÕÁ&FPF‹eמ$k¯=)Š'þ™)‡óƒÂÒB 'Y8íiam±aè¯ÇI”h{]Žã§*|AرðüÆëQ4ßM´•;´)ríFYêpkáÂ3…ìF³} G-ÔF™<Ô²Š•(/ÃŽ§d[%Jr³4ÝQ“óqXX[ãýr‰¦w'`eFm#isË€½X[w"  ö¶¨N1l:©jOËÁ±w/ý²(.ãF»MC®=-:{á£9Dôá$c{]ô ³Á¦Þ½·p{íVØF¶ó›Z÷pf™ÛP¡ãrÚPeʶÁ·Ð6Èüf4xMÊ,°*R¶…+?DÍ=dñª,Äèf£ÂQx \£@Yèœ`Éd@Ó/ BõƒK¯ç÷›=Ê 4žæO‚÷MÔ. ®Á©˜¯ ïåk÷–\cñ”déÕ …¶÷åNgQ)ÍÆ¤Þ†‹NÕ’š07…W( ^âMÑÛöžG«‘°þ¸(¤0ê[AéÏËèÚmbÿH2¿ŠeHq" ‡½&Oƒœ]¨”\eS¼$Þ”—6wÑ?—nöo ÝŸþ¸èÏ °2íiaéÃNG¡„q‘Ë–PôÈ 9Uª¸¼EJ²Fê‹CB#Ò¹Ex‰—Eç!´uO{Z˜Â𥀜§¤1Žõ} ‘q+1âmGîMÇÈ·c.ºL‚Óž–ƒƒÕi8ø´ìi›‰Ó4ý²(ÆÜ²ª7òPŠhÒîH¢OF‘£´SEI¹Ùîhp Á1»Øh-±F·)7S~{–Â¥¹°ä}UâM9ÍD»v Kãù(°šh8`“ƒ5Óê/]¦„œŽÞ_È&Ärù¸(†§¡”„ tÚ.  /µG¢Hq Ø`¡-Ið`Ú‹ô0œù¦TïÒÝ*ÙKG¢;¬@j?Û‹¶kn½~mØáƒòö4 0‰7åíjìðä›oì@m¯Ë®Œ Q\ü–;D<Ó½Ux‘âw¸¿Öš(2ú=Ö°¸ÄÝµ—ºÛ½Vº¬Rw¸7H4’Udl÷‰öŠU¸ã=B²Íœbw»OH4”Sê.÷ YD%Yæ®÷ 9ä0Un÷ ÃÚK–ës°½a PÎ6®¯ÔœeÕ¨–¼|¥æ¬8«ÎÊcgåiåSœ{Ðuf#ŒIëÍa¿ø„Oh!ë5²w³ƒ+7zï,ÿðvàê="#u·N‰_Ó?3éò;Î]çTÃT>9úŒÕEšÅE Ú³}ð'[Âôf\w®òix>6û>ì¨ô´"– WDêúA—3†P.…ˆæÂ î0e\™ðÑA „è “@`Ý+‘P@d…}¥¨WDèKŠÆÌ-0:K©"Þñ„ĉä1\39 ãÔ‘¼Gdî58ìk`]û=ø¨.¯<­½ƒÆ§u{fÁ9s£KÚž0iÎ)uÃnóÝ;#%BÏûs@ì¦ØßêážÁ6Þï}€ÜÜ9‘“ñpôÛk;vù@z`ßÁzôo—sÚˆn§Ë&à@Ø$ .uÉ®8¦¼ ˆ‡]½¡#’r@ßÄ¥‘bð°¹­žöN)Á'vv¯ßÓ„`. §ölçÅî>l6¾†¨º§½³ªó©æü]µ£oÜòŒ2^»´‹[½OgZæk½IìIœ9\ã ÒÎ E·jÎÏrŸ/¡P°R‡ ˜3O±˜*ð2â|_æ¹Å²XTE?®ò¾‹Ã'“ˆ‡ž¥>¿ôÝ·3ßá{Hü«¥š^M@ ËZ+€2”Ì5µi¥q^áéc2Á©mGÍ51Ûò»¬>^ô< .-§öà­¬Ò¨ýíÛæ·œšä;9¶Ï»›C•gý•IJëŽ$8Æxî4"^_1¨Æ;œ^Ü¡8ÃjrOg–^/IO¬X<Ð×ï8-±Hš§àa¶4}Ê´L¸2ã%¥ÐѦÃÌ–;ê°ôìºrªª/ߪoN3~ø­Så̻ģê9vÅtèŒ+pâœÄÖé Å+ÜÛñ.ó_«\V¢¥?–ŽßT)з€ïÕ·¥J·r/ÞüñíÛùo—–*ë° Šžð-Õâ1Vk3ð¾ïÐÊzÐ!§³õÓ¿Vžüxúét®ŽéàW° à_·o@ÈÆCß-]`«,që3ð(€WØ|P9ãÆÖ‡V5°Ã²Qête{•ߣÕ\àúŒ{±:J/¸@>SXM$¦‚“\­¾]Bªµ±â—N¨ø ª¤0À²ð)ôÁ@¥Ñ‡ñ#‹brèHž}ïM9žsŽ›~Ôný € XøÌ^ZlqbfágnjѯåÐjíçÄ0 ^bé¢*yèð߯ül>凔©äc‡u–VäbÑìÊm]ÂìônMb/9ŒGί”“àʽÒZ¿GºNæNQ”£“#’Ü›ÈÖ…Pdf–³~Í¡t8óÿøDâáÿðÿq@îïùRDä¶p–é- uÕzu®3º°Èn[ˆ—¨Ÿè‰¬s­°C 1W+ê,d¾@`Yé–Ñ€2tuC”=‰8³œÔ¤`è=4’u 8TªÙG3˜ß§TŒæ N”{L¬h]g?ta}5 }ß8oç© ô­A"Á"ˆôu?èù _?US¸O.ø‘œHõHN¦|ðÇúԌꗨZ éð¬yûÞi@k ¦*h·)Ñ(Á¡/¶Ã)ôð\2ƲÀj¢—~Ð÷8…i·v½žLCŒM’ޅɺ0ž‡íAË‹Wt ï>ªIDÎjjG%ÉónüHõ†GF)–=7BUÓ¥¦Ù&m`‡ÆWž™—¬;Î~?f¯—bÁEðÕÜæÜïX¯:¾YâɘgLî+Ô¦1Ž,8Û"s”Ûë¹”¬›r¤È%†ƒóP¢â )pÇï]û0ƒ‡8=}Ôë‰h\påõ)1ê^oëŽs(i ÝLÉ%€¼k"ª`7¡FÉ@Øk7{^ãLD¾ÇÒß¾13“ÏÇ̸Æ:~g°Ø@Á€÷†“ qü Òùˆþò¶À¯L?æ;Ï+md€Ï‘ª2“~“‰EPÎé,·&º\­ÎÎξùcvîíüÜéSIʦ¸tuW@D¨ž®VO+Ûò—sú¸ºÔÍ¦Ъ¬bèã${Å—x$Ut+”³·_¶—6Ðkú †¬*S{P–>Ìuhå‹jfZù“Ö·3î›5•rFBhCyå´R]º(&f”)L!a{ÎÙÎ>¡tÚ'”¦YFêd)4GϾ×ÖkŸÌ¾ýx:3·ähâÅ)˺Táö.@¦pH¦@æ~ƒèà4 áGUÉÜC#Ô€À÷«ÌÝ!XOãf¯ÓUoϜչdm‚÷Iu ß,àûUèÙ,tâÖ`²Ó ç‡u2ÂLK>4|#~Ê~Ì9‹ÎФšlªd˜G1cV ú„XÑè8â3ÌÃÉ©Wâd×¢+U^–ê‚èí¡hÀÙ_¨JàÝô“ÓõÈ9q[zÄÓF<ÞáÐm®£²þ^ Ó_÷nƒ¼÷ªÛñqaCw¹@Ü›”T¬y|ðêhkgAÜm2À" 3âQCëÃ#$äû'ºè¢õ±Êô$¾i{-Ô÷ÂÍÐ0£¯’ch`.BøVeE¡=]š‡©s'Ë‹¹ƒ¥Ÿ_’ÆbÆI>¡È, |º³|æ•}ÄÅ\–ôcçdåá^©THÉÌI«Ž³þÜ1/}õ_’,x}ËIÞIW+œþOð<}÷"qOøÚ~ýÍó_ö¶ÞRšPŠû#Þn%ôƒßkõ±hÎÛùõù9*¿¾7ts} d^Kce¾†o–kh„ùvqNŒ ±¸¾?žWEýuñ <§ÞcTù‚ðÕÜ}~ܘ?ð¿®‹ì‹7r6Äó­¼–Dž’M¥!æ‡ÉÙÓ°GýŠÂA¯…Åã«|d8éÝA?âÈb‘Ι&†Ÿðsi_á8<çXHﵩ ó2xäìÉ»NÜ唹öÜïE–‹Úleþzê2ßà~`fÅý ŒùÌ‹K÷Ä9"6žúÍ…ÄýØ™çl/Fý[¤9JÞóhä5óŠÎ»u޾ÛâœiŒMó&gŸ¼ƒ-­™Jöx €ÅÖ%è»ïäœÏEEÄÙ–Ž¦+꺈^IÃrÑdJŠs ¾©r}“ñž'óðžç¥àÝØÐA&s¬j¸$óԻÌá3µ¾¹xåSÞHàÈqHä?óN‘ìš$ý±½FHP÷ê «Ö°x!1“æÐe/ì¢ÒFÞÀÁD7báäŸöº¨ÿ–æcÐq^è)í A^Î/±až²d¤!6jq%ÒëÔÞáºi“9ß;}üãÍëÀÉü¸}\ßœµÊ7ïjq£½^“áÐ / æ|Ûpn5y-Ý'Uº=“x)¦¿Œ4£8uë3¹h“xA¸(°èÓzlê÷s‘¦jÛ ®m|bzâ‹Iß÷ýPÚÿxlš‡KëÒEãZÉÐò†°Ö§Ìy‰Å €2÷±91B¬ñhV$›þIþüéGþ8w¤Ž•(¢×&³#1múHΚóQÖWˆdgùÝÇ·Ä«_Ã]!›³@O‚Ô Í„ÙêüHë‹ëÔõu ³¦*†É,)Bñ_®2T˜Ä £Q‰T>m#W=Š~§¾aÈ⢣¡#*š·›nÏy­=_wj¯QìzóÇÒ[½–è þ7¿4?SsN?B׿±ÔXZ™ Š )’ âtŽÞÖõ+mÕQ²ÐPQ˺ô‡ÖåÓ¥S­Óð}fé/¢É ¢‘b‘¾ÿ‰ŸðUÆJÜÿú|áâÏ IÛu!ÿ¬½cQ%ñE…í†À2+ivyuéèÅbu”UqÄÁúœÀ€f48Çx¢Äà„]U ï®uã© =ŠˆDF¹&„¥ÄI#r‹H yZÇÃôíÇ4ô¯¬ÖëU–€ƒ5ÍZf Ðu¡)Kv/Ý ¨ µ»ôælvþãR½þñÈó’èA¼+`y‹V«s%§„ȃõ­­•¥x;â7Ú–h“|E©n÷º-ß%Ÿ›ã®<¢ùDm×µÛk£¸Ì’æƒ{»^ItÃì—è¬@–y{sÈâ%¤Û,™ÑQïºä5¹JCýFÐâ™md19d­( Œ§‡Péä?ÖÅWêʦd‘l%Û]7gfÃÖ)þÌꇘ¹²(w`2?d´j™KkO†ÍŽY7’–´Nꤕ2+&º’%W<ÇÝýˆ¶©&Ò3Ucw¤Ù½=®!øds¡¦(ÔP¥ålêïl£7ÊÇÒÕËnï53â‹êøÓny‰ÛVplmKXqÛ£›Ã+ƒf´ßë¸ää$îÈØÌ=C¶Ûw1?,Í‚.¦’ùñóÝ×/wÖåUPë=ȃ’ýå;Â6š•y×έç›Å «õµe¾”ˆá6±vcÃI<þOBÆùŸ3)Aè㌷+¦ôÿóíèÿ.UTÐÞDqñT6Tˆ¿«Wñ±Ç¯ãßFcz‘ø·%YÌ|¦Šš#”¿ HfýIªÁtQý©*.ŽE.%~¨—âÜâ—⿜±ìâJUj€Û:ù%l:­Æ‚ $¾xM¤Ú,m¶ó³|ŒGÚÈbk¥b\s'»=c!øÂ6ø/Dìpß§×–DNŸ¸óP²únCS‘smáŽ`‡Ç׸Hú½>ß@ÈRb··ðk £ž1ñí· çÜëáM6’< ¤¦súNë*FÜD›:<€‡PŽýxYÞA+¶ˆ=O(íDÂgÔ½ô Ï8˜O¶®LhRt—:H<¢P»k…êÛZ.Á³j¯kÑ“ãCDü:–ï†Ú´åîæC×Iñä|+#žQ(ÊË®x—æÓZ6`’cíúåP°¢ÔÞ×-†jir!ìcµVìzygÍ–Ô ¶ýsc=,mýœaÌXJScNxÙºtƒ‹ì ‘YXjL5“Ï$F‰Ç:RÅCÑzZùæn“GZ[Õ‘iàC©U_Löú h^uQè'¢ñÕ:©ŒLÅz¥é^5ÝÞEC›^|õÝ«.°-ƒ ö~Ð|ʵ,p”©Ó£,OžhÏGñu=ÖF“]–òdW“yGZÖ™Äcç{gå“p’å…"ßC,I Ù0 YZ¡«Þ%ºêya…n¢†M¡k)’ ¢ˆB7À©Ð]¢u\¼L®~E¸Z¯oÍ• UÞ×·5*0AÅR…è–vw—ªä úgÜO›ƒ~ˆ{Ïá €¼Ô•Øé›TÅ@|È«É pÒËù©'1HFé±ð|+Ùí¸·Näž{dfBnß=½Ä8âHm¯Á¾ð v‰œvåØ S 8_¹*£Š›¤õp¬"–¶ ]Ñ% pÀWxS/îéA2%#ò—Ï…¡:^­ºlšƒÝ¤Mž«ËxVR^+Ÿ´+uý»èáe×zÍ¥INŒFíÃY%çǾ°ðqZb¿.Ô¥¨´6ƈ‡ä+Ï Ø_¾Í’o˜:á[ï [}ì"ì_Y»î5ZOQì|ÄE/pŽ8´–ÞÀãe1^²qG³ö›vÓ H"{ñ¢çukÒ4Š-Ø‚^˜ù cÝh C¶,v{!Z3 (t/¡õ”Æm£Ê-ð®"†‡ »8éTš:ƒÑ ÏBkwØ _²Ø‹0l;ž“¾îlî¾fºKr%·†B–ËØÒêò“y «8Ì6`¶ô^½Dãdž{x³ÞÆIBî¹ï²VÒž›ÎÌl 9ÏѪ·*œŒ@²A ¾u`B¤•y;x·t|‰–Û‚ZâÔ 3³<æ9aCå÷ˆ–¢ËoXïCˆÒ1RÞkniÅ¢2”—£eà`Ý.;$Y@­HJ!@5‚Êe8sÙ±H¸ÅqÃ’8â5ED^.Ò®LH׎ògnoKèÓę̂ ÃÝ%›DCîø ú©JãdJ „[:>ºNU_ÑRZàCì5b»¶G9„”f òôÖ&ŽfÏ%hØÒŒñ €ÚÍ&¬6% &†YKäšJ”¶“øÂ$„݃Ƌ ßÒÖ¡92v21AZÜQpƒGN{puu[#FK9Ôćdžµ8OÀKc¹;Çc0¥bÕ 4R}æEË >&6q:¿`“Õ¿(ŒØ'~K‘[ª3G/ÓêŒ(r 9ŠK•£¸°B ©2Ui7%âcc,lççŸõ¾uf(ºuå‘fݧ’6Ð 03,â8³2,Úœ##¡A½=^çÚâK” œKàw³øA;$•oõ`ÎÜR´sVþ|‡áwöNvÖ‡Fše·…Ú¯}ø„gȼFýuÅÂvúxCTØQí°~@vfÉð®ªíˆhŠ‹Êò"t) 4zøäÀ|wÏ~öó€òõÿã_¼¾rÁYùé§5òƒ »·=ºÂšÙluyå‰ó¼(xž÷¯Ÿ£O…Zpvƒ–rCÄ1`ÁHÜ@e­nÊË1›º·ìÍpD%ö¡öØ5úyýÛ æÃ? ü5_îmý²¹²ùlwo÷äw”)žïžìï;ÏŽœMçpóèdwëÕÞæ‘søêèðàx‡¦ëÅþ+µŒé.Þ†ŠÄ«ê£yájõ`§,¡h¶ýstŸ…GÄ1‹‹úÞU$…(„ÏèÕqg¿͵¼C»€4‰O¢Kâ›9ÚXælnþÞi‘ó¡ ÑŠ¹Ã&gÞ>ö¼'vüú²9h: *ê`€zŠ%L-½›–×å`õáž/àÖ‡„6-1šâÀ€žQ3ô¦¼è¹W¸  U4|Š\A]\sm%hâÑÛZø1ðxžADºòô>Pçiò©„ Œ4.ï!±¢ sû²[< $ˆÕ–ææ—aWÚ‚¥–Û€ŸX™€ûg÷ä—ƒW'Îæþïx§qÈøû†"£„¨i¸'õ ¡GPyôuˆö#?õ(ÍH€wüm¯ïúˆ‡ü;Lް!¸ÏgcÜ„ÃÑ£…‘«ÐÏ©ƒ&+°;h‹ÿý²ßï®/-]__×/‚A=ì],uF´ôsböÕƒÚ6}÷âÂk+¢êòÉ%È‹™Ô$;Ö+î…šQ£†ATkL¯Y–añhFdÀZ3íÕ àÐjëÎéÌ_pnÿ~ÜÜÛ}v´yô{oü…’óRÒ…G9ìú (²<«kðÝot[ÕóøZ }ûêWOè0AÈ?*ä5¤R¬Ï?ÅËž÷Á×ßÊß”"м«3ÌN }ó¸ 7)ròÞ^æMY ¨œøŽ…8n=p-] ÈA¥Åw+€X³CräÇÁ !ðñÜá[z1|Îm¦#ÌǹRàB©¢‚ •>·]šu^¬W0 ;ûÉoöö‘²^¡I-.ù«Pxd—ÝöñQSB0ÌGq_²þh#ä:Äßé1?à¡|FŒÙ:£–¤ýàâ‘D@U„¡m—gLŽ²â“ 4„@_Çœ*<¹;Û0¢Í5`ºH÷CˆQR[èªô‰S…ó &Å#Àu˜]™Sì>:¼ÛY¯¼†>4ª*hó Õ¯—–ªÜ?RΤPÐG=L&v¡¾á±î;G;¬¨õzuN뫊@å> "`‚*ü\~~v¼½ˆíåñ¢4>î½4iæ¡ÞþKª´ÿRß› Q˜ dÞ°>&Àn¿‡ncúª‚_`­tçÆ¿\‰˜;Ì´iIð FànÂK$±ê‡F‰+asXg6{W´ Õ°:W¯ ¹é“‘(Åz;t[Bwu±ªwãQUþÄz±VÝ;2ÖÒFè BVµŽ!è+ ˜¾aåþ °ã/‡½A p;cJ*-óó¨ ²Wáê0ÿ˜¸GV Ž¢ô¨'ïêP÷”6¿uÇûa“6]ðœ6DbÝäó,ÀŒÖ%ZÆi`é±€5ž#Ø—œZˆ”Wú¥…T±õãs…DkA{Å™Q·&*¢öl/˜!¤2H¬5ÛQéÆÙ`EÍÜGÔ†ùˆ¢á‚8Éÿ¯âUrõB 8JS˜4(Ù>£8¶V˜×0o6‘º‰šMàÕ£ ~´…Q:nO°ªö|d¹ ÊBCÅJ#Æ'r¨t±p´1LìÌ¥œólX?¸T‘Ñóì:2?Z×õ{¶Á™Ñ†Î‚QzÄ^0ÄW"nÅÄðÚ^{hÿ´Ìm庪UÔåoÁbÅaîë=œÖ†þ˜¸TL_ ,ˆ“ý¼ÔEíáÓ™ý—õtJ9‚žz*»‡–ž"n²"$´4Ëy½€»‰Ë¢,>ÇcßAqpŽY‚'·•™ø{â¼Q\ºëœù _¸ë¨²žO›!ý±1ÇBÅß$»­Œ^ã8ÝB*–QÇó »þD¯Ç)hJTÙµh9ϼ „Oú:~áà}¹ùbw«¹õ$õ•˜£AÔg3 ¤»²zÉ!ÑhÙöxÕO‚ãþ9êÝH»a&ã£âÆš&1“¿; ‡'AµÛÎöo›GÏ9¾<ó¸o¤¬n9LjÀ2ë0Ä4›T:¼Eð¹Œ(údãBÞÀ¯}<‡%”êºÔæ>' a¢ADà Bê´ÛKxÀ뜳 Æ ŽòÛº\<`dó“pÔüÈyˆ´ö ôó:+Ëõ'u™÷0†»ö„äíÈMË*. +€x$¬ð§¦ÛšŠt½zD’–aQðdê·Ü4ñÕT(|6¶ºÊ@ tÎñ€«˜BÉÅØ²tQ{¶ðS&>Dk›È“áäbBù‘¦Ë]zÝÃ@=Õ‘t¢Ò9¤®ô™=E¥a='¯"õ*û5§îA:=;û›/w, ?e_㌓©‚¢ì‚4ÆGg~lDggi-‘(ŠÐ˜C¯wåG„¼dJ*g={*t³Ä‰¦ÔÐÖĤԎõEœ©S-¥)‘UrJIMYð•¨4¤‹´e—´RÒ çõ#¶éšDP£aâeS׳ úÍWÈq¨GÕq݈½§ôÛ2âëyϽ `.ìÃ#9òÅ/» ¯ƒºž/VoŽÌoM ºãâT¢±j- TÆQ|!®ÒÏļ¡D¸H4‹UÄ:u0)h=3?¢ä8­/‰<“ 1̲w[qsy Y?Ùíø-à,÷_dLÒWF&Ó(:Õ†_Ù:`)¦/b»Rk€”I]ÿÕ+ü°)ž¨~l© EèD¢ HÀ7%ÀÐ3;,¾O"F†¨c»tq ekD»ŸÚÒ˜ð;^X=1²Ò Èãz*i¯ âr›³*Uƒ½Ç—{Ûš®J¨·8û&)¬ÃXç u´¼ÈTYû­§ìÔßeÒî]•Lö©Æ®?w ÀÚÜ BêÜoiš¡×‘Ðg“õ;òÎ[>ø‡ÈtÜ‚u{Á ¡-]D¢!jÊÃósGd|vÎAðcã•J"´s“EÓ@DF1Œeèž8<‹´ã‘ÔL)¥»"˳½¡.ã˜XÝ® ûð÷j4ÂøKŸ“zåºcwݱÎ01„‹¬ÓÔ]ªS>S‘½:»“ñ^ØÆ+25üÈ¿túnà…ƒ¨s«L˜[$o-†òÂë=¶&§’dÛ¯vÑ<±Ó2'zØÅ53Ö€$FòXñÔÞNÛØ/†-„lÉ Óºz )©‹Ûúey“ÐSÌ©¨—¼A·–±®÷xÐŽwƒ\%“¨¨ž™G\ˆPö—Ö&T{ó:Eð°®,À 鹞•¢œoìï ²¾¹[aWXDîómEªu{âsƒtoôððò•%’f¦*NQ7ã­Œ>Ö¥›%ÎNéôbåsó!Û;’””³(yª­7¨·%ŲQH{žÛª:ªX ¶rS£Sª“Z>gj^ûmÉì¬ItPãA W„~xÄ@o¥ãŸ1Á Ùá‹)í·¼nÒ¬v£5b Êá]×´ŸqÓ}I%×îm$?Qx_Ûc›Ÿ4õÉ6—)~ë:úÔsê´<å(ÑÏ¥ q¦|¸…ñv—eO³)²+—ÌŒhÆx–j‚ÇHº©)ä #uXâ™Á²¨„BqÛQifåʪeœFÖ" Êy| i÷´9±¢L§²YÖ&€êOJÜò ;"óf7}­+äPÅ ¤sy¡â]­o`aá‘x ‘Nj(éîW©ø…í¸’ HèŠóv'z¡Éš’ G¦HxÉÊ;±%}6XãtâŠÈ)uIã.¤3O.±µ2¡¸g饼è !DaöˆV4UÄ|& èÕU=£B+’Rw!Ì„“=@ § ÉKX8ÆélwîkúBûKie¿³¿²±N_ºXM<«%<Á [ýç¯ö·NvöáôÜ<ÚÙ&·õÕÑFõN=v¼àƒß º"•Å‚ÌlI- .]á²Íçàœ¼D£«ð½§õDèß6ÐoÛ€ŸðÜ6ÞaöæyÍç˜'UNd"ID…]“9Œøàù¢%å­Lq d¸‘ÏCi*qÂe À älÿï‹ÃCçÂë³³5óç2Ü›'\ù7ðtëhiï9í´½ç‹>ˆ]`kúKk¢),%¡µÆDW7}2X@O6•íÜJ烈! ù'à2}õML=÷U , 2»Ãv®/oI:iƒvÌÂ"¡†ÿù‘k3bÄž¥ª‰i2ÞÇά ü'ßIŸxŽ põÁ| _C_A¨úa¥¢k­ E´”/qO´.a®œïoTÁJ¦Ë}ha³$»v²ùBlÈugëõëÒ—•MQéî–)çÒR¶4þ‹K ¹Ô奬TòSÅd/1Õ &u‘™Xù1\ffÎÍX.4%ôI_jÊv¦q±™ÝÖý^nf®äx/83›™Â%grê§qÑ©Æ;µËÎd‹÷~á9ì(wéIÐJ\|m}r—ŸÔtá Ð$vÞñT‚»‡‹ÐtÓã¹ 5á>Ü QËJN÷RTvà¡\ŒN·?ŸñåhþDMñ‚4¿#÷wIšÕ¯Ïî¢41i^–&ÉÓ4.L³ÖmŒ—¦MMïÅ©êüd/O­ÍÜå5ÅúLúuHƒw¸HUs3¶ËÔ„,< U!ïñRU Ñ÷{±JÝ(p¹ÊåÒ¬z}ó’µi(ÁÊE«ìUò²5©½‹õéœx@åœpÉ´ñ˜»¾Rù;Pc¹,³ŽÁËVÇsÂíˆtÆÚor„™fŒôcNÃYfµf2+•q° º¨ÄqYÄf‰ÔQoFxµ># ¢C$Ré„ ’- ‡eˆÁ ñ€YqÞ_´}Iðà±}鋊'wo B»8<Õ]-]yàÅ´”ƒõ âc ›À#sUaó èâ%±°ÔÏ#ʉ ³MW£”ûc~qê>Þ÷‹‹¨ÝœYdåì"…6¢SNf©p& ŽÊÞiæè vЩ¨'×üà$º`RÞž÷®ÚDvSJô¡ÖQ®&’|à[ï"NôaÄfP͈ÌZSYÑüU’LN$î—µyq>Ódþ4~‰‹+í‘ö=þª¾É/â“?æ§*œlF\0kiÌ'z—|ø ?S}4Šè?´ïñWõÍÕP²“‹¼’ñ·’%DJæ ïâ¯ê›ü">““£§žVEÓ?´ïñWõ-=k_'¿ªoò‹øäd7Em®h8ýCûUßäËŒgì×D9Uφ÷2=?M&ŽçäRt[–jKµSñ¯V[º¨¾sÒ’[ásÍNœªSÐkUÃþDXP™ÙdJ8ÅK‚Ñ2Ê[k\¢8ÈßV¨@L1#í "EÉÏÔJÌð§‘QÍÐg'NÑm!U5ÔjºD•çâogé¸Õr&N`f´'ad6'#×[æ?ët@^ ’ʵÛC1x¸ N¬¨ç%‰ˆ)¢àÌñ«ÅE‘mŠ":lÅaöÁRÍîSÎlâ »”«¢{Ý~4¬œvÖÑQ´Ió|#òÃãD߬É/D¢m> QÔèÇE  «ñ"Ž=~H|„÷Á“Ù 0¼xÄ<è°Š!ßÇàé¨vÕˆT6'> ÛˆDú–T'“0û‡™È"@úF£¡šgyÜ•œYš c®šH€84$Àç>=%Ú;„Õ úMØ­íH%Ö@¾ÿºå,^Ãg¿Ç¢BE'9üÒwϪï*ä…'ßxl‹jlW”ÇŒ$ì3Ï èrmÏ?a-Ñ9¹z2Ïî¥ã Tj'7âêñÏè#s/úβÔ=ÞN ­óhß6Ãê …¡>#+BµÄʽKi˜/Á{^ènC_D|€êý«n•Þ÷®š2ƒwÆò¡‚TùZýM Éß¾Y$Oƒ¿ÕLt@x©*´ e@¾qÞÂÿçÿf‚L”UY@ëó껵B„¦Ù˜ÈÏÿz÷B/Ì&>éªÝŽÛ}Ƈðä`þb´ýô?7 Ѥqú®©Z¬F¬ïè];}·áœÂ9£ýûYt![¢áéÌéLÜŒ³èýé,+ú›Ik’Ñ3n!¶C^"½s³r¢gùÿ2aŸû% äÃfµi Õ Éí\dž#D¼h%‰ìüº¹ÂøŽV3ЬÆEgy,v ºÍP£r4Û98©,ý¡ÎDâõ¥…¥?ÞüñÍ[ü~¡‹`´ôGL[—šÍ&O>Š~¸-àÁRåBg"4-ñz‹c€G½Óº¼wÙVe†@ïï·-0£Ï‚µ’?D˜¶‚ðÈÙìâ%5Ó, ÕjÉñwpv •ÇíJ5ã\b䱽Å[©&à¬ÚápÙl8«I8³á¬æÀy\Ïš V‚‹)~B:Še´O q ÃZY1|Ç2'p˜Õ`V‡ƒy\ NŸ§ `Öê&[J25¦ôRýM÷û‚³,Öp&S2­;A{ ,+1¬•ÿ÷ßó¯µèö¼hq¥¾²Z_^ÂïÍ&†Ó'‚So¥eø·öä ~®üðtYÿÄOVW—ÿßÊêÚÓ'+ËOx åV¯<~òÿœÏj"Å`Ôçgò¯²4¯å6^ùé§¥mÝK7Š@¢ á|äìQßï£N6Ù 0*AØ /Pµ4ÿ×ÃsÜîJ§º R³I"i.Ö“)‡é='‡-RZ°ænÞ‚[tÂïb67?°ö¹çItúóÊ¢$ÓåTÐí8”»{†Æ--9N¬ bßâ.±©h %¤8Õ= ɋҔXêR1L>V¸6¢]"Ô4†·7Ô×’¤¼¬ïÖOêÒ*YX>be·.Ù>ÝjÃÄPå–ß¿Åö¥-û Æy9Þ¼1ÕR~“rÎY¿a ìnÏG¸j4¸º²;¬[ BtóæKF‘œævÐ:GØVºŒÁ-P—sÕʆ«‰ùrɾN­WÕEs¨*ÖTùƒoº”0£Ù'2cï–àŒÒv•¨ +0:—Õä |”(„xmyóð“3!Ø2·(Tå&Lƒ 8'èðÉ.)({å²g ­ž#äÞ$œ*ɘý¯ÈÝÄ9à…÷‚ó¯JÛ€ SÊè#ò §–Ïá ädád“‰µz0qX Iã3jݤìºßúÝG0×Â5¥tƒP>#ÿ?„=݆ÒÛ<¾c¼ÄÇó¢ àê¿t¯âÒ>‡ýÐ aZqV¹³€®”CŒ šÜøraÿÕÞÝ”Í%9@ÌYV¶8,_fë¤8¥5GÀŒ+0„äDÌ>ßÝÛqæÏ» è+Ôsæ±4š'üÇköÕp80 €5€§¨®…Âós4Wk8ËÚÃŽ)0¬Ô,¬Ñ !±­Í_RyNo¸OW4“³+«?ÎI]8VþËÄÑ[zy¬oí7wö^î¼ÜÐ`ÑÔ7€ÁO?U„ùÂìÆ†Ù2NÅÙmŸ³´¸mщ›æà?ý0òg°E1¼¹ŠÞ©s GÁû^”XÐá-8çݹT¯gÅT} s5çü¤ïugöœÔÀ³XñÀhQÖŃçrˆ0©ÐQä{Œ`OÌ^sG¯æÞ`µEgå-®Aí4¨Åýú«‹Ê©Â¼žòGtQ¤ö]->-¸lz¡üÝÑfqeN SÖjFÄlŠ]ÄËI¡WGŒåŒrQÄž›eLUmÌ;«&âp-û` îµ>P“ˆ¬úãlÄ‹'CTwˆ—ó gU¢¥ ïøÕÖÖÎññH³ÿïë¿ûæÿR£¹ñ˜˜ÿaüÿÊê“Õµ'ÀÿçÿtuíñêcàÿWŸ>ùÊÿ.ü¿VvkÎY‰nquye m»ïuœcà.Ï<4Ôþ*-|•¨´pÞöÎ_6Ý¡ì?¯všÐRÝøý=º–~X¿ü¹òUKçFý“]ø¯¹»Ÿ¨xÈ«ö—ü`HÍ“­ÃŒªýV7»îö³t­öYFùÍ£ÃM_¶s”¨æöºîå.óz\ms´Uõ²:ôÖÁËÃÍ“œšl»§uÓ\“£ÝýÇÉ •QÆØpÕv¶Nö,ëæ‡­~']¦ï7à@RÅAR3:F›¿U„ýCïÔ³óVÀЇ˜í`dI´ÂÑ~ˆuï÷n›ä¹5‹¿€ƒWÀʼnä¤Äž‚€:ͶÛwg †C€‹OàÒÛ¸œyáVØŽ*9·I¼eÂÖ{¯"ެ³à°Ó‰’h]2ÃIt†ä­‚}¡²CºböDÔ(Ü‘A»Ûû=Ê0wïË]ºDÚ Z¼L@%ÛÍ?ÞÀËè.5Y„mÒ'VÈ£€M’ÏÌe$ š5ÃG"õÂ÷^€–<û¡e€¬¼Á,Þ²D×^/cƒ ò/Э’…xe§¼.ª¤¸ô¬óþkus«ï5t¬ÁƒHø½ëzo.zï#†!œü%ìÝ:óô‘Ýb¢k‰ÆLe;¾ÆrG‡=¡„r´…h æ·Éý"ÇPI“ýWàFŒªÔp_G¼ÐΦŸÄÇ?I–ÇÒ"Òå –µº«ª#ÎZšéÏge§a`ø:쪑Ð0ù©ë&VT¦Þm‰õäÖÉÿ6k@Æ҉P@¤÷„ÅG.лq)¢™éj Ó‡.z¦¦_µ²ÍZ°ÈÚ­d9j€L%Z‘ÓÀ”Î׋?÷?ž·œEî‡ü='T³Tögg™•0b$+¨ñ¹EM%u=ÍY×#kü=Qc™j€—ìŒlT«‰5ÂÎ9ZíŒrÖ’†£Í ¢yAÎ[‹RÂ¥ˆš—Z:9²ArhôàgTÞ¡ªc+@i3çÌFDÃ6ðÛ•’vzt5ØöØ:.ìE±î¿–½\¨Æ×0žªj´,¸.Gâh’爠ç°$l¤/È:÷ð •^âÒ i¡õZÆÅQîSuusz…q 8€Ô/‡‹¯^Ë\-º¥çÎÎæ‹ÍÝ}ƒ@v~;xµ·ýl¦¶NËMÊ¡+7€ëÂzÄË~¿»¾„6¡½¨×Z©ÛI·³õËn½^-Ÿüóx©uá/žùÁÔ]½ì_uþ5ñ<@X¥AÔ[¢xAX†ÊÕÿµ„ÒX}U'Ë™r7Lþ#˜·oeLL­ïhÞ?§Vñ”V÷=Ÿb·éÅx!æAÔRº µ×>÷ÍÊfùRG¨24(q íázŸÇYÙÐT!ŽÙCì´øöm#0½Î„™¸äY–Û÷œTz'[‡ã0FÒÂÔÌÞ!~ˆÀCI‰É!™¸íà!@Ê>m×Ï™@\ÕSggÕGÞ‹V¤¬x¨§6¡bC ì8FØCcºyü?´÷~øxyøƒS}z+tl» ¯?¹ŽŸu䄾Us€X1+áUj’Æ3B£ê¨œFM’3Ƈ u+íÓ-«ãÇ+Öeñ瀇Áãï¿7/­69ÂQt.FY'p•)Ì…”À»‰WÏ/CØ‹—E>Õ.Z̆óêŽèÍÿ­q¹ÊþóoÏ?~täƒX µÌ‘LC ·¶ø³/¹Šœ;bXŠøpÖ®rq‰žo7wwNfÓ}Ðeí:^‡oÞà¢Îׄn…øàɃi뻪Àä€NøÙÖ0Y¤KBfyòF€GBùß+¾«†â!Çç5 XÎ)àUßíP@,YF*pе§ƒiS@°k7賨‚4éªÅïûA7.Þµè ¿ºFÓ–ž‡·ñ‘‡r:áÀ– A¦\>†}ÁÈFèêùkœ`=׉n£¾w%b¬‘ý6åý s#1€ußÚ;²êº•Áîr‹ÓhÏ……±zW‘nv Û@Ð~¤žø¿áHäè%èlhT¼ìÁ÷ß[ ˆfábÓê:ðfq6ôx‡Ãœ‡adÎ4Ÿ ðî hXx>«Ã9Ã4XÍ" CÏѲIˆ¨¢O”- Ù“+ ’&"㚢d¯ÄHßoëÐ#Ê„ Ö™ÌÅPp’6²ë±õŒ*­¬k£?ø¤ýâ3§Æ!Ù+þA³ òHsa\Û|P‚s¼.¢ ¥þÈš ¢À1+Fôõèhÿ`n.uèjÖX³Šz”ë¹äø“,AÇ$ʲΞ©M¼{În10áò7¤hÇ_”Ï(è''Cé¯÷Žgb.mb£9̧PwËE"æš;jÃAC<îh¬vÌC¢cY¸«O@$Ñ ¢å·®¾‘ Ê¥Ö<úºæ¢w‘}Í…òˆw ®¸ >F½‰87®Â^Š4øxmÕãz’U¾‡ (“ÑÍçdmŒ°•=ÓºEŒüîsVµJZXT™h®ìÓj›„3æÀâ"‹vÚj2Š š¯JƦi¢%§1rÇ”Ó^P‚J•›31z#lRµÍ†ûŠÂhî4·6÷öžmný3FRÛ^_Y up’§ý³Ï!jÙŒPgú¸i`…ðU|Þsp,Þ‹Ì÷u°«o"ÃóS%þk0­Æì ¢W­ÐF²™zZ ÄkªøO±7-Ä Y#Š…XaÌŠÊsGÌÙåHúì so‘øŽ#k+[fŠ êÀÖ¢Û4[ÿ ›“³†Ó^ÂSbñ=^ÂnSrªJ… *{Dr¨øñÄP>”(êJœ°ˆ¡r£œEÅ˲B¥ìS)™RU§H)€•(UÆ PJ Q—ÄF(M)RVX ´H‘†˜ZH Ì"u@¥J5݆€^ˆÐ3ŒèŽ«¹š)`ýÆê;œ©[¯¯\etR š•Y]gC+ÊÿŽwÞW¾6Àìøý¹ºQpÉÀ$Á´biÛ³RCDÏ븳¬:‹uRü°`‡…øaQ(Áâ E2°ñÇ“g3ÐoYQTÊEƒï·×i¨c8£Ÿw^;뼬;ζGž¿dÐjþ›—%E¦˜Äy,Ëtd×Su“3‰ ؆eFÞ,¿uþþwçÇÔb|´^y»‘ӌ觩ùH÷#µ”†æ24—šã’(¢NT\œ3düPmç-wM¦"²v°}°.ÑûQ®^\ŒË;&æœ÷'µŸ†N#—©¯Ñ둯Ò[©R%]÷ê“ ;b¹¿ÏVaÚ…¨¹˜ä‹£CÚ²¦C:ª4,³7"a"×Q´MÜPf~ß<‘%]ÂhÊhü®|H§¡S¶¡)aiߤ§izC¤zŸD>Ûé’gŠÄ"gIŸ³œ³%µ•Gßô ¹îÕvö夒ëä:Òý£UκOã»H[I£<<^n¾ÞÙß>>þÐ <™t«û£­_Ÿ¼¬h=ì 9&©£„"d %Ú—„ "=zëÄ»&ð²ðîIÖË5x¹FVÔ˜º~þ/–-ÌylÉ:e‘1nxl"£6–û¿ÞAZEFë’ë÷}'Øh{ÐòÎ-NJ¾ê^’׸8ô”¦Kª×+ñ É4UhÚ[®Þvh`MÁ-0gaØ–5¥ÀÆ ¢gkÉSýܽòa–±½çMtð2¹A‘9äëJ|Pbg•;šWmͨ–ºªëy­XÒºP³tjÍÏ ó‰ˆOZn=Çœåç;Ñ ñ¯y%únç…õ~¨È öœaO”àöb5Ÿë¬äq´´ÙÜîþ4#èo |mªtl1úI!G0„U‘9W»ŸCÞË›•èøŠc¾iU®=Se‚R_µôÃ:Ùb†"L¦BëcŠH™ô­ëõ06¦¨À°¾&¸nèG!9B%Ø ©G(êk—@‡,&• f×iº— ç'y½ÃËö³ºH°r臀ºd.¦ŒæÉ†ÞSöèÊ(å¿B~Î$nLnRÄŒá`‰ú´ºÊ^ÜÑI¨°n5JâAáüÒ¼Zœ+´+2ʆ€\<Ï_åUVÆküº!œ%‘ítÌ~ÐÙÂFv˜Ä•³µÄiʨïת£ 2óªzUtÕ¤” ËæÚëtÔ¹Wƒ þå/cÚÑ:ðF”p46"&š“´Nv_î¼:ižl>ÛÛiïþkçíœa £–#’Høâ®1^äb\qìªZF·F\+m`’j‹qkä•°¹(N8Ãø1NX\äp ª´’ÊÀ” SoáϤ=áËC^ ß™¥çò¥sQ˜h¹È èV`GLkR üþ{³…(e/£ù¹) œŸÒrJÙô‰c å!’c"‘ o¿Ð¹„ü*SO>\Á\f¯‡î I”’+'ˆª¾ÉîýÇLa—ö€kÕÉÜø‰£&`ƒfX˜…ÉIGIl-pÐÌŒLèÕ€²?Ê[$_ƒ Š»è—绯w¶ÿ5—/¡å=÷LÛ2»Û ¨HI}æ÷4‡âÚ^lúÁó%ÛCüÙÞ?nþ²³¹½sÔü¿ÝíYWÆûé·Ì—'[ñ;š|óõÑÖÁöŽ,Q¦r¦ˆûI©(È CðíBtèD”£ˆœýcåßK¯½ÄT˜³)3,¿ÓdÞº&iFžÃÙçcÜí30~ÃS d¶ZG9_r*î3OIiœ9X¯%®çv±£H^Z$Ò¥§!Aè»r$–º±á§ÆŸ~û €G¬yê¸ù¨¨ 'üæ—ØÙÇ ™Ýü ãðIEã·çì'\gñ=ñ‡ø…h{Œ’·hþ)öçÐX^ŸÄý–ª¤ö¥$DëpEÇãm(BqM‘WœØ/ÂZ””4L(Z «Íü”¤Ýt¼ 2͇ý°v*Rúö™-¹{@@€ÑöŒÌ#vRúßi…ÛU|FõFã/6¼ºtÛPWñ(¯c‡qÆ^›…38Óò«íDdî[˜'úÌÛ»/öO¶æQ½Zü™²¢yW!ÔJa˜È;,ʧJziä¢ìùW>3‡8U’ZŠù‚vp®97+Nã, o= > ê“JñtâºYÖÌœÖÄ|ÊéTw™~Äl¤Ž7¢/]7™bḿ¸$q˜Á¢Ú‚Ìý.hÌ$` ‚â‘äÑÎóWØÞ`Ò"³ã¹‹½°õËÎÖ?á÷¡eÉSÔÓ ©Ê+úcÇ =4HrÑÍVaM^H4ŒÂ•Qå$s¯Ç‡3¦ÇÈÄM=ФÁH‰i‹TùRÏ¡9o³j€)Åw€¡ (uN¦57Jò7F¼r*k@m77´\ ýU\Aj¿g=¾v»rú”Ÿ Ù¢ëXÃ(9ë”nқٴІLiÓÍœéŒ gÚô‚TÜDµç­ [àGÔ?åæ6âògÃËŸÍÙdL'ì(¨7Ï@3Ëœ©2g*†pÜQyí&Zü~S1èzóŸôk4£çvDÓ­ãæ\üÓ’Ã[Ùjü_0go¼þ÷ë¬h¿Ü¬~¹¢_ZÃg–~¹úët¿\jcªq–JøíSR”ÓQö†¨ë%´6h…WWƒÀo‰pŒB`¥kg¥;’kH÷Ÿâv&Jš‘(-À‰T)«Ò׺÷º@ô~’Š= ˆ«¢86$³øâ8•BÞàdõ eJ1èQpJÈÔÂP s˜›`ñ¼C1HÙòv^o[¤gYÿš¥ë‡—¥ÔÛî@SWR;_ä‹”Ðα ($:ñ‘(÷…œ'¡æH**H9 %„àÞeg8yšd¬Ûé;õ•)ML#ã7 Îw³™Ì ÑÔ-j€ïR*cy QMM̱óååQ’«)Æ£|bœßÁŒÞÜS¡–"ÝPÏC §Ð´^眕r轊kaÏ…Ò„À®@x¿¯PJÔ€õPöcƒn½®¡ÝvähÈÀüÎã¾ñ÷•ì”&Våçc@ÑZ—ºÒ)˜T“¤õAYéÜ zVˆºÙD$î-j …µÙŸr)0·b 6ä)·6ä[ªk$½Åube]EW ѱîøD¾Ki¹KÊ ¹ýùñ±×€ ŽÛ »Þ^¶^¢ºÀ x¨öé Zïo¥²š¦K4$2˜ÎÕ™õ.âY“tLC´Cé*æR4›MÉŒD~$Íùa^Þ›Íeè‰$à ׊…ÈMÙÄôÉÆ)T×1=S§õ"J”ý-ÖÅâºz¸¥EÿÔpû|`ŠŒºt\HsßúD`J¿}Œ»¦i}Ûaº:ºc é—ïã¡áWâ A…JOØí\yäûy^³û©HãáI݃¬®îfÕÎcxWa{ÐqÑ{°/¯<\¼[•}â«âƒ›DØ .Þ¿ÿ~6îQ“WA0™>¸¹ÂbŠn6ôRpâòVëžf{8’ê÷€²Îß,ÂÓpË:Ð[½c¿%¼~‘‰ÙÜ>Ð.zy-gÜô}ÛÁÏ ò%C}T¼ìùâÇà\Ÿ]ExµÈPRC˜èÁ™Ç\ TÏíu|xDÜ0¡‹Ðâ=h“æböñœ†E•¤‰D"2Ùâ߉Q²OVëb¸(‰Òùî;}ß~k! æ´$$Qy6¥Þ2 8 d°ÂGÃáxM ÕÇ‘å[ck•¹ŒûˆòÊO‹F$F¿ßÃHç«Ù ÒQ‹Ä_žnD}ðt£}üKxíÑ©„xÍ­ŠR µÜ‚¢gÈ#uY”ÇŠõH©õ<Yød‘Ç ¡›S& Hä„]}ë´}û`ÿLpÈK 8ÌqiÔNšo_àñDëcrå¹àÉh÷®¶'°yü ¨Ÿ’ºAJ°@²$ƺioNT.¨PöªZÌd46M3T§cÇÁá"ky|© A ÝÎ &Ž&ɧ¡?Lè­3M¦5kvÐÒh,~ëËP€Á ^q—ñ'cÑKx×Ú74VOÆNŠÊl¢˜oŸ’'¯ó7w7+”4=±;BÅA '3#´ŽŽ;f„oeðËœ Qãrr!}s S;pC€2â é)Û# w4²­¼ …(zî"ÕB:@ûR¤ú8»RIª5¶ˆÛ.² ‰8X°0Û¶hiBó†x‘‹D†š»¦@—š«â¼¨ãQ _bºH|±ðhôÜ ¹7bd”ÂL@r%1aJxPriy(7¾v[ÖŹ¤ ˜'Ò;ÉZ,áÖc†gH\Z#44ÌKÇTÐ'uÏ/ukF¡&Ô;bDÃÀ`söª²FsG‰ ±b`yFÈ Ë5ƒm$ Þ‰ã©fub͈š“¿Êº¡ ¡­Z0ö/¶Ò´˜á“t;xí*}A79?…çç¸v˜Ö.¾³Þͬ”2K8¤“„ðkæï ƒÃPÂ=b ?ÐEdœ{/¶óƒcL楙ßÝÃビƒ&Y†hÓ™ÇûCUu”Ãw“U/³Œ&SjHMžófë,á%ÅÙÙô‹³8sô1zNØ—bª| 6op-1J:8T´º?ñv ( a¨E‘3÷¾§íäJJm›öx~T¨$#v¾ÃÜo»û°î/`«£@>3•ÝâŠup–•ò×÷Н¬,>®••𦰲ùWÆZŽ…ü—6+fS‡ÞáBÁï¿7Ž¿Ì«Þ\&ûNY³³˜ì¯œõ„8kŠQzWÎZgmø•³.ÉYç/mQκÜÚá¬K-îÎYo¿8™±6•ÝÆ=Æ=ðÙáÌxz¾2f_cv·…}x|™Æ`éFn̼d±K‰ÐF€ è¡fac 0'oƬÕ]UÐM·úæ™±Öꊦhš¥Â˜u„®ùó<ÂèùxÿB¾¤~?\|jQ¾†¹*b íôƆ¿–pØÒ1Ô$ân^éLQ"@J†šHtœÞH2xóáXòã±ë?žd CgÛ1ÙŠü.{¢giÜœgŒˆdlzJ7‹ýpñÌ[¼@¤®†ÂðŽûÏܳέ ¸òÜ€üû㈠Ê5VÙ|n&׌óÈXœ …ù]›F,âžy’%‘-Z.¬>Ý7ªä4èFíµú8s~àI/ Fá½çuí£ÓÃ÷9½A@y(¢«0ì_,)Ciaž ú’s½a#ÛÀ±ó%çÀ àç€.)ks·çû7Ò[R†òû—6`T#A3QC¥*E¨;›(äȿ·£H×´^˜IQ†frRGÇU †Ým»ÁEgARëÄ…ºÓªôUE¤ài"`NH´G¢·u@ÑR£ÉÇÄï¥|Kyì"þ·HÊ…#ËÔÌr©eaOå¡ÌÌ£ŽÒQ€t?þ²Bm…µ`vtÁÉï“ÍëÕ ×RóSnžKNUÏ,)=¡e1,Jä´!qŠ¬Ù® AxWy³ ..جÀ–u•l.ö¥Ó>Û?hÁâ|ŽE@AÕ!hŸ±`ƒÃ(XD„Á"ЩC’tBŽã9|ŽdC4¡Õ¡eF—TˆŠ]Á{ï“$NlXRw~“>Öž™àYÏߘ#tN¤=‘YÅÌFÒÉ iÓÊp?‹z ƒ(P¬àþJ†`IÄ–‹þ¿ƒHÆœQZÂðõÿñz!$"ò¡V½^¶‘3ò:&¼“éuT7uí»Á‡PzìQ8CÀ8TþâÏò¡ôµs{ ’3LxxF‰`±Òmå9£€ùuíâ_!n¡ûÛ  ·ã·n×q'¡žÞ#4¹~@¹"[*ölàõÑ([Úæp"³AÐA_²ã“ÍßwöE0‹±‚eMÍjß&.†}iŠÎÎ%â1•aBã–2"EÚøO=S“òD›q w¯‚vy2M“d`(ó‰ˆëËdáÌ爌¾Èv¼—AKxÌþé·ç4Œ(ïe;¢çè°jÆÚ‰ ÿ’[“8ÿŠ\.Icwò¥×éÂnAQïlpY÷‹¶Qã£=$å Ê–ó §dk¬wØò)òºJ€!VOM:kHô`ñhõwZ°[rwý_ÿí_kgxq¥¾²Z_^bK¯ßT>)õÇwocþ­=y‚Ÿ+?<]Ö?ñßãå§kÿoeuíé üøaÊ­<~º¶öÿœÏj"Å`Ôçgò¯~Z­ÀÎpH= $¶º¼²ŒÞóÏàX~Ïí9¿ Ï³ÿ¹ªíu`§·.ë­ðê犬~èõ„°(bà-ϵ€~äþ¹ˆbÙBÖóA.Ùß±bž÷¯ñÀ¤ì·ô5l‘O9›¥‘IkRÄ ×¥S4hË´&Týõ1¹€._¯ÒG¶ذ"ÖžËvîž-9Jª ”ß‚WÝ.ï×=ãH?l\ •E†·ŸQ9ýºñ ¤àFƒ.’dt­ÇªÆâ¦(²¡Ëi_Öwë'uòí:£ä2hLµÝ6Ⱦ Çýîà x¿‹=è3ÏA‘&ådcX"3'\f‡‰º^Ë?÷[ ôõ@F÷0J‚€Õ€êTQô£%qF,äÏHCE*Dë‡ßwÏüv*<§ÊB«!šN¬jÝqvû‚ýçe«º¨"`Ô’ýônº”Ûê"æãiãöpÅo댇'¿h礹w°µ¹×ÜÞùÕyìT/Kx„ÚPîøgóåN%MíœÓEçÅÀ Ñ¢GÌŒäÛ(áË0Òd‡@ªæzê÷ø÷ýƒÃãÝãJ=€?sùA«3h{Îß±±ú%ì˜ÃC|³>FL…çéù®øzz~¸ ®ëQwùÿgïM+˽qE)¸ xÝ8 BÛ¡I“tï,’i;3aºÑ´³0 á$9i“䄜¤‚¸àŠ+"¨€¨à¢¸Š*"â‚€Šˆ  (âв¹ÿ÷YÞ圤3¼÷~ßÿsîŶÉ9ïyÏ»<ï³üžß³¾ æ Š+Ú[¢»1<’šJMB§¨y)¬k|–¸CS6 £U‚ä‹ü^-dd±–ôOÉÀÁ\H1™DáU…%â‡Æf="´­-X‚£ìœ#©´!Õ‘V=VsdïGdÎ_VÉ<;TÓÀçxI9A^Újä4uËõ]Ì  )”baÏ»EgVéèˆÝÊ·ëΑm‰NÂtòlH •U™Œçà½-Œ—¯y¢^@ß0“ N½³üvr‘M-D¢/ºWŸÖ=rM¸ªFF¬ähzB,œ©ð¢q+óÝÀÚ¹Äw½ô,ù‰é‘tK¨RÝí|žr H°âѾh7Þ‘œ™Þ81Õ¢‚ÿh^ÿOè*`ÍýÛT£Ýéqñ»Ôÿz{»@ÿKÄþ£ÿýü£ê8Jù‹ ôË2sc®²V­šÐËRâìqk » 6-À²Wôf- ¹‡žˆ^'¬ÿ‰»Ÿ°ú'î}ÂÚŸqïãTþ°DØÕý€Êô‰«~æP?ÍOÜ÷„?U„ãqë}FñÂݪ}Ä/$u¬òø«W¢s+>×bM| ©eU½===5”L M¶`88x}›V¼¬•¶©‡Y+³a&)ÕÞØdªÝ ®­•*n›¸=‹uí‹MîI‰›‚÷¸åW÷ Í„ù32Jö׵ѷí€^G$#º€$¤Ò3““#Sm6¸â¬W‰åRô°(0þ=hÙ*DŒ·$Œ[²¡[²|KVßXá8Ä"r‰ö@8ñðH.¡¯:8§h Ö €ÐŒ;2û/⪛6¡’†XüÞ‚o]*Ó³‚so\íÏò¼5mö‹ÐøóàQ†‚Ws¢`ô«#7¯“G¬’XDfÔ:°P–[SÕZ„¨iQ˜?B<|¯(Ôc•y»XwüA!O&…è€.›ø*ì"=PN)øjƒ×ެK532µÍ¸š! ˆöª„·v|‚óêœ2V¢&F±ªZr+îóèÖšç1w+Ó˜pÍöÆŽ0•v˸§7 Ç™çÀ=ƒ%%õ¸ý®×ä­†&ÆÇ¹ tCƒˆ¸ÂZUž8rMGë{´ŒvÞÆÙ5g×ý¦×%LJFFGÅ“ôÂ-9»œsŠÅf·A3=53¤bͤ¬%ù«XŸYfœ—µ“_e,'܇|þš3½»U/x‹8Å´Ù²Ž¼ÂæòNÄPÀ.'8®‰¼[•¯'§Ì½®zÕ„Dö!ˆ=FchKL|½X“«Q¬CµŠ$P"KVhA}£>ÏÌ 7YÑžUó.wÞÓ Õ|ìš–ñx*ÝI„që ž¦j 1)x¢PÊ &<_ç³z‰oC¹0Èú+Ð¯Ä `FaG Ö¶‚úO¾Ù„½ôuÝQ½ÂQUcïÀ?¹{7âY> ƒáîäB”ÈÄG ¯²íŒãåí ¾6P}⛸ePàHñ’¢BVx~r}Ðá,,¹eGžZ$8·¥¡#Kñå‚ÂO=¶êŠðX1<À`eh !ŽdÊUóUÕiï/Ý2#µ¡êÌZëyôå±Ô´PÛè,†E‘^¤$ùlµåI3ÿÏÛÿBcòL¥VÍàÚyòA ÝÛÿñžxÙÿÝñXO_àº}]ÿ±ÿÿGâ?ÿ ÿü'üóÿËð$D×ü¸PÅ™Ôxf#TPf|YRâ¿N· Æ<{«Cw¯k¼)Ÿ]âúäÔd2¡ „n³«»fYh£t7×#Po ¾\±Ç¦‡&Æ&“Ó»yBi.jF7A¸i|C:Ô¬œò¬¼Éß&µ|¹Ù§eOÌS¹É¶N‘ ݄Μ¶eð™H÷…NkÞ A Þ$.Áû̪ 6úa “QWÂo²,?Ý B-«8QŒŒSà3©V3àÂ_09cf´Öø÷æ/'^~•¬5²RüA©òØþU´¦ƒÔ ƒµN½ÿ"û'´fÛÏ!_I,ðY‘Üâã~ýÔ•ô•ã›,SØ"ÈÔðq3¼©ÎÕ eÖ?])ãÔÂð¯Ô+`‡#‚$§Gûêy%¶qIi5“vG£¬k0T²®Ãʼ歰±þVX!‚˜Àã–Gé¼J˜§Mˆ_4íK|ÏýAÞ }¨>Ê× cë;Wl¿øŽßOs&™ßÊyIGF |FªémÐBˆ²C­ÁÃdrŒ‘0Û”­C=áyöípXû{ Ó8©Q{ rꚣ̢­ =I³V²ìð¢òêÕX+àȳڦ¦ÚÑüOá‘•ÛÏȃà=JL47ÕJƒû^l«v5xó½Oè…Ño¢_·!ò/¶v»”N{âú™š‚MÉ^KÌÒ*¸N1o$s=‰…£äÔafBäžOï€1Ÿf¼ž¦¦öÀÌÒœþ‡û¬·)_µÉÂjʇ sÓXâ³H˜šbþÑA=ƒ|èk˜t%t%Áñ%£#ãÁ äP¨—n2 ÜÈÿÆhÑï»Æê·¨aZcMg&§§ZÔ.ÎF-¹BôKS‰õŒ«%¥SÓÛ–8BE.ŸÔÒÆœße“ׯÎ^ΆØ=«M³é[­ §fÿ E^‰{¾²ÙqÑ„ÃΔvÍ/=¹ewYjë6¶urËãi£}9G¢‡†åÒz’¶üw³?”&‰ë¾½e‰ilÍç§ÑJXÂ:h>i!_ÐXþoˆÿmLŽoIÿ7„F—Œÿvõ&ºcñ§Ä}}]ñ¾¾x¬ç)±x¬O|ôŸøïÿÀ?±­‡æìò¬Sôf-™Í™À•ªw¼“&Í*$ù]fÝZ"‡7ùÑJ±¥e3Uk·hYm‰+íT Û¾·½¥eØ.»NÑJ Q—uª³¡¯#ÖÔÈèH2=ÁüäAn¤E|±}ØžwóÖpuÑÏ X¸ê¤Æ "=G ËŸHÍñk‘’ëç­2¿#J•jH$—èºãçì D†«¶‹”yy¯Ïj¸\XX¢šk‘ìbMÑõAö:DL!‰Gü?P`-H 'j8N9Ï ! Kã'ŠE醡Í#xùHO¼?F­«ÏZsµZÅìì¤ÑÎÙ»vE}§ÓÎÏgàòØ@b :W+U”Qð('í¤„n¸B¶ƒ¢×¥Š5„Éæ‘©4ð>§Æ×OàdC;!ða’Cž£’]´ê•¡kÕÜ\½hW;ˆÞq—UÀÛ€C`œ –¤BÉ|$‚wg¹¤P–W ØæDg£&á“èR/';À¯ƒäO¶z;q†8yŸywƒSÅzôicgE‹×ÇGúd€äë ˆ•ÌÖ'"¨Ö+mrÇmä|æ‡2,ÔòñÃlTLS PÕVFÙŠ X Îev1CKñµ±<_9åy·ê•A_Áã˜d¾  ú/_›÷§cA ¾5±Iž\*¡µ'Ukx ^Ø~ 9¼©p·¢ ^¤5 °Pƒ´zi/æºÞ#ð[׋F ÆÍÖ<IË&Ò[¥Â,Ö¨ÏQãÍõqˉ—¶ñ„¤8Ä«ÏV”Ž@²\ ^S®‹Ç3ý;47ËFð,ï¼ ¨Oã‡â=JŽ>㫈¡¶ƒMàY1;¿]üOnˆNŸÕ}°«ôSJ„ôF±^…U0[ÏrÉsV¨aÖEO«ÖšöuGšíeψš†>¨å3‹ï; צ†FÆÓdâ‘ ‹D¼]„ÃPl<Ò]@û¡!'mÒ§¦Õ׌æ¦<;¯Â%<ƒwú”ç=øÔCPµ*`©8ßEüêÅ EÏ»~¶æbÔ4…éíV ¥Rb#ûÀ'Npљ¦Y‰ïÆ$îp“ï䄊^[”´æ+”‡ˆ]CfC¼/0-z…iq™[h§‹¾ÚâUi°Y.V/$O„¾E¶@¢w¦ÜX0ËS™ ÄF½;®;!ÔÇQ–ÊÔVz¸Ü¦büùqª‡h¸é0l\H׃Wt£P?ñD¼ðûújØ ð•h:_uç_*Në!<†?\_ÊW•àk¼äúÑVLo5ø†^³…áz4Š@j‹‹Õy4:ºy,’µiý@UgIà¸áÊj›wm2 ÅH^:RÈèBDMµ…,©Î†Ú F,f²¿«! Q¾‡˜÷Ùª-lКCÞ .K#¹j²ä‹`ð˜¼m¾[rÅ!ƒ+ær=6ÙêsÞžhGIŠ%a*RbiÂÝÇŒ†Â"Xåä.àQÖcFÏ‚,[‡|.dÀËŒø*ìhž!”øØ‹6åεs‰cu뫸X ¦v`: ž,¿Ù.À¨‰”÷U2žhGâ¤À‚lõõDãò†EŠcè"s˶Ð~Vv½dV·˜JíU…ºšºçR^½ËùÑ@ŠŽ)ÛÀ4$€—‰F¼Ät®)¾rL ð¬TkÉšZ‡É;bÍ·B~Ò¦8Q­XPbø“•Êfgä²q¸£¾Àƒ2ÌïO{³ó,ÞœàDËÔr„Åh—gLãbÝ«ûÇÇEÌÊujØêéíïï†Å=ûPHî(Žš:Õ}…sɃ ê /kø°Zɳî!ƒ[k*¹U»¼¸`Ó ³àdÉim­YKþ¸–– nm£8xÛÀ¸[Ô^´eºòÇÄP€ßJiY“êž:ŽÅêu:K¸½é…gÈ]òçs(! tàÍiñØù5:o·ÍUÅ“’BtB»ÄÓ›4HO’²c³ë×m˜´zÞõ¬ÐShÖ˜½¨Få’º…(•5åEsvQS¯ƒ6s Cúj¡bsÂguEûqîFØ žö"¤:›•(Ë5©TÔ}~òD%jx´Œ »)SIlx]à>­W¬6®àSž÷ŠóÙ7$˜ðƈ6D×çÀŠ0ZÌv5j¥&Ððg·aC߆å"†Æï\pwºÄO“–ŸŽºÙÜ®]½…i¯¹*Á6d#câ5¥A³Ã¯^6bòÒ¿·ó°t0Ý> WÁ.ÂŽô|ÔcY7ÒÁ°¨˜ìpÖ‹ƒ 42ΣuM DFeff<=92Ô!§!ít6ãⵌ’ÅJrÆ[@e¯ hù©!ùNª~¥·SüO·¬P ôUy:›˜!ÇËåêÕèòU-óÜ\Æ™‡¦qù âùà•ÅÈŠ¥°yHÍ>›äôN7*EIÛ rø;!…ÒQ7•ë¥,V`¬TÐëH!EÐD…M„ªô”¢ r³0#¦0¦;¦ˆäbâ}áú+!¡^¦ouÏí¡C_; ì¢9R-r6%àŠ€5ÍÖ¨:ùbKV]ˆðy8åàŒÑ»hÇPcìúg^ºvhœÅâ®ÃWt€Y%m€›pñ30J§ÇÈ'b*ÞïêôµÅôf}ÐæËj˜ÞÚ u¼*ZºB+E“; Ew«oÉ|•vdp”%5Ðå–ÀW±ÂAVßÀç‚Lðƒ‹’lMjBg£“×V©XûUöçV=P3`Ï‘‹§'6%¾–8y±‹ä_á0j²hÆ¢W‡)Áe‰°AŒ=䔆³]¯yZøÐçEŠõùH…ƒ}×^Gv£lèܘÂ…Õ.Në¶’XF¯jçÛÑB4Ièë(—'Ƹd,¸(Êœí²ÛמylÀ*Å‚)Ô=3ÚAТ¼é§—'Õƒ¢ù¼ ã%ÄÐG!¯‡Ü),•`!çKlëÛ†=ÄÍpÉTéˆÁœ "æSG¥+©ebŽ´/]rÆ8ëŒ e ”ÀM¸‰H+g'8 l`‹¦B#0é<ã´ÀhÂÉ;gD³9W\?‰BäóK–ãâúÈSð³q±ãèrm!  Q媞ï³Ô.E&E…ãKí¹ªÐÎì2f[CܝЬ™T¾#ä:v&1y:&Ø DbTã×p×61È‚{x³»S(·VúD{§]ó—v(éÜ• Ñ)WlÈ¡©‰tzrjd}jkË¿­Qg—°êqIJ#Í.TQyà4:Ü1t2RžlžJ¦Ác$ -ŸQÝ ,/èÃbö¶‘K´%}M†A…RÜ-÷"ú|%ÑKˆ!öMߦ§=/tQ\…¢)lm XV  h•‰Ec›ñ(x}y’¢@(îÊ~µÍh.‡Ã l]âó#m_È–Ýië =&tOÏçsœ¬‘Q¡p¸b¹5q— Xë¬Z!† ¾ì-¡@lXx`}ÝÝËŽÅ£BôÅ4Z2‚ ÊA¶ÞØÄU,¥bIHý"€…&‚ýÞãk…À{@õäÇœmâùé ´"ƒ¿€çcG"@…)#˜Rl7Ð@ÉûŒà©”²x. ÕK^£ nŠq™ªSqȺÄÕ,T‘+Ó«DŠÎ¼ü æ°S :@6ˆ¹˜¬ÇXbt‚J!L^P7ŒN(¹§sqÑèãh”/½¸œ—ëiœš®¥VªÙ-Ò‡Sü<ض˜½†öôÏöccß›2®ÇÀ;¸]›Ìt°SôžŒ Z㙡äè(ŒÈÈVaL«?«N¾žCƎᩘž´XÉÐö lÖ¡°”û¢8­ÌæàåÅýd6ø:‚$ý·pþV!Ff±·ˆà{«T÷Ð$ ÀçÈ,[„3ÞHžL[”q‘»¡Tcâ³wʃ]›^E^¡%^J&·ð+ÃÀæ¡(¯4Ê*⫎©e._œü_ØQ¢™‹>®Ö°¶Z¡¯­ZÛÞH06‚½!©:Á¨6bȬµƒ,R’²úFQ"8¸}­ÎûQ•Ðk˜ÊéÂê„+ò3úË;]Ö2Ë.J‡²âàbz/ÜÏê3ì—[°˜bLîÝÎå6¾¼SÒ!(#é踜C)€<‚#"ÑD€Çw/ÀãITʃ] òß3Ó¸{¤vWOO"›wg{ûm|Ñq7ç…ð8fŤXÚÅcVˆÝÝC–DfÁ-w%kÅAìQÏÎJÊi„^ƒÀ"_ËÌxjhbxD¯29,„› ¢à{ƒ=¼‚ð?Î qâm¼òb ¶Ð ¡*¬€U\ö}ñvXJ´\ GŒyy§Ê…û¤!b)¢fa2Š{WÄn*º(ÏrU|ü¶*º®OAo +›H  LîúNgq¨L« _ € :¤«K™ÉP~j'*–tl±ß%´³9øŸ–qR‰Ðd«0éQ 8 Al™«OzåN]C¬IÝŠ'’C¯æ¬ÕV AO•.2D\“úŽT¶¸“›Eáºzi¸“¶$#ŸbqÚ¿½p5mí KDñIC‡GÆÄ­BX®,3 x9f`+%Á‘f‰b8)­jgAˆî"Õz'/Þ8UÎ×k»)¢>®àUœòqŸÄ¼˜£P€(« oìêIÄœ¾˜Ó›ë)Är=ñ®®DOW!—ïÈå­ãšåŽƒ³”Dï‡Ìq¢UJZ½Ç5`&‹’¹:‡ ] WDTyT £  Š1ت³Øà¸êÿ¸0ö BT9—B »w„ ÇД}>Ìý¦oF&$0ç—(4ÓŠ^Šâþ♕º0ʆ¹Õ¸E À“+ÉWà))(QuÑEn™å6­6ĭ׋§ üØ­"ôEô鸑$&ãt—=%D0²‰xnãr”2l ¸5ÐÊq‰Ó¨é»‡Q—.„Øë'&îÍÂ1*ãi®Ü\€@œ¸ò°¤ã"%9a÷Ô3%„ø8fóÇ-Á5Åøè)gYXĤ qQVðRJ|n#Rx¸ñ2úUŒN1`‹ô*ÆÅøL¿'a¥$âŒ^S†C»ÉñËk¡Ç e Sõ£‡¤â ¹W§€²~O´ãÓîYS |mt{xL„¸H–…9¼`%Åòl šgÃÒêQ‚Ã'nYÛ´¨Ô.q, ý¹\Á©=Rj\¡ä¬IØM‡…Ïç…hÅ‘qjàTQ†WžÂ û²•OhCÌx/ý9¬– ñVâ­ÄBB¬@¡Ð©^÷k^ ¼ñ -¢€&³u…&6ËRc¤ÀÑúPÅÉ þÐÚ®ñ‡f„ .¬UGµ|©/„@GÕC#鸥Ú?N¦.¯„kà[ˆÕ™pSAÑWt…^2è<8N1¯,ma³{-¯²XÓ[§9löYÝmµ¾Ñ%G©5Bäû¦Ñ£î—gu…m¶À—EÃoHýHN¦¬’S›óòƒ»Z´Rš•é€d‡$O”S+•>’¨Š§á­~ø*̕ģŠÝ5xæšKDlÑ7`Ÿ„Éò°ìûÚq£hl…B¡¼_ ŸV< «fù8Dó¤C¥# cÝ·a«£Æ©c´»^¡ R7Bê1‚tÄ#«¤©³XòLœ‚‚ ®Q­=1†bûĸU€2V‹#£õÄVæ …µÑ&®:x |ÄB'Æùvô]—áH‚{ ÕhLÖ7ÐÁà1Â$›È25'œŒhbKf9°:"N¦žòË—Ä!Ç./k&apn’¤Ü‰´ôsÛBA5‚j¬¨¥S&S“#Òùb´0FðÞ`‰à%©ÐPsáè†nÑF+9 \ŸÓ‚“n çÀ aPGü5ˆ}ó€Ì©,pæáG€dEwì ÎrA¤í´ÒÈ*·•rwÑÖ[¾Fé>,[O7Pã2XZDT WuƒHÏ!ڋ˲¸µ9æôÎFd9ˆù4{AÜQÀZ-€åN7°€Õ£ò¬ê3~ò}1‘>0Õ(Ø„ÆhÍ’ð|(÷Ù„4i(ÄJ­¡øãôY CÀ˜™N›Î?Æv3‹v´Ð”}§ž÷"êy82E¯šukh$£Ò@¡Â‡Sÿ:š˜–üÀüöp‹’K¥3ïÁž€_•à¥x¿Òš :$1Wj$–pUo¶‘nšÎ«þ"LF[;nY¾10¸OMfÆ'†GF“Û(Êè!¼ ÜðtÑ4¬@y$B кJ»á*ú‘[©1 \ž‡Väª0Nßy^ E6ÅD)ϨBîBf•h/Tíh¬+ÁǾ™èµ&œŠÐæ\.zCCƒ"{“£N‡€Vð%@ù3C‡¤0.Ž–Dªæ—<+¤˜‚ ¾Oó3¥8V4á€0˜ì€} %ܰT5º‘ªÒAàÄÆÒtæ£q2G!Ø‹Êë<'i£Q| Ð\T.OD$M’€j+äñî–P ™©ˆƒ@oj°ðdJiv‘]Äï\0¬7êcŸÞÆÌcÚ C±®”Š£y†y"ìö /cP;¥¸S*@¢ D:jÀ]âÔ:gudž$OÕ$> Ãîlg¢¬’G¨»y‹®ÅÅÇ~¡Èœðù"¤ä¸è?Í>ÄI% U1Å"6”A1D²Ì¨$.&)JÏW4”›ÆŠOË>d0­\ΫSor·xÄ’~Töµ>µÔšÆW2–¯8˜)X°‡ãr¥´_ÑŠSä…‚Ù¥â‚ÈZø¾ }Ñ`X”Uò³¼rdx<Y[ö"ð‹ºÜ¸=|Œðë„ry]¶€‹Ñø¤·àøóÀ4dÈ®ù˜èÜåâ" i50*qLHö!6-xYT2‡'9BêÎήœS‘f¥PâÄF ÎŽ‰‡Ãj€t¨Cð“깉ïD»Ñet#59ßý¿ôå¢~]‚¬€†u;B#Rö¼ýËUÅFw‰³¦Raܸ°Æ‚­NNOÁXú):C¯·q"=MÜEM§$à vv*™J©íƒ¼Í 0 ¨þ8÷¥Êz8Tæ¼bÞWV÷¥95¿}€ä,+ï¡øR¾(m‹ôq¡géYu=ãÕù¸—ùöTÑõ\#âZ‡õÎèrÍFS½ ^Ï 0à° ofÁãײ‹ ÛÛØ±L+"´ÀµèžŠ ­X¬|\–žyõô‚è½Ü=˜ÈOSÅu÷-jžróîîµ9´!$9ü«OÈSC˜ËKD÷@©2¿Ô>Œ€Èn‹0“Œ4…ÐÓyÑš½HIËæ_™ºÐ1„®.#ãx;!?ôuâs¸ `F3íN_ªu¿oÜÎA:2öpSˆ>€Ü²‚²™w¤áõå Žã`džä!›†Ànémcë&F3Séñ BÜåªÞ*‹-á &˜…¶å/–²^12ÇôWco9ê#уA¥-à´“Á…çqHðH @°H›¹–uj ©J õŠ™˜\»KóPaæŠbK"l°¸pÄ4‹((8• GÐõUr:ࣸ\ž·Pž­ÚtÖc*”D­¼€ gãÛlð­ÂІ{],‚´ˆÍ=;/©sÄÛù…EŽÜhTleq¢â”ÓéѵkbÑx8±»òí¶KR€í+‚¨Œ#¾‚«” ‚°1A¹Sf(‘Tþ@ŽóÆÀ”‘¯ç0àÕëN;k„”ªÚÊåNÁ RŒƒÀÃ{wÇ5ÔJëQ¢ˆsæÈ3zAÈø(Ùµ*ŒµNÃ`|» rsH_pW°™°Ný:ª~’Î4ÈÚ'ÏZ±èG]ÏÔa(˜ƒMÑѬ=pMFÊ̾Á:Í×0/i>œ½nüÃúTw­e¤‚Ë·“ 2 àŠ¨\•Ò^ö&ǰÄT±wÓÏØbІŸ£fàÕ\a¬ÏAJNÍPW˜lŽO0ÁœìYÑ-Óšè0l“NE¼$ý öú£Ø3Gù™‡¤ÅmnÕ‚ø»Ø Š…â>Á²…ʹ« X¡\ \¥ ’o›Ù Uò/÷‹SÓÉzœÚ& ëôA%‚£vŽ6+ÃÄ#qÜdªÚÚ·+!›¥n#ë°=jĶQœ_ ` ËÇì‡ÎM:>hWÃ(¾†$8À{+(9{Ï ÉhSB´¬Y9*Lð•+Ú£ÍÖRÙ£¤·2dÊI§µ(&ª-§Î‡9—v‡]d€h£7v¨ÞˆXZrB‰ÃD|ÑÞ¡9¨òZ.9»lx€OÙŸdwh/¦_[,’bÏ õ Ö¨UηJ\ò 2‰|ÍåpB­åÌcsaÄy?ðfÚRÚz´H’©€3E$Zd©F¡l8HN¡yf_’®b⮵‹¬£‚€©€QG:ÓôtFå5š³„î^PÊ,IPhƒÙV@%‚ß%)ZÃ3Æ >…±ÒÊ9:>Ÿ5ì—¬P‡£W“"‰u}•_î•;éiˆ AYORI§Ì)ÿ0wŽ @ÞÍ9Epÿš¦¡rK›Éñj²0M  vFhûX·.FU€$i^h9Ìaˆ»ßˆu¯¤Hw; 3’†ÅÅh“ ¥mOyÂ#j5ÇŒ‰ONüqQ{qÀI’Kˆ)ÐùÐÆAZt²AXxºIƒ…UCÍ)᎓Âù«P,¼ Ù yr|°Ñ’ñÍóQ’ðqò”¹½å<(i@CÇv;9Û¯LäðhÊì34å߀j ™žˆ–†én ! ªÜ£¨+Sf¹´›‚ÐKszŲôf‰HÅÒ,¦ä"4µ FÀ*úEðävÝ'ÉX(Fà›Uä¤P¯êÍ Yo’ ²‚Z¦V4:3-í‹Æ$¨3'1–‰®³Ô-±N’%ÆB™ŠÂG¬8@aÞ+}Ôk[MSUì? øRÃ0þуšZ£ôI ÏL²¼•Æ ‘è:™:‘ýTmb2@Ù  TªÈë1ó´BtÒ•ºoC^êeswà9¡ŽAmZ¤†&„ÅY)‚·½l‰Msâ6†'0ÕGf‘úKG"ƒÅ5 —´Ñ¸³,9ìbi”û¸_QyÆ«Eß)p«S~RÔÈ&+—Yͤ=¡HSËT [Ù/"¯Èº¶ØºFcTÁyåVnfË#3–K%v1{#—a@å¥Ê‡i_5>•õ,ÌHµÀ{‚™!ÕHtøÚB£]K§R›(©ôô×¹jSnÈ;e2׆ñÝ,Ó1¨½Hµ$’_²¸(BoRaä®VýáѧErkfhëV,Ñ…RÛÃðg<Þ®²7e—•8„{&§7 m6ß7ü"’mwov‘·f›SSò刋6AÖ°t%³êó:ðÒæÃ³B·(g´Íåp)¼„5Ò¸T6+4‘Myçújd“L_®Ú(nĸ'’³+p$É’ …"V èº½+Wfä•Qx»›o"3ãºó<‚8¸à™Bá smF„A߆*ÆâT·©W|€—è>6UQ˜ #´H^Ù–Ë ¬OÎŒNC†uéÔô¶v %²<,Ù»ã«è êup#ÉL18väÜKh„'}íœmP»d0”5n¤%ãf’=ÄšÝKnÉLÍŒŽ¤Y8Û°ä©OxH“‡[ØOŠ ÞÓ-8't"›•¢ïðqôᆈTIÛ;¤>¹¥Ì…T{M{ Z“ÓŠTFU‹-Cõ¾99:ü~fýÕv¡ö‰%ä;AÀø±šÇévWitéH£¤ê0—Bò€HRÚ15!o´®4iJ˜8н÷™ƒ–?Í|I¨»ÁyS-›$½åØlZ}‹ÉËBqs¤š’{U¥¼G|k5yb× >h² â¥D¡´Álpž‹øÊ?¿Çî'*³-•dHýR’–¤´SÁ ÎP–”Èj‹ƒ³^Ç:Ê*pæú&5t©¤v&´‘uÊB9TŒÊ ìcÖG‡ØUŽ‚aRÝ$î\÷àM^¬°N]“œ+ˆkŠ0° |›,Ül€+gŸ*> Š.iöÚƒI¼°ÃÙ/‹,ÄðX¡€*`÷“Æ/KTÐnµbdð/9H@•û4;³¬£„6â‚GÉy(uÈ£Û æ6ëCEÐN3Éìf°"ÝZ9\)Œ¢“Ô·*Ù—»`$wIQáB½Z• „ùæÿ!±„L ¥xÜoec±Ã$ *`¬)[õ rÑEš„ˆWY^¨i%b±rfç¨N‰µcÙ¾¾ÇîŠYm+’ȆÆð¦, 8'SÐͯ““©íšAi ƒ$PAUµdäw`ϵ‰ kTÐjOKàIį H°ªò–B¥DiJlj(Pb?S›©~ób™EOR¡EˆÁðÃIY1DýJõd^Àlà¼csø)®‹i1xj™RÒPí,ýŠff²™M,µDÀ)°¬rx)©Œ\Œ…OT²´904 <<ºªŠQ‘ÅÂc $ÒìîSFy˜È~XsŠgU&Tï:T˜à8 [ÒU-þPDŠ"jÉN˜{3PG‹ñ$ÿo^¶g‰ò:jd1a­Iéc¨ N?Ê4öŒê.2 YÜ‚õȸ`¦ÕÆÀâ‡ó¢  ¹¬‰4k®êÌÚÕ<$¡pì³J¢ÕUq=6ƒ$ «¸¨Æ ‚SƒŒÑɈh/‹iQÖ³Ö‹eM±É4Ö³”{KqMetˆøè6麦N&!1‡YÌ´@M–-qgó)¡ŒLz„Â@´¢ì¤vƒñv]ž]-wì‚B¾Z8Äèo r S„àR¡Ym’ ÎUAR<$;¼äõöàà@Ü®œÏÌaWP·žg9dœ¡¤ÐA£NçtcgÑ‹‰L€/OÐa”ÀH¹± ¯¥äÔÖ`î¬Qs D”¤’zP«Qe£ÛTvÙ­u§y4Ü2  ËRˆc˜?Áq2%rÓ¢1ßBiÊâ» †B<´ébÅ ¶ŒWã‰i©Lj01*M<ÔãF bÖ“¸»F»æòÑÐ$&aÒZJPµ[.GdR¢Û 6Ud$ Ñb3>òÖBVT¢s•¸Ô*¤—MÞ,îÁú–¬[(ß$Piƒ˜³Åeb5J×¥®`¢$‹ {‡èEIéá§bÝK™ÖZóVi—)‚AwB¶^ Í•¨P}A½ûÔ¶ŽýBÈ=0H¥­ØÙVÉsj!h:pú\y“}öE©R¢.bMäjŸ`óÙÑÎ<ÆY1GëãTºb†òndÕTªÎ:ùÁÇËIˆÄc¥u»ÚÍ,Hʯ˜“jÁÑ”¨…ÈŽRƒ®Î|‡¶X¼ÃŠÇ5À5Ëò FßmÝwšÖºê²Ž´ËšsÙÔŠŒŠEfT :u%–Ïe°fÁ^ ”'æøj&~Ðò;Sô*Û»âl³X™]Ö*pÈM¨D‚hÒ†°j4δøæA&¬P¥:Ök„0€ UOù4¢Ä(5Q¬Uù”¥3Þ­-ޤ1ew©·̉RW,ÄJš@9eÔv ßC¹Oâ’㑎¯Ò«1CÆ ©² ÜP¬‚/5€(F~Àû…õ1âÔ"h½0¸²EÙG`cQ@I™çúLš fŸä¨FJév­ÚÊNF ïÌ-­(V¦ªËkôœxµ ÿñ®¾xÿÒ<M래»öæ—•Êñ¥ðñ,×ìsOte*sÝvŸãØ=]ýŠ/ßdª3h¶˜?O·D2œÙ,lªeŒ1ÌžY#½ÁA„š,C¤gC+àÔ&l.Y§…B®·+—}ìÉѵeðÔ¡ ìl à5B„Q S©¹z÷WY)KÕ´;N³[£ ©3Ï$:@!uzÒyBZ©6A]Ç×u«!©‘Œ+Ôy³ ój¾RRf.—Ž.(³–9ÈuÈa³É§@¯Ûê‡Æ‚£'vÅÊ%®zæï .“¬Ð(îM=¡Éî ¿@J2ßXM ä=~Y>Ãnct±]'e">b%“sàß!r _Q$?&Ò*w"-Æd"Hóâ'Ñ‚£'¶!„ ]] $p`eEu¹8ñ)—¬x'pæ%³C ¶@g§tÑ ZÛêâ¦MnµâB…kõâNùû‹P¼cWD<«­Ö×6›Èà8ËrˆÓ8¸gffj´ÉI¡g=¡;9Uá.æžÆ2.  _FW“"a‰ëÈzY Dz9ÒÞYÏZ«Þ‰ÎN«­WŽgw{3Ó}¶`ù4·x†wÐ[TQ ·ÐX[›¼h,.Á™°b;–¾ÇÉÓ©ê&Má=0ÇÎRÎ…¢¨rÎ2`7ŠÄ*ø§~ªæ¹p» Ñ)b@‡á½ÞØ!ÀÀ±Ã*$=…]€®â^nÝ¿!Y•"1ÄwS&éqPe)Â!& vµ*ßy9ø™e’`¯òIP`Q6 VžÄzØ:i=2eÍ;‚Gû¤1­‹l«dÀÚ;´ó.ïÕ³Eb±€SÚ‡£ñî¢Kô–5§jæ65'¸Âàá¶l8áúähzĪ«eÙ®y\ú\’9¦&‡ª&s£b›&¢hÖÃÚ\mbÙ³â¢Í˲_Bï#¾! “"T~îMø¾Ii‡˜•v*ªÁå)@“¬uÖJØ}Ä ÀqJáQ6ƒ6rÈö’P¯*Í–|Ä+"ÙÅÁ ^¼zöxøy„ Ô‡Z»|Óx ã·Õš^ÅhÞ˜~7]Lüôp=Æð9uQ!à„¤Îõd®IO¹±ÿ‰>BÝ+ Ôƒ]ƒ€"èEÁ!Æc kŸƒÀ­çõŸ˜¾_ÓÖÛT ŠrMV «êH¯§jqC¶#8ˆ\Iµ…®$_UÎ4ô†‘éôÄЦÌXr+tT» ¼ª•*S/ÍnašÙmÄ‹;ŒG¢~.ì.ÊÄe-pg¤xQ# 1‰b{YgÎeT1™VŠ+W±Ð~’‰d“0Wò‡€ÜYÔO&Â5ö½b$Œôt7ÝÓzîëÿX+ã SЛ0¯ÕµEÖÈ=î¸'³šƒZC¢_–»í^¶š7Ä‘p™yâVæ{£sMêÈöÚšŸžJ­›™NoàÊ£.e)o({–-ƒ¥zUªÀ‡HͪtË8ª²ù]ór6b’!1R×ªÈ g—\<ûCãÓxxžA޾‰Ä`ëA«©ñ‘i ùmÑ3­«¡ëçñ‘@§c×v¹Iœ¯­›‘>tÈc,¾âÇã'÷R-z†c==_ÇÚ4?-F´™¶,[n%Ú`ó‘KL†É‘M‡R+fpºCÚ̈ç.èÞÒƒyµsžXË60>Q'0Å·²Èè e|\êØ•ˆÌ FÖU g Ë-v[®È 1WÃÙ3è!¤ËöøÃi^‚QÍ¡I%‡Év”%¬Ü=ªZŠÁ*fn õh3<£YqǬ=+$::ÉsÖé8‰D¢»·'Ö—8„>ãÞFz{úûzã½g°Ø3‡ï`Ô2‚Rí@’u4¬)ð/šÝžÔ9§ ˜JçÏÑC˜à‚\Œeg¶HN€š¦ªÂð’ê ¹/®U#¯Ùbd_¢øŠ"5Õé`D×÷lѦ\Œ¡W«ã±¼fÑZI×À:ô×+ÃFB ´á"$ëfÖC[¾¢àZî‘ÛUežs. ˜ Ê}Æ%Iƒ_’þÙà$s5[>ÖÚ"L¿W5Q ¶ü8Þd‰òbA[Ž” LÇ¢Ÿ/XâHQ«L9çNsw©ªrŽ‚}ÊA\å c¹ØâŸ\/°Ü$è¯Lt]Z^ÅÅ0¹6ñO•=)¹Vr´êî‘àÝݱx<–íŠuòÙ‚ÏvÙùž®|WÌq²ý¹\wO¾/ÖÝç’âüJ@ÎÚ '¤ÝJù·ôæU<ÅÚ´`ïáh´Fçè9*ŸYÌJow$+^¶"¬Ãj%§[Î%„Ð"UðámZ³¹œY Üñeº˜•ÉT*¹L»‰¿÷v‹¿@Šd2““Cô €öá/ø."/–Y&“ìJ¨&F'±Ôº…+ö”,k/:Á=JD!W[¼ ùa|qÛ†ñnB~† ³î’ê øÆO@ð_c8. b¨8I1uôÈÄúÌèÄø¿v£8¢;t DœA5ƨ`¹Ãc‹ÚK ã«áÅ\öVa÷Ñgiò1ËÀ7м¡?õ‹(+ b¶ç´ ˜PT“²vbîh÷ã‘To+C›tÐJ•ÉP‘‰ÚÄ#‹´*ˆmR¸˜JåÃô­¸9 Tù%<ïë¢I­š’$4Œœ„A€Óh’J®`»A bv­+bðQXÞÔaôÚ^¤Í(U°Ýèé<ÚP'…cSÙ®¬¶®¸•{¼|Ë5·"VUJÿªÌ i]Âb6´}**W…æìaSc‚lêÆõ(¤(P TèÑk™mêJ ¡k(… ’B| «¿/ŸïKtSô^,$ñjƒ¸ÏW]! Å“×ê4»‚±AºLtH„Ö±´ŸPÍ¥c´.JXR¼Íˆ‡ t‹T¨ÍàèÄ…q ¦M;(\]2ÖÅFÌJ6"æî^çBÁw°(U^AÚáêJÕûĨG˜Ñ—Kxa™ø¾!)0GˆB ‚äZtÌ.«ÈC BD3v™ž~‚øÞla«Ä€G¿z§ÉÐZZ¶œ›ö9M®™]B-EÜ”Û-ujèy`‰keÎàh¥2‡/‹¯V¬ †¡OªP¾¼Ž/¥ÇÚ:”†Êøpf8•žIŽQîy§ΨpÁ¶€ð ÖÂ"N=p’bë3ÓcÉM#ˆ ¿•L¨5®£ÙÝj8@Bg'xÁ ÊçC*h1++ùRÚ˜ß0’ŽÂP,U‰³{!ïÃÛÄ¢ñ@ ·Öp3Ÿ½Ç®…ê²Á‘€[X†û…Òz0w‰þÂîeBBíä˜PÅ£©y|'PÃëH Ï5BÊÁ6èD=œÛì3²@-ų Û¡Ô0¸T%\%åªØl ]oî/ •gˆËš.iªL¤/Ч™&EüÙÐÜ1…u†ˆMS˜”õÛ‰ì}2É¢³ËFÊñME»ŽööºúìàãöuEb]±˜XˆmÃYƒ†­Q¯¾Sì#{éÀœ ¯t3Ì;÷çsñxK¸ÈŸö¢E8\Á<®× Ö‘•aéj#8ï[e}qkpœHqP¬¡z²˜<ôÁ/p`k· ÙX_W_¡ËŽÙñ\WƤ-$VÚ¶³W7ž,ŠÕÉçt‘°$¡òÙ(‹1GXåõÖ T¯/³bã](ä{û ñ^»¿Ð(8½BÁï°³ §k ?p;Ö“ë·{¹ÛPëk§µYÈ'—ÛMŒ¾9.YaûUýZ¨˜­X6¡†RtBî§@:Ù«ŒU$ÜU ”ì3:iL­Ùð2_òE¢+9ø*Y³4§€Ì%úœÎöà2×Lÿ¢LA9fò›œ¢™ÇEDh|#­‘¯*§ÆôÄbmÅZm¦bÊz£¡OŸÔˆd±ÒQ]l˜y§qºTZ‰^êq&uÏ| rruY X<@ì@äÈ=Âo:´„¦†ÇC6Î’JÂ*vvUž0äžñf´ Lv:䄸DÐFô€Yaªºaåu HŽˆ8\—¡—a8µë­Ãœ…ðâF}ˆâ¶Î-Žüa9¯(ÏÐAE†v ºœ¸4`U£R¥ —§†±(—/˦gÅ £¦›ò'/)HžÀÔ GP¯<‚B&K\˜,•ªÒ<†°T[ÀA ŒWª”Gè>†WR‚Zd˜­éätjh4µqPs> SÒ’’Lê¶¢õ@—β,t¯le2mù¹ Ù_Þnf<õÞhù:Ú¨2 Ñ-:~£xzÏ@Kxa}»ON¡ÁXœè`K*1 PG­³n³ë#xY+º7œ] ÄW8€Žù.ðåA²l$M5ye»Y¬sø EÑ ^Jß̘GGj8¨4‘ì²íöŒÔÅhà,”B½¼F!I†‡™ËLŽ›ÊC wŠm*æ‘ZZ¯{Hãx!@—Eyõ „d†‡“ÎÁ%މosâ.b˜ÀàÛæ­^ñ˜YkcjÔ^üQÔvt.°¥xäKAQÑ€•ƒs%ÝèT' û}F¶NLãÁ ™<䡱ꃵ_%ÝÕŠb…Y¬±…ÄX>¢T¼Ü)ÏÁ»`R´vìl²’ëRœñ£k<¾T‘;;Ô`è`ØŸ”ÚÇË·®;nÐM)mXÕTkðœ&e®gO’¿aSRw)!›Ðª‹äض R±Ö^Ð]%ô7(J‹”Ö|ù±¹£l9¶.ðîh’Ê9 Šœ'bítœŠx¡¥ßDzu…ú¤ÞE>\´Š­k¢®b^b©ài”äI.<ªÁ 1{ÎÙUnuE»(x½í`öè,¼chä±Íú Q—T›v‰žÝä¬hºšà]‚„0 Á ¡·D°€iLÞâäXftÕ“G¹õ´ª/è„2ò˜¡.Dͫj …-Së$ߊü3äÞbߕЅ¦'&F‰ÛML¨Í.¤~S¨}5xìá*Öš{¸dkìà ½+¹=½Ï2/ ¿]3ÿ–*À”Z£ÍfÓÑ Q ®Ý†ÒRÞ~0\/$¦t¤@&–lj}tBkƒ2¿ƒ2è¦UüTÜà$†`P©2§±ieÍÜhJ{·}No•^‘V¸´UÒ³·R}å‹Îé* ˜à¤+´„²Ž²l?®BmªÎà òik$ÒçKO`¦–…+^1ƒ•ð‡ÃÌû ªñ$7d†F'Ò#™´ Àéjz\C/ãSÑ—å=÷Z$ïùêqNð9°‚ÆÒÃéÎ-v­‘‡O´m`_,uXþ•ñ3W'µQ(#‘¡fk¿«aí`ÁTAæÇ5ûgcx&I òûjàà‘´Ò`¬cÍD_,~òS¬Aó£ø W1 %F@„B)&U¾ €áñÂPžÙNYª¾R–l«‰¨Hë'#ΞŒ QZõ,ì‰n Já$\|®Û`dDN^›áÕ¡zdzdü»’A–5Ž¿ÈD~#ƒ†9r¶àÔÊ6)Ó_V;Tõ4~ÇdÈÇÇ<ŹÀf N} Ë‘t`lN«Îîºe.##ÓÄaŽm6pA¡„Þrö¹Ù­®˜LÁ¦N<±;ÇŽ7_Åã@ ¹VC§‹H¡b'¤b8GÈ4wÑ‚âEqBÝ«QbAÒùI”75ªýBj½â8d—E¼3ÖÕÓE…vÌ[à˜7B¡-»ó²ëÓ8‘¸|r9®`,ä<ÞÆ-ûPÅ‘§r ÈO$ƺ®vÖWê]Ú©)žšÔú4‘µ‰«;à2©`]ö·î¹·Oª‡¡^¡l ¼}IBÇFoUS¹IØ aFÌÅYN…%ˆý=‘¹ŒGe$<Œ æÄ )Æ®b{QìÞ%Ù¾ É®‘DÒ6|ÒN´Í!L›2XÕìn)•t¥næã%*`¡l MŒ¯Om˜™ÉLN$ÇÖŽ,ý d eÆ’GNLíéšÔ¸qÍÆ‘¡M™ÉäôÆLzd29•œÆï"VK=Ø!6t³@n«j©¨j 2䊟 C1wñ€‰ÍS™£îŽi…1<ŠN‰ê¤AeeÉB@aiß­›Þf2«A×üf·H:eÄ*q™““xÿ;Í¥Ïþƒý@§xF… I¦® ÝŠh×oºjÕ:z‚tb™&â•3G‰ìù*¡Ë£¿®^&+–ÿÖ!^!ø5l\p ~9–äpQ¸f]å>Ø>TU¸÷zÖŸM•GP,þ9Uùý¿w[Æz—Ü–UkYÕv-XÉ¡ÌÔÈQ3©)°[²¤Pn‰JËxètˆàa S »hrKœßHqâ‹a(Ú¢mŠß´¨©U'±J"ví u;_u…q^†qFÅ÷æäæÊ®P&$±&y Ç5:ãš=2Ú°¥†§š#Œ1ch™î._£9Ѹ|\P³DAaÇÕ„K/[Ÿm¾”åN'«9»^4n³Ý>² ªñ:`‰KQ®)ºb=•,€LÉR% û©ƒ\z3[ Ô*k1jùJ­ÉØcâä+ªÇXKNnÕ!É%i`36Ê'•Z¨¡Õævt£8eòCÈœü’<:Tr/©l˜äËìRt%ôaÁ éŠoBÄo8y45z"Ú³UYìQkü'æ¢Rž®IF”=Ü#„5É"ºâNè¹Dë j9ËÈ DéÊf°7ÍÇ„"kø¢%òiBÝ3|aXV(Ǹ#ìÀ¼ƒzÕ(žEž'q¡zŦ;U{%šôC7!À8;ü؇úÁ*„VJgÐðn%Y£÷ ¹ÈdïU›jЉcH×(cÛ\ûÞØ—Çm‚2±I]!·Ie*¿#KH¸±6¨¡”§L"Ú;ÐxI©»æìáÆÃí¡@š´è0òÕ˜åÈ@ÚÝ5!G”xTwð$Õï6ÚèŽRÎ?(ÀZÆÜ]ÈìtÖEÚ÷¾ýU`ô£vnPѯ‚+ WVfãHrxdŠsi†‚Ÿ¦˜10n¡±ɳÐqhÓÑJÀø©¥–º~ôXrhj"3œš2݆.!C.“|§-¤jU¼þ­{jM΀s™ë'Öבb¤µì"úc½À ᪳“ÇäÛ:RÇf* à)É*PÓNÒÖB\¨;~t©¥šn³wÁE0Ÿë¥nÞ¯iL±ŒGK—@ã¥CÀì–“§cixœ–àY»O2[ØÓ ŠÌ#&—NBð|X'#3[uü¢5+vHk‡ÕZH@+öEÌkÝi5¦Ï7s]BÙÙœ“íŽÅzìÌa¼@A ­9»H14My (b»Ê!(§K½1ŒÝßVCá]I´Ü¬-•ÝÙ$F¡Ú¯mk¨S¢S¯‘¶ ä#¯AÓur"ÚÊ•¬ªy+…¼#}V^Èyߚˈ¥WVq¬z H+ÈeÅhù.ÃÀÓrhtvN[–ʤ'f¦†F¬µk€k·?60ÚN–¶Ì։ɑqãû>àk3 eRmvIó&û‡ài_•Zúmå DˆM¨d ÑBe(ì]r/2`Ò'Wà°Âã/ºÔÚ\í/’ Ý©!ò‡ ©ª #øíàÓA¢-P° ›CR”ã@²•¨!ãOøÑFèA ¶Pt}@ÚvÙ!O ªr³àé2€âp(§ÃÌá#d¸rlŒj•󨪅°ðó¶j¨¶t`ï%ë¸ zF±ØVYeJp•š:BªJTÇÂŒ¼‡%g°`I3,ÉŠÑ,Gu%ݲ]õD˜s5tƒR^³,RŸæ0]Žoh/-ÌnË#G*뿆¢ ÷Ðôt>ÔŒ !Y/„ó”D~¶c b×»¨›PÃ@K‡Áœž°} 3Àϳƚ¬2î¤Æéj²\«NÁ†BOÄ.)éöV×Ëb7åaEÁ™QÜ çc—µ±©ËÈà†ñXèÆFºP?Ã<ÊÈ5“æBWù*n©vw{RLOÍŒào†q:† ߃B*6$÷Ø‚” BÈÅæÄŸ1}ÞbnB½:P]Õ’á•¥® ¤ƒVj*µ5°0ÄÝx PÞ*œ¾S…—ƒó3{§3+Uðkщ§‹ˆD«‰ÇºOÛ$–™¨gàyw“„×+$zòývw6‘÷ºs=NÌ)ô&b‰®þÞþþlŸÝïÉõÙá,ÒÝ<•Ȳ‘ Ê$* 6iXàKÏ+Rs¢Ž.Ô‹šózY%;ïÎÿ0Å‘dFVÛA9HT ¼ÕÙK)ÈÜ ;e I#ÄÈÔÔø„T« #ZjJJEoˆýÚÆWu:‰[—^˜À£ª câ“&$¢±¢O§˜ˆÄz;c±D?ãC^ÿ´}õ—‹V* |ÖDsk³W_„Š# ¾ALËàÝ‚ w.OYw‚haŠ}ÊwlÜ„ä*ˆA{Wl ËÎu÷ÄTž«ø*çy_E\_ÃÒ` a¾'à5ß’P×€‹+q–óÊÂ#pÍUÄû¹úî.×{²Í—NÚÅžˆcÄV[µKôöŹ2ÖÙ*º96y]ÔyÄI»Úꉯ‹õœ»Bn½'oø6ñ£œu„»|Ä«ƒP,´^Ø©-¬f™nÌŸ•Xv¼Ù±€ë„ Ç2ÊuæÁ÷šçÝ$£—˜/æ;ѯ:¹yÀU"•x(‚gB©‘Ÿ €²úѪ9VZ­5k˜P6âtf]r˜<„T óÚr²x"×|Áîçæ;eج ¶" ’{GèèT˜–T¤0ñ·Ží%ãIJ½<|vÄá¡ÙBžÝ& q°¦‹ ¦˜™Æí!K½¼³ŒåuÞ9b ]ʼezh•Ì ¥ßøÔ¨ÐL©Â7­©ŽÑj%~(ÇW4«'K Õ5íöà{6}AOÕÁÉSö2$bÏ)Mp žNcd•ÜAé­ó¿¢ «ÍFŠ¿Önf‚ Dã¡VöøP: µ!Þ’ ù`ãeÖ»ûÆ{‡s|°p¬œI—ÞÙô¶CUÏÚTuö”~ V&4…ëy89œÞ69"v23529ºM 4XàªùÝä ô d =qY×ר~+Ž)§$‹ùæ<, ƒü@)¡e½‡è,rU–½,>då`aGÀ%\«c¨ od>¤’ŠÇ2¸IéÐ3âÓÓ_ÐےéïmàÉ ×.4£Æ*Øä‹MÕFpÂ* }%gS']…ì°1qõ–•ùc—Ü;âˆäüF’òãZ‘,æ ýîX¹J bòƒVnn„  Bâ†ÛPˆ48 6Æ–žÌ9†© ÓÎÆ\Ÿ=‡¨b–8¡ƒÉR Ù¦"i@"ud&¥²EàÒGaÛÀs¸DCPªùäÅ .ÔR%Ú~&‘jŒaãèƒíPøè2"¥Ë!.¸mi¨-N.Fƒ4¯6/ Ã”x¬¸E3Ò#I€Ôξ®Òˆ,…u.þT¯-±yw,i8µIzf³‹x™„K×)FÑpw«Ouk‚‡ŸJýŠè`®.ÊËþh<2<²Ù¡ý B}FMr_à !Ñ…Ù](FEkJ)gÊ/ÌwÒ]ÎÌQÞÆÒ™B¨Í"°#'f3çè t!5žžNŽŽJö%²nÖûà­RÓ‘Ôøú ­z*ÿrÈz&ƒùŽ,§h»R¡¢™4ÃË7Y÷ÔïíëIJ÷ľ˜«»K§Ðj¸UW‚M>Ñü0ÀkÒ¼¬Dû6Jlf˜pÃqR/˜¤ZBh¡j‹·a¸Á68¥³Ä‰†gŠÃˆb“jrÊÑ2}«Ï5Å€WI<Úíiд‰À Ì0‡ÎÌ…|ÜàvˆîP2 F~=Ç ¥g†í’óŠü¢k@,]p8ŽJ¬…û <ø€=õ¯‡ªâ!3Ù‰P@ìȨJ”,pÀ0þ*k'ˆ3ñë*Ü`ÍNNMLf€ ‚ŒëS[ ÇèF!(ÄÐ#_Z„èÉÊÍí~U€²âùL_È­¤Â哼Ü8Ý}kueöpQ¹åµ2áM©žp "9E¥ˆTÀ€gFAšÃ˜ÖÐ!Ÿ¤ Dæ™"Èàt F*•„7[:G“k*wJ…*r¹ ©ÅÌbM¼êœ‡ÕÄVãgQó³#|¯¼È–æZîÇ€JJ IK»š…ÌJ#3e ·w çÇâG Û>(Éã}»•96œdr8Yö,m”½HÅÉÛBÄå"%?Â…laúär§ì©Àhž_Ãa.¯5]æò>™õÁRÌÈ^˜n^irÀ²^ª_°zóJD‚,ªÀS´g›9Vk°ó‘ ‡švC,ZˆW ÉvnŽUd>‘×éÀ£*¸‹Æ‘Š–¢I\Á/0牃AT‹‚ö*3bNŠøAvÆWu†ÂøñätjóHfKj|xbKÚ»Kw¨ Ý*v•f³Î^wm6’ $1·„ Ø5®/Ó"ë/’•$—ζ±u£™©áÔø†=ö‹Q¢œÕаÞÄŸ^b‚®ëÜY™ù¡°J“ÉìJêMvшÈD[_ê\Fü"<þr™›G˜òËע篛I£!1e*9µ J8¸é@‘–M`¿¹ŽÀ8¡*+A9@‹1ZšKGr8AƒŠaê°Z9¯"þc*ßXè¹ó2³Öhàß5ß4•F–§l E c¡ï•Û px2çêú°; å¾$(ÈÉR@ö.}Œƒ·×­Ì+vÅ͈6ÃQãXoì°=4µ n&——°!·RGœ¶0Ú‡d½*-’Ó“œöƒìZÄ6È:OKpHU9Éd’ãÃS©áL&, ù ãô"·‘Ö¡t€Ðù¿Å^d´6X Ð2ŸÅ¨Ã¸>J>†c‰É¨Ø:X²Ô]R³Ä2t y‹E¸ò7>ù8MÏ6ºUr¬â''§§Ó5óõ˜Í,<þ`ÐRĺ$¤Y ¥y°qüipš*0€Û{br:#ŒìÌäÄÔ4~êCaqÓ‡6ÕËÃæ.él*oÉgkcüà'CH¥ä`2 e‘¹ý^bICb¦ª*VŒv|ËKd>–°ÕÊ‹* ‰(Ä9W&À'îaN\…<&$ „/ˆG«…aì•„b6ê•æ)gW¼Pe"Ò ^üNErÞñ7Xm™ ª™R¥¥®DfÏÎÕ‹bOWjU3Êcjý?S[ª|ŠMH·bñ3Y|5`˜öÉ‚ q¦èÈ‚HšÛ Iª‘K`‚‡Behfj”ó(†GÖKÖéôÂÍO{R«P?ÅÀp„¤H‹íb@F¹0³>©@îBR•aŒDcù@±I$ÐÚ‹‡ðüªŽ-=°ƒ–€uC[ 9;‘ù@fÿaF‹ñO•/4«¨ òj½•„Ý\Sb™>&ÃqKàó±ôæ¡ÆíÐjjÖBJBœš£€$« ›«5lL©Ž  ·XÎ%ªS7­›u§·ûà‡Q£„ú\- ‰"3ˆö•1¹xØk¬ð^rJ¹Š®›‡Û‰!ëpNú¦[€ŠäIÖ¯jÖ­!GÃ8+اj3ÆÜKõŽ!Ï ¥j¥ã ]X±„1r?‹eUE[—†™¡O˜0ŸÐs“‰÷®KMã âŸ] øS¦„1\Ò¬AÕÕ:M3I/R‚^™åÇ™e¦aaËåªGÔÖÞRÉ\q0û-Ú2[Ò qägÚWpP€o’˜1( F´,€'#=y¶ÀjUŒG|„>×Ö¡trxx*¡žV« ׆m¡úã¡-«•á'péH:­.„ó®‹ ƒŒ(Çí²ÅÕÙQÆ–V/ø ñ`ƒ zù9µëéu)w% ›ÖñéááûKMŒ·²Û„ –ªí²ÌŠíŠõÄâ1X¤‹¨ãïˆc‘žž˜Jn±œZ.*Qä4^:íá¡SR‘kägÒ#™-Ééé®D+‹×Hžÿ–—Ó ¾²mxdl"Ý.ƒ ­bùµJŸ1%njŽÖ¼øÃoåžòEÔ¼û5!¼9: `ßùÙ­#ãIÈ1NMnîmeâöº0ZñŒ <ûPñ –j%в=¢Ž  §Ñóˆ8PßÜ2³ˆ®µñªœÆÚù)ü6­R©'lT´×Jp`†€:ÑÐøNº7™¼Ó·è6æblæÞ%/ãÐĸXÓæ·ÉLOdRémé鑱@ TÕ¤à»PŸš›LŽLIÅHùÏù|A0©¨p¦ÍÕLF×”çÇШjú áÔ,ÇÃÀ-ªl„ ’dË"û9´/iÊ” Æ)ë>3;-"ì»®qñ2½¶ñŽŠäPAË»¥‰¸ŠÏíÓbf7ŠmêøË¢ç kXF¦Uëé&Ã…C0øÝb`†Í4¼Òë!&bQråZ‘í BèµµïG\HØ]Ù˜ÓÝ_Hôæݹl\œ+ŽËçrÙD¾;Þ—Ïe } Ìå¯Ìé$”ò²/ŽgxO È„fÅÙl›r¦)OV-”d:3=•Y)3oÔpùC Ô¡;H‚,@J³ 0D´ÉÊè ¸‰Úþ7¥»™ŽlO¢+ßÛÓëµ ½ý}¹˜ÓÇìB!–+äsùXoÿÀ@_¾±Ì•Œy‚1êXUQC²WªéÊ(<¿Ï°ÊÁ²yeó-ÑC0*7N$r±¸3Ð[èË&lg` Ñåij¶ÝËœ®\,ŸH$úì`§(6%¹t:™3@¯LëƒX˜Çu–€rÈ.ÁKb›­°÷hf7‘´ô–(˜Ä:¼­)ŠzWjUÚÉOìvûIݬbõOìþ²¯ï¦ªŽÁq2à¾&æªñr£ TM F‡†÷ߦbª·]Ö’lÎdnÜím½[ñ8C€r‰S¡m|ft´]XYŠ´{SŽ÷ž2•¬¹‡¨ÙH1=¡n©è‰Îl“çU{Ë“hFí*õVB Ÿ¶421ÚdÔº/#¶˜0æÕdص’s ôñ‚›ÅŽ` »Š9)ѱ.àKbVk+§…¬¨âær } ¿`ø’pT_æï(_Ý D(™I¹““¡wÙbi‚Æð ¶PÖ7ñÁÉ@Òîmì'Ô°Š€p‡rhTxNÖDÙmŸŠ^ˆ¾ÉQªGNZ`Íý‰ØMv¡ZK„½eB·tµË&…¸`®¥y'è¡òÐGªñ.’ HÉ0“aßÚ©Qâ)?BÎ38KËps ¾OblIP1§t­&üRy"^9‰F06ä¨S`&E¤(±€¯lMöjÊjK’9>”%¥s4§€±(=.6"rhtb(9šIŽIvPøÅr½¦ …‡ì1àw“$‰…²Bå{ÌÔ%òÈbÞÛÔú¡îXW7r…cu$ |‘lIô!*îT3ˆ6°¨UÙÅÿƒz‘Éñm–³Ë†Í 5¬£3÷ð@í{Öë ¥\ â<¨ º|à!ŸÍµ˜‹ÈÀ[±VÕ mô NÝh#»HàáÜKÑ)Ï#„ÃXÌ2¡]ˆÍ”L»EÐ;ÜZ0š1(K)Œ Qn?x£]aTB£‡S6!­¸0g­/VÜ”–ÐPLpGN‡@rm½¢ùö$ú°á?È—¡$r~‡²mu¯›ÑIKÆ…b`·™÷°t ËÔx4¾¼ù7uß8“A^˜ä 4?Ÿ‚Žãª‚³!‘SŠPUUiÀ¸”|šA¡x¬dhV—ÁÛ´%UÇêíëvbÝÝÂ,NÄ ‰BoWOW_Þîéêéí)äœþÞþB³ã¨' ÇðE?Œ\÷¼$ëÆHŽ Ý95­KyQí§e{™è•Ö2NV˜Î—¯ÐµMàÊV¼´ÕB,A$Ä%äŽk’ñØ/£ûl!“OMVÎ[C£ëAÂjx*Y8Šjcàwj[쪄ér=<Þc´h@AK~Wo¦·[‡VQ9l2”s ¶BqŠ*¹\„Ü{Ž"ÔSËf¢ÍÓÑÌw]ö$HÀ=£’aíëÔ÷Ê—*sœUäsFäÊ“UËU:Ý #0Üë2}eX‚â´nɶ¦]¿¼k‡Ö`Fèãµ"RÚ·¡ƒ¬]‘Ÿ9EŸ‹÷lã âZEŸ a;t4Ul®âÈ[ÁÒÐZ—¼8´°v¨Nçr¾µ³b©tÈò¬¨R<Žop±$—¾›ë &¹b×®]H༼Ž+ÜJìÇaôGâK0Î8£^AðnSâÙ'xŸ`p1BÎŽògZlžUÃÀ“X»>–BUëTÁ2‰6$þR"*'U!ÉeUs-_Å.ùŦ]Þ°íø°äåÙ inu¿Õ0Hhe`”ŽøŽ£VŠYšgYfì!Ètp>UU䤸ÎwBy¡ºJM#Õšö=p࣭Så¤~;?ƒ±2@¸Iãuå/›ÝªÔà1 `Qýk Ú?Æ /­åz)ƒ0‚V"oè@’i\ô²U“ˆïVê7­ÉD¸.h³ˆráŠÙT½ R±™<ÝAd‹üÂåÒ´Û)ÕbRì¨Üœ3¿gècE&œ+tRË¡{X€TˆÅ*~‡sìú; ¤CÈ™x/°àP]pLÇG¼]Dô™*l˜]Ô\\¬qyôECÈåú-beDKë®þê\qOÕ[ çA´hÅ@{ ËeY(„á±K¸êyµPÍOs㛃Ųê8ãøŠXib ‘ aÆ«‡Âšø YÕ“é4DZ6†ïüD p5\”Ÿ š¹bÜköÈÝ4`—À~I'Ç&GGˆ§)Š7}"ùß‚ºEMf¹*‘tÎbÈt~ŒÖ˜‡¯,šcÜŠ¢†:/ úEÉ™G¹b‹F°׋æe2"Ê)†çh˵¡ÓòÐktðp”X4Lyg›’–kzr*5>½ž#[X¸’¯‘ÙI"=ÐGÎðžR’öbœC}GòáWâ“V*íI4:œê„ûD„QÝ-Úü¥(yPfáÞ”h3ém§P[*•j×]¢l­CoUFk…\ =F×bCWÂgt!ˆDޤ„«pd:ƒ1ÿ?Ñ}íSQ*%Oö­Úƒ8d«šó)¥ 0¥xИD\š½(ªÃÕÓe¹bä³×&¤Tsd掾¾‘Hÿ‰¿IÃì…:·&.§¸Fr<²†Ä‰¸X¤R˜Êô °†éëŒû9‚m|¼MßOøYâø'[ŒAeª¥Ã, XÑݪ( ­‡ŠŽNÉñk—›Ý¨S À-Œ¥B¤/PãÓ†CÑyKXP°ZmÈ 2 ——ZМså:R‹®ˆ¤•º—m‹õ€v¦Ð=3Uqš¾¬8e"ÑžhW5GÏ%Ü`F;ÁmðDÃicÚŠ/*º¥²Ð$jó‰{’¡WåL E¨JUuŽ7=f´ØEĨ‰Óƒ¢E¿a¹žDÖ)[…˜­hæMêyq‘Ô()ÿ¸h|$2”lŸRßu±¹máïÆF<²®ai¡sæªnV“Lm]AÎÂþXL{Bt}YùÏtôÈS:•N¦‡R©¦Ü»Á7U;Š™ ÃH‰a£˜ „²2ðßäôĸ‘":Fš²\Ëh¾TT¡ËÉ©²ìã—|UìNc?æD¹È¸¶Ð»}Ñèw êNÉÍyEOÓ¶ÃÀ“e&g 1 â¤>ÅÅ u·)!çœÐE­ÖCZ‰›A7ÛºªUoA™”™w9®¨* U+¨tã2S‰p·$­Ñ$S˜;ç‰}q¢®Æ§ŠX\ŠŸHÉÆ›D[öÀ€9è&ܯbZÝlVxÓTFÒ8$Q2.ÖAâÇ¿ÓðCÆâÌÊA“-Ft ƒÃâÕ4i¦Ë!a£âGf:\,XÌN§Npœ¢˜÷0V³>PËžÈðÕÞdÐÑ?ø$£Iš^ú¥f-g•i†v,…Z1œ¬,)’‚YÍ{„Iñ[ö‰7‘›éIŠ•$S]¬ýE.Vºd3Ã?0qËäuX s„ X¶ShNänÊa. ›/CÖ5…¦¿ŽMIƒ7öÏcæYI:¦)¼FÆ'€¦§1mV¼KÅÎzÞ,…*è“N¨ø}¼ß)^uJ„#‘m'ÿ°ã‰ÞþÜ€c÷8v~ 0ü÷$ÔšçêÌzñ‡æðIÐËê” ë(Nü7x 7K1x‹›iÜÕ”âíÐIþ]Ñ®n»u Ø1j¨ÝêE'XÙ @Ck6¢„<Ìæ{°aù{”ê°ˆ_ÚKG ,¢rd¨R+y¦¶:xË®‡ß;g ­2 >*FO @Š=ÿý==‰X¾·×‰Ù¹>ñÿ]Ýñx6— ²¿¯wÀîïÏ&ø œ| 比šlÁ.ÁdÀp°3&Û,Â*5.¹}¦Sc“”P¥kÕ‘ +¢?I…µÏ"2@­ò¾±Z¹_ã®ÙÜø Çf꦳Çâ…´ŒëuÁà%<0päëTwpdã]àbÂÆ„Rɇh4¦È4$кäðúäX ÈÖô.ñž˜Ñ·à5CP,B&mNÇc!¿¯DMA•×î&9XÚqˆýÅŠÐÄj€ž‡UN$96zC\}´Z[£h×d÷@w¢¯Ûéíéèêíêê˱Çîîëè‹å®|!wúrÝ»;‰ho¿bb;%‡2€â•|àHäDú"­«¬—W ²F)¬¤‹˜eG‘÷9ˆ©A¹Ý ÿÓEáWN¤¦i‚ÑÇú²¹>Çîè‰ dsâ`)ˆ}=ï‰;ýñ>±Çó±X¾«k Ã/vO̱» ý=}]ŽÝí³òý‰ì@WWÞÎöÆrÙ˜3€ ˆ£ª«/ß•È ÉаãŽ8¾òÙž¸í8‰îxÿ@<§½ï•zµâijs^Ñ1àœ’&&ç&0•÷Xù4°ˆÕ):a6O|ž 74¶€Äëÿ¦9à\ á:UùBà"§9Á¨Þ L‰É/ˆïOÑÛ”‰p,$£‘¢Z‚4L{[i+ ð…Â.úWŠÔ¦¿„$m&lÒoº8ì CÀÛµ1l2Jjh_)H…TE[˜jZ¿+`w-b €wH0‡Ê+ô<Œæ¢~¨È…cfPË á6áfŠËŽQr ,Á:À`ÒõéÑyÇ)¯¢3Lý'N˜è†XeQ[)|tШèå‡J\ä*‹f„JÝÁóØ 1F¬S,“*vC>x±€N­LWXnS1àîn)‹b:ª—0?¢‘¢[«¡RèÉ2—¡ž¼‡Ñ º¶ÅÚy€0þã#mÔàÑf¨¸/Mø‚PV‰ã㈮¯ÕWõ<"ähäMé²&„:"—Ö˜ ¶:çH‚ÎM_‚(˜sÆieŽA}Ñ!Ñg· ’¼­WHLlœŽ–”°<Þ&=¸²(p £õM ]CNq"‰KÐË-MG€¡M2Óq¯À ªÄ#ÌUñ4cCfר¹È©ÕËb£°€úi^Š€Çšñ®Ïª 1rÎ#çsÚ/cÌV—ìÜ¥üÎô^`|m¨:Ž]vY·Ì‰1ƒŠ‘“$uÖF§2°>°åNA¨=*”UÔ˜”ìÁ841 εÕ1Ú5zGÄ{»¨ 6ú´zfÈA=>ÐpssÜsÃ,Šúmÿ 4N’6%Z§ýáw°ì‘äP 0ÅŸ‹»2SU¸˜lÌô]n‘]§ëŠ€í!êï|bЀƒh"rÐ}HM)X"›’0Ñ r3sž=(¸J`¥¹Ox»•l*½ˆ©Ë¾Ð\)Á…ÊmTÛ„´Å ƒjÄ{»(käÐ|‰ú~†µd!?²ÊYLmí°$‹r‡N‰@Œ<’á‡4m„KVC9Tf­èÍr ˜,Ž}ÂuA.XV$è–æÛjY«TV ‹„ŠØZ«ÅKaqq´ì­m"8dx‚²6Åw$ݔȡ\ÊÐÄu)âvlUh< 0õ[(QH @¹âLrÏæ¡¨Å‰ý]õòõyzKˆùÑA"TMŸÄ€òê÷˜ZŽ´|Ýà±TLÜòI*³Ahý!.ÜY´±)[âÈ@? >fg‹®Z£O¨ÓçZpšc_`•¦Òé ©i­C§Ò+ÛÚ\$ã¼k¨ &[Õ—Ugá'®7èŠ7xhˆ „æã!BÈ2¹<&ïš·V`bÇÀ Šzx ÊÕðÄ“„þDÄ®hŽŠ“ا²àâÒ¦µ’oÙŒ³Ç”äâ“Z Ò©%eÔk ^§èPW"SSÜ£´ ÄÚ5‹ÚaÁYxrÏEì…‘ç;A’ÑgÀ¤˜+µÑ, Ÿ?Á'£ç<‚‘&Ñ Æpf“ŠsISƒpÖÍ`¬Öj¤5ƒ{ ‰›(|¿¸‡sžÜ±ÏÜ11ŽÊåقǵ™6KÔ'hµPŠDDáZfsõ˜+i\ãXÄÑN³>1ùô"ªMý Ñ=™—…,k÷`T’x5Ðüñ•FÂ{UÏŸ¬ÜñdÆ9LÕ;ر*Á]î |ºðU½’iÄLD ©’4¯hP úø¹ãKéíz ÄI3xþdÅ‹êYªâÝ©I#Ç»+@ûïK¬[Õô° k)2ë‘­ÊÎ9ÍN ªaH0Sš·ÑÖ¢8žTƒñƒÂM†óìWßuò¬F>¹=¤¢w€¿£ž Õ! ÅX E­1O¬á…%Ü} %ž˜ÀÂVš~ÎJ>Á2-ÌRK‚C¥]2µ‰±uy¿Âü´C ´Ä´É¤xeÛCÝÚÅïä†ËldëôT23œJOKçH+éÄH»†î 04…ª€eäÃX@"U›Ý%€jŒm ;¸©°¢Z¶®!ˆÐ‡…ÍÝ\Fظ+¸V¡7Þã€4=6òNM˜”f=¤å'¸ÒªEK‹y!ß6”aBEB²«±!dÃÈØÊ‹D4'T¢VˆB6I#ÅÅù`TZ½ˆ1‚Vú—\à\®´yB!Š<ÄöcŠC¹^2ýM”›ÔC6§¡Í|üÍd53ÃR¼ú¢êÕ•ÅØwãùË;M÷)`Û­2Ë9Ø‘È PÌ^™Ê¿q~è‹hnÞg$µ‚‹úW)'Vu0˜³b„´ýò¢¬ÅD¡°2Ñ«ö8ÇhX'XGäÿ kIl·²Ëì ëíX&7 ÖG·h+Õ2€À­~/æ‹´vÀÕšeI‰¦ õð-1}JÑ1°—[ኧ'­W™ìGɵš1̘#šQÐ0©1ÎâßÇ¡UŽUº¹¾1­Á¶™– b¦ÔÊ8PèÆF.SèÞ‰ŠpT¨Ç†h#´#S<'>Ï…ëÐpڔц¥Æ‰ q 6;¿ ,‰ÑºÍŸ¼Ž¡Þ´¾¥ÙSƒ¤Ý‘j.ÿófYèæ«cO«<·M¡€§%¸ÞF&z´1¼*ºªN¤Ê‡Y§&ôNü ibN­&t˜znCèO`]†Ã(7ÇÀ{ÀŒŒO/•\!¬¡ö‘ÉÞ£|]`;ÖgÃe3…<8[Š 2FÜ|¹µ†=È)r6’´õÀî³(û鿣Ö:鯟Z‡•¦J@KLþËk#)`lŽp2VVE¦‹õUجù y|WŒ‘B±˜Íciƒs&ÀqK$‡ø6ˆ3=äY*˜Iݵö,Câ¼V3’öHª(\ù >ÌÔL]ŒKU "JMmÁxWµ^Ž`Ô„Qį„Öx€”ås熣ÑÛHyð5&ÇÄñT’(ÔN¨»ó6霚òë8i›]*¥¥kõ¼ëÁ8u1)?”óÐõíyé5<|«dã\úa#ý>Ë6r”ù•SåYP'¦êb@á#Å%•ØÄw„mr³O«Šr·‚dskBkÉùäŸõÑoQ&ò0V¬ïÖê¶JþÀ0ª˜‚:ƒyŽš¨^ár”’&–(qw/7¹>ĶTõvåÕi*‚k‘8ý(G ~[?52‚µ£²z©áæw‰\EÓƒ‰ªø @ö•ø0AÖy)ƒêN•={!`äQ6•çé…Ì.H¢)æ8ò5¨‡ÊãÂ\H ²€É+É qÕjE騪ö¤€ù*Li\D¬¡òC¼Ú$þ|5¤4ÉO:‚œ"P’Šʬó…r)ƒ1$Ê”1Ñi­¨g즵¬äºTâ(+nºƒ6€b†ì#ÆÑûDL*¿¢·3¾Öùä¾£†Ei“^‘X^8ÕÁšUÈ‚µÎ°1ƒe‘ãø ÁIm+NïÞh<Úd¦HÒ`\U‰W±´k}¾ [$wåb9‡å1HÚ¨®‚´ $(MËNô1rLH}‘mhL* ˜UšƒêÁ±ƒTÁ˜`–ï‚=O©ƒUGo:õU³ÅA{…).1½Ð- ¢ªÆdùœ{¤ÄKabT äcVÕÖÄиÈPd,H~*ŸDäQÎiä'˜XU°Ù[Bà%f’“©pA(íà%mEb'¹¸ô÷bC=“']ÒC¹åÇ/Ïü= 4J"1SH„(S ŠËu!W ƒip*´^DÒ󨾌fµ¡2¾pI`—¼K9H ƒÒ.C™¾ Jh•‚°¼¼€‰`ÌÁ<@_ æ–ù·XŽÕIY¾9àÓ&¨Š.Ž€´cµ-ãíZ}óµÊw56>ùµ#ͨסë¼!P¨+¤ïæà'·ß)“éåú62„Û_¡,xd}fÞSr8&šC_j°QÍ)VëI/¥§Å‡—`x•Þ€nW £)¹ëðU;= _“%]©¦}Ô(‘‚‚©“¶+B"œhï4Sðm†íª0¬^±íèΨµÆ’CÖDÚÚjÅcQBxk+±<¶ÙãÉÊô…=9\µgÅÌ‹é]—w!”pщ•êÚ¤HŽx1l‘ðZæA[jàqܹ—f 2m~ƒ¤}°%cÌ9¥–ÚIŒïÀÄßv@pLü†øÛXèI€ u¨¥#mpz;ˆT¹,áM…)Uq ‚ð™¨û`ÇiÑ¥¶Z=ÑDxøw;øIIè¡rUÑÊ‚J­\ᲆ9G:£tÖÙÕꣳ `¦`äæ\‡KímœŒÌˆ…ÆãdHBVÓ í¹…¥'Œäc8»N?Ÿ‹Ôd)1švY/…ʧ6N5à&m$€‚.*Dº¶ž[‹uõî––‘ɨ&=ËybìgSìJDÅç»3I§ b¥I…ö$iRô0`F¯©s'‡Ù ½—3nÑž@å[k¼„E5^T7(BµëÙ¼[õ—N:Ùs‰#¥£®UeÝBÙ7OÛD!¦&ñlÊ[V ¾9 €¥éK…Ê;Tõ¤†´E«Ñ Ö oX·¼P”Ã_z3¨¢.Ì+$“ËRÒ„#¦Á‚(Å:©+„R€0Ü2y€4Œ I ¦˜ñ‘IˆÆ7o*@¼CMáuÈ­T,\8|à_ª©H´OˆYsrõ²Xaÿ»C®Œâ’Áê©qpÜi4ðª”>(¢(òR\Ù•PK³(8ïTz^&—àÊNŸ)I´E¼uKíd… iHxÌê¤Û°z‹UÑþâúÇm ]XUœÁvc[†ýº  çÉ"ªt­^œOsð·ÑÑ`±f5fÐ( µK_ŸºÜ<¹ß:NÈB™ýf¶Qõµ×F`Ãðª4n J&6r¾!¾IÝ+ßhM2žzK7¦UAø@•ßÅ} ãà ‘I´Ò¡C&œ<Ñò¿púV 2P‚CœÊÏÕˆ‘,p¥°IÂÊ,´¾"ƒš…WqH»§Z¬¥¬¸œÊÑ-ñP¥HD겡ï|*‘`+Lž"ßŇ«: Œ™ÍEBgŒÐh¨œø@Š^£Ç¾™ÆŠ>D|7U_9XßÙ(®LŸ§‡&&G2#[§G¦Æé\o¾ÕÙÓN»Ÿå@9DŽÜ@µÈ€ÇW˜EºÌ§4€áÜóUùOä£éÆôx„°úsX,T×Ç`hf¹¥¿ÙÚ°Ç,(é– µUEò”‡+..ýp€¾GSÑé¨Xû9§ìSæ4,oÑP|` _~­y ¼ÈHî£ Ç%_srÅDÁ–óY £2ªr=Œ.­n•úh6§­d~ÏÊÚ#S)Öî6bšÞÚèËI•јÖ\ƒ8\²äj'G; Zžc2N‚‘Ÿ%ü6, âË0œ -¤qpéuô¯øÑàÊЧ2æJÒå ónÀ” ûd¦®öª.H =^£,ú­Â7':UÚª.ªè›Ì:ëĈê±3_¬ÇT,€µâÕ>ÇJšÕLÑ)wXü‹ò©#Ĕҹ) E­i5¢–.³D4^ Ï†’’aìÉê£ìe¬¤›”ñ–ÏÄ£Z2*1J˜™¡¡‘tZ²&í´¦4µ¸x§9O% -RtØÐé9<:R†©œ¶v@sA ¤°?#”‰G^ƒ V.˜d€˜ ° 6U/ײAÁüJ½lDˆ p~&ÅVŒv¹-(íE_–× ¤Nw'ÇQWýòLzl?"&"6gѲ÷b™í*JP¬DÍØSiN‚¿· Ý>5Å9ðz0LÕ¡ô{T|$¶k*‹µ€‡³‡NÜ/wžÑ”‡0Ó[§Uzs ±þIùÂ[)oŠÒÊà!X›n…oØ*j,t@"äeVò…–e_Epÿ˜qe¡ƒYþc#b°ª?ñÛ”×¼æTÎ=õ²B†•ê9µÀ…ýJÞ+Ö… ™UdÄøj·s«QßÞ{ÃøÌ®©Lf¶èeYX¥±Hºâßì”yx´ú~&žg@Ĉù½˜‡ƒøÀ´%ºç K3u´¥8Ë­¹ÊªQ¡eŠ“>"•=:4´.úÚ@1(ý íf‡?f–2Ö`嘊‘ °™7bþpyÏ´üÀ3$ ÉpYê¡P-‘rŒÆ&@’òuŠj€BDÓCÉñ¡‘ÑÑ‘a“¥©ô(,Cq…‹Þ¸Ñ¥ý”½¡x˜™DoIc ‰ê¢ Eô\Z„PIIÖÌZÉ¥ÿ&“Ó3é‘ÉäTrzb*35rÔLjJô)ב&Œæ—“]ÜDÝËAƒ_!ç4fœÒâëM ŸI¦Ãݘœ‚_G0RÅ0"i£¥n(ž]/·æÔø©P[a17¤ÉoÒ —0—d+UC¯àÁéb~2éäxj:uôˆb¦( €jE‹ªƒ[’£›¢»£>¡h“…i¶²ˆ´ °x ðqÉŒ›’­2¨5u”l]«“ã"L )Y°—Z^E­€Ýñ´ü»>×%eH1'sJűR¦8Ÿ˜ žOâ¥Â^ »áBï?g׋ò¸|Uˆ«ÝP€ÉHY]Öyß!è®&¾D%4J 1¥¦0Í-y:Èà2|%SÂç„:Õc òÑ…X/“bŽU}#Å&Ìa_Sƒ0©láÎŽµî|VÆM0³©cÁ†Ôxow  YÚÏ¢•vK‡.y"_e÷^m!FƧ§’œ,q,1+æ˜Ba¸9Á+`ÒsLê¸Tj&£MÖ›%rhU­˜Ô(1P²¥ÍcèH+ å¸dhÈ,se^ùs8Y OqDæÑâP¨vÊ3:6¤ÚÕZ·å@V…\æ¥ÅÐwa M„‚¯„x2ËZqLéÃÖvµ7ð"ÓØ™i¨þvˆº™ãظ)'­&’ÎÌš¬<Ä0 áÃäã&wØÇ¨ƒMwÙ 2EÇ{©.œ2½P UI¨ä ÄŽŒƒbë ÙÁÑ…#Ý¢B$ƒnA ˜,ëúJ ÅäbÓlqQk‹#3•àt‹qQ'Ýcè •BÑ;ÀÞàMµ§°¹ôPèE´oŽ¢fÊæ×WdÙõù¥‰¤S²¼B*™pĦº-T ŽòÁ¤'ãAQEÔžb*ÀX¯‚wã¡ €«trãðê²^vá¼Ê(r¹ÛÁ²Š„$“B‘s7hÖ—é²Ì”ájëf±T3ÏÀæLxaÌy÷ŠŒ \ 9Ð¥ð‡™¡äØÈ¨*+Ó$ (,À¹ÞCÐ4ÓˆEY¤-D;ª 'A¥ÂàÜÀýú“=ÍŠ‡¥þS]È<ˆW¬K#.)ŸmK4¼ª¿Á³ÅŠ$]ƒƒÜ`Ìk@³uÄNSf=»:ñÕWh…òìIˆ¥LBÄ„k㕆GÖÍlX7“nÂvHÌ”R¼Ù—®fR¸î®At¡#ÌÜyÂmh¤E!èW™®.*šET·9Õ,œ&à9*D>Ç4R©TWÒU d¾3w”^!Ì›ðf'B›•ô´¡™©Qê€hSFº™°íL' J&§»W•φ (ãLƒÍ5Œ °Þb„–ˆ®ƒhW%Ö¤è/6 ˜üD®J™'B¡šKyîõҰߌ±'൬׻’$²Ïq.ݤŠïbg©á.£B#iqàú ºkªYjQÂ#–j‰[)ƒ;´5¼¶š,Jc[«ã-â%QP¸EB4šsÆ^Æ?0 ÊY¾X›Bé®ÉÐt‰o–î2xOLm‡°ˆò1|nÁ;e–î(FaÒ®Ðg¸m¢Ôz…±7§#©ñõ$ÚÉ £’+°e:¸Æ‚´èÍ€‘2øfåwƒó.OÆ>´%jQ¦T„ú‘-Á¶Ågª7ìàþÀdCZÖn K}ÅØèŠ¨J—ZΨ+±.5u43½Âj#,2ËL¸9xüC Y ¢¾%ÂzUµº®0jÃs=-tÈGÈe/Ö‚rL/HY”q òªî¬Ëµn0mMù‡ª&ÖŸÃÜC÷A•¢Ù0>à 6¶Çé€2*[Ré¦â•m5¯B‰/B¶“¹µ23:œlŸ²Q\§ŒiØA¡LØLd8‰ÐtÀž¤¤.k'`Dr³GE·‹%´tùžÍüŘØZ` [IjˆÔðnÉ™·e®è?Ý‹b<˜6ŸÙ:192ÎÜÖ¶~ñ|Ý¡ì ãÔä€ (®ävGE[‰èˆšûIMŸ%[ÁTr[½M¦¶6kK΂Ìn1Hÿ ºAfÀHº&—Yv€ôH£‰w#ã1Îld:íîÒÀDØÁÅ %’ ”r–Y&2]¢COQ‡B ÁT„¶IÓhn/“ÏÐŽ—ù›Ä*aØ2ÁË1hëTúN®©WÌô$3æ—ªûf0øC\!9š:zd‚%ù—!švV—(\Sqªì° G Å·rwŒ½ßê7[$áø[X}h¼ïk¡\bNT‘ê‚  ùVðºQnž"¤P• BLÎF*E—"_Ñ£\Bêc'µ1v¥yUбŠò T¶f)£s—Èä3–©D 7-:W+Q¾èÛn°ƒ}|eÛĺ#¡N}{§ô;‰zÊÀòœbôe%Jˆ˜¯ .¿%tP, ®üÙÖ¥óðL_ôî?jÚ".2£9ˆ4ƒóžÏF, Ï08‚thê Ô*<5²ü•)I\8G¿dð0d4±#È”˜À |åŒ-Y PÒ$‡>!òóvÅíJDóÅ"¹e5†\.H—FAÎÁ ÜA`N«ÑŒb¼*’  –­ƒ ’aÈ~gŸ²VÜà”§Ä¢óJ¸õqÛË´7ä<©I'•QE µ7jA©¹Å-oÔ™ QN˜/ëËøm™K(ã%î0<ÿ­I›£©uSÉ©mXÎÜ@n6^04:’Ÿ™$™g92k†I¤¬¢’‚\²6†,Yµx3Ë‘Þ1:›%@!PÃ4(Xµlï®öO œ’¬ˆ‘Bà…À07Ol Åa«Ðâ2àÇ M#oNâOT#BVoìþމtw,¦ü$è‰Å'¥öð$À঒ã,ÅK=±¢)å"Aª2dàR@/Ié ÕG8«š©Úò€c?´Ä#x†OÊ'¶ ¥âì„=fÇdêß.q»0=2ãJQ)P†ªÓªô‘¶¦|ûB¾”º1.}BÝ«Õ:X V&д&Ó™é©ÌÐädk㾫‹ã¦ÀæÜàý¥óZ¢«L2Ï`ߥBŠ®hŸ  %vÇʈÂEKÈ–9†_IÌÇÐÄØdjtdJìØÑéÌÄ8”z˜Â6.INM%·Q¹·ñ‘ ÉéÔæ‘ÆGÌ 2Ângå²/Ør^%!Cõc¹ï±…±ÍT…¯«/ö¸îóÁ\Ã*‰iT}w¯‡µK^KL.ëckçA(Sj—ÒÍÃJºJ ¯Ä“»{FfSÑÁ¨´Á¼¦!*:å ‘ú¨MÄY`冄—_ýX1=¹>"ùm ¿Œf»@H‹£z—|1zÕ( {Îïdk'G`4½¦Ds>?¬·ù7u["‚Ñ×%ìGMÉ¦ÈØ @Å3h *¨@SÅL#Lê0ÁÂ:ѹà4S„}·Bi@'¬]Í+£[‘¦æÈÄhè×e>UñTk?¹°"háë ƒu,Xa„]a‰&‹G 2F¼@c²Ĩ›¬Zŵ¹àT©æ5èJCÁ±N<§‰q¼È*˜¦RX†6DpOë*qúŠÀ †MÞž£Çóå3ä ,Ý y…¡³7šچ‘ˆR"Ô“`.œŒÔìR%2·R¯>ÒçRãC£3Ø’#޳m“#éå?“°–z®,þJ ±C"EÇ”Fʪ-«ª¼TÖG%AÇD'Á'ÅAŽÎE-29ecˆJ÷ƒ Ü€Œ gÆ’££C™ødúddlB(º±2'å êÔpHCrÐ*X4àE"è:¦ÆRÓBâ„â}[X×lHp%Ÿñ¼ŠörbÔ}iÞ RÏæ¤z ’·6-NBÊ«n¨0VçfQù'™Ê‡\¤±ù²Ž¯>ŸŽÓãÄ#)È)É+ЗP˜Kn‚!a^HlzðÖµˆá ‰EJÄ¡cÏBÍË};˜ñfÝO†àûVow$+¾"¨/3v%ôgÄ[Ï€"Ô©¤%þ…g¯Ç^ŠA˜²Á£TƱ~éo… )7Äç1ƒëM®¬I1ÛÖº"¸Ñ„eÛÖÅÜ”´NVÂ_Õ:ȧ.üÐj \ßNPÉ×XúPUj\,YUñ ²›9ç›JД­¤øGõf‰Ò`ÖC}d§¡Hq’+˜Ã{qÁ^Œ.Q'Ä.FD3 ¥¯årN¥*öúÌÌxzrd¨•¢ ÷!C 02’/‹ ZKô¼ÿ…lèô< µL‰”‹ªd5Ôõ¨WŒº9–¥Q¤”ŽÕ³•Cñ’‚xAÄ)¸™d´Q&˜ï^ÇwY9e ,ñøVDf¶’sp¡´:ÀhN{†ŸN(óãVÛ§¤à#p{[{{Ôš¦æ`VÉ塬¢]Þ)³#Å™N‹¨{h¢·ÌètUѨøu7™ÁèœAüŒþ ܳéé©™¡i1 ½™äððKÒ{‰×]*.¡€`ò™ Ì—dÎóìBB$“¤W¥ÄI´ÖX˜;³¸È™£ ®8%i÷¨Mý!yYBÛ-ÞÕlÉfÄ­ù î^°óì!ìVk¦Aì â;õ¼©¢×ˆë7ÃÁˆ¬Øƾéƒ|¤…C‹ÈFƒF0˜5•¼I‹%ªz|#BôP‹]Eš ßR2°3b€3R0Ç 1‹®_æµ+ +ÎÕAƒþU‡\x‡áÆÓœ¶ÄÙŽí»JX麰â礲”1’ ¨*{iݰQ_–èÅž!ÓØç üjˆ„-F7Jm@„iòÙþvUiÖ¶°2aQãêNãÿ`6sjXú®tpOVP—Ì­ôVø²fÓ:è†ä ßÚÌÔ¨¦gGТ'ËDô €ÃGÓ¥phsOOf'†äZðªõT‚(°#/ÌŽt%èå¬õb(ª1 µ0Ô? sž¬6„T ý`W«•ÚÔN^"™ÕGÕ.-q®¡¤HÃZ(¢ÏEÂÊèºð…4)× t²cÕ`ÈO• Ã¬CH±6Èlm t›=%µ.ˆ)£—§ Ho"( é×*”4ÑËÖüM\ÑŠëþ¿ÕÔ¸)ñ*mÜILGA•‡2ØôCÚueO̧€Ò.þˆGŠPé µÆXmàΦ۰̽\C”^›}U r+鲯B}EzYRÊ7E`˜Çé2½ò (<ÞK© ãÉÑÌÆõg&9=1–ÊLƒÂ152->ãDÃá&§& ¿7³±9¨Ùœ) KcCª||ò/Řˆ´|º$r•H”1Y74Œæ˜ÂБ=Ã^f7_¯DÕ1ˆý|·uUiˆ#¬“q©R†zêÑþ ±0%4a*^sвÙò¨£ª³À"j( 4àVe…A<Æ¢S3}íŽ~®vÉÅåéj2‰#9™êL®Ká×sT^˜¸ß¼*Z¸‘ Ëõsuß0ÞJņ±IÞ€x˜~¾SGÿ}éÆ9NBðBy01~âû6ÛË- ø€¸Tá©‚àÝ÷˜Ü0=“nZ&Њ–º1R“E†Ðü !üŒædU‡ -<ì³€«_D÷H'R#‘2d(¬FòkRÚû”ŸŠa`puR[C4t@ÒQ÷7ÚªF¦¡ª+Ð:·6ŽuðÎÿ`·³+ ONOl)®ÀÞúó)†Äg TéÕ‘Ô!\cЀ2áÐ ¤t˜¹N?,С ÄD*®âu˜ g¤!LMfÆ'†GF“ÛTé]d÷mZIôÆQ––¢½JÞN¬´&Òó¤à^¾¶n a6¶tÉ<¢d}É, € [¥VU*á8(‹‡²l„à SÀæªá1ô9Rá'oQÎ6SŠ‹§õƒ!ÆOhRÙª¸3]ä ƒÎpíR2‚r\š²€#»<*&[ClÞPQ…3dÝ ”Öå·Åà‘gGlA·ÕiWd+u™7Ÿ‰´÷’k5ÉKiÜ4±ÆM£ÂÑ”­»±/(%7ˆïr®¸OT!PoVtjbhzTœ—CRëÑÄ’äZ »é¤åT)ó"ÌŽãm¹·žƒZ°®#Ϊ FÅWlð% ñ†D2ÊŸ*«\_Ê•Tï~3ž(q® ;E¬JQE’+nn碡•VÍ^T-ÒC¨‡å‡òH|ú®…‹.¬>]‚Ç TÝkâ›È€Ž®v™*lg²_ÀF¯Ù ë;ë‚)OŽ ý–MÉÍ l‚š½+œmdc«ó®e†ªL»öQ¨Ei‡ç%Ч ÷~§ãTˆž‡_(6gˆœÄü*b4B¤ÀU F'¯ëÒE¹Þˆ¸uAt08 ëYV=;'qt¬¤Ìü–`ž`*B Â(ÉY^>BˆeœŠ9ðq½\­¨ƒBæŽÁâ‡pö‹íœuˆº9ßÁ%¡q¯,±A,Ðï\ê(aÖ„”±`–<O+ܺ÷*_£VuKÄ8Òðj 14SOz‹‹ÏQ!\'ÆôQÈF>RÍ1T« õH§äcJ‹Ÿ¨ú· ‰úÎBNʰËYå?5L„"˜5Ï}•Z— Á³ƒÊ‘,”Z‡A„¢srµ±¶c}Ȧq-é|ÅÄÛÔOÔDï³­é‰á Em„Õ@Ñ3쫼[>;Ø‹‡‘HCvµèj[ŠQ±èòU Üã0¶Vˆá[bG7v'ïåÐzwòœÇ‡†˜QB‰Ó,ÒM|‹h¿«^@¥˜µÅclü8.vÉCÙë!-äwD©./¹{ùôppÝb$ª€)¯ÑÙg…Ðâ†À&¢fd]®!Ë@äH7YY’yÀ¥¹¢K¬·ÕE.% ðgDMî=~×m^>AΡŒB¯ØÄätfjb:9= ®gÍ3dÕDR3¹':T¸,Te½Ô?uÁûÍOq1/»=ÃèCR22®@Æ+Ök°¦T´†rŸa½Ñvgê`´lÐ3nbXåÕµhðÄ0;‚£¢1¬Ì1‘vŽ=à°üÊÞqHñÕFñœKx©â;³>'‰ˆU­Y¢¦*œfýÌøØ^p~@Hff*($׎d’)ô¤·0ûõ²nJŽOŒƒ‡ågYû»ùÍá*€5ÕTŒãoU° ¬ Hߣ2“ {56EQIã ¬.d9{e<à™NØ*ÑÿÝ.¡ê Ä_ x¿’RiIVr¨ˆ3xŸ°‰®j!>NjMÂrG³IJö¬›S"è;³L¨ÖÁ^ø¸âT…ÐÄäÕ£p‡Àoã"œ‡Ì(\ xÌ;ŒÂºD„H fºb,‡I±Z,¶ %„Ú’OÌé·ßÝ€q1u|w¸&ÄýŒpÓÌõÆx̹ÊÕâ°xXIÈ‹óG–…vyÃÙÿ„‡Ÿ…§°² µs·'Ü!¡ÁÃ|mD0Y¼Šñ’ÜåtΤÆ'§&6LE"ò3OÊ”k$Ÿ¥@ž‘òkZü”Êì±Xf&b¬Ñ*N zRïQ‚šL”€Ûœ’^œrÞœ]‚äÈ$¯4Û³PÙÈÑ{¢’Öƒjù!½Sâp…z‘\4êì©:”Jo£R&ÞVØSiI™bJ{&àQÇo^_’Yó(âœ2ÄÒ ½cViM¶2ÅipI$(­Õ°6¨v8ЀÂÜùYË|ÀA»²7ðô'ùyEfÕÀn¦7¤¬±ÔdZ¼¡˜\eŽÃ£Cz¶›ê;ÅvÅ)ˆ´C7RPG’佋\™T;7’¤*.ÃuE›Ç…&ÎUï@gg/0¯*¡'ðN8%“5”*°3rÌBZ÷Õâ¥$Ђh;¢€-[Ö)qrÁÇ áPdÌWŸœDn¨¡#‘äfHA„ãô0’j¸8oc‚Ýy0Âñ¤ÊRâòcøe ÷–À0ƒ+'Vª'¢;êÝïh–©æ~^úb³spe¼å‡c†&Æ7LMK"uòjÎpåtjôµ1¿Uö óP¨µ.™N û.½‡™˜_¶ˆÁ92/mŽnæC¦»5@@\/tú`„ä.×§]jh(³À˜eŽF*Öæä`>S“ªnS½ÒPÍ´I÷¥©£væ·· åñÕN¹9¶ªÞ‡iA‹ e¶¡…SÔN"]$ŠðZZu(2(·.¼Ì­&à¯óˆÚÎH^ õëaiúçB¸²ÅycµÍ—ùÆÁ(iØsòßúÊO@µÆ§FÚ´1Êå¨!ÿzé™.µ!ˆ24]z•¥hž‘ ÀÏt)zq¤ë#‘‹ÔF#ó§Z°ˆÀB㘢ÊÃÏ ¤àäí’¬½ì%̤‘2ç$Ó{¨¸¶™÷†£et¯ؘöÉ…óª@cMBX)&oç2¹ùŒV‡ÀÄü(#TF V×¥†ñÒ`ŸÉ@²rÞ5šìT¤qn@•ÿÐüÌäôÄ8ÍUÖ‘F0)ñB1@F²À&÷ª;É{ "€L{…Ɖ3>=1ùÄÇÝ<¢”f\RE- ø|§§á¢ŒqÑ($+ãß ãJG¤uH¢o`YŠŸ: ÑW·jŠí’XAE p±æíŒ]å7X?œ9zdj Cƒ 5€ŠGŽâùsމ‘2«\èŒ8'@‘ †k® ¿‘ƒùh¸$Τ˜Èáu "šœšLÒä*ÐèôÔP2=246É Kùé8†W˜ÏYÊúþø YÛ6øDЛ‰A(\(ÁDTžæ¬×ÙbQQuV3½]z¥y{±Hø4°jAD (,êk(P,Z!¡£K½M¼»W¬¤¹Ü péfÁ|¤´£ün×ßÔŠ Îš7‡hP2(¸kZ–Í"$Rl‹“ÏFç‚@§@L]*a:àÊê|v™¡«„˜([£n¹¾ I? Ü<ýØB0­Ñ§¡uàHÒ.+DÝ]‚ÐD™ÆÆÎ?|XÁaéèÜ ’µÿTm žÁέÝBe•%ÐÂx)¡´P¸8W™(w¤/ 9ú˜ìÂì¼ï@VM¹d%ªœÚ³«„ÜQh=Yì”);2õS#Ò)›LºRZ8™¤hꂯ Л˜ù€R‚@°ì’D„ˆ¿Êô§9~fê'J~÷&fóñ¾ˆx„¡Å£‚/#‰ŒõËW^¨ÙúÄͦïà\ø@œÊú/7ð]¹áêrðrcHV®\i9X‚ªèÍJ‹>m¤ã4åbþøÙJ…H q ˆF%*Ý¥Á{Ø >45ºž,VñáçTÈÊcr; wØ¿ÃI\ÁãÅ$ «EÀ(´wk¬4YÑ9¤^ZBâ4ùˆÃ“l²+)½¶#Y›HÜi˜Û FÕ (C XB ¶ïJ\Æ~yWc]Þ¬š“ˆã°.8fŽë(*7;í‰v›>=Ñ®P{|Bàæ•í¤ U‘G ¸¦FFGĹŸ˜IsaI®ÞMø±›*svÖA_"`/ ”r_ไն³¦=Äõ}`„róð@­èÕ/yªÚ¿@¦LY{¬áöà­„P uÜša+⣅‚ ,¯UUªÕ®Pm <¶Œ^&Ôh枢‘y.6‚Ç3”1OëdZ«Ãò *]K’Èï么g{½V©ë_„䫺hŒŒ#¶£·{]jº J f£\Zf,r(zb|ü§ï –.Á4!Y߀(2…<cz Y­½‰œ¨Š}«Ì|®Û”¤ÿ2Ý«P–XP’Äí­ww Ê0Ws³ÄKÍÄú Ûf&Ö¯Ï4~mdâ⊠(½0Ø¥cof^CÑÀ+25ŠÔ„‡I ™á‘õ’.(µnŒÝÒÃ#CXôÓLj(^pTˆGšôð·ä ‘ s ô¥˜©du×ýÔÚà˜µ™¾/!þHˆê‰·- ›ÏAmƒDÕºR¨ø™ˆöĸH ÆGò2½ñö,+Ðã¥ð62;¸@»Ò9˜ ”ÀÞ†¾[Iý’"dºÎ´#®ˆ¬ÅpG‡Lè%F •a¶5«˜Ø*á0®Ùy^Ô¥¶j’7DS„‚qSd¸ð£V[gÞ™ï¬SƒøÝ`´UѲ±¥¢"4Ç´c¤Pà‹ƒÄäèÓËÊÂ4¢Eªø!¬aƒ$ˆòÆh;&Êoð8(…Ú±KdmÉGXn$5,1¾åE⤞ðŒs×1‹Rð0¸Iþ169¢V¤éÏ¡¦/Ú‹6V_ù&:/œq¼šâØwd"?í7_9r"ªê £6À”¡EÛ¹xVÓd–ú˜ JˤQ2/¶‘Yb&ë J²2459”I¦¶r ÎöB^y2àBåZ¶.]f™$TÞC"-¬:-`M,‚¯@"Ìs tËÈ»åÈ`³½†9¨%+Új^lë`ažQÁ+pjAûŠ“œÌ8-”5™È§†¦Ã¬œŽxOYÇÄ„tHô…ÝžbÉ7A— ²LË´~í#gÌ(¦F¶zsUA†SèJr‹‡LOmËŒ¦Æ7™œ5@22„ŸrT’¦ƒÜg¨õiÿe!àË,à ä’u)'òŸ@5j»\B@…š€c¿Æ‚5*žŠÚ€"Ù1Õ$Ï‹$#PBˆµ²:AñøþÒ{µ‰çÐj=¤•ì–-ò 8=hvìƒÓ,ì¦yjÅ)e¼©¤7_—ÖÁ/™peǬHÊ*u·øò){?94:1”Í$Çȹ¿F^*TÂMW‚ !V™m¥ÔÝQ¤ ¡ƒ8÷Jž8@À«§Z Å,©û1ímIúä<ˆI"²”˜>±r„›1„Hµì{RG‡Œ (7ýš¢ÎÜ8±­£Ÿ©õˆChßœ±jWæ0s]“¹šPÕðØ7"«bfMÍ]ßÇëƒ[였­îʈ•JI`Œ4ÔÒš7p(ºÂÎ.ÀI’œ™žKnHFjbGÉv‘ó!RQÝU¬‚Ȩ>‡Üj} íuèɾ«,Hñ •:Y ”¡’;]Ów]ÀýI‹’A|xåÒCˆ7sÈÛˆüi¤Ñùü5ªÉéØ;}%1œ]N®.ëYPa)²Ô:´ÃDcJñ*Ë ÙXÆ©Ð-/ ¨™¼¢êvÖ_aÍ»6R^çyÅzÑÝÁÁ´°óV€ŠÛY÷«Ø‹Î¬[î”=BÉ›èé hD¡š_5™h˜ðöJ‡a²¢_‰Ùñ$ù™Ì!Kyv1¼KYeõ*ÑÛk*Lù-–©CªDÇï3W%&/W —à<’ù+7cB·•Ps5Aá"€4´Â8A÷æä±E)ªéÑ‘3-·ºµº43k ÷Ñ»œ_myÊÿÛÿȼŒÄ£ñD4Fe#d’HîßõŒ˜ø×ÛÝ ?ã}=1ó§ø'¶Do÷Sâ‰Þžîx¬§¯G\Ÿõ<Åú¿j éebêçÿ%ÿZ:WZCÊ ˆ ôK¼1Û÷íÜ\,9ßJÛb­^Cå}Zøe¯èÍBµqóþ¶¡v´å…†BÞQq5Ü0 ®_Ú~â hÔt@Òž[Xäìpi8¨mÀ}¾WÐäsnMçXkÞp›°ÎAÊe‚ÀÝÝÀ ÊˆžÍ‚ÒBÓ`Á ¨SÊÌ‚{eEJJ‚ЉÐ^E–Å¢ri^´šÞ[æ*\ýö Ͳ3ÕÜ•Á×ëÐRì€b.Æ¢©ètT£qå]¸ÙÎ×¥zòU&f‚À’x~MÖeð‚Æ–„ÈC-Si¤³Ã’~7‚øè·ÁµÀÝ!7SÙ ÙE’) ]u·¦Sá^R*åƒC³EÀµëëùZZ¿î”dô¼/ÂÄÌ‚€™Æ•ÚÙÒÒ¢’'WHn3P‹VÀq¨4@rZ±4ˆÁ¤|h9‚À…p‹ÐVèÖhò1A¬üÕä{kô™äqÉp–~Õܿ㟠ìøg’Ž‚ë=S ÄÊ•ÜT{ËI-K^äWç« {n|fttÕ.Å‚AË»hzVQ.7¢â…v¿†ÈÒ3C@Š'¿tWµPùª¶ƒùEÛ™°&Pîj89Ä+aõ´¹¢±Ø*˵VËщ¬-ó‹?œÚ8‰‡LˆÂd‘? 2Å ]2ŠÄQì;VFç…«ÈÍ0N,V·|9Ñ|qŠ¥ãRhÃÎBOsà‘b«}ߌo©ZhWzR‹9Ÿæ`‰7[e|ê°þàd£i5GK´,¿cÙ:k¬ÀLÛsо³t+¼fvs¿¹^ŒËô„¬Ç°Ex0PØ8Ø‘µLª¼FÏ7O÷vwG_”®Xàík$ã²¢’SÊUÛ3®†ö6wwX‡-ù0¾"¼%ÂïÚšjWK 0®K=ºwî]î£{å£O–ÛŒØÁÁíÜ0jô`¢›¯&\ü@9@K__½j‰Å"¥†¹N°SRTÉ•×ãJa@^Õrrsa™sõq‰Ì%'Âô–%=+—%BÃ×ïIކ¯ÿ0%a:915ý‰ú¿$Q[ëù ®Qq3kÛ‚ÜzíK6)ïloÒj-÷D[•w¶ÿGúÿ?!ýý«ª¼\MY Ùr½”¿}”› ’·¡jÃ&ÚÚ›ún꺮Â}=:4±93²uh"©#ƒV¹Ó¶ÐÄ,G¶¸å4ä.€ôxä>±è·aÕ[T)†Ûdú€€—…é‘G†%??Hü‘¥Ã-A=~k­ØòιF(Ø©¤Yx—ãA+Õ¡é¥ëé…Ûƒ‡I¸Íæë?4°åäpïʺ{ªK«Br;ø†CÞú´î°šÏ‰8¬;–š˜ð+ìAì«‚§Ànï4΅زn0D~à)v+ºMº'QmFÍ-!¹C"´Qp7ïå?¼7øðÞe>¼×|øÉzµ¤”D ­]”3¸jh¯#êk©®¶§¹¬•j¹„äýïл—Úýyüyüy¼LyLÉpašZlPÊ—+³w×hƒNþ¹þž\ÇçJ ì@õAdýÞ>S¸c{‡ñÇŽh4 ½€{!#™÷à< þާ‚ë[þ uÌ0¬Úļ½àôÇㇽ؎Áž.hzíæÈ¹a/9þñ.˜WŒÐ»•´ÐÍBš®E:W¨P¨» Ó€áJq¡a¢Ðg•ZUÿIMy¾äræiSoâYÆA·L'PÀ_ôÿÇc „¨¸¨è”Û`ÖpéÂc\|&5]ÄÐq¬G5ÖxT©Ÿ4«æäZ‡[ ÕøÁ𤖥Nš¸ŒÝ¿ow#ñ0Ò­­íÖIЄæA± žPm°ì¢å !~DÎ0qƒÜÄØÎ Y¥?9<¾C.®“©rõ·ÆŸ_%±Fùk%¬WX´‡ÞÎÇ ôt%^"0ØÚnžê˜B&þ·¡;æf”=æ£-8œÂÜ’µ« vã6×{­ä´z!ek°#ÛƒAÌñ‚€f)Cöz9$;4x¡jW*Tû§û"iíî2Gzp¸ß}÷:Œî± ¨ð½y¯ú†¾PêJ¹f…Y*£LŒ¼n¹;ôM°X ø¥Ù÷ ÒØ@+!†û‰Œh:áü€·GÉ-¼qíÈ@ÒîZu1…ŒÆ©ã ÏÒ,&úFÜ9T †j¾¶‰ñZk |{@ÉTÙVÄКe‚nq)Z VëŽA¥æ)!(ÿå"UiGòÒÝ•]³\ÁIÞ!&ù°Ã`ÖåÞjä†ÎÒŠkl.ðÜI³Ü­îÇÕ­Aîœ-k¬øãî µ¶Tz8µ!5 ­¶[¯~µe6ßœ Rw±5§ŒI›ywà c^pøYƒ@EË“`›<šör3j!?£@£9Ñ¡ñà4êÖ›7Hû.¸Åš:ìµE·E"æw?õ…8ð⯠¬U~øøp`¾[ noXÀ4`n- (Ux³y§ª÷ Ëðj ¸ÈE‰F ÌdNFX[’¶„ hT,€ÂBG‹ÀXçÁ!ÂY ÝŠœe˜«pw9ñŒÈq$ .evò!p‹¾6qG»45¯ØVé@1ÕaÅcû·´´2Û•3fhÊ2ë.íÀbne¾›ÐˆVÕ/2Ûðv P¨1 ‰j¹ªt]¨ƒ-‘cE_Èì EZ7—„èÐÄNêÎ-¦÷/°›õ6<©×¦&ϲ E*¦§§Ìaõ ›¶^k¶Þa ¬¦2ß‹u10ãDFoÃ&;Û/+ýöpÏü%;Ö`Û]¿|#%‡eUcˆ„Œ'£Žó p„ê~šq·à|ñ@tÿŸ>»‡îð8°’Ñ8hu›½ô!l"éæ›qh)X–{ZÕØ˜¿ª‰ÒrjÑ×+xÌáû@É24O˰©a2Ñ•œhô±JËWö—Œ&±µAÒވ˵I{…µ2y'¿þž´KéÇj ýfް~¢ß®,6¨ªóK{Ÿ€y6îÉœ—qÂPÛjÌÈ °>9šØÀnÙOÌçðd»6=5Ã=ûoÆçë•h%_ø÷B£—ÆwÇ{c€ÿîëëŠ÷õÅúzÿˆÇÿƒÿþŸøwèäðz1ûÝ-‡^û§wŸßÒcÅ ç¥eõêÎQ§<+”Í^ñÉTçz·‰Eë!½}Ø–­µk[(½e×Ïœ)y·õ>ïÑOgNøÆ×nùÁ{Î>ê±oìX}ÝÐÙûÜÑÙøæuï™ÛþÉŽŸ˜:û Ï?öÅC½õÒ—î÷â][\»ö¡Õ7üâä½ÖÄþö__¿ìʇþVzúm7ç>ûÀ×~ì7>óž_í8å©ß{Ù+_ê=üÜ·|ç-mL_sÚŸÖ\è;§ŸõÝË6pÅ÷xÿÛßÝ÷ÐðÏoøå¥»æ~ô[ç}ÿºçïÇÜØÿœûîH½kÂþÓËÿ~åg.ýô…Ÿ<àö f>ü¾ËîþÜgæv]xpË_/蛽éî‡yóܯÚÿ¯gå[þÁcÇW?»!þÂï½äÛÙ]§5sößrík?úÔ·wýÉþÉ~´þŠÌ_}þ£¯û£Ÿë¸ôòŸö´Ý|×ßñ–á¾ÓîùÑÅ?úø3j{ï•ùð!ÏýÞ×>ÿè«ë'_vì%o9°ôÁ}.ÿÚÕþ3›üÒ›3?*|ûŽ×_;|Eí¡Oþ`íǾ|ÿé} »p°ŸDìϧLýö§om¹½ÿ˜¯¥÷Ýyÿµõ1¿ù™/ßxùQ§W¯?æç·Ý4|ðmÇlkùÙ®Û·×%o[ÿë_ýêžÏM>TyÞck‡ñž/Ü{ÎY§uoNŽ&Ö|ü†•_tÐAOùÈín~ΊMNÄ퇳_zôžùú{?õéÏŒ;kª£§Ÿ»ö…¯;üâuÏ_uÌ!­<í™Sçþâ]û\ýº¬{Çï^<ó¬«Ï^è:ûÀêÝï;àG-÷¿ã™Hì÷‡Î¿çmÇï»íÊ;:óÔÏn^8¾ô‡½/®}漟ü ý·íÿØùØ-?úÙêéw´|â;Çï5Ò÷ÅW½àŒ‹Þú•[¿XúÂú…“ßÐ~ÛÚï×n+ÿãÒ˯<àšîZõCqë1ïž«’þżžÏGnsw%N½ïCoßúì‡>˜èýå‘ç¬8¹­gõÍs;ÎÚrõÕß?käŒu}Ïü×uç¾7õÂôwÖ¶ÿUûµ[' î¹í`ç=¼øðÞνßõÀ§Ž[{æQ»~ùÖïuñ ÏÞðè{ §~âm¹;~ú¥—w|îªÛvüâý/ú‰ýÛ[›<ì¾gÝuÑü³³ŸÎnžøÚ+^š¿õ”SöNüö…7¼quê¶/~â…7ÿà”¶S_ÿêa¯?cú+ç_´éU_xÑGÿüŽ–C½aÕšÍÿvåÑîýÁ×¼ñågrÍø±S7ÿä€O^rùõõñÌï¯ø±û…c¾ygõäGúñŸ®ûBt!vó7_{Ó5¾ððù+¿üû7 þ–“OøêKó¿ìžþÙ?|ÕȩɎo¾±µÿÓOùàë¿)áSÑÿ¼ùýŸüÍßÎú¯Žzë½÷ÄO¿í±_>þ÷Ôû_|÷W¢Ö ¿Ï_W}cô¹½dìݟܧõ»ç]¶÷QÕ›žvî3öóO­8â’ö—^rÀÞŸ9óÝ÷$ßpêøÛßýãܽéWçüë„“ÿyõ_ßþÆ]{Jç.>âŽO­Ú±æw¿þôÏžóý¶;§ŸUü”ÕòûØö“O]õÏg¼ºãçï{é›§ì«}qàèÃnæ¿þµïO¿a=SØþ¼áÅo $zYX Ⱥµü˜^¬8“ö¬Ó9´ë¼]Öö˜øºg ÇêïNìhéœÂ¢yVL\µZ­.5âca¸Õ«9ÇLV½œP ¶w 1euN uBÜ7²«¶!·Æ»é–õž¸=Þƒ¹Ô9$˶¨¸]ªvÐÂúVç&7ï[Û[¨½–h<ŸqãÖxðÕÄ%vÍ:n‚{?U¹ “ˆ…žÝõ-“cV|íZù$c§úð¾)£†ŒžŠ'Zâ ”ÐSñXKõ¿âª¾DÂêííßòwø¾OŒ ŒüŸ ˆ1Åkúú[z±ûðWOOoàîÞl~àZœ!þ‰ßŠßa°ßø>Á™êéåÅÙ‚wÄO¸Í'0SýM&j˺‰£§7ðDMy%»ž©eNT_WÃD5N“œø¦ ÆøÏœ´ÐäµÄC “ ‡D¶ ŸõÓ¤ñÂäà$‰o‚œ sëÈŸraÁ<9ü[ocKÁ[ þÃköOfÃïîûž^s [qš¼¥vî@X*ËËcÉÕ5ìˆÝS Ó^rËu‡ÑnW¨ÝàŠÂ?Çí’³¤^'Ì푾„IĬžî«w k(à³â¬I´t&ýšâSqÞÙ•f`âŸðønmé¤F“„ˆµt¦kNi³Õ/Z£rF¸ba%¶tnåVº»ûE£bI‹³·­ÓîÌuæ;N¯³ÒY£êiÒo˜äØYíô;kH¬ÙYïÄ”m?çUÎÅv|Hï²â½¡C©WÙ¦yÑœ±!iÄûûk×*ËÙ>iò½[xlÝÆ‡_tùþ½‡>ÿœçîüãñ?ù¯·ßòÌÁíûnkä#É‘Wñº§Ç;ŸµÏéÏ<øà׿òƒ¯üêÉ9òis¿)=ÿyÏ«?Ç/>?·ÿôgë¯.ÕùèWîùÓíŸñÏýÙØ'.»ìµºîÜU ×_y÷ïøû#÷ì·¢ÿ­ÇÅ^¼ïÔßòç³ç¶™uî±óßøìß•½qÓ)¿[8ë¾­Ãï~ôÒsŸa>kß{·¾`êÀwyày×]1ù×ÛžþÞ«nùàÇß¶å7;ÏXüÒ†éþàŸn¿¢ú“‹òØeßúÔ#m½ƒ›þvÇ9¿»äüo~õ˜Åû«·ñ•3¿ùþpufêC›v¼øÊí¿ð{}ï‹><òçwÜùÞ̦7}ïw™ç?òØ^§X·Oýæð}gŽ?ï°U.Ï:ß~ãá-mçM~àcßÿáÛ¿ôÞ¶;~ûólìÖ+Îøëåß~ñÊ /?íö÷öΫ>è¼ï¨ƒ~}Âû^õµ«.¹ïÆxéš{ÿòá{ß}Ýúõý¯ž{Ɔwþô²³o©õüäÙ•§ý©{[ëŽw½Ë{6¬ùÊÀÀªÉÚ¯~Y?²û|ÚA?ûã÷ÕÞÖ{óßιåù›¾:×¾é†Þ÷oýÔ‰±7|÷¢‹<éæýÏèûG¿ð±ƒÆWÿá»/;òã{?Øw÷)\ÝvæËØø–cÿø÷}zÿ}/øÇBß^¿8ÿŠî¼eöµÏ‰íýœcßyå÷¾wÅe¥âá·÷¿kÀ]õÐ]g鼯;ý®ç®ëýUyÇ¥Ûž¶ùC·~tU×Íüçm‘¯×{òë?¹×±ÛïÙ§õu—½íÄS½ôCŸÛë%úÊFÿ¿úµ?÷ã~ç­ÝG¿kÝÀI/Ø´ßÑVäæ³ßü’§ÜpòâgçKÙ ~ùîŽ/ïuÎwßúžç¾÷Á ^þÎÄ?;áÚö kêyyÑoÙ/»éÒ7myAbë>7NUúdt¯}?pøŸ8dÅ¿Ö>tKáûGÝxÚŒ=vÿŸ?sþÉmgôžÃ®Ýqþ‰Ÿ»|ä¶ž›oþǯ׼æ)?üx­ïÊë_zû}/úøï~Ç‹Ï;³íýé¶ïE8ë¦ãOu£Ÿ¹¨þîó¿õö¹Cî:¾ÒîøÐáoÿAaõqk[Ê?å¹~õâ¾#÷¯]ÿåž5?ûW~lú÷þ`òˆõ/úþÄÿØû¶í™üõ„—}×ý·^ù¦ÊÓ×þìí¾òÕ÷vF2g]pæ†Sòµ~÷õ^ÿµóöþÌ»Øïîh9àK¿ï+ïýÈ£Öeç>zšÿ£™»ûŸ3tãÅ¥_ø½å—½ÝÚ·vÀ•~à•—mt»¸èÈ:ùœ»¢¹s}ãç¾ü¢gnþäÊ¿Ì ^ð¼/Y÷–ç¿ýËo?àÜs_Â¥›~vpä¦ßÏ|yð½×~Ãë¹ù}É}òwßzÍŸ÷ÿèßyä¹O{ÑÏüÑ÷>ý©Ë“ÏøÀá×¼oú½ûï×{åš×]wËÄki¿cõ†ý»FÏ~ ó]Ö¡ÛÏ|Îo>ýÕó~?ûÈg>}ÇG¿rý|楜ñ³É£ÜKbGð†_<í°K?û¹ýúמ\øS%ó‚cßðþ_¹ë8õ¦¯_wì=g_ù_Ï»úŽ}}ÿªÒ¯^Þ9yé×÷Ûï×}ëÎ?Ý~Táæ§¸‰Ÿäý!iŸüÖ±úê×~ùͯܿçç7Mð÷wU§^ZýÁ±¹½z^ü‘©Öþ7öU~põ­Ÿ(Zñ½o\´«þ¯×ýåÁsßó¡ƒþ|ÔÇÝÞ—_ø´›úv¾¹õÍ…Oÿå¾Öß=õ‚ß¾u¿/}ö¯OùÐC#_Í|ñ_O»èØçŸùÉÁ5?ÜÒr¥ÿî¿Ö_ó‹Üò´õî±/ýõ¿ö®ž“z‹uØì¦K‡ïþðñ_¹æ‘-ç|ðÙÜÝ–Ùÿè_'¿õ²Õw?û»ã¾öë×üñ¾õ_=¬¼î/s'–ÿrýØÚë7Ä?øµƒ^qý޽äù™Á£;Þ÷¶£>½ñ+ãcÑá ÷Ƹöƒßøîß¿Tkyô9m×½å};ŽH®¹£þ®ñ_ôtWOxåsÆ6½(ù×÷>°ß9Ç]ýÝwÞs߉s^y÷ öº½í¶?íÁ÷o½þ'µ~íw½îêíÚ¶÷sN/žöŠŸíž½ëí+Žºå®Û†+>öëû^Z9èk}×íýûýñ+#é×§ÞqàŽìÓç¯ÿxß9ø5op^·þê_ýî3w|ÿØáõ¯~ûÔïÜñÇ®9ö¡Øi[þyÍ)×ÈY‰#Ûn¸ñ3?¨ý<Õìâ­ÃëW?òÞ/oxÞ/®þ`Ã~oºøOCíèßû{_´å·?üé+þ6±}Ç©SÝ~èKówå¯}Þ¿øÝÃ/|¸kõiï<ù‡c_^÷¯m¼ã^ý•‡_ó£ßÌî³ê²+6=¼oOäþ›×Ÿq—óÐuÞ·äéâ}ò¯íx‡õè^Å>òú–k?_¦FÓÜîA}&*IÜmõö÷*m¦[k3ý½mFئ6_B›‰÷öîVéí2Ô™dçºÎ¡ÎáΑΩÎÑαÎñΉÎÉN¡#vNwÎtnîÜ&T¡Ó;U×ßÙ™ÚÖsEhV h*sng±êHw–;)˜èÖ¥u¤ŠhÍË£ª„,tËQ˜Â–ßQ˜ºãý½†ÂTß²Ïtzöœ¯Å_ùÐù¯ÛÿÑíO-}ó­·~yóο8zÿßùæ/>må?_ò…§<õôϾñ³C_;í³CÏ:ýˆ­ùôpïþ?üòôM_ÞrÛñLt]2¿úó¾öî?Ÿôûk?xVçï®û×Ý×åûãÕ+þ|Òûï^¼½uõ÷ -×üú¾OÜóÞomøÎûvmüõ7/¹ào_Ú¶ºüà‹î]³ö›O}í—ß}Ò³N{ùA?ûÙý7|辿«²sï>ó†…¶µï¾â¾ã~~˜{~bÛ ö?÷ίztÍ×ö= rô¿¾¾eíÑ_øWîŠÉ»^{Ç ·½ìà÷úÅ´¾êG+îüØ©÷=ŸöÛOøÆé³n{…ûê§œsEíó·=çŠsŸÿ«Óozø±“Þpþ…‡¾ô…«?öè9/è;é°ïO}uêŠ7¿ñÞÉ7ß³ßCïºå®^¹áÒ…;ýâ^\ûØqW}óšMoØüÅ/¥ozÙñÞ5þ÷É~é¦òñ¯èùð­›îùèƒé}/Üë¦uß{íÑóž3uÎE?£õƒxÆçßqôxéã›'o»ðÝM\xæMãHÿaÍ‘£?›J_äž±¦çÜ[xäMwÕ{ÓÚß›9ꦓoͱW¿è+í¿O{ßÂßn¸õºÏ¶_ñ¥È_^tù>jI¿é wöÖu}ûé±ç_ué%—Ÿ¯ÿù¦}ü…Ñ®["W¤o]sÙ‡íƒÜçî˜{첫ôûôþÀ+^µ£çåŸxìïãý¿{Ù·yÏ>½úåÚ®û¾ýª+>{ÕÆRÿS~|ÂÓ¶ü±cÿ;>õCßyîe—=çî/ç—§½éöK&.I^rá§/ýA÷Ôwïwê7ï}àóGµíÿÝ™/~çº3.ùîJ;_yˇ&“{ÿóeÕ̯Žyý^ ¯8«ÿ-ŸY¼ãêâžqÙßy˛޹ræ¿.?y?ë§Þñ÷ž¯œòÞW¯yè¾O¿èÄØ×[^úÍ_>õèžþþ—~pâ}éí¿›»òâW¼|ö#Zÿ·ýá+ý÷~ü ûÄ×<ûÔ^Óÿþ›‡/Nd/YuÁŸóëƒÎ¿÷'GmøåUÕ­û~_ÇÃÅOüxëß¾RÙô¬¯èÙyË™'ÿðÜ;÷®_}À^¿¾ÿ%O_³WëA_üÚ±¯yêg^ð«·'~õÎ;9ëã_»nøi;î|ÿYŒ¬Ýkä/='Mÿîþ;øÎS¯±ŸùÓg8/~Ë·ŽùôâC¿Øç=?þãmç¼éîkŽüÜŽÏÝòúïÿÃ/×þþ—õo³µÅÿûGîþæÖÕ¹ó§·ýâØ¯>·ã4ç—kžY|ç¹ßºu׃S¿~Í¿ö9öc¹í²í¯yßW/ÿÕw~·ÿ}ùÌ®Ÿ}øÃ¿>ö×ûn{Ù¦o®ìþíyOÿØwÞöž7e_qûÞqÁ)_ýÈf§ýâdOtì3OþÇñ»äùÛþòÜÄ—¿òÅ™Ÿ½x¯c>ivõû£?»ðú¿_wô÷<àÄ#ãŸÿíÚ½ŽíþÓ)›ÞüÛC~²æ®hþU׸÷¾êË»<î×óô}oYsû íϼkŸ?|ñií·¾ù«'½`ý ¯¿èÞlÙïé™Göúć^2¹þ9oÝû³s'ö&˜úñ×õÌD¯UxË¥ó“û ÜÐïòÑ‘¿toûÀ©¥o~ô·sÿ5yã•õ™~öÎw<ýë·­¸ôu}kæ¼½îÚúù›¿uÒú?ゎO½;ú•v8ǵ®¹µ÷Æ™™³>¼íãG/¾¡”õ6ÝvêyøôS¾>wÖOíûùj×›ÖnÛúɽyìG­«Þøô½ë—ïu÷é?ùAäwÖÿÕrÙkuõDåÝo¸¨foNž×²ÿG~þ£w\úÅ?L_¹_üð/Üsôç/yÕ_~ú¼û.yãò/ºö×¶>³´Ï‹O|ßaG~ëðíoüÉØ]wÍ\ø²™3¦÷¯çß}ámÏÿÛg¶\ûè]ãßúÆ7_sßûüÖ7ý vŶñË¿pñ]…÷l;ö£ÝOïzÎ_:þùœ­ýÎW¼üþiw_ûšgí<ýMk?üæg–î¸ö•ï¼ó+÷¿ëõŸ=§o|~õ^øÝãóü³.îþÍé–÷«Ϻûÿxçð÷¯?÷Î×?ÛýÜ­Gžûê}ÿ9â¬?·ðÆ_½`îžm—Ý÷å}î—³‰¬Oûe7½ûªäÖg'k¿ßöÞûÞüÀõ¹ÿ:ù’Ó.¿îŽ[?¸jôÌ-¯¸èºÜ¾÷l{ϱ |ÿˆ•ž°rÇ>ﯗßyï]ô³¿êvímÞ·JŸHwþtí7Þ|ÆÅ¸ñ){½öÚGÛï?ëü£?ßû«Î­?u̹¯ûÀ_®ûöQñÕ׬ÚxÐ_WV÷y_üüW½â¾Ú—åÑ?9?œ?ñ#·ŸÿõÍWõú®™çý½ö¹•Oûѯ>àæ¡Ï\øÓwŒ¿¾øÕíGžòšöz_O]û’Ë¿¾bçeŸ?·Óýä‹Îúâ «^¾ê/ÿÓqÌ?ã§g_1ðÝžÞÖ ¾øÅáô[¹ô¯‡¿3{áùy/»fþ_ÿá‡\¾mþ¯ùíþ»_o}«í{ŸŒF7ÜõŽ‹~°kô7÷ß9µéGÑû{Émëš>ô™×~?7ù¬Ëvöÿîר?þÎûÏ?þ±Ã®ù¯î·þᤞúé;¯<ðgßêÓÙß8ôØÛo^øÜ×;ïgG>ò©ñ{¯üÛW½ÔUkûÇ-Ý÷~ë9w=ý[º^xÃÎßÿ9ºß[^ñý—%£±¿ÝýÓ¿¬½îÖ¿ìû¡jÿà!«§öÛ×sŸ}Ò_f¾pÞ×xË›>ð¹ëK¸æ²_/üéYcXýÈ›_ã}±oí³OßvQ¬påŠñxÀ—:ñ¿õpÛ÷þÖ1m;þqÉy~î]7ÝsGþþV|óþ¾úß¾?õÚäÙ?ØqÙÍÏ~æ1¿9ëª÷ÝÚçY÷ý³ý›¯?ýìW¿rè/¨{ñžðà/ùëeÏ:ïÈó^Rl¿Dè-ß>´½–>j1µø®ç<;R~Ö3¶¯þÝï=ç5“¼ÿ”cª[yø¦÷lþä w~ÿ´Wœ¿§ý°ÔôÔÔô™?]ó¡Ï>ì½ßùùM»î¼eßÜð¥Á—þ󓟼?{ñæg—×?óÏmo}øçw¾ê– oüاbßúÔÏ{Ñ1¯ýãWïþÍìûßþýêçŸõ¦Ä[^25qÿÝíøÙ‰':¿#và W]öØâóG_[9ï×çlZñ–Wõm}þÇ7ô|#ûè‡ï=`~¨^®wÇ›o}ÿí]7Ýñ¹<凷x+^ôÏêyOûÔ™ûüùE/ž¹ùÃ7¾ä ™÷>ü¿ÎÈŸrÆá/éyèÅÑìÝ}ß•™yÖ[O:ømÛôàÅ—öm»ê¡G^Ù}ãÙýwïûô×ümãûô¼ùK7?µwrÃ…?¼¡²¥’o¹èµÎkܧ¼áоú¾^ŸÏNî¼û´Ïîøsç?9æý'üæŒ]«ÖóÓ©ù7v•÷©©_vÿì½XSÏÒ8,T{/jz‘Þ;ÒK J‚Iè (*ö®("6ÄT°WDTT° ;VôÛÝsÒ(êïÞû~ïÿ}žËóh’svgwgggfggg–øq¦p~.·Ü!OÅg7áœO¤ðŒÐ—Oïo=TdX|m†³‚¢æ¯ÁUå™Z[G_|âZ1DÏ[yUd‡Fî&Åa÷Mn(G>î¼qöèÑè[ò¯í&¥ë=\¿¨:ømòä“O¼%㊜š¯ Ë»{ÙiA}ÎýÍ*×_Lh^øú<-yðª-†Ç|iM¢Yj6Tê}èÒk?: ·œ¹9DrΕ™ãe+ôêÊV……Œ’I8ß±jcFm­ÖÖëû—ÍÖ)¡Çk”°–¯SSyüQ"p´2g—WÍØÀÇ ÇÅš†œ\3ëÊUiêÕG#g®šzZȳGU#­ÎÝ¢°ÖÒfŽ095ølŽïø¢è¤ÉÉòqÙSƇLycÚ2ÒjÕ¼‘‘„í¦&ã÷clã»-ÚŽoý¶÷øÞµ¬‰M6™Ë*ôšÞà¼ñqÚ€ù#ö?¾%›æ¨xÜÏ7ÛïÅE§¤›“ß””åׄ¬÷XëQc&–¸.V·‘û«nÚ̈,CM²×zÙUW?[]™²?bnfeÉ‘ ýgkÊü¤Úåɳ>ŽyHºýÍF¹óË’üißwÔÕV=tæ•óØ_sÃ]m¯•ßù1"œt>ªS3tÙÃãGk+O®›g´bdzAÑ_Ïï½ÄóiU|Óô£¹$½Š†Šò²#“] eÖ6’_)ÔZºl˜ßÎ-%K6$=yæôèÛ’…s.nºí0Æ4κŸXÍÐÊË.}LNŽOŸ4i—é§EWî¯7j‹¢‹Ã*å¦|âugI,›¶¿&äsзX%"ãå¡—³Hµwüµ¦])¾’lIJüða>ûâ"•»Ï•wÙ§Zʯ]ÝRºétAGéis{×Å^rC%¦ŽU<¿Æ”0%&Âpß#÷Ê!ãå‡rƒÜÍ«×6©–«¯XýÈ(4˜’üEõÕ¡pã9OÛ]‚;—²ÎK–—¥NØoi>%az”Á…µÒ>ñ»†ì¨<è{ÃÃjCÑ®¦Ü¹†'ôF•=ëú6ñÁWÅöŸ+]Èy©¬@êÞA[gOzùæ¹yÿbCň›ŽhyÏSp§M³–?íEñb-kRéJñc…œy61—Ë$uZH›’UOÿœŸP0*æºT扼ÍEÛu‹8Þå­¬Æ åkoŠ_né$ÌM»ú=¿.w‘®Ö—©+Ú^ß›Û6˜*>aÔÌBÇé_Hûú¾dyµŸÛvÙµ«"Ë.¤µ;¼U¾¨óÔø£ÔQºtû´ŽØªUyZouöu] žZœR?éAlñfBë9ÆMç¢U­Õµ”¹‰KfíY‘k´CSm¸sg¨»a«ÿÒÕCߌŸüÞmê%%eOéš7-ƒ¯‘5q>î–l¦dTéþ5µúF™Ìø¿”¶Û¾ßû^í»¹é»3›‡„H$^×ôö1òþèÔý'†ƒ›¨íCS}¯Þ©,öÕoñÎù·¬äXÃó«,ìFÎT¼}áöèœÃç£_½‹#[>ž¾)IîT[íÎwñ%‰N…3e?Ö¯êP­fedòeân½a±ÒÃæVmaìþ,]¾CJq9½kù©A§cj‹+.ï’q¼ì“~å^ü©LÕ†y>‡}ŽÞs&~ÛöC{ذþ¶=Þ®1¿Cü³ÚÑ+vÏ—ÝØ(Ïy;‹U«¹ ð"ñe×™ûïƒýÖºê$¼û2óËà 6G°s¼çÎ}j¬mÝ9'ÇC Ê^['&(X?i³VxòW¸ÎÁ¹š“–sTɳöÕ:•ÂÏÊV'ð`áâåæ1ÃÜ—>9åsôVå}ÛMñfWz§cêÆÆåwˆ/*¹{»iÎÅO{®ßù+=ãl¨LS”ª˜äÙÆàcî7IÇWLø>2uðw¹ŠQ÷,¤½ ™Nû~ðŽï`ÝÁ©C?Ô> 5:°p“éø µšÁÃ^ÑcÚ^ìXÛAÞ¨éñõúÞ¼OÆÓÕ×§˜øos¬.N»þØö-u‰oá´­cט^¿–—ž~m©Áµ*?ζ+Fú¬öMÙþ]ßË¿çíßöëé7㗢煙×ΰðÃ„Ž€¦W¿6ž¬?i’±@üänË¢Ù– ÑÌsžNr/˜Ó.皥¼à$¬\ér¹³à©æ¬ÂErCWX…Tm¯§i$‡ÆU¸­–ÅS=³ ´fÈÒ¼–ok&IV[¨;^>ðÚ _ÚÞê§wöè©/)£¹hN_ë4Aš5ÒÀ|úPבwûO=/–¼Kç³¥´ƒœöÜõKFGÙ‘g¾íÄÎê6tÆâmkÕ;f®ŸÑ|$ëûj·cT=l5UfVôç¯2>úž:s‡\Y+›‘&e?Ø3©HJÚ¦íóŽTEm·‹ªea]*g¬÷ÿ¨ìÿÍòWÄIsé°ý]CÕÙð[çã]à3jNÒ›•ÛŸï#^NúÚfuätöêùÒ‡­7¯[$k¸Þ°üøé¤ÞPÇmêCãrܤ%÷Ny;Íp³ó÷ICo›ÿªzüÙ8Bî÷ç]n™øpßr“ÕgRÍŠ>Þ o¾9Àbåâ/®œ’¸0&ü¬ù®¢XÈ“¥qã&ÅI”õ œðýœâµÛÃUb³#½kV®Î\“Ha¥~ÛCìZNÝæ¡¦ñrB휩k[Ž<¾Mš3gç/£·Z_ò~y5,4¦l¦§Œ[]daêé¿—ktáyœÅ÷yN–Î5v/´¼\Õüñ:¢°¤¾ya–®Ø1mbü‡ÔÁ¿Œ:´"c¦ìáη?”ì¶·¾Y6\ãçÏ\û®¿N]:?†jDYt{í //Å÷ ¶vä)3;Î)sÄש¹Qæ_~°î‚n´]™øøÖ£êÛo °›h×¶g¶ã ½Õ±IRi÷ïÊz³wš{úb=-çÅž£Ý%ŠæÔŒ0Ù9êÐÙ«•¦µÕ9L¨ö!í­§ÈДoh¥5zD{ÍxÕœr0ðõÀ°â—›Ú’6ÍXH¼öÔwÉ‚ÆóëÃíjq“_óÞ:`u¬÷¬Ñ#& q.q§¸»õíó_úîä±Û×ýê] ¿É%ùŽÓ%ñL[ÛŸŸÛÖ'Žº›8îýë¨ÉÎOYòZÜ~k§úЯq“ÞÙf·üH)‡ÎŒòXö‹x›ööµ7”uzKIÔ—½û§úxí‰n046¥jÏ÷ñ'šVåɹŽNÎ>œzyÕ¸LŠ‹»ËœæŽ+óÚ(£üÛÎ\ÕÝžg2Ë,wš¾¶ZPQ‘áÝâûó¨÷+Ó¾Ç\|ו>sAúF*‰9`ZnAÇʃŽw^TÎ90{eÎíÚM›Â,«õnß¼‹\T5jˇC_,ªÜwjí¹Á6ù½Wúaó†´§WÌ^V=¦ì9Qææé'¡ÿüÑÊ)3õ¿Œ¨1rÎVž{$1-ÑUSù߯ɮu3ÔîÎmb9eÁ™O“³úŸYgg“‘Vn%KRººá©ØûÈkKhÒi‹7:.ží¼Õ*ÛNvÌÁOÜæû?O[9¼ãÂâ7ãkŠ ^vžë~~ó¼S ªzF_?1vvŨŽ/´ÇÈsic0m•T˜œá B^Ñë¥ N*>œ©õz´^ù­«ùÏ×ÉæM|³g¶rF?%í¥Qg·\8$¾oïÑÃà§âǪn›uËÝ4±nÓ¸PÖ©ävù€ýšJR^WÝÌoô™¢#î&yÅÅÇ”2Ø´õHÔÕ@ñµyµk› k/ã°eôy¾^ò$ʪ¥M[hKâ†õky’~,¹Ùi°ýè1]·†WÝUÕŒšÑX`Õ¹å@éÝ]Ŧ Ö¾£vÂæ[é‰BëÐYÚçO›}ô©»-»obðl}ÃHÅY‡æš±}r‚bŧjiø½tµPÿatŒÖÌ®—i¶`†ºuЮ¦}?'L¯Õ;Y cûú×G¥5{Îf¨Îj\ñ>XUìÚ£³ûv¦_\ÑšA9¡%S²ãàñòò‹÷crÊÂóÎí-ï§uçF}Ú{§Á¦9Ƕ™E›ŒöVؽa£ã!3ÝÕnìˆÞnéÜV:{@.y×¢÷§Æä_¼adFµˆž~Ø,Ï?HqÆÚ±žÄ4µ~rÝ®½tåðSw,ŸHvÎ=6ãþ²V™ y’—^rloÈN« EÙ Ó =qÚF_⚣—ÒáhýÊ+ÖoŸ*î®jô»}&uHÛ¯ŒùËUNLV2È·ðÛºo³ßpã†æ)ËIŠ´¯Û6Ç}j˜î•¾´2ÿEþúÚýïÇ*7”ÓÀ¾à¾¹fK)‘M<|rÞ«¶¸ñiÓÔ›~>^Ú5jó»§Í·~WÍÉÓ]˜¿äÞº{Ç/X½xs%I¿3ŽctÛ±0³hJ÷O½Û³Aµáû\M*iöä9- ¦Sr(‹}o= JÛR})ÿµÜž™so?ÿq©ÝyÂ;âžhíŽ÷'ÞßÑHUÞÛ¸7jýñ EcFðöò l³ö̼<³p÷åu*2w‹W]T³X,§voV~}ÎØ¼/߸ñµ]5”Ù³6›Y\Ÿ«pÕjÜ3‰íCVŸío>+!ñÆ…}%ãî ’>±êABgSì>ñ•h‰J]lî P,[ªÐqIiåÀ'wì—y÷r὇ ž>× ŠÝ³ð!!F<·s׹ˎÓ#žÙ±ãý£uï?g|¶?“R)®éºµäMÇã„2픣¥«çüúyóÍ€ëwNÎÓbxÙÝVe»°>E¾ðcµ’y†éÞŠËŸ>Ø/¯½ß~áé tFß[þHñª©}Ô ±õ«ãõËܤï~̘³ñò‘Ÿ×®ËØ0¶>»6,µy¶þ›œðÉsW¦Ü©mO’¸Ì^n_®â&ua¹Ê÷‰«¾- ¿¤Æé¬É›ÂŠö¨yƒVwy[«ŒØ'w3Eâ•mû-‡óêHe탣4IÃ+Ï»¾íunrå£\’ü†Aë6[¨«’<ߊU==u;Î䣱Öì_?žg’g²&Ìø!m÷‘\$'9cvªæÜé‹^ÜúÃqÜ€KÒWãGÕ›øpÇzòiZÔÒAïZ‚­ýO7Ìwé$Û±Õyu’îìA!µ”ãÒ¶Ðç&¾™\)îÿa딋¦p#œÞiìÿ4&ù>«/›»ó`tþ=-zq/%§- ýø3&2ò¹cÔ/}ÕŠ–8™ýoã¼u¦kê·:º$:AéIAÐë§ÜQ§Å«¦5˵:·ÛoÊw&¶Þ™sŽt½à Ë](î-ÙptDª ýiÂÓe5¬Œ#óÓѯsBï&¼™5…qâ®%ñ;QCu’RûLÍ£7ç”>#OíAßtušÆÛo§õ¼—+¤Ög_)Rÿ©´]*|DÎÌa×c•RêZiîwÆnÑ©\¡4`´eUUCúq›$ĪÂ#Úïè,ÛrçxÍ£CìÍÇwåxxï][ÿ‘•=";ëÌøðL®æ3ó›‡S©å#¶=ÎþRl@Ë·Ó­[ÅÏì¥Û¾\¶/_ºrÕçßoQ“uRêF¸=j´2•r¢EµÝóˆ]ŠÝŽÜ9›ã-¾ºÅ‹¯6šncº4MÏ*ae…o ÑõƒÓ[ÛÆq®o|iìÏ»·‰a:låêY_7g™8tý˜ôy¤ºÉõJ£¡Ÿë[ÆTùÞð.÷û®0tÌ’‡î×gí;7m±$iT”寒"‡3ÊoÙkfEäg‹„ìqxæÜVw¥ t©çM©Kñ£FíR9¶ègõÒ‰Ò/ u‡\8;éX’Ò¼ºÞ—än}tÞ¼àaƒ¿á«sÎ}hssHŒ²–›qÕùx›Ùž¥ܽ¶mÐ\1¹›?k®•¨½~PÊ•x»DåÞ\ ÷ƒ–ÖzˤÖ]iõšùq‰Õí´VÅ4Ã5)—Þ7©[k._,~|Ù]s`³åÂÍ{½´oÔ0 ;Ÿ¶ýtÍ;iT%ß²lãY·ÖSmå}²Ì ïf4J¿W¿ýYQ¼÷)ÆÖ5±!‡»ܽhXRÿô]%Þ½º3¯ôÙ³k×Ö†›ÛosøæpìäKìïs¿ŽuøyP¾%V%*J²x؈¤;üÕ'ˆ«dÔ)•­;ÿòf½ÚyÊûMW¯_Ùg'v°¥ë†Rû˜9míUr± ï={†]3ýÜôoÁ]¶ò©3 |c±¹új’™ïök³Ú$Ê2Co­pøfÿh^ÁÞÓfv?¿¶šNŸöeêÁ7o79L4á‚dm×mW)IÍ”ªûñ ?µ–±sGÝh¸^;,r×§pŠÜŒ&¥ø›»w©¶ õ§êÝ2*3æ¬WÜ–7u( +¾V8¿Ê9Vfï'†æ¯‹×µYKß½uE…Š7C–utyݹ††—"<딬«zý…®7÷Z!ö`¿¹ù ^>Ì?1X¬S©Þ*yÐ’ïìÄ ·ÕuþA7¶¿¬g—”]w¿üNµn½a©«ÙLÏ;cn•ÿ–kftrè¢{„ÇAoö™3_ˆ6“@›VðëjÐçŸ-Ÿ8wK˜®Ú"öéðÕ÷Ê&Ø¿ Þ÷¥å„è]m,_ØVwƒ{?t]]õÞÕu6ŽòÓ½ê/êÞܺ-tæÖ´GnÏWõVë…Rcûš þíjº‡«öÑŸø’¶[´ž½(§½F"y}ö GŠÕØÕ Ñ‘Y²GmR&ŸKÞS,9‚>2'nƒ¦…õÃõod%>(VIc«ˆµM=qTmfµ†lNÀlåb¹ÉSÅÞ¼úýBjYìŠ1u^N÷¼wŸ~T¾ïµ÷,Ù·Fç(íyÒï-ûKÃæ¹ç»’rl>\[p¼ð£eÁ-Ÿ~ÚSò­»fü:£tðÄGÊÊíy]?Wü¨ž¿äÑ–÷©-Ó[ôÚ¶¯|™÷20=Q½> còÌŸÊ™Q™®~õ‡&:,úõÓwÓ—õ ¯qË?­Jÿû†Ôïšxܬo×ßÌt5lšzOnÌÁ“Ã_^øø*ò~ôC±™;oª š>aÁÓðVuU“<™7öÿŒ»ß²6ãÉùvÆ«w—Î+~rçÊéÚÍgüš3v军Ÿ¼SR‹=`í'Åiuƒü£¼¼ ¾>¿ñ|¦áЉœLòò+æ‘¡ Í_KÝý4éÉê‹•R›*ßNðš5køÉ}E‡(/>vÀxU[`ÉëšÇ·•®×y÷`Öê2ׯG´ü·™·i)j×{ös·z>iÔ,ÆâMÊõ%O]õÂõÛŽ/š_.Ÿúòå‰4ZFÅå· £w•dî/Phαh|¢œ²jwAÙŽ|ç-kJI/ôÛÝR²ûøf¿-þff,cÖäž=P¿5ÀâX§¶}—“çóâ«?¾ªô¿Z¶„uh)'©¬½nÁP…{åZ†ŸMnižÎ0IwÿúÖkcÃzié¶Û¸áGjêÞÌ™z|„4ûçÏ™·GœÙ(mßö,l gAsTçÅ“Ÿ:›ÅŸ¬[¶fËiÿcÉF¼¶U­ùâéf¹Ï³L)Ÿ²¨&NÇ,+Q¤¦.ÍïìøtÅÚyJ¶¤éE=¼öƒÍ‰6Ì.³ïÛÙµ‡®¬¹yïóôŠ[Ÿ­Q(®wÚà†ïœD¿Ã§Ö4Ûi½Ü÷®â璩ıŠ&ö›Ö¾:cä„é¯ö†oËտŰzîdçÙ2×TUž<}útÙç±×7©ŽxªuNÿœöœë;dw'YºxdÚȬ±­C·Ó|¼uÍ—y;>œ½Íøp²å9•Q\#ñuòUŸ] ß¶¨Ü­ ŽK7Zâ~ƒðòž–L¤LN<÷WibáÜùѦ“šÕƒ<Ò”ß6’7”õ\îf"ms›ºÉÇÁ¯î|rÁ»ÆÍÔ7ÔLÉ~Ãäio õ§¨ÙpôTmç]xs-uä1 ŠéGe½q±6Wd†î?¥<^iézŸgÙ;5ûU¿“ÎMÝó3ÊÃèͦcW ½ÀrµHž³ÖPåœøˆÛ­8Ò×cµ&;‹oÿ¬Ãzq1V;ÇÙf{ìljی´‡|êiÁÔÔèfÂä]îÑ|øžéZÚG«™¦IqX¨¢zƒiL|sì$‘À3&úè8k8ÇYÒ#v)lºGŠ‹ghJt¨AÑÔÔ¢†éjI´8µpdºãèœPcYKw'YX É0)6.tƒÃä&QCð>& ¨7Ú˜èëìó—ÇD3¸Muu²YK•ΦÅÒQÀ²º.€d‡…º[ÙàÁ/c"žË&'OÔRg±#Hd’†&ISS ”Pã$3¹´$5&GŽˆ×cøò«19ê¨O0›9‰áK"«kx ñ À0Ûüòããa†ºúzt š†ŽZ]GWL'«Á«Ôð?]Í0½0 ^sqBÝi¼ j<€o†nX>O¶1ÑÖ͉` -`í: ˆ¤ÿp¯â{ï˜P 3ACg”çÊŠÆ¥›hjuÕ4 Ô4 <ÉZ†Úš†:Ú344 54f’º•”@U-‘âßT*)T•Åö$aÁf…ó@JÐÔTת†—šIê†ÿ4¾hqÎοÇXl,$iXÎÐ O‡eoõOšúOÏqX(¿Ãqñì´:ÂBIô:J> :M= 5Ä"d‚õ‡¥G Cê$^rܺ ê˜y ûÀMÆÐ˜ÆÄ$5Þ°ÈöÂý"ˆƒ(} )T–¦ª‹ÕÀɬJtO¡XƳaX ‡ÍŠñ s):;p…âdE¡8{xZºÉväâIu´öû[@ž¡qŒ8 ÅÍ Ð`!€çbîlíaíîmíŽu z{y w‚2Vv–nBåd­"Cãz-gpeîaífîiaµBãÐÝhÜHÑÀT;WO@(² ÚÀô¾ôa¼vG"ªÁÕÉ›jéêbC%…ÑHÖ.Þ$:7”„“SfxX` úú-0°ª E…GÈŠÇ{,ü'¨Õû ¨T6ƒÊâ"ñ'`²ö€'XÁ˜†v`€(ûî4¯fOà+ÇÚÓ ýó@Ä•ð‘ˆ.ˆß×ãWÁ—G7ž‚–¯½¤Yª“µ A‹Ü#É3 gÛK‚eÈk¸¼ÜÏL>_µµöÓ.œ÷Y–—L”ÎL@pø°g0¾2A¨zÐG‚h*ža‚œÓ‚v=<Ý-…[:»õlæs'Ú¾à¹RY5NïEÇÂÌE¤E—¥I¦pU¦ Õozo=ÛĤŠh{|ÙpªÊäâõxÌo‰¤Âû#X[¹xàp`ºKļ Ø;³†…ÜÌ-­==üÑ‘5õ5PàVw:ÃbÒ ›÷²r#ÄÑ’cX´0M(V^|D`ýô°?šA€–ænc© ¶|ÂBÂÙÜ×ÚÅÊ5 e™†.j×™–Ĉ%(ÁŒJ1Ê„F,ƒ‹$ = ˆÜN»Aè6 {_k+ ™Ì ? Ë% ¡fMÄÿ-’$º‡€E‘aalTA‚¡x&¬!1–—É@pÏhÐk>ø 眎¾òÒ¥ðƒ£ÀÄRHSåìŠÕâ‡þeñt#>Ö°D?~ºmÑ7º‚7º|TÌŽ§³Á¸%øI©˜aT˜ÈÐB"‘d<@g†¥°®b1`ùÉ`0X‚ ,f$H:Cg¢Ø½”'Ð{Q‹ˆ#¡‘„D:&ÍÁ3… XôG¸—*V"“Φâ]æ ‰‡á‹p8ñPßWÎèÁŠgÊhOÂ䎑j¢—ÎSñ¼_¼n»ÀPÇ<¬€I_âé"Á› )8]­‚\_„Þò¼ñIã=,Ø=*F4Øžï …ðÞaÝt³¤†câ— †S:œx¬h'¬·aC` ¨ h$DƒØC@ŠœnO4^»=›¤…r㎠42¡Éì†ië­0hì Ö >ÇØÜÄÅsÿˆøÙX&Õ¾Þ‚m_ ª">À±i@lþõšf⌃ÁAL >t°…‰ i(9\þ0*?ì­8£áÀüxê€Hæ¸KÅfI*——j# Ê Ây‡â±Ít"L€¥†òÁÀ²‚þ¨b‘öagº÷D ŽU]”jQ–'– vh| ­ €½q²špœq€ €r@¯Øª„KnõÑÐÉ–…'VÂiã…©\š×¢h€–„–$„Ì :@õ†šWÙž#Òt›Mg¢‰‰¥~(*Š3ì5ž‚‡"Œ B´†§öÙ¼µ®ŽªðPÉàP1xØš†r-d®Ðöž@#@Ƀ17”àKÀ¸xŒtúaoEg³b ³¥«¢æÃQxB ‹‡™9B±] êÜØ‹®”sŽ0›!Lê°dXrx mØÐ!â9xÂrz/Ó2Gð¸1øp „:¡2Z ÅßÐ Ã,4]DÒ8‘€Aª‡Ym€†AAÖ%.nÖBÙPB‘9 ET@‰ƒ–8±(1R,€Î±Ú`E°q3Š«YY0I}’`H2b ×"€ðø˜˜ddi‚+3”ŠاC¢Eÿ ß¿£ü^JÑbb¨xIqc”ˉ‚3k~ÞÎD" Nd…8ËÁ h}ðUIˆ§ `sv²¨AÍ‹ÃÁ2àqá™0š¤J, •!hÊ¿÷³…Z›Úâ­d0R´Üy_à›Ä2!:vÉB,Ÿ,oËXÃ/hËyB‡y·Ðbc©÷Ô:ð™ú]8‹—Ãý0³ÆÐÙj8OÊ ŠeàóFøã!‡Îf³0% ^ M1râàya„‡ Ñrh‰øÚepø\ Óü /rëÞd8ì‰ †§ûr¢q8$ÝЃ`•ó÷uÿl[÷7¥q]i±¸^ ÷TF¢¯ÙôP:#޽ƜUÂXp÷&V-8¨¥°0ß°€À¼fˆ‹Kxò)£9<ë¦@ÀÃ"-Ž Vy(®´ɇÞö…*B h0ìó~ã°~Z(H¿Ãgò=–2|MÅDP¬6^]¤óØ3˜*˜ ŠÁ[&øÊðŠ%Lä3sž„ê:‹ƒ}|£H”Ê’„¥:üûýÜÊ#œóuQ$¡¡úÇfRâð40Ž’²:Á ¢iD@ñ‡­xÌ‚¥R cñÉåiyð$ž€â’‚& Ð .o‡Æß·ÀNà"U|íX 3 ªƒ`D÷<ÚeአÜâêrÍ`U(‘–ÌQÇóó²’Ã}5Xêüý$G^JFѰýUDåäk]‚@KO†ú/¦fÎŽg„F59ŒÁ‰ƒÒ ÜÝÒŽ„Lç Wd³žeoEE@T{k‚¦†¶þŸó€^ªþ¦ƒø ‰vˆ°Þî ÒEÏÎá'tÂ$khjÿ¦Ðˆ@Aº_HöØ"¦††D~ T^‘ÇTÌF& ¹8 ´f‘‡ÝñŸ÷ ÉÍîð‡= ñžãpÌ™ËôKcÒ"3 Ð!À/XñPd`p”T„ÒÆ)+áv?ø¡lÔkIÐy¬(öZ½ }×Â+Á„[B5”±~âù¦ Ð†Â›ÉJ„›{zX)€8€²Í ­’xå§ÃB“ V&W©Û6Zê=»y·r¨ØÔ1 (؈?ôžYKdƒ6Pð£¯t[½ô ´&Ô⳸%óûöz7˜t,˜n%{'k‚JxœªÎȇ„úÊ!* î¨٠AÀudñÀçþÀçZh0pŽqÌõ‚#P¶›˜ãu :3 ô”p1†ä¨Ó …øÄ'L"jé==)ð¤XP—¡òXžR¯[_: ¡OSýßÑ^ÐJPó`çüwp0\‘Âõ  ª(¡‚Ò-÷xo„!Z©÷œå}ÔƒçúÈËÁ…ÅåkĨC<ô†1Âû¯*.Yµ‡½ &'ïõÔÃÇÜjáçi­DS Q&PàV©ûî#‘g3ÖBS{Mø~…`¿Bà/^1#˜©ï¸àjéˆ\$¬©–æNNæ–ŽJ¡ {ªÀŒ•ÿ8°?a`ýï; Sø©Ë•B•ÕLD…ò¿‰@è §Ј߫Â4™à?6ü/QYÙHR:ÁÇ,a*Ê#(p1ñrw²²¶ð²•@J¥ôa%ªÅЉ€i S‹RYñ0!C§EC»öjÆ`'46Tàð ØóFHh<;BÀÁÕ…YK¡] h; ›³ßrñ€¿CX,&ø·O¤ÜB@˜#(,ýš¸¨®x!×("@‹aôø5:: ãu­Fh³ÇìíÈüBc&½ é`='Й ˜6C]Xã°³6·²v§B4Q=¬=½Ü¨®.–ÖÂ^M²êê$Ð `5ŒŽˆEàÂêî«Ûè÷ß¿èÿ‹3¹¬ÿXÈ?æßyùÉ YKû¿ùÿ/å\èý’yOwìÏý» ¦o_¶iŒõšÂ:ZƱÊM’·/†Ä›­6Oµþ ·[ÁÀ¯sXꆇ+»o|œ¿p@Óš$ƒ‡O)Õ²ÛÜž¼\Õu-á«Þ¨”șӓ¨ÆQA²ß7¼®;6p¼]áNÒ}饅ý¬Érš6¯Õ®ÛòüýœŠMŠŸ—…­ÿñÔzý‚›·£×•'½S°½¸.kécS ’«÷Öó#í¤™é?½ïNÝôì›ôÆg^wòW1’í–Ýðe«áB*µ$t|¥‡í\ÅéǺö—0§Ôº¥dw%¾ùq†¦ïÕ›†¦ rúøº:ÈÞ •üRöÔôÝß¾ŽŠkYW·ªn“ø³xÿâg&$¯TjÅ-鮬C{¦´õËóWÿq*¯³è[@Èè ¾‹î/  Q²Ž»V?$ä#C)Îk®ù–½v¾ ?±(urƒwäSÏ;»rF|¿Û/]l•øÚ~CUkë‘LI¥¥Ù‡éYçJnIŠXÈ^6÷Âåý’qß öi2–{YVœÜ4åèögÒâ‹—Šõß®·}ºñ‰ôóà}E™/23õIbµçrû¿˜ìO˜ùlê<Ò!15™)u!¥)SÏŽt"È—¾×I©?¥3ZÿÑØˆ º+ãëƒòËR[mÝ>ô¼“m±á³ZÔû¹ ÷Û_Ï<¸zàŒÝ—Ÿ¿¿½åN¼æ1ÿ\ Ó0•;ϤæŸûºø¨³ÏÂùE%/l¢?¬?ÐÀwév¾OÞÎAw}§ï¶~`²=*4(âÓgÃY-‡ÔÚÉ‹6M­‘óÉÙ°X:=óƒÅC¦µT®­åèú ޹ÃIo­ä_pF õ?{´Ø5‚öÛþ´›Úó4\WÌÉ’‰ž–«uÝCÑnìœóï'G4?M¼¥r¹ÖåVrã–iN§{¯ ȤOžõCÏîNcò׌Ë7†OŠ[;z ù˩鳬®”ýhè¨ÇÁVC .0<™.~y¡T§XÍ@#½{eJn‡}üª“u-˜Ë»2Z¹ÙNT_9|ØÔu;ü•µ“Y{ÇÏoíjîÔ°Ür¾ñØ9vÎþÖ ÇÔeS¶ŽÏ¥n2fÇïvtÞªµæ@?ÃÃõ§nÔ©bó>}ÐÇ-ó×nX)³àÌúƒ‡/ŸŽ2ØáavÇÊ{oT¨4ú2 ŽÍ¶*Ä_SWÝ~Ïõ©Ì–)œöRyáx¿ùïõ¤½³²£ÏL½½çëÅ´•—7ß }u¶èÙ"óJ奞~›u\Zœ°¸USòy«†®âp³¶zïËÆü´.yôÚ-¨ÌȬ ?ýÃM¯Ù§|®ïë¿áöÞŽ'ƒZÄ'~èA¸xðSݼã_(] *tBŠ’v›ˆŸ•‹+á|­Z2íaÄÝÒÖߥ?-­°¹»{ß^/Åüú¬GV?¹©{èÔ¸…»öeL¬•6}©÷½BÁnâ›es]ÖÚ†'n»ÏšÕñ¾¸dØže®’³ï¾´¬{A¹èòIù%ß'“²qšü+zû­ófïìʽ&YŒ;˜)á¢ñdP¾}Ó±±2_H^U¹™ëwuσõÏ#ÅÇ}~ô¼(Å,äEуgw ?±žPž±fÁ¢åÖ¯–®±Ø[2|DÀ¾]׌3O­¿b^~¼6Ü*‡ô@uÝ–¯\1×¢ ‰ÒÔˆœòºƒ\™×ýw’¿œ´©{áYmvîÓîÝ Úv·ÏÚFØ]±ka瀋ܥŠžÞÒ_›ýÁêAÎékºßæœk:âe°éË©ÑîÕšï¤XYÖs"óš¿8b‘Ñé=Ž î¤½gênSØvýýò…îyšeŽ4æÝÛ·‚n¹}ûœåµ&b×îÄôƒÑϲn¸¤íÞùðn^é {ÝÆØÛügL$´Üؾ±qåÄõí~7VHÍL“Ò‘ªªîºðýI}\Ô™ƒw~$Äst_Ú8ØNÈfl.î¯àUÚ0Û&­ý™eÑÝÇu;^j[¼¹%1È„®è\yÙ`ﯭŠÞ¼ý:Ýô–…KŸù;ÉÚÚzÿMàù/§³¯‡“㿜ÀÓ@G(s!Y—ŸÀË(”ÿÆKÑÈËJ(Èû‡¿ýO%Ît³t;ÍÿHâLÍÿpâLTú)u¦†HâL,Û£ u¦è·¾“gþ»©N{K éàíédgýÿPMl¢i'…È÷$ÑÄ'æÿ±Dš"¹mûL…ÉÏ•ú*™¦¶)œñïåÔì‹1 çÔÄ««ÛkNM]Ѩº¢95ûŠ*¬§ó÷95é$ ËÅŠñûŸO—i «-œ-Ó=Ö)€>via§Êbæ›É¬[1•„‹a17è7d$ ÏŒ/v'k\ãˆc7G8˜z3éÙK?›qt•‹£dh mÇ©éRÍj­ÓÊsÔÉ–ËV˜þøò.è„¢¿ö¹éŠD"ñºAòû™mS‡=yÖoX­tJ`„[âúׇ*Êž/éÿ²ê¼FÇ»©Ì­ùK}f_aíL>`ÖO’íÚõó®ÿ¿Ìi›C¶ýjUöy)®/¬¯ŽÝ`r¿©®ì`ÙÇÍ¿V¿w¾îm°õW£[Ó ÷Í:*Ðt+Vñ°ylÙ%î"²Óa‘dú®¶å7ÅËCÖü”kÿ5 _¿57Â*öÆ;ô{’?¼!ÓÆM*êÔðŒ©y~sjÒšV¼Ï}i°LÉ÷¹cÆ^sõ_wýµ·„ŸL)k—+ðtÌÒ¨œŽ•Çv›6 …m<>¯!ýÛT›3ŸyìÍ™<éä'û‹± ׬(»ïã²DùFÙ¯Ê †ùƒ5炸E l“­^ž£Vº>¨þÚUÞ0h±mMÙ‡>oLì:ÚŽ;GïÕø Ó|¶æ_sYy¦ú»ûÚ –ç+—NÔ=´àÜÆíÒ» ëݬøn+*~2=Ã=íëŽï’ÛÚLÖ¨^¡ú/büê: ŸõúŒ•EuOÀÉ7ãÜë‹)ÉTSMM8\…r» Ü-vA‹¾¨$¯—#…6wz¦Í°Aïç×(µÏ»Cç‡Çäê&wæÜÓ Û?Çßp0u‘ñ²*Ó«3èw¸ZîCíe¹À7_ɬÔ-d”½›3ËÅëõÝâ¹..Šs‡/èo~a©Ì囃æ¬Û7Qêîâ¡s˦©—<ºêópíÆ=©ÙëäF›&J[µëâ™ z¥.ZI2“wz´_'»ÿhï’Ø­“¥š§3*¯Ooÿæ=sçLqÊö û¶ƒ•©ÇWŸ;‘heô…ìÐqÃr[Óøí.®[Ä9Þ¼urwã{óƒ÷îÍ]¾pµÔš‘ o¢i2>¶®ìG2¯éµo$F´èÿH¡*ïRÇs­9]òß™_fnRphbÿI•ªÕaÏ¿¨ýH¨Ž¹·üQGȳÚë,‡$-¢ÉÝ­›%½Zp9åíjá–|[ø½‡&¥q'‡…lÛ5芸ÂÀ¶×Ï; ï3§Îì`k¹¦Zébç ÁMó¾·3ɵõ÷UpêL OYõ-eÚ{m†"ŸQÕ.o?¥CœvqäÅCÏ^m“åõp|ù6ûaRÛ\üm¯„uþÈ[‘³¤aºÓᢺ¯&G´æû?®9<"ü}ÖüÓnºß,Zç÷ï÷³ ¹ºòßÈË×»Zõ6/_·8ìByù¢ÿõÌ|ôXF(+†Åü]޾RÊÿ@–>-}²h–>_¶²|[~†„žDä˜Ò¢}ÑŸî½=Èzä#‰Å¯qì?Юf´ÅÇ÷Y dÄF›éZo²´é¨góÈò»ÞÙ›ŸßZéÁÊ®ú™õóJó×Ì­FŸ7'?3HÎ{’»îCׯÏ'Þ|žó†6rxýñLòãńͤ V9‡¥·©ïj#·­oÿ¼©ßŸό[kû»8µ<©3}øi‚Ï—O1J›‡¦GŒrýþnǴ±~9u“û/3·gõÏV ¨ø1·ôãÖ‹UÇ Ã~¥Ÿ&RUIQ;gªùÕ¾p}XµÆ}êê©d: åVŽMùºL7éõ‡»×W “ÿõpÊ@ó’»êG zcwçùE—Ï—¿hk±©–Lœûs^SÆËùµ¶£W)N»W–|y°ãFuê¤ês—·Æ<„%›Ñd§*?|ô²ÅgÏÐ ™½Þ×bªÜÆÑóŒ88¿É¾DÞbõ‘eÈ„ƒK›œKMG¦.^µxÕ’ô3þ!¦Wnr=nûvˆmˆ!93N1|ô½Å¦#‡ÕÌó5Ž}1ceÒýKEÛži«EßòÌü™uÖáâY³7’Š7|Ê=1ÏØæšÌö ³£Äwæ1KÒŒŒÙß¾,ß®u7·ÂpœQ×UƒkUç¾>¤tV¾ \¯®qôZšVô­’ÌÃ…áÆ›?q+¦7T9é¯ÕkýEï¼­‘TƒeÜÍ_FrëX.Uâ©ìÚòHéa¥÷"?LMÊ–Ò3?—½Ú@éåŠ7-g'&NQ>²PœšÿfM›k1iû' ×úJµ[s·öꜱk_äçT‘_{/×#戩ÔôþãÓÓ8Iϧ®ò6ÌÕmÌ{z´KûÁ¨*ö¬Â!ÞRÚ×6'|{œ`cDâS³Ð©h÷vƒÈÎC /ŒI>‘2M>àafó8S½<ÝÍœòV¥oÕÖ‰O3TªZ<ýnû‰!Kb‚ø«ùÑ›ÆÌãh 4ŠU|Á³ß³œ-„•Ã>î1Ê®°P‡í8[§¨3roqû-±XÛó«Ç­ TP;´h`{Võl[IûO Ö?‰þÕ‡Vo¹ü¡X{„r»mÍ€·{~ ó:rzÀ~¢±ë/[âcÍæk¹-5 ¹–?ퟟW°°v/òJìçýšQ­ _ß.š?JïAÍsˇšÄJW<Ì­;±õ™ŸŠ1h3IÌauñõ¢™1C÷˜ˆ)]<~ûN¥a ÍYeýl̲Ö¯NÊ\öqóNNòæw=B¤(g´­žÞÌh´¿(Á¾ø¡À»JÊmõ׫×ãF¥]oS8Ds¸Â»ŽêívôjÝ¥9ž«sÚûÓ‹ŒÕ´ª6t´f¼wðp޵ ]·uJv΀ºé«/¶\Rø,/wÏÒ„zÒ±‰¦Ç]nþxjÒ:©Ç-ÓÉʵÁú9#W/ÈR_rg»µ”Á]·(w‹ùo=/Ž’äõ1Ð…cÿæÄ²%ÇŽU©™Ÿ›l쫘=1odŠl()¿æiy[RBGyýþc7¥Foº:¦4wn°{03%£°ëÍšó7Ô¸|ó”]:aáÙi—ˆ¥š¯“Û7`ë†q{s£˜–Q[oJIG¿¼ÃºµÀü]ÈÉ1lj‘s ïøxÊݶq-÷ãÎ ’0±D!0rU³zŠq{—­þ¯ÁŠ?¤MZN š6‹I[3ul:#ÁÏÝkQа"Ôá%ë§w†Ê¿)= #%?‹|‘ÑzÌòú‰ Ovå—{'x­;í6tX>%Я9O¯$r@ÃÉæ‰]m©?æíì:~?VÙ»Î:¾ÜÿZE™’üŠfûò+Í«NMHþܲ_÷œeªKösµ¬¸ÐÉFÁN_Èy¾rÔµcÊbécõ·îÈžQºñ-çÉæSrÖ³^Μô¨‘uÊ?±XlšÆ‰Ô—Eª¹ãî”çЖŽ_{wÙŠ])—æ-¾htöYîM‚ÄB¹AÃˆŽ¤çÄW‰yK/n±žx(Ø(,ç±ûdÊæÝão™YìÍY3’ÛùrŒûjËðÏ:Êj¿æ”9®Ùl¾û±aáçú;^D™yüQnMÉÖÈìïã'º×åßÈdpó¡hçæS væ¬1Ü£¢[$õÕðuËhm®•îçñºçÔÜ2¯õG^ïê_`H¹W Çÿa5ñcîK]I&ûýG‡†Ù–5Å{5Þ+|å~¶¸òú´É¬«ª«Ÿ1åvå- pó é'~©9Êðj|jü­œ”Œ#™V+ßÉܬ,[fßñŽáÃ=<ª)ý37`\³ü‰~1ù'JwO—Ô5L[¸n­¼W°´¢£êþŸM™i·ÓÞ²BÄ/n°Ó~þŽö&9¿€~ãÅÓZnÌ {îs.g·!¥|î¸uG–ÎÞv²Øß­4d¢œê%ÅãW§fåÝ¿¦?¨Ê)åk€ Å3Š©ß(>Üø×ÍÙ¡gÂ<ŸNJ¢;¨õ›åi—~îΜhΛO®×÷[ç9Ž/ùÓT-Skz ó×{•ÛOlMx5õÛó”Êܯ[Ž,<¼ÏÁogµë £‹7Ÿ;ššpMlô g›3Ã¥ ËB:OX¬k®V6Ù3tu[ìᮋ¬ïbëfæ·=ÿ"Ëwâp³“!Îã×¼¨}|ZÂñ“2»åç™Ïèóø‰äZɰ;“ækdoÍ}¦øúì¡Â“kT΄úÝÙè£ÿÖ8#lÝ\î„z­]¾i—œŽQÏmRŸ?ýÎ’™vG†ÅÕp7]è›>íì®Ç)^E–Êe[–Ou*•¬ýæ㟡ՙVùê¶ãÖ]­2‚Øý¦yèE–ͪ»xeúu±…_ý$ªä- í{晜+PøúÅÈó·îzù…{oyWVqcK ç¾ûÛ\—ÃŽø\r‰ê˜¥½êLWYâ¡Ì[¦a™3ÊËõŠãΆœ}’¾Á`̫ºùgVpù˜Xî•I†NÎçVçd°ö¿´òIzåça”û×ò'˜Mp¹²$ÌO¾eíÄ“²2Ë[^3I 9ööXnÁŽÃKŒiÏäôåÚ>9®Ñ{?çPÿ£3«ëÞ½?Âë´óÔi¹A†Ý};zœ}ÊõqrëC'Le´-ð †öcfÍ=¹.Ïôà¼LÙ²iVùq•#Õ´&Uªž±8sÞøÓ#êfç)®°dK¤øOÇ&1Ò›á?Y´!˧/Œ±{`HíóÓ§^y=ÓzÙfV¼ðD@qQcó®–vÎ=ýÌÍMÜ£Õþ;•Ü'ŒÆÙ`pö«™¹‚_ý±ÕF­ÛÃ?í{8F~¥Sk¸„ç`µxýG)5VJc[ÏVªŒ<ÿë3óÜ~_ùÛ§¯^ÙeðvÉÂå‡òÝ»}^]gyoçá[¦ÒŪw^ÖD˜pÜáóK£8é{ì©î·m™äÙÿý­¯Qão†æ†{Äß>8J²S9ÄC³òùZ« ¤ü¦mF3ÁGñB¹ºg™&1{.DÌÛÆ’X¾NZâQîØÕ.ÃU¤6}sÞøcn£kÖ>ªWècSß“iÇ>]¶WýzÿíºÕ¯q«NÒ×1­\b0*¬õBFs~‰õéõ]þ™å»nÝm y1 -.ä²ÍšéV<Þ8C÷ÙÆŽÄ]³ž¹–7kI~M-®‘S“O|ÛOc½ñsKÓ¶~™Š´&î}qémdW5‘ÝZM™¢HÒ™Q·EüúáÇ—¸W6§¬<þz…öp)ýØÀ ií‘¶©»*æ/ýñp7ký^eÉ„õë˜×G-y>Fy¤• W±éZ|üݘùvÇüjT9ŒìœÀ¬‡53ÛõoÇ7,± Ì<ªÀa‘s¶Eö’-ѾkeÂ¥ß7UŽ»êothº{VrâÚ<Ûw³ü,ªÝ—ŠL™FÉÙ”“’},½ÛôTíé8E7±½Ž“½Ú§x&Ü+o?¿;®1»uÄçø·u5ƒ·¤j©¶Ì?9÷úÖÓsÍ fv¾KSeö!IõñGØßƒk†–’<<÷œ,l÷m8Ž*¡%c»wžy§K.NˆÑ‘/?è\÷î&Ûè±®|GÊÙ¹™sdvûjê¼®ù½h©sÄ6•R’úŒÙí¯K\ÎêÕ¦´ã£M™ÞÖWžS—ýPÎ9óäÂZíÎG~Ü,׈ ›U7/¦â¸EǧKi¥·nOöºWzôÏÙ¯|S9ºN&’ýë݄讗˜É$9óŠ[*WlK\×UTDójGÂh5ÃCS ÔWVŠW¾ê÷í‚ï÷&ý¼%ÖD(K±˜O_!s[nÑ@=úˆSÙ-ÌÇf׃W}’I²?}oG§ävFÙûir'8f^^¿ã¢ffÐÒŸ“¿î^µÎiŠÑ‡U­¡Nï‚FOz£{fÂá7&Iš¾à=á¢EêÇ Ó¦Ü"âœÕ9Õ.–óroŠÃå²òS‘zý.¹Ø:ßaÃS¥W“ë^q¿Í£—U„ï¨PìPà·ˆ8Pï¨Iæ”U+®Æø>éõ³Æ×­÷Z&Åë¥(e¼ôN˜I~—””j±Í{pYJ^@ZùF¯k¥%nÏÞ)Lªý×“Ê Îž[´0w‰‘iC½–öØ{œþÜå[~˜¹ÖJ•i5_¨1]¶zq¹Øv£p£ëËòWK­¥Î°»;)6—k3Å7ÉgÌôM“jW_\àCÔåüã.ÿ£(~®„åÊ~Uóo5®ºÎ2:R?þÃ7Â-i¹Šð» ¶Wͯpêë9½}·¯´©6’Rö<|l6}jÑ´ØÊ›(­m¯çvvvôãz¸û„þ;¥s¬ÞŠ^¿øøh–}ìrý§,Ê ÕÄŸOª·±ÝF˸H->=ßKóàóŒÝ¡[Wè|›ç.YÔÐ8q²Š“s‹<ÝùðŽp%‰µ ÍžÕ{ .¾ùœÛë?¸1oã¡oß*î†*m7ÜélA ߥä¸åô8ç«áB]¯GÒ÷Š4§*ÜÚ“1Ú~çÅw»Ž¯ý *Äcö6§íl×kžcmEr²ŒÜ"òá«;.D?ßWÔÎP#±o/ØóaçüãWÖö_í]‰og4h¾pàô §™µ>q5_³ûñµmo ´´Ï˜N‰šûÙ:/tØÑ~ÉìsŠOçx çnªþÖ4.oÑ“:Zé½S¸ m¯"#ê­ÍîëO9?£êz?Ó©bȶ4O ÑéEœ°/Ô/7Öéç-+›·Ruaµc¡†O®µ×¡Dƒ\Úž„iy•M,ñú¦¹uÝáÆ‹ ?%«‘MÿõDƒ}Sý¿“hPÔÞÕ3Ù`8ƒΊgÿ.éà_çXºè Î?É?ø?”PGSOØ–î;˜ëáS‘nÑ~b°ŒbÓ’Mv Ìì,Šæõ›Wp¦lØðÙ§§5Ÿ:‘èX!p4j£BÀÆeÍ3J+ƒ3-ÛÕæ¹9eŒÍ*³_ä4ÚõÐ3“럮|óQüÑõ+"ýžã囩sÚšÓ;ïDL?¼øÎá!ã—鼉 ‰ŠéŒúõ±¡]ûö÷ìI¤ñ‡ÃÆè?%¿luwûÔLÝMzÇ/®jn½.™bÒükêéðƒ Y»SvGŒ S8G|¢š®Pgúå–WqЯÏÄ)ûVjïj¡úlìXrÕe¹kÀ7ÍŸ $]c9]µ6·('fçÍÍ-Ž#v²_n0Õ5ÑS0|ù+HfHÈ‡Ž²ËSwÒÛžT¯Ëž®¶ü²~giû—‚¦ÏÒù1fÀpâà];˜©;_zu½,¾mUp²uÅ –ú}§‘—B­Yåk~ÜiàÈKj­£¬ŽÛ #sæž•R«s‰bÍbã3“es›K:G½\Üu&åQ¿wÃ߉¿³ ‘;¸ä­Ìù ÃG9.6°’$gÛ)ä)4/þzF=D¬Õ%i¤äPõƒ›‚Gå¿\•¼e±BÇá'GT]WÉû¤ö}ä÷uw.G¼ §>)y”+·jÍI÷ÓžºF«íš›ûáRîÆªÍ_ª¨¦‡¿oþ™lýáçϘ‡õîkÞ?÷lz®©î¶äÒøÓ¯½QBuk«nîªíB¿…ëtÆy^^¡¡;ôñ…Sií›] ׿Ïl§WéS.©9à¯2ódá¾_F…¤MËÔáÜÕŠU4U7›]àWXH˜¦¶€ÞP6ìnåêùûVÛ웪·k þ¤ŽäÆÝcâ®<>Ê)nuÍÁië,›l|ËmvÿºˆÉFåû:|·­Ò/Y°ñÔãá*WJŠê¶ÐÄ>Y>YxßÖÃjðçÓg©Xúš>:°‰Xè°B7Ý ?`ßZ ±›†Ô…ªe ΉmØwe‘·÷½#Þèjk΢”%u©œ±u¬¦½_ð}ÝÃü~)¥]bjc/ܬ“íS0aä¤ÙÁ·ßUž[—<ÿãáG÷Z†wµ­‰NüúÅOiÜ.£IGft|&w<>+ åðÔÂYªÊ‘tä9³.Îø©ŒÓ †Ûð”ÓÕ™‡[%¾4?`I.¾b2U9ÉlԼ䡇jeó6z¡vJ¢]}ÙûÅÁ†óú›KìÜŸÓ©?è¶Æ´æNIc¹Ç …i«FjψÉþ<êW^BuñÌW²O”P‰“FjòZLÊx{oIô“ãÍߥ¾ŒJÛÒ©ÑòãçªQŃOô‹l ÈOßsiéÇcí ªÃç Jµ£¥åÜgâGj½u¿Ü’šýˆñ³öÔ<ç~£ú]]qçGãšÕÚ¦_m̦¯ 0Äv&¦R³ß¾ô’mŠw®Œx;¢™«ùãìbÕkW^#P5_|Ìß¶¨_ibYBUúŒûý vüPÛ“vx£Mtðø=,½ÍþbR'âòüw—E ¸oµñT¶~ý>‹÷y»,Âß&Ðw}ÚhbC¦Þ±êôùM2¹%®ŠMϬݞFL<³áîeí+; Ÿ÷wÜ7™npÒÁ½ôà€£7fÝO‘½¾yâÖ/§)~³“<ðé¹Ëi '>pØîEkW,ÖwÏX¾^×w_ç¬`ô·¦+×K¥äjîlR_Ë<«¼“ýȘ[õq­{äðy—ûALå9…ï2Ö{¿è¸¡!UšorÛË~ƃšyI—RªÖÝihùùS§òSg¥)à­â‘‰Õ§f­~!ë¼D¼hÞÍ|¶õO7;qß´É(ÿCSvë|Gûû_oÝ!,œ°9Wú©€¥™E²yùjÇÙpÍ–1É ÖgJÄf.Sy±ñYÈîÛµ/³™«žæê7È™YñQÅ~Ld«·l9%ÆÕÿá©ÄÌi—_9îÒøeào óælç»e6RYœ¨»÷âÙŠ )ûf9Î͸¶f˽íêÛžGÏLOšqýêØ Ïúåîxz´_ç/‹ª£ÏG?îà–¿©ª+7éqÔ̽NzµÄÈÌÅG½Ý h¯õ ÊmPÑd{<Ù“a’׬£”±ªî²{”g€ò­¬ú N±¦ÓØûœÜ»s¡©ö™;›ËB¯å½ÿ<#Yk즜§`ÇsSaThùïÌ2w#­êõ­Õ'IÊ.;· !;‡ýôMÃeŸ˜¼ç {ÖÝé#oþ²ÃŽ cä8Õ0Ðaß!߯{ßRÄö½¸´Ö!øé¼¶ã‘5 ù#‡ÞÚ]®d»±6¹}ÇnóXÏIËÞ¹TD»¥ÌÆMB5Á–DrÞøsƒÿÝÚ0Aa MÞ3ûÒ®þ²„YÊš··«^¿ªa«Ý¿ßféUô†ù™VEI,Ôª“-â(ÙXwÝ'˜~Ð9z€®tÑ ÒKÝÖcÃíŠÄc72˜R`šê½cýE‡y“Ö{y–+ÌJž“5v¥oæ¹þIãƒ+¼·.Hû².âjþWgdâf§m˜ÐE"ç­è˜P±?m‘òù©ßÏX{Ig´Y[‘JÖ Mý#tbמkÎ+ò§ší0íÙ:-›|ÛJôž_1\f}kƒ˜äý›~sß;9ú~\Øx|†ÊÒ¥W¯f+Η¿b²­õBqí€øˆýï_™?Ëù!¶_ÝÍçÆý,RA95Î|¯ÍâõµácŸŠÊœˆ¶ .üè³è{K®Ø·=ßN¶Ÿ^iý¶(ÓIì«—rm¤Ì°w?ú_+ŽeìÑðajd您ÛwÌ$ž¼o.»Â?ˆp™´÷ízí±wËiY{%š2jƒî–ž_=mïž7…—úïøw,±+ÓѱÙã Òjß"1xÃ.{j;;/ž–ÓÿeTÖ°C72cé` ϳöw7·Ö]œÉÙúéÝÀ+¿r¤|\»æ“­5—®¼Ä°žJöÚ«'&™?ø’ÄöAõ^ž—¬nFÔqF_›O:Ý–0çäûÕT‹HÓÈ„_‘×ï4*î<°òáf÷“Ó“êO›g•®õP¡°ëÊu—ìæS7öÜ®,únªBÕ‹Ÿ\}õ¢ì*Õe—¬šC¾õ«ªu køTç¤B¯Œ8bª]uÓš1æŠ×•cÜ 'Nhœ(–8{Ö0~‰ÃÛÉQ–cU½|ÆûèõøÀ°I3Éî{«*ýgÔßLök§GGzM]Ýoö5™YKåg¸*í¢.ÞPtÊ=xôÃ¥+/.L>ªÃ–.Õ'úПQµïÆù•z-#TÇ8Xër‹!ó˃/1sÍöú:ÖýdÞÉ.¿U£"Ƭ¶qç­Å/ÄöW•V´Ö<¸q•&óõy~Ý…]ÁSVT®j4ëܳÎkšñ‹î6v^.»÷p[׉V¿Z§«òSRm–{è/ÑÜ-ewe¢¾’“Ýœ J©FKøÜ7«•ÆÄÆÛï?¾ñ.mmã—ƒÖ åÈé§žkë.5?sÊ I÷VªøUzý¢ßÎÎŽå)Íû<Ô •O77úf´,yLÊlI§AÅ;ß{)Ìñ+Å÷|TFžXõ¡ô¯§ú–äæ.X°x>!n¬UÙÄËå»ú¦8UüÔ×wø±¾¿Ö¼ÔªòÔÛýÖûŸÝהּªßùöŒ ¶¿9—öeÁ/®‰ªáù£zb#ZGUÎó^a˜µ¨µEn«øfq2qý’ûäЙÅJfW.Çí)³g ]+­2céh'b¨ó­±_‹ãæ¹O]¿­ªˆ²ìW³ÔÊ2ŸÏRJ”çìï·pÖ]ã…s¥ª•ç±·ø/«ué<¤H,æEWÓkÜÄr|iA>Ð0&E{ë”sû[zp¥¢ižÚÕÒ½eC/¾“½7wB…[•ã É{+.«îK>íöb¾ØøÂâ©•Kr‡GHs._v©”]èõÌú¼äW[­1 Åo‡ÌŸ¦ß¹Óþ3‰ø0×÷Õ»Ùµ²EÜÕo6yyß¶$xÅXEàÈûÚ© K81îíäˆaûÜìP÷ì W/8¼»q¶›}³þ'àÞË—÷î²_ÔHüevwÝ˰:³Âú®k¡J]ôƒç_:õc–ϼjïrÐBæ½{ÿ5öž6©¹EË—Íp|¿T|MᎲëçGŽV!5øÔêÄUÛŒÇFoØüÁl|—Kû#·O¦J]øžs!aý©=Dã´¨Oã6 ßÏv ¤׸®ý(5öSªù·—¶s»~¼Íºð¡4øÎÙvZ\ž‰iSêë†|ê-×P6û=]füéJÊéúæuÆ2ª*ÀYÓÈDÇ#ae͵c.ž«|¹r{é×ûØëÜ=ÍŸB(.ì.þ­™;tÏ=Ï¢æWîe ÏJf2Ù0Þ|sæ•Û¶Sž>=$ý± Åýcž}hÃDÇ$ºÃöÉ‘í5幤õ§´Ob8íY1gú¾Eæy±jqb¹÷Ýã-—Ú­_ÿâö† &)©®·§'Íà~«p;»È7ÙͶMÙ/B¤Õ—L/ÞöP?ršØˆH_ûIsfìÿqåÛz›’“N^Ž7_˜ù‘¬sTRûÃ=ß±ÅÍY³”½J÷×=¦50Ö=Z¡µîæ ‡oÆ?‹&só"üVóW½<_înpaä‰JJâÚE÷Çj¬¿£ºq×¢‚L³·‰-?íw–ýt°ÎpÄ™êÙoµ7ã]Gô®»Y†Ñ6béC—õ;ëáO-¿äº‚åè¶yQØá±oÉ‹æsVQï´NÉy>á©rSÓè!²f»b>˜3 j·\TݲðS•£öñª÷ìÊ~ÜïöÛüñ€c­QƒË»ýnƒïtl3¯8>÷àùy' &TMO” óiÿ<æ›ì#{ÌWiûO5Aˬ÷“ž¦ÊO¼’’ÿYe†×…ÝçúmSeÕò†’’'e»J*V>ÛU±òÊ3O1é‘—·–Ô¯ºóV›¹á>mßlÛÏ1N¾Cë¦fŒï¬îü´tÞÛg͇/ŽóÊ»WºûsØòˆ‡žÍƒOf<|µí%úDãÎçÑÒù>­KFø:I»²uã`2ûýçó5oÏ¿2)Ë6š³ëÄžÄ'×|î›Ð|jálÓjò$Žáa“JõÎ » â}Ï{ØB?àT¡ðøÄ°më“X'wϨ}3TlÉÉ´A]Õ!G´²ª–© txCº6bFÁ2{³œM:ëÒe=ùÁ †×ÅGîørý³†ê 7ÚÑÆ€,µ‹ÓØ…SRË5«ò®öºÕÿhõÞ£³•Šb§°V7Påxî”À–cµñ;‹H¯ô\s.¥Mwl_ewáÚé·~Mé,ú%e$Þ_<0â“å´cÓïVš¸%Þÿä4(ì0ÓRwŠú—ÍßßähW˜îšÇ–<ç[êÓÑĵ/*¾½óªGÇÕ’sĺŸ ¤Ô*ݳÌËôÕãgií̉ïc»Ø‰5o"¨ýßd¼ÈëplûNj9¬½8WTôÁó ‚زØa€;Ó¸)Œˆh:PsgF€GfÌxuC=–ÁU§‡Å›¨ÂD–º°K¢©)áSxÁI‡`Ã¦Ó ¼Tƒ6¬xfždÑž åö‚ùø9 @¿èXþ X¬¸d”ÉÅ c øêÌ•²Mº¸`¼„F(M#tÑ@5­Ý-íÌ]<Í-ìì=ý`„F{Ok‚«;ÁœàfîîioéådîNpór‡9íÔá  zp\÷ìb2+žJ*](ƒ&ƒË AŒ¥ØP0_‹` 6±^v‹yCpCi#As¡t&e @‰$9‘(")+ô…M#˜"€ ¾Õä5ÃSc0”h\Øm6uXå}Ä‚Uâ5Á”€ræ¹ £=£'…Ò1åO8Òw·UápÃfºeÅVàÓ°s4f7ì˜P¼L<ÚLìAð©¡ÈöÂÓ Š`ÇÒ’ù)°ÀùHPÒ‘Œ›âQæB8ª0›Ž…ÈE/ñ^axèF‚1¡Í°.Lõ€gúà11xrÐðø”‡.+{O;˜¶ÑÜÅàcîîÑÏHI3ϾÒ=&ÌÕ)÷/‘.à¯Ð8ŠÞI,) £0:ÌWÃÁ†ìƒÇåGYð ßa`„õM ÅgDð°D¬8N {8•«Š–÷L¡½0ä+PÝÁ`pH&`J¸¹»Úº›;ã,Næ3·µæÿö¶v÷°wu1–E¬`EaИj臚†:YVj¾´:•M‡©'YLcŒGJ@®«†þrrð‡SÇÞ€±¸Ç3 DFQšLBDÈCiDÐ(ã9ü”R¸¶Œ8>F‹È ‹ HWn»Ï?~§`ް0ÙŒ0”P)ŽÆäˆöö·°àЇ‹<s@ÅÅй0 4 \˜£‚(†g'ÙAƒÓŒ²xâ‰jÁŠ£AF”+‚IÇùb´‹o¨8X€N<¯± Œ/'°«0ÈŸ!²B€>Ö-Lñ3åÀÞˆ“£˜Ù°z2â­.¾¤ Ô€Š0LDÁ&@sl,Ý ²¿DÃ…Hã Ù†¡‰†ùTs/OW˜ŸÑX–Ïe¡„ŒéüÎæŽÖØ ˜N¼øÃ$á˜÷ÀdA¬Œ‹1è15ø¬8LJFb)ØB‘-yˆ£¡”½Ó(!ROâú¯]L!ÀZVÅ#šCñÀ`¥4•åã¢#€âÆ`#ÉæA‡‘ÅyÒr5@¿üÜ «K`Ÿx)c(Ï¡¢ ––žЧ§¥„{Á(§ÿÜâ pÁ2 ÁÕ“wñ¨¢»Æù¿·:Á›ÈJ¥·î©Yð’^ÿ×,<…Øâÿ1ÕBë_W-þÍ¢§^:þO4‹ßéØ_h¥WP¿×,z™ÿ¨YéýÏh¿Q,þE½âZ­øGZØ ÅÐiØ´ ‰@yÌ4”Ì>ÏüH2PŽDýi Ö ´˜xšˆîË„™çÑ:eÅÁá¢Å‚sKÔ̱ BÀd{rÝD(ä 0aÔ8¼\ÆHd"µ@P'ÓC#YYy YBlÖVj@§ˆœ´€ R Š|Z1Xh ¡ƒõ¡w±„=¶À0ÉÎâ)t´ñéÁå<ÎL`°YL­Ÿ×+¨#,,Ž*Æ¥ ‡”@ÇÐÁW’ B~£ ñä+(LhìÜ q£ßIVõPmA²ˆƒ…˜—CÇô5LvaðÏÄ!:ç!,JQå‡Ö÷0K:™‹ÒSÀ̪0yh*R0}*‚)”ç+Û„‡ÉHHXy™;Á|ÁÆdÀK“Íñ0Váìèz,SA†¡Æ“˜êïaGÅܱé²0Ÿ¹=62UP\™`‚’mÃ\6ME%m4” ¥À/''Kg+cøZèjÚêš<¦Œ†?'%z„9;9q[p¤€¹É§’gÈʛɦãz‚€e®äbl•…t—xl!¬À4ALb“L§q†`N01j""ј?‰07, .³T['W ª‡—…‡§JuM ÀÌÈ„`%¨%ª±€øŒ92J0aŒ$eV€€~Œ¢9´P‰p$'3ô †Ê2„‰9¡ä;1pUÅÄcNP[Hõ„"&@cÀ´IHˆ©KPm©Pݤ¢´>tcø›C §óÉÏÀr€°œÌ]lÑ^`ÃBp²¤š;9ÁKO?7ôÛÒÕÉÉÜ}uê(å!“l¢`õ² ,€mJ_ީ߭ K‚m ÕÔxº9Ò°ÆÈðÀäâ µeb% 5u$¿ð\6ØV]¨·üM´*¾/`£m&â Þ ´6@âxB(D÷¨E: ÛÆÂB¼ÓZLÉ`³. 5†kƒPåJ– 5;T a:à0H?ø ÑÓ0òõ(Â=L•°î`¶46xKƒI_\/s ÒªÀ¶€€Œˆ?oÔXZÊðA ….!8QM+Ÿ$`-ø„ S8Ë“y±~ÀjÆò𼇨RKÕR“Eë Zx0„[6Öèù8Ãi˜øÃ™*`¾gɃÿŒè[7Ö¢f˜ŽJãBÌœ!y¼+F$Yàª,Œx ±lPQ=öÕX/ƒÃF½„ikx-Ð"Ô^,/˜² ”$ êÖ¾Ö"ED‡nŒ·M’nE‡!T©ç•™T þ¦!âg0ãéBõ0]¢{YÁê j"‡ï*`åý¢]à4g,«·‰4ʈ(ëF¹&~Ì¡Ç$€Êj¸ÁKˆÛÙiXZaÈâ ½ ³†â™q±Lî.ÛN{1q–†Ù@ù›5äèø6Œ6€ª¼îðù«HÁvñûH0`m„aâ¥W.Š’‚­3W]B0ç þCÊ ‡Q±M­1‡Dûó)äO0Ï ÎzpÉM‚A› CÐ%èñÙ‰hÓò"?–'ú@‚OÒøŽYä­¬ð.ì¤!R fL ÁÀ«ciÆE›„¾ûÒ„5áeÞevd¾L@é§qYÇf0¹á ²¦–¶Ž®ž¾P³8g”ˆØ_™<ÞÆ%ù.€ÀÃËÇ&„Ÿº7 Æõ#¼”[71éåe.NFa¦P¡µ'‚ý4ŒAñ8#\,,¦‡.+R™é`°ùac…»ŸA ãeº;ï-èz·Ûp ìöhìC¹? á0'Úf2¸ÈTM§Ç`^[ž¡Ü"à·= ¨7)#Ñ›ìDÚ¿Ï<Íàõ¬¡¢¤DÖPFÊn\L¸¦9t¸©Aæ:tšCg²â#"…µ²A-F#<±!*ر"³,L3"ÆŒ™B´­è!ï²L"À²½®+$ Iñ6)).Bnr$zô[¨€E÷!›p1òWìÔÖÝÚí/øi›Çg¨ðÇ?娰>Kí>tðò”>ÔÎÿs¬"æoÙ +.OD_Õ”ÀŽÜ ´îÊjÄÿòŸÿòŸ?ñ´Ô"àÿ²½/ÃÞY$»ß³›ÿ•ó@”ñqqt6Úñlö¸Ãâ’Í#fÖ‹m?E§0‚SxB‰Í÷<–çkÙ´”4™Æ?ëÀ||âaBm¤ 3à‘'žÁ#ïÔ Ûirб+OE¦%Ð1ø™~ZÆ«†³g̘ˆø-ÝŒeƒQãø[[Ú¹ËâÌOCaòž£‰ÃØ/AÍj#òÔêäBõ0–aÔ8øÌ…w@­ìÝÁ“h¸›Æyƒß ‚ž¸;Ë"¢Å{ØY;9¶R¡£‚½-ýVà Óç– ˜ðø¤°r˜ 0Û\ÎL  ºÑlL䤑ø'EèM Þ« u|ŽÌS …ø—ÁÅOAy' О%°Y!0/úìx”Ðóð!Zh4'†Æ‰d„ƒ½}æÆ ¤EÌëOAŽ'äDYÍéj ly,€½ì$zFEýý¤(€M>…HQN£P(䴬ϠÁ6,æ4ú É Õ¬ 6—WµÜ­hE65B‚"~ƒhlCfiÌÏP4r±éô$L" ¼/Ð1V,†Á…ç 1ÉX7 mQñgTT6 P=  V…B £ULû]?P&Q6Üoµ4ñcI–²òtꈕƒ†CìS"  ÁYC¾B°ëPƈ”ƒÇÿtN(-ަ,˜eÄ5ÌáAS2hN%<ˆFÖAì, ½¡ ‘F2šCð§þO‹04Éû>à |Œît5"…ýÁ $C)•9¼ý>®bAG¦^'‘LjáFRÃŽÞ1±„û#Àã~Ìk °:VX‹Œ¢¦1/£0 À!]C¸~ï­ªb˜ƒ…iè›Kå¹(ü1@/>ºAã*¶‰Xa"›È‚?QrfV4&Ñ™ÉxÿÐC p¢Ó=ü •ßbbX‰¸‡,£ƒCìh¶Âë$:ö á)"öU~çÿÒÆ~ñŸ„hlðPž(¼vøÓk, óýr‰Ô&)R(¤ô({¦)σ—R$¡÷°âð2ŠrÏÒ` = á½ÂZ 0I¤Ù>¸(Î'mcX!´aÁ×ÿäôcžÃGD·êp>c¡ xž-¤÷t0ª˜} ÍXëøy‚­ dÒ!ˆ˜Œ†AæTysÞ᧓¯Ed3LÌÍ€Çæ‡"/Ãà9LZZˆD@¦¡˜×z‡õE`*C~'GÆ®B'$äµ€’ß2žë?"‡TÃëª!½àa#b®0©1\¡Ð»E¸»¼óxtrúAä"A<䃢™xgްuõ×Á\ßèt†°Á³®áüVDékyD › 1ü²Â¡GæÇåǂžÃƒn‘®bSÈKûê<ÿ RzØH#GJ}Îs….&üJP‡â`c`1|pu  ”tÈÙHy†mˆFtÙ°Ø. 40•ês&´çAEUù¾dÐÅ,žê@}-‘ ‰°g‡™€’{w4Á5:x°ÄÓéxN +¡@ܳbá¨ÔÝËÚ×Þ“êáeiiíávœè§¹½“—»µ1ûélïálîiig¬«7 ò¦cøÊÀýHT3ŒÎy6úXILø2‹©Ž7åhïf¬§7”IO¯WH4dRƒOáö’îø©Ž+Ê€½â:-€®J ƒr8ñ±Øüá~^ØÒÅUO˜ŸIYtæ85²åQÒmjhl‘@Ã6ûèšrR‹æ›xÁLE 0P½Ð(Á´'òK!Ô£ çØ¢ã9ÿøM‘nØL…Gm.æÎÖéydN'b°aój•©AŠ”ÀOåW“5š'4½£7†GÉBƒVœ‚ÉÀáñ”|‘¾!»½<SÂÇsÐ K€Mäê ¯( ÊÀ¡3YL55“çûÇ3õóæA«Ñ`"ܰ$²¡‹XXª¯›m¯[8Þ È dL2A (rʘ$Â=2!õ²8 ÌùXH³’×Påéá4QZT…p!Läy‹óʨKÀí/Ô-å5pO ¡¢BN|¨ ÚjËÃ- ^^UYBþÇ#C ´ æ·€úP€­’`®æOSK 4*¨2v¤¦‚½RÆì°<ýCGñ]•lp·Z¡axÞ9k\b˜P Yø{’<-X¬7x?€â Kwû8F(À¡¢“ÛnÃü³=Á¡°ÛCît3Âö€#ðiã:-M€Ž6zt¨ù[ ΃ –\Š˜#ò58OaEŒW há@šbNbqðÆÞ»ÉJ\:H c'SAeÜK>Ê +ôˆ¯ iàO ãh?sÝ ‚eKD=%K'â§@3ã,+pëûŠ) оÍÁ}¤‘¶ûyÂÌJ  D · ÍðC¤­¡Ë ˜kx"¹¥„ào©¡üŽã¢÷ÙR…NÑ@•K&àE9ð̘ÅÃ"' ŒÂ!¢›O›yÏaGˆTÜ?è1È¥Œ€ÙêQ‡Ãafc*üP™G.¸ðŠ:ÆÝ ÞÌ“ ù¡jTM0,äÂG`›Ê÷HÀï_ÀN¡©_xCí>?P ˆd(hH9é;ô§‡ú@[,ƒ‹n{bnçȃ n;é\LB{b]¤y3³àá{^;ê=m {ò'ƒT/;Ž¿ðàEÎñø¾D`‹@k »x™`"5m“éLÌ'Ê1 h1B‘»›× %ÚÕàXƒÚÐï¹É|Ol•ó%f8ºØ@O¢A³…2r'ã-l¥CË¥`y#òJ‚º—ï(9—B`$€àÁ/¦¡îe‰»XÅò· tÀ¥Ác…BÈÁy;>¢ ‡°ElȘ‰ç»Š :x°žÆ² Ù…îB!?o.Ø“AÝq¤Fº¦ŒÛtpݾû WÑD6™¨àüD@^!ôd¾€Ñ#¢F¾©¯7ÃàµÌFÁßiª"“ »gAã óÖÆ.>»hcKv9nI  †"x'ƒ ã´#žÕ»‡¦çó ?œ¹pã·:@ÂÇÈ»-ÍàªKôÒ¶Ð{k½¯¿2Á&ABÈ›LòšüÛÕÉÕÝÓÚÝž—‡5ÕÜÅÞŠ{ôn³G7áø7âTJCiÐGR>ÔpÀƒÊt›ˆAÒ"åñ¢}·À‰[ÃÞZàÔûMGÁˆháÐ[¨HpîDJýŽf¯p°)÷GHÚ½c’ˆH±?Òé¢,‘b@颳øBë¡öyR‰‹oÞ&¿`÷g-»7™ŽåèèJÅ ÉufîÀMcp·¬ @`zÂmÛà:¹ÀÀȦÁcN\GÀ® pø×q0¿f¤Å5”ÍÄo ñüùn…;z¤yA‹9n›@˜cžÍP‹E#8|tè†à¨ |Ãi˜úìmîþ9yõé¹e¯(( ã‡ô$ „á×R¹¸K5§.®áÀ{,ØNƒ‹]ĬH\ì^4ßÔÇ@½ŽàÃk'‘#|Á°l)ž ô\Øò‡À[h/fóñAB†Ð9˜‰‚S8‘|0!tØYhoƒ#¢X€°0ïv¡©—+NB< °‹´3÷lßÝli]ÝŒe“éðÀµû{_ \Ý<„_cûºÆøî t5ùp±ðVÈ(Ž¡¥Žy”báN <Èšê*„4PXûŸgÀ•,'§BJ‡K—fLÄ&YøÂ™ ‰·ÂðÃ#¡º $•tyMá+^*B¥µºéšØò$Jü½²ÂÁŒ8}†öEîëtŽ7ÌÞ:(\ûwgfh_ù^à -Óéf ê'½ÙY„¹Y/µ2*êD´~„Ö7 õÉʉ€¬Cd‰`Òù o[?ænnÖ.VW+{wª»µ›“¹¥µ³µ‹ç?»3Œâ$ÅÆaÑöÐM]Þ!+l…x‰ï#haa¼†Ex-Œ+#  ¸s¬öž=TF¯Åßb"¬wL ÓvôŸBKw¹ÑÙ0vt7Hë6ùtÌsž9·5"/hHøX— ôÙçô:Ý*÷1¢…0ÏþUo“wC³Û"BÕxÈ0äZåE†Ó'xQèÝ8tBÀªCtf( ¿D:Ïõ¨ôüì¤[À見|"`3 ^8añX¼oÑÛX˜4¨ÀõF‘¢ÄõÇ…Ú©"swÛÞ•è ð®è£¶€~ ¤ÀM,ƒâ£H õÙ ñâÆò*BbÖ=íG?ð 0øýHxDÌ»•Cé~õ[þBØ£y˜l/×E!¤‹¢ˆ %IŸhÂQe\Zðf1×Aèî͆ç™HVãï#…p†@ ð†÷YE¶GL€v*™`ïbcïûûÎü~UEf1pø¡<¶‚(Rå;?BW¿°0žó |‡í7 ©€ð€xí“ä{;Râ‘ ªm,O†Á<á\Áã0 Û# TB¼R£q÷YFe ²}…«C'Ì =&’ÂàRýqy·#8ÝY N{ÿY–"´ká oÆyFˆýä*ÀÀo9‘pÃÂì¹rôÍþŠm£CÞÑ"îå!ý_X¼=9˜Kaú—OŨ?5!²`0NáA {­ü‰Ùý‹Ƽ 3$>tá6ûD€’Ÿ¸‚ û ݪ³öus·ö@x¨v@çÕ?qo~ìÞá´ŒX<œ G ‰Wg \U¾c(vYïŽm󊮂¡­ ²·t»õ)<À žîö.¶=G ¼¹åºÙ>0î ûŠÕWÇ?Q€J TÐ-!èJŒ –×¾w»o?Ý›ížB 5f:($)4;´‘KJ—OMR@{Oð‰}ÀM,ü€Ÿ´ðóÎf~kEé±åÒã ÿdô ì”åÈé='ÿ ÏpB†ö4YuÙî·‚ƒ–¥%A°fO ºúG#5ÝÚÒÓÕÝO …,û--‹x´bÆvè§Ã$ KÄ% '^^«¿Ó0yœ’©˜»%Yèß+*°G=Ad,CÓLV^È5‘7“|·7ì¢?†T2~õQ1ƒÖ“¨F”ŠÕÓ³Mac‰šŠr/ƒQ'õRKÄ "蔺ގNƒ¡!wñ8Š%c^é.fÜ\ŠG—!¨…õŠ‘0GÈÚ‚"FÒ0×ý¢té@ºS`t—*Ç«†°Ò½¿h„ü#uÐ;.~#EXeáÏlÏÎÊ ½—êµ}¸ÀpÇkh¸ð: ÝêAWºÐ¥7®*ßm…³¾TÞ÷Tbö.##hWÆâñ"7ŠâN(¸w$›•H ¡[DÐ7LE˜M!?Y+®ÛÈ…éCXiëNÏ¸Ž¥FïÃ%4,a”v‰ +l†XäUÞ „—i·°^†¢¡¶„Âxñà"Â*P„àá =ÅnýîÀDH¸ˆš‰˜`G+<é0𬗔Ï« å:Cw>yA`…ÂÀ²ÃOb’aüOè (ƒcÝ2x·OÈð_Ê£ ÒBǺ1XÞ8ï}ÔüÕl‡ …9T"ØêC÷4©ø•F°+AøÐhõ[ ëƒJÒp)ÇŸLauHÖ¦;|x^ƒi?@:¤ Ëx½ NT€…¹RH~)'hB×Ò¤Pœˆ|1CѲÄb¢±ã÷æ„2Çð'Sí…œC@׊AÐ!"ùq¡1 F7a$Йª^‡y·?øì"$+ŒÓn£ýd‚e`¼U Æ=ݨ‘¸±qé$ùT²ƒ”.* }a¸#˜ð<ãÛ{ì8B6U Ä›5y –;õñO^/Õäå%ø&e !¶‰ yT cáÈh›jô“ ¡¡§×+ƒÀÓ­¸|o .nÂ’H'²‘ÃX÷ùDÀŠ AlƒÅä]üê à]øÓêÇãÌàôÔÛB%   Ø‚D·Í2oÀB싃M¥…pôüƒ.‰îÇÇB*v;L->»;ÆÆ €§_V]–§C€ÞB÷t4Vá0f2ÆTáþIV½gQ~$P̨9§AÙ „nbZ8'è6>Ùr†oâ9þ¡3{xêÆ¡÷€Î“r¢TŽ€ ¯¦sÒ‚`ðæ‚¢¬D3…œF)†—BeÒ/Ñù"=ŒÅ…w 8ÆDCð•#1t('DQ'¥‘Ò`èFÈR„˃ÇDAT¦˜Z`»îQÀ J*Y•’+ó‹…#×st_–PÁ`ðíqp߇¬=l˜Y²T8WЇCÅÂoóÎ'RQ¤ó¶9}¾ç o z+@‹áò=ý…ü ú&ÐÜee•…ø‘5ºKà¡¢ ·3WQ>41L]t±¡ãc$iˆD‘D$È¢ d²¢¥z­¼(^L^Mì¤D¢ÇÑ)~iÞ ê'.âû^̉ƒž%PÒ"•,v ®Æ$óA@-‹ï$‚Í>ßø€¸2ÑAH˜W ”ã€VýHijÛÐÂh@Ý@*Ä;Œíe‹v7:„IK`°âÙ<ä‘H$a¤{1ãáµs: ƒ·‘…’*~8‰îV÷@G7P.`ÜL:T&hlôÐA×8`¼LlVn®ö¾ð‹Î†Q0yX ’HD!8¸Täù,“#L,L~Œ%G€«?žÂ +­ðÞ6Á¨…$g äÆšˆ4Ô6Ü~ácL‘· Ç¢Žªÿ–ˆD(žÔ ^DÐbþ0*RÑ„) –‚U”„§{Y ½.Y´H}/Ã^½PqÎb)ÄíñÏä2 ôøøðpDæXH1üB$ ðâoÓA<Óp­œH,gØwœ1cÈFs YÚ¹²9èŠ=¨ÏϨ ‚¥ß;%˜‰<™éÊøYßÁ“¦}áoÑ(Bžöhï׃×ËòŸwãà‚žoñØyB–dAjw0kÚM…#!u¶ï^÷ÐèzC qB®é|/M$0΂ĶG´!òœŠa0]ñ >)}t?Óí‘|à7\W°Tøñà"qñø{3_ÓøwgWø›ùÿ1ÒÁu~C@çÆr®a…iؽ*¶,\ƒ×ïQ lý–¢HFñÔ:_  ´4U#‚ ê _PKÈ—H]]œÊ‚• #Ìe 3ñTŒ0l\A“­Þ$x.¿¥¦¿££Þ|z‹ŠèPÌQЇÁ½~=;-ìÔk_²¤?Ì”lo=ãäæÛ4Ð Y.œQÁ¤ÆLûÁ› XXl)ÉTìäÿ$Á~3¢›.ºZþÇ3ý¿8VBüÝÁ÷aäXt\´µ¾_ø—ÝáFLàOÁO+Óeæ0¯ÿ’G$ ÆB ‹OÂ2mòN…‘-pp7ˆßwAéeèX<(Âà-JL¹ÀR aÎÇü»ú\"Q(FÔn1«–¡0ŠÙ¸ÀÇŒ¢î–p×kåá >þÂÙIøIRgZ!µ[²xSðTµ¦.ÑK~º×[‹}n*°ì}ÔåÆ0BEá7tÙ7\;á†À`1¿‡Ë#$A±‹–(ïha ë_Ÿ’ÅÅ-( ¶`iø2@ŒQOz²û^;,ÌêåûÆ—(§ÃÛ„9Oà%t´èÎܺÁvø€¡ –ÎÝxëoú¢Òkg1Ltï`C'ûزp»'û|Éþõ8ÿ° ìM êÌ{ê@¿["2†ñw¨Á§ˆ4ý ¢þ€‘UÖ§,ýx“Ò äv(¹vsÅÁ·xä7žn*ó·˜S'õ= ‚ÑcÚ{¥(Ý'Dd¶þýnö¡ Hð6Ó‰ÐË4ËÞ†mŸÑŽ”Øc‘’–´éñBmJüÆDò*þ/ÿÍbéÞé7 æA¶çÁr¯MˆÒVµ¬WQÇÓÊzÀ±²B,‹d´ç±f(Þ1ÊVÅA¢:‘—1IH~ª÷1ˆ?ó‰îHS‡Xû‹úWçˆ!Tâ÷ýä+T}0°žšK·ûnái o¦®DÒ¹ŒPt1 ½ jò2CH‚œ{ø-O~Ä1lV8Èš†…VÁü±Ê„¾¯Ôñü–E"« "NcÑÐQ˜èÖÈE}€•}€gb0ºÁG©çÐ5‘јW¿u"#™çþÚ Ñ¿×É~ßYã> ¿rqÀ¢¯ËË 'èyq%€B¡Ã4…0JžM×2aŒÜ&ˆÛÄž÷F„BäÊ÷)»CèÉP{[™¿G oíÁg~_ ‹Îæ…»$ûW·Lþ¶/¨‚S-¾S…p1á‘#X Ñ;ò®N‡Ýhê€JíZ²Ñœ ª‚8ëÂÁ¥…“Ó "K낽,1u¡ÎðxI8, 8÷‰‘8 Ï|B@O£é\86ëHÿé]ª@J ƒÒán}È”^DŠ–Á›O¤ýç@ð½w­ON܃Eò$b5ˆ' ß¡ãÙ‡òM‰½—íñ’/2„§™á­ x¥€”ø\D„yüXGwÆ&÷Æ;~Ëþ}Æð/°…™)àˆÆx( èù^éI8ß \ÿB«B 3º¹[Ë(^6ðãoÜ£ñU‚™qñêppȼ¹C£ÙAöHhæêM­TGI=»ƒˆ…g¶Èï#!<…¹dãyfT£ u&䃓 »øŒ ®IhZ2*ÿüÞ­)uˆBãòý½±p°˜²ú¿äw,Àøoü†åqa0v¯Žº¦:Y[à6M’¾ ò~銄l;„Å$`¨óÃç ½Ýň•Æ(ÁR.°'«‚…ðØ··Í_·{¯}¼Líõ¹dIéÿ¼ž´Äõâ|ýW¨Äx‘¦€ ©óîB÷hžÏ8µD|69 AòdYüLJ ¯I‘O‚…#ü[@»Ä•NQÇoxá ÓÔ-­ð¢ÕÚ×-ð/®1à‰ÈVnè_ÇŽ§ãwÚñœ,–‡©ŠÎ0×7è{À€ÿ?öÞ½¡#Ëý[úíF‰A’Á™™ÉŒv°ñälI~Ïó?o±¯;çXy‡Ü›¼Líá6ÓÉùäÝæ›‘Þ»*–{ÐÛ…lzš¿ ½ÅûgÉ ™\¼9íÇiç<‘ã?nçN'm±÷vá)êΈý¥Ì’Ð(Ô¸øRH‹ä¶ÈÙ¼SæD(´¼b›R>$¢”f–—m+Ù9y»þÛnýŸëm“ f’P^qG©¶«èÉl‚f;”`¦ ¿gÉÅP°ÃJ¯ ,Ìkä‹Ã`ü× ‚nÚ~-- ¼‚½F0¹µWl ¸|”jžœ€I Óæ/­Uª­Uk¶[ͪ<~õ‹So³Ý¼¨ª+‚ÜZkQqcrv¢"\AŸ«í[Î K¥•¡ ˜86™Q}>߬¥¾üÒ±S¨aVW™Aá^20|þP|Q¨h¶õÏ6jE¥# BEµ»{»§ûOŽ^n>u ¢¹ÜS!“:ð¼?€aâr‘ݵ{ë¬ÒÑSv!JÍj*ãRfPó%æB‚ÄL¨ƒ_ö¦iŽg²iŒ$Ÿ³D›Éâ«S?XBG•œB±‹¾…Ä"v Èi2Zgóþ¨wß®TxË!'Y¡/)¢çœõ0^÷2óöΩ†úYqAï­+FIG:»Ñ?ö7ðŸÍ¹ËU,ÕÿQÕ…½H†œÏ}$GTÙ*½ä]Ÿ2í’d‹Ë¢Ùƒ$rÒOGCÂx‘¼?šE²3%OStÝO£ÆŸ¢oð߯CÉ»¥Ï¿n|Ý¡W_×Ç:¢Ax*Âc%Xªn·„Ä䜥IÅ„3Ñ^¡.VM²rog³(¨?Wã!¹±ŒFS¸F;ã‚ÕãxÙí¯GË^X7ågŸ!¦ëÚÀÄ"D(B¼ròÍèêë¶t ÍÓ"8+܆¿Z…§ÁÕì;Ú} ŽVÿ¸»ˆWîíúÛhc}cˆ?7×7éç£õGôóëõ¯éçŸÖÿD?ÿ¼þgúù—õ¿ÐÏÿZÿ/úù×õ¿qGi˜5wðÅñþ?¢½—ÇÇsv%™[¼òé\\üŒ¸“N”„vA¤w©S¸‹]¼ʶ!¬m)Ð[Þ‘„èvá’wøkÌÈ+ÓÐã¿Õç–ŽËn óäã\ƒè濊vi„“ØøõÎCd-|Û?Þûa÷ùéî÷‡§?#Ñzrpú|ÿä$zrt óòb÷øô`ïåáîqôâåñ‹£“ý†W"ìã–ɰ+s6ãp<8œMh6"N+‚aKâ>d‘R K}úüeô”¯†èúGt£C ÂÔñŸÀ*8~P<’Ï]wÊ#mBêÃü!˜ò”“—MdÕk 1Vý2wàv|†9¹ÄdˆzÿØéY"pèj¡øñàô‡£—§ÑîóŸ£wa~Þ6$´:X“B’êâqÚ—Y3L¥“H6¯9S{N‹C±SÔІŔK‡|á0õD¥üm¼Å+†ágƒ‘¢xyÂTmºNÛú›Ëét¼Õl^__7.†³ÆhrÑpió[êÌ‹…€ì†7PJºh…â¢;©‹í¼€óø7©¤á¢ß›ìÊâåáÜ»àö‚€ ‰Ï·8ÄÁ@Þš4Œd)am4XºEÁ3MU’}J_À&‰d)ª½—?(8m%ÎïhÄÙ^žHfRŽä@@vi¿»"*C.¬(})`ïÊ¥šøWÃ8¿4Ñ#¤95ñNQ6ŠKÈxëL ©”OX7-8°ÎŽuã]QÕJò½ÙÕÕ­š:¥¬µq2 Kýh40µ ŽßIFHÁŽÉu®ÉZ«õºô¦ª”[rj®ÛDW49ð˜sËáõÇZŒ[aÛ¦ì O Ãrás´¼dŽÂx7Ñ"·XÌ ïRàÄ\’#Lß[R\µ‹Z­_J¯z3oWs:O‘9ì¡L}BWg´$<3¢Às檊”rB'ƒì-:2_E–›`ù˜,„=g8´e&GqÊø«”(ÉÂ.§#“nFF¼MÕKÏ@Ühh2ÅÚ4˜{‰7½ñ´ûÜkÃ'q¶6IšL§ŒyâÚºN¨¨ª&Ý¢§–0þH¨Ý¢(OÄÀ|`ó_NVC± ÂI<™Ò\üàNÍ#å›'ˆN.œKteÖ4àìħ¨?l°•H‰Žáôµl@³…9 ]JþªÌµ¹\6ÈÅé£,Z°^wè¢H¡»ôÁ"HÎxTB¤|7­CÊD „€^"Ù#ìŽ$ˆ×,š˜Údˆ$#¾ )Üßä-dÑO¤>â°Z:ɘ…»=ßUÞ-Ý>§²åfuȶôÃÑÑßÛøç’nHÇèç•NÃQR¦/S—îÚþT}¾1µˆ)ŒZwº¬O‡nà³$AÈ4šÀ^ë(bNCÃYÓG2]úR'È j¾ &#˜œetöžõòÖIˆ¯Þ|f+7rôö$¹‹rÒ‡6o‡*4½‰`ÕnD!Æ®Ò:y2vU ‹¨gÃÍŠá8ݦIPh»3?牖Év·(ß ?5.ãé]T­lVïî0Í€;òÙP¦ÅŽûÕîñÓ×Ë@@˘á ánñWØÐž4á‹Å"æS%±Sç$=Ã8š) *2ÄK𠈦’F mø¾z6Ÿ/b¥K¦9KL)¤w]XÄáÖ)UiŠqÃøõtr+†µ.¡ƒäsk¤aŒTD8(‚ÁÌþÁ‡DeA3tH†E§¤ý”º‰mSº%îô¶kçp=¦ùŒ®§Ÿ8A¼!µ\µU )ÅN’[_™>Z(J¤Až֭Ϧa5î}ÔB•©ÂV­Ûp{ ë< é½<úà—e”%þ—ñvèr]˜·Ê*alÜ‘®¾s”nó!Ÿ'›Þ î¹õÆålàÖ5‰xÈÆP×X&{¬Vƈ=Ïs°4XœT­wL…‰HÖ]—×èÛ:RJ¤µ!§Cç *l}%¾Ò³¡"íõœz Íê7Ø`Òkk“m<ÇßÊV×j½ç©›ðÂÇ™Féå00.EÑÕ­ÑÁ˜ž¿·‰œ#»bŸ®Dû7S }6ÉÁX\5¹ Li_†©ø,¶«§È×§˜Bb Çj«Z ƒïp‘eùûªÛ»ù[Ô F¿ÌF]ag¦Ë)#à)i2ƒê±ƒfÖy˜òþ>Ó.&kDÌfÈ í²ùWhW0ú1²)3jê™$]`Öûª´CTe pcª’†·%ž'ÍõÃ'ÄÔÃÉ´ý˜Tj·ḛ́ÐQDýç0½([C}1Iu2‡À@œ¤Î v“ åÄK5¢鮞ÖÈW‘ÿÜÙÂ;`Å>>w~Êînº+Ò$ÏáVP{Š>Á^H:F-´é\T¦¥ðKd@qÿ˨©ƒJèx£=¼¸ Bu©ç!4y»>ÛpZƒÿÂsÆŒBÆLŽD²\Û¥×­„n`ó7Ý-u|½côÎ/ cZðN°´IÞ4ûâŠÝ舖ë˜fÅkàg…Ä馮fTÎæ¨Ãñ½š!v PÊòöß%øSˆ£3ÄÏ0ÃR™7É™v¨»?fU¶G$Æ¢tÇFúèÈ¿IB%ðI“ޝ^c ‰A2[P´ɹÈ-¸Ï¹*È×U©‹^ 0´þØ7×6B]ÓXÌFŸZôJ4†¶¿Hª@Í”hw22pÿ¨eôêÃÅVƹá˜^10ý]¿‡F~öZUëŠÕÕ—ôݪË^;óuÞ•çóVõÏ•EÀ’ œ[ø«Àtç¼ÊÔžÙS™¼öƒòÞ)(mà 3ÞÜdZ û4VðÚ‚Z¹. M>7ȇ½1èÞÍ.ƒwBCÜ•{½u[Jà•ýI¹ Bª¹àÖИ*É ç˜5ˆÉpÜî|á®(–}©Wš4%÷ÙÅ¥+!— âŸØÔßñ«Òéf«0²/Е”m £ñˆ³ŠaevÔ4ìxûH`‚˜ áxMöz⣪‡ç˜R‘‰ )\ŒªLXyE„BBz,>”ÌDf×nŽË©Nb0MY íÜ6;ä}fžzœ;åYnî‘ÿL;8ËŠÏÛÆ>eYNq#Æ5Òçôœ·hÎ"xí”sšžO%óˆÌNÙàVªÝNRÎxC±ªj+)b’Mð-^däràkŽpžå¼#•Ë-±A¯ ÉY£ úŠ=– pp& ãBvÌŒqì… 4âov‚]BØY=rNáü=C׿E§Ê÷ô·Jì©qòŸØQï@7}…ˤyÆîô8G­Œ×ƒù×5@·Kÿ±Á6,¬dBÖÀi‘W"ßwW¿A¾Úlž*ÈÝT LtNøÙþl˜õ”0ùÑ3.øÖÙ¢…,¿Ó¿áÈïÜ¿ìµò"ÇÚ)½eÀ) %¥R^œÎ˜žüXÔ]°X.e®¯ú$áR»®¼ qœÜÿæ8â£{lX.ŸŒ³\,í8ä”\lß©…B#ÜA¨ˆüRæT•—9=㛯¨z…«_8 Úó’½Frfì#›Æ}s¿¶‡nN™ìn ‚É£rß^‘ú÷œ¯—¡êû#;][´\íz«<_ÿàfµÃJ¶œT&÷ì¦ΓO–!]ÂèÜÕßÕ<ÆgËm׸!ÔÌøÕ Á-Õúî®~Ysg‰õ^M(±{eH„ÇN•Mt… 2àN#gÃD OZz(g ½ÀÔ¶Ê¥z}mÇ*^…pßÀÄ9 §ÒRZ&þ¬=¸Lã¹ œ÷Ñ?ZŽ€/\£üI ”ofz,ܹ ´pŸ¨[r~ •oŸ¶—TQ:u v*üïüïæ?oÊêÀœÕ뵡Ñ;¨ž3£qó4Ø<Á[œ…þ°arËiCͲ*Ñ9¸Ž+F-¶ÌåÊ"‹¬s+ª–¥MåN*u4N¤!Ê„‹®*VÀNÙq‰£8 QhÍäèà/;?_yö­œßã9òòcñÀu²P4¨ÿH€ÚIˆà!1sÅS@VöâÏåãbA;Ó÷Œ°M Ì™Z ]cHNÚ$×I£H+(Q’³ŸGõ·Z2kžÔžë¸¥_pôÐÕÞ¸µ9zÍuð¢à˜ &N¹rv« TöƒJÌ â°pà„Äæ±´Ûï×Ï-L/†Ét‰n,ˆþèTºNNq<ìÛRÁ´ Ë.½Ÿï7Ób_™VSŒÊ–èÒãVœW¦bëÕNªÞ@ë;7_/VáNÎIÖgÓñ^;˜–CS—1+ã¿éd~èåÜs„EXàèY¹Æ £—“£3YÍ…çôb©ôÉÏøkÅŒÌxÔô äëÆZ»leQ*â\0ù³d§ÿ<ö1ãoN¾ÓèíoÐß$y±xFUwªôÕ(ÿNV\Ì0wÙFðÒDaÄu{ƒDh£stÊšÆN.ë‚¹ëæ€fe·I”¿\;pŽ¿øbgíCa¡ ZYÛùàÎi|S$YìHP±eU“©×ƒ R¸¢ë¹Ñɳ"“-kˆ:ãŸcH‘ÄœÍúØDrž¤ôQS#Éo8»sõ³Áí`6¸ê›¹³õ±Ó¤ñÜ™ ÃŽP7vZ« èK¥ª¥£•Ì×á·,ÿÉGǧG/N—À5 ŽºÏõ‡ÇÝãìMèUpæÝ/ýxì7‡Nr³ÆÀñ²³¶ü6òæÎÏwß}˜W '“ãáòÃï^>m¬4ˆp·Öa£æŸ’2ß5æîpó±Ýätñ‡St3§ÙȟŬkz>’×@ÿàjÝUÞ¿Ø}º\GoÞ,Aއ³y܈ßHÞ‰½×8Ýá?ŠOã¡mþ˜@§†˜Íú— h†¶5±! Í÷Ž,³=Þ¶É>>”K—å’Wø×jô C_PPWÐ`ȳzƒÂîùT)Ç'æMjÿ–ßúÅRˆ'U'æðbœcê윭îÕš΢ ›"~‹¼ÀMV£ùÀÌçÎïé]kKݹYD"ï{«oÙrÚhþâÅë6×›ndq3zï5â/³<ÁDæ~WVa,­Ú«èaý¯ëõ×k¯"øîÓú__ ÐY«v×ÚˆZ›î‡ãœ®†Ý[Пü*œñdö—#Ð|÷¿ò¤ç$Ä5©®"ú‚¤®¸ñuãÏU{¤ÈY(ãÌI"qŠ×–hÑTbd) tþõz—âÞU¹Ä–vݘxKº "‰—Œ'¢·¾¦EwþSAn·)‹‡Hn)hÞéÁ'ÉVtÖIûÝ` E±Á\žœj[¢—Æ’ƒ–é (çù8˜)øuÖÇpòá”×áG ɵŸhìS½7ÃŽSX˜j <ôñ,ÁY ãa÷VÂûîØ TÖ}àzæF=˜Ï§‹Óݧîàh ]âñ:|S¹íU‡á»N8þLœË BºvωLÿ˜ t®?ë¸ý½øðuÒ4"“8±vßgŒÿt”å2mkõ/qJ"fŠ­±el`ÝAÒzAý´-éäÙ°L”ýzÖ2š˜ä((1£ÏYüÝ1`„]Ä`½ÂD£³A-ZG§Ù*;QSn ²SÑ4•;°qHM:ª=-›„jÃ>Üù^gÐñÒàˆ@[Z;“9iRЦ¬“¿MÁˆr‰c§=úî­ç Dáôh©o/õÃÙÐoRÀ¶Çà‰CíIâ®CYïŠ<¼·BCН/|É´5–Lü)‡ï¦õrÕ!†UMâÜ9;›0Ü%}Qå—„¯ŒC3§„L)úÄ6ÊåŸc½¥Ù÷Â!ùÈAÔír™ºÍ'œµ0p.€·øì*ë{8UºãBë½YWaÞÊ‚®àŸ—ÀØÓp9J§uð‡³…g ”ÍU ×Û–ã wòÃþáap&Z rxº·¾ŒÎ‹t‹^>9Ü}zânû-~ý8Z½ξ†®Æ6üÚôŒ‘^¨¤)o'<‡ý.{Gëm¢_½Y­ì¾<=z¶û÷}×»ÅUdß(G§¼4‚:öŽž?Y\GùØÁJƒ•ú~©K_ íÛFÙ,ZFHƒÉ–6¥ b²)äí8VhaU 0¯†‹dŠåáû"eÊ`´9ŠŽ¾ÿïý½Óú<»N™reS²^;ååGÕÆ`Te ×E‹ÞeJå¥ ã˜>JA8ØþNÚlµàûV¥Ù¨`›i³<ÚÈ y„o£fù£Ò’Ð0^6ÓÔ]³SbSvl|o>h'œ lø_ÞùÎ]šò‚¢¡eîohr¾‡ù¬×OŽ^ïíÓûy:hÉ[.k~ndD­ÚèV£UDNRÝhj°K¥‹'›­,‘7Üeg"íSoÊÖ>@•÷ÔϦˆZE¹ë•™çtwd6G1«GËn׿w8§ªjz×j¼ú¥ñz­r¹3:×Ðæí³˜Ë£F+¸ß<&@ñmŽYÜÿÀ0eTÂóx´xÔj‘‰%¼*ª¼ØÝûûîÓ}`Ñ»3c-(@º±Ÿ?!(¿ uî©%¹€?‡eë—"pWî¨ñ• 1`êHͦuªµ#ž$mJ[Ð=ß©þ²¢ñJôýþÓƒçxžNŽ«Z 8§ÌþóǶDÙDŸ×­†ÕbÆëÍŠm/Âëäài³·MO©~}¶Þªôâ<'¹e&>3©ÁfÄñ7Œrþ¢…ÊøãrÍŒjXc¯s(Fqg¶è#¬(ïºÓׂ"ã8G3mݹ|"oI‘xÃ,·Œ­-ù±„KlÊ™EæØär¶˜ÙñóèêBü[ÈþLýô³Nˆª+Çp°r±Úd\D÷9Å%%H~GFÜ™¹À3×]¾¹Å5-fÎÊp3m‘‘B0ý#™`^8Š“òha#ç(!DŒ Œ " Æád`.¹V@þ>a…)‚Y˜7#7AnoǸ!,³j?ípÌÞX‰žúÉ X“$ûãWB:çщ‚Óûä#Î’¹"¨9Åîv§ðµ{@Ý“Ø+qø‡¸¡i÷“c©€ÉÔ÷ ÞÞ­ÿ³Sÿ íÍ׎{lWF³%àäa=¶³sòôa.DTßÐîV⋞$Žö°¶uAex;ÊÖŸVS †Î{ˆŸH@6œ¤å«Îä-s…#‹¢½=ƒ“㌠ÓÔ<=ÞGÌÎdì«Èaé7¿ýrCýІÀµësÆïaQ5AS†0ÃÞý>QDGܲ ÿH¼1´ÊŸìJ œÖøJÍYn]FC^ˆð%ås2%Ðl£Î ½£c]³#Kædä¶¼'\>J QXG(\›@9’qº…e;&¸ßèÝa’jšÍ\oèSN¶äÔ`·Ѭ’ï·Õ¿Ž&Œƒ›cH{/»ëœó93ȵÖäkàйù~kCÒs`nBzoæM¯¾†ý׌$[— p‚Ti4I˜&•‚YYˆ·ªåB²²Io˜>X)Tˆ¡‚L¢Ñ¼¨ö¡w=Øÿ±|rpôÜûFM«Þ'NFÜß•Ä#7ÅÄ8Ñ7ß´OÛûGOÊF,ß €­Åý”%9lŒŠáµ{ë’ÿ#q«±q mQ òùh´ÎPçÌsuRRJ½˜óôWdç¸Ãñø_;Þö‚Éòdž‘0,ÇÏa'jÝ;þÉ?è_üþw×]ØŠXLæ·#F’;þÉ?è_üþw—,jGÍ,óÛaÊý ñøßÝù¢úÅø2¿z±`ÜñOþAÿâ?ð¿»þ¢fÔT2¿T¦ßÁ?ð¿»…ëL†›ùõÍþ¦¿ÈOþAÿâ?ð¿»Ù¢v­ÝgÁÚ;"à  Ðà3eh,Þ•GP– ðZ„e—W³G.?‡Ã¡™£wè_¢˜D ›)ús;ùmΉëÒÀ3uí È7åв<ļñ(MÉ_Xˆ Hèt&®Šk>.ÇG¢A°OÅýF¿ ‹Ãµ]º^ÁîFòeá)‹‚Ð/Ç÷Çü\оkbvd⿾ªØßËæAÌ ê {Ÿñº˜ß±ìíµT¨š³š£PeZP’(a-Ûb¡ *qÄx+§z/ÔübÕ­HßTƒ/°µÏ {á0f€c¸¥|Œ RÔ°ó‰äœ» »ÜÄzSÊM¦t›n†ð‡!¼5onòú²G\4zFTFN½ªçæ|«ÄŠÈ‹³ZDY^Ô†`Í-:á=ÌR¸ßᎠ®&þN¬ßüóçr‡K@–ø c/žÉÏUãuü¡ß«ùË"výÎ3ë¼ô"oýg `Ú¹¨E¿=D—»9äp‰AÌEà Õöñçº;]4”姇›òû­\i%Úµèb#A@sì]¶Ù–ÀP*͇](y° …¸ ¿'ðB.ËúѬ¹ÏøæÖ]ö¸ó‡møüÈ …}r¬S´,ù£N_Z𔪾}Õx²=­¨ r8oÕ­˜MªþÏÓa‹ì‘FаÙu ¶·T;9 Èàjù¡•èd4À,Ò›6ï: ˆ×|ŽŽSÆs©{ÑoÂvkÀ_ßÁ_;þúO›6@†Á-­ä¢Û5@ñßúƒA§‰>àmø‹*é÷vþô׿üש)¬{{qÝ®EwÑÚ¬Ü5ý6¾~´I¿t¨‘~K¥ïôÇ~Öh¶¾PÞ‰!ù:‹×³¢ÖWàMÉ;õ=˜Âÿ({ƒ:J·Õ™®Í »§IOxör†Ëq:±\•\q ØŒWQ¦—ÿ½]HoûÓÝrÃóÌ.n0š»Þý8é¼âÆ<žRçäS<‡<â}Ç¿x’ßöaEØLƒ~¬±I|Ü™ÀΈÒŒÑÃ[œöÚéå$¹™î´â ÿ†G$m9 |šµR¬ÛI9ÞÖI‹)R%{M6;ŽUáB±™ ­•fD%“Ð\ãrçÈç7äU¥m–L à"ÚøöËͲˤp¡N¤ ¸«.ƒ=âz1uh êV‹14°™´Aûì#¾CmË '«V‘¿­}a–-ŽsËU/͆¢6B ùÜï*›þrÛ,sµ@WÚ NŽáêj’Î!Á¥fc”9CÊc\XË+’5šrªÔ}‹pÝIeï•P6¨$ÁHðß3´JÐZ¬ä”)_u.úÝê_|ñl÷éÁžñË€U~Ù†½ïØÿiß/TÎøtÀ±2Vg¸ªº—ýwëkŸ%ìw;”@ü@L>ƃ„°uÈNš1Ž2è(6³fJÅ™…"ý)e"æ,ÔxHqo û°§f*j‰Nuu &x$çSŠ8C¾ü²iI—$å2'R·ÙT)¶ühJHÎH>‰Ë˜D·sº"ŒÂ5Nƒ />Ý=ÑGv8¤ l‹Û(;R)±³ÛkæìVÉ99 Ï ççH3¡qÌ×J ÇLqŸ„à5$´ŽªÏ9_Éˑß\¦kÛ¤ü¾ìLz˜æe0K/ Ò¶‡ì)\Ĉ…o2Q¬¬¼n¶¹I±é®ÿ€žíç¢Ã>˜¶§øYŽ3Xªo>áЛÖmXؽfʉ&ûcgËë¯ï#ïjsŒÄNžI~­%gÄyßcÑ PÄÜGÃú ÃâF¥¸šŒãœ-Kì´,Å.å`L%œ‘ ysÁÉÞ1¤rè&¨sÉ|ÑHL0¦ŽjâÐ˃Řl¢åaG ¶*G{yS„Ÿ¶ä¶aÕ¹Ú1üÃäCì†1½®Váæ€!T•kÕ•mÍ[YÛŸŸ×ðÃ&FÁ£¦d=1ÊûPcz)uæ®Äý©Þ„ÿöÓQ|$ •áPš»¹t räŠ\K¢´œÇÎí‹à;ÙÝMó¹wôìÙîóÇ' fáQBmï={Œ³@H¥ëÌЛ<Û0,o c\(ÞBuL‚˜ú“oDøæA9ÛïB‰¥Ù²Öu®¦Ž/)íô%°a0Õ—ô\Nȹ„;¯>ª­SÇØ]-®nÖDÑî ­›tö˜G’šs)ÂG5cÝhàYˆ^™Æù`‹£IJÆVk­VjðQ2—H Ÿ4šÎ³Ðå9Ú,ez›NFÐÁ»§?PNâñ“*e]ŽK·ƒß²/"°žü°'”¦U€b‘ÃÄ÷‚T­‘Û¸ yÎw¬Ÿæ˜SŒçfGž!‘ß©"¡çUàú¢Žë#*¹½lT¤:çfFhnÃ)ZDÓKá©ÂÃ$:ÏèœÊkB^îˆ4‘æMnSÒ3“1Úï‡Ì¾pÑft[ºÕ¾[ÛŠçqþìzExž7¼ÙÌëѬɢY”æ0_-F°ãžŽÌ.\Ø‚6ò¤?<‡Û͆É%Ä¥Ô@ <š¾r˜‚Oñò%úûwÞÁõ@4žW^!ÆÄu'E%÷$=¸úi!kl®’Q4[ލ´êŠòêöSÅ©6ó‚Ãl‰>DyRªC2ƒ­²¿³x(K¬!WÐ`Ãë8/ AØ\EÕ‹n—’Ú—ƒ‰)$FžþÙÌ~“:2Æ h<†§zÞÛcµgOa?‰œZIeo®·’›Ÿ…KÛï°ÕÉ…^m=›½J$7ãBì¼±¸Oäb¸·÷&l^a)òÆóCû›kªú~оMuut9I Í=i±hg-¨¶æpctMS•2™‘½½(¾ëOFCR;–‚Á©‚ÐÖASEyŒb¼bûFGjßZn2x[VçÝVÌ`–uß8iÉÍ´‰Ú“²à‘Ë:no5J1óÙíà±£#´ ¶™©„óP±Mõ7@vÅcƒAÃÚ¿H¹ðí.³òNsC¿GïýV ¢—\…Ÿ[ó%šb»Ü@©jsaª•ߪk» Z‹©Ïôõd=q`©èü×hÓUç 42ä „<Å›QÀ¦Ízo“Þ7´†eÎqÉãÒ2§¸tÿClUE1bÊCUúôSúÝŒÿÓ7Cx€þ'©ý’t‰ »'aß™«­aK³€/PZø»ëÎpj¾4±°¿éö ²É¥iÏDµFÌ ÏL§xâût“¥‰f„»>¯ø1’¾sà {k—09™aR %a"çúÅoØ`DÍY¢äE»·WÉË&7jFÜ~!ë›o¼pY6r¢ì×,ñuUêe5.¯”(Úi¥d3,âXÌ1†f šÃùÍ:îHÔŽA#œ€Plôq¢0gÀVF¨÷»üËp4Ôßáã=Ñɲb¥Ð*ˆ5ƒÑÅh–²97n :1½ª­—ùŠz͵ô§LÅ«‚4bp£{tŸwÓ0%æ-¼PFï¾AûRÖЪV6[Õ0DÞ)`’¤©Aû>ù\¼“¦5%E2Uv×Ñ‚¢á*ïÝÉøp}ó ÚâV¢Šû<ªç¯\90fU^==Þ}Æ@Jª3¯ÙP>Ì:ý‚ƒWEÏN㘱>k CÍ‚¼â9VaøVÍb¸ià®|Ž{MxÒ{Ò»F÷ÿ¾S±K~®Oö«2üÙÎ~È[.Û`·Ê³ ²ÃŸ:Ô¸OÔ?€Á5ïûŸª%`njöàŠÖ°¼ö_ìGO^>ßCôË“håcZq`Q€\`˜Û$iã:´¯Òµ§£öõ£Mž)g²Ç˜”/t†éÌs-gh¡?‰ñä-ŽËº6ìßà©&_%öáJ#Rά‹šƒ SÄ®b&{à°´è8–Ü”¿ÐeÔ n]/ì½ÇömÝŠÊXˆD o…øêj•>OhО… ЫMFb?:ô)ûß`ÙQ¤AʳSGøÃvO¼£ŽŒ-iš"”÷HµÅ—¢/Ñ$K/éu­¼ÄºªiÚÒ–î“NO¢Ûpi×JôÝe¦3ôZÜ®Ûùv …SUáYü-™ŒdTÝQ/!lÜëDjCñêëò3ï.üñ”ì²#r€Û¨¢131´ÐÍu]dc©Ë(]SÑËͰ‰Ä’’Þ;ØŸRw°Í¿ÐjŸƒT¶f GÄ+iÁ•¸+'8f¬¼AZF;PL¸ÍuÑ àyÇéà…æŠ4µðz“†iÔ£{dÅ™ã³»Ä N¯Æ;oÌzÔ¯3v¸7fÀw1¿²k·]ïåZò/´å÷—AÎZ²}]Ý >bØé¿KÚ艒:èHt¿ /Ñå»em¹Ä!²Lok‰ïËùÔWàÔ–liB+Z¦O'´–ÌÉý4Bë’YìZc(D2vIÉàŒ6%tMßK¥ŽÇÇRM¥BÒÌBÀ‰>µîmÞP‡kf4¥Hó¤$¹É1kì5º2HóƒýDŠ–¾%5Ï66FŽÉƒJ–™ì9UŠ|ãèot”ˆE£¼ÄË%û+Ñlµ&î›+¥©M%Ü\ƒiîÍQ0O;sï à·2 ð[Æ–µD#çùÆ.®wéãžKw²mÅyžµK“¹)KÏgNeù¥X¾¯Ex$®ãþÒíFñö=f) ì!¿øVF³Âó sØ%‡0ß2¤<‚sìÆbïLHc ZXâ;¤°5ÔÚž¶÷~~ÊôLCŒç$zpâÙ]ݨtšXŠ=6òQNŠä +ìd(ì6RÃÕML^a+yvòó‰ÏRïY¿úÈm_4¢ƒ!«µ°7u®‹Ó.sÒ!Ëê¢'ޏ?ô¦K—tµ?“¡?ç t#¦P!ÊP…å’ « }Wû£YÊŒ*5d~´ÇÒ2²ƒÂ¹M[‹Ádô‚:‘”)¼,wù1)=ªàÈiW`:Â^‘ÕÔ½à¸Ñ‘ÛÌY: [MI 6kFpÑ-,Š>»{éðd­HR‰aÆib/‘’¼ã“{ÁxÒ¶ä˜}ÎýQËY,àmYÔÍ.d_a6z„r%²îë0^çš&€Öл.üX>ÐÄâbNÄ„Ómm…1Ž_ ÉXô7 `gXvÔÉÛ¯(ª‚)œCà¸Ñó*½M}örO.óì®BÆ„sÆ¡6’­Î.®lCžßªoJ.ì[gÒ¹~‹N¯[äÈÂ7MR]Ê år=-Ó…7«TM³ÙK”|Ôí²+CTÓæ«èõZ¥Ù¬.)ü)èGv‰èÖcÙ&ÿÙ `/éùjÇY.ÃB+ý!½¶§†`ö]Cf:7A8V˜dØôWýiНŒ†bu8ªŠ]y¨‡`ÕÜqÙSJM´Q –ØÛ|ª€ Ïfì‹— Gh|’‘Y/Aºø\]Ô„“FôØÿ:“S7Ž(YkœS9 ¼I,p" æAÒs“ß­N:â¸=‘GÏ™-VX.¥h?d÷ QžÏ'ÇGÏÚHNö_D§GæWó\{ɾ‡ ¥äÿþ{I*¿ïv z¹íÔáLG@ûÝHCIº ÷$gž%ƒÑu¸áœ Z¼á¾6Ü£ûl8ŠEÃM'"ù2ûíÑïµß º*Õûg¤–Ç4 vc«7ˆI3 ®—ftÀMÄP~2z—ôbôÕJƒ¦†Áo ÿ^¥ô‘(¹ê¦/„ ¦Æ³†äÅdÜFI=Ý‰Ó»ÊÆ]eóÎxax{À»á…>?Ê×ì5Q ÛÉk¡ò(O™Stâ N#\–Ã)]Ú2ëø¢ÃÝþ̺Ðû k:eÇF!3í6©8ŽÔ³µõ‡ìe˜R1IÍðhÕø–©¶4éÕ¨×è‹ì~?í¼A”ÔN¤l19X¯l®¿âõ¸âu]Â× †@Ñ€,‚Dˆ«©ÍEi)®®h‹¸­dé…[Uƒ>DH;ÝØã[Zauœ-Þ’Ù*\¯åÖ°˜+Ä ú·ŒŒgvå*j,ãÁ(ôo+äm[_w³ËSñiÅRb9séDÚ—DQ] É0‚bj·ö¦/oÊJ‡óYìb-ó|AÔ÷Bέ~a³¬¼EHÄñE…{6ž³–(I=µô–mV¾¤ÿñ è÷â³.!*¿ØÓÓj7Õ²uͳQ ¥cWÏEúªm¤€Ã„E›YªVaW3#Y^º„>w'¼ÑÚëWÔÃ7¿ãª{³YD¨ú7K/:©³Kþë¬àŒYå³²›$„pZZ¶5²å~¤Ñvúw>æ9vž8ëÅ6’ßkéí -¸$XháÚ+í÷ÔØîò;Ç$vf?eƒþÛȹ9¯³\#[–Œ/·=<µï@ùyçe÷‚Ò½ Æ)ÕL0™%ëÊÀÞKÁ^ ï•¥Øû9üÌ÷ŠšºC)ÆwÊþ+›h:òKãvcË ZÙ>Ž-Ø s­¤ÿ)»Ô[ŸûÊÛ9¢vèÿøÑRv¡€ÍŠžßMÀ>µKÙÎ"±Uï…çöÂIÓ)9Ï"÷_¨ñQœd$pCT5‰xÔ)ô®Y—ðZ…wëE«gdëÍj‰‘ É5\ ŸƒÁï%Ò¤ž¤ÄñÎÒ'Cvq[!ÝŸS<[9[ò'œÝŸ‘V`E]1~ [9ª$· LYç˜á-GƒËô7y"@ú>C̾¾$®òçUQbófÂLÌ©E’}áÔ0¨!¶5L® [Iѳ–0®GTÐVBˆ<¡ÌÙŽ1rp¾ן¶ÃÃ`P§04ÃQ÷æG)[Ì”ÆãQ­Å6-{ì‹S¯!£é@>Є­SøJOÓ3ó$bX¨Ôi”ÃÊwÊŽ^ÂN~’á<œpá쾓øá°—L¯3=ÍnºÂPW“R%C:ò4p¾u÷•o}Ê6_|çoœ(g?kæò-Ýôá2Zšlß³Uäii<÷Æ…s¾–†^kiüåùÏQÐ,˜­û)h‚)œÏ…K6wq¥Lv ½@yú0UnD“g4Ѐ62ÂÍÿ $âÛ–›Sס+‹¯6¶«Ôpu»QÝVGôaÏzGR6¹D¾ÁÈ:ŒgA¸ÃÚ°ÿ—/mÒ¼L¯Æ;sâÚÉ8ù5µvO=VTh‡†1m;‰x‹º‘û&ù.²MÅ[kPÓÚVLÊdÎ5ÝÍU”ñ0æ(ÊüSùùud9øÌ§M¸sgeë÷Úª¹6]GYVï–7ÿ“·Ü-ßEZ:ÇÝWA'ÿy º×Þ„þ_³CçûÉ>ŠZàý?yÏSGzë—«‚Êñ4üƒ4‘y}ûß¹ŸïÉ8J'K˜ï¯Í9 ¡ÊiÞžßúãwüֽ؈"­«{(–Øò÷V¸’º•)ûçQ¹ÞŸM¹¯Êõbö¥bùq•æóúë9¼¾Ôåø×ÿƒxý¹žŸé¢ˆ¢ÿÿ쌢Zð@ƒv/9oÉÉ+FóÇþ°7ºN£Ç‡‡°o tÕ€Gÿ=®`‚‡Ûa—u«˜/ ¶ï?i¿ÀWêWyõu9h±øh™2Á«ø?<µì«þË«Rôz ÕíÓæ/­ÕíÆZ«¶Viöª~ñÖêþO/ŽŽOOZw‡ßïÿܪµV±ù:Œh@æ£_åWµuÓ‘†Be‘í¥Éù TSgrAVÙsM>¸.ʪU æ6©î-°$M Šã1ÒI_ïT8 Öu× oqå:Nüµ(kfÉW¼ÓÙ•á)e ¼MÒà!)¾¹1''ø"•hŽDë(l e’Í·Ÿ´1a‡$òx% uóÅ´R‹+†8LQ Qj$H'VŸkôä=€‹h+akd,wbÊ% :‚Jv°îr)ìuÉfºÂR°Ж‚¨ä¡í»ßò;îçn·›Œ§¤=—5¬;;ˆeÆJ¸KõÁÙ;D6Љ[0•²9·£¦£À Qôœj}T儘#9 » áí˜ðñ‘‚äЪÃEwQý\¾8دDCêj"Ž“ÂUe+Lá:ƒûê‚éG7mø 6Ñy2¶Ü¿pK“š’fhÿÌoÓ Ê֤ϽÍ;åô“¢Gռɡ}ç…T’ŽS»QX3+ï£ØÝX1íLÊâ4£!X S%X¸æ„±Ñ!éS\úÎ8 uÿkRÁ.e.p» nýÅŒñv;È‹g áÝõ5;Ž߈Ú^'•òkÜØ¥(ÒÃC³›…ã]§V´4¬Îâ¥ù ¹¥ø3iÃé”BŸe¾Éh¤ŠØírÁ °œÑU“_,¤p;zp|qä5™Ùd<ý†¸ÀÈ&uŽä)÷ÈzIÎ4lÔÙ;g ´ž¤¹•ñ—Þèå;Z8½ˆž1:‹Ò3´(ÀÉ’-è“e›¹h¨Õeçšà3 oêvÜv­÷ΟR;£­˜«¢\|EÀßž;n†L’Ð@Œ ýŒ«†ľÃ.ÓÊûT¬÷‡À—ªq °½î‡h“ÉÛ!PONê/2Ö9—Â{AuÝÍnî®<äv©ôCq:ñcÍz‚ 0“p¥õ€9L&³1j~"©·VÔo›pæl¬g}Äz¤vCÉhvèÝ`ä,ª r™4¯º{ONúçWéèµÁâ\ktzDy†Ÿgò3åŸé•SªûÕWô´Û¥ý>ÿ5ÀTVôÛxÌ?onœ¯^?yýêá__GïpkàÏuÞq“#úÄŸé W1“co§ÜެY3 rW†Šä8q»Ë‘?5ƒ‘¦EmŽl#Û‘­ßhLI¸û²[YئÛÒß’,áW¥½pwÛ^ ¹Ž©ÇÿÑ…A7Ûvh9@a%€¤.²cvI1ôsóÚÉ`%™]$\ŠÉdWòA눉Èã÷„©©én7裠ä¤ó+²<T†0mÄ,,o¹&óM¦¯¹ÙJ‹’µù»•á~2T£á~š“¡Íªt> À‘ýúNàd«¯^ÿ¿+¿¬½ÿ°ýÍ·ßÅUü¿RôåjíîMåÕëª[ãrRå(–#Àw¾n@9(ø«‚qED1ÿ-‚N¼0õ2nbV k9ûƒxRѨ)7ÅË>t±ŒIx!U–Ë>Y÷YJâø3ç”rÑåÝ89âb¬”ü1C¢‚©Ñ(3š Óƽa'¤ÎB¦w‡& Î/ÿË Tyo`Ã`Eï˹ÙL«GCcšDW•À“âIÒÄ„ŠHBHjÈøP™¬éíXDX›]µ=J•¶ØD¦&©¦1qÚRNfª´Ó5AÏ!îŒBoqBõ+•‹Éû€ÆŽq¦%èU2½õâÒA!»Ìøøt o\ñ‹@ hD#szlgx¯3èÎ Él2ÐKÂÒ¾ÎeÿÜâî"xRY{fZÅkŸî÷zî<˜«ÝöÈŸ@­â¡1èh†ï½ãàØjúÅ/µæ_lGé­Æ«_¯×*_|Q}ÓÀ›Þ²£î[ævm­ |îH§Qâ“6=M5—S]0s‡#ÂéÃXŠIŸØ`à˜$“̹&í€ú Gþ‘˜$þDÓhN «ÎÛDxÀá[â˜:ïF}Ìè‚ȰŒKnoxƒæYÛq^gp 2P©ƒ¡×Ç‘Çèa8¨ó°üc§O}ÁÛÛ|"î¢|ºø”Ò*š6C(z8ùÒg$ês;íåL3]SÈaÙ­òÚÚZ´||t¼îô†ðE8c°Ü éVù bÂÚ2žJ™Ãˇ=Ê,"ugÈÈqcIŠZ¥É­$¼ãEäTye›¢ÉÁeõºËvM:¥=Ä¥þT£|Ê@×'þÉòÎTµÞÍ=ªw¦#1.YpÁ§eŒ¨îH¢ç> m„7d:4é­cø5܉î àurÙAÍ:L–iÇQªòÁ 0)M£UÚšõÕLä°ñSd]ÉÁÅŽÖ`²+ÀT ÷\åøYT±w&’+N›U9Ù/Qô¶'W™Ð ÑøÖÝ;sƒÃžÍoÚ¯s:éŒ!™_ãvN*à*¥óÛøS¹œöéŽd~Œœ§õ- Ãóyºß_ýšòSñ–dÍÊE[°aID€¾½ôžsY5> ›H¨ä†¤WhÿB,…ž"6%ãõ:JöÒYÚk_ö{Éh–¶ÓKÌl¾“#˜xWÖïîVú#l֎ϹE»ˆ>AÎD÷&]9%L€pƒŠ û¿Ûäÿn“ûmòI7Å}/ŠÏzO,“¥8sµiÅ¡–Tѯv_#ÍŽ¯tA€?,“™Tåç³J‡’£™4§Ïâ²ÁD„’¤úîš³N^îíퟜ oÍine2¨Jñ/XÀè³îB•÷_!,åZ±¯©JãJDz%…üèõSØÖ·¡,­æ+Ê<üX.=Ö…jóÖÐÇÖåCràô»\BºÞLI¡Þ³wÿ ¢âhBw¾ “Ù™D8²çQ‚u›'ÖÈÑ$¡í SÐV9~‰ímqþ6RT¾:zÑÒ¯FT¯“¢“¾`Ù^?«;¯) m£Q.‹K&ö&µCá+ÛàÔc¹gíêD[)èHsýp} •Žº}ÊDšPZrµ[ÞŽÅZ^mžõ‡ÍÉUµ†î«ÚK†O'¡hèÝ%úTëçÕš¨Ù[¹ ?ƒä%¿ÿº’™ÑDû ô|00Š^·¯eê+ê1÷§ç!`ËÇmMÓdpŽMJ9 l†Åy+É›¹Vþ˜•”ƒ°wôì4]—œÕXâäèåñÞ>ÍkyOýî\W vÚÉÌŠ±®ó}IÛ¿C>iš¹šq%€ÄÈ’lᘀ9:zyúâåifµ/bËNÈË ãÅow%Uš+2—­Â3|5Lûã,>2×J¼`d¸C Û©B=®[9c4 ¿ðóEÙ¯ÄÈ`ÿ“þ*×]mŒªêÐ'8Oê±ø{In«²1–:\æ}éj~ì®?9Ü}j«Á)‰èÜÁ­ÄY›™„íáï>,Êxò±"({` u{Zö:“^ÕË fȇÅÛmH;*gÐ91ùáÏnY¨Hy™ÀÉ÷ÛV,¢f:;K§ýélªŸîén'‹{eÀL¥hëåÀ|ÏeÖ¡Ð`TÍ=¬’•ý# ¯|­©å£W ÿšHôùã}c¿~"ò ¥UŸpB{ÌEéùŒÄ5ÔŸm“±“ŠÉ¦q;å¶Ÿ&Ò¸[ ?-tu4¬\ ÝÜ—je´”)6då.1˜ùJ¥,.n$¡Ì©MŒÂ™–á¦"Úê—ØŸ0½.Ô.b(àmÀžÄÚ4|2á ãûPÖéAk¢ÅfÈ™ÞëÀ™;GJ¿'`ÿ<2ë–æî·sX‚ôò#·½:<øþñÁ1ï³= ^ .˰uœ½YB5ty¯g®A0†Í! J¥³ÜOm–ãTÓkê–‘ù`xc™j¤óÉ„<¥Æ“þ; PO½á‰p4êuàŸëpªšŒ³O²Qô¯ɦCB4@ŒèkÏóS'?w’e>r–åëèàùÉéîá¡sÃf–w.šóhâMQð™2TÞÒÈ6ØgÖª“˜ŠÄ{–”Åm–fJ*¨b{Õî¸ê‘ aE*¢ŠæOŸáع²¹lX P‡Gw ö“×›9› ~óy a¤àÒäÞ-LµeuPz‚/èCÔfÔÃ~ˆWZ'Òçrû±Ò·~{†Ú IôýÁsÚ´‘ñ20Ox5àÚX¢·JŒ×m:M®RF*G9ÿÙeÕlÁœyX®hpÞT3A?„+â+²·3^’°ó鞃DyuÔƒ{›>Á“aªâšä3­Œöe_þ¤û®‡ ªtu6ÐaLÛðÕ`Ô»­-ϱ²ä•Tu] ›AÍ·~IÄeüÕí! Þ©¬×@ñÕG5§>ýþäçg"dÿVœ¿`Θdgù”Áq\¶’ úún’›èxÿéþOÓá©3Ê:×P?”;Ñü—&‰½*q—þÁòf[`wþs§o¢ñ Îm`Yü‰_c5@qfƒÄ©F¥-Ëäè…n‘´Î;@À•2¢j„³SãivßW;a IS¦,U`©’|û.‰¡ÈI½¤;èpÎÔé¤Ñ†’Æk0U¨À²›0#[ 1tŸ D­{*¶Q ô+9+pHñ:´‡^yäÙYÝÐJÜúÒÍÞ`@/'e*%¿YÜI!ÈÊ‘attÒÜŒV‡0²ósÒ; %ÿâÑI’ÖDíbh@Ú_¸i996kç\Á*o¿Â‘¦ôËÇû‡û»'û.­ë¾E•Àl“Œ—2~G´ÐÙì¬[d"®‹ÇA;Ô6#ùå,ñã—ùs¬îøUôÚ;9Hä0ÒBÀ˜Ã’È”ª®Ý ŒôMç.€ðºÈãm¹‚ Ú"O^>N…*€ c¢`I*à.БøQM“a*“”‘Þçß^ÐWÉïUY—wø3-Ø ZÊ­]îÅ:.v´÷òøxÿùé«­ãý Æâ«­Ý§û¯_ç¶§ÛF'ÃbÑCM¯H™gD=ñ¨¤kå!VW¿N:È}o(ŸG ÀŽCD0 ¬“?ý€xÀóN7qTø«‰W‹DùAZœƒdR*Ð] Á¶Fþ82Ê”åkäBTÉÞž_©$¨"èKÔÙ~¬îíÕÊeDOd2aŸ–ù%,Ç!CPLMµÆÜ2¬÷P~ƒšn¥ÖCf.>ÂÄš«[+HOˆ~HN8ºÕÆ SÅ:ËÎswﺴ&*Ô‰s ¿{[xH ’qé8¡SjDÈϪ+û©R£õ2ÿÀƒ;Z%m7TÓœ©æjXƒ‘¹*ÔVÖ[{Ž8…¦QêFGñÅ”ýdØu3ÒÃò;ßa¬Eí(ÌŒd‡Qf6½Ú™ˆ1pÒò·P 4=—bøj^ó8vj_|€m˜É£ƒê*ðœ å…Dýv¾´áô:W‚2Ûä#Å(óýÆ ËpÓýßú"ôÿ&³E‘"ʳQ”?‡b­æ¥Ü ‹þð]gЇ³=N$‚ˆÔ;Uc=«z5ú‘Pè7]vÜSOá(T힨ױ*kùG9‰:gèéÈ´†Mw„8°='¤STÿ$ÕwHVN‘U®c¤?ÙaHבS»œÑ)üa,”ÆËE­¥[Æ>‰¯3° Æé&‰ôì½ÔÞp„–Q}<"¯Gc%6[UÇz D·gOõt·žŸù ¨yØ€‘m®WÒæ/|›ÀM¶¢æ¸ú‡ö˜¶Áâ~ÛìŒÕ 5_7ù‘Tã n°…›ëÍ_Žéæûré‡r©„tVnô˹›©i ×Ã8t¼îkÏŽï›·fækB´Z«¯~‰^¯µjP´ù8á@Q°¶6¨ò­fU¸Ù2þ]}<¬ ¾ V†¾˜ƒ•aµ„Þo•±DøÄÒ}ÕS0Œ î ‘jïn%šbõ4†§Mt¤äúWWI¯ßqtF5IŠ“wbm¸»|·Ê%?†‘{T¥×U±K‚n¥þdÇ‹¡”6•ÈŸQ“](j‹vz›NFˆ¨Q‘ØaÇù;(c£çW¢=¾M´Õ{c\ÖàÖ§ê¨4n¯! €–žµgôsžó²oµ©#FÀ˜iqPyL:N:=µT¸ 4Ý#v‡B£ñQ›2»ï¨¿ ›Ñt°®“·ý1É00*)¨Ý󵿦Œk ùg K™õN CNèÛÅ ˆ ˆÔ­€5b—ˆï)›ì+³ªDÆ’¸hÖ!†ÿ‡k¦TÚèŒw«zìÐÏÌÐ]G?TDÆMã¦^bÿF{áw‚´®>”‘-꥙Ích vÄDêåz ¤Žô2˜b=¤¢Þ}þ”þy¹ût?:Ükïâ½ÓŸ_Ðß{G‡‡»§ôë3&”:1"ŠöRÇŠ ðžP™*ÜÂW@ñ>´báoýíRÖÊýr[mRò7_÷J¾Kø¸Å$óþ¼»”wñ`ŽaRºUêŠÊϵ+"4'JOÑ2k¯NÍ lÓhU"™ã±«E¬Ç®/íˆp˜väy¡¬CÈ!ú{ù£Ó»ê¡PêÀé!Úbù‰°;}ñ¼Ù¯=Nn,ˆ´F¡¶Pĸ‡ <îÏýÚPÒÁw ðn08Ó‚aC6Þ.æÿKöˆp=Y~Qõ8Fdäª o|ï\‡ñë©JIq°ù­ðt‘ÜXhçUWñHzmŒRhúSôCàâ7™Êp»Æi$ñ¨úºU«x4[Í‹m Êû>—´¦QeB2T¢8µC.$óBnúg éÓåH·ª Cäñ}´•SŠ;¬ÞAž„`¦$« Tiõl=]ç pz5&þUd1¦þ~3¿%7÷º3E‘ÎpýÕá1LóÏld'žŸÄT—JißFîE~Ô|zõÏ‹ÿœ>1ÁŽºñþøÙ‡ fÔ¡’q~˜…·ó˜€`wSýIµ Ñí‹ÇÙßœ2(˜É|`ž’¢6<¹˜>Î"&Jñýš¦~qFO¹Y¬(¨6ªZ’Â…þ^®²š¦W™ÏÉë7è]´°ÏÚ*E]¡›ŒjyU´ˆ cXD~àNª‚Bè—éfdv&¤¾;Õ†-î#KŽ5Ì$'·äׇ.Ch¥š’­aj~õáöƒåÌaE>ë~àZÿ,ÿÅ^‡F`½„›¸¿ÄÇÿÞŠ—Ø’B:‰‘ çq9K TÝ®-sdšî'Ð6.±ÖâGÉèÞ9ÍsbñGAi!ÙëÛH´ëbÛ_Œ²PœÑÆ"×ÙàüºT£Hçe&ùãr°É(¦qzUuÊ©ú•Ro6a¤q C•Ëý¥Ðë¡L¥jãÊf¦}þ›ZBY0Ç£¡êTÍeKc§’H»Ë$¡?†¯RŸà0Þ·GÎ'÷èLßüÞ€¸ÔCŸû6ïC ¿m㊚¾ñ‹q aæ™Ð[s¾nQ´¡Ùåu»î,SË{47Ú—•3J˜ÂTª–Î …j²›Ó±~:ez$|ðQj=›·œ Û=šÉ´Ûô騈{9ë´ e«A}ÕLÛtÚ½“€ *H¶:XPi¨7êÓçC2Z@}bO B‰ãŸ9  HºÙxõç¿ü×__ß™¿7^=¬ÿõ5A½rB+Þz¤æP:Õ½ÕÚzÔ ø…~p€«ÿ…–û!H*±­jŒ¡öXáZ×î×J^å‘_eFcðùoY«üøHÚ8Â-Ì‘­¤D‘h¥æ¶Œl¥/æ’`"Åg³ÇN’^Ò ^Ý­7ÊèܤV FÚ¨‰Vãõëz2 ƒ ®"Múü%ô/šjj¬‘”+Z@áá&[ã/ÖjÑÖöv?Î;ÀHïf;x:œ<¬ß¾ì›’ÎûA4Q;ñx!ÃL†ñ†Ú!/ûçÓŒêÅ­Óýʱ÷Y¾‹ð‘û¦C_q™ð<,ŒÖrñŒäχ6vyHoÿÌ›þT‹3íâWÜ:lt/ˆ%~åŽ%ðU«ÕŠš¯»ã.½ëŽw¶\Å®û‚¶G\°|ÜÔ{å9Ôãû“ÇÖJÎaPì—NSoˆf–M~CéoÐå(OÈLA}bü+„ø¾’—Ããng€›;y7'ö)W!¾(qÄ%@nÃÎ3f¶1»„um¯&wfº~^#ɦbç›»g3RµM7è)|ë¤àÇ”DÀ)f‹ 4¾NQ æÛŠêxÃzýƒsÒ[‚’µÀEÒÖ E´›â1ð%5üÞÑôÝOÐo‚0 ÷¾ˆ¢s¡«>ÌŠYÄür\@7ï1þéÆ2ú&g%i‘­ø<8 Ì#ÑBJ²|0þÆÍkx3ž±—C\–é‰U™Y+¸;šû:YÙPInìÖn¶ÓÜZ™mÆr&Î8»6Α ó7“Ɇ õ€sÎmþJä7áœüÅ€³ÄÎ(Rý&ö›"Uæo¹Ð×!¿Q*Å‚šܸ›ÆEJØB§š¸èéi1ö&sV:èdB!œZr“VU« OTuxöú)ÊášX}7¯­ b´áìÓž6†;GH¾1–ÑßÞ`Q2¤ã/Î3ö[ øžy8Öܦx!uaU;MåÃ];Ö•©;àuÄ^îæÍÒ„ßÉ!UÛ¯»D $šuz³««[68§Û›§ä•ØõÓhCËŠ¨”©ÒyÂÝæÏÚdÅSc©Yú;k¨K¿9hU¾ø"~SVË v\ m9Ê<¡ü2›¦þ†‘ЃäfLžóü5b Ò­~Öì DÜ„‚þRò2DZhÁ%¸v8¯\Çñ«ATш®'³!Ùv§ì…ÃRƘÐñÇQê>GO^‹ö¨Ñ b§¨‚‘¹h6¨=ŠVe+n×5CØä- "‘¬T &Õ¦#Ì6 h%œ!p%·ÏiýR™cuÖ†5Wf]æe©£[ê8«œ½’!Bhr.=(bC³ŒÇ• îvÇ ‘]ì F\P.êAÏl272ÿEY‰sTxdÍlÁ`Û›}úÅß‚6þöE8"ì.î×Rd$ûÏÓªTJD t¢àz(œŠçÝqS3XÙædM«…‹ÊDÕVUê…_ øjÙßYü³ä|d7.­ðT¬ºäpXõ[ªú·ŒŸ´Ã0zד2Ž¥üD¼¥ˆ®Rfp7(—Ìhü\KøÞØáœÀV7_¼×O>œ ýQ<”lçIÏëwõ:Æqw!òd?ve–¶ #Û4Ý6Ë…¨ŽtQ¥¡¨â§"¿˜+ÉM…Rš› ES ”,¥ÍÊÇÈ jtjÚ Ó®>à«J/+ûÓ¬,¨ºý‘UëßޮЯ}=E'“Œ×¹»2Z*w¼y—ƒhUþ"Ç<ôi•äè!ø8غ/8lS‚ÿ1ñpýiC?¢(²Á0ª§”˜w’">c°²Áp0¬ ì,æÅåTî-¨E«p6!âöJr¶Qt¦-6C@·Q&×ÕÏ×µνÓÀOU#ÔÄä g—º(½fÓþð­±È¤ˆ4—Œ¾f`Sg—Ô$䬯j·g%:LŠUŸ·OÈׯl"S+p2¬©y„Jú$§üvôþ¿kg‡‰³¬…Î/ãò¯ž †g6ÍNvÓùÆ8Õ¨ƒŒÝ\B2]b3N“YoT7ü„>d£¿Æ³ ÔH;(L(rÊá¿„á÷Ô÷÷Dòú°Y_ëÇ·^@¬Âs‚ÃxÖ¹µp Yá Y˜Ñ¨!™ß×J"ÖT˜+³qø‡S<7ðC'rµßH°jãÛš#p¼H(ùÓÈ…§2`ë6̇QFÃv¥Œ¹!uÁG,4šYÓRdvݯ󗲰~N*;ëqÒ›u³æ0wÈ0©õtzëÇV›¼ÆZ£Õ‰XçyNY¨%¨×¼hŽBÎÉ^hÌßà] ¿°ÝwFç[Í3b°°£¸Ö™¥&çSkÕW„/øVõÌIJ¡É%¥Ïm‚·y·>ŸFw·Ÿù‡ÆíÞ¶yXï³·ÓæÛ‹è–»àE‹ì/e°Œ¹9(¸U1Ÿ›ßY—éS¾RŽ/ARõÿ›s*Ö9>i)\õ)ú<®k¾xÖÁv¢\.”¦Ê\gs)ŒëP¾U0Wèñ2è¿M¼€IV†½ºÓ‹ Ö Ë(&Æ10¬pJw2ªQ$¸Ðáâ‚°¿ ̦@ƒßWÝiTãñœôÕÆ<¬ÃJ„%é[fÑîŒd †Ö,7½Æì´÷½ŽÌL, :Âÿ¤ÄΘ#a—ºülûMäO¸;¯:nûPjgÚç‡É#gN€r“ø+YwX¾óõ‘Ù8,­Gø7Q¹Â‘°:pÒ•ˆ;ˆõT¡Ó ÑEÙâ¢#"EûìÖ@Ú PÐ|mˆ!èòuópíȃ*wó(× ÿú2”|ïõ`lÂõ×Iì¾a—¤¼Wë¶Á“ð2o>çà«í,ƒ0Wth©fäš‚V®Ø”Iä““m'àñ³‡!?ÖÚI«î¯­.‰…Ë $ûð'@¼fc’$à4Êtt•PšsÍk<èùê&:–NûA¦Q.¿L¢Ñ(âô=Ò@aºÑÜä]Y‘O–KÛwdܼÀ”\½-ʳÝm¦]·TTqÆà6šˆ¼—’Ïr ÍÃÖçiôò¼è†“qÖãÍ1ð\%WglëÄÝíAŒ±ÿ|PY5Ïõ-°€‡ÉWYSGî#=²Û¡¢wfœ/¼ó] ½;bh$ÓD…]e×x/=uE1 Ú„A`FÔU ݤ b÷Èn]Ä9ÑZ$'ü@Å€6Á>§/&ý Ô:`ê~·=.cØ%Oò¥ ÁZpî¬Â¿òÞVõá¤Á)Õ¡ŠNd¯¹šˆG‰zûSøpuÛvù¶ óÐôz§²©©ÿ;•÷êÄ0ÏÉøhïVï{—9{õK§þÛnýŸ)óE›X2©‚û¹“³{š”Š ¡‰¼àëdp>'*ûù³€V\ Fg ‹ñÔÁÀÆ–ØÛÞTÞ{ÓóßÍ:5 Æ:Äá9©›zêL«ÌMå,¶™ó˜–ð5óÊw¿yéeðr|ø]özê§]t6e ŸbA»¹ÁdÂkr4›3ŽnoNër‘EÓ W^yO??œ˜ßNÙèEg’:zF*,yšœÔMj¦€ŸÐyÆ “ætKf'/SíÌo½xÁW˜”±¹æNd]O¹kQlbd3Uý‰¨2â{”\ÍÄ-Zkb…OUC€ */Žžï>‹V1T§òbwïï»O÷kQåûÇGŒß”Wúç½äX¸JŸa”ò×_tÏ* Þ¨@ñf2r]MVJÓ»éÞ‹©ÂñMu£šô5½£'³ÉYåc…A5…q´nH×6Òyt†°Qoàê»ÕŠ - Ê_£n‚¬˜v¡‘†ïÅ HR™qº•íA‡T¨-5…µ+ö묽ÁT²ÎÓŽgƒðU?R½U€ppÉ8x€òr§ %(ELÉuòê¦$ì]Xí³„UDYcƒ“`T³$u«qûK}}cìka÷©B‚߸µz¿ÊœÎÏÙlú‘_Íå*=ñ ½ýSNþA*²Ù°ÿë¬~«ˆôÌÍ5¤ÇÓv<ÖöÎaT°¾¨þ6z}c×ÈY®Ío¿ÜЖLá›—žµi·¯mûè öÄ­­@Œ(ì°ó}ž(}ž_½ìN·Áí¢Jd ù,—9¶ÊáªßQÖ5×¢çGÏ÷£5&ws>ñ¬ª¼ŠRk¬ªñnÈÛm™Þ3±Œ—¨ Fj~?pÃShLß.T‘³:‘²ÆcÜvªÒõmáÞ®žµ¨"Fv:̺SJ¶Ã JÖ(Èž§¸Öéõ€p¤Û娦¶±»Ûªt”n™2üAV6I}hžþ”Íñúêõ6+©Ní¬x3»Ü¬HœõŸÙf7]Å¿Ùò6§ÏÑšÌÝN´Tïq¢PðZÝ–9®ËA*_}ųVá½êáØöÖl¬5Í™_% n´ê~¿$üËV\«™Ze _«¼0µ¨õå—ÛMw;,±ó—žE¦ùb г䇟aGD;å÷ÑûV`¼lÅëvð?¬ÖMa{;x~pú7¯/íÂíä6’C•¿‚èô¢Ý¯?ÎnHE~Àj/dz›¥k‹ÃC]QJõ³ðóù~züI»K(;¬*dü»¨rxº‡É`OTEè¡ã•09t?A»sýùâ`¿ÃkãüSÍ딈 œBÓö‘Ÿƒ$–ìz8üE–zD‡CEO÷ö*~ãõ.¢‚ahðç4E•ÜIô<9jÕ œkSª[Ÿ‰.Ðä±¥|öqQTškxÌç÷ÓØç=±6ûŒsÌE¿k²÷N¦AóÑ@|OÑ^AO24¹·D”L¨õÓMÌsIAE¶{¤ÏÚcƒªp˜>ôo_,l+ªØ øBꇟm4|óùZµòÉ'Žø÷O¦Nfðœç3÷ùó÷Ø73Ú3¾¢§@:;GÍx ñ¡¬ÆyŽÃ޳"!©ËÅï)r³D—ŽŽ8L‘†¸×ï¡Ë eÏÀð;ýÖgFŒvjòu³3úy§?À3•UŘš$Æ Ó j¦è†ƒÿ6 ·Þ#¡bsùˆåŒììar|Ü:æTÅΞⰠäÉLûb8C)™»ÇOËœSØÃp”Dx¸”¹…ߒɈ‚[gi´zzü®%à×VðK°|úü%ºéϦýA*³¾¦¾s…ðU9 ½ZŸìž@µ&µxtævXÜ:}§Î<ÍÞÆbî¢V¦Wc˜òçÏ¢bN|®D@~•¸*¬«F«íˤÓk ÆÞÃú_Û¯¿j¿êô^Öîò¶ûHïjru½¡ ûç,òUú9×x=;ù]–Öíæï¶²¶‘ϲ°¼®íç/ÛÏÐVÝ~¼²w|ðâôèxÞªyýpm¦ð‚4•WTŠrraD¨OBßš„*«–W0vB©¯#rL¹P¢¸äļkg0ïkìöG¼Y;\¯:©ä'ïH:<ì {£Ñ¤ÇõÕ¤3­z¿åeÐAo& f$eTx%Ñ]è)Ñ–iŸŽûSë»ÎØ)=Ä%§íó篣3à )º©Ü_f~rw‰S€q²å:2¯°côK£Ù«F• WA‹ÆÜ™WœýŠ×:“–B¶d[º,À›‹#a3Ëk"¾™NÅ7ÿõg­H ²4]n3TkWÙµˆò¡°ð&P•âtšDÉÅ~w¦¤.TçS‡QWðÄðöÞû{o?Û}z€©îN8zlàùißW޾ÿïÇ/Ÿ‘ïÌ’E«n<üµê›5Lâ!v4» ¼­Ž“þZ½ÿè¿þ¼ÚX£qMžM’­Ö¾»'õÎäª~adøLOýÏ_ƒx`›Èñú^…„QžcP¥uü~v‚ØXcØ9qÍÆTçÑ" w¬¬/¾g°T¹¤5¯åð ÷,±9pß1R†Wº/+¹•¾áu²K2¥À_ÕwXŸîlb/öþbžvc}ãáÃ÷åR©D˜Bž¦w ³ó°îäÑX~þ ?Å&õ£•óg¸'‡zl—…+…í¼Üipá÷å¿ùßñaˆ³½’ >Y@Ê6¿6xïD‹I@çðŒ²¥ }T YtŒm©˜0zr8ŠŸ´4-F+z±ßŠ`# Êî‚Îù·æoùK9İ’<æ 7xΛù(óbЙâá­kh²½œØ8PÖJAONšŽº}’Û Ñ1€"PÞg°I¼†ïFo9L÷xU5m  î2Pt¾‡G™Rƒ¢?-²+ï€Ñ'µƒD¬-WxwÌ›©ÜËgnuÀnÀôœFõz±3A€¨s(ó„h›…K2×`pÖébÄ4ìÁ“ý½Óƒ£çíç»Ïö1wþLi)QôLY* +Õ‰ôc\ŒAâxìÃKøf¼ìò»‹—ú¢å_zÚ žzc€.K±Fýø+ÆO~ÿ˺¹Á¼”WÒE{ÍdâS/ªVŠ'cÈAž?nr¿{9J3p?ÀòEi”—_ªÜ×d÷Ró]Z!oc¹¬˜ö¢Æ¨À4ᥢÏãÊfœsS³]¬ùËÞè»ÂÐõ»j\ñºW·šïäû‚ ®:¦;S/!Æ… ó@ó*5+Ú9Zãvà¿g»ÇÇŸMy1Vho±…™t5”Bn˜ ÿ8d¤Ö>Z!Œ†šHüëG‘Í༎ÄZj@"Ý\wnS´Ç#Ç@XHœ ¥¹õª½^sù•qòªÿºõ~}£õ¡ÞäÎ49šÑ½úeëõÚ–¼M4$o ™­°ýÐé¸ì¥Å€Jm²³c‘Š­÷_?j}h>ІŸ ;Ö$Á"ÉÙ–À¸%.Ÿ“ûdëImEͪ»€;¨šUþïL]d4™ŽbHÐ 0#–¸5N3‰¥¤š`ì‡hËË4ZÖ|&?·œg7fã´†ÍæE˜§uz©“oÊù 73_hö„ÞhÊòÐ5ò¤é¶¶©ãU«µ¦¯×*Î÷/peut ô¿“µ@§ØÑµøÛPtÀ:±Úp¸€Î!´ N̺At¢3(_‰\A×9‰$bÇ“ì$”Ðõdâ £\åxº´¤Ùä¼9‰Þk˜Ê^šê×è‡d6éc0Û&0¾B#¯ùšÀ$F©|/Ãà=„’FÝëÙ­¤RŸ~UÕhU®£M 9ð*ªÎáÙÞ/CØBtBè–ÁkÅš„{1øÚÑ8sÑÀ`²‡gEªxxóèá¦Æc $nÍjû°¯i˜D—ÅKª R&Õãõ£¡atƒÛIà’Ä´¸!™±äÑѹ;±|Z×™DhÙ„ÓR6ʾ¯á/­F³·§þZ]ž%5ÏÎÄ©j©ˆ»èsÈF²’@ø! ÀÓ¸>T#h†ø,›Ä)lþò‹vmr¯ÿPHÍÈŸŽô»©Š5X&ïóYÐåÙ”ªòZUáH%ëù\aÚëæUZ·&¼?¢«v»š*m±  EM–UM®çLÎH»3l+yE(#f”‹Š œCi.H¸þ• 7Ï‹óRQE6¼(xŒ`ÜG)íisÍS’`AAš ën໲º(â…:“†ô7ËÞ±›®RmØ*þ±Ó'ÿL<çæÑ-2c‚ØQé•U›9©¡óÀRÐݪø“GfèÝãè&jÅ­ìøZqÑ’5;•ï¶Œ™ñÓt(Û%ªŸ6ÙáüeÚrGˆNhØ{ÊöY~ò(•õY7ôH­¹MoåfEòLr‚ZJDaý.ùw蕺ÓÛÌé–cFÊœ½™á¼OGc9 ‘ICš)7‘ƒëNZ€©RÄ¥Pûc‹wôï<<æÎ™ó†Ðý @‘”%¯ Û€ƒQdÁJHsÊ!ÏyBê(—г(iGLq¶üšçoÆ×½7qS_ǹYiÃð-,¯uäóâÁ¤L{fz¢ §K<§[ÎØmöLY½¤g×ÏøOULèBe\|áÖ¦Áù2MàD_E”u |.}¦¯œÐÛÛÁ4SW=œË3ñßÎÉ•ÆNœ76;$wf‰`›ÝÙ´…<ˆ§«·˜Éz,‹Ã9;ò¢ðDµYïu&‚bæ îÛ@ÁŠì‘X@Y ͑ݿz#v…¿åÄ%@UÈXn‰ B¸Qòóäü2¸ùÈ ¡i¿)f=sœOdŽv´OΫîlâÕ•‰%ójˆ/±­¹Ø~O ‡/Ž¢:b»g+.È"±ëØR¿Ä„³äMÆùÜkÓsª {£ z¼\ƒ ê<€õØ™ûM¦Š<‚JÎôœçÌHøê¨ã(hÜ&pž#¥ n;éü-<ÂR¯Tšy=©»µ˜YÜŽ^3Q]à.ïQin‰8'Ñë}T—‹˜¸˜Irþ:xV¼»ùŸ<\›sî"Ἐ÷3ßvnIqTIx?ƒ‘ ¬qùòZ.FÓ)*€§Ó„Dœ+t·Ûªy›B?zƒùž"¬,ZžÏátà¡n­5FQ%ÙúÈ>˜§Nž*R_ÚàDÃÛ¼É4¼“y’îdv³ ¹ö{ìng¯†p$’Á©ÍôY˜/ƒÄÙÛ‚Lf6´[EìU˜æ.žvTœNa“Ô'ç¦_âÀæì*¥ÒqàãÖ‹ÂÉÛÏæF’_ùJ¡h¥ÌÖÊq±ö,™^Ýòå15ÿWìpþhÁÌ}dv—øP.ÚxÁ"è”yL©JN/<^÷ª?m+Lõ+Ì®>½f#¼q°Ð(kÌ ;í00Mó²qž/ÌŠÁÌöãPÌ%táîX\y„•!„çŽxKH½F_ˆúdå~µI¤è„#ý°ÖÉF=CáèùáÏ„öÄ`ÐÕ˵è` ñ iX|6¹lT'ÎHÃäÅÀ†£}$‘¤§ý!ëƒÄmˆU)ƒ™“=öÇãÝ/öÛì.Óþ~ÿðèùÓ“öÁó63Žác"OZ¼iç-Žàà<ª‚tV•DÛäñ @,43ä„êÂ4]¹éjMvµkN Àn+SBõê§eÎ$ˆ·N.Ûˆ•ZäàæN±Q«•QsxÙy×MTÞq÷ É:¥ÌsÄpÜ@a¦>}ÀhNæ!Zå•c?âÖOب!hõˆ”mÁ#Q;‹hß |Í µIEzˆâ³Äî[õì‰î ÈR^ ’†›ÇÍÛç¨ ƒq‰ x˜ ^´NÊJe!zJÎ"æ$¦D}VA÷E÷‹]‡cF§G<·P͸cfgé´?t;Ò|'ƒqŠ{£h2:Ãã‚€Ö°à¸÷`:Ý·”s5¡¸i®’iÇšX¸!Ô‹›˜øw‰žQ °ë„ÝÈ“x52j6õg§Z žT±¿ß'Ñ÷£ÙdÈxaiÕ’¿ŠŠ÷ÿ<ù¡- úÆ-B‰Xe\>ÌÅV+ˆn"[þ@—¶½g)UóJôÏô2zÔ¸!KÉ×ðSÀß(¨Æ1Àù# ôÅsìÊßZñ‡u”+»—T¡á §ìÀÆy/giçôã~ÊizIy ÷+0´(ew}àwëQÕ«µºS•_Qg£„{*z~Ô~zxô}ûäå÷'§eцÐÕz³Šd©>ª¹\ë ²käCÂ#—`—ším¾ Îûåïü°s3¾øz[L ?ƒáÁ;ÌþüuùñËÝýݓý SJI¹g?Á‰•#öËúËŸ¢·0«8£/ŽN~¿k˜}H¦ÕÂDt‘” ˜eïñ‹ÝÓˆ„a^†ÕÙÇÀO3‹Œ›À-P.Øò­€½—õ\&ÃwýÉhxå¡–ô4ÉiÊÐptÄðáÕÑ0û*7Gr SgbÀ!ÿav¡I£BÐ _llÁ]f.ÜœóRPÀAºêt'#ý·K˜3£f¨êæY‰~Ä “½àq&ŠxêG\Wðf\ÈÓp67K&\+VºÓ¡ØÈ:rçCÛñÇ­XÔ ¿b;VìÄ£€C<ÄÜÜ/x+;– qß„;^\7MœáH¶£DõD„ÄÎåš3ZxÒýŠNÏB/}óMûð[mï=)·*eço4ga·h$0nR+fùóŠyk-vRAäF' TÅnÃ&cçCÜuÄfäi>­q›TÄîªP3|;‹2 Èœë·FH䇠 ªàI_¸\GÔdÊ–¬‹e´O)Nð9šú.e –›ì"àS„C¹iUäsáOņ˜ BjnHLjë“ðZʃ<|«þ§×0UôqŒÕÕ¯e™Þ Ò¨>èåô]]Ñ"Wÿ6j6ÇÜC¶€»$„¿1&qI"´Ô¸[2pqAâü¤ˆÈÖA-¢hÔäÀâ§¢Íì^v†‰;Wv¼ii&#ol/Ãè(ì-mvð+$³Y/ñS0kë}ìîv·„üÞÌ-ëÆß8rìÜÉóÈì*Ú¯§åê^¦œªµ:U×ÚuVË»Ê\f£Ð¯¶×#)ŸbÊYŽì c†Ë±Hk-쌢7Ð,ªFNÇ-f–ð|êHÊ…ÍNKL¡õj°KÂ#Öv‡=¿ãëž™ê²F½sR7JN„ZŠûb‘mAšd©ú¼–O&ìwNZþòÕ/² ùèèF²Úž7žwE¸`#DÔ9£Ä%.acÌŽ_qߺ½ _þ"ÓâÒþÀ'Sîóܬ ^†K'›š½³…¼ïÀ­Ru‘jˆ?…p‰ð¼Éœ´âr9H \ÄFÜI|æ{÷Pmô¦Å|‡ó¼Ñð^Î¸Š¿¶ÞlG-åByTÎé‘EsšÚŽ>ÈÔøÚ®V¥î”òÁX{ïøâ=û;œ!¿@è$‡–WðÜUé„dË0:3=d³Z ìÑ0é&iªN­*UÃ$Mþ{A9Aqµháç¤ÊÅ™–Ô˜.¥sÈrë„E@ޝT8î’'!™˜3ï«Âýãû×0$_ΜÛ]`–î~ mK˜ÐœåÄÅ4º9gÏ;x O\,àïîÖpÀy »‰KÆ©ŸÎû7pÔÃ@ÒíÏèd‹ÕXhõå î7Æ)¿°l„Žaį DØxbÂã þ/¢ã—6¹fÿaésÊHCH6WUVa z„/{K|™ ñƒíf>ÑÓ”2þD4.ÙÌ2Îa#Ë~¿ìøMÌF¯c“ŸtŸ 1h0£o¿ëLdîX…Šaºm‹c®°I¿‡Î³!{B{‰Ô¼Šƒwh°mOOƒfÖÑX š¼_yYâœG¨6·´*þ[¥™ –ábqþ¤TeBNŸÔ§Œ†u6æ­8§]Vèj~Àæp ÏDA Ò!l;û¾OŽN¢ã¯á‹^n¿]– ìµå š[[ÀH7›†‘ÓZÐÁ̉ Ù¡û\(PlÆÂ+G[8Í.˜#…é.ÛVÎvE-CTÈÁÜ£Òƒ¾!„½×(g…yÉs\Í¡/U>CŸ»â½©äÔçà7ñU#.Ÿ©¯‘[ÁIÂþ'ª™ ’}‘C5'Wæ0J Ôq+2÷ LÃy‘Cïe´aÛéý*ð1ÛI8åSã­–uo±®6ðåG—74­.ttñ½\ »/Žl C %ØÓB2 <¿gDE¾0÷sîÀ/>s§¶_Ú»ƒv¼;œÑÝßÃ#Š–wñXk–qÖKj‡øæ›þŽ ¼è³“=t•°ÙßÚ{ǧí“ý½—ÇûíçGíÇû/Ž÷÷vO÷aÓ 4éJHæÑ7(ßú0²†ž…-˜B<*dÂb <•ú%Cy 3´”Åî µZAOÕ´€ºVÉxÂa]Áªº™qµóŸuÒ4™LÃrhÊôŸuÑaÔtlÌÜyw8•ݦMŒÊÁ§—yÏË´ûi·Üîó“£àL3¹19äÓmÒœé4B£{§müž£}¨I1†ï¢UÄ»¶í̪ŸÈÐYˆüJ¹TbÑÝïÕ»nëǶMÓîC G™þ¬Gþ_PÎé"ÌßK (h'“d£A¹<ô–x wÄPÄ¥RR«ÀÊ¡‚–Æ@°Sø9`d§:sø` äðÑ–_œ7° ð ·ñû¸{ Åð1ýbŸƒôß½†mþž©Óå³/NÚ?½<9ŽÚðËþOû{™t·Å¿¯»Å»J¾øa÷û@¿N÷ŸÿÃ>|rôbÿyûÇï£øú,.Xwë«®¶»fÈ^·Ÿíþä¥ËćðÌyéUOðÍáþóܯÜ×™LœZhãáæ×n‡†x„pÍŽ€Ý÷D-Q³%Ÿ¿ðKÂ[’ö´·iÝîm`ªññÁ1Ló‹ÝãÝÓ#g{£j³j_Ñì8ﶪùIls’»>;y|tävm?þï§/^ðCdwí‹£“ÍÌŽÀï¿ß–ºˆí“ŸON÷Ÿm$QÙA¶7ñÉg{8ÒVÕÒ>ýÞ²WAø*ªnWÃ+)²©©åà¤í½’wý —€÷ªÆ»+ÂL¸AçÝܰ¹5¶Ê¥Õ‚Z)ypî«ö&榑4jÆ—3O¶;þK„þ;gˆ™é Ƹ|¥0 gyõšaè.ÊÝWqx&ÛGíïžïÿì0_úÈ9—zïÿôl÷ððho™‰udÈl•ž Uâ†xBo×¢´ÿ[2:§÷5\ ­ ÄW‘9MjèáûžÎ†ãʳ÷‚“ëŸÛýŒ€©ØŽ>@Ùb&ZE&Ã=º˜ƒaÿû—OE±¯8ùx;£9˜¼Iv¢m¡sù¯n›¡»—·Ú)Ìa'Š…¯ G ¢+¬Ž"äÞWÔ› ó‚¨V™QúÍ áÌ´§4‹ÛÂyè7Áì–qRpõc5Ì`bjø¶Ãå{%¥Ï¦0ü 5R¶ 4îye‘&£½C¸Â>*ªËJ¹îe‚.‰ó š1Â|ÿÖ+C|Æ ŠCiÍlB Å.~­¨l\çå$”ïÝÕtïU§ Î^¾†+Ô/_$Z‹—ƒA`4$U«¿‚…e9 T¦°Ià’ÃO2F§û„|óÌTÂg˜ –æÐÿ””Ä“Ï}ÞéõxÄÓQ>t:0÷@˜Ã5lg9â➟,Å=>ç¿ÖƜ巎;×CÝkèâîtðmÊ*Þ«°‚ðšÄ|GâÄ¿‘L˜óßD_û9ç1A=ê ƒôôßDªYâ˜HñÁmû]?íSÖÈðl}&ñ§œ¢ívg ‡ù u_íÕÕl ›œêˆåTãNYÄ ¡À-“”q^a¹bŸ\ ¾ß7ÿØ=&X·ŒÒÔ´?Jë' VìLôàâ ã}cÛêŠ ñðå>”Ûq …M• )¼munFW?±°v·É“É$™£„_êÓo³©Š&ÃW®:, xFÖjX«Œ¾v]¿]Wž³F†>¹5j væ;ŒòH &ŒòãHpú\¡1D‚`ÑJŽÑ¨,a7}ØüŽ÷øø–TÔCtèQ³‰Œi·ÔïG¾…'Ðq OCs䣮ùü<ÁüÌ ·Ö4#ëî<4¹çúÄËG}¸¦iE£þW_IÞ¹r&ÍÍRó·1H%¥÷®†:'mº› F2ÄÀW¥â…ÅÖApjñlˆYÆÄÝ7…r Édw¸èªV7Ö´UÛ2_ rg‰A)Ê0=Üz¾Œz˜ Ò‡y ÇŽÇn;æ‹HNêòÑpÚÎ’õP™šp#‚x6‡u"øîÔj¤‘8®ÿ"5n­8*AÅd‘@½|&âE3\4t}õêaÄE‰Cü)YªÖ±• BoL5_ ‚º$õ<"ŠÝ!˜«þÅl’Ô©îµ_™M¹F§[‡2µ9Ùnñµ¦¿_E„k³R­½\6úŒÃo—GÒ Sù"µ1*_¤Õx=`Ç´ÞܼÉV¯Ùáçv³É¨¡Ú[(¢|¯¾úJØk8^†Œû5~(”Ç8` Ö! ÿ¤¦q5Ñâ(2äÂ\²Èhua2>à"Êr/C‰:g2¶catÌ0®mçü–lh/öZdÜý¿H¡Îuý›&ê>õ¸©©Ì}È— ËÀ|g”'nóHûüò¼@µòÂMÅ”C/UÂÕø"½ÿÐr¶¬öœ|@±\$QéD¤àYêÐñpGÁóÇõÀ|„ú¡àÃÏØïÎ9BºÎïv^'©¤WÌô.gXÂVårSy•S펚*¯Ðzn+†ÇÒƒC­L5¿]ÊGpNÕ¬(‰Q\ˆ©ÁV 4>ó>_'–ÏLSAw g+䓃Ž<Ô‘:ܯ;Ðz..qå‘(u€àäÁ|!ÒŒá„"¥Ð ¹•æ/\Ž–Y7§–{ÌiÎWÁT:%¸>¯·KMÜ2'7¿ž%È2‘.}ã³íu)O#f˜y_z2Ã:ÙöɰàPD_i¶)‹L\CéþWô9uŠ$] .È«¶;ëÅg c2·°m¸°D3Ι½˜`Ó¦˜‰<èºä-c–{dY¢M üNO<<§×ý®ÜŸÁrš½iÛ7D¾~~t*Õ¥·Ë¹ítä’à*¥È n.Ýy|TØÞd}qVKMÛîÞUþÀ®9‡Ãýzä•9D93mÌâ¸+¤’X{”:ÂËbµ¼edñ·îZ4fŽJìD«ch§îrâOZMk5ôA´78VTZÃ/ªÍª²z «s§çž~°œ’Ê~’_!¥) åá•X¼ECC̘*@Üb„ZƒÈ૘Ý`Ê+º ~±Åµü³“¿Gé%^’% Ǻ…ZÁU_ýY#f–§ìÌ8TÛ$ÌìÇÕQù‡Z¨°]u4É5­­ÀÿzMu˜©uÅF™ÒuÅf1¡ÐÛÌTÆ‚êI׃ñ+3•±„*üõ`ˆµe/{8ûÖ»9ŒË-Á”Ú¨]²ÚEuiYÍË}z¢ò‹Þk¯#¤hX·ýÑr}ÑuáºÅ(e¨>²øïŒÓ¯æ!à|¢C1i]ž“.át`ÚåI¬®-0VÉ ê¤¨øPSY‹¸ö‹ö»§ë‘O=<™èJ×Ìéƒë܉êþ¤ãéëô,™Ã^ƒ…NV]–ÏðøsS)G +ÓÑŠaµâÌšùc2ˇ|É «ä|X«9ZW¤UÚ(Ïp¨"P:ú±œÕä¥ ¨±·N…8S;Ðk‹:hNÄV±pw …:«’¾´€FP#9ÏÊO*i~7Á*ÿ ôMв'¯ïƒñR²äUr…ÑtÉÍ%P2Ø1(Ü€Ð#ÞJåy¾Ô3ùH€p¾3<™Õ<›1 S'_‡k_Š"}´%·ù߃¢<ÏoUö“öïÞ1Ç‘Š6ÿÉÛþ8B¥R§oYÜêcºTøŽüËH &$'»ŸvãË u6LûØv FŸ"ó†fLú}ã5ºêV•W‡ªþj'Ú´þ"B!±ë°Æ,Ô¬ñüW‰$6º9E«<Ê28uà;;˜'æ›A–p³ ™…¥™u§ì™NïqY„ ÔÌqÏÊóÖ§ÁJÍ8VØÐt—£ÉýwЇi5ÖZ’:¸Êòô—)ÌoÉ•˜ëG =¸^À“×'ü¥N£wÆŸðN}k~4ƒ&êÃ6üAÍI‹ÜZh£ÍÃíO™Ö ½ßwVçLª^2(ö•¢ÎT›YÍÌ4Ì~­€j ŸÎ“„áléhJoâjD1¯Ý‘É]ÌzÓÙ”F] ¯°_ñ‘>g­Ñ:‘«|ÅOk©T™„ÞÑï€p1è‹8Úrf&›ì抄\-åBe¶´Õ&´ÝÞÊÉ6z6C«Í“ø#‘¢@ZzåxãExMû/”¥€([c#4Ó&È¥7e0àå6¥NDÍbÕu©b”¶èšó´ÚzXõ7«h¸i:v5b—û»Ði}î%0— K”¦ëŸYo’Ç›)t¥zë:g-a¹DX?F+› Ò[þ\ä3·¼=M†\½×ƶ™½?œá‘a¯´ÄJKÀY)o¥‚”>,¿f8ÖàEI:¹‡'»W'2P$K;âµ{ú€Ô—( …+k_eJeøæ!0Ì µ­‘°$ù¾9¼  •ƒÉ߯ÛTÂ(x1ÌÈÈ•€‡…%9~o|Mœæ~5|¯w9ìŠõþŠ5mcÙèWœ«RI6Iàô¾ºö+®'|*3$•P•È—ª“ÔXÆ5§%ÜÁôŸø+0{¿Š3AÉ?WG×L©ÄiQÞ"’A~MQw6A ¿ s]’ )ôµFëNBÍÚZXØXÀ!K5,¿l‘¹%×âçѵbiEm&‹‡dDLƒ·\_EùÓ]—v­ÕâÛ(³ «r4ãš2}ãzÝp‰«ÄwÝ·3'Ìe8Wú$$çS\vŽàÛN€áp<Ðø~z/>q‹ý€˜zuº¨ %àcœ«À4»ÄßóÙ†’zX¶3wÏÏ9ȲC2†2 l» ç¼Ð5åaæ”Í,öP‘{H‘ÿxã®$•L/³ fBø{Kû–‹ùaÕ3½°Á©eb}ÑK‚ßie §½í<‡¢Îs”½‹ ~Rq®ÑyÁ±FeÃÇãÃovðk"±Ý¯è92ÊÒ¯Œw$ «„Ó€c49˜8xµ­äò'Ç8±²¹ÓÆGè_”êæÐšý¡2ºk{é´»„/Ò-üà ¯©õˆû}0”d£ºK¥PäjjÞIï2mPŸ±¼[ ²;«ÎC‚Ù-‰ÎGÁÆé@`Šöž¥Á¬`O•¶ÅvaS&7êËL瘧wÞlÁy3¶NI hlÙ 1 v˜“ʶÓ`/;YRgÜŽ^`^Üw5o{}J蛿¹ˆpV~lF ¶Lw¡ö:8m?Ù=8|y¼ïÏHüd÷t÷0ÎŽßl‡1!' \xçY6ШÂj¼Š%kñ¼ºróÜÊVSâeà)Ô¯RùZ µÛûŸïûÄòHïåÜLí„K `з­uø³X'FUdR‹Žû@3ÿ^!T\H¹É;ƒëÎmÊî¿r—Y§û‡û"vo¦éó±Ê>†â»œ¦Æÿ‰‹šJ&Hyja1úÓ4œÓ‡ ø-p»°ÔÉV þåQ™‰‰÷Žž¼Øß‹Ã%°c9/£wõ}tt"‘*ÏŸEï¶£wÞ5<äÔdÃóÑ A<| ]â•w)øÓd*í߬~ùÎ}…U¾óAep¨£ýâp÷ôÉÑñ3†j??5÷?1‘Ý«y–#‹*#oÀϘgîŽCÒé¡».ÅiÞŠæ1A:¹c æºIvB „Õ¨*>Í0±dZߣä¹/Ø3 –&Š~L؇‘ò•ùµA{Ãn‚>’6Ã/Ë,Oñꤑ“sdqËÕÖ´Ên±ðo\VÑã W¼úM•ºUý¶ZCew§Lœ«sI‹VN(Y¥ëœ ¬¡î‡úæa¬«>¶Jam-‡ L©³X†'Ú”€C.šÎ&„ʳŹ!y"Pˆ'npO^“´Ûcxª[ˆ*aÀöžbµc'/¤õ'œð+9?‡‚)N%°¯3õRJ}ëQš²…¦uˆ¸žŽg§\:éæ¼±:œœ±™i’)×ïau6׆_mØ›äºakéxõ íèJØ á²­YTÕƒ‰éAêßF&U«ÅZî}†Ñ'@Ä0IkOúÁîa{ï‡Ýã“(nÅ­VÔzøpþ· ÿ{ÿûþ÷'øßŸái=Üxÿƒ÷ð~ÞoÀû x¿ï7àý&¼ß„÷›ð~ÞoÂûMx¿ ï7áý#xÿÞ?‚÷àý#xÿÞ?‚÷þgú·»·¯½û7÷LãËs V\Å›-O–qÜOúê¹±iê`µZ|^ Ý$[5ÅŸ“1…¾q£pzÖUk¿ñ7 ¼á §aãé_y¡ï™ˆ÷3!v=‡Òaº :¼sZ =  ÜŸ³n–ð‰{n—†_RޏŔK:(ë2ô¸©cëf@@cRÅølòVëZÏ;µÐ¥DÎN)ÈÑ;s*2[·æhTK.·zàðÄxÜPÂJK ¶ÅÅN ?aÿZˆ6·ê<o“„«gú-8$FŸá4¸£ÓùÕWÛÆý"e¶šÀ ÖR qºQJ>¾ö÷©ôÕX‘i¥b\¨’tí«¯W_9ö¯ ~)u8_:ÅÄüž7X1ŠÌsn—°€7×¹:úšŠ›²ës5XõUDö»­û(x[ï_ì+@­ý+ÊÎEô/”›àG½®®$ÚQXÏs@žwÿ°4cÏŒÈñ÷ ÈŒ7]‰¬m ÿôiO¸ò¾ñÍ/k<ŵ´ÑÞvýŽõõs”|£|Èõ´we1W)D[‹Îñ³Ð:™lð-t§£É‹0}f9mþÒZm´Þÿ寭­üÚXkÕš­V¹µÙ,_ÂûÖê+àA^ãÓVk£y*ðë°Éï~i _Ã'µ&êîgp¯åވסOÛÍqù¢ü¸Z8"ÿ†áÜšƒÉ®€í×È–·ûˆ]>eI7Ú=~Š©_'3ºà/AÕàBµ´ŽlsÄÞ®.GM<#ò·A)Õ-‰Ý`ÊDËÚ”Dœ.%¨‹€ó7òÖÀ„o<üõÉ^Äm­a¤ZÃà¼èÜTCÌðSøZI§½vç¬O< °ù= jÑé'H\ÑÉËçÑÞ^´ûätÿ8ª ¯öPÅK,òçhÿ§»Ïï?~ð€ÒÒ¿K&˜á‰KO¢óAçÓH‰‡éÜýþÀä Éä‚7Éò0Ë%tLJ4¢]Ú¯œ ™´ˆRrNØ,ÖD{?ýôäp÷é‰ÀÙû£[0ùqvd6-0ÎÜË(^»[kEu¨uø¬Wë}Mÿ´"x¥¿;P {só5•÷p‘ð¹j“¸Ÿ³41}ÝŽü¯óÊÂYÌIkÙ¦@ô†LŽ}:^œŒ œÝS!|îl®Oýc|ýhsm^âOÊ"ÇK[5eD> ‹¢ÞQ\~ENQƒÌº4³‚1Å ¹O0#Ì?€L'šRÈ)c®¦ð? cE ‹‚pü¶Ò ŽQó¢óÒ“_Ü”$¼Çß;)ÿäf:é˜*p7SÑ„°Ÿ4˜¼?|7✠S”€gÚ( “//.­y÷äà§gû[ CUÓÙPQOM¦ëñd3t•Ú ’Œ£ÃÎ'x L] &ÃÓHG벃QYêDÌ1ãÀP£hA†5uƒGýé5• &äÁÜéÀÃ?!G×ëNÚ=‘¦’úpT·­Ž†^sZixº–´ô]˜\Ln‘LpÑìpp¨Ê’n³®ú•ž÷“Þº#IÃnë „óŸ9.fo.,i’j.4±ïT†£¡àyQlQ[èÈN,o¢ÊßXŒ÷%4Ù <¾ô¾¤Üÿç™38’AÑà9°àýdØMøÁhÐkgö’1æÑ³%¼JàÛDàwdz†oý'^P²:kó3R/ï`?Nã‡q‚ÔÆVeU²÷‡°æ}ä¨ü¨E!¶ß±NQ è^Óí’Ó!jÀù•§ú§èi÷n‡«~7x*r'çY{’\$7üæB3›˜áŽÎþ¥4µ„x›EÚŽ©QŸØ¯€¤Â<¢ªZ¦¡•€K€p©J!V·?š¥mœÛ!0ÌŸ’6u@š€7ƒQ§·C¬‚>yg¾zÛ|G¼6 ìpùîåó;pYWîž´‘ãò÷%¢ƒµÓιô;L¶³cm³D__'·m;aè~†Ï[åzP÷ž” Ç UÁx§@©+î¹Ô„R?ZFfuž™u7ùâ„U$Û Î(G?šÔ»ùIw+~¶Ýû¥ƒÊùñ-)-L[I Ž/Fœv Ó£þ““I[¡½8?Q¬©n(§ Ð<ª[i^\.q­#®™V˜c9Ê%“Ó´»K 7tæ·º"sc5Lýã ©ä|\!ÌÍ•Á±ý PV?Ù„x~=DRfœ%p8&4µdšXÊ>$ŸUŸ 7xäMý÷ݦìÜÖ{ƒÑ8¶‰Tœ?ä[eÎQÂË¢Ä8yÓCCk£>²ïïÖ'ºµƒ^…«ûoî¢3mt»–²û‡÷°¿­é³p_›ëY“æRÚ¸„ä8ΟGg¯JÍéž8ßí/}Ó(›ôŸ4zlVÞµÑBÑÆËØdÞÚ9]“¶Ÿ¢:t2š]\†&ƒë$™È¯”Oºîãâ$rŽ++ @\LQ?a ÒäÊF& ·!V‹@m’)c<¾j ø•>Í)¬(,ÅØ­¥çaÏc|PdÊ«E -—Ëy£é&Á›Iñ)‘øzP”«Qc‚]êxí2`fã1UÂGD–˜DÓ~vû›éþvôòôÅËÓ¿ÅaÑ Ëš-ši›™ j[ø œnÙðp–,¨V$¼ÈeCèóŠÜÄð)j,›d’yŒˆo{«lW¢(݆Í[ W-gN~~†šž¿ÅÙÒyW†a ÿ$5˜ISÝtPük F˜g^î[ƧÅn§ }‚©>énˆj³›Ô|ëáˆ.æÎìjeÙ`Áü¥FoèónB`”9k⯊BaA'ì"Qg¼mèuÅ´EÙƒäÛàCCW àPÌ…ÕZ0íßgôk™¡Ï·»m´h1±ÉôØ/l¦Ô+¿d7ùª3y3†“Áç'àÐõjZ[&ƒÌdExÆ6‹£b9d¤H¨bñ0+e<÷\Kg˜íÎé’ðã éÃùøL„Ñ©ÙÃå¡*£Š¥×™ &¦fñÕQUñŒÕW¥ÒL0’üÆ`jjEåµSB¡».æÛÌ71 åÈz¥˜ü™Îº”ö?€^.±ÙY¬ÂÁ:ò3$ü·p¶®ƒwWôéJ´7è ¼°®BTþã™j™Ö•µâ Òë§ÝΤ‡ŠD®¢Z§ #^~E &}Eo$6+2Òi2nÌíSktõöy-ÝŒîyJ;ïДqaQ´)äxÀ…­‰,ïÔ{Çý&~#¼Ø¨¼’sÞ´º³û“Yþ@ÿ†ÛFïø:e2¢”£<ŠFÙÛÃø1Òþ$â’D{ƒk·œVWU>ú±5ÿPÏÔ̆(¶ÇÁt”¬\‹ñ²¾¤ ?¢‡£C.Ü1t`á)ë}9)©0=Êís¸\%”§íkßú-%еI¡SâË/óJõ˜qE94GD:B´%ϷѹÞò¸àL†àœ2ÖýJ³»»øÀ~ähïrÿ¡2 Ã^BC¯«™á*?œ† ãÞ’æ¼bJæ­5MfÐ[Y§RÉìm#ÛÙ.8T¼yÑBÇž— )OÓRnê`Qb–xÛ ›8òç0ìÌ}gFÙKsŸk¥³ ŒÖ|nÏhè‰Ûsö yX£··¢C®*aE¢£¯qFÖ××%ø7‚ñZr5䨣q1¥yÿ«V«ùM¾¯vëÿìÔ{½ÅOjh™]rï5 ÀáªSä³›¶#Γþ”ÊMO(GD‘ˆKÄVzb¡ÓˆAê*áìdý„O¨çPãm/iáæ#š¸™ß†Ñ™æ¯Xz9QÜ#þ•4’‹÷ZS2z2cbqÅñÂ*nº]6Àeêqír*DÆJ¹¼b¦Éùê«üzsW¶`v Ò‹Úf÷>ï_î?÷›EãpˆCáƒ/zhj]š t+^ LQ}>žÔ>øš`U0«…’vþ3œg¸ZÖ(Ä©¢£¨½Œ\@H{É‘»ÌÑK¦˜±¶±Äôf]fžs>B2agnÛxG׉tZO ´q8áp ÙivG†$ÒùlŠÉ„Ê¥œ»9¬¸Ê±/d•L"ÂVppÎ#E`²Éy‡¬^Ñd_“=ôÏ7á“î2wdFáN[‡ÿ*(Êž®°,ò‹[Q+÷ VîÕEÛZ#ý_Fý:ïKun¹ ŸÔ• ð6ª¯L´ì|ÎKfœœ]IÚ±ÓKÌÒ€t éխǸð+fîbÜsÚ±ŸÂ±ÀEüS Û¢ÙÝh¹¤—§û”»;g7»QúÐ<(ø:këÎnq”‹ù®P:¨!£Šü$4—<©&$¨¥Qýp÷ùÓ­µuøåàätk¢ê‡Ï¶ÖL5˜Ø& ÝÕµy0AFw'`nÎg´q€)F©~¨Ã8Dvê5ý³¶µfÌñèÖ¾èv›V-<5Q+ÜŸôo ³,a«,K赜5ØæNþ!6Êʸé¤?fa§~GÕª‘\Ÿí浇°Í7ݪ¿úœY˜Ü­J®î“‹ÑËVÑ„ˆ®²—pvb{g%_ÕaV±-žcVãSýÁîɳY ¿ì!0&RËJ‹\Ò 8(ð’¶*»âhGÁŒ×ÀXÜ}^„4:i2y—hI²¢7'z#f=ŒIhAYŸiþüã4­<Ù)6°xLa1žˆ8}ÑÜu¤Ãªñ‹œy¶´âSyeψ©ûMeï‡#ÝWâ˜^MךЭÊZJ­UߘiÛ ²3«µ8ÞÂï·¬°´µU œ±€J’’Ñ)qM±?]‹Ú¶ã™ß[n¹žØòqŽá²˜|Öjî;èÚKÕÜùðø*ï®Í ï±ÖgÉ(u[_vúog*¿Óý˜ZÎïdrpÐháNƒz¯vÒ(u/ks¬Ï²ÝîÙRA y“¤­°aXB P:æóI’8ö&‹Ñð|pk¦ª„ýÂvõñˆîr%ЧnÔ›%œoûŠE|Š(ã£:9‚—Žz¦lÞh¼z¸±ùÚôåXJÁÜàMç,C_—…Í?a'x‡•Êhð !ⲞExþJ¦ÝÑ£Ææ»?i_áï?½û³±=ÒÀǽÝîNoÇÉGMì“w_76g×f?ãÓ>&ž¹†ÁëßG0À—Ï~rz¤Á*À$&“iÊ«(sÕMð@ð{`'Œ=Y)?³¼{ô™ €õÁ¯Ú“œ3éOÝ®¹»Zæ‹CPx«y€Ä´òvõFAƒà1&(ÿ–+ rj¶'¾œþ(*H޽PR|~ ŪÉ´…ËÑîÂo“A„±s¯)ÿœa\Ȉ߹ÅXàUö¾úÊÔÑ bÊ€Upz† B‘üÛè¾F¾LðÜFz<¦ÃÈíbíuB%%ùÚkY܉ɣp N’¶j2¸£/ïê}áNîêuù­æÏsVÑÃÓ½³¿«O‹c”eE ]¼’ãpWË¿ÝÕÿ®¿Œƒ_ P«£ùØM®è®nÞŸã¿ßÕõ'þïÆ<Ä~M¯Æ;kü”ÏZ‘°H ùlÃÜŠ,›8‡_¸©¡ß6Ç$ë!ï(¨c8ªŸw@d–ðœVøÓF(üÎ~òØLã×2,˜SVËN÷-Æ]a$“D¤rü*y'‰ì×srÓñ÷¸ŠrHMˆ—fUA»¶FŒ ɈØ9Ta‘£ªUé÷ôª3v2Võ/†#lë¤Iˆ³˜9&…3^U[)N¾ 0nˆº4,Øn0ªØ²ÑhùßyŽKDì“¢O\ëbž}Rc-Dç¿ê¤3ê0*íÛÊ ª¶v0úFþ,*,V/.Š<ÖB7sKå¨?ªõ㪫þ°Z€PEðåÿGùãteGz¢r"õá°ø–)ê–+C¼/#ü{¶³5_ Á,´™©xÎæ7‘7L;B(Åû¾n‚“eA”¬—ú`4Bß¾‚zÅöF[ÿ**º º&§gŒ° g´IHÝ®yu1@–Ä 7Ä'“° ?íõ{&-o‡Ü7ðÂa59- ™bFG¼ûL'ñók¹>ƒg@jßu¨%F§ŽëÉ8¢ƒ|¥Æh`:ˆsÒI©ñÇý‹>âç¾ÄTH”w~*šj‡MÀ*'x¬X¹.„:Æ’é"Q`Ù‚òv|áE¤·ÉfUõm  ®)<%·ôÝõ\Ï="Á¦Ç‘ÂòJä˜Ð?‡bON¶#øggjqÈ=n !X£k(œ>|_Ño …ü°‘\Ãñ3óc?$ç~ÌN~O3s…U8Oî¼ æ}ð?gÞ¯Ÿ6õ÷û>dGÿM ÷“c®_J$ùÉй8ÿYTxo/(®Erfý*½hs²æQzu»†ÇçºÅòðJ…XÙ¯DOhæÄcþfL{&¨ sÉ‚tо£¤<áÐG Æ[¶Ÿþz:Õ§R!žWCJËòç¯Q-@Xê† >yz`¶Œ­dba.Ö /‡ýk†ÜÑdA7(Óî Éì†Óßî¬ÍíÈl˜­ä«Ç»PÁW¯90s*ùáENG~]ËB”˜r’×Ͼ–óýŽaúêë?½¦_nÒ.Ìøš'Î×yrÄK€+|º·gëxÒ$6Æûž ºÐ&ʶš¹t=A/R–ŽlUcèÄnîz½‹©[ ú½~«‚Œs} ï"ü•°-ò;s­ußÇ=š’cð•áQd|ú7òŸ þƒ ‚¥ãÑ žd=7MMA`Ë¿M¦äÆ8BIlwCÆÀ¾¶µ¨6Ä­ëÜ1ûˆOµýàWêÿ9LGôóúr4žÐoÀBÕù°×ǃÙn>©“Kü®ú¿uü>à §Á`ð;z;ö€ÝóK N÷+['+â.°¸‹Óö§ýßçkŠqibk’Âg¯ÓëM0Sµ–× à΀;ï,ß驼³‡òÙž±;8*ðéÚÑÏȶ¿3»þ®>†ÿ¿¸³›ïÎÙ{wõ'kwÃâclÂ.›S㼸€ÿÑÂÜéºÜå,Ë]v£Þ™™uj”•¹s§ÎrfŸB—½:è’òʪ”æT*²,Å’kI8×Ù?ñªrDqÔ,¿InÆ¢œˆ¶¢jc­µ oZµêU7Ûº47EúÏ››í…^Y2'ARìÅå‚Ä•` •9kŸâ‘ú£Öÿ)~ zý“6N͉-t؇¬cifnÕEfÄÀΰËõž j9!Òø€WUv3Ã(Øw‡µÄÎëûÌAQÃFŸŒš¯>ÓöwZ^k “9ËÀ^ü‚ ±p—M=ǹ·–ÁH*˜töqáfKšyÞóå¬{|™—='ÖLµ*A°ÙÜà ñVŸnf‹Æ›å)ˆ_™ëű0âLârîã0?Äa~„üq»!ñ÷È¡ƒ?7æìaÏŸ3êl©x3“ò­ˆNË'†—e¼ý  Ù÷-»_ ýÂè²EQä9A&N¹3† Â,ã"7ÔÅ„E¹QHš…0'ÈÌE1Xeö)»z¹83ya Y8 ËFò|R¨™„ÆšÙýgýóînÆÜ#Þ,o23=º÷ áöa¹h3šÖ¼p3Ô=hñ"j¼ˆç…œåÒÒ☳ÂMš_tÙ£xÿ¥˜çè¹dÄ™õùôx!(gx¡¡Â5øDx’…Õ›ï4¸*Å,“>,ôIõ]oçÜsh—è§Æ· OpûÐ ªâ[Ÿ‰upn±9N®nè‡ —2ïš`[Éü.‰ N¯Ü»b鎥I¦"»Lók)reÏçÚí©•…¦U~9Dhº¡²Ð9…:9b^õX k;0×ɴß%¦Yàû5TÃäó@Ž_Á=Ÿ®Ç´¨ h€·:xa^[g> eé´?éS,Ì‘…7ÊA†r9úÏçèa˜ ,åpÇÆ åÁEc\9À 3@?-B‹éÍe2GT­Hä’ú”«ã‚Š%aN!ËéšhmþK’»ÛxR|Ÿ–—°Uü…I ²¼Êcé©EŽL E-¸ã ¦ÙéÎp÷q* ‘N((‰Ò]*@pƒ¹ý,è#"=ÊUÇNÜÿΡ¸^9W–릶‹ŠüåÏ?ͯQmÃòù“ºb #¯ñ&ØŒë뮽ðQ[oZì\ñrþ‡­8jÝE-r¶nUÓæV3j^´ª-Puëek-;›š¾MÛ™¦aÙÇî–ð>í >ö^èç²ÐѸݧOàxÅ2œúái{ïèù“ƒ§Qo6¿Yº‡SÕà+3’õlxÁñ8¥jnÛ°jPëÉÏ'íÃïw¦doÒ—€E’}£\’Ý>mfrr¹%a€l}ÓQ›ÄAR‘k¥RC“k¥÷yU»ßºtE2H¹9…§¤ëðjw¦Þõ‚D‡[ÒPYú[¼rÄÚǵ"rv;šq j1¦Ì‚¦Æà²a˜HËŽ›&¶Ä`Dèqªer žýË)ÕqÞ¸ß;1‰0"Ð!kv‹ë§~a qº5Ñp£ì'MÔNïX‰„¡UOÈUl0àœZŒ'‰—ƒò°—y*²¸ñÂ.»(׆“J§ICòºI´š4.Q}ÐÿáÏšAžå&ˆ¤Hk8¤Jc si÷fcä/S=_ݘ©ˆ\o\*îOCd ÆÙ(Ý|ÈH÷› Sé*¶»#¡¸¸l>U¥9§{q¿­b9Œ€©ŒG˜ìyœ: ”èÛÜ…õƒw枨s0÷8³Ò ©ÄT,~õ“·³§œ(æ„î7’ÜR—#˜a˜öe‰ uŒ©F‚þÐ}SªQ.ËZÆ3·±Z¯`AM…m3xƒ3í-0n·&w8vêœ ÛÁkÚ8±âÎðªZ¼?¼ŠæÅ.…-z_ªCA°¹r&HY ™|˜\ë‰ìÞ¶½ç¹w"2Ë@lqî G”' !ý:©N,Î&z†º&Z‹lïmXbŠ4Õñª×—ýŒzß°íT%:°Š‹ªqè·&¥àPÈ»}'F ÷ÈL4¾XXú «\QQ®b¥'oËT¤¤"~ÎÁúà‹Âž>૊Yå`¾ÌX¶¸ðv4jÔ}…-5› dØOûfMÿ`´sÌÂcáù‹ ïÏUŠ}ægçÍÞ<‘û‘}c¯:›˜V‚Î$vh7 ¹Z»–CúHK9ÁÅ”ÖDÉ>ÝÑœ.,ÂÔN2oú!òì¶J¹Eé˜ÒÒ÷§’õ•ƒÝS„ø2æ¼!ЗB¯SרµbÀèR$À_Š”¹¦l ™˜NÙ?›€©5°†|©ù³9Ü⼃Ý㌰Îãd2¸5ƬéÕØ]íâ[±ä—ÕxÓ¨â<5îKZÊ}iiÐ=¦†­9T ·è:íŸ9SÈ­j‹%˜9ôO›&Æ&ïÎT|bÞ:6L ‘Ô/gšaˆñÀ¼4Z|5ÓQö¦-¾x¼ÿøè“/bc³‰bp 8`fFQçýRN¥¾¸²ç~äL´=tó6"\õÉ2D®ø×¨îÖž›+uøÄ3åýc6O†Þ­DäÝOŠsׇ—ü§Ã{F¯¹¬Žx ’¥Ðg.ù ð+çé—\r(ȧ2ììødðë½DWØÔÑîñ÷—” ¶;`¿è”0"aöp¹ÖIÊÊà.×§ÿñ3*U Œ—Ü´L.6‘VãT3e©€mu‘–äÜÓ¿á9(Úr–2û™Ýj³@NŽ‘†ÆÌ9íeëØä̼nô{Á];jæ ÐÒåÒg‹ÌúèØ,Ÿ^-¼FÜ,6Yr¼1 ÑÁ5o?_åÙ ýmtï––TJK‡…Øb1ß?6ÌÝÐ%‹¼Ìv3þ7UâØr<¼]"]0r›ÍÕQ­gc 4ŸBSì29ÃÒÕÐ{ *v Ý]^dÊÂõaŸ;ìR¯?Á=’•ètùòdLü>ÊÓ‰vÏ}l¸ûwàÍÈ\’Ϥ4Ã*GÓ¨C§M©vrC¬öW0§‡³D àûcaQH«ŸÐË\!"bìØ ªbÛ ( Ù$}ƒ=Â¥´ßz8ÊDø¶\8R’ý…s„D›E0‘úåkúÚ7´*%uý‹¼“EºÂAu®ÿG›ðy¨k2¢#iŠ«âVÉ΋ëZ•“¨7"H.£U ½UJÜ=3ƨBPMž}`É.–x½r3Šçê i/˜ãi5×3Ò9kSö$ü•|)”Ñ¢€Ö‡O½lg<¯8_Ð9±5ò&åô½ƒÊ€~ç¥u¡ƒ€CÄ^ïÔ%ý„ù'!T‚¦$$(ê¼ëôè_®èÆÞËQ=Žáÿ r<èZØ¥ž*Õt;@\/u}–ƒLÌÎt…³åÌ(ñh &‡«´Î€ËœÿE'4{ƒ. Í+Ñ¡IgùJ’ٔݩ¼œ¡h‹Aa„Œ,‚8jñbO5/»²|…ºPtB¹ákíHûåt¡P¬¹rÀlwö+»íB;Ë,µ»Ò¾J¦—£_ W)wŽ(9%u›F½ÙÕÕmþ‡Û’@‹zŸ æ>MŹ߯ѼوZ«µV Ó0ñº³£œqà‘o[ l~Ûì%ïšÃÙ` x‰EÈMNKUöŸï¿€ZsúGßFæsëw'lË2Âtûã¶k3BO)[2?yŠÄNIÓVÒ½DaK`×ÖÖ¢™:n™Gì^bZãKÒ¹@*Aد%H:îÊ(ëê.{€_-¾2E4™Ó×SÊžn’Ï“û¨í‚u­™„9¬k9`à òKìŒ;gýAzk2°“eMÇÑ™MGWuº”Ô”L̯]hè-ù;ZÝ|#о‡y; ƒ)מ€ÂÂïL&_…XñŸ“×%û;~Üc8$±?ÂÚüºQ6 qK†)åDSbÇ-ôÈhœˆ4ºBÜÝA? ë¤bpð¡ÛP'ÈÀÊÔGG¹¡ú£‡ºœ(säcæðe4áþ‡1OEP‚›A¬…¹Žè²ó}ª>Çe=·‹­‘™0 ßpbE2 1%Tʉ$)ж #‰8Lq.‘z¨­F*DdRߥƒ7Ðu[Gn¤TÖ½ÉóÈX þxa?Ó·üŽÍ“u—Á£­ÇÄVQ–rÛµ×r¹\bmª¨W%/#Kç¦ÞtƒrUñÃ*®ÚlÈ d{–ÎT¥Éj|ß8Ñ J#%º ·Ò«‚€©<Ö@ŒýàÕ çÉä¡öûÇ\¿CÖ?ü–~ñt«¾b5_=°S.™X*7œÂúÑ}ˆ7_NC"/ã[Çï~_#7ŽõÅUÓ0éã=íÔµNˆÜDÉ¡(vƒS~ÒKFTòÞ&¥‚˜&Wã ;hÑê:Q¸‰ÂÍѳ O8ê±Í²Ú(Æ­Ã/Œ­çÝ?eA¿‚y5hØ•X€ì¦Ó³Öê«_¢Êkà›­ ·kÍ ÆÎ&@’¢VI9^Ü'kÁQÖ|)àJfÑ‹=•êÚ}S…•Æù†y¤R¡ªH':ëLb§ø gbÝYý"rç~ã šäåz¢%\z´äûBKª±²f °ÛÑg³™}Éd€>,·’ágB4r¾ôî-S®Ì‰ñÍHÂíPWàt\"Ã@xá£LÓrzŸµÚx·ÞÂwZW¥wèÎW‡Ç_­ zwUdvKy„;=ŠéÀHÑýä&_·c±óH¸¤;¤ì·øö¾ßãé2NHË;î,£ˆ\èV®jn탛ƒú£œËK®Dêdûs*pÚòY› ÐãQïq çA(„÷ΉóX,Êdžy;ô_mO%jÈw27³d›Ù¹Á~yìþãÝ\îfPœˆ÷¾]O¯‹œÁ¢,qÓÔ*J‹óº+ äïª-—jy c¸žsÄ*H¤H¸¢a8Ná []_BÎÒ q+OʊТ3ú¼Ñ íb§•X«LQ—s6˜öÕTiž|šLÔ¤kœ£«³ˆâ‡ÿÙø Ž/ŽåÐrÿÆT™1Så;˜ùÒ˜Ò©¹ô'´¼ 0] á˶È\ÜË$¯8Mýî% òöš)>Ç%ì~¹‚¨¶jœWÎþÒÇÕ†ÊH˜“¸`f×aÃ`XèÅ%ºê_\¡ï˜D÷á¸]{´‡ž«¼@ƒÎœ˜Qʨ§â*JIï:°!ø<ò×Qr‚Ÿ;„CɲKSÔWDz¶ðÌLJš†Úèßswiš9$2œÚ@ÈFj‡©{ ×(dæÌ¤’²(Á>Ë>vìç¾4÷kÌ}Í‹äMÕegÒëÂýÜ6šU 0’X©gÒg¡>j—œ”YmªE6E2Ð#9oå!YØ Š–6ç,oFÝôÃý™ûÃ`H°¬æ`'¢¹Í”´½ª ¸Wiè¦*—æ9u.y[À‡9JÆì©òîdÏãõL †-ÉtÕ¹uz´ÄõíZôœŒMtIŠçŸ¦á¨!ƒãM£±_|x¨BÇš“iÁ¦YDN5«Ø—µìû4kW/£JÍNöríS›¦Œ@Ø`W5€³hö‘B´ÿü|÷ÙÁžž[[ŽÜ$^«j-›«qþo‹Çè`2Ú“¾t¡€‰jƒ"/f¯iØó²ôYŸ;ÿòáÇÃðûÛSÓ‰y2,e9#ÿÚB¾Ú-(sñ.$âèÁ‚µ˜gûüXÕLËû®f>]Ú‹ÕÓîÁ¼Ñ&gÈUjcßóåÓ²³Y†ÉQ¨ØÖûèY³Hs¬ §l8·‹ºhz~Xª±JÊ6²*¨åµ"î²=Ùr€S=m첺ØLŸæT^Òq2úHÀès¸P–rÜ1V¢ç‰½ ‹‰È)Á$|gÔþV?Þ7Ã6®¢cÈPÊ‚->š4;’ùÂrÃ÷›–þ4ÿø… u7,'ÔªçãÜCµž ±”n]°ÐìvÎSaÅ¢ˆ*àÓ%(¦wcÕà ¿Ww¡ÎÚ9Õš»X-è¹ÝŠ Rüà1'œËl÷ñ‘¼ÇœPÐÌ–ÉÜ´w[å8Ü™+¢†#ï®È¯f)$?êÆ²P Ë¡¹¬D?$ìÍßIÓÙ•àl ˜;:ªˆ1€!Uã:ÄBãpO3À¦FÓ@ø]ØéœÓ†ˆÑÅMá%\vy²ó4þtñ³!­s9U<¾§§ùlg¦UÙø‘h6–n6ü.·]GÌqˆp·Æó]€Ç¨3ƃBoŒÐuIӔѺXÁš ;¡n1´*ŽkaSu‚„¨"Õ¢ÿ=£VÿŽjf(ÆÏŒ«‹D|nß­/JGZ‹úkN9Âí²®YÓ÷¶o„Ü\Ô2 Ûâ±ÈM¡ ayàe‚\¦õ~^ð2¿ÖOÇ/óëû4³FœÏ܉ÒË¿l£ØÓNJÕNy¡i»]—m_¡!H±”Nñ_±6ÄÙjÍÆTM²€› 4:ávKˆ!ÚcNøsS1M3í+ŠÃO5vœ@Z`â§k­:d^Fër##±žîb0:)—Ë·Çý±£!]íÀ£kÌGµÎ+zM¢E¦QõÏí<ÁÈÈ„?©1Jºä#áÑD¢ÁLZÆu‰O©¯ £L0IñX"Æ©T˜hÞ¯Îÿ§3Ø.6ÑcŒ¤Ó²²T&úÁYš €Ó @ÿ¨yêÙÓç/£3¸Ì`Ù9`؜تGq€˜ï,«.Pª19•ûÅÁqÏ’Ùî¨y§ßX›€aÎjJBìóeÃ؈¢~hÒ¸ %Àg·éÓ·ïÊÈNwᛊClŸÐ·/+>[/ŒË®…™9/,çŒ3ëÝ»/›¸~Ì{"課^†2Åc1ò\<– 7Í)¸ØðÍN¾%êÃç&P)9:oI‘ l%(y!J¯óA¬…‘…Ÿï=ì;¬‘t‘#)öÌ :ßWÜZ•Äâ¨ñWq‰ì]í§Êrϯ»G ñòÝXr |, X‰‘JoÝSOòqA aJäý·\8J”ýï^q)&¼þ§‚5GÁ'vÓ|¦`‹9Ñ/”%w¼…K¤x»_˜Æ"|sN½»L˜”Oïv… v|Ñ(›žÃú1/>åèù  dω‘€ß9ÄD±¼çî²L˜?X÷<'Õ‹î8“íeNž—¹.š·Mµ&s\¨cÐÍŠU\›ƒŒù†P­¨'¿ø‹ÿ–á»+ÍÖFs\Õ¾³74kî¹û»óÈ8NþÑÜ$E¶¿Hfä¡ÉWxñðœZ¸ù4Lùcj,(o Ò¼µeòÛìX9:=::$)»¯sý6ª¾‡Î¬>?Žvv¢ÍZôžåãÊÆ6ºï|øP}“GâC‘"§I?¿wÞsúù篽ž~bWÓþü|€×ƒzï9òÍ€?ó¶e(·Ö Ó«p¹Ú„Pº Üc&‚J´ N£IáDgFP|rN >žsDŠBß ±ó´w!|®©ÜÐ-c§ÍmÆ&ê0M &=ׂ6B'®Ì eSF¹êf“ÔÀ\Ü>OàqņQ±gí3ñÇóXZ#E¹w1šChoà?Ñ  §% É4ÉB3ytób–Ñûfužs`^sU‘9úÏyUäh%U\õçN\ O«Å‡-nác¡bM.XóKF É2Õ™ô±…EŒAn YÍâÍi9†+X|7ѬrZóâ¦iÎÏv› çÏKõtw½gaƤ†×Ra©ÁGVæá9+È…`Ç•¬ w”39Rbnî=»Ùþ@—?Ü?ìù]gBéã½Í9ôzIÓOišðmTÀz3cïÁ¢Tä;É4ÏéØËzG´·*X”ýÔñ”É¥ú‰]“+þEÒë äTÌ?½L~”÷’b®;JvUlód;éôÖ“CF#`ÃH×ßévûˆÉQ^g“ÑÛd(NÞ+f žpìŠÄ˜Ó¹¸êø=67 ¬ÝFçÉ5éøÊ¢zÉY¼›l-z˜×³ÿH” €Y!ÿI…èdlÂN:n‘æžqY½O:sTN‹4õ]´ï¡´’Ü  º?µÓKœÇ*ÃGޱWðŠ?“AB ÉØ†SõÙ­S¥ô{]Ò‚}HaÕÐ B3ã]]8Õ»HY£.Gft)® ¾À¾ITæ$a0Ã(Úƒú;ƽsr< Öü’p¸X¸E©Fg‡Íá¨æ|èUËn4hMûRä-¶³ãh`ýÔhÔŒVÇÞö7ÕšgnB›UDnÆLˆɬDÝóg—ð€°„D"ëÍõ C4{|ëX\‰ \wnS>y¬Yçµ€^8_'C‚Ù¤³wm0ŸPg>‘À6ɶp•@w½uйußP?jdžÉÁ1ô»oSâL€ý–Íõëõ÷H3ÝË\™ýC°ß]š±A%áÍÑ4B&/£¤)ÛXêòÉ,¹àûs ±Õ%kaÕÊÁ/‰¦7Ô<õ¡Ö¿M8eË “ë}³ # âëîQA8t‡áµ…ÑVúaK¸Ù"ðÖòAeCSáž<™ £½½ÈdE†{]1϶ʎa履膟v.’ä”÷Fü´ÚŒö(u5«°óg7ž ‘о©@›õD›ß~¹,+b5ýé×7¾Jv ºÖŠö`fV¸—_}ý©ñ×rF™Â?Ýv}wÎÌð2¶)âô¸,†àkù|±Ý] 37Õ¨®iHöà‘ó×d6¬– ÜýÓÓàÒzïÌ_éht6õ&ŒºÒõÂÖööâpF+a1Uàzsº·‡:8˜ø¥ö¿q&sÞ|°þ°C¸GÉxKîQ5GÌŽæY½ '¡è¥Ó!æ )Õ9´DH: g®_¬.NJn¥¾|6)PŸs”Ã’ìøxϾK[>™KZú±#ú9ÂRÖ%•Áœ Õ–òLS˜‚*`i’/;‹¼„—m‘UëW4„Ê´ìÒ¾l¾I|:ô(çd.Š(Uâ€-x)¼‹>MçfÒÃ$«,nfZ3ä9PÐÄö ¯µà¼PôXK®®°±A•8K2^QL~^‹ö¸pø@èiÇvNÑG…-ÐË9£ÉÔv3·ºãûT¼íù¨¨&ñ®©c™¦ùk8»:K&÷iD2DŽŸ_ß§F¦/”4øSSaæ·ÆeëRvq£è´vMõÈtÚ@Sò!GWÊ:p¤ä†|™ïgÁïø€¤…ZÎÒ÷ÑÙ¿4NÖHôþ%çœ0W—r-hB¥ë¢šŠ›zDRÀõóÝgûˆ¹ÝpωtI †ËÊ{œ™ÃQÛm¿[Ý]â°vri'7S m¿œÀoF‹ü–*œ5òÝG(—ÌyÃ^¹w[$dU?‹úÜ1ÉÚžû]A ‘’ ôaCɯª‰ãÂëšðqðNadÏÃQ ¡1ñ™\€öŠÉ±k™Bs83Z0Q4wB)`Þ”Z-~Ѥšl,ËöIë*ꪚr)£" ;=«j¾'haªv¸*^râR0†W‹H¢&t.&ÑÙð-î¡uÂü Ø5NÛqP¥v…Z/€¬ñµ‘L2"í®«ˆ.g#Tä’Å“¢) 3wl„E24ҟϾC,ܺ£ô1Š8]Ø€[­6+Ô¼SÓ¼‰†6º½%™îvÂ%5Pë˜fœØ(·œc€ôáïéÒü½Þs‚5¸ð j#•-MÙ¹Õè9©"œµð&®è5W €ªÅMÔøì’ŽÊ~Ü‘^ªÏ/Ìë©_È“z¥3“A„Óm²øV¤$m½œËÍé -áû!’»U÷‘±ÑÝÿÈžØk.àC² q"u;^•h—yÑ™%cÇ'WD£9IaÎÉôÒ?‡ÛÿàÉÉvÿ (°svh^¢‡ø˜ý’y°TE¿ô†õ—`@îm«]u†ˆ8…†ª)iáF‘?·’µ+Y1?‡ƒg\´ob‚½Àå\Ñü©l¬Á ƒ—qÚΚŠSa§è7å/G9žˆ¥‚F«aŠTXbu“äw2²f2¢ÉisŸHŽƒE"?j ðΆû¨?ÄG›Î£Iò®ƒÛ©<¢¢`v¨g°z:&¬½Eo 0½^G`¹”ýàùÅZW ­Xµ©;:•r ¿@«®íŒEaRéVI¿§R>¢h%ì3/ 6&×VÒ¿áâTé¥jç¡j ·^ö2Å8ↆ}bF-³Êu·§·ãD´t+ lÏš'\±‹á¬Éôf®bˆÄá¬C?ï Ž4jä­pw>I’³´W‡käŽ>¼¥çwÅt·_RsÖKÉ]Èè+û7N‚¨y²sá•ÈÓ蘒ìgvу]àBj—;@ï~ÞÜjB-hØícAåNÃØŸ‡n#¸Z8üt:Ïnþ­sà¼LÛØ±vØ$H¬ '‹ÃÝ‘ÿ&•ÙV4rh–ÁèjB;¬êm8… ò±%ñ¯áˆš4c¥Sm‡@'šúÈSß8Éžñ0$î¥ ?d3dœ ö*êf2¥éAÆCððîÕFý¯¯ùßWý_sÿ.~HÿÔœœj ‹ÄüêÞËããýç§0/Ò¼G¯k4&0Ãï(µ H·“8Ÿí­2u4ž3<œë(¦‹‡nh×:öãýœ=‡Ákþ-£G’û‡|÷é>Œšýƒ‡kÀ~°í8ª_௲ïB©*ÛUhí‚b™&lRt/?ìð.DN•³Ÿ?à $ç^gÐab#×2š8ÈÌ” =þ}ŠwÖŽa$Â+®#R¯”kVÝýO9ÄÛ‹íž&šJ‡­}0PCæ5­ Ù“D…”!ÊC©K:âG1U0bvb§‘OôíxW°_5*î-·=¦¡E 4h¸ãÇ÷PÑѧcŒ3ž"‚vA‡¾ŠˆÓÝÑžÝ ºvîct“ôøÄ¶NzLzõ‘K¥ü^\Ê/Ö)¦ŠÚñɶPX½µŽ`rkH6ë¡.cLÚÛˆG ;0Û9áÞ~׹ʶœM1¿¿ã›¨˜”1pØ´š{2¤^ÿ<˜Çþiðjµöû@j¹¬è.òÀ ö/ÃŒe³ v2L1›WNÏ0‡Œ•Î"gvgˆ^tǼsMó™}¤¥Ó‹~ÀÚ­V Këôš™µÚ×>ãPn>½ŽRãÒÁ·í !RÎ΄£ÑxÇ[¨ëKt»¦y‚6¹ B¡Ø:@¸skX'˜\,¦AEÐx!‡î~OiõHPx¹7Ÿ-1-Ôî–}í…ö¬Dß³‹( ï–¹ñ—̇ˆ‡ õQµQm¸ÛÞ<Ù­žÙå$ðÕ9ò^äp Aý|'Þ!1™Öœ%+(ôyö¯ôø~[×ñ¿açnñfm< ö(´,¼¼º¨¢f~4›„¬W#T‡[Æ+Þ2sþ06K‚ý=n óYÚ}ÔgF…ðÑ·”èL„%}™¢N¼Ü}©Œ8Õõ(í£’Rm€×”qz(™¬ZþÿñÑIô_G¤Ó eâ³P·t‚:ïÈ>(y÷Ôø’þ€°Å«@ j~Ò[½zž˜4ÁHt¾ } UMgõÇöVAcÎéHâÜÉ©/È”E:Q"ƒ"ši«j¥ÍiC?jŽß¨n»Þw}ç T¥Bî8K -w¥¢(o¦w*ÃQðˆwEhK¥Ñ¨“棸½J#cTÝ_·Êy¡~Æ^ _"†?c×H Uˆ{•Ì)ú}'4¤ÏE7'/N6ò¥¬ÉèщÿœÅ\Ã÷RKüž KpÇŸ%8¿Çñ,øâÎxq°§Fk˜]®ÐwÐXu5vhøU`q\ÃLä Ç!ÞGÊ»0¡Û@Ú»‘¼ƒß/º¢1ö<‚C˦ãár™=׊ßéMÐp²Ax. ˜¼·?š¥º©I6$£œeÆf¶O1Ïõ¤èS¸›ü| ¥ÐÄ÷Út`%JÆûÕÙxvJÉm2ÎÌ–ñÆæË€}£Ý[P¿ìŽ@ª¯Ûœ+¤òþøÙ‡IÔr ç8M¬gÕhnm×nû`-ßó½bC7ùR̵‰³áôtÒ¦äTÕŒäüÀÕÑßá0@…tlÙÙÅÆÚ³±†/6ŸjÐaÜli#•foÙìÍ{~¸yòâMÎlîúWý!êEI~H05Eˆ¸qsR˜N]û%˜ ‘“B¥0\ÍívàP«ÝN¿x×/¢/.â7¦* -4UØ çÓúaÑÇž­[‰´¶De,bäœÙß ÄäÁЗcÞJîLŠ3¬€À]5˜Ö)ž“3ЇŸ+-X‰ñ †ÂAéÉ àúq%ïsÌc~ª£Ü4G÷LqäRˆb`ctiIÖ%‹Hã¿’ŤÉñvr½"Åí8?²TŽ,‰ØœZÎ ®µ.Dmãtíz\[_lÇe]ãfœ¯|‡u'û¹Öæ8¦»q1Á¢ØÂÌâøè»ÜŸÓ^ñ$xCµþßó·ç^8f?™žlF/çûRƒusÄ/ï=|·¼³&ÌÍ&ˆ¬¯Õ‘ð—ÍŒ¯mêï˜$J~=KF)ÿnsHÁãËNÿíl­f1!Ñæ¢i™%ët§3r@aüÃÈà¤E«”¢äj<Áª\vÆé¨w«Í°ä¹YP6_›ÖŽ¥T´gªDï¶ã0v¤ jÏ‚ Y²ÍeÝpø8ìÑ0™ž¥=;RæÈ%åc¨©aÔ«»: Ìe6è5@¶ícDóMÒk„uâ‘ÄJe¢¼7cžt.FÃóÁ­Û(É8ÀÏf½„Ûáz–jx'>mâ?íI¦EM^c’ÌtGz÷gÛÀÆõ¦_»ÝE%@¦.ÌmÓØÄä6nÊýCóÒèß&¿mLìLèé˜L¦)G–Oõ¬t#ˆ=xuNæe×Óטï®@—Òú º.·to™&]È, éüÇžÒÝ9©Hí~ªC¹âT£"—[VK?$K*#‡Ê¢ã>®*Ì – öLo£#ÝŽÀB7hz&¡C<¾<–¿›²¼0‹ÙY‹þ ¸ˆêí?¢Á0[ø÷(U~KͺxŒ»= 7•·ø½¾E2ÙÑl¬+^D«}üqq5þSM”BLBH÷7aÈô×ûºßM°&nô;3ÜÀj®*F¬ØÐÞd‹×à +’óÝ@PßG›¨§ºr×\±Üª¿<8HèÚ>FÈsd?nÙ´á䙽¢°ò“ô§Ó†ö÷ßá€~Lä¥ ›àO¯DÈJó’‚…öaq…VÔR>JÏE_â¯Iw¨K)¾¸¢ˆÇ‡ÈÀ‚Z:84ÕQç‰@7¼žA↮#Á1‘q&µâ`â¶Ç3Õ›rÍ™ò”Laÿ¤)´S øSî3†0V =>{ý ‰ïOÅ•EÏ-¸…YL@:âL´)¥i$„ynÔÅWÕ ì¾ Óu`×C‡ãÄ/nnMVA ñ{jb¬‹‹`³Rãòôná8ÊŸ|iôøR =Gor۞̆ÈWVŽŸ!csŽS×èò->¾užEß|³ô„To°G®`«µè=º¯Î&Ãèávô¡,ïçÕ­9ÅO÷öèß'‡»OO¢úÈ”p›¬ˆKam–+wÞÀï¦ø‹Š×w@Âr`?û.ìÝ€"ȃ  µˆa‰óƒq 4–.ÓÔÆ‰×DÛæ™fR åa˜P'Ú2ÃT؃ ‘”|·ì¸ÿ~j¡‚øÌÒýÒ–Ì›öUg ;3ÍÿÊ´ùß:.Û~5ÛšG5h€Õï›äf®·‚˜f–Žï«yàdV׿í“‚_ÐWzÊ®p~™X®Ã ˜zÚ¼+£ˆEQÚ1M„[Êø"Zz‚WÛÔbè#Á$_+ÿ¦£ó/Ò=KΊ/‹R–ýþÚ½õÎÒï¥(¸Cà 7tÜ Óò{SóO£çKRô|šþY¨úR³êPö"ÚîQ÷ÏLß7 ÿ;ÐøÏ—3"¯ÆO£óÔk y5;Cì}:s°­÷‘@ÍîÉÛ9f×dwÌ ×f3»6ïÂê² DvÅ|h9«C\öS¯^q~*ÝP÷Ï0ñ~Vű’˜N,Žââè* k3©Wpv )1ÎW7-FÍ€øƒYnúðüáÓ ˜ÌM‹Ó¶Ô%æ6PÅ9%©d:M&4éŸùfe–@U(Ћ~—õ7‚å à†lE‘ý’Š;J¦rƒ«‘`U6"Fuß( T§íãuç!B9ej`í¤׫~c¬‘ ÂÝóTO÷¾ûÞ{xç™ÑèÕW¼ŒÎ й@þÚ au‹r~pN.­Ãôò^7 W—³â˜¶%GHÂÇ;o8ÐNÜ;~ bL«#$’_×—¸•YýŸo…P7ÓŽpÞ©C”Áü¹ó&½*ª‡ØeäB»c%½MÛÙ‡—¹¸Ÿ9ìRØ!ï.–Þ¤NoäÍx4E%OG|]Þ `ïôq ¾jÔ_¯E›Öl¯ F%¨Ì¹Ë?ºV¥îhÓ¥:ÚzBý*=Œñ•èɈ\cÒÑ9ÓaÔ´Ù- ­×‡oëŒÝ¶ýLãQýÛ(7¿xÉõNµ)â–>¤6ƒÛQ¦Š5Jn]Q‚^°œmËù0ÁŒæiÊPž;¼ŽC¦3 W{÷¶;æÆ׊ÕrV&ª›eêÔ‹²CŸ;S[¢YîF)ùÀàÚvšMjpÝù¯CTËÂÕôEéM)¯€ZóÊñÝ­_òì‡3/ëXâWØ"m–::Qñ3 ]Ül¬áÒ4›M¬PùöC¦ssR 8=•Oˆ’•ì+cŒ×žš¶ï^ýuTîîªob§Î÷R2R@oO»ø¢Ó½êEˆ)ËÕ´rw¢Ðª‡¿êö«ñ(¡:Ôää(-GÚK.e/‘ú4Ú w· Ȧ¢¹ÅÏ2f–å±ñÂXå3<<1Á¨¦f÷^±Í2ï¦íù«>'ÿYyøÏɽgùöâÇ»(œxsiR¢Þ{IO;TíÇîEû›ÝùÎíá¬Ô5{É3'r0D,à!4 d¶Np…fÃ^#Zm4ŸÍÑ~¥Vj±{ÝÖ6Š¡dÚäu4  †Üu?\¡\’ [VP%£¨vœ.4ëÐ\%½-¥!Êë§Yw`‡{Øú¡ …±HæÍð…yÈP÷Sü1½œø¬$Á:Ê7“ÈÌÐûá}Ygïãÿãžÿ×rÏŸÑœÏËñq÷`ಢ''”ÉÉX©3TP“½#ÑGº7ml§ÅV“âß²|ÃÒõjòjrInÙœc’ÑÞãÔkgo;08»{ïþß­û·î'ߺ´c#Ù¿ÿ¶‹×ëÅÿŠ»—¦æÎÂÜIÏ<ŸÆý ½„ÈV+Ñ §P¥Ù„û~}uxüúÕ/Ñëµf“²¯|úÅæ›Ž2·›kDZ‘X.ÜÕ?á2‹ª;½ÒaÓDÓ6«& {îp§Ž/ó]¥w¿ÉÓ 2Óà|¦‹¯´J-˜—Z˜8Ú†v “h©4Û®zÔP@ŠM­›,ª¢V?vyÒ°&Ít ùØ9 í?® ÞRœíÀæŠÉlÕ»´=»ƒ%çVÏäZÐ*3·D>nÿîÄ!ûncêXU±.cÖ«âzž÷´Šë§¦«öA9Lƒ·œK(!YŸPq&'"¶çèËï$Ï=Ô9Å^V¥‚ƒ5sG£&ÝŒ=Åμç„ÐÍIàm7~ÎórCóž¢žß ËÛ(q&ÿº·s0ãçŒ6Á"ãÊ¡ñ H ΑT™ìæŸ<[•;(x˜}Q¾o×ÎáÏ“ù;¬õs¤ÿëüÿØ{÷þ4Ždø÷¯xÄ. ºø’]9J‚%lëD·#äÄYIÁ#I¬! XÖÚÞ×þÔ­osAÈv²çœ'ùìZÌLwõ½ºººê[Ÿ›ªê`Nƒ[©)zõšç[Ë\›_£¥ÎÌÍ23çAy¿÷ Oô¥9s|)oz›‹˜9sÛ‰®Üw<ڗȤYÄs’xçûª`œÞœý0BoY`Ì 2XFW컇~ºÅË(òœ+ A€P;¦Ѓ´XHF1B€ …{ŸÝú^19Â[vÅ­ß3Ø¢Y8ïÈpO’™åËÔ¬V/е˜ÒÚî÷“EàSñm85TLXc?¬‡_õGä§ïŸ³ua¸ý PÏz_åûsæ…—Z)j'IÖqÃ*,åG6ÍÎXÈ2LÕå%Òó„æT•tðDð7•?•Óàœ°S Ÿ3'S"b”[Û3e7Êå  ÆF’ðüº¸žvéŠsN€¡ÜžV6dƒÁÚqìÓñŒ+%lN“?3¾ÿ°+"Íh –íC¯Rd[£½ÔÃ!" gËöü`Í–¨«`õpKxÔ0ÆòfÑW…ê6»•Þ*3×;+¹oËO€R^m8ÊtRó½Ð؉²]ÜSé:0ÁÌÍ;PÉcçN^ÍÒÍ«’CÄ#óÞé óIúŠÌ-o²—øU1Ê „$ Jº>ïy;KO.p…Ô‡óJ'ÒUmâàj‰bŠ”&x!huæ@„È(IǼkôF‡eÇQBD@ à´×3±ƒ¹ì–=Cû] ãC·gý.#‹¹°R àÒ¤€h˜fñ•Í“û•JÀUÁYXcdøããÇnK°qÚ‡™4Fx-§›“Î6Ýq­Ü63HÉ!±¼[óÒ'GC7#Q°Œz‚i'Q‚«¦—ø®KX€J0^D5Å•s{ë_© Ô)±š¤$(W³Ö”Ámf¨$f=6É9ÇõàÑ /;Y½ ½þÞÞ„!cè£7×Áá‰qyTrÓõeCíSôD}D$2'ð2ß" +¹ê£)½F§Ã‰Û ¦}@8Á•<*ÁÄh°Îºý š5cKÐD¯ j8ñª½¯èMS<ô¸EPs'š­Çܱ½PèaÛ–buuE7cØ*¡¨¼‰™­šf°Qªu{§#[Æ,JŒ…‘^’sMŒ'(rw’†Ñ}}ô= ¬æ·wn3Ü01Eò/j2«dá2æzÆt¦ú6œ\`(¢@ñF!eáJ#C-›…<t¬‘W¾,ül—ðÌaÀ – šuü9#øSùße+AÊu’ˆ0‹+ ù ¬µ¢Ä¡½ì’#XM‚Y9Ž\»‚¶7ùî«— ¤ÃÓ d4AÌ “µÈìïãD/¥ øw ÉtÔ§÷h·ËÖ`ÿæ¨ÊdŠ?ŽÐžúƒÊú4Dƒ+ tó`Rü[Ž;S¨n‡u\  ÃÝ»ð¬hÍÍÀPŠÔ¡üžåÔ ¿ìISéðê9E"“(|<9ÁSÙ‹l2…¡¾uô (½(ð†Á;쪽²¶Uz=$Ô¡ª¯?á•KççÈíÂða“U9|×éî{˜dKñ›>Þ«ÈÂÛº Ü xÿ(–ÙÄÑÞ‰¡-Nލ¥çU4¤ƒ´±8ƒµ\ eý^]uTTMo+ÀŠiŒ†º>î´óêd Kµ¨”Êhë™·Õ[º>ûéjL—ÒÁ>Ìx ôH5ÁÂ6½lè}ñOZãngã¾ÌÖ 6¨c0”[󢘿©ï¼>È\wOÝýÎà¸êVÿÎÉEzvø€ÎPt­ŠQêè:›.ò›l±a¼‘êl^à,=º=v°KÙœ4ØùÙÜ%*·I•yJF„ˆ:“ÁmñŽnú(K{éI zÁ- Ãm¤¨yèý¨EÃ!Ok܉‹c­ÉH1©ò°§Ö –>GÚsâS’M ïU4 jÉqÙEͦž–óp&½÷_~<)–s‹Øÿ)3Cšr9ã6íËœÐên‘É A›–±¸¬ :i³$º¿y¹&«jÏUßa÷¦ËÁÎñº#{´ýÉj†«ª>1ò5'ŠÜK c²%<Â,FÌô8’¼³5G ³åÛ\‹®·‚+µÓ8«œª³Ú9þ¬Å~=[/}8[?ÛøP+«o“,,õùC±øøB÷9|à 2¿Ù—wMhdƲÀ–&×0§uÌ2YC®ýù~ú¦ÑÅv/Ýìîcú²Ô5âô3f„GäMÄ\#:y“,Ô©XÆŒ’Ü\G @è›2{dÓžh«C]º_Üá­7‘–NƒZ!”TA°•—©oÂÐ=£V^Q¸ÙX[*÷:Ü9ÜS=ŒP6ìÿKLh %…6Õ¤QpÒ’;§…[9Êï¼q[’#Èm´þ„^‹ì=ðYÑé»;Tiž}z§p%±Þ[„óïÒ3M£Ö÷pž1 mÛľàܺž±NäÍò4YÒ>“Œ‹M¼p[Sr9a´e'.ÃÄ6è|É;ï2+3ñY1K÷ªUœË,Q‘Ên@¶9³±ÖdÍFI[[¾Úæ;Šê‘ÀïÏ„ïÏ“-*Ý^‚ùa7^â½V.|Iï@$3úfïkµLôXâ7ÍÙ‰¼©:ð…Þa3¢\ˆá­?ü’tyœg®|'ùYfJ’‘adàT¹œeeÐ ‹•2éï kÅ<й¤4 7òÄâ Ô|`ñfäðë•‘à®6ºÙÄÜV.&”WùbJ4_³´0úÛ ’;Ô"º7Ýh w;µC•>t2ì¥÷ÃnˆBÔp|ùü‰‚ä G*éÄiQ4f›5Žå-܃IÄÝI »š\+k÷/–é«eIY³qh3OØ# ®«}|ÈGPD¬¹4ûhÎ^ƒF=‚¿)P©HÄÝÍP.¡ y£á:3éiÃQ¨/œš’sŒ@†Æñlºî^hL:¡ «8²‡üª­ø€Âá±(ª“}Сîuèr+ŽYC;K²@£ØÃÈÛe‡ïº ÌH %ÁžÓ5ð4Ü®4eÕÕÿú\™eL˜¬£,u›RwéÛ¸96@VZeÂz«hdÇo³pF.mr õñè…²ÙÂúhèÃ3³’‚£Q7pž¸„~…@Ê ¼¡§7[ë…—tûå.‡ùl@\Лëj4ë |Ûë;u‡ƒÑ^ŒY× FŸ'«œSºš™äNgnÍܺ“ó5©)Åò' ¶4Jë£ì¹Ã,liŽæ3o&‡•ï²F×€(F½Ôó?}U}žJèñ4 „0óÂ+Ûrä ûÂIZz–îܺ±Ìb%œüÉ–¡MO„l­rÌjd¹’½c²ÕKotT*£ÿN‰]\Ž'uå‰Lú+|X˸¹2·PbZ+ØË½=¼`‹Þìs¾ÄuØ"ßúÏåY<§–ÜjÊÕ„¾|­2®Ø¬ÌçÇŽôo‘eóÀý•oÂæ‹ƒŽ ¨ĉ©8UtÌ@]iÐv4ÊmÁ`ˆÎZ4¬x~ Ùt±ô£­²á!‹­«zøTð%Æ%2ü-Í~}í*ñ=Æ(ÐD³Ø-!  s¶šã¹Âbƒ4LƒÒÍŽ³ý¦§–3Ææñì"FŸÑ4o³'‰rlÐ%\^8\V-Í(ÂlÐû1¿Êg%çùßnþ}F'ZCä¬èbžYÙb±Å˜ˆoú†ƒ`“X’9/ï¹ÖÉÇN;U'z#±lÖ²×{ZJÔК꺨h–ŽÚnúëžüJdå_ˆw½ñˆÚ¬ÙwMK"=ƒòfŽðP Øz€íÎo’è¬ Ì:‡Ï™vÙÙÛM,Q+Y`NgLã$pÃ]iÚS&§ÄTå½/EÕéªò#Ùdo~÷´¹¿õÌ=ìg”Qÿyò1.Q”;ÌçØÏßÊñ›¦ë˜ZwΘ +Ÿ…gÎÒçO™Wåž%[ß!ëN˜ÀìU¿™œ~"Th¼g,bG¯Ì¸CtÀ–û|‰Ž·  [@Ù¾¸ÓЦ×o³>ˆãl—¨y+P†ãx4é°ŽB̬ÑPÑÀŸ çMæðÕÖÊZÝdªeÅŠB*1˜vP¹ºUú¾@¶Ç0RÑ$ÌÕsõ]‘hžj*RQÝ^ÒÐUædn“¨èè|Oü¯|[o5ÂE ñÉOEUåg+鈥=‰®È³h¸ICÓú_lÎ`ÜÊáÈ_ÂêAÃÊ,f,úE­r—ÃçY@xÛš×EóM¬Èý¹æiæùY&‚¼ûE̘Ö2}ÐÒýç›?0¥/`!†Òyf™BÅk 1Oh»¿9Ä=ä*1‰Èï‚/hay‹Ò™¿¯™› NÐ(8§(×0¥ötëÏ[D·þ{_ºs,«‹®·¯öU6‚yO#ѽ§8¯½äÑ•#Ç}}Ǥ éË¡»ïas!¹‰ý‚w±óoXýCKæj:æË]£Þq7šU»äÍç|+E½î=c»ìà DwÄn.¼dìe_ƒ%koBì:õ_Ô°d!³’;ŒJœèÂKŸnQ²Ð2f?Íœó‡wöp,ÔŽK£A!íiÀ\$u&IGÌ^‘{ ±~¬÷9‘|Ì5ñN"t®v# xáóˆ»$ç[«àóN%F(Î=˜Ü}(ñÃÔÑ䣶KGîÓàßÝ4çd®iŽýê󘤾áÎÜ­4“á/zcq z¼ÿ‘¯e…§Ž=KzDZ¯vO:í—ÛÛ­vÛ0¬mÖÖPœ­G'ÏbëC¬}`©KY_õŠÔÍpg]ê”i?1§•œ¹ÉÒ W{¶WŒ“ÆÀq–à.0þ¸»—ª.ÀqМºœûtH'´™`:vˆ‹5;ϱ¯Òú½ì‹BÖÛ9‚3dFc«ß£XÎ5 ;Ž~ýž3@Âoä80'0«ž<á³-t]µ¡ë’õîÆb*>Šx z°å.M…iˆn–Q˺V¦ÐäW£±Øäb w¹¢­‘ {åb?õGòeå ÔÑË ~:P²¬A™V}¹¾WæîÈ(0*@^øW²ú˜ß–±ws©߃ÒÛ>ªò‰{_Ó܃¦ “æ6–?ßIÝÅÖÉŽVcUµ›úˆï㢙‘Õ›|ÿî„l²']<ù20‘fè¢Ë,KQÍ8‚vkÄ:[3ñl²G¾‰‰6"cÍ {.¥0_ÌMŒ™!8Ç„$Öär€Åv ËD Œó¾ÆqÊTœã ­ÔÈÒ9teÀLÉ Hñ’“̱b“ÍÙ¡ž¹yÖàŠ7úÇPèõ//á(?¢ë>Öín¯b?Ã_–#i3®ÞŒ¡I-VᓈÕР¯e R|Ë#ïEDµÈj—ʹÁAì1÷vb„âª×8V^¿‡ç©úÏê§‚uB϶nCÖp ÌHǯFZ÷1ãiOò½ƒð†ÁLÇA7lxsÝ­œ™ð‚Fuz¦ÎJçID*;ìÎÝýžöël0wÒIé yî™Ù)hÀ¬=‡Á“ÈIà ª}P€/5â%ç’ïLåQ³æž¹§—‹~¹cKÂ>Ué¢[ë;0î6k¦Ys–êšømá¯Bàl:F"Z\ÂZë ªYk8\{Žuµù‘ØZlÛ 6àOõxzkîˆkÔ(x<Ĥ€EVÏ4†giµ÷DÁ#<ÑÏ$äÐ+%{[×Ö\×ctäW¹…âÅçH¸¯¦Å-|Ó'SZèjT@ö"¾/Kl+|Ó˜X¢Ö÷%{uʳ‹q›¤ç ±:9gñ÷_ª>fj_ì i¿§ü];D>Ú#˜b§‚”Œ–ÁˈÄFÒ§ÓbÊ Ô"1cºÖFéLLpýÓ`8Fm¥Ù•—sÁ¹Y<LJܞýXÈbÀl¿êì´ŽöÙoœtNšÇÏ['u ¼öÑ8ÂŽõƒójÖµš'­F/"^lý¢?êu‚i×A1+›‰;󹎵Œèý¥@¹?iöÝ ®úӦ⽊HÌË?±Sƒ÷?;Q¥ÿåÙÉuãeâÉåUXŒA¤ÖL¦@ÄhËï|T:®Ñ½êií.]Ï1`(RIó:"³r±‰ËkVB]k¼Å Nv9 äÇ羺œ\JÚÚHnb”RY ¹ú@ú¸zûÏu>¶–ÒðØvn;]â¡\«Dû¸‹îi}O<ëÔ o.Bï<8êäó‚ Ôž8ð¥p©5zògCS»ˆË ô¬OD¥ÎeN83/Kƒ&ì R³ ÷hÔùHÔ‹,°yÔVÉãaQBñÉ …âÃøæÁ†þÅòÓÅ¡ØÓŸx¯T²c4¯¬¢ÊeeÒ®°&Žê± G„o¹XïMÓÚM¡²i[»¹YU^j=ï3;ÃK© ½¢¿™ÜU Û¼ù±é«ŒM_\tOþœð{¡ë³I÷0áùá´f42¸š»j÷~Þ’`ŸÁÕÿdã²ñÿ87“ðùyvþ<Æþÿ/†á/ðÇðÝc’îྠ; ÄáI0Š)ÌYà̱àçt—€DoØ#¹HývKL|Xü?nîÿPdHJ+Ž£‘!1¢±A"h“L6'ñ'³ôÇ^Â9 ä› . Þpý6ëOÂÞÖæ<K+(¸dó`£®TÍé²ÚéÇ䚤ɲ£f¢Z“I!ݸ&77ª;‰âX6.ºÀÝÞ· C8]KîCýÝ^ê;â—È^¶z‹\º,^’¥›‡—}î~ßè«ùq–¬Nü®J˜•«2/¡K©ür„vuV)+F½[¢W|£ÏÅǺª_ž½<ùá/e£è/³fŠg¢J’ðOt]õ³@ã@‡fÿ¹)ńװ„˜E7 ¾+"Eù,ÞZ+¤QtÝJÉ ÑÉé’Ñ—q0®tzåÝ ˜àeÛzm,F;È “T=!?¯;õדÃÃ½Ž“$¢¬ãåe² ¿ŽœÆ³F/öž‘œºLÇppMÛÚõzÞå%Yõ-DÄ¿gunîe`:^K:ú‹©_rþ'#µœ-F/ÅåÌÑx驗ܽJÏ©bjK˨ãb5Jmi»=©3’M λ;Å9Ie(Z$<‘ NtWh¢¹‰´;¤Û8?6ÑY1+8tY1bf”-¡~‘veнg½¡ºW ó®›õ&:Š:ž‘ïg10V/&¬ìK[-gc€ܱIÜc'óŠpÔ*.ó_dKÛÿÙB¡˜ló?1(\V{h3ÁvsÈIF²6ì‹ìMêÏMiqóšÄ¹ k¥KôÑ— ëÚö±°Vc-ܲzÌKÉLHv'@sØc»Oœ»º<›Ù] )nœŒ8izÍÜø“Ñf:œô ÿÆwž`ƒ4{WL“²ö·Í[ê Ùz³ &qû¥è…ᙸŒ¡šî¯}ÉÞIÔLtOJö¼³3WôY í3P¬8#È*šV榫°Ú(ªþ'Ç6Uà èPûÅûÔ/)ËÚyAþª¡@>É&ðzèÈÌ,"×úÚVélN˜_PòÓ`Zw¾zGü…XtÖ©=“Oçsé¬î(,}Q¶×ãŸÊÉïÅdz¯$€˜¤ 0Å"ŸhjÿŽxHw^}sŒrU|ÝÉ{7Khõ–‰#Ô¡‹ð„ÀRnÏdA §Áå%Át H pN8Áö£ _C’åLÆz»õÈW‹t\¦ j¾Ñµô=æû¤ÆgžÚ;±¦‹ïssÑjL;³Êžø4ôkËF–„§'ê#ý/Ù ’j ;ä$½‚#岚zómn]³JÎ.3³½2yÚÒæ”SÊÈ+ów*±¥$qôP{=¾é½Ne¬S© [LaÕŒ1Ì®$¢wM‹¯3 ¨‚<3#ƒÔjœa.ÇlÀ‹R‹ê!H0@´lÍ㌤ ºélð>DX>åG{êv4Ù»Dû´ë€ŒÐ…6™ ]^ößéxd¶‰‰¢ËK‚Š0a½­ãªä1ë=íC皇Ú¾¥ež¤n$ A8¾U—A«›Õˆ+¾›†#4 S7¸VƒXÕN«!ÆGÅ|®—âœÚ ·¶•g?½üÐ]…”ã´(·fžnÓ‰ÙŸeta ‚l)£°ãŒgè$vÐxX¹ó¶Ö\ÕP.­‚ßþï#ñ,<’ú~ïè°½ûJõBöv^hp‡±‰ áè^η³$sG*xõ{¦ØT–¼ Œï¸Ò¦xÔaæ!]Öj7s'ÞØNÓÓprL+/l\5j‘É–‚ùÙ ÊL5 ]Â%=„1tÂ$LH'qcMû“pzË9µS¤&ÉŽ#Š6ª*ÝÙÝþõnÙW£§¹ä·›Š‹Ï.ƒ’ öïJêy@ÿ á¼hÑ<á(ãáUþÔg ¤®ö·«£È ßýu½šg‡¼-‹Ýh|KÆ&á–BØóqÅÍØš*BÇ^ÂpN Èþ›ó:Íð š*­¢ ·¢w§3õ;¾Ä›`Îl­ëë3ßÉäÝœeö>üÂ÷óNFÚ-Ã.7mÞ§¬ªÝö°Ú²nåôL­žSA”}ÅxQÝ\£öoSB Kœ²x6 ®‚ýì J Â"ø¢¢z“þ)ÄœC ‚1^Í/ÿCP‹Á´$]S×%'¢ÈgX×ý˜ bžÝì%Ý2.ÒØà¡g‰æ›_ñ~Ë£º*)…{²ëÛ˜vœÍ×í‚¥'U°ƒ‘løT 2zœù)ÓÿÌa™9©ÍVó2’¡“éúsÝ Š.KÓK‚\QÍ©^X¢,œv^ô‹ÎÛ 뺰”±ŽRQv€u Úô™q½Ò3Ãô%Ì>åã$3bLVZ—ì;Å„Ï_º¿Q{?˜ê m~½õQ*§[¾ v\þmb)qµ]ßÃÛm·w¤­4Gœî˼Ú^¨Žõ½RM‡„SÉãÌJÿþ•<^¼’i0Œñ±8|ŸK«ðH® Rš˜]m å»U°Ë̬1þ”^[™ Ëx%Ö×"‹ëþkÞ~ÂùÄbc~,¾02†Ó’Yd e\J6§3fZ‰¿•5júã‚§±ëÆAãu"{iOÓ3ŽÃY/ªëÃ9ê¨)cø6¡A‘ a˜;´»Á’"÷§U­¿_B0ÙZÁ¦Ó\@*ǯ/Y4¶+iÔ)¯ã º™ÁÏÿ/Ì7=‚÷›rÙÓÈL•’GÚ?o¹Œàþ|`éôìlõ­‹N›õõoò›*œÀù רuñ‰„ÅÕüe æ¬à".þ¡‹åh;àÙ œ3Œ,®%l–Ëc öŽíF\JèÃÑ'»kñ&Ú/xt§„)çÇpbÛƒ.½C[#²+! ¤AîÙd1Ät€^0‚;éÕ)ƒd<ßû®ñSÌd8O05žS0§R ¤w8ºË;jž¼¨1 =-B(瘮úçjqM!Ãi8¢2“Š£k]MÇÐY}Ö-›UkαڀQ_BÚ":lëä`]}éð À¨a|¢öäFhU“CuŒ¬?†ô wx¨ŽZLF_µA ÄZE†»'+±ñ"[b‘‘(¼±G¤0¼æ^lô¯2úI#ÐvP0”ÐhôH¦@S+€ÿZÜ?4ªÉt«Ù³GMâÔJfÞɈX ÖVA}=j£¨¶ÒèAyÆ&1ûû§¿U­ªoo`ëÜà«W3j3E`˜QŸ÷jʺ$ôM`62ãxj<­ÇmÙ@LG¹ÄIÊfÃ=B÷Y:§ì@«Nw:P°c½H ~‰‹Š@a¡^‡³I?†ógÃ!ßhàà%IYÕ¢hÇbsé Šg…eåº2ÔKl½ÂpJA²çæÞõâV•Œ@U0Ô\騹ýcóy«ªJ?µŽÛ»‡…eÈqD(§jçPž`Ð4ö¿ès\¾¯ Å. ÂnÇT”D1Jv+¤À&’öÊRPÚ´ò Ú(H‡”KÒ5eÌt@„*ròƒ,Dã-Ú¡ísÙ+M }[FÁU°•KÎåFo½pÂ8p†âö‘…µ/…7 ýŒxú¶C¾RU/^öG)Ç )^Óâ†Fâ «Ù]l’ròÜìwUÐëÑÎÂÑM¼qÎìãIô¶ßãàvhÓu’ª_2ùŸ$æBé"ËÒ[ÑNÄ2dÊÕÿû‚yµeùænó5Ì#ô]Ã;‚nŠØ{úƒþôÖ³öà@oȘ±ÅßøÆ“è0gHø™–˜yn®Ò.¿ ü»Ÿ…“rÁ|£—z7§þÚ!‰7šÜ:C«W$šÿiW7´Y±µœ`MÐÙÂLÔRꢚ‡:áê„„gxL#¡ø:KªÙΊ¾ãC­ž¬¾ ­ «Š ž¡&§¥ŽA,£Yˆ2{;½Ý§ÇÍã_:¸ÕëË>C–2A,ëF6²µ÷åÜ(V.¦@2Vp^ Å{òb¥-:sL?¡‡ô ¥ƒQ™kó9‘ª´ ãö úôýú×ÅÒÅTK¼²ß~7ËF£QÈúT©ÞSmg\Ì®ðö„GñxŸ" @ØÊ”EkÒÄaº¡9â#i´É; ܦá=,<£ìXýÍÍÝ'œ:7° G,è >˜“ÃDz ©a´y¸µþX¯ÂÔ„‹ ÆBº@®€<£Xxmç[ýÒ?Íãä $ÐûºÑ›Öt³¾’—ÜI€LiéßKe¦Lò‚ê_d½œ¾™âèu8«âm4c³}v¼ÄÐgXé$¹ç™ ¿ÍôÙ0z€>9ôŃ@ 0\•ø†ÈµA’ííá‹Y F,w„¬ˆròòs­.å{º_ý >çôOµÒˆÁù*ç.ÍÎxÍá]š.Ýõm† eMì/Š÷ˆêЮ#"C8©€0m-áŒ9cœèŒ.ˆJ£ìØsÚfЇÈÃ,‹æ"–™ ”.ÂëáÒAˆýK8$Wpúò/ç"ІX(T¼m†¾€ÛÓÝÿD}LÚƒzê”×w¦´vÖ’Ž{dÓL#²÷’i\–³Žp,#8ÅÍB7gIÖ¬…lñÒØþ™ åÌM’°ÇôéÆS¥äÅqÿí’[ß‚< ‘BOCEØr"€”d¹èµCy^)%£óÑ‘c­SsúŠ…¬n‡¤ykh{‘DÚsdµ4¡áFëa‚øVØB¯˜´~OqìARÏz™Ü´ª¾©¤WeÇ`’€¬ù˜i—-×àÚìÞsk§Ó%-ñ”a§ÅƒùÝÅ®á|WÆ·d ½á8ÕŒ8¸^cSÏslæÑ]Úò1/zpž„—E»Yë…¡#§˜u4?R»3² V³|B¥SÙîQñ%/2»ØMB]>£Ñ“Œ5‰ßFarÂVfEÐñMLd»LÀ:›{²x;àÃ@žOäw±ôS°f´ Ÿ¬¬È”MN)¨¸‘‚Xµþ/Ö™b„gKùF¾¦"p¦UÍÉâDåzJø¸O­«ï¯“UßDŠEëœÈæX¹#^µ6¯söqD"˜È,Žøj4¶¬‹óžÂ,à,iÉ;Ç;øN2Ž«±S¹9´–¥²¤o$_èkôñû"dÀ{vN“Î4.ªˆ„osãq;á§™¾"KNÔçt>Ynaè|»âll)š2 /ÂŒÝ6+™ÕIgç˜ç#ê UEųL—…¼°«cNŸÝ‘½˜6“\¤V²d’$6ö4q(žö‰“‹2͆@±QŸ)T4é_!Ê ºÃȉ{×¾Q ËŸ“³Ö'[=Š0”º4{á%µ[8@3Óªë)ˆ>äcî°DÚÝYsz?2Ƥ¯ls ãW¥T”ãJÐ4ÝbFPû¥,ÈÏ”A#Þ# ñ¸åzÒXAzoÝ ÷è εr¬÷úžè³Èö‡¬«Ñ5…ÄW9÷š³§ Açìé‰ûîÉ1Y{ÊIs6y°H %ÚF¤± eLÞéPkdòÙ¾ÊT¸øZÇZÖ=w¢Þð[lV Û>:â«ýÃV›`‰#ëP¨xQ¤èèØ~E:b Œ©+õ*mŸÐJ04Msiðµûµ 2«©íén×Ú÷“æóvŒu…¿½ð²ñ¬{m®8J-‚H,Á¸?QÍ ËÎ,Lá‹6­7}TŒ[qÞ>‡“Ùȸ§áuß²ê^GýnÈÃW+‰ô5€ñ ¤Šè`-„¶@äAX+P´ÝnhïQÅ…•"gÀ$”$›˜šö4œCaÙš â7&Ž &ód½ KßB¦0Ôç-˜@fƒ`‚æCª0…óUÍÝW5CÔDo\Ö¤ð’bêF}2J£Â)à=ÔQæÆ¸_,SlFƉ€÷ººúþT‡UäA$‚õˆl'aLúW³‰ …É-ŸôS]ŠžWز+ÅšDÆ«3®K‘Ä¡õˆ* ŒÆ¹dBE|ýëä")ÃÖ‹n¤–——ÕÓÖóݵ·ûñ®pΪíÃg»Ï7u,d;¥û¦Û[°÷ÝÖÁÎ"T¯5%YÞë9®ÿ¸VÙÑs=yB3ø€Æ§Ohëx½h]¹l¼¯ŠºÀ~ÒšÜÍÂ2q˜ÍøÏ@@#pÂ]×ût‡O´¹¯Z£Þfáÿýú¯[‡ŒëëõÆÚ*þî ßü6 áˆùàK•±ÿ=~øÿ®óhÍý‹ÿ=ÚX{üÿÖ7?ZÇtü¿µõ‡ðGý¯êHiŒùû¿ä¿ÆY±ÿWÛÑø–QÇ×ÿþ÷¿ÕÔ´ïWCµİ̮O§±Úéø°{ÀZEƒè X‘&u„ö+1‰Í2¬¦ÐC»†k ¤‚qkX”p²»˜ÉUÇ×óðä…j·Úýÿûeëøõ@7ÖÔAôgöß!Aû…:hî· .ËSguXCž](7]Á¶_b긃¶âd3 L4Ú¿µwÛ…ÆZ÷T-ƒ°5˜´ú-n\Whá‡>>9eU(,*Füœ¨•³Ë]ì³Ë£%„çÞ(î`á¹ï¦·cJô–f£¸E’è5 EðµßsÓNøÉ$ã‚°$¨½&‚iåÕ ÁÛj¡â06l§ÕÞ>Þ=:A+šÞ.C惰Îâ švAVj»–t¸aª@ˆn»Ã ÷U¡p‚³í©×ø‚&CîZÐݨ,±ýKj=J@)¡Ü=5ÅîߥR¸"œœlœ›– žÐÕÁ˽:[ÓQÝ· àÃ{ÂŒîG½ºD®f€3jÌ6' j…ìe+•á Oä/3ìb¤kq$U("¤Ê@@éã°§©`Ì@‚°Ó˜[£‡¼´ñ‡›ZÇŽÎø‰¼×AÜd‹ËFY±9¦ ŸxzŒ“q¬’?œÀ¤T}ÙïIOjýqý££ìƒA%'"ïKqÉÊcîI¯`=ZGÑè_á$ƒ2Ì›™XÜ`­bŒâQSú+°4!ÆÓBƒ5“}ãµ'Žxòñº«áhD}{0f’³O)Œµœöͽ>§g°ª[¨ï1ÒRµóÛN¯`€ S=rê>äйQØ5±.{ ê&þ{_ØàÅúPLиI<€½œðs‡çª¬&²ê³™{#âWöðò³ð2®hFhšÇÈRÄž×+¸ÆÒ€ëhÖ!lÁc¦Z+Bç,mšËg—OÑzÖwâþ¿-q<€¨°5BrÜ:yy| ~jî½lµSmi&!ÚÁ2Œ‘\÷FU'3OäMàäGˆzÙ‰Ÿk•mTÚniÓyW:'‘¿õ´¹C|ÿÄ㆙°Y±F¦Ü b&½¯b(UM…}:>§á1u§w]¦³ƒ(/­þ~ Ò™ A·<~P@nt‘1¤[pp¸ßÚ/ì‡C´ÊBUdøî(O©µ¸%µZª¹×>¤•O}Û%¢ic„1¬Ù/ÎLÃ/”¿ùòäÅáqáù$¼R/f½å’ýÝü¬ÉÇ®u1)|ÑñÿýùßÿœóŒU‡ü`'°úã·Ÿ¼ãü÷pcã<ÿ}³¶¶ñè›áü¯Öþ<ÿýgÎkë´|ŸÂŽ<-ß^Ñß‹€i÷Є–n$·ïþ<óýyæûŸwæk·NàÿÇèÐÙnÿ„g¿kê¿f£&wòð—àw5•z‹ƒGßð€Ø§Æ$%I$vÐlŽöi'ÃDE*,D0 ä1ùIç:{z\ÁO’Op9$M+>™pÆÑÅ(³ê"!Îí¬Ï¦.HË 1 ×âÂë^\!8¼,›»q>Ò.’Or06 t:ÝÄBÏOkÎÃ9ÚžEèðÀ¤ !íúß7ëÿÖ€-qm­æ>­×465ÓÈÝÑr#YSuá Mº„î0ä˜&k7£ i; dZRKò»ºÑ/±€þ]·T -Ä-Z/wxN¶ø³Ææ’§`ïj”œ!¡ô¹R~r*ƒhI?¦ŽˆØòâ¿ñ‹Ñ£íÝ¥ˆ·UýyЋ =2úÓ>…’éå Ô'l­yà̼ ú:ë ³íæI“ˆè…Õ ¦=C÷ôIQ>Ø n:³Èììžì6÷vÿÑÚ)°”f/Lk¸µ¸IÜWŽK!ÿàŒŠ•öjîî5ŸîîížüR˜3Ÿ]›%õYo|ÓØxR¸sffç]_o¬5܇•8þ<üåÿÎŒ#2I„Èïþî÷?ë>zD÷?××}óÒ­?xôhýOùÿø¯°º’q÷³¾~ϼZÿ}Ú)ò}Æ!ròò~òÀÉ{Ïäüôdþ ùßíêûˆÿï“¥Èû‰Â?ä\HöW+«…‚‘®‹z+š×EüpÙ /Õ‹æO­ÎA vU8ìt^–•2ù(„¡ §«ýÊå˨ù¿LæÜyšÎÔ»ÈIß<>jv¨,?éá±('_¢îXëDk0Cÿ?žÂp¤¿"tÍøCùNëÔæLàò÷ʳݽ–Z¹ó½Ñe0ì`²jUI"µ²‚¿Øï‘mu /Xöjjr¯üÿ_™$ˆŸ˜TÓwSØö'5úENúüN§Â"ÙÜ ŸPÜ™¢ 0  –ïjjD9BNÅU£–`RJï|0uÖ?¸–d&Mïô œ¯ǰ)®¢TãDRøþ'”Ê,;?@0»×ªÂïªê½EMl>£ÁÞL½yì¿zyÐ>jmkÇ!Æ‹f@6<Ú4(r$õ³æþîÞ/˜”œWg»Rᾃñ¸¢õ3º[†Ï¿â/ùƒÝX­ª­-OŠf`Ç÷Ú€Ú}2éIW°Ütüo åà'mµ)•X£þùjK•—ËUO~üõׯÁs—ÏÖÊO’¥M'ýAzÓ0ÝÐ)ô7È6Vuµž(µò›úŽ«SÅâwÛí£æv«²ò›Süoõº)þë¯˨@ûM¬Ðk¹åÏm´)uœÝhÄÏÿ >šoPä.­øR…Ã1°0[“û—[Ï#{ÛC>¡£îîÑÛ‡ÈáïcZÈñ æP“õ‡}è’köÞh8Fìàœ¬^C¿ú- ç ðm‚Ù½¤×w¶ûÍeÍn^U3ç–n#‚¡à¢§mÕ«­ú—Ñ…ÛI™÷¶ê´^mïuö€]lf­ãÖ@®x—ÌljÎÜ0-öç‚p¿ü¹•oщ0¿F—ý Î5dã‰ù‰¯ ¶½ìvò{'h3„¯-Cpëø[./ ¬vM)¿ùIœ ýfÓ~ÌŸ’Y=–9³›ð~F3öؽT²©99õ>ù×ÜÎÐÕÊî,ÎÝU“½2öÛøÞ{Zh€3VBfîûfÖíM~ù˜ÙõÛ\À°¹¶„i¢ÑM4yc¾hk…IH¶#¨Ê¢=Ûéj‘2ÜžÆW Ùð·ìní}Æ~zØÑcKí4wvŽ;‡-wÀ*šÌ–ªh¤ï¿fòÕìAÍ,ä@ü]Î^MNèŒl_yµœ?!PLÎt—rÍ iŸ.¶=¦–ÓØð'‰¸ãQ(‰.Ý*Wó§Á¼¾}̛ٻ$œ|%…Vs:›zÎÚ(dW4éš2Bì_mM¡ÄïÔÚÞ—ïÑ™êLÓ3sv4펑Xw ,²Ì]]sIÓ=‰n³Ãª1eÂ3£´ŸºL÷…bx¡æn‰M1Òª[]S}"à“üNUíi­TÈè¨"½ê-ªUOÐoM›E¬·õÙ5ÊgØÂA”Äy’:BG1ÜQºNõï®;vcp7J7t"ÖpÏ;†qŽñ(‡|¨Eæ–å"AIzÚÝ›+":d6[g™Ó|*>±rZé4† T\ðPðÁ²š[C"U¡üÒN×ÏèØÓµóDµôÚ¹³.5§:†g§7 “fHw|[É!ìñ¥‡µ,®j*j$œ{’}\Ëâ/ÕÔ §%šÌ)ìöaÅÈ< ÓUï1Μ+§[µ—ÎûG):+Îüµ‘Nêõjbz¬dI­Bñ3eµùBXB†ú¥ùÏ„yÕß+¦ nÀ $}ö€OÝ3~‘Žœ uý²éõ¥¿I¥»”˜<æî)&¢¤,f]Ž· e³¤àþ»sb±!.÷λNÜŸÂÎ宿j;«@iö/“‰9‰­ã3´¥=˜mD]áU›îUHâæ:fÍ‘ÙêÜKP{B‘“ ¤z’¡u‘þ(z1ôzÓÖ¸5¶bMׇŒêUÈ«+¦Ðº«l•”iÏ~Þ?o×ÙØé$œÚ“’^îÎåWW³ ä昒¹çq¥,Á7ÿÊ%ìå‰^8飔­$'­¦äB“ £ryraº5é½4«=y¹¼]o~ÍÜ,‹µÅT-¿5©ŒÕ4{ñ­dðÄNxù¨5Ô ÿçïÉM)¾øÕè7åÜÿn¬ml<ÀûßÇk>úfÞ¯¯?züèÏûß?â¿å¯¸7¾.–ë_ì¿‚ê£9M4-²ÕØÄÓžp“E§{P%ÿ[A]l– @£REvÃq^ÍìÜT¥Œ3ÿ: |Ùº£²Žp[P0 S©2¹…” ¾û†®cÉýw=lGt=ŠþhË_@pì·ýh†NõȌОu„ÚWêI½ ÍÔÅq[ H§XZ/ÊNù^Z/‡ÔÕ$«âj1‰)øu‚~€`ä2Â>â“n\™6º{vß`]I5[ðp-’Pwrzpªá±Ï‚A²`°:ôëÞ}ÖÞ*Á?Oþ*o"Xn|T6¢j PjÁ]RrÉ'õ—ؾXM>0— $æÿu#]mü´š_yçsN(֫П`ŒP‚s¾R•‡˜LE…à fV‰eÁ#I^(@¨?Šû=¶A`Œ r\í’``ŒsÇ\…ÓvÀ¦‡$ÌÖ™ª ¼æet©Íý¿ÉmÃWEKê:]…p-£¡–>‘"þ²˜ÍàÌFP솳 ú²ÃƒèòË ¦^ÿ Ö¹tùM0švÓÎ0øg„±»ÍsÏÍ3°ŸîõÖ†yx©­õÆÃÆ#Î nØx<‰/3¥õ_¾’òY‹ˆ·i)=Eu‰çDºR ­8Îòesi•ù ki³ÁîR·7 ûqëµÙÝêlØèµ;ûÞ1‚¤$³k3“`é½`wìþ£µY·I>¾Æñô"ÇeÑLI‰&Ñœi؇+ü—hF>”n/aúRbxðš}Þ„N¼ätñ…Ô[¯Ê©z]pzèÃ5²ÂúH­¿Æ\¿Q.ªSIˆ|@[¯z¨Šñjåô×êùJuuõª(o~=ýu­þ÷ó|Eô²4~óiœÖÕyÒk g•S Cñ„V‹¯]kþOéÚ a¢Q~B¾¦NmŸø¶YŠ¥õ‚Y†¥‚Y‚¥…TÃ)‡3K ÒXñ"è vÃqR«ú>{ë?“ÄUåÓ,F#Q SolÝâõ¦ÔÉzç’È®·Ð,F#§Þ4 ×›S'êO"³ÞšÆ`1R Ò™§H;L‰hóW†Ë£ ­½ œ©ü{³ª/»3ŽÃÉÀlƒG­ã=¥ã‹Í:¦ù˜`4øeNYÃ\~×3Z KÞ&r2B„1ÌžßLÅV8ÅáRáì† õ:¨U$ãX ð„_uf¢(ÛŸ‘ùi_êwûp€¤cŽÿØâü&è¢"tÒXêEã"x£_¢dGµn\»¯¸úÙïœ20ÂìÃiØè¢)“¼”¸Êæ‰2]ÍPcî½DW‰SÿY¿þ»Ù…÷;øL #ÇX²a(È/|Üœ1~…º¦ãZŒ¢˜Â…ÔêÓq,A«PzïÈd Ú )<üáhÄoPØ1˜×¨ú):LÊiúŠI¾¬~Få+Cô®75^©Ê+8m<®rˆ·ñ­;¤p<€S„¢ù'‚tO¸ÚŸPnœ’AÂnôßÁAdȱv l#+“ݤu"ÚiNtÈú"ê\al2E67áR°…F¡µ·ÓÚÀ¶º»'|yd9`öæh=SÛׯc÷¬›Al¼Ó¹Ò{ºç¤ßŠÂ@:yò}s{ïp» [ÚŒÃLg{xQ‡4¯“ê–ç]µ¥xçïî8;ž.íS!q3Öõ¥ x;ƒ9Í;5óJÈP¹“1j ag† ïìP÷—CK+hSõ>±ØáLà…q;q°&ÑUG£'ônR&â§îÛܯWOB*ƒƒΡå%¸zRv襻]k9¼/Ø$O¥‡{î}›1É\VÌzñ-)Hß"…ü®Mu+tæÙäúŽBõ³ø¼ºÊ$Jë«WåT‹òZC¯y\Nf;²¸Œ°‹ë¥$:ÏöšÏÛ†ÇiÞbpŸÔv'‡ªè~À=ýî~°Yçµø>à 5õåÉá‹Vs§u¼Y·_>Ú¶™w 4Ï-ßè‚“Éã[Ÿ8±Ðû‘ÆF“ÞoþØÚ4Û²ª ×«ëíWö'·<Ú¥Ò[Ñï¦'Â9ÉÍËÑa¬”± ‹E#?ÊÔËTT¤Xt1èÿUó¤.Ä,%Ÿ=ñs°¥µh³Ñ´?°Ô-Äô~|ÎÂ˪éH†x:E¿ñáÃ;ÎN›ë[„L µ¸ÕÉAÉW¤NöTU·¾s…•%Î.{¥ÄÜ­×>Å<­Šg`2êÈ8+õ•z/˜`äO}1MÑæÅ]â-é %ÞŠïqâ5ðVñ6Œ‹~¤5,öz<{÷% }¸X¡‚¨î Š^&W|¸C®,öUðiˆ×Æ\R|”žCk°8­ŒjåhHm«)ñFçÚãjL£5§= •Å‚íñ4(Þ¼º{üiw§µ£ŠÍ6<kêçÝ“‡/O¤8nœü¢Ÿ©æÁ/êÇ݃šj½::nµÛêðC‘ìíí¶àíîÁöÞË݃çê)äÄ`÷{»û»'@öäŠb»­6’Ûoo¿€GBs¢g»'H÷Ùá±jª£æñÉîö˽æ±:zy|tØnAv€ðÁîÁ³c(§µß:8Ax©Z?Á“j¿hîíai@îÆàh•—ûêi ªÓ|º×bêÐ–í½æî~Mí4÷›Ï±JÇêòS2®’úùE‹^í¹æjn#êÖ(ŸÃc w|b2ÿ¼ÛnÕTóx·ýðìø À~„‡Hó´¶Q¸!JØÏþp@2|~ÙnÙí´š{@¯ÜÄ<š­wÝŽËAìûÒ2$´fœ?5Ú»lEf$bì%‰ô!äðM?&;àËÃHB®ÆÁJÀ£ºNE¬ N,ý*6uIñFzѸ/Á ÞN4¨˜1;Ò5­SðœÙÚŒs¥ýŒ°Ì®8("•@WW´N%(ñN Me°rdzÄô•;&¼ '¨ˆÞZ¸|†¾v”ʨÊ(3 L·vH½¹h5³YªRWkFx[£4ýiAŒ$§dbÄÐÚæÆM˜…SɘT:@÷BGÄ&>mïºz$+Ñ Ö=‹,‹âøt'xàh £ÁV¹P. ÍF­^*t-‚V ;‡»'ÀžccIÌÆÎ¥ƒ¶2˜–ƒ%ã¨oÖ%ÆÓÃÆ¬YÕ“AŸ¾Õ_~â×o?&Cyw¼Oï&Æqà×í“ã]&Oo? ã(î¿ë\ ¢‹­ò÷å‚Å-ì¸_´­EΕ·|8þžîŒÞëtgŒwteÞÑÙ¡š<œ;Ÿ6í9ó#Ì[©%5|‹æ"ûsœ¶èÒQFòZÂ÷[xQì{[O¡/…·c+A䘀ÜŠ”iaò )*$Úf•q(ÙÈ™%cÔÀžŠS[ºHÈI/Õ±N·Î*gÕ¯ÎmYU.¯‰'U•µ«x®ÙÈ5X{®%cLëU.¨°ÄnÌúýJu)=6lÈ£³.Cc†…¯¢ªÚÚ¹%bêlw¤Å@=÷mÀáq¬[ìÝVDƒ`™°¶ù®y„^¯]ÀÎÃå¢ÀE˜·6:SK‡/ýÐ/%Èf}“¼H³©¦K8òøü0eD·M'ÊKŒ®7¨´‚^…œ±³KØÁÐy凢CYÇQʔƽѸŽÊ®ýâs–„+tWWh‘…áDs¦ùäZŽà” Cvšeò$S+mÔ„³Îe ŒNÇ ;ìÖÌ܆P'-«Ýi9V‡?Òì™XvŽ˜õ^Ùœ€õüàDÇ=¼¿¦°Ö|:4gI£I î nhãÔ5ßP&³U½¨ƒi·Ê^æ“pZÕK~“`? ƪ[ëÁYŠÔ<çãƒ5÷ã†ÿñẗóAâëï룵̆Aüƒá<›ÍêTh ÝТ¨N†²h‹Û@ÌÝ÷"ºÁ¸µ5U&¶]¶W_„ K>`„Ý ÇâPt£Ä§[ Ý0[¬Þ²x.£p9ÔV„0ŽF˜›=~øö•q‡j =ò@߸ÃIÃù°±aøßéZýã•î •ÞsL0ïYg<˜ÅÉÍ–‹žâ¼.ÿC•}2e‹}¨µª\)«o¾ùFÕ¥aQxÍ¡ÊÕ²*Z¯uÅ¿PÕj³¯'7¹£ŠØÂí^€ó—<‰&Ý1¿Ïc%<œ@ÌÈL> Ác°øc«PHòÛ4_ÀƒfÒxEDÏN`vúRtR黿Ò÷é2™c?ý©…´êëX½›NÈý´y€à"ò¶ ˜ÇE-’ -6ÊáP_‰}Hòbê™› 1/$¦Fa/M :‚Jª°b›”Yµ{ Hn o—úŠ%!Ÿ5;ýŠ{ße9Ň¥r0f7ïaïúñÔá®ÉÛæ´ÑHæ¶è1pwÏâàémi!­Çj÷2%سD ·%¦ŸÝ2pò>ÎFÍFÚþíE3Ôæé Žâ¥-GK¿cõ¤òÛèMÖ ùϬY§¯¥E›j׫¼'±%oržÛÎAӨװÔH½Ì£üÚË¥çýZRÃËu­XŽk‡šËKºêÀ˜åпßj0è;¦)%ÐÅ ¿r¯ Ký»ÊÓ;¡éñÄWüUmªò«³Jcåô×Õó³êê*ýÀÿ¯¬®”Êêìƒ:ãÃE"ÇêêY“Ý‘d.‰³*}m¤kˆ¥ą̀/¯þêTölõÌ©.ü.­¾/,-‘ÑîêÙú*ÿþ ÿ|Ä(3fâš7VN¾ áê]$ãUHÑX}¢~Ó[Ök”Í43Ù¦ïè/î¬ ì À.ú5‡—<*¨¤\sVïŽ>Ñ œårÏwÛ,¦ì0ìõE ‹5>mª°ß£ÄÂz˰i»k ’ìÐ55àˆ¬„zr-–1ot‰÷½ßÔ××êƒ<²‡ÓŸ×ú¨¨wâF‰%>2æ )xè>Ýxðø›sþNçÜQ¼ ÓúRoZAÕHª'z?GŽ8é÷0]4‹É keŽ/h M†xä¢õ]3Dðb*Îhú}F&š ܾƒÄ«eŠ#$ìŠ%Ó Äܹ (dJ8Æÿ5v÷ÐGJ$K(R7¡ºŠºMFϦ—Û*¬ 4~è¿Û*¯–qLNërXv¾4øªrõ«òƒðjF~¿ ÐË™WÈE(ÒØ òŒ«þ˜czÅ÷È)Ý¥TßÕYædþúÒ)¡„Åê*p+ÂxK¿À>ëi4*,ÑŠE‰×é+œ}V7hîƒÿ-õœýW?¿v¶[šÙõñœíLï'ÎnRÑ“Ä$ç&Þw¦9éßõîÎF8!iÛº‰ø~mÔàkíý T'´¿^ò…vi#nqrx\r¹ŒˆØ”HbÃge˜C¿Iÿ½ÖYšyŠñ*ÌÄ3ù¯\FЖ%„‘ÿæw¿þÆ÷#ÞàjÒˆeS’leâˆÈðÿ>©U3F† x’&gÆö“{3O2‘tæŒó™;ЦU:8fœ£Ü!É:,áåÒwNWwéÁÞ;b޾\£©¾Ê¼3j‹ØªtN¾€ôsò»ÜœÅRFkLÍ-Þê^ÊÎZ.˜Í?ü‚ùèJmñ¶}Íšk‘-í 6F²­ ‡cÏêH Ñ&јõZ8’ó-ìÌF‹ÒÁÙÒ(•:‚ÿå}› é‹”{‚;'*ǃV!BzhK§Kkè¤YG§ˆhÖB?€;ø²3FhÅdÕªÛ¥Í\©<Âr/XnÝ86³ØcR¢¾í ©²%]AÏ…SÊÊvxÿ­hdøNðØŽã¬õ{t–á*,[5ë³¾¨F@ˆe*s (àè mH/ñ+™ 1³œ}8ˆeŸK´¦þ9ƒúG#Á§ÉgÓ0‚Nf°¨'Ü…®Û û­5¤òÉËmNfsàdÖï(y±õæ°cYß®‰åÞ+úqîÀÂ%JT7rfƒP3Yµä›Gèú)‹Üz½·Ýiîímm+”Ú{ƒ=YùK.²˜“gÞäåÁÚ§²é|s%"‡~Zðq>â‹W ¡¦pyaõ7K›¥‡›¥G›¥Ç鄨߀„X眄iQÉ­´f¸ƒS€WW±_”.sØJò lÎÉ>¬¢$Oë†Y£lðœ z¸÷èZàã)Ev{IþF5K(Z=É~­2Åî '×ÁŸù"eø¯eËS¡ˆqø5Ƶ?ÃÁ% 2ˆŸ…9S¼ÔY ‰Ö ­Ð{âÅÈú ÙB‡:¶ üæ-N1žz·œ”W?‡„XÈwL žÀÉ!Û]nâl4èÞHCP½…ÅÌß/û ·*™¯ž.-1æ¨'´V1/ :U Ÿcp” k2¸x£M;ldL„d¨ ‰è 3iðå;©'à”CQ͵ݳç¸ôÞÈB_™‰PIf Ùs:“Jxd]™ÊÙ-ÝzYÆèKýžô¨¸j¨Ê‰†ù£Äed‚WwL´ùŠÜäæ>0œS™Ã˜ääºÈe{FmÑK‰a üíï¶PÏÍUœ$ð ñã_¡ï‡;½ðãsŸ&:úá¼V8-­S”v,QUÞFý†\/mÔ“‚F³ö¤ðq‘ÞF/Ü/Ó½Q;`Ö9em4¯Y{ÌÂòë¡w´„g€EuÝŸê™;Ð-¥¸1b>Qõ©áœ„½Y×Á¸§ÐpÜã„ň2õ;4  5Gk'6Õ3ZÙýŽÝ#ž ÈÑ¿„_¸p8à/$-,÷/’êtºh;‰ÿ/„ï`mT¥TÄõº,Pܨ҆ªTŸœW‘€ yµÀðÁ ÝÆÐ?vNŽùssÇÑë§œÅqã|ì¾3Šº³hw`œÍx¶Ov¶;r˜&ÿ~õ-"Äëï`XQÇà| bØ]¦ü‰F|y6B2.Á»'È:ÎÌ ¸r=ÈOgP/­ó_v°ºpDÅm"Ô„Üɵn'×gÉ.îòå¿7oPü§õG߬?|ŒñŸ6mlü)ÿý!òŸzðjÄú`ÅÍu +tÀúùôõ•º]¦ð@ó*¡²±¶ö°ÿ<ªáÏoðçßñ'ÁĬ?â(‡˜€ò?Ch­€qJvGݽüY0 .nÕs„Sü©¡~ fWP?¢ûÐzëëˆGÄ¢AUèÖÌ/Ë)‡bê °ª|`Õ£m€EÑšnÆ2q N@ò¬1ÛDv(ATFÇ™4®áµÿ BA1v!ç€.Qz‚#°zhÔ=‡mÒÙ…V@G)_®°àHe¡ß©ch«a˜ GîÛ;agâvD¿6zãÇÞ:3(µ³wÒÙ.º×êpòÊ~sûø°~ÐÜoÕ¿¢ï±!9<àfI«‰À9ˆµlAбâ7ºÅн5ÎŽà-Çn Ôå ¸j$ûÑ6;Ñ~L#ˆ7Øg ÚT«°³¨©Ý¤2SlÊšÁ¾;–.‚wåôåèÍ(º¡íIú°\Ú(ãxžcéθí>»cØ€<«CC¡4øqpx‚ç÷›ÙÁ—Þ…]\ÏLÇK¥ë‚pJåJq„%5¦þ2©^Mþy@½)üò`¯ÕnK†vVìí¶OÜz}F/ø Û ¬RÉžÙŠœÒiØš ˆ:tWªcüÖHï@î0è^s €Ž€ 4õ§ø1BU2^ÒUx²ÖXí~w×ZŠ˜GlUœ5GÚá7bŸë‰h¨Ú¯ÌI´Kf£+dLb»s‡í>CIÝ.'!XF7¬Çá8à@/ú=–ÔÃe1Äç·)[!¾oÇk+™é×ÄZ28•òã•‚áͰøwZ> £3ñÄ'Xá  Ã$Yw _¦`qx˜f£$[£yã2ã¸ð‰³ˆfCb£HMR}„O§¸¾vOà:q˜ӿª™·tiKèñ¥àm0˜!N[¿F)—Uä)08h,¢Çç&d‹!eLÝÑø1ƒ Ø*¨ÓÞ ‡ØÒÓp„w;~±5Bà ro¼ƒÀMô`£Þ ô( 2¶¥0]Fx”#sÜnHðFàG<¼bBWÐq€¬0£1Þh#jÕX¤ íþ ”nBBwè9ÇNx!Qk 88© ák »qöéR“‰•ãkœŸe¨ÜD•a2bSêú%VrŒ§µ™žpCPšjw©8¥ &0û1#H™RµƒI(¿lK QëÏ:íÍãÖÎ"#Ãðý–=&©4Ov·¡6îwëƒ2ŠêcKAÏ:G‹‘¸ âi]_ôêj¹/υɺ5|Öl#¨èÞÞ"…ýwõ8»Ò-ø©œGòvžã·“‡^‰Ô–æî«Nû9[iÑfJSø¼šâËÈ«àÀjyÓí³N…ošŸJj­§vCÒ-DÏ—«Y~úbuŽTM$…jz™­áaÍÆpèAv‡b6É&§¿fKÙÉ] _`Û>Üi}‚hâ¶'YX®|›GIº2{tºÞÔf¦Ž…Tãa¼·p|ÄÎi¾ÔÕ@%+Ë;;{‡G-‡ä®“¦\¥ƒÚnóùÁaŠÖV–¤^ÛÔÎtÛ˜ƒè{¿ö+¹f…±Xs”¹¨²Þ{ ÈGjRŽ%¶$ ÃÃÚÐ"b…¥œ<ë뇤J„ô,(ºÎÜnRB{ØÌèu*ÓÈlBî!01: Ý7ÁUh¬qpc0¼›2Ãà 0DåÜ1söºBz¯Ã‘+°…´€xýÝÛ+ €X8ð„áanôÃøæÁ†þÝ ¯º]rÚ‡†n¿hmÿØÁ¶Všm<Œ×Øø5ýygoÿÖ°þ(³å&<|ú_;/÷j*ºøgo6; Ÿ<)°±¿µðk¶É„´ÙÞ âNƒÖö^å;¡ ò“´>š°)/p»€ßs: :ĤŽDQ~oIu´å+þ\—gÍ jÙä¥eD^~oI#äå«!È@¯˜2Y}\ävVe¯ÆŸw`衎¢*>ný÷Ë]¼èžo"¶)ÆyyqØ>ašsÖ¬YIJ5¥ýá+×é2³xSÂMå26_îÝ}"GUºöc¢¦Õë¼,Ev" GM‚`ÓÒgì#ë!ØÂrZÚKîÌÈJ¸Jxpb±Q•aÁ—QaWEe>ECÔ-‚ˆˆ¦€,öцOIS§Y_¢ó6£ô÷Žî£b+­×@ãÿý*O2èìæñsÉ[9Õ2$ŸUší΋ÖÞQqÊžWNÝõ÷›?lýø¼ýÃæw? htJLRD[Œ80 Jû¶Îs«zJdªºðñVéýQsûÇæóV]2t·¹&o wš^c›DÐîp ÅêP(£(ùIì“dc–¹‡&kÏìD>U¨;û™|†Ic!7ãè‰M§c9,GƒX€!%‚·!ŒHìD–Å_˜VâQó¸yrx\s|’Æo®(ü¼i4!Ã-QN‡ õ@*¾*A2Û…_ŽRªƒÈÆqxq\¥\Ê^\dÿz˜|‚ù£[e‹AËai®t$,þéÆžeÖhbý|Ò"Â`ljŸ=ÕÁÛ«EaþN=çèT9½E²@x¾|v÷!¬r:ŠX’]V‡PwrÙ,xŒ/µÆó7GI ²S =¥̈½"vvÛ —‘lV5)kî'k¬R­¨”~ÀF{™’uPéŠI¶OÞD2jv^M'Jׄ¶™Ä>CÇÞ/²Ïð!;µÏÈ6C_ÓÛŒ¼þc·>êço3ôýS·Q.ܵÍP²Üm†ûrmÆ«ê—Üf¨yÛ Lo3Éïÿ‡wÓ?_j—a‚ùƒ›³ËD¼Óx;ŒÑoݱÃ$fYÆC5¸k‡ÉW§Ýw‡™GiñÆ,ïOÞa¸óv˜ÊH6kÎ#ÔTªsw7—ÿòËí0¦Œ¹;Œ›*¹Ã¸jËÅ÷™»vOƒš³ç¸iÊvÃ,gi[ÿàýÇSäæîBnªOÜ‹åù;’›8¹/QÎHã1Qxö 6!&X)‘·Eeµã nTX‘ŽT$g»ò’äŸÉþïî]É.ûB;˜Gö®|ÂîdnNgK¾¦ÝLelgóg¦UcåÔéŽýÍ_E¹W2÷Ü릚½ï½Lï{I¶ò©»ŸW³ßO §Æ³i!ͧ劉óúAoG‹wDöhümÎÞ†þ dæ„™¿Åg¤Õû|ê²ð³÷x4Œ¨ÛûÉœýýµÁ©wø×‰‹Îrê-^w¦·|½á–-³•kê5îòš2Ïßü)SjóOtSÆÆŸH‘½écùú_ûë§ÿ…Ò«"°n£#wð!š O:h±åÜÏÔJžj wÙqtNð2ˆž>ªÿýü|¥†Û.ߦ췟ó ‰ »K>±£©5ƒ…‰>Bª(ÈÖÛ~/<R(¯`Ã+Î}u¾¬’˜8î°/>`ÓÏõ®yš_Jð&PEîàbÕTÚÖ Ãa jiy&gxH–iXa†û+êH,^=«‰PÖúY:¶u||xl­üŒÈuLuÀy5½-DÒè¾í`ê¤îHw•/LGã5 hç§&ì8™ymçf“ž×E\ÉTe²Ëq¦Øq« ¹a£ÊJ£¥´mÀ MÉD.ªÏ2Y¼ Ó€Ê!@ÎÒ!º[À!3ãR.SG–Œâ%#D.(H¦D˜¿èOoú½éµ©0 4ýà¯U&ˆ ð³óø!<Õ8J|ÏK‚ψÀ‰ t ¥nkÆrgwHŒï™YV­·N£ k_©X#¼>ý¯ÖöI‡Bß êFGVåúºè1ð?bªBI÷ ê«»×hW†ˆÎˆò0Åø dèæ’CÛ¬Š64z°QõA?$L÷NŽúƒ>ÆóÖĽ‘ÄΘŸÁÃy¢å@Ë*9çà§{Íë_Šæ— ¥Ošÿí¬¢4X4˜È–)“Ï˜Ûø"jbÝ!žúÜгFʲàY”3Ôbôñ>ÔØÂ(‡}¬&%Š#TúàÜÉ•#ò$‡q¾ZÛn±PPf ®2›ß$4Ó?íôOâB¶pÄj#oçÏSë&¥uÅ„zqŒJ´GÒ«£hT‡¿hÛ<ÄWcB¬™øÆíóÏ߉½ úáž®¡N Dj$74“Bˆþ9Rc›åT-u_àLÍ™äX.¢né8NZ<}°ãôYMy±øÌKçV…ÇdìàÛ1!¸éé u¿ çèNE¯^ÜhÒ‹¸÷äË×ÀWŒ¢„ ö1{º9hbÜÚ&á€ÜÉcs‰m!­•î,žFxý…Žê±ñÿº¯ƒ·}4ïÑ£ÏËÖ¥h€1È Óé«P‡…ËŠËõaA²ú…hlÁb^(Š@ vP"bˆ®Fªª”pAŠ´ìw’ا_œÒ´.o”aQ… Œý‰^äZ®«…zWà`Ñ5•!©„ú&®y°D…e e¤O©v@ãÉä&3„@GKÔU¼`«Px×íÀ›;¾õ)i²>³Ù¦.y Ó&Ù­‚ µs™QAa ÂDW`ÁtÐ/¾ó/Š8#~øËæª'Ówpæ§j~GGÁÒúµ$U*xqªÒ´$Us$WÊ« ÒË@ºÌ˜¾s’K•$¹ÑPúªxŒ^ŠWÍÒ™sçUÜG½r0 £YL‡PÄÏœªvò¦¨gOÔ 1Þ£n9H.¸S(]™¬5`*(DLS8K4‚y G‚}¡ë¥áêõ„_"0 LøEhXG4é1„5×/Ððð^ÝÒ,_xIåv!Äôf íW‡à̤SÊ8iÇ#v:‚QLÏAÿQcÝ=5Ecâ}âxоáÓ$=E—JB$äN¡[ îÀþÀ8VÓ€"ž ÄÓíF3X®)ž"¢A&'+@~{X ä€9IÙ–q+⌯Œ«S” fb`ò’; ›¿Ús‡®àwRîÍåà<‰\M¦3×íjcsâ¤Òó2‡Ë¹ü“nÆ8ˆ² e²O+ éÛþ"jš½iRgËcm¶T‡«A ¹ZÍIKÌÝeù ŽzyW3Þ}Aò‚‘¢KÓr…Ô3I0Š[Mbþe4D7H Qœ¡Ÿ(Ð(‚€"Üê¸óêo;vl(Í85› Ú§´©Vä{÷Ì¡GÂìAe Ó0n@JÓØ‰#AT,Û äerkAws”gä5zÚdñ›îx–`8ï¨O± {ô·<~Xõ‚es*Òq÷G³wÈ•é"îÎt÷Œñ´ÌÎýðý9–¿ò:ÿ.Ìš\Æ„äõ5Á²Q˜—ý)“áy­ú½~ߎº“ î§—îLodaAðI,ÉyíTkÅ3Ow~ùòÂÿ‰…7…­q¾c (_`M#Ê–äεDÈCK£¼öG” /UhRœq=ÁèóDì#öçJé¢\Vm6Oµ`¾_?~µ1F¥ÏEÊcÅs…1³×”[e!¯ZàÁÍ+]×»…Q·ïQkü–1•PìàØèÙÄ^ÈД§/w÷v°jÇp,†óùïu¬¼aSIÝœ9‚+ßIL$r†Ì6<õ3†åÐ5³V1›Y­HOO°‡PÀ„t•¢ Ájh-ó4öÙU^ &,äiĶHή_‡|3hÈî"‚d|™#1»óFÄÌt`F?A /)*‹î›DZy„6Ì Þt§®Œw°ªÈîÌ=!/¸íÙòó[ÁAvÿ¸2…ïÆd]WÔ7ð"$MåS"OĘÓòä¹çΖ'w¶\ÄG_füä–s}“-מnËÜÌÌi¿€YÓyÙniì?`TÏ·%ÍHxª.̽Þ]FZC«}0£À9—ašêÈJ9Ü”Ö%£<¯Á"\9"¢þŠ—íZ•0 ­`8Ÿ@Ë—ƒaÿ*ˆâw‰Ì­š;™“–tó²³ýï}·2;ʇ—|3¹ó»OÿQT×(r½?xú"`×[hú»ó%§¿ÛŸ5ý]BÓßm0OXgö¸;Ûïi]Ú|j4cÃA>Á¶•©ÎFbÌöîE~îò²¨4÷P -Pè}V¡›ýsWáþîþÑËãVç¤õêäw_…Ãþp ‡‡ú4|7ýƒW¡ÝÁ¢Z…nÇ|ÉUèöÁg­B—PÆ*tÌ«0RÇÑ(ì­z–¹°ºžoogèJ³æ´_ž™ÓbܶèÔv©|ÚÔfÉÜØ¨ý9*ÝèÁç$AÖad˜(SêÂkþ‰ÏdæÐô;˜<½H¦ nSÜq„r­\õ{†°ÚØŒD';+ ÕØ›î9B8ºG>DH¯æž²ÔbsÚw‡jö³(»ƒšwà˨ÍâU^Y€ª`Å.@ÚK)«ýçæñAæiK’9h³Ôj׸7d|Ílž“ÙR›z^YéÃìbeù}•ÍÞæžyÉ ]Äž9%ýÞ.Hò¸¤bý–ÃõÄ UPø®;˜Åä–b¬}(ôRý’¼ jóù}½ƒùzÏÍÞÓd€Ìҷפt—¡Ÿ0‡Å.ÙlÇ3—6çä½gƬ£ti1;Õ‘FÂ&GšÜDr ]`eIòzs®^H÷&÷Ë}{3mÂ1¯7m/ÍïMÛë¹½i'ÞœÞt-Ò›6ýâ|Øá¶Oö^îüæHGú"߆ a˼õ@2ƒò krí=( {O‹N àÁ$ z·¢4†Ã@È ù½†j‡dùЇ“ÂL‹á\éV‚ É1ùVÍ&41²µOÉ.Ò‹®ú}}Þ"JEŽdódÛ…ö†»&Ší„Ï™³‹,¶üû*º¦Š›<¹'·ìa®•(ÛB·TlM¥¯Á8ŸÌÁ §]+õt¼¡8|ÙnpúÉ3›¹Ñ• †Ö#è-Å÷³-a|{1¾‘+1ŠÎ•®:’ŽÚç€\ƒ—¡ƒè m&ÖW‰¸‡rF“Ô=ÜEˆ!Ý„Cé"3K´Uÿ/DÜÙjÁœ$®Î"'‰{öû"GϬ]!š;Ðeaë¸õߕӯ£5^QòÁ Ú¨o%«YSs¥1`Ýò x®a¾#›!{Ên" Um{Û–•iàšºôÎÛwœ«Ú$`•ˆõ‘ÝòójŠ˜×‰™tünN’°WÇɬføl/äsÓ/çÿ¼ëãê̦q‡ \ÆŸë rgüßëÿmíÁÃGßl`ü·GëýéÿñÇÄK…qØW¿µwÛÒ­ùJV÷Ë“v¡ÛGÍí[vµÚÛÇ»äé%‰×ì€"à Œc—‰yŒwÞC«!Ô•™q1~kâÈÆ]%%•MBw¨‚·AŸ<Ïj*–(4h&6‰"Ú '1QÂöC©‡Ùôq÷²Ö8zÚ`‹##ú­½hþÔòÛ]õÂèf÷X{(ƒVAiìIÁo*‡NÒ÷Ä p¾õ× Åž1Á-_¶_TN·5ÅñKýžµöÚ-³}øòxžmøËÎóƒ—òº°lÂYÆ0L=Šfi_õ¯@‚I¼›öúQòÕƒzï.»£i"çlԇ̉¬·ñ*^BÆé×7AŸ‚kR,\èËÅÂU+½ªz· >óbvyNN××6ž£" f¯hÕ ¡l©¢–qð(UÄDHpÒ…OqˆÑ‘§˜°ÂHЖè¡Z}˜HûÕ–Z«êà»ëøáÊÉ˵¨)¬å’„ ׎Íw"Ë´ž>8h<Ý ú¯H#°vɶŽû½6 $Û€/g1¾™Åƒ0WÖ‰éTŸ(µº¢ÐâìzfìâVQ µ²*‚úÏú½J5£iTtOw'£ u=–µ¡¾V¦¢5µ½wx‡‰ÖÏ0‰?´wŸo¿ØÛ©Q˸¦òm’8u<Ž-´‰ÓÔÔ_¹!nnHömªbøá«Ÿa‚¿Ú=iíT8W5AŸÿŒiåñe[§Ã.—Ou8÷­Ì™W~×Ô%ƒ3,¦»¸¯òºªÝ:^¸¯ðRd +kzi&Pqu<‰º«é­ÂØu†Á¸Xãâ‰Ò%Öƒz˜ô‡m’N>v~>><Øû~œØ†²¿yôˆ2¥ŠXSé©õ³Ös„ÞLúSh —N*‹…9ôAŒ‰ªTýÿìXŸsôŸÚiEÔƒœ/ˆ.—÷¡Z°œ÷ðH/þßjt2r¢ªʳWWv[9Mï+P:†û9‹0–|ÙÉO-çmΟ*ÿýë_Öêïºõèíäñÿ]{b_ÊÿwmýOùï¥ÿ¯?²ý×ÿôÿýÓÿ÷Oÿß/çÿ{“ôr6Ý28œVêXذÏÃɇµ’®ûÛ½(ú¬ïŠx*Œ¯ƒ‹&0]¦—x\Â0¡¢¬½!®#ü$|ËXõrü£â9((-*x!ôXóÊë*̘]ôà×F“[q–!óªØ‰+ "CX¥ÃL_b•O¢!Ña•;ˆŽÚ§FMIùjꆧÍSÂräÞ;Ô©É%iŒ®f¨‚Õ÷]û3Ô:‚7Ý7|#z MMÄÖõÆ£Æ+nJ/‚{@ŒF!ìûèü´ýõ×5Dœ‡"–ó_ س’Q)²­Ï¶m¦ž„½YWk =G Wm p FýÁÚšúñ¢QÈÖš‘ ´ý „ŽÃƒg»ÏçëÎ’‰¿ÅQbÍ#{ºib°fVáÙ7ß,^'ñUpÉÞU…çÛÿµxœÄwTÁ%ËUÐw%‡?wþñGkŸsY2ºìÒ¦£œkXfn4‚.]ˆR.b¼Œû-¶·ý¸¾¹ˆlM ËY,ty@®pA`@M/RÂZÅeê³¼·$¯ÀFB®;ûüN½ögiGÿÿ‰ÿ ÿHüŸuù×RòÿÆ7Êÿÿ[ñœùó'þÏŸòÿŸòÿ‚ÿ£r¸ßü±õŸòÿÕ§EÂy0èÿ‹‘@Ø X|‚ÓN¼êg”`MfmÒCX«”{Þ„¶@E0Mƒi/aä}Tç›#¶»€uXæF]\õ˶PÁ˜°6l"H5c‘:Y¿XE:D]RWbLHÛ$Žøþ©·€'³îåÖ;`gä´îöh§¹¯¯Ä; )8aÝQÒjs àŽäûÃI²û–ŽÔ6¡¡ãƒ„øÆ‘ ÓvKÞL»ÛÏúN¿ëœ™³ˆö|¿ìD¿aU ð ¯ÕM#*§þ´`WíT²;|²ïðÑþb-\܇Û§?À¶Ê4p㪄mUjzz(=”/Ó)µvæ,WÍN˜•Ô|ÍEbL4P’[ØõE¹L…÷9u¸ÁÓÐM?ç1†äÑFؽM}’³Õ7œIí î™6™3ã$›"žk‘’ãÓÜoì`|–“í½Vó€ê¡*§{ð¢~ø¬Þ~ù„„¶ÄtùÝw-¶D£¥g7°\À _aÆ (svaÀŠB ^#Nœøuú €·]…Sšà8ÑHßÄüÕ  Oõ«>ÂÆl8Æ$¡™ÛV Áiº m˜<ƒõB(gpëŒÎ¿ÓNñkÓ|{v º##øf¬ô»n‡‹€Àá…^d!m¾RõK6æD«ûÒ“6¨RSåø/2¦YªO†0_ÿRöÇI=)ï^$OOÕù9ý³òŸl"½žL«ó;3éø?¨Ù¨ÿÔÌÖÄi3,|36ë+/ ´ä·…â˜%øžçÙÇÞ1×­³×ƒØäB"G—IŒst‹ç›iX'±Sœ¢\ºÇ³Ÿä¨»¬£BM¡ìXŸuf‰Ó<žâµÃ’œäí9ÛŸrÊQÊ4"Ãw*¥GpfÛ¼¾Â#ûBa2Þ€¸q›`ðø‹óØÊÅÒ“ŒÏ@j·é¤u…1ñî(Ÿ€LuÆt¥ô¢Ï‘XÐ5œ†ëÜ]JøÑlÒåSŒG¢xʇc¾Fû1 ×2 Ì ¯Q8Šÿ«ô‘íÓƒðÆ"Ip¤!ê,%È>jY‹ez ·>4]r(8Ö$ÜCp°ƒU«ŠÝÀa¥ôñGaÀ¹þ: kt+¸Ùg—„žÉNéß¹G+OA;Šì\ugÆýcýÁŸöÐþo\ÕÕ¶9Öh@ÔÝ kÐ@1A‹ (1ð¾ï˜ùmWÕúßÿþ¸¾\Sðïø¹þH=›„¡jk ½gxG—î5µ;êòvÿóUpçxMzp²Ú¦ÿê_½ ûÓQe#:׿cMÃ?Z¿¹%Ñ) Âg£AØGMÀØ33D?!Љh’´„Wb(ˆ€ª©ŽšÇ'»Û/÷šÇêèåñÑa»Õ@a¤ãê®âm4#×üIèõ¶¾qÇ€+ €Œz"Dbt¶˜Ý\B¢ÿœô:F¿¶Ý>Bô<¾‰¯ñÐ)×—¹½ùDÇO×V#šK’5EQd*pH‡šOäô_e'Âò‘ÌlëÙŒ1x ÞEBåÂwÝ•dv?¯æ5Ü«0|órÊÀ•õÿ1Fjfë)4X½šCñ¡x9¬åˆ5f™(‰œ‘¨QÇ£¯Œø,qÛÏìãÔ*OO% Õ¡™Ä$d ú(ÕâŽHLÛ¨žV#^ƒTd´3Š ˆ_Î(ÎLÅÜm2Ñ\TìXybîCVŸÀìŽèd¤ç1Ô(ÃÐu‘é«ÈôhJ r¦Ù%MT˜KÆ›ü tŽ ñÒú$ì†À|0Þ1™;§/Æ?#~BŒ‡íŒ¥OéX«³FKüÛëét¼¹ºzssÓ¸ÍÑä öq¢¯~×(ð ¹ØŒ>ú›ú]À·ð[4C‚ÛUÍŒkH| ú5è³Z’Ì%úâg– â¯Ðº‹FSÈ6„ïÍFmÃe¢²„õ5ð¯r¢¸â“°Âé%ysûÇæs “X­‘¹ü©¯×tô S/ ý,í)¤ö-­ã4¸f˦4ÒÓYí ¦ÊUÚ`×’‡¥g‰Ž`ÐvvïìAÁ¤0Î;.lÖš÷7öâŠßÖã,f 9ÁÔ¾L—ŽJH´¯Ç7½×¨¼UjåL!*øÊÙ’Œ‚ÑQu·èø8?CuƒW4õH¯Or-.V" ¢¬H•n0Qo8î7Þ“dvƒ=ž;as<ýäã R©ŸiýcU U •líÎ38+¡JŽÚœ‚–"]§ùòU:Ëi¾ÜËFÀRX<žò¿²Î2÷»g®•y2y2‡„Ò2רZ°³GeÔjàå.ÔÂÂö¹µ¯A2¡7±„q¢ÑdÔ~s§µÓ_;ßCâÓfýó¯K¦":¹OBª V¨uøìüÙÙ{¾wø´¹Ç¿÷šÿø¥s§ÃŸñÅ>ÚÚc ù—{­jÉ(;UÐe­®òMJS ù ’c žâÙU0¡ß¸Mõ68|(îŒÄnB;ö|=´“å¦7ž{'2“ìªO*i÷NÚ/Ÿ7ç%ÐÀˆs’>mîµNZ~šäˆ²[Ù ª¼e89±µ·'Ÿ~o•ÞË,¤ÇúêE´_ÄUB7€Áæ´´ŒI´`ªñ³ž\¤%Öbˆ‚Ã$dn¡™.]q°^½ ýwZGí­Ò`Šª2#Ü·tý Hh¹±_çÙ*—*Tãª*U`h–XRU ËØmí—OÛ'ÉãtCëäå–tˆ3<•U4ꆛ®¸k Í€g,Û]rA{èì 3àe§¹·Ûlg «)‡€“lN2göÂ÷¡ººo@,èÅ@¤¾‹þ ?½e4BGq˜.Zˆ9iö³Òè ¸È-¼xÚl·ð˜Ÿ/8ÁÎ3ò"uÜ@‚Aw6 3ènçx§P qx¡ï<ÅŽêãH™Ý†Ì 쵸G;v6YAEé«m©3pZqG1 [’¹½ †lIQÅÓ$ü%˜lzê§86&Üimï×ÙÉþJ ëT¶lï5Û/8ajæ—Ö ÎãV)gNœ¥ýlw¯õòdw¯­å‹vîÊæqDûÿ7pÒb'F‰kK'-´àF=^£AφôùÖ1Â…n%Ù}„ŽÖ’¡œì·tΫådßg$‚!ØT°cm»cU¿,~,àóþO[E²¦’çãý­"ôí$ÏèÝC¼8’¨}±ïžÈ 6 ÉVyÃϳæGç¿_âÎÞDÃ{M•‚žfºEN›ê jDÞÀOÚÖÍä0,Pà¤2s2<ª–‡àÓš¦è(Û8g:§Ïù؉bç{: CΦËMW9#_nÉL5Uô9EJÏ¡SôM-îd ùç–zå(–“’Æ Da-€ƒÐ´-ÃLÂÐsÇ­½ÃæÎ¼‚÷›ÏwáäÚ:yq¸3¿‚°þwÔý†AF;øòK>ÜÛé4·_ìþÔÊOÄ'§Nû—ý§‡{9Í |ôö/íãÃÓ|JtÁ׈.¡=B>²%!ôêÈôzÆ|¶ÈуƒªÅö„¯Ê  ó¶{¨ó^Tô™°UX%®öÛ?m£°Ê–ÈtcÈ %—«üÁ°^„ɾÍ:ƒžnñ ‡G^ Tn{{«´½Í?Ÿí5ŸÃ9˜ÿ’] ôbŒB­Uaq›ÍbÛtgóÀd°uÕn×ÝSNäþ ½oT þî×ÂI·Ã)v¶ îöµÙè«yÚŠd58ç‡Ó’>í±º€ßâçÈ~©š‚"Qô|©`_ȶgÁ•ûS§ÌhWQ-ÌÓÒ‘Ö Ç04±˜‹ 5Xm˜¤3 ®ú]ZsöÒÝ~èt‡ÇÄ–ãx3Û}͘«/¡üm#héPeÚ&“/úäZÁ?Ð`lîöË££Ãã wTNQ¡že*aÄöì‡î{áÕÀvö›;m#‹$¡ð¥ÐÂ<{u´§b[ @]†7ìÍ3»ˆ§ý©Ü½ o¿c8IÀAVÁè…¿Í"4Ômä(r0ÞËêiÐ}‚øOÒ0xÕ.Ë‚VOS¼‡ 8j®>Þe(w†v®X(ÖLŠà •íлUy«¯žUNO‹¯KggççgÕÕ³³³õÕ«2-D<{q˜í·!]ï`kPõLÌR„ÙI§I²ãr³ËÈ("ÕwhF;D=Eú¼>ÉÎ×K„¨ †lZë–Z6­†:!ÅŽÎãÔÊþWZÕ?¹bPTˆª ‹äwÉÎ(Ÿ•ËøMù¥²¹zÐíöѶ˜ÿìlñ­BŒ‚=xwM˜…QÔÁN+W°m+Xs „¢4=ÙáÍA4 µ™3ª7Å\5xKÁ.LJ²±±.³ #/l?TR°í0¥sUX›v€Öy*¬Œ×-î9 ª$Œ"Ž Ç BÝN0{Gþ‹V‹«ƒ/U›by´â¿á$¯/ùøOc-b¼Þ¤CúP/èð ù&¸M¯a«vÖ·eNNtß<2^WNY܈¯Ï“D¦Äi»U.Ù‡2 /ÙrÞ®ºŽêË~á¾pÍnw6ý&Î ÒF‚¤5ub°6î —s?2³„M ˆ(1YºÉð¶¹'qÌ-‚«¸FCokÉ›é N„¸b©Î0Ô1zC³Ù{r§XÆ•%—; Žxjz•“†O€§Ï2|*Eü²á aµŠYc‰ÿÖuÑ9×q¹ûÐqx…P4åQ]Îð0§lÑH›¹¤jhæó[2Î_·×«rk‹ ìQó‹ÇA"¦¯,*°cvÏ®†÷SuÊ¢YÍéSïI·ÿ¾t×}N¯™&|ážsº&Ñ{m4œÔŸ>NE "Ÿ4=ç]žd•‹]–5¢tÍ–»|ðŠßÓû"À׸upÂmw×I½ž„ø§l,ûÉ›X›Å\ƒœ™Ð1˜÷¼ý}úô!Z&nUᨬsÝ\G¢EF‚ i#¬¸¾‘ÉÙhªÙ¥†ÐoNzV©SÌq1¦´ÝWNý'Nò«ZÁ?ËÊ5ŽÐ“é´ ¢ß9~!á¯) ñº[g?ýêûÆyI;ê4 +Ù¨bƒþÿl÷Õ~kSµÐŠo„¼D[<ݱ=ÐŽ ʪ4{¹d"øcï%ü9uÜhζëphxÞÚùþÓ'lÚ,ÄÔÇNG§Ñþ`<Ò,"džiÐþO7^òWðú¢Êd4œRNg…–’%p§µš"“˜ –|èVŒ´X,×)× Á[^[>HVÍÑ­@Ár"Ç’K[¸ Ò“‡§ êû—ÂÁ:ˆS² ¤ìPƦ+bºßÀkJ»œaš~wÚ …Ó7á­Í‡lé:²úF+ŸÔ¤—Ù¼‰/N›L$¯Cü!•¶81'ž$½|xï Aq ³\…½ïÅ NWå>ßrO¢¹ZF‡© 9n—ÖМ•Zñ¬TY ª¡Tµ–Ü3hvâYPÜS•,Æ=b²ÇãAŠÅðÕÈï¶pa°í*ZЂԖÀ¢ïÌoœ®˜^b \°³³œ:8Dª)¶ çÚ?’-»ÅÑœºÇ(íD.¬¦°Äïüþ7}ß]ʨSV`–†7dur²ŠðþŸQYkùS›N|KKKÙ»5£¦µpø“{F"w<Ú`›x-£°ð@²ÿ&±0°JSZ¨|t MíPßBlRͦ#5ö§èƒ- 4‚/9£ÜHf0tȯwôß;/u —½RÚxßf¯÷z†;,0ÿ’·w“Ët0²ê{Üwcö3µó— žX>¢H5dHàjRñ6­Çô ¥;o‚¸ÁËÆÈH@5}m‰5IªauQKÆ´Ä]³Ž$ X„A#Û1]– ÉÒ[0ˆ¢±+rkzh×§=³FÞÏö²”©:ýˆ”LëtÛ2î\pgÔŽ lñ̽Òa£_ŒcÀu¬×ll诳{éiÌ@!TI¼ˆ'3{‚`#=¹é½!¬n D9ƒ£u—ï£ûddIQÌTpE^£”(ͨÓoÜ3— ­:bùäõþ” °EPGC;$H·Ö4šP¬"84mš˜ÓôåbEノ‹šÓYóºøðA5ÛDl©¬Wq=™O[e›¬lî|èhôùMPݤ©hiëÚ›?¾ŸÆk`¢ÐÜä›;ÿJtîg¹f×µ,žòi¦æœ½ýBõâ¨þò•z_SSÛh¯JK•0€Dø&ÜFë.Œ6ÓCRô/Õöy$àä§Be6BëQ~[U*øÆw]Gó>7A!mÇUJ¼)gZb•2 ¥rÌ£JY¯Ë…;ŽÆdjY&ÓËrÁØU–½e¹ ­!á¥þ©Í÷ȪI._ÖN#2ÞSÔÀöÒמ@áøÅ¥xÎ]ºGGÂÁ|‹ïšK‹ªß~ !’Öá³ÂYéô|½à¼)>ŒæDŒ¬Œ ˜£"ÊV›ª³Â¹#`øºÓªñÔ#ͳ×T+¶>£2þ*ùÅY ²ÑïâÙkíÊG.vôßk|ÉÎÏÅe\ÚX„¢)ë§+rZS@ÑÐFðôX$ÅåKb.ÙüT3µŒ'.¤ -#ïuÿ¢?팀èܱTIÜû®—ãç&³R¬¾ãX7jSÇϦÞÿžqª‡úczAcJû==”næŒ%þ?m°sl€[Æç­ƒðŸÖÒ±aþ¢=qAó+_>׆ˆÓ‰ÅRdÅJ‰xD˜âO£:ˆ¡ç^€¢#«èAü x«8GøF2!÷ Ð¸ 1˜ˆ4‡vÙ˜Tt‘ÂGãYKÈù‰”—¿*+ Ò É€W@]ÕŸ†ïðÓUŸ€†šB¡R*ék®àH‰ÅߨTŠ:þÃö‹¨'°.l‚g;“ÑŒ´®eêX<âþ+œD‚(–ðº3ºäi‹V3!YÙÜ’‚q¨*ñ¬{MJçK¦ý†48ªÚp#)ñfn§Œ´6c6að¦dÆ ]p-˜Ý÷¡Zbô Popê*pàë~«ÝF •½Ãçg;:,!RÃÖÖl­IèŒäÐi¶aÏB‰ÐO³^XþJ±äèLlš€¥ î A*má,‰ÀÙ>Ä1…‰pA\2}–_64„]ÐÚMè„Ý´0»ny§¶rÚúlä]ù"¬)t¥ñ¨’ŸC÷zõÔ×ïTiݪ¿D-“ÕyUmöš14‚‰ÂüÅs†]v!R%Æ9‡Þv¤æè2ÃÔGUx‘QpK©ll§«5´]Å ¥oe7¦³HÞ(qlÆeŽ"ÞðAYÌ Š}ƒìßX©}0ý˜ ÐcÌtíù@lë²XèiÑ&+²?ÂñÌ+M8ÆJ×tÂtvaÝ´º³ q9O ÷‡2‰Ü2h: ¯-JM·@”‹ÃÔ„áñýî;ÝÜèŠE<÷ϵÝyzøªrz,¾x2ß¡à껿¦È¤DôÚØ*žÊœ¾Ì–͈)˜¸^+%°}N+k$àFÃ{9›½•ftn“øð”œË)°qúo /ãà*„Ñ>];W§ÁçBë×5˜»äsBÿésEÎŒk|ºE<(Lü&ÖðJ:±~fÔîDŽß0°/80:ƒX/bFr¾C‹û!nW$Ô{˜¡^Ì®$BÒ0¼B¸†ˆÐ½P8‰Ç@b:? ?êÒ?TÖw¢#©(1v8±o±ÀOi(ŽÄ+u^5+ÃÑò&skx¼yÏx]-˜d>J:í+—µY«}r¼{ð†.¸~\ £Êè ³÷{á(G1…¢è€(Ö\ä:’@8x^Šý}sMËœ™ñW[ÐØe þ¦FN×ϵ¨kçÓü8VõŸ”‘9Ô’7~Å'ŒO¶¦e>™¿˜ÿšò_gçÇT™y²aîåî™ÜôekÓ&剌I£¤uf4ü“Þüf2{œˆh0‘•ª†çjWNg#`†Ñ"*÷ÄÍw“º¨p3½L«–›X¶XtýJKš)êó‰kû¬O!o VÈò@DlšJn;mä¾ô&mèú+Ü:›—ËÇ»+ó‰è !w'‹$ºÜœb ZO¶VÕ…Â-®@nØš?ÃRCÁC¢çÙ]†áìÊ$<¶>*–o sÂWèjÄâq ö¡E‘&F7ñÃ6“Ú$¬5DUä›pŒ*#„£Fîb*2ô ²Áàc3‚,È QM…——!9‚Ü‚Òl¢îÖ„˜Zœ×¦ª2 «X"Î6T·;b¾©4¾¡7êYÏ?[›,¹ÝB ìƳ …¶/$ʇW0…ã-^ÐÞ;½8‹yÛ½~¢õæKAL:.,M”¼|¾¾Ucc‰àèßaäÜþ îño­µ8©®êx5À@hAj¤gI±’Ïžd‡“åJk„‘ÙÈ»øGžêmž^T³|…ák¹É¢ÜÎZÇ]ºÁw9l‡.’މÛ.£ìÌK‚,`¡<|‹|W•Ýù%.žø–Ì/²­oœˆ ¶“ ú{AÌ>ÍÉÜ Ñ¡A™Æbȃc Ĭ>o"ÝË+Â(½'ù‘¿N'Áˆ﫳bI’œéít½¨ÖÕ†ZDI1‘IS¢ZwŠZR`×n‚ìÃ&=šö»d¹aŽžªR)©ªJÒJ<ŒiÀ<à IÒ‚Î'¸×üC×*0F&þ¨ª^Í䑽þÛëMôc=0]Ó­<‚ £ZØ "S$å÷òò²zÚz¾{¼ÕϳoȺÈ:­ƒ$•‚L"w^•å]91³¼ÚŒÅ2„8¬L &¬½ê÷_wgÈ¢ÝöI!ùÍÖs!úRñЉRÇD7ê,gµ|˜“/r2âä~')x“Lp©#â—¡#TÚIù© Ͳ¾ÄÜöb_„Ý?]P§þëùÑ‘¢p8ÙYÅrID %flØo·W÷žKß{V§xeZ©vU¦ä;5&N&ûÌúOCR½‘ J‚“Í4f ÈeˆxCbíPݤ·¹&ˆÁ–x< ¿ {,ZÞ\ßÒé/œQÇ4èé³9R¾GáªU.ýV¦3²ª¢?¹(”0ü<²¢c<êošÕWiáépœ&g‘%ê"ä%&¿¼FÜ83ƒOR¬R8#jsÂc§öùJž/ñà2¡Ï ªy­©+si]á5` í6`Œd×.•Ú6Á„D4~•~(Úñ@-W™, ñRGÇ—L–¦¥†joËÈŽœ¡’WIè(X¡¾– q«¬·Æ2½–Ý^Ë/~}¼oŽ÷ùa€Ê܉eÁ9•bóÄ'ƒ 92+C}è•y–L¨$ à´c9Œ8ý¸KdAV®^t&}¢A‹:¤iªÆÎô›ly˜ W§/Tåd 7Këe_5ê}v _·Í&­A÷QøÆÍtݤ,²h&!¯ì •´¬ÙvèK® þ“ê3´u%ZV¬—ÊhÛ9v%€¤2 ®HÅé,žÁJ*’Ð66[ÙÌEƶîbl%‰òîÒÒ’iie[\©¶¿þ¿8^½’OÏ£Džç‡òå¿‚·ŸëùöÉ7Ø©`àFê›oüϾùÆO‘ø¬+ô3pkÔ½‡’ÙTÇ:•éOÝyiýÔž5Œe å+­WÓÑn6²³TÄ&ð¦õ¢ ‚(G?$d õ¸ãÞ–ƒ©ž°m”‘Ë«¹;ñ¨‰iP$<Θӌ ( ç%0J'Ejv§Ê‘´&Ai]Ÿh±ÃLã;¶õTû‘†:¡-ûù!ã ÆFnw®`ŒX<»¢XÝ×î`Æñ а 6Vä®Á`¸ŽNêÛñÏnQvµµ;n:sûò $·i­Ó9ÃC!‹Fhu6VRg–û"‚á+Uw„Ž_þ¼³sˆ©êîy¤!;›Ç´•UNŸâÁ—ÂóÈÂRËÑõ<#=Yñà»é/Àäå¬n“wöv(uE“a@‚u€‚kêªÛ½ŠBÄ4ƒV’ôÎÃA·C× í† il9“>-½÷Ó¤ÂÎó¿T þ—_ŸŒ‚(³ùCÊ¥*#+.ëA‘ß¼P<–‘Ä-[|<#oŽ­¥Ár}õʰ‘_wXƒ—Zq`÷]ÕÏNæ»s }†Lß-Ô2ýŒB)u¢P|Wõ³ßYèv¢Ìí9En§KÜv Ü–ò8¸àþŸ9mžŸ ´q   ý;™|¢=~þG]„÷v‘Bü†{ExŸ” x“Oþüî‰JÚíÛÃü‰J›j¢ïÝbóËÓ=N,ŒãŒ…á¦M´óØ]ÇÛ"Ÿ™¡óÆÎ §béÃ#lô£C"ncYË×_W9xD:)ó»>p™Ÿc;#Cnj`“ÛÜ´Ç夜Zý¬À‰®IǵHuÉÜ$Ûw¥vÏKr¼ˆžá‚úfù>ú[–œF•÷Ç m4$&ýý¶Aþnªme!U}ÈmmfLY̯u¨ííl‰ÅCS¡r y[¦9—Q ¸Ë~7£† càv»$'1I:•íÆr¥"µÐ¡Åô‹ï¥ýË9Ìi()Ä¥hT¡t¹½Ý`{kÔôno× ÷cfnj.ˆ®“0E„z©amµ‰ýD‚ ’ûQ0„£(T<ŽmH;ÒÂóí”FiX3oÄÝÕl›2öÒŒ_tž⟣½æÉœ0,„ÅdsM/"ü3&À?q ÁdD-ÖNìcŒ<玊zx–¾§J×+ëÖÊrXÀ³)icð¸€Ô.¸`-¸©Gv°Eõ—‘r‘ ->Iò"»x·d\^ýµ´Ú{¢VU+_¯öʱp2)t‚­î>Ûz 97éë^ÿè7+Ž®(c´¬ÜÁ ¤7Œ J}ÿAÄ|ù˜®Í—>¬Á¢c‡i?gท¶ú$cä2G†MñNg§yüóîŸqÚ ø/ÎFŒÅ™MåœB®gÜ“(5¹ÆqÔ»E‹›^0¹élÜ;ç¨xºÓþe¯… q+¾ΦýþÞ<ÏL~°ßÚA£[u:†½þtNҽݣCvyGs’êØQû*ÍOøø¡IÊ?ub?2„Û*‹yz‚ªA‚¢õÇ `*Øì=µósóø›3)è‡ Œü‹tŠn»ê°­^e–e»$£¤.]ެp@/ØÒ‘ ¸›¶îÃùm¸„yQ ‰£Ãmº›¼é{‡þ ×[E­h8¸”ó–‚ ¤®ë‡ê¢? &ýE©ó(-Dÿ1qýé¼bÔúZãá9_®ÐôhÂáIR9EuÁ¹F½™°0Ù a©0^~0¦¡Û±IÊå%Ùéø_ž#2P+3––ÕS¸Ðø=¢iò×D%±v ЕІB¨ÛŸô{!Ò¸¸Õñx^!åõ`ðÁÜhðÇÓ[L¦±¡ð‚=Vj}Õìëú°C/R €¤›Fa ¯Ÿ&8d†%önái¥°ÄŒÍU/£¨‚ÚÕ÷õ~ýÉGàÛ–‹vujòbSÆu ~±>KÕ£tê¬PïÝ‚(ÔïâSýçA-щ¶€b¦ òÒ}Ë[B;Û‹„mÇÛO´Þ÷‰¨Vú;”]DÙþ-p2‘Ÿñ[À½‚Š˜5ÐÁ„”hÞ`#eÑø(º¢í‘¡8ÍxÙÖMM̤½ ¯KÏ[G*§iFOi¾q÷rgvô²5†2áDÞ »²ÄŒ›@­ñ…)ƒ]O¢!æw¥xºFt"¼Y ¦!3[ã87ØÞ/Ú6ä/p æÄáâM½ìÏ]|ak^¯Èh\öçr0¾Ï{Ù#:„hãq2Ÿ[ zÌ<‹¦³¬ Ýðµ^yK/ÏJ¸#÷á¶U@IRèŒE»´pÑd–Ysók÷4:üèêrX¿Ç×ãæ>n*§ä´tW‹dòîdýYX2 v›OUš;NðODÔ(èen3P¨M‘1ö£í2ÒuùÊ·ß*}ËÍÜòô(SØ«TÕ{%\vãÉGÏÞÃu'˜^½‹ìÎÝÉ6™Ø=È žGFêÔ<&0óVLà›[‘;ò.Púqó`o÷©Oan‘Yæ•s× â rÇnmÁ±s7,MÝ-†›UµÆêâmü²Eeo‡þf¸à¶ä,²¬=i!6-ên¦Q¹;F¢ =¿I]Ÿ¬Õ}kœwys¹G)èÿ—ØK0_ö"pE-7óÄÉ݃ӑfp6¤íÈõÆééÚúƹÑïP0á0ÛÙˆݽ­réfP7ªôþfð¯þÑ‘©¬=E4Í•…¨oa_¼€•ªZ–ŸêQã‚uË¥0Î>ÇþŽ(p7cpX¥ñ º%A[#Nˆ•¨¡!è7p8‘ëìƒÐ«w{ÌÂY’älvŸ,’Ãô µC>]·p(à5xú½~øý~sû°ý Ã\ïþ‚nË“æñóÖI²¯}¬Ñ`âH.ásmåoWêÜ [ùÀ¯äùôôïëä8¿t¿ñÙ¸ƒV½³1u:–%3äô´ÖXˆê=Ç‹ø"uMDDvw,[Ò®¹B£o4®«ä•å’'X— βÎ.%OXÉ.Š“bÂx«L½—-n•XGMF­)ïÀN¯K¢䂟\=bSsŠùw‰5ȵ£«ð}fÛ7ÙâU«kІ!"¿O,CÍèQ[aÕ4%*M47³¥³¸•²“À¹ˆ}›è÷tÀÏÊâHŒZ»ÊXŠHnîàD4›°¦ƒeBך]Í¡;VO嚣)¬Ší‘À‰ŠÃÐż&ï º5UZ¯²4ê¤Ä˜¯x<ë°óÕ‰ŒC§ãÍ/+a| „öðŒ˜†‰û°Âœå‘=œ2(&HG·¥òÞËp!å×¾ô– ®È°xÔG‡³âÅyçbÑ,æŒìùߞѴ…7'õ|L¼¢õçˆE’ù Å[ÂÁÖQ¶Cž¥ÒÙÏ‘UnÍ­=¡:•;H§æ’P±:¬ú3žÚæ”®)ïC'ŒY5 ÷nYÇ*trÑa$^bÎÔHpr"ÍIK9ÌÞè¾Ýxæ"¾Àü™´òa\Á4 Œâiãwš½ ;E ]ÜÍ!9+ÓyÜI)ÜDƒ‹(–û Xq[ÞTHv°»4¹ýųTÃUG•²z åõ³‡aDcu¦£TÂ/3â|cYGó9ê·³Ò—ãêY)ŽäŠ4ø£Jé½­äòÑb²¼ß¥ÚpW½ëðe.TÿùнÈ;[²ï?üú¡ó¡¬¾²vw#üwðÊßÖÎröµÿÏÓ^h¬²{ª~ÑÎúòàΖzîlªwš¿¾º”·ÀJ¨ú›0wÆ“þ[8NàUe8ÁÈŽ@,ïQ;¥Áõa€1Ò‘mñ'Î*—Ò˜ZùŸZ_ÿgzóÎ©Š¦­¨ã´[¯»öXhŠŒ£Œ‹¨Šîˆ|ýÃ>yÍÝW•{ Ìаº×GT×@ û£þ0CYY¥[(ƒž%(©d9p 64_ZØ3 ;¨ÈøC<Ÿâæ×ÈêA¶bµ:‹'¨KÚĴÖÀµîí‘9–裬JÞ.Q× BëÙ¨//±ê˜F1 èÂ\C—û¨Á&=7¡à¨ ¹’)›ñ¸!–Ý– Bg4é±ß¿h‚þ;5@°±Ñ, íöÔÂÏÄìaªÉ{ýKŠí;u†]IadàÆ8 Зƒ PKîäh2‹sQûA ë¿ëˆ|4ÜȘ%w[n¸>Šä¢˜*&á¦è|ÑÊW™ÝF±þSsÏ…6®œ¦²t ª±¶ËwWÀ†SàPˆQ=p*¬luwHBÏÐQ¹Í°†«5´QïQ¿°úëšü¢›xñ¬rú«:_9«ª•ÒêÙúªþ<Æ…òÇó²¿pç4fëuo6«ú £œcË–Ý 7Ò†,p( ™öªDËŠ¯ÉñÑšýêñÃ:Þ§³`/.¬½~/5É…Ä­öbuÏ9}-ÒÚW~™_ö5¿ücà1(}Ô¡ò½ ¿5ñdÈãÝFÁ@oÖ<ÎsLºÏÙLF¯´t°­œî?l¿¨óGò4YX¡àų&ôÖ§ÍíÛ{Íö‹¹xûÏpv]#N3ãv_Rxß_lˆû ›ñ¾ zâQ̇ñØË…ËNŒy„HŽÓ~w6@-]g¡Æã5£±%D‰^· ¨·‰+Š/¼3X4©d(H‰Œ–¼<vXnª (1®ª¸•q›ÀÖ~#«™±¬ýžÄáÁ7[å³?æ¿rŠ#Ô¬îøÌi4fi—vžWN¯y‹bØ2Á‰%©ã—%¿¾ìƒ ŒVJÇ,Z)"$4ërè)q¸Ç,\×q«ýrï¤rÊï5ä=å$‚ñÓÉÒ) ‡ø##8¾¢MÄÈ9A4…öËçÏ[m2ÍzO(9s`eJïŸ6“H3„@íÿƒ×½)2]ßĦ#È“U¶`zæ<<јÂN_'{y‹Fƒ+`å®a?‡8çø¶‡´ƒ61rA8 Eg/AËÐ'Þb:³d°ë§ Ì]ŸˆhmÂÔ /;EºS½fmz[EèÜøO²|<¬§H2µøxø X€k&Q4E¯öÅ\•Sý³µ;Ð5G‚žX9­×qíÖ%Åßnþ°µ³{üÃæw?° Ý&’(áŒ@e#}êK˜5`ÚEUä¨Ï2åXW§ÀêÜçƒDµÁ¿Ø±äÑ!iÙ(‡wSFâ Ÿî©úað‚$º}ÐÞ’NšçRŽpÔT!ïm£6ë£ècj¹ÙïÆ« æ)@†“è÷ig$c7gÌK¾zç,ÑlâLXq/¿•(o`ú0áEÙ:h>ÝC;Œí3Pæ|iÎI++—¿5Ñ7ꃨûF­©µ×ëǨB©§ÒBê iQ³A|ª2$„Ó‹I¼A™k> ¡©3tïMxÀÄÑB"´íd¼§‹˜‚Äkc½^‰#"ðW$/‹©ûí§)ÚÓ817Wö2’ É>§2)=ú#·' ñÄRR%L[¼cî½ûÛãn4oÏû"î­Ôy|ÐoyB~G7ádÜ53ôœ=â_³/äi:¾„ß°çvÿ°Ù¬ÔA4ÕP]UVxa¢JAÀÐQiÄýéL¢Y²Ðã„‘MÚ_qƒr&²Ç ÏñeÕ‹°òMm65Ìü2ŠÎBˆèá‘wK—0ºñ²»¾5 @tW8»Þ"˜Úhü­±VSáU7Vë º…0KŸà¦BãB.ZZZÓ=ï ƒž|~Š£ŒUüÇI©ØÆey“ë?:VÙ}†Æ$v]Cl ¨à÷°ÕÀB‘^3’UÝíGýß<&eSfj—û¢Ôì²Ï$gDIžP íÝhl¬ã­£Ï¶A2>ËQ ‚ñÝ F¾´`† ×§ÖVä'õA]M±ÐÉöòZ¡óRóÉqù±Û p<¯°ÇIn³6ž;^ŽwRæÙ}XÓ§;?Và\–ɺ>6!ºoâ­,å“ч»ê5ïz¹™€9ʺ8mjp# Ñ®4kꔢw > †ìjo“ò³Ã«¿;™}Lè9ˆöºÖ3ŠMÛ$¥—Ô4Lêg¤'C|XB2 NXÊ_TÓV?P(?щÒ &`Ú¡x+¤+L¾/Q óK 1ù¦/<‚§r:‡¹ƒÌj™Ð¡¥S(² YÍã©ím?z –/ßšsd²ï ¹ev¨Œ=…‹ø(æÆd}D.O› îägï×jëgÕæ_KÉáV›°c•ÝLê ÄÏWtOŸ56U*Û_SÙJ©6ËdÆQ!s>®ñYñŒã{mÊÝ–— ãÉgäUK¥è¤.&P:(™v¢cQ¬ Ý¡~ÝÎJ߃øêHÐyÙA¨ ”M[5žàõ˜‡JV­'†ó̰Èú¸'àåÂ_Ñ|„I§½/ôüa;$ñSSjà 08€VM8BÈŒ„;#±'ša”9òc€¶fÌÃ-úp” å»±ÐÈ„«ôÇÀyÚ(x§©¯H*hó^&Ê-ÉOa•þX¬.áS ÿ›D.µ¢œÜÙŸ–ÎKî0iýˆxô&²ñGÏÜ{ëïí÷Ǿu|b—!ôk WÇ>‚½nîí6Û>¶sr_R™ÛÕ‘NåàˆÓþ‚B@†ãöï&ÌÙù½{¹Ì}ßkÖ¾ëç•¥1È`CÎÜãSز™ß³úÇHg.gôÀ éƒË݇k>´\ña×LpU‡kzktž™XÓ*c¡ ~™*ÆFøÂ³Ô~óUg¯uPXÎ7‡öSfÞo7v·›{‡m‰ÒµÌ^=8·‡Á»þp6Tƒpt2*:§$²2@ëi'—ûäf#lÇ¿‘µoHà9·$w™"Cõ·ÖÄ—€½g¶šO·wlL:õšƒÿ0îEqïŸWã±èéž’b3ÖøÎŒÁÀ0ô4:ÎÆèU3Þ€aHÄÞ,do‰‰Ù‘BRHU°¼iiÂðb7ÖÖÖÔÅ-†m$Gž˜ÜwЗ•=Tgúò®7#”D?æÐˆUm(ÕÂ]Vz!ÿ’ÖK–ݵú±÷Ë•6Ý l–c@ÂØô2«Êìç­õ¿ýí “[ßø‘ X/(b0Öje ü½ÍLŸ¾õ ¼2z1›ôÜž•€ˆ²—õŒO“Æwdä2ìO5[½kÒ4$Ÿ Õ‹†ïÖ9®¾Žæ:†(ÞOÆQø6œÌix}ý‰ÓºîíjŒ€ÿahnðG7¼êvÝiôsô÷w«(—Øöâ,BÅ;:a`—càî}þÑI{¼ u‹¹S!ù΀ýÅí¼VW$…>"#hrCëfÿ ;‰=Iu`£ -BBËåxë„X< b´®IfDKÃÍ *)gÏ"¿ÿŽŠÄ›f„ë¾%r3-× ~ÇÜ7s])átFq•ucUEèB÷ò¸ÙáÜxôøMU7c—ã’Õàû´«¢Áüx6šnwrò®G&T„ˆX +Kwå` Ýmä<Ü?á€?„ÃæßÖÿ¾¡* *œ¬nü¸úê¨:o`jw& ÉoÊŽú~ÿà„¹Æ”|6Õ Bå~’BQSg´8‡á0šÜÞ§¼`Ø¿ ¢Ø-²‰¯Û2½7ÜN9šU †jÓ 6Œm§ HA7¡íZ.ðúÖ!¬Ï}êk5΢eÅ_“à ¶÷¡"j‹ø9 §òË×N/s”=_/˜D3´ ùýàoŸ¶wj; @0q¡ÿg÷ål‚|$·üZñª*ÞúrKv‹^»éQÓRب¼½.$P1ß1úÂ}KHäÉ)ÅOÙd?zôàñÒ2Œ©q4Ö‚8€^Š] 6[Qfí‘np®ö/à%sÆö5p›‰6{H|Tg«êáëOμ¢¼vf ñêþ;3þ?‡êÍïÍ`ÃA¶ÝÇëÒ|Õì K¬Åiª>>´¾:o_ûûãÇksjÅÎì ݵä®g`‡íÕ;W„GøÒÞ™4Ô ØÏUëÍ››¡ŽP¿ ›%³±XÅ!Ì4ÂðÙQ¿k7I¶‘lìxª0yé!ÈHG|d:0£:¼íAšu¬ÿÉdöøaCíêÝXï¹h|Š÷^´!»ÅǨq`èjV2tH4†Å Û›æ,ÏÐK™¬y îÎʹ2Æã{ÈTò—.µ<Ë‹ÁO¡ê¿¡xÖÍé„×®=ÎÊúJ5w÷Ï3Þ—Ë)ÏÚ-·ak×ÖœL·1ä@´nôèícú¯66f7zö½a°õšìbÐ3 vµN»«ØÂÕîe£·ŠWDaÊ!ÎM)„Š‹ð#:çëâ#WŽW+§§Kêü|uµ¼ Kz°ñÍã¿¥:kn'½®\Aã™@‹.êj^Ë2é»qšµx¦ŽÑ\2ÛBݳüLFèôí²ÚG9Âþ0DÁt Ë颅2¼ÜVüŽA$afØ×ŠU…Ôú‚*à¸ðyë“€t _‹§šuµ¡¨‡ >Vߨ¿=aËrÛ·rÖ*ÙßÎOIÙÓ›‹RäW¼UzOë¥÷:ô7=’!^|ýñ£©öî¥wZÐ:>6Ú‘–kÜ(â+‹«Ô]†TâØIW4}q¸—ZR º(µ&’“˜nH1fEv¨Œî±›k¼èyÏõ}õ:½ÕJ³Ì®)z‹–fÈä›é‰ú˜´NƒÙ®óRÑëßð$ïñ ¶º¡öŸ:#ŽPr7ãbñôä쫯ÕúëÏb”LÑÁ‚ŽœŒ BÓNK’³i,L´w4X2^Õ¦*6V8X•®©SOS& 8ý«†Ä Vƒ…ƒË}—Í‘sûë¯)Þ¡êÒõ/ßÂÜ‚ø »LÇAÄ>õbD7i‰63Ôá`4)Ö娺;5AIèˆG'*/Šm"’I<ÏâI¯s1zà¥ntaÇ9;uÕÁ¥r`nbÍ­v6…„ùABÏã˜ðâÍV'Z7ð½˜$4cwkòMRc.Ò©¤ÎìK(ò2Jq.>^´š;­ãÎÎ޳탻#Xº©=#OþÍë .»£Æ5ÇlçÿC¢Ýƒí½—;-sËàR÷ê`BkÿoZvkÈ}Êî³úÉñËVMùÏõŸë/ÛۇǭÌë6uÔéŸ5÷ÚíãÃv»Î7D»Ï¿ˆÁF"ô§ß𬫝o=87íe‹ñcc¹³d6«FmÒ¥ËÃs½,¯p0áyf´µö„ŸGQgRà$ÜZ×oÐXÞmp6}«ìR(¤beÈÅ ãÖfÍé2âåJÙõä,, ˆ¿„‰×EchÛ 4ó§æv^ØtßÊ ú®° Ûlÿ²à|Ч½~„Ÿ0?ÐRÇ'{;ç{‡O›{8ì,~áBÜÙã·KK^ê¡eï0÷Ξ“7;·—DçÎNºFI¨Êºæ«+x°¸õ¿¥ÃŽ›q¯ù_:‡ÇƒÃŸµÛœ§m$(8¾·G‡¾ÅE´´¶©¡VV±oPMbN}‚_Ò­qÒKßét¶õ¦÷,‰9D¼t–ˆW©Ý|JÉ”.-§R­|jÉ”>µü|kNìÔƒù™ž ¸^ë—oû±ðí­ë~¯’½ ÚÍy!ÃHå`uR#õ€A×Ùò&G#vXq=¼•Ý3aûçé ô¹¤Óy~ðr»ÓÁ³K¥R1[[ê]’êWû»ÐÞŽú?T É$þ_q¤£Ú.Uª@7˜‚XÒkØéT*¶}•¢œÇ‹Õjõ‰é /³‰±ópO}GãO‘ `… ›¶To€š;UY«¹‹ïCr”ªOXÇ£˜£¡}‹ËÓXt©*H•ÏŠï­Å{¥7Àhô±V¤jBíµ×‹OаÕ'nô=A˜ÒP¬(¦Ø±$“Ô,K~âX°#M' qº öæ’>ÁÀÌê @H€dܤ'8ð„réÂÃg@î|®Ê“ÂÇs'ÎQÚÅ Kßê'}Ÿî:œón¥±ª?¡€rOT5ËØÈÍ®òžÁ«bÞ•Ì{«ey——ª*9ª•w©~†ï©ï2M>¼[ÏN64›úÆËu¾@´çëÿÒöÆÿ‘GAV,Ú„H /WQ\s_g‰"þ%k"Çýe‹¯,^`V ÷^oY™À{ßÁI7÷c‡ÙM+ª€t.ÄÉhÄ}ƒ¾Ih„žmišK ÆtèÀ±©#« ‚©×±8Jú×.|í6¾y°‘¼~ó ܃÷nx^Þ½^þs7Ï–œ¢#AŠÞw•dü^§ì¼¯‚«?‚á‡ì…3Šìt»MÅa<>Ï«XF¥êÌyšÑ”ÛAïÓú^¸¥ì,Šl}žNn±Ix¿…Wß&ô5ã1Ÿ=cˆ1Òä÷ñJ¯?ƒÈÜGøk¦£ã–OÀ$S×mK¤‚JÍßiÆOµtc% 72îõvå4¾舄KÆËLŠt¾Û38{8ž>‰<"9ÃJ¹N•²3Ä‹’èõ„TøKN0©¾O2~Ë­tˆfW(“,ç6íÈì?øC›ÐNSçϹXÕäõ/þ‹ÿ÷:;Ýewq|¯=§²$WNòešRfŸ÷¿ñÚBÏß­Xú‡Tè7׆L ¶Ž´¼ü²Øú8ІÙo;×$zÒ¡S[çš´â&sÑäVõ÷¸W,æG2½Ð)”\Ÿ‘îÍ€QSu4´6„Ù¯ƒˆ™ˆ7g^Y»O± ø—QkðÑïcBEIŠÙaEµf`&Q—§{“,ðyn¥V¾Ø-©¬ý¿Â³$“7Ör^çeEY9ˆÕU½©Ù8^N&ÿºâþ£’JÍrÀ™L6§s9!v2³wïî–²>©×µ¼’Ýùî×;àPäu†Äp^©Ê®¢’·" *×^ÑLé’™ìiþ’fT#æР£¨š%Ýedш½ù²àBEKgÜUÝgùòë“?jy®µ:‡õúöHiåð’õDÓó0¶¦?žw›S‡9ó6›ft©g|¼}icv1ÎÇÜÒrW\ª|Ñv'*wk¼½cŠÊ:¼| w¢GÛmœ¶;‡ ]1ø„jJz9 Rï’ÀXÈþ-[0 £YLöhcc*fn~“›Œ†,~«Î#ã Äw}eÈ´šF>ÔÛÛXï$X½Û¦»C„|ªô•))Û ±/L½¥í±¡F— Ïïà¹s€NÌN‰)„ν‹p°ñN*†oz}û•j=ï‘D|û‰Ž‡Ùž‡Ð@vÕB‚Ø^)þéa8ßÃðOçÀ´s ;™æ:&þ‡œó&?EƒøOx ~ªS`¢Cç{¦;?ñ&ËC0™Äx &KN§Ìó›Y”‹f:Î0nÄìëÕ@£ˆÌá÷ݹÿŸïz¶l,/háÛÐïÞI¼ŠúÎ= ‡4¬ÜB;tm;¤Þó2Rc¹@oNëÓ¨~Ö- cb¼¼|w?$ÚàuÇ™Ñ÷2îìy£¥ýJ¹šKIçÐ>š¡¿f57’Q23'-÷«{cd&ˆéW47³ÃeîE““ˆæÖª/Vz8 { Ƈޮ©k uaT€ï‹áv<ÌaÐ$Ó•`©ËŸÌwÕ¶u­¦Ã!)jÜ‘ÝEà^Í_œ6×] º?‚ùÞŸv(Pubv,«g¡üÒt 4Ø’#ÆÐÉW4À—¶#iQ±Ž„ºX;uÔâ¸# HWS©Œ˜E14,ì-T¯QØ ã˜—ef½@"B¯4-+y˜s‰þóì³_$X9úm`­üèÏÄÒƒ‘ ÛÙÇrv“Ð&áÃ’”“:WÛz~ÜB˜mB«„šnú¢}JíXúNÌÂ[Ú8Y¹-IK{ ¢É?ý˜<9>¨VAÑažˆ³Ó­ô*\ÔäëôªÞ /fWE€—97ãlÄ'ÆbZä¿¥h}b¢ùl÷Õ~KÕq®¡¢”“0°)HM3¡mFð â‘GQϺ¥Ü…јёž"%݆wúF3»oÚÎ…gºa ÃÁDƒÓžáâ–—4ç‚K£8ê š#ȶDJíK¡5ú™}ˆE³V,jtë¨yÜêì¿”ý¾þ¶UŽ?lUNO›õõŸožU?œ­¸JT •gõêI$ dˆ¹Ì\ ë9Ž®„Ñ¥¨iŠ¡BÐ$ºè”¦9«¹{­\-âËR¢¯]ó¡d±Üú•³'®U4n™$ÿÅ[ñI‘æà)n6ŒøtÁªyÙ”ùæ #õƒF:Ñ ´)ì7¨w'ú&›ªôa6ÊbUú’—âÒz¬„sd˜² é÷é"¹Á«,a6aÖ_èj½ nµ¿‰½7Ñd £èb6ø.ú¬X_Ù †ª‡ŒsÆøÉ=hÆÇ¢ÃŸ0sÌB\ø4š0 J´bÛ¸†›'‡ÇXBñu }Y¾©©[f³¢HºæHU°C“¤×´Æ ž†cH:!ÿg2ƒ_&©ái¥ ¦ v_\ɵÑòt8îdµ¿R~X…¨ÛZ¥5` _uÔ(c)˃2Õ£ØQÅ&ð5–”sªÄ^~<‡ŒÈ¥‚ Ð8Â7;*»13½À Y©ÎqVB;`:ÁÛ‡Œ5Ðì©Sß›èM„^Ek‘†Ômü“ìåYäZ\}¢ŠÈœŠ« ûK¿\IQË{¿ Ìtóú>5[ðê‚£UwDYC7á\Nð|•ŒÉ*¤P<ò&QÉù¨æ–~¥»Û¯EfÅ¥déKT±h¡‚Ãp×rÏ¡Z”ý \xÚz¾{ Þ·q;楞ѯÕg£â“ä”ù/#R=ŸÈ…¢#À‹µ'2Âx[Û‡Ïȵ¹¯¾Sìöܯ׫âÙ‡v)%úˆêXV‹˜ÇF±ê9ò—-üâ~²¥ýµöûÈzÉ÷n¼©Š­$ÔÒÍï66:.‡_Y‡¿I[n½î$+¸ñßS<–A E÷J|Iéô”?œŸCõ½ÄÞG¬ô:f#– ké?–™+5þÑØbF\˜L"m° ´X•A` s{sµÅ«´QvñU…¢ð7î'ËÜosÑø<²o}XÍ”}^{<§;ðÏOØÈàýÁÞFûèµVjç’*®"‡&T6û-^W%ŒÈŸ¢ÄìÐ §l7ðù©Œ±^ð±\@pýº_OÂwSŽ]†B*@J!+Ô lýøÚÀsÒsî8ÜÇ”ÆØ¸÷aLÙ~4êLoÇ ˜…öË`q˜Žm:Ô º«zƒ;:«(AÌ -LµËþ;S¨Q£Æ—]qFžÅèa',ŒrKýp~¢þÐ(›\{öƒ=qªÓ#:­)†—IáåÔ\–X8Z·S9<€ Þê÷µÝóÞîÓãæñ/}Wù2'u­Ô‚.­œVfs¿€7±é83AÿÝÚ½Þ§hœä©JJ2 ‚9š­òkA~E¹a„ý+ŒÛ@À5ÈlÓS°\’9Xš„‡–XçŽ&¯%,xv c¢tªF€‘ÆüdtìÄLv_©äår±TœÐ£ø2ƒl1n´Þ†0=ÿ üÿ©\»#q—ÁÜŠ•²…~;=}Xÿûùù—í½ä<%[orЛŒi˦;zëï²e Žuw<óï ±YƒëÝæcƶ»ïàqÏÞox¯Q.1Ò;ÞOÜ8¢ÄŠÒålŒÝºÑøû£Æ»ôô`=½!0Â6rúr±‰¢1ÜIz¬D Nk¨ È|ÔÉ Ä{ŒV¬#Ëaè—¿R2e¡WŠÖHÁê*…Z]Ë‹qiDD*aËrM_ØÒ¥40ϾÉaH1Ã(ëmI¼ јЛãQ0†Óky±s`Ž(àуÆZ£àÇút6K¥`?D¹ þ4NO×Öa#÷ž+NP¿÷ß±!\‡ è ”Ò˜ÿ¦Z&Ç'&C ÷ã<”G öEÔ à…¾xÂÔâž%¸éB(,Á¡­Ã`Ú<Ç´Û¬¬/„~Y½$@¬]øgdIÄ&0Ô0^„ˆRËà”úâŒîåô» ²\¨×±wë°ë¼CmÅo'‰´î’“HÛ´AúüégvEÇÁŸ9¤©ÍZZAs?ÑÔ7O‰j͹ŒÒ YC*gÍÔ8tÓÄ i;J×M¬Ü„†2,uÃ5 ¸L ÖÒPöNKâ¢?½é÷`VUl`¿=~XåbHFtÐYíŽpž±ÙlŠŠÜ¨)v†<'‡”'–F/„ Ÿ¾Ñ«”oÂàMY½ oÑÆöÓH¦h³<ëì6wö~áé’díšèJšl¢l™ý©¯ŽîG.ýÇOoõÄ'fÀEˆ–‚¬œ”´ÛAÕM¤`Ä!‘ ÈšJ!̸™1„ l¶‚$ÄîífB©úwÞô*8»6¹ó»Ãó»VÂßP¯Ž¬mà \¡!Ñ0j=ôâ|°;ék4E´‘ˆfšÃQØèîã†:ÒØ¢D½_º4»¯k1„ÊwPÙà67¹œÑýÌå £Éó8AÛk°ÅU‘ÿO''™Xj$Kÿh'Ë¡ëP£w€d˜®Cõª7wØÑcCë±L´0Túa«XÂŒÞÿ›l*èòØy±¨Š¨&róþ»¤ÉKÍQ' ð† äçïp´š¶•ðÉ Uˆ`’w¦ü·5b#àß±T:˶ ^›§ÅK(;ý•ÐÉ•‘¡ŒøÒÂ[ŠÛÜ‘WxwN¬¨’ŸÓm#iJ1»:ER0Œ¨”@.“!û£¡Ì{4æ?°ð˜Õ{ëv€;–]b%Õ~/®õ9ò]‹’%ÿQ/K‚£#ýV+ÎðÞÀ¬ÕÌ%Ç+ŽS);íùÅ'/ BùìÃpÌUø¼£ÒíÙ%Ê·A{6º2™–dOõ8ªÎ[²™Ý6wEõ4Ë3‹ÝY݉•çbd­Â>QÎQ¬dëoEC*T'h£ŸêŽg,òQÌwµyF›ëü× Äñµµot€!)@úëö%š“(4åhîŠ–Ë ¤j<ÀHû5’îë ×aáàç^ g³xÓFM$—NÔü5 ÿ1I•zyøøooªwÖ¡ÑçN—,«m>µ•ÞË—“øœ›ØR|¤0j ^¡H/º— ^`²×pV.±ÛÒêŠS²kž@QÊÛzM 5è´FëìÂZ‹œ•Ëñ_~m¬ÐÝÛ¯«çç+gÕ3K¶ô—³õ¿`" ‰Îª¦’«Ù ‚T1úpa›´v—ˆwdæ,>Q÷΃«—à ÖyÑ•S&8ý åÜyäÿ]b«ÎU¤S±q¯zúðÑïrqáÝQüÖÇýwG÷³ŒÝ´U<#£¢MŠÙS„ž•˜=2»3®¦Rs®p)kâ÷Õúº}@]Û¤Á/²îy-ùÌkϬ¼Ü˞“&Nƒ"ÛÔšh[²Te`ï§ÜºÊÇéuE?34&«†"'U•㢚`³Â² ZGògœºÆ1ŠCß¡RæmFpÃ4ʪ7›!y/º‰i¼œËíéÇÓÓ5ãæÍlLÏ··k¥n·ƒºUQ1ìXÍXBîæÈP¶eÁ;{{>+4ºTáYV]m40ä ªô’bV![öºHÅÖkSͳ¾xýo-ÑH~]"ËXvì©w‰Û6X"ßg%C ûOø~æL„b»–"y>k±ë5ü#sY&¡64Âh¦,’½ëcýN'5òbZP””F¼ÓA¶d$øú]^Ç «_¡[œ÷Œ>$“ ¸—(Y QÔìÿ¬ôýsýT.äI@`0È…ù@Cúÿ±÷åiIßï¿âSô"eÐaÙIäU6I6tû[GwOσ$;ή•X‚™¾»ººººêW4JÔ–~ÿÌvF5Ñ›ÖäãQú]aƒ˜z€DL·<¢) ‚×NH—Œ'‰§ÐK® ЋmóѶw \)¼•©$ôŸœTÏÎV*hUì¡-Á°ÇƸ"'ª© z)í•f©+Àu¬‘“×€¬RðMŒ¹J8ÎðÅë` LÅ"´i¼û B¨™Ä4ƒÆáWcG×3ç0‰ÁÍšÊÑõ½g2ùUžv†ÐØÔ@°/˜ˆÉåN_³ê} #ÍŠ½ÖÏuŲÍ1gë¨O83·mc-†ãC+R+Í"æÀÒ” =ž¿µÔØmÉÇði«ð¬`UCÜUeðŠîx±H\˜eÉ(N¿XMØÞmC;°é˜ÐÒ$¯¼P…ó]õ±ðÇ·}¾]Ôv8º±¼Gu¤Q*¤FÀ^€qŠ••ºÈc³¿¡`pE2È„Æ4?ßüá;ù VØ]¼®=G,e €+ºxC’ó^ë—÷³:k¢´‘`Zм¹¤>œÂ»VðwqЧ$«ò{­òï³³ÓÓÒæ±rÊœâWØ“ oÃk(Îу¶ÃuCî€ev~À 4®o>Aì¾PJ] ; à¥7ÞD`6žìâЕöõ+1vŸ„ÔE`̵w¾Žì-pèz°\W:+ˆgyTûcm“²¡ýô…„DÒ•ŠüC•呼5uÌ‘{3m–bÁ.ïÒ¶iD`ø¿¤»>Ľ×Ra¬s„âÌ@†'lŽSxvÒ©ü^‚C#'"2-Ê®ƒ9«ûT ã£p.}NÉ7µ:{µfZ(?6]N"aV¦Žó ­Ž¤ú&‡e x![Ex¦ã‘ôÔð1¬\0xͧ ÂpOî°*Švõ¢*ò‡Ò¨šãy¼oÏ«u’/%ìš_tøøKôSd$ø“’”„TcO7”ĵ‡*ao¦är¹(PPjA3“dgxxéõå1.š„ï‘ÐUv[Š l™ú_^ 1厡9 BÅ{—ÖÈw»·4^©:9Œh’*%¸ì†¾™”h¤ÍJιÔcÑRš®4ú ×ö/ Ú0CûRxKk±ºö ú–¨Þ2'QªíñôLŸaüœó·‰g¸»Ÿß´&ŒŽoS4i…pzò'PVàÝ‹ÉÍŸbÿý—ЭÎR“âö<Û>÷»¸ªºžuá{}^V‡¿ï‚¸`ž£± ;cÌ3VØÈ’L?û6C£}+ K- +†·<ÿAßE”PMÜ2 ㎓‹ažÝóÿ°XbÈ2úÙÖÛxº·¦‘z¢úDvóädý1YUåaw Gêà…Ž–x&:QR“åV–t6­³4ÓEšQ¢µlø'\Ýí";¾dÍÈ¢1Õí‡ìsÒÛÄVFÌ”ÃØŒµ‘@E²ëÊ(?ËÞOUÊŒ¥Q?®5ùè@?Í^hªóI¼¾uò‰U¨ŸÉÉç ò„\‚Ô O7ªkÕµH"x2»ý’,f5ŸMÖÇ|]˜ÎG„«"‘«HYÇîqQÂøËÌiXyóò°òê Š¾XfG§eá÷Ýk8ûM˜c.èù0@“‘'Ož”ßÄõ’lI¨õª å,§O±R<†&sb5ð»Žh¶IñÀ¹8õºunAr÷&`{è þøOóÿKÈeQu^ƒÇM<®ÞH¤5Q<Ü)ó­ÏNs·”ÉÐj–@7Uòr OPÞÂOñä ±;’JÄ“¼‘DD+ø…qû²+“B„´û yaáÈf=¡ÃÅas ='´ì2’×üsýY2ž"X¦QÏ|xÂ©éØ”-¦,úÛ¸¼æ6Þ:k3¶ê`ƒ1?ÑŠØ*WWHé_;ãÎ%ã³6·™2*×?,çá·ÈX® ðT¼~îœ>5¾Š¼¡±ˆ6 Ÿ ¬ §³õx½rîŒÙU†\ú0\<'_„Ä«€gA%ûtU ë/º’§Xl¹ªŠ§çFø[¼pÈ_tÙO7Ì>”¦wxhÍT lÔ"$‹’eé½.ôãÜgÃt)dI–)Â_B²ªz<ÓŽsZ™ùYœ #ñ[¦öTEs‰&ñãM—I—Jîæ·×«æˆ¿,Ó;\üÓß0aÒ½Ö-3 »žëtã"ûà ¿'Õ."n«Nã!óýO³γ•E…ï¹;Ik;×Õ×鸅‰ro) ­NDZcrŽCÔ„9AD(´aÆB§Ø0€Q`ŽÃÙ÷8 ž£}’ ¬…ºJØÂÕòw–­¶]œLtzêŠ ÁI† ª}òá|ÔcÓ¯iƒ¢l*MÃ2›‰Ÿc¥¢šúvo;+ Q(òR~·ŒwØRñ ƲõÝ>›¯žÁﯲÜýmæ+Ã¹Ìæ§³à€ê¡’É%ø~—Î#ܘî­kû¸}ôj_ªSý\ke ª)©03*mrz8zzýߒ£ÓVÄyùb…pò®û[§ÑPrÑ€éDî§ /žæ’ã¦g^4§ù¼ €pÏíÆîN³Å(ÏÍÚþ‹6ì!rÿÉYI¬:©µ iñD—$63P¨lÂÖJ)…Ìõ`1y6HrJªËr,Ìø]zö˜Säix›Î\¹19+}ZñK3[ðWãÙ‹¢Ñ¥ó4cÚ’V‰0Ô %db½ËlYsk 'çJãÀ²ˆ‚`.ìôÅ{3θFaŒ›Fa°_xY« ’ª@h>ž¬éN…ñ %lIÇö(01ŽÝ*t%¹‚3:;æu8Îe+¼e_Tވʕ"°_W §‚§3»v×õ¬àâXöQIUO7ÊT¸ÄR"|_j¾ê¦5ÖhzÃEð]h^Š þtÔKœß2*0yMR˜•À¡F_(RôÙa§?颧¿B„6°ùÌ›hõìqg%(ÈPÚö‰{ÖÖ[‚C]ùU,VÄ{Á÷EŸln{EòwƒÂžQ4ßoBëòeqz²t¶^*=þ;Õ·Ð_í#‚ŸÃG%i»‹éVu*øô± þmeØâg¡öŸ­üz² Ζ/¯;Ö?­tŸù+'›å…34“ƒÏ['¿n-/ARþ ‰…|•_?2pî1öDátXðßÛYú¼Pæ’1hy¾EW±£žŠ¦ ›ô†J³Öu|Ò³ÅôO.0’Nªe  †~Û{'ìa(š{,¿üá;žýW"Œ-4×’Â’€;÷Üw¶ UØñ`méð¯>3›Xr{*,”œ»7(uIáʬAÊ*ˆSÎØs¼¼$ Ý0*]¥"‡ Â](Ëpbhee¡JrL²«b}åärJ[áñˆ@瓵Ž5A² rÑT(Ánhù¾—¤´dñ잢–öç\z/% xXT2ÐGSàš™VŠ]F:ãm\ôÊVÞ§U‹Egbß?om“Ù]¿×ŽNE\DžóÆ8 ÙzµÛ Ÿ·ÛI¸êUbtêOjÇ1‡˜;0ÅÜÔQ,ZU8J—¢Öw_µ}ú  µûžg(8†öµïúO¿0àÚùÏ^÷%Œe B½ÿm˜`ÿÇì Žýõ»0zÆ„ši­R¦ç\¤sÀ ·ÐiÓ¢%ÁßEþmFþøÖ¼ÚÏ«æ4 ¦i´^?!'½+}˜Åáúë e!ÉÉï=Æ)ÖHke=8ŠöSÂ" ?tÀ·ï‚ B>áðÁ¡"†Jý6€±î@s$æï×h¡¬¿ÚZ*²+‹ž¿`ÒH ÆhÚ•§©/ÎÎj=•¥bñ; ¹¥÷‹WK%Î\m™Uf.]½,íé"V]%TÒ!c`ð& €ÊÜ4ÿÎvwp¹« o‚³HFÿ—ÌÞ/ó:ÞÏp»§û»ºÜ³Ãý½s¦ŒxŠsNÔ3‡9Oï1îðwCþ}ß/àé_þ.vN¡fúEš`" y×ûÎ`Ô÷|xž¶¢Å ÔÉEÜcqãìy] Ï“vÏ¥n ¾^|1mÆ`ö….é?úV#„ÂÖAo×Ó G7Ú2ˆ&¥·t©îÏ“ÄíqçŽ`D3‡9j¤BÀÌaó”T/ „JÌ[ÿ à Ðßêfä X†iÊ• ²§§¬Œü¡SÊi9ÛF¦Tõ½ÚŒ¤^}§üRFwš SÜofúdoLJÝ$ Ü' ~6š—÷‰hm”wˆ‘Ü4?yf†u«NçÕ»iqbd‹´¢±qÈÈ@Ê︫ëúó“+²“C¤‚k¨?À™øÕ~ãͲZéË“ëõÚqÿäýí/±³eäÅS–GD¯Lµ)B•PKGëf- 0-ÂŒ¦ŸÒ½°Xø´¶à9Û…7ØÝÇ£žtª9>Üe¼:ºI©Œ-ïÂsp !5R.¿ÅNÁdè[‰êÿˆÄ÷Io'ã$9ë^" }î”c‘¾ŒK}´ÓzÕ<.ž,…Óž•rÄB†12ò’´FIa’r ¹É'T£n»çzm‚plåÉ5e)Ôv±dˆùéQ®§½”þcYµwÞìÔ1J÷nã¨ì6š;Gì*cކ?ÌéF 6â½´çHá* ÝÇ •é 9Ó‹ÉRuœ;¥TžtRU5`¯b míN&è Oqlr)ËeËA8œ~ÇsFcŒbÓ÷Ñ‚OÏn“h¨€àôœÐšÅ &(g,Ñþ‚ŠÁdxëÁŽˆºJbˆ¼#G0Á˜Ôæ*(ROzíˆí¯+âhOtåoù5©eWV‚>óánˆ%2*2Ò­b=<6 Eær*h}‘¢Â§=¾]SVh?«dâ6!›æ+÷0è 寖ªY”h-r6ÕÅ>œ€8]íZtøàáfE6#|´ªÚ²í¤€ç ¯Ybâ2¢‡ÿÏäB%——%†J³´çjÈ´(^¹S肚ñ°dô>šÙàV*¯8i…C›© b´FÔÅJ ±AYV´¤¬%$ØCÞðƒý"°LÒ¶`vœÛMŠøAóDš8Ùe.ŽìCeÊW’@B‘]6D±0IKï¢t Tí0ƒçúAè)wh—å7Lj –ÄŠ±oE²¡ý¸ÆŽSÔμÒÇÀgñ1w£=— >¾dNÓFˆ25eÈ»NäAâ—hÁ¦ÛŽéã%zŒ…ª<´½ãÅ“›v=ë‘€²[cЦ׋Åê‹j¶ðÙºªªÎ¦s„Ô‡™z<(Z… ¸–XEX>»>{5†,©|_›kqBB›f®§7T%pE+€{J« /ÂQóEÞhJ¾,ì4ãÄ{Ac0Þ*{žEÛ¬ÜY°$\ž“±tèqîõ0N"qÁ8´ì__Ú´(V:n™É_|ÆÉN§Œ4%:¸hDÆ;.›š<$Ì“CU¤oÂXÁ4ñ!Ô€m{ 3d/ž« u%lÊ¡wnF}§ã$ïý(ÀɃFuE¬¶Ë³Ò"ù&`¶í_€Ó4Ø„zç(‡"¾"8Àッ¦”Z‹ø¹/+©?"Ú¡HÅ„ˆªâ¤—Ëd a÷bèü1C¼ÅƒÀöÎî«ýâIRÍz°Ñ–^Ü­½ƒ–g¥î°¯Žõ—;õŸû/Š'8ÒKkÐÕá¼ô[Ä Þ«½€N×÷¶¡t>ôë'xì?99=]YF¸ñÏMü|¶Lv×I%lYB–ð@} }ÍkC¾=Wæ²pZ–å’wR¡¹8øí3Æn c6æ`$Ú¯w'ƒÁ-‚.ú@%ã1ELŰ!ÈZ†cj]-*ûL­Ã*å?dlæj¯Úµf£Ö"Ÿ«ø¾-’÷ómV‡Ôû•µêÁp_E±3Ðö¹Ïí&% ¤ƒ”J ÀÔB£“T²K'VT>ý§k÷&CC>¡:P2I”•–ÞÀd*59µ‚\ŒìÛôµ”3í%I* m…«27¨Ä¶eiŠq‹ù&ßUÀÿ!âàÑÆ POšÛ¡ÁW¯À¡é|*‡Ðcc¿¹Ã ~äs°!EâXÃó£ÿ{Õ8b'?ôïk×ëZ4ßÕkûûz­Ù~yÐ:ž‘äù«T@iÍÖδ·†}O-D+¬öóZý§V³ÖzÉ ±-µ£í×ã—Åàe•~WÉõµVûåNó°Ý:>"QV†P׉N Ï”ºvŸá=ŽF±+~üÇæR5¸5tÜüáGíybjÕ±dØÐ)RŸqGGŠ2¹ùxèÊæÍáÚêw§«ÌE¥$Ø‹NGTÈ«‚Y+dð M½€3´oHĉ¢<ûûuÊ{ g*þ cIF‹;¶ÉA U|èðÏQÉä«¡ù–£e’‚*ð¯úºE–*=‰ŸÏÐß}R‡ñÌU8b„òa'ÄîgºtO\^Ì5΢¢G8‘fÒ˜v´“uԡͬil]ÙN²±S¾ÿ$'º€?¤¿ œÂSÏÍàà!+Åɭߌõ¬åGñlœ…®ŠW„ÈJEÞ”CQI¬Ñ©oŒŽ™èˆMúyôÏ…e*Ù?ÒÙk[T®ª:ûs”‚ù­CÔˆ¾ÊÁ1˜_Š®mLXå'Æô6$›àZª\±ùñ?‚ !áÄ2”HN=1Ÿïnðتö ¿Eé'eue%ÁTš°3åÐ'€©Â¾$öÈ$6çUâôXÍð1 ‘ÿ›é‚s†Äc\2ÕÎÑÑÁQñ1pÏǹë¹rÓlv)µŒRŠjÃtàÂm½zÞ:ñjeg ¸+šÛúVå8¸Pjkºr©1Q4„?ãˆà‡Î{,qñ†hWŠ$RÝõÔªV–>T„^‡ÎrÈ+ÑÓD™€ÓJA•Y#qÐâ‰Ó3¯yh΃…¡·£xjPÆb*;ðÄ.'ò.Ñ1^ºHÛ)«5yŠxËÛ—”÷¦‰Œ¦¹qÅqãÂG 9ØjàÐk¡yPÛN=ÌÁVŠŽIˆ "•ët€X„¥_©ˆÃƒ£ã½†«à7>é!ä}mp!fSÌlЈ¤‰%53Œª;"} é6¨(÷ü?¨­¡èÓ$Is×ûÝ6' (|~’ôb«Pñ 0x棥¤„<±KÆœÌ<ÊVyTò< ³œ|(y^[ãȇl¸ } ZqÅ+ÁÔc *]È%˜ËeŠp¶ü[ìÜÀ‚kРž¥Î£&έ e/pfyÐÁcÈñ7£ÎT†Ð &¿tݯx©Ž`ýÞiÐÂÝ Á±`£Í‹R(¬Ã1¯9qý±Ñ-­¼àR2¤å1VZˆûmGV^ CA5 оÝn'ÜN],fNlˆJjÏúæ|Œú!V×Öo{“aiÔBŒ+ºèuFvcUÅ&]ñ)B2®ðä¼\ò:еuq3£T¯ÛðúSU¼Â­œ¢–ÐÜ}‚IhM¼%ØÕ¦åafjÉE•fmùÔFH\ßò¡»oHž¬ä)TÆ ¦¡F2¥Ä"^MÑHGR¯º·süò`;õ^^Hr£k4ãÿVÞ¯ØÃ^Û,šGoJœ¡FÇ1`c8«ö–vü±Óñ£K#Ö¾YwàÉšI o–¾„·êËØìË’°“.¡=ü2|Ÿ› Vr±újpkJÑ[©à( ¨âñ±ÙîØte¬C´ºòÓ£¾5ÆØAòÖM¢A„m4gUxY@ ÏNù†­^ê¥Sm¤>*Å,L5”rx×íL’¥ŽÎŒÿgÏÂX`V*edù~^P1ØêP­øVÝà %Åq+iद—ò25žß‚<Ë H¶¯/ô(‡qÉ{rB¬ggᜦT®’è 0µe›bod¤_)í£·¿ò4ŒŠÜ¡°oPE†v0X'6¥Ñë=zEÍ* Ê‰-†è¯ºûÃ¥ ß ž-§Á³¡”kiMd !ÝG.3ÀÓ2ÉtÝÄçäûF¼„‰ªæâÒª…çò| MªZ¥mû¹-ÝjçÈâw¨ìÉìºÌ¹Ûiî ô=ªméÏ2 ó½æÙYë¹(Ê»*–?Œ† Ç“©ŽýEWa•fbÊ`±²'2º tª¾r6ï‚€æÍ×Û한.{¥ø—6̾£Óp8g(í|ÇËVýËì#ñëÍwOµ9¦3À¥ùžm7›é=6LùЄÏ&܉çHïx…cw]ôÜ+¥ý‘ô«d z(Ñóbƒî?áó“e!ð ´h'.é 0…ÝÉ`T`4é |m³xÅ5—iµâÕ.â›)°6ÖGK7æÐ=‰ÆWäûÎQ2À§¤jÝä{ˆ9˜gô)jQüdÛ#iE`Y“Ñ£;ì(ÚÁÃhAÕyZOã #õG¶³\q÷´X]¦¡a°šMKÿü0²+–7¨\#|~nVžn”¦u3ÀíL7ÄàÜ»H€šNUѲmy€®æîÔCÙþê2špõíX7áeéŸé 'Ò—)‘C³³ÀÔ(‰ó¨‰$µ¤˜MPì2f|_î&z/‘…o#B¡Û#PÄCý©Æ-˜ ¨Ð›ö¸à+ÕÚ¹ äɦÖV÷} ÚéÛÄ—'£jè²`æwa” dk>èm¥Gè€nIç §þÒ?»61£‘uEh¼-„êŽÌqhHKìŒá¤A,änP]~›žÙ…ËDz­1ä²Ó‡«®G£ŽeêõŒp_YgÍïÒòÏ ÚJøQI„vl^³Á­Rx‹±‡#O;rbä§“ìǦ¿°Ù'¢b<)Qì(ý³(Nš{ w”þîï2¥ž”!Û²8¬UŽ­º ¼§UúS8ËÜ=òHö¯»L½ç¤ÈÖɯ§ÕèÌ„O–öÆÚi¸í'„ÖY‡:yk §ˆ¨Àþh2e½ h´u+>œV-E>´GN¿ ‡š±-PX‰¶ÚP±‰|ïÿ¨x $ƒE–– s…¡X!¹pÜRbøŽpðŽR<ô†x£”=c¹”'CŽnvñXúÙk•è¢8š1È×{ïxwŸzMï‚Oа˜$²ðîYô*Ps÷¡}íúOöäd;ýD7€Œ |Ø÷ƒÃO «2;U$ƒ/Þ,ñé!>‡@³)OJ*êXöÖÐWÙ³˜`Xsäz”‘ùª‹â¥ ð„!n>ƒÊAìErŠŸåµ|0sOM–2¥IÜØñJsH–2—oÿ6±‡ãÒ”ã›f …‡.”¦—(Q5VÒ}—Ÿ§qFkò3ŰHµÛD]škJF;d2$+…ƒ’yéhÕ¬¨24 1Æã¢ïžoåPµØº¸îèÁÐÕ?ù%²ÉÓ-4.É€M'\—ÇQRkã_ºp”Q!‚š¦ªq„ˆ¶KÅt5}ágÕΟwêÝm{§·{ñâò¥ÓøÏ¿ÞýÔoö†ûîÁèð·ÿóŽüÖøxòêêçë×7onùýßF¬„¼¿rZ¬VOK+þéÊÉÉéÈÕúïų• i“i^ßÓè"èC„Ö—’V@.qº–Ò§Ò¸£Jö„úûßEb™Ê¼2âk‘”6äq»ÇnZúªHi®VH]b ~‚c¯ÙýPMOeòëHtÛ2½òÓª@JÕ! H÷8rfñúòžàÎF¨3TánRMl_kPÿUë+ÀømŸé­°¿—É[ÁÏ[Û¼¹ØkU”½Y_" #šG¢ßÂþ^¿…˜‘ÄÌšDq8(vcx«»¿gZÝ¢Íáþži‡?Ý¢±¶ƒÜßÛ‚ì†äpл<Þ[1ç–á`†KŠÆÉÂcÕÐÕ²ñ@ y%!Ò-ì¸=Œ Ù‡ÓjKá¬ÖƉöÆÐî½pz =à/“ιÀoºÆëä,öɆ:ë>FýHѸ€ßD —ùaÜ^y!Ù FU™¾$p¦7i ™jÝ®«* ’zí·ªL¯è®“¬²“Ô“ˆyYùTøÖ­¿‰¥€Ð6Ø’±*c¹üó¼p.†ç‚i޽ÉÓ‚M Qéþ1ØîðV /®¬¾R axsƒV è}è™ Çû¯šeÁ—:Pü ¨||ˆ—¸ö`4¾UŽ· 'Å{ó‚ô&A":G[,”´Äp°2tIw‡.‡‘TAåÚqAYO«i«<'ªUyØ*¤zäŒ2Ye.,›IØ>³!{O™sˆGÑb ì^ȪF¨0oÉVZ¬ãGn9~Š5nqȵLˆe‚ËH¯x”ç÷FÕ\9Ûvdz*Ü©hQùÀÉÞñm‘ò” #'ÝÂKÿ`6á£sú®¾ŽG¿1G¿"ö®áWä-¿ÔOdï›Íã©)n¥Ú½$aÉËwÒàÌèËÐýȶYj1+3øP²€1âp„^)¶¼(¶.Z°IÞ𖺼a”é¶Ÿ˜Þ/êFy6^öˆt›KÍÆþÎþÁ&ùzIË—Ó<ñ÷Z ĸV«öb§ÝAjw»¤ ɉó@-º6 [V“ö|ð,©´ -Úß§§§ùP_ ߌñq†Vb‰ÙóÑV›C†Q—¬l˜<¥­¡jм0¹ |VJvnPégõ«Ë¡©/DJ™¢ÍÕ^Kñ*-÷… —#®'Àg¹žðâ1¤ó$ד„D÷t=áS]Oôë}bëeíhg»ÙxÞÞ=:Ø#|ø2'j³ˆp¡è/Á"îíÎí8(í¹ÉéÉXw*eõ:&wô¾&‰¯·›MÜœÒ-"õ0h=†Ñ#`Fò "x"ª4)~AìÜɬ$†™cÜ0-“Å¢_»†KØÜÈO´·zFùº0³][Jé$ ±&A¢t¬‘E$M1"a‰ËËÛ5?Z€ZG´3¿U׃ÕNï¶‚ÑN:ãЭí”!ëè:öÃêž$¨=O¹¾[am8¸ôq '©•E›L²©â@ʲE£%t­¹ í å°:qZêYå2Cz"’%f¶)瘖>Mù,‰_+Q=L W‹xì7vwZÇ$HN3ÍF†eÿNH:]É.¢Ážêò14| ¡×F°·¸4s*K+&Ì󸙄±¢)zï…&1™&aEÝÀ4qïoOvͳT<½éCPMÓ˜’)ç5v£(l…*x´¸'“ eÈj’øò=HצwÔ€IŽ ïéæáòÀ.I­þ$„†Œc!ªl ä$tH»·• £¢ & ™ª£æ>³ì ¾h¿±Ýü¢d ül8Y¢ ÆZ–†úìÛ@výhªSƃ(?#[g,7ÔʰãUÌÛjÍy¡ÍÅÁuY´פԢ1é—õ¥Ò\ÇScu_¦È/á ´CmÞé e) @¯áámpšàÙJGºÒ¥«ƒÏÓ}p­ÂE^è,~ÿ }t|Ü(ž×^6piöQ *nGÊJ±¡tN*äãŸkGóAÞÛ t¨=t ‚ì Ù£ÖBi+7ˆi´Óiëƒ$7¯´sðÜ5DåBªô†nE¦)„„Æ»”/Œh''ÂÓspxÜ8ØçM_·D+©oTãð½F‘#ËCv±¿§P8)W°Æøþ#Šô{D›À{c«ßæ:Ûä ³–S›]Å[C[…RP.|ˆs‰®…cbÔ]ôìkáö»rû#Ç<ÄGA{ˆÍzÕ±ç¦*Äk‚Tñ  ÖP¦øçßþ&ž•Îx¥†Dtúp ‚f lvŽRô™¯ M†¡^ø†Ÿ¶ ''ÏëÛ0q@gg,ìîF8lt-"”Þ[£BcðÂü TDjzÊ…Mj«€¢S»Vù·Uùí†äG6:-QEÛ¤[CQѪ"¢šèlGl8Üúc¶ ÆšIçad®AîÖñk]Â¥²WVÛÚñë»f4ïŸ ¥‡1°BDkè¸1tÊèK £^bšÿ3™V†fÂí##pÊHdŒKTëÊ€0=Q{ÄØØF+ŠV±»ß:~¥“ð–H¾ž×6znJ`´ýW°¾%Î*˜X^úl!ºtˆ¨¥^ h¾òs NJÃ¥‰ÑÁBИÀ+®\&C¿lØI¼@À¾ŒþеÆV°†\éòKÄÙËØms¢­<.18,á)Ž( Q]–pËK+§kpÉS}µîÐ*yæ¹ ,2²âÇž5ô¥[3^]ÞLF²Pº±Ú¸Eõ¦}éºï¶ò‰õÚ¤¢í6…ÇE[„"W"U­8]{&›†åQxŒi ñþ4ºvš/‹â•ëtÑlõc9V*’¸)—ïfÏdä€ü)-0.J}º…Â&ø¸I^Ÿm&cƒäÎʈFÇjÑx¦€Ø½&É@MeÁXÍ5âq6ô—0bÀBêGÍ]T¦‘Œ" þÒ‚ÊAß=¥1 ‰TZ™F¢˜nN߯–×N?DöFcÈ.*©Y£”Â(¼Óc\˜ST¡ZjR'C4n踞Â¥Yw€ÏIó6”ð¼Þ šÏ‹|;Ovk¬ÚÑD%‡¨,X,«%$s§2ä{‹¡”P_åÍù¦ç €ÙŸ®Ñý½Ì|zº.à_ž+|í9Rw…a)u!/Žè…i 2׎eïZïlBo ^¸Ö­8f[¿á-!š‚42FÏiå¤/ ØÖ‰ä~¬-°˜†~Û‹« ®·ïKS£ú£G”©ÝîÁ9¢ƒ¨ŠA“à½×ú’¨Š¥åÜØò$Ìä¨Vû§éèž|¨3<Å “=þ¼Ç SmߦŽmɿτzpº$|¦S¯üŠF4‚¶â¸ö¼¹³òºYtZ.afJ°-‘V¿œ8gfæ g¥á4ºº¼ˆˆc¿º\9pN„±*­¼§Œf«Î¶ÖBMË-ƒg-oŠ•÷ƒ¤]-ûÃòi~ó4_‚N8[þäÜ{Eˆ!qÖK‘rŽoGTRòÊ{§ùcXà¾SVY2··ˆÔYJ+7× ˆFÖ"°ÉûcE™EˆåÓ+ï1â§YX}$^í£‚]½ƒgüNa¿~8;--K±|ï^‘ScIDSô¶NóÛ§y(òÇÊiñ´T¥6à›c|$6Ù*¯œ~øpê­à(Óc Ø7»æŸ¬ý±òëÉÿÚ‚°±¨VhI–Í|xˆDÓX¹í˜¥ÃI6ÁÄKœ~Ó'?/NKTEI[ÎW|ÈEÏ –,ø°áy·8Þÿ6qz·Êl›µfÕÀ‚ëÂXðÌ¿zr¬,ÆWlR.ëO c™"ò05éD}¬nßnÅ»¡lqý¡uP¸C«"iM•×Ç&Q-‚¶Ç òò ELÏ)”`¥¸²l€Ô°ã¾¼k=·Ç×¶­#—VeimCî|h«^²…ebÉå¤sm Ó~ÝØ¼Ž†üúI»þË xŠþ¿"éÚ¯ë;Ø íÚqMÊR’Øn6ÉŸ‹ëXxwnsЯ²F ’†M9 _Ú±ØZõ pøD ùc…ØK¿[ð5¸™Œ94#ßžtÝŠÜá¹;²‘¢yüãßÇ?¶·› H´ëû­cX½}³³ ÷Úmì9åëËD »Öq‘‘¡%‰?fÀŒväLõúö´\šâ.YÙœqˆy…НkP³¼˜Gr6ùœu¼ÎÄ?ÌUÉd\¹"†'~ˆÓd!—@¹ ¤Ë2£òE°ÆáÐ7Ér> våIg ã ä,¿_ÆðVŒXºl—‡ÄgÀº¡ßt§qTÛkC3ßà¡¡hí®ÿääìLlå°Ü÷"ÿ£Lücè`(>–Ía—Qî~ÎÏ9ØÁPŸNk¨q5tžÍ}|–Ӕλ³å@»¥C_AòG„3{@ZÜ=ÚÙí×G?ÕŽ@0ÌÉ O×DWizTaëK4O¼ ŠÙsð,Ød§îÀ1ÒÇm[­v´H$×=¢}ÞB’vAzæÆ3麂ËZžÍÆóÖÞò·’Þ2vóÖÿÅ”>¥l™:/“Ï}ã™—ð"ö>´O«îNXf4;CCS&ŠZ¦[¾”Ô£íKÉ#[PáñØL†¦£Ó§¹ ’g›ÚL¶t¸4./½4؈gò”1ÜC…Â^$fCieSɺ\i‡³H·#[Ê0×–¿™^VÈ MÉ¿?üý‰iiæB³"ße–È·(PA»%ÈóÌÏá{ÅnC™H„aJx*n]¶£ ·—\Ί¥ ²eºUڙ˽é¥ÅàÉK‰‹á¾+IÅú“ú6ûÂIc‹êÝn~ ¹#ASô߭ªCwRÊÌÙhÉ®ù…““ÏÎÐH¯ 0›“ËÅöf†I7ÔbÆ ¶a‘{Œv8 ëaTeK 1ís Øž¡ºó¥Öd€£QòtMk•™&h™Ö)ÆšGa­“î;¦·ƒåÝ ek i4ÕŸqÝ7°†Bñ•B¨=cŒBrUsf•ú\#W——œUŒ,Ç›§q†ú~îv†òÞ¯ÉìÎoÜJ€”Ęª¡Î„Ð’]Ó̆DœÛ‚TQ_ºØâ •Ó"«†[â.Tº–‚€Hñ‡dŠB dŸíEªQÌ ï°QÏlÌ—fÈwÈA(gìLv®ûÒloZ¢‘ÓÉŠ…Se¨â6“Åtý ëdÖ£G{^˜ð Rªl•=î$m•/Þ¼‰†¹œÕ·Båu¿\˜™ÜlAÞ rQˆQ…Ý"„²iQ:ÿ¾¨5Þhd?˜jÄs?Õ"}í!ë$®»AD…D.‰;®—[ÈÞöçªñ‘@¸™æ¸PéAÛ ,wvà\XS+tD\÷Úö¸úY$}‚´ßÖ9Þ[Õ°ÀƒÖ†¨ú®l73Ý¡±ÚgNO¿{mÄnãÍÞΦR5Ö]O¿[]_å‰Ó!®£&Gʳ |„Ê€J)h;Åõz–@e²’îv|)Oâèš)±ï¼Sem¬ªwnˆ¬¶Oj×EeÀ8éølìzvÅÚH1ÃÅ]Mº2ŸÉølÉxmÜ)Ä»t8Ôœ4½Pñ„Z¶_ ;\k °À( Á›Rb ±e:”ia¬Q_;þ“>Æx)" ©–$6d<·¡:#Æž#›ç ;púE¥m`]ÈX$MÉ%öÙ7ÆZ_æÈÜ¥ªÁðŽö‚½#¹7˜”‘/Ð2ƹzRM’Ž sû]`A·›wQ+•.›²T¬ÉØ­(Ó z¸¤|“ñ¾¨ÿKÚ/œd$ mt``—ŠÂYÂr  ª•3a|%Å›R(À’ѦSé Ão„¸ŒD_žãõ4áI͒ƨ0{/ÛÛ¿À1›÷ò9™äÐE·{(½Áèþçb42Ú»ý¯‡‡ŽSòº‡A~¤ÐÎ2¶"\q€žŠîÀjª”=éÔ™bD\qXSÈ:8!¤Ž—Œ¸!UÑs‰E™)¡p,‡ï ;4ã¹`›‡S7[bÃ--=z=„+ƒÙì“$\! ˆÔသsmíÓøA°¢…(B²ãùûo‚ˆØh_Á#'ÃÉÈ+ŠÂ`Sáûܲpqc¸vü€ë¢Ö¹3ÚÕ Þ :¿(¥j*¤àŽÜM*K‚[OáÒ¡H' )¢êÂl)•¶´Ùrê¼í\80û+Q~ecGF8}^ ‰CûÚwý§s* 2” wÞeþ+ÆS/^ïpÃÍò µ»²–´Y>ÄÌë&Q Èås“Д“¡”ò¤Œ'%<2”Ïñ¿¢Osœ L.œYõžíi R[£ÝÙ ø®ZÁ{/dº<Á bòèoï¾(þ žôà÷@…ÐEPá!L‰Ì¶Îo§÷š èW'#Óš»Í3î:uÆ×dÔÔò¡öÈÒƒô%bàWÊ%è¤Q¾×—*ú"9ÙA&3•m© Æ;jgxàŽ›¹îGvøŽ¬!*ƒ»ÀL€ˆàk¨óOàn9|0Ÿ2Wðê¬t&ïu¸‘hdkB< "ð) Dã 2,YÌ;âRµt®Ä[™:/±ÞfåRÆZs¹Åœ½?H6æ·:cF ”0Ÿ‹¹{\ÏŽ/ªëÍT27*9FhR¿4˜ Èô©éÎ bÊ 4SÇ”è“G0ç¼È/—ôi >f[R/ÕuÁ¸2²Ä[ õÜ…‹%TÅéI¤ /ƒè©µnבî13*_ÿiÛPZ¹‘`âP…×ýĪ®ûAM/Z X¦Ù@Èj@eEÈÃô¥Âò$/ªëþt& ÷BÆ^‡·ãÁHn64h[§Ó—¢±/æišýŸRƒüM]ŠWf¬ºKNf VæI(‘˜eËLß]nȳ‰“c™8·ü~J^ia,º·p!@àIAxa‰kL9˜­—ˆn=ž5ÆÁ³mGµb-0÷Єµ«F°3CµGã÷FãèN‹¿ݤ—{µýÆîN †úà ™œ¡‚_7š- ÿ]{ÕkW— g¹Dƒ‡“¼³œ-õÚ–&ŒkACŸ¯ÔóRÖRAÆ*u’@1hðÀB1”lÿe1¨3’o© 3 ÚK ª˜×2Ž×ÒWµ”1ò˜¾ßÏWž/8¿{¶5öUä2Ûz§£|(ò) µ” ¤IÖ6£JáÖÃn€Æh¶),_ä_çu[/Ñ,†¼°Â‚xgßÇì¢4Άídê„ vØÚe2”•ßEN«Åd¢Æ@'RŽ¢sUñ]ÔªDº8Á€z¾‹…\ZWÊlÆÑ³á´Ð±£Ä£–¯æ©Ls´ž¸¾µñj ß Ì8€xDh˜¾V*ÏG© ƺ~G+ã=6¢XÄp_ëbkKäó% 3<ØŽ>x}ð:_¢ ÅŽ×u†¯—×ʰë"ÌNßsEfx$ã¨AjÔp óâ#ÙØ…ß}ÄÿÌÅ[™$/ÜPpLõc!´1b@/opÜ$ßÀ`Ä:žcì_ŸS¼ë¥•ÃÓ5â#oEå°>ºè®?ø9úàßIs°–8skÌÅÚ”yZ›gž¤ú†h²‹xSç ¤ n¿O‚2†›6v©ÒN?I§Èõ íýWÍf»±‡öl°ã¶êGÃャñGÈúg£û=øV'IvåWŠ4þ⨅áêÄÙÙ îô‰HY)¯œ®Qب•g2ðÄž´bìg‰º!ù=ÙZ+°Ì2ån¥€Œ9BHªê)E³ó%<²qÔo)’y“áÈ_RP½°HDFÄm /K›w'–]ýÚáÚŒ1“²¥ŸÑùä÷L©É‚=°»ûm>¾&×òÞhã­Ž@Òm%¥¥²7ò”C}§`IÍùÂDYèjoÓ„rœ£]Ô麎—:~‘DmëÜwû“±=#5ô2L¶hbßa8×›šØþÄo7gÔï_B¡Š®9íd¨-#Ùœ!£Î¸íaúär“×ûdønè^ÃInwÒO§pùz»ýn[­Œò„~=±äª©Æ—²MßêÙÓgèúÒ…¶ê²cIÙö<`äÊæüÜ6ƒ«Œ@Z®ÈÙ5Ž l ¶ÌìcÙ,NKó:º¹?ŽÎYÂBED¶2¦ÇæPÐt{ˆ…shíHÜ™/g^ C¾kÑY G·¢ Š2˜*”– t4@Âz´áe¬´Î%d¹p†-Äõ¸=jB ’ª€ã YÞoÂqãÃyçCu¹ W&ŠŽY°dçB™Š³|Ž“hùdá*ˆ.-d¤ÈÕ%Gî‡=ݮʼnÙð,f‰+«ïè ôü¥,p$VÕ%»øE㮥h—ÐOf¨ØæäÒcÓQ ŸÜñB‘lƒ•câéÜÀÊì8cŠÜÓƒÓ%pÙ.ŒxËAvKpNhDLfˆŒ ñlÈ \kŒðˆehTÁ§x}ãÁ é=´¯lOÑ)7œ;¥¢ëé)ÁêÈÑ|f“‡%·Õ;0`¿”Ñ T¡¿¡g»Ã¾ØwÇ@Á\Üêþé-Jäxà¤ãçîY<­{°k“lå’• "uRÀf€ãÎñËiXátìsÐQ{H×¼|-4u]D+Gé i8l.(œé‰ó…SgùþdDµ”žDæßs:žë»½±ªØ¶ão ¸‚ŽçXY{qš‡“•Ti6 õ¥;²Wt³¬í^qYRèÒï¾Å-9 œÙ¬éÖ6/hø/aÂαç\,Ç3˜BäƒJ¤ÊeÒÌÔåR¦Æ¶½ý¹Ø_˃…oQAÓ'u‹ao‰heÑž_iëG^¡4¨í’Î%n¯'çÞÈ¡c5ñí„;¾¬rX:XírX‚¨Oܧ(J‹1‚æ¬OÅQY`xTÔ—–ý¼DîJÛäÈñØKuÝé;ã[²vNì9ðœ—î5²‰2ri|my2€}åZ»ïvÞ ** Èà“[ö¹ Ã`‹õêÚ÷Õ'vvT\`°iã…Hõoö[¢kÇ‘C`‡IˆÂº¬:ÆYhUÓ6·1*ª¥Òàò©8-BOÅs ¿±Ó÷OK§ª5%Ó“’èädµSÓiwõèOڔˠ™‰F~˜wj¾˜@ù¤Eoô„y~Á““/šÛebõ:F¯‚÷†Do¼Àñ ù§ȨŒ §©È45FÃŽƒ7Vrl»N×D ¨THÊ­È©6Œ°Õô¶¸@THSw;tÃ3)r§ ÔKD%…HƒB§Æ‚N«~ŠVt–¯7Bu£Ó¶ÐþQ2$ µ„x†¡‹òWŠ'¿–ÎN•NýÓGph Š\¤Ä.ल\J¯Wc°®‘M¬®);}f.«È6‚k«Uâ!0É’¾5ý¾] ŠÂoÕïWW«ë§bv_òå·ÕÇ¢Z­F Y‡BÖ²–²b‚‡—ÜßU× S­çË|¤» Ù[¦ñ ðô…©$÷Ô[ºé®ûqD `«\9<¬—ƒ]ŒïA.€fÝJ‘$þdþtQÚÂaÎ×~øûz.·¼¼,^ónºiE9€×šŒøž¿ñFZÆ6z¶<þc)ÌÞ&¤’©’ôåþc£.õ¿J™‘[â.]Æc— Œ•”t0oÜEnÝ •¢6tdÐÈüãû8¤„så­¼tEÁƒ©ÜL©˜õêú*ÞÚ‘ðO÷w·‹1,!7z¿ÔžæºÐVÂ3×ÃÐäÜ­_ ::‹Òm¤²=G /‹ñTè æ\L8j«BZ¨ætŒð›Í?Ë-®t,‘î@?'EçྻÍ63ä‚N7ƒ´AÉ—²fUSõ2ÇÍèÀÑžXâp«¨þ„ sÅZwn¤¬PíZcë¥úË‘_”¾hoA-ÆÖçQ‹8_þfãùQíè—vc[¬Aö¹óÿ¼sÔjì‹¥õ×»K G;?7¸Ͼr f+¥v$à_›Â¦Óè9ÿc騶àøàb§) oÚŒòDåñz)uÂg‰9•fH¶™VBHÉy«a;2`çÜ©¢Ë¦á#.x›°©Úý^’³éJÀԮ‘ä_®o.Ås¡œÏ-Øšÿñïüñçl–×tèaXòi:ªÀÉšN4Z8Óuë$ðŒ.H»Þ•-ó: ùcàd!!XEnrÊêºÌÕhùÇcbZ ǫ~‰Ä šNl¤ŒSt†½rYe)ÜŒ¾ ,ÔÆq$„ãV´Ýlú n8s“øÝxhv%ýò0&d›~MmnÆ‹£Û$P¯7¾_Îo†h€[¦ãV¦@öÞ·– ah¢nZv „†!«T 36w3ý”Ò©*PZ“ËICÿ ½“ÕÇËŸ[V×Wa ÑcŠ)ƒêlËÇüŽÿ,ð+,£r{„÷ ñÓÂsÌB&I¬›M´{lO"”rVŠŒ1ðÃQ”œRF ¸×G_†;¹tU{ã²Nb (–Žcuÿ-sÏùCQBjÞ?—Hî»k…G?»´=Só°åÀuu=©½÷ÙÒfÉkwÜ´üKϾóMµ›8iYV–RºXzÏ÷Í’ÜÁ Ä¢±ß8nì·Žkûõq¼s´§¾$œÔQiõÜ‚,_Ù>¡~šWiNóI’xJ °Ñˆ½WÍãÆasGìì·^ÖŽv¶3 õ¬äöà¯y5ÅÉ­t%Oü¨1tÆÇ¶7ȯt3ÔŒüoDV«ü»ãéCúÚœMâ³Ú kVQü´Ä…ܧίMÛZϹáu–GÚÈÿ„ÃU¥l‰ü[¢›µß¢{Ã[#œd¸,ãŠnkÝü3 M«3’î4Ûi±J¨íÓµ• ·?XÝ—€šÍÜÿE$lÚ³ìÆ_ Fá‘rßË‚?¢ˆñqçªw~‰ s&[«´„ LSÓϺ[)ßëd¶@6¼´:ï6 v;€˜æ[|²ªP¾^dΡžádo)”i8Ò&€L'ÞZI‹ T\I8‚$œâêÍÚ*ÿˆó[]˜¼I+Ñݼ‚¬îJç¡[Ò]ö|gÔ>lˬ¼Ø× ƒÔþdÀº¢çY¨~ÄïJë)ı+¬+×a }ƒ‘Óy¥zǧíõ'OÅOÎs8Ø:èaôåÜ_£åÄêÍÕ%¬põæéîn¿ŽI[« #°m!öÜ+lÍd$ÐèKC–"|•‡xÂ?÷Þ×Kl‰U_fSއ¥7 5SL DÓò[ 5@ßÕö·ö*KKÅ7bcõû§bE¬‹Óe±þt}mcC<k7Ö×¾ývý»Õ·Sd¿ôÝí„òþ‡_?´?äã2}ŠTÎÅüñ€}÷l4ÉR'° µ¦Vþi†L1*4CÛ•ŒG½Ù𔊡Gb×±ÇR{%•WÁw{<Àkv}½C¦EÂLt—¦KöúìÙÂb´P¾g·Kés(ŠÃ×xß[’v‘ÓJò¡g.5¨8…vþýïÜÓ¡K½SUpÛÜG|ju»ämZ(§Ào˜ øe€´—rµˆ„ó+-ÀO<æi(âiÖk_Ö·…®ß¢â5Rh§bª¦Nó§0]—‡½ÚA°Ã÷§yÚžƒÔèhyT–©±¡ýL„}qâéOóoyÄo¹˜“‡™ D2B.$Ž&de†ÿýj€}ø¿=°¢²7tÀÆ l”X&xb„SÕ_J :DqàsŽ˜Ôð2^xÅQâ†,´gJ­Ñb£0¢Y G5?ÖZïôLX¢€ä⊖ÅP¬LF1¼ÖyhFÕbŠG˜r ZU¤üàêîÁ‘xR}lèµbe#´ªQü‚uwJ ^Æ•T ’Å®mõ™Aßô{ Ñ€äQJìÓoƒwþ¥_ŒÞ¨²aaJȆÿ…˜ÍÕEZÅ6qñ1%Ù§a'Î=¨ÑÑy&² såwc”?|ø²G9FÊ/ !4Í`L ¸ÐiyÊf á–6‚"òü@.œ|áþ*UÍ)¢f‘i–Gù˜Ò>“LN:ùü{é¾9M¥uýº%OV uWlôWXk²rºöleª¢(V07 ÏŠýM±üL||6_þO;GøTŽ{ÅïxÎhLoÓ7KA‹×ñ{¬‚«fWTãs±§iÆ“³ÙÀÝ Ufž¥ñ’~ÿÁ÷2êÊGM|t‘.Ì¿<>ËÊü„kóþ«Sˆ{ ~téeYw ´äÌ9á‚ò.Wné1æ5÷¦áj·wš»í6žtQØ}Ó­^ý0ÕÈ'…‚ŸÓ(’½äÌÔƒÁ–ïi׬xš²Çe»¯~ØÊ‰]Ä@”$²\"\;zAUŠ«ˆ%ÃóÝm±~Zýn–!×]ÌmÑYFÛj­W¿«.+çàTrseMK%L±¨mq¿T?2òŠšÖRYÍk_Ûbâ]Ød9;vÅdtáY]j!£ gÃöÁßãnä¡Jî;µ!ÛcK\‡R³M-ØÕ’œ+O)aÓX3¶SÈ=Š£BÐ §Lª2¶•F¶1SZÇOcÉ÷uå%®¼»[Dh\Úd,Z­6†K›ìŒ¥‘㳸Bà“'ø¤tï…~ddF–÷Ès/ÉÅŸV¿_«®V+wZ6iŸmEߪüÉë=hú·êèP)¥fD¦õíÎÄsÆèÕluûe îÒ¹¸$_g6ŒïR$g¨‚M¹ ¼~S  dßÉŽf(Ã'Œ,·ÍpEçB¶Ñ¹‹:?†eINö ´Œ½œ)SàX"Äó bèR.— ñçü ‘êž=%eˆòñµÓ±C×s#XÂU)û>|ï´…Ïlö”]–ˆjïÂ?óœ)ßJ ùn°ðiÒ)fñÆb4ñìÊØ¾‡äUmˆ0]nU›@Hhu‹Ÿhî•é?†výu«ÿâ·ú°³:‘ËkÁԲ ³äÒ|üh^ó;»ƒÆc÷Ð5ŒcŒÚ|"Æ=ÏíñÖÈ[zAÇ.â9€KS] c%<¼‘²Yf:•âBœÇ@*|>ßÙŒ‘ßñ“µuQyI¿Ï÷6[G;‰¾I‰5ö7²ÉPr¤ÅÈ8–Ä›\’“`²šç´o³ŒD‰a·ðPr$§ç0ÜM¥Yßâ5ª¢B}y^ù]퓇¸Îû¶C‚·Lõ僡ëEMßà‹te°‚ŠhßïCëa{õD6'«¸cÍ5[œj4•ªa”NÂCV" cÝuiäG Å AR ä"î‹K4]諾-#i¨&Ë£½ˆ)°-ož3Q¯ºm{8önùMˆ'Þ ¥vá jîO»ppÚ…iÈ´ ÷‡¥]¸7&íÂiæD£]ø E›qº DÞ¯ ´_(í5Òù#¡ï)À)à‰tuéìcÒxxv½ÕǬ¸¨üñm_¿®"묜{ã>GxØ×ìf ;ñ6íò¸þ5G— Ò…³ ²TH—,ŽØ®ÛÄzvá®mYÀ ëNbåcÖ.ùrQO˜óÀ‹®RõD0gX‹Óî Ì?OvÑ8žÌ—ÊÉC›‡Þob¦<¼/ݯZEüí»ÕŸKBÅ»€±Úºeí¨ÎÂDž³ëÓ?fö[ì}Bvã‡j7¾K9B €T"Oq[U#‹þ¥WuKѺ’Šž·cTõlFe™:–Z;Õå_yåe5÷­kÊ FE|™6êñÙÙãsuù SO¤0µÀcÔg9ŸÌFäjAS©ÿ)’¤uË ØÅÍ’LOÖ#ò%Z6Å”LÝO 3Ð Sç@ôï‚k<451o_i0å/º–RVƒY=‹6"ØÚ·¨D² g¥)ˉœhç†rÈ^–¹rš¢sç‚ëV“XÍeÒÁD[–2<=K2xpaóž¢FRT!µv6ª î•ÃÁ83r€ö`YÁ>=KÅiB9Á.èä­\A‰sã%î%©Ï7ÓICóøÀ$‹PƒÔXe8ã†1úsD‰;E vˆo«këÁA_ªŒÑ yžÆ@BóAäGŒÇ$6ªë|ý€ÐA|Æî`x)Ò %*ƒJ†õtþ¦#¬ë½¨eò  Ç-©4ÄšÙš’¤Î ®ä =UIÞšûB¥'К1ÈŒŠ⇠! ø±×êä¬Áí_)·I»˜g¡Ü:^íÙØnàhª<|½ijàƒ´n?œl=›n¡Yò ­‡¢âd(a¨BWr$â诹º;a^DHÎÁ©XªÆ¥×f@¨~‰K@QÝ5J©6£Žjá®žß s—Çw¸éTõþˆ.”™âƒYN~Éø&òÄž^ÈjѽËR|µØ®®îWy˜Àé[¸V[ŠÂRÊ„0GŒ$îQ«‘d¯”%iƒo·±> Iuö$~ÚqGBš=ðœA<°çhU| ê~¦éh5q¡Üµ£²Ùâß”RqjN4-ÓëîÒkK!+=KŠ,¸(žn(¹/öêñzEÁg‰ž^¥g±Œýv£´¬VÕçÿÎ ‹í^z í¢ºý‘g#H ŸÇfÄ®O°*ö~™O(ÉôýîÕE_Qà¿¢ÀEÿ¼(ð~×99Ùx’ŒC7]ÿ¦»ïQ~¿oÓc¼ñílÊð¦Bž›P纘ç©a¤e iÔ¯³{Æ}K¾2K™Q¸ ¢~vuã¬[Ì ló„â1‚ÙúcÔTqQ`ŸcZäHß@Ɔ7öÍx þ¤fFDI3³ïêÜ1@ÛLP]üàÚ •Nâ†b뼫frgÈ ‹‰rtÅêIOó_®4ölæ—Э*/@ì÷q¤òè6o>!6!b磚x’Š,–€p‘Ô## ìùt`ºP‰¤m±`üu¥BŠ– #¨n2bü?â |"½>³:Y[bkÃT§ö&Ãtçœ2ØÛ»Dδ”2hƒ¯èå1žTQtjWᙃ3.R*ûösi’¨^@sÈô/{˜àÂØ›ØaÒœãta|¡½ÿ ‘”÷pžÛ ø÷àèCüF‘ø'GH(SÀi?-!÷€?eŒ}s´MYd>j ‰iFfmB¯¼&7ûÞ¹¸]8‰mÀÚèwc>U˜‹ŒXŒ,ý±¤Jd¶[ù^¾:þ1LŒã¶A¾2áñÁA³”š7¿P¹¦72y¬Á2±?,WwÞì”L|²7›Q»Qq¸`,'ž<ÚØ¥ø³„Œ¡v ddvJ‘7Y§±WÛoìî´`da •{¨õ @’èÁ»|c#**-m±.ITø)Ú}L¼Ž½™”œŒíg,ÖÂã‹Bz#CŒ³‰“¹(j,}¡Ô"C[{ŸAzù/7Â¥Ñ[¹¨~Uî>Z¯Ê»¥¨ô;K+ÊÈŸ7Nhò3öä½ChâÖ1ÿÆ Ç4íKe06O:‹Ý*Ceè˜^‘É´0 ðžMÉæðŽ"þUÖy÷ظ¦º–'Ï2Þ¥5òÝîm蜴];zÝØo7û?íÀaq§vüêh§U„¢£å\LnæñO~!*—QT§¬þÈ®"‹S2̽gÛÏ[Ûˆ»X%‹<…)=ñ9!ƒt=òÆ«UWiÃ0.8‚g ¡_¡,,@lØ SªSÙó…Hš/次뮫‘å黲ÖÖ>qì8îÓx­p\Ê£sgÑR Ù²m<Æã¾rq¥€é ]âS`º‡ièý<Ó<¿Ó¹P—Ø+ª‹w™ö£ Óþ°^ë‹âÕQT'CklãŒÁÚ¶ çÆXS²öbKsœméÍêO;Ò36³c½Üq=&Ú½ y,šWJ6}MŽâ*¹Z׳.èþö.ÁyÈßô ïs Z½Mn¾9í&™'Ï­p•,= 4þºÿèœôÅJÚç®ß'öÆÔøüMrþ¼ô|ó(Jƒ+j§TU˜›mJ÷qIž ìì}zj.×OÓO}+1ŸµŠœÅÙ„›l¼9©Çu’ål¢ï¿Š,M¨¥mq‚p´wúaà †!á¤Äæé8îwetó1—âÚjÒZTNU°ˉ†/wÂ4©»Œà…¤¯È¹X^¦#—E ú¥¬9¶/3º‰>2cÈæ'ò…yè{! i/Ìåô³07©-ÜaÑ,Ì·^æX*ñ¨yHükw"þøeéÂåhd-#F~ZsqD—Ä”/šÎj§¯I²ÇÄ¡g¬­ùÛôÀí¹/H€}ˆy<ÿìSxþ çl°ÑvzpÀ.‹“3øÇ–p±³.µµêj–C*زŒÂ34ôÖsÅ—‡ß¯o§OïÂdI^ÚóïñóJÅsx¦‘è97„‹ vˆÚ1wdèïq"}P0½· ò^ò[¥Û‘¸çHÅ·Ç sžŠ2pÐɨkí¶g_8>ÚZÆãøn[M€‰#¹(Ž!¹„_ÁY‘aáí®¼cC}ú#猵6`J\ï]9df"ó“u§hÉ÷Wb'8¦kû·Ê« »+oöª¬ˆGƒeV‡Ÿsó|9´ Á´}kx1±.Píãö$F¶WAÌÔŽÕ!w Ï‘îµz»^«¿ÜiÿúOÅ“ëK›š‚Ejÿh©ó·:{4öc#!Ù(ï2H_íä¾T£P(ñý¨ã2:ðKï¯û{®›6ÁÚo™œ7t÷Ívcw§ÙÚ)òF#NðqmÿE»uðꨮ›oê5H~RGyà°Ê"FZD| ÏO¼¡X}&>žaÿdþ“ú£GsæPñ(¾ý–2*§ûɹ”ŠÆfPŒ’Þ†ÝļÙ2–Ô–GYÓç ™J¶„C÷,tѪgלkÜæ¢¼%½Ì;†uù¯aAÅKV1î­kg‚KhMäÜ¡f‡«È:páQ3‡,>^™øõ'@%þ³û¦‚Œ±29†w¹ÞIÆ ~%¤3„-Ç·9Dpº¦otŠv8²hi¶¥ =´(v­sÏéØâ¹ÝïCó…{nÁÇÎðVÔu¸i@½Q]ѧ¸å˜z§üEfÉz#Ø*¬y•™r³×#}ÿš»÷PÀÿ WFCûÚwý§â öþ|n®1ºùpì‚ÑoÀ3¨—èF#—ι¼ú"v$ªôô9z#¯ô»Ußv ϤsN9òÎw~ÕMü]äßf\ào“ÝÞ? ˺—ü–¹¢4örÜ0ò¾‘ëï¢1HBhýô£}—ÎiÆx÷4®Ÿh¬ò FC³¯çÁlÙèeb³ì $}à4ÊÌöåÊ%~ýÆqc¿u\Û¯ïˆã£=õeZT;hò¹Y¾2[F'£Ó¼JsšŸz.\Bí¸&ö^5‡Í±°ßzY;ÚÙÎ\›Î·f'·7° ú”¶…+yò1h ñ±í ò+Ý 5ã ø7šUVþÝñÆôáîF ³Ûí FÁúJO\˜ ´ÿ+D’ˆŒ£pg›W¨Žîj)"~¿³µØãÇ«u"Økh±xxx•3-øûô6c öÂKìÎC!þ˜‰#‡ÿDó]XÎ«Ë _<©®æÙ²FÎv!ƒŠŠ”ÌÉ ä.šç¬úÁ?}r…˜Úõ`î0 ‘i =…b&â½fç®úÛ/a~¦u~îù™ºÐ¦X\=ô…Ò´ÛÄ`–zkàÝOÎÎ- ü¨ºl¸Ìóè1ù%*«V¦YºùÂÃs´&ÁýÔ³]b¥I@ùÚ~Ý4E-×3ˆ¼P6|ï@ßHQàuëB(Ì‹g÷&}- ¥(ÄUN&P- Äï;ËÐâŠõêSQX·çbûIuíŸ Æ'æ>7'ü¨däX}5;ã©L!ûdªä€éÕAI)Õð6.>-–ñ®Ï#a5°ŸýÛQÏ4|2´§ëz0ø+¤F˜bí‡CZÈ|eqnw,Ml|顯3¤àdÒïµJq¢ÈžMæØÇÞ: .Z…õì`(r–ÿÐr.›—ü µÃÎÏþæ¼—NŠÿÌP*wu¯yè ”?ÍÅÔ¿õ¯6@÷˜ŠH6ñ‡N)«òÂFÚ˜ˆEdAä ,­y‰àŸÿü'­°ß±öò´ƒàv‘¬‘`Äá°YÛk6žË@‚ÿ™øÁÛžëû{nw€Ö»{·>z6âQÇV„é¹$Ó`©…Œ6ÜÚÉÂÀ…3 pß?}ꆮXÜ“Á"l›oÝúäÙÄÛ·ÄÊ||Œ\ëø”Ì7ÍðØ…ævûèÕ>abTÿ™  Óš™ýf;â›ÐÁå½Ã¸ E—m(†vg«¢;RËææL[ÐÍQcŽ+°”kq˜É5!â—'#{øj¿ñF?x5tn^ƒèó-EŸ)íädmõìl™qžn®ñ%ëWp~ÄëÉ0‹ij’Rʸ=æÑZ$ÑH&šJ_Jëx€{|ù“i¢UIòX¿s3æ4Ñ}ñY:üâSö5q‰<1 \~~rõÔ@÷äØó¯mQ¯í†Ôlá•ŵ-ÎÅ%Æôö U­äNïI—¤c1 £¶0$(yVp.kx«Cú2E€n…b#2&:cšqŒáít.eœq1xèêØ¶TSñJ­TX¦þ-wä0è¢)GWÀÉÎãjÖÅà¡êâRUO®&p‡$l#”SDÇ-„‰³„ʺº­\Â(ØA“à¹ÛêCq˜ôëÎÇAQ>oš7èKùηm÷ ™ÁÐ,²#å»_ùn6¾;çýÿB±¤¾¥™3ÊÃ@ITë?†Nšî#z¨5Tq(ôIñn£ºnHxPr*àæ\êbRI$úÐï³R®Voïµ^´vZ¯šÇÅ“¥ÔA€´¦Çqj:ºÌëXÃ6AûI;Šco*·en·éÁÌ)·wêÍ"ùÛ3Ô"~ZÅ_}kZø“F .r¸{8Œç­<´´;ìGÊ0Œ9ñëþj…#ÉÇ˪únriR³¦°fu±ëgŒps"Õ¥ÒuRd>Ê@fv8Æòã(B‘PÚ0ä¹Åbµâf>Tá2o´(I(müÒ…åo–²ì‰y$›7±7‡;¹DÝIÇpµº¼ÙgŽG” †[Gy)d×e® ^Ó‹Z1Ë…? †¨'‘Q¤ƒ» ÞµádObE'ªÈišÆŽ­E¹,ˆ¥šÅcóMWW­÷6|oqä}-J5³ËK],ß±PÄ•>¤]ZD ’³ìÆy„¼UáðµÕ÷l«{+F¨'ôñU ³L …£¨S$l¨S!¶eÒ4Ýð¼F(ˆ[¡K§tæ<Ë2ߘ¯=:î°‡¾œ[(ÞPˆ#e+<‰6¾o#?Æ‹•¡ºduÐÚ5G*xhøñÑ/íŸkÍ"<—9KbýÞö<#ʬ+ÃóK|ë úwœ­P…µë†^Ë}h‹¯Ñ¶–Âa<Œë>õ™,L%ÏžRéámv«rÅ 6?ùHÛ:P“B¶ [UÙ¡x§a°Ñ›6In51U°ÎNF^2gjê¢]?ýáôïkâT¹—œæ‰ áÏiàB&S•Ì(ÒÔ+ Ã“³¬â}(Î\™%BB<Mê0,Mòà&¯5MÒk?üý ßÄD–ÍYižÃÌÒ<ÝKZäæXˆ‘ÅðÞÆ[6Ð!=Ë’pcKªAnȼὖŒÆõÔ}œbSÛËÅ£iúj©j®ÏD `Uël[áÄÓX¥Ñ0'<ˆF O0m0KÉ™4¸neXA6‘4>T¯g÷úö Š2Ý>zšùI¤\N/_‡ ŽÄ+T†MáÀ…IÕjÆ…î·¹€P¥¯“vÉôCn¸•ᴃ̭>©ÂTÌçlU'øQDÞ…ô|Û·µ<˜&FÍ®*U”SÕXƒÂQRŒ×«.5í6qFïÝ sYÉJi&Yn$…”¬ã.d.Ï87r± itÇ”Ðß´êñˆx9'î]§×³1j¼ZæJ+ÒÞê”Fdi¯q@H¤A©G³"@© ãŸ8b L¼ã2ˆÜ.&€mjÍÌ…B›C˦!AûúÔíÆúõbL2ÃC+2.zY3‡Ti‘-z¶ÇHÄCš¡YÚ‘÷ÏhŸÔs›/Ô$f(pعUqªòª¥ù²pª6\àøÈ$ð si /l H(ãÂbpjCCgÅK[¢2pt­Nf¼vwêPI„ CDøLMì4LÚÐà°°JçNSêY†Vµ^6Ï)>5Hp[غOÔ0 Z?µQšmZaw‰ã0¥U:aRMΕUPÀ,ñe²[¢Gñ…‚uaáö)œÄ¥‚Iê * # Žª ;˜’á0 !4* 6ZDe ù˜‘–T2Iˆjä¥K)½2‹$©ÀR‘'tq|0V°±¤RebÞ¦"ªMP;É7GæXLwŠk†;šªÒ"µU´–ä‚C™BL¾¥6K Î ™`Sùï‰kÄv(Ók’ñf×DSÜÊ©^$•‰«xFÉrÒІíÙGÊÇ£ŽZ¾rÆ}QTs®'¸$]¦@žÄ ؉] ÅQÊR/š¿ù—&Q-H*>v/U9‹d2ƒR»Ã¾ÒÁ!¸á-P é}p÷…5¯c/QÉè^ÂAsL?ËpvÙÕ‰rVZ4P‰µ¶r¹œ|JpmíúÁþnãEñšYE%å^í }ŒÿA¤ÂG›aϹ˜x Ĩò|FÔõàèCçĉƒ¼íÊ‘ÒZe&Û·œœPñGà«*t/6˜[Šý¾Žgç£ç+³5ª 9N¡šlkêM†Å“XÏa|Oàµdœç¥½ƒÚÖr+ÕF½¾µT¯çÖÝá«ÖËb•Ñ¢Eá 8‚p`ÅFà@ÔåE%ð«9Öîmu0×MUR.Ù«n,;+ê¶\óÖ€ŸI=ˆÔäAéu”_YܦaDÃQ"DU:Ûuå¦(&·òˆÈ‡ÊÛ¶š$±%VŸå§—OÜ=Z8-Û ä–Œ¡Š¥÷ŒòW\-=ûXЪ˜Ÿ½ÃFs燗£ðŸjÖËRÅìŒ1‚ lfW¶‡ÔcÉú Ìäâþƒä‚®Xt²I²‘“²ƒ1šAÑ'g%Ž/µpXÍécÿöÎníUó˜HJEÊ×–‡œÀ_9w1 10ÜYå€Ðb·sLÈܱöóüsجï䌅j>Ρ-díçÚ±ØÙÃx|›øäXž‚Óì’Ö¦{d¡roè¹x2Þ, ÌZV°Ë,€b9$5M†ÄÄØFh†ëÚññDËÃŽúNYpÒÂÀ¬âÖˆwC÷ˆÖ"g0(ê¹¾Àîºx,ªVsÚŽ ÛÔ·¡ÑØ?h7dĦЫÃF=éq½}ôx~·›õŸZÆÛ4ž·~iµ·ƒB£.ÓÄ3½¬m×¶¡P–Me •»yp¸³ßn1Pµdo»M‘åÑž•lr¢£ARáø–BL…¿UGãÝYà $ÝX4ö_rµ’¡¤SžŸ¤8Ô9õÝeôÖïÏÊ×w;J·‘X¸yÙ-˜î8CÊGºà$Xð¡¨5Þ”ãjºƒÒ‘3åC…K­L Ã;ÑR¥ÒÆPV¤±b% žÃ¼;,çF™Ž†,7Â7ofÓ©9êv;DÂn:|…mj«¶òKæ×?NU€êSŠw¢Ã¤‡cHb|– Žu!gØðmtx€„”± é”pn“‰ûd4æ]L]Ð š»˜ßÂ(ÙP]tpCQ‚xwW¤Çìú¶¶™_ƒ0½C‡`VªEpÐ[N¶žX>99; ‚ ZA|,p}25Š–§­ÜòÆÖÅÔÚõ} 1Ђ&Åö¸ÿZ *>e@äÜjžûCçÏB€ÌÉH‚½†Ñ Q+ÒI3Éwò¾dȈËx Cð_ãEs£M^`Þ”™?¾yc¼5n¡Ã6«AÚ°XY‰¿æ"¬÷FÜ%.¢ssóÆü£y°‰%Ò¥†òå¤ýX>pJ((žYÿ$6„› $­‰ÝªÓè¤W®;Ok,â¥÷FU(Ýó4pi8êïác%ßyô(ÿŸ¨Ù{óFÍŸZïržõZÄ.õëz½ý¼ÖÚÁ«RÔÈT|J˜¡¾AR|mKûËkkˆ˜ÏC·bß`ÌÒF¡ Žó!3b)¾kS„ŸC’Ëb`£Ã¼3dì uq-€1¯ ;CÝiV‡‘²5°¶U¾à3·ž¯;”§•Ùš»ˆñìÅd¤šh‘!ão Hùœ(É(Fç¯_ÚwX‘ÊIìLvÈ`I„%пU·ºT;ëRP0{_¡œÛÈ^Ì@<²\Ç—ºSdÖÕ˜„ [S¢’Dœ8 g…W?týq—œ%Fðݵ•ÍT‚ójVBI2GFÐç@ßþSš›Û=5èIR×î€7¯›•Dh«È4FƒÑÐÛ¤”Ù|à|eRV×ëe†ó1 µ£ñ­QÀÔ(8¡g"¥íXCJØw@ª³ä…iÜéU`[`¿ö†ò0 â‹û+ fç7mÑÑæå^ \Ï®ŠâÞ^ÀÇ„2J²†/ÔåÂé:]ä‘L­BByEé¨@¤A°ªóãEõ•ÕGp_tl"к 2¡ Y:÷»o¡ˆK»?¢ã9ìhZËæÄ`j¡Â â M‘'hê9a‰úYˆ4<„°RÐibMÐvžÚu–0ÒºžCú0€xjÌY©ñ•©Ã8wW6º·°P¦øpÄÊ£ƒVŽÈ‰ƒ2”ãJŠ÷’‰Ú#T·^óå̘92> „Ne(nlØE2¡°çª²*óa@Éù¼Œbð¶Ë#üBÇ(©ZÝ+؇­ [Æãº•ýGº²,4ŒrÈ’@ž8°á!6I«s0ðOÂãp±Á>hØ^¬®Ol°^º K¤sæ…]x?Ã;~_—A×2y‰¨nËJ§Ìð:4é}u‡HCsmîèJm5R£']dsÚÊŒ!â­Y—±Ü® >ÚÒZ×Q) Aþ׺”°)°6óúuþ´ÒÌKŽd¬D‚’¸lä¢1‡yQ Ø8Ú3ôðêà³kûÏ)\Û[8¦K¿ž‚OK‚=²¡SVÎÖ0ÜN‡<]…ŽáóôìI‚-‚ø[šqß5ÍEQ¹§ ~wC!ç)X˜„Iä¹#Û“ýQîpÔ”¤‘æ)Ô°ØENì2'ý.‡x0ÚÓ²´-£A"ÛRØ5…4Íg:<¿U\äík)¨‡JÓÞa.úìÉPÙ®cîFÔì„ "³‡­…Pì`›Ò æqÛ°%z·œ$mOH¯+ÔrrG“Z¼GðHÌ•±'ccA–Îè¿*£Öx#Ø`]Yò"÷­œ{ã>ôÝ-™ùPEéaÄŽ`àÁÕ±HÚHø.Ü# ¿j¨”]x¥m¬J–´‚¨:‰T*ƒæ¨·l)ºjHÚ×K‡J ãZ>z=˜qüs è]ð1½Œ fúŒ€ÓüI{Ããèš¡©g_˜‹RßBÊ=çFž ·¨L伤•É1Í]ÄÕÄ'½g9(ËØ˜ñd™N_ʃ÷÷÷ dë]„\2bÌБ:mœoö'Ä·}Ý/Ódåå¤;üWï®a ‚Ämé|Ö¶I†.}/˜§CDx\’ B&ÛWR¬ò»ýwBÇ1Ån61 ûÀ—G i˜Oe"ïF+SÒâÒÁ 1%#7žÖ³!<-¢<©õÅñAN ½¾{gÄœŒØ+c·>+u⊔Eqq]êøò¬C"µã0AÌÃ8¤HδV¦¾–¹4›çÎׯ滚ËxØ(LUi$C6Îç<ƒÎ$°f.ÈšPâ°²¡C镃™›ÍmÉC Ošâ Ò•\S<>áè$¼ `à?¶øYd&!% b0± ~·ëðIÚiXcÓ•ªš|–8Ç”…rL!Ìfêf§mF«këÁnD_ªË¥Ðp¼fë'V‡³dMÜÏ%8±Q]'¡Ö!*h%¡&7Të_ÉCØsß‘ ½ß‡þ®“¤¯î!%TìFõñ#ö§ç4´+$ëT’·Òg]…iDÝ~™¬Däf¾7~,:eJÔ.\ mRM†#aÏõ`›ðll;]µq‰œ`3쬤wûѤ³ˆÇ´/…5€n-‡½{²Jû»°Ë¢²6^«"HÊ<.âƒ! ðNX*j¢ª <ÒƒÑSË4½{1XÙ…»£-ÌÇÑ$ @dƒŠäjïäo“¾Ô:Ë ß˜e-_8ÆÍ‹BI°(öì Û‘Å„_È3SWkçÆžÅ‘x¬>—>•…L'OÕˆž‚^œÒ4—è&zFãrV¯„¸`%@ÎÓ¬`ÀÛà€„ £{ÈÁÃcg¾Dn¬ßªH9;/pw°[ofê¨#?;>t¶’MýÑ£²øYÆyR}Bƒˆ ìI“>6jTB<·Ç–x,Žì¾mñÚ]~æ¾#Y“·øUÚ"kô>⢣<Èp}›‘C__˜âYÀî@Q‘’22ËMHt¾·Ù:Ú)„åÌØ”ÅRÆç-2_¡µdŠ•óݦ  DY0/QlåHÆT Ó혈SƒÚ[Æ íå0}!tŠíiŽ”Fxãìáç ª`ö'$¾Ru?Ó¤û/.·»¶óbTJ\ü›‚.NÍY‚ Ñk÷ÒkK/=KŠTº(žn( 4öêñz…Òg")N]Iüp×~;ƒÑ ŠVkëÎóç†%î‰Ê¥°Òí<± ùˆÌ^rD>ÉÚØûYdbB¡$³wÑ»7hÖö™®1”öòó¹íb˜VÔzz`í¨•Ï…MèRÇx7ö7«Ë0?½$›Ç¬@¦õñ¢ø—ëÛ£KñÜî€ynu.Å?þã?þñm³€YüÀ“(N„d³„ª„ 8V3jAN×W•xq]Û·=¼™¥Üé)l”„Œ‘2°Ds; *ɦ{Š tRн¸e“ЧüÌ/]oâW!|Òé´Ñ/‰*pLÍ _·Ïan5³=ñŸ8Qun/®!ÞlÁ‘ëâ?Œ®º|džéÂVqÃ_¼yS޶~¡ÜécÒ¡‹döÙ¼r¯õs¤¥JDá<`x‚íó¡ l­O€\ƽ#p¢ùÖOÛͦ_M è•rj…»ý »ÙW—?¸WÇ6èØKkVÑ@”Ì+ÙÚäú¦€ÑåþL)  ÏÌ$/•ìÞ~ S†ˆNÝÖ LNB¡ªXïåÒ꼫f\}Ô ÑU¨#£’¦·\iì!`Èf~‰P~Cå)9;c–ÿC·z+{¼Y`¦äeÞl¢zû¡ÂÐi¥˜•ÖÍ¡ x’Øã*WþY¤ žÐ/#ðì´2¡îH™9YÉNá´PðW~]©ò ²ó­W7Wð±øGLVùA¤×®²ç$„Î…‰OíU†ÉÏÿ8eP°×w%\Ø+D+¬{–GQR³ÐÉ3h¨Áu5œ…4¶T/ IU.,Å%:„T, cBFÉ5«×ñ­ºmÛ&{%2ó´†’9DÚX‘Õw.n¤Ú ^ÚJ9iä ÁËÉLý±kd+[ù^¾:þ1:Äã¶1-2)4´“ÓKk4³ìðI»$€ýa¹ºóf§¶r h µÂh@¸x,+)C´ÙKñg‰Y#íÁ-7ÜE:3Œ].Œ:˜·(2$ê̲ɧÌÌ¡Sæ Ꭰ`/íÁ»|"ó $**5í©. –6=EtAßLJÎ,7ÎX¬Eg¥áô†FK$|ù"š[Å×ôí>U¼àr ã¡Ä‹°MÁÝÜÁ µÊ‡í +,#Þ‘ïH{†Ô“òÎ H¥=þTיфæF¡";`]ØyEåÜ*¸ *áåÌc€=BÌn;¬  Ð`zòÌ1¿ÒIJà˜=çF@‰äÿ0- UI[èÏ´ö[”ÿ ]¢„Ë3¾áñv­›ÆÌ-¡îHÚÓ<„O‹ÕåÓÒÒJûtmåFñ‡)ºË|¡üÿ=4mKwŽ¥F¹‘"ßË2?¶ñdme¯r®Sm°£t/&7Ùµ¨vçÑ#å¸4Ÿ.uöÞ9à]\vn‚ª^x¶=/~Ÿ}2ùgiÊgéqй?÷»ëÕÓ0V¶õlu5AM=ËñP¯Â¦*¤m%} yÉ0~ð|^ÅáfUì~/"ÈdP H]Ϻp‡½þmØM –e†eÿæwÎó**îr zåX!•h»VÎ-ÀO蜴H†`éHZÎ%¥¢¨9¦ÀˆÇbø™Íà²õzDÓv”€Ìk:Æí¬Xõ3üh/e&kŠ Q¤¥"•!ª¦lÝ÷>þA’Pþ&¹‚<ÊF7‘µÁªù¦ˆ…È|Üä!¡@²‚Èt‘\Œí¯½¬ÑÈfK*Âù»¶4¦ù¦²TaA@´‰ iKð„ÒîФŒ^_#òT‰”¦íQå(ú®Æo¾•nÄhø ã͘R!_U®ÀFœ$?<"©@)&mëmQÑò ¸” µ;"ÊÛg4ë[â©='gqU,z‹Kf@/¢%–8/žH€–—~Ï?{&–õKü’‰gä þ,fö©ò…ôµYø™<ïÏ!´ ä쿎u$(îîÈÝçàï!wº,R' k«ËèïZrŒ‰)3:¾—X±0ŸD‘ìBÛM¢—[—£‘µütcùú Än²"wK8Ã%•„rCƒmÌÉ´†Okö\NÍÉÉв§És6 ŒYrG_øåfËq Y„¸i i.ïsœ\­ ¦8‘-„)ÌÀ#Ép¢a©î2á”ò ¸„s"À=‰Èãg±&?q»¦Í©›à'ky€+s?qwá!äÜ…Y.'Péî)Ò.<Œ,»ð BìB’ôºð)ÄÖ/\jMWÌM‘Sæ[Òvã…øv\Ê-Ì!ÿ& ¹•Þa£þ™¸h˜#%qÓ» ˜¢úŸÂjãû û|ü8Ú½€/VõaùDŠ,BEðUÊÉÁ"øæÍÉÉc…––AJ]È.š.ÜNºœxžMž_X/­Î»MÂÁäΉÇÕF@³†ÞPF§Àõ|nw,ÔKƒØ¨ÝDÆ Ëi0ønRL:}S: ]òY)Pˆ Q\…£ÿˆó[,G.©í–:J·Œâ}Küö-ÞëK§sɶ0>üþðÀ¸• ýÉ€öSÜv=ëã7ȵÓ\a]¹N—¶Iê4¬ Œ¤ìAwPÆrÖŸ<?9Ï+Vß¹@£ñçöøonVož¨>`]«7Owwëü•c3c9xKUî¹?ñÎitßêû®B,@dláŸ{ïŠë%AÑúª3íLU|°¼3)å†L‹’ÀФüèÈKïjûÛ{•¥¥â±±úýS±"ÖÅé²Xº¾¶±!‰µÇëkß~»þÝê[Ãû!ÓU8 ByÿïÚòqctƒbHòÇv;¾<µò-ÍXˆOð¾?<Í~…iž½Z/Èç6—C±¤B.¶°üÂ~I ²üû6@u€5Ë Xd‘*¾MòæIaÄ&£.p…¶g_€ôË>2M¾ÛVG\´_LMá71§q ɽ¼ûÜÖЮäu¯JÈãxY^¾,ûà;¸’dÛ8j¼ ØSÎIŽ>-1µÇfDÚoEQ}:n7±O%>k?–¢Ã>ì3ƒiñ<Ãa¡òú¨\™°š±/-Øú]œÖÏ&ˆÞ…™}†`Yi“r›ä E˜ŠïcD i²ÐéBØâ`¼¢W2Y‚geúðT)îSDê¸Ë•pBȽäûlèçä÷€wËh!ã‹Óåª #ã#LH@ûÍõÖáÛ|!a\RöÒ,c3kpî4:¼USÔù´!Q@-Úæ“²f›„JŽjûÍÆó´B†3ìŸ4n³w·ÐŽlu)MˆkõgV“yÀï/ÌŽüuV>ñ¬Üi_ _>/— 1è©!Vã}çµm½Ë>7û6îÓ‹¦ó‚v¾6>À$±â]¤š}î— Ù¼Å£>.B:í«ñ4š§C?é×QÁ~š§÷§¤]'Ë õ¼Œ<*ËÔÉüxúSyi1%Úp0Ã{õÃÖow¹jüLËáË9¬64™×‚Ò}x“¡2Ùjn·^í ùü¡käB¸cüšÍÜWæFsîøÈR”Uª7µöÅ_«Ëý.úËŸ~„_K¨ý_[ù²¬0ß,é¶¿ñínHUwC0•@ üáüâ¦0¿Æó=ñ¦Éz“¡8<¬—ùf‹½uï~ÿä;Ukþmðοô` @Ë’d4 bO·­!ˆ«R“3”‰g3â{qÑwÏ­þæ4L ¨(.Ï&£6 ƒ‘·NõÔúle*ÒEbáÜ8¼ÞïoŠågâã³ùËx Á§r¤+g<ÁÁlId É…À$¦Ç•c÷ä7C]Òš OE=P‰, xBÚ–'Õï&;5¶Dåw dR˜Cú~‘_¤rù ‘³‹Ÿ±usI s[KTŽÂŒê~qT²åÝa¶ˆ\ùÝ?|ø¼r¼ßzPðåÌ„ðx9 WYLCá\ºš#Ç£ýF¶• ñý.#ƒr®Ý ìÅç¶ŒB¦C=¤J¡±)Ϳ¾’»I1§Sì"Íšî!ìéR-ê2_ûÝXÞ”+¿$·£Œš²ø¹Þ¸~$³µût;÷ ’Áwß½»[™ùj|û…ßæ% É—m~û)Ì52«sïoY7Åx.°2L½h%•°.„GµÀiå„Äô`õ™«÷Èâø{ÔßõêFuí³€^rò”QM6±š€:nØ“!‚ô÷¯8<úéráöZÉʾW¹¯ Êý=Ê̹$l’7÷ô%ÌÝ6q•:L~)®€ sE·ÆÑA ÁÛñ[ÒA 9ãžÈã‹oüÓÓa^H < !'ùÓ%‡UÀÐЇCЧ¸ÖWéŽ+òfÌÈ’”øÏ›=$egˆ†$el¢HŸT &ý°“™8$ˆÉ&Ûs·U»&]˜Ïáëµé×kSymª¿@jø¾ù÷¨_è5jÌf!Ñy¸,݃)*`ºðJ.‰’R\Vº#–Êçu¾0å…0jË]1ÑUùSç@¡6üÆÕØiʈà.{ÖƒìZ´oeع¦0ó;±päÚ¿Ö!‰s1ÁŒÈ°6óaD1uvÿrŠFþ]/’ïO`oÜ©DÞñmTo>˺ϱi¹¦æ¤ãtÿë#-(Ä€yæí9&Ãä‰Z/‹'ÕZ¬u£`•ÙdššLû)…€æ¶ù"m@îl¸¤Nx)¡d ÅeÔ*IåL³8J9;N ÜBöB§ºO1d„ÏióÛ²ÍÖ{¦^Y…|]ß åZY¯žœ¬¢G¹)„U—KÔ«÷Å®ç\©x°ðð—#š¹^W*Çá;" L r/N„Gñ=|Q¨ü.Œ»ØB5²p-ª`í¾ƒ#-n¢X¯>Åu ´õê“êÚ?KawÇé9P#l‚žÕ‡.^à„f“o§¢ªfÂk™qöJ4:y0ð»œüÙðMÓMMÂQ†²úìFû—‰&£†Ö!4 z>I„a—_wÅ¥æ¶ÿd‚y±°ulÝDºS«—í}S·BÄßÅÒûëþÇe$V%W1u@1Ù¯ë§ÕoScª~18S—Ó|›þJ{lº×œ1f±½6m>Õ–û`g¼;åe:çý9'½Dt6 1 ûí·RCJƒèÙ¿Mè]¡ò¢ öŽáƒ@_T–šàvÑs½Au®µøâë⛽ø^|]mŸ~µ½øD ­çÜUv”¤ÿŠ ý sÈûQ~aN w¹K§ÈÕá}<,_ÇÕs©ü[ÿjcyr½NGyøòä`d_í7Þ识ÎÍk˜ïo±§kÐÑ““µÕ³3|?W×øŠwÜÇÕõ«'ÕUL¸¾Aè×™…êc;VÈÝ%˜â¼Á]LgÉ‚á-YPê©Ê¥ñÈÄ~Ã8šuÌòÔ)¤Tæ-BõQÇcKÇЗáâ0 _~~r…hÌ ä·aoŠ×pL©íãÞŽ0|Dö1úε-ÎÅåø ”5túµ-²°d¡|n¨ Í#›&6ÏþœÁÞ*èæÜt Šn°u`!VÿÚºõép¤ï¿:úÀ¶†¾øž¬sà߈̫tŒT @ ^Ô”Žë¡Ínÿ½ D+Àv ^t|Ö!HmÕ[\Ñ„m~éN..U¥xYŒ¾uð‘M²- =F*‡¯’}qi[W·•Kè¶M GrÃhçYØJ¶Èî2 nð ©êq ¥O‡áTžÃ>ùr¦°N>w>“]¹Ô ô)Lt!³rÿ“óÐ/ƒ‹fÖÞG\”²!*¼òK³ŠÌÇjÆp V7C¥2á슣%æ“îö?ÏÎñí†ÇOtã@Í­=È~ϲoÞ¯ì»ÃÖØU^½Áç6žÕÿú›©«›k×{÷y/+?OeáÈyµz{¯õ¢}´ÓzÕ<.ž,¥–rÆ3ôSÓ’BǶÏ'½A²Çfä" }Q¯K‹oÞD_6·å»æ6g\„óiíçÚ±ØÙ;<>8ÚTOÙÌñ±apz±Fþ¤Ï‘QŠ‘jíž‹û/ «ã¹ÐR Ú­þÂVeaRØcHÏw".ü>°×,™‚/¡ñ—î]“!e}qëNÄ»¡{-ì EU„ñ¥EöjèxP­êž¶~iµ_6¶·wöÛÍÆóíÃVz¬_×öÍ£öa£žü¢Þ>H~± ¿Û̓úOá›ýŸàmë%T~ƒMÙþe¿¶×¨ËTI_ÖŽ¶ëÛ;Ø\Üu)Qûþnã…Ì×sÐú^[¯(~•ÇäõúÖR˜ž¼²^ÇtF7ÒwxÑÜ®¿yC$€Ÿƒôà…YÎ *ÈĦկŒ‡žv®Ú$DÈÒCO¢)‚bb <÷BÛ¹¹ÑÅO“R&·*,D¤ø­.Ìj;nC#Û¶ç¹8x°`›µýíÃÃÜYi‘'`"ž€\.ÇÏw_í×Û­ã£Æ!ÌëN»¾¿ /*‰?ð‚.¶Èº÷ƒvgØCÊžs¬¦‡ð1¤cÈã`Qt8h½ÚÅn¯‡h¿XU’ÅÐm o¢+2ÒÃóBž}aCM ö9V²ÃªDuƒí!įå_¢öX`-:}çb_QjWE[·ºTKôm«‹k‹°âÆ¢Ïø@›ex€‘&w% “• Í¹E¾TÑ öl]ŒÏÔ±ú¨Cærÿ°ò¦Õ(iÀcètxìÊ9´-íØ#i|ê)n•¾):¿ƒ r´jÍ-¾C·Èɘßw” Ë }ð!­¶ERÁ¨ÕÜ`lhBñ$yÖÏÊ'ÝaIçhçÿ^5Žv8áöN½Ùnílk¾:<:xÑF»èöóðf­õR%PH±”{Ÿ“âÄ­?®³š©Hj8Núh±ÊæÖ˜ø±aNúͯødí›ož ÿôš¢ÒN—¾ù&ÿ–v-„¾G‘Ñâh ü(’È^¯«„õ£–Vç>} ÓÁ@¥­²ð‚Û¥ FfTWz²æ³µTpâÒP:Y©ƒE¥éM),EËóùV2šW§TìÑ{}‰ ¹4¶3m8ó‘Ü¥½ø°œ•s'FÞ:H …ÍéÕq£ ;ÎÎn ÖY)‰@(™Ò-ŠmsxÐÖ»ou7¢‡Ê%‘|ýÄox‡£C ÝÍ\7„'Ž"Gè}p<–€ HÏ™ðF ï0˜m›Ü¯ärÐIë®0&­­zØ7œÁˆAn ì7Œ6±€Ê”MitÍf}æ4%Ud Œ„¹ ºåsFBI×T#Dc\ðtÁwÐsZã_’þ§o…mu.)ÓØº8îwh_c#ÿ ?¬†Ú§u'¨ŠÔ-X<±_b‰Ø”Œ€TœÈ¡kgeq‚ÿð^æCsouÈÿòÿÀáÜ9ØÍA¿„õ,Góz®+Šø©$ÞCƒ¶Äê3ñ1§Rbq\0ì•™Êîô-ív]˜ÜhrÞw:(sî&Ö2òœ+klc٤ϪÞýöÛLU+ûÅs3Ç8¾Ð7†mÀn 0eCÛˆya{ËÂ’O¬­U¥w¶ÇOZUÿ„º[“^Ôÿ•©M‡—;CòlÒr…º+á+_¥jd®d‰]׃ßP|ûmÐ|h)^dMÔêH”,˜û¶Qž×ýɹoÿ6£¾RVÂh×9‚ž»öœqDÙn¤)Èí£ÕšG†ù´¾æ{ÕzY ºPÊ…¶iÈC°Ò¦”‚ÏôA÷•®ãcg°yp;Êja–É|-œ ÍþÚa«–ÄâÒLer™-Ãr³0CÃ5N‡MI›l"—Ën—˜t§ßnN­ÙšŒÝ‚Ë%¥J×N0p»“¾2¬òåÔ¡O6Ý› ÑÈa˜›iW¶}œ‹›o´d<ÉM³[2žäfÛbæ²ZćˆnHËE‚=Ò-=£üµ½ v@Ï9T’M<Ø2è<=¤+ad==à8´0}JâWs¬1Þêa¾ãÎ'H7¡–·B3ÍÏÔ¨³X™C£-`èCŸRÊž¥°1q8,ÖW¡v¥þ¡ ²7 ¼ÈZs¬žÜ5ù&ÛÈ¢e²Ö܈æôÆ?dæÈD;ÏcÊÇBRYX#ŒŒú}CÑ(Ý´ï^ã^L^Ëè=ëzÞd$/Ê}{¬tyM—Qî°"jà>šq?´•…Á ó†þ¸N÷ó®¾µ‡äû7U"y¤ÝÌmåOã·&ã´[|nFÍd¯6|ÛÔ) ºB£Žþx€ÆêÎ'Ÿ$$¿±uqawû)ŸbLê Œ66Dum{Äåã)F\[ž¿rîâø“ï1*Æeoh*°Å¹ˆõÒóüsجïäBöGæ ª¦†»’€ö(ð/Õe²i$#vË»‚Žýª3¶:ÚZ"ƒ!Ã|hkéEèQä^†Í–Þ•Tò°4ó »¥]•D‘š,=Aº–+U¿®×ÛÏk­¼á†³šJEævܦo¿Íº¼-•¡–†|õ—;õŸû J9½ÀNDF· Ëh òJ£¾¨`ÔtﬔK®C]pààcú´ Lù$Z8 †x†¶.9µÆ›r¬\â{5x¨nÊ}œ{$ºs Y²"d6Ø€1ÛU6êÕ\¢–¼´tn–™¡°A¡f‡:BM3-/CÈQTc÷ ÂÜ0·òKæ×?NUìÕS‚ 6C C“å)st˜Vr’1MI 9·ðè¿!þ«#f3T±´ S¨ëÒk k³åry ?Ã|¨=S™§0žúœC‚2üE] ¢LÈ–êA }ÕÏ«Àu´¢Påó¯¼òò¬lÊ~`ÎQ{hy£³„…EËr†T–¥‹"ÿèVNoññÔJáèŠ ÖË)Bár9-Š=Í‹m‡²„*À ÇP‘[ßÚ~57‹‚á,<0Lë¥:+M³ì%þõ¿fÙû_kº›`s›Õš7ÅÈÕ¿¦Ø·çãˆú ž]{pgåÁ—­9¨ÏPÀ<‡Õõ¸Ö ž¢4¨Õ|Õ|Õ|.A'Ye°ô>ô:mžÞŒ+½YU/@ƒPÿŸQ Ô¿ê¾êféê•|ïû'aõA=E@¥¢yã®~}¥s1œäî©]øªSøªSøªSøªSøKê’9âWÿáÿÿáO¨„¨OÕAÔU/êÿút ø!nþe]YUË R:þ²ÁxH„öêS®¥èÜ£\þ(K æô£õ?ñpôx“ñ<”PÈ'¢¬ýTyÞpTú˜Ÿ^ª!­§Êê…ÿ“v&y¯<ž$³&Ç'”Ø‹- qrrv†’íU šñL|,`KJ¦KôóÊó©Ò|š,?¯$‘ãSDö˜ppû"Iˆ¸’¿èüDy•I'.SŽŸ*§§ìXÓ…÷E`ÿ]˜SÜì ƒ£¬¬A2"Cmx‹‡må˜'ƒ1F—3¬fÖç}Š›\|÷~¨ûwíÔ{ÆY+Dïûí£ãã†ÜS6ò”m|ú&ž¶…gØ¡#û3*„ïæal[ŽlÊ)[rh‹ öŽÈ{ðé·Øî¾¯ÌÚVæÝU¡Ë‰{ê…›qGð¹÷Såu‹[‡þâ}³fƒVÁ×}óûæA÷ÍÎ…kkãt¿î›_÷Íÿ¾}ó qÛ<út·ãøþµ3ì¢û"¼ÒóEïŸGõûçQ}Þý󨞼zŒûg¬€Ï¼|‹rìí€ôžþ4ŽwöDþïÐéQ¾,ÖVWË‚ô‰;Ûr¿»ß†º4¥9_wÓ¬»)o¥G°“‡îÂú öÒ9÷ÐÔÍÒ¼Ù`ì´ÊµÓv I3õf2+Œq¾(o¼'< )é S˜÷aUÛ;»¯öÃZ)†«rzÀ;ŠÈ#‚"ü:d¦<;Ù § ?`w+(€VRûøà Y„eqÑùOYÝ1#°Ç¤E¯t àÉGR£«'[ùÊ…¨¬« (¶õêy븨”Îà¿“3de,ô ñ˨›z½¼¬ÒðÝwâ‡-j¬ªŒ=¹Bò^„¥DÝ ,Pb!¤ÄqqÙC“.·Âeì„ Š£‰éÅïFj„‰´=«/8ª®‘ çvßV`PmDž¬Ø]80Zj.TœrsÆÔ=‰2þÚ$‰ƒÌ’Ó«˜;ª©\øÁóm¿Ú{`¢ÀÈ¿“ÁÒ…le|½ÉeUeYô¬¾o— Iˆ äç-ÕÀðÔèZ‚™”w¬l?(0ÍM0¬*ZìºÉÛÍ&¶0A6Db™F ®ZÌH™6>ò¤ú}S†@&¡!Ÿ·dêÈèZäÀwé 2¦\¡þ« ±þ·v¶#}G!ïÒf°½I¿[Q°¨¸@“U”åiŽ -˜£ˆ = ¾ÂŸ((A8zv¤wT¹‘øØƒjàt˜8–ˆOÊãHœ› |£‚¿[PRî üÚÊ+/õ5å×7++ùȸQ‰zM=áŽPœ<åªIè‘wÀÊðoþ4Z¡Úî[ÒÖx„¦$°ÆðÆêtV–\«—€XK ò‹k%~S5\ehøRëébp‡aHJ‘ƒÃôÝÐîïàxg“!\èÜð»À+ì!ò¯3K I IgŒEÌL“ªù d43ÿýƤB³d,2³ɾM6x¸®..¡ô®¤2scшGâ_¢ýŠmá™sêÏâýÌ ÚÐD͆m1x1ùŠ*¦P²dl#¼G %CÁ ù¸î ñˆ½\™œ÷ ù ×Ö‡µáƒ øP%€c˜‰ÂAÆÈ]tô±»Z¥Àî Aç—mƒ©€³­'iì‚¿ž ú„[´ì°vT™=G½ôÑbg–Þæ€Žeä„a“Î9h5óÇ­ª¹ƒîá×(4m£êðÐm3#¤)Ä’|ħm}øöu>ŽIiùf²‘nÈÊRPí’Q|Ô¾ŠSù¨ùƒ¡Þ~ f— ™Qu;“þЯØq1ëfkU~îëÃ78{v»beâ{+7£‹•sg¸B“ïË7¾!Ž5°â¶hå*ã‚"Ë&™‰Î§:g˜¯k¦`NäÙ?ÚçXä˜Ódÿ apŒaâX¢lê0 &Þ&Ï…»,ayþ¹½/ò«kë7ž<ýö»ïùQ=/~ç7·5µýÙ°´Ï#QðpÉ-‰È$ÔÞ †)…û‡ÑÜ,” è¤p¦’`ŒÅ¼LoÏaÿ~—“ôp}I*obŽcsDBŸƒ®ŽŒ¦5¸R˜Cêqd8¡ÀQry ™“ñŽï?D­fø—kie¥Ca$4ÚƒhJp|UƒZ¡%•ÀZ˜YC‰QµºJâñ(gˆ ž¾°GFxB¶µÖ£J25¾c?VŠŒoŽ&^߆ûØ}`¹²\¡n/‹’ábÀõi3º(tÆ’ü°HLÙ5¡Î-š0Ù~й0Ýõãõ¸µ?VÕ¹½¸v†ªEs•ÍYÓK§öëå²ôþËCçfþÊ SJMÚÊžcÄúôG™+~ð‘ñ3or"CLO†¬³í"¤äØ'"òC\"ý¼Zå4ê~)w·îX±lKÉÅÅd©äd!Pì%3ý¤låÀφwñ9¸íäwâ>¨AÚÎâ@˜Ðä@‹’$\¯ë (¸3•‡½½Ð4ÑfB9i3ô9ØÛ¬†Lao&ÍT.q)¹¦t* %‹RQø¥IE‘7¨(eâM#]†ø_R:]|8þ¬­WWW+7 "-øpò©6¤<ô>ÝØÀ¿kß>Y5ÿâÇÇë¿ýkëOŸàéøéÓÇÿ¤äoןü?ñ—Hî̪þûùY¬<ÜÅ Ó=ª»£[¢u;%±¾º¶&¶­¡c÷EklÏmïBü£K~¼´nnª¾ýå;D¹Þ÷¥EÔ7õU·ëôn9 w×ÁKÌóÉX*Ñ}·7¾Fyœ£C¡|?šx#¼$¥ <Å¿xàîÙtù…÷– Þ_@«Ç›oÄ9ÆcTMñÊTGà¤ètl,ôƒ¦ªW£‘m‘â˜]úGžÇ)2ßËÑ:Ø=~];Ú–8<:ø¹±Þj-øžµýmJT{uüòàHl7Zõf­±×µfS@®£ÚþqƒÔ ¯Ç/ÅÑ΋Úä8€LP\Pô~½ùj¶UÊר;l6 ’ ¿8À(Š{;Gõ—ð ö¼ÑlÿB•ï6Ž÷wZ­*!öÄÎÏ;ûÇ¢õ‹1Úõ|G4µçͱ{p„ZÛý_Dëp§Þ¨5ËÐè£úqJPŸ pçH 4H#¶k{µØŒ#Ê*¿b¯^ÖŽ[Pë‘à-û°{t°'š-l¶xÕÚ*jÇ5Ì ã n•!ß4ï[]ÛÇÿÇôPññQ [±¿ó¢Ùx±³_ßÁ¬”þøà¾jÉ eQ;j´°ÎƒWÇÝM¤"«€ë¤*~Âð=ÆAÃÈò(=MÐÕïM|Ûs¬¾XÏq|£7u8”·ÑT ä ìX(kÇæoæj‘þ†o#hñ¢A²b ¶´qt{¢TW`eœ4(+Kx\9ˆ^aõ{tÞ ÝÅz6e“ò#iЩŽ:¨Q-´ A–ª´o@¡\j™lŒ¯C£HÚs´kpƲÙÖ;[ ¢|8Ì C G«k?©Ã2:—‹ô/ e ”1šNTs†¥1!xΗçKk[Ž*‹‚¿rrò«Uù½Vù÷jåûöÙÙJ{å¢ð–”‘mï¼1'd+ tvŸÙmâ]®I5/ÔCÄѳDyxØ9HZÐ3ýï»×¶GÒqaT¨"Rå±oØžódù …ËgÌïO‘ºåÊê;]³-áûÓõäáÿ”+AOñ—ºŒA˜²T*s%¤ÏÝ|›W\L™SΦ•<“HRÉ$Î2뇇ÿõ» ‡ƒèCQœ/TT¸˜ÉhÄù×Ú9ac['ª ˆkß®Xç®Ý»¸tþó®?º£ß<<¹º¾¹ý}¥ö¼…½xÙø×OͽýƒÃÿ;j¿úùõ›_þ½R0 !Ö?s†v|úIö¾ŒGϳ(>üÌÃ0s†d©›phài#>äøsLk|?y@6ñeîçwãI»Ž\‹é Ìö[pô¼ÃFr’>å7—“tÊ8›*–Ü_&ùÄÌ! Ô/•9˜Ã0S,‰0‡Œät/!åK8ëáYvÁèÞ}WšžEÕ™„(ã‡âŒú–4ÿ¿M\ä62Zj„!’H”¨9HZ'K?ž…Ú©CÙ¢ e_@9'øaÔ?ûdíV„;­ÕªqØrM¸šâe<^%KÏJáPôôŒÌ͸_Ÿ¬[Š¿Lë–jY¨[*cJ·¾^Ð|îûŸßßX­Üt*î•÷yî6?Y{½ÿy²ºúõþç/yÿ¦ŸäûŸÇ_ï¾Þÿ|½ÿ¹Çý¼ÄY“?F¿ìM†Ã[¶|„™¨’ìf2ÊYžÞ€ðMÆnÀS¾ëTG—Ö¹=–î3‘K.® ¸º¤ÿ-õªU/=˜¨zZDZ4ö˜B—ÍDy½Bƒ¹“s7õ¶*o#Œ»ÍE=»D›PH1–Ãz&¬p`Ý!†)~}Ð6ì<™“MIUŽÞÏòÁaî!"2R!—SUUÎÐ&ˆ}ù_í´vj{°pÚ@âí½Ú¿ŽÎÊûõÙò4ö)Ϫ´£¢ÚÛ˜~÷¦Ô©ïÓϹBW.êMH˜Kª…:¿™U´X\ÌýøÍæøÏwñ.žáÍæ¦`·ÿW™ ‡ h³¶.wCVUd¨k·á”a У šÔXÿq½­ÂŒ&¦•à g”€ÍElkõÒØm eQ]c뜭†ÙÜ9 VFo· ‚j†4[…ú(“mrrÀÊ/©ÄKœp)H”ê”ár™a8¿³êܾ´®Xõð†jG Š­B½kÖÛ°?ðGxö x9}á(&ŸéÏ”Ô|ƒ©eýèÌ ÝÂ5ASþE1O¶ zx7qCÛf½YP)¬so U[C†x’YUýXC¨Ž^Èéc”IßÏk­z>ÿÔ®ïm·Ñëá–.¬ÁÏÛ$(t%ÏrqzÍ¿PZ@¶c6Óõ´l`U´‚pöZ«˜ºvã}ÃUµO\íÄvp¾~ÆVÞ&µqzûÔ”Žýq¸­‚ ®RÈ•â7x›zŸ¼-¡ÿ“™ÝŸt:¶ïdô›Pn`ûÄoŠÅœ72)[en†¼ ?üØ»e ü dÄÆ°¤Ùƒ¾Tg2j ¤§hבðØíN,T ýø;[f¢O ìÞƒÌYäw¼Ó:þ“È=n>)ùaßf‘_Á&b¨µw'ÄèO¢ÅB wíÚϵ£6»:ÿ)„†U4ëW”æÛã{Ò˜êÖ|4FT™Lcᆦ52yaY6aEúƒ”…° ÊÀvÞýYûçÍÈû´û'ô-;qirLÙIÍÖÞ•Ù)8ÌÇ6E¡º\RÓd÷6a};I…{ñ xի㣈ü94…`h½„I1$åE5¸Ttâå"Ä¡ümâxòȪÎëtÖ^„òØÜñœÑXœ».L˜gFHfìÛý^#Ÿõ¬aç–fñ)ÅÔy}¥r…t·-=©k›$zn ô2¬5¶ÌÎ:ºD\È4V‚ÀÀalæG¸›²ŒMÉW7ç^7ó3äPßõâºã¼Œ¦íÏYGˆ5ñÐ ‰Ëüœ+‰k|Ð¥¤éd-…Fùþ‹©˜m 1ŽˆÊõ'Ë8á!øôkêøÏ’vÆÞý×S6=~8¡Çhô]É3¿ôž5[¿ÿÎÿvò´ó¤³a?ö×ýµÕüüìì‰J7„ÆÃ…ç?=ó7ÇâÓÓéëúŸD§×ÏE§¯ëÙéTv2™m¾/)ï ª\wDå:ô\ÓoTë;7ùnÌA¸æè|z­×þ,…XÇ.Ò…NÎI»¯ë)´k¶úaåiôúÇ?Ú;Ç)ÄÙ¿qæTÈíè_¬' å>žƒrCcó H—p"ƒŸ‰xf2&âµ[QGjg{bŠëz2…´ìR]Ú ÔÁ‘/Ø:_â5 •ŠØQ0 ŒOFÉö`#zeõ'vDJ·„°ýÿ‰o  ï¾ø= éªëôlŒ í`ï±¼àöù¶×Vz,{xåxîmX)ŸÒk Ø×-£.è;âh¡c×Ö-wXÝ+s;ñþ»‚¡Â;cеm§.褩ŸSÙÚ%½¦kAÍõoœ:S ¥TNO0!ú»ˆÖÛêÞ]0^œ&y´.GMŠ˜/ûî0˜®ªZÿ]ÇóÛðr«p£yÂȳ¯"ðš…ÍA.¹4¬¦„¤ô‘pGª V¼z”7@&£ù£¹#ª0]„Ô‡½c@|{àLH0kPž=À `5‘AGYs'  Š‚Œ&û7L#x<åžÃ–ÂCIpãöøÒíúdu„¤–<‡Ð¿‰ý^[dN¥tÈŽÏϸÏw)¾™ƒs<®Ï\‘Ò+@k6ã„ÿ.uîÁr11EkìŽDÖ‹À&÷CÂsˆÀ"¥:M»nf™[ÏÞs¶^Ò+ŽI\Gãñ²mdŽÊMeUÁpħôbœ>¥šô°Ì¶&|¢dh/·15ÑfA‚fŸ Äa»ÕñËc]á5‰ãhlA<ábõ27ŠZ­‘1o¢m¡Ðº7ÉY͆†'ÍE%â~¬¨‰‡‚ÿ¡¬h"âC€Ù\J*dFÜ4è uÜ|µýLƒdEóÌ{÷;ï=Þ¼ZŠy·çŒ:!Α>9 E†ãëœ'†ŒÉñH25}¢ÄS’²WŠï[…[Û7¬qm¥ÈH/"޲¡• ¯/X¬´vk•åID,ŸüììÎ;Ô3£j·°dyeœžÜ%`JºcH>p๒$µvZ9ìñ(MÓNB‰Ë} k%³¢­3›=cÄدŠZß—=•õ¨“ÂÈö]ËðÎÈÖì1J˜>‹÷É"'J§8*œiÚ‘ÛT4ä&ëU92ç6»صtCÃÓ4ÓÚÝ Ñ B}0e©ñ‰* ˆ¤;é\ÊÑL`3ÀÚÔí&A{5Ú´âH¤ 4AU£¼!ãmEP_)‹!Lòü°å(OD°²p8±iÜŸVDÂò šRŸx‡ ÃÎl sèø}¢²CÁñ¤ñ¬$~éåÃC)îÀ(^ØCô4¢–….M¨ëï˜$ë[m,Œƒ'Mˆy †i‹&;ê/”`l$ð§x²^}²°xñ|g÷yÑÒêYyú.“šrÊN“1Oh·É'¶ãdm›¹ëdÈÛy²æ í>Y3Ïß6cÊšÅ܉Ró¤ïFSIF 0© Š“\ N‚€á3’`)­ Å´¦¶ˆº9µA”bj{tŠUi0õi Ò©G¥hî·[ÓSìý´Ý€E2=Qc¿u\k6g”TûiÚ|<£EçÁ&%lCu´Röèe»öêøëK­KVÓ~ÝØ¼Žá–B~—¿ŠË©dcNƒ D%GÓý6HpçN·xòk{ùM=æWBÄ9!LÛ³÷ë{ˆà{,æH9$‡¥(øŸl%b¢ŠTQýBÊ-$ÔX åÛuz¬º!AòXØ»,C‘õG`‚y¢ÀÁ2‹™yˆt.q™HÊCÕœîXSs¨âËcåÐ!áéd@,Їծµ"4MƒZ‚´áÁó:%¹A„.?³`“ì’…±©T¥h+ë(¬â\ÃßõøÔ™•Êöµw[A£[)Ã05Kl(²Tq800†5 ^Q…Í}L­ÆµêF5>P–Dm(­_Z)÷ ᱚ™+:\Y«É8bŒ ¸Õ÷8­+xà[¶DmÁ+ߺÜ,åɉ8•<¼Í8.Q4hÍÎ’¸«pàçð´}e+íé|©ˆA€žÛH"ê„§êO<ï~½,ü2. Uá­±çP”˜o>DSlx¹ÉñVˆ[Î5tol|ôŽ•ÀjÏ´l*¨¨*B‘çÊ&âΧªÔŒ°ƒ—è¼[&)¹xç“9§lyä„ìÛðœµòþ%úî*5Mß½Q ­ÝÉ!cþCUHˆÀpJFéw ë®*±3O¤– ¬—ÞÏn+м²Èd-JÊÇ*S]“_ïrbj‹éW½Ù_Ï•_Ï•Ÿã\9ecV¦f­‡“B Ý› ɨ t»7MÝ\¡É(;GGGÅ“iyÔ¥©(JWe2†÷ ê9¹XË£lÚl2G„•ÆÑv§]LÆÙÄgµ0Óíg¸’™5`Ü)f¢¾3¶#&Æp o© ±÷¢Â`.Ë=éŒî„›@ç8<Ѧèôº1±¢ÍTr"BÂÀñùª5ã(Ýçý_ÿ„¯J¯á¦øOž¬>â?=]]ûŠÿôWÿaÐÏWü§¯øO_ñŸ>9þS[ÕA·AGÇYw6WŠMæt¶ÐŒ †\¥!¶v‡Í¶tgEææÜ³_4ùlü#{Lã÷”n:wn:wm¦æ™ÆÕˆ§ÝŸ£Ý‡ŸÍÃÍ4/›ÊÉÂ|, ÃÛT§ŸA®ª«¾ ±êëÞðî šc¿jíµï½5$šu*ßrÓð­!z‚KO\­Ø²Å2›Ú+ÒBU äd¼àêC2 lÊri]ÙìòG¾‘ª|ËÁ(ô”Öñ¥‘ïέsÔVÏñ…6!šE¾H°QÝnn2dÚ¥Õ‡A?a âYêš?É–-á‚;˜¹o&ÞmÓãÐÝäó¾¹]¯«te /ì£éÜF½Ýà çOÐp‰ˆH;‰ˆdc–&H|øÀô9uIO:ÞO),MøŽÜpŀŮs£¨cÀ8ïHƒÝE«ôˆAý5+ª 6:¦ZÒÃòüU£¹ý×Z]‰V 8?s¥)à¹Ú2­4ʃ1µdUj±È’VYÕ uKöÕfLËôåöuÍ\Fˆ«ˆg %?cŸÑÝÐÑQüŸþØŸ\Xû'ÃýïêÆÆ*Þÿ>]{òíÚÆÓU¼ÿ]ÛøÿçóÜÿŠ`ÂÛk³RøvŽÇ¾uk{ÕÔ˜q•åJM¥ÂÇèmoo{W7*ðëI?~‹¿Ãkkðqí‰Øõl[´ä-¶GÌŠ8PæÙÁ€õ¯=Ø×PœßŠ(Öþ\?[“‹KkHeòó±龜…ª‹`bázŒZ„‡&þ3pÝB×Îxç‹ÛÏ “ê»fÍ.Ã÷ÉP]L;*¶ X…‹–î>ó y5Œ÷Űèlï …²à6ï©19Õ'‡"®]Úý‘°:}·c¡Õ'];“›*9>PMlEÖ°€FAð\Y©Tí¤yÜzõöÏ;G­ÆÁ>î$d?^?ýÛèÌAÓe¯ÏÂãÈýˆNê*/ˆž5¶úx\ÙDCQû‰­ß—Îý("jÊ•I "X‹ÍC—ZâèÌB‹&CJE,­éÑ'#ãnq¯V?:¨ì×övÊ¢u|ÔØµ˜vp‹b;qdsÅ"(˜ØŒÛï’7? ê6Êaä(1êO|Qì' ܆-Kw,ý†¶C^즢'›KÏÎåv—Xò-=âþÁAwë7Zcë+ömëJYÄ[x\ Ç#ŹºrßÙÝ7Ëh¼ƒYÁÄŒjä¹¶ˆ_9îÄGˆéÓEMUØ0Øj„zƒœŠ<JÕ`ãam—£1yT"[J`IpÎP, ö!4ßGÝ¢;£WxAòäŽ?¬¤qm²‹>·t8qÜMN3仫¸År廃s,„68|ì6ÞT ‘|Â|µ ‘þùS¶-#ë~baÏaÔ6ü…œbúh‰B^Q/(dbƒËõhË~Ò-1Ÿ"ž!°eBæª?Q" ¦5Í p¶òùÓ¾)††_± Þ»´¾ÄdY¡¬ "àGñ8¿K2ÍÒÚL±¦éÉ™í:HÚí·hÝ÷ÓÎ/8¥ÍW;³%Õð¨‚bü²¸´^RuÇë’;gßšÕ·^=Ÿ£ÙZ%«IjÜæÒcn_|\zöV¥Ñ´n[FbNj ©Éƒ¹Ðcœ4“\ŒVô¡ž–T\ñH–„ô”8¼Ž§wLŽ:ìH»•ã#üpŸvkÍÖÎÃ¬àø²I–bxb$̳…\HžÇâdéi|úœþØöd7c= ñ+„ûo·©ÓNM1åå'Á±"Ç –ð:`øvÏšô1²÷IáeBE8¦| õÒ.0Â@àðÄÆF¤§jwAk ¬Î$'jß7@dþ‘èjaAn‚1jáYÐ…Ó¡îù© r£ãG•„ÑüŒÿýôóÆÿ^Ýxüíz<þ÷úWýß_4þ÷Ó¯ñ¿¿ú|õÿøÿû¯ÿ;À>ýÓy  »]† ¢0"bèZ€©ª)×zõÉw8Æ ÄœNãOG͹ձ¡ˆ¨ó-ævû8Ó¬.í[ˆ´0 ­P2ÁeÖ«ëF½œU†Ðâ™`¦Ö‹®µÍËìªÕ‘×#ÑNͪšè55åYÞ¦cq˜F"^MR:å€kÈ­‰Å˜æ?µÿýï§«÷±r€•ÀøÈâAËQ ©·%Ìæ;­ ')µN¯†,…rL0Ðã 74†¿Šá—HZLñá‰'¹ˆ¨A0ð)>ÁRi CÂÖ_Ü]ûÓËÿÖM‘€àТ­Üÿ0]þ__[]Û ùcmõÉ·O ÝÚãoo|•ÿ?ÏýÿÖÃý€`‚?—ãñhseåúúºz1œT]ïbEIå+j?²ë\:WvœÞ.ǃ~î›åµ~Ù?8l5ZôEˆÚà Û;ð ÄL;‹%z±½Óª5QÆ“ ·iKñE(µ´yb³´Ð eb˧ŽýHEIûä®Â4 AK¬•WÁOñ#O(gly CQYEàîpbH(0´Ð-E+å ö¼º—cu³Zå¡@(ðnb7^5wb}AIÍ;㉴»u'´[neϨKKö;ž]Y^ˆ(s8( ƒoÛ„±¿ñ¥]5Òª}4Eõ,¾vä 5ýUk¤ý1 ~”ï·m9@d‰(¶DµZKÅÄU—ñŒ²ßÉYëfNž£KŠëÓLâÙ\äÉ\2<ýyáM`rxšù–QùI™ê§$g¹°}‘Oìn^-ߟ Ô=öÀíBñTÞ&þi@ ™.KUqÇ<,è-¼h’âxË,(&ˆCÞdh4¡à³ý¤?qÆ\V‘Šå"ßò%³+ÂA<ÚÈZN_CÖéh TÞ®Ý Ö•·X#ϲJåÕQƒ– CÂIfL—dá÷`—èòAO|×îÐIöEÓ9G`}çÂÒ‰µïtìaÇæµÇO4_6¯Ö«k¸‚f£¾³ßR4SM­‹ÃKèÐH¼†YÀ2Ó’½ÖtGöïi ê—ž+’Úž/‡$©>Ëí»â¹ëÙý¾“–hŠyí ýKg”œä‰xnAm0ÆG¯êµ#Òã©\BâÆqÀ½åýtȺM™¼±ª •Áˆâœm´ä–LôÅþ+Ñ´}t]xA {Ú¼‰ó}1Â'þ%u©°ifyÏ„´%Qð–0ª6Y&T(ZÜ0܃$Ó.±Â‚¢!ÉÜÕ”¡z¬÷äK˜R^9NûToÒ/£Á•ƒÚÔ ¡ÚJêÓ~y¦ÕŠdOŒeaÜ"Tv@ßP·xËf"¦rƒ~HjÒDMÖŽŽõWÍÚ‘8|utxÐÚ©Š–mGÆšÊJïM )/P_À/0Ûr#'ãx`6­/‹ ³N(f‘í–ŒwBFÄ“«¢ÑC-h™,ÿ‘ ö¹å4”º¬'æá4ºÅÀi.·@dÜŽÝKæ¹ß.%˜Ë-,Jèçq ‹á +)® f¯½hãOð¼’®µÚ/wš‡m6¶)žT*Øñ ¦8ÙÂMý o’0HZ”yŸïؘd™E|´…ÜCÛŽö´©¸Õ؆­%¬¦m4dfJ‹½á­0@‹ Eâêé¢! †‚Å­âIhœ¹1ñAIšÙð×Aíœ*­æ2¥O·†.ulöÛ ÓkÍâI¢xˆÓA»ÛM²$º%nnm_öSÑJ-(±™×À¨KLF-nµ»Å‰—˜,-ÊC‹ò‚\<¥'‡’&áQѳxBdÇ—ž'K³èB%ÜÄf«q{Þ,aRjÀ›Í¼Jv;¢eâ˜QŠº®F‚ ÕI-ÃŽ‹ÖéA7:XF€U´D Í‹z2tõ@,„[ÂÎOèTë(öå*]%Éw¤®ìrxˆÐ¨©Ü8¤™$>´+à ʯ ‰ðA[>h£ØV~­úT¬U¿…ßÁ¿ïáßÚ*þZËçÌY±/ž4i–ÄIŸÖ°ü[Ч{±³ÿòx¯‰I.ì!ƒÍÔÞÈX5iÖŒQª× @.”ÑÍÎ@:£ ÏžÁoòŽ=á¥Ê•’Æ ê$ßPgô”+HÝÙ<þ#«ó.Ì S=g=Ëet~éœ i’Η[ùÊÁª¨\ˆJ$ <Ÿ rˇ¯ØâàPË.O¶¿\JñŽÄ½H£¤' ð r §Ð­ÝÄ"‘ð`Ä÷‚›(ÑU"оº=8úeS»£J$Û¾q¢dé&qÈ“zq›µ&@ű;j“Ô”JIÕH}øê¸½ÛhîlŠ]GºÌ¤«/DuUÇŪ3ìÉËE ñÍÕßòÜÆV ZÂ)—ЇµúOX)ÚX–*ÁwéSÒóFÕMk¯1JÛ¡±1ÈCãŽ-à¡’ê$©êÞ§‰MÄ¥Õ> }f‹äÐÝÙ ®B~8¶c—ŒY€p^1gSìÜŒ=Kž·¨ #Ë×ú5šâjpB†ÎìÊ'kìab$×ÉØÉu¸rÝ£ìDTQãÅþl׎wŽöU=}÷\H`bäÄt…µ9C׳¥3‚•FêhÔ)vìŒQ#È×½ØÄqIiœÄà@g X]É 9È wpïð/UÇ©š2zÔÉ€½ "÷ƒÊBm« ‹³»yÔæ ~(Ás)#U! pæ á•MWð~Ȇ—vüŸx¸D8ÊU‚vu3·3wÞ%h/Fñ£T5WÞÉ| i)BEU:ÖhŒØ¸9óÇÈ–ÚµÆV.1ÏfrQ•K×¥êqâJÉ í¬ûxtÆ5‰c2Y*|⢠m¼ùhc­•ªãÁ(Hü¡=DxŠG{see©hûÁ±2³S+äÞB÷Ðy\—/a=ñ…Ž5|n£UzòúÓÖ8´µßj \úrÝvØ·­alIãÃ\Â3fALñaÒmˆp\‚„HOÞt‚šImbæ°AEtܪ ¹æ—«®óìšOàœ#`ªûö˜Þ‹Æ1/¬‡¶È“G[wj¶ÑªÜv£uÌj– v _Bué/mÑÀú *æ\õðåÁ>ˆû {C2MLáÔ‰3^HWJÒaÏth5åíqå"{,tlˆ>L) Êúðuøú“ ÿå÷Üwq}~¦ø¿ýv#‚ÿòxuãéWû¯Ï…ÿbN8bÀ(œ´1ñ{·ž^¦ƒH&Àˆé0ôûûi0" F˜80­Ž;‹Á¦â‹#{0´†ÿŸ½ïl¤¸&Ô`JB(П¹³}¶dÉíÎ×ðɺ;snXö5sèdie/'íê´ÒÙ>Ž5tB ½Bï5tB %„ÞC/þy3³»³«ÝÕ®$_ɉϲ¦½yïÍ›7oÞ{“!¹`<ÿ3É` „)S3ið£`o‡~Sž#¤+TÃ?ƒ’”AàER)Æ·› §]¤ï:¢N”D÷aœ õy—¹•B„Sîd¹J4¹Ö~òGœïÉ} 6“ÛvâÈ2‡È‘êMæL2>@†šT$­„Õ£~øQzóÒÚÓŽ/õAÇ´2Á­4Ø€>ׇ»ƒìfØÖHM™´”ÄT¯QѾîÜ ^'Bt9âÙöÌ$È4B¯Ó!á…2EÔ :z³rÚ+cgEÒ‡—AX#ÑOBžÆ õkÁ8pêð†ÇÆâN¼Áé9}ï+Cpü̦9$È]m  ÄqK‰„ $[.r•h0ˆWòý@Wò° üˆ†xȦ1R´ærQ¡9îTÔ*yY°s™‡xA†$ÈZ@¹AsQ¯QI8•p¸‰+fZY¸eåÌ š·#‰"Á~Œ¨+H¸–yõÆPƒTö¥¨Âñ;„.8·ÑZã2vÁ ØFx ÉÁá,Á`$†µð`#ÏG#Ä%1yhèãox1Õ…KÌd ‰PQƒùç Â*¼¶ ’º¨½N«Â €´†$öL m®M„G[Pv„Ä¢ÅÒ‘ˆ9ÑzÕú¬Ñ¸ŒÚÜÀ̆}ø'p‹y¹†FÅ mQ¦>¢$ô’Šàœ!dBJ.Ô$Àk祀L|¸lÊ zõÖ‡v|$º#Ê)IÀÞš#¼:ÄržO‘<ÈÓ"ϤúOsû s(ž’g|\uÏuwû‚&9®h†+ü—¨(± í]óƒ½ô ¹´fËÆŪÍàÃô†ïÚƒøYÊš- }0e††ôIeR!0¯;<œC­¡yz@lê™÷šìè zprË-:X‚¹ãG÷ZÛ™‚c¬cÒ ë@çö.@ØRs0úZç.hí5Ÿ-Ë¥EG_[õàPßïÌ¡«I‹žzzƒÝ=Á®\ºêJ­ÑèîìA'Ö^KªÌûèèÌ7Ç.1šy¡»»£-Üژ׾ hÉÛÆz¤è]n뀹†CÁŽ9¦³1Ö±†æÂÝ–p±uìg9¯µ· /QŒœ(Õr¦ÆºÖ=wÏÞGmi-·`ËÖLaü š´øÜNšåÔ,Øc}Æ.\=¶Ü¡Õ2‘|°ü;[ç¶L$ŸVf!2Äs»ú-d&-´nÚìèn%Ùqsà7«“ÛS[°Щ7Ng°o^w[NW¦•òñ6]Ôá®îpo__»=árjÛSmnG÷ìVøØ9zhï Ú²¼Iu§Ð÷YAÞcJd#{†æ‘·ã¶´çbZͦ¿îP" ˆß¶ 5óªúcwU“­;§Øº9x™Z6Æ.¨¹2I¶Ù­¡ ØÌMÄ;[jÖXAûìnøÕÓÑÚÌɦµLz£Úm_&uŒ=ã8 ³Ê ó´æñ`_µà%ÅæÛY£ms]æ›&[Á~•µ-FØoÐ™Û HCUKe†˜š-õZl"¦ÚCXU™Óê³ÔiL+Yè­]hé.Zd¡W(¥6ç47Û4†R›ÆsûÚ4†RkÊàÂ*&-ôu]-;$˜ödZ#L‹9ƒJ«gOœüYödÑÃlL={Úç…ͺ'㘈܎`cêÙ³V^ج{2ŽÙëŒÑzpZo~VëuÀk¦"$·Ü¸:Ã(ªg †®‚I4¾¢-ÜÖÚ»°½‹HÓPnWõlοˆ™==æb­`zÊ„„hAØhÃûõwƒ  µ×(‹zVçÖ|'r‡Çq\Í\\ªE–Í–­–ÌåºZTEïûÌÞF‰ÆZÊÿÕØTט“ÿËßøãýφúþ;Ã??æÿú1ÿ×ù¿ÖÊû ío­ˆ*ãöp¦q íáL Gá7¿2Ü>'4£ýcRÇúôõ!c! ª¨PŸÊiMÃ&*´—Šrú oÍPŸ…Õ?2ªN¡;Ô‡ÖÈZÀˆâ ãÆa¨ˆàÆ c¨PÁ9Πu›E Wn¬°Fž—R¼ÌSnÊw ¿$¶šœª4&%§v›Eö”°’¨ÉHµñ&–ö–GlÊöèj=³çñLª)ʬz<·®¢C¿VÚ©·‹Û´×‘Ê|B oê1n|©¯äïÁ´§ß˜WRqJýÓÏ4®\&o ƒcGL‚›dü’œò€ƒò¤t#þèÿê3oê¶®gÎæ9šé®Y³8KF4ÊÓ$‚Šã¸òø›ÙÛoøvSæ32“Ð' ÃôôÔЉôàË!áFFàÌ€D‚‚³á8Z’ NäGSøµºÄ˜ê‚1H^´H'° ¹I5_.‡ó<å˜gQ˜&wËåxÓj:®7f3ç|ó~tÜŸ?Ýœéx&Yîò C· ,Þz‘ŠÎÄÿOIšQ²àòœÿ|þæzãûoè,øãùomùÿiï?%tXÌ‚÷‰¼å–[ÖV×jþBv^~–N}…;ômøþ|û¨©Â‚˜Êföaô÷_óTŒ“U<åpBâVÆ&:“Ž>Ì¿æið4é3¢2{ƒ Ú5uN4´'­Ç²¼y¨±ô“p³Ieä[Ø~u_ƒ¡©-訬átíÈ [ iJÙAëR®y¶AÆ'H 1 ”Ó‹2êæGwõq“ÿQü7ð¬”ÊÈ%Ùìå}C½ßgÌÿÙàû1ÿÿÚ‘ÿÕ¥ûÏüùÏ)\-±ù!1o4ûñàuZ[_?’>&EñÃ|%16ΦX¡žCëy÷±ÿ™XÿLL|Ô$ˆJØ‘'(+ÌpHsÒ/VÝÄj´a>%é{§§ÝÓçáè“…JvÍH Éߌ€’¥4¶‡Âq ŽJhtxk „KzñщdQQ¬ MFÇ Ø±8ÝÀSiŽiêT<œ µÁÿïŠ~™z!?_H?¡®§Jêz£W!!vàæÆW½¿Xà( ØFa,voc 6l‹+%ËÓµ8{7ÕšÜIÔuÀÃÍ¿XȨOþ ¡ºD³ò0f<ÅŽhí *FÄË4èïíh ÎîŸ[Äù{’øÅ™ÔªjæIúh"Uxpø=JÉå•M'bü`¸‡‰S¾&̈º$ÿ0ŸÐ¢÷±ÛvXëä^ÿñ" â›HFŸ•ÜÚñTwôb›huµ³—e4%“‚Ž#à%ù$DQfÒ‘èrD+üÄ7‚Bë–¼Ä>£œfƒ-'#0YÒ4¬À¤,’£)uðA0äv”CÔSùζ«‹ùЄdˆ:0cœM¨¼Â¤b9$‚°ÈÃF^Z"¬’å$’ä‹ÔԳ ÈðEK¦MÃ(RÙž™TÀ¤?mT9ï¸Zl._k°z˜š}$pW•I´áaW™Æ +‘ž™&ÉL'¦”PsÙõKÉIéQ=â!deˆéeo É‚#"q²‡,¿® GCDÐ/ ³"R®À8šŒŽ<,, Oe!‰pyòä)‰ñ õLâÍ…¸Þk]@C¦›• NšuYˆk¹â”KÙÛ-‰_!ˆÃo hÝ  ¼ ¤£H4ƒ½üã¦ì„gq…³+2½ ¹ƒónÙËD I¢4ÉcÁ1veœzJ4¹ß@…¾ šµÜëVh›l½°&ÃôH+\P;Ò´úÂÖÞ.$ÏBV&5Û­À¢MŽEÓù6@æMòbÒœ>ªüw&ûóÉ}ƒÌ7ÐZؽiûˆ-¥»Én+ÕÇE¢»“æNàs³Ì,ñ®î®Ù?€µÎº(‰ƒHÛ\N´{†`LI‡O¥¥©¤d{q·è8XúLípýö¹X¡ÈZʨ”LfEŧ®Tf›•ÊâÆz½2µ´Uk„õêÕw¦¬aÛÞjLæd¹–™JyײŽgÌW S¥ÔëZ×µqIZ-o· »Yê,iì<üêl_\g«<þ°Š×/uåÛü'1µ}!û»2{“ rKm ôû´zS¬Ì%­Ó”HR âÌzý+U*g þª˜ÃšjÒ¨¤cͨ톗‹mdÒ1{j3í“9±åLÍúÌf¬šWh\Å„ æ‡#¦JP‹[Dwœ`Ï?1Û‰¿§$¿pƱÚã4Ù*m„†€ u‘}G½û¦ÚLsši)Æ£C ~4mD)¤pN¢†°a Ÿ2tÊ¿2eV¸„ƒ(-­r.ö&Éœ: I…Œ€_©ág!=Žf5Ü‚‹~°€¸¨£ÑƒÓ‰.+>Ö_Ð Ý k8A¹×ÁE´}߃%+B‰†'€ÅP&ä6R™éG¡7‘JÚÀêÛ4ddÓñ˜nTàs` Á£Í!„ÔÐóª Ç1î:®‹IL7@RœñL’ªÂééS&:u:„õj”H4Æb /[¶¡5ÛâåÔÄ) ”}P_{ I{\k4§.¥ ÉÓ€SÀ…e”ÁÃ)$±ÀGÑÎá—kRij…t¡%æÖe5y=Mí<ðmXk¸3>¬-9“EǬæÝ$ºÔÕù#òŒÀlÿއ@m´1â‚­¤‚“7L¹É Ø€`ò¬‚Qù²Ó«hPê¼ö¶uy”’Ç’ƒR¢v˜<¤©Ó°tE5eù O¤z˜ö„u­|Ê•N,ÝÊ.¯oè\R¦×^Ä!·0$~Âàk‡*Ý6:•K–Š•®ž¦W9‚ÈZ«2öª¨VNº­1©¥Š¥«–W½2ð••±™Z~Qcôä‚ÅYŸ‘¶™ k%“òp4Õ4ý‚<0«$xQ6Š)Y}ÐZOÂÉô™™ ½\oZáN't|_JÕÊ…zýŠi9O¯Ma“²ù§†iT Û•í&ãBÞYmÅ1BaL t‡ï ´WNP—ØyVÙAdoB—£ß%BA^‘\ïZ¡eÜÚ×­3™OX¼V†{騬úú²üRŸÔ+}9ûz4hrßZzãA˜eˆGƒ×ߣôIt¸Zⱆ¨ pý(6Ü8eK®¯¨Épü=¶ÅÃh-ÒsFQdzÃÔ˜ãÂRÆëëåòFFÊ]Ü&×”©LÐFh«H¶×jÿª ¶ÀZ3Ý(’غŸË©ä7]*UóŠ]íÌ/”òR\bÔ •‰© ®!8Ÿ§¢ ÎÕ›ßÌaÍ&N¢ó)º¹ô`è rÅJ¬à°î„ ~‘à Rðw iëRœïüø]ÈÅ+êÈ“#&Ëb·è l–<®`rka:¼ÍšWúɹª0ë¨Æb"–<®˜ÁS–°X ¸´Ô7––½Z,XG ºZ¬„—“¹—êE,XíÝaòP.¸ Dä‹.GÂ"é/­As±^V&÷ýŽ6jÖ«À$ŠŽmÆ „çºú:Õl︩™ã¤à¨~8ÐÚt6J(Ømм•êÐOF΄“H€H±åY›vËsUVæâÚB_ÕË$gMJ1ž*Ìêx£‘(<. j83‰°¤Çͱþ³sÀM¸n•®„óù„ù‚EÄÑê$½ãúÜÄ8³Û»tM¦îvŠ0×ÃD‘Žàf6íÐ6äb0ˆ1FÕ‘¼ Ë®¨¢5äBFÚÐ £8ÒšY„)ÂC+l«vê]å@4"‚Èñð˜<¤‰× ‚Ò£‡Ž†¡Âÿ¸×äàÖÎkÉdrpco:M€“°tÓ2«¨ô³<Ì©ÏÏ”ê.¤Oñ"±Šîï8ÊÌvH¢t©û4’RÂ6À<Ídñ5-¾6‚hùa܉ÒT»æ%!=Z?äöR¯¨—`´„ØØ}åñiæ š{ÀIL¥Ð²3²œ‡JO$IJôh!ù$%¿<¬¾«ÄÊà¼è4–@£–WÄe2¾ô-#^ËHqÅŽ×ðà# Þ'çø8Ÿ†+T0µÒÛ]ÜÔlo4'v>ë_þ‹ zµ«Rb‰DÌqø^0L†7\çÀzÇéÌÍ÷ÊB-§2GDxYɇG1&ÈåÜ^Šœá&Nīݢt]jOœëkR³´lQ›Yɦpªš”Í$+tmh”r{³í"èî †ƒ‹à1·ÎÐýZ'6Åbß«ˆ¨Ô¢÷0ü(!"¾’A\ª#FÕzßmnQÃâ°µ¸ª­´§ÖŽÊ¶nk&˜¨¡Ä¬0Á$Â7бŠÍÇb‰Ò* 6é͕ͣ )*ÉH:™úcHo)âÓHÊe b®Àyâ›ëšŒùÿꛌÿÝð⹊öX…]pÝÔÀ þ1 Ø4 ¸‰º$ÄØ>Fó§ßмB …%„ç ‚à°«/\­@Ê#u_D äm"@JÒ‡ÌéW?Oñ WMð”ùL6å&Àæ(¥EÈ„\©ÔCNã>˜Ø;¬ik&ˆUW±‚QÄ¥0æ??üœæ¸ü±LzRvÎšÜ ‘“"Á’9޳¢»– ÀÙš‘Ä‘H:&ëÖŒ;^ÀñÔ«W³ñÔÎ&êB¹.28y‚õ.UB¥)ÿ>elýØ©L¶V¯øßÚpŒ:—û-Ç7Åo:,“¬Õm‡9¹ñäéÉvë±mëtó1ÒÈÙöcb²à ëD„æ—_ˆçǪÏ3]W'ÓRˆòÓ&ü¯çÐÎBãÿ¡¾ÎïkhÎÉÿÐäû1ÿÃÿÔûïþ?ü˜øáÇĦ‰št§£ö®@GúÐÚÛÓŠ/¡‹8…Ð˦˜Ü¸`N JªI~ja¦ÆJr`!Î&1úº´æ(¨G¬o7Ó*&ê~î°®·–0m'‡¡Wì`?£|ÿ2oµÒ¡ )EÓ®Ú«¨ä8RÃ}‹{P§óÀ,já$Coc;š”3·!-ÛÚ» - ñ¹-Õiêh;vâè4mšë—(Æóâì U’[[m® >ÇBÄR‹¤ÑìÃO…r3˪$Ä™U×1ÿáì¡ny¤„5á;ÜÛ¸ò\W{¨¯ÍÐ(+¢IÇ,Z`` 謋æe`y˜ײaÄÖm³×1CP8w 7cÜÛ¸2:WŠ7¾"ÉKûÉCU\ˆªEç.YUy抮L^iäI㻽˜n-Æm¥`!O;ÊC\RÍŽº}míëzÑ"!”\¯Zº)uqãK]<¸±GñÔ¥å£.®fKÝÞâR—†º­\)W¹'p¯’û6gâiœßu\ ƒçX ¼¶l2m"—„)ÈàœÚe^öH›>\Î"¸»§/´îùCJe一·`èq=Óä ?o@Kü†€ICœOÞš#E¹Ið]:ýQwä` Òh›ŸU¡ž¯.^_Tv®î8v±­J2¶vÔW\XŠ3h>Ò9QS”Ù®ÄWæèšöxV¤Ç½–œòÒÏÉpÍ<ëoï^蕤B¨…€·¢êqÜ×(Þ¤žKIV'îÉQ=*“]pY݆\ј€nFbÒßz =»/ç!/©fCÝ…í]°Uø×1}G6ˆJ¿ë„23*Ó^ýŽèŒ:jë^¨P™øã¢ïêýáŽ`kW¸µ«-܉>@©ê˜kQN™¡;}/zgGÅà“aõ-0ì´ ¾ž'5r+ms[ÓÆ Dôƒóú{;t짠ƪ `°+ó[s_ÈßèiïY×Ü'û3Ñ”rÍ{|SÞ£}þðž¾³ÆtL;k‹íüæ… [ø®§7ØÓÛ†Bá@kGG »kA©9Ï"?…˜L ï!)Qj,4’HÀ lTá1!¸?Íe8¸–Ó CoÐe:­ÄÛQ¶GZ:óôIßLk1TeÆSèjˆ³:ºCÁ¢{Ì£ xU™¾k'k‰Ûñ­~F‚3†¯Î©»¤«œŸO¸È'7ßà-æ¹L:ËkM²rdˆ¼_JîØñÝ7¿R²2Ä 2j/ÐMÍ^&%äR*†€kˆ?~šÃà†„È0a$VQ…F¤Z¾µ˜»uZ>Uh4³)Dœ»\fç¡{¯jôv50lkä`KWÃÊMeJlWsµNraðå¸ ½Â¢˜Œj™§Ÿ¬²®ÊYÂ~kßQs28õ5omí#jVßÑ듹 T[•ÚXL¾ ¦¶–ä¢B°i9¬ˆ·àX5¬Õ²æy{‹>”HWÖ™ÒˆÙœfb–ú$#‘£aÖù» ;æÁµ-¶õŒŸŸõÌoöRCº™È×t3éà ÝršB7²»Ð-$÷V뽃yƒÏ™´¥TUñåÀOÚ²aù©ÙÙ'±õ[3ºPÛ å5Ag ɬ¶5ùÌj›àߒع¸7yϸá›?DŠCNǤ,~‹’Ä12èSÔIå-Aæ}X3 çñõ¶nOˆk•†Ã¨‡K¢ÜŠÐ†©Ü‘7€k”T1GÅ#x*XÑ£ïMçU÷˜»‰|z9¿6gQ/gEYÔ³@•#ýŽåˆRëwÚ}…¥Ç ?NJœ‚‹bT9¥w iåt3,Í\êy¤Qiy9Š`¡–?2Q+=Ñ¢”.G‹R Yú(o¬m+Ÿquk$`WÖÕpðÿê îÜkŽJK'ú"©ëØÔ¡-à|†?R³p£Ÿº¸Ô, ˜u­OêñëH‹,ÍëÊ hDa†BËÅQ:ͳ`bÚ»Ð2 #¦K½R¤m27nuH#r˜éljTÚèŠjš“ÇF/ÌKHÚ Ùá›ý(šì”>õ\©zzÂÙ*xÅFjê;Û0”; ªQµÃ˜p§Øiжê©fª}ÑPFSÝ˼Œ°¹y3;GZ!™KËð|€mèJ½¡ ºVnh;ª ®éTH«¬›G­!sµTjpq!:‰n5Rœè#…áf|t gVj®1žJD¡Ø×µv®@€}wÊ ÕÁˆ—Šƒ%ùÕ2KgJƒ}Ö*Cþzfä°Vò‘͹²€·§ªA¢`¤•ù&îwuwÍî ^žn” 1ó«ì@¥Ó*°[žœ‰d²2OD†8m$šHzbMë0h$׊ÌóIì:"¥—ƒÒAZ™+ÚŸé¤Ü+ LT_˜»Ÿ‡¥°(‰ØÝÐnk·ª6Áò­€¬(É 4ç|=üä%Y—#žÁgL≞ˆâ FŽ’E_¦­Ì„Ž2c"yœÞ(ŒæN.ê¸`íoPb3£Œ`®›f½oÍ ‡‚}sЊ'•W3`ÛvfN‰v6]G.79¦mÁt-`ëÓ [ì.hŽÈB6DSL:ÝŒäÛ&ó ÏçŒf.7;Fú9Ù÷"Xô€GuÎäóm„fär½Û™PÊ~ãë á  ö®9Ý¥ÙôÒ<± b\²>Q«YùŸ¨Õ&%?Q3ç¬ô¸Ü:™–nO”HŽßž´3æÇwfÚV§x»*t­ÚUÉů³£=ËB%¿U¡1"…Zïq.›œKäʺªoNô˜roaÐ5wbh`8Þå ë;ŸÙ©ns¥R:¢¸´^˜aܵÃïŽl%@ÿ8ݲèéQÐ-‹F£òiºX ׋#¡Y'.tÅbIèRGÔ WŒ~hŽ4·º¡)Öè…,šNÌmcAqZ݆Œ6Ú¦3ª»Ð4eÁ±u…E¢niFjWz¥ •muʹÁ¾’ª”C|&¿F ŠnÇh“æÆ“ý’xF+·6ŽõKjN뎭~É€oT/Låh—\kŒypIJ<¹«¾Ÿ ½Â…ßÏŠd2|2EŸÎB\"À«|ÙŒ©ÃöWT"IÂwÈ÷^£ÅŒÂ‰Æ84MíŽÑã8fÀ¡½VÌ´.­RLµ9©ˆ~§š­«§Åwµöµk1¯æ:9C •Ü®‘ev5` ؒò952ø«V"Ÿe· C¥Wla äÊMNIÝ¥t˜t­óëZ;Pù™úNõƒøÍ£ð3µ×C}ß ÙnÕ}”;Ñö‹Çü†¨ë;^E%³!Gb“>ÌI ;£$â{¹tVÌIž<º$DIú’+iÑ´$˵„xN_¯àCaX-d”zEýÌQV‹d$>¤1Ro׸2Î#jSœ&¨D}g£NÓv1#O³,®Ž†K1CžVšV¦~—D8ä3•q_˜—ea/Å+ñUUZkü…'‚Îôº¥µ=ÜÕßìmÀéf#Iñª9B=Á€I%ÀaT §à7î[;µŠ`N¿îÊ}þfOúŸ¯ƒ¬@?1"Téî€HãÕ«¹½P ³BùQ!S髚Æy«¹8RÂ!Ÿ‡Z¦ÕªEœíM4×kÙ¤ç'{³Uf²$sÆ +8ÿ3Uì’tgȬ@€9r]šL±›ßÀÎÞ™ÀŽÎ6[ëã¿ÓÚ&ø·©í†5œ› ˜”»û(å6æ3®pc-0eóò°vÒdì 6×ìÅ«PÚˆrS§í½ûíÁûFüà=ûÞ½öâ}£Ç—óâ½åiI{t^}¦^ÿð=Û¯÷+ò#ùûeœ˜Žc‘ôˆ ’É4æBOŠÑ@ux d$Ê!<Œr>´Kx9)Ò¹ùˆM&#úéˆELŒUƒrLG<ú|k€ˆ–#$49aÚ“eÿÅNo8•¥ŒÙØÔù«˜í+Ã=Ý¡öEá@8ÔÝßV¡¥Ä¿äfÎÀ/ÖMí0±šÔáÇÙ.u÷»ô²_AwÍuu–]éNsÞvF y1ˆ,gùp³#:èê›P@/t+@y.˜Kœie#©6d`3}-ÞHÏYÃöò™.dúË Œ›‹DãiÒFpš"óA˜+ æ4’{ K³ˆ^'÷¨tup`0;±:>ghgTÛkÌ`Q Zu7˜¼¸rÃ0#°šÜT"d¸s#m$†Ò]Þå܈ñOÖê2̬P=Ô›²“tzs´+.ÒŒtRÀÕ†²[!ÜÐÙ…ªêâ8M9ÿ5LØ:Å’fv…Ã"¥€Û5/n ÂÐ8%Nb é–w-„Êñº]) ûúæ®ì°î±ïÚ Š‡(ΖªG‹{3ª/Ž,¨0SÇÆS‰¶vÓ|MÉbk-µ§Ÿ+Ó'ÚOœúGQÙ›:Y¢¹´r2ôʧFÀEÏìÅ 3•J›ƒåà(8†½dÝBÃkCkZÒ$E6žóºÉX«&6uÔ5dSÇqNõ†;ÖrR¢¼®4h•ãáIÃ⪭‰mïLyÒZ¸Ø£ôË7¿*¥Õ/8-Q1.3&X-@íÊÅ­Cí«(^GɈùÅØ.‰R*nE‘Ñ´Wj\±dt­Ô±§Û™bνŠg†:GšƒÇ Ÿ ºmõ>‡õíÈi«:"¿+ePÛù]è„ *íUCš»ÔsÉíLQìjí –VQ#I~SdKE0T ¢M׺¢“ɧ(šÖ1¬6Ó:&ˆs§(bîX?E­r½‘l”ãa[,Nmt«4°ºS‹RYZ¤/–B[,PW,³ëHOd°GQ4ãþRkŠ¥Ð Ô“..¥u´‹¤‡8?‹d", f‘2µÂPFUý:Qˆ]àˆÈL!ÕAä&E‡#i®z7)+ÊÂ߫߬”„ú0‹IeªÒÚ[ b†mJþ„²p†mgÄ„)¤Ön¯ùœó:~:bU k¨dòd´¡"?šá»Bìû"4Ëâ 9j8壿jš®£Ó©ãÕbåoª÷r4z.æá'Êr¶½Ö™ê§“D¢JªÌ|ýLG1õ÷³à𽬨ÆD­fT¥pßâž`¸µw®Ÿ"Þ´{S_@P³qÔ"RÉr4,REÛÖ|J! ‚¼ ób©N‹%9+xRtNtwJtwFtwB,õù°€Ó¡Ã³a±'C7çÂP°wÁìÅ=ݽ}á’ù—È|zåàXJJgÂ¥õ0Ïó! ´É‘Å“ës"Û8ÿYÑþN€…ÓúXg[K]D¶µL1“SKD’Ø.‘¢c”¢}dÙÞ 8¡é'PÈ)M߃³“ÛÆÅVd\bùOl:ìXžÚбâ›"°€“™žÎòaSßÌ”w­õa'¤ÈD–ó2×ú‰ì)6ÔÇmT£œ²@Y¥LqeöEh#-ÊóÊp‹í˜9q>¦ÑãFúÆõ•ôë/õÿw¨ß´Sýe€¦µÀ÷ÑûœÅé1ßFcƒ46GØRh®²úA‹;ÌZ0‹û­98:Ôê°áø`kŠzÛíãöäµ=ä:dW]öäââ°«C«ñÀkn bGûPˆÚ‡Le† G(ÅG…¸ÀËxd1›äÓÔ>”Mòbç*3;8ÜjùROÌ \9`ÏîŸj_TóyÑì`Ð%‚% Öã*Æ´¥ÚÐ3/7˜ÇÑD쩈l3ýZÉUCÝÔ¦’Oe«Þaº¬]Z1ÌV´­%Í»ÎើØ1{g`Û §2$ÒxCˬ›€Ñ¢¡Ã—;{†®©Ûø\›Š­½=­¸s׉xõ6ݼ-,$öuˆ ¶¯CòsÙ×1¡ƒ#ˈžõг‹èúrk1€îÚ&bhïÀ"¢káT«ÉYªy¬!zœXÚB"éTTˆ=Äun­!¦tb ) Çç¶ZW«ûh0ãœõµXb™ö²¾e~-KŒKö×<É]Ü’'ý«ž™ô·ëBjeSdÀ×4Ù·tšu•†È@ƒ®FT*ÉýûçóýÎç÷Ïç;Ÿ¿·;_ïRùyìã]Œ·;ßn×Χn|ºÇÛŸ»x_î‚ü¸ ÆÙ:7Ű¾Ûãf‡)Þi{=vØ.Œö?:jCr:Z˜Ÿvmiå]ŒË¦O¿8tæ 4,µc”ÄG6¯ƒl~ïØü®±ù=’KëëÀÕÃô„­ ¸)RÏ·¥\>—6ŸRÅÚãtŠRÅÚßtªRÅÚÛTõQ±ö5õùòºéùüyô|õy½L} y}L}y=L}M¥õàó«x¶±>o†¼5óÖhÊ[£™©±DŠ÷o)È·Å…_‹kŸ–BýYJãËR?–‚|XÜú¯¸ñ]qã·âÆgÅ¿Ji}UJá§âÈG¥8ÿç¾)ݾŽÒC¤h&±a¤~Ç æ˜=.MÐĉ¹£·»§/dašX¬Ì¦et͘–1ósfjÀD+ÒÌ}¸61Ý›H;'¦¨éø˜¤0o>“ž«Í#Ôi)•‘ 2&èâÚÀ¢Å‘¡ ìŒ× ÔÖ,M¸š Ä¿®µ eÆ=þ]j&d€b´FÜj$z”8ÐFð,j":ôÙh!y뙑ÃFûÈC6ÚìNÓ'ÔØ© Z™oUá9íÝ]³Û»íª„Я¹ísðÛÒ.–àù•˜Ò)øÖðE»y•„»A&™…5ÍÄ …Ô˜ßÉVæÊ žÑtÓq¯E(Í©61!w¯ÇéÉnÏ7­£AF‚¹“A b×Í^ f¸x"2$ë=—r¶ d 7×·ÝBÃv1»†Ö‹ËÝCiX ØM´‹ÝUL0WÈî’‹:§»Œ‚…|»ºóìÈãr·«Œíäü©9uη‡äPÆõ`$Šƒ€ÝsÆa7`ºgvf7 GF’˜Oˆ§ùPLe7ôcÖûB=ùV×øÛ…qÎlL6Û†Œ~ qòj°ÍÖaU¯”ÛK‰µ´…  ÐnºÈg¼BÜ3<Ót{Ñ3@äŒtn÷"Ýp¿±È»'™QÍý¾dB°ü{¼Ðì+Ý®]ñ™ ÈLJ65–ܰs‘†î_È4±œðìì§5˜UeQ# Î-ª”Êãú–¥Ùs•Ìà&¶²"_¬Ôa¢0íÒÚ©ù–Ôwµáh ̉)—Ôvøbe!]¾ ²ëê±æØº[òÖÊ£”6¦^K&.­zU0yLúp©RNžÔ(e°b¨|¢:æPi¢³wa 6 8™ØAmkòåQÂòÛ¥úEvPWæcо|ÊV…í¶pÆ ìZÓsSM¬ôVcŠ—ui;6™Z¡JU~;2™¯k²MM{£@á¢mÜíËö;³¶1­-3³‘ ÅïU›œõÍ‹!pÁ{XéŒÐ–x-|O+Ø mÀŽ “€IíG¥7Që…P†"œíVÅ­ÍÉçxS ´vKãEÕЄ6L#A8Iò bM7ßá0ž ßÛpóRø[±ðæ·XÔË]„æõ,ðäÈšÀ²Cq^ZLOEüЋ9þ+}¸3VN·Ã2Êc `q3n¾]¦, G£K«@QØ\w^` kÉ4P0½,{*Lå*˜^…+ZtÈ©YF<¡d™_ÅbñáÚ|`@½##‚ƒ6ùHìLËÇ…©oxŸuj\ÐoQô¯Ì;ÕÜŒl‘ÿ/Þæ g wJ^Ií,ê°ý!×ö`ôRpf{°Ë%`£™)“+RCslƒÀtpa‰°®ïÄQ¸ ]§^o Ö[«„$¥Ú&‹µPè:)†äEnŸ%·VXá»Øí´Ë…¾Ü[.ÌIåbû7+†N˜¹³eXlŠ.ÍæÄ.j×seâûè0]’íNæ3 ’t†iCƒ×èþ !ÆÝV©µsïü`gðXŒ~ˆO…©ÍC›ˆ…±Ã¦Y°6Œ¸rd×`Xa\$L¶Ú1ôƒ„¥…“2¶¤®,¶\›RØÆl(Zu§û ~æ±h•zQä'‰;㊠.ÝZUr1êÄœR,b×ÊW^l[™Z,‚’)”E‘0· ç*cQ$t§²C¡ š¢Ê¥òg†«üÚ3sg6äZOV¶$›µ¾èˆÆÎDm wj ag£÷™ÖF@~¸ i“èO—Ja.ýjº1K¬jÑÚkÉÃf‚jwl?¦VmâH‡E¤’'Пyu+ËÊ–ö¢$KŠ là uw„')fkcÓ©èýLß]!{ÛC‘\Pèž§¡$ûŸš Þ Íñìj_d1åÌ’‡HNv5‡Ô-d‡ ëVŽû‡Rí¦„-l3£©ý^Wºp )ÒÃ<È£øŽBC;\Y7ì*Û™AìbElÃDl#D\‡¬¸hN…<öq ()8–ÄE‰;WTÇÁ#®âFФˆKsHq'îcM Åðú¢MÚ"ßRÙw”"#SÜ¥DG—ú`ñQ(Å ¸=qvâ8âÄq°‰ã8“†˜¸‹.ÉXb š+]Îy”H¨¯7Ð :KóΦœIÃ]4™Ú@t8Þ=NEŒK]NmçÈçÖòõ 2+Ý˺]ÖŒ“w¦‡i´-ΫVëȵòÃ@ì^b;Q‚ÔêŽÅ»Žùó)Cì¼g•<ïnš\D¹VjrÐåH±)kãæ*d•0_UNT0*ÇM;)†(¹]¸ÐRŠ!ŠKm…ªÅ Unµ\9Ð\´™;Ô^r‘k£Á8«lI6MÆ ]h3ê6æX£Ñg§ÕäÖ•f“CÓ¼Ú ’%SmU6½n¦Ô |¸×hP£âÕ.cVª­³RÝT«0@ÃâõÔK!Ê ´ Í·t¨¶ ºn=åj Ìzœ´3…¨* ~œê)…¡ij(hèqUO £‚¡½;Ť*¸WIð Eê#zÜ ŒèãLÙ:WCXTÚë ùjš“Ç^û°'¤;Õ-'7z )ÒÁRÏ­ÆÁ.ŸºÑÖ_2CJ,»áQ¬&ºB†kUµ)ZÓ@ÐX+f…*»›²“tªeíŠV2P'èÊBT ÜЙ†ªºÙ”‘óë0áñQ/X¤ ]0¨q¨\„¡u©Z *ÇK­( ûúæ®” ÷Øw­Rà!ŠÓ(ôhq¯PèðâHŸ€™:V'X$Újù*š’ÅV—°§Ÿ+Uí'.4 @½"ÁÍ¥ÁÐ+ŸÑ^ aCº̯bÚ ¹‡i/Å%Œ`{#Ø^¿¶w/‚‹‹¡$·.BaW.BÁ÷-‚‹ËÁyZp|Í"Œß‹Pä‹àþv¥@4­KÕBçK¡ÈÁýuJ!Tp­b%¸EнBÜߟ®.OÇ7'‚ãkÁñ‰P “vw·%Bþ«¡ˆ{ÁÅ%IW‰}@Ä Í D´öé*Ô ¤«T~ b^G1¯'ˆ˜×Dté "–ÌD,ÜD,ÊDté"º¿E]y„ˆãë"–À'D,Ì)¤HÔ­KõEdýBÆO‹Kà"æR q\k5b‰üCÄR8ˆˆ…yˆˆ®]DDW>"¢+'Ñ•—ˆXb7‘.÷~"¢3G±HOÑ¥«HW)}EÄ ÊYD´ðé*È]¤«$þ"¢½Ãˆhï1"Ú»Œˆn|FÄÒ8ˆzˆ…»ˆnüFD—wñ¢sÏq]GÄb}GÄœG ÆÕºÕdÆÙD,ÖD,Àƒ¤0R ·”À‰D,Ú‹D,ÀDtçG":w${’ˆÎ]IÄRú’t¹t&x“ˆÅ¸“ˆnüIºJy$nPWA¢Å]PWA—A]%¹ í¯ƒDûû ÑþBHts#$–æJH,ðNH,üRHts+$º´´‹Îï…Äq¼‹½ ¸*WëT'ïÛ!±Øë!±€û¡ÂHá^')Å‘Xô‘XÀ%‘èî–Ht~M$:¿'_‰¥¼)êryU$:¸+‹¹,ß-ìmï .(‰F2’2üÊ C!°µ‚ wºiã@Y ÷·w›«" EÄ¢p½E!;KG*%^q éÄ­ú¡@éZùP:P=HU§\ãäS£ê5ÕoTß4oÄmPˆ¬#ÿ©¿7ÿ&T— e¸€”KcÁ[¨âüuuSkýˆ Üà×>Á…2¼8ȧ‡8>ƒ¶!ܨ‡O'YF¢ä×5HQHÕpI)†Î $W1Ú“2ia0›†T YŠgF@ùÇùŽ32ê'&E³I^ÌD@ªqq)ÊÆ¸T6’dR4~)›áâ<êÈ0ŸædC鈘C’ô+…C}e†#,,#ƒÒJÃCæ…ÎB}Jñ‘4'ˆø4‚Š^ÆCà†ƒNÎÉ žr›âZ 0jóÎéUΦRR:VÃÄj´a>1’äá4Ôéi÷ôyè‘ïy¸ØJõ"CŽQ)ºJeBTÈŒÁ虈 B ºŠ^€†®4+h“S|Tˆ ÑÔÈù >Z ÑÚT<œJ2²œ‡3R°ÐùKVà—¥Y <êFÎ ™È ˆð°,i $D]·+É1¸rtÈÐ5A‘…±d4YNH¦ó"i 𘘭” †ƒÄ$‡P,+7)MHÑHbÀÃÍçùâN. P]1›DÜÃp$Á57š·©NÜ[’³62 œ Óˆ;€ä„Adö,O­ LNn¥Ÿ°ÓÕïÑ g”×)çGü¨V868J®V‚´ ‹)7)Dµæ½A‰yoPbìMƒñLM¥ðߊöÌÐP…Î-V…ózúY—¶Ïî´)ìê vXàDdU8·«ßºeGÀ²(4·=ÜÙÞB­pÞJ65ú»l{èkïZl]º°µ}ÆåúãÃnXSVȧjËQ$§O»çp¾™ýe°0Ñ·0’ÙÖÂõ ョ†²H¦ÈÑ´Ê ‘ÊûÖŠ­Ý$Ù74éݨË4hIYXÈ5H¦%Põ•XÆFœKó+²B­,ô-/bc’ºÐ©àÏ!^äÓEÊÆøÁ콆C*$…U´,ED%’(#d"²G›’ý<:5vFe,HýÀœŽÖ¹!Õ6…×:',]ÓYQëª Fy`æ)<¢‚ =f hC’} Z¥Uäà® 0 !iðXd§â5¼ÀT9Øçµ1bh* )ûî'A»’P ´#µpÙLªÅëJRÂ3õȼj$#¢j@‡^Ò“Ï 8ÁÆiXK¥¯’5šˆˆCy%+C3 ÎÎé‹`EÝÒšëuÎdvÎ9ÿªð(@àCZ ¿·ƒv…À©‡qY8 cÌڈÃA9šM'àh«$ããaµ™«s«nÓÀ3&‡yÜâäË*®6–M¦èfºŒ)f,ã£ÃW¡ÔçVsQ´Hkcœ‡«ûØÊ ɾ²™"Ø®–U‚Ú ´¸òêrG¸ÉÊw i³3½ˆW½b6‘ }ö¶Ú!®v¨ýøÐýÔ—›U«Ðýª ÅU”‘¦$»¨:ÙYÝ(ÚÕu^5†ÄV¼Öï¬òÊdδð.^;düoáËì÷ª:PÛÍÕv#t#t#tËè§ý4«“Þ»eã÷¤ûî:F¼†èã(`Ð\ ¿€ÁphÆV\ ºÞú;²Â;¯‡ XT+`"5Ì+†õшv94ûê0Lá" 㨼°EM9Õ_«Ú±©o<Ù”¨ãȦh'lJ¶5««1s=Ùú}ÓMÖញ¶àhTp¿e’V–OÅuÊÅ…„W†¢Q›mJµM•Ô5ÝR¡HÛPÍ*Úm§dv3%ýý¸•nx[)È'ÙB>ùíä“É*ZØÞUï7YCÅŠ2zðGY6¯§¶‘iF@q¸ëÒ^-Dμžp4êVâàF…9Ào¹#ºã1ÙŠÅ&#›ŒXl2b±ÉˆÅ&[l“-Xlri¶@b’G¶A8a ‡CžÁ]Zp *+`“"­ ç }q:”)û¸ÐŸÐO£iõ Ýß\í Q¢æÞY}¥öŒ:—õ}.ëû]Ö¯wY¿ÁeýFw2ß±9öUgËùW.µ—ŽçÚ3|ÂÑê¥:éx™r( VkžŒÎØë]­}]ëÂd¶û«›ök®„³¢0j*¯ò@MÚ™AkMŒþ®vuO³Q¹…:Éd­>¹R ¬—“µÅx͘L iTmÝ C–³ó.iç¼Kλ ý^…~/iC?1ôý^…~/iF¿ÑO÷üÔZtcÐ6½Ø|í¦n‹(‰¼«IA’‘„«6©H:#¸lGGW d>3¸Ðò©’®Zó£^Œñ1 †Ã´2¥æ ™&ÕTôv£Ò:ôãC?~ôS~±»‡à§ý£µ\éµäJÔ ãŒU¬‡»©qà¨ûü»#àTñ‚šæ"•¸×ºp£Â•.ÔÜBå*ZÅ2ÝøMwýRìäÌã8ò…ƒQœìçDN­Rº›T§Ûº’[“SnUyH(Â4%Jl­hˆq·ci˜‡ã„+‹G<"g 1z”j5õµ° RiÉÍš îBÓe“Ëu!+zi¨€,ö†Ú»»œ´˜´+`yUZ60S[o«Wë\‰s›[6­*xbRÿ»§–ñ\‚Y±Çáê£Ð8ÔT”Ž-Û›–VÚ®´¨=Œ³y±vÿøà?üSÿ4À?fQ v*/Q¨qä¤>AsÂG‡\D:µà!è©¥—6+œƒÈ ,ùgpS~Uï·qdŽ…‘ *q 4D騂EHo0‰ÚЛä€Í>X—H;Ö%Н<æ%Ø$}“õ;¥µ—šH9ÝVYzû\>“Å|ÜMÆz Ћ²@tw! ©O‰¸ ÷u‡ÛC‹C}ÁÎ"–``8"ñ2'g"b,’gG È¥"™a9×?7É@OqØÄŒ„–Ô˜œá“úÖâÆ*ȸQL"¡]Ö ]‚–ÉÅÓh*î¥há+~£œD¢–‡ùHŒOˤ‰OuìgZÃEà??4 Ι1*€7&´Â]Sç™6S{·Sð¡Å‹*jýl‰iËSuhIܲ_0¸$èÔÇC©gí:LÜ#%Ú¢qNd{&™BRA6Õ¡ :<Ƥ›Q^AˆJ¹üv¥tÌÔ®ÐÕœ†¨§,´Bfy®XŽjª1©µíÕl€jj,%ùoš¹ÊË‘(þ bp†NÌåš~NÄí£\?B ú*l+ç&ÉÞjÛ½\­Â²Þ¡IË í‰³ê)  Xߘ–Ê+²<¿ŠW–”*ÜŽ.¿IWrÒQÌæ%­§ ðÍÙŠzÒÝ;?D£Å¹ÊÖ@:èֶϩŠU´¯ººûè×UãJ#ó|RAŒø`9AÂq8¥„âšµ@PNŠD!``G·2B’„ã•q‘¢ÔTŠâT$¸ÇD#)%ªj%@/A_F©«=€[-coŽÏÛ °¹!ÞTéi`½0­L «W‚âÍÀ0$u0«¢¬a”è3'6á/@˦öF£µñˆhἓpÔ`×çÓjMCS  âÁaß´F~EêA³PRsÓaØd60d.0¢ÓˆP³L6hÍWMA­ rô–ò ؤ-™`Z!‹‘(x°hæFö°RMK²ŠL’I±y  0¬2 FiÇ”êíïr@¨ jZ tHàÂáP_:¡¨_sªÖ6]ÎÄ gx¦ZÈ‹1!nKê:Ôü¨©ªÖ>¥ÉWˆ4”Ê©´4”Ž$1T4q¨¹™¬ÌUDà >–;ç€Á4Ò1‡¹l B`¤g×kLˆƒê_Yá«©i©¨ðÑS%ùÒ_SS3  *ügP°O­³[CípwO_¨ˆý"Ägdf“ A³JL——„Š h ^'J=ŸBú·¬6I&bjpÏ„áV´S“íÂb^/³¬ÕnsõÜ&jo/ó»  Æ#¸­ºî\açòŸñ-q‚ºÕÈpôg4½Z¨Õ0Ó÷¡TkÊ|§û†ŒEUGÝ<r‚2 ˜WUÎ×dý´ÑhBõ$ZkVĶžHz‹£C„’Ðx8Š êúö4à‘ÂS‹%²Ú1Ųi‘‡d?”× Ëy]OµÝø([;D~¥øöŽð”±š°N•§Aеû¸kÕ15ýxÚ´œùãH +´„øD+âp2\kW¨ÕÖ’RŒÏ’Û¾r]¯}°çJñ¸ºÓJב„Á¡õél‚—ó÷-JQ¸™~Œ¹äÜn (©GÝ+™Z´Sƒžp}ÃPÄLÁÉR’ [â‘L$Á¡­\J;è?)…I‹Œ$ÅyÔÕ\ƒ>&#â|¶%#^ÜVdìID¢ü°”ˆñé|`ØB½˜í$â=„°=üy1Šó%Ä9PàRÂï%«ÊMW)FušOFЦ«0¡ÁïonáR‘X D|›E|‹wW‘Cˆ]†D.ÉCâcóÆF¦9Þâ¶ÝÀãÐzÕXÞ M^È„50Ž-¦±ï¯žƒ¢ ×ø ¤.F6Ú™’"‰‘Èœ—Ò|$V+Gâ¼Ax蓪Ѭvi¢9Sé±Ë…Œ€£‚A]¶: jHh7œå䌮',±ÕFYÎ&ix6VVU-ÔÃõic)õõòVÊ&b ì@àô—XIdyYA”"–AÓGJ2–¾@»h”—õ¼ábhñqÒ h;Å@&ògŽ”ŽòuÐrFJq‘8Ä|ã`mæp™Ž@ŽšrC×cŒˆ8Ô)ÄqÈ”Áà‹tY‰Àq:…áH"3ƒ·çFÆÝÓŠ)»EÜGI˜º:o„o‚ž&ÉÔ\ŠÁF¬!Kz:" ‘½†ìS¦r1„Vø"•È’2ìâ'åÌÉ®3cHÌN™êTV¤4¾†ºÆˆ`fDm‰F *j…DPŒGÍKvfP‚þÄJ’IJ M¤ ò“ =45’qÑ.àxXSS‹VNƇ›*HÚ2‰1gü€(¦]ƒ&QƒÀ¨A½º•Áþæ©- rgÒR' )d(*P ôõl>aê_ ˆ×Å_<¬ãH†¤ÝÉŠTëGJé˜QnûšÐ˜å¡MHƒƒp‘6$Jhþ'ãÔ5ˆèÊÁbPïoÆ{Ïí¬ÅýV´Eó9ïIë|eÆ}0ê=1Þã;öñEwyº–[K‹A5é“?c7»”s ´¯õçã½vÉéF'ãÜ"åÌj–§ÓüT‹TF&©.š¡BMÆiCºƒ2§×ìΆ96s&˜3½0½Øáì®*5sšM^Rµ°«»¯=€éR¬ŠÆ&ÙªŸ¢Ú•fc³Kdª–-líí2.̓ŠälDœ =¢­m3D9¨7 j%;riìjE"¥•1“ä1µg÷Ï]›¦3l/#F0›m“Ï0¦AÇ0†ª´ww‘únï¤ÇÛˆ–ß8eoÜÒz¡ˆ6³aÙ¼ Ý‘).híÅOªôThÝ E£ˆQÜvL›( À¢‘Ñ‚8‚Ô´0‰I2½"u$ óàä]Ê‘•…:$UèÜ]ÊÙc •( É!æ*-Ç€`Š1ÓèLsäY)£ÌئâŸeÆËÈ¢?›.L†¢Ó2ÝBL6'Û‡ÍæáfëÐSÈI*pWû„‘l N¶ûMYvyö–íK‚ëÅv Ý8Út°;Û”&?î ¶û°„θa…´OæÖ’ lëÓ!Bþ@˜È/L•OØ2ˆJ$¿§Ù5‘üuÍîˆä@ ù!O>©­©@úNmtOà©îl¥¶9†±©›ÜÁh¡(–@U¤îùD1$¥8þ ÁÓdý á²(ByˆÏät“À´çÊ—…{ºCà²u÷÷‚“ #Xôìrü†Þ²r:QÑñÂQØÄ±ÈÍIóüìP×à™êX2軎©Z€h™Úìšól5lg°"QâT é °Bš ¶AL-öÍUâX3øŠä%tD’¤D½ÇÏI¹Ý—dÓ”¦ÚAÌŽrð_[$ tH¢„ŽGè’d¢`u é¨5!Ã+X"®ÁSçY] ,\ƒ<[ÜÔÀ¬lUŒo© ¼TŒàˆNÔ ìL¸%„U`'e¤³Ñge×Ág&þE Õ÷8!p!”¬/€’õî˜ÎÍáÌ)Ø €íRWrxtqCK¦Á¥Þ«`VqôŸQ_œþàô»ƒÓü˜ìÀútɱÀ–µ !)d€a‘…H?†dÃN7EUIAí’çE¯zTç;ƒvÔ€´8æ×Ú‹:†1¸=‰ÙÛÌl¢% ²¶ã%&5`=ÿü&øœÚølcK1/”Ì5f¬Y}×d­µ‡†¥ôU£"”<nŒjÊ>Dìd#þÜcbI?Ãá+#}H8—Ña>ºœ jÌ?n’;<Ï Bˆ]`(4æ¦cÒ¤ÜUªÈcêÁCäQ¤ç#™lšw3 Ö:wÌ ˜¯Do›mç,ß·´©¡vwÀfªd±Á{Ÿ›±SM ÎÃNyH|ájìä°±é^BÔͬ¥4wð0R¤¹pjFÜÏ4ƺ¡5k®DÀà™±‚šp°u„c"] m¶-©£â[„ˆ6²@0 òqÆ BXÅ æ1+2í,Fb)¢aªHÔC±»qB¥—ü·Sl & ÂÎîAdà(AÔGjç Œ£]RBç‰Ú8j)w•[ ˆ£æMS:8´ád¨wÄ{ãøvC<Â76âeão#¦j!µE82*È|yYŽj/€NUgv(Σ§™mH,òVòÑŒ”¦~^tJ’á2ŒyN݉bŒ:©%¯†×9Þü׋¨Ö‚ô¢ypAŠéoHÑJ‹IY|§ØZƒvÅQlúîÁ_yŒøÏª/Ï C"#6ÖT}œª“*üªºoè†(ÿl¨;µ¹ ÉTòÕE# ’[§€¥¡åR<ç&Ò¼G}Q!„|-ƒ×ò5 ãîEÕkË“Ÿ=œr„}´oA”R´!²œ±/5yó«]蔩…<8D+r¢ÝÖÂ+C0¶ÛIYü®·ór}¯ÃûëÜàÛå¼4=СcÛS¯'¸]ét.ÖÛͤÒUBJ"—G8|¼02BgÍ™\|«…  YØB‡¿äð]Vµ£A,ïÒU†nìY‘ú Åfn  jþJX78Æõ½«Ô¾œR%o€ûÚ;\[8:‚ÿǘy³˜y’ÆGÙÉŒ›ÿ1nÞ™+¹Îºÿñ6rbCØçäa¢Î”“eƒÊ*êGŽ6_i%OrF"¡ À‚†ÊÐrH¡•ËA@)®v¤AÍÊõ~ÜàE®všpX^±*L2zÒ÷1V"|ão1•ÍÌØ b)ú¿¯Œ¤ÛÆ%i9/âœÛZE5á¶²¢ñ¢eº×¯YݸZ¯9±Ç&É_\N+’²”ññ4îû³ÊÔļue[¼ôÑßÛ3+@2JtAp;C‚qT“"”Ø qFHX«¶Û0pz¬…8KAžðà¦ýø(Œó¡Ži¸d±Rz -"بl¨@»h-p£’Ì: £*4J1šÉâ[ü(äI`$˜ ¼Ä•2†m$Èw fD“˜€ÎµÝ  0Ð4 Bh|ž¯‡ƒNE+DËHçÁtA'¥iÑp„\wðä $!¥€\và7Æ%IØM*’ö¯zrØÃ|ZP»ä ”À%Hô.†¾áÀaϘ‚NÜ@kýÞŠÂ&q‹ sôì¾îî·áQÀ]‡hœž±,5ƒlìt2rXe]Öoƒ¢V2SB˜ !Bº0Aõccž9ãl+ZŇOãt-™íQE»Ù¼”àAc& Ì.Nàe+ºƒ·,ÞŠÜÊcHžÖ€gÃ;ì G£áDUD\FË0,Ja•Ñ¡á$˜ï$ƒîi}Ft ò}óĘh¹®4,åÄü!u-IGS{=/½­õ øÌñžaOL3‹T“ ÒE–²ñûr'yP^L䋇Ñ!ì'Ï'œÁ !0´xÑLž}È{:+š^FˆŠ¬JEu>¨ö¬hàd^Ú¶3Þóò‡<^Ø(è6ª¶ˆ^Ç”8Ú?Mžîi´AAP™Ó:27”æSܤ&PK^(†h’CÌs3½1~¥Rü™œ}g•sµ¨Ór{³Ø–æ!Uô:!)ù%—1ȼ ©ÆÍju‹Ÿä€Æ?ªnX)ï´C8ók¦gkký4F¤,R=‘ÂlCúÖ*:ê›MI7f[È­œóJœõhÖŠ‚ž ²ž¦F = úAAÇÙKºÛº[ OÙÌîoïhƒp`¤l¯#½ \ýÉHd‚Ïj²¢Ë¶w+k8Rdñ &fr’+™êæø¦Η”?•´_ê‘»¶M],œ!Ž×ÄÐa…K °áA0ôÎF²»q^kG_¸»+ìííî-ö‘!8wPÚ0Æ&zr‚ÌDz–’¹ÌøæNˬ®v]&æ1šŠ™¶¡é˜kÈ}3ŒFÕ!:(uÙV3ç{0R‡'¯F’™HúTÐd4ÌE[ÅðU$IDOõ‡n…ÿ`Ѝ÷\$ŽŒÑüõüñÞ‰ I’M;?;š Ðá£'NvòR¹ÊÊ*¤†?FæP7s'¬ƒoC#±pf:•â•ðM7cGÿÄL7‹«õq-ðÏÒi9ë7çbÙdrlÚ8,ÓY—f„úzû}áÎ`çlø«}ɸ,¸`„¿ø®h8"ÆÔäE¬BôM…ˆòªy†¡F}dÛâ°­K1½R+X©yŠYMŠ/£»,â鯇W³ ã‘õëÂÁ3á9ˆsÊþf+ÇÉ"Ðá†àLñÄOãŠgäŒö .K"_ütœ:þýpîe-tLÒ®™ðšJFµ/Œm«Á÷B)>xšÅÉ1 w¥ú>—nÉIZt>eÑ*u=I!gí¢Å«_»¦]ùs»Š²]±`ìŠ$"Ôåhïä[¿é3}¶43>Øg[YQcÙ—úätTÿ޼&¾/fÏú¡MÖêÑ9+þÊŒHÿƒü…eº9{í厽pOæÜµ— î"˜‹ô펷zvqVWáCý›âvì˜cµn£Žãâò<R[î¯ðäžl'N=Δ-îœÝÝž×´Ò¾*¯œGXž‹=,áFI½%¡Æoz»Â^*jsR9LûÂOáà=3•JK)T9C®xF u„\,)Èœ®±r ·\ú‚ࢾ`oQJU÷ Û(‹C÷¯æÍÎé†juˆ‡Õéæ´Ïíï úv´Å:D;æsô*kÊ mäžÖ o¤Ä˜ þfËm2dé²b‘@ß„–ßi8$]Žr-P_)Èq]ŸÁ¤·VF ‡#t”Ìføp˜«¬ ‡µúðÅþå4ÏÌþåUUUåe¹ž(ºÐ\c¼ê·f…8&i"uYÑe˜É-ë6RÕ¯КE«&…~!l ÂÅ¥æD·š˜ÙIp39ÕvÈ™¤‡=tˆE3‹+ŬYÈΑyj®³-‚§æ:1—ÁÖ‰æ n#ªË¤- -žÖ -Þ¥U´íZA‚7hÙRýÛ³ä?$kÅL¼²ðË@Æ¡0[^5ÍÐk:f]zJÇq®xÎ!×1Ùv8󨰩Ñs”²”ŽƒpGͬt Âv¤€ÖMÄ䨔âg°5 <¦GèPBdIèФvgÄ‘üèçH}ñLÌߺÌÔ"ûáÜËÍÄ™ÍJy·Qß9Ò1Õˆ)VK+ÉçÁl<^ePás+¨åšöpS©/ãT_ É“¡„Y5†_¥ž¾ÖÁ¦ïC]}À×´Ôe!Ÿ@:qp n)3 Zš…‹‡ÏÕiëw¥°‰ê×ÅL/ôEk<¸å»íâW˜ÞvÙë6æ‹6ÿìœ=~îäÄêøÌj:˜r/b#—ðœ Y”–îæ aîb4Õ™¥Užÿä“÷ä‚o_wßâž`¸³=„3®ÿo¿Ó<1Ç1-6T}œX“‘ ú“1ÌbÉÅÝZ°{ç¾M n |·Öï 9Ê :åhÚ ØZà½Eaœ¨Š:Ã×eF!¡h"'O§Y¥_ UÔ çX<`,aÀ¿”â@´æ ¬$Fè O{>p§VņöUWwýºÄO©¤Hœ\Ï€ãÃêØÔ†9Šå£èØBÌNq!Ð7ˆ8\øÄ5ÂcÆÈ¥t‹D<×=jKYé6fÇw” …•@õ °Þà™C¹\-@ˆƒ¨«¬¨¯©iA=ÔÓÈ— 555ª(¬h°Ø±Õ70J)Æyy#÷ð™Ð’몫š„FÄ”oÉx§ëÝ‚P–;¬¹{6%¥R|ŒÏl–4[_'J¼ÚÙ,W» ¯iíL=¡r¦[aø†£æÄZ`£1=ýåF©¨€¬Ü^±-“6†˜ƒ7úñ¿œÿˆËd­Ïãó{ê¼Éod4U®@Bcð§ÏçI6:Fú¯©¡~ûšëØßðÑ_ߨ°‘ÏßÔØà«klFŸë|õMMq"ÉdêÔßȸ%üøáL&ÕâõŽŒŒx†Ä¬GJye)žA|æd3„ÓE‡ÑniÍmÙd¢¬ÔÀ¡C‹»º{Bí!ü’Ú‹ÂE‹ÔóI¨¯ þôù*Љ~µ(¡Ñ>›DûM$#¥ÇV“Hªx/BmÁPm Ðµ<5ƒè܈óJÃåF62çÀ•èð8„ã¤t‡Q¨_&Oöùp7àcÓ@àŠ|”—åHz¬â¶8F‘Š‚“Zb8CŸ©ƒ©âÚKêæ©æIe!_R Ö»Õwò41’ÁFÊãè0Hß~)2>UDDÜdÅ!HRp•¼gÈÃÕ"‚Í@T¸«pÄ• T† JXk€;¢¸‰‡Ã9µy §XÄ66È劯`kHÐÕl±¦OÇS÷1Q"‹ª™c€›¤ÒwÌ•%ø8„§0 NÀG<Q8 M%0&›z}…õ â0‹Õ\—èŠÑ´D¨;,e1â3ˆ74 ²Dð„Þp¦Ã¸”cY*L¸§I CNªÁ»®êõQÎQžDCˆ›ˆj¨­ƒø‰C¸›y­ ‚°Ð4 ¨eˆŽ(`à‡øpÂDŒßŽö@°+T¸_J¥ñk}•Ñ*Î_W7…›Í‹F’ˆãçK²(,ç¦.—V탃¦èA+`¦iCŸŸ[‘ƒ yAäÓCÜôUèÏ‘}RQµiVÏõJc\(# ‰hŽÓÓÒ˜œÓûhyÊ=‘=|,kѺ¡þmäæJ$]i£ži$/¾½À‰ZH{GCHË¥„´’›.“û á64µ{åQIJÂPŸ® œ@¨µš51!$ç²™æ ³óé¤É%0=%ù˜Mª­ÐL#‰ÌP|¥K€e‚¢”A(À=ž$yÐwX¡Æjn©Àô™I€ -Åãø‘kºô`04>îjüÑÄ x¤M@í!¦zjYY²!L,\•a+ù%r±‚ö ês†‡\Ξ›f 1’ä¹>bö¡¾øPVÆvˆ_y8"£¡3•¬ÓËtÕs¥¯ªtÒ Î‘Ã‹RvhX¹È:xZÛÿl0ó‘®W i0rø=Ž8„4\ÆøêÐa­á.•LQÛö ÷Óàå§uT¦÷ÄAs›Nþ”¤ÄÌ™&[8Ƀ ÀgdÚ ,M äë‚N*#UÜ i§¨òLŽº± ÒLû›‹¿™8‘‹ÂÅ.¤žÎ–ÎDk…Ž»9Cu)4øïú{`ieÕAÊ$½^E%@]F—.â iVŠWI'{}õÍþ)¾) ^…Hî,¤š"~­•á-U^é.€Ýê=>ê-ƒW’SžD -fòd®Á3ÅSOr$©úº¥Eµ’ òÑM wœGÀ¡aš0†&Là`L‹”â’Ä©&ÎD¤]7ÃêÜ3ƒÓª´´/)©œõF¸ ܶ<æU·íÈ ÓûfVë›ã€†Êªi¦ß²apzCMG¨˜YYWe¼Ð:¸ LÌ)ÚJ2€@ 'e$G„8±t ŽÂ?j§ô[¬ž™PÍM_„:ŒG2‘Då€ ®DÕnY…oèP–PU)çw*¿•A…EŸ‘xS4€ˆ?xx¸ªpÚª‡æmÍöX0hGþ¼È(cì÷ý¡y•H bLr6 :ë Q¢­yAr‘P©h™¨7Í«‰(QjjžÁ1åµ(¦¸2w–P4`r½ @F^¦p´ UQ X 5läyª€½^g­°¨ŠV=DW3–gc8‘e\(3®†©•5ÂŒ¤v‹Ó7hÇäÐÊ«³3Ô2Ö£h‰ü•‘ôŒÖP¸¯7 ôµ˜I¸‚ôÌ>aìšØX€ÓŽjÊLÍ H 'ÔñÍ(=“ýÈø{˜”*c1µJËE@œ.D…œa!ór]ònãDËÙÇ…q'„ ö¯P;Ëå0ǸÈaEêÍ›æ#ËM­‚qD»YKƪQQ£?²élZ›2ÛVwݵr$¶ån à†l’ Å–­W¸ÕÕÕ\«fÿÁŒ¥÷a ÆS GZÂ:ͶàaÓL©W6¡ÑÎû3êÊL³{uIðôFŽ‘µP(˜ës¦oŸÖ7 Ö k|¹Kh@IjpÖPä`DFG- ʘ˜‰ŒjXP.¶Cý³C}Ì@ÚÖÖ~göÿTf-¢X7öÿzSs“Áþïoòýhÿßðìÿš²ÛK…åJoö·°ú÷ôÍë ¶¶U2¾sºû»Új8½·þv©¥½›Ë°e—#Ù6dlÐ…Ð §Aà`•JG’2=úã—ó82eð<É«0<rÂiBÐ[ u¨ÞˆÓœÏ´±BsË.çÓ¸/ì_\Cm}ZÔËÖ¤O0)bÓ2Ú¥ªäÕú¢9ÜÒ<'ò| …•`XÏÊH ¾;&@N|m1HÌ+Ä¢J£„h¾j^\)¤%DÕ@O•B9#JRÀ|4˜:1ÌXKP^: u*é‘SV°L‘¤8‡FQý:ªðÜ™Ü ÈÚõ \–´aIžlìúAaŠFÃiÆùŒIꜗ[¸ÅR£7"ËèƒNÀn‰íð´!\‰¤h•‹À¡6îl̳€$`ȵ­TK*QT_ÝÀõ ½‡ÀUÕk• ³J¬B…*:ÚÈÇ£b~­€éÌh&p˜Iø§dQ¸WÁ<¹íIâ˜y˜A LlÖZÄâ+Œå)i­†zË~Zèð.EJd.€å´‚1(Ã0QµZ€é%(Wæ'ª‰k¥E­…þí †÷ínïjݤS®UC!´¬ÖÐÓ0ÉWpñ‡ ‘54S‚lÝ«DxjãŽÈ½œ¡:’`Á>8í´Q­ò°ë ëJJ“žÞöîp{×¼`o{ÎIOS´¡éQ!­Þ)â÷dÚž8 ³ÝW²u¯YéšhVx ž^8“0û¾—T\áq­ÍÒw, ÒQY©jÂ%&B^ß{N¿ø–NȨ«^Ê(×rˆÍMÅ™î´ëLà …i#$M¾B;Tíeé ` áñsr‡ˆöÎa)-sÉL8NÛ~°-\"·C`ö…û×r¡‰»‚%o¶Ïe|Ü•³CCÔÏáÑÈ<v[U®:q¦Q¸ƒ%rfŒ ÍÝG·sNަȉ ˜9súr•ŒG›?Vª¸Jj¯O¤ÈÎNWnNZ’ªØ`O8â)<4TÿÄ a¯;²‰PfæDõÌs¤4~²|z¥¤sP2/xoBÀëá’k0œ¸§!ð!‹gêÍ<@‹ÿFÉ \L"‘œNƒk6l‚²B°þTŒ¤(ˆJe £p»Õ”n&‰œ\,íf“°všñ3ÀÕÑaÔ…ãà ?¦_“G3ô3a>,!#©IS¦Oz°' 4•s{:ªHPÂÜò’  ›zՊݦ‰»F Ö„„L–xÖÉ©[—9¼ w46À› A6lt9Û%3»4·VEÎh£¶’c©‡¼¿IÓå¼Þ’Wá“vÖ@(È0KSo‰‡Yt.Ô¹Êd>L¤7£XéÍMQé5ÿ ¿¯¬¬µ?ÜÚÑÞ‚ízÒÅ~ôÚ_Uú«X¦RëÉŒÍä]Ý]íÖŽð¼îPiÈÞû¡o´|XZw~hN Iro¼¶TŸ8õ˜O\Ò°°¤¾0X{Ñ”L¨…ÔÖ©‘]ó˜ÃgR¢ì"<ô¥³|º¡&H…«ÁL&ãÓ-™Jp|äÁ–R´ŒàœJ¸9ØM2.%'PS­ŸsAIGgOúRÎQ`|& oG̱DõÄ]*ú©¨¥HRW2¬¶–2Õ”«?¿O(¦eÔ˜¥Ù6=ï™G× =B‘C“Rbs®2ä$ÕbÇú‡”œé÷£ï†› ˆÈôOCôõ.&òàe_9ÀvMoÅž4}ÉBMü©«ËÔcH «RnbR×þc§CÜûÍËÙl9ï°P «$0!Ÿ.* àxÑ%³r†Yqf¶"¢—E˜7ÃXÁ®” ¹`˜idGK£ŠÀŸh"‘3Ê <+)fTßü®M§“Ù T b‰~®6Ájñê_2ޔĶ^Û|´ôûþ?ß„¨DãZl4«Â 5€šƒVk´{j©B”z´þ!Ç?:QïEúrrym9õª ä û@‚€ÛÂÖ®` 㥆JjŒÛr&šNï:1Ÿc¬Ï…T00X9ÅE-Ñ/˜ÎdеP3¨(¤…¸=¦3™¥ÑªX„%†aqƒÊPp2E¯O‘V»œ~H(_¤ d®6©Zl”2j>#Ï¢rÎ84•>–‡ª¹š«~ xr•ÆLˆT!`#¤ñ2y¤Èø\)ÄÀ“ŽPƒhH-гY 6¸U2LwúZ¦ÊjUÀ×hÖ-8Ã{DÖÖD„<[Ii§)ºï ‰ÖUÝTQ…(¦š¸ ›6$Äz° BÜF1ËnZêCMÔ.[” ‹«T ¢Ð½QZ³`j;$ÌJ¡^ >#͵qË‘æÅ'Ô V7é4ÙŠUÚ¢­&ŠŽT=µ°3AO ¥£öhŸBo¸íC$Qz¯ÄÆEÓ>18)]/^H‡S©‡ñQG¤¶Õ±"‘2¦ DÛ”@¢@†ºPT :GêýPPÃuŒ‰£ZÔ*+r aCEÇ4´Æ+AïÂæG¼é£ÒîŠZ:í¥ßôäŠ/yYœ”ᆳªCÐFÔ7…“U#º\2’4MéãK©QÛ†6`W«”`C…K*êV»¾ÂTŸ×ãëS ר*LŸ]”-ÜüÖv¸+ÕÚеقUqýwª¬©„Á@ËÁBÅIUY^4 Kr&,É+©°š@¨T]¥ùNàºE…zøøÃjkˆ{,uE?GÌÌ®ÅûÊ™ìà óÖì"üŸÍH¢*G·Wq•–àÜBšÚ¿k±ÝŠé vs™œØÁù^䥬Œ_”ÃW¹\pÅU³¸Æ’^D'/ÓŸ*`qøŽœM³>à÷`© ‚“¸ˆQ?7¨¡*ÊCtʸØÅÖ:iƒˆ£Ahe’2XpÊã5CH6?A0¨Ä³Q‘Mú+/Ë9Z˜·Àï(âkéžXK¯ccÇýZœé¶VqI-/³q|RóG€c|\’*ÁC¹jÚÒšø£ÊàíÄÄ™çæ@0¯i1m30“ ›æ*{™³ã~óv 623v†Ó2a!M+ç€ PU™Ä»(C]©p8ÍUc—ævÅ.Qå¿Úꢆ$³1ËxˆÂõÊ¤ßøLÁ#ÉQ€±*Yê“pºÔ÷ß`¯9Nÿ€¡ý9’*Ê,±­‘ŸÆž­æ¼Ì°…×ÖF1i–•ç9“æ6LÄHKΤH4ëÑ ³Nh­œ[RÆSim"­ ð´ž)Dj6,ÖóÛ1ì %¬yl)V°œU•´Q0Á…’¢ÈH#QŽôJRUûg7i¢–âmFm‹íƒ4ìzªì&¶/zâ@ÛÏtµÍØŽ…ˆzú@¶â]‰>N÷ó,›cì#ÆÅ^@­‰ýöÞöE:í¼ÔuBNû‚z4"XÉîÖÃ8é*FžIo ¢Ã~:² ÔCêÈ«Ù! ý1­Ít7ÃT4ãçG”LA$M'Æ ˜¶½Ã¥,§×s‰^ ÚšG`0*Pƒ:¢6yHãRà3Sf•J2g㜠f\R¹kf™U‚úœ ¢7Þq¹êHwšÇ ®nššÆÎ¾}56΄Mº¡i’"¨§¥5V}©F?0"OÓóڪЯi–`èQX91ƒ”òºNú¦*Àß•¸¹ƒÊ*VN„Z°¼Wé 0µ¥”ª¬«â¼ÕÜ4®Úkªå˜˜KM*-eŽxn ”_ËGM´£\Ÿqÿ÷4Ö¤Z–Ï0›kÅãĤº€ÊdjïÁ¶kÆy‡ÀeI/ÒšÏH6>Ê>˜Ì’,G†øNu%Ò<“ð‹øü©9yì û°°+¡jéUzc(Šy̨3¨ö¯Q â÷Q)Hx+W'KŸ&& ¤yg-e0ëã [€pÚÓA°¨ ¾´_Zê´iKÌ¢ëK=â* wL—ŒÒ£ÙrÑJñÝ:MVê¥p»_w_°­rÀ¢5hº ¶¨Ã3k#NàÔ¨zK*ÎaÔ‹Iõ‡ËÓ¯¨³\­Î[¶A|MJ®#Ø·íX)`v>ÆÎ¬êCL8jØ£e°¨IBÙó—©‘ ó¿0ZÍ­Æ.5ƒr >*† ÒSym[˜â;Ô:'X>M/â%9m†SÙQ¶…jP4Ö×ìrfg‘òй€Y’P]Doî º:ÆŒ¶TΗæbçˆA85óЦÿ̲ ŒA–£ŽDF}ßjµNŒèÆç|jz™gzÆ´¾.50^†e¤™‡¤aéÐð5óšÜ€ÙéÊ^Ò™‹ºü 6wc (p3L§1m©…íÄvJjF¾V9Glöf7„pQ9Àìͽ`ÎÇ/:I + X:Æ1p”㖨є´BÆÃu«¯F°˜R"Î$œ56Kº”0fP“i€)¡]0N=tß­®“iu5§·'úìödÅ©D•܈…\—„iKSÚRìP%Ë™ éôãåp꘣'ÔV%«+ ó€>¥mŒO¨Âopı§ŽÔ‚Eˆó|òZ” ì0â<œ è“JèCàb¸à&8"BW$º@@d…SvÅ®ð$æÿ«&®6.ãÔ—¸…ø2›bJhA˜jí µë’Ð|5ä"ŸzÄ£³y$Tˆ4©¯ÔFë;cí¤ B $4F£ÓE †S0U bTÑ»ø‘vF%‚‹OB®¤ºŒÒ½ !%˜þ4R.äÈr²~Ê[#lƒ`@kIQGPKÚ·õ*’,ÚxDòU{ñ–ƶœçSɑ͋C™aÀÄÀM©Cc'²IAücŠžµ˜ÿ/G´=…ñRMžT,>¾çÿ†ºúú:zþonöÕÕ£óƒÏÿcþŸµòßÞ=msõÊö~àý“þTÖÈÕÁ£feÓ§{;ð’äšÐ7½^$­!TÚ;vÓ6ô¬™3ËоÇG’e£çÙ·ô¤³§ìpð[ ÷¿ìgíþÍ·žwžBs2tÑ©/6óÊøåÇìÕu^ùw?ñä/ý’\øéŸ½ñ“ûï˜ù֯ϑ÷¼ë¢­÷ÿn×;¿~ù›O'qîµû?¿øg;ÕŸY÷ëOfÜÖîãžÚâgõrÝO§ñç¹ìüÔí{ï¼Í=5÷¸GÅ7j9ë’÷Þx÷ƒÄÍìÜ´×þùÂ55½xåÁ×>}õNC{œðï"Om“~íŠO®ºúÓ«nöÇkoù[õ‹Ûͤ}Ö’çO½wëtÇÉïœVuÏàoo{utö©'_qÖĕي­†~Ð&S¿nxî­Þ½iþÁÍ›½B>÷úÞ5§¿ÿlÿ©C¿å¿_™5/¶Å›³j®ºs«›v=¾÷‰ÏþyUÕ{»_÷Éùg^Ê:ó‘­ž^ñ»óNiíþþö%K'÷zE×gí|ï!ó8-{Àç»ny¿æ±ÙWþæþ¶ê%·ýáÝ¡‹'nróu~ù×_O=m—§G/ýϧíúÄÕÒ‹ÝÝ÷Ö3Ù€|Ö//}äÝv?þÜ7ž~“é»EÚØmɯB{Üʬ¶ÞyÕã Sv9Að>÷éïþýƒÝ?_ýÑ1‡úß>ïêþ›¯xcóº+¾øûóTúÓSwÚâ¼@ë™çn½ßž]/詟õ«Ÿ^²Ý±_M9ýηzñìû³·,ZzîòOùåowúäÿ޽ÿÓõ«ÏYðúqCÍÿœñ§9Dz¬æˆý&þûO oq×%e·ÌþÃòä‹×-‘¾ì KG]ÿäŠ=ÏÝ~7ßwG…ýª¼üò?ß|õ?ï~ð‚ÿ;à¡vù}äí?ì:snèüaïÈ5×3ñÓô·™Xí{]7 £¡3?ßÊ÷sßÇ‹\"'6:î…/û¶ÿòÀï¶gÓ'}Ýò“ßw×òçËRŸ½piÇ_×¾÷åµ~Üxùkl¼}ê‡gÚcÓÿܽËÙ‰G~U½ø£[^ûrsþ¹¡cÁ¿ò·¡wÂú·^qýM«Ÿ:{qèo_ïòáů´­¸ñõùƒÞ~îw~úúÆŸ4lWçáþ=’ßqÜ1±}· ¼{Ö>¾}îf7tÙ¬¯§||ÁžW>ø—¦GgþñùžÛR5åß]sËØ åîÑ-¼·Ýý“;¥‹îkŠì¶Õ.ŸOßÿ¶_ïðÔ^wɯFÃó_ñÈ'´~h™ïáSënè^sÈÇ_Îzí7×ìŒtºjÐ'XiMtÅMñù•¯´EØ7–â½=‘!ÞÛÉÇ„Èli”¨CÅS¹) þ¥eÞ^) nª—\=¬Wô5OŽD2ê¤i!>3àEkóöAfÎ2op437„›úH“9jîkÄ ÅíUdR¿¢ðÕ«ðq@C(sÞù„Ô”‘þ–r¨‡,tÉ4õ駆ª@*biHé‚B߉NÊ1TÂùë c7p£N£ÌÛÝÓÉùfÎTFb°ØÛŒÛõ2p0‚®aÞçÇb®×WWæ«#§”M1´ñkm Û;àË;áœ9½¡É}TÛŽæ"D1"Ûx¢h"eʇ'EÀ…"„iˆ“Àó­ ÞŽýìóù½ …Rƒ¸Æ:€Âð¿2“ï\”£>ËêhÏ ê¿ä;óü™ü†o >ú^‘ÀGj-OlEgõïPvR‹ã¹ùLÕ™`jñÜ9 ­S³‘ž˜ƒ'Ÿ5žêý,ž¦(x*ó7ªsSçY__Èw¤þ·ŒÁ„¡ ú«YýÕkö±á_øijjÆušnê§Lşứ¸Nó”²& >üÕØØ„KIu\óÉŒPŸPcýe úÓ¢±‰¶ð IIšbB ž…ûíRX¹W‹™BS¨¹>‡@¹äÑþ"Ä¡,§ûa?Y]! ! ÐAPÇÀ„‚ï§àO¨„¢Z`"a’Y-Lš:ýo…­Œ ƒY2ø³ƒ_+£ÐæSä²¶+olj`˜ƒóZ­Ú©FÙª0°ˆ%‡µÑûu´× ”é“‚˜•—2ýÖúÕsþ³+’ä-eél´í Ô6û¹ZÂe}×4µ~)è¢ChÇð—y[å(l}è[´kERóxœúÿ ã@4-ó’N[áU „7o(Ã' Ó&ÚpH°æZàÇ2ï"ÚKCjlvÐJoÄõòÞa¯àMxE¯äMyeaÔ‹íÄ2ÜTa€Á¶QÏùš ûG“†¢O³êt™ž,Eÿö5ø›fÎT5mþÔ±Ž§‡v~à‹v»s›Ì&Ÿ—¼ëûw§ÿ.ô‹ÍÚ†œÞ³C_¿ÉÏ6ýÇà‘g\PûÓ7†çtcíäóOŸvÇýï“=±ÑÎÿ,Ûö‰w™óä¬3:þòþwg=7ëÙ[~W»ø“7;û­ƒ?þ¯·¾ûõ¿zóý#ž¾Ž?úë¯zpÖþçœswwvÓg÷›Ùððs¿YÒþ³àn—ÿ{éM[}|Þ&?{k§ð™Ðóú–'¼ù3x»áWí°b8¾à×ÛÎúà´ß}÷Æ)ÏKÏIÏ_óŸÍ»ëâÇZß?í¿'5¿?cÿífu>xÀЬ×Óõþ¿lºÿùS~ëwÊ1Ïÿù¬ÿ‹í5Íÿéò/ZWÖ4wþö”sîý~î“?ì¹lç7=>ºo×xm¨b³è¢v:áþe·þyÆ¢w:1¸ìèkÎ}¾ìÑ{_ÞýÍãû—òDCWâ’/¹ä³ý¿YþÖ¹ûßþ‰ëÎyªzÎÔwì/Ï9§qæÒWg´ýæ¼iÛýrâ©;n´ÿù5W×lq—¿ý€£÷—£‹'\SwеK¦l·Ý)•_mõìÁ¿[Ó¸Ç)o¸ñ…—½xÓUûnöÉ>UO¼ÛwÓ—»ÌÚti|©÷Þóþë«ß6‡Ã»ÜúÓÔü‹jîl;ýª){ÌÝëÈ-›\ûSþþÔV÷ÞpÔŸ-^9õÚÍ«/=,>pè¹[e¾:þØ ¿Ýhî5ìxûVoüüè+±ÿ>õÙ¹_\¶ë•ïܺÉqËv:d§OŸÞiA»Ç÷ü;ýå¸;¿xþ׿9âÔS7ýøßïÌØþΕ·ívö^ß^¼ù‹ÞŸ¼tÊm(÷>yééÞwFªùÓC¯ ¦×4/Ùê°nü™/½qúΪãOÛ}ò{¿“ªz}ÑK'þª¬úÐÛ¥Gþùfp`Åš‹wy%5cëC§-ûxõSó†¿zò³ä~±ow œu÷¦Çw,{æ÷×­º®ýžClé»ôŠ¿m¾‚ëøyæµ»ºô¾ãGzsñ¯n]µ×Ñ3¥¾ûä¦/¿òÏm“w|þí¿_»Ñö{N­yð°ÇÛÎﻬ·z³]îOO½k~ÿ›é÷ê^šU˜÷ôâß\tYƒo۪뗼ðäSD¿XV¾ç‡þ©ç‰—«šõ·­W¶þíÌ GϾj‡Ø‹k~þ}ÏSÏþkÿ;˜ýâ«»=yÑò -[>}É #[|8ã´Óïõþü›+’÷ž:ëŽÝo |Ñ}Âþ;§~zÜŸ÷,ßu8p\Ïw[›þú¸cŽëÚqÒÆÓšU÷éÀßžzf›ko¿àê«~öÊc¿èþoŸS;éôû[ö>ùßåó÷›¿üð볯·T|2÷Š'WípÓŠ×>¾âæå»ËÍ‹O|ôÞþò›g¿Üm§Î§«šçMZ9÷¢ù\uÿ'«®úûÎ[ðÅo“üwþdðÓe§Lå®Ù››uÝfGr?|°ýŠ“†Þüö£ÆÎ¯ÙyŸÌ¿;wÏ-FÙó¿úl—n9ôõ‹WlµñÞ_r÷ŸÜ÷߯&<ô—§Ÿ¶z£[_{ÿæ¼xý‡N|îÙÅËîýöÚ%S_=ÿÕ?š¼ÓgúÅ3oþ®üÄw{.Û}ùÙç?Ô3i“#;z.|ü”­ë ]øÛçgí¸fU8ºÅêÄËß}÷Îìçþ⌻6¾|þg÷ﳦöÉîã<T¶žµí¾©.‰ðâèÈ{Ÿ\ùÆ5¦}o¿þ)ñ±§Îßøµ¶¦ðE§=òé§[½Qvëß.zcÇ·®ysÕSÃMý;O>ã•èQϾ}¦÷Ù ü`ÉÄÏÞjøf:÷Ü—ú‹'fÎùõ…ûnôIê€Î¾}ðþ/ެ:ã´ßW1öÚgÇóÒ§ÉÎÇÖ|08°Ó;•ÂE?}þ«~±ÝÀe[ÞõÆrÿ‘—½ûmËS‡]u÷¡»þó•ø»gýu·þûúçTŸõÔ’»®øÓ¼  ;V,ùôŽÐä§'úÛ‡®˜ñôØõßþ÷£§OŒÿmx ëøÛŸ›xÓ ›ì»ëõ—Ÿùì¬-Î>à‰Ë¾ÙbË×'üóÌ¿¼±Ñ'_üë°›\·ùÜãçÞýÄŽßÌþåÛÛ4óA+Ï­»ýºE>µóG¿¹ã°ÿÞÑwøÇ}ᅫ<â7³Ÿzí¡ã/lx¨ýÐ=_?ÁûÒ‡¸kù‹GM[sÁ‡=~õ_,Z¶ïïÙýÖ?Ïî¸Øÿ­ÿÌþU£Ëžÿ×Ûß󓲜Ïçp»3WˆñfWû•Ÿ›ŠújšÒ¤nu ÚV7¥I·Õ!”Ýêü[¯©Év¯kªgöºVoÀÛæ zçyÛ½ÞNo—·ÛÛãEꃷÏÛï]ŒöBì‰ ÈËѦˆÓezchsŒ£s§wÈ;„o×Òt¯„@i´a’Œ3²0DöÎYá­=ò gló¦P—RÌ›öÊxoÅ1y3Þ,³ËzWêöYãÙ®¹}¶¡nŠŸÙg³ ·ì =wËLßÄ·Î;ôôÛ&’³·KžûÁšëÿË-\×f»qÊ;o\ÑúÓŸÜsÚgëÖ_üôð}úÚŽyåÐ5oùûâiÃW>úü…™/¾üÅÿüþhñå%Ò}tÐòÛ?ö¡%CÏ¿õþí?üðí÷ýpÏ»Îþòë3¶¬ò}òõ{¡S/8÷Æ¿ÜôÜØKŸmùÒ®«¸÷×ôÝrÀ¡ûý`öµ»>»ì¢=>þºïäîÃ:¯ÞoõÒ?ïx}›Ë„Ë?⦯:þuã—–ýaÆÈ‡·ý0öÉ%Áj¾8¡ï;ù¾‘èñÓ÷êzsÚqûǨ¸äâ‹î{пÉö½åyýŽ[{Cå±;»ì‘Õ7~-žô›®÷ýúÎMv>60iþ6ÿ<ù†¡£¦×sïÝûþ1Éý^¼`“èÊMï¿ÿ£}Ÿ¿}Húäá¿KûC½ÔúÕk{ßQ_ùðIÿhÝl¿Gª9pRã©¿~pñ=]öÂ3sŸÙ­úwKº»¤©w«K;Ÿ™}`ýõǬ:ºì¼™¾|Ñ =Ç]öå¥{?³òÝmö}sÏ©—>tÚ®G.™ÿçÓ&ÝÁÄÞO'ÿÇ×.Ýâ¶w¦ÏøèË-¯Ýrä«+¾ºø7¡I›wÞVñ»½O.;êÈÃîiyõÆÌÏ>ý¬‡N«;iÿ¦[S§¾6ñ»º±Ï_÷îÿU{_µísÓ®šusíŠÐ­ÉÒÊYoýZ>vøØ•û¾sZø®Wfþ긚k>ÜôƇïÙui2zѼ§¿Ú®ãnÿU/Oî?&ô×ÿêyôoÓzÞ®=ú»¦U—ø®Ø6{ÞQïv=òÂÅ¿öÎÛþÏ=óÀù5öürâi§Ÿ·zéS'=í³ßýjÛ?{ÏûxÒþ•©·fÎÙéñïä—Ÿ«Ûý€£ßY}Õ‹ýkÿ¥»~þÝÖÜ7í>ðÈȼ§¼ÿgŸØñó×xž™[7zò³ÁvÜ÷úXË 'œØ|ùÙO¬Øü÷ñ+/_³æÏ7üãÝíäë¦&¯Þô—Oݲèóó+ÞzxêuÓžñÜc·?÷Ø{›²h£ïW×¥÷«ùCËs{~»ì_½¼ñNmÿúnkéÐÑïÿ¶¨âÉK®ùåÀ¯}ùñþüƒW{¬üú×=×3ÿ¯ŸÞ³É´ÛÙs›Ï½÷µŠ›?žó››úÐÉ~ï~{üfì«€wú–;ÜÿùÂî—*&/ÿ°ùÙòƒÏ}þ¨;Oyú‹k·íŸ_¾é+Wß~ͬ¥wt…®yx—GFšVñý­k>üÉ&?ixÿÐãNH½ü¤ßßöЪ‡Ÿ~éÏ?ñÜÕòý¥;ÇÿrëÆ§ÖYûýë¯õ]·Ùf{œ~ƒ_ñÑyÜùä¾Ûfâ6?»|p‹ûOüÝ ÷]ðÞλ^úÔ‘7ÿçÈÍÊúŽùäøÅ·&¿}o[nó-þ½xtÛmïÔmòía;L|yúæÏtÿbãß|³ý‰‡öåÉû|âyôõ{«v»ëÃ+œzå­÷ú»™_³ôƒ}¶þøÎï7‹ß³ë{áeôÌ~öªØCkþüï;¼=á,ß6kŽ«®žþöÖ̾úÕoõõG¯’†ÿ|CËŸ§þk§#~ØæÖK>xéôÓþñì™Óþðä/m5í£_^;¸÷•o\rwã^÷Ý}ö;D~~â%‡O[0ïã±›?Þ·}þUßsõŸ·ßè-ƒ'ø“Ú‘ã’Ë/{ïNÙóÎá¼vâÉÝf¸jÉy«gUMÿÏ+‡]¹æ˜-6ŸS>¿¦íŸ/ÍŸö³ÑMo¼a¿Ÿ}1ç…W_:vY¼cΙ[¼õ†Tý¥ÝoÙóÂÿkˆ|rô±Ï|õÌ57´íšà£Mý·6Þì3éíXÇŒü|ÜøÝq“æ<ðõ;»ôþð¬M§¯Yš8ü‰?_1{ÄsÌ5«Ž<òËãë~uT2qò^wî±”_6mÆSSŸ­ylÍö7^ؼã .¾úöOï»ì¾—ßë?ŸºÉoçŽ4ñàk/<`ÍI¿ºd¬¯õ×›¾°sÃÏ?\õÖ 7o¿íÃ=#ß|¹ztÛ/}üÈŸærìüg.ÝyÇ»]ÞqÕcþ‡·ûôÃ3vŸãÖG|·ó^7ïýÞ£û<Ô‘ÙwÎW[lÑ=ã‘.yuïîùÇ‚S/Ûü¬žþ±NaäûÅ¿ü~Õç‡?¼oëÇw9yõ§?{âûÇßþôÊ?]¸àšc×ÛÒÁi+Žúzä•…[|tXýÅ[íÿÓ[~ÆÐOù¤mÿuËÑí{Þ=òNòðýš¥sÞÿõ3Þ3ž«Lÿý…§u>ý’÷°zïð—Oîô§½ß:z¬î”}®\qƉÏþU¼jæ3çM{$å_rÈãÞ!Æ_uÎûøÐšŸFRSžÝgÊÒÞñênc5—\}úÏœ}îÉï|ñÆå›;/¾Ç‹owöOÝæyëØa›=ùÆùG?sö9·4'ýÅŠ—?ï9î¾öZÕ»ÿ¾eóŽ)Ënò«Ø+{Ni8ufhÉÕOÎßå¥À¤½«ü÷µ½uÃñó^©zyNªòòêŠýÿzÌ«›^?{»ƒž¾yþkk>[vêc£kŽÝ—•òÆ}ÿþˆ{ÿ“|Õ×¶7û÷x|슯ÅÍ^ølþÔƒ¿íŸòxçÑÕŸ6µ¼ºzª'¸Óg¶rÌ¿ÞaÛ3žNÙí3ßÜé­Ä}gß¾àÞïÿ´Ó¹Ûõ]pñ’S[¶Oÿ7Îxú¨Gêßy¶7tóew·çï“'nüË÷?~÷ç÷L;çËÈÜlÿO´zPÌž4·ùÑŽîþí¡']òvÓ™©j++'O~îtî£éÉëoÜøÙ¿³žßñÓ玼ê¤Ä©œþ +¯;¥ço5žËkë÷Ú>úNÞÛwÇ­ÏÿáŽÀµ‡ýÕóŸoO_±ËS;Ë]¶rë#Ã?dL±ýŠäðŸl>ïËïøÉœÏê_þ®êì3®|æç{\\Ùòí¬Ýw>¸õÕÕRÆ»æ²{îk|øõ#^¿ôùS¯Ønû Üù´Ô)™ûÏ<áó“¶©XþÃ^—\}æo[9ýú“§?߸qä„XmåG›7_öȦ÷­_–ûÇV°Ãàï\6ó÷nnŸyóìŠÓ\uDùYß=¶xÒæÿxñï!£«¶üâ¬NúîãϤ·î9ÍëÉüëÎÊ•?|Áö·þf“ýëý÷3ïýëUkj¯¬½ó‘Ô®ï{Ð #çœhØv—ãî»{ÿ 7zï{¦Ý¿^ù®óÌ;÷ÎgšµãvÉS¯ Žœôê… çýùêÍ6Ýö¾ƒ'í<ùüGF®ø´yʾ_uα¿,¯=ç¹Í6~´cÑû±ÿü9߃GíòÓ]·ØùCÿ‰U´.\>y[ÿW›´ V^Tuü1 ×ßsRâÅ·î~)ü·/ÿ·mçßðT`›N?sËf_Õ·U[à« Þª©ö<øä¥;..ëœ8øoœ¹¬z4³ÿ-Ãò@㔋úùªG7úÛÝkR£Ç>õ‹[ê¼éª9ÙE#G¿ZÑPuìšèŒÿëúð°Ÿü'RkÎ8b÷É—|t`í Ãõ‡Ïºø?óų6šûð‘µo§>üXŒ×üþÙí—ªÏI½täš^=WÜã­->L|vØý›Ûzmü~Ò³¬:5³"òŸ?ÊGŸÚ]ñù‘‹¿8ù˜—ÎxüîúŸûéÝß½zÖ~ùÜÞ7í´àšÍ÷ÌK‡ì”=eïËO=aß@K»|U¨ñ´Û/¸êöÛZmqÈ„žtöÌ[Ž¿»Ñ‰S/œ²Ûÿ<ëˆS·}µ{[$Ùë_MÞÖý§ùƒ‡ÝrÔ¤SÞ³ò«Á½þ°óW»¾ôW“¹Mß0…{÷¿œ;vç/ö^µç‚Oœžpvª³s¿Î¯Þü†'^Ysã®»=ö³ƒvûãùWïüóšÛN<ó7ÿ©½ùãx{@¼b<±ýš­}d[oU`³76{cëäæšäs¿ÛõÖg¤³'6ÕÎ?ç²yO‰³+Zù)W}kæŽk^¼÷ûDãWw5||ì·‡v¸‹OÍ|¬æOÁ¹>õÌÃo?÷çG®]³Õkïš~±|Îüï¯I÷/Él]Üï±Ë—Ÿuü¥‡ÜÚT5ãá¡ç¾kÝæŒ™»ýê#ÿ<ü×;¾–üæ¢o^Ú÷™wNXòîcÉìç§ÿtéÜãß~íêfÏ/šõü%g¶eF{~åÿ>1ð›-¾Œ?ºx·gß¼¦ïï#×ïÛöéoœö~jþû÷/ÿj“-ú8à¶)«ÿ{Ýë§ï%ßz÷­?tž£Û6öØÛ›\ôÙ©¯t/Øôª‘#9«-ø§G^<øÚƒ}øûYsã܉W>{àw᯼ëÓ§>|ÀTÿ%§¿ö}ë-ŸÄ6ž³Ñ•¯œtÔó‹vì=»l×Tåg«–(\ýQâ£wëþØvÉOw¯~e#ßÕ¾ÎwõàáÛûÉçGnöïÓ¿ºoÎûÝ}Í%‡O¼øÕk7Ú¶ìgåîÅ1Ó¯:.þÇÅû>µâ_¿’9®ýá3.|«b§«ÿ~ʳÏšöûɧӯºgúô{ÿþÆ»Ûîiz½ùü™GÉ+æ¼[y¹ç« ªæxÜ=[=ô.ùl‡§8y»-·Üî©—Û¨:èê{OI5ÜsVðž/Å‹îÿ÷ûÒÉ?óüáOµ½]4ïä'ƒïÜ¿dÇÿ þ*ÐTõï«<4qã;¿ü¤ñ«ë÷žðâa/ÔÞ|Ê>ã¨ÿ»}“/޾úŸ7ßù]Ç9S>¿ék¿ï¥÷\~âåÖ_>'Ë/øàsf®yú„Çþûßm+gý÷îöØò‹;o¼vÖ#G=>Þåí[} ç?mâ “ºr`—K¶Ýþ±+Ò_LþÅ+OíÛ™üúÌ­ŸÛçðåï|]W¿2rË-?ÝñøÛŸñïžÖ3ŸØÚóÖÑw=öàñO¼±¼q³GÎ9ð‹‘I‰‡ëo»óÞò›>xå$ñë{79d¿ÁÇæìºËê?üµþËÕ‡.·{»qç=žÜ1ÜÐ4=óî7ÛO=ø/7uuzïIà ÏÝòõ™)¯þþÝ=n9I\¼Å·G}óÿØ{ °ªº¦aIi)i8Ò}èîîî®Cw·„H‰JJ7Ò!J ((!ÝÒHøŸêmÝ÷ó¼Ï÷}ï÷ÿÿõ¢öY1kÖ̬Y³g¯=3Iš…‹â§¸!dËnTäвS;âüx‹jÃ…¡0s¾µ=(¹¦eªämÏC6 fBúƒî=§UÍ“Ã$B†Å)ã†@ýÄ9õ—¬«Ùûåw“øÉ NÙWï?yÔ0‚6uœ­Ý„ÎDǕҪ аŽLê=ù‚}ßàÖ±ðNM›§ÏVQôõ'|ÉL>'ÎÞ¾µb”;³^äI3ŸÔV)ûiõÎ,/H^ø°ªpvÖzê(¢ð{ ¢@£ò/NÛwdÏV MU?*-ÚÔüó¢[âæÙc£=k>Uoå5.IËXïÆíÚ1]G¢’Šlÿ–¢üÉ©H4¶-üÚC•HÑ4’\ÆÈ8üf7{·àGU&¦¦Þ [Š(È—WiPõ*¾f¹ÍnÎÈ-(«·‚cû.eéÉ×Á€×T5¡/ÞËõR:yI½¨á0O¶àHöÕûxÉõ$¢¾zu['ù­O?Ð}\+/ÛÞ(¡Û{š€Kƒµ_Ý9|‡*›²x#üù‘´¿ŽBD ·Î[õõÂg‡ë}¥ïkó&O¸V<Éžö›nUÑGÇ2›e° Ê»˜ÓÔÇ 0Ô¤ ¸ÏUøt¾¹º†èJoÃme¤úV°²×gWzß8ñ#}YQÆ8éņû»ÐS–•Jsx†UcžÌšÆS;/yùñ 3ç¥bR’‡<ÎÊ ñ™©üe7Ï*¸zFo(ÖILîò¿€ÇõPj856nH(^K·íÍŒY’ó8èö£ér|›wy1÷ºøÖB…5·èM §È¤Vw„´Ä+XÎi¯WM¥žTx¥¸ø¾ÅoòZq@l<îeqFœÎ ÔIÛ%Ô ³wÇ“¤Ìxƒ”L2A´Ë»7Ù2sã~˜ ,õÝÝŒò„ÔÍÞH£Ýž’㌄>ë£SË­Äàa;²Y :yqÀ‹Ù†'°‰iÂæ…d8ã¯äKg{U~Ñhü¨<Ÿ° wÅX)höþNÏN)L+s”Ïå;¹ìjç*ºýÛ§‡ÌÉCíêÂÁ†ãlˆq¾(’!/µul™ëyÞ?=Ö5ËùNag]Qå *éÍàÙßý8<ÿ¦ço›}÷ã°p¸9ÙœÜßYüèÆùù‰÷OO,Xþî‰ +ÏŸÜ8?xnDb@  $P (”½òÞüå»1šÍ®]5ßœ5V@+o'+Õ¯Æþú ÎÕó GпðÓ8_{j AOò×@^iÿõtüÅsôz}@.Ž?¹p~}ÔÎý¹pxx¸páøk#ª«­Ö ²¬¤-*ãXaRi×êZ–¾Õ¥N“Ū$›g¬Þ¡x õ*3öæ½;&·Úd%òÎOêvéò)ó´øè5œ”‘Î µì\fŸ´4Íø8 ´›Â Οûî8Þ½ôÐîÜÔêJÙÁ!&Íh|IÎ"HñòøŒÀ?JG0Ê;U¹}Ôèé±Ë ?Î$¡&[ž±~’K+ äù ØÔ®IÒ[;±Iñé˜Äø µ [l$‚;%F_¶Û¾T¹$nÑ‹VÙè‹ ™/zƒHÿ~Ž Þ9BfoѺ gQlDMk€¨uA=çi ‡d>æ£óÚ/gH"·>SI»ÉÈ Æ»pIë~®|°˜|'»lbUé~hæC§¨ûáLJ‘Qw›ÓQ C8'íÏ|é=0;eØ+#ÈgȦÑMQçeJ(›Ãë"ØîqU>ܽó«µóF{è¸ð',„ˆèÎ; Ì•ÉÜ¢vwbö„Ûw:›òU†pˤ‘­ÜzÝ©oz£òñ¸Ô8Æñ=˜=Þ—”‰·ÚcÆË PµGô0ÜØX)1¨¾?¾Sa;>RÝaù¥ïÕÒ`,ÆdI RîùõGŸ‡^ƒãS®ŽzCü;;X†Î&_—"Ç#s1 Ž×­ç$JtD]Ž ¾tHi¢jBton£=ÀÁªáí2.ßHc¿zoæô8‘>¶{ Éôpv²ô» ™ó NðƒÎe†aŠ÷¡­nGgcé¢ÁVë²öªŠOHùo·!s7@+¹:Õ-×gÞ0ÙýÄ&ÝñŽK’µÝÇ{«òigÊbíš ÿƒ'µlÈB$a±äˆúÜi2‘Ÿ½ò6¥º,@àMTeZrôöä4tâÔGÅ%þln©üLëÖDJ­ÌWá}{˜ÜˆE˜ $ñPb@þ̇9uâëTÄLíÑò„uGîV›û†ìa«sQ§;®<&öË}ž©•ÕTYNi¨Éè A {”«7¢7g%ìj&üNמ?• ñ»·w¹7ׯ$t u¤èø’>q!Ú¿\U]Sm ^-aYô>/Åé®Ì/Ï„·ÒI’C7ô²iUðoLk“¡,£æïÆôPâu<ú"%[¤ÜÛuG-vº’ ÍûH¾— ZB¢cù‹RoͲ¯ê«hù§È£†Ñõ¢§á÷8ŽJ«TíüHI—(Jû9ØøÖ·„aÒI^öÀï¸"Ï!Òiè \rnÖ÷Ù è²<}?Õ{Õf~ "IÖI@ZH 6ÅòG—rWzºwÏÊ•§øî™³$Z+èEaaÝQdsCÑpófqS.zYž7h™|ÁÐ4¿ƒïè9ú´Uô„ê#oÌ;Û Ë÷ý6aÕ ”¾}è—ÑQ(KZp÷ýŽ Z¤º2y=ÊB)ø¦öûç@3sË|¯3ƒ6æd5=ÍmEA.‹´a1inªÉéq7ò„ _3¡±§³Á.ÌðEif?§ù”¾â?6ý)“$Í2ˆJtâƒL@Ö¿iÀKLhÿÃ"€Ï¥®,fo¥,ˆ]çÙ0öî”g·õM Ö¢'yÒùÃ4kÞh¸XÚî¾îŸF%Çõâ}|ÕÞì6‡}Ǧµ?L œ†Gß·ZÁýQ5þ‡Ëñã;Øý‚j‘ ù$$iwsU˜à0‘;MeT}ôø³:Lù>ŸîÒê’?½ƒcªí6º-×ú¨Ñ‡.5Õ&Í ^ӹˎñ¬°Ýú)nE²Îã”™O ouË”¼y@˜ ïp®(6–E¯3zòåýxKClºgé­Ôäi‹ÛqØ$ü0& ÍcƒÒÈùŽä¹‹6Údå4Ï (³åg‹²zµÄÝéßf×Íùn&Úš§øÇZ#†ê†ÂcÃø7!·¢õé Ò¿¯³±3 Ú¶¸ ‚á˜ê}9ÊË´þš¬-fÑêxddµèÅÔóÊ©ašE¾Ð„WвJrH£HC;·Â†=掎uŒ´ÖK='Ùµä6Æxw‡>áÆ[¯Ô(^é)G.*&QáACÅó5²^T„Rä4"Ecàû' sû²!9ùjb'ÒÉŠa2²¹ÙìHI¨·´JBû‡I‰£ï§™fÁÀçVâçìáR°„#¾Aw£LhyŒp×½d{lmàÓM”êÔÃû=4‹ãÆw/ø>s%I )5@;;ݶ®Š<Ì~!-Uxgš@~ õìÂ`Ć•Àæµ»n¾bÑ*½l<|VAê‡  uÚ|zÎpw\ðùÜ3{øË{.Ä(ãZ|.©«ÊۥŃ›zïoØD§Oœ¼—ÏÚ*“J¦Ø7å¦nÚe$Wä€êÑÁãÏF^šžìùäè”{à<•KÞ¿—Q9,¶Ìîäx«âzfLÑ:ÉÔ ê}Qæçî…p*Ú†*Ú&b“y¤Êf°b]êj& €@ U^‚8uÙôÑ-üâÂI²·¨e_õbš­¬˜°ô¿·´ T|Ý'a-‡ÿÉn@ß?ú‘ådÓò(•€š0_¹x1U‘ËMâ©”OÜÆØãÏýÏfµû)1òÏÜÄDŸg¡qs¼{?j$ÄÞ<2ËÅÆ¿ƒïë'L¾=ýØ¿²®êuŸmYyeÍLîyí—:ÛÇEæf«ÑØÂ9KÖ˜¬6hûCdmŒ q…, c*‘\®°ƒœGƒ¥ÙÇVÏ#…Ft‘l Âxp(LHœž^TtÊQ4}¡ÜcšLCêêÀŸbOzûJ¨áyE µ1•fÖ”ŠÃCU4¤ÄÉFœ–Ûó&Ø€ðØŒ TßgxxPÓd¨Ë¹¯Õ½|U“í­Ô1JÅËÙ‡mnL¯Ì£]"ÊêÁŽ=tþ¬§ˆ[–¥ 0·†ÎòôöGÅ\®–òn¼®KØsMF£¥š@òt†9†§Nƒ"ÔSÎKzÔ•8‡Ý¯{u®”ÇH»µ÷Þõ¹à ô´×h SÜnq„Ÿ8!ä>˜¾'.„î7»œ(°U1_'"fzzŒÏQÁú¥¢ŠwwxF†óül”‰i_¼¿rÁÁjÖí]ˆÐúgµñG^Ug/—Ç«á.S˜çÝãv>Ÿ*nøèOˆÓ| ð}×f#|¨78/ŸÙŒ-"«««®n\ËÅ]LþÁ/ÌÔФŽŠxö1#¨ß} ê¢é†öšƒô¢ÎÞøûB佊z‘I-&… *Â| ¯s-­1½ŦÏpTq0ä ¤Ãƒ•³9gy¦™ê.Ã+…ý ñÕ’ªð$#»‚úÂP6¾ó Lïã”oêlÊÚÅöìËí«#dnT5·TÍŠÌFwòÜ x—W¨ÊT0·ø6è¾ÞV½rfp€³§jÿéË­DT¼Wtü|è.©GŸ-ê7'êÞ7œÞ¡S+Q-سÀó„™±¿Ç"À‹Ü¿…”É®7.²Ø»5!‚ª¤RËtp’§Sxk4SÿeŽjìéîËùÒèƒ}•l5ÉFýà|îù·™âˆ`Ȭv¨E€$wß µo8Û LÏ N\^t2zðç*2ÞHxá—]=aÌøL¥Pwã9‡QEïKœaUe CAŒmرzþp›~o„Û,á}n=]ø 9ù–'Ÿx?=ðyË3úž"¼|éx\ðA¥éhC\vfóÜEëCkŸ;šÒ|7nJ½¥,ÒaÐ Oø‚ãðYµžôúGW~¯ºañÕ§K¾Hé±v¼…Ö»#0÷Ï/Ý4KƒýÐñáiÅ6öû±?}YVÿ¢l«žUÎ.I²@~WÖ™YiA%Ð12Çî,:9yÓTA±èÁäè$C=U5{6Lh»©ÔÚ°×Ò'¼Þ²ˆ;Þ™‹åSFõ/òΖðÆ5å½ ÊÞXŒŸnØ$…9¸Î¡¹ð&Ïéö¡´ ;°{…IJ›ßÞÑw‰÷ki·0ØÈ;žUjåjíœ?øÜ¥lCöè£9em˜ð3åNogñ¤I÷†g°ÜõŠùã™Ôªâ|~è–Jö+Tùù”T£ùzº뺺o×1™£„në¼FYâüp—åFWy"ws¿—é3Ðc´þ$JÌ—¬´·¬àà'çE%Äïݱйy³“B¼ Eºû2‹:më˜ÙnÉÏÌKæ!LÞpÏù ñ¸Ë>þ\¹ž vÁC7§R|zùþ>a “h!™Ñé'³Õ(o…/ê 3=aç \¢ð/9>ëÞKºÐ‰Io®\’å²ó³ô€Z !¯Wvì–ÎóÚºö9¿0Oºå\š…V¹¯ŠvâôÔ1Î¥&lDø½˜¦=NÞèá»dª äJ#T9¸EɬU—ìƒe(”To5Èi5 ëJ)BmHEê™5ûLŸÉƒÔMŠì€8‹-4ɪQJ·MEž½4á~XAÕ]¼•jЀ÷4IÚ(¡B~B®C©5ßÇßìBXƒ: a#ÇéK§zQçÈShkª>¬pz/±•R˜­w­*é5QÈhCSõW˜z¸(S ÍÝKM¡™ãƒ];¶œä<„:ú[1¦ýàaƒ—ÒÒ©×z¼ðO^·÷×ß..„Øã;ÒaÀ練äï`ø¾¶Õ³xŸÈÙ|ïÍÔi&¦óöÜqás¨×7ÖŽÊ܅ʶ‘­dI#84yœ¸Þ¤°'úíã5CßeüR{úpY±øhž&ƒ¹n>ô‘Žc*F ›¨ˆß@Jðda%@4¯&æ$œ¼èŽV’‰P°’·¶¶µ±²—sˆ\ý >°Ôç jìZiëRP;V(¹[qG¸îœhÇÃø¸ÿ°0™ÝÒ@ø°ÂRkXª(wŽœY´EÔòÕÊ(פ×â•n;½ìÊC£N6f¢P„ÒñJò5GfI£{ÕTŸØè؞ߤ&ŒŽâöd±c‰ñ Ì’÷ް0T=µqsc“’?J"8ôŠ(cÄèÚß{¡YÔék)heÄzdÆð©6U枣“«Æ6æ„N>Võ¼ƒ×n¥€Qpb[ëó„'JŸOoÚÕÐh:UÔ¾¨hd0sBÕ¼?tŸ°©ŒéâýѤd@ÄŽ((Ÿæ<©¾6ÎçQyÁ”%DŒ"ˆA)+³ÒÓCù0oÐÜò¾í iÊÖ|Wù1¿ÎÂßM›npñ“‚ijc„Ï.^G°Ì29¹'õÒ’¢ø~&gê²v&蕼"[CvÝf6¤¸1ª'%0­áã‹÷¥ƒ·^€?o ){:órÄÿM'i%åj£_ô ,¨¯Ýàôµ“ç6ìÔ[ñ\åÑŽ‹ù*ä*±êvEâIž©Ã˜—¦œ{¶ôdyíÙ‡ç°^ä²ÜÆ D`—iÌ~®qêbÛW^œfÌq^é,xÇdtTvÚnÑ †¾w»aöµí¨;Aé–íå¹CºNñ»šÉ·§åB7¥tw«²2ÿâWýö®Ï_^=mùï§ŸÙØÿ:ýÌ/äå |yïØÒÚA€z§©`m.@­Å¡À¬à$²²–öq©ù(ª›ùØšñ˜S ‚{™€1z™81Z\ù] W321UyI2H/^/{'{0/{;W^/ê«.¼àkH1pÕÄÍV€Z[AšÄÎÖÚ ÀÊÄÃÄÂÈÂÆ°p1±]%-`a⤃t1·àU—ü üM€ú‡„§žlW±sXxxx€Ì¬@VVFp FWo7/FWrê¯ý¬µ¿wspeºÂé*Z‹µ6…‰øm o^iÈûÕïW17¨ÝÝ­Íy9M¹¸-L¸9MAœŒ,,,Œ×S¹YY-XXÌA,¬æ߆súÍŸÆW€dÓ|Å«ìâhînr †$©”‚üúR=˜<ÔÀÿÍX ÿg¬À ýJ~p^…«d­â&n AVfNFfFVu6^vV^zfV^ff~à/-‘®º^ç“ûwºþÐò‡®Ž.ê`‘´tq´°øž›“…‰••‰í‡n_[ñ¡Îÿnz™8)(ü3Åìí!" iÇ+îhv•aEFü¿2Ôÿn››}GØÉÝÅîju˜›Av «``¤YÀ››ñB‚B˜€Gø!D:Á"®t³v³ ^!&bçv}ag ‚V€Ú‹ñkvjA ‡«Öæ×ܰ³þÊ–«~À¿`ýWÀ¯krù]sþ—ªþÝÏÿ>@©K°ê ö„(ÃßÕñ_ÚøÛº¦ùÓ²¦E^ 1˜é§ç…¬fV°Šf½Z$ÔÌÌÔàfàÕõ/Z|] 4Z/´ß_àôrY 1CÚ2ÿprp°q,_ËXXÀß®k¾–±pps±þRÆÌÂÌÅùk3ËïeÌ,¿•qópýò ×Ïe¬Ìl<¿–qópÿ6 '+˯eììl쿵cceûm Nžßqagù½Œë·2Vžßá±s³ü‡ó7œY9~ƒÇÂÎÎþC_7H¨«w‚Õ¬}@`¾€ªŽŽn€«·:@ Gëõë½2â=~Nf. .vfIQNQnV6np³·;·„„¸à¿na€t„ÀÄÅíJXÀÒÆÊ‰DI)¡$ù?aCþóø_£ô\e©`²ú?ÿ“ üŠ,Ú,vœølllÿÿã¿ã‡ÜÚ¼)¤%DÄ%TÄDT%Ô Á{UETuŒdeÔ¤‘ȯÓWþc$$ $8“÷ÕáØ´åþ–X]ÁÄÕÕÄÌÊÝäææ ù–ëàHdfåàhçhéÍ„ø±?-¬cÙÁ{ ¸‰ƒ5È ær0¹X‚[C:(ƒ\®Ò,^çMÀp7Žá:”7ïIÛ¯CYÑ\-Ü$içUd9ÇŸÃî} ^õ©¿Eéüÿá{è('kÜï³¹’…¯è@ÒNA2CâW^GÔú‚ó*±ÀUlÆ«ør×aË ¡Ïè¾ågý:ð/Üürô;¿ÈL 1 É =¿! ò‚ŒvØÒÚlj‚[yBR:¸]I* é{`}²oA“ܘ¬ i­- JCMÂHKFQMILî‡ÆüÖNVvN&NÖ K•^ø± r# #®¥¤* CQ–ÐY8IÜAn{MeH(Q#7Z¤Œ¶„8x)J*Ñ1\w¡£åûCTII^BD@I¬ £v&Pòk¾)f6Î+@ L`òJŠR?@¸úþ "æ&N›iss©@ט\7eøöç+<e#qeu°ö«5 µoÃÐÀA´‡¤£ ˜Ææ`ÝÌÎäk´7°]·7µûžg÷:¦éo•„+@ºk¹†°ÝÒÎÑ’ÓÇÓÚÙ1’/Äìk(MO+Ç¿â²ýŽÂ[xb`5ðb_ü{ ß_þ@Ùo½~«âûi¬?ô‡ñ~«“l,[[@b­ý o×òù½æÔöUËÿ1‚þÇþûÑþ³¹AöHxE&¶ÿóñßY˜Ù8XµÿX9™ÿÇþûïøaÒ'C~0½ÀfÇ•ÅåhV¬f¶¥µ#Ò·¦ÿ‘Ñéø¿`uAºÿÇf¤ólwýØù¿hxAºþç–¤÷ÿ‚éõÁÿ+¶¤ãl|A:ÿ‡Ö¤ë¿e~]É¡º4àj?“’PWQ€˜>6 ønÃ"Â<à6jÒHÒ¯Z  Ïøº‰2º92:8šƒ®XáÀÕîZ!‘á]ÝÍí­þ :koâàr¹‚­¦£¨¤¬&£†Ä䞸(àgsbÅ1)+C*¾YQWé-iè®Ðù†‹$Óž©‰™-í×ì—ú2&.–úÊ Åð×ë<00į…nÖö 0¥®Šf¨Kž©ü\ò5߸ö:WãüJš«p7ðôì |½¼†I͸ü欙­ ˜z×àM¾â@¼6ƒÁ•v £kÄMÀ—?Îä*³ÚUÁŸip5î×ëïp! xÖWô—PS•Q†¤‚„ˇ4þuVHßò©B$î›ùx•ÌíO¼5¹–‰å€ pˆÿ ’õudr{Sk‡ïöéf×ÃB|¦¦Þ04l´`\¯–;¸\ჩ7D3\Wý ø*¤3Ò·q¯£=Ãd}ÜÔûk:œ«0àÈPWi ¼_Ãá_‰ðWv¾rÉ2±oÑ‘˜dT¿Õ kËí:–´‰$P¶Ûu>ø« ª«°àððÊuµ6…„оʑ±xAS àj‚ž&ä Ìm$KH°õÑ¿ æþ]f¾'¸R…NW2qÕík§kó]KþD#ˆv«M;°Pü•¨Ù2EHô`^°rP°ð@äáJE(Ê)*Iªˆ+")AbÝ_ÑêÛ’¿RÕß•&Ò "*×¹¿ÊÊu8ö+8ÓŸ`k(H¨ÊˆI+©©_QǬï]¬ÍWñ«¿Â…t¾ïGØà[««ô&1ð€u˜ª„Š8’ˆäâáÛP¬ákðjSˆæu¿N©WTûäÕ$T5ÿùo2õŸà®.¦|÷ŒoD¸Î3I»I³àô=€9¸ý÷µù'xâÿ5xàöÿOMLý¿Òá!Š‹ý§ éð¿ñHLIYâï™¶X@ñÿˆKòJJrÊW,ò—$]'Eƒ¼Í‰]~ÎûïA@äHFL å§Ùÿ$ðž¤õ-™Ã•>CºÊ I¾ñº\…ÈG²€<]0¿ÎTðS@þ+¥`íà¦ê/»XMˆ]ƒ¹Zà. Hx0žv•%Ý b¾÷{{HU7$÷¸ÃUæî.×z¢ž]®ÒãB’Ë|Óý_c­_«v†ï[‚9x’.ŽÞ_70Äof7„Ý×àŠ¾~ßÁ;Ý•ÑÑàëkŠ8Yÿëà›ÝÝT!ýLöÚ¨@oW9k il@_…åe\ÝÍÌ@ óëL EV, W±ý!1ó¯8reÎ!]Êã*Vþ÷dèŽv`e !š‡‰˜Û¿©e5 11 5µ+¯v³¯Rò÷æ×¸ºBÒàxÿ&sŠJê2 ׄûI" YÕ¯léï™À+²èL¾ùN®ÐÛeW´²0±·ï ã*»Üõ(×}¯˜¾Dò4¹çJÏþ©¯‚„’ÈÞ"¦à¶ /+÷?® 1E1 yy‰ë®Éér-'vê¶~ÔU5ľY?ÞþÁ¨~·¾-¾¯B 2çû×WËèë¾ñ¿**"~•¾ïÚÞú¶y· †"ä¶ä*½"ȼq^±ÿ_ù7k ’¥È|ga›=Dš 5 âMÈ7ó«ü,_$d_Í¢¿n} Æ„Ã7%s=2$/Êwiú6Ã6þ+ð×êåB ¤¿f±c®Ù×û¢o¸|Wž4WÙ# Å£h!ìýz;2§e‚ÜXC0ºÎ|xµD¯™ùï û“¶ý>ôßëç_‡ä{úKÌÁ¦D¾+á×á•b„dùJ¸ëÅý}-|×ì×S¸"›£Ë³ù–¼Œœ*@QC^²ì wSy5¥«ò•*¬&®šˆh¨K+©"ýâ˜@b2uAú7Üÿãëû7ý=‡øoÉÿ9âÇù‹ÿ•“ëüÿ÷žÿÊ(KË+‹(ËüݳßêÿÏ<ö0þæÁ/¾O·ûŸÇ¿ÿóø÷ÿöã_‹o%š½Ñ^Õ\­(E õ«§`;M^BñûJú¥`eýú°î羜×ùÇ 'Ç÷Îà•Èø/ ÈCp¿ó y#-5Vq I#ÚŽRQô¯Î!þÕÊHL 2ê×,ÉâFàöÿÐJý[;ګú ôüJ*ð}À<–¼2¤R°sRûêT‚d²–QTX+¸>;·äø€Nùç¾ßGý:ƒ+‡2dÈ_°‡8ƒD¾ŽúK*ØÖw‰üŠÈ rÎý{‘ò×[}~? A|ÿ?¯ØùýIïÀ7nþÂLÀׇã_Àí~ãç¿h÷£_«®Ûý{Œý× “Ê ˆ‹+Bî¦ IÓÿ-qº^žßÖËoŒ®ÀÉËHÉ€Ì^äŸÚ««B¯I€Yù¹jÏúÇ~Dô×ø?Œª„”ŒÚõx×j’’2Ú?ö§±¤Å”ÿq,ö?%&!£)a¤¤(¯óÇ^Üꥨd¤ !¯.#&¢¦þ§^,Ìê%£¬Éi¤¤. ™‘ºˆº„¤†¼‘˜’¢¤ŒÔu/V濈(%"b¹¯4R“CÐPüi¨_H÷s[EßÚ²þMÛ_&ñ ™~n a%äfIBõOÄùÞVFQL^C\ÂHYUâÏ~%ÉÏp%UÁ’$.¯såÔý‹ß”ÈÁÝþJëÈ8)»€û{)]¥+½J 03üV¥`âànb÷{¹ÈÎNÎÁÑÓá÷*q+3§ßKUÁûÈEäëfuÀ(_ÏÍHI¼dùþˆ«š»ÅßáúcÕ¸þXþ ®?Vý…ë¥òÖ¶ò&Þt¯\2¿·PÛ8Žö׸^Pÿ8qó«$B2WO¾£ÿ­BýÚòðý\,î~ý¯ÅcRlþs9„Þ ù5bâ"â×kãHY(M¢ë¼ãN`ŒX~)ÿF±ÊÔ!™,-Öp°uøCkqÈÛn¿+:º)_[¿ÖÈ;z‚\®(2 I#%å¯K\CíOóPƒ8¦åA ;™où­!«Dàëºfø© „±ßuË×&¬?7Qs7ußüÔ„íç&"æà[ÿ_ °ÿ’Íö—&?7Qr±ßzø\ß|mÂýs©ë#f?A‘€˜W½‘¼„¦„ü,Œ”äWU÷“ãîÐ÷ʲº: wuöNÄÎÚÒ²(ù®*¾Âòýú¶Èõù¼ovÏuÙõÉÁ«ˆc×Eþ€« €;äÏ¿ "ÈËívÎ×UweÑü¢?ª”¯ ~Z€Wé×ß×àÛBT\ÏéêIŸ¼µâúû«øûJú½J’ý¯bÀßÏbsý}í?³îëÎóÿÖýŠÍ¿dÝOdù¥÷/dù¥öŸÉò}“ý a~Çç¿FšßúÿBœßêÿ™<Ùÿé£ ‚8[Aæÿ&‰þ€ÓF¿ø…H¿7øg*}5§þïJÎW$þ %ø—J²öúëÞó7P¿åºð_(™o‡¥ÿÐBÆBÆÁäõï*˜ï˜|'ˆ²˜´ˆ*àë©dH(Ì«ÂØO®²Åi8€ &W·È÷ºæº‹ˆƒ÷?tù}…_uRp·sû§‘þ õWýÄ\Õ «ÇåÇ~ZWS…T]í^?–ýõn襒.Öà›r;ïoTÕonÊVÞ®Ö_½`Àz "Ú¿ÝlÊK(J©K@ú\sé—N1ò¾þªàæþ׋ï~‡Ÿ¬4À_öÜ<8ˆëB]G°Iln IíÆÂið+ ¿®+²]Kÿ¯ûÊ7¡ùuGùVþïy9~urüÝ=÷¿ç“øåtü¿ynþ/—7¤Õÿ¿Ÿÿ8X»}=†õ¿#ý÷¿xþÃÅÅÆücþoæëüßÿóüçÿ;ù¿[t>8|èÃñÓBQ$…{ÏÖŒ2qîm'S̸C ?¶‡ÉðÛ^S±$ Ç´cïiü¥Ù˜>w^ḂbT;z¥Ì`†€oùóã™8`gÁƒOë=—M“¯ÎT7Y¬Ä5M<ÁF\X>'¿«»". í`aJŒÏ.óÊ…ËŒá)Ytï¾ÉJË¥—‹·«Gcóqðwæì{ n£Kÿna5?8>ÛÍÐGåÍž 6ÏìzÃJ6«L[–i£©úÜ×o31µš™Q÷]|×ÖK{9PMö¥€ÿåÙ³úÌêÇOe°}ª¨Ší5«†/šƒÙa©Þè]mž/ìî߸ˆ˜™:S0,‹t`|Eëv&E\õ˜av¨¹ÙîUŒãX·Á”7ÏÝlèN2BÒjõÁI¨’Z&fÚe™”{Ç¡µ•޾ÒN ·ÛT¸(ès#ï§û|ƶò+ô¥¹qœStÙŽ‹e¨T $ÃΘy<ϰXŽ ¤g~ý)CR—AC›ÔÂ1•ÌŠ˜È°¨oUrf2ô[O½|*ù„|YµúK‰’ß¾øBQ%¥.œÂTVéÿœäuÈ2E6Yä– *Nä˼èeøWİ„ÆN[Éå¬X›‚_RŸQjãòbŽü[có Ÿ M·f÷¼Àe?1Aèx7‚úÊ]÷ŽW,æø@·ïˆú¹]ÁöiÊT‹œPªêÀ!ÚÕÅøèvŒ¢£Í±û0­¬ƒŸ»Ð½Uæ”­ëb§†xæÒ"ñ86k›Ý pQ˜ŒœM[r͘†ðéôdûS¼6,Û/ŒtpÙ¿ÒÒ)!ìÔñµ?,).xÁ;Jb|ã®âhEÿ7jÂ2ÏÛwéc9ŒmLÉ”ÓÚ½ …$@sÑ(üìm„cØÄ°Œ*;–ýO´žòf18δÜx´™’ <н«È!V蹞t*ÇiÙê9F´çƒÞ÷å¬#—Ñ©–½]/ìˆÉ­fg‚˜¢ˆîC#]dsóKKÂycA—N¢€…Þ¼5Á07 ‹"Æ YcuûmœM¨”wò…’€­E%`˜ ©ò|MGœÍŽh¬D?ƒDþžÁ;¯q¢¢g2¨±!˜Å¼c Û[ÅO_),x=~Ë.(~˜P0ºödSÑZýž€øH"LU0zK”º°œ‹)®z53Ñ&dg(kl…OÇ}Kü.Ì—ˆP½Ç ì3ôË´MÓ¥£ V±75{Q`S8,×õ¹;…u GE;6í-5ÎZ|ò÷Žû:*¡¤Å`õR÷¢›ß(S ˆP°„ÊrúÖ‹Õ|4¿.Yó+%T{ÁmI#ÍdWjÍóÈTc+<2Ì0lëØË'Ñ–}©ï^IH‰Ö™"Öc2Ð…ˆÚ0’«UZ}ë4XC’øáüqI}ñzóôv ´ºSøPY0Õܘ¶Mƒ~Y]ãòˆÀK„0y6(,T¤».Yò(Öâ[ÙA®¬ÅÙÎèãýšòOo…u²˜F\êÎcMd@1s[ ´ÁU˜a;SrÖŽìõ`ïç¯Ýz½ÿ|tEå†)Âd ŒÁ: ÿ–ºy!-6’t8Wó'Ÿ”!Ê‘&/¤+XÝéïðÝÆ„ÖÁ s·dº'¨yts BÍ4 ép[Þ{„o¤Fgš®E _‡QKOWœºS—&ßù3ʗל_”ànͪO–ãã ˆÂckP³ÇÜØËC¹ÉJüJxi2­`ܱŠZ1‚=·v÷‘7áF˜î™ÄÜ³É ¤,Ý“ƒµ)ܧ‡ÆMf3_P+UÈpEn=|Jþd>*j¶?y¨0nð–Í'”(*9çOŒÄªüˆâŸzÒaˆêVØ{.^vÞ[ à½sªóŽ¬êƒ¼Â†7Â$&ka£x,|U(ºÆ„-G· $ÍÆJží¨]$ù<ühM½aý$,C•¿a…ݹO!uº‡Qâµ3Ô«é"æË›‰á‚ œ¯Œa$Ïo4"֑ø٠ª(\0k¼-ׯéi|ý¡[RÔ”¹Ê´º”Ýê­øY‡)3Sø4 \Љ©™õ¦Æi¸Æ!ûf?^ã4Á‚•›¨q£• ÂTžø³mØnÕEƒ`ügAÈ«ã¼ùUVì¢/¿­¯bµŒôŒÄ‘¾ÍûäµÛ\î’&fnßäF'/,ø9µùQž× Õ[<†:·ƒsô–ìòé»Åõ4\ê_ †Iêàí›]”NÑ€å¯);µ¥÷˜øâ< Þqƒ¢àéÝõãš湑ãÒÈÖ:âbʧë6®±‹Ç Îöíù&ìÑi-™a­uçoD:éÇ4øàyE”Æ9óá o0yó;ìhš<?¸+è¡xô"S¹Àq°Ÿ¾cêò^®#Q:½ vÏ~uCšŸ}á©$PZÍîþL&€ÈûëAÑG897ÕÓÍ´¥ÂÝÖ¡1ݨò·>ôß vÚ¸Ç~ážâõÅ 4±¶‘n×ö$Ÿä†¸N¸Úɺ)VdZORW؇"Ç~.Æ'Óoi¬–Ýý…»ñ?ÊŽ&J=Wwj>•ŠíÐÞALj¸pª°nTDâv”E>íjÿx:A“¿ Çíüä¶·ACÔ ‘w]cóDÏÕ^© {ò))“ò÷ñuvu¾Ä¸%~³{Æ©M¥…>æ…Þ;5ñîÀ£À:‡–¶ tÒ†Vº´ø5’€µæ/ˆ©XàâËX¤Ù B´=¹-îCÃj»ó;ÒI4ßevwØÎ9Î1˜š¥tbq$Pê<” ²¹™&߯iËÅM€r¡ªqžH9¬Øgzh1h‚<²(|zÝÙ^8­¡ÉµÊíEàãOÙNÊêÐø,]4̨”ÈØçaIÆ2Š÷Ÿbe–­–oR*j–Uûø{}xй;­¬Ûz:+RdàO(‹P·¡F“¿.éWâxñ|÷‘‰L¸Wp¾úOû[\‡s_Wç $cÓÍ[òÖP&rè/;%ñ.>êYGç»ÕsšÑæ]~úÌRi#’/‡Wã Kwt—Kùcd=´œW7¾àåÓäpA¾®,µâ-Eõ[Ûl³çu(ÝOËäxt/ƒ3ïœXà%ümè[lVnŽ?¥ëüõûß4:]>ôbø¯jÉŸveÉušÂŸ|z…Ë“_ÂÀƒéIjš¯ `ŽÇ‹B 4õn{y6Ä#ÀV[•.K—_¥ï/àßè{ÊÃi‰v‘4ûÑc¿_¡w»8¢c›ÚˆJ¿Å|E«ä¸Ê}ëMÈ©MNÛ<6Ã¾È ?¾yþŠŽq˃ŽNW×€¦úúƤYíéxƒ²' Õ€ôÁ/SÏÍÒ‚ÓP>U™d5öÒ³¼:yeÁ»È»rëÑ’üž/Ìo‡Þšë²[§X¬v·,uMìÿ̼üP#þ‘ÝéóÄ6…!í €Žµwb<~ã%e;ÝD­âÅò}¾î:Í |ýˆ'ÐË£‚Ó…ãs‹u_eFÑ“ƒT½£t^úµ@WÞÀGÕÛûL ĪР)&S5F:ÅGw%ó‘BüzÚ£ŸROø`~(#”ŠŽåËYcTéÛ3î舩à›k¯—ï `k”.ÙqZ·¸³‘Êâ–%IÔ¨z•Ò‚»–ŽÊÛüyQ£T¶Å‡¥ºžÒœ4åŽ:§ºJñ?i¼YdïDè>¶ôZ:·y˼®±Ã¨Oêô¨¾¯DŒVœÏ6ÜÄJ1wøÈƒ]Ý?FS[ûLAòù½Ïæ÷.ÕÊ|C0Òõ˜n’ ÔKâ‡Â×Èt~2= Þ3=Zx@,,¤* ³:AÐIAî×ÝVßlÍÑÍew²ù­•‹î[ŠrúãhÌÓý‰Á1[¿±ƒ©AÔ}Óh~J;Ñ‹™y¹C5¯V¯“Ú—ô-éˆz+Ž&|è|–Þ…ëYn˜…ô„tkâ|ŒïiÄbž²m~b¦ý¹u:À™«¥:ãæ|ÌÎgÍ”åUyŠ…~¶š²fÂ"I³^¬)—Ùzsù ÏéÜ;Þûˆè·õųEû±™V{/ZÎS'Žm Œ˜>ÃN=#î…[>qÇÒHC Rs•n ԼŠVÕ"C•¾('eŽß§­òIØVS­À`Úôê8—H›cSr"»º³®a¬{NdEDâÙGêCd޲Þ&8q‰“ÌíɽòßRˆ}ˆh/¬<ª˜±ëÍ4PUѲµ6xM5Ö5°ê$¤=Î3…õE£Á/*5A—mö¦J×gŠ ‰ŽØ05ÝŽ$ážÚmK0û°³áÙ×°²ÚÐA™ÄCÊ&›\!ñ76ù¾—»˜¶–…CŠ3©"ßSDý-m{94^$ºQϯaõ´ÅÄØ1|æÁúòô7Õ)sj[VÐÙ˜r7ùWñA÷îggÙ'ÝÐ-XêÕ2(&¿[’’†éë²àŽ&Õ²áiW»¼ulÁŽÃÙZx¯%¾~ iöH¶yÐÕÊ®øöÉ4Š–Ú£€|D^ùè!Âþ†GOUßû>do|ö,.£Ä é´^ƒV|˜9\)óAš6Uм,÷Pmp£ñn àÚ+§á9g~¶Î&Š@½h #w” ¢Çwó~bÀæ0¤‹Íçîîlú!ÆpõEúóxëà^"GrÏõúœóq´ÆíTt ŠáYlû:v•é㊮5h›w èÞ«Ú÷ÏF-0ލ RJHð–E÷>âóÕ²Jj·U禰{Ô± ÔóØkU?<–Á¸•‘y‡”€¯|¦Í¾pƼ’Iª!Èâì¨=ïŸÁ %k ›m2Å--ç™Á˜Ùõ1Å´ :Z—æ­ÄóK1TKÖQ‡¥Å|سÈiúñ†Fè—­v¾°yÈ®•°8Ô×àª5ýK·Â¦Dt¾œûãtí¬Lï`·}±\ ÌÜw§âw®Ë¢¶WmKŒ #5ý^ ƒAæe ã‹à‹ …±—qâIz7™¡Ñ™„¿Ôe¯’À§ÄùîðhV+Õ}ÁÛjBjطѺØ#el!¹_Vh«mRA¨Wk%òªÅN†‡ÚXnÛ¬¿|O~Zéqe9‡÷Ø«Ü}UØ;ãíÆ)æðºT>OØY\aM%¹2|Šˆ{žÆ “u­t,§9–a]>ËaωJzLHÉ»”߯Ç+ÍAYsf»+<}“t/›z]»EáYÏ›}cVìœòîR“&3²N@9N µ¼Tª¥#T÷ç¦J%É·)½\µŒç»m¾(8¨32ÕëÔ„-W;ñIuä¿by¨_Áê8¯2&ÌòmÆJûÓôCgàjÀƒ"tÁ åT,m¼zòü¤}bä«u¸ûå!ž÷”úcZw>d'r<‚.X|á© s×–wÏ£.Ôa߉>¿zÛ]_'éÞgÁmïÕGiwë [&iË*èÙxŒHŸZ#”ößC_| ZK˜XÙ~ø¤Oš¨þé)Ir©v°uZ祓V¡$¹Çΰ¨þî¨Ñôác £®èံ5CgžÞògëö*[€&üò¦œmüQRœiMªî{‹º_LËoW4u¹û„"Þ{*¹Ò™Jw›C]*pÔÅ󋯮µÒ¾„ÀNwŠ=™¾{Ô-ßGkÓ&óî%o©ùʽ ¹›ªn°vÙðRHžéŸäø“$UPV=¶ ›+€V¥Ñÿ(>â\cað46öý‘6W³( {O |œšÝêŠ,[¥ý…fýŠ Á©‹¤Øf‡dSù"¾;ÌМÂëEJnV…ýQT©ÎC;²M߿܊µ„'+)êírÆÆ‚aþ4!E¾ÙÔ¡Š /´n6ûè Ô—´ûE¼yÃìb$®LÕ–Èt©÷0´<ø‰l<´à kSwÌØÐà&ŽÛ9%ßut 1×(l4ßë y,íÙT¸‚SþXÂ;_ªK÷„™C „©ÂÊÌw|Dz/—ä¡{·2žõÚt.m6IèI?uÂ6žN,”ZԇǨ –mÙ„©îH::kz¶6u§mü£‚ž š-Ü_¼Ñ/‹æ¿÷lÝ6r7Ͳê4|Çô‘vÞ²Æ4wåAF5n½“w05XÆþÁ­ÑŒ4Ÿ?"›½ÿ0Hž"ÀÅ+ÔâUó|“ædÞe™…±ÛwJæ…B%ú'&Î7”Å+…ãæ1ÍÇ:±{:óˆ Ýqlò_+ŸÔÜïõN€~ò%'\ýÆEb]º0…ñwmЗÞOD`ЭuòJŸ^NvÊa?É0J¬^Þ‰”µ>vvðFUŒš&6uØÀ— ÷oK^T¯F¸ƒºßP«d{xñž ž|*™?Í­›ü ª)Y=¬Œ5Ï[ÞÞž•ˆ>‰xÏê s þFꥺàÐàà4¡©Ö lô³ ®2ÃI”©1´Îú4Æ¥¬IÐÔˆçnÙxMÞTvÏxS2rlyš•©>~tÑ<(ÖÛc~±jÛu[‡³ÞSñ”"Ðæ“ò‹;éZÕ™Æ@vÜ!&á—­Z˜AòYbé‹ÚŽ”ÒÝ®TŸ±G5…o°Û+Vïg6k{/‰ÆÝïž/#ˆSX8ë<#*>Ì¿O‹*›F‹.‘?5^O“Åõ–©ï„¥Ñ>iR*»KG&Ñ›Qï„“}o;}i»*ð¶{‡F—½µˆ¬Žðƒ‡ˆ&ãÒ¤Þ8o=6E”hœÒÞ·Á†½dËq>¾üœ¯£þ1mLgb58#Æ }K÷ýªÒò¼œLëÒpHfzWOމøÒ³@΋hM V{_³ ¸(¤YhÖc{½iƲ7ˆ·1ñvø±8É€D…ÌöT/œ²xEÆjŒ"×ZwÓ>z}`Uén|ìe½Ydb0;zkÊŠ±0ÿÀw5Æ´~°‘ðù±[î[Ðë~Ì™‘Ôö8šZ((¹ðóòÄ ·…;NqËÓ§§v S«½½Ï{ùÂæggÌ­ÎÌ,O1¦zÙ|ŸZâôOд œùD Ü/Ú»qT¢½pt¢0[È·jº" ¡ç|ú¸wQ)xw­óèõ»Íõw»š{ :ØÞ×:öt9IÝ[©)¢ryND±_Á/ˆæƒe§-±žƒ­üˆNÓÐDýjOÚÛwƤò‘ 5g§¡Çœ w˜ãU©©±`êÝ!AÒdàd}çmýà$• Ê £2œÀKÑälŒFPuHðåeEÍQµãp\+ap>©6T6Aý{e•3ÖNI9Þ‰÷ðìíª€g/ˆ†L¤øGs2ò£¼ö® uª|[VÑÁï^±ñ8--p™P»°ÆÚäÏôêË£ÓëðXÈx½¬2N°X:·m³].ˆdtäÍ;4é¸×ÇóxDùñ‹g{Ú™<Ó[Fè!‰ÚONLoˆ ïàæhÊh½öZÆ+}Ø'7%þ`îQ½€´!Xâu‡RÈÈ©?\àË]m/q#f!i†‡ð=†goØbè?.`±ø†Ôç jä—ÀÝíw¼¤›+>³†w“¯Ò÷Èl/Íc/ÐÔûaÇëc†‘ŽÁÖé2ŒHfwÓô¸‰|¥ÞÅÌh×ò°B™óaïD.vv[¬fq†žªÜµÀ0K}Jìéz uDëÝëÆ¥w\/Ô¥[6Rï‹ç ‘܈“qœ ËÕà@ɈØ(SÆS€Òr ^ÃàÐÔ Ÿ1RhÊTíññ~K§:ûn%—&OÿJº“#ښŭî>I£EÌfB.Ù{ß.”X Å®` üI˜™^›>#¨Q3Ö¤Õ³ mù‘WôüÙ¨ ‡Mó´LfJüc%þs!S¼fÃ*ÜÜ& ¤7>,ø‚!›Ñ•«¨¨µ=^ϨM1flmê@ÄçöÇ‚pNc­åÓù©ÅÖRAÝï)[>I Ü´b&ù´˜ÈJ©H¦òL ß“ EJÈçþ‰&©ãí³%¸ÐÐ ÆË°ûÑn¤Nvuê–Î%й"·Ž½é»çlZEL˜†÷ñãõóÛ†)*â)÷w¹¶V#í6ÄØâá=xíÙP\c?b‡l«ƒÐ?It«lí³¢è|§ÉDí å,Q@¡ÑŲÄHfºkÎzãe|ã-ž©}ÁRdÍPÏ:'Mqt•&€â¶Ck˜F@pñ^­£öƲ±‰ÞS%+‘È /V½ôs˜Ëstg÷›¿‡}gûfs±1/üÝËúoyb û‘Ú™o5ïhm²°[ŒHÅæç§¤âaGj`|™É;¦pÅKJNŸàCR¤æõÀ9LDz„~Ë럲­©TY{ÐÑ bXßÀYÔìØBùöç"z7T^ ·=éxçÁOú!˜RâÞÈAmª’9@;ß]à74ãxº›møÜ7ÃñÆtAW®"ož7?a¤TS‰õxJ‰;œ×Ú†¢[¶Ö€!54Cþ‹LNôetE•3u|°xS&RÆjz<ÈÊd~n+M(çw*}¿Y`fùVÆþKúeKHskQG/€$» €›Õ ¨ê9Í `·rD˜b»Ž® rutw1¹^GÝ7S¹é•Å%@u—¸Ÿ„—›ÔÕAh ûuH®d$8=ø ˜ô@1ðwHjÀ÷¢o78œÿÍòü€àUr—_¼òïÿˆ!$üý'†¬?’õ$deýÃÿf²þHC¶?ÐõW²}Gp…!à EWPÎÚÜ ‡t=å+YP½&¸êõ¬T‘ `¸îàØ”šŸ' nbâfbçhù î×9}ËÕ`ãü!®_(ö}rH@%eË÷´,?, U®«~?&þþá’* +ËkÀ—ÌH,Ì×—ÜH¿& çù'ˆ?æúw!²þ#ެÿެÿˆ#Û8þ>¿¼¢&® ˆ”UTUTtE¾f¿NÿK†z˵ ã{òz°|ANjB²ÄØ™ò&_¯YØY€WYä]õlllWæ¿þ!]ÿå`füÍ?p NˆqrB&¹†|¸®ÖÕ7hœnð5¤ ¸ékðodHíuû_ÿk‘®G‡|ØÙÙ¿ÿeåâþ^¹þ«ék Ò5ÞlÜB]- Nˆh_ýþ©ß˜rµ¤¿.gÈç›@ʹÁ$ýZþ•Ð^W,ýª0 ãÿ¤~\üßþ~gèw%ðíŠë/õð}†WTøA |cëêå_+‚+¸ÂþŸ”Å¿T&œì?)ŽT&ÿëÊ„èìî¶ã¯а€· k°vA‚ˆ½µƒ»ëz†í—ñ~–Ì«¯—þvJzŒàAŒ¬`¥ÅÍf5›ðê…°éq5ƒKàB°câ$ º à ^ë@È8:HO$à5PK;°…TsÙk‚÷6p7H¼Ë+чˆ2Pû+vv0ÈÚ]4@ P( ”Êå @E P¦5P¨4šÍ€æ@ÐL  %Ð h ´Úí@G Ð bÖÙ,Ü®¯®ÈtºÝ€nV. Ðèî`rq5st=€ž@o íÀ÷M °Ä±ü²Ýÿ`m]ßYýxc…ô³ ˆ}»ã`cæúž Ñ+ ¤¨®¦5s—…ª¹ÑBA¡F¡°ö]cƒ¤ýF+2]ýÜýM€‰Ò͉“# tXih™[æ8âpØÎôº¥š¥M5¼ï'ßxðÎ2lÕœ°¬ì‰úSOØtI½D*}m ÚW¯1º_׺÷èU[¼¾Š9u]e| w~WŸœß0çì¸ÀJnÏ9€6ñsH)dw°5 °Ñ÷›ßYäì¶=pQUn! %ÿË%´È­êDì2]ªF·håš2ù´”Z•ØV™ŒÌäÇÏyø,mLUg8E.ÔmÒ"ß4¥‹¶£2¤®½åˆÑéF‘$bG^‹ÅAÜ©hÊSœ$¶I¦‰éˆÕ¡ÑÉ×icÊTy?Iª„ò=røQ§è‚)ùIeD8µ! û\§ê¥)猠){Œâ¹´\–û£IîuZ¸‹î5âÜ/½ÚC^½i݇=vѧAü¾&cÈ==Í\’lÝã/ÆïF÷ã<Ù[@¤§æ÷a9é kút0^èŽ81›µ`Ñ¡×i| ¤GYK¹œ,e5Úå%·£1ã×øšÖ"'Ãd,̪J2áébßÜ{áºAD´ Þ¦¦ã^¸Þ¥ªxÎ[©kõ½lGhƒíœ Ä¬£Îx‰•JÙb«èÁ-Žc;¢zÇ»ìîÁt¡fÅïlhÏ}”B ¾@}QKúø›üÅЃM¯v› I W 燺¢~ù¾Î¾ÜóáAhIŒð±‚Ä"ÝþBúÚ<§]Ë;CÛÐym¢Œ*øû5Ÿ|ß`zçH ³ëkºKF—\˜›}jÒã÷ã[g~Î,o{NPë¯ö¨HÜ©W¹ÉèC3J ÔB/̇L£/ÍË ”3G¶Ó³gK‹Œ¸3ËE}ã z‰Ë­•–ŒB¶z’2H€“÷Œ¶±Ï›‡ö—•QŒ-i̇—(Žú1&ý{óÐ_çÃn*Ö?¹cº² Á³ š4\™\•ó\…ÆDTÆœŒºgE’GΛv2¢ÕÒÆ¿(g³2øAwWpŽlå³7þíEÒ}¥##ëF´VË8¿p@®\aî§öõw–‡¶£D-ÑóÆï'Ä\0ë ìŒÈβ+Oü)ií¨2âû¤ËjÅ{Sš?çt×ìÓŒ±ìl¤{Ó ô\ÝùôJ O`:ò¦EØDäJ$73…é‰öz¤™vz›Óìý Ä&Ø7thŽ¥ÐHƒÒÞŸ?MÍ<Îd‰S!z®6û|ä¾!qÊ+’ÚWIZ¨Ä4°tf­"÷ºÑ¥ëÖŽô8òìwùÁ =ö9)Ò)b¸VSز“B³VÖì?ß}Yà÷¤í³üQ²šÅ ŒmõQÖ«âU͵-^ex Íhì=Ö¬*ÙSänRÜ{…:w–ZÏõ1øöEzBŸ¾ìB=y•¿'ÛÒ}  üÜÞ~9[Ô$»¹")3%…ØÿØÒÞ8f¢U¿¨–AË9Ÿ£`dο´Zš IqÑêãƒó7Ÿ@{·-Ý4Û·e,ª‰;£”õÜæT“CŒð`C7áŽLRŠ‘IäÅÞvBœv-w£è+´¼ã‹­g°Yï±Yc‚.³f‰Òö—ö_„ä‚Z|™öÙÎÌK³"ø‰=Ó_髾DfÖ)Ÿ³EáQ+N]Jò hê :¼M¿¹¬–¸3Yw,ìu×ó‹• 3!öc_Xï3L¸i¡^o¬ûUb55CsVŸ•‡¡k§hic¬£ ´Bd‡TªÍEI° I°¾ÊŸ%â\4}²ôœ¢÷Aj…«Û€÷Uzɘö"4p'% %ËGgÀ]À¢õfø!Bgqgq´M‚*EŸúV—ÐKÒVhêC±ã¡]¥´FŸ5‚zxx$½ø(²±V]6Kh;Ìû_>H†h½Û”XÉ̹…ÀYöa}AžmvÀ"÷ŽÙj7qC#fé ÔhÞ¼á€ê(•Üðò ,-ìDâu¾©Ã‚bþ|Ë1ÉuøzÝ‚>´ÀéWwá3Y2˜sóøÛ±»»ŽÑÛóM·ò*ìõŠ•M“GR§ Ú=OÍA™Ñº²¥<Ù2”¬Rx 4ãm‰iå_K ·Š`S3‘Q8ð–z­!2iQŠ.š©ZùPØ’áÍ’yÎÏè3Œ°¨Å;Y^ÇÌ3Øí@3ï’tïp&=ú†Â„Úãwc8ôÄ~Тb¹¢ì'ýÃÝ5ðœ¾ì$Ã^hz¼påTÜU{t6"kBĺBi@²Ó ó¬Ÿô冣yº°}â½Bt1vºm†äâè¡Ãad?Êö‰Ý èE•t7 4U·‡›BÒ‰gç.ðY™ÄêÅkqHûpûÈŠô èßѤûd݈Ãàq­%i5á-­×ºd{±nË[<ÈÀe¯ºŒ'•Ç.Έ˜°(µy«å.fqŽ¿¹™:³^žQŒa²~hÒî‡ÞD¾Fˆ~€q§¥Äb²Ñ ŸKý<÷HÆ£ì,€s>" ålÔ×Ë.óêõK‚i7ËbKs³°gßæ£ÒxÝhЋþØ(dI˜|çÅ4ÛÒ!g¼§xA]¦£Ùk¬=û¡˜ëzQ Ý * ,P : *ݪ#„TÅÝϪ„|4¸c#BQ;o[¿á0º-;gU«ÿ”kíè:_F:ýåbú=[¥—”~Rù¯ʇù¸S-ª}ê¶¥E¸á6¾`³“Rf…7¾-›ÙæA¡\DªXf©m ¦ÓÙ q"Ý&ûè?ŽI Ç3w±euþìKV¤¬K>œZ•¸5ÂÃK¯×˽(ÿ­é•Ââ‚ñëÑQj7n š‡þ¯8Í­_ˆô–T¯•JF…„ÜÅR´k…ùüê},¼H‘å½1”yÞ]>ê‘òÜ£úì1ž&œŒo•ûÀû½Ÿ2Ü=aËXBŠÛ0ݥƓ»^Š—ê ^M$zC†D i 6Ã(téGe·ds:9 dšÀ&z­»v0Å:bõ}tž±Eì,Ù·2È"†Ýj<ÆxYزébøŒBÊNò.ªa#Q?Ò]ÔòÊŽ‚‹Ö8MÌAãœÔŽEú”÷å=Å.1™È<(ˆÕƹ35ã’9\I» D¦Ÿ†÷’øEÙ‰M{Ö ËÙ{!aU˜$,ºõ;Ng½“*z£ñ úÓ$ñãWŽ^اûÐÃrª |NlÍ÷ù¹¸÷q]«†ûyß…Ÿ>’ÏjFRÊêÃp‘¤Nê@›Þõ–dÄRÌçOwŠqGZû™¢«´€Ø gì£:J^õê¥WÌ µî˜ZšDó\<óiÌð/¹¦¶Ï»ÍÙ‰[¢³x¢©¼}w?E÷ó«Ã®Vó]zÝÝEtp¸Ìí—4ûXxœÈp/3ÍâQ%<§:^zV²Ÿ‡Òò›j'„‚—ÃÆá½Œ6Vúð‘üuf Ò«6??’®½ÇqˆcvM3TN(nÖûÝût7ÆáÞGoÑß–fu# ‚ío¥ÖEÃ݆ܱdÆ£}"¼úÄé=è¥Vœö—ñQ¾Mùjô¦Šca|7Ûb:º¥ý#l}šê<™Î,lšæuÞÓÔþþ.ïžÇg6^å;–on§OôÊíá fŽ‘>«üôîeq…ºŽ ùÅÅ)úÝO¬Vel÷?$—ÜÍYÃåÌ[v»"`þv¥†2êØÍÀÞi ~Ý‹ã¹À–¡1ŒGñ´lUÀ}¶BëMr÷|ß*uÚ"Áí¾"a‹È”Ï­mŸÖx¿|Ám®6jh;÷|)§›«Íï˜ô¢ôz8ûÙMЊâqŸv)qŠ`‚Y‘y®oYG¢Ö@’¤^K©&ê’~Ö •(my¤›Õ˜-œD/$Ê KýΫ]¦›ß"žgI†’‡aœ•»!÷-ÑÄy KT=‹ ©zÊF–Ð}Æ‘¬æõe»çƱ`7 ò$OÈK»–z¾®[*NÁç#o«ÃÃV©ÍŽñô5gÛâš&µs€ŸŸ×R¬¡ê=ÇÃà|O½6,ë«ZõNêh°¸Ì–Bᎋhe†z&°è7•¾÷æ*ŸJ‰¸™kâ~.þ¡úè¥`“R˜®tU”+ªO´$YŒm 7ú¿aæÈNÙâ‡i´òé3¢€W, äî=uc›yr ™ùŠž nŠFQÒ6çækSVz€ÃÇ ›ÓÏdJ’¨Èíü":®j/ÅÛ»sÖô)ÒÅ;Ø?MÖí.¸ÉÊãT59‘â°â€tsoUÌ€¥·4oê{¦5ÚéE\Óo|ò+,©mÖÔ§®M=‹+ŽA:Uyû´ãP`‰îô¡¥™Õ—„®Ãf¹èDã¾óæ3â·Ç2èø“NGdmÞÐfeˆZ.ˆ¿l­ê q+~ü,¡UÅÞ¯¾49ö"èÖ‘ZcèÇ›l¨¯K9ÒCr'Cví‘qÑ› Z[Ô߇+oU¿0«Z´P•òCeo¦ÝXI?^(•-ž"[FÈM·¬þ¬O÷Äñœ@Îü˜*¤•È7¸^`q¨Ûæã# 7–¢MTšË0êãsM“0ø…ôWÕZ½ï\DQ©U?åúV“‘§4€^&u²ªe1ýcL©˜rô˼Wí$Ö4EɸOè3y~F¸¸ÁZÏpô4QYç ~1«²rg/<ÅCíK»DÜÞAìŸNAüê×›ÕŸÜC¤–Ó1fÔâú›·?æˆÌß0ÿjÀ'ŒÛ×4˜z{·¸¦Õe×^Ñ’£"ÌþÜÈ+g¢Y§»Ùd߉SKwIò#ZMˆZàÍwðeÏ(ÍŶI:&š¥*Oœ 6dQ¹"koÙ?F+u"ó½8#(½é[ôÆ`Ë]½ÉæôÍCÇê˜c<îG>v.Ô4¬G{äôŽÈÖ8TÅ/K–sÇÂ> ØÐ—O•{hx¸ò¥¤Ô\žÔ•)Ñ¥½Â0oòaQ«Ë‹è„Ñ…ØE7x~Ôs½a[×IÛ °:.kõò@úeJdÕ8-2ŸEã9è›1éí! ©š%#–»9¯½4’+¡C.ÌköñôoOa:53yS#WVÂÆ3±cóõ®AÝþôÈ#£iwi?MXÓ·†U‚ɇFaÅöý«%˜gn Ëö€Âùš=|^¹h1«®z·K¿jáI*ùÝ›Ëc½gŠîsDsÇÌNj®QhžY›2ÕÇ^ÌBÁ™J¼sÙŸTÈÏ ¡Ê®ä{ÚªÙ(“•ÜõN­¬p‚´—/x%ó…›ßç©ìÐÍ\µâ÷!\7´ÂŸæg©xGÁù¾/-Kt®}ÈçÚr¶’yÊÔ4—íRqø0Gj&ÑÛ¾ùسÝSl´†)évlmw7Q¬²¸½%‚ãýÌÌÍ&´ú-“–n;Žèq¢²>YnëÏjÂÙæñ–oãk¶¦5Vw?]wº‡[Rº_—΄è‚+U MøZ1³cÛU}¾8þÝÇòÍJ_¸ºöµ7ÉÎ6oöµÉ 6Å‘·µE*SÍŸ7!çÕÏåâ¾|»œlÕ*ÑŸÜ5jÁ`ÜZÿØßC¿ebÅiÜÀav¹²)è ŠÌE{«³óàüBî£çSüíÅkâÓ¹„OÐ-$´Ø×³#êæ´Ž?š¸º f ɾÌÐþtÑq^§môâõ¨½ÇjQG6‰pÀÛä„ú6Ë»‚BÏ‚ZqÎðC“…wtŒŒ0žS3¥ T¹óô©š|ž fGTÉÄ’&ú2£ ƒ"csøp5¹ÜÚx'¾àù!o/Ÿ”Z“³|¢[<ãlKòã ˜;)æ|ZÞ¿¨ðxT•þ‚™±ÝŽ”»vfÞi¡àƒ‹‘È9ie+Òïg²YþMgóŸt]»šYYŒ¬Ì¬ÈÓGnæožf¶\ÍÜÌÿàjffý;W3'ç?ºš9Ù~r5‹Å€â_ÝÍÒ@ Ü\Κ@ .Ðhâ ñÆ»Ú^y ÍííM¾ú¡¯Ðvÿä€v÷t4¿òC»‚ì­Í퀮v&®V@W'3Ð?x§òM³þâ›fýO|Óì<¬Ì?ø¦´½õã,k/ßJ·*I<3oE’Æ’zù>Ÿ)×ݾxá>_Y`Ÿb`…´Œ¶èM™áÀ[Á·nO`ë@Ó»ÕKkßõhóð[òŽœ˜®\® r·¸î\L mÏoP¤í¤ð¯ò IÈ{GWj #ÇÁæ Ÿ«bæ¦ 1¯TàíÔ%yN$ÓîôºÜ(³›ãÍKerkK…«ž½ÿÁÓî¶íAe'#mQ˜éi^ÛgRhðLúÍ^¯î^¬hõk•¤Òžñ¹Ö!‰·/5 ïr%wÆRˆTye2ӲбŸ˪ŠïOùÓn¬l'7iÝbþ<ëx ¶ÒƵÊHv7qÔL¯.ßwëÖ™åæ@¼øæÃ)ò¨IÂ¥ !*çvÖîðÑóÂR‹°ît3…ß㬌H’96Æ ]ðÀT ×^¸³q³ø˜q¬®jæsPË={ã\Ú³·Ožýò9?ILsæÓ{²ù)>ÆÏ¼S†jF­• wœ/B‹‡>?Ð`kuç[8þ´Eéh”ü‘W¿Úye¼ä…Î{ò) +øV²Þ¶þ¬~¬ž+kÆž^{~¥z Góý8µ/Í€Ôüšdï<'å·^–UÍSX²JüÔèx¬Ï„± 99õÂlŒé Ìrio›CEèÓ2ÐB{§èsPŸ¼ræxj$²Œ.ýq¡[V³{ëö†íꪰ#çˆM™»Kumjp ßm7ç‹ËÝš@¼±#y^uÉ|Î`Qÿ<ªaü²öylÖA@ù Km1h1o(´tÆá‚º¥ý:† jl ž·GðÁ+¼ã¬ÃÝçN}ÄUsHõ°e’®s=Õ ¹¨;/šˆêoTµnÞÐñÔ'*ã˜iîw6{2Øš!eX®¥/jë½VîÚ´dþé1Õ;ïØ ÷ëÖÔˆ¶=ËùoæVØÉ eª(òØ— ö/¶¶ŽÝ®åº׸;;¥¹Ò¡©I$—NHDCðZw3¤yxjg&„½Ód®éñÉKÛÎeÛ¸5zw©á0«Jöµ¹¯àÎ¥RÑŒ•æÚƒ‰(}îÚaDc:éJ$B?FÉkØË‘îåf§¡eµÕ¥‘ÕWÝÚ=n_;I—A|¡+îÏþj}![èó$ÌéãõבçÒ[ÎÔ3ŒŠ¼¥Eîbn‡i  RÓóõóïä­&Ý­©fzùz“…D_štê •Œ&Åí§ÆF–ûNûá炟‚‚çÇîÀŸ™³øó‡eÝiue…U±+*¦±AÇÆ«8÷4¯Ãf)tog+c#­æz3)6¸` ÍQÄßí«V’˜É–Ükµtþ¦±$.¥ {)fU”`MXäxìîýÖ]ƒ6­pÀwRoŸLL¤Ÿ=G€C®ï–¥Ž¦ ùˆDÈ>RTQã æÎR·´Ôg89'æ;ùÙôa;’Ô¶‚‘x£±î¿'Š˜§Œ' »ƒßÝÅj(cZäb=Ÿ2ós­˜3m úSs7yjƒïÞš¹¡{ÅåƒÆÐÌ û„DxÈw#h‰‘:s¹‰a `8KF­»ÔÜ­¿kbÛA€ô,©ÉMÌ@ãä‘×[Ad…јQ›Î îÖmR23®¬ö¥wXˆµ¬³žÌ®ZU„ÝSï.š;ÌÔŠÊvNQ7™ÔËÑQ;PP2Q²[S oÅ$ù%)]ÂúÀRuf̸)¢¥`ó)ɉÐNh° heàæxx{àñ¤/vÃÎ%OƒZ^ÜDØr ‚-SsòLMš¨/«ï­¿µ‰\·±ü@:K‚‰M½/ôònðqä« ²8}B–<•So nm…F–[=焃™/NÇ”–ñ핟ã|H¾x­X6Ú/¿.7Ø|™ÇCÎLŽ+Ÿ¹JöE ×t˜rÐØÜœBi·<ñ¶øíkßBø´Ã›Š“lu!:3ƒ6䇗„­÷2Gœ áuâõ´)B…‹ú™J˜Ã¡ž»Œ]>oòû‚÷²-u* ³h-ï°‚øÎÕ»Èʼ ªµ¤:>ÈÅ]ÂÙvæqœr[“àçgÁ­-çÄŒEÑY!ëVµ™ö6ªÒvü©y²hSÝëy[fe[%õøhíèãfÞq’mr«üŒ,ônR4¤¬Ü”f«3½q½ ;ó   Œ—ܧ}«¿§ð h²´Ñ6Ùä°?/¯zâðQÞhi:LˆW=½ÐÀ4x ääÏKm¬à6¾Ý¡>Éì#¼ý1ªÑµ©àH†KIc©—-ÈòYNm*úP[;QY‡®ko°sŽ¢µÊÄÇ­îM›×·º(â&‘9û`@R@ñ¥-SÛ‡Láí 4ÆxEMÆÏ§ûÐWýŒ—&éMˆ:‚e?õ\@Ž3ˉEÅ»‹™¼OC+,Œþn÷ Q?Ó|âÂf ÂMÅžtBzƒˆˆ)Áš•ãº~ÿt—g2$YS¹¬³ú!Tƒ ÍÚX1nÙ¾Gœ?‡GG´Kd*¯îñ¨5Z}´ŽÚ‘xëh ¯œ4ŒÔå 4ê‹–ðf.‡l­·5©MÚ¨ÓUíA,¦SR‡I#eª70zéi&#k}ý áŽZ£dMaª'Nù(—qØÁçÝŽ;ê­WùµxgS")J =¢BÓé•á†×¯‡ªÈÒÔ$ЙV–#‹3ãÒ°6sйϯ8¡f:p.ë£çޤ>7—oOÄ)'ïk-2ͤœ£õ1žï <ú›èñ'o‘»,v^¨ZÛy0ÈÈsâ¬G¥xŠÌ:×JÁ 4¾¤/ƒóÄM¿½YoÄΙà£ßí÷veiUL‹Á[¤|bÊ÷Á.|z¦‘jÎ{ìCú oÚÃp–F^wôâTr!œIp†ûø¤ò¾öjflî‹eU–ÔIe,ðžÚ)cºµêxçÍhýâÛñÃ] þð¬cô{ÓÍüÆÄŸãµðõèDYÏŸã–«»­±¦§ÐhÌ©ÈDz{moùÛ-*í> =èê™°Žá,g/‡f&B¯Ç%áµÿ‚â.)PJ§a¨ŠÒˆˆ¿G¢,¼N2ª½Í‡ÿI^|泎&»È„7ŸzŠ_‡™W’]U1ÍE^½:"v@ɯ<¹‚Šàü¥#Õ͉îfߘ#J‹%ºæ¬žz·»7 iߌ~¢Ç:}—Ô;Â#ökðò˜Ã}pâÐ÷ð}Dýæž ƒ‚Œ×-ƒ[ß †­@û¡VKé5–Jæºdà2ãw*?2§+Îw:ÆS!a嚢YúCB鸓fFP¸¥((Õ' …÷¦vÕ'ʘÂ/ÓÕ.Z›:pGDˆ2UÛ9ѥʜîlªâÀá_Ò¼0#œ¢m€‚bö®~5^XüÆûœMäKìd/¢…œ1edPAÕ «Ñ¥šCc‰Ð04ùºš&vººvÒží˃‰Ï|è‡4<=n,.›|,-±âPöRYš±°x^¥(B’ª³EL˜œHWøN*C¬\è¹im’†7è\5ÿv ôº—}÷ÄL÷ým[¾¡RICdÿaþ¥‹Ô®Ý-©'ºmõí®ggšÔ—j>ɺõ÷.NN=|Ôò«T/MkMCÙÆä祱ÙI" “¥qópœ·qu—/oJ+ò;Ʃٛ·ÇËl°gªÉs#¾ü4Æäõ ê ½ß £HbèÃBÚv9µS+¶5ˆŸiþÎn—´Ù¾qÊç5e÷†‘ ÷M;ë¿H&0Ýåë ÊKQ.yÙyߛ۾<,ê.‘u ê¾gÌ»èü±ŠIØhƒz˜µ59ìKÚ¥X”Q”Bá7ÜÈ\-oßPE–zèr%kØwÁ¾´sXyjº‘ì°jWö8}tªO0‚ÒéÄ+UŽíà1 “–Öla'¨'¼Ζj\1;Šâs†Îj0™D¯«åî-´¥Þ:ù{PÛ‚0Z5UIÞÃÑc(¢  ëÓó0Ú«¹cϾÌHQû¤0h¼0q¯LyÃDÿ̓çQÃ~ì_^! oíÖjqb:d9éڟܲzùˆ™Š ï3ûÔ Ñþ*ñX˜çTf®ysÏû74Ч ZÜH!‚½÷MzCŒæwa÷CwrÍü Q#­x/¥×.ÂCžnž!’„9ç>†‘œÑÇ÷â56¦¯Ùœô4ÎM¯+.|;•3·æÚcÃ~>ª·±V6ŸF÷öÊA¨lŽgÛXÒ¤ŽDg3Ï•@Èøâæ3Y»g®:t«[‹g=N+¸&è'5{1C«¤î–ã/½‡ÞÌ”}€iy;>ÒŒf¢Peϵ¬Ï£­ÖŸ¾€[_«®RtkúLfM—ÓFD­èöCxø¦ms…*Ì­Ž Në½Pi&YÝÅ2GT—¼º—]ˆ©‡ü@'žæUãG[>®Î‚tU àRl‚;1;óÄVëÁ»ÅÃq™¥VÖ{>¿r÷+¨}$¦$]1îq®û)k÷þ¦ë.\½íÆÁšßMC•ÝÛEvø¥Iâ÷݇>97F¤0Я=M*d™È®í­aÁˆŠQ#òSuÆs$?îôV6g‚ŠèPð=´È‘"ù´íC¶ä¼QMmUX´ù6Á¦8hâãçVŒ18º3 +¼»+‡–¦+®gVÏ­Ç×"Ž ‡é:žn?Úšûœë¹{~‰oŸŸÝ_š­7‡ïÎeÃØÃ(øØ‰¡„£UªA&“P+ßvU/Á;øM›ð%ùеƒ•¼üÚ[å*|S#<‚Y£"÷;‡MzÛ›U»}ãR‡­ŸÔ#.¯ËEߨN½ŒìF²_Ÿ]¿¼„z'JÂKn3àFñh%9‹:pf…4¥\÷l+:Ó]ÍqAXˆ¨§4·Ü½F{èXЗŠjúeÿ!.5I¨ÀÍC¿Ù;Àž‰»ù‚ãä'0K¡m.³rDÜ|8q>JÛÜkéšGê«á‚ê¤Ò¢’A«"ê¢n7_Ýû9™v9¬B$Ó8äC’— +ºÒRû"‡a³(ÙçrqqlljU(§+nYZV¹ê”$,œÉ…zocÔà ±‹Øic¹ôÛw€µØ'½ìtòä%œóîó¦‘E+T‚jµpJ9ÔêÞŒ¿Ó7\ÊFÔX• õN¦„¤b¾Õ¤U½ËdMP_ÒóŽÍÈI1•ò.’’{¨¢ñä­óTÚJáíâÒ|1]b«¹0ÔÊÛSä°±ÛN´ÝÌçÕ_‚²±„IÆn»ÐU–× XÉyO91ïMòh…„“÷Îû$”Y.2^Þ ¦ºu/ƒ›Øw[,ù¥Èˉ[«BnLjo«6¯ñ-ºÜÅTÓ¶!N}ÄÇË_›høJdâËøÖ¾ÞÃt-’¦Ž§VÒ4ÖÔ³s^5‘Lbûò6¨Â ËÜ“mL¤'T{Õ¯c?T ݤÝn©Ÿ¬X4ü`* ÓùöÙ1lFýD°7iÕm’ †m½úÛo?©§ %¤¾}5Tc™šcCKô¼©l9rì y‡ñ¯vŽ]kŽªÔŒÌM¹p¹F!¤ù£½Oˆ¡#Méè†ñm35³ülõ^±uÉ[_`ßl„³ýîåù7ý¢s’üÊ1zu—ÀÃÆ àäæþÃ\n¢Ü?ÀåþÛ¸<òŠþƒ#ôOnP­ß 7æ_®Ð+¤ s­Áÿ=@ºŽî.@K %˜Pï¤ÐÊÛÉ äðõЮÈÕh}žèt°vÜíMA.®Ö–wª#¸àŸ]ªÎ×ǤÍMí~8/ý«£äÒÕÚëg«›§ãïW/È` ÈÅñ'Ï+Û/žW¶ÿÄóÊÉÃõ£çÕ_Q[m¬Ve)-W£Ø˜ýFêøËIâbgî XPFϽ XiLQÀ hŠÜ¸9þ¹q›Òjâ™÷Åu3µSÇî¤Û+­;鯳[¾;3;7Ó6]ßÏø–Þ-ýbD¿ÂgÆŒ7âo†E>òćšú>5OÙlþÞè9í(¡|`ìe«ƒ²¼eðGEƒï–ÁÑö‰áCÞ)d3V<=QÌ:Êó‚.És¯¡!¾¹ J9ÁO‹qôše†·b.fÉ‘k¥žöHR3z=¹$§g½ÃCÉÂJ»(lg*nñ9øÕ+\"i£¹Ê|¬¼lwø·Œ¤˜Q>TSZÛîׯoñ½õxºÓ7žÞ@-w‹éÁn¯`£‘Û¦ðÒKš¡5¼mÒY¯6Ø/ƵköZŽOp7‡·kM—Ÿ¡k•ŸZ½œtwlh‹6q4A¨¬cQÚ$@Ö ÷6Û1'ÀõE?è˜é9¯ìÒ†ºnß\a?®Ê€÷á!c‡hñ¸‹u-ô‡ÐÒN3ß ôÊ–q;Ô• ÿ{[=ïM*Ü“9I}aÈY9ql;Ÿš”›DŒ£0 ¦F´<´ï¶0LBæD03s­ôƃY4ÖÑ`ª8nÈKrX.½)(ÖYÏšŽ¿³â;ÀZ€¯¸§è©¦3´‹¾'iÊ[gE]3«ô:í³Õ$ßÁÓ‹Åçycºm\|]zñq-ËÒ—ÜmWKŒ,S.’¨,cp™úxFV7“ÔøVÓfÇ™6…=ˆš\Ë,fxŸ­ ¤Ä²¥ÀKu㯠.$:ï4’8 lù åë¥é­žŸ<fvåG71&=zšÎ²íhF¿’ä+­ä߇1·6~ÏÔG‹ íS(ó¸ä½›²©r¨Ëݬ—·Òú‚5›e¬#iq¤ ñ唡IIEØ1+c #8âè <"ýƒö–i¦ûJRÍJ¼‹èÃóÊŒ+¢d2  õª¹#ú~¢‰ÞLˆ A–Fä·  ŽŽTݢŴÀ¶39ð¤&ë¢N’”?†T›á´š–…Ó°&¹ßæL>•–²À©Ê‚vYùä2,=‘~Çe%Ú%›iˆ¾gµRê€AvÚÂ¥=nØ!ñÕ4òZ— %I0ß;ƒ­tûc¬9 <ì£n.jΧñÛ¥ÜzšöeÅTeå•ÇM¢ äVlèÄ=&ÌŸ^`¢ñQæõÈáGcœ½¯ÌÅß›Àhð…Âg`´^ì0¤¦!sã•Hh!îY¶ìe÷#¨ïñ»‰b”Ci]@“Z¨¡ð`eÇäôDÞ*ëaÅ›æ¹[è¯ï¶Þä[% õëÕ¹„~=ß;‘ûäI×-’F߃ÊÂÆ†€}=û]¸Ó'Ù¶ž^‡ù!£³>ø5mÉ‹x8/ƒ’KôÓ)‘…ÑãQtÏõe-ˆ½ ®§öú´=NÚ@”EKÁ Ý`%ˆT’y¿µ±½¿l²Ê_i÷Å”à1ùtkf+Âc™ö–¡;ˆ¸†¼©î%OÆn;*Ôn¹—P¶‹ƒ9".T’NÍ3ä’1(«L qZu¨¹l;QΓ=Ø(Ñ8nz9–!B]kproÚ4³Âm–ùRL´ô¤?2æ4²Þ4GÜš2ÐŽ‹}Úôæ\¹²Ï3™'XNøà;•†q·Q*ö„UÌð§°Ž3½MÕ¡«Pö¸Gö¸‹OXÂP,ºôÇCÅ0Ï}Î'»”€žþ†Á;q$§úãG<¦n9\P6¡ŸÌ4œ·wægéž8’gs¹‡LÛ0mßõ#ò=é-wDÆ!{àGÃüJ®•à±Ô²3ñ›FÙצ£A *TiY‚&aœ‰Dù¨|w“¬î¤\L<Ã%Ç%PDÛǰŸ¥Ök&ÏÄ‘à™×zÆj /½—=\Y›ã80z:ðjàau ìcÓÛã zU©iÛÛucº‹Ç»ª_ÑûWä¥î-âÅùÜ2¡^¼ãxÿivÝss¤ËZ‘b X'|–g´qOâž+Çõ %öÙH× 1âê!¹+!U:Îå7 ¾S’v¬ÒýÏ=e’`q1léóòIG°œ8\øž?}:À±àK‚š§·KÅGÚúRun}ª9˜? ^¶¥=I%ÍDa ~'Ð^Ð^ª uþQ§ûMºh.A'Kùmx¥šñóT®Ù31rYpñ66ÄÃê\œK¦I Hüy?) ¶;PhI¯‹×•?w^S•›êÓEÌoulyÀ®†lÈÚ2çh§ž-ÔG?øÎ‘ì”øùËøR«-²ð`JjÆjFã{/d}Ø‚Ðé7Œ28EG½ºü¸’Õ¬ÎÏz‰pñÂúIØ6úD²f;·|E¥f§üÞÄ}™|ã„ä…4Wòp ó>ÆçâÄ·r¡KòãÏøåͦr³õdO«gC)Þãí{Úb™Å‰#%è*4å °Xõº®ñ·Ö.÷.«M»[>:0OPwV¤š“”!(?0ê¤o俹ɷõ`¶{®‹å©=“ÝóùÔ¨¥üI>Џ*PĹD]ÔñžO†ÏJÑ(‰zŽÙX‘ÙjHó«§&42RìKáfi#L~p˜‡#u­<è´IRÙäç×.§{·‹P#+®OO£ À|…ø8:N•k)"ÿöìÌPØ£7Mª¦ÚjLïB÷JÛqã{ÕäTÆp1¿Ð•¶QüÀÇhÙ×·Kšij)l: ¢Z`_ßd¨[Ö°ªÝp ó‘ ÞÇ¿ ´³înE/Uƒ©}™¿*ßó—ƒYªÖ«d­°ŽôtA·h8úü–} ã«o%ö#÷‰ âªëÈÿ„¦¯ëÎ#òAP”j!j™Ìb]z;K'–!ئl%ñBÝb+ØuN@ñ ”L-*Èmîã;öº5k ñ¦¾h2€J­ªVû nÒh¨xg‘è.v»jĸ[§ùHM™2V˜·AåÂwÒNŒ½[uÌà-˜ k±=±ßzn%Þzžb R¸‰Ý§Âî ÄÀ~’ÈùVC¯Ëû>ö{iÿ D'…Úªo½w¥5Ú^Z,T3úäfȱ O¸v[Ê×ÜrÑüºoË,{c [ö!œ2BY¤Pº'§KÙeê7RŽ“wP׎aÛDëb©å0ÂSUU–>=Q7‹%Ý JÜÂ]&‰À–6!J÷& 1ÑB8{6d¸ÜJX ëï°•ÕX“›J"Úÿ1%%© 7¶@FÍ¥ ?nJðÂM ¾i~Tp?áòÓp_`©ë¼ },bˆÊ’LÁ=ºI7}z]Ê;ºì¡øÙï(1%"ºÈñÄN¦±*dWhhÜx¡«9š“kà¡®*Zˆ¤³‘»FŒÖãkzOGëE‹PM26œ„­ÒޱÌl¸Peg‘Z:!E6ÄUÎõ熤²ç”äëÝα<2õcc}¥»ú@dw˜oT•sS§ ©ˆP<èö‡ã1sBò#œ<ô{s£< pch¶È²þÀN­EUûµ­\á\mL8~Õ æ©I¬°OaææCUä°Üj•ž¶ÒÏÄ2õ ÷I}6¤éLWãšö¢?ë‡ÔÆåa"^LWUI…Æég²Ëä;?Ù ¬#D݉$rnÕ4ÈZJ¾”Xß?wAÈyVòô†ÀVÆMÚ7Šhn‹YóäÓò–ªL`«cÀQ§9 Çdú1e?ÆÆ‰iÍÛ©ydã=þ(j¢«o;ù¢4ÙiNðõiüswø2OM¶ÜË;q>ÈeÆa›áŠ'ðK.€wöúC?¹'Òæ œç ,äÑ© Îqª°nãÑ„?œC¥ÜÞé hFaU:Ô¬ñØ'°µW`|ò*ùnæžo;|Ñ3–•O@4¡Ð9wÑGñ¡Á¡ŸÆNo‡f(wÝ[QHîVy»Äij–§{À«+þ¢=ÂD“M®ðCI Ñ”›0`õ©}h•Ëkóé‘YZÆ&Û<ˆº4c·á0ÜÌ,q-€ }O°0ÐÃ8FÏè?GÐhkxíá.¿·õÁÜw2Oõʤ̶¸…6œ–¯ŸŠ­”X´Q+_ ø`ð9Ê^!;LX¸iüQð3m-ØÈ9ærqÄÍõ"»²ÕÃAá¡3¢®Û¥÷¢¦ç=.s* ˜xûEåÊ*‚d)µèăÕA˜€±ÓD£°µ’4!ïÞL¥'$¡=ó –aÕ‚Di«dDèNõrLmôXø3oN:aS1«†©îBõ¹ú¢Ç`})[ÁzH rVû¬ µ-^C“Ç/÷œˆê¹HNœHiðÆøÔ‡[03sÒ®oó74RWË2éRG&1ùеN4|¬ÇÊâ}sŠd3é?Íπ†É?Ýø°_ßr@W´Û¯©ô~Pq]ˆ‹×ñ7Ö¥™1áiÖ){È}&{½€™T¡…½éJ¡7Á´7 <×É(ù>4Ü󨹅׷ý@ˆtª;k,°À® VˆOŒÁÀÂJÙBG ~¶öþEv}¦õk”îÃcô8˜&¨ý„2ŸbÔû\,µ])‚E×]žœ§B2kQ¤VŒî³’< ð½¥v‡È£Àøaõ+‡$_8#l9éq>û«$'8qÑ0Ì ":¶'wÒhL#+y²„˜†á=ÕK÷m äi,-—VO¨–9BŠ%´™É¥x“U4ÊØ3—æµ-K¸U8$ÜV׺6·þ4Ÿ]“ÎZ¦*}ÚŠ•C´Î6lFgÿÞÍ õ‚¡9…÷!r»>6X8YRÄö:º©¨p¤œÇ#7å“»Ò°]#Yp÷×Úm¿¹åÍö03%ƒò1=Ò~ƒN² œ‚~òm‰6c=a¢p² ÒûN_TľèzÚ‚×àÇÐŽY=J™†Ðt^RfΖA ¹Yc““^ͯ&o(†¬4ëZF¨c•mz¼3;¢äcŠ:žtC©ÔôæBŸ¨í«´½Ësæ¢Ö£lBSlUy/87OÉe`þ#óò…oºëÛöÃv7›ˆR»¶Xþ¸cdÌû·Ú$ÓA©BÓêˆ.‰(®'°77ÿü±Š"¢€w@ÔXÙ+•2wõ¬Nú%†j¶VPÊŠh2îZ;ªKTm²ÀÍz(b†¶%|¤ú.Ù‚¥%š MþÇÆÈB!‰¢w]ÉÓPÓ è¬¬p\Äe­O…á]\ÌUñ§†–”7ÂýüóøiÇäÜÐ"å¹(«n]ŠßÎ>ÒŒ—%•8‡`ƒ |M?=Y©ÏÌ”»÷©ƒ¿Xø Úô ,ã'tªiI˜U@¶q´à ÕûÕÔ æxwévÄHÍjÒü—ÿ{_ßDµ5¨ AEÅ E¸”BÚÒ¬]Ò¦´Ð¦)-t3IÙ¡L“I:4Ʉ̤"ÏTvDDŠÈòQAeSx ( ‹  ¨l¢(îâô;çÎdiZpýÞÿÿ}ùý “{Ï9÷ܳÝs·É°¹cû.P•¯{cò´Qõo·rÅFÇÕ=c™ô…¿î·üRöfÛu¿ßzö©¶·ô?òÆm•Æhüàž1ÿˆ³¬›q²!æõ†ûßuìsÎÚóÁ˜„…ßÏèûã©3&é³ÞØyûѳkoØXZº¸Å›½Ÿí;]Ù`n_xýàVó·~°ã¹–ýÕÏ?þøšÓ“75ôØûn¿5׫j“Ñ"}`{Ó)6fá×ýîé¸?å¾çZpãN¶¾frîŽÞCök‰¦lñ³ÇUæ[Ö¿nÙé¹>—»<ëÃ¥ÏßßI=‰|´Æ> µ¾õâúŸ¾^­ÙšúïûJ§% yuêk%K¿»ïõãV>Ø#æ­k·NY´|üM£®î|Ëwtž³ïñ“ã7òcOŒß¸RX{ß­]ßTžnqŸÑoÅçnZdøì;Ÿ[›?ïÎùOܶõì3V ³ü¢~ôü[i™#{îÚ[è×òæ “oh¿.î'ÒV.Èúu\˚ﵿ>phó†ºó[Êê_Ù«Ë\¨;ÝaÕ׿>¹céW«§íËׯ¬O8äÜV—:³í^åäì‡t#{(f/(O<ôÙ¹Œê½©,¬}tÅ!÷·ßÛp=_~× W/XÖâÓƒÏ/7¦Ëus\ÇúõHû|¥²æ™#ý6.[ÛîÞÖgù ö¹Óƒûšwãàw†ŽÛ¶K·´þ܃™]~\rüÜY'³½½ÓüÔ,_¼¡êÓ‰KîêÕ2í–Méwkzuœ˜6gpûÝÝo6|W9‰;4ôåë;¼ÖöÃGŸë—>û“é7¬gG—­ÊÉKã{½¤î³¤õÓ–ÏÜöÏŠY@ÆÝ3$0ó¹W–.H^ù¤òóÒÀöäÎVŒô\}ç'k¿¿fæ7 ½û?>¤êŽØYÚö½VÇ­H~1æÀöôýÃu³ë'ô}gÁ}ÏÎìïè›»ú¸8¼Þ2Ø9¾pæ.ŽÜññÐYÆv¹!?¶•yáóq]StÝw?(/·Û„O2® |S1ø_mŸ~ôÙä¹gl×oì·¿aÍ›‰ ŹO “¦LÛf™£ÿœg_jØRùÏã)/w˜¼uëÉ ;ãúàŸ{»L8p½in‡±cëŸÒ‰+¯>£Ú]7ñªÍW96\ùÌo¿ñÀÁ¯æ¾ž±{òíûžè6ÂðÈÍ¿þÒiBvÇíï¹÷îyëǶ÷¬ÎÕ÷[¬ß0~@gkÃê–«ŸiXíÝ´±.Ó?|}«Q?%ÜQҺ͔y+îØÜgÃÂÏ%[…e¿\Q¦îó‹æþ_·uz°úÔÆžãÚÌß)ü´üÍUSçNsîá>M¹5Äò?{æØGG?½mÏðç6îsàÝ•×ü˜6«_N‘eRú‘wÚç:¶\µ¤ÓÌÖ-;:]rjx÷-ÿ÷ø/Þ{ÒÝvW'+dá=LÓ7lÏo0t\ÖòÂʤú³Þ¿âw»¥ë¿<ØiÞÑI‡§yêÂÞϼd:ðNÖ;¾×^()¹ùÊôƒE‡´_Ù´ôç–³.lz°»ñ®{²×¦%Ú¡¼éÆ?iO¤Å<4æ•×w>=õI#¬~Á~<ÇÛòÉì׿ºå«¢ä©¦½Õ)3ÛÐizœÞ½ù‰fãf»ö‡+ŸüæÁ^ó½PÙ{Ûž÷SaþýÒ'wÞ·½!³À¢ydhæ¡õ÷›÷.|q§-gÑK¹7íZ’‘8ù¡üW¸oÎwì¹`äYÝG/( :lØ<«Ã¢×n^n¬~këÇ­×^xõTf»Mö/§vîuÏaù¶òfMVÿ›4‡†ÏÛvúBUŸÃžÞ÷Ž~wôãߨq`Å'‹æmŸØmÉPåËG 2_ýäÚµëº5Ï~ü˜ûFŽV¸ÄŸÿ1ïxŸ¬Ÿ_Šm[¸»ç+‡“i1§ËtçÖkÞûÕÚ…gcÇ®]yï•G®tm5½ùÜ ”×÷tMœøÁ+ÎÏþûÅmãØl¦á\åðŠ ±)Ÿ/H™¿wôÙÜÃÞ÷¦Ö:Ê×ÄvWÍœ?{vâû3ùl{+õ+Ùcr C•<÷¤í:‘>³ÅÖ3ãpûoqíª6W¯yÊ÷ÓO]†ö¿èÃÁüq¦[Îoþúì­ÜmÓº+,/Ïñµû¾Û­?™¹iAÒÍ5c·½©+¸2ý³ÂMæéidqÿ+Öô~£ì¶‘×ÛVßÛ)¶ag§·wkcàox¸(å‘×νòö£×öîÞï7ÝtºÝ†u{kO^ûë–G>ë÷Q˵];*²îJýtØÄgÊJžz åîbÓ¤N=ÿÕèî'27Ì™ì[ü¸¯Š¼žZÓ‘ xþ•¯ß¸oÁ—Ï{úÀ§ý«Þ›±±w'ÿóME×µ_“yn²ïñþÛ‡¾ß»áê}oÜ[?ò΢û­Sî:øõ£mמ/5ヷV®¨Tö}WÖºþ_C3?vz@±ð´Ðj[æ» oÙ0÷¥ÕêÂ-wµExoIÚ¤c«öhŠŽ%Í}R“upT»îc¿üyÄS;Li½o<ÓyWໆ7Ölœx{ç³ÃW˜õÝçþ§vÔ<¼J݃[òùÏS«M‹Çž{ÿh­ºÝæE™äcæ\¸þgoïaÉó&Ž6™~ô*:Ö}ÃŽž˜ñšµÝûÿÌkxh“Ù<÷è÷C®`2Ú=wF±hî¤vÝûý8hä‡K—i ïÄ ,* ýbURrjh®g¯Zc¯bERÁº8o¦òì«•„sd*¤i‹|&¶’˯÷³Öúb›½¾ÊžîPöÊ,fUµŒOå¤ûa{fŒÉR˜ƒµÆZÏlZÛ+k3•ÅÏX¬Q "Ve*•‘çÝUœHôêtµN¥KJ$N?ãakxÑ©S•@Òïp-¹y2Aø–©¬EŸQ£©©©Q×$©y¿K£KOO×hõ½^*¡Î+2µ*¯ÐU)ãqCh^AMyRÛy†¨Ñ©µš`C¿•Mð;SÁÄLe À9Œ©éŒ3É MQU°)©*ΩSáÏ誴z6%=%9…µW¤›óE°Ù¨=¨€“@ðd,õóŽ€õg*û”’>•¼ JíGºRó7s‚ož+P¨,†žc,✳.—Ù,½V—ªÒ¦«ôé6]’1YoLIí¡ÕµÚžš(HE5Ñ=ï߃Êûm`Y.?ït’j܇>ëÔz½:)M†ê©‰’Îß-/ÆWTti‰yYŸÞN—Ҥ̠է5i#5)šNŸÖ„çô¤&m@Y“6´i©)†¦}KoÒ·”¤Ô¦ýMÆ»¤ÑeÉMÊÒÒtéMé¥5…Ó¥%5¥—Þ´,EßToéÍÐÓk“›ê×ÐTV)†”¦rÖ6•s*¦)Q:JÖ'7Ño:¾»4J¿ZCrzº&íêÓÓ#ùý çfýôÅÓV®ž»' Ï‹„¾äh ¼NžH/ÔÖä’!=³MÉz½VŸlHOK‡^˜S´9Z}ž.'5'57Ý`6dý6Ä0}Û<㩳%éRR’ݺ™Kò-.þÒÇ®bü¬ ‚K.>—»XƒjE’ÅrHEYuÒ_jm'59¹µÎmä_êxÚd} >5E‡p©I-´ºäÔ¤ää” å΄þþù¨‡Æ(à1ñ¾:zБ@¶ŸF*êˆXÉ’"F{e@`EQ ^Ò€ÈÞIl¬½ÒË»yWZ$RÊú=x$FI‘'€•Hì@7‘xh&›H¯ƒ88Ù¹ $#VrEx§XÆG8hÊ!§{t 'MAMœËÇ T V)º“e 'JÖÏã.?ãYG"ñùùjÎÁ: F¤ý¼¯š¥ÑóPÈEêµM¤`*‰éx)6ã€|Däðø-éøgrbr 2œËA!a#G@ˆ7¸,F"øX;çä쉤ÆÏ‰"ëéqH8Ô!ªæ G¦ Äã剟õAÌvC 4³¦}œÈTpndŠwRd*¢PÓQZUR ¢Cj‹aø.™VO¶Û°Ïœrkb¨ñ ÚòI¶Ål-ïc¶å—Xm9ƒŠ³‹Ì$‰ÄèSH߀»Ž8ÀYó Ö(.óÈP)äùª€0’>@…´_u‚Èz”`n˜y„¥Ä¬ƒŠKJ­V…Ú ½Í!]9¯Ýp°¤'¶ ®ÌR¨KK±‚óŠä"ÆÑr{%ãõ²n2ÔY ?u–¢+ÿ;¾ñ;ª Ë‘ä5HÊœŒ‡s×QhÐ{À.R&ñ(wB>Å+ÔNŽr›k¶š,¥¶‚’b… "çb<)œ¯ÚØÎk@É”,qKâ—£òa\`w‚x1!‘8Ð;*ÀU3näÈÍÛ7­§Ø¸´RÁl<ØÄQ…ÈÝWø\¸ÀŸ ûð#?:8Ø5Ú #Ôyí•~ÞË2*Àú©ë‚…É ³´-`e ]@æœÃ@ãeI5ÇH\##[åäoàD2¢t*å> Š8e%o*•ñ>ÉœëFGEP¡‚;Šårm\R<è'^}$¡~!ƒÂÅUóÈLH2 ¼¸¬P%¢/zaÎâ &Ô/ø8ˆ,i>ÝÁ ($‚+UèùŒÃA½ëá L01LP]‚Füu(z4R­~/eÐô8‹Ò5•` ¬DE]~n·³,ú+°’H8'†«D Z‘\áÄtÑ!ù¶‡©#•L5K½^ FÀŽÛÍ× ´%Á\ .ŠIÝØZf2™­VÊS¤ÕÙypeAgÀ Îaå  /ðàã9üPc¸×$Á<†U§Ÿe¥ñ$¤0,*—]'¤°(ÆÌÅ%¶¼’²âÜkTAEÖ0ÛN>àu4EÎ+(4#"†`ª`ê"šÂúý ¢šJü.[ æÐˆÔõæ8)2)ŠXú@rlm%½c±aÐg‰7BHAÉ…GI‘Ô3$q~¥¿Ôü+êB “ÁÖÇ¨ÐЃƒ­lqr#Ty’U]9Á{DÊüÍOµ¢@ùÓzÔ§hn,;`Œ@‹BePƒœˆ¤!²¸‘‹ë-ÒÁŒ”ê+hWÌ*1lS5¤0-è”…DMãivÿì‚Â윂ÂÛ E¶ÃAGj"e×D§NQ'Kƒ„ÙL² ­%½iÀ%À\b¸.’í¨ªÈ‚Ue0äY9~ÆA¬>|í?– ¿â/%w—çHÿÇæ0rˆ~¾.h]qò÷Ûó?}²6æC’.)55%çz¨¾<ÿ»<ÿ»<ÿ»<ÿû“ó?˜áØ,%ƒÊKè$ÇŠ3@L!Ý×kµ†è `TÐÃÙ_®TD‚E8ärŒ›«æQ€„6ˆõÇæÕ<ç Í5'çU´.Ø:NùägLG/6‘ƒ”'§Yš4ë!¡¹œ\-Í‚mHí*@ø^ŒAJÓ†F4›H“e´-t99ƒGÞNg%››‹œq]$Š„ü£IN>ÌøØË)Îß;þäT`˽ŒOô—ƒ{»ëÔöÿÎñ_§×¦êèúo²N›bHI¦ë¿ÚÔËãÿâ£Ð$üµ±ŸDâÇ™â1º¦#¾LU ‚äûùz¶ŠôYIzûY r¸ËŸ¨ˆý§’Àû 9`ÿé”pÿtÆûÀüóù ÿ…t!RÔ$[¼?,îŸÌów¥ $A£P„†æi$bÅ€O]ƒNë$ùÙýÍåÅf[ü+/(.ÏWt%$4œ{YP +j8/ê]Y/˜k4fnNS$GÅEà³-¥Ùå´­Æ8ŒßÇh°©Káa*c5[šCEëX¿„í†3"&Tó›¤M%E¥Ù¶K´PŽ‹'L$›Q"¦­4ºÃÛl)#2̓•UC¦Au+»` A Z޽’µW¡f¡ ^ìƒ x/µY×t…o Á`þÚ"àÛ4— €Áø©7È«_HBî(šIœ´"ðâ«EÀº¤¥y¦"àL”ùݬ7ñ¢çd"“¼Hª Ò70áxÅh@ÑGš£vüñfôù˘æ92‰$¡þ ¢ àz!‘øýå¸0Lìnˆôô øE@7B‘Ÿ%J¡µèLºæD:¢!/ÚéK% ùÚÄßmø¡‡:µ²" Kƒ]¥£Â4®G  ØÌM"ÁƒMJ´úpúqŸÀIP«‚YÁ«¥El?Ï{$²û.$Qà8Ô<éIòó šs­ƒã©È+êÒ’mNv.ü- ¶”ÇŠöÊàZ¬@Ã/xÆ+Ô€9RMCê Ò•ÔÈædƒÎs‹­åùæì\ðÔ»sM%eÅ6`ØŽG ÊæÒ,»8 ™Rì’It—â\îjp&Ñ6]\’›mËvÓ\ë“Æ-yÈ u)Øki\ª8ñ1ò^R°Nî0ê ºAÒ#$bÉJи±í„¥mIV'¹‚äšÔ-I÷ MÃ#„z/ÎGn?4ê™BûD%€ õ@‡ÿï–ù!YA±9 }´ Bk»$.ÈmþR¢&dL°ï=2£Ú KãKXHÛ‚¦ã—…ì¼ßAâ,–xº“ ­ÈEŽã@lÚ ÂÕÊ…/=z4fÚÞFDõb± oÈ+ôWá鯗LU qD!rH‰Ð~~K'‘üá§ÂÏ2U¡‚1A™‡%IYÖÅr µE·êU3Jº$rЕ}Ðb)· *5K<„õ/Çã0©0Ûjm …&‚)4GAûêY3½–©ü÷t9l2&:*C»5,Ý•HÜ©Ã}:úЏ½IGeÙFCöƒ¼†’IL‘îÝÃ‚Ì èͳ ÓQ›Zh£&`¾Àº4 lž-¯e@y?ãbåíRÈ4%tÙ«0G÷ÒŸmæÄ ¸!w³ŽŸðàt]+¡ÙMœ´HÁ­@êE¹Å\Z8(>R®(‚.aBñ҉ъ蔢‘šè¶`FL”¢"í3Ø^x¾tsa8U–—­ÅÁ%r<¾X4ýmºrÂð{(6Ê¢R‚à§Z6äd¨©ŽTY`¬_vªr]jN-®:Ò§BdÀ¯®žåq¡ŒK€ RŒ¿e˜ˆÈ¿ÃýÉ7ç“‘ÁU:@éFE×HvœøÀ¨8û{cm³6T]ÿa:Q ÓáÿϹô³.€ÿÆ$Ž—¿Í¢ÏÍØé…¿ÏÈøžËcNìÆEyEX>)Ecó)iE&#òyÌØM+­á2Œ´F¢=^½ðTFæ{Jµ—ÊÁä!§YÀ0³R¾ew³Œs `K:µš\J¤£Ñ¡C]XÜá­šTEÂDe‰ÁD4ÔO`Š­fýu0báFX<äÅyž„JÕšN|ÂÍÐþE&¢2û häò–ùÿâõ‹¹Ðœm5«ŠKlfëߺ4~‰ýÿ¤dC²¼ÿoÐ¥êqý_—ªÕ]^ÿÿÏé?ârÚBaªd¼.<§ <„UΈ§¹¤`PR 9w‰¥W3îz¡J:¼§ Šœ€ NmÓÔ߬¢7StiZ£Ùìôjb¹|x£¯®¨ÃC¼“À8¹]XfÉäaHÇÎ{œ+àg†½ÊË׸Y$ç*•ƒ˜ 7«Y_¶Ž÷#TSÅÒ»ž$½Ä€¼ÜO›…ÑÍóiÌÓ~Ød)±ZK-f˜éE ËœzIò±ƒ`\x-xÃ@f ëE :¨¢Q?n®ÂÏøëÊéèðq •×ÞèÔ·ãÍb C§Ú.qd§ë5<¹©Gz‡$Râ…YŸ§r/Ýš`ü.z–°σØ‘9‡Ñ=¼oYû›B*©ž¨¢…j{9Ô¨AeÆHúsB€q«pp<ÑãU¹2Ÿ'uºD¢O$Ia–PzÙyåeÅÖR³)4Hšè‰qÙ¥ð‘΃•ƒÚ³å¼#$1)æœ×Éq×n­2JÐ\»Ä|ñÉRÇ}ë2{Î@}=Z`øÀ5Ît7Ã%ƒö ØÍÐq&(ް-)Iú—¯GŠ5¨¶ÂHð&+ÉÌ¢i)¨×Q.Ú}4ñ@Å{0é¹²~§;€§«éZ*¥Šð…&s±Õ¬ö8¤fÌH¼ãÆSÕ Ö I¡S¶«ÙTf)° ¢àBÀŠþ#°¨ÒÕw?'.cBg”¡`$h;$èÈóFIA®ŽÒÃÊàò® ­, ÑÓ¸ ­› ¡ŽÑ~òÞ’ƒH[ô¼j5ãçÐ+è<,©Qú®"d ¤÷詃»ìv’•IRÕµdH4¥°AøÊ.^NWQ ~Žõ:c–÷¹ƒ ,¾î„gQÚ:Ä#´Á 8CI¶›­eð}â$×ÏÇÕBW—HÂlj©ÒÏ $ÛÏ@àK$¹Œ—cÑüYoëwáD.S v›ë¯0AH$}`ÚÍ÷e/²Vãæ'éÇøÝ‚€K°ý¹*ª­õL械'¯Ô[+ ÄÜ"Ä2„`{€îù ã Š¤ðÑÒJj\FÆ‚ TÐëÝÒ˜ü#!h’“¨§?€‘ªU ¸›Çpј"ÿAå± Ú”®ô 8¤JŸ”¢M5¤ë m"¨I­©+™ÚZµÀjGuy𦰺Rô¸ÿûò?”Êáç ¦þÍ©‘Ïu6þC§MÖÒóN¯K5´À#!†Ëç?ÿ#Ÿ®]ˆ¦‚ój„JEW¡~¢"ŒÀÙ¥!#€¹˜\!&j…BzæLp$•Ö Ò%©õú Ò•”ÙL  }8D§ÃŒ0™äá”ÚÜßÏÃ[òɆ¯]­è ¨¶Ji‡ß‘ 7ûé, Cò-L#œw"PÀüd@-¿¤ÌF²‹‘ÙKv±mPFø<ä”RôiT°›Ç¼:о@/¿áäPågÝ’˜µg;ª€B`Y.-ìÅIG1X{%Obba*›C²ºë¡Ìçá”S`¹„­Å—.ábYdL‚îÙÓ\œ«(Ãb#5 »t*«ÂùD&†¨TnÞ…/„b3K³mùàÂߣ¶N†¨T È™Ur&œ9ºŽîñòc†aþx_š,‡+š!A§„ªJÆïPÑþ ÉD£ØÌV›J:†L†D|Qe[ú”™‹mÖaôl²2¢wÊDüì›’¦’Êp甡ä#-$¶|KZ’É"º›‰C Î&Ѥ%K½ª@™^_Í$0€^´ËÄÃÆÒ‘ç€è ˆÁƒÔB°p)Lü°F¸þrIòåAÉ{y•w¹$oø*ɵåZ.ËĪîúQ:±]‰Ê%âN¼ƒ§Æî«£‡ø@óhÆñ‘—!ÙZl¯Œ )ñ²¡FVl£á:&3¤—xm, äB%çe  ¶âIHºÑ Aý™ £A"Œ0žDJ(°±%Ç“(ù6obµñ¤‰G£ÅËßä-Z˜O"½?†óJSÉ&D«SÆPP aDV`ìx *ðj±B!/+á´UȤfKjcbC2Ž G-îi7‚‹‰ü©ž˜‰  bÈï#T^˜BPC¿—BP·1 yE ‰DÂÄà†Gmºl#6¾ìrèÆn.Ñ26&ªprŠP‹è ì(tæ ®á1~=+…alÐcp½•®¤Ëú¤qOÞÖyíRV¡tsf ¸V f<ÆØ8ÆS^.Šu唚¯TÓÝG¦òÎ!ÚŒ$G Ô,xõ–—ß+ëi1L¼Y<KÜ.Z¡ VÒ Ù¬®päêdZã°Xîqé¥Ðò"è;ŒÌjzø‰rÅøéJŠyÉ· ,IûíÈ"eˆ6N› ô(&•“ƒ/Ç ©ô{ˆÊIBFB–’A⤰!ˆñÁ"ˆJ|+Äb¦NŸžAbeB1DQ“¤¬ÑGÔ$ëá$EV%5ªJ¡©I8XÓ×¼ô·ZÛå0Ûú¬î:+m’eÆöŠ0„¦a7Àxt@ÞÀC[KO™‰XžÎŽLTntE•«Å£@Œ±Ã™ãµF°J3cñö>äg™KñdÇh‚8`æÇøDƒŽÖ1ˆH8 _ŠCQB8Ð3ÇËSƒâP0ŠbíWPÚJ°™ôô0Ø Å1[,%–K°–Ñ·Œ30/» ðí$Dt'(ŠrÑvhÔU ÓÑõßР c¼÷H‡í©­ÊJ•'T`'Ìx)ùÅK˜MÜ_hôžJ ®ˆ2Ò+ ˆ€Ó¨:LÍ#N2!¸R ”•@014ý’v­‘LܾV‚¡h0šK³ ;ï‡Îúxéd‘R ^$SI9MÆ$µ«N—¦KŽ×–òQ\ð )²Êf²åxð°sDÈ+(&‘n¼›  Z;èÃÿ'Æ#Ú‰‘h¸8üLjTˆ¾bA:ÈÉSBzÍâc(u Ò7ÒaMBÊð<†£MÊåæ+·ª9àf e+¡ ô©y0´çUÉÄA.€A­* :YH_UÒ?8Á0B‘‡w°FèY·[%Å"(*¢#x¿ÁA®+̺·Ôçp¨*ÁNˆ’nlÑq”D)rVJòøp… üME_yf„HØh¥%¦1ôªI€êf¬SuÓê=øŸC ÿåGAÒÇz0t.³™¢jafåòÊ Ö™¡àòvÿÿÕû‚¿Z¾ýçs8ÿ;÷ÿ“ :½.¸ÿoÐiõôþŸþòý¿ÿȧ[inh?YÑmÛ™© Š”ðkVƒ?0‹¯r”–Dþ"-}%£ü³³‹|î=œzó/g—ç;ϼÿ‰nñw?þRÜÉÔNŸÅ¼ü~ßñ1Z™Ÿñ¼¸ú±Ï,†;h=fæúc×|¸ä¶ù7dÄlvþ8æÔë%˜ððùe½}ñéûGÌŸWäî®ÿŽËݳ¼Wƒªþ®M­K²®îßõÂõfµiÏìê³¹ZôžÜ»õ‹q§“ν4ûCõÉgúh1¬ðžÚ;±ý·»>úàaËøÌ6ÃÛÍêzxëÛÇœ<éGÃø€½aÆ9u»oÛ$k¡.-T­¨¹iÝéCçžë»H¿sO«yã¹[ºŸ<øÃ°6‡‡»îl¯žÏ˜<¦o¾'¾û컿ʼ÷ÒkoýyèxƒsßëY÷t2%ÙûdÑÓ¦Ü/Ÿî(ÝSÜa‰õ§×Þw£»ým“ãgì87{â'?d½ÝvÔãóyaÔüž ƾ;îš%7|2xüМ.{Ú²­Ë§îºõSk·oÚ<ö\éO>Í ~üïƒ?®õ ¹ÍÎû§Ú?QR·¦vlõ½«f«Ö”œäéö_¸iÉÝÕUõNvt)ýìΆMs<Ñ9°ï͸´WR?Y“;zî¡-ú¾“˜»ø½ÌÞƒòFÙs{—<²|ÍÖ l¨l²Ïä£Ï^5¡â™ì+û²0oÒÈÅ©º·G?·jÝìѾ7­×ä! CÏÔ?Xû}Îà÷t†Ô¸­³Nv01{ZÆù´»ÏÚìØ¯;Öqo§ÌsLo½yÆ×¦ã¶;¸ÍôÎwå\“¿þÖç»\5­ìÄ´Û-š£³5õý®{yß×ǯ¹kã¶½[çþt&fö¼ù_ô[i?xujÅí˺k7û@Í®³óG¬™²\wüðì÷½óZ^)|¹üü°ýsÙWwU‚¡•cØ‘n°ÿ÷-ßܧmû/óÕî›´ hø°@¬uݸŸç¥÷p¿mÞœ-§û˜¯^5ìŠ-³¶õî”Ø×¿÷ kºÛFyÚwNr~¿wÿš¡ù…SG.ïvÓ˜b;ŽçŽÝ¶êfE‹õW’#,Ç·öž6eræ´-‹VŸÝÃÒÅÿ|K;ìzö‹—V‰OxÛ¾°¥aÿùÁ›¯.›âŸ§92òÛq#ú½z¾Ã§§w¿´ê…Î{^lÙ%»ïã1ª¶[‡Oèž’Þò~bhuamß¾7ß¶4î…ŽŸ>l½¹{Aê{ûgÝØîðu‡|Š^¼/.‘9Ûß´»Í±÷&ðPv_àx»L‹Ú¨ e 3cìkv#[ƾ6Æ`3ÌŒ]¥D*­R”JE%‘6ÑžÒ‚ÐF‹B¥¡¥äïóÌØÒò¾ßïÿûûÿ>ÿz_<Ï}î=÷ÜsÏ=÷œ{î½gÌÄóÏül£Œ•â§íxJo?¦Òûȧ@)‘2gMøÚÃ]¸ÆïçÖÄy¿0X²¯“2‡ýÎè¾ÔªÝyëÓjDZšƒ6ÏÛ³˜n´t殤'©í³’&®Ä–î”’ŽŠ]yso‹Mó!kÓ¨½®ãbZ´®±ÒhÜQv´wݳFî½ÛѸì¨òÓ÷Süï}Z¤Y•½ûƺ%³Ï½Ð£Í^6{‹ÅäØû*F¤íy+·Û'ÎÏð]jœÆ8±Â6<õeSF«så±…ì =DÏ”åOX‹/Ð(9²K­Ä&àè'ÆñûAǬvµežx±L*…Ԕ݅·ušøRWa활¶(¬íú@oµA醴§q“³«ëT{.}2þhNmb%7'°?<Ò`çW»‹Ui·ö0Nyœ~è¹6LÒ“µôFr\ÊW ö”ëÛÍtwäΔ:aØ£ÝZKüytæûg!A凮4~›è‘vÔV‰Kk¥Cë¿Ç*‹ë|÷«ù©ÛêÓê[VUØRîjôéÆnUWÑ3œxüí|™¸´NqÚQóÆí-Úéy'¾.p~ÀÆè÷#FT,7sŒ{ýüÃí]MÞÇ÷Ú(µy u¿ >ä*væòøm¥ò댗=2Ægÿ"—ç£s”ÚŒŽYZ{í²Ü$yýåŒ9îÛ»5›Ÿà]h_ÔÊæ¦åæîÙ=·ÆªÄ)V›À!A>zè )öì–¢š=Œ|ò:Jk.Ÿ£_mHÞ¯5v¥ÇgŰ³Óorí©«›îî°éŽÑÒíQS?töcKƒäã©=e Ž®“˜¹ïµ.›–a[îv.ýÃY‰9s¦ëkIëh§ß³»|UWœXÅqZôš#™~ G*3¶¯Ìñâ¤Ffô4>:±Ž{oÃõy±éOe(3¶´-™8JïgaÂîý·n=ÿ¦½#±Ç½:½¥Y¨5ì|™Ó²¦Y–Yj­YskXón¤EAåšCq E=²º÷–/LsïdqË¿U¢aU¾Ø¡UÃŽ¢>ŸkëL_E}a‚¾cø› ==óõöö¶ìþ(£XØìQçò˜üºµ“2ÓÄ÷¼º\ù$?f/}µ-²÷Û£“O™lµà.Ç^IiÖˆô8×™+£óØwöt¼V=s®Ø>ÐVÞ{õç#’ÅÂ\FOMÙtðÊ›ðÏ_„ÜĤI?Ü$Îë@PÓ$òÓT†Äz°¥øÁ€>tŠ!+놟U5U±*Êœ‹ ÷›àA.6ÜÑCD/;¶ã´â W”SÉ4®Ì®Xœ=-‚ Ê™DpÍÈHQ‚ ZƒÇ›¼Á ˜NqFàÞ#íKâ£èË ˆE0ä`q‹é>¬…çàY<€¢„ÁMY€¬>öüèXeüºÕ‡Ð¦¯œ­–Ðw:aíÔ‘rÂÛ¨ve ¹#<â1<ú¨ÑRfÀ­ï† Ò gí`e·Äu¡=°\8Š$Ð:!$ÿö{`¡F¡èÂO€Òt6‡kϲjªâ,)¼g xâœè>\ŽVÇàáoäGE6þVV‡HñÿCßx¹0ð/KÔÐD~à·þ²È_ØëL ,{TÄ4`rè}ïü("K€6ã‡i³™… Éܘ×fCÃç‡~Þb¢ò°-Æ(«¢mB[þG$‘4 ÍüÆà±Ãý‡äUG ¨£¹Ô••±jjêÈ_þ3ü®¨©Ÿaš& ’G]£† ßTUÕ•ÆóÒûkìï'”Ò°üËǾóûŒ×[ é-ø—Ÿö,~ãCþý¥1Lw-6´05¶æu—+ˆÂÚ_šØ]êĺkhW î.øÿ‚¦cøÌ<ð§¿ÃáoH „mÕ Ë"¿1šÊ„A¤‡É„¾!5"ÝÓ5À’ƒæ€]‡ta_‡j"ƒa¸.D:?øo_'Ä÷¬Î{æ<øÃÇF¹ÿÊF†±ŠÂ*È1ž×Â_åÀÿö; ßÂÐNþÙ8×*WùŒÙè§\hL÷åoÆsÃ5q!¡,`˜!·‹Tð8_:òLÊñPqHeƒÙyµ¦Ñ~*\ Á<è¦H ªa• (mÁôéíA?0‡(cp*œ ᤠ¦˜`sâÑ@^aEð,ŠÁ¡P }ßà•Ì¥9bÕUÁ„:o~‡<ŒÁ9󠨨h `@€9UGÁyã¨8ÎÇÀ1q,\0ŽãุP² ‚Ce±i¸0\¤‚9°\iD,AmÈÌ2 ºjÛ4m1ƒ;͈o +ãU”û¢œø LÏV.Ê—¶q{FvÜê&o­ô57âPĦS‹æW:$öŽnêÕ¿Œoɽ{‚m’e—UqûžøöÒ—š3¶¯Êò>GÜžEé¼`{bÐõùг &õ^’:÷ë첊(ÍFõ肤i ‰OÄe_öœKþš8ýÆ“ºýKc4õUi굅 Ów™B4v*ÖŒ¹åx`É„`¢‹“—À¢cÞknë6|6Å_¬3%üUÛÃ-IÕJÂËÆ.” ?»$hS`èù…Mj`bÙÎïSdgÏá˜Q —ùÎÙUç%¡-Ôþ*êÀÁë® %ÉÉû?E­½:Ѳ8õú·OÓ’¯´µ®¡q»{ŠÏî˜qW+¶Ë)6¼Ž¡æ}xzßêÓ¢¤c{nFD¾^ßzkö~í3ž±7>ß{º7wêƒÃ_vœÅ„±äÝÙØµ›³^/dXž_Èú¶¤²üá²çÏ_fµÄšMfXk ÖS1ñ«šÄ VxˆN­Zø"!îeY£¶[›M=ö,ÃFm~G¼pò+õçN-¿Üñ4æÜ‹’Ñú £ëƒg&­Ù{ùô=M©]gÚpß5âß|?WÖüaÄ™)…rBÆsŒÁg<÷bŸr!øÐuëæž5Fr.&Æîš¼[W`¬î¦µyçönòÜ7ÃÙpJ†ÓgÛÏÍÍÁœÅ½íöm~ºŠ“ï?´Zž['6""|q †»¨,y{S™|bmm­ÇEÏ©±Û´ï,åJW?}~sMó‡Ñ:÷ýïÎPˆÜ.ì­8«ÿzö¨X‰:OÑÔÞ{W÷e%ä)}é_lÜ#szR½†ÿiFDRz‹ÿAWï½ué©g3æèàIæf\ÝŒ ú³1Ã×Ô¬·¦Š%ԟ׭±³züiâ“gnÿrÏkÉ»¼uVå¥Öò˜9³Ì¥”ZåFd}R`¬×ç©"Ô9ãFý¥b…ˆõÏJ½nèölºy-vñNÄ;IÏ4ytôKt¸¯˜«ˆï]LRá§©,)L³BÉe%û±¡‡L+Âzš¶ß´Ýqš|àÁÈ}\Ãk'Å>Y\~yf‡¹úÅûò²SXü î,æ·(ƒrϳÛîp¢ìN¯¼C¤w©~1^OzÏeÁ S¦¼«ÉÛNV15a»LÛ7‘À¯¨y œ.Ô h­c/ž¨¬/âø±{÷•‡Ù®DìÊ’ƒx‰-ûKVØuS2ã -wçů5yW-5ÌDNž™q<”täLcîã=[: æJmµ~0æM€ó©Ïò_uœ¥æQ/ »B0!FS;3GQ€]{3kÄk÷¶yË—]X‘.Ü3“Í4+\¹f¡uŠì§q)Õ~ŒkwNôNõ‘*ÞqLºAø«ó§GöŽÄž¯¡¸íÙÅœW‰ïN?¼qbTÇÛªo~øfʵ‡˜%5Íæ IÛoNZ0í²¢£—ÇÒ <šmâÊÞåÉè®ò6™ÙåV‘2Ž;¥dĶUÂzº{Û¿gÄG%Ø.oÉÅ\¯Ïºx¶[û±§õÚ*-ýæñ«¤êLì¸~h/~š¢“HÀb*íH^ÃÚ ú“–tØlLŸ™á9:ðЪBÔŽZzÏúÔWÄbRåâL\Ä3ï½ÊÇTíw:-®m£9ïê¤GW„Ÿ¼^të¦Ñ’µûC o¬ˆ³àqÌ*Ëäò>WöM ý `#–ÕvsQËËÝ«-wæú.ÊÓ¯^.õ­æÊkUí_î˜Ï”¤Ç./i?^¸÷©îµzÔ·‰R£3¬žl_õTvë* ©OÝJÖÜÇX’{ô¸ýè…ùQIË{B¨A“.§¸æž<ÜtqÒØà±å âÏ•’ôzF$=×]g™e}ìþ+ƒ¸Ã·ýÆ=ÀâzÃý—ˆ¦+V­X¸²¹cÄÎnë·ª^ÊÊ·}ÆY´%b‰w¯:ºozUg¬çû­™s}GÆ„7\îy½ 'ÚòTwºnÔù·¼ó5ß©M3˜%ž4«½ôÕÛ ò•ËÙ[Zžùˆ¬yfTVõ6å½ÎÊ£-íìÌ-!©b'•–Îi˧Ïñù8¼.´<¦ófwÞÞ`õû{¥ÎžÇ+?No7Ô°e³çº®«Îø$Ë|Zø²ù뽯g"ûØ3*Ûz:ßwˆÆ ìê(Ý/ï"8Oqs€SNðõZs±ÌK‚F‰ñbËI‹[O»ÓöѯðRäé}·å-´Ç¬VÝ~vܦ²wÙóχ*áÚæY­·ÈÍ9¢Ð¢87½¨KÊr¦ˆîª{â7_u‹_{vuõ„®#ž½<ã"n½@|ü®’[Išœ¦Н¸u¶“&á(±y­Åä¡Ò !µæåcœ§Ýc¼Y}ç›ÄÜ´rùØ]Œ‹¦—/HI|yª,þ\d°hÏýÖÅÙÛ·ÞÊ´­)ž Pþ ìPŠò4ÿ÷9xWÙsz©ë‘âš(›ÞFë—¾†w’üÓdV´ˆžÞ¤nsÏ‚EOˆœ×šöèç±îÜɘgÝEBK]jé÷”£“¨_ oÈ!ÚèGx 0Xjj}ª•J¿j¥¡6HµþÕ ¯üÕŠ ¦öKÝJ8@·2ÀâŒpÆ8œ9Ž„³ÄYá¬q68[Pcqö8œ#Îè_èñ¥sOQPp>ˆ:æ‡óCÎö±qþ8:PÎ4hhÌÐ oèºôC•µ`¸j ùrÑ'DwÅx,\¢ÊqhAt¸w…‰ãS¨´ß©vCÔÿjTLüÕ.ÔIЙüz§AúuF¬Eë’E»"žº†çVŸ} *ªnì>b˲5‹bG¦ާ”ÍÆ2晢fˆ¸HƆf¶U+»pïÎF2+ZûÝŠB}bå·+»+ʉ6tn=úÞûõbײKmº Åtñ+ÞLj››oœŠ{¬ lª=ùµò=çòŽr3F¬a¯^ Q 0åzr×3];Fk¦Å‚âÜäñjëO7寗uؾgÊô½„ÉqßG~Spþ\ç§çq–Q’dþh…GZƒ„”uââ4ÂôÞ[릮³K¦Ú)ÇLÛ*E,!~3¹5UŽc’ãײç¸Ì­yÄ/½žØñÞM·ÝÞŸ¡˜ýŒîv¯d¦^šö ɰ²ýÆ_¯·lø´~}—ÍÃõíUC›õÓÔW4<ÏŸyr¼÷‚ã;RM>O L|tMÏ{rƒMùüÎi‰q×tžO!ìU›¶>ñêjõã©-æL]¼öÝ5åâ5 d„&V&¦\›óœã­õ~ê5tó|ͽ³°«eY‹Þ!}-šVO±Ë•ãìœ E7nÚÜb¬3zw !ÝIÓI³WyùëÏ;V*-ô¨(:{¶àì÷ú°ªÜªw®9Lë²±ÜýPmjÇ;Ÿï/'%÷,hÛ32à©©÷JA¦ÖíŠ÷†£gªQ4ÆÈì9XmtÍäÖÝÇ`o’Õ-Á?4l½G«Žu´=Ä"î>ÖÖ›íþ$á±ÆfAi6Í4õ&ùõv;â)WtÌ>³i›¸ú+IÞi?½}}öù†WríJÓóâšm~ŠkÞØ6åšÛ´IO&‰´™ÝljiŽ|þéʼnÅþ¢s=Ä8¬âer2LÉ7ï^N?$»êÖ¢ÔönÓk¡ÛÎSB#<.y1sä®ý°öí×=Ǥ¼ß§KOeËM-$Ì/r|E\X†ñ»Z¬6ûmªì,+OüìÈ}3Yú *×Ê.o®¸³)Q¦JúžÓ,¡ý•U£è½z·Æ~«ºN«C-ÌϘ¤ä·ésRù¡%“sn:°‹UQ_"¾ÖÙÀ,¡ùñ§Ù‹C&~Ï8RÞ|dåÁ–AÝ:’)ç(ajwK§Šq‚›,Ù;ÁL±ÎõfhÊ—ooˆtÌkðŒ(©Š9zödñ´6ݲo_«ç®Õ-^óÑ…å:…´ÎÐYv”öJ–_éÒÒÍßô"l®´7_*~?zÙ‰‡zujçL£­<¡Â´>¯ì5jÖi‡Ëé:awÎ[Ù·M>.‘ÅÄŸ¬²œ1ywkúêkÑî™ë?àfvί&Z®m ž<{^ÇÅ-Ô·çD^&û¹¾ [dЩ®E³ýÀmÖ”2ܼ{^²…_WJ:|Ùi`opäfÛ¼§,_Ž;¸~\ŠÃõÇgM9Éq³n/#tS1t‡‹úÝ¿»|öìf™óTM÷J5›•ê…øÉß§&+‹$ìkªšDão^.¡P~gµíaáÕY¤É‡å{·Þ½½AõiN:¨íå™q³ b–ïø˜™m³TÚ¹¢ Ži¿0_Ø%ùq‰@ÎìŠâ]Kž9ËuÎ:añÔˆPɹ9I`UKñÙ¥õk¿ç3Ô”6Ô$›\Jw´­ijFSf”ÍJö¦Q2Tìýó‹^ßX7_0öƒÕÅ•š/…tEÙä´'^¾ÂZø±âzñ7Ï æœC+nTÇÖžÏß–Zdv5ØZÞ©ÐHrÝôøëZg§Úž£Y.³b¬.átââÓ—šjÅ_ŠH¨“ ä98©Žß±wñ"²ëg±*Q»›¯¦4æ©÷|á^ßyïÕƒUÍ"µF“ >í>|7‡ðyýS©Ø¢ÐÓ§vë%GHJã=[8Æíâïna£×4îV,|<ò“MÍš^¶þAÖòcK££&ä/)P+kªvŒ¿V®¾8À'!¸tÒÅŠsB+ NÎÑfŸ½6æîâúܼº×w(ç&ÛÒãÞŒ,:‡{[ñnNóGæÅBSád©ÊQ{²×%0Gêt;³Ã´·fœs• ÔÑà›dÚ¾3M›ª³+É–˜ì¢¥jÏî/ëpµ|¦¤Ö¸m¬ìD¹¥3\®øœWøÁÐò™lñ汚XòÜŠ-_EêKÏçov[x²ùþtÙTAQÙd…IZòuoë;ï^ÉÙe° +zî¬7öžÓï=33Ûv«yÑܱ+ f¾,zî¿ ÝPÂÇn«ñ–Q‡ß¤_7FÇȧ8ãÆo^X!°\Û?çRpÊ¥õ-9gÞ0ííÎßo°¨Ý¯+ñ4áZž1á‚‹L®“ÐÆ,¢šžìUƒKÓ’»ô2_Œ×2ßÙü.ö£D“ø±ä•͉zõ)Õ‡cg¼}-â} hN3%Øà€«€¼®Á²Ðx“œ±)³.$˜fÍô!‡˜ÐM.:ÞÓ¯œ1v÷–§R&ì ì¹ÑÒm‘SÁaP|—­9'xk¬µ‘gU |ÛœäชJœœœÃô‘•î)Ïdc^®·Š»9ö¸úØ  ±®ŽSªá³ðŸ’¾­z»ckö8IæËù3N®w;1›ojê9ÏÚ1giÌÔûϾçïÚñÕêõ¥—Nª¤Ê‘ÚùÕ៞ï‹íô:HŽ·ûŠr"3÷+›ÕFü(ð~™í³›cR­×®Y<†bß²²åSì‡äŸSÍO´½› ˜÷øRâ­]%…;b».Íóž°³¨áð,LQ¹²‘ŸšT÷Þ,ò6yŒò²Í{o8±GŽÈè“àºl±Ë²´meã*‰â ÝÂuRŽãGGÈOèèVθã?v';ct£}t‚Ü<%EE¥Lí&¶_´UòZ3@gÙÅô²ˆÈÑ99Gµ0:]jÄG¥Z“¿0|ŽqÝ}\™"ŽsbÆ^øþ8dY•¿m£ÃøÒ”Y#$³ëÊï]P¼ý´&,ÝcíùW·M‰w:ôq±ÓöºŸÐ;[þõÜ™8Së –£Ýo~ÿª0áÂqWîXïó·N¬Ièþ:¹{´ðئûG,اâÝÚcx vÉÞvïd*Ÿ¼Ù¼jbåa ý@÷¼’ÕÉS’–_½R>¢Ü­ÂªËY¯=gJ .°®Û‡Èݽá^,ž6ÚIcõÊSwö¹*$y®+Jð&÷|:rb &HFª;¹Ùè½¥duÅ5J´®gûÇ*Á_F^Q:q)/ëÛ¬í†õù{®6›­¹xÀ€²¼ÀPéÖ6Y墨‹£®ê'†ÄóB­Ò[Ò,¬R¦îÌ>oߢxW±ÖÊáõíW)ìq½ð aÁSo¸嵚ªZk;ZêÙ¦¸¬†ñ¾£í«*`²®hC½sÅåå*;íÛʶ°gĽYŠQ:y"5­jÃF½­ ëG°Yl»ÇûNˆÖ]9¸Öíó¡ô‘ M™y¶÷F¦oi>òÅ_l秘©Üè°¼·­FI¤+Š×U-›sê…b‡ánû] eé/ü—Þ&¥$ã¼,xÚ·…s:Ë;¶s„ºƒŽ¬Î;üåu=¸aWEz70kdîŸ‘ÕøVzQØ{IEe7ãð¹u&|üRšþ<&#cµâÌ¥ÅeÙ9ßusÂÆ­“²ûâ"xD6ëã¹Ëgê¾>rUt]¾·»hbMïëêʦå“kŽï:xùµXk‘UGԒ m6X²"ª)½,¬ß-«S;7µ®+ _÷–]Z`wÀtšÅtt^"xw—µtg S­úáÅÓñ•µ¹‰V·_ú™oµwÙ¸Ù×_€jN=sÁSèB½È›©]\ùÊ5$¿óoæ]“м±¡aÿ‡7ô›‘ŸòJÞŸ6\|ärú³Tul¤ªÖ¸1+{´a⺚ f)ÛÄ{e§Z¯Êñœô½¹æëWßíïÃéìRƒ]2þGUÕjîo<ÍöüBýº‹;ZÏ¿È~7êYܤÑoÖçšM3š|°Òkêc†ºCuº`Ä„Þró¦•×Î_L{o¶ñ¦õÅHNË}—++ÞE=YòEèûÙCöìEBjy/Ëbq5㮑zFÉ—øBÛÜSºÎ‘o¶ø»~\nɸsßw_©ŸÑ’ž¹µn¢ZØÁrÜÃXËËK?_>ݲeÑÅÑ04 Ì*<µ‚û§O™}yæÄ’U”—WͺòﮟTDs·ÝÆt|µI®'+þ[®ÑåѹÒKk4ð«µÏ¦EšÄav¸-YâáµñvI¸ÇԓᯯKÓ6AýÈ{‘¶ËۮķÖ4ª”Íë‰Îu(÷vŽ€‡È‹–›÷=3*{o¯0>‚)Þa¤y+:ÞÜòsâêÕ‰íÓÖv ¦…Eú­>°Îy:Ó1ûVÏ·cx!-›ÆÜbªbB‚ œë>‹„Ü\Ã]ñO®‘©‡óG]m+ò½ó;X(³ss‚—‰‹Aì!›à‡×—]Q|ýüó~2Û­ÓÃbõºÇE)¹)QRUq;…O¾e„í(¥0_ke%Ò¾fÄíå…yÚ÷FUDNî {ÚÚ–r}÷Ë'ÂoÉåçdoܼ¢{ú.agȪœRÑY^dK Auk 7ÜL x}„2ůCõŒÈØÇE¦otî y„Þ÷—p9»dË¥Çw{_ÅZEmü¤^(òìäI³°ïï3o¦=/§b¼_S @êuQƒÓ>™¹z2e{f¼Ý£iúp1!òP¾éÆ•F•¤üËâ1Š1؆„–ycZw~=Û}ÎuNœºÈy“€‹Ê3Öäèa¯ž}wÒpß§õdÌY¹Wrncƒ²LÓ„%E?¡0oÆUêÑ´zcD¤^éÉ*‹Œ˜§áê*=Á4¹jš£loY…Hͨ8ÿ¼c­ò kºõÉrî°Ëdço¯‰¼¹tŽkBs€À§=…sEwúhÔhoøº¸ðU•ÄѺ½›Õ'iž©¨…Ë>·dôòÏ/ ™™W)Õ׿lóçŽòŒÙ@¾•{wáGoájã÷à{ >ÚQ©Fq6%»%Þ¼5#ñ]±XzÑUnǺäyÁª/05Áíu’ÒÏ^'6mìQ¸-rE¤bBÌä^É™N§|ï‹æ¾ª?lªG8^a¤6Ûs¦‹Ù×-¼%õ{UD4G¿œ¼ýtLXØ‹™¬èŽsË쵋z·Î/Û£œþµrDÔ(§íßiJÊjÌa¾=Zï{~³hîÁc[ŠöZ^#$7âé•ð¦c›t£§<»P/?_wÃínyÃe“üP\W»‰ÜE*.¡/¿³ÑQ]Yà•æÝ4í•«‡WÚX{zÀÂYŸ®/N ɤÉc¶Îÿvj†ƒ»ÅÊj#µšGÇæ6Nšô.ôöcy[›Ý›Õ²2}hkO„~Ià^”3Í©2ζÐñ¾}ræÚvrò8Ù-ö;ÅY峦¦Ë©‰uݼ/¿é¥‚IHæN-ìÖëkË]Þ|,ŸãRõ8·&ü´ƒXäa£Å³#]æ­—M©J}´¼¶–{¾ S¾îÚŽ‘ÓŸ,,Ó}Ìé8bºEñáæšq‡Ã’‹ž.ÈP%hZtVC*oKXÒÈÖ`Âu½o9½ñFGèUгÝ:yŽTiŒñ,·‹|ûÔα›œ6_UUÐv¿zýÞŠ©bÓ¦E½ô©}tÒãиqÞÖk4žul©‘#Çž£}€=WXeeCÍèº5ÁoG¿Y¿,D¤%É=»Þ¾âœÀÞMWÍ+Æ11ÅknõÞ¸¢ÐÖVôÈ_ÞïÕö¶÷nôˆc䟣Ûy_;*O9fúòŽž•Voo»2fÒªÎK›7UoO¹zDžvl~î­þÖm¡ë‘ÐF×éNÖÏ6ø&Óð-°çÇ6Í?\_û‰çu_ªÃ%6‚V“¨ŒUÓèó^\aì¼Ôì¼ÔøÙ Qs¸¶‹jpAÍYR³à-ªñ—ÔqNƒ—Ô(\œ7ΛM¡Ò52ä ]#ƒ‹mpQlà’›/çË eZzó ö§1qt\.¿ „º„ájIñp,ðûwkqý¾å¡Ërðø4è×ÿ¾%:®?›þ†³†.Ö…ã"p‘¸(\Í´n7t³Æ¿Y·SS!¬Û-‹t&×ô®%¼Ï=1Möž˜SPášk—Kœ,ª·*v]F9u†Ñ«EÂæa†棤7ã7)¯«×©tÌu¸ÿxåã'O:Ÿ=‰ºÐÖzõéù® -Ñ]_/=iZ½ÉgïÉÎÇ—>¹]:]½Ò$i®Y¾óQRôÖ»ÏOL÷É,ÉŒ®«¤}s./)ŸÝ2bÛ÷ÊRÍšK…g[Ϊ#r^-˜› /ºÓ+îÉÁ) ±@ªýãWI嫎f®¾–îÒÖ2IpEø•Uñ½Ý>_îÒú–ˆ}«,=ªòˆ$ØtòÕsýÏíˆÊ÷žßå„Éd•¼ò­œõ$¦ºub¯ËÊ“†Ï…Ùdê‰ïËⱉ±šfNMs3éâv’SðºõæWY}SñÙÎÁ;^Þl-üœ±úÚæÌª—ºrÙzÃÜ£.Ú¬§Ú»Û˜©,÷BÿŽ­Ywiem¹©§K÷b}§ÍfpMÀOX3~Þ+á}×t¼…ŽïˆØ1^êÕ´†k£¼ç_›ˆ¬ê™{O8žš(9*qþ5GïÙÇ“Z·`ŸIéI:NÑ^›bŒ=¾ÞÙ¤eã´å×,ŸOZµ`õµ1ûÓRÍÏ“ÎfN=&œ¼¶&qÒ5oùã{ÛçŬ»¦²jqþø9﵎‹Þˆasmê&ç“.Cˆ×›®÷Äí.¾¨¹üËç{â;¥u¤zn~˜&¿}ŽÍßâW‚N *ÒýwF|L :vÊj¿L‰MÔ·€fŸŸš—Ói´L;±¢tïÁŠ4ù.—7Ä7sÚ”êŒë´ê8÷Þ+¼'YTvÈf'3í{SG›oÒÞ+»'Я‡Ÿw9¯óLâ»çò™u×/µwKúïÑÒ öÒÿxpªð«WsTrÞ­5ºy-¦¸LæÎ–%Ö*Nrî~,Áßµ2it:嘚£Rœ© ‹þòžÅZœl=A¯îÉ%a쨌µÇsô^Âé:ªZ“R0yŸº§zj¶âÑ?[­ò„åkjã¬èWæW^3åTÝ×.[q6*»©#c åë¾±wc½]G98܆Ùà ¿ˆ¨¿D^ÊoZ÷Î 'Ö‹¾-®]åC“7›Önáö,(xGÂ4œÎ·W¾Ñ&_ñç}Ý«mMgµ×Þ“i{ë×ÔNT~{;Îåâèݤ‹4µs't·œÔ¼0%å;Ww[ãæR¡—¥Q³\2çž:5¶ªJèÅþ®›eM¦'Æ\,™45Y(TsÏ'Ü}óÅW<ààš÷6(8¿£èÎñu;h´!¹–¹Õ±éØüŽ·Ë ²Ê’µÇ(¥9 ¾çZvGÇÆÎ2ªõ•yƒÐ¶ ‘í»2Æ ¿vL ºŽY¤þ8óŽ¡ÏÁŽ×  ù{q/'“!Ûè½CîëÚÚ¹çtüÊi'‹J̯¦õÎÝ1Zöê×€Q¾¯—¨Ÿ~¦pLY'“¢•n´Œ|k¡ÞåÙï„Z<ñìu­Õ›+Æ-¸«±Ãmb]ýaó -yƧٹ°K9 b=g _Ô<õ¢]}IqÎ-/aSæîÞzœèÝöQ|¥ˆb®tn§Ý4½-mz‡«j¢³³ƒ˜òŸ—-o~ÛsRÓ,<|ÂÔí«óÇÜþö½óU²Óã­;LXp5ìS¤¯@àxâÁU‚/*âUè5»BWÕ;ÐIMÂ)¦9%{¶Íøä«»l¤‡´Ói‰³aÏ4|[²²xË­b¯F-?ôËö)=î_¾—ÿäj÷ NÄÍ'ºçnM¢•b®Žžu½¸LV܈|¸»j‚Õ¹]ÝAñ‚û“„ÞuÊ8¦7½ó~»¶:O™¹dÆÙ$rw¸ãõsN>ŸßãpýÆ ‡’Ü« Ó°í9RRV;ÙWåf}OÚ¾øð®ù¢S ¤æU沋ä‰êiãÞHÉí¾ß.·sá!k …`zç¦a®î…6ŠÍÞœ"<þ²‹UÊÛʨ³¯|¦Œ{[äYy–´"ù¼…þËOµ‡O<$v¶Mí6}mÛ»ýBsʪ¤|>PWÁtõÙ–<·M°m~Pò6Üv,kò)zŽÅ‘Ø BâÕJÄwÆ_}ì=;¢÷E-}õÆ÷–®'¯»¯¾¤ê»;»Ðž5ŽvÙµ©eå½ú)Ç>y¦¾ÝÒ˜|~Ç\K½YjAòùî(KËåÙ¡IûBSµ—O»uºqì•g¿©ET—!Ô'/ÍÔ‰%ÇO\»‰rr™‹é‹ß_µë¶ä'½½ÿPuÑ(ŸÇ )þ3KŸç®ÒÜš<"ÖBï0ÇÙÆåø¹;ÊG6> u+¡]¼D¤MÂÙQódån¡‰F¬ÏGÞ)ñôÊË{"ÐSµ7B4»qòÒ‘¢¢·ÃTÏ·m)éw×edFA­† »¢ñ¸º›NÄ„åi™…Ù) ªŸÝ¿Ïºøq~Åtß.‰<ã¼û·Fì>=K¤8“^sºtûœPQ܈ þTŸ¥µ/íÛWMv ÈŸqÔðÂmÛÉG¹³§Ç‰·›¢Çž“;±#ó­;󢎠ô‹û‚âI ½¢¿'\>£\n—\×V#°ðlÔ{a×U&«C¥dß[ÄõFìN½£‰UÈJªˆnX½¼›¹¼òÖªw÷Fʤa>xdÇùϪ½ñu–5[ýL‘VRŒŒ«ÒÇaŠ›Gg)«/t8ä &ûa½|ĉîb‹eÙ…/ŠE+]\ª}¯m–Øþè°Z½Ý©¶^Á ·¤?جwܺø³²Æ R˜«O”qm ~Üåï˜]9z–žl•ˆLó áq‘bÍ÷(©½jî*æ9ù­ÛB{çÔ~o½†Ý‘rgÌÑØV.iêÆ³‡ï7¼ÄÍkÓ¨[E®îÕ`…{_Ä2bê²[?*nÉÍ:ÍœýÐR*ì¾uo{\¨U4cÓ—’,"JŸÍ«Ky§ôV¥öÚ-É®J=iÃZï(í¢ {5î=ËY´(g—/‘Ù5ÛôÊk/Ÿ/k_°n®µˆÓ¾S3ïŒ}ÀÑøŠrCHÊŽ%ªÖͱ‚W§-<´s]ŽC£°¹äèc’÷üó»Iº¿_4.SóÜüìGuŽ‹¯wš·ýΨ@ƒl‘ªGÞ!ŽìèêË’wÔ§/6t??Ý1L£e’ïÅ¡Ö sÞ îJ›´ƒ}`”𠣤Û'˜_(äö–µZ8œ÷pÞî¶ÇS*{ô·ƒ®á=±äÉ®F™k©ýÄ‚•ª*Ïõ<&>’ÙXôøÜØÛŸZ·v¼\q±{7\Ú¬ÚoçÛŸ‹˜HÞ9,Hš9MÀdÝ­cë$ä§mßðeÛw«øku 7Z¨ŸÎ³wÌé}»üÀÒ¦7rÖ¢‚AåË*üÇT를c•Ð8Ùû-ôfMRœq [uýü³ëÞÏÖ,¯]uw• »q•°žðæü‘;^_²ï/y(A¡÷hiä=c£‘kk´±}Ês¶íPyVãæ|»r©ž#¹Ñ!¯8clI¬µ,;]DùLˆà†­ÒG£´÷³©3e¸›¬$/Î.Üh¹æÌƒ 1©É;7œ”ÛRvaywñn{º`zøž81÷×£6˜f;’>˜¼å.:öìãØ˜I슉º#¢V¤NY¼©”üflÙ ÕÑqĘ©ÏÂmÞ&xd]û¶`Ãwó ì™ÜéÉ£3޼y¸<Š[Ó¶_-ùCÀ˜ë¹;³enãäsöº^xxX?¾Ibó[_BYCó~·Q“¶Áxû;—ge8ÝÛw‰tu¶Ï™·ÕG7žj}º;ª—¸øñÜ]Ec?ß3o_:?sùœ³ãÖ¾Õ¡é~3Tç]ËÅ‘ÌØ„¤RÑŽ²W>aItŠÁ¬é÷Í<å/%,|«îÆòÈÒº`Z/ìp8'$ÐŽL®“xÚ²4â•Á[n¾ì•ü„N›/˜§ó?;DñYõ…»¤/»&·'&„7ø¼¥qì¢'îyGéù nqA¢ñæÄVÛ-¹U…M4Ò}‘¼šó™%®î{&©|K ¸ë4{çerð½ªà £µ£ÄwtùÌ™ã~çÄø9;WŸ;¼+·Ú÷M8§÷ÉÇ8É))8õì1TÍȱÏVßZ¶]̱l™ì²»µÅ¾[gÎ9Ã’Hxù*&©‰»·‡~e>íýuÅÅ£v=o]0ÁäQä Aç”S\"U³OkÏ%M÷mŸ7åËÜÑ×ï>ßô9Ò€*ðf¬z×Ü:ÓZågžä‚I…±¯ý8‘ákÝX£tëSO^øâ¿þä„ô±¹g£"6¨8ÆÑVµ9í7¢§g‰‰a{·TâIÌÐüg¯tÂ\ýWê³æîf°¶fi5¾aœ:ù¶¹NþÂÎä½cqªQÝ&ÕW)…³ï¹½}ÙzºéhB¥ÿ “ÝÎý+l-;oŒiÇdeäN®3ÌúfyÌnû¬Û…öwF7š¬Y}@ι†k2o–x†½Œ(CŽýæ}ëÛÏ· Þê-Úd9~Ê~s‹KY¶¢û¯NŸÿ¼À_ðYg¤PóÎáËKf§½~u=í㻦ݲbÛßg°^”œ¬Àg¼™zúú§c̦Y–“EõªçÇ¿ä*þPÍ’5¡55˜8ÓÀCíŠ!7n´ÓÖKʉÌõ¾ÍHúTµ?ñ|ê˜ãõ±²KÎØ1òáÆ®‹Ýµ¯w½nªlï9µ\Ë^û–„؆ÛcìJ|Où™%$ÛÓO\~ÕÙLá@Çì žXø×±ê?oɪ-OOOê8[»½àìÙêêô³\†ûæð×Q3îï}ùþKËÌm½ZWÃçMÓ:±s—YwE¹œc¶ôò¬\ʶ{Írž¿(Kîñ^tJZS—p;nuœjÜ¾à˜ª8©×Bê׉l×ÙlÒ–¨‘O”·8˜½»†a´6]ë®zUÐÑÃìnÍE¡ÇÝâoE}]ßý Û³æÐН•2‰]‹4¾Z”c ½´žq>^ 1Ü‘¡›eñSl¥©§eѶz%õF/¥å³~ñ…ò‘yâÛ¦/y–/AËÊú€D{s°ø“Ùü‹Ò‹SŽ9”­Y˜t8wëãUQE“œ6¦"1-¼*²®P6Ü.nÝx6º^îÝ׿‹[>]˜¼')U®ŸÁÂÖëEEß³ÖY$©“—o)62ÊÍœ|üÍ8» 5!¦¬Í®§6Þ[Tm䤚iÙQrGønþ Û ¥9~2‡w¤{´P–©–X¯ÁȤ±’ %æèM̬WèÉ®8JÜÑ^öÀW±êN|¼kÖ"…¸&kåÇéo7j®»‚÷ $¦cn¨Ÿc6‡±Í­?Í/Y43A”=vÎc™©ìËY§yŠ(4ŠÔÜt+6dŸvÐ:Ùÿ9´ñ åí"ÉT{%<:}o_)iÜN‡°«´¶‡Î ÌŽkÙgžŸµ5ÕL5uŸ¡ÕÂÖ‘_/{Õ³(Ɖ {°UêX”³Ô¹ó[çH-À¥Ü?¼hÜæåºÿ3Ù]kÄ.·%¯Y÷66YHÇ¡`ròX¡Þ”gïëVÔ+-[ª©’´ç¥&)µÄ]·û~ƒÆ† ]‰³G_Ó®ŒR›8ú‚þ3Mí2R+ÑB"ªÒ²?6»–yZ­ZÈ>|dT¾ÒÔ×~³²„–ä^ßõ"ÓpemÖ%+£ Ôª–p0UNÊN–ŒÊº°êôçýeæ+g9Û[WÝXs\$=âe÷ÙŒñKÚ= ®¤d¾ºP"çø.sî’Y÷ôB¶lJÂí“¿Ýøì¼•}Û””%ݶñ1B—{.oßÿÆ9=}œû·Ê&üÄ4¬×®ìŠEä;B:×âô›ãCÇ/å;6›\e˺ô&þŠÔÁ¼-ñ»7vôݧԡF$‘É:…™y¥QÚ«ß”Ü×Ü}2Ãoj­öã&“ÂÉqy3<®†l­»,=Áç ¹õãä'cÏ©§ÊßL0½é»LðC#yí«ƒ4ZV¦ºïéuÕS§×ï¼»zü†Þ3•í\7uŒUYT t‘üHýjøWýª]µ6ÚyqÍEמŠj‘FÕm}©²éA€ÊvÁ˜iVbRøî”ôõvÊÏ»®OˆN«,º˜Ö«üìa÷] NýâÍ †˜«&.ɳ;`"»fZ‹Ä÷4¯üú½Îø‘µçÌlj/?ÙmÕ¢šº;yÛ‡KÑ.–2‹¢ÏXT˜_v£ìò˜^d9µ|qÜ…ë©V²1"—4¾½ùdNu“#bVsÍõ›§Ž~íæ(]1ÚÔ¢{Q¯z)Ö+ìÉ­_¶a¦³nç&µ–ïk9wĬީ½«ôØNVA-£yy°h¸˜zý §ê½Ø(uÆü/»\f|Jzº~T¡‘ßãYÑÖË;ƒjp#¬G»~Û[='ÚÕ~ú³}Û>\ϰf<ªÊz|dùØ“¢9DýЉ–VÅ“o²gåÇM7fQnÏûéßê?ë_q VM2ZXÿõ ¾ÔLÛv̨Ã3˜Fs¾$¯Ï[œ>e,!¨¶së…)ãŠ?:fµ\ædòzþ¡C_JÖu·Õæ^¸·Ìâẚ‡Êj»“V u²7Ä›*VÞâ˜iy'qýüE&ë=„Ã6œ+8šiè4ß–K2˜”ut~h|èX«[߮ߠMÊÌIµR6;å0Ãi»û<¶¨K„Ÿ«NõÈ@/—x •;ŸØNy–ûoÞó9ä×øJV¥äü‚#3­_Gdæ}‹ISðrW*›öpšbváwÙÃ…cœ,—ÇŸ°ü¢ûöŽér"þï3ã®®¿½5@HdŽÂVÙ•‰9ö÷Ï1ÄÂOgœ¾ê-‡;³ÃÍâÜlO=Cï1»Û—.lÆÕ׳•ÏaÞÕíˆUN0ÿ(µø÷Ìò0±ä-¾Ù7"â„2æªúç—]›•½¼wV‚É;¥ò*–Z}k7‘]øõ~nA@¨Åî ƒ!£ÏV8<ÅO©>;îËQçuŸ 'UL;©®¿¬Þ.=mÍÅëi_VؙԻ}=Æx¯Û±‚8<=á©÷'ƒÑç„­¬ . œ¶~lóE'Ùƒß?´i5‰ÚC‹\Á©Ü¸Ý¸~öãÆ=SGNfkW‰“–ÿ\™›žœÙµÒü^¢Í´œ?ç/ÄÙ®ïŸÏ™"µÁfüä F÷+6h¯{CÞ§{çõ‰c«8K3Ξk~›åi>ú³ü$êöbõ; Ö&jÇŒš"«U]šr§7Ölé]AÖ™aÒ~/%Î7çÍSû6ÛõÆÓW¥Aê:\Kñ ÌÇÎÄ—aê3×\hÛ°©ùq[‘¿@üÁX©[Q:‰#ǺhcZO$TÁd”'¾±ZI¾\öe¹˜ÁñÞϹßJ׌\{5x§ïwKÑ´ªÎ,qw§Ý“g/8hµ]òZÜN=[I/ÖŒs]²þµUuúTâÌöIyÅÂsÞmQo_2U°¦X±®ça× ÆÞOq2¬w‚•ºâ8sÒÖ,ó‚ûo#n|¿û dnUûd—Ó—·:”Åû/ļ’M«ÉîÕ<<~.·û¦r«}Ù‘Ý íWž…ûMeˆ¬7IpxÖ•ðI3ûIÖ©uÅMÚÝB³˜YI]³Ú ÃÌj½‡•_iì.i©þ±'tîçG÷  i«×××ÔfxzyE,<¤.ÂȪzZDª{<wùd¾Ãª]Ri:¸l×÷‡¬zÅêž}lÕ¹úó>¦Ñž» Ÿož}fK—µj§{LOÎåÅë¥öÏ—\uÊ2M¶êGh{Xµv£[ìEb„¿ß*ÂbiËÅe›ƒÊ– j¤‡ïú2eSœŒžWט3,Kùmì×ø+w¤ÏjÏ*$¨}gViWLðmŽpÐ¥Û&³„ê+ïÞþÜ))ô18±Ä¸AKÛb«¿gè’^ðFšÔ܃[dÙf2Ò–âiïzj0öBønÎAúùÇÙ ŸK·Fûyê\\92n¹J‡F&£éMJ#gËÜßêG›»kµ¾½„M4É™-æ*»¿AU£xì—’ø#ÅIé‘£2jÌtWsñ8$ì=K"7ö{ç5‹SŽ.ž%«5\‘?þ¼æ˜Êöí®åYÏŽ‘’£÷ܵËÉ:u_¯ÉaÕgÖ®kç~t¡)ã‡øÐøG¾û]+ÎV–|¿ ¨¢ÖçWÑѦPaäš©+Óvî’ –î£+ã¤j…· 6¢ùÓÍ£Ø4r”µ=5*ªé#£¯JQ@Å4ÅJ0¼îŠKcs°4UWÒÈÎÒTfˆÐŠ †—‚a#‚LŽV„® RD <Ãdœ É ԕq¶²…aGðn]%M%‚"¨€õeS‚hH ‚’š ÉöñÕ²36åoº2.'"w?455qxeœ²²"ȡȉdr)ŠLŽ” ¯ݹ¯“£„à„D ;ãJx¿"¾ÞE ß‘xæº2¡¡t-5 ¯¦‚WUô¦©ª)¾Ex/¢^FÓÔTSWWSæW<ÍAõ B" xÒ²e³|B©4¶®Œ™­%Ö _á]ƒÈ¡)ƒû/c?ho0è¼nAÊáúa ÓW8ÞØ†}’Cï§ñÕÿé¿ÿ ~q D¯®L8†?Šã~iÌײà k9 ab@Èý²ÆZü $@D+#ƒD—ÙÀèúMÞhn¼ÈõÝãÁ¦ùbðXeß÷«¦ªJTÅúbyi u,ú…ÉK#h• CÒ@¢ªÆiêš?¤áa”¦ò©ÿO¯¡üCš†ÆÐz xMx¾~H>•ÒT‡ÁOYÿ.DÕaò”‰?¦©þFÔ þ@5¢ªÊPœ *øÚFüg‚ºÆ@úqÙð:R6r5 †Ë€³c±¸XäJ,ŽÄôea•Ñ[^HÆX7<odddLT55T!ª*ã L4 FÊê¦¢Š†¡‰Þïsx`Ûß(l.Â,MuUÌüù&6¦/Œü¿ùþG^̶ÿ®FüEü5eUÿG ªNPQCâ?*ÿÿó þ6g#¡x¬töp:ÕëÂñTÐH#H”7¬Œ"«È’.²"¯HPQ"~ êà  EçriLxÕ²=+kÏfÑ"±:\äï"j¤3”Õ,½¿aƒþ† ú6èoØ &CW#ñqâݹŽìRUÀr)ÞȽäLZ8–ÄÅF£Qé#’w<pÂ’P! Äå‡á…B–"xQ&¡¤d€f"WÀC; JL. © O¡„!™’u%±’’‚ÒL†$)äº%L" ã}zõ%¡PÑ JT$"9™`Ø…•F>¢ØHCcöJÒ,Ž:ãH¹¼” eÃ[ Aëx™¼ ©¬hûá,bn(A¾GbƒÓ`¯#]FE*…²¶^º”Açðd‹,zc}PààUÈprXKWI¡¿4"t xy=Š^ 3¤Å¼ÐHh´B_Ü”˜ˆa†ÃÆ`qnópòr`F¡xsX 8bÐ+ö‘.eAú8XñâòC¬#wÒ+Fa%¥ûê“äÅs”‚¦ªô5#œw>Jqo”9A§¥¡È ûŠœ¥1A,ÖŠdmæ$/Ñ Ý `ù…£‰ÚÚ𯑋™ÉúÇŒ`ö G!ñsþ˜d õçàŘA³ðúé…”À)H++ Ê+ô§* ! =úŽP})5È‹Ãñ#\!¤—4‡1iXNÒ]VIÞ]¤ÊKãÜ 8™¥|hhƒ‹ôãÒ«Ä`Å .ÙW¶nPY˜€ÿ]a´õ(Ò…gYßÈ¢2¼|(K8â}èl~T1*‰Ü€54è1†‡°$Y/6&Ùa—æ3é`Ö•”&Hb†0æ Ù7‹å§éJóØ“8dÀ—þ‚Úh+1¼†xÓØü <Þ°Š–$CL‹Wà‡F3x-ƒRĘ# ¡¯ _)lª¿"BgH…Ð`Tëc`çµCG¦/T^`,+,Ë 6ið ¼ÃGm$L%lD ñÛ„•¸‚oH\+4³4†7V¥9þòƒ†EÑPÂA(J> †ø;ª||`-ôAthÞ7$NfÀÀéëµAõüÃ:þ |)Cùà úò_aj(-p#-2–i`´#^ ýØhƒX'œg€!Baû))A-ÜÀ' ”ÃåÛ¨èr†F SÎÎá—æñÔ’8¡0 SÁhXe73€÷‘ Y°ïuµ†0<ýÌÓGW&h"ÂLM ‹<ö ±AÔYˆ°éמ`à)h–Ãâ ó*Œ)Äo(PÅdú -€ò£D¶ Z> •(cùò\^‰$¨¼’ËÆÃÍÛÐÃ-Àƒ'܇‘#Ê’üO0a‰f¤hÊ≼¾Hl1Á>q‡ÖôÁÒ~£¡ð3,†åýŸ"ò'd¢(ñæ'4Gß<2H¬è…ÁzÌ€®R„oƒròUZŠb3ð3?6*Î6ˆ˜Æ Šp)##‡bÚg c‡Ì40š+P\d¤ñ¼H˜2ý t&Ꟃ #’X†˯×|4´£? >(/Ö„Fcu‡ ×h8Ö>±ï†V‚Ä;åY2X[;3;+¬›Ùƒù— fv´ V ‡Ê–‡«Ä’A-IU™|øñ–( ±„š˜~lCj÷ãZ$bš‚ -cbHÈ:^‘ËŽDBÞ²PÌÇáþ,ÐT謂jÑè‡m¸8ƒ.ÖñVÐYQ‹o¼#‹ÿph$ÈmÇH|GH8’5ÙÞÀÒ. ò"ŒýÚÀWÂ@ò÷u—´>¦¿·ÂÞ ãõÊüÑtx@ƒ£Í çîîñ?`hŒA£Ñ ˼~€:àÓp~îƒÇ ÚæþÀ ³hÐß ”ÿýÏâ?2à"¿’ÿ×5þóøxe"êÿW%À|jÄx‚²2žø×ÿÿ?ñÿÓ}°ðÅzyØ™½,-Id{/sŒHƒî!É N~€Ÿ ©©m(„­( _ùÏv;‰ÉáÒ¹ÐC4{051Y –˜„±òà¬-ô¶p8,8¤ý ›æ£Uœ0º˜,ûT'Š74Ϩüv²À&¢ƒ daLÂ0t s,ëÍB¬5ÄK;LY$ô6÷·þ°<ÿ4ô@ÉAÍS诨_§ðÅZ)‘”ì•£ õìû Öƒ<–â]XtDC„Aö%PéÜHX?—ç¯ÔäóEçƒHÍ߀x¹}éTl8o?F0›áöµö.háAKzyPá·Ãó":U(Kñ¦3èèVP¡N_ÅCzj­ˆVÔ×_’¨ KÂ’}›"`mØÞ¡Û v8”ƒ­Á¼‰E8œÞÇ7T:›Ê °Ñ¥"‘µ P CX)èjðÕ‹ ËÃ¥íå¡X{Ø/LZ~ cÑ}@ÏR¸mÌ2m ¾cÁëññBŠø«Zv( y,L–ûY˜e˜2ð·¿VX˜ÎäòËrÐ’´ `näŸV48.øƒ”®:Z8ò¤ð‹ý´?–b1|§!µ±‘…/h4ý´>^)) : ôî`™ûîï4ÿ§ûÿà‹›úߟ1ÿ«€WÿYU…HPÁ««Âýàéïüÿ¿ø7xB‡ó”ñxdcžœÙ)L:°5É@Ü{Ó  îïôýwúþ?9}Kñ·¯é„Óá%½þ4IdÖàïô—Ä`, ¬Í ÌL°X|^Sü"`ú”[;#/G;2ÉÆ‹E¦ Þ›—•…Â4’õi¶öFæ X<ãØŸH²6µÁò^à3˜MI–&}5ýƒ¶v6ÆFö}ß}„%M- ÌÈVäÅXØ ¢¯%h°/ª¾Ð|dM Ì H–Ærp…Ÿì…¤Ë %€I]hîOÃó&N^¢ ¡mÈ^^N$kc'2Q™÷ÑÞÅÖùhjïeliÉK%;"m-1C3DÜÐÒÆh1V’ x“é/|„Çà=?C_ ÿ5ñ*Þxt¿ÿ3¨ÇÀÒÁ+iÄ Œ×%Ð/’öpÙ™ºø;Z°p·&G ‡CÓ•ü)JÎ@þGP5D|À!$X½$¯Zcšw¨–ŒnX±Dqpç5bPyGž‚‡ú "ÛÛa%(EbÂua c@‹yµþÕH):È +b¢Ù%‘IÜî}Aš>`Äï[õÿÙöô7‡Ç­ ¡ç§¸¿aêâØž?hŒ%ÍÂè›1‘R’ÙXI´¨‘­‹ÉÌÜ~¸‚èÎ_>†–?aYÞ&c%nƒÇÄÚƒþî]ŽöðC‹W¥=œÔ/ªÅG€‘¦€%€ ž þüUÿêÿƒ×ÿ¨&•ÆP"þ¯ô"AUêÿêDQM ž"(+Õþêÿÿ‹Jî’ðóŸ-êñü+»ü Xü_[°ð¿6 þ‡¶,úïXú?°üŸ˜°à¿¶`ái À¢d! |hoΛ‹ ¬L,±D¬$‘™M…ñ›ñ* Ùkm`e‚ í°îŠX#ô‰O·°a4$#ÙÅÚÆ–L"c”˜  †Ø~û±õ0J¶¶ðCÿª Q}ö§0™¼/‰÷èîk+‡Qò¥#ÐMÈFv$[{¨ìCÅÝ×p ¢ÈlKAúMå ŠîÙæàØ´P‡ Ûøô¹˜a/#,Ä¡±Ã òÑ C¿ èfôlÐ ¤ù‡«ƒn\à ŽVP³7…ÈAúŽ$à&²ý`ÁŽä×σ F ¹ž‘ ÊÁ@F0´C;Èí!Kc¬l=­€ƒõ£‡Ñ†ÔGA`RG=•A£0±¡Áó@¸4ÞŽ«þ=dÏr†ŽŽìÈAwN!Ç]8¡TdK2Z²C½Ø .X%“ŽáÑ—¢«¯eÈPåDŽÕj‚q ;Ì›Æë*JgØTôÎÀZÀpŽâJ(ß™˜` ,É6¹oë Zd©€Xps8 ‹ Ûú‘*¯* (ÀÒèᥟä¥x‡úÂŒHð ‹¼É órø‘£ï¼ªÐ?ÕGaþqÇô+¤è)YÎÏ(9‚µv°TD×"‡Ò0¼™î$¥õ)e%¿4*€¨Æ‰Ü7‡03ïXÿà øÃ¦ „Á€/È3À Ó¯Q¢§ç!À ÀFp×;Èë «1iT˜´XþvNÀˆ0 ­¨<è^RØð`Ù·)“wÑ3Ü© a9^ C·1ÈùgDû.@ì@ͪŒF p³'Z¤#ªâƒ´Zlo? /+rÏ;4ÜËAÕj~× K@8Þþ å ‡Õ/§ òÌÛZ ¢ å‘;\Ep«:Ðó°‘+/à~¼®@µF;{;kt “üDïï€;ñ Âkš/ 0VFa„Â-’Jö¶p¯(‚ˆ²ƒ‘‘ ™ŒAÆ7§_$ŘTÍžŸÁÄÐÀ˜lo‡ÐuH!¨iQp'$ìM& u¬ •Ë‚Óïp~ !‚z‚la²%& î ck2·‹/z/*¨ã_ú„†Ô8œWHû OOŸ‹èç‡ìzúÛ„8ƒà+ &týhÿ'/ âþWñ9PÉp¨ýÔ-eÇ_ÙŒ¬$V++9ü7Xø$'Ùï¿Brpø7³˜è•:”û6|À <*ËbÂe$R '€ã½ÑUy9„ãIËa{æ0T@1„îxÑG¼—ö\ZÐñÅ_þã·d¨ïi€Ÿ§ÏÕ„ B½¨·s€· ˜,}Ùy[Ÿ~áiâuV CêÓ­Q× ‡' @)äBvnnˆ@ì‡Â³U úŽ˜å|« •c€ñÌðn^At{^wöùŠ÷Ù ò6$B?H„~ƒ:Ów£ö`’/Æð>$N0F m¡ ØÃ«§‡|é?ùÛ7~àhá¹å¥£îZ.̽ŒÇýPÜmÄ 6Øÿi àà˜þï°š l,zï(ìaÛ[40A™ëHá…A@.ÖBf”¾Þ¥óö­ñoN‡#…‹N°x´ mH„€tfhß¾< rÏ7ÊáWBÆÒÀÑÏŸL‡ÇÙˆ¬«‚ޘƅ·9^¦!SÙ ¦…„C Š)¼©)×órœßÄ÷ݨð Râ“ÞÕ·)ëÝË7<²}«È²4rßÿ#ËÛŠêÞ4_›?¾a!^‡@prH»àj&rM: /¼Äˆ'È(paÁAЃpʇ›±APf(£ëzãCãïFEe;пà‰~ä'¸ô‰Òd8ó4ü‡Îhû³rô>s8¾¡p©ux?4økûciž ^5¬¯ÙØÀÞ`p):ê¤æIx…É G'Ød6üç~kG’%/,Ä0»RÑ% LÐèW7¨öG¦RWÂÿÌ ŽÎу6Äö þ¡^ñD,(¡ÞXs6+ŠˆÕ ðG™èÞHÈ=Þ4@GØ—v3s  F‚¢¿ÂU@ ðA·ûšÒ|«’˜>¡\À:¾ðu}®[J¤-…Ñ_‡WC0%2záA ÿìÿ ˆÿ–ùÿÛóÿʵ!û?U@†¿öÿ_ûÿ¯ýÿ×þÿÏì+ç~ó_kêï°ÿ¹ñÏ—zlû[9ÿG¦?¿¾ÿ®…=PÁã× €o`]‡á?¶š­œ‡3šÔ@ûHþ›Õ‹Òò?4zQ ÿ#›·¯/ÿƒ±¯»Pßï°ŸúlF,Ï(„A†Ð÷>çøÃ›¡!(ôƒQøó CØò¯öýÿ¦ö­üßÖ¾Á‰µæ£N %˜ , ¢1èÈMà]ŒÿŸ8ÿìQòCñ±ÿ—¨¬¢¬†œÿêD¢Üÿ«®òWÿÿŸüÃÉc‡v:˜BÍúBò"ÜñvE)Q¨pÃ+üáÝ€Hœ<¸3@1FïT¢û¢SCÑʤCYƺ,w ÆT²-ˆBe³äýD¡Èý£F^¶¶–&^Ö$x‹¥rG›w_z÷¹/‚0œaE\TÄzÓýe( >y»ÔÀ†Ód„¦1ÉÀ‰L³}˜¢Ú€¾Þu‘A÷¦†²  è¬Í¼,I†Fv–Zíƒ U@tx ¥²8H01þö :_£¨áuÑÈA˜þJŒøG—l€îJ¶7°'‘Rr8'2È›¨J÷ÙÅÊÐÆÒËœï‡Cç©„jüÀ `(4þ¦&0† ÃÞhþÈd#[€¯½‰JW$°#r~žÝ ¨ÇÛX‡\çó<Ð^@Xðhcéˆ@‚ÅѸTh8'o G8‹·ß‡ÂÄÞÈ‹dmb?y³'¢Š²ÐàÊõüh\¨Ž@k`³ÌLÀ\E¶‡¼ÏÊËÀÎLùgáú'܍ɿƒ&ðAC°0ÉÐ,¼ Ìk‰àlšð\ÿ WŸ6þO*ÿ «‚(Ðjÿ®ŠÚo0Uÿ§Õ€dÞæYT©íßeÕw2 Ö Â;¼#¡%îÅ ˜lbçhèbkcgïeá’‡Ë!ÖyJ&ïäŒ OÌÿ#ð†¦d’«ÉRxaaÑ¥S„«Õ¶Ù ÉÿðËÒC`}SñLP,*²y! †‚´³5@€Â[žÿ*ìÐX/¸pOù3ø°ç¼Œl¬l þqMÿ¨Š?ÍWÙþ*€û\—zÓ¹Lj KÄ“ò?À2$Ù[YÙÊ›/}¥O0?±r×þ·è ÚVݯû#¾¥¾ýËðû‡~²“þOª“¨ˆëŸÒ'!o´Øä÷m0‚É(@*`ºƒýO`{F°ü=Ê,& ÁñS6ÖÖ&FöÕž ±/I_H]o ÐÔháBîæR"~€æìL üž3}¾TæïÓØÒÔÈúOøœÆf3Y¿ƒfbggmóÐb\ÆÏÉP²ÿ=Õu(¿C õ”(Øp;Y»@³ñ²¶±FoÇû5Ž^ý9ßf`ØR||Øp.úX;cc;äÎÏ?ÃŒÎßÃãðW`!‚ÃÁA—¤à‘[Å—ö+¨^öævs²©ÉoIj¢1Ã~‰¬‰µãŸ€:˜w$Dû—РNfèQýs Èêùï"k¿ô@þ)@¾^óK€|-çOÒ9~t  òû mà1™_Âí?_ò[ t_/ž&L@€ ¿K‚JŽ10-l~KW –d¦Ö]–?¼ ÞスЉôÓŠ ÖlAUÿ¾.+øwuØÛØþkøІßâÈ^`“B½‚ó;ñK²¶‡ 6ù&:‹ú«Idcô“äwÚêµø´‡°ÿ@{è—â?©Ç”æ’M}pýûwUzñJýaÕiöC}¿ªì_Tó‡ü+ÐdPÔŒd ÅüïÀÈú{aÃ[‰é[‰UdðÒä~€ß·üð{!®Ã ѹ¿B–$+’=¡0ØÃè––?´üÙTÿci˜*ƒ‚¿dЋ5†µ,m¬ÍàÏo›„¸Ê”üÙ8+K =ýt@½m¿ƒfbecçòЬÈf@s#“̬ ,‘àÅ?‚ã÷= d«÷ï:HWcÃ?ѵ4(­Éý ¡M²þ'p¹Ôà?lodû‡qtß? 'ä_óýÙz…ퟮW°iÔ_(—v&FŽY´þ%S;«ß‚âЀ±üS0dä.îß‚àBñÌ æþ =”Ê6¶ö(3%ÿ‰ÁÓ_ù˜=:ÐSKù­™†´áY@ð¢pYAtªwØÕ e8€^ö6V$£á—9~Ê€VN$ÿÀ0\ÌcÁ[χG¶¶—£¥=ÉògâžÍwnCbCC(®jèáwðàÅùØ»öx¨¶öŸD§)—N*J•RsŸ¡Pƒ!¹Ï *9c†Á„™*EÒEÕézº!]H!Ýï‡Ê©Ó)‰·N¿¨ˆR”êx÷Z{†qß½¿Ïçýç÷«ÏŒ={­õ]k=ÏÚëYÏÚÏó¬i„ˆ/ì^B\ ž1Ï@*_p—Ü Ãpégùƒqåc…âôË9t-€a’!s¤TÚÿP@fI°;… YˆbD–¡ñ‘òð΃E\@xkz.cÇâ²{ÙÐë‡Èí¾±\=œ°FõÝ&{/Lí÷×7',³Bý]dýžãäæÈÅÆI 6NJ°°Òíx)é—™nX¹)é—n˜,Œ@ä@ŒPZõ(6•zBñ²ãñ1mw)°À” ðzÃód¿‹ú&äÞðTgaåú»kq`ìB"BD)<úãòÜ9,Çþ¥g>ZcomÛ&ÞX©²XjJý²w>W¡'ÍÁ† íí° z°8,W¬¨2Q8@,—í¶ãaÆÅ&×.vÙpål¨<fLÍ&|É‚ËÆ ŸsQ£ÄR,˜^NX^Xaé7Ö>GIĈ`ïÍËÍ ìð¢Ñ\ý¨¢Šc¯°áIé G vDl€XðÀ9ß}¨T>'»¥*ZFA4OqDíâR­Ó©»Þ‰Úƒ hUh±O„G–lrðâZÝ‚X ®¼ÆÍGwlÄÈpW©Å…Çw·kïÔ«”†²½naàE0Ö´›Q,U°ÝØlû~75:ð{ØÔÀ‚ßÇ6¢˜²Ýx–x*âOˆ^¨UN8°\Š”’ʼ+t{é±Ñw<|ð’ç?BW)ñ"¢á‚€$3Á«’ÛµšpSx0DY‹ˆØŽ ,D–v¡Ð;‘ÉÀ¶àx5¤¡p È |p²e\4à{`ÞžoëåÈaƒ7=TŒ{Û},Tq{êáíCg ðJ]i3‹]¹ö€DÜ@£±¶ÇâôÒÈà<Ö•‚=át6jSbü@×”çÂ$LŸ b žD¢ŒD¨& G7+ávM2†íÝ]ùÝ5ó쯔fùÀ*12O‡Uî©¶Q¹ëÓnEÇdÕ'T¿¶W]ZGÁIém¸\°œA½úÆç;qùÞîÝö$ºRнÉÔ~ hØ¡h JÇIÿ‚Òœ ôþÚ¥ ö¦3~¤éŒo:£¦·›(|,`•ØZÎaó¼1?c]a~Ю±O æ1Þ+ö±Ý+íG©Û3RWª ”žXR¸G ­­‘Y6 Ä©7õGÉà5ç†Ã”©Áy\'G€ŽÙÞ¥:Ø W[âíó+ï{„ø1Þ÷ ÷}B`ã}Ÿ?ÄûÞ‘zx¢º¯ÕYn\'¼êº´ÓÑ”õ-²–CduoXÀ§ X …Åâ•~ŒÐ¶“^ –=JeOµ¨Ûù8ñæ´k·]ª Ëà²@"•„ÀJ¾Ó€š}§–“pø¦lô¡ú<Úbʼn­*6¾ÝW™ªK‘Žªè)mQri8´Ç‡½S®n:t¯!šïÂf¹ñÁa"®lV'H º žß¨¬±Qõ&ZˆFñPDŸ”˜¯ðY®· ²•+ƒUš†‰CExW)RV&€äæz°8vàx˜ŽÕ S<ÈñR{÷¤˜ˆWÉÅWqˆàó‘4¥uc×.‘‘44$J  ¤éœ@Dõ’ ,Æ‘ì>æ‘S,§yÊÎ@>¢‹!|÷âØ±;À;ÝìdKà CžGdS¨´Á®ñ®‚PÇ<<™dN7ÇwªÄžÅA˜ ý4`¡Ëwrs·5*Ò[xœv{ÜÚÇ¢ø¯Ã> N( ’‰ä0ä0$Sj7¨/‹ ¼Ëƒ‹dÕ—¾|w.›êëôœ‚í&|´!0B9‚L&B«è„å‚L?lˆØõq…GÈcùý¡óñ•ÐR ðb™ÐÙDf†P<0c¡Žþ Ãðl@±îôò娗§]áßwÒÛÚ ui¥¿jÜ¡) ¹wÂÚaQv©B[}jºaTô4ƒj E‘ÿÓþÐæ/Jnôßðÿ£ÑÈ †âü_&“LçPɤÿÿù_ùgâaï€pŸ†3)ªKIÇÑñ$¼T¸geEtA b w8Dqð‘':„ ä"{8øÆÆø…‹Ḙ}‡}žIž2ô®´puÿžaüÊ~ë6Ó0ý-QUo&ÌòËþeX½‡)%\œkâ³}[ë¸æiËŠÆmKÿg›æã5 õ‡g6}«¶l]må²åè?ªëÎ}n6·]v¾ñþŠ÷bÖGã7+ÎLl%' ]h=gÉÐ&mÖÖ”ôÝB£C/Ï­²ùÅ“”¡5$ù_vgŸò)hئ£ýý_éÇ_\q{›»÷[NãßÉ 9û6j¶TÏœU z¤ç5µq÷˜‚²Os­ÇS>X—\ú‰°þÔæê™bÂË¢#ÉYá÷«rõÝU»{…ùæúá™êyµå÷ŒöœB3î±™á:¡“mIþ½R)³@Ê|»é}vC¦s«[MóñôízïÔ†&Ã3l…Žsöµ¥žËõêȈÚKŸ¡Ý꥕N LËš[yøó–7‹þž=î÷Ç66Ë©¼AY·­…Ú¼² “à4ê¤6Ö¬W'ªy¦äZœŸöóþTm«îrmV¡ÏΖ+Â#Õ ®ï¸2Í-m¿Zó±÷&…G}ßd´v¦y‚ú÷p#iÊ!õÝ:£‰Ò7›Œsˆƒjæ~ÝÕæ?ù‚ç¼­e•Æ>&¶loÔÿ¬ïÿùÁ¢¦7’ïŒùÕU.–¤åN‘dÙ ÝTâÀÉWé£"\Öý¥¡i9hMíÅ͵!ÓÇxŽßÀ™óð¥°8ÛÏëPÑ¥Û‘qÛ¯M<¶µäxóézSÇktígCÏM÷ðlÎJ-vŒKòñ­_´šUeý-×´ÅoÕÙûÎúÍßs£ \"Ûô•[æZÄåâÕÛGiY®5ÌÕZä±k†Ù.Îúä|ìøŽ[ï(鳇½;ÍsKÉÂ{Ûµ¾<|Ý#ÃýŸ$çÓ]c3 Y­ÏþTWs4L­xvííÖ³M,Æñ®L]x0ldñŬ*8ûÐÈ»/Ã}Ž­ø[ëÓ íÆ›—ÆU—Ui^o¼as*øýŒ¡˜ë»=uƒyíñµ÷“VÄX•PÖ$V­(ð3iö`ës+Š>ÞÇ…åÝÐIÌ1ûÙå<ùb•Z`ùQѣæü¤µ–T©kø¡ÆVí¦šI³vÒóÔLÁ±·ôÊiFÅYÓÔ¦k ã•î‰#»lÑ}šó!•œî »l†ËÝ¿ÿ5ã–à¶Ù›`ûƒ)ÚÉvÄ2Ï£užƒ‹²™ÒNTH7›:ø}K¬{Æä;ºç]ÈÔÊÓ˜CMF#Lq)®Åþ{ºñ>Ü‹c¬÷µå«NOñ-Ûëpúö©Ûšk6îá"남¬ yÃÏžwéã¨clÍüølYnîâäLBîƒ7“VZa^^$Ó 5ü9ëOlËüÚ´ð}êÒ’–«×ÒLš ‚§øã†Ä'‡<œ:’P§ž3~OHÚ›Ü=#¦‹ÛšIJ©`ý­ä k÷‚²¢e ‹’ÌO1 ˆu—lìÈ]Oyp;÷îÅ—e¡µO_Ï,ˆáÌÌ6¨lò¦Ö•šEûkë¯|¥®>&žõÞñµß•±ÔjÌ‘×_~ªöë©ëÖÜ´ùêL(´-}lÙðÊ«F¡¾´’ÕK¦ÿ0ÐïÔˆ0ÓÇ€M‡¥3`*ŠA“T®zâÈþ¢ü¿Pê£<²½@îAÑŠ2O)ÿ,z`£'‡3Ç[ÁŽ4\ éÊKŒìaR»±§;sº³F1ÄQ2´ãŽê€e > …’a°È(b¯û8%ã ‹”ÎŒéÌ ÈRç¿Ê!>(“”W`h¨>Jà£l¥#Mõ‘Ãô@£,ÿßM t†êŒ'£Lìí¹µì:3+&½Ž2ûöÓZ–“‘é0HŒ£ \,‰’ù©ÀS»Àw`ð'x Þë„l‹ÈN_“‚'PHè Æ°¤ú+;‘%ƒ'Ó wÑ'ˆ˜#‚ñáOPHEqD”æ’pD®\î'ƒW1<¿Ž`06qÄy  IC‘æD1€("†ÈáD QJŒ†a"I˜(HŽ^Á‡ÄH"°í H䢜LED°w) FŠˆKˆ1Saç…QDÅ“]£ƒf¨J©ªQâ:sÒN©‚R¨4ªM»²)òêÁ u…¼¦Ò[îòÈ>ÜüQx/˜PQ‘uÑËs¨·QrŠðÄO“Õ&o<0öêø)Æ«™j.­nl¼nç1[c‡<ß&¾bÜÁãáÑÑgŸºµ\-«/y÷ûþ²w%eßkÊö7µµ¯Ù×0³ZàO ö¦ÐüÎp½Ç k«q™¥UxLâÂkøÑex¾¨ÐsUMzͳu¶/K^%5ÒuKØ«øi/ù.šÜ#Ü~ã›Ý½Sì}ËìYnhõfõÂ÷|纬‚G·Gµ‘Ë6½w§xClâ?¦zɇ¿ü,80aªã¶ÌíEuÛæR>·e4ü^·î‰I '™Hn[_Û¦ã¯?jÿ”Ò]wF&°×&=Þi=|÷Ÿ€y”«êoqrž=6 ÖÀùæYÿ§§™ w¾1Jx;6Çç´OmvΞyÍÖ7 cv3þf4Ù½úuOue`½è»µpìÞ{eµÝÏz>†7cmÞØ{C¾½ÌÞjJ›ñüŸ—js3 K_dH¼uÀüíîô»jËÝ9飦5«ñý…¦½O ¦x6\*¼š€«{gÝjë›|T¨3s!BÏÅ?z^cmº‰žÐÕ~Ÿcè´DufáÕq34Îâð³s_ŽIÑ=è1öa¦öDý˜òüU3¼Šf›6–îZ>Ã0.~áÿÕF©ê“/¸‰üƒ•zÏÃlîû˃ȟߔ_¾wreù’/ÓÚZó«I ÕÕ–Í ¾Ïíס¥ç§Ö|R¿:$eöNíÏSÎ?ÝpvÖ¸ ì}ç+ÿz¤ó9¯)`Rù=ÿ}‘GÂ/ö„Qž ç‡=ÿЩU}AÜuã„”ï9Ç3Ö^Šûë7£¤<­³“¯•Sô6T96¸Ö)4Y¾ï«„RÞ¬³«È '1:WxÉ”ü¹wØ+LŽÞ[œ=€#ØXz]GǤatƒÆÂ¥G×Y­?W?ÂþméôšµõòyV¿J[ Öµìu6=™ì&4;ÿ²ZqZ‰wÐ1ÓÌÓ­jÒÐak7|ã$ñ<…BÙÆ˜¿nfò‡úw¥ .änö¹¡½Ôê$îZbþቩ&W¥•冴-X¹8~£õ//SZŸ—=¹[~Ò;oû¡Œª ?y—ÝÍJÕ¾bºÁüR§5ÔhsŠÛóºY{tµ³*ÒF6 Ó¼`~v“÷áíÄôÑšåvθ‘A~úV¡½Ø .7}ößæ NǶ]ÿ<1ÁîòÅõÄZ󷬯[cä2²åvéÁÄŠOvµ|fë¾ÊÂù£¿(zœ°¡&*&l¹ãjëšK.þ9ásHÑÃ_KBÎÆTФ7²¹æcŠã³D§s?]¼÷¥âÃ÷™ÉμkÔÅ¡•$:ïõ¬EÖwÛÑûz§ú«A`ÉOMz›ç3-u|–ÈfÑŠù&ù†·Î%Ô??Âg×o—µžù¹Oþ²’½øVüñ˜s©ìtÐ&¿ÄJæý´ûú€Ì±S—ÁQ—>cdœ÷ý8"~ø¿Ù{x¨Þö<¢EQIaȾïû’}ß·l1 ³0‹])$ZˆJ¢,m$[ÈETJ‰(ûR¤²"¢åΙ!J‹çùü¾¿ÿ÷ÿÿx=ϧ™sîë^®ûº¯íœ¹ÞלqgG¼ì3D:gÚiÌ}r¶ü°ºè[aǃFÃãvˆg3ÀÒsÕr›œþ`¶5É}ê]Ë:¡h;Üþ\måÌÀ´‚‡ûò‘Búg×·d¤#£ZÙ^ŠÁ*•>ï=ºûÂX#³=ÛõÖ—•‹¼{ÓqpÕ°M}¿‰Ódjª¸Â]Mc©ÄÂМêLª.ç©çÖ'ŸŸ–fh¦ĽÀÈ©À~àñŽä’4yVE7wŒ%¹ÙE–¡»Ÿ®sÊx×™ÀŒCc‘¹[ößlHýà0ÉÙ›(ªyâÿä;e…¯ƒßFô·®V¦õ¹ðØþÕxK¢ì§ šÄûÝë^U`lëO\ˆt?•’ÊÓ Û©.®a1åÚwÿ&£‘|´ïxK<ãgß“hÞ·49ÃÒþ5)R7…tåÛ…Ó¾kú¾Q¯km'ž ѬÝl7ªØ y1³g[_ñ+íSné6S7A»®XwB—÷ŽR?‹á~ó™¶ìw=„ây‡à»®åu7nµñÏT™vSRa½Ÿ½úÚ[îŠSv;v#ÿ%¦+’¸Ö#›¸PÙV¾MJ[åC*§¯\6ÉλÃ:c§È};ç­ETdëåvÝǬ.†·å5T;›ÛŠªCÎj†š½éÌãŽ}­Õ»›@ØxºÌx?{_b¹VVMá&½ÃG+S§ î²FzyÔ…é¨Î¶Ÿ(Ǩ¸%]/ÆÝ}a2!ô9eõ2+Mä üôU) xìÄÇ6]4^ÔÛ÷94€ÒŸ;œ=bÜ\æKb{¸#«ì`¯K(vøxÍú²Ïòw 0±?ܨM¨P’@fEíÝk‚pã:ôeÇ£sšŸò:ââé¯.ÚBÞªèpŠÃä¾däd|U©ï¾ªœÌ_'ûªâ¿òUed~ë«ÊH.òUÕD5D5EµDuEõD EDEMDME0@ÔRÔJÔðw€à Câ½§Ö‹FÃEÝçÖ]ÔÀn.ptQ<òvÉŠ‘¿q|}€þ°n$ÿ×îŠ|_â¿w‰×ûcjGö?ñz%奥y½D›õ–­å*HÝm Á ‹êŽˆ+žÃ-Ï&2Ì×Öf…ÑDpìff€í¦Œß Ûø€n=|#•.Œ‚*ƒSƒj-ŠuH©Õø£|×ô,*5¯²²dÚ½<л’Õ³7¿'hØ-'žZ9ýmï·/½/L÷Šší¤óܧwyÏ­¡]ðe‡COÕ4G‡Ûàû(oÌxÚ¦m³´O’Y_Ææ>Ö–/l<È/U8î|ÏÝÖZí8·´ì̱ÕÁ»¶‰:–Ü~ÿ~·óýÞ­Ÿ¿rÉY %^Ô ßv"!Ä÷ …ÐcÚD7žáÓ%ú/U¿¸þ¬Z1Ü?:+0éÛ4…–™¬>¢)¹P½d _3¡ò(¶7©Tß¡BQž“˜çÖûuõö$ökÁ®ãñì=jÑ´ÌO-À†GšgF¶pz±§*쾬’qÚôD —<£~¥:½'ㆹ`&º¥³%ªE±ÅoÈqH0EGh®ì½qRV:ü¬Þ'óÂLÚ­Q§+¥¦Õ•õ3ËݾÅú–m:Ö¡°•·.¯¾BK‰{”½;ð-úxZÞÈ4J¥‰½ÃÝÊáIMý½^=“­¼ZŸø¼·vºðþõ¾ð}û“ï>²“ò¿¦à6™¬{H¦hœkNg‡‡Ë¹pz5£:žL§¯PiHQ:ýÙº`È·“×lx,ƒÝP9ÚÃ~Íj3¦Þâ[üÔƒj‘å–æVG¦Xã.O^da…Ÿ¿ð”Ý—ÿIìæŽ=·“Sò•&ÎÞG³ê—·‹­Û|1U3´Â½„O‘Óvlóû†KÝåæJU»ŠTn]³¼ÈÝŒÜI¸ª×Mi²ªE]í¡QYYÓÔBQ]ðüÚjuýá„g:O•·=݇:u514/±ùˆzc2_ÄCg¸‡(m5ÞwÌ?o×êé-A´ëO‹XqÈpÐ|Žâ3ÛÞ«G;nêø¯(JGŽñÝ9 þÞ‡÷Ïi19džÛVpápóLËK¶ˆ­ÝÏ|ئ˜ÐaÖ¾nG¸‚ÝÐ#ÚÆF>Ÿ>ì@QöÕì4eÚÈy”¾ër:3ù?]à=ý~çäÚbnÚÙ¨U‘Mž²å-]íÏ}íÔ|nqÞýÛ…T<zÀx]£‹;6@ûZ¤e‚™Hx'|FümédÅ,ÛgzXS±SãÑ‚èØw%ù¡vù¤Dí3óBFSžV?ÅŸ·/µß´¾Î‡koDbßžG˜ú>éFT`ØuZbÕ)£g·œ>ðAúÀkQÜãbî&DxòWºÝ”³„££‡VùÞžÝ`wxoçäN<'W`°d„ÿeŽ«¢â\az´9&B‚ÇÆ#Z Wo¼–S"cÛ1Êʆjð×îÛ_µÏ6øãåz…µ1—%‚ކ¾{ù9òÚžðç¾£yiÃ!'~=ÇÉt÷E`Ý&Áˆ™Š”ýÅ•u›Wó0J­·i]}ñ^ìÜè±ðé†KXEž71^=mªeO½¿rÿÒÝ j)¸¡q¦„S©Üa Ÿá”1ŒU1£•ÎA=þœ#–ŒXþµ¸lʇ5+„öÝ‹¢±½*$óê®°6ÛÆ¦ †Ùmr\˜;!}š&ø­6A~Ä- ·²s»Îû”}6)”kcÎWÜ›vݵ.»µCîɺ Mg£Řd«½WfÜ¿©3;<\¤uìàÇ‘Óæ¼T«Þ%\y:ëšaþ ;–ë”™¡‡ÖMÉtÑóUjg¾¾ùÝš,‡‘˜}Æï7yöL;L U¥} $D^­P§­‡#§Nœ=zH)açAÿï÷‡Ê}Œ xÁŠô§{´J/IÞ·ÓÅX¹~›Û‹SÆû4¢Ú6=η¶qj·±n^]}Ûáæì“éÚ]‡";ƒ®§4R;tOptd‰tt¶‘b’:Æd²éËÈ Òd-áÀ1—uoÜ ý{Þ»£m›®ß z­ûrÔ^£2v õ„vd©î¹Má×¥rÂÕ ƒò£²MÆEŸ™×Ò–>ÿ´IáLQGh¶0ìÔÓCx¿aÚ->}¸YëK9™ 4}r×Ô| SòÉS§_?p•­<¸›iô€áþ|]Vkm‰mjØ,á¢7O(NFIÉÅ>×b7ÃŽ½Ûþ ýþÕM2ßn6¿”àuÝ™ýŒI޲±×— zùºžëfŠ.+W¥Ì×ÅÇtÜ|Ãߣç×-Ìíp/nß4ªE¶?÷4>‘ZñÍ ¦¨·AÂëêÊí ë.PI­z¥pƈqd_ˆ@Ê¿á/^×ßnÃ;#È7Ò´Jg“s2Ô;q¬f0^ée+þÓ®rmá“5/fLÜ1­öaU°|ž+[Ýk{êìÇ|,ÿ¹©Çªs{ ü-Ï.À Òô®þÎÛØ+¯).ö 6R³ØR8<û9¸‰r |ï]|S—<…¿íâ勯ê_É S@Ÿ³:<ôöþŽû›1G{N6ò³³ ½Szn˜éÁxRÚ2)}{[yÎ}jŠ^Gœû{&Ìåÿ!„þq>‹kú«ß5•îØ¦ƒöP¥—Òôç{²[v½y …ê‹ÐmI×6^:4&fѤà0ã=G7²é©5µ=þhíÀ—ÈaØa¾ü£ëÚ©Êg ^¾¯_¼?¡YV@‡°þ¥vý4÷¼„kZ™˜‚Â`yaõ"s‘zzuÖÜêùURÓOB[ïå<îp)̿ܲ N)×rÖ×Ö.ðª¦Yp¼ë.G€Êùé+—<Ÿ¿Þ¤z“klNº%ü\«XgÌißýŽ}Î2R'eÞ¼[-s2w_cîI¼næªxÆòÕnÛ`¬‚e¸/Oѽ¤eûʸ¹IF°sjÓ*Á ú”Ï1:}a#þhìJL+Úçm,,+âœ]W‹nvfÊðWFíDÜÔ>³g¼_Ì9¯oÀpî†Âš>4á³§»=Òk4äúh٦į!·zƒü KÃÙŠå¼s7ÕrÌé§>ú2öÂ9P/];§ÎÂÇqø¤“vá‰ý­¯ rUcîîÊ¡–9÷˜Ý·kÄn:%ìZƒéñðÛ·ÒŒöoÊW?»õîñ*{eçâ6‰Ú µîÐm{€›½õüô¦ÊÏâÇœò³åÔ°Qh-×¹*7†œ^‹‹=æk”|ºtÓJ‚åGBîs±6ŽráC[í´ùˆtÛRÉðø¢*ò\OGæ3Ë7ë ¨.iâ6]-‘R–Kõ¡öU¥Fö ý…TŸМë?F‹¼Ô ©Ô½Íe«æöõ6kÿgÓïB')Jú'몜œ¬óæ6¦JÑH”}÷EÜ×Q³)&±²ÈçQÙýW£s5ךÊ'¿-’)¿å=ø¾…ËãÕzãÛá͆¼½öçå.&4Wën¼j-GeÊý…k"¡øÿÃJ3Ê–ð]¸·Mæxùq“«o©û%¾µ8—|ÛôÍò帉Ö[«æ¯\CÚn'°)$D0zŽãÍØiHa™l ,Ç2µv/Æ_†¨\~MclëzÔ[«}™7fºq?nËÜÉî…M(ŒgÇ—ñÎ3qç|ƒn‰ÝË ?/•¡r=Ú«èÑ7»CÛhÞŠH$ä»+ì³*¿ç¼n7‚È}»¸‘ mëÀokj´Vé®TºI…&ƒè >7u³;Þuœí¾ÆžÁÖì¢O©_¨w½—§È>,qd;׉§ˆöW”/S¤î…˜œì\%éå½L“¯¼ïÏ‘o ØÌصA{M$kLgþ븆1»ýÔG*V»•fD9uZÙ{Dó æ*;Ê¥M\‰TUÒÝÏ4í㑺9JiÆYì Å*GV¶Ri…k†ò">zv?²V]8«™î¥ÜIUzU»9mŽ2Ÿ‰å“åùØblcMëÏžÉ[t:‚f¬B÷mýt¶êbästãÉk=Ÿ8)çó?ñùcvó®öcïÎá׌C˜iÆYD»nÓ‹28j«QNÎýZÑ>Q¬™Z÷¶óÕ1/Êû4k.}Ô°Ñt¦ÞÔç1v<ÔÍ™Põi³ÊÚ7<虢ö â},ÛcUa·uôÁœo×¾(+2ðã2-ƒ©®6~ñBv|lÒþ'ÕçäFãiV;¿™ÞVù PñÕSïøGÞ­¯û‡gå8sÏÅ$øc×ã"#¿Fd³ÔX~; ](Õaw­8gs êAwÿ'±ÃÏ´²Ê‘ÝÆÙÖöûwع¢K¤Úržwȼ¬ÛÇ~ö¢õ¥€CWõºÏiŸyÿVÏ©èì”–wÀ@e}@¶rlוí7(õc(O”¤¸‡ŽŸÕsª8«sÑý%íŽ×B/qM—¢7+Š”{ñEµÖ{øË‹Î†ic¬ãqPÁÚÉÆ9ãºsŸ0o­žÝVßJÕT1È~S´ÓX>%•î`ï Zrfe€4þî3WEùÏfT°‰¨ÞA%ÅÏ]¡M}Oëwk;Ý:µtj’mv+%~¶Ìó5;<ÐN¯§)z•‡)>0¨ÝíroK–_UFBYeCEg˜äýç®ð×[®»~·ãúVd’¸©“A¦w„£tNŽòicWeÅ—‡tYRªNÖžÈú¶ZícföŒgP­g_…ÓØ˜¹ÊPI\’|f§´—[É ™³S Ñ{µäéSëƒò.žhÿŒ2šªôƒ·:;vïöGk¥©XÛdœÜúÚæTõ®ÝOÏ·â[z|‹²®Þªå1ÝhUdYîíM3T4*Ñš>ø³.õ‘-ñ)’áÞYËË[œ(è²³ž¹ ‹}²~shŒÆöÚ›yB(ßq×Úih¢Ê·.ÿþÎÇÌYâÇ`»Ý`7Žy¹:" ä„}-¸µ¥íj|/H;@ôÝíûª1 ÃŸÌ GV'ö~pÚ¶Aýöëm/å+>%ßN-ÿŠÚþr1ðòHVÉÞ1åœcü° uÙh7U„â§c\köõnä:Óî!µýØå³k.4ݿΖPÜa(­ÍîË®õ…·e¯áŸ(ò™?ùųç…ЏLNF&#'7Ÿ@Yœ?‘[’?‘[’?ÿå³> ùåò'KR&Z¢Ú¢:PÒDJ›˜,¤Là¢.K2%ÐØ¢î¢îHà~Q(câ =„ž‚‚I$!ŠÅÿý}ÊÄwIÒ„ôÀàý!}"ê/ ¸$‰òã».rÿIEZR~ñ£ÃÐ=¤$Šø`J¿©¥˜~ŒQfNÇs…–ç9ÄL9 ­ÝÚs÷;JpÅrq€}ؼÁFUlIå†Ý‹œSƒ†Gu;ý§_`Þ9NSÍ=·ÇVÞdƒPÎ Œ|û<—¼¹mÄ–9¼ú ûÉÚØú½[âbõð_nÅO¸˜Ö»›‰ŠQè'φ>L¤”¬þÜîXúÖ]ªÈÁ§Ô>OÔ>p9Ü÷Þð _¾¾î£ñ}¯tw×egÛÜþªº¿=ÿë±’ × _ƒïvÊŠ(òs<æþÂ#*"­Ξx/Ížœ<ª\X6]M`Ǫ¾+èj9síÛ̓ð¶{¬È·Š’þˆÑ†ž„BY§ž¯Ÿ™Õ®9Uo2®e1ÑݨK³Q_>þáþW“Ùå­­Ú•/ëICÉû­ûpï=:WŠ6}¡Íö‘ÔðL™Îû¤“jÿÁáBrI²óÖƒÔߊÅàð/5GPG옾 œÛ3º¯þËŽM¹:ÇïO¾¬¸K}„cŽJªÔèn8 s‡Nåžš34¹î:,[Ñþqçgk%Ùux/#Ö6ê'ñ©×ÐWyqröö¸ÈZžy¨áC·AaìÖ³ñ»Oçóí1 I‹Óx²þah]_C5â½®[²—݆BÇì¦7T\“w8²²NXb`;Æf¼;ø«°Ù£æ_Œq©#'õý˜(¯ñ Ešbrá]ÉÎgOï¾´º7{›•§H‚X¢ç{Õ÷BÅWe0—Ú.‹¬u ï¿øÁr¯‘¹¡Ý»Ÿ§õÅ*r²jC¢isöðü¡‘0TQLF@ÝnOuKUùÐCì_òtâ”q”àèå<9ÓÈw†¿ÝÙgH·täà¶ôP{ŽÞË—m‰W϶¹ÇYzbÄhsa·žZë¼oÜổxÅ˵r.ª5íIÎ¥É=²mwǨOï´aÌ2hÙM½5¨Œÿ~¼ëÃ5§Ãâνûxß1nÿÔGk²R2ON6vGw'È;ÐÛ9O®?4­¤Ž®ÊÍò‡k=ë²t蟺;U`ÿoÌ:2À1Ò?©ï»Ësp²Xz“£—Ѿ çõ*.&΋^`}yr:öQ–ØŒ¿Ìõ­}N™ÂZ³h® d]ù“ã*E4/Çú,^'T㻪ñ­g±Í|ö6žkUéìCÑz‰œ©y÷B'ãi³Ú¼š½ùê£Îšò[(_z¥w¾ãŒõK6¼…Ôvà–n9Ͳ攞ì¶ñÚ€àh ªÝéf[÷ªù=al¼z•/k•5]æõ$ÅWGÆDcŽÙŠOJ¤Ä)O „?5Õ¼}rMñ­¶Lñ0sgBõݱãõÍñÙÕÔ(=Ù)Ñòª/RûM*ïiWR~N(ӜӯyQHÔ"㺔@Y ‚&‰ÃK¸Ìθn¾©@·mœ/e߯ì)8ÿ[õÁƒاÔG¢›Jpo¦,08ÿiÍÉ.*|„ƪ0]faRÔcB™™KFv›Hž¼ ÓêKÔÃf¯ó3J -Ö<”K{îþVì©Í(ã–)–#"[ƒÒovX?5w¦dºY™Äävéõ.ÿÚ·ÏÜ«ÄW'_߆{ñä¼Õ—5´•Ô/´? ŠP5;OûîBlŸà&äK󵪈 ÜÅÌqòcÔØ6rT.×êŠëÜî8º©NZñÎÜÕ;X¼¼‡ŽÚ%<Ô¼§˜É™'¹s8è‰ôÖl\›"´š|Ë>ÅsÅâÛ°bCCÎN£uV¹:ùY·Ÿ Keûš Ÿ7ÞÛ°*¥0Ÿ~B{¾[²Kþ%ÊrWÙh1¸Ê˜A|ÝL„æséÇ{Ì6M3(z‘¿Àú­IUápáX¨5Ó>B Çe[BðxÎ,gø„‹3_ý?m»·}‡IrZîÓRú»Gxôé™{²Ì&öj»t5æ%ͶŒ«;)”»ÏïYßdbŽ¡W߉TÝ®£÷bcöѵ.°‡ò|†Œ¯Ös0> Úë,"³*Ix³w ‚¶kgù:‡¦_ƒoæ\«®òå@¥¸‹±¼—Ìz壬èb£î· Öú)t}t¯hOP›­H¬hÿ©A»§W#ˆaÍ–öŽªåÞžûÔ…D…B7$jެõæø`ˆEØó–”ÝêhJ"ÌÝÇï×_ëwõ¬ÛSúÔwTÇ%®Léj¾µåsÛo…JF¶k¬àcœ-­5³6BIÇxKß>Ñ"@Ér%Ê–Q®È¼dO3¼èãƒWö_ eç´‘‘îÚjSý':/'…³§Ÿ÷—8Ë^bGpEeYSÇP$™ºíxiÆÞ¼o'‡¡åNŸW¬Gr·îYÕŽ°ªh âÌU®|(\kW«^ßôR«6èéÿx ÙCqg¥Í±üÆ!ATšåí8ø¾Ëœ´qÉá·"6À†»Îok`£,ë˜Ùnè¥ÉÞ±J¶p× ­+¬«(`åÜ£æj%×ñÇ"lÆ3L¶ ÛŽ~np-æ€mÜ)|Ø@%ùņÝZÖÞuÑìïíQÝJáäÑÉ–ò®‚&÷à¡É‰÷–¬„YÞ~©Ñd{ކˆo)´xnõ;áÝÑê¸®ïØ§Pÿ—ö ]ÕêØgùQßFÄù^d›fá3ÊT‡h,D"Jr(<ÙÆß5lâÄàþj€‹G›‰*Üv] ]˜À÷ÉFÁç ÞëØ/5nOªÊÊ„…œ>pº¤†™wu|‘c‘‚H1š˜˜msø!#Òªë¡áÍ—\ç®^R¼p–îS¤›¦û„Ä®# EïãUøÒw”ºßT7L3òŠîÎ}XÉ›\݇·S:lÝÇÅ>xàÓs0cî±1Ï)ÃÀëÁ7w»Ôɾ¶S’|(aX´/¯ûÅ͆<þwÚ¢’Š¢N<¢üƒ¯®™¿îøòIQC"AMi{ˆêPÔM'©©XŸ›Æ7Â1>£žßèV»$±5yØ«qgÊ?kB½ÊzþFmÛb‘t*NA¡*°1#7±(AWþ‹Ò\ÑÄ¡°Ô”xž=~”2TEŸÛ³VzòÌ(Ï]/tÍÌѫ˰æíà¬ö•So[[ú¹*”ç°ˆƤ*\ŠN‹î#}vǵ/)ôµìÛB>»^ßÄÚÇ ¢#Ž«^€f«¯„Ãu·–ížN°µBZMo·Úi¶hQè—;eѽÌϪ»œ®šÇ9egòqÕDˆë6^©[‘«¤CÍ8Ï©=oê4öçáMß*qÆ"ûj»ï¡Ï׋šù˜N©ÇÞÛðºÚ©:¬H°;‹ofay'LùÙØÌ6ýÝÕðH—›1<6‚woa5y³n»öÑ!8GùÃ;Æß®ïDNÞÑrmò¾3áÂ@Õåš}õ‹Í™Œi¶d· ‰ÑèKl©ÏDЬ½õäbQ9†2ÚeµÝ¶Z†æk…ÃõDë*ä™Õ.ê…L ®DLΰ4œ·{ÒP÷@Ï$»žxãù³â¢–KMguŸ&Ùk¤ßºÈ2ý„]ãAžòÞ+”È×/Øêq1¯p鉔뎩oxë{•S¥'~„quFÄdtµ8ŒªB‘yÇ\l*³|³Ç©³»™ÊDGÚæ°!>ô呾ø1ë“uWk”?_%~¤‰J¤Mʵ~êÏà?Í8 6ѹöv(ãäú‰¯…oo•\'¿mîfî¹·Û¸>æ‚_Þò©Hž2Uý(™–DK†b¿P”²Ïë!î@Úêàœ|:ñº5Ô%×/ç½(:õ,¬UC{TO÷̓ ÍÜ¥~®é. Í ›ŸÄÞ84þŒª¹‚JŸ5à–È=X!ò¦\clXÏ›83´é}9¦H5ê7xºþ=ÆÃð³«c%.Zß9ü¼ÊùÉi÷Òu ˜ÜÏ{4:1Eoš:blÝʤÏm´øá¢Ì–»³r¶vMpú¨÷êl¡\åA3…ú»š#dJ/ÖÚ¨ì’ßjU3Êð'O¬½ÔëB±0š­· 3‚(GÌîEÏl§_k^²ÚisOœ¸Ccîe«^@0Ož·4yç(_V§|ÜB9ðfu‰ú½îãÉÊ]‡ö o.5¹C£þ-*çeúÔö£ÌªFbÞ‰»ËVOKÖÕ]Èå(ØÃÎyÔbäräÍ“ùoGìÊ:ë¹&/žÕóŒÕåbßÚ|׺9çÃN¸Òù°}¹X÷W g^Ui9“o$F°R5Ú?|4xoö@kØÎk?ÕðJQЦœÄíÔ„ÅYz½Ij×,¢+²¡]=anuÏM&õUàœ1Ô¬<¼®åÊ™ºÆšT)Á/ZËT£SJ66L7Ž¿›VaÀ7•~+0îÌ.®‡´L­·ÙÎ^ËXÇ&À-uÀ\¯ñèEãJ‡¹¹3ëŸ<õì¡ox£:8gýR lpUQép1ÖfRKêÕñ‹m‚ʽ•ç{’|yç}™aülöÕêƒôëâç ãâc¹w,ØÅ3µgÎ( o¸ì6“ZI›Ôí¹m®¡ìù½Üô'·ßÎPWɯ9þmüñƒ¶Â$"Ǩĉ׉ûG7ŒÒ£;«õóÊåûM9yÝi¨yrÈ<&˜Eû†Ø¾Ù5l_µëS$`2|Õ·Ánå8rW¬ÓìhÔMér®Q{kÓnnü¯û55/¹¶úá±±0º µ˹šV{ó¡ÒcÑÖiذ€‰ÌFª’Š#]½v±rJÜÊ~;,¥3z»_Ìž¿ÄÖÛxddÇ•j›ºÑÊ'¢Ûåõb;N*¨%¶_k>…SΘâam ´Õ·Òâ;®ó2pòõ«¸¥ÔI†¥o¶É¨ rçˆg_ÊÉJ/.Œ~‚OjÈø°±Õäã§·ñù-ÉvºÓ"Ñ* eÎGV÷ÒDÈŒÚÆÏžà{z¡rØVêÔNZwA˜wÎË­l¬:RûÔÈŒRÞÒyÖ ¯âM²T9 ,}—ý´`¬—|æº(û´÷þ½Ó]«7É©ÞÆ»”×Õ?Þu’Ë7¦±Äz´}ÎBgNx÷>e–|d}1Yf¬C8Ã}Ἷ•¦â×ÁwcÖúöeÞ‘£Ÿ“ÈlmÙ¶÷É[:ª›JVoÑ}"+[‹ëéÎôôCØžøD¹¸àážðË· +^ܺ'î³úèáCO;'†¨>¾ñ²óÄÒÉú9|¼}Ä»&#‚½Ã¾Cr’ïã.´N7$}ûL›Ý}PN\0áþë+G¦ÝžlÄ9¶\Z»Q·ÛåNhK"Š9&•j͹ê§_Îy¤Û¦8efxÀ·FíZcî)½{ƒÔÎSf®È÷fúseq‡Ùå×YŸÈÞ„î•h/ã§-{¾s÷e7[_öi¶c²ûg8Þ?Jê0èccÞ¶125–ec¦ÞÏì¬x¥+åÝ…i¿îoS©»í‡|ÙéL©æ^Ç*ÌVMœxÿêÔáñ†ž©¹ìæ¯{îOÍЉ˼¾4ºïë3Ñê;n{‹uˆë;r>ÙµåzâãhÜ!ªÍºïbvÝ&ŒŒó‡&>Á=éöÀ20S^hKº5,»6ÃýÑÑî-¯p¸Læ4wÅí9û{5í¯¶ecÏÏ}é±*ݼ[”aöZ¾‘A [£?Ùu¯÷@ÛݯoÅ–xnq ºÐ*©°Ý¸@mŸoz…˜2ïÞøUuhzÿ§l¼’x½YÐÂaŸiE¾æÉJ;XïìFÝ£<ÝT¡}¡ÉM¬üÖà“÷2Ϙ¹'4í‘ù&¿qNÖi\™åç·„ØIîùß=~O°î12œÏ®ŠKJÉ,dW•TÀ2<°Œ¤£Ìûþæm^ÒM™×FÚHÌÈGá‰Ô Â!,‚Œ-]ƒ¼]åÝxUU*800B8î#ì¥uñ0ÞU™SÃÜP›l €öAÓ€ Q¼B€2/D¢|/‹ò &oeÞ=F¦0° ¨7’“‘—‚¹ãàhž‘áºÄ¹¹+˜kj“;¾)óz> ¢¢þþþ"þ’ ¹¨¸¼¼¼¨˜„¨„„0ÐB˜è'ŒÁïâ%Ó!÷,að"МD\±hQäQq1Ñùæ@¥ž€ïp,‘ ÌK$"Ýd\ÅÅåÅŤ…]Ò2ÂââîâÂ`ña )W8BÂUFB!1?œÏ¢i.¸ ( ðø¤`JtÇ)óê˜Ât ‚0Ðø0€ò¼¢ÿð¬Æ/?+`CÉlPÚ(aÝîšpBEBL\FXL^XBÞR\RAJRALLPLø¯’è-i R èµÍ¿!]Ôr)g ˆ„Šëî¾Ü^BBDr¹•’èÜù§ù÷12ú=ÇÐhP¤Áv šXW»VOs%CýÓ{ìæº0a"7WQ áê“fìæª ‚#À}|PHW880(€7 H ¡ML E }@!Á!PpŒ‡2o€°ÂNDxU¬0Pk7Òn ämèD¿÷µÌ^‰’Ï6øqAs¨€e¶þ‘¿®£ïêP½Ê¼þ 2üYׯóçšo¹cÍO# 1ÀPúù4À“"&/!¨hIèðЉñÍ€Óõ‡äÓÀ·Üyá_ø1{áN#“§[øƒÉHKKJÃÜaäkâ²ò’0Ò ùš¸¬øCÕ%×€‹’R?]“–ýéxõçvÒ?ÓÊIËýxMBVúGZ@ú%åj'ùó5ñeæ,/'þã5II9™Ÿç"/ÿ3­ÄO×$eäZ‡ ôÓÚæ,/ñó¸À&þØNFrñ¸ ƒê#X€Ö@'¢æX,ýJ&ªÂQJJèiÂì•4åÕÔä¥Õ%%Õ4µ¥$$5¤ÔÕe4µÔ¯Rrjââ*náH•‚ã°Ò +CÃÍ­e¢ýÿ£úZÿ»êêih[h‰ ÝþéÒX¿®ÿ%&.) Õÿ’–‘—‘—^%&.|ú·þ×ÿÄß.I`€ÁF`ð ¬O ôŒÏ•&!&& †ÆB¦ Ç (˜qAà-ÒÌBmÀ*ëßWüSŸdèG°Â’% - Ím¾|¼‘ˆžˆ¥T#Ñ2Ï š˜`Ú Hð!°,°Ñ$!™GbÀë,ÍSJÀ#¾3vž]x„+XÁT›¤àìta"4äY áÞP½F°´? vóSÇÃ ç” ÖG¢ÀÉÌ_’¼k4ä]Áô ¸…­á„ƒu59æ†ð@:$pK&@GàŽ‚õ¯þ_¦þ£/ ‘üŸÒÿâ€ßêiq°Œ$ ÿ%Ä%%ÿÕÿÿ"œ4Àÿaÿ•~žïä?QÓáªöת"ÿu [F]CÄÿ±Ê^L¼2µ ‘þBuÃþ¨º!ê¿Sß°eÔ÷R†¯D…ƒ„ÿ©‡ˆ—Uå°?©rˆô¯Ô9$‡–º05s- '3+-s[˜$ŒSB ¦ODB‚ Ü·Ð…Ah)ßuÌAm$ Öžƒƒèž(„0p ±MÓØµƒh-lML-ô,hD0À¢Ôa»æ+¤+ŠxªÐˆ˜š‚7Èð¦üŒOÎ- êç烮 8¸ëÁqî¦B`ucðD"#âÁ+@ëÉÉy¡Ë°…zÈ®`}*¨ ¢ûâ>à(øÎ??RÑó…åò‘¦â Ç`ghOþuUwþÞ5(ˆäÉÀægã†Á»¢Å°xHp±Ð÷%Ë„:'ž_Ò &鎄«©e¡a®gj Vm·ÅT}Ñœiªå#É…ÿÝNE±Î¡ghæW Ȇ¢€˜4"zæ°ù;"àÀ0AÂe=¨¤‚³@êûÎÀØÊP˜ ÄàЀ‘Ð+¡šôÐûÏÂxØp“wA É…RUW¡ºè² '(’ÿ%)sx€ÙžRáxàôÃaPG ˆM¼+Üá6ßËpž–¬.g~ïh€ÎÁïà¾AË#‹ƒ·HšˆŒoð}ÍDHÕ@€@pÀð…Jò BR7Åß. rà7X˜[„Ƭþý½àhƒèå(h@p®;˜–45¤›IQ §Ý (a$Æë íмD‰‘Ô¤ÐpPDÜsEÃîÅ ˆ  –©$ P€ùÚ·hȷ܈ÐVükƒC€/¸HðÈõûa|’ü4XÜ÷ënk3¼.1Í ÄRë wÏ4Ъ}@aƒðX?Iö"sOBä×’´ Wè ø{"€q‹ÖŽ'ºº" úöQ¬—X!˜'Ö0¬d†Cª–†Ä%Y8Ï?w, …õÙBÚe@Ÿššœ3¤U-¬44´,, )’œßS7ÒÐx<ˆŒ*㥄ZÆ&šj–jËö Š »8ïìÏ}h›˜i™›ÿ²ä6ÎÜN‰Æ7©¤æþp<°n)Q Pý<„…–¹µ¶šžáJÆÀ’øØ&àè‚•ãæÓ%à5Ÿ¥'$nY‹Ž>ÖÕ•ˆ#ãø, ®m¨B×kèjißMi@|{pÎóæ옰 ®Hª… "yI •P„aAyðG‚¾°ž4€ ù:Ô—À1,Gê…40Y¦!¨sPÐQ?J„™Ý³Ô6±2Öü-[ÀëÀ…AËî†EÛIR•à @ÆKĸ-'–zF¦Ãð…bÿ í‡ž>Ó¾C<V Ò¶ÿd̵´­,´4ÿ†Q8„;ä-þš4ÿ+Y ®¦ 9o–Klñ‚¡v…PÉî2¬èHƒ‡/G! )M„+®XÐ>ÐÁ Bà°Â(Òn’©Åþªíü}w Â@=Ñ’‘= Ü•°¬ qL¬,iŒ±ß½ð¡7‰AndCŽÄ,Àƒ^/É%ø¹3 cãy©ø±C×y„Dh¾®Ë*;c#-##ËÚ`D€'°ÌeÛj¨kh.‘?%WÙù3 àÒA@Çd—n‰;6/>àÞÍÄÓ¥µH&xC‹t7è÷vAðÿ`ç=gšy$IÐBKð(¤¾Áon0Õd¯€p]9Žˆ×éÒÈz‹ýŽïÇ‘‚%+Iâ±€æ ù{8ì¼×‡L3ü»A‡ÔØpÞ“Vˆ (Íx~’³´¼»Ä4d“à LQ¿ˆ`ES°K’T“< à3àj,™¿ÒŒÿBZ‡ÐB¯ï¾þ®!Œì;‚=,Ü!EGZZ05C “å½(°)/L£ƒCxÀt‰nx0ö5Ò³„éaHFd·„8¬.¸ÿ.qüo~ï?Èÿá„Ç€Cxr®ÿ‡ŸÿÈHJJAù?)q1iYiÿEJBZâßüßÿÄŽô_1Øbz> ð‰‘¸@ŒóÆÂ p@É(¡Á/޸݀ F¯º¨T á”/èþ‹t!@ýg Úÿ8Y¸ˆv…¹B€ò?OÄÿE¦p1«W’(èþãœ"pºq@—àgÒ_è4*Cn’L‡sZtlö‹A‹Sõus¡JÀÃ}˜¿NÊ)Ò€_Ýa|§ÓÕÖÛ£¥iaǽŸF]ˆ˜À¢t=Ä1°ex/“  ØüˆÀ<4-È¡Nfš@ÔoÉòœy:K[‘ÁÒVàÔæûãP†‰ÃBB(Áï¿›'0À_`°7˜àÂÚæW°( ͛İ=ÈT'àèúâ» :œæO>°W!I A€ñø’ÂAàÛ´Éݳ\œï"MØ (JR Í l·0YAe’fˆ÷FúÀ|¡*Ì—”T…¦ íÔfF^Le~àœ~fñf?0b^ºþ[.ûù?Ä wBàˆÐ'ý‹søG昛¯œ; 4ó£– ÆTóQù葸7ˆUh¨¤uø •‚YJm×ÂDÍÉ\ËÔÐv'iÁäAؾ(žV$ß[ŽK0X(yzü?²yÀŒ„UH}ýó¾eІŠéþ3óüÞß??WÝoÒ€w õâͰgH8Ьãœ$%Ôõ,çûûá_h‰C¸«ö\¶©øM €ÞZ®¡ÄÒ†[‘8IJ-%—¶D‹&,?O)rKYàfÓDðAúޤÆ®‘O?©é¼ñº>A—+iò¾×I S ùé|77‹¶Lañˆ¤£ž¤KMÚåæ 6™Ÿå¾O~a¢ó8gÿF÷ÿQüï @8ØÿSø¯Ò’R’‹ð_Å@üW1àö¿ñÿÿü×s6à þë×÷W`¦Î®Ÿ¡×3KÌaî»Ñ'œ(bí@™êºá};Ôƒní’“V+riéùUä2oäbÒ:_ïëýØ EY§MèÙooÝ}ü¶¤Ýôê˸Y]6”˜ù)Ó˜Ì,áű—îÑöÊC'ˆ©»o.«ÝD“º&€ y¾kŸêqÞVìþ¸ ¾QKF4a¢=ú³ØC½­ëÅ6‹VíI}ùÞ/ÐÎCkoz=W/··³/Ëæñ§ñ‚?×8¿aЮFÒˆ›1rSonmì`Ã9ÙÞ·ÙõªÉJ1 Æùòžà­ÙS"ƒ Ohã$¦‚bÌ­Kü¯çÆL²}9Ö·Ã܉ulÀœ°·N@¸íx’ñê†Iª÷>ñÏ2눇×PSÒJ0 NýìGü²§".þ&Ô+¡§™jL ¾y ÃÑ4|‘°*š/£¯˜3trÙœjè{ºÕ›@rh:±Ù*þ5M1ƒ"®ý*nÏÆO­Ž8hîaŽÜûáN›)‘+Æâ§"úì±+ÑÒ-2Œ_1…{>ÇéRÊÝ}–³Fî g;eU‰´BnÇ:êHS‡ŽóüæQC[(nåÍæ{ò‡$¶{Ä }ÔË"mÕZ[ÒîVíj)á7ô½ÕÉÇûHÙ%5ª^-ù:y¯<º½&."Ãæ“ÿƒÎäÓ㟦ž©PÜìèàÞtXMƒS®P\Z‹Vù¶Í0œ·1UDû–Ý£qH[‘§ÒÍŸ#xЄí/¨¦’š¥ÑàX}µ\‡ÖÉ4QŸI‰Øj°‹©+ä% =ñ€)kÝóÖ¶åêÒ;M¦êß›^ïÎ-”jª¶Îv)ÙVEx?vxÕ阤ãno(Æ25Ãa·úŒ®5=ÂðÔˆ©Ãë–\øý+ÙÏ.]JÁÔsž²ºt6©Ôž)õð¾Ð©7p^ŠL4"W8Lè‚fz7½Â)SÈh URŠãƒÂß6ϯ#!–Ä[—ë^Ç{#oÅÆNr{*­dL…þÔ»•j¬_‰F8‘nÉœVOÌÕ3I–7o\™yÞKgtÅð|ÓUŒjWsÜ_]}ÆÉŠ·¯,¿Öl`™;°;Ñ´ÿðá\U6úËÒfoä˜6‡Þî»&Qæ¶_ÏÊeê‹Hç…ý0XÍ ¢íì‘ÄSu tÎúLתW5®— ÚQuéiàFþM‡×¢£¥¦ì`­<|Í qv`wþTaüëÜG/”Ä®šqŽ8ó³§–œ²§ f´}^—Íù&$ZF‹?]ß<²8›ëì «t½¾ ÆLᓹc«®O(tìáRßw‘þäM¦Ê'ò$kdšò²"Z†¬žz>§ž¬¸‘qÃXòµå©+kU7îôsûü9o,{s£SÔk·ýɘS¸*yuX ¯–lˆê|®tW¶¦æ1ãl{z×®&ão^ÖLd Ï}áñA¡`¬Tø„ò¹,~ßH©'CFæÝØIª7i“"&MÓÕ¨ZÛlûÜÝÍk)´L^ÔºA8óðá‘1óÓþq•fÕ‘Ô]Â1›ÅtÒ¥´úÞÞ/–ZM±š«âð(£[Lº¬B£ä$ãܺnà ë3Oʸó˜Wßì3cúÁº ¥dõì˜tÞšøvÍ@×þuÁýYá™ÞÓ¶æ«ýoÉÐi`0o´ gž©ï{Ä=´)¦$ñ‚SžŠƒ@zʹ´¯B²áÁvÃ×xÅ/3bÛžÒ·ê'%s½§§ßÓäMÿÄ*õ°ÒHÐоšk’Ö;³a= Cy{{l|Åv¤6VäžäÆÏ™ÆéY»û)B)œÞ ·ŽÙˆfÇ~L;Tíª½¿L>öÜ:‘‡ Mvhux¹n }µ1KÐa{õ×·$¼Ûêä˜LðéÒûªNRÙ3Âd”ùL˜:Ó†FqB>!S zJý[p-[lÓÜ—hú`§Jâ1kÖ1FøÓ~[%¯¼³!äe‰=]ŽÈ¶¨’-k¨ÿ¥õŽÿˆ}MÛ:W« M·øO™½ˆ­‡ïsì¨Á”êŸ);càˆ­õº²ùªõ½ñ>ޙϫ%«¯Íü¯­˜ÛϲÍéÆûZÓ~ãG‰);¾¼Ò’úø Nüý‰—w÷fÇ<þŠ˶?Òöæó±É«Œv•Š“1t'z«¿íU>³§§ÊoºÆFÞËk›à™–Ié’GÒêé¯_@moÚâãç®âxÆþÖ^ÿ-J<çŸÒÜGc`KbÝü~üÃA½‘cô¥Ñ—L®¿ŒÐ0©‘ .z<ùàù‡R„²÷µo»޵3Œ”çî¬k²¸~µùîõqì”7Ì#Ö(a{úät¿ÏûÚ‘þ‹)ƒŸuE0iò¼;oɰ¯z±¶m›ÏñbÙ¬¸µ7ƃi#Ñ9”/Æ®Îwðñ/ý²½7>ÚØ¤@M}ëf¥Àkôa2Á……í”뜋1º ::»3ƒÁÓL/Qæ†~[8¿ÒÇq˜¬z«ÛBÃ^Ì)C·&cßÁ#§¦»ÎÓàÔª-›¬­Ò¢wVϧ×,~ä,³ºÅëCqüTW¸tq™2›jÓÉ&rç.'<ÏžÛ^uI"KèjXǧ†âëª"=̇†o߱Ė]ëSÊYóIËõÛž'—^×+yÉ: n¼É©oJÑ£¤_9Ù€EzÓ Ã•,2Þ¥¦ÜüÚ]{¿­ísË)_ÞîëêG»vº*…|’Ä5ì”òòþê–UÂñÇEUŽ)§~[µƒyç( µ§IÔ3g,¡í13܇¾ê¨Àꬓ\‹,1Hs7úÊ>µJm6YøSЧw}”Ø©A½øÎÇÌ_^N'¹I¸á>2Z¾õ|±ótí»5Êè¯Ù{noÃlÒà¢;ï{?û‚º×†â#è^eûÏ>â*_S³Ym(”Ûµß1¦wg©FÞÕÝ«WÅ}ËJ9ì}Í+y§4¡ü¹Úžû¶$Kkų¿ô¶£Æ’g\(ͨøØr:GéŒ1Íè-N·ú’§ 1å7»yÒ^S¦`®í,ÝYjd” ¢¿¨,C×ëÉÎ6ç3Øt…ýîîUæ´Uï¤Xbø|׈p] £G”¤¾o™êe{;7Q#="y)p#ZI·FäI =KÚš)Íý…%Ãy2GïäøÔ˜º•¯§5§tœx|ïóª©û‘‡‚va?Ào÷sâ±{v>W2™*çÝšÄÓ™wMÚ‹ùÝ\ƒx©Tt#XÒ÷»‘ºA›:QÓáÿ~˜¥¿<~£æ‹Ø&)9OñÁ—†mëZñt•È™^7æ:ì“;’oŠ•´vø]8ïV22ÆØç¢žÿ±Ë´î " Úxƒvå„KÒë¢ô“S¯CîÚ"ß¾¨ˆ¢µ®k.O"Ä3Fa•3’œäõ%SçdÒTùZÔ ÓÞ˜tI­¶.im¦¶+×rB„²¦[LD\7A³ýØÚ÷6³XLé~˜~mncœÉ9²y—ØóöÞ{oÏæÎ>~>2ÁPµæhŒ“]7ý+ÌzÕC¹ t±»‚Ë}°Ti£ÂL¬"—ö dì½÷HBAë°ï±jÖI©Oûa{Çìú%6åVSmÅ( ×¶Þº7DçHð ø ¨ä´AШS‹m]Õuݧ§ˆã'ß]æUÝ»ßKààçµþ"ŽÿÄåòÀwˆK‰ÿâR⟄¸\àÒú·—K@.½ÿ˜Ë˜÷å/ÿy¸K) 1éåá.Í”é訽ÒÖ©0}Ã.êy»>#½ïªìÝÌw˜ãw‡q髯ƒ?¤[§Ù ;@µùpÌFú– bf&‘ÍËû,8Õd.díU!|è)Wlì‘Í)1~þpûÇöàoߦ¿ô~cezñ¦Ú¥àò¨^ýÖÛ°'c*±bygÚóÄò )b¾ zÚ´éÆ«R´S°SU%K:7dûÔ>vAÏì©Ð°@\¹tqðQ ëÖb¿a›Èlžâþ=?ÞÄ3XÞVN*´å218ñ(puê@t­¹íeÝø-çO'Å ¦ná|4ñÑúÄܳ[d<¢øø…e?|S­s_MøÆÓ>(Ü>‘Òû²†ÁŸ+òˆÎŋڗG{ l*Dñç¼{C¼«3¸}ñƒôµ.¼ôj×xÔ;Ö†¼¤u‘-ˆj3ÙÅ´yGôÝZw—õ‘{ôCt…vÝ`ÀnI¯Õ©U¬•yéè"O¯} æ·ù=ý‹ZÔK¢únCŽË ÍëT_Z¹(Ws†æÎ3ü|ió´m¡­ösÑ<ݽe¿†¡Ç“^ly¿óš[§~û«¯Ç³û9%bvf|Î4z±µædAÖÙ¬’Ë—Œ‡§B›KžN§°ú?ÿFüvêkð—ä/©•³o 'ãÞÖ_ÉKéYcôÕõAlгJ~á½ç HŽF™‘ð<Îõ®´'qfƒ3M—¨‡ÂËaòJ}\þIøáÝŠ™yïòS‘#"$rƒÏISPFj'Z[SÒlÂéÓaúYÎì£#öîb½Ÿ*¿väè·××D_ fXR»—§ô#/W·é¨íV9®RtEL3i?ûè#åY¯sâçÕÃ/rÜÒåmé[d,ñì’ê>›.%Þ >váMÝÒÄÓ¾—âé‰Cn_l|ÿ0JwÿeÃî»Bï]ˆÕ›K©å§'é]l:ÉÁÇü8pK Nùì2Ú[WÒÆ>ñKŒ{O_|‰½{·|ºÀ‘äÔ«‚–«XM“ñÞ~Š›ZX©¶Æ¨cÓ¨ù˜îÞ ôÙªžºã>l¼r•FƧ“ðTÐHŽÀµ 5 |'{¬|3Û}†LX5è§Øê¶ÿÓ®”MN½3; 8ŸâvÝ=˜œ°ùÙV–-™¾ÂH]¡§wj®' ŸÙËbù¬íÚ”ðqkQNÎÆ÷q·Q6n‡Šrd÷s^ÐIzypW¿ôôè™õy88Íg^Ø=ÌQîû/nN+ĽóÔ3¸%~ˆÅ&&bPp·š2>ã5|ó‹Þ½ç>|sÈÈ™{OFˆè.åAçw~»ï"‡L^rŸ>(2x)™Ú–¹äFÁªÙ [ü>­­Ò"õZ¨ícøåñÉ#áêÇ ~Õå0:uïòˆb›)\ [gÕ†©j·ëbJOnPy08¸+õâÉ2m=³gégÞJI5ßõ¿ó¥ß¦ô«!•û‹â0¿»ÔN¿§ô—)KÕ«Ytï;›«Ü>Þÿ,Oqµõ™ïK· CÂU¥É´>úŽ÷Hß«]–—‰©¶ÿXuУnXq²íóš¡Yº†¯§iS«oJ¥$œÎ†Ù'UŽ´Ö螎3ž Ó­¾þE~à­yös¾‹¦²I'ÒõW:Ù+ÁfbÊl¬gvŠ®™†b¢[²É)¶t‡jYm¯1ŒÂc›l¾ó¨"A½¸>½"5~Ow<~¨]³î®®n¿mÔ¨1õ+MÑW9æÁû´Š¶ájö] *”-嵬n¸6J÷æà‡4ÑZêš>Û {ëòüük׺L)¶Ìz%¯z׋bV»u¸þí^„Làþý:Mk6ž>ædiïNÁô°®xïue雇ümšüYkOò·ß1ÔR8|Åî®ãM17Õü·ýögOH…åÞ롈™^Ýzàtô)»£—3.¼¿SUes\¯ÜGD±<º|©k’¨ï{VN<ðIzqXŒé³M4g¨®¿<²fX–gg×퇼/•Jð„±öVºr+&üˆ©“‡;¡àøn•dÛIÉsñq—Œ©Zb*MœÇœÊ󎶱LR3©]jX·›’˜Æ?]–ó~BçŠuZ_‰z£ƒÔœÉ†Ù›ü»oÖMCÊÞUYm¸Å¡ö+â|Â^§ìláÛâÉbnÒ+y°+L³©=_Œ^ìBJðͶËã}MN)êáñËi4õ)Zí.¥âê ÇEåGÖÙ–2Îp=¤ä²s¶Ӣ¼Ìx•êªó÷«E½Ò“¬-Úô´€Çð,ELÙÑx¼Oã³Ùf4w”ÄׂkôÞƒ/Ñk{fšÛÙ:“àÕ~¸Ì«ÀíÍ\AEgkv¨ÏoJ+‹³¾Pgå‰_ÅÈ}›Ê£*ì£Á¶îAyÌY#¯>®ª›óV* ¸~#I¬óA·é/™®ËÌÑe7C+’›«»^Ü05eãíÛö7q¼çüZ•‹ò •nÖ¾¦S:)Ï~ˆò·è×»·¹ån@ÿ*²Ÿ®kßÎ[Ýw]Õ÷+¼u¾,Àv8좞¯a{ŽbOUh¬ýçûŸáãÑG{ö̱í<ÑûÚ“íì´§øä·!ÂôoJË ­®.ÂE]ú±às\ø"‡Ã¹m6ækhê7ÔóïyÔ•Ö‰"¾Ëë¾Sïp³QÕ9‘ÞK9fŽà»‘\F°neìÛWδ¦&ILìÕ ¡½| ©š=ècX Ö_:¥——Ο}CT¯8æœÄ]7/9ïùt@Hêcx-ϳg;cZK4ROœbÞ(Êj%˜zôsç¶›k_[Õ<öéTÚ®uE{ÐhâsýU¹1þãW†_ë²ñÑ|Îß×m+{+\¥uŸœ²;öãA×N¥ÞÙa%oLŽÆ³aôö–ž Kjûðúñ}“õ<Âñ½Dì ¯p|½Þ•íÏŒÒR^èÏ4iռķë§ü-Zq âuûßRu$à±–Ã>Ÿec-ßLé~ÚŽH`{à9sû…Š÷æc²fÛ¨iT¾í=È´óFVý¤ù£­Ø‹ç3†î8uº¼Ågµ­%®‚÷pmD¬‰Á‘m/—+/º0Þ#ô²|ì½yÇê†Ï7ô´­8eH·+~6Bè¡Àóì|ŧg'ò •ŠîÆ3M{6Ü8ɸKVlïãø™«‰µ™ZúÚ—Ïß+ô)œ»“ÈÖZº©ûâÅÌ‹ öÏöZ¡W?KË}”®JÌ´y?¥óáöÜãÛÛüU¯Ù‡©¿»Õ›8Lu%\{mPÞ&Z>‹ããÝÈc ÷ýfØc‘]Þ°¶ôº¹½ýWê»- %“¨k´Fé ekJS%¿ž´?þ¯P&#÷jdó¤¤Eÿ”Û§ ô <»¯§RœhbÝ|±÷žÖ)›wXÚÙº‹H2R0) Ÿ=@I™ôÌ3˜®Ý¢Ç§Žïlšžù-}ÔϽ{{ô…œÏTqKþ@MƒŠ·§Ùmg“8ÎK¸ÙhêòÔÖŒ«ˆzß´Mó)¯‡ÃF&…_i«íÙ>¶Ýpê gÐak3L/ä:{ÛCðìÄ¡1†/ktÜͫø2TRaæp¥:B-V7¿Ñ·ïºÜèÕ!‘Òµ…5ÁQAŽÓÕxš}Æ,ªÞùÇžJ$Ö+ûœ­=¤áר#¾É,€î­HIÖÑ[Ò¹²'j®ÝÂÙp¶+N·¡Òâ©)UmŸO`ôЪ³ÇÙ¨\t>鯷аÜmïŠÆj]*`“ @ßa5”ÁR‰•ŠU¥«Íá*Þ™SrÜÒu×¾oûCr6}lãç=‡ªuúr;´@“çõ!­Ü6O;üÂÄ`˜F/ò¨8­1¢©à¹7<\”p+·Jï² ®Ãþ,“=>ô\e“õ3ªÌ-ÇäoV¤ŠjŸàQ-¹Ž¾l㉺M—STÜÒª€ºqÕűÇÙ‹fW¢®ê]k»ëǨPq`cÎíñ_-Øë)I+Ÿšúi§Òe ÎXà)v·­§z°Rl« r$qWK¥Ÿ•Sš½¼ÇW½zPy^HF^þcÕøI‹šÊÊšš•k}Å»Ë×¾Å>ðU-Ï–Ÿ)¢Ò“ÏÛ„ 0n2\ÒçVõôX¯Kü¸Föý/t=ÏÚ’ýžo¯s¯9âú¾ùÅ[‰H¾•ªµü«¨ÃJëMrTËÚ&qÛžé½SñÈuah?…غªvÚ^‡ë©„r•á ûέÅÔn!¦[M"ü¯|©­ê÷Ј£[¥T¿/hL­‹Þ{ÇàäÉŠ¸¡G¸u±²B«ù˜¿µÜN5_÷Ê–^¯Ç]L†ýIó]®feºìÀü;뽎Zç0JYä¢<¬soðYT?ax{ÄœKëòn Æ\ÜÏ<”×Ð5¬ä³0í«:í'^émJÚ°ãú'¿zÞ†-‰Ô<Š“L©wÎ9%Róe™'%y 2óoI*>õ1{ãlÕ#%4òàŽ]V—uYÏùy%j4öØ8vwšY1xµ¼Ì8pŠñ@¥æ5½Î0½·­Qú¹¼7¢H¡)K«5~ƒ6Ãöß­¦¥f *RTè~8ËW{~MæJ›ÏqÃ-×…ˆ}¼óäë¶{û>)é<¢w¾DÍ,øI)½)BoÌ®[µê¾¤gŸ×éµ¹î®û‹Îßí²‰Í@žxuzf,ÿæÑªNƒplþέ†½Ì­.€ùQvŽzáÿ⚢XWƒ \¶ò`'•‡ïÞÛeÊ-rÃ¥ •ÉŸb&ß~Ŧ^(‡— Uôýâór»þÒÌË#Ñ%{q•·"­_˜ÍõD 2Hóù#Ñ=`þíƒÀáá·ï™$(˜ñYœQrGBøŸž>žÌÒœÒèâÌÒŸA}P «ùK€PÑ Qð×ùÿ¹¢k|ïû¹žºäéÑé[ÝïÛO6}w.øÝ§'òßÄòß6‹­ ïTU‘çÁc½p–1ÃòÅgÔ„“´+¨ø^½·çõ˯BñœQ® ~À°IÖ«!$3”–íL”øö£ŽðÁæÍ/]û¯Ÿ¾µ¥oÇ仫Vï¿ Ÿ£~Žu`97}Ûãô»cŽÆÙ–§|åååá—–çáÖ ÁüŸf=HdÓ›r*n‘å‘Qäèï}âÌ|ÃÛFì]‹22¸y1òD)îÔ_cL ‡Z‘MOtÍ—ãçcŽ}86ýÁd£®>ݬsç„¿Bc™þtÏ4½wkNïØ×ÁKXx[r›Ù£-Á>Üë¹’8#zcç‡kç¯mŠ{V1Ω=˜ïŒ’ýÈÆtp´ÚÚ5½m/Š–éÐhÍs—¹bÅÈ®בÐØ úΈ@xrAM=Jðs0ë®üí{vÉlIŽ||/¾@¾ÍaDÅ+³)9¶ þ®òÑjWçæ‚îæË_kc™³š»®hÞ¬ŸD7vR­è÷yòêS)¼BœÚ¡|˜)„0zR]pCþúøÌhéDJã˜Ðèñ»r]Š ×ìÖõV³\S®Û¦¶15K½v@×ñéý­žt5Óµ.2Ÿ/ڒΘåX{äpýÍã¼ë7±ö)sŸœm¬(»}X+†Öúmœ÷KS•§ôvØ2©‹‡Sìšj¥‚ä÷nlçs ‹õ8 Ûp˜1ðAÁáÈ€”ÌlóÃYD|:„GËyXïY¸SËêåm˜Š[Ú±ElÔ¨ GfÝ<‡—°£L¦F>ξãÛp«æ“¤]½yÒªZ‡8^óZï ñ> jTLGrN¸Ö±Ëàúpc·x¼Þåÿ®Ö®Ñ¨W®ö\0sß—R×þÌ”1çØl4M·1îir㻓•޼Q»ÅÁ>÷¬›ÕÝ Ù'ļõ#· ¯ìåSl×JM­Ñ9Ù<Ýûsó ü§D6·Æ¦ŸSj9^c:)<ÇÍlNŒÖ›fÏu“ÖfßKE‰3>_§ÿèˆÈ s\z|¼ŒÊH2]dDî½=Y;Z|»ö2¬í£=Ru£/ÓÊ.¾GXkKqztÓgV¡oÇ×ÓZrí¼æàù`“`ÚÂܸM]TJ±h#å-©SÊûˆŒA¬/^°*^ÍJ R#lëÚõM‰Ð¯»7Ï-nÖž=œ‡Oyá`Û'±äSáÙ8Íëq›j×ðIÔâ6P>áýåúœRê˜æ‰¸#§«Äêf‘oÚ¥÷î}–[É΋¥ví{}tdœ]o–n7ÏúM_W镎<ŒLI­¸¡|µ?mø™„¡u‘>¯L™%ªý‰rW½!_í3«ãs®VjÝ™Š¸ K϶nºÍÜ0ËfUßWÚ›;y¤n2¶O•Çr6,E.ëvœ §>ÁÝ”²Ž®ð%ó~‰ã«à"Kbª«[MsFN×;jlÒñKÛ®4í,%Lx}Þõ–£°Ò¶éò¬¼›ÛoWdøÔ9[ EtËqUçÊŠôÞêø"°þ–AàKÿ·U‡›"÷®åºÊØgrêôÁÞ’ý%†7,ŒÔ†˜n>ózûmð4ßW¡÷zUoVÁW=>Ú3Q]з•½]{÷ù¸¦ä·9Ã-Ÿy´»ñ|,wô†6Œˆß2Y…yÏÁcwhpÿõwÛ.* ÑŒ}ŸÈÛa£K“^‘²ŽÏê¬ôj®©ƒqÃ{n6Ù âlù¬<^s×ÅïfÐ-T`°Ça˜èÉ}xž‡-â y”l f'”{î·òÑÛ·\ÌEûØÛ²Úv¼ØþFX8éÐmDãÐnÑõG½º!λ oõxq}×ua†œÛKsïz¢(¹ û3|õdâ¦èCŽH·sU±g\šUá’ ¾¯y1lˆgðÎë¢0QB…Ýã,“ú%Öoº¢­Üp™¦çûs³J5sòÇjeˆÛaÃ#§ŒFåf2OŽ(§V¥÷ uö»Öb¿ëQ–®iCS7Ë`Fž}Qœþ+î+üøñoBü[bÚ&…·L Õ£yCëë/cÚ=Ÿžðyð _?·nÔ=2$êln·ßÚ‚« Nã ’•wrßn“Z«–º”–Ëv%dÓ^;n:«ëßweD}FÁàx6M‹–W%Me×IÄ %.ÛÈvûƧ¨ñû xAI5YNqé€ýO²…ίˬyl}áüÞÁù´'½¼[,¥e¶*lS-“÷›v°ž;!¢rsÉúð°Ú®i‚wã©ÓSÅ"Çõg3{g™Ñ›¯œ¾åfQÕÛV¥jfO3©¨[”¤«töÆ´-…oÀ€Vótø®Šê;ŽùW!|Œ·tÆ›ŸØ»?âÚÝ ÎB‚;l^ êáA×À»/>öŸö9|¿ÑÞ“:&¤Ä÷5û•wÎé^²oǪ×ÄÄx±ƒN%§öŠÇãáÙ/)¥o»Œág¬ÛK§×uU<3PÅ>¾ß"wI_KÃüb3³Ô€–T ]¡ðÔÂ?ýo1âÊ‘‰BŠé“¥ã<ì¿–êÃâðå(÷or ©®Ù㦕O3Xy^Äz†Ç•šY^]ÅÁO³>Q×|=ÁíA˜RR[Ó“(“&Üzñkü‰oîèºqÞ8G»¯±Û¾©­n³3šûèY|ƒHç'Ü»­Û{(£mD_W)OÅãkÄOðLÆ>Ô¿-GG0ÞòET¯—#ËÓK¨ÕCã%2 A—‹Þ댡­¢9–a:N'ðJ(œûêDÎôµ• þÊ¢ ÎâMÄõ*4c×ɓࣥž,yšö|‹ôÓ1¥«T¤zùeJ˜§ç¤üß k5£ž^¥R‡Y#êš[/ll`:ý“rÕI_µc•P—y£7o鎼„ó³ufÚú:Gžâï˜nåJm-’yÃVáØ¤{t´Ý1-³-·]PÅë'=uq¦<ýô©¶ú©”÷'ºØ.Ø$S´n4äf [ûíaÖ왔ɭ“ƒ‚¹3ÇÍRJêªýÏ7u]9r‡IßÍKVxòUx³f؆!w_G?›‹5;â²ý#ƒò¸á¡«ç¤µsô¼½õ‹˜œyvtzÍj³XPè¬+ÌχIð(Ú0lbx#1Ær´T% |öñ|°mZ–ÀôäK:SÇŽvTuoäëz¼Ûöø¢ƒ;wß»ä·qìXÄ»çM)¾³Né iZÎÜ臭1B‘°-nÜsk/„znY«M_®ó<Þãî$ÿ†Ã÷½’ oÏ¥FŠ&~«¶š9GçrSϽY…ë…YFúìížÏ!÷ߨÄ= fÈ’ÐÊ^ƒcÜ|o§fœ±‹ã4ƒ^ÚÕ¡éÓç:O+òä®.KÃݽ4=º±­|3[I¿¬„¹Y8¬:%¯¥ãj •|Ü[gG­æ‘{W)` ®,«ëJHŒ¿ŽC²Óeq»SŒU4#ˆ»Â Aïf2å@+¤¬|¬&7axÜšoKL©Ké#ã‹uFˆÁ—×'¼¾ZÌtL{f™]²YÍ}Îëdäú³Y»µ—?˜Aíüzb½Éç9Ïu¢›iŽë•ñS Ñ›]Q\Mì'.Ì$0j> ¸#YH}¥º¤¯‚UõšÜË-Ûâë7¤ô(vÓ³örds?Û¹*X·v£âÀö­{›Å‚•-&Ɖ«jà6žÃŸc÷6ê¥DÞ´Ý>S »«™þfÜçu½¹¢bž7u’Uùƒ]RôWñ÷·ËW™;oœÉ-Œ 1K·¶º8§ùøpØÝ«wpÛŠ³G)”iMŠ"<ù®´Ø¬cgŒt¤=ð^Å3†ö«œ"/_ä JDè¨ÒkyòdÓ”t –ô6&ÄEíº?pSH\ÚCÿ¨¨é‘³ÌÇžÀE„ï]¿a™MvT8Ÿv<˾H4j}ÿÖ(ñú Á5L»ýù2>y²Ò7ŸvÇ¿ÚæBËú¬Ws&âQ½rà º¯wöPÙ88§[µ¶íÎ:É?p§‹ E+™ÝOá~íDTjìye¦º+Þ¶ïùx5H9üEm“µfÜ‘¤UßÔy¤*Ô2ÞÖ“ávNg¥ YurÛ$ë.ÞMßtZNo)Èð;èå[#Š8eòXµ5µú¤Œ.A<“ÖGP¥ãö£og²EîÀ_§”¬n«hiŽgƒ§Á;…½¬TêUgf\›Áx£¦eÕ^Þ²áxþDä/ÕÙ|P}*.@%’þ!`ÆÉâüœÓ«àЗ¼i'&9ÄN¶ž’cé(gI³­²/W•åSÕ8sâã¶mç·­;>vµíy_zDê[.Ú½Ò•#ì<Ákµ½D(&R‘Ãe˜ŸÕ†q¡Å: &YFÙ° +K#bN ìÕ Êʈo°³²*v¤§Õ©<øôNó§·/¨ :6é=©mºRê~EýVë³{§Ú×›„w­a;1f!—xFà‰à˜»²áiiñ³ïÔ›úïñðœÚíÛVÙ½&>p¶P8EÊû,?kœ·ß¨ãð³Í”ªÊ’¼6<¢ƒnÙEéˆÎ/eÁŸn©â—ó­=/5éÔ7Ud}ã›Oÿžo"«]¶á)'“¸Ó(å:w;jÑc#„«{»'TnIYýxÈNoGôÉ„#m¬¯\¥ß½¯WäØT»/Č̦ç§Ûæ&ŒÆÖ~|v¹!ýù8Žú ½Ç†µ¼º·[Jû£.`¿ÕÍ]q݉PbŽÒñ¼|dd$Œ¡Ø686^›×tá|Y’Nì‡>FuôáDÄÖ™èR¤H“ÔÐÆ¢ÐøÕ§ê~uãö¢tâ>fnLœ±Mjòµ•æ7S„(ìɳûïú/˜ªÊ:½Ë¾,³Ë!çbBгÇS4úoU\]"ÃY]ëŠ/Ò<÷<:ðnêÂëªÔª°"ÅJùÁÉ燞Ô¤7ŒEQ?é~þT^[VFRÄ+ÛK¹ù,êÏkBç¨e_$À[ð~ Ÿ®}«•K÷ :†qìø•ûYÖH‡‚cçƒGNu¶æÉÄ—î·¾¹Y`dæ>"Ú{³îV–F»ý§Ï䛇&åRù _f(9Ó8òÐf'g÷íCÍ¼Ï š¯_7·ðºžlçåu6¹ÐËüû`ÆEÁN½ôæqã’à'雦§ùTÏ~’/‹¿¦^æPº‡"B;=’€U%>ŒÏ—£Ñ\·ÅüeüDÆîÍ3>›Œ§oퟸ={†!‹­[{ÔÎÞʯcÜr²‰‘%irÖ´ïÞ½<´Îm»éz±\ïäo2Çï™-ý‚ÝÕú5Ù&cM5÷„ùþéc’_¶ïõv Š”e½2Ë>„P]}öíÉÍ#ÎÁ,—“WùëùÔJÖ<»ÃR öaìj8[q<»ÑÏšuï†íÏNÅ5&\HÐ*õ³¸årÄÀ¹á3fÒ;å¨èý¤ÁHS¯ûx¢Ùe>}EbÆíb54ßK»­kM>}Øn;Äï§t'nà°B¬uÍncü®”MWd­»ž6¦ÃÌÕ'½Ð‘»i&>\bàï>óä•©}´zèQ¡KU:µF~â±= çN½ó2¸ÿü`§úŽ=–E6*Üòá[_]Üa3«6¨f r—òsAÇùìýÉ‹õ>»·ïÒ7Þ x²hËu:Yˆ~ˆñIˆØ´®{uöÔÉsGÊ©j-NY¥wjetRuL=Ú‚‰:ªsÎ?(ø…[£O|}ýú/y7&<¸¿]¤ïí4iй_¹—ýñz6«pËÚõ®[çÞ|<¨rsÖQZ´õúîƒW¶t¬Šðá-¤cQh ¾÷Á÷Í«Yß©öí~J{x¯#çtÛôVUÞõ’im¥³ô£ÄåóÏMuSïÏŽ›+Óä¯7ž¡Ð‹dZo¤Y¿Ûþ™,ÏòúÕ…=êý9æ³™oŽ˜j–«4q•„ï9ÊÓ÷(¡õFpÔÅ9ª±‰ÜZÙ5a>q"ݸÃ!š|SÕÊnŸäz¸‘©uuÖ!3fvÆ-,ªYµ©§[n¿?¥È;(·}ïú©o? Èë®.»*¥%p6ök­ÚÎuׇyM,¥Ÿž ¬Í?Pn7œy\»…–ë™ó‰•ýF0ît†ñ¤Œ´½­Õžõ(B˜¨lªñ ß½è'Ã{iWó(Êù¥ïb¿s,ýúÈLk~WÕvŸ6ßjk\Ó¥#]’éÚ¤£q" 2×ùá´µ]ôCµñÞŽÞAìéo¿}ìqRx&÷ð–ºá»Cj[¿¸£O æ;òJÃû„FǶ)«dûo©ï”"‡EƒJc #Ì:Ûùø×ª^± sÛ|‚à“Ðëýz×yÉÉí>©¯ý1—W¯•¹»‡a‡ÿ„Ëõ^9†Šm¨·üë§KíÅ™ ú¹Î×¾G©º¹+hd¶ïÙì»çM‡8Œ»‘oË\p¸ÇÎ…X4­nˆÛ•3ª¡ÁZþõÊñýÌwñy]·“Ci_œûjó‘U™)aÛúºJÙÔ./Ö™A‰T¿›Ñ%çŽ>I–º©ž iÌÚ{SC½[r•]cåDl½q”´›“®PN_H€d±à(|ðÊ„NŸÇ˜w{â1Ù³˜"B7û…æ*bÛ¾jÏj^èÙ¸kö³3Röø˜:µKxª[cúÖÛÏë«¶¯‘›šøbÓäÑì}°Ã³aÛÞc¾FŠÃ*×G©ê«“Ÿæ uš+â]¦gJ3FZ`a9õ­Yak.f?EDë«¥o®ÓS‹l4s|•)""`•øá⹇lg×ãÍŒöíÕ ,QÉ2·¦®Â…·1Áïoå=yÙfë¹]FÆÂÊJJ[hXêìô´nìá3z<€¸ìææ¡w*2eM½ˆ›¼cY™‹on_à Û~C½¢4ýè3C]1µ¹] I‘Ç«Ë|i(Ä?yo}ƒo§yrü–sæ¬O6‰n~¸[!É‚''‡O\^ ð1š'á®Kñ™£ŽÄo˜…Êê"¸¥<ù¤7_Î(:"F{y¯f–˜ðæÔ !qçÉ~ÑÞÝ©Ø3Â'U¿Ò•›¼ Ñ*K×rKgvïØ0n^—uSýΜ¸xfqLµWü·×Þ|k|¹T­ u ¢êƒgZÇŸÖ×r¡ÍSÉÕ|»ÊÍH ѽÛùCTº_¡ö•`tYc.fŸoøpr×®ÛêØ|U´*žÕaד»S‡î#Üï~èÊÞâMÕí^hlóÛ’LØ]Òf~M@×P™Ñç¡–s@BÓ†âG{=Áj£F­gïÊc°_M¾í Î “ú¶³f*9s/âëîìZùê ú[¤vê~k{ÂrÇ1v O 3QõÎuö¤FÃÔɵf*ûÄŸÉx_ä§I7GÔIy²sõëêÝ›×m—Øt)å¢"̆ûvÔ…Ûœl`SÕx=¼uK¡ùòáÞ>=æýkŒƒR¯_‰œ¬'ø>rX—<:ã+B>‰o1ÈØ«bw?côÞ^‘t=kNãfÚÈ{|íâS›·‡?Sq«zŸ*™e9£`ï¥ðj— [3ÎŒ‚®¤º²÷kãœ|ÀÃ/Ãkc{'6=TñId5Þú.Ç?ûõi»ß¶8'§Ý×Gg:„wÌxªNÀdj‰Ô\´Ÿní꫼">ý¶Â¦&¯ÍF-ç²Ì7wëXö6ÌGÅ"AéVÿYwXam|Jé‘›©ªh¹ÐÓª!åû6†Ðˆ>dn÷¢ºt‚Náh×öÜ÷lŽ“—Z/IsÐߩݳwVNùufe\óô˜a§Ñî}Ì|Ö;O4˜3²×¥Å7k±»>¯:Ö+Îß}!Bu3œþF÷Ž«„)wìèe_÷6šùq…šÇdà“oã*_oÚÅi³½ÿ.6"»p¸zŠ–+F»r«ý±QFltàDèûµaÞOìϦøí#jyë]ŒÛqù#姃GDªÃ Éë†Û}xjg§žêWP* sÛÚ îPA‚= Š5³×à9™8¿ì¯ÙbÊཥ'TzX彂'‘U̧6\eÄ¡•xdÌ+èQYª=<"ÏüQµË/½ç_°áÿÛ`ÃòpwIÙŸ!_q1I„˜˜,\FòÿØð fõ߃ K(HËü‡`Ã?’þß^ ¿þK°á¿êŸÞãÁ†ÿWƒ K@‡äw`ÃKZüƒ`Ãr?‹ËIIIþ 6,ÿ3ˆ°Œ¤ô_ Ë,sM^üga9‰Ÿ€{ÅÄ~¢•ù ôWZRâçvbR?ƒ KÊþ<±Ÿ¯ÉÿtMRú'À`1iYñŸ’¥¤~*–øi.â²bbÿ Ø°š¼¸˜–„¬„¤ Z’Zò²’âR@¯Zêš’ò*nñ#ذœ´¼ì¿`ÃÿQý72fÂ_÷ý/ë¿KKÈŠýˆÿíë¿ý/©ÿþo%÷+¹ÿ¿½’»¡ž‘ž¥X¿|¡z9 ‰nEË×  0“*Ž‚úX¯;ŠF þ æëm.Ÿ;hƒà‡¹z"\½Á*ä04…Bâ®X ©L-X°éJ*&©^¨'>r¹bðŠz‚ýxê•T©œ<>è’° Áà„+LœÉü7~Pÿû•‹Z—6¿ò‹‚í¡RªÀjmÔÌõŒu`êh7Ér‹· †BbÈòI2ôB(({ öÁ‚»J†ÎÁsÀl±D Ø{¸ *æA–ˆÎ梂(7Dß" >~°#,8d€ ÂHŒ‚áàd<8f)ÙšññƒGÃé’Ô‡?„Oˆ…a¤±~ˆ$`?ò|I¯K 4Éÿþ¼MhxÁOè÷îü4?°˜:´µä[¤ÂçÐ?‹jÉÂDpÂ`ݤ`M÷ßÜ?.º=?°ïË]8ƒ'`}ªÝ“„PëHŒéó|ýec,þ /j‰yä*>ðßÝWÏyT#W"*î6âYT«*+Ä;A3E }|<|d¶ «;äDƒŸI yˆÁó3ÑFbHÀgÀ$‘h"za. þY<¨ºð÷w…Å¡±Ø \úÅ4ARpX¾Þmè„U@+~ß°ö’M„þ~¢?“h—V#'IÈ’F`:m¾#¨Ö2Ø8ád¬&”•abü ò †!1DÄ<ݺ©'Hñ,íŽñHd*¥Å=/ô$¶¸åbÞ‚ÌѨ¿ßüÞ͒͘ÃÅÅÕõÜaþÜ þ“| ^Ð2a1óJÂÄ AÜF¨ H¸`|ÀLãÅ/4/sH`ÀLæaî`X¢ÔZ¢œëEÓå×·tÓ@TäÂj7VÄ8tüzÆ–NFj{øaª0òG˜0 ÿ‡cþÍÙ…­ïœ¬ÌnE$5ã#·ãÛ‘LÅB§Pñ{@$Òá!Ó@HÒn0žù>ù¿oTð"GÒhÀ@‹•Êüß¼)›|¿ú}S—ôЃºÿ3ñÑ üçb¿?Ç2bÒ²²`ýoqq1Yiq)q þ——ú7þûŸø Gpz¦Âp77Ð×ó}P0øFdm| p มhEX àÉùÃAkŽ…yƒÖÓ‚<Ô3…ÁE\D\EÜ ÿ‚âp›'¶Â“ðžÁZóàh.Ðx|œn‹\$(H„42h˜í&âæÍ y~ ò¨ }­ÂÁøÀ„U=cI ~Œcá’š¥¥$¨3`ß{ñGb ˆŽX·Å7—`Æ-¾±µî‡;K éþœ T0Ö‡°Ì ÀÀq˜y^`3CÓÊt þ‰uœ‰wÀ-Òša¤k|>?lQ#èÂb¶-é]CÍBKÃhù\ဋþyòu>q!‰ïc-½üËÿ“!1K:Â|õ§;? ¬g¬¦©iîdlb¬E³‹Üå¢k0±wòß)9»D±#Ô!è7èO˜ï¼á±öóTu„ƒÖ44]¡0 §â2À@õïäŽ&Ø;‚pEþ·¬é^®¨@»ˆÃ ¨€Ô!œ$¥EqËØÕïù²å:’ø±#qrGËÚèï}!ØüÐ ¨õ!î€Ð<£-ÍÕ4´ø€Žù… þ!}ã°|v œæ{T"á_µƒjCp‡WüU¡0]=C-'m5C ­…½õÃ"Aý„$8’´lJŠ_qIãyôh>è›ç!´\ôy9{!›Ê˜5?ü¢C‰¬G€ånNdÑtrÇaÑN® ©â[¼í®$Ô3ro@( J-äuhV‹{Ss¬áZ€ÏB |“2l~p(å¢iãIß¡g‰|à!pS Ô†Ÿ;i—øð7Ý‚ˆøÉTÀ©ã[øŽ@øÄù¡*Èž¡Äy4W~¤Y,·só¸`ZÆSè;üã_ sM˜?Ù4'å_`ÆÊHÍ@ ¼Ége¡åtaa¢a ´è3´ 5æ‡k’3IÀ% 7€>þ©[!¹%@=¯‚~ÄC!]pp`Wß@‚Ü3ÔSwÒ3Ö³tR34ü+L¸ù¼ÂûÁùÓ 0n< Ã„´,„¥Nîœ!aEN/ˆ/J#ù{"Q@HÂçê9?q’Íã#í¸mÀ€n€Òääç_œØÁn@Î'Bæ§ *x¯¯Â¼›@Ú¦…£îæBô ±å;ûæï¹àpoÅ%ùñ*Ðü ¶Gá¹@Aú®ºðü6Ì÷IG² \ %ÁÉy¸Â„•a+€3J“óðÑø¾_!%svJóXŸ?ô÷“P@«æù®®þ[øïöL! áPÔ€øžÙ3„>P´†F~´0øÜ\?ä_“3ÈP¾PâÐÉV„¸#(ø#läO*ka£@­àBt·s\HÀ‘ršg âê3ãñÀ 0^h^У…C U˜¹þýüV ÀÐàà ‹òC€Ú‡ÿ~_tQ–Ì<Áɇ€Åð©iC¨ÄB¤ÅÇÒ®‹0\ÌòýÕó-<!÷±Ðç‚Õ˜ïwqFð»A[,‹í*H"‚'qPYy±#Ä¿ÄxÓ,giù8µ!€B0xAa±ÞDŸyi!idŨ~LŠ/ÎP.È ´·äþ!ôËygäLJ?| Â`wÉRT€èXŠÿ?RˆËú&!-½RB¹¿¤[LF"XàÉ1âã4¸Fƒ'Ó °|„µÐÎÝEÄ{‚çtñ£‚ß ÄŸąÔíbM½¬¨À¤³„Ã.º1gÞH¸¢p `ËøWdT-Ô4¾Ó}7tdU2ÿÌʇ“[xòDÖ#¤ÄY"ˆù‡ŒíÊA®¤c—Õ*‹!úÁÀt9™ÿn`œ ̈¤ž#ÀŠ‹E` ïä ÚšNvZæ&|<óD Û¶pg¡“…[`ójøø};y¾½ x¤I¤KF-±bÀŠæ{ž»Ð; s›‡à÷ãDð•õý‹9ÌÝÿ<¥ß=[òÀø¯ú]4,ÉÏ¡g’dá&¥^ 'Óþ˜'Üd€¾ggÁä ˆu |&@©­îº8! &x¾?é&uOò¤…¡ì"èNƒ¯~’¼ .X„šNŽÍH苜o~ cÅšA¾ü:hÿ$Èæš ÿü° ÈçàpàÓ¨¿ñ~£òœR0ñ7®Â"Õ3¯û0Ú¤‡äMâÆ“:$wN³Ô>Bö8“ öu {æóÙ`gB Ä#ƒXÈ¢ð/ÖÓKòÞ$ÕæJf÷â[¤˜$ ¶+Ì (G¿ð„’Ãõ;ºîϼÓí$rPí,b)Ê!åŸ`¿ÙHœà[êõ,]'¿âßœ `2X0ë¸Ì¡¯@2ñÃýÇ#ÕÅ/eÌ»p$7öÓ"a°/#Ç+c4 >s‡äa±ŸÌ$ÐèüK· rõ $-©Ÿ¨BiæßrÁ#à8WOR0¼à7-NÌï/é"ä˜þðdbþ±Ä‚_IN‘”'@ri/éHM5 ÒÕ¥Ï@‘/Òàñy©&;Æð‡¨ï£/Àªƒ‡Tñ‡Ø2ë€^— )(<'Í_è$QÚ’ä.ßÁDè7€„U&üÃSwÒ;!Â*K9 Z?Ò§ïFgþÕ.°ýwãFD Ïï̇~¡‹^ÍÚâ“=Êq‡žäÿÁ!}"PFwP˜<ÿxBæ§„Û2ܘ_øJ.˜$“#2w@apª¹{ ¾Æùë÷ B…¾SKHÉÔ õ]hÖôðà?œE ƒAÔ(hlàÐcpÎßÿNb µ¸Þ‘¨=@DøQË€cã!j4@ì ÇÀ,àhì/;YB-!R»AÔ7,·¢±% žcIÔXÔŸˆ—PËÈ@c#ÉÔD$êOôK× Qû’¨ €¢ó[ú¥3‡ṽL ¸0p ØP‡ã\ˆnËw²„ZRŠþ!jœôÔ~?õ%ÔÒâ 5šD „ó+ÚoiIIÚŸDMtù#˘9$-DˆˆÕqpr3—‚xNX ^™¤JBë&ÉyçGzýö€þ06(k.œ«Ã=áh@äW06t¾]<ÉÔ8À°¯„Z\·‹‰ã‚ZËó¯g. J‹‹ ‰X¶ÿ÷r.i—@ˆ‚ãˆ+Z·4¸ß.2µ’ˆ^ µÄó 25`ËWr¾%Ä j/5æÿalH;¸ IÔ8ô¯Î寨¡±!IU÷$þÞ,C I ¤×Ô±(¤ßÊä\š9œDŽ7 Zt¸ „ÖYE±”Úo5ïǬD+ÊBëö#Qýú†l)5$-^SÇÁƒ¨qM¤F’¸Ä¢H¼'Lô2…‰+ø¯%ê X\ çrÔòÐØ5ƒ@Â4AaÇÃQpô5²¸ÄsHŸ«Qð?ª¦ÅÔrÒ×ÜIÔ8o`“`Úp<ö﬿¸$-H25œ!W -âýö†4“í‚u[ÉÌÅ!ûíŠ&S#pX,f%Ôàº]á$j ÜmEö[²‚®~$jøö‚󯩡u’¨Ñ€|$ÿ7~‹8d‰\¡Óì/`Ç`jî$çÇAzu„ó7ÔàŽ }®á wû£bZJ ésW‰ðÅ9WF ®ÛC¦Æ¬Ì~‹Ë@c¨q€‹ ØÁßñ¥ÔÐØ®5Ö‹ÿË—RCzÍK¢FaÑ.+’TH3y“$‹Æâ°+±câ²à޹z¨Wse\“ƒfîöŸRC§Ä›Dõþ#Ó~ †fŽ#Q! Ì|~ª$il$‰š€€¹ñêÑ=ñw;&z\ž¤±qX ¸Z‰—‡d ò5þÆÑü’5Òùôù³Ûòƒïz¹®ç¡„põüÅ©þ5Ès7hÇ44罂uK@gÌ ò[4½àû_È¿—s R4ɹ&üA€+|%Ôà~»aSc~»ö¥ÔàºÐùÖr%Ž&në–#QCgLË#Ї°¢S"!®Y-¢üþ0þRjPZ< hNË—þR ¨t"øk¯?Z È! 9×\ b%r.ETÈGÖ°+‹Ç$ ¨yšZO$Ög%ZQBä¹;$©Úp”÷¢Ôžó/¨AiqÇ’¨qXÄŠô¹„È5wHε‘^È•o )pÇÜ‘$jÌï“%?SC•;´cÚ88Æue‘…”€³¾¬¯¿tlkî$jP.€œýÎÍ^J î˜ÏbjS,*ƒÀÿjß—êpÝ„ÅÔ€~ñDྻÇHÄâý[J È_Ó»`WQI@öÛM¢þ³õþqlpÝÐ)ÑA`q+;%PdáF¦ÆÞ^àJ¨!êùÈ:žðúLó€$U|‹"Àqó„" HRupÄÊ$UŠ=PóÔ>'K©¡u»‘©ÿÂA_B Y"ˆ0–èó×þ¹$—xÉÔè•iI(.ñ © 4õ÷y&I(.ñÀ¨i~•W$Qû§VGq$‘óïÆ†xH¢ü a[B Y"Ohݺp$¹"I•„ô¹'tBupœŒfä ÓÄbà¨åÍÂRjpÇü í` &ÒÏAIü;?UЍð•ÙP)ÈxA—>ç¶²¼¢¤<8so(ª1€Á½=ÿðˆê‡±¡Ú1&p¥VÊ·@VЉCºÀWÕHA–Èâšð¯a|,ŽàÉÿW:U zVã[D½ž¿¥†Ö és"øÎÒJx.%. RCQA Î#0hE<‡b"¤S áLYüH Ù”‰šà·2K ЍPÐsC„ ƒ]É3 )(¢BáIÔx,Á»jIpÇPÐŽ"]VøLR ²c¨@2õ %U ЉPH5û<ñ›çK¨!;†"¨ žÄ?>]J ñ²D†Äˆþq--PL„†´ƒÜ¾²<“œ(©ho25 »¢™CÚƒDí÷€ã]ïæ.¥w íO¢FÁý‘+’T(&BÎSâWKAù´™Ú é‡À¯„â9ŠL½Â(V ЉÐ25ae’* eçО$jÞü‘å_GïRPFíK¦& 1H_â_ûçRPF#Qq`Ü‹üë¼¢dÑÄïÔÈ?$è–fc¥º@2×±b%ÚÄ5(z7B ]±œ+â9˜­q‡¬¿Ò÷g—kÉØFCþšå†õ[‘^ƒ|´+‰_ÙÌ¥ ŒÆ©=°¨•œiÈó@ãÉÔ<‡ƒ8ÿšâ9œDúº®ÄHCÖD¢s+TqÒØ¤*4|%YIi(Å@37†£‘.+{[ŠC185G\Ùù†"I äõ#|à¨Rƒ\àHÔ`Žç ~xÏz×ó5 |[…ZNC.¡†¬ Æ•DíÓ€£þ`O–PCÖ4Om‡€ÿ!>XJ ­²ßÆ€sŽƒ{ÿÞŽICÖƒ Q{ p+ã9d 0 Ô+“È`ˆ$j"be¶DÒç(·gŒÅ¹cQÞxø¾T¯AçÛ‡LMJ ϱ1ðåmÊÒ±!žcÉÔþðÀéT(S„…N¨ z¥q¨4ôÜßò[LáÞzíî'jЖøø“¨Qpâ sš5žLÀƒVt¹W –z>æ'Qc€XrE\ƒl‰‰Ú‡‡gåwùª%Y*HŸû’¨¡3ø÷\“tªtJL¡Ö~ †fù-¦žHÒǘôßj&HZ| ÍdŠ$¸Â‘¸ì· ¤Ï} ­hŠý‹´Ã¹=ˆk5Ž@ôø“R^B éTȘ8|‹ýÛuCQ/$-fp|ešIŠjpÐŽ™#ˆ䊢9(.ÁAç‚ÿ^‘^“‘}&¤×̉xüÊâP(ªÁA'ÔÜذ•QKƒÏj¼!i±€ƒ/2 Á2¯<ÀiñC.'sKß…â1×ïÔ†D×ßN 5¤ÏýQ[#1 îù_YA99pl<‰ú7/ÔþblPZðh5I•c°œM J ž@¢ÆÂ,±hÀ2S Wä²Iü%ÔÐÌñp5Ñ SÃÁë8-¥÷OÚ1ñÇ#¶”kNu%q F…~%º¬`_8ìo5²Œ<¸cxÒŽ!]=Ëû:¿¢†xé $è à @€ðwë–ƒ¸æA¢ÆxÀ}°8Ä_û-²Ð xÈ Z €¸Â{%Þ½¬hÇðÈyê?¿¼ôÝ9ˆkP¦È|3û§—©–Ž í7–DþãÁ?PC¹½ ’¬I=ò{XÇs IP;xà¿SÿéÙâ’±!ÿA¢ö¯ð Sq虊´c8$ÌŽñþ{?Uò‘ñ µ ˆÀt(æ¯ãPÈOõAÏS›‚Ò žp#0²B-c–¬zÒƒ‡¢X ¢Û sزPl€Ç‘¨G#V ©×ðÐ[~p” é1•>¤âËÞRjH¯A‘……?ø†éJž‡ÊBOzð5 ±¢ì»,éÍ;ÒŽù# A¤ê/m‰,ô¤ùk [)Õß¼›³ÔoÇ&@šÉ‰Æâ„ Á29¶8Q l Gú¯ì©ƒ,dC ^$j/äŸ=ô%úòzA$jL|EšIzÂE€xné ÿóvÿ@ ­ÒÈ–Ø¿xmo)5ô„‹àM¢öFü9¶XJ í–D Xƒ•1(š#@öÛ8bH78xJ,±.ð_,c)5´nÈ[®"~eÊRp$jœ7bE± ¬ò/'ø둃žôø!—£¶²àÿCl é5(Ke–¯¨6‘@üUšéÏzÓÒç6 Ã?6ô„ãþê׆rrà®@ˆç¶ ÊÖÊžAÞ}$©v+~MÊ;A6Ô‰v»øÿÉëùþÃ^ÒoZ5@ð÷´PÅ.ð×ß¼xªˆƒ«7ÂÀ1˜úIÍÿ8Ÿô£ðù²nê¶–ZN&|ü0>ð?*ʤ_•”¡J'4‹ëÄ!IEPøH?GFZ(ä…À¸‘~ •ø¤œa8°3p ÁÑB0Xg¸"!’êËA?åËTà]á°ŒNˆ“[ÒMdÑÿ¹‰æzäzäzäzä!uB.•ÄGúå±²2L ¬YBfðüÚàbP!“…¯âK¿J,ý*¹¨òL¦ðI Jñ/ý 3´ñùß ƒë—AÀÁÉt?ý çºèÇÈ uú—§€ðÀŸpCU*ŠZˆÀ´DÂ…X4 …ÿ¢*ðogóóÈó3¥›“Sñ§òÿeÙ¼EÕ;–ûÙ;¹ã…2󳑰—tn“ªï ¸a NRß ×¹Îÿž>ý àLŒs"ÿ#6[¨4AL }H5>ÀJ/Öµ¸ö$îAbÀ-KC-sRu {1GÒñŸîˆ“î@s#‰'XIÔu¡|4YàøSyh`hv`%peo/x:Àž¾p,ª õ$(%´PÌ’T†ZTU^_@Ìá†ãÿ±èêBäbäâ‘N?,ÞK€´(WOÜ|¡ ^Þ%UlÀ6Ê0òD—/Û5_ôà ƒðA¸‚þI¦¹ñós€ª~|çÛüŸ; -Žÿç‚þ?—ò'¨XXšÄÒ¥-ÙYˆ)óûÝÿ鮄㒥ô‹·Œôå?\²Ä?ºäeëÑüjlÕå†^fØŸêÑüJdæÏ©˜#T‹þ¥Çd#‹ÿª±ä2%ÀƼb¼Š?/{éð¤F4 Š„¨ðܱmàOqqYRQ%öÁ™Ï+4_b„ÛmiuÒÙU]¦ãTˆÂU f’Êj å«…ÁRÈÕ?\¿—þø^Óâ×À=ä:*‹óÃD—» *¨…ª†ä;KëíCF»P ^xaPUnÌD„,¤•(.'Z?HÀRÞžŸ™°Ê¢b,ÀÖ€JâûNñÃBB~¬ ·¡øRBñ¿&”XJHàÒº}óŒHHe ÑH<NpõTŠþ§êJßÿ–Pha,þé÷ÁÀÈç_$a"?±ÐùBq¡_ ¸h§Hc-9Äÿ/€1YÿÑüéê„ùþ£”„Œôø²²ÿâüÏã?òiðƒ  R zƒ&¸¡0 ˆ° 5¨ÿyá'Ø…Ÿ  ~‡¼ð'ØRáÿå‘V»võ3íÿ ì˜ `_+€]ø æ„qð+ØØßƒ.@ÈKpþ¯‚.,‚>Àãö€@+s„ .¾k?>~é’ð½@ãóø…¢äJºxÒŽ¢!IqAÀ -à ¡Ýð@úÜ&—†ùà†èŒM,aÞ B ÏŽ$ÎãâÌ×-åY9/Û$6@qÞâ©þºJè_~‡œsåþ¿Ç„ò$ß+5®Ö䯊ÉÂîõ ËñaI ÇbP H-¨#æKªú{"]=aþS’Zp$¨(?N K®¡LĸBGVQ7èU¡ù¨ A@×Ì— ÄCø"¤®æ¹ À _è:D>Í߯{ŒÆ#@y!w@*O÷—‚°6HX ßRAðʲM!lËŸ!Õ+é68ŸebÙ¾ICÿ‘`¡Ùè†?Ìëç¿Oü>‡œ lE ‰¿[$U+ă/«‚Æ ˆŽbªx,÷ ü^¶ ¸PS•ü*8 •xÔÒP3ÖÐ24ÔÒ“‚¤´bK #;þ"$ ¤¹’¡óçë»ä¸£à`æê_ÛPMÇÉÂRÍÖÄTËJ9ügc¡  _Á¼×%ØÁMBBùL¦[h!7.Ï—@ÿ¾4Wp~@aqñÜDzG:.Yõ¿àÿgýRÊïÌÿ|} YÈÿ—“–•–ýIÉñÿþÅÿŠí_(¶Ší;V×ò`l+–>#!Ùÿ`|ˆX”@¥«iW’›ð+ÀŸï•Ó—Im‰ äÔäÐÂ!Ñ%ák‚…ÓÝçK/ƒ^¸ïŠ&0ï•} à µµç?@.æËb“ü÷…ÊØNp<à9(þ8¨Nú|ñjÒ#;ôb/ŒÄŸè?9¹aA$ÅŸ–¹~dÆÚ€ì"Ì{SÐÄ¡^1‰y@oÒ€þ=0'è8ý0‹…êÛË1õ;jý|3°?îO†o:"Çß;D€©V,ä%‚Nä’Ý@0Ôª¡NòúŒM D%8ô° <6þð@U°ÇÐ@«Èbµ¢¢ü¿Å˜_xÎF’/8¯=¬F!0?àoÇÁ Oò;—“rÒ½%3¡ùBL¾1„~xî6ZxôÆI€§k©§ád©|P7Ô"Í b¾Ë厛l™¾wº(Ú&­ÿ¯;Y|ú–aÍüaúÅQú~—ÄòËíÂw•ÿVÁGñÿaï;šººÇÝiÝ #.@2DA# “€ "’@*$! *Î*îm]¸wÝ­uU´îQ'ÖjÝUQ­{þïx/oä…am¿ïûý›ï+¾÷î>÷ÞsÎ=÷ Æ&vãéTz"ˆ)„‰íªÕCÅ$ nðf^ŠZi2Ó% Dª9L"ZöÎé¦t“,ž'|âjÁD;°p̣͘¨f€«Œ„fš™ZxaeÄUàÜ`êÌÔAá~PãA4ùüÂ.…ÂfÓáe}Rl Sz2«¡ëRq!ŒÙø‡Å$¸ñLl1‘Õ 1÷ 8:¤§ÓѰ˜œY©ƒô,eH@£úŒá¿šúuŒ³ÐrÉ‘¥¹èûÒ»Œ¸¼dXÚÆìÔ-²Öôö¼5(–ŽºýE€%p° àŠRÕ©zºÜÐ…h.ÀfZR™I`6ê?Èt–ÆÚÐ"ê0“]HŒÈÅA¶‚If,íÈc„˜‚·f½h…µÓ¥Àƒh&¼å½Ga»àØ|âSx„Ū»vì ?"¹H"‡äÈ!‰T„DFI„xaÓ¹r‚'g–`©¹w½œŒ&F4úš©ÆW&ôCŸ’kSÛÌ…³Ä©%§‚QŠ5e<¹"œ¨7b Iì ê;šª:@'Ò¡0¦ã3#È‘TFEÒ"bºHbÙ[z“nTMˆ²À…¯6t¨¤æŠMè¶nè\ÿøˆªä)âVÝRÃ[?¢Ëµ’gðNN$†h=YÖ\‚§eªèSNGì]T¡endK'/ð\oE6lá~:²+§ð¬)G—™4ƒ£V¶èF)ÛŒFYXße¡„ì|´AÐú–HÌØ ªƒ'-že¡z¶)ú1é c%1Ñ+¹¤ÅCñ&„€L {•ÂGÙ„}©}èJÔ K s“#zÀ½e]PãX¯ DZj©9c­^®µÏÑÛ23ÿ˜ ³ì[WýÚ•ÜÄlêoE=KàÀ8x/dÑÎW:x”ס˜Ñ™zïajúYD\x€àÔoæ^D‡¿Áu6&RUŒT\V{u5±¤¨¢CÖq\98‘¹l´b°f )Aw‘¡6F–:e€¨6ÀF¢O®ihÁZº–fkz`ÜÝcî8‚ü¤íi°®•ÉvkCK8)Ð(Xa¨-›í 3H|P¶8.öœ‹ãµÅ#Ù¶Ù–©>Á}c+GùOéÝ˶+WGmwÐöŠKzb=qÄÐ(úÂÝËRUøæ9'’É$‘V'©L­91Ùå) Š€ˆ@*’(üm$ÊeÁ¡þàf¨§~*µF™žbæ*!õˆê ‹mNLfè' Ñ­ !-ÄRX4hdÛÖ….ȼÇ0Ç0pá\j¶z"B°…Ý”Vºã_æö餅³Q„HVÃÆêÀË2*¥¬ål+{;;–Ê"–‹`:aÜm+©¤0­±„dèIi8T´Ñà‹Në»eþì\~6Xâ¿¢ÿúÈ÷þܪq%Øÿxù"ý¿Î½=½}};uªÐÑÓÓ·£×¿úÿÄßßÉüÇaäþøqÙ‘E>Içü J°ø'kýÁŸ¬öG/\N½?XôÓÿ`é¿ ùÇxyTÿ`ÁOÖýƒ…?Qù-“öZ‡ŠPŒû„QRž7ÏÉËú;ƒë×$ÊCyЪڎDk¼þî\®>Z²?HÔ§¦¦Ã°„x^ÈñXôà *=\Ÿ¤j)ÁäLSz"Ô*Ѥ§¤€kÝ>´k±ƒâ tÁý'€cA¯…{.=°©A#eGèƒ*…XÇà˜dp8Ò JiÇè”Å8 wñ )zÑê2ôƒ DÄ »(Ü+lbeG4”IJH`kÑš…WJ >Z VO±HÄ„Ë#Á,Êx¬zݨ`_™™_R` 2c™‚*D Äá‚âp±"ÖÎÒO rJÒ” Lmyž|_~G\8J)³c£X»ÿ”þ¿J›ôÿËDÿ;ùxúÿ”ýoG˜ü/ýÿ~ŸEýÿ_ €-þÛ-$"…ü/–°ŒtЂOmöÐêhvô’™TÊ2 *¥,j£(!ìaݘ*¡¤v ¿"ɸš‚«L\JGh9œ,‰N¥V!(Jh!p¥™iñwØR¨t\_“Ôf½ÁÌ‘ Óƒ‰×‘3«£w° pÐÎÛ¨"$ÂWâ n0]‡rø>ZFíÁ¹(8‚»B¤lÕ )j6xº¼¨¶˜Ÿm¶(ù”&uŒÊÝtT«V)ì‰í#P(¼½ìZ§£^ôK¼½ØC¦ÆÕ#î%LpdŠ 5d =VïñrY4­Oè‰9¼½‘2è|_Šs³TTT!cT‚¾ÀJ:!IŒ2©*¥ô`D¸q¡FÎÊ„rFMB9–ºø îA?’0™‘Ëe#ÏYìÓÑÛÇ…³2¹<4DÊüëóAà ]˜: :¶'’©á¡AÎe2¹¸'£FôÖè‹ÁOèɰ&ì¦é…—ÜS XÐ]m-q4P™‡1V¨ÂGöKBõnË÷!í{„úBÿB\œ¤ˆÇîÝÈ$y¤¥m€D"©¶#zÐëêA}ïIÿÞ“ú.£—Qcˆ 'RÀÀ‹%¥O˜œj¼XŽ¥ µ̟XI޽PÍÓ“"˜I1ôžÅX¾+bT3àÅ’ “Ò È¤Ô2 ‘ {m KRŒW'ª.ðbIË…Ëðá ÕŠ‚ÞŠ‚6é)0ðÂH‰ÇÀÁ) àlM›I153GR aZàLŒ”LO)¹ÀwøBAü,)H_”L ¦/T·dÑ´n"l©+&DFÕ^¨ ˆÃ-pF/Œ$=‰¶Y–uCj2IHßGBj8ˆh’E0µÌŽÌO’RÓ ¦Mˆ+&H(ÍB8pŒ¢$ƒp…aÐ+ ¿`ÔÁ]0Ó c9 ·8õŽÉbQeËTŠ‚qr†‡'À©\P\°H…8$]¬99§ë&W‡ÊôKEI……H€Üu£G!í‘ö9‚ö(ÀEûFJDb‰XÜ/ƒg™(ÄÉšãAYc”DŠd²H8÷N!‘²ð‚†Ih´£¡Å#Áj‘ÃŒ¢`E¢@š…Ÿ:b«áJ’H@¢$=ENVF·ŸÁð¡Œö®¶¬ÌàänHQfÅ#3cÀ˜:sæR‚ÓJnbYš)õÀ®•¯žrŽÃhü #°Ýw›ÝÁyà¶EžIs[î|ˆ} 2’zÀ,“èt“2IÖ+#?¿Èµ©éŠŽ_è+r(ä N¬²PL¤S•^•-b6ŠÂ¿qÁ¡!mC|q‘”hÑ'/X¥Ð–G¤¹ ÀíÆGóT¥ +"V4Rª@쨜2§I5ÄVUÐco¼ÀÊ Y½y!—™4wb¨qP?*ÿÒ’¡b´òw%¢ Š{xH• Õ YjøH+÷+8]€õa½Ê`7Iƒ•ɘatÿ`ÏC”[h☠W<8Ë#ƒÃ@}"eB^f4v.îÔЗW„ LiùÝhÏèö¿\€l^2MJ!á |’C¼tƒ³Uµn¼vDNPšl+X¸äy°Ú]‘é(t6m¶••ê•!|±±s2w×|YQvD]nhàV#"®CÕæxƒ0%‚$' ´³¥Üƒ£~øÇÇ)b3ÚÇY4ÊTm 4ë$ê`O ÍùÚnÏ·Ìíù–Ëp‹$9H£šfHl.åÈVD™²)&[cY•6ÉŸX©ÐÉ5Ëõ·†Ë·>l¯.UQãrJFM nªLcD;”¿?'SúÒ°ÒéµZqnjõZd%Ø` Ëv”¯hâ“E,EÎút½-f/å–xh5Μž³™£¤“LÊW‹Ã)*‹› ¦­ç'‚¡tPp3aÙL§`ˆ¨›Õª…†¦ÐZÛy }j*`šÜ‘餒ðªŠõ—͈ôjMØB™z[l¼±}ŽR¾ßѨ[[ü­‘µPnÈRN',{°?C\ º9ÌD^þ '|˜£Iך’!+``S›סH‰Ïˆ5”° Ÿñ©<À>2­˜É-Aˆ£¸¼W¸b1–mW„DpJ4lnw@ˆ"àªÐî´rÐ^ÞV±™éð­RkÆZ€»!ƒ&€©f)j3I'qo˜{#DßW$‹tnGJw-«Ê’b‘öZ’ d™ÜNà‘æVž’sCîßPQ)e 8s†¬™¸¢jÇX´9ƒr7ˆÜíÊNÎXâÍÙ ²4¨ŸÑ\CW"©S@2²yDbK‘X-/9Âî2+„–„N¤#Œ2íRb1Œzh P6x¢ÙgèÕ“aI,)¤$91E­Ô¥Öç–²ËÁTJòMt¸cÛãÈß~…‡£dZ˜È y4§d(ŠÊ—f„” ^œºñ”J0ʼnàȾ•0,-ÅÒ,•¦BÓƒ‰°ßˆ/FâAK¹`à¸VC Æ×TV.Í„øZŽØÀjCajh>Ì(Çšä*èL™‡Á­Š‹¶5ù£;aÏÈl§ #ÒTè¬4‰pËñu&F£„™jB:ÍŽ­a!¹+Ä«ÊD3öü¨Òª ÏYè+ b_Ü Âõs–…âSaÞÊpsƒ×€¦¨íÅåĵáÊTñ€QHbpÎE^Ì ÄLJÚœEƒ/\H`o‡†ˆcDBy_ºŸ”R¥Ñ„‰"1h¬yIV/š„y|¨H Éâ{‹…Ψ¯°siFV¢ŒJÃë‘™) ŽЍNLdÂÇ&¼z“ßýÉûˆß Ðçu°l‹§ZÚ ›X/´#¶ÅA0®ÃJÓ©$°AY.@P!|ýX26°^ ìaaDJ ŠÝub—Þu£ñïè´DNz!dõ›J°Ùubgý§ºŽDZ8—ÊCXe°= Æp(ÙvÿG´‚X¬=ìýè@9ÿ@?‘?6Ñ#KwNÍ<.«ÀÉëí°§p¥„ yr>Jc~’T0@ÓÖ!Þ·å hℎFu{O­Ó§'%óM¥ŠÀ-f\äÁO£ kPÍÄ)SÃëð‡åõ&/ˆDu¸œ~Îã±å §[ ÊËF¶mø"aŠtO@HúzG‰äÐ49^+¡.âÀ锘•‘+8\ —SÙH8ö¶ kÛ»Xƒ KUÂóµ݉›´©Ú°¢+üLä²Z#“‡nT‹LFswOîöþæ¶îžLüþfŠK%B¢“}o…u•˜œ.(5îiZa0ƒù‰£ôÌЭ(ÓO Õüsƒyõ2îüLÎn¨­³…ÁÖf6›S°?î}Mà(®êçã‡OkÉXG¨)q!Óo´8! ¦‡J` ç[0†$s²;⟠ĮL„Ž´¦@…$ªˆÑWÑÎÅ´†{LDaƒx´Z"8'«ÁƤÿ=“ð׿À`¡%ÿ‚¨ìË4¢ôeJÛ¼%-IÛ»Ùð¿´•ÙËèÿȰ¸¦>¦äyOȂޓ’´H êiOù½Q¥†M!bÌ ÁDöœáTX¦ëUÖ±Cz1\ §ïéÛC¬ÀœŠK@™( Øã^ÿãs%”}“ÎR5P_M£O7ºÃɤf kRX&Ç 1B1"æ¬Á¤ 6y3b=“ÿµûßrÙò Pÿû†HÒF¯Žå ‹\}sæµMgüß…­ ö°·ÜÃ7Æk—2wèÂÎîéUb~Oš"/Ç–RÄ(lo)¨/åôàj‹M£ÅÖ)•_#Ìm P`Ê^úu4›q)óbc¦>'Sžø06ºR†¦ìk™k=S—ò_&URÈ’'†ÎRtð6k_ó9ˆ½Oyx7Ê`CgÖ,ö!踃´Õ tøìRâê…æí%ÃÓ—…4÷”€}ò—‡àû)cè&÷§{6#ÇUj¨4öY–ÚLõ—‹$Ê¢K ‰É(‚\¦C¤w\Õ£¶0rè¥5gÁPˆÐy–3@Õ@x1’¢Ï„,²l³7ŸÂ¶™y6óBœ\ÎüÈ8£¬|‘ïÿ8_„<)ø—øp¹ –†®)À"ÒZÂTÀÒ4V˜6óʇSð_wr¤sŸyøw”ÿŒò?Êì~vœ!d 4‘gÆäP…%3>`÷)þVïh’Ö”Fކ©ÌPjS à8'Î^±ŒÇhuEaO€®@õYhH«å¨ˆäx,…Ñe=ó`­¯Òlú€@w\HEÕUªq=Ò1Ó$Þë3 !‰Ž1 5¨q©4g$¶ºmË%Ei}·¶Ð¡÷žmûOUÍËf§¬£`ûÊ@=¶R1GüyÐ:×Ï]ƒ¬ªâÀ“‰Ðw‡Ï‰¸ q<'KìÔÏO#Ìa@œL¾3ãóù¤2‡z°ÖììébÕ­òyê@=G'güÎÔÜç,¨R›•‰ÉÈ ,C®gøL|ÂáɃ…,äÀCïŸrBÆË΀âCCå9ð†‡@¦qvµŠ{ˆÉ80:Ã\ µêˆÜTR­K‹:Bi–ÛÚ•0Nζ«ðïï“ãà'|ƒJóÏøÿöõòô&âtîìÙÑ«BGè Ü÷_ÿßÿį­TfßÇ®íÑÓ–Ûuâuäé¾²ëÚÕ#‰‡x¾à‹Ì#D …y!ÐdV¨†ºœAAб§Z™j787/öŠîö±/²_õñ™ž³ªa´Ç /†;üô$9#okÁ„b‡KûG¶s™;ñùôÙy§;‡µýsÞ·{Ÿ8eù-¥R·K ^‹‹Z#YäšíÄW:ÜòCÀ5ÇìÌ3ß½<ÖöUÏ%Sç }¾ÙöqËèª_ ßÒ·åºÌÆ5ýj& VÌÛ°½gZèØÇÇ‹ ùíêÛÄž¹ý}4¿ÒÄÏã+³oü8üÐü¥i¾[_Û~LAçÓ?ÆÍÉÅýpÇi]†ØoáÑ´6kϼÊXð!õÅísWWåîŸïÒÂïm]T¿¸`aÞ=§Ÿ®-*¨¹øþ­^wåÝ)î%ŒZòê¥aî]èÝÉ?ÏÚÑòJWm~7üÖOܺ;·Í‡O »\pÊ;ËuwãE©2…p£"`ê¦Ê;æ}?2Äx¾xßãFü’¸º¿þî´+Äqèí÷«×æçÜÉ{'¶šw ¡½¾ðî«ü”.¼9Wt¥Ùš¡Ã}?,Â1ÉsJëi5×ð½ŒÅÆÙÔs|؇Ÿ îþ‘š_ÐDÜY\ٱْF†cÞpôÍÕôŒâ¹{Ⱥy­±uÇL¯ÍíöŽž’Õ²Z¨½¹¡ÆçA`Ò²ž­ƒ*ÜLL­[íä¼+;:xÍXѪîˆwÞ1õãÜ7ᣵ³QÔW‘ ?í>¹ù‡·>öšÁGìwÝö§w•‡N=¿ß~ñýÌ ‹ïÛ=ÜÌoe¯íoêÇM®–=¹ÎîJE?>Yÿûœ¨Ô¾íß|QkÌ”ÂìÁ#jÜ;;úС®2‡_—tÞØyù²ãêËwTýÅáé”+,oõxÀÍ÷ªK •G~?–SÍ|3ûÄ®ô‚VÇüfŽjwäÏwâÞÒC>•óBížÕ»\'ûDö¥9¯~Qxá·w~+0†¿|ç¿þT}·ä°æ[öoœÛúññá›îZ=JšèxßÙóD^÷_ÿ°É´òl§Uc—çߨ8â—Aù /dÏ?³ìÀ6ã—ÎOÓD»#$ç_Iœq÷P›6!¼ú7ó'û9ì‰qŒUe]h°dÔñ?G¬]=¡ØÔôÕ¼!Qw‹Šš½˜ßlââ[!+‹ì·¬=[sáï«î5ÜíZ̉ÓTWΪ{*!Ÿµ(ªj5íw\<ÂÞ/šQçýôÙUß?Ûuòx¶çw Çæ™Qñì ñ÷ó6v[ÑýÁðÚIãN›Ú»m>t.þjL­»ï Yy²«<6èeß’ŸgŽÜñxpË—&ÍþÃ/`W»ŸŠœB.È=º|Ýz÷CµNø;6ݳ¼¾ýÚ5*ó›/_Þªx¨ÏãS^÷Zi+´Ž»>«ù a;ÏLñýzz§Ï&œ_:zÂâ=³Ï?»ÚYû£ò~ãIáw¶]¸ïÑ ù„‚Ý3Fî »Ü\^áÏh»° Ãƒ]gÞýâEð¾WË6?É{oªž¸CTµpö y~Fåµ_yrÝ÷Y W„=VοZ ~7®þ ™ùæë QþüsaÓ^mqáíkÛ¥êì÷¼uxON3ö ׂÃUÛ¬¾W}ÌžÚcí>Ê+ŽÜX4õjêâÝ&‹Ne7ªPÿÝé¡Y-¶äÞVu¯nÙõcz?‡Ü ß}’¹qX€þ|•;K=ì´(¼/kÐuIØÑŠƒÇîP±VèÅÆÝÄf4o˜W1;DÑqZìðc«÷ØΙ¤íݬð.Û¨iª½sÿ¬WÃO¯ ¬¸eñ–A•òª­¿cŽý¡Ä£g/Ç:9´(¦ÆS/»·Šz³fÿt°ÍÏÝVÔv[}¹VgêÈCoêp7øi‹Ñbš[´¾1ôûV›³6§­sªiïÔÞ~h®ðñ´CÇã}³:í¶ðà#»Kû’Å}õ-{o©9Wͨžr­{ó·£fÕWoz2ùZm—¨Ê!mîÿÔø|ˆ8¥rQù=ó)ß-º®èö纹õ[Ÿª~¨åå¦Y1]»§O“¶ßÁ±Á¸……[ÂLc~êµ·ê it‚hÃÂWvMÏj¸ªXÅÛQimSÿ CÌÚé½gÿ¨]­ølêÓÚ† ®ÙèJêbå(¾ú\•£U~6trȨ®G_¸ïQ´õ¬v{v¶CóÉß÷Úy£ÓñWžÍm}ß-ÿB½§²­,ØîÞ¼Ö´êë~-öÉQ厷¯;óJƒ1§/÷¾–y-üôMÇ”ÎùýÆTö’¶|[ùw¿ÏæJzWw®âí0.üù·“z_ü>oðùê5^‹ô/ƒšf\¿û`×½K£k«z­\Ý[-r=\t¾]õ¾93««u9nâëþzåÕüºñÏüÙ?&žMê$ôš$hzÎQYÙx´mtÄÃ~šJÝF:Þ/ç5s=^Yj8>¿kx÷Üy3ö¹êë7˜|â‹Ó´Ó.êNí ÎóOÍØ¾tSÀïu9Á¿]ú,þÕj‘Ï@~­j=¯/U¼Û­¸‰&éd°Cî §-íåòöá¶ Æü²ò ïöómÞz;ä— ¼~£²ŸjÇolµaÕ´åñj˪¸ÖžÞyØ™eÕ7ù´0ªáÏ?ï¸6à ÿçåuÓ«:½ÿš5Ù7å·;×6­«ýx}ӑ׃Få^Ît´m:+3+}ëÎÝoçTJõ@Æ9GçvIôOˆÑX9òÛjgfênµˆÚ°qªlS±f¡¹EѹÍUß„43æí\ð&H¦|ðþÍ5·üW]ü–t\»õDµg}™WuWò„Нò³ÏMjåÛBxÇþ~DòÖRŠ»þ2®ûÄÉ/bÕºm56r¾ÓcõÅ¥ñ5Ÿwø©þ›3¾ßäVT?KÞíñ²Õ±Ô&W³Ý×-ºýxdyë<þ ÿq3û9o­_ؽÛÓÛ…ã´‹”»Ö*,ûØ0ÿD¤bÀ?Ü$ìðDz¤ð„Ë3/ÈxÆ´=rç\hºÆˆ¨h˜ÀïÒÔÑÓF„!IÈX"ÉÔhæ2>¯¢+ÄOÐᯮøHÒ˜Ö œf4ut M¤[Éƺˠd$œš’“͵`)8Mâéöð)9öWˆT¡J"ØTQÔP 8EK"sVé(™m±mj.~h.÷:æ¨Óv÷ƒ^Q•SܦMp¿õÄ:sÑSï_»L\¸ú¨_›Ü¹ªð¡™ÖÌ7¢v†›îÎs}¤[~çž——_¼Ì3½½bÕeæÓ¤/I_¾Gn_ß°+¹1ìÌö½÷Õc6Ì@“ë’“¯õˆÍ¹@4™§iSu°ê ©ür­y·v?8O¿m¯ÍºRõ´²ö)5'Òs«‘ž©]þöÜ­jÒñ±¿*Æ9åj =Ýrÿ}©ÿÜ­Š?ߺÔÎB­ôwô®5m¶N^ºmw¶j­LêA’’C¿õgR¨RȺµ¡¿ck-Pi6ÛvÈõï-þU°ߦî÷À8~0Ø!x«^bÚ⤠H ±ôšÏÁî¾zg¤WŠ|ÎNx”Y}–€o“¦(Ÿû(eÞÛæ|+ãgJÈó¼-æÝ³–ÙÿŠ>V‰ïÑ¹àŒž¦ûBI«ê}ƒãî蕟u| É»Ÿ­¨3îMél+î~—èm™7µ÷ľ³d=äê×RûIûE°™Ó ¬’ëߤ„S}\¯ê½M¨\Ô¾]»µ«í¸ªöñ\æ3TïÑ[·‰Wƒõ»Žî½6©”gMÌ[ÕQïôt÷‹ ^!3°‘·îÚ(ŽÞæ%q&Ð{ÉÇ•‰…u_ÞN™ïµùºÝ±Oùïª7gÅen V©PrÿaÛ£¤7ymGÄõà=?÷Fv-zÿ*gOêr™+çb$í¹¸úÉ£­§b=>êï¥[Z"D;Ru/ÚÒÎYίpØ•÷"òõ¸¸åQSk[Ü;ž¥Þö)ÆVç^÷µÕ ak_¸,ìê)Õúê;ýØF²ÌÑó ýGR¤¨Kß^úæX]­äUzA´ƒ>)pŠeòge©õõ¹oü¼ï !.­E÷MÓ4سv\¹LÌñûÙ“÷^={«Ì.f^Ɔ×DÌ.x¸ªK±ç FF³ÕržIhÑÍ.1Ä…[N)}Wï>|—\r»/÷³¿›¤ã­%þçnEö‹].={lß¾Úš·½‰½27nìdTXÕÎN1žu#$çúE¿†œ ƒ»]/Íír,ÅîÇ4…Ê,(\(^VqSýÓ–#¯Ó/WZ&Ý·Ô/ ђߟZò"ÉvʽeÝjª7–î~Qå·ÈÚºlLeŠÁóàäo]Ê+ /Ï;Ó¡ü£âv£AåzdД첻SŸ.WÙ‘°¿òháÝ“â%ÍÛßîßVùüübüËŠ}æ5/ÛÊf­»‘ŽÜl³1¡ÂçCÐú·ùø¯S‚”ÎlÕ X%Í’j» uäÞ­ÓHMgݾζC•O$šâMR¦‡Ñ»ßf²ž_tG$äX2m¾Ycÿöz3/òcj‰³ôyÂK iå>y‹³åâÚóÍé¹=q)©:¯›~ô“¨ÓH»ó½z›ZÚñÓGOXý^½KK@!Úîõ,r1:²Š÷¦r`‚Zá‘>êžfëjnVɹ; ß¡–r1RdÛNG%&ËE<÷x­nï’¥"‹Ç©jÍŽy¢pAdêUc³–J)›í©A3î×=”xmny¹p€¾k{`÷Têå©Ý’*SoÕ{Ä÷Uf©zËDZç.Ûß.*3‹ ¤Õ¿•¶Ë+ÚqúÆò“aÒ/1!ƒ2"ršK¸÷¿ô Ûôlg¹rÇåk¿.>2¿ÇñÞäõ%õƒY^WQ4=-©êÕ‰’Žjù¦Ì¡Òg=ûëNÍš¸DsáàªW¿Ö¼Ø#oÖNˆ×JMØjî¼Xμ°úƺM®Tkr–Èn4i›ï€wJQŸqwoè)fVœ£ž¨Ûѧҭ™sÛ+–(Mjx|kîºïKSè§ë®ΜS=`$»×6çùmh·Î†ù;§In–u —UU{…ˆùQNÛú¢`¾‘¾¬AQ&®.4hΠ·ayràÍc1Ô—NýPkö= uÊBQ{1FŠ•ûލ3fŸê´#Ÿ—¿œåì¹Wü¼¯ÒŒÞoÅ‘>€„VŠr^º·¬]Ì:nEÐ>ܱiõOü Òz·½Z-£Ø×zžÖAÙܵS弫(]÷^Èi‘w­]V:û†dD!ÒEnðlf˯iùÔF‡ëˆ7‡j‰Q W¿øô8ñî'bעƖ•ÞI]{x@-»Ò$#žs_äLÜʲS'ôFÎ7kš½Ù»Ð°QæLÈ`ØÀ9O¹‡µ&œ_êµ!±Ìâ|ßôM…Û|m.h¦”Ó¶»"&œ÷Æy»3n¿]ë¼·ïØ¯ÛF· ¿Í)5'vv”ßݯ“ã°W•2M6µ0ÊOåW/–öÏÜÛØ÷ÞFŸãŸüê/²Û2.JdПLxv§ô£ÙÀÂË ÔÓÞrɲ'z¦å—™oërq=f¿¥@?nNúb¶‹ùV¼±)ææ½o{EÇ)žÛó|:6h6*ëv»Â–…—?V~sÑ­[aêpƨSrAÍJk*&ÄSÃS»ÝÜ»iÑûÜc©®±¸K5ÖÆtýKwÖ½dŠ|ñR­y‰®Úäl•µ(«tKǶÙ@Qfb³è³•süã26]t]°ð)Þ2äXâç(‹ü-ó“dé÷¿5õ_Úw~-=÷áî«ë¾ï/Û*ï¾Ò?Ôõi÷\Ë«,Ú#V³II»epþó@†ÎjŸ . G23ªŠÏ¹¿ð8QûóSPæ¯âK ´üd=$%9…Yš•>ãÆMúñ!`Á&sÏgSc2¢Ÿ$×km¬Øs盡êBŸS_´U× {sq€aq?òúMK­ô¾ÐŒÞiÓ𬲦n£fØõݾ½WŒ>ñiÂ’ÎÐÚzß‚¯Ö8ª-½ÄÌ©¥\»Œ|­0᪟¥Åà&6\s~övùSCëÖ7"(öNooNè‹c›ÖG÷Ô2¼ø*Üìòá‹íÝÔåÒ;«×ŸšôtÉSbÁ@ÏÉ÷'­+½9«X, ÏþAízçÕµªûÇÖc¦W®ÅÄ”}‹ßu©^=Üòø¼…¯|t]£ôÃÙUw•Ý é3qªSųO*µ-yzÞ³.>»¼=è ¨¤–›ÇÊíކìw·Š/ï;º>íÓü¯AÏ6¾»c[Q1/wHÜ+|§äðÓ„ }ÛÉõR…×ýr.”õç2w7dZ¬ …Ö\>sG饛DT 5¿±ð¾ã~ÉÒͧ,“J.Uù½íŸ&ísòQçJ±÷tÍ×yh¯”JÙº9Žb´ìnÉËu×žî žŠxn½<ôò±(‹ÔÓNtƒí/YMÖyµÚ¡–ZH~§¿}÷âVÇø¡¤3¦;Y% ×.ÊKNÉz¸ckW˜~»ë3ÅìMi ôMk>)j{ßoÆšæïÎ Y:\Û†Xz­Øµ¥ jÏ.»™ëvߺéꪼk*.õã…»µ5aÏ»k4ÄV+.ºszAG}Ö•‰žÅw÷7õîü¼/'줆1s@j%Ùº»lª¥Ð6·~Cìú¬FtÕ¥ uQòRïÑ gžÈ¹¬oòH¯ò šþ3ÿuCÒõ9…Gž™6n—9up¯Kû6©qw{+Â,JRKÈüô,/;ñÜáC¶+ Öˆ*>žr' `NÄæ?>ğʾuå¢qh§í;ùZÅÖkjH“Õ¢È&m¢k6gg¨QSÞ«Ê' †ÅÇ-Ý£}5vRÀÖLJñ.·=uêöjZ[×»…Ý*imæ»b¢›ŠlùšYEö²“z‹.hÏq½%+ót²¶bZ¦ü;¿Ûrò[gÒEå¤÷Š$dZw_‘½&±Ÿhs¤j‚JíÏï颉ñ÷ •IÊ­ºåz‡Ÿõ{•¯Ð a°O³òÅ•,Ÿë{²¶ ä¶‹ÅÚdjcV­º¡ì]x#ýƒäT¥*Ëå6U*zs–ˆd8Æm¿™/ÉšÞ|~Ûx÷¼¦$ÉÃy;YNž‘Oßêª>ÚüáQÕÑ•á.¾y»íPÏkcSÑ™ûÍ­±Ó·ûÖÇùÒ=Ëû_¿üòõÌŒ ßÜÂÍ2š×ÎR;—ë!óÜàÄ>sd\×Û¦âÚš©ý†"jnÔ¨I˧ê-<Ì¿/¹ ´Oònñך &’7kÛ/¾š~¾kÛÄò¶›±UúêÍJò§¿Í3í¢§ÓT)¾Bà-FqR᥇Gµ=3$µÈ;|®ìç×åŒXß­ŠY¢s\ö¨œVaEQóoÌT%œÀŸfÊu™ÿÚøVùÄÏê÷(Å•§qe9S>Yîî‘Ly¼×¸þá'÷:E3ã—‹™å~è ÛjfZµé­ùdžufîÊO·xí$M)ö?Ѹ¯-ìJÕüxÃM¾hýoßßùXáÔÑgœEQ'-®xf¶‰„_ÛüäHì€ÝJ¹ÅçóZöL¨Á&†{7ŸÝP©|á‡Ô™Ã9>÷(H¯q35a·ÇªaŽ˜ˆ|úôÌiÕEMßfD[Ë–FÉ„C{bzûÎä4WÆÚGǙϲ£J$åÂ,϶li›·þu±álÒ§‡ÓÏ™î“~4ÏÜàÛ…µ—õ;¥#XçÒ';µõ¾ ŽèÕ~`´ùÅ}JûêÞS—ú¹åŸ›Pþþ’ô| rÓT΂CÇuŒ§ˆ»í×}}hVqÒÎz—9ž[P†gîÎ’0ßR.Câéòs–=?캯`!dÙöXå]«¶gY§p5ç«6EÚ Zܹ}.äÝ,ŠÒ–Ð&”_°7ë°Þì·K©{í™{ª`hnF»†é„ÀÂÓç ÀÀñ­¹]è’Ú®‰%MŸ+˜?âŒÆSŒï¦¯[ö¾x‰ iÿ©ùH3ÜùÉïÌ_ýHŸújÇÚËJ*ñµŸôkökm*Üì_½o~D=ýÕrkVëJLx¤ocg‚Ø/œßø/["]ÏO!釸Ì—³ÀMÍ1»ì]Ëák“¯0î¥ÇZß>¸c*­S¼Õì¹õÔÜŽ­ ˜ ˲¬‚ÝóÒÌýés¾Vú­­Ä=ü ™Ð ¦>‰kD¼‹¦É¬/¬gY¯Ê.ë¶ýb 0§ÁuŠÔ¦†7&Æî–Êi½m²;Ð?nm­¯YXUq9zµdn딉;|=~•Üï¿»:i0}íeÿÍIy…hߢWI·HÏ%&ËFmî^½'Pé§å…¢¦CŽ 1·ï½Ï/KYþyœwú/Üñ/?cƒVW.™r’Ô³îù¼¬ §“qQ•0Ù*<2ÞÖÍ!šø½1/oãô$ÕÞͬfƒGƒ›Ÿè¶+¨ô‘_… Xå}pKéâÝÓÙLùþ ·¶¼¬i»Ue´´ôá/ùo¿J_÷oh8ì?>皉HpIÊãß¾iQ-/H"ve>ßû`U ÔÁUŒ³Ûã+Z¾?”?éN¡Oú²=Þ5ÁÚ%*ã¹ô5Jå§kþï¯Ëe©PÌf­Cžœo¯ÜùD«LµíëD‡ÈV’¢ç‹:ŸRz»,m£ÒBù_Çy.оcv½Þ¾!hCwg@Á¥(‹¹¡‰wº}Wo¹žgYsfÊÝ-â»Ê2§/!vÝyÿÛDÉÈÅ„õ¯GMPlÏKoø|åÊ׃ÔG/ñ•®ŒCÇÊúÝþtÂ)djÁÂJC=Í›žªÅÆ^…VKä:œ_<‰éLÄlW<¹9²™qéú»)ÆZÏçµjlÊ•ÃçfŸ;éß~¨ÜEGLF®pw÷²ùoo%Í7òñ‰Ý/~i7°ðý¡·:’$“ì÷öÞš3UV½S?ùúšÎòæ8³’'ž…mþ]뻥ÇKU4ÖáŸ[!L†Ü›‰ODù§ :êôÄså¸;k/7—\í†gÂâ·ßOØÝóFX}¼{Y©¨UîàÅ=A3 ç|•Ž\=÷›kŠtâZ?ʶÙȨ“kŸšÞy§½ªú´¬î Ê”Œà»b‰è}*F RÝãÚwd‹›¨¹úxÑ8±HÉ)ÕÃ$ƒd.¬î*r@YV§h¿”éAy¬¾$þ®~¥–üú ©síªÓOܯ{tÀó~øq÷M„V5£u?j&ž)ò.U»·-wV_úä›é«ÓdÎ…|0 È\6Ñød‚ÝE¥”uÉ^Íí/˜/D1sK=Ð9ž3’~-°3²ì<Öo¸ýÑE‰=¥ÇµJZïë–ùö2AêØzÄÅÀ)wT^œ|£æ_mg¸äò\Rô„o¥Í_½=æbwÌõòMÓCÏ‘ÌE¾˜yg»y#sœ×¤ÙÆ?(ä´õ¶æMo‚µ6ÍŠMøbæ'ñ³3ý®aßi? QçYݘÌE šzOhš”#‡–ô\é}í0뤮uGm¸‡t}{ý¹5ôi­À•­.ƒo=¯¦>vZ¯ÛñêÆâU?Yﯚ[ºó÷q›ôðçÒìk-%ã;Ô oÿbý|Sðm[ª®Éx‹Ø–Ì÷{-)õ˜Íme/Jkgm/¿ÙÔ¨ñÁ¯ßÎÖvªá-Œ Ë~åÀË{× ÊfôãFôÏè/ºïÎZ7¥cü„ú:»¢å3òU&Oê®––Ýå"=s§ãÉ•òÇ¿^H}:'µûé€õô# $=Ԕƙ~½zBU~“ÈWéX[õÉUØÀÔ*ü¹÷ëx;­ˆ°Ûùv¼|›FÅZ±¯/fÝ`D­Ô¼.Ä3j‹é½Æu8õñ[m»¦Ù+±©#ƒ<ÿÞUâ™9Îò¿9š-Xyo®®å ·[Õko9i=)¼Fp”3°šº=·Þé®™Á'jF̣£å²Ýu ¯Ôtä~šX]?ì´7­/Y²©Wg‘N'ÁfïŽË1çê—˜ÈTÛNï]çsðÖ»¤o¡‡Öî9èÝ]¡Y\¤’¡Q§áUßìGöt!ûò4=(U¾—.Ë 9:çÁ„’ò5¯»nDÝ–šöJŽ®^½'¥ô Ìà˲æñ†%,lKå‘ð#ÈG«g7{5+L¸4Æ÷Ãk£î æŸWµDóW}yR¡ lô,¶äÊ—onW4úT®Øa ž·9œÔ”hmV‹ù|UúØ1ìý0‹ý;Ld\5dœYˆ9œrp]çünLÜÙÍ÷OIØ,]I¶ ¿¼¹™â6³äYfñÎ%ïJ6—M]­ ÞÓã­ãIëNV¹Ýt={¾£ä®sÏÛú£hÓÓuÔ }Œ2ëžbÅR­€#U¶;n:/ß±&»vV¯nÏ#@Gµ±à°ÛîÊØÖ·‹"óŠÚÖX6|¹´ `®ÖNUïs»»~LÜ^ õ®m3.§K™´9ðÄ:«}Šþ'hsû—|è®–(šñDnýF[r©Ø qs 2øFezcõ^õþKóÏ¿”1ïUdùÔ=æ”|o ¿„5¯œx[3&ü^&âã›ÂÌ` kÔbæu¥Ö%ç—9dõ¦%ï”x·èvž¶½JçÕÓ¹":µ­Ûê¦îýbîèÙùµõšW_Iø¿ŠHø”sÑd9)´ü¸bÏË­áeLK½Í–ÁOQžûè±›T³ ýêç/·þ7׿™¾,žÁòm(øêÒªØ3~}ß=­tÿ˜ä¥Óv/yìraÿÏ¥~¥[wÛø5ìË¿k樜gVI6Ðw9{ý¢ÿŠòÒân7^Ÿþr¢)H+«HVzr*ÿ=š¼¿´äØuüi/ýàøOšâÐøE—ÎL»×)~Oé*§Í˜”ˆdz©Äßú&ó–™ÊäRâÍj~u߯¨;¥t^Áú–¸GËÏù»™s>üh»Ärc¬ÇÊÿ¼sKí €öÁöõÍì¹âçÎw¼/2©-¿¡XzáØ§u«ÄïN½ú åý#D›ÄîÒ_ܯ¼gØ™aÒ8ç[0&õgܯ}´õÀ„BïJ¯ëŠ0{ßÙ|ѬXº?»w뮼Í/ªQ-ÏD»1Gf¯(nÜz«#îl`¦æÕï,ä$Ö¹ê`…»¦¨²ÛÁáÈGù¨Å÷óŸÝºåžSì8˜gí쿱Ò'`ÝÇ»"ÕæÎ1yå/u¿pÏ«\ýƒûŸ=?Ð;;ý¨_⥻…M×JÔg(„gczºíœtˆ•§¡_w@¡dšT˜Ú²ð§Í^ñGsn×rrŽí‰iÓ¼¿[Pðàñ£ ¯çG2šeëln>N“ÉÂlÌg˜H›æO P;œþ&ñåÆSß>^ûivÉ~O¶µ3ï¦H`SŸ46.>2Y_rQƺë6s7o)jÖJ­/ï|m2h³jÓÙ»w»¾Œè˜­K5úºÔñ¦hEæâ®q…MãY9‰aó¼§]ÜÞpÍÏx|Àíñö)’çs»×D\ˆ[ãçh7iÝ–ÔÍJ{̬ ÄùÆ™Y]1ý5WáÀøÁ{†×gŠ*º.ÎK¢Ìßü¢¶-Ë=·m®š“Ú×jºøä‡†ž=#`ÏÖH¹ã³re«ÁÈþmY«]í)×g¨‰K§%%÷ ÊÌ&´ÄUÅÍ<Ígµ–LÌ´Åʯê3Çõc­û%e­Ã>×Ö]+?ÿôô¢%ýŒ·ª2ϧßY¤E5ݪñðRú— n¯¬?Êô$Û ¢ïËò^jÒ°ÕÍ¢iº¿eüJ{K·Îâ£ÙšO¯Þ¤í¸»}ªq͹ÜÅóý¿>A¾~rå×Ìþ…¡÷uõ nοtY¡|í‡O2¯ <ûày'–‚©»"…»TÍÜé»dÞÞ¡–…¼ër¬ö%‘Ó º×fßÜÉ’«kÕI¥Òª¦R—“cOÑ:6O%x‹êeØlÉJŸU¥]ûüµofPPƒAÁT‘cˆ‰t›Ïã÷8‰/Ušô%QÂá|OÓƒ]„¤ËŸ'eÖ¯Ø&æ)ûvÛ£™_¾´¿×‰e¦Él«ZÿjNâׯv 3`mªöÉ#A:B“&¬^B·ùøÓ‰j¥6uXØo)Æ}ƒÉ‹ŽíÐ~í|UªV:»K{rб® mÀHÔÇ#òMKú²ê/®‘(ݸù©wÏÜ-}4õ{lYàê*^…ü@ºvfUí_ûÄH±òøãË~¼`|iíøÑ¿ºnY`+—0)ëPÐKÜ™¯ÎnÍ^¹ösRåHþÚ¡æ)1;÷S:^N‰ªrh¯NùùZ¤J$vùГêÔñÄÑxlµ÷Òáèœü^¢žYr—ŽÒ®âvBªáþ™MëŸ<µq>3¾á{\ÃéÆÉ.Ê©_7œ]¥Üîn“Vxy«‘ï1=²¸Ã«Ù [O¶ÛáN¡BÜ+ö¦÷\©­¨ü%­{šó™ã+vÞbÆ^¹Ø’ûUôNƽöãÖÌ©Ý7¢”>IUÜp½V$}géñ°:½3S¼%&v8;{.<òAéu‘âäíåê9¥­YaKn].µÝ7#ënúíôë Ký­ º®}˜ÙRì¹á©×öÞ×ç.!‹ìA< ²‘,¡VM±(Z±<%¥ïüéšj‘_©åç=˜ykØ|¿J-ñ+=ÑXÑ;z0—rÿv·ñæµ*¨ÏŸÝ† &•Y¨˜j=ÅØo?Ý´¼%gÜ©FÍ‹ÇMò.I|¦G¼ýóx²h‡Ë%çZÃÅígêÈï2‘Ñú±*°öÔ½öÜ¡—JTå³òÅ9/)Ê^]R#÷P=ò¥Ç®ºÌÚ·gsmwÖÌm¯–ÝÅêÎ4¾Å-ÜD u~|ù‡B¡H0!ˆ|þ­½ŸQFyõ‹™g¤Ðí—?í]ð«{·eÍUr‡êj¦éwyÔ‹ãþõˆÙ†mŒœ¨¡÷¸N8¹ÝJæ\˜Tx{ò'ÕIb[K<UU[ÈRsúL2Ó2.'>Øù&*¨BßtY`Ö”ó'·>Øö]·oWFºRK¢û\T\Ô.ò—µ‘1‰%GW¤®mü°Hò@XuÇkŸißIÏì^¼óטê\<¯lÒF µt«s6¨‹¤¾Å*{æì9ÕõªÂýæ“ÎE½» ÎŽŒüÒëÖŸn"ßNœtÅ.¦¦¬‹1aâÂ-›DJÂK°{rwk8‰öœ,Þ,j‘¸6×qãt—ýX9Û½2Á÷ê¬c/­8’¿3>%å蔵î̇$sϺÝk~ÕèIŒ“é>&J¸yÅëý9ù+´î|ú¢~óŠÞݡݳdp%¥i–aÄt犕iõû¥Ã³SPûïÕ¡'µQ7L^Ä­rB´÷½ c ­¬Xr9õó$\¬²OèÑô%»/‹«§kÌ™|‚Ž*-;zÏW`ÕqS6:µPîÛäƒf4®Èn[}ª¿?$ÿWÎ.ږdzöùìiïxË+)KbUO³”¼£ÂÀ≆71Qu«¶uéÇý©ø¼ƒþôe ö@®ÒÉϸ&µr¼Ñê=b,úáO‘ Á‡h¹æçŠŠZÜC›sÃ\3üĉÌËž–„T¢Ú-ÄJ¸aåggïVwÙÈšú]8ïÕqó9½îÓ±ÙÞß ¯7]ñbñ™´^Ù23»Ü….ê·D‰‰á7€§ö/ŽI}º:ûg3çÃÙ ÑGfÓçî‘bÙšz71nÃÇ%»"iÔÒð֨ȰŒµa÷}±K%‰§Þl"–9æn/ð½½¥Y¶©Ê€4ó„Hš|d³ë÷ya¼#S Š|Œ'Úµ«6J’‚u|Ķ·ML¾\\…õw÷«_5÷u–&òð@xaÏ3’ûÞÃ:KüZglª|l©Ó™¶ñK[xÒ6ÅÒt ·Z™ûMk‹žºrH³ôC+f.±X¿+ÊhJ…X/uú b\ß — _–/^º;C¯yÜüU®ÍuQH[ÐûŽ”¸7;ýì¡o1PˆJ>öñéíL×.ÅÄ‚œäA y›ÛÐ=ÔÄÓw ß.*‘µZunoWQ”£þÄ뇎è½óX–Ñ…6tôJ>oDÍ»ÿéRÍ «÷¾¹×Qno8åÊ|÷ž0ÕF,V1¥@6~F6‰ÜX5ÛcædÅ¥»Ê0Û4êj§;’ûÕ Íîl •‡ôT¹eO©—¿¬Ÿ(ªuáêA¯š3ßz;¥$¿¶j›—v¿*,ñjñ¬êûoNÌ‹ÊZøì»±âÊ ôïQ>ëÌZª Z3š7¼9WÒ´*êFí·»Ö¢dmh^¶|ñƶLo«ç+ŸÕ b–?yÇúžt{As¥üÞðëy3®œï—]¿oÀÁ\Æ3a–äÌ.œ¬ß³„|ƒv@Ñ›~yYÊé;3¶ú7<µŸ-𑽸¨£B~É££uÓò¿÷ô»¬r¾ðöúÇÙ”Wï·ù<Ö,Ò})á_"0»ÙônúîÐ[ s4ÏÍ—~}¨ÕÏ``†û¦SáNaÔ#[{:k-Mœ¬;•¿ êY&_ÐÛyÓöÁ ÿL1b`QôÌ“ÂÐø*A'[—4Üdí/”Êz‚Ö[PªüðÞQ­ë£6g䮜›…D|6²5ùºbA'0&w].?n¿Ç¬tƽ™bK©(Tˆø|—3ÔÓ X¸˜3ì’ÕýÞ#–›Ÿ¹jm4ýãvç «Ž›6;H©Ñ°Fq§Ì©»³ZLT›ü]:;{ÁУ£šŠ ¨ÞÒüÃ7¦\Áb-‘û¾Ž—|¸°ñZaËÕ)oNhnYS~uÍÙ‰ZÏ>©<Òoµ›‰øa߸µqOSt±üÚÕÕñ:“R÷ÝK\m¸1.¶Õõ}Åö…W­§v޷ùØ‘µ0ûR_Ók»—5?½$?oûT*JéÇS(²«g56JD?üqè‡ûÓã™?7æ-¤/,í¬^%k6éò­/?‰I­ “º{©•ô Ÿ¦Á»ggŠ4ˆ­4e¦LFÚÌöóëëëŒGuLœx|c„©Þ®¯º¥•ç?¦&O?ûûdÂR Ÿ°ôGømÙ¢ ;žÆ–5NлB¡½-9â61<Îëå³´pÿ‚ûÍͱh½·_¦¸NÆôL•»N6ÜÚî€+Üy>äˆÕ»î‡Aj”µçPÔ _âf\œ~g¦ä³' _É iËN%‹~*º°ôËÐǨ£m{¥ë\šÛ÷m·×Á³4R,óªqýòêœ÷)¢dŒ}cQÙí™zÞ‡ÉQÝÕTƒ¼ü¢Ö²êãrk6–¸\ÛÙ•âô!a±óÍ(ä®sE_Q§³–x(ļY$a?åÂ7H×ü%¥k燪Ÿ<Ú™v!¯sçV]N]zúyãjÆæçO•ö'?~[ùr#+•0­ïçÏT—q¡ñæ‘÷ßJššhXݶWÊ7gÝCb›»w7–]‹É˜ÏJ±øu°tÆ.qÍW dÓÛ²§L·ebŠ ¾íûq~\Àæ…-s~å%œ.}¯xeüÊoÞ(P#döcûÞôµÐéÛ¤ì3,ûñvO?î¹#qçã¦Kú‚'þÁs¿úE6­t¬Òîj}ñ±}¥{Þ÷ÌK¬"í³H²â.µr ^I ìP”¨—\<˜í wððäŸ9¬ä­‘5É[­Ž¬¯À¡¥¤ÎyëgK[H.ѳ˜ÀX¥Ÿän¦Yçݘ9ï}ȦÌêÄ‹á3êß¼‘·>†¾›¼¯*‘ ·ÇrÊ”øÇK÷‚¿ê]8Ü´¨æýLÿ!÷6±kÞ3—µy_,s +³U5­kïüY…G4ÎKHíÛsbwË) #šmïŠÝ•«hTØÝ”;pÚîÆ“+sV…R’o(Úㆯ¶TqÏ_f ¸—ó“É·¿ùi¦‰n‡sé«Ó¥KOÙ1ðUÒµÀ·Áµþ¦ãÌf’iÀëWþþ§^¸íú0çm¡Ûª5Õ?ï)»}û(–iX"rñ>ƒž¹Î͸Pë$jcë>ûeÔe¤ÁYFuI› 2úêâÝyŠ‚äê{?ß)˜®8£s}në8díT«Í—µ¤ÊLDL¦¡ûŽš<®n=¦~üL¼*zË2‡€­rŸPý˜Ì¡Ïè» ÌÔ+_=š§_$ÿ¢"&x©|k]„Óaçãýû ³K–d|ïu93ß”ºbîGõ‡JN}_~¥9íÕ´ÊU/ºnD¿Ú1«~SẩÍÞÖV˜=×Ë^Kʾ^¶)fMÜæ]9Ò×åÎÙÊ·Îu^¸¨’rëðÛçV81-«ïá)ÝnizÊc—ºÌ’=D4+/I‰[»ðÁühñÒÕ¨]¹!FS]iÇ.yÙo{qß?}©…ŠJíöçû¶gÍM}¸Tö%¸¦j\05mr<Ë5+á“AojŸ2sb¤[ÔÉÌÄ´îõ*7Q´Ö–©;fH,û¡1½kjóÙÀŸG´\V/»)åèßÖÞSzUb­AqFO™ú¥Êh™öÝMý—Î$nÏŠH½ùkÃÒGóWT7dE]ùè8Ž¿j&5?ëÄÖ»¿ÂK)+¥_ÇÝØQ¶ÇZ4…‘þyoD¨V“Dz°¬éK?¬£oô3“ù²€âÔÁì—k?b¿á§¿=ºÛu^¯Fwü@ôÏóAâĶÖ&'½ÙU¹Š½¨×Pò$ü\­ ¤¾êz9ä°PoH2~uú„Ó‘,o25ëÄÚ°y”ã³E{ö矙’(kö{sœÚ·½Ø¹[ŽaÔ¶¾O÷Õ4™ígr×lθQnœî¦œ“_zTõ°¸·ÿ!ŸüÛçgÉfdí;û,úøj eS#ƒ]¹–s;ÖehÌšyôŒÑÂq›Ûîø7ôj+®_8ãÝ'Ì£/œYéZWk/£r挾þ™³û ÷˜ž?„(h4<¬Ð…+œ…|òÒ”T>Ù,æ×ú UM:qÞ©ù²ö‰¤üÁ,mÆëµO”²]}n~ÜкýÅêÛGŽb½vl›³B;÷©µ9qEñÏ{q„ú× Ü ~T­¾”÷ õvùS³•]j‘Y‰´¸Äo«&K©ÜdæjÖ'çŒ}o ]/¿Z¾+±j­2yOÛ¬ü­ÓWÔ„Fþ@®Ñ»ò=ÃRóåÔˆ›;±A×Ä™—©¿ zî2˜ôA÷kYWúóˆÛ¥ËbmÉŸè3ç[Þ(œÓ9ãs±Æ†­«v¬Ãcv˜‡I|o/i¹þ®S34¾CJ¤÷ÆÐ‡Ïqu;bòv|¼@c^fFTS_{ŸÕ¸ý4ë¬eƒ¡1õ{r/ÍR%HBІÿñIÕìöŽNÍ ™®½Û5×ßy–Ãò¥§êo˜wÑIñò¸ò KÑb1ÙöCïÉ×T¬Á6Äh–Þ°¸vã¢í±sÞê[_Åeô…쟗íuJ Jsî–ïïo¨÷‘¡Þí8œoèÒªÞït1è—ò9³Ì‡«´.îÿÕòzU À:ÿë™êã_¬ä„ƒê›w3«1>“yMfU}hAÔ›_¡›ü®3ED³bW¡â”O™m}=¾/Wa9mwŽ|þJì1±ÚÄ®’^Rðå«jðêµ§ûúž¥ù_œêøiÿÅ„ºO‡%Å—…Xiž–óo«p[ñdæüŒë‘r[{_S’pö±§oîe_[¨u;ÇÀ弡ΜŠÔ™Ou‹6Š»dn\Ÿ7qªF6üÀ<»û¥±5y·ÜéâRޱћƒ^$+®fÚË—Í©Ø4ëCÚ½å0c…”àE³Jäú暉Ïp½JÆ|õ,¶ÐÙ~ÝU,£.oωkëi⋎|Vtø¹TöUã»ûùÅ‘S”tˆ†­Š¥ßõ+½œõ¶ùðàl¯U™¢W’ªŠ=:ÞüØÚ6Žñ ¯)7³‹>c`ðÛ¥ö;W¿Ë|o·DÛè{˜BµU±¿Ä‹ùmèვs³pËpW^Öþñ5LÙäêVw„ëºÇè¤׿­ü¦ò\ÚüX§ä×%ß‘‡Z›å:$bZ+ö™êÔ ¯_Óÿb^­â^9ÚF=å•Úß?‡fæÃôÛ}›kWéB÷6Ûõ0×SY#ó̽Å?Zì _å®|(?T´Ú&{ÃÉ!»¸÷͹™QßÞí»"]›™ºèËu‡.ݦAUÕ’­ËòîȑϿÿ4¿\|WÜùÁJ±Ì÷‡ˆ*!ˆ"i›ŽÏ{D[‚Ú’ dæ[Z®ž{#êÌwñ¹ªQ‡Ö>=ýÂäRÝõ¼ñÄʳÝó*~8=aþÔ}b•Y«±u î[`PšüûwAå7´¾FϼÓQÓ–µ¸m°ëõÔXk…Û+?ô=›?õjõÚéz½È÷^ŸŸt¬7š³¢ªú ÅXï[Ͼ‡CõÊñçŸhÝt}JJzÏ‹C¯Ï‰/Žyç”Ù>³Ó#ÞMÇÞ%éÿëÖå] ëï©kµÑv{vú]kuâ@ДP£Ñàѳîñ»Ë“ONçõ³7®1Ì’KcD:ZÊ I1ÄÄÃÆ–Cüf®ÆbÑMˆØØX­X]-#¡cllŒÐF"HMB“Oeáã4©ÌÅÊ<²/ÊÔ‚eÒ"Ð"d_„Ž–6‚ˈ»›½£úަE³Ì•££ÉD1ø C]Pà'7M 1Ì•íÜœ»0“Åæ€ê0VFüÇRŠ]*°C9j0aL\hDrH¼ žE²@jëhjk"±:º&zH}#um¤‰¶¶BRFµ†øT>H>T š„E(ƒÄ@O€mÖÑB"µtùÐ8Pf!íü×úÂÓ]\~¯±ÈHȤ!8!zÏ‹ƒÍ¿aõ_÷1‘À˜Í À£ƒH@Øï a‚Bë€ &ì7mƒã“N§ xˆ1d  €•,2‹B²€CQXì2Ä„‚§†š+ÇirîøW¶ð¢ÂÐDvoPÈœnñôFé+glCyžÃâß½~þ7?ÿ¡aw º^såXÈŽtÇÃÞ˜;®UFÖª’؈A@Ö¯bcmc¤1袑ð QÖÖVÁÀÑõœÑ 2ÚxQå]žÇ …HjHImÞ` ¯¯«„œ2=C=€]Cå”!‘FºBe œ¶Ñˆ2P¸L[º”G°LW©7×P×X¸Lß@)T¦£gh0NÇXNÛXÏh¤Ìðu‚eºÚÈ‘²i(3ÒY¦§g0²m#yè! ôGÒ3É×hd; ô Gà —éè#µG´×@ÇXXf$(_‹'SH øê'Or ´ áA£±øÒ á@ ¡HöõM6@€™±®®®6iŒDÚ"µ õ¶úVúzººh}c´1ÒâŸ!–I—ÿá,Ø ‘ºÚ:†’K– 1¶ÿwgÿÿÿïÿg’XÑtJ i…ý·Wã}ÿ¿®¶¶¡tå¿g  ÝÿÔÑþ¿ûÿÿ7~“C¨à,àpžh¬—ãjÆÙK.ËÈT’p±¤$B °¦ÑãáS€Šµ*€]  þÑÑ…Þ#gƒ§’IÀ“E¢“¡ôžAŠ$ þ¸‘‘Ðé0pvbÑ€h&I €´4€H8‚d¿šŽH†^{Í"¬02`ÒBX± Â•d"DäDYðü ¿OÀP‡Nc²cɬ00vBH$èµya$ .”‡^Á§Ð´2‘D”„ßî‹gÁoŠ£­,»uT‹L Á/_Á32lª&óÞD "ÓÀ´ ú‘‰ ƒЇ›>‚,3š½Å†L Ñ6aF„ðknh!€‹–ƒV ¢¦n"‰°xDpîg‘á×3Ñ-zt0Ö‘YñžL…_HÖ1$H~O.WÏ\Õ1é$9„LЀ(Å2È,°KÙ¯äkÀ&ê…J~!Ü&±ì—ªm%³ðÁd $̘¿‡…:¤íÀ‚zÛ[À"<ü¾ˆ#%)âÆ„^j ½d‘ B´ ~Ž×’„ßbšìðñüí+ë`þ=Ì?R1çüüϨüÑ› çbH¨/ 7è˜ÓƒýH! L°B3…`)‡Jd4¶ÄÞBO%hì¼6.p€¤¡—Ï’C€xZ4ô’+j({„ký—-ú~Ø&Iä@%P¢™œ1E?ñk‰c`‹É‘˜1YD2M+ÌB°Ô¥pô^·px†PZ¾ŠÀ²ÈIÛ£¼Ñ8´‡‡+rÑ<8ƒAe³c}rˆ ¸§Ÿ'ëç†ö@aÆ3ð;ÊFAsE£mp.(ggŒµN$èÿh„1Ð.?AR$ÿ;Á<±(ì¹ 7_ý¶5.è‘!G’ØÚƒa¬=ƒžËf°~‹?—F`Hæãઋ䃶•EjÀž`‰*ìfam¬0gœ½* ¤$X—cUM%˜F£Œ¥"/Wœ€øÑTÐáGAÀáÂèÑq’‹á·Ã-äòÅùbÜЮ8OŒ—8ë£}±hW´*˜È ç„öpE;«B¨2L 忦‹ÄèY9`q[[–] p°Œ³ÍH˜ß ESG–Ýkü£Òç³û÷a,{ÄX;¡G±H”÷ÿ¿ÖßoÄç©pýýíoÃñ€6W2/LGA žÂ}C4]Ó)x´ˆÄd)DU™„áÁ8ŠÌâ¹Gv„É1t/k,<À¼QÎ’J\Â+$ QbpLÁtø[4ü5ÉTX>‡ –ÄæM3.žv8WŒ§ƒ+Ê™£1 80ã(²c% F¥Lz’Œà@ß G]P3C¢©¸É`CTQ嵂×~6¼HÙìdœèpPv€ ÛRGƒÓn¿OÀá"AµÇ©BѶ ô T,‰ ©–+‚A!œO¬µÀ¶N&$&— “NS*qñ ª€ zs5Ž¥ ªx ­½á’@GU%NUü“e2AL¤ªJüßaꪪ$¨ªJBzöƒœ*§o¡7_yöÇ„Í ê1¾7lr¢v×1Ù/Ý„Pù:‘ «JEew(©Àv•€³:h Z$7@%Ш!äÐh'µ§y-À†‡ÚÝ‚€‘p¸ Fªì¸èٰؼv@‘+§qܨ6Tü°Añ<‘# Ô†‘ aÒ³ X…ö ”Pä_Ÿ Ëér-h€„á`ŸG5 å'lÑàŒüDå MNxBr¥v]pUÐb4¿#áü@°ƒ…@ô`Uy ±Þì˜OaÒ ô`—£€¡±òÇjäÖ‘j„²0f…ÒxzñðPoSIè­ìÏѤSæ+SX‘¢èðØçS$üÝÝ å<¬H¤†àw]¡ï°b±u+¤X¶ž¨„\4A±ÇóèÈ„ÐýG½ßC@âC¯üs4ƒ{Î3e¸aw€£…àØŽ½È™çp°`×bx„]ðXÞ†ÿñŽ…©§ª¢ úUþ¨jþð¸†Á™Œaü¡ž#ñ 'ˆ!àòog3hèþn6ƒÇïˆc—ªªÑc€ ê¿é2!ÔßÌhœªà¨x”ñ èÆ„øí¸ðŸ ô~ñßK¨¯Ç—£÷3ìØÿ?Ó͇ ŽMþÀo¬a ÏüÃÖÈ¿§‚(£T.ö@Õ™B#ÙÖã Ƭ£Ð+I(ñp´Ç àäF£‚ð$ Þh"—Hr!èâ!‚ÿ<Ý@!ÿJ÷ ôþJÿ  þê¿Ê •ÿn:ƒêU˜ÁÁŠÐÄWÚ hÓhÔ#gÁÞÔTU‚ÿ3rºtÁ”?rÿ@N"§ýŸI§56ä?#g“£ün‡àGLâ†ñǹ95™s9òòß‘bãD;,‘H%³þåìêåÂEÄS@éÿÑ—ÇDŒãgùˆv(7{.ÇPžöÇ¢ºÙ£†E¥‡áÿÑÍÃÁ•§:ÄùCD/77´12–?DtÆø #Rh±Œˆò´vp൑I “‹È‡iåŒruâ`‚**#ss@P書ÇpÍc ²”ùyb1|ÍdÑþ¹™Üa§ -Þ+LVt¼«DGN0…½ï Ø»izùr6™˜£¸*ö‚3¼K°pÔm°PÜùj24æ@^¦|Ž!M*Ú|%,F4 Ðá+à#'ì18¢“âÈLýñ-ÿÂÒómMhd-’`ml< ¯®` pª¦@´: )ÃÛǾ諹âà© —œå?<‹KD€2Ü0ex¡Ij’2{ýU @CÀù€ à!ôP -O×t`7@{É¡a0[ –ÇVDþ mE›£©aµÃÒ®à%s@[ƒ¿VÊÁÐ×ÒAøR–m %€ßb𾄠5GÈ2!VÞ j<[iœˆŠ+ƒÆV Gï‚ztã{g4Ž ‰ç=M¦(ä¤4Áô“³|N¤i‚èÛ(4©Á‹ uAž:~ÈÕ:0À„¬• I€Ž{@6Å^}Ží˜B±¿hÌ ô…<§‹§5Îí!è;q87Œµ5YìÍ2>Zœ=.`èèkksvíÆæ­£°†÷(G”Äáè |h$^…£z43LUu´"8!‚³„‰8ÁÜVŽJ†FWUsSËqT`¿)ƒºV†šÎV8<‹I&àà#7Ð~èyñ1x2â º6‰¨ {ºQ7÷ìp(,ÆÅÁŠü³?uS^§ÄÔšF½ôÞ8€ŽÏFnÎñ‚‰‰3 j|x÷Ÿ tЀLNx³nðèã £ÂÞ8…Æ lVAæ EàÌŽ|"E`†§²³+,ÈÊ€x ÐÈ}dr‡!wÓö½ðâ è·‰¤àèPöåã±³A[yÙYy98ÛðØÁE¶PP'¤Šá" XÎXãäO¤Â3™Ðù4Ð/ü|¼q;,äȳ(OO´g¯*(%»•Íü4Zc†Áþ´Epb¿€'˜áñ¾ƒ)»§™` Z¾†fK5v²¨É A³"Q €ê@äT@S EE“cð1B'"ác‚œ€R[T¯€HbC‘ ÏZö¢ác~ü›ìPzyB§^\!¹†m˜'ôp„ …©>ž(; zW'¼f Â‰ ¶ ŽpAhO~hv˜ÍŽß‡ÌHvp³K†§ÈÑÒT¶êùÕþ•»b°ÿËjçY$| HpvñAa±`¯å£uÃïú€OC‚Ê·ñÁxØŒªþVýªÝÆ`ÁžŸ¯(q{f|d0zA8vÞÝ£2Ò;Nóc›ì©@[¡llù“/„@‹I@À·”º Î!7þ}¡Ø ‘ÂeÃôÁÔ×ãïé cCô¡2~úÞ(çÿ}Al6}è` ÆËÙÆÊTÚß0Ɔ —ñ7ÃÍcçöôü»fb³›Á-æ‚rö@£lüþRYÂØNÙ0 pü{òZû¯YcC,8eÃ,lОX”‡Úý/XcC,øÊ†Ù¸xÚy:ø£ÿ²%ÂØNÙ0 °‡°8´øÂØ ^À…7ìßõˆ 6»G¸eBMqÅ@kVì_5…›×^Ù0,d X!XÁ²a©0nõ€¥¥`alˆ¯ŒOx[>i¸ý`;Š4(!À9üFaƒ• hÉ®^žgUÂØ0n™ P(o”ƒóß1áÇæ2á–ñY/kƒñqý["„ [/»L€…—+èÆ¬íÿ’…6‡§L€ èŒÑØ¿nˆ6‡ \6ÌÃãꊲmó<„±!|e‚lø¥ù÷lø±¹l„Ú⊱ò²õþz"Äf»-¨ŒoÎõ„Øþuè „ Ϲp™Àd(ô¯'ClÎdÈfÁó†ö^&{CNÙ0è¬]P®~hŽN (¾²a‰¡sÁ6¯¿´Ral˜ §LØ|lAwbó׿3Œ=l>pÙ0gp‚úûÈSb•ñ– Ю(H‡ÎW;.}:É„·è R ™Íü“^"÷òpoÉ oñÑáܲáÆC%ünéß5^›ËƒçÔx:À`Ñ.nX?>ÿ•„Èp,.¡0.°vvpèNÙ0h žBÝ—ñ‚î^¬\Æ7¸°(g´\Æ—í¡]@AAØeÂù€"°¢ñö‡ÓEâBI,zl4: *Ç@O3˜Ì¼]<9‹1ð‚Õ0Ìh›Q 0œñ²÷Ó†Ë\°(gœL—Ð8(î„Ǩƒ6Ø ô†óT.WA9G_À3Bcpd)Ç‚“wæ¿]4›ÁcÍO¬‚öïptzÀG Ñ€ƒ 5aù|Hœ-2ðG{`p®^ÎÎ0ìMs:™?rœý¼%t\Ï„– !‘ñŒJ§Akã ˜Äðñgni ž!´,>ÌT:ÂÁ;H!øT/„òÂÿßóÿZÚè3ò–Z‘ÿ¥çÿu ôtõ":HCC¤ÒPW =ÿ¯4ü¿çÿÿ7~è×166‚žâ‡¦Ýžz0‹ 8P™,2 z*Ÿ`I„0*B …Ÿ±y!€¡æ×ü.€Ÿº àÏ/€ùý]c^áþ»»FÇý_¼ Þi¸àßÜ  ê׌}<'ÿémBW°Ïü¿¿ €÷`ç"Ø×ÁO³k…-ù(¨Êå2âIP:žëÉ[0#vÿŽ•ö'‰… Sƒhc%ŒC  åá†ÂÁœøQð :1ú-Ûƒ(„ ‚¸ð’>‰ÁFçl\ó´Å«\ÄwŠ`tÒÖ7öcÝcpÀ±O=õD4ÊÕÆã ô¼,ŽS oÕ >œÏ„¢0öù™ýH;èÕl9OõV áAÛ¼´h$ð`‰+ØÏ7XtðÚÖÁÛ êH-‹ ç‚òÅqaÑX4Û*½5Ê퉃6;œ¬Àgo~‰A££Qb›Îo‘°‚mêSôÎÙÈz 9˜gijçí‘ÕTYŽRÁ “G«bcð,ÿÀ`ïeqSü’„‹Ä3#TMGŒD!3hTÈûŽ*ÜèXìÞÅA‘þ ,Î-ẕPx /§øH°WÅqèðU8*aÃA $@Mý•©#©Q¹_pÕ€Uy^ó±]'è>ñ BØè½Çé"~"BØ¿íü±Ñù+X ® ©ðÓÑ£¿‚£t™ˆ‹ Å«0zÐ_5ü¥U‚qУ8 ‰ uÆHí3Á›N£\ÝãAç&dTHïœ*žâÁï`×c)C ßÄñ°Aü ¤:O$2´ šçÙÔ‰— ™ ƒjÐïa*ìâxV4OÁANe ®Ï ½›>¼Þ°pÄŒ!x´kxʨÕCìU"-Œ’Æ2ÎÑ;ˆƒJ¡Ñ"¢éf׿é~È`2•HÄÆSXœâ?£=ÍNãH¼!Ä–[…×½B£…Ó^&0ì x“#¬MkŒ«­ƒÎÚm ÃV‰Ó´`k éüÛ"`hê wà˜?0<ÛGýv—ýKÖ0ºûTãGþ›é‘f„ÅÍŠM%Ù€dîÈ¢¢™€9Û<½¬­ÑžžP¥Ð `0bÊ )¬½<œá“X’‚v ν ¥P˜dĨ,bW´ ºrÁìS™`-|Þ:À zR$|’ .†8AÅÙÁÅ»†àáœÖæ2'‚º3…Kàk" ãÜæP;X4 ®(±a4mU6 9DE…],4`šÐb'§È.Ô!" Ã„y² ÚôÔ6g´rZB!G‚æÖÂô“xcŽ-󈨌§€îZÇ](ØlºCƒ+ …mÎ ¬ƒ?ÚÆŽáœ­1Þ8´¯µ3è]Ñ&ßÓ÷!S¡Ç”àÜ àv?¨X†HÎ<2§…¨ð[š7Uyº^È i8 ç³U"dé¦£É v[ à/Ð~¸Ìq¬ð› ÛÀFxB7ó‚#L#‡S[ðc4™†§ ùE“ üº&"&ñðeTe凂]ûÂâáÅö3u15-Bà÷䚃CÝ”¿˜ë3FVÀ®aD1ÛéŒ(fÐà`mDy4‘Žƒ“IŸ0V Ì_èÌ„‘ì³qðSظàè(F„î~ A"È1¤ßÃò|õhMe»äQpÆlçVè©ÅP•{˜ÜЀäN/Öëf:¢Š!ZÇkÅ(h„v0#ÿ#/Ž E€/=ÿÄ?bG¿#Ä…$$ F<2¨å#U Õq¬J°ÁôZ_2T BKEZÜËš@DÐsƒGE‰¯`ÐG$ÅÀ 8sÛYŒÂvB•dºW´18é¿!ÖªòÜ„Ï_´h@a?ÊDE“àÑ x¶ƒgY8Þ†’Y¥aº ßÃqØC‹U*dXJ€ ˜±}—;{bQVÎhx ¬PWg;dîÓAÿĆÃÊ£ÈÄò2UÎ|“4Kh»ã…ýÏØr:_€õ= Þ™ð„0î½¢Ð[ܵ öíEaäÐ0“ãré‡!Âgü¡'h±` ×õÂñ'°^1àÅÓÜx†/ŸgO7Tá)‘£Îyöø‰Hhò"’à”¾>ak"ÌîÊ&šK˜ÔE£ÆNìõD>Ëa®ÊÕ‚{WDÞ¿£ÓÙ[± MÎÊ*ô ·)l(P{±a4 àŒ?¶@( šáhT{nESüKË ¿ÕÍ¿Ñ ùÿ™vøä1½¯F4…¿iÿܸ?n‹?hÞoÈ2l{w¥‘pÞ ö-ž«9hÁšM À‘@Ýøà® AÖÂYófS&$šÆ*`è­À³ŸŒ„¶ŽÙ» •A+òð•Oœf„yKNÿ ƒ'øÿÀ*Ø>ÆŽ=û“ $ ¥Ž[ø·6ÃYÜž7ØlTÐO;¡ýpÎhבVd>º Ç1¤8ˆnÐ5êƒ ‹2å“x"|ø>zΙL F±xö”êȽ_†q1Р›ÚA@INW³]>>çx`°(,òCðBi°¥gÏTÐýÍTïºz2 2 “f°~¡ .–ÊeÌ>ÇYÉâbp&1n/@ëžp1nX8¨õLä}Åz8 ù¾ºÚ`°ž‰#º–Wïeㆃžšã#`-\=T¿ ³¶ú -O´‡7Úƒ¹ ÆåàÊWàŒÁ8y¹ýNO³³ƒ'¿<ì…DOÎ4ÄSB¢9_VÃÙ²°¦Äé“áW »Œ7Å@ÇEžϹ V3Ç긩0½sЏØ>¼˜3šªÀI̘H`ÇA8“Fad †âYÊœKJƒI ¨iœˆÉuTƒ˜"WˆõJ¯¨å›{ñ˜«ø1U`¹T@¬ø$¶Dïi ‰éʺó‰„fÙ¬2™LªKë¾§KŽƒ7T6A㙣ר©ò, 1‚NÍðÍ• „™$Ôvlõ󇙨Þq㋱^ÌGEáËz‚øéJ§s‹1X®-UQUTPAØ­Å7M”«¾•\ °zÛÉu(ì~l¯\s4Þº Í…â|YUe­6þúÒ`ƒ9ÿÙþC,¤âdz*¸•Å®Sªww,¼êË“œRàPS2ÞY{ÎÈÆŸS\JjK¹·3•yya'zö6C’Nì?‹K&+©è¼nBÍ+]­ÞT–A çà ÙEHÁeú9|ƒûˆâ²$LÀ“®4y¡Œ†.Û —É]‚í8ÿ84(KT…0--Ø=œÉ*àí@rŸê8Êœ˜Yàj--A¿‡ä킢ݨy»ßŸ…´#ÜœŒÉ ðÖPo<Ú‚o}D±=„Á±Ì#¸È2…tD ×wg§¤£ZO8Gù˜äèòt¢eó¹ñM·6¼ZÕó 1Õ‡¨¬#¢TÖ)Ã3G€½^šÆ‹ãÜ®O(/™®ÀN‹QºÜ~²èd 'á$8c¸Bu:ÕõSñõ£“âB„°÷f…ì/8^¦‰-Q$ “[{9ˆo¶Õx›'!Üèœ Y2ÛB  ´±ÈVòßè_31@7ˆêJjjªjAsžO¬ª)q‚«N2÷À{#¨þt+¢²Â4д|tw`b!{»»b‘\,2LÆúNn„Ý›I„ ™>Ë:H¦0„„Ûg¼ÚŠêc%‡ÙµHu“d§÷Ó„–à D$áßÏ¥65ȊŪKaJh[ðâ[˜iÁnÕyTbßc6GÂ[õ˜&N\|*ùUU7­b‡«“²Ï4Ö5ÄÖ¨ Ôé²¥ò‡±ºùŠÌÓ9jšÊ?YAL·>:‘†3H˜­”~GHWFéwbI â…Qˆ~Á|å[ ÿïQu ñÒþ¯¶¶ÞÐ7¦4(…SBªvAµ¯ý‘“ +.gå¤Þ@O¾.Û†ƒ…@²)‹9´OPN µ£9X1øj¯xLš'z‹D‚n'kP F™  CÒIv55VA"ŒQñ/¦<ö‡05`™ÊÑ f™óõ¤¸¹––a¡ÔgÈmÐØ>÷¦O-½3^–yf³“ƒ‰á„jˆÚYÑŒÖâUIèø@øhq84. Ô,b à^ªQ”µ•W”¯±•Ó 6,ïÛtíR$ÄK|çÄyËø\’Ák[…µ 1SXUN „“&—ÔLwN)¨˜\b1Û‚!BØõÚ½öKv‹è YŸºB`Ìh&¸ì0zk‘À ölXŠî¤øGš 7†¬y5”/&.sñ_©Ÿ”AåI-Ù' 5‰ô@Ó#¡9•–Sf;'ÖFÝ!•,Œ„ƒN$È3ǘ‚ Æ9± hBYeI:¨öNÕ¨i* AA³‹0Þìa‚=ÂÉQBìÑ Éä8¥¤F@!=  0ÑFÑíÀ¦²î@¦ÆÛ­LôAÁê`ST);ü^O³W)„ WuáGKW^h϶åædcÔ)/nϱž™ Ö%tZè'ñÊàXnr¹½|"íu;ä 9«!©7Êùý–èYYñщ£¨Æžb*Ž•OCr©Ó‹–û(qWë¸<®0,1­RÇ#Ò¤ã%ýà2¶ªZàá‚è&É{/žPTÁ[x=¤ÙjçIŠõÈNFá>Å¢m >nX>S‚”°m.-„Ýœ&èíઉ2ÆŠšxK IÖÈ&9]«´¬û§;£•óð“’ÊÉKjÀ{¥vr!`zmLìÖFŠ‹×DF2'kCªÖê×¥ˆÄK¦º¤0õ£bgŠPBÒýHEqdG—„Eý'˜zUIT9,š/ÐdqGLgLLYÃjcâÆsUY3¨i8Ã7™# kWHt\¹±µýé QÅ_þ!  /«VÀ#²@EXÅCz#&ú⯡àÅ<…eGp‡/ æDVkˆ°Ã”Çd›Ù©ª~­%‰²g ôfùä„­³Je{½ØÀQ¬êJªïkÔ´úB"ŸF\z¬O Ó1šœ‹ÐR·êJq•aí±Ÿ†Ö–®º'¢Ó’ÕŒ4%ikH k¬½Ñ[ÝHNEÜLK±¢¿²y_nô­è½MÞEhÞô#C#éCá!0B7½µË£F¤Â¯ .¹J¦i]ºø×h)xv<6Q|Ñ08#‰uyN¥7Ú ÏÄ,-bÎxH œñÞ¨®½VO¦‰%NÇL4àÅE ªÃè@pýʯ±Å‚xùÕªT—ýÁ¿~U\÷ QóH ¦¢ÞÑJAÀíccumq9»@Kä!æK\ä Á1uu…›½QS®)¢Š„u––M+)v–U–²ÒÃiM>DC®&Ÿ,Y É žv¨v.î_ZtvZÁ˲j'TftÖÖÕ”áei¾P}GŒU‚‹QD³€éÜìT«b)M>kŒë‘)Þ°¯©S ·2À¡^qÍrùüZ¥ í¨n9„M„ôM€;«Å˜$ ¶É'¹KÐn¼2¦ ’¤%ÍdH«b=ˆeâ/œ\ZZRã¬BÒViEÕTâ6$ee2!Þ\6\^Ü0¤;n&û¬bÈþÌÆ\›Ô„=ˆ0Ú 1Rš|cŠ‘ZìY؃C¡8¥¨È/c*½³ùÓ‡à%t”ៈ£d’Ó³ÞÖ@ƒÍ“\~Ÿ.7ÐY‡‹±@^ZÔc;RÈ(#”ˆØ bypŒ»¢jÚ,|¬öƒ…:Ʀ3@Ђ0Bb®¢ä–Æ·ªk—Yël ÿéä+e•˜Ê *§ë“b$öaeUe á(Ú,»ÕŒg1&•k>«\³YŸnkÈ¢oŽ: cäâÌH®@§y€¤~(+‰ÖŒ;ƒu–8’©¢»c£“²ÒF3ªhhåUF7šìÁ×þc©)`ç`’‚ä›?¤…ß¡´0­Zo§d9ü˪ ÔÂŒèX@ú¹bãȲsÄVP G)Ãe¢‚W$â>Ô ª¡ú#|C~|΃7:á]èq/Æ´E iã"ý ~”vßLÆõLk¼m…íM8”D2A­]BœRC¨zZ áˆŠ%. {Í °íØ–—’¦6qÏÄ< <—Cöq0ü2Çìm.¼ÍŬƒ©˜LEYO=åtÉMèßhÓÿd‘Éý?ÙÚp`2’ŒkHä$C³x²l´NZ¨‰ÐBîu19ÒNóÐ †ÄYW½^O„0šë‡ù"`±‘³CòÒ‰l$¡ “lremuIQº†-ñœ¯ ¡±›Sêþ&’[G‹Ïï¥]æÇì2#ƒ`8çöÀ‚ÉS L<™)MêEC23abêH?ÑN]Á, ÿ²ïÕÏÉH´!kÕmÏ仦ɨùñîš»÷O ¥ ‹«hîŠÆýKü»^œõ5Y¸wUè ¬U=žËš´¿'‡dâî®òkq4œûQ•´éªsA"Ÿ7<$Ñ?4Ø9Dc¢[Ä¥kËdr¨–2K /Í¿¦}˜1&âr“ƒÈ³‹pßå iÞ“„eiEéY:¡Z/‹ªÔ£peâ¢Á¦&¤È‡‹ƒÙªNÏ &ÁÆ…Åí¨R~Ü5Ε/²A¦G=×I•ƒd{£t/öbò{º¶¹ââ þÆ«kFŠ (rõÃÀm»ªˆÆ5e?;@u„ЦæJV/˜ëEnK\8ÿ+© ŠŽ2ÈOD‡8•BÐVCTñ$À%]‡ ²¬C‹Ä…ᡲh,­ûÙíO§•p*é®ÇZHº^³ùÿÈ™ˆûC‰6A2ë#9qƒáäÖ¢R©×o»?ê ù5'ìŒ ˜ƒ]ñηºÀÓ›I¾Jª>$A¢åûfyO{kk§âìÆ$Þ–~Y‡sòCˈ?ØËÛJâ©Ó€z!NTn´å-DoFºrLs£Ü@KG D;ïn2LL‰Ý\Á‹9\)ŠŒF—{&A:ê! ¤ Æ.Õ£š~f¸¦S¯©ºcU[vá‰P]°gÍ JK ²[,?èÌLm¢Ð몥eØIs)<á/.&]ZËÓX¥ÈPOÑPäHŒ$3KŽGŠØ‘„Ó$Qó†Ñ%OP㪥k:„a”›ëÁ)ê"k˜¦¨9RÔR¥ þ\§>ìŽSB’„™V•:’¸3‚â]Ɇ3‘»Àì´D®*x‹×=“”¶P,ä0iòÝê„S#³ƒÕ‡óq¢.øÐéN)ô¾=ò·77{=V¶¨: KË*J`½~®È°ÓöEÜÁTC¦šm®ujÊj‹”ªÚt>ƒs{(:¨yViöK\8Y™å û04eÐÓk0)á'Ç:•\aµžÄ–´f˜âW$SºÎ8ضK(·f_ê©qËt%-D¤aPx ªúYÜœo¨ÔµÚž '¨…†âYâî–°—ª¤Š ÐF—ÒØ7$Abš :£zl*¤“&“"` #iÀD{.·\±K™HvKGeÚjSR±‘òG!N»ƒ‹`êc¡Ï¸ÕTB7Ã'¢›%s†ìŸ8Þ¸äAâÉǒ×¼ã¥4¹e¼ì)áÄd)òhuš_YÝbC~e}߉/ e™Òô ™ôN•änò[ŒÝPDK,áJüì*ñR©tËY€kâ–y») \Rkb¦¥Þa‚õZíö‰Ó„÷8n„4À®~¸E~r²¸èvœR _Rà¬<[÷õa#«ËX±ëÈÐöätiQùtÅÇÙ„œN±f}'ø q}«ð[•<Ån5F±ólUǺ÷ëlÕFL´Š7¤¬nÝn›HJ”0œNÂúq­'r‰Ï*ý…½%…YÅ=j_‡œ¿˜½;˜Û@{þ‚¿GxÉ,¤™,•@Š‚+?U–ÕY %£tŒP.,‘¼êæ?ž³Ï“Gج²¶Aå÷P”ßí¡ Š$øh³šœ êL {q*—íT´’§qvJ¾9÷aOàÜaۖꂺ N"Rài Q,œÌ 2M!ÊoR逸iTNØÔqbøþÀgV3ÕIw?05á¼ÒM2I†©ŽTR÷]œ­5ó&M´TE!ŽæµtÂòq‰‰‘7F2ãФ 74ê²Ñð$³¨Úä&´–É=ˆàFB–bª'« µÜÀI²økóL û©á÷di¨Å.Qu‰|MN~Ú)þ†áÃ…¹zå¥ 6Óm2$ÖÒ’dv©,…'§xi‰-ÄÜèToð>däŠY«‚/Ú+«TN‡/Š ¿ãá“%•u£…G ÎŒ6“!4ÕL$-S¢}hVü•°6+«ŒÝS¼¤ ìPOÌú¯tzXŠ$5`É”x96fÉYœ —{EC³Z³ŠžËòÝIM–¢(‘¤UsQh­ˆ¯‰‘9Yù”Ÿ!©'Ñ›#Š¥6èw…}ˆÈ*ì=;])¬-NEB؃²“äT3€rFr–7êÎÚ%ó‡†ñØ8ƒ#IVtÉ€Ì]:Q΄ÁÎ ”x¶-¦®(Á±ÆàéLÙÉÔÆ—Lùz$YRÑÖH\º‹mR3#2)™É Í ½(ê·¡©D¨jèÊ|<– º¨¦fBiÖæ@ YÈVWg#.v…ï¡úª¿Ý=¬ÿP®ÌíÇõ°TòˆÁÂ~5Æ´ªd)ã+'#y·Ñ­dgÎÆ‚j(‰ø‘„ë“RÕãÑ°Úæ÷B¿8ú¦'ä«ÛÚ¿c ‘·(²aþñiÿO¶†¼¿o²® ·çæÀÑQð¼"³Üñè–5ù]»ùÿé_rýA·ÿºUt8š(u²„$¥&ÑFp@»À&Áz”™±?„J®Æùb¹Oæ*ƒœ@òÜ4äÒ¡ëÔ+ vC€Ó…óu[ÄqÅâ¾ô3æë;–\WÈ×ÿM¡ °šƒ$³?_šš^Óaý¤¼Ïù.\Û“›«÷ÁB‰y=y4uâqá ÇʺÎ~•€FKw² åq’IKü¦(ÆFbe Ç–KàxÙ5§#|ÿæ6(ðÔÑhBÁ”çø’º Uµupªöä F~ ÆØøÅ»ÔJK=¬U\RZ0¹B-²eì%ní+µ5¾'¦]Ü`·¾éQe©ý,¥¥S!¡ŒïQU(cwúþ+ìƒk•—ÔA„URB7¬„ÖÁÆ `?V­màVè"Î ˜CxÔ@Z ¹÷ÄýìlŽJµˆ÷)Ø«š³âwK¡©·ÅôÆ0m.÷ý ‘UUÕ…h­q:1úv˜65ÖË‘1I;;¸«¸ôŸZV 5«¬j,a4ôÍ–ÙVÅ2›í4« ´Ã" NiR[@Ϫó'(\¬«ª‚ؼø½ZÄ^…Áÿäìø±>ºÊ*§TX­ôž§‡³¢_›ñAù}+Üõx±§±K5hÝzé‚O 5w&Dãúƺ©•ˆP÷Ú…k ok(ÚIoiÔ¦ŠWfçà¦v?uc†hQ_SÀ„¹Ë/FmØI‹‹† @&fèIµsÝ8ë¦W—8 jÆg+~o`ú>7G¼#ó¸‡j€eG'I¹´#çh •ê-ƒY£ý!v½£!‰Gk†PÒ©EÝ<_>Hà»»èÝ:ØE"üƒ5IËW²…'³tBúXäžú†Ÿ‘K<‹Ñb@L†+Œ9ºÏíVFeÚqÕ¯Vĵ!,ÒN$ú¹2«­Ý…£êÂʬ mŠßË„?cY°’hë3Ù>>'^4V()ßL…îñk—?J'ÖÀÜ-ÖPJªÞ®¤ùºbdÜjh©úÔ1Å:¿Üc…üÂã#žd,’š,S!þDð¼ ïù½8r*JºP'°o¤ö$Ïô{g¹ ;)ˆ ´¸"´ìBrc2¶ºATú‘ÜDþ¤á/iX<Áv?4b5ä!ÎÚÅU`gµÚ•~:]X‰‘LB’œKi!Xº= fÐÚ‚hÏèúÂú•<6Na¨ó2ŠÛ«í×°a@—©:'ö¢)Ul«óÉ=Dh=FbTjz*çü"Àð±…ÿЇøðÇ’¯€4?ÇEâœÏ<ë§ GrvŒÌRÊhñ¤f‚FÂÁ˜¥+hÖ„‘Ão”Cﻆ?%L«L7"}Hèžó’†õ¥iuŒÑGiªQlÍTÇï yöÉM# Þx ÆM¤…Ò…Ü{ص…馓Ð6¸ƒêjz‰¶@é”)ƒB-²ši†¦¸ w„âøú*èH‚å4ä ƒÜµÓ‚"1ƒ¢5ŠÄ.¶Œ2”ˆ­é bF½¤Gà¸ËH¦&Áâ²°w.9Tµ ’¥Á3JÇAõ™¼•Ÿ^•hpVkeж„qÜ7®k&ˆ~檉âÐJE¹®´\t!¾»b‡nX×H”Ä1ÓïÍfÝSZ',Hœ³XÉÇdT´q!Â}¸¨9Á+, bÏ‹G›í… UMü*²ðJ­oàÿ¡pÐ QÈa Ÿ­ˆ…v’|‰çßK4¾Æ5fßc°iYëžäÃÓÆÈMhŒ\GB #ð‚ã,GL« œÁ»:¹… ŒBoEÐX–EåWXÇTÒbs­Dꕳ¼@ð6v™XŽæ¡x—º³PË8‰zT½Ý•[IGœodÇÍÚÊ ãDæüÆ2ÏhEÈÍú¥5È4œt¥yµJq#¡ÑrETŒ?Z®ÕÊïÏdâ#î 7·C>ž;paíܱ„ßh¨ÅYÌ/º„£œèp@OdÕ=Ö?Ÿ¦ùËÒÃ|fc–owñ4fý¢Ÿz9ºMK¯ï1ÜÒåaìu ÿíHÕÉœÔF_”¿ÄDŠL¨±½©Þž‹¤xük¨ivýðl5ŒU<·=BDñ²jmO8m?6°Fˆþ 0d¥r8Råº"§/r¨†Á¡ÑVm|È?kÐ ^5Fj×l‘]ƒ>ŠÁ’»xè¶)õÞ6ÌΛ4e“Œ5/ÝÜôóCË-¢:MØéLiÂ?²ÙFûª@½jW6É‚U@—ˆ68ÑRTV¬åp k ŠV‡7rtbÁCXX `;H0ñÀâÁ«þ…¤o²×‰%TKAdbÆ`b'ÚwH^ÃåÌ¥8Í¢¤†f5b%5•NX‡® õΤ“Ö*(FZZy*cíM`õ0cäí¤æa•ÇP—|˜¸U4¾ yç Œsʬ£ñ몋ÆzCþ.~/ÁñÑAÆtnKsz’UO¿¯9ÿ ûúûÜVllá8æ÷.ÐÈÚý®°Àõ9 À:$cÔ˜K {©O¢¦w¦ãPHd˜]:$ˆ{"|Μ_j›BŽ·^"èëRÀ±¬‚hi]~'´´à͇èæþÒµÄû8>IPxbAmùï—“HQã€Øî$þxlÓÉ'j5)m¬™œs“â Ù ™k‰Ô‡ƒûõrXVÚ¨¡TrÑ?XwÑ_QT5ÅY2­¨ÂY[WPS7'!‚,k ãDŠè$ÀÈœ±G‹´Ä®ô‘`«W ÉDbS°\ ®iÄÎJ»€ Ÿ|›C È£–Zª–×GC®&“¢˜÷C²ÛÄ âd¢_§ªj­þZN­B"û ×Ð¥u€©bñí¸¦¦’XvÐxÍ"E×ÄPpgHŠ‹«vçR: ”—_J'ÅP¹±­«!y¨“_èž/±l®§‚„¤ H\5C‚’ºµhS2|ñ/Å ± Â!&ù;tãÁ¬1€«Ç-øÅboñ‘Ëtmg,¤³üÏÀöÐÿg¹ü¤@V\l8€ GƒPç}µV"€Ás´emù«qIb‰'¬ÂlgÄ F|`5ˆýÐóÒ·Û4ãŠ04‰@p¤i ¤ž­¿Hñ2&n8ÉþÀ`×רÀȲ@ȼgíûOG‰ˆ<¢sÑá¿`íÿDPCïßFK„ÁKþŽËBY ×BzP>n„¾@Îd4úŠøtÁXJ¨ýÚ€ôor þø2h+Fƒl(1,ugˆ¸Ýúe⮬:7" ãÒx}©T’Ä…Á0üJ¶ŠI'µò,A7dÄÈ@ƒ"F‹&îÑ£E Uñy¼P¿ ߨ7l™dˆ[ÉYxn˜ß’óÝ‚—ÑxéE¯{†¤ò·?ЖQ¥ Uœ7û\×.Ϩ‚ƈ˜ŸÏ³ k7sªçIa¶;ª#,`ÀŒ(x˜aÃÚtEàæÏ¤_Ù8êŠÓ00ƒM@$\ñ¡¾‰¿,^h ò°/,JæUeµ›ýÁB¹c¤wN™EŸbáÆ“á âô+­8½© àlå é+—Ùר‰“®Þ°|B’µÑèŠD@õx^°RÀ±2ì ©FSœÔ=Î'Ò88õhÛÝèvxu“€%!Àáψè¢Ápg—¶É0ñMN—.&q”‚˜ ‚&¡Õãáþ¡_KLG¦BÚí²ñCÖfÿ"t+ÌîÂóqfÔјw:»¡yÞ”4œ£±xš2:ØV‚ˆ»"™Ë…mý ¨†¼aäxïôyýê=JrÀÛGh̘n ƒÞ :LIKíÂ5"ÔÈ l¾ÔìEª>$6ª2À¦1"B:¿dCùŽ"¹áùÔøš(ˤ ¶#Øtø[%¶xjq íþßdf4vF½¤Ú#VÒ‚M`_¯ —®p€rÏ$uÒ”F$WÂ}%äÖü-p;uÉÑ`‹ ³c„8«šeîéÑÿ@HEãk?ê‚/:‚a¿'…!oÒ±·úš[¢ŒH”$W‡¬ _ö¦¬ÒYTQP[[`ácÄ`iv>cˆ ýÔ ×­B1]öªpÿ{-zíÉ—EôK¦3õðUe\ÄÒÞÀE,-¤¿=ÔÑ-dhzÿ¯»âg}Z…ºÐ^_.Bªžôúp½8åí“ltd+‘;tÅ&XM'prpKoxeB,Í:ãw†¢Áæ°+ÔB‹ ™¬ÑÒÕæ Ÿ$‘|ÞÍÞõG"Iô]Z µ$žïlÔ=€ªÒóS#JMÔ?Þ¨!ý¹"IØ5âû±«ü݆Fge5úƒÍ‘ÌÖˆ'‰„¹¬Vtú¸¼~gK°Ãöd9QYÙ6Ûˆ,›=Ëž“5|Äðá#Geº"¡ÙÐ N¢Ñá‹xI¦ñ ÇË‚`°·‹;Œæ¡Övù½>àË‘›t«t)_¤z#Ó„uHÒ•u&kl-v•ì8 »xB¢ŸNpÄp‚¢ÚGÕO=|55œÉÔη9Ä|õŠRXUUQRPÉâ}¸ bµ8#P)]zÛð\Ñœ +el­X°3š&¯{†½\`¿6ÔüC;8I¤€_ƒNʪ‰Nȇ”¤æýSS!poAñ¥aHRoRCÈ‚¨šuû¬Y7i—ÀmAOWš˜ŠÍÒ¨ù±C2=æ°*¬Œ µÉ±á±ƒ‘ÇÃj¦`ô¶ž>lÈ‘Áj®-Ve¨’="×j&Ò¢Öú0eŸ£"\ø ±„AÑÇïl¼G’çÙ†çiÄõ ûJÂ] [{ciêȤ,É©{È› ¸…—›ÿÀÜЪæAæ›ã|Ⱥ^iÊm0{¤ WHn¿p5ZbÒ×pÉæP+vDý“í&$V¼àXJ)BS|Pû`ѽ¡9±k ùü$[O(ä#9×Y¯Š Â-+Á6xŠb›ÝDðSd%ü醵Ãïf3®ÿêÔxl¹ðW6û«GK@CvXú ›QOFmÀµç…™‹sÕMúWÉ"IËR2µ ÚY8½®Ä’"v ñòiƒšãŸMÜ)}ƒå¡F.6bí‚F@IG fÿÄ)‰Î8æÚé å˜X‰…,iÀ·iØÑžüÎNpöw.Pf»ß6{®òm„J4™æ(VkåpåÊáJŠíË¥ãjgpæ.g˜@nºÂýªÝ´èZY­âì<ÞYN’×Bb@ðª%ÆÙѧû5A~^lxU Wb£tÝGü@ò «Ý[ÆMg/ëã| Æ!z;‚VN·sýÙ Š õpA¸ÛL\·ÂبWíMq7ÆûC“Ä£Cl¡¿FÈÍÙè0É5‚Jc³ÄfS$©Ø|¥3'®‘=˜yÂk@{6]öÞ°À6¸% N› ÜHA•1áV^R[)FÑ$¾V“CV*=²‹ ê Ô£8ÑL¬ LGÌFØâÀÜ6¸R¬†Ùwó:·øÙfÌsÍt'öØŠK¿8©ã.q펑d&F+‡PU†¯–"&UgÉy´J2jÕ —‚ä"Cn ŸêKž *„ÊÔÌ6¸¡ÎYXP¬o ŽÝ=i‹p U x8© Êb¾2l˜qEÚLÖ:÷Û›œ¤MÖ‚Ô1ŽßBçï£WÉçm-s\þe[êc‰ï8¼À øœ%NF_´{áÑ R¬±êûd˜“Ïv]ßÀq6†ƒ3½ ZÐ(zýñ/Æ?wìK†=ÓžiËrÑZ$`@l„ÒŽÞ̧é@ǰ¡¹99ðÓ>r„ÿ‰þÈÎE¿Û³GŽn9ÒnCÏí9Ù¹ö^Êïj!ÉdlêÏßÉ¿¡ÕÅ¥h÷s’†¾ô嵋“F(6%ØxnR^^V¡ü\ô¤&«Ôçe)«Ôxs±ŒJcÆ$Aâ=WkÒì7MßøøÉã÷-Z¢lûÍꦒ²·î­ïë+³;V¼ìÝVž½vÜüϦZÿÍg×?´Õå¼÷«·#æ/ö¤nN{ýËý;—mýþÔk³ÉÜ·û¹GßÛì|®ø“¿ŽŠ¼òñæk‡§Œ=ýçGüãÇ<4£àª¾Sv ÿîè!óÇ/~aI[á”§‡oÿù–Ow>á¼ùÁª‘O<Ø÷¹†õS~U^8ð²²?Í›ºwz¿Úk#+æ\zïÔ×¹æ—öÒÌy—~¸ï“7ÿõòìk\™™ùtÇù»^}(céŠÁS}›ïݲyîÓÇ,Ypê©Û"_¬*óÏZøs×w;6¯¹wÐÁg/¿ó/#s>lùe{Ìľºä´|ë¾ëzlõÚ›ú<^už÷’Èʶ_ôñÂòƒG&¹í•kß<+gë ’§¸}χÕ÷9 ö•g¾º8ã)×ÝøAä›»ûî¼S?Ùã'oþSJúI/”íšýã–ï^ß¾e^ýÌS3¯ŸùÉm߯s^™½eÖSÊU;¼^6í£Ë/ ìÜ=¥¾aáÃï¿çØéÊ ÿ5¥êÑ‹SÚVŸ·$-üͦΑs¾=ùö½åOl¹,çÇ}í{6Íßq\ÖUŸþÐv.ñÍϯ-|µèøÅ]‡¯ùǵÊ–ÿ0iÙnË…™Îö®ê³ Ó5÷Ô–Yï=ùË]þ®'^/¸ê‡¶Åcï<¶óö2OÞ¢žžýRÕ‰ û¦œžR¾öëgòÞ—~ção_±tæ§ë^züÇê­õí‹ozmû…ïß³kÅ””³o̸ØÞŒÏ ¯:ç¹Ç#¾;ýñ¾s“J§.ûáC½/ÚÖöÔdKÕMöCÂ÷FÚ¼æ­×=–ùÜèîWÝcW÷}tâY77>øôžG&^<»°è½Þ›_ýÚ£ ¦t-èsÇeƒúZ×?têŸ.xû ³ž:£¢»ÿ eÅÈ[w_“wáF[Ž}çðÓÆºø‚ÑßîˆNõ÷Í:cõwëXWœþõó;ýkMÚ%þõÙ“·Ýç½nÃË·­›òܹ‡ÞÿÑ %úìsÆTÏuÝøÙmU/ÝöÕÑóúO¾ãŸgl\’•{ÿÒg¬žÒc>=¿ñ¦^útçÞ[æ­pÞ;ìgž5`Zë}>wõË)_úó?û^ßSúEÃLJ_?ºÿ7×ä­Øµ÷ÂþùŸå¦Nºeõ•³†¼µõêû]Yqݳ½'Ì/Ê:á‚ËO™²£¢j‹ëùw/¿taÛŽ×îë5à†§_(*ï³¹ã³Wï;åmg~óùÿ>êË÷–Œ˜öî•s®Ÿ~ô“ö~=)xë gxƼ‘šÂ'lW¼mÌ+Sçu·;xû¬å/ Ìë3÷ˆÞëû»Ïïîxª—££äˆ²—_å{g•å´í§g|{÷ŠCŽüÛg÷÷Îøö¸/ýÏ/Ž9ËoŸ”ÕÑG9mÁK£—Œ1?é¼ÌÛšz]~ÙÊ߃×ô4lZqå‹[æv,}ã®97þùˆMGPŽ‹žsÊſ̴ 9ô¥h¿¯WW¿²àêêï¸òñ– Svwá‘ý>Xyºg]^jÆãÉ‹^Ûtÿ˜þîêg_ÿÝÊa¤÷½gXýÐG^Žüõ’¬'Ìi9r{NÛã^~õ¾;.þbûÖî{tÒ[¥õþjû²‡–;fôñì>ïðŠqîõý Ú2ð]çÇɃÞ\=ï¶]û–ß2¿ßUËn5pñå}û­øyPáY_ÎJ_WÝ{[Ñm7z]ÛüÇÏ?çõó>[­|}çœÔŒ[R:šx脜;^µí½âÈ¡y/Ôß4ñ²ãû>³ü’ãfÎ-Ü:ºïí%»Ž¨¸fÀâ­Ï.ìmqÙàP÷®â¹¬ß¥ý ;êðÏ8ã =ËíuÑ#»³|‘¼dô‚w§}Û0¢ä䇚æ­|±¾ÙwÛ;8jRAŸ›kÖ®·ÿm@ýéÕ8ê×{ãCW <ôÇWî>tͪ;Ïø(|Úq?$=}›¯÷[i#/}y×;'nغcÕ;®+OzáᎹwݘsÑ][yFz÷™ÁŸŠ‹;ãÌ¿­Ywvé‹»)Ÿ·\·*÷‚^½Ž~!|ÊÿwÓ^õir¨ rúâÍ'l9ô–¢Û/^øùš[|ëxï9žë»ì7hRý{oG§§Ì8ô•ù‡o»gÚ +ÎÝÞkÁÒÁÝ»¬«éýéW|ôÔ­{më;3;ÞY¹iþêEwWþ²ìOͯ n˜{ÒœûkRRÒªO:æˆqMÿxlxŸA?$Í[ÔkZó]O ö„ÎïTnz¬×úo¿ÎÏIßVZpô)¯É=ä‡×ìqõ#îœ2ªÏ—»ºF³¾×‰çß[6ïÏGû±u嬦nulü©µæÑ#ŸñT7‡Ç=ûŒc¬óý÷¯yóÖ«š¿œ\µÍS?yëÓÏ|¸ðì¡øþùÞ ½r>Iz÷ó:Gæ±33Ÿšº=ó‘`ÓA+ªZ°ií¦íeKZŽüdówñq“Ïy~luò']Ó§¯Zðü¾¿l»zûë–s¯[úr¯•åǯ[ÏÊ­/­ØðŸ=—½wƲƒû_yËSÛºl‡\Ñ»xµýÒ—–4]>ß7‡íºëMÏÞ~å'Ò¾aÌ?òF,q|5öœõ·îûñܽ…ÿ¹ëƶ”Ï7Ö¹â_¯¿÷{æ_÷4{Rÿ/î¿iÜžIÇÿkÜ']²bKþ嫞OIéštâä÷ÿñÊE9ö¶ü%3'=6ãšoî¹ô¤Ó–¯é7gUF¸dÁ†¿/ÛqõžÐuùÈSnI[wØÚÉ×Ï;vÂcý^÷â¤~[—®Zܵlì ÃÖ ¬ØýÏÚ£Ûwîþh`ýÀ«?É;ùúŸ\óêM߸rZ_ýË¥'ì÷Hû¦›öÎöÙ]~뼿é›/¢Y[S§þ妿¿»ýè—Kíîgþ§û†YGíÞ½ã½-‹"ûöýp^gçS?ÍŽÞüÔÅg ¸ø‚…=gÏóžy”ëèñÛLyyÓ‰Ówß_¾kݧ–½5¯*§ŸÓ¸ôç·,ß¿±ûÅÕ…c7äÿ{Ï—¹y/÷ cÐ!çæ=°$íó3Þ5¨xß k;küîáy‡yß%o|ÖçžÏñw­™6tÞ—oÛnìuæâ?Ï™ôÓª´¤j×C÷¼wó½ÿ´Ï²ûerû–“j*Ïîô´½õî}ÏvìéQytCiÖÕCæ´ì|µ¯;rú´Kjï¾òÄwn=nùõ»Xd-}å%·uüÏ™•ÍýŠ–üÛ¶#çÆÝ?>o?êáyWŒµOÙózÞ¬Úù—ð†µ×ôj¾ýñ[ž:¦ÅZÿIÚñáÚ³n\Ú9kyí%EwžòTÅÞSWÏX¼v_¿‰ýïY¶Ðæê:ûçŸæîž÷ä÷ç>Óë°ìÖmÜtõľK¯ñÿ~ò¤Â•_–údïƒKû~úˆ»OÞøõ¥ƒ?¸û—úÓ'Ygf\Úë4_ÿ¾¿êvï¶}÷õ½ùÆô•-ŽGümÕ€ñ×=øýu{öÝåÞxJ$ÿ—ì'^^½ìÊMÞsûÄM­?^°eÊ—{2.Ñpäàª÷h‰>¶híAGe\y÷ASVF¿öö‡› 79s§_qyÞêó¾záT{Þö¯/î:V9éïùcºä˜Úu—ѵtÙéÙe7Ì;aíªUí¶}K[Ò––” ²ÝýÝÁËlŸ¯´òÛµEs,îè÷ü]Zç<7uBGzÊü›·½ù€enAÞ ÒÛN\Úöä¸è=å}k7~¼£üO¿öÚ÷¼öÕÿ±÷ðT¿ïã8n—=B‡ìuì½÷&3ÛÁÁ±sì’²!#2*##{G’¢Œ²ZHF$õ?Ïs×ûýy>¿ï÷û<>Šó<Ï{]÷u_÷µîqÑ=ãyUœ¡C<ó]ß¡Žyìáaµ£ï|½î¦ß'¯¨l¢Çaý‰÷‚”âúÖ{jØ}®ûû¯]2|ŸÔó wž¯ˆH8‰ëÚœ|ðM¾bR‡‘Y!lï"›yóG 3ÀÉ|õbé\§–nNvi5ШŒvën)€Æ²x=J¼tJys¾Œ5à}ÚBƒÍãi 7f¨e›)7êÉD×û¿ªºüzÓ:Í6’?q×E äsNÄmÈ÷ÒõQn/úD·§ÎæÒ „o®tG\Ì ^ÔºT“­·@ªEÐâ›z!èÝiÕ² ê¶OC^>[ºÛ;gú~8yÁ±P,â ÐzEöµ_Q!¡ƒwB?5bÃO(XâkCía9"YX\$&$`‰ÖGm=åCäò6á Ê3â5îáãe…#*Ñóò°3€z›ƒŠ7lõ÷F”Sö÷V5@åBQñpGnn¾ 4m°"â;pdtøj>ÁCø@HAHá °&Ì2ÇCÕg £ÎDð)ʼkˆ,oˆ«‡ãAûÐkC½!HŸœß/m‹þ‚›Ãnàuõ´Aü22-Á¢¾(²œþ8ŽXúüxüH›CŸŸŸõ(†'öKŸe p(€/°™†‘—!Ì aÒª#ú³C"R ¹ÐîéíáâGv .„À4pøEð ñµ ûÏüü`˜½·Ü$((ˆüåûùõ)ÌÇúË?¼¿¦ü[鈚ñPõ¿BBB‡Ÿ¢b‡ïçŸoERðP Љ#Ê þ!ò4现â`nºË»Ãa‡ß |lChHñÁ8ß0®nf¨§fºqWûßðÍÿw| üßx¿c÷` PïP9ÿŠGaÑÿˆ<nDDD‘ŸÏ"HàD¸päÞŠ#°‰Ì%*†·ŸÀ«°ÈayTý?Ÿ~/DNäxí@ |G×Á“‚xFŽ—°ÈþH"ÇìgÊAíÿÁˆ‰ýaÀ”4ŒuÔõöLßà âþ눉ÿ›&*øÛ€ý>\Ã< ×ñ¢:w¤‹‡$BÓÁ49.€oC æ` ‘-!‡HC<í§à (rèi¨†÷σwt’|Þád;xý9 ñrÀrtŠ™”ÿÖôG‹à ~Ôþm^‹ÿÊÅÈ š¿Òœ ðCÝRÍÁßùÀ0<€&Ü`î>pË#Õ þRýqrC~Õ¸AÿʼrÖœ‡_PÄ#À¿O â‚–€+Ê!£ðÀòp;@Ø"Þ"ä$ÄS ì"D}Ò€¢x`T­òÈë_ ¼¡nÆ ~>1„ŒƒÁ}NH‚|~¿!!D2@ñ¡Í†€mÁv`{0ìv;a`°+Ø ìö{‚=©ï uðF=y€½Àp°7¹‰ìöq·‡zÁí<¼ àdÿT`®PA`Aû¸|ù‰6”óí¨ï ïø`*8ëùù#{薃㒽£Ï¦&S¸±dܺ/Òñ~¥ÞÊÃÒ'¾ÄÍHjÐH® S©.É“ÅB=,aW¦™ùÆIt/Ï'„ t—rØkë£W#ÆJ\î5LÕ¼\iÞ:½»3©ój|¼y\t}±oס9ýÇ—–g3¤ñï 9•1/^ÁN2’,x——ùl°Uß‹ñº…Pì7qz…ö¥ö%IÐ%"&‡G¼W·™]Óˆá¡s¡W‡`U}4Ão/)\Ð1®z¿¼·KÄk^a»ª:vÿ¢Ÿ¥aÔ7YݼÜÁ€ûêÜVû¶õðy55eôc»  ,n’—ñô­56Cçj(^F¹uûÚð¿Ðq¥ª9ý2â±-¼¼îëG£kš>è×Ê[¹«+ñ¦òðßý¸õÀÁ“ú±¯MACLì§høÃ¥Ìì וåO&3«‘¥ùF¡7VÙ:TÛ{úOàŸwTÃ%pdswîE/562AŸÍb–‰Âð+g:Ùøê{»ñ÷RËŠ·{ÁÄÑ:ks[Ó;³œíýïµrÈ©ÃFÚM¡š$ö¯ qm>£m‰à²`øÅoÌ­M£fu])…,q9ןbe0¼­½/q±)Ï1ŸçÓ&!ƒQœˆ\)þà$CÛŠª÷v‚–M!F³ˆå×ÀoB'”^»°K5l,ô6º˜œhÁð[‹*œžƒi¼P\6 ]jL'U<ùe=Öý"sÙö¬ÒÂ9ј‘›QÑè _k㙣`óÙÃeI÷^ôEžƒM•C¯R¨Rº"öØEãbÁµÑ»EÕÅ"è;Óåq^Ä9cËM“Ÿ2ꇆ1n3>短w£ ¼}5 uY#^–I³c;­-›±rÙMaꪘ"C¹'ýñÚÐô–lp— Ëê›\h&%‹X­¦òR‘º4ñéŒ×ÀtRš^ßí=Gš°ï+ÚË<^Úãç~ìxç±åÈ3Ã&#mí­å7Ÿ2}\‡s_E:ç”ù<—,ŸIª|ÐU=Hí8_ÒŽóíy׃Ô@,x¯yØôlŠ»È"†8¯kÒ—™ÌÚ“Äíž ôò¸líËbn=mPÉ™ÙS{·f/['B=ñõ$ë Ç}ê~. •ä!vÊb‰°ÓZ+œ?N^Ç%-¥1uó¾°EýÀxÒóMŽs6/Ò‰ðªâ‡š¬gÛõÀ™?R.: †1iÀvº…–1yšG¤ªt*ƒÜäqŸàœ¡“+sÝ®®j“ùù[¤‚éî“ùâÕ` ÚešªæEÁ†ÂÄØ3#¯_-ûØ+òˆâIØt‰HÏ}œŒ!÷št1§µX(- žz,“s÷gÐÇ­tf*6åpn5Eú¡¯¬{_kçq]ÊÑqºÊ?«wÅl¢Ã­n×^nãÅÔe=ϪËúwÔL_×ítøÅ žeëVp¾¦Š!»Ó®{v†:çQBï„oüJ ë:Ðî¯üÌh4rCNÍõa«Õ“¤Å]9¬6^0é§v“„­ Ãyaëœó­ŸØíO¿þgnC°ÊéN¡N®QÜ~¿(@Æ-•¡H'´C¢ª– =4mœ Ý2¹llƒƒÓ0˜VT‰VmÃ7º»Ì6C0ØŒÝ÷è-óÜêÇËÛZ0Ö/‹ÓÁ¯~|†æU~ð…=z~ú¹CÃãûg¯9g¼õŒ1 ”š•• ¬S>PШò]ˆì,+ûj[ã^OzC½S¹ødŒ/Nß–f¡†`«9~G¼Õ'êýdõЉt¥³Miª›ÂçÎ …Ø·÷vܽxY•ðãÕËg0»ù §p=;åOë1™Ñ„pîMR967È;™RÈÑ*4Ÿ›–ð†| `øŠ6 ñ›l„‚ð¹%¯-~¼r×ßà<³>%÷³¤B)1⎖Zù*¿Û>ß^„‘$½Ô’ÜÃ*)êáSsôˆé5Ðã[!Û²võ3ÌMrÍ– u:´š¼’¿`NjvuZñôPÉ&éÊT&ÍöÉ5éß2g}FFv‰[~ÇŒF'ç Û”I~®²uîø;²yó…Ïü¬¾i\rX`½‹^Ú¥g4ç%f™ª¤œz£v-§ñœq{òü‘lÓýµÓ‹Sá‚jŽõ 4Wº>^þ 3•†åßÔíZ>Á!Èø G2’;–éÅÇ/غ'_&' B9n‹UÎ_q¢i朧V;uÙú„Íð»¯6ùA0X\PöEÿ-8º)Z¤æI%´0ö©Ø]pzgá*fÛ·b&^E+x|róÂݽ¬›Äô<ÿ†Ùói…„žá÷C624‰KI~œ^ZZmXÝcë'ósϽ20x¹ ›ÃÚ¼þƒ×©C—ŠaiõÚtÌ Þ¥65žÓ÷ÞdlQñyÀ…$oUÉõ`s>]ýÞ—'ÐÃÞŸ3n-¤W!sÒd|“(X௅{­øï…}…ùÌ…o|nRk=ÇB³†ã8J!Ì99°Iú¹Gs]Vóâjaˆ×M¢ÍSŽT i×$²,JŸ¿ãØ4 pæjt?óÚ»AJg@Ð?Þ·7U“'ݸäþ–Ylù[n 8Œt²-±ûVg9•HŠoÜíÁÞ1… ¶‰‚a©Ä²ü;Mu þ…UNVø3MéNzÉá¸ÌOÓ˾“²õé‡S©ÁmvY›ØSm•¼è9Û£–»Ù÷"†չ¨D®÷hÅMЗ½‰Ö—¢ç%ˆóÊxu¾Hƒ¿wÙNÓ?y¹üÜP±ëµªâÔtUÍù3Ù½Ã+ï6nzsÓ¡¹¹Ý!V´ÿ KôvŠ^Ÿh|Më[‘ˆ¿Wú0æä2Ñ+œ–3f¯.p†óo-¬Öï¦>vøw£+ÖýÞ˜N±É‹ócÒCãk….‘àŠÛ’$ê³ÑävR²ráô•èz/ù,t¡–ÊÊŠF\0é(úYõ/ƒen››Ùªù«çmä?¸2-2‡ýÍ¿¥ŠÅQ×›À¬>ÉÛÁ<«âé:Åè×D½Ïéœn*O„¯ž$É` ·o2º#q%Ú¸i,¨$ÔöýZj±LظÑ;Šº Î3M*o•žs©o ÁÑšOgŠùeIDI¢Y™?Os£…ÓÄN Ý{¿€£gQætZú¥êNJÃU~b™fŸ"â<7×ïÄ·îÍ‚ÑTª:X:<öúïZ™…µ?Îoá¸s3£5ªþ:ÏÐ&Œ0€Í¶ÈA6*ýùÆèÀx….L ~#¶žºYÒU‡·S_Yζbó½yUÝÖR¬Dó §åÜ€š{qTÊÔ¥{¹zJëÅjù¥רÆòùœ[ý¯^VLü”1s%›Û&w®'ãã÷ʦïŒaÖ©XóSí cb6¾.8G*¶¥cUo‰Ð÷nßgƒì¹€zÜPŒŸwÔK{â¬$AÎT9× GÇþÑÝþñj"Ò/ª] —fÂ%ß ÑOÕr]ûÚËu'DÚºÙWÒ÷3ÕK_Ç•gs}É¢‰æM|gŸ|L—$›þèe¤WØ'Á„Ññ0V%ï77(?ÿ¿i²ýÙûƒ4Øø&ŸHQ—ˆ˜È¡µ&ôÓZ9f­‰ŠµÖøþf­‰ˆü£µ&"xÄZ“+€ÁJ`e° X ¬ÖkƒuÀº`=0‚À¦‹GXW0¸ Ò´C^|hà9"7fzzÀ)¤µçîãf‹°ã`Žÿ`ø¡N,"í?äÁO„xÌþóýÅüÕ+*úŸX€±}Îãž70inágþ’wEcñ†rƶÅdýs¨ëÍÍzÊJÏ18OÝ@ƒàŸá&R8ŸDFÚÎp‰9íaÑ•SmØ4§ÞONö<è—RÝÍô•Xv(ˆÞ™ÎÄßjJ_ YmØižŸ†¯ˆÿXøòc/”®Ý…´íµçÝÉjóîIl•ñ Š?»¯þìžE˜íÅ,Éú˜Áµ­Ý.6c«ÆÛmª‚9^´¯$²f½ÄNç{Ü€{å÷pÔUμ8ÃPa3”÷øÇîü—Þ-Â’V›/Ÿ|ä!­‡o¹l«63[ÞHeìyF˜êйÔãÝ+ðFÀ1ú©ñQz“f{_ïv &–<÷LZ:eµ¸KïX¦ÛçW³_ÖçÞ(â6*²4$·'´})XÖð÷›:OÉkE*Ä+ÿŒÑ— ÃgKÈÿBñ›ÕÙ-Ò2²Ý+{o0mIä]™DÈ»A&? ŸK{Ü Xµ{>‘ì¤âÝÕ¸û}ÊïÞêl½p9{kf$ân‹`“Ó×jšRݽí‹ß/Ê_ tÚ¢×Æ ª]c^¿!X߯>¶…ž%…Fsz^ÓÌ,_&?¥#‚×+ž¥Œ¡*¢ëQwÝÝïhiW-g>‡)ÜI6N gº3)×ó:ÄK “xd g%(nG€*I_]ß. TU)éZooòÄöò÷f¼>\n Ý"MÀMyo õ&ç æ }»Û`íÓò!6.Ú-Diï#y7NˆO˜•:«G¶½íEŠr}NÙÒÝõ¹.6øQ}mÿvÂ¥6æW„e/&ãžÓWâ¼ÙKqLkùâÉÛvýÕ9F ¹èè»K zöÎ#šP›'¥oˆ'ÈÃÏëʯ]·ž-o4œ3x¦)]“è%o$Ò§lrM"§f~tŇþ¾,;y¸•"þ9‚«áð!:ö(+¿8Å7Atù±·ˆiVXúM¨I¹fƒy¥®_z'Š­z̓y@©A˜AN~åfhÄúë{·uÒ„ÀR–Þ~LÕïú;kiÒ’ixÝ7'ò’Qxo¤h[™ú¸+²†oCr>£šMJ{lÌDŒaÈîY¥Uÿ̧8#Oúñ¼ÆžèžO3|ìv6Ü·°C.ó>Ùï5ÃÓzžv «bâjˆ ÞûôosÍ{ë°—ñ¸/Ϻe´q–+í蘹:oä6f…]ºMYñ⃭Նß–±çK•½·¡ ú—ë\8XW’÷ôžõ¾)l)K(xb›$+Öˆ®ÇX‚’2¹%Ì §³ðÕ§ D-§XXøÏé©o ŵR8¼¥x4ˆ}§ËýSH:Ÿ…‘ }&[mÞly,‘ •pØiòWÊqÞ[ÏÇÞâˆä™Ð–ÍùúŠžM·pKIõî“â†\˺ùâ‡8×9 ÏH¯Æ¾)‡”'n@AV뎮²áËôΨ¾Ý­6ŸÐûñ‘É$͈0Jó¾e¨ðí„§ˆ1g+2ˬôßadŠ`»¬îšàç[*8ê„Äñ\vîP±nU9Q”•Î,]½ïQ÷‰ãÛå(øç'>°tœ Ë…×%õR±tz\¾­ªí@‹ bCSÏâètXæ;Ýãeö˜­Ó"ëw|»ð”_rVt 0wcËù>×µ);u“€—î”Ûê3¯«’G>›,ïyâe] LÕÖÚigSþòZ—¡_QÄéfšZ ‡Erq¿ï’ g–4H‡lå•Ìèf‘5{™‰žðˆOóå+ð%Çlˆ;¬Í>’†ÙÄUåêöÞr£æVÇõ.8y²ú­~ÉåGÜ)øÒ‰Ézé#Sɯ*›Qkßö{áQyÖº·'JMvÎUëú <á6±»Ö OŒb_ïZ'a–¢J›GäÒug‹m!ï«qJÇê4VÐWü¯iýò¥ú#'q8¶¯>e¸!ê¤m‹ç“ ƒá¹±æâ›«(}âÇk‹á-{m+üÁbþŒJ`F¿5Å ó‰ ‹£) ‹Kr7œÕ>uø ep?e{R+I•¹u"õÅ[*¯ÏÓ—%ïÓØ¤¤ƒÕn| £c¥ê&iºÝ{Fèù‡p:òTª”®ò/1ÆÚ"XxTð‹ˆ°´}ŒoN”h ³–ÒxõŒyÝk3s!ä)g“ó˜ÇuZêXК%ÑÕö¹Éâ q°|dM•‰2«EŽñ û õ;íúÚÚ¼vnÌpçë–X.=e¢q 3SÔÕÍÚߪ¾ä?ÝUcy^ß‚müt"ËK.Õò¦šgR‹i5%âé<Ý…(&ŠÎs Ѷ– ^™»zç©FK¤ð¥rî{ ùaU}ÈJ-}nKçÀ.ñLL¼`¯®9Õט¸.Þßiž6a®Š½ñŽô™rÌó•8Ÿc5׺ñÂåÞþX:3ûÁs1Êc(_‘#š,Y©œ62™n*'ã„ÙGé°úé&Ì!'c5µ`ß/é¸oÒl®qðEßX3ç)x‡«¾‹7†Î©5*Ænû¦ç逡uÆ…ï:Ӝݩ≠jÕ¾§UHàÉÚ'¯6?» àÁ{vwü¾ádR£ 9e9Es™1Z.VM­ÔÚ*눕iõŠNövâ¥+—0?oXœ*â*..ÆbM6µ/Á ÔSöY”Èèڃ݌÷{$q¹ìFrwvÇxZÚ®œ¥ÛÍÈöoùÍ}ÏÞ¾¡‹Tà­Ü¦’—1ÏB+JÝ=Ó‘Óâ;C]ñrCÙø\j?–œ”O¹øê|Xӻޯy9ØëƒtBâcg«x}B•ßî~ ¤ÌµÂÔ´x¶çS;­WxOP*'Ç~­æî®+T9îñ“¬·£µ¼¾ïé7D]¿,»*Rnt·½i Ä•ÿ¢¿-é¥ pµwX@ÿi®³„AÂʦ†¡âVž7ßÐkµ²´ìˆÔ.F¥mÉKt]sq³-ÍÍ· ûAЬI¾ H£Í_;Nâ²dSÁÀûõBüÞ«r'6ñçoKë£îq$Ôå»,ã¯1üãJbáà"§ÂEŠþ°‹Ë&e¾½É§'ˆ ¼¨éÎ×ù§U3„ÊSŽq‹ó~ï2%™ ¹J’X»áç³.‘ìYW±æ@ï+©®#3(ù¹MÏ’yßA˜øqïϬÚëOVÎ܉B+Ï]yht»1k×±,¦Cå¬%Öô¢8‰Ôä*ßÔ>4Ÿ1¿x"–ÿâ»*¢Âl­±>v0h[VŸêS†Ÿi i‘x¹÷ñÆÉѶê*÷Ùk”ÂÍ@ütt]‚ t H—Øñ”ûåÐÇL—Ò…ëo©\p’iîd§ìW\·áv¯ZÿÄ=¼#¸;”Psw–ƒ¿Áñ¬Ìg¼=l†ËãŒg’˜ž×2bÚ(Q¹UÖö•É=Šm™Ê zQ«íC¼4×kòÏŠæÖ›jžé™™q?§¸A…É“ºÒ¿¼ ¯Óµ ”­vVÍ—âÕL²…¥>·Zƒn\ñ w©®Xx®Ô±[f—™Í—Ý‚9³PÓŒq¦nûƒ‹¦3a¶¾ç \Lí&Ýu“©Ûñ­Täóý•·åÅ&ݱ6Ð6Ú÷vëSÏæùä7°™Aت˶¦Fo´æ›—’R¢¼Mn/î¶ŸÊtÎí¢UïÀq[s¾ÁÊÜ}N ´0³fŽyásü Ñ›&Fç9ŸÜÏï¸\¨,˜`V‰³üŒ%ˆ #ÙžŽ5&²Äûìi)*7žÊK¼ÀD·Ò%öSw –p³jM±þ—»*KÑ#ƒZýdë3<žë} _à^R­%˜^÷Tõk”b 1^|vœÝ;\iý‹›êtYLY»c°’ñE—oWݲfžôHlÒPo\ÁŠÍ¢*²»9‰«ä¹RHÍ1u~m|¯%ˆÐ7•ö*•Ùè¢uwøêÛŽPñå‡T~×bu^“­Ïè4¾V`Llvz¸Æ„uÎÜP¼6·jcBÂ5~Þ²4kpA™WÀã¢+…é²*ízí­÷rY®O§:BµIµ!W!yÆÎÁ…Ææ´2}ƒ6I‚±¶ÝœóT²žéÍ=›‚ÔŸxçÑSQì),HQúúu6T­Ë¼( P‹æÙ|Èõì×e¢êœf‚"!ú !mâ'ê,ü¡–BšŒ1¡K_øŸœÉ–¿ÚÛJ',|äOjý1W¢§‰m~%XwÑg3ËóÆònܽ¸Þ/ª{Ï{}fYõ¨Ì´­?,{gÒm/¾;•¶© ¿M÷•{+¼6tÈHCÅJçTò±ª¢[/^û™Í¦Aä¶¾ç™zïßY_“°Ô"šs-'0®—{PÜ6©oç­ÊîÇ%©kž”{ÊAsƒ¥'eÍN˜—FЩÌÙ}ÅÕUpük‰êÄ­ôôl0W9ùK¯ËD1¦.ƒ&XÌâ›Æ-yÊeNë œ}l%¤Ï(aé–-x)ð¹zaMÅ9[+¾è'AëÜ™·õýÖ­æ¸÷Ñì®åžçàyZÆŽÍÓ´Z:çøa(êê¤m´Þ…’ûů ,)MÏßñHÜd¨¢ðA+yýñ£‘ˆÊy%~Êj–‰8;{^Ÿ¢YÙÚù¸¹o$“ ŠÓÝK283z~dQDùô§ð2‡TGNÜ»ßjÈB~Eû¼C†ÃØøÛ«ÌŸLžøÂ.³´q'J_ÛV¬±Òs%vÒIÜ^Ôš‰y ééqÚ"Æ'÷ŽîHÉ}íOcMëô˜uÜÎ!ûŠ»ЦXÑ®6µ¡qQpc©Éÿ“ÈökK–™¸«j¿õÿ¨KoX0¿ˆþy©oâÛòöÕœ]BïÍ×Ý3mŽÊhÚ+?ÝSýØü”’µ”TCûÛJžXÁKWþ #‡Êøøn«wŸqÓ’g2Ú2ÍXkÄ¥*ý.¿ûüÄÿM—ß_öúüøÅ@â‚ 1±ŸßQ—ŸØ1—ŸØ1—¿Øß\~‚ârùýâå||ªH/ŸÆ¡ŸïÀËg‚ôó¡Ü{®îGœ|HHÀ`â¿/¹§Ã)ÀÓ ê~¸µ¹¡pùÁÜ¡`°âï?;ü. \~P7ªµçj ˆ·ŸÇ¯n@?°ÿ/®À_7;Šý'®@aqañ#®Àó¸†ãõ2üžýØ9©µŸ³ÖŒåVÇU=—xƒõ¤Hë©Ô#„Ë,‰y™Y.ìr@J)]žŽ[õØ„Y1½kÓfMÁò{™W} ²lfÞ®úJÛT€–2›~ìíýø2J6Â|­ÍFk=.ŽX×r%úÌ­ÙíP~áxù¾l¥¦~,ö×Öº}%"`Z|}Å!2'êÚC.?}ç9@p­ÇÆÿÚLbZJ*)=MjÍ;~Ý™G7y‚¾”éŽÝ7kò•??öô\PJXBÒfû5þÚ§ÚÎüíO—«‡Ö ïŠñYE¬=Ù‡B»1>=Ù¨LùÑx òâ®îK²=?f–U‰¬z67¯Í×öÒs¿ñÅßO>¡K'KGB³@³¼@ÄÍ;í×ÑUÀãá2cÙÌä¿yëË´uù4}Çt'‘~ÅÙ8y>²/Æðt5–³¤‰ÖKF5]ß±Yµi~!ðŒøeÜŽdùÂy´2óðåvcÛ† £ ®àâ â—ñOwK•—G¼`t•!Έ×îz_Îq^j‹vñ’vwmiÚiüŒëü|D"T» 8´ðööŠ]ô¹§ù„É:‚7{³,²’2Ä£Å\)ëΈIïDÏK¦f»ž<®Ãpë¡·Æû”™Â@-iY·¹ªÏ°¹²5ë†U}Ù,É)‰½qšEšÖþàE‰™M;Ñ3¢/{Mï9.§¥vßêúlYnc¬°’ªßýv¥Sÿ°¸«h‘M,šïÛqí&ˆãµçåëÄß3 ŸË.¼àílˆÆss”N† œ$<]™PùkÒ7[+ÙÌü¿<Ìc¶8—» êVUü aäç w d¶‘f>×T‰Ÿzâ#ùÒ¹X’ZøeS™Ó*¦B›Ê©«Ë#©Å Œ¼i–Jæ¶ÖôÄr§Á8ó‰LþO5°æ{¯ -©¥)7žln\VÊœmeX±SÈÅrõF¾8BGõ3C3õ Åþ”pc.QýÛºÚÍŠÔœ,Úê…¥sE´Sh1âî²)×û ׋¸½–½¾ÌàL¬_j»¨-…åÇ9i>ykÙ±ÕtííU·+ešœ“Öç- ¥¥ ©‹ÅÅU5›Ï"uîEóJ\ï@ÛàùÀòÖ¤&FíÑ™¨á÷íDýØÝ:YZ±}x½'ž U§ŸhÈÌ 4¦Å{ZbVóœPü£Ó£Ï¢¼ì•/Ÿ8nàòž†p¦-i5MO7²|0s´÷Uß®wd©ìw¢€„¦ÏØ·'3?T)åV,;+å´:f@2jIÓØ)ÿÚí“øNü÷~µd4töŽ­æwžñ—UøgOŒ'v~ê%Ç™°¤±ÀTu Z>¤ŸÆÄetÿÄ ¼ J˜báN§©O̶ãNfDã„“dnX2Ȉ÷úÅé ¶ '†¤Áè0MHWµ‡3˜ZL¨ëÌûq^œ,»Ej•‡!õpœÒg§4åEN½SÞA‡~ì—ôŒ_ÿ4íÃÌ"—¬FŽ!î$Cp¹_ö‹lÝÓ>Ι¸õ·ÀÖ54«­¢Uø…ô'̯¿ŸáR:d¾#ÒmFæ¶K%ןìq×¢´~úLø»ÅZŠ¥;þ”†©sæÕú•‹v¤¥¬¯¶ùÝŒ>ßð|‹EÕFÓÐÒÍ%6*™ö%Aï}TI½›Ž2LŽ›À£²saÚŸ=ØþóYáe yá Zð£ÍÉGØÚ‹õ;¹êèæ~t_\]æ%ô}¯ß2(ºˆyVKL'ä ^ÉuÑ,,f¯*þ!&¡õapxôöòc}WãÃË ^êè)©§º¯’«ø€Õ›@öfKËo9ðó5æ'Þ™ò‹:‘ô,½æE×µø6mR·+&ã¶[C»òõüe¾Š'æ ϱnb\|¢Ñ‰9sRC_Øž´Y¯lè’)Fí%êsTš±S=œì§;‡}œI„qÔÖ Ù`ÎŒVÔw£ºYÊèòIªv0 ñvüŒ…º·$ÝTÎ4#ÉjN¥v5ï'š©û–¯8ûìÛ„äñ—÷—YÞs1k±Ý ê§J3ôÂdhŽóᤙq¨Dý­„æ³a_¤s‡wòU5â>Á‚57XÝH@.Zí6 ÃdÎÖÊ*KŸîüðÉ7d·b${¨Q!Iÿ9/&aók îÒYÆU&¡3O æ†Þá·kHÌ7ÞöY’²¶*wÞ¼¥a'ðl\£¾sát™W“'}ýÌmEÇ-ÊÆž§‘e’½žÐ8N]ì¹Òä…BŠ» …^É…«De‹ÉÖØŸ£ìÌ{õåéØÄD†<ü »hM®SÌ©TÊ«f?éÀ¸úÜ(ÎìÜØèâä’t=ðnðä;E7©Ë!™ç9KÐ}2WîÖÏíJ5Š›&÷;êÍ‹Q‡Ç¿‡n=:´\Bù]Í(íÎK…<â+/:Ô_Õ³œŠŽ¶z.»*Ù½,é×´BYKп.ÉtšL#Ù…(ÑÈŸèš·Nwjºiè„‚¢±|¦ä”eP÷»«K Ó¥/wN®ŽL;^34k0S§Öz[jz5Š ß5‰XäÍ—·ÃUºËf|Á{†oÁÙ¯èÉ +‹Ä€þkt å\‡°Ë²yÂo­é¶“Õ4”RÏskjÄ'wa~6tÕ$&–Q‰}܉¦í5)Gº@–ÑÿuÊm•ûÁ½¹­-‰26‚÷ë["½‘¤ýJ;ºzüïõJÖE^Y²ñž›+•6X[lêvûÝÖ Þ¼™âšøtlAü ÙËbm_œT­ˆX¦FñÎÁ “^ø‚æ9’ !ÍÏa1˜OyºŒ¥aÊ™òÝR¾´`æòÖ蛼…¿õˆ´*è.ÚÌA£Ž}°ìIÙØí^kdãú\Ïü•ü^‘§ì”ìÅÌãîlv2§,æKù4=¶PÈõK\7X18¤y8ª$/RÛŽ¯´¦KáÆC¤9@ô©;œ³æÞ­LyÊc4ôSö=÷ÎáÑk‘m`¢]϶¥ã~{eëSú^Z¢Ç<•ý…ðåÌã÷E0OžÇ3'ܰ RVJ­×³zwb)7´<ö  6è 9%ÅèÐåû6²ª.µ:P,º³ODS}åy¿ÅXNßx4b~Š÷9ÉNÂßãRߦoä¼! ¢¼>o nÈqÅ ¥ße7'oAPB«4úαæl˜E3OëÙ¾¦––2!§ÏÂ*·'ó9°T–Ö=ü`aÙοˆñ@Œý .®î¹ju}´ô×Ke›>&Vsõ»ó7}\Ð)”Ðo°T%9,ù§r+ÞbÒyÚƒfoh« s*Ûòi홚ç’\¿ŠžáÐAf,Ed£k3×t0~\§rTø†ˆ‹¸q•Š’PIŸG¨‘©ÁÑ—d¿H^¡l4ñسEýœÆ½²êÚœsšŠ¾úöL´òÅùï¶ñ7(O¿~"-£Uz¥gîÊ,W"¨,BI~ÓðCÇ»!ŒýB <¢'úó]El´wÒoF¬Mœ|ö- ÷f|Èýw ÊêâÝ,™—éÏå£5àW*Ì(½R{Fö„!2yVAÌ®—X“ˆþúçù¯b>DU„cãOv(^-Ö>•¶9“~âUH§ [~Qò׉›Ø,{ýXËh¼ñîW+™—΄ 2ÓTxõ4m;XÆY¨è¯]^q¿°v¶ãò5¶kzãoë5½…žJÕŸÓ¨Œ¬£…Þ¾ô…ÈY‹[ïÆü 1Î’WÎG‡>]މ™|%`š‹öF­ƒWcØùóÂæ÷9¬Ë°h¬ y)Íi¬e®·*¯™â0‚ v¾¥¤ÝM™6ß»9›§)e66Ãã^“vo“N5r*7ó4µ0qúó O .Oû6I`0zÌ ïÔÅacîX¾u¼a|²§Ø©aæ{õ.6–aÖöÔ²bˆ_¨1ÍQ$ܽWU|ÝÜzÏ£Q¡þÛ‡jÙâˆ!ÕÔ•¢'tÂÅ4Æ à*èÁßz-bµTGº$/%Œi’Ó?]1*Ñû¡¡¯yÒ‰úŒ'o[nLý²ÔŠ.<[«ænêKHBJµ¡_aѶûw¥7'Šë6¯Õ;ò%;(½ãÓÌ;wÉBNeñü×€çÝU 'ðòæOÐ],Ô3GÃCŸpOŠ^äDLýž7Ÿx:ñæ¯M+U®<ˆ|ÖK¿N9Þžpâ&Ĩ‰©\nÂSè¥gö ñ PôBÅ%ø © WѪ#ÑÏn/‹•ß›k]Ýì»0¿#ǽ0g]tû«¨Ú=Þv¿þ™UlqËîžµˆÐ Ï;—ï ¼«¼yΨöû£7»U†‹l™'©ŸÓÖÞ¦¨ea~ö ‹‘WÑ”þªÃ¦©U\&Q4_¨ûQVÑ'ìï³þÆþkåùY­YJ¯$Wßt™€Æ:”ãg¸{çnÔ lþ"n+ɶP·ç-/©yª<¢ÄȾ¿¤ü¬°“&4›nüœÇæñbî¥ÁÌàVÏ™þÂ>ÿA]ÜÆ²OR2æã5×p&ŠÏl8V?¶"p2#4ôTz(9"*©œtƒ’‚"eS',çóÖ–ïiÖNšø*¬·²š–8ÁèŸS{+i¢ÆAêøŸCT¹´ )v®>¨¸óðüm½~mÞ¤›C ÷Kxj·Ê£=ôõÀâìlú•‰Þñ{¤S£æ ³âοШý¥ô̾,š‹Ï?d«øI…ðÚ»geŽÏg¢Ú£}6µ8£l+%DÉhäîÝ¥z˜üL}§Jáþ‹xªÛvµ•—³Ê]Ã7{{ÔLž:ñ¨=z(à·ÍÚvrx ò)þË™Ñ-/É[OoÉŸ¨½Øè˜ÁP÷¢Û»˜Uïc¡ù¼—Ÿ]éNXŽÝ­Ù3öd**éìcÖ¿6­fgà@ÿ¼SŸâ)LX§ˆjæL®þÀ >ó½µ^frÆë xa2[~–ù]*µÏ›l²^ÖçV>Æ^k8ûé”å;®iêÐçÁ:íro¾”Ç®¨*g϶3*Ä߸;ï+®NôFÐi³êsBS¤8cãÚù[w ÅoãÑ–‰q]’íλ›mB*½wš&eMVqr³ß5½ðj3ÇUÏg‰¾ÎUYüx, mtæ¶v‘ûpyØ (ËsÍû¯Ï rÁtÝO®ZY7dºáÈ\wg>˜ú^è“èa4œ:­f(ãæ”ü^×b¬ÍÕ»¦9>þ„þÀùÍí¼bp1ûºP'æì &q:­år—éŽ;¥Ö×/ò t/W–Lè¹?þ²À¥§ J¼§ÊÕ”¥ìmMõîj5kkñmÏI&…&óf¶xï]<‰ëlY XX ‹å±~r:Áë®ùÈ HrråëŽ ûwh܈*ËšÚ—ߪ,Òµøt‰°päßùÖ33åñ9X±Ÿ¤ìdVz İ.¯À— ¯ƒ;²×®UOÊF×ò­¦LÆ·~>òI…|Á"¦!àE•2ËX¥Þ ƒA®‰z¸Ä’üçŒî–‹ïöpmg^7‰“OžàM¼8Y–ýîµjW†­f’fü C¨íJ®Õ_NbØE‘ òúZÙ·8ÕÏÊGæò?q¶À•Œ·îHuª„ [aÓP@©º×=ûv'>û]Wl,ɤðíºyVkΕ½âMú¤^Óó<Ø’1¯\4!g“Fv7GʇT9eG®‹æ“¬ç×lB2y60̈B^úx²z—píׯº’ööùy¯p,{GÍNÒ@N?ˆÁ‡ ËZ!Æ¥¢²Õ") 3Ai«[Ìák sÉ7ˆÈ‹‡C¿‰àý¸/îûLþ&“Ìw=hßó&å^÷‚´öÂF5ON­ÞHb»kíÜ^:Yi+’bz¸éÙýºÔŠpŸæKž;îf´x'ckÔ4]+MµÚ{./¦æ»I4¦¢ØÍ`/u:œ!îŒÃ;×4ÛÇ{U ±wc/?À¤¸u½ëVÉôCc¹-#•¡=2Ý"éð ŽS\0ˆ×hÄ @fèÅK ´'¹Ÿó7¥ÈÕ‹âÙ)TS7´cŒ™L©2À•—tˆÎΦ˜ˆžYÓ• ¼–!LnéG€nßS9¢»>§ÚÛ¨L‡~î>Ø»q£X3 (L/H½sZ¨à»Ká3™­[Yke›D†°M9œ7Ùе’ØòÒ߉ØvP½ÿöQãúídËÜ*tü¢RkïF´ŠõÆëâ Ð9˜ßÆó«Óyw9žÂÙ¦S oPƒÅ¤ZnéZè™VNÞì°›ãqåÒ‘¼zÝsy[Å‘ë;7ÿ¸"]9¡™Ö™túœ^™3cò–@º§ ų«ºê1ÚEê0§’חç7Îds.·ÏäàX¾c+È‚¿Úú>m26DaÁVòÁR¾[  Ÿúl˹³¬rÇØ¼Õ'vxÁ%Ü× .À&Âÿæp~NÿŒÆÕuÜÁ]åÎé«úúÝçÚާqg~V“¯"š‘ÁRïóÞ?2^­vÅŽmËHÚTN–zÃäG²iö¦¦5§K¶%JµÅADúþ[ó·D¹›ä8ó‰uLiÎ}17|¯\ö›•ÊÓµ£ obNÚÛ“&KÉ*šÎ͵ì_ÚV{Ùz½K À•åëÓürô‡«î×BÎzY6à]ðÇkÇ~O?ÛÐn$ô‘QöÂã¶ üzÔ^°¡£ž¡3-aòGëòèoÖ/` œB¶ç|’¹é è¢t.é­µËE—Òe8’ˆ¥.D͉~øæûW3m†üöì©ë ›Ç¢˜áÊðùV¤âU~©‚}²cÎwp(XÏqÇûÆ8‡û÷vr) +©ïÈæ/VÚ–ÐL:sÁð®Xéë::÷K’-{¹ëèþÏv`‘ÓÍïØÎÖV åoëÇ£høý ïúÎ(tÀ'Cç¾Å£¨hß;wúõKÏ2M²J·¼Ç“ ¥»mÌTK'µD7z_òñ4ŒÞÊFt'|<Ü-&½ëýIÞå´ëZd1‚y#²þ/CnˆZ ¸_’‡„Ú¨°´°wªÜy~k+Þ²Q[Õ.{þÔéžëº¤,Žt5‹V²`ÍèOtwˆ”®æé'¬­ÅäI“­ûH o¤¡¿Ôªÿz {ï“@Îø{|Éf¨ãiåô‰§Þ­ò¯ÅlAu*„Br}çhŸGöeá©S‘’DD·’zM¼~!ÙõÔßÝÕ§žƒ0!Ʀáú>¢Ðï=¯Ål–¸?C˜ä·ïaëm!·œ4°§ú»7íx7KožùX‚Lvý"_÷2ãÇ‚“cºgª·ÂÌçG²L(ÏvE5ÝÛzIzѺÇg—’Ì‘ùãíÝ­;M§¢G.~å_fô'—³ Òqhz\ÿÁœ·ñÉž¼üî£mBÙÝü¼Ý§¦+uÑ÷…;÷făïîv=˜žŠNêØÂ’üHœòE_góZ×jºÉ°é`ñvÒòXÝ ƒE„ Z¦ªÂ#O[×ï–š^[d¼)yä[\Xµ{ÖÚ,: °¡‡¹£ûmOE¨L-Ð j¨chèb'nÏ&+ƒ(A4 åñ‡xò8 à (ÜNšIQ_K… Èà/áïæé†äïæê—ð—fC‘@<¯Ál doi¶óÚz oW˜7H€Wœ—Ÿ‡_ qƒúyx¹€øyEØUzÙ;Hè+©ìWˆø&Ͷ­ÀÏÏ×O×ÃËÌ/..æ ð rðÀܽ!þ<îð³lûå`狹Ãy‘0!CÀ΃ùyùÀ ¬;×cß!¶>ÞÒl>>0{ qˆƒ (Ÿ0-TX„‡ŸßŸ¸nG\Ð^Ü"Ê'$&*zМç0µ‡H@4(ˆÀâIBÏËÃÞÇê%ͦª§Rî>DµB Cœ ü? ñ† 1 ûhBä‘Ðö°‡9(A¼¡2|ü"<|â<â†ü‚BÂ"\|||Rà_râ!‹*"·­ÿ;EäþßÛáø fÑ?ôM„ÿ·¾‰‹ŠŠþ|‡ TõB^«dàõ=<¼AÈ m@`uwê†$u%¹”°¢ˆ¸ ¼?Ÿ²¨ˆ¸¢0?¿¿˜0¿˜¼€¸’¢¼Ì¿Îa‰‡¼Tâå$~Aa!<e]¼ÿk÷ÿÚýÏ\û÷ûEEDÑøD„…øù„E…ùc&$ü¿÷ÿþŸøÁCFK÷ @î`!481n‚Ïñ#ÿ ‚lQÁ½µ!p8ÄÎÉõö†ƒÔÝáqâã B»BíœÜ=\=xñ@œˆÿ = fɽ=€°¨ÜÈtÜ 7¤žÂ êgCðm˜-P‰· ”ƒ{8xûA¼PQaˆvì÷e9ê¢tàîwˆ{!P==à¨\@$F„„J;@‘A ^PÐŽ^wo¨=7ÈÓËÃf¢BPá2ÝŠ„È m«è ³C¤xzB‘‚@WW ÕQÖÖ¡¿#ŸþX™ €çÏÞÿV-ÜLj¬swJë÷φ ‘±@ØÕæUç5äEFž´…¢ḆÂ8A{„œñ†!ƒs!ãéc‹Ð`Þ@ûÞ˜;ðýC4ð êCÔ} Õû<ˆ)kÇ òó‚y{CÝ0¶@½‡½F÷7ˆ 3î /¨'‚côBêKÈ ¢¢Á\<€²Hì6üËh!½ñ;/&@ (y$Ôh ôæ†Ð—€€¸/`¤‘´Â»Û¹úØC¥÷Føxò:1áäR“7VÂì©#~­Õu¬ÕðÎáPe¤Ü¡Þ@,H0Ì×Iæ0bÖñ’J ¿²·ýK~y}=ykd[ÇË@¼NÈœÀ¯§7‚ÐŽ¥Û¼X·(tÁîIî@¨<÷?•ñ‚ù"t¹£$ŠqŠwØ‘wpîðý¸€4´ ƒJ 8¦¼—#rê"èÁîâú]v²sìÇÎüCà‹Ÿa«œ’¹MýŒ¾²ÿ$£¢«@¼“ Ú·v€¸Á\$‘ñ•ù…úL$?€•ø!'‚uìÉ=P4ݤ]n wA”fë~øNy=uT%GC­xAÝP<ÇÚÕÃÃÅÇ~ä~ z <ˆä/ÑN¡þÞû¹ÙÇ3§ò“ûHk`¯#‡ä±JŽ¡‹ýEG‹qƒãŸ¢Ùüæ ‚ŒëŠ >ƒ —u´aX£@ü÷€ÿk»GJ#£v?Û*p@0[ëýôc‘uQ±˜PY€aû{ßþ´¸Ö/Í"Ô߃ñùÇVëÂ/}@ÖÄA†=Eðo(œýO½þÇ@C(þ³‡ûg|Ÿ?4,òßiù?jxå=ì±52 û±šŽ?þA–þ ˆü ûÌWä߇ä¿Ê‘€@Çã¿Þô?NÜG ý>Wâë#Õ`„üù!ô/w/t¾8!~,˜ O„ ôê :¤+RC°„"…Õ AhDÞˆ6š£-Ž -»¤ŽÐjìœ@ì¨î¡B:ÙAz­¼ Reøå»ÈÑF:zÊŠȆl½ ¤„Ø÷¡Þ‰ †`‡ª ÕµõÑ#À<ûvPaœPAöCPc9¨‘8˜ì?Q •ãX û²z \e Äâ¼/9€ A(¬£ÆÁÇ º Ô ü7óxáŸcv$ˆ0ªÜñxOî¹¶²ö¯?ÚuTD+Tu 5tˆTÍ÷!EÀfàÈøtGó®@¸W””=’~Dv#Òyø%QÁÝ2!§5àM; xÍx´ùƒ`?c|í#Bï¿„£C¤÷ÓHú˜rŒ¨Ù}Ç£/S~âäw¨ä?LJñS‘ÑË!^Þ€Åhu"ª‚ØÙyxÙï[4¿ÖºOAGÕ‰ñ‹ê¹¢®ŽŽ¾²Š‘²èggáôü¹8èð ÉBØlÙ$Ž0TZ”t öñ}ÇõóOì Ä•<’ Tö?ÎéC6Æ þ…—ÿC£ãà8Ò}€mfƒ` ¢Ø. ‰˜Š€É’GüïÍßfàp’x¿‡E„·Ùa ÜÇØ7HQždh 4ùwQuLJTÁq´Ñ#ÏȰÒAÿ>ôÿ}àÿ§ ?"ŽïD§H@Ñü#éÎŒ£ªèqÈÿ@8Ü Ö}ýóx[(÷ªJ;'(‚½ÙB]bÝÓ ê óð#0‰|½oí0ŠL]#¥_0„Cö; Ö xgf Â"^Á G½‚!£Û:@ì…!wG¨*¤;€Íc¨ú{ÜHŽcmý2ÀG̘Žv`5í#ñxþ£óOÿGf†Â¿f/˜#ÌÁ|ÆÅ}Tp¨Ì­øûî ´_øÿAÓðŸUK ,ó9DèŸtá#\ÿˆò'1rdñO•Kúˆþ¯©$èHÜû?ršCVó'ÁrdôQ¾ˆj ±ö‚zº°£PAƨGNPÔ¸ý¢¶ôŒ•õ—¤Çiù“Uço1M¹­ãWâÚç³ÿºÏ"ÿ…N#~þ£~ÿ:<û1e"ôkŠ‚¼âSïwiúOdð |òÈ8!чŒÆiÎg äGÅÈñÛ\ø—"úw mˆ`U(bG± ¨=2r‘ÿ™Ù÷o‰ ¤8˜§ÿýYòk6„]¬¬kdPþ¿d¿ÎŽ­¼c®û©›¢fG ê ¬x¸#Ë|\rFòòÕA((N„‚ð'zý·ˆí?"³_ÈéTwŒÀŽ Ñ¯VR60Ô7R4T×ÕA¡ã_ËsTmÈÌ2îP¹—ûÿßzf‘¢þWC™ýˆi|„z‘ÆGèù8wùžò«¿oþÿ) … u©;ü\Ap¹Â\o H]ïÀaÅô*#© %­h"× ‘K„(„ÁÜÜ€PWÞP×ýuÛý ßÜkvºïöƒÁ¡ï ˆ1C-Æý_qaÿªŠ#·ÿùsÅâ ChÐps~„Ì!é r$#¸¹€å…Žš¿Ä?pßÂÜ“?æOEÀ6¢ÿ‚À`3"»üuÇ©ê@ý=™æÎ G5-ý ”Ï‘@‰ºŽ¼’’¾µŽ®Ž2HÄ’ñÿ´~PPuýlúÏR"äo¤*ràå=€èçš-°^Ë~„šÎ¬ÂçIøCƒ¤£ ì³ ¾¿O’ãÓaó:ý JÀ7Çq?ñþÄ<Ô4P³PoAì(êæ`…¹ÿAdý«Ùøï5Œü D~Bxà|P[@¡‡ì›¹¬ŒZCAÍOw`ÊûÂ<\‘û-œç‡€ý“kåD>–õ¿é7?à!ûþ[•#¾~ÞûûMPæÐãÚçl+q?è+RÔìw…)$gFÙµGû·Ï¸.¢ž~IF”6Üï£Àßóö€Ã–X~ÏŒ4}€Ü@£Hð;ö­'$X÷‹£ú§>Sö_ð‹lò'²PòÙð+ëîȵtÀ ò@®Ë#ý ¿­•YÞ¯wÁìïþõš-RzþyŽy“ý¥0o@g@: öA'Ô *ÒaµOû0ov-êŽD'ô@Y…9°z7ö-Í_¥¼{Ê:ôHÉÞƒjÉ …58ê9 XJÁ‘(€¡:ø|"Ài[î»ßZ9" {NŽÑôq·ßq×ðAa†ÜØ †\„¸"÷#AîUóCîÕBnF“DÉg¨?ÄÎÛiŒrîïÍ€"÷` ¥²C{Ôßy|õ툹ÏÕùòwOjð} Èípˆ¹‡Rv†ØU¹þ\‡û3rB~RñaüTºÿ'ö éNE]KÄéàùSC)jÇJ¾!Vòç.ä¾ý‚zò†jÖjº†æÚòç­¯HeÎ!v D~¤’I³Yð±!³ïsU`n¼cÿ)×~f“@±Ö1.n»–ž‚©¡2 cP¬mŠeOÄ Wv÷…yy¸˵¯Œ¨åÈxqÂÈqHEW8Ÿ1RIý_GNü< %ªPo˜»½‡\ æµóö@Ø“mõPsû AYÙ~¬  ¹Ÿßb: uEÀ„ g‡³gGíLÀA˜¿À.‹£SËÚOPÀ$²sÀ­q ¤ ÎÑ|?@ ço…Ž0ãPþ©/{ãj$`8x ˆõX·˜¼˜~*žÇ) Å‘D¨£+ylÁ’™ö×%KÊ:†¿¼4ÐWT“ømåé\ø9¶EbŸæ•ŒTUØ<äå ¨qö8½@uŒÉ ¡¨Æ(è%@,ö ¸…;Ó?ˆ[dN$»C>í÷ã˜/îo-+#q4ˆB€·JüËöŽ Þ±6þ$é~ÃÀyÿ´æâ焤+öã.n€óž¿'޽´€œ p¨›';;Šÿ®h”¬@ín@TÁ÷“Ž…H‹)]úgñ…pߺ—Diˆÿd«UæÏ­ÿuU U ªè_€ýݳÃù‹OÓÁàT4rüeFYWUùá üNÛGŠýQø•öÿ@ þâ@û?¸U嘆æÀ¡áGèvb†øÊØó#ÿ (¥‡j4ŽT¾×(°#¡Óus#We=<½anû a@ku®EÆP»\]à(MÌÛÉ iÞ#ì»TPP"'<ð¡×x"*÷…xÁ Àr! »A}B©ªîWƒR A«Ñr¯»—7rBÝýgE¶öˆ©|õd(*·›‡/ÔUÒ»u2¤™Âî ƒ pÁòq÷†¹x,Ü÷›yx!ØÇOe9O5þ…?,÷Àø-Š)ÿ¯[GÜ nvžì¬À ü±‚¥ýÑÚ>d:À@!ý}ó#²ÎŸDp|9­àààñ l%DGA2HØa<<žÄ‡À üX ì>ÀXàïLdi)id·9þÙ•µîŸ öÑ  Eµø¯@Áû÷ëãÿõ…ìÛ¤*0”ã!m¼¼Á´…$>„(°s¹Ar8ƒ¨‚P´|‰ÀeŒ@ˆ»‡;tßîwCeÿÍüp_ì?—þ…!ÙÍÏW0ÔÔ¤P™¿Î$ßÝoËfÉ»ïAbüÃ29Ro˜»Tò/EQn i@Ž*ëë ´}Í¿‹.v7<2û^AVÐÑšÜ p^à½Ð¾×ð×%LD+GóYŒÿœ÷/bò70JGØ?¶˜DG EPä_[þcõ[ À9þ pØ®°?Šºÿc›Ã »ã ÿ+òþÿIä÷ðþAð‰ü¿'ùþóqù'òÿ¢ü+äÿ-1øÇZÿ/ ÃÿÓ'4þEñÿ異È?‹Å_$È߇÷¿ G(ðW1€ö¿?ÿæùÁÿ¯Ïÿó‰ð‹#Ïÿó_Dóÿ@öÿ=ÿÿà‡×‚ ñûËÿÅsÿ•üG'ÿ‚ÿ£ÿ@ñÿøì?Pø?>ü´ðñô?Pô??þ”þoœÿ?†ðÿÊ@Áÿø ðxPôߺI‡†j(˜ª²!àU0vŠ‚AL „$‘Ï@ ¤àýÎó@<ZŽ §ØŽž[CPYØÀTGWÏ@Ý×Ñ;ÐÙ#'è¡Èóï¼zz@`ÛkTH“ƒó÷LûÛÓ-Ô!^Žz(³ñå¢Þ *ÂÝy°¡ ™ñW“‘¾ÿŒHæ8áß:‡‰(ºÿˆ¬ùè*" È¿è”hGæþÃþ, ¾ýgd–_:‰Î†Ä¤’²¢¾º°9Ï P…?ÀŠçàãn‡$cØþÐÀÿ86À¢æáB˜G¾À$Ü ‡@5¶x¼êú‡KÙ¼@Ë OpñBaB¤¡FÚæ …nc@V £ÖQyw1؃A¨{ó(ŒBÍ‘âöP8Ì àE€¥˜‰¦—ÃÏ-Ì>®s8²!1%Lœ ÈþàíïÇV¼Û`Â^ '|e`hC˜N¶^D^?Ô~ _è/cÁ‹§ˆªÉ¼6l šrƒ êGp/÷ã»ù&áÙûÝF ˆGä…\ñør”‘.xØ!zÉ.È$ƒ×dx{y ^#jÄ;H°ƒ¸ÛA]Qïy‘Ôkˆ<ð²ORý{ #žñèð†ÓÁËà ÅÝþHj;/JQVÉkè"ße¾ ;åþùö1"] ˆ4diy#„¶¤§êu©ùØÃ•T[Ý\s\Q ¥A7Ĥ²õÂûoÙ ÿkvÿ¿lÿ£ncòöðüŸ°ýÿ û_PDPèû_@T”ïíÿÿ;ö?»"ÇáÝJwB96@ð„èvü_Cÿ ýÿ÷ }ä{:†ºz€‘Ï/ RÚ" øWÿ¯ö=B“ðŠP|o‘7£äÜ¡]†Àé15•ü_³üšÐ‡†É!ìÈ ß–6Ê<†{Ùqï—°V]P{ù=ì\\¡îÖÞÈe É¿XΫƒñAl]¡‡W.ì¡ì_„*:°¦!ûÆÒQ<ÜÜ€Þx_„ ƒ¬a˜Œ´É­Š#á8¬î¯}¡åÛý<ªähu o¨¿÷¾µŒ‡"W‰E7/Re³pP€8⦈P×€I‹¢a”ʱo£ ïÈ‚&/j­¸TÁöð%€”– öuBD„k¥€â!Aµõqp@Ø}N®ÈÛg'¯|…Žž½B¶éð³4¢Ñý&†2ª„Þ¿UBDòØš¬°ÛÜXä=$QÛo(jÕó|‘ü|ÐQðýç«‘¸:%¸·‡Ê/÷Óïpd`€Mëû¸ÞgI€¢yØ(@…LJÅT pä É(’ $Üû‹f¨:õ¹"Ê", wÔ‚¯ÇH’;rj§›ö“–²ˆ_„9; vȸÙC B"ðXV¡cYñö³ŠpüM[F\8¦)ÿ<ât $Ë«kÉ+¨k©š",{ÄŒG°0ãt Øçˈ‡ŸS1p(í &p’xõózp~>^¾£º÷¯Âïÿ’þ÷ûñ^O{‡ÿÏô?a>Q„Ψ|‚ü¢¢ü€ Å/,€xõ¿úßÿ=%Äè á±tŒÏÃþy}þþ!àŠóý¨ã £aÇ‘W•ïÇÏ:ÿÒ}î Iȸ‰PBt.Ž1¸!cü1SX÷½gˆy [k+Á-WS-výŽØê¯Ñ;©ßìJê3¨†¶>²~Šp«0‡ë­sUpœùž6Ósq«ƒ-[jT0Cª¯¹?-PíY™½®Œ’'¨•8oY+4š$›L–\è¤zU¶éÍìÑ-:ǰuçí¤¥fŒk'VÌv2ù™‹ôæÒ¯O„ RÞï}¼¨° Ï°±±ÃºNnl;qŽ$sMe›/²- ™ÂtݦYV+¿Í¶¬…£¨Wø!štg6«â“Þîæ&žˆ×Ä?FÞ¸®Çµ¤;ACbß4¾jÚ0Z¡…~^tîMå ‘F4ÑÔrÏ©³²Ö`ÐlHÍ s•"(÷m}΢$Ö+4ŒRµ)CÓ5où7LYÌÔ `ëÄÑsWsð:bdóÎÍ‹’¤&|yv©Sßôl–\BMß]=ó.ß¶ FŽQyTèdc8AU{¸T«ÊzÆxEÑ"%Ù`ÉP>ŽðOj¢ÀP•‘üí%ºQ¾“÷Å<.\P«Är6Lž#²?ïì÷ä%YñKæDÈòg*æ—-øWävÈRî€Î¡‘ŽÍöK8ÀÛ±2ÌûŒ³ Å;ô|èã}üç%„ôæ-­(NTÐ×6 g|zÌÔ°}ÿ½TþÅx˰+â;OôÞ¼…\í0°¶{­¤q]..›¹èz9©¯¿¤{§¦òŒ< z­6;ÇíK†‹â'([I>2±WÜ+1ÿáD=1 ßdè.cmÉ#š±Ó@òDÂ#LÅ:ú4M«ŸþÍ”]E^’þ~Ÿ&·õoxy£ó¾°Ü¸Tå©+«~×x mC¬Wü`gˆ1ÏÒS·Zu‡‘ú&Óùȱ:í”ßz°U=«wª¿ Î+£ñðšÞ|špƒú3ÞÌ3„ðÜ—í¡/Îõópœy6ö¹äÍZ¢…™ƒ~ÜÓ–ÙK6ö‰’S Ë+/ê#‡º7—^f³E]H–K_.øH×9zû¼ÑS÷ÊìN­yXù¢moŽEï'7â~…©3W«ð”u‘YVC‹å ·Çôçг_XŠú.0äeâRa&À£ñXŸoYµE£pºLYWqá|©‚.£‹å5±!lÅ„a«ïÔoxÓmrØ’DÏ¢]¢Vù[eÄA“ò”›ÕZR·YCˆOM7‹‚qOœ&ýP= ±ñ-†m r'–`œÍm~:æøòkŒØôÎf)7í‹ ¹Š<Ø_\p9cï)ã» _§6`* T‘»Q.o~ÍÏö=çÛ#ŽÛ\¼÷ ‚¦Z×ñh ½YH›¥×¤Õßè´\icç|ò¨ýšOã÷]駦-RYîù©hªÙt–ó.±nVÐbœÅX Å- añà$°|ç3<ÖMmy¥òæ:–(-õÌ’kù…¦W«on BÇ#ž­FŒé\ó:©>3}™^Cei#mA< sº—2®oÍaøÞé†ãàš3¡)ïq…OZ¼{RSÈžYµ¹å»C,ÐˆŽ®àïyFPÄdüæãñ{o{±ÈÊM%ä=ey ^©>¼ÄŒ,¬"}ßèåA1'ùÁ¡ŽùæxƦŸ•ið’ŠD?ÚþgÔX½;ùĶú£ÓòÐEˆ§CvÛNÂÉÎ4K6¿ÿ±*Ó%Q C¿»‹~§¢4:åCã˜>óBDE^(CË“7·ßv |…\Ùiÿ êõA‘¢Ðž œWF³]q‘ÐÛˆáù7ùDzF#¥Œ¢bwE/Xv÷U¢/tž¶«º>™r§ÎÃÜs†ëicð­•ÎòWò59ôtîNqWÑWæZjÊEr„IlNaå½  ¾XuÍ!4:û†u¦þ£ßýˆìk*üBbï„~ Ŧqâ±Ùà þ s R›°¸0HLHÀ¬ïá ¬ïó!ry6Œ *–‹>îáãe…£"Ù@½ÍÁ% 6DX&ˆrÊþުȢüB¨"*ˆâ@ Ä„VVD|G^øj>ÁCø@HAHá °&Ì2ÇCÕg BÔàTy¤(ÿñ®!²@¼!®ŽUìC|Ws¼mÑ_psØ <°®ž6ˆÿ0Nÿ,ê‹"Ëé㈆¨Ï/€Ç ƒxäÃBêbxb¿”9”I‡ø©êkªç2–ŸxÔ}Ù!yœ a2ñ#;…HB`Ø‘©xG„øÀZýg~~° ÌÞÛ nDþòýü‡‡úæãýåÞ_Sþ­tDÍxõ íÿÛoõtðNT@ù(…*#(&ŽüRB‰ÈP›;B×FØÂˆºË»Ãa‡ß‚ Øá?‚k¾?àÚ@E]ÉôÜ>®–öo˜æÿ;¦Ž`ö}Lã ÿŽ×ì£Þ¡r ÿþƒÂ¢‡y܈ˆˆ"?žEÀ‰"pàÈ ¼G`™KT o?€Wa‘cåùößÿi¬€¼À˜|À |GjäÄ€÷ˆwÈñBX¡rc¶ŸòGúú{…EŽŒ+ˆ_‰ú¿ §ø¯Óö`üÁý+q(Á§ ÔÁÆÌñ€As€Yþ¬Tì$¢¥c j¨¶O"ún÷_iDüß$QÁßHäWò8˜ @:ð |"P}00¿ü ÷çTú‰âC"ø@À€ ?²-$Ñ)bˆ§ý¼2B "í'‘ü‰\dÂwüó\¡:xÝŸÆø=€DàgÚQFðïΛ] ‹e* ¾"¾ßB›þÄ'(¾àãá E­¤ H 7˜»üQò þÒØqòC~Õ¸Aÿ*82Þœ‡_PÄ#À¿Oâ‚–€ËÂ!ðÀòp;@Ð#Þ"d4ÄS Š\ïB~Ò€¢x`T­òÈ |_ ¼¡nÆ ~>1„|–HÜ‘-øü~5B5 Ì„ÂÀ†€íÀP°Ø »€]Án`w°Øì èÀ™Ô+`/0ì övò‚BÁ>` ÜÎà à@ö 8©/âùEªŠüDÊ=sÔ;ƒw|PÜ9"‚b‡hý3¡Æ¸ždª”ôŒÌĪ/_½„¥dÂ}]v7‡ÔÝãaÛb¹x°º€JX½fa(DóAG’ëœyÒêK¬`›ˆ65îåÓ§“ÞL¦Ù'?°Ož\Î*ùxÅÐù‘³ËÝ»õß½|ÿÑòÅZ”0];wÈ©ŒªùâÂgou_‡åiiªgu­ “×Õ‡àCëb8iê' Eú²¿‡0oôE™††ã†*¿šŒ"عûJ *ï;FðüeïªùC׉Ï?ÌòLJ¯Æ<Õû¾Ãæ\©w#+•l“R˜\Ãk=¿N\ÖüVn‚òrêÝ%¥5¸ìµI’jó´‚„|*¥=’áºr§.g%g˜€’¹†SÓ†]+”¾n%==IÏ jHPbƈø¨,ÂÄñÄÁžë!aŒbÍYÉ„¬“gÒ£´TÇΖ1•ë9k@"û¿O#H„Åï©[ý•ï»ÏKŠ[ø·øSŸe3‘“Xçj¿M†áßUÖ=µbz¹ÏÓìÈ!3ö²Ý‹™~H“½'Žä…{:&z=&‹˜9»xMŒº' áAë·°^>ZïùBù¹´#8Ã%¾tö:|íJå–† ;†ŠMeÆ9ã5[RþÖ´‡ƒƒ›½²™§wÈsF¡cÜ"t‰?ÆøbÂMS/q6º‰oïi3PÄñªubÁúâm–ÎJ«1?4—»ÉkPž‰“78j”m¹[²7¼Ôèb²›ô¶Ã’jf†?ùÀ´Aľ%€’l™„<c#¡öË·©¸žDó=š˜Ëh„’elåò´k_™÷8+.MÍÚצo–†áÍʱ1QŨéÈ{¿Vål^ÉQ¹é¬z½(Nl–{ “sõý½ëº·„«ÇTÂÚYøh/Ìd¨ÑO“ûÉ}“—û®[Øý‡—×sâ•ȉ:ý¶ptì V«lbÒ6cس׺Ão ˜ƒÐo™Ò¿—!§ÿR>v:;KÜåNû›KhÜr¯Æy[µ«C礩Ì%ÉSÌ47¿“¶°  nMÖ÷÷¿‘+•2I͈/(,\¿®ÑI 2®r½¿ù\/OÌÉ)Y9ÅÔÀ‚®4HŠíj¢#uJ¨¶ sÞ高‰-ÓâÂ2Ñ ®‘•ó ×hï¶t™›Å…K¸´^zÈ|·ËÙ|¹±ûfw—.9CãeÜè5¢Á«¾Ñ—¤—^F~xê/¬5öí”E«ÿuçd#åÜ~šÅ©ßƒ«ïùOw¥tT¨FÀöÔ_ÄÌOr'D0¤\!fÓøj¸æÐF4uò[S2N sÍÃq¾—ñMÄꬺŸV ºiq•Op;´}§ß}x'™æ­ÞúÔ•M{6rL.’Nó¨óßYtç4'r¹ÛÐÇm¶èá賟m’=“ÖÒhº¶¿5`± pÀ(m‘®Î~’»ÝÈfü wÛõa`oÖªÍL;W FÝÓËg^„=ÔáY`[••ÐÅ$ èçt¤YRµ-éK-"I£mᣔæ¥Yüà9šV«Çà’$Ï«"iq,œ%[Ó´Mh_Úh¤Æ.ò«wÛQÀY|Xè;7eÈ¿KLA« ŸØ8y÷®ßyô̧ƯY+{˜S6Ãhû¬¬mNvÝŽúÀçW7²À)X'.©-’±¶æ¯ÃGáÙ`/D£Ûåº#4×kŽ9å¹ÅÌú£Õkǰpn¤fKxLöôR¢Ë¬XÃK†¤ð³³{Mó\æ2wõ{¹žðö¤³éW]ÏÚÞ|nr~¦àuéw¾UR5H˜?I‰ÇÆÐ阂fLѿʇ¨ïÝ®vTc|‚V«^ÀIZHAùÖ;ÒëÁ9Âg­ÇvŒº½ ÌžjjÌïÈCwž„÷ÎBž´º·N¸=j£©º“£ÎÔaäõªŒØÙS"½H>ÊÆ ®œZg©¨Yó²‹!Zµ=Ñér´;ŠöÃæá]wFŸÙ$õÀÞ–ëu“hÛ•äg4¸1h9±÷ˆá‹LÆøØô…‡+Ìr§ï]£íp²c½>…µQtßlê9)AÁ™•×É\O”çI½6?¯«ÏÄ[¿¥ny†ÄÀTKX•¬›û•6ëJ˜÷V—?¿NÏc÷s«‘´&îbš`1  ßöÜ-èë™·ýléE_gÛ·Ó¹ûˆõksó³³ë6B K AdŽè´÷õ{â)c;õµÒX¸MÈqÜJέU‘½a¤ÿá´†’â+ݼôXUÀëéP¾Pë(mÈ‚{a¯åÕ€`âOyŒÐy§À7 _æ u¦¿Ñt^iÇÅÉlÊ"HêrægsC¯zêÁ?Io˜aCy'‚ót*˜Áùäóè¸X³dŠÊR0‡×Œ=¤ÞØë¡Õ{¯0W÷d«¥aÆ»ú/÷(ª­ŸÇÙÒËb­„;lØ[Å‚Ü èêü9ˆUH{(Wy«[GÔ8‚*+ÛL 19yõ æÐ}ïMÞϹ¢ÊëN,ka:1åÝh»”.–jµ1ÓôMTˆ“˜`Æ1K1J·Ž}t{¸P@šÉz‘p°ôÕEL¥‰ ‡d«2Ã’ œªk2¡‘…“æñuî-½?¦—^XĦz¹Ü½~u¡ñNû{vŒÀ{OõS´ÜçØw8Ø”…•—;²kdë;;bø}u-¸‹Á®.nN®°›¢KȬêf"7}Ej»”Ká„!yN‘æ§ä}ŸÆyf ¼%ï(†!Ú¤xU‰¸sXÊ»É7=ôßšUõ³ ˆSz\2;u«Q$ïôsê,ßÝÁ<ïóÜÙ]¤{Brsñ0diÞÞ×qYǯåžêß’ƒ¼l”|%õO‹Ø2LDD>šH,£i/¤I]¯é±ù;?“c×vï”,I<)Öß_7Á×þvó¥ó½WA›ùÓ` 7‰,ÊçÜ.,9é¾”-]s¦jê üêÄÜ–vF*§õbóM I_žœ~ûçr¸ÙÝs.íî -#s%˜2îò½Cy d¼s,šÃɢɋ1·bAa[OOWú¹_e¡/YF©ºò6× >4ÖN½Èα¨ßЭTV3KOÒsW dn7Rò%÷õ}“ì·ôMÛÛŸ3„%¨•È6’ë¼Aê¬! Ñÿ1âžÂG½›Ór\O Ìb-]8º¶óÍn:´4ªÝû´øzDúÑÀZ£L÷öö–¶Ä+UwþÅ+ì4±J ^ÚËõ UÄ–M¹Å‹ ð'4»v#TO|ß¿i ,¯ñ²œ»[RE»¶v¾äE<„µ:xaz+&²»&⚸àM‹ ’²Tºk/Íbà³tbë«¿‡ [oÓ½BŸqbµ4ŠY¢ózôSdx¦´~èÄY°kIJ›÷¥0ÌÄOÑùºKå¥Xo(¾xûÙ åP*ÇÀ"U‡óÏê”8³¬tŠÛå´ÝW5oÖóf)MÇxMUH `17“L¹Ž™™°$˜\¢®¶^îEamÈšÔ@vËæí3ÅO¢ž&È|Tõ^ø„¬ÐmîkßP™âÓ¹èœFbë«64ëT4þ#CœLþ;¦ZŸªÀïÁ¸ùùÿMþÏ ¤FχÐÉù@∺DÄDÔy‘ŸÚ¼˜È1maFÑæùþ¦Í‹ˆü£6/"xD›—+€ÁJ`e° X ¬ÖkƒuÀº`=0Âv‚ÀÆ`S„ΰ†Ül‹PÿÍ4°=Ò p€ÁŽ@˜p„–Ø®`W(Ž4 ö·ÅÃÿÁB@m—G pOˆa.üƒ¡ð«ËNô?1„DD… >çq ÆëeøàzJ,Òƒ¬2ÑD:£“fÑ5ý$Ð Aèíä 9RfF9꤬p…,R9  ö<Ÿ"1ÝQ¢-ã¦/›ÎÙšš=šŠnpi imö› üð ¹: Þ/³ûm÷GËên =Ñk‘ÈYO±‘-Mý·Ќ‚žŠï2žÑ úá­ãPå\ å¥~ù‘Hª®uäÇŠ‹dãë9S=~L÷ uOñLíè¤Gj#)4IÛ—Ÿxœ9IàØ“Tð¾ÐDÁ5“MõàÛ^ãÛtfŸéŒmÕ1Ó[7˜túRò•{±5 òô—°5ÆûñÓ™Óqõhì´ˆž¼t¾ŽÃ§RÈUsrÌ&û©À^¥¯’ò v;ßnœ«_:±³ain-Ë&ó-ÜѾèXy÷ùIþI[™ŠèórX$®DvZÙ’¬±VÄûǾХM3‘ÆÆôuRÚÒ\¸òBƒ›­†d•4›”ëÊr§F{ö ùûL¾¤«dgNÝ‹™êŒV­á02K])îbŠLÓy!¥k¿îïñ´ÓDj-6Â÷®ÑŸ’]T·ôÊ¡Z»7RÄ?ïöFšÉ$Iãéu¼<)™¢íîçô/ ›D–áÄRZ_2W2¿S•íY™••9’÷;e^ðeõ[,5õ製Ù¸^·zmI¬mew¡G4ËA¦æB—Ì…A¦œ ºË‚zœÎ.䦬‘]X],Ž#ß~: 9Q7ži„i&g ½çVÛÜ}âîZ½Èó®n •šF¬üm«‚;öŸÄK£Tß-•ϲή<¶@éúÀºä"FÕ¯Ójˆˆ-á‰bÀÃø¬þ6Ò'Héü…KÑNº¬ï†)©ó؟뾿ƒ‡¯d&•Õ%Ïš6º9KŽýAݦ´¨´ô¡¨¸sšOãrØ)Š„¯b›CÌ[}âùã/r"vÞՊη¦zrX\_lw\WͰŽöó÷”žF¯‹xzû2D!(ÚùæÁ”îÆ™Ï» ÊU*a¼=þ4âh‹Ö õ©ne|)¾q‰åkHfwèÚú§¶M[¢ò€ç {¼W:fïuð·eg–¯˜5³«_•ÒŒ´Ò*.ÉÚÉÉ!¢j_ðd¤º•NMÛgöðÔNnxú’PçH«hŽÍÄÀ°PþàÍÓÄ9ă¤ÊNŸ¬vÄ¿ vÙ5‰$óyÝÊ[{UrQ¶&ME]ì¾­ £6žQ7í…A¢3BOcGã’hõæ^ZOØ•âDцc†pmÐ0O¹3x&d9‚2©^ûÖ·ø ‹fÏ„3Fó&Îèf_š…j®W¼'[hÞ¹*ø,Ô׋·]û?zp4‘V¿³î(3•z›Î)&æÍƯ Û1—ò\ZÚŠ÷žÖ^ ×|•éoK¶öÔÛÊ]A¾™Ž-Uüžsöœg‰\î© V³kLzXa‹Š$Þ !¤¤²¯™-õB»<Á^Ím 籩.¼Fû\ø…÷nUOOî6®_‰eØ¥We?p¨ÚDEdU3AêÆž?õ3+•|&z^õ¼›œòreïÃÄÓiî´††¦.h—µ¹EúEOäŽ'˜LNÏ2Ãà~+J*º| b¡ÜÙžËe¤¨‰F`¨äÕ â÷D¾m¼&jö*Íåda×ó­›«ãz½¯r3N»®diN^T$užÀ [¸JœÌDÖo¿Œa˜_ï.÷Ķ,+`âqÛ óÇn ëw`«3–4º)§\«SÝ’K ¢D[Ü]¿"ëï}6#¥š—ñ[(fÓ³Î;™Ÿ`8`ªºÇ]¢zzò¾ãF×[YÞú¶¢wt•­5¦ž•lŠô >c›Ï‰Ð ¨ž¥ÅöK>û`/Ë(uò­¼]`H8™ÞTÿØfLÖë\\gÛ»üX'Ì-î‰tj r³Ê‚ñNà|Pã¼}¼F&öýnÌöÖ‹ñÖ•×µ7ˈ¼RÕMï5<éÚ4Ùã¨À®³C“J]Ky¢Ípâ¦vWÐÊ.—x’o¸ôÖR9Ṝ¹œ#ËgWutvã=Wˆ-¶¥ƒå:vLí+JŠÎ^• _s2õò¹aŠSd$ùåþÄÕš]Ê'gµ»¶L¢‰¥z)ósGu¬| (ØOPÔ—$m5B´Oç|ß›|›½³Kõ÷Ñ£qyªÑÑ÷bSÃy‰/±}®3å5ÎV6}¢¢Zb̨ŠÕbß㵸نÿ•OÄkü"gÖæW;÷™÷n¡¯Î&Œ>y\÷Þu6ã.ì-I{å@Em…”lg¸;µ"í ³{°…!‰=¾ÇùIQpß„‚ röóHÍKùSÕ0ϪωglR-IÒ4QÛ1]ë+þ®W:ÙrjiCòDݦBиK¦zÕ,_œÛTªÉ~g¡7u²2`&Ëp`â›ûÝÙq%äd±C•!éóIf×å•r‰8ÔKÕ± ]Ý箜’QF¯Œ¤ÀNã>™°J}QrØ(tåª Õ„õ*ŸuYÎ6ìÅùìÓbÆ5/êÒˆiWãçTYoÀ§Ý›<:å[RýØnvàÐßÕsƒ®}N²¯îï ~=ED%§+vbG¾eâ[õy‰¬lk³’*LëÔšaÎËFó~* loÜñ^ÒMqXvs“´ªÂû§Ù+/u©¾MþÉÚÂ÷î*‰;c¢j;D98Š]ùöɼ"éˆDQ^ÂÉ(Y2ÃhaŽ~ *§²Õ•Žöë[–y#I´7É\ š›=>Þ¯)’HåõlîÄ :ƒï9BÍÀÞ™D¢y]¶Œ¥¥^Œ:DÀz»}"ô;M3ö’ë7tmñ$O!“\z|¸CÂõ¹eC“¸ECqYWTày#’ýZŸƒ’^ÙØàð,°¸ë1k&Ù½ÙZ Æ(A-[bX¯[›9·¾nÜ‹¾Öxî®Pú#½ÔE ×E‰ Qò‹1vÑ *Wå¯L?ßüà\%‡#$¡ ¹!‹÷yÇïÉ:gHxAÍ0ì¾èW¡³–¬†ú¥\¢áá„Cƒ˜uÁ^ ^D=I‚áòh 5kn.Aš<Íè XrgaawôfK‰!ã{²´ºÙÁè3ö߂-;àõ^yO)x/ N‡Wûlxæíö[o#‚ã3þx{ß'/¸u:-¦â÷â )DŸ~¨óE<#¨tE¬’v§©òTŸ*üG-V¿¿wÅ^l/FY¨;4|~¬[¨µàU(¯çàé{ø%>_8¸`Á6Å-ݤh ìÞR´‘|C+O@sS\K&¾]QIð8«‰Ãâ~náªÊæU’ÄS×B—§Û#Â^ËXi½ß*^¯)ŸÝ ¼DEuÇíÚ€2A‹rípm„–¦,=¤ýùÛ;i÷ØyÉ–Zô] }œù d01ÛîÓÕÌt°´d®Vãú%Føô?¼—F{'u囼÷§ Zò…%§çŸ¹ëXÉôryRn¸×yÕÝS¤´î!-ÐvìÀéx|߯o±â’øzÖ­DŸadæ5c M½KcGSjÀÌ›ïß—šÌA»{žìš™‹l§(P©m$™~ˆËƒ6ªxrû9fÐ|ÿe±ä…NÊœÌ+¼R×%¾õ\*ú feìNPµüEý¡ÜeκëÒdeo‰ë{ “ëϺî®]½[fz2;þ¦|™G¿¯T £Ò¨§´Û%ƒÓQò§/*CšB4ºaýP­!ñʼnžwѳÖÊãœ#7»LLrõ2þuÌîk…à+³$U'›¯ánª 1—Þù«uÞ¸ý #4"ÒÎ>/¯Jñ…КŠÖ½åÌûèµÏ[ïO5§…„¿fÓ…¼7#,LÌ6½¥#òÜIøq}^^°¼¼»ºÌ ^Oÿ³R÷èõ穳ÓÂ’ŠÐs°K®1"8÷ïnÅðævK5©Ý‰áÎeÝ–Õñ¼Øöp—ñÛ•—ÁgÝŠ8ï‡È·e1o{§[Îx×Êœ°>7¸7uÚéÚTâš;Õøí£ss/ÕBr8%Ö’ÏøìCÎmë>Ò7v«Ô£AiSèÌô’V@’ïéœóÎ*Þ|&ýTUA~Ò»X_ÛÆsu¿™Tî|×™SÍV N }Å™tãq¿<ƒ‹n‘¶o>î2ÍõÅ«ñ#¶ABìeŽúßnOMæoP·Ì‚I_kÕ.¾{bÝüj\v†ý$ß}þùáÆÖƒç]ÜJ‹y0gqr¶o†Öù¬éJtL^þ¶{ºËo„Ê,Ž5êÌ“óß.*UöŸ{9Æ<Þ;{''švnÚ2WKÌK)àóκ]aÿI¶åÍ s×E¶åêyM‚œÁØ®æùÊMƵ«³z變òéó6ò$[ãs?²[D ¡–n~Ķô;îù¸ë¿ã ¥ÿòô¬VÇãOÑêìr‰ÌpŸ/`û°ø~µ€yÕH¼4»ßdƒvÓ¶‡ý3UNCÚ;ÊÔ øæxS‹—¾áÞ•½PFޱâÁXÝðž¨#`.#½Pˆ]Ô\kaatú¢%x†¾šOŽEç)åÝ%fJ·çs2Óá|íÓã³úUaß-ÏÇÝt{zïÄù\[és£óé?ž¾QrÁ?‹ÿ ”ùÿìæ$ösŽy.9÷F’2¯ØV^ x=ZZ@üg=§Ûõ;-k2Ɉ^’å]*Xê‹ g­‰ó¬ÍU˜oÎ}Þ-}æPÊ0AXÒnÞ£kGuŽÿðœïjŠÎrœÃ6x_š)™BNñhÓŒ“óAéó”ÉjG¯úêû,7æü<©‰1%.;½Žˆ|H7{ÕÉú˃6åoêò7óeF›cm͉ƞãÕˆÏa—rŒ~hÎO“ ¼‘_ÎD\r½0²27à/A¾8ÝU©¿áYŸN[vÖç´ðŽ‹iõ7Is‘Ǧý3¯ñüÇÓ¿ÜqV]+zq›°Fÿ­T åòLœÔ4¹ex3ÆvšÌÃç!5ålŸ}Ï]§¥"’fm#Ý}}/±Çgóv­Ýê*ÃG_¬ÿd¡`÷Š8cmã(øÍj±Wö!q„zÏLØù’?›¦FÕâÎ?æ¨LnS’fíL¤I8ßÕ`íÊÕ3[Tz>€ºO)>¸œ+ô>{16¥õ …õ”·àst|ï ³Ñø÷ªâ0¥¾wžxtEk1Ü®ªÔ7ŸÔÃá{=[gw¿Ø[1ÌiŸ­ïÍâzñNRä[% ­â Ë¥0N+j»ÊïÆº|>ßÛh×—/ÚOˆI~aË¡ï.mlbwÚ{ïE+_|çS÷àdÞÉË\CE5Í´fn÷ïÕ˜? è.'üâtߌb€Èè5«oÆ»·…¡ îÂŽêgÞµýô?¸Uô¿Tä§¹ÅU¼2óÚeÛ…¦GKõCWáê•óº§k.D1ÞÄLJ(`½ÛóxèL3U¸Úg®¬3™b壻^àQ•I¸Cƒ¾ªQ(Î UkÝl³²8týAE&ë­}þy¾U7š'G$§¾ÌïÊ«¡¿%lð÷?7rn ‰+%¥1eVíQlÜ 3c´ùhÙ’GÃ[O•näœ7é¦|0™.V?bå²"*!—š[ÓX1<‰w®Ÿ@5ðÆ]>e^5*ü9|m™¯xÏN9q¸89Ýs1 ,1J¹u+‹§É\K¤BÝîÊЯÕ Lܵ%ròñ”5. {äŠéÙò¼3z_-Ã1q+ÉIºÚºäÊÍÉÊ—®ÕF˾M](ÔÏE¹"^FáfYÂ<ô&å¥;)ùü÷–k›Þù»ÁŒšµA«<¥à F);U ÆÎ§ ,£y„9WN¼¬'÷at€\6…Æ=ÒOÆø }’¸&@6Êß…û-¡T$rí™ íæ÷§ 0—fæÙs©%Jeà*ÊblP¶†—C–Ô²wfcÍ&ùçW¤^Bç¸Õ´ú’m¨N…€Þ ©ÑŠRÁ:Y )Ÿ91=^Ì£=ëîÑ’ôª‰ºS¯MNªM¶NäOVlÌ)~r÷2WãëÏ/+wò†ŒiëgèšqoëùÙF]"ba¡'ý´üº;y·÷ix®V+«Mši›Îµ ºK’5ê„ã,<é©‚2 Þùçé.ÌÛKœ*ŒŠê,ì˜háO˜q#2¸òííË9çPRÙð²×˺³˜b»2UÒ¨_È—- ·N¬€WC[%‰îL‰~Ò'Ùò±°zšÍýâ+&øDŸovËBtÌzëŠ<¯îUÝæLÿ÷,ñ›tU¤ñíñ ë´éìgS¨ýé rmÌ¢{\Ò{K´YuuoV?,xeêÆ+ #êHÒŠNÙ4Uû»wPüßtþekÊ¡w_ $&";ð ñŠóŠóò‹ýÍ;( þ'ïà/AÀ¨Štjº‚€;åtõp?â DÂò:À|¡`/°#Ø ìàéu?Ü.€ÜxaîP°Øñ÷Ÿ}ƒŽì³@9 ]!p§Cw!jw·ŸÇqÇ¡/Øìÿ‹ûð×Ý{bÿ‰ûPXLLüˆû0äÀ}8Ÿ9§gh›pE´"BÑ…þžÑs‰7XOŠ´žJ 0ÂA¸Ì’˜—O ©§žëSdÞ«˩֗ô_vó0Ÿln ö€Ï²½x´¸ê+Ýn›(¸úãÇ¢>œþ^.N^nh¤ª‚…ZãÞ.éÓTyžL•½H\½od ¦6”dϼœ¬Ÿ<ðÉ£†çм=a'@-‰ñÆ—…ÙUUYé.¯™o{ÇÒÔBïÌñÄê{ã÷ÍÉoíÈ:R.iÆ\½b]uù;›4·#?/·Ì¦š¡…“ÙÓ¼âÇTôêžæóÍOÎr3ñˆ0ïÌ ØPo Åmgá^l MÞb^Õž¸Y/»,÷µíÚ)ù¢ ÅwŽq—é ã¯l\ù¼qUœäô#Ø»‡ðÕ÷ÓÖN£·ªÏÜ7oqºs:ª)’þñtW$£Ü¯|.íD Özç [«±¶x¯7EïØôò[»²-F/·Û|áîÊRsÂ“Ž”þv¹‚©ììé5J[Þ WÞ2³ªløŒD;pg$ Ì}I_÷MJÝ ›?}I”A\äÙb_Mÿw×™Tp²ÅfO³·Þ˭߯d=©Ì~&)\lÕݸ»Þ|[´Ít½ßuéN¿hÖê3Y±bZ:¶öp¯¾“ÔdÓ™ry|Ÿ‡ ü,<½ô}Oò$Æ`Y o”0®Òư<þvQ, ûÿ—ÏyJ¤ žòù^škâÙ ósDFÒ©µâ¨åáÜ8›ŠïJ¾„7Ë_tÍt…àìƒÚlyC‚I5ÿ8j1kKoÊ*[âOç¨sÅÙÉv–’lý»4¶—zb«¨ÔÓÔƒÏxûtŸÒXxY5›†å é…H¥æ\=GtûÓª AZ¼›½,ôlÆá¾Î¯±Lçô¤›qI×'Êž².»žSFºKŠ\t¿ùô•×;›V•65èn] åËOô Ü[Ú¹÷d±D7ˆ(M(Ç “>Z;ß»ï&ŸÓq R•ÝÿfðLHïÉÆ½ÉNæÝQ=ç·¯±g•¾¦ó§çNœ@{æô r“œ´žÓîbz©îRûwlB¿àq^4ó`Å.êWqœÝ0ï¬IžÿLOF[dCt«ÅAüMndÙ ¶·« Ä–Æ!ñ‹k¸™.½CÖ§jCwÓ?Ý*õ¾ØžóVf;ó›ù>’iCl¶»ÔŸ¦Åàíð7ÒD§f#&º&`‹ DR7]¶H㥢ãS¦W½½žsê¼·=¶ˆ×IƒYöŽèëàù…K¾¤“Ä/ îÔËßÕ䙇7d|ؾ•7nø²‚ã]Þ÷¡ÇNábÕoU/Ÿùvâ…ýÝçØ_ݘ¿&\¿UKævï‚ÿünÔͪ€*±L“6yU%ƒ`˜þ2ÉCÚ(’ûB©‰Ú'ð@‹'Ìt)°†›ü’T¾è“sßۺ׽½²ÇO ƒi)VX}/õ²üåïQNOÔ$Úƒ„ïE®%¸O1=ͨÄJòÏíÊY¤Ÿ9EENá2â”`©“¸.¯xñïÜé[—Ê,?ÑHõ&› ')™ÂÂNó–¶<ŽÎj9U&<§pƵ’ÿ;?QYœ W&ŽÝ,mmœOÏao¼ü–Ú#ûp¼¨îÒöϵAivn:á¡û#Ü £H¼)"Ò€;÷„š¾õ¤kèJ?Žk†<íq0Il²ÓÒ޹ӵ·ùc 7TÎ%²³ïö§³‰×Ðpc”n§QrÅbΧ§Á¥ƒ·ÉyOa õ¼ÃPKQu­›ÝÍiª¬j¾=þ²wRZø¦«ÛxÍZƒeYå‚ÎZËb^£Y÷@õ˜Å\i¯½;oò–p$š51ÞÜ UïIV,•–‰¹>ik§§îíEb}íѼ…9­rœ- §—)A_IÒ+R›ÅK^±Å£rf‰eioÓÈ÷V[M‹z•ËØ '6Tazà×h1Ÿœ¸kë"™yâL½Ðt¯¨0ÍÇë<ïr¾Ç}]Ï6õ-]%0¼QìšÅŠ}§Nj$ÿ ©Ð‰"•]€ŸG˜?_ÒÚVTeÖB&rä%_FöBòV0ý'i þ :¦EX c–Þä±û›„|F/ˆÑØ/qÆÂZ•¢O3³N¯Î×±†«'d×Ñb×rG°ˆGÞRÐ{‚zã’ñÙÑ‹üçpèî(˜lˆÞÌ{“y‚‰­¬¼)ÄÈeiÅT'¬U&‚^Š;Ÿ®Ù"þ>¯?m÷¤rHóTÜsþÇ Ý| úsÞ›â[×px}æ âô˜ bÑÓK¸ßÍ)žÁ (9ýXæÖFÑVgÝ䬬¢­]ðàiQßÈ­mÚÊ´´'_o””Æn®±ù«ž¬ú\Î')ÆÍ£HŠ#hø‚=õöC)]c›UÐRª£wÃmÌTåôUW–Ī¥,op«?Ó9aoß^gÕœ8h¹ú!l¤¡gÜw“ SD²ÃÀXŠÒ>¥k+7`p|A<ÓèÜŒádÞœÙÿP>‡!:nBÏp’Ý(§é]¡³ O”-²ŒîóãÝJ-¨új»žáíýT'¶O‰Œ=U$ûCÓÜ%ÏyJª=•%¯Çž©Wn.Qd|ŽÕäÜÑ}ýñ¦Sâ¹L*{Nxž°A«S®Ã´m°Ž`3¤‚ìÌ…ç_O]°ÝRç•É`aúì£bƒaï'o|2ôaÊúØ‹8–]¯…¶E2+—G‡ÏvŸÝðŸ&ÊÂt‹ ¬Æ“g)c©q>óB™É¡•Q4»µ¤žƒã}þÅš õÓD/2J7u7ï¤Ö¢ù=LZKöÀfcÔ!ª;3S2 âôR3nP–÷¢mfÒÚ6ÿ{œ)?\ßœÚa9Ž>Ò'£:ïAE$$|ÖFI¶«E^÷ŠMt Ù ž/¤ôà_>¥jv3O)KDwhÖ„–¨S.%P‰šKG‡JÍéóÓ¼©‘9º€2H-Î]g¥i<›·¹½º·÷†Rr=Üeµœäêè“"z¨¾GÛhf˜4 C˜ÅÂwlæ‹ ^?LÍ+¤²³OYóÞÇxUÿôêû{A8"Û»J—?ï]"Ý ïc~#e‰›¾Ô ‘ñÒs”‚P{\­ûGðñ{›s U$»}· ÑèX´ß'^®LhAû!ÐÍ4>RµÆ`Àé]™|çþ¥Îä&ÎYŠ °„tˆÊ5<î®T²î9­$÷>ú–ëÕpm˜´<â½êÕ«gæµ).&˜ ¶…¢ :©¤ÂóÍ(ž Û+ÕdëNÝÝ“£.³ÿ"‰]¬‡öÄ·’)%Þ˜ ÂCÙàÁhÌDˆßTK$Pæû§˜¤Ë¢Ö;!ò†õZþÝ|Á$òµ°Wo7±3 M©ÎÈ4¿Î;K\ÇÓÛ aÛ’}›1@©µýâ7Ù¬uQld”¨ú=O.w•vØ—KIK“çç_ËNí(´ÇÁW¡†ÂîÛj?ÇTQ½¤žÁˆÁ©¦tŸÇrœŒ’ó´û¦çýPž|YôÓGÉ«]ó7jk ReZ‰3ŸÄJÐܪ=]›xEô!©¬T#NC ÆÌÿ½ç€kêúZ­ZŠ­£µÎ'VB&   Ê’!4†äAždù’°­«jÝÖÑ:ª¸µî­u·V+®º·Ö½ý»Çwï{/! ˆ$ öKÚŸ$ïÝ{î¹çžsî¹÷ž{ή¿ý–þGEÕÓ†^ÑÇ¿9ö6©ÑÕÆËöhþ÷Ð÷3Níþ&o¾lá ÖÝ»ô|v©öûýÛèLðËüak¿«ýÆëݰ“Üm¯Ó™r,"ãæ—oU²¦¾žTÁ¯nãŸïz¸¿ã7­. «šš3$Y4çô†¶¯¾=stð£›õ«ºïï £“*¼<ƒn=Q)¤aƒñ󪼜Є¶ ÝÖåÈñΉKG0nLnUßë€|\b¯^ç¿IÈ<~ÞƒÅ9«Þ/MòÎGnÞÝäý+ÓîÑ^ª^/JP´Íùë¦4Fªtë7rÒošô\4F468ò›Y¹É»Æ¬ÉlÚ³NÏæ‚^ÓæW|³_×þÎÌéô Ì­‡JßðÜÞŸÞ;#@²°Óª Í{pž>¿hZ…ד$s6îú!dÕÙ|Õ%ñÏãOÏQ|¹¡Ã‹Þš”lØ«¬tåV³=/Ýei‡ôh~µó­Ñ½¢ÆmjV07§zÞûóq¾Ù<¦ÁÀfÒ.üMõ3ý÷ÕX—tO*{!¼Á‚S:…KŽÔ¿%Wʽ&¬ÑÔÉ4ŸÐøï¼!ËfÇß`ïËbU=oûÁ¸´_»sõî£Öº¬rÁ·õ¦E®;±]öÃÝßš÷¨n¸<¨ÓÆk~÷ê1ˆ×‰‚øì¦GŽŸ ®°/ïñ®1ýë åcOÚ›ø4´z÷ˆf?{lM¯ÙòÒhÎÉ MŸtâ<5°^âÀJ•ëÇk-Ú/~^_´ë®äæž+·?]ÌUé…笂¬Ž-{etTN iu\Øêêw2öåöÞ#êNѸ®xú¹SÉIÇŽÏHøvoø¾ËÇIŽÌ}Öè‹ûwdï¾\7\ûüîËF—øÙ^«9LvK®÷‚Ž*ö-ÝË-A[ÝnVè6~űÑ#¾Vmï{¥I£«;j´ÚÒîjÚðÉø‹Åçï¸O­ä×dvö½¹k6¶™MW2,:Ž>Y6tý®á^™×Çýɸôü ㎚wNѧÑw BïW z]}È’aŒ€ŸÙêŽ?¾ÔµÁÃÁ§=Ó4í¥X¢|ðþÍfUœáviËÃfmÔÞ:>áú1÷º›ú_îÕìôÊ­©ÛÑ6]+]˜¨Š šv³i£Uw^ÜN¿2sÈ 1£·¬5nà!Åœ-ŸTË{òúâÆÄÀ”_Rå¿­å>]5bh‹‚É7}óSþ€:ûß¿iø“°ñþŽw]YÛ©òR—ø_Ýü”ÔëÒ¥Âê%k—.8ùG_Þ}Cþ/;îøºaïˆ:Z£¿Ñ?ã¡öé¿ïùŽëùrÅÓÕCþ—­ÜóÞË1ÕÎßÌu¤úºƒÑ]÷õ~¦Ç³´£‰©ç6$eÝ?ü¾Wï?žÚºkåûëÉÓþo®Z>åT«,]ðô[ «\ñ|2«_··/ê1"æÕ?r}úåš–½è‚¬•3Æ'ZßôžøÐœ¾ªe¬_+vþÙûó_Ð÷ێ룶nþbÜâÛÃk¾x\åçŽ? ¼ÜáÉŽqMöX— ZÛ¢ù΄ºϹ8¢Ã¸”ˆ™úÌÛ½1w63~¹9}x~O¦çíyôŠ:õª$xkԳ׿}<˜q~ÅÒ§5êì=¼RgwÄ­ðeôžµo8WéÚÂÜüáî»&ìx³qcåGÛ&¼Z+9gú«¼Œ³Mfº»ý×i,}PµðLqkÜòµrNþ;´žªéÞ#ïÎ6ž·+¯Î»ÞµÆþøÑϪ^;V¬™ÍèUµ&?D¸w½[«¾aS¼ki:7Û CÞ‰ ¾šÄ°(a§…qgv½¸ôõÊIÉt¯§Ôœ°Ø{ì·ñ?§FW‘ MiüϬÇ/^vx»·Ù“óV4®4.Äì‹ïãbg…s§uŽ˜{±·x‹dǪü[·¯ jKv¤õwcM¸„ªðjÞº/ϵ˜õ`ÛúÊ,Þ=qîJ÷wσžm±Š%ð`p欻Ãfp_ÝZôÌ3«÷‡ Y©Ûvf_Н[1hÿAƒ¾ÜðÒmûÆøÓ¹÷*=¸â™vO#j»±£€§_á/0a^A®0cT¥ú['…|1÷ÖŠƒéXã›±ýç_¹°ûbÓ‹?h+èZæíÐ$pî¯éS‘¤k««§$åtü£íåasjØTmë,ÑŽtÍà/Øøêkݪ/¾<±Z;U¬Êin“{­Xzuêé>¾c~xóêMÎÚa<½ò¶Ôô®~uõåÁîsY‡{¯}pÚ‰ iœ†QÙaÒËKý™w·W|œm}øÁ¶t6ÜÜ/ÜPïiØMgqüxÆÝô ¶Y‰4…qÙÒ0•ÀãÁÛ=L&ðHâF1£4!¨냣ñ9Ñ Òœti Ì£m0¨% £¾Yo*±¯EP­Tàæ dñ³”%@ÉR*TZ~–Àƒ¨Âßác†BÑ¥ <ºFÅ":µZ‘Žé6=Îòeq|T=ŸˆTÇ¢ó<H\–Ê…QÁ/‡\§ÓðŒÌÌLz&‡®ÆÓ¬ÀÀ@“Í`³}A _m¶J'ÉòUi[xPõ°®Æj*-À‰.U+XW‹Îd2œÁèjð7¡Rà¡×c2>/P’Êñgr}SP.Ï—ÅJeùÂ(]¾ì@6—Èeúq¹Cs4ÍÚ/@ƒ@ð‹«ez)Š <Âc#‘p2läô`8+@xÛX¥ÈÊ𣈬"‰ f3Y<_f —ÀâðýØ|.¯5“Íg2ƒ%iDÕÂAÝžª&%MªªñÀÁi¸:5Õ$ΛMç˜T£J1,¨ãlzI4QQÅSL©„, ËñETŒÖч4åì1–Ikô¸‚™”*Pˆ› Íˤ|2)OF“€†!w/u˜Nˆ :ò‹ƒMðUšÀ#˗ʃ휨"JËÈÑP`Ô°õ…°lŒƒ’møÕ¨9‚KH.fÿÇy€ Õ%P½L¨ ­Õq¡66ȵ§-±ö¢1&4€Üï)âCIa²ŠfBâÁdz€b@ºJ(AIƒ§-yñ2†cÉÂÑT1 Œ„˜†‹¤"Ô3¶Ÿ?èñFE=c3Ù–Å3PÞ²·xÆæZ=c2a˜Ërëº\Ž¿å3× h× `EûY>ógó¬qæñ˜–Ïülâƒ0XÖeZ=óãr¬žùó¸,+œ8Vøqü¬úëDzê+ À´]óàDÔŸx•ÍFqjµ!¢® ca“|"DH 7,,„Ë1Ù!ì0?n —Æ mÏd…°‚K.Ñ“FÄg”à:‚ØLN—Ö²ehL­˜øŸq¡BQT(] Ÿ974f1ñßYlÆÿäúqX~,&ŒÿÎâù¹â–cüš€øÐÈ ÒP]JÒˆHë)Ѝ%"Ž-à: ñ4OÉFLòExÑ­ÂÅËP)–] CডÏq0›I`hwD‹ÂtK:"ˆnT ƒ[«¤d b5ŽËV¢ ›•èur53d¨%`çAÒÀƒjŸêD¦„Ìøë@`Œ£‘阤`~6"î)G ˜+P˜o ñ¢"ÜSÔ%ˆ ƈ×èUtCP`*ë06‚s~€9 &BuÃ÷|"4y&!žBôQ©†‰šR20µ^kHÂK¦bsi§ÀRˆ†`ršÂXü0/0-•°1$ ®Jâ ßÑ•€B¨LÏ „¡ÑB"0l2n3Š*‰æ¨pЖÒ$ªlˆyDˆ(Ô0®8Œšo'n>Š&„OGÁt £RóiÐÜÑ\H¢Ðå’¬,ºeÈÔ™*…Z"c´ø(3zZŽ+yHYÇR©EÅðã¨F‘M—–©þgùû1ÙDþ ü¹`úßÃe¹ôy|`Âc‡rù ¦õÙL&©•ÐvéHš¦ÀÔ ,Tª”! žC@íR' uK/Ĥî¦ 5KŸ-Tv Yˆ)©?$W¨WêT!D6úRe 5íJÓmÓŒù9ÜÉl¨N¯¡ËÝá‹T˜˜³ƒ°K¨8:4È6-î@k_S9=T¨&``*˜Ù£X–a©–5Eí­+ÉRŠ(/Œ‹’IKÌëHp„›*®Lgg«*ä-Š“µZÔ´„»ñ¥{‰ Cb¢b… Å´ &í4Í€Å'ÄED‡Ç[ S:h‹ª‘`YG³Ä¢ŠéP½1\™ÊÖS2U •ÍÁÆ{ÀÖÀ%˜‚ÈÊbk¤2³ëU0Và22K‹$EŸJæk•(PUqÙÕ-SµzÃo>f™ÞaîžN§ 3½ƒ/ÚâÂF½U†’d¾v#vðe_™’…Z„øÒ†JèNf¸Xû 8.†›ÍÄ©¨|âì ñJ§ðAˆ´†ºR"+ÄQ€DD'ˆ£„]Û ÛH(„DêGj !ÒïZM„‘J0ìG° €*Ô@)áwÛÖèpâ%ñËnÒñ~ƒ{çà›· dSÊb*A]’²¦¯ãA})Äbª”dõ`µ Ëžr#­Z!…´GÚšŒÂG˜mh4‚*ñ(ê]"[¡ã`†@*骢K§h“ Ö 0™Ãž¬' ªµ¡ÀÁ€X#6gRׄ…( Q ¦;¢×À y‰¬ paE¤)ÅÕj%‰"˜4%D¦#tÈàHÒ!,¢k¨(¾;ٙΰ0/(økh) ÕI冇Zb¶ó™D¥Í„¹b‰ džĭæÍQœ ÐE­*ÅÔY“à ±ö‚¡ØÚ¼”0Ú¢Dݯ¹a•Œwh–†œw©)׈£¡伬MÇ4`Y£Õ™½£z¹ FP¸µ‘f$ßAéƒï cŠQ¢11™lE]£ÕöC=!„Ô/„nAZ2+ðÀØ; "èœiúX³~’E äZC©ÿv¦pC‚ ØÂÖÈÚý(õC  sZzP /šðM® ­M-TÀU£5É?K0%ÃÆ&Ó(KT€míŒ.=(¹š_6eLj8”v­•Øž§ª7‘©HêiKQx;7'àx•q?µ\ m¬èC$š-|›kÀ’ì°žFD[¦-Ä–Ôƒ–ø‘J…aák²—†=ü—07l‘Ý ºÌ;YøVV 3Û¿ŒÅ˜…ò(K AÁzÄ =p*N;ø"Uã2Ä3.Î ZÓ]Š# ƒxb Š &\ó2L…Öºµ9«€†È;M„8ÇÅAIm°!ÕS1T!£@“óy©åØ8sÅØ0ʼn2ü¤à¨$ÝHÑBá2…AIw\\1‚]4‹P¸™q±«6¤Ü^…ŒM™”†Ž‹'t‹ %,Ô”áQX&$RoUjc‘ÈÐh«¤Mbh'!Ò¼€VFªØ ÕÊÇ — 2… !`¡- #H‚X>&°È×yÅj4ó: 4=¤J§‘ê‚bÚî:A/smhYÄ‚¬ÅáT±) „TF†Ät‡v ‰K a\ä“e‹•¦ÃMbñnL{‡ÉÞÁ²9dÔÀY!kˆUJ5Ùž­²õ õ]O„T vÍAæRe /¥9ƒÌ­ÔâÇÅörƒ²x%Жje0 ˜¶q mÉC«ó Æ4<ØqÃÀ~ÈÈ‚þ¤#UYÑ#OŽJëÖEkjÖ(­~!–l¶…P$Žœo©9’°%„mFLÜts‘Ë ÓÄÄèa˜î{’‡àLûe4,ìv4Hs¬Ígvb>'O£4 utcP~äú ÓYtűéžXž–©ÁÌ@°×H°ÉÓ%ÆÞãѵ$a‚$$°Å G<`šÕ"™(<BÈ“1Ó¿ f(Ü>¦ÝmÓíKA0SØb‹)Ÿœ­æû¢¦ùR+¦Ÿö‹Q1¹”íKäå…mæ¬Ñ:†i Šä ¸î‚_p÷Ñ r ü¨%[“©á? Õ!R‰nÕIa 'êæeÜã Þ0ÉŸóÜh Xt;:F$L¶)°•á„"ijqbKÚ÷&¬cccÃR-î×@Ñö´ˆ´5¼à›¿0 Ë%ƒÊdPÔŒ (*‚òÄF=±H’[aÄv8‘ê‡/M¼§[O'㊘~±žtRPŒBáe= Z.z1ÛRY ˜M­mKc›.ïÌ×ß6&ãbÌ™j<›`a=F¥ý%¶ºP•϶ Ša{Î|il>µRe¼¬¥áE±ãGò –“<¡À´–Í,­ââ6Z6j=zýlÌpß S( êÔÐr¶"÷rôR)ªÕ¦êŠlº-ÛȬO”R7è÷6Å—6Ù‰(ÜH-®­­yTh|¼0˜¬ðNu=O‚dH˜Œ8^KÓ‘„Âc òfA"ft”°S¨ (xkîâ‡fÁ4$Š‚‚Á WX‚ëU&5L¾ÐF*ânG€…;Ývánj=è’Šº³‘ —ªU©Xš'/ÊdÊQlJeÄÓ¤rJ6"ˆ‘÷Cà ¯ #¯~'¾ LH A³$Jåê"É@Å…»m ±j­–¸$)•«1)JÞË4ï%€SFE7+ŠŒ¤šE<÷]Kd0/»aÇ‘7^Ëz!Áʶ£˜“Bkf*±q1±Äi`f,Їãg4áå*¦±P¼T*† ÒÝÝìy$¼o+Ñɉ!±±©‚Žf¡µhqñ!\J~ØD„!ˆû÷ž€÷¼ÜáA´=œ@bN´Õ^Š$jQqTXˆ jÆÇDq$–‚Kpˆ=˼HŒ^§ÑKÃw™Bá+£à›–‰PéP\‰Ê0 -J2Ô)},J'Àód bá+k ‹G®¼ìF)"M¥ÆQ1©à`K&Xa*‰È>€áBÄB5ˆÉFa„wEÝ1„~G îtz2îŽ0Dˆ»XÚ>1œüžÍaSCb¢ãc"CÁ¯0¨ßaH í”CDW·! ˜oü˜Cfd(Tôûöñ!¶ E+…“ É®&p‰·†ߘ?ŒŒˆî@­œnUŸ|Gr¶Œ®“©e‹9lâ«D–!Ñ`ÔtW¡ ꇑdZ}Š6[«C•|)%æ L%ʼnûö`5¥Ev@`¶ƒyÁ à! µ^Ç7aBùÜý42"°„(‚¥h€ðòá›4…\&, •6 =úth£ÐÈøÐÓH-ì€Nb¯“pc %k%ª¬“õ³H½d…Û åÝT¨7bØ–:#Ú.Q”Jr"dÛš(ºM]þšÈ9² „È“ -R\ ì`"°¶eÔÀ^Å«œÏëÖ-¦ævYX;u;­cÉr±vlàe7JŸŠµ~…þ> „ˆ0”åcÙ×îç`þ8ÖD!gÙoM²l‘zê?ПRi°²µŽ ¢öZG&eËÅ:²‰Û õ XGEª“²1™Jnîs°£ ’^F‰)ïk”˜òb‰*ês@ê¢hPE¦{X¤TOÈ-)»¶’ì*g"É%75Üì*l ›ìI8®Ök÷xò 5܊ךjPVLæ{¤TYÓ¤ ¬“* Ä8†§²yÍJÚUrATktŽBQ©3%¸ÊQ(…Wd€d{ÆQ8€8E€ˆµçDl ç³É@É2Pr§ ”ÜI%wÂ@Éí(øÃ XZ˜zG”‹£€õù/å]Äø˜çÿ0ذëü¿ÂG O³²;ÿç1™–çÿ\Çuþÿ©žÿü?; ñÏÜÀ “Ÿ©/€)ú”?€]ãR6>Å5í ¿€’à;î`ñÊþÕGÀ>Îpù ¸ü\~N9Z7L ÿ_'t¨Èq{ç—Ï€ËgÀå3ð§ïæ‚û9ù ”óRé—ÿ€ËÀå?ð1ÏÛ?ÈÂøL|œÐ§Rk3—/Ë—ÀåKPGò%*Ÿ´?Ai‘·×§ÀÞ­'»+Øð-°×°³»B¹ù¨ïò3pù¸ü >?×çs9ÿ‡‘BN?ÿÀø\&×åÿñÇß4dLÙÇàù[Æàùû»ü?>Qÿ"ºÐgçüA„Ñý¼=?üLÝ>Œ¸S>%GÙ8|Ù®3¼=Š‡4+#àÿU';¸Áåááòðpyx8Å!‚˜þ3îŽö¦ÈS »f—c‡Ë±ÃåØñî&"û9yu” íW/.—?‡ËŸãcú>ØoR|&ÎŽv¨tJÌåÆárãp¹q”‡'D±–É'íÃQ*Ìíuà°k[ɾÒ6\7ì2àì+]nN¹]. —ÇÆ§å±auþK(‡~þïÇósÿ”órüM&e–ñù?<¥e[ÿ³]ù]ù¿œÿëóÉüåÊRäú|Šú¿¬ý¿Ø<‹k­ÿ9.ýÿiú‘ºõ“òÿe«$JLꉩÒr,›rc]+^'ÑaR‹ò~‡1r‘lX86Nb¤Ô~žNb…¸“NbE A™8†™·U²3˜M–ó*bI^T ³d·/ /VIø­¼l9r5z.ç­2pÞ2õ°sþ¡&ñ´}bD¤ÈtwžxVbÀ§q¸nexºY¢"JLfMð¢'Ó63!§Š–TÊÔñó9Qý°Ý|À—¥sÄ¢9Á@0 Ì5XŠ×à©å!d'ŸÚEŽ=󏼯ÊÐkÌ>½XŠãÊb5EKjÇn-m—–‹.¥–û´Ž^K¡.ìöü¢–àV*Âü=©# jaPo-Õ’ãjîcámŸžs¹¯}¸ûÚ§iÙ•«3›Ó°ú$´ö&Ú ñ\`¡ÂÚ·òÞ2s s7úBeRzö‹µË¡«´]ÝD)w®R5þIZ¥WÃÈ›úR} ¼ÚÂN÷§¢7cŠ.aíæTôä^t‰rsg‚ž%b©B äX«–¦£:­£EÐiF ½¤€Ùã0,•ÈÄĬ£t˜Í(…#•¨¤¨ãP@¿€Æë«Gÿ#“è$Ã@µ:\í0*h–F¢’‰U€©  …©ÎÄ”*s˜«SquW°œÓ3 k¨*à P`×R²%2î4`Î` ‚ÁT©j'€‚ÎQ0˜ s˜乃s`)0ÇR•éNQEÎñHUkà—ë‘à`R“€)D£Èv0ðq&(ñÓi™Zª'œC—nèä-Qe#=®QkÉR™˜NÖq°v*ŠB}9Š£³4\¢Ò¡2莟ÉPèœ/ÑŽë’uJ`Dt ÖU©uP‚¬¼ A% ,Oka3DݵNN~³YWeðÿ/ì½X­^5˜* Ö4ëžOaCI8í êT$ŠAO RPHK@¬,‘³A‡— a4ú&ÅtÙ°}„òÛW’âàØf¤¦HÝÀ¤>4#€…‡A¸ÆÞÐa= xî oC 8ª:ÅÐ-¤­žì€Vé$)˜¢¤N…u ê¶M:‚Dèòú9^îxåÂÖ4 ‰fÁÖ´°¿„¯(`Á‘ΆØ1h4wv 502 SéòŒ‹Rzž0Š„ÉPc2Ä[¹³ð'îƒÀò*¯6´¨B‹¥ÃB–O¶OŽbþÔP§Q =–2±ü$ô¿ñÜG#K-/ýï4?Çxÿ›éïô?›ÍtÝÿ*—OËXQ}?Z˽wÇÍ¡q&¢NéC bD¢ª4 ÛxàIƒ²'a`ùˆŠP©Z†ÓàÆ›DIËš1³Ëé±gyõrŸ'}u3d>’ºIžW0çO¿Gß»¥F(ç·»ãUµáÈõ'LœÛrÐëZ/'¿“2÷¼Z}Á fŠQÇ{|>@T9^t|áK·Úkšu¡Ÿ©Ïœ±fgIíÎOê7-`'u{Ðö™'Ä^c_Ëi\£öËáßͯÔcʘ7‡9WSÖu½(ÞÖëâwoþ%= izÍãØûô=ž{KÛyv@åå—îïÙ¸ôèÊÑkÖ¶;)ì^edàÂÑY߬ߛz°íÛÌ5ù£ÿñÕœ<ïàš{9ÙéY7AÏlÜ{Äæ¥¢ß– ,™qüIpý°•¡É•éÿë;þ¯+Õ¿)~6åf'÷ÎßbއNùvÑÁØæu¿›âÙéï¯Î t íî¼¥µÆÍÜûßãùíÏöz?@ûzÀÖäÚ÷wz5öÙ6Ö¶Qǘ‹ÝG á?oÿõÿjv»ôö0ÿõ™ã'\ź²V4·“÷Ý6!‚:·ÅkMh¥<±è|½1ëóêm­þ¼çª ƒC=–þ;›—÷êÇ{Â#úË¿Üz2¹ÿ¦{>Õ6Ÿ8â~EWkèi5™uª­¿Ÿ²§ºRUñMÓÌ©u¾\½ùðÎîW'ú¼¼ ¾pat瞟zø¿ñèÇG z7š‹-Y9cÁâÍþèQ‰óWŸJñ-×ù]__kT,ý¯ )QùwÖŸ¥_ûëlÇ܉úða9Ú3æ4n—_µí½ü^—k¶çŠ~:ü:àÜÜ:ô¡Â‰»n¹UÙ+­3|ÛÂSi‰uÆ`s‡ÌmÜÍV1%d]b«M5Ý•-ÇŒ¿=öÕ² ‚?ñ™š×Tø}ȳ¼q“‡n©¡›´x@“äÅþa™ ãfLľ;œØøÀëÉË[œ¼°}_5ÁŒƒOü±îÝîn¹<åÝ3Š€z<ß4éÅê©^c}ÿ]LZpuäÂc®,8~hÄz{kuöˆV³r¥¸Š»sûƒÃóþ|Ùön]Aß*èÚNÓbk"wOÝ ÚÛ½‘ÖÍ[Ý«vÅü¥9­*«Ôù·&O<[òn¬ïýK¿å}—…÷Ü2cZÎZü¹g¢7Ò;¦§%º»Š#{wäg&ü>bz„êf«ÕîËæ›5ÇÿÌ¿ëýñyS×Eü5öÚ½Ž Ò§‘;Œîx$e‰oåKÿ®?Š¿|õnÜîC‡V«’½éĉÛó¶Ö8‘¿å؉ZÄ ö__„®žÌ_”ÔgËæSõ}ÇûwlÖ;£©dôÞÚ}ëL]تº/í¯<û瘉c¾ôÝ\ÕKä¿§Ïå]ÏϾyÀWîÆ¥/öùggæBé“ï&F4¸ê»nÑ¡>“%t ¼Û¤›÷·Þ ç³…-Ÿ¸\ñ·»WÏ÷ú¦¥÷ê‡êcñ¿WE«¶[ž—7úrÜ»ï_ý‚,p±ƒßÙôü¤N7¾êw€8JÐèñ¼«ïˆL—þùWNµ€ÿÍ\5Syæ÷£7‘cã×6hW‡ßv‡¬õö•¼ ­ŽÈ+¶Ësk}¨ît†ÇÍu³u{°vì½·uX•çç.­?¾„Ÿ|蛺¾ë¶½=Їç–7º6û÷ x7·†t?q¬Ç¿–K¦LyvàøíÎ uÎŽ(ß¿<­þÏkMÏÞgë¤ý#¡ˆâwxte§¦yª›:!ÿáÅ Ë›ÞÛEÏÌÚ°zËþ뽿œ÷Í7[âž?{a)÷Üõ%‹öz3çÖ\”võul볯&=Ž=~´jÁzÁ‘“/3üšÙ>Y5ï<òÏÙ?T_˜Õ¤^èW÷[_j\íÛ÷ÀÆ¥{ÞžNgÉ6ƬùþìÌȽqº5 wçÑw¯X+ñÏeñ•XYI-=”½nü{_e÷=\TB¡’V™TvfÁØÕØ÷e¬‘4Æ`3cfìEû¢=‰H¶Ð¢¬¥ -ÚHRHÚ(ŠQ´Ñ÷<ÏÌ0 ½½Ëïýÿ¿ïûyßfæ9÷œ{Ï=çÜsï=Ïóœëw&σæð9 µ6f[ml™W6°\`9Xàè”Ñ,ç Á†iŒ9lçH*î€ó'ÀmÁg(0OP¬©£ ÓÖ@y‰À±`IF€!,°<ƒ©ƒ¾³Â t `/w"0<áÀ¼ƒ;"iÃÜ "Ej0IÌ(9Rº&¸1p ÔH‡‚Xü©òƒ„AÒapk¢/æ)Â¬Ï Ô VÉAŠäcàHv,îm öGo&0MHá¿Â@üa¹&ZƒÃD`H¦'»:¼>’mJ ¡Lhg&D??0…s†'à=p?¢hÁDr(Ý‹£zužê¹M ºæÐ5³˜§*0áÁTQ€ŸAkš×Q÷÷!þtÀ["‘ 8†Ž§3 ˜‰pT ™‚.ÁÆÀ2\άCö'³ ܉Av…!%ÂmÁxÙ2dÐ@Eàî¬j44´ZK¦E8އû p?xœ'ÁÉpœgÀCɾO¡àáŠë`ð\†DóL è1‰07Uœ{*n=³7aHm´Ž¡áèv‹à,êàä¶°¹ü¹—¢×Ýr‚)ÖW®d»u- u;úBͰPD¤Iäó­e×-¦Ož k.×’7蟾»:E&}c¦ìå3糤<'ë=Lm ÓÅû®y«]’[¬WLpLg íÉÐÏwß ¥¤Šð…îùíÖÊ•šÄÕU²GK|uXÉv´Íýª°ÀòZ…²jñ¢Ê[Ÿ–ß [aä% ÿM÷ùwÑ=5>Ã…î—²±çŽ‘vʹZ¼rèqCPcÞ0eùðpè"l\Ãʳ'HsŸXT·)RÔã= ó°ŽK(gϽu:ùðóª8ÙH«°ö^lXn[\µsQæûÃ?W}û9sþö[Õg‚‡š®Èö¹‡<Õ=}{ûºHwà 2z >ž…ÁMa$¡#Ûzn ®“Áå«Gú “d¾ÌƬ­«Z{g²Y³x³úu¯›šôá‡sìãßîÎ^Õž`¢­×S§…yr-áÇÕ3¼àµšÆœUs&õW¦¥7Íûh¶ê Õ¹Îérú[Ÿj»éå¡EAÒ 3äQ ‚¡×,ª¶¼wšÕvŸ¿>sÓݶ²”WÞG û7:$¤ìŸ³Ãa;z?J0þÀæœÇ»gÆjÉÇånƒ™ä ¦÷í ¢ZSI4\[1=yUVV]¥ï™ñ$™éab3v(%$4W)ež<©àét:aº_Æf†ÿû½Î9˜&‰E£¼b6š{Ø–e7a1ëwª…$}ÿ¼44É®÷œøŠò/Q>¸¹µs·õö¹tÚ =yÕDš&¿*w™ïHT×½0TÒ§¶·Ý7ž6‹ Q$^+ÖÀv¾Î•m=xtrˆÙªúëí+Ì[R«>É,Ö-±y+Wzù Ngþ£K]ñ(Qñ^ý%†ºÇí©N?2Y'ÆÁ5FÛ=~Va‰ØÂÜÖŠíî}è²ÔŠ]Ï~fU >¿¶â“ãÚ;_Z#³¼röÓµöÙG‹¦í¹Øƒé6°ˆÇ+ ‰e(åu¦èÎ~|°üµô2Fp«Ÿçca­IdøÇ†oô[oÃËrÅêdDå¬P+„Ÿ}ýYüñÇÝsZÄÒ4­¡ „¤tMù0»ôü‚’ëj;/Ý^À ¾ÕYï0%oÛýI0CFCkhæ•5{÷®•Y/êwÿæê"gS_M2«WîÒ-1\†Ø˜ug0ky‰¥X┫©ªvUxë"Á¸"O‡¥—Ó?,Xêwìfäf¸süÒ{Ófœ¸Þz¢*ïNXî=b:u{üíÎe†‡šæKŔݿ8ÿæ“À<ô™óF9ZG'‘ ¿&ÅSß™&a"’½Èá×ÞÏê.Äb˜æªKÇÖ9¼ Çøý8£,[2˰EÜ¡çsúŒ¼‘ä;R9úqJG/ NÙ<ÕìY¾o§Ø±Î÷¹kç®;$VüÀ`Ûe=’®TÑ×£:íÉË&Õ&ìYÛEÕ²›ã·5&ÍZ¯¼8¿CuÕ©ÁÛ¡kÚ ®Vh‡ åLW\§Û–?°;qòòc¥ýO¬«”§‡½ˆ+ñ?¼i9î[§D½‰»ÂWµÔ¡ß•†Ñ? •%Väc”÷½“™j´%ûÔÓ7´è…”øjÑõ&ÒÎ ïƒN,‹­}³Qgž‰x‹¬PÑ¥ò¥b>!B-Û‹éÅ“(ÏTÇ;JáJµ{®ÝX¿[î‘ôû¸cGLDE¬…VdÆj6.jˆX8{öc•VùŽ•«ñ#b[Z4¿¥xnNÊŸ½åÕŽ·xŒ][òù¢ÙåÊ›w16½(µw |†Çí)|ÒÐó^Cà¬DGwƒœNúbÝ”8Eõ¨‚þà›¾áF'|鹘öwYéÒ% ŽE­ó7©+ß5õ²@¢åjãét¹¨È½gÝÞ†Œ™åó"ÙßX½ò« 6¥Á{漜ú²Öñ·ž}è’}n¸ÿUO¬˜ŒˆEøiN…¥ TÔHí(KZìí5¹y©ƒÿ3¥UÒj'%éª÷}Ùna\ÛßZE[í[òÝ÷ÕÆ"7ŒÊÊ>5jEsäúƒ5ŽºÌPî)w­È=_OôZ’(~çFè'ïÅå‹S›’ƒçn.4^Zü µä ŸÀð·v "#y“‹‚p£¸—tçÏ;©„æ¬­ÄÆþ»i1–R•·Ïèuží)о!=òõuyÿjFš–ļ¸ŸÓŽ´ž)·ËF"sÍ2þZ± €õ ÓêBk£ÙËuŽ¥Š6šk©l*8–*äDK4ú—K´:ÇR7†›ÀMáfp ¸%Ün ·ƒÛÃàÀbî w»ÂWÃ=€ °'Јô `e¥ob­oü¡·mh¬u‰@§Ãƒå94Ø|4ÅŸ §À©p*I üÌ_Ð 08¨â ­Œ ’àúˆc…ĵ>âÝlký•õ‘Bɱ> uvwrK)'Z|pœì™äy½¹òUöÙ à`¯ïOÊ<æUžÝ8}ëŠuî7fÄIÀTî ë cf[LÚtr§„ã,ÏÄ˽çS†½ünJçVÿ o¦wÞÓÿyL´G¥V๾ý‡2ÿK¯úcz‡–,i¸õæ£\Ï‚Å\ÑF¿ùýù…ù}MDxA~ÿÒ}_ƒßvxLþôÎ8¶bî%lTºÖèR|ÝöyІûKý(ß.ßW ݧBˆýðIk°{O’:ååŸ1ƒ™¥/OÁû~‹:etD6mdá¥{‰9þ~‹öK¸¢=[õo}J=ºàc'îhu.%µÜ6yyuõ— AISU÷eµ{<χo?&.y)¥ßpϫ䋪Š6— tÖÿ´{zîEô£•U½ÃZoï§V Èßlâ’1Á¹7NÍ­W :(ٶ̬'smn˜SôIzóú5ªç7zØ«ž@;P°2»Oî­÷¬ßQï¨þYì³Úù­ÍfªÙ7Nº)"57%[Øf œ¼WgþÕQÔ{þwëŒ9m®¾Z{ ¢¥Õþ­LË«~϶'`–TǾp\Yߢo3/ϲ™Flù¶u¥­Âñ>Êœ,yÃãŸOœÁŒL1‰ï»(Ñ·œj·n°-8^5þ»\,êëÝ¢u¨ t&ã»Ó¤¯Ö yí™òž$“qÏýz›¯HÈö^jŠiò†"’=™áîý qB%¡ºÛS¾;yX|Zqê[Lö×Õb»÷,tH×+±ß-†¨u¸'~ÑDânÌ iRKèK·€…QSmß¿P“˶ Rÿ,8¥Óü L~“Ú=1{©wžÑ‰ùåç*%Åû`Á{àª;î…éÎ+{•¼Ý|r`NFö…ŒŒ—Oßni¡Z7.Aªeì½×,H|ž(Ú±êöqMù³š.³â‡F»÷«d·x'k‰Úßz\±A©ðåYÚÃ3%-ò‹UÐÄ<¡–ðú.m¤«Ô}ëÞoY–X‰i]*îq_æ…†nâu¢Hë^Z´âaã9—ƒ#¿Ü”П¥X\r.άi~sãš'âÆ³ƒ¢±Yé ÒïK„cçnö¯Û®yùõJzùú®ÌWgTɈ—Bsö^Ƚ0¸eæŽ £{CιM?;ÚSƒ¾dÉjìxºàÈñ+nŠO² 7jÝëMb\£…F&h«Êx}ÚŸ~W9ØÞàê´‹t=Ý/Vœp¶N¿}È­¢zî‹‹â‹7yߤ‡¨ì3Uÿ8c9&Fk?ì½Òr×àœ#±û†4-ïùh¤ì·k±½¿ïôæ-·='íêpB’ÏΨüù>?Ú£~_4±½ÇfÞ«…öŽ 'a” K–o§Wcò}¾Ïw÷¤PŠ.è>»øüX°øŸ‹ÃºmªI½ÊËgm˜³äí^ø¢m!Ç%UNM Ú¦RS$p%Óƒ;…›ÕZ5jžmñ[”œ~‡QR¥Uwgûâuù׊×ê_­˜}¦îûúwÕ§%²ÓWβ¸•©­?sªOöü4—éðÄR©dŸö–7/’ÚÉËVE J=~ÙÜûΦùöÍÌ}Ït/ÎPsVµÝm½÷ibéÔÍÚg?W&mzÑMÿhÑøÌ|KÒ¢!Ñ3²ííÉj˜.ªÚ¸¹ÌxhÙ.˜uÒHŠëGª2r5.pyÑ67Ëç›[Äšæ­Û®í]ònºh¡7¶jÆœUJ—k=Vn–J;ÒšøBv^\¿×¬iE­'ä\u#ì- ÒãÕ䞯©Ÿ’?©dï’ÎÅÝgóÏCÇy§X?—øtIoªEÏÞ]Ïó›JìL¢TgïOÔ"Úî›r_#i?ÃØuóz“ÁÛšìg}v»[þà—›1/¦©9V\ì¸åߺØÿÉþÛYØER_ô]§74ÙË¥:×Öm0ðÉgSžgÛ}âýÂà©=•Å•{wxÕWw,±ý¾oÿñÌèÉ̓ªªÎÌ8â,}ÒŽr·Xæ~5ò{Q`á«;»)÷ôèët-ªîîz6ŸþÚ²\A"º¨90ð=nfžf½cÞ̮˰/ï”vîcP?lŒÀ»Yµ1÷qh^–q.#îX•Ùy[ºøL½x¯á¼:iù€œÇÁe3¼“%K Zw—\ï<»e—eqoÌC8VC){[óúùÉÙAó²×Nßê!ÜjpÏ8fŠ±î¹¢Ïjo·\t}ƒX×^Ò¹çqLÀš/»6—;¶*äÅMÑërXìzWq}¯¾óC·ja¹Ì‹I ‡¤µ%2êŠæÝVŸÔ¾TúAÖLG¡|]ŒÑ¡þ·‡—u jÙ À_™vô‹ÒÙ¹bŸD÷UeÛ»itÚÌÞÝQ¢‘m'†ÁâºvÎ7¸íi™idmq gQ¡¾økÍÎܯ÷M뤢 ž.yˆn.V{2;lfûÎ8¹ëç7f¢÷í¹Do$Vxšî‰9—NÙåæéìGyïúú×ïQ”îþn€y ×ožßr*àýá–gyÝJNkÖ¬&"ŽÜtØ[þ@Íì󧛚˚dž˜œµ p[¼òåÓ˜&3XÀ¼´sãµ…-%2³¦ÆF_O-óººïöœAó3XÚòUÎóÅ/ˆßòÒ[Ù6Ĥ^¢!GwfYÁ•K”IS~n Oõ/zä¢+8ƒàÿóë¦Mù©oLµ×nÊŠw‹W´ñʶJÌ–—ëU‹ÙL=êp_î¡‹wSò’ä]ôŸ§Óó]$ï×›wªnÃ*Ôµ+l "ÀCÄ–ÎJKý©èÀYË­ëî¿ð~¿›Y7zƒãÞ‹—+§àv’ïé¡[ȽŸZO­ˆxluÄ´ãƒû¶ÕֆƆa$¿<‹R«Œ$‰&×þ ÎÙ½ú…ãuE›>3 <¤Å¸}°|ÊâërÓ ,—^uò{B3³$â/^К£™1²ÐåÌÇ%ëVhl.ÏŸ"m4å)ej9­¹ÀÚ³dŸuµ~§NbË:ã+ï›õRÓøèM;ê®>¹fÒ:xkۚ׌Ôr¥i-{?Ìè*Qí3|ë¿Ä> ’1T|i$¾úECâtYøáÍ;úÌí¸»®I¬4pøòšé²’óê¬N¾y=Õ~¿ì­ªóúço¶L7Ò‡_y¤·BûÌ0áð›ÙçN¹Éh¼œœ—$×ôâu×,FÑж¾« Qç7]LÍKï}/ýµOpãÊœô°K“ä¶ží[×zÏëZ¢É¢pÉ@­ÃjÒáuG²:Î’—è NEY~GÕtiW­ZvzIYîk¹:E’ÇmViœ×Õd«/⎞W[©.£²j“wÚ‡È0Û=‹ZÝÞ#wá“øMµþ]—»«ŽÙÞXswnééðúŠD­é2–â„ܽjþTýã¶jÂûŒ‹ûT$Íuo©Ð,ê/*Û4·—8#óÜkK_«îÁN÷Ã7bLë~–›”$Iˆáêàqo7˜iç¶Ú„µ’{owMòŠéöÚ,W—ÖÔ¼¯Dã}hûö¢"GKœ)²~#ü\nm»aTÈ»„”es?®Î\Ôp–Úä+Ëß}ÌpÌ||ËecÈí‘¡›WÓ„—ªšö~|¶ÖL|Í —ÏÙŸ·×Nj¶Érˆ¿ÓüõòïŠ?fî§<é£Í*Ï–x©R*å<©|f Ò&^Æm­ðî™·¦m¬jJ±¹RV7°×…?£¦£løŒÍcÊÆuk¶N}Þòcþ<yÞ2u¢GKÈF¥óYiy{,{öHf¨->n-žPxÖÜ·g~ütN:z²`Zî@ìÉ»mss\öAØîýœiYyÞ6`E¬Æ£['3.äTÆe9PîÞr wʽræfÌâã°}5Wöhíê ÆjÍEÛ6è>@Þl>ôºðrd[fl¾VÉ•-rgGMº5}CÐÓ;3ò ›îkjάi8aoس;í¼Ë2ÛêyþóN9‹>Sg¼ç¤ÑÀ–sé_#äÜ,Jg†<[S?ãû$½Mõžn?¢•m&ÞN8 ØÙr'I®oWâ½×+ÊN½œs|m¾[˜öñǶS›^(™?ìË?9Ý6iöÕ=5„ì‡îu>êF•%wÀSuÒ$_$6}J>áFíˆsùrkŲgM+ÊŽh×%L]f¤ezçìËY=†©²Uú§?K>8zñªµû3GOÿ¡…N­ty˜ûN²©»W&sÞÊÝW*Λïñ¿²vªý޵K:® 5Ò­tdûï&·?P݈·½áp~͘˜Ú™FÍùå“òÌFæúã{":f/t<|mÈ$àš£ áiÝÖbc…kë]› <Ü®{s¼"„è”úvx¦ªQiÙºšŠ®—µÕ©_©×ü‰úÑCfú­š÷L%•ŒÄ;N×7æëHÅœH§Ñ ´|Ý'¸ðÝÌûбÃ^.¯¶¤]÷|p½<Ãph×é]%N)ôῈÒKh»û¶ZRÚëV®«¨Ä]*¹³Î-åЉyìwà¿ÎÏ’{yƒÝÖG¾tV2ç¦àvZ¨F̬Ø%Fõ¯? ÝÖS3sƒKƒœrIHM/\$êbÉÚÞæ-*åæK·RéO£ÏU7æÔ•½Ôû3Ÿ.þÑÜþR’ï”Å?ߊÔu(A',bLËg’·Z܆sX BQyí¡ž{ñfaÞ]ÓÜ}øÝÊ~Çee=]ûLàzáÛçÒÏ1·–7H}ÐÚ£µ¥^éìðЩ†A× -Éùm/eœâK’%ɧ·—lM!Õ¤{DWU?Tb´Š\’³NG«ÍàVA»…Z„Å˃S5mtû"ÐG›Üš_§µø*®ò]–hV/wjµñÆ£RüÇ);·´x~·?kXø2åÓz¡ŽÌpi—‹eýÕɱ›$3‰dtáºvŸ§ ny5„ ºgö"B‡~ïq»6º¯£SB@bêõ\ûÁ KÂݭ약{¢¶7œ ·bÇ ÒnØq«˜ä'Åa +âºû–%dß3|AB=î"Íp½´®ìÔ©œó^Nß§¬gï–œ!I°þœ­Ø¥ï,nnëÿñã¾€u¡ªyÛäГ ‹"'﬷(‘EÅKï:ŸB >Ûm¦tK^©{î³ fåçd¯Oó?E¥~õÚ—óœ{1«âܹüâ ú•óƒ\ïÅõ+[·N†Õté¶‘ôêW{wK(K5·ˆ 3Æ—Eº>=z<ÀÓQ~Š—˜¢9aoÁN¼êBë¸ÔÊ»kÞ:d™bZk¯²ÿ5Møœ¸÷Žý×ÎVÆ·F?~4·9¹ã‘Й ôS’*È£5?Yá½,jh†OéDû©z\Èœ»þQâuß6-lŽ­ëp“úí/Œ>d"„öۚܟM–ˆòj]zæ¾â0>ÓòËs?£’.èá&—M*üp¥ðüÎm ï$Ë%åó=?¯¹ûÙÚÌÖï`¶Ð½˜M§]Ñå"÷lnße¡qê ™¢Ú0Ó¯¸¢âÉÚ'ŽoÈÎ)Â6#›$?§ùŸ8ÆÃÑùÍÎ7AGc8Hm˜6Z†Ö½åÄÂá¾Û¤Í}·I{¢Jg¼Î8Qs(ncEn˜1܇+Hµ ÷ƒûáþðx@$5€@†áAp<˜y3ŒØÉ8N>¯ aFlÁD<…D!Æn4ðNáŠâÀÃàáðHx<Š@£p…txŸ…Ðþ+!MÁÒÙà&ììôä²!òí±“¹{=’kt ’~ÖÅ£k«S‚’Àæ(Eõ)7lÞNš|(u×òåËïoŨ*½®w JíYÕÝL‰¾rYœRü2J¾©ôCTï‹ÏF®Röƒ#C?7üŠ]¹;Ig˺Bwú–øG¯‹\§æäÞšþ"ž»Áý“¨zǼ§¢ò±)Ïol¢?¥~¸ÿažÔçÈÌ4)Ø-zÀÐúÍ5>Á»-¬kîÚXYÜ_Ûÿ>ãÚÃ'®çÖ¿ñþ¹ºt°¦ôH¥Ô¡ªCÒ!«-…o¬¨>êM{ƒ}¬þèõÖ§ßãùÐ‹ŽØÈ”ûÆ^îýsŦaSÈ£?÷Áv–– ?F…í óûPÕœZ&ÿnøyY$²pdêC ™ý»í-f؈ˆØYÚF58åw¾t?¯Ø“Ò5Rä›Ǩ¬“˜\©\‰ñY0ËBE~óι&ˆJ!;#öN_ºVÞhWB%ÎG¯ÕŒH_îÛ-Ѳ}}¿ca¶Eé\›©Í="·goèܱgî‘MÃCËS[Wê×W,ñxý´pÑKš{„ÃG©)w$Å6-:{æ“À¼3‘‡l ê$‡—héÔDíyÚ40óþíê¾Íö *šÖûYl<:¼Ed¹žõ¦ùŠgNúûI<´WÈÞW,{kÛêlš ÎS$;7çÆž8}+Ïæ}ÓV×¾úúÍ#ºÿûzñ…Èõöç䥥uÊwu|ÄúÊŬEÝMœé!Ý=uzfCýÖ¬c§èÂ)ÎW—9‘Nººpè2:«nêä~\æ©—|A[ßQGÕÛ«ä{7µG­ —Óˆ¡õV¼›{EQüSÒ©M{Ïç}ŸCz,ëÜ êXá’\=©ÝAZðÝšöÆÙ {½UÏ'8=ìÐnÕ=ê™"¹ìþGÑy?ö*Õíh[~W°ö™®©Ò›åÎ,·Ú8ó°œóÙA7ÔaŸ+ÏÞ¶|œ¯Õ%K•‚ÑZ´tÑõ–G“?Ýø9§ßÎêû«KÙ[_ÇÛîÆ¸f— PÍ*¯w­îîE}tþçµaË»Oôž½5ã 9sÑsì'YsËÓ»­ª¬ÒžþdåtaųÃS¯ç\s¨H߇÷6Ÿ~;^oÀÎ÷ºóZg«o­^» 싿ξzá†ÛüÏ÷÷^{–îõ¸%'çrö¥’Æw­Ÿ?z¾+²ÿÐ;{Ýë¬OÄ9¤ÖÏ¥¥3¼­cН×8®–6—9#xðÓ¡´¦x\‡¸ÚÉâÖ*¦ßT'UØf/¾Û´O+oÕò柕Ÿ‡®yø4HU«u¾~â«ø‡ryRš=B3}gYµ´xU Rͳ«0]ÿQHýì{ÔÞé1 ò¯ÕåŸ'I‹J¬/êÊÕÖŒ¬ûñ Ünc¦Â°KÊð¡Yéa ¥[B3Î¥Šµª™oÌ{8ßê‹Ö‰·ª|Î'[ZµÃ?Ü8ðEàR†ê·þ§Ço×ů¿¤j¾\ñþ¦«ÄêÐÉï‡å?ÛÄÕÎÈ8çÑ(c_×ät>+0ügõܰžà>uóÅ%çòw·O¾°¾d$äpYoî\ñû×v=8%ô^$¼èÚÒˆÛ~\I žÈ q{¥Ý³ºKê×’GÔ>O£í]»U›gmŒ©ìª¬?º"²}r^úº¨]69÷ïZºœÀPõÛë7N2¸QM¨ß™c•³{R“I°.ý‹]8%ÔZ4–z ø *ðACØSü׶cifª¢Žö/f¶‹ÿÔP}Z#üÅÁ®^—æ âcjun¹Zá©‘ÃUEÚ·U¥®.Ùi©&eqoj‡È[ã3—ÓQsŸ•%.=sùtžˆGdÁm¿“„ U²£4üú”Ô> 4ž™yk»ìÛÜ&‡L¸fàŒ‚ÅÉÊÒ/–^îzUüü¹uŽg£ñOù9-ksbÞÚ•?¸µákÛ¼ÀgŒ ûÆ­9hLTz{FwEƒìt­HÝçÛãÛ³B>£=`é–oºvÍk¿Vsßò+_#ØÜ8希ùV G­êR´G VI‰OWŽ,xé·©ÞjfyêöJÑàWǼ×H™GTĶRÖ˜[°Y¨‹tÄnÙ@ýņô“ïÅ—Éü§DŸ6]+fûЧ´ñÍ»{ØÀU÷õ§~wÕãÏ_ÿXWûRSpš“*}J;Fè¤ÚÔ}_î=Ž÷Îp«X'’øò§°›ŠÓa‹¥wÕÎ-œî ²ïH‰Õ"úåÌÔÉyÍRÒzî‘òÎœÕ ´õ(^…oðH_P¨J žµäuonß{ñJӺȢåI÷ë ~:Ô7dŒ\®;³>¿JÂÉvmE­¢»o7îHßB³ÔÇV‡/ÅÙ¬6sT›²«3wÚT3«pÂI¡š÷ir>Bït» rC{h~]Rj"³¬FAWöðníÙ§×øoõ›þMuró©@¥PÙ¯¢mÃ’5«àY_=cÜ ®óq_²Òׯ×âÉÉ3– Þwz-ξš9<Éϼ{`æÞ<Êñ##k¿%z”ZdÎÒº›úÓ5_ï”z€ž|¼~‘†ÇÖKÙëÄ/­öö}6Ywï£W§òÖûðè†ð7¥-ôË)I†3gDWd{„®.l }§è|îœÒYÚ2÷7ñ÷ ¦à ÎôNálÓ=yŸ/øw”È%(çé.±ÊX]¡í’|4ޝÌ8õDµ¤]®Faøêî†þùíÈ÷ÙóßUtÁ v_[ùéÁôÌÀ´g"«í0¥.s•¯º¸oFÊ3¼Ã¤ü–hoù¶&¼Áùe¹S¾+àx «®+çSq!…FÙ’ïv9MGO‹ÝwÜøXqx¯·6}¹IËö§åÝ«œçí^»M[vÁDtèúªù/”®:?tzžqiÚC—¢¼KŸ¹Ç“ºËó§í—¬\!½«¦iò†Éo_­ÝR¦w­Yå$™•&jð~»P¯mn8|T»gËQ÷æM>kT¦$ ÒjmKÞ%О>mtò>5»±ïŒiXƒðmd}½ÃTS¦O¼f§¤°ÉASáæðM”ªÄ/ÓN==ý@ýÞi%ÔäÐÜb°‘ L¾–øð³ÜáçA´Â5¥Ú0»wÛÊ?~ùüe³Úáý÷u¤z÷Ä͘“~¦´ÇýÍ«ÅáËVêªjœª­"/é®È"é ÛW÷>©°àö–BŽ+_F7é#ªz‰+ë&G·œ_&ølF’ç‡ i„m ƒ¾þ»³ÏÜ?Uw“Üô.€¢ÓIcÜ œ?iœLýX?ðÜéÖþzÿ¥_FNè·¶y“T¬Vzòúû½eˆ ™‹‰^©7{j^—–«×I ïß”þ©2K¦2æÇ²ŸO“ ;ºLi®¥b^·,):’t>m²$fxIôu-˜\×5GÃË& óI5ÅÌ^»ÝÓu®`VÖº‡XIÕ$+œIú …‚¤{n§·è(“zÏœÚÔzaN™Ä± «&Åk­‡ýÌ3P[#v> J§…74¥ÝVµ?G¥½™9÷†“¶TBô²üÑw-¯ZÒ¯zÖ/|RQ9×øRãú~²£iù{Ú^÷ó.5’拜0r9©êG”÷,|œe´>aKc¼Ó¬OøsÕ~Æ¢·³Ü¶µß^Þ6°?nvƒ²&yàú1ƒ‘ú®\нÊà·Ü,¬ÎÝ!Û[®Cr;•4[4¯/V¼¹þJ9ÖÛÕÛÄW ÙÏD\®To|ò$àm›Ù,,ìráWïWÍÉ^pßÖ6&8Y¿9áQ[»dÙÓ•ó¢Ë0B¶ä¶·‡ÖÂ}•|dæJ.º%ÕZ¤døòP÷Á¬Ê{7*ë7ÏŸ/òJZÄH],#cÐ(éŸBÃÉE¬ìîÔZyq§þ/O}ÙµÕǯ±K-«jÅo‘·J½ußîÑñ‘̵2SF¾u>"*‰§vU~NšºÐR³ùþÑËV§?úÙ-{ºÑ=T^"[h^N•EÏ7£†i¥r©9Ç‘þ¡ª]ÕÂ"gÒ»«ïµƒ{6p`å¶#-‚·gïÊØã︠¾`ФÔé¹?Ö+ÎÖ½«`|Zý­ñU‘m¥Ò§øY6_x\мúäÚ³g%«p¸Œ5rþ·­Å)QË\Nïwš¾[Ì*‚H~‹<С”ôô¾Ò~ ›vló¢"é*ÿô¢äõsž[‹=z•ž÷pß%ócØ 'µíÎï>XD«Ê)ÚuòŸºóÑ’C÷ WwÄ_Ú9¤ÐõqJxÅ‹bÏœ-úyñM%&…b(§)) §Ù3ŒÎiw tö>šrú0†¼ën˜ÆÁõ,nšÍœt“£ºÀõìä={Ž­" Ôßj¸oÜ)fu©(]¸ÃGQãû—„šÉ¸Ì-;¾LM<ä!vÝBá¥Iè’þ­u½Ÿ]"Š•}ýõñÇ)gMŸ¬–«¡­F0^9{)Iœõl@´Òõ“Ú`ó€P̮燐+÷‰|AÊ£–êÉïêu9²&íU0º‹Ñ¾>ߤÌR(Ôð-ÔÑ*êGFF|ø@WÂÁ#GÊ’ªHÁr`ð<Í\áùŸ­Ï>ú¹(·óŠª¾ªúHǾÒÙn«ôE_o{‘ÿ3tu¬ ýA@\Yó÷]^ Â‹É ½×co¼R® ]z{¹±14úX§­[ݽ•ËÂoí¦~}wAá5òŠPoÛKƒgõ?žj¥V¬ÒÍÜöqåp;±{ㆀF¯‡/ÅZg½YòÌõâbµÊ}í­iÉ-á}O¯š ØgÜum\YŽªÀ•Ö]~"å :[ôpÛ¶ÄMXÅ*ÚáC­Ó,Ï~˜½ªô ¸æ‰³nLRþ9¬®±»Ù;éÜÇÇ(éuZfP[Ô3a+ƒ Å:î­éåßLÞ¬³èºÒ4pö|’¼‚Ÿv‹Þ×ãªñƒùI%¯´#¿)ÅÒw•ܵú©Msv$a°ãgj˜Ü,…6Ý3óˆOËNnîÚ_òäE´Ò¬”Pѧ×áÏcqšgÌÉy§¢}‡ xû„m—”íõ;ŸÞü1Ëe䮙ߴSëæ/Ûe¯=_rÇ)âI¿c•ë–ŸÔ{3/äËÒÅúu :1…B“w¾,Y,U¶uÞ@µÉó]mæí¿âhݘ¿ÿ› ´¹enÝž;›;?V;éH¥nP¶þ=L˸Ð6zÚÃ•Ž¦QWýUw(º˜g=Á¤º$ˮ뎻í­ò,3ÔS?"|±ÚèÕJ¿Ç¦çžKÆ:¬^oR}ÓtyóÖ°õß{7|Ù94 '¾VL¬FGªÖÞòPÎÎðú„ˆ¡á¬â7RS¼÷O%715ÛC®ŠÊ´)t¼ËÍn{kΆA…èeÍs¿ÅE/@,É÷šrÝ«¥'}óG÷÷~\ûòÑ[{V&VÑæÑÉ/bëŸÇš!½Ò£\s¼GŠ&o(7h¾7ýkÍÁœ¢µ±±!¡î‡µWlJ;²tnûêᨡ/B¤7ÛoÏZa1GÝtsI £óƒJΗÖÄ/Q«-ü®×›ùÉ~K/|0jã4bÜ÷¯&GÌYþM?í~”ms™]koЗµ¯|o¯i=÷Î;úâŽgÞ~is+"øAœRû}‰äÕesš“&m¹öòîÝ2O±ý+G.žûÙ¿`ä©ÐóÐ7Â7©3ö¤}¨ˆ¡#ŸÄ8vP¯0;‰ÊÙÝ0¨5ؾX-yud]ä@7e(?ó«Ä×ImW¤jnìî;Z](>xqXLVMÌy(íÝ×3“ʦT,è@%·Ý¸úȈ€‹ »ª2y³ê¬¡‡Ç¬ÜÞ'O•L!•XO2x¹¼ï€KÝÒ¹ EqÝG‡ŽÉeÕù".{Óß &î5+¾—¤·6":ÛûË9þh3 Ánf¿’6Ût·µ}–_]=ØÔ_AÅ Äa>`’ùÞ+ò0¢¯¼›¦-–jL ZDÑNQvÎø¨ ¼Ž¯üJC€ 4LPÀQUý ˆ*F ã d±6f² B„nD05`L"Óu# ä!]à7†Ëà F¼»­ŒA¡‚ˆ JMG ©ŠTWùÑpÁ„p -†TCËUÒ|ýt±&f¬ +ùƒª ‡‡‡‡«…««Qhþp¤ŽŽ‚£Pª†*=’ÌÀE¨’éËäYtD÷Q22] âI O †ÝáH5œÝ;X&¨¯¡ò¡¡D_]´Chkªú4ѪH¤R|ã^çã‹V÷ÓÆihjú²›£r°ÉÕP4¨Èø¥ë@£ø†â 4ys˜9˜‰™Ù> ‡Ž<üæ üø\ e‰AÀѵ…R£˜àC‰VE訢tœ‘êº(]MMeJЇó`Š@¤ÆÐÓ›¿CÊÉAJ¡9&aèO£øùÁX¹ÈK@¡ÔÔ9ÈXXúpéüÓòÂQmm-±à`ФA<]VK“?ÓÔ?­c_ü(ÃÔP ¾x8lD˜Fûâuý pñI¥’ˆx(e h€ … "ƒD0„ÃÌ$"Ø„. Gö7Põe¦ü’7t!CؾLmˆ,µ@tð±ºÆÑœ5¶ÁŸ£žÃPöýýs¹KÀõȇƒÎßycö¸VoX+ŠÀ!#dZ¿‚‰.8R:(ÀE£ A"@ÈhÀèú ÖhPo¼(޾gA#ø‰ `(¤bô†ÖÔTׄùÁDØÙ°t0f ™Cj!Z<0OÅÓÐâƒPM~9k¢µ9xfÐpD½ºîDŒ"zƒÁ± ½º ƒ[’ý(0ó-tK˜§>Z…425ÓA˜h ͦHu-m„Ž ÂLÇe†F¢ ÿÃKÊ«‚£1 cAj¡ÐH‘+LíÍDþ…ü? ÿ¤ÆÑÒÔœ(ÿ”.‡ÿ‰ðsWךÓüoþŸ9ÿ¤þR…²²«Ò)85<þ?—ÿO ‰BAùÿ4åkix€C£ÿ›ÿéßÉÿGÆ“B} 0ÙQµ«ÈŠŒ}ÉtU* €à1¸>9ér€Âx`4Ò£‚@ùÑ`Ѱ âlêäìm¦À:KÜ€ªÀ@ss¢à°àöÖŠ fbçäÀœò©A =|©Ñ "‰R×P„®–¨2 À¼Äá¡…°Xô3ðÓÁ‰^L«td_˲Χ“²*02Ý›’ ÈA‹#ÓÃ%‹äËK†D T~½Ê‘*EªqSÉúѾܰ_W‚T¡T`ÀæLC¦©¨JƒÎðÕÕe ^ß'XÃà\(˜ÀŸ „G ų2Þ¦üqÉ¡$•Aë3uw05vö6uT`œæbllêä¤ï (ù8³¨]5:0O‚r Á 1NN¦Xgo;SV+*`£ŠÜm'¨gÌó~€bUC24#E^R~!ò“‚+¿`è=7^r$ÄŽª!@#âH<…(V!0Ýà)U-eÐ"yÊ4Xe„*‘Fà)ÔdÉ ³Í±Ž q2%´á7†‰)xðý¿Cå/½ß"³£ÀØRc‰˜}M÷VÓ8šÔÜ8ãox™aL€o‡¿1¾ÀúÿšÚô Ì˜`bLK'Œ‘© ³‡lJØRS¡¿ìç3€™ß”’½ Æó7…ôW¹ŸX|ìÄžÔœÃÇ ƒþ7+þW矗 S n4 ÙC4˜b–iHìü¿Enb1¾ a~ÈGp{Š]z¿ß“ÿUÞpÔ—ý±^þe?ö¿^hδP2Ç øÂ˜¡(ºÚDB³+€=õfÀH2PŽÔƒ~ès )+3§ð¿%Y N‰nø­†D¢àÍpDÒ×ÿÔrûO,( SK‰Ló¾õ `šà1›0G#¨#:³z̉ÀUœ‘È‚òÏ›¶¦¶qLÂôõFíhdûÜû8> ØÐø¿øü(þ3¶ãÿ[QŸßÎÿ­¡‰‚ÎÐÎZêèI0¯›Öã?ÿnü‡;ÐŒkKV Ã!‚gΓq$˜‘ÄÌÓ8g„§`¾èžD¸ÃIÜ‘¤±³Æ¸I _"Ц!7ˆDôaãœøÃK"~˜!Â$4˜ª0¾«fºT|f­0:wƆ<2‚鑹çk.ߌs`ú„‚ù=Q0eÒ‹é‹éT v†Ÿ³˜}V P²LWëI$z±\6:Z&ÓÙÂ`4#”FŠÔ昀ñzÈ<¡ìL ¬–yH° `òƪfBy(0i  L"û£¦ ¾þFS4d.TìÇÑúcœ*1›e®VøÛÓó†Ò)NÌà Ø±ôNdàqÀÀS»`œÁ*]6;²œPY=.\Öž’—åÅ5³ÇÚšb±¼È,0/¶“)ÖÕ ciËΆósâlfïbgÂÏ >¾¥­Ã8Ø”kjæâdÊW5 Ì‹ ¬5]L±«yÑÙðqðí0¶¦ã ƒàq°Í0¶–6ãUÏ,‡\ûŽƒ‚y±ííì&è/G/ 5S{g^ ˜ÛÞŒÑÞŒÏZ,møDÂøõ¬ÎøÕy1M€E<ÖÅØÙÒÞŽŸ£hée『§Œ¹Óxªáü¼§x&tœº-,íœÇ«‚gßv–ΖKÓñFG)/­=ÆÄÒÁÂÆã`ÉKÉYÆK‡11Áš›:Û™:»Ùc­0XŒ-¿ãáðÙ ÆÎØÔÆf d@¬g6Æ\ì¬íìݘ*ÜÀë±à{²\>‘B¸]"â<†Ú›LÆkÇÎpXöê‡ÐÀGPÄ14>Ï¡Ñ ´0?`šÃãwiÌf#|)Á8"™£]w{[Œ¥/"…žÙÃÉèÅxë£üÀCŽÆÐøÆ2„É×ìêñ›Œ ›!'ëdêÌ× 4»ñÑ( \(#€«g ~´( ™À…æaogʃæƒó¥ýǰÀñjiÎDˆäB²6]ÍžhÌ…ºµ¿bXð¹Fn¤6òØ ŒÍÃÇ1¸Xdx“éâpâ) æP¸­ o¡G¡O!\!Ž•s{%vÐÃŒíy öá¨Þˆ·C=¶æ¼…ÃÈËÛ_`ëÏÑc„𠉸YóŠ„Êà¨ÝÁ™·ú"Ù2†xW3{^ö¸QlÇC‰à(wç)dDpØŒ³»3O1Ê1Hx q~t_¹bÌœLxEÒCpGiòé¾£ÛÒÉÄŽ·}î°Î|Ö†£rÚÆanƒHÞü‚桼ÓáÍ56y& E;ð ØŸJá0s{^ÀBþxHüX¹½1o'#¸<¯DŽagjÉ;îÈÄ`®úí,mù› ÓÂ8ăuåí#˜³ζ|nÇ­ ¿‚8dhÍ+C<ÓŒMù,‡æhÍSèËí=LÆóDr§ØYó P¨ Ø;ðµÏ9çax½€/‡˜ðêŸNðã0c'' 3^;¦Ñ¸ ˜´øL”L'pjÑÉÔ˜O t.3¶ûü–ÌàBq‹g~>ˆ~š¶t7ãU4Ž ÃÌø$No ,GŒÆAÁq£ðšŽÌÑŒo?¢¸¸ð N¯‰qÿ “¬1 GçÞú†àA÷Ë c7÷æ\ôð,wðÞÀ¶Ó§[`xœ Þ;€£ÜÂÔÉÒÞ„̳táY·àÇàŸÆ×<ÉqTc'0*ÁÂp@!OÔ#ª‹a°_G JÆâøã€ˆ~0èVLc¼†’L¦þË8O¨ûž ¡d0o2ÁªRdÆáõÇ8ÈßÀAýŽú„A'x¨%gç‘hvï¹ïP°ãaH43 f€bã1eÂЬäuåõX…\Bäß2V°l¼^‰^(#Ù=äï#3´Æêi4‡d—Ê‚_ìØÓÎ cþnTŽyÛŒÇxù‚nr¬»†ü̾‘sÜKb™üX+ ùV¬³sò¶0³t75qòPäBÑ(4Ô[$ˆ(T”eŠŒ¯ÏLQ0«PP0«öŦXoG,3® ÿ•àͨTøáäÔ¨ÇáÃ8èìŒíML™´ÜNÞE¤N…Ű#v5LVæô3H Èh91&3n8ŠéäŒqvqšÜ›úÕ îLÍ&ª7” t€0Šëâ`‚q6åÂõ„l¦#T€Ä><˜ªàªfK» [z¬ª1˜¬?ž³1ž³ñ¸xX<¬Éøx¼íbÇo׃Íc\,NûA²q¹œms t:wôI`¬pVmblïbçÌDg(2ëQnTŒÝ¸¨ÀîžÑÎi\D__Þ ±\xRÀ#Ì!ŒÊE "úýý 4ð´w2ÐV0ë¸vÈ=p‹R7ýØRby1Ñ*1= 'ˆÅ¢ ¿±zàvÌ7 Ù.@õkÃz%šÇcð’0h‘üÚ0_žæ§@NìÅ‚­Uphð84h®ÉƒÕï1»kœó±kccV³ÿ¹¡Ïz"b‚9Eë/Ï)š/ö»“ ̯§È$5xÍl„áõ@_¯…9—¶~àá+ã/n¹” áé³ ýQKàCŽD<á×mɳ-Då› þB«4‚?`T¿Ó(ówÚüe~þšwÙwìÆÛN²oÿÆ6r;jÃÞl³‘97Úc°ß 4‚ODÀBé–d†:ŠÿÅŽp!, G eíœA ª! óöÔ­ •Áä`ˆ??æ[KŠ0C`Ç 1úÞïè“BgyÖ_¢3 tíq±¹‘Atþ®"ÑÿTW“6üo™B?þ/s4ËA¦Ê¤ éøvÌ’9 çC é±Þ>¶7±×|<• '2À´Ÿ8*L8ÀŠ=@„þ‰H&(Ðé*Lj˜¼šüèä½Í4ÖgC¥'UPd1„C$>ŽÁ|W”@ö…^2†¡l¥c—PÙhð‰§z„"‡!3{?®P9ÞÖÕe:&Ödö‚ä*Ü+¨É¥(æ=ªõñ:Ç"ë0ÖÁ1c”c ~(8å=~!ói-ïß—ûÛ}gNż"ã`ð ,6 ÒŸàÁ‰Yö§¹#øSš¡04ožÇ]ز{Þ…O¼lŸû7ôù[qŽ`üMQŒu 1z#}ÇÆâtÁOoöX‰€YC ¬ 8K£cmB‘ü~ <Õ§‘‰… "Ž ¼àö¿%X0½Çÿ ‰/lþ 3ã+W²ÞÿŠ:ÑÂþ-I1p4`þàúo‹ŠH™ÀI2#.‚Ñ—GĬ{ÿØ@Ÿ$ôþ;Þ‹YÁh·˜—ÖnÀüÿ»Aòͯô±vB*/mŒˆÏ÷#Yâ³=ÔDSIãïL H>ƒAr÷ˆQ|Ä(þ5ÂØüËŒ1x_ÈŠ7LXÊ ENPÆŒCLPÈŠIü‰yßžúŸ›å˜Õë9… Î@À'o’Ÿ   m©÷_™ê~Ý _ `[ )z³¦ºqø˜™Ø:ÆÐGÍc ô¦G;0ìóoù}0/ ¥'çŽbÀ_ñƒ Œá2ãÞ|˜S¿?{@!$ïßš„ÇV2\ÌþrT³0G•ƺæqc5ótù—uâŽÖ> ™°~náý²z6êhílÀoû²¿=q2Ÿ|ÿS{6þÑ—©C(…èA€øè ¬dSÀHö­Ë´¡2èBAB…1sÛîÝýS}x‡£Bh°¡ <5ÚŽ/9Žb|˜<ò²‡ãe „F5F8ŽP£P<ÉÑ3W¿&à‡5Rñ”P2x#Ÿß/Ö6TĦÍýöç¨À'sÿ,¯ï³ %ƒOûƒOèsl~ åF» øü1 Œ>Âgˆ!,wÉÆU5ó˜ˆjl¼„Œ•q?_1è3Øe0ˆ>6IxF€³’ÕD¸ÞЇù®Õ¬VÃSà ð½ÑÀ.R[Æû¹Ao":´'Í"D! d$ø©¢¼¿ìÏß<ðƒâŸÚÚÌO€Mv6kæ£Æ82™@b&µ¶LÌœÀ° ÐF‘à½KWV‚…ìˆeN£çmøàÁ >‘ÐC1xfmÞ*0Yð@KHk`šh5YÆÌÛ°¨6cÀúÀÝ· LŽY#sK£€ÚáÊîŒu1U`⨶͊3NtÆ ‘ù’:ª³ ðµUEȸ7˜/›Æá⨛Í2û~õ†?)Pô?/Pôÿ…Eÿ3"o7ý [á騨VÌRüÆ@Šÿ5XHºè¿-]4¿tÑŠÿµ^¦C0Ö ì§œ |÷`2¦þà?:ljA$‘`d0Ïà`,aƒœÞ 08‡Cçtª{ 3#.÷Ãïz¼ÁÕÌØyS²ÐÂ,æôär €#}ÄØ£’ãÔÅáË|(þ¡tµ`(RÎ_·ÌGY§Œ§K@ûL^~—_tŠãåXƒñŸÔd±Áy*×(%çiT,*ŒŽ*áÀc$¶`®NC±a3ø·çãq»úOŒ<èyyîa6úlë¨jarr° ±8R +Np†Ç¯4ÏYd¿3¤ÿœÏäÖ6Ç£@ººd*…ÎC Yšš‘ì«À!uÅ¿«zô?©zô?§{¥þz°ü- ¡ÿ@E½ÌÏ~ì±)09+ù_¢]K‡¿1´‘(-5ðò~‘ýûúýsãï×y&T,LJÑò£b’¶¾D°K4ðô‚¶ŒÀÑB¯ àᇬGÅ9æó¿ Ñ¿>buu‘ÿÆXÇMÿ9ßÿüÐfÚ Øñ´F›tÿðƒÏ6þÚˆÏ2ÃI‘ÿäˆWþ®§YG#Œce|üá¶µþ?ì}iCGÒðûÕú™µ$" ¾–w±‡'XÀ‰³Æ+Òæ±4£h$Žux~û[GŸ3£ƒÃޓŻA3=ÝÕWuuuuAH§š%ø­ò ø»Óav‹[;èS¾¹½»»÷j­ñSiê¹ä{'”Gòfù8¢/¹Òf?¹Ü-›“I}ámqêéS#ÉSKz~/ö‡E9Ï‹îT— q±÷µ'8l¯©ˆv£¨(pdzú_€MO¿mt2rŒ™ˆ®+Â%ì`¡ïó²ÿ¿šJ_&a„"Òc¤»ãÑå+ÓjwÜð÷úóõGNT0€àŸsÐ0´àŒ˜¥°Vº ú}é¤@‰Yã·µsp¸¶s¸µv¸Ñ¤±l¬lÀ€âÂùjÌ¸Ž½YYÁË""$?£©a\Ìw06å1¨¤¿Ç"ÓDq¾7h®ñ4ñK6'Ó·¤8þ2 GÇZ/½ˆËœ^² ÿ«É®fìýF¯?¼¼Ñ|å.Ã&rG]Þ9¸IwÝË·çaü'™í7ïîºë½‹?I×ßÞu߇Ã?Içv×îºóqôg!qû?ߤóÍ çõ«Ía«_=Áðc†apö'†µ_ï¼ðò›ï<°f$ ;‘:¨÷qgÊ8j}¢s`êgûh©Òìã¥J“A®åœŸÂf‡ÀÜIF,•A:C‰F\|²œ†%ù@½þŸÃâÑ TYS¨µÁÎÍ—¬~$;‘É}ÑTìl¡°å§·{?îþî&a,»­Æ†N}»¾— HÿWPã1úÌG1œcè0ÚòìQçy•þ·òdYÔ_*oE $Ó̳`'+ã#r`ƒ ü°Ý½6*îD{èEåÛGÈÅ{|üCðqñ«¢ãÛЋùHú'AËÇ%–Ù™†£·Ü­µµ{lý°õñ×ÄÖ§¯¢áéµqôé éÓ–>MgÉÚÏ¡ºVÿ²èf´%Ѯʔt õñò°±÷ûµqtgwóŸë;4}¿´¸X[yüüé"ÿYyÿ>|å=ÿ鎠•{Ìýb˜+’v9Ú"îû­ Às ›Åc >ilUï±wFŽn´îÏP_“ pûí›ý­–úVH®¥^!9|ÙAÆoóôõô¦¸|O‰ï«×´Î"½[¼&–ìÇv~"‹?Ú§ïJ-«ªŽO¶M–mÕâRêy6«ªÙŒ©—éïã«Wäýb¼ÃÅØñŸ/®Ô—è¿•åÅÇ×_‰)_ŸŠ†›Ñ(lÿ‰„,(a%fÈZàóþfãɳåg"ö.cQûa©ºX…ÿÐOô¨Ûa4DÓËQ ÅØ€pç²:ƒÖ@õK ž÷bšk-= ×\ºÜµ(PÑåÏs¸Ç}³q¬ÁƱñÏõ¯¹lÛ¯ÛÝ >½1QþCY#À?â,ÛÇÏWV–—D ÀKúý‘ŽÍÞ ÿ`´£Ö½’euoe[¬/¶ñïñó{Þê/°;hœ¹9•ñUÙ¨3¯´m…Þ?~ÁŠïÇíõÃüWÆñ麺3#ú(ýo‘Ÿ˜Oäéå8ž ÜÍTþo£`àe÷B4(Y(¦¥âß<ËaΪ,òjm}s{íõ”˜ bÓþºÒu@ÂÿÎàÕ‹õuì'Ĭ?Ù’˜uÐ8ü÷êôÆ|]”úËßÛü0+I´0ÏŸÛœÏO–MÅÅ]÷¬¥íYþº9Ájç¿›qk#4}˜A¿[XI9BoéM«øý2W+p(åÿ®”çýã`Øó€ï1Î`°€5òT¾,=›Ö"É¢ì«|ífq Çy' 3óDã…'ì½§ú½­Ýhtv6¾ÜèXˆe0b;8xƒK ‡½6(7Hò×"ô9¢`1…± ±¡¾U‡­¾ZîO–u*E.ÒÆÙºæÛƒŸ © ì/eØÝ;Ä;úæÞîþ¡øÝ¤?8‰Sãаjañ‘ìL6¤¬ª*%&@¨ÌÏ£w‡+ãnƼ.¾Ì²¸›UqýEñK4°JïD÷¹kH´a­ ¢Ë¢A OëhCù—p¿þmûÿ•NÀ¿´ÿ÷ÇOÑÿï³gµ¥ZíñÒSòÿ[«ÝûÿýÿŒÃ[¥{]òxkÒ†ín@^pÇzÑE‚Œx‚N` ž´ˆ²æñùìý‡tTúúRœ „&fB*O™?\épN-عü¾ Ðøøý÷Êa xV´zý"‚@6+gù:òZ4A‰±Álw ‰0†]Ö—!z9b09ƒËØ×Ñ4qƒ¬pêØ²ÕŒ ÑW»Ú§½ahÐ%§rÆ ‹å%YDÆ£À1ÒùÑk UØDWÉ„hè®c’¾;:»+F–¥øÈ@/Ûp8¢méCù—­å%õËîþº8ÿÙÄÀìû\5WÅ›µŸ6ðcq©,†ÿr°¶¾v¸&Îco]‚¤ƒ¡7ŽúÅ ØædN(ý‡ ÑŠP¶x°õzoko£,ࡹõz‡r°Óf˵ãþÛæÚö6ñ³°Öèú^Õ;dØA ·¢ÿ*úoÅVørô¿¶øtiý¿?y\[|òì ùº|ÿãëÒ—¬›d+øC>go ìËÌÞ-˜À¿œÉUzÖiÑíÍžßï^îþĤU‡ýOÄ3ÃO5†SÂoA»¸xQ[Z~\¢w"¬È¯("–èÖ§©¢<CÿÜš\ÌKïëÈbçµS€’U”ã4©‚¯6Y¨†×¿ô'ß»¨Uí7´$-%­N ú‡ƒ¢Â%N½‹&ö»œ½ Û%-}]˜c%q e¢Ä e.·vp°±ïñàSB— ²í¯Ø»¨¼T^yß|8&øƒÈ‚áåänbˆQÌúñ-[J7mibÓ–²Û¶Äm[r—é˜2a›¬Ó9Ù¥q¥±ºš¾0Þx]`z~»49$3¸BP+aù1[•Àª‘éÏ!Ô²¦†=0/ÖÖàO +‡ ù°¿ž3jxæÂ4•ë_òwm]>4ðaЪÃ9o0ˆ9Gƒ¢ÆíG=¦ml^2b?‘eÑÊ2‚Ó3Žúä\ív€Uy] ¾(* Š=+‹‚_€?øÇÃ?=üÓÇ?ÝU™—áµ…i‘Ìg*w›±ÉÍ@Ïbâͻ̾Rx±µ£¶Æý®}•†íïSÛ¦7,¡:#µ]!·3Ës¶®ž OE¥"†Q„ºeƒ¡Ê½„mºº9ÑÂËKøÝ»-Õr×)¯Ä©K‘Ð;þkìS«ÃuÎ27, Û‰ôº®ÊQ°R¶€¿u ËÄÎu÷³›I…Kjzn4âæÜ°¾u°öj{c=çtpÈs1±ûÓë_WÿW»Û´}ìØ™SRsƒ,qõv€¿ „ºóáâqúe…'"FBÔ‘ÈU•C¸»¾[l.ã¶×õK+2tRÐC ê$Õx}írÜWmR_3ÚêR“ƒÁ™MN¼ãV€"+d¾‚”¥,ž×0PfÆÙ'é¶Œè”E?s¯o@C5 4“4®Î™Ð•'ì ’¿;êñá`¶<õôi¤ÕœÙCîaC›*¶xm•^Ø} $KÒç„ç˜4PŒûŸôùš€Äå¯ ”¡H„øýw‘HFí¬„× ÜABSàcx$OÏö2MtëZ‡ØVõNøŒªÌÈtdŠ‹ëâ‰+,FÉù6U(`GÍ!Ò^‚í[ÿ,@Ô.ßèÖtùßí/€¦ÈÿžÔSò¿¥Åûøÿò¿ý("e«¯C5«ŠVzã©Ü¹ª"lŸÓ`øûäêFº±³\êGžÉ‡]R |¿ôAéA´¢Qˆ¥–fd¢¼i„kƸòÅš*S£€äQcJéx*œ>{”ŒHYùÏ…¬ÀKÕåêãê“t`‹±á«&íÚ[p0ÀĹøw/^»3ñZcQ­üxîƒöŠèG³šBºŠ¶£žø?ˆìÖÝ>!…Sò{'ÙB*’¬­ÝD°¦›”Yø‹Æ§cF–¢*)éØ=ÁøfÆFÜòú~ûžV| Qü%ç>:Â¿Çø§Z`ÉöµÝ·¦_¤9ßyùï¤.’~ˆS'¾ådšƒy¥ÍÆ!ìJ}È6ô072¸h¾ì_ôaóÛ¬ê‰H„2­A+ŽŒ“VŽÍdz¿ø!™ÑÊQ›šc)•ãØÍ°<ÄãTŽª›áI*CËÍðôÃÍ .ü^·õú(ýžô~Ò‹tì¼`ýù²··'ÎãÜ"(59Q§CQ{zOŒÿHbœ¡‹1#íÌï¡¶¼%iüòìß&4ÿòžÝÓ"›1ÉYl¹$géžäÜ“œ/Cr–îiÎSáxáGK>Õõ†,ú2²¨?ˆÖÝS¡{*”I…îMîþëíÿª§ww5:þþwéimñiâþwéÙãåûû߯ñ–se¾"zQÛ_­ï¿Ç7Tp Qш&±#?æBBúNZÂ(н!NÜCE[ò ] Ó¾Š[q'èú¤Ä±¾s (+ê ò*á…ÃØHtÇ$ª!»´…“ôÍõ šÞ-Ð_Y„Ô6\ûy£ÙØÝÙÜzÝÒÙ¡ÆNpB XIò ît»H…Þ'M{k 2t¿XŸõˆ© ×¶v6öµ ¤¹7ïŒÂó%ömz7ˆ‡ö{Ïë;¯~/\:ÆšþеÝÄýÄN ƒ.ðH³]Ùç-Àñr,"w¹šË¸Ð÷/p>Åq“',WU"Ùˆ*;ÈUÂi»UWËŸGƒO" ©•èë$ähûqkô¡¡qYô»£°ßôGJ„'Á™ ‚JÔ©l®ÇÀ|85¶ÕÜY´ƒô,ÿ »=mÎ Ì Þªýá èÓËbé¥8ñ‡MíÙ;íxjilE+‰˜Ž-á²°å:€-yR@& ǹ\ GôSo(ü0á\uù  ÐC»ÿÈ?¦t‹ÖíFç4^Œ/”ÐòØ©{×ìx0Æíj޹=ëÔ!V¤ÓWÛBô§[~Y[%ŠSb¹'†‡&@¶žI@#¹ÄöÖ«æÖÎÖ!ZlÎÆ=²Ú±²âõ¨£7*Š Ñ çF³¥Ž ÿ—56N¯[Æà4KKíŠïü!!yXž î™@W¼¢HúÀ—äa§$:ƒ¨GùFÀãìJ]áb¥ëuQ\ðpú" * ˆÑ´P\í8X¿PX¹«ÒÍÁÂvsŠ[‹e7! <†f§*¤J(uDù&Œ=ó©ŠBp]1? Ô½ÄÇy‰©š¬Lh´ÎsXä2ĦO( YLfüÞgpT\19‰&.¶Ó1P5µí¢Î7ýÁîÆM+‘ Ø^0 “Ÿ†­¾t¾Á¾ŠþÏ*¥Í¨=ôÄ~ÆÛ2H0rÊ/Ò€ýU਽ÙmüÔ|³qøãîúRqWy²(Óhj§yzå< LÑXW¨ý–Uj´PBFÎô‰¥¶[ë0~µ`–!쟃óA0ú!ƒÒÔâÌëŽ|Ã1XíVû31 Ã »±¶Œù7P“ñèa•øŽ„¡ÕyçMY§*J­¼TFÒ€þ¹µN³ý[€ÐøƒÕÂϪÆtÔÌÀ{˜¯$63%%jÉØÚî*NÂfÀ›‡EG­^M® àåÏPÖŒ+'YEr½lrs;m=›$¶ÛÄr-КFR9jæªVÐ(“#ù¡¹ªÀH$Og•š<8gb7Qb¦lg9åº2†ny'þ¼`oŽäçžÐÔf —,'¨,fAóÕœÛáæªÛ+ýß;mû«|s'ª aòšÙÚØŒ¨ bÏô·çR0›,I2½ ´|Ff)£TQ‹­y\!#¶Xêðx­~9kkœgV›÷!kŸ3¤.YWiõzû"q*Üù›ïh´|‹˜·#? Øõ^¿‹¾ó¼ãh£’hˆ:Wx%ŽÐœˆ‚ö€|™¨bÕ*gã¿@E€øMØ'_¸Å^Š$ X'ÆRˆ‰‹^²í âÕ(è¶åË8 w‡^ì“ä„¡%ÁðÄ0Âà 7¢0"ðÃRõ $>á1,àZ”8œ„óH~i®NÞÑS¸Ÿæ#3ÐîZü$sß 8мpJÆ­#ÍSfá{ün*ÆÆÀI‰}˜Á¶ãÒP|¾JtõíúÞë-áRªkn³õ® XÓý)}9l|í¾¸5ÎÚtÏ–ÙÀñbØ<’©!jǃ„RIµ¶¯5·vwš{KE›Û(S&ÎÃw~Ìf›ÔÊK‡;i³û±« x.,ÅÜŒÆlÎHÀá¸À˜Õ ù!Ì€°2F¦åÁêïÂp胾©°AßÊ-§]¥r¾iù©¥Ì®WN¤6ß/Î^¿ôÇݽ­æä»Òµýlôn èt³X©Ñ›ÏŽ[i o^=$oM‰«HmùÎÁT^‹ê½_WÍ1â¤oU}P1-&BÛU&‰”ñ½í#Ø€ý‡Ù_bÅÉ>Úo+ŽäõTó¼¹û±DlòKÒ>žˆfKú€…I©®3äÒáìgéFàÔ§ˆÒP—<õb8(ø!ø„r`ÁŒ9–{ÊÆEÖs0„Å{úY€ βIxÑ=èéˆL8²Ò5¶fÔ‚žûº½AáÆØlŠºîՔѪ§jkjcŸo>æ<·öI#~à{ƒÖé·7æÙÊA7H»“·JåK~â˜&üëk£ª¨FH&ª7g·ã©‘¶Ü´E€j:$.Þ©1‘çÝJµ¦ñŠæ´‰Àôº‹å™í]ZŠ¶Û´[š!);ã‘u ÌÒåaÂ-óˆF·®%nÞ;uäΧª¶dH€[Ô'dE8åeù,gZNξóïŸù|E‚v!’Cç8vÇ—önBnêž>LêµÌœ…NŸÌäÌë&§ÅUº3J‚r«+ö¸W½“;é‡gÁ ‘*Š3˜g²Ï"q§êâFxö3‰?¾¨T³ìã‚„¼+5´H¸OQA`yÁ;Á”´žKDƒà$@M—:* @óŠzÁ°k•Á8“Và7ÕB¨Œ˜®žKhç ^a™û^5s-­»j»ÒVušVdƒÓ0Iµl_Ö@›3 ¸N¬ÇÐÍÏÓ®š–ÜbuSù•bMRÑGêÝÖláè¢"/ÊZÂèÝ 4ñh0 C’:uGU_°Ø B<éÍÖo#°@ÊÉÈSJW[­œ#kÒJ°©Ð†Sz)~†ŸÃÌ›áj.K2eDV?O¤/_Òv&¹èí€äÓŒ× ÕV\’ñ%l¸=Å32Àh Æ™’ÛЧú|öú¿,P©SÙ Š2„Ò˜ …ÒɲŠtùA–I ²7Höœ èB³C+ÖªdûU–`Úÿ¦kE×DaÖ¼5ž–úXF0ÐI.2OL[¬v.™KªÛ°S~_ÍÒäj¨’Å'Ó±!ž€ 59¢7˜b¤9¾è“ÕYÕêÌÃBU ô*1ÿ2ûD˜}Iñìz8Lj' &“þ×TtNæúpºVµu8ÖZ­f±µ:_¾ø:P¬¦-ÚéVÃW¯³p$ZÜvù¤°ë‹h†ök-¤ÆÁÏ™ËhüxᶬGK¯ûÒµ¨UÈÅåþsYîwG'§·´ôäi•Zt;0²SšÉ¸)˜•¥•å•Ç+Oò“‘éFl.Ü\ +‹OŸ®,>[|¾²øCm‘gi¥¶\4zR{šb—®IÌg¬æ¶è*•ÃéXO—:ÄbÇÙQ/÷o4f¢,f5a[ªq´Öïv>Wž<.¿Ÿ±uVž/ªy]y’FÒ™Fü†­§®±>LEÏ%‡N>!½N•žb­cPui\åx$ñhpœù¢=Be O:_ɺâžîÄ-”IÎ’eiSºf+—, ûš%æ[Ï*D7ÇvüÀqè‰#ࣉEà€ðÓÄØYF³_ŒÖ)ŠW]/Tê“ñu¶ôDk¦áh…~"R ¤LC¥1ômjkd_Ëj-”éµútÌ–uS°ÿràNæ*YÛäg¾UþlØ[TC9óºðv"RdLJêð ZÑRœœNY‰I=ï‚òÂo²¸L’¥kÅçEhŵÁTÝ»€âõi(ÎÍPÅg‘ 46_‡á671Ôò[˜%ßV^rƒSñ õÇÒéf5AíK{Kw’õ®4i8A#±xx|I  žŠœŒ^x0Z€äÜËŽ>´ÀhrÉA=GmŒ_@[_u ýM «‹6µE‘›·Š#©¾ùœ%!Y†'c\¨m…@S†Ñž³Ê‚OPø‡&ÏV“|ìcÔéøƒ÷À;pÛÅ´á(põ‹±•ʆFÛQG–*%ÉÅTÚ±HUî±]}ó‰ì¹§¨ò «X)1výPcsóejAÛUd ö‡†¾ã?õá?V­§YZ„,}ñ½P¹Œ—)Ùþ~É2§á+w¯5‘† ›FœUjÜÏäÚ’¼RJ)Àbêm1!<ÆòŽÜñÓ …³N›œ™¹LV`kZ³xtôYæqŠ{ 5Ëhwñ'é|33}8ÀÊ€ëÑð ͽDêŸvò-Ú·¿ñOñÏý_…øçÊç‚Û½‚ØÚkèÎîÓàÞ®d>j6j‹ËOH›ÜKOžPNÑ zÁM#é*«šèºéÀ«©pd‹ŽLÔž¹áÈT ñ}]ä;~»uìýðüÙÓ'——j‹y¥¨×Ÿûo÷§á†ªËèë]7R—jýÒØ)O]MïKÆYg2–ç¿|7ž.Wh¿×óï ôÐŒðŽýnP:ô5ïU=lÍ“§Ïžÿp¬ŸZú©­Ÿ|ýÔÑO'ú© N#î¨_ÐîÅÿxÚ« ýA´aÕÞM·4j| ܘ&(Û’ØðrOxPu¤»RÇ`(qЈˆÅ “YƒaKå„…}®H„¶¤ä*ÁŒ;åþóíÆþ¯eÙ„ª´zá~Úè½AÁ-vèä3Î%„±©`ï×c7rm4ï‡-Ü?h˜ŒÆµ‹nôOްAÖC¶ÏV؈d…âfž\±~”lÐ$¹Ó •Ö$Õ“GšÔ&l¨,¤È¾45ª µ[8Óúkþ…>“_ê€<Æh­q¥G++³õ™ÙâÚiÀ¹{ã7õÊ kÒÍð’ uƒ…ѱp» \wàÏbBãýæíÊi’j|vƒ›]Ê cgê ÛÆ%ã Ȫ<]éÒ¤JknMd—ˆôc¨b¹Èpp,›ÌnÈ25DúÖ^ZžÂWe à”ìŒz)ÙÓÌ^¦éÓÙ'cðz,¨gcA-¥Æm7”›!Š1™îñ8…À×ÀÇ7@¯:Øø!|œB „NCÏ>†O¾ÒÖ$¸ÎX>¹áXWÇ?šOS£)y égF$ùúÓØq}z­q½áN÷ñé¤!«²L8Ë3-Þ©»†ÃÂLØ-²œÎ“+ø«Õ ›zb7šYÍ,Í&‚š³÷'ßfrê.ykmÌâç×bUgm#îWcê>zƒ¡8ö/£°M‘S2,y'MÊ݈ï|ô¶)€êy:鮌Ùô=¹.'àÚÍaÉeÓ¯7ìøØÞËÞܶÝÇnCS¯wÝî·»qëo¹-M½Þ Ó¶,ª?nÅŒaé<ÕAŽuqËn.»ˆ”~½ãùY>vš¿ö%Öʲ‹dé×[NÝ™× Ú°Y÷Åq0D?ñ’»ÔqD&ò”cö"üû|ñNúÿØÌ'ÜçÇÎ<¾%•dV:Šh‹\OWX‰éR—&°i‰‡ ()(.ÖJÕilããiŒKa‡¯†–ðÏ2þyŒžàŸ§øçþyŽ~БiôyÑe7ï+û •Ýr?qP9ùv#ÄF³w¨ÞR'mÅO[ÛO§®í[oHOS«ú©Óù§w·#u£¨íë3w*›0å·íâ3§CÉ·;Þ‰žc72Nª3ÏËvˆ®é‡WwUÜÙ˜P·©¤‰Œ§Êîö‡ûû¨-”èò×»;ߢá?gRcqg½:£KYzÿsÍä¥Ïð³?ˆ¡%å‚m-ŽG=¼?ùmòÁ‰"ž3ÎåÔak.Ñòýycÿ]Pî'ˆ‰•\ÂÓAäÕzöá/zjTÎGò!K„$+. “gLoaÜè&iæ‘?µPͬ3ê ÉÅœü”^ÄšC½ÒÊ^èbšý¸³³Í®ß¾äÆÚNcc{{c= |~ £óÙ›úÃ¥Ò4)!c×8aLÒÁÔæ­¥‚óÖmXB.x]²/·2Ù‘ØH­ÜÇ:ûÚùù’¼Z•Šo)±õq+¡Ÿ'ob“B\ &0DPh yägOn'¯TaIa2¨ŽEMêžó~º´îx³of»1-¬}•A»qóÁæ¥b-ãxÜDýÕñöq:'úP1únébŠÿ‡§‹µZ"þããg‹Ïîý?|ãþÚ¤½Ô‘ÿò<ì&nì=X •.:„b¿P$¦ÂëïÄ×¾ùb6ŒœC@]ÿ ÛHµZÍ=‘Ó¿½µÆOk¯7È“M2íÕÛ×û{»û‡É@X¶v^'S×ö ´*q$ÎÑ„'T4׎žVˆ‡„$™ºO/{ÇäŽzC s\MÄÀD;‘QßBvw{ƒ0ã+‰Ãýa”õ4XÒÉÒšûå8†­^?îrmoÐ툗/¼Aß[Àêq¥'Ÿ«»óñ¡œ66x÷þõÍ«Ýíæ[ë8/¯íÔo}ÚF;Ia©bÙ(K—Ç® mÿ‹AØ ³uø7hYE“­Â-/5‡6ÌŠýìÊÑ¥ï܈ôÄ ~j*ò?ÖYÞã’^œÖNeÒ†ÅÚX/‘yyüT,d´8™}QeÏʼ¤2{fà%•o1ÑXÙÖ(‘Ê[s°¨°ð||íVN~Y¨=½ö ¹ ùSÎ=~±?…â++y\ìOÍbš:]Í ©vW PR°‚ÚÁw׺ÚÒ À\étî`§³b옦€F©èµÁ.,-O‡¼|­6ãB˜ rqvp‹_bT«KwŠPÓÿdWÇ¡ŸŸ‹F1„EGú°ÏJ1‹k?\©MÞ^óùŒ½uõz ÄÀX¼¸ wÑ”‹Å;iÊ»_ÿõ¯_ï¢9èyä¶p¾·‘Ï¢·kÚÒ“gwkQnw‚‹wjéŽ!¡™úÂZ¨-ݸ•'w×0hÖâ]B»Ãñ_¸5¬äÎ5Ãfs€‹Kw oéònáÝ1¸»€v0V.îÊvÿk‚"HOîfÊpÆÚ šÊ­¬À±ªvg€gøó5ëúj•ÍÊ©Ï0Õ·b*¿L]_uÎð€6®>´úØ]ß-¶—qÛëú% ‰çXqnŶ"ÿ€Ãóˆãa‹˜Ý'aÜQ©U¯{™½Ñ[þ%뜱âks8&¹LáFñ‹Ö¾ô$oö%@Àÿù"`°©AþRp'”ô/X¤íaD€ŒA˜£sYgÙ‰M;¸kQʺÆ1‘)©wÂÍd¡ôêMZä-/¶Û×i‘,ò¥Z´¶øj±±¸þ5Z4ÃA|NÐÓyþÙºV«---/_göe‰ÅYzFèz::ý»ñ6ˆ¢^Y„üP½^×ÇôEEÔn±êÒ‹íú3ÓÒÀX¼ ŒÄº ËnR~,fÝhlñBd,$u¹•°y4'áQ†±dvÁ ”¹YÙ¤@{"_4^x6y g–MPÑÚø~# FýẎlZGZ‘‘ÕK’FÈX¡äŠNä‹î²±}`91¢'zÞà“?`0œ„ħöüÆ–<ö;îW…Øôñ/)ÞhK+ì‘ €ïµN« OÞ¤E!9VÓ_J=Ü$[E‰=É <˜x­Î±¹iü9†¯5ynJm™¢WÇf[*Í?w†`;£d÷Æ—°¶»Žt‰”»°štV\žþý“’ë3l2thR”Rž„Ç4=•u;{\ZY³†°å@½Ò¶Œñ'¶÷:Ž…æ Ú€ÃÜ ‚Q@¥ÙYWç~|­ÜOœÜ㑃s?½Vîg“Œ_`dT|#DŠæ~ÿc¬:ZP#“N˜b^Y[Z½'Ë F’]4ãÿ £QP„:£3*C6­U?œqV‰JŒ¼vö.eï&2wË‚<Ž•¨È˜ÁØ÷½ö60=<:1†ô%õê¶.jhGá»_ÿe'XOGáQÈÔvsk{CÌwèD}?,"´ª = œÔ€sÊá?uÈ%A]<6~+ ÷j~QˆÌ9C¬‹æzÖDÈb­NÈ‹×#U>C‘¼í§]½Nt<“zÌx}…Ê`®ÆÕrÍÐRתWoZXZ´ÿÇ¢†-àoSr'zÙn™·ÆÊÅ$Vj½ÿ/0”÷ˆ}Äþ"]²q)³Þp\òc¯ý!ú$÷Ãa¯ÑµyŒØ¨=O ËrP ®Ù6 y¡‚ tøàºE?Âû’0àCT‡ŽÏAâñê³ñjТ'Õg“š½²R£ðçý³§di‡Ç;å!óøàÚÙ¤–±¸Ìµ¼vp°±ïžOäeXÄl®½ÙÚþU! Æ®“ !tI áç’4 :Â6OÿT4Ù˜Ñpú˜°†i1”]³×#ñ465þYR¼ôW#ˆãÎÃuñÜ= »x'D£ë{ì-€HÅØ ™šnùFiÚ* @»iufHIµ¥!‹Ñ ¶Ý4OZ;Üj !Òá©ûò†ß#ëb¡ìîT øÎ($×!1ìé0I–‘PˆÓ ušcÁ®ˆÂî%Ês¡mÔ$3k%çæÇ>|e§ÑÀoWÅZ,⃂ . Þ089ÈV4ê#ßQݺy²"@üÁÝšc#µý!NEÕ¶ cÎU Ç\DưgÞ¶ò™‡ñ#“%'Kì¤ynžµŽJãä…YÅ”¢ÒMÊ*1ž•ng/;©àÄ~^\^ܬƼ ÓdÛYÁ7ôDÌg„cb<”¡I¬Ùgó.ô›ÞlG=/‹v´/gêËÊØuu¢m¶N°N’÷"†äIòŸ’ m„gp‰,ûš~xVÌÿ¸ ‹c{kí`ãà 0 ‹x¹Žíµ µ¶ôÜ…™ïÓ˜MõrŸ 7Š^ìÈ« —¾U^vºÞI,~—w›Ûk¯›;°¦×ö?þn'ÉNLÚg¬ÞÙ@ù“}ìйèœÁ—Ñgpã³é Úe…n”2ìä2qÇ;óååŒLg "$…oxYnÆ=”A¿VÙM°ìJ*(mÔgb ¿±’¬ÁsÏ‹?©ƒüäè˜ÐĬ„ðøAé’t“¨wa~ÿï¯þ/Ãþ_3U¯ug¦ñãíÿŸ=y‚öÿOa›}¶éðÞþÿ«ü[k4÷ö7öÑô®úäY)ïx[|/1âCù}…þ£ÏÝÍ­×̓ýÆúÖ~ñ½qÐj9Þ¬5öw›”§Z]è=†¹µ7ò‚÷íáŸ6Šïè¾àsïq“Xåâ{ÈwGŠÃæþÛíƒe‘L*¾¿ôã%Ú»lÊžúƒèdàõ€ý¤¾í¾n6޽˭½ÃhÛ›=€œð:¾ÖjØ`T {è¬ÀFƒK€¹}HíDo_áU÷Ö«ÃÝÝíæúÆÞA íþ¸¿±¶Npw×7àÏÏûk¯7(áÇÆOÍ·pÆ!Ÿ{k ;ýðÀJ¦£ôÜÆþA1ô‡íãê©€_TY¶úÕS{`UÆ÷¼P«§Î°ãQ ¾½ñ>ùȽð·Ý·‡{os×õÿÑ÷±_‰g·s2yý/=YZzœðÿñdq©v¿þ¿mÿ,ƒ¹©sˆ¬ãÝ¢ÛÁàlßïw/wb®l&Ÿiø5õa^^=¯h9¸»–k<@xÇ9^ŸûUÛ·Ÿ,VC»t Ÿ¹ÿ-£:.;ÏÖ ü·\c€K ˆã½×h|¾I?u†?P0Z0Æó'žX\ÑS¼86ÒŽxDc8FÖƒßÒÇÔx¹g øZyi$anÈRúØÑ ^&íÉÕ÷sEI›p]: §†¡Ìh•1¾gKÉ“SjâR][Ó·ß9!»w¦ÁV^݆ä .üîÝžæ$ð¬KtÔýÛ2O=´gã Ò|äÌ\Aº(yÆ‚ÿ?) T¼} c ]—³ŸUzîÒÃEM!„»<njïΘãÚ­!,ÝÂòxÙ{Æ\Ihjÿ¯ÍÆDdLN ÐÒL€–§ZžPX›dFÞ(\š d¦.…Ë“,߃µøÅ8¬ÅI,ÖbiuÆ\IF,ùî‚{2‰ c*•Ɇ%º¥Ù0a:¡Ž¶‰ž,ý=aºxÇ=Yþ#z”øö¬ñâŒo#Ô!¿Õc85qüAœ)~‹bÖ=ygíˆé"fO¬Q, <ÐÆùW>Ñ9 ëªkwq2_šr2Ÿ Èò ËW=)é×>Úó¢ùjG{¢ Ðáÿ×>>hj–UœiÙÝòö÷g‘û³ÈýYäþ,r¹?‹|Ûg’}Çÿ w‚ãéÊêÌ|¥ö±¤:Y•£¤/ šUtZ1`#‡ ¢õ%¤Àÿv#¿ªm Ö·Ö^mo¬çœ«ñ]]ÞrLìïô†¬áÜf-G ÷¦ƒuÓÖûc[oü#á-ùA¸zGôU±é¦ôôqõñóêòRµö´„4Þªb Õ£6ÃôË}#Ä@åÐ㣗-zË®Þ%o.Æ*û -è]Ô2trfÊÛ³é¶éËÌ}¼+¨É×ôÁþz‹ñKw÷p0 [zØëÓæF+2³{dÙ&Íú»~ÈÖmøðÂn?%C7rÊÑRn…&…4}¤P@çáþÛ"‚–#j ‹ß‰dÔJ•þ[fÙÜ&†a£#d¼™’Þ3 )l™™cc0ùÄ5˜œÕ@r’1äu— myoŠòç±ÿ°5ú¿‚ýÇã'‹Ÿ¡þ÷3Ô¶ü”ì?ŸÜëƒúßä׿j·6F[¶¿À0ÆT u•)°Ö:pM.ÜÙ8\å-”æ:`a"79µƒA³Ø.‹~‰_ŠmøŠ×iøãÀNˆÏúˆ1ƒêþq{æŽ6ü{КÕnA=è@ üd™\’i‡dìª ÿXÅÊJÑ£Éf‘´5ö¼þ æ’0Ôâ𥛾pNQ$÷Íÿ >9VÅÊ42#Ì.U¤&óK]üá ¬®Xz)Ðèß¿¼N;žZÛ€û/”ësK¸¬±)  šÐ‡ÄuÚ#T  `‹Ëâ| ¥}©Üô‡AÏ?ƒ55<ÃÄóS´j.Â'_íædÍ®Ï8b)ƒC®AXqqkô½0]µ¡þ9yÅhÉß‹ÂrU âæzó_û»ÅG²Y’Ðɲ‘2{¤xRx,j;îGºW‰AG¹Ìt‰7ýHœÃœßÚb{Ú‘r'+[+G~àGƒxV lk¿³4ÐÐÈá÷¡5~8äþ8s*ÔdB›í¹U¬f¡ä±¢K¨§¡8Ø8,ʦ«wQxY§12¥õ˜©Òm+þ»Êñ_ÕÁ_¼`HmòÃÎP«ããND#Ù»áYuxXÔRæÄ*iÄi5Ú‚Ø{7<÷XÙ“0e’~ØÏ"£ezÆÊBŸ' Ϭùãò/pþT·:ýŒú¼èbØ%k‰C2LôßÚGa^¾èSëö~ÛwQV.*8T^êáQapéóL‡RgAk{Ýî1œZ2«‘‹fÕÙ±Ç 0fë glÄp¨†Ê[J"‡d¢¡ì„iŸC]Ž Ïð”+òbØqaƇ§â¥àK+ N DÀŠÏżòPÊ$V:‘—4úwÈWÛÞF¶žÊIçÝ3¶Êq;Ûäh¿R{ÛÐô÷øüáûï§BµÏ3ÄÞGFì -˜´‹¹-¥ð*fS ¥"}BÊ ‘B°=L/_Öym#¤úF g?õ±R‘‰ë@’¯\Ëðb¡/ƒ3ïöij|e;=À&euS#$f[{‰‰h -…&ÆÌlß6…'&ß„ø± ¤£;'cA`(º«9³Ðí ³+,ŒvæCŸ­6!ÄänÂr¢2„ó,û]VõPçÐÃ~,‹;UîɸHŒyàЃ „ñÊÅÝýp'Ú@2§\=²þ'D% lÚÆÊŠä»$› 3.+LEzW õMÔöïòàAÈÆÊŠy&zØñzA÷’ØJ\*?Á¡€î ª1jÓK³HIeõ±Y”âï*ÉÊ ù~ ÚÍb¥¦½ì7`*Ñϵ€£ˆ`¾yœßò1z‰|ø~ÀGˆÛ2sÿª‘»Ÿ0ŠýÆÚ›²XLÜ9b¨.X²Œ Ï(iL"ƒÄ"çC€ÛMŠÞ«v›ûo6ÖÖ×÷®9®<’ µÛjÜ$TðªÀmêue€wÂ;÷hkΨ|koo÷pOfe,ÖÜÙ]ߨ^ûõÚ•'†÷íú”á…9?¼ë¯÷Ç.—Ó¾  »Äj˜X¹ÂÂX\!!SUÒ®€äªì+LS{fîÞ\4‡Å_¦=¿£V|„)$KTžÂ1 ‹dè¾#¦ªBÕøÌç]…}ÙÚÁ©n®íüš&k˜-VXÞT\/@£Ã55ÅDgæK²åÍvn® ZIWàÀ` ´ê ¾#ZQ³ˆ’ª6Mj·^‰¦ÝdÚͳy‹v´iíFd4íVmJ{KƪÝüñ”ÊšÓ˜òô†¨ò4…+OÓ@8c8ó¥$cÁ;5 ØäDEß=‘ž~k˜ôt *å&², íÑOŒqz‹ÿ…O*ØÛò[{gó°µáÃÓ|i"„<É{»"Wjön§†Fk ”(̘¤)e0 EûÕ(]³25® †Iþ&œóh»òºq$BŸgª 3H:¶"àEZúÞ™eΦñüI)9ã4 V>ÅÆüŸÅÇHæNAéø‰…áôÙÔ;tCÙ.)„‘)Ë Sô6§x2»^Éym®Ëª C Õ~WW¬Ë£G‚ßå^ ïªEչ鄒€f:F¹X²dY;°/¡"¬h4@yN5ç ®L½uU¯}EÊ Q$ÕjùÛ±óv{›ÿ:r Êì2ÜEDjKòÿfv ,aÂH1ú¥¦ÏAHçm~/­æÌÙÞî%cÞš%ð8Ð1œa±% ŸDIï1¤{'¾Þ1ðC×áP„)|ól)le„1:Þ/->~þAq•œøª3ô(Xíwô€Š½$.+¬JvVŠW$û#™1ÉôÁÙøq::ÀV‘gvWÓe*À”ô0:`wø–5.‡ž¬Dsì+ú¤Pʲ g>vŸ#‘(hK)nÞ%Öf4¨ ½ûû‡0è¦ù4¥qÓve$—ª^ºb~G²;$7,«ºËr^³$¶6[N7—Òe¶ö~£s uñ<«ØŽ ‚‰Š µŽî}°$Òø}âñ@uÏåqüè¼à®c6Õýñg5ùOnÊA¸Ef ¦‚f9hÙë+†”›y‘nÅ ¶]| £s›5@~âÔë÷}äP5Ø U‡¸='r9‘î[Sªº9Lgš‘G'œ°qv£–×åøpÄÁÊ[£ÁC)ôQë‚.h5—½:û$¿áz  `=¼´j‡êÞÆ¾¼¯ìwƒV€Žûc NA'`ò»÷–¼Äd~ؤ›!»À C ÐwaÒéF•êPà°œT¡+ü8Rg7…Ì)ð©Ø‘R›,^¾DV/Í:Òª•³fåÄŒV–)ØÃ1”¾”®#(:t§4áá9ßøà‚Å!K:XI–ú¤±:é(c¸ÌL¬Ž¡Ûgœõ³_|}DÁ/+h¤ËjHÍ·Ò•5ìjáó‹>!äÄŸÙWµF7Ž`¿ˆÍ?Ž0h0÷Q£;PÈ¡ p¥Ã"¬j‘[2ú†9“.ê•£•žqj‡QâÔÉmUz§ö@9yf;*¬9(¨ó…¼ek¶¼X^ƒÙ5”¦ñWØbÑÁ»T¬Œ.À£vj‹pîõ<É«°Ýþ0æ«° åš‹ÌL¯FA·-sYì/ÓFûÎëNÂ$íä^$a[Žî¥v³ÑJeÀÕ4^”¡JY¯ÉQ6¦^ŽÂhÚd¼p+z)+"Õj÷“¾Ñ-nÄÄ• ¬öGñiµ6øXß‹Îà€OßJ¥Ä}¹î“©¥Æ.#Ñ©”³SÉÖÏ^ˆ ¢AËoQ¹FÁŒhó|E1®×lO€.@å€5‹RI„RÓ£õüJ¥²53Íâ¼*”¿zâaÅ”uˆlZmÔ°+ú껩N‹¦+UwU¡\Ïïµú—E"ÁŒ„’MQÞRê*F]ƒpÞŬ슬G${±“¤j]'ÄCG~| $n¶á° ƒ Ý wìw£óö¡Wò«›=œ«ü‘E¨H»{‡Mଛ{»û‡«ª0`ËÌ…ñ¶• ˸ätP(¼.*#G¢[X&=BrT‚øT©œiÉwEþ‘(ð[o6vß¾9ø=™d¨%·™Áá õ“E©µ–Ù^P-åém^–çÚ̦Àû[‰6a!hÑò„æ`©Ù›ûÞ u*8† µÇª#“ß/S´ê<áŽ4">r¶«Ñà߆§Á ]=‰ÎòW«“:µ¾ûfmk'Ñ­PÖãô,®šÔ¢Œ±#SÆ÷^‚wdðŠ^9Uf„§y{°ñscɬ­NÕÐP`ذþ4ˆK×-©;ÈåË¢©Ô¹©dÄVM`wõçÅ‹bâC¬ärstŸ$…¤ÄG!ŠqQ>ô ›Åí(ôõ€s¦8bKdCcJm–¬(¿ g”´jÃÊäSÕïúC¿”W¸#sU°Ä›㑌»²¢BÈ*qc:î)Í^!ÑÊÒ'qh*GBˆßä§ÊËSºÚá,ø„ 7ñ1£ŒŒH¨ù7ѧd€ÌÉËLòy™ñ;M# ™“ù›Ö±Zf׿¢Z¾¹Ÿf õËä¬N ÷š/©nÈM6#k²˜3«ö”·ÆÂ'T\ºlWâ9ÝQŠl„Öàa€7wnºZÉqdãôB‘HÌ÷˜§ÊhB‰J« _t ã|Ò¿€#¡!z–•›[`ƒÓYÉ4AÖGUkI90ÞÁwUå?pvù&Ã*ÏÒ,ðÛ4Š d5ÉjQæª'ZŽ“ÑF@R…žïÂ($‘©&.OÃY•±„âsöD_üÂ9o.n>YÕÿ4d1¤•ë¥Qàü•—DL-k•.i'n¿ôdS¡ròÙþNÔ¾Ù!µ±C«“EñÎ`úÎË^eÞ’ÝdñÐùúkm6©‹†SÐ,ÝÕæCHÇݺ5"ã¡ìmeÀåãQGÞ¹i-ŸIiï$”tò}%¤¤a¯z1v°Èÿâ{îÛÜLŒð—ÁNPÛ±¨ÏºlÑ¡]`œ”¸iEq¬´Ò’L*‹fK#Œ*‹Çš=†º?­¦@?]±ì-QKžs4dU ï ®±ñµ[ö´,jO;øY«þªÚ꘼DYÑÚ°45sž1 QŸ#”"×ù¬ñ1JºSZÅmʯX‚“×ÕØN¶$Ž«¨òæ^TZ‚%S¢0-kJºÖ”é) &À‡¶w`ÄÖƒÁÊŠýVÌPiV \QÍ¢NSGVåDf¨¶šÔ‘²À¨Ì“4PÍw‹ñâÑ1@¡5u)•ªTë<“–¹ú?§WÒ:µG~JM,¹C² ͱÆ_³èI±gòiFIHB8æ“ûІÔ,ª'n-àó”‹Çê¯fhóç†~wP8Ìf#¬H‡ Öxóx*èã†8S}u+:¤ËST½Ò µ²î©V«èØ*ßIw‰\36ž5ˆTYÔ‡š­ØöŽTÆÏœùÿs§^ŠáÂn~ÒSÀ[dpè÷ú°ÅÛº`Pv®ïú¤Ûàe îþP )»Ì’TŠåU\ì…Øþ5;lˆÄeùTœ‚Œ+ÂíºêŠæ™È½R¾d&{pï’íþ_¶ÿ·–ºŠ¹K×h°›dú[ZzòäñŒÿýìY­ödñÙÓ¥ÿ·X[zzïÿí+ùûN,áB|š{(^ÐΙ×I_nñe Ô­ÒöQQE[gÞ ðŽÑÕšÚÈHÅš«Ãñ˜ ÔþøR¼Þy+ÖFè .숥êÓØp²¢}͉ ”Rû>1dÇ£2­QyIéð¥õ/Ù½@±Qµ~XªÀd9øáye pEl=QgxpÅf4 Û[Ml…-çð4ˆ…FmÁt¨ý‹ÔXIJô*éôŒ`Pµ(¦}¥×WÐ âupk†ÆÂ5@2}D÷c‹g¾ÅÁÅ|I¬H¶ó J««2ú )9?öZ¹NË弸vë…\!'g†r8LÀ\Ñ%[I¢5ðâSÀ¼ƒ¨ K0ÏÄÂ(ÐÒe\Ué·N£záèëü+èçäôßkÐ }:p¦òÄ'À À½ãQÐ…¡",XihùÇÎ(yDÐàdGtÀ'9leë’T PíÜ‹i¬a-|bŠw ÃŒþÖþŸVͺø¬‹Wkf]ÌYk$/Žh~q‘Pîü»ÔQ`´WÕ‡yàóïÔkÞÁ)^B¤y+'ÑQ0éÍÐ| é“ß%cN»âŽø[|«jÀQ˜U-~)¨%¢†ê-6ŽZÇ ˜ ü_Õé®nõ9¯[aê;ŽÚ—õyALAÎÏÕæhµÐvژ̋dc3aÃÚààÔÈpéÝÑQ±:tTJ¶Š¨‹ÂÁI}N{ð#Z1iš2à¿ù¼læ|)÷@ՙܺdžÕÜ„ù1™¯:ÏtÓ>®ªZ‘˜èçqàóâw1$j Õ*Á4¤ÇêgrLa=TZz²d&•á=K’€4Z%€¸ âí9‡•Œ¾Ýsï2f·BfÂÞ´·vøcó`comípw_nOß¡ e¨±ÈÍC»OÓ=€\®âŸÂªØ¤¤9ü»*¸y+© 5k-+ׂðûïrŠÍ*¬èXK»ÁC±µyñÙѼÊbèšòp%s'áhPØÂƒèv£¹¶½]o(öšßsÛk;¯ß®½Þ°>È„ÑXÇÎUs²½ü:¡œÐ$FCOX?}ÜÀ”St?< QسOÎDÿÂÏ „FhA×ÒÊ'œpˆáSà·ƒ:ï>¢>Ëí‚pbX›€Lþ…ßñQI­àªÅ]ÀFÙ„áƒEЄ“,dæMòˆ$´]­ÄÆîÎæÖëæÁÛÛüÝbÄÜòõ0ÒGH÷ 3 DZäš»ô‘ ·žhû-ì<ñëe©Uêɽ‰œð Æ/ôGp®S§^ÞX%cͰӸ¯ÒŠ££úf‚âçÄ¿{¢<²­TÙ&ž®°è"`½¢«|¶ ›Q9#Е åß­ø`kìéNTsjUÔ5VäÜ7‰=*ßü±˜Üž*´=‰b‘w¨³ù‹yàààï™Ü§Ðä¡^9»ÛT"Y¦^8©*¯•¦7œCá ­<Ìä]s"‡ñZk÷`o÷Ûh FÓÿÿm„øŠûn¡Åv„(<†>ã8ò5œ™c/À“.Î'›^xê‚à#6§PÍY´}q…‰‘Jû>Óñ#ý†’°IäeéÉÅžòÞG‹ } s«ûÞ J,P @v¬ñèXšŽûÒn•ÿ}N®‰U9‹‰qeïvnûÞ1IlšFbSÏ[’˜£üQZsôGcŽpî±9ÿ8ºCŒµP/ÈÇ™ä2G™‚™£;ÌäyjÐ;°“ízžñIÞÓàµzyä:š«•Vçïñ¨EîÃ)ƒSdÑdB$GºŸÎT3™PmÅ–†ƒYX6”¶=ôÔmƒô³Ð_Q&ˆ+ÌÍÃë°šn3„ÆVyˆßvÊÛÝ™Ô;_ªv‡'5ÄÎç6e$„°Ó^êmñÖ("b ZI/%…{©j¡8 Q¾žþæ™uFr…Œx»Šh¥ø$IÁ¢áƒø;êañ{„‰ñ6سéÏaÔ¬Õó«Î×9ûmn{kgcgwB޼ Ë«É9»Ž¥;¬cÉ©ƒxÇuú(Ãbµ¥@oÀ©A@¦$ñ}Éùþè‘:Ua6žŒ†>šŽ>åÅdkRô‰m1žûl ,Úhü¸ûÕ¤±_Mè«{v4‡?ãþΚÏÊMò”lZ/šõÄ4þbËGùwG–ØSUýN¾çÅÑ‘ÜËaz¥ vlÑRr¡Í‹¢†%J%ȼä®ZŠ‚N ”ÚJ²$¯´Ad‰ÍžséNJ⤾…QŽÍëÏ%³ iÌ'èV˜E™Ý «Â„HB‘×®S🄠Åc‰ê®"‘|;i‰nÄJN‹`u#`‡ Pò*þßÂ<²¡|Êæ›„'«ÀõP6dièv=çX§:5”É¿ž]bØ&¯Ë·UYÛŽEŒ€FÖ(¿Ã„}–]’ Êž×øè$W•ÌÃÆ…îÁf?]GŠy̻ا&juÏ®af£¡ÍªÖulì¤&Qfj”µ#\·U$àKˆôð¬eZNBp!I^0§™ñHL€dÉѧ4gèë›±çšfx>ƒeŽz'@V&-å3Š—ÓŽö|,`bjçq•áîOó÷§ùoä4¯Ïñ(µ‘<{ßC1•Æs·ZÒÿZ²z’e"G =àË(µFép—.Ê\ÿÁBÇ-)ê¿Ä³/kËTóÎöœâ•tÔ¶¹Õl…8ðà§÷Ao¢…}ß +.fi±Gˇ3ŸæØ£þÉÀk³â%‚y\]®>ÆÛm ¨¡úvÔ-¼×õ‡|Í~Rñ¤Ï?Nº(á…%o°ó9,Å€·T‘®—ÂKÉãQ)ðnJô¡Ð1{éC„£²Rl]Å{@€ÆCÄ6OÍŠ¤9¨ç…#øt‰—9=-<±0$Áiê©…™€ö¡`ƒ( ê·¼´T’~þ¿$ÁŸm<¬Hõ¨+%0f‚©nsÌõ¯ŒaÄ2à µ}¨=€ÖG¼~둺P„ΈÛ[ÝíÝýææî~c£.^ïo졘éƒzNʙʙKã¬u#/ïäM>s rç ³œ¸2g’Är«›¶S uyÉK-\£þ ÊärQPdÀ"gÈzá¶ V&Ò×Cò•ÛaëdÕQÝNz‚Ì Ý¥fÁ—¤Ìµjy-sŽßfŠêö’“Þ6î2ðßöÛñÍE––ó")FªŠ$€Ê¨ƒ~”®x)0r ½Æ“.‰ßæüûÀ‹xŸ|l@û̃O'¢Y¦ï葬'9’%DwZç®`ü‡|…>ŒËÉ :‡½C|Òæ.‘­,0NžnÓð² ËàßF^{€ÎAãÛzÁ¶-@^­“®…”ûð : «åå|}iUߨËëu`FkKcES,§uÆ¿ˆ&'L„å¶þ}ýhõ&® –iRÈ?W“e€íî  ® ú¼¶ÿºZ­fÎ6ò ÀeEƒž ¼=Ç ky*Z Ž'€€A&vyÈL§¯ì…YM»»Ñ±Üm *ä?¢6ƹÅZLJ*È“TŽÂWÑ7£¬˜«Då$ÒÁሿ2œ“<„- FÎ.…‘o[È÷08y(ñ%{‡Š8|Þp8<öùT£³i ;µ¨©!Õ"É JoˆƒCR9Æ:ÆzQÊ:e¶š­m;÷8¡1Ë÷pnÑÏ•üÜrþʺ~8­Oõäû\"!yDÎË_±áÊ+œ+= sKxPŸ{¬ŽT©ÒnÆ%̶ê.ÚÔ äpe*zÈw=d;Ò²—œÚ_óïsÉ;©Î»Q­B1R9~·(Uª”º3d®ãkYPšiÔ‚¢Æ<`É2…?ªv''}•ªÎ yçÒ_f«««~ýÍmƒâ-îpá£Uµæ — crŠÑ$øòתZ}15Óô1[jw-‰Kº@I4â GEÃÔ•|èâXsñ¼%׿ð•0Ónųñ“ ×`nÀ$"B[›O!qõaGjœz Èˆ}/’ E:U³êjR]ëv‹è¾jȉ‘˜{¿ø¡L:É$¿ò#¤ˆÌ©€‘íŦHg'¹!ÁG,†çBRG½o¼hçd‡ãÐ# ÎŽŒ¢L¢PÔœ!¾<ÂxÍ‹(Ÿ‚—¨¶T´á›&òv‰ý®Š<Ë’ &dÃIf* »^ޱYqDxC|j0‘<ÕP}ƒf«ß¯ç‰ý"äòoó.ù·=—üÛjü·÷ÿnÚ Ä‡¿5ÿvRÈ_·%ÚXÂnN|šhÍ÷ë÷'Õ9ù:/—36ïëÿ³¾µÏRYÜŸ½x´(^˜©§Ä§p–"C¹ãávBH! y'ÄÐðË7¡±(ü¼¿\]*‹¨ÛFo ÛA8º(É;'\ÐÇÑ lS¾Ù²ÐF¶ÃÁ;ñ‡1Ya £Æ¡ÕT5Õ?u¥ÐlÎ] KîÁ‰†ªöžEÐÆÐq-€ºQR‡&{®©“ªE,í®ì9w¨Ó;9Pîø8:þ_©‰µ½õj÷ÕÿÀf‰.ÒŠ €~ ®;…‚²o(Üü®ý´!±EèT‚"wXõƒ¼â-pno­ñÓÚëæÎÚ› XÞÆcDA:\ÛŸðUÞ–ÃgÒ÷·v^;„õùÕ[¼YÝÝ?t ½Ýß® 9콌i„ÃQÏkÕV m³6=”¾Sœ[IoOkC}`< }æŽiùfܺSÞzþ(÷P& tIDÕÓ—Ô âǵŸ¡ñ¿PˆÇƒædƒ§ò^Æ èn9¦üxÎ줊¡„*] Ñ-]èàp½!ã¥8%†m˜uÊï$B‚´ >Y5®jP½Ù`d½m¦yâwÄw$¢D¶›†tS¥S™7ov÷MÔÖó{ÑàÒ©Ín ÎÖ¸a£&$Çšÿ)²µs˜1?A8œ8=‡ëP.YMJ)ðvg ʸ/¡Œ)'l…µ[R)ôšÍwï››kÛ9+ápÿíFnûP.cµœsÎ·ÙØ…u„«`ÿíöF2m{Vr"µÁ‰¯7v~<|³Û†¹×øÇͶ±³öj{c=;U62ûµwïðÇ}ÀU›z…Æ›—F#ç]4ûÃS<>IÒ…Ý;ÜÝÝn®oìAËß½ƒM/‡ÿmÒRÏûk€G¤™º‹9Ÿ>æ_(¹·›Ûy³±¾u˜[?øõÍÛím g;[›0Š˜em¡6×ösðÿõímúcºþö Ô³Ó<(2&½ÚÚÉ©ßíõÜ&¡Üý¥?0J8]åÜýFÚB“F£Òh@·ÞÀ¨Ið0r€à‰œ:G1ÿž¢D~nõGôC‡mÌÂ2¿`&zR#˜#t„¬Õœ¦¼{—Ñ>Hä¾{§[ŸÑCg?·öÒ^¹=Ø^;ø‘_% ~¦¢˜ÿ·Q4ôéIâ~>ÃÖ£ ¨œcŒV÷g–û¯qõÝ;ýЛvµ€›koá^ílþê$âËÏTù(zzÂßµ7°Ñl–(æk¶£!ÌÚa7»ÜÚ/?åÔå뛟 ±Í½ÜÖäím¢2{ͽýÝ×ûkorô–“ªOÀîÐf¹µ³¹›[{{¸Ë„.< g“[klï6Ö¶srÇSW®ñëk6áç‹-]ïúÚášiDª=Ô¯ª5Ð5ô¿J[Œ'üÈèÀÏ´Üø”É?;ò$ ó²yÃS6ðˆ›ðé)@v ×éo»ƒ?í³N‡½.þa'¢ä¨…?À7É©æú˜"ÜÀ|]~‹á@í·ÍëeŒKŸ`zCOý¢h(›„ìåÄhð+¤û`=½0ÆKFŠÍc>‰xBÉ3Ù¬Bš™HpI%ÉÎ8œO.¡wO,lÁwfÌ ”‚¾3X!8dV³uê·PJ%ÇèqØŒºhhÀiÊÅWëûëf§ñÔo­ÅdÍ><Èd\èM‰ºüÑ .šqDCFï'ᨠԃžaNpüUa˜Ô†kÂ<~’™[Ñ™úŠöRðuîOüœ’ƒz4ú­ År³ÓÂW‰&( ha±¦ $ššnfm ´eÐÎQ`ßНö™ù7ꀨºu|i"ç ›§~·_×oÒSž÷ˆÏ„žE'!ªð”¦Rc°ÓSøQÿ OäÂ¥{˜"›ÀjqP°Íî¤XêG2MÒD1´³åÎ0Ÿëž‚Ô)agwg#FMLÔñ7â~äìLje¥Å£N*Í]mõ¸|ÿË1ÊÖákR†Gœt~]Ï]h†š]49ˆT h–9Y1À(Ë蹡ÁŒYÖÓõ;¨L ÇU `>‰'qyÅtïŸï¡j€ÒPµGe¡Ex@©Ò•N¸ŽðÈ4±ßbõcŸ‚’±MRÚa$ÏT…m Yï•ç¬*½@7[~lk®^ Ù±D|ZF/uݲð‡­*_{­–ß'áV<¾R\Ë•%Q%6HDîe¡;¿FD7YCè¤7hÇÕ’¤—õÂÜg«Wä%GÑÔÔǘ¾â›Ê ?lb™4¤JEÒñ‹•ñª`‘}» A!±AØŸáìZpwû+LeÁÞwð›“ùjoЬ]Ê.-S î–&}Vé¼í%»³É èýÈÙ*® j·LåÇô‚ÚSé+Á…¼Ý:I¼»Iq2…·î¬i*˜ >ÕþRœ@ê3$óÉý‘Cº„ÿÕÙ¨¬%÷06£[º]€ìHùåê%7,¤“¦TpÊ‚ãD×E£;AÂY­D!Me;ŽæL½f«9ceSé‹Ãg9¤QwU%¤ô¿þwÔ¥Dׯ—ÊGWÞïÿ]ÿ0_ç˵ÂGiØQ/q²¨0wV*ZøýY›5½¨Q) õŽÂ¡h\¾k;¾Ô qÙ¼“0ŠIï,JhwJÍG²ƒ•JIž2Ù&üÊ«^üù’úI=Èß’3Ö²uQ‚¨Ï[ðìëÙ<ê§úê'·‘2·Qʲæ-ö‹õ¬š"3e¶DJ0U™ÌWçÍ~ÑËïæQ?¥ú¡*Ð}Q"ÔùD’ ‰w÷ÕÂ1N±?[ÏÖˆ¨j2FE ¹Xæ›ýb='º«‹ÊÞjIã¼ :ñî¾:oººè˜ö+©®);6%™`†R§¹¯Î›ýb=gŒ„n€5Z=ŸnhFZ:ÉžyšÌ–xw_7g|uCÒcÌ"a*˜|ÔOêAþò;.²,ˆ3Ï[PíëÙ<ê'õ : ˧[v˜ 1¿“x›h4¬túwÓé[‡Ê0ªH›‚”ùf¿XÏzÖèU?áCÈ 2t7yôU*46!ñnWÉIΛýb=›Gý¤Ûgn ­&:7$TfrJ2A7Ó¤¹¯Î›ýb=»@ô“z¿ü㢤ÛXÆL÷Òg>Ý©Œ´t’µTMj2[âÝ}uÞ’à¬æQ?©µ>Üæ§—‰uÖJ>ê'õ ùÇMç¸äœ‚Ò/Ö³yÔOêAu`ìFÞE»Ížœ”JÑ#k%&ÞÝ×d¯íksÝ{»º_Ó­i¶ÓÓYS)É3rÎ¥þøä~ȸ¤TJªÑ˜xw_³GPÖ玠Ô<˜ÏhYVbÆbz:k*%™AYçøÔúÖõ¶€%>%[è|ûeR±1éã‹d¦ŽËž‘–5•âfäD÷5/\E“~¸C›˜ÄÔlj#?¡ðä¢c N*6¦Ðø"™ÆeÏȜ̊‰©lÉ„ä*H(ýd¬RQ` ‰Gý¤äobÖ¹”œeVx˜·àÙ/Ö³yÔOºí\.£­±nŸó¤äo¢}±Õ¼ØjPâÙ<ê'Ý 8»=¿a¾ßFÏŒ¤û¤ä/ÿ¨e­+JK>ê'õÀmzZ/géËPÖñïî«Æ*•b¿XÏæQ?ÙEå/ÿ¸Cn·„ÞÖí™O¶6•’L°V‚Js³8oö‹õìÑÔƒšk»]é-‹ô³yÔOêAþºã;º±£‘õf¿XÏVÏâc“Iõ(«Ÿáªkq±)I¦&+5™xw_SìëÙ<ê'»¨üM ¨Ûz9®®RÚ|F?³íQµÒÓYS)É„ HnçÍ~±ž] úƒžd·?s¨y±£‡_䘦_Σ®S3jh ]òQ?©ù›hÃÀ’ÀImÔy žýb=›Gý¤[:#J3zŒ\bÌ«óf¿˜ù wó¨ŸÔƒüMôÔÔ'{kô*ç-J&$ÞÝWS(Åþl=›Gý¤ÇÌÔœ7Vû¦ÉGý¤ä/ÿ¸ý·µÇåp’lMúÅz6úI=¨>Øð3zq†¹¥š3L?›GýÄ •v´µKMs•1ñlõ>üìÞ_)mõ”.ð¸[üxû|*ðç¸Í—¦©ßâm>‰¿ì]>MÔ­oò“ ͺÇW2SƒQôvM¤Â2Í­{¤Â‰º{¼2öÊÅDŃ K0a“Ê uùÊvÜ«óf¿èÝíÂÜÓ£~Rî†cLYävcj–{Çø„Ä»ûjm¸ömñßëgó¨ö(˺&½\/*ÚÔF–÷î¾ZáûÅz6úI=$ÎT¬FÎXÍ'—JI&8ãÅinçÍ~±žÍ£LÓ„ôh²[i‡TØ«@j﯈£†ìr´R¥:JAzøt…>è‘ÍS®g¾n詞¡—ØqäToÎõ; ¤šæp¥ŽkîB†êýbå‡#ãýw.]¥)´Ô©P WTÈ‹LºarØ;‘Ýj¬:EN6·Þ½ÙX‘ÐŽkà÷¢3öÎ¥Â%ˆåêb5Û«¦øemgkçõ …'P˜0‘I@Yªô”5“©üg:û‘™*ÞŽfÚ&4F &©"¡ã‚aW£Z°‚ÁØ3L Ó•˜ûœV6’²Ø]üd#'M9ÏÎM¶ÛÑÅë• {ÆRyÌ®×\¨È/‰6½ fgÒd­ñ¬®*ï›Ný©}Í4†Q;ÛðVm¬a¤7ÐŽ7ôº3-öXò©ª(6 š4©×‚ SlYqìv„Lá¤övLÔ°=¦`<­Ëª2ÝâþÀVz”?R¢¤$K–R‹mgp”{ð@YSXçЄøÄUŒ°.^±¸{+5±•Â’ÒS“úÏRDÌ’X,,u†ŒŠÔ5°MÏÉ.h u¸‹¾­¹ë9&•HÄpà‘KwÉî¶j›Xaa‰ ó †ÊµlwÌïdƤÛò–šñU³½¡ÓTìÐ Å+´IøÊ³¡‰nf[ñ¬f¿?:Z˜#²ý÷|Fbm,å$š¢.ä2_²Ð&0/ñ¢dRîêœ_öZ‘ÆQüõq-&Ô¬TdM+ªÝyI^Èäw ¼¢·n?êwÑma$¶*âxá<ˆ>ù¡å²">Î!+˜‘´æ=Å|CË8ÚãJ½N´¾Íémã0’û›Œ·=X6l56—´c¯Ï¥¬ÙësŽUûd°V\0(ðÛÊcUïF,†M8xêy—Ǿrõ–Yž³ZÕN€†!ÎȨ’<žµšä@Þ0[¾ºì> “l7£õ¹"=|åçøV{##J‡^–s72B=o×?Âã[Yï;çmr$ ]tæVÿØÑÆHT?ÊdÈ¡>µÚN!a²’»¼$Ÿs| s¥¯Óc N0ô=tr”Ïigϲ ì\zή;Ÿ]|ÒçÇ2èñ5Êogªö<¹4Ø”ž:Fƒ–Oþ 1NA‡¨!™ž{ ¼tv t«·KŒuÁMg·æ$åóJFµSQ¥CQ5‹›64‘»ÊìÿžL€)")Qå*”@03œŠŠ~–ލ¢¾\'¨Š[fL\•t¦)`fŒ®¢»òW °b Ä•ûC¦¾Ã­ Åæ\×l6‘PªU×md*r`ÕkV éK<‹ØÈ6ä­®`è§j5Ÿ±VåÚ'O¹¼öbQLÔ_Â-S­/l5|îÅ'õ¼*àÑÉOe)“#Ó#¤K2¥`È®ÿ<€Ô,žbîQ1Y‡¡‡v¹ëGVlš9nS>÷¨Oé#”_påÒæÀ1».“5Mf¯šs›DÄNU=üºŒæµF¡ŽP•â»Dgõd1܌ףÕ×@:jå“-¼EÇtÒeï­þñèä„ÛÞÁ0•±NŒúâMåBœ´1ÿFÏk‘ûdoä%ðHó %ÕVÍÏ©¡Íæç’_‘ŸÓQêmîZyŒ#Kñ¤pxmÎ}æüW< xÀÏ:"ŽÍM;‘£U)VÎÖÙ5A§ ¤¡K®Œæ’v)$ôÒìGńϒh›B4û1øñPìöЯ&²BÝMc>) Tg!vFú‰}ç”.Î-zQˆ)tíQ¸ ÉV[é(deÄ^\´#Ó@ÆœYxûŽÿ58®0Û</^4×»›9X‹ÊCÁ¸fˆ…ã—ázm¯?äÖ…—6êvL‘hØ»h5—{‹­¾vQ¼ç€€ÐqñûŸ×öëð_s9à ¥; ˜`…='hª(úÕ“jY4ð¹=‚R¥²ÜÙig†ZâÀ÷¡×ìѱíóþLƒ‰ ŒŒTà;£®¢5·ÎT’OŽ–w"öŽ£ø IônóÉG§™¹†'â>VȲ¨¬Ãù×b -—Ì7Ðg· å‰Hm‘ V¢j‰lEK9W’z„1 sêE§;›*ÇQÒÖO–Àù©ü\¶.ãÒ½P_,IžÝŸÊoe¥ÓS6j:h-Lä㛾)IÌlAaq¬;cùo _Ò5/3Ž”Dô>¾—æÖíX£œô¯ÀÇWº0%í¿|ÛÑBôÑËŽâ»î?w@¦Êx=ĆêVK’º¾µ¯ u\¶•ÚŒŸßÿ'r÷=úñ!—Ëô øäâ[kïíoÀùJ7M'´Nƒ!”¸¨YºP“Íĺ¹ ]Ùù÷~.å—FÕ±ùÜÐõgÖœQïÆôŠ9ŒÀ+ígª £bû¶*°ã)]©ÄbUKŽ%¬nëÉëSYd~B_Aì„JüÈõŒ$19O‡|å™ò€ݯsDÞ,ˆs QL¦”i{$X±Ø|æÇÝ7 $›ã˜\XÓ1cuË$yµ)Ñ6Ì``‡D$A &¢ŒTc²ÿá½”å³=ïåáxñŒÇ™%™ÔÃF§Àl±†`™dY@¤ŽevaYD¶ÀèSXåÑyj% 1 -¨sŠ£‚¢9…GèXKqU|$ ^ÔjÊÐÆ­^+êÉN9fDª]¼I­‚M‡¡Øúr¦o”¾?@õTd%rª‰ž“7 :öÒƒœ1¿’QDW…Â\CÙÃÌ¥-ƒ BCºŠ–KKµ^fæ’®µ…*œ(‰¸Faå¤ÕïmÇb Ãv™bª7ŒSSMÏ ¹ŒQ¢ù5àÒcá‚›0Óè„tw÷Š«Áa{Ož¶£ÖH9tŠ’«3 U’c+Å·• µK/e DZ}%æmÐ&´>Ë!‰Z¥Ý’<œvqôîfñ~ JÙ7»°Èø:ْ݆Céy#Ù€³`R!©Êœ(„ªÔ“ ÅeD?WFò¾š>R {’@Ñ©Kí»ŽMKbÿeÓÏÊ/p›¨22W6<œ4¶8x»™'CUÊ3BK˜H¿¹¬œK•…cá嘾“‹p¹øÕÛ­íu!ÎIÖW·>@PÎóþdDKrcìàÇ݃CÙ3²VXÈJ~öq&[A'l.@£Bï ¦ž¬¬;0sàJÜ}Ùß´* 3¿ Ã)—8”MÞáç).º}úYÉóµ”ý'Pf—vi8Ìm²‹9tÊoâÍô 8úàm¸s¦ü“,°&ˆÚù@›k‡o÷7\–Ti~¨Er” Ü®öx"¿ÔC2 L&¿¯¯í¿þ RpÞC2JD?Øe˜¡¯¯^$f¸?)@žJÉGa;Z‘ÎI®×ò%§'.œY ,æÆÁí x<{)‡jÀš1ž `EpMîh_¯ `Q{'¬Ð¯ ƒžìŽ3zÄŒ¼¯ïýôúàƒôµ'ïímZaH >ù:N§ÄYŠ£OäŠ\ùÈ„þÈh¼̱¨Ëh¦kQÃ&½'ãö÷IȨ´øŒ˜_”W[”EæHƒºÜ‘Ø™^ä\*Êɲ@a³Þ‘ô¾Ã¬Î@.lCk%îÉ#-¯DÒ­’îJ¾,dbÛ•&˜úê`‘]ÌZlvz©Qbßš4ŽTÇáÎq&{[ä“àW²nÖ4ŽbÂ4aŒ%ÓæŠ\TØËuÏÇ,“ׯ?}À§Ùò>y"°‹Î]ó%™bÂh2°­ V6Ý€æ|¨š†ž„£ `¯µçÅ1lÓt¢i¹A pˆbòó y5¨0²z,}w¿Ç­ŸÆ÷ÀGFOÊ“e–’Çð"‹{&ôFµƒ"'R=(ów®™Jv§!ë\Â:g‰ØeBA©¬™ q¶ˆIu, r,ìtG‚†¼LeˆÆ›ï ¯Ðøþ{3V2Žg!¹Y*K§ë ‘“®Æ™! ÂOêSY èMT¶_ ‚0T/±¿¨DñfQ©(1n€À±ôÂl]œi@XëÖ«ÍkP°ú0ù*:7G5¤ûBâ%–W>ѱ|q—Ö ŒmI4°“ȃñ‰)Jôfë…ÚÛd-×ýSr°wãúcƒÂ65 œFæ\˜‘¶3è™Èpèî¶î-œÕ+*¶ 0G¼·¨å3¶÷½!Éu1f–iŽ=$Œú{rÄPvK«/v|„G$~€+'8¥åX='ôn Ž9j5r[¹€„Ä$ý2óŒRBÍç‹c0ñŸ ê6¬Ræ~<:¡v¼¨¼¬*>/¸dÀê¿;La†^sz¶žý6ËHz2(TYÝEÃTëQW–­Òßtð-Š`õ Y¸éaÜ5Ø t`Ø–Š|±‚÷U–Ÿfq-¯³éÈuŸEò¦+©  n™Ì-˜hU\XNöY¾¡â;!S?ðÇÕ’ìœ2g]†¾.†}…jíT¥æ TGÂBB œ»*uá~ÿ÷Q•´s~ÿnXŠ5‘¯Vó4Ì>º6«N^,Ðòz=Õ¼t…²€UïÂû“RÐï Õêï'« [ Ï I°||ÈçK×V†ËúšUË‚ÑsêrM^;ÚYëòÞQ}K¦»ýÎ=äs°Cç¸ÎÁ;ºÁðr%—h†Û.åü?u( LØ/¼€R·¨U…qúFT¾#hë&=9*›ê²••Fhx¤B—«Û¸£4®8DŸ[¿lº;2«Yâßqí°íì`fñ^Ùá³1µfŒefK¦Ž[vò -X´1ÈÊåL4…U¡\ÒDɦ¸«F+N\IícÖÈDLÃã?jÁé‡EÛ;¶‚‚É ¡­)!#ÌaŠ53¡lêŒU“»Ó*¾i¥c+Ôìú Ø0Òãã “×iAlÑ;£ãŒ.I~w&™+Rïʘ+:kñDÑ}6n—c(¬Š°–9ƒÀu.ajgÉYl)ˆ-/1B¢JîÄáE”†YyTy©úô¼Hí_èXXl”ÄÒbmIl|_Dá9’—Íh<MYl…­jŽ®¾M|׋ÃÖÁr±,GÍ *‡l9×Ã.œr±q}ÔlÓ±@[Ш2^zÁ1’ä^H>I1dŸeÄfÒJ~‘ýO<|ˆŸM0i'ðeU~žTƒ¸´P£¥uqÑ„ÓcSIÐdXúñ¥ñ_Nj´EŠý¤Á£X‘dOpñ) £dË{.TtµZ¾ßFuºìK¹Ï2ô-ż®Ï}ÖÏ•ü\-e¾!Rµ>Õ“ïs‰'*³n&Œ/†¬uõ™ÑÚ¡ô˜¨1yÉÖIE ¾æeø‹£<q}äŸ#¶Ãnàe5dxS„Ýþf>9Uê#ú{þ($×·Ýó9ž™+æUî£|>çr(ê qn/=©§_GUðãRiÌ"šÌÅÂÎh·`oÑ‚·ðo1ÿ}ÁÉ%là5i3´³ÔdÛ„è93ƒŸ-ƒÕAü²çhîïÀ"z“—õP_L2äYÄ…J{F«Çòœ4½šx¨"^úV›‹“­£W†y޳°Œ‡M¬ð8ú@Ý÷E¥¯—&ìEÛ¦Ÿ{ñ ÷Dš}ü{áw±PH-;Ê’{`ª¨åh𤎼»*V…5„œ´òýÊ0TYÓ_´¤ªÑ›Ó5ärWb -±ˆÌuIÌݘ{òrO^¾!òrO\nD\&‘”ñM¥+†¨Pö[S‚ò•ɉNãFûc) 6î/G^¨S÷´å‹Óƒ\N-ù¹„I“20õT.²1”ëúƒ ÕC±î“Z4žã¶öÖ¶övEq §ÅÊ­ÛpzÐë^ÆA¼°Ë7–t¨*Ù'j‚Åš›tEx{¯·Œ0¾¨šÔ úÞó¦n`•0rœøÄ9D ÒÜî ð˜„Ø,Ä^H*ErÿUŽkÙæö{–$“ìÓ63¢°žÇþ)ÊÉ¡Yký~×/ĺYU¶¶Tø=ö;¨3Àjsl‡äcN––3 XØÝ>øõÛ¯¯¼àØØ›©B4ùº%Áh ,-~^Û[;í·ëSηS޾ÐãXï:Û1·Ôû<öÕ¨·¥§¥m4LꑈžV4ÖÿØt¯ÕŠ(í^šm(³Û_fKú<+ÓZ)(¼›[â«Ê6C‘Od@…~ÌôeJ@º ÐÐbñ„b[tÃT¤aj—¸¸"#ŠZ·ýN\=m–`QvI(r óõ¢Lö*Ú(çæçª¹z1·ôRIg uYGмì|Þj§Ü´–Q ¯š¦ÈìšÔ6?ðÝ-hÒÆ¯ÛŽæ^r÷ø1Ú™,³É™¸Æd±îûŠ\k±;Y¼§Èä§,ò»Õ"w–qŒýþ4¶ÎpuæöñN‹Pñ—YGY§A¨,Ùâ¿ÞÑ0«“÷¼ór/M]ÁÆNbwóÜ„ÄÞÝßûª<˜¼YúÏ‹ý~’¦ :èÌ4åÆ'E±FêG1€"ͶN˜až<êŒB—ì`Û¾ÙùkéC‚˜|¹ƒ˜ØBu!}þ)ûôYüņ»ðUGzõúÔËѰ,²áÖ:æ’õÖÐ!‚ÖU(QÃoú˜ô(}ÊêŒÂ–:[m¾Ýiàñd¦UêìD¥ùätóO.£=÷‡žÛz y”¡yd›JaÔE€$RU·ŒŠDÆ^Ð57~)Ú~«‹7õØ-Äw4?ô/¼^¿ë—Å{•·ïD­d–8Á9ïùQùP+¶utí͹¥6OÚ’H‹°!ŠC(oækt,zЧho>úh”ݽÿWî0" ”2;Ã< Z§tLÇ1è­!†:7‡Š‹¥Ue‰Ù÷~ê³ÚÚƒ^ûƒ!¾Áô5›‡ëfu¤fe ÷Z¬ºa•rUx£ HeQCÉib 8ƒâi็Z€`æXŸtÃàÀíœQˆpä(î*ýK4¹ÝhÏzœhúIÏƈL Tè¤1:ö[j"£í5+à÷¼a‹EW’-"0hŽU`aT<lÛMˆ ¸D¹‘2U“\ h4Zæzý~Wá…‹V¿;Šñ¿à2´[äyÕSk±§‡ÐÔihåVž›˜™5²CÚÁ±ŒÁ½"t}rüƪ•0Ýsï2¦}€ÖüÁ¯è%•¬ ÔñZч˜‡\mvÒ¹PGü·ž9ø"GC„(Zì²×¢ &_h`®û®°Jâ:¬TÍI$6q¡™øä‹ž¯g&)×óÉXÊ鑃$þ'ÓWsWc$Ä1ÇQNÙ„%ÑQù"O†6Ît¹Ç|X•ßË>îeߌìð2[úqEÿù‡YÍiú2Ó}ùÞ˜Ûßß™ßß™ÿÕýîoÍïoÍ¿YqŽEÇÞ›÷¢y÷¸7/£Q+9+¸Ã“éOçÛ¸Šu¯ÓI¬ž¾P× ¥i²D‰FaÚº’/ÆOü|ûò§?â&)ßC±ÓÜJcNïßs×88bÍØ& ŸÍÄoCíò¹7êòAlüÂ&¿²[Ø[)"ÜhšíÈšòŒ,4Ò¹äÄÃá öÃá gK·üÉ“®rÝõœÏ4áp|œ<Ùòx”=×ê£;ÕY³ÜíäÊŠ'Ì­•CMíAôwtÏAWŽ£ÑPy¹ÄìÏiƒÚn¬¤a®Œ¹6ç˜,”k%ŒVdD‚™;ªmîæ–Vpñû?£T–®aÌÛ6þ»ô$ìùn {iõê"X~[Ë)íÊ1♞© 3CR ¦ãL ÎÍü­fFò æ"flý4·g:'i;W¯jø¿Š*Hü}¦ö^Þíû|"ÐFˆŽ[´™Ú;ÄíÇ7ö‰7Gù=9›¯`6<›¯|ѳ ÇêY‡øz ÿ”K±h56Ã’T˜j'Öä-ZTÆØB2‡?%é3!‡ÐT+ñß‚1OVâ’?Ñ-¬¾ø8Êâ_þ^ùöÇñJ›òpDlÐKé÷¸?àdWÝ‘æ{î"¦KGåžq²=jñ>¦/?ñ&®ëç£0äKQi–]¦«¸ m;ªïXVÛèÖ à#ÝÂc5—ÛRKä`›”ó(‹JY^ýAÖ)¦åÀ±m…g*>ˆ”1 ÀÁ§Âˆ"è©|î9ÅÈQ–'/­Ác¤r•~ðý`9+F® ½®7D±IÊ’›L·Ñ"]ÖÅÇ¢~ùýw˜9 –ÜØ´äj¿}ÌÉï=*¨^™g£ðS‡ºÌÀ.3˜­Ll—‰g+sf—9›R&G`ƒpAèSéTê0v^ö„EPìTþËh  ßIÎ? ?¥áèéf©nÌÊ'^âSØlx€ˆgþʼn?Œ/cò<«á¥>M6ÕDA•nŸú”ÑÀìiP^Ž3ÆO~7„ãÛÅ]ÿÌïfŸü4Ûø1Bè´ÂÏhŸú4¦i„Ñ ”(öÎüæÖæA}þ¬ zBß]̓½µýµÃÝ}Ž‹+oQô•óQf †’³„;njÇOôXOlD@+BeTn=R@s|¹ÀÔþÑCå“®*$Ñj 4Ûg8¤ BfÊ‹Ÿ|¿´ÝbêÀ 6Å`&ÃAÐGgžŽ?}ÌAïÒm P昿]ê¸úI2”€Òe9GoXÀ-ƒc%¢+ÕA…¬(‚~X)4ZC¹òo£hÈj4Þà$¶C:q„О?ô*¨“âÁam@åÞPŽsöPÇþм®Š2Ûa߈ö¨ß `”ýŠVAw”°qaïHP©w½&Ö\O'-f¤Õ(­7ЇÍO0ÜM—׉ÉQ!WÈmàVM,1fÉtŽÚŽÜ§ÖUºÁµæãw9;–b;s#?æM(<ç±ò~¥P”Í}Rò—¤º<ËÙüÝL¬~ÔOê¡”pg¦Mæ­ð„à>áþ ’ò†‡-,Žä¿Baá$ÿ1„U•YJ¬©°˜Ò+szò€«,ÈêLd×%7>ì¸Â5§°,¢n÷æRôk8I6—n²8À×þv|úþBÌe¥¥ªòt„ˆô ‰(/¼DøG9yå,æ ã‡a’tßÊŸí—ã/Ÿ0¢uúŒZS4‰Nói<¡¤3úãŽMQr¾i´óã˜Àí¹Äœ¼ñ‚—žR ü—‘¡–Ÿ·æMäç…»@h¼z G0œ² ›æÄ”á„R‡òRu:öd!‹Ô´9ПϘ[_Uç‡Ô'8Vf”¨/Q[% ÅÕ¢Û¾ÁˆÄa¤^ í²hu}/õ¹{pE ?Èì0#Ôä¢r¤á¿ù6OÆÄ†"¼ªMhù¹ŒpCÄ=–ÑŽ„59#jÀÄ^ŒéFÑ'1¢;¤‡æ4‹Ê’  ¼•(Q*öõ)Jê+×±Xì|}§ü:o^¤1¨s°—b:¿{"ôÏqk,ÆÁ›ä›êÕÁºx\]D7—Õ•)àh9—ý°¢wRÔÈGÊ8£[RVð”NÏÍá —ýçœrq–Kðã… ç".®Ntö ‡úœ·K’b`4£Ž8‰K>8žÂüã "šF"^q9W4ûš 1ö±øG– 5IÜa㹋þ}T|ïUþ³VùWóƒ|X¬üФxáÕy ó×ÇŒWÕî8.Tn*°¬ >O§ð°{¥·ždðXA|cŒÁÆy}QRâöS7§r5RSEIׂ´´z¥¨‡µ)NèaÆxMAñöÂ.F“6_­üØ\Ûý3|¦çƒÝ·û’Ø)Bƒå|VÔF¾'˜Eì„°ñÞKlãÇ"j™ôo­ÓrÇ?«Bø˜5պđг.Ñv ä,¡À?Ä[À/%œ¬rÉV&¢Ç#j$ÓŽI(ºÞQiáè¨VgˆK¬oÈ»n_¢-ù…ÏRM݆¥GOEîD/ê¥ëÐ E(vÙkÿTJ‘A*ÒãÑ1l‘>0ÇŽ×íàÑ™Ë5;41‰0|¬áE¬]‘¢TÑžGw.ó³VFØ€æLÆÇ¼lˆ, ®;´ÉhÜqÚ]Ç”“ç@ÏÂ&òÍ$ŽXËe¼{A#é5s1~6ì`g0!²çâArÜé 0ô`ÆqO¼uAb bë¶w¦±—#kßgœ3ÆØ½‰Îh™öÍXœ„8LßÕÅ¢å4EöÙÁÍŸ³ «d.;?;û´ø ̨”-%ƒùªÔ5øU}å<¯ZÂ+æbz^÷Ÿæææ©1Äþ1©²©ä bQoe?ø„+jË¢öDnÜÌ(é,õ‚é+PsüA× Ö00lJ-æröì± M,v\a1œ@N€ƒcf²Ö7`×C‹$ÿoiª¹ cókíÐ ö1(N·h¿¤ E—övÄJê¼´iéŽ2È’(š(±‚ ·_óZ’3;˜C`(\H2å&À~ÞØ?ØÚݱ€É”›;8ÜNǂŠ7õêíëý½ÝýC šN» À·ûÛ(xËÛB´mŸO tÓK×.±ßÅø4dNDF^CÅ$ÓgÖ±CJ¢ªŒ+hëFˆˆR¨`ˆqñ  OGÆXòFÃ-2tÒŸa1ÄU^C\«ïìîl8IKœäìSÝÍ­×̓­Ã Û©>«]Rg”Éy%•*@‡¾ ³ ®jwë0£ëgeöœnµ­º`gVB ÞY¬|Y¹Jbh¬î­=Fç/æØñ6Þ 'z¼U£Œ(I¡T¬n&r.éœþ°åä³"[`Ó1+g¨!](Yì/šÂÊr8ôr«QÕç Ky2Zô7Šs€”u †ÒØ¿«'ÀºÑ¼ÝOÖ.<ó!ªytkN«Jº†NT˜}fš©àS©àêfç3*À\ÕÔ—£œ¾^ø<{ŸHÝ}çˆÃŽöÏÛ…•qý›5’qÑ¥ò9šŒ@÷Ç÷=‡–Uœh”>XiÙ‚¶gÉnœ7Joâ [ߢq mM>pЉ¢%&ø!ÛfJã´ùØ‹O9â+YrB9Š®…LE Ò,‚âMj{NŒá-ƶ#:xêëÿózoOø½Q×#™^Ÿ¹ø'±+«ã‘×j¾AÝΘ~Ýq™à;ÕLFØÌ Q™Èšoæd”H¡šèƪ9˜gþƒü@GÓ%ä 5(˜°Í®‚×׆É%x^Z©ì­]F, nNêäQÌz+ø ^¥µUütNQ‚>ù}¹q{h·Ë’*¾ç¡J€Mfѧ{[c¨Tet•,­:NEݶŒ]?&ª½•7ôÏMÞI(ŸÓ²€R`uîì¬ú”'›[ž3ÍQ(†É¥Ü5õe$õbÒUH'¡àTÙ™‚šÍ3šºÁ(œBoVi†Ñ†›œé%K)£(én:MòdÎ[vs  ;VÒ¼Tâ–Šy9|Ä+qŠD#E <í ƒ&@¡ …~ŽáxI²¦G8 Òf„ŸB‡<0›çõÔÛ aÕ÷‘²ÈªYd*dqâCixyÍèòº±·š½STc:õ¿Ín%Rã¾2û Î gñAöæðeß5ú$ÍzV8T)ÉïÍdqkbÃbP;¯ÙÑ»­AöÞ‘Y“{TÿÁÌÝ')XÏ0m‡w—DŒëÓ Å¨¡×hGk4p@‚È%ºNhÇÔbfÑwsøAjï¾3¶CsùÄ’›EÊ[äÏðc±@z³ P]à««{5k ñ ""3\ã§aÙufÞõçÅ\Öª‘»—¼|Á!Ö˜¥õÑá^·*ïý0Æø¿h 0x­Ëªa ®q“+Rl±Ñ2Ob}ëþŽׯÔZÙ¸í(—ìá§×D½€crd±)-»!Dn~ò<„ýŽ>RÈa þCË^O/@†£ƒžÍ_Øl‘®|1L¢sB6sLT)%~ƒ^^Ž£6Ý‹ò¡kR, ÒÁb3Ÿ:…õjõûõÂFtœS‘1 9Õ¿5D¥_9¥Î•iKLEÑÞT–‹² ¥Ó æT(ÑÌ9 ÷© +}áæI8ªK.ÔMÍÑ?¯×„5¨XSõB­ZÆltA q97£ –¨ž0Š õ‚ï’ËNFà 2®q%>µÏmV…2£J–ù›ñ)û!Ù,80ê,r§à[¹¬0dVêU\¹âø#4ß®R†¡‚B§*¶h–c¾/‹›º“+PZîPðP3¢ea:YF-]½8R3}”7Ï0å‰WJI­Ð©)mÀ@af·ó(>»²pñÛ´ÔG¡ 4í·ËhŒ„|@Šf˜8×cÖ÷h¼óãÈJUD­š>ð¨Ä¤"yˆjD¤HK%ö´çjm4,dŠÅ!ˆYþ1Ä–2J­¶‘G—S ¢ŽŽÔØ3•¾å…£x{ ­Ü¨w &Fì‹ar9Ø=Çr¿§ yâ ¨éRórDÃ`ÃØ˜ Áç™aÁÀMEQø&C ÞDTòÄIiŒRÞX½¨/¥è1—½01â¹?(á4ÇŠÊ­0sÀ0”®ž’Ó4*bYm3ƒèºŒ°«7t³k$\+¨Þzÿ,H:+›U¤ê£~²LÂl£p÷€¿XyѬvëHæ^ôDR/8ñDÃT$ý§ñk ÛP4<Æ(í1¹¹ëFýþ%X‚|,´¶,t·˜väǤ‹ > ©iÃY9¡0ÇaSvÀëÄç± E°µ€`´ÑÍ)`k„Cðó¾lÀ¨uœ,:Ta¤Gr·œ ¢QØÆ¡×éäÒîÁÂGóFß„ H§$TŠhÝK}`ÅósÏ ‡A @T“ †…>,`(h±3ÑÄ"†ËŸìB“8)¯%T{£î0€f±¨³š»™‘•'^¬W,t”৘^+–4È2”~kçàpm{[‘yä\?󦑪զr3³­?BýP¸ÕŠF!k—÷ý§è­@—áÀ#O1"îzñ)³¢t÷åKτ՜Ö@Bêe p®©.àß…÷­Æ‡”Çâ­t|1A¿éOn²YZ ˆìFñýÊAOÊ}wø³œ2ý™š¡– ‡¥¯$9»›5Ú»bwýP,WY>Êñ³#Øÿ(¨7˜BYx]“jCLxXyΆ†<ÅÃQ§ƒôvtJÂ8&ÿxÏUµµˆp៨•·"|TÀV6‘,V_ıB©ë ÷ßøuH²©$Š’”~ÎÓט³0'›0g¶„J¶f7µ´®Wø£G¬+LŽ›Úq¿ŸL+,ÃT^3ÕÂÕVÃX?dêºÛ^ K³½3ÀT2X ò+$NéÎÚÞþ9úø¼U{%ù«èÀëfiãÅLOÜ“µU*zÇwͲ®´sÜÅõ Zu·?Àï>Ðñ1ßK§˜õ˽tÀðÇÞ'$5iˆAgÚ¨Àm|ó÷}Á†›×C/ÒNÀ@Vø9„5¡˜bª,³åÕý7SÉBH—Ò×'ŽdY:@ii‹B;þ«⥎§õ ,Ç›B]Ø׈¶²6®Ø^¥]’„ªó­]"g…††µ‰|lC´†óDYó.1Z±=’ HjÉ7Pž„@‚=¢`²R¥î©c‚>”µ¾<1x¥ªH(5q°¢ïµ>‘•¯‰Ä5â@`9ã+ˆeyÖËoÓ,`+0nWÀ÷©©àèö™ƒ%áÿ×·ªV|FRDd¥+O%(¨S½b­ÃxÛüç1Zµq îÏpˆ¨@—®]Û"Ûùð;³é tÝÅ#•@1±©nm+bVs)·¿ûzí ±‰´zaî³Lº*ä2Ê4ö·ö¢œ4µäúÚášSìRhsüôñc(|}.Sù £S«#ŒC?“^8ÉoÏÔ²¿©ùg8•{ß:ÜÒÔñÁ1“\¾ÇQãxãë²ÏÍ„Ÿ9<¼ÙåòôìÃ^ܼ-:ø*ʨºz!W`¶Ž(´t; ÜÓQþèáÑÜÑ££ L1ëÉ4%E²áãÛF-sõ*$­c~RöqBÕGâèÁ”ê%ySP@ ™Õæu z? †3±ŠŒI&,ŠãcŸ^]DP®žå”•$ ÏߌbdŸ/Ee[.(å°Þ8 @Z¢œt{x¿ì¡˜r•í_ø ‹~×»„ƒ¶8!®S{ÍèÁI½Ö“”•Ëb3Šþ‰6ÀaŸ¨q*;d.R° FsÍ•ªxº!¥5ñSÜwº€Fur÷Ç,fÝBI5VÃ~òªÂª€öúeAåвד·y Ò^ÿCñN|θ²=4¢NK,ânËh±|̹··só¸‘åßY÷´0í ­NôÀ\YõÍP¬AmÙNMxãúN¤ ¸POêâb¬bn§ÒÍ=À.luDèDNÈÙ=îRtÆ<—Zž’ÑtÉõžãOé‚!²9ºÀ¤,”¾ ‰£Ð¹$j(!¡ £ TE>ò±¬Í~áùh“¸Pµ[.Ër 0&lO-´“Š´i·Fp(iûºC²Šwå‰ÎÓ…à¼A¬®ÕqÕ¡Dï©ØV»‚PÕˆà›Z { ¼„ÝhW€:fš—¡Ü¹úýwuŽàÅPñõ`)Ùkɱò¡øŸ‘¡ ò. Ö8Øm­»ä.Ù>A1†c[ƒK9U7e?è%`HQJ´‘22V£ŠEÔ¥¸À6Ð]Ñ 8©Ïñw9Ö/¢ñSó‡òµ”úÚ<ÏeÚ‹Ì¥åA†PI1/`­2&pŒ†Ðg95_T2¥#úC:wÎ/¢6€3NVXs%ÞØÛêÃÈÈ‘*jöƒvé! ’¢…Q!ÙA!ŠjvEI €wî;’Ø'<âÑ„æä\Ë3dÓÒÛ•Z©L}¼0Æ‹ú&n¯õ|üèß%­ÎeçÎKFÒ,‘Eî|$â#=R'¬&›:×iÎÑÜ£DщíYç– cƒ#äwæY}¥¥#¤ô1._”/ eeJ‹«ƒ‡˜Q©N§z!^FbîãG '«ñÂ*,Ï-,rcZlߨi¥º½ŸÓå?"3±qÑGúi‰öe(ÍáŠðK]O}lµÝ›$äd‘3Z¦pf{³up°µóZÔPÛ>ªIqœ†ªœ† öþ@rLH=4÷™¨þ^)™b Òi^,ÙÒ±Œr¥db¬ð²˜‹4Xp}Ê‘¡âÚÙU~N‚•JWºhë Lüµ.ÔzMYƃª›":àG"Gî&ÞÎ BÁºFEa¼ÙMµO Þ×ãò·'Ù!o7Ïö§™²‚=gæ*²àÎuvÙì¢ykº‘Pók¡G·tí3³‹Dön‘¸@ï<%ñqV/^/¡ÊBž)ª3æa£ÿ1:÷Ï`REÙ6\rýÐ93Þ¥ÊÜmÑzE:è%Ór‹ˆËÌ6cí52-ùDöö¸½œF¡Ä¯ <Œ’€9E9[¤ž&uTœÎº˜>”SÇÍ›FanLP¾Eúauÿ¨ˆ-“–Øƒíæ¾§+ãéŠ3jß1q–Ov›sÓQäFŽW ¯Úß¾,©IZL˜škµæSNßJÞ¾3’v\.O´¢Ô¦'c¥ºâ.å®ÏÐ3“I;È2!Þ—T(^ô‰ê6¨3•µ¿ @2Qtº„BË·°{üC3›b8dœ¦þÓ—%˜ªo[€u/N¾„w²•8Ÿ»±š ªzí Øùf¸ÒŸªd“Uh¼ŠÍ›ŸÖ·ö›ÖÒH*Ùˆ¯¬b“Ȳõ‡ qçÕRnOV•jÍ ý°RÆÍT9Œ¤ovU”djçja~œvÅ_‘zŽ“!¾ñ.pwŠè¿=lŒ†A7.‰ëà¸y¦}Ga˜úþ¸Z›/i‡ÕI¼¨Oj°.%/ã¥C;éÏN_¼Yëx¯ç·-ª f`†=l²•8öÒ9ûÊ]®³âu\q_îÖ]Öû§¸uwÆÈP9˜“ü-®ÞýIîV:_½'³¼óO¢‡Büÿ1e˜|V—nt:—e¿1~zí—Ÿî€(™ü3¤×ùë=¿<ž_æQR¸õÍ°ÊØ¬9·™¹ñ³~ý¥Kh‘X¶2í Ÿ¶E¢ˆ|ñÇŽ"n®p2÷ùÍÚOF^á `é0©4ƒÆÉøÂÎFšrád&Íðà\‚,©ûŽB¼ðýB(O¼ðþß–?Ê…æÂIá£Úm„Ç&÷TÚTÞŒPè@´ÊIDüâÅ‘ô@Ä·Øu¶ˆOs°'¬äüƒºPøÇ?þñ·¿ý­.Ǡίå¼è!ÅZ x+U€è—ˆ$ÑïkVÄú€ÅA†!Ìë¨ ì”Ú„;ãHiFt&À¾Þ£Z,íJÑF¶ðïó²qR¯\LKš› ŽŠÞ|ýN¹†CÐÆadzþeV²UAžþÚ³—×—´ƒŽ¨a8¬ÙË1g–JÖÄ­Mß컬&úÀ«ªv4¬W­+,çC“c¥e×Î>Ôjמ©Ù»t¯!bº&=Æ)´/!>sÎ&çlRÎ4'Jë‘s¢ßŒ¹ŒB«4,|ŠÏøL'QTÎJbíMs}csííö!:G{µ{°uøk}‘í‚ÃhÌ÷š±„û°o‘j9¤ì´WÂÒ<=ùƨ1 íéf¡ÁSd°S=\g´Äd©&jêB7æ±ô`÷ߎ_­íÏ.•rð°(}»Àcxç~®×ÈxµC$¤sE,VÊU÷~ÜÝùuE¨oØtWÑgàXeˆ:çDœ!;Ǽ»?ø´Hh¶2Žlc–B *Û®pv 9áà>¦f­È(ÇÊÎeåI‚Ê΄üڛ櫵ÆOÛk?¢'RsKGu¥§)X›´Fí›J¼ý¯lÍ9s‰5Oé²×¤AÁj™f «o£BŒñ1ú£!GY–B¶¨Û%]$: ü>+.å+[Õ¼$ž€¬ì Z¾¶|:ƒÊ–{]”L]­Ì¶kKíªâIý!›åN(T%ˬÒÅöQÞµÅ?ÊK5:&µÑ·s²а(¿Öå J\)Zã××tÂùÅ‘£e^#¸)¹ËT?[Ô ê]ü¼`‹ LéëU6•xØs$EIn£%ÎðRi Jœ˜¤'I€ocAÒ{f½P)ä8&gÏ—"Wu?Oz_è9t­±½ÛXÛÊ/Ÿ*y"£–BÈ•‡šj^·Blkü«<çskowQaÈÇ, ÒÞY‘œ‚zS;©bŽC-áðËHõŒ b}[;›»r¿ÃÇŒBX5ºÓÏ“¹À& ê± ß@ãÜpˆ4œâpÂB’½·”ÇÀ‚m…Q«þP½ EaŸ–(uÑlÊm*×y-TÃvW¿8û+ ] ´]= GÕhpB‘£€7Y8öº jœ–kK•Åg ½ødþÕªøùå­€ÔK Ä©5ÑÃDQJt€BäÈË'é¢ì¦#u=x3‡¥é N€½-¢æR?‚‘=îrt†Ãµ=Ñ`À¥©½ú¤ÇMZ‘y”gmZBÖêîˈj2xϹw é[uíÍáÚ>Õú:&8ʇðNN(žÒ‡ò p-×ßcêš²4PfÚkƒÈ[HWº†d÷A­lûPG¯‚ýO- Îñ°¶ø|é99m=A}K #Ÿ—òY€èî—…úú"Q5&gÛ°*InaÐ+h™&4vDŽ Ø¼žÙi¸ü‹>lœ¤šÅÛ,À"áŠEé-1êÔžŸœÒɆO°$€‡‡ztƒLÓh‹-‰/ ;ë…ÜnÔ¿Ëå~ÅF8MêÕCGj²qóVžHåW–‡RÒ¾ú…©Àae8F£’¾Òq+T:(ʨ«¿Ju>`£ Œ$“FìxÁ‡½>ÀæÁ‚èáõ"tN[Ös„j£SbÈ+áä¥QVs„K}h¦ðò@ýÿ6,«MWaŠÑå$ú܈«¡?\8 üójÿ´ÿ÷ ]òxée.'ýR ñZ²U>ýCd2ÛÒG7'_\ݰ»Eè å!i+{ÜcnJ“Yæ¡ÿ¤—G“.wÊÑÊ‘yÆ…ÁÈ¡S¤3_­uéÊ=p 0ß“w‘Ÿ[k46ö›°{nìoíî7÷ß¶:d¸tcðÙ©!qŸÕ‰ÐÈж2zOYš{C™M‹YX]БeÐøÚµBjE¢,¿XWé.N¯árÔ·/N{¥÷õ²¥1íG ýŽ(A•V-Â6r©ë?6¹âC˜¸[BfZIzÐá”sDØ›9ò*,Ÿî¥ÁÀóós½¯ÇQgxÎ~¡%ì…—O•ÐFSbåÖb|7å%ášôAƒ^ÃsÔ<5[@z"â(Sµsü<åÔôðâø$š8j”KÒä†ù< —Õ±ç€{¹./÷¹—ûÜË}¾´ÜG;èë÷-}ïÞMôÒ÷î»é{÷îÚŽú°èO}ih·òÕwqázës¥(ïÞå³5ó†Í@Æ:¦ÙûñLšüI%‚ï¿-øï¤ß^£!àÿÐBÑ´V· ƒ 6!í'øoþ»è6šükâ¢NU7°šq[íƒ Pߘ2ÌË(#8hàB¯ó×{e„ñÊnÜSQÑ¡­^È3ina=ª9ÑUÅüB.„Ã\]çÆà¢C¼aNPUîJi)ºGi›¨'¢&òHô¶¢”zUòdŒ«íƒ_ßÀ#²iǘ€®7—ö݆aT[«¾ý€ó9qkeÔbø'xcÉÙ§ÛÍK¹|;ðNBv)G„Æ,3Å{J$Ô*\¼ÃQ@Ò⇈>|ô¯ÞB ‡„É!-t-9ƒ/» ÃàI©… N˜ ôß,½Y¶y…ïÿ->Ì/,>JíêÖÃWK…fk«Ég0ûÂx˜’sè5q ôlš¼óy’â z JÑK%qNUÂü›ŽmbW›×‚ xÕ‹VÔéÐÓ°Óo›þöÛÇü ŽåÏ ýö¼>ýÂþÁ¥T¾ˆÿÿ¯rÊ 5 "œªÑ4¢òE·.oÜÐjdR`å$µ¥$µ·çì/GâÎQø'ijþE¢u˜y¨cT–ªµeéçK^ƒI¶[Jõì›®aT ›êHº‚ÓÛ)Àe¶1:”G|V¾V1¶>n¼ÛØxw(ЫFÕ#<}_µµ#iÒǧ=*"mÌVKmé.ߺ”WwÒ§Ñ`Xiƒ,y%ãÂaa%£Õ&†QÎ Juì „C’T¸`r¶™Þ¾Jsä2}ï jSBOo¿øò$„C¥ôÌRÇ£¡$êu8ßá.0«X²åÐa÷’=¸TsˆÇWÄ :¤Œé”}%Œ“=;‹òµ’{ÀHºjœ*ÛÙêý‹þÀõQxÿïê‡ù£âQµ:TŠM·¨¯XŸƒ=¤Èg¬äÈÁ&î% 1‚¡ThDh»"yyƒ1=ï’}×µyÙ]â%]éá&ù±èýÀøTA©¨ô††hGq@‡Œ»ý(ÀଔXÅÒt4Щß"n°EŸ 5ƒQgx¹‚åÑ—-Úö™Q!%êPÝJEºøLNN—I0$:snpjH$`OEÎ !Ü¡{…B–k +:)Ñž»=‡¦b2¾¬’B¥XQÇ;€nÖ=ýÁrŸ=y‡«‘A$¿g–j|“ø¸7L1ÿ¸Î-ßø3¥"Gƒ%½ÑNíÍÃa o$nÉŽÛ²¢¾2Ã)‡³€”ÁÊ`{o_§jElbòÄ0—qʸáðKÒÅ|¼Â«)ÃY&)VÍâèþ’œÜÈÁmuÄ1p[â£}äàøp:©@ÞÝ>J¶‚(žûC&:&é g®\O‹tü\0RcX9¢e¹Uãòä<Ëä”×Ô@fæ9RÅ êWÑõ#F9BÎÏ^"Û¼.i¹ž“Í;éÁ=½BŠùÊ>R™Ã“”}ë™°Y¥05R.m¾²¶oMá¿HïjëâŒ~53)ÇŠ°r]ö‚Ž+ë&ÛäÙ¦lºz³ Àb‡2DîöGöA{)ûƒµoð÷»[=dÅN_¼ˆ‡í ªž¾L²6·¶7Ä|ˆK–-$æM¸ŠÑ0_ùó| ÐKJº:<³ÅN V‡ãàÛwHf‹¥E^N­é8ézsêÒaœ ­ÆÓÞ`bÈ™²æeÁn¸Ñ*Ç.|$ã"?XÐfío#ÄXHhmx)W¤™B¬ì‚™x²ÝSºV½÷»î—$“t]m¡ºIU rþbã]øÊLΕÈÙÅyŽqÒãÊXu—¨*wOBƒìYÙÖ*n£–)¯ß½³ _¥j"–n*ÛŒúÜgõH·r‡ÕMõt+-´a#çXTf9'JLÔÓÅ¡:¹¡—YÙ[qN´µ‰ñÂyÆÝ´œ¼zL䔇dsdð5=Šù ë§~M&íÚ Í逅<¦y¹Ü¿Ñnؤ!cF³¦:÷ 1Iþdst[š÷G—×›®[P^3pch®›!!mKRΤ#`C0“$4ç±v*JPmSÝkV‰v mL•Ý%G9:IkŒGòÙ¡Ž©EʸÐ2-œdWØ`³Âk6ÆÚÞ©E¡»«¯oì­oí×Ù-íÛïªí÷cÖÉcι)F(áµ›ˆn[X4ËeÛ;“ý?Û‡- /‚ÝØF¼é[º˜ …ùQº¸IY÷’麽G·hìS&JðÏή‚3¿,þwD·!=²œ7 á퉽IÎ1¼ì’Þ—ªLKWÇÓä$ÓÊ»šœè?Œ3ÖóóôþÛ(úuò_à ¿ŽîjÐY*aÌGã4”j“ª9Y΋ |Úëà°Jý6ô«àCK½v›T_½®Ö/À ›rŠ¦ÝŠjƒëX¡z7ªôÅ>Sp¤§óHÎ3¹µ»+eªì´V·¡—9“ü¡Ø‰Î©÷g6«÷3õPDÖ‡–õ ¤WÕ åÕ(Ì0i_ô³wÏûãû-Ü®WMß…Ýýü‘bL¬Q€Þr‹tгljjãp?nšÃ2.n94ã=A±Â[—4®c.x’CS © Ìì"£ìªÓ.1!+G·³" Aç!ѺqA&æÉŒȪk¢ÎS±ý£‰ªŸ(c¾Y |“Ü$è·Íµíƒzá¡eg¯3aª›‘"‡Mn)aòh ¶ô`V¿‰_hÓ~CÝæ¨ž ´p|¡q>( Åf¨?6-^öý[Ú.¢Òž¾¼ÖÖdÑ¡ž~Û‹ä/¾ôN…¡¹Éu#ìBíH[-Æìÿå]­,om‘•õ €Àá8ŽNF± ûÊQ ÔæF “lÌDŽ”(Ì ;ÂcmvG©4V¤’ðÀ—n¸XŠ÷*oßQÛNZ-éµÍ!ÒMñ¤µªV"k‹Âz²V -TÞ@^ÇÄ"ß—›ªí3ëùª4X5%HeÏĉD Q}tÑ8“_LUUidâ¹Ù÷9¾ê¹_ø†EPVtíú[Ôê»ó™lF«nØ/>ÕñýÙ±Ø1æÙ¶ÐQGi7®6eÓyL†dy³»»!J.ƒÐë÷»AKúCÓë¡#Nh" Ò{:Œž>Æé-jÂðÒ‰‡€i¡xʨÉjF¾&ÊZø6€ÂëÈ“¬ðØw”œ×DÙu©nÞt—u›¨}ˆžòÈCGœIa„€¡Ëi'+“;s<6ß$d´­Û6µiR÷¯JHRð‡óGÅ÷Úkü‡ù£RinᨶÐ/ˆ¢ªèüGeÚÅÿÐÉb ›û©‘ é®õЙ=&X YLjýn £|"“‡ó×]äPlÌ$'—HMZQwÔ ÅóEQ¤jŽJd5%œ;ö @€#Žã,×6õ…Ô³[¹ŽâñÀx%(åýÜùRæ4ö%­Äáñ²”…T ת/=ïRB«ŠóA0”ýf_b=éþÎ'só5P%ºÒ™zA8Š)k¾åÀ—¼ean %gPÒ(@¨®2ÅÀ˜GzH€Q%‚¤Éª,n³t$ÉD*ú©æìCŒÛïN¦%k²U!K&ï¤ ŒG >ˆ{Ä™‚,_ÒÆVá¢Òo·Y‘ ˆ ÎËó6-{ÿwß`ˆ¶=þo#ò€¥:0#—Lº‘1=HtŠul”W­cbõ·Ÿµž‰ßù·_Æü`XêV¿/¿à‡Ä¼XÆŸÈ ¢O¸ q÷ÙŸ "îÍ©k8JçæÒg'ŸHSåtó¸vÉð"Do¦j?nÐzb'ÐÀÇ3Z‹°wF!Ùì ²¶ú ×÷ZÖ +L‹ÅIOŒ[p"Ù@²ŠW«9þ+š\÷›òý¦|¿)ßoÊ_dS&z§‰½'¾ÜÁœE÷’„’B+K2 Öõ£9ÝrBu­=ÆÖCd«ÐÉO•Õ%m®&žó…Uz‹ž™ˆ§öò±yKÅ·ºaÏO4VBÃŽB kÜgâÒ±„æççÅšuUdM©*HFÀ' ñ¡ÿ.Í0±K¦â É©JYBOiÚk?o Òs»x]Îi'JôÛ­z‚ò]ò-7ÎÚí:埮^óìTÓk9 üC¥Ñ|È¿4ÌHN—ô—,551®²Fl†ú@j!^ß‘ôvpŒþ›Í i+꣆N·Ë}=? †r"s?¨üèãToÒ7†º´z¥Bá_Ïk "Ù´^Xª>®>-ÈÔq­dç_wˆV u[Ù“ªñ)*9¾á0JßrÄ!TLÞÑq5'ï}uAó=eÃÇIi5K»'ØÇK ã`ÚKåz|¬ß$ƒ…¦ÅÄçŸÊ;Îr‰2Þ˜«§Ò̬Ô笗œåWÝJ¦ Y¾]Jþ8a>N€k‹óg€™=3T^Žq:ì­¯œ8ã%Æu§Çœ‰m£yM´èc6žLDŽ$ iœÀ™[ì1ö&ú!‡6¸V_ÍWàdjQ‰ž!0AÛø\… åI<×”W.[»móçÀXÎè0óÂiT.> :C†Üì«5ùrG¾ˆü»S–UÁ9Š}Ÿ9ϲ7¤uêa$Ÿ‚dBm¸¹‘‚ñe=7¾\ý ´”Џ´NÚÅ+²ÎÐ^Æa0C©² -œ'½2]補•`»}^¨,œ>®®JU³ rè?½HfG.0ßíTya#kñ&"‘àW/,k:ùyú’4u|T—”×\Bæb¼ù îƘå¨>¥V#MÒ-#ÎX‹öãó¬+‘òòò¢Ñ’ëž¿î2¤*'®B™Ã,BUD­Aù>i >¯¼Ö§¸ëa_P½`èé–K½pÔÌá°Ã™8QStKß&Õ± )εñ$Z~¨ÍÊtÀÃ4@½GÅ÷ùsGGŽJ GGG5h³Ç5* GgÒ%r;"ö‹Ê—ØäÞÐ[¨ɵfÖ®Û…Y‚áˆ$¤#×õ.QË£:doÂx´¼¾/‡ßTŒ*Öº§vÝchBÔ‘ ­6™s ê÷Æ P”Å£ªä´äPŽ ü#«¦×ñµz$ŽðZ­ ñi»â¤#…¾ã9Ê Ÿ Ñ…q.Œš˜Ãêå<ömžªØhü¸[/}®nÿfý™ò™óÜh:ÇëPŽ(±~âF”ÎîlFÅ!n#œA†“P’5¥NDñ¾pïäªZË6æEï>%ˆ Ú@¡ž9ºÎ1va¸3½ƒÔGXÓK³ ј¤JåßQºQnçi¶ ,K\²#þß ; µVªK÷Zìˆ÷ëî±§ÜzÝsT‚âÈ9–¤5UžÝ"ž8YÞFâŸÊÝ_¼hnbíM”¬¥·^QõâJ7. ± Óšv4bôèS Ã3Tãàèlü9. :IVb¿¤–´²\dÚNÊjT8ŸÏ]©8Ô@gi-”8^wÃæ’ɽڤ"V²~#¥Ý¸ ÀÌJdº©æ&5Àì%Ë$WÉ­eÛL¡V'Güì»:iµnu0ηµq!QÙQuúvepB<ÔF=ݾX¨ 7j#7vîoµ‘ŽƒÚø q3¢F˜¦¢60œó4¢qCñí‘Õ黋IÚ˜’´Q·òÝ“Š©Ia¼¾)ú`ÖHF[sSÐáÆqHãÂ~ê‘^´‘Š.Ú`_V÷‘ES‘E:°hÃq"¤I¡ÄŽçŽFÝÈ'î¥Ó4'“ã».ÏwG,ß=ÇwOƧs|÷ ßÍKK&‡›Ñ‚û¥?aéSa*9ðÑú6Š0úï!–ÿŒI‹¸.ò £x°0j/º;_j-+× Zª\%¦ëÛ :¶ãB§; /‚V(Iöp\oξ7<¥åÙ³UCØ]ËŽq¢­=Ú¥nBÞ_™I™{ÈflÖ¼HoA‡na†F»ˆÜ²a[Ø›ôTù­ø1:dž”íȉ1’ŒcàC²êf“yÙ'%å¦ÊTåLŽÈÙõ£Ñ@I:™ÖRI jU¨ “Tl1±èXÛXö2½l“Sú¹ö}A®æþ‘×tó¿H`÷b&ÎRòߟa„ð3°.PµnÄzfƒºßƒîÙÏÔ‚ÏFº{ô˲ Âíâ†RŒnKËó±”(!ŠÌ¦9„+SéÍmÌ7HQîå•ߺ¼òÛ#0ÿ}BËœÈê“!AʕƽhóNE›R—0—s¨:û7âÒP RòjXZ}„ÉÐ ¢úäнAt†Ô\¯!éy¬¹rl<‚+—}7 çmZ,m TŒ¥¡xg0±upÛ’ÄQzËA³áŠ *g¢ò³¨ü&ß%]nŒ÷( jþ«†Kõ³”pˆ•L¦©hì˜ÐY„„”1k‹ÞQ7øfEzzÒ¾Taùùèß§j$þµÅßÞŠì¶Ôr¶5±J”]#QH"Ú~MôåËÄõd"{×ñ¢n-jz¬¨¿|¤¨o3NÔ—Œ5SŒ¨ÛEˆ‚ýÐŽ¯N„(*+:”Š uûÈPë†j̪uë°Pé PY!¡¦„j™xPßB4¨kÅj%BA} ®jLT¡d¨o Ô¦å/ýi–Yºuä§Ö”ÀO­ÉqŸ²£>%c>MŒøÔšð‰r‰ÐLÂ=Mö4b6¸ëÇzvEB@%:T‡±u°+Ϙ&MšPt™o=ÿáÆ„ÞCלj.YœwÔ@û+ì3ªÞŸ¾tÓ‚“¤—äJWÔ›ˆyn’FÝntN|!ÅÐ`{§¨ ]¥ë­ýÆxR}VˆEßõ_zŽoŒA„~x±K‹‹…ïêP‘²z­Í—>å#¿,Sƒï’\9éØ4Œ€Ì¡ž+¼Á%_À8 º^_”m¡YA[?âÇÐÎÊQÌrmÎ^‹¡¼+£¸ó×;×ûžŠ:ÅßEM¬ˆJ ð±`ëÕ8=¥¶b†ÌiçÉ Ðqp¿ëá0’7¦3Ð:Hf†.l^E¨5áL3¤‹ÍÝÝâE gŒÚ~Ñm=Õm½6Ún<æ¥} Hë°,Å­a^Ø5ñ?ç;%Îæ•V¯Ìç%û³,Î90¹ïò¢DEõB- ¦+ÅùÒtrBe¡ NZ«9 ^ÎVŒ”\¦@4Ðá:d(‹ÅêàóûÅè;Ÿkæ3ÌXFLÊœJ°,¾òº`éžuë@Ùak°Ðô‘×ÅQîAe صʚ'*ëÍ÷Þ¾kì¾Ýolä!ñ] ›ï7]vwšÍ<ß(Á»ÜhØz@[ù9Bܾ$œkòe–óáHò9œ¿@µ+ŽÎ Ž ¤”UvŒÁÅZ£ÙXkü¸Ñüym[Êà2«"iÜÅ5®){È1&üvZÜî|26]ЯÖ6 µ³ídm‰O¶™ÑÏÉIOŒ@îÆŽ¥’C9‘Ñ•9´ÄÝB ´ó £Ê2£ g2q±î4J6£oEÌ9~GÁË~ã)²Ý/G+cçŸ(Ë å…Vôú@æ[­*ÜÔ|ÐνýÝ×@L›æn™#àé+l1<Z¾¼ŠÊëVè•€Ï"+ÖòxGwªF¬‹ÆŒRT–‘Ì(¾ ‹a¥7é BêÎ¥fCù†ÅM´×Tœ´c×.¾1Ž‘Æ"@ ©­e±dmUúZ¹xÍ‚%,ˆî¤žH¡ƒ}2¦mã.€½¸ì+„R+2‰&1«-Ž¦èŠØý)éÜ,=¾¡òkœõ™ æÎÄÚìç!v"`qFn4Ájǘ ‰IJ:Ïw ¹ÄC±ñ­¯Ä[Ò€Ñ :’XÜ}ÒÅ5²õîÍÆ ž·€/?Dx8ÆxhŒã†Ìöj¤´3ùüDä#—ø¨v%Tt)8Ô!ŸÀ<<œPlE eMt¡P^½cËcøÓÒ:v‡£’–+®7 ‡JZ°1˜ž2CÂ%¯ÚÐ"r’Hãh®8ŒúM8Å·ƒAiA±Üh”ˆ?`Þ±g9Ïá,sÒ$ç/½-›@­¼ø“jmÜÇi½Óz§õ¿"Nkã>Lë}˜Öû0­÷aZïôއi½Óz¦õ>Lë}˜Öû0­÷aZï.LkãŠÒÚøâAZ7ˆÑÚ˜)Dkc\„ÖÆWÐÚ¸i|ÖFfxÖÆäè¬qÁYNlÖ›)zyd@Cs—p [tI@œß}¯ ŒUûò†§Íƒõ›ÉÌÌ?ß“<¹/xÓÿ-Oû· :°*Aò|$žY'$«rV gl}Ø5ïRÍVF„¹Í•l¯µÒƒö?üfÝfÅŠh}¶ª\U7*EÆWqŠ0ÄŽ­¥÷&ÙiÁÊî£>ä¨;#2·,ÄäûÅÝSválƒ7Z;ko6*Û[‡´á2ÁTVº8t'ðGOÒÍL4•ï9V®¬Ë1’tC%Œ: ”¼sèx(t†Ä¢…ˆ•‘ÕËü.ÉçH²ÐíÍß,ºeíZd œDÍÆö ·$ ‘3%I—Á]õDÉ4ʬï|e”1 ‡vÈZ³‹µ¥åÇOž>{þƒx™×8„8P,Ÿ[1¾ð2×É”x³ ³ËcÝ;nªHVÃBÖ1`ÃnÂL¶@ÂŒt†ä Z;*"Ú ·ˆÝT<黫úwkóF÷&"‘9*<Ç*Έæ èúYM‚ø^Ôhu¨IÁÞy]ÇŽÉ]92)Ö“Ûó.*‹W ÷YŒÑ}Pi¼ÐÃ;²`H¼O>ðBÝ(²¶ƒcHB߬¢ñÈ•^iØŠºneÎâsŠÚâ|qéߵũ©‘89Q:û>œÃÉR¶¢P7·×µÅ”W€”¹Z ¿„57ž6íúYž$R‹EW%–m‰ÔDêwGбŸhjŠÚR·› cÓdä1£yž˜/Ü>n­Ã, lu&ë3‡ÎÓˆbMOnŠ9w£ÃáÆÒøéü©S²¨ø¢/üûÝÂBÞvÑ}3®‰NÄò°è-¦;e–Ѳ Œ?…kšÂD®éõþÆÞ\5"˜4k€©ßoÈB¾º.ú'Q&|w|MÉ þ½C·òXš§™xÌysæK§¸®|FöAuØ)›XA{7•‹ƒésö¹=VŠ2ÔZ϶NK•Â_ˆ¯ 9ÿâŒEÚe,Å¿oaÖÑÝ2îv0» ‚™f/¦’ì™8šPÚŸî„÷àe7žùPß™û0Øä|¿1¿àãPMá(ÏÄ=ãV›>µÙ¿ TQÙ…¢÷ûq©$l} “U×óª(--#†qÐi#›§Øøïd*ü;æ'6ؘ£Ø¸K±‘ÉSl\‹©ØH÷ —­Øøkó31rL8÷Ü_‰ƒØø:,D6’e­¿¿±ñ¥Øˆëñþe$xZy[’%®kŸÅPlLã(6\–b#ÍSlÜŽ©èÌÀTt¦2›·g* Þñ|«`8‹M•2c±é0›“‹ÍlÆbó¿“±èÜ1c±yGŒÅæìŒÅæí‹ÍLÆbóZŒÅf‚æoºŒÅæ_›±Øœ‰±c³õ×á*6¿W‘aY‹ï/ÂUl~)®bóz\Eç‹r<­¼'Ý!W±9«Øt¹ŠÍ4W±©¸Š„”'ƒrã¸ä2þ)B«¬{+Ô@«œ„£ !ê‘b˜xî3æ@{®f·MŽå·JDï0,Éúœ•u•ËÃ|ÕˆÌA{†•ÉöVf'³Û¿œÜŸêݶnú‰­KI–}÷ 2¡ÁQ…BÂV°hmŠ ,wÌ01²7kì#Ê;Ž£îhÈ‘F¤’ùû££…èËõï+ü¨>²)~wX/,¼ÿ÷Âüo~á¨zT](h:ÞðÂ( Z^=Ò¨&äyø½n;çx©”áµm`hñæ°ÿ ãÿmáo'…² ïçÉšÎÏéöå34Hx¨UÁuæã¿Ps^Ul4ˆ,"¹Í·žÛëuÆÖPÎçÚlsÕA?Âe^¡}@Ÿ­¼J¬l¶öZÝ k™i€ó.¼ Ö6njì£i‘¶ƒ`çø]¢¾Hw²½¦¥Â¬©‚]ðv“+Û*sGáÎ DV²;Í3>gr–çu]‡;ð+3Ul2:•s肹ÏÝ¡&÷Ûëwp ¼mélÚŒƒN<áÜ£öÉG+¨„(çâ+ËKÖÍqt›::Ó‚µ¸~ÿÕ˜-»Ñ›œª'KBA[Úzú>µi…ŒÔè-gúUh‹G»#š®éCFYC"£‡~t™Í°­è ©ƒb+é¯rfô¯_·D_ù$t.MÉ Ü‚A mš‹¾Ô•…—¤¯przGWÛÄP¿Ðtè£"¾°˜ñT„β ¤oþjs½ëûÚ ¿K.;Ã@>P6‚BÀu:S m aû>HaDÕÄ$n¯O!#kÈ]:ˆÇ²(7½®ÏÃm§U[¶×¿x¼Ô0™%Ä™¨t}¢&× º€y(B3JfÁL qË¥åUrÚÐñ„d6oDóŽ]À-äË™«—Û§–,/6ÄÆ1ë+{eit6‘>W”|!ý|†¨óÖŽ)˜)lÍÌA3`oÔél·U¥zu°^Aƒ”7Ô£6âXšû“™/bGØ+MÙ.g2¯ì¼¹ƒÈ6;oìƒÇ´˜5eÛyS‡âÉ {ÍaÔ¤nÖS‘LÃÞ”°i–ѹ Ct:SØd¢Â+A„½¼²5§S˰9ìõ!íøn^½÷ÏÊ?dr‚Nâ­VLæ¾~·ã$¥‘¬-!f&¿1 Ç!wȰº Lâ:øK‚áÄ4ò ›¯€ÑS~Ï=B\ÆX¾‘«Xh­ÝVa xF¬ýVÀ}ŽÞP„-WûQ éÔªÈc."ѱ×n’Q£@õ€"o @ $r™Êñ#QÊŠRÓVyEX«ÊH1£ ñ[¨öƒy; Óï-Ù{*H+GÍ}ˆYJ.dU#TˆnÈuà¤B¶ŸRë'Í“-C¯e*Ã_q?Ïß­ª¹ræÖÒEÄPƒÊ_%#™§9Ê‘–í– IIúÙWñ¦è`fÈ_ÉA TÙ2‘­æbÄ~BûØnO0Ó蘺éóoÆ’—ßV’„öÏ«ÜM…s¤q»¦ùêxÌRü³›KÓ_uç“áSÖƒ¶v,ƒž8RÙ;[™dÑìŸcÔë]¬&·†õ·oö^míØGgÛžôEÜMtÊÖˆ<2y¢‚¯ùûpÙ®Ïå ÝâεëZV~«›\÷õÆÖ3£õ­ÇñT-K·>79®O5æ$¡•þU|êz§EùÌ\C=ËêûŒtì¿8èÝÑ*Þ„` ÎJ´JÜS¯iaA‘ûcƒf‘.çKnŒ¹i¨ÐqÄ,õõ« M“µ±‘CuV7|¨žú•û ¢YADÌ3è¦Ã‰yºÚD%¾ìc*§¾‡^¯§ØH4ÞØÝÜÔ·–), 3ï:J]q¿Ëþp‹n¬ð±#µNøÈ‘ìª!fx„„ÃSïÆB=’qØ’7[Bÿ¼þ ãµ&ÙEN)9N|öš:ÏÍv¥4œzO\,þâÎcT ”7é6amR9†KÄÂâÈž\Ð ª]e¹GyRf8Ð|ÂÏR)— ¸9pb‰Ž¯qç8::ÊgÄŒÀäŒV`Ììùd«ì!ˆFÛ7’…XmqÀ w<ƒsO×ìà¿üAèu«óÎÔ¥Ì:ueŸ©Is Ø½|vÓùÛìºÆH’Y×oáæ¿¢7+òW?ƒ?+·³Ø¶wš¼‰wÃfl©ÿ`: –©à-öc ÎÉ‘I·ÜyËrûMMnéÏzO~Ȳò\ç]½QOtýðdx*Õ_SʇU|CZ9+ø)„sV0ã¨h|£b³Õk7ÆM]ò¤Kn§)8R}íUc=§ula/úlGqûOú}­R²Šõÿy½·W–ŽÑèäÔÎŨO +ÃKqìµ»—°VÉI,p°è{äù¸·$¨" Îpz»¦û¿hù>É×—Åñ%ú!Õn%GŽ:HŒ”zR{D~ÁNºÑ1újôˆcG‡lè&M^Óû<CÂÞÙùg œÚJ‡¡J#‘ÜÚXm@H…ÇÒyeæ¬ÔkKKÏŸ¯JÐ¥ŸH:O.¹ÁÉéPéÏÀïI8ÒcúCtÐ=æ£AÛÙ€™)å}Mûä%‡áB7<Œ`\{ÐÆ!{ŸŠcJÂ# ƾáô‰J /4ÐóSoGèN|BÇ+µU«w­Ë“ó Dá<_ÀCË?iµl4ú%¸Xx³a÷±(F4ªThÈG-Ć˜/~‡Þ'_õ˜õ y­²ÛjíN}Èè0@P€À—‡ÃÀëv/U·‰±_FÔkù‚Ú „Bÿ+xûœù€¿=À‘`蟈˲ðe4’¾Ð•C¾3ˆþã‡yHäKþehÊ…‚aŸÝs+¿ØÔaº5aãtg¥«d)Ï›™Î¥'O?•T7¶8ü\¾c$6ò]Ø…2‰QG‡i@‘@´¿÷cåœ*WNpµ»<ÑïzCŒS¯ˆçµ–D1 ÅÎáÂÒO ïöJ“æ¶1š0´gýM°s¨5„4¥ÐSr­1 z> ·Qœ]hTÏïI×ß³Öçõ‚/Ší*×0i÷@NDûS|j£aPF@³nÓg£ ûtÔCKí£ ÎØZ3„í¹N{@×\ mo ×L{à?ӽėÎÀ÷ã6>†þP>aI|,¹þ¦c h¾3 Áã÷òó§À*—í€ÛÁ'ÄîÎh ÃnÁÏ…XˆÉ•óeÜv3”µ’=úhçÇ3ò'`ùª@k ÓGoņŽWÄ×­!QfL-Úë\6˜§Ož,?}€Žÿ¥#} (È’ X0J±«Ô¿†—;í6zÐó:>ìjÿQ—[cÚ Ôf ˜ÉÄGq´ ¼qáùÿÏÞÓ¿µ#ýóæ¯Ð¦y6q–8X¶W.ÛÒ]nö€ÝöŽPc‡ø%ØYÛrÀþíïÌH²å¯|‘öxÞ—ö[I£ÑÌHš¶z¦P ñjû6œÿOÿ€‹Tx»õÆÊÚÑkßôº ßÚ])ãaŠå£×ÆÉµ¿­¯/¿Tzàú …ú,u-©ëØÆû£úÄÜ oy:û“Gl_^Z8 öa`ù>åµà7”¾eñ,HÖø¬cwƒ8<ÇÓ³/®=+Ô,."åâñ-´- ªÀœ~{ÖûO—ðºH~2BÊ\ÌÀ¸@V›Çô¥È“_\›ë¨tw;·@¼IβCÇÑFcú®£RåXc}õåšý>séÒÈck‹–$J°ÚŸ¨žur Ø!2V]áWú™ÒŸå˜ŠƒhnUo|ù©:–È–kËËJ¥‘5ðÔ¦ãþôe>Á£5½q}#©ï’³€æy“l¾3ö7?±ºðܼõNOïÖýàÚ±T×§³ô­©Tœ†ÑBÖ§J~]¯ž|ÇNëõò” iµñóú˪Ƣè¬rCƒÉ¡¢?7®L8tŒFŽ¦Â˜'ó vÕ+ñdµ©3|$Tp+r¿)ªŸ‰r<€Åtn_ nõÐÿŠçsƒMå°å¬Ð"Û^“­ü&RÆFÊ~|uRÚcY#+5û™½Tƒª;­RôYù˜ö HàÍÒý­•îZïvvßü«H³ððv{·Û+sï[" MP³ÑËÄ*cŽØ„ÁFRyåÊ*¡+•Ø£’1ˆ-,+ûæ 'õD³ƒ:k¢8·7‘ ¸} &ƒÎè1¯Œ;ÞßOg–óEÆYÍDMÌ[ñ SÀ†eD?åT q¿¤‰§ÐúÊÏœÈm¼¢Z©7Øþ[eÆ=¦N¥-‰ÓF¿Æ³ÇL1ꥀS¾á$Í›“Ô#¯_Þ“¡äЧX21|Ù+VÔ«Eî\[Hõ3Ê™ÀÕû±{6LX Uƒž‰Yw §šæBªî4„WhÇ÷1‹’y…ÞŒdKº“fm@*áÖS.Æ!çG#WbÛ‚âVÇ<óæP•b?…ó…Ûj©Ç‘¾£?Š'5ÎR\˜»NâIÓÜô]9ì9óð1£Ô#ß++¯zЦ¢1»â"­ºZšÅlÞ{Åú¾ÿG³xõ%ú~¸ß,Òy-|G¼VXesw¯¹¾,ã$ãW Í71ïcN˜v~!@å›ô[¹&àOy˜ºº#¿Iš¿í·­­Ýšnµvw…}8úÓ}à±O¬Ü^Y^WC›®,ÈÎM”ï0êÀºÊ[Û‘ì6<5¡Hž&«Âü!£05ÎËÐ(¶x¼“G{Í2´Ù^^[†_+2s°×8ú Þ¬ü„/¨þ”¹‰9¦ƒz!Ç’èYôÊ2€vÒ€=è<¾ÄŸ²b·þ;ñ>n=\ih*N£¼p”ËŒûK♂9.bù¬ òŽK×ÀRd$Š”:oÛtê˜PófùÀÆYÕ±ogo *å´n¸œÓ7Ä2oxáˆv@Š#üf bjøÚá±m»t?ïã|%¬«A–eE$¬ûêžd–á†Ì™qªb)àÜxI@9r4«¿ÈûzìÏÙ;}Ì̲˜7† ’‘ÅãØà A—®×µÓ©ÖK”­F¡½Ýt™| ;©#cx¬ºpb¤‡YÊnë1¤”OÊ©b!e²5ÜÛ’þ(”Nqàš1Ç’­â¤úyÄ:è¼´N1‰Cj–k^ù1†qp9S‘.DãSû‘YR,å RyƒYÔ=ò;d*œb¬x1$MñèÀo–ab@1··àaNü²²þÂ{ߌë»!,ä5žêýÿ}*°uHÆþŠï³Ä­GàDx0ÀãV‹áožôºæÀºûœ•n5/wÀ‰ó£¹F\žÊc¼mrÒ%»æyl•s`=1Ûå÷oÿvo °Z2í•Å»fTêÙF9ßF9ÂV=>keÙÕRºû…ñÔ1»LI'!”ç_Ù9é;‘tÒ"ÄDÊô†ó4ùK óÇkâˆOÖxæ;“|#BÌ=9f“XRy=/LC0óºFä1¡Ôۯˊ2ü¶ãþátÒÂ{öyÈòyˆ‘TDGjˆÃ8?I0}¾5 ×w8°Àe=±˜pÚëY÷ÂÁÈm2Ùf€ÖžéÙc·ˆÓTÏÛ!BQ(ãóˆÐÕ ïv³Oä›óÂîÐ&¾\Úß|·Û2Zû[åBª"–Ç2(ä÷¦Y!Ê…ì@$x÷§épãÖÐI6Éh|ÚÛÅ<ðÝ/p¼Œ˜šÕT‡—e¼­)£±¤ú&™;ÊÉ>aQ%7Ùw:"¢N×íˆË98"¦t)k8V%(xggÀ ƒ½ŽµŠo%í;.'ÞKBœ¸=¤ºüÞó|Ä®Ln$+4 ªaœxÖ…u{z¯©x¥Ca\LxBwý‚H³ ¬lè:]_ÚÆ–âs.-¢xNej]µ‰]Ùí‘ÅgÌR·ÊxÞ…ö¸_ÌÒ,L ðÄ- \Á÷²°'õÑøèEhÀ¯ ln«æàÆùU²é_¢–Â{ú¼%S%˜(½Þ§›öíÉZío§JP¢LŠ”mò»žÂ¹%Ì#g¨âw퓵Ÿ&¶¤ÎÛöÞ;Y†îѯjí´È“ý½Ó£·¬â÷MJsMgB÷Ý(“PàiåÜ¥I·hhü@¡µ½Ì’Ñ­û}€WGssÝá™ â\C#í—NáëjxݹÝå—ÊÜxBæ¦gÒ&‰+¸2mG÷ûÓãàóíËu†¡ñpÔ¾ÂyO϶ööòGšì˜¸¤+ÄÏbø Þ"Q`”—:åÒu…$r¿HeRP­´w€'Ióß $ÄÇOê?·w½% ­áÉL›î1q·'å%‚ví y2rÎà-/ñ(î·æÕMr„AhÉEh-ú"4F…Ÿv×Yþ ðÂæ`–Y5–ì7qŦˆõèäD™mGN‡3D<Wâ}>Kï üˆŸU†–]­Ù«/×+z•FÀòóŠáCíõýЪ™ÞUí ñ ³¶¾¦¦TX­W–.U´TÂs¾¡9ùxÐÙ‘e‰C½0×Eÿõ*·ßJ ^j¯óNb,8ŒÈ¨Úë›CßíŽfd}Šùud–­)É 8a`hY ´»Íja”Yù*Û¿Máçáµ¼Ù°«@šZh s dH(A„á£3îÔ߃FWHrÁ`”h™î£!ndضGþ"4Þ¹Ë ÕÉðæÚ ì'c´ÈXÄ—¯Gç°²X‚^Ü‹ÞÜoªv#­nŸ¬ÿ‡AU(>N'`Úë®E¬hh^ ùBv—c-'f8&ò F2€wP%EèÕ³LÝpqOGáJé›öåõŒTÕ^ß®,ëe¤+ú²¢@˜0ê,±Íõµ˜áèä9ó#éL¿îXkÑWŤ4_§5¶»¹¾–ÃOá+QŽC[m(RX ½?šÕ…ôø„Õ”'Zõ íu…ì탪¡½Ž‚ íõÉT«²›µÃÝ£×SÚ:ý™~pC³±l¬¯‰Ñ r,xç–è–Ú+-s™LÓËTï¹# 7Z¡‚רm1î,à³sϽ¥˜ü./ÈVõÛ%R«ŸÜôGì¾­›¤pÜC»ƒ_M`þÌb;ˆÁÁ¬´D V’ÜÛ†6É?ý7lZüÀªªjáJØÛ’Ç«ûj~³¢†ˆ"œ4WH²ÄáEœD™ƒÕ†(°¾†ï××b¯××"Êc}âj4³Ó³á¸s…îEç»À¹ªQëP†`Œ0àË*J ò_ÐïÇç†eò™t$œ¾ÕȈ²=¶©6ïÄ :ÿQþ•ʼnaÞ<ž®bàBÞíX7®¿¾¨mMtð9Ýž&ÉØ§\ÎÎÀ¶4U'p)âŸÎíŒt È ¶ðBÓqÇϦ¤…³â× €ô¼=š ÆSYH®ß[%7;¿·&þþ4#r½îÌ»l¹°g¬¥8Ép›˜Ã̵cßÞ€äÀϨý~°û)t¤©J?šÙš[ qV6L ÉËé¢[y»ëÁ˜f’†ó°}¥ûCÄŒžNžgk‰Õ³Hb:O›A3”ÞK֟זhc6_áâ/?E¤îŒA»@Þ5Ç^L·ŠÓuKéGq¢â?¶‘=¶­+}sLð3G%EG †½Ù–ˆôŒœºBhU6¯yRV9FJyE¹Í˜2!M¡YÀ3HÃqqÓÇU¢‹äƭΰ(JŸ]‰ƒ¿ï¦ôžçªŽZ{òÃX²_#@1ëIŽ…/ssóüm§Õݲ¶{;ïú¿Ú»ÿóËß{WûÎû~øáÏz‡þQp|ýû—?n>Þ~ýë?ÿf"çKÍbE¿Þ®èz[«ûíúI{åTþ¾Ø¨_s¼HxzìØ+e-¼B&­Œ™8åª'{^øe”é\²ÿ}û¥î`€_b¿$`=µ±{{Çïßï-"B,‡”!–¿kF¥žíÆDˆ ±•GO'D¬èj)ÝýÂxê˜#D¬$dˆØèùÏ~)“úƒp*e''q G0œ§É_bhX\l×1¼&Žødg¾31¶«ÄÜ“c6‰%•×óÂ43wh×&”zûÍí—¶ñZåt>Û/åÇlUI*¢#Õ~)ÎOL?a¿Î,pYO,¦Â ˜`ævl3°0^L}Š¢ˆÏ`Ç4 ”ܘ~´[‡bFÏs¯°Ç—øen?­IP㤴9ÉTN/XpãR®h sp%ÌüL{‰ ª×µ:(xJ5Â- ‹äŽ94ÏaéhL2\õ2Î/Àj5hu%ÇsûšdvoTà E%#Ültc6€¸ †}…›¦¼,s3`6çfç2ëAZ¤ˆ"¯¤¨€ÍvXØê4ÓL)Kt¸ßL^”‚±h Œëú$ ×°Œ‰šiÛÈ:`zϹR²5ÕÍè§›‡™:éæa“Þ=kŸùÚ'áè©§DN–b}.äNÿìŒ $Ášø£ošù›œ”ô$IæÎ<Íä7ÿsš,„§HPcv»ríðrÏ\fÒWâë)¦.I°ù°0&æÝÐf0õÅ7ÏPc?¹ÉI°T|Ÿ‹Sú¼ÅÍÝâJª"R “‘`p+xczâ£A.éÍŽwýP(<6¯°^ö؛ݽméÚ1»fWÊÛ‰šžaò ØÇì<#(<%r˜ ¶…¾Þg5ö÷¿›­í÷;ì—TVŽz•BFÅu̧IFjÜI² Ð1î<+¸ö¶¼Qx(pˆ8€¼ &ÐI“(¶2š€ŒÜj¦ŒD¦00€Ù,ƒhFõ‚Ï.Ų—ÅMöF­Šs#MYïàVbv1gòÛ´•âm¶‹< ¡’Ÿ#z‰Á?éŒÀÌàÚo–^¦fÂíÒkXü¥°²d¹Ä"¢Ç”H…=$òí.³šõ'ç6¢v”VwÛ!›e )ɰgÚ í;ýs÷ FmôÂwñ,ê”Ä\øîÿ 2¿SðèXYx c]¦×›ð¥¸lV>$0YM Ù•,‚þj˜,ô§–éc΢!äœÄ p£%Yk3«`¤Í R30=‘á­NS²§ŒW)@a¼À¯rާR‹‰ßAž˜–~t|¸»¯z‚“©ŸÓ›¦,ñ¬™çkæSÙød”tÞÍR²ã…qô0;ßä’`6áÓÿÞ=w¥bêx÷&q˜¹ÊSäÊð¶ÑÏç%*²ã¥Ÿùʤ¿ÀÚc&±å“ÝçÂd™wëŸÍdï¾ù=¶h9¾»Ó÷œs4ss¯¤õîZå16ž¸·˜‡Ìk¼úzj¥g:hT½½’ƒzb‚ápó`o÷íd”)ø«fXæYä W9„ød$‚èh)Õ÷ÂX²˜]H¢Ip¬èñOÇÌ¢ù@N¡èá$Ž3?ƒy’üDEÁÂ4Í1¼%†òDùg>3IÙ”x{jÌ%¾rº]˜‚RæÕ8s˜Nòå7×9eÓq¥SNã³Ö™©uªtªwÆØGœ·'4O‰X΢’Ô=_°-+°¼+ÌV)BQH¬Ð~`1wЭùÁˆ§¸ ìŽ<1ޝ ñMIŽÝ‚” ¬NüÃc#c…! ÁvÖ` *uúWn—­¯­É QÁk'V´0^Dgx—EI4ã‰13{R,e=þ«-bµ€µK4_¼ŸÅ”à\`ó` 2Ha™ÃSåÂBÈÀJ,´öÀí\*D‹Ë|àÞ’ #;Ç1e7ðzü?Š¡ÕZa)ŠSƒ‡ðvÏÆ„Ì”`ª¥0žw³t‡jÅR«…Y‚2jc`nŸgtN!Š$@üþ•€ÑGH8ÐÍæ«nµp äë32[²lº ¢µ(  IV à@ýsž\Ú¼aþèêÜpp=[£ [0ñm™s¥Ï¡)mMçý`Ÿñ(ål)Äw£9Í k\~rt´4¡1´‡sÝ&SX ËçÂ|Ó “bÊø„®wIqEF[˜½žuƒ+Hᣨƒ'c„óø8~¸ÕûاKi‘ì jÉß¼Äëï¿gÚ)ŸeÉÞw¦ÆÍ~dzÏm€$>X93ÕßÑ~j–OÞ¶¶¶ßŸ–Ô!Æ"–)<¨%$•êNÇ¢Š ±ð4RÔñAšA³Ü®œ›µ›µÿœÊäkÝÖʜãñµ@BM¬Nk 9#† -úX¿OE–©L£ª˜JþÝîÑñGY¿/µH†ŽaŠB‡aŒ^¤ªq@yQX “Ž“‰qáˆÝË*ñO¥ˆrA)¶u•P—FE"%2’æ™&,C›‰FàwŽŽ?eð"fycaðI®«`Nyçj‰¯=ä6æÌ `Ác2Ý8é #{ ìÚ‘m}@P|‘21Å·;[åÌY?¤iº¹‰söà\m¨gv,òß?Â}âV“zöõÓæâ%-n>»f`F+ÅÑû¢Øri–¸/Ô,âBý¡fafÖÏ»L¯²vE‡¥Rª·WêÃr±ÀóRnoäÚ”7±ªAì9¾ˆËê!Þ^E/º²®xºVg`ô]÷²YÌl÷KžÃ  âò¬tNînbÒ¶ Ñ5„g ô´úv±½Ò†íy…R W5¶ü°”fï æ|C‚w“€¥+)5 ~Ndò ¶ÅÓ 3ì‚BPIrþÆ8Õ“Õ'l÷ø¶YüÝ`òA»ÄV6ÂÒõÏ­÷;;ìè_ûoßï±ãÍ·{Ûõ;e…Œ÷ab4J ¦ ¿œØ§jå#T¦Ö«/0YUÇ׫•¡ U@•V¿£Šj¯N›+±.°ê‘²ª¯XýÎì ]^ò¥vñU»¨Á ì¦}î^ÅwN§K -çx4$HÈõ»¡GR¨x ëÛ·—dU{‰÷·‚Ä©å@ÙØvùû¿êÛ$É€€ªíûúÜZm†-ÿÈ~?ØÚÞaò<ã`«õùþ´­U+ZªÞÝ«2%5–,Ñk¶‹[í"ÄŽüUoWÚšN}À7Çø&*¬ Ù\ª·ïïÛ^±LMD°¯Í?Y9ý«þùäÍëS‰˜Þ>¤_ɾPqb¢!*Àd¾¡É”‚ÀKŸã¨ á•>i~V8K1›/o•ÄÕr½zò;mWRò¡­á ü©*í”8K,qF^ª—« /m',Òq¯q‡Ý+×Y\8ׯ pëݲà—üȇ’9X|ÛN¡˜±HøQögdøÜ çh _HšåV Ü6þ—”}-ZÈïhÐþÂFCxèKg8¸öñ§ ³b«Èî /,TÌiiÀš)„ðÁIPùY+ÉT-÷ÅÝCV[²$4À¯hwJ3ͲYÞˆÁÒ6¸U~eYÛxø_ö¾µ¡#Yô³ô+ze…°42{ÉbÀg1p$Þµ1’F0kI£h$±ß~ëÑÝÓóÔˆ,9gf¦»úU]U]]¢ó‘E̶QÛͺ§4»íðëj¸ás‡$Sù'™ sŒe·ôú*ðÙ"ó'ó4 íÆG‘Ö–h|'JÔ•´‰¼°è àåß—ښ̳t€`€*äý“÷ëÄëÞP®ŒÌOúM;ôhÀ«g~…ͩޜ)×Jf¾Ö¿$$¢Ò—A ôuÿ^¡|$]$8áJ0p.0:Š'á'LØ`t•¯–Í_*‡}ÿ.”·R·k~%&Oš¥*ô× “ pÈh™¡åޝ\—Ò± „n÷׫2þmòIÚ¾dÉaìêDHhþ¼ødM|ü¾iîüû%¼ÅH´cåš?ïìa‡v·Ï¶¥P(Ż݃L "\ÛÁ„6-ò{@´VÙ(d莢LÚv8š* ‡ ï‚XŽl«F´¿×):eDøÃÀtüš”»x8²“æp÷D»æÎÑáéÕž9P8¦t›Mì=ƒ–yd:¾LäÓö‘Ã`” ’GÍîÁ|Ó8HFšÚfàf}e(ŠÜÏÊw4…/(RÈZ yªP× åP„ˆM6EQz«,¾5w"£ní=q ñ]ËÅlMAWž`à ‡H’§ôÀÐVÈ5ŒMÈF“öæ@È™'滂•ñþŒø«ÌO-Oêè cnŸ½<Ù~Õ„.¾Æ“;æ’u;rôÁ›·b«øné­Ê¢ÿŒœÍŧª9áÒº….ÚsšÃInäÍ2´ø8¢R(~Ú,jÜfAÉ‘méÛàÈÖG<– $HæŽ$1@,|q²·š?ükûä„ó¢<3òpK0ÃÆœ‚2\®Ð*I?Áé+°Ê;¹ÂPé‘ÿc¯oÁø8œåË0ÃÈt¬ Æ}ãV€žâÆ€^±ÕÉÁþóÓ­þ›öU]sò_,Aå3`ËÒê&´D³æ_(9jÔøMÔœßäÄÒXiqá g%CrÃOŸMhP«!`rB®‘Ü1ªl8·šØRÚòS[J_ b%éyjBÒNú “'“å–âÉ0š‚öêãúÙµA ˆWŽøq#@€ñ‰)Rž‚E4¹Bˆ?Hý6ȿؙºG¿r‚°®òŽœtø#E‘idÔîXá³×.gµRyˆRNn2ó”Ç·Ãí•J&.¬).ªð³_ 1º]ˆX^æN£nrª¢?aÑ™w:?]ÜÖŒW4n¾½•u™ÿ.˜ßhë2¼3ÇÌ}ËžÂÊ}±›E(DÁ–CÿÏò?ËEÄèÆSE cNËÔå7ÿ|‹ô夜5ô#Íÿo1kXXê‘ïOóþ—¥"ÆÚnEå’ªÕP¤¬É²d•CiÍ9þ€Eš²È#`­ŸpŽá¯aÐE€²o•̲› 5Ì—¨ ¡éác½’*{³’²¥å"n]²HŠoå—;;‘#ŸíœrTÔH©¥Gf¬+Åèf¢¸¹IÔÙêÉ„!×Äì’%•C¼?š¿Nü±Û$}þ–àþÇr¹b¼`ðó[zF[™&Æ?>“úÒüv4Bƒèï…uF’8Ï‚J3ã „Ó üÞ$uÌ”i[añ”{./:èö‡p"7jÿS¢ëi?o!ƒÈ>>u¦™‰›E3MÅaVšÐÍÝÝÅlÄ ûºâñêÚ“õ§Ïþñõ7N ˆq7þlÁðŠé™?u©5(&gxwwc«´»û)Á)vw#vèáHšd½Eƒ!¦zàûxxaüâR¡—)Ÿá¥>™sîF§M)ãP‚>Ü~µW;Ø?EµÆg4LWa±:M…o1“uiwÎÓVÄ\Û‰«*©fî& µ°r LO\\¦Ä÷V°…* X–ñÖªøÖXe1ð‚q-…õ´ûCS–51« ÉN] ·HÑ¢–;K)ßuX!ñ„J™óY†óѼB¥x¿Lj¾±}NŒ€‘œ¸H,ÔE8k±éX,fE¢“iæöñ’’-”v yu( ¾P*còfˆB›Z-ËTSnBá/ŽÀ%»¸¥wOl¶ÿ€ ”Ò›dO°#ë¿y¦ºb™AV¦#g\Ò7[³2;!3’¬ÿjÝ&"K´­Ô˜,ñ"!¯&‰Òéµ'=ļv»‰±|ñ4h qúÎRæðaö=r†CwÄj6ÎüË–v‘#ç†8Ø“"ëmLë…ücŲ Ò-HôwG…ú(VÞ4õ·ás›0:üÀ• ”(Èóí¶.¢‡“‘×½Ñïåc¤j£¶y†'¢•ú•vûôRˆøØ›¼FÊNÅRóT"+øÊ^©õÕ¦¾ú…Mižçµ¯¾Q4UÐÀÀ¥jR#_C ÿ yŸK6eÉ&–Ìû¹$ þ)•6C×¹'¥1É”÷¤zQ–wlï× ÒZíôœ gÌ/Pt mÔGJ…ˆxsáûhf%!‡GÈÐ Q ùj+5m¬¼$^ j©À^Ïl?ß§l˜.Ò[h»3i³-x)t\²ý‹WlBDiwýQªòÅ0m­2^©z›e‘ªAý‹^—²}q4{Šbô<ÜÅ+˜‘–ÒE~8þñusÏ6_íîÙ/ôŽ¢b”L6^ìÙº.&·]ª¶Iáà<£·FFÁéh°DÆ‚e9¹e`ëÐ%ïb2r­ÿ-܈ð™órš 1:ÑÞyP©°Â `=„8@øÃÁn­×ù$j}·×}²Ö úˤ@XPX9dŒË( EOÖÂÒœ6«Â³õÃN’C#{WÃ1û•1Šûþl]•ŠõšöOÎ&*ÂpØ‹µÎ`û°•þè­äö'½-@½Einˆ^ %øû‰ð&$¹!êDJÞD)îBxuú<»5b{iå ¥X/Vì6Ý›(`΄Ûú¢„e­){åúëgM=ÞuG®«Ò<Toy}úWîhØÖ;ê#M‚'ß<_È'LTù1:£ö¶û„8ôdž5êÁÎ4]ôÐÿî=¹×±Lx㉴]¸ÂDáhùîá³ÓSb›nfÄ–/n9˜´/…CuØK¨ãcçS¥ìdž¬à#ÁŽèu çA_0ÚVAL$8ï½¶+ ƒSÙTrdŸR‘à¯Ù]“!Ùñr 6| §fâAÜËÜn~:ʼnÊåÀ€RwH…/jã[h^Ó{ºPÐâ2ÈæB(jSfì_AvêKù²Ò蓵&7m¸A>ø¥§>šE‰†½•þÙ:œ×¢]Nm¼7¶©”• d©ª\O¯ÝÄrÑŠH‚fk¸IeÚ<ilæÖ¨ÁågDŽli³<ËBÁrÂ4§Õž¥n¼j&È’±T+³t ¥¦®ètñ¥]GqºsDîùÄÓª2xµ´K†µÀ†º“^¯ÖuÐ`rkRqzìvyºýÓ^Ü &aèÂÀ¬y®©µ~U©P¨1°„›­œ^9KEÛn7©T -¦£e³Õ¦h5ÃáV¹´s|,ðš”r1äømGÔÚBM˜.•jµAU‘)Êz~ŠIM ¨ÒÁnL²oÒµ9lh]'úVZÒ~Æèòäö™Z>eùH™‰“ýÌwâóån0‡MNzŠx!þâ˜p åwd2´ß‰2ò¦ÝÔXüm+£xÄY€ì¤áÿÑêÑil|Ñn‹5ûkûqU¸í@¬ÚQ9p-l¢ÜI„EZ"F‘:ƒî€Èš þƒ÷ƒl›)Û†â‹yY‘Ðm…¢0 “.l:2/6¼ïA^*×YkæÊ«ÿò䘰”q]¡$‚Y¡…’A*8}>æ-€á(`¼köÚ*z²* lBck¤¸àÃ!æÙÔ¯O!åÞ;p¾ÓÎÊBwä'e«Åp .Œb‘Ȧ£Pu©B2—‚1Š"=[ñÆ$tk¶‘JÄÏh=]Á††¥I›n}ºTÅF:H&èÖ$H½ˆ¹—¸³ýñÄœí¿°ø¯¶÷_ìž5ï(Ív^j„ÈH‰­x‡‘Ù1"ã3—‚£_LÄÈh_KY£(΂<ó‹;1œŠ :‰¯Ÿ/bmÎvÇÖ;Úíil1zõÅ‘§”‰¸³(¶ÓIUÚ2¤×~ [ÓBÛÆfñK¢U©»-ÅÙñiÑ·ù4,£Ì7ÖƒhÜØš?„ÃM ‡›‚xql3 DÓÈQ*7‰…Ê­P‰(¤þxzô:ÏÛŽè;¯‹-ã¸søÀ,Õ³4†dŽˆš,,I|›LŽIhœÑ1:<qC”kß—ýIù£ˆ†ë»¨9dÌ[ŒJ¨Ð‘ý•š3èX9j¸ùHÚzæŒ usÆË94 çÇj e§QœÅ ÌIOÌ)¸3Ù3‡¶D¦Ð‘iò"ÏÙ—E<ÌM“ÚáâTÜXTJL%*ÑO¸„È GåC^¶é0U: 1G¢‹)D¤Ø÷)út}b!AúÂèüÑ™'e$I›Ÿ££Ã)4ý(ÃFš1ð‹!ðG cã¤yáÑm RM>¿ùóQšÙ³œ“£YÌœ&(_"ý0†g‚âÑãæ£ˆQó]™MV”³ö…“ÈöIïsq:Š,*0åØ)}6ûä£4»ä£{ä¡ñÈ´C>JØ%íŽB{ãûŸ­ßèølýKŸ­ß•øs•)@>[ß K=û)B$ÍV>~Y‚$tµ”ì~1;'uÒJ~ÿ™EÊ8öõRªNÎ$X.Fp¾Lú™†»/3hMtâã5èÎLB&ÎÜGlb[*«çÅYæVâf J|ý<"'¶"târ>ˆÙb§B§‡¢§¦%1‚?% ‘‹Dâ`48^ØË}¿3é¹:Ü6æ‹Ë§ËÙ³|Úœ!LÆÔ kÞÆ©-{µE¤t¤„gÍW?œícéöÔö,,‰ç7* $†*»òz= bIT:6>˜ø·?!f©è9ÂhÝ×£À`À%Ç*q ;xïüf ÓÝÇ:‚µþ æö‡ã!Ýä(Ê­Àü¥Ø’âùt0J¨õ¡›žê‡JG¼Š¢ªÛœ­vÔÅéÚ®sO+*Ýe÷}™*Z†ÆZÝļ=¡ç][•†©ÛÙøo,ÔSÍO¶!ÅZçD¯OµŸ{ÕØ$† ÈŒxóÂ/1s1ÇD ³<Șü¥ïq÷»8•0éäž.ç]êùFÉŠ4daMŽJ©[1©“>óx\AÙh15¦ÜH†÷&žÅ$c³kdÆÐ L4³o½úv„cºò@#¯käI¦Dm`ŠcEÎñX¸×{$̳‹õÍ@üU•Šs(Ïw<ÓtnÆÇû;œm+ìsö¦$*½búÐ0ÎNšÇ2u¬„™oášÒÕ ÐŒ’œfãdÚ½Æda†SÊR7¹ž ‹l÷:ÍÔº·¡ÝY0CÎù8we€4ù#’ó’Üf#d UT(3R$©mVÍú–îõ¥#ÌœºD\¼I¾·…½fæ Þ*°_Ö82v`^ñ[oCø§í61Ùð<{/½VΆ +Ür—…€Â­…¸m2{Àm¡!³xu:MΨŒ™—Ò¢œ« š;1ÎÅkm3¤šQ­m&³£šŠ h´¹}\laŽQ9ÒД²)ÐO¶öŸGkD@¦0áL›d$ æÜ>žqnM IA7›!:®zÕ®gánA§Ë[QikF¹ÇØ/iBOFD ÎÃaÈ&z™"I¬ÉN´Í¬ði»‹#O„ÉsúhD&Œ +X.IMÙܬlD´;§ÿ~u[BŽ(›ºF˨\¥³Æ¤Xµß<^]{[1ð>4^Ï¿jNÀA=<@—KW½š~ÚxÕû„Ÿ ËAYÅTTWf‚4wÜDÍf0tÚ˜£vÖV*˜¥€~ЧöµðUÊ%DåÑd€R=¼«í§”´ „kšQ„î¸ÃžCÇÀ±3Âð×*ƒ†!³^RòÏÄி~ÆG€»V‚EpXÞ»þ <7pdíÁyDøï#‘K?¼ÚÞ9:}ÝÜÝ;>8ú÷«½Ã³æÙöÉ˽³Tü©†gÇçêÊ×ÏVj< _¯|äWòùÍ7«o9Þø<«)Ïq€Hþ»É¦["ìxSµg8çŠ"ø;ég,Æ'½ÑOéÙÒΑ`¦ªKÆa¨\ŠËEƒz¤·’)û¤6ÅE±`°U¦ÙKK|rDaô­@¢pÒk² µàg9ž)µ™ß¥wÿÙà |Ÿ:ö ޤºp+:/SÔ¥Q¬äDH¯}ìš‚DMb2»ôA©*f§B$(.qÀþdpáÊÄ’xÖúiûdûùÁž þ’¨MÿJéZ^À×2~7T(aFZ$ü4i4Eàî©Q¿ 0`vÝöØÇ0û2éõ¢Eó90’PZ`è\U\]zíKl2Pe±$.÷ØŒƒœ²ïŒ7à•µ»òfþy»aÁ£<¸Qþ&ð›Åz5Êôçá¤Ä‰þÔ¸Ά4T»¤RÇæøíÆÆø»½ñÿMzLP§u#h«Iàÿ°ú6Ußž­Wñ±iàª.´ÜsdøncÄÅT<ÒÉ4‰Ž_—Ö³½®ÄC¯l„¯8ÜöêVÃ’©(¡¢LAYêuQ¿(Ÿ‹F©´Ú°âp®7VÒaa‘- he#R# ªæ"4jÕëeù”„32YeÃ^IÈëÊœS–„@TΙåHý §DqIfÐÀý6òÛÀýÑôœÈéõ"ghNB2x¯ÝwQ‡Ðè‰p¢rWÂ;z}eBîQëÈ7šWÀÃVâZ>R"~! ;¹³L·ëO¼ÿ:ñ¡= ¤I4Ê6ÂDø£ƒG_ëbÆ8±g©¢69*5W 0¾àÙ­Ž?eöZ#y:OoÓ'ÓËË ãð ê±›¤áæ»c<ûÈÜYéÝ—®ÓA%FÒ§tb€:˜‚ µÍí6™¨»\â <ôP}©î‚Ìv)“ ‡ ‡ýÑ;J³$ŽGnÞ|ÛóúÞ8°/¿ÃùÖ w4Æ'XŽfóôlw§ÙD&&å¹**ÔÛœ¼Ì¨ê^U `³Ã"aÖ±‘ k K²qÙîãà¡ûú¬*Úmœ[ÀË@2Qºßù“‹Ëˆö¼`ÉеªN/öß Þ Ê²° €Ä§7ÀʯùÒÁÂNÓ• N’íKÎ7ß.Þ‰vrÉÃG=K°w`jzB83Å%BJ㓞aøÔ-8?–Ùù µ&Œ2E«©Ð~I<ùïÜÁl¯‡éæ@Èéyx7 ¢]D ÅLÜ”\Ü¥—ÔHòÂý«ÊøƒgàrV8ÊywÅ4Jç÷øB <³1&CZÉtÜ1м×iâtg ¢'¹Ý4º€“=ÏŒšsLÚH&qÌÞ }>õüãÚ­ñabã£Ä`£H¦‹¬Ù[@·$)óœ`•«†Ö<>Ù;>9Úiî¿Ø;8݃íÒî¹Î€·L^Xï<¯:vv"ö¤î›Fº†1Oz8ÑÞQ*¾…tž´*ÌJÑÏFz¦D¥…41ĉbšùŽxÜ~ Ðú@ÿõ thÖ63%ôÞ@¢×8'¨WòF–ÉWfa2çb[G²)}/¬è©³ZQnXr3¾zãÆÒâ©ëD¦žvÏ¿(“hÞÇ{VÀL,o…X!ž*[»¿tZ·M„·O÷áÀgp«`ÊUkJ,Ãa.Ó ÆöbGµ;¥)Ð à±D¸ÍwÎè"þrô]·ç;D†59‹•J¬“e$?Îo[¤Fê˜]J€[(Ën6pÚ?:ëöµP‚œËF›·ÝÃìÎ}·¿R%çÈÝ ÇF,±ï~ÕʳÌIîØ¤¸AªÅ9ïÄGD¸=ºˆ´ »íKTˆ¤]>tqÚÜ«À÷D]æ˜ÒýÓ±f?¶×„ÂÉ䔢ö‡L©Ú·›Rìîç›PÊ*²(lËý‘w][·ñšðÂdlH$«=¾¦:(Q‹É ‡B›"לAàÙ¦)vÜžÚ2[¤=»q/$Šú˜ PšjÁÊ,—EYü]<¾~üâEElm᯵Ǽ pëàè罓åvE,—²øvKàï¿ÿþÀSù·²QüìèÇãcYܨú½(o—Å#hjUÄB¨h8Ù^ƒEáåŒv½²."ðæg¹üß´b£D± c³ ƒðfiý±1’Û‹K²ò룓eØk]¨»¼ìR+[îV*Ôúßä|Q‰Q!8™g‘uƒËg¾ôÄ·bí)0CïÑ#bZA“XÃJUM>TŠhlìO@£¯xï&ÅߥA‚2š‰é B7û¼1gY±%ƒ¹vhï).úþ€r‡´Zô'EØAs¶\VÔr~’1á¾_ÔŽ41žTߎD‰Hî)´Æ¦‡ÎŽ?ìmïUø]¸½™ŽÑ‘yÿdÿµxj?ó÷MPÇmÐá ˆlôcVÞóÚhãn+¥ƒ”´étU(¿1Ý*þTLD3h`p¨Wo°Wqn€@Œ¡õÞM•ˆ!6·ßGÃvñʶ„³‡6 W¸Ø/ „w1@]ÕÑóÿÛÛ9C÷ÿ=ÑšŒÉšO”k}˜¢gëeò T=R3ƒQ%Ú—¨Õãëñ–;£­Úa˜à0Dϲ fðd­bGL埭“Eü£FíÉÚ§¨9|iäÙˆÃçW­ãéØe´uÓ0[è`¦xÆ&t©Ožôhê¶&^(Î Ï5N£Û)ì?ÇpèÑB,u¡g»è{ô'#4BV·U­riùô‡½ƒƒŠ(-ýa“Zéx£J]-óÿ3ÂM6OÉšlY½¨V¬tÄúôÃNhþ´wrºtÈô3\x„³¾86 /#†–ìÃ4$qŠE¢´ƒI³×QøCŠüªXô¡s;;[¥þ)÷w¤Ë>kÉK;b§pÈþ$‡nо¢|µÝ6Iâ™ü€?¨ÁÈ7jP}öÂ(·Ë%v· ï‘èx|{ÑÎÔÓ–/UÀíve&JŠ!·[¥x9©·-òíˆCw„^O|°")ç—[Wá×°Q.ýŽZQØLc£§¯¶_îï4w^ñ8ôÓ‘›Ý;ÎH]¼„;‹4û΅צ}Šßá‡f»ßA¹»¶S6}Á}ñÐØÞ´€}iu²˜ y5é/j‡ƒS§à|½i4ê+oÅG!¾ßÀßoiÚÒšÜ2*N Ú§ØB° ‰FNÓ€3Û± tC1·¬ú$¡Õ@¬ =ZEÂOT7•Gê‘9²etdÀ¶ÐpW…êéÓ§UÖ·ÒÄ# ¢¸Œ/›fK…üýQ°ÂÊÂb_ÜȽp¯·Î² 4 –Ø&ŒÆ²½Ò¨XçÈTÚP±ˆºû‹íGÑHˆ"´EùX$ke«RŠ÷CÜèÒ¡­< *Ú€Š8Ç«ßý}­X\YY?sÔ© ­³ŽŸ'»„²ÍlTmà¹A• ÄFUE~Ü™´¡¦ )E• Œ¥®‘Ûö/ÞoÀ–ÆÙ¥+¥ 4ŽTèÃÙí(Y¼—µ]!(hh:i£e 8`[·ëÊ0§Ö Î{((è5JP:äçI†ÆññÒ©LÊ0sh% ÛU@ J˜º§3èþ…3êõŽße“p)» !³ º‰Ÿ«è—O`pôWk+F.‰†ÈƒooðÐÜcx„Ås.€6ÁÖñêŒÖä¢&»öO`î¶?º(êh"´Èý]+8Œl2¬_I½[ ‰î‚(½3$#<šLÛ0‘]rÅ[DÍ4XkL¦Ž|¹çÀ½æ¹î7-rGqœH|QÆ=Ÿ~`Ëb¶0Ý¿Ó5ÒálUÄÏÍ º@îh%¾R™+wGÆe/>í‘7‹j¤ã¯í³³$Na´]vÕá9Ò€T³QöDã™@•Ië¿HRjÉ:‰êZg#”ø/ÝJ’צ¯ïÐÒÔë{Ú}“áhi轓~tPÛ¢¨Ç¨‹lêÈ9h måç@œqàøÒ€\cùÉ`ÊË+›ŸÊá%Æ~ÃíˆÐKééÐm{]/©(°ÃŽ]dÍØüS#=Ú§ÔÚèY\¡ëi­<’*´ê'dÛ'©‚ô¯ Q9쌴t‡ '"7MH ¶sT”`òÞÅXÁäÜ€‚ÚÕÈÕ•!ÆËå"F-ƒa QqË¥[i˜Q²I¤¡gÛ/Ú>YA¿y[áøÌ‡GÇaŸš»{/¶<8S}ÃÍ©Â,õ–e†”ļ¬2œ^ÇE¤^JZÛkðb¨•ÏB,+ÅÂðNáây›˜Þ'*„Lý—R½³)꿈•GõNYDã'b¤)=Nc([çñØ‚çÅÒÉ+ÓAeÞE‘:TXö6Cb­÷,ªÌ1—`¯nÿ´·}&ö^ƒØ½oÎTànØ%î í m0G4–T¼ë#Â#š±ƒM8.Ý µ/Á…‹p°˜ä7BCi¼S!´EßgœïÊRî 颃ÁõP™tÎi{7ê Å,ü€ØÝñÑæÝŽ…›Q˪¸/ÒÒÌëõøty0öØ+AaëKƒöLÃF›‚¥!˜øvpƒŠ i€YAìyï¬õÇe{–ñs»pÌq¯=Yµ¾C¶Šøn | æ¬§Ì¡RT‹ÚraEZ{#ïú©úñ  `Žýáäü ûDþ]—Ÿ˜ Šâðp/ÕdÆ'wµÿ€j¶r…€Ú7(~ ¯ž¬1húÓv/ô„ÙFÎ‘Š‚ û,†‘‘¯¡kB¶8v{=mŒî‘›T‘&ê9RmÒT\¦°½,nIƒ.UšjÀq …ãŠmlêñeŒFƒ‘Ð$?ÆsLHscT;’¢™Ì%{ "7½0|çr­Öñò_q&c¿æ‘¡pÅЫç"ÆîîÁAsïõñÑÉY9¹IM„“\É¡Ó[QŒBþÈ@÷°`:b.ZÁ5*ÚAL@Ó(]v‡ýNÔdkûKÖ¬½ú¡¹ûoÌ›A‘y¦Ð.`1ìŧ`—Ž÷n2mÀb¶y®°älX¼Ù9°ß? ~QT.;«[ŠÅ:ƒ[kj_ž­×Z€ÄÇÛâ‡ãÚ¯¹Iœüød ?† d![o>òY)xk"¯.¼6©Òéq´äÙÁ©@¬É™|ƒ¨Ô£““=…\‡ÎʳuĶ%ñè?&d³R‘Ѥö¹Hè €°z×ož sM8¥ûüZ<±¯iKÖº±N•´¸p.F=—kH,Á6 c×éWÁÈíùm,çÈUF“Zº&È\ÐñƒÎ/†C£[ÿ‡!UhÞ+ö¾BÖHL¼ÐwŠ¡±ë¤Ôd|ÌÒ¸`SÐhÏàm“¼§ëPòÉMIõ”‰— KSí3–áô¬†µ2û¸åW~˜(üÿ_ó%º0ìÐ*|ŠËOzJ*s T‘Íl§q-œÒÃ!uœt$‘|úÛyïáÏš½–Õ( ±¯eΨrÚý}Z?£†c± u_:””926®–ø`£zµ'ýÇÈ´DJRC'ÌŒWA$ü¦¼]UmÚÙ¸)Oôÿxœ²‹· æÔZûr݆HÉ-ÊYXø§àÆ™Øøî\@7Œ@úKâpû%zŒGÎ@¯x6‚ª5ÅÿUËÅ)‚tä1óºå ÔÉöË1QPú'¬>Ö¿VgßÚ™âU($‘p#¥­PÔÒõ•È¥e¬ÅžHM~ý'cn@4 ”êNyöeÌ4ãûj×›ÖdСûôï§H­´Ng4’&q›wvœs‰–©‡µÁïJl½¦‰×å´ÚL—€•ð9öÝJ+è¬Ô.|À€7ß*Pïàߘ‚#•P-ááÌ¡Åõ×ÏšÏÖUú>ìI³Lã±uz¾vꂇ’% ÿ‹%áé*© ä_å ÙÂ`m(74ç/wv ¹ÄÑÕÇZ"uÚä=D@}¥Õª+®=LÃxÁuo1°çÒ½Ñâk{UãI÷›§ öGK’9]J¡]š{2ØVa¿*ä1ªY$‹°3cF³%ñÂi<`#Ï]¼kÚ¬¼ˆ3rG •÷»pa¿†Œ/Ëî?þ!|óXýx*ðÌEcx×C"ý$Á¡á"½¼Äy…Hű ǰIŸN{Ú'÷%fb ´ñJNv(¸¡ÑÑ‚x;¤±-"9´ `ê¨Õǽᥓ¦@ž.¹îá”·.Ôß.þðLè³ÿü•x}ˆòµý¸®0zõ±½Z««ö*ŠÇÇ;Ä=Ÿ÷&îK8O/4—¿N›Ë_ùž Ê1æI„úœìÝ~b “x·)žþzNöÆ+§“ACì· jWÒùÞ¯¨ç†x³ZûÇ[;åÃ×ö›Çµ'2± Å6Î:­ Ög2¯ÛÔÉÅ—xš‘IÌs¨ûL‚h!eè òˆ_$ÆR¹çÔþŸ<×wŒufÇœ¾ñÔþæ¾ûÂøfà:` ±l\ëoWí˘–| 8ËE‘š EÈLÉnÓø0kü©³¤­ŠsÅí{øÁ³)úŒg§™éߟR”{õ1ƒX‹dûèôE}5l/"ÌŽ:Æ%Ü"”È{Kœ#3K~/¹½äõÁd ßã/þD¿rd7“Æä¢ôjä!<4çëS–4B×fU*̽1HW‰3€íµÉ) øéÉìHw{öÖjÔrDZ^ä²Úì aÏdà]_ŠÓ,µý'ö¿‡ßOßÓIôŽx?î¿þ¼“ýlçmÚ©}ÈVÕë&Æy8Ìc†=›ŸfWê›±çж#EWÄñœ”RßbÆE]cÐjmW*qúœCmÑNrż`I7ÑÉ+•®çf-‚•ö EÐzsͼ”sŽpZx„üÚ³™b(Ì;35ÅIK³»³„Âë„Y¬Ÿd9|êâfÕ*—t;˜Ð¾ó/Þ¤!â]I8íñ„bÉLeKÅ9îRni»¬;‘ŽžÔ£Y­—g53"5©ø¢ƒü,6Ëy›ÿÁjùÁjùÁjùÁjù‹·ZIèj¯¬›•W‡¥g·Q«óÀòd*éVçN —ÕÂ8Z?Ó%À ƒ]Ñ œ'kÎ&$G žÙë3[‘—yâ J)§ ŽsÆý¡”ð™Ý5RøoXÅÛ:[=-%ÛžOb™ Øl"‹¬vÇR‹ U .äé-ª·”g5~Pï,ín2$+U²IxZ¦Š5:Ë™r¸Œ3 “j'Ó¤[ÚàÜ'áŽRÈ(}EIÞ’ØR0¼ƒ¤øÍZ½¦ÍÔ7" æ·*ÙYœ$=K“œ@$YÁ¢Ì€» ÑŸ5å'FäÝ9êÇ9GÄ­ÖÀæ’‰ïwÈUÌ^ÍÄXâfç-‘šÆŒoä{eÕRð;tSmcä ´dÆ©œ×E5 Êl´J߉`’2ÆÐ(m§(š¯úJl'òÈüÉmN.«>‚­«Òkæ¼?œæòOs1urcñ‚÷t ËBe¬ûYNg‹Àb– KNnìMÚi,^DŸÈâ-'KÎs2C˜ÊYÛ—}¿#&®„Mùg“ç4žß—ûx%jDƒ¡ëM ¡åBq7ú£ê£çQܲ Žjc®=vûÍ„²› Æ…º(ê(rHEÄ$ìBØ ¾åææ{Õ]|-"É·m§þû<ŒÂLÏ$-Èr,$<ðïþýÀ¿ø÷ÿ~àßüûOÉ¿/Q‡T9¨†s\8}ø¼Þʃ£ö”£ìhtÖìùmS°¤¬T|:ÞY@O&&.¬£¥½¾Ññ‡/®Øù3ÉÇ’bnŠ5§bDˆ˜:Æñ8÷!vŒl禀sY¨7ö1kX5ÔߟâæÃX´íù±1„@Àè§XÖ2‰\F™EÂpÿ¼}r¸ørC`àÎr( (˜2‰ƒebêeº¨ý·Li1å pºÉŒkÜÞ]^Ûü$-D¢o!`Ó)?ßä Ç¢µòtà JÇR#½\:Ø­„¢rÜ=:7åáâ`£™º}S´\ñâ‡\$›“›ªvd>|±9šìu×”^wŒ¥*Z»ß ¶Œg( åôë0´æì!i =f_mÎå'Õ™Ò)]¶$[ïÜ œ¾¼jÙ+õ7Ù3nµ\:|ÚkAcÎÔà½;ðð’¹üe1’5šCoèjÞß(—ƒº½"êuü‰Öxˆcd¬÷+H¥hceIPÞobЋ~˜.Y¿g™ú²é´¿7»±¯Ðq(fü£ÎoùØ÷“ yƒ\B%½Ø°)”w‚ ”7nŽð»¤Zx_øÐ”ñË¡%o‚O /LzáŠËÇØ‚c^%… hq •ý‘+ºÀø‹N7nt®.}hK×5?-±ÓhGu%P'r–¡|° uè´Ýšœ8ØÊ…”jVÓWLp™‹$š³HcÜic£{ søÁ¿Q”õ!u%lZÖ+š¦ßPïjä ‡Ì…Ëb¹ÌÉ+%&tþÀýIÀÑ4é€QÑéJ†òäþ`àqŒN>pm!öØEȨó±Õþh¯tì•27¦ŒƒÂqPJ¶ØjSºÈ% ˆ~…>¼N@7XrBè0(|P«CA€b3±U¦4~ÛÍ£/N÷0Îíóƒ½æGõ¶ùâÍþîÛ&ô§ J“Z‹ãá‚Üâ©õ;· ȈY8mÿ– «Ìe§UÁ@èv< ;2ÜUFÄé¬d­‚upé»E•“R¶mØz^Ûƒã§aøó{JQ€qW‘é™Ës|z™ *(u {í˺êÝr¤`w…gÜqFòp:y5G!Š–`¹x,.ðAèîy¿‘à]‡&ôƒZo^µñÈšÝÅTéÐ?\»Œ+GqÓC\ǰÂ9Äümpˆ ¦}éofËÅÉ$í²¯wχÿ0F•×Wq~¦\—€æl@À)¢I{2‚¹Çep‚`Ò—j‰+>ùQQYÿ•‡ÑoýîXüä‘Y t"šb/×þ–]Mf픹ä¤a°¼–$£ ºEZÿ/nÊKèÖu·`ÁáÿÑ«7)H¾þF,oÉ ©ã-©£µn¾èö‹þmÞxä]¬$+È®QùtoáÐ38AÛÍÊ*ªYzÐWÊ߇c;P,qÀ·ƹ®’Ÿ XLVzã‚4„;W»jL«üÇx7Ñ2•)6¹~ûpÞåµ5jÐÔv6gÄ„È2W%ìL9ì¦.Ãcˆß•3”´ºÉˆvW`µFÊ <ú)ljY ™A ½ûõ¨¡{=o|C¾š©#úðƒ…[ºŠô¿Kå„â/Ü BhÑ™'€†ª*ƒu Ôvköê7öÓhxn à”hJ#â¨CÄ(Éxpñ„æOÈ,Q¹"ìŠÚ{rEdD!V¢± ]lˆç€^c¯4* Õ2MÊ)ôf"å–’ÑT™ çÉZnÊš.‘6î&]i²ë%íú“¨“ šÉy¿€QžÄÁn•¶øÎP©|7·?$¡Í‹_(: Á(³Nâ‹d”ÈÇiA¢T]Êp6"¬JƒÄŽ„ 5.#X2â”1PȽŽ'ã±Ü€} ‰µhx&88 I2QÇeuœ‹c 7LPÍÅÁnóäÇÃ&f ’á˲d[ Ò@Ò§€_%þ^6²’¦ˆýT§ÆŸkòsYgµn{§QÎ]Çë˜A¥j5#k*ᨠ3èô4C ä¯]º½¡òÅ-Q²œ2ó"Ë)¹r$ÓÈSK´êåX"g“².“h.ž…:GÖLJ›úÓIbë¬h~d¿Ë©®ëË¿T* ñB!)[Œ¶ïò+•ì6p/…»¶øãUéŸLDá1løðqõ±M»–¯MÒ¬¦|ßâ×Õ >Ùß<±Ûk 1½}xòÃ?ì'¶í85²:+”WÀ¼G¨]øÚ^K¦zφ¼øJA¦™æ* ¬…4ÁEœ”ˆœ}°Ï!,ŒØ[ýøx§rV /‡NÝÈpri‘¥þ–Z*± 3e‡ [­†M'CNM„OÌìªl`/«E&-({(í‘ä,y`‚Üù4^jDœ´ª“Ü|ŽZIÖùñÊšÈ"µWy”ÓEBJùм!˜Ù–HóÇ:ÉòÌš½öoÚœUºsƒÓ´×½á,LH8u@%ƒÒÔ¢+ÕÅ” <¬Cst’«¼ð<3Ш¼4Œæù‘¿ì0sS†¯â57¢Râ,@rzCmŽ”\CX“ƒPP&Ÿs#‘?k>U-§6c*.Ê3…åuðä•(±¾Ê2î¬y×’GÛgìü./žTzrL­M=ÂÞá%ñœõöŸŸlŸü»¹¿+V¡úÜõÚ;9Ý?:¥¾ó_´„“½ŸöÄÈ}ï! › Êö‰€ÿ5•ñ°×Òkú{édûc²á‹ß—Û0ʵ'k•è‚æˆµƒˆL‘¨¡Tf†íéô¨Ã†#q¦È°aDQ’Ǧ `yn¯›&<R°¦®Äúÿówx)ž»m Ð-å·ÿµžü³…· °¾£ƒ ’’Ž’¸§O:h!H7£Üu@j½we]d’` {馵ÇcS™;Úž2® ÉP2hÓŒ*¤CFn¥L<© Nµ¤¼ ?ݪ䨸eœ{'pqB('1‚݃,z„œMÌ…nÕ ½3£i(£ŠeªðSÓ•ðáÞ¸Km;Êšr¹þË›ç;»/ONß¾oë¨~‡¿e2¹hTêU±»}¶]ß ê¿Ð§fsÐo6uxC¿Â‚õ_öR~¼ÙÞ?ûYÃC­Ïcé1ß4ß>JUešo^°6“^^¢*ûÍví?Ní7yáM³Óë}L¼C&ìyÌ'+FpíìCÈí8)nÊ(5/…;r`Fùv.ÜÌ:fk­•±‹Hãõ[Þæ:8“a£µŽãˆ¦DNuÿ7¬äµ­é5§zó@ˆ°¾l†QS0E('ÙäÀާ(›Rù;Lª´9ØÝ{çüsÆÂÍ—DF@²7Ä&ÆãKý—Æò&æj]AóØÇ¿Ê4>Jݨ’0Y Z­ÍŠ¿²=IùÎ-w›ía¼TÆúà”…ƒL× eç#û˜”;R!°áP¼íïf«Üõ~׿#ø—Y÷󢿼(‘ýÞ%ׄæ6$Êa¸Ÿ5ÝŸyPŽ,4#‹ .Gîõ˜owØ¢29),GÊÝ!Jx _•$ëŸÄþáþÙþáéÙöáΞ8Û;y¥Rde%F#îü^,Hø»{§;'ûÇg(¢¢¯ —!CºY!¯~<8Û?>؇G‡§?lŸìíÎ @o²iÅÝþ5^j ‘Œ±n51TíþÀŸ¹£¾UïÌÐ2bÜ0Xní?íј~dï•é(9­ß°‡†æ.sN\/̬ë]óôXˆ ¼T*E³®Õ_“Ü#ÌÛ…e­l0cxîBêìAU&àß<ãtÿoM¤¨½ø}G&².`Ðÿ*¥‚ÀPùú¡RX’IB„ÃÛ6ü˜^ó”¤ vM ?6‚~à¨`Ͱ÷^× ñO+ž>l‡åg´IÄîÏÃ;²åÕž7c<«0ü"ã? ÎÿâèD<µŸZšl Ëo€/\÷Þ´wÞªhéê7…J§ÌÓdFKW¡Ñ—;®ÓcR{Ýë‚ì2B%u4¿öß—#`a Ì¢p6¨BN6¨¿æK7~—L¡ýÒŒQà%G¢Ï3iñÑoŠÙ¦±ö›1‹?~Y³˜@Å—åHùpÎŒÀ÷yyI’ân™ù|XÅâÑ­òíU}zOÇMÒ²lG¬„²8Uúeß•‚/c6òT'û÷ÈMiúQ±³æ‚H]gí@½±ºYÏUˆ$s§ðÔÕÛ+›âÓæ|õïwMð­œçZÐyÃ1}Íî\ÒÔ­ 3]™â$ï]iË6I+€‰.’‡/º*E$ãfº EÍÕ;n*Hî\r’g¸–±mç6ú+$N™(¬gëÑeô+y5 .¾© óo§Â½ì¤{ÜK·ßMBÜj²ã[e–}R -b2”‹«Y®bîXÉó/ÀåÈI–Ÿ¦§ÙÜ;xÑlâ™Y힨é{Uõ黤aF#ŸÓ,‘ ÚÔ‰Òƒe«ßÈ5ÓÝ©TrxJúmèÝ6FÛ9©Ú "1tQÉd€üX†ud»þbW¬5ì¯Siæ4ID£m/³f §~i$oÝIê©, BŽÕá)Ce¸%C›¸ù!Á˜ÕñgWLF.YŽ}1^ŒœõÀ(㨠å7HýG(°‘Âö€-TÃðŬ“ì Hh{Hr¡ŠÎ14ÓÁøÙÃH ~OÁ'_4íÈnÕž‡¸²£M¶ØW®óNf· ã©ô¼w®ô„d-Y¼JS.ŠŽ‚;-ú&y'Wc'ÖÏwñÉ8ö£ŒM•Å;÷†BWbTЍC´ìѬ‹d0ˆWd.>V%öûº‰›ÖU2”²è°&(ô3f B Ó‡=ô”ÍO“U;¶ ž[äч¯Œ»ÉŸa¬Ò_¦_Eíùð"ӹ¹zGæç(*ãòr£$ÖÄl’3«‚÷4á‹Ýø‹çñ?[Šã¸LZÁx„žTW««òú´ñ+7cÖ€WpúÅÒÂ"|°Ä'Bòè·Oø¦÷Em’æyQPâ]ꄜG¯‘p~¢¾$Aý9:†<KöŠÇU2ã?µãáEïšÇ苟â/þ“œéÕÔ™ž¨1ã«9«±:ój HMù(^Ñæ® ½ÔŽM>ñäyþ¨ïô°*n—`|ÓÓŸm$еÖhL~¹è‰vÅîV•°w¶¦Õ²C8RÊ£¬tÁmi ‰¨¼HuÚ½r%€:Ÿñð±j‡|Mh$LSàCG©$bXÛÐ5NâdÝ"ãNœO¦8Õô©µ`ôXÉ‚ïÕo‘õËv–ñßÀ·ªÈ¶ªæjcàWE| ºú ”\1Tõ›Õopô)Õÿ¨uãYÊRf£¶0F ÷Uur9¸Ù~%ÞVèyFÑȦ46ÓÀ2[§¶‚÷£õêŠZƒÛ¶•3‰qQE¡uûÍÚ“·õ/{¿yÊRg§ÇB7]áË}‚×îRC±LÒÓ5o+ ×%YžnòåG´I¨DnÃÒÉ€ÆÒt^éൿyóFÓ(LñmPÊØfó,®ˆ]oD²#fµË~¼Dj/ÊÉ (¸pUA2?¦$¼4æ…(0ÊA„‡¤(ýqµ¼KÐN#OûÂUµg›ÁdŠ%½.VÊ]YBðležðeàÓ³qé¢ `«‡Ê‚ˆö,¤‘lmÁÖ˜lÌr`¯ƒ:V †fã˜õ\ ~‡K¢b:qH4Ÿr¡ÇSP3å(Š©aaN]8®Œœ¾ pJÛÁ¢¬Iâìh‡ÂÐtáØi §¶g"˜Jmì·aE4œ×¯ië;<¸Y.=ª£E9t)x›´ÊÌhHHνc DÆ´Â…ö®©†e•§%jyܶZD»˜ªe*Ï®ЇˆL)’YÞ˜Á[ 5#MŒdhè»Õhôwh$~VUAœŽ‡â±Ó«RTn–»±]å.F4/ŠW¤FØ,'#q™";"p©Šª¡¦!圉¤;/ÖfLM˜sŽŽš+'ˆóãÕ5Eñ§Í1Ä€8È`æÿͨp,±n¯±rÃfð™•"¼Ò-ì8èYô4MçY:b|T·ŒÐ“GlÅeˆ,²Éz5ÜE5z«Šœ›4¹ÖhÕVFµÑ"K)1eü³:ÉÀ¶ô{ï ›¤‹1’)„&Û!¹Øo·£ûŠŸ7L}nXÖïE‹åiØäÆ‘*]È&r%rAC2…´?3Ò¬ó¾§Ÿá©Rêd1£ËA²âІ€oØ-æ ÝÊ}D¥" k"¸Ã){8›QZã) |o7Øú$Õáiÿ‘Y™œçï°f1$úS-(Z²Ò†”ª6ÊÌÜäk«˜kCOrõ<—‘W½r)r/'®³Ïõ¬ ѦAµË¢šo o¶3Š“¶wc¦ðœû`ª 6q%¯(›B]Dœ™.½Lò¡æ:²ÂlêFó-ÀŸÄÊ2ÍÁÍ•°¸f¯­ò\+S0‘µ±Êi¶©s¬êçΫ¥å©[1­B*»*<0ªFõÀ¨þ|ŒªpkÅš’Y„v‘”Ú«\ýäuD:!® >\àÈ„R{‰×åd¡"÷‡ZwR¬¡¶µë˜g#Œ”.pÁ¾¥~‡ÉÈ5q¶{bxÌ]’f†5„Ì3œ6 è™W¬P7ÓúhôÈ8<›Zæ&ç±j+ýRº0ÃIñâ,cs|šßK¯þµ»’S¢¬ ïœn—ÆÒÎæ {Zg°Ö,¨*¤ÓgjJò˜å)f}ÄÝ““ýÁ$Ôçq)(Ʊ-ÃÀ ¾¢®5€BWÅÛF£òw¡ÑXýêÂ:/Ço§8ºuìCÀ3™Î#ðúf.E5´E:C•Š%ò«K‰×iW {=ùÖ*S’ˆ˜†=L•yÂåÉ—Lõ•(—2¦›éQ„.U$ŠÛÐ¥{•¤µ{J\¤d¿ ì64ÓévóŠˆ0}b¹‚‚Ùwû-´©ƒ jûÐtŸžì#š/ÚÏß—ãGŠ¥¿)o¾åÜš˜n½o.GMy6È®’q„YEWŸž¬Yx‚ÙLõ˜¬¤8]Î8n¯?œ‚«j×,¼þ w,ÁK( ZvzÑ‹axX‡86su-€õ¯~3ŽH‘n3ScÓMLûþ!ýCúüôAÇ{³þ44‘μíÐ!ž~»ükùØØn$cÞ2ñ›aØ5˜)áØSƒ0ÈO=¾´?d×8ÌÊf$WS”g‰ÕŸ}ySˆÛ_ü³Ìv”x“®/'1׌(J©®9«ÈMô$|ÓìžA³*cNÛÊ/¶G5Õúj¦@a0Õ—± \Ù;d.’ŠÁMCQ$cç ßfš3ÄWڔ̅t…<|+¤¡Z!׸0ué ia>ü,ä f2Y&"ßêBÈ—¼ó/\‡Î & I‰n"g%çÀ<éKÉ9I¦4“¿Èš§’8Î߇[¶Û=˜Ÿ{‘uiÝû’´îo ØÜñ(!{â¦X]µ‡ù‚”ÊcÖ c7î˜A,ÿpüÍÚúÓ'µÇ«bÛÆª«öÚcåà]Æççøùµýäéê?žÖðßgöËc*IðA[á£÷HÐ컥ðý=~MÚ¿Ú`ÿrrÂíÒ]ZØ3 “‡VûO‹¦A~yÛ¶ÙÒS|*.ÑsÍÖbné°¤¨€\ßT2TœŒbzðŒèåìÔóþJåRŸ&/¼M1§È)î{§'ð)Œ×¾3ÍÐ+áíDbxn^KDôÊh,ƒŒlKqÌØv[†ùí Ž4Þöá`ø› –·$NA¬wn(¦‚Œ$HöWl#´Õèv8zQ²$¶‡”6ΣlöMGe>wbô`»ç_h¿HåÉ¡mðWaÔÍçÂArÕ–«6DƒÞP޲9ÝÀÅŠæe2Ùõ_ÄÊ#,iÓœþµbxÔñºÝL³ÚZ2 ¿y¥•†h†ŽbcæÝ÷´Z\‡ÿ•Æoª?+&¢–LT&‚™w3EÙ¥ô¾D·³V“§£\LW«'Êó7;å½-÷ÑSŸâ»fÄÙÜçsëÇù¥Å<É;'G„‰T‘sJð™Â 'fpóKžóžrÂid-¢Îœ;ò®)à=þ x÷ÔúCCë9‡ÞàN㟇¾ Z•MOIïÏZàŽUâVàLZ“aÈosä^xž'“~SM°bØ—üpÖk®ôi‘Ên ý¤"‚ÂLyc­ã¤Hwþè]5b(ë“©»êC) ; |buöY‡Ú»Q!p¸J}Î7´è}Á÷¦-î^€3G>ox_í .&ÎÞO(„‰¡;ªaxx5ìOºPÎ/;]]ºÔYlT‡’lÝi·Ýá8HÌUŽhµ¸,É q¹+»˜ô•.`Ò%,#JGJ®zŸº¾Ÿ…‹š+“KÛ]øŠbpKlp3,c,Lí&*ætUL>mV‰ÌD$ÕÔR@pïÑ…Qÿ—.LÜB–HL†<‘U”p³.S¤Ö™-…Ý_†Ò†»ERÄÜ„èq‘¸â×jï©i¤¦NO<‘׬sJ’ó1Û¹ƒ<Ÿ{,ÑU1ïUªMy0Ë][zVY5ÜÞ¸7nãÔ“:PÉPœ/¼2ݸ^¦9\/œÖÈk»â¹ÛëAÏ„‹¬½ˆ3Ο;:!¬™Šä¹;¾’ʵqúŒYäf=©PÎppšf\NÒìp¥÷òÁ‹9nWîáþnà^~ðì¾Í²ûw×»læü.ƒ±O1„;K}D×?‰š-hÓEâ¤b†º­Ç@!õ^ÇüÄá4õ‚!yRÌ?šñÎgÜ熋î]oé¹ä…™g唩& ÇgÞªÊqúýò½ûÙš³³šÌž_ÎBK”…,~’J3f™IØ §’VXJ8©01ùJ¹ç„ObÿpÿlÿðôlûpgOœí¼Ry_¡w¿ ¾r”@Gņ¥Ê4¬Ü´¬QÛgÛâÕgûÇ{âðèðô‡í“½Ý™Hç¤éÅÝþ5êM5þH•mÝjî¢/ÈÀŸ¹£¾UïÌÐ2bèÐL¼öŸöhL?·ˆ˜ÞoCÏøéY{ŒÂåÜ4C+>Á>»VžÝ€ Öï!áWP´;Ýê¯I¶ÞGaOhR¹Ú±6‘Æ$ÚŒ•kXängS^fcµ~óö;çL&TŽÔþ³£¬i÷ÿ"êP`‹Áù }j¢›š3K;3º ÄI}÷ÉljÓìH@°|(eL2ª4)”+åé?ÝxöϬvÈóés•2Q÷3K_ŠNàK9)ȾŽ28ü}ºRS­ðÓe9„7µ>P$aDUüìûcNµõÿ ¾©XpÁ¿MF³ûe«ßðVÅûó>{NŽR”h +¬¯ñUÐh ¬äu‘Õ(y,¢`žôó–ÞPa]ªhÕ.)˜eM8çN:,º7€±ªE'k€f'–fæEbØÝN>…ÈQ½-SR­ç> n›¬CÚ×ס]‘lǨÍÇóÞMîNPÛ º&ªÙÔ1à„÷ZH Xû ïvµ>& rþ\ÜÈå™ P<Ý;Qî^|^ØÔ,u;ðõÇ™Õpƒ…§‚¨FWgáµÞXݬG6Ãï Ñ¢·!V6ŧÍè÷ô0e௢[`ᩈ!gÂþ³üf‚/¬XJ™ˆ§öc‹ äj–ST¤ÔËð†Z@Ó—¥úì‹'DîPÃi^`رeŠØzD6RªBéV³?«>îK˜ÿ¼ÁÎ=ÿ¹%Çe!…z†ö85=³&Åè W{ú–b_˜/ì#<ßÏœ‘áŸ2_ÁêIxxÙ˜[È‹F®?BëWi¤À6 67DË@‘ -ÛB pÇ Ú0$ Œ©ƒÎfj ”2 Nʼ…¶"”‚•'+Sh'ðÐéú”‡'Öìgb¹ïÜ´\øùÔ^ý¾’¼ˆ6yÌ”`°’¨b¢ tºkñ`e i¯$KÚÛLðP3,³È(¸¬Ìö3\ÕÅ’Þ‡qÃ`T<ÕÚïø##1ȈY°d*§œ’õª¢å¶™cs|9BgK1e§tP´){"ņ`+ Žá <ýjÃÞó\›e!4JñRq¯ùIÑ”;2'\¦†“‘[#ÆY{.Ãð,ê7²²û>|ƒ›àýzJÐD^eâÓÁÀ«dqãEoʘÄniòÄ”€ãûï¿'Œ.žÛwl;´$ uL©ÞA´B„Á!ÇÛ¯öŸË€ÿá×—#?^‘϶=œ9Æ0r1pƒ‰¦ç[I~F(å 3L#òM¡ïƒ¨ ÔéÞ§zà‹¥W²1˜œÚ œ›€\l8¢÷ mý€LÈa—ßÀ¾vÓéÊh2иU>ØmžüxØDKÍò"hh?¹woòŒndß²…IÚS:¼òê8y¿ÚáûÕÛιÑ_p5s®bÍ•0¨c– ûÙ¨EÆtrE1ñáéÑÐüx¸ÿZ¿øqà]ÿ ¬øèSÿÖ~³úøí ÇϺ¾Â×T°í?±×Þƒœ…ÖÖßæþˆ_V‘ЖóΞzõ¦­n6’ÞΊ¹MõÎÎŒqÐñâažovŠ!ØË{ÐËûK*²>5ÑMþ~úþ™©ôл˜"`gûððèŒÌ—¥¾µW®è{—cxÉ %PCÒ90ljàð¦dv̵ÐoF—â4SV$-‡EKåPŸX©Ðk_RLÓ€™Ç&ø:w8µ¦ }/…n•À¯wÃ)t¯ÜòÈ5¢³r‘ü8´](n_\ªæÉ^ð“Ä6ŒÃ¥Ü‘ ŽÁð Õ弿©]Â,¸a—ཛྷ[{®Ÿªtårœõçnhô¬DÕ™ïfJ©›oÎã5të…nMÆÆÉëOIG÷5ÅÈGЉa¾d}’„c\Æ)2~ü0(~HAcÝ^3ä•‚ª‰)[‹—ÃGXÂTëNZtïZÀ ^MBÒþÝüBæî¦{˜ñõïGÏ&T‘Ð`F‹†Ù–éNVŒý·TÄ ¤HÏ*·îµö!†€ ç{(G“l]—ÒȦ…ó~ýñSmSš(n˜›áJãt˜¾g¦’‰m«Ô©ZŠØ˜ËÏ‹oÂTH°Rþ½lpo¹4O8| Ž1ĉ)±L ƒù#;f5DÛÕÜG®<írìv×ô´ÑJ.Ã×g2Ð _ê”|VghH€‘c·‰lzlçÒ!‡Ù6±N·‹.P×F®ŒŸœv;7bˆJ†?…lØ< 6K)ä¡M sÓË¢‹{(EW6†3”…h¿¤é@²¼‘ÒPh1o$Tª†Þ³…„/·\Í)îܤüÿGÝ ¤a5xNVƬ6,¬/[hX€ÕŸ»=‡Žáòkï?ð ¼BÒ$Ø*}o pÊú5JßÃV*éÊ–l‡öZøÊ /SÌÝÈÔíËTïü_yˆ?#oÙJq@ÂÏJ²ák ðõ¾¢ôîêæ)¥|JfpÚª½çÆC6&_é»Sj2rWºeË'ËîNé!.ÓÞf¦"“Ù… “¦­5¾kü}U4”ÙsâíFö;.•ŠJ‹ûC1g+L´”½×¥»q˜Ê&§¨ôÚ•‰eRW4o½CU{zŒRG©ÈmÜãÒÙkª{\VQ"–9gœœê)¢˜”pàKf_è‹03)òéÀ [8í±;ò‚±×rX~ÅÓ*朵2n×d$ä e½‚áN°õ_tœ½zµ~pR/«eÊ+YŽ„ÄMmN'h‘‰Yˆú¡m ÍaÓýu«|Üj,¿Ù®ýÇ©ýöv£QùØXýxk>Q£þ±® Éæ©¢]““q¢Í×ûd§Sã5 Íx9 ¢M!½®5ÇX·(MY¬çE#¢}¼YûJcS rK2Ü çvŒ^°6-–%0í ‹´]*Çpuˆ—@(3æ•„ñdĺ³D¯4‚¯«‰eÏvY6¬Š¨!h™ofI¶&µBèdîŒd¨Î?êAG@tª‹tÕ*œ òRëw [ïaDò®?B%…wÁjð &ARîAo¸½.‘›âÚ*YiÊúÉà,)ÃÈ,A}³.êåó¢&/ræ† HPB¥Fótïxûdûìè[°Œ$Ö-‰£wKþ WQFíä…®ª•à$hñ4àäCÈæcwH7xEì ž P ¦³ž¥1Óq¡f€#l›}Ü6ÓÆÆ_©>ìA¼[ÙªÓ(í˼Q;ò¯ö‚çíÁ?¨ñ…Œ?º13ßr~^hŸTk]V¹Itîýe(“g/еEid0Ó‹¬Ðs8B†9U—ôãjSö¬CسŒ×ðpäþ^‚Ü+wDQdùüXŠ ~3}{Z¼A­ú¦°4Yu;ü¥^®$ e½¯ +D·ÈÜ'° ±G7u‡Â·§ô ‹±ëÆWY1Þ…¨Æ"A8'DúG‘Ûóì^$á{n/R;N:…F±p]´B Úc§o÷ ¨–äåâó½—û‡âà 9‡ñ/èWýcc`m~¸ ŒÒo)-J;þ„,oÊ^†—¨T:|±)èçw(~â¯Z­B@8>W‰>bæ¶ÎÔ¶¥Š™·ð‹ù)lýÑ#¥9úÄ )Ã"X?ì$ôÒ¬o·Ã¯Âœ a»µšQ¬hþÅ?uóØ [àóÈýõ ¿ 5>a‡W± ‘Õ3(ý©Ìiûç©x äƒ \ô0´;$jTQ˜åÎF½ãubETW PF‡bK`Ï'ÅÌÇXE3TXð±ž"õœG¨":PÎX¼?×aQ²@Yèr«}oå4GÃG ÏòN‡‚Ö’ÍÈc­ÔdbêNyËGxY(âÌøÅD""z3Dß¡]Mp}ÀC&Â3µ¿Æ£ÌÁ ½“w[“Á;`Ƀ¢4rnŽo†.œê€H(E, ×[V¹=Ž­¢š¨NoÊTYE>Õ@YöÖÒju5&Ën*5tq E¢¸ñ'˜Uš4¢Ú{ŒxU¶1 0h»”H^Ø™FÛ‹mÁYXì¹ÝÐ „Ù & Šf ºsð_Ãïšm"ÓEA`È;;Š:?˜Ôùug2R ÛhzÔò.@øë:2} ΔãY” ïD²AŸtaubOÛAítÉöŸ“ñïüý×â ©1A€•Ç.IsŠŸ„↠(([§0&œúŽ-•êi†Ž”2ŸXqÞެ׾y{·sG+ºÂˆ¬e4Mˆe|¡§84†Z o6ÚÉɞyþžªÙ Äþö³uc¾¥ãyoq¯|Ç[çݦJÒJëm0\?£`‰BàdˆÓºfóÔ¾®ÂL÷z0Ókê’›‚Ëc^¯O.hÉ'! Ñïc ƒÅ0¼ 3R£‚äiĬ¨n¢)¦+ÊKv™*zAä~‹\¸—åu/>ÖY¨}TÒ—írUݳcw@ë<]CƒvPD¾&µµñÞíùCJ œ!ÊÆÐ'ø¥OéÝŸØíbŽ©-à0^dᲓ1Û¦ÑV.–—àw³ùòðÇŒ"Ö0æù²~üz eùâÕþáÑ –Ûßü£B†_ i,ÌK0^·ŒªÅ”8 Xú;‘ˆJ²³èOÞU%¯6#÷kh'Š›qŸýÙ{Â\Kõ•à×pl£ã³†xðd;̖¢”,ƒÈtL‚+Éep£€¸ü° mñóeˆã“(Âbk ýièD…'$Eé¥[+é‰(#%Ë K(ü¼'ÜP©©ugÒ¾Ô°1*+ÛDÇ ò‰Dûn Œ:„Ô`»"«VhxlX"Áï£qĺMCÒð+¨Ê7r;=ƒFÞ¹Á¾Šóº¨Ä€­­x@Gí: Ûç Æ<É¡¦EéShÂ(c¯-¶{_U¦(PH‚ã‡ÎâÈé~Wƒ–LÆØå€Ããê·‡„¬µFcµ2R±GvûpTq2òéõªx²­Õpvk°¥s×Vð~´N Õ”œù¬o¦ö³ÑOóCã–©£îM SjÃpìŸõû)`ˆÒ° Y`(eì™*20¯1k 'JõMFÁ”0Bý±¸Šž)‘!º«ÀÔz=É7C-o|åu«–Ÿ¬á¼=[¯p3¤¥"8x=Ô³Þ{ÌfŒÕ”çŸ6$ÊâI£ã³'b¯Uå+×yWïÜØÉpîŒA2İʋæÁÑöîÑáÁ¿=@諲÷Ù;0l6|Ë¥Evqw©¬{ˆ] K¶‰NÚ-˜ëÏËœ+¡¾Ž8t¯˜qù¤jÄY@`Õb˜üxq¯JFKCââB‰Úwô*œˆÌ¿›ŒßÕþ†~)o}M Leẖåb·|Ñ/LðÍ 7NªÃ"“Ë…óeÐ/²OPûØÇ#¿¿RÍ%[ yºA¨}åH óË×ó¡EÔ}C`Ûw'a^;$Tþ£f ówJÞ;º”qB&Ù# Ã…î;v}\ÂË|6¬Ó( fu™YjÒpÛ`¤ëQ…Ð`|‹óñÙ <¢¹N÷CøÝ!SI®?„Öñ€ÁÛ…ÔÛö…†7CÌ9Eí¦g÷¹‹ƒÃ 2j\úÔb.ÃÀ¯ö oÎ2àÄ;Ë<ýöO•p~v‘îL lÈ,q/ÅçA«„*¬Mh¯Ä‹‰镞]`ni <Ï|bxÈ©‹]°æ=󈼪º‚óØÅ«^ͺÒgÐR3ˆs·¬`« D&ÿÔÛ¯X âÉT  ¥’yTSG(%­)Òö–GQ £yó4Ï&ºØR…¢*E™A’ SuûYªÆò§ ÆÇ¼ßUbjIÕwHæ¤Sá"—•“™© Õ²ÌlK9•ÔÖUBŽE杻tGäÛ²„…³îï:¢ºì9ª 1É.†‰ÖoòM¹]â$Â¥â Æ3”ü]G“+©ìtøšÞªüPúiöÊÆ|ÅÔeâ`À÷æÚRfï¦|E68jAδ äP¬ôîPž+(„ƒ Rµ2ê³—œmÎ1˜Ï°á˜´GöPü)ÛÍØEÕû RwH}§mF–ð4IŽsíRÄìNOïÑÔ­Æ;K‰ÝùÅÂ'P6ÙÐT#û(ÍXnw­É3‡ÍSÊê¦F’Žâ_ÉÛª©Ó–»“:ŠÔéMnìêØŽŸºÉ¹ÇØ»@Ê ”t mhÖS„MuáøV#™g Äùa[YJœ’ñêÿM@ì^{üøb«‚üR^Û£SVZÊ#¸)BYA‰ ø”š5”ê«l± ‚.f÷íÁσ- 7Âì1dù‡Ú=»øÙ$Ršåþ³¯ßU¦öÁö®M„0éÈ’ØáÓ™NM—ºç#’9±êÁM€·*ͦqïRæ3_‹âèô‰¥¾b´lZ "*»ÇD~{ÞÍFnû¯~±Wð*ì—úÛ•F¥-}ÕXýŠ2Þo’­îb=}8P*¸„ˆûW— ·/;'¤Ö´6ÅÜupïº×p_å-WNÜõ#ò·\‰ù¹X]ýi7T){ÎT•S³AÇ{³þô>.&"wŸaoÌÏÍ Å2N¦(Ç¿õ …–ä½§Œ2c M»È¹O¥ª±Õ׫«áêÓF^‹_¤]º†àSo!ÓˆÔ^Š&¡A´±qˆÂé¡fD™t%:ƒYL°¶êòÉ3z½¬žQ—éHõo”ª°ƒ6ª&+%‹R³ˆê ,Œª—é^X7@ÊyqH¬mß\ e"P}Ý>¼z²f\»Ç±Šwü« ˜87‰®)7kš)‘H"<:Šh#>èÂtjLá*ùÝ=8 ‹7X÷ZZf,«Ôm»ø‡j»¸ˆUL—»°oœë\w³QÂç*PL§GÂïyéô‡=hÉZ›(­ÍÒþl”4(|ô6ù¦!"º!D´dÒ"×9ü#æ¶tAeïƒÐZ sá¾£4VCõNÕ²bRH”%µh§œ°.û~G8®³ vIØý’(ñw˜éÎü†aãà!–¼ƒÌÙ#…â DEü¥ï7õS¹˜%ù€^/kQpò€–”f‰úÒëé°@ÈÕBÄoRÓDÙwrû…¾G;ô‘˜nrDJ”e8܈¾¸lD»ŒÐg¯®öºÅaL-6¡¼ì7õò¹,%i¸a‰ ÅÞØoë54í yG„!„þx且õ)Ì4ÆzVTÀ[üèYyå ^þNŠ©(¤y”w»Í€#$òv å^M]­4R6mцW·\³ôƒD\­ú³7€Ñóá] WhÙ[m÷4I>tÆxEôêô§EšÍùf£¤{[‡©Œ€fÚØq|97+«LCâЬ“üH¼n°UÚq*_ï­ò¦vâe Sm]Š‘g$ #»`•’NXÀÄwNu¦1¼sX_Í6x|y…Ê™¯í'"ßôøžPÛÒèÎ2'jK P¶þ4 ä]Ú¹»¾#,ìöWªs™¬áñOZ¯~6à?öcàgÑ€sSûm»öŸ·Fe㣨7Ø‚¿ÿ|§|Ý?IªöC Bô«ìg€©~`¾i9íw‘’‘Lï|KŽ· X—zyàKSö¿UP/§î{B¢çûï#Å;W ¥§¨lõvýøäèåÉöï«ü’mÚó§ rÞãšüCaâ³ç7樣É[£˜Ýûb}ËCÃÕ$ÛË T\N%Æ.G7Ö­jÊ›oÚµßvÝЗ'3Óì’Ø'ë—>úÀÕ­¨#~fñ›V°GbOß©3mƒ›¾ÑT¶wÔÆ”UжCÚÉN”ƒ²mÃÈôð‘.&’”Û/ì4 ô÷¶Xví [XÇÒ‚™ÔÝÞš[j—X•¬Ç‹Û/þ"{ŽtO ùHÉF2JÊFâj„ ßÑT©eq‰(T>jñr&‰Îp¤Ò»k„1\å¼/3íÚ2Ž‘+B¥¨n—÷BBycèŤï#Œkté ¿sC³•©qëÜô:V\éÀ@f7ÔIIFÚª´éœKý‡ÕdeaWtºvÿ¢í2´+eŽ.n—ú´Pl 3A˜#ÜA•<žŽé7ÌŸ×:'xñÚŒz±r´´ˆë+‹íÎ…Ìû÷G[kÿ)4¥Ó”ž8ƒÝ‘ëÊTn‘sáº=ÞDÀŽèùˆÚu"2¶ÝËÔÙ,’Œ5{.™.£…« Ûª>à3ð‚>Þ×Pˆ1”Emú½vÍ‹ ,®î·þË"ˆ!·èw[çÉrç¦Iyª2DóÍÚŠ6BÃÁ¾ÉáôiMñl š„Z+éjZÿh–‹u¢†‰+Ÿ×@j± éä>Ðoã[ÆqÔ°ïrÌi_S{3PžXSvF ÉQ¬)#úY¸<5)+>!|Ügò`|7;ÀL'‘D[kèÇoL½l„E×uLî°dâݺ½j¯ÆŠÀ›éý–¨0­ÛlZ† ×ígó¸£l éÏMq“wéxï&Ÿ…udJ'ÒP¶‰}]rÐý3r™¸¤19r%€–ïë—~ß­óËô–O\Æ Ž‡¥„ƒLL µN®¿Á}€?Vë_«’ñ½$#veGL¨À°cXÃG½Ï”Þ¤ƒws=ĉ FÙ"Kb¾Ó¹À;º1}P‰Fð£ώKiè'¦IŠ!çiKâœ]’-9ëËêéÄsê^%ÿ8âÑÀwï Êúl5æ)'‘ÏÂá‹J„ÃZÔýpüãë&ºß5_íîE}ès®™Õíb"@ŠJ¿éo­Ô”=[Œ©\fìϳõ´þ<[Ÿ·Ò%Qj`ˆ$_‡ÎJÂön‰°½ñÿJN)èÇ ç Ó Ôÿ*JÏ€CgíqS!F»˜/­â¬È<#&"¾¤cÄË>ÇzbìzñˆÂ“ŒÜ_'ÞHƺd§Œ ?ÍšF•3?×~|"G VØiE=ÿ N{Fä„+z(ôÑäãéÓ§UÁzþ¤Ö‘oö¡ˆNš¸„ÊÔ®ã¡ÿÕ³…_²KšxáŒý>z’ônÐ!MSŸ›Øæ”܈€;ò®ß<ù\žÚ ©,®¬ÛçYOìkiA´*–÷ª|Ÿ³wð¢2“™Ô4q.Wîò +<ÃÆþP*qROîFÿÀŒ{•Dv^G1!9¤­Ž\]¸#´‘ÿ¢àp€ë/²éfD¯ù×úAÈd‰,dMYF½òѧ®cW¶³èg‚0ž†×ZAßâ[ãQX†Ž"Þ1|×w.¼öÖ“µZË+´« ú ÀÉ‘É&à]ØÈ!]ÈvàA7òlAÃUM<[oà§$p¨‡ ûÙº9†Jþ€ò¿ÖÇèüq;YÔ*¥è§¹O†Ù2HIÂчˆ¤ª^OµẪiM£l˜íÁ`˜Ú—Í ˆ†ø½FYFu#9„·ýn×.}Y¡o¸;øË„OX0íVƒæÛ–•‘ïu’ £äàí'U.zV= ݺ#†÷÷à çaeqSß[r'i+·Äá7(Ø6é´A0:%e3ÔÁÀi·Ý!»SÅS ‘7r)ˆQž;à³ph¸î©¢Œ¥MÖÒk؈†W),\-!?³dµKQ»ÑY©ÍÂê“ÈÆ¡ÃC/òÄòç~¤SÂ÷3²ÓöQc¹À˜ïu :ê¾[Á;…°P|ð‡î@ec•ïàßÙíöîµÁ\Fîù$7Ärhd2Fy½×!©ˆ„ŸñC]íža’ Ôˆ³ž±pëSÁ*3Ù{ɸ[*fø…§hKNUQ[òC¢Ð]õ¶VZŒñbAöØÂxÜ*ÈG)sç4,KŠ/š’Ó\ŠšøöÛæöÎÞÑ ñ]"2|}£mÅmàÍu:óûZÓUŠp¡éŽÜñd4À0…ŸŠ äî ÙnŽËIóhÉXÆ–1õPN,—ŽžÿßÑâBõ„;âB_*Û>ر#Ä ¹îöŠœK+aeDð§/Ò¸®‡ÿ?ê£+^Id$^vJLxÁ1÷’MÆØÇr!LôPb'!„‡{Ê&)MןÇ,‰ýþ9-éÀ(j„¢0«„XÅ [ÑÜÆã`3¨%iÖáaؽŒe‰ª¸ô¯(_u Ubc^&«àK€ãÛêèˆ#L,É@(mw„Î-‚_]÷ WÞ;^]eªVi㡨½µ÷ w©—1@ÊÞX¼p;þÈ /¶å•øl½Z”™®2O•Œ¥‡éP –ÞØ`P/ †f®È Zx½˜ ¥uá€É?Gd¸ï ¯Z•‰e¼îVÝ›t0†€ ͆2ˆV‘›rMÝq»2TÌ€ =â&#gëœb Ö‘€E]|YC–Nu¿L¾ul“¨ÔW¹ç­ªh”Ö*•M¼ƒ“ÅzÆ}Öóoøª"-ˆ¥Çº †å/‹oã=ŒZ-Ù+õúfý—7ñvåòªí ñW½³ÔßlT oÑ\~o½ùeëíJ Šòo(,ä'«ê¿”ê2€D¹1( ø¿óišÇX|Ì’1a–LÍ#}Ù)‹.N:"5i8•îW¬ã¤LhÊü‘®°aj·Wïäa`z½ºd}>ˆo£Œ…|;•‚ %×ùï0ŒÖkcRñ"`DfSOîOª–¢Í¤œ…É9Šo-†Bçp|»ZMNÌÌEVȰÓâ$Ì–³EG€Ä)#c® í?±×ôï§ïɦã%\A øûÎÄ?î¿^Q;}erµ–BAÛþgæo Î6#-ÎÙ1yk3„*¡¶ŽÖLPÎËU£ñ§r«x0|Z+¤8kNw/¹ûxØ•î?gÇ/82Ý¤ÔÆÎèÂsª!Žu<^þŠƒ‚ÅзöÿˆÄw¯†Â“qšœõ?/>7çØA¨?*ñ(´DúðägJUM”h@™&E0TJ BP€¦N³ëš#Ê ²e‘/N)2¢dH(V~nì<Ð¥ì˜\«¹÷zo§y|²÷bÿµØ9zu¼°w¾AæPòDÝ ´ƒÂN(Ó§ âôÊ} {™ñ'Ì,M'‰\FãiÞi ¨Kx£KÑÑterþþ”\'¥–2nPæ 84h¼áSëô0ïy‘,“‘Û$Ç×€ðžÒ›"å.¦ VÞX¦$88kžþû4êÛÕŸ .,`'ØóR7I–IP‘bcQ—› ôAÙ­£EU²- ;Å)¨ÈrÀ tÄÖ´ž½wz M*GÙab³"3ä* Æs“²xïÿ 13qi_ºm²#ÀÎ2^,…‹U¦eúp3ll”ò Uà"P/4‘Ò\ø²Ëb$Ýq¦éFr/jí(5 ‘ùQÑ¢°¡Éا$èjß)sTúëþüAͽ4Ãbìšv>ΰ‚ærH]‹a> dxt— Cl¥æ•RÍÉ lÒZe{ ‚ÂYÎÑ΋²Cyé¯\ÑGw-va– ëŒøTr •ÊFúR¶ÂôDòvãÆׯ~­åÖB:xßÒRtÜMÀñ³í—?mŸ,ë)ˆ¡NFú”õA6šÑL™*Q±¨Â4^ÁLˆ[ Çtx";êŒ*QŠg-–Ó’—[ÏÆ CÙÃ$P‚0{†ùÑÓ[óú}·ãq²7 ɲMÕb$)–3¸_Rs˜Ï®ÇË©¯žt1Õ(‰¡b¼õÉ@-!C˜_ÔˆLÈ)ßië}+¹öVZÙ”mé •½q“,ãC,X/̨ÊHè`uÜ!”ºDPH ʦil‰bL˜4]5“#íªn…Š$dfê×Àm»AÀ›-µ_ÀQÏIŒZRk³›3šíôð®:l6òZg޽™¤×ÍýØäÌ”ºLĈ[çóŠñ†EÿbºÛ˜·ƒ‚÷¦M§ÓiúƒÄG 0ñšºoD)м°ä± ÁƒØe4È`#!<#`øÏt2®™ŠüæQ–¶N/ÐÈÿ‰0á±ñóü¬šòèR‡P.©õ:½Žœ,a¼äà´qŒ,DÉ¡.怀°a–ɘ{ÿù)…É<-ÒO { (<î©U¼ “{x¤”7”…—\124cŸB;if „SÕs¢Æ•ñî^[~¢,³Rr¢“ÉÉ~ŸÀø]`ÐVÆcPd&xè4àFÓ*™1yA‡¤ž€ž/y8Ñl¶‡½I€ÿ+bŽ:hÉÚ±Šœ–·H“ë·\ÙŒ9Èžßoíq‚ ´ŽZqoîŒ?éxµkKA‚½e”Q;†³u]§Û×7˜(æc¡,)T÷Or 9ºéuæ§ŸÒOBÑ*¥7 ½ÑÆl ) qãp~ gÖ=;~ÁãdzIo\&O é  2“Ê]ÓÄ)›f-@<Àoÿî鑜椻ɡÊÛ†HN…éŒ4xl q]X Pì&øÉ+ÈÉ—ÔÛä G¿OYaUNí˜Å軂¢ˆvg ‰O”ϧò=œ{%ôJ?¥×˘Ië#%î”Ú‡8‘Eð^šß1vrÙË£ü¹ICùïsžC¾£1‰—|—AºæaM·#[béƒXú –þ%ÅÒ» Áû©‚L¼xYÀï÷O°•Òðg >¤³ÀŸ•<cÈ!±RÙ$"Rpa"PnK&:¼Ä3xå§xT…‡Ï—E(ä2æ £Äxìì.ñg>ð¨AL9ð˜Åò¡›Ÿ89;Øm¾<8z¾}P\hjƒý€NíðÛB!R„&h çkïuÓkGЍÚéESê²ê9°ØŸ1Jü¶®0+lÿçßÍ£“æáÑÏ(gÈ<õÃFÐt±ye&óÙÊIǪ¡è@Fï»bØsƘzÄ–üq€Ã‹7œæ¿$Gc”—s§Ê…£×³‚È)‰ôEö.R¼¤ ËèTV6´xÉ(´ìz*¼Ø‰ý3‰ ¸ƒkÝ÷^àµ`Wo¶.½NÇ¥û}´«š‘QÈ0ã㺸. K°ê›$D³ônHf¥`A7ý–ß d´(-.ÉÁt@fzyøãN³‰ÌbyyY?nm‰'z)_½Ú?„ñ6Åwø¡‚ΓaáïðŠS¢;ðG¨+¸ÎŽOÆn³¹¼ŽoÙ’æoV¥–šŠHåJäZ_#²Š’¤–Ó„ ás©Eu´{\57ßÇø*‘0‡€˜ AÅIÛ”ü~¡2óýfZ\îô`ùcÕ¢nBï•iz ¦ª›i™ ? ÄeÁ›!È8´"oCT$³áCDuz$ƒÃÜÀ Ÿd!À¬N¯Ýó¡i¿|2Å“¡¼Ë]!¡Wuêúø?âý̇‘ó+nX̸Aò Êe ËÂXQÈo…X& ꆕ£×ð¬xÎ÷£œÂð¥ïqÎteK6Bü3|-#Q…®Äs¡¨ÄÉ jzËv]Þ$×áMQÁvÌâêÖЃö®Kú}èëpÚJúíªr£ +„ˆ1k‰ê1bvÚ½f,­áØFQ'²¡ƒ-0d»ÛÉ»5ø…g•³ç?\$Iœ+RK°˜éT þm¸Ï/ð&J³ÅSCåÁ¸ÜÊ 0‡ÁêÜR’Þ ²­égq•]Ùƒ¤û é>Hº’û é>HºfIWqôùÞ¼š¹r¯ªx7âoíþ¥`ÙÖtaØ(H’œLµFCårD×<%L6ënÃ;ƒ„æ<©Ü¦ž02À}ø•47‚”**h¶ÓÁLMËI˜Öµ€Ù²ûós0º¥}/ŒÿThª­¢&]úiñ³ÁR,iÓx«²¡át0Bü<ºÁžìÓ…ÿµŸ8J–Š8ha´bo¥EeÕ¡ KædÀÈìX |^Õ:nkraED*gVœ XL°æ¹@V{Ð'¾ëä+š)MQš{QCÏ w4fY3ª±Í3@—-”xƒs­‰ ßïja`ñt×—ˆ HÊDÓJ&†­Ž¤éÓz:÷‰uÆ9‰‰sƒøqèüÆ$hñüPwßHæŽFq¡â¯0á«òÄKë@æ£j'´Ä-—¯»2]`—všf´dB¾œ>KõÈ._`Kqÿ‡J+ ´5‹“?ô±F óÌÇÔº±É0¯ƒ“£‚qàÓÉSŽb{ÿu5%uâ #2ÆK4ž  Q¤ÀC§íVu¼uŒSæ`Ä"NŽp¼¿c§Ó Ç»~"÷CDÑõ44»nH01 s²Ñ3£$]à=(¬˜ñø{CÖ™ÕÈJ›Œª¦Š•t`˜p7óÞ¬«¤Ža—0Ÿ±të•yŽ£=ãɈŒ³Ê¡q`“£pTKø&¼)“l+Çd-µÂ|U¡Lõ0ln …%µŒhwÑ£C?ôÛ| ɋ֨¼­WW¦V•ó&d…PÜ0¥Õ8o@à à_¹RR7R³™´R¾œ—Ç(¶Å_ïrÇ6Ì\û;V7¶¿—Ä+çì¼ †ô¨jd$ä2m®ŠG7ì·½0ÔhdÙdñYOý_yÖùÈÁŠË­6þh‡°í@ÚÚ,¤LïYßv0ÂiiGj¸µñHB ] ªdµÄõü4+¤$(­?OÀ$› YkÕ/“-iê}[,îìÈ·˜b¨Ð©×Îë×Dç–£1äk>öŠeúvñè‘0¾‰s|Q{oH®$Ýž‹Šòâëi ¨ôQôHÍýphÌþë×¹ ðú5¯Àë×s¯VÍX„$´[-Ãõut!‚^Èôv` ‡#w8òѯÝMþ‘U3ý´ò¯Œ>ä†õ&]ãð÷Åî4”ÃãÀü:ñ¡Um)WœÃÒpH÷zl]ªP“)ËxcEmÏDZ™…vT¼Cè²pÓ·E}-"  ,ŒúvåŒd„…PËe¤QŇG£MG°Ý³¯ñ%’öU¶™‹v›’2«k œxÊìGõeüŽ.Ч˘3&)éN_ÅÁÑÄ·=¯ïûò;ý·N€#|òÐvóôl5¬^ 4¶UNSHŒª˜"àL¨Ž¹°°'QÒÙml%w!fº¯Ïª¢ÝÆ ø”ÙZk˜Ç—#Êá$ï¨n¼ÎºÆrð¾á¿˜ÒP•…uÄ:½Œk¶µ°ÓÀ+è–£-])᧪¹Û\máʳÇK}1¤gF_ñèOz†•ò¹P Ä1;Ÿ´hÔA›VgŠIkZä9åÚP¼ºÈC‡ÐádL!œ@Ê›¸¦kš«—4Oå¥ûW•1!ÎÀ¥Ù `6aÛ ÐÜ]…HA[aÆeŽ÷+žuÜ1HGz &ˆÆ-‰žævÓèN÷|sjÎf0i#ùÂQ{ƒôÕ+pŒë äÅǬP¨T°‹Q’°Ql\çÝ"kÐÁø;Ð-Iºü®8'X媀ÁaT´ã“£æþ‹½ƒÓ=Ø2ížë x ”`–'Ìü5Ä7,¹'m½ñ #kñÔu,“Q»ç_”IZï£g (–· §ù§Hß‘Mý¥Ýr=1% ÙÅå™'ϱÊã[üŸ9ùMÕg“#4·qBP•Jz›“dìƒßŠl°)]f¤ ‹®&AÂWøÂ©–n™Î’MÖÿ©ZYî7\56RUŠ¿vZßC“–ø÷xLÌTù9p ;cû,/& F8ÒW3¦`2Ц ä§^öýΤçÓ%_$¦±¦‰z莋÷`l˜Mÿð†,²¦ø±[¹uN¯hÉx¡>†ÕE´„HÁˆ«KúªÚˆÍsD¯Ø$m6kû”[ãN³FOFm—Cô‡d¿€Z ~3˜Š0çQûj±B9¥¦Ä¼N öCÜòå9_ôab’ø9†¢7àP›=™Q–A‘Ù¼VÕ¹!Î?ê“ñʵG÷’´(ZØ“—§(i8Ì‹·¬:¬³Xîyïܨ ·Rä”öd4vß»‘fgœI}JeJíPEnN¡25¬" 5%Sq£IÚdˆ2JëÃ0eÈñ>åmÃX¦ eclWÙQ Ú.&b1¦QS3ä ¾aï2åàÞõ_ÄÊ#LÆý)4 Ç 3³u®{Uô¼ˆYÒ ã©ù‡ÅÍüq±“ñâƒâ@÷³ ©5 Ã5žIxûñ}!ŠñBù +‹-õá`]{/±.ûàóÏׯ¯F‘-3©ˆQ„Ø.‚e{)ùXŒ]½H¿Ò¯0ŸbQè•5QHCÔ3­:QôAÁ'+«\©án}ÍêDê°vhv²׃§†Ãû†FSxÈËÀЈÁÏšÕ~ôÈÂ;H½zR`Åã®IÂGæ°ôŠânµÛME²¤ ·[¥x¹&ë¬"ai¦TõhˆìŸ]Tº!Çu€Â׺pXs¯Ûî #)Ì·vÝ wéŸp–8q=+eš2â+¶¤´èÊKïDB‡×¯£Wû ›@š˜2÷O¾/ÇMf‚±•œÚ-¸`˜“¡ðFo< c&µQÔj¸½0C}­×!~uÂß ‰Œ (Qi §ÕPC` e‘½º±Y‘% ÍÝmÄ£0_s ÖJø[°©rsm¨QA¡ T× GÀþkXµFØCÃaaàNÜ+öÂÁ[É% m!ßÎÜ-»ð-fØäc¥¶RãðÏ*v)ޤç:ÜíñÈaän;#›.TD“*¬¤×¾„µ‡ 8€tQ_ÑÁÔ/Ó!=9#l ®së–WŸ–Ï#vl3Â8tðÀdUeÎ<¦»U¨Ó'JàȨoú[ŒvýýÿTÙ—F|(ì·Êõ7¿ÔßâÿVê »a×ËówoѯÌû­—²JX,ÃÉCál©–ê ¥XlðUþûªþÕEù\¹ã]¢P¯Z––tÿ`]Eô†~/K ±V Ù¦|‚€–-Õ°¾^0iùÁ.Y —`Ìr–¥ÐÄHoÌŠ¤*ïÐ! ŠËñiáüDt *½ÜÙ±#ë,gËDD]è%‘÷®„ÊIH´L×AO{$²cò†lîéгʹJÆ®OM"¶ØvE285ÀŠlÏ[xÂãÖL ‡#á3\%o_Ì& b|¤§SIQ^7Ø*í¿8ÝðÏ%ðlžîoŸlŸÙ0°ó/úÒ÷Me@5 @Å(¾r5ÂYþ¹eG ûººPÝØ\³¿Þ#q¦lJN±Z!¡ 1F‘€ÜüˆVHAÐ[®Œ«ÜÀ0‘;âY«V“9¿ªfù»#ñ>úƒ|ŒT‡Añ¹ÒaºW{oëêÏQÎ_=Ú\Èv±7˜³-D ¾R»ÂNâ-˜mZž[QÑB#!:=|«éÐyhK¸‘À®”I˜þb· û»1G2·.ß´O‹® ÓjDÍþ$QK`M$)ƒ^ă]̋².ÃH¨D2) tD^"2GgŸ—bòD.Í=0ÿí*Îsì€_-D4f2þ†1%X@üFV±Œ´)€8]2 BÌ)y#÷Å…L¿qÎùˆ)–¡•pÃäÛ|g×Ërñ6R‹Ñ¼¥Ì LW­ÕÔÝË} [–7bcÆþJßYiGJL0ã{$gÞ-µ ˜Z±´‘wòH«½ LRêuõ9ƒ´g’lIb†æQï†}zäµ¼>±E9*›¥b°Ñf •Ú#×+¸~â(TÛ1CË)Hãã|NC©¶4”7¢&-mkÊ;˜3´”·ãå-G@fâð~Hµ=”À²f}ªcí]éªWc‹oüY’?k¾arnö-~QðùºˆoGx¿8¨É»¡)å±HôÎ(NþM™`SN>„&—l#ï‰êÖ¸HM1&qÕ\h¶Û8Ø­’=ÆÎœ—zðÝÈæö‡ãÀëׯÅ>jÝ1U••æ.L (1Ú»ÛÝZûúšéɾÊ|c"ôÀñmì] ¾½[a<†YlÁ^áÚbùÕ«0Ù,µGcŒŒÉ´=´Q¡ãuPˆ—·Tx„Ç‹›š²½wǶpzv1ôÑg_bë<ãw .ÝÞˆ`è?ÍGœ2šð²yЉí/<0e_ •hlåXga†0: e]&Ñl10`¶u1éu«S7D—ÀœýmΈèµéæxÉÒ{+mKÄ»æF´A"}KC…˜Pç ¤™êäD<æŠÌ€¼1SRJK‡-†¢¢èÂâ:PÐD™µ«}%«|c¤.ƒÑ 0RŽÂø ñBÃé¼Ñ• ~×h[qî. g\FD†Dâ³¼–’'ÄšŽ+SW§\}œâ¨ãö›²;|s6e`rIx­ ²F`¡€õËŽŠ Ó!¼ß0´Ú%©±?^ò]nÎV‘Åœæ%q|tröjo'¢‡TÒ=Â9VQþìºñ'#Ìd:vû倶]ìáEÓÃ.jÙnsQScFTþ\Äwñ6`cZ?ü:lrÀ;A¥ËÈGnøÐñü’kï†òìĺ#9‹L{dGt•hsÓ§´˜“[ÂÑ-ÛÏ»t4ûÛÏÖ«¦¬OñrÈ=SÚ*|oÝ(ŠIšù+©Ò@Ó!{|.’/?MŽFNqž3ÇGrŠ(D¶Êµç,4”¿ lutÃE²xLv[‘žŸÑŒu¥– sNÑ]¼OgÄ\úgÔwzÛû¯E0¾éér6RöZk4¦T{xT‘Œb ‚$„ySÍ”}Õͱ!B‡óTQŒl΃ì^»í ;å¥ZŠâ26%!Õ;^@§ÍXC@¨]6¯õÙžö…Tb“Æ3‘D ÐÅŽwL_4¦ÝˆÔ¶Ð}ÏÒ‚½—ÙåÑþ©"[¯ ˜Ø_ñÉHÂ!Ÿrå4©ÿ3á ¿d.ã?ö–4à°OŸä”ÑÖÑL“‡¡ú¿\Žl¿o=·±…OÍÓè§4?ßà3ûm½XÕÞYë³L}œ&#!X·ß¬=yûQÿ²Wð÷›§L? Ê—ª×ÑvóÊÔ/LÈa!õ~…vº”C{p±u©v3{Áпô…BÁ$í4¯ÆÝÜ ®ÉŠøÔ¤þLú7ïZž·&åô¥Í,¯šÚïršYÓR aü€)/SH%V%ˆÝ ;äjþ«ÐN’Ao`ØfcÆÒv›µŸ{UZ,K.ºÇ7#¤d`˜ †ÔšÆ ÈÀ§ç²y–1ÄŠlrØ…kΈi·’“‘#Ñs•x "áP[Œ1 ' z?¶$¬UôÉ{L tÜ…ØHÎm>bŒ´b•S´},ÖXžíФÛó¯,8zÍïùÚ^XûíèZ™"Ô¥´‹›ëâÑ£úE»ÝèT OP$´s†b Ç5!¼ð®•âÇZåÐj¶¼ n_­·]Ì9”“Êîդƹ®©SMYËa“©æ£&(<ˆ4ñìÓœt«!¦BsÇ%  #  A%ËñÙGa²zQŽ_°ÄBGJI`AöùÛ ÏÕ ã|Ü‚õPcŠ(ÖÄÙâvÅaIcÓF·ìT»‹6ñxuMñ üiâµ$U¤k&s–w‰2ù°C¬Ûk$ªÁÁ#?a9y˜0XSŠ[¢EN °C{=êÉßÊ<•±ñÉ#¤Qª Qìt*r^,Ä®ëÌÊä»^ÐÑ~pÜPgL ~ï=áu“”‹F,7€r•„\ì;Ù`2D.°H>•÷{ñ¢ibšvKûò®œ‰Jǃ0£u…$QVkëÏ i2eVtÜs¬ ”Ün§ÚçEÛ£+xN;Çì+ÉåQ®ŽÉ4f×|jŠÒµv 5­…éÔËh½Yä2Ï|Ÿâ§r1%®î ²„ «d<”I ý²,ûRÀy:” ÆÝYá&| äɤ£õkã‘ÓñPÿàôFôèQ²œ<»bàXô”A“'â'!†SGÚYP®K1+Vní>³œ> ÆðêFçÎüˆTU‘qBegC6êÎh|™z’§üä0Øí eP?Éë²§öSšD$HOèçþv úÏݱ#žˆ·ç:¼—€> "Fìô¥Md½ë£m©¼rq}(Šj{¼0Œõe9~3*²ÎQ1È!™pS µ^mœžì•£2]bÉ%“ë[¯È^2E¸éw(%"–Í+Ž1š0ôvT‰0H1Õai[î…ÇNˆ¯b ×R,7+¤“QzÜñ˜c׿ey‡(Ù|K° §ÿç¶ ]o¦WÑ)µ–òD½Èñ#ÂEÙ.·Á`ͼ p;û¤³ÓÂwHÁzÙe’Ý+Õ0˜H`£ìZA “äV¾çAâ ÔÅŽb»1õm(ÓXµ—–V¢ãQ¼±¡oÔdÚÑ3@ŠsF°¸þ»r¤™]å©BcV’ïpˆ.üðÞéMPwƒŸ¸fP‹\|‘˜¬Ïv AKڭДWI¶³e6¾¨»dã•a›”ª‰£]ìâÿ.ÑE³Í’…M:èfäaã›~s|ÛÙRKX7YÇ) Qõ*ûsãú/å/¢2ð½l,¿ùE¼]iTÄJ©ÞX­«ÏCü¡b*kƒøänw&ý¡¨ý欸–t>¨AwÙv 6²WTÆd)&ž­×ðjS…#m¨¼®$FªtºvÜ8-½¯IûøÌѼw'2‚çÞyþ»»t}Œ04Ïþ#»1[Éß{T»h2 ™îê[²ú†” 7ÊÌ…åkË—kÉ€×sòv 掬ô”¹Aò®ïªW.E"åÄußyĸ+Í×UmEr? ú¬ÒB»ƒŒâ~yæôœû`ªm61ㇲ(›"k–„6‹6ÓRœµ‚H¦·¯ø6ð‘ÔI…UÖ2Y ²81†d•çZ¶2@€É,œUN3:I]U?wÒ­T9ñ6ÌPA žჅøÀXà_îŠûæ8Œˆäi¤ªÜþRÈ9@>MªCD>¿Ð¥uÑ - qå&Ǧ3Ç5|-äÉ5ÀM_Ìäw±`¶-}Nš‘%TKbïZêÜÔÁVšû '¤rèÇoSˆ“¨›¬Ùzkô-¦^Ȍޡ{Ù"»óÆy3FtGîlw~/½ú×îþIN‰rˆ|hdàt»4Â>0NO¹Ýc|~V_U…¤ZÙ€ZjÔ[‡Veè|=Y³ð„¶Ioܽ"¾[tÜ^8sÕZxýîX*÷RƵNo8r)M©mÇff²[íW?‰™ˆJ¤H›«áiÌ-[½n\ìÊß-×ЮO\èÌÚ»ëKÊò†ï߯hS16l8$õºiVï…é)v͸$þÏÜá%Åq­'7ñíG­'ÿl¡d þ;87ÊÔB$‘ ñ2‡¯¬´¨¤›ƒã1°Ž¸#´¨¡Ú¡Ã0/(B£ÔÙt#l4¾vp YšÏ“¥ ð2aqZ@,—vñh×á|n†ðL-?›CÍaúšÚ‡ä-IÚ7˜á0‚ñáÇðêÉþm»°ØîìËׯ«ñªíøøCvú é_þ´Ã/2Ï(ˆèL-}މØsƒ *ý©ÐèSÞ;|å|Íz «wØjÊyF”çAÜ)—9éf&ÿ,s/Ï\<Æp„%ero£™?ɳ?ð}z¢®Ã7Œâ…ǹlxgÉ/y¹:Âð_”ÛKFGÝÀ£DK¹M„œT1ã¦1ç²èÙÑÑA3½¼N3Vˆ2Lbš°¾îÇ{ïõ^%j”*Yªˆýík<ÂJ«ïv)ù.µj¬?È£C$qì30 íQlJÔqcƒ‚¯¶÷_ìâÀ,Za"ÒnŒÝ6Û…oV*eŠ5UšÁÄGªaÁ¾¥·hõ†*7ÒŠsfžko,V㫃‚ovGcT£,E›‚’8.=JìœL¡€wN¦èÁ€ ùã6¢GÔþlv'_è•ò@¾#á…åÁ9ˆ„´kË<9 u«±qkÆQáw‚ÌUh^ià5Ùiç­¡+j¯%Ñ®!þâp°;úm)¼e$'k<^ÊRÜŽvª ¡Jr²^z]UNGN `xÁ&«Å¯¼¾cHl¼’²†mÛS”Ÿz©'.,d‹ùnv©RK¥3¡}ùØj[ÒΔ¬ß@ò˾6š³Éd©@"F—Î0ð;7@Ÿér*'VwŽQ{Fj6ùŸ1–uò‡/ÇÐ Í›x+erÂÜsŽÉa«Ï– HðXö6…7Ø;x1Sè§hWjn¯kt&_G‘u‘sẽ›hÌ*(ðütWÏJÉvvbw_ „TËÝ[ êâ$šLAÀ“WL‹Lk´ÚrÍÕ±—8ÝÝZµú;'¹No³€À7¼Æ»¬þ{¼`Ëa½åؼß>ã]Feœ56£,«uF÷c*ê÷]6'¦dJW%vƒå@ú¥ âUŽ/ bÀ`wö¼¶‡±©Uo8`bt<1I†¥C 3ƒ¦½žä,>O$¼º‘ñ–ÐZPæ¤5#WD‚ú˜Ý\ GDg$3f%ô{ˆ‹¦’ˆ´¦F®¬  ¸§<ߤUß›tßø)œXÒ4ó¦§qˆ®‹R<àré7ksS¬èøRwºº™KYåìýÛì3…YŒ*¤\ª8Ñ9r‘rçµ åžB»#1Of‘æy¯>^ùHWS‚hšAÖþ2s³úÂt.Ÿ›¨=œÄÍD.‡CgåÙúÊGôJM؄Ĭ4¨tsI)°"iÌw^góº:5Tî Yïž¡¡hØÅ9‚}ÝBt*L—› ³Myˆ>—@u_'3'„žDŽB3Ì ‰é>KQ—)Rû¿rZF‰¬ t _¿6®(‡Ê¿ç¾.ÞÏLFso½ [ÞNŒ,Ü…üX˜&8rUî–¢bándć…4©°pâà. f+•rä¿ÂrB‡,$Yd¥X˜"W¦ µîñþÎD!£”'RÎg1gнŸ…Œ&tOƒùãhm|H!Í Ýº¢®hó±ÿ, %’n†äí 0_Àõ›'2ør†XÈþ ³æª©†2øLpaIüà´ßmP€|îªxb_s€dg€Vñ*o:î¼–ÛvP+ BšöëÇ(·gŸ3~T“ bdEh$…‘•Ñ[‰%Ëá`Âÿ‰Ö ‘¡B¼lä’`ˆT½Ë©%p•±Ê)J&œÆ¥¤'}·ï &}âvÈGΦ†ÆgXõ¶`ˆà3_8ï}¯CLŒ ˜ýŽ Žß¯"œµ§ÏÄ¿¼ç5§ç]`44£ó-w|…÷¯Ÿª1`[¯Ÿ½x±Ãcb}¯9 ÉW>e’𠙝ÃwzÀÙdð5L»#‚ÖèÝòZEC§¦(…ÃM9“zpÅ4A Í«ç€:#Qúp²}¸{ôªV*}_‰õÇß<u±&+bíÙÚêúºx$VŸ¬¯­þãk_?>7œì2/GQ±ØpÂJZtf{¡ ¥Ä5%cT5·ñ;Ÿ!M7<ØpOñV<›ý²Ë<Ñœ¾ÜG 6“7 5Š›p[û. [ÕÄÊ¿ça¤+mB&•1¡¤¸$yQ O£(ÌÒdØA#˜‘{r léØÒ~Sͬ^r2¶Uèv «¬RmG$ÎþúØru> ¢ X8_ÎȪÊ`ݦPöøôº²ÿZ¦¬æYPþ­ž–Ó.Òä$JÖ§°Ä üP{$ Â/&JpÕ6ç,¿F˜µ±µѼöóIµ6aÅYOš3÷:¸”˜Ø7+qú²ÂÍŠƒTÛDCab"~O #”™ ñÀ_Ñ9ŠXIFêoæ c®üt«Ô|³^0zØßÞ¸Irn>a“k¤ÑïVð ÓÐã†1üˆ8zÿÎNÂÿeÒðMPìÙa;ü6R Göm[,ÿk{¿µ1ЕyÈy‘âÉ|ñ£½Jp*ÏÖ^ÏQ#A·Ù–ø–X†£*üêYthýá¸öãk¸;âî§œªÇ>œ‘r4•Z&ˆ_@ŠëŽe* '–Á¤"¢_õ99‰ÆRFˆöyÁ°j˕ǵo¶kÿqj¿}øô¶Q©cVt4ÜÁ"pöæ“vKAÃdFê©7J²½†m¯Ôaìu<±sËÛsÄ8K$»KÙ¥My§ _˜»'Snú_™¬|žÕ˜¬˜;‹Ú¶?­¶p,GÓVÃä:-ÀÏØWG ÄÀX ˜^áKÔÏÍë/~Ò_4íÝŠÌÏÙ¢/Un›§ µZ¾H‹æ£íay³K5?E]F/<™¹!µð±¤˜”øÚ惻Óòß“r¡r®L ãÌ݈X@t-°s>½N'A hœ$V1~læ‘ø‡½Š%ôvF=òr4‚N‡÷¡„…›4p{ïõ†’i¿q¶~¢ pnfé²T‚„ØÖ ×&Z½ïdÒ…B~ðåûîÈ")£ ó Š’Q˜ƒYÝ+eû‰ÿûæûl+W+^På°|YÔ<µ‡ËØfÁÔhNY¼²UR€0–ñ­c%Í´PwÓèí%œ£<£Ð?˜ºî38hä8?¼€“†ºh‡ ËÁcŒôHÖ«#2ŒPá$ )È Bmˆ7«µ§omÊ‘EàõMQ†œþÇ”V‡=˜¹­3©ä°áá÷xx äÍ£.ð\*›øL½©)Ðjƒ×j¡6ªÐQb´‹‡›QÇÎD ê»Ìy½¥ƒ{ª7âœ!+ø5vxZ±}˜‹£œ´qx°vz|néÃo:?›e>¦MÈB3ÂìÿfNƒˆÇ$V›VuöùHiädûð`ÿy$MÆ9ð3ÍÕtnÙš1Ö“Ñ…¤¶zj33Oòíùð”L+qÏ+±Ï‹^y®T Qä™!ÂâÝ•ë¼ËŠ­9õéþÅÀYqüqýºƒÅ`‹´Y¥Œýå)iÜ_`Œ"ad‰:É[þöµáƒ…úPç×Y¯¾þ ”þ¼‡›ÐÊbf|Vz€Ñd ¬¶v›'?6јs¶¬™çHݸQ|ÐÖý´u£§ØÇÅus!”¸2L}ÑÁõQ#½ü‹½Òë ‡ncYàOø§„šíÕú—ek÷º¤ûþ:p;UÕ5EÞ\à­‹ë^HÌöŸ¿¯XŸ0ÇÇ;U¾™aŸÃù¯wÇU2Hê¯ýwÁå&é´ iÑÒ+h:¥–.™>3“Ör°Õâ¢ç·œÞFžW=OÊŒé~ß2 á#¢"`ßf=×W>8w¯Œ{beS|ڜƭ¾•³[ Ú@[Æ)÷ÛfObëf˜ÁB³‚„^RÎÝÓ_ õÂédÐ;¡aIÀÒN<µ¿Q/³’ÄÔ~ÃdPå)RíËŒ0(—÷h6šÏþÿÀÍ%fºu¯D‰ÊüBg\zdŠ=] ­ýfH¡?þ±Rh!¢0‘Z1Ó ¾ÉhŒ>1dñ²åSˆ÷”K‹l;@Þ÷»ð á\ùà‰-W&ÅÕY[2¹xd>ÊF÷o{¤¯ƒ®3L¨Ô6ϲ º ªL+ªÜ+§kg”sÝ”æØ‰©¨¬En×~-0³ÍqÒÚ8Üÿúëw‹Íô)4¡¿Ÿ#ÛAävGU…{ˆq‘Xœ;Fžˆÿ#ñãfsïàE³‰r¢Âž¨i‰U}ú.-¹F“0üîsÚ¨òDÜŠ¤sœOƒÅ\õ Å­Y⟤:cÆ| Óœ)+Æ’øÙ½sFþ“Ìcþiù #ª­ÚOFn_±ˆ™g¡ÓBâ«i¨²Që]´Û¢ÖÃÿÁ¯ «l.öÊ`ìÓÍů3ŒL2‡p B2NH˃ÓÖ…ÌÇ¢bs«„~˜|³'’ÀOq“{–gðÈ,ü¡Ê;SÌ[èÊÌLŸxž½Ã.FîP}‰Fwú<ŠÁlb"ðl^Ó„¥mìrÞu`Y—IQXŸ-dêÌYpü û·ü]—Ÿ>8~qŽ– Xðe›8Þê~Veâím™rÌ•BÃІöHeQS¦ˆos¼º4Ü'æþ;q8Q$kÍ^·WïÍ!ÞsfÌ0jÉÏï 9âd€©*zï‘ì_õ+å­bÒÜw¬¿­Qýíý_ ·28Í´4)ëò,J­îZ_ŠSRb2Ò ò!Ϫç):ÇsÒ€ ¡ ã®°¾ ÄWA£1°„ÔÕ´qAa5J+¡YJÛDj¤ÞPikò®Ä¨’Vøó­¢©7@~.Ñ»(²R4½ÛLŒw$û3û®K\f¸5~¸0{¸0ã 3ý¥áyã.nоР´x°ŠBª»bU:$RŠËl¯Ä[J©ÒKR~™#nÂ!‹|a~…h„†y&.Õ!ò>§°¯|½ÿ sipŽÛ\ ÏÊwî„óÜï™ûää…È0RÞ_v ˆw1ÁŠHt6¬hÔuÆý¼G†Á¢×sÄd&°#׌W o€Öíë{;ƒö82C?˜´½Î_&2·ò9žgîñ~2H_„µªxj_Ó†Ûq1 ì—¬ê2C™žÚj¦Ëú/æª~.ÛuDÊÈ`hÝâ†!ªf–ÑGÆá+oR–¿Š‹îcš~tf3<ÉPÚeÝzDÜ¢üÀ²$’¯Ùoמ¾%›kó…½R‰E,pJ_Í:#ï½Êí /[ˆÓPÈu¤¾þøCâ±U€a*q²GÜ=åÚo¸‚+Û¡è‚H指úùSî X³Ÿ‰å¾s§›5û©½ú=v.×PZ…Ž3rÚãˆÎ¾ÈhHòkn˜ÁÌP S(©¶w溨À爤’oM1{6ˆ?Ä.ù2ÕºÎ8‚G&[¯ V0½ònežÙ*ìJÙI~Ÿ7üÌ’N® »E7+j'ñÖ[ôì—ÅŽp²~¥W½O#2LKÞ*Jr7$¿ò/k û™Ys?kh—Ë<÷Š/Ïe;èó”àwYþ/¶wg‡Ÿ;;þÌtúˆÂ&ŠÊßOßcØÐž»âgô·‘›¢0 L¾p劾wq9†pݪŽå{åʈ3‰Káµ^»J“.˜sgp£üŠ™†ÒÚ©G Nïʹ èx¡¯VT¸Þ¾ë ñ_<~8- ¤ZR©Ç¨@Ñq¨+m„ö½8îc˜2nŒŽCM‘ÍU£ÅHÁv/ýÉÅ¥jïÑ©~²ýª£cøÐ¡ßã›É@\ºÎû›Ú% Û¥ŽÀ+9…@ÿg ÙIfe1Šó”c±|ã‘Jn ú¤š’7U¿_Þ€"ÙQ§Û7Ê­PrˆVafýð½Ð¬ÏGµrõ gñÈêØáÊV) Œ%]w]Œ®=¸,—Ñ@ Š•v{”÷3Ó^Ã] NxQèögW·šjöCp:ö‡µ_ã{„ûñ_æ"âýõ•?zwÿwM÷×@4‘ÐQr‚¦´¨…_}w£ôþâ}ÈÀ¯•ö÷>mÀ~ @tÝÔ2aÃìïO‹ˆÄ×gpT£–̘ʱRÿ;ÆÝo¶&}@¤ÇNSµ—;;l-þòõkz4–žv¹Àœ§¶ÚÛ>{¯ŽÏŽN6Ô[6Áñl$qgàtKÈ륚´ë#óB¶ÚwÚ#O2]â…«`aQ ô¤f]ºÿ®nWlŒ>ÆA‹!=F&8zâÆŸˆwÿJ¸×2tŽNnøÑ!#!´¡¶9ëÓ’Ø5ÌlÈJ¨ç´]™R–£íu%¾a·HsØÙ(F®4WÅØQU¾¤‚ÑòI X£&g¹jê€ÁÅ"žâ¿3ÎyN›Œº¿ý¶ypÖÜ;zQl÷ý ß/~('­ž×ÆUg±Œ™*€v ÂcÄáÈ{ï€W¤¼ÂÙ,~Ú,*@Åb³7&Ž}  •|ÐÜ’Î"&Ëô)´P¾´\\iˆZ·7öá/œèd5KT»€ÞðÕÂ=AEáœ7å¦ïaq¾j¬­­ {“ oS5Q–Àð.ôº0@üszÒP±a5x+6¬ŒÍذpÎå*5, æ‘6¢ËÇøZÁã7~Wh“= ¶JßÃãŒÛ¾Qúª¤+[²ÚÍák¹˜:â’8vFëÖµrC*3‡å˜¾ë+ª§F©4¡ßq/Ê*»$N)µ…ÛÓ ýw®;øƳT¾¨ª64F«©TTVï ‰M îDØM|¯|^ ÿÐxK&4’ +M¸UÊPXdÏZ Y(ý•°&S¯Úij'ôo/¤ú0:ÚÕÜ’ PV ‚ê}8¨ž|²ä‘ŸGíĉ«“J§Ë€x]; zÇ6N9t~þ§é1‘4²°I)6¶²Éi0E|ys°+³/)Òs*šÅ{“|+²±M#X©èäKW,¤ç•… žë Apí9ø»c£ŠÑ±Ýk·(³3ËË3¯…^ëv}C¸£‘?Ú@²ÕêÁ±…‰¬] “43ðébäô­".9ÞehÄ#ŠJÏÒ‹ENÎðð ‚Èh”XkdlHw†@ÚÊx¨–”žöÅÄÍM,­œf”¾í©¹÷Ø•¢çŽ]Ø>È :Âî9ò2 Å688³ÿ«C 6 K¬—(7¢=³<ÃycBÝqYjnÇ#ü׺xôÈB‚¿{vr&ÅÄÉ*!Š1rTá!@cD„ÐÑI¦¸b‘·¿x‘£?Õ R™ˆY²M÷hÔÏ´À• QzãŠiÀL—ßàoÀäÿ&þvQ–¿ˆ¿ý­|N˜–ÿ)7ÆMÄͦnïªÇcK|@Êô/ì*³¼=¨ãõº^›Ø# €d¡ÒUqÕ« wÜÆeŸ’=>«åÚϽj9½ˆÑ§räÍWb'êÐ <,‰mÀÛíý×uÞ¸‡Ž÷w7P]ŸëÔW]Ó¸%ªúT ¦B…!ûÛP\Š5þ¨XÈïïsÕáYË\“2¥5-Ç4Nß»p Sî¬ÌãCÿÊ Ûñ¸ßK<sÊ›–mxtº.lØñiYçgì ¡ì?ûú]¼a©¡S^Xx[DZxöõãµÇ¼(èü… ®DªÈ*^ÇÄà9Ž:"•k}‚R¦³/‚A9CúŽ “>ÞȈK©ƒØóÞ)XëËö¬sÀm‹° Þƒñ“5Qëó]¾ƒ£›[sÖSf)E­ÜraeeÚ?#ÿüø@»ý!gœÊ À°D)9½H^uÚ¨ð ¨rtоi‘®`6Ì+„Ó¾¹¸ò ‘ṅWOèoÛ½ Ëùˆ|FÜÀ L_9ø=ðEÒY¸.°˜žV3HÞEp˜Þ“Ý#+M2±Ñͨ¸Œgdyza­¾¾ŸÃl¬b{œoøXô£Ñ`"Rᑤp¢`¤VhÿË ó{ )7=W[®Õ:^€ázjÎdì×¼>ö ¢åô ¼»{pÐÜ{¾\̰¶PÞck¨¨Ï%!äD$‰H!ðOÇÉe]:ÃÀïÜä#‡4«Ò¶TEÓ ‡$žsJ?‚Ê`v€|õCs÷ß¿‡¨ÙÀ¯µ b9Úß•Î/ŒKb÷ÿ^óõì€â¦ yíd©?ÓZŽ6véxï&Ó7ËXÌ6y2• “÷­ªò¦XŠdvVgLvéOBd 3ÕȬ»„Áµ. §Î‰®¥uº¸pîíseà%$¢¶A&Þ½ru¾ÜÔ)M”„6Ú/¶œyu¬û¤å¢‡;¸mÅ3§¾ö/”‡¥ðMœñ©A¢6u=ž­×Z@?Ž·9> O;"~|²†C²-(1riY)xk” :HëZ 9å8ZòìàTôaŠ{òŽ¡K×§Þ GFðö~l¤8×[7uÇǹkÞN§VË cZ…søÿ_£b&P–Ôr¶¤"†ôÝ)cF몆÷5̹t–€²“þОMjÑy`bý­Ì-ô—GµL òÞ›u™P;CÞ+LõˆLö¦‰§ZÜ Ã*å–o €ÖZûG¬»¯'5O@Æ_’véÃA ™zå\h_·/Ÿ}Í×¾ùNKo‘ζ_þ´}²œÑ½*žw+[˜j"lF²4ˆÚD4›}Ç“¿@êÒ _Õ®Diçèè ¹»BcƒÿZ¶#J¯~zµ§_ïìàŸÄ{º)ó®ñwûÚlÇRf_:ŒŸ”:gc w!ÁîJx)Ì*@„Cí\ÍÌ@ÔfÖ¿Vóæ%´Á˜rü,L=¢0æH³ÖHLØ…ù[‰ÉŸÀGÿI¤ìüÝOÉHf²¯œ›,ôc~ô“I&S‘Ì1Ú¬Xª¹$å'cW£Òüëo”‘<½:?yÁDF¹Zø†0¯ÜøÀ¯;){äPöÇà\ ãž+ƪ¾ìhÑEÐ†Ž 8öŒó8o:ãÌñFãûÉiSH‡žˆZ H² „3oJR8ÀX¾G8Ô…9‰ì^ý¬ùl]!í³IhßbµRiëlz¬DöÊdÖʪ¾Ço‘W#f:{O–“쨾CÀ‹ÕÇaxvÛŽ%‚ ¥nä¹»h÷ç¨+̘œî¶]Ô¬BÜŒÉf–Ä+푊›§›¶&lJ·?“Áò8twºä#,«ÃKG&À­Èž÷ þl4^‚Ž :í'jäàª>û.BTT^ Ê zÝÛQi)Þ´wÞê\ô’§¢*¾ÑÉ*h Ï{÷%œTïdå~uå~å'¼c-ßo6‚ÙhÀ|˜–7OÿOØ€´Íƒ<‚Ü™9x¸ñâ}GÛ ÜÏöÏ¢]e‰—<Çgã?27rUúåöºÄp"çå´ãîxó޼sz ]o†Æv&:³äyž)Æç|„æíz¬l=NûfÙÚ!ú˜ƒË2ÖNø" Î’'&.ŽåΑ( š‡ÉÃãœã]Î4ëhC3ÈÞ)ñ…fÂÿù僬Cws^Öþ^Ê?1Ã÷ ~iOÇû;œÜËRF¨+2;=›+Å´ÐôMÔö_ Ð@¥¨î1ѧ‹Lhy›»)ã—W+†§OIVØ£ä=[xoòýˆ,¯U´ƒ.VÇ _ZXC,?©yÒµ]T ¼\¦Ê†ë&€ƒJxU-¡ ”ÌèÒ¥tÎh¹˜‡ƒR ®Æ:= u’ çŠË›! çž Öquä®­á÷\Ô×ÒrR€#ŒÜ®;ˆ ñÞsžšÜ«ºÑJ²4víè:ê´áø´MZ‹’%چ͓ü©ñáquµñIlü½Ç±è\6+‰7¿ˆ·+jž¶$hf¥¿'*•RJm”ϱÀrš3І$ ‘j ‹¶y%¬e_-8ûëÕwG£ŠÜ6¦å}4 I%Pªí, ¤)Ëîµg:Uб)cÀ/÷kÄ•#Ão¥ÈòÄ¿a—Â*lè:²øï7·SÔ>3"pnÐ"™ó£ŒØçAV| &‹Oé€jóˆí´Œ©N­ziZ>þ¡˜kgÊõ_JõNY|-­´ï›¢þ‹Xy„£sl<­#ÃÙ2?cò¿Ž×í ³¥h‰Dš®ðH?…”Þ(Û6\àÑÚWÁ_)Þ-G×MÏÌ×#5ˆûãÖ—Ó«óÂòi&9Wî.µEv·J4ưޙe6HK iR_ôO±é™YG¡[™ÎæH02#K†sÕK‘鸔ľ‰ðqܪã1ÅF W C «xKQÇìq)Ùþ|rÎLÀfrdµ{s⥨C6õ2ôà–ŠAX$ghånª¦ ÍJ•…ÈCqª Dd]¹”Rt’K1i¼ÎÙIõ]‘$ô2é}’ù(=RÓQ”@.‰í!º[Ó­ùDÐ ©ò õ.잯Ÿ’¬rU2¿8çTsù†H2ŽEY vA1#j>š¸i:67Œ8¯© vc`uÉÄû;äCñžÍÄŠÒ*ÍεUØÈa ¦e¥¤ñs…mÈ …Êî«FºÈé9<:ÍLQs¡ÌFJ¡ôÝRP PÎvñÒÛ?÷ßu¼ð+IÃÈ#ð'·9N¦Ÿ'aÂl]•^3çÿáh˜4|8Õ™¨“{²‹¼§Ó]*cÝÏrÔ[ô4›°ü#]rrcoÒŽvñ"úxo9Yržcž¢ƒ©L·}Ù÷;bòèJØ*O¶r¶g$Œ²,?<°ô–þÀÒXúK`é,ý/ÂÒ‹–A0®1ö0=3%–Ú‹P–-8àƒÄØ2â¬I+ ¯q5òd: /c …uÂHH­ iÑÛè+öBÀÌp°¤Ú›¢ŽÍ©.8`¸œ>Æ÷82÷Œ¼œNø³e 8‡‘uÀÈuþ¤}iTÍõ÷§¸™ã0m{~Ì !$1úIN[ ÁŒ2}™¹?oŸî¾Ü¶œôY.“˜X&&_¦Û†ÚË¢Dœâ`N×Mt›Û»+Ðk›]4Dô-älŠ$eJ㛼-YTâVžr¸JF<2Ri/—v+¡wFÎÙ·Ù6èF‰lF>|eÄ63Ãä\²Vsè ]ÍFårP·WD½Ž?)[,™èýŠ©=¢ –© d!ƒËæ›/Žžo4^¼8ÝC·Ìç{ÍêmóÅ›ýÝ·M{ë§ίÒ$_ÅEc¢úU>iPpwô A'šT«¶cIñC…Y­íȰì·ï ¡EÖ`оZ~%@fôžô˜Ÿ=ŒÉ Zé©VHö&Çž‡¸¾#Ë $”+×y' ¹Ã í±ƒo¬yyâ%d†1GAáÞý d4Ú@X?[º¯—(æSLl°,Þ¹7t~@·2Ótêç=vé|ááÁCF5)jrYh¿¯ ©¢ +%3É–E†8Á°ûœ úÒy/êr&i› ž5«vlLs¶ñÄ Hº4pÊ2Œ;-M•t+ÏÛµçËÌMá\½#ìÿ@¢òòr£$ÖÄPÕ3«‚L!|±ñ<þâg«BÂõr0iã~xR]­Â©Y»_¹³¼Ž0&.–†MŽ‹f‰Otñýö ÿÏÜžµIúÖŒÜÚdNM,»6Δ½‰ÂóÆò›_ž¿]iTJõãÆ*цsQ;Þ^ôþ¨¾ø)þâ?É9_Mó¹s¿š³.«ó¬‹¼U#KòèfJ—µF :vz=z녮ᡷ¸Û&3†{; <›N»<8hî¿BGíæîÞéÎÉ>FÚþ˜|%)xZP„»fL뿼y¾³ûòäôíñ¶Žœ þ"rŠ·œHJìnŸm×7ƒú/ô©Ùô›M]ÞЯ°`ý—}„Ôo¶÷Ï~Öpçà€™3ù¦ùöQ*#4>4ß¼`^H//]§Ó|³]ûSûíqíxÓ„…ÿ˜xÓôˆæ¦†–ÏéN°ìðš™KS7­ª¿CvhNëì[Ű_ ~½‘¨‘7­ñ¢Úëìú:p†I¾†Éo{ãÞ gƒÁÈßC9Žx]Ê HÁ¯?^Ãi‰c#nS„Q (õn 9;qòÜÔÆÑøvUãng§ZÂÑê¹r”I³ªx² EbVÊ¿—.a¼4”èQ0`W6rˆÿ÷a<ЧDq&Ü_'ˆFñÐ^”%Ã{†]6¥i-L£vטÕ@çû‘™l1”ß#Ãȸ”U(‚Š.² 1£ÞB]ÅPü¬‚ýôà“µzª”#aö©M *«1-~‰®p H¦›áì1H–ö? •»ˆó ‹*è ¥°ú1›«0Ð ÚÚü´¼VüÉqª‰<|–¤ž\sLÉ]™ýeû~ŒXÔ©«öž;¡J«W˜qv ’Ò5-£çC¿:ÞhË–OnÌáeÓ2Nm•²òPQt‘¬U‘`A\‰ÓºµÆw 8˜4ÔɤÁ¡[áOÃÐ q©Tôº À?#qÖÂh/ùt@f× ã•O)Χet˜Ìu+åáB–*ÝdBNÝâ8›%§êŽóŠët99,z ˜TŽa¸áÛü·³’ÉÔ´ý'ÈNƒÛc¯§˯UÉÌM$¥lÛ*J:ÂOex*± Ì´S .G@i*·ìÀ§t82ž4¿¤7 FÞÂyÁeôw2Â3rØ™* vД‰ã¶&Ì4(ÊÜÍñÍ“Œ Ü¢Ê?Ç#ß²´J¬×>ZEQ(Ör§gF[¦YPŒ#«Èèe‡#Ø&׺Q&ެ~“8 ®K”"–2.‡hªác¼p¨š¹éÇÆ1%K¬A%U`qöYŽëÒs»c’½(Fùèb‚®PAÑlAw®˜âKêx×OHà‹Ll@Ø’wÊØHÙu~Ý™ŒT,ݦ)jyèLäàMŠ8S.I¤Áüp˜¶¤$ î¡z žta…*e;x$‰.ùÁþsÌȱ¥Q‰õ„dH8?ÈŽ“—+u•~Ì‘¦È0·ÿõG˜pê»ÃQ,M¼Íí(A)ó¶/F¨w6wq´¢Ãbd-éM –ñÎÔx…ÒF›F‚Êë|KÇó:ßâ_ùà[çÝ&,õÉöÉ¿)ë£Ç‘•íy2Äi]³¿yj_Wa¦{=˜é5•`”/_à¼du#!  ´£‚¹†ÖŸ³˜$0 O#Þ`JÓÊ6÷®(/ýMØeªè‘ܦXDE[ 3-} ÛÇRÙ.WU¢Sìîhf‹V ÏaéÌ A¼w{þârg XG¿+CY{¨<öÅû±=%æ:jáe36Ûf$×,Å•—àw³ùòðÇfN t/¿¬_lmÁ8ºË¯öN°Ü–øæv g0dØm¾X‚ùðºe”ß>r–ñ=QÓúh,ÔF6ŠfŠ4}AzY­ÃY?Ò]‡¡v§$·R}·ßô­Ê8ŽÀ°OºGšÏ—]µk¨ì˜ V$š\pùaÚ|‰ qKc™ô ¶bši4èhJ/£ðªLãU†F’ÑÌ•ŽÊGŽÝÁËZÕ MD8uot L¬ïÆÀ¨C¶±; ²Šf*F½I†x#ÖmÁA/e#ü C»J¤£®Y~ĘÀ +8˜¢š€ Ø·˜ýlèŽ0‚[[ñ€ŽÚu”²Œï¯<Å<Íx½4aäÃe‹í^àWUB`Ì^Ä äø1Fàsö"ŽÍé¶'cìrÀ¶:ÚÚFÆÖ«µFcµ2Rêâ(6å™Á¹•{=ºæªÕpvkáÅÏVð~´N Õ”œù,ÈSûÙè§ù¡¡cê¨{Ó:Ü~µñ"ÔhìïÒUUh 'Ó@¢Ï”2öL•=‰™¯1k 'Jõ Q/œÈPWÇ¿äSÇÈÝ‚U «*ùf¢å¯¼`Õò“5AAŸ+ÜŒ£ƒs|NAÍö (=§t¥Ö¸.ÌâI£ã³'b¯¯(£7‚á܃”¹‰t•̓£íݣÃ3z€ÐWå‹=ò,$—ì°MOå© 0tŽ´AaìRX²MtBÐn¹re…Ó–9‘¸fŠoHaXµ¨ïsäZÒ *€’ÑrZº¾R®J„µï"èefÞ µ-àw“ñ»ZÂßЯ¦ÜÛš˜Ë2F‰Ã40‹ù¢_{’×umlƒ[_‰LJ,SΗ÷6¤(VûØÇ#¿¿R4&[ yºA¨}L6!ƒh±n!´ˆšt'=ÜöÝ ÞãÚ*ïj„+HÿGŽQ“’ ©¾Ñ£K'd2="§}(ó\ºwåU¾F5«ËÌz0LnJX!´ßâ||‡G6àŒ#Ãã~¿;¤‡u‘äúCh’²ª¨ÈÛb6x­µ½zm‡Cl',.tLÑÛfQãÒ§ p~|°¿Hxs–'ÞYæé·ª„+ð³‹|8pG@È`ÂeCf‰{)]|9¢tÖFát¸HÌH¯ôìr¦ÛÄÏ3Ÿ?;rêâøcóžˆÌLÀ«ª+8]Ô¥iÖ•>ƒ–šAœ»e[ib˜üSGl¿b-ˆ'S1€–JEO¢”E7Ш"îUS<¤í-¢@;G!òæi$B_Ou‡«6< EUÄ’.’\˜ªÛÏR5Ž÷8m0>æý®ãPK¢¨¾C2GÀ)JužBp(¦*!`ÔØ&&Qêa “Ë;=zÿ{4&†°PƒcÖý½¤ÀËž£† t¼Q==§c%ß(™¡äïaλ1’_Ó[Táký4{ ec¾bê²2 !_Ь­(ù=Ò"à+Ì–‹vû˜à.gÚr(Vzw(é!ÂAP©ZõÙ0Ù‚6çÌgØpLÚ#û (þ”ífì¢ê}P©;¤¾Ó6#KøƒNš¤FGƒ¹v)bv§§÷hêVãÆ¥Dˆîübá“(›lhª‘ŠýN”f,·;áÖ$;„ÒÁa“Ž =’tüJÞVM¶ÜÔQ¤NorcWÇvüÔMîÈ=¾ÀÞúe“®¡ ïFŠfö¹´L7‘¬sKâ”,þob÷ÚãÇÿsÍù åµ=:i¥¥<‚›"$ZdRb#•{“ü¤´T_es̾?¼ÊÝ#TÐU+j÷ìâg“Hi–Üxy}°½k!L:²$vøtVú ¿|jêÒ@wà|D2' ¦Á[ 9‹æ½K™Ï|-JÌgblqeÅhÙ0ѧÜìú¢9fõˆû¬eEl”¾úÅ^©£éXMÇ!ÐÒWÕ¯Èr“ tëéÃR˜ØWX°uÙpû–ˆr¤Ö´6ÅÜupï’§×*o¹¸#?eç«L»‰®þ´ª”=gªÊ©Ù ã½Yz‘;ˆÏ°7æçŒæ…b'iËj”ðïF=h¡O¯Ãaif§\<%.$Ô5aÊ%!UÕׄüãõêjø€ú´g5Æ•¢gc¾X Á§ÞB¦5©½QjÚØ8DáôP3Âê¼ ÙàûT[uùä½^VϨËt¤úÇ7JUظU“€•’E©YDõFÕKSv’n€”-2r ±6ÅÒ6™M2‚ÍP¼ã_´^Æ]s‡tàItM¹YÓL‰ìðf¼h©§Ý#  Ó©1´’ß݃ò`1€u¯¥eƲJݶë-Ôvq«˜.waßȳoë\w³QÂç¿+)¶GÂïyéô‡=hœlúkm¢´6Kcø³QÒ ðÑÛä;˜†8ˆè†ÑzH‹\çðl˜ÛÒ•·"~@7C ì^ªwª¨–“B¢,©E;Á =1G×YŒx±Øý’(ÉöU;àšß`ð!¸‰l†"…â ²5­$þÒ÷:-•W.fI~ ×ËZ\…ü %¥Y¢¾ôz¿ëÐVÀÕBÄoRÓDÙwrû…†Ÿ;œ ˜nrDJ” @RO.ìu®ö†Ì—Aàõ_(QÛÍE½|.KIÉi]c¿­×êåówDBVZÚXöÙWÞàåÏáHLíu^Ž*ïôu›^F:i8"Ð5<s<¼š:ÅiôgÚL¯n9ÑéÒ\ú³7€Ñlj[KDhä^ÕîKâÐã½Î«ÓŸv=5ç;4¹¿—u˜J½i¦mÂ7Êá>a$«„ÑõÓ0m%YÔyÝ`«´ÿâT¾†_[åMÙ%ìqS)?J l¨ÍïkÒ„UJ8#ÿÈpÞÝ£0®^d9¬dfǾqBÊ×öAI‹ùÚGÀ„ÙJˆ}ÐX>Yq\ i¢^ßvû+{¼Œ®?(÷ÿ“Vç«ßÏ:×`³…¥RÖ'¡[×1p‹¹©•ð6„„ÚW§ÿ>åqÚÓê\E?È*a™ÛécþûXÿ”ŸE/Ní·íÚÞ6•âÿ³÷æ}mËÂðýïýYŸ¢#t, kAÛ D9‘AØœ°]±sÀƒ4À\K3Ê̈%6ÏgkéîéY$ØÎfŸ$õR½WWU×R?:jDù¿ÂeQ<ŽŸŸ4ªzŽQpC(ÃKŠ-˜)è;$VÒ­ž¶ñ)«ñRS»‘Õ³ƒoʱЕ„xÞûh&ÉLÑs߇£ZïÕw÷v^íµþ_c™kµÛ§ Ò†®Vå5–ÇÍ­÷Æjãh¦­‘ɂ޻oÓ¶€Â3y`@‘ èvÚ»­½ÖþÎ^]ÔÏòÇL´&vÂ8卸?Ã&”¦™+‡½êï«°Ý–ëÅÉ.(ç0*}€[)m~ʴĦ™iÕ- ¼ÿºvûIé˜xçDo{Ó«å'jã–UÐ ?Ú,ØÀ¾Y! Zh àpŒ‹º­@|eÓ€8yM”ìÚYMäw™{auŸºóê”äË÷åWžàñ :{ u¿Rô‘¢¤}ÒFâÒG)­+ÕrŠ(’jòr&ŠNS€ÆéòÑJÌVæN|tEžH¡ÝàIJ|RC˜Õ·|)ðÏ­Qàõ¯i¶&ŠÉú׃~>))` ³k×Î$Ù"SÖtÞIf•„?MÚ]ñéZû%CDeˆDŠÇtkà¢Ç0éMQ»f_B´wPŽŽ,-}‡ùsNމž"†*ÆÅN"¦¯¤eÐé/¯ý—LÞ&cÄœìš.ú½—º¶ ›Oˇ5AÏ uÖB$ÝÈMšÂø ÏÒ9C•i+o¹N0Äç‘ÿLEÖ eòê/.\Nuïäÿ˜x0(ÖÒýÞÓç òâ“82q¢†ý)Çœ•›ÙËÄ+½\ÊÛNFÆ’£XT:ë³ÜÏÔ¤¬ø”4ÞñœÉØ2mv€m2Rm-¢ÙH²1•xEEüê³w±’©´¥Z£ÖH”Ûû-·ÂmÝfM. ¿´T{.ÐßÞêÿ|²é1ÎÎ-çýø¹:&ÒR/µ;ð¬¾íçÿ¢·L’F¸esL¥N‰…Ò5”¬H7`lÿQüÐÙ÷R–¾šei”bPhZqwÊ)™Lóê·áÛ‘ç­g•Ì-0Äšxâz¶{`Jg%-GÙdü!7ã}îEEƒ l¯wÞvÑÚ­»µ³ÖŽEÍšöª+)Û:îD€§~³Só ¨g(6éLjÆþ<_ÊêÏó¥»v@Zš^“ÎG#k~Ò†¾àÔuìJ“w}M] os ßµÎWm¸Ä^ÐQÝÖs•í'” .°wNä·Ø\ãQ}ºøq>Eþã|uˆÜðâI0tF˜jüyCF‘ì¦ ­3§×|ºX=qBµíª.CwãàœÌˆ%¤›€´¨‘màËvà‡näù‚‚ W5ñ|éÄÿJ‡ pø¡a?_2ÇPž>`׆=SZ0±™N o«>h 7wæ 'Ó  SÄÄ(U•|«Òã4˜ùÛ0Fç0.Lmº‰ ›„C¼A=Ê¡¸‘ì¯{Þéi-ÇÎ)OÿÄ2Ñ/,˜õAs„mËJnß÷œ~úBD§4øîÃù$ÊE§vª‡‘uLÏýó\…w¹Ê’𵼤jÚ{» Ç‚$ÓÂð”¤9LÏ®ÕëÙ#¶ÔÍq ‹!Ú3“ÏÂ<'lïÎÄ¡a)o¤ŠÒo éMH#]ÃùÀ„}•q…«%äßLY­‘‡B´ ꋪOïÌê! ÇÇn#£íÔò£ÃéX/ø˜=vá±ÐꦡºÌžæqˆ¢|Ïú»¬¡¶tÒ_é{od»7€ $}˜~¥ß¤T^uï¤W>íF;‡H³úDùùó^GïRkûݽƒm Ôð+9þCbKÍ džn—sxŠšrªrZ7/3ê§ž·‚Þ³â#³?Å# rt¤Sô7¨#øN=AGù|ÎŒEÛ·OƒÚ¹¨Šï¿ï¶VÛ;ëF€Xå ³>ÁŸŒâ5¸§ëÄÿä†â©TÎ}Àà طñ•ÜMŽ!¢³O€têv{WWÝö;É!óÒË[ÞX()J…—ÿY;ØÚE͉tHàrLGήo±!w@m^Îj>¥-Dðo_BÄx§þߢ\fÌ`†'L÷”ÑÙ̘ÈâÓJZ‰¶†±O86÷ôãR¸u\µgNlôI@Î\z$#— ×p¼8æ¡Ø¼¾k``<Vgš“êè›…m»˜²¨ˆsïIIî ÈB>-+ÏG°Ë[Jè=ˆÝ;ÌI/$=Û§àf„ëºWh5ra9¶¿“þ‡©Z1Â’Û¢úVT/ÔÞýµ^DïH@6;¡X·ûžoEÏÜrŒŠ&|¾T!hè•E k¤³sé®IÓ"/(U|¿AZä‰ ÕUñª:A†ôlŒ2•“kÄÆ‘8"Ãv eP;L”(—KŽÈƒ²zq /¸­bïæ@©Úa¯2ÎÔšîßj“ÿú¯°¨‹Ò_r) ÞÓ¶°ÂSÿ Ì3Ÿ¯ˆ£Âb¹¼"‚÷Àg4Ñ,íFºâÿ“ÊÚ…þ‚.ƒNG‹âûdãDsµù::p?|$ÞÍŸ_ö¬~«÷W‚úáråÑ;T»ƒïÍÃ_›ïæ õºü……ÌÊ×áCû(B_Ü¢€ÿß&‡Œ{\$`5ay~ñÏICrô4EK“Ž›šäJ’‚+Öw’¦äfÇ|’v¨ØìÁmë½d ÜÈäÔî§ë+ß=9.$î\ö[G’yÒۉキeLŽžçJû÷ x#³Ê&÷§Ê¤Õ‰w…ô¢$ Í$Åî³ 9>ZÒ' ù­açrÕªœ‚*´‰y°W¾=Ùç·ÝKÅÚhXVçùHø%ý-œÿZMÕ¢¥Pä©k‡üNM´f6‘ù@‚Qm>H:îÙ\EÉݘdã­e%ñh”3rÓälð>¯@/¹Ûvø²³FŠ|ƒÓnr)Ò„þ_:ÏöX· \F·›åÂOeej,V“;ëC“XŸ8‹%«æèÒ›:Š5ÿWyn˜eÐCàC¹ú[D3®}xÁó?™÷Ù»sž%œŒy˜ äÍçs3ô&!ñ¦ùéÐß ³gÜ@(ïz•@aúÎÙd 8Ãëù¤eÑTàï"<#~<6UÒëª1M†×ψIï‹G?Íáð‚EåJ!Ë\ð†#ù³Ó©/FÑwQïKXd¿!#4£Á„Pž-¿¼¨äRŠ”kéãÈS ºÃ~`?Ö3b,Ë¿hJl£×/Z4"¨«}Q«–¹´•ެA{chõDT ¥Ò·°å æ.nÊe®\]YUVs lj£=ÄÂPIÊ¿SÖã&ÍcdBß/Û¯6¶#¿1SžnñzpO}†{˜ÔÜ× †ç7ÃødF{š™­iîj_‹uý'±­¿¯e=ÛÕßÓÚgÊŒO0öIZú0æ9}Š7|.ÉÏgéûRÿò¯Èw$j¦?~J¤’>¾õÞp4ðHŸt¢EÚd8ܸz~_úà™ôB§Þ=¾>v|2í`î…>É?ä“F*7ŵš"k±)*MO®´F-*RoK“©º?†LÂ-n‡½{úºuš“ê5Fh¼U™Ü›DÛ²h¦M¼$м'Š6AzÎoíÒÔTIŸëºvÏØãŸl{Îì»­6GÔî'ÅI˜-`Šv¿ˆSFª]AÏ{Z[Ôߟ]†ú=¸„ðûðÄÛoçÕIŸ_.f`О÷ßo‰›mF\<åx$è!üÉ»vQ%ÔÑÑ2‚[€'§ŠÑû§ü ¿.Ì­=Ê0Ý¼ÝØ8ºÝÃÑ©4Úß]g·tô’R -ÿÌ9N†»Ú.çâ `1ô«DíBñ}Vµáq˜Egýã)’çNa;hëß=8bZ*b:;g9YdR eåL* GKýî©çw} ËÑÌ“eN!6¢`P(ù\ý½Z]ÐÞ4Ѕə٪Û~Û^íîîµ×7ÞŠÕ­ÝÍö[ ™ 'Õ ÔˆÂN(%¨ Èé ”»‰z9ÙsÏt0³4FrÏbxoE˜Ã]òJŽª+ã3´þ§È6µ”rƒR!¯AÏwF!Ƶ`DÈ3,cßî’l @Ä„gôº‚%Ñ9•Êx›ûÝÎ/¸¥×pìž!ZÀN°¦n’47¢ 9Æ¢67A±{&·ŽUé¶òØ)ŽÿDšV Ý¥fõìÂŒÑM@<¢…fIÌ º%ã¾ã¹Éù™ƒ¢déu•œ®*?ÍØŸ î|uJ”Ð;@‰… Õ× t¼($°!DÌOׯC¿è9-îÄâfIP&jtzC yFEåRz"(Í×ãq=·j_ÁþÁ­oèåš <€4¿‰çr*F}.Š´ƒ·=ho¤†›T“2¶Y oVXÙ‚ ¨˜íŒî*| .€"- Ñ2‹­•e(8É”\H‰‰‚+Uùtqm‡ÕЫžØÕ†ö°77{6ð~ëÕÏ­½’ž†Ä`:ÊÑ|dÏÜîþ »i.‹t_¨"Á±¢ŠªH ÛNm?íJ¨7?5vO`"p$¯¾ž@ô,­‹Ò{IíÚ 3×ñƒÉ-:áÝw8ª _Ù®j5}Êr¯ÃsjÇ xuõ3“.¦&0‰Ý™Õƒ±«•”îw9hо˜P†#«3#oëæ¤ò§×qa§;a—täã;dN¬[Δ÷©…`ðQÜ=`!5(»¦²%’1Е%2…ÚU]‹v0V™4š©_®Ý³ƒ€Ïcf¿àD9']Ô ÏŸ:bÎÀyJ',y««‘ÇËUôšº*•eu¢R—Ý\£hÖdYµ¹ „W&œWÈ`K£,#QëÓŒIè±”d‰Lª@dç×»ºj¦­ÿ²Jf÷*š,\VÆRXsBÎ]XZ'UŒ›=üÒ€º_ÝÝø‡¦¬Hé<ט·ŠoH…U©5®J¥T–ñ\PU"Z¹ž—¥ëœ¥uÒS0Ñ#dGCÖÚí0ä&y‰§fÑ Æ ‹!YҕʶÕéDEÃä©òœØAôCžcñ.èÙË õo=ÖUwžû¶Õïzïe˜nC”H!"He©Ú9»º«D¾VÙt°Œ.B´7¦KÖ@«xÊÀÝìC0ƾ?¶Ÿ/áMÐ*@ˆ”k9rÝyf‡·/Õ´W[ ñ·{îËvyÜïyèáP‘½fß_8Ÿb%"'U¤%¦ØÝ½×nÛÚ©;ìÙ!·€°.ßsÉ[˜æÅøz$8Æ ¢'<ÿ}ÀQsw`¸¬ï«|ÁlEÿàÍã±½Jx-5ìYYPç&2Db ¶Ù$³FŽL4û%EîNn¤ûžC¡z¨¡x;D{)ÌœŒ‰TøÃLjs5ÊOaëé;ÚKl-ŒŸõÍö½¦cLÑŠ©ÜØþ3D¢ `×KàõÏÜòÍ|~b¾ÂQ íXã$2Œ‡òRœ×ÙSFw±'2s2vûVN¸c½Àž…­tjc,Z€!#u«èCAɺ–qç1:µ:±H•ùÎXk¯–™Q¤hÚÕœ:: úW€–K~:²½ÏÍÏêŽ6C(!¼»ÓÙx[¦«D†Œ²tPd žï-4± ¨ôØ)Œ-î‡[™¯æÉÆÀ$n<¾@X¬ãP]|ÙW³FóRâ-¬hnóÈzÁQTXp"cOh‘£Yè†fã÷pÿ ®@l,/ç¢Êt ß ¤äBžQ%Žf(jqwaPöp,‰{û)F5P…¦j* ŽQT’“V}/¿ TÂ(ñ%Õ¡ú¦óª²ãujc¾HŽ„ |=4ïó¢„û¥PA9ÚLh~‚ÛØ8Ï;çóÂéOójœzh¯¶ŒUÏ–9ä²±é‰Þ‘Ökz«•q_è—ñb¢Ç#5\a‡æ­·bˆ"0èX_ƒù)Ú¾¹9y •ô/F2‘´‰CÚ£¸ÒqÇ&YuiÑ"â9Q —I%JªG²7L½é¦¥Ñ^ŒÌÃQ©Õ[ë¾m£zü{¸"ì`)ж½ÓkËfÝ­Ý*ÒNi Ñ³Ó¾Zo´å%QÐKŸ)&ugƒR?ëõD)Þ£rE ÎAÂoÀ÷#ç `m;¬õ„e1c¨3¶0¾ÅÓĘˆÍk÷**µÆ®xƒ$ß¹7‚3^Z×R;/2ÈÝéèÙ9¬Êa¿«Há¯Z`eæ~>昼»‚ÈLJïdËÂõ£ÏnoEÁ¡ùR%ªkݽv{{¯µ½_V%ôÁ„G~°©žEÖqÕ_ïÖ- +ôÖ—3\ÑD1ß<”Ëâ§Ö†X}ò$ª#Ïæ2YdÆÓ4®)ach"†ˆE¢“r.Ç/®ä“ëMôæŠïRJ7Ípì¿ãªÕƒ-ƒq·,dH(œ4uå½ã•ö¢€_A8>9±û$Bþ(Qç`8Ú…O ¸=W>àYœfr …‹]EíVÞæÂ"‘çÚÞ8 ˹^Îà¡Ò¶¥°áZŒ©·dÖ©nÀÓ¦V†ºˆî°ÿÒÏ•P\s……{0îxÔƒs«qìš%Ô0EÅ'׼׆VÏ÷hXÚ¨Ö¼â-æõ P—@Ý`¬s4ªµeˆûºˆ®¡ƒ2¸†ç!²±d”wZGÇ«˜l¬E—1þµ] ± ÙÎeƒÉOÝAQM}‘ÀÎ×X©¬‘=ì„^žMv·^ž¡¡[@rÔ  é3»í‡ñUÊ·{Þ™ëü޲çQHÛNqJeØàæÃ8é—8Å´å9p-5T•Nýz&ù† Ædqm…ĥ²kDÖ¾4õNJ#²`ƒï@·›ËÝ5tN£;ŠŸ¾$4–óÿ¾]ÜN.ßsS8Á;Ê1~Ù¬µ±‚4‰zßHZŠçή]‘MWåU\åù‡Œ–Ø;­Z¾o]W“–Ï}Ô¡7K¯„ÜeŠ7ÃŒòÌœ˜œÙLfìΜѵ$Ù!™DK!_&Ì}Š©¹oæzÉp µGV2µÙlRn6–Ž\"àÍ‹‘®’ƒ©æ ^Œ²pjZè,çî=SúX),®Ñ§ôèà-¦Ì!dÊa²p°úWÿ¼ãã¹½×À¸êÔ%yqnl¦Çé§ô$̉6˜G±’ÁG€B²%ÉöÑÕî„ÊÓFÄù‘= 3®>,N¤ýñpxh~ñBos÷$„[Ä|ªXlZÉ{K¯éYÄ82Ü¿û9ǧ`FÏ\ÓZnfÕ”ñè´ìYûUîjÜ‹|ºÎ þ¬p`·xP'ÂP­œ_îţŒœ0Çs Òmâ¯Mס‘$Œ d±(¤pLÚ`†MÁóÑT¸)ŒB#ÝJ]­ZÁ€l>pOŸA¼Øòh¶}uêݾ˜Ú6m2y-½‹ü$-#èÑGjòâ³7¥Ã<§SGô”Μ ;7ëž|¤Rc²´2*aÞÖŸü N£½ì TuǸD•޼!ל„xìhµÚ£ûè8‹|5]qÐçš"#Ë9É‚˜…Þ?ɵ¦„t£¤¶:¸íZ»­êL×O‘j,kÜ:¨°ÿ6ýmjúã× /W·¼M¢Ýó¦paUó¾øø<¼fœŒ*$…àÊM‘–—™l- rˆ1ÓuJŠNlæ¶Ri‡ß3¥Œ.Rƒ"$'°ôë)‘€Z^ÜÎÐz/EEç6†ãPŒQ­lAÝ›ä.?Ñè'§Pú¯‰ølàX6ö6ÞÆø}ä ôidù¸£…‰<+醬0ô»Žë˜¢ƒþ˜^ÃÖÚ«¢ç[¿£@E:Š$÷ xFí,iGb(‘¸_œÚ—ª†#Z/’"qt ÍSx¸dˆ%I(ߨÅ'Åð‰©ñ”žä€|NõœÑÀjŸòáqNm¿ïõþû!‹kâS¢2  H)Å"~QÌ[e@;–t„5Sýyzðèf€‘ ¦E[Œ U³ƒ$ÑJ|wo+›ŽOléqx^ 뤔o‡€»¾DÕg(¬wné1~¡†¹#Kw꘮éJ e ¾‚+üWz?½÷»âüòš¿Ê`Ó¯åûdšÝ&brÅ|OÍÝö*›~%ê“ßS–׋|ìA|Dº#3vîAŠT61ᚢð ßË^Xgö²øÏÎÆvëåf›Î¸s2æKC Ÿ¶×Úû­Õ×íµÚõNðd“c;ý¬š»…š\1“ü!¤@.J¤œ/Ú ÈTA.^ˆzŽàï~»«ç ‘ Å qþ9¯‡8RFÁ!õ¹ “Ž8X#pLütXHOšl…ÑçWå0¢¥ß »¨n§1‹™“UÌ2ß4'í¥—ËýÃÆ‚«åÎÍñÃÞÄ-µ£V%7ÝKd?Äu1‰O~vÒáf :ïý] ež;¬YS+™hæc!Sçʈ+HqCåƒCÊW׺rB;­õv~%~E{Á©Š·fÖЫÉò¦ïŒ4Ëf_¨DRŽ ÷JF#±2±àáÊÝßYÛYorµNPÌÊÏLUûïI-á£ØÄÖìt’‹»ÿ™J³¤"¯'ÝÏœÿÍ$¨L ëd­È‡ Ü© òîÞÆNwcûu{ocÿ–k&«J†|ó ÅBYeï#ÝL­ü—»TÑÌò§Q œ0GDßFJ“Jù|Dð½LN&w6‹¦Rt ;± ¥«/ÁÍ©ËçuëçvfuÑÈÇî-å‘üœÀœØÂ…‰’êe’äó]ÌXn˜5^·ßL¤ã'ØöǯrÆñjù«z¡c˜Ÿ¹š¯÷¾ýî#t‹ßÒ×モ:¥ÇåÏ«AO~t/žËoQ|ƒä2mw˜ ëÏ:kég@CêS®Ù 9™h’6Š~ÚAmŠñ(‹ù”C‰¤>¯šÌõ>¬®Þt}ã,j» Kɹ(ô†û‚Aj€òűá—å'Œ©¯XYë>ïWªîŸìå*š´OðdË|«Š-QöëëÔäש؜©í÷'x›âÇ$£w…ÌNçnÝw¿ Ì“¸âYŸý¥(sd¸…˜¥¤©Ë.óñc]AZNég¥–ÖÜšò ‘"‡y…îо49[w\ŽgÁ{.¾ÕýíêÆzu}ç`{­ýÞÞÙç´åéz&ÑÅwËuž¾ÁÕh–s1ž#m#†O›w³ÂGs2„Ih„=ëy}á«éöÑ3…R©Vñ:ªR)Œ)pæ\Øn-’é>° 'ä³» X0ø4.Ì¿°Í‚.¸"º­·ÝÕµ6üù¹½×zÕo@í¼ê¾ÙØmV wk*L'ëÑýjÐzM‘¡Ðh»‡ST›2MžA·f(±[õQzÖÙÆ¸Šu«ºnöHsd²ÉVE'¬¥ÕȪµ¢&;+Sò0½Ñ£v&”¤X7¾jmõ¬u÷÷Ú͉¹ë­ÍN»Yœ+ªM‚¥¦Ã¡~?Ê,‘=wÙCúbÉ”ºb&bs{Œ¦ªÖ5»¤¼ˆˆÃy»'zª¤SðèQ\í¸PÏH/V¦¹û4bõC¼ÚMá¶x/²öέüÉ`ìÜ' }L&Ñ‹M™ÿ•ÐLèÊyºû¦ýÓÃ4‚BbH¹)»äîŠwQ#©ÄÏLîÂ3vBr ñÍòzRßnETŸ/ýÅÐP4iŸBuTËÖ(Vö+zš¢%jÎÙ_'™g1s4¹[7Î=$ÈÆ–JJŒcYŸcÅ…ÎFÃq¼¦ËyÓ3ËdÉA©dÃà0/k: ­il 8˜Rn¹<;úxÓÚÛÞØ~µÌÎ9d¤9É>ŠøÎ³%ÛAžQ).ƒ¦'’ZyÀÅ•›\|Høh6D;GnÓ“–AÌ‹€‰uMÁæßÔ´çß.ÇOøh’µTáß"O<*ºkÒ;ûžˆ(gýþ"žI>æÑ#“ÞV LêúQ²œ½ª<5dX«-Ñc/ÁÔ« ïŠ.ºLcãü(.á«*óÍÂåz–¼$6óÚsѨ½€ÿ¾…ÿ¾ƒÿ ø§‘g¨S.N„vŸ»q@,üŸêúÛü4ßæ¤+o“·êæ×knú5ÇóDëOs‡m&o¯ÍÔ½µùÀk3ë®Úü2tõ-‡üÌvÏÃáà>ç\Vý³1Üíí×û[›Ÿ‚çfHÙl7ç5£R_ýæ[Í–Úm¦Zö¬îmnúf¸w­vJ’ÁŽÒ?3.ÈÅF@1Ræ~ÇפCn9ÂfÑI*A&s/U $ÜÒ šŽ{a œ>eÇ2Ži*0¹^;û×Ú¼¨×‹ÇTY ¤KCS`è ¦(0:K$))'Þ,D$e! Mm4ªš5š¬J¢ä½/ç¹,8~ÐN¼³™:É",«ÖkAÙÃଙß÷äËAâ̓£»ã¹öÆlmD&)¦i 9+¢í&ÕùC^Θü|y^Pýɤ³™5K ¹1–ϔۨí#Û/·÷Üô´‚³ºŒcß%²Ê5^ÕÇ‚E™Ô¢Àz +T¯GØ0ÍÀtqh4•±Y%O)ÈÞœ:€’%2gòS‰+3²zï'11o,J3ªº³ ªg¢z ø£øU-¿ÀOì ~ÝÂ1Ä«ËçO´È;#’ÿÅ‹ìl¶;Í">[š;.7‡ÎOGlè´Œžƒª‰¢µ½ö*ÜÄ¿,‹}oTØö rCM¸l®±#¢Ò{—‡•,…Þˆƒ-€r9«¹ƒý݃ýîúÆf{Y¬ÃÙ…î`HJY/Ö÷Ô8E‘_znî„ù®tÇjQO¸d¡´ÛZý ÝnmµËÕè7ô¥³±³]ÖSNÍMë¯1Kk±¹‰¼æ÷âóNq­hªéŸ-úégfñtwvQ™ C’ŠÇ&ªôV]¥x8·¡GOb·Xk¯·6÷—™–6ÍŒ¬€ä©@(ÉíÙé0CoÊgëaf$~˜±1pãº/F7ìá(¼ÎlhãÕöÎ^ã%ì·÷¶U;gï‹ÜuòÄ@­9g®çóiÞ?7΄Übìš ýÏ9!šà° »˜Ø\Ò]z‹ÕĆË>÷È¥iŸ\ŠÞØGmDqæ ºÎÕÀ©ô¬;˜î‡U‰Â«Ð9`£"¬ ËÐEè¹x“F…"¼¹ 8Iü»™Ä*¹‰ø„ ßíÌ禟ö;‚ÌͰï¤y4ó…f5sû–åîÌt¸&ºˆ>S€ÉMÛÒ˜Ÿ‹½Ùw;1¦PÊHïJ?Õ‘•#š™É g’¾ã®BŸ»€™Ç° /l2¢&3f½§ù± ®@…i"ª2Gã*&˹G°Ò[­ŸàÌJ­­.~¥[¸,ªïe½G“JÄ@U{Ö¥‘NM\©}+´r™u–³AUÏ=šÇ…+gO(ô³ÝãÉ×[‹I¨ð͇£qX=eoQ¥‰g­\ ‡£<:DÊ…îðüí+ Îöã!¶ì ÝUU\žiû²üéÆëÛC¨:Ëóuø¨ÏçSð⛽|—©ú®ú#[*ÜÖÜ£ÍÖö«æ*”ÇoÊàù‘búÈe'£yšÔÓ¨­2âûYV˜©ÏU-à¯Ay†&'Õjpî]VûvH.å§OPj Ü[áGfÌp¶—ëõBÉ: ¢;¢~ë ê@×ÛW5–ÑÀ¹|. ýñ@䜸fž¿Š’zÑÕFÞY–›|\Õ ƒðÔ‘ÆÄ\F£ Þññ­»±‚¸ŸüéêÖÝ&n6hˆ8¢šg~¾vÖë[yÔä4R€E°Ô;¤÷jcŸ ¶C×F"åIó^Ý6z•[Ûè쯾n¯þ¥¶×7^ÀÑdQhnræ“&MlÖ0Ìåj»¯w¶‘ „úaæ"OÁÔ™+^d]T€¾¿š&I`ÉÃ4°£2¤´~7›AAsjýIr+¬ÔÕ•îiÄö·V26ÍD¯ß(ÓJ¡†í[|R9¼‰G?E0¥#Þ}µ}Ðíìì­¶ £¿ÓžÐä/J pÉI@@YÉbaßñ’IHX%Ò®ƒ:†,ÒÉ—–b*✺Òõì˜0üq0°íQ©±€ÿÊ+ ؃k·wî{è^‘/•`›vi‚X:ƒO§_*£½ºê¸áˆØ@6—æñÏ;ò«)Ð̱ÄÍqÔ†1šaÊ‚¢7ø=rNŽƒŠ8ícêÈAÇ'½sÔonŠÞÀsí "O„nª"V7w¶áæl¿9è´÷>v6^­¾Þ\SžD`¿”Ô÷¢ÆÑ Sºš OKÜ­ %#ßëÕÿկûCk”¯p7Ò)öÆÙ®.¿Ãöåwºoöv¶7/û{Û«Ðö‹gϨRª‰ñ¯¾h¹ZÍ%¼ôÐ.ö+B…èÆ¸ÌE€…ÊÔ}¿Âu† ã1VÄc5•Ñè¡Ø÷ÍøØ9ã›7ëí·ûíµ×*ÇËÈïo°Lg¿µÐQåpÝ'X¢úcwŠ!jâ0¦LPÓ‡5n|:_“6¨¾]Ó‡t^œ =·†öÜ''ô‘—Ð*uªŸÒÛ¦MTIOçïm·ñÑ~|¹&÷Ó…ØðÖpþYÎ@çÍrðÄÍÜ‚¹aCëw2à`¿ó*`Zõ‰D@|¥>5 `Îé%>í}ŸAPŒ]*ß“,ƒ$UyM£ûõ³æ‰iŠ,XÂ?ú&ÃeóZú&u-uÕ=ˆÝ(÷\B~o8Òù6¢G˜ ÂÅ5’«Ag¤‰‘•;“H8¨8yZ‚žÁ©Ç¶'Ñ2û™I™?š3þÉ?ž«¯dߟ€ì»ÝCÀi²/‰Ÿ¿R}fªÏ\­ID_²Ìš/^l&’o¿s+Å—“újÒÏ«ã ×û'pÅÃ'@ ëao¥ûžÒó†Â¯©pó8j—§Žt ^5{ Pèwƒóãœ:¬H#KÃÖ<óí¡Ã7Ð|ë6e¦¼¨ƒ® +ŸÇ3†¶´P8¶àÜÆ:ô$Êþh©J £@â¦%UniL1æ8âb+Šk†q£(Xžà@O×J•#7÷ðÒfßÙ7ȱvt:‚Ä@G¶¥¡â™H—×Uê ŒÖ*?ßs:`wØ«¥ Þ‡ñòNI¡V…bR#B'Xˆ"†¥¹ÄØ¡'ÞRaå'ëZÈw ÞG¿a^¸åŠ06ç\# žŽïâ.õS>CóÌóDŸT4 ç`\˜/=l,ÇG±dpRõعÅc>B¶{Ñ=õ¼bô0 Tœ ŠÙà+‹zg—âÿ>†¢G,0'žÕçGw¹ö2Ľ˜§ªóª ‚¯ÀXRÙv_F®34¨¬Á ë]ÍïþQK‹¢Ý⽬žúy6†NÀ®…Ðþãr@áñ0@|²Çpe—6EyB®G/,Ÿ´Oiwâfs†#EÚ;Áo¸‹ìÓS§çÀàÎèx‚ƒC‰æKîì“j  €M¸‚ÝJ¡z‰š ½à Ð?mQ =4Ÿà‰à·˜þ2¸Æ~c™ãXϳsqâ„*r°±¢èJ<»j³@¡+èDb]HÀêÇ%ZÙÅ7§ §¥ªKšG¥C«ú{«úßî;ùe¡ú]÷ÝüQ¹Y›¯5ê£â±vñIø€šG…ƒ7l 8K»ežŒî0wp£}R}£ Å}3_w7âiQ«£ë£j©EºÕ.êNWn"—*†3•‰#ìÂÌo¬wà/ÍIY»nÁ/[×ÝÖÞ«Ÿ!›¾3÷Zæ9—àš±*4Y±ì>Áêw²ƒê—ì,ßB˜[Ã\Lìäq @1%XÅ¡‹g­².{E¼•ŠäœPìoc/$úQîzDö¨ŠCéÁ2ãKýÔ0‚ñI:á˜Ä8‚ȵxð­"N_çÉåœWîø£Ü£|P/Ö‹X¹X¬Ÿ­äA&8]rÏïZw<|Gû1™vÇŠÖðKýè¨Ñ@‹ÅúH¹‡‹–'5~^4nØ‘é0¯Á•&!œ§hNƒÈ×¥¯M³[zÝå€òreúP‹\°þktEÔOPÄÂépï lyÒŲñȯMÂ8/‡nÞÁì” uå¯ä¨az'A_Bë ªn !ÀôbõæÑ⬱ Š’š¢³ŠDº“Céþ&&/"‚ÅÐÇ]«è²‘4¹Œƒ0, »P³oÐû †÷:3ú]mÜÛXÙ¸jzç+ʉ¢êõ7ȸÅg–€Ç|ž9æGJ'g0V&—áÒUÚ¿êB1¤‡r9tHûïe8pÖ†ÌI*ð1è…‚xü8*•Ì‹ÃD…tÞnƒŽÇà‘¨¥§XúКyéˆZT‹1vñ¶g]øYWòNxaÙÊE1ãê äÔö”_ ÙÞÙn£á'ã)é+#ÇN†Ã¾áƒ8œ[Ó0Ä`#çÒG1—[k¯wšÕ5âdX¡û:Ç<ö 0üA“¾‡ú×AS1ˆnœeâŸw^þ§ƒT‡i‘íPûËØ¸ žCÎ"5±Ç$6@Ú„Â> Ðù×ud^Pc¹<3M ƒŽ Gµz­¾_k^¡.¿œü|-raÇäFe‡˜”¢_ +L}Z¬‰]ß¡ŒšG³¶±‡aAùŒebb[\€šdÇ«K!4xSÒw‘‚ G—s%P”Ò ùU•fš6™¦ð˜}­€È‹£ÂÝÚ &ÀÉä³j‡Óêç‹`à™+•Ý¢}'kår›û±äPgÜÃÎHøHA˜ùV<hÏÕ2ØŸ)Cw‚“tï÷†0ì’ü¹;rú±Û`N¼FÃAßZ:»ömÚ»kêzG)¢ˆ1 ˜raÝYR„+’DB*-. ¢´ß¶Ûo÷ ;Éa·ËiÚ‹—‘”rÝ•,ÎþºR5H‚só¡µµÖÞ¥J7dô˜Ê¢š7FÏ-°PÀa³ÖõQžêåÉšk++MÃá?ÆèµP†¶-—ù- mDå‰wÜ ï=Ù¼ÕŒnõ‹n²Û¹Ô §8 ›y°™0¾À sË<ºœùU¡Y«ÇR7y¼¦I„ëá š $7D>’í- ´£ÄD)ZŒÐbÅh4ÄfEˆ°&ÐVSŠ#%¥bC#)g¼(‰i;øúü‘øu£|#7÷(t^·77Šz¥/“kÁí£,hoìFR2ÉÉèZ¦É‰ºZÈgìÚdxhÖaF»ýþ¸ÇÀõ=TQbJ$œúöÉøì ÆªeŠT‚ÛÉ5xÊîûÊ B¹Qµ&©3Ъ])EŒ¥h»ʤ ¹ymü]噸ɉF:ï\AW¤ís ˜ÃïQMÏ1Ä  }^&@Ê"wä»2®_xªÝ‚DAW´ð\ƾ†»%”æþï:'h"Ÿ¿çµøýIrKy. ÆÉË0xH¤—§cꀨ¢ó[}³Û'õ3ÛSæÊ‹h€(Fé]7Êq)ËàK{¬áSñ¯àAÍ"€#7«YÌ)&=@»%ÚãÞI®*@$UWw!~z¸?Fv̇lïÄë_7‹$þMAÎ,¾Ícu É²ESø‘Ξ“ÓÈkž«„ŸIÀF)]±ü³f¡±Šûgq™^v¥7ª%(oK–YÉ=B˜ÇÉrµy. »vzëï“À#Â&ê ÕªÁŒP1ÎäœÂy@uƒx!U ˜S"¦8( Ho«8¸·¯¼Ñàƒëà_ }çì<Œù‡Ž»ž‘×Ó7†kh ~+C·O Ó`{º\Á?űNIä­fEp÷–S7ê4!„å;AøøQ.Q¢[Åœ;éìdŸNr±”BËÒ;CE„Ö Éy€]ŠY ûk¤ŒØD.[!G ø¿cP™ðË©Ot¾@R gÑf’ü ‰0/|̯S{Uh©´ÒÆ©¦K~ÓÚüI\"4d;øÐC1$».Éׂ4¡ËŸ®õuŽºk6ÅzÐ+²©æ÷ÌZ™üÝŸ¤6({Þ‡¦à ã 7ü&áȧBò3»âÒV¯WøI{dÕéùt)¯a¶N›9>¥ |Féj><:ª¿›e•‚|:`ó”øÅ½q ßð\´  ©êŒ(ºÂ”°éÝAÛ«ï^1€‚˜vP2 züÖð'–ÖßÙ~:†Ý½º³µÕÚ^C÷Ž+ýÒŒò Pv’ÀNŒ¥ªÅÂfª‘ÄOš+`²®RÂÕÒ5|å.³m0¾uºz”œµ"ÕX6éFQ{ˆ…Q1 •ÁžnH¬t@OŽÑã89²|Æâ@дWyBКxæÚY =±Ìá!¬>­-ˆƒ7ÛH¾”a;¿‡ †Q c?#²X[`ªZä‹àåñPG,PŒç^‹|Ç>Âñ&VA°&ðϘ‰q´T,•ŠpLàˆ"b”zFd´GؤôÔ³Úb­±TS›Y¾íÅÓÞþYà[­Mú#w¸¡.tLS«FÆ…ÅYCº©"QR·T¦,ô˜2n¬0–]f±ën§Ñ,àêÚí,6‹?З¥fñ |‘mov„;äöðMqsµÛvnU‘×ü;‡¶¸­Wm#C¦i÷®–“ýåŸSúÈ›²É ¶÷övöÄ!sùbsçUw}í].›—Ëú‡n˜OÎcü(Ò‡.,ëMN ä#ŒªñÈæpOr“x:izNßîWàr <ÅÓ£u pùŠ JÛv{ˆ±\ og—õ\¤*&oEº¬h]HÇPÇ¡`=5ˆŽN;KbˆâMTÐi¢jÿ&$Ö“Å1]ü¥ÉÈ•¦)\Éžæo¢<„Üòw!‘p_or ‹ˆ7 KŠJ‹kb#¹Ù•cŽ:w#b»ÈØU°ÕÔÔðTOÞD¨Ôƒ‡ç߸žj]·ƒ\9ýI•Ë"õq £3Q)c›c×'w%‡^y§HN-¶M"Aôb‰<ðò#7ìŒ*®¬ júÉjÔî>,X'dYFмúÕuYÙ™"SR@nØ·¼Õ·ß«ëQsŸ×ÇâS|Àfó9)Ú[ÉQ·å@‹U·¨8yCIªP5ûÊV_‘¥„×}• gORfÔͪò¸&Ë@Òð= :¢¤˜³í%ù¼l‘3¸¢˜VCÊ*Ï”>P}Í"Õcæœ@½•fe|E„—ž8óBX®@FêENsÇ[_€þ<ñàî8æ¶©QG‘n5LŒRðÍ®&ë/–ÅÚ^íîŠï‘7_BOz(r ®‡h\¬HxEé!•©/}$ |y¤VÀ6\înÈ€4ðÉ+y`-6üz܉êh¯È•&ÍTr 4¶þÆX:ÜZ ©'QÂ' 9¯Åbà&äëIÈQ€ŒTfLÕ/s'velsûÃ)û0"Âh»vGIú Y}~®Ž$q®™!"U‹&RˆLG¾f¸a]»‡ÒÿZ±²fr†r¹”Òc@•…‰$å«ËL}̵X°ot$’ SM@š¦u %hÒËsœšemÄ0¡ ôqTäŽüF·|œQåfYáOë+=r|tsEC5_A1G“°PÝÌ ²tQu+ÈÇÊp_ ªÃœƒˆ’ù¯Íã= ÷}^_Ê Z ^ ,5½Ä4·Ó FßMÚÁè.Q‡g£!$5n£ Œâ3¾¹Á+—Þ³†4ZÊ££r‘È;ˆ6wž/sOÜDêÛ‰ãÒ5b¯Ô:1<«É:€"1€Bp‚¹Íê(¾„114nuQÝÍ…¨.Öê gt„¿â0"*× Ð;ÚTaÎ>6Ý&ç¨ø0æ÷ °gãðÁˆ#y‰_Ê,¸»(Goš^Wô;&-‰ª"4,Ö½jeq~ï7Ê43ª‘ŠùCÀ”Ò`ohІ’5<4]±9&h猧žzφ Í<í:7×ÿšÓ“ÿÚS”ÿZ þuøkÜ6ä_Ýów퉶‹2»œ'zóä_£Ñ´6s8â9°C“´v&¨þཊ¯žÐ(bQë4M  ˜REI‹V#5$àÞH¸Ú;z}ñä*Ù¶^\miŠ¦ÓªÒtJTÉ·¤Ò:êgÉG‰Š2 Åw8ixH£Ê,ÈéxÀ‚ŽÐcA½(÷Â1YÝ¡¸šM qŽdWØý öj 1”ƒ²*YÜ:E&H9€&ÓJƒöºÐ·f>û¢Èš”ìûR+­ —PÕÓˆ÷“ŠŽesg¦~Ü«íÑ’ÎJ€L|þÖº25>»qt(V£Êé×ükêÕ ¤¨Äëvk ö»YB&Ee67¶J@¡¤¨„|Äë%TŠ®qU ?æršT*ï(¸ºc¾™Ýr"ê‹Æoǹ|dåª cF×°»çó¹ÏŽTƒâÐðŸ²Ú7ÚŽUM´ÿ[E¹ÍÆ/¬ÇªÅŒò…™’:ήDÆBê#R—U5Є[Zõãz¤nÉ‹¡úªLòáÙxÙ 7ž CÕqÒFav€èCëmG€l1Ýáò~{kw³µß~—5ciyûĦ•07‘R .š‡C–^=vn5Õh°œ+˜9YFžÝ¨”LH–SÇ7*¨Rr¹=¾I=Ï÷ÕjÑ)¿3Æâ3Î4ó “/­`ÝÅðiŠD;zQâ?¨åóGÇG…wud ×ÏŠÇy SÇú9:Ê™·f-VsºV)_¨ˆéwh]¡´_ÝßЇ£‚9HÀ ]“º˜(­Â-µÐXë¾m‹Žw^"vXG­y–6Ü^/ýxïä£6X7uYc¸:¬Ðg3tp#Û:šâìAÇ*¨4ç ê› ZÊË9½Foì²dtÙo ü¥˜ ürÅÅ)æ6¶ai77!E~+æ¶~ZÛØëîB’üV̵Þü?áo1§µ¹ð71P˜k]¾ÀýÀ*zJD…€|DËŒÓ(–œ¶„gL}MOŽ’AéuQ_FÙjÍå‹/˜¼š#Wf¬<Åw}ƒ´Õê|óßÒäøh#Dª’ Å+kɤrјV¥,J¥%vT˜h„&K I í> Õ‰pSC¡×k³*=/•éo€éÃôB³5'^K W½ÈÊ“ƒ’Dº?h<ú}ÕßÔùÉz†eŲš4u ~Ôߣ¯ú›ú"?ùÿþ,Ê)- ÁäWø_6&¯Íê«þ¦¾ÈOþ˜›¡$@ó­øQ~S_ä'àß¾Ê6'zèRúÈ_ä'è>ÈÅ{á À+©EvÑFŽ÷œS§Éí”s„b±œ¡’Båwì©zþÍ'Üh$ÞÃcüJ^£^ójOÄÏ8ûå9‘×éGõUS_þ¹™:RÅwÝc¬<¨²úã?pz¡öó$ÉM‹"+ð̽ˆ–ÉžÀ}镇§e”y£˜Û² ¾-H@E2_ K ŒŠã™¤Îëî@[<Ë´Ï'¢ÿã'á7¬À‘_>*ºSS_ä'ê|cʔҒ_õ7õE~ò‡‰`¤™,ÂotsKaNS-’±Çfnì"1zæ’2˽&O6©aGöâ’NÃÝ€òEibò®ä^ãÍpq†„—1¤ˆüjÒ›|Áœ-¥”B&óq”aåè%á å÷%(¡Š“î%rão¥)!œž…¢H™²rvÿ0Î Ëw黌 ä¹z…8Šö¯?vI£Ý4ßkÊÖ óì¶Xij‹œ_Œ Ìl5Ó@Eý8Ë,M¡Î3öíÂ&‹$˜%Û&ùFp¾ÔkõjýlCxÖjõ¹9Žàk¡.ææê+£•+ü¯ÈÖ›/wÞ¢ÖÁ¥—z;¼»ê.L}—üuÉ Ýñôù€.›¥Ò‰PÐX×]%HŽŠf$sdܬ¹¦âqßùa¡béyÙ5/¡°6‚ÙlþXÁòí '˜Ê˜‡=í²[BX,ýްPÁ¯—‹Òg„5rz]`œlŒJº[oп+½¥¤ûdæÎ—§ÐVïxA8†(ÿé"d€Ÿ\hÆV$ÊÒé÷Œu±ŠQ?f¬™4[Ò0â3BC¡r—Œr HQâ $êߥ}/Õ¸7k˲)5#õ.p’îÔ/Ý™G%Ì}Ô^›±ÞÛ †ðçŒ5_íµwšøsÖ›¨Ú¾CÝõDÝõ;ÔÝ4§hsÖÚÞ2jmoÍÚÖv·c¶?gÆüWÝÞ°ßB.†öuêŒp´o$Jä/iFìJÞ¤M„J 3Ö„R}>ª¯’f‡ÐÙ]ÜÞŒC ¤Ù!lo.vvã(iv½‹nèu ­ g ‡—Qà®Ð1ÒâTè±3B÷mt€Û=XgH#õnp á Sg„ƒ¸¶ÌÅ)3ÖïÛ£sHoÙCŒ÷`ÎUVöŒib‡ÖPñùgÜêñgƒÃœá¡£æ®ë¡Ø$/‘3#¼µÍÍýóXÉ”;QG0×]|$oôø#>s“ ÍØJˤMZ{3×â8‚±ºœ4+ædzÎï¢@ »LíWõîÝ1ªß©gîúÐöOÉÓw¢]3sF¨P…®æ,”ŸÊ›½§0¾ç%6‰L¼…èÝžé'Ž›¦ÌYqëÉÿуt„Q)aÆÚ[­W«]tÐi³ ÕW¢Ð2®×•ëmEïÛâ(&ÀÊʾ/äËÁ4À—ƒûÂMIÝ&”¸ÓÞŠ1µÁR%f=Uøj‚ש‰ª¢Ä™wÛöÆz»³ßMЬ±ôY)ßÎ/[û1ÒW&Í,h¯mìÇd˜0«\`c×”ÚáÏYy§Äèwî0j*û|)YûùÒ¬ûÄ9‰Ë8afnÁ‡ÂIÎHYAdšŽÀu$feßâ§*üÔ7È ùcÙ÷‘¼wQëIžPŒy:C;˜$ŽÏ,<óL!¹Ñí_ÃU µG&/µIEfåHϽ­ ä¬&”¸#5KÓtÙ]xiË¿_A¬©k_Nc0beîÛÆ„M;µÜ=vï„]{GH܉IÜYeš^Ë讲+oIæ^c¸0+ÿn·³¬”&cR¹3Ã¥ê ‰ÁŒå̼B“à%rf}í÷mZÄ€ÍäY!yA˜ ÊL¿‹¬>‹í¿Ï¯Ý ’ËF@Èžßåñ'º_•%xIäÜ^ZqÅLžuü\º‹ÄÍɳ¾9Ý Df¤ÎÌ}d£Äû`Â¨Ž 5 K({” 9Ujv~‹„d‰i&Ï ­}8Nn¼Dæ¬óàeuÏHÃ𣀚§¤2PfþpÄ„W‰{¾vL}é¸÷+º{ ΓàŒÔ»ÁAÛæ4L½ëm »‰Û49뎹fQo`#Ñ¥Ó‘Ü>ŠÌÌ1*Sä”»ý'Æ8N.v¿–X¢ÛU‡iz{…ïL…%ß«9w“Lôž>-„àôûÀê’Ïß »ì'øžP'j¦ËÜOG;.¤ l¹Jžu‡§¡Ü‚–i§€ü­dˆ=Ef§À€ –Ò’ fdÜNϹSïÒݺc2:<`Rç9»ÈÌ:hÝÕ·oczh˜pw}ž˜DÎÝõz²á©œ{¾Ø'€feßueâÍäÙ_¹@dÊ'z·JŸ¥øÞ¯nkM¹ÿ;Öm p‰‡½gÝÖFTêaïZév&•zÀ»A¢‘IE>ÙûA¢½Ù*<ð!Ùæ”b{OH44¥ÔCÞ&!•d™‡¾/LA‡©rŸâá¶ö’eï³ë§ìö»C4d÷'JÜýý!7‘sïwˆl°÷ë­ñòÜÿñœ¼K$§wB‘û¾O$Àgæ?ô"ÑÆÔr}¯¸¥­X¹{¾3Lh!Ê}àûÅ- ˜ÅîùŽ1©#ûAï“à§ Ýû]cR ±÷yßHNåÝó#IÐdd?ä½#…$&”¹ÿ»G6!‘,q¿÷ìTîýÞARky_¸æÃGh2ë>ï"Iɼ{½$€¦3ï'Íšxðtîe(“H¼Œb÷’¥¤×/‘y?™JÆÞ.KR2»yþMèXðÀ•Ê@•ÓŠÍØRns5Û øQÄRϾ ¾šÊóQƒkíõÖÁæ>…¢j‰Ó±K{‘=:ºFÂa¶+Ý”;ä>œ­ÜuS_¨P®X¿{ ÈùÄê½g~éÊ•#g Ýþ÷ßw7÷É9ð5mŸƒcF[ød³ø²ºŠTµä<ȉF S²•UÁô"lp ˜˜zü]ÊϾºš© ‰)Mv]ÐT!çÄ©R«¬"#§—•|9ÈJe™„n>%„ÁÎj=aøÓõÅÝ!•vi»¢þ-nÙ]Üñ;²ˆTq¥ ¤UMá×$iîÂlù‚±Eb2¬qd¸ù2Ø(‰—N›È®däiö‚z#7 %A€¨ãe®ñd…\ãU™&…q=³Hæ³,µ«á—ù†‚ ¢¯“n_ÈŠ_œ˜¿òt#/˜’bŠI‘{kÉS|<îŸTL Y³wÿ¤œH¨9ùÈÜiòµÉ»69Ƥ4+¾{eÊ$A@Ö.–éSïi»Y.E@§wµLMÓ›S¶“ÌNÓbém+š(LiFQ":Xy6;:æ#€ÿ˜ŽÁoù<'¡þ}Ïk×g‡Ò‘Ù1&C©wÒ¥ ¤ò°C¨b“‹å¹¨Ÿ×á;Eø“nzÎIxÀ‰êS¿ÄÜœ«ÀᄃîÅsçxT×BU[¹y•nÖnï¢ê·¯M޳ØaÖœX#ç;UjE°'žê"Çxž’˜&©Óa$ÇÕ2d†)©¤M˜6H”Œ‰h³òu-dH0!Õ?F¿âE2˜bÞªš›“{5ù;1êÌ©0ôLGOPÁ Ý?Yo"¡æ!`Å€f¬DFrJ2~ÛÔ+L–;Aˆ_†xJºèEbI KûÓ"Šª­2Ó~°°d”ŸÆ%få ÏX6lc81+NÌŠ_–aÈ-–írX ñ{p.C6Ú¡é‚ÕŒ³é1Drô 9¾7>;×ÁZÉ7tÝ;GПž5²r½EÓf¿þÛyÝý¹½×ÙØÙ¦ðËFp\ø -‹íî«Í—ÝÎÁËÎ>‡#áˆô«?a,äbA~ãZ$Ëoœ¼·){[üÃ#ÏÝÅ}Â\пû»ÎÅÖêX”2"uÂÝ"ZOù`4gÔ nçá†f—ûådH„f>AèÂj[äE¡g•™j«²º²ôýwÕ–ÎE£ÊÊÛ¨.ª+oYïmìLT™|°FUÙ%«.–ô\yÅt\x¢&™\b&'¬˜'{C uœÏ"§Ã|&Ð  éòYÆ”Ç0æ¡J”|õI7И+>¤DÃëz£’KÁˆ°Ý ¾³*E'5Aa=w€€m28õsAø@Š&!Øø±µ‹ûŽO›aµw’®åS`Ô†œGïà”ëyÄx./`EP‘'Fœ^¨ta»Žíö0ÖàrèÇ„¡Ý¦'èÒ"x2NlÑØðBËŠâÑ`«< :0<±OÉ-¤S¸Œ1x‚ž‚yÛÚ} X€¡k¹‚ôNý‘< GMD“ø‰?1¬v=øê0ëÿ†äeÜ\j¹‰pnòÐZ ì³Ó/È ñžÏÒVÄ úÏä(Ûð\Q,èF Ý¢hˆEÑx*Ïr7QÌ=K”tåj—±ß‰ý„)´µœÙqi<´‚÷báÅ ìÀð=nFên¾¥ñ`Ãdz7Š%†#ÈÝsÆj2¼`=ä¬ílAr²% ëÅu˹›ÛãeŸØµ>ÍÉ¥BÀ9²}<âH‚  ¹ˆav˜2òILûQ Âí b'`Ý¡ôÃ/£`¹2ÔrÒqò991枥 Çà% ¶Þ»H?â9Œ2ÏcÇnˆKo ¨Î¬Gx-,Žå FÜ. <€°ˆ,ê’ 9 ¤’¼GÃÎ_ÑI±¯"?̈1xØ@NŽü# lÉþ­Ë÷4!‚A_¶_mlÃac™Þ:òOòâ¦(¾7=ÔFÛ7j¹`B£HÏâžsbD|6›ÄžD³Í¡v„+»U?¨s^G2¼Qƒ +NuÚ_1îùPÅwŲXT; Î󹋼Q4¾P¤6_üMá1æà ëE³š„„¾ŠV`ËPÓÔ ¤•ÆC8ÄÛ'Nv¦Ž5×Å(ÃÇ“úxæÛ€]z¢ø+ì[U¥Yü×7ÝoæDQQ¤tòéfß“þªàœ5¡Nl<¯¯Tó§O(ΰžÜ£BýmPzbÅ¢¾=æp¼2Ê™†‡QÂÌ)3"ÀªH:¶`LGS»šPL'9ŸWG¬µ.ÖëG.T¼*©±ð©íƒ¡sî¼}xLßEÑt%—ÞÛ„S:eÑé:A¨õCHz‡£Ä¬cì¾üÿ—ÏÁPplLÎ)‘`p[Ûƒ~€4þhà„%̬J¬ˆüy”‰®ƒ)jR ÄÐÄ¿gáy‰ 6Þ•UWÈ[\Žø^†Ož”e bìi“Á:ïTR $üfA G¥ªt(]&ÊqQo}9FÁ–E>/ëÀ—Xlú‰êÃñTÉ€è§îÕ-C~lØOž8ïTùhŽ80ÏM„Ž4°†n ãÖ""æ›{‚ïríï1&L.á;»^‡ÝŽ7ƒÈ“k{#ì‚Q p?$†£%êgyE#@÷€&øYDÀñTN¤§àxXg iexf͆VïfÇ¿Ž#{EảŸÉ•ÿк–ÜZè“t‘©Sdåèæõ&£Ô)”8XV¹ÃÂþqCìáüãG|¿ï(‘ÛÂY¦\dêòµ|…F°ÈV_²—(ŸðaMðgÏP BŒQŠ2 'HVzWãm @:ðºòžDƒœ3.zM gíJ •j†¨bñ{!Aq(Á £D¹ÇDŠÖLðbëÓ,ê{$ÞÍSè[“þ*D„ Hñë2~Pz¿/é)\†”3NR©“Ôdª„_—ç âò<ÞWWt#p{V¯ƒW9‰|éækªþ`ù"—ïq:`³ÎMbHn稔˜í<•q®JÉè&pU²"íinôäÕ@“ òöBRòÆiÚ÷-7 9¶5ƒÚ9ŠÖ<ÜtxWÊpwÇÐbE`\‚~ŸlzµïõH ‡÷Rl,‹¾tÂqhsèΑïl_…ßÅ&IÒÍÌdÍqyŸ{ýqÏŽ’s¦„€®wÅ$2V3µ£cËÙWN {Ã#£Ð¶ ¨éÜ%“4p@ã»;1¯Hwœý0"¯ëã"éjîƒIGsÌs¬—ÿÀ§ˆÕŽ˜H? ÜAœˆEPâ¨Ä­É.ç‹Gå£Réð×RùÝ|ù¨ÌX’‚Öw¡nX„üÑbþ(·¦~‰£§ùúh0€Qe«@?g¯øÙŒ¸ŠQŽ‚|†wíeè5}º·¬ S}(KñuèMg;ôÌô¦3LFßN¸o’×xTñ ¦ ù•£\¾~6›qw–"Î$¬•ÅÚ4&áù £¶4}”xS$Ýœ2¥=1Ö«„)¥w åº0Ø‹#æ/L®ÂòÏ€§ÄS q¿uMhx.¯ˆ{h„Z˜¿ÈÔ= ‚†LyŠ)L^§«HÚž!WÄb9Y›àÝèŽaNó¡g%èÄÖ`´Ó¤t€C„:©=¦¹ ¾’?U?Ê¢*jz² ¨æaæ" Ƥ ,ô °‚1àqÄw˜“SËEAžeWò¼,ùŠìí®l@¬É/Tŵ¯Âät͉=`ç±¥9ž6¢9ð ‡ÞO…–çÚ= ûì_WhÙWÖp4°+ˆ|°¡×S@î]ŠÅÕíìì­¶U¼{B*O¤ÓE40JhH’@<~oÁu@},ÕÊÑsHß.l††p5—m€&†ðƒoùˆW”ÒÓú0%ù>C*ZÓâʰLÈÆÖ¿¹|;±ÅÚN§„׈s”zæÑ¨g4¦Åñ20Gä±8eBÁ|„Ää,`Ê!\Ô¨Û$TÖG<ð³­u èñc5g±tYw‰jËܦ ýÜH Ÿ¤a¹h2• ÅiÆ~E˜Mô=Ša{š _{:-ríÊŠ 2šÔØK*lí©ŒXË>ck ›‹°W…[ЇDÆ*Çeêô5Ø5»VAXÅPÂâ…Ä”eÀ˶7B¡zƒ+nÀÌ5ð?ýeY þÕç#PˆWf$ø£ ™óuV…Óºƒ4Äf1ªDrâ1®›1™óÑ»ÓÇ_]JþãÇ•àã²ü^ÏŠ¹GÇŨQ€^+ª ‰öÐ/ iÖ|ÓWUƒ_K÷I†n™êjú‹Î‰S·\ø`¡¤k»^UåHÕ!ê†ðLÕÎ.ø|å†ñ‰#'}Û‡>`ÚßmVÍË¥wn¡:+±d¨yC»Ö§h‰Ä €V°vsb„Xc®$c4?F”?ô‘?Žæ…’±F´û¤v$§Í<ÉYU=ù„Hš?¾#Zø"ž Õl9z¤©ê3­ï/€´\]¦®/š‹bÍ’ ÿM†Jõ€ha ,‘ C ñެ…ãóÔÀR ©V…±QѼa\ú·F:G§¯ÍþZ¬W¾àóõùBQ}„®?ʨQ¯ÏÅn)2ÄQ™rkæ“¶î(é˜Èée­ÿjtù¨~dt¾ê'‹F‚Eúþ~Üઌ•¸ÿµù™‹Ï¸|HzØ®ù[ñ˜ Dû¶+r‡ZIwÄ«KW/«!7;PÇ=X+ËРƧ輓o¤«áÛu³KU~>q#‘lB=qÓÈ@ CÕð2}÷ñ# óµZžy `ãj-…èš””%»—nPV0Ú­þŠÍά×jÏ=×e¢S™ËG4Ÿ/ßqJ=dæfµRŽ#~£c‰ZÀ'A¬(Õ]öU^2=>îÜÍ'J».-¿ìKΉ\ìõr.Ñx¿dgåf)¨× œ Ø,‚4!-_’t¤Fç ÂÞ5Ekr•¦þ eZÖ ¨bjÈFQOmÄ“ÿ^–_©+-E "ÚJ¶/»Ÿ™•¬Nñç¤~ÈP+‹ ñ&óbB«s™Ù“Ûf'^wú$ÕNš;È(¯˜èÊ$¾bO÷Sƒ'¤4]cc¸ÙÍM®!éäøBLY¨©K«Ù4ó²F+qW[?­mìuw›ùE÷FþžÒn¹Îmk8Ym+XQÛ÷W@× Í¨¿7°È¬H¾5²™u‚:ù}+´0,MÆ“b*©¯o¼Ýj/«§ Þ{àùËo„}T+³/ŵm™Å ‹µç ü(ÁíbíæŠH¤¶í6s’¨QÍb®nb‰^+¿¡àïĢºúx=ýÝqO=ýcàõÐpJýDÕ_ú^dÃ6'y)K?b%³GyMÖH¦#Oæ'óFÏx1Sã¹¶¼¢tGç?Ϋ~âWÕMüõÉNÒå63ý¦µ·½±ýj9Ù]¸”Vú™‹ ¸¸ ªU£·(@Âzáýi /®ÜÜ"š*ŒÊØEÈÂõô>.ÈoÏdÏ5¤Ó•¬æýqA~SÑ"<.èï*S®Éã‘ÉhgóÁèØ wBþz|VÔ(1z·48~F'¿ LJES׊xè:¤õÙc|h°npU³s’Ñj¿טqJûR{€_â¯Å%ZËPOŽ*p¾ýï»/…<Ô,“~ô,Ÿ+¨ŽÜ_ä¸Â=´ª¿·ªÿí¾S_ªß½›ÿ±þÍI.øøc‚Çùñc!Å}\ñæ`ÅÌ‹þÇÇYWÿãTQ‰{Åeª..u¨×YѵÇÙÑïXcf‘èw J²X³@7Q#K ›Qd*ˆYºÑþ–Ý:­cõ<¹ú9ij½¼Z¾®²¯ìÞ8öZ£]LÂX·T!¼e¼$ïÓ¸ìÈ´…Çž«K©µµÖÞíîï´ù^Ê“)èºÏvxžZãÐó'Øíl^êJdôM¢b@>²jEtA œ²rž#ñ$ºåA—xÒÛ‚_%GëZÖ©Mj&döÍ®ÊÙJ€ ö½Ð·Ct¯…9Ø%2ÚUc©JÐÀùÉU+U\%µ‡#±ÒˆÁ0]J<Ä—zùNœ))‘o­KEu|ZX5»I‡Þ;Õñ,¤žj›´¡~þ­ÚøØµ\Cui’‡aópVÉø1”>–KkCä×™~UÚÆè^låÛË÷™ó ¨“¶õ¶ÔÕÇ.ÂùUµkŽ[¤õ”ÕIÏG>ôåˆãAmé0>ê%wT;`»i¡‰NØ$ª¯|{TTªQ¬‘ÀôRÍ×E—˱ÖÐIJuä{¨Í$¡Ð»„ÑSÚ4VEn®}ÉÑ£7ÂI§ÒÔôN€ûÌËì+ô+»sæy}a;8éË¢µñ– èÎÉd”Ì> i.cK‹ Kßò!@Sq˜mØÙÊzõ•ÿ‘xöñe½“„Ôs(–´2”bh‚ʯsµù3óyÜ’K]›¯¼­¿Ä›†úôv*A×ÎÈòÃŒGÅáiêúÁ¤™ož¨pÖ¥ÏTq–«†úùw}6Œ‘žJá*þˆßfTʹ…ã’cÜs€½×6ö*ôŠÆ00¶AÊX_#íyFú±)âö*ò^d°‡Ôå$Ñudª¿çÝÃý8i.D,Xl$F÷b@ô[ %³ÁÓ`SÀÙgXè9±ŽZ=xTáf” ñµ€ QZ>dí`_Óõ%[îKl‰S'J<æ²Ô¡r|Â¥¨Áòë]xÈ#æ½t€áVjPÌ*Cy…`Ñ[Ö²C”ØŠ¸"t#(\†;— ‹¤Y7¬#>Sdå¢ôÊ$w-´=ƒ2{«ÿjN«(è ÃÓ¥šDEî(íTaKãd* „G:ººŽt_QSZî‡"ékDzmsì9„„qdé!µM„¡Ï%qX½ YüØ€f«MdêLÜQaâ6m‰©ªwÖ“ø›+IH 6z¾¥µ%ä†fZÙ)¾”Æ97˜ýñpx]$ÆŒrĨÉE<^ž€.VÊröôÅ`îäí«Ó@#Ñç4__“Ü}É‹ƒUœNÏXeõ9îºá\òÜ’/ìm‰£|A9ÈìÅ%Ï^\X …t™¼Ò›’ΨÑñ´øá³ÀÜ7¢@>¦ss†vŸŽ@/0@Ì0‹#JÊYY(ßcPo“—C\ZAôȃ\8ZP—ðƒN8p*c>ên9~¤èä4~;F÷;Û;ûíe ¡QâƒjÙ})öÄg¾¡Æ ¯A¸¬IØAˆ/Dµ€ Õv}ïUØ™$÷ª¾þ «Zó"È…3Z8dÀt·ï„@ã _y>ì<À|áïÎÙ{ ++¢ñÝwÏÉÎ]ûô„UÞlq¡±$Ö}Ø‚ï4¼Ä¸Ž6ä:¨"6Üž6CÄ1`Á@\Aa­©ÊË>›F×lÍê²G%¶®¶wØ%Úy¹áõ ÓáÈ¿AÍ­öÞêëÖö~ë寿Æþ/ÈS¬oìo·;±¾³'Zb·µ·¿±z°ÙÚ»{»;6M׫í½Œé.^{còÄ«ê zá J`ëÁI©#kåõS4Ÿ…$¢˜åC½? …ðy{ Äîødàô ¹ží¢kà&1%8'º™½MœÍIß ƒv>4![‘ +0l2æ ±ç¾<ñe´e¨: +ê 7xò%U-í«ž=bÏðÞ-=¯àч„1-Ñ6Å>#fhMyæ[C\¹ µëyòIœC]\sc%*4ñhm­.üx4ÏÀ" m³Ôyš|ja £”Ë}DV4aV¨ºÅ‘ØÑ úJÝüÜIG[°ÔêðÓ1 ðülì¿Þ9Ø­í_ðMc6ã/+ÒF%Os@=9(_ûz•ï³}á~¤§æ¦m3’àß-gðÉ‘š ÄðUc;¬ ‚‡ðöí‹ÞÂÈ‚UÊȇçT Ê œÎ ñïÏÃp´\¯_^^ÖÎÜqÍóÏê†Ô¨‘Ͼ})zÐÇ&´ÎÎì¾Fªß\m1›IM²h-g]ÀÐÈU'Ô šEt[Zd|¥Ñ²r‹G3¢\ÄÆÀÇ.»V[G…pot~ét77^îµö~éâ‹s¦H¸á`nnN°é3 _î,®Á¼7ôZåÛü,…¶À¼ûjÃ%ºLPòïY éxæ…ØO™éÛŽ™«~s#,…añ ½Š‘1Ç!§ÑAäÏOå²+9€o*8vŸç1HdP(y¹ÑЕGt°–C?älÜ£¾e·èmˆÊÄ:Xd4B^-¶Ç¤®LÒ½0ÉŸgCúÔC42GÈ€dGÅ•Ð婉ù»V(UR]­·5éA»öe˜'º09/§G`lˆ¸.ÙÞø2º³)Kú ¨åˆvibðG¦bŸ»L]*”«]Hó«-˜q‰Ð‹.UÆ/ê’JKä¤_áM¹Ìd:WKâ ñ$H U t±`;Dß)™¸„§²½@‰·Î[K2~p†LRPah-"µb“£UéTÜÉU×0¼On{½6ô¹,Âϧ°.746¾Y¡î.ò@kÁ½.6ze…9mÊP²ÉôI€ &^½sTO3ÀÒ=’6–.·®ŒAÂŽÈ‘-áö’Áx¨®üŽå·8IœÌ—% £{ˆøa‰«åSËŒìCmde0ý@›0†’3Ã5E> ; ,ˆÚˆ'‘ [àÁ2í<|@R\JîîÓÆÖI¶…iä<#«¦½ˆE³7›ˆuDÍ&Ò($ÂæfäMV“Ý2,U’ßÓm×C»>µˆ˜N±^ RcrL%‚<9[]/*ÎR-×âˬEØúÈHÚfÒï‹«JÖt”&Yœ˜«i³Nµ3`lIÏ6žô?­ZKÇw"pédysñé P#¨'’bBñU…ߌI ô;š$wp@•±­k4Ž&E økf ÊÏʘŸ"V>žeÞò\Y#$Éu45&ÃY5‡ºfÄ„(³Y˜’ɸ*TÜ“ÇQÃî­®b&þÔ¹þµ(¼•ÓK¼Â`¦±ô]½ig*¯A–^sÈó­K¹tìškUJÜsé¨\ •O Ûwœ”ê>.*÷F«èÇ``ù’ÎŽñ5µAUèÖFñ Òˆ1E •žn]ö'†Á2²ÊèÇ»­\j–Ñóì sld9~ÖàcÑÆn…Xé{ö‚‘*’ž!Èë…Ý·û·öψ†v·®M[Òo‘#ûZÎ ®f´a& ,ÝåknHªi²%—~Š¢3|TØÞª¥Ã´ôTªêêrJÏHç[NÐ2.÷ ž&.‹‚®èÒ¬[$ÆÁ9f S Ñ÷Ä}£YKœ8.rvxꨲUΘ!396ÇRˆ½-¯ÕZ#OÜ’åV~ÅL¡×þDƒ£STˆª5WŒˆ„'öÂ'‰ ÝÕpKoµ^m¬vW·€Ñ_‰’!+B Þ5(°ˆ üÛˆ`Ç ¨ËuNQ²Fò‹x€;*K¡iÂ3ŠpFc2i’X»/ÖÞ´öÖÙǽºó¸o$Žî‰ŽþZEÍcêAþ0A³Ò¤à#‚ d¢ñS ÇÝ“Ì ~ÐÇSXB%« gkîsïc.¾ ¤A¿_G×öà”¹@^pd®¬Þyu‡7›“„³£çoGÍÛdHÏ—J8  h,Ô–j*–`÷ù1QÆ•›f„,ä„`ã'ÄŸ†àD‰AÒõj±_FÔBI“éßêÐDOžºòYêJŠûäV {†Ô,M**&+òµ—•A.=U0AÔ§ lå0.B cqº:¥—>º²ðµßFvÁ‰beº2yŠbÁÚ”X…Ô«ÉÙFL³Òäš zWwËs1ªS Ž¦qE$À,ýzpêXSÂÑ’FóWŽß¹’¢.”ÞÁ 9¡‹¿šóWÆl‰SÃÞWÔøk9HVAÏ›ãG„DÍXÀt”¬?) ®¦L“÷ ŠŽ9˜Iõ-¿_E+-cóµƒUþm4 BD]ÙC³¹T¦tU8´B)Û%Ðt5ð²ÔbÑ*ùJ1xΙ¦RçR©j¬“.Á’²4ƒ³Îrø•ƒõIìÂ' 9Æ*yn8„Š"éëà¤Û£:Ønmµ3‚hª¾&’£“Œ“i^‚²lE©Û£9GéøPçÙÚÎɈ‹MÈ®í€6/)‹ªY›JÁ/Q¢)wf°Oj'3'ƒ÷—ÁQ-¥1Q&ç”âš&Á׬Ò--dp[ÙœVŠäXyD¶3^S4Ö0Ñ²š‚©™ö¤€AÿÎñ[bÞHÊWäƒ"öž¢Y+Ÿ®§¾uFîZØJGGä'4òPvî]º53«Ù)ØÆŽú‹ÃsÆ…”™Û@GñÄ ù>‘N“ó†a•pËŸMìÇ µ‰1Å™™Iè™”„ayܵ±ØëUÔÜ´ ‡,ü œP /\¤.Ò“Xù&å'ºÕnüÊê@F1sûàZ]ÄLú¯–ãÄ®LÑÏ7œœQŠ”‰ Ý”CiÙ°ø±ŠÂŽý Ë®¬FŒÇ¯UƒØ‘.½£…5ƒ k ŠJÈÅrtªÂ½‹«cÎrZö&¿hl®²*)Þ∖$ ÷":Ô1b Seã·ÓÌ›ˆw¸CÙ2¨dM=v3Q>di?¶Î¤“¨S§gHv¤\G%H" d“å;êU[%ü[FîÁº½bЪ) "ÖÅðÞé©Q”Å)0~¬ž’KÄVVìáÔÌ43 ½\ÅdOì€Eiê(l¦%Ø#99»¡ï1¹º#+àïõh¤z—9'µÜå Üå s>€ˆ¹@.#9SôlN1BeDèɌξ¿éáÎp<-×öÆÁàZ+)U{ÄoU=õšöïœ\Ú`ÈS§³ßQ¿:èÅ'ú¶Wq&¬a“IJÊÔìvúNÀjvlÉd+R˜R肦¤&ãV›/ñ]ÚžrNe½äó|f™Ì•ãþ :°¯ªdÔ&Ææ–,TvffÚI}üíEÒ°®ÌÀIî¹6)ì7?'dçÅÈæáîy#©óL{ŸŸ6R=¨e¡ŽXŽé>}MbI'†ÿMa·XnÌÝ|$+J7K” 0œÊ¬%“Vœc8»#INy&Oµ•Âà1ì¶8VÈHŸÚª¾ª˜ Î`,Ô¡F¥T'ÉÔ¼ñ;#Z²Y$ÑAƒ¹µ¢í‡W ôV™6êycG¿Õs“¡—¤°Õ&í¦¤ý„›k™Aïy†32âÍÚ. Ã)C¤[¡K.l*5‚éEôøÊŒØ=Háª$1õÕ!ÕD‡$–ôü÷¬1k«ëÇc,D”)p12£9·”FŒ¦­¥×Z3™ë\&"á{a|ü»¶±W‡ÒÈu)!û*LL“žU €6.4§’íèÙ‰ç×è"£=ƒÍá„/וÆÈPdaÏB1óÊGo¾âÔHYÒ4~Â&qRªKÞ?É9‘8Š }dHŠò YÚ@?@õSSÒU¥æFçLž$ò˜´‰ã¦½2inpfPAx†u:î8èn‘)“;Ñy ¬©_ýÜÚkbg>A?bµìô¬>i h%uäâjõ;¥‹Kk'ôC16bjikí@²gˆêe^Ç<Ÿºec :ÍĵMQ?$© b“W’bjÆ;êèxqÉ& ©QÜÆ¦ˆyâØO) á=ºÍ#•i5 œ 4¥2‹A¦Í©´2úxJÖZ%DëL…*¯ùx•\Z×"üd }³’³¤ø$©O¶¡©Lù۔ѧҩÓê–£P>çÚÉɶҖêÙ#æ=ãM‘æ¸"fd3±´T´¬Œ³Õ%½Î®AlJ¥2p‰ö8üÔ·~´亀î(윅µ})ðØo}ÖÒDk³<ܾ‡ËðçÝr>7§|˜³z0åáõü.¯Í]`ïÐf'fL á,k@3Ááxi0Pj—Àì¾[^>„ÏÖò;ü› t— îÞÖ=6€T“ ½«!PªÞš­WɱiમôBO bŒ8—¹Jå܇ȫûUaQ¹=¹Òèµ»Ÿå(‰ü‚Í£üq•öTü(HÝpÔ.A\hå“p®–ç³aa1ZÐüòdHGiPlg]ƒZõzQ9 IÁž22Ye¹6Ÿ0a¬ówœ²4ò¡rCbõUkÐcí^¯«lBÐðê½3"o®Y;€ Ôž|KU=öÒ>0 D{€Œ{]¼÷ÉuÔ|>¿’ ªåëžÊFÑý?¹'Ž~÷z\Qÿ, ñCy[¯§‹èŸ#`àæWéòg¬êQu>ö~‘ªt<iÀ,Drì]æ<šrIòjxyµ4ùà_°Üÿú׊þõ«a,Rý׿òÇr]Ôp+.7. žLi]“i9WOå~á äh‚­0ùTA_/$Y%Ç*@U ‘ïœW¤F:®^4lá0f!V%U+@»X¶×VvÙ«;››íÕý.òÛa»Žï¹ôDª.ŠŠŠ]I-  ‹žpYçs|Jv ÁÐ{oG;ú7M´ÌŽÁOØfÇò0¾Ó¼ñtŒ„ª&2"ÇÆÇì(||…tQ]Û#“§'åÐGFìÐ’Jœpåböºùkÿyµ»+ÎìÍ©™æ8U•X=aè\Aêê^}sNÚæz•±M½EbMT…¥°0´ÖÊê*$Õ q²ªìàZY6 Ñ?Wʨorê¹'(R`Æ…ÙØv¥sy~MÜ pƒ8Ôc–1Õû·Œ€\,ü†>qx–òñ¦|Ü}ü(JʵŸÊSVïlù?¼ˆçÂWO{@º¾ù¡eV0|VªL<½s˜+ñäJÌM4ª÷2È,E®í·^ɹ,Vß¾½óceWVzøƒ%Ašòh©Zúô— ò/U¥;>`£ø¼˜zPŸë!3±òŸà1sâÜ|’Mýs?jªv¾ÄÃæä¶þØÇ͉+ùi8'6ó9“Sÿ%:õx¿Øcg²Å?üÁó¶[ànžíŸ·¶þù?©é™@“»ó  ÜðšnúÓ<†ÆáþyD3VòË>ŠªüYF¿lþ£Ó'ê >NïÈ÷H:©_¹‡ÒÄ@¾äci=}‰ÓIëö M»/üiNuç?ïãif3y@M‘>Ÿûõ–ðªçæ“=¦&xáÏð jnÈ?ðQU3ÑìÃ*uc†ÇU.—~`5ëÇY»1!ØŸå¡Uõ*ùØš”ÞEòt- £Jˆ9£Óçr2BJ,T\1Èì lË¥½ÌØøM†2vS!`L4Å‹5“q?¨ŒÀ2h¢y^….K‡bg6Òªö3Â.:d¨”wVQdìpX† ó[à LŠã•ƒOBè-ùÀäwÅTâùŒpìÂ\WH¾Ó‘®ÑS_Eh¿¢X…ßsñÉñ=V‘Ì\,4xÜÇ;v‰±Ðé}SÒ‰ „%>ärûè–d½$ÝìCjEìâvÛ¿ ÷€¼Þù©L†Ö¶;»pç;8zâë7ÐrËËR ø2àm ‡4اzkÑ ×U~RéEK_´&—9)å[/WàO¾"^”± ô Øa÷7§_Z¸j,>]*ÓoäPˆ]⟖Ub͆ðçÝ߯08À0% ;£ù_õ;oö.€ v‡We£ªå—¶¯*âÌì%k5*⃞‡›U_´*Æ,=;¼´ßŸ\‡öñfg¿–ÊDò¥B+Þ…¹í¢fÖõ¼€¯PoÒQè#¼öÛ]Tohÿo©µ×ît;««íN§Â ãDÕK_6R¡vk füñ q[N{o¿»Ý.ÉV*Øh9ÞVj%=g~2E<1’¸ÝrE+à°V\*´\ýþPè@¡¯ì_³|Ûd-ÂlQy×¾ 'oqæñ-Z©ê$c„‹Ö†¸qÑäâÌ£|Ê£\¼m˜OgæIz˜'Ã<¹Ã0ŸFÃ|j ó©9L³w±žóÐx"hÐÁ=…¿-ñö¼™ŽÛ_áßÂ.x DOThö«! "î£ë˧ÏèßW¦§añ.óðO¦f‰•—žªû`Ü-k€*úvŸðnƒÑîÄSÏZĈý*ð÷éREˆz]F”éßB $(”ƒè_Ãg«€ß¯î¯Ê/{k²b!¨DiªÔågkM~YÅ/~¯¹íµQgT…¿ î‡; …pƒ‰%1н½D‘£È8<÷|'¼ž^*ÒDSÅ GaxUíEEí"ü¹Â?þâŸþ9W~ ?{˜æÉrQã±n4d7(¨ÁþÛýÌÁö¨Â¶±­zÖâ7¾HÏöö¨s·wŒ“á/m)lþò6Úßߌ×Êõ}Ú|€Œ ÉC8)r!ǽ°N?*vóнý²µŸ»'Ù‡ü®'tñë ýzB?ù ÅŽJï²ý¿ÍQyúõ¨|=*Úˬ‘q™˜Ÿ[›z/™—ÚßæX.}=–õc‰Ûyï`{µµß^û ïKÚŽ´ÔÁ,nReNòÿIÓ&¨šu“æhão{ú¤×äªè“ß­¡*‰Ï@3[úû>[l …•÷Ú+øÞuÚ·OÅÚF­Î×r1”ƒoÚ¼bS§äöö[éöõÀ2'49Û;k­ýÖ¦ï!½·'ö~ÕoNåÚ¿ŒöPP{غüi÷Ù'œC¹Õñã¦ç~}Š£÷à­3ÃÉ»VTcßW̘Ñ}D{ÞJØ—nˆô"*ĬЗïÍnRÒ“'eIG¥æBw~»}çÇH€lÎÂÔy¸™éöm ^oÝr_/`½WVQs ½[žânÉ÷bƒ¾õ¿ÇEü™|‘»œŽã†ÂqøÐÀç÷ðå)~‹ŽÊ*¢Ü‹AInïŽê ZrœÔ¦WØd«½uOd"¾ÿú ÏKî†)ÿ˜êH*[ú[*fýyô¿,ø÷ °éú_çϤÿµÔXxöâÙé½XøªÿõÔÿjÁn›®÷ðùo$Üñ“‘9õ0“€‰½¦ÿ}Ð"±ôßÅŒ¿·€‹¤jé¿Ké¿÷ºPÐg’ÍSôÚñd^9øîy„ãžz‡ÏÞa>^2=oìbµg3j<àÄßv[Ü6+©±ïê\5Ô¥Œ7wNO$ãýLCZxWƒá%ŸŸiñT¾3zŽÓPëvžwÇ.| éJ‹·UZz7I›‡RNn|EPz€×èk(ÖvÃ’.µŸÿP46nQƒ';h¾£¸‰ðe¡±ÐXæ?‹ ‹òÏÓ…§òÏÒÂýyw»>jÐ|‰ç3zs—ÛFµÏ„<œjÛ I‡Ý“  ‡¬3ÈÀˆMÆ¡aý‰2>µƒþȤ§?¹‡nfAdDÃþIqÙúúÙ]Èk…³¨Û¯ñï€áð®¢Õ=>Üèà_hÁ?LªÅj>û[âÌØæ6°¦‘úÇ!PKíJa>ûS"Ì.Ý?rÿ̄Ϸ½5˜›?¡!ĵ˜B\‹3 ÿ(ĵ½«’Ø€OT íÙƒ ûV!4W›(ºœp].fŠ£þ5Ó‘˜úpø•_ûôÔ‰ùÊüéö§xë›åÉå³lùYö|š&¸×ÓŒBÁ_î90Bú÷}ü£ÐLö”Âw²øb|šWÆ;N÷_`¶ ã{èék¢OÀ[_)³/Ö­« O‚ô'?¼jd\®£0û$ý•/²‡¾cÿõ–õo¸|™Oñ™Ëu¯÷ù‡ U|Ž¿;:²¾ÓWøéì¶úf6Bý6ƒ?©<ònïý_’÷&ÿ'¨|û¹´¾ •©L?Út’þ1ºïÿgC¯÷R^@Â'{ñìÙ„÷~.o,¾xñ´ñâEcÊ5ŸA’xöõýÿ^ÿÀïÕÿ€õºøüÅ×õÿ“¬?ÿ¶ƒû*M×ÿYXj,=Oêÿ<ýªÿóeþáÓž7ºö³óåØßVÄ+ÏCßãn¯–Cù` (]V¶Neëõ=Ha+ß9“ü ý6bL!Ç7ö{ì-TúÚF«§ Ârv 2ä#Bz} ÇbI§¾-F¶?tBâ3è ] ¢[T 8õБ¼ttÈAä ˜ Ùá²ì…ÈJtœ#Ëž‘ Wò™ëÛè–`['ÞfÉùȱ•”Ó£(PN âÆZ–.Ä£n¡Çå ‘ÉØ|uˆæEuFÛ÷ì¨/@wçA}É‘8e÷½y·Ô¢Õa=<òð<æÎw¬AM¼Š±…Ì1ƒÛ¶&CZ46ô;Ê£5@ß—42—Áy~M_£“JtÁvûjãV® ½üWÂìoiß]HžÍGà†—¸yÔó¨ó3òÜp>î(—÷VÈ`õý×ÑÙYßTª€ï»{;?o¬µ×ÄË_ ³-VwvÙÛxõz_¼ÞÙ\kïuDk{ }³îïm¼<ØßÙë ˜|«•ó”×ÚþiL z;bgOllínn`ˆ´ÖÞ^k{£Ý©ˆíÕ̓µíW0ÄöÎ>ÙÜØÚØ‡’û;j:]S쬋­öÞêkøÙz¹±¹±ÿ 5¹¾±¿Í­ïìÑ©»­½ýÕƒÍÖžØ=ØÛÝé´Žom£³ºÙÚØj¯Õ ЮhÿÜÞÞÇ(n››ñá"œ7Ûí=ƒ9\ñ² =¥8ŒÐvmc(jVôm&:¹YA@ ¸7à;ÌKÕÚû¥"ÁvÚÿ{å S¬µ¶Z¯`Œ¥Ûgiõ`¯½…}‡)é¼ììoìì·Å«5šöN{ïçÕvgElîthâ:mê ËŽ @‰ƒðýåAgƒ¦pc{¿½·w°‹áíʰæo`† §­Œ‘‡s½³cæ½ÓÞÙûAã|ÐjTÄ›×mHßÃé¥Ykátt`öV÷ÍbÐ$L& ,¯Øn¿ÚÜxÕÞ^mcôf£Ó.Ãâmt°À5;š= ±ã¢Aßh¹ÖãÛ¹B«+6ÖEkíç ì¿,û¡³!·Mßêk9ûêX´È(sY\Zîgtš‘¥ÿž[î5Ê|ßXnY–•§}õɱå‘ÃO±îÃi§à%™‹9ªÅ×@ßÃB©ä:Þ(ŠAv„¨€ú>»1<á£ÑØy¹Öñ‡,D!~·Å„H¾mÑ 3Ip Q/¬çÚµœîú!ŒQ•jçÊ™®ôæÜG×ÁÒùp…„ rí„E"Ⳛ¡NK`êX^6h¢l…7£}W*ÃYn^ÌG“`ÀŒˆ4t ×Ê.(Òëå3K)×U@äƒÉÅà2èZŸ\1l•fyJ)Jÿªgÿ¥ÿÏ(åËóÏŸåÿþ4ëÿ@)ÀÝ×i©ñìëúÿ©ÖŸ¾ÝO p+ÿÿ¡Ý”†<Ù-æƒAñÍô9æç/aXöiˆ•I¨ýÖa_K~c®û£¶?xV>³Úfø=(;Ë\±ÒhCé™ßß;h—LSÄFÿM$£C„,Œ"Zâ71úʽÝ{»#‰óÅ]‰Þ'ü³ly>“üïÒ¿[ã?/-½XJùÿüÿù*ÿÛMHÿ[‘c­‹¥Ã¥w…Ãq,\-Òß§ôwiáfå \6Ï—jKßÖž.ÖÏkŽ[%7R–?²ÔÍ3õÞÙe¤?Ó¤ôoP£w”¼M±„ÃÞÕ“¯"°ºwZ⟳µÞÝØnïWØ\³üYÝ·é95\·é4í¸ VÖVçù]œ³Ý̰› Ÿ ­µ§@!O’:ÿÛxöìgåÛ¯GåorTrrî‘7W±°äFËb4>8=cs)"Y¶ÔƒÝš}LÔ\…8¤0 w³T oºessMªÅEć›‰Û©T– ™¾¸çþÞÞòrD]g•µÝ©L5EÛE´Ë•©]YK–9\@laüx"ž­ ðiØ3(N󖲞â*)wwœo¸aãyé1ö’F™E»Ø„âËÈÓ¶Û§hÀ̉}æ¸fåËʾŽ}W N _™GÆ—øï†,Sø€53匟mÞoÞÑÕá–å^«úO%L‡–ãÞâzåN4nãS[ü”Àž~J`KŸسO ìù§öâSûöSûî+…˜¢ÄÍ´t$Î*|ö,qƒ Æá¹–ñ']}ƒ¸æÝ Q{(Œ““š,ÖÞ•§“`èUÖŽµP¼ïfñ»ŠøË k ½”ˆƒ• $Õù4œÅ›™:ót*§7_ýßE†b*©|• Þª§2q)í”?šÐ¿] a¦…ûlnž¿ûn¦Öïÿ†þã¡Ïå’øN«vÐ3Âÿ ŸŒ?ÅÊüGÿÉÔì³v¿Kç ¨ýüÙgø“ÎäŸÀòÅ¡{8(¾ËTßæ„u±=ò¬aZî/b]ùºÁ,Á«w“Z_hÖùU@úO~BwÕS4Ê>›ûé?’K„»žý„áSÄ×öõ âëÄßø â!øòù=5p³tË? †œ'Ênœ ÔMÿF)¡ÚVc™,€õ{²þ1#g§…ºˆƒ%þ‡© gèÿ¢Æg<=Léwvÿ_§K¨ÿû¢ÑXxñ¬±Ô@ÿÿ/–¾êÿ~Qýßïƒë Ž¾:‚Ú¹©Ô{ÚsÃAŒ¤" i|Ê?Ëþ$†´‰>Jï9CõCéuéßR·KAåOñD«ƒéñõбÌ’ûžÔVS€Ê‰YÊ0¾ Ä™Ã!!)G——åŸõ*ruáûÅá;ž™ÌÛJ¯ˆ'OàÖ’ó‡ ——õf!Žó.b^¿zyyý‡õЋ`:þú´ÑHÚ,--~ÅÿÿLûÖíûeZ$áL£=@Õ O1„ׇÅÊÓÊRåÙm:Œ¶°÷ĤCMÄ‘0"™þ-¤@‚ b€ Ÿ­üq½°º¿*¿ì­ÉJÈk°¿Êêž*õ_ùÙZ“_Vñ‹ßkn{ô˜nTå(ga<Œ¤g—à‰{{‰" Fr ç„×ÓKiÅ]ÌxlUÕ^TDÑ.Ÿ+ücáŸ!þáŸA‘ssQĵbÓ¯Ê+ ¥!­+$»z=!~‚+¶Bíé•}Õ²cHYþÙ@SÂs>h }éý0]^š1´ Uø;Þt‡ Ë‹åô}w¸øî~wÞáÓwŸàÞ;\Z~^žáö;|¾ümy–;ððÛåÆByÆ«¾åÆbùS_‰ zqyq¡<ñâ¹_¨,.•ó ,hö,>[^„Éšrq.¾X^ü®üi.PøÝòÓ·Œâé‹å¥FrK £XZ\^Z*O½f—––—ž—g¾n—ž/?ƒEŸtí>[X~Ë<ëõËu+Ïž—ÕMü€«vRÔWhdCZííU¡WµÌC-­Ìº¾Ei²xÅL>|ÖÀ‡¨Æ· ³*C)$£±q<õ~or.ö¸†:ýª©y—¾Ç.Å矯ƒ‘æÍ½»·´ø‰ºws+·í­á&ù9¹ÏNyú¹š-fý'a²é$ÝÇ{¯u†¡NÆLky5«âM|53ÃwÿÕ§èöýÿ³å;–¶f8ÏŸ>.÷_î|Æ?tšÝÏ*¿ˆŠÃ½">4¾­¼¨,.Vžw3Ý€$ª·øTÌ¿Y\ØîÔTêÝê¾ÜØïürϺý½Ö›—Ù•³D5$ y£²Pi%¾¹v7Á¶Þ±Y•ùööí¾ã‹ÜráL©YOø‡Æâw•ï^T€„«è–{(Ñ9Àâ"oY54KœØ©™€ AâC!<}0„¥É²o·Œ±KhzZ+Ùl)§C™Ù"s*”§³AYšeéë•}—+{ñ»Úw/jp¾àâ¾Ó­ÍOaŽñ¸Çj–ybPK8“_¸Ãåç⤡W‹uÑ%EöC1'ØLB-ÙÂÊŸKÔ{·›`õø«Ï{ôµ×³8ãw¹ õž/,}Ë\Ü¢‘> œÅ pžÞÎÓ p–f‚CX%V6‚ñáÛ ýï–‹'³ù mgcµÌÆ‹/€ Y¸G[–5È-{÷ÃÂÕ‹õJLä<õïmGaf@$)ýŠ¨ï€¨¿­ÑÿîÉX©=õPæJù÷ïN@[›ÔþÓ±÷"6§îá?5À§ŸàÒÍ=çwáRøkÿ*œøC>´¯0jÏóûù‡#oSHãÛ¿:ÒXš…ºkÜwÄ¡L!³Cy:ÊâìP–&Cy: ÊÓ,T˜•ݘž½8=ûé'býÁxî¦ôF†-²Ÿ,o¦»'ùl˜ŸßŸÉ'>ð³œøÉVèwûrÁz¬‡yYøÓÌó'ŒmcMŸ´íÁN׊/5ã¸ëã}j ûo²yc#3µ5_Z}å9=áÆfJ0“~—´|ÿï±Ãcs=¯Ï"Ê*ÿM6Ð'?•Uo4_ž}¨Û™û_ÀéÌŸf"?á„ý |ËXŸÌÉÄ>§_º›Sôof`þøÀY³È…3Ä )ÍžéBØóÿì¾ÌÄ}¼wÞ™³˜`bÿÙ<’|‘k6r=2ƒëŸ¯á³þ‰öŸ§ã߯}û´üDûÿgÏž7^@Ùÿ?o|µÿüÿêó91/^Ù®í[Ñ÷ ÛÇ'W ×%àÂáÐrûÕãÚ·„ذfׄu ×TèaeûÊö{N`ÓíÀ9Yçr€ý둸HùzÌvtfW€ù/•$ÓP*8ÙKpÝ8‚÷[ÖUët°áŽÆaЩ(5¢q„ô;·Å‡Av¥=~²ê»ˆïv[ë›ÝÍÝ\}^lœŠK‡âdì ”âìé ÚXîYõÔBt<†ÙùêðE5§Hõó§v{·»~ðßÿnl¿*1ÎF3% ¡Ësö °oo²‚ Ô‡¶°­Þ9Üøšî¹½[[,©/ß‹FYs¤Øž+"qFË ¯ÉÍÍŸ·x }³ãÚ4cÒƒC|vçÙ’0n ‡·^榈]ßëÙA@ÖýìðAšIªUÝØÚ=B´n•Ôš³VÃ<Þ}óbËzF×Èöá&Ê"ðà»—~X Ѐu˜1Ë?#¡T—ŽJ—ç6M>ýòàÂá Ä¥7ôÅ™CNÏî—kT±žKz}˜‡.8v¿+éšR"·<ÄóØ+Eâÿ‰ó¬Á˜(“6óX$=Á ƒ˜7½0 7 Ìà° 3 mLC;¶ÈØH‘ës!É¿†WÂî–µkªñä‰á“Gà.7šUt fÓ=C$ýƒ(× ÿ ÊiFÜG52¼žb/m6SÊUÈ¿‚â‘›¯ˆ˜Ó 57tܱ­Rn²&¡|àFÂt»!b ¸`_êþAm¸ô?_àþ>fañÞÿ/g /žÑýÿlñù×ûÿ‹øgt÷£¤À‡ÞÑ. ›kqr-äN°;ž‰ê|U´ ìëSü÷ŸXÄé;gç¡(­–Eã»ïžWKbðèx§á%ÞJëp¨ë×Y»£WÚûçN@>vPµ Ñà\.¾Bhx¨z4Jøsà pØþлÀsñ\.𥸡ï ap‚wŸV *ÝŒ¡TÌàâuNa¼$O„Sð%Ÿ!ö±6öp‡Äö/ì~Ôù‘ïùÖs£vú€q¨ÿç€ÔÍ âÄÆkÿt<ÀŽ IÍ›ý×;û¢µý‹x¬qk{ÿ— ëÛWDÐØB„ Ë1°.WT׆}as[pÓ€ÙL•o¹!]e[í½Õ×±õrcscÿôúÆþv»Óë;{¢õw[{û«›­=±{°·»ÓiÃà†K]çÔª tØZí®îl¯o¼ênµV÷vºk{@‡PòÇné°ÛÚÊ.ò®š&³r©ðcùü/ÑÖÁþ–íþÜÞëlìl¿C6;‚«]Â/»­ÕŸZ¯ÚQ‘Y@÷ÝC/qÝì€í>D‡w•J€Éuñåù0Ô;÷öItzðB²ÔùÀšµÜ/ÞXœ[@b¸¤t..æƒ}Š”„,Zb¯ák ü÷Ú¼õÄÙØÂõ´é©å€Ì»Vaó ì!ìYLÂÚ.œ»D{)¾‚;´‡H’;¾=¸®åö=Ñ÷àÈ1)ŠGx-õÇpØú^o<„¢¼é(Ïê½·Î0BâõHb‡"ö•5ÜÓbV,…µ› ÌýÕñìdÜ?[­Ÿô,ÉO œEuÊ?¬MhÑ·µ_Dè³Ò+67´z¾‡c°Ý&º˜a€Pl~´}oH“p*¨ÜÈr¯Q¯Öl&]”$s.Ⱥ” ΉfÅÝø —àÂÌNßzç×Ê982kíõƒm8<éÁÃñ<´†Ý®5rºrË7‹x‰spúºˆÆ}ç#4·Ÿ5}¸bV1Äþ¥ÃîyN„áÛ¿a/Ã.¢e¬ë ÇCu¼àHízô6½D¨¼/i”5yþ ÄØ1BZJ¶†ø`½µßÚ,®y48¢°À§º»±½±¯ûLpÊ5…[ø(tå Lœ2ëžÀM¡®ÞÌý@³†ƒÒ÷±¹:Ið+±´¡çÁÄŠ5c>düºE4cÎL÷¥=”Õ!¶šë$ð¸vÐG o`‘.l\ľ=B©L:¬ø9É3ÝSç ïR4h»ÔF—°naˆûÁõð¶DßšnÏ Þïa™Ëš»ã€¦Ðe0>QCdº¬ø€ÐŒ&¶‡žØ@î5^jCæ ôC¬nKú/ ŽfV È1Ø›Hï‘qÌ º€ÿ?X$¤?y)ÞÖiÓ»gŠ2 |¦¢ÅS÷;­–e6yòs¼dÿÃÍ#lUWnŸ[ÚIÃQ‹U¹Swà>?ï¶ö_KŠÏ%.Ÿ£é1Ú“-‡¬€énºã,`©|jZîނѰè‰bù*8Ü)§ÎSÇr×òi„=é¸U¹ÖÜÍPî®q0F²Àœ[þH3$ßz’jãC©"žÍ2vBÃVÉ7úÞ{>lHëãf QŸØø z Ï‚êÍAÇCqˆ;,ˆd5‚wº3°Áܲ¬¸`Î)ÉšYŽx*m‹˜-žQ™NúꢦOìeZ4 e~³xT(Eí–ëÅcûj䋼#/–á·ìX}þ¨T›?*çqM˜r±OÜ‚$k [ÎÆö+ÀÔ üÙÌ>t^·77o “Ãäó꺉¥èHÉ™»U㕊ZV€4vဇcH0 šb£$úÝõÄж©Äí­A IòÚ»$ÌJXvžä%îT?p`W¬®*òŒÊœ†0Ð8J!ŠÑ+œ(^ý±â ˜ûƒåiKçcKG;§%YWÚUt3S¥B'ߊ€0з]âÔP&öDoJܲòèûÖå 0–úøñõ¨‹"–#´|‚ËŒ/}F~CïÂîë{šYR,e1QšäTL’†È3M왢 Uj¶6÷™˜ší CŒ÷º–3ö÷q¯ŸØÌ‹Ñeÿ8§é,hsmcˆ¯Öæ]žögȽøÇpàÆ,–Ð2µ"è Wuzùv¾BskŒFðiÈU†, ºßhOî£Ý½6l¥ÒábíÙ"ïc4÷÷Úðiò—……eåâ*jjY C©ÙQ!«¯·6;mIïÏP:E;/;ûØ….µŸNf¸š] ŒîöξâmzÙù€ ˆsÔý¹µyÐîò rb,X¤}…þìdMþJàšÅ¹bŽ8£lL2JäN\tbWw¶¶àHwpJ¹Ch€\ W‡Ó÷AB¸¡ÃO'X7yÝ€¸ÕyÕmïííe~h¬?ThäIèÇd/öß_î’I”°†Øn,ï¹È5»p‘÷Í5¸®½,pêd Ðàø~÷O8¾L£É‹Î§ö%RÊ@ŒŸÃõ€„ª" ž¥×àÐéxQéÄíÀʯ¡ vÆGQ¹K·)*d¡Ú“–^ u$Yš SS¾$]"±®~$Þ#åØH|‹y¸óæ+ŠÜ÷'—„å:C¾ãk1."®£jÃ@6ñ<­A@²¤èU@íø…= €§©`ƒLA¯® ;ìÕ/Õ¸ºnÖ Þ³LÌÑ4àÍ\«ñ„âé[kï¶·×ÚÛ«í¡ÄÉIDÛ& [C©!4æÓÓ‚Âà@2S¶Û»½s»÷. ÂÅͯ®æ+ð÷í[üØyùŸUõÉ)»˜]ο‚,¬ù…0×rÁC»wî:¨­H³Ìt‰…|,±³²cgIBãšâ­ÿeÖn147r>ëFö%ß­æ‰X;“¸$2‘7/‹Ñù´¦§quµ¼Q›,Ü=ÇïˆÖ,'Îo<[®Ê9K=©œ¹’Ô~ì2>܇ÈÑ!Os¼kÔwóJv.Eΰp Š)£¿™½s°¿{°ùE£ÑÌâ$ÃÚØ^ÝÖ %ŠÝÁ/—¨‰†¼. F1Ɉ D'ÞÙ8#t(/îxïî³NðÃøŠ÷mä.ô:9 þ×êZ(ADgÁI}½[=xK}ƒeá±ÂNwÅýñpxÍw6jÒöEq­øYKŠÕ-Hàk"¯| @á«ìŒXË£F‘?Uÿ”ø# à€ !†ïq¶‰Lc9Ï„^yVU£ž9‰—45ôÜ€¢Eäý‹¾M`$·‰]"ºgÅ×3Ù^?ݱ7òJ•šÒj›‹EA1áb¹iNB`M#âKû6Ü*(M³F£%(©3v7jݼ¶z] Iyöýñó¥b `± «ÑµËB@´ñÎY(ªCô`fŸžb¼Sy¡Jš %<F«Ö51FB—Ø.1`€£á²¦õ/b¨hž:‚[Þ0u¨Ø>ÃÉmºžk³ mdZÑÉ‹¦ÈG‡5 Å£´ êŠÃbPÿunþ¨thUoUÿ»PýîÝüQ¹\¨5ê£â;ñ½¨Õåv9F•5‡;Ù»¨“Xƒ&™Aâ8–ºHÏ™÷ 5~HT^^b+øó1Wâ~͉ªå÷ÎÌoåDhŽ(V¤F–X ãñô¹Ú(+;Iš 25Ó+€¦¨jáx„g€D‚Qžl®¤Dñ ©‚H$=‚=|é[#Vi4O6ˆ\ TŒ‡®øvA”¨™£2Q5 £÷âÞ¹ç!‘­q …Éo lð¸“äè„¥‘ àìG = ÌY}à1®Æé!õÕ¬f¬ N¦­k µ/‘ãfï ~¬«LÁ! z(ü•*ÎUœU§˜™:´aêµÐ.Ê ¤^-=»n¼*_µÎ•–Åx´ê­õ´š¢ƒ+Ú‹â©XÏÄs½–°`ÖD1жCµƒ°Xpеó|Qü »È¹ùX³AXp šà ”|§‘Û¨³à\éx°ö0ÔÆ‚¨Ÿ8n=8¯Å:VŸ——Ô|½˜nˆŠöGÈÀSãv—ã¹üó·1ð=7±ìzfV^P”´Ó!™¼Ê A\Oz±Ú+.V½"Í).C€déçûVp> Â>`弄ÕkP‡2@„Qâ±» ìùê“'Ñ6ê{¶T÷õ=`‚jSCÓºEýÍcO.£+ïÚÕÌèUx÷m¸¡=0ä =n+_zczB£È÷ˆ~ô‘»g0y36m…@„¶ßîW½]hè¸ã€Šæ«aüÁ“@ت!Jʤ¬·À>¿âs‰½ä”à+9vM#0žUY=º" ‡wajññ£V‚•å%Þs=¼ùvŒzÒ: mùÆZg |z0ñN0 H0@:)×t±V¹jE½é …ö<ëÚõùØŸ·¿B:jØøRV‹Ô~y WÛE!º¯»¨"€¤ŽèêÚä=÷(1(’R=¢8{2…î.c¼Ãà¢÷B|äÏapðwåF½ÑHæ`Fb]ô20!væ{ïñ,ð.D2¢ÍFÒ&ÜæÜ 4œ6ä.¯íï­–›çu€¸Öv½ñÙ¹" Î(†¢BôDÎàû‘õ^|é‘ôˆSr†#«gL²ÚÉwqr'w‹kË8†* ïMëP¦©wù‘âRø‚Œ ž¤ŽšêœDÅ¡>^6Ížáp”™µyºr„Í £X¬Blp |Aâ¨|QG3<±øƒ.‚Q*?V¥Î€ãH¢ôd‡& Ç)՟ߣºž¹;T,|@ÙA¹Q ßc|Ÿªd“HÏÃ"ZÆí "|DFÈ­¹ÂI9£Ò±%¡‰cTÎ$}Íè nÀÐòߢDª³„|«oØåœ ~#å"})aNÁëÌÖ èøæe©N7ÈŠQô‹GAò ÑA€k Ë„ª[»Þ‹ÚÝ(/j :ð‹Žá8\/늋.óQ+jˆËÜ.©9p_à¢*®àû"v¤Ê©ÔåúzAŽÍ:CT Ù‡{ÆÊËØ£ok Ó[æ‰\6ÚÛ-Ƈl˜UÐŒ},ŠØÿøÑ-p…¸xñrü¨¨M#–W„|2ÐXåVG¡ ])‘Ó:̺Ö&1ݲõ™y+ü®{Ykïní¬µ¥Ø‰Û,B€#L´6ƒJÌ'åÄLwÝ7pÙ¹ŒÙ”t&?Kð–DytYšHÍåIÑ3Џ5Ç y[Џ+y!Å õøU%¡¥û6) ÍÐÒ“‚Ðl)éf»µ¶±ýª»¶³Ÿ|#SõÄ¡$o¥ÒC·ï…7ÐÑ i~ò°µ41êxŸ"i)w©µ÷ªÛÞF×@¦®ª–†öv¬Ó…»f·ÛÙßC#+T¬VyE«™Õ°DŸY}/?à‹Š1Åö–†p#eÁï;Áô‚)$g »:C©CO[3’Y¼õô Éšæ ººb‘Â%YâK˜ÂÎf«óºY<*J© 'gÔ,Âg‘Þ ‡ƒêá„ÎÞ­ØA·;ñq4«XD÷sbýD ~$|¥ôûÑqz y7ÖSõ½vÊ“cwêûÇ­º‰w˜)/)p¸?0ngTE´Äú)T¥)TWµ”u\ æ5Røxj‰!4HpˆjwHáOMåÞ´Ñdhà”¬S› b‰xƒ³mga))siöÕ¦.Ñ»žâåãúúÆf»ÃìãüQq¾L hß]Áå`Ê3‰E„Ìà\I¾çÎi(e_Àù CÄEúe[ëÌwHáy$¡[B2þ4næ²N›ÇR1<ÍSE’G`Ûƒúrm¾P¯%øU–,œÛ¤Ù¤tôð-U)½FFêáUuµH>A¦ö†N“¬:(¾ª]s\æØrŠŸ¢¸7 1EãA9Õ eÑpÁàÀ0|R`A‘ÖU/^¥TD¢Š ø€Ëˆ>S/ŒÄÕ-ÇZyØ›mP%¬=¥Mcõá?Ž["ÌN:•¦Î êÁ}æevçòÜØ==“çõ¥Êî2ÉЈÐCU8‹ѲIÀ ØÒâÂÒ·ŠÍÅÝÖ/¢ú/¿ÔÐË+ ÛGÁ}?Ò--,,Ôo(eÏÅ òë\m>ZT´m”K]›¯¼­ŒŠzÓPŸÞf˜’*„;íÁ›ÇpSa€/à%ª^æ fР1Q¤&QŒ®[)÷W8d&5*¢±¸IËÊ$­a­÷§Ö€»Ä“qtEž «eñ(Šç$ Ùêuý÷<~îôTÇ…è™.6£{1 Fú-’Ùài°)à”š zN¬ã3îã"”²5:“¶ÿ@ì)[îËêe¢s¢Pâ1—¥,ÄñÙË  Ö7¶Ò  ƒ‰×в³â=”Wç›'`°ÖÎ ®=æ²HYV7‚šøÈÕ Ç€P©ŽmÙ°:›¨qH§¦Œ*ùH¹BÍM^î5˜"sZ™O§ CYÕ$êÎF9ù¢|ß«p”{d`Î#Ý×zQï‡bý¬xlH±çØ‘©ÑžÖô¼}…O 1q!=õÊ#T/à`ÒJº“Æڛʾ“‡ ãu·~B%Í]`œ"€ðí]$Fã â4óñ†ãRx–u£ ;ŸUNJºéãh±[IÉ ÜŸÈˆó»–9ñ¼h:k÷¼f1;®»ÿŒñJÓé«´ qPtº•Ö“úWqý$íóy”TßJÄIÓ@]¹‡ñ'1f%/Ùá9±FNuøj$sÏ×ôFíኾÏÿоÆy`¤ û™žmB(±qïœyCùzÄnÚô¸ q#žkoì+£f®Ý³ýÅn(3/Ù  C=ÂNÇ–,qâœÁ–Ee`2Cݳ¥Á¡]†šŠ1O †.™,Ó]íîÄì%£ê°ÓLû<•ZÎ&êGúãqkTi XÒ¢˜Üí*œ¤íö»rVÃ]ä‹;ïfÖN (¶æ%–ÍÑ¢M25oפðÐ&•‹P««–F¾­Mâ«‹µg åJôv|‚:‘b”"[#£/7#m@´§z‡¸D 9²I¢ÃDâ©,ëô°á†´y¥.`±”¥'úJïƒôB¨,õ=Б€ÌàŽÙô˜ž±$`Ch¦Â·‘Dµ C?TR¢,zUæN’©‘š/¹ZÊb,²uÁzŒ8‘0g2]eK1›^QwÆ÷Fzιó<œ‚ <¥Ðþ\Z«âž×½¿´°‹øêì/ à˜ä’ñòFùTúâÚ—•®è4ŒHÓíRáÒá¯î°Uýï»'ë›­WB¦ÊáTóÛty¢6¶;û­ÍM­ŒÎb ´ÕP†LÒJƒ®ˆü1}5”Ò`v«…’²ç!C×i”kíJЍñ ¦¾%ßš½Á`¬xyT(³‰EÉW7jyÖG7ÄEG±UÑl½ø®CS›\L³põ—Wh`Ô}->@Ȳ€Úä#|âý@7F¥A5‹ºú% 5s•@òQw8Z/]@Þÿ|QÖ>zâµÏ1yÕè|¬9¤¥2v‚s@bᥠ› În••1Y7ñRþ"³[éΘ‡ÚWðÑ]Ûh½ÚÞéÀ>ðÐ4Éí¤ö&„—^Ub¸õ«1!”|w<k‰{²¦ü²pSO•<‚|…”]¯Êwš²@16°ÄÙdÒHåíh%‚ãˆï”t5ž'z½²ÉQhžNR4K¦>æ+ÿ¬JFNü3HÓzä7°ÞûwååÌF_± À½÷Ëð½¢ öO­gIuIÞL‘S ꣢Ap”o½Óg°htg¿Ee‘mÉé8DA¶¢Çˆ{S*yÔú9ÍK 3R°b9éÎO+J7ycåå„ßÊ$£æžA0²ê FǾ~Å!æ½çŒˆƒîxÚ©ÇÙ†¿s¤ç?›_ðÓ°,DBRµìäCL È´•ÈK Oq?¯|ôzö(”Ö1Ðy @kPu›‰“ñÙ\cáÛÅoI GŽãXÕŽnÝ ï"»Â:ÄìrMNZäuGM«ˆÍá;k< ã"¬Sô‡Åȵ&y³Ðúò¡¦‹M'YvHLºÛ@ÓJòRâr¢!€¯½Ö¡Ìñ켆ì"­ ²÷ôÅWßüS¥DFË(Ù<à{ÄÅ÷ßá¼s;Þ(ø&‡ŽýxWaOQ2ªY\%êäçã‘íÃÞ€Ó]'3Óœç*+­YWa¯žl®€ÓQ=-*-;% uCÃm>›`4‘œtswb{ì`÷€tbü œì¤Ò€·•G2ÛðÐMÉPÙEäh/¡~ ¦ðñ V Õ–5 KŒ<*Y#ØA͵Ãú…c_ÖFç£;ýæ³¥År¹]–B…6uUÕ~úQÒN3‘4–I•Š|™SoÈô –óN¹LÞÐk(ì=ÒÛŒh ùÒw¶ÙÒŸÔ6ªÂ½¶a°SPEP‹­ÎºÞéJK¿–ËÁz‚|7X]mïîå»ÞÞÛØÙëîm)ÖÄó×v`šBñ£ÒªéDškáã»Mƒ¸´®¥£©Èµ'yï:·‹¸ï @“[-Y×ÁÈ_m Q¶=ÑçÀDR ÓIÒ¦æüØ@ˆv³h{Œh^^^j\=_Ô5ìúÐé/UabR­µ¥[ÔÌaJ›F~`÷d(ÃÏQ÷ÔjêAY0éѸŽï¹¤`«×`ò:åÔòT¤ºŠHÂðû#·\R¤–F6LÊã]îû×5CZ¦‰ßrè%͵/Y!Ä4//šnɱ=pNH5¢‚ ÉæÏXV¤ÂCèfŠP£¨dR€ÎP|AP,iÓ‘öšI¯"üüS˸mž»Ô¨Ñ‚yz0’Å º¢È„ö Ý>¸ô¤=œ Á^<¹CLûÄH~G“h1Ȥ\¨:Atá#ú”T:$`‘J"Në:v¥ê9">³!”ÒOøÊ\Í l4ý˜•]6ˆ£lÊH:!}ó˜äV«6¡Ö ‹ *H6›¿ñ¨¯Céá¨z.õ«ÌWC¸ƒœ>â²Ö0&ï Œ&ÈI•yÇð—,½@Q3Ê[-Zù܇©WB‡}£*à㇅œô˜+ßOÐí ÎPäLš"Ý×;;?QdW9jQ*`ày#ÁQâ“£ž´É…7õ=¨H%4Äjª÷‚.-£ól„Ó œÐ+”lâîpDnÚEœÊ¾}EvŸÜ®l»–ë¢+)ÿ¬YhÐWj±KQš 0•KgÔGxÒÒ`m¾XYÂ4 _|Ô_—ç…RŸˆÙÜDÉÉŽ°Ç¶B"Y<cCßô&XµƒåÜy¾n8/~H(|¨ŒwåãºÜ‡ï’íLp=ÝøÇ8¾JÈì2ßp£÷‡‚¼Œ»hë{LÊþÒzò ïi±Ç3 >D ŸsÃêðMSE¼ #ïhJ¥6×Gøx4_–q>Óa_ÑôØ'‹Tƒó¢V9R7»j^íÍØ»Ma¢_ó§ÿŒÍ•Ô“•—r'ŽƒªJ £d0y¤„§U',í!²ï… g b«S]Ûé(þ.ÃbÔ#Âv”&7µö›ñl—cÇ©dý6ا<Ó®À4áhÖ »XF7†?Ì—5jéMÃü9?·¢c%VÈD×…jB°–^P{ôÕwòDÔf:*ej§dM4 ZÓß\1OFì­k5M;Å1JL ¸= Æü®wßsÂåÜ£é>S ääðXfJA}®¶ûzgû—eN4þœ ÙÕÜ«ïXÖÛdZ ]³=£$¨óiÇ!@O[h¦sˆW©vØ£`) 9@Øš¦în~.Ÿ‹”m‰Â€%B6OCZÔ)G7]È»ÑÄrBMÞèª=9Y†=?Œ•ÝÅ#øÞA F¿èk¢X©è¢B³ÒY¦{âXu:n0ºhXŒK÷ó0/GzŽääÓ`W~æL ãÓ3rØ0ÊÓµ0'¶‰Ë¹/;k™£¹F‰š›f6’0_‹yyÀY*FÓ¤lõï0h¤É&;¡¥]‹ÆS°Î奬1 0Úœa¾" È1³( —Sqƒîµ;›hÚÁ‡L©£%ç€ñæºÒ‡"ÝaÛeƒa#Á›B Ýëäøî«CÔ$ò4ßÙ#ª”D”ïbÝ”€”Aªì×@½ïlÃ2Mt®Ye{Ié]¹ œñMa1m˜B#Š6€r «1Ÿ’S²xȪZì"ŒÎ%d³j>ZÒú®´ˆ©1¦œ ûŒõ‰µú+‘?,‚¡3d2Êœ5³QÎQÊFû¨Ò¡ìEš¶–m<Œ°Îpƒ}”Ïp„ H!FTÏè>Ûàö]°–YŠ¡øPºN¦ê82ÊÈkGÝÕªTxR/mü›7É5cmšQ•¼A·™%"/®oZ{°BE™YAÏwFlªáy¤‰JjÊ¥96úß¶#;rqÁšžR ¯´Ôk_ƒ_Ü‚ƒºDhm¿Úl«ÇöéNH“6•±ºx¨ØÒ’~vß —º'# ñÆ'Aˆ¤"ծźïH?@Ñâ -µiÝ ·¯P-6–Dmc~w!U òó7¸–~ùXJžðNÖ™Ô×@K‹û)êÄ;+&…€é©"]7ŒN”=†NI~NÃåуKq@ ŠÕ] ì‘Åfp¨É‚—«Ö¯‘5&÷º#»,Vï¼{)­_©žTìKkFEÊæh"% þ€}¿^…j¾lïìWIÇänJéä¥ãÝ24¼¾ŒBÍHèzOŽYwNŽØ9…ªSÖ 5/*Eþ£]9Ï%­Ò‹)›è}.Ò{Árlç©ü¨XzÒ6æ Ù«[T‹bÍ$,-X‘Ÿ¼ËÅWÓhé!·³tx¡Kl¶*:è¼.®êDÓ›*ê'(ùI=4k‹Õ]áXÅÐ\gT„õØ×¼Ý^¯ÛëzRÍA6‡åý69!P`ª®tH{/nއžq<ôyCÆ ´ÆØÒRÀl¨(z½U\÷ða'î.™—‡ØUít5aþˆeT_û„;%=Ïpɇ.Y¯X½YÔ<¡ÍVa*Òá%¹¡";Mz+•®­i¿*ÆÌ4¯É$ž¶Ë°«üìiËD8ù°º@‘u7Q^íE[ÐL 4ªžN[¤DtulŠéœÉðT›U8f Œ*IKàtß]/—ô89šB±Hòœç¸ÑL¯:¦_B <ш‘Ó22†ÜôÖÇàE¢— ­'¡­ë™Hªq2ø[FzÅG @>yAÑ5Cs)Çi(C|à¥w;åñnÃÎá*yW",¡´ÅØ~5´“q¥ÃÆèç ýJHš1ÀnšªÇM$‚+ )f,C0ä¬Ay¤bc!gä|H^]-;Œ¥L WA§Õ’棷³KG_²®ÞD½Vº;Û«†­ÂIâ0KÑruu¢úŸ#TçWjˆM  u87Y¶6î)F…|Þ£°†]þÁ¯ðï :…ÃT5…Õ·F:¨¦¢è‹üØ({$£I&‚aÊLrû¡œbZAwh/67¶ÛÛ;Ÿ#/~xŒöËíNò¡|wd.Ègå¡‚Ì z<Í¿s‘ÎD‹G…‹&Å­áÂ“Û§éŠ –WÄMBž=4l½¥ò»l6õ!Ô²\6lýj¿ÛϦQBy1 ˜p‰K}q1qˆ~Þc·Opw O ²ÐýÞÒød,íÀ¤¢¹Žd„d½Û¨§}´å¶†¸¤-Òdv‚Q­u¢‚œa(Òà´YÌ¥DÍè¤hâððèè(4wT8z|T<"¹çàôÝ;)qˆ«ÀÈŽOîõì]Y nY¢«MiïH=šÞ¦BšhËQDŨ-6í.ÂýRÔ¾ÉYõƒõøBì ¼“ùˆ¦\zS) ¢m~`r·ÆRâ^Ý”.]0ž (½P+wZ¤è?8îûVíçG9éèÒvà2BžAtÅÃæä¢ ®cY»Q²Ïèô ´Û·Ùin²8Q\¥Èê‡1À9ÃÙx™ã$¡FÀEÁ6Œ¤x$µrX?“^ õÀâXo™„MŒz\ Ž”fÙý\ðoÅñëÍ0Ч'-¯©çâÞ` ‡óïHŠÿV‰¡Íázô>.&n¿Zî‘Ñâ Ê6”oØD[heúV¤`ÄAäÑ9Gä”ϨZº+r8ŒSáʸ™¤Pk÷+šT’ñL(ä +öô€ª“ä!8§ök-ßq+B*¹°TÒN ÎYów/4ENN°®-¬c‘u©VÉ3ÜæX—{@ªC1ƼS.½XÐjÀÇ@Ï¢Q`V*~²yÁ˜å“"‚Ä“g:1ñµÛ"5È€PŸ—u.+#«»H;)¾@?rvAžƒªý›XŒ±¦JtNüg¡éTŽ„= ý®6æ´ƒî)ýÁìr.âvÞðe%_M`FT*¼–¬Y_ßÄy7’À5.Oéaç›S†ª/bÄÞ{º&žŠ ãtkÉGR>s4Î ŸDÎP™8HµTBO„4Ž·`juqHY#PºV7Ã~öBrq)/,j¨;rúMDbì‹T¢!×+&r’›¨’ZQ™sྙºŒYýø-O„VVÿ©Û<éú°ó^ÔÊ.s‡ºùX¸†9ñšx?é,Wjdû6½ïn¬)×=—–ûUƒ‰)CèMšXIÜ{ÄÁDï}Ѧ›ÀØ|÷Ï! £ô2*CMN•w¢x“ (ˆ,0ï'hÍäŸ? ï¯ye[Á¡…l/zÒC–~5L@‘w½<ÏŽÂkYBf–“:¦QRÚ…i€º@a•:5‹ïÒxyÌÊ¢Ô(ÁZzËÒ‰ÀÏÍF¾|›ãÒ4ôY/ä#“,&*¥£P×%pˆ‘ü×ò¢TÂFajËì–¦­­_ît€Œo.ð{ºëMÈo(UË ù±pZ×<« ïø‘@‘£ÚK…U“:GqÝzt€];«UĶçvЫßN‡.ëmû*ì„ö¨L¤ÇXåüÄ%¿ù‘ž»Ö¯ØmAJ…û»ï¿%°l=´øô¡×´šM2•–—*M­]–èƒtí$¦X´+‹v¹d7Y‚n{õõNéð°H^œ ¥—­½Béçr9_døÚ P-9Ø\1ŸB «•SŠ=ÅwïʨE«Õ7€Õx=ÌÐcº¾cþ¤§ÚúÔ f¨$âB\F+R,ü\Ô~(á:-â™& ÄÆÞÆ[’ÔÈo÷ç&çó/½m15k—u`Oª[È*“•](¦“‚À´ ʯÎ3ËkˆSê%ËdÖW=Òpâ.‰c•fñœ,ôUÇ9ås`Ò-‰ož®­‚`.l@é¾(J½Þ¢tÿÿjû ¬cO_³ÙR 9Ù@­ê•ÅòõÊÏOŽvx6Õ’1Þ-×õ®U\oß ‚*Ë1É`‚Š´AÐ"4਩6'Å9o³a‹ ACv ^€>~u'Xð¬GêÍü„rî¹Èp š5œG?¥ev˜#x“ÎKTÝQ^ztöMš/‘ùðC¿cý¶¦=Ø—¥P~tw” 9¹Ö1ËS5ÑÉÃDúÑ.ÓU0 ÜWT{”D„òXÆè¥!Œì¾´õ*Òïbdp‰ÝA#ÜqöØaÅUlvUuH'R2ŸdöŠ ô:é ´&Q|#°ÙY|+DeÕs¼ŠFË+Hæ 4ÅlË3ùÔ†$ Ÿ'¹y¥[!~—Á«Œ.¨;Ýh_ÒUP1šòÀ`P@D\Ÿ ZfÄÕ&j“ÂðÜŽW:^æÝýÍÒ¡\BqHS_–‰í‹­°zŤיH¿Œ/vÕ oàÐÌjßIžÿsžÝã×ÈÏ­½ $ÄoÑŸ@#x¢á¨Ž„2LÓ[­›äGõýGÜÓ†Óèt€ô!ÙÇ1½Ð+1;¬ï3 ÅødàôD€J£dýœj!ɾÄZWZ+±Æ ?Æ”ùÏ9µ|”¶PÝö¶iíaÎ;a“.ýÃtCÐ!ËúÎÞVkŠÖÔ9Ç݇vëpw3 ºé›ák Ÿš‘|½xQ¬ˆ"¹–)RêâȺ*òŒvPÌ Ç]#ÓB {(_Ö¦‹–²Ô—¡Æ~ ç˜sË­WU#ÑxÜ'2Ô.@ø]&·Èô«=f<~l¶ÿƒ`µéZˆ¦oéñØú,£zÿÔ;ÇK^ÏzäãCç£KÆ€&„ïã­f¨ÓÀ"²)c‹©å u 2莙èâé›b6µƒRW¹9aø¦ËÕéýȵd i. 9Ž»'=Óám…ÏM:›z‡Î• à+®ÊMQÚÄÚEh“L@ñ¾dÊ'5ÆÓëÉý&¤'8;Ð]ÚT¤SÃ֙䈬Yù¢Ðë/yå0$´tEK妲[Ò£1;peOï¾ýVu¼œ@kW8u®ì~5¾ڃ~P3ƒJi±¹uBþr@‡ëÎNý•7«ƒ5¥¢!^m¬aF8ΰW+FŒ-›O©@‹~4=çGŒ å¢Þ3X:€S‡úHP&¤ß>]zªai)ÄÓgß~[6ÂÒ ­«îØé7¾{ÑxÖ€¢‹¿B«Jž®Êœ¡Ô6*‹¢UPƒ)`O"ÞZÅ,DÎÛ ¶8§¨—•«hªìöÝ÷K²š˜¦6:½Ð¦×Ec¡ ´C~u¤ßF2ñG–`ìªXóìÿ‡÷%µ(Ó) @¡á”$Öä~á9}Í·¥u’çšóˆsx ¥ªc|Ú W<£í8*t¦ M*4ñu§˜Ì?Ç8b|ÙÖm€¼ ý*·«výnÊAÆØêÀÆÆ[R‚k~‚0â;N*Hqtf„\Õˆ9qx¯ÔðÎî5¼³ÄðÎî?¼i£›08‰gÈ%ã—óH'˜2^Ÿ9{œš’äu_h˜˜+͉W°‰Ñ½å°âÙ¹RøaÎSûµð‰“•HûnÅâ\²Ê¢:Òï W|;%.–ñg5Æ-FG½–3'‡L^”.ìՂξQÁžU ©`èlýìËB¹•.µ$ŒE¶ÿø!o¡3øcÄgq5HUGûÃ…k H3ð]?Zauåz¼ˆqy´ôÉ7òçJ¹xæíœî¬¢qkÅáv 8.߉`¼óñ°¢êNŽbEæEðÞ‘}d-Kû!XG€WU¹¤âA{VCãc«H.~qW(³›þT8ÃŒxš"Àšrì“§4VjâüP)¢3c]•“Í"ÙRÝ„‰ÄY½œÚxºìä.PY?ѤR= 0jVTG>¬ŸøÈÔTþÿšÚÛLwHV½SMÙ?.â¨"ýbFlÚDOU˜úX’‰ ÞL5CÛÊà/§BCÏ{ŒÌàÇW@©ŒÖÈJÝnSdùˆÒ­"¦«áx\µ;޳nòNP £Î,\³,,¤nIGnÊ«™¤”BVÄLr•Hæû©d¢0¤Ô–mjü b‹Öú1ñšd£Ì‚8²3+¨…Q`]¢Ç§vL¿¡¬»\c˜5šãï3š‰FëòÔ tIÒ;ƒO•Ê“•È“#“ò9zrûY:LŒ¯=yN&6õmDLš÷¦Ð· 湈§™1ÊRK˜7b+ãÒa­V.Õº!¿‡]¤\»äi•kÃ%é›|Rñ0˜­´×·á ft7¥ÜÕ•Š~ÚÒ6SÊпºÕŸTbàœàÄNÌ•aÖÄÁøÌò'gË›frÿ§ÜÄs‘ÿùúïŸñ¯W^1¨6jÅÚBqDð[õtüûïµÞƒÛ@7ÚÏ—–ð³ñâÙ‚ù‰ÿ—–^üOcñųgÏ/ çO_<}þ?â/5‘r0úó/òoN9¥øÐXß>­ÿËéÄ<î…Úy>—«×EÛ ý둇¤r«Ë=+¢dç÷‰íç0gsóç­uú¹;hǵ7ÜÑ8,¡R&éŸ;g(HB t1ßî0”bâ?]•Í(}* Œª ýZ'E¬­("™|{Ä!tG–ØÝù.\¨ƒëÈ®é’ ôǽ^Uñd¿ˆ¦Ø>ØÜ\‰² ŠÕïûaˆÜØ©wøìfã˜ÙÝYS<ã9‹›+Ñ8©ÏñÁWü šå§³Ê %û]Ù%N_Á{û–¾=W{.{7±gðozçž?¼wñÕÆþ],.½ƒ® ±pµHŸÒߥ…›D/G¡ŸÑIÄ¿¼Óÿ,WDk½»±ÆÃeîÙm£n0i’îÞ\¤À¿`ˆó¾f7ªËÄ[…dÝ(~7ÚÄr%ÎO´7¼RÍ ¯²[S%â ¯t[ð5Ùå&Z ¯BÕ|ÍnK—‰7ɺ5üžlŽó“3éYz&=kÂLz™›’£™„ï©™”ùl!Vr7¹æý²×ûŸÏ|ÿ7ž>_lÀýÿüÙRcáÙ‹gKxÿ?k<ûzÿÑû?¯—îû9 z$^·~n£šú~ pëžA|\õ!^H1Ä“Ãkô_ŸJFeüxêiÏ qŠã{'°JÃX9y_[ƒÌÐwܳXJºêÉ' ÍýÑqÚ!J ÿƒY~Hd³êI'Sp)Å¡SÖQ ŸlæÅiÐå ¹¿¼Ìý¢k!¦2úº®ÒY?{NßÛpÃuWœº× ‘R@oÙ¾n­DÏ0D3•ãý žÍ÷ÔOÀ…¥XÞ|+E”§”¹ ˆìYßv¾ÿ^ä÷¤Ë~5㤸¤!èûž6‹ùÕUu©ê0Õ°`©L@‹=P5QXOS$VŒ&+]Õ˜H.~“Ñ/Ÿíö8×$}'R–ŒF.i3 %å³{ìµò!/%°äî)Nè5Øå9ŠbJgpM8ýÅû[`É-–úA,¨)“ÑD©Aˆ¡,EœX¨ZåNñÂÄe/Ïê9¾sX˜šö+ZJá#͆“½¾Òª ³Ýo’KGÇz«W##€RYufîÚ¥ªTVz@$»+6T1" a-Ž<°t6JìØ)kó<»¶¢tÑ~ŽO•ìYµJÝÌgmQ lB°¨ºîoz^qsø=,MžP4«öK劦S²úGñr¾"¶:Ý—hÔ¾`ŒÚ37Jr«¼a“že2ncÁ°±`Óçƒm…"ŸË˜s sРë5 }͘žãèmaØv 1y£PÔÆsH*eï 5kÓÎʺ7C*æ'£©,ÜSžih©Clá4“îh(£À^2bÑc$Þ ¹¢“1z7?¤8‘[­·è3ûÝJ„z—ý©U¦,šLíf;ZnèšïØ+󲿱$z‡¬[ñh¡¸¢WˆfKM[ YW€‹Ë9–»ó>Ýã¹F_]x…Ô£Ë  à¦:ÊJÉé+'‰ßˆ#@ Î/eÖ™v`3/¶òɽ:y·š˜ù¶¼ÓžML¥:Ÿé‰2.Ø S•(M¨7uºÄ„ëüîSftdð¦-âMÜâvñŽ‚ÜÚ¦úª&I:*±"‹‰eÌU!ÏJ•KZˆ“Ðé–o(raŒõC¾ç"<ªvˆq ˜œ„F7܈œœ@ÆV‹êŒ‹ú±†™¹ˆ壦+ ò–×’«`§€'è½ï’2’U‹Kbž>4ÍÌôû÷'סý—.EuÔ…'…MJøŽHw?Ö±S÷fE!‘¦õ;‰¼RÑ`Y›ˆ-|Ë<Øï+)ÄÈéwCY«‰Í®]ŠSíîs HПp"V7w¶ÛÝŸ·>ò—íö›íNôý ÓÞ3~íw>v6^­¾Þ\›Nò åÇzZÊþÆŽ?ÃJ#+ßK¿$K¥ù7´FQLl´:AeÌ÷]øž4(ÉèÑ.ÎE1§‡ È:ÀÖôê~ױθ€Љ@w¡\>ɔɺHÂ)(5B\JÈ{ŠKìl·$ D´ÜNwu¯ÝÚÿ¸Ó}³·³½ù |Ùß;Ø^…íù|iIO÷élsÍšOŒÄT¯Kåg¹²ÓS„ëŽ& „å¹fò¢‘nÇœ( Aí+>QD“{0qE•ŠfK%H¯f‡ÉÙ@('JÜ2aì‰ ¹ÚWÞlS‡sÛ:ÀN–xc:ªqdÀ›$A… ­ìZ@q†2*zŽ-å/ðáBi£t6µ`Žôû¨V(±ƒËù™ùº7ëí·oYúršÆT&šA· ¤òDþ \Ôv ®gj[&¨)q×,/g$–0zô*¯þ&ú&¥ƒ˜y%I^…G„HÃéÂÆÛ: ”P7bþe¹ߪyZR7)©:ÑÆ\xñì€ä [ƒóÑe)÷‡|ÏBãÇÂí‰eîil~åy9ÅŽ`øøfÔÍ'P§F¾}"öÑ飄^•®ù¨³T*Ö‹’ã‹ ˆgÖEÉ®_Z¨ YœkŽßF‹A ýÜ­Híè¨Ý _§yüÿ³÷üÍiãLßßùžt¦…”Pìä&½öNËs(Þõ¹»a 8‰ß›³MZ®—÷³¿»’üÙØ@(iI§ ØÒJÚ]­v¥Ý•¡ý=%'.¿ô,Œë ]Þæ¼eWÂлœÛƒÇVñ¦«<Ð 22EµÇDÛ‡ÍU!Às.NÌÞðÕBVÉOß½ꋉtp«º5¢xskåƒ_Gÿ¥i7Ö‡x?Y.ÊFaÝ ˆ{FYÐ!¹$Ø,`8†~ÅÛ™èHøMÑ&ˆ2oÓQö¨7šè¦_a¾³/D)<ôzI¦½·ìî»\]34¶ˆïT KggÆÄä΢‰¥ÞS¶GXi8žÕÈìr¶ëG6«ü`Ís§'éÙæIXd€è‡2DÊS©ܱI´áyíŸl5Ï=D µ·÷ °©]ïmÓùÏØÕuõ ÄóQ:>"ç?§¢ËâO%±\Úÿ|ÓóÿñȰA rLv,”欅ÆV#,2©ëƽy§þFc+Ö (‘5³¢ƒ:‘æS÷Û¹K`Íê­bªŽŽ&á\±µ!ó†#uûxÃKéK‰xàoœ‰³ˆžÒ—ŸË|mO@\ª°@Àª2â¥P©àªm:‡½*ûЩ€á|Ægn©ÿ²¿•ûPÅÖðMÓ$!<á~ˆ´"¶f“hMþkX|1ÝS§csÇQB…äÖ´0X*¡ŒõŽ[žˆ´|T^|~øå¾8¯7øÌô~‘¯:þRýr`èû/JîèðÐP¨p_ u4ðzÓík… aë{D=-â“¡×k„Ë”és‹ø0éªqãܺhE©ÀúŠ…qM#FK«Ù¯V ²µú`‹•pQnŸ\‘kš7hªšã}ÐÒì¾ÓWòt·»ø›¦ëç³M•ëªN'I 7*ž{àÈÄÉSé½iCŒ e¡¡ž»Å ݲÌèF –P;Ò…â~ÀK¡UÁ¦@Ì$ ‘¬¦mjrQ5Iþ½-W{hOË9Š®ÍTŸ7v©•KÍ[V{Ö€’?äö¿¾÷ìÍì§Úoþø‹8Á±(Šå¿ ×®Ku ÓU­MžÚ¦€«¤@1æÅ‚`Þktºvï߂Ϩj >‹RÈÊ2gmÅÂ,zÃ4簾՚Ý6  `[ö„Ø[øToô«¡"+—'_…ja4}W¬äP‡ îd_È#X™ ·j¥ÓáÔ‘‹¿‹'?PuíÜàÌç8tÚL-C‹´*ZÔ/ fÍÊŠ—p5Š˜Á 7)“Ôv*ÌHqsV\ÿ¤ÉæZ’Òµêâ¦$~SGëÔQQ$dÑü[)ñíÑ9&RA&ú’L\Z”AV¢MùM­iÐGî˜B¯ÚvÏN†Ô8KÉ=kjМÕ±f™ìÐêˆ !ï{œ0"œáŠÂzNšw¬æ]¤å/ s²‘q•…¡†yœäóPž¶‚y—çK•U½Á[˜ d[fA8軎O¥×Á·]ù­j:†Þ`sÌ=_õñؤ@Ê¢Ò\¢>lÞyÁnü»Žj‰~=üFÉÆô5Û!°hpŽ8Áñ¼|ðòµ†dìqÖ%¶ê6Æ™÷l¶m¯&öÈ“.SI.4zm^“]cÊ vÞ•ŽÜíw¯ªU¹Ûõ梋1ÎÐ%¬?Û¸„Çæ‡ æ ‡76©a&Š…p¾ñœ/‰Á9ŸÄ÷x$æ} s“И®†:³DSxÙnuƒt?¿Wj7zKPÛ§™rµÕlvä‹«®\+¸Ä¦çhýÙL’~§Ñ45øÆ…t¤ÙLb:<´ÌÒ:ÚøNlo@l»HOœÒaº¤›Ô<>ÿ&’<Ü‘')Ð=l@²Ÿ öY"³ÌÇíâ*Ûn“u²uRo”Ð&" ûRÑ1O:ê0áw>‚)íHXfI|x ¹ÙUƤ)Ûº§%O¯~)·®z|Ò$àþ/[Vó[}B°1©EcYû„,kSkËS /fí”;ÌôíÂ`Q~n‘èRÿ#SO‘´Ê»~³ErËÁ÷6Íà…÷?ۦЕ;/*õñ-›ŽIœ@fÉœÀ°ŠÖÇ“-ãÔð S;æXÀÍHýö£ñF‡\<Ú.Þ ÷5v¼±€7Ñ‹7>ý^#1 Ûų/4rb§8øTn¶j•^…O`ê‚ô•1wkâØHÞ=z9ø„fªØfn7ˆƒ•8;ó<¤Ð{ }ÆuŒ/¹V†*Û3™(šõ Xaa`šú[á-2 ­ÐæúÀäŒ×<5ïT‡´E<”CO¨“oRΞ ¤.MV–{nÜ~>©8Ae«Ýëw[Õ_ûÝfíüêâßðÃNõ#<„y@ÃÈÖV0KvjšS@8°?®wéX“çðQA(yéd8óÌÔE*äb-(‰cQ®¯ñz]jó’̇SÃÍŽOªb+‡o™Ml«Æ¨O•Ýȧc±üz¾ ¥U0¸ãʲ½0¬Âœ\'–v¯8êY$WŠÛWBš_ BÜz-¹+캽QTy&½n‚ ß×&åÀ¤+}9½ nœIhM’½‰“?Ä–é'äµè7—U2Á^ó:}è4é`žSl¤Þ Éq¹O Õ§µoøØŽ7?¦GXün›/ï/tåÆŽˆÕo$öy]É‘P6|±ée Àš-ø2õ¬îÚ;= ,-ã©ü%@0Äÿ®.l}îhšäRTîZ_˜7xd›'.R.Ï(Ê¥=W¹%ø, |àObÏc’ï)h§îþÆB$ŽÖ[¿±£´k‡àfÅÒtÞú͈)w' ~ŵ%"í¢‚Õx«I²œcÍX8«å9”çŒ7ðc¢û$o)عS®i7†`sçI¹œ'eì!¼Š÷Ùо¹ÐÃô"ÃÙÇ´Üo¸»ti¹’BŸgþE"—W/­ÄecŠÎ2äF6ýühãfàMë&ãÀ¹ÓÜ‘}ào5‹ Ýý¼êbKܘ÷YÄM°Fœ-··ßôb¹Ã_iaË„‡‡l[ ˜&JÕñúbÓp}=ðüA³1vá½A’bB"×ZÀ£jPŒo¡ÄI³Š%KØ…i«Nšq/: ÿ.ä ¦¢9pãܽNÓƒ°xh¢«xÑ!×ܱhÜjJü& ,‚^ŸžÈ]üÍ0·Æ‡z-PI”Žòšð„b–6ÅüNˆ¦SÀÎ;%ìW ӓ‰ì㣠œ'o[±bcâ,¼:œ®øqÅ… ƒø_EÉ\NµÄñ}GBq¢°i¢‹nïV5ºÓ!öÞ¿]…à|Æ,«X’åд¡{CóÆÀ3i7O£0˜:ôöAÃ*¤€E¯‡^F°~çòsg«îlÕCÍòe ýäë[;ñ²/KjaOPÙ2LW×¢ŸÖ§j=ŽÆD{¹Uâ-‹fZ¡„ ;q´G;qô8öîNN­"§*ºnQDM]¥‰>Ÿ#`Æ+›ƒÞ­X<8^Ìi<+þ= ý‹åþf¸¸wç£áÕPÑñ6ë¹e\8x•—òå2Øx¯ÝÜ6G¦Ã94Ý3+ÅAqXüŒÿ205¿Vv掘aÞÂâ~^E4ú˜°RĘcq•—3ËÒu%•yæ­Zñ³&fŠÌÑ,ýìXZH°´ œi±È¬£LÑ3»¤€×è7цö;ݶð¡ó ÓÙ6[r§Óêξ¾à"ý…Po •‡È%`û•äò˜Úôͱ( Ì\k1T?åxex7Ú\(cMŸ}<áx 0·œ“UxŸ—k~˜Þ"ßÏgz\p—õ×Ò‰$s•Äåƒ!²ÇEМ±G)æÞT¤r§;Y~!žOyÔ–«ßbkl6P̹PoߟŸÁX LÑK#ïa¡U:¹˜&´‘² #¢$Jâ†Ì$ü:*eØf™Ÿ,åO–±VdTe6ªòºGµ`Ñã¥yʹέœâµü}L´LS'óäÜÔ vÿÖ¬%U$M ?í«º­‚бèÓïrŽífɳ„75V™„ O*åݬxª+O¦ã»9•}åÉîã-™èÚPsêm:­–@k4ÝæT.âøŒ>¤å³³ã“ÓŸ÷ÝØeîÈ.ñwD /Éñ²#NzdÌ;b¹(KIEé¨(•K!ÆX ·Á­@„‹ÔO€KÐ4ü?†ÿ'@ “› åBHÄ'FLø<þ%÷uÒ(þçìQ0’?½áÿð`¬Øwn:Ðd+÷ªÛ^€ ~;Ï´üœ\Ϲí<f°éôõn//¼yÃyê­2#,–9óZvÛK)àO6'àmT$ûŸâFwAéýYÒÃn_w9(´%/Xðsv†òÑ•…kýòñä ­Vˆš{¿²ê~„Gö—Ü5®vÉ«Â?{õóMŸ”XæÐ'%eyôYs°_Ä2ÚÅ´ì‹wÎÚgmôôƒ"(½sÍ™a¢û‘†iö0µ:hœx3´‚3IaÊ bŒÈŽš5¦Hæ?t4'ªE³å«|·Ì™` Ÿá‹@myÁ´ã*Ô‘M+“—XYý2Q‡ôRH"¸à5½©µÙ»*ËmTææU°ÿ %þò.'7ÉkPC|yÃ`à·—/ݼX>  j<Ϲ@¡â¡ þÅ$nï,Gly":äj¤iù4KC¢“U¶õàðmpA wÅÓçl«ÄSÀ™¾ïß¿z„×÷d-~òäÊÂ@kÂXÂ3rñ‰¦¹­$ݧB™ª‚õ0Ñ•@ÂËÌoÃÐæ.Sqo­gw ³4}&0C„°!£HÈÏ$Ë­ÇÜž3ÿ ¬ÊÀA,è:Ì ]!ç C@Ì“™0aºŸMë0 ³ÊÆSt€7Î#vÇ$„žîàGcªëÇZG0<‰}Å]~@ü#›È?Jzã |Ø‚L˜Ú’ÈMþÀL²=òÍ Wë*²1¶úªa_HÞά£UsêØ[™c¦ª¢uo·yéCˆ¥ðJ@IÂó;ÛÍ(•fUn4¸9¯‚¥K\Ь.6( €=k¡ì R±eTsïx. A![üvÓ”Žˆ 2PÞ£ÑS¹•eeÖˆ›6ïTû{>kÂkt‰ª lSŸnve^%Ÿ ‚ÐÃã !ºôºÛ™Sàë£å|D e~À‹&X¯üo©OŽÙEëì“yǺC>¬ªŸ,áÑ;_Íõ¨=*” Ǽ#ˆªYØý?JÍé)‹œkÃGHED(ûŸØe>Ÿ®ß¶¸¶¶E¿mŸ)’š–ÖÖ´ä7M€¶–áî>t—nBã&HnsŠË,§–c ×–9(P‡³Y¤¥$Ø£`-Á…OŒHÈÅô’èõ(8KI¯GAZ:z= ›&ÐËWò¹«æn±Û-v»Ån ;tMá‰ÐR‚Ý‘mƒdã.y;ªm-Õ`áÛ«7»½J³W¯ôä>Y«•® K!H‚OÂÉ5Õ.Ñ °Ø‡À Ù»Â>ÁÊ+wj?²³’ó¶¨é¹0Ž"˜uh1Pb^¯æÉ£ôô„u•,@™ñoÉ@In²7¹è~³‡ï¸Þ1ã0cÌ}”;Úlm¢76Y¢ô,0H&¦å\‚4áÙ™;š|[šð­ÿU‡*ÄdÀc'{¢ U‘9÷Ϩö~Úýdù"ÖÅ¢(K¯­¯H”ÓMñ¶¨ëi£OÊeü+ž—‚ñ§,I¥ŸDéôTKðû§’(œžü$<)D²ÁxŸÈÏ«!@ï¢ ¼S gSGÔ§/§–ZT†Â`&(SǼU•‘jAÙƒW{{`¤^k†ŠñKÄËÝO4]ň· ÊK[(¶6ª/_Š¢`Ï Gù‚5ŸM‰GåûÊG¹_ýýwQ$°j–c "œ™Sšc!ÿ2Ò¯‡Fñö­@{  @1 «Ö¸¨6ûïC‘ãÌ&ª½`½Ùë}jËÝ40iäà"ˆ—òe«ó) Ên½ÕŒ1TtªR€eØè4‰D–+†ƒÌ¬)¦qˆFŠ5bƒÇ|t8©`ùžÙŽ:µÊäo~ƒuôŸV½Y9oÈ §e¥Ù­ ÕØæbµÿÃ`vêû·×ÿÉüt¨šSWÿ/Ÿœ–މþ/•¥Ó£’úžîôÿMü<ÓŒ¡>©Â¾Göâí> ¥ËÉL@.Ð]û‡&¹Ð0šVŸ”! PÎ}ÖŒ‘ùý©¦l –òc¥ž1ë€bɵ~³Õ¬7ë=ÁÍuÙÃoõJ£þ_¹¶÷ ³û.¨Ã²:x¿á áë^x›\ƒŽ§Ã)çh“Pÿ ßI4ÚKÇÑ÷¡ŽrùüÂürÁjô=j„·_i42·z=ÔUŘNr€óÀÃÒ•áæ'©ÒFVÆØ¦z^«wqmªõëIPAœ¥½kÞz­ZëL˜˜ºLr­+7¨¨ÝL16—°yòå9Îêç•Ú‡+¹ó)¹Ñ?Yʯ6ÐxìqQÐæWGO–Ç·ynmåd%"Ûà“(å—D#ÍåÀòøѹ š  Ÿ³z!Â4圲ྜ†ûû.>¨#^‹æÕœÃHLºQ›DJ?ÄdÅE*)Xr¡‹F傫¿'íNý²ÒùÄêÿòb™®EH t†¸:½ú¥Üºê]ê‘m¨[¥S—ýâ^™ÅËqÅ›µVÏ/>MúhBãØ*Wµv­=¿Oõp;)TË6Ñݯùyúƒ)&àêcP9c¡t[Õ_ûÝfíüê" ŒeU»W3ÂêT?a©#ÞØÿ`-éçX²à)i»û_ËÌ¡&@è–÷,ÇøN3H¨¼p“ÌM¹på7¨>\œÎœ HôV¢Q÷üÖ,G¢º¥ÒQ©<_Zä•&eKÇùXäÈ41ƒŒD¯C Ñ–#é"#sß{#£¥#b%`DÆ=‚yJZ:_Tä•BeçSk]VêM0ºiÞM'vÎ ¾r£ÕúõªÝ{M¬üÜ«ÉK?70«OsÛ—‘˜/Gcz"eè âÄíäæÀ㤨Ä£ÒÒ™%6vÉÏÇ,ùYüš¦£Òde†é`&4Ò‡C[u²áv­©`‘Ðle|$äÔâM‘Öe³óÑñ…P ‡ ɇïøòׂ2ýYÒƒÞ-ǾrKZÄý‚•Ã/¼RD’»¥È^)W€»ÝïÜv‡á²î÷HYÑk” –y£gM!9.ÌæWÁùææ„— wîEÌðÉô`€|”  æ"&_¢o¥àë´ÄdHâbHLüpÁ¸ïæ³¥„Ò†ÛÉYÅm)…>y!ÅëSL‘Šä—å ™„t”Òq8eÚì’\AJEŒ5„§]“– žÆ*ÔTËK—H³z #S’ô`øPTã^³L A’qd/–¤“%ó,þ?{OþÞ6nl­þ ~ªK^Y¶äk#×i´²’øÕ×'É{¦KS´Íg‰Ô’”¤Þ¿ýÍà¥ËGš×d¿•Ib ƒÁ`ÌDn'ÍÐÓ$'EŽ&£~ÏTq5íACKGŸÛGÒ{ãL:n¢kž\Ñ[©¢Ñ~Óg¿é³ßôÙ¯^ŸÍõß/&éÓ"}º:¼û297>–YÞ.¶s§¬á”?N\ÀŒØì÷avZ𥏥jh20õ(Ì7îØ«æc;íE×JLÿ¦â)ChUp@£ýÍÆúÖúvc}gýûÆúëÚz£V«ÕµÚf£¶UÛ®O ÅLyY! ¢5µ¤ÙE9ü\[¡sÂ{M\b©ž¡óù¶®À=L\”å-Çršºo©×a±ø;~½<§£ðIôÈZf.UC÷âöí:«:žuc9šq€ö§Ô'¢¯ix‹µZHŽå,5úa>M\9ºReVsmz¨©¦[:(m¾å4î+£FÃàynŒže-ͳ¨Bæ ·Ô³=ǘ)ßôœ7L°0gx€LôgÛ¹‰úqÌ¥·¦›Z©xxÒjò„ŽNµð´FÕÆ)% Ÿp7õRQLÓ'ÇäƒKõ¾…gxH;nlÃã{üËî€ðÕpüF½X^Äh?o Z̸Vü¤ȓ÷ë/¼TMè/©è“‰U—0¢¤™XSÊ-tÑ…Â1\"¶L îY¾Ò‹8éR—èöhSq•PÙÑK63Ûþ­¶-}Ñf8¥ß-úݦßá©¶ ë5¥ô{N¿&ýöé×¢ß Š2Æ+ÝÒÛ Ò„`9¬oݨn®úãáð¾ãú’u…>òŽÃ4ø™Âºe¿Ùkf©1¡tŠb•.¦!Úw÷Ÿ>Ýk»Úàöú)ŠšÖ7ŠåyÈð£áÙ†ø3lIæF{<¤F¸«=R»ä°œ¯«5üïQ…¼®?¾z}ó) ÙR ™¹c>G’n<½â<=Z*Æç ƒ¤®m®k©Z3Oí8³ŸuÛ:Ìîh@áÝuqŒÂUvÙgžÜS¨«ÇœòfÙH ”ørÄÉq&Ãv§À¶LŸÏ5ù0 îÑtIGyÏíÍqŒðT§çºtÊ“¯˜ g¡ÖÐI¶`9cô…ªÚÎøN9®\-D%áé/qTT‰“d;ÐÍC> æÃ 9C%ѪˆUw,Ív´‘á¶9Bö-PƇ¶c50Y[…U(Æ/kð™gzÖ¤‘ÀƒŽ–– HçUåú5Ɔk¦#ÙH¼kÌGO1Óþqÿœ»ÁïiÅ‹óbYä:Dƒ펑о;@?"E¢#øñq½>˜GñÆrL>|p*ÏY[˜QÒ—ü8 úñU:äìÂ0¸Å®¡u¸íc³ú’N¤ëŸG+rMÓ2ž?²Lû¶ú’g Âg,e)o,Od R’ 3+:š¶úFöY yj`qåZQÑ:¦±Ž÷’xÈnà»HÜ‹ 2kV`®qö*‚DU+T$ŸTÂ>«ÄЈÊq|ÿÖÌ«°$.!….&'Cø7f@ÔÞ> VêÄ áS´Zi›ð¸Iþ67ÊXŒW©¤€1Z®@‡’)¨E¼´G¢ës1I.ÔšI°«!%?:żå\14 XêfÔ‰Ù˜KBϺ"TŠðpûP‰°Ã&ûˆ•YÝÖ I„ àXa&ÊÝ`6AXÐÿ¤Ý×37¶€\@Óн%Éýt3ŠÃ{‰V3¼ç® ´8pŸ¤õ‚³ÄÔ5˜FÙ4|£f06°ð÷V€ ÀîÇüØ"!7s‚8$T³âøI˜Š¨jò€œ­¥i%âr*äRÌô>akµ9¿ÎØYq§·qæÄRä.ïD³Ðüþ•¹b ?—kìŸ\ï:*èØ%×'ïöýÐ?ð³ºÎŽáåaWŒè¤‡ÝIÛÔÂR÷ÁðÅjJXdfÔRUå­ÒÛ‹n¾flèqqe_Žw%)G<¤«÷¨?Žf G ±…ÒÚvD¸JFFÜèrAPxvŸnêˆs1Ñ”_}Âm‰…GÿzEiwžOì™rS³–A*)+ÚÄî3é¹Ù551ê< Oœš5enÖ䌫Í0Ïjy3mnFV!´sÛéOË2±m-®/Ì1?¿’uˆ<‹ãêÏ3I¿à¬›±Î3'*呚s«¢œ£xnÇn!}øéÕДÄ×Ðàú”îÃ:Öi£!мÊÃ!BMšSÁ¤ÙJZ˜}%ÿŸ1ïÅtî}v…ÛS3èÌ,&W‹áòeOJá9˜«{c>Š·þëäâ“s–ˆ.Žv´A9Ñ K±`+ÑÁdÛ1LÔÜíóU•áKŒk+ Ö M>  Ç WÚú*¬H†‘ïz)L6Y°¦WMT󊆗YÃýï?UBî 9·77Ë»˜oäÙ7F`5âk‹›] !1#›³€œ~쪊1y•>Ñ)W 5—Òb¢,Ôò3'òû2Q¡Åã˜×le[Ð&œ‘–ÇÂvò%¨™E¢¸õ-›HÕ‰=·•¿Auñ$ÕœZËc9d^å%‹C"Ëë"Ü©rOyâ±ô÷cÉ;çüEÝÐj½qC%æEh›Òßøl‡åܼ˜7u…Ì(ͧűWÉ…•¸ _½—8‹œm³á´gÒãæê±aG{™^›×ºÝŒ8‘G»ŸÊ²§˜-Ÿ¬Ë%–Ù.S_ha8D¯sZêjF]ÛÕ´ÝÝIrBlæEòåù¶¶ÈMí#mg !¾â.ô>ÔÀUÍÄŸúÖXíÙvÀžß®B~Äú3  ùææÇÎÿŽky c‘Ôåæ_: }1vLžup7ýÀ@WZГ7Ö.‚Ük€ÜxH§ƒñ óÀîî5>ÃŒSžíŒÐC ^õ]y,‹9·èô-:ÅÅc1wÌ«ƒûÕð³È x©-ç–‰†§8æ• ²ÉÀ•³fŸrë.⽕-d¦• îƒîl•“+£^>2{4àqôTGW –þtì_8ÁF==Ê”RÅ)ãÝXžÚölyÒ÷íàˆH·_î¤Ñ^ ?Rv”£2Ækq4'7äƒá$F½ónŸ?b“Ž7è¨ÂŠ€ÕKb$V¬^y0þúBÕÏW¢ Ú¨¨îÆöH×üC­7‘–-!ŠðK3ÔÄ6 –@R~RÉ$v £Žèt¢ˆ÷ýÒé,Ü#Ì4A0ÄRÛË%Èœ¢;*­—0KØ3ó 0c}ézÔ. çê ©™‹ÊS’‹zRvÝ$2ÈfÏÜ+i#:êF… ‰z%Þs`0ÒS1 ŠD2 c*æÙIÿ¦Pk><%X šu馚r¥‚ òø¡m² ïwMh¦—ú1Ó”e-'M‡EÜ|½—×Ôy•¾3ù™Š‰GøØŸÛcÿ¹QE?~ñ< ¼%¨çÅ”Ž˜ODµwäŽJ[h̪6ºWZpdñ:ai’Ûá4ƒ»àQ“JÌ:ˆ%&™þè.·½˜4CsñïJVæÙÔÚál, —ð÷±ã\¢£Ï6è»ÞM¾èôéPe×n»œzkÙ—W 9çÌ(,0¼K+Ÿ#|ï&"’í"‘l^¸l½Ä1*€T¼\Q…ÿpá‹j“/¢¶0 ëJXÔ™¢°käSØ5æ¥p°ÏàI¥${È·<Û¬ ¬3ç•| ¼{~´îF¶'pÚŽ=óûÈ5d1.¸Ò’k1~÷øU`Âè%þ‹PŒÀñ}\ðü 32Vz‰ÿ”@M/Iµ|óÜúÙ ¿FÄ _%æÑ;¢-ß¾òUb›ä‘cc”š#”)ŒSçã±içüU˜¦Š°?à©`¸¿i›Öt@ϺÌ7¦…·µrÙÌ1ä†B[Bÿ$¨¨Œš¢—Ø©qE¢LL‡Äbˆòþ¥!ø5BiÂN”ÉŒbò«Ä4ŇŒnús„t’±ø¶ 1"Æ!={á…-Èʞ˕”Vb&ÈË|6îÈÙt¬‹Eчî=ÒF`›ºiøÁߤ­âMIf¬„>jê[OWõÓö6o†Ú½•$Ö¿Û}½´Ná t¹ïåQPÂÐÖ¡˜ÖPL8>àÛÍ %Fº 63æÌtnh3æöúø÷gι73æŸÒ™?ÍL³ ¼™ñ63r›³·% |ФX ¡‡tAÌ—þÊX°/ö^ª¹sP$ÎÅœ…ŒJ>ذ!» ‹: c)“C0Èž?¢ìjQ Ì'%«böe=JëõÌ5fŽô{£ÌòÁXJ»™áIdÍ ‡çÂÌCòÜÆWÿ1<ÿÁÑŸ;þãúÎÆÆVâüÇæúÎηó_0þcôY9 ;q‘š"'ü"ÊG,§"öZåPN#ÅrtM*)ü©Êé—\n–«±)•_a^dݳSÂë6¶{¦º_¯JÚ(Ï”õöö¶ªzoYÉigÔ¼2\?8NaVW+»]V~žåZKEþaÈ‚ïã¨o¨¨·>4Oº´ÊnüŒ#Ÿ‡ÀñÅzƒP09H#ƒx“'× ƒU(Æðq³)\jg8Ó~ÈžÍÉ‚“K.Çxߤ=x§ë¿Ù‡ClÓ¿›éßx["«lŸŠ˜"Ĺ­¶ýß,¿gÓÔjÿò»öŒh3_e¹¦‘ã ‰åÚ3ŠåÚz>UæôóñYÅóËÜ‹ùoù—aÿAx£j _âþÏz}g§ö§Z}§V[ßÙªmÖèþÏú7ûÏËØ´Ÿ`Ucá‹ tj‡gæ 雜ÍÔŽe¡úÜ2±OÎB…z|¾âWÃëÏZÆkš—™ôÏ´)¤Zhž2¦ß!ªK%•^å¨:@L¢Y^“855B[¤Z?ÿ•üF^*ö>tÚÍ}½E)å´.ë/cÜØ}ôæ‚vOÎ:­v·B/ k»Ó¥{2ïÎ~ýU$j|/Ì/H¼Ô"Y™îŠ 7d¼úDÞø«þU¡à¸H¼Pö¾Ó<Šâk}Ç‚LÑeÍØc šeñ*-G÷›ûûLE}_ôLÖNx„lV^ƒ43sš$ÛáÁL4` ¾¹†Åã #Ð¥Æ%ñ!Ï»úçãP^Ó!'1bбÆUÀÅ”Ž2Ó®{ámëd£>üØî4ß·õÎÙa»ûVmŒdî¥RR¤”C²öçNc§æ·¾P úÀˆÑVa+ß3×xØ+UM3–'äâ½i,{ ~žÌÁ ~.HŒSHFÕ’£")ó¼’É´1•ÑRŽ $SN`¾BAð~¬¸ý³£Ó°8 0SiH‹ÇÂ(Ì0ÿÛÎ ÌÿµÍúöæ6Îÿ l­ïl×iþßø6ÿ¿Ðü¯t·vi9 ŠD4wXºC<̱ő8Õ§ò·ìÏrìY:݃|‹Ò±åŽî=<ô©•Ze­öúõæjzY{çY–Öu/‚[¼¦ùÎ;}Š!SÁ+ÁUÌÙ»²ý:6\¾ÈE×9s ‚ð¨$ÎÀÚØŠ^Óôq®¥ 0€N_k®§õm<ÚÒÐÉÃ_´[;¸Â˜0ø£Wݾ}a‹ ’Íða’G·ê(³/X¬Û0ÿÃÓÈc§%ý¨ 0‘^zÆS£zúÒû•;÷Wíªƒ©™/š^ŒˆN?ô>œœõ´æñ/ÚOÍN§yÜû¥‚M wx›šÛˆ¾·»u(ƒ´„µ‡£F„Ry†Ãñ{ŽÚÖ(±ùÃÁáAïlô»ƒÞq»ÛÕÞt´&ä?mvz­³ÃfG;=뜞tÛи·ÝvOGÍ º¹ðãi³÷äÍ[º}Ûƒùi¨ë¶¯_:c˜fOû¬},PP;šöV?iËK%Ì~Øþ±}X^¦ÎtFÓè¼Ö.½Xƒ0‹#³èNº½D²šåçÀ8Ï –—µW¯ÔÄÖYc~Y Ñ¥pº°ñï5[§{cÇY]G’ ¯Ðb5 (`ié³8ÔÌi«Øù…)ìïemw7|[)k–yåjÅI…7¢«òtˆ ßé&s1,'tOÂ5 mšœÂe9 TÔÞ¼ªïªeXwÀ•5Ÿå&?]äÜcÏqùÝ7‹°¥“˜{KKHtŽ/»}©”à‰rŒæé”ìJ7‚†å«”\ùøñ·ÚÇ?ÿˆµáÜßûøQmT¢ª< æ…¶üWÿ£³¬•Âãäü·†×¿‹þÚÒÒ¹ÿÿ†?þ@•kk—Å…‘Š™j½¶Gº£5"ˆ‚‘x†=Zj%Fú³ä·Áejðµ¨"R«®,-­­AÍ”íAÔI›/‘6KKñæîj}W²9H—ˆËÞƒ¼„ò9-ºl°»ñ~µ„=°·òïÕÕ•r”C%üêÊA9Ùêå{Qm€€’2ü}%3K¼Ø“4ÌÉÄbO²Š=I;Hà &;È*v »ú[¿½?üg9¿ßþ§—›qUn,-ņ7à#Ç*¤{–qQ†{á'Á"óD$éúÞ=È#øZŠU³ç슞'²Êå¨kË]º¸ J•s=C9£ëK´ÂN„{0P?ÿÚý g練n„½Û†¹´Ù;锋8ÎÌ~A˜tÿJÇèŸYù ¦¶:Ô@_V!Å9X…ê¶:§½, ƒãn¯yx¨óÚ˜ ä'D¢\ €¸èƒÒ„£‡_uö"~|Ò9jê"+€6 §vüfêØ‘çì8™+ñóÅ?¡]¨¯ãàXÈ—oéÃÛ…R>ãûÛ”¥a©Ôþ¹Ýþ¹WŽ›ò-Q¹F‹¾ˆeVø¡àUC«ÓÑ&Ñ.pG:+Eå5Ã$ËPu¸I#^õá¦Þ·F~ œLUkÆNØê¿QMÚP ×?OÎø3gÀmFiz˜z‡àÃhåºôñµV›œe\¡‹à @0®×L‚„;­‰0þøÒð&BHkÛ$˜?Üsßv"JÄAÂ5NÕ0y܇‹ž°3:·Læ™ãwïÏ€×÷Û§íãýöqëíT„FÄ6åÂþ0ëäèèä˜Ê“u+ë­<¬¸°4^e–R4 dFо·ÛÍãÿcï]#Kª‚áôûL‹|ˆ€ ¨w{Â&Iwú‘d2Éd6™¤g&l& éÌîìÎÌfúq;}7Ý}{ûÞÎcw>DPDñòPXÞ‹ø" ¾ADy‚‚º*ïAPÐÿ<ªêÖ}t'óXïßM×­:çTÕ©ªS§ªNZ?¾°H; ŒŸbBò«\,Ó}Ôí œ1<Žà +MÛ)"cM!ƒ ¼Ì¥ÂÉüâb"¢Ïë1Q>%©ñšLðÚI‹•äßýê oŠ%|ÛXM{(È%=~ùØóskúÄ&½Ý°º‹§ˆHJÄfO­ß¼^wUßÙ‚õŒáF¢ˆpò|þøìéÅ5?X·´’>¦àz±ˆõm€«'ãýÕ±IoMT/ ®ªHJÄ4áªØ.ã¸àvé³ Â*#ä/ž&Qæ¦ú‘ŽÃ8DV;h¢xDµ]¶L0^ƒÔ‡èizfY_ Èë` ”€žµ´ž½maƒfÑ7a»M˜Ež0g¼OÊ@.,Í-žžÏóÙqj†w°Úå™èT¨÷Td ‘†0y†uín ·Ce¯ŠñRüIVAƒ9µ ŸçÍ!U(KAüúÊ” U›Æž.NµdOWŸœª>ä‘ïâšž]Q8wyƒP,U øËª…^5Qµ ÂB½æž› ôˆ'‡{$ø:! uB€¡.27·8/[)¶I6we‚lΓcÁš+žt—^‚7¢¨² /‚ü¨((AR€K@>Ä%€b>9ãëÓgÎì¿S«6ìá®IvìØþl¯á £un½.רwGV‡[ ªµÐ™3Á6„˜€ˆ„åPl?ÙÑ¡ºôùmŸ¶÷ÑåU©Uužâ""™ê÷”Gˆm²ãë‡ô6 °bµ Zø”-.` ö¾=YÓ®C±‰»¶ëb o5«¶ÿ$ ˜{ze~v · /“©•Ú¾n^lÚ—–â¬MîR% ¹™$‚ɤØÄIGa–ÝAúFöè úAúâ†YY§™–¸!­pÚÖì„ ûðFꣅ•„ÜjHYx˜Œq¨ý:.›6ÍmÜÙH:&,6èŒ\8%æ£qTåVwy`e=ѵ?ú²ñe.ýýP>«óÃ&xÜÙôT.Óò›ˆ#³^$6Df|‘Ø„9êE66$ú˜ íŒ^ 6:ÄÈÝfb«UtkëÅÊëŽévpŽœNN§/ðüªº¾<ïp.¦à¦üT°¿òäÒòæoäÀôQUDû[ÞñùÅÛûûµŒG.^Ôð ÀuÓÊ–wù´GÒÅœ™jÒÄrÞžj² òð­QÜœÑ4E6í”YP“l «€}±bäìùÔY(ÿ¹sCÏœƒ7ŒgB¤Qz! Œ<ŽLI"j¬ qF§Lb\ªMáŠ$¦öÎÓðåKõæ619§âƈ‘:72r½ƒøodÊp†Ï blbäìí#ç‡úû‡Ïe†19ÿɹ$ôÙx*޳\<ÃOÆõ÷g1Nûˆ£Bן™ò¤õàÁƒM(k­µiÂ36¹[Ì;¬‘„YU擞òçKe¹$ðâ¥ùÓ%ŒxÖ£Lê¿gRYÊ´¯C ‹-ê’ “‡ùPO6F¸÷y]*q¶¹tþì²}~¤{9ï§Œwo=ÖÌŸ?ëzeÞ5KJT%)EiËuÊ¢·ZD<ñ›ôƒû­[—¡*./Cx(x~-k ¿°t´B£ƒm’܇SŸZ†2K_°j±8Øp6ÌGfFœR& hôÔ?3 ‚ à@ðÆa¡‡F—BJ sKä„N&C˜Z)<È—©‚Yp,©›h Å·5%¸7%Ã’Fše! MÃŒ¯ AO‹RÉïsÍs͸,ç^Þ8 EœðVO/Åïßq.¸náõ*Uh|ÂM3C 'JBþ±)Ñ=†ŠÓ) Æ{áâÀðf“˜ £’PïïïÉN„»,9Û°²—ý¢ ²m•Ò$@0ÜTzލI|’›F«ó~º j÷ð7L—.²Ÿ>¢¤’Äá¡ægù%/è “x€IW WMv±ÚÁ=5´Îu-·n²DBfÒ')]bE€Š±aÜ€÷Ò§j ´¥F¦G6¦ZS;6ÈJ>6HIBÝ ½ 0 v½Ø¶#“6pú/_™h Vggç†Û.ª[î E7 ÈU®¸¤ZxÇ<ž4ãÈMy*ÆäV– gŒl:=ÁwÚæ|:˜.O¤ 㻽 jÞÝ0,¼±PÚÅ«ÅRå%¬H;޼5w¦°ÀwèGVÆA3žÀ†¶Ü½-2“œÚº©VVb˜D¥zÈD+]ƒÕí0æùQ{v%LuánASK¥mm‘7PA†Ý\ç¸u†gÍ;™¤Õx’õœxhP&ùMÖ`vJ’ý¾æ”uLYç…Cm&«ü6¤‚§ØuÇ'¤˜Šn¶é2ˆ‰·aÅÅBžT…Q­Òê€ÿs4Ã9b浘¼`Ыh¼oCߪŠ[¿_€Tz¯Ï@š@(ó»©4×U‡ Ìu\•!Ç MA(æwÌrG+t“ºÝ2ÛIq¡´Â ÁÍ9{Š÷hÖóK7/¬./Ê/­Á¼V…¾¶Ë=NtG ÄâCÛù:©¬åv»Øjaw­ƒ®ÕëÈ,ﮦS†%)´ì #@Í!»l‘.²¸|b]œ8­B «@Á­íµâèÐ ÌEç!¬Õ6©Ë°Hö:jbªÿÉ„À>‰4÷PÑ ÖÛ)SDx=­v¦ÐºÝvÅÃÑÀˆ÷ÏÄ¡Qú¢a á® Ù* ± ‘A0µ#×Ý´Ñ1Õ§¶MZ F— HÛ'}’>o’íp¶i6mìÀêWv¼|¬ÈÎÉDý"îxžºi~au}%áO‡$RúûoœÂô-V(vUn²R¹F¸êÚE!Zyú€¦DÁqÅoof$N±¢*Ž;M I@ŸÂ¾<=Ð?3ÀõÖŠAwæ ³Çóë'gWç×ó««Ë«yñˆ¹-h»Ò+MŸ×J]àiap×M!pSÏŸ]XÛœ†lxjv¾>u÷h µUW2pÁ&,„øÂ‚¢˜ÐÊ µ›Ò:‰W\Ú‘ _y­ÛI«§fÖëÞÚÁ6ðÞ“\Ç:þ…¬ÊtÏÄ:…‡Å„ ³-7¨ù¥m6ì-èïƒVÊL 8omÑ´²¾;M;ç9$Lc§ö0ÑzàŠ™T ˜…ñdu1«#Ï/€Ö@?nõ8ò°¤f7qêåZ¸P‡é¨mUè’*Ë=š|éò2H§J¾b ŽÂ æƒbŸµDŸŽÝ0a*FŸù4±ÓS[v} £øì%Îl'B“X¡iPhq™e¡¿tÚà“öÑjÛPèó—o¶Íí¶åЧaNµjí$aåp‹àÒ‚iźc´S}º éI’wIžrjT-†e* \±Ê/æ}Ó݆Ø%æf 㹪…<°áý¼†b¼ýJ:zÑvHA×:‡@•jà‚ˆ€§¯ ±ÕüÜÉüÜM”›rOÀyÓý„õÂé…µƒè1!%wïKKQ]ÓãAÈ^©ÏÄVg— €ñš‰xN)à "=ép„ôªCKŠÂ|ãð¡o ÌÄ´ºª:KÎ:]‹giFÿæTÖ^ešr×aÔ-ƒ¸zœå§áÅDy½ì®óü/Ã2–¹*Ã*–çõ!ã5Yì‹®…ÄÔ„©Þ'§îƒ› ëÛ•éZÃÜÙÁiW¤ÒÇŒ°nËX΃-–> ^Ýi÷¬)=9+ÆÅœâÐ {1м°WƒbÝ*:*–?eZ¹ÕñRàCÆÛ‚­ A/¨Øm/…¿Eª,‹jQÏÆŒr\Û¶]-^|Bš-[žC³eÉ ÍÄp•°ÎÚ*YË{Ÿì«ÁóÑ@žTÕ½/‘"*.Ã"Öö€m éUZû„4·Q…Á™˜Ï/ÈŒ÷…)¤Hs4g4o-¿fbÊoÈ ‡(Æó2ã}A ªo2Kõ!âñš¼/MFÌÄp“81›ð³Þ¢(ÎÄl¨˜¯R¾ˆ™X«R ‚Õ8²]¢=|0DT `8’¨C4Û¦^ís&æxÃÀ‘〭µuÌLÌ“2Rº€ŠKƪ¯™˜p"£ú’þ=SRLë–Á8 JÐ÷Ë>¿ÜÓe^ì§¹=æj>Y×ãËe>Éðߌ‡Ø>4µB³„´FDó¨Ùçyàë“øúôÂiÇ Ý3’,ä’êe  S†½iÄd`²ëÉ®©S öõM%ÚäF¯†| ^3ˆzª£°”Ÿ–Ç÷n’…!’Šuª˜Ì¼h2FÿŒhX¿†„W‚kD Ì7‰z޾b9‹õäödW`ÒÕØzamvítÁïn »H—‚ãàæ«~±.¤'nƒ´çØÀâ$b>'gŠRÐQZ/RŒžð‚RMMÄ¢‰¥”œDµ¸ÑJÖ2ÐM¥Õ4ÕÅ‹âþG×änÒU!ÄdH5áóÑî£&X€Ëìpj"ˆÌ½[›±¾ÁÒ‚[޵ ´J°Œ®Ý)×ð¾½w┬UÚ“±¾$ƒÊ"h|b(Ög4uq¼[CQžÙâ^3E{n뛑÷r#Ry$CÏf‘·Òð®ŸwMky'MÝR§ Ýò ¿àwıױã‘=áÅ4¸KvÈv¡O»…¥‰ó¡(OXyénL½$äODä%ï•Ð&·ü¥× @´ßé Ø5¤&¶m®EÚ8ºfÔh/ðÚQÃÍ®kG gÙkF­é\;ZrCóZÄmÐkL³±s­)ò¦ëµ&zÍ[ç~($î _k’í­kM÷¡¯-ÉkFîj ©ýäk@GÛ'¿VÔ®–P´_ë•úÕS »“P¥Ê){2FQÕ¢ãÂBunŽ3ñô>Ô9Øø9a$O­á*=yjþ[ÿŽ^–ýC©µ–MO(Ø´+s¤'墛oOl%ÂT|+v˜Õ㳋_ù G öþJׄ áõ~ºiLîØìÜM…ÅÙÂÉ™}ÐçòL«‚‘·Ha\GªÛJ'"h÷.ï ûuį5>RC•î¸ßšê J¿„Œ»ð@Û]‹¶‹b,6f}?ÃNù‹ýö ¼úµm=|ðè¿oóéüö¾°˜8»½ç2¹‡ùÄ~Úûr=%_žïé½OG™xì×›6õÏnÌéÒk£Á½ŽÜ•Üyö6Гé´ýÍ·EÕ¡×À…«h¨.ã¦{Eö±`ºÒÑÕ»æràuãáwÔpüÎß¾¾ëö<ÓävTß)Ò*hëuÙÒ*Š9=¤UÜ/­"ÉùZ¸;Ó»·ð•6Ti]‘}lÄ\¹´êUs]ZEñðiõ-ß¾¾ì;îí­ãAç‹E&¶«F ¢Oýý00DED¨× ÝXla~ÒˆðÔ.MŒºyzOLM«Dæþ~öèCÿé“þE›JôªÎ_±˜ˆ›”/ ÏY# €îÇvè\Mù§/´¶+4û½%§fUùP^{NM(÷ÙUhìþþ!Ypy×rJ¾£ÝgèV  ›Uø®ïï' 4ÈrGØ x>ÇÐkÐæ@ø&z”uBô¾èЊèÙÈ@!fâŠÑÒ2R•õªé(³+ò¾ª+s›–e£²³|+_A»î§ù´›Ó[L6’ìÎæd­ç‚µöGÌEÔZõÛØ ª”ìiA“/Ÿ‰vC¦@`ÑÆa2}ùc$-R8¼@kbNñ?"0)HñsW}Ò¯³ã‹×+MO€¸*É;Em)Ê«®þ ùûÉd.*¢(žmš^$ýJ«!82yñ‚“Z4õßg‰ÓûÙˆ>á†Ísô.ÍgÏž;7B~¸nœä`ÂpüþÈâ†f ëo~ÊÚ3 ÔŒO©óG¾NÑ×õq ÝÂ6®Ñ'ˆÐx•&GXFŒ<²B:z4l©·Š&êi”ª¶£÷,@0SŸ3N¬òOáÖSð—.dÓà ´4>¬"‚VSÿjÙú—ÈÝoÒcÈì´bâ[ÀcàÈ5ð¹®4œšÝ©W ³)ž8!ÇqιjÛhV?e[lüBÏŸÂg¶1@Àiáq¢ÙÏ0z¿´Ýã0òv%ðÑù×1tÊL·¾ÚfÙj™ä0lÛF7²ä3 Ÿ:qm£¸e[éˆKx:cÝÉf<CÚHqR™vAkήw p‡ä€±È7i¼ PmÚíÊ:.så…4Å ï±¾‹ç@ƒÑÙ´]ò¯Ö.Úh¢ +r²†.›äsŒKLfØtIgz€Ü|‰Ì}>µŒ‹2¬_BHò¨!}`'˜FI£çIºÈD”k.Â×wõͯ~7c,Ú)Ÿu{ÓL¨÷>h e<ŸöìÑ>#½ÝôµÍнÞË ™šÇä?• -òZ ¤}qx›Cjiä½,@à¿Aª€W߸§hômå+ ìs•Æ}ÞËA ³“»ýQ€*ù)XUцØÖ+í]A‰(µÆ³–UeÖüë%Qö“™ ZÁáiˆüwUXÜœ|‡»QËv #T¾Šæ]rªgza‡Ü¶€¸qaÅdVâèœÅv=¢BÅ’VT]dzG%Pïý±¦3ÐÚ톳1½7 d‹6êJ]¼–‚Î×ÓˆÛß bÚ»E(òêõé {¤ŠßÞß¿í Mê]Ä5¹£è>³ «Ñ:燮zFW³2[(Ä»’À޵' t{Ú„³‰/îìA¢pÓÂJw;\ŒÞ$Îp1º‘`fìA‚™Ñ…¹Ý‹ùŸíJBŠ› 0SãÀz!@Å£år{².…œNp›vÛbÁ¥‰ ‘ÄÏûiB§Ôž˜ÿƒ> )ÐAÛúZdžÑiº8ÙBÔÝrŒÊÂï𼋮…“Iº‚Åþ¹:­aP.ë.S¾¸Åšl=’ZÓÞ)~i¬Oùã÷_AŒãKVs«XEm@¯Ò€ÑqЦ($$F¥ª7¡{;4­›NØ•1ˆ„²SAžô÷ûKÈo†)×ßÏXãã{èÉÜ}içÄ·Ù¬L£L«t©©Ž¥¡DÕFJÕ»5œK ¼¿é”eÙT2P¹Äó‹ZñL¹T@7ª0’·k_ïðõdU|mymvqGº£ÍˆR{#>Õ ‡?V@Cá7ÚÍîð(1 Ó¯wºÃ“x ò4¡{$=è8Ñ'p¡ô Oˆ«±¼< ‚§ð YfüÝ}ÊgsŸ·Dô»x"-Ú[•˜^úÔVïáÌœS»µ°7§|ŘŠ(X*EîéͦëLN“³åÖ&l¼fÏÉ“'Nk¨wCÏÆ(Çì}—Œ£!¤ÜFKÓdcˈ† ŲOsÒßú… •¾Å=ÚõiÙ_µ jnÅ}pÔ/ôx%ÙÙcžÄ!_±‰*‹x¶>Ä/±D¿däH5ÙÖ0y4Eñ&A¨w)*ûÌ£{OÒæ‰©@ ’©±¸×/׊rhPp‘ÐÍuÁàեϿ#ÓÔ‡•r¾&}¹zЗÙJÝÄ­%Q?z™#LÂÇ>Ãð7™G0‚¡V¬ðúr,Fëë$»]ÖnÏéþ±qÌû§_””—è|Т‰h«~u¯'m+6,’¼§4@χôÒÄñiïV^W×âÁõ2~_hÝËM@ÈHöHŠ4!º¬ƒõö\ÉOǽ x*P×cr;½O÷3/Ãw»¾"EtøuºÄ…Àªì [±Ws\˵b‡6±¦C{X:ø>K]„ÄâOF]WœiM„¢ymYòR|®'ä 'Òƒ<{=§ƒRº…ŽÅèµ r,‹&é!g\ˆâJ;INýU”XÚË+ì¡·w4Çõœ“ß½?.™ô»½'þBa\ÚƒÇç×Wóó [€ x±j•rjÌ(=†y¤Ç(ö„#ÿ_e‘ry?Éìè?¢×—Htc@À=þýÍ…@vëþ‘×…A¯ûûb Ùðaû¿KfWHç_81ÈÐn—Ïá0¥ý²¼kîÿ6g½W£Hû“Â+?¹ìW·Aoò}Q¾óq† Xœ°.÷éfíåfžûíV$ íôu_t¤näUP:³ÁâòÁ#OhÔ”‘Þ0ø”Kwˆá½z8{ÊÕö²Œ¿:èÄÞÞ‡h¼ãO|bH–Îs„/†hÏ>©‡¼=Ø8°¯O:ìÁ§¢+SP†‹^Anΰz+Z¼-„ލCRA^†‘§¥Ì1ý+ÉC~Sj:%vÏ+ú‹\j÷C{§²ñáÊíï).‘×_×+w!´ñãïÃ?¸Å| BåzâPèAˆöö> qn*jkG¯ž²,ó6Ÿ*ø£ÆÀþS øÜZ Ð ,užíܯuSåRí¶é›dÞ9a¸prSá"eÓê’IxÔÙŽfåk‡–“4›lZ­u´KCƒz±£ð÷ñ(È¡±1C!^ oØÛ‚chsFe¸>L`ttÔHÖ­æ¦cd|/lï;ÐLûCÂ, ŸÎþ|Ù8®!I0æÓN®RšOà«wB&  ¼Øf æÒ@RÆ+>?éò’„0û£á§JĬñþ‰˜È’%@Î^VþÇ ãì4¬ø)L¾d‘¨"”îÊî£ õËeA]Ô ±ˆlX^Y£r³¯ï‡;w]VÞgnÃì°þJ&ÍKÆÎ]QµßÙOöx›V€’Ï·Ì®.-,˜4â…N‹6^È…¡…ó`©CO:ÛåèEh÷Ð5žEƒ~êP¸nnË»†pÂl H`2º¨˜.£»ä„s_pùKzª²+Ö]{äg]aV›í¸6YXdSiAcoÊBDñì¶}° =ï“eÚ…o–[Fñû‡)T%ûƈ¶¿qìBI¹)¢(ákD}”CûÎ@¼þ ÔžñãFè>´×&„þ ?èAqz`fr wŽø¡B¶2Èw¾#^‹…¢Ð$Fv@m ´(Þ ”nêÈ›?‘ØJ0›mtŠíbÓ5陨¢«(©ÎYf½šТ³í]iPlÒcÆhUl“ÃE¶0㽪 íJ¢¾G¤”3Ñ!!–¥ÃÉ.] R?:¥vœˆh§èŒ•…˜êªDõ.¨÷*ÀŽBG1FÞé…|›Äí4u±” ](ˆñqY 8Z+Ó°´Ô+‹XÐ(!0z°Ï›Ò“Û¾Ñã½m¦ÇòZOS¶x ŽÁWëôXT0$Õ`^ž:¤ëwìV)¯K=·ý¼þ¬„¯oQpûÙÛ'Ñn”­G‡G`m  xtÅ䱌Çk§ðúDrÄm´.À÷d?ü‰+Êx»Âæê‘vÂQ‘p©”÷À ª?|E Fïã³ëÒÓ«yí%CÛ&™oSVðɾý±v6ƵÒGKÁ½Ò+[Öž0Úžl(Q®ýÂí¨z\nŸ¢="šg„0„¥2ò ¯^¬¼[£8X®pÁ”N£èléC‡ðCîµô{ý5®oŒ÷¨Û|¾°†wƒüÈ~Ž_!ƒ¯JÐ0³W[(¤0”¶Ì½ÄjêyEsJ­ /y<r_½&H"8q÷V¡×Ôëß l¼ûâ4±—ÆÑ73(÷Ì”®¦4F|™g7¤‰ƒF(¸§ïši³ÿ”e,ï?]JöÈ25ú댤F¦G6(Ü¢¿;$–ûû["°3ñÊä¤:6£‡Ã£{Eb è>v€m5@ŸÚEǵéùúþùÊ5[[h к´>5ô½„K/ãWP<ñðt¹†ÃÚjÒ™ô•‚-ÔÄ›žïiJÛ6awÉõ× 9EÁxç±nV]£Xua1 (NÆ ŸµÿL^ŒíDh;Í;GùF}\À¯rqݪåÏg¯‡B}ÀjlÓšÅ?¶&½±}Kß»Á7€Ãa£fÁ™À@…4ìf}—ú]‘Ê;ÍúŠY\"Ã3o•MÖí‘Òè¦êÙR0,Ym‚j˜e×nïŠÆSy¯Wî:œŸl€×{Ä£ }='}6vˆ ÞKäãzo'àQ›æ¨3¤+aÏ«·öñ¤ü˜”sR•AÜÖòðKOŇ¼¼TüÂT¯‹{½.5ya¯Ê3{¨&2ÏP.1Ÿtói2zéœ`Òw­º(½wGªsv+GàÙJ¼%ùúdBͼÞà~üñ˜étR³<Äf¯ÿ- äŽ ®i‚Ĉiíq_­`ëWy7̦ٶÊîÞm™°…‡¸D ®™ïD#j$öiX ]»h]ñ˜ÂÜb~viÓ|D¤K)«¾3À‹F7Â$?÷$¯CÅbè6—6:ÚÉ`x×+Nû/x‹û,«¹f_!CÆCwPYè€n®Aöñµ7G[ÚqiAæ›wv@ÔNË,[ź—® ¿m’ NÅ™Ãò*%Ý!'Êiø®r]ž ÂGì†Þ1Oâ{Ÿä–ÚOCUAð“V“þ&“Î=¯• U=¢öjh„œT¡^E‹yý©#t™ÝðßyŒá늓¸ÒäêÑ/tX|ÌpÒÀ¿/“1zÂ¥kÕB—“±X@ë1˜ƒöá“ý*Ç€|×b¸,ú—‚^6Ž‘eô¾|á2C×Õ¾Z•ª‡ >dþÖ¡ ØñÃ:>P5¿‡GÕ¤g—ß©üªq‹yÔ5Så"d¼Ï®Q G7ºÉŸÿ…ÉиñûÓewŽúØ¡#ü:ÄbÔF²mT›`[ˆ6¼×5øLáäÈvƒ²945Çði ½rryéÖIcŽ/Ó_úƒøE{°JlÆhÚÉ™U!pù»‡¨ ˆ$]ZEŠ*AÑôËâìi@9 0|[ô†wÂ'e7êÔÍPç)†:Œ2Ä©˜!ϔܡú«þrÿˆ¬ˆ%½XˆGíáË’fR¤‘£kH, Ô~MDg@‰T7U‰°€xó)«!ÍUC¥"™Op¥˜Ž RKS‘¥ %‰Æ…¿ŸûwýÂJÃÅÕAhüw¡{•#Ǻï0ÂyÒ"•z…ì߀ïí›ùש•ÕüÜÂòé‚ö²ž -Ù.i-djZÁåÝÌ/n˜t¹µ)|^uV®¶´õ!ÞV5JV/ àÓ«|òä!·p÷'6ãtqõ4ˆí™X ‘ÅºŽ±L(/ âý\Ç8›KÎ¥Æs ,É¥Ó|Mt ÜØ0wèü«¸Ul[ŨOøjë2ž?m[°,(âºÕEk•±Â®s³*Úë» Ò´J&Ð*Ó«±©Xji9­õ'c×ÝoÿøÙd&•ɦÒ#È„‘ÈçL¯&4üÅßÌ¡±´þ‹Átf4{]&;>6šI¸Ìèx6}qÝwÒ?®LZý~‡ü; ßÂŒkO´Æc^´öPk<æÅq@X™ÅÆQ-j‹vcŽÆbhfê´Še“ Ì»µ£wóó°ëÇùÅb¼ô3l¬`w[rVÍV}wù¦€ÆüRa¥XÞ4]£µéNAü¤ÐöN«2˜ÞÉds£ ú†ŒZ0TÍAþ,1\ö¦Š•ÊúÈFò`ÓÜF’O’ßqs§ØhÕA-³ña£é¬»ëM'¡¡›Î¶Ù–ˆPºÕ R&6â0JôèD óàä$³åHi×54{MS-08`×î”]ß27›®1$^MÇ+×-·”@äçÖÖóOâ7B §çæò…Â01xÆ)”/5Õw‘° >L¦ë.?n@Â\´ÙB!¿º¶¾”¹ Sö^±q2jnp+ŽCñŽqäˆqÀòMwP{e‹ß= 1aÀ ç¸Mgú¬Ÿ;ç àl¢Ï_þ9N räbQ}@}3×3d6—öî3§:uׂ,öÑs@Ò¤3‘§]‘}ö  ÛÞ¸ÜäÙ»O&¥Å^ ìÕÈ]-Ñ®* ¹U¬K"³H#€1ldG wg3ãÃÙÌ·Ùô¥}ÑÉö¤3ºo:™žt²û¦“ëIgœéüÿTBxœñ õ8²ï\à[ï:÷“@Éãýgçÿ݉hj @FF@'7dÑS¢îòÛYOáÚ =HEôÞP×Ì›‡ß•«è›HÿŠø9…:LµbVù…Âì±Åü‰9Å®{àßãþý?êômîoußÿKŽ§Ç®ËdÊerããcc×¥3œ{`ÿï[ñ/u.ƒÿŒ9»µÛ¶6j®‘9|xoQàÞù©¢ã˵ˆl×1š •ÝŽKûðkf¹Ö´ëöÆn*@`p.ad¡Y“Ùt&”æ‹Mˬ{%³½“y®˜í†åL6F6Ê@eØhØ dî²›\e¹i’^Bt쪻 }•,ò4[î4@¨Ò ’¢Åæ®Ñê´[¶ÃPhiw\B¯š&ZF [(ÝÝ0© ã«- -%ÔU“bÉÞ2©LT3BnÚ®…¢­Õ!Œ‡txi·èBKS “?_ E#¡åq DWØ Â ›P}Uö²ÂrÒµ~h“S©…ÔZŠŽ$J&2OO»XÙ2–ƒG%øb|§T·Ê–»‹%Àã"a=ê»[ƒ‡-5ÓÏpÁF6©Zåac»m¹Ð°À= « q¯%ÂÃtŒ^‰@ÄÈj8Èá×½2KV eW ™.ˬ­š2Œ›Q5[¼HwÄU–½â ´ç…YÛÂ;wÅ6¶8wÛXjí¤A³ãÂÒš‘3âcÐéÛåš’ '¥ÙSù˜’ŒÆ¹$ ˵Šuô¦WDjv=G—kÅfÓ¬NáÖ¥å•ÂB!–jVµr¤’ªE×P$é¹÷un «.ˆ0¨çª+‰XªjÕù|anuaemay)¶<;W=æÉ%Ö¨‚²É7£Tñ¢ušVY°]æ…<ÅÎsÌöv¿ºmovZ2·Š°Ú¦Ûi‚pñT]ÆeD¾tÁý÷`—‘‡`FËÆƒ!‰©êá¿ãóë…üÚ`˜Â°!»BbJƒÇDdwtš˜ˆé÷‚û#Àè%#‹õíâ®ã±ÛmmnÅ0·Ðûõ0ˆ“2èâ&òoF²{ÇGµ6"eÓpPû,×a¬JSJhÈ2‹.ÇF2»9࢞ïj­áZ ȼ+©²,µaÖÔHD7¬°[ÞOsh­h ?º1ô¼î¬€ý=ˆyCº 5­äQ-hX š¶[ÿŠE ž$X\ŠÝÏúŸ¸ètJ×Z5:„ûºQú_TÃñ4êã™±C™ÑñQÒÿ> ÿ}Kì?¯7FJVsĩŀ"¨oÐ+r†/(°ÜtÊm«å¢u³áW³¸¾3Ž·A)+È)ÿ¸ÝiV„²³Ð,§b1 «­é„O¦'o@ybï‹ð‹d¤æ0eìÚ±1¢)‘°|™?BKTÔ2!È@† ºØ¼Ýpä ÚlŸ@£vX•®æd,‚¦ÖDáä°.åÔÈ: „n™«linäd‚Þ0(+@cÔ:(v[Ø'hÆ®]˜(«-ý}Yަ%“í;í\áMÒ-Ï•ˆÕj§NVð@å–Xßž^3f—nEÏW«³Kk·NyZÔ–ëA õ´Æ©üêÜIÀ˜=¶°¸°v+*[ÇÖ–ò…‚q|yÕ˜5VfW׿N/ή+§WW– ù:š’³@£ o«r¡bºxbÉu¾šSìÜáDŽWL‹ür‘¢½w›"îØ±£Wcá cЇi{âHÍu[“##ÛÛÛ©f'e·7FêLÂ9Ê…™Å Ry·Í墳äþM÷2 cNÐÂ@"°²Ž® LEa ¢X,&èŽä ¸þý7^]¿ £XØ {2Ú»¢a€÷¤ºj¹ÜÝE—upáSÿyP¦ˆÛ-ÂO Š×úø CQ@Ú]…ä,\ž¥£¾Úá±æð„n2{¶Ü°6nã'V·rñDŠ.~¬Èm¥&ÚJàõ%Ún;ÂJЍÑŽ¢õü2KT€)$¯Ô@|ظ.¶íýlG§‘(ÓÐ]׿j,Û™ÒÞ Õbò~9]¸¥l‡Q=‚…jãMƒ_RÉçÐM”&Ú @ŒÜP?Æk-FÆwsD#C˜¬„(—†éá@GzbË7 åæïÌ“üf—M@­…K4îu¸i: XbÐlXnÊ)nö^¬©Ñ‘ÛfiäÆÖ´P bª8]ªÛ¥õVzõTuÚS#¦j¥é“ùÙù|§e±Øò/™^ï¥5"8ì@h/ìÂ×-ùÁ̲½Ñ¤ÖĘ[9M ÕV\¯¡/‚–¥42Š´„öq R“Ù=yˆr’ ²>_,×dÖXRa¹Bïøaéøa Ôm·k€òcN¾>â°÷:ùþ¥Ü'0Õ¹E ÷&ê¦\¶ÕŽESq‘^Îëð›"#2“î8DíêÐÇ‚R%Åì7 zŽltÙA£ØRLÅûãðM&^â“ÛnùÀRÄöAQ7ÑaŽC%¥‰#Œ6ö®>hµõµ[WòÉS³K§Ïέ^ͯ&—Wò«³k K'Ö ·Öò§P–ðŠÝÀ~ï`+Ó6‰¹MK›N;Iâµ7Ù›ò«KùÅ(ê¼÷°M6{®pïC.4¹ó¸ªúk|l˜ÊIwÚïŒ954‚~˜c1zÈk:~.v“FÚ8»L‡vç±Ç&OÇÚB9ä²@˜]\˜-Äbs½„nAQ–[¦ˆ@W¾Î$KÖ†d²fÖ[j½!eí“Õ[ÃìSe»*Y’t2ORªO§¤] ð·_J-?Õì4Jf[GŠ­òÃ4¥ÎÔýHúx,&("_qÄz"ÆìW:e"»”$SXéçÓi—yð£v‚C²çùÐáAݦ‘´´“ŠÕ_ D½ ñ®DÂJc‹MÇckí]ãÜ…~ܸžZ¥Ë Â6ÖS ê0Rc §êâæ•|ÍÝ@/VЀì†=CŒäNOë Å'¾Et µŠÝ_1íÐ65%ˆÈÖ¼­žH cQ·ÅLk”c-„É/äÑŒÁÀÜíÚ-¡lËCIÚuûQüp^‰žR–ÈF¢ï€qu·‚[À8{·:®ÚšðC…JÔ0½çüDÎý™~¬H<æs*„4(f¨nèR„ÇÑ[¾A/³¹5P^6j¼R@8%li^KùrïÏø²Px…ÔJOn0ÉxŒ›ü5y:¡×„´:tœ*Ô®9CÒÜ#¹L‚¨ù°]çÜ•èN7|* *[&p4Ûr œ¦Æ \Ð|‚Òß~ÀE öæå)Ò Æ …fÖ» œ¶Oâ]©ÑqÜUÛÈC…‚7……é:?‘h;òñžŒ÷æÂíçSCçÉsƒgoOžJÒßs‰þ‘sÙöÌM‰Ï㊞¼³¹ƒ½Æ_g' rÌû€Š´m«âET,Ó­[¥²Š€¾‡ÈÜ!â Zu¥SFüÆPtŒÈt…ZÉ© ɤ¹Ù4]=®Ë§Y,Y Ö MÇ®ƒVàøh9. d¹V´Œ²lÒlPåÛnc3Ù´·Š¢»“ŠUS*:Vy]tòËb~™$¨{ ž&©æ^f>†_ƒ “&î—6½ŒEÍö"ËtúGd¡¡ßž5ú}XôBÆ8Oé4]FvÇÔPr$)ÉÇ)ÃW%d™Äà:€/·»Ž6øu)R”v|ÆDçI¬Làý>‡Y¨ˆã)¼èoÓÔgÞŠYvø(™Ë¤ÓƶÝÞ„ùv¢º—=éqhP-–]PlÛ{•@ì1\ÃH3›ŠY-vênD‘KfÝÞN‰1É£±/étšCÐ5±>õ+mÚ ×ÌiÊuÚ'%š,„Ø›€·“SB_p·/ u¦é©aµ¨¿'óΤ°Ù,äLÁVy,—e€ ‹m\nÛÈdÑe„C¹tš9¨˜u·È9Ø0²`À1r§y6›=/  1—Ý $«Ä¿MsÇ¥‰“fQËá\‹-¬*…ê.QćV„‰xC¼Yn Û‡‹ž—Åˈ@Ír±ÿ@˜¨œÍdsT&&¸#ËJ1í Ѳ csÝ6ð/´]»H:…kÉâÔ@m²ºb×[ÐÛ8¯ZÚ«Ž´^B²¥•” 0m¢û ÉVX½›Tצ¶ÙìÀB SÜåf+·íR½x—I=üõ_˜XE[—êwb$h²ÜÜ”iŽEÅ([?ÕrÓŸm³L?V³*âÞYvÇMȯmòsFYmíàhrz ‚hhwѵ©t"bOœv¥äLjH5«³£2Ám3«•\&Axlkj¨ÐzÉ)0##ýš(…&Î{Ÿcã^xüì!/©U.Ž?t^#Âä9 „)üò kärëÙ”¬Eg]øk–dDƒ"gKõó&ͳõÒynÍŠ¬1œƒ°–vè,ü•Ùlµ ú›ËrD©(~;ÐQ2¡JQå7C.åÑ|3g"=†Ý_ŒiNªdÒ[WÉñO+N+3¾³Ãfv¢Ì–U††§¸ªUA £ÚÎ¥éQ«®,Pm4GÇø·Õ*ŠŸLêl:s^| ¯Tèls[ÆËò×Ìâ†-ª`å!´51N?‡ùGÁZ-*¦ug6-°™±ª3gêŠ3õ†,+°à§-~H[ƒá—¦²ã8ÄŸ‰ Ñ'Å;1¢„”ææû í°j7þš-úë7ÐÒ þ)™"`–d .uӃΌ{aê®0ëz´]vMÚßÒ? mK‡À/?@{ì0WÚûòPדÁ`ÒhFCæÏHÎ’ ƒŒ¥} ø9ì ÓrŠÔÜ*Jlû’Ûã>€ñ€j ‡uòø÷„É;¥Œáÿ ƒ´e6`„¦ó)Ä$w'wØð‚*©™Ig B99”öŽ%;¤+~4‡›‡8N¿4~($…uÓ¢9²ò—z<‡DÖMèçX¡&`б†û;¸Ó¦ªâO³B9|[•VK‹¿È²ÖôGlÙ óµp|‹5œ SIÅ—o­Ýv±+lú€õ_y‹jF!)=ÚõCXª¶tâÂΩátô<³£ç‹^ˆªáM=/bÅO‰Sê¦FK|ä̺ʉê‚?*ªÅsýr*‡J^pK'Æwd°nº*h¹:±­ ™°uØ •¼à–îpÀ-Öl,©kñŒ¿c*0&ãâwÎmKß)áölØ-˜; þ1åoF²2ਘ­œÀ³«#Äþ¶©zÒιr†2ß¡ ÂÝ Å¹fÓ3è]$ëïšH‡õ1¿Ê¤vÝX£ÃJ†Q¸ò!б. c!ÐñhÈñ `$ýEüjÃáóaj¬¤¿¦77ð[+ËP&«bTÈÉd‘sÍ-P®qÔ@[Öe0 •ئíå<9‹6M|ü¼øÌÝ(²ÍÑ$ßc‰´E ÀöøµÑ¦Ü¡h8™õÙõó(Ö‡×w𬄹µÍß;N¹X7ÃØ`ñÎFÑ5¯¼²œ‘YŠÌÊ,Ë*ÀëÑàõ øÜÞDmûB«<`´‹|Z ÚšqA@ ÔÉ3 ÚBpÔ)èóxdW¯ãQ‰I—c0› ÅÀ¶Ý®qA+n ÷v:Å}W¤X27`탻”xZ«Œ>kˆÜÄøú8nw÷£Œk•9uÀX.Ýa–]\ÁËKeMºT¦¯<¨DÍPþ‡\¢¥ÙB3ÊáÜ…þ̹Iunß¾ÌÏ ÐŽ¯Ú®zn±O>õÓÇåÚ{}\ÁŠ&9ä­iT˜×2É!ߺF¥âÒ‚Ó´µ16®ђć,IûÖ4þ(„Z×øˆÈ¥ç‘2$W8 ÎÁ‹ª…ê*D¼¤R8[mŽÄŒ,UȤX^רHXÙp¤ƒú¾Œöö~˹4¥Ÿ-ßáž?Ìa˜’ ®„8RìoP¸]Ümnqp·ÒVEÀ%Åâ"‰uE –GeÖwKFVsi\çPBõPšóÇEÚ¢t°pâ߯§Ðâ‰biù¤¢a]ıj¥>aõ¤‡q%¥¾=ž‰Õ”üÄJP¸¢âÀaаp]Å‘wêœÆµ• ×e յ– ã‹py¥uÕåy±Å 8¤Ål crã^ðÆ¬ ªñÄ3 GOLpiq•ÆTÎ8„K0…£kœ¦­Ý<–#q¥¦‚¢ójMµÚЊMÿR®ÚüI¼PÓäÊ-†«5ŠWo~ Òò5 ¡õûÄpóVqÁd\¸ù@x%ËÁrQ`cé¯èB`‡ƒ`¡¢ÓZLÁˆ•] iG€ÆC@Z£‰U^ÀŸ¯ôÂ@ã ¨¬`燢_ —x@^õé ~^F0|*W*¹a)É:Ô¾Ö“_´¶#|±ÞóÂÞ4†K;ŽÇ5ž£G¬ü4ôeŽo1#h1(B¹¬ê´ T°ò>,O¶Ñª°i]È¡;ÄÙ&Zý)4^ z ¸Hô‰ÊªE£Båe£ü G‚KG•‹GŽeθ#mÅ|§Frý'?p ©‡;ÅŠR†iI)>TÀk\[ú¨«O\_Š ¨9/0fKNûb=©‡KúÇ–÷KMï›>b¸âôElMxÀ[‡õpIÿô·¸qÕh ª>,©ЊT†Æ´à˜ Ž«7»VÝôH·½.&W«òW¡„NËQ/”ñ‚ŽÌjÁ­œ¢QTÍÏËXùE Yù±#æmÖ­9ˆëZÁÜãÍÒjËi´ÒUµÙ¥î'×½qVáá £fU#–Œ¸ô(6*¢ÐŠ%1JÅrlj@ ø@{+6(à¼ê¤-x§£U®:´w¡–F'ÝW)—6 é7—Ÿèv<†é§ÕìRy±÷7p„V¦1ªpAê%‡ºŠCAÿšg»Å&[#Þ© Ð+Ö"ö¸Vä4ÉÃ]gKáXtØ…¿Én‡…öBXæ"†*¶³'æ*Ðt"ØM™ÌξH`ÁG%²ôéÞ€”Qa9ØZ£¶£êIC—Z”ªØ–õ“öèE§qGÔ8Àè [;;]KÔªË^P¾T¬£#œ0«5âÔY UvÕ±^,oÂ*7ŒIk_?Ëɨ0€ÕOõrzl˜¸f}ä§-•'«ÔY&ñ„Ûu‡ôrÇOÚ]wQ/›Üx7jãW@ìp„ŒƒH²ö’" åä+›åò^[ÄN”HdÙ–,Gì|–3Âî-48$R6)»R. +·7ÚhÚèžhQh]ÑØ’îŽ(ÞßÑ‹÷´á‘o…Ð-…HgøÕu(Þßzf½ªpɱÓì*’B[Ÿ@‰ï5¹íâNՉ̙¡ÐØP#!ð=ä.¨~¼( ®«ÉºNR˜(Á•¥."ÌvA_jwÄ/¹–%BBÒÎ $k‘5n†ìEጌ†smÔ¥ƒ4²’Fv¿4²º‹ÓxN‚ [Údð›áÔ{¾Œ Lo)wP]8-“õÌ'¢&â ?°œŠs;~Äœ:®Ï©mPUîØhEœ Yc:BÄ %Vk'K­Š¿QÝG¬’KºÔJ¶³£a ì!‚é ]¯¤YjØÍî ¤§= DÂß0oÓß bclýÜ»ðÓM7`X‰èd&¨—,òl‘b;¦ p|—*ã›yŽcËñ à‚fu' 4#Z 7„ý9ÌùVׂ6eËoÐ6jÄLŠëfN ëzvÔÔâWÙF€×ré±4†+`?&ïg¤Ux¤‰0í±×Ýšw߸ GÇÛYaˆ;<0æX×ÇzåHFè]F-'FtçZ‹öf»tˆZKë®cœ¿ÿF­ÕU V(ãál&3GúCçÚw·Lëå<¼™ RØÌeºà‹õ³=w6Û=à WoŽr¿ìòàC: =¢G¯õјÐÐ'æãøÂ™SùIt"„'¶òˆp÷AvÏð2DU B|·9Þ "ü¡‰ó‡¼ BüáGÎ]›b3¹ñC¢Î¾˜ÄeQQ|›¸Ì–kéÒŠ4ÛÅ0Lû­œ`;Õ= Ãr¶êáDIÅ@yÊš;Êk4ø%"B" MŒoE‰Ò.vÏ~ƒl%A²:¹Ñ¡«$7ªS»JZ)Ç®_UEùÊ ª*Ì5H£Ë,„Rká DJn9¤ÐáϾ6 Pâ³VŽ?£•.*¬³‚ïêé„IÀâ©HQÒUHUid,.²t@iÃ<£´’–RY4†×éxÒ³/ŠšWø\ ÷Z í½u2æ×DàûÚSÒ÷ f× îjv8hbåëa]f]J”ÐÅf§ÁÚ¹t—fÄ?a¶6Ìv=j{‡uªŽknFàøoŠóRGÚ;V5²šÛ{muЍ£Eªf>Í_€ù‘Êæ~64°‡lUÛņÙuJ÷n ”¡ðU ø:e-­Éß+¸`ч-–Jv—~Q]‹å ¡Žð!¶ÖÛ‰àÕ“ ìFÂZÄ‚…[—ʵmü‘»Gvµª°Ú­ZÔšNnᚉÁòŽe–ì(SB¸ ­Lõ*{ïÏgÛwe­x# 7©µ £=û2ÀHð-§çŒKà[ºY,G,8É.&`€§Ü]:jù5 e‚Ôˆi”/Á·ö5Û0´‡Š7•ÌväÈÜ­'ÛfɬGHDqÿÑC*t8ªÔÿðr±*ʶwÿ ?2é.hé\º'"Ýÿ§ê”ÚmîìJ£¼u("kˆÀrXæŠ+Ì!¾ÌÜ¥®˜=WK rÈðOذlÎR׿]]Ù̆gö0P.jŠoÖré®íá[.–w¼®;7Ñ úÓîáñ¨.Œ–dxcPö'õ„ÖþPff7׎^yb{ÓÉîžå-KäVÄF9ššÐ nÕÐvÍF¬J“ÀŽÙX¥)àvà¶Øn¥Ù6Ån§ËÉ[ö¦µt@#ÛËÐH‰ ‚—(ó‰íŒFõ‚ðÑ $Ú‘âK;´'ÕudÃÞu/Êvº-ûŽo L ÀJMìš\Ù&:zÙ°›]ö¿ôŽè-åZ¸n(Gç×Cee´nMyUúj«T馎»®¥€J]x«Á s²SÃS†nŠ)%+”ýfs “êu¹‡k-|‡‡ôí^ؤ?ã4í€VˆK1«XÎõÚ|ÖÈÀ AJˆ?Î÷CŠn­NÇXê¥1h”,4ç᬴ôøÜ>iE(êÖ¡8>£ŸMñÃv>Ì ¶0BvD²ìÊÙ|ãÌ9»qiÄLKvcÚæfYœ™à®þaùÓr×:ëH»jŒË&!fZMßôCB6%yµMž_fk•KfbOå] 0‹%ÙãØþ²kDWæÊLzp’P.»6N·ó­ßFï$Œ…Ö,-o/¡]!ó%üÙÏîEÛ[5bpïC%VÊ—¹Œn7Îâ%…n»>Že6Lu4ÖviäâOäá&Ú{ìrr‡ÉR0w8ò‡âýÐ;|§üŽŽPÌÎF¼«© SÊDWSY¯û»™¯÷Æ^cës*fW ÐH 9dqà˜V7î›j'Ó´”²$Ì­ºô Ï‹`#öƒZ׃:§6UcˆM4©Ž‚ Ï@z»MNG¬†cK‡LŸ ¹kbbΡýŠgF§•S§,§›í¾êô-n·]t£lNIç©êò&[hãõÍ¨ŽŽ—+¾œN3Ûu½‰H•= ©ÜhÙ“ó¡îmÔCËuËm³G^¹nymöÈi42'^CtÏj42«H,=¯è£›šÿ„k†m?]7ý}MµGÉ$MRú9`ÑŒb¥Ýi6£6ÉXBxØ[o#t35sv Ómïî){‚† n.j3]Üíše çö0…£‹—yÁY9õ”4vr‡£å1Ý8ò ¾wÔ<4?¸Ð:™n&W;›õ(“+õ”¤Gç²Ývh·•ZÕÞó'eÑ’Ìû±ò&Rr4˜ëf§¾ÛQ²¯!/oMdx«µŒ¡ˆKˆÕv.µKç[ň3W¼dR‰ÚèÜŠ²NñCo©én«Õº¸µÿÕ\:“¬vî°\Gö 1ußùë6o‰¯®6ä{àuožnˆÛãcQ×-ÆÇ’Û•.oOàÍîî[PÂíbÔFÝNä9J¯óµrÄ—|"Tb¾üSƒÂín›õºÏù_bÇèê2ÏUpîdì˜e½és·aë‡W‹º ºkDztï®ðe«¡ðÒ=ðÒ]ñ°©"6³ð¡¶±è5¨æ·Y<MOæ ¯º³XtF¯9\±å ‚>Là=ÀO˜á«r:‰a|M€¼û;ÃÂa!Â5lt¿m·:0 ¦¸‹í§ƒ©íã½¶Œp<]Þ ®Mö\±4¢o‡àmRòw*i‘gWãNÞV”]¤'ŒhM‰‚Ÿ Äóƒm“½}—ëКì«w>?ÇiãKN±Š¾*Ü.sH`7G£§›ŒV º†µ÷í¬ýøòù|þÐÍΨÕ?¬F"Ö Æ¾}÷ì­#‘„#prŽ€¡{Ëî„÷o£Ф[yÍÕ3é±îî&ƒއp­mºÛ_NBh{8Ô†ŒÖêŠ!7©t¤!ÉUî[§Š›øŒ(¿zBwé™:¾à·›Ô_ð©ø.'JïÌß÷$Ò%¤”\¾‡…¤ŒÒEúœ^w÷ 9”¬X°â­_öd!ðRC#0V¼é%x£aWÐ%õå’T˜@´\Òæ ye5àS¯cR>šé.3ä¶;‹‘?ôx¿íÄÑúNáµ¼AÏ€ §Zá;‡oè/‘sM¹¢'¯Ä\ jX{l }䨧ÂRèyºÓ¶ÛâÂßJãoåÏ–igØ8‡S=^”`y]wQsŽË)‰è\ÒÙjzÎsµ•=*;ø¶‰?5•ílKX`ŒÐR£wÙØEµ.ñÊ'›©XFi÷™C,Ç7‰ð5zIzq‡®‡]I=ÈT¬»f«n™Æ©Ó…5#¿4o,,³ÆÐ°&,ψv…JÉ™Éç1ÕrEnô.ß°Q¬âó|ßM17Èq9¾†ÀîÆË5áý8I!²Ö’~ÍElõ[%É!PçÙ9zÙfWñŽ„uØ¡|Q|—››Ò‹:18a éÑ蛳m²Ww<9¥ßz§YîÖˆìŒCZïóÖ@”è{åܨ׋ÍÃ~XqmuH…+⃌‰”yd}”íj€’Lh‹(Šxt Úvƒl$ÛJÝÚµS„hEÁ\Å+#ì¨^𻱨*ù^Æ{…lÕ;Žl;´]nünaó-ÁL¾Àά¯fp÷hË ŒÕÑKô” n4à·¾[•°¹¹i«<äcø¡‡±.¢Zìž9¡íì¨7Ø@9±#û‡ÝïÔ¹ ÙÔ:tóÌnþ« bª¹bæg7@Âs£8øŠNÖåŒ(ÛwPËM“MÀ»'¢Ç8®œÝ{íJ‰¿ð®fzwc[í̸'‹w$ÐûE-E“›ëÄšpH…ÇGEéµGV’§]tÁ7]’þ]’þ÷[|Ûim±ø1e™[¦6•MQ 6úóc’q ©8!ÆH»V&ˆaT)¶e:vE3Px²¿ØÎ¦åÊÇõ–ä2 ÿë0â¢!»Éwý’–à¿í0ý-A U¬7ä¨å—n8{ø0;Á¶ckJ!NAïÀø0 ð 5¢#W,'@ƒ´ÖF‘+²ÚÍqþ9ÄO€p®‘Kµ¾àÁæ®(D­hmr‡iW<†@Áo‹GEÄÀp­¶Ë~ÍÑEGÃäÇÔÌ^âÓ!Ïòw wîÝTQ*»45`çeÝ,à›®ÝOû !û¸¤|)¡EôV+à¢ÀÒÕ~jƒ¯åù„ûŽxÕƒL•d7äq¾51Ñö7ƒp/ºò‰™RgCiR‹8é°ЉFóu¬bYÈm¡lXâa˜†Ð±¸¢Ysœ=^‰Þ¼€‹”Æ ÿƒQ ßÖ°ŒõÁö΢«Ç:ÇØú)ÁH55Äßö¸ÄÎiØBÉÚñ'=¶§ Ð"ÎÐìã°‘ËžzK_Vô São-YOR*³knªxÏÄ— ¢ŠeË{‰Àsï‘DO¡Úü©8¶[¯£¬)æ!€NË^(mÇÔžVo n™0Mµr§Ý6›n}_®l9zÿ¢ŒmH¦ÕÖä…ø=Í/Ønw‡C܆íÈwÔ*ŠŠ¤@Ï/Ù®|kž^7hã³Á?’ë¶w=í"î{i7Î+ëA²2qœâ ñò+¾=N“ S<ÉHÊz•@Û×è´ðä°ˆ;0ô"ùv³ž ,ãñ¢bx)eè¯fók-%{ ŸŠß¶ KÇÚÀ×ËÕcÜPP~êmïðpò gÍЀ^ÓÜÂÇ*ñam[¼@lrS±®|»GM„MkZ¨è!˜KìvSÉnZãeRYå©1ÄI¶Ê”ê˜ Ë›Š”›0Í;Ÿô°·>{ÃeRŽmÃIÒ×_9éû/:i<:%$OKf•T›Æž ÐmÚ»)q:áÑðJ §”‰ða"Óže:oâŒ*&7Æ'†„,%íh•«_M…®žðÙ`¤Ò:a{’ˆ2î úôˆ\D;5ÌV£ééA?R01‹® Dñy Óñ!\âtIñ™O8ˆÇ([@þÉWäùÑl%Ÿ}¤çµr(‚/™TFåZRSKÉÓ„†XÝV¯Íá‡J²J Å%5ù ñ¡—šØ„ú­R·M¥(û„‡ôSíM«KJ­•{^Ò/HÈ ²“H¯ÏCÂUáZAð·p¿7¤ûœÒ._F¨tCøb"Ò‰ôé ÕO7´Â‰g£TvƒTfû3V;ÑtIÆtšEEUÝÒÒÕG•ªY]¯8èuI ¹¦Vü¦ŠÞк èé.[ޝÝü ±Íw$Õ™WX¥Þ`¢Rœ Õ¾¸Çëųj”Z8¤© óWº.æÒ¹øT Úiy÷ÌgCÃxV³‘ tâ–ðîÕkü¦K¹QZa„Ä$¨juшhÖÛ®‰<Ôãcx‡'M ˃ûa£Š *aKŒwxÄïǶ¬ò&¡Ôí ‹ÂÖ@b¬#MËÙî'jÚé¢ÿº`ŸÜ2¥Œ>Aæ[Š Í ±’õÃð‰­‚Àíú‹´yïƒâÓuU2ƒdȧJ§Ý|_:yªPé¼ñ×@9èñÒ•ñ¬ WFx?Stdàƒ¨lèét¶àK—7ôˆø`š¾?è52îS0rÁØFôQ‚Ü ôa²“Â,¹%϶½vi8{6‹·‡T¶OˆÞå­ô<:âî½WçP·VöÀþ¼}Ç1ÚFú™æHü‚~VŠ;‡¸êB‘²HÞãr ÷=œIˆ2a‘4i +•dͶ7í6Z]W­ºIŽ1€N…“°ˆ@é Ëõ…Ûî¤'¯Ã3=÷CTñyÂänò élÿT@P€ Ô<c×ý?ö¯ ~ÓI‚^–M¥G IÜuü¯åÚÍTùåúoz|tñýIýþedz‡F¯ËdÇÇF3é±Cc—ÉÊæ®3¾£É•I«ßﱑ¡˜1dÌÙ­Ý6™K –F65J»Æ#Aw0 bocÎnÒ©lV ÍrÊŒ/æâ‰0‰ÌáÃãÃðç°ŸŽ]¥vP p}Ål7@Ü⦠¬§;¼†oí »bUwY‰ Ë3PL^q;’9 oî"¡V§ÝB7}´»!öJpó¤jšh€ i£]„BU†½ÝWnÀð®P*«ªb•M¡ÇàJß+¬LjµÌbÛ ËŸ:bZ¸ÕÃU[;™7 ËÇ×n™]Í ceuùæ…ùü¼Ÿ-Àwܘţ›Âœ1gNŒÙÅEÀWg—Öò$rËÂÚIc5bvuÞX[š@È#º4·xz~aé!.œZY\òcù8Ò8•_; 1³ÇÖn¥|/¬-å 4¥\2––üÍy˜I '‰”éXÞX\˜=¶˜7Ž/¯"|æ¶°’Ÿ[˜]†¯æçÖ 3,ÉÐòª1·¼TÈ?é4Ðc~öÔì ,Â*¡ŠOªÒÉÙµÂ2d¸ +œ^\à _]>e,.°ÌÆéBò˜]›El`¶0 xy`é*™,Q‘æÖ–—²^[År,åO,.œÈ/Íåw™Ö–WðtA ³« ÌtùôÒËDÈ,å™(ñ[ÊB¥È¯#NÍáãþvÀ¹Ìj–ëŠiÄQ¶®;¦Ûi¥jqL¨V̪qröæüúRª›_[_XZ? “‹!qŽÀ8A1 ²8U;;Uõaή®Ì®®±ØnI‚÷Â[š=•/äW£PÉË?hׄ;ŸD\%Æ÷$Mo!¯õÈaüGèÅ °Œrñ3ÑjmGD7qǰï›Éù±2žP @:e×@ãë \´Õ~¬£Uë´q7ý/=ÜóÆ%üßTŒš¶©ØAƒÿ­¬-/Å„ˆ%—»eWXðå+ÖntÐi—‡ŠãŽu—I2•þñ^€k,¬lxR *ª(S«‰€ÃúCY*P ({§aV 3š 8«Ìálj þ—Md'`±ìe›.eàj ÈHà´V§3ò>"Ïå¦q `ãòÍ*xÙÍ›Ù@ƒ6Íkh)ËF ]À¢Æ±™5xÆ`WÌï²ZôÆ`q˶*°æ¶Þ7µ¾ãv g@¹~")˜Ôé=DPéÛ¶‘_]…IHUM<#ÐIP©˜=ÕN“:+ˆF|KÄlŠÎ‚¹&3 *;ˆÕ¹›ˆ±£Øy¼í1d¥Ø©7[øVî LT€óÄ,FPñ 1¬·ˆÁÆÂ \ƒ9{ˆ^§‰Ø)NÃuW Ç»c†ÃòÙÞ:gσȈÓ[jcã‡&Keñ©HœhÆÅ]4ŸÚ°á6Z†Qiµ]ÐpÐ  ׆ò4üa05øÀz¢zP?/n÷¦£™ØŸ6ˆ?GŽ£ ¼«¦Ó;xPQÌz5ÒXLzE2œŒ{ <ˆùzY³÷ Mc—bÞ_U9(5×rTçv}%nˆþp£l¶.å‹,]ײyL™Rå¸DÜ-húPËC!çe§5¡ÓVl§%jµ`×ÅåÆàÔ”Çb1Xe)+¶ÆünýÃß=½ƒIM™´?ê Ö7˜q{ÔÈŽ…›¶iƒ^ Úg¯ñ¡¡Ó¿<›ºv §u*MNa‰@,‰¯‘z ¦¸ÍÖ!5,¯ö‘¨ ¯W2¼^¯ewz^Ò!e5d—̤ïÈ@P¦¦Ï'<Î˼½”èи(Þµ~ŠÊÌÂP¤ž„ûæK6L®0¼Ê ÏTñÄr Õgu:”¡ö=`l# T_ô<­3_QW&j¾žL1zGFQäQï wgû勸`ŸÕz  ø§•Ó%lD`Ðq«mî‚r[tkRÍ¥åê.fÝtHý›´èÒùå‚àbT>Án9,TQÕ¡f­ÔÀ N×l²IIùYMRC‡1'С EáBr×ò"`š{J(3Êjqnùæõü™¹ÅõEX LÒFÛÌÀb¬æð¾®ØÚl‰¼,&÷;ìqTÖ kËlâ¥Ê*Z›Po¤ånô2¯•Ž{ŽÙ1–Õ–£0Y¦¢Í±{#²‘÷¦ÑsYnB%Ô=ü,Ì…ê|u¢&¨è:æ\3;Ú5;¡£ ¡fÆ5Ôˆ u¶[y™ór…Ô(:›t¥Š÷¶|vÜ[)Ée´…Ùô©YDõ ,zRˆ“!cB‰8‘­ol`e‰ƒ æ]å.IFš°J j^¹øuÀ27D=~ï ³D;šÂCß™À-4]nráGyä×òøbE-Ôèùt)çÄR¹)˜$„Š@\Òúl`¶‹˜ëÔL‡_–‰×7œG‚?MXÏ…üÚ:­sy¡J’J"Àˆap‘GáTáDaá¶|D˜¶Ú0]Ì9¼ìÁÇ&µº­pöZ­ÈˆZž N¹Fe†(94e ——|ÖKÙ´ £E(áÇ“ë-¸K§ýú|ÚÒØƒ¨P¨q{£zoÖÍ(„ï2Û¶ã G©i5Ÿ!ßt†ƒ‹š ±(|TÈŽÐ.67ÌÞùw`Rè˜Sš¾í‡º$¤nS[Zø!¸É¢ÕdjdÏÙïrùªúR­ÖÑÔ=Î×ã:{ö8\\˧iµ©€ªîc„'KQ¹Kswm›ýðäucï‚t[Dˆž(—¾j´¤ ¤NÌ}ÕÇfm×Ô?®Å » vF/Žh&ÐLp ‡6ÁƯõ&Øz½Ë6Ø0ÕABu‚P³ÇææóÇ#¤, Ï.Ö–ÆgççW ·6†Üü¹ÊvÝn¶¼M1.µÚw*wÚ®½)nª9ÅíuNï&M0Èä—ÜxŒ Mo™ÚEE}àÆ"IŽLÖ¦;8袄…J$†IØ ze¨%±"ëz_"× kg°t™b½fQI|ùçÎ,Oqµ-è¿dåmU MKãaRŒŠÜÛ`s´ç^…Ñ™}JáIMð[ÎS^åàö ÷¶=¶´Né¶ôH½d¾}7Õù´Åv$iÚÉRÃ`-3^¸ ø„ã#ÑkBp[QóÁ OzGAw7n0Ò;Õꞈ ÷wÞ÷Üðm„æ½gKÜ×*+ä=‹ê«oÅ õ‹ÚsØ@áw-!€7imû‘ö5b½« ¤êY¼¥F†öQpuï˜&ðñA%N£ƒ µ¦ UŠ7¶|“«VÎXhç.´ßÂÔÂÝsïnêK—Û'öÙ#.…·2ôÍ2ÐèIPÑŒ€Ôx“ËÈ€Ú5"¶Ób›K‚ge:¶?iB›(x ØÈ²TL=1}øE–·Z/àMHž*`vjÀbx01àÐ^Ó´;N}—ŽQq¥Ì6½—Íõb«…³NÛÜ€>î0Ð ˜ oR95«ŠÓ"!ú—ïâÈ]ÌœMžé’†7o*ÑÒÄ<Λӽ™và-êĆ…#§ ¿8—È!14H,KVgÉ ƒP ŒSâ ˜àîä4‡#)½¸Äi¯€¡ý_:÷:Á!첉9õ¨á}…v Ê­ÝARÀ É‡™¢o•ÿ­ÜI` †(Ó…ÁbuØØËrᣅûÃhAlÞî×há‚Ë4 Àî¶%DM;}hñDUï¶f‚µÑŠ.#Ì'K¡Iß ooà ¡:ñ=(ŒGR7XW“³Ç—–ñø{yuMHIŸ4@! ·è´?dñ$Œà‚Qd EÜSLÝ'C™‡˜Pfm5ÆSÖbç Á–¬˜Žz0üØÕAaüe5Éì‹W`RSõ!÷Àö™Ž)ðs÷¾YÉë"ÞÆ ‰­÷õ=E«œB$ª!¨yñ¨O!÷õÌÒºDˆGïF#cLBƓɟ¿=e[^E›=ÚÞo›õâ.]q´ÕÁ÷Ñêt3©‘Ö JjE²§#a5xÝÿ®±ý¿´W]¯ãe £©ÜýmÿŸÎæFsdÿæpãã¹ëÒ™ÜXzüûÿoſԹx þÓ¬÷³éLµùc0©žh›hÕ~dƒ~K3e|_}å•k©²Ý8“èWb½OˆÊ‚PY®ØåNC)†Â®_õÓõ{6è'ôË3ê÷,ú ¹‡é¾0õä’MNȧCò~®8z9DOˆê«â°—–M¤QÛ<•ZH­¥H‹)™ù®´š„]¬ Nm‘‚E.Ju«l¹»Xt°)\5(fc‰ØÕ†Ÿáò^„Ô‡•ñA«m!aU¡!Š5Š›&zR9­«ðd> \T8Ë-–¬:Ê®räm ٪ʳj¶xJîZ²œæN‹ŒmÒ¾ë¤eÛØâ»)î‡k'ÙÕ|agàÅå¹ÙÅõ…•Q#gÄsiVí°k\ᤶ거´3Î%‚éÁ6ÁòœŠÀn0pßÕt\'E„ ·.-¯ ±TjzÌ8 Y¼£!; ‘•L ‰1œã EÁÚlšuã\uAÏUW†ýûÓ&± 1KU-*Á|¾0·º°‚—bèXä\õX8Àð¦YRš±¡VTõ°I Š%40‰©*¬ÛÑ–ÈÁ^ئù›»Ì®B0Èß\µX6…2Žý595@×°’5XïTîNA±‰-Ï_F&u(5J³§×N.¯Æ<éõ€špó?¹wjCÇt¶R­JõþœÿGG3éC0ÿ:”Ë:”Iãü?:žK?0ÿ+þ=aeþ8´þhì ïúìsî‰iÃ.Ý;rddÑlnÀÔ71«#Ç-t7hŒÇÉŸ]>=ƒÆ,6b;/úЙÏ5?6þÈo~áUÆëôŸñüù'ÞóÆâÌ ÞúÂッüæG¼Äù©™Ÿûå3Oþ­ç¾èƒwÿÄïýÙÇï|ÞËûozâûuvüBú¡ïxôîîçë¾'¿ïG¿ÿùý_¹÷è˾òw¿ýËÏøü³4»ý´ç<äÞ½ç_Üö²?høáÿòŒ¿ÛºðÕ•OÿõŸ|ù±>û«‡|¦6þ+ëï}׃~gã÷–?ñú‡Ï¿îû~é!Ÿ/}~bpç1gnùÔ_ãßwžü•—¾ðŒÚ}âÓÅß+õO‡îü¡'|ìó7þï¯ÿì]­G~%yëß}è9ÿ~]ùŽÉïù½ógî¼íž¿¸ç£/ì_ûúçÞöü™÷ û¼ùSÿ«ëç§¾ùñÕG?=ûè×½}ôÊïyÍÛ7oyõÓÿàEÿþdsâ¶ß|èÇîÉÔ{à‹¿[y·ý±›ï}MòñóËïú³Ÿÿ¥ïyß§?qóï|è{Þúáþþë×Ü?Ø}ɯ®|þ¶üTüß'~|ú½ÿ6ôÚ—œ{ýø¿ûä#µñ“¿6þÔ{ßzúýßzêõ7½áÝÿõ‰o|õO½óa/üæÍO|ÑOß÷®ßøÓ|úðŸ¹ù)—VÏüῚýg^þ{3^ûÉ'\÷¡Ü—Úƒ_m¼ý?ã·Ÿ~Ä¿>ñû‡¯¿ý_}ãÿzç;æwÞô¿žþ¥{Ø+ž´ôƒ?ûŽÛžð£?ÝþðÚ—>öÊg½ã ¯>÷§wüàZëüoß\|æÚ¥CÿT_ú…On¾¿³ñúùdÿì¾åýozØëFÎá’ÿìg¿#õºB©ø‡_zË­¿÷°±ë¾û•2ÿëª<îé~ç;_:{Ý“w‡^uݳÞü»ö¬ö¯>ùµ×OÔ.}ý)™¿ú­³÷ýôm7þðûÿÚÉïiÿ΃òÎ'?çãŸs>YxëÇûÿïûÖüÔþ?ó¡w>ñÇüî—Ÿø'³ÿñ¸é Ï/Ÿ\úÛå×>ë×Nÿû½«ë;ÿõì“í7ÿö+ÆÏ,þÓ?ô¬™ÉŸùÒùüÃ#žþšÆ~äÕù Ë>÷Ë“¿òÛ§¦~åEúâ/žúÄŸ<ôØS>ÿŒñ7]ø—'\|ó#¾ë-?÷¤oÜšzÒ‹þåÌ»þ¹zöž{Þó©ýüuÓ¿VI½ôi¯=ñÍ{ôO}ÆÓ“}ÝþÃÎ]©§çÿÎ?ÿʯ^8ø7õ瞟û¥Ç6¿ë¡3~tó–ÏþÖ_ú=Ÿ-¼ÿQºe,ùÂgþâ“—NÝv¦öë©åÔß=ÿ ±ŸyÏäôÚÚBß=•{~þç¿÷¦g?nè-‹ÿÃ~ûïüôËøÇÁïûðÝóÐß±vWûè“Æ}ï›ÓôÞ?þÃøìCÏ_âißL=ôÇ>ðî{'ä~íw^ÿò??ò×Ï|äÚãÞ°üá úÁW÷}`òo^zî—>väuo_»ïè+>òšßh>ïÇמÙ9{Ç™¯=®ýÖõW?·?÷—ú«™yÓmÃÒ3žó„ïýÆ[?wCõ•Ÿ~÷§>õ¥‹çßýæ—ÌüÓÃ_úŸý©{†¿yñ->÷²ß{éÿ¹£ÿiŸºþ o~RÿO}rë…Oy̧FSŸJ?óǾðìþÐ/Ü÷¯zö{ÿbù]¯zïßÿek|÷•ïùý;ÞpŸû˜‘·ßûþvníÜZøÆ>ö±G½î Koáü=¿ynãë;²š{ZûÑGžûìû~õæ¿óà¯þß§·§¿~ä«÷½üا6Gýmþøã_ó’׎½ï?Ÿû—o[ºó³ú£æ¿V~Ìm?aþä'_±xÓ‹ßxè·—žc½×Ú ß}Ë{ÍÎЛnˆ=å¯úÚõŸ­ýàTóoyÖ[³pðg^úµÏþíWžýûÿ<ûXþìÝÖW¾ôˆûã_ü¹ÏÝõ˜sÖ[Ï~úa¿õ‚Ï>þ±6~þB{ôÅߘ<úšÒ—ÏÜøP{y³š®ýÓüÃí/=þgÖÍ÷üð{âûå×Þ:³õ¾Ñçõ?ñc·¼üKùáS÷Ý·þÖøï^øÐ?ßðŒ§¼êðÓc:™¸é'Roù…Wüìîÿ›Úï}Åì«ÿþ×ç>óü¥Wžø?Xøâ¯ßxbòùw~iä+xïCŽ^Ÿ½Çíõç–n*¯\ÿ‚ø…ÊëϽàãëú㥷¾ø çáÍ|ûW~ôÙs#GoÜzÿ/}æøéÏØ_ÿÈ9ñ/×ðï—Ÿù´ÝñÊîÙžxÞçþëhýyzÞ³þî¾/ÿõË~ÿÆ#ÿøÆWÞüû¿”ø÷ÄóÒóÿüsxÙ\W¹çû¼ò±7?vÖ~ËkæÇ_:ÿÛÿóÒ':¯MÕžô•L<æþ?7>ès¯xÙgÌfEÌ9è`æ©q1_eÆG³2nÔ›ÃÖv[æÈJqÃ9eV¬â1{Ç8›†ä±ÃcÆÄhö|ldÕFtF Ðݬ`ºƒhÓ±;mÐgÈJÛ.âàìL•ÆÈš¹ã^~Ç=Q ÔÌ(£·=3F07ŽÌÁ7Pt %Ê—Så3¨€•Ð1Fn²*Žq6ÆôÎ@¡ƒ$5ÔŒ¿jRt‹u{C’¥?eºÅ ¤À‚'÷¡oT5b#Ë+§ŒÌÑ£2'‹«‡oU+‡¦'¬f²±L–´„ÕL:–Isp"6ÀÉz8ÇŠŽ‰üÉ;=?{êà:éH.@]¬21ržŽfZ.¬J2T)..&§ñi€9Üs<|hd±(™ÌÄÈ-h…îœ5ÆÒXŠÑÑQõ7-âðÙCò;†ß¹‰ÃôŸÀÁÖm‚†‹= Øœ…E˜ú.tJèÀˆJ“Ñê–Ž¨Û­ÇfOŸZu;f×+¡šeº×,—¬Y,;–ÔÊŸËÑÇô7†•ÿ;¤þÔ¡lÖ?D¿2Œé‡€S’3wxI0‡&bãT|ü÷a§´Š(C,­µ ⨖0·‰jˆA üexj#¬#§\AMD4ÑÂêÊÍ7/‹&ZµÅf°ﳉåBMlüO6 †¹‰%ûù#™äo4Ézldln8Œ€Å †"5¤é&K+ÿr£Qs¥ý¿²»É’ɦÃ#âUͨîP‚¬—ÆÝF„e7õŠþ—¼DzÏô±q}pnÜncúpPVʆݧkï›·ªU¦˜;ÎÆr‡GîìØè‹· 3£é‘ªþҰšç¼–Y.™¿ÒçR±av˜Ç`nƒ©-™™0FçŒñùó¸XÛp@~f2éÑØÈ¬SÆ R`n*¶Nš´ÛKŸ˜¦vl„‰Î67ê0-ÆF ®Ù¸Ù8P§p7°¹AÝ;oläŒ 2: x8`š)Ž”GÌ‘ÚH}¤9ÒqF¶TBXBš9#3˜ƽŠó"S_cÆü3'¥™ìáìÑ£jùiþ¼Õ*œ~ä»>±ù‚¯ö½â‰¹ï/eF^ý'}ìàkø7‡WÿøÍï{ä/ßü]…¤FozÞËoøó_ùúïÞú‚’Ö ¾öÜ÷ço{Áƒ¯0®üÜSvÏOž*>þ»ç/|pdâ®_ýò×þnîùØÏ?#wß‹î¾ïïý¯ÿ\é?Ü7û$wéÎß\û›ŸýÅW=|áÞ»qaøžì“î˜}ÄWâßûêÄ~u·þ³ü`ëOÿö{?rSö%•Ôðî£}ä¯_ù××eßyÃîëÞö{o{ã¯?óÆ×Öþíýÿðî[¾ñÂ?½ý·îxöK¿ù¦øG†›¯þõ_è»Ý|êñ7Ìß~ðQï~äwèýYói/9™zÔŸ~×wÿß×¾çYô‹O|æ«oÿâ{gþËžyø§{륹—Õ~ÿ­O|ªñôŸ|xâøÖßú“jåàsŸñé¿ñ˜[Of?yâÉscÿô²þŸuŸó›ÏîLí>ä__^xØ—_Ó~î ¦îA¯úÛOüù§~úIß׿孪Õüü_®}ß›üðüÑO+­¿çq¹þã+í¯õsßý¯o{Þ×>|áÅïøÝw¤öÞ¿úâèk6^<{ðk?ó”wX÷£•åW½è'6ü†/mþ×À_<þ!g/¬=îׯþñ!_û÷gnþ§Ñ‡üÀs~`ø ï{üc¿ðÌ£_{Á¯.}麅äÀ“þäîÿ|ðß<òG»üG7~îÿcï-à¢ÚÖP‹±±{; CÍ ‚ RÃÌ™r‚P±Ûc·bwwwb+vwwë[±÷ž=ž{ïÿý~ïÝ뽇™Ù{õúÖ·¾þžÖÔõt–ÊåóÌožV™ÃŒP¹±}òÑMo|Óm¬çßÔø-G´êÀ¬^¾Ú:;ŸŸvéé §&îËÞOqÕH>Gêöòi¤~Òññã›UþÕþAÏô"µerä2ñ'¿"®â1¼,²åáñõ‡Q?x¾ìØÁׇöæÝ¹3qFßÓÃêžÿúí°C>•ûf³²µy’Ü'ßý«ÉI3¯=iò`ñž˜‡]ÉS^\Ï#¾ìËqé»Ó&ÝRRÖ&òd÷y’wÙÜÚa3vçtéä¼Ï7Œìy5ãùÞz1ý?|©ÿ=h”] ߪdÒ••5*¹‹»Õ»]«Þ¡~Q¯ú xf?|`ç²ÀŒ5‰ó.8ÎìsxøÐ›ó>Zí­:Xu¶l}ãªé’Ž ¾v}ïWIši1E:*8÷”WâeçÊ»Óã'tk}âÑÊSnÜÉózÐÃcðdb¡Õ®cUG]¸ÔiÌŒ̺/dÚm×+ïwë8Gíý×ËÔ1Çç­4¶tá†ÇA½NN“s„?%õK¿[&ËÕÝ[ßÝþlî<Õ½Óáöée¥®1k]õ¸j÷t>uùMõÃÍW¬Z£œ@vµûz˜3¶c‹¯UÚn+xsté æòa=‡wkzäEàU/§‘ßk$oï™ß(ÓoEøš›m¶÷{mÕwk?o×Úkƒ[7Ùµê²Òíöàdžn´ýÅ »Ë½5ªýKç O=»"¹˜ßwÜÖÓs¦õZ/»ë}èiа—AדšLf¥^»¶¿ÅÉ€þ“jg<Òm©6æNQ÷i‡­½õ@ËÉ&õx“®î¬M¯w¾zð~úxþ’O:nɃÃ/£OWKÙ¼Â{îò¥ãïÜéÔó\ö„Cm•Ÿ•äÒOŠA·UC¿)žßv¼­-ø¬iñ.óÀ¦]÷ g¾ytèÄ'çAë>ç=9¾ês“¡sÛ$Ou̪ڭÍéËO¢]om|º²“tÙ»ýGfÕî¼@MªÕ÷ÞlKf4¯Òî´(s÷°“¢µ^Ïz«oRÇ9³83#å\¾çÞ];¶þÐ2R§ZmæíôÞÛn°Ê´Éô±j{뉧o¶¦Oók¼zþî-_Yú¬ùýoÉö/³X˜š­Úì[âýýøÝÊÃÖ]®]³{hЇš÷ãõšäÏŸÔÜäSõD–}¸ôdÉ‹7;K^ZÈd5ß4zNûUŽCrqùÛ¥br•¾W\]Ж§·'}±¸]*Þž&—  — ¨ú‹[ÅÅÓó·×Ч›Ñµ"àñƒù!üP~?’ÅæÇðcùq|póùIü®üT~7pù’ Ü·Ú\p Á$v"¾ÜFÙ`Iàݒ×{ :î‚Ë ÛvA _ÅWóÕ”“Rþ†îl¾´¥’ {L«‰I¾Žm¤H¾ž,PLo³+ΜYòúW®8wpk]qúdËÄ„KÛ\l.íϽ–P]±¿á&ýÅ+¾—* VYÜ©9¼¤jÍà*U#öׯ2¸Ýåv"ÛvUDõkŽ¬Ù ñ:ýRïØ ›¯ø^ëÝ[1gÅWówÔ»¾-wWëw»ó/õzºj⦠nÏ¿ÿüùñûÍŸCB·FµKqºøÎb¿n€¤goî¾Bß±ÓeI£E7²-}Þñ3¤R­ë¬8qze~·få‹>Ônö®î>é:϶1WÙ¥ã²-'NØð= ÃV¾îÇþ!£~|<~bJ¿gM9?/µÞ8 dšÍ›™ÃúÝc=Øüq•.ykýyáw¶Ä·q|S«Éš×WïoIG”DþÜãUs`ÊÎÔFDÝ›zz;Ûuž°Ëÿá†ke¯w4X­wЄ–ÛzOËËù>´ÞC~ÊF›^Cæt”Ø~¨ÿ#¤æº)Ó‚Ÿµ¿Ø@;¢ð`ß;•zŽ›ۊݤþ¼Jë¦Õ´™R_p0>ËqÝ_)1}ÂVyõÛ6œSßqÄõƒwŠÆFµ_Üàœ¥WVõu#>Yìc§oŸ`»gÂða+­œb¿:áÍâR~ÖÓËGɱ'Zñ[2ém6o¬cûŒc ‡h–8,í]§¸Gñ×h×ÑÓw‹¿´Íhºõâöš¯GcÓ&^uû¨}ñ³xßÌuºÃëš½<÷0`|ÍõÛÈ n¹Yƒ&©Üén;o‹ÓlU.Mù}i8µIã6ö¯Çï­é¸-yιš¾æ­>ÑáJ‡GuܶnIÔˆhÜ~ÿqMÜBûÄ«‚±:»Ì€ïVSv†µo•ÿ@›)½¦Z¿{Ȇ[QÞ£N¾Ky¼ÐaH¿A`@­¯}žÏžV2.äFðFÎÌ+žtÚ¸®Q [u‹Ú»8ì,>ÛÉöiã“·ªV›9w"gé–©3¯Tº¶bÜØNÑóÙ/lÓ¶y°®Ñ;×5c ›¤×mºorŽí·ó'´;¿û «uIp1yœ?»mÔ‹ûœ ›minJH,é÷é¼õMáaÈŠÂG÷^ñ&Gdw¿þø'kÎ_åÀêºwæ;—ÕÇîù«Í›´fý Št»»Ï±ïé£t/¾WøC³Å+ïØµDͪ{;Ü&ñ/áø¯lã]ƒ7@[wêà¹GׇhÇñß|}m¼³vŸ¶ošüØáóÝÍSÁ;Ënvµ®nIîÕfÏÆÇÊ’~Øðœr9–5¼ÊirÚ®ñ°$¥C56á5þ`»&_JZF:»ÞvȦù Ü¿lô¸TçIËþ›Çg‡ÞŒŒH#—ìô¨¦ ¿ÙkÏÂ^ÖJÈæöÛ8áiîõì·ÎÜû)þzfèmwÎyæôöTÀÅЭÓý÷ zû¸hŸìò°El²ÛôfÏ*íû>ßåLµCþ¯f t¹ÔwйÒÚ'+ÌôîôSzœuúµ÷&dÙÛUò¥øË÷‹Ã[÷š—Ó¦[ÿùqÞ…oÕÖm+jeµ¦çø€ä>ûÖò×·wZÙ_{ù•û•˜—«Žû-ß,hSè¹>XT£‘¤ßW/僚۾²Z4ØçëÙOù7âîNiî3i¡íî6g§O™~íhíÓs7ß8/ÉÙ´Ñg[ÏyþU¿WÞ–ýìúTe[»[~#Μš1wî„Ò{a ’jLŒ‹jßx/1ôö´Vu$¼‘wtÚSûS?t÷N¾^U~¥aÒYÝÃ~s¶Eú¾~”ÝýJJ¿¯»¨#?Ñû•oSÛ}?÷N3ðLN]x|Àvâö˜©[šäXÛ›TõÌô³-X˧ùézçÞ½µëí²«_ g‰s3=RØi“[̲*´ÉæÌßx蹉•?8¯‘;•\küìƒe½/7 šuKi”9­÷=â¯Ûõ¹€‰#'ê9ìWåSw+vèžêÖ¤¹–=—ÕýÔaTZÿt« Ò\{;ëµß‹Õ‡|ÚõZ3({Èí1¹éù¶U?Þóu{ZíExÁáNܱ׃õÂöÈö¡_Ÿ%Á¼­çtÕ^§ÓѯZ^Y§y§"ßL= èi¥tôv¼Axô®ÕH°hRÃ1_Õ-·îv¨dè ÝþñºB§ú•ºŒz·ue2¹bëhÿš[ž}è&ã$Ô˜_RC¦\Ñ”èwï§ÄEׯÏê÷ëôèÿ4§uñEWoÖö×Mô²^Óy §nÛ»¬ÅúÝ–—.:_«ýsd6 uFgIïspnŽw“Î•ì ¯ÝaàƒýõΈvÛNzPïÞº£Õ¦#õzŽïüJå\Åvl0ÏæuÁà”Y?WÌyïØu~’ÚÇsÿO_Ov[ócä@¿ˆG 6=~ÆÛû¹p Êîhj/‹U·çùY½x® $Õ¿_“í±oȶ3÷'ÏMÉX¹8³¹v¦ÒËãÊî ‡Jn,Š*9z›ìœ$èßK\zM)J{w±XŸ"›·ymµâý«‡õiòåÐöÓ6—w;·yÖîò½ˆÈèæyÙcŽÿ<5ëñZ¿Üµ)?NÎjìw=UÐã~ZþPE·õ:Ü]|÷üæúg#œ¹5Fΰ²` +º‘ÜÍoÆvßí~ÑKöÊŠËö÷Ü8kØ‹¬îÉÍj­ØìÝ0¡Æ¤F±o¾LŸÜçj½WœᯒêþuÏ·Ê´‡îKÏ´Ô{xÔ9y¡ ïwçú~ÙÉó©s¦Oß9¨F(¿î|ïÍÖêMÛõãœy¹¿EñæÕK›×Ž+IÌ^üáìö;[¬y1I-2z%Ž›}ªÁˆÛ£³Äâ/ñÏ–(Šòv¬íxñq¶s­k½%Ò±gnf6(~r[ Ç%ý‡5H‘ºx‚X¸ðüý;‹?n4¹ëD熟W^~#ÕgsËø¯Ÿ·œ}$Í-pé©ÃE÷¶ö-mÿú §Ñæ~“šMÎ׿úå>š[×½k·Äì·Õc²Ý?>\òjÖšùm_<¹¿À§ÞÅzRöùÌy=o@šuðú…w;Ì\›*¹é“TÇ1bUÂ÷žW¬˜\çÉûÃA—FÖêbë>ùɃ™ÞG^\v»ìû´[çkYŸŽŽõ©½°×Äõ£Zþx18:oÌûü­µolÚÀÉÛù~ÁØãÜmĸ ¦î÷zºë»—4~t`PìÑåáaÄK:L·åD‹ÆÍ¼ß ®Z‹Û Y\Zs͉¶ý×ìm}âÕÞ£G‚_Mèù|jع‚ï-%)ù³Þ¶6sñ1·A‚‘Ÿ«WËžè¹)rut±¤ûü^u¢î¸Ø·^éUÙÒæÚ×û‡ãÇUsáþ›šïêöº7:ãrÃÏGÚf¾«üüd‹¤ Ý,œ}—Üøh¥Ù¸±;é_óý˜ìÒÏ“NvX;¦åŒÃO^õÙ~ò]ÝsÇ×õÚ:´ç \ŸOÙ>VÚ‹™£w*:vv»w°päšÛkÙÜzÑ÷Úéu?´mØvFê‚q'‡Nå\<·Ï¾y¼àÚò±óO'öï°÷͘ØR¥oëœØ‚MSŸØ~œ3NwïJèÝ!ý*Ÿ®±7õð¥Œä’%«Z ëÆ«. ¨\0¯ÍÆ¡»{<õœÓª×‡5VzW©£d—÷»/}Kníwœ4mç$ùÉ[ÕòäYmÚÕñh™ãèñ’¡6·.®.ž6êÒc‘Õã€Îûn=Îz²)Úc•~±§zÒ“£ë¥ì:Ÿ[´3jÀr÷ÈÄåo/žÏšò80[ß¹ó–yÉõf, H1i¦c鹦-7HÄ,œÔ‹Ó-Ñc‚`Ùª¹. 㲦;ù_Ntïz¬c†h¹wûKKwžÓNnܳœþ)Sl6ßË›9óIo§o¥û¶o°úŠF=i{Š­ÓñUNÕ>OZë±äë´EÏSÈ¢uÓ9þI7ÒEkV}xÁ[š°i¤¢Ááù¼@ýLîuÏéíO=ÛôÉĨ­aÛ]7´â½íßYÙ»ðpŸUdG·ùôjØaÁ‹ƒs,}ŠgôšöP6¢ÃÏô ‹:œjÆÍ³»2}´¾}èÀIŸúÇtT¾´þ™šÛ2vÁ!ÝÆÀúú{g/o°à”7(þK÷c|ðî-©Qöo©ü]åÔ9c§ý¼®F‡ºß-掚úðmn”‘fçšç殞U¶+Ø.}Bé)Ξ¦ïÌ©?;¿÷!î™»#º´»¼þðîÄÙ™’ýç£KJš´ùâú™¯öøáõ¨Ê÷SjøúyÛÅo‹?5a­ñ-»RtùcáÑÏõÔh5;ø°àC½ÅÚß*õº>l_ÙäCº÷j¿¥Z¯žÝ¯ÿÜ»öážžšÐši•<·|íóÍ¢ßíø¥Ï¸£g÷s+¬·~[VŸ7ï省ÙZú:äÄë„Oøç§:6L«6¤›ò¥ûÑ™7Vœ{ªûò¤ú¬Ò ”ËŸ®|œs:ùiúõ«_T}}3úô¤)å…<>(ãù…¾‹ò¸xÞžn„§·7-ä1–ñx›Èx¼Md<¿Ô¸¸úT$ã©@¬Æçw¢;Æb?‹Ÿ¥‰sI’ÎPß±| yä*¥‘¨ /åKeàÿy$ÆÕågósø9…êR‰@ ¬€2 ™’䫸*ð÷÷ žFš,"2Ü·–Ìíjef""]¾ÊLLÄÏçð ù½ø0苉ÌÈ\Yîý¯ÈŒ<]ÜŒÕ"E)5t “··içîæ^ézçi +EÖô¨ïÜÎý\•¡Íšª+{©_ft]g“¶ž›Ñ8m™ÊӼܕթÕHY»úU98ÀÆé²ÄK4qKþ·Õgy ,Úñp×õ·ò¶mÓÜ´/ûýüùuÏ˯ÆDϺ.eåå¾ëFŒìØgBËò]O}7_ön…¼ÿÛ~3¯«¼áræ‡w³Ck­Hìóvî‡Æ[³y‡¥ë6×àô²]roá¡°#§¾'n>œTÏïq÷ZIk·ç¤'¯¸åÊ?¬¿\mÞ9w_®?¿èIãŽË´OÕ™ùõþNŸ·ìŒ‡;Ú¨Úïc¾6Éo˜\ú|Úž^}[þy×[ÕÉ~A…ñš}ö­«v_™¾¥ƒ×¦4¾ªñ«é¶ ú[T¯}zOÊÄa+–Õ´Þ]Úêñã§;å­fM›ð2¼óý ™u„U-qëÙú)®Á…뢽«d«ç¶n›Ò}JV§j® ¶½8c»X#²¯fYV;ò|IÏy£úZ\ºa÷Œþ~œ²¤Z™µ®ç!Ÿ;sð¬ƒË&êÉÖý;$Ìy5¾~¨ÕŒ"Md\û!œg!qëæGõ:ØçàØyM7·í\ÿåM낈¥ï>ëX-…Q“šuÒw ôL[(Zh½ñÆÈk{ÙgIMãGóæø¥·{èãT°ÛÒJy-{òDåùIË®†Å6¼¢Ø¦˶-ã,RïX¼dÃŽë=­Š«¸óãÓ”ƒ‹'­/j¼`óŒ³_ZLøš¼jWou»âÝÒÚŠ†s붪>ïå²9û†oO뤙“Q’3Ò{mýOÙ³¼g7˜ÓpüÏÄ É”¼vÏæÔ=4xõÅ”øe-/¾Þº'hóí^{¯ ÉÔ~ÒpÙ„^ŽZ£núVéD¿Ì`‹Öaí¶xœ_‰ÛksííA—æôt4í½õ ~Iôb[7| »ƒä忆]ÞOݯË1î«öŸŒ_±¥ZI!yàðKjÔîË› >>hz±Sú¬öã³u <"F r°8> Æ«ˆWo®ê MãÀsªÎiP{h±0¬MF“{‰Š›Ÿ»Ü Ûû±Êî1k»ïq³ìXé¨ííÝÙãwæ‘ÎzÔtã‘«W|ôY>¹Ëå˜éy»ü*»µÝÑSqÈnüÀjIŸö\þ>èãÑOÓWå íß²ÿâjŠ·žœ»î ¸yØÍÃÞ_Õ¶æ”w¨JÙ `«o7z¾ßÿ¾³ÿÍAsöÕ‹¬×çÔËÏUÖm?³¢ˆžýmÞñâŸß¼wbKãq§‡ýø«‡£G½€ÏQV½»½ÚÛ/Ó?°Y ›µ§Ü·Å8]ÄîºãŽÜr™ua{Щ\é…ŽC'XzÏï¸0¨ECî‘éC2n†Ê7V=ùµÏó±â‡-cëÕj°a·jŒ$¹ýБšý{¢È³µÇ¿;8èÈå»çö­vå»qbfW² ì$ËÓ÷ɽ˜}«ºevß^¯®Pôlk™žsôݽû•s“ß?ûÌüÑ oDû»ûÖ Y8Ïk£„õc¨`…E‘MUu{—yëŽ)ÚHZO’Þzíú¹z]÷»§_êáîiaµÝ­ðŒ·¤qî±ê;kîÞ7½G“Ûù¬ãš÷³K£r:hÉÙCÑ.ý–xq¬—oÊGÛ²CµæóòBçãS#¦En¬7[Á[×ÈnÕ@Ö²M{«íÕ›Ô†O±öì`Î-âSùý¼Ý|/¥œ´áZæ™É•×ïc[6f[Ìó™ßµ·}³£}¾ì3©nûF ]ç•9M)tnÇ/l°~ßé•Ö·çÿäÜËü¡hQVnås;Z_8ØuÐÊôÞÃGª-_oÚÔuóˆËÃ׬œì÷è½~õœô!m¶\kF\ìµ4è“Cø€okdõoa÷~äÚÚ°ž¾„××V¯ß):þP¬U;­vÜáÚÚæUð݉yGÞœªqºGK¥ƒÇ“é {Z¬œ•ðpðâíËÖ¾ýãÖ•²Uš·®±cHͯNÛ‚®TšñÉBmÝ4íîÅó>.O—ü¼rªÇ0ï]Ÿ²?HˆoŽCJ|> ª¢ÝÝ×qÄ ÎŽ1—x: òîðIüöÜm··Ý’g*Öºµr©×veìM·‰ÔaäÄØ®.-=v²J'ÂåÁ¤Áec§7{Ö:T5—´{ö|±¢éÎ!s^þ𱊱ˆ­T|õÂÍÐýqAýuË;±}¯ç};ÿ³›¸°Šk{7ëö}ˆžµ³’• ƒZpÞås§„·_¸¡Œo±ûXU§ö¾I‹ˆêñúl}Nwý›ßiP©ÿèz=V-N°µ½g&!e±úÓÌÛ.‘¥=•ô®5¥é”ömϧœÌ{°zWüüq׋Õóß…wOè³¥j# mjjÃàe7® R+ª¿ªÊ¡)#ûÚõï÷ ©N‹‘­KšD­Û9¹iÑáœî»žQÝJ;­ûÜz}cFoªØn‰÷ ®´ ÷ì—’k{¨W—µ¹7¹Ë¬ ¡ðîR£6ÙÎ;<ßâáåóݯö[lL¨èXoøÛl· ä:bŒ¬ÖšÛ§Xx,H®š~õöåÏ*Œ‰K¸xáDzЊfû;;ÅIŽ“ØNíÿWä‹VV-,¯ß¿ÝÝ[Ü¿¬î 2¯V)(Ãéÿlä`‘{Ûê¯vذbf7Ç+ú>~ÝÛwóXÔƒ°ÐJ» è6{âÌYÂÃ/Þ¿ìÖeæò*“ªìXµ0éÈÂg[Ïm8òÚæç{Ö o3¢A§¤ôBÖÔ²6¡ëN&f9®i0xM‡ÐQ£{UŽ{-³Ü9æmÐÔ«S/¥£ö>{Y¦>toX ôú¹O3éÔøúí}­+kö7å/'¬lï´ÜÐz×Ù]ù¡²hó³[ó¦í•ï»ý¸hÉöð™-'Ío!èô¼Í­HvÞ«¾c­ÛmÍ/Û5öÇ¡Û÷Ç-·¯î×ùXÆAÙÖA‡¶-òwjÜeȽî}FÜœûÜöqHP¿#ÒÞ™}ÚŒlø®qõüc¥a=³[,bÇÆ/Mjºlð˹MBöZé EÛvIÊ;7nvdìà¿rœV&N;T?¼[÷Ô‘1i+åuW¯Oó¶‹·˜!©ÝöžK£éâã.*MçY-:´iQë­|êM-nêºÿÛêU×»uSÝòk7óÁƵ-^lx|év‡‚dÝözDraQµ7Koö:¯H™Ìêìz22éN·½ª•ËVïXûôüйýŸ=ª)ÊÌyÓæUåK‡9¶û*éš¶eî²ÕÛ·½·züf޶¿XÓâÜô•¢íO|f6šÖ¡Ú];}§±6gòéÒ®Cf7x—_ódzKl®Á “~À·ÙõWÿÃËŠ5­º=J+^æÝhäÉ~MëÆŠ•ÛxFönøå*¹ÙïP”í.㮵“C÷Ô»¾¬•¸”5½Oaƒ¶–ê”Î{N®[ ÎvŸ˜0dæ§- ãú/x²l‹O|¯ÒZ1­5õÜ0£ÍùІ÷ʼn«»ÖaUn>KÕºÁÙ9.oš9éò"{ë ««N«|YÜ%¬æ™ìõþ‡žllp°ÓAÁšŸï>%¾­¹›¸DÝQä4ðD˜OÎg’µ4Q³(¨xÖò¨*÷Âö¬¹å8N+ývcÛ¹ðzµš?éâý¦ø˜Foût—ÈkuΛánš?’DË F‡t¬ŸÐˆ{gî*vŸš“~lÛ~IÝoWWrÙÅ­öÝ[5aõ:{.;´Q¼­Kßʯ´;srþ¥ý£_]\»ðûÞƒ7Ùd”èsã°…¼¤-.^™™4päyW²½Øoùò'Ûƒ[vüà;Áj‚CTcc/ö ìu°ßhå­ŠN‡bÞÊÜаMõ!¯µ¿]çQÐN÷6ß_Éë=ú0îŽnT‰“ólÕ±sÏ s Ó’ø¢u©§>èyø­ÕèÖ5¸­—ï¹VZõ«O³IïolÕ¶û¥—%·_pÙo™íÄe–Û…þ_øÝ0üè”Çïšlê_Ø {nÿžE‡N®|§Ù³lzô‘3–«j¯&*OX<}jüŒø’ˆãÇŸû%z„ÝÞpñâlòDãÐ!ßVFmØ`lÔŠ,ç«o#z´ήw³Þ÷Ç/Þ×E J#ýUK[WéE,üpMì–þ¬[õpÍoš”ûnnwW¯Îðñ<ã–SŽýÒ‰›&Fxl÷$Ñ?qNå{çÆ\{œK”v›3å¶ï¨]?7®m°€ç‘?z£ÇȆŽU/¸\¬¯.~=Æ'¸ó%vàÔV»nµzZZµÃѽiYK¾q«Ù>ŸjSÛ¶ïX[ÏþñÚ¥òΈFͲîË>ï¶ê;r¢ýh_ ë¤{ã|:Fy7>õª›`÷Ø‘öqgy'«.8ŸZ1bßø‹Çg+†ßh",Íž½IÿmöCÕczÖýRXïégí´‰ MªGcÙQ^ô“kרVçaéÀŽýç]›}~ÊÑ£G—.ß8üÕëogû5òŒÝ}²ÑæÉò×í,‘5²Q«×´a«Õ·zõq˜Ö7Ê#íäwõ”²‘{W¾Ê+¥Ç_½¶–MŸ¶ëÈì}¿~ûnéõ¢©¾Öܳcú%®\ïÝt@ȼʫÞܘ.廪k²wM¿Ûy‹K{ÏÖÄ68ö½IÌœôèE‰ ç‚ÔsËÅ‹›7JÎÛº :¸dý‹¨£«gµ^- º^x}ë˳»'¶\æT¼ÃnAܼú;”ÙyN¼6æÍR;mqoïš´?dsoð ë[ƒDBïë_?Œ8s·Îø)×î8 ëÛ¨@~d†ÅÃyçªP—ânÅO“V9:nÙ‘& E›F¦F^ñwóaÝc/Ûü¸Ÿ»çéðü´O_½©gwèX¦}o®ÝöΧ›gw»}²Ù‹¦j|KÔšÑ,¶Q\ta3­¢d™ì­ÏÀu÷=ît;È~ÚÓãÚþéÛ®8Ó$Æ¿{TÉãNO|¸x¤úù—÷«sVۯΙ¶¸uÉ´ê?=Kf¿Ë_?!qðMþÚì§7%C]«<ëÚÉ*aàGŽÜÂOWt|Yq^R½­aûý¿ˆ‘=N¶]ßB?jø°'ñK8Á—,7~_ãZ•ÔüÊ–Ojp­oXž°üþòâ›ð)S‡ˆ¿Ëfl¨äðlëTA—åÖv³Þ‡üzm‹©õ»fL3ïÖ‡øænêÅVÝúMØîóÀpÎC5ŠECG½zšÄWÛfy£Bv7ÏCæÝ%»VЗ»öí€×ήæWï:+úÈà.»Ôyu^÷|ÌèWϼ£ñmÓmÕ’æ#ŠWJ­Ž·$ýg÷ï^ÚöáÆÒ#:«›ç ΨzzfçèÅC·Ï;Î ¬{é°ó¬q9}&±„œ9d™¥XqÚÙZïrÆ÷|w=k\Óñž¬.îó^w]QwÙô™ž‡,Ø"ªQÔ§™`ïtOõºn”ÿ=þÑmͮޫØãÅÐï÷2‚Õ«ÈáÛÂ>."·i³T±-¸2Û9´s߽͵㭒¹UÖÏ«»>u,1³NÓ3ó³ºuëÜ­sš¸(7­‡x~ýy¾iþvî•vŸëôhwuraü‡‡¯M~×â}èÃÓ¤zú7›Å^6¾Ön]÷rG®hü~Z”oƈþ-ð/Vžµc[Ȭ¶sZÝoÛþÙ¢¶q×&õãÝ8ýæã¡¶ç„ßìý¥ì§àå|¥®xçþ•…ž‹ù6¶þÖž?ÚÖjòtúýJÓù<Ÿ©c Õo¢k<}'öìprãåsn\*ö»tÈÉ"§zàÛÞ7>+ªÅrú¤V{9(÷Øuû»½åï[s+ÿê¥èä™k6çÝl#®úŠõìÓ¤P¯½GÎOúæÌ=òs·Sí¾%/Bw,}í¶ªŽ¿µ0àñ—j{›W*ûåó®‡ –$äŽÝx¢ýÎ5;gdÍØráå&¥Eç}O·µLˆyÝiø‡÷lÜ.:{vï—mZމ)]Ð"îÝMÞ¾GC߇¬Œ‘f¯¼qÏ7è’rSÞ£îuOoœÛpèÆµ?ÞUmÓk¿rÑ÷¥e3yÎ{;^R£ñø!ñÓ”üƒƒj[ {Á¶Tçg¥¤9Të¹ðÓǧîdv_8áħ±ü×#^$\êæ8ùõ¦C›ZÞbܦƓßK \ý´«õî¸Ð­ƒ6\­öH¸¶V5íÎ9A5·zü\YÍëÙÏ&çÔÚö†8ŸíåP',¶{ÐÙØ1Šm‰M£(ZÏlwgcé³½.¥Åx1hѤ¦ç»k«ïí?Q²¤pÏ7GÞ¬+~/N|žéë—ÔèÑFéúÑ—º~=ý¡aËÍj ŽL|×îfDÈÎJû6Ö ™ýæ¹åw›¢Ú}ª uرãpéÇ «½>6µ…u„ÁÊó{ܱŸfw‘<ºóþiðOVìÞ²‰ê+âÛµzŸl7e@YIµµ‡Æ¨*g­øàù3êÞÓ37.´j~&{Wj¥TñøÃµšs–¿¶:±yweÍgôw>½s™3tMü¶C]†5Z¾ [Àñ#·¥[ß~Í.ú¸7øÇ¯ëý¼ŒxðÚNÐg¥{÷÷¿ôsÉêiý¿}xjèÉ#])Ž!;δSÜýÓ£×ß;±úÕ‰aã·4=Ðñ–×ùöqK–Ø1åÌÓZy_~}qsv±bùX+çÕ×l¤a‚eNŽR»·w m±dÈ’ê-ï­ãìеmˆ°÷,aófcÆ6±Y‘°!`sÓ7_ŽÄnZÜ{x@ôuÁ"Ù²ýJÏ~7uAëôÍ¿·GÅ”inŽþúWL«–Ev½×íùá@Ì»Êû¾¿øvËġ¾aí×MzÅyè'N­Wôº]­³[Ê^YqdU¿5yï\·i½÷<¼?}áåÂ'Q{ÃÇ{gµ[ÔÕbcàä–>$½˜[ɪ˂û\5Ÿ\õÌîµiÄÀO_¢:W'&’o6ÿ®÷ÍkÊ/÷Þ>6Ñ£é>uš»•ÎSW¶¤îÉ•=ø¹‹—Œ]ë;Gp·žüJ¶¦åõývgÆT¬xæXkßöŇVé|j‘°šMñ×OcKÎGö",]ÁÞ58Zíã6S¬Ž¶ÁŽkûþÞ_œÃÏòÞúÔÿgÛÛËcKNÖݱvñü“gïKÒ,6ˆwÚíV:PóëÓ÷÷Tm\éÚïVئçÇÔkس‘ûû¿´­‡¹L\³çhç· ;ox:¤÷ŽÃ¢7Mû~¼¶õãíúÑqý~lÌ­ÍfÏåB™}–âÊŽ^BýÙ—+ª^{Ù WÜõì‹!ªŽeµzzýñ°_õËA5Ö-9]¼DR:óü,ë÷göN½ÖÔj½*woÙݧScj•^[rqLèØþµî•ë5,(¿mÔ貆OÜÆù„Τ›~ (²Ÿ8ðœâá ÕìÏÏo4ön˜oÕkåP·ÓUÜsŸÇß“®T ,û¼o䀨j r,²øa/OxeU¼00O4›Í÷±îÔ¤ÎÑUûòo¯Õxjn‹!“ÇTÏ­EÌ)NëY+CrÿÝíøfñc>–~“vt&Eîì»Gzê7¯ÙèÅY Öé>´ªýUU}â»kå5C®Îfª!Ú7РCH‰Žbü*ÜÜ=B‡Žj¤i!²Èl™ÒŸórÇ!“øs’=¢£ÕÁdŽ,¢—†Lè“(î•+ö‘p:€Z"Ð1É-©a¢n BjÅþìàø¨06,Pà[ P+À0ˆ…\©õ-ðç *¾à;|Ì稈.ן“c¢Ëse:•çÃsẸ9RHA¢ ‡.b°úíB|áIqöqõ(ÚŽ3Œ¨Î§ëoJP§Á®¢óbÏ8|hH)Ë™pua93ÿO7BJPÏ\|<= üFI=sñòòò0{Ê9{•{æå^îxZ¾®—k¹r®În.åžyù¸›?óñ„þÌfåܼʕóp†®±få\<Ê•·¡[ù±x¹–¯ë\î™›—K¹gîåÖÊ;,W×­ÜX\<Ý<ŒÚC©4I Š!ƒ”ººüx•JG Ÿr‚©”ªW 2„Hëäíéìì.¸¸‚<‚¼}¼CÜB}܃_"ƒ…bþˆ4:,.^ØXíۇƆý/ÆÖÿ?â)°ÎÿAh,/_Äÿrñpss†ñ?=]<¼\Ü=Ý+9»¸¸9»ý/þ×ÿÿ¬Ûü,™’¯ÍaYÁ*…ØÓÀЕ*oŸ”Ì'Ô*ÊD&‚qÎ)!Âc’`ÀÆl@‹ky,¾¼¨ÛÅÜEn\g®«7ÏÅͰ&’ƒY¨:̨]°= µ Ý݉0 I t|È0TŠŽ©ó@ÅXPK¦D ÃTf‚j"¥“X%Óqà¥FBtP£Ï@™FÅÓƒ¹ÀËW΋œPg<8M9Œ:)…}Ó±)ýˆB•ePÕFñJe0I¼„4ÍÈt8†1Ž›NjZ*Ì&Z™pRIjDr"…ç$¢dbR ã—jqÀN-Lš›~5{?:Ü<}i»:Áð—v"¥†P!"É´£iBû0¦h…35LHBÇsÏQ©I}†˜—ÉåT¸Q©^îZe‰äÈĈؤDB“J$ âã1‰©~†°œy$nÉ<(' ýiMD‡ÆG€‚ È¨ÈÄT8ü°ÈĘЄ",6žq‚øÄÈà¤(A<—›Ê#ˆŦõ³–R´˜%UnC-šr*Ø=-˜\BäˆòH°‹bR–†%Bñ[ÿ~‹àbÊU0« ~5¬ Sвµ:Áä(D#3[©GD´·¡å Á´ [:3YPr?'ãì0hÂ,f.!…é“ [NFÄì/£V cÀ‚~A]ðC*ËÖkp(]ŠºÌF=êø½NK9!¨Wˆ`º¾”†n Bµ0,­IHY ñ¨SXWOm, .^hð’^< ÌIߨX\²'áì +aøtqŽŠp °u%؉šB‚cãLp¹9¤\Í1ì±L‰yÐ5V)ÁÈHR‹…"áÛ¸Àð¸à—+ÓråÃä#CP à-ž1<6"jÖ8ãŠhŠs/äç踡€Áy¦D0m=…𨆨e[0©QÂìúìœ÷ Ë}õóÃÃÑè•ô‚{ÀŒ¡Z¤£¡‹¨FŽr¢£\8©ž«¢8Zt÷€’­wÓ‡‹ÿ#Ñ9þKå%A+ËNgM‹E!b3x</ˆ&ÒñáIÑ¡1‰ð)‹¯Wœ ßqœŒò+ ƒ÷ƒH’㣈¯8á1$$z’–”n(‹„•è[‚ˆJ§:ŒEçAë‹æáDm:eI«fBÆ£Ç0L2\_X8¦‘"ãЪ*¢ÁŠ¡+aKK,O$ד¨w‘Gü% °¾å"¸ø‡ÂBf; v…ÒiÑ@¢P$ãHådþù¸*DX»RÃÕê¥RY‰àLMd,Âza†iT„0 ìüä ÐÑ,N6¥à•e+U0ÚÏT S¬v̈›¥‡ŒáB þ:€ß\zJ à± ÐlÓÑÚòx¡ÿHôGƒÿj©ý©b¾(‘b°ƒ˜P@ Âþ—};5…±…³/ÀR¹JU>\u!²ÍËý)Vað Ý+©‰!"‡'®$JyM£4x&$J—£ª07¢ÜDl›@¶øå¦êÃ$Îà¥^,&I PžÓ&KTJ°3+ÂÄ-ÂtWˆ\«Â?•0»Ö?àIƒ9cÀDòEZ%G‡SƒÛãhâfõQ./ÐŒZ¤HÅf2§ ÅÜFoÀr€þå²\X0z8©#Å:c„1PTèo]¥ÉSÆxØL÷42¢¶S«ó$ µ¦¡ð´f'“³ÜÐàlŠ8‡Ž? (#°ì9*Uji|ƒÈt?idøðèQ€xð± Žn Ý’PˆL@|€oPt51áe©)e ½Â@?1×µ1žnÌ…¥Ðfû³Ájdû¡Ægl)7¯ãâêÅT²&â¨õƒ¬©£À£[cð£“v8Z6l¥1­ŒÓÀcÔFŠõ(ä=¤Ô0T€U pJèÕ<ú¦ãAw%ÀÚraR|”¿íŸ!â…1–ñ[ø›‡ã ‚c’Mò”¤ŽÏHBHSËæmÑtýôˆ‡-¤h4Âç1º´qr „ûИˆNû…ÑŒjŽŽ·1RôMHÑ胀28Q6éË6i¢ƒù°ùt_¦%#PÃ3ÇÝ:¦“à/…;Zû8°pÚUÄ€*zåŸu › øÛ’ w~¹Bô2/üp^ºÕ>ôEÕÇp}ýk‹‰.Á´˜°ÿOVóßZ¿?_„hŠX,ˆ´…­BŸ5ñ¾JÎèu@™R<<=Jº˜DH•óÏĽڸ°‰>DL˜ñ»Ã»™ÏÞèéoô‹“ ¯3µF¦ÔI N{m:ÀÒl´%`+l6×/Ni‹¨wœµÖŸÍaðDb$¤À:Bd¦¥‰vD4šc3g­üL˜ÃGíƒ) qR*%@sJr:Š5Á|0ä÷L;t2Ý›_R¦ãÑÍ1‡§<ˆc€þW H34T^\>ÓÚ˜.÷ïG‡‡QÁø >ùWG êÂ…â‰ÿæðà(̇쿾rÔæñîÿÎàð(LÇFc¬ Ʀ@’"ÄÇ3cÁ), ù\(¤B°e|Ÿ›â4݇냞9Õ,½Lþ7°ˆ*š.'¢÷ú@bÿ_\RÁárÐèyìòœO¾Ð0`˜€›×ÁÄ44rB¼Æcf4T¾ù}nv‡>ð~ÿ7†/ÿÇÃÉÿ¢Ey-R$/ìvðWS¡Éó±ÓÔ¿_DÖ€öþ€~¥ÊÇ‚û0£ů ½aX*c†ýÛƒ“ûHõ´ét‚xXŠ4ƒ¹ƒ°d|¨ $:”†™Ù”1¦#å A¸*†|OJÄÔBža`­ &X•¢¤¢hu@oæ8,Àè“…öQM’¹„H‡$ÚpUEqäf`«psL[B{„–ƒ4Õ¨AŠº¢™+cº—÷·´¢‰Ç«ã8~² >&2&Ü—àsLQ‡ñ?XÚÕÉ–gžò¶®ïŒÀ." ¯xúŒ¥„YL_†àp‘”.†;h&Cl dŸMÞâË’Hôˆ¨5ç¬íy,†1­E!éWžH#ƒO­/xDæ‰ä¾„H"áæ¨T¹ª]HhÒE¢àrÔÉ$ŒY¡†*Ã/.ÒûlSÛ´–¼€Rí} ¹í]ð„þD˜•D_{©”$(œ”lö rðœÒ1Áw¡àÁÿÒÿZþ'L *ï?­ýeþ'WO/”ÿÉÕÝÕËÍÅê=Ü=þ§ÿýEÿk¤¼ƒRg€\-ÐáAp¸Áøño¨siÕ$&@Êi`§U!ŽÖz¥\¦Áa«MrO"-¥«5QàBu&Òº@™)u{â›¶ÁÔáZ©þDÔ½A%r¤åšÂ¬ "È£øGZBë„lµˆà`š2*- '686:é¸ v¬4Ú“Û œ¾ÞT Eèð™>Gm±™±€£Â…¡ññ±€2O3Ú¬„B?Löâ‰øK—;Ť#KV¬2‡l7,ôõ`ŸÀE.1†(y!/`©¬b Xðßp|1F]tØá J@Œç€ëJr@ºC<›§p.t:Ræ¢ v>˜ÊÀÁPŽað6t‰Æ\—OÛF9ajJC‘.±ž2_)s‘É6 ‰oÂÜyN4¹AÝŸ¸$Ø®lÈ‚€ï2RÁ€tE®r ‘äy!7˜¿A+@C Tvƒ‘iOƒ<‹0L:1æ#hë0'Ü­H›‹ebJ° ðfFŽ”ü)$4.4&$4&824¡Ä_c@H"’$â‘°VZ¡†þÅHµ€ƒYÍ0ÞTí e³Àß”øÔ)˜þÄO’âà0dv8xk&C!L!µá:Rœ£”õÔÃåVJ(ºD„l, ;+‚ìŒ+/KJ2týddHÏÑ n ºu­Z…Y@£uB¬1'€ä; dØOkùe ¶÷3P›X¸Oˆe±Ñ Ë W ƒ öÀS¡LÖiÒX˯Ñ+d|!GyšBÈ»Æn| ™®9ƒ…S  eÄoü:6)1.)ÑÐH*ƒF+,ŽdX‘1ÁQI!¡ D+îŒßšÊYƒƒáåG¤%‹ýÙ6`0+@C›PЋ¿A KUKIA—&S ÀÓTƒ?éj"ËWãd‹ÅnøÃ©¨ÔµI°óЀz“ÁÃSðƒîdR ü®¨Zýšþc€7WEýÚ#ú8X*ÿw¶K3:çZ]¡²„ j§|'PÊ/Îw»©%#µ†N`|!•&·± ƒIR¨Ñu,…D24¼TÃÊl#¯‰dÉ_‰:Våv«Õi1J(6~É—Ôy]t͘DZM@$¥ÊÖkmFóiܽˆ(›&ؾâ5$ä.@Óa* jY4A䵺"-åJÏ0l œÔˆ8nR ö‹ñÜÂ.?!Ñ+…øÎ†Æç‚Âø™‘ p¸Ñà¾&ØjÊØ ûºQƒ!BØÐJ]£ ¸)â`<(° E.\-³‡˜Æ ¨uFè¯*Ý©ÊxóÑÒ u¶4Ì'9ìBÓ1bƒ€Úœ«M÷Ó|bIù%SW*%ÑÈÂBS´ÛFÀ…EA&Â!šåFk¢Cö¡Z#'&™’ _%uFÐ ý7µxo™}Em )O¢FïéÎÑ`á"ƒ ×:ØØ<åuh28Õ!7Q¨0#‘A%<@øDP4”ðÀöÐlé}5›#j]bzp‰Ø0]@Ñ€‰ ñ™4¡ i¼t¨“MÁ–ºüÁÉõWª”pEèÓ‹vÔ° ‚m8¬¡˜Ld?§$Ò8Z~wk‡t»4·—€ÛÍ™ë“ánooÃOwá«9D‚ǧÀ%´ˆ{ÔšP¯”Aí–Hî/a~ªC=g|¯ ÎÓ•Ǧ°øÖÃÚË!àBSÂtãoöfè4z’6ÉD&tÃè"ø¿êÃn$æ@“&a“åVÚ )Ê8ÔéÕð `A#"ÁPžl¼“Œ kHé¶´THz`†zD&ÛädÀ!תÉõ %áíLØ¡nÒ±ƒ!ÕôÅâ• Ù nAsÁä7 làq§›!¥ƒÝ™­©¦’I#1ŠúJK›»Âå!é‡Ñ‰v‹eÈT…¨j k ²T¤¬B¥ød`ŸAPWF{ö«²´b(üE‰ƒÀ—Bf¦hC€Ø7¡5òÙD¦*ŸîWò%àÑâ3hMŒ#3X¸£.„+áF¸„'³—”+Çšöºg£ÚZÇFÆáå°9D@…b‡v8¶I·Z T#ðR|§Ñ[^œÓ$¨ÀÞƒ©º8ÓQ@x&ã;P—”´_5ï•`Áø‚ô†àNͧˆÀ?Qæ¤"“‰Ä©Œ_±Aãð•BÊ2å“Ãs(ÏV‡‰3 …d%ÒgKDÚ…V'X™Mµ›×@×u-í•)J.€0†‰½¨%Zr84áU¥ª®†ƒwÂÔDŸ>È 45wWªàõˆoGÃHRIéu¢l'@øˆÁÂË´ - ›”Bt±rqU'Z§Ï‘Ë™VÌc[;ÊðYàö—Ah5BBM=æj+°!•@0\‡…Bh"I58£‚BRKÝs–f“BR*Ë,pær©'èî2öèÐæ‰½ˆ>øS¡-Ôâï2(7«ÕÔøÂl_˜mÀ„X¶bsÅ !!BÀ†¤M Tx69"-Ó\6È]’:,x×’ôvãu…ac¨ 4‘ ¨Q¢Gä Ô‰r™ã5=”ÅR"™˜ Éj‘Øh‘iHþ%›Ã±9´(I{­/ý™ëSûGMÆŸrÆ._¦HLQGþô91õáeão†§B]á«DðŽ©lƒ„͆&ÀfÙ˜LÎ Ÿ{€Êy|¥t®LR£l]*pæ(Ý|À„qC¶.¿©îù/TgVîT´é e\ÈÈ\-ä÷0¾/Wɘ˜„ôF¢\Á¤9Óâö¦G…Â× T Vù[‡FL¥ 9ú@„f]y¿bº©Þÿ˜· gØ›hcBBã¢cCB)±Fl"d­˜ªÀ¦T!Yù$ñGw];pÙ)1f£¥3ì?¼%¡< ²43?,4=C7Ã10¼-r§x!šAc¨‡µ*fVznÍ…¡XéQ‚Њ¥¤Q¡‚ȘpaHl¢¹ŽŒ®G¤Qä-eô ”¨tEÐã™m°üÄÓfä f³6“AZЇ$ˆ†Æ‚¢B¥p\zkLÀ%Á]'LHŒ†¼g—‹w”[a5XB‚ Y5$¼ü-Ô¨-1YKƒÐB@ª¨}‰Lûû´jd8SØÈe rjëÉ, zÌ `ùkÐé+R¸H––0!JáÏIçPR%89jøä =¡Ùá@õà‚þù°Lªi¿¿TŽVTÌÐ3Î_Ö7+•„á´}? žC)HÀºí'=vÞ¿`1ðߢrþVÿñ·¶fz˜ßhRÀáÆ1GbQ<7fë H!.ŽéG]Õ”¬#Z^C žZÄÆ 4ˆÚAT» üÑ‹€ÛEê8`ª0tšV$%aX" àØ·4Ž…¥È˜‹a_I4$**æ)åzXdThfÒ9ö¨ wàr0.ÄÆ$:(BPïMÛ0xÛbÙ¡p\RtÅÒ".d_†ùJxn¿ [‚büѼ1—%eb³(¤Æž»Z¾/ÏÁ†ÏçdRÍ›Eû£ æ•£WƒS­x¥ˆ:žA>8L­È¡/2= --Ðg‚zÈ”˜c££Bñ€šT©å˜Â¡grH…œ0”Eƒ N\=o)d=У”‡öÿFÆŸ˜>£5Œˆ«ó5éM­Òê¸ÈÙGK ‘`Íh¤hDJ@IæãÑÁTÃEG¥q-$‚Aë'?G%'ô€ü™T* e²ë‹dhˆÐƒ¦p"Ô #›8öäêìîM³¹Ú$hþ‹55HóŠSkëÐpi!»³³3æ )Ù3GëÔÝšç`ú’ «èà”â¤æ0@ƒÆ”R1É¢cj`Ä$ÿLpSÂjÀíPu{ `F4¨‰¨€¢&¡ºn)¹?í@§ŒI 'ÂHˆ†ÅMŒ¬Œj‚±°fà“±€Ó+OŽãà¥ÀÍ2²x(ŠÇÍÆçƒÙwÀóÇã7¨êp!¤¦3™‰ÑðL5zþ7-•¬¸y4Ùr£§6mM„A5„£‹’­¡3é„ý?P¬D:‘!˜Õˆž³=% ‘iÐQ†‚½d’¶ @?^+´ÞÃ0yÔùF†`²"58kHp­Â\2–e:–PÉ%Ö鑾\ORÓgZb×ZœL…í 赡€%2^V̧£ƒ³t—ÐvÖð†Í¡ô/Dú¤³,0g:3V>‡?›“i$ŶFPH '5Ó =O@U‚‰¸©z©#Ä·“)`¢ÈvÒè€Ú•Í  ý„Ñ¡‘f`œ ‚o1&åR€+oÚ±©˺¡ ›]Q9JÒ>Š-ö·$Å üëD†)Ïcü%‹dìÉTPÍå"“™<™Èˆ/2¢Ò©(£4´0ÓŒ×wE$4ùÖR´ ,™J{MÐjt#pxq£ØŠùX™ #UX°À„yËR©t€¦©Mõž…†Ð$b$b6á•~O_•7D:Ý´Õ&õ Lí iÏfCIõßq”k SÙß´%b¬°)vØšQtdìî¡Ò0ôïß7ôõüï0ô5:ixFj…S¡G1C‘)Òa 7. " JŽ"lÒ¡bPm1©Ña±”‚6‚°$ ¡è†‘‡’ˆ,Y6Yh ŒÜPãIÊáÀȺ Z*šDR0²%£Êƒ…±&þ’†êÒŒýóè§ö¬4³úûqSoTÊAЉ <ú“Ë')2&4þ¢Th脌?¶6CQØSo1Õ="Z—L†·Á—$ —Š‹ U?¬j§ÖŒK<וçálïdÐãÒj@)bodèà‹»¡|@OZ‘1$ÚìXH8eTÛô`Ç Êç +çé‰}ÚîÙ… ²hìZF ¸£uØõ©±¨†•dÎÀThHH¢’FŽ~ÐH ½BZe.2Ì¡$™ö‹)@Ýÿø¢@[$0‡ŽÉFA‡BCç#D†¬Tô2m@bº|8»\lŒ‰mó©_Èí– g˜;è_nH¤ <&6À º&‘:ÒÜz9èòU\ ³€[Ÿk"„¢ôîÏ€½„0É£ã²à®Üè(.ðâ+Ä.M©ââ;ö@1` g#?—roÚ¡—œ‡iã vL5¼NH{E-æÑI2¬’±>|OÇÀ¦d2)í|O»ÖC~C•›aï[a £±ÂBH®Êõßh‡}©HW‰u3‚j 1Ò4Ü:6 ³¿_AŽÑpˆGâünM9å‡Ï¡{@¢çȰ 6щ‚&D=“bº$Å&††˜ „mCý`Ã_1”hŽš<ÉÕ7Û†úêÓI”zX߸%j¬Ö˜¾Ã‘ ™»¹CóÊ]°ö©Ø²¹Â˪\¨œ Ôûh!å牞ÃBQ±ÁÐÅ‹H£E¸X dܤ«ßÌ*R‘PMêÊüU9|çârp:ÿ ‹ˆPAHh<]G&®¨,ì"2&,Ep¢‚hb•†ñ‚_ŽB#ůË$ÆGÆýúž¥tÚšÚœí| ëg>LÙ„¢È²dr€!kIEæÅTân™]váùð PV›sA Š)3^”Ô¶œ­Á±ÁU=Žé\=Ȱ‘‰RO…–äçèr&<°Q®\g/¾B›âÓñà뀫wªÃÉD¶¸B5:™6vÔ2Á›œe0†åç2$&ñ3à–„¶š:%Šrµ²,Jìœ(ˆ´´Á²Çv>ÐS‡}bƒ†ØˆŽ!z‹ƒå"Bò¼ 7NÜù7» 1)@Ì¿$ÈÊ)SÍ ˜WýØé+5 И]~ Ñ¿%uOUPW-*(_>Dõ,-  ¯ó¼2ph±ŠA©M£)*4Á@%Ò.0( >ý&ÁàŒœZBSBCS?U;P ›àÀ{¿ã»¦BÂ{ðFǾã©2ÈÌ U:r jƒ1É€qaÎ] ‘Lδ2)ÒÈ qö4äÔÉû•ÿ.œ \eµF•ˆeäDVÁh°åAE†/ô{Jê¥ä6øÛ°Ì0blBd ¶ÓЍ0#R½ ²iz ‡–§”*lhõ#eS¦ÁÀ ËIc;ûѶÁt€h% ëÊ(Fº{jµz•G‰R’ÑZļ‹ejÄA'RÚdgkH€ì©ÈFy*Œ< !!I÷,Ó¢b”€Œ1£"Ø”…'˜±„MÇ.ÃÄt”w èE €Þ Lª«,}¶µ‹³·«7²Â¡f ã°©ºuódð."° 1¹F-š!ê½ ØDÌêá¨шã„A¨5 £Ô$(šcÿG)ZÁra×I,;ô£²!×J¥L·:h˜¨uPæ“´^ÐBö}ÑÐß4RÚˆ m#Åæ¾Æm&:tà€óÊaŪÔÚv,ØQc:TÓ (¥7²¸´¨«Õ¤À†ç„n¦,•’öb`,ëœpTO&Ň+å'kÂi—ŒÂAµ‰F¤)dQaî²H%‡”â¤N`rtšNÊž¤#‚ · ÊEûE°,Aûø¤a¤š/C-†<* ²Ô6´(1PžŒÌç©sÔew×+K¡`Èp¢¢6!) £“ĸšceBlšI-ãá[aÖMZ}ÁgÚFù7©x©4&F¦µ$v½‚iR>X;€Ã“A> Þ-€z ,ÙÑ(ód•Ø2{ðë}bÑÛãDÉ¡anHã¸?È™‹ÔÊ#LÊû\£)äIË¢¦‡sQ’ùØ ÄØ½œc¶Å/&å²,dáÔLÅü–©°8×Ð ÔàÐ2)€Î øµ"¢|:ÊGÍDZ¬þáUpÛxz»»ðŠ6í`d¬àT@Wp0aÇÃ>(©t|´âœ pO< Lû˜:XF¡Em…” $ª²H:‰EõÀ€&iTñ¾ê•”jD|ÆAÙ)q³X™Á6 ýXÑk{#â¨bʈ (‚ìÍM$·Œi´ºÁ┎…ùÓ«%tà`\?‡²¯2Ö‚;H&ÁޏF©ay¯Öè€Q°(“y™Q¼d* ꆎV ½|ÜS¯JdR)‰<`±bEEÌ¥ô'0ì \!C0i,FÄÆv&ìÐEJj¡M:@r•J /Y i¶8´J…ðFc×:QFh«Ñ£M KËhðØ ÝÄ*𣂒M”k[´¹pàRJÈä÷‰‡#¤ú汄0””&Û߯}E= Å*½Rçï‚Âø”JSZ¾>´ˆGVؚϤ,Â46TûD櫯A›O˜øÜ›Gl³1{L8.™Fö~Èn‚Êÿ!;‰×N¥a:ffô‹ ûL>iæýü"ô´ËMà+3™]…:\ƒþÁ†ºŒ…Ð×ÓDh.û+o'o=ÍDy¤Þ†¦S„Í+À7†*Â`hˆŽF›”àê>,©<8†vŒöqŒ#öQE¸Úcrú›ºWeÓ°i¢·1´ð˸ænÿÀ\.+6²¸”£pâ( %a¤LÌY˜ Ì®Ñ g–_¶1ö&3k‘Žebæé•ÆåfT°‚iÜŠ«#|Y®0jôr²‚Ø=TÈY©žö×Gz,Œ’„T€Þìé´ ¡e4u'“fçÓ’BÍ·ÅŸrãÊÉW*«ÿ+½“14+Uðo!Ü{C`ÈøÐ€gÀq¨ e´ƒæâèrÇ‹’IWÔáOR€€ÞøÛ˜@Ʀ&VA¨¥6`ÙnmÊÎFô£2ê oäáÕò,ÿ´ÿ7÷‹!Ò]…×IE %üfËlŽlBèá4)°–¿±ƒ< Iè0e :XP ‰J¦óeY"FŠö\B‘ö©—”†˜Å‹‹ˆIõež#á’5)5„èDÄ+I÷G-–Q 0Wœ§JsePôÓ.Ii íI+ÚY1(™ô M#¸…*Ȥâ>9€uIgÖ8Z|ÄŠO—úd»¶°0#MMÌ’…"^ ~æ'ÏG³J©pö&1¹ ž4þXYƒ‹Žy&á…à*q ËD‰ù“†Â€_ÏÛÌ=ˆg˜»‰g;M¹_­˜-Ë(ôGyÞ̨e\¦]ÃÌ jCûà%ÖþÐG‹ZL°‡Ñ†¸Èi…Ê kÐ FúÒТˆ«ÿ‹ÄmŽ< p(nJnÿOÜjÍZª@A¿Ž„L|R ØFÕ™‹õ©°þB^YdãÊ.2Œ‹!ÍY+#?a²H5CÉ¡ŒP*±)ѹ¯±O$˜4JÊ“‡10zã„ÛšŒnv's2bDÚ…yæV¸>ôü™ÈÆP½†Ž¹€DÄ£(/Ô¡úø÷$:ä_HgW iÎæm03tͳ‘‹2$é˜ý¨:œzÁf2Dp¹2-WOj>‰=Ë ŒöÆßP…m$00.a až`»4õ’CàL¸˜eT!S|h­F/9&~ åjÒ[ »PÂÚ=Š÷¿¬Kƒƒ„ˆÐŠ ¥­¼~ýÚܙߤ.. Ä(80ÞP˜ƒ~º2#™í! -‹ÁjÜ6*˜ïï °~S­Š!5\@[`1 ˜|eŒcž‚L2» ö”¶ªD°nÉÄKµA­(©X“\gÔzàqp°=b‡a)c —.³%P¬0>z±qèèS¬«ê— >ÆÆ9pÐ8‰H«ÈÂ?8ø—ºÏÿ! }~)Óä_Ðài<àܨB´!´PbAÙ• |ºBü›ÉUÙ`À†<ÌtFgB$©™lÎ4EÏÁV.Ôˆ¨4ÆfY˜©—(ÞY¤*H_›¨È˜Ð˜X¨µ`¶0pFhBôå…aHæYâŠÞÁð7V`æãoÓ‘eˆÿlÖcºMGÂ%LÃ…Ý?Z.CA{?¢(ÃTž­0 2BY=ã\ƆxÔ)±6õLàÙØ®òÈTûnì9‡ —Š]¿ÜD?Çãxƒàî€ÁÈ•ãÁ[Ú*QÈ”‡“B’ È`€¶)ƒADD ¸¥dªŽÙ ŒjEYtv-£|>(Ÿ\êÏaq(‰.ôߦDiiéééìtët›tÛtN:’{Ê¥”ÄÁÔö’ø¯Ç†F–aO n±8„Îèù›þÒ‰tËß÷I5‚L } ©| }á˜"p¿p˜¤Øæ¬á Q,WeeQÖt. T åªbœMÁâFë)‰;7ŠŠ%iÁ ™¤Íe¼ DÈÃL!—)sý°O¶¡ÂÏå“2pÁPÒZÀ—@±!ÁuLՅð#³ÑéÒn ‰£µ›G®ÂÁvï"ijŒ²\Ø#Á8’PCS7€‹´r0ÅCQk:œOÖ˜^#ÌìÒ‡õ|‘°‰i†V. ykà¸Kà‚O!2倰ŽÒ•2‹Æ6­d*Rg™†!·IsÈ@RüZ ei ÷C"“ÀÍ„àÇcYõøR}ÐAÉÍú‚á Rˆrm˜6Á†Q¡ Ñ`*šN­üP¨YÀiDJ %•°yr'†T¢i¡\·JB®eB A›}”‡¶ “:á„ ”‘AYWâàÛÈ,Z›ƒMÎ!ô‚®Pt-X—išÉe"­!€šê¢{E!é(0‡uñÍj‚&[¥=+ÅÆaÏÁ¤¡a,4^eCÈ;ez²ñ†ÁÆDd<3Óg=KÃÄË£×2 hÌ2%6N72mÔPÁîº"H2Ý >}ðkêpÉž„« aÿ˜nÔšè¤7 *š8¤špaô:†Ó†y#&3ÄoÆ_Û³ |Bl.jÜ—–¯šaFhÍ^H±fæ&V¡°š€$P]žTh·v,L=ù˜@Œ(ÎÅBW3UÖ½3JR|æÐ¸1ñäuIØáZ 96#ÛÂÖ`KË’ýÛ·®nµäÞÌ~™g–'[ê껫«««~Uáût?Xð¾ªlü¼ÅqüνZ¹âK%Žjx(Šç)6Gq§.Œ¼PꕊÖqà7Nö¤I›õ±û0iNÜQž2¨r…ºåSÀ–ÈÁJ;ö„Œ—3ã;´³³ºMÙ²ÛêêÚ±×Y3›däC­/U–Ú¬9QÁ…)&mIÒ§l%S¢B°ÙÚßûp’ûú5Kð™Ü›ÆY&÷1ŸOÁ‡ŠD7ƒUŠ–‚ɳøÉä,?cØ“½ºÊ£û†6߀£îÂíá5¦í;È`yr­oL•`æDV\CˆÃÈñ¬²™Y € Ûi;(Ë2Ihœ|&-@‰íì>Öù=ÓӟΛÆyQšh3óÒ$³šŸ(f“‚™ið˜xýÎL¯s\B—L3—^ÕHçÇÂ=®>™èÿkfÀní’xçé»*ú VàΖ>¶²b¼š•¸3ï/òlµçó3r²ˆ ÀæÁ ç¢\=ÈxHˆèmχ%䆆¸KTtRAí³sŠêã mÖã#ãÐÅùM«ÐàDM%0Žöù­Ë•ûŒâ‚Áåu%Xñ<™ú ’ FùÕðJ?ðñÀmQ¯a?jþ).uXáÁ=†Ñ!›—ˆÜSðpúÖMüfÉoÎC?>Ê[Ë ¢, zí9HÚßµ}~© AÍ^ÚÍÅH‚Cƒ˜(wu‘ <•àðÔ„‘Û'ã,}ÏFžþbÖAãÅÛ#þ!¸§ ´ŠtH+RŸ„·€èv2hK¢øD`çøTˆ"š«ëxGp¨3²ó]žåª E^O2yÏŽïepk o?ªN+š—´M$mn4 „ˆïm4ËŒNµ jRC!CpKÇͼu~rr˜û*Ch}¥.ƒ5:öÅFXÝbÒíLäû•Ç;;L󎂈Á{ŒÕ"A—¢•K鶪`¤ƒñuÒÀw¬2áñÓ·zt™ñ—¿˜åÿÕb³é|{²ÆS?ª³„“‚óS§›¼î;„‚åE•ç¥K^èf¯â¥Î1§AdúK ‚û^г[ð‹KÁIÚÁ ¥«ÔKËE²jvŽì~d,ÙGBH,(޾ $*îV¥R)&gSíÕ/ó>â¨üÊ ƒ›…2 {÷KvL @†C8xÝ09ß,„µÕ¥IE65 @˜õlÏŸbÒØ]cëQ0AÔ³`âY‘P<Íl*#¸ÛÒ&@8öu³öwÏ”éŒLŸtÖÒãOù鲓` FQºÙKª%PúŒÎCÕímµNÔòòBm]MlàÆ{p»v‚|tݰdF3Ôjs§M@í«UÃàèÎÑdŒâÅÁ[e¢a½?x‹Ña9Ã\-Á]^¥BÉ æ _B`èBñß{0tOèQ Lh¶×Ö×t^Z ±¶±½/™ns­©×­¯Vv¶ªUHºú jl+}ºJÓC­m”>¾1£“ÁšDgk,OÞ†´mØF#˜¨½l\Eã`3Þ8âäwsÕ¼êè¦}D[Ò˜Y#2"ø†Î†Ý0˜°eðH9U2ð£Æˆ´*×)tÕùä„ës¿ ¼® Å9vÅ;)ðÍ~Ä>¼†Tö¯6èO‚ƒ^G‰z*QoQ¢…·ÛØÅ„;0ÅãͶ†Rñ‚æ«LWí]jêA¦XêÀµŒ!Œ_¶Ì(®•û_ˆk6!¤Ó/#~à«xÜFâ…Í{¯š×û­æõÍëý~ó–µnAã„Ï(ó—ˆóúò…Š5Û¼xN—$·ûLÕäÀLôÒz“T¦ ÏúÊà‡OžðÜÁ+N6"í8ýÕçžMÕzÀ/&‚ d…KàsÍq³ÑR/¥ÌÎ!—e‹ [™ªÑ¯¥Ä^Q=! ýZ_…GH1’ˆC†Ó&£†Dgãè þ‘]¨¿ŒÀ@VÜ RÑh vØ–@ä0#®v£V{QÚ ãAŒë£ v„ރ‡Ã[Ÿö¬¬±kÅómýÓÏÉ—÷D#cÜÓñxÖjOŽ‚‘åExëÈ¿ ^ÕÄH¤WÊp]Qõ–LPy‡³Ò?E)õã$žJÒÍÎ Šž¨)ß $ê|ÈÙ›O͘êuìàÆ`hùÊÌ 6q¼µ–Êl¼„_ÏÀë’‚S‘¤KENW2âÀáñ,Ïú•Žx‚ä/ÊœƒÃ1º¢C ë©Z‚ ªà4ERÆæ…j&™yLÆ2îÌ}6åƒQ ˜z\CÀg#ö2Î4QÑ}ßá0ND®K(ŒD¢‡»r+~­Vç&ÆÀ7J'‹8oËÒø7Áh²,‰ö\’FYÛ/I2v]Ä’õ'sÓ ¼6Áüwå¿5ÿm8í9ãïd+ZðöTô’¹ï:¶3´=8¿-|ߨÎYô~0YNO¡à ´è=¬qûfЛßò?Ö+6$ îÆ Þo<ñ~sñ{§£ÀèÕ‹ßûı¯–ª«¥ŠŠñÓ94|ñöƒa¶66ðouk£bþ…O«ë[k/ª«››Õ­êúæú x¶º¶ùÂzñ¯ôSáý÷_äçåXå¶ç—CTÔ5&´¾!d^œ¨yt@Ò@'7e=G–ؤ·‹”ÉÕUT$o<¥HNi ÛzÓÛ•m Ë¦žÐ/Ë%)) ±Ò“Rø;<@p¿+ÆÎèʪ{@”«9nú@é뽎ë£/OhðIاS¯Dn[Ô]¨5<üš*BòC-/:9lÍœ1OÕgQju××´`eK?‰ÇúÔ¡Ú²í Š‡”~i}:8ÿprqn5Ž¿XŸggãó/»ZiNgUiŽªÓœ1òyŒ?ÄGûg{€¢ñæàðàü j©ßœï7›¨Y¶Öiãìü`ïâ°qf^œž4Ñ3¹ÉŠìY“~¦ooTL–®;q< U…mFŒhQ¯’È¢œëa°‡/ž3º8±$ú8µÀÄU«;œ"-ƒ!E)`8oÂÓ]¦¬ñJ]¨´´ÁTF„îŠ]öÀÆ—@¯nlÅ®`_÷ÇE7PsŒË^k!kå¬-Žy²×¢u“K¿?=¼[Kçy N€—x>Ý•ã%Çæ,´þJxLúÙn„¼ÒÐôUà´˜ê $Þ W¹ZW ‡¼'Ê\zÐbU:Uõ]Üáx%q‚d¾ô`¿;Ç÷¾ž8ððÞm—_êj—ô&»N½=Ú-:ÒïÞÔÍýs·ß®#ê/UG ðCŒØ8"ãwÒ~¾b[)`|D/O ]ξ‹f_,ÊÅbö:•¢˜õôeê?Ô¬LÅ’XžW©Ô Û΢ûŽéPALýò:3d9´?À>L`¼J&a $o»_´l› ôÕh©+ñ¹ô£+¦Ÿ`zdù6£ýªô2 5`ÀvóJ/AWŒtfyw± a&QêÌåPÓÃÏ=§³Ó©”äˆ}É õÑ8Z¹ŒÞµà\ñä4-¥~gcTæ<‰OÔã–„UÄÕ‹,R¢jð¢dk ¹9>I)î¾Kš#bþH÷;lz‡µžN¿ó,‘x»ç³N ÷´4UqÆa<¬Eê¾O‘¡IqüÒ²{«bÅ ©«JÓ›0òÁd쉠V¾†z\ÒùŠ.#š5@w7C'/g©hnc¡}*±?CI+.$³ò¢z#£VAð è¡$y„}ïf²GÕÚÆ«¡Q‹¼ÓO:o–sA5 fs‚lI?éª'»Ö/ëñ‘ÊÒIA^{rÄ©¡Q1™Œ-/ñ]²^ØZÌ4of£·3™å„ØÝ´¤?±#NM&™‚dGN®9Sh}¡ƒæ§ÂA/ªhžá¥WOe¤8“…C@ÚÝ:Ö­ÌŠ^yëz:CJK>êÃØÈGè_q—0×S1#k¤˜!Ô†”U,æ#Š"ÅÃ.zwêvS+´×’ýdÇêÁÿÎöŽÕÙÙámk…# g:d%ÌÔ¨3{µ¢ü9‰ëšµƒ†uÒz[À7þENŒ 06“Œ‚¹Æ²ô¥ˆÃRaƒZä¥VÑ‹…|²Ø1ô®@/ãï¤÷<¥…rI‚ X»Ñ)í0\·ËŒ®@¦,s"/<ýç àÒ'Í6~•x)ÈkÐýwêc»t ¹^ßùáýáÒx:é¡¢ÔíNQªZ'ÍÁ:yä¦]ë!¸ZG½ÇûȨ ö0±æ­xJ1-ú³ýÃýFÓ /¢W)ãôÍ/Íóý£ˆãÕ+{ÿ䱂!kuL~uüYXêÿë]2×j]ìa­V^Jšv°bÊÄÒu=w‚o¢”ê ¥ ]£¦ð$ó›Ô ÔHj}‰Ë:û§1FDNöúü†yeåÌ>X±=8ï­žÿ( Õ@†§X. $y=ŸNQÀÊlœ B èø£l‚ÜèŒ#XJ°Lß_µÄˆëï2?£2cxNTY;v'°†k…O þjåüvØÍ Fl¨T?9vApF£Ô$’¼ ð‡¶“c¤§ã…œT'Ól5«`lß@Žîà¦P4¾;ÁtR("‘¦ÜÜè$=,H U!Žðèvhé&Ÿù×þá;³‚ …î-°fN—Â1u$؈”6E5 ¼CÛD$™ ­å°9ÂÏÂÉØEX2/ÒY‹K«ÎÂcêwšÒûÊJµQ^g: PYxã#>·tÑKž*H*Èôª×wã“«<5ÐXÅ# qZ8º¹Ã²ïLõ4ÿE¡¦_‚4 ˧…&4éÔJlšµp¸Ò(¾ ngT9Dvž‘l¤™†ãç¤3í¾ò×È6æLªÏh"rÆC·“šR§¯¶d‚Û¡JTˆ¥™Iö×ÜA”$ìæ&i›Iæ¤Øˆg²1pg¹Pü®¾ìvÑ ÍmdL¥ôͽÌ!å׊½su™/2ÅË*ê˜VV™9þsrò9«Rá2ç¶/ó”ňòPuÎüÄZýÊüäL©êCÕ£'çk1qÃ6‡…¬&oBQ(IµRh‘ŶAÔBÇPd³s6øÆ¥À¡"KÏŸ8…G—~{kÛ›ÃÍíÛG?\[½}„‘.<†°;whð²²pgCѺ½Õ‚ªµZèæ™ÜHìØt¿ÄøÃ²ØÿPtð%ŸVSœ îƒØ¾]•ðX ‡Íý½“wï€aGÌ3Ohi%ä¹ˆÏæK:³3Âk±øq*19²Ãíµ¤ Â:§ÀæÒ~ Ì¡„jÌøbÒ™#þÖEå6™}¿9NÞ Ÿ;24(Ôë£q=–¿¹zæ—m×i{åݰì¶3år—QÛ{Þ*Jg0Ãôu¢¢45›0­HÌUoÃÜG%yYX´LøPÁ D1ïÐNvÀêŸgiÄ8<<)ûa–#j‡±-KÊG¬ÈH†âI©‘öÖûpRRª1CoGÖ¹°&dÀì ‡p¢-qê‰ÚÀéuè?…ú?@‰ÐF…jrbBõ?7ŸF@:¥žEÒlrèÕÛxï+1Äd_å¯vëªT€CÛª)·Kp ¨W“£Ñ¤kƒ½Ó‹Öù—Ó}û¨q|ñ®±w~q¶fÿmÿìxÿÐ>9Ý?kœ#ª6K@5Þ©åÎf ¿K!–Íî£Þè£å,šÑüb’ù“ÃeˆÚ™9Kÿ”ùðËÎü Bà–Òð fã/ØKMõc¡öƃñï‰Ô5o›E¦«¥É2'/Ao]K‘K­Ý¦ôÉþOVدÉ~O×BÒ?¿xªîímÕc^¾Q–˜öY6ƒ×}nž!&~2SáѨS;òƉ|G°€Ç£ŽÎnèŸQÃÙ|Öïy6Q |xfƒ1i<g0ê;µ“滪dÁ:™X™Ä ë¥ ®õÄa9’éÐÝcŒ:üG˹¿µ²?ù(³ö+«Öva£Tø­<Ö£<ht:p¦+ Ñéü£hH˜£pŒËÞk¼s¼ñÅ€ª Éå*Iòçãéæz„ˆ6ºÓ޾·¬îìl ïIt·ÏLY3GíV„*†ú$è:ß5*†a”xb<ÀghkøÎÆeKVê ˆW•ûÁä±FœTy7P[„ª:<ýÐh)žeöŸj5õ KzÂw¿qWnë2’_^Ý{c"Ë—Õò™²®M$xÇË‹ö‡ôþÇu+·Z­l®çÓѸ*õJš Kk“—6þ Áá^C Ø,ãïígC…T—âÞmÄ)J›BÓXJ´¹€êto1Ù¨ãÌÐm=“n+FG¥­.oW¼¤M.iõ‰vm&Ê)mコ½¥tÛIºÆ¡Ð½ùst{Ÿ…îퟢÛiY¾í,oãNŒ–úemy_Æ{e«´#4KËÙ’r4£²Ný’Ér¨mã‹índ`Dé>Τq"™ð|qBò·³L ¡ùœ¤A«M†Î_cà0 8j0îÜ‘VK«(õ„V>¥éØ ¤¥E;Hì ¼y†<øíëéÇóÏW,NÆV¶ñfïíþ»÷þóo‡GÇ'§ÿuÖ<¿øøéó—ÿÎZY§Ýéº7½¾÷÷ÛÁÐFÿ‡“éÝýÃ÷¸?à µûŸÎ-º†j3Znx²Sˆ«Úh:ö‚)zlø6l9ßmpج}?–3_‰f­Šì›ú¶Kí  öK؉?y~7¸[ÇçJ«2>JöÀÒqfwÖ$OïÁ‚p_á²!“'K"¯#^–JûÊk’…Ywï ú}\MãÕE=鏨˜¶ %è!5”h~UlCª9 ^ËHÒ¶Aªñ¸šqa8·ÑÎÚF¥¶–‘âÈß{¾?Y+mĉC¯çjÇŸ[|îo}¬P .xòŽ„•ïáÝzRØùÚp®0›¯'ÁÕ×fxõ,±ÇAŠ œÉëhxŒGý?•×)fó:i–×v*fÞÚVÅöÚC†]6ÿHRý(<2iBȃh~Ü w¶ŒõJežJ¥„ð2!ÙÁÙæì ¹W¨UK_+ÕÕ+ }ćc/ì€Ä=Õ#8ÚHU¾ÍI–‹žx8§¼‚°&Y¨À“f-‘©ê=NϦy¶úºR­}8°/>—NO‘XAól»Í=VYöG#§ZªÚ}8èÂñ þN†£Q<_¹½Â~{(H¦GÍÙïÍ£ÓÖÛ=û™»ö®6r%ÿ7|Š'w ½qû‰ñ8“áòJâ¹|00d 1Ý@~ô¸mbnÂwߪ’Ô’ºÕ¶™pwwΙ$V«Jo©TŸD2-\÷Þóþù5€[{¡ì| Ü›kǽq~ßZÛwÇ C¾w¬í{on›Â ¸1Œ´ÆÁ¾#™«µ<3u1s™nÖAÛ ;™D/>´¬ò9ñ7.†òªPdzâµ2j'`U¨Uõtü,š9qöãØRÛ;noUq Ö3Z¥U9MQ!–ó»ýÜpVM!c«×wÉ®ob_GŸüÐEº¸o062Z¹à*’2©¸u+Qô¦ôíYa¶NV\E³z{:ÔçabIã²+  “²d>¨¾+j‹/Î¥Í/ÀJ{Ãé°ò‘—w›z¬îÜþ‹a«Eà9éö‚Qß³ÓKª.Ù¯Uáâ»=ÆîéyT8$ϼa,]n{µ*.}.ØBX zÛ8ûXËRÔ®íÓC¦²È`ÁiÞäØê;ž'Ÿz‹€P™´ZAÕ W>‡Ž0ÌH&¨ :DAž¤GítZÕJ§Ã^¯(ZˆÄEþ˜ÍaEĸÁM€=°BˆhY’áD´O\Xq‡ŸÞYÙ„g@ÖºT]РΞ|å߀Xr½j%û–-–F»bxã„zˆ§e™Å3‹8„¨^ÛÝ=j´ß-ÐV‹ì¤­Öø*¦{V+¾É‘™Õª?þâE››’"×Ι—\)U±“kjù;½~£½Èªc†D\†Òr¬"¬•DÞÌ%Xà¯8IXžÈç§óøG,lû$L۵Ǭ¥4]Ú¬ÍL $&'m!—_¢c%OFðËÝ_É»}ÛC\4û{»bÒØ…¸Ræw7p‡ ƒ[ ¦NÝ[OÜ8"…¹îÌ:áªârî÷ƒ¬¡íÓá(\Øð\¾cjuÙNž$dFœçïOÏN8¬HgiK¥«V¡ø—•÷&Ýü`4éÅWôòÜxíõÆ›â›òúSV?ûárABb—$\ùy™é–åЉaSÆ [¼.äƒEíŒ4ø8;"ªXǧ±áÖ„Áix$;›±ƒ7[¦Ã™&ô'SæâHÞÐþá ÛÌûþdÒ÷äÓãÌ›ZØdÈιpëȃ?æ/  ©å‘Þå$hGñï¯w>L|†FÃI3îÛ„ŽÅ/Bš…wå‰ãJ'ÿ ;Äœu^9% ®|pwãxölV†¡ eÐåœ~¯j@/}ði¼ÅªÉ `Ve¬5¬úŸÓO,ê=st_•À8jÁ™“£vÆêyÐJ/”˜øQ룇"d7`u€/>Ú$.}C «‰ oR\2`êœU4 É[¨ï ˜›4ïÏ ®[È— âj2¶É|bXÆô=‡ ®*˜ÏN–hÿGJ³oÜ>ÌQ½<™¨”(¤<¸–¸±ÒD’Z–H3Eß–(êÎíÁ¡ %’Ô¢Dš©(ú¶L/êݧ`f- ' » ²×qߘ€¨™è÷ è{9þu>~7±·ógpc·õ&dÕêä!©UG®y§l¢;=89nœ)§}¸¤.Å϶Ï[eòàΖæQ*” õÝV §R¥, †Ý>¢«Ž™†évìw9Hš-šãiê§ÍF«M3œ'`ãGáœ;·b~YA㯿Zä}9F¢s7èÃ1ÿ¯JwD ô9w¿YVÞ¦³ˆNõ›52LFd—±ó £ ˜ë­5ü—;¾í¾¡”,þýpq¹n}[徇2+ˆÖ-AöV#{KdÌCQq†´ÖÞ·ƒ=@náQ2vÍþÎz,3Ú®?µÈKðl|Ök-Cóƒþ`Š™„¨gø<̰jd<»c¯ÖßJoI3û³ãÊBöãÊßdX¥¼ŽNbÂÕSù²¨\X4KËÿæ1k¹"~}Z%ßÐØõHxKçПFJú¥Dñ€ Á.2ËÁ”ü¼F®,6zq1ûÛçÃü :HûîJ+ ˜‹L–ôéWòó§·Ö“º (Ý1¡5a^á¾QoáþÕÜ>ïè­ØÖ<_Žî,… JÏåzë –K°€™5JapˆQy LÓ*WjƒÊÁÇ!l‹ê¸lĦƒ*«E\PÛ˜jp’ìžçOÏë›êÖ[££Ž(»³élÓ@]ÛWE§‰úÕ ÿæTp«9.Ï¡ŠÛg¾tXïÝNg‘~sïT8z¿‹å`nÁý•€ÔÐøŒžØâÊÓ:>ÚÝo·Žßtu\‰ñ:–n1ƒn­V,¬K\¹é9ŠcuESm\X„Vùaÿ¤³Ó8Ü>þÔižì¿ßÞÝš!´ÛäõofŒ=÷Ex¹´3,MQVÈŽìÝæirD0x†Ü×ÝÐL@š"ŠÜZýZ5½”¸þ¶Y«Ùõ½Q?€Û Ÿã8z"¶Ç³ã²6zì›i"3š;bxý‰k•¸äºìô:ßcl‘)Þß¼ûÉxË„>ÄŸÂç3C­'‚ÊTÐTÊ´SÒud’,D‚©8kR¾“…‘Î\:qù‡vÎðÖÏù þ,¥ˆ¸k"¶øõíÆùVý¢XºtŠõÒ:{϶qn•œ’SÄë&ûQ„p•:>É·v1I(EàÚÖÚ…ær9é›áÖ[³îàªMöItñec ÓŠŠ³Î‘¬Ðë„WÙ g™Å:1D3ß®U± õ¸¾—×)¦Ûu«%7­èÜÌŠ6QH&fXº‘飱ӄ>=Svžé*2}ˆ,q§E'e-¥jþ]”89·ÄÍ«]"˦xÞëz–K¬ö\<Ìsé0å—9¾Â‘DjIW”€˜Ðy6©»7·C.Úþp 56+ßðTÿÔéÐùÔ ºkëô‰Z´F"ÌÊJ0„kÕ^Í/ìÛȰ ”¹ÀþÍ%仄ÔcU®¤óŠA@‘~Å|^‡hҪŌ)´Göå™ýof^Ñíh‰ É]Øæóø¢²Qݼ„îÅyƒîP=ÕùªB=¬= ©…¬\[q=cÒ_ñ¯HMÈa^-òpƒæªüÜÉìÃ,ú&‹|Š‚¬ÖÑûÇÙÔ@ÒÁ³6j‹ˆÒùŒ`-N¬Ð~Ø‚ùë“eÉüÕÅrÆÏÁH+ë;.*^ ‘¹÷u¥¡eh(ï†0ÏÄß×ùBþGW¸hÒ’‹[ÙÁôñía׃ñØ ©¿‹ ¸.´Áú¶LW󊉃m¤×wcîRÈv}t5'7òD g¤›9€³ýÛí±ˆÎ´­?~Œ ‰£•CÅ£–;-µM=v ó-£ë³½Öy¾´U(Ôwœ#§í$´+Df8åžù‹råÎI(šZ/: åQ<³ï8ù£A"½ƒW)…WbÄmu³†ä[¹SÑú­Ós¶–2Ä8…aŽ1GðIÕ=•Z.nYÚ¬øØb딩”#_4¥yJ~%ó},+¶E Pëls×û­7!ì€ÈÂÈlÝN7˜væÊU"{{—v%¾HcÖ Á‚E3täÝÌ‚ùóƒ¬~Ò6±§×†÷—ù7Jåõ¨ 2ÌC¤€ŽxóîomwPSTì’Z‚¤h")J’ri=m)$%*eE©·Ò¢ÞÀ¹i(9…!óÄÏÕJòóWù9›M~ΰÕþÊ¢yk N‰ª"$XC˜ý†Åðpóó7Ήٞ2±y*ʰW•çŠ3(Ïðw:´‚ÚG§Ç»ûº˜3éÁ¹AQ¿J*ܶá—z¤â çï7ʨÄýê³hW Çèqwx7Àù–ÈŠ"t?’&š%‰,¢Rf:P‰ÖS`šµR&£‘×§]ÝB)ÌZ‹ææ:xk&(ÆŠó `ÊÕ÷‰Vcì&+RKÚÕriÆi³låR<Û0–?,ÏËõ$‚”4­?¥µ€”­¬s¸Fƒi¬C¢ëŸÄ—*ÁH& 4‡G‹S‹%¤ò¿aÑñ 53Ö‘Ö¦âDÌÕ!b‰â •Û¦8IY¨«<PPááwLg6{@[8Àð°3ÞÌÁz8ÆÂ#q6åe'wY‹˜e„rgd)øH΢œ%"{!ÉÇçÈ(»áhàÁö@(uÎFp{­cat»–£Á¤Š|ï~KôC±è”Ê)|2Àè¿ö¶YgÏå(;ñ‹tY<2”» }·–÷º>7!Êè5ÍUòxÐTUÚç4'1­Då1… :O†+ý DL{ tYj©åÂFÁfŽ õùÞ`ó-=ƃ•Õ•è\ù†íÿs·ÿÚªÐÄÏ pYÁD>G·µ6yænµö/ËGCo4 ûBóÊ–øˆ,i_õÖçÁÓ"…mw4F”NÎa‚’ïXH)Ðá>ÉÄbè˜ZçÖ¡/aßhŸZâÓp¿z%m_5qHœiÏäPŠÕ¡´°¦`. ×ÜÒ_t ) ¥Ú‹œ1»R$Glx6a¢NÉ) åíNF ™ˆV–²¥TÉp+Ú”×)åžUÛºØüåRýðÓ6ÜÚ8©ÊP'+Éì_¶¶ìz³µŸ÷…‘Ù†ë_AM3ð^ün`sDà#:2¼%Qš¡£ð&Φ¦°1  5ªB ]ÅX$ÜŽ¹ÃÏ¥F5?6J*ù“Ê®`ºvýÀŸ‡Áí>Èõñ£N·[´ë»£áƒ7c† Œï¦Ÿ2³H7€bŽ}Oòni1«RÔy ó²°Ç¸nº}wÜq»]&±>è‚Ä¢•†K’}Ñ?Ä{c·\Y\Ì#ÛU®¤7¬\[‚[MãVKç¶DÕ´šÍ©Øñö'ûS®Ùªk#þ8rݱûSÆ7X޵@®Ïñ¯óÎ9¢1$¸_lçþû’ÅÈÌqÊŸWÚçÕµ@äŠ&œñçu4¡g¥r=æÓ£Éòé±dyÉm;iëÍšüRx±~;)ïëÌE(ªZÂàþ‡ÊhŸõ2‡âK4€¢½vÚùA yçáƒVÿàïñ¾\¸(/cael5¼ßŒ"Q”P‹÷§¿Ãuò”ìБ3óàÇ_8n#¶Á²Õ;"ϤgQôÖ2 –pæN)jûŸr7Ó?ýI8ÍÉt¨ÿ“ü,ãH…DÏV½oÿôÁ‹•ªw!ókþG‡ÿN{/_†¿yÀ‹HŠvq»¾v½aï³µ?¸öP™Ÿ_ËtqO÷x³c¥m¥(ÝK;YÈÈÄ#UÊX†ú?ÇI8œ0˜Šo±¼OÕ #a"·vƒÕ ]§¡^‹o­¹5Vseix7,üGù'Ýê}8á?}ø£q¸`ð»·_ýD|i³qøájeíÀÞ~­VŒÄË–K RX‹(AdK4õ+ ,.—„ƒJ´3ó›{he€8ÃBÑÛœ6ŸÔ(tcõ œÖ¢v†Fñ¸m$%FÍ=˜mÑ,!Om¨ˆ‚Y ­¿ óí¼Þpê=$FÌÉýfµr’6©—,¡±­¬ RÀ<ƒgyQ®l\ÂÖ%ÂÁÙ Í+‘\3&£gwäDbœ!÷± R«ê±ç9ï‹Ê‡Š´°{§ƒÿd¸~cBZÈÂÍú~.þdœ Æ^®ädHÔèÆÚ>ùùÄ:…îÈ dñüL@oÉ›x‰~9]¼«L{ íªrK¢eݯ&ÆFÌ/Ó&68î• !Í”c/0À&É4°Ð®8<|'ų)lÀy¡FÜ9…õ›‹\þ±ßd¯¢z½þ†è±O‹ªõ&Ï µÊ˘õMPFD3«Iþ¨Ku‹l½:[V"Ü~¹ø’¿¤gM¸xE÷/¤.ÜÜ¿/³WÏ8ôDD¤¦?\jÅŽŸœ:¯Âl$àã¥äˆg¬ gÖ¹ö4~:ì‹Ìô#% —Z ‹¾âù/¨&¤Ž|˜ÿÓc8qئ_­ €¯º>¸/‡ WèmÃT³$g¿ç„#§¨À7¼ÞB“x+â,Îܧ¸°Ð]ÀJw4\fäÇ]9îè6îz×/4}Cã”b7‘ªíãfg{§±$€)–¢B˜JrÍ&ù¬DÊK½V­Ývçì}k9\Õx8qÒç{¹Z!ÒhÒ|yÚ»›˜ÝM¤‡1Ê»/2à]8ä–àäÎüp›‡ré8y¥û—iÙÍøáeÝy3÷v4|ftR-æ'Õ<&îKWƒriüB3i;ë qÂ8=uƒÃ„x‹ÿ¦=_µ»á˜Šìßñ¦~ðúñ÷(xî ÓÑbÌD²žhHãI«+P›wÆÂØÖa(sÇ\採Ìd™;)eF%âÇDÛßïØepÁ,óúü~"¸’š"#ƒ#¥›ç‡j€ä“1²„Õ)6çFãâý2ól4Vw,¨/¾ÐÜÞØK²ÒÕfsé±qê¤'sc`\ùÜ‘di¶ ¦ËWÖÁht/œ ,ЦÂ%Q/¾ ìn׳º› ®$}+wS"fk{ÓæàLÂ>h¬º·kjv4àÏËnË·ÈrŸž7©; ‚®©ùõpÉ.º©–¤¯VúÞœZ(×Ôù|æpYŽâbi“…e-^!èy>ïª_d¡…w/Å(ˆËÕ”òR'íÄGð­aõà.3€?‡ WÁü¨(2›xÃе_P8ÚûtØ8Ï“Y½"ö#øaUœÃÒñf£ s ÍEDÈìé9‡Wø"@ß—3³×r^ˆ’Â4`ψò‡R†pYæú1ÂÜ"hüÇH@>ñÝQ#ÙBﯩ7œ˜‚o©= ¬]³…1Ô¤Ó¡?£ÇB¬êèæ&¼HE‡QñÑwô˜ah᛼HΡBB\²Â ¾þ"^L.95¼a¹B F¡?ñ86Óù`!Rñ3Â'dØû<¨$ÃÈéA'¬™ŒËÚ¡ç0džTFÏZb£Òô+”É]Ü K´?«ïÌ™[‡xðŽÑ&_Š©Æ j]¿Ò+CV†^#cÄ,”j¿yN}­¿ÆC[¡|” õ¡n¿/aúM5…¥œ7˜êu~ÒΕ h³}rÔZŒ©>.¨-f¸˜‹áI)«GøØ§¨±E+Zä3]N‡èRrS#O+#üçe2½é*(-ŒhÁC¦EÄÍÞ[l²„½QØûó60õ Í,Ê¢v܃MÚ™£Ì7€“Á¸ÙzÍ´º"œðprP_'„½ì>M¨¼L¹@mK’…5)õxÒ# ÓVŒNWðÎØ¨SÜpþÀ gÓ™½Áçt†¸1Ѷ†?ÚÞa¥ªN„®©OÏ…,ŸùÒdÀY‰µiWjU{ù¾èz5¾H#(7¢˜snÄsÚßí]¯ïGø¶Î¯ò¼\|›¿Ôô¾¢QŽ©©—Øwl˜ù%á;½Gˆ½Éæ»×vU4äÊL“ØŽ}Æ]ôò¤€5q¸š7ò ºËWx¨«>Nªô­üÓT¯5ò;ï1ÃöV4ïŽýj›Å'µVL~­€£‹bH΃ò¬˜PŽ˜Y½x”d¸±,CËn4–âX}F­Öxô ¦é ¹;Ò‡sñº/Bá¾!-:Þ œÙx(²×Ä•C¯®™Ç)¶–Á‹îýþ¡ÕOÀeƒn6’>x&"úŽž”ö¬(\Y¡ ó[n óS·ýž qWœ‚e BÎÆ¸Oҋ缘3?œŒ]µ&ÔÙ¯¬í^K”Ñ7þÞ`ÈѶXdÏ#‰ÝôJ7Œ> ZjEæí×-sÊŸ…S*_hÙ³ë»'s<øí ¾ þпìÊÈHÞB±ÀüZÇ·¢õ1f]D{#xvLlÀ°QhÑÀs94¡”­B}/‡<6œr,’¸ç»×¹^ÂÙ¬r¼•³‹ :»‰Œ9c ø¬ZS´fYŧb­d#]Y CŽ[[4§ Мçe ¼mJ|c›Rózj…AË+ µ =¡ý¯íJ,e¯]Ò>~ˆ%lnŠJAÐú£6XÙ¬ÒˆŠCû=Ü{¡?x&G9n/¾X—¶Åþä°YшÒ*9Á§yŒ™”™ÚQÇÌYr0ðœË »c~§)¿þÆjõ¤h/ç•ÀBœ±~ÎÌ)jcQQêà˱· ƒŒ3ì%ž¨Âáî1‡Äeú­ãív”  °SNbäó:Ìÿ«ý¼¡^¶°`‚òô¦›{ô»¢šk7 ks™ !nÀ…ršÃpðÔ {9i#û†VÅ-üÕaøFfÚâ9Ü<®µï¾X²zÛŽ}J\¸úå%jÑn^ìì_¶#U´çÏãhŽ+XWîp‚Œr ¬¡q€°ÝxIœÀþl±IŸ~óI<øÄáµSäoµFŠœNo¾F“BIkÿð¤qÚd;-‡bƒ›8d¶®vá®5n¹“;ëc³eÁ]ÔB–4syHðn@ÐàÅâÅ@ðë±HŸ=§éì¸cÿÙí6]¿ïìzÿÃÞµ?·#éüzü+0™ÌÉñš”Ÿy8㙑e%ñů•œÇÜeËC‘°Å5Ejø°ìªüñ×_ !J²ã©­«ÚªóLl‰¯FãëÐäeî½;ýô‹bK.gq?6¦ÕêîÛó/ /½…§éw2óãP¼—SIåŽðç7l¸ýìZ©¿xæô£Š3]]·ŽÔÝì¡,¦¡ØX”ù¬ƒÀ_…þsܸ"¦S.®/þ›­b.ýäò·|žÎ‰jy6¾¾‡"«õŸ*s“¦yæ—±÷.£zÿ¶€æà„ߪásг¿]_éø}`nÐôWí`.ö}ÅPi+‰ ,W!uèù2yc;QDÒûÔ…ùI¸/÷ÓÛÝ}Y{CÄçÊã-‰˜Vlû!«¯ûrMœu9¬¢×±CIÿ7h_’NxoôJ*þqšÜS€ÑEeÐ p_¬œ ¢Z{[oêµK¨¾÷£ëÒå/¤;Bž…;L5éÅG|ä|q·wÏz}w–áóÛmÅ&åDfqýé&i‚ü²Ñ=ûƒM`¾ä5£Ùs¼póHŽIa[`2>´WÞ=_¼6ö1݇ZtûÉëJ+yjv‚žšéP{·()xGþˆž$}±B_ósä:MàB‰~jÇI î”DS›·*’ÒõÑ;æ¥)ŒçÅ–5/ìs5êsÿ¨Ê¥û<:ü9A·4ûŠ8hàn̆N 'µ™‡>ßXŸËÖ;é}¹'“Ldƒ[> ¨.ms] ™Gs´bÛ~6KG½P¡ÍF…¾|8r7ÚYNêö:^Hjuy»K泞–g‰Šfd×Þ!ëúô÷ã—YUFøW>(Çx»ím|÷]'iBN}ß=âÚœqâÓñ`á=¯åV¦‡|»v̉×:BòÍ8VøRÞŒ4©øNî’DŸL"•§‘ƾŸ»ºû¥§BZúÔ\ ne-:þ”_ß=pn »×H´¸“ÿ˜õšà­âäÍ‚r²ðábfAÖNÿá£E~Ö̪5ØOÇÊ#áw1”´3ŠtB3¿üç¦øùgœ¡¶¾ «¥>²¦âBj\™å8 ™ò ‹&$ˆc„§„³#ê¡gE4&Yé'k|2ðÒ'<Ï8“Az• ú$ß÷mÈYq—–¼«càrDS?¼‰Ðï ·(…ƒhmqê‡ŒÐÆ)•L¸“ˆ‡ýl´†×j]×S¨s¨ÓFE1Ùm·¯¢ÂËý?Iü‘w•”^š]ááTÛ¿NöŒCĨxãï ãtxAR8JÞ\îÙ®ߌ†{ï{7Pÿe¤órXvTäתmè&ÇbåÙ:#]?ÎhÕ»³ºaMLøˆŒ““òÃy/Ó8N§èkzï+¯• ŽÒr8V! A'(®I”] 1” ¶Ö‰ðϪjîD˜üM·ê_å)°à˜x7êƒ$ˆ%C:vŒÅ“¸ŠJË*7ŽÝ¡¢bZbk^rœêTÈž¨dÖøùìFÒ7a»~ûÃäÉì<Ù÷åÉí<ù÷å¹±óÜ<Ç™sÿÁ¹çž6ÄòìY*üp.ûi#‡ƒÃ'|ïaöù̫ҍÀÞ³9î‰ùí4ã®ÚÙ¯ȯæªX½ZV˜‰¸± 0ýjQNå2¬myY«rνjv謃½ùëY3k‡• Â6*V“™ã~Öûê ¤´Ã"|Ãqp*÷ŸEÚù.=‚IhW¬øaèŽpW¦5Í¢Bº—$ùA.Z˜].O¯ç”¡þÆgnŠ]ñ´š~{­§³)Ô¤¦$?íÞ¹?­oŽñ+l$"ñC)8k>:Oý`Q“¹»ámlzëíCÒŒ:GGOþµ?¤Ó¬¿ØÞÆß—;ëö_úÙÜÙÚØ|²±ùrg{kc{ckçÉúÆúËÍ—OÄ“§Õ˜õêï¿ÉÏêª2À€1ÕŠïO ±q8Y\F/³Xßl  qYÆìjüLÚŠR阉~««Ž³<$ÄÅÅEõIðê~-Ïצ÷ß8 }l]\Ð'ñ•_,Í÷M¬éoȼBÿÔ”¥ý•H}]^ÞW΢?­]|Ã~Zíû¨#&¤SqžŠ®2¥€Pf7,ÿûQâgwâÌ®ý+™;{K¸˜£´`w.™ÂÐUa¯¡"âÄ]4, ãöE ƒ¶¨…iPŽ =€Pa>”@cC §¾–IPçTØOäe3£.e¢*ËvgWÄrCM[q64ŠCæšFŒq“ŠH •_nÇÙGr”ÌLG¸ÌYÜÅ€“heP†ãQ¥——0|’(FÀ‘<*Òìn”ƒÞž»‡'oO5ó­Êp“&Œp;ˆÒ3熸ÎYènMLëØd‰c‰ 0\EPêPÇ’0Ž¢ø™ö*ÀEÅ»…\l&áÓ™Jô*ä$§ÅáFTjJë†+U&èl©@£î"Þ¿‘ÏwkÆ3ÞÂËLVÏÆþõìá\Ðt&îi™ÔÌu”ܟϦ5–a<ýz¸ºõ©£ËsMqa&LÙ ŒPÒP=hÔÇ4Ôž=Dló% Ê­IõÝ)Õ"©š½5 HÚ P5p‹ï‰ |F$¥rVdhp Á*.RÕMB¡Ç¾m”ܤ×|ì¸à8ñ‹;V¸îHÆ»MS_AñKÓàú–+yæ³QDÊ Üòìİ&FX=3«˜îN)XF—à^6øªJK+:Éäet»×&Ý`Ô.Ò¶ªX» Ž›“ÉD&•Ežñ‰–lå¬Ù0—úÖ¬Xãlzâ©æ0ÝüÛî0´C‰j‚=<ÑI„¼%ìk+~„›cð?5dUV1¦à®°h¡hžÐØ¥cY×á¡F?{zÜ»gØœ}|Úï‰Ó³sBp|w­] ÉmÍ:…²s2Ã6̡ʃ:ŽAtÉñ ï ÍĤJæl,…ÆX“ÛUíêví˜öœ:ü;öš’› uÆÎ žËvÑ]ÉcZ)”5ùؘ©ÒËan(Z4?æø®1Kf‡ASvUH1\ ×îÌ,©7›´Ó(t”b0¥ðšÙ%•ÝcœšŽå°¼ª&0ŒÑ ×U)]û½ ƒ³^÷°s$º„õçÚåà1ÛaZÙe‡VzÛªj{ua²{vöö¨ón°ç\¼;ù¨ƒÍìm€L4²0wMI&fWR‰¼œ`SJÕ >ýqJ|&ž`·f!š||9Ö”ŸÏW€Mµ~±h0ˆ?Ò)qH§¿÷ôÙçÎy÷ôZXÜžRÛžÒã Ý„?gÑO¿srt¸¿Çï¿ Îû‡gM€“§¢«i|–·Eæ;Žó9J¶6z®ÖríOå<è]°– ýD¬tûçϮƲ e2/ 5ê1?\t6Tð˜Êª€ßKA=TWêIBU°j@"ûjß1X „2£çášÆ0¤ä-èP®\Ã}e2Aöœ8JÝ€)R‡ð`_2=Á<Ì5ôI¾suˆ,†?“$êÍì8Âm“ô²’tËj¶+0®î±ê¢û¯·7·_1…ûÛë;¯¶ÕU•1îâr´]*Òô~5ï<Ñ㵆„!·2ó~iÂf>^FáÒ$cÇ«ãeep¼Jõ&²²e™UöÁ@rPÏÇün¤j§©¥p þ¨ehWô‰ Ή @ZÛîÌœ›ÎÀ!¸öõ°ÍÛ2qË\¡¯Š ªa4ëÙbæc]`Åv,ùY¼*l¶ü×ë/_¿¦òÏÒ‚5Æ¢—e¸Öræç¹æq:ü§„³Æ_%b6ÜÇá ÷²Wbœ‡I£\n[Wlníl¿X·–÷Ìp"-çCI+<bÂŒÉG,⦩Ç× "õ¼hAö…D2i,Ç)¯YV²@EÜb)\·bÌöº,3Þ°>2¶NQ¨½Œˆƒ”±Yé¸Èu'б¬Öœªº¼u›\¸6Kñ‚ÙŠß”©$ü¸Œ‹0ÚGÂð.ñǘÅ*)ŠïŽ)Ïg’Gµ,Qr^Íp(Õ;JÕÊ¡ãk 7̤–l–ZãæjÇ J=ÅWbcíá‰!‘–¶ 4ˆün7*‹Í dHÁïÍ ’1lK–¶ FÎ&‡póŒ%zrw]!Ç·bÝ{Và‹ÖÒúÔÞ$«ž\磙·Ã(7êŽ~Â_¸]¯ÉêU.ë²ü²H9nצ·±e$I¨@ºé=|66*DDçÊôý‡ ú’¤Z]¦wìB.ר Æ]J"ˆ;&0X-jS=®Æ¬IÚÆŒ2)$4ÀÇç½~ÿäôâBéÕj˜¹V¹mžfFd£É¨$^eS5}­¶üpþ±^·òz1p¯ô  Yˆxàï'l Ãõ3-ÙxFp#Ç‰Ä RáɆYZBÕcªæ¡”PìS»Fþø¹ÁðDÜR@bK4õ 1º±Â8ç£Ûlñ“³/Ϊ°:z­F™ÝøìÝ&ŽÆQa ¤•÷w–ðƒÞùàð¿{Ôh’Nkœ™ê¨…ŠVôHD’ò\KcýœÀ{*‚U ˪–F³Ó“…¢¼ xäØNbM5½¸´¼=8|7è½û„ &9<ä°Ihâ³K"ÒGRª^L½¼âylÊ#lóíexºs3ô°w¿§!¬cnìI¨0.Íž°¹ìNqñ:3;ÈFœNmÉTãˆ5ôŽÎÀX—ùÁ̇ ¬åð¹M hU’ÄTÝù{/¶Áaîé&‡cËK´œj ËÔPê+úZ™u'\-­À”Ja±tf(Êpq—æî•R—õ7?3ºp«~âæ­-»±qàº0³îùÙØ5yhÉt]ms w‡4ç %3+|›²G«^Xúëjø™’/¹€ºê讑–r#Ÿ(Uˆ§ðD¯¼ ø´e:°ˆêü)à=¨ò'²€û—™î®Œú¢N*ÚõúP‰$ÆB$£#^n¡…¢m‘Äcì鲿ÑMCI…d}~)Î>ˆm<æ“ÞÊ•”ÚPˆsÓkûš {•ÐHJY'uíÒDljšél–¨M<šU Óâu×±µ.À·«ëdê%²h[0§=É®¸›Ûª~.°tig?GѰ+ZfçyÒµžp.‡ !Aô#C?¦Ì‚Î&Þ%êxÀÁ5®0´´› 3ÔšYþÑïÜà7µeʬ±µ¥-R4?q^óš€Rb ;rk½aYªÓƒÈÉÁ‡}ìÌæŸFÊî‡×HÄÉÕÒ]@iߨ¯ùøQ˜×¬hÐp=«e­›éÄl¢Tˆð ±y' ³4 m6?–4[èð-5#[Ä N¡j)/4TPd/‡Ïw+œ€~&u%Ò8!¨9Õneã]'¶)ã¶Þ%‰]+ Ál›È™­ îc^}v-ó¸bRôŒ[Su«x‚´‰ˆ Øö œŠžžmmQÉ"WþZd Ç'eQÑãZ×mUn=à¸H WÜV•!®²™) ³!&oe²– mHWåÐW½÷×î¶·ímAÝ}†¤ËvqŒxž# þFæùM¢,ÚNpAÌØ©M/)Ö"tÃ|Æ}wxλZ–qƬڳýÅvO}:òÀdÆÎ‹òò²îÞHc°k€unüL¢Ã䯇'Ó¥9ü±°é­š¶¦ö‡ý–‘zu\°^¬ê­(lw+O÷U㼊Ž­".ê-œ/£[3·ÔDäáÑÑ6Ö[. 5eOµŽ±iW”Óa¡#ÖØºéá´ ï©™ü6§ý`ædk9d4âyèRQâÛVj¯Øà’Ù¢®0+ÕØL.Ÿ5³:ÂqºýÓÁ@tOÏz³èGæÿÅA)ßLR4"³ÊJ1Uÿ-—Ú¤pû9›ÀÛ;¼m£àê ï l‘ŸÈ©¥¯‹é]y"Eu,é¥÷âyµ€Ù‡j7dnY"Æ“`3ÐfeÝ@+f‹É «‡‹¯jÁCÎz§V’jÍr¥e¬ôr‹]9‘TCˆÊ9•™‹l¦T¶>j¬tØ#qXøUÛ§v;Œñ¥CçÞ^ßywf|>Ô·©j«©RXLÓY8Ó-á¦ÉgRïý,„,ç^ÌÊP^ÁfÌuRÝþãf’;NC6³ØÝe =R´€E®#BL“ M5DF+Sµ‰öÔ=¼/—Òül·UO-*„×)á%tš0ÏõóÜz~tP=C빆úæu‚Kvm»Õ;‚±Ö‹“ãêE¢°Õ슣ªon ºº‘J"Zêƒ^šNÆœµgnQ+Á Œl§1G¾¯Wyÿ}&?컑*‰â œb¶9âwmâã`TFþ™£Ç~=xUÇÔÀ ӊПã,Õ—–VªëÎS—I8ª³Jp¡Éa=àYá ­S)· ¡öüX‘VwÿÔ6˜6!˜ƒÎjæµLgYs•­:ý£Tí¬\l JËý+QZµÙœ‘@, e8ÊË3‘É­Uç&XPhÐZŸðsµhˌުÁµ|­²£k×µyDå Ä{mÆDÌ"P1}EŒŽ\¶aÏL‡+´.)ÖŽsvÚ?× vuÀ‹w-Ç·¦|ÐC î-Wж¹k[j#2Pu$î" áî£RÔ/qùSÛâ92šoÀˆÎ¢SæFÊŠÂy¬5E7Êá‘UÂ>­Þ†¢jb¹j…ßÜ‘çYùb[ÜìxëbÇÛ°_÷+`¾áí¬Á‡_[VÄE‡ýÃ/â…·¹F¿v¬—,ˆE‡^ny› °4„OAèÛ>ïx›V6¾§¬ o %®ã×&—_Ûøõ¢™Ã¨FZ_o¼5[¿¯©¯_­‰ãÞš89_ÃÞQÿrÆŸì–éÐ\Çù˜Kâ^ñ±4s>Ñqô¨ÔØ)'ð¤ŽüÛ[/—mÇá¸ÂR#ÉÕ”¡•ÃÛo´¶<ñÏ<¥²s\±R×vphBŸ™˜¡o3S~®È>ùÿŸ¿ð3{þŸ/H{ˉüÿ^ßü_öž¬‰kk·RkE¬»-ƒÕ ²/ Ù" ›€1¢! ™„µ¸Vmµ.¯€»uC«Ö­.`µ*nÏÝj]©]´VÅ–ÖZ\ªÖúî2@ÿÖþÏþßÿ–ÌÜ{ΙsÏ=sϹgνÌS3P* ø™À „"YSþ÷ ùC†˜-ùV4SÈåþp€ú¿.-ÓNS6|e%m3Øì6d„5TZ¦Él4gäƒ (ü’ªºDBœ1ç Æo °heZ>Τqd,Shþñàc@‡ÛسéÅØgfóY,v«ÅLc(&¶ ±õNÞ0 f4&l \ž:ÛK¦øÐU€Y‘:+Jã„If‹[Œ‹Rû°k ׄ£ùÎi” È2)%(xÎqmžoÝ…ÐdNê`"7œ«á¢Yø(JGÏ\80Ý. C>>ŒÅ>ÊhH3Øòáõá—ÉÑqN gâN.¢f37ÙŒg_’Mæ· Àl]k`ï²ì@ï>ăs]œ×¨Ã&üx Ťì›o% ® qñ uÙ ×ëMèKÙ˜]öqõ‚ Ý b²L¯Û gô0m:@0F ³ÂžFºLΛÌ,`£á‹²Ñ+³Wƒr<¬5¨h”y¡¬!à†j$lj‚7zEârZàCÌ–(aŠøP­Z«ŒShŸo„–ËœF@â#œ|Ÿ‘ M@°ÑzuæmJ$Yˆß:b( ´ ³ ˜÷¨¡ë’´0;8=Df`t95R&–( U@ö'½15?'ˆÔ¯_ ãÌë ÌC|˜õÞðú>ÎÈ]®éÔTˆÎq…t‡ô…®Høø+Í’*|IøIϦP'=¡sqQÿ9 Ü Ð':.2"ED“ýw¶ÿð=ãZ8O€)"i/Àþ‹$Òzö_$ÕMöÿEØÿ&óßdþÿ_š«ªQkÃê€ûƒ¹eú(nfknÿŠW@‚›6-œœ ùÀßõPo¼–ŒdNI<€>kÉ9dÈ¡·à…ëꌪqôfMZ7…ƒ-#äÆ.ag«tFŒ$’€>ié×χyy/K‹cAxuõŸV›žnÕ K2?Õ'ÊÁ—õØlx% z§ìRøÄ v7h6J.úWN:£ó ÆwBšîO¬ÍYPÞÏä®îAQQSŒàÏØƒ%GÊÍ|aë¿ù"©Îÿe2¡X(ñ…Àþƒja“ýñöß;ÄF%(;Ï ß‹‘6†Œ¢2Œs“¡o2ôÿ´¡×£·.£¤æpU¼ÚsœCëRæD–_5X¬¿ÔÊ GÃpÂóø¸V¡P*c¨”`l9mNƒLÁ$E–Ün¢ 0Á€Î„O™Y1¨ÕêuYc~à3a Ö¸@Í ]¨ ‡Åz3„bxÀ#5¨ƒŒ`(xäB>w¡C妴†t` ŸÙjØb¸úšm1$ @­u&‹³/ €C]ø´J‡«…Ò„É,O«Jó®“Œ”IkÃõ7pW¥pÈÁx}šUŸ&ËEd=þ±ã€Ü(§PIÓ™Ì&ô‚¶:³ýŒXé6 êLTž­Q™F«¡Þ@iª‡7*hP‹„ ‡áŠ}ô‰²­á¶¯Jj( PB2~…‘uL²LŽÎh§ð»¼@ÃXw¾()€ê¢JÕ2¦M¬ù°íh´9lkœé=…œ+5W2´>TD À‡ÖÂíw`‚0ëÔ‡% ÀAÀ ƩҥåÎ B‰´~#A(qB>ÍÁ·M ÿ,60Wo@Œ*CÕ!±áh.ÿ,5Æ¡·›p®(ªÀyýÎ×Saa4^™¤#¸á±ŒL©ÇÉ…×tÊ’°$l ÚÀƒÆ†Çjb4£ÙäyöúL.^?…–²ÛÌVl·Q¼Hn‚YP…V‘àQ¼K&ô«Xp&c”Í%eÀð–Gù¸X†€q¬œˆ-˜ fíK³ü0oOEÛ#X™uËŽµ]ÎTw¥¢¼x^‰<~ÀÞ´Óié;Û Ž^B¡E¸‹(R' ^kÁDòs7á²*£.éTo ŒétÁ¥-­ŸØ„ô¶Q]" ‰68ðh¢±ƒÌœÂ¨Z–ŽbE.“øÒy±~©•ÜÓ™ ‹mpa†k!¸Í Vª~iøg3"O©3 á]Ô:6TMÆ+"ãBÕOUj˜wÍ<D)¿úz‚A5ŒFE $ ^A÷Î'4Î÷Ì¡vN÷Ã7J:·>rh°B ¾U ±³tF¼‘£­1´è¥B£pÅJ7¤³±ÛpJ3ø¥s±bæ {²1ZQ¡QD¾#३¼LÆ×ÒSÄ+Â#Áá‘áš$¼»°ãö‡Ðx[ |«9Ýž†o4&ŒÝWÀ•sù˜˜:4”TDªcÀåcq7à‘Â[äSWäPdT܇ý¿ÿu™údþï¸ÆÏðÿ2a}ÿ_$Ššüÿñq%BÊÐX-Þ1†Åà#3­Jíe{&Pã‘d?àl‰ðbo°:¤ôQ”5ƒ„ëMA妠ò?TvÄä\4Ú¡ô ÇDï\ß<ß|ß²ñb&îäðô]¡P±Þ—tI#³9¢Èœtøªz6ç |ù8Eq¢g݈-pÔÈø„4K‹ñr-éúÿîø/Š"ôüO$Éø2ŒÿkÐ4þ¿ˆO•r0è}1ÑçPÍ¬å„„ä“æQ£‰þýy‘”)Œ_RPËl0Âéo0\©¯¤àλAAp¾@鲈¼E¥ U¦«Ò׊î'¸WOwÝ’¢|3­Åü¡îêdŸáþ¡Ko]~ŽpøG†Üõ, ½å;ÛOãôcîEw)R´R+ï|ô zf±ynó/K;NÌ)æuÝyXmiÏÓS[KÓ_F×t›ÖbÊÄÙiÝ–Wû'v9VõÃØ{?fÈÊü_éFs;'Üo{ÿ~õ¥0òí}—5[çÿÖóÖ¯ ˆY4ýAÍÉ+¹ÜÑžÓ¶çe¯øVÉþln͈åë{þè»æ‹þýN÷?ùÃo—£‹¼Þ®9Rñ¾µýÎwã{¯j%"Fvüeòè[ï­ÕƒåÆ.™G‹²Î&¥d’Ê[e-¦ÏNæŸ|{Õ’ûJþÄK}¨‚üŸLæÜ*m›ÑºÓ²Ú»‚“ÒûT\YÕ«'믜vZAí=K3çûÛ9“þû^²¬:{è‹®ÚÇåÛ|öpûf÷ãA»ŽÔjÆë,ûÆûNQÊvq³%™Õ«=nãW\úxCßÓ;·ë;TÙ6N±ÜZÔêâÕâқܖ³qOíìÜ{Li³+íl ˜10íížt÷)'>¼_`?š8þ½ ßÝ_²kնׄ¾™“#©ps÷m7q´å¥Ä°àä†.'›½ü{•oú¹ÃÄÊyÇ6¥ÎôRì¯zTU¹fÇܶ{—wÜAÿpúbOî•×[÷˜3þ@à•-Ún^AV$\Mž_ùA.wPd÷¾n "ÏŠx/ÑÃmñ9%Š€¼–7SOÄÏ=6kÉŠY²égZU¼¡,”CB|çU÷Ò|kÀ“Ò‹Ýã¶Í=ÚìQ¬¸glÍKåñÆ…ÝÇâNiç=â-n‹‰×ó³øjº¼ï¾¥ùäиݥ…«ê Ù…Ök²#·lŸ¸ò˜¾C6yʶþ-àîx¯˜¼ý-.Ç®)^°óáêAÚïÜ®ô\âvC¸êêkâî§ÎŸå¸ÝÉv¢ðñp­üÔÁ’ãCâ~ýPµ6÷ǵ;ª›¯Ssr s Ü_ýÖŽ¼V²ì~Ø\îãž)âmʈӵÉ%ÿ®²öý¥wïEž¨Rt¸6ï“ò}K³‡]º}WYÄ‘½Ù–ÃWŸLð9º¢¬ï䵺 í>ºT)<œ:.Ç»ö^ï°ÓÔ!g†•RŸµt»ÛüæÕ¥1…–a÷§«F—¯”½Ê£h]žâÒg|[PçOÇžu_¢_¸U}–ülf\Iµ|ý=CŽGIÔØV]ÝFWënN¸éƹsþԨ߭ØA F ’<ø{&´Ž#‹ˆœoLX·1 ý’û†ÍòŽrx¾oüô øõvwªO•ÞèµXjX}ë‡I'ßõë¿zÊ¿gì~x…*[ßlôJ÷+›Z´- èæ}|Ò‚ˆÌ~öžw¹ƒæßÙýíøÍk¸êêE1‘1„ªÃÞRÑÈ!Û&Ýô:MTºëØd÷39‰§Å‰^%òÄéý":u˜×¦*›j;Á­xÐl¯á¯Üþ63}öô6ä´e’%Ùnî9ß,ÍJ­=AšÝ©b¬dÍ„'YeIÇ’l;S–jSÖ¾,]ÐåBÅ–s¿|•wàgÖ©o|}­ìÞǪ¸Ôñ…ûWqÇŸÙ0d×÷—eÙå寅]üU8/°rgÖ«U§|þH*ÖÝ 8»öwÓûEÄ$òúÞ¥ó¼g·æË“×GïyƆŸVéã}íÝü7®Üí±òró7$_¯ù´ìÍ‹3y¦¨Ü,n¿X¿üÚ»«¿©ž[þÉšŒ.ˇ„U.Þ®<ô[³ÒWiqgRïí{”\ët§ÃY›Çå­BCzЂç%u<£¶"31¶_69Øzø÷-¯L?ùÛ›bÖ Y.›÷Ñûƒ®ŽùælëWjnÍ-^r¥V¦¶²øÌ0Ž i2&B á Ø2qÙÐä[(žJ—Añ¢¨tƒ.ØœG&óAµD.!ýÅÂT‚k¶Á ýø m&‚3{<Ñ€ˆÊjNSS¶d°N$OCåÙ^hžmˆ¡ Äe°  $è˜#^/t1ü‰ü‘ˆAqH“¼C:M&˜^* (Ø!I'TkӈΦ3š3X ÷Q”M‡ÂB~½kËêÉÆÑ ‚£Š"AA앜¤+Cx±N|8™æX‘aŽð úþõp„u8p'Y(/^dÔÐUX?¸#*íÚbHC‚T:6´"¨Q˜]X$ #@!ÐW•Ëx‘:æX ñ é¶L:™”ðùèO,;¾…2ÈûƒÏ8—‰üå¸ ö¯ ¸Àå$M mpœ«í£`ˆñ#pj¿‘Ö‡W$ aZl6¦7h›àém Ú&ä³m#„Ì-äý‰Dè—aôŸà“ÿHdŽÿF&’R© }³Ç°^¤„¥ÂGer G#ó'¤ˆyx&‘H]°ùL¹ÓÕŒ1w¨Oüfy†çlÿ0=J üÆ8Jž·Ÿüé¦aÃ4 ‰IL7Åš³t¦úý$ÿ“Ý$5覆Äv<ÆÄª+ûç"8WÅ%XѲ‡ÝÀŠÿÀ ,ÇB£nuwÛIη ûíè&¾ó ‚°7æµ\]XWƒ•¤AÛž®œ¿^";))Àø´{W^Td•ªÈS5LÉì ¬D2»>Ë`²Ó©NtEõèºj:ÖeQOƒÁJöˆ¤¤Ÿ 0±œ”ÊE©pâ“AƒQ à‹ ž‚F»Ò€`tt–0 żÐ)¼¬ƒèSV íÁ©ÚFeÅ“þB`/ h‹h¤ºP% ^"CE,öDnèÍÓñFñÒxé<Чçy&ž™Góì>ˆU¸™ªˆHëùÒ: àY›ó¤pív–'æ9(È1Ÿ£ŠÇD't=ômìðoÚÐÅ«Š_=_±C~£ÄØâdêq©ª/Ýqv δ™ÉmW’YI7¯eå_:Ó™8xäDyë^]ÿÚ) M_`ÜßnÕø÷nϹ9‡¢«¦.Ε½xìøæö'§ß÷}ðdÜçOtºe^]§,†Œðvp캓q‡kçcnfv~½cðžƒaCg=¾+xY¹I¡Ì,|E6ÐcmBå¢#¿¬íºðàÐãj³ŸÏ¹Ò#ÔÔsË/ÏÜ_—¼gìþq¥Ûe²·ÞýÕö$Gy©7çÓHŸ‚ÒOK"^ë³ò ÇʀЋ>öÞÓèÒå%ä*—Lû¢pF¯ŠÈ;š/žxŽìÚyƒï0ƒµö×¶½c_š²r”!ÑmÎä>ºäO².æÔ¼i|¹¼íô‘5ºe‰îFôØìû}«BÉ%÷‡ÖÕ‹kûqpÌpÔº»2fªöýwÔµ?_ê—¿b+1¥ö çüÈNÍ*fÛw4[°êÝKôX×fâ[Šq†Â½'ûT¯?·ïÖåG8gži{G§ ˜YUy£’ðžÚî†áB¯ÃóoŒßf÷勹ÆîöÏî|9*¨xÃÑøtŸÞÖS']Ô5×7¿•¨X±;wÝ›¿œY7û_iÄ©6Íã¥^¤ç¶»ujÔ^ª‘Gã6P~Þ¬ÃKïf^_¸áæÇûæ›§þ<)ÿ÷“?÷[øNܵ߯DWý¬|° å‘wÄ[–Ö¸WÒÓö5ç \4ïÍ“Qísg4{[îÇhoþöÞ¬ª­i&ä€ HIº9œsèîîn¤»»”R@P@D@¤‘R¤K%T¤SZJBô?P1n¼÷½ÿ÷|ÿó¾ïÕ}Öž™5{Ö¬Y³fí=ÃW¤¸}0ý|¡Yîaþ¥úç“-J++ýõò=“s€Êª¬¯wŠY1ã¢IïÓÑLï9öF¤b¡îÑÕÐèû7[²èÎk»`ØÑê:\±O{¦7guxG®’‹qÿŠ«Édi¦éãHL†uä›é!¦m½ ×”Vy•¥w©A,ÍØN…3+Yñ˜›]3rÔ-ÉÛ\ÞˆçGŽ-ŒÝa£ewúÖ”[}2žä,è9œ»—Q$•ú@Èçy[ §qã¢õÓµr¤üº.`£ˆ=;,çø †ó–RkÜ/¯M‰SµöÓÛi”i¹GW’];ÀÛ—¨H–ª˜¸>Ä}OMU|UІºÝôúk{Ôªws…›ÑM3›ÎS6ÎÕcBo.•Gf2¼½ºtÙbòâÅGÖxajªÍÛ¥>Æ=Ro0“ã~¨$Ór• ÙˆÌënºô‚‚õüëç kÃ8A-WÜ|=÷Ñn•¿ø\‡èå-’&6Û"1uö­õ oN-}€NP·GN¶/ßÚðᣚ2KÜëì´¬76^ƒé½èË“?° 6%~ÞŒ=‰Eô%`»5ÊAׇC–ýí’òíšnÛh][ùŠ÷*7‡w©É®'ò—^äŸUcâÕ馑2áö,Ÿ¯¼ãcêî²¼|=«53qo‘±!ÀúK¢ÛÑLäÛwC¬j¾Xï1½~Pô‰´Q™Cï¶§Uù˜BŒzWUÞã’CóÆk®WŒ7%A W[ÌŸ+c$Ô±âX•x]Mc-9DT°Hϵ؎jQþÒjúqÔþ™Ãêuœ€ù² ¬ñgH‘DŸ.kªÐsÕR-w¨Ÿ—šì‹tëõSퟺ9ç˜Á°EÞ!BR5Óm@± ¯±’µ%R×Z)9 $À»Õ"I9Œé´QCª¨D^Úΰò´·ÈV÷•0aˆ¸÷˜ÕÉ8tjÀ*¢»¨ô…2ï"»ưÎ*AdfÃákÕCc“üâîýƒ­MM*./„ÊÄôU–kbßë»E† €`ìúŒy>¯Àãyˆº|__µm !ö=ŽYßB¹qm¾ çm°Îxh$éË9_?žð¶•`täRu§‚J}2¥›%—<óßbtél5q}YŸ¼l3_¿ìÿ ññSžéb¬èYˆœÂÕþ>*¾)ÀQ÷+Ëȉ¡c~ãnñÎïªØW±BHùß÷É¡'жXM¯Ê[”¿•Ò=¿ÕKÞ1cÎ¥tx½mðÿÓÒ-çê¢øñþs›Á£ã‘SäÊÜj9ëÃÏcî“t8b„~Ù.‚ÁsEþ½ç~¼³ÃVSvF‹‹‡ëëb =³ópý°Ã|å3 1;äb0ן®Ä\Ð3+±(H $’I‚d@² "H ¤ RÁ|H¤Ò…­ÖÇïCظÙÁíãì<§K·Èê8Ù¢+Èd[Èí-ÜÜ`«ùI#ø°…ÝOéhoaé~ru|br†Ñs2¹Â~7g3 ;ÈtR¬ÃÌÉÕäýƒ7ðó®‘ûŸx.ž3Þ€‡º†úÀ3!0Í|n Ü¸ªHÒGR_}+;;ÉBh<0*JÙu(‚‹IÊn&Bt)˜&Iôe •^ØÍM{4ý0?ãÔ•Íþ¿}Ç´¤šþ‘¦úU=§:n½ùåÒžñ}Šú/ûÂS\ׯë¼Å¦Ë¾IÓYqSÝÔ°Å+±šÅroŽŒK§•h¢qÕ~rµ_¸Ç®°–ÃòU "+²|V¦ƒËå™,DÙ¹V'¾/>n\b¾øåêî•Ù<ìÃôÙ/‚Ó•†4²·”7ýfÂÕZ§—«“úàb«¿)¨8ð<]?FD@+Õ{Ã÷.1<µÊ¤t—ô#ØM/§è(»È®ߊeŠ#ã/U@ç‰KKc.Øú¢•?4ð¾œuö%òVLShÕhø¬:Åz«Y?¥Ö4ÞcµúøÓâžšW®Ðª±ésÎÃ< ª!űd}¤yw÷6ûÕõ³ïñ²®u»Vi¡nÌ™æïÁØñ¦óÙö=âšnWXK<‚zuBÝ.~|1ˆâÈÛâojrÛ©ìµØ#Ù ¨ ±úë\z_Äjþ®Ï‹>!\ï>©Õü—EÈ…:c–—m>ÝX4x‘½çs!SÎÃÔür`.^×;5Y¥yz‹9÷jH©òÕSö‡•:Æ->ÎlÉ/,ùìÝý«ßd.e©aF•Ú÷qH_\»µmyGI±\P2 QD3—Àö£'I¢Jš=Bã Hðͼáab»ÒÂúË*c·ÃÎÉ(ÚNǽˆ5¤Ÿ¿ûpšY„~s.“мI d®Yyîãs=Ë–ƒ*òrÑí˜Zî4õ˜Þ;æÃ&éÞÂâJ;"—&Rµ ÅìvJBýj¶BÓBÈPwŠáï¦Ú2è 9½¦¯®¥¸Jλ\I3÷òÆËé9QÄ O~ Èéͫõ—ËýUKˆª‰oj±æ2°´Ð Î'´\·×ijíµî¿{ý%áîáG4ñÚ þh ‡·¼‘ ™²/îg½s}u‚^0šÐAì«ÈžHHàÞøny½q½Cî¹%~†(qÌ,­l:FÀÜílQÕº7Zjhüäù1ÛE9‰OÈÉHÛä×2¢£¦?©{-Vb™7yI›åÚÓ;$yÛòhF"™æº7ÏJ8T6¡¥ÒówdDz ;šDoNío=Š+ ~á)w‡hùœè˜M† aÜN ðä çöËiÔÏJªòj;¨³— $ƒŸ‰ú€O¨jæW¬ÇÀ"i·ØônQ©œ3œ§t¯qà:9ǰ1 [ &èL\‘)¸9è|åÍ~‡›²õšZŒòà •Ì)ÁË0ò„M^õb“­Ë‡ŒÁ5N”jê"³é42¹²UÈV];ÅM}­U4ÍŠ¸¹t“ «zqo¡ød¯¤²8.ª*H•%ùÌ^9ÄOÕAç.),ºÀv+ìËMÑˈԯ"2‘ÜE›É˜Õš£3¢SA3ÑÊñúؽïe?ߟõrßÔWiÔ{j°íâj®ö¹xÙ0ð¦1 Û²û2–[uï–ï¹€öRcðî&P¨HÈÞß7á¹¾©fL•mCþ¹å7²meí8c ÊÌ“GÊÑUqdõ/g˜bôíüÉP,Ì£‹-ñŠ„Â-Gv¹ˆ¸\R–ÚÏMçé9™Ôµâ£„9¸?j 7È™$w-sx”Ÿ­—‘;ÍmÁ‘»ø¡¸2å²Â¶bÌ9òK’~%/ëßûf±Y–t™62žšôÊøB„|°,-ó§éyÖ¤¹È…2§ìKxžäê ß |vàm!çàyýœJ¾×ªaM©ðû†¦±² …±¶lK©Õóþ‰-ÊÒvˣÖ!i¨D"šºŠ²ÒGáyd*_<–•w$‘#÷Qø‡ß®4ŠòÛ[éékª1O0Æ&…ÆÑû'^£8zo.è¹ëž¥Ýè‘8:mFíE– ‘zìº#Ò•2@¦ì·{—ï±LZ¢ÐbÞs#D@ÂÕKs%-, 7Ô \㣞K]Ó Í%K»Ï¡æ5n[¯+:Ô+îSӚ΀¥B£Ö$SrPÛæ?¹© 6ÎðœÃ-KÁO" “¥õŽ%5ržëíáM¼®LqŠ÷®“i£V9ïà¾X6Å9PW9Ã6ÐR†Ý«:+GMôhrBU‡À§(Ó(ë’Zn¬‚Ò½¼7øùÖÄø„ÖÜÝâ&ñÄf—7Zîô:I“]˜²áuùBÅMM2[àª3ÛÆõz7ïû­$66‰DŸglò^!éˆ @nŽâøÉö/ÈëËW¢S·v X9-l ©ï7¯V™ö 2J¥?F—¶XOlÖ°Á O߯’¯0¿¼›lLÒÏ–ü(#-‡b“‰Ï9QIùÎcvµ,‡º„ýý†âgŸqjZdìËÒÅÔ?–Œ¼ro‡„'=A[:KC/Iò!k¿])Àõ­z$ šJz¸Èž<ãžWð•èv|”kJ¼ÅmSñZün±°Ú¶õ˲¶Y:¡Ê] µøŽržóGU qš˜ ÛõЖY_qMÍ•wu%ŇiOKTŒ5òsŠ7ÖùûÖ%òê‡PA¬£k2/“hï³£ s(b”ÂtCFæYã‚æ‡xàn u½1^ü¼p«–H¤w iï(ks/w(³û<Ó;>„ôÇ·‡¬öVXë„økPwë.¾’Þ<ª:×ííúxú5~ý¼ÓˆáEç%+â)µm' û­9=‡!ä›CJ÷„98G½D cÜ©ˆ¯³¿&ÍŒu^#LŒgËÈäÒIlB1ã»R »cJsî’±›^õEvagº›í%Èlƒþ‚ ò¯ žïã¢vS}NÃèWXB K{ñh5羿a!#vN/Ä–¡œÉM°øª×ÈÎú]c6÷Dé(5/)3ê6ˆo¸,èp†q‡b]SI6ˆW{ÀªiÈ$áŠßlT¨ý„‡v]ŠP¼“Õ‚`´:¥ËwžÔˆou(‘kõñ.úJÀMœ˜ª OEw×áû/ œ‡¬kU#Ç¢bc°9î‘~d¼ÎvwsºGô5®ã%ž4"!Åֻà ÊY¹ÈUKïšLçÄ•ù¶uòá"z[qêÓ Õ!mç+øÛœ;gžï]¾ób¸ÍQï£ûå­ƒ9ƒùü$$ Œ·¾<…Å^çʦ©óÔ™Ì÷0I-¯Gú›N¯ V¡¡p«ZŽW ßNï¥òGW¥1'h–µ&x/>Úd´!,ê|Y;ã£ÅÏ áuWÃ#Gƒ¯^—6i&šS Dlj­¾tÃýÊ$zŒ‡dØa”ŒO3e›å…Ï@ãâÌ|öœúmbM]UUDãBF&¦¶‡³ ÅCÊÆc•žV¹4L)©±¹ˆv¹ÈÍ ŒÚÌ©ä5€ã_„kt®49^áì0ªÈyÓ"š¡*6Tˆ/l|è³bÎ&ÆG|^fGªkBϘ§Æ¹˜:s#ÔHâ.é€ÖÑ4ý.('²æÝM—Å¡›:„É 9U z·OÁÏZ:×]©·®—¦yh»y)ÐMË‹Üõz§ý¼[RýЋU9W¹8 £ Qq·¥Dù™$³•£ÃÉ\µv\ðÁÌ-¢‰Ã軓 UÛm © ìì É ú•Z9¹ç„=UÓ6FoTY/:pÝ“껩œ]‰áÍ¥¸œª WÇUn 'ÈÉÊ«¯ÓmÔß“–’Âæn+ÔaTæñT¸úá]þ¥œÀø­è‘¢— ï =IRr;íÎè\¼Û#.dL ¡è[aà‰$U#¹ùÔ9…áðKh>9Æ€^þ§ÔP» ù*¦»ò׋tÖÁ×^¼7áS’ôc—¿v}Ä‘{›ÓÓÇØ¡d rhDÿUÀ•‹9¦íD€™ ¿ª7ò >³#FòØîlÍsmxÝDÓ—-p(r¹ÂãeʼŒz;~%×!·µyrÿaîõšM‰vÞà[£™é¯ôFƒø‹qfxTá±:Ç Z7:.m’ˆ`·)xø|`)`ûlÈ/a ~÷Y„¶Ý/Hósnk+ƒ‰ö]·Þ׳îtžÒÕéáKÍ¥â–ëÄ»øs-ݼíY¤$ZZ9JØ3d¨_ÜUÍêiâXç¥j |»VêxéAµ¥;v&ÖyÇœÚð⬋©w’vÈÊS#ç#•™Éª½ÁLŽóZåZšI¢œ¹Ìå¶ÝsÛÖé.¯•{&»¤ïD{yz›ÃH|K&“{t®õ¬¤]Õ=`¬§.¦|õ,Òu]`®I[¿ «¨PãݽY°î³ƒpöŒÇüÚ-<—@Õ ·Þvs¶<&¼ñH…Ó„¦“+p`h¿Ë­=l>¯s-„yJÞÏ~MíP¶˜Í>§—•¯ Y1@Ûïã”zÉADûçÛùN 1^7?Äñ¸,0¢ßÓ‰6º„E?#|.ºÑpI¤G%úì-Ù¤Ÿ¹ŠëS0ç`©³cÐ|>))ýUy ÑÍ]ŠÅ(H©!wD-à~× šÄ’qbš»ÎxIQ‘‹ðMËtúqU¡xì{}ȱØÖ6¹+ŒOú.µÓÒ×ÇÆP_ç$¡Ô¯’T†³Ì¥9téë­L·šð¡-P´£c/ôx7zèÝj%½6ʹÊÓóF¬0-Ð2ñÑìr»÷#Kä/SC|ì1ìΕ }ìøŒÊÇÀhÈtóèsÈy| èiÇÑë¡W!#)ÅOvTWf‚ÞâúEAXÖ&·.*Žhv>zu$ ú´/äÌ<ž‹¼ûv€tåô°§"/Ðhr¿+áÅC ¡‹ÛlÕríè˜ùÍclhEê?wï‹ï =V¹‹CºD•±.éŠEµZÒ¯7"r»h¼WÃÁ•žÁ/›•Z_ó>Ó¬U8Çõu›ë¾NøR‰äeZ\\$ú[œ‚>ÜåÌÉš wc($úGÊ/£PÀ(]•¿æ´».\[窹õ |i|}6¼­õE(G¤V–xï¢|Ðô2ŽBèÅ4 "%‰‹üáñ4SÒTž¸ù†­Ž¦¬ÅaŸc¼Ã>‡ë(Û"¼"Z¯6'Ý—*Ãy¡ŠN”ê¢@™’7QQ÷›qD<–X‰oç´˜#ß^²gÞxŒ£Þ0W07È›¯§l˜ð¶zkííANJÊÑÑÖ³ÅX(•Õè]þN»{>ý;ä¾Ña¥ÑÝWy¬V“7ÝèæIØ„¼ìW£¾0ÞŒóŽò~µQâÇ;çò¨ÝŒ ±êÊç‹¥/Ûœ/œ'çz¼,köòåèþÝ……LS^^ŒÄâg*"]eI|-ÄòØ4¹{‹]–ôQÂÕé“ò¢÷܆ÃÄð”…Ôd¨:­>dR±v0^&&P–2¾Ê XëU9‰žÅ%E@ËBëÖt,!aB3¢¼G…œ…­ÒAݱpYQ¡iñ³rm›dÕFp‘Ô…@ ͸‡á<2‘uϾø¬²[Ï '¼õìêuœ|—IõÁS7eë‰Ìy]kAìBIÊ%ùy—¹ßÕ/Q¾zà °jœ­m¦Nã”3Št Iâj–Ôã1|p#X-=îu},8Üp¨Â»ê¾_œÿá^bô•rèÒ°.ÙDó§¡ÞÖVç×ÁåÌ1¬&—·B b]©Ü“æPf虉26 2’ž™‰¢ãÀ&8í‘] êYh¸5^úx_‡•ÄäHèe3°”þ<Ý-}ÌM^”Ìl‘t†sm"¶wõ¨ì¨íÑ‚@7±Ç«AW9EÔ­ñw­)o'K¥]Â{ç°³Ïpir?¨­pícb™¢ùÛÀ BÚÎî*½)º ¾„?á~¿èƒ¥@‘iØn¡7/ C F¹Ç WHsQƒdKy\CV¥,çò+´œfZçîná|¼RV ›[”(²WÀÆbšDz_æ…4·ÓB™4‰‡—h ÚÜ]øAŸ¢¢R†nf£×6¿Ž{éÀ…ºí õX1«ÿ`v¸LIi¥Ø¾ƒÚ@Q㲸ý®^8$µ©òrtÛê^±ïë¥@)Eªˆa-ÓA)eT•=l¼›zĨÊ*CÏ‘•4í9(Ñâ7¸$8§ýÐZ X ýÈ{áééú M"D7®H /9»¢?F*@l_O‘nÝxØM5Á¾xáJà „¢ôçX×[ƒß¨­?T(V•ÎÐdãpðj%ðÆ8RмVi”#eç$Ir»'ήˆ>-÷ª³töe C–¤Å,bê´ÉÐŒi€PwEW˜-}õ †Çý†Y&Bïý+êjÅòóðúd˜Ë±D¸ùíF¢ñ«îšA7¼$ 9eÏ{$|Ï·è;ä±k >ËÃe• “#Ì~ý™Ù½çKjœkZh¤xv\RĘtãne’ *1ÛÁ5±qÙÅ MÆJ[—RŠüœŠæïöÐ8ºås­öˆußù}Öç©N™rqø\uEÞ×Äð#Ÿº×<À+§¦žÎúé‚Êåø{úi {“[<ÏyPì2ÉyÓfå<å"Ì\ÏP‡¶xÑ~jxyI¦—ͦ<é6õ“r*Yv®•7³ Ëûf?ÏÅûYmF­¬áS½×²¼]†R¶ölX ä•]à€ëÝÈöŽ×Ò’ÛÎ>ùBþ}•U5™XÏYfž§`A^ñ ;ž»îÌŒž Œ™çÝ÷ó­ö’zÈ.½dÞ,¥mÛ L:Ô0†"7¨­îÖ5{?U¨°K~%ÓãZnž©êð65}JÙ:åþ3U­,$5 :s,céÆ[¼Å@¡¾þ:çSeA>ÄéY†§ß¹>ìÏw :!¢¨Ÿ4ÙŠÞM×QÀ¿ô¡ð sø.„°t¨Í´Ä¥V†¶¦3™ ˆÄ”’§QNª¹~¯ è¡Ë™;òLÎ.:Â3Ý™ñÝ“Ò<©‰Pèk`O.ø±"íç,.›ÛY–)èqÈù-ChóM`£c®v9í¯î~á™c’’#Óy'‚™ù€Ôb[/®eäüfk‡–ž²î:åkµ¼'er‹€â›ééœ 7+Iµ†=<¯Ì‡ÜÓ¾Ï 1ˆ×©„éóUñÚ1äó¼ßd›†u³|P@àwæëà¿@TBýw©ïe ÖQøø %înö‹Ç}ŒþŒï3!qa壪c@$«kaþ]ĹÅråÕÝW½Ùi{ªÚ÷ÜI ®¶Ü`¦?zùŽØ,K—möànT(÷ý ü^ñŠ÷:Sæâ¹nàm52~¼Àcµ„ݹM!s“/T‰Œç_Q$­íE÷ÎUT~ëÖ¨á%ϪbÍÉìfÄ9„$ŽIÆÊÜíý£iJ-Ø<¼3Mmà¡p}¹5ÊJ"y…=£²9·°I£^Ì%0Ýw¼HXttrçl»«V—­Àêáܳ˓Ï#Óœ/{ÈnêýÞ\ÃΦð Ý š7›y%˜¾‘y‚étˆ2A4N <ŠÔw§Ùžû«™³BäR˜qg3Ýg“«ø}qتZó6*2jތۿ¯á_jY¼R.` œ"vìëny²ýI­Á°v§l Má)Fç¦Ãe÷RN¹NÏÊ6ûž¿üØÜÊc"á>çøQèv•²–èv{Óƒ"#Q}õ¿yÍáia«:W²Î澺+f-‘.7©T·3qd‰¨Ñ$o¾´ÊŠ—£Öʨd£ªP|tÓ×6RwøÑ>ÿ+–ŒG>x9Bñ»»ÍÏYêf¹n ëx†éÖ(CãÖ¯ÆOÍZLõ€Ÿ”—?lë’ºÉlPm„,‡˜¢£ÆËdîh"ŽKÿxûÙl¿%—ÈŽfîûPë ø)š>ç0hÊ#imÖヾ/ëûÖø< ª Mó<Ömœl*ùøLYUìúñˆ ŠMÆC1n–Ë›9Ø7àöÕPÁ1ôhI£<Μ’.%UC/_k¶$ÇÞ½3*¬a&*åÀw›B¶fê¯%íŠuÎóìèeGpÎå˜f]ßótÏKh+IªRÕ7ƒl‹\|{Ç¥:×x¬°F´eɼÝASZÉËw-íûED,‚6zŠ[Èõ¸£SŸ‰™ê’·TVÇ+Gí¡ ˆºe› ÊÙzµ zdó ¸WNÛ³`k/ñï“åÝâUôŒÏ#X²74Twr_zqd¢Vz}(L÷ÓÚÛúÇ=½dj•ŠY[n#ša±œŒÌMâÄãAä}ÌYD¡Vû: µ¸•†‰:d̸ü?ʉ¼kÓ÷D®f(Å3‰-OS;ß E¹Ñg?bÎnŒgP8ÈD÷šÖ‹;w>­0»ÔÙÊVMDX–Wˆ®‘ Mø3‘T¯CBÀÊ]‹ØZ’XÙ-ßtÛ6 ÑF)Z¦±ìÓ]Ö¯*×K–uïÙ‹<^­nàÃiy…ÞϨ?iÍ´W¥¤s³t^e{ éIeâ£ÅQ¤7v&FÕ·µ‹uí3ê¢4éiÕjÍDËxh© Bƒv¤ƒ'û÷¥{Èl"žÄèD°MZÓ°ûWkÎ Ró1§—{Ïq×èèÓ<Û/Ú\ÖBíizÙý09ÔZÊÃW± Âõ·½w®G‚^DFnµMՓЇIFõ}X~€°ÌnüÀanÞ„ ÌԘبçg'ÝsÏ f¡2ÑÑpwèã }žØÙ ÃÍ6tIÀü45©½fóË'T †,ãcûò»ugMI¬ôçÅ«cY8ZàÅï må<ÂÞ,à´Q´ðOêÈDÔ{V¥“q1<“½EV*éÍ3aQf†'º¯«Ø:.>}ðâe.b€cLÈ{Ój…¨J6yiçsfˆ–ÌçÅÕîZðຜ:e4®Ê^o DxV>•³™­¶¼ñ ±‰rh¯…MÊõçÜëQbAc¼e}µúÆË±%¸¬R˜>hí%qø‹\&\1ÖYôícNh½ÌÔâI<–Ý»SïŒa.¸\Í´&/"B‰¶ÖQ¼|íIÁU½õ¼Û:×Ȭ¸»ÂäèÔ†?%XÏI“:Þç1*ÇXåÕ´É…\]¨èüx¯¸(n^Å3è‹I¶Fº´Ë³åõåYB)ýeÇh6ƒâˆ¯Ë+8RrW·dÌp¦ºË檡Vë²÷È¢ êÞÆr &ÈÛ”ðc1.ꦑˆˆcÉzÔÄmÁ÷ØÞ,Orñ²?‘tÓ¢ôôð—B©ž% a…Øï>¯Û¯] ‹ü˜ jKªo1wsÚ+Ä¿Ë@É”ã.êªËîl•joh߯þҲ康 ==gmNF~yu)s §axoßµ]¬Ø/­Ilý‹óöÞÄÑMÛ/·’Ců.ÅÞCä¸ðÈ'À) Ôœ!ó‹­æ…µÃ¤Ä:]³j¯8ì¦'“^/J+HV¸ùüÖŒ›<ÈÈù{Lõ&ÝV3©âTc¾x³Üòí^•æ¯6³âÓß“Þ6OˆƒÈšš÷2jMévÄ\Ò’ñ6þ\I[îd7®^}%r6©D¨{CY~ÔÞâMMƒO3'2F­i½Dd•WTJ-VÑk«XT,úÙ9ZŒZb5É­ü&¶7Áz˜“Ìq™–t¡4Un!iܺÈ*=äžEÂ}­vYèÈmÏæQmVA_nÞÑœ{hQ=QmEßI5 ¥±KùhoÁùå™pq~¦)-zZð{œO¸ÙŒ/.0å‚öbG™'/9§WTÎw´]­nÑå¸eˆL˜†\b¿úYÖü^Õ¿¬çÆ…×_£›gb;ܦ:)Sî‡4É=—¼/DáÉÓÎ*bðXX*¬N+Ufu ;¥tHqáÀ&ïâ>eJƒN…æ—7Á׺9nOzõ )Ðù§0WÒªäaØÍ MJ›H½Fô™T`êËJ´Ó¹°Y Ù‹™tòêmW/èOû=[CÜË—"á¦Ð«sI¹¸"†Æ˜+O`ÜLn†¦ F4D/…»> ¦3T_U{|y•Ûzm»KÌÎ-ÁO<ŸD£¦+ú&âÀ/U؆ŒU€³Ïeqž&#ÑåvzÞ}_…v/åò-Cï•Ä/mš8¯ß÷IˆúÞ㨙4³btr^6ßQùbCcé”ÎÁH¯ÿáCƱ”¥"a,”<%võÝ”‰Ò'snS/Úöj¬®îð%#?â¾0Ðhc-ô Ø‘qCŠ|g"¤µmêAÚf0ONq@ïÈG-€¾êÑÓ2ÝäÄ ü¹­þÜ0çç³ì.6ëiË[ =jªFt ð}™—¨Â/` ¸­üÅU*rÈœ8& µÚÖ7°,}gÊ5bÕMþµáS¤Ò¯1XûOAدK}ê(*|{ÊÁõ-ú' ì ¯jOf`eã(H¿VÓ@´1¤×æTdWt·°¶‘ñuµP÷UÒ0óµ3ã5§‚a™À:¶`õ6qfµ<;º-ÜÌ©ÄÕ¤¨àÞ|ÞÎ06€ÞöŽn|Þ‚ôÇ(|°kx3ˆx ân'H¯£¨r\JÓÎÆaãe³‚¡,@Kx +/'W; ˜‹FÒÕÜ’OMBê” ì— ý™je^Ðã*e`^^^;°Â XÝ|ÝM¼YݨéOñlt¾¡9º±ót\ÐÛFfc}íèkž¤þû8‚ ½‡‡9/˜Ë„‡“ÕÔ‚“‹ ¶³Â¿Hg5±äæ4árpƒ- _»s>ÃæýÁnÀ:„Âä»âS9Iüã*H/­¢”†g~:-\ /=è_æ &øßsÐS1À`øÓƒH˜¸[AØÁ\¬ì¼¬^ 0”ÂÇÉÉÌácgý 8F?~óï ž<ƒêäªS !+W'KË3I 6è´S(ÐOÒù·åe⬨øçsp€«4ŽOâ4‹ˆ¬ÄÒÕ¿=Ææfßvöpµ?žæf { 8on0¦Á0ŽÍÍøNRdÁæ§³³½ÙqÚ¸vÂTvÓÝÆÝÞBè˜1Q{÷“ {x|ö&ŽV‚ôÞ¬æ–&öîôBšŽÇÐæ'£aos:,Çx ï´~3V Ó¹ ¿üf9„þºžÁßüóïún.a¦WÞ n 5Çß­ñ×yÍð»iÍ+1LpígàƒÏv^/ÌDCŽ' =;;= 6»þât60ün¾0~ûÖÛÕÂÀ„€ìßþ¹89¡œ@Kài˜ <¹ãxÚæâáþÔÆææâú¥‹ý—6X+ç/pœ<¿âòð²ÿÜáâäý¹——ò úKœø»Ù?ÁÁs%ýÔ…pÿÒ˜ þµë—6('ô—>89y¦f‡B9~ÁóþLÌÉÁuFî®ð’î®ÇU«ÛøZÀÆ Rsrrb ÉÂócCN¾–•ê HB8ĹÁ¼<¢\¼<œˆ¸¸·¸Ö“'X *ô׆€ã¼#&®îÇÊæf‡rhi%•¥þ/‰ÜŸÿMÑÄÎæ0Y°9¸yþOÕÿ„rA¹áù¸¸ÁP˜Æ‚Oê‚ÿ/ÿÛÿLýê_“¶ñþQÒ65 ü%k£þorµQÿóTmÔÿ0Îa×ßgüM3˜¹15WÕ‹þpnÇ£ðU5QódH<\O¬È?a  ®!j¬ +f¬&©{>'4 ðgeHè*¹ñµõ+¸„˜ôqëtFóo8_ïž¡»ûŸñƒ†gª8óü§”€M˜!ƒ×øù&¸ÿ4@VQ凇;Ëè·›??ì7ãŸ?ì¦lîÛÀ ¯Óà 6h'Æÿ ¦ëë¤(qòCâäLn”²R@*†ãV˜Éc¤‚—:¦:Q$ª³˜g15Ì”’J²Rÿ‘‡¡žÔljªKk‹jh@!ðÕ|êšOgmwwVx»™3ÈÆ®áfv,0Ìc«æeƒÒ¶q„×úùfêaÓüëÒ [¶Nãlÿ »€3l ÙÿëGw‡ |V:Ã7b_·Õÿ‡”²Jâ š’@6¸Å2†Ñd³q4û§œÂд,\aná©wåázœòëÔÂ~ͧjzŽÓÁW®ÚÙ±*R%udÕ5Ø N“¯Ú¸³™1(@EIuuQiI ¸É±÷ÕôØõœ,0ÏÄ æ°À=«¹;kÙÙ~ [­,¾æaÿa8YH~ìžb¶›Ÿz‡ðBV0ï¤šš²T·€/Ož6N°… Æ)ÌÙ`ûfͯVì§ñ81ó®ð­ü±4¼¬m̬O½€P·“éf–c/ðÔ±5·p†Ç›`ƒxì%}‹ôœ,ÙÇSé¸òÁO^Û¿ó41QØü’UƒM.6qqc-I5ux±-ÆÿD`0Põ‰X;°yššî›»S[Øèþ'–¶˜©‰Ÿòö—Ìœ6“ãòŽ0{do²M:•þ_¢Ãg‚’„¤PV ¶*(À…8s}ÌÄWMú ,|Eüôûxµ9ÓÆh[Eþ”Ì–~úý+‘ÓB)G¯7«g| x½s“¿Z¿-QY cØâ¤.©ã@JTA]òëºõ}É:ãzSýý½yìÖß28ŽÙþpÆ=ÿû›·Nõ3/jš’g…Ç; rJà˜e* Ýwº”°fª³&èxÆš«¯~î™ûgAÿÉÆå÷”þå­ÌYÊÿâžæ÷¼ÿ›»œ?ìá¿Ù÷œ¡ô_n€~dïd…·v:µœL£Ýu¶Ç;S9±“ßV Ç“îÀ×Öfó÷Eâ¿ò±N²¢Ÿ9†¯K£ÁÉîHEMYü›»_uèò;˜fß„þî&\ßþ¡¬¾­6n§ -\'~”Ìw¡ÁïÁ«cãL§Õ Ôß"l}†+ ìö±ÿÃUöÏÌÜzQJ\YSã«`¾ £Á‰µ:ûoãðägÈ/ ПA ?€œò"&÷#/'8Œðc¦S^¾ƒœeî;ägÈ/ ПA ?€PJ¯3šÇ ãY>¾¶íølä7mПÚÎ>èOô~iƒü¦ ú­í?›èpuµp‡G:ÝNœúå„»|g÷O›ÜWíú¾5:Õ-0L±¤D¥ÕwšÚ²J°]Hâtû’¥a€_«)+k{I¸›¢þmÛ|æ6ÌxÁöfΰ= l{Îw]¾ÂÝIÿ ¼±9Û‰³Ð3\IsõSÏ^nc(Žæš8Ûœþ°³pu´°?ùñSç åXdø`yÙ¸›Y[ü2X?oÿ#²ÇƒöÝÁVÒTd„;@EBÌXIYIòì¹4LPÎæ¦|Žð­쾆®Š¤±¸²’º2ÌžˆjHžÞ‡¯T|ðªNÇNÅÓç+Ý3¿¦óƒõs‚@nv€š†ññÒg,.#)./«=HZï´§ßÞUÓw󸛢‡ÇÝÜœ\á¡Àã¯2á[!øþî¸<ò_!` ‹+Jœ*‘™=›…7Ì7;®±é<¯0ÂTöøbšÒ@2ä+ƉýCŽbüÅÒ³9¾õÓ£2Óú¦Øpc ¿†!˲AÚP HRÆÍ ’’ÔÎòéjvÒ«=Ý›ƒ2RpHõð„½ßŸd•äaOöö6Žv§Ð°IpúDßà1¶³@0òÛcƒ`–Àõø{˜ÆÁœ[x©dØÕwtIÉÐÿ ‚¹/n>nî§úiøÚ7‹s¶&º¯..lm8Õ^Æñ¾ZžŸðNœác¬ŸuüïícÙ(}w ÜNm÷ß"óç{¤ÓµVCTMúx+óc¼õØd@œêÜ^ž4ˆiÊ*HÀ´¬&ª¦û팀†¬8|óyò[á _²~%ôþ@á¬wgwk¾Ÿ“gŒ5ãó  ðÇÑOÀ¯ýæö©&0žNËoÆïØÎÆŸ÷z¿Ûaþ±`áAÞÿN°°–ãIw ù? e8ÇüÿPÊDZî?’òñÍ?”òÙmú¯r>igƒþ]9ÿ$ȳSÿuŸqšþ,/˜óz&æ, ŒÆãòÏuýçNþd`6ö¿×u¸Oï@JVAòk¬Cígµ¿39ÎPþpÐŽuë?´?› ßðŠü×ã÷UÁO\ž_á~`òGfþ¿òÓ‰÷3_ÿÝÿõÄûO†ü‡™úŸíMÏãÃÏ'¾¾a{¸ > ØÃ!þÓ³GÀÙc³Ýü P ÙþÎlü.þzŸ}  /).£ü}÷§.hôMŽ÷sÇ;aueM5qIu¾³;àã»FŒŒ@!ØcGCŒaì¹ÁÌÞ ûÙÇþñþIÏ07ç̯xê­Ÿ„–T\Lí-¾Ãã:ß9>–ηәö˜Uçc3dƒuÃxv‡øUµ~ø•#ðgÙ3Ï55'2ý¶{>–éÙ½4\¦ê¢Š* ’?ö,È7ÁÂßÿ‰`¼V°?aþ]Á~gûGÁžiÿÙ3‚ýCFàÏøƒ#þ,4ÈBƒüµÐ ¿ä/„ùC¡Aþ™Ð  4ÈüFh¿aþ,xÌðwƒþ 0è_ ú;AÿB`Ð?ôŸ úƒþ( èoö[FàÏ8Ž£žJìo¯ 0eG{ ÌàÍ<ÜÜ€6ާuB€®ÏþlêšRR²:0±Ÿ¹²™Ù\a†ß66ÇçwŒ°ß~?Ù•¸Iá;>úººÁœ)Ø.\H#ð#öoaüYüùäêtþáÛ¦\Ê F$eNà "Áh™ý¶—fðßéå¬Óñõùéú¯÷ò_;©ÿ _zOÎwNúŽNðc¸Žq¾‡ó¿±À$§ðýÌèûÑú)5øYÖ×C¢ßž ÿ¥§øo)üåé'{–¯£®(*•XžõÐŽ/O/Ï=Â%ð·‘N¼~àßG:{”ù!ýÐàø¨ñäÙDXÕág u Hõì)PHIS¢§oœb|ëïk(ëïˆå”ÄNáçÿˆÂûÇ~áá_}/ædQÑ8=n…Ÿ·M?9<–1LÓŽ!ø`Š%sRFúd}9u9~ñ˜ÿÈŸ>Ùo~5Áßö”ß!¾Z^'÷ßìƒÏîâê~B ü —ÿøal,Þ0gøäÙLm,-`€î@ÖSíbýÖø·±YaâìáîzZ©ò¯žŠrü$§zùuH~#˜‡ñ“ßÇø­áÌý°˜ÿ‘³þè|ßÊ_•O>¿q‹ÿÐÃ/òþcÄ¿ößAýUÒŒÅ3‡p5ÿ.X¸×ý÷… ùI¨¿8óÿD¨ßÏŠ¹ù.PÈŸôW¤¿%Ì?Cû½ Å8"ÜL|—â±+þ÷ÅýIŒ¿¸øÿDŒßÏÓOØù.GèŸÈñ7XKŠ÷{Iþ.ÊŸ,ßïD|ãþêo ÐÁþöáÏÆðÓ4àûá=Šß’ýþÙ­à'¥àûáÝ‹?$ ù-YÈÏd¡?“…þ9YèoÉBÏ’ýaâûíšôâ=ÕПÄ{ÒzF¼ß)ÿjWÿ@Â?Qþ¡õŒ„¤ ùKÊßR†üLú3eè_R†þ–2ô;å?qITÖïnéï`ÔÀ¿†…ü°ÐßÀþäÿÙ4ûÅ 1øö)þŸxðpôähâÔTþ¦#ª_r¥:¦y"çŸoý%öñÕo±Oný5Y%ñ?¢p|ë„üÛG Èç)1±1å·|Á%ÿ3þéÎýø |6ëoïü–«¿Â7>ÞÐSùgøÇ ÿÿëgÖ…oafí”=Ñ>ø 'ëèé{ißö'g6t¿WÑïû½¯ó[Ëwã÷u®¿õÇÚþ“÷£½û{ľÃþdå~4qŸÄø7†íG«ö÷‰AcËNˆQ%ᯠ֚&û^{ÙYÀS@³—±Uy ¢‚ÂP—âí3ôˆ-ÛŠÄh‰(ƒHi‰æ,"–à\±(Ã>‹Ž=Œ}ëv€ztspp³ü à³Ý-ÞæK¤±¢ÁsI/ÚvßOåófëó²[¤Ïܧê(fŒ@n<³7|çIÙ„èˆ1êj=æz~Ö°¯%ß³F<Ѫy£sª¢ÈVãfŠ„\ÿ:UUMaŠm€²åu"ÜUÖþó *s*-¢/-ï]U æ]·éIP`*Âks!¾>þ.ƒoдè¤tÇMÊð&Ž׋ÊZà{TNý£¼ðû½D·æÞgÅX#jÎ8ñ}yŸñæ JÄ]Üà¯Æ1ö¬EFB|Äü1@¥ß¥þ®Eì“h:‰ÛO…„3À¯ÓbAƒuí¡®+=?S¯‡>`e¸$‰h˜]ñ.MGÔ¤æ¨Rð‚âŠÎžÞea½W t«»=%òNç‘Ñ×Ã$_+†/¥d„Œ|ð~,¢ªGSx ˜Ò]!ùÞyåK”]µ˜Ê9fî’ këéã8µ¢ÀR´Bt-?z¼™0)ZG„Yϼ­Sx£L7)æQ•$Þð@<$ešOq HÏ+Ny¹&ï^vR ±nB¯XN&UòâÀË'e§0š^4‰ˆ<¬}á³·¸N~ÈN«!^»4¢¼™µDçKGŸÐ[*s…€¯$²ÄÁšF.ãé îÄ—/låÄ'ô¹ŸÇȆã* ú å§çò•o¸f샷$\b>Œ£Š¼œ´ÉM°,bíJÈH»¸O~6eÖ*/¯Ò¯na=žÌ üRU•‚ (vjªêÞ['º‚[}ØmÌ6¼w€Ú­°¯bDÓHß}¸¹}À¾V³;¦ýö-G߯®£&ÅVù+íðóì{®nŒµ~4j tËœM ”Âñ•ñ—pRç™qö£ä½îÐx°ù¤'WjÚG Ôû’èÍ[ZŽëÊ"qAïôÛßïy®ïì†áÌ¢òZB‹TMvR¯réºsfKÇlÖ˜W”˜G^é £"Q>=g=Ÿeè•Ü£wórò›ÈÁh½Û|•r–ž ßžª,Ò_¼Vg_²ã©B{Ë×s)¨Øª‚  ]dštsQGL»û™6zTŠû૦re¨õ%Ë+Þž)}4zf#É|¡ìbï½kó<©@Ò›r²ÜÓZÔçî)‘ó_ed´M¸•EG)šÒÆøznCo¶ü\“`±ˆx—žzQêc:…ç–;¬¨€9MS $eã’ܬ†ŒöÜ«<7ð¹1> @×öd9 Vn-y®‡Yv) ø&Î='Ò×R1Ÿû™1ÑÉ[‚®šVÚŠÕ0nù"…1¸-Eb Ý;Wñ¸®kÔè÷ÿN£ðÁ;*ˆNÄ€ÝË&~Ù«×.\vç¡mÈ 'Æõ5ÙÒÌyȸuN×[ÄiÔ7©9à˦e˜¦ƒkjèÂÔjfG@`S¿XA1|+à㈌{‹þN帼ɩŸKúä‚+I…ÖeÒ*˜ïÂq  W"»R2(_j0³})gB ¯ º8" á6äµîm~1‹×K~^x$™(í¡ròæ+JÕJAM³Vã‡ÖiOYøûÊÏUÙg·½â7ÆV˜n 5DduÌÒœ¸Ì\ÊTÙ¢ºý´Z2›íÝÊý÷XÛò¶€Eëꨑ ÎOÎJîû륄ÁW» IVÚ¤ŒˆpœÓœnYZö*rJÀÎCôº¥Sb5? «¢\žº']bq–ß’;œôáNª|[nŒ¸OØÅ[nr3É[75¹Õž¥Õ§þâ“ÓØê»{š&ì,7é?½lrþ´Ëq0Ô]~ïêÎGïíWâ]TýŸ¶ŒíEG$Ï»'{-;Ô“Ù¹4P’iÉmÎ;ÞI—Tf(h¶-UßnFTgUð6NI²(”xÁ7aOr•×€äBþZ¨ÕHsJ‘ žŽ¦â8)15*#{gìPEÁM[dîqÏíA|¹¤†”Ì ÷Ëcïr×РÄ&—Bܪ€¬$ºõ/ë3Iì^5=⎾ˆˆÁ*3eˆ}ΠeωI"Åá—CÐ6[aʽv”ƒ W0ŠûIûÆuº´ƒy9À_Û8~JÌ©bbÏÎinc"æä Ô‡çíääåòp@  5'wØâd‡AÄ =Éì¥vs;É'g¦nᮂy@†…·; OÒÛ]ZýÌq‚/„§]ƒý€¹ qØoxÒ?à·¦Sþ ßø3<æÐ ’·1wêNèa<à$Ï þTvbÛ—9Y}%qÊý×T¤Àã$¥gûæþI6ßRVQ‚¿e­Ÿ‘¢7àç Üg\*50>Nˆ»d€ÙO.y?—M:“¢þ}6\^ imuÉÓ U'¥~ªf?Ô÷BW0IÛ¸º¹Ã+J9ØA &§×`t\qÊM…Bÿcÿþ?ÀÉ¿œììÀ?øàïü­û0Ê€¯ô988ޝàÿ~íÂÍs| ÿ—9nƒãœ`@yxÿû uJ®iŽ0ÇÔÆÑ öpŽ¢Žn6ß~ÿPgꌜÙ#gqEy UÙŸëП•2ø¥ …üVÊçÏ28+÷“»ð¿aÏô·¤—ÊÉßðÿ¸¸¸\ÇlqÃd— ÞÊ “ê1Œî)\žœ\Çw¿â³Ÿ¶ÃÛ~#8ôñ(þûë3£tud_qÎLÅoÓõϧû‰2üw&±3*Ÿ ëÍèŸëý}S-¸âü¡ÞIØXž¾/S(/ÈÅà ¶Ý=N†NK\KŽ+éžé ú7‹ þ‘é>®.ÈÊ ²BØO™‹÷[}A(ä{AÞ òþP`÷ ²óü®À Î)ž3ÕM@fÇ5­A6ÇeANT'^ ðkiÀ3E}~¨ÈõÓ’ÆõO*B8ØÙÏT´ÐÄPQ×&®ÓÄ?cæà|ìÀÖ_ÑŸWJ°ˆ‘ìÀ,ÔÈ”ûˆÀÿ£\ðýPi™À˜}\±óÀÒ¸ãNxˆ(M„ƒ¶ú¹Øx½žþåëÝÝž#C‚¼ÝËニËÝË£ü^ÝÉ~GnG_öë¿ðs°˜#Je¼6’iÇߌ징JV5Ep·ÏrlÄ£Ìäoñ´^cò~Ј`â~‘àÍFG³ßÔE–ëµÂ™Â¦îÄ+±,6Wƒ î&¹Iïö îk?Ñ-Ýn€ª.MDDuÝýrDï m`à¦m(ÚªtΆïú¼i5p¹WÀàª\ÏAÀ_Z^’ÝñûÌ Qͦ٨¼ut ñ† ŽÏ.Ê]*›l¤Âw™qÊùoКÔ<ÓÜ ^iã2±´´Ç¨À—o¬0ã/–°§¬8¿Oä‡ãw'£I`°‡c¥=øêî"c-C‡lu>‘² wÎÝZa糜1EȬ¼LþK4›½eÊk$8AS[ÁL¡žÃåÆOÏ;òäj/µÎǬaU!5v.‚¬§&†ûÝö»@ —âWÞvEÇ·[ˉ¶¡€ë¹ê3€ès7L)m©"ÃÝŃϲ~ùe®·es…åHÅHâÛ¹{]¨l}^à RQ89?v/» V¶«Ã®Y{;%IŒÇòVX¼i˜úè:w‚½x­}k %¡aRIù‚à¹ÒÏuc±k®œmSÛÉc©3õ.ì/.ÏʾA¼*3xmÝs`z=©õqgKJ"ùhí¥·/µ)Þæ¼ô( CËHZØb B²F±ÎB(¦Um»¦Eg‹W¾Èe€è3Þ‹Á~ôa[‰SØ^s@ÿ"–v Ãg'¡¶©À!4é›X ¤<¼6¬•ï}/“왘è›QÊ ê·½~%#wiÙûjw¯RIeÄöRjtJ©šK`´Át†h·|ƒÃÉ—æ~Ú‚¹çðïRrºÌ¶kKëÓjjú@¯´çq#Õ¢hÍÓ•÷Wȶ0b\¨2ÀÂnD.ç«ޱ¸xi- ŒZÞ0L¿«ª˜UÿÑØ1%QŸ`Ê:Ì©Ø|ÁPŠì­ú|Q.ê ‘6«çÔÏ-Ÿ”_Ý a¾ä†Ü–ƒmD÷9ã&[oÔêA!ÿ.I~•GW¸6’3Šx;Gî-Ú¶ŠnÆ'¨¯3Y-n(Ú„MGïAo¨…õí‘Æ„Qà¡cÓGÞ8Ê›a 2vù¼æH|ps´ã¦‰ç±&cRgs9¸Pã©Þ+ºq+þíybß tk—·+½Ñª•TíÀsQ]O¬IV¾tjxX cù$"9oew˜)!$³½ûwy7bº <œ£æ>׬¿ÚR¦/*(å¼ücö·¤Še ß"Ž^qÕÞ“ºr [u‡á‰'OŠæs×m¥Œwy‚WxîÌ+£‘–‘J¦ÑàÕÍš÷ks‡ùM½yº…œ„ˆ§ö¬›?Û†ÂÞÑòBìõÎ/ˆzò0`á:+ÅŽ€¦Ú§¥dûNDq·¿"¦ùÊe@I-ÆzÀ ”â¶@̸Bý«<ÖÛÆ‹Ö,v£#8П ·ä,"Ø3tÒßÈs¢â³#ªW÷gdö"èiѱnuòçIŠ‚Â(Cª°<»Áµòo¨˜Ô²ÑÝOæ¸l™?‰ ”x¿^(W« /< ¼üœÑÑdxEë *jMãýôR„rM Ëìú‰o»Bç.óµ&döÑ®à¸0Yãæ(´pÍu#½tI£…1›‚;÷•g¤®4Ñ;.êÞ)I#Mù¤‰.ß*N¡8ókÛ2“•¶8Šy6W†èžÐ¬ZðFVöÇ{Òì¸FŒl˜ý•?¡ò6zÜÈ{ðŒœ¨-Q¢Ó+ˆ?VÅÚ³Tém]-‹û›¹ ¤Ë*È5T»oZÜèüP‚5È@õ¨Ü9ñíDòâîþ±ÍDMÄLÑ…¥YÖÂ0Ën·×û¹òßα¢ð^ù„Xæ¬O*i š&“Ø =Ì÷y̧ês‰„ß|ûó¨ "J^Å2õèG¶”nˆñÙ©ßUõyI.ú%‹ÏÊãzúÊÀ.%6¹ëÖÂÇÖø¾„K¦ltռŸ_á³1ªÔSXÎ÷ Ž^3`Ôcºxý*Vƒ}æã$Ákó^IŠCÙ¯*u•=>†¥ú—>ÂÖì}../’?>×ì y·<^ø>Ñ“˜!ÖÁƒƒ—¸L¤‘©T"Íž ^V ?LK ?cÙó|Ñ“²Zß©ÕO ý BÒÁwöït:<©…ôãmñ.«êë<±Ø^ø°™- ô>Ã0%K\°U÷z5]†}³‡ož*füCâ„1ž±YòœyôÚ– >íö¬{öÌñ’~·ÛŒÜ ²ªiðÌ:/)šªc|ã“VöoèÒŒ¹TP‹ûX¥Ogôõxßh?£+0XzÏúÒ¦»u˜¼îÈÄÀ¢EAתž²ƒ$2‡Z²×f¯—~^wo:)p¸â}Jªë0åÖýtÎ÷P·RÓn™ZZÅx8 íÉ´ÓÛQZe”J#wÊdó®ìU5"á1iR Œ\}ôýÑwlÚ†.Ⱦ¤lVȹ3[òÃQ÷ðHð%G5T-?XJ8¥—Å<ÀL Ø>—[\ùácø¾q‡ï]3#TÞÔ¨l¶ÓjYn^Ò-gn333znà3¡_Sá‚úÔWX„WñC<±ý±#¥+=¦gÓúA·¶?øíj½o Ó÷4§?_-?saÆÔ`÷#xrdy©>ÑÄ'¸aòq‘î¥É¯•Àà¿éàþ~Ï|âÞBÀp ä…QãâaÿæÞž­ŸÍþƒ{ Û«žuoÁäÞrqý©{Ëým1mìiAmå3%µµ@º ½oeµ¿Ô†;Ãâ Ÿ-™moâfýSá쟊fÿè!ÿ(âþ'2”—‹û¬‡¬í£«]d œÅaíÒFšŸ[^D¦? ”Ï ‡£-J{X€(¦#6(«t~7øœL ’(å#*½„›ûZ5Öúsz)‹o-²+)çÇ/- ¸­¹¥Î`¿D›¯m˜Ø?Ÿ ÁšåyïÌSŠ%K³•±Dçœȡ]Ò~?Ô}Tn éƒ ç‚V ׋”ZÆÝVVæìd„Ðv{²ªH»ïµ”2>îp·9x™Ê½Š¡ûÌ~hãڵ/ \JuÀ­æ²ïRÊSÉË*Þ¥±:'›ÚW»›~7 Xëó¹½å{­rÐØ£/È7Óï9É*¡<ðõNº¶çé#%2¦«ú:¨ãþX±è]A—¦ýÌ}lÒ82_·ÅøtM;[Äò0@6—Z}Ÿ‘í¥òp=…•œ{*h¹!}j.~"ÀÛUÕŒßgbKR~w#GKuäñ»>¬¶Êc}Ã|ôäW²ûUÙúl¹8Æ^e‰¸äâg:Ä]ÂWœñvsOž°¤éyê:ïìV핬ÅïptÉ¿m·Á'­vmáqÚúdš|ŒüD—.´ êÒã²ëõ¸a¹”jµ–œÝྣ6"Y‰æx-é”kq,ûý#tÞö£öÖD߉®ð´açó¯šÚíc­ØôChïµðg(ßwªV%Žëǯ¹âfXiSkñòRÖFG[‹B® ¾,sÇ• .cä™rí4ƒ9¦=DBÞšbÂG5í»¸>»/“:·$~–‹å>w135Ôh°J:™€”Þ;|Ǽ·âî3*C¼Fê2®¼*±(õ¤Å Í<o¤GÄZï¸8ú*½î'ñ‰¬Z%˸”⓪xÃ<͘7ü†¼üxë^JÔh´=gÿ\nQ?ˆ±_kL4³¾A¿…Š[ðÝ'l×lEÈgÃZ~÷ £6Þ å¤hE|¥ë!Ö¼˜®|`E¥ïð©ì¸ÕÆ~ÙržþeíÚB„•¤Ml‡Áøy’]2VqÍ * ìÓOfÊÊÓå‡î"}Lx8˜Ðo¯JxÔ®Ú)=4r0 Ù¦Aäa#á‹æÄìûØ0d5xmÛ-u”Q¯c㮩M¾E£3=&±ÌC¡'ÏЮ!Èø¯hsln…C%®ÄºÓaÚ#Zf*LÏ’±2i4RÝ7Ž×m˜ ÷>‡DL8]éL%±ŽD#¥TMý2M⸳nËk¬+ÛZs¤oÇeDR#žæÚ_®&\“Žì%¹ b§×yP­LW»y3}OÌãi¾ƒ‚‹jhË¥CDþ—þfênú~a!I›)MŸ±Y=Öê[㺛Þ¼Öt„¢Ä<Žøø,d]ÇñÀ›åUI·”rÊuê?o«˜ÊBlÖ7¢ù«YÙ)Ÿº,œÞ` ¡juO Ûn Uz¸§„½}í¢¬$攣eëülm{I…€á¹§ÌÖ rꤽHÍã&|#Äa«)ò£`à€ÓþúÒTDzGDzh8ub ðâãÒ9ˆÛ%º¼áâ:kÉ®VŽš¤ù˜ˆÛæz—îOf–}ÏG¤¨û”`ã3J«SMcÏ:Þª ™_JÛÓö–{êÓü0{s㩺ý™ÈÐÖ·ÃsznZ7+Ïw1t]½=ÿ56qÐü½õf RRâ•ÑKµ¨½Ž¾é~™ õE4OT{ïõ«™]é}àÊ‘&Lµ•+0þ<ž"šÊd§¶hšF“ýxAü•Änxò.F“2ÎÙÛϲôG×WÖ€¡uROì߸Oî©ú‰™6vK)Ï ÐzÞ•KÀ}ƒU;ÿиýÎ6`ø-ÉÛ Ab…”E67 —?\UZÛy¹ÿÄ`‹TðJo°Â3–†2yU ÇòÊR9¬¦)~ýk¤QBrÞôÕüd"öjϬ¥[JYD™Œì¦8ÝûúúZˆuòƒÖX‰´wD>¦Ð}qU†lô?u–VÎCÑ *ñ/É—/´&,c&ŽG;‹÷VÓR’â² ÍÅ5­Íø@Þ†Öˆ1\Akoƒ¨Á•N)hb¸™h|òX^*kVb¡¿"”shýÐ:¤O§,7+‘ïêÚ~6j¹Âs%Öf¬Úsú6Ó•ç=3[…®êF TRTÏ6’Û½;×gHxênYSu½V_™Ð/.r[7påèúa=RÈ|žXFÇ¢Í9¶b‡±Ëݬ°êeì3!-Za‘§ÁÙ‚xµÉäòÖÐ]¹¦3EÊý\zñ‹I\”Ê.@ÊgUá·ˆolñO§+êèwâ,§KëuiØI0guÑ®oɵVÃêä„^ÕbŽXtí®$YÓÆíh_¬yÒáˆÕÙ=1×ÛéõVÉæýÓË™ÑÞ²¨NoufŸ>xÂaE2¾º+9¾ÕjÒ²·É/}zª¥ƒœ¢+ê7`m øô¬8ë9ÑL°ÃCC-®NaËüü•Â÷Ê]õóã‘TÚ~”O|Ƚt=²Ÿ>MË` 98¸Ë—qñÝÛ ûÄÆ¢û5´] gêW?hxÍY008ææq6ö9°}ôöº[!]ÿœMº¥túm›ìÍsD(Û·" ˆ¡·¯±XŸ_z)„áð´Ò™Èû tÇØTÍbÈ6½…Fr§7kjJz«³sÍl¢ªq7™}kƒL¼ËìR¢såÚk‰k..,{Þã<3>G¡÷í&}¹iEÊû€„„^¢Ü›âöö”Â’sR1Ep{}Êý¦qÙ  ×6VF—_0ÜpýM"žQ3Úä1 ݪH÷þÅsÌIÒ¡ö†»Õi‹$‚”3N®{R¼‰]Ú¡¡sù•—ð‹ÈB'Ãå“=gš-Ô@̶·Ÿñ@Ðüö2°ñç¡þÖÖy¥¾GNR“ ý 6R®b®X—cŒ5 ´µÑ=øêT´/ä_á\hg—~ûæ=õ \Ð…-ÏûçVÈè£$"uAÊÓÎâNøÀ£¸k‘… ›8¸ÎC³ õ×6»à‹‚Ÿñ|½š­sq´·P§ éÃXSĵ…J üX?µa<ÝIMHãM5\>Ü*i\©tÀºÎw¡´Ðšw§òº¥¥›¸jȜЕÊ×ñؘ¬;¤±(6¤¶ÑÏ)íË ýí>;r·™¤¯Ñ”qéh>[È•ðÚ•Œ”a#0gã”][T@JèÞ†è•k>}—ö”ƒ¶jZñ©Vf¦2œ]ÑÒñÖ ± Õ'ó¹ˆ~ø/,bŽâ5¤jC¢ˆåm#h’î—6nûV-Ïo>_Ûl¸¥SšµÇ”XÒÛÎg ö_àE–Çpëc’ÌKA ?ø^¨ö2¬¶_‰}ÁÍò&\Mu{ÌTl¹_VnRu}["K lôŠˆé¼°¯OÆmspsý Uá‹‚¡bz§¦^Sé~±òeu‹Þ>Ž2غ/þìÜìÆwïÓ*tÊ2ŒÐî?‰Ì•è{’6ë&>ä¥z;ñÎ ½IàCgvt«6ë Ò! wMUqªU$ýÚ8¦ rL·qwè¥ ¹’Ü&7C=+Çíc÷??ÉE¨îÚÔQ&}cþŒ§°LBv#S/U2{Ã,³€ÎShÎé¡Ç¿˜$è°Y¿$<§AÔŒ}žÐaœÄ‘—$ÛV27ŠÈXU¦=¢©oêñ´8½nF¡ûJµ*ÛÞ ÇŽúë–F!Êí€ã*Ù—Î*ca“tG ³=•Ó¿;â…–Û™ëÁ©6¹gë2çÖÈõöeù&NM ùC‚ë¼#©ë<·2¥¨]y…oXj#úA ‡ ØF'ÙC®ñ¨™mëv ÷Úº;›¾7 ’ök•.¹ó87ŸÀ;܃Æ|aŽ»_×ô@,ä Ðs…ˆ- Þ7ªäµo›:Žh"rPRp”Ç-ŒÈÍ,nŽê ÌÀ¬òOÛ¾ÄþŽíj -‘Øè2(ŽCö´w?x@ï\ÑJ­—{ò$ϱwÉÐÐáù³"byqÍòqŠîw·ÓÐÔe3~  ðþÝÂßfPج0 rñð| Ÿœžðü=áù!zæù£è ”÷wÑ“ßL¤Ï„LNÂ%Ú ‰ü„ÔÍî4bbïäx&nrÌ Èdiû¿§ÈÒÉÃd²:.¥ê ²Yû8[[8‚l@v {½…›Èáäxär´q´9z8˜Â¿»°‚_œ` €ù~`{‹ù! ãîåôs$Æ ä òù‚|-\~Êüü&Ï? Êpòr@Ïet¼üÕ¥+êÅÆåÝç‚C#$1¡*bÀÉÆ7úÁÈU“Ǧ:íö%´CoruKÌõKhw«ƒîb`Π‹bŠÁâ\·iktïÖv}Šúâ­M·VÙ°ÃÕ`¥O Êg5×åU¿IVü´=– ’Sƒ ¾fãìiéÏ«6|Ûêõ&ýkP bÇÞÀp±){Ê…låÕ”¿÷òÊQ:ù­Lí ìÜÜçú—“ß×öÍÄ£&-=4–X¯†ä:…–žäÔ3ûW~¾·Û¶Àí7µ8t§ô­¥qÎùÀOcÉ sUsUóÝ©ùIiíV,èÞWZ‡wÃ8 æ²M˜ü:ÈÌ3…ç.îÖÅ$¬j2é8·\/½nÎÛfR¿¥çLª4%B/T•Éô↹@ =Û…·±TÖÔÏg{•D‘*DqË]ü\'Óo€¤¦*T=ÇHï¿o¥V¼kÛ+ÞLÝav[3 Ñ'qZQŽÆ}™Fu6ÜW•À"þ=2‚¾˜‹¢ëâÚxû5™ÜÛªm;TЕ4î/£¢G˜²T‘Ì[ûq/]ïºäÚfhW7„pN§EDeôŽVÞ =ø2mº€z„ŠSs€þ€5ÆJ=#áÞ#BòR»·i™ÙAT¢Ûºí¬/ïVNk;m<¿×ycÑU§KwÐŒˆL)¾QL §ˆñ.Cè£s2Šjò™+ç/¥Ë`õÒඉ’?ÀΠœŸŸ66š#pß6šÓkÄ8Gù°ª¾WýòâKº©}a1\¶Z^„æ±Ä•«5~qèPMò‹‰šŒ§× l1:2U`M˜« ~ýL0E/·d£Aö)ìm}Xì”Û~¥Shë\ØsÀê%âé£t<ŸÜûô”L´TÐ_Rk½Clò 6Çå¿Y#2òR##ôšà-ÇQœÚ—|$«šTA~~uqÒñµüµ±Î½O—o‹Œp¢m¿9×@Vï;5-_7œÚ襋-Ö½v€WìÛ(q›ê mXËvP"jzK廉.êÛÇJ5+ Ü´éw±·±‹PÏ#[Û6?ð–0GaÔBÜ—´Hh »yĆÝÜ!Ô/ü°x‘þ#Hƒ‹üPMÜWRynòÉý-Ô^e1„œŒg¶’Cç³PªÞ&šÞŽ’è¼Bî¸Àž4‚€~˜ðA2 WröÄùùˆÄçùa¦j—|/«g…®Cý5‰\¡àöròþ:Õ , þuC)ÙÛ«¸èE9#LLåLh´ÖùˆC3ü3²·{˜F‰i?õ·bg÷%¼íâo0‰piË™¢¼”Xhæ| Bëvâð õ¬8z›}¢Ja'Ò}VPò`I{Ÿ%pêà‹Uçú!?Ó¬k¬FØX«TlÔ^ôÒI±÷ÌuòZŸØ¦ÃslU¼ÞÝ®·*jÔwKŒ¬CwR±ø(…;gÛY.‚¬!••Õ¨u¥mfoòc!¥!ÅU2V"Ù%‚þ¹L#{_ÏÖ¨¸z+t=ÕÛú+–ÔnT çÑrßpú¦¥Û80n~®âr]rošD 5ìñ”MevzZúés[TY%qÝý;z°Ÿ>*>G _ˉ)$ºö¨<ž˜ûîU€S7A™%¸uê!½Ãvê{ìÔgþ— r$ÚÉt‹FçÍ©±¼×«¤tX@HL@0¡v+ö°)Q ™È“Gm «Ÿú ·Ñ…†ÖÕ©’ÏÕ#:[îˆp£›¡OãK¿“„."ókZ-.ðgØëH†©F#F<èX…­-mïé<î·¾GâNG¶‹Ãöd1¼Æ=ïÉâ²Iý¨ê}fFÆsµ46KœˆË_èד‰•±Zȱ—v¬>6C+ü°–ݧ“˜ð4÷Fh Uxܤia;ƵܷŠ`ñ5jÌÔ‘•ÂL›áûÄ5O%L0÷K#’>}?[„3<0MÛI–a¯çûàÍ{U©rÅkÁ¡Ê¯åÀ.åµr(T²™@‘ -:õ9ÆM–¸ ùž²R)Šï."¾ž¨Ò¼ÌåƒòA_S“¹%ÝvuGfQö0Ð åžÜÂLË5票,äÏQ¦Ä×Ô 1ÉÓªë É›êÍßÜßD§½ÇX¦&Bkw…=Áª|åMvóCž!¶1R|I.Îw~Ä]¾‘ãL½šå*<91“m_ ÷Lˆ?² —ŸÆÅ¸^¢óÜÜhÒy9~ªi¯TûóÕw&÷ø¦}ÁQ1~7öB!m6š!æ±&ã†9o–d B»„†ýÒΖçànmýŠyS7ïÇG—zÄ´Ÿ³?¸@]=éîe–ßÙè–¯–.n5€pY…° )#–,6ÐÑk‹çº§±Ô•®TŽ1Tú,½¥1tY܆ö5¢ÁF7²ro¾AhF`×¹x¾Âdúë)÷Þ¨9æ=&„mÎü£ îsJ±ªlŠ?cQäFœgóæìÏÉPù¬ÍeÀ·M(gw+a.ާ/Û5Nv‘ümoóAÌÕ=«èÛ©ˆbn†¾Ãœ‚ ÅäP}ŸÏA Ó®8šR«ÍÜDòŠ{äw»in¥jk ³+÷¨îBjìAµ‡—½käh,|«õ>¢ÚJŸ+èí‹{ç£9_†u9ñ#ÍËð{%zYŠ˜.™óZ³D[šú™Ìè2A™W¢yÄhÓÜÇ©7?u..dA4¯—‰KèOävßüìSõ±6ðq›“–ï²"ÝCB“J%þü]¡¤«—‹¥WÒÏ£!»úLÆ|þtPòË‹—õ•LcÍWEðfý´úcD¹ âæE:úóTf¥^Á4éäl!ËfÈEÝäWí2j §q7Ÿ\¾F#`w¿Èï9ùþ;’kÒÙ(’;¡\®*qç¿äu¥q@ÚPÓüdÙ°>ª=hV´g—_òhˆÙ2EzðBÙÙÖYGvâý-iÈ­,¢/\œvî—j­j 5«¯GÌõŠö,]y½&r-oРV#[G­[ÜŸ”«÷‰[ò‚U:©âlßTEm²ömš™é—‚G|Òr=ÀÚG¼ò=vfåB7Än ãSdz ±V+ –륩ݼ^Ç"Rtá©7gu”ßkCä~`yVN+ ‹±ÓÓqò‡KôÄ;7ä)›zµ"AwøM“Ó%IËTC±ƒ¼ BžùŒv¸|74ú~Õ»7·«> ‡i9Ùk¤6°Él=]ˆwfů³ÙqŸGuYÑ%ŒÜï3|–OSœpµÀ¶g©c™W‡‹ª)è}k2:ïˆBÄçJmñ÷‹)òù;¤±'“⦧îsÐ$B¼0f ïóy·½P)ìÈ›®qÍ×(¿Uò8ßn9Âaˆ„èá¥Xæ—·ûŸP#¿iãv£‹wMÒÓæ@ˆ}ƒ¸z÷#ê%Ú Um?æÛ=V‡‚ }׆òÛŠ9¯ ò®!«ž3§K+ï}þªx^DZÚ~³b6ˆ5‚û͹ê]I±ë%µ·´5rU!F *äøŽz‘eÍs¼(ÊH;×– V&?e$)†çM®rÏi#~$]u,ÿWã!Õ‹šœR6’<6Éa=ÀÕñL&“ºÖ¶ZpÝ¿ß!Š5$7}nzó•µ|È;…ZH²DLV_š™ÐÊ(òµÜ´™Å¹™$<É…Šx†ò®t<)}«Q¡% A?ÔÙ[äúËÙ¸Šb~ý8qÌU½OvGm>"ÝÝ™« Ç*rÐí|f:ÁXž@Tq@I¤‘Ä9ÌGT¦K4Ô$Ó"ó>çÞ#fÒ*bŠèl u¬„dNÜJŽ!ÝVáûIéºé›7ižï¼„NCÍU, ¾u‘Ø7E "o”ïc‡E^Òä'*)’Þ`Bn¹gèyù-ÖîÞ!dÍâÖ°+mê¡… ùõ qa§ž„ùVjLܰ«¡cçØ‡—µìܦU¸a$jDV¸Ï®ÄCZåqP”¨Î½4àË—_$7ô Gð)f³*D ½ô,€Ø#æ†nÜ ëíE‚¬K[›WsÈŸÕš›;ö^½ºÞÖ×DéX¦[ƒ„†/®e)\3v(ñÙß¿''[† yñÙÅj<ö6û¤7P®––½=+4~éV…ºk JlF‡Ti/¶Aëue÷{wQë"´Õž¸ £YÛ–¥BÙÓû©©Ø>¬ÐJ÷“aM²‰Œ-hú>{VT@ÀCD«k&8ý®ŽÇEj‰eÕ°M1Åç’-ô$$ÿù€Kòç§ÏÇQu?†îdlP×p/Ƚ¼úÒ2}Èž'5* ²¹ñ¦ôÁæ0¿þ>>7}ÊyÅ£èÿf÷%ÞTàz”o»B b·Ò‘”b*¹³„ãQ¼¶K¿DŽ+ñø/ª*-F˶ƒd.~Ò+DG™0å@@:à?xS¶y¬îÝÜ`r¸`<^¸Š|˜ÿôw^eæú¨-¾G`Á®2²b-QSI=Í¢ü¾fÁwsÅXºûÌyË®ÛÇU²L}<…„…™Ÿ<)b›®¸XèŒõ‚ÚýºÚcM¼õÆ{˜7¼g$LëzãÇ©íÕ‰Úéâd#7F7Ôiƒ<Â:X½r«Ñ}p_5ݽ¯VŒ4sWò݆”vV›a§ÓZ‰Ž=WÍ+ÓUß#E„WÂHfú׾ ¢´¬>Ü—´ÀerþÞùŒŽvc—×½)UºˆÎwB+Ó„Á•òMl¸Œ_ü/¼¢ÚŽ3_ªøp9~ó²Ð°Û{=éB¦º ‰dµÇžÈ%Mš#xýõX»EzAÞHœ!ô±Ï©wß-¤.ۺFÙ¶“ÿ…;ïàý-Tí##,+zŠ–§vWs­vÄùñϨåºtn£Óíñk³[%òÅZO¢Éȃ¿˜Ì|Œ!OjÄô¹÷éX„‚iØì‰8â×Eø¤7 RûåP™â߸#R›x™IJ ¸G;Ö¶O[¾ú()ç( PËÃ^ðÉÅ [šªpº¶Ü€F¾q´¾z¨-Ö‚!¬ð>'GîmÛȇòÑ /¯1¤™Âàá*ÿWrˆÃAÁ<ßñÖ;~ k ýærºqË…j‚HFQñŒž¨ñùAÑúK%~n½Ãq­V3µš][1jºª*S…~Øú¨Ê%L®è@’É‚oO+Õ\¦îWqãIôüz^í3}<(y©ãâ †J?Ð/Ð}NVåV°D ¾5’¢ØÞ‰oni)ï5'¼†>õ~i˘HÒo¹éƾÛáÕLè£P=´¶÷ Ͻ/Zq ÷ã\ýR‹= Øòºh OmZåBªoCMü§7„%À€È  ®œ3ÂP@-\ÓwŒÐdby‡D.׊ƒñx‹ïßÃ祟òg¥wcdøjÐXè–ÇÊŒйÌ7Þ&˜1YÕghÉ{v<—¡Áf/>€‚ý&+¼û§&¥8ÊšhÅøŒÜWNZ»î7²Ö¸¬,¾öêS v˜uðÞ é1é&Å×ò‘—Æ ™Ç½¬+’×vXM Y;†ÁkŸÐj€X9_fë'>?{°.¨{ÀôÉÇ[ržr":ÂçšYëËéè%4PÊLê3åBRY!,¶ê¨OÆHoŽÓs›Xhн»(X}ûÝ:ò¾% ½vª×„À§¥:fgºÀ#LÄœG¼ÖÃ’/)vG¯šÎG?C~Oÿˆ3¼¡.Q¾YÞùRs ®Ìû¿Ër9†$c­Ù†Ð0aIÿ\ùCKi~`oqáµ(#"òn~ì «g=ÏÉç+7&ÉØo\ µJ'Âz?•r)síŠ-Cr(aš©Ä£¨œ4ÌîóW‰,',Çù¶°txÞ·å ¹±ŸXÙï½´]`ç¿õ¸i?[èA¿=—¾‚åZÏÖbAô}ùýWÛ‹PöåĽ›o~=L°ÿtšòõÛÝïaxE…¯1x0”ƒë[ ^@ØÛÙÄÌÎ^FÔÊÆQ~­¦hc.H¯Í©È®è,nam#ãëj¡î«¤aækgÆkN/,Ã2ulÁêmâÌjyüwZ¸™ R‰«)HQÁ¼ù¼œ`l½ìÝø¼éQø`×ðf=ðÄÝN^GQèîädogã„°ñ²YÁP ¥«‰ƒ…—“«ÌÆE#éjnɧ&!uJöKÞÚÝÝ™òòòbó‚²9¹ZÀ¼¼¼ va…A°ºù8º›x³:ºQÓŸâÙè|Cstc;æ‰ÍÌÉd£³±ƒ¾vôõ, ^" þÛÄÔÉÃ]ÞÃÃÆœ‹×ÄÊÍÎÉjjÁÉÅ [‚Yá‰mXy8ÍM ìÜ^^NÈ×îœÏ°ùC°°¡09À®øT\Ì=Ì,\é¥U€Òð„‰'ýaâà¥ýË\Áÿ{®`z* Ÿ¢“¹¥„‰»…„ÌÅÊÎË áÕCù8 |œ\Ìì>vvÐO€cTñã­¿ƒzò ª“«L%„¬\,-¿Ë³A lÐ3h§P Ÿ¤óoËËÄYQñÏ%æàWi8Ÿ„“™¼Xš¬ÄÒÕ¿=Ææfßvöpµ?žæf ûãBnn0¦Á0ŽÍÍø,\L`=˜8;ÛÛ˜WEƒk'L`7ÝmÜí-„޵w?¹°·wÁgoâh%HïÍj~’£^HÓñÚüd4ìmN‡åôÖoÆ t:·á—ß,‡ø/ýù÷}7—0Ó+Hï7†¿šãïÖøë¼føÝ´f€Ž•&¸ö3HðÁg ;/„f¢!Ç“„ž›]q:~7_¿%dðvµ°°!`û·?@.NN('ÐxÚpqOî8ž¶yaÍ?µÁàØ¹~icçø¥ †Îù+äW\(”ýç6(Êý3/`ðoxáqücϯýrpþåegÿ•nð¯¸ì¿´q@~Å…MOö_xæäüÊÍûs˜›“›÷{›»« ¼ éqŽu_ ظAjNNîÀã< @¬£¥r’®CV¨/áñ–‹JŠA%9DÅy% ìâ\<¢œPvvnn¡¿†0§/3qu?V0/˜“ @K+©,øÿ}þ?; WŸ/àŸçÿƒ ÉùÿÀì`(< àÿåÿûÿPþ¿×é*œ€m`|˜Š:!.M¬F^-¹C¨æ^r«r‡¤jLk„­Œ­À°Ó ¿Üx AT­ìy¬ü®è½óœæ“?R›Ä]ºqí•Õ3’€Í‹w=8MÍ÷xÞÏQÚ½!ÛõÄ :0©'L -ÎTU˜«yëµËž"8qôéØ*n¸Mžƒ=ÝÐó …D]éñ罉w;#°ËXj\™B`×DÁ±D21îÅúõ*”%ȰÝùuìÎ¥òRÁKfפ™0sþ‡Å¯E01÷:ˆ4DÝŠÀ‚&ÎA(;¼¨Óâ÷ϳÙ`~QÎÓ£¶ªº‹Æžõ©©&åýšár°jêuóf¡«wÕ´{jR…ÉÝ}h¾Pi·9k< ÉìØø¤¥<)z}CÏ|¨~™·À»³V®RV3¥’ÑoløË;©€Ñ%Q)JÅ€ùõE‰ÏÉHw(ø…ÕvôWݵUG\Ì|_5”ÊÚSsíìö(°ó)ï¤?é,a‚&HW"¯;Õ¤IVä ­CC3uL…¼@»w©Õk2õù¶1 .ÄÙ¼÷_$ïÕ*Ò‰­Ëø(ø$t–|y¼i‚ð¡òæt{4Yi3Q8¦<Ÿo]jwyѵûÆ)®õÔ÷wŒÖäSè8ilß-àÒB ÃΛÝåã‚ïQZ(HÊ”ô]–ó!îöqd˜?—_J,©ñ¼Øˆ$õÁ|7‰+à‘h3wô\’öçÛ Ø>£nºäAïÝY(tÔ…f8„Äõ/6ç=‰¼›©5ÄS¡ÔaTâûÖ–ÌEOúEl ÆE£ ú;jÁ })Õ, Ù”„Ȭ‹6¬ªèhýÀP´{4AËW>=¾CIÚ†šLÆŸ÷ÜZ‚ÅÀR ©*È™wÂÊu¡5"êÎ9ä¿ÚDÒîóUTš†b ™:wêØJMysHEbW¶‹91«-ƒ©Û=ýhøŒß¿§³òl¡èšoÝ êÀ¤º$Ë…kÈÒd[OIsXD6*²çâw¯ñ9™Èc LŠÛW*xɼ&Q®#qȧÜK'îC[È%¿#Ç#Þ-‹÷Jkœ»ÛpW³2ླྀլhßÝÅ›bI0Ï¥•eæS\ä·_ #!¹/fÿÜ$–ã6çcîgM‹ˆ8¶õ׈#ªüACHíj_næ%Ì®Ú5Ò£X¸Lò˜ïÙ¼­Øiç›Vîr{…«Ugð’²Ã"_Ü}¼Ò&W„¥î¶Êš3tèÊðFVyñ¶y2€î FÞS(GÓ-¦–奧H¡d ©”àçNX3qèü=Û©òe+ú|RóäK˜:ŠP«t‡²œ¨¦´üóÌzžé¦ 00ñd$FÈì1Ìs8¬¨W“?=2¤¨7W0šiX(Ý Ì¤èh²‰Khè>N l|ù`¡äV©]þ¥úÛ~ãï—iG×—¹d/ä!DŸ{iÕ9¯ý‘$REÔmf0¡—Dû {Œ !—Wp ÒU÷]~/ºïµ²#óÈ$ZM‡K:Zö¾«I_ÑV(× Y¤hÏZâ E†æ«…t;"|‰¿0ójÌÆ­=€TœLá¡õQqêê”Í¡½ßlµ,šTñ#&c.bojüÍ`ûHÿ n… ¾C½MѸ¯ƒo*‘ç›ß~&|Q©J­D§Îüž^û!Ԩɵ¹ ’tȆàÿ¬ýpp½!-§îö›ë[Þ uûäÔ…’ñ"Lpn|ä@E¼ h^ø’ ºFMˆ£©Æá+Ã~·Ì·Å¶{à¯³šš¿œ ÕÆ}ŽâåÃî½Átûá%©…ûåG%¸ÂÃÖ§¢ºh\Ö6æ\øH*¦Žf·…˜Ñª5š0¢ì²z0¨†û d øú G£ä¢lj r5¯Ä»õ»DÞ¬t÷nri¾‰©„Ó@á+8õR¥Á«š}É2Z[ûíÐ2G¬ÉˆJ-s­WZd¶eàâ•1Ùdöú»p:hûï?¸ÊOpá6hb¢<®¾6Ëd|ÉÊ[QÀÁzLeÜ|î©+=Øê†çEâE=oÛ¬*Ðô9ÄñU_ÝeÜ‹v£×D9Dpdê<ɘnÏ(§8·Ý4Ý\ÅHÐnQxá¾ ûg™ÇSÙf€«GÛí6ã¥Ê›QÏX<´÷ܱÃ3[«Gž¾ûY}*‰»oP^¹ÕŽEˆ|ΤËe3kÇÙñNt͇gþPð-cumâXÃzú|ÆÞ&9ê„•úmÄyÄÅ«~íÜyÎëý#Q«æ‹ÜÄXnçÏ]ô Ê4E²K¿ÓˆÀä5÷Ž$6;úSÉþàµ]º8wbÎ/GGSïö+UĦH-Ž ¶E‚ü=BîTÍŒ7Žð®?-¸y=|>Òôž˜#;1fR¼†sÝët…ÆV7gæ©‚J~RTúýÀ&Óפo±ãQJš夒<v.w2V-ƒ)÷óÐâãˆ:‰ßQ“Ñ»”]î.VÒS9?®,Z=çÓ“Ô¼SÀZ}xŸìhq™"âsìaFOõ@Yl qõê¹[¾Ä=Ïl=ô‰X˜2Ó+‰íéòïܾ'œŸ•D-éÌìL–õlÌyºðÖâÿÿÃÞ_ÀEÙm}ã8!5¤¤ ÂHwwwwJ3ÀƒÀCw# ÒRÒ-ˆH‡tI "!Ò ( ­HÉõŽsß'žsÎ{Þ÷ùÿ~ëÚ׎µ×^{íµ÷5óý¾v_ù4GîõòVCæÜ6Q—VœŒø¦u¬' ÕBfuâ"¿,%Ò´èˆ/åË7Û5gåŠÕ]Hõ`Ç¿Bá=ˆM¸çÊW>ð±N Hk)õÿØ![Z4{ =<¿™ÖX»h\QÖ¾•ðFðxÙ>3_}PŒ5·XsÖ÷võ2…Êë(cgÃW¦œáÇzî€0×pÅIt=“ö¾TåøÌv0‘‘jÁLt{qÇ (“œ?--h¡O Ð~D¬u—Œz'±÷õhªš'â)GEr¨w>NP 6¯ÏÆøR‹AÔB£-ÒÂx…AºƒMÒ#ÎÒ ôÜÞpqðÆ€ÅÒÚZT0m-ÞSÉò±¾:ž²ÅÓÍÌ–úº^¦ƒ÷_ÒF¡ Áø2gn>Lu§Ínˆ!‘Ënt…U… Þ{’³í'¤²ÅfÖ˜úÇIëT§1œ{ä5™29ÃV×ß~£‚m °é¶éÍ ñóø£µâ·[|6òçËEªŽ0›É’tÑÑbÒLî'¹ß,Oi¤â´@ßì«qæ ÖqmR’uBÊ •Oà ©k’UOÙ'ÜÓŽ)hsºÿÁ£Ó]êþH(T° Èô£™£Üÿ«BÑF ×C 2½ÜŠàö… ü=‹i]“n&:/4Ñ·ò\êéÈ+ÐnMÊü<h"S5{"´š’gJâ,‹€Y}ýVÝ‚În­È㺰!+OdÊÄúhº иdï×Õw]k.;dÎÙx47v8oßhužØûd$à«æSËMÔUØ 5Y4H_‡qžw'ÀÓG>[0éÛHÒ-²Š®i6Aô•ð%O©´€b!âÕìÛ~HÓ&D~äCçÚª•¶·-4ƒvêWNý˜ß}¾¬¥gÓõh QMÑG½£éÃЛé{véFÛ¡ÏÔ«ø“›æâbümÍ1™“šoQüŸ]X×t#;¨;eÕO!9¯/fŸïm`<%mg’TåI»Œ*ç`Ud¹Uq-Ýk³sîi&FàÔG§{û°Ìw}§­x·ø#qm¿Ýn“«´À= O÷s×w¿#Kµ"tØ3Ÿ´hîízwo¶¦TŸ%…¹Vx|D ÚøB„×0±µ'Œ?CÚ¯\öò±mžÑùƒ§åèF5]ºY=jŠ”ú´5cŸø2hø‡³0Ø‚'ó ƒÍ_OÌ/¸T¼Ñ“bípåb è~ߨÀ»ËG\4yqrii¯30Ú1ÉÉKx£ÇX3QÔunJqG—JÍ<3wŒñ2®‰üúsµÐÁs´š”ùl6Ÿ–af>]F5íÌÝPž†;£<$|.ªÝþV sƒD‰œî7·>à*ú¬ÈKL¯`+BPjßž`Ú…Ýõ]œÞìI.TÝ¡VSV{÷Á¶ÇÜu¬Å;íÜ-I)¢2¯?u!g½và1r»æ³j8“ÿ\‹þÕrÃTÞÑùîÎë’ó Ý7½7Åñ%r;Ïxc홢Œ‘ø–…Ÿ5š°e«¯ðÍš>ä_ZÆÑÏb­|tcMÚ©Èàý!Ú„ƒò5·´àƒ¤4µQÓ#´ô-%û(HL¢òEt(×”‘)úàÒ½­“ûrußæëSv’©·Ž ˆzíÜKÅ@ZXH‘ûPäwÈ#Ñl(\…=¸þUýÃʉñÛK¸îÂuOø' ”Ëêsâ,‹F*`¨É·ÅŽŠöÆçß]ßܼ4ô¿}.4>ïÜ+hòæ¼ÛóÙ˜™êfo>ÌŒŒrŒ6ÔÑBebêaØúö£Ä³©Gžîh2sSõòæ^ÍORL±W ·¬Ø; S<þ|Í/¶¶Éï³Géê›tQŸ˜·6“.醺™â깯cyÎæÁÜöARíÈïêÇÐ˶Fä­ŽZôH %:Ä'£<ì´ô¾]‡Ç µåÒL†ÿÒ/ ä^.Œb±õâº\ ¢J¼Àê{ÙY*¢f.øûI¯v{ÅGÛGGŠöœª]Ïo|½ÈQnàá'zÞ ÝPGëC €Äç$²1 ³Ó¹VC‡>¹~aµ«r‡¸¬OçDŸé𷣎™ów½ ÙÑr͘q™E‰#Þ»‚I ²~ÇáÅ£Z+CQeÏ:Ì;ÈŠ’Zºygß÷{eÞ”Ê{¶åþ÷`ŸJÿóøëا¿ôø=êoQ;~×áô{ŒŽ¿ƒÏñ'©¿Û~^ÁqüûáQyG àn€u—Ȱ¾ÒMñ‰¦l8Ú¬ú­T³¹ÛŽïŠZæuee¥À ’@ $!ÎZ’“"æ=éøk„’ĆÔ *-»*£µÂ‡§ s±‰gg¤0ï!¶moèÂqÛ±^‡ž;tÞ÷•ÐåÉ«@Á°W7¯Ev§7*[6uòŒ2+Mýõ¡¨ã(NK´ç¡_ƒ0¨ÃÂ8¸‚ÓU©é‰¶î3]‹Ü»ó¨ë[ª²èÚö{ÞÖåcùå›Ï[CÅÛ?Ÿ¤7<žÈéXì¹ÌÐMÌÑ%¤î¶,¿ ƒ­9©šp>ï„–/ŽÆÑž/î§žJä¼€¹î¯aè¼ÑÙÖy¡óÍj“¹%UuÕÅU&÷m /šàò)Ѱ‚úè‡~'aJ»íœ®ÆfâÖú]Á••üÐY rÑ%zOÃ-©›U“µ"¯x¿ u:ÏFèÆã¯Ù?mÌÇ!¾ƒ“Œ³@×ÿfàâ–½ù¶W9'8‚ä—7?[ÆùJÿ¸,<ïf_4ë´YæÈú×ûØú©ËF/Ý™MWðùÌg¤ƒŽ®d¢~óYÿdÎ:Cnó¡NUµG›ÍÍF1-yhšbjo}ÃU(tÞDrÏda+]Ž÷æÆx»Ó"¹.i7"UJB»âŠ1Ì YèÐÃeŠ—ÞHM2ƒmµì #Ûfÿ˜,Àùõô3ªðóÆ#Q#&I2ëóL’H½”³Ò笯 Š˜¿Éjtºz…Šwáûí¯¦kØŽjÌ^‚æîô+Ý)ø,dÓEpí›W h|‡é œà”‡D.kø,뱺 {¬q¬‹vÜnó\ˆñÚˆß>^á3ô644ì@Ù`izÿçð™L5b +·“˜ÓKõTDÔÕP’ o;b¨± ¯àÐ.98No},˜5—Q9•Žo–"Œ^Ò:kj†¿jLqï”Õ½C—ù`qèåN4?&Œ#gŽ‘'Tj-^£™Jå˜[‹œ¤sï‹$Æ¡[V÷_ði¬ì§xp¬óØòÛㆨɫÛ$Ç^:+-x?’×fF{'é¥1¥8%ôÙt/:dß 0˜(#…)åY)_«­ØûˆÁ[mÌjÆÔFšÖÏæ?‰khÚQùÜ‘yÎH:*_c!zÔäŽCø¬*I\'pÔù¬­3þ.ú†ë²±òîVQ‡jRÈÞÌ}_P®íß°c/ÎîÝr¡î9I \þ4MPÆÆE§mEñ:­p¢¯ÊFh N•÷ɽ۸õ6Ø1±°§×?¼”ð5°Ž¨­3àÛ§\÷ØàðêgþÊ5͇k¶Ú­ûÕgðîHÉ@Z²|÷·”j›¦Ф$ »B[¿¢”,Óɱr·Å—ßJ%.—m°ízŵb*랢þ[Ëx¥‚uŸhïéÛ›>¼ IXæŸp™œ5²’èÕO¸w,ëKW ¼qaóñÖvF¼v øäÄÌ"‡,â*^–G$úM+-ZQ•Ô—k–’á¶fÝiX;Íþuíj®š/WZ’¼ßŽt~5ës¼›{‰üô,:Z U›{ý-ƪ÷[¿ý&^5ŠÌÓyîA~¯ðª°s´£ ‚œƒŽ’&?’%õ,p~nÈvÝäÃpI¯]†ÂRĸ•ÁÉ7Õk£s|ê£<Ø·<&®¯¯ ;§„ˆ¼LøÒYPÇç£×š+T¢µ…¬û¬ä¢g਀K R=ÚÕo§@ùÖ|*—Ÿ.¶ÄU[ÉEüFmÂ7Ug-š5Æ’C ÁU_ös¼…’å ¿êŠÒZU\åàúÍ”BöEjÔ7ÕŽ"N7ï_Ü‘ò)#S,]žkdãbÈ!Á¬à·WöÚ?EÓ×t,eÛe/øˆôF´õ ¤%¿Óµ‹íö[Ê15÷†Ú:È{°ŠÙ³Ú~o{†û¦_“Rãë>ŠÉqD”ÃN®SÑö;.ʼëk=cñúiæEVÜÙµjŸ&Å"v¤Î·ÅâwD/nM¨ð¬Áºo}¥©MèìK” Yód祱¾v›zßè”7÷!ýÁ Ã]=y-F<ˆÅ-Cï©ýXhž¥,ÇËÕÜáÙ1(“qŸáYl™ ç_5¬Ëà2àŽG¾É4t 141ó@ŸóVË@õM(%œ§íˆJ|N.·‘P2t“·Ø àž@NîªFš›¨7B#ý•8|YðÓ:As`jNÔé…¢çê[•Okï\Ÿf†Û´c™„ÓÀ7 3»çÐcòǹF…RWÍèÄTȽ7ê„¶ó Hä2gœÛh ›aÜTžhn–/Ï:´0qÒ)½"¯›¨(33ãôq˜>sÁ±|:½¾Ù¸U @[?xzöÎØwûƼàÊÊ.@Erͼ‹*Áו|Ûgš(¿ v· }Ç‹ë3wÎF¯ÖºŽöLôseÑÀ«Olý›Ÿ3¸e (Érfd å•­w߇æÑÛæMlÊâÙ ¶’:öžðÅ$ ú`Úneð¹ÐìrÑGP4{‰ðÒ1ªåäÞ=÷º â9ù. †·ïŽÔR±÷Hмcž衸÷µëÙèè9÷ñ'õíå‡4V4-¹4«’›ä„7[oK°¨&%fq¼L²ý €=²9þþZÈÑVò¸&„ù=T»=ƒòÆà÷#!bEtJ—•òÄEÙ¶òzå{ñ5á•së+ ^…·Ô¸‰ÉÓ¥m·O<.Œ‰ñÑ`râ¶fÞ>'&X®M`cÑÖ þb16·d÷Zв$œ‹ÂñÍíð<ç4:ÎÚu÷éíwRSŒb6ÐïŸ?5³u—Qˆátî¤"G›{\íÅýiIêýóWøTt~O÷æ­Å.–}çjgtß\;}îFŸ³}æ7Ò¦+gŒä‘{_ÔUñ[/a`ÅÊeÒWÖý-“ÊÀø¯t=`Ýsæýçü6}„vÔxòŒ&Ý·c]'”sëí)(q›ßlCìŽÝj…N;•nEŸh–"ÍwÒj9q<™{ÑU%eÌ­N¨1·öl å¸6á.šÙzço3èëL¸¤-oíŸÞ«è:XoYÉå?@©ƒ|> ÓL]7ýJâ,ա׈4b£s‰WkY3Ò››jég¨ÒÚœ‘hN¢™oFVÒ{óÉ@GÉýž ‚¢•¸b_ ªÏ>½bXd.f_=™#Û÷Žyú,)ÓÇ]×|,·éªüY™µ’oE•È\È’NÿÖ·¥É{ãÉ$4"À:c/Þ,Ü/h‘”÷¶‚6ÜžHú˜Ì›ze&æW㸻Ǣ¾ :¤~Ó=ËN™†~%U÷&8æ¬P¹¿>wYűˆ«ŽaNþ¡Uˆ7WQŒþ©€MS½ŽC]—›ÉH4ªÃÒ ³ZÖ²Jôó„±gç&¨'Ú·ýh¬ÇŠ­ÞÔä}ºÔ¶±D‹ÍgCƒ»ÅKW~7ÿ‚Eèa¢ËÛ^Ýç½Ìtq…/Ê^<éÒ±ƒS¨èEq3¢QBÒ&í|)½ßXpðFõ+´¦ª×e>xþȰ“Íÿ¥þ16ñÚRTÓªbŶ%ç„Vé†ï‚Ðji>D¶ûdTNi:܃e4^[ØwUh¸˜Uc†‘© +ä7ùÖV9:-ýTõūߵÊwˆÈ½ËkÍb‘C)“,Ú¶:Þíó½÷ßCšóÀý‚÷Ù‡2dƒø…TF[•Hå›6ùkx,,Ï3iû¤>¤=Óô¢|ëę̀ƴZ\ȈMkq c•vÔÛ˜ð ðÙp%*¡óKÍbÑ â\©Æ;Þ¢† HÛ¹uÏ+ª­Q=ô\HÉgOnÎûæ·•*í½‡ýIŒ»qwV)¿=³Élm,(™s‹Æ˜»„6Òètç_34è}*"yãþ+’O…}-»Õ§–úÌÕ‰¦‡FÕd-GÓi6:›‚åžüÂO2‘Üó¹ dïü3eíõ2–Ý{ÕžéŠd½·«Ÿlºõp³»QäëÙkw-f‘:ÌîeÒ >Å@‡j!åiJÎ|ø‹î0AIDÖÄäxÀœ1Çl‘—¤‰Ã´µ>„F½Ýª§•I0tצ½•‘n^>õ&É_;w-8$‘-Ê6.t¶ÔèÛçäÜã[â†DÑ*Xä.q,8ƒx¶ŸÍri4‹™iµW¢ ,… 3ŸºzFöt$íFÑ,¾²¿íTp9^9[7Ï/\ çõ|ÈòM±ÑKòÎWƒ#õ/ìÞ/X¨Ó‹¶Æ›¼²ÔéÃÅ7í«pô›¥ž–uΚ¬Ú!G2iTŠ0˜ %c»Êú˜Ú?½e]Ñçm‡î¨§¦v»^ÆfWøÙ¨º( Dè[ÙÁÄ}OUé4:—8uy+ɳ|†D§ÇÈ=q«—†¤+éýÀ"-ªdÃ\& ^mßÂhݲòÜî·šï>Öž|sToŠFn…Kpq‘ Ç»•ß3rr[Á„M‚Ù^å1Šw ¡USC3s©Œ^ô‘UYê“î›ôg¾†=D­òõì¥É¦n²óøÓÁûæ¹j¼kó‚0TÑ<'\…íW/g80Ýzo%àè—)Ü€rg9¥p|Î(é7I±oÌX /oºÛÉZ¸*›?Ú¯­‘µ)&.Ê*|½ÛÞØ5¦ûƒ&¦ÿ=ÕÛÊ+¼Ú‚ ¶VqT¦îç.ŽžQqð²o¾ú ^Pâô'²ayŒ³|UsÞ}ßz|¢`A e“À‰½|ïy~ܽ­¶xˆ=î¶P»'È'ŽÞäÇðÕõ¼<ÕOßyLY;ÐçÆ³gv6„Ìy3=»HhD-ä5oµõlùÏN¼oó9êkd n ¬mh\¢Ñ‰QnþóøÂå³W¿Åäçò þÙ'YÿIAž _˜û†/¬òã`Rë—cIÃ_è˜þ \ìeårüŽ1lû—ˆÂ&ü!ÿCìùÞ4 âõQ˜ŸSHàwˆÂXº:ÓÍâ\ë ôž,Ë:X:Þ6ÚÒŒd¶Ï*ѯ.àfâ #—^—$Tô@W†²S¼ Þa<žµZSWTß°ð¥¾áiÖ—eÇãݰÓÓÝ…JXê‹ÐåÂÆeûåY›«Ã&ñƒ^ËLEÕØ£åÔGlnía_¬Ç±‹Ç8ž#>¼n‹Eµ©ê|P6½~Ü<Ñãp÷œzNÛªæ®H—ŽgQц-}ƒ5‡ é²óÙƒ÷ÐóÕ$¾òE“NúË@}Ò‡#ÊÈØMºÎnf&>ʦ`ON£HJªsv= |ý‚Ô‡ã(&ö•RÔèù4 Nwý'‚âðåŬç 0èTÛö…ÐîÚºA¯×•£¸#?û‚@'ǸPˆ“Î}b½hH½ÍÆËªwðå$´Òðlª+UÀ4C½-6Œñ.¬5úÄ2†KÂk=Ž­¥ |ø…‚4¬õ!šÕõm\VâwáO;ºªæg”Yo½ }ÚõÅò¬êb†bû¶Ûöz<ã8o+(ã¹LC=ÍsÈ]þÛ*½6–N313üë½-`UÞ7°3Cö«Nf<èWgtYI[úzªÕî”|(Û¾öeCG@Ãq­b gÅA”,Pu˜ÎºCˆÓq«öæÄ´jªÚå3²³FîP1¾Õ­tÛ©fð Á÷½çd9îÎS¯j†ÛvÚzÅ^YE)ö“Ç-n8d¬Š•$ç—J2'¼ÖÂŒÌsN Æe”dðîíÜÙØ¹ÞŒCåã,Ì hŠà£\+¤V}rÖòR1°g¤{ü9V/r­ì¬é}YÎa¥° ½Zý4f•í`,êm¯Ëƒh7ôø}ÉâFNEèÜ”´ønWaZbiøªâ†¤!‘c¶ÆiS©rß|bô­b jñ^ÀÁ.¿€‘wwäýý8R¿âf™ãÝÀP”—¦ŸogÐÄ—hY¥¦¤P><{ÞÑf"5+4À¶ÇtÒ°|¯á$é-yŽvwˆ@Îóþ‹~óÍ L‰’gì× %õ 5•ÆYScuª‚SŠ)f¼: !Ÿ83¤„ªÈ„ïP«o1ƒ%òR—E‰;äD°.fCB&åTóÙE¢øä›Ô.ƒÂ¤®™ ÃžÌë·¥oð·)óË^¾î·<è§ìÿ`ñiÝÙÕE­R6ô†– «¯Žݬƒ¥WÄâU猒Ú-âµ<4Î[®~á9~ý;žÚ(Ù{Ï¢6±“pƒÛÎØh—WT6\ã>ï‹$Þ†Œzš’Ë”qêMJµ˜º´  Ã²‡«Rsuöq«ïp£]/"iý’öèÜ'ËÑE—±5–uoŒÎ¦N_ÐÔ P£ácÆrq HQוîs‡¢%#ʹßåL  *Èø<aùèñä“åôÞ<Ï»1Þ6Ì ÂzÿiP{eý¯ç„¹GM€¿üj|oev‹‹bÈ¢ºIË×ñ÷;íAT]‘ßȾø‡Ü5ý@'™ïsý›¢#¯ƒæ…z¸eË£°€£H]ß&÷¥r|º¨’|Ô³iÔ0d^1›îâî;Òæ½Â’”zÉî˜&˜Mʯœ@|¢Á‰\üs‹©3´‡rÏ/J:ÔÞùæ5âY@–¡ŽE@´(a^]rŸXLwýn^ýt¥SiÈÒ¶¬¹&°\±’ù倆vaq¼Yö†ªÓÐÁpùÇÏû©ØÇÛm7qÓ)[^ãùÜ•·šXìl(ã=_õ(:[µßœë#nnjR%mŸ›Gø|LEäk“çJÅ3¹4ãÊiQ7g‡×I%¥5è9š) ')ª¯sDötìI<¿v-í²Õ®[ùVK*t}𪒣‘ðæ­I6×{„áB-]×éjûr{5ÅÝg²-*ÖD~ÙÇ­Tˆ”ŽiZ%¿úÔxØyé]Èʘ—FC4Èf™N[ëMRàO7¡5Ù»¼åŸ¨R4W >]Kš±IÔÛÜ×Ä$#ÊÙ*·&ÉL‹õz",‡ÛÚ¶pqqolkJ]Q`÷ f[ÖJ†´ãsR» ÁRÖz›Tkd×ó=öˇæØòI‡Oj$ÜBlÖPéW5mמ֯>r­Ið¦Ž#¸Y:6Ù’[qb~²ïçå4õv›(²ùæçSåYÌ ï‹O#Ý©³‰ ž Ý)…ËñþÍ ÁÖ=Œ/^Œç¡ÒS~çySFvsòù ÷׎_{æãªÜÁÃ÷Ÿ>pû€øa¸n=s‰Ze3 J¤楤ÞÚ—¾ñj “ÏûäÀ$… [½ÏÒ¹ŠP}”_:Ñ`~tÝïÅqä]A4?´¥ŠÑ6uBy¾òúh›×¸õå£ã<Âw=É?èI½!T\y/œôh·åŸ£þ> zº^ô,%…€ ÑÕ›³ùì9!‚ž! ï­®Hê³~¦H¾ôß /'dªÊ#>÷óxí“¿"«ÙÿT ¸p$ìëˆaL+Ó >p4ˆÍê9$™äœcâ´)VšÊŠŽ%—ãˆ(‡±s;|êÓ³ˆ‘÷NúÔúƪ|yøòÑP9&’|Rÿ«]á^OOÝ €“.! b”®šž”¯ˆ¶ö|- å+&[ÂuœŠ.%]i¡Û®%- OšÒ%_¾ULs·½×ì°kp@¿,10×Óúá±ûŠ™¼aÑNåÖZŸï—hÕá“Ñèûuü“0Š·ÅšNioð q[‹"äl9ÉZÛšWÉrOÀ¥!-7A˜cX¤Èño5 «¢†+FQfÉñ3?>m”Urd¶6³Ošºk=•.ÉT5s{ÞïÅc«¡=„']ô¢iDÍæ&“‹¶i%º%pÒš™gA6}—ÓX©êP2k„ÛÄ•L8/G2˜!ó’šyÄ<¶«iȬÕTy+ùPòéÈ,Ħr–ƒnÓ]_ÏóH6pU¿ðîû¢ÜkwY˜3ȧôa9ÔE4S¥uHÙhÉÉzŸ¥ÄÏ|ý:tµ»¤ÇÅŸ¨ð6t^¬9¿µ*žÿ C¥c™.Í‚f]ß쪈Šå¬þŽÙñåÇh×S$×Þ‡œ»¶f22ŽjY†æù ˜n`–ªø‘Ûîþ¶áÁç2׌¼5Mnd&1¨\SRÝðÆ—3»½ùLÌ3e„Ï,”=½ëMøFßí §ŠIwY™¸’Zç‘Yö˰ڤPP#÷Ô’ÏI—ñkœÝââqÍÚl–k‚ "|ÀkŸ¤¶š838çX8|Mu3¥r§Š9wΉ‚%\æ>ÒÖ?bt8m¡õ‹³{rá?~á¸qÄJ?0)ÝJÊÜõ,Ÿ%[%¥ßvŠAJÏ~*. ñ¤zuY(Eݪfª3älù:F6ÊÁ툱[7º.PFùôÜoxáÕÊ+×~ä“D'Ž~ãKÅ’òö¶pM©©i¯ZdkíHÇ›ÒÚv¨z_ºó š0Ìʸ˜Ýµ¹4d"˜yÕ=NLuSÊN²œüp›X-ì7¢ñÏØ•_«}ÑøèrŸb°âܽÇoÂõ¿ˆO^eÈ»Kúa#_Z0ZüÅTˆ]§,I÷££®9L{$‚÷Þ5¨àŸÐ‡­ï‡yè–u¢er›Éý¬ƒðy7¾šÂ>5fCŽ Ø˜ÃåûCxîߌO>Òªwg=V=ßË/Å×w¶ÿ´O:©-¦PkõvËEž÷k7Ìþ媨…M§ÃIkž (%˜éT¾xhtY…/E.…ÝŽÊó.z¬ª¥µ¬ŽVÝkæÁ×0–׸§„z*vz·âQ”¾Üq‰æå1 µj|”ê§Òfˆò’5‘§L ¶·¾‡Öø5$ˆëtFÄá=.}6öfD¥|9ÓìšÎ²ïJÍ9RÓàâ¹ÏòÔ*{ w¥‰f† %Ù4²™ÎÓšo+Ù ¸ ;Þû\!c/ký-x¢JXîœéšëù’µ7-¼}í‘îv—þ y"?ާ~ßÀ »Ë%™ $K8ûR D}~HùúeÕèVظif(\ -T©¦Vÿ[‰ƒ.×Û2L'ª›û”Ô–Ú°Ñ8;f½æ…¶€RGß;’/"tªôþ’7ÅÚcåÚÑÄÊü`ßé–Þ\øû.wÚû\rsî[òfÁn5}l´¡½C¥05-¨íSŒÝó m â“öÆ!g‘gj2CF"7·»I:FÅ­4yœ+¼äê¡/ÃT…RÝ¢JB#Y5óÐ-sˆû:Ëu 6iØNeèvŒ &ŒËÄçaè#ó¼ £§šL½ÞäÌw€è~èæayYN ÑžF¤åÚ]Çp$ZÍ­®ÚårÙ[´qD^¦f¡‡Nº‰9Nš]¼\ŒÝ$bÜ’%‹1CÐ^~—†DußžÄlpWËóCe³Ùׄ'|54u[ŠŽœ˜h‘‡VDøý…»èf´+‹føQ»»f3HTbaPÍz†–ÊòÜ;#mÏ'¬Ù6ƒÆÙX¹}ü^¡½'#—jÛvØ*«)ë?Ñ#'ybßgy[Âl‘äíQ¶§³l&ŸÓ¬=ýHùÛ­ù÷wzƒó•yý;ÀªÊ7ºnŽÅ¦9$¨ìùШn²A@us!‰#lÂQëÚ­ÆQ&@ž÷†®sGG‰8’•sÏ}S¦äÇ}¼z\kàDéüi¯(_¹)¸¯‚[Í^Ý߸%:K˜æºÿÃ/ëDlÕIkí·À·iµ5†KÔŸPAF‘>by¿Ø­·º_Ó÷̽´mxÜÓH¥½ˆ½Á ¯A J§üëè5ãk‚ʧ%t·„n޳ãó‰—ĸ'ºhߥ<–»Ç–Éïxú©¸µÜ§qw§_Lƒ¡$Ó&Ñí„çÚ=â£Ìé÷¨ç ¾Ð¨‘GièNw¾]…z“Q ¾HðÔÆ/™âZwþhòáòí!ä• pW¯B\Oï5[Œ gÃÛÓ×EÏi‚&:ŸîRíÜ6¼”òÛñžÊâòºÜÞ#…öÂvª¡tCýœ¶0Ä ¼ÕJãç5–AH’þЬ9Fi¨ l-·ŽS™3ax/»~Lc„˜³Wêë#âY·á K‹Æ§Ídñ¶7W15oä½3Í=šà&£ã¬¼GRó©ÆiªÆVstXdU%K·‚陉ao‡6û‘h é9 Î` ‘Õ™ÿS‹æ ½°E6VNQ²j”I\ÔËz¥;åÎéëš+ù×IsËo5Ræ`–äh²ñߣz,FQGÍ+ lÖ#‘˜kX {«`³;n»c.î{Ï!»Ÿá3,o0¸]'Ÿ†,›€õ°¤˜nóŒs4Íùñ¼(ÌI!ØÖîÓ=nËP~5ªN4õ¾¶vr²®Þf+=oÕÐ@7ö”èÞœ„? XâÕ¡WèªEÅ÷+”ØÕ1ÉÊÏK÷G,Y>ºäs³f¬‘ãR÷*u…%ŸÛàðãŸt—‰7Äe‰ÌÞ0¦ç@K_ÉSðhóÞCqÃ~o»êȬéë%‚K’‚§q³”ÝõIºâëìo]fŠR_¡ŠKϽ ‘KÍì@;è’<®ÓAÍÿªàë –OÁçñSᣲÚ*dî'p}Ö™˜:¼Æ“ÿ&z‹ Æ¡ƒÏ™Åv…¹RÊX×KÌzR_¦K1;‡±ïó¶îM“ ØfÓé³ ¿x_ýp¸+F¶í}~®Gù™­X­¶SµÅ–Ùzà×Hl†š¹Z{rÚŒnK ÅĶGgvh8+õüÝoía“‘Â}L²÷ÍZŸb¾”’ 6¡Wà¸#ÀÞšÀÈÝÇÞFhöÛ[U çý°›)=>™êáiîÊÊü ìß0î%ì¾å‡Í2ÌÀ\÷5rspe[§_Y{¢¿Ð£Eê®Ì©b@dóM†å,¥–oéC•žQ÷^Åž+\›ÝŸÁv ¯ðÍð=ÁEw/!c±`­BëûÁ]÷?sy|2)u[Z 7}Ë¿ÇÊÎc¥çKÞÊHç@¥¹qû}uwHŽ4cÒmVK¼-kí~±~nôVÓöJo‰‰àÈ´üþTX"XµŒYc?‡NfÝz¢bqÊ2vR–üýѰÁ7Iý¢³ø0:Ùwýû×%Í„³Û´‚V°²âä?•ƒØ•aä}k„E¨G8È%T-Õ“ ¼Ýñ9LÏ…dƒpN"P×Ĥq®Ó1£Šr MøR”ºÐJ“ÇN†ÀÈŸ ¿C>‹E8ð›H*h—¥§tõ O})ލÿò XYZçò=Ϻ¼ZìšAi¤ƒçººÜ®hÜE`nj™†:ž²ÁËc"ê•á e¯’{¾SL¯ã{_Ú*8K¶Ibú’^´>,Ÿ‘É §!õâøß¾­ÎM}ËZ™tÙd&:t†ÊJë{X\¢³rq/#}ŒNM&}Õcåt+°.Âýëf¶MLᮽÍ\Âüá#^Ü\¡ùg­/˜6L\åH<?×Vµ $w¼Z8Û™6ª¬sŸ§{2‹î#Ç8…i”bÉ<íȉ _Ö˜³Ãw?V5¶:Þ+1wÿvm‰i£ç¢ê‹áðÇÍKxáagéž0é¡/õŸ,°îÒ.¦}3köT>g_”h×Ë=aɲlíšK->›qtCJñ"š§Ç H|QeY­¨¹%畦¤mÕ(Ûõn,éÆëT•ÎB¦Ë >ÞAÝøâwE¶K¾Þ~ù¹Þ^Ïõv;Wžê§kÖ¦zîÝš[6kmN|+XoÂnò6=YÇ3àù}R6-ñþÑ®ÖYÜ‘ì¬5M¶#w«Â¬Ôö¸Ëuðææ³KnËy×NÛ/—Ñ”©c¯Ä‡\[ul¢eL·©ïQxB-ùüð?-Öä…—é"ÝÔÓ{vÚOmY­«£tíi9¸¨ÐÚ¿Q±³y«u U É6‘Ó‡Ï|d•ÌVÓªäŒ4Æ’†¬ÒœêCH£“IãZÒŸx Ó]jÔ°0P9ê" ‡ÿ’ø-˜‘7ÿ¢\ç¶+8¨‚-‰ûÙ“CÒ¡ú r‡â¦©h9â  È²áF¹.Õԡ漆ŽùÀ“úcq¯ž3—‰P”ØÃ¾ý$¢¢•ù:#§ÅE'䃡˜€›õ· ë@±HŸäÚn¡‰$´|(1˜[.‰³„òt]3èà(Ê530wké§Ú¦[<¨¢a{õš ßöV“Üðp¶¡S—ÅèÓ³¸ŒS lùÓ› ¸Îêܧ²žÜwå¶t‡>?;?ÕÊQKÌШ3QDÞ´+Ýèï©án‚±Ö/£…±R„•Nòæ ïǶŠýöðláaá6ÞÀî⋾J¹÷,³ä!UOÅ11ìÄïN¿ðà¬e8ð›â“ì2ÔøÖ‡3þ¦òÕXíKQ÷І\rv[yGœ¶·²ù7Þ¨ø»ÛeÄß©µu\òtž<›zD™[ÿ¤µb¢— ­}<5ͨêNŸ £§€{ô‹Ò tfï Y¶(%ï®=œ­úèOçÜ9¯9­ìÉ»èÚ{è3Ót:2lÞ{7Ë}“D{ÜóžK»Wà+Ó´/JÞ”øK@5M‰€1!$§Dóí¶מó2¿¨Ôùú޹­ßœàžU¥óîù4åN¤àãý¥U󝔸Ý=×y™Ò/™ÝïP~MÚ•—}ÑÂf}4 Pw‘ªqøJ4wêA~hÌÚ‡²o[4Ç”ƒ÷ß’ Gôjò)j8‚ê.Rü…"Ct>‘=xuîsÉü-—«U¿bÇî!\‹šs‚†Ì„?ù†ÿ•ËÕ’Cj¿Ç}«DÒL+¸È&¢NŠÿÒqùx ;õIå~¬'÷(Ÿo¾ñ©•[¢// ÉÒ-ð\ÄQŒ¬&½ýÌc%¯¡ûÖ‰+sÈv¸§ê½Öòü'àš\ÿÅ:þObƒx¬¬ÿ€8ËÃc#deÅ+(ÀÉkõëø Õ¿ëXàŸÇ:øëø¢¯ëøiêß=ÆÿÅ:þ_Žu,ðw±ŽþY¬cî¿…u|…éñ; ^n.nÁ?bó ü ^±À?„uÌÃõDzüÜÄæøn0÷ñ”ØÀâÿ#^±Õä/ðŠyxþ(?ÿñ”ù…þÆËÿGYyþÐ.¿àûÆÅË÷Gìä?`@s !>kñ7ð¹ÿþ±¼/´· |iäæä““å’åãç‘’•–àç“ÿû9þÿ˜›‹——óÿ“øÇÿ_ÿùüggW¨cçùwB#ÿuügN>n.$.n~>®+¸οjàõÂÜ¡®n'Û«¢¿ë"ë¯M!ät‚o”JVcWb×eGTßÌ! ׎ÓUi5<"pƒ >]„kÇÙÝéAܼ¸ Nˆtøü¢l„Dð á•ÿ^á?Ô„9ƒ­ 6+V §+ÄÍ ì×Qñ/ºæŸ9‚îÁÕ㺂á>ãg7`À«Øöª0wˆÈ†jsUøJE¿4ý£Ê*¹!†ñ—a£Áà÷ßMë§œ`/D{0DŸ!Žðèž ^bÄÚ¡®"PJ[NÇ\S[CFNGȤææ*»;x_™6<‡Ž"P]JMð[o4ajþ¸{\!m"ä»x6¨Ã• ¯Êêªkhê(éØàÝ’Ò@œ¬Ü­Á@QD…ìvâvMMÄ(ÄøÛF¯n¬ì@NN` ‰ÒKMøîØÚ>Í€Ìðdxägmnc C¤Ã+ÂúÍ#Äè€ú&6Ò¿ë9<;ÐÆÝÉêÊárX;À-âäìîÆXgÄØ~×ûÕL€8‚á©0ÜA­ ðHùûŒ"¨ 3Óÿ^Ù¾Ó¯võ@L¹Ÿ†|ÿbƒ°Ko»’ö/Oدd´Ç]@ë_ñá:†W … ¼bòÀ}ÉïãJ´¿ n—Öðyü¡F¢JÄÔ‡‹èYYA]­LLO;0<ÑõJxD)ÀïJ}ŸŒWr#Ú»Ò$¼¹ZDL„TÞW&ЏBTzåá‚Á¯ÙŒˆþA0¸ªÜàÄûʀݓÙé»ß…‹õ}›ˆø-<ÄÉzŒ0 |Oiå¸Ò8èç` ¦û,„§ú®øŸÏl!ðÁû­¸?ü™‰ýÊNuí®ªÿ­e~± OÜñ~—hw–ðmÙ÷Yøs°>äÊ‘yÃ}1ÜÀ{€¹[!ê²qw€ÏrxxHÍü…"fÄwq‡P°ï^ a8Á}$|„~˜îöàý„»'D…W]üt‘eÆïÓÆô†ºá6{5èÐï£û£ì@=påšt4dTätÍ¥¥d¯ºG W,è*5;P16¿è~ ÷ÚVPwWø²÷ëzE,RPO|Epýžã*ŒC<¸òßÇ‘é‡íA\¿9 €ý²~Ÿ~/¸§”»+¥¦©*÷}n@ ”ŽøX2âèαXÁUùáËä_ \bÐÏI€ ós€„¿{)íï>>Á€NpsFDîNn"€þ aÉðþ|_‚à"‚ w+·+#ó9ݵzaÈ^XE‡Þ¹gÁ+ã[ÂúõaÆžá;tö‰=Kø¯3ÜÛlEùBˉˆn¨P,3¾g·wØ’{°Ok'Ÿþ¶ ˺àÈ”}ËDïÔmó›âµò–MoeÌ®DÉ·Öµƒ^òPXVYÛÍØÄ9^¥²gÔñÈOõEžæUÚ›3)ñëdÙf +¯Žh˜–½)†šš©†lÌ…–3ö–±lÐ3b[«Çäjœñßhj¨®Ô›<{ êS±ÅXp÷kñµ“âH¶^ÕB꣛£ý7úTyü˜‘Ýìfv8ƒ‡ñ\„294ž½’°Ýˆ)w¡A·q(xH­¼Sigž‹¹Ú]-òG|•€h4áÖCò†[­Çev 嫟hÖ½Û¦úÜ//ö)ʼnoVÙ÷FÝMp{Ýs¡Þ¡É:À[S˰´™íR;\É‹þ†::7ËЩ'×FÚkÍsŒ±Þ–´UšÇaî7¿Q=¾«\ýÅ'I3¤ X8DÌøÅuÀc ¿T\úÒÑY\7ï]è$ƒÝœ@˜ð8’ìC§ò:>Åü.E¡u›TÜöAŸØ\ª‘{ÓXøçq´ì=è^?u8ž¥—§yˆOQÕ"±~½›7ï ƒ ‰Ííºe€ƒÕ°ÌfÆ$ e^Z5ÞžC<ÉXHé»ÜÇOåZìyR ¾)X\랺}ÿ"Ø6w:O¿(¹šE‰Dˆ)Ùåy <@ñ‰*¡ÂÉ} ý A³Rûf§g2‘ð׆dÉp3~º 6¶é›™x/Ƀäîâ¯Ë?|‚\Œ'Vä3«WC‘O'­3['âÂ/¬Íçæ8]Š’Rÿ¼ª‹CDÞéÓ^öúFÖ"Mkd¡µ¹ØÌñqPTæã¨÷³­{Ô0Ylšjy8bº$ïúöqƒ*VgôWç_ðÊ ÙÅ,v.‰ç[¶$Pr“¢¼¸mù%ûEvnjõæQN0gï2AÝBݪ;çx¿‡In½;ùv&z¼ôjB’ïpªFoæþ–ú ¯Ø#|Êo1~2F_Ò6 A½°œ^õ{¨Îþ(f×$ÎjŸy«Z €ý6± ‹P„â˜`¢±FðË]Iƒˆðù­„cL^®;ç7ÎÎØ ÓèÜJ·éT…LÆ ñ#©ýäTÉ©ŽÊcÍ;ô>é4¬¤Áo"ò¸Ò½1ƒ£Ü{¥Ï?L[©Z` 3ëYÉ=7XħÌ÷FµoŸ»¶}MŒbÐVÅXI©sJa]¨FSŽóu[$š€BJîG{RºÞÖ¤Å+u=x¯yÛpXÄp(ÀÔ¤Ý{˜Ntõ¥-øÐ‚òÑ)H9*°n\°óŽ(1è¨J‡_½³9 ö%¢HpsGÆ^ýíšç×sÔfÔ¡•òƒ‹Kˆï¿”¤üàüœòCJW_UQüø ¯ÿ/”¿R*üŠ›ÿ+5įXüß±ûIý'¨þ”âBGÓ@YUþßBqÁõQ\üÒ¾¿MnòGz ιçÿ€Ú‚ø[Z ÎßÐ[ü‹¿¤³ø Ïÿ‰ÊBG[鮜Þÿ*‹ßÿûk4þ‘¿$²ø•ÄâψþœÂâgWõ䜿£®øë 5ÿçh+þЛÿ$eÅ‚ëæ_'©økÎïç÷úá#Ç+Äó[‚ ...Î¥‚‹ë¯|µ_€çosTüŽ£ÂŠÌaÇáÀ uû÷“Lpqñòý–d"ÑWÕØ¸·Ht',O’bšÓW„Äʼnö&gI˜ìÛ™k]gÏqÝsÑ„í‚_Sk*Cß½#kgÅÇù+Êï©j&së&Qɇ 6ô>jzŠ‚¨ö{;„lrDI‡ýB gbTÄ.ž2šÄó™£d{ƒ2–½B½ç/æ¥ HîkŸÍ—’ÝÊ%ìñA¢BßsÙÝ­Üô“ðÚ1Lûz«Kr¼Ôd ñ5óõö\Íao>šÏÛ2‘x—ÆXb®¼“Œ?×vG­§b‡=60QB{ÖX¨ÛAMtb¢$ÄP'O³FûèÅ@ÔFံWˆzTã"IŠ@õ.õèÀ* )"aâk C¼Ý/a -Ð×$ƒÀ³ùmD2Ð#ÆÆOî8¶¦ò1yºQзjôE{ ¸ÅcæÈ…áÚ‰kZ¸œt†‹wñ%·D¿¡­nÛˆØqS<\VW?N›[/ƒ…­ÐµòpSª Í&Nmø¾"•©?ëCa…|x¾yBŽ­Õ˜3ôåq'±x+›bbZø"(§„æÞë#å\ 4^˜qáÑ|½Âb•é?ó\„TzƒÕI2ìÐAçÚƒ‘XðA,(4|$ç­aÛ|‹shëùû¤w{ùµÅ%úpößBcÒ:Ï=¶Ü;Ç©d¼i±±¾óÅQãéR7¶UkÊ0Ù—ë:{ €ÔÒ‰aÌWCí䪘8¬1 à-1÷l£Ü È›9ؾí sB¢.*ŠÎâgŸLå$]9ɡęB±$Ô‡T©3uŸ ÷õ&µ;´ŸlqP sfì;6~Úï€tê>JÔœy:vUìzà’HyÚÄ&ë&æ6êç!¥);–5¨w¤Ýã$à#Ð'ÿº–#øÍÇûžzaõù¨5…£ð$ÜùðMëöº ‘Œn<îíÅ (yrÿîp효 i‡ö×üR§¥VÿîÛÝH-oòŸL¾ðWL&I§4 6û8Lec}$8¥;Þöðb¿ŸýÜV'÷eg+z.aX5ý=ù0‘’œö4¾öadey&ų%<œçRÖ·žË£Í§»qú?xX(C½þzçiEœ_ÝËb#l/rò3$è­‘}óaÌ5ÁgA·é;¿Å|öj-I+n§I½Œ…ÈL(|j˜µÝoëŸÒ‹ÅMýâl¥Ñ÷ºóÙó<‰”²ç…/7¯¥`¿v’)É EâcNÜ'–Î|C˜ZvÌàÈn¢°œ°œYsÜÞÆwÍH*æE%©›«£;`äÃmLÐ-l;ö{©Âž” Ö»Ü`¹iò*¼S®Õ‡,É„AL¼ÖÑu#o7v:p’ã¤cSñ×>¢%S¥5|íÁQ¢Ç41Uæ®ü8à$JGá òÀ ô™Û(žÙ7Hú'ãI)¹†.“ÛKž­…,ú¤·$¤°‚8üs´É-&¼?úÏc½_ Y8¹þyôh®zôßÂŽ6¼òðX–ßÂDÿ‰þKˆè¿¿r…¸ò;Œ•¿ÀWñþ÷ƒCóð òýZWÇ0#€‹v7/HóÙµBBù1WóÙ×®÷Hˆ{q]Ðt¿ð±b‘•0Epƒ«dâƒ@Lüra÷oβ¿×ß1ŠÑoQ{ʧ®7­«v&±É½1Œ«|ôXf6ê=ä¿»pxy|qIF ˆZÙ÷Òù¢¬mùÛ<ÀUÿÎpÎrƒ+ê,-ÎùÃ33«6”µ<J½Qç}™x5´v|Fñ¸ Ð;”•OÄ”0'~YÈwq'Wèp}ä2‡¡ÝøÅšÎ«ÒíöX/§)*+EÙ5/åôªYùèô3®•¢“}wÉ*‹¡Z³ˆ5øîÜM°.>_DŽÎ·9Sß¹ÉZ4ÄsÎÓ`-çôêáÂu"‚NPƒõ«ÿ{S£Ù5œ~e%dr#¹ÚÁo˜33”Fò¿hú–ù¿¹e/Á— È÷+C{ƒlOSP@ª•YÚû†Ð».yVÙ_™­à‘ŽHiXC­¸X{«,0ß+ù6Ÿíë¦lŸáÃ¥Þíê€,·ÐK®KÌK‘SPKö="Ñë£_°û?x¢ÕDu;PÙ_¾_3MbÓÑ×`z|0jîv㔚ª~ˆ®P@ƒ:q÷wè+¬c›…#ì›Á¼±g æG®Ÿ+¹ï¨“ïÆ'—ë.ÑG†’úÈÙÜÞ”ÄÌZ‡©…VÆ3oPÅq'H›™X¤¼…S%tûû˜àF¾ÖÜ£a't!KH‡&³yu¸í-ÁæIùÛLæK©¬‘Æ_…rTÎ’'Þ`ðyài36•¿‰âO 1µIÉ^OW·Ê#b~£öAU÷Ié“§O!Ž5oî· ¹çÜ kü¼LûnP¨–È xsý‘ûasçMÒ*æF;Ò@ÁW7[¬^ ä a³CBâ¤j—¶©§Jª Œ¾,ƒ½²¹½ŽÙ{½ÆOi ¦{ˆ÷rñôŸ÷¯W *±¿0µd–Õ.Ô¥,àćºô&Ii™<«OžÊn¨/ÞìŒ6*|Fd¸çéÚü¬‚¦…îúù~CåLæÔ©ÝA 4æ}l¸™NŠy¹ïp®È²òê8MÝ…¼@uöαyë •¥n*¢Î[ž’®}ÈáºI&¬2ÆZ’ínº>RþT/%{b=9OŽœ=æª^Røò>_Œ|.é‘Á)4Ä?¡®±‰{o1§g (Šýª$ˆóbç>R‹HЩ usÀŽ;Õ®„“n—QÀ–‚³æþÞ+Z)ÁC±,–ž¯!&^­…tTƒX숳‹gÊ­rï· Q:–Ý|(µ—Ò4º “2K¨4pÄ’›p¹–7#t¬£äJ3}ßõ£Rvî}HãñmÙVtò&àa/ª“z"Ún)?:_‚qG:žYu!?žîe×Ê1•Y\Ú§·Ÿõ¹Ö&vÇf|X­g—åš9ÉÞõö¼ãÉ-Ä °—}4ÄúVjj¿Sš=žÓ¡.ý8± [ÝxFRÆL¬¹³ϧÖØPÜÌØ þ&qJwìaZð—Q¢B_™P¢µo‘=ûqN­•Z¨Ä¤š>œ¿P¬æ²Šºê|v‰ñõž—ê?öóBÃ7LKPJ-VySzƒ$™ªRµr¤"žÆæãTK=^øSË'U…UUeŸ¯ëc:5²e^Þ-Uõ#vRòºEO™>Š”|”n_hüVrö¼ٓ٢ýN‹jb"4>ž§UmDâþ6öú¢Ã-øíw½ã¹LWBÞÊU1›Þøj¨úµ¾Uu–1@Jõ° vf}9RÏËèóBI¯OŸ“<@kOžhPiz߉ƒ×OY2ô*S­Á‘æÕÚÑab5ñ †ëä·ðk鶤³Ï˜K¤<³ƒUÇ–TnºÞýd[ðE.ÎäS‚šÃÖcéœuîwÜš„÷›è¼Ãæ.ŠèþõµfqÎøYÉ…cŠ×‰’Þq3Gy‰ È€ô‚Å£;ï;2Ùó,ðWÛx]?Þ­ö(:SïÊægfmå9‡'…J‚·»Nõ3Ý ˆ–MìøÄ2XJv[ñûë?Ù°eACÒûÁ·öÈ»@ަ× ^¼ž[yë•´e$xw&¿\RÏ©´lÊŽë†fJ›Ñ«[½³8ÍOß”ò­ß<¢©Ž[Ä=­¼-}·«éös}wƒF5Õá§Ÿ\vÐ9œƒ>ÎÜž+iš[¥x{~^Íý´òZSYô5ËÒ¼œ“–ÃÇXû±ÂÌÞÕ‡v4yÙJºwmdåûæ Âô®Þ°"1Ç/ÔØODxÌ«4ÚÄQŒ‰o…¶îŸÌQÉÖÝq¬yÝœ‰q#5g/{ÈÁ¾Z[Æ+-ÿí¢¼G…Ÿ[¿.°@…5Ü ap5­°tÔ¨çšNLcóùVß©-zÈlûÀGã"Ù]-l}‚.LÀ±tylè…~Õ¬ú7K¾œiø¨?¸2 JÎ…òŽî§Š­òwC™ƒ¦—×ùÝì`o®9I a¬ ¿|š[ÕÜ|ëãgôçm„z¹ÊÅ,ݬQ*1ø·U›çõ¦mHëêë ~A·qÙ©,Î›ÍØDØ™¸gžUe Ýÿ:wîéà§›ÁLÁ5tÜŠtÜ~4wƒô=yo šOX~ZèH:CÄlžÙ;W!œÕX[‹¸Àt öæ7¢_~œŽå§x‹ë2™sYžnjn¬Yîßá|óãAd¬Ú±ã‘/e\—”I2ÒÖû®³^ú:Üœ»Fd¥£ÆÐ$iþ²÷òà˜;ÝrcA}í$6ÀX‹aS;ZŽUZ»ï°ôL¢¹a•©˜ 6]%ü η»Ò‚1­î/W.7℺ky3† L$Ð0© =tÊmã[$²‡ÂÍ&š&Ve|ßóQ‡/mM¢¤^qI}ãµ—+–N Nžè}%x,Riöq+¡_`æ‰_½á=ôìcǬõDŸ#ÅLûê¸;<ÓèOçøh>¬Qb¿ˆÈ¬£ÝºÈ}ù8œŸë+uì¢+ š 2»ƒ”‚«Æ.¨ÏÊn¾Ò¤Î|YV˜²£~µª0³‰]SÙƒ6ZîµM/|ÉÖ2ÿxûõ\xoà°X–58ü"Uv­Ñ’ýK—™YÐDRØ3h” [… .g“÷Þ­Mj]F\ȵucd/…Ž":1¾IgPopÕ'ö&xÑ Q; zYA1F3o]wÆ|öökÐÝÔw";ÏÂ>õH;íááIw¹ °y¬ñF_no\HG¯ØVE,~¹.Z‡9=I³—g g,ÊÁ¸¹k¾põ¬Âlv¶@Ó¶`¥¯·}±}Y#†nékol|Ùùe탆“ö[ßwV‡,sæJ-YÒÒ‡‘“çÏ-°3cßô… ßBi­40žÝy×"¬Ê0ÎD8óbkÆ ßLâU2nàªGQaVLyz=É@×޾Μǯˆ¬Ku&û#á&P–ó›viïö<¬mŽAVh< ’÷¦ïÌÚw¿ª¯ezuÑëüjêÝiæøù“B>lGë=4ŠWs-äï^E7œ¨½”S'gözô«r†>ŠôºÛ' ž'Ëá›Å²5¥_ˆI{GbÈ£ÏRLãø)mµÛñš>óÎ!_ËL¾S›zŸ6ìöEåþ þ”ɘJ óEãv…5o>ÃÞ4Ïp€FœH—òèu}¬—`¬GXú³¶w+¯†Ø®‘ ±å )¼°Ÿ»þŒ˜`š›ÿݰ†Ÿ¸ ¹q7:m1³eø™éz…r6ˆ¹‡ÍEYìTZCK»Ï+oßGz>¦Ÿm¯9aŠRn¿°C.-ãO)÷èˆÜWS¶ëÚØ£ò6žÉI-=0+j=Òûz¿ÓÛ€œÜ_¨3qŠbß[rÕ2l~@ã³Ò&»\˜(gİ•f7s6‰þ¾Ĥ#¢¿/â¶0iàúpÇþD‰•FX´ãíÑ ¼8–ží,—ºË0-Á~SïœþŽ!²í⦓U •ÇõY ñD\"õÊ´Ø:=‘%”}ñ¨R9Ù}¬G–1æ/VºPx’Ý[•ògË¢–n¤>ºóöR®+„vò „aV‹´¾XaZ>ý`1,<óÚ½÷BnéDcý+eZ¹l½ò}1ÛÒU_$äž§²2ø-&38× T¬DxZ!îÒLô÷9¶OÏb§ûvÃ…¼2,ú"vvÚÓo ¶iÊ;µeÝ|:¦ÏòÖá€ôä3ý•ÒÛ.¹G¡²Ûé8ùLb€Ð¼üê) g窌'">Õ‘¤ c(´†É]8„‡¬ýóèªåuÀÿèª?7íß7ì?Uåw²pØ@Ý]ÿ†ê?ŸzµƒG ¥þŽäéoà¥zÿÂJåäýV*†›ŽA½¿ô‡V dT~‚¨xdî;n˜‚´¼:¡wvHæ:Z= Mëi›YUêÁCr;­Ñ2P,,¾dîø;³q°)í~ÌöÝyk›ÓÚKm3 ¼Ë:uk±±°ôß“Òõ‡Ç,ét¬6qÖqù%’ÚÕwÖ‚„8mmv_‡_¾Çi7E¢;\ >¹–Ù;{;q-;1#“’Œ(³iÛQb7Hâ™ÙÅÎ¥_µËEÄÈ5ìÒüv¡ôAcÚ˜e?f»´'ùMaéÚp‹R‚!ùPq(‡HÆJý°Uº§®ª¾¥ìée«4AOñüÓN™ïÄ—¢ÝW/‡…“³ˆ®Lð]y9P 5Îõ|ÁE¼ +J êyax¹“QÚš‚Î4B}‡0-…ö¹–•Σö¨õ z”»"ïÊ}% “ØÇ».yÐÓÓ÷ºê6ÝáÙ}÷ž€$—xAYjqj~"cLüL—ä49^¢š(ZKöeÙaë‡Qha<ËÒ¬´=–!r}%Jôù÷1*ÞW$’Ï‘?!o¾:c`[™#4xG(ê±+û[ÉO³¥‹XOk El²ÒGrز.ÖêF… #Ï_Ãa힃n›édÂÏ@ c/GSG$.GÏÍI«È^´I¾°èñ®„•:¦š²ïŒ}à%ÇÝætŽ÷žÍ8z¶A‘Rôü8!øä _¤,CÉZä¸r“ ìQ×3mÿ¬=Ÿ~Ú Z3)ÆìËÎÉ)]Eüd3㢹v^xFb§6{¡v¡vÓ5ßàÏÖ(;Y!Ïù¹_2²cˆñnç÷©O‹ ûßÙG’Óš[[Y’6Bј-µHêz""Óm²YÓÇGµ$Q¬±4'þ,!?:¶è”[²!Y1MQã£(Iu®4†n=çMã»O;£wgÆ^†ÁÆWp˯S±ù?Ël¤¶K!»™£1Æ93TVÈCÜGK•I㸨oC’]ö#¿½ûð¹Å¯dÀýõõõTdÒÑp1%Nä9Ñ´ÞúÉ·–Þx/Q zˆMH¬…Ð炌ó#wÛh´¶2¤ œ_ʨ€0×ÎyO'õœ>ï´F&Ö#gcì=<>ÉV:Ç“äÇ•ðA†4®¼öú2€ ÂV´NÓ¿£E¨ªíÁ©nE¥ÚQ±c:¨Æ…Í7¹ÆÞúB×3)â&#ÈO£ÕÕË QeÐáñÅûÛ9U8‹œ2ÊŽ{CSN¢½,ŸÈBÑé‚v¸Yâ°Š-™–žiú<¤ê8³MŒ:¶Ìðø\«óÆìÞ·¹¶ë*±>?Ñ牔Ÿê=5tú™DFš´Åõú6ÝÜ€­û,­È!»‰T'&‚{h–Ÿsb7Ã׬RèÌÛc² Ý|×L)(|xš>=ʃ:E¯ªRà:!ßG²óX›:ŽC£÷@= {Q(³T:Åg#…]¾,D¬QµL|xG –©líšÙ̉i<ËXÈ+þoÎ'Ò¯#wm­E“ŒQ—–æžW0×x¤ÙäûŒRñ‘Y¿Lö6lÚ?ÇÔVÙÎVCCŒy_ ´ÚN¿[ÅßϺq?ÀàÑÑóoûÑ#çHkÅñw Å nnÌ'´J0.x¯9³ñå±¥¦¶ŒÖLT\Ll°‡Ô’'Öçç“JvÓ}5©õ€¼—oN` ƒº…­‰ÅêÙ8{>›2¥wçÈ Wåx-g•rÆÆ+ð³…0ßôVŽ™åH'¹Üê‹e XW ”yß9UéÕ¹Ù¼[¥N¬™ E ,âE¿¬¸‘^BZÓu7¿¥ù¹ì-zIy囹ú¾ŒœÖâ'æL`I.2hº¶0±y™íYÚBõøL~ÉòëKÛ¡3Æy_å^u\§•Q û-£¼…nëÆŸ'åÉF‹ýÁ^ƒÂMYoµwýv„ÝZZo ~„yÅ#-.1*º·k¢¾‘„h¦q³¥ãH.Ý^Ú™pY1¼¿äêç©®‡®¸NWxm'î“oÊYÁç÷…Mµ/ƒx\±XQõ[Q36׋QÎØÅ3ßz×*ÝÏdJI”¾é¥l}CÚž—½{í]Êêðc¼)ÿ7XV_™bAªuï½Ùk­§ï¥‹!f®£Ø-Ô|ÆgÿQcÌÛõžñ×ÜÕ,?CCý Aì½|ºkU—¶ƒÁCjæ¥4Ïf¬±È ßÔ%¿kžK½é“§‡bG["-ϬWhC7˜„äÏwO‰ª EÛ^ÕøÎdäØKYgá=3h Æè•VËü:»î89«|IMÆÂ5" ­ÌPÔX¦™¼döŒwU‰œ2Ù¸ÿ5߇ŠxŸb&oãÊ"NøÑ×ñPͪRŒcÑZ+ä©a…I–é‘2.ÊëO“TÉšjÝEVöÊmžs,tdÔ”þ —è²ë˜Ìåòàäk·=šœ #úº«1‡ ænK}€™ƒÏëÆÝKÌC!<š¼fÝ"f ¡{3µ#ª²ç<€G®)È•²”…'.Ý%žkÒØBoæbXº¦JÐS àâSŸ8Ù^EŠ ÿÍ#Ãæ˜=S :ÝÖ©ü ì0•±E“§Q¤†\œÈ1“³ÒUÞŸŠiÏäãPð,¥—º",K˜”G> Á ŽY-{±æŸîâèÜö•ÏïŒGhýƒ­I‚ne’°Žu2ñéZeŠjŸ®{¢È­6žU 6jê22O[+m_§£Íf¡¥}\ØÌ32p^@lä+›LE™’B‹ºß’4-~¯ÿÙ¾éà…Ú¤P¨J³äÓº|sé-Îg´â·nûþ\+æ4¹äo›ŠTùÅœ„Ó¦ªÚÒ‚„«—3ð›(dÂhù.Ó¤>~u]§÷”Úý(—ŽCšSO‰N½'ÍÔ¼“|M0p#FO¡Õ2Ôõë7ž³~Ÿ>cŠ”.£Ëyä%u— † ±æbÈëMÛ€j‘Ù›ÕÚºåæ/AšË&œñ²DëEEq]°?„®áÉ´iMËð(%/›yŸäqkž¡e§—mi8PÉg‡^(eæsßž”˜\7ef­¦5ˆÙDzVV_üm¥íùÓÎ`!®„ܪdT ‘ØÆ¸ié/eÁƒ_(`þj*ïHf?æÀ.í8§0u.¢cIÄK‹ÔÈãÓ¸œ5«âýŒ4‹9—Ö}"_·15 •ª›É|bL|c˜—®GÌšA±ª_Ö4’èò+ÕôÛàj&`®õ,iù\Ywž iÞ[Þb«XßàÄ8Œ8ç6(Ö E‘ì_K¤e¦5ÉÈ>ì~(å0N†Šë«’œ€R›½©ÈS´g[É}o·|1ïÿü•ø * I—Þê­ÚSf²R]×"éä¤bUô#þEgʵÇM—ïO&úÏÑMI¾ˆ*t> ˆeõ¸®Ž.¨ý{€!Ã5a_Â_AÍ…üÆ'âÄî\êÀ¥bîk‹6mÉ®G$£­Ñe ±í Äø'Jû#'‰'»-ù»çâ³–"ƒ0¡jmÉïJ6ÇÌJ–ù¸/uÀ÷|´_íÏ"\{ø^¾÷vŒê<öœ]O{ š6Ç®yp•XÈ®ë¥çgÔiIå›ÓãôƨòµUÀXïó`Ô‡‡œ æe­rzƒC–‰ŠAfÑëåå[¾]â_0qÕˆ Ã×û?ÔO8aiŒ³i·¨”Ílżç)eDÅ·óÂÖšàl¿åíú ƒ]þžŸXÂÁ ijÿ€¥!#·°ïìQ/_ïd2ú‡º–ãÊC»èfÅ¡—£ ,l¯·†öhëíܽš}%Dï_PE´úí•Bì/N›M"Ÿv|¶’i‰½o¼½iû’9¥cáí¼ÃG¦Šq IŽUužõ3͆cOÊR=Æù> 7¨|¾ë>¶è9hùÂ#[öqìÂSšÏtõÁ(D~­¯_‹Í.Ð*?Y›îyBT«¡¼½O“Ó¶vÉ^@–e;Ÿ¤À5ÛÃ_iÕWÑ"ÓM°ÙðòÐ)û:9ÕF·Jrß WÇ×µo¯é XÖE²,‡”]S%Éðƒ’ˆ?“½ù<È1±²[^–7^ÿ$@2ÇñÁ[ÉÎdhv—q(4º¨ ©dþ¹Ú¬5„»Á`Ò¹àPÑ€)#!i‹tjß¡m§ygU…ÀS>{gã œMý;Þí¼ížJ %sE}v÷ºíxžâ)]—5åíu‹Emˆ×¹3 sRI#±7Þj£g¡–)‘MZnö´Òÿœ£Ý5àËfkT/»ùŽå›Þ/ ™]XQÊPhŒ6†–ª)?ÓMs>¡MöðÌ>¼óégô±É+µ‘aU¥Ê!{Hyù=Ç‘ •¾ÄC"ˆÆ£,©P ‘WyG½ì»ÜâIïß½F —®•Å’•£ÆþôÚðúmÇ(sBä.ÙýçQM×HTûÁ4 R—:W­ÆíuÝT$‹£h­ëª/ÄÑ%ySº§œØÖyþ.þÛ—}  ¹JO´!¹AØGáy [%a\óç_¢k•5XGŠõ˜W °3žçbW,7“ ºL=x/Žfò´ïùtm\OçâÊûÚÐ É)}G’Bœ£“2ií:¦Éñµ’ÒÅ„š©QáN~Žî›éqœƒCn­¢¤:ÁV©cµ¬X× “åùÆÆ¼½í…̃ø¹‡Óî¹à= þVùtÄùñ[o¡š§{B!9­§Ï‡sÖà¤0š9M“-®– åHv¹‰3}ÌáuIÑ:Ð:é½IѨœû ?väåƒÕ–7ôo°|GlZÛÒv 8?DÝÍʉ'üDÆÖ|­:Í{8¯ÒD©éÙý¼¥Ú°áN&.Ùy𲆆¢“*ÔjowOãž²k£ZíëÐþ°˜ˆÞ°ö1ö:ƒ}ïúUŠðDÆc‰c˜¼RäºS†›“%ß‹°÷oÇpœ†`º¸=HÕ Î/f, ·omp³‡Â,Ÿ”œ„‹;$/›PÈWDBó{Ï»xwz˜D— 4ugªÙŒ»¾¡f‡¹”,=ØùXüøqÜjÈoØìš±ãy"«8ªÌU¸1;4sxÊ¢ïKk½l"°ÃUvëNâΡ0Œ¯‰eí¯B%ly˜öp+‡‰?iÞžØ×Ç’ò½<È¿TÙK;Ž;¦j{3Þ:#‡€A‰àÓÓÉF¼óÖ–UþÜÓ£…ÓÎ}wcÀXÀZoÏ3;éÙn¿ÀIòï[îdl&¨íëfÈŸgO_ÜL÷·¸È~µ<Ï$´a'þÈÆæúÔ"!ÄcÛyê•n6é\~3ô†ŽF/Þ"±u;ÜgÄç'w­vO¦s|LîÞ$¦W¾¿ÌP¤üºZ¢ž¤oNbÒu,'6ŒêaBOq Vb¢6-wqMM·ž@:þój¡Ïvýݽìi²N3m3ßû^!œ–1Á÷‘Îg,„·_ È1>YR釪½&µYg,ßBc=}8⥱³B­ý‘nŽèþýÛÙ÷¯}p¯jòžpÖ4Ÿ9y°5Óõ*𛀃`ãŽÆXEÕ-½äÈ\òʾú° ›vÄQ§M‹]°Ç$);œ!WŠØBž¿»V—ò‰nþ!ž€°ËKíFR_F¾ÖõåS'=¹/`«ž3`¦kÍOB’2š®Bp‰{Ó€ÊîOð­8ÿ 7øŸ„s‚8ÿúÆÅm æâã³æ²ý_€üHõoäýçáyÿ_€üŸèë_„üGšúwñáÿ—à òþ]¸AÞnëoÀ rñ!¾ñ{È;>n>ž¿„ÆãâåÿÄ'ç?7ÈÅ-øÇ²|‚¼ÿ|¡ ¯À þ¸„þUÈËËû‡4.Î? ñÿ¡].~î?Ê ×Óa¹þØ® ç!ÿúPÿzæü-l⡹þ´ \cüü2üò2<ÜR²RrÒrÒÒÜR|RRœr‚Üòâ?Ç_@ rññr üZðþÃw¼ÿÐÿ> ø|üTq¹Ã=Õ¯ ª ˆÕÕ=بqÝH9YÃ)P¾þ~ç „ÿ¹grýåÖü˵ ;P êê õHÁì 0; Ž©¤ÁN@W0^ q©…ºZÛ¹C`i¨­,È ¨‚;N€´+Ȩu‡¿_ê8#¾¹çЏqªÜÜì¼a;W¸ê¤àI '¢¬<\zWˆ•âv*Cíœ`P§Ÿ·:n`'¸6lá÷k ¬«7Ìäþq«ãæw›Y°¼Ri¸ëvºÈÂûÔ…ÀœÀ÷à×pÕªœ`ðþËB!N+ø=ØÖÏu·*@à±®é«[O„XîNVpÉ VP/€Ä ÔuG;ä\!÷ງ_äÁÖPW ’“µ»›“7@Þ ˆP W¼>0bõ¼Ýà{5;(ª ž Á@u0ÄÁ ÁCäv¼Â ‚×¥ ‚ÁkRp‡G‹ˆv¹ÛÀï vð*Á@ix¿@@}D¤WüÉo²)">^r®(ØÕ ®teÐ=wK ¢+Ô®eø¾®wW Ü]æÚ]æè ·€ XeO€*¿€Ô@®÷ @øh;Ôàã‚‚ÈÁQ©ä(·0@¡H)¸‚¬î}¿†°Ø1rê`¸ÕQkB¼ÀÔps±t@p²ÊBl`[ ¦»5ØìЄ›¢¸>ȶ²‚ p•r¨kçîò Žðw¸€@–M P®+;DY;ˆPÚñ)¸>5¡ðlºvPGxÓªPG;¨ƒ@n%@MWø¾Ü  µ„8e põ8@ÜaPw³PɆˆHv»Ùv—tÀðyíW0b‰¸b·tìÝàriƒmáMÃÍÒžEºû…"^ÐAXȨÈTøþ¡¸t<°š@« q¯ µqªBà׎@Ew[¸»€_ºÂç|OÖ‡ÜC|ZÇtäè;À§‘,ÄÉÝ»»àéÏ%)¸=8 á› .|²Ù9CÏC¼ ø ±O8@\ÁW½ð€x@`GèUª|îÂÜÜ]0­»ÃcŒÿÉŒ0Tïÿþ/'7÷ü'xdÉÇw…ÿ+Àõßõÿ¿ø¿ÿÅÿý/þï?‹ÿ++§£«­aˆÀÿÊ‚­Àˆo¢¹áûë¿„þáðÀ²?.AßAá:þÎòŸ„þýQù߀âýû º?ëø Ýɰ¿Š€ øî‡áAÑp,ÜÞÁŽPWï+#´r€Â~&ÿÀ5½²<ÀŸð£ŠßÀ«þ^¼ï®ß…ú=Œ+îJ~ú ´ê/H–ìÔ«Æ0¸E¹_a›š(]§ÜÕ€êÉ ´o”ŠØ š€]ÁÏ~¯é—¿‘•À!uÃÃwç+{ƒ]¡.yÚÁ£A ã•Ë»ÚÍXÂCDø3¨ëÕ$û› ·Û«I cJýÒ £;ÌíjR‚¬­Nð†+Þ˜Ûë/¨ð]ù¡°5û_á„OV·¿ÀáüÁø_Îÿþügã?5¸[G ³;òpÿÇÎxøxñ¿‚©qðÃÉÅ%ð_þ‡ÿÌÍ¿ò€ÿ£þ4š+o ßß_ùwˆ¥ÕÕ¢úÜ®†ø¦ 7QAF†‡› QT¾Š%€l6ÀßÐØ¾"ÁL4WMh¹#6Õvß wf?NDðÒWÎîv…Ö`øÞòJ¨¶?4ðí=Û²º^-ÖP¸w€z~^'%wU%i,±ßtÒ†'Ð2ÊhkèèhjËÉ+ÝeÁ±ÌRm­¬ª²š¬-¥þ½âß?‚7ð–4ÚjðG®ŽpUd4á—VÎ@6 #¯*¥ ó½ÜÕRy•`.wWW[J‡ ȦÁ dCœyÙ”Øff²É~Ï­£+¥«$o.×_Öô=åת`ˆ®#2°9x"‚nàW `‡‡C?÷ï€ŒŽ†ž¶ŒœÎUd¡¨('%+§­_màz„~FO¿-hH+#Ô ŒÂäs·„¯¶tìV¬tìPVZFD@ëŒðGÕLLL€–^†Ižþ½8‹–QJ› håꤕҚ!¾k˜ žÀ‚È~uelÀÕaøª±e{ÁcwÄû¶ïWWˆÝ®ÞˆÀ d `ÌìÆVv¦â™0\Pè÷5Üìuvƒß}oѼª,âî»–áÚ„~—ì{&D/~H/ üPþˆ!~¹„GåððåçíÕtûyãŠ8Xa·حءˆed ÊülÏ H+ ü¶à÷\šL¿«±kø] ¡­î àCŸàšƒ—ó…÷Ïæje qõçp¼÷ã ü¤õEk²JÚþ´¾pÛEäøÇ ü°ŠÿY!G¸]å9ñ J)©ÃÍZUÕÈæ„¯=?ú¯öÝ.üÿì1ÇÏá³²ƒïbîlž3×ï[F áÑúþ”þÇþ¾þí²¿Œö?_Ãùë50"œ8\‰ˆ˜–QMJ]SJ>ÇD~ЀÿV´WáÿWGFQ‡5Ô ·õ«˜üÊþ´Õ˜þ0e~̃Ÿãöw§$Âd¿×ø=ØÿY¯ÔÉ^Ô ø‚Þ ðN\þØeüt@ˆ ØHMËè W4Ü·[ÿq^0QÃ÷¥™Hý»nüœ4ˆŽ àSüw¥f®ÿ¡Ñ߈ÿxy8ÿ‚ÿ þ‡ó¿ñßäüq\"«¤¤æ‚¶|yqrÃpøÍWƒînˆ3öÛc¸ ŽKàÙÜ~Ç$cu@PZÀ÷Ð6®PG ,ñòˆøšô*QV¾!N*À®°¿8U‘¾šèc% Íï}mSvvvÄÑ¢aø-üîg%W‡.&Ô@)øv±Ã‡oË!i@¿Ð´\‘]ÁWyuà3óÎxŒ—è§@?°~mï*rùÞOW°â¶ü¦Ã¬&Wðo @g Äû=xÅW3Œ`v[v âc†`/‚ñò‚ÀÅÎÍÎÃÎÅ |ØàB»²ƒ\A¿på@~*ÿŠé.êU íöý`ÈÊäjx®$„y;YÙ¹B pWö˹|er¹z×ÖwmÂ5¬«‰8¶1a³B´rÁ`pm|?°û~"s•ÆЄÂ`KxPïˆ;øûùÍÕ#„‹¨²e¥4tXŠð_%u ãq!„ÿÙ†5¼ €æ•ê`pù`/7W|D,Ýmm¯Î-¯hŸ~SÀ!”Èp5’W—. âÉ•$['7+V ®o ñâÚ ¸[!ørÀG¸ XG>ÞPg0|´Üa`«ß4io’xu ¿;8#d–…Àœ¤IvW§ÊÎWFö‚üVX]„°ˆ]|óÊ&]Í«ä«s'¨“ØÊí÷6ö›:®†ï{*@æ×¼¿Vök)V "ôƒ¬ãaWÓ‰ü¡y |Ye„ýVÿnˆÚÞh] -\/ˆ·eˆ ~mñüÏuŒxr¥c©_G—(ÿÿ/¯#+ ÿƒ0©»òpÊ ÌŸ¨ yeJêòp»Ð‘UgªÈÁ3©jȰÕ¤”T¥Xˆ?ðÂjˆ_Yø¯<üWq¢uUH ^™Ú]V¸£ÑÔ…_ªë ~¥4¿ÿoþ= ÁЏºÔ„çÔ†?ÔÖeê(ÁkÑÑ€‹§£­Ï Ô½ O3P—¿ËÍÇú«ZôþÊÀéÉþýƒO%jm9M m]%u ´ž‚5@|U nÕ°ŸœO?\'Ü÷9|ß ÃÜ„ÿø8¥êÀnòòb‡9™ˆLÇÂaõsboîç!õ•Wøõ0rÁÇâ*‚_}LFCÓP[IAQ÷÷®ã·í@À&pÀ7g ¢‡ˆ÷ß;aP›ïo~œý#6Ù¿6¯¯™ð€ÈÕûêÅÂ¿èþ×Oü3¯þðúð¿>ú+¯Ž÷ÕÑ?ôÚð'¯þ'¯Œ¿¾2ú^ýó¯Š~Q,àðšè/_þÑWDþzðËë¡?;ô¾‚›–:hãîzź÷ëhÀ×4ˆãÕ¢öã¸ñ¡¥Ÿv r‡Wí wª¿H÷cRýÿÏ)ùŸ¼ÿ‡ïÂ…ðEÿ¨¿ÿó ðñpýÂÿÄ…¡¹x8þÿÿïázjøÉiµùúEN pLâ@n8ºPœ#å]Ï»ây?‡íù|ÅhÉ„wM ”]]/ðŽÅ•Ÿó2jUma¯ž¡%íMz,‹8Q6¼cþéØ vÐÿ.^t’Ý[øÄ§ëÌë5ì»Ë1“Q‘ ñIœ¤¼Ñ–°•-Y#Tß„MÔH/…öQ)Ð\p†H‡’: ¸ŽVÐHMGÙ+ÌEV¤Å­ãô´?¹ˆÊ ZÄí®¼Ù¸¨T̬`µwM'n¡ÍQ [}ÓÀŠ•Óìt ·>ëÜwÿ8©LEµ]Û9äý2þ™É6¤oïP÷šÝ`“O亩ɀßf¿tË’ÉèÞ¡¸ÍŽö+Üd—Ï‚eÖ{´™Ôo_VÜMYk_›wÅ¢šš(~Lú^{…èµ®’Ö–¼TuˆCy5ÓwŽM¯¶ݹ¯uqxEm]pùÒr2òÃÁ¥ssƒiئ:<²2¾Á"‘ |Äõ–"Ú@å'XØwTIEª‹·$Xô©ÔI%æ…FXR]岸biâ°J†­-œ@öÖen·u#÷‰º FòöÓ^¸J4yf3,•oEœ¾ÏI¾î›ÉE³ÙༀlAt½kèšýFYPqËë vÈéðÚX†;ÑkN×ùRM^6ô¬;òrÄ™ýîI¼->׈Ètï; 0‰g¹.`ä$ÝÞÙÒšz_5a}Óp‡¢î0oe0÷x™÷“_\FDë—Ná2¤Ò<ò‡-uyR ·s>úl|««È®Ñ}ØUúÁ%EÚ-žÜâŒéÐ*x”þÕÄ¨Ï Öœ&’ÀSƒuœu° ¥Q:ä7Ágãç´™œ~×wn¹ÃpK½¹¾b¿_o×…˜õ~šqÔÅÝVܲLûÔ®î‹DIdª\2ß%•ƒ¬U1ožûv÷PT·q¾Ë~Ô­ ÓÄJ™áÒyMÒæùˆNÕ‡”¯7ÀÆ_I³QжE'Ÿ¥X]kùÌ”šV{ŸØ ùÓFÊvE·OMÜmâÐßÍ‘·k¾µzŒ\›Ñod«ßdÅ\ujPÒ£”Mö5•¢ÒQ¸>‰I’#Ÿ¯ÐK ×c”ï“’çVô@1ùåýÎáÛóí/+6..þ|ÛŒbî"1ŸéÉéÙžXÓ•¾0b©Éнº7Ô>fÿ¢¼>=±‚^åäÞTk=ý~í|‘ôùVFdª¨Ö¨ÑHÁÂ…aٕלS±âlq†y"æMRCr»]„""Ř"ºÝ¬kØ·Ö]â¾=mÅ'©UpàEÝë|=Š~”Ç|¯d¹Ã*l›êø]µ}-×]zƸwÍœòR¥{m_?ä§â?è«\D¦ê FéŠøD7tˆ§§‰±7lÁÆóõ©ýM¢7ö|UÅ*„f6]4 £´¼Ñ\xéNcü™'L“H4hï`2œ4'Mf Ø™•%׳Å?JSŠ0Œ¿04RÍÔ´D¿*ÛŠ\~ý(ñ€‰™Ô/Mr‹ÖjÊ.,±8!ÓQ&#‰ü­ÂÙ—¢(&ù¬RÈãm 1¨ýyÁKè¦Ë^ Z*€ãÍ&7G‚ÃZãGÃé·Vì­7±×ÎX’ck=*Å›ø–ΡZ:÷}2bE&\ÓR?xÉ6` =Ó=²=MÆÅ^“›¼þBUƒ¡gM•Ô A¶V¥BWeÉ|qÏ uNï ùÖ>_^hÁína­ás¨+¹è¤-¹÷8¨úMlŠœø–·ÙÍ-úâÌò ›r…0›,^æ‚ÈÞúòeÝ}S‡tÀíëËùÇgVÏèGoÍö@ˆ–t•mÝC‹€‡„'_Þo¸¤q㇅ۺ´QhV²SVV.ŠRÌ‘ÔÃL%¿•1ó¢$ÆÙ¨~j‹51VʼevÑcšv{ÃWlˆÊ!n:êÄ1úÍCÌüÅ&`Ý÷ù»—Ì*ã/û¼‚l’mëÉôBLÂãiŠY<[9Æf]ŒZ²üE©j¼wGZB^>‘–¯ª°¡‰Ó^zT CŽôì%Ü`ñ à»Ô7çe?|ûéš|°àØÆá–xkDüW‹hš+ÛëKf Mîö ' ÉHŸ{tv]jy:x`ìþ)‹rm[k+g40Í}fÓ÷é«W¤â;Ÿ[¿¼zpëkãôñ¬À‰—‡?ÏÙŽôÓ W–ÞüÁnüéé˯nVŒ7ñNnÎîˆNUXo#£XwDoÈžZbt EQ™¿Óæ–:½óàÿ>—ËÔœŸmõ 2¶ RdîÓ$ðxßBÕН{Ä)ë(xwœçLÓð†sÛ˜/êò•?‰°½µzmܦè¡ò¯ät¹{Ó£>ŠzµjŒŠzN¿x‡š„!œB—¶éÍwƒj} úm…Ú WŸìÓç'±ÕËö3vÎ4§¦©-ÊCæÄó$RйýÊH{­VÓzœ‰åQÓ ¼˜K­º‘š»Yè}W:s}…ÉÚÃÜP±½Ö]Kæ¨æ)=9ûuô >IQŸoÍ Ýå!9Ô]ïÿÒ»•µà˜u°^þ*$1*¢¹H“¢äð³ºFé9pzí›ó.RÆ,®ô·M½\º™Ípze=w8` =']q\,š°B¢<1ù'L†^‹¼t fvT M¹ö47˜â:ßl£ÊE®Æ`2lC··…Æ»±"‘>¢h‰jì±² nÁ§mJ'¢¹.xì±(}DaR*yöÕ}9qôw_ëÒñ :˜˜Ù5ï–›ÜøVbÝ#dòo̪£ÄqòÛ&**ìׯp†ÅdÏØÓ DÂX’km÷ûÙíåo¨^ç쓾†j´@–nq D¯sË›ºÊ¼Ã¤\TÒeQ¦Ÿz1¨µ‡c)lä6ᓾ!l!/Ö9"õ)²–Ýåýë7V/Ú”+²Òù&ÖÆTÄíš>%j-f ‹dŽlôóÝ/G5«%œ©e›pytº·éSZæAX;íU‰«ï­¬d äÇ”ð %Kˆ¤žùTÛŸëͦòMîkj~­JèªN/Dz=jì’¶¿¡nÛ‡“ÉqP){ƒ/eÓpH72ަ{]›`¨¿m{Š•k¤ëõ¾<½ê·@ò9¥»K]²²;’¨·º?]|.)Ï“Š{|hº¥Æ«$_°rw½jqç@rN‹9Ë\íjKªþÆ‹‚Q$_$³LÒÂ+®¨€¹ëêq’AÝ–œIø9æ;‘Ãcíáã*ýì‹ju#C \%2o Š0Ý‚.v_ÔwzHxú½Œ(ôT7xû…=»DîN²Ôÿ«¬zÜ|ü\ÆÑðó‹ä‚ÿHp®?äºÊOðb‹Å¹P›4+(%ijjG8áiO>칎1/Ú*ãkm#ü [$ZºÔ¬×Rt θìlJ?…k:²Ãýþ¶-q„Ž™XRïޱê"_úƒEŽ˜QÁß)æoGÓÊp¯ßíe|«r2byñiˆº)›>P:8å¾§ ?Ñõ•49Fo´‚òÞ÷Ÿ7&ý;vKìÒ%Þ@ü9¿ð&¦…ÄÖ1ô±}ÁQÃÿlÝ´è½8[1Ï™ˆ-ZJ´¥ûšÇ©Â­JÔ‡|QË­_OñvqsÖÔl¢€Ò‘-›í5¥‚]_Sª±­dBU;ÆZ)C#›fÆ#ôv,0TæãüûX¯eÖœª!Ž'ù\6Cjù=Ï}GÍ+§`îçCn%Z[©¢Œ¾ÊCÚdôïÈkq—†UíÖ}Q°Æ)­5úÞȼÁCR>vûHÛ‚ŠÙ0…üݾAQ²f>¯·TÝŸ¤‹¤)†9Ä96&0pNÐ̧vCl:\+};"å›ì_ÂÏCa+!Z·>ë?rï„¡n>­Ì˨VƒY˜Q3j‹¬EÉeF¤¸æ:éÀЇ·÷Öi^Ĥ¶]G—T/…Ê>Ÿ&#!Öw@ Y‰/ÍF54"Ƈ|!S¾g…[ÐSh!¾P2ô¥ÐRúÖÇô±uÓOïÖ7L@Ô&§ôÙŸ¼5·6ž8Ý<Ò%¿÷Ðê0«EpíVÛNDt2ßþ°p³›j‹ŒˆIþÝÒ™n¤·ÈUè§qCÆmÌon’g|¤é›À¬Œœ›ÿfÜ.sè CÕ‹ë wï(ê ©Éæ~wþòYÏu†#9*>·í¦Š~\=¾7cµ•E„1×ë@Ü-•Êo¶kTFVÛ8W-×-kCó°qתß˧ù†½B' )Ñ\Æ[x}mìÚ²U†ó°×6 {y¬xšN›LMεkÚ¨ªeî¨êþ©ÙOгšfiná¹öÍ»•ƒ9#©êÉ’ŒÃM‘3›Ÿß7¼·ÿ<ô陹ÁVOÓ‰¸_£gÈN6#43‚ÙtÛa¨ñìѦíÎÖŒ­DûÕ ¨ñ )½ ½Â¼»´}­34Î é±|ÎðºÞ@LùF—8Š#Dê&ÍöqG¿äk‚ÒNšg¾ýš•dúêQk»©1êå‹+€ÍŽû¢])¨¤—αán£çŸ1—†TÔb­ÌcÒU¼­Òä?éÛN»!µìÞékQQvó¦EÑ g†ÝS_ÌÑ'L1ŠH7‡uïé€W;[±•?m좩Îg`x;ÍÍ 8wÎ ¨Tî›@GÏ7wÉð^¨Î(tË–â¡éù7?e†žãeúI wù1øoôÜ6_dOexN7,Ë¡³zû(<ƒç =¸×j¶Õ‹2’º5 !æ}(iWÊct­ùä N»®fzÀãíÌ©Z³çŸ°? Àˆ™£ÉmQa¶8o‡¡äÒ°všÒýLç«T­…àCÌt9é„0WS²_Wù†:Ƽ° å2RO¤Ú 9ÜlÚýœ7Ú ÁfyMÿ¢ù¶·ó„•¨Û3 aæåÛ80l”ûÍ3\Øët¡G~ýªM,˜ZG¹§©ÓÏÑs.‘ô½?àÿ‘Nè'.·çÿ¢Òß2ºýGú€¿R—þ*àwÞ ÿ1•êw¦º_U¹ÿFUþÿ‡U…þV¿…ù—8ZUt”¤þiŽV^ÎßfòþÂgúîÒ¿Í\Êù/SDþž•ô/I/K_ùôògêÛéoH/9¿³“þ†òò'¯éÏ¿ÿ]åï¸Lܼ‹®’›÷ßAWÉÅaã`úwxk¥d”Udÿƒ¼µßÓ¾çø-wí?Â\û“õç5‚èTàIéwþZÄÕŸ1Ø üÕßpØþd¯ýk,¶?ùkþý…$õ.ÛŸW‚¿òÖ¾S›þŸg´•Ò—ÓÖÕþ¿ÆhË ø[\¶?§ÔOÊß¿Åiû=õÏXmá¿€Ÿ9~Ëmûsð„~?ùþ ·¿öõã¸ýÁsûïc¹åæû›nƒïßÅr ÷ÿÑí_[A®(Øà ¸~Ìj¡?cYø[<·ð’eSðo3Ý þŽéÖò¢ ¼¿W| ?‰®Èÿœ>Ášð0rsýÅâÌõO1òòü–,WKWÇv¶‹Þ„$Ëüõƒ¨Ú&ÝwF :åäî6º&c̹Àèü , Håíñ½9©4ÒIRÒ9gÐub·ÚO¥î·ëiòNL;öü4×꼿BwifضÝÂexhõÈúê[´wœxVo/]xµ’_èQ­¨­ ÈFKÕoÿ™e}ï6ñºro:˜K"õèÚÁéà¤å¢dØ$Ë<4œh»)×ä}‚¶ÒuL&õMY=Ÿ1s@­¿þ.̱o¥ŠmFßáfýí˜þbÐÄsj¶/è¤jÇ(™ÑÞÏÛ¹+éD—Ì¢Ó⊋¿õ¸Ö˜U—ÏHÈ—î?ýZaš Ô¸ôê« g¤¨Tè½®ú!C.!bBÙ¾¯‰QÐcñÄoƒXÏÖ9‰ÿ£ è¦ê$ß$Ò×¾û‹Ry kxÈTíÏ Ùl·¦¼ŽöE; ª’Ýv^T ¥ø{ [Éu‘h€Ž6uš¤¦ü¿7VÓóžON¦nÈÇ¡Î$ÝA‹í ¨•O±æAËÑÉ™ÈÝ&wÂðU‘L-ÀÖf }ð…¡ê ‹H¼8±ñ#P!•É[Äåvºå‰GåeÛáIçç{¨æ¡g_Wo§ŠÚç:ÎÝÞ:XT‹¡‘mq|ÜÖž»ÛÕZ¹QЕ”Š!‰DДCqãñ«ôéÒ¢9RŒ¡Þ/"¨Ì¹×„¯gpH¿¨~_½Xºâ¡0mÆ5èºeÞ#Ù…ýÁÿ¬².`¾R]r‹=lhºÜOô‘æ¹ñ¿ I·o#ËAIø cj ÀÚ”8ŠM¡üLŠ(™ʯ¬4 g‚hK½$mcãVñÓî9OZxl•šYÅ15cPq^^¾—»ñî„è‚oYA9–n(ó½”…ò=#¤]ûJb•h½Þ"Y›Ü t+±„¯›Ì jžN\¿ÓðnͫԌcúF̓ðžþ81íô@|í!cfT-‰91>ñÈÕA»°¢4ú4ïÞ}({‚)YÃgÑ)d©SçàãîpæÀø‰ûÎ--`¼s;Æß<Æbù±—ë/ÈC 5º³Özãv[Y̧JвYCòÖ€ÝàÆÐÎÁÖ+²ö:ìŒ]=h‰=¨‹e×j,Rˆ¿i (9®TZRpÍq--ù:8•wôѿ՗L$…f;¶ƂѓÈ?8¶Þ¯+5N·`EÒoã-u­]Õ0ðNú6 (w¤•ã !;7Gmì m1‰<ØŸ/a2n_39³À³Åד=ô6xl$søÖúó$Ì:ÊN®)#êӱ¹¼ÇFÄ9͵è76oá>¤Xð|£û:½ðz:¡ªŸ»lûí #C0½EmòÇð·Íz…'¤€ýr#mï68ºæ#‚jJ¸R\^7­ØÈM+Æ\žq½GÞœFF'=ô~lcšU€çÕIPÊr˜×¤—Îgw`õ³É¢_=©¤ìÙq¦KgÎ-fë /ÏËÒQÊ4z^n#ÊR¡}Ž(>ñµ¤Ë1Ò–Z¦´>·æ q"asÎÆ6›fÚ¦Óž}X@ª£&žürm§õ&å6·`J¹vÆ0½NÞÝ‚iÔ9»/º 9Hc„ó¤ðãQФ˜†yÙÄfÿ>+¹N·…q;!eIÊW§_–´τ±¹VtDvûÿÇÞ_@DZœ‹Â¶˜™,fffff‹™™%‹YZL“ÅÌÌd133óoïì$;{'9¹9ùîýÏZgÖ²=SSÝÕSÝÕžª©zÞi—›†'½HèIJöq èÄî ¨Ô¦Ë'1©á+T‘©æ aø²¯™ÜÓLü²hs‚öb˜ß[ ¥Ù_U`îÃÇ„€(èc±j˜—¤]"ÆF…®uÕªÊãì/ðêÇìúÆÚòÒØ¾åƒ¢oÈžFl\ÛÚ<‹µÅ —Çv-zݨ(§ÅìˆB€„üQm¥GšNïó“Þ[ß{/.™ôÅ…»nSû·3|L¨êBµÎ¯¦Ca:º;ŽK˜Ä!ªý¦¿*ª  ;q¦[*3Ñ·8éÎê$¢m  *b%¸êp7bàùQo‘¦{ïÀ±¸&Ö…$R†M—Â[€øèÔ ¨Ž%šé’¤+½2@V(® ×/I´ µ¡š‰'Òh§TÄx° ²ß²Ô®è+–u8Æ#Õx¶ùnÜÍ´£'W"dè¥ÉµÖuU-”£ñèO/˜±nìò:/o~ܸô_s«Eƒž 'AëÀíX`ña)+©JÏñYDš½ƒ!’—ˆàŽh¹f P€³k«*¨¨½dº#¿Ù@¢Î~N-CMácÚ•âëÉt1žö©M5ÅQf6ƹœ´HˆLêÍlõÙVž¸o€8ÅS„$ÖßIÛ±@;KGΖÛà±)Sƒtèêö6[ÚSOe#É7P±wªøÚö>ÅÁ¾ÝO“›wÝø>8‹Qð@?‘ýÄî'}öD»-«°Þ'jj=ÆÛ› FÈ Ø¾R_˜ z@T F£ãLxØuö†­ZB»÷vù֫Ꭽ˜ûIPð •rYìV-¡B¬Çl"!˜Ç5X¢S¼{¦GÌsúk×ñzBx<€žeY…3Gze·Î©0<^›„ñððÕËZ\Î~C{¤Ð'O»O )VrlÐ v»aZ†¶š‘¬\åú}f…Sùú Áš@o“ bGkVæ©âò_h–étCé`¡Q‘‚7¾xT¢ìb{ ë¡ò¥÷<’‘äónؘ΀Øcñô[:ØÔð>Ün%ÈOå#} ”Òö_*½.][Ö¤~¾ˆšŸö L/Tk4XŸÌuðÐ1'ºØlOê•%ûÖÂR/tÇéçøv·Õòî5)üDh0öŽ%â»/(ª«G!Þ\3W&ÉõfœVØ4Egf†wr n·”á’~ì••:Á³G'‡l>CuÁ¹"~ @›àÙÚúrÀyé«ÔÛ’ þ.‰8”V·4„²Y^nù”{È=uËh‡_»M&·o¶ú ©“œrvk1gœÁ–m3wujËl¿È<…ˆµt‰:Ÿ#`ÍgU¼0 °±ìÍì}í%þ? IUº¸ŽÒ…€P.Â@3]Ioéë û²çÃâ~|¦cêaçà /2Á8Í[ÚG“v>Ûä•iÙÝ\“7ßæMc«ì9ôƒŸ'ú ÉœU\Åî§¶q‹JÒaÅÏá¬×;—{‚òþXTœbÑ®¼MÔòІ+¹Pþ t\ÓSÓJÓº‚^¼L}S if@û6li”‡—ÅC5ùºÎÒöH´Ÿ›… u܈ÂÕDaá§®á)ï¾Ò†©*kÖÁT»£Éår’Yñ„æeOÈ/ì 9§ŠØ4¨SÚköú–ç`3BñaŸÜ×<;>à¬Þûˆ;ñ™Ùâ»ãì5Óvb¤}äJ[} [#È7]Ý*¾o>*M ³ûhÏng òëauK\Tð04á cQº*q3~l£hZ(CgQr»î¹C7Z£FZ•éÃn Ó)gÞŸé‘(€Û€5yÏ6‰vì¦ڀØ=¿éÂ`᣷¸€Ê_­K9.½ê÷å9*™à<¾vÏ6&J: ¢¢›{³2QCµôp>v^Û8¯|¦Ö?!™Tà‘R±t-*ĵ­Û5÷ü%¿P})[y?ÍaR[®ÀV¢o`ñõ¢gò±†íp}Ño~£-mNQ¢—¨Ž6@Yno¼ÌøyðPW³{¶Lãâ0CKºÛzg泌 ì ê£x:Há ÷ N»‹Òöv‡YfãhÃHÃ1R§æ·fK+!Qî*öæE9}Öׇj5ª&²=Ü%¨5`òjŒ191%(Õˆ™z«µ«  ÷»§N¹ò¬y@×.|fä]×ï%6›uß(r#yüR}qL@Qtȃ“Ì)V ÒºÐ{ˆæ;È̦ã]Ž¿¶OâYa5\Æ^ꎸ£%ÊH8òMЛŸÁƒÈŒ…x­æË´æ~¿Rô£ùÚ2¾[æ8‹tA3|v7 ÇÙ–¬gX̧Ú2F°Ñ*`áäbX ¸ P ¾ãŽâ”-Ô`9=åæßðÅ¡ºÝp U6™&u°=Ì©Q{œ²0¢¨ÄÅÞÜ+ICÄ|mjzs„ŒËùÁÓ“pÏ× îò-MÇ1uíÀjéùÐ÷ìÀ’‘å“.}FöÆG¯ÇnSGv½.á#Ö†ó›©N‚Nº»°8F#wÌ a…f‹”éœ(Nϼ}îGÁ¥øZ ÚA–=óa’Åçˆj³+ ˾œîì’Ôý*EÒ“äµ&§Švk?7v¯=†°*œÅ•¨–•£8‡§g«UzÖ+ImùüôRkÒÖ]e-¦O½‘hÉ#2øx®2FÄÁ¯tÌðÏlD^þÅÎïßTûKtAzFŽûbegýs¿—é·áYÿ¦ãËÆþÛŽ/=ã?êø²²þÓŽ/+ÓßÄüK´A1:q: :©_cÊÑÉÓ)üyP…N•NãG'YßñG_ÕÜÑòMéLqœþÒq¶2vtü¥÷lãüÓnq47ý'é_ãþ…ðרƒÿ´?Íø»þ4ã¿ÓŸf¡g ÿM:QÝýgºƒ!ÖÓ>Gr2[§a®NSëxzNGA±Î*„Ÿ  0Ž€°;®•(ÀÿÛ`Ah­™ÎQ»š–倱 çҥ倹é“îÞ.×¾§í·šôs/_¯ý½ô½öû¶‰+OŸ‰ó&œnkœ®M;Ò“xâpã6b©¼Å÷Q'8&CœkVôìo¾£x‹p¤] k˜Jë·Ÿè :O6ö†@’{4|ù›8DRH⤲ÏÞ:³¡ÑiŸæùÎétîºFÅw+ÕLlFˆ«$˜ö7ñS Ì$sÙ)¼“‰…X™è9>˜ïUì¨0½šž¡ˆI1"½ßƒ~"àÕΪ%ä02.3×2Òšye¬7= ½Q=\#YÃEFh!£•¯vÕëö94 Ã÷}:{H œH—A¨ ]íµúà§.3Jx‡àæÞ«»…k€I[•õEÎK”šàS(l/ìüV’ÒÂîCiz ¨ª"/ˆÖÈêGÂN{Á{Cùª>-Hx Ÿ|X# gÈüÂ/ýaíÃ"Nw”:Ãø-ª÷ÆÉþ÷è4vZË•˜ž&¥•é‡ä¦û‹µMÔëñø™! Pã\M_ C‰ÌLU,%¼ &ˆ*‡ /™~Î$:÷wÙ ÒNî±M…ãKéï˜fG]Ûëb‰½&Ù£ôÜZ ²·¾œ+W Çjv½Íp;xöXt¯Uô£tc‹8®–úT4E¬ˆž^¾–›ÿ±UóR¯÷uq4HœŽÏ ÑÝF¬|vôeÞu‰(iTF\9"(SÚ^ûZ»vÜ_j‡–Ú8׌Ùxg'Â¤Ý |Áx=øS_%¢ž™øWº¹s1üÜ ðNž+¦‡gçžä ŠV»dÚ㸗Øüy Vª94øÄ€"²­ÔHö“¬¶ÌxÃÐÔ”¦ ¨EWæE ÷ ª@B‰a퉟3úƆŸÜBðÜó8¾Ú´‘Þ#³&Ñeì ì6%>£ÜmÚ¸M-©«-_uM(¥½µ8âUìGClxqÚ%3¿úqKшƒ-wUT|ÝüZSÒ²!^ñ4KaøòºÕÿPq›€L©ä¾hïÞä î ÉDyÇ ¯Š „%x= „ܽaÅ ž½\žû€~˜~äì™y ÜëÀž ‹ßVH\*ë›ö èÊÈ,¾_>öù ÒŽÖ˳º2ÖD2¨a€@ñ³eèWQ–¯¼”|t Î#²ÆÍæòºú5Êó\XêVéÖ0ü™ž@ÈqØ-5:ˆ§ºNoáYê`|»œÝ–Üо˜`=S0a;‚Nªý-ŠêYÖù¢»Är‰ç3Jò#+ØÇ¥g™ K$fpõ6 T]H}b›—9!Œ.”Ú*<FUóý­G;OhöY£Ý¦Þƒ¿fãÜîIö¯xfò‘­’ÊEKÁE¼ž\pò?RѼ ~‘z’ ¥ cé25oµÚAÃåá]ÔÑa€IΊË.–"ƒÁl¾6²S)¯rÌÜÿ$$ËÙYTïWв"×pã¬ü¥nQåÓÓ÷ÔVR~g¶:üÐsØèøG\$^Q®™!ä ´DÂa…¦#+Œ2RÌÐû®ú¬Î;¶Æ“ϳ>c&¬ß}]ãF¢$#θ-çõnzUw¢/¤û•>°…ñʦ¥×ݺ&W[‰iª¤ÎfYôŠfõ‰>ï81Jq±[óub®;nº^ðšÇq€QÊ\IÂ%KP1Iûi¶{ߟ¶éó CØ’Õ}¤@Íø‚ÖÎâ´á^@Zn¶¥ÂúEµdØUÄúh&U•ÿõò(‘oõžæÕÆZÆ(CÙ4âÚͱFô }GE²4ô §XÍ)Rúd¦óÖ‚v/ºH=êíK¿§¢ÕlÂIá^,á沋èÜíô‡qS^@; P¢Ê-·—ü3 [ý㎖JèM£êŸÄÝ̰«À‰Y×͉×tp«¹q¦®O;g,º¼ƒ Üç¢ïúN17çÍÎ×ÂËÛxþe’´ãªÆ@Y(2Ö1™þCåx5·‹„pN=sßv²§µFCJo )HØÓí*’eo´Eר«M“A”Ð`aȤƬ٩äŒvêa†X‹Ÿ€);¼Ò¿“É:8º«Ö½Á€2eƒÇ6ÇöPª5g*§4áÜ73‰®Ï<¬J[âã*ä–€y£¼pAIÉ¡j0ƒ!- ‚4‘BÊO-Þö>À<~ÝMÞß´ñ{ÙpºhèÉ`1¥…t‰õfŸ¶ÜEáÛ•ä°Aफ़ÿ¼€|ü•-Ò⦇ÖuœÓê^òÛT¥ÑNƒ«zž Gšzgûê:Ç/N8b7²œ•rjù ŒÙ´Ã´ƒKõn¾Pð{óÇRMðEÅÌQ¢ò6ôØE¢_¥È°Ã¥9•*¦èÙ×Ñ@yä;\™ài ½ŽžÆv­óy+¢Rä–Û–6¬ØeÅÚ']±ÞሚD÷÷ÐÐo‚:ÉÄ,ë!õA^éSC…X…Y‡eÓÍÌOª·¶ª!¯¨"d:…µ¬Ä@_’ÑÓ]¡Ùâ‰Î²?°Ê$Ç€#~?ëº8F;-äCWf&—õ÷™TYÐBZòô—ýLÉ܈€´KÃîáÙa¡³¸Ï/ÇzJ"«i"Ÿ\l9©¼ëÚÝ&–á˺-ÿ9¦Ö˜'¸GD³E"¶;|(Γ¥¾Åê-kxûÚÂûBÿVõTým=âŒ(-ÃŽJ²TŠn ?[µ÷X§\'ým4ÄeïÔ1½’·¶B?P~ÇP2º@TO}°r^oŒÖk£–¯-ø¼óð¸]l®7:±ÛE¼›ß)±â´¼ÁàHòÙE83ìíísñ)ÙÀƒc$·i'3g z‡*a¢xžÁ±7T€±sVl±T{µf&FoÒçùˆot†ß Ƨ¬ºÔM*ª¾ñç ³Ãtǽ#cceòõÀƒºÙ/à¬û’&i!ÙúŽ‹þñ£‚õWht  p£i§ød[Öd€€.ræEyѺ‚e’ªââªHôfÍR¬ 1¡×Ë<ºMîþùå9-)UIýÔñ¦!ióm ÚštNVF2(yª;¾€v_óN«‹YR}L@?ñ£Öý—ký™#˲üí×ûÙfýçèÝ x™¶ÏW¹×øi /-·Œuvˆ÷ø57Íí’«<á‹}šÛÃt fÄPV? ô·h}TªºDŒHôÀÕ:–¤”÷xõGüŒÉë00 >*u?%¨Ø –¿687G¤–9!¶„y~ݱ·%½=Œo”ú|@OTñ¢Þi0mÿ2¶'eMB†lÙMŒdi¢_ãOýòhrzkΡ¾ªì‚9ïqZÃå‹à}‡ åPÃLé¬WD°HÂêÁ¢×¼°HQn‚]7]Qc8?Qv˜Õ/×5M36¤¥—S6³žAi6`Öâ }íN«¬¦WÚk308è©éIº ˜ãHìÑWæ ö™Q—§hoI*J4þ‰g±dì±Âi%€+ºËØÇíæk< %‘ñìp åR]†HÃ7Ò]ÔZOqî®ÑvxOfó] fì1ŸV Ç’×>gÂ’@K3"½eG¬Ú-±/ùùP†”pެp3!\£zß’ L"Ër@R#à¡B'q0¢oûq¼B7™ÑÛ#à n!™‰+r Ý$ÎRBCV\^໩bÁ%ϰéžoz²Y©õLí, »IÉlK”ò;º¨&žÔ:!wöç‚óêT4er*² Ôb“u ™j)Új–N7—Œ)>I‡±B•eß…Ófp·‰çAÒåö?½­7³ómW\!¾|Y¦Gåu¹šSÝQ;hÿºá‚ô„ÁõZ·^{ï Ø^ýì9?E ØL³½JY6N»(eCzÛâÀØ!PA«&Ö´‡¶jVzôR¯Ä<¢‡G(žLfÆN3öÍeoz±•µr|?KPÕcÀ‡'ê|à+CûF/Ù£˜UîNõÁá ál4‰=Z1“Èx©<¯DZ‚Jik’쥧‹²bžpGdHüæ°iÏûíìZ» o¤ ¦Ù%à-š–ab>Œß±ß–ÞËãÞ#ßMQÌ×Z¨Çû¹è³¯,øÑð«Yõßú}<›òëõnKââ¦Wb[]Ë\Ǻ,뤛°Úå¤d4F±8¸%Ð@H7/Â&—±ƒúé9U¢¬†®¥G~ílV:_5oHYC)XäÈuÑñű2¥û{ÙÃ'g²Ä¥*D»Ïó*c&ûpÌú QGX“2 xe…¯{+lœ¬Šiø™!øE'ÂJi?„!8÷ÞÃ;¹ÜÜK5X ßÚº±RZh“}š4Äò%Aƒ7À’Œ|ùTŽTÊÅ€ì8;_O_ i8iz«ÉìÞw!+~Šº–ÀáPàG€ß°y|‡cʼnJ%Î[p4Ú,C’×­ªëîØ´6š]²Ã“2[n þ¥‰Û?¾ÆwcVØñÌw%~¤Ð«âÆeçD¥ÕIÒ"‡‹¼þ\߀ÎÁÅÎ8¥@ñµO9ÞÎ`j‘û*[ÓÝc‹÷)½Pˆð¬œû† ‚,Q1oö«M©+ªÔ"ßgڄƯ$Jýõm_œÖ>ç.åVoMRU2[ <ðÓˆrùËi™$pòI©^qøÎ51†5µtuPt_jG‡Š©X =†T,íƒKŒ¶wÃÄ' œ±ç¬T‹ÊT 7î¾GHÚ ×§&¢åõÈRxhÜ”ÈAãqfgí僆™H7ˆFCB–·lý 4¥Ù’A€xñs¶7Œ§bwR¯xV\nœá]ØxèÈݘ½ôëtŠ1„@öá¨2ì¿|}¢æ:ÈùR9UáT­dª„e ]ÑKΔ߬F¶‰Iœty†ªyí‚3‡J Ÿ;tÆ÷ˆGNÝyŒeIÙ"5 3Û9 5¾>48󈪹ï£Îù”|8꽟h1ò SnþmÛÌÓNL–ó#`Ø‚ýò˜*ªó ÌûGi‰mÙ xaó­Õ„ãWQ=ýÄÔÄž“|LìÖﲌ>03Væ©Vγ*wXZî4ÙÑó_Ïõ×m1zKNØWÕÏ£éרijfÕÔ8­ê¯8¹·_›™5‘GhǺìûjï§Öãóâ7(M´O£}ÑrîUNòß♕ âW²6Þ/æ âRUcdKWì[0ÝçÇ9`›´Ýìw =Լµq§žõ 辕öă±ÞŠu, ÕÅyÆ ¥2>ÇWì¼@ò㘪ûZ5áÛ±zO µ-‚Ûtb×å¨Ü쎫>_®®Ã BñÓ]è,] Á÷œ‡y éæÆ AÛ+‡ Ò+úy]’íg$ð8|¦f!H=Å$r¼äµ–†YÝü–p—È.ÔeP¶ŒÅ;›°'=6¹C6 Zl`íc¥Ø>¥¥}< ‘:ba©UŠ…š|$ÏLLblBjš¸§9âR¥`:æ9À^KªÓÊÔB‰*?%b.ãMC^š!T·–’š+ÎSG§˜v2hU§E¹„Ó½‡WÓÔ’ß:©…_0¢"þ=¥ïqƒž¤xÂŒgˌ݀¢b°z‡ Ê2üid¤U«fléig<@Õ:[ó4zNVÄY¾˜¾Œ¹y.ØÐˆúÕ¦"]ãÎsûtmXð›ì:€\ñ²‚ 8ÄCô$Ñt;#2}äÃ`¦@Ú_.Fèòîà¿ _íV¾Þ-ÍZÎÑ„¿ŸSExT#m)¢Óä¿FIÈJÉ…IŒ­eÅ"eÄ×™Q>侚¯Ex¡?ôî‹¿]£Âô¬-%¥Ö­’šîU”­.rØîï‰@æz_Çœrµóíñ—é­t¹½úu~ è²µñjÚF]µ|B¥"R­Ôx~zYøûàp݃f^Eò…¯º3IßadºÎp¹ Á ¼ºÏë[€j=´VÔiÿÜGÏou Ë Ç \ œV<{mþ§=­ß^ÀF‘µBÇ:S«RÔ¡î`’›ô' ´ªš¾píùõìœpX1éXZq¢¬¶ÒËÊ)É>G¥t¶2zßÞèϹ¨B¯_¨4&ºE5JÇï›r3õÐo_Žn¤Ö´šh˜¶LÈf½^¤è6àÚM´_–é§rÄ5ÕìIîe:emó]F‹å ¸Kí¹!×0Ü©ÞÁÞ±?óíO¤d1t:n|c'&ÇZ!5ðÆ;+Ôµ£'ýd±° DâsX|ÏîÎÎÉK±‘4,¬U<‡ ï¾[¾ •Åcú-÷\O7Óf‰v Ì\šˆ4²;ÄÊŸØB¿I¡¯S j‚‰7„w{ôè‘~-:C˜uR¤Î`ÇÈû’?ÓFÜ'-ÆbŒ‹QÁŒ"xàT¸HA·‚G¦Ûk«%z9šúþlo•,áiòÄ=;”ŠX-5–ÆÄžÿ¢^© :¹á+]tâ°ï/XJ,Ý 3¿ᢠà”~é¦xzR­ÓcXØÉÓc¦y0‡+öÒ²äFËï¤ߌÙÁ›c7øQuM ®/¡x‡!eqÈ5cNÅÂ:o“%Ši“ø«•¢Ï+Rwá•¥WXjrå~ÞÇõÐk¦˜7w~ý”úC¼®¥Z*sñ-.á|U}ÝA©x ùà\I€Q¬ÍP©„ÅH MœÝ^‹+¾¶¥œWÚ¾¨Ö¹ÚSNSÈå 2é-®WDFpHBf˜îtÜáƒX9ÜMBgboc?i{ü­|zÔÈZÂ`+3±&$“½Ž–„4A™z”bS’UoĦTÙ ší칊`墂0T‘M7,ïWÏ—Sì3ìø”§xmE‚Ž)ŽÒRÅåß®(ûTë`caïJ’›¢‹¾§ãæ¼ØBÔñ’“É‘eÇÔtœK®ž¢ß ÎT-öÚe6Z{Õ£0@L[c$\'Np›ÑÒe¬3ÈëzŸHrEZbC¹¢±h“ûŽ uªƒTÐMÒ»¿$)ñ˜æDP‘+»—=7ß’ÕÖfK—íï½f„Þµ¯á ­RD« Œ*°ÛRmeˆFÀö~a‡ç‰Ðß‘°¢–ׄ(aâÚwÏ=´6imSppÉ §%ÐT°*£â¨ô¹ç:þ8Ù&kˆ·ª#"æ¶yâ–èäè©­-^ûBRcÁZ‚þ­'~¤½ÅühÂvâîvVÑÔ­–ø Øg'o®+M0ûÆ÷–¤¡Bw¡ÂJ–u ôNL9m- cÑmŸj<º@û2íÄdº1P(Ê!:Ø|èÂ*W¶À¤œAµÔ݋펎ã vXn ;YS=2H"ˆWËÇ>¤iØz*ÑâEÙ~ ØUÊÐ6”¸FCùk8|â¯P»’‰á´U²†“±ç¹ŽjZ;»3<°ydnŠ–²ÁEàv†}cóßîÑ»g¡’É]C"(\£˜(.1ë±àg©Fj‰ˆ_ðÊQ‘æÃGP …¾“ ¹{ÈVSƒÆÄs‚=\ðjRŠ2£"é`„Eö(…œ»Ü«²²]ƒk`‡"aŠ%ßZºBE ÏàÀˆsÛW]¦`­hÑOF~NÀÏé0¥zïæŸËfÚò_*y¨)lÜÑUꥴ—Oá G¹ìk¬Y¨Êž$G¡ËsG2SUAQ`BW֒ɛކ‹Ë’`hÅõÆiÎfF™^— ÐÔSÎeðSüX½Ø²ÉÍÞoÞ¦baÁ[Ñ㵇†+*íDN#Ib RÀm;¼ãÖeµIÐÙê¬:‡DHÚ1¼-Dê/!ŸÚd¯Œ*‚ªÞ˜=§9§!¸^'&ýÝrÅ9$‡ì »»IZ*2»¬µ5¥@ždŸ!nÙðÆy#ÕoJ{Üý‚LöÖ¯ë [h2d»°ñÀ7l‹¹Qï¨ý3ÊÛâýÙ*G¸ ˜QKƒ¡7¤ C¥!Û¡ùƒå @“V‘­‹Œ®Py^…°å÷Ô¬šz˜/ƒ&¦:ë‡{ß…Z_A4›äÔ10ããÉ$œ°àD´q*qÛ†¯¿b–^?ñpñ[»›Â{C–çBÒŠÐL$KNC;bfÍ1 Ò:©{lDú\O¶Û˜vÞ=^áʹ' ™áq>W˜Û”:5ºÔªJךSS2jÈšTk’Œ$ï¡&9öÞ‚²Ê„eëh@RwÚPYÏL‘p‘²"[g+.ùìpÕ~ °ÛÉ@*—'Esì³ ËOĶ.PÔ¡yçõºcÐTÎ.õƒ¾J K¥ÀuQ¬©`âÅq×cÜ kX°ðN`o»MHÓDBÌoFúdä«!€â['Ž'÷ãÙi~AÂn:Ò0r‡ ?´ *sŽ{ˆem® aá>¾Ó¼ú<싾g[@ÏqjÁBkòÓâæ;ã%%¶ó›Ô±l×i™ôË`ÄgÌPá³.¶chØ%Ú8IÂWëz9É‚@6çôfÉmÚ1P[9¬µDÐÜå%êC¾¨u€’J(Ã)µCKêÓÀnÜsI„•[¥!ì¿î&׊ŠH‰S#+ÜùèW³3©äš± nK74ÍRS?a¶µÂ5Ò=°tº¸G"é³[$‡¦éè“Ì—&Dß3&Wl"¼Pz 6ÊÀ{>X)&ðJå݉Rë>«ÔÃ×Ü üá’O¼‘Ub-ØMü”úÅH méC'¸€ˆþ:¢ƒÃzǨáæ‘#ç=e Û‹Ei³íð[@igÁÜò ì}­J÷@¾‹© b‡ßµ‰6UZ/xD, ˜òͬé!Å® ‘¢… Ÿl‘.ÏÊBzï “ Y;…²:çæžquÔºT&cM´Øú|u¾û:1pšÙ/ÃØ“¾Ü‡ÁZ¡ø¡MÇ¡´w7¥ó½Ç« t|ŇÐ×Z¼ÈRÄÓÝ{öÙ˜­K§½ºÑ§O_Ot¢­õå¯ñËrRÓµ( gâââååæƒÀÝœµ? AöÍ‘!w›¾êé„Xärk>ã&ÈÂJDÏ / ”М9kÒÜÔÐüN;_{û}¥x¶u8ÒAÕZ©¤ô¸åC*ÜXaˆéS7ôv-¶Äù׉)íÂ{û·´Œ ÖÁò >ÿÉ-éêxTÌèõ|·øÃŸh† ¿- GĹDÞ ÇH.ƒœ¸ÒÀª¥;å¬ÇeÞÌ kªNª粬…¬Z1²MXŠ¡u¡ å“ÍK;:Œ¸ð ’>a©§×´š£‘¦ü¼õÍ“ ¹‰ß`i7Á~šæ°†¿be¯f¸bÏä›)íÖÞ^ÑNíÃŽú.°;×'&$jÌûÞû{^s,ŒÝÛZ5øF£i€UR!7&ò8dœi#Íá–Ì“°O'§cdš'0f*óRéÄŠ²¼gòkj`;ÛÈÓZÑDsšïs95mç(ëÆz6‡86¶HÊW[囘±h¾Nz7žë-‘½­± ömã¢úÛ“i«ÕÎ*°÷Qmë×nµ…1Éf“k0DZ§÷¼Ýé*Ù†SîõçÄ öçD¤Q´Á­:¡¨9«QÄôä´ à?é ˜^5Ñï;ø©oì~'ˆî7ÿD €z ƒ'ñÙ™²ñ<‡ÿò,;« ä>þâÙ²mÇ·züë9VÃzÚG¼›~«áÀqÍGA<újCDÐZ<Ö ,´ñöˆn Óì”|Šè1^‚Y¡ú5‘Ù î´WÀ0GEˆ¯òXðr‰ {ƒ ~VPSGj;Efö>#çI¼M<™¼d™,W¬©Ä)ÿÔ·`¬‰ Àu?sWQKé÷`RtiMÐõœ]ßXÕì…’ÜÏs¢÷Í ªgÍ„½ <Ôüjv<¼˜¢3Ua‘ô ±—óÕ¯$#îh}¿Ÿ^JçzA§…õ¿Þyô?³$±Ïh½û)Éçað+³ cRx3ÄraD;ƒEÅ%:{?\S× ¶ÊÆDF·OÅŒ©°2$r‰Rü`È1¾¯ÑÅÛ¿{D¤Š,¬pPãð£ï8óXˆ"Wfaã`Ù’ í ÉÆ§lakyìð&c¨¨¢¡O@‰‘d=Ê\xúâaœª²–LéÐ…ljk““s¤Š‚7å"üPPP_‘(xf[ì‹`…?óŠ&iºÉ÷ÊØÆð"eá…MÓ¿ÑæÀRÒÞ}–û|† ÂqPŒþöŒà¸+Eß ôbXÇ#×ñ%Óò›&‘¤ürZ+êƒßdðÍg¯Âjlm²MA×yƒÇïÂË{´€özÆ õŸx€¬ŸG±m‚#=3<Üa÷ô/ © ^mçÂ'Fåô{ìÓ5¸ð‡O+l¦tíÆªEž>êG ÓD窨UäÍN™ž¼öËá!þ|Bõ¡Øf ÜÐ Ë2MèÅ˾ç+àgF¤OI2Œf^éìªêà'ÚEô\·¢gnÐ,AzÍ=Ä1´¡ëâ{p¸à˜Š¥ÈÎ´Ê ÍÀ„ð!M.ípžš}´{| pùÊ5꼉OˆýÚG YæàUŠh3ÏFP·+cÁx—eA$ò÷À £„—³k<@bÑKgØ.pr.•(àKÒ¦O„ƒy‡Èti#I7F·ÕXŸƒŒp¸{G:¾LzAÀÏë^áå|ÇG#îÓ&ÔgJhÒ½aNÑ÷R–4úÇŸêùvá®ÌÇÚ8Ìßò¥Æ¢æ@.±B\ÈqŠ §×Ý<ÔY¸![UE¨FG¨m7½Ð^Á’â`Á­;­Â9·ï»•±³ê·i%‘ Ã2K°iˆÐ OŸ{(7³ê•âÄï¢6D#Ñ|~¨Ihƒ~D,yª×-hóúÄÈGñ—˜FŒ›‚”Ÿ2âRR–¾,.­}ŸœËœJè3{âóå+rõ Òt*ÌJ¸¥½X¸æòðØ@µ âÆ^GÆKΈï¼&—-CvJ“æÔ¡˜ Òµý˜aªQ\BOAs'OÝòxúùm~+ªÜ—öÍΠ*Àþˆ93×ÜHËLÒäD!Ëùr p²õL­C{.)UYwhѧœÊ›ú¸àïôÅä¹õQs¤®¾‚+Ù,¸J®u$kSèî+uhܦ/-t£ç¤ìÝÂa}ÿÙ&<¾óÌ À~ßÛÅSü¦s—lJèu±­£×È\0Ï\ùG 7…fÂWþf[‡•è9=MùV8Œµá‡KDî‡ÐEQÐjd›®Àq½tMi´0ý¤6x–PœæâV`ž0Âr˜»Xñ·ÊóŒÞ·OÌcp4§ø|½-¢ *qGnQ—&ưÇ”¥X`šlîK“+‰W²»T¼\Si=wÐm3ÙÝiŸSÖ.ʬšOê$|y®Þ“^ñØWÞï ðÜj;·kÐÔðØtÜAByÐ"ôƒÛð¯Ø/Ô¢oêF Ÿ+g§ÆÞ963¯Ä+¤¢„ÝŸüNz'# ãø%ÃÄ®éåJžÅpî>yQM êUåoj—бĸÏc“b8eLA×êšé? ž:«y0“c6èø¥?_ómOíFïeê7úÔLH£…4’kL3o®õš=à-µ› "æò#„Gqa „R|—æòüìwZ£‘Ü©A¯>;ë~èO è¨Pº mXÉÀãWÎ@Nj0õt‹ØÑ³M¿Iœ~Ë×÷ˆìhvB<ù%¿~érŒßl6óC1~¨ ÏRMªˆcc[—˜Q¹Fzo¡)lT¥|µ×.3oîÑÆÅ¥i"X–©TTøî0‘&-eï&éÁõlC¾ÿóJÖÚËC~çFºaUëWû¸ÉBÕ±ÃçªwìXxÚOkÎæaKüSAp Æ£¦â„–¢µ•Í{óI 8µNº…d¶‚ö 9€‘vÄo®Zš™Å„Ib:¤„<'$M— |Íëß}Ãù¦×Ý W@òr7kïV8Ü`Ë/D±Z&xî›Î »¿²ëJ6³Ýûµ…ΰ¹L»ãƞËœE!˜š\()N÷¶Ô¬•;)¡Ÿ38§A®ð÷ô¸¡ÒÀóèÙCIoµ©Àmäbà0Ä –jfo–H2ëæ;ù‡-L½~Älz霓qÿ ¤EWL8;ÈFÍdÂ~œGwÆœÅ3Âç^}÷áb&$3 ãªRŒÉÒüˆq²+Ç 6u­Ûì9Ø#¶py|~…óõXLm€Gâ  kœÿzª¬Nê3™CË5iï8¼ò]ÇH„¨nhD[’@÷ˆÝ'Ø«p¨PóŪ8v~ÈpS²VÅåÞJfM-ÀǃÚ°sÒâìOÔô­@ç)}eýqHy9½·,ž.1S ŠŒI ê&|úï ÍÔËWü)†ñ÷8ÌŸ‰”¿ó«ËHÿ… cbfýË?7Ÿ›þÏÈ”Ʀæ6Ná_}y áÿ“¢þÓçØÈð/lçì`õKë02¤3¶2þ%Ð߃føqÄF†œ Àò£}ÚÙY™þ"Ëÿ¼:\?Þt2w²2æýåÀ¬œþôÄÊügœVú6¦Þmû¸Ý»oLºÁÀ­±ÅÜGlø¸€¾Äm€Yã߯Ù eH8ÃHlnfÀº_ Þ:´?]Í{557iY…®Œn°.Ï™¿²Kµ{|’ "öl…½¯²Õi²¬)±Ú0Ôt1ç½Þ¦‡3Ô{“àuãÍû´]ÎEÜG#î'>Šßå©áVÝX¯ÆØO¤Kb94Ðäí£@Œû( º¥•ÔÜ:•nÝ”›¸À&ã¼# m)ð9Ox[qUKIÈyn_¶8ÿ1ÇáÊ]ØyâãíýÖÙÌ‘ ËÅÁý¢Ì+žØVaÙÊîêZgKm¦}P·›´´P ßýð÷òdíò!¸6K}WiËÆê4cióéˆÐËìÐÚ¼BÅîÙA¹HÔð3;S™vìÞhBHžf% TŠýK)a"M¡}£ÀYÞ|z¯Í­ q³4}¤ãòÜMÀ¡pbZÓá—RßS 9€B?5…~ì­óLfaÿRŸ’Sp+‹-žc~\ÆÍ¯y–ùÈdžÉw'E’Q ÁÂññ5­¾d /KktÿnØÏ0µðŠç6„Ü …{ª´ªM°‡pg<Âl4Å®¿Câ”Ô ¬â´þ ˜zB'Í\ˆã Ë®Üs9•ô¢bcSÈ@I€Ò’z]ÄDCƒmvYzm§G©‡9&mC9…, ”ÕV‘ÌòlþâŒ;Ll1'xáåõIHMb±Zk_J¨r 5mOÉû™¼‘+´æø[ å2gX“Yñ’n’\@t¯›ÍÍé]ö <ôê;,,GÉãZ¿°N°á•äÓ•¯PìjžQ} ÜÙÒ%n tÖÂOŠƒâŠÅ=U±éý% ŸÒ§]\ÓµÑdŒòµK>ÓËH~QÝÅ™ªÿð:/ª[ïÿVedƒFÁÛ?GRxÁx/“„WÍ57Z±°Òò wÊ ¦Ðç6Ò÷«gÍH8sÖ·;c Åòñ§'vÄ»}ÒªV#n$ê4LoczéÂTê3“i‰½RÓ×g#úì'Çí­÷êns5Ô‹ú1XÊ^Áå¡@ŸÝÓ #=ßÌv,aâÄR«Õ«¾e}cºøGoMÒKÉãQö4xZð;A¾IàÌÐÍïÒÍ@ÄHPo=±OŒóqËd×½ÏÈ|ïÀ ô·Ÿþ¡ÞÏÁÂñ?Ešþ×ç¿Î ÿÀ™þÿç¿Ç-k¨HJ ˆüûÜ2Ëo4Wö¿á–ÿû€òÿÉûå#¿þEWý-¤ükîÃý»Œ±¸„„¦Ò‚1þkýý Œñ¿ƒÓÿ aLÿ+Züç:¡ÿ]Lÿ¸˜þŸ²ÅôƒÓü,¦ÿ \üç3òw¨âÿQ,/«¨!#ÿ(¦ÿ@ñ±â?R¾¿5¡ÿÿé$ýž(¦ÿ5þ=OLÿoãÄf‡ÿOüŸÁ‰ÿûïÿ&þäÿÛ,Ç&þïpÄÿèûçåA ìÌL?Nã_(b&†=›¿.bý[˜õ·ñ?\!ÄÆô¯kÄÆ]âóMú¹ZÇå·+oþÒàï‡jø×WÞ0г²üÖV´–Ö2FiOžv SO,ˆ>9Ä!R“Ò¦··JAÆ¥‡B‚Y¦¶¤ÈϪÍ?ÍOž¦3ÛÌO˜Ž °é·Ðÿôá#6QY¾²¶6ηÞȱó› ƒµÒû–þ‡žv÷q±Ì}pE%‘¬Š8 ’æ×›A'ß×;G”Y%OÅst>U¿~Á„‰ýìñ6ñ(½ð€Sæ†ç¦Ÿ}àïñ*P<9ü5Ê£«âh8Uíúêî%¥õÎ#';ó¡á;ñÔÐWÊ.ª¡^…"É0I=R¥¹†D‹|qr¥B79yŠÏõäš]|^oë~Š–Î`aÔøß¡„C• Yõ¿¢è-ÇÅÅ*÷Ƽ«fcSìR0Eâôû,Œ¬ÜYnÑ'¶'@"gÚ68îQàJïCÁk•—Ôp=¿€ ?ÊoExä ¦M§£''%M=ën­ûÙÈÕÍnPÒ_š³5ƒqù!²ûµ”oq0Ô6Õ ò?èΘÍJF+DƒQ»ƒkjƒä“Eï¦åúvɰExÝT5(§wïT†XBÿ)Úº+ŒÌ‹²‰Ìrú¼ŒßÈÊvëuÀR¯WÍæz¾=Ýd® |Àõrv…Šá° ¸:½™ÈM¨NÝéãÀ®ÒÈ}¿¯vk„žfR0FÚ–?}"º(áùcÚÅǃ«îþò7ˆ›^µ¬±õ£s`j<¬”/ôA³,Å6ý"R4¤YH²ûO)ªÔ[$—ÜËÍ*à¿dG}c?•ôÂ÷ÎHY±…DF,ùøeÜëjì¥ßEVæl«~RdT?ÉwaÞ+¨Âެ_}t5ç$¤4, ³G{жÉœádÛÌȃ–î"D#W¡1^¢ÇZ=¥vvð).þm5†¢e'Y,õþ¸ê&S!…¼¾3Ô#dŽÁ:£¹(bÁL^ÂÇ0™]Gp0?üQ@ëXŸ9”lW`P©ãz€f†êùChŸŽ®wTF5B(Cä1ôéé飚è/Bh•È ~4XËmŽÚÖ÷ÒÀÁ3:§Níâ+òN£2$<©Ê QlQÚnp­´ åÍc»h(’Óâ ‹¬¾4sœpà>€Ä¸ëû€|HÛ@´UåP•ÚŸqbÈèðÕp{?ÛÛ­T}¬C³#óU_oü6ˆPlËÈ2˜Ø(Li¾ºü©j³ñë–8Ò§~ÜÏ%Ô>ÍW6-Š@< ÷#œX‡o'öMFO»nÇÀ;ÆÚ„ƒ§dÛq×cæÈ*p… Ñ·¦AYCšW4…¹Ñ2ýŒNÜuÍÍ´b5ãï#¨¦°ø}¢:¡ÇÌìØ¼,Yyvh™›ÓšªË-ÒE†UaˆGòsbèYKÒø§§·¤=û°FFƒz„ëgÃÿ ïï3ûË}—•å÷Þ/7^ÖÍÃû±ùÆÃûÓBÍŸÞŸiþy‰æßxÒâ«ÞýjÞý^¼û·¼»¿¹Ûÿ¾¯Áöoéñ,ô¿½Û;«B++ͧò2ïÀk©4ïV©½U¹Õ,/j@ §óB'æâA"àÿ‡@À‡‹Ôý‰H‘p º—òè¶¼­ÜÅk42OgíÎÅfÿ ¿9¥ÎÜÓÔ¤\£Fvn˜Ã4ëõáíü¹ã}_Þf†.d»J,Ž"‰N—nDÜ…gÜp}ÿàÌ|#ø;§©¼»ÃçÂe»N˜ øttFSþ.”äÈGJÃêR±¸Ô$쇩5Ï×è´Ú7|¶>N‹dþa ï0¨#$ÅÓî;¤zé„#Ã(RŽDÄ)aîW:Õ£ æ©Ùí,7Xí«‰é®ßáäQXè„)#Ö°’ˆ&`'–²bki8[½Å–h‡Îx<™æ|î¦^@ñ@ÇsŠ¿»X€×¥Båî)^­~dz cÉzŠÓäQ<.–?2¤ŒÔô ÉORH+Úýnr„lZ·$êÍFîjÁ¹+0–=§€3õd·ô]ò6¹“ÁÎ'£Þw‰å |¥gå|Õ¥¶é5½ß³7k 2¯Í Ò;‘Áä[çÔÇÔcéFž/Æ.†>j qŸ+Ó÷òê ÉãuÚÊó¨áû38•éS žyjG ¦ú0ëÓл£±Äg ½°ƒ“Y%]à#A™ºÕ¹!ŸØ>W¯µ/áW±‚:Š©ÅD<£?÷èx(†€Ðåìiw_›ÐP¿’»"œ $ŸÖA+–~ &Cxe>ê>:½\äR „¿¼Ó^*.§a ¦w œ#KHêµrÀâÊ0QlÈ6„©TVÒÓ3µl`«'2Éf±¬„Hž|B¹Íqš7·­Wœ©8ؽDð‚Ц¯’z9ë&à†oBÙx>2}Œðíoÿ T°á°¬Û D§,zºTÌ.FZÎÅí¢ÂŒŠÇþ‘Ãõƒ—?@áÈ#ÛM¾xxB ð•ðhWÚË…“|KÉ)*lQWG[¾Ë r ¬ ×›®,e Ô?ûÛ8<øT3‚Ì%¾¶ºîâaKßíSLàÌ7\Z6Wœ |úçø×„ÂÅ÷“}í@„³@„=h£ŸüX Æa#3¦pŒØh‰‰ÒóÜ,ŒÐŽ;°‚,, qLDÎ>\p0A .£kèÉpÔ"biwç–SØg„¢KîV€-õ/¦BÜ«œPßå”À’áÆ;zŠ‚'ëï78ñ7]³ÕC{7¢P?xéŽãÓÙR1Ÿ˜’¢2‡¨žL1eÛBs.aŸeJ­³œ„[¬ù©æÄ$f à.tÐÙBl}—!B“’§{^ê„ ÓŒÙ0ÙÝì.7Q”<þ "¢o™Þ&/ÀM‘U%A(ßWàãn†kPÆÌ)"/Ý!@Öõe©»LJÐEJ6Ãú#¿<ëlT×Ò‹ná$ÜTüüÃÚ \î7ÕqÇ\Zvcôz4–\K«¼f±§c‹º Øîú“¤8Ù^|>÷l__åTn¯¬†µ$©,r[eì¸âdeí~80a±7Jð–Ú¬™g"—Î t;=€šë&¬Äœ¸¡YÌ[wRƒ$Ûµv‹k»“ÈÜåé3œ„.bÓ½^ëß+÷vzèÊ“ù†´1çÁH 'gÔ6SžÐÇyËíw5îêêµUd¥Èb ¯njÉ¢úÈK(° c—‘lÜtÍÐìð:_h«>‘|ã éØžÙi¤ñürÂà³Æçt¼¶6 $è ¨]4.ö¦‘:Gˆ˜î.á)Wû¹•×7Ø&Ð Jª_³e#bIH橆*vß* ›´?:kä0 u®»„l@¶wJe¿,)­â3™Ã“Gõ’HÊ[© ³EØ(2®ªã7 ßhîÉ nMtoqܽ¸;G¤èì)Õ,.[dï‚s‚e¦âEŠl9ˆ`oÑyއL¨QXBÜÏ7NA¢á_vºë¹{´ áóYH‚…ÁˆžâkÖc84ÇumrÄ4O ŽY"mçÜ`«|ÕT§AàFê çÒhžª(Ø÷­“|â|’ĸë]‰=¸ ýB&kæK »¡îž~’dbdš³QÈ9/ÉX\Á6;ÉDË“ ›PÆá‡½›jÄN-7}'/‹±QËý¾ÌÈ>úð骇ddLÎ"’~–#ÕÓcõ!¡$í¤¥-ˆ`§:b B¹FE"T£ésôÉr½ŽAª¦~º„– a°·vÿ죹ùðF’ÛÒ!3 øÍpôaÏà<`Dð\OH‡ÁÛDKñ~žÃ¥«ù)Îc•'6¿ôŒ­aÅÙtŠÝ‚Q¬:ŒÛ*öúqîþ[ ˜o@Ï•÷÷ý,ïÛ!Xêކݭ]™ ýQ#ŒòùÝDµ\ªhÆ»¤ìžé‡5D>ÏRR*¹/¥âóÁ„{ÖÎñ×ø4‚…: EšS`”…Ÿ}µ‘SJVPIñZ‰’ñh’?ãéW_½#F~+jX|S‹‘?9B„š¡Z¿ƒ¨ØËøN Dƒ3gG–{ò è+k2ó¦ÙÁ}ËôÜâÂêâŒ1‡¿,ÒGèûF„uÂæ 3Uk;À™r:ŠÌé[%®W-ÞÎLÚÔ„ñRî…‰,í ^d‚šâE3ÖùåøækzB³RÉôLºa^·l«ŒL /|aTê«&°ˆ œäÉs¿”NV´ºl`gWBç¤9´wÕT¤º|{#!–Óg˜™À50bÂöw¿ë¯yë‡ 0ÄÝ´¨n÷”弦ëüˆ7:"8rÔa ´c´3h±gü†£d—å$¬=é/¼wz¯>¦» ¬]"lL¸¥ªMsÄß/¾4:srN|…2øЀ‰I{¾9ï4û]SžÆ¢¨Ö\ç;'"°£¯Ð9w¨gc\`ÀY%îpMÓÛvO›XHb±XœDÄ÷ú û: ^ í €Š’¹ïÇo£ßd˜ÝTÓcê>º„T†˜­í8¶Ã‰]{< ÙññAé’šT‡Í•Ï €·´nÚÒ.%˜²ûäÛ e,¼h©ÝÉ4Ñà1>pGíŸ-†®î÷éúr”¶›Ûxk<)Ë®SZÊ#o]bÑÔöiGñ‘4éÚáóð7XädÀOI½ c·ÛÔGη;¨¸Ù3Ý€—›…êwô!6Õ ™RЕ¦ Ë'à–¹Ü[3xᛌ×Eõè²Àk¢`Ôýf9è®Ù™pØJäa>]™yÓÝÅ­¸EÆ[í0” L6õΈ¢7,ë­…è$ ɹ‚½į́ˆéñV¶ dÍ[z-åf›¨¢¢z’5¦Ë[1ÂÌt"nhż£Kšɦçâ¤ê Ée3#OÖQŸ)¹J˜˜S—-hNègR 'ÆgL( ¬ÍKj¿V~¢Ï­8š›Ë,€3ĵÐJ]¡¦x|)Û/·2D.á7ظ—ÏËš2bN-9Ž•“+̯YѰ-aõðÀän£8ꎜü÷1¤0òþ§àkl¿rHì¬LÿY‰ñ¿âþŠ!Iþ…Cú+…¤ÿ;`þ—Ò~*H¶Î¿Fh³øw ¤_zÞænÿ.}ÄðûŸòØÿ-€žõozouHe%µ†v‡sgAÐ<‰:È:•eÍ‹Ä9ÎïU¨ŸLŒM ˜Gý‰cÓ¥‰ ³ÝÜ‘Òü KëÆÕó]¾Ú¾¿Õ5µö{°-4¬y¿“hhHœÙÝ­í/¯ßŸÒ+V¢ `¸æWÔÔ¾ ÷»©Åh?~V´ ÐdòHlB¾ðÅ_ß3aì-Ö‰X8ûhh’gÀ>Ë `ÀŒ´F4_ža‚ªŽCBrl]ƒ‚p·|¼r}ÛO®+/»§y8'ÒåÚªŽGzЕ:„w·/>Ä4·ÁYÿZ»°bU9Ô׿5ÓÖæÕ ´…ä dXývŽÓÃj³]hz²RGåé*{6àžµ3aà wε…ÝÀÇKÈ@@AÿÈ/)oa·”vjÛVÃhq›Zw^¡õž9/j £y:ðBïkYÝ›¤þ­Š€Ãº+É0gAL£WË?Èë·äÑÝG|Ãsƒ¬ÇßÚ…“ZX#ç=zª_ò c™¡i~3áØÊᣠÀ›Ü~Ä_,õ¼v›vš[Èß=P ;[ô n¯`‹IöQu‚ö’x3<8²¦õ¦K›A±Nx6Žñ4¤¿?’k̯Ê~ÂhW!£šÑ%ÛÄêVŠ]Ñ(=Ѓ0åPÚDb7Ýwµ5ÆÝâ!P~Ên>$Vw6ùjÔ¢aËöYÜïcS·œˆG¦U±ªêHÐxNKa}¶¹ö„<3‰×ñ]`öü“‚ž+ƒ¯ÀflWY:|‹ø'¾h½¶‹ÅüŠóΉ Ï·žÎë–þHÙJ…r|Íp'­!H>ÁçÏÒõ*2Ý?¾‘–ÖN¿9+LKœõd·ßèÈĬ^¼uÉ·wXáÀ”Ys»BM›5®€—¯FêéÒgm„”9qoÕ Rß4'vê±™9g‡T÷3»¤¬¦•máhßµ × å&ÒCÏ×aDÉøB²³ÈJìjVãÑùW¶È0C^p9û´P1޹y2Pd7C¸>$ˆŠ’m¿aÌ0ãSâþ  lÖz?,P,ÕÔßV ·¶à"8ÆK‹Þçˆ7xhZîqçC°ð¶³ùô]Ž?¹¡ûãl"põeø!p¤B±×3ïOH1.%ÖI²õ06Y:ØŠžùP¼ñàÒ,Ç[Žp=·€Ð§5|Á VÙì<6>!¦.1îêþ0ˆ=+%^SïØ~ò¦½Îom!í¬£ýˆt@Eä‰E0H×f¸jçK5`‘çÇåÍJ"7¢!ÜG±J2J'5ƒûœ ˆòúí=ƼÌñA¦ï`Ã,u´EEXØáÐøºØMΜû¶dðúó3T}·ÙŸgæ—ØªHÜeÊ¡™ât&tE±{)*³R¶õ/äЪQ6àg“>¼¢!µ‰}=™x€°V³?xVš©éRZéRRöý½Q›Í•¤—¢q.5·%BßEƒ®¶‹.~í šÿ9Z(IË|êØ 3ܧÔþ”om¿Å':@©“ `üðà”@%§Ã€ªÃŒxU¿t‹š¥&ÊÞ5r¤øãœ¢ø–1V@êq!M]• e31 g”€Oøø&¶f.]ÆQ—g:UÝ®I8”# ™îŠ[¸§‰¶5 ;»wµe¤D˜\Íw·F]ó)¸ø M*⊤*~Œ0#q5)â«Èe ,‚˜¯µ÷×äš”„Á,¨H: aÒ½ñ9®Í”ØØMÀÀ6Øy{µ53.Ÿ˜Âú.)dÁˆuœPÏÊ“•ÍÎâ~1è| J'Í/ë– Zêw°IÍŶ¾²r`*“fPl…]Ö#…Aø æ‘«¶† /Je«¨((–áØšœÑÇ¡P’6³˜ôMbÛ‘«€åç„úPÂZxW)äwZ¹:u¹_ж<š7õm¦|M{Š€»@ÆeX7ÉÑ|K 6Áæ°ÿš°k,©œäA¢6EX2 b$j#+*­·Ñ[±ìèŽ"[¨_ç£"ÙüñŠq#Í©Ó WG£D@Õxˆi>›úì ÀGv¿ ë̦hXXÅ–CÓ 5=´$´jÄ]Ú·ÜFi%°aöì%“CúiÓSDä:¬ˆ\RZá÷É…š_ó;A¨ww£˜9('bW ÕÒ`¤ç†uƒ:¾ÅÜbKËz@z¤½¢ ‹’»d ‘]ŒUÐæzñ™B’0ÖaÄr ‡ àÁvj8×4Ò605ÃÇRÕ=ï(ïÎϪpYFjÆÏΨס}$Å^¶ðc¹ hlÿBÁMN£“rz„ÕÁ<)åõ :6‡gÅ9×Z€+áj>2›EFW¹6Òˆ‹Ìåæ'-h€¿ˆ <»úÈ–>'ÖŽRëŠ ³À‰ç°QLÐÁèŒ0sBfg¢b(eœ½ÍoÙ'Q JÌO:2&©Rj:ý’ëPßX?YÁ¥™˜˜ Ã~’OÃÙlÒ§š ª,©ÿ¸ö‘ǽ°2aˆ‡A{‹àÁ!~UÛ¢²h/ªûGõ$+ä«“€£GijÄ{Ì‹Ž5ö?ÀìùŽRõóß2lEæ(Âu Ê'Ev òJéÃØæÆ‰ãJ½AUëuR\8³›ŽÄŒx½"÷\5u)ysM°ÎRÌ®ÔO]ýÈöѳMèƒ%V#­ÎAÎÛ®9Ž‹Åözœ;¸=’ÏNR¾6NF˜zßžWMû`ö)q1³ ï€¯™SPăáwT,×à Q q6Iãœ"õRJ…«5ѱP¿ü’ð-(ôÜhŽQ`fî*¤Üœ‡¢•ìÓÕ#LNšñ¹eŒx¡þäj_(LJ‘ÅÍH)¾ÕujDdÔ"”´Ãjäp£å˜È#¹ÃõL+/ï´'h{Ëîû$”ôÁv,ÇD§JÌ‹z>ZÇÉ[nŠªö&™½é"ä¦=¢C7'Z§–·~B÷.0·:æVÆêîìúÔø5  “Ë-¬±a^hëqU áx?7ä7ɺ¶íªèhúô˜ô±2þ©4~JvdÇ$”iÓ7ÚÖ(‡¿6­aÕºtôBÔ«ëŠæÔ¸{ããè[·¯ÇÒÄ~lÆÈá9\ !Ð Šýn-5fà ×ÝÈ$d"èO]„îÔ9,Näj)"3¯=FÅ©×~^æîh ]_HÁˆÍ[÷-‚k¹uK,+ª¨SvÃój79\Êê™Jô;äÄEH阪Éž3®0V;Y´P¯pik¬\ÖÀš`Wˆ6ad¥ëDÜÊñH¦bÈ4d"ÇK,”eŽ ãÅb\5¡¹ˆj‡©†&.»”]™‡¶|I’ çpo¢ä(mbu÷}»‹5Bã õð9×z×°q=žb„­À;Y7á/St‰å]†¢ô¿vË˯ù*™®“=?µäÖ:4(`â\þ5Jx8LMýtXa–‚Ÿ—‹Væbݤ©Ö ¯¬ŽÓCîJúBl.¿ :gL_“¤r .Þÿ0,ä®Ïç.ý9Îa?Ëp3 yZN5VÅzÎG¢b+fÁq͇añÞ~ó§»gŒ ÎŽI»ÅtS{ œ”k¶& %£t” @¢S© ¾iKYm~p¬"ü.?2…ÇŸY!·0$´h"–ÃÍ/“• ÞS™›ì=Õçv $i~ÍÓ^Žj:H·Ý§®>œy»/€ßéWKUÃQakØÕœ“ ú°š[-¸*F‡k˜cP.êå_¶²‹Ñ í¡ZÑØuû r›0kTsÓÝD4EÕ}e€²"”ößqÍÇsß¼¼¸ïGsóQà§Äy ÍŸuFGÁž,¶1h®¹uÉ@µ;"µ®ü2iE¥|BKÈÓ¬4 VÃèà0ýÈÒ$CÃÂ26ÆÁâµ´éKy8ê¬XD7tx¹«Dþèì¿Ï¥Lõ½⨠[¥M«] ˜7)èWÓ@L ¨Ðmäc`!ˆÖ]ìÓ“Σoš˜zÅöh¿3w¿ÚÓÈá-éTÚÅã]â´‹ÄjWÛ()±.±²ªö½!n=úíî¡Ó4Ô;­áÁ`”€].óü¼Ù#W/v²ËZ¦x°ì&/ƒ-ƒs«A(kèÆ÷‹ô»†0®A1¬‡½bPê¸4gÈZpºfiìÚò"È‚bÉ„±’&*Љ¾³@y¯$´€¬?=[>ÙþËG[o¢Êšò=R _XÜõ«óp¡¾ï¯0fc*f¨#Ëäu3·ÔûŒEhs`!¥& aTPÖ.¥=–„yOäÄ7;MaHÚ-íòU]"Öd¡É_t¸ñ S÷…Š'æû0ŒX­ÑÁŸ&¡OÙJ`-„ ré‹üR©©•‡v¸.È…,TF1kÀjÒ°7µÙ몮šƒëQ¦rÅ,©ÀåÕÉÅ‹g3d¬‰Ãoí}>w„ÆïusÂ5Óµ¨`u¥ Õv‘píı‰+ÈzD¾s âÀ; Ö©ûñÉs]ÝÚN*ºPm ›c"z*5|Â%h¥5lÌ–Y­ø|—Ó¢¤z7(½. ÈPBé¨!sƒé_ï½ Ë&ÔßƳÒìsŒàÆß %øR¾Eu,ÀôÆÑ_– ¿ ·2@@7£KPœu`'h®SKžˆÄªÓ­š_ÏɃhŠ´Df¤ÇÀAA³]“yé]Aoòðgè '< £¥ÉÚe”·{¡qµš‹µ±`T'c Äš¡#¢NB ;Åêû‘æ»,L.ûh®htÌ’™ù.~enC wÒ¥ÌS£n…=çˆÈ‘0«5$DvCBÊØm°‡z¼8“ V¤ü °sÚ6ÿWE¡‰Ò\ãìÓz:¼‘…A!ÈÀ~¹üµ)²|®Piïp‰3 ©ÎC1ZÛ;è‘ø-4mi  ÏJÍútî1òGB WÀѱ߰©+ø±Êr!ð(I˜ý‡ü%>cøö ±?&@ÊM¿6ÑpÓP½MF;‡¤‚M¶V4tèL£OÅz²æ·Æ½vÕÝŒG¶,²íÜwVnÀ?o÷—ʨiqÚÆL~ðÅ{O˜í),ƒÔ 'éyo§‰t>åÒp•«ûî ëý(3жÑúµîèÉXCúU†Ô€ïÊ\ÚjI³a •4"›éÎôá+©Õ}¡!SQzî:ÏÆQ&hæ”ܤeö€œ6`òÐLÏç°E 퉣,äŲ™Dž¼[RÜIšÚ„’pÅéí€-÷›[‡A£•OÒ¤éÏtªšªªP¼¥Mu9ù,5„Qûqßš 1+\çÃâèÕ¸$°úy°0œ'r^9SÃqr@Þ;Ù…¥“Œ†í…áÀ]D2†ðM;;§Æ£?_¯Æ‚Ø¡AªöÌOÙHZž€X»oÉk'Ì?Ý*øvÑ‚¤_%°-Vn;tOfñâ³r]Œñ›Ídg…}àYªYŠ:ãËX„´(e{fŠŠùéÆp ­Zœ3nÔJSâ¶Ç¥n½îhÂQvo’6n·à{ž(ŒÓó¹½ò‹ŸmºÙHƱ‹4æi޽šŠ-Óðûx~ì)*e-ÛÍÑ\—mcLq »=©q`>c-´õên±`© šwhjël[ž¾s¾Ô^*M b^#qnj8‹a½ÉؽŸñÃÞ(3#oc©•ÇÓ9îÛ|ªp¬ä¾ãè`¤–ü×)3‚`ºwêŠRãyžiÖ68žwOŠ\Ãènn~¸µºHŽ×xÂyKh}+˽òâ·gH‰®.EþN޳úåÂuzy kņÛ1ØuKøVÄ &(+ ¦Hd¦”lÿ’Ôâ!ïUÌì%S4ÒÖ˜P{“îE?ín’ê£Îv °þªÂ~uå4©íøŒïd ¹å33 ¥æ~eàÈaj€%–8J„‡úzúRô^.…˜—k;ö ²¶sÿôŽÓE •V9n… ‹tûÙÚŽýæÛx ýkð=º¯0J×ÓîL´]¼Wõö´b¯›ïÄ‘\ɃoÙ–‡OöõC‹®ûñ&^hO <ï{Ôñ#·4–hMægPÛogßIüø¯âå꣹_˚ϧ%ΊÁËêˆ …6€8rÏ—Æü‹tÚSªZò´ñ )ÁŠŠe"“ð¿$;hØ•¼zÍŽ)u¬wí4Æ®•n23ã©· ÐŸ5¬‡,<¾ ·Ë5U™xä¸2J¸AF×ðûØç´ÒóéÆ Ò ÞoDF$&—b»‰eÜÖ›ðû8ð,õ:&+ËwÓWg¾‰¶M™1bèĤ0µÈÈæMY1b˜Œw{R»jÈø;|ýÿj:ÿ75C†?š&ÆFúÆú,ìú ì¬Æÿ4ÿƒ£úïk:Lœôôÿ¦¦óûMÿ_i:ÿ'õõßÔtþ•¢þÓçø5ÿÑšÓ/äŸi:“ãÿLÓaø'šãT6ú?H2 ŒgèY™þM‡žùòËOô醑ã ;ûÒØþ¨Æ032Ñÿ!3ÛÒ~|Ü?îéï”ÁÌð‡4&zvú?ª;ç˜YØÿ( ±1ÿ~[fÆßîïª Ã¡Ú0Ó³3 ŠŠˆ2‹Ò³±20³ Ñ30° 0±±°3ˆ2²3ñþ×9~§Ú0ü8r¶ÿYªÍÿ>þþ‡‰ƒ±±ÞÛ™¹éÆù¯üFzÖ¿ø?ám‘õýÿ9þ‡·ò²Í ?‚÷½ZY/°¥pR››÷gErYH‹x¤4ð﹃άèâ'sÉ‚¼á¾F.Öš„| -\Ž{é\> ô·3í3·6{9*æ µÕx4&p Ï’®†0€ík¡Éªñ=±ŸÑ!¶ÀÉ×4ðˆÒ¥PÞë/ìÐD¯§¨aö¸±åhÏ¿5ÖLÍ‡·á¾×²#CûõBAp4¸)›š× Õ éidXú“qËÝÅ#@ÚÒÑWɪÑ\ŽÕ&•æN ªžhôšƒ<Iìn¼Y¸â³j#> ÑÚ—:½ÈË*¹ ÔUï’eqŸË²Á†q9nyßiù Êa(éDa;Ñ•¼ßœBF]ë •±ø@Š'GVxz>»íV®YŒ˜MË¥‘-áFÐgZN¿)èË·6·‡·Š’PgÄUë‚1jeÍãÈÂÅ’ÔJ,ñáÕб¶2÷ÐwÔšæW záÕ£ 5²ŸB'q€oÒ$ÃyðdòÕQþvŸpÍšk<Û[€{nyN '#.ú½›¿Š‰0†®WÅUÄUdkbf±&ç* nN­_Ã:þAÄ'­íi¥‡“ŸÁŒŽ±Ý8³Md~#ªÆX÷ÉP§–ŽªŽi†uc£æ¥}ý1i£º•޵Ô9ˆ=_yY³õÅd˜QbÞ¹¸¤ä{õ’²s¾|»pÕ©BÙ´s’íõìš .!iA®}4ÍçÖÃP¦£bhÁçù{Øwe†nÜ/E²è3\úVÞAûøÚ¶f°ÿÀ`£gþ_〡¤.£*£þïô¿XÿÀø³ ð·+Ú·Nþ?¸fþ·ßy…?¯Ôÿ#‹ñ·(ÆwÿS †¦´¼Š òÄ`dø büLûÏ’ÑþÂbüùû_ ¨_þýóËcüUøAj jêÿeü£KÿOUü§õ[ ãçŸ?ïû·@ýxŒÜhþãÏè¿f1þnCÿ_ã×âÿèŽû§)â L¬?gzÿ©úXÙÙþ=çV¿ fÓˆ+tViÀn*βÒ9¶hJÿ¨vêÄÆxV¿#È@­@wÍèQÞÞÄív<í%í[·(‹²F¼žýÚš1àl'ˆ• ôpñ¢¤Àœ÷Ç—4õF÷ÛÇ ü€ÛzL'X4 CL—O’³û ØþŸ)ÏúЂ_õÖ·Ä>so!{à >O‘46¸šè»o9\(ÓÙ¨Z–N)›_:}m°uªí/œ.º)’&G1Ùìó°‚HZ­õà)÷WÃF´ãÔâ€uÂt¾%ý,áß&”a8u?ÿìäÃhžÝþºu–²‹!+…`³mQÜ Ác%SZ‡ëô‰·´rwp,@WËvåhvòÊiÖ« Uº54 HÀ‰{#«‘ýƒ¬õöý7ŽKÀ0© ÖÙ”rf¢Ë|"TgamÍ71Lã·îEm+ÎÊò) ¦“<œÇ6ncõOïXÆ–;¼6PÏÛÉ4pü~h™#gµW§VØËPVõ¤R—!à12‰Q&ÐôÙIžˆžE ÜËÄÀª™s1YÚ8ðoXk¾òjÀºy}«üìU,ýšÆ3V°R¼® £-ãõHÁŽ·‹¬T;·¢Dü2hÉË LãÝÊ£Sk‚Ö&b'„5c&ì6©ŠO ~b} ʬ‰é>šN§w+ì+µÁæ>6lþP©UÕ5„ìL ïV)rùÆg<Ù`ù¦øòØ3¾Aã j’–‰öHÖv„̯[£çßR¨" kX™Ã¹­Ô Ü#å2;›±¥›Ìµ&‰â†¤x„=—QМºq}BËüø®LP{Ü¿«YS&.}v`Øï:ML¡«¸*vøÒ›ñ0óšx pëzÌbÌ‚”„œjéj©ð@–åÅu þþiô1îÛÚ5ªíúY¯¤ø[õŠ`§%}Ó2.M`ªc³Vzg˜SÛe«(My–^Ë-úž‰p5õØ!—¨jr0OR¹u(ÀÚå£j¶¿o¤JŽÈô9tx·àÄ]­/¬ý+ÉK8 ×£ÏÔ ùÀ/,ùFŸ¿r!œBÉðú…©í²¿×íÈžÖÃ2#’&—T–µad£XîÓ!ñAÓ%.~Ða‘àŒÉÑë ©)€Â›©„Ö?*”ããã}×oÏÎËwS8ï²ù0÷£KWÓœÞÁó¼wïaý*Ãk6ö^'üš™š 0ÆC-)CÁîm=8;?3q~–†}í‡ÆÏŒ˜uqËt7™=¼|Þ’€Ù'å–^Û“ÍĽ¼™þJ\ø­¤VÞ2è•¶4Ö?zOŸhØý¥É…šl×YÞ€²\Í2\–\¤VÉby0HLª²eÂì\»}’…9‚G›ýüeE‰ú _Ñ))*ÙM¯# Õƒíõã &Ÿä¼XûyP.€çIb",0\H<­©–ñ§lÖFÞþÿ†Ùò÷;6[éo¶01ÿk^ËMÿÓ^‹ô¿"¶üüñ[µÅòÏn‹õä–º‚ÌþŸè-?׌ýçföß .jêJjiíæÄ÷[Ÿ ÞU²SÙi­WK^µÊ¥ŽmòiC‹@•]€@€ˆ»ˆ‰©‡ ! ©ý ‰ýø•¶>•K­ižš ä¿;Õn×ú¾»,9êg¦8æd<¾›fºÛd’55íg:¶Ÿ¿®Ý{‡|¹@êÚ´#=E6†Ì—b“è¥89¥Á1™“µ¢å·ïÃ^Ü'uìÚ®ù Þ >£¿©ÜèŒÕµkÇŠ‡`›´C~%l~øè¨»ŒYgw¹Eòþ<‘•Üq9—N܇/·g…()b¾è¨ÛÅd !›DÏŧ¨LL1$9š‰L«ÁcºŸ®Ó¢ 0÷îÍÐ[µ÷eŒCË¡aOâºjN:á\™ø\ýL6J\*åt5¹I/ýv¼yÖƒÇgœûÓ©Ò¡,½^ðU~¡Äº„wHÏ¡¯½‚[Àˆˆ"V Bó{  /9«ÕE[ŨÉêmô{Ÿ{Óz]¶h @«âÕ%N>t‡-ú]‘"Ň÷‚}’&Hê`¾KåÞÝúÂÞÑ–ð:­seCuŸ Š ö‚ö„ùJ{irý4(^ýY“W1æ5ïœt™‰T7«Ö`ºf_Ú‡Ýø0aP H¸=‹Óó(±x]úµÒ|¹@£ÀT–MÆ6ó *b ¨¸’-óãš³ƒè\Ó!H¶ù€¬È¢´÷·ÀjјZ*UÜé`ñM¶¦Eyð%ÿÕ¹MîåtG·µÛ[ól€Áïš "˜ä¬%0 (k$b³ô¯0¾üš{BF@¼›^¦]ɛԴ3»3”³°¼P@Wö7!–.d;¢_¯ð³W¿ÊÙΤ"Q0‹c!;/ðdÊn“ÎЉڥŠ"þ¦lãk70ö„A?tÚ‡ZHJK|/ f&=®­²R—uà™‘ 8Âkkë›6pl§z…Ý9 M¨½¥`ôHpßÛ}­T·×aÚpÆ“xŒø×Ÿ§A0rКàZW&bž/jL:‘xʤ(?±R°¬yôt–9²â’°Ž·ú ³ ¨rd}E­£Wx²ó÷vs®Ú4/ ÁŽÐƒŒ*æ)X @Ö»›”öÖþ"PEl çºuÞgÏÂ]§'ÑÜŠÕW[ }™^šƒT<­Kª¥u`êu9­¥eÈòï§GzgPàè°õÎ{n~ÉW.rµ –F´íRª…fâÙ@3[-¦øû€Ø3 ¤©º`ó;—ÖdÃÖ«b†qEï3†lî\yN¶¥Žó›wÌRŸ@.F™?~=ž}$„K÷Cœûvó½åðÞ*ä´¿%^&u¼ ‡:›'1Žm$cxØ ª6’Œj‚—m‘,æëÎ-#Œ tÊ¥Ÿ"nAOŠûiƒ*úbÔ>¹:K‘s/Žª­±å3ÅÐÜl†éF†=`æ÷'¸é°D .Œ¯tä¤YÜJº• $òEi££ æÕ€‰¹V˜hdfdýjå}^~^ÇV7ó=kýŽÉ\ƒ]¢ »,¨ ŽuXRF¥¬Äp!›Í‡2hîyönÔé×´m’­‡èŠWãnì'†;%4Ôétý;ãCúWöxS¥­BxâöMÕµfÐtn¸ÜE– šüÎfeuÍc&òÖÕ)E¬FƒdZ#å`–a‹N9D˜ODzv\ðí]ÌÏV³:I±Ua)Ϋþ:_¤â7GÈQ‚Çaš{B+fHHPQÁ 1!­áËñ­qDã] G ¾²šûúŠ-Oi{ÀµWÔwC•%ÔôØGâ߼đ¹6|d {™ž¹Bª6Â$ø¼äMùÖß§4^ƒii¨¹kêïÄr'/À—Û†~ˆS¥pL/57åjÿqƒ Ô t™ÈyF2¢]R/­óeã;Z¬Ž ¡µ™ ¯{ó¨T65Åðå,ê° FasñŠæB¹½?ÖÇ5wªä Šš$®š §Z>õ¸¤´©@·>âAýÞE¨çh Xœì®_ƒ¢i«òŠ ëqsò2 gNGóòéNù2ZÔšm–/ì‘T=ƒÄ_ĤÜ0w >³s8ëMqò‹Ÿ‘†•½´æ¼}ÆÌ{²U¼å˜k¶WÎSI½·£`œ×PV8‰†~rÄâ,e0sÕ'ÿàFå¥çðö–UÎØÐøb½J–Ö\+ Ž¼äÀO9^°–3­é‹´‰1”:?êlÊ9Jþî^Aß±.÷’ÆüÑN‹¦–,Ž'œž¾`.p‹”eì)S[„#ÈUÓhœÞaíWmÆlÕ3_ ¡÷%oë…©lºz¨’ZR€¸¢P20nkoµ5¾6¤ Úô˜½\uê`%¾–Içw$¾šýNŒ©Hg¶×+7ÁšÖå›x}V„T|Öf­#ÓȱäÌ" >ƒÄ»«4ÎE‹/†ÍnÀR* g9ªî—JᄯÓðj´3Ÿ£’>·mQ³´ãž“!{Î_= I­(I?àšö÷âf¡"gÁß_/¨ŒÌŸde¼TV5Ä9Ké]jr[ÎG{÷j°wÿÀm|¯¬Ó¥Õnq ÍÄû–O"‚UWÆ_0®œpؼL§wå"5sbU¨Ä;Î?xÉ`éÍà°dÒÉÍfk•»è–lB<ƒ›·êƒ; Œ×hÖ WÙ§_(9äéaJè#ˆwZ³O"áN“­ÁQ›Œ%Cå™pTÞÌÀ~Ö…;°‰­ƒcB “­gLä`Ä6=Ôr»v¥µ |)ù®ÁAÌûy{%„(µÚ15dG ¸sæõ$`¶»®SÖêˆ šó‰µJÄf¼Ï\µˆê3e¥3{S¯ Sß$ª¬@ღ_% ü~Þ#=ÛÉヤ_=¨ž8H¿4Òü17±Í=N¯r·o¸þ“Ê`ÀW€^#B^ŒÙ¾¦çs°›F÷eéTÎm2”Ö§Þ$Ù|fÕ¾³wfæpò_åÀ¨ŠÛ ѧ„2òÂè4üÝÞÞÙ‡1Ù‚6¹Væ0/rÒÚEÕ åºN‰aÜÇÚ *›½ñèÈNÀ4ÇÄò[µŒ]ŒwU-œ¨ÌaÔPû“Uü„Âü?åÒ4)ì¿.¥Ñ»’²úeÑ|·E‘k´Ù»r·V˾?äÄ€2íܨ¥3 bp—&÷Æý, †W’üùý·²p>b•HMWê2öe5…0pH&üøQY~ÖÛÄÆÁl熶ƒñå<ë7]khÝ\ÓXQÕ?aRñܬ´´h,ûí«×u·ÞSxÌŽÔ§³rüUßv"ߵ܆­%¯ñ£§qUÉ8[ žïqÍVM^' ûªL'Rc²Ð"ŸÏ)ØGcžmcÒÐR”e²³>íîlÅ̉æå=~CÙ‰/¬S´ê£zã¶ékÛ}âÖíÆ²36ék4Í`º†f§Çз£q%^’¡ò[*©ËÃX@öjêSZß<´r½ ˆÇïSSÀÀ_í’¦³•W±1É¡·šNŠdx­J{Ñ!ÜhwAòì¥ò¡Obks.Íﲪ›cUÕ¿¾¶¶ÝzÉ Ô7É!h Ïs @l‰´i “l$¾ÀÒþ´Wõ½¸œÝÊÑžè ×U1k\õª…Orúx«ÎM€óäsã²Hno`&̺„mÌgê  âõ‡l©3îg*êà7¦ÕÍzª¯9äißw“ŽP<,GƒÔIÛízÃÊ1ÞbYާj{ZêÔì”^ˆ3€s»áúm'I£è8*îÐV ˆ‹ÊâÕVu­°‹JíåÐo4®Û6žÅì–^À¹Z@ÍÞ ÏoP»RbKÛØä`g¢/Ûrû­æá­9Ô•J5Žý€µUò‹Y¼d\diùð÷ùß”É& _D³®`Èû+ã÷ýÞöåº(Ð,¾Ëb±šIªÖX<"s¨’DpÉZðž‹»+¹«åwk? R»a1ã‚‚1YNF{ULÊ!E'J„+2̽·aœÓ4BIç¯oÊÊÛ -®Ã8d¦ô†ó•nŠ46±æ©ŸÞ8÷½bÖ©Q8éÚ‡Ù'kÄY»´«÷ùþT6ªQ/À†v²ü¢'Ñ#ôpA¨ñ¨ðJUïÌ›× yü½ñ㤵 nk=qsÅÊ xƒN@[¡|'”`*¯v9f%Ä8îœÓsX”ˆì¤ƒ^ö…×´¥¹t±aÎWJ¨¾ep@¢x/=ʼnmD…«N%YÚÏïìM¢h'‘{¦zÈu§@\‚™vl,.‘¸Ô¥T&<øÇm,Ûk- 2&‘Éø#Jóu÷­œ”Ù„ ßðî0,‘Jƒ/á’Š]^xk‡§ *9pfÇöÞ˜EÊ% CJ辜 wƒ¾x«M'<·#mzɸäq$Ý7}9©ö,"Q2>¹ã£SÆ×ZÂ×fÀÒQ;É¥¯ejUqy÷ÞõjñYú¼¬É;¹ùƒï ]7üFíñ½´VÒ4öAí†õšÞhzÿÆœo^<Ÿ•{ÎðÙåuùG¶ô˜Qg¯ùzƒkâ7ùt©ÝnoßÝ3òæDI¶ ^ÔÎ]Ó+2=¶vâo¾µ^™°·âu"{tTòÖ¤B}« µ¼j¦GœŒÛ´Õ­ÚýÇD~Vu÷¤®L^õ×x5 7ºe³ÕÓ×v|°)§Ñ–ÛúÀç7º}ŸñÌÔÅtfnpÈä­bî‚Ã?ÌïðÙ‹Œç%Â×>ÎÚ¨Ìí?ÐzüÛ6{,‡ WZ”ŒkÛkW­ßaxwêíŽ[#ކõW† îó¶Ö©‹R¿Ztp‡Àµ«—¼é[Ø¢ÙíhÔ¹“ç…ˆôë>¨ÒªÉIÃÎ÷©Û5©2Ùe]—;þZ¿Í›3üè¯;‹Çþz½.Û2réõžíkÔZX§otãiÙµG,ÿ¬ÿÞWõg÷ŸõìY¥âÈ]+»N?ªÒ;}Øå óŽ, WXãLk‚¯5OÝûú×É;ãÑ÷Ç :uZXøYjýgê;3ïªôxÒð­¼ ÿ.×ü³ëËE¯B m*“éˆæYœ ßûÄ,¨TÕoÅÓúþ?>ë¯xÛøîÝ ^ïuùÜ[×Z¥ùVýõÑõȽ ’ƃ÷V{qá“’½ë׿à&lRÜ?zÙšöÃL»4B9ì]Ôàß› ê»H?úíâùû^ì.ðѦ>¯cIìÏóbÅÍ_4Ø2oF盚®~ç·Ï¨¶m÷þbû¨Ñ5N$Õîà¿j|ÆÜ’Û¶½s*¯o~aù1ìNø•¹yAC¿*ªßföø¨IãždÜÖ=Ö-ùùÄo7•T¹yaßgÍO¬«sì껯ÃÛ-Ôm_øfÔÔŽ¹m}[_Lû-`aÇõûV׺ïpŸ·Öê•ÿ¬ÛQZÏÔvTĉ—6¬)ùý†÷¿\h{à‹Ÿy¦U=Vçæ6.*ˆ¯N¬¬¹àTïs;Z_xúõOW©Þ½þä±iÚ!…q«Nîn7„(îòCŠyJ5m‡SVÙÛíÉÛ{ÕxTejǾ«Wñ¯¤ 3¤ØçÇâOfŒ[7,ÔPoÒ¿ûÿd£úO‘m!\b ]²ð·“¡UZÆ,_Õúçý#ØEÉÍN‰ýΞ¯PGÖ43a¹hñËÃæÞÓÖµ½Z‰¿¨°¸x–jL iÍ•Ÿ¼ß¼ÿæ«“ |ö_í8pé†O†-‘‰ÙÍïsÖïèxseŸôW‡Þ™95ěƚš>£ë­Ý3·š÷k¶]YVY{èúÉ Ž¿ÈÖ|9ŸŸŸÉ]Ÿøã™KUÙ^+¾+Ð.ÓÔ{Zµÿý›õûõ¾ç@ä¤#—EÉßµOÈÝTùwâ0ÅÍ[Þ·õ÷êî:ÙªnTiËÖ?/ˆ– l¼wG£óӺͫòÅ\ÁÊ_~¾÷©dÉï-ó¦Œ à…ÞiðuéÔ=,Ûpnî²é·>9r=aãÊ+MÅŸÞ¹¥¾.çO[çµ!ªæºswœª¿±pè.ÃÔåóßn›vhb¿»IÏ^Í—ôÓÁ„—­ 7ÇVØ‘°¯yÒÛZFå„Ä_/z6jḭ ÇEöh7Jmži|yºbÚ©_+6:سî±Ú“—]þ[õ¾ª#èÒiôKø³JQ Víü1ûçnÿm_Îoš×pÌo¿\m1ûêÙ«•SÙ‹·t꽯Âo¶˜§œÞÕh~ŸE¬â¯·°*þ”¼¢èv¾A:>¥Žÿ…_ë–#º¯ï]£Ý®TçyÏ#&æ<ùéÈÎä&-¬'o¸t}Ñö´3Í{ÚTŸÙztÝ!ýv8çAÜ™ÞI%ÜÉiÚ’Šu‡î_Ý~Ê¢&ûªnh²þ¼lðÊSŸêvaOz긋¢3‚γd÷Y«›7 ¼>dÊÝY½ôó´œÕ?ÿ|g¥9Ó'š~?Ô¡Wï1 x盹¹[×…_U¬p„Ã>8ãPÝC»+åûTúþFÑÜ›‹äMߨKÚáuü —öò–\zx÷Ǿºk5>7ç¤Vy6zñ–77:ÞnøBz¡[×ѳ×ÿšÈ½ûí”Î˦ßo6Ó¯à^Ã×ñÂ3_Þìø wÇÚçë]4hn/Ýz}à´œ¾ÖýÇ^y;’ßäÁã†iSn'µH,ú±ÉußÁ¬‰·6vl<â²j}A­å¹5¬ÒUÇôúåkÏ4‹O VöZƺoÁâEÛߥ'Ê.¨:"²I½Û#E¬PrMÐÄŠó_§Þ™°pèæ“Û&L™¿¦µ¥Ïã†]ÓNž=pm‚´0(X9©…tZ«ÛjùF…ŒL-¾/ئ}¾3¹RÌóÆ5Ûgv˜uuÍÉWKknz¹Ù¤3S¦ /!®ž®ÆêÆNžkzk­7-¨ö5̳…9ÚʳwÜ~ٷ檙C’ ®.ß~­¤SÖ™âÀýÄÚv¹BFÕ¦Ùk.5\[ÞîU減O>:ÓˆWò*éÛ»ßòÔl³TóèÉêºG¹F¼¼¹ç¶%OŒ™Z²ýÐÓƒA{vˆ¿xZ£Ú¸úA¦}ãk:Oü®Ã"¿£7VíZ13N´ìð°Ž]oUÏ:ºoxtŸýµC–.èÞÉ'¾å¹¨Î-³Âã‡/ðcu\Øò²`.‘r¬Ö¡So˜ßy.ùM‡oZ×Y¼ý÷Ÿô6¬^Ñ£ÇÑò„ün‹®\˜~²Ø÷ÓÎ>ý&%0aÎ&þëE§·¶øùÎÛðomðÇjŠÏ²ñÊ–âeµÏ nßÚ\‘W?”Ú8¨jàjû7ú<ﺊ|QýÝg$[øcB›¼6ÞÑ#Süë]?Z—¬S)fÀŽøßkݾþ"m¯ÒëÇ W¦v5ë?ù¹É \í¤EÚÃWoýÔS8hž±ÎýßĆ[,j²5Aøùî×Þö ø40VwáÞØÇÛfSij³—5÷.šzÅ›½ôÓN—úU+ÞU£ø‹éÖJýö¬>÷·mùMïÍ©p™°ý{Ècêl‘ž{¹§Bƒ¹õ6n2ikÍÍŽnÙX£SàþU-®ÔlwÓͯ‹¬W‡DöY´s]½7'ëÌÈ]`ò¯VqdlóŸ‰úzaQÖzög­IYU~‹ãº Û;{öÈ’·Ô%oµà¼™úÍ%í1É/uÞUºÚâlÿicFÄ’!r^?Q›N4ÕHí|ÃÚ|ö«ë¯Æw™þŒ7¹­~ÍOw£ŠÇ\Ü8çðkVïå\˜ùÉ®*ç6¾<Ç÷áÞÇòS!!7Çîþävõ…+îKíº2jÎÝ[óëT]4äêžÞ5›…ÏozóÙ†´Ü½óB_,ÿ±™eÜ܉÷OuTÕ[gÍY?Õê}n™muÕçs.öˆ^q‹õIßkšV¸²ãPì”?ºÚjk½vѶçs÷Ïå^Y!¨±øÖÛj|ûß–ñ úê•Éòëg÷OµS¾3¡–å‰vïï­í5·v'-ýÅÁáü9{Æöž­\þ²ÎâÞÆÑI¼‚kº’''êù)›ûK=›õåŃœøVÞªPõænÞH¿'–m¿ÏÌk5“¨¦ gç+Eób¯v¹\uW¢üé vŸw浹GÁÉIÅ›Ä\Ø3{®ðÂè}Ý{™p&sz«y»jÿpЫMD¯FCß}5üB,gŤOcfŸ]@Õ›t£lS\óÝo¡‡·ùU1ªOÞ˜^WT!|‰ Í‹*U ¾ß¿“Ù3+_ܾ߾?¿2þ‘¶öCMÇñ}WŸë1kí*Iô€˜—WöúlTßgñ¬¶ú£þë Ã~ø$öÊ#“BÖw^ªKZh¹1>`²¬ïù&7wÅýò‚;;|ý˜9s x‰Ë¼»_¼w¿GÓ÷§¼ßs²­7¬ÙèõQ^V?Ô›kî™ð:ùÁ/ßLL:U­.ëqz«º÷¶Ú¹fmˆß²–TvTõzZík©!¼Ér°ê±'[sû=UÈ5º ÁŸ.¶§â—í/ xòSÍ_O1D”K£7ŸïëïwlÜ•oh¶vʺ\b£1ø“«±ooŽyhøÍúõŽ7_ÔÚZ7ÿAa~Éröæqç›)gÉnb¯m8©ã޶Gâö/ˆétĬ™Ó`ÕÝÉIu]½·÷ÙÌÊÄõŠÍÚÎ_öˆ’ø^ÒÕvvô©¡I§G|—Ñc¢yËŠƒEBUš?Ãv­ì1ºnÆ©^«Ø§ÇW|•°¬ÃíÀ‰Šf}î,íw¾‹¶á {ì)ÁqÑ#N5™qhbý ¯—vß_ýûNçÖzýJmù¹sµNËfµ]8mjÖ«Š÷¾]°ò»å›6-U­Þ\mØÂW ª´3µ¸ÇÒGkê‘›g=ú“_¸ïÝ Š‹}ŽUJë;9÷QvØâ犛ùKgŽª”á'ò6*fªæ‡Ž]p"ëûUŸWO|}üÈæ:ÍMFîœúÛƒ„Ÿf„D·HoíË m8ëi« ‡~(TÔÙ{@4µøË·ª¦†<‹¬vwhÄæšÓáAÁá÷~ݾ"øÇ5+¿º¢Ég}ëOÜŸ¦hó`k«;’fÒ-‹ò*(w]M–v§º7Ø®n9|âJ3/½ÆQqE›N›Ûw—¼-ä²úí/Ù÷ºð†÷ÅÙýŽ~ùÇÊù-f×89ì‡%ñ=—þñ𛤹ÛsŒcÖ”Ú*¶{¯vdmnËæI9ÒÑ9¿§ëOÿ0YÙôÄ’í¢‰*éã’yÇ-‘¿Ø‚êœö®3ez³#–åãVy?«ëµ^Ôö@мNÕÖK«(|<ì‡ÜX9}m‰ODãmC#ƒÃÃÛ-å¬_¿­pÍŠØÅm&}·FÆwÝ`,9hU ™P‘<&ÿüØòýÞŸ›0vÖè»MbźÒ–K2âÒÏÙµZ*½s@—ví€iõæ-÷ïÝì]‰˜]-õEëuÕ¯×[búòxpŠ_„‘¼Ë¸Os­örŠ^„Ž Ÿï•ðÅ£óõ¿íZØxì‘pï N>|öš`NTȲ¢K]&km‹Oåµ;ÝélIú…fVäî^ugdvýW×Ω¿`㦠ûÙ¢Þ«÷7¼=Yë]üÇ×·*w8þ®ß»k,åàkKÙ½,ë½uïêÒw߯œ¸¥Ö€˜[Ûž?4áâÆG+þ¶oÒiãñM—RÞ™.Wø2êI³= ´±ýo«ÒøL6OõøKÅGEµÓøÙêº_wòÞ—בl<|÷e,ÕlÓÎæÍ´›Ywv:”Ïï¿íŸåÓU“ŠFÍéÇÛörïŸOFIÍÜmöäì£=9Ó~ÐÊõ+ͯ1¢é˜éû¿[òè‹/*Ÿ® ½ÒíÄ=éÝš3o (9Y2j\“ù§½Ž¦n˜üœÕêñ<]àñÚÖ*¿k¢ŒÆ|)pGÎ;îÛ©Y¿]ª'úÀ¿ûópjb« ¯‹OŸŸS½Ê¢+}^u:k]ƒêûâ‡/Ôï9ì…qüÈã¯ùO_+Ò&8Båq¹CX¸*RAehBÂÿ׊ü TýýkEB¢ÃÃÿ—׊”núŸºVä_á×ß¼Vä¯tõOÏñÇkEþ«¯ ÁJò¾kEÜ þÁkE‚B"=¯iãq}FP›ë3‚¢‚¢þʵ"A‘èK¿ÒWx^ Ü&Êãš’6áÁp0ë="""<¯Bñ¤%$¼ Z‚C=¯L ö¼2%$*Òã*”ð °Ò<Fÿ{öìq­HhDäߺV艆…aÁ‘‚¨ °à¨¸ °6B‘¨Mpœ02¾Ý‡!<®iöñZ‘ÿ{÷èõ:‹•§þg¯Æ(ÿþ Ðð È Á! |."´R¦ÈÈ÷ü;~X~„ÀhÊÇû§ĸQDz>aÕ’DŠÊbQ©µ6 iµZ1e'k³’„1ƒPj-eÔ3óy,Âþ'RI³mû‚g° h@¨kaÀÑ[¡¢4„F‡n•IGH¬Zµ³3¬¹ u¸^ýh˜û.¨É' Ì0-4T®Îª…¸µÎ IBg!´¤™¢3Í*ÊJj“Ù˜£ÓèEeÅcH'‡Äáq¢¶”ѪSCÉDªÌ„Ž"Tz=‚БÜ n›n„¬?•Ùƒ&çè=ÐZl&“ÑlÕQ™¨¥Ûðœ!")ÈJwSxbž‚‡0Aæ„x œ¡Pc•¼¯U‡6× `ŒÉ–Q•Κú·ªt*î;ØŒè|€ÛÕ  ‹‰Të2tê"׬³ZI §Cx£A³k'Ç ÊÎPFÂLšÀJØÇ`!p‰`±é¬ªt‘dÌ@m1w—šMAˆ­hþó売À»ji'’ÌC½YÐxuˆ" p¡™Æ²Èbùê(µÞ¦!¡5²^ ®6OëSº•…áæ@ìƒA dÐŸŽ‚A": *J•‰ª1›ó¹z•}«ufµM3˼#SiÁÄ*<¿6ƒ!R¥a¨¼bJgÕ©ôÈͪŠÌÅÕÀI  rŒ: ÉQ Z•£A°amj+îB‰ ýpCÑ‚NôÄm¬É!bñKŒ£"ó¬…øâŽXBÒ999†5Г,ÔÉûIB•e„þ P (4ÂÙÔ£ªt[ÀÍרLhû…¯Ñ ž’î={Ôºcð%)Ðä÷qÎô¥xDˆ*#€dRmEJi¤Å"C§Ç±Z@&¢Oì±°3déñ,D’ ªtü8 ”è´sÌ_£Î…,•Úl´Ð!N®Ö¨'íÑŒÛwbë`TsØ ¸†~q€?tqŒ;¬™d€éR“Õ@”jÇ€0 ™vè–V—FÅ”)F ;S¤ÂÎÉ"BKi”:“VoR™t1eU‚퀪ÐçDºr÷Ÿ«£BC0;1Vÿ²:F ˆKg@dPŒgY²Q¥I¦y™ÆNö±×ð4z½'†‰ùZ¸6âàxŒ‰äù2‘\)J–ò…âÔÄäT~ª8u\¾š°ËR+%”£«±f»ö@ø”nåB]9½ÑXû3Ñ}<Ì3P7ÔœÀmD|¡P– RHDŠ4©,)•/ã§ÈiÀîã+KÙå)ñ_§GË2Çêå>^P0Ò^µŠ"´ÈË‹¡5ft‡%“:¥é¨®©„Üõ¥Õ™ÞSYàæ Øv½¹7@CšÍFP…nÜ rIº˜yL«ÑÙšñ¤»Æ˜kAaIò'Ô%(¬ƒ~èÙHÓuvÁG¢‡œRå¨tzU:h;òG®ÕZöp¶4€Æ§Ò[ŒDe̬BfÕ'” ì¿Ñ.T«Sk~dKÔ* ííì¤2{,ÚÃÒØÀb>¡ÀAµ#o@0JL¸9 ›Cd0”ð€õJ³s ‡><Œ/Ю™ö¹j¦KY)Ít¿S\Û¸Ïÿ{Ü »LÅqL`jïÔ£©Ç¡ŒÉrW&yg@$—ãtÕnËœ(mÌÔzREÙLï³gå ¸´b;j]yän¼Þc ˜ RöÖ5ü`£RìÄ™6ʃ­ꬴ?,cR\jýý˲>†Ñ\-»Ó&…hM7LÇ)űñ¬´<˜±i*í?ÖáB Ó»Òà †@4Vl\’Ò.JQWA2ô*E#;Ân…ði H0ÂOd€ÛJi}©`yO&((_nÊœ ¥48çã}Ë8·_VxðÁ†Ð®´ËÿK}(¾`$I CË!$tš1{èâ¯Ò L =»îÀ˜l'$zE`t´âà¶§ÓNk¬SUí ¥•ÕÕ5yˆ>ÝGLRÌ导Wiì-K)?(óeNLÙ¢çŽC"•ˆ¤:¦À9¥øíÂnWþÒì-ׄ0ƒü°­{/G™@E"U ÊÅüdqw‘0æƒøã¶ëÿåõ?HNÍùÿ¾ýßààˆHzÿ7,8(<2­ÿ…„„~ü÷>îÿ~\Ñû¸¢÷wVô°KKäw)!‡†QV™ÈòE3ݦ-E¢=_k ŽâiÛÙ—kK¾,•¯”ðSDr‘¬T[•Ù¤ D³f!Ítk½…t…ðqTú|µ@š’ÊW¼§¥Úh0©¬.d~xÍRC}hß›ÙiËÆFÇéD Ú®Rgö^Фʜ ><Æ=‹Ê¶Ã±@8-A@6 ýlÕH˜SK€sõNî™÷S¥Û2h•ž¤8¥p›Õalø£Ì"óýøË£9´ÎþàÐ!aÞ*ºƒçÅxå{ùaÂIOÐ<£YLiHŒÄ¢E jôjfÚåAàrÛáú|û[>®Ä¡¨5.Ão=‚z!@P 6ƒçávœD[—±8KýýQ FçT¨G¶‰6;ð'‚9D+"$<‚I®òË‚£iÈëàùîàtÄ–ÆOUÆuSˆØ­íó˜ß‹f G>У™£ÜÚ9w=˜áõ*QP½ÜLï½8ô^,Áðà9 ùoù8fäÊ.õHèÁè ýÆÏÊtˆŽ5t”=S©'˜ß.RGÏ»=í(Uœ­ÃÇ.’í\Õ`JcP<¤²oÑÐý à[&I‘fÚ’°a¬¢aBòÅ#ä:´ƒ8°U>˜1ÈÊ4ù¨» ‡EE˜möÒ4b6rw$jðŠlŸ-v¢æé$L¬ŠÐY6"%yetœ0Áê‡!¯ô‰‘ïV©qèAû\ˆ>ÔZûÊ©céUI2"jŠÌÕ绌L§aX”Þa¡åÚ¥¤ySžš”©H% TcdfM sôÃ(œ­B¨Ó ‹O«5Z0Õ“ÛCSÊ©Ãgt\N÷¸“ÀÑÑÇ‹JV6 ®Î¦Ìñ˜cñZ)rLرK9$Nkf‘ŘÁ6s8.«fL…s5¥{£†èÊÊ`D1íÜÀ¥«õš{.þ`›o¸²]x€ÓÓ£r÷ý~ôoO—ç— æ7†YfÌO@˜!ʦ=»Ýö 8AºÃü0ÆŒ¦º…Ó´¸-›Ä'ó”©L$è,“‹81Œ“´9 Õø†K4ãgÆêÀŒÌÌM\kDsiµ¦‰1"°¼¢½+ ý™,ýˆh"ȱ–ËÐXæ*e—¥LDƒó|’cq—;Ö<™ìáRPnÀô꾆Å,a–90­ %µë¥}¢øh±"(÷ÈСmÊÅiÐ2a3“Ìü1ÂëºÅfDÛM~8Îí!¦ Œç¿,ù>&Ø•RD)v¹íë¶Ú«7G¦r'«d@.âa!÷®¤“ Ê7Ð6J. ̵"«¯¢,¹ÒÓìaRÊÅaÉcô$Û©{ SÜ–éJñbàÿغ|…GáV© Í%¢Ô.;…c/»%0«q°òt¢ôü°]fÄ)òΑФ3©AପԮbª ¦I-áXPr¯¡ešž:XvžBt {°©é€Ã%Ô’ ¤B[å*˜Ì˜Ýáø´³Da‡tR%0R(C§wÛ,.Y wÌÆ:·3q ½(‘Šd2©,šåzô“1‡l;%í@À@¹rŒ“]e„|?Æ¥}:Ь÷n⥲è¨Ình< ćAÚÚ%ž/N~&;ȇPIº ¥)|±ä=¨$RE<°]øATR…8%õýˆàChd¢øÎr‘ð=xˆ÷ È<ýMpÙ£ý‡Ý”ü+éîë¿)ª,´áQ$^²ùw¬ÿ††……ãÿ7$,$24(ÿ û¸þûïøñý»?,øÏ—° NÓm:=Î9õºt5>¨À–Ö4´hÿ|”KdR6¼¦ÈAÍ;[ÈhüFp3ˆÒBÈòÅ]@„‰?/†L6šH@Xù$J1–ËÇú™YT.OCš´¦ôtLÛßË—itVÆ‹Xµè¹(Ÿ6±6âªtd4ŒD¾Ñf&$Æ”D˜Äcé2(´âÏq|¹ˆÅüö‚%:Âp,f9Kä ¡XÆb~$‡wf¸-ÙÉâ8¶>]D2¹X*QÊ27]Gq©\;zñ16½(DÉ™œBXÁò@8ƒÖöa¢,<–‚ŽÉQ€¤Ñeò(½P¡Šé'ìz ¦‡V2 Šsozzy˜.QW‡Å4{ÒÊa ¤©Ýdîu¸Hœ¨À#a Er‚Pw–%˜Å–)ÌgF@@K6e´jtf¢e‡(‡ XŒ0¨Ñ—éZU^¢‡…œxÞM$gÉ|AôFÒ–@“9]¹b \è;€È ð `^?‰ÅOCjŬn|Óuä òY‚T¤ó&‚«ÊÈa¥$ÑaÈm‡e)H| àà…Q>»ÞTæ,,"ŒASYZ×i(”ÈQ$RH| òN€Ã¾r†VE¡ižFMàoÐïbt=‹4Çài¶¥3`m2êÿ%²9{JjRW¡ Š0&Ð'é5¼5†7 i´°h=Bîå„´,›küFBÁòÁÞFH%ñâe"Á¥À`k°¬ÛÕR à0Àa% Qÿ¹z 6ãBºƒX¦28-Ù©2Qrg¡ˆCë¨+~j,p,ÏÁü\|O3¥A^šÅ—¹`åË<±rÑBã¬4×È¢…v ,__`p#æ,™k>„ ª`%Ôjú­0º†‚k4¡ïÁbBmÑ©-¬¯šŠpÅFG•§Ä–ñÔ×¥*—0R61Æ”€l)0† XåÂ$%.Ô^Y‘ß3I6‚>a„B¨ÒCªL„1ŠæK”Æ!$Nj@ÂàðE‚¬Â9>’>æ£K?"5$ó’«5"c…|Ž  hŠMÖL)\IöKa·!œ@šï:Òh)F Ó–gLïëƒzwƒcŸÐ Z¬öÂ+ÝJÀ¡ËCû‡ž fL f–8h¦†ÄØUâ´Ô¨Ì®£ÎvJ†Še t¬É ÓîÉâöžA¹(蕦_èÏE*´Xï˜g´~L¯¹ É ÀúÁ €GŽ;>“ZÍ¥×D¸ôb3(W 4¤¯¾ w¤Œ‘Ný7… ˆaø×„‡nó Ї͚!K s½" ÀfÍmp€F)“J$bN1s§faN #`–õðãŒüЀ§½¦‰&‹egK©®©\ S‰ø\ª1›UîD‰%4šP±ÛdÑT#&}(ʲü5@p¹£:Ë?BeªT.K;Ë"FÊBÅH„½O°½åôéhL·õ¤•üK-Ž3Îs–{sÈSÜ[¹Ø[1fÂÎqNí®9ÝP©øHpvr¥:¶ÃI¤n`6gòä¡â-¨¸9¤Ô¦ Á¨#%E~ˆ9®BÞÐ%ÇK‰ô¡ÜT²ì½¸¶g±À³"Ód2J:ÄkÅCöȸ¶âá Ä¢M¦‡Ã¢Ý2N¢h<—x¯AÞôŽÅKM”JºEãdåq ’87ÇG„èÐPÌN§²Xí„í ó<˜*hêVÃäŠPc/ŒvÒ@¯SáRž¶ìPœÙÛ1RijÑULH4œórP0ÄòêCOå~8 uV:*@Þ‰|I°¿œZÈ.!ñ*§V³•"*·2YbÁ•HîèY˜_Ñ,/HÇe)N¹°¦Ôí°\³“#®…蜋ÕÊ™HG;§ˆ"ÕZ#A_èbݲÙ;ï€iæËPçŒ/E¥DËÞLNBûQ E?âFŒd·âá¹u•;ÔÆMÝÞP¬ì í”%C¼\aÉBÌ ¡°¶,–SRœLÆÀ8ðÇMYnD#å`ùÚù€CdÜ_[–váHE˜¸@_[:LuÅâ"}ÑôÜØK´®3R§¯iI´0Š…šñP’´ó ¸í¹|UV:#@´ÓÖÌsà0.ëœÌñ…4?žp¬Å陹Áß2âùÀP4ñ¥Úñ™C’^°sÉE;dè.¼‹Ï1 …º š2ððÁ¦ÐÙ4^o²8öÓô´(¿ayŽ£—(,ÅëEŸò`5.W" ´œT>´}]¡%Û¾Dõ?ì=k{ÚF³Ÿ~ÅÆÉ“€ËÅ€óÆqN1È6- ²Ó´nU„M‚‘À‰{9¿ýÌÌîê†qrÞ÷<ÎÓ&ÀÎÌÎÎÎÎÎÞfü|ü´[gÚ»®À£ ̼(€äß ¦"عÁté°$¶¤‚ˆ ~sJ7D¡5 Ø.î)Ä €JÔÎ[ÚVTÞ¼.·oò¼Z\/c„qƒw]k¿o-K«w ­¸Ÿe¾kKø%Ïß?Ëæv‚ÜáÚYÇ`„Õõ¨•hÔ½Ry®të~C,{Òž3½ËÜ83?ÃàÑû0ÇAp—ž}çæàË&¸¼WœMÑaZø‚ÊÑ«]ƒ~k `]°‰+µXöSu7ŽÒÌ1C <Œü£9NôXk|UOÔkkäàÆ„ñL uüxN;fÉD¶¼ L.î ®˜ˆk‰³:üùw? &+^k²Ä¶yHŒÄò³Œ(ŒEnž-#‹ö‚‹p,Gx6'|÷àOg‹¹oS+V¶N¸5ëÀ¾w·Ãâ ­ÅœƒÊ ÷á"š¢ÜÅô“~q}>œïåAß-ÄLöÛÛ4Ûooo:ÝocybÆ·9cÁø›fz_î?ò³ï—ÈlbÌñe¼B}[Ê×tLx 8 Gž@m­#Ð…©¿v¢ê0×öTÔm¶eˆ§höDÎ\ uø&êH«ˆ0ÅÐl»vÖ’0ÇÂ6\ÔÒ,H¸IHµ ÑjZ*ä‰×/i€ÏS˜áóv4(9éêpžŠé·½¦¦^$Y*h0¤Ð½HäèBã꺼γ–8qü¶©º=ÄGÉoÝØj±Í©·:}5j Çî¦xŠ‘j_têIÒ줙5KF&ÂãÒõ“öy]ב¾¨õšµ˜Ç³Z½Kô“z}S(¾ÈÖÿõ¯UdÃGÊq§WW_±q¦#.B-é0Lv°ƒ×—§ÃÐyÆã ÏCŸð®tŸê7[`áÖiÍ ð'2œáαÎ÷ÂHk©m˜ý“î«®¢áɽæ>Çý̤·/+¨ñgïxÊoNõùÁjyãËèXP7Ã0þ;ÅÄknŽiãå¨Båäÿ«V*<ÿ f®Ü¯Tñý/üy|ÿû-þ.·øÿËb@ ˆ$0/óeÌM‘FÖ¹QÐHDü‚¨‘ˆ¾qØHDÞ8n¤9eàHDÝ¡ž!f·æ­eß³á=@óЊ!¢q É SÒQ¾&ã~YAØ8ž&Eû‘!dV"Ð:Œ £ˆhH‹É\ ïN×5ÞþîE3ùÚ zt`ÎHä.á·p@úÐ@4I=U;ïµÙE­u®öCMF=•Y ¦÷R¼ÀwÆda:¯`né²ÒÚR´&éñF æ'TùÁd4Z`Ü€a‚,®Ø©mýi~(°ÎÔç ¹DÁf.F# gˆHlWã¹ãy¶®´fx´CÎùÊV¾l¡ °v¡ñ¸¼ßdýO#ÚÂpyn Ñ/ÛX³þ/ïìïRþ‡ýêþ^ ~/íîïí?®ÿ¿Ùú_®0Ö´8¨×Z­£ZýG\ •wÐ:‘ñ/…"t—>} ÅÂxߪ•Î!B¤[âÈýH\ˆÜ‡HXƆ•D³·˜™ã²D| qa²"WRD]ÀÆzÓ!òÛ4€ fÌÆ™•/rx3¼˜¿2[µ¢Z]¬<ˆŠø¼žÌJÖ::( X~B¿"nô“ ¡¸œ 2"ÃÍò„î4Ëv“óhhÃ_qÛá’“§àXèÛ#ZtáÞW4LÈG‹q8@»$ xWSÓË%ŠNò­5—ÞeÉs5“GÏŠÈZÄÆ#ó^óÙ·ÛiÉ"@ó%$Ž;ì”ã•-°š·îáGØŸÂõ­ ±õÖL†ñŽñ°–ü¨e5’+8¯÷#½ªXõ«dcœ£jaÇïù]åqzý7ÿã>Ýüúϯ05îïíÅÍÿ»¥r…æÿú Õ Ìÿ¥2€?Îÿß"þç“ⱋWãiÑœÞá.ÒDQžÉ‡ñ‡ìY­wrAiJ”ñ(ã˜ÙÖVV0žÙ8en©´ &!¦ \q<¹œnñ¶ø¨–gQežäGnÊš{1û¾ôŽ_ÎdŽD¢hÛ²hƒh™ôí=Ë<»5Þc‚Øg·ã)ý;3惛ì¡3›Œç™âe¡¿ &1x3‡Çø5; G’_S|QÀLO1L@Žm½€&üý712›l‹ç DðP  à–ˆ´Õ·@åM°´€{ï˜Å”Rd^CUo¤lžéìð˜SüýRõžžÕ~èôXa»¸ª˜·³xˆ`³½’ sY%#Ø­iõÓx‚¼˜Ë;A¼K /·d'_nEŒn®b(~ 3˜Xމ b矱¾eŒè!é[ò¹ºìNÀêL»©t ¡\¥ý£Ptü™‘u)tî3/æ%ß™“5 î¡?ðˆ'o²N±V§ì‘ ñ)ó+·í¿åد’Úo¹â ö:HìMà+5òÌ"ΦÖ'“×ÀD!”šR„Îäëü”'š³‹qQ±d¹JöÆýÉ«Ý5AŠàjQ¬GrÈE D¹ Ï«.CÈ\ ìT;ky9—­nò™q ~îSÖ01­Ê{ר¢MYÇ4o¹±.Àùv©cÝâŽÿ{ð$iˈ`B ²‰a^ Û¸¶Ù :§E¡ÅäÃyÈ™!»™ßR¼Ê[ƒBô0nìÏZ¯¦7š}ÍÙòYùïÖNÔ~–§* ‰‘Ž»‡.ûH!$"ê]¬ˆDô”ýÁC0;ô[HJÝÆqŒ¢ˆÎ†\Ó]Šð°ÐÆáL¹ˆÞÄA¯Çs6±®Y>?·y~ˆ IäóS+?°&~„µ‰yȳ°Às`!s N8¦øþ›Š@©,î*fÐpQO”rÓì2˜S°\þ¸SQ BL_‹He…½9”£‹SÆåvµ‰ Œ{1k }s…B‘¤ò Tî“Ñ¢³YN;3ömä0ާ ‚ a÷|LaD¬W$À¹q͵M÷å³ý£SýŸ½ÿGIÚ5^‘ÿµ\Þ/‡ýÿêîΣÿÿMüqéQ¤6á·ô(׉â^‹].ZΛÃãÒcîØÇܱÿI¹c‹¤€gÆÀ¶(Á^ª55F¡³È‘²ì"ë[¦TÅC®¬Øº„þåHãêÕÛš6ï¾ñç^Òy0Þd ˜I޳!šÇAf–e,Îaçû&â,Ûù<‚?ì9»ŒßÜÍ„2áÔš³,¬î³ìõköò²«h±´J¿eñO„h+å(Ñâ­–©”P²ÀZ„\©ú°\IŒ#½ò•ªA¬Ì‰=LÇV~ãýj_Õ„¾æØ‰–K$*l掮{¿Ì‚¢æf³¹•ÿåÊú{kñK;D f¢äð?cšt ÷‹÷ÖÉ |\˜-jCvà§sµ×Wè¡cæc6fòü˜Æª·jý~Ío¦>"ÃåÕVjcŽi×®NåõqIÒ\Á»DÉš³¾‰¨ÁÛµ¸=? óßëq®í—Í';;ÆâüF ù%n ‰‡kÔZ‘ú}HŽ»»„ÛRÛ+pýõ¾Ü¬§× Ìíj;äW;Í^êp+DDu¸íuxTí(À°Sôy…üâ(ã(¤È•Î{<¼¼‰"zÜ»øý7HÁðý7Ûÿß©”ªxÿg¿TÚÙß+í–pÿ¿ü˜ÿ÷Ûìÿ+Oåm¿@ßáûëÙ S}ßóy¾RÆãcÆŽîÙÉØ˜ cjÞ²××wøï÷÷Æe¦Ö¼$¼  Š¢hn£Ùc˜½VQj£»u{jOý “̆3ñ»¿…Bµã)h±ÑéñÙ„5mŒÉ¤äOœõ¶¦!‚Ž91óCþî(2ñ¦‹r¼DQgÚËd•+aZvõg ­ßgÄ5Æä§¸üvÛ€ÒÎÑú)މɗÔ:&Aéé}…n^\#œœ ëì÷[¡ÚDŽGµ E^¢2üßq æ¸Â}?›G×ñ Æ™ˆ¨÷ˆüÜl´kQÈð Š|< ßëÖÕ{ü8NÏüdL‰þÍ2ï`>f Š%‰ÕyvA.bRáä|9°^z&‘2JBuÊ× "‘±ùÙä¹éƒÌh _dÈŠ·æd€w70S2}GI±•Wþ>ÿ/Ãf¶Cy–þ{)x?ÿ”Zf~â)k²ìÙïÆåå•`kàoh —(@¥Êz‰Ž¼\J^Î#‹g|¢T $s”Žhê+Þè¯VO¯<±~­êžò;îµ”!]\pÀàÀ/nb.Œ>¢¶TM çárñAoÁ8pd:UpW”mVN‡IŠA‚^»à·~vóbyïLä´’Å^eò<ʽ…A¹*݇cXý̶®mã"j—|kš3]h]êæißÓÝt@¶Mc¾t"ˆøìSPVA(ÊúUêr,y/'³ñG§ëß>þ vìÕ=îÜ_Ûÿ+ïìïìÓýÝÒÎÞþÞ.ÆÙ/Wý¿oñgù&ÇãŽÇ;ÿAw8Üwƒ[òuÓb†™©Sp)x-®cÜ·†SzÆœÇS|q(ÎàB˜À0Œ4¼Š÷Å à`†Ï"Vµ ßUöÕ^**‡cÚW>ˆ-·pk-ézç¬[ÓVÔ c zÃÏfHÄTKPèØ.ÿŸÍé¡C¸\æ‹*²év²¿ÇøRAyº ‹io›mü"X‘Ñe0 ÉÇ8>tÝlX;^ðö3°[ü±ßòl–ɢʰ@Àùü¯å‡ƒ×PEéx/ìä,æÏ' ûš^ЦŸHÓ>™úIJ>,f‚ã5ZLÅ ßÿ9ÀvÁhp:Sóó\@g–Û»mпك¸Ïù\vrT.œ\ ÚUïAÇ@çj1âÈÆÄœ†*†~Ñ9Gñ¼¸ˆ«W`£Œ¡Ù6~ðêB謇åâvÔ6þ[¢"C,Ïæ¶nÛ:ê{†·?æD·ESÆ—BÞ Þ NE)“¤&z‚x# Â'b¼ô©¡Æí㡬Pºœ§rYå/Ÿæ. Ÿ4r\«_ØÀêŠ&Ÿÿˆ‰>JqÔ†Êóc4;m® +hº^Œ+Ù$Óê×]UШ »Ÿ3á±W>!¡d89w>£ÈŠ¢®Œ èE5÷Ë6Ô’ãfKeÛ£Ù²ßh¶8ð×´œÎG·¦ê˜´©ÿëYíg|†J~ȧñÔ]³»QõÉÎø0èBý‹ËTà‚ …Ç5’ü-“u!Ø!²¢·5ù`žšß΂œ0vú£úŽÝ|0ïO¡ÁŽ˜‚‘TϼîÌÌéæ½ú9ƒP<æm8…1ãôûP……äR#PO­5bÔå¹[MùS{½N/ÚL6Þvz 6üÔ2§×óh³dZŽ7`î'ìë | ü¹”s c0Õú*‚óñ!ÿδºGï45 RˆSèç²Nwd«ÿËÞ{D•4í 2D‘ "0 DaÈ9çœ3"aÈ9‘¤   ‚HN’‘(Y‚ JEDÉIYåŸ3¨»î¾û~ß½ÿ]\–3çtWWWUWW÷é©ÇÓÑØÞLÒÞÝÊÙÁØQwRhºÐTöé‹iG†}LŠYà"üÎà>pÀ Ö¯R$Ò0Wm+{3 DÎVø˜ýe«{N`Š¥½ ¡\¸¡›» 4÷ý3`Lga¶pžgŒÌvÞ-ìI[í„ÚFìlFp&“Ž7 ¦|;ûË}o®Î*í3aª}¬üQ_v·¬àñ:«›#rìïµ3õ÷õ¡¹ãA Cy#TRæ?¿Ó#žý2‚‡³ ©¤Áw覺š¸ ß‘ñLï>†‹ÖØÍÖu Ä9 )zsÄ·ÀÅ®œx/c€G•V@:HDV‡|`30‹=õÌfˆ’÷†¸ÚééôW-K"d4ì|^”ïOÛÛ§¼m ü)\ÞÀHäÿ•œOû³P‘²LOpÎGä!Ý Ì‘‹f¡ÝÝ„gøpl_-`£ƒéú™…,¦î1ÙSã8|¸ZÙ»Á~Œ~húÏB@ °%`çHˆE ÄAPúÃàm7®ÚW)Öƒ ŽŸ.ö9ª_0ÍõŸqÍõÛ\sý®ÿXG@)sdb¸øE/©,…ljÏú~ÔûªQýÌÞ[ÿŽÕïF‡¢³¿µŠUþÔ¨öTsàËR`[!Áotí7d#ßú`Ec(°ÈBVG|ÏOSy†^JJSáWuØÔrýNöuÀ<¿S‡8+†¨òCI—_‡,5­Ëþ_+{fäbÁÙјîX€Í;vø/üz(„ÿ…\‘о\ëòÃ7ákж¿Ç„H—èŒÈÇvup’š©Dvß½ovÐØÛÈì6ˆüã{¶Ï¶³²·²C$ççáe^8ÙZÛ/YíážÔÙeßVÄIü0©iÀ÷Aƹ<äúcÔõ!UÔôŸ(ú ž©ù –ÿLÉ•xÒA ³P‹/Ü?ÿ“ç¬öÞä:š™ÿ÷Ïs°²³ç¸¹Ù¡ÜÜPVÄù(Û¿çþ'~hT$¤àÚçÑ´|ŒÌq‚Y“‡ ÈÎÚ– ~G _É!RðU Ll> oãaÆv ϤZvw¥¾uŸÌ3r$rð %!1Ôl{µ’'ôöGöm%wbc!}ãET¥Ê—Û¯Þ>i¾ÓÐ[klžb‘?q^层²‡"~÷>ÕGëÇÝ_Þ³úœ¨•÷ö_ƒž–q!pHþ|ê(Uëòµë`!žùÆ — †»§Z6= ·'ÐG1…=cë>óî8#FsO„Ç÷úUtûOÙrù¤¦í—RKTʳût ‡#s¨í\uûy”d…âå¨ÎßrÓbe¥¬Wº)Ì«.ÇÓ”©ÖŠè!íƒEèâv¶Â¹5wó uÓ6x;¯ÌÇ/§$®°_T Uc³w »Oé–žÐbªN²Hš 3¦xX­pÒâšzŒÇhJ µT¯ƒÃ½áü€Lÿ'_£ña°"ÔsºÁ£6¯µÞ¢žæ4 Í\&³”{={„!ÈN—œ©ûÒuù@&e]‘LÜú-gF&}žþþ“Ô[xí_•H­.·mÝÔ8AB-Ì䬩øYxðXa]ƒ^ͱûöà:bƒSSÐS6ڤǬmRß6—=º”Yü"À'9¢u±þø©³3«^Þ¸Ê'$dâ)«³ºÇ Wߌ$.fušØ·ðWÞ*ã‡oz:ylÖ¦™™¬/BmÄ:Ó‘/ËUÃvwNÈESóîÑ ]nËÏ ×ì0©Y¼!¥TÙ¢DRúªÏîzx°¨F¶cÏÕÆUSÓüùϽÖÅ/êVüT¤U÷*Eùqúá€Yl*,XòñR“Ob¢bÍm¾.­ —^\†fÑ{hCú 4dåFl|ˆlð¶x{,íU1‹È”êÈ9ÉX«1‘–A´\ªìƒwëºN+½è4 Í_Xòòþ7¿‹ Ó„Óãéúžç=âŽ~â­š¯ÈÉzÿâù¬&Œõ®{ÉI´s,“¾n¶â5VœÇÓnn³Ÿ ½û0ã=o¬NΠuP™=£áGÖS+> ïõ`:-U Ç tƯWÂÉ/©Fù;2f ÙW–°>¬~¡…%ÄŠð.:i\nHGêESRÊŠuí.¶gÙUñ;·zç;yŽé•Uå[¿]«{e54-ÎݧzµÄ"™us°¡I\0_zô†2ƒ GŽñ[«îv.ßácª¸ï†Ègæ;|:8ǧx>?ÎX÷êzÀ3eSÇŸwl&$ß99×­}'óÖ)M˜Nh k‘ÔyS¡®åy#-©H"º²ä³µ¥ÖNÛNûúÇPHËǧ—½!“ðžÏ¸{|•™ûþØx]’ÓöÑÀU1ÃáÎQˆ=ÉÒìãX“_NN? Aç*eŒÌÎ}eú ÞW΋zlþì2Ú±mæ¾NRÚøµâ)ãž_¯„ù5ø¬O»ûtdÁà&¾lº&^‡1™Ûèä÷ ËÐÄØr„§C8×±] €þ¹GÖíçî—õŒ³ßÁìÍvÜü pu\;. ååÞ½ÇñÝ jÀ××c Dffe,æà Ög…?æäåóp°‚ j®@‚DVx)g`o–ð˜ðÛ;ßêsQqv0U‡¹êC€,Š ˜§+¼ž¤§«´:¢*”YE ¾C9àî"î¿Âãê½[;ü±ïñF0Fpè†È[™¹€õAHz†`87€ä¾ªÐƒ]ƒ1v5Ò.îØá^æjŒHæÁÆz¨mîC²Ù뢬¢† í¶´OŠj܈zjûøØ7Õ¨AÙ@P6ÄD£eAY‘—< žCuؾ×3vò‚(Jé¨+ȟװ²ƒÇ1²ð¾X™")CfupCB² <‚KÀè–:¼œãk(” ¢meæj颿de| ÿqppì\±qóìÝ…—A”þî=4kŸ áK81{QøÂjﳺ› °_ƒàº¯_¬?é—†ªŒ¸´ÄN¿ÄlÍ~èô×½bgÛß+žÝ^Ø8¿s¾ûñ‹¼‡,ø?èDzßkpr#žq#Ëq³±¹¸¸w¯çÜpi±óð"®{¼p9"Êpó€¸>qrr¨ÍºsŸu¿¤A»œºjNXŸvõ‚ü ÜAh†“k§À‚oä“¿¡%žŸ(IENGAKvGIjðåða-ñþ¦’¸ÙPÒ*ÚU pTÑŽ ø=üé€Ñ‚XˆPRH¬{-÷xàâÚQÇŽ!…PÛÿ*B(‡õàß]ã~÷« 0ŽƒCÑOxËlߟ „õ3±‚ÿðß𜓋cŸy€¡Hþjìòö‡»fÉ/mLÂÊÜŸ.àóƒ>P¾•½›‹á>ºì‡è´+ÄG%øÊû—þO >Ué3s³™ÙX‘Òäâb7"x ¸—gAD]Lé ~>Ó;ÊÀ_@|ÚžUA$QQÄáVDÝf§ææ„OÀ1q{ „Ýö‚èìPáà€× >ëÑC`+ˆ=Äâq…§z]Lœa 6·+ì`(×!OÏõ½÷ȵÇþ¥è 2Äw×*¼\BB{‹˜š‚>Œè2äêgÆköo¤N:¼´­·™Ù>‡=§Âæk&ÉÅ!îÇЋ/'¬e»[TUWoç_©$mjhÍì¢ðºýñM^öG m ,Pñë 7„·Ö—.ÔÓêq<¥¤¥££ëáõZ˜9ƒóf§‰ÂÛÐBÅ#f®¬²üÞ½#jZXç—ÎØ'§…i;u:dy•ˆ `;+ý6¨—©”@!U&íÒĨ_¨I{ÿEÆ‹»ÛB#¯Ÿ•—–Šß¾¹¬Ø£%£Ÿ¼ížÉÿ’œ¯Pµ–JÿõK;Úû¢våí®ÁZú!åÌ,¡r°ì™¬ŠÞ£ýýý&QßÎÎn£¡ D=7«Ìw“Cy“†×$¥‚kýÏß7À€åòãK¯#y—“>ð†Óë´BçÏ狲lêq$š7z—Ïž-B{{"Ì:aþJõƒáa|c³Øº€>ß%•3RÍSÓêù §O5®Ê¶Ùõu—Ü(ÑV ex^¾]MÊ—†ÉvrÁ5÷Š´—Õ„¦Æñåц/_+ú0®I?._)Ñ^’™Ÿ©z@t™û# )¹vrZ·RDsæڭÛâ-Õa'¹Ê®ä¤#oËÃnËâÅzÒE(¢9FR‘*‹ƒ›ª¤'Ýiö9c+¨2!´Rá~î³/BUìzSïã›/‡>RáÚ›<‚òíÈ8´¡ôC°…þ¦Wüyô„ð‰¬€[ƒ‚yá´¸x¸ö<"ÇwÈÃuÀ#Âc•ýú åâúC—ˆð³».Q"‡H@$!2YˆD¢Q†¨@àó D¢ Ñ‚èBŒ!ðèælåb1E|Þb÷¥æ 3ÄîWm!¶0¸{En»øOë,Flaæ®È+Äw— Žpjfgˆ Äfg$U·‡¸8›ÂàžÙÕÒƒ¸íóÐ÷>úpÏýw|4tŸ“vÓÆÒPŸ©‚ž›Ió'™WI\”°KþP¡—£%©šD -s…Jä$!Xä1Ñ‘+ ~2ÇLÅn¢?GS‹£KÚ’3*ñhYX«ð-òòؤÜXõö+Ykx0ªï@cCCG7°=º¹ù¹ª±äXŽzø“'¤s·˜×¢i¥øYH¡.ºuVlý•¶¦ù'ZPYlÇ'9X{|oð_ZÄSHÅújqÜ–ÄæCi³]ï›N '[ƒ„žMi¼£ µ®Û—–[ðµ|gOÄYã’dsº×lqür4•\ -]è9«€ÉÌV×øQ+µ+Ít*µ£Å=Bªå<‚ï¶GÁÇLžh…¦r¸ê/»okèê‰l]¿V¯º™&¹i8‰†O.tËÓu*[yÔ¨ÎlôÈšÒ(0Nù#Ý¥P° Z©?Ó9’ã!ךš›@btÄÐO\nv6á/ \¤Ó"俆-¹™Ñ„´4áµâ%™{Tý„›×"¯y5?@Ou¤Í>Á~LÛ„¶ôê:Ú#ê¤k·_d_0 •¾wö^°Ë‹²ìzcÊ‹F®Þ-m㮑S=VSuãE3Ñ÷Ûd–)*­ݦùBxâ,½»pN…²(±ø5øö¦v´¢»¢gµhè ÷£Îì.\Ýì¾êÊ[¼I’À)yXhÉ|/TÙ¶œ WAzBáœñ{,ƒŽ÷Ù kžwp‚ZÑ6>é=]×´‹ÚRŽëœ5 Åî 0г0õJf“;º-§Øˆá ‚Úrã ‘Îɪ¡{Å<¤Ý¦ìä\|•V½ŸU nöˆ ”Å5ù\ùœåî¦À(”I›Q"’ûtBƒ‹M©ø¦½Žò_˜¢bEE›Ö+ôÜ”à7g/iˆX›Ä `Á{-Sz;-ÚË¥¼lœ±§HÒe¢ÅEài‚EÓƒêãe þÓ;ª•.H×Yå„.¯c9{ݤôÙ.Ϧ×"®m6ÌŸEçÒ”'‹¥Kr+ºJ\ñ¡g¢Ð“Õõo9Qw…äïFØš%ö,ÅÉyA;¥›Ò¢¼ÆwV‹Iá&õµ2õ„¡G÷Þ]t{ˆáˆað0Ø›6LjÉп.ªgmAôô$ë¢a«þ·Ëã6ѳ7¤Ÿ.×8î¼è¿EýíylôÝW_Ô«K.rt¥‹Ó»‹ž¤UZC ãOÍ}$TÇò]Þ[I79}YæÜUëüâ÷/^¡Ø1÷7DEdÆßXbEñ %¹ Ó×üBÉïý¥þưF¼Ñ]/‰G(„ó!ÚŠ]t6Þ8ÖžxM ?й3¡õŸ%ÿ(m6y´¼F¨¤Z úg)š;1kÈ@ ‡-P>¾ùSœåÓë)…1¸æÙŽ.“ å·i(oÞ¿(Àxl‰¸+i‰’žxFÚ"6Ëqù4¡ƒc´æå§%û)åîc,ž¥áÇX$÷ g#ü2$­0‰Ìü¾²[õ¹ª#:ù)(tëƒZrñLZÍLÚü’ñ+w™°kâße‰Â*jº_[Ú9;N©¹l 9Ë 9²Š'²¿|N1­ÉýÁâ’ ÆÖ»d\gc¦-R…vGz‘•4²[+ÏiNyÜ«†Jû&ÄD‹Ü¤¾—ž–P#ÏÍÝÿy¤1®ä~È«Ó&ƒGûˆÃ" Ñ—è"rPcD¬Z<‹ƒ¼FºëwÙ§8æl‡Ê>ªñú&s½Fù³(]|bµ<ËèàŠ®Ñ#¹õñnîBt~_3øš³ôÆÃ5ìñœÃ"’‹³Ò?rjE>~IÚléŽÝsTœÎÁq$, IÆ|ïŽgÆxÉ ¼Þ·/Ȉ†¥#*qÝ5µó\¬½n0¬b0û¿·³â÷aiø !“Ä4γÍ0xGê3é+† UuS’Û©¤'‚¤zo,µÏ™ Íš¸m›ùú0xìQGRªÉ ñyÑãôô=E2÷d_u Tx¯}s{€ùØïúøØíò¬@ F>Í’•æš;§êÌÊ+¯ê¿0cÕ@CËe*`y×J¦Zö^™ûé·¹KÇ6? gìÙìÚ![ }}Mçó=ŒÅ]X Üël B[Oº½ßä¾c;!V|…L­F”Rûó™l5©çhÎ ûÖ“¿Eäø èÄÜíD¹Ð–,$T·м|¶¿L¾‰iö •¯”´Ý] çY¢³T¤…ÓúÞíÁÚ[ùib“– @X7A Öåp’ò–d ¶esh0Sjü´N[ÇtüOÅlÖ,j¬äù*|º$ …Ÿ<çiærjªÄ˜ç×FÆÎD^Èö½A¯}úc;XìE+6cáM±d3±@T W¥)zÊ(ÞÕÛqÇnRF\¹Ä>hè·tÚŸWÇáÅØ½L[-Œ¥—¼ycü›ß²Ú’Íåh÷ÙHå´×˜q Ó·È6ÆF­ÆNÉðiD=A±é¥’$!‰Þ¼6*?…û2?çÍí7D0;i~áã«7N æ~:²Êy4Q “±BS/ÿÔí¬(Eš`6ñ%þò×g0’£Fî߯ֆ^ ›Ó¼Mî]œ÷°“.yžüiíÚV2ê–k½_¾deÁLÆo±­s~±ý@ï,ú±0ýrTWÙ·o•Ó'²SâµuÔ­Q޶÷š u­¬³–o¿ü‹·å*ƒ‰úUÙeOÑ9JÂáZ6³S_®kŸ̬Fù˜v·Á›‹Ïõª’’F.+~ô;_í£GStÆðƆÚãPÕ­¸/ß§VM:IìÂóá„ì4æ…sºß²òæãñ<æÆ`o fÜ* H7·Ÿ,Âx;j<úîbr ×ýÚ|\l4Ü ›È:ÿQ¿wuPk®¼œ­°#Ì(Q:â±Ó tKކ“¦}±md¹ÊNi4¿>ÉØ3W5‡÷1éhÜÑêë_‹oŒª©«¨ö7©Œ~‹¯¸ºFž„v]â‘Â9L+Øð¦¤yÖY†ãyXjÓvN‹á•¢Ïs½d b„mż'ñ^ê‰g¢íÀcX©ä]üævç,óõN§ØzzÐ q…`ò¢&Û3iqèiqI ³X„EÓ“ÍšUÔ|yH¬L¦.%U®ÝÍj4xω³²vSüil؇8?*SÍ3‘T®ŸøO½µÈ‹Yv­aÄUyTf³H>;ê=gí‘ÃÔ?{³_A>£Ø€ÿþs¡–³§ Cd6nÓ²]¾aÑžôŸÜ㤠ŸXÖéuDDEá÷Å┉¥Þšå¼ŸD –rd³X'à<¥h÷†þ+6æüñvGMÌðxü‘ÙÙ)Ùøã"èçp—_„)¹y´ñ¸Îpp >ÑCû)Xo*Ìà³hCëÚ;çÙÏoÄf ô/i q÷òñÔ§; —OÍ'\‚ì]"Ä9‰ O°Þ­&þ†á l>Úì}Z2íê:•Ä‘jfÿ#uT$ã!ÒØ›³'¢EÄ'i Æ0¢ÔÇ‹YqžÞe9÷E§­„ÏgÀØ“ëÌÊkÜûÆá7¨ä¿Î½©Ç´ÕÙçZ›®UÈÈrž±}†øMÌ4âÛ¯oõØØðºÌ]Ü®¡*»fv!X‡£_-äŠö3õ"©\5,9GmpÄ6¥à=£’^_tîÒDó¦®ùé÷ß—A諯\´O®ŸÍùê²HŒÁ{Þ!}UÀUû)9„k:fS=ú[&-+·¸Šh¹c¹ƒ^§ùú‹®éÁy‡Ú«+kù&·^xY-£W§r¿âà¬"!cîŸæò¿ü1¼uæQªN„有GîD1RxÄ'ÃJü™¾no%âmV.XMÝÒohj|{.æÛüXÉ’ñ·`Y=”áÖ”c¥ÏãE¬èY3T^¿õ*,Í**̪9Œß=ñ86"…¢6d&»9F¿¡KU'ÞHô[ß°@UTc™À°Ü$±_2š²#Ý×8RÖYE¾ ôì†# - ÞgI>vÓ˜-ª—M†WZ.R¿o–i‚Ís³½ùp2Óç™GÿÛ—AœÜ5¬!÷Ú·}¯Jåcc`¬‹Ð¼[:'tÜÄéJÉùÑËE:ìI×$xÎà›Çë‡<žZ>ßÔí"Ðo #y®ÂD…­Öÿš7Ïõ”çl[ÝéŒêbÜÄç÷*în‚Ý®ùÑ-IÆ0ŸB÷Á¸‚Uyæ˜M AGtŠª»ÅHVfnu²þ€ž.ì¨fZe_¾PêËwÏœ«ÂBA÷‡Ú¤±)ìßËW`_0E«÷>JTšã52éê†ÿVEñžÊ툹@líô|†Í[&×Ϲ2ÔÙKukðk£‰óFCj`ô1/º9ÅgäÅŸi*+žn+cÎßZÅ›ûR€Æõ£ßhs1%Y°tÓ£e£úuj¥ú,a( Åhh)V±(„â’\¬0שTõšëg ùš&ãÏÔ ™*‚ IñÂÌ…Ðüô?M•'ÆpˆìQœ.}_ÕZ2Ï»…ªÄ­ Cõ%Z!)œ}ÐÑ?Ç0ýÄÌü\ ƒ@vfè*UÔõÍ´×ÇEÝuÌO&\¥ð1yµÆ±b KÎê0½‘0º *<wFUÿ¯šNa%yÀFÛLÄ×;OÊoœú UP·èJªËæTˆ=qtmƱéù/ªðÝ9Ž7Ã5¸)êwƒƒ<)ˆ[ #°ø&7+øÒ^®NZW$ÉÙ»iŠ¦Ð µCâ¶ã¾@Ïò ÐÒ |Tøøebttb"nt*ŽqJaü÷è{‘#f#³”Z·÷½Å©Ï+ê84Iëì[eIfσeµËS‚î'xŽ=>`ËUÇWŠw]96œZxÔÇùh+ù=k]—Ë5sŸg_aæº/?;¥+lÈ»iR’dáý½˹»Ù‹rÕçÌlš[Úê§Õy÷Ž€™1\QˆÇ¢áûŽ©H ü+¾òŪjËrIÌOˆ-7PÀ[¾/þôòXaO«ò•´¼»h2Ëb“|¹døh~…[ðSF—<²™ƒj½šWe/„Éž<ÏÐçeÍ qK«ÈHOy}¯àèªÆ Yê¶Ö›æïVóÂerz¥òäMïYÝSMVOS ­ÿSñNÃÐÊ­á*ݤRª­åY9£‘G–5bœ]Ç%R¡ondZ’BYÔó²%Á)ÒUÇ1ä<ëçÇ=Û¤Ÿñƽ(úOäbžÇÑ´B`]ÚØÛ]øs'ÐþâÀÄQ®Ñ¬«¢Ë[®¿¬Ô[‡HZ(ó|“¡^p"Q¿V÷nIö0&™Ì¸HÈ)$'½˜Ò5ajiò¨ºb*ùëÚc¹dw׿HµÏ-Ýos I°hŽi©W² w Ó Ð+ªÝ~xbU®Ó“ÕD­·YZ8r“Ý dûŸèØDª¾pS¬!éK‘‰\ßsÚõF膗JÇJ%¥½x4/qUöàO$a²ø´Ó¿–-~Ëõ7é~¿£ò#™nó"tc´¦éÊí©Ç›øÃL!ì~Cøê¯ŒG‚l‹ˆŒ.ñ®¼2hqÎb_ªZTVžô´“¢Í8V1Üýî&÷]õœWï>sò%‡‡¼´¶Ì{®=k`PÁb¾4©î½ýãîïon.ýâ­ÏÞî”ÌÃÅæâÙÛoß¿¹tp»çÀv;ôWÛíP6ÞŸm.íÛOö’¤~²—d 19°}„hb1wps†X@,!–^Ž–0{ÄV’ò5b³ÞÁö×¶‘`îp*.Vž‡6”\=m*A< ž/ˆ7ÌÙáÀþÒá·½<g‰“••ußþ’¯–†ú«Z!ètÒ]M VÐKZ­‚ÏÖÉÖÜè•43Ø®0tˆ‰Êië–8IøX XT #‡oÜ „QÉ.k´òBýçÊ·•曆êªFñ>×­F–”ÝJŠþª<¶ýuŒ’êEøÈ¤4ûË“sÙE‹² ÇHùF!ÆÓ¥q_¢ã<^£`µ\&zŠúâõÅÁ7E_ BÙ/A±å, ²cq…Wœ=÷HÊpž†Vïfåø× !T?½†­ a!ÝÞ]Çu·Ý`º[ûâ,'iÖ%¥Ì.™¨‰e²v±ÓRQ º=º²„‘šHêÉ´z])_ùK£ö±@Fñ¸¸ríöù¾òOÊìlM’Ç)t¥ñϬ\ßbj?¯7~bêiêâÒæœßÆÅ'í%/mú‹ô·'o$3¡Z:5!éy"<”æ ¤4fñ,á·f6jÿc焨y˜`WøxN‹ðÁ5Íf{ÎÒñ4B4ýÇ7¯­6D™í¤Ë&PlÖ0á›èWž¸ÌâñÕ8EÇÐôpGšák¸<éÍfÔ·<[õZóSß0øõâÛ*¾Û¶ Ø¯ÔЩÛ]#BAã—u$—Ïûx²â6{{a^GÎàØdÝm¨]O¹Ë á{÷ÁñLG>ö³öO+â_X,[P$°®ôu¶°u rË ~°™1íæda7H2¬¬M 8šSJ¯‚‹æïQ kúMsX%(C‚õú§NæW „ädwæ¤åͨNsÇ)Êccî"ok§ôWçy&õ™¥ê\|t@n浕­Šòc$ªS¼%W°,C8Ê\’⎨t9BÊNðK¿¾í’öPê該´è๾ñ<¾'‘Ô¼Èí˜Hj†.!]wGTæ€[Yûç)éÆ$«Œ{#š–&¿úx*3d ñœ—š¿3G› Â¥©U §yt)ónù…头#§É4^ÇW¸k­à—|Ääâ`•®¶œOx{-dºÑ”œ¾òa LY[ä}Õ|Å…°æ¬vì]‚Sµ›¥¹'Nm5¯ ¬=¼óiìhÑØÌÄ}•# *åP%ídʈ‡Ÿf\ ïÑÆ<¼ú^Îù’VF½lgL8}å}¥çÜø «G”‚Ã': Ç +¸ò«ØSÂÙA§Ï—êsiÞc2©J$YŸ:Zï ¾À8ø–È ­ÜYŸÅ 'u 8{ÑàÈóÌñ¹ùK|úžË®Ð1÷ÒËä0™V“;=†ç29´Õºe}ðY<».ºÞ¼6™òàÚËÐQTŽüQÊ·%½jç>U“f}• *ÊNÇw‰ÒSë[»“8ÍñRÆûlr ÅÒºùi$¨öÕWCkø©‡ Xªéåá® «˜®º@¿iÚ[T ÁÙi’z|¡fÏÞ‹àã¢ÈÞ°¼ÇöÁ¼O®Wf@Zm@ ÷†Öc"µW&ƒ¨¸3ÆÂœ/{—+\ÑtQHžÎQ/ Þºëáá™íÔU;ó‚:;Ü9°*Æ¥yŸâF‰¢KZ¯ÔüK‹;VEÏX“­?ðÛ@˜´ÎËy½½¥VAülµ´¹tý}œ£q­ëvqŒÞB*EòÍãwÌìD˜üíé»ñ¦Î¢ea©ä ¼9‰—ºyS͘‹ôB[Õµ¬ÄÒŽp:®“ùNwoûŒJZ k´VåA›#µU‡pzÙæÐNƒ&LÞ“ÙÕô-çz“{[“ì}RaHâBד«õh.+ügxóÚÕIs@ôŸœÕõTˆŸé_:2ì;q™ì1eØ\ë=Œ%{c§Ð€#w­êlËåä¯{Ÿ‰’¿ÈPbùþŒŠ*'ç´v³éìè@ùTJò%‰a¦;þ´U£ýÙÌ¥6ï=•J4RâûŸž¦0Çžê1}åØU¶Ê‡ŠGH‡èÓ‡Í8Iõ:¬×•'®“Z¨fi£e‘µªM·XÓ‹“­ôãöûBNVtr“]»ÿι·äíN'¦ÊòÄ’Ç¡ŽèÇuSBr&¥Mƒ‹î: [ØûÔô½Ð'ˆi[Ifí5:šFðrqpÒf Åãt©øg¼c…voxeÊC¾Ô Šr;:Úž"uÛ’Ÿþ¦Ô¤ÌÃð&ýªô­ãÜ©£òö/gN•'sD‹¼£Ô)T¾Žçåx¥&ØéάÿšÎÂòðÇK…ù"mFÁ Ç1°5a_`xšƒ_½“RŽ1¼Œ3¢‚ŠZ2ËòÊã3F!¼™<Íq'ÓìZfõ¶ ô,þþõ%âP5}õƒ+áå%‡ƒZzjŽ.àBMVæœæìØÖö­E³”"ÅËë µÆ ukn9ššá¡$¡V˜M€¾©¢æH–aYû]¸Ï6õyØÂ1)dˆ5£S徜ð>ÿ#³¶eŽ_â7Ÿ¦ûJl·ïÚ2:¥ˆÉÄI\O ”|Ãý%ËYÐþ3,fzäÌ’9æj{~n¡”ìiJŽû1O—D•Na…Çû$-;{œ¿ÄŽ}‰SÏ®~D±ÆÜ™ú8Õb´ò~BJ“B§i•}„Æ2*y²6ßC ûIYBjúÏüGÝ¢ŠˆPk tŽ?’.Èk­Ìì½ëY®vþ8&³ÄýW⟳æß?rÿv¹]åNÊLÚ[푼†7“fW ž%n5²ƒg:ïbçàYú¶¸£òó¹àá\nÉôðx™‚Äå¬Ê0Ü…ÞYL뤎k<–‰×>b¼èðžOa~ƒ½YaNz}>ޝw± b2/Þè= Q¥h~ô“{W«©†"Ž­¡Q:fêzòèd×(5Ù˜2KºÈé‹ÍL$  ãÁ$Ÿž “ÄâzqÍÃ-ó¾Q€%¾`¥£|j¥Ç´W"¾n_Ñ·ÝØ¶Ÿ·Y‡œ»O|Ëv}Á4±º•´K:\e6¬R“ôÒº8Åå&þ70凂g©Wz¾- ÎÛ4ˆˆðBÁ1s{jxÌÞõ™þÃóæ"öa<4ÌŠàc]˘!¢–0W›q‘”²G¹_[Dks¶æ$EŸcb]¬NưxAÁ§g|”ÂZ;_¯Ö¦dLS,0‘ûð}ZYYû½%öHÿÌgf—-/”6õvæžåÊ(º¹àJ/_pcÐöæÀŽ:Üä\î´it¡'^Dæüý¯ æ/8ÍGs›Å?PürTKQ¥ï…#åËܼg\9ã+·¾mØñ¨ù Yy¨­<þ0wžU‹Qf¶&zÈŒ‹û‘×+üúªÎóÇTãÕ’…ìÄÔA&2\ÖÊ3‹…G[ݹNtT;ûTª±nåÈ!­¡½}.þj½sK·&Ũ*Ó/my§âÙ¼Dô¥jå"B”½óê /Á¼$Ï¿E6]¾ÔûÚ#åÕˆÞó£µVÅ}ùq®éÏz«¤êá´‹®.Edgt2Þ p 8QÙŸ=å®ÉƒðÒ­—ë4CËØtåùÔün”'KI– v-…Ê+mµ&C¡/.¸ÔVo²pÒÒŽˆ.f%=+}œ~.‘žçx²ßf”,"Õ%`õ"º÷d{¥>IA× Äê¤ØW'ãûÚžï-B¼Ù²¸š[Õ–/ݹuFÁ¦ïÔbîÝÍðåˆÅ–)VHþÊ¥˜j‘%®ö¡íüGcÚª¾hÌÄ‚þBCõá‘ ]Ý5‘§ÇÎ¥%=Õ2¾×ðÞsÕ¸ ®Êò02«V¦ã•wéÌ‚ O³$aøa|å5l늪OÁNÉW<Žh¼fåÕêŠKk¡Ã®H‡{†Dcä¿õ¼þPËÖDzïËÐs|ééÚáÂD4b®eõè²×NÇ2—q-oSJ†6gT½ Ðÿz…þ¶JyM˜ FyG•ãòkk{5=½Œ®‘Q5ý¡á$­óÍ›.VÞœAÞ¦ùÉ—ð²;ݾø/=)Œ­íTî¸Óñd…HÄ–ˆô9KKGFF˜ÉÌÕ V§{*©ÄxG¶ÐùN˜o¶tSÚ]cê†Âü‰6^¤5¥Þãu<·±ÔÛJrn¼ï …&Ÿ|¼Ý†ÜÖbµÉès#õ^‚+à¯#/ü.My`׌Î@êÎ\&4È„|v3~I6?^ñô6ÍcCRjVáÏ¥i§ Þ=dœ77 –î"2L+ñ.:þŠšÄP9\«{Síj¥óû6¾Öü<ÿ˜”Ö "ÖÜo¹øNÎqFIõI¿ætI–ò>ù†fPžc%¬ý浳Ġ¤¤jY|áxÑNú¡DŠm1ŸÓ4¼Á”'ԈݛV>|9öÉq‹_ë.Ù©Ü–—)iƘŸ$iÌ]Ä ý$1Ó”ûA¬— éoDŠÍ¸ÀAö;óíéºÆøÜØo•í¢"FE ƒÍÒÏcžÊg}ÒšH$´Ó(ê>W@Á}RôQ^K‘ý*Hî³PkGí™®Wß$ÝØ|âÉ€K4‘¥xG­ ½µ4†‹Ä"dQ•*k©+jƒ—瞦fò×ó}b•+¯n2ˆÿP¶–:k8?òù[Á8£¯Ò3òÓɱM. × ‰Ýâ»ø ©z$Ó¸ßùÛ_PMg„°@ß_$jLôzì&+'#z‚+“£Š‹‹£Š–›v*Q¯ÝÅ÷5 WÙ4÷ã1%™P¾:—ú‹ "ê( #<©§ºñnfŠémå˜ÌG…ÓJõÌ~Ç.£6ê6ZÕÚ7Žözùÿi³¸>Ô*4ѱuêÔ—ÍRÖ7¼Èæ&ñR­¬fO¯/CÈ…Ñx0¨ ‘ÝàI6 {FÛáþµý®ìű U®ü:GH¦må6˜ÚÎ ŽaÚ;¢ÏãhOÝŒh¢ºüþ4Þ—{it7‚Å‹B7Ͼ9»ÍoöýSã£÷zîøLÞ"s¸8dAgÊt×À‰¸_;¿ž¥\evX8åÞ¯;ïã^n-m–!kI"Ó]-N_å$KpŠÝñt×(¯r8—AÛËñŽ'Ó÷Áãî,¼—´ÆŒû¦³&ܣ宧ƒ‹ƒ2jêÍæ[˜P©UÍ^â’=þ†ù(Nݱ×å:FDWs[Ø#É8>L®¡ÖBƒ|AEva5/ïrNi¹Õ×ï»<·‹b›—J/<÷¼–5T~‚ðËquîÎ@HÊýx‰u<ÌÚ½µé„öü~+ÇÜ6ßÝm ß:Ò)µ4irÎi2™ÓúÕ ¿Ë˜³/¶ÃΞ/ŸV\*'ór1ë:AåÁ)âk‚¤J¶ah?´>Ÿ¦¤~ÇçláéÇláO#g¡/ (Ÿ4 v1=Å’H šUn\›µ2]°úvÑ¡‰ ·Ûÿ\¥y_“t>«ÝÈ)ÛÙÚÅÏܤÚG¯†NexaÉÞzs½ÇöK]°rÅÊ'RºÈ‘±ÇÔn}Á ½%˜ç@‚Rý‰vÅ‚ÉWIp`ó¨Cž–ba<üÔ+áÅÚôǹYÓö·wZ§T çêÛ$å'lZ”¥ÕøÙ½ü_~#<íw‘]Èt¨æš†g¸–D³DâÈ'.±ò"á\þbïݘÍ…¶ÉFoVÏ¥3Ç·Ëà_>a±F¤È*SýýÄ··×ù®Ò’¯ WÌŸ¯~oU?ø´˜ÁyÞñS.ª~g9Îý8¦î§²½ØÌ…­ê aõ™.AXç@~m5’b^?æ½Á; äÄ9±°!˜ðaùägv¢µœþ‡äÝçå >Ü­/XÓÄòÓâò…¢” vÌ£ñkVŽà·IJ;-ã²à„oÝÞ‘›à4¡Óë½›bâkvØg¼/d¯µ[Æ· Wˆ?G'tÍ_{šü­d$¥í¸ÏcO¥^¶§èÁ±Q#ê©õ//r$àHµŒ•[d[ß}nËvZ>[‘îÚ6ºC¦9Ã[­l¬‡öZw¿pò}_OGQawSÊÎÁµ·©' ì €ÄÀ€ôØVö‚t éÀVf‚tÚœŠ¬ŠŽâ0K+og˜º·’†©·)¯°¼–1¼a³§±#³9b7Ñ s1¤WS¢ xòyÚ9ÚÁÙ{ÚÙÚ»ðy Ò!ªðÁ¯Û:0¢ˆ« Ž¢ ðýw[+W0 / ”ÊÎ6w6¶ƒ!`­¡,\tp’Îfæ|jR;áŸé,]]ù vg ”——ÂÊacc†—`vñ²w5öd¶w9K·SÏJg¯š½ ‚'S;ˆ•Ê Ùmhw§Hû |F$æ¤ss³2ãã2…By¡¬œÌ&0N.f(ÔÊ |K•ÙÜÌØŒ‹ÊÃffƱۜã>6´o.øŸŠ³ƒ™›)ÌYNZE, d@¶†‹ƒ—òsüϹ‚+tG ð2|Šˆ„óÆ®0!6V(3+/3¯”ƒ•õ<+üÿC%Aˆªâˆc•¿Su_É}Uœ5à&!dáì`nvÎbÂû eaccaßWm§”ätþiy;**þ±Äìì“ÊñIì䥗•ø+MýÓ:63ÝcØ]F‡™)f C¤—€3 …slfÊ$¢2†·` _^[™"ÑÖ 7øCW+W[˜‚1Q[W䅭П­±½… 'óNz#:!M{Di3¤6l­vÔ‚¨ùNë'º‚ìŒmàrÏsývÚ¾?ûùç}w—p×+Hç8ÃÝñwo¼;®é6¬@„ÃeX?½0RXyÙxá.š1HèXYéàÅà£ëOJìŒúŸ†½oz:ÃÌA¬`6(ˆuïÌÅÉÉÎ 6ï܃r²AÁÈ'ö;÷ œ<ܼ‡î±B9¸Ø~¸ÇÎúÃ= úåØx~¬ËÉÃuø;÷á{<¼Üì?Ôåeû¡ 6nèå¸Yè/×}ãbãþñç÷ØÙØ~à…ñu½ƒ÷xÙä…‡ç9sppî“«3ÌñÅTu+o\o`ˆšƒƒ+ñeE0DÖÞÜ̆üŽ©¬X_€KŒKŒ“—‡—M‚[T\Š•“‹]‚W’MRR”KèÏK‚¹Œ]Æ·6vv ¤²Ô¿XC#ÿ2W©1ü™¬”…ý¿‹ÿÈÁÎÍŽÀÿ叨QàFÅÆõoþÿ‘jüw++'€$á¤i2µ+Â,l­X@»EÿÖPñ?ûªÿm´ ò߆ûÙ_ù/âýUÿ>àPû?@ü9 ð¿ùTüÛ˜?@å¿ úTý-Ô„jÈ ÓØ©ˆª©K‰ÂŒÔ$UtÁì`jøÚRÉÁ0d^xIu0~ú©o0ƒU€{`c0ò€³‹¿íì…&&hAK]WIYE]VÄbï®øì>GÄ¢¢<@$ÿY›ôÈØ9j|˜@v´Ž´¬}åt‹Ì؇(`ab‘Âè ®á‚YX¹Ã¹îw³j GʧpÓÔ@~„/ ÀˆÔþΈ±FÀ|p“ ;˜Ãf£1ØÑÞ ƒ¾Ü}/îꀠënìlelb Û)†€$2ñ‚ó£†è(˜ de޼²™½½›­- 9:9ùmá¡Ë.ƒV;à NȹË;œYÀ !åãæ !SîBû!Å$˜žäa üV;Mï"ØÃ`ðÉ‚°`Ys§»–±#J5°ý÷;ðÑð˜;¼3\¢nއŒßËýZs $๠"àwi#|8Bï$·Ç éFá}o¡0ø"gGøÈoC*ÞmÃÅa§ ’ƒ+ì»ÞQ)à¨à]`{5ŠnŽH÷³Š‡Ô bx¨Ijhª)µD4%Õ=8†|š€Ü1:s¸IyŠsRD»ðÁ]š Ê ÐÙŸŸ¤±,y,™šÂ}£¹?Ñ ±ƒ•%ÅD%àU~¬mgl‹\<»þ¬š’2ú`-3+$0lŒ±üçâ4{ +ˆ±ý3ZŠ’Š E¤p¦až–Æn.ÈvG*) UPWþn¤{°Jˆ‰n¥L`À QM e5СHÄbâ úxæßàÿãÿ(øÿø¾„<ÿ³sA¹ÿÿÿwâÿ¿úïÊàß•Áÿ©+ƒ}ËN°œ|Î üë‚¿º(øÏVÿ­åÀ/Wÿ…EÀß]ü#á?Àí¿áÿÿáÿÿÏ£ÿCÿÿ¡Ð_Úf–q3s¦PEY 0ð~è#à‹Ô½àuì\­þF|óÿVü¿‹ÅòO„þ¿ÿ³q@YÅÿl\ÿîÿÿÿÿÿÿÿÿíø_]C àög¡ÿ®»¢~i’w³}ZàRC¢ðþÚZ™8ç´ï¬m°oì@Ûô;!>@¿ÿ4úÞ­ø=ð†Ï .?ãNý‚yx@‡À‘e!ÄÕ|‚áò70˜]+°"`°8eÂË!gr%e I P«mDL‰s#0Á&˜€˜Óa;ÆpÛD¦@uEDnpÙÑaùwŠÿ_œÿÝl«ýg§Æ_ÏÿPV6..þ7;+0ÿ³A¹þÿÿ'~ÎZ™Û¸ FF⯩¦©ÿ¿ è,\ñ‡û „q_°@/΀xÏŠØ`7¶·‚Ù‚Õá“|ñe† È 0#ü¿¿ü„~;0ø³  ö«¸à/Æ©ëþÅàpßþJDp(hý…€à‚€Ò/ãðïƒñÀ߆~'ÄSü:p2?ùWVTw5d%Áê¢J²º`qIqyõŸ•F’ù'¸Ó¤Ì¼`(pÉŒüÙj¢€©°ó@ Áˆ-`~0*Y[!ö¿à B °9Ú›îÑŽÑD,aÆfðe>¢Ž‡¥•©%Bn¶¶ÈÍd\Fì"ÁÑ÷c¸ðr@}`o&nVð(±…(fë 'ëµs9óì†%,`Q33«]®ƒs—iø_c[ðNXe†ÓG03Û\vÉíCÖ|TnÇ_[Ù f¿D›`¦ÈA—‡‹›ó÷Ý!ÄHrv€Ç0v@)NÏp(,€yš:¸Ùš£Ðø{û½xËÁ‹å!i2æêØ«²/7„VRúíc1zàá ë T¼BÀæÐÒÏz¯÷PÕ&€Àæƒ[€ÙNeÒÄfÖˆšð áÚ( hÕ>Ø÷6Å>F0l’!Yp@ø*3˜1<8tÀN€aްO¦ 7 ÷Kuu@¸’U°Kéà.Èv׈v-a·9]¸4]7øÜeHáœáâ·uD*}[3˜;ÌÖÁð¶ð6áN ™„»FÄxÚ9‚nêà`ËbiìéÉ⃅€¸í·s@Åw‡*b7ÕPè£æp˜£Ìà¥í]vW$ȵ„1â°W tzgR0ÛÃ,à†ŸÑàReA ƒð€—´2ßÙßÇ|öüý¾A´¯ÐžzXÁ} ð® ¸;GŽjä^bï¹´Ø¿ñppF M`ˆí€;"f:˜#`€pîá30”M€ E+¸‰ÀǼUÄ.#`‡È·#]0˜z¯§.n&;ÇÔñµ÷ØKwpÉYÀ¨wê f7s°¥1¼*\¾¶0cø' ­ïì–e†"¼Ü­Á]Ÿ…±íŽ´Ô×Ý"À5B%ˆ'Àâg‡'êï>hw﹪CNébá3Ìe'>Úç/þô'.aü»”-þ©fÀúá,!ôø»þ”iÇçÁmȇ˜íò±klÎH§ †Oõð…œ5˜« † céà±ß× öw¿Fàé.O®Î^;QÐ!x£À,ˆ0}Ýg†­óÞô°c(wd_uÂÛØmk'pÞyGÐqœ6 9KÄ(@¼èX@.†].ø ¼Þ˜Ùs!H®öb€š0v<³ 0xíŒMÃ> ÝSæîøNÅÝ'kèªH*K!w ”Åå$•Œ4@gw½©ÿ ’®Õîڙ싊ø*êZüûp4‚ÇVÎp?mô¬\Œv¨ì¡‘#»©ˆì<¤C¸d×ÌÖ}óÔnçv–â€á™ZÚ¸xKªÒ»2]v‘]hÇ.`a0Ìf†þ¬Ž´$½+îQؾׂ2€…÷>Á|¯ÿ£&A*0ÌàŸ»•ƒ›Ëw% Œ ÂLIËü"·HLmlaöFH[ßÕ@ Aˆ§‘;&€õÀCW„<ƒÍk—1°±ëO¹#à& s`+®##Ó½•³+›‘âÛ;ú„v'¦Ýþ@} †ü‡¤qˆ›CÒA8¡=7vùeÇàBÙÆÌ .žÝØâ D£ØŸÚ.b^ps>¤üŽdØ” Ü4KÞÖNÏÿñè]RGCRMITAA,ª$–UÚû¨%«.+æ%$¥d᡼¬²’ú3z6­NÚî·Ç¢ÒÏ쳪ïIKþº >ØúÁ<áÁ ܵ{9ì­U7®‡šC¦ÐTP0ÒVgÓW‘U¶~x¨®‹4cõ_> [RØC8ðüçsÇaˆÓ‡¶ æþ=·÷_ÜÿÛÿ¾õþü_6NNŽ=ü_Vnnàû?P(Ç¿ûÿ÷àÿjFNrùö—ô…ð<ªHæ¡TÓ´ª…ñÝ3¿ˆýNœS=]a…ùœíÇaþ¯ Õ9Ö!9f™ŸyÁµaåk„Á¹_¸F¿ØSdT8Óëñ§ž1§Ì˜¦ºKy‚‡ ž¬­@½±I¥Uõ¤Ï¹0Õ2#ReÒÞ„9ÌL=Y¶¢€,X„› (¦”®}Ì™“•æþÒ4ÑyÖ‰ ,WvDÆóÖ˜¦Wv•dÑ3ÓíwÝäB‘ׯš]ü”…xÎÊñ máôšÒQ¥z¢κ|$( §êè„h‚ã>œ\—Ï$n’s¿&ÃBJòy±ÅY1ŠéåœØ#hØîȼ+kwÕ”‹™w—Œµ®ƒH›]+fNæ» ámµj>B¨{í‰Ã‹–'fNîÝgÊ,l •×íRæòoKŒåduˆŸš0l=# Ð5áz$L:_Åù*®™ó9]!ÕŠûæ³ëâô¸ï%æN½º¤"¿š|w©rIŒ`ÌÑB ×9=lO-Ÿ½ÅÇ]ýñú7å©'›_Þ˜²Å+n&Ï‚ü£oØŠUÄ;ŠzI3sƒ§¯>¤3Á凸S;]~Z4Ñ+y2SÔ‹ïÅk¹ª¹Ól‚Úôä×ý…ñÉ.µ^Æ÷%¼O+8|B:J^£Žº>Š”Ðªí†'ÊÕO’tþBAïÎrέ”ÜêpµJ1ñzMþàѬZ(C¨¥>ã%ö‡„M„GŸs[7Ÿè»ïQv”Q¦Yï^F"ïàðùõsËþ¯Û'Ó:Þ¬T­7ãOUʾ\ÇZï˜Rº¢ìÉç"wû$ÝÔð…q¥“3Z´'nT‚Þ^•ªéÌT»h3{*çK~}21Œ·(»€fh1ÀêŒZ–‘ãcNZˆÕg :ìOz80B/Ç[â²÷ £¹aϾ}—ããU!f&©b®E¿(±þœìkµ„¬vA™ø»ºÑøs’3‹0°‡–¨lëû/dº [e#s*zïLRßæu”¥ç—u¥]sô<ër­٠\È«Êð|µö€Úãó5µù¡)4‘-³Ÿ¡›a4ÜRg¾ˆží3'P®½?£‡GçôL¯RóAyÚ\^óJÈ{Õ-ÎÃmu|²En³‹}K¿ÀÚz/ÒdSá†Xñ½Kc¤çfçb‡Œzîá×õßÚØ2Y¹0ž¬ÕÝ“eÈ{ã”Òöý›ô›,÷2‡ìë¬³Â¶Ž *r´{Þ¸d|‡)¢„ês>‰•Â:ªz]$ìЪÔÙc'ã5Ë7QD™'ÊÉKhzœ·Ó–™ &ê°&}`â늦õøhIá”î1{⇠%´8¹Dòµg! ©¶+UÃWŒ_2¡tv:MnkD¥‘tú× »pwÿ/Èîÿ} »âêRJrJd—ƒuÒ)tdw?®éA\ÎAgÿ)äÏïP²ß±R”Òý˜£ßQS÷¡îb”@²;¥ûàÿ)Ø_UM51ñö÷»œö÷0èïOäöà/ë?÷Ëú?ö»KõýÕÖÑÕQ×þ_ýýàw?èïÁ¡€-RA»`¿»jÛ…Ûýò—õüݽúsÈß]Žÿ…ûý9öÀ¯<1îÊΠì`;óþï—÷ ïAÖ_HÀ¿ ø `ì@UB,¸J Àì¡O~‡ ðúçñÙ¸8kai¨kŸ¾ ¥¸ÍwÖÊ:ƒ ¿bJmÕò¶½%·jAZ  ŠÆÒ'D¿ÀUFÇMåO{މ:0­•ú FÁËÉ¢kýª6n|#Ê3B3ÞæÓÆÊ=¼.£ü u.cõk_·×|·· r9yz‘õBXÇÍ03ùŒ7 ·® N¡­äÅãX÷£¿×¤M¸ÚÜÓÜ“¡ŽÃ ¤ãêNØ?æª4)ü¨ËïiÎSé¼åk“×]/wõš ´Ó÷`2(·\ò“Ž…øœeâ¨XŒ„¤ÛH”]/¿÷Ìë“|ƒÌ­ä³Ä°¶»ì™y ÝÙ~[+9-K×ÏÒÉÄ«Âz‰nÅÔ=ߨÆ:\Ÿt;9š.:'“$9Yîêúèq&ñI’ »§•KuÎTâêß¼ˆõZÏ–¼’"¼9£DQ‡ƒ +ñºïµúëNï:KCã07CÍâo NUoßÚ”8aƒUpE0èë92Ž0ñ1e=wõ²é.Œ°çɹ 9bãÏr§F]»äŽæ8š¾²ªDyuJ®Cuïxªhÿ8Òx6GµÚXœÃÛ&bÔYÁSiµÒÕ!+tʵWÏ }ÓŸBçžT’:+¥h?½JðmŒ¢$?oëEú‡õ°A±Põª;¯¯j1˜ò©tÎh€ Z+h·«^¡»òè O[púâÇ- w(³ »ôy:òÙ9‚°â“ƒßÞô’2[ô`±ÜpõÃZÚÔ#²\®ì²Òj_—79G5JÛ)d½¨3‚½ O¢Né ÿЋ^ìÅ¥®ôwDë7âxŘ'ú‡t•Ü“›rÐÏ= {n|ËÜãgtªPQÃ&úÖÕÑ´äÏÔøi+Ÿ#8.½Ì,‚r£œa¹Ò1¹XXšùíZnrüB3³ð¡;ãb@ÓdùëgløDÃ6†,×0>d?Vнi‹éùYÈa|ñx+?‡‡ÑWÛñÌ«xáø—ú¨)Ñ–¾Iõ¹®ŽØSÚ i É‰†Öd¾Vý‚2ª¦>4¨7Þkqþ¾KhLLŒ¥Z.ÑJðň'¥z…Eý‹áGX-ŠÀœÒõRóï:¤£’Ô7jÏæÄ¾"]»\ãµõÙ5¢þË8ã³Ä{Ö•9ƒ†jxŸƒôî÷\q9|´8Ë|ºiE¼ŠÅçDaÆåe˧ø˜[szíè/m»ï¡$u©•­2éÊÞ7üHÏ”®íí¬_pÂ]z~•Σåxò§[9Æl>â¶«_‘ÂÕò Å±BÏ(½\ Ê-·3Ћ3 Yî?l¯,ézh=u5Õv8*½çÅ©ë"ád¾×ôÚNúÒ²®_^Ùž˜n4$Ê•?ÁEBå_Ì;ï2îx°kro¾>*sMòÁŠÕœ| ñꌞß,9MDä*9ùÉWßÌÏ-«öøâ¼¯`1G[å«ê}Wªío¯¢­Q5wq…0@CätL»o|Û/=»ƒ»Ú¨gYù*(Þ^¶ =:¾œAíUÔXC_§®&+»Và8øˆì"ŠpÌ+ú¨(9Þw Ÿ 0ÜÕÈU4&ÚY9rP”¦C¯NÈù'p%bÄùÒr5' f”G ‰w¸ø{g e.¿žþRWÄLâñ¡…Ï—êaø*Œø¥k5yYèSŸþ&Öèn!¥³\—m›Ãƒý0UqmÍ>²”ßÊY`ÈEsl?¯zFïÌóxçwËK•”ÅÇ”™ÎÝŒ\QWýÚ%{ó)ª7Ùèd¥N=—i8”¶02m «í6ý}‹ì¶ÄÚùä@u£³ úýägð]îWFN¾b Ì—W`<ÆVS`Ê&{úcád„rù[˜ô5sRƒÉ×'×ÃÆ˜í¤Wž'Zë^¦ýܽZZÔ1ƒAÉ2SéÇÎçN8þ1ë’CºÜµ^ ÉóD<†`™9blE—jÇçäy ·|Ì껓Žå3u Õè.„Ùc¼›ð±¦µ*7ý=Õ7Ñe×?'¶¼º|Z¨ïx#ÞÖã<6ô53뽕A‚‡´õ/¥HO÷Yâ9ÆßÁéÛ|Dº¹k ˇ(Ô$ÀUùK›Ø¥6Ob*U”ËB–ZòPͧGð;>÷jy—ä§ ²fð8‘˜ý<ÝÃâÕ<3i¯åý؆*K° OÈ5YæaL3‘·Ïûfìè[1ù—*ÎÊ6Šu7¹½ØôŽçQWötrøÀ‚ö:)íÃe}Œ‡¼ÂÂ_æ‹=¬™Üh)¡­Ó['p3ü©ÎÖŸ%=7锨®}•Ž¢þõlQaÑ —ŸË½üÉylñȺ¿à²¤M;Göµ>IÈô}‡>WæêNÔõU¹gôÄVñ“äÚ +!Ož¾²¼ “”S—1-Öe5ùL}ŒÞòqäÛ3R’é_б/#vpvPꑸ©üçÀ‡¹ ½´7h·Šy°uºïöã$|­K¨¬µ¯¾·ìøj&gáBý3Ôº49Su´hIS–Á@ Í:ª–ŽJ0{ÜKe_Þí1â 4µ¼ŽeçxÚ£iè F¡GôƒÞ©{Ly4OÉŸØ·‹.â¾o ¿Kx*÷RmîËõx;©ð‘bA‡ K;¾‹ãá6 =å*Ê­o·.¾g_ ¿D—Š—®cºHžP1ÕSùKº½\pŠïþƒá·ù,vçŠD#GÞæbdmEÔ¡ù¬½%“‰_¸EØxšø4?$á&·™mØ5‰Rìî&×ð³zÑzyé³÷QUì™Jkq\#Ÿ½a&>Ë‚{…i8Cuî¡ô@ãÕªûSŸ›VšæPŠ™^Fåã|*#è‡Ñ|ŠñÜâz€ÝpœÇw™Ñw•ÝS2^É´ÌZC‚CÍ*š9ŸÍŠx Ï/#¹HÓƒÁ†ñ’çÔéó"658ÏŽÓ¡%N _àIŸ³—kÕ¬¸’}—!U"»3Ö®÷©?þ£övMÜãšm/㥩ßMz[{ÖqG{ʽ{ µž‡¬KQì›¶áÝ~Í[<äGSëú¾ê7ÍÏq$õ2ƒ/G² †}v‘ ¿Ò™Ï«([/ðœl/{—ÅÈ´É©±œ;çpLãuB˜SwvXåëÅS`ÅԢضµírY¼ª1òGÔËbÌé5Þ†Öq+kr¹ŸðØ<:TüˆÙj{Ckø”ÄöÛ¬oŸ+ϳÛKá×?pŸJÉUxÔ÷XÏúiöÑ×vÑ-Ù}üÉ,îÚƒ …‹â•¹þèúŸïüŸ]ÿGÀõ‡`ëÿAÀúT±CXb^ÿ7¹ï|LÜrv¶ê‹¼S}ÞaÒ^ªòâ6䳿W¦—qêÆŒnÖ;†l[4 ØdkW¿‚= p”;Ik›¶-añ ?î˜ùCŸl°µœ±Ê÷•X ß±7ÑõÎÔõô4¼¸d´z{3b]w+x‹eóF'öõË'Z’)9úU.Ñöóé`õrøc/¹nƒsÛé©™_;ÙILy4bLJ¢ \o¹Ò”úÌÞ•%ÛÂñWH·14el—”sË+Ï?Bü!Üõú‘ùgÑÖ<…zSóFnžàiìñ4j2ð<5½\C™¨WhÏ…Ãæ?»!t¡^þq um¤ÇÛgö…Y}=ãÆz”FZŒÏo½åÀÛ¸);ÁþL쬺¯orýÈó×qßú;}M ä>¨÷I÷ ð“>»l ©Š¿f_Œ8ávl:(TÞl©“æ‘'ž÷cÉøö'RO ‰ŽË¾™ˆõɳ£¼L Q•œ(¦-æs—¸Šo°ÈåGíj Aô˜Œ¸Ÿíœx~FSzg“>Ú"‡J,w>ùmÜ\ª’ú'l–ùÒÁG£Ðü Ò 5“¿Ø…Pù‘ûYUlK,p{¶ð*¶ïÃ;\Kuß°SyÃØ™ÏêÉÓßîFz r-ÒI”\9›r߈áEæŽç\Dý²èdí1Qa(¸fƒLŸ3)•É™ÎãÌüØC°°¼Žgn¹D¨œjC•}ñ”H“hó¸Läi)Éô”µ8±ÅCVA-ãÛ•)£q_qµe.¦ñ¦cx0mÒ3/ÇLD$R#œòG®¡~{倱Øþ”.Ž”¥k$š¥aU@Ò&Ý\MüÉ9SãY·a”pë÷n(Ú}vW¶ïö¸2å÷ðrüƒµÌ6þ£ ‚¹™”jO?*þþ‡z _iªi¯h¬Ÿ ’djž¨¹mréÕ™bËóͬÑr§ŸÀÎ~±¬Ñ·•ÖoOv±ÒßLVíJ|&÷©ö}}yuÓ¥ê,­Ò‡X¥'ÚªcÀxT›B§‰ƒ9ó½3ZX9KY.Of’ª£Ç¬èÍclWßéß^_~݇yOº3bKªê¤ÜìØ³¶7RLfI‹ôú:×êo©Íœ:©òMÑÍtñó)†Ëm Î"ŸÞh¦S’*éÔ?}ê£p7çŒmuiõqCØE:Á~Îam‹ç$\×Ëôä’¯rtO>É;LzÂM渷ÊÊBgº²G>n¨:‡2Cfí㑇Ԥkæ”Å3Òq›h” !>LYçÃÚÏ÷åž¹­E™'[ÜÃÉ@°ò¹Òð|î“o'! 4Ú¥Þ)¨I¹ÇÆEµxe(Ô=f¸çÀøáæ©—ïß3ú„õX×_h·lQZ^œ¤ZŠW s†±´„v+Ýèe);O¶œHsR€¥­±ÖkMj8žñšû¢[%ëV}fõÜq…þ“ ò '•꼦Ìz‚D£2Dã r»ÅâúE¡I^b›ŠåQzÎ߈ðëdÂ8)ÞY’ÄŒ=«¸q‡î.îÌÇþ´O(ÏÏ’Ý®|üžþh‹1nóó—3¶ýd)Q!  = YÝr:ØÆ×«ïŸ±vŠc’«é?Ëna±td) ÊÀ[Zœ‡>ú8•ñáy¥nU*éohk¬dF…öbM8[¸Ò3Ï,É8bù¼+çÈ’ ŽË|\ … <æ—¡h·–ǺÍã%[‹+x; {îî]ýĸV«cÝ"âÕ­eâÙö:5|¡f™6[œë<)Å…¹;ÙtÙD÷$ßë¢rÑ*þ‰Ú œ£w_«)ä¿ë.•U¿_¦fzôËgîò!‰ÏŸ+O´¤<³WòwËm(ji&¸A:2nþyQèÈñTý ²Ä„›š1×âˆ7)%¥úGè&V<1wRÌCMGŸ±™¥²h¿]˜£=θ$ °–ûð:„åӥ˲oÖ6ÍñoÔWké´oû6é?èpL|÷Þ§‹ÙCà“4GD‚ÂÃ(ƒ@2¢Çüoµ*0SÍô(‹X.,D‰ ½£4×LüFÑ$k)m„}Œ`MƒUWôÃçüpn¯ÜµÕF–s¯«ý±¯œÅ'd•ªé6æê—¹mvÔv”Ã{4–Qa¼HÂw™ã.Mì'lë.ç¼kw¶¼z¼?Çxò ¾¹W#–IÀi|=r¿ÑBÕK6@ª°SÓÚ™àD^5»±ÖÌ[ù¢ ’ÖÑ9í3C®•º]\l†ïeç¿hâ(nøMõ+yð‰©Ct>†Ã¾Tµ¯û\ S®$g¤-XÛyÍ¢õS˜²fDUR96ôìùcuŸø¶szTÈÕ¸nG<(ùÊô0á´ò0R‘/.Š2òVÔ=M/…—nš£ç‚Åt¾E^ÍéUÎÄm¤–‘h8O:õÅó[l|­+~”îÕ“jŠþ©¸~>O·hf¦w´·¡á f.æ7`¥ ²Úú§ÊžžVºgâ$pA„+"èâ§L]Œhù#˜KG¾„æhyæŠH¸¬*Í êg¸Q‚u=²†v¾XIx$A٢ۧЦ"‡Ï_äû*ë²YÚ´0[LûÂjFæ{L¢§iGâ§N;òDº8¿­¤—¼”M¯œ¯(q>®þVøz€ ä¹å$#£HÿöÚåÑâÌÙÌ…•!£@L¼‰ÚÚ2¾‘Û»TÏÆÙjõß¹ù…5˜ˆ,>u«“»âÀp…û|¨@<®@R+†T[õªœ+ ßÑöšDÛŠG«…òl!´4ìÚ1w^ƒ§k¢Wê'B§j¢]øtòÒs‰“ÍÒn}cYŽæŒÊËT¥ž}:ÁûÉ2¯&I§¦-»§ýTè킪¡íîöÛž÷ Œõ^ºœŸYº8<&ߪ$†}•s+”31²oº—ö ®/ꡤ†ÝóJd9ÄŽè³EˆK®s=W„¹¨®Ò*_¬½‘E£^û¥[t;ûÚlfèP5µÿɉ7RóÇÃ;³Í‰ë­®¡-=â»õb¹Y#¤ãÕYå4!¹ÁY÷‹« ŒÍºHkL®ÿ ¥ÉˇÚ펮ܷÙi¬Á²jµ²ô„Ï~W¬ÄR=ó8.ôz¼œ|ïò ëëÅŠ¤Îô«»e]|›dDAk¶Û·3eÏÝß~Ó};xÉd’ã©umñ½ÒwÓ™wœÆß»­?!6å8ßõþyT(5š8~sá˜ïC/ZÍsÂEîÄÃ&oª3ôu†tmJ©±­sËl”Iq,¹ìEâO<陚_˜%ž÷YÀŸæ{ÿp)=€ì®x~Ÿ)õrIó±nOOžJEŠ”ôÝ»y¯|Û9Ö5R"+L²õsC,½1MǓƮ½ªµ($ j 5/ í/|so¹/¥Ñ»7›¯ió|VÕÈV¨_Ü „ñ£—%{PÏ OÑf’õ*ΧŽH.ú}˨yG¦,¾®$:Æä Ý<É¡g"ì(é,çͼM±qf¤ ÿ:ÏÂ]:œKRdBv•¯{p*[òoNeÀ¶µ¼9ÑðØ˜·\Þ¢‹;S ¡†+¾mŠ|жŠw_øYtCIØÊÕ—GœõÞj¦P­YÅ ÄSyI‹}ž¹ ø.\ëš?Ý…ûKÝGRñïÐŽZ4áY0FŸõ9OâsV›Ù£ÁÇûk«¹GïýîúµêÇñ3±7H¿žAwIô{_kKæÄ#LnöM“ëÖUïEÆÏaCî&³¤DY±}S¿®“:yÐɳ°;oLRIÇ.«ê¬$ë¡jÌÐf÷8Ovoñ\ÆãüP ³d –«s÷¹‚ Ès»ŸYÚß×z®ú4~®µýe Œ^R·m°LC7*b$ÌX"™³°pD‘ü)_ßãOyƒ°²:¯€¼L^}3y.kœÐÁ|¢ý÷NjÔ‚ÈÊÎjç±á醷ä7Ÿ½ÝßýÅÛND*%›M´G¢U3ÏÙçBUaiQ Ëü™r£µÖç|*­%¼]ÎSœCnœiW3B90$l}/ÿ|ih Ýy=Æ‘ NÔ‘«$v‰Ãni5ÕØÐ.Ÿ*ù—DV„- a yZQª¸^ö:]tv°Sdw’Îø,ê¼÷­E9YNèøÙÏÕA¼Ü^§RšF“4BzÍŽzI_²x-çKúøÚ„Ü• îWKˆÍ±SF|µ×Ÿ;Ö‹+×h(Ùl¤œvø&ªão=m·aüþKAtû훉Ž<Ýž+)Î=ÓÑÅ­}wÍ…5ÉHpÕ‚Js²¹E}ÞÓÙ)›Å¥»¹Ûè2bTšGý/ÒÿwqÔÅ8êÒˆí ¹½ Ž?ÆR?£nsHÝÞÊöûhꌜîqh·ãLçàaçÚ˜®½˜>¥’ÿŒž«Ô»À®Ð3s•¯¯4,Ìœ¦Ð~î&ÁÓ›¼"GÚ”ÄdÀ"Ï…Q /©I& ZÞ/TsÐwðŠEB¦?Å›Ów¨_÷¾ÇDb–zm{aa³q{S·ù£.zø“ʤ˜ÓwJùTbNŸuÝn \2†Ê›C!¥¨„J_ù*®¢Mß´5`(avåJ$©Ø»ǵ#]&vá2#,rŠÊr2ï'>{¥Uè=å×0PbÿU_ÞÔeÛö.¢úz&úD/ñzäÇj"U=ë$Ö5k[­§½ñMw(¾0¯>yçæmÂèo~ÔtEúÁ”Jv_í§ó‚º”»BCW{¶›ªƒ–°BdEµ1ä§xÍÝxi“ÑïàéòNJ8PGê̹#ׄ‡\#– (½uŒö Þ‰âãTÍš'- •&ë(^9Á³YÉ„¹4\Gú#ígJBŸÐªkUX~&ÂNþqâ'\BgŽáOz™œŸõ<!` ”®“±}¸&ÓI;yÍçì^¯î°n°îX~)e—ЃðûIwg®GõDáö)åßÞ¸Ñ!ß«»Õà›Á“á<¯ô£ä…KÝ358‘’¥ÂÂï¿Hc£c÷CZ/°–Œo6BD°}IjRFSÜ!\> OÐèz[ê>š)^ís<Û•PÖü µùÒÇdñŒ/ò}-¯Ê‘¤ÏÈ^ôÄ%ŽRU³/*×8<~Ïõ¦oAû‹{&iã®V—¯ÄŠq^Ȉ’fF…O="B¥kªoݸtd>î¢6$0­“©%™C@7µ"Œ;ƒNÑ» Ùö8Ü’W`"í1ó{ç¦c¸.y O+É壿‡ºü$ˆã»D÷=bK‰a„Þ95çï~»½ £UæÔ‘¾öêÓ”¹NP2ƒ{±ßróHÒ&„“]]·l«:ŸN÷ië7½ÿ¨M£8äX õ|ó[ÍY ©ùoê†tn}ðéÛ#GRŸûQÖº'.@+´ ­[½kJrŽÑÆ$bÞçÈäÒÏnGõ±Õ¬|u âˆðøIÊ:¿a=óçô§—ŸžDåÆõuºšª_oׂ™G†ÚC‰Î{÷A´ZêMŦú1±Ó ÎV›FÁªüY5ù§œž¬Œ¢wz×¾.x¨V£¢­hϙߎCùÜQð- ï€nñ»µ€•”G‹ÄÕg^cJÂÐ¥±(Tô^L|”€•ÄÐÝ•»¡¥še×êR}äJ!Ö—€Â<çFRdK¸$çñ¸pMk¬¼PßÀ²¢¾å'¼Û—Xç|ß< ¼µøÐ£È"èìÖ£(›.îG'y ï”,‰µBÉ🭚 )Œ›E &À¸ž¡è:ÙËfNÅ1>›¥×‹Ðʘ}•PqLh`UüLÆ7Ðx`Ä(Þi)Õì‚ÏËòOÊ1m_\g[Òõ {]’„5QäÏ¡›Íýa=ä’zô5·­ðâÌÖ\îïðŸcôVqn,Ëx4ÍZ5ô¦Ðľ…¡^¨«ûR‹òyKák‘æÌQãœèÕY®¶"]ô!ëÖBš|ç&»ÓOC‰Â íêÛ7TõqW[@'DN-ÄÜ,éåÌU|ku}È’(ðéÅÖFýxQosÒª¸ëì)JUÞs Ù—W ÈOÙ3–œ ¶Zgß¶9yCƒˆàÈMO+Œ‘øÝ­žOØãgËÅDq?œ'~zì´n®âLÄð»÷yÖöÓø8Ž\jO6Vº•6½Ø?¥&¼5µî-¼9c##¡æ÷мæÝÉ/'Ø#ê®l¨Y¼:YUÞR"™õÙ-œ\ùy×vc é Ÿo} úÎS5>´èåQ’Ì/{*,,õ/~wS359öv<É‹;|x¡Ub¨â“_ååéÓGbœØ“˜¦iƒe•’èÏ£¨_e<ù Z[éŒÁCEaôLë¶'¯ìÅ#¢É©u¼ìnÒ ÕT»õOÒ³t»ã,í:¦õ\e„ÉV¯fq•ÕûÊO ËD‰eè:þ…uu§Îk¬±gº7Ç»j=¼DÞJò¦‰²¾`³‹„N(pùâŽ;GZN-í)¥[| q”„b MÈ3&Ÿyq;èÈI¹UÃð:ªöZZ”gUW7-úßppôñ}Ã% ÒLƒp¾ö¿mo_üÜŠ„bš2íYÂ×Þ­Ùê{g$ yBÃ;üXß¿¿h47«Ù -y-‹/§g'—yaö©¼åÜ ™—y÷5ß…•oÙŠÐ…uã c˜ºýÈž'Ç!˜j®³îÃ=eº‹ÝÚ¶ÕÞï{ ’¤Rbý4ÚNL»˜i„–žÔA±è?® ­Êp‚®Ñ4Ú‘ÄÔö‹ûÛñPcÞ­›‚MÉw‹¤ndÆŽ¥¨U‘Ùæç7I5²43|qvU˜wä=FÈØcKŸj.­ûÑï»7ÏaÏMš™3×n&*~1§ëÊTËæ'&Æ·Øw ¬ s"1NŠŠL²-n&>].‰øJ;ãbheYIï‹M|{ʘ›ýXÝ:‘èVë¸aŠ9‡GQI¾'³¬­—ÈË»R" €[¿ˆ³Jçè,N蹯fú»ÒÃo‡v͵¬ºÃçe/áÀžD¢5…Æu§hJê£Bë1ôOzÛ=T«žè¹jåNu ÓèrW”ã-&XÛ¼oqÇÛ ¦l“½F|E2Ô=hͲٷühYÏg­ ·åÄ6…w¬"·=ç#O›à²½Œ¶ýȾ$(ySFÀNŒíi³èá²Sº¡ÝãÕ¾,?]†U—‚+ùÁƒLÅ/·ÅØÏ3èvæ3fp g'–)ý2ìÑÒzo‘Ùìú n2vt]uZ’´à Cç£Þ´Ó3Œ¸z*Çf¯\Ú¼éÿåwö1« óÔLJ®Ó<<:[¤¦x¥ðîäà‹-¥×Ôl0™Å!þØe-µÉM蛹“ÔÕÎ1AZ†GnK1w·¹â?zr‹÷…³Ôüh£ã¼å5”;ƒñ3J¯_$/&…ןSOŸÑ$\v1¼Ú·Åv£!=»æú• J™VT•ø1Ÿ˜”Ñmv#±š ™Ëayt]ZIÞfY#"¾ «s7ß›AÉÆ¥ì›c-'„Žeè_¹ãü{põ•¥çíÎm·FS½îq] ¸[ã$+múÂEøô’C#nÞÂÂ…` aJÁ+Žs‘Ý®0´Eƒr' OÕ¿3ûö²/H¿Ï\¦lÂOÉîM¸;¶õåœ ôôk£ÐñçãÆŽXî¶Q ԣF$ë~ï‡j@FË©Xc†â/QÕÙqЬˆø;k+Y^¨ådg‡BÙ¸ÑÏ E½Ä²“Vúv½ž$Îõë3a…5œë}†èŸÜMuù¯;•‚oð¿ô`ˆÔñ6¡¾t£$Áˆ†åUÒcó»µµ ìùïÒü,õ2uÀʬuÒ›4ÂRÜ2_µnx‡ hñÐ ßÄ›¾xôSš¹ÜGºÑcÊŸu ˜^1Óû<ûhÂNwÊÁ¾Çœ‘Œ¾“·Ÿ)ÑCO7ãür‚ÿ÷“ ³™Ü>É«u™ OÛ8ÄޤÞÔ¸DØü‚ ?£¡q­$Ï/flÄ=ŸÜ5ÈFz³*þxUóf Ã]" Ô™wæúª7FÑkEŠï~)ïxŽÚDbXŸ‘,…ñâÜC$в1`{œÎLG`!~±ã¢oÞݵ¤‡Gß^pwéà”U/Xç ý,㘄GHC1D¹¹´¶5Ƽ•}ÿÄ"Šymç#Aƒüû§…êÄhô»Ô²¾H˜ÅN—×»dVÇQµHLÖ¥óîªþåò‹|§:bX„KPƴÂøÌÚª>,mêåûå®jà§õpÓ~$Js”k<«LžÛ„O3éÞHBÉ?ð$!éŠ\«‰rὉ§ñ.íW,T˜˜–‚/Ü íj @…Ý©¦)r0}am ÂL¸lY7eé«°wµy {=1ûH`2Š»q_ÖtzÁ™u.^òGok?V^¨vðvÓqW¼â§”k˜å±IréózæÌè¦Ïå—÷ñ´â3adÍ+‚5-¥l‚x ^½Í™2Œsvê(ñfÅæ JøøbY(NeÃÌî¸éõ×ÖÆÆvò¥£è«JZÄF‹úÊ*õô¤ˆ=é ¯½Ⱥr_¶˜&þªuEŸ4Zæ5²9·Z6¡Q÷^º£²Ê êΦ"ôž¬Çºñª}M>yšäõÞÂí}‡ÿ8¢¾ñò¶äìñ§=çôU©s">-Ccµù.}×0VD•¹36…ö®˜âë2Ϻé_ý’jàj£ µî•F·ž=r/"ÒÆ¸øŠŸ…UøÓý4bý°³œ&0Œî„Rôî¢ÛýT$#"ÖæÝŸ4Õ¹\N·z·æ b0œð5®½ÆQ—œ³ä†Ý©ûÞcúžS…rIaxZ¯èôIÓNÆéá˜_ª‰È™úãݦ©SMû'ßÉÑ\¢q¦w½©:“טö’µùAÖ)–+÷ „zWÎÐ뉮žüxUky9DC1"PC#A‰¦SøÜTVm|4v¢&GãU\w6•¤$_cPûF ú÷ãü2~÷k;Y¥ØÇ&îˆg9%êäÊÓ?(¾v»¶^!@š ã¹§òÒl­tb‰&˜ìÿmÿõq›Ò×Ù¤ß &'bh¿×ÿt#@ÜŸâž|³­RÖ§€Ón7õ©ÙÈ5T4Þ--š§ëa„ úæñÙÝE¡QÙ@±{DÅ|YæMZs¶Yø ª·'kl ‹²ÁÀZ!׸T†¼/¬×ÐM²„6(R"eq˜ZدL§$ÊÁŽÑ{6~* q#:Úmž,¥ix$%Â϶E?ô¯$“­<ØísR9G&×U¸R´àŽ3 |¥ ·º¢\ó"Ÿ@Jò[)óuÏöy)þi=²ÁB›6-Ê(ݨ‹W×)G“® ÒaÛi·Õ ¯9(¹ÚÙ½6iùÃÚoXa¾ØR'¬¤|\_¡4PœâhØcR¹€?Ž"îä·Ur—r83õcuÝ‘ÒÑ‘ûö7«*.·1­t|^,84Óö_èËÕ…U…ÓR=‚w]¶›ëO ÞD œ­Šò©:sÊoÃÉnì­ËVæ0î–øÅëÂC_§EúŠÐ&_¨ÎÛ£q¢uÚ’¬:|ìÐ5ày0iÒÕe´`tåSzú&³Ø ×=¡Ö©ÏnV¿6z¹F%Lò…ú³Ú§à¸à;D¤oˆ¦óV$â—ÂÐEB«1g ókÕ†Îñ¼µ-¯BÙ(¶“JD§“£ÍđҺ5â’ÚiÃÄR>"¼2㡟ô䉖¼“ÓÀÖ̱ÉF”›k‰ÿ‚‘ÿoƒ‘óB¹ŒYy~€„fç037æ5cç`åâù_#ÿ \ýç`äl|œœŒüpÕÿ-0ò¿"¯ÿŒüwšú§uü/ùÿÕ`älˆAòG`äJüƒ`äì\‡AÁ¡Ü¬?ÿ°ú#xøOÁÈ¡?ûæ`ÿ°›ý^XÙ‡òB2çäåý‘gNNŽÁÈ9Fçàþ Xú@ëpV~à…ë'òcå¾ zŒœ‹ãÐw®ý@ðŒ\œ]œW\‚SR\Š›[RœS’**ÎÃÉÁÆÃåäåúó‡Áȹ¡¼<ÿƒ‘ÿ$ÿø°˜þéqþ ÿ7ÿƒ›•‹› ¿…rssþ›ÿçâçç鼯 °ÿ$§÷Í‘ÄöïÃ|Àkÿm”xÝ¿ ò±¯îÿ`BoDÿð±_ÔàÈ ùwñ=v3Œþ—SzƒöÀ5¨‘ya®nŽ,–Ôû¸¸šÁc*wãPi Ü¡úg÷ãíl|Â@>=FÆ}XT@z0ón>V˜'|gol U‘݃Á`×ªÄÆ@dÝÕóNåý‰`wÁÝYav É)æá”,D«0·ÍÙž­×wd:DnG aéO{-F¨™bÖ ´‹[ÜËÉ F‚€ “îâ!²ÕîÏÕªÈýê‚` no‡ÚsGÙiÇiô»]úG3ÛIxp pJûÐCøv$ÞƒƒkÙÉèöÝGB­¹8»ïÀ(þøÌÕÓõû3¸í¸;X™V#â#péèêÌòDMDèþˆbe¦§Ú+ ´ÈÎò#²À"a€œ’ F;ÉáՀ̯ŽÎÆvÆ€!R¡wts±døÉ}ø@àù \<âpÏ \ó©žwRsg»ý¸ƒ@Sf §'xwжH€ExwS¾Â[ru ‚wúÊ@OD aØé Üá1/| 9˜Óî;ÂþZöµH Þ ³±³ ˜J Ï Í©EÕä ®¸G€›+²Ð!d Ÿ•ˆ©1|z8DF‰ôÉÚ[­ì5Œävž;ˆÆöðñʰoIsÈ"~UƒÿÏè«“ŸÒýeáï$Mà£Ð†ôëî©«iýIÿöFÂïwðPþ?¥ü;]ùZþNAWg¯?/W›•3ìÏËÙÁÃ×þþ,=s N÷ Ãw'ØØÙúÙþÿn Dð"ˆ_-ïû>`Øö_ÔŽÿ>þÂ0Øÿ'Þÿ±rrp²#ÞÿAr\ìþ/7ë¿øÿ#?Ètjðž}ÀÎKDà%"ëÏ^"î¶ù·^#@¯ÿëïêûE"Pùo¿IÜ_ù/¾Jªþýw‰@íÿàeâÿ•·‰@Å¿ý:¨ü7ß'Uë…"Â5d󑔚¤$bR³ƒ©9á–ï _ÎLºU”t`f°ÔÞ˺ƒoâ`pqÃ'úÃ/ǤÔu•”UÔeÕA,öð~Š¿¿¸D¾£±¨¨~ý¾ÊÀ\vçå¹ ÃnySS$\˜)˜Ù»b1·B4)!©.®&«Àš! kz;L›´·÷ÜuA¢o:ÃÇ£óN/‘[n@§¾w°ÅÝW‡ ?è= X}Çlö øD÷^;î`Î~GJÞ3vø}»ew'Å ö½ýïo÷ma±h¨€9÷:¹ÿ%"¼›Únð.|.â…ëO™ùIU¤B¡îÖó°t°Þ‰ÚÛÀ«í²Œ¨»·úÚ/¸ý¢úI Ö÷?ü–ó/2ÿcõ¿Ö½šØ[;([¸R€qˆµÆ{èÎpJÎÆ0|nq0µBhQ ¹—÷½Ÿ bw7çïÉa_í¿&†ÝŠ¿!…}mü·„ðý½öß’ÂþêM {5Cû[ùo boáò7‡Å¾ê?Ä0¥ñá>ÿÝaA¸e5I M5%°–¨‚¦$à“~äàk+;/°Ü# Ø;:¸ÁœEì`¶VžÀ×(„þ=Fúï1ÒÿÝc¤pŠqÊMFTKÒHIRCþk$«`ƒÁ{ë4{\50Wˆ•=°ZÛ9év¨¦„Ø•ÌL~Q^TMEÔÑÖÁ:ÆÎŽÆ ©?ª,MÕ%Õ~V°øÌ¬m Ÿ4÷• Þ{Hý§¤Ã~¢Ђ€n¼ŸÍß8zkÿ7äÂ#ÐOf*0½)Ü´\Ánö@Ny¸Î‘ÇMÜÌ âðÁ ³gúùw™ö¿òÞ£ÇÈ¿„ÛòEúY€”“™)ú Æ +`ûç À—éL`FwÄ{w0¢º |¸¹0' শp‡‹¸‚³ DĘ;×HJÀÛ†}¯&àD᥽«øyOàW øï”ƒ³áú;å xÄ=|Q‡¹‚w„8 .ràá´±•-<âE¼qaFx¯¬à÷p*ÒVpëæœ4”†ˆyíé\Á–ÆðûÎv;GNÐè;¤€c €bÁ`)YI u½'›;’b¢ð¿*»-IÁ€Ã €ûqrƒ¹ì“6¶wñ€9ƒý~tä@s;Їs.¡¤n$#)*ªâÊšJpFàl#^…ì˜ÅÁb¢J‡‹ÌïR¤Cÿˆó®î³þ¤´’2°…µÛMIOGäd±3Oìui·×ÈÉÄÅÆÊ8åâzàÙN‡wމ 9¿'b¤eF¼{„†h iôH“GŽ<ĨÓîÚ.ü~c¯÷;DvO«kŠ‹Kª«è²ÈÞlCçÿ¿ê?`¡]æ@Ù[Téw™Ø{]õ+Qo­vú~^ðP[ߥkl÷Í`˜1p°i:Î;x´`ä©0½š0¡­ì°az+Ä;6°Üjw4 ÿpþüAÆám S7"ô¢¦ŒãFˆe-âlÔU¤û+ Ùqûô±{¦ít²Ÿ¿}ï\w?úîÊü»äöSÞÑšÚ¨íp {½ú‰’þ‡çº3ÕÔŒ€×H¾ëÇï~/$® ª®þc)ÀöÊ(H**±Ûß½žý¤×;Tþ;]þn2â–0S ]Ä~Ü»­¶6ˆjp_VÔÙ5Ð=ãý. A°8<ÓÒ~—¢ XÃHQçç ÛEÌÅÈ…Ãqxl³5ÿÞÆ¾v›áÀtì:<+ÿ™~"‹òØaNtg¯xw{fçH"<Œ„3»3tèÛjåº;Ì»_Øß™øœCîÖüüŒÿ¡ÎSíøK]WRV”Tü­Žllg>ÿã¶v 1 íœ2Ù›ÜEJþ ÅpãOi}8öÇ»?î;³ÏNìtH ÌBûÉcÓÊ%&«Aï~ðDÂøðÜ9ij ¹XÂWY Zü'êþ£Ýc˜Y¹Òßu§2ž%€ÈXÉî¼æ`J´eå sF.{÷Ìtß|·ãã÷;²áâ÷Vµ.r!¾Gû°‹ØurßCÔN^îM­ ?šswFÿO ~g9¿šÚÂŒí9ÎÌÙ>b÷¾?©è€ùvÈúù‰ÿïÅ»!Ç^áì/µ¼à>Êá¾ØVµ"wd½IùP|»ÓÀþÃ,ûYþ_?ÎòËý¿Ý#AŽfæÿÝý?N(°ÿÇÍÍ忆²Bý?6ö¿ÿý?òC£"!×>ˆ¦åcdˆó{êlGàåtâàýùÄiv’†jÙIø¾Òfzr3¸b‚¥¦®\µE‹ £áe6º»±JŸœ Uâ´ªúµ¥ûãò<VØã£LÑ5I¼.æŸO”ÒŸ%ùÖç7õõÍ\²4דfêĶ,uˆìWºÑhª3‹K¢Õ)³ ¬“N“\«h„ótøOFl—\mŽžb6W¶Pö¸?$¿Ò³ˆgÚW:Á?aM}éýÑÀ+='¦¦î '¼aÓV½ÌÑÔH{Ý‰Ñ ]YÏsöÑz…Ü[[o ¤ñ\g^‡ŽHrš‹ ³ÍlŒ®–á—T½öklÁçNfKBWÍÚãÑÖ* ?Y¤‘¤˜†¥E T'L¬à¡Ú«¶,·Æ8]úzQ¢†)OõBkÎ,Ѩ-q{Åcèñ“ëôìëžNõàTÆxJÙJÚ·Kà¶ø0W"Ê+œ0–UM‚ðÈWÜUá_ÄB2º'¨Ü²#¦BÎÝðx)w+õî°Å›§GÄI\7Ë‚ØÜx±”)®ŸcnW!ml»$Ò·‚{}íù5ÔÍ[VQ¶j5ÔK\ím²'˜xP5 à’Ž—rÔÀ4lÜ@rƒAÈ?ç.2kù$”§ùô­0weÂ’­?\QÂOxõ\)û,ÓCV">Kœ)ý\èÃw'OIÆk;ÉVêªÊù¿1{ÓdZŽ…Ós¼ºÏMïdUÞ«³âs¨V¿²¬hïp^#d÷C÷½'’¡ºOuï‚y±¸ÔS,ÑVÁg½ ‰¨áŸ)»R½Ø;ù3 J]è$™ñXr¼ì"ø12"Zªú¶)Ž/A…ÁósŸÈ×Üû[9§}E}éÆ+.zË)÷W¨À2ÁoµÄzˆ1Ç‹û츭y(¢DJ/9áMk¼?þƒø$Ί۩UÁ;Ü·´î'I„%«ó;ÒOÕ¡¢g¶¾8zW ’5ΉæÌûÅ~-iZ˜Oßäeñ¸½ü81²cÞ ÷4c:û´ÁRge´cž¨®Ï/IJA¤8Qa¸áR¸£/$•ìHJðB ¤KÛe>µíúÖ'Éž88Ðr¼¸:Â6’‘·ÁÞW)߉j¾þ¾³Ç [;wy-N´+ïa{&£P¡{VÊéazá"çÀƒj73:UšÎÑ<·¿óDkûã[!´Ë¢£+Ä~¼ÅKax0µñÞ¶u¶¤¥\'+[>ܶ±êDšæ•`„˜=}l†FÞ\òÆ¿„91@á5I‹jÍ(cøé»(Ö¤o<¢ ¨ëeJ¶Ý@•,{9ÙBÁ|a]u׬èì8kyÿ`~ä¹Ú/&þRÓïU– œŽœÖqoj£^ ©XÈ0©,Ë aŠ6T˨éβ}y[®÷†µlYV;MÈ“gÞJf0µ÷ÌÐ#½µf)!N\!³J:úWŒ ,=úñbv6åoÓ&äÐÄ¢ cíý1óbÎ×dxÆwq5”ä¾­6J@TtË-‘X¬]æ‘1‚~º®>bÏ,y‹é¾søË–åêÇ yx×ÖÛl؃>zº=•0¢×os¨ƒœ³9;¥É{ƒå [÷²¦(k~¥G;ž–¢+¹{6?á©t ·gÒ™X_5ܲÚó;0¿\h½Õ'¯µICú”šÖúEåÜEt}Ñ‹4„¬ŒKüÞ…“Õy·¦Ì5 ž–BI¢7³Á­× ib ˜—‰+èÏ]¶ÁºÄ:o>ñu„óK“™Èµ‡°§o¿Ú>ßõdØr@ë·¢y|í.‘³ÿ¨Ü‡x­bº4Y­ΖÎ7Ùúatg|~b­iöŽ¡&!Ä,ÅzrÒ¹žGÌ}Sl¬ðbÒµSü§^î¬NqÆÐH¯²XtœÆ’’ÇŸ $HIJy‡ÏG—áÅhÃUìa3«S¼oX‰ÚKåuæ!ÚéGxnr%—rÓŸ׵+^Ôª8s ‡²ëqÛÂâ äÆ˜±Ä ©¸vfE(7Çî=ŽC)UàËJˆ"ÌÌÊXÌÁ¬dääåóp°‚ j®Àê“^Ê8ÏŽÌ9¤¶³[ä‚ÌteªsÕ‡À'd0DÃëIzºJ«#ªB9Uô0 þ>CÄáŸtdà½[;ü±ïñF0Fpè†È[™¹€õAHz†`8`?º¯ê! Zxx`kë`±Kb‡ûÝ$‰`DúÄýms’Í^7@eE0t/ŸtŸÕ¸A‡Ñ[÷E#jP6‘ª ~É ‚²"/y@‡1Pö%3vò‚Hk)Š«kîàÌ aaaÒ€¡ˆN}‡«K85à€y¹! Æ;×P(7ã¢ædeEü"ÿÏÁÁfãæïÞþ}ÿ ÿwØyx¿Àø=@Çöðh ¾ª€“µ…/L÷>€kÙ×CÖŸôPNI\YZñ0fðþþAÝ?v¶}ýcƒîöÄÆ‰ìÅ÷þÀùggGü"ï!K þú^fÿ?DYnnd)n6607âïî5ðœ.@2À5p.ODn‚}à''×Ú¬;÷¿·ˆ”4Bæð²€Vvÿîò |Fj©!à>üPø‹Ô%BS;Oö(ÿ }ñüL]’z:²²?íÓïoª‹›ýuVÕAuŸ€¿ðŽƒöLsŸ³~7Ø=!!þv½+~@)€pvUh ¡@à ü Q~G¤@-„òªdý¥â c=øwOqûxþr#Rq;Ïw¹`ûþ i8¬ ù×&ûO<çäâØg*`(R¿чñ²öL 0˜_Ú›„•ùÎ× àÊgç…8¹9_cŽf 2Ü× ûo¢rýÊ["`¹˜¡ì\¾¼‹¼`.Þ=d.(;ʺž‹÷ <ïAx.Ö_Àsñ°ý!9Ï>¨.Œ /n ±… â„–+ÄíFסùëï`dAbdÁb|TÔµ)Zpdí±‰¹8u_ϺÚºU6¼/r«:Âx‘øf¨D+ ®;!7™Ø‚K‡ÿXÜ =Z…UŒÀœF ®¼VàO.]x¿z¤»èÁˆp÷Ü wˆßv~—o<.ó¼3—ýW¾\ÖÕi¦¾þÄ„¹›‘)J«PVõMv$ Ó½LS]×aê;¶D!fŸñÎ<9ªz<Ù©.Ì2÷(²õ…_p©î½õK’&º5ùe%ãqb[JîO4 ´ׯn»-€»µ¿~’¬SÔÓÔQa¼œ¯!ÿö–¦WMÒÚX¶¡L.IUë–6£óf¡çq½´˜Í0#ÙmÜ“ÁÌ,Ì÷ÔèW–iÔ ¼ÁYÆïthc¯ÂL}JÑ™ŽEÌ=¼UBdË]y…0üáé¿’^Ýûá—«,Ã|¯xL¾¤¼ébu…¤3¬‡¦Fœ¹|‚½HºÃ$x–ñd[ϰ1G>ª}ew?Ú3>Ñ-T¹zQe‚rPO¬‡œû¼‚$å=_ŒóôÚ•¥ƒ Jgû‹x ÇÕEŽ´?1µÖ¢nŸ¸p•ìtP“ÑÈ7w×7õÉn0U¼68#¦_ÇΊeš@Ü0:QôÐ([òúSÿQ‚‹n‚t¶ëqÝo(Q MSL¼¼¼q¯-­žðIU¾<à»k¹‰6æjk)…ŒL2Øú[–Ê£”õÇFä ´f·ÚÏ¢k\rßíÙjœœì’ B1ÃH½0g!:‘øÊ8£ØÏ³rA*·ó½hr}w_š}ÉÔÑ9ü›-X›.FÔ;wò£,aX:J5„Ÿ¤¤Es§1),ÐuÑÞN餓¿†ÿLÏ¥q´ôìŸõÖó±1ÊC’)œGëråQ/žÚY®ôsœH™¯š€:wXÆ@>¿› À~„é@ØÛ‘@Að¸Íwj¤—ùF—½‚ËŒeMf·É+6;Î ·Î¶`Pr-Õš£³êxtÓ¤XD1JÌ$æÛ'!ìoÑÆ¬$å/F:¡ãï ô˜%ßê~±í\€ÍsõBH ‹³#C¹JLã@£•®U¥NÀñ*¡q;IcÅÓº8Å`".ï—ãŸ-\û´Zó@× ¡p•Î¥Z Y iFà-K]ßzÃùò‡”¾nxö¾ÕLæÂ†íþÑÉ÷^°ë|¥… l6Ÿåy4Ю(mÜ€¶äÙùìAïf¸ÉêÃKÓ¶D—¤¥UŠê;o™ïùµ…cà}.{ J¯–­¤–Ð*"Tbíäznwòù ¨Œ¸¯O®Êj}-š¯vZ~rÞ]Êùë§‹ÿ{ïÐT³4 ƒ ‰]+r¤HM ô.½÷&  ILBA+(¨4ì" ¨¬`WTTŠ(J°‹(öïì9IHhzïwß÷{ßÿ¼÷ќݙÙÙ6;;;»Ã~)¶3.Q¸ÝnÖÅÇËT¼6ì³(ÑÉrZr®÷qgüXÚ‚'ŽN;Šî½x]î’ñA(¦D“1f¼«Ê’µ÷k×¼yÙóîÉö8\ž¼øùåi»W™žþ”¼ îwÃõ—Ç¥O̾óñ®î*Ï–Yõ'fbŸþšæ¾$†\pZÓkÿÄIÎ~}+:í w´?Ʀ>2í±öþ´þµïÛ”À_ص;FÙìÿä%g©¯rR{­g’×Ù#­õ1ë}¾:VŒ[1f[Ë·3•2¶MŸ;ö¬sO÷V¨nÂì…õgW%,ÌÒʺR01â£È™õeQo-_×ù';ÄVd_\Zbôt¹ò/g†Òú~<ûZqÜÍ¢O9’÷òîÌ1'O Z>yQkÆ¡Q©Tç&ìùíèŒ-¡ñûšúµ#R¾ËµÞÕ(Šu)ºn˜l,ž¶£.ÜZxó˜N󌔧ögÓtô´ê¾f«½> ir¬vlþážû}ò­,CÅâ/¼‹<ñ(iÔÑn¡X¬bz1&ÅÏWÂwwgw¢&FæÀþT—/_·Üx‹Ýª†}à?.b5[¤áGò‰ÀIînk^¿îÕ^ìÞª'ݶ2lÔÔœÑÏÆ‹ØfÖÚ˜n¦½%Äø¬ÎãE¾É7žë¯x–ÒQ"lX[è)þðÚzûñ”•ç–¦jÔ˜” ýT™¨e*±>§Pã]ÙÕÎS_{žÎÿH˜±Ä#£WtêœkßžzÐ^"cØë4åý ÓLgŸâC‡”^+K忝~0ÎrJË<‘²Ê§j"Ç*š—SºD“NiÖÛXcƒT.Y=jJ]|rÙ*É_Û.²Ê\œÞº¶›fl í]ðU)~Ò—Ä ¨Oaï.çê(_èÃGÎÍÞü½êý¦iFϾ…˜Ì\qìG†¬~lqüâ1{ºæåDmq lvT/hjÍ(Ÿ»Òk<{£¿ÝÊË%Ç•²´÷´«6íì“Lz§“ßõ;þõ«3„ܱŻ«]ŠD´o,~gê¶wÕmâÄhVгØéGQÝ /¯Í×Â_]s’¡˜ørá6ŸëP`¶NEΫFÑW»"õ—ÏœR²OªéEÿÜC麾hâyŸÒ“nÁ£Îõª;Ì›=z¹*û½÷³®óŽë·lì /V[tíMB®ìò›Ïj—_Q6®¿tô·ë–ǃwÆãÿR zKË ª¦éÁ´´uµ¹ˆpPmíÖuù´5õႃjk¨~hkD 5S5WµPµD"…rㄺp"…zªz©úÀ* r7œÂ 8„ AÞmgÂÚ Ö_¨dK5 ^ù!@£ù‹¡äpJJ§ñ‚‡ „  :pƒ­óo ÕÒÐáS†"¼E=IJKfmSw½ž1ª1µõQóÛòærß3M…ÒÒ¸$L²Üë©Éôä©ÊõI¢¢¦ÓÇoPQ*ãbÑ´¯:áÔ›òü›qœãrËß<îù&ñNÕ!QOz+W/“µõðéˆW¿~Iøý»™±îCëøÉk5–'²ÏZ”G×Äååݽբ¦q/ÅÆ|kÊ}~Û°åÖØ;­gB0N•—äÝ âÕŸh§´0us&W‡§/TÚ¶Gf[pûÂãw­)fþü’é¼û›íuðãƒãåv¤{é¢Ç;Z¥([u)geTèkzjß\.ßCH¿"sGØé¶îËå]­O™_˜w7åëW‘~ø?Õ^*önì¢ÌÄl™7mw= Þú.±ê‹ʳ3â;çµ<ѦܔUëZ¼C·þúqù"yß…_ìvÊ3Ð \vÑãÇå)süÖÈ$Í éߎ'¶O,=õ p·¶Tò6×Qîí Û÷ô¥‹M³?®¾¥­âf Ñ òñÎ%¢sV:r]ߥ¹kœØ×7sK›*¥1 'ô˜nǹÛ_o1bZŒÝr¿4àŽoÆe'¤ÜÊÜÖƒÍ ¹å·¿ÚÉZâЭoN˜Q+§hÅ]±5žvÉ:ÔÓU›ÑÞi®PgÞmÆd]™c˜×èd5Ûóa‹øØ"ە⃠§6u E.ü4¾=íôø‡÷¼?ßîÚ{ó½[í³Fo1z =¿1‹ g¿ßеªàåýd©’”ܵiM^o\6Ãòä•§r/\3¸÷ ·¾µùã†ÐÌ©þ[?ÐgÌ¿©ðqÕt›âD«G;æ`$.ä|Z^ÕÒ{fåêãk$—ÌŒ¯»¯ȬÉ×Ìqš0öÝÛò5*Y3•-ï¤HÏܯv<åë‘”£^^’càfÎÉR›ãè¯;3f·Oé¢dÍ+.LÙÍø` ;µ«µëæI‘ÚЂKÏ¢JÌ[ÚzìbQ¡«ŸîQÉ’–Éq“Uw»ª,õª’›)+d¼QE|yídMá=‡=>¯²séZºØÿåˆÐ7»ÉU™¦ s3OâkÅ^­éØÚèØýZµÞ¯ª|Û+»ãÊì- ¶—ŒÞ—Uþò®NõøzvÇ¢FݙϾ=:u…Ã÷Ø«ûæm•?Øúqo€ü{ãtµŒ¥SÎîÛÝ×Hg˜%nQ/´îL«»š[oÑP žš?-sVDz°sIÕÝÇïN“ÊÞ"±órwƒËīόESOéÚÎô àŸlÈ}§&çu!Ư~ƒa×9Ë®«ì(Ù»c´ÎKZõ„ž¸²§E$‡°`³3û0=·óÎ,ËÇ{ êÖe×¥´wŒ)#ú\Ÿä 2Éî&Ösÿ_É››zz;óÓì_,}æMI°® µrV+mÔ;ߢ#q¹×¯I3:oŠÌóEAnã.hІ*Ççíø°öc˜Æ§•uërÇ\´ýøS³l§;!œüòëX“óø¹?oû^P:jñ!†ÊphI¯óOÂxeÅZª|Y²Sçͼ[çf<ùF\üMjgÛŽ¬“Ø-[ñ_®9)tÈ}l¼¶Ïõþîk«­uFݰ÷iŸz‘úQ§VîYüaá*›ŽÝž§ï÷H“ÜÿÑ´âU3ûtârRzXüÌ‘¢eÅ™=Ó•1Ÿ›(Ræ^3*¬.6·¸;ûÆd-Üãæã‘÷@èàæ5ûœÃ‡¯üåª~W¦ð@h¦!“°ïþÚM7TT ”ǨN̶™Yct<ÏçQ å«è铦„êdÞº{ëæâ•†iîìº%ÒF×­Ï‹ózózò7E ¶|âì+®Ï?\¿Ø4:ް_TìÞq+,ýmmõ„÷5~\µýˆp„Æî_íµùomc%ØÊu䵓"Ÿ»¾âô1Wì)Ñðvû|*/ìðùÒR:ùŽŒöþ /±íø?þÙ°E™šëÞn[jDÈÙ´~YsK¨îËðíß-£ïÑImÍÇõ–" ê§ÊU ÜHäG§N—_Ы}Çd~mÐéœXBÞ;8•ºî+ãöï¿%½ª½í¸ãêk³—댥N.Þ¡õ0_-hwr匹ÝÉeÚ>N˜±¥ª:²o¦…/Hw¯#Z’Êt—ÎmvÐ(᢮×G¤jº×˜:Å;£DB½í¬‰˜ñ挅|bÝN܇ûïØ77?kðî )W—òk‰_-öY±dKÄåQ§uf*ëçΉñ´4®¬Ÿ«$Tq¹+q…È¢d í_ëj$SõçÌ_°jßµÉUsüø‡QF×¹¼r²Ø“õaéÒÛâš6ýçž§ªemÿ¤­ð¢°õ’ôç¥"[î×Éš]/¤ßò¼;Q—þ[I†.°oKûíEî?åÆåTÞé˜4vé‹úÝb;Ò§Nqï3j´›”&|Ò+/§;5þIùEÉ,¡$õ¨€¥0…Ã8f‘u£xYÉn ß­áBç6,3+cVìû¾Ojkõ>¡/¹OÊʤw?žkñ-0`Lµk½–¾º¢¢úQÏ÷S;nèÕz-ŽûÖ¦›ÿqœ½8ãÔ,Å#oùÞª“¸³\¡M}Ê=2æÛÔ/ üxaBçÖ«“¦|¶yJ+ݹ7zªd‰­Qs³Ë³˜ˆ«Y™×Z[+Cµ³¿^Ma|lÝ€¢:ÁÿWy¦Üý>Úþq¸¿Â7ç=õNw/8çŒ÷½^(ÒÑwDH(õ‡µYº”Ø óØÙ¿—î°6ëŽ÷ð™ëƒWX.¢èZ×=ßeãÎä€6ߥ2R£:´è²ùuoÝÉáÄë_ÞÄáÖ,™}jÃÎ=j÷½ç$8M‘$]¸ß¹g‘‚ôØ—çÜÅm ÞlñSßÎºÒØÝ0‹Ä¯ØªÛ굪–Ÿ³æ¬/ Ä÷MÉü0&¡³eŠæµ›N‹‹Ú1#0»·xt6F·3ãŠTî_y³Ï3¬ú糋G"fʾ¸“O}IWZ<ÿAóžYÓRgœÛ›ùøŠá‹Õö ôbæE&o<[zlÿJUEöJ ú·†âJ­WÍþùý`:Ã픎ùIl”øæïŒÇŠgS.ßZƒc÷¥G“ǧ%%ÏùjkY´ÿ\‹v¹æ³‹HŸ®æm~3¾ìíÕiŽKN Ý6eí­Á=Ë Oˆ0OVjYÒ($_Çžœüc}™îžKiÉr/nW³l:Êš{@„¶jQ«×­[ó–:9E*P|âËÂJµY§Š*û¦^– ÿc¼äô®@ŠŸµØ‡´ÝFǧJmúòkÒü5®æiSl§áŠ*<+ v&D.Ò¨Ôz°:ï¼iI]óÞ–Ú WítÓÜð‹*Ûï¶çÎãŽvò–:¦leöú0Ê»£:¹§_4\v༊¬ëN‰bÑÑʇ^Øw*佊VO`xA»~?sf¬¨&aUlöÕ™d|²G'ãåö0)7†¼hsï›qÖ·£Š7—^Ã|ÜþÔ¤(¥sóÆDƒg®'6Íi°ê>«ñ`UÏÓrm_û‹†ÚþôCÔßUþ†Mö’é;•Ò¯.+^Ÿì¢ÌjwÚöýfoíh§Õ´tçý ³H5«·ŒÙÛRa©‚œ¿2×ëÝ’éž3BœÅ¶†ÿ6ƒ »ÆÞDh|‘ëRç‚1yg´ŽÙçWM j¯è®n9Ÿp¼4$2½Öþ¼]¾ëÄì'¦á™ûªÊÏJš›4ÝïWï£êEÁ’ÎT Ñ·ôY Ž„PÃ9bÑPÌŦ½“Ã(ž¬<›£[6®z[ºÉû´Ã숶uÛŠ_uÊ›¶©ò™í©ú[[*Ÿ3,¾{DØ¿ÞkëÝŸUK^Í<ô¾wæ¥à¶mfŸÛ3Úˆß Üú~7F—ŸŸ¡Ý´¨þõѯà+U§Î×ë¨'VK¤Ç]+iŸü½‰"ç’Ù¶ÓEˆÊ:ãÖäò°®öIhרs³Ö§˜_s_÷6pßÌʺ„ê¼$mQúY™OXÐòËjºÁÞ"ÃYפnÝmšzª xè ®æó‹µ›Ó*—fm­×tu‹uxj%ù¶µ8zš%#ý•VÅøÛÄ}‰3··äóp÷êÀÜzÉJrÃ;I›ƒ utEλXb–BÓÅŒeõõ-žH´v†ÓYº…ÎÉG}®œfP\½ýEV¬ö©¥œ˜±í’Mè¬<“Ž…í”ŒúèÓ(†ÇÆTgô5?¦š¸{M~»¦Îø^qÅLâg‹–—oct£[Ÿ^ž"“rßýðçOâí:=ösíoªìžè!Ѩrß@óHoî—ºíÄ÷2¥^Ó²¿ø‡–Ìê~[ñðqñ:CEê–§£o ë·¯[¦Ø”»<©hýÃt… ³—«zL%Ú,´z"Ô’t>n-µ>\5V?ïÝêmëÖ¥ÖÑãÀŒ˜i7N読¿Šo߈µ‘n}vWçå*]†GN©áÆý»¯Òê5y~–ð>np°´¤SAéQNR––\bZúèÊö9ß…Cçż]ãké¹`L:æÙ2D…ž»B§Gë>øQÞµþäã§ï#ä{W̯˜í\·ÊëÁ⦜âgò׊( ù_œr]u‹áä*Õ·~Ñ)[·î(|m«ýa9½G=Éð½|Ïå+ç˜ÇT®Ëçbo\îyoˆuÓ\¤þY¼Á´²êðÞò[n"›]']ÿ¼×#‚vÖo§ì½6«…msž°÷y‡«õös@=¬“±zÙaG×iiÛ:êçlKñJ5-žò@ü´e½¦\™SLœyúî½Ëø ¹°£.u¾ŠnÝš´”îU.’' ‡×e4ÞÏ.ölÇj»…øøX»Sªrp69ÅëîØ)ßk}¨³±®£µüt«gJ{ƒWÁYåó§/¸.yý(×uÿ¡Ìr)í-áà ËÂh‹wþØXíÇß_Å"Í"')û­:63ñçù£!+gb¨+¯¶Æ®·OªòV˜újÒÎ1J¿'ï2û˜11iæ÷ŒjöQ‹éì6R[–†äoßåŒnHœ˜v5|ò¶ †M2JηôGW­9¥þtJ˧ïµM7ˆ—”Ïm%Œ>ÐóôÉï‰óÖ|Ô~/6õs¨ßŠžgÎÔŸéù›÷÷Ó¿.ÿôãz§Ñµvû×uö8Ÿ{~ü×J¯®}÷‚¢gZbÅÜÆìéýñHÔE÷ØÃÍY«gŒ[}üøe·GÞ÷]ˆ*ÚºÎ÷ ÎL½’(¼kKúÚÁ–9½¿5Ì }xͳÌáu!]m H[W—k™ã7Ìé æt sxÝá sêzCæølq¨%ÎJÕ±ÆÙqìq\kÜ–8`1ë·Ç!쨫S"ɪ!ª¡ª¡1ŒP2 ±Ì…£G©À4G¡‘Uéªtøï‘ sËùcQ+•È åYèØ¡L2üo]ÐV©¥=Àb7нE÷ß±Øii«kòYì¼E½Ý—ã;r[]<Ô²Ås¼}×.“ô-ò¦ç…œ¯°mTá-óñA׿Ù$‘B¤ˆÊNíðÉY® t'ü¤×òÃ/–Ÿ:÷æäçæ„èœïO .VEÿòöçüç7­ïè5ĽéýýŠð{ÕJÇÜ$ü¬‡.¦:–e?zì!ëû†ù3]ª&.»3¦[k¡ eªÕ©²  wêcM¶n™thöÑ€9Oð’Aê³r¤ÝN¿ß£>½U¬¬§?uÖÇG[åè¿[ož¡ü,oî¶/Ï¢:h›n;ltÎ9“ôKF^Û2mלœí'UñZ Xoû:X_Dt|»;i㦻Nz[?ÜR›è{JÑqj¹\B÷æó-IƒãQí¯ïI¯ÿp×àô—úªúФ¾ä Wv·dÔEL˜™ö¡É~‡%–PÙ÷õø±Þ𵹊ïÚs©o®v­¬¥2ÞwÝØ  GG×ûÖ›Rñ«°ÍŽÝöžU>Öw}Jï1r½6U¯\²ieñ•ÈÀ3G£Ž6ן©_FU-ŸÒSmCþhcÍþ€Ò€¥õšTmÉžšø£Yõ*W.?¶øØ—.ñ ±cÞ¯qAó/¯ÌÝg‚ÛIpŠO 4 S,’ y¡×'(±@¦$míõß¹¤ìOE¶­Ýk—›áŒülµÞÊ=„cqÕqF»$Œ‹ã¾­ìÒz u[Hw§ïÌ—àwï˜ùùóó•Ÿ}wÑ8pû‰Æñ5?%ÎlnÖ}uÛG®¶SkŽÈá€PÕÞØAŸvçHR<¦[¥­ü–¼mÞ  õF¡+ͦ´¯¨ÈYw-BÓ`c{‡ú/(÷Ê*§³Q©2ÍÒcÔqצΜW—.*WÓV[³f u•ì²À×êÝë ñÆÐ.É+–½ÓÕmœ¾Mô*݈²GË祅t»E~pU)h.NKž¹Í-ú–mrNæäæÙÓ;¦-²šD×Ï•~z|õ—4—¹—z¦g^œ^²Sßø)ÒD;ÓîòWçÎQn}êòТxY f¢ÈÍóAf23n[_Œ35Ô|¹6¥vnìïOmæw>JÝs¨ò»°‚#;éyºÎü E¯®?Ÿ°FöÔ…—mù"¥Í›BBØf3F?¿3oÒÿ[V£¦ï-RÊ2ñÜëb{o®ÂÚÕ'î³w~íׂ;U>Ûá¸ױ÷7mÞ°îA#³¡´3BwîXVm°Ù§¿ÖKë»îh¾¢´úIÉçK«Çøa•¬xàÒ“žúJë´Ÿ¶ÉÏG—w÷\W}pj¤ñ­àö–ìy©Ò3ÛFr]6¹tüñù£V\P­^Ýô´¾]ÈrÕl+ÔSU¶B2ž²cq%åUIÝɤWSV.<³êîÞxh[ò™Ä$ÙÜÄå /½§”bï>“&î»äá9·=¢úû[±?ÙåÎY³÷•‰rU®¥G»Œ>·»dQçZÔÝ“â¾ëb*Ã8·êMSµ©kÖE×ß“k¼é|•»unçÆfŒú˜l±nÑv“¤ÕvžIk>é‰îp-~½ýùæ‹éskew9+dO­Z~³àÂæí4£ÜêK 0®œ¾è4okË—ÖÇkU>ùŠí›¿ã3ÔyióÝ©{FŸgã¡|IêpñØo›Ú¼… šŽ¸PUd‰P/þÌÃà7߿پ <]=ú\‘ð%¡ìyǃ› jOü\%ãáÚXóE­MIkOªëq»]jÏgõÊG’Ì—u¹Æßš&vÛZÃØ¿·uß„IDúÖ-]¤à\V¼NÜœ¬·üBAyèwÛnk³C!áV[ ã6%7îÞ±wÛ›$žF»!ª-~"-ñ±Ò€àæØXÝSù-Ž%Rf¶îxéÐmÝ'_.´%ÚH}ô¹™t6êu.\ts|£ºe–”Ï„}>yǬì Éj£ŸÚéà˜”\Å^zÂSý±RÙ|Õ5ô£5Ù}yfkŸ­Þ&úF¢’:ÁwxÛûUÎ]§}}«+¾$Sv}èÀÔ­äœÃ%jañ;ª»-¥àÆ–í›rÒ–—¦äÝCv†[·Ÿ“Ëým䪻SRuÊÔ{Œísí{'›<ÚaWØwÍ&Ô\sN¢œcë÷+›,—KûÍf¼ªV_¤ßöµuÁÜMޱÓï|M4{jÕùÔ]QGü~/ã‰#UíÆˆ(›ã^ŠºýÔ¯êÇÊ”¶rµ,.éýÕ9çÓ­œ…÷£Wû!).w4%._P+”iJ¹Sœ¥!\i¬F²wiºW*Ý·ck#KYÝ££ä3õ´QÁ« çU^Ï%r®›ä_“¯›<¯qÉ-­M“,=«¦”NGh¿ê«šl|ÉX¢boïîô¦¦FÝècrrñÚ=eó»éFµ×¹³ƒ7¯¹xþXºÖ”D—P¬ºgñqmWν씩k¿¯ Æj3Öè0:–´:ªM¼³þô ßû~—¾%°K…Z}*ê8ïíaxC9•=¿Üêþ‹ ×ÍÄzµÖ<úu )qsŠØ…ÇBNôwy¢8±bY”ŸfúÒ£žZŽáAkë"\D&@©M'jÌžþÒ:”J Ü·dO»Û‘ÇsN¶é±çLOøê°¸¹vù®'»°m!£i¹'>èKEþÎŒVü}@$ÀzF+ýîó÷¬ýqÔˆÖ¹öⓛç×\ Š›e”þØ&²ÇKçÃUI¥¤ÚgÇÞú†¦‡Í˜öEK;s…XêäBâ’Û¿ªó–コøƒÇ3¹gn<˜Z¾ˆèvÿøk3Ã'»Ë»ÒßËŸ°sðSŽ|ì:ì«Â_«'3tü¹ï³N^t¿þêñˆŒumãÉsÂÎeX¶£"9Éáî»E÷sbEÓ/ÏŽÇØâºäÛÁäOj=ä :]Iû®ˆžtœtÅäðuÌâ‰wæì”›?F(c¹é¦fæ ³µsåäô7Ì»qx´Dº¥ÇÖS£,?Jç<Gõs ?UžÓy Ò.uI±§§&á^¾Þfñ¢³cv®|øx"#Tóª@ê^μd™óu³2õíTNéɳȾﬨ¨\Ú±(ùÁ®‚Ê…› ¦¬„œý3öJªnÔ^v#¢&Ä9à­ŽCû“ók³ËÓ(±èé'É-°û´0@˜Tªõ{|â-˽†¶±côî>Ó7.·êùÚ”ïŸå“Û?Nvzmü_çQ:ݳ§ÑmYdV6Ðêõ‡ ©G(³è–Íu¥žóï­9`¸7ì÷ŽŸ{òt'éWoÞS˜²Îßâí•Ejâ³"$e3íf½ÍÈ4RÛtfÍ ù:Ïì¨QÎ}÷S^ÜØ!Þ¥Y½ìW`ÝÆñÞ…ŠªJ_Ôß§téÔv¥¦O›d9îhÖ ›«Ë÷¾Šötß©<Ùf¥lX¾®evºÌÖ{/2_Åì’»++LÚo“‘^—}/‘õ~TnâJç3ëNÝl|]®/óøòÑ&ñ¢,×Ä|ÛÛ«•ë§5½Ð-\ùä÷›³ŒW®ÖYêwjT¯—ï÷\&tª Ñßà웺ì÷µOúf­ðΉηx½ö&ÔCÚRtrõcïW´e•±?¿+'Úˆ%Þ›ðl‚ó.i†ì< H”PÀ˜ö‹œîOÙMÂ$øã>÷¬ÛsÉ1>`«WX¢Ì¡”1š›ò3[fœ®ž3aÏIçC~¿­w4nÝvuF£É5òªáäS{—‰íù xkß ×婨Ç“iPë„׫㻃NKY¯óˆ3ü|ã°ª°—IäöÃ}¡c§5m§}铜XÚqíLšÞψî1‰SˆJk&¬õ½>CÛ¥h†Ò>ÝÅíF·5¶¨¶h^Ó×`¾ûÑe.òõD¼BÑG#‘ÏŸçõå­l0.¼7õnú é.©û1=Ázã1Åi§>ÿ¹ûìî—SõÊ¿vÅO~~ˆõíõ ,-ÞÕëC­YlÒ·‰ûOš®6-^Ö0mnáƒÏI&S›s#ñ¥öÍûÏY]*о(¸ccyÝæË@çÝØàh(¾­jF_úº¨8-Ùs*'3ž+ô,¸IjWg¦d•¾iÙ6û¥“æSM¶ÒÖG±s­¢ªo¾Ý^’­î¹Dî®û Rh¾»OÓ´‡ï mb÷¦©nTY÷øœó7¹ÄTZKã&¥v¯»m®²?6ÚTØ_š[»!º‹}8®¥Á©¦ônÁ• gëãÖ»žÞB¹Vįq½ö¡`­tÌr¨…¦¾aBS.êù&6gjë×;›æQ>÷µóÂG{ÊY¥ÐmG3›Ciš= [ûÔoÞÔ5ëü²ž¦UÏ--Úð>ÖÈ¡[[ŸM3½þ³fáÂL‹åõÍRSõL‚o$ùêu•³5š%¶‡7ž~r~Ág«é„YÛŠ\$f.g•iÙ&5e&Túš%ÛB› £u83eη5ÑþÅ3ÂwOð3¨;u}]½\îè5·ÜZFy^mš[,YM+f¯šÖúaaˆî„ì aäpY·-çn¬8¨7úZÈÕößuæ™ñ\y{ôÉ}wv=ˆ×ø±2¡òPÂÑ“¦¹Ý/*Å^§·(Ì–µÑ=«Ó±-?Z5"òQLMžXU¼í^Ïþ´ZÉ´ëŸ%îí¿æ¸öâì@ÄQ?Îï*P¿œº¶[.ÒŠh“hÀÑF•íß­4™\'[ûÃVîÄJ%ršõز\‹©i•'>µ…-\ò­IÉYøc ùÛãõò'„çô®˜ô3í‚íøI׃÷‰±YĉÂòRg>ššìdü^ú´úJÍhhúøö°ÏiQ¢'xdœ¸Ym‘u¯ûëKóC²«¶ØOó“˜h˜ìj¶°Î|aë4’úóyJëó²ÓÓs½òï=ity|_‰jÓ.£ù!¿äÞ ë„Ï«„£Ø¿75ÖT-ÿÑæÉH1Ì©•ÌJËÊÜé'Ó}ÂûÓ·é»v‹Äš,±×k»ªoôò]ª›«|ªufˆ:?øÑ ¾+{ZTô«3¢„³ÇÔÞºSýìÖ»M¡×æÛEVè¾#ÌdïÝBzêòtlâØó;¢‹»–Ø_}c¢Œrõ.þ`l_†Ñ~]Å÷‹¶§LsÎò׿`Ÿð²å%áÔoL‹¬PHÍÏwzv>¸”¦’Ü“’dö ætÞçMÂ;å 9¿ˆ§í~lÿ¹knÕº5ú½|¥e2!yN´Viúh9EfjóÃÌ·Ý[­‰zÎOKÞ™@T,¹^z=ÌæÅ£ JÂ>þoPÒ÷¨ü¨ß*»¶Ö3 #—r¸ì“ïiûyÚµ&nø5¸óK»~Óáæµ;[‹6èN²É­>¼µ‚ÉÚwßoŸ­ÇÖËÇåvºwê§‹{XYÒ¶ù‰~Jf¹\¥:ÅiùÏÑ\+Û#µäšêåJù@^B ²Ü–Fdf7Ï8Û¡}¼aÙIŸÛû7ëÏ Ù³ßî㥹%»ÞˆýœuîWâ´Ö¯¿Gk懮ÎZsûñê%eÐ[¹eï["¬têðg 6½™ñ¸K ÿ ñÉÇ÷Á5¥¿æ:›g-ßþ<&$_RyrOFæ‘eÖò™VÆÓ­cŸÝ™såjD,[?A/}au›ÏцÔD¡+‘Í”­ß²Ôvç){«6ù„(îÛæ«äØñ Æê•êöðÚMq]qoÆ6Ž»±wÌ{­ò'óNïm-5¯d­ïùŸßçG_ûInþ©³Ê¼lK͇­bû®¿(~˜’»ëü‰SÍ£Ú_^öHjiUð ©pëï>˜nÏKë#\î–D_¾+Uót„8.eKÃÓâríß±^‹§Ö;UÍ<² zì6óêÇ]–În>Nf‰Ÿ‹ã¦Ìuîqî}D¥s!äR›í.ô8C ?s¸ªçGáÁ[BBÎióË}ûíSô¤ô7èÉÈ7•Œþø`e§Ñ‡ûÉ,Òò„šÓõŒ§GºÍ”R‡"6ˆF¹Ž– oŒÝsò•¯S•evNiÁeâdƹu09á·É6,ü•×ÍïÑiëæ6ŠHlµ7~Ra¼8ðm»ÜcòŽ`a7ÈterðÓ¸ø3ölé“wö"Œùr!ü^@_ÃÁ•–hV6^žy·ÃqÏRǧ—¿”o2¹rñKð÷'kŠ_üÕî'Uakü46F8ðHSeà)ƒ7_Ú óéÓ‚Â?/~{Tì£û§sbë×'"S¦;,Þ•C/{—\W½bF‘ÚÞN*رk…[sÜWÍw·>¶ÿ°:`çYvÙ—o·|ó=oPhx{îáo‡R7n—µãx#°aì—ÛªoýS’+x†Ñ½mæî…5©ºöê³þ:ÿNVï®ÖêÝZëôfžÃÊ>'ëÞWiùõF¼©W®Êü´¹Òo/)Îô_|xnß ÏÞÏÁ&+˜ZKî~Ùšé.®V6ï]öh»s×IÚÙ†‹ÜDf9,ÜÐ@*sL{ù×Y«'SüÕÕXü¹7:ûíÈÞŽ¼;0šýw` E3ˆAadðÚh…f$ÿîÌyyˆB2’_¬å¨æÈ0'‡Rlb™d÷X' Ø° =’ü"c‹LÆFØ`Äz͂Ȭ #is7+i­Î‡Ù€¢Ã©4–~´‘<‚¢ÿɪòÂ3’÷vtØt:5ŒÂ†Ôqz8<¯¡3‰áä(:3 Âã´åa’LR°¾›…‡ üe$Êf3ôUU£¢¢pQàEZU¼žžžªšºªº:†À²bhlb4–Æ’‘çàQ¼yh4á DW¥x«âqjªÜ‚¸ç%àAð¼sj$A!ék5u‚HºZØ@²–6ÆcÁK!Ø b ¦šŽQK“Ì-ŽÁǦ@yp\ Üð/}ôEo¦‘¼µ‹d žÚAˇàæÐ“Wýs7üÐ\ÁÊiCFßy¿×‚È&««áµ±jzXu=¼†¾¦º¾–Ž²šº¾šš¡êH ‚jŽ8Eÿ *$*é ã&=8˜ïusuuœÊPu@ëü§Û‹Èpt¹ÅÂÃÁpúœg~m-þ•¢þÓ}L â1̈`R‘ÙA R%S‘Pn,˜i<Ì1)H?˜Î 'Â%ðE<£p&›Â¦’ÆL©lô•ŠÐ§i!FòÑXN@1ycOMB{ƒJát ‚§ÚOkˆ¾RåÌmð“'9Œ‡~áõßøóŸ#Ô/.aÑk$„á`qÜ/¹óZa¨i­ˆQE1Ü`ô+X胙¢¦§®‹hud’È«©ÉÃ`ðìúg6( 5_y×ô£™ä`Œ¤ŽÇ¨ñþ@ÚZZZP0ÄISWÓÖ…Ð' ¯«®ð ¤ÁpjzÓ𺚃ÒàT­ÁpêƒàÔñƒÒôÀ¼¨éh†ÓÔU˜¦¥£9˜gup…Y0MCK[}0/:šƒqÕ¥ièªJÓÆkâòŒ‡[p®¦¶Ú@8m]=>^ØL"…Jf"/?¸SbÉp¿Aªnt:BÞ€TmiÁtH}ÄÁÖò54Ó5Çk›[iá-´µ,ñzfx5+3m5 m +]-ã?Cøc÷ ˆL62XàÕÖÃÈÉY:[ý®ïYü1’L 3ÐMÿ¡§ÑFŠÿ§®ŽÄÐ'‹–ކ¶^CKMçŸ÷ßþ7Åÿû' ß?ýþgôsQ œ‘˜wîŠéÇ/ò@X?w"2LhÁ”ÎóªH¸%¸Ü@кp©È[êp;³)D*¼Èrõ…i42õ_‹ó‡Ä&Ȇ?=È/Ø–óÓ/ØEEàQ~.Û ( ç7¨rÒ‰¬04PàñAÜ)¿`³Á h(Â8ý‘¤@ éY.SÈãOpOÁú{0‰®…ÁÙºñ²U@ ô9Y.¾ãpT0ȃô¼¢ç`Üró£B)à±uxôÀ"‰ûX-\ 9Vxtð‹ )0`±…FûâEŠVºP„>ƒ4Üð~I¼Ò/\ P&„#RÉ ä@2†S‰Â$±ADC:Ú%`XðVPB"“ñ5s`î€0»42™Äþ‚ ·=†×«,xÔSI`öƒ ‰d†Ü ‰;Öd }xpX1w^È´}‹ "ÒxÁÄh1áõÇ^D¼>HDRä¸i1"±"‚‚àÙAEâ¥Ñ™0Ãðѧ¬tÎsÆ‘JŒ`±‡Oj.N ;!þ‡‰‚»p($´Eœœ=,1î1œø ÓÆ©õGy0@Ca–Ép¯ISéð¶$ óJDe*Ñ6& y•îr4,,IhÔ¹ xuýÅór@<6aŽI‡…/Ø&LW‚e4xxô Fáv *„Ð*£ë H蒀HV,ZÎ\ 'Æðµ@ô‰v­…Jf£³îyò\y@Š`pÄÂ7X‡`'L0T)œp›ýáë4%àÅ£‘à‰Ã ƒçê@t[—Hmt¡ãÄ–C'©Ž($ý¢mæ°Xü¥ØBCúñ·(\®&·H$Ö-ë6ž Ö4¸^d¸š@àçNÐÐ "!HU¶å2%5O@”r‚˜b8 :<á‚ï ‚±òø%Í€,¾òäÀ½ ñ¢êñ‡ª1‘éI$‘Ââqš85þ¨|fL" ²¡G€¸|aõþ mòŸMÙÿ¤÷¿ƒþ«÷xÎþ/þŸ†Î?û¿ÿ5ñÿþ å÷O(¿Bùý;”_?1w7['k÷Àˆ£…°†Cr°u´õˆC¥„Ã3þ?2p@l@hð*öœÂ€kjJH¾?Aó¿³ÙT¸$ô‹³+§q¿ÿ"²àÀ”¢¢Ylª „”Àââ®dëäAp4õ6@bš€YëáᦳcIæ`°€F¢pÂÊ"4x;Bø M8\ÌÃÁq û¢¿À®þ¥ÄG™k! !‡¶¯8?ú9<†£‚láźåRìlžÉQC?¹j1o…æX]ž]—ƒø@±d&Eá/`r…XÀê€v w<³¸Ü’Cè28eö{` çr;(‚48G7±ƒ4ëÅd(„Ά`•£Àㆰ` Mý† ½B‹¸ú‚ü4pO@ãÛ ·Ž‚ i=ÄÂŽìBLQkbǦ™àDÎäŸ$p>nðZÂU£U—âC' ob(^õ¿Š€hƒ'Ù’{(©Í¿Ü·±xðöïw 0 #(TOCd›3 U¸v8ÁͯàÂÊQ$,¹#ökŠŽ $û€½6g䌼Õ¢d¢ƒ{/nˆUÈ€+G¤rë®X¨Ñ†Ïù7”b$P'Ž`çÊxƒ‘¡ùl ý¶Ò‘àÁ@B·p¦VÈqĨè%¯áv#Ca𔍭vðÌ©Gá ì´œ>ƒ8º7Åÿ/ê‡âstà£~`¿/àŒX&±ú› o’r̼|ö熌ó=(3\ÙÜÙ1¼ $Ú‡²O%`†Ü‘=¸ï¸æ:ÞãkŽ˜¡ø÷ïÍf*ò‡hÉa´&Ï„ü?þ_ûÿ“Ù°$P †öâÀüÿÕ55uÿ<€ÓÖ@üÿñÿÄÿäÿü£ÁA ™Yó̆!È¿&AðrGïM…‚[ŒÆÿxþÿãùÿ?ÐóßÒƒààlnê@°uÑ®ÿj]<´ë?¿´C|ÿáí’€z¨rNµà=;„Ú–IFÎY¸ÍÉ?’NáÜ(qD7ÿ!ŽÖ• ûïœúùËté'³Q7{š‚Þk‹Ða^•!Ô›hßQ,0*™ÈFB1<,Ä#ŸL„Õa( 8¿ƒñ‹A_©l 6”׆«9á(M2Ôßð¶ ™\/YÂ30† “‚gª¦ç+Ë_SMž‹+pþþênØC:µêà4œZyóÿ“õßžÜÁ*G ÿ/#øjáuÔàõ_GG¯ƒÇ«©Ãë?^GýÿÏÿ–?ðPwv4µï¿)eæ?8°Œg±I°8Ã`LÍQqjêhå`j `°¶P¸&#¹ó¦>“çÙÅ ²CÑ5™³îÓÁÍ&P€3 ,0dØtÅ "Q˜Š¦„¦!¦ªàÈ|XN±¸´Ñ« dĉsÚK¥2‰Ì˜R Èé &#ÔÄœîÔa)ÂF¯jÁ²Ü>OdPa~(y˜êÞ/Q,J L‡ko $#NûÈ}®=•f8Œ Œ¶yèu Ú¢°Tr$,ÞaùM†ƒÂ@ÇÜB%à 6““ˆXÄ L殡B¦‘™ÈE¤ þBZ  ùŠÊJ"•EGï†á¥"žÆ0Ï~>8ô`~Pvx…!kl¿ ä6,0#B@½‘þAîP€‡U82 õ·/•B†XÄZO„X”p •È„ÑHäÀˆ,ÂqÅÐ;/Qd0>ýV ¢ˆ1Èú¯|‘dÜÜBÛtÀèPÅáT9à i I°‘¸íÃãÜØ9¸Ð ‚*r6åYj}5΀‘¸/Ä„·Û¼Ù(°†fƉ8 á…€^›! tŽ·,zÓ $LHšãM)=c\Bhÿ 0„ê2#13™ßg—Ÿ κ4€ %2÷ts°°4ó´Æ˜:Ì]\úEҟƈߓËH(ÄpCt442Æ ~…þ„1 û ?côwÑÀ?(ƒßü¡9ÿLuâ…™%8x8Øš¹™ºÙZR`È!Ú0•ˆÁ„iGSd¡‘U€¸˜Z[º+b0Žî^æV¶Bdjd61Š…#±¢ÀñþaÆ ÉœßpÉ#QBtø_$ æ$#’~p>@*ÊÐp©QFš‹›3h´8BÅB\ž¸m@£ƒ‚ ÝLa`YK,™(p‘C À‹Ï2 ¾YDp)l‚à}l8w ÁB6@#†W®p»9XЇDÀB}ªP Ô1“…±ôöp3%Xغ{;!¢ÐºCæ6¦NpsCn–¦Ž–8¤ºO郇rÿi™(:px)áêý42º•ëÏeEòa/&²ƒ`i+«ÀínE”*°Qš†:<áÝ,,MÝ-±ˆŠÞ?NA0/è)@'\xÓ‹#F…!ûOvH, æálጠŽ4XpK[X¡ƒ B©1ƒ¸õEx„Gw¨)rª(«`îîìéfpdlP×T€rK¢³€pâŽ;<Òƒàddá!['wS1nY$ÈÁÖÜÒÉüÄ`ÌáŠ:qÇ7?pyŽÜYúK”¿zh6ÁÝÓÌÂÖ duƒa„… ŒÂ³!·#"9xý pÈ?%°zgŽìš½à*à ÁÖÉÊÌÎc@X x-FS_M_qè.ŠJC>ˆÌ`£^Üï13œ«~ùê3É‘@ÈWŸBö÷ÇAît˜¸; 4Ár4ôñêúxtcÊ¡ô; ˆK|âÕQÅ&ÂÄð¨’` ‘)ÈúÁƒ–†äf*Dæ rK¨$ÈóS€œ2ª<Ï8º&ŒÔ?΄fFÏ ajðV^¼9:'—EÞ~B£7£ìØ€ÓXĶŽgËŒ ¢½¡d*Š¡G@ 8{‹ú3Wïâ>ÃZ¼±ÿÖ‡Šxœ;xb•C€2Ôà®RCYäÈ& ÉãG9SÇy¢å‚J I({”pxŸ®—Õ’‰{ÐæÉD0UÁäî¹Öä ƒ£Ü6h ‘•Š ÑÈàŒ fíA¤œ"b¸mÎ3„ ×´@°¸‡·ÁHP´N8Û`-žãiŠh¹àB7°¬„-…úXÈup8…£l"ƒƒSƒ3™È‹gýCI!HŸ©Œ×'*"Åi‚​ÏÖøä#÷ÆÛ´áôHð¨<œâË…)qKî/’SwŽß:™-0øáѪóÁ4Rãò¢õg^VW°‡¨6<pH•õ‰Êx´í‹áÔõ/ µB§/Z!PŽ‘(è!5Q'IE ¹Édm™`‘F„—,m`ƒàén) ÉFÀW²r°ìã)2Cwr&x:YXZÙ:YZŒLK£cAt§`ð^ÈÈDm]<Ý, 0òˆ†SÂðžˆ7|*×@ d!èoIEtYš.¢•˜’Hv1™ÉöÕ`ˆË¶9J .ÙåI@ñÜMú€ pG /‡¶æpåtJ´½‡Tª*æz[ C•› a-P’fž¶¶NÖTõAX´p)œ2}Íœ6¶jøòPnùyåÇS‰å~n ãÔÑÄÜÙn2gxÔÁË>ÁÍ^êM†ìD” hn‡þ‰s$sÎHÜb>ä81&CUšG€ó=ˆ„@ã cM@ãäýQC4WC$Wã F†»×âÇdŠ‹n4œNŠBܤ`Éñâ ë jÎàªÏ|D¹j×ö:€‘Í…æ§ iyÄq‹“ ¯/À ·J¨f‡ E<ÎÌýD®9º¤(¿ö‡f!P哯¾¨2 Ô[wSGxDõWMൊé`ajaÔKp{Ê¿YC!‡'ܼáÌ ¬$óótæ¿bàýwpæ¬xãèòüüqÕû¿â‘‹ÿW|r‡á•—=<¿('ðF Öüá|xW¥Á—ˆì¸›ð$Nƒ ‚\9чÐT#"aat¼ø²¸@Óõ1¢&`Wõ1’‡ëÏÏ€¢¼œä P:$ «úXfð •í' €ÿ 3ˆ“á8ÿ9ˆéHÝn¡Páa`‚ÄjÄÔ ö˜²ü¤ €†@ÜmÀ– Â0ÁÉÊHô)‚Ðæ b :"?´Y?ËŸ‡F0ùA¢ÓÈ Ü@ê`S ü}éÁÁ¸BXNKã CHÖ2–…—~wO+p) <œ„ e‡S1ð·>4°»ìrq4<ÌRœ ^´ •·YF0Üý ÁtºQÒˆ²&P<NȱdHž¥ê‡óUÃêùËʪª†È õBŸ·Åz0X ŒVA¦€c°K¦ qÓ`’Ü1+Æé3`œfƒ'Lœf˜Hó–5ÔP‰ã“ %8…ðhGú…{¤f#/HñŸØP:= ® ¼âÁô@b}Ã"žÒ(Ii¸ªÑdX«‡â ?Œ(Hapð¸öVA´€!†2ŠØ?ˆÛƒÛ²è8âµ.Ku)´ª*šâ‡VU à %0¹ÃË=<ðUÞSüÇÉëöù/…ößuþ«‰×ÔFü¿¸ç¿:Èù¯6þŸóßÿŽ?Ê8ßQN` DŒ`ÓMZèéŸ8[4á½ËkŒ¶ ‚ýžd æŠàE!M¬º^²¯ºs]€¬€ŸÇÊ–„Ãp‹üì[#Àâš–tXB0ôŽy yZ®CÀ- 8p…*,ÿø|Ñ(l`DLjpW6#ŽkœwíY*à>rØLd¡g•/Äi‰Œ<³Fê¯Ç„rûË!õ»Ž3ÈÜwÑwõP¯à*`Š.¶õ°qöô€L| Å¦nn¦N>*\£#²^°Ñº±9}E%Fðãd r$çÅÉžRˆk™¥8ðà¼ú*meëán°X9»A¦0¾‹©¼/÷t0uƒ\<Ý\œÝ-áÊ™¿*à+w3üÇËÅÔÃ^ûMÐõÀC '(,B-‚€ #(93âiE±÷…KéAsÒhÉœçFá*âEžëõž¶4^¨nÀOƒ K<‡?2‹„þ %"o;Ñèè7‹H##܂㖑¬,htdÃbÀívY…cBQ ÍSàCçëNƒòèó·¤’ŸŸ¯ä'ê¯Ä@È2òóã¯Ô€¢L¸5ƒ!y9–M’æ#.Øœ¨æ#Í‚µå@øÏü¿à"aV©¸åô7:X äÉ ž¯ýÔ òB?Ü–Êtw¼QC†` N•ægSº-ªÌAP§L ÔQC8Ûêrt;d˜ƒiçsƒ‡l ¹7€[X´³)40) ûS ¯Œ”â±X%Å~ þ†Ç*Ù*¬µ¼-<÷úKƒàC) ‰"HÖy0Œóˆd‡"ë<,u0 uD²Ô¡ÈRùÉb}I–áþŠÃñµó6»T Û²²Óæ‡;W!Î ÇÁô€"Žþ⌠:&ú%‰Ë#pKG #šg‚'²û‰„‘É Ôv°¿ Ã ÷_¹¦8ÎoEUSs{xoh ú tíu‚pèù¨ÀQéÀ|°»âƒá|òƃH0€¹Xà‰·Ä݆»ê(ãà+œAp·„WSSg7Ei0Ï‚HŽeÀ åÇf¹iðž-Þ¥B°ÆÌÉñ%˜ õ ˆsHÍ1@"Ü$À„"Bc!G· £Âx©èE^Œ“³›#p¬FQaP}Œ‹›¥à7¼R $pp<b Hx‚Iˆé‚&• Æ¥ ’`‚Al|ÉàÛd°×g\Yz[Zz{ðŠ“?œ<Ü<-MpÞ§‘xh¸C"“?œ "¥ <2ùÃIÐ ÐÀ “_¡kB#žÀ˜ {J2ˆ’ô‡Ó‘–64Üq +‚3OqžÏÏÕQ“gvå$ˆAˆµ®‰ÌNÎ'!\“@"3XƒÀÃ5U‰Ñpg±›·KǃÐu‹·mçMŒ!&Œ"rŒèdek ’…¥‹%,ÛœÌmÁ‰RFÿTTD=“Ìzܲù,Ð0\¡Äó5ð ‘ç–Ńç+U5Pv †Î`QYFÿf%~)zâÀ)X5>žo»„`ÁàüM¤XT™F%0ÏÍà·ñÇ/Å)ÁÔ¸ŒrUpb4Œ£©†$Òè0ÏjÜf@ö`Õª¾þ8_˜??¥xU?øÏBpœ0ˆ4‡(Ø~1Ð͸–Žl¹ú[ÄQ¶ûk7Í –á§Ìyëåƒ+¢hðç2!r‘z£} (Š7–‡T!œ’Ÿªêøÿ§ ïyTü@ª¢ªïRUx—¡â‡W‘çƒgÿb{EHÞÌÒÚÖ Þ<"ǾÒ8ip_ZJà¥Éʪƒ4¾iøð6–;À%uee[k¾>UìßÚÇAÈöFWWá#iqÑÁ…vr^8` ø—ßÁø‚›UäP…Ó¸TáŸþP‚<Ò)ü]ÂmHyYÙN#ÿÅRõ£©Bð¨áëù‘â"hܺ#¬€å•3âú·kØXÄ6 ¸&‹øxÉ\aI ¾ò¬_ À¹ä‰Ln¢¯JèP‚à- `†@,ià7XšsÆÃ‚¤¥¬GINRä/ Áá¢ð, ü“—#Iá©haéî t¼Ý™´`*8üF“á…@ ‡ßv – C‡¢4FÐGà÷[t°“‘ƒ~„czà2r›…lø€°è+Tð" f+ˆëtTäTm0ØÿrzÜ6"€@ ÎfSÂɰî1z‘D¦‰ ¶Ïáqâ ‰Ç÷ÀÖpèô=ð!‰“†m`ìÿS« 0#‡–L‹ÎôcÀe×?TQd§Ùáøc`8tÄKc(<Ž÷*`(d*FCb‡‡- 3c†HÌdfEdÒ†CçêýCa F †þó7páÑE/‡ý ëo þ’‹þWU`1#ÿŒÍþ•ÈV˜¡›žINÕÃáßÛèÈáðXðî|h4Þc¤Ã¢²™¤ÆpÈÈùÅp¨@ªÑ#†ÝÜ­ã0¨àýrä@Ì@ ›64« üÇ`£DgÂÚüˆQ‰7< XÔÑE‚ñp6³³4÷è·GñÖÅ ꂋμ!²ƒ­Ú¯,FÂj‚n‰„ÁÙ–V¦ž‚`jÀƒeÁ‹ôÿaï:£*Ò¿èYòôì‡ ôƒÉÙM²!ÄÀ† fzI6»›da³»ìnpbA<åôÏ{CìŠ –³#xŠž{ïÊ]ìü§¿™×öm²1xÙ(É{3ß|3ó•ßÌ›Œ)¡°™S5†ÕSGÐ*6ÔÔ ÏRHs·–”•‘åǘ‚, EnbPvv{Èë+GáçfYåý%¨$q™Ùjf̳áºÉÅöp5N,­¬ÇOt<®šÌÈÂ!6´HQy›«MžFWë1*InT AÚÓprË Y#0Õž‘õ‰³L) ›PpÞȨ`¶l]¡bFJBºØQá+Z¢“ûÊæ¬S‡'¢Q‡s”ü¸Õ…’}o`ª5™ëWΫŒŠJ>YÚj O%JW‘,ÖP‰p!+§@”®¤5R\¾âD>Xi\¡HDYh™nß+JYäk“ áñ'«JE=ÝÄë”h¦¸8C=¡ NQ8 Z“m¤ªQªR±Âºâ)M"ÚÂk¾û^]ÜŠñÄô…ÊQË5Tµªf¬¶Q©mÄjQ†Öm°\4•„øO*¯æ˜€7U0D‡@›Œ9¹ÈG² 9£µpé(G„O”·›o¤ÝêFÚ-4Òn£FÚi—òŠ2 „Õe•Ó& k¼¾0œ€0$ˆxƃ íî®f¸t‡àÜN¸æ¼|ÃKðú¨ŠÊr<ÿSY‚¼ëÉ_¡ 64è< [D0Ür;F„(ti|eŸ]òŒ–L̨ª€èª_jáÚZ Â‚"*ê-+Sih£µÚ‚Ѧ£4È$ GR-I}ïøz5·êõ¬¨´•4òAz$z2Q*)ö)*$'~ÇÎN"¡³À‡q»[(Žó;rÈŒH¸cnBîuå kZ_1½¼±¡´nR9ntìˆÏÓ>’:É Óü{Ô ûàȲòíG¹ o§Ÿ{ƒëô¹W8Ü!&'ÃwÙpLI $Á7Ž.©Ð¡WåÇ%PeMƒÃÞ}úpT‡Z¢–’ÂHrb>sF%C6„«„á‰7w.p¡cžhË»°h˜ô´Ú ¥ åx9ÜíÃ&\‚ÝÁPwu,KäæQ²x%ßÉ6y,ùNG°#óÆϯé“È(*²L¼¹Ãæ@ÛŠªëj&N„PÃ=;ªƒä ±5+â©6IÙÛ¦?qÇ-ž¸RL·w  ïõáLV|OC«–€«éàmÚðèC_$[…¤ÎÞñ£(‘yF–Æ‹lš¡¤4rõ-‰EÜZÞïõ¼§ÒÐ)…-±É pycú ]¹¬LvQ ¿èW6Ühˆ­Õ`«Ï‹g Pfl¶”î{B3ž)dØ^_kf"áÂkÕ¡ÒqrÏí•Ý2š µÀ;ÎáÀtvÔvããäHåö5`‘A¯;—=‡;Ðk¸§O´ “ ðiír(èñd뮽á\v oÙ“+`Rr1·žE4<Š ç—\“ “Eþ–.¼oŸC“SPYt‚* úÚñ.t®=fÆœý@Þ¤''!™ª Öî¥SÛÞL'“ •4ÁÌüª¹I6ÝG7É¥gdøÓÉ’`2Í ä‡Vþâ×,eC›¿˜-«%sš¸¢òmMRyÞC郘,•‘7~«/«©…½IìY’jþÊt¨ŒN¨{[ƒ¡9ˆFˆáÝKH§:õ†ÕC—ÁU—ϨÇ'ÝÐ^+̬µžLBW(t4Ë´ÏOÛƒh›ˆAt´ƒ'´"ØŠ÷<ò  ”£iøEô•Gò™°iBÏÊC6‰‚:Ý/’´egdÑEøüòàièÖ0‚Ððì.^Ø7§2}º¸kîvãcåltì½NlÂrv^NÙ-çi=W¹cÄb¸i.³8“M[’ÊH‹ÈŠF£ÙÐhÀç Ë£ hÙœ&2Þ"h«¨baØiÓÔŽ6|0:$Ñ¿ÔG„brJšÂ‹½dµw9\:atäü¹Yhj~®Ía§óó °)L…hÃGò‘ðliî`\4,š;b”Ð1œ® ‹Û 5Òx¶77ót\N¶0Esk 22XeèZvEéhnÆÀ+uÒí¢ÖõÈ •† É/O(B޶°ŠéMŸ'Lgcñ›''BRê l^`‚‹‘WzÕÌCõ¤uÖTV§º:ù@»³Q—°òt舄¢0' *W4J¢+OÐâÙ_Je¥:ð¸ ™Ö d•Ö•M}­zWì eo]*Mš]QÛX^=Mm4óP¥_†:T­Kýaa¬çŽºVhÕmþÖØ À´ÈÙ¨ÁÇm¦yB\(#ܧd+°æÏµ;ºáúkÐÌ,±9ºáâ‘Ö€žìN¸y öðñè?’‘‘)±î°Õò’E{ð™<¯p ÐW9û°.¯_S·‰¡hm8 ÆIaºzôTž¦5ÔÀ5jè<ãP¶üÍ¥¼á¸‡†ãmf ‡fLuIÚÓgdƒ3ipXm]ÅtøUY1ž£äCeŠ)ƒOÊk«j&”ãòâŠ0$GO.ƒÂ­‘f)õ"A:ó[Pp5uyuéøÊò Zr¡¦WŽ réFúÚZ[[‹žròÌBÕ«Ê9"uH3s&ŠŸ9=ÓLÐ áuÂÞPŒRò BgMBë g `úâ‚c£ˆþ…oµø ~!••pt áG´1­¡’g:­ªv|E5 Ä.©¼lrM#2#üDBªY¥i`! dR]9ª,zïh. '—4‘RLÄ“€Rà+ü ÞÊ«É .òÂHL?¹~»Îœ™ ¹\Ê›KRöW¸È# £ÛQ\ü»«lAq©‚¶Å%†p à]—á’*I+QÑ¡«r|bÊgö Ì©fü†Q ÀoTËä†ÕÖà€ÚðV݈éÁ_^Æx6(\AgxV==\ª‘îÕ vIU¥ÕHè¾O-'§+ºè3 ­®˜X›$R>!ÄOfŠfF\äÑ%U#ÁUWÁ§ò  ø >¹$PNh0ˆ<¢0b_ø „ÐÜjp.èOA> )ÈwI¤Ãض'òÐ8~´³šº.V TèÐ¥j |Wb¡Ê1Š! hÔ,HB3­®’¯JùþàãI¤á·ga>Ä%Õ•VO¨©B&0š{Eqàð“KªÇ˜[–î•Ætß4š‡AAð¼C“GïðÁ%q¥e¥t7GÙ¤Œàßq,þ’¤ql;6xæ'i<¦P‰<”@áiôÄq#OŸi(n@é3 ŸÎ^h8‡ŸBÙ:N÷‚±Ê+Ž/Üè Åh<„iuÀã;I,zq‘‘± .2bÄ…¢—Ôì à'Þ}Æí:ûÑÐeW,¿Ò8O¸C‰/4<Ä%1êN_Њ(1øÄÒ²0M)û]ä‡EB¡N^A\ˆj?N? AO. ~7â®&š1Q^ñ;eoš}`UWÞH ©8}&¡!…8D)•Js¯.tn)ytIÂ~N—òcP/£G· Ó7t²!ÆO(DÙáéRÞ@ ÜC³d/$nâh€KÂCè0?x®TcáG— xÅJ .x‰ÀO „)‡êEg&¦Ð‹)¢”iñŒtùšp¯.)ª¸A”úZ䓈!€‚¡E ¼wéŸ<‚°®(«¢”ìÍ%‘ Á̾øw—Ä‹3UuGEø‹8'boVnÀ0ºC³>,Þêª3Óu—˜‘ÍXdϦ-uËFê–Ô-©[6~»[68HB›µ¿gCÍ!Íôª z][åµa3¤Ô»î"^ZYÔæW_Ü|±«]|¡iÌî»P‹ˆÒ¦î¹HÝsarÏ…ù5z·\ôö’‹Ô©;.Rw\¤î¸Ø5î¸à¯¸Í®¸»¹ª.G·ƒ€dëõmdqv‚·¨Š:Êfx A®q¹Øzy“A2.2(ã×ÙùíA˵»½=ii\Œ²Ç[ §›»…P²¥†)h3·*ˆìáó›·õ"Èžj! îÕY [´=š=&dG¶ÈG܈íÑÒ•ßt­Ž@»­…@´…ZÌVØ]-ã=Õ"5ÝM-*ßC-ÄC"ºgZ 7KëE)[¤=šH¶/Z'!¿Z›’mÖIi–NÙí¬Ƕ8kã”}ÍBÝÌ,–‚ìb)+adײ:0èU){µ<ªp¸9YCŒ·% ¤t3²Hw! dï1cJw³q³±G…»Œ¡°¹Ø#I“ÕW†ðÙ’.³TAÁ¨*„8¥(–± ·Âî°_ÌÝî,P±¬Më`"5ñ1™G›hhŒB $·¡©½MGí"1»xEG—mj]²ˆAQÐ'SeŒÇWhzm„‹›áu-ê[:”;uPÛ©å F„ ;gšÆ;1Þ©Æx§ã‘9 ¡ßiýN••5¢•Ú‘¨a2tm4×:8[ã(´,Yßx8õ§¦ñp¦©ƒxEh­­ÄÂZÑ÷§^óâ4l^œÆ†Ó´Ñp7NóFÃiÜh8Í §I£á4i4œ&†S§ypj›QKQÐ[××i8œÚ†CkÄ'áy 8õ£üá|ã¨m”®pžh§P᨞‹Çê§G}Q6@³[¸n<;w£TFb¿º¦S¯Ñtê-ä/%VšÔä8eÝU›K'héx’ Sáü±¬â`cdU'ƒXŽ“è㫚Ÿ±*nd5ÜœUó VÍŠ[u:oMâˆ=éPp¨«ÊVÄ]³HŒ¼Z ¾:ù"üU‡ã>„N ‘ÎÔ0lÍñÕ`±:;ŽÕ‘""«8j0Y7žÁ²n,ƒ^ÝX|u£üÕf¬­ °:š±Zú"ÐXʼnà±& Ddm ÉF<*›DèE9Œœ“ø“>FëR©pZ/+C¨Ö%&p­ÉŒ"¶:‚‚¶:œuA¸lÆú´:(Žï £“*{[t`…£¸*œ@ÃUÌDYAW³R\ÅHÀo½8> }ø6Ž"Ö¦%àÀ[,»ˆÝ&qº5 ¹µy"àV#|UËJÀmU5n‹`[•’¶*X@mUœÚbVÌÖ‹f­É[/Rl½X¯uc\ëÅ*h­Š%`­’®`¨VÇa¨Ö„¤V+ZDj±8"PÇèÄ8†¥ ê»>Fë© Z'C„Ö£%­Î‰â³*œÂ³*˜¢3¼»Ð*:Ðê 3 ”$á*TŠÐä%O¼ÁO~޲‡³(«¶x£Bü°ŽÔ›K„S×ïŠ×ï·ÿÎ. îÁ]ÁÖ.|Õ»ïXl‘ÙAöiø.6rB»dË&žU#Ivʼˆ{dÙÈ@ÎðN;ü¿yŒÉÝž 8€ÞT´­ˆ”æ*’twë‘m8à_y]#ÜH†W,ÞU »ã_÷ž):[Á‡c§Ü¥ŠNuÉÔM”‰vI#780tƒA{c3áÉÛÊU®Ç¥HV+Ãs˜È2åÌb%rúvüt0UˆD÷½åpL¸ àÒ” £Òè.Ü4¾pür8ÃŒ¨qIù2ª’£ ÍyHô¡Èð¬Ñ»„ €ªˆNÆ) .(j õdǧÙE^ŠÜ(¨5,™è”å†HxúlàÇXhâ1m6¥Ibˆ Œ¯b0õ| J‘$™J»ÈðÊz³Ú:­^¼]šˆAÁ¡ËãCo$Ö&~®ëº¦ i“„›NâðWß¡b–fjSéþ˜¥3 ok‹à!;íáì¶\`×ìæq<°Ÿ¸omË,DŸŠÌ2‰çkêR$h¦B~’q9Ó¹,¥e™`ÖDžR¬{s Brîp$x5=àa’töp‘Kò™ò‹aú†{_Ƀì’è ¾Üb¾cß7Fȯê æhMQÒ£¹Î¤s'%Ÿ;Z#’t¶tÕTÒÓH²ùÒUIIg,.ë+öÊz²>Ê-Ië#þü‘¾Ê"Ú·üû¼Êò½¾Ê€­ì£ ”E„ÉÏ€îéK>g²Â1éŒû"ÉJÊ>àôöWî°xÃõÙ}Á¯¡L:gº 3éŒé‚¾¤3&[Y“É—î†M&Oqãqò9ÃÕ¬Éä*ìÑV1–ì{¨HBAðì¯/\VFcã²6Ú ‹Ü‚WÐÉ :ù£ä||wq´{®=g„2›Šçñ&—%ÚäìªÈ2»jøW þM”Ñ 3˜£½!’³=øþ=¸´ïøã â»mªÄÊ[mH+F… ;Î’ÖVS’™qB¦Œ/<Ï®Lz|OI0$cvãK˦ÖW–ÖOvYà¥TÂÄ….%$gÅÃr'ŽM‡·yyQt0"]6^¸Šì°®›ô‰¶›ô¾›@*z4>œñ?!³)e=5a"‹ô‰ûâú?».õ7D€@r- ËÝ…M€0ñ·AèÏL¿°5¡oã_w«wþ‘xï­Þ)Kü°ÐãËG´T˳Š%[È¢‰®¬ÊÔÕE&šŒGës•g™M‰ëͳqŽ“P]š/é‘ãTúb|1þn|õwï8ýa×’ù<šd‰fÆDÙX1>™„©Ø«-èÀTÍÖµe¼ÔuH`*¶À¥ª²1l‰¢KV?ƒVY²d61¯€wÈ *^.–JIdSkµj9Ù›*ÖªŽ,”XvËk9zNBU¡‰W ˜ú˜’n»’ñzØé®Ž™X#šÄ Š8¶je2™›ªÒšf,ƒ_f‹K¾z@\áGQ |ú|’h­’Ñb?:ôðè 9LV‡$0…¥J}TÖfʳ¤«@ÕÕÒúÏžƒŒR5CˆabILÿLrìSÒ_‘Ë€@?Pa…ÈÂ*¨ rH¡ìT Ã26S—-XVF ‹²{$´J†0BD‘‘þ‘ÞZ¤d¸ô^Az_Å€&Ë8BR˜A‰ÂT­;*oSõYRŠeLáÊkmWF/E©ž1¸0á¤ð¥Ÿñ%Yf*™nÅa`#܃3PG”ŒUÐáS™Š¹J«‚üÍ4k]QVAH]~뻸zFªê’(´(õ/(õ‰ Kq¶ó©!Š^¦5ÀAŠI'A˜"éâ•’¾ž©,hÚ’Ê„+®‰ì í5d)ÕŽZL€)ØÚ%`«/ ZÒÝ,Ì Ý8P KÂ*™¨¨Ø«U*èÀT·ÖµeoÔuHà,‰^ ªÊÆP$Š.…IýŒI}dÉ’éÉ""Z ô3Q2 aUü2s=ýZé¿ZWTB8eícLu(M/Qʇ˜(´Fí•l–ŒN'bØD/Z¨°Ääa‘H0RXª”Hem¦?Kú°Š>\Y-XÕsÌQªf7L,)¤é_¤IŽ}Jq(ㆠÈ@#H'¼áҙΘV»¼â(Ù²ÊÀ"U=9ë®WÈ$VÛ  ¦pªßqª¯ ZŠsü¡¼öÔ¿Z: ƒW¼éMFºŽ?šˆÊ/+Ë4'i&¼â.P 0^»x%ß %ÓÃUyèb¸8É$[,•9hñ̵VäG¿•\ å·~.o¯ Š¯®PqBKÁT¿ÃTòMX2< ™'0‰H$PB)̉2ÕjË;Ž-(%båµvvw¯À‡VÏ xˆpR Óï “3•ôlg(ƒÞ,ÄYXÅDn.”JeXÆfú² «˜ÂÊháÌþž£ ­’!”Q¤p¤q¤·)™ßÌÀ`D°p¢’UX’™À‹š½J©¢Ì”›€¶¬Âަ \îÑsRWÙŽT¢KÁRÿÂR_Y²dpÕ‹‚Sèuà‘†edBôfDª5ˆålª: ª°Œ>¬œVnýéÞÐj H aúazo˜’áO NhÀ€E"V!…¦0Ž©J{LÞfú³¦«Ð—×ÚÝ_=‡®z†£'1ý 1I3SÉüæOå¨1>tà8&ÊÆò±c|2³ÃÇTìÕG< :0=èɺ¶,G¦®C—Çöâh2U•(E—§~>¦¬,Y2ºŸ’y°ÅäaœHXRXªÔHem¦@Kú° B\Y-]YÚsàQªf9L,)°é_°IŽ}J†WÔ2l¡\‰XEšÂ^8¦*ý1y›)КR¬" _^k·÷c¸ê‚Œ"œÊô/Ê$ÍL¥8WV3¸ƒ,訥czÄt&¤É@¥_•Ì´œˆÊ¬B’¶‰Ü~ÞsxÒTÛ¤ÔLAUÿBU´!xüRb:„ñ2JÅ”¤ñLÈF_õœN,hߪD4±N‰Ð'×ă6^¤)tÛ%ЭO­ÜæÚ—èƒ àÇÉ'1€c 㟅®Ú]ÄWºE½%lB]¬S'ÔøªÇ4NŒ)@Û­¯ìÚÊ‚îp,¢f|Ô4QJ‰aŸ6.¬©2ÒµA/ñÀºÃ7u½J”S‰!Љ‚MaÝ®€u}n솠5@¼h îTòI뢖.OñÑ´í |‹&nÑ$"[Ô:¬ES˜¶kaZÙµ”öÞR}7 %†f ôÛâ7d 5c}ÓcK°¿–ÔÞZ"}µTOmWCµ>4o#`‹† f”ˆl¼„6%e\`2ÑÕ<§øš·ª¼Ä€M¬OäI6¡úq€f Øv`ëCó6¶H§°±ˆlœ„6–2>°ñ™èk^чÍ[T^‚À&Ô'òd_ýxÀÆ 3l»°õy[lILØ”ˆl¼„6%e\`2ÑÕ<§øš·ª¼Ä€M¬OäI6¡úq€f Øv`ëCóÖ¶€;ÖŠ´sˆFC.”)2±Œa4‰xqlÕje27Õ§5ÍXÆ)¾ÌVèz‡L\!IQ ‹ú‹’h­:° y|QnË ¸ Ã$bsH 3ÈQ˜ªuHåmªBKJ±Œ7\y-õm”êƒ N kúk’e¦Z Qï0ÀÏuHô@‡¸'9m|·°ã=™‡6X:­! Ç4Ä?Ÿ!u0î)I0L-˜D}MAò>`á„ÉÃ*ž&€¢°T)ŽÊÚLs–ôaS¸²Æ§êª(U3„&–®ô/®$Ç>õ %èå¼ `XA²°*€ÜR0; ŒÍÕW ÖÁ„”1M/WÉF(R Òß Ò;‹ÔXÄãŽú<íaD”° %¼\,Š’È VÖjUr²7U¨UY±ìÖ({:BU¡‡W €ú€’n»ºäíá¾d(ÂòH†`s",µ*D²Ž£¾øúHvhYãSõnHÕÌ ‹%3ý3I°O]hñE"¡ˆ.8d à •Iƒ“˜C c«U"‘y5ZÑL@£”Ù ]oÁ†UÑ n¨ˆR€Ó4kÕÂNÌßî up7Ѐ :ŠD¬bMa9S•™¼ÍThM)Vñ†/¯²^¡ W=C°Q„“šþÅš¤™©h:}‘¨?ÄöM,Ð(± 44… ÐpLUdò6Ó 5¥X¾¼Èz4\õ FN húh’f¦Z YñÇ| Î÷ 3LVQ†$0…¥JyTÖfº³¤«Õ5>U¯ðE©š!¼0±¤Ð¥Ñ%9ö)@K³?¤3Qôy BŠ" pB‰õ¡„c¥¨‰ÉÖ@EÖdo>ø²™Sô6¸ªèA†Rý\ô\ôÒˆð}±Fø/#ß9bÈ@„ µL,€†˜D:4lå©dn ÂD4cL´e¶B×S`ÑTQ^Ô"JL¿LÒ­Uvb¡09ðmà –…e¨äf0CØ©•†dlª°øZ° -´Œñhz)¤JÆp‚E‘‚’~†’^Z¤‹ýAohq´1ŠàY !` ‚ˆJ"pDH¡%j¦ŠîDy¨/¥XÀMy-õYÔÕÓ•pRøÒoø’\3•ÜžPG0éʦv8*KŸ-€Kb¡œ Å¡袀Nq ¼_K©¸½nŠÕÞhÊšx Ü\¿`fñµ=åêA}Z§æŠ/C»°+ÿ†v–dÑó±æ¿3/k^?|šü-²ž ‹åX›/‹2kRmiÃäÆ6U¼/õ©â™ ”-þ¦ÿßl^òN«ÞùZçѰUnõ^{ÌN§3Éë.ìÕ|¡ãº5G¬çÙ/Õd•„ÙdŽ%iÅuWU!ãÔöb–Q©“ÖoyY¤7Žã&Íp ¼5±¿?´ÐÐ&à‘P¤«‹*shT÷ºÝÝõ9Õ'äÊýaq*†»#AÖ“×]Üÿi¡-y?!6ò~ÆK«Tf°jIZ–ܘ+d’Þ¸±R'}7¦²H9±'NŠáx#k_þh±=¶è‘ºèȤkŒŽI|t䈓ÒïZŽœjråþ°8p[¶{vJDâ_xKH {Žƒ Ï~:ÃÁ´ÐÈj“~xƒ±ŒRoÁá“nT&^ÌÚòß§[lÓôd]¤$oŒ¶*²øˆ«J”v~×T»Ÿ0 ô·EJn¯¿5þB ?ü›|”\e‡"õÑA)š0 Îû¹TÆ¢šküjy§P½ðžú)/s:¥Vÿ›>Ö饾yÛGÍå®jýÆ¡¹ýkÀ EQhœ9ŒPªž¶fýà/ÿ«­R2<¦-„xØo9Û+o³2ëª&T{^¿Î¶êÎ$:É“3šú§OÇñ’8«ªá×÷3ªIó¯8šEû½ÌžîbŽ™jãºfÿÌ’²büV3¤½öçx³¢jB=oî·ÙP½Â™D'yòDSÿ”S8e’f=5üú~Æ3iþe¡½´àa¿—ÙÍ]Ì1Síe\×ìŸYLVŒßz³×~meÖRXÏ»w‰ÙJ£ÂÆ!éƒ ]¹¤ØÀû`VR—÷o3#™T¿´Ðæ&à™¿ÇÙÇ]Ü©Sí²%·îÿYƶP4–~£æ=$ßù![c¹áX}÷çËgäó çêBJ>q@Ó‚Œ\RU ý˜ž: -5s;¾zÿ›¾Ö3£I‚òE¯@Íã.íÆ­a|ÏÐ ‘>î°Hs´ad=mÝúÏ•þW®d9SßÛ õ¾ßrr²·~he~RC©ñÈ~¡Ô-žY|’§B´"H9¢¾#&qžR˰ï'*“ékñZ>«Þö{™­Üõœ4Õ^ZqÓþ™³TÊñ[MZ&÷ãÍ[j(u=»ßf.u‹gŸä)­Rjì Iš¿Ô2ìû Ìdúš•vÔŠ·ý^f1w='Mµ£VÜ´æ2•rüÖ“™Éðq+ó™ºÔºž¾KÌh7MLè‹&åÌÆÎÜóšúÌ›‰Ídû¨•¶8/ý=Înîúžj¯­ºx¿Ïq¶ƒbº<Ÿ;˜MTV$¥eGÚaq†Û!IÒŒ´Èv•áoIòú£1.$@ö„‚-þV{ &ùƒÑ˜;ÈnwE ÌàocUiu½MJsedU×ÔU•V-Ô7”VV°`ž[’ Ê>iž‘R8Ì9ä?ØõúÎñš°hý‘}+b2oD’jl‰„Ú!kC [qÃõ €5nÒ¤À¼UÔ¢ÖX$S]L 9Në!pfæjÔˆhËÁµ$ÄK¡„U¤l¸=ƒl¦uðD\ØH0¼Ø@JÏ`áy' 'Ž7÷ÂPˆ‹ëé‡ôEÂÌK™vÏØÝmä'¢”¬; wáÃäòÒ åuõEª«"Hp<·ÑK"Š„£Hº÷¨xÇõ½²ü¾=ËÜÀ‡ŒÅc”Üš´Œ_ÉÝ&|kjÀ»$%ëòEq÷IéÇ3Œ0Âg•7kŒú|Á’`³¢b”R±Õ¨#›•ÔáÀÆ ?ÜW¸Ò¡P>Ê÷p®Ý lüóE²I M¦¾6¡¢¾¡±~Úx`åÀÉäb…:Òu{&bƒÖF K@¥ÐŒ22pm0!ND‘‡û:"ðûÈ.`>¨•NÄ>yÜ¢/øù„Ÿ²Ýí”7ÿ¥Oœ.~ÏÓÄZöxm¬¤p4¥SËÉ¥Nð‘Žådð|mÊ`0<¡Xáâ·WcZ-Tç`H¨´Q–BEuš+þ› dŸ.IŠˆñÆÜ­­>/Æ*™€^àuA„²E"A±Ü¾Ðð±¥b¨ ŒïðI€`ü­X¢ÔJ†%Dг„ÁÊkË«'”W—U¡2m9 „,Ažì+i /ö6QQ…”7›±|ˆ·?è tx}à½Ó²mòX‡××év<É{|./FBÝ Çi‰Š 5”öp¬ gI‰]岚äF y_Öøþ3ö]'°“j‰CˆðX<È‚‰P>ÐØ(àåJÇ# B22 BâtƒÏú¸‡HÚü-1±çk­±´¨.#c8µŸt½Jqý=BkƒAy™U‘‘qœœÝо—y¬`Cذ+ð#1€+¢";,7Z$é%gÚÃôKìZ•oIeØ»P8&Jн¬h‘S\¯8ª l$ÚFøÊ‹e:•g("MB•¢ÏnV,nlîð¼°±¢­US’¾5‹o…ò‘³ý zW€tlõé’'ê …}@šè¯I€ÔøTTç+]_VS À8»YÎ^Dj‹‚”êò¯ Æ¥!Ãæ¤(l0\(ÿJË% t@$屈 æ‡ ÅF£c®4Q™|ÿ‚~Æ(ÝŒ9sç:æÁƸ"üh“£°çÌÓr= ¢ìØŒH¯cáÿ±åWuÈ•ÂQh¼—~xÁÒð4ôÉcǪíÐ!(‡›Ò@>ËTˆ€´–ÈôäIuøOý¬*ðN½à&R¥p؉'þ ÿño\Ö DP•°ó6±¢²¼žùxÄ×]XBc£ní…r¡[Û–ˆ½]¬h,â“~'¯IÜÍŒ:æÌ³Ï™Ÿ‘1wîðy޹àçxG+ùl"ÓåÁ9ª%>|ïW0³XéÙ6rxhÌ]÷Æè qKßz@ýJ9Ág_q,]­Ä4buÝj›€É¸.8èαÒ1înãšØ‡?£MÇLK“q3sŽc½Å  ÝŠ‚@nÑ‘Ž9óxô4“OŠ%w4é9’" %CƒD lƒÚ •!Ѱ³! fÜxãÓyBZÚ‡îOªï óüÀ2W¹&ÖÇçørÖê`“$|Љƒºtrv¬ §b|ؽ¯0'd»Äç_Çí!¯Ü1"²x‰¼l¹<·˜åÍ*'Vç‘Ñ9DPoùØ™“ŽX8OÈ9\§eÀª)¢îÕ÷qÝX¹˜Þ,”HÓ#E ¬-YìFÙ„ 2Ñ!rãÀ™(?^“ÙÇæ>õ½‘®HGë¿q"Ö€rå)ÅaÇ8Ä*•ƒøÜJY _óJt™‹ÅŽøӿÔgc1AßbÚ*–€±4Ï‚k,æÁ¥ÑæC†*³<^KßÖ`EK–&”÷ÌÙ0;Xü”í[./YªWû%V²„³¹¸LÎ(­«®¨žT$§×w„áeí¨A…Ds;’ÝOø¬ŒÂ!ôpÄ…78AˆàFzÀ×êötÉáH¨5ân‡s˜8Nx}àÙõíéòØãó´¹WÄðÌš€¥Nˆ…Z}pœ¶ì¥±l›å<{á_„´z2›mAdÑ6wÄ¢È ©ÜüQÒ©ÄúF(¨œH,º1LfÍE"_µ'/¥¡"‹TáÜküŒp;@¯È¸™!ÝÁ†ÒºIå àÝ€cI¦«(Ó‚Õ|ÅÅk^O#í§À¥ â¯˜â†æÏ™_Gñ¸âHÇÈLe°öúXOxYC\žíˆµ‡—;Üí@îÙàÇ¡,ðE/öâi%Ýd=‰P:»Ýþ§îÍ}!øW6¹¼ljcYMõÄŠIÓêÊÅ.>öJsšìl<P‚²¯À ag‰bLçJoÒÙ6‰÷vúãÒ p‰KEÊe•ÎS¶œ"~E€Ê5bÞH,B_fÊ'˜Še$¸—™è³–qá·,VˆéhwGÊ9……ð…Ž°f(öšÎù™Ô,;)‹ï!•€{ÈEÕƒ1ÕK¤¥â·–ã…½dû€˜²˜}t.W \—Ò’Õ¨Y¨NKLÐà¿Ê€à‡gÕ¶\ÓGš+‹Ž”³¾ë1Â5_]šž8èé ƒaJë_l¼l8#ÃÆmª‘ñÜ6ô;ê°;J­è9Œ~/A°œ‘Î$K2%­:á‚ú‘ž‰«¢µ [&·„oR+¯««©+ý©.´)„Öød¸Ð‡èá9vn51,€1wÐó¥C”ÊPÅrn6B~ŠçqA_ À^Œ…äžIˆ4‡:顪ðäÜf>ïM@æ‹äRT:l-¤`x¾!àk‰Éî–ø`‹ÒåbÞW…••lq›f7ËÂ6Nhå(þÊá†ÀðX²˜®`¸Š ÄÌ·Ñ7‹è[EНÛ¢ÅWö.eÂ\Y»:”HFå¨pI](èBöê±Î;jõ™°p‰d:-OŒº ×JáOU¦šn‰»Mly QËC¥<³Üy:QœˆMüÂŘîv‰ˆ‡+ÓÄ8¶ˆ-ÁÙU6TVŒ¯+­#Ë jëj&Õ•V¡g´»â&^pEiâAE¸J’¬úkÃÛHQMímt©1œP+’¹® |((žÃ"úꕨx|Ï`·†ÙòoÓ%­º›Oèˆ0œŸÁÆÞÑ(u:Z3m­Ðžßtˆ¼î˜[!‚o‘âÛŠ›óÓý4ˆS9\nkÚ5Ãq·‹y‚”’€îBON§Üh’´HX—@5ÔUÔÚ2­,l£+‰©Áá`„¸Ðë€(C¡V‰á0Ó’ì¨â:„™jý×.YØtUîð»³Q€EìéB­˜ñ{:ÑêZ¿§ˆnãdït¬¯ª,/­Æ“ðÈè ί‡0`‚>}QšF=fÚxÊÀ޶Ëq˺e#ÆÌã²ç©ÄR¢O5ƒêªâ$I³ªV©9»KG£Ht­±. ˆÁÞ^Ô3S’£åÎà ƒ%îõ| d¤É@ãFínÐrùu€Cކ}¿; Ãͳ(}ćA6뒮⡈ Bqe¶3—|YØ®KßàBW´Ø½Cдh³ ó†¡CiǸÕÈJq”ÁBØ"úa2V´C÷;Øvo–”¶Uœñ)µh¦Ã1بi¬/õ§m^®ùe•—ú€Šuú‹àg4/[ø [+©-ÖÀOþ`KBfKH„gðNâ¬U_»cBæö¢e–z»”8ް€Ü‹^óÀ ¬j„bp¡Â*T¨¾:üy9à*åM/V>íЂøÍ•JTØÛ¢D=†0XàŽri¢ºI¢B Ö…Òº|‘vi}-\X$åpÃÁüü˜Ïîqƒü-ú¦0PŸ¼sÈF˜%ìõ/|™èâ"u1öš¬ÎQ’Ätu"ê‚ê@éãÀ …mE<\™í7‚Ù Ûseƒ}~ª]¼|vØîì°ù/’ö‹Àþ–¬WúE uíäšêY&ÉËðbAôý‚ü/Pw{6P ¨[¡£–‰!OµFT­$Á¼f *Ê­¹¥+“Ù ´‘•9_™Í>+Sû2›Ž•ÙDK'*e2c*Ó9'™M(æ-B¹1â‹p/$ÒG|õW$¡¡IU£‰p|ƒ« 1P&@ˆ™ ‡ázö[uWœÇs¾ Yñ(nØ«GåáÒ*ES°WV1O¯²ÄÛ+èE<^Ë"H˺^)4xQYiÑÅ4#Í*ç¿8eñ;SŒ³ À’Ç8] TáN2fjP ¤ö r¸RhïWkT¦î¤ Ùòhh †ÞéhÇ ‘z„Ä*x´×Ö•—UÔL«WÆ $Ir•ÕL(íÛôòºÒIåuÓ@»æb'Ã@0¡}2|hfv·ÂµÌúáEd)2ì7ã}˜õ5ÓêÊÊ'T•VÖ/“;ƒEh=••¹x}/f€?Ñ-J’¦$F%·R@B+ 4µ@PtI3¦3.–ÎR^žµþb^¡7¡·‹ÏÖ%5-²öVY?ÚS&:ëÈ$ÜÃT‹35TUbÑ[tÚ^Pãl¨K¡›´vÂD.%¤‚ƒî-¡z%š~tà“*æed8Ø’ôÖH¨¥EÎnnŠü&ãy,¨C(dã ‰áhôfXR»ȈÜCÁN_nl|àP²+-<€~E¾ù‚îv=ÜŽZÓˆ/p{ð6Y$[ºùGû–€/K¸Nb­*:ƒká¸)…lÈRNÇ,ÓÉz2P>´nLJC„þXIIGwgˆÉš V–û¹•¶ü꺬œJ7꘯¬v่5ÝΊ Šš² qev‚×iø*’M€QyŽÓ>jÌH§½Àiƒ{˜'UO“Ñ‚ _8rï[‚è@ e›žáéº}XvËÑ®hÌ×.üíà< Ö²¾+:]_ßàf|øÞì¼<>ø”·Köêšò™µ5u EÒn}õãA‡ƒeçÚsóì9ä¼._¬ï<õ‡ó¡A÷6ðSŸÿæŽÊáÿ‚ga^ΨÝró ¹……¹9ÎÝrrósÎÝäÝ~O?¸29ìïïäg€/ ý|iØ“ÛϹJ%çÀSö¤NpT¢E½r©sLôà ‚cbÀóMðyB^ߨ±pŸ»]ZrÉò†-Á×rÜôÙˆÁ_yh톌o3j ×mìxû1ÿ5GKës]{÷´—ëÒ§ä~uâ/OÚ‡ýpÐú´î+í­‹[:w :üƒ‡·Þº³å¨ÏÞ«Úgj{îÌÙ 9®Üé=jôÔ9oïÍ|úfxŸ=O{~ݹ§y={^rú¹lþ¿ôS/vŸpÖªÍÆ³ºõê…Ÿ_pÏÆ‚Õ_ß?üæË¶¿ΰ{¦®ûæ ã×zª»G k¼8ýƯo.¼vpÕ}w_úð!}ûøÂß}þþ#‘Ãÿ4dÄS·¹‚S®Ýç¬ò¢û=û¨ 3Þ_Ðt°óÍË?ºqjµ}Õ‡??\ó醇Ø_ýìκ¥×N+™óY÷]öÁŽ£^9óÅç~]µíÛ«÷þ¤ûì|úÚùtm8mJIþ”—.ê|îÙO‰ 9ú¹ëÊÏ9i^Õ-ïØ}hë)¯^X°óüM[Î ¼±õOÝSF\¼ê©¿L½*Þò7¿ü({ýàHàÜ'Ÿÿó[ÛÎoè²>ãòS»†ž[Ÿ·ñš’õ«WþÇw÷”³Æß¼ã¹?ßzÓË]Ÿ¿ç>`êí/Î]²Œãn}èãœÕÏþ{Üí×þ}ÆáuîsÌE§ÚVÿ8è_ʯüÚwå‡;¬ãÖgnÙ½¦îó7~ÅÃA蓮þÃ9<ññq#Üッ/ÞÖ‘wÑܒЧ‘1ëú5æ½míyo^õÔ¾ó³Þ˜²Ôõ×ÑZvä%_¹:ëoûxýn_l8}éºÛÿîwgxÁ»ØW¿õœ‹¶¦ým¥ÿ,ïßN~é³çõÍýÑ{ã•ÛnÍÁß<ðôW×”Ý:yÜ«¹ŸM Ÿó×Ûo\à¾zöêŸÎ»fíó·Í»þ‘Ï ºñµüÏŠOÿ`¯Ÿfλñÿ·-·ûê×V•¾ú½ÍG½ñë}+þù—î3Ê6}~jðØM±µï þâƒ+O·Ý{ÑËöê½ÎµºF>g_ÿº×/Þp×3‡4!ãÅ'þz·óØèÖÎÝ^ïþ÷kU«Ï¹êÁ¹Ÿõþó oNH?zÙ„¯–G¾n>beðíÿõÅ~ÙßO·­Ìs9`LǼ¹‹.{¬ °Çܽ«ºÒ•ó¯W}³üÈ?ürհׇüñÏöþõ×Ae߬ºÌô›OÐO ˆ¿æР|Å…ºÂ>G-è'8ª|^¿{|h‰<'D3JŸ7OrÔ…bÀ¡ä@ñc²zöáŽF0©„<õ¾ØðTÙÑÚc®|IlR=Jš›“L 乣РpMGY Ç¢2 "ås²òɨ€2*aTvLõ{AC'a~ódÀ¡²ä’æŠU$à2j¥,Hé«|17úÒÌËQå]¨’ «†ä¨©­’sÇŽ¥9qR¬+Déê¸rp0U—›'åæ!ªËÍ‘rsðãhi´*Mž’f¼;êƒòrLZ;~Ú‰#üí  ¬uñ{ 'ø¢Ð#ˆF:U FIÃM{ep$aÌ(G¥›<çææ9fø½±¶èyTNŽ”ƒ¤py=ýÃò G£gü†@zðê5 Õl¬‚¥ ÛÅÞë;šáÂ}TŽ\®V9:µ*6qüŒ™¤VãC¯¦N¹ÆuræñuMë$åÊa5 ÿ9NôÕfû-ÑxL˧o…ì7 +̃j¿á¿‚‚BDS$ã==ð1@zˆ¦p´T€ ßF*@±˜GŽœÃ=‘|-@z¬$sð¦ÒAšU@RÀ2Àú‘˜èg´ŽzfO®¬˜2…¨§.züjýŒ±¨žB§F=úÊÁoX9Äà„Z5¡ÿˆ‚ ±j ð¡0° QHM0|4z1D€0RR˜ö?¬¤˜ñ/yŽÖY Ypiò”8R:U}¤Ùô¿^Ä*ÈçLCÎÅê3òØ1j ¤& Äо&ø[Z| ‰m *¾ÝìˆÎãø:U|E›B¯ÕàkËóÆƒæiNvažœ—ƒeY0Æ9öøZ²çIŽÒ¨6Q ´.îðdŸ¿µ¼Â|`L*90ÓÒ`+øÊÊ‘õà³gº\8 4 þhTÙ,´FÉ1“pÉÏé Qƒ–.Ëávx>G›Ãï8‚Ž#ìèzÁ§˜'ñÙPaAÔç”s T_ È÷Xù«$ª¤Œöps¹£ÇŽe}Yßš…•kfþä[ÿ8eÓ!±=ž_=ñ?s>:̰Þ²zía‡®¬šR:o·¿jß0~êɃG¶²rþ›ßÝéÛ3V{ò÷¯XqöY+NIôµó?yy¯¶Õû9·0µ`ÜöM[¾|töaw ›Z}Ù%'<»9úë³?ìÜÿì~r>ÛQ<òà}ÏLÏ·¶ëª@cóÐv_?ãÇm7¾áŒšú“ß{EÓ^û|šuDX>tJYÓ÷ÿí§£ŸxøË’Y·¿Ü}ýUµçGëžøáãÉ_öYaàåïCÇ/xáÃë/x·}å5µOŸþ¿®ÂÇOÙÔ}ýLùÜag>6ë«ôêȃ£ë©Øºó´¯ÇdÎúÛqÏnùþÏW¼sïœýæ ßü––}«Ïü*/gõYÃÜ'wpÖ£ïnøÃöï>j߯Î>ýÏ´—?¿ç•sÞ›ñéŽÓNܺ䓇^»|ï¡[üSNZùùµ§Þ²ò‘¿ñÓšžþqúáUþå…S]YØ0}Æîo_$‡ÆŸ|dž«ºgæÏþóøñé¯þ8è§A#¯Ø>éÎÇ?Ì6õˆÑ-×çžrpíþYg»OñГ›ÞzÞ9×Þ·èûþç/Mt zdÚÍÓÚVßûcýû‹î¬ÿ{ó¶=†Ž¸éôÆ7å¼þi×—{¼6bÒgWzNXòÙ Û/j}x}LrîñÅ]ko±bÙsÅ+Ê&Ô ™wÉ}/åvUÒqRÓ ­Öt½t/øáó»ŽX?£¤õõõÇ­­º{·'ÏÛëþ9{žï1aáiY›rnø¾~ÚUßÍ\[ðèø¬cßúÓ…Á7ïþæ½óv\|Øì-Ÿn}fÅŠÏ܇¾¾çÆùV?öÄú‚7ô¤—‡öojTüÁ7µ­9aÈ}l-Z6hò Eï^xÈåË7Wm)–Îøùàž凿9¦ìîq›º:V/=naþ3U“ O¿{ë£w^Þ=øÐñ'];ÅŸsä~ïnÊ»tÿ?˜ØºnÙáGoÚ}ñyg; îàÕ·÷ç½"«}éåÉÜã¶ç¤CWÞ“Õ²sÝMŸ_»÷ýî§¢uw¿Q·¿´iúäÿïÎ……#ÿuû¶ýGoÙ~wþà“×4½vâöôÀäÙYÃÿ~ÓO¿¶*óÁ®Q±s¶_>äÞœ·¹àšÿ¬{iéWîÙöã¹¥{ÿ¼¹²âé Ö :%óÈ ]·xÑWƒ_ÙöÊŒ·ö>ãÃW¿Ê[óbàùsOÏ;kÐÇg¤ÿã¾uϼk÷öÒâß?ûËó'½ýå­·Z޳­nþîç"gá^ûÔÜ<¥óÓ;sfTJ‘?¬Ûy÷¡¦ÆeÛ»¿¼ýѽó/*lšqé˜9‹7þ·è•ž/Ùcö_Æú7¶àèòî­§_»aóæú¯ÿºêéfn|õ¢À·³¯ht×õµ™ƒßñjÖŽ±Ãgÿòã%‡}1èžë¯½翾}ò€Ï¿Ûý°ë^œ¹eÅ_ž¿pj×äo©õþîïÜ{ÞÙçNúõšÀ°’žþS‘¯<óÙ…£6v<5{Ý5ŸO)›ûäŠé‡?Rùòµ/lt¥s̆Œj|qÍØX{Á#GïSøBÍ3Õ·ÌnšœÛù'Ï >ðj`TÝÒƒ—ßYÏÏþöá‡þ¿Kÿ{ß›Ñ_7ÚÞj-?öê{y“ë¯?yËŸ¾ýfìa[̸?™[»æÑß™÷¯3?}»i¿ŸŽúïu«&Hš¡Ü\‹Í~ç5>9°ýÈ“Ç^£ XÓ“¯4=£ „¦tù¦'Ï éÉ-(0m{ œ\ÛSê(sLp”;&;*•Ž*Gµ£ÆQë͹£Á1Í1 µMháà ڨð™æhu´QÀÖ7Y_4 Ú­`G{3?lÅMX~áÁšø)óv„}Èëˆ8¢Ž¨‰#v{|Ž˜£ƒkðB“§þ*ìI“ç]˜Ë5yÓÓê_ºolnÆGW¬ÈîštÚ«§¥¿ZôÚœ…—î=aêЇHYe~”ó‡É§øÈ~¯{`Ëgì·û‰{Ê3oì>|ÿ¡w¾t厗·‡B?w–†nÞxê;¸ëÍ¥Ÿyo¾dùwc–}¾sçƒ;w´¯ð¯ï~¹ÄùÝ㙓¶ücɺŒòWNÿúÞÂ%¯_âýâîÓÊNº¼øa®ý»ßo*Ìùè®êÖ{~-ºæÙÓn¾õÄî£C_Ÿ|M¶íú¾ùþå{öÛ±ø»ÏÓfÞÖ¶íÝ]_­ÿàó[ÂçÔþ}ââÙG3"zyMðö«ÖÔÕ­¹Úwă_n>hmdG‰mó;y‹ß:ÿÅÿ¿±¸|Òã­Çï|+íÌ«·_°îíß¾y‘ýÙ/6ÿœ5¢»õý[²Þúø?oX´ìÝÿ}íò;ƒï;ØñÇ9ž_n/諾ß6nÁ?¨ø¡þëë~ø÷üÇÜuùl×òÊìkvÏr,Hû *{ÝÝu[®kÿwäÓyO¯úñŒ¥ç¼Z}óo®Ÿ^wÿu…¶4_MÕú!ׯý÷ñg®››u´oRöeß6µäígÞùdÉC5kªŽúèÖŽÚ>ã×wÜŸ~¡ãoÒé+|dé;ïdFÑ CEc£??þÉë=Õ8g=W\õ˜|H`ìã7~y|Á…³lÏç/ßϹaõ /Mlóš'=|ðÁ^‡Ýóô;W¬ýîÖ­7Mz݆k_ˆ=xïI×HÙGÕ|âñu×íûî–)µ—l¼äÜGG—\zÙö}³¾O;lŸKî9ë©ÇÆ,ÿ×OG~øðQ9«ží¸ø•—¥Ž5·\>h¸´M÷´lÌÆ1ñçÝ>ÿ×7—Úó¾ð^<ÿêìî?hVµçÚ÷†¿øÌÇ{<“ÃM·Üxc{É‚àè3/|oUýŽ©áA7ÿõÄc¦ÜùŸKªŠùî}ãõŸÞØüâ´uoo^5Å~Þã·:¾z,øò/÷oâž'Ü}ç'O=5msÃü%M'ïøþ±‡ì;ë’¬ÃÎþûáûž»Ÿ-zÈû]¸jÜE]êU÷”¶Ûožôí-“.^øãˆÏþvËüÀo=åŸ:kÕ ÃuñÒ2ç=8kÍCoÞ²¸e鼎?_úÝ =Ææo?}KUû¤OÏ>jîæ??}Çë'}û•ýŸ-¿žvøàÛ–u¯ÉÛ?Ë{Ñ5ïzçÐŽþÇ_Ÿšøâ{gîuÍK'úÉ£§Þpaé†Q÷e¿ó}ËûÝﮞ[úàîºâõ§·¾úÀ‡§~ûÏ3þ9hÉØùg”-ÊÚúøÑòž÷ÏÉ\ñcÅxùÄ“ùÒñåÑO~óÔ®îѧ.Ÿ¹óÌíǽúÚ~g|rDZÿY0¢yÅÎoßr½é“owÿúçw;2*‚r]Aãaÿ¬\ÐÖîu—ž‘=òÎýÌsbÇͮܰîÛëþxñ¶‚q?‡^¶½xRMó”9ÿj˜xNÔ1rÓCk†ÞØ´ÇCƒ_?püÈMå“’ÜKöí^ù‡sž^ùҔّر[¯9e¢ÛæòÙ{yÏk9S—ïü~åcœsVñîß}Å´¶ë¿:õ±ÛNûÛÛ[‡ž‘V_xÙ±sF–½ñúÔ}Xò‡w§µvÞ´}ruùnNÛÕ[öˆ|}÷`g$xÉ÷¾^žvá7禳Ëÿî½²‹¼£þŦ¿»ÆþrTÑÐ7V¬¬,>¡ê°›î¿næC÷˜rß­:ÿðfñaç´ÞuÖ3æwÍûø±š~ë¨//;h⣷­ýöÿÙû°¦–&P+öÞõJ'!ôª@h¡„š Æœ@$$!…fÇlØ 6AEÅÞvDì‚ +bÁŽˆííž“„4ôþ÷ß{¾ë%9gvvfvvvvvwöz…ÕºW^oð´o3>6v¶ðåSÎåVoÒ+cß:JôÖÛ 5£Vu7Ižžˆ–äøô»qè¼áJÏç32§¹è>ÊÍŸùàÒ«Ÿ]ŸO¸’V!˜ßj¾ï¡¡û¸eÌt9³>/ûP‘·]Ôƒ»ÇÆß¬žZ2øô°ýèšJƒY³¼©¿™=-Úmo4¦”°ÍaœÙ ­<ÂÓ7Å;*]‹è;èß.%}*?ÕüBÚèÜ7çO…Û_α··œ¿uØ›CÑÕå#Ø~÷Ìiçñ¬ö¬e'WŠ×?lÈp¨&qtkGEfnÝ©¬òü•|TÇÞsÍŒQ4«´oÃU­ÞX^uÝÃ/o“Ð2*c»xvÑë}+Ée;èo”ôŽÈ°1îk1I/眷Ÿ]Ï©:î×v£1aù\æ¾焵í¦šœo½¢Úy^YÎÖó]+D¬¹¿åè g½ÞèAb¯£7ÏŽÝ[Äo½bõÛ#Ýz÷|Ûêṵ̈-ý¯"Z¿N¸ôýtðZë êÅòAö¤Àõ ‡èå n-üßSSÉ IóGæŸfœúpnøJ⨮o×µYuy‰M^ßÀ—{ÇéÐó­‡­£ØxX”b´j¯.íÑÜ}ýÞ†. _|=qÌ ¦ƒxùí»­+.š¿?Ða‘ç÷„™‚G޵½8†CßgóÀz¼ÖîÕÐ ãÂnŒŠ6{õyKDØFf™ ¹õÄ=7xço¿šÙ«îÉA‘щmËò9}ïæC‡¯IÆ1xäù"›¢Vm’´O]5çE§Þ“§]¾B46¾½¹}oC¿-ÇUž[å¹Së9¿Ó‡Ù1™k‡ß/M82+àŠa›±¢Å|i™ÕeαÃ÷²öEÌ8[ßfÉ®Êk,÷ÚÑ gÜÿ.>/þÙ=~tIà3;–ûý˵澈>ò…fmEÉâè*®žloönçç÷GóŽÌê» xsÛîÖF™3u˜Õ(ßyîÚ¼ø€Sî%=éÖVŽ·2·ýH[}l¤÷Ëï!·Zˆ¬î¶½q¯ã"«ã÷HUŸyH]>-—'ïP7çm¯%Ö­éÙï}x{›yžŸaú«øÝ¶ùì[µ[ö÷2·¶­:5/óÏfþÇfúÖF¶#{ÎÛ°ðõÎÇÓ rÎ¥ÌÇ3Þ¯Í̤«ž±²zaú€0ÓBÑû{ž>'*Ìêm3ì@§[)Ë'øåøR'òÆÐ£Ïœ¡—í¬oTSm?}hͰøž!Á+.×+íIòÓEÍÞfuñ°Ÿ®0»ËÜŠ“5SÜVo!Ѻ‚ì˜^•pΕ[ñ­ÿ€éb‘–+-m‘—ßמK>ÞmXm³[ïç§z²-;Uöá[nÎÉè«‘G¼Þ5iæ±(ç¯õƘžÝÿìTä° »ž‘+.lßsËÆÆx[v‡gË*–Yݺ;÷óR¾IÐü5+—ß🩳+ÆX§ÑéõN÷–\MåE_Úݱ¼õî± ¯Ã:ƒ kDLÏ]é½ZxÓò6<8Q½5Ñ$#ÖË<Ç;âz䇙K^Ñ6nì2ÛqÛ¡…'Ók{Ûì~èÍÁµÍvœÌËÑ1á`bÉF×#´ýÞËh3ìGúLÛµýØzíõ«Ò»Žþ)y}^ûqÞ¦Š[¢ µ*Š˜0À»méÚc÷˜U7ƒï—H‚u"¾›æ°Ò"£–š†iÕf+õHRüÓ§#/“ŸÛž=üËŸ|‹Ç~"9˜v•ÓÚ»R¿ùÚmÓCªÚõ ÷®¾´.M»Ã™Â…~KLžçë?`äèØW¿„¬¯ÖžK3ë/.,ÝÖãKçkK¢»˜Mk:Y§¤(oAY@Iú´u‰ÕK–VÏ,®Îïô„#žé¼ëE¿ê®O²»ù¬ﻳÎà‹Ñùµy…úìÚùÚ3'´$u kÕEgõ§ÇYçJ³mú¼\¹ÕëÜĽ«ZØØ“|-]p„âÙÙέ•I±NsÞŠäôâ¨þ³7#CK÷Þ›ìY>{,õºÿš0ßè¢7k?[LÞ¦5†µžwdåÑq•ækú%}˜Ð¶OËâɵ»Ë‰§ª¼¿õÍzáÿ¤ˆ³ýó˜ß¥® ºÇïí§ý蔼’Þc¤'tRžrÉ}èãw#5ß¿W¼h'rÞyëõ¸ù®-VOï]Ò¼2¯P'w^xËûý?[µJ¾Úná˜æÝ RûÝz·mçLÿ²“ݬM€ßQãöºt÷Dý´´þ3¼¸×ž&Ì9×3ʦúVvÙ¹ç^édQË,‹å'´O;<ç…áþ–ŸLöóœÞ_اÚê˜q"1á̃3ü«ÙŽåÛ_èþ¸d¤í¨¶3ûl0—´9Ñ7«ÕÒ.ÍGž¨ˆÒ -HZ* [†dí»:øc—Æ»Ú Ö›“•;FL1.ºóaØs}ö’çÃæø§V¬|ê³CñÉ^ ¯_L:ÒánÅ…Ôgiãüú]Xÿàûá­±‰‹Éãºîó=jà­“à`ûc…4w×·ƒ’úŒjI|{Œèغkj†k_½Ž«‰¯koÍÿòå÷µÎ»;~ܨٚkWÞžv¾üRîŽ1Úq—g„,Ü>Çó| õb/‘%§²*‘¬«wÜxe¼õå§”6m¶îÚ|ºdLØÈM‰‚v¶7&kåuQuØ52ÔQÏB<ÖA²El­-k[y˜]1Ô¡e·Uв“ꋲ“Ìí4…:¢®D2ÑèAô$RˆÞX„£.¾Á F™x\CÙˆ!Æ$ bP؈ÃW°˜<Ÿ‡þ&¨‡5ÐPZØÇQð7‘¯â &“‰)¨¯ëP]µý“X‡¥­…B¬cbx»pZô¡á¤ç«Ÿõ6Ó×}kHäöؽ^±÷».)]¼¦C¿ýÐÍ.¬ÍØÙòT·êf]OÍ[·ôPyYYÄ™ˆÃÈuê¹yÔHöó¿“ÙUß׋Þ:~9øåàô4}µø×ćߎ¾ý2igú ‹¶½æXÝÖ÷è²°à¤q`—¥å5;îž{ÆdíÉ#Å­ ˆ™‡íÆú­)=8áªH¿fÂWÒÒzwáöŠå/;9*(Tè,~9{qÒ×£G'ýpøõóÒ­Ë‘û¶·½R»Ãظ“[v¡Û°máÓf{êëµÓéä¶í©ëA¡¾ƒ=fmø¦=¿ç˜®œ÷Œ ¿¾i»t‰ü¢÷ÚçÞÚ¡ŽË'<Œ+»ú‰Ù—ñhÐÈ ÿQé¶=+ûö|ÓóÉ›îĤ­?ÞtìO¶æ—ÖVíëÉk¹k‘­û6ÇY6³®Oï½kæ;½[݆Fö=µ,ܳ¦ë«v“£ïZ{ǹe·6é….»ìZaëË2¯‹ç¬ÄYÌBë(‡øT[J‘ÎÊY¥…ŽQÃw¥…{Ùv-.ÔIõÙÙ¶÷ãÑ£¼£ôºº82f…ïg¿^N:?iÕèÓY+û’>FS[WèœwÄùAÎÅÃ]¯Òvgïöˆ¼r¢¨8Ïn©Ý䵫ޕUÝ®­ˆ[““uœ1éÖ÷­*zï1éñnmû5½~wâÔæO¨<êiêùÊÁůÖñ°†îtþ5æyÇö±×öÏì¿-s™Ç|Ó³|ZÏ"ø>à+,t1ºíÛ'œÜ ]á{H›l7¹Kñcg‹Òóz´È5öêõìk^¥o¸¯z:ˆ½®çµóWœëÑ¢ýé£Åµ)õa†g^e›;ëÚ$ôÛG#/{é×»ùÄMC~ vÈcÚ=>áÑ‚¸<×yZQö1×Ó&/sôåÌœyƒŸ;mìQvb[Ÿóõ¬ô¶B§ì[êÕâ«9× -m>ãÓ‘ ~ë2Wì´u)nY´6ipÏjz°áѼgË.Xaèï}TßáÜÑ.m¾9¼4L ¾[ÊÛ?’0õÒXçÝoëÄPÍn¦¦q[6­™·Íâî·¥§VDz” tÈë”ó'­/=û— ÛóqΪÜËô—¦ZTö.Î9‹Î¨ØJ¼nOáÙ4'‹õé×nTÎɳÔê×»‚>$òˬ_·6Í™|'Å*cŽÎ~óÈíÛ–><=ûáîõóÚ=Û0,ò–î ˆŸQ¦âT*ñ—ö×ôºL× bR.<éY=*û‚R¡ßiÎàTâ‹L,<ýÕ»Íò_v Ž–f¶|rîò ÎjqÐ Bñ…f7döi±µÅì+-˽}$zçV¨7…]bÐãІgfm…“ú~nMÜšòvêÆÔ'nj%Eºž_øk³uÇùG§XŽš(²ýáÚùJ¯hê6»çéƒÚ­sæ1ŸßOH1o}ýì2ÛeýLiÿqë§•«ƒ>OìÇ[¿Ú‚ùæó‡c¨ x¾@oTÇÞ¾3Ö$zÍöoûËpÓ,Êüâê®gçvË躸١û#.­½yÊߪÜì5Ä“¾ý÷ž9Qðé"ÏrNÅëùì–U¥“o]zpQ´øm§Ý%ÇõI{L²^5üik›vÞÅZýìŽN»cQSyk­G¾ÍèAåºs÷'.­ÛÜ4µ@ûå\ #øóõ"ÿž§KÓŽ=I]œÊMæE„r©Žém(›úZÅo¯ürR«_ñÏš÷Çíò|ŸÜ%óiѤ2ê‡ãIö¤ÔÁÂîÖÙ¤f^5²Zã–-×jݪ™ÍxÙgƒŸÙ=«;-Î^d÷ÖGt/ز¬m&Åoë~+ËQ®èÂPÞ¦þ\̶@/\±ª`ï·krËÖšÞ§;G›¯¹áh;oÖîÓ§j…sãÂ;ôdHµþûiË‹·oF/"Ÿ„x_üp©ùý±ùc|÷N–ý¦óÓ_S/Þ®Ý쎎g?® }ám©çl³4\ãå™û}±wç¾gß=ùµ0H»‡(þübnŽ×Ëyä1N ¨Ñ7K_uÿàâý#kÔ>‡Á™•Q÷Fêo±™Ñb”ßÄ­ù‹W>8׿àÅWB“¢ê”œùU®_Ò|Ì Öžls¯E½§‡ÑÇí?Nív~¯9y\|ÞV%G¿W¿[<¢óãù… ¬àMS’n/8àö‹|ut÷\GRÙ(j?ŸÏ«îžÜ×,÷åÀ£¸<£&ß^>8zknoÿ²¯éÖ†rZ^Î?wyšM$sÿ f–›÷øåÇ?ïä.`…‰òo}âx|`|¯¯!“â³l2l|Lö†Ì‹ÒÎÿ'ëG|¹6¿üâýçWNtXí6γZt'iQ¾þDZ=ô3‚Ù,4Gˮ˫ݳS/WÌžÿvûÖ’ˆµ ³úg}÷ï|tö‹o›*¹zÝåtïñ9Ebšÿ•iqìü «Ù‘· k„·Wš„T~HιߒÔNg…kná0Ã[ÄFµLq†8¶ãQɦ­Œâa?ƒb?­ü…‹žŸpç‡ñ³u§Ú>aÅŸµžd­{ðâe}­½³£>wéHß°]ç%o=¥S‹˜Åä©…rƒ—.îµV·Ù§ª‡Ÿ0ó–WîÁÝÝtµö~,øõ¤¸êâsö˜É#¢Ûl ½÷Î¥áy‚5Ug.ôíÕ+[o@·I{gŠoÇh£å gíâUÇ®_µz1Nïó÷‡ý;x>}Q¢;£”à ¹®6|ìã¹~d'󩣆ŸáKØÊ˜U°ag‹ÅR_š3ÓæYëNnws“ùÅ6§‹çÏ Í¥½øðÎgý¥Û½^„Ø´œûì9õ@Ûy‡öLeqoÚò-;ó]«MR›÷.HFÝȤLÚXxõõ¦œbÚI»J×Ü‚'3ÓgL¡zûøi¿ê9×ùq±îWØf,ZÄŸã¹ê{¯wѶcÛÝÌ7iÖuA&zÊÔ ôLÇͳ[7oö,]~‘-«ðÑL¯-Å-2‹„g—sŠL.–ÍMõ µg«MyA/µÇ]šíð©&_·[Þ˜“Ó.• íûþL©û‰f³ý6³·ÍÓ^6xaÑ€õ—mZ„éš-®vô½tÓ!ÿèåºfEYVÑë3ízÆÛòȇc{‘ôG<›m÷µ›sŽ‘Qëš’ù-N5]4Ór|L†þ:›×?ym¿³eïÊ›­÷.ÜaØ[K÷>w뫃×V f&.ríïŸþÁU÷šy6 éÕý"yZìÌón`–èàŽõöG:l±’ˆùÄt_êírÌÄIäÊÅË:½xQX=éXÖµ{ƒ^¤îNÉñ\™±B4ÿó×>E5Ym|'¿|{&eчböa½§ñ…Á =:ÏReZÜñ‰HÐ{殇ÎËÚÙjå§¶O8>þƒXìÜúJ"ûË‚‰wÊ ®l{VúøU§i?,£Ú LüÒ>?vå­G¼ç½çw•/Ðz:ïÍÑaË%Á`ýŽ‡ÍƒÓ´úÔU¸ÌÚ?gßõ¹S® 'yp:Ýíìr‡>nžLÂ錑+Œ Æí{~—li¸Ókd`À#çeÜ×·£ZžÞLsY²-¼%%;4Œs£õA«uæÝ¼¦Ø~Î6³hu–ᙢËg¢–¢E׿4_³hÅŠw—ÞûUZ.9Pk?øÊžÄ‹q覎öam6ÌïCm¿õ½áª‘ílDÓ:ylJjž’yîö‚ÚKŸÓÞ¹„.Üô}ÞÇÓÇÄåmÏ=/8oZ2B×hõà.‹’úLpÖ­Ú±`bnNÁåâØü»ö=ØPñã\ì¯ F±Sr³Æ2¯g¼êá¦óhq¯Y}MÛ´b/zØkñ…=Ë7¿2¸Ù¿T'1-¥âFÀáO‹"n®å°M[}¦‘Wkw[jÖÙŽÖ<ü1Z°æ×¢šµ¯µonä<a¾d„µ¯Öˆ"“½+Ï1Z‡®[Ý•·/¢v³K¬ÏGW=aô:{éàÄߢüº´GÏr\=ßšÖu_¶ù¹’ÍÖ:"fõÊàM{ÝôÒõ ?ã½émow•ÔÞµ.àéytC‡õŽÍK&›ùqHÅÅËnÖ~~æp±ÆÎw§ËÅâ¨}§Þ[w}»sS{·£XqsÓÎܪkï:­ø2ëȰR½k·~Öj^Î u+*}—­ubÇÏ»C> ?õZ›ô¸¦Óþ×#ÿèt@«_·Kûý¶N]ó5mÍÍyig ^ê' ÚDÌÛ4wúq¨_lØèƒŽëW†Z^Øú®fG~þþ4Ë5Àøh÷ú0ãdràËÎ1_ð¯jíõ$8” nÝêsLJÊò¸ëÚßsº»?,í€;!zá°uÝ –½ï¶ Ž(i—Rw¹÷öç=÷<½ígäkúlŸq–áŽfµçæ”æ$ÒWocªõyØó¬K´&œ<оéÃíÖÎ(Ùê*z²ÜñÍš>«Üjô‰ÉÇã¬çìØ5hþÉÌïϰ«V,š°±¶}¿Ö“;^Õw©ðå€Î²?HHv’DÝšÖ饕½Éwñäø1“:m ”µ¬…Vþfjÿƒk>zçñwîÍë_Öc§È&ûÆ/ž³q§Íûqö”¯¸@Oo¬µGœ0®£ë²À•%óN1¶óŽ$ôüÞüSt¢v¤NJ¢¥]çÂPÏÞ¿úßõuаÖûzÒ,` ûìkörf¯çX³Z;êìÁ[ “SƒõÞ®6‹88æÙNBÍë…ír*º¿Í0ÿydiñª [»Ïz2dQÉz¿áÚm>H‰Ì7lžßñz>Í5·úùÅν¯_yTtáò½ì7 §²Œ=ÚÇgÜèì÷ç‚Æ¯œár”Ô+‡xvý§ÛÊߚ=X>®2ûã‡-Vøîñíä–Hz3a—ŽymÂÈ>m»žÑs;=£ùˆw'§Ø¬®üúâÔ»¯gÓqÉö^›ç·^}wÿ³B‰-qÊ2ï}b¨+_n$…,_¶dj^j¿V“eoµÙ1¾oöñÉÕü‰Ã]ókŒù3;Nyõéó±âÃËjÍ7Ú'ÅÅ÷<åíÏ“ØìyÈàöýv~·ãÑ¡W»/Åßò}o¥}÷IDàÀ¨«³»U=ö½?dILÛÒ¶•yq*ci3²SÆçß»(é{|{JÛ›­™ ï{lúlD5~ï7‹í½%Ãâ|Ѻ»=gÒÕ3îvÔšžså]ï¬åÚæ'—¿IX=)uYü/ß#s}Þ™É7N0yâ7ì12ÜhCðƒÒ µœŽ«&\?uȱxæ2ÒÊñZ­.,¬èÄ3¦}‰É”^’üo“$üZ™`uîµgÓÆÏªÎ¾º¸M~yØ»Ûø«ÞF¼ÝW68£¼¨Í˜ïËÏXžŠ¯ žGÌ$ÿ|µË,fõý„ž;öX'tšôþðŒt,µìp·ÃCgŸ¤®Uw†9j鸟ýæ.ùgkâ‰å>‚³¶“#P½Þå,¦ k4q¦)[ػ˒\âõ"c#ÿ9ó¸Ï½ry¢i]‰W÷[d;|УΠÅ_>ï{b™ïƒö?m‹ÙݽºÇ%?å¬x¼­¬ç³…}Çw§çTOZÜ^ûpò¡‹çˆo& %<ºéÛ¬z{ícN§»dçÇ=Û÷ñžÞþíÄm×<jæ“CÛg1âAB*ÝqNÒôf¼)ãùSSB&V½Aà Ò']ùVó °“<´óªÞÛ:ϲt:4âÍ£eWV¦?¦¥ô÷<¡ef2È—ë³ã’åŒ[cÑî–]Ë®ñòù@¯sß’ÒQk(šêsåŰ»NÎ“í»¤8zw[cò´}ËY‹N^/Y^ö­(­—~RåÖÑþËl}ü~Ðá•v]7´¡åØc8ÔNþülø}lª›g•haêtíšEÓâϾ²Ûl¾çHß. ^´¡•³n…>û<|‹áñõñ3ZtkE=Z>ÁõÔ‹ KV'_Ó>»¿Gë°£w_u}Ëíþâ”s·ïÝzξå‹Ï›DtÝôÉ-Òj‘(õH§¹™J¨Sv´£.Øîç[·‘ÖÒZis‘$`0cQ1…FsxNúo×G8,'ý0+?3?áx¥QZ 5˜™Ë´céJ1@ŨiC`ÊÆB|"1tÈA¾: XA IŠãòDöINúX{ð>&ê#ˆ8ÖI?Ü/KcË#æ;É”da‚°…Œ84‘/ŒEHk}€RÈbÛ¹yH‚_Nú1b±ÀžHLLL$$ZøÂh"ÉÎÎŽhfN477¦¢dž˜‘dÊéêKËqÂåÅx"FÉ#r‰$‚QV‘,P ³sÃߌ(¾Dì¤/‘pXöÖQ6¶l†­•ijemJ"±I¦ð,¡)Ê0³°µ´cYXY[ɪ(©Tx*´r€g‘„|–„‰ ô=|ϾHŒ×qØéÿaª€à5ST*GcïÇgqØÉn 1:ÜÜŒdmjfgjnL²°·4··²363·73s$ª@jcEÉØ^»ÆU€T(Ê•Žº–ðš`nN°P(&…r$ªH矖Càç×°Äââ JC8{7>S‡òÄ·¦TõO·1‹)'X r±ÞÁbQ. i¢I€bÓžÍÆ1@ €ËabÙë¡v/Å1ŽæÂã_¸X…=—Á‹vÒO2e¡l†„+ÖÂàYxkp9ÒfÁÊëpih+¢´oïrË1\ù‡>ÿ¢:s L¯“~"4†êæ¸ÎËúµ¦nm¨MÄ”Èj¿›=ì)fvævÀD›cDßÌL€Þõio0ÐÔ_ åçõ’„([Û 1'i›É?ˆµ••…ÂF¤ÏHfÖvþ†'}F²2·±Qyàà©6ågf¶VêÏÌà9@U8 ’>À’Ú3[[µzm±C*p–6jø,IÖ¶jpæVjøÌ­Ì¬Ôi±Qf®gnc­öÌÒÊRÀ†µZYK’*-$ [+…²b!ƒÃE…ØP'톃ø|˜šÖ Bˆ˜¯Ç?ÍIqC"=l,-í¬m]Í\€vXZZÙ¸XXš‘]Ì]ììÈæÿðßCŒÖÆNŒ3„bLYHV–$íaÃÜý=´›ýïóßú¨ç Äü'R#ÔŸÿØ3,ÿƒ¹¥¹…™y3ÐKÀÿËÿðo|´‰F™/HÆVîàäÚÂb`.?†HÄ`ÆHD¨X,B(<˜‡E"Faú“`”ÃãsùÑÉmD±¼ÙÝÆŒ&‘ƒÇA¹MŒò¢Pa4€†PaÜ£$ÿ ?÷  sš{P¨‡ Å·ÂB­–`ÿª[„¥:Å/@‘+ˆ wš» Ä“ˆ/Ì­†!,y+¼—SI8j »º¸†¸¬Cc£AuñsW¨ÈVÂÃÅâ[‡ÄNüUä‡d¦Bö§R•y"©ŠˆÄÝ?$X‹ªìý=Tc_$UáÃüå* êÒ÷s÷SQ?¼†%(„Lñ§Ê@¬Õ™0JXl°&ÂÜ0à9A'Ë]ü»ÂnîP@c«„†Áb †ê¯ÒŠ`:¦^“þj2Ç{Yó'\N Ð'à Âd…ê4ÕL¡R‚).¾”¼AÍIuhJOŒÇá„!lfRçKZ VÜ0c¾þ.n”/ßhûH7ÿMUÊX\ÜÜàõ«Ð)ñò pÁr†, Øœ¸i$»PÉÀ«Qè®æ–Ü»$0¸ ˆ¡bÐA— %Ë‘GGÄÌP`@ÅÏEÞÕq@’&@Š'5X£¹&@ª;9$ˆæ®h¡  ²#Á@UÄh©#ÍÞ§h¥è– ͦh­»ÄRjp@M€înTÕÇm ±6ðÇ×5°[ëi ÿ€`ºJ?ÕÜPÅ’in KŒý›¦€€T7ÿ`5@ €!nt˜õi¨)°ªÉ­4Âñ¦çV´ÖèæïçB¡ªÚhôõ÷÷  ©5…zÕþdÌs§“]e€vƒ‚})4efHfõ¢¤º¹†x(@’êƒ "‡*Cš×ßÜ~4¥Ú5µN?dF¥Iššjk-BRSû€NªˆU ik6U6±03T @âèFU_ZÒ¬ã°@p“(d/Z°†$ Àðä覹ózk€ê§¡€…z7xR–ê@иžf¦ z•FH¥ªÕJÑÈÁ‹iîk ™Ü@ëúeýoõ6êð®§ÖjõôAyز»Z¸Xh„¡"è§ã÷G±%bx±D„jÒ3Š&%«¿Çâ%è.¾¾þaôª Æ.|˜­§çJK€A7 º L¡àÉÿº0¤ÚEæW5Ô5\(t0¸ßUŹª·k¸4µk€¯Pw¤q]Ã¥©]µôs pwk\׀đƫ.,,ü.¡zT· zâÒd=qi²ž¸4JO4ê‚ÚêL¾Z?štÒª¨L4hË…Åçê±;ÊŠ0Aµ­'(´åï1ÕµŸ ×ÀkÆFB?—pPÌš¨07¡CìS! Ú“‡ß'#‹ÓÃ…—ß~â`œ!©÷?YíAÀƒwqõu7ˆâˆE&F“Æh‹RMRùÒÙ¬F•…€×lÃ+!]®°Á†Ú0Ǿ„ „(`ˆaÕ÷ ý³X·”†ÈàëIÒøÂª_žd¡ (—/? ÚìúH)`"‡Ë$Â+‰.Ÿ ×¹œX|Õ•Ý0é#v\}ãñ…“(F(áÅÂ)±t4€<†™ QüF šˆÈˆÃP4"¸/4‘ß7ad`±ÉÀà-A@hp=»©[Î$ìˆ2NÕ’’q®ÜPžX‚ÅÖ à-Íà2’’6Cˆýc$2’ M0š4ЃI¥-oqœ.9,¾üÚ0!2„L~ª}BF7Y8‰apmNQ Øj6 [~æK­Ž ¬“ &tù[™1ÆÛ€¸àôÔAêˆ`hÖQ|¨‰Ò(¸*ŽÈEÚ–ÇÆãaa8¬ãëÁ8–D (q„Š¢,˜é’&b$cÊ zf2_IFðÛä|ʹÃx(Îv‡ŠªM]˜Ø$øŽAì~R ªuƒb½\Ö+¼6Þ{ u9Hˆ9q(è&x´3 ‹…-Ç–âH›À†‚–®•óäDƒŠ¤X„TŽ’Ç⋱Lî8ÅÀÛ_$,Æï5¼3ë^AR"UÒ£$0³3]ÄIAU^ÍAá5~*RÞ9<:Œ+"F˜G&¬#Oá7¦ 72bñaïVd@þ‡€ý^"À¨ÛKDé„Áí§Òc:´¦ ÔÉìŠám~uô)eñDQŠƒöÄ:S73‚Žì û › ¶òß°^ȹƒ’Fx<”‹“!ê@ŒŸ8h4`”>ŠÁŒ• aôï,8Öx@"Qc ¥ºù[X¹2áÅúÐô .Ê3¬‡7(ã?a°‰\6™U죬ˆ‘ôK}¼È‚ôÌÏðôG|ašaMÈã³Ð&½šÃD… Pòp˜Ø†w9üç¢È%¨°)eêü«†ÉņˆÿÛÈUZ#•û¯Š«òQ¦qðô84®®L£)ÃÉ‹â3 àåþ6 @¢¨¬cÄBæ“” §CŽÄQ$©q®QaHÔJ`˜•Š`—$·@#8P ‘XfvkaÂ6’þ¨Ÿ,¬-ÄHú ¨Ábr‡ª¾âM1tJ^Œ‘ôK£M+€‡«õÓ«ä*Ñ+ýûïÑjT±u ÏBAMüd9Á Õ[?ÏГTnˆ·!:• EBæïIÔ(ËŠ1<&Ê­·pPƒcPàtóÀ ±:ÐÐ7ƯMŽâàþ)Œ¼A§ ;¦Ñ|ø7”0ÊðP©Ž„ˆ0G^„ÝRˆoßL–^`‰Pàt†PñP1vLÁð‘Àe4 WÌ1áÃk"e{ç0¿»Ö”® Ô¬cu^ l$°”qÙOkè/K¸,8%#YƒÉœÀy)~À°qXÿ¹’#R“¢äq)§D.æ{(ÐÌ“€ÙŸîˆåas¾FQ ðü=ÅŠ„Êk@aíÒñU6üþ *qUG‘}i:|˜A ºÆ±Y37²^óò¥‘CeßåÏ8l<¯uÆcŸQý9gŠ'Ä&Ò0Þ)Š—Çúƒº4t%Ä(þ·“Èj<èð C)ÍÐ)}ù¬ ^ã%¨0ùO«(RØù~¹s_&—!5´.íŸH¤Q"¡ !3æ”­‰BiŠTíéÿ‘\%˜hT §¦QɵÆ„7NL `3â8ÜäFPŸú7ÕnÕ/¹…R’ ^µü·øÅóG"ÒÀÑ•ú{=Êàj‚@ðßÍÿ;5GI²`Îߎm*±B0Ì5q­NljÓæ÷šWM“i#ú"›Õô› Ä®ZA… V(nÐ,`KÍÒ®Êq!,ðܨá'‰Ã`Õ¨RŽ,KƒÒXÞ_û‹ªÈãIâ„¿A Nh Ï„|&*úÉ}SÚº‘ ®F€úc‘*7¼”ʦ”Q[¿vJ',¸÷÷GãMS\—¦G*UÖ“8MX|f5­é’Q#Öê¢:¸)ft:\,â†õ6I\쟵Ƈl²ø'ù?º‚¼ëš$`ðXØøb qWzYh£4CcyF#ÕC¶ Õ¨Šp4ªópù¼hŒ‹ÆˆžoæEÿµ þRM†ºn4rÝ@U2øþ ¸_ĉBÙð„t?ˆ"‰Xô*8wŸ vKðÀ¡ìd,‡g­4cÇÂñ¡) åòñƒÆ.ŽX„rÙH"?à,Æ7`ÛÂHZŽ?Ê/ràõõ²ƒ¾"‰×¬<*l£Àzƒ¡ñr u§É΢Áð'GL@h0“ˆôœ<¶áA΃›ÈHÁ3…\Y®l/ƒDˆà'{|ܨ’,]ï—yÇøÕG(Am›L Ø> =^[½¥è4kºÄ6’d=®qOÄó”¸1t•XÌÅp¨¬èsøò6®2 ¯‘µ &e‚9ëzjÆ(&Ð…¨€›¬†²î °Åh’X¾ƒ@ýƒMš4l…°ôqrC0‰Øí bÁ6¨r—Tòÿ(ªÕ‹“ÄõÔ_÷¦®~eý©«_Œ¿–.±©÷t,&î€N’ÆÇÑ$ìä®H9 5èòĺ­cöŠÀà øÁ€¹'@gD¡P!V­/À7p•B{ð9ÎÀoü=‹2µ1&Iˆ)Ü`„¥‚4ÂMABxp˜»¡b†¿g€j¤[Ò0##ô8¾Ÿ§^jp :†_½My XXO«*¾û-×FòýIõBH×ú„¢Ñ`|k@!ˆ€ËÀsE4¤Çà6!¢ÒÛç5X >CA,ŠÄñDÐQ¥ëXq `k•+Ŷ` BÜê£òTªŠÑð\,LV{ ä¢jAg›;ülzC(êð-V&¸rÁQ!ƇvløÊ&íapüÆ—¥`â4׈@ÿ¸øQ0© Ü/äÇRбSl^O@é~MðFÂc+[˜0L Þòø<Øm ™ WÄÇJG ˜èD*h$8‡X@ H°ÄÀÁ” &¥Á80B| RŽ öáÝKu!dH3í`3º:LØVC¸–¯/ÆŒ +D%âËÀà'õ5»^(YºT1 þUÇIcô®IE•Æg#™\Ok,ë÷M¥ŸFFMÓßIJƒ°¬ÿ@ZM˜ÜÎþ½¼š*®? ÎþAtö¢Ö Y«“'ú‡dÙDQþ±r×Ó@ãý²å5zÀЂï|Éo)—ùœÿ]ÂeTºÁ×F-÷þþ»tËÉ€ÃøÞÊ¡/ú÷Ôÿ‘mE4:ÆçAÁ¥ü'8h:ýõø·€üW#x{† qÐ|Ti¬{¦ÑÑļ†F ê¢Ïp¿£,ô#ݯÞà& ^j’ 4í@þ]Y¸oCád‘¦-„jûaz_˜•Û°#Q†&÷t¸[XmÎQ÷F>ã¨6TB*iŒ|µtÐV³Ÿþý Ýÿ—Ðý¿˜Ðßà Áp!øž.TèP.ƒ…¸qx0…:S‚8&€ß–ì·3##dÀK—†C\øšH?†ÁeCº„R‚\ϸ¨ÄQ¸L^N–hE);è9!FGîPb¨îÁðN¡Âìó¿Ë¶¬RÒÍU½+ªx— :V—r†PÀ ª*Ñ܃4…Š œÙ¤uä/u~‹šìïàÜ@ t YC%—¸¢ˆ±Z”…Îâiz*Ým‚5F}Ap¤þ UcÂgÊ!###ìb¨=^u2žÅäKxbØû±/ò¤øés„c‚…XFì ¾ ~õËs(àÂü4ž$>ÆÖû¤ šãù±P¶‹S‡í¦CŒêºoXR0ÁS¨A!«ƒê‘|m|iž†JŸAD ñõÅ;;0©l‡ w0aN¾C:a€2 ž`¡%lÍ.»Â”þ<}P#<òùq8Féî )"˜¬_’uD¼<(áîn´K "Ëe¥”ÜXV—*fâ Râ%¨³“Ðã)§¬QðUܺíHÒ ¥mhw£Òè^î.n@ÝÈþ!Ô`œpC,‰Oœ U c@†tˆBjõîØ®¶º!CN©Œé¢n,G€"±Ò;)Pq!ÆrÑá µ¾ƒ]Dq'!4è*"P.ÔCa"íX×@ôêtJß}&ePŠð§”*\‰UF^#Ðê3ø ¬i‡Ë(ÆÚ–Çã†ò ¬\¯qùÖ'I™(“‚±“J-29»ÀÃîp‹šBWÀWÍäí ´ú @sÁ° ü OºËD±T˜ø1~È´¸1lp86sRP>Û@ÚQÁ£:Ù QDÔtޱ<Ù2~U¬ Ë¬N©qpw \>YGUà‡…¥»g ‚‚ ±í½T`Ÿ4@8&ðÇþ|ÊmÂ16V ›¯*ÁòQC¥ ’nc€?°´,lÊeIqÿ.Êš¦*¸h~¯¼†X\A?ÊKU3(¨~­”±«À‚š*·¢”\Cu*&â­Š R‹Dà.%FÖðÒÁ¢†ìëB£©A*å ¾îTeÓrþêX—r.E¡Ä¶Lz㵕BtyûT”¸‡ü×ɾŽE'„ |xõ\2NH0JSi5Ãô 3÷,8åïvQèfðl­LÿZ eNñ#·ŸÕÚÆÉ]“\•ÌB¤Š‰­b»€(3²ehL2tÐV ²!LNNp¸o½Jï¤ç¢•uÈIÅÌiäSî 1É Òh¢Z&Ô¥ËËz«ª}–²…ÈŠÊ:XG§hX4L}Éþ¡t÷p²/L§l à˜äºÒØ,W]o5v2E£†Þ?Gƒ1£¨~N*꺟ڠƋ¯B~{‡l@jµÒ †"Ñ`> ·pヘ<ÊÇç84Ž/L†YzéôÚ ‡ Ta²|4ùšãÎ(”9¹*ölVq… •ùS%#$}j:<_IÁ Œ zR½~€*re4ê=êÿ°÷$PM]‹¸>ùm« OHxyÙƒ€%BC‰„³°Ô)¢u·JÝpWq©`ŵ.T[­u«¸kÕª”º‹J—æå%$[«ýzþïà yoæÎÌ{ïÌܹ3sj¸Ð !¹Ö‚ìó,Ê–IOf©LM}%d6Ȫ]ôo F¦QCµ€9Lš¬69~ñÉIi“`ä.Ë Gb[V„}^›9AŒš='­»MÉŠa-Û}ô$Rè» -‹`¬í ÜH¸m”­Fª‘ãœÍªÙ•c+¥ê$r6Ñdt£8{EÐA¯ž€¼±ýW¥0¼ËjÏß^ÿa°è8aÿÅ!›ïÿd1ßÛÿõŸDO|ßÍlÉä­ÌÀ0á;Øaò·6ÃÄom ¶Mü7MÁ0éÛÛ‚aêw0ÛüïXƒa·6ÃÄoi†IßÈ LÈ¡t0ycŒ e žt:ĤÉ!ÄÄFF¡ý±ôth"¤4¢ÐOª ïŽ×éÍ^m‰ÛQRÍ®žÌ'3ˆ|¢ã‡EŠ£…ш¿T/ímcÄ4ßké/È×ÇOT ÉÇD•ØÏzº[NdÃpG[›(ëÙkçƒø«Ô6‚°èP‰P ¯»B¤Ë!Ö2«Ï_x^B­Ì$Üêš0™hTõ¬T5iƒç ¼!&üñ'õÌÞ®ì‰Ñ%ŽMÀ– ð³qT†çÀ IUÙ‘š¥ g]ÔÆ÷®Uü-0$ Z#Q¢ø %–Ô oT?Ó¤äPM Ö©a_A(0SËsjß­ÄF€02èu ]@S2Š6*Ô¢› ýóÜl½nøþŽ.æIÏËM!x› D'"AÃÉ#Â$‘@P,GKàtTmmxV>¥™I˜4F2 Έ ‹¶³Ê@(\< ”iŽƒJ%è•‹N ™• ‘*õv×é VY+˜%„g]¬¬'z} ™J?;dHJ ÍŒytXʈŽ$jnë²õføø5„’C‰tüéàH 2H¯6) °» ¥(¼ånuƒôŽ6{¹CüSôÈ;…ÿÓëÿÒHAäG5úýgÐ9úÁ~¯ÿý+Èq$|ó¨W^Q}„ŠJuPÒe§Ù2K-qù4* “ª'ôcJ£ƒ¶bM¦?ôЇ‚wâpœô?é&9¼’™¼O€èžÌnW}Ps¥¾Á#½žÁ3ˆØ¹‘‚ØÄZ®µ&lv¤2½±ý º”'Fm™ÆÐ-OŽ- … ƒA®ÖȈƒ;y ލ™ulƒ· À䬪‰^gÔÉu‹ï­åð¼ù@»¹{‚³0ÐW™ï&keV¡Þ6Æd ´B=zqN/Y§O&P·Âû“Õ&û.Xᘠ¨EÂã´ü¡Ù`}óÛy}ñ±q> ‡ÃÑæ±Œì7)`p£ËQ Çe»ËÕª&œû ©2©zŠÃ!Dá€&è©ßSèæO‘hè¾ ²–kYì´q.ìÿ~ÛÚ;ìÿj´‘Ø?C¡ú/öÿL: Îÿ9ÎáÐ8¸ÿç°ß÷ÿÿÆÇK,Üg"^U?ÏY°PªKƒbf[„H0 ëBm ׭м  ƒ(eéHöÒ~RÚ)†”ÖŒï½lé7]¾nÙŒ%lÚ¤‚O0S6™9a a6¯0ÂÄ ÛÀDJ…Z¢ËFh šÅc¡\&= ‘zhc@„LB®N@Z1èc¢•Æ T& ˆa¡:-4×P ‚ÈÖQ¢H”(Ó€bCÕ`øH 0’ I(È®Ðâ6Iq{dˆÌ(JŸ% 1¼ï.2qŠæ8TÖˆ`ѦhÅâD²ã &38˜¤_à€ì ¡h§(G«µA”{öSPµ"ˆËÑD¡ÊTõàõÊè‡Iå§Éy Ê€`JÊUR³eTÁ? fAž¡’ˆpOž‘Ð@³Ó5ZC@v…Hža0FA cZ%N$µN“ÆZº?ϧâ 0cՃљðû³) K½B „“‚· ŠÍ†©,†¿N?j5£Ñ1: ¨†­Q–MÕzSÈtê8k2­ÁŸÀ n³ÂÔqº)KArbDLmÁ;a|¢˜LjE›‡³e4.‹š¢d±©8®Â©°]R¹¸œ&§áJšŠ«²—aƒ¦]y ÈtObóÀú Ê q:ª'æòQ@û‡±„o+ÀP’ &@D× aÓi8›JãQé<)Î`ÒX¬~4zˆ9@"DÒPb–÷&Im m’êôR Á1ZBùá7hR6‰H˜@Ì6ÿ4µd"ÑŸÓ+= 4„ Æ7¡àïõOsX!·"œaÒkˆ¶¡cJ á³ÃÆÆ y€yž Zg…¡l‘`ªQˆñ5FóƒF ‹Ð%+ˆ’MU(U2“ÆHœ" fnhÔ$[ˆtXC^Mð #[6|´öÁoçíº‰Ï?—QCg úÝ Jì  Eô†¾ØÒª½›jÔ>`(B heß[Û GçšN4 F` mý)Dp0Yt¶^©Bh(±¡¡l‹ÁBU¨%ŒÎã¡æ­% çpŽa4:“Ö( ̤…ª1Û(ŒÁ¶)è—©5J=1TFµ墘DÔm8JP šOPºyÐ Є@6]Àçò™4?nêç„1ø.Áåña<œü×ÄèM8a!È„óhlÄË+,2ü½Fÿ/ŸÿhpMò®êÿ_èÿL&‡Á¶êÿ8 ‡ç?À<à½þÿ¿£ÿ/‹­ÖþÈv›Pëz7´½“ñýÑ ï¹ÂDfØÍµe’QsÝòüÎTŒˆœºølÏs¹?{m8ñX¡:Õg’Çg7¯œäÕ=îí¹ÈsõÄ¢ï²99u×׈x½R/¹«>îÈêù¨ý¾²Ð•=&×L˙깢Wr†{·_úFž?rHóH¯k×êZ×m Û½ÈÉYtåÚ…Ü)ûEÞ?.j“MMíœÓ6+êE@Yp`¯ÕáœcåŸNÏ÷øÕ±E»›’móKD‘ç1S×XáòÏï²ß÷Þ¾>q§ûžM;¦µå• m«vIý`] RyÔ‰9(»Qš±n¦Þïz}á¸ã%¬ýâÙ®Ûçï¾Ðå2W~åäÙ'ÁfŽšú"uÈâËW‡,ÀêK¼om1+¸¼¾õSl÷Ž ùa׌íHoÓ>ù‹;íž–-8ât;Mêñ¼“ÏÛ÷÷Æîòy–±2)~ü¢kW°-íµ/2ýô¸nºÊ¡åÜͱ~sëÂ~Ö+Ä×/þfíwëÐW%EÂìç ¯ø‚Ùl0Ù™få5­<~U=}Uû.¥ÛèÕ }ÁÍtéÊmçeç‹[|,ºŠâC‹:nY“ä²'¿[jàË ÿ­¯ ¼Wþ@>í“Úµ¼tZ+ÄçN^êÂ5RÕãƒâ±ß÷Ø4|ýÌ]qÜô%›Ê}ïï ¹´wSÅŸ5ŠCëwš"j?êþpëO³\¼×Ö;K™]¥?¿˜ºÝwoéÈù­¼{Üâ׿§ÕùSJ;A»yNËÏ®Nó;ìLYÚÌp5™ºïKÞ¢þ ç¯Û­õ¾xlH×Ûmð-“š·\áõd ‹Óš‰§š·jî~èd•SGJ¢Gªz~BÚšƒ.cDIΩ ³&õåf[ ࿜â+ò‘ÕvýA“7wàFiü¤kü{eœöO®;×v¼ê•(µâ¼º`^§ÏcFN:å%ÞÄ<ñcÉ'¹™ú…Î4bÒ©àÖ‡¿¹á³áUíÃ/Ê_ku¤—Ûu÷.Â/#”Ûr‹Ÿcä3Ú8g´ì}âÆ¢~?M)(˜¬¯+üÃéy¢ïÅ–³6n8t]Mºõ¿ÌÉ+ý1æÓøåJÓ’”q÷yîã¾*ÛòÌp;×%ê››ãj)O…Ï|KCwù¤9xZܬÛîYû…æùÇ•Gœ^{z–.ipõð§—*º‹z)VŽü Ó9¯@wÃÜœ Nzø´ÌrëpÞyÂ\,ãâYã„_œçíÝòíyŸÈíÓ³~ß¾¨ì–©#F²¬WáêV¥K…»æõË_ùüÄÈæ_üÐû²s÷AÑÙÏ.f>n#ukÿ[§¬ËÃzUÍ»âáy}î°fI×Ú ßöI]{©âðO¾5•Ö•"£u´<¾§Ç„ÐÜìÛä/ï-»êùä­Ýè'gÄL+dx¹´ä/oÑÝ»Ïú³£ó}úcÇ$qÍ£]}W´_×!ôLÌð’U#‡?X ÆÑÜþbNûfg“î®´I[‹Ìˆ*¾ªžÃúHݧäQI¯únnÝ3 Ëû‹â7ÖÕ3ؾœZqÉeü‹´ù—ç?£µëÙóÎÝEÍ]&Ú<£¨ª:åÅÕìòúýŽž«(>|êc¤­À9ê›V[1wUTÅOu_;#®fÈŠµ÷Nܨ^Qxx‹Á5¬(¯æ“—ç7¦”Kç¾±`ÀÌC‹$=Ÿ*tëa£gÁ§ŒßÑçþ¼66¡äg=m5âZUî÷äÚü{ûO‰éyN™X´tߎÅGó&'̯Ú]yâ•ÿ§®{JJ+Ueû÷ŒÙ]tªmÝÙâµ¢»…)êî6Q¹­?*<•w£ý—k•ßDí _Ý<¯‹xßée˜„:ô·Ï¿X×ßgÒýœªç‰µÖ|·cÛ¥i†´»c ?PŸ9úÕ€K%þUÕêÅ}ûp oÉæëÑ›—‘îùõâ# ºwË?”|å÷Lã­À Ýgùæo¿(pIørq{­­|‰uÉÕ[$¯ ›é.ŸtÕu”)(ïEóì½TVßÖðKH7ÒÝÝÝÝRÒÝÝÝÒÝ%]ÒÝÒÝ !Ò%yãøsÞóÆýîýÆxCåÙÏÚsõœsͽ¿«¤‘M@D½ ]WNW˜àãó—n™2žó§ Æ'‘À«Þh·ÇB¦÷y²W]ÚX’Äúó1C<ŠîŽ·|£·\Ÿ> K,ûhóCùdj}5â[OÕÉ©ðr®;.ìÛåKo™Ê²|ÿ på«\Ù­A(½…Htbbbq´±/„ªt#â™°ˆ/_á6¶p‡ß0q|ÆG‰`¸1%X»ö• ȱ=vÓÛñÕUœM” èN§+ñšèÉ> ãÓ&Ÿ—YËõët¶ŒÊâh.¾| ™‡šö³Bœø‚ ß5úØccy‚*<‡ÙRRžú³qã»ÝYz ¦FE‡ƒé%ÄÌx—Ö¶rk±>”Ÿø#*â>mõ1l¯šI¼‰´yqÏñÑ×iëvxiòÁ¶ÉŠ5@+¨ŸÚÖš¬K6n˜|¾ÝLOͤNÕ¡ž{ÍBHG ] zŸß€×n÷$yLû0øì¼±YÑ>¥ìœD ³‡3í3çuËÔUEMއ¬¥G¥!æwlzé$Úêþ 1 €ÏMkçü”ˆU ð±óDZæ"¶›0Ýó÷¥ùOæHî""²å’­c vïjçw ÙÞL(›° YAp‡×#"S›©¤·²8bøEç$Ýõ—‰)ßó¯”4.ÙœôR8 ÛÞ]¿±ÿü2ÉÍ pKµsÖ”R9,O°œ%@úuëù½N’;ˆ%Þ’”tbÉø'”ý:Ù¸c—rFëàr”¯ƒ&Æ¿~>=\j¶¥N'Aj·‰Êòåk:óÇ›z˜ü\_ƒ6r2Êê«´†:WóŠjåAᵋAv£r>4ŒŒÆ•çŽDÎÃöÖ ¤6ü ß©ˆêYhùÕ5œî=UP"ø›ü3e"!vÊZæ %oå–Ò9—PµoR  ž/b×®› Ä/¶sƒ_Œ³~4fõ@#žkñõ NfJîɆv8k­r:ÚŸÒô—tmHéÔ*çZ±¡¸½ìDÓ5¶¼ºÙ'ýPr–Š5ž>ú]ÀFÏ–gC¡¨!Äœse*÷7qÇÉÝ…áa€~ G݆鰢ÈU¶dÓŸ)*qÊB0âÅŽ@\ÀŠDK ÓÔn í~#oåHfñéÄUG¦°ñK÷ŽCÇšo ÷»®TdÑ_t\4ÔQÔ³vv½! òCd/¿Å`½ýh¿AKµÿFÓÔ!Ö<lþÖ¿FFA>pÿœYEaƒ ÓÇ >xL¼ÉvL¼Á‚ÏŒ9Òˆ»…e–ÇAÝhÝs5Óh»s,G iz TÜÄG±U+„¡· àŽš‰%45‡á°ª§þÛé’vû­òkŸsxôkâúÉ­rÎsi¸£O|ñ2jeEEäû8i™ž€“ Bpk˜`U+´`• ËÖÝ_ ¼ëçDE¨ô(»„gBTjM}±îc;íªd¥ä¶ø’ 7Ïñ¾‘»Ã\zé9™vgê²P ¾¹¢sÄH‰¸i; GàZ½6â}åYyGHDRæ®ò"÷ fªS¤´î²}öâÖ¾u†2¸ý[MqŸîòjòdæÜ-šÅ¤+,ïC–Ì/îû{ÍÚi eY½²%`ÌCoTùä}¨ûå¡¡%íd^6Í8íÎæ1 Êd¢ë¬µ&óúL«6ˆ«{ÊÌÒº·QÐÿÅ‘Ýæ\yÎb« {Ñ4þÔ•³N»šQE­¼!Pë9½$š0”A[Ê‘êê—v©Ð„Â…/e´<_=<¨«º¿^Ðv ízÿ 9û×'ittÿ¦ò÷šg'„öÑ… ¥Çe{”ÅÌÊüÓaøÍû`eþƒ÷ñèçþæ}ÐÒÿ™ù_ºÌ ¿¹|4ü44‚4B4¢4b4’4R4Ò424²4n"2Ú£‹òŒ-0±3{ôUôhžgêüðYŒh~¼2ýè½»XXÒ˜<º1ævv4ÞÌ÷÷§Ÿ2r<:6Ö4ÖOasCûï¿=»y4Ö¢­ôŸÝ; =+s+K;g;k=ƒ'WˆÆÁRÿQŠž•­Ëü¢?Ÿ´Yþ+~#33ëo~‘ƒ*„ª‚Q7ñç¬`ñmÒ,)Ì^êr ‹2 uäZy!A ƒÕK*J pQDGp>Dð0^Y}0„2 ¡²›‰^´Ää/Æ é#gÒíÝ·K7K€¼¸~«°Z•l)¯)j° `úR•èý5.Ñ%È¡™*¤Ä²Ì=Új„<ÈÖüD@Ažó¶÷[¼obD®ð¸£øá¶UŠù ±³¦ù\Š;ÜéÓ'$Ev‘ÎwÏ'”UT’S>ÖJ±åÄï$U>ð¶²Þ0¡W¹`÷]ðüûËŽüÖ»{/ؘ¥+ áJIc ÛìöìÏ&Ÿ[*…T—µ´†ä„Ä”äDF’ª°è¼˜ošu€K®‰Ü^ªGTÖ$ÖÔ‘OJé*¸†kà Ìuž¦5màf3凥±4c×BqqƒÃÌ9%‰¡÷_×ûD©³Ü°c_†æ1}ÑQ eÜL*4߉ï˜%xþ.!g½Ó¨r‚<ÝáFÌÀ0Ýõíú'“a¶ØõÀºÏò׆Ñt%S©€ª€ö_Ør×óÏ_’y´FñnëHzPJ¬§ˆÐŸöH–*dêá"DZÆS*î×° Îìcp ßp0ôZT™á¼ñGv0ööi×ËDº6—+“9°&ÍNL¬‰™4VÚgÁÙmù"¨y^øÌMo¥­~*³En*Õa–Uî“ YfÄŒ8o¬5k[²ÃøàîôÆäz ÚA|ŒT{Ì„“aW¥å‚HBëÈÏ ¯Cß.õ§_`½2×p*èÍáИr`f©ohÔ Æ¬>¥€A,ÌÉÜGí¯Kjïî'jP[˜Y*#¦ >-û ǦgΆ¦¥e)ÆŽ;/¦—:°Q¼ÙÑpfŒÔƒ‰ Û`c2Çz‘ܰP 戓qá)¯rœ-a®[*)¶ƒ˜¸2ãVÔþ€«t=Ÿ¾döÊY;Æ¿UdWoò]0ÖA(¬A¾ÖÔ„¶&&,wƒçÖêæê tÁ¹¿E…sYöö‡Ê—hŸšåi¹Kk“ŒãŽe94ß"ya~ÐÄd5wˆ8ú‚ÙÚ' ¾=“´hPDþ¥Üv^“.\Ðò‘É5›¿lÁĬr]ÜL";ãF RSQaË;N•°ÀÆ~0ØöGC¬ÄáR|Å-CCòïÆ‰Rèß Hº…Ò‘ã“‘uU°lË;¹IÅÊ™›šrÚíµŒ°±¡^—”°ÛC˹\HYê€[JÉœ ^{·ßcÎyv?áb±”5:J–WÄÂÐ!?zVÏx©ugoOàèú¦_«}›§iîx­jî§¹T0ey”©ýžG9iþëtñnŒt}ukEE»2@Nå¥"íÅ'_Uä*ZÒÒo¹ÓØ¡i_•éÄÀÈ™Š4paŒwÍøJàá/åi•D1å7÷kb÷L45 ™ma_AÜ)#¾ a lœœÑ–x7>j­bã 9èeàY„ãw9Æ×ms~ÿNOV=1Ö‚ƒKãnãu÷\°>—Ƭ¼c|p§[Ž<.zŸH»Ÿe |tFJ¹$ßÛÄ3HÊ73‰TéÁìfé‰oß=ÀÙªƒ½ Cû,à å¤8(SxHŸæO ¹Ì2Mf¼ 9ž×Ô´7M¸oMæA³šÈ­s‚Þþ‰Êú½â\°´~8¦n>¿Éy'eïA‹ ëAgÛä‘4X¤:¬£y¡U'x@öUà™BÕˆ»Ä8•®‰?Hû0z×ËÉ +NIü”zd-N-(ÇÕ´¯î6¾%:%l0­z…é”rh%±&±¢)Õ¥D’3L&‹½ÞXG¯&BóbSÕ0ýUb(àÁ¼&ÊÓ‘ÁÛœ‰ZB"Ŧè(eg5è{:è){ª—½|7àÙù³ˆÞ•Æ(¯³‚kaõÜQn±Pú¢T[G «åÞûú„ùaèPß%·}Qj«zÿ. W¥tˆ|HHœ¸Ž¨wBÏ’Í£·ÚjRËÊD6‡•Šœç……>,ˆVWdÀ.o}V°>ÈÀíÃÊðMtÜ2Üš€ç$¾³9ŠeÉP ¹KG‡:&Ê×7Ý,é~™¹¨ð¥í>,aÇEGÊ:šÊ_, MYÊG¥¡H)…‰‰ ‘¬ëç ·X:¶,‡ŽzmÄ]%ï-{Tó¾¬j²U쾯ç|@M{ƒÀ*è^«º9Dd'½ïB™#Dãa-ñ~xÛcßLo8QÁVo$x?·gŒvÓ}sVUîðþ6é<É(Øø{f.Œ‡ÉÄ Ð„ÄÐeÆTF5ƒÂa¦ô3ÓðM>¨ã[8VZ·V#ƒ=Ž!;+uEwû3Û KVN­°•§êXÄÍ<ûç¢ûŽÎ­>xxlhµ°Ú¸*Òox~^®1ô컫Kš'•rÞ%¨‹ñÜ=ŸW®O.¨G]¨ä*%§Á½p*¾z¨n­ëU"•ïUÙÞ¨|“Ьp[}GÔ}ÃQ‰kZþ>žç‹…á–¨\yq7÷Ø–u^e^]Y^ëôXP 8R ÉûÔUÈe“Á|Õ=rA¯àl[lÁvÁì=J¢öxWqӷЕ!þE„ ÓS2w:CX$§üÃa.ØNI–QCÁžkgÇ«šm»VSP´¬’VüÅp%#T9šn€ec‰¾rˆLC­N*© :MI ÈXÈCäÝSYÊ!J²8œ~¨#0ÝœA¡¦Ñ+L³*—q &»Q+¦âžyý'Å'Ã"¼,çS>5ÁHm.9åŽ-1iLØ÷‘ÀÙçŸd"Ræ­aØ.îlIÏ eNQúµÃLW"—dߨÎ^û³ÊªÆêÕJ*ï§U–³²»ª+‡ÄaHOM£îÁ ó)dÚŽ¹òOù“UáK.¨ØuŽÑ èiÖ¾)dåÓ8¡@žG˜Éžg,Jfã3 2¯ô‚TXÁß®p~åKÓׯ+“¼ˆG€­+7_™”¤ˆ5îN5±C˜3€žÅ¯ªT4ksÃùé>™è:(臋Ž}b’qeCBÔ#lóM{nÁv§¡%¶9BTE+ßûdûQu¿\Jðc_’M–“Ê„ííu*…Ó#CÀùéÍTáÔ£oÖ.'3\ìt\”W~Nw•0];é —"õp_Ñ¡=¢L àÒêÞÁôÉè? øøæ].–£}¤Ê¼¤ç¦ÖÏmIn55aÉøâuý•–|¼~pÔd j_Ó#@,‹F(%VÒ‡dùÜŠ`_ð¾jU”3 ›Tê¼ek0^?–:í+ýô.¨øp¡¸‚úŠª‰1?IR‚¾|1= µfRBæ+„ÌYøZ9357Íê:Èiͪü««šhÍrn5sèIr&¼o½°ëù·¶&VMD%ÄtôjïðŒZTéõIwcKN±>MÄ ušn[ûRâwÆÍX––íÒŠ½v£ p[ ‡Äšº'j¬*L«ùÄ7(È”_—ÉÈ”^JU>Ä:y¹J1„¹PM~Šñ’²ÿœÍ"Ø„%eªŠ&½G;±,Œ6 Ó¤í Üø…OæÍ~YG˜q{l%°Á–¨1 ˆiÿ Ó{îAzs<+$EwVàeJe¼B}Cóu˜.îc³yï÷´^« ¹¹\"Â]#Wj±Þé–Ç œû=+)ò ¯=ŠrßùÔ 2X7 †Sj.fn 7²àv§1<YÕånuôºzÉÚµ”®­ë)ùZN:튑õáCÕ&¦Sm®kÅœÝwV/5ÍYÛÄ0^Žlp¨5H++ä$ ÙyË5[ÍÄ,†!þÆCÕn)œ“úû|x¨*¥³Ã¡Çº8ŠùË>=]”o]^+¥sçé´À4(”«ß–ÏîT&G½i$qY´¥ÛÏÅ™èKÓÞâWdàžÎ¢7fÉO€s|öv¶,P.˜Þ*®}­¾È'``æ"Q[.iÆ!£g&"÷r*¼Tý×8!Û¿&ü'ÑÅ éXqY™p™YYÆ ²þ!LÈú‡0!ë? Ò³ý]˜ð·Èà÷¸ ð¯¸àϨàßDŸBv¿Ç M hŒhŒiLhÌhÌi,¾?Ç} šXÐXÑX=þý¯Ã6¿= þ4×±3þ´7¶5xü×ÉêÑAG'gW[«? ÿüz ë%PÈÄHËö[ ÐCÌ^Á(Á“§U¢W·WW Èßû%±=x'¼ž‚À+kšª%‰}‰ö"õ"uÛŠ5-Úá³~þ`<<Àîw’ôƒ’:ŽŸïZ?ïǤ-'W×EF–‘Ü]¶_Þ\.è –éB…î;ó3Qs¡ x¡1ïó(‹mzO¸‹LÌ;¯7Úïø¾Ãž8‰»ÑìžSþÖYqØ¿ÙHGTÏÌ|Æ‘OZÎòµ¸é½ï,œæ·å“-Šûã¡&&³U(Õ³U”}Ñ! ‰A­÷þ÷¹´d Q±ñqéí·8g6hN‡âCÕ‰_™7Ç·ˆÕ™óÞB•±K=¤÷ Ç{¥9is¦:¨Åð²Þ•î‹7Voõ¬t÷*iÍqêp :EÍ!gü¥zó×"C%Õ¥93Š?ˆžÝûFT`7´EQ”Ô·D:—ha¨#b›„Ý„¡ÉCîŒßÒaJã)!ö îéˉ·6±OŤÈRlvëŠó©Rò3˜Ù¹nóh>&G³ÙmœKævµ˜iŸ4:L³HÓdº1kÄEÂDlÁwv³8Še³nXð Z¢bè‹ñÁ>—ƒº{[ÙÍ}aÖ„ïð"¹(’ 3Så@H"nBXZÏ]°t`úS•âÂÒ-k—óª­J„&ø¦F·9aïß[Š7 ˆïÑb “™üÈA³ƒ œž'»]‘†Ð¶TÄõÅÅÐ;OôÌ)Ro¸ ¢ ðôj.»R*T9±âe3õ#åÁŠ7"æ|”×±ªjÔ@é!îB-—LŒ±çu`¨-O?á*½Í€ RäÄVoÆ<»ÅIìÂE=;]ÅñU~ðß>BºØ ßÚAöÇñ²ú0¸y½ÂßöFÕõ•»ô½ÉÎ׊ Cñ7´£I£••æ„ðÝ}źQ`SDâµÐ­¡l;I%'»ÅÞ±PîñŽÕÈŠ!gÙ ºŸÒ²åï)^ƒÎöì §mË/%ˆrè)e Hë£sNò®èîR_ežÑª±5z[–'ïµg0v®¡3…PŠòÒF3[‘ ·zÀœNi<"Éß0k©‘Æ„‰7V ®Ñ˜ûm@©vP[ã EñJ“žÌŒp pôýÕßg†v°(±®K/B w‹†#}š ®n‚£VœBÔ!_µ]GӾᬛÜ÷k_ZÞÔÃTf·¡¯êÊ+£ò௿ÆWM[Q+8€ó™ôôŽ]×e5ûìôã¶ï¸Ð~[  (Ô±<Ž”ež WfqZäÛFÑ ÖRù ½5käé>ËÖ6F[O†”.¨þXÝ:sôñyv¹mê]±Wß ƒ ó¨÷»ð î=w/¦#­ì=À<W¼] .‚ÇC´ ‹_nÀÕFèN¢Ør¦ÑZ*×òyôX–XŸ=¬˜,°­¨]Ïû22Ùt/ŠäVÁ‘®¾Ø„0páàéˆRŸÚ7¾S Å2è²Ù½ÜßWÛ"ÙñóSÆ%~ýÖЫê `O}æÁÃS?ÚÞ‚̧XüS”„ tÔ”ŒÿPÏB v5ŸV©¸Š¡¯d”Þ‰A Šç‹ƒ(ëÝ<šŒ%K‰ÕîT>¾¦~Ë‹ÎË>í º¢ÌµÃy NÇõc³âèÚµ¨RYAþåøÂ0–yq¥~Uîßê4;ys”h_±Ô¾.öödzׄöltš÷NìRQÛÖ½…j•ÐYÁ.ô×iæoK'~5-ôÑ[æKÛâŽ'ªÁÂ6˜×(eã®àøŠWvc©F…ãI }Á Ì€«ŒÒi¿×k~ÇÎ Ô{ˆÖoÖ|¡ø’Ýj&d,ó²ÔáP:¬9“EÆC×Úd[|d©môÙ „ÑA*Zœ6ayó‚]ßFãûê§Š‡]›p¤¿£¸äC!v÷ö䪸¦Âö(Í’ßM]7e…Õëì,»0Fs8Í!'@Î"ïIœó‚MÆS­F[}ÞÌ&X$X”á ÙÒ–9„WÚò‘´ÔÄ5U1½¬vÏ@*³Ù¸€,I!e‚Ðl`r 'ºªànñ¼ä¿/ºKw÷÷ <Bç}Y_Qf²óÚìz}z.;?¿žAظ¯¡°{Ÿ(ª‡…ë°#°´Æ².Á#²Ù$Ì +P†˜÷äÛÉiÛŸ;§¦8—†ûO[w®~iQLÏêðwEêrë JÙŠDˆ$ùx¹\Þò:‡:8„ĵàº^y¡TÑ"iL¶1saÓH–Ÿ]¡'qýk6]KæÝÆ´{ƒô™.íÀÌô¼.µ»FZ¸Üž6nÈwI²UZí G‰Fpñ„ëVÓ®²wNL^ÍÿTý ÅžÿªA¤|½ñ Ðlö—¯Ó¢o›ä©¼ÐLù^PN*%(‚¢*}­„KúrB8ÒC/d£¿Ù`+)œÚĶ ­Ï›Ò®Cö é×ûÙ1qE}š*qÀd”Ïùõ[°îìö Ôm]wVÍËjrVë ¨Ž‘ºµ´èmúòakèŽû#q-à¼å°7舣Kwù“eâåk‰È¬U%DµÞ‹ª%ÍM§ûI¤râø<ìÒï1Zð/º•¢\òggÍŠO™êWpnû%Ú™8õ¢ŠóI>û°÷~eµ–úÈO§{+¢`Ÿê¦£ZåúNå ÁJí)´AQÞ‹šˆL¥OïÓš> G柫å-œ¥r[Õ““Ã\Omd|¸ °ºÒÙÝ2žT ÍqtI/£Ýå…ÀUMpß%XÓ%*ÚmõéìÐ!†åuŒ/yùÍ&z*cš•º²r ŸÑhSj eá+[J{âû„®¼nÊš[b ãZñZq|ÄâjÀÆãµYkbýtëoKãÝ=¥p׳x»¬ G P"± Þ•"mhï-#~àGôy[MFe²œUÕpIÊÖv¨mÈ ~Ɩ¤žÑ\‚½0 ›Ù¹ï(jO_è`MÀáhç~¡øI½ªÙÁl¦^ÌŠæ^u9f1cÚ¥t<T$,f"‚x{ ›ðÓ²:\H¦ˆ%oifP›/ÅÜHP‡•z–Öšg¬ûúxØ‚?pLMÅܘ ±%‹{Ùr­¥ƒ#Ó(…}Q‰qPyyùÞ[³[Ü}Ñßh3]À6-/ð±4xÔx•€T~` úè²Õu[Àž‚™žÇí‡fï£%£>Yd(ÖðúÌáÄѤ_Û0s†{*l®‰ Œ9S°ÔÊÏa+cÅÎã6Ú#·Q¯°L.fkë›|z'½|”«¹ö§~žS­ý¥oi„×=SVäándW,oÓü+{V_Ò’lzX¿«@p•H¡¯g•†(LŸÖÏþˆiÔÚÏ`l1ñJÄØÄ›ž«P½r’×KKä ®Vùà„_`Hš;šƒ±œë._Ñw`çýhêhHøÂœ<Ç ~ñw8¢(‹FÀ=8(’fW»¶ðp@Å×=W¢6½%rVããugudš>Éä) ¦èöa ³•S ŽÕ“ãPFÚ‘ÚhšIQøÛX/ów&åawæf3A¸\.fvZÖFw·ùkÁVõ&À`}C@ʸbƇ÷雥¶¼ÕyèP‡À»•Ã]ÈÐn_Hc«w Ž¾ÒŸEa¬Ÿ™©«Ùœ5œd¸$r1òÉä÷0¹ÏÍäÿ¦ý¤" ¿Ÿ¹ êxíÛ7"òxBABå?hn¥ä´}Q81›˜³ý©9/¬_´0 B­r°¹çàièP¼hÜÌØÑ[œ9h2<=9VŽ*îõëv'VÉ#é(w}M¨æ¤m#NØîqU/Æ#œæv+4‹Ú‰|"î5û•áîS¬–ºpÞ†ôhþK=ös à…/!ÌCý°µäKö3qô|2ï™b^÷àîÙ`¹'2yBÍf;©;céO)òuIjaÓô†ï1íÂ*± ´¼!çÙ'ä~EÎÙ0÷FŽ=\SU¸d¸d%§>ÎË4 vG,\¸`3Ä€vѯ_ÞâÕ¸¸sÒäÄ £îA©•HèšÔþ!عÕ/H½…s£(vÒ@ƒDã’bãæ{ÁÞ-•œ‹J"Ÿ(•oE¾BìëÎËãP¤á5¸u‰ScxUÌéœ$¤¤Ó‚>§#þQ„PlW³†=A:öƒà;·€´•Eÿã(¶ ìqw{ü4¾I9T”+J£FlÎ!Bt7±9>€êÜ.K«BŒÂ]€Í7äÃÛ”]ðÙÊB Œd«‚@³¼VQÌ9Y­×”¸JŸÍ7s‘ºàË'±ÇÆ­Á³ÙºóO¼±©% צbYVa"Q°Y{(šfìÁ1Áø{[7=\¿E"N~h«u¿Œ"òæ›eb߉šN°âœ/o>ù€?ñ€¾;p²$kf¨žÑÖ¶¡>Ëf] ÓL}Fõ¸Ô}Á¬1Y>·Ûˆw³[ÒƒðWýU6‡m”1-ѯl)‰™ rU‹RùôÃæ@ļìCö½_|ã}à"Z·Ò܆ü?3[…Iq×m OåHKÏVY½ºìeF6jhIsâF²ß~»¹,· æâåÄcÚ´ìÞ\{ºâ°`dÙ©ˆªì>„­‚weÕß5WðѲ&–˶­6Ûlç”Çþr à3áÃI_u]×ÁWq²Ï{ïó§¶©ÎÙ꽉ÞDëꀱé$“-½Øwùål1‘dßàÏžM/@A €Lv!îÎ4Ý–R%ŸØS°3æ8©^˜þ>qÆÔ4 }²&YiÈ”wFÑÕÃ`„•ƒ§ˆr™è e‘õsêÝ ›Lr cŒƒ­•düæñI•Ô ò¢4Áø‹ÏU·ò¢„±!ŠÊ6jxøÓ bNe¾¢Å. ìBçâ`\„!›U]™ŸZWó,”n¤©HèTŠ9òÙ´(å€ðÔv”§\>X´‘kI4o[+²šÏŒ¸¢…Ðx`¿˜=ûáõå^»Ç¹“逊uÅbð.ÌUº+ÖЊŽí0bÚø:]è ðÃñó¹F;t¤D½TªíÜ«ëbIŽ Ò®C™ð1•jöKŒ): Ÿ»Pàî©£XÃ?‹î¾Ê™{»¢ÞЩ`ESMžhpô%yž8ÚŠYº®° ôv,±CeRý0þ¢0:,Ô¦âàê ?l ï’ÆÊëÛn'IŒ šIô`:WÁå(ÖW'Ào›¦=RýÊVªý"Íc€ 1®l¸'Ò»A©|G§Ab—ÆaÞëz0²F…“îI«XŽÑVBËäðó{±.g·¦‰c±’ZIì²Ö—Ý}mv·Õ0³X´”Xˆ5È3¡šÇÜ ÌÜ\‹cß¶DtT”…úÅèåÕØèuÖÁ2¥’/à¿ ¾¹]AR3-ÊŒ'Šú:’:'×\h‡ÕôÁß­°bž²%¶wüKD/1„‘Ýõ³°«.ní8ÀÛŽŽi5˜ˆ 천L°Íõ»7d·~T©‚òn(4¹mYœ8Q@ô,&¤‡nR¯hNFÓŠA±½Ý>e'AÙø!8›Jy»Û[bg³0¼~h‘ëŒ]VqÏÌðº_CIy!0ÛAfLRg ÉÇpÐ SIq·Ò&Ñ"XH÷* ™qÅ[Ï—|¼Ñ÷Vß—¥%h²ÜÅj†ñ¤äf…÷~ý£kM€–V¹w?ÅñAQd“jsÓ“‡ký°Uí‚…²YïY"í~;Œ¬:Êß䟡ýO&cþßd`ÿd`:Œ,zúMÊDoÀ¨ÃFÏÊÀf@«ÿÿA2°ÿD«þG’±üד±üÛÉÀŒl­ qŸ²G>õ™Žšžžšá(Øf¼þ›éÀþªþ§çøÓý_žŒå?Lö[‰»ôïöË_²…ÑÓý‹taô´Oÿóö©¼èXéXéÿ’BŒù/)ÄèXiþta—~Œž–•å/×XYþÒZV¦¿–cdøKš2&f¶¿–{ú¯©ºÆÀô”eàOåèèYÿzé/×XXþR/3íŸåÑ=å#ÿ˽Œté3 Û¿H™FO÷äLãddadeäçàgàc¡£dd cbàf`cfàþKü9g+ÿŸ4íoòýF¸û€¿ÿÇüwÆÇ™úÿîóýŸøü ž÷QcÑý/þ1ðÿ7aàÿ_f¯ÿ_ÍD·´z,ˉE‚þàõ<ñõ tŒžÇõ‰g¢÷ :þƒÐGú·„qƒ§LO[ïïùãO`Ôæ×ý¬?A2ÿÁ¸Ö±Ä• {4øT?d?ngdÎó.y¢/[>)ª_>.%Åï«ü±?·Âã¨Ù=ÁWدòψÍç «ü~׈áÑ%þUæI ¹åÒÓú5xæNè<á©ìŸ6‡¥Î9Hç†R÷Q¨á3™òi žè?”›Á/Èì¼á†ÎÏ.=÷…ôi£ÿ¥ÌÓýßÍñrÏeŒ¬tÌŸÚô$ÖàQaýñƒklåô¸I·—®‹ýæÉêI„Å“Þ{œÞÇeðL\0zlÒ/4øïÍ û©ÉžCìžvÛwxû“šúc“ óDizÒ•Í5×Ñ}\ù”Ïéïs`ñ´¿Ÿ!:OL!ª§&ý쩹‰…Éò’£Ž¹Ã£ ]{§'íóÔ03< y^¯vsBöØþ'É3ýéû@=Õ÷<ÓO‡£³ø³aÿ˜ ')OSŽûô"ÕÚŸïýS_-¬ž0õVßTOËö{¯Td¡ãò¤ˆ›ù'©–ß©obkðaò(eKùS¯þh¯“Õ yÒh¿J¸ºOÆî§’|¢=Ù>NÊó0=î0Ûï,'ý ]LZPL^[ŠOA‚ì皢£{ì¶Ê‰ÏBëù]ðŸ¥>™„G›ô4'†”Ï_þÖö'?šÿ°ùcÁ§Ê~AæŸcN–?X^Ïëî×V{^i?vÛs7ŸGôû²x¶HÏo>éûßÆë‰¸büd'- ¦ŽícÛŸé¿§ž^¥|‚¶8=œÎãb~gÿ 3·²²¶û9• ëå;hæ»æÉ|Úá’P“à>A¼~L¨µŽíÓ ŒòIêc‰ç•òxT|~½òyï•z.ô<Ñß‘ï¸?î°yþõ蝹~úÆÁòi‚~`|Ÿ€¬ÚÞ‚‰ÑHê 7>Oq-ŸaÆO”ù'úXîö§ÅøÕϲQî݉KKöWˆ=?Ÿà“}|–Nn÷'pîó½­À¥À¥û%Üîoäüâ³Ú<Ê ·ã€ü½ú'Oìb²P‡mýãA×NÇÅî‡ó‹_ƒOÏþhôtºû±¥pím žÁ3zö×z|¼õåèy>Ê{:*>í#}+û'éVFÆÏ #ÝÇmò¸ÜqññHùŽçµù·%Ñ %ù’¦ù‡æùÞŠïëšô¶Dë¬÷xnv¦Õ#{R‡ô?´Ïóú µ{ôLgB÷Éþþó¨‚MôÉ~Öõ4(¤?W&.ñTÏãýöñÇý?-.ýôî³ôç/é$9ž›ý›½ú1¢Ïê‰;÷¬¦þh¢Ûÿ´¥þ³÷™Sý(WúqÇÚÚZÙR=#±Ÿ×Òà >ô¨M8ž†Öéiû?ÚKýï5ýa}’ý![?¶óGÏŸD?ÚÿGHJnýG¢ó÷²þwÆæw4óÕù=õðdüG<ï''.+®;.ùs]td¿ÕðSÈosûdžoðwíñ«¶Ÿdôï??Æó±$Õ¿§‘zlÝã˜>)n÷Ç}ÿ ¡ABöHnCAûýË?ȯþت¿iÙé§@j’?÷ÿ'¸ü÷Yü³E÷ÇÙú±P~ðÐ~iï&æIð£1r²µ²Þ?ÖäSu6¸Ü¸?µùã'ªÇ¹ù©ÎM¹ÍwÞôcOîÎ?¼Žßøî’g v\ kûï;ÀîÑ‚=nŽ_øxȲÏ<ž]sùï_ý;ûdéì~œ6óóØ)-è“•¥¢{êÒ/çó©ÿ&OæôY }· ÿ§Ï¿ŒåÓ$ÒRþð{~3›î’•õÏùã{Æâý¦Æ5Ö£¶²{t#~n­'©ÏŽì³¿òxýY'=²Lì›×ŸÃÄÍõû°^TtÏõþTE?ÓÒcã[ùO”öïùç‚ÿ±žz =7ø©“?œÀ§Þ=Ÿdl þ€ÿcO×üßöæOàuª?¨¨Uü± ¯—~«çêï© ?Äɳúè·Rÿ¡ÄŸÇ“‚âûâãþ÷úò»vþ}¦Ú¿Ÿã_cNþ›ÁûûýQô¿4µ?¤ü­ø.÷?2–¸¿/ŒßLÂï—ž .Ï£¯Ãþgë÷OÚðGoùû—ÿ¡©ûîâ>Å&p©é¨¿{‰VOŒkeý=(FJKGùX„ì{håq:èÿ¸$žOiO1±§Pš­ã¸ðŸ-ˆ:á?}1Ãï‹ëq>R]~ž¼ž(—ææ”¿Ößoçªg×Óäø ùÜ §lU‡üýy¶&kê>­gòów?÷¹™?šGjù4–OÆéq,Ú É'ôÏÇ¡'÷÷'røÉÇ46²Ogª§s÷S¥?ìÁã¿Öß5æ¯SÕïr´Wûöø?8cý;Oÿ¹ ùljëß’óÊž œÃ¯ÃÌïÇÄ¿9)=Ž<%î ?Ï8?pýñ”ô}'ý’þë»§ÑåøÇL}/ð4AÿËÀù_þÏÏçOèOG[j'³ÿsügzzÆ?ñŸéié™þ÷ùßÿ‰‚Gõ?öù( WÖÖÊôÑ/bÿÁJ~ºù?]ÍãÅýñ^Æ÷½¡½ÞSLîŸùçë?LØ“çúwyTÄÏ‘Ìg“ò(ÆðÉ y~œøÄ§2}O¾¼‚¢ Œ’"5®è“-u±rxS|çE?VýSü“]W1±d göÛ«mFf–NÔO”ô  Ì­¬ŸöÑXÛ=½3gGó(Šžöqµ3Ñ3P»šXC@ò ‰ˆI?;?#ÒÇÚ†¸œ*\DYN“ìÑüz´Â¤ø¶ø”¸øød¸ÏÏåp¥ÔpžÚ÷üÞs öéõ>\c}Û†ôW„ÇBçqÈpI 64Zú†OÕ=Û Y5y1QE\|u-|M |B²ŸÚ¯G Ú?”ë©1¿? ¢g¢üáý>~$£¢g"ƒüƒOúÏëT’W“‘ÖVP”ÿ›Z ø_ëdx¬óU2€#«bÄhÄðÊu ²•A¦ÓÔÆ¿k¦565¨ÌÅ›/p Ü”»ŽHŸÇÙŒ‰‰F¢r²uÚNM¶jSóÀç6èéÇ9õjk¾Úf&ý “AíI{ŽG÷°Åqò…ðêMmãØ!-¢b ”|Õ‚¦³Jý¬Sä‡Þúz•úêévjÿ,¹OÓ×ü„Œ¡øU®­GÜÜÔ–(%`4ÎIÑÇSúÉմùxag¶8*+n«8Å-»ÅD‡Õ»QñÕ.oƒ…ÍíÀMR®—–/F§Wi¶¹· %?tÚ¶1òï}N9ÜöéènI¥`ìè‡v”¶ð¿¼GÏ„³´Ë ô”Ü~[Y-\™w±VYq›ºiç.þQÁW&¬”²M'pÅBR•ÖÈ—Ø´»9’dzA})\FIâ,Ä‹¼¸…³”èC½Wg<'aÉV€Š"[å Îh[—Bã<5ÌÐåŠÕüÛo+v%G¶ŸRÇXÅ^w@ôDƒ2a˨÷ÜhéO_úÂP[r! :v—X U,€çšàmv”,ô)ï@ AþF¼’X›ÇY[fdùãgC©ºCU#$ðvãj./;ÍÂhN*Ý’ÂËàߪ٘¾¸bFµ94H5DéɈ{ @<3û±µjÓ O>…XngzgµÍlŒ ríá Êk!mÂŒ)Úðaà´‰áªÓ)Ž4ag÷ÔyïºV%)ܱìZèlâ`VsVBÕ :;È­åóe§ú0å08«™!SŠô²¸j²s—(Ö‘*TI¸–ÁO!³tôÒÆ¾@½>Ÿ*ÃñHª‡ó-¿¾[8>”fFp! ¿µ'Eo$–™°ØŠ#i²˜‰^ÎVr`@±Yhž0h/äŸM¢—ž*µå±~•kò&7uŠ¢Z#†b[,Fi„Xî…™EŽK?ž*5-¸O6 Ú’ù.š¬wè¹DåL*ÏI©¯Þ@v@½Æí’>GñK¦FQÅóðë©Hÿ*ëZª…uh–!@Æ9H^2ÐÈ]È[gª&*óˆ£ø^áWL{“Ö™a†˜­e¾l)d†ô8n\RsM÷éJkªS¥¡^æ· '㢠k ¶×)aDÔ!“Ü6ÖßJzbQ€ØSÆýé¬èÄ 4ÅÒy¨õ× ¼C—H µÏÛ£ßën²mºMÀWÇó­@ ZÒ²çÛ¤½ךF&êÐÄr”yãÞ*w:æÛPÁ–n‡Úœ`îo jâ&ÎQ=]C±Ud$°TÒíi¼-zäaÊÁ¨¨¤Ü¥F¾ßjÑ“Bë PßK>«ø¨É)ì‹¶¢>WYô7€àÙj«1SšH`½ÃfÖ¦a³êo"V o¼…EÿªÌ.Šð®ÀB%Qš¹Hó|£xŠñÄ ¸×gewÓyyhˆXy¼X¼t {×E¬<^3TÃ?·pÙÍ"Ñq½Øaƒ˜=^rr<‰0ê¢/%±^\Tú g¹gPê ñ°IÔQFêª,øØÐ¤'²5ä¬dËhÖ‘u}&§â¢–mñŒ´.*4õ®~ïT—A9ó5t›ßFÅ"þjLøÇ&à¶qË=Fá×¶Þ-„ÉÄ`°óo¢_„ç”P-¶eD¨¥j ¦¸¼ ./£UÞaÑ"k´3£Eh)‚ÞWÓ±[-â¾²KöÏlùè,è‘ å ’|I©äú%!í…8Luœþ!E4µ!' Bf–RQüèˆñ& s,½¬1“b$>m)J¢#Í©®]Ú {ØM F†3½’¹xQ¯–×Ô#ýd³Ë}¨'ʼnÐgË…4t–ÊšL®XI3°ZNÖÄ¡j2œÓ:–A†Æ+"<ûÜ–Aïýá8hƒº´í=zø;a”ìH£L˜«‘ÂÀjë(†ðÍ ¢ÒÔj‰5íåJÄ´T4ß•9½†Qó"C›,F~É)åZŒ8P;p>-zÊ›A"w}“1ÎàÈÒÆûÖŽ\“Ë×࣊Y°–z™ýûx–Bdx²V¤¸à˜j{‹J”Nˆ ¡R ÓC ¹ºÜݱ­©ˆ, æ™Ís.CapP4 –æ®e-6%`…Xý´ÛjB.¼Ã•órã3]\kI3î;§Þ:H»€Pb<Ï|;ó¢hî:.À¿^ÏDý…Gi-1¤µWžV´ë\“’B t“j«d…;Þ„E.åu“D×À”fÙ¢¦c6ÅešµC"VÕ©O"&û²ç´›ðôDDãL¥ŽPI¤²i¼…V¦MÀ—dÔ£Òçi[1`Ôë(/„Ðh×ÄCøqîÏíYÂù|MæêMŽgë+8H1ŒÅÞñåÁ)VQïïg#§àŒ w µ\ÊŠf´ç4(nÆÅ[HÍ𚫱)&83JÕÁÝ¥òm »;EqæœM÷˜ŒóbˆëAm–;¯ Û0Œuå9½«‹1QHúâÛÉ¡mToS(B,"ˆ-Šn÷º9¹ä$ëNÙ[=4½¬&’_©€€¯{D↩5æB@ÈÕòíù ©¨øí)x‹þãQì`a«*´ dëÖ”¾@p¿ Ï«Ž=Ç! ˜Ã‚×™`·cöóžÚ(㇠H4à¸3Ìøl€Þê—÷‰…•žùÂjrä²»ö]Tm¿ˆ`ž” “âöGUÃ@g¡°â¼äŒ[¾ŽÊ]œéðl¯!7…ä ,?xx<¢Y¼ì¶JSaˆÐ€p:u³—.¥ñpÖ·VÊoƒÚ:ëÒ­O\Kô~žwÛêË'· 6Óoí:S<Ðx5ˆó ŸÎ%”üâNµ(ˆNv¦v\({&碧ô6¼´–^ÜRjÞxeЪ¼'ñÉVýÒ¨m÷IÿÓ™síì·X+î%I+©Qs\6½èËF3úW~ÅÂý"`‹kÛ —®ç_a¾™ô½–9-OàÑ’±* Œ‡\5þ‚s)‹W†}Á &«tn©-.àS0[ÇPFƒ‘S‚Ïñèñm-ŽvŠtŶ¶¾ÂËyF=y©8MãAD¥V´Òóˆ&`$ÞU¶UfS°B×òš¬â[p¥b‹óÙƒ^™9’åÏ|¢ÓÃö÷ ù’ Ú{Ÿoç«áç–"£î:/¡º®p»Ã¿Ž#¯øØ¶ShO­ÈUtÇ Sm: í(—½±$©¥Ÿ#Oênksh…ë ˆ+t{“®D×­£$cør'ÓzI?Bù%~-A¼Jœr’Ÿi(¥q.¥!m!DAèöœ’° Oôúx„‚ÎIïÉîb¯må5+5­h®}ùœZøe¨&§˜Ç¶¬< ˆ4¶håîÌî5}·Öˆµ ñk÷H9ohã¢@S%)y¸ìveqÓ5mÑýªâQ§_m.|Þ__¯ÜHËõ®–¿©>,ع ÃLH:´Î÷}‘CRwG4Íj0cÞ‹Ê1ö^KèË$ÖÁÚ‰í#:;«¬ûÂ5…,6¼¹úãÙâà†7¥ƒ <ºÎN£ì<Ô-lÄ,ˆ„é>h…¾–Ùܧu’à[€ºú Âò9è,NËØ‚â²ê|p=Vséäè -¯t »£ëHÓš{Ѓw«¾×º p‘BÆ Šò,f\»e[ÖJ9ù¬yBtŸƒ°­ ñ²ˆ:ÖsÛS( 1]!“Ç‚š!'#ƒ uD±à;Éý•©Óí™\3Gœc…fâR>õC½&Eêur–HxѲN;öVá᯦¼ïÒ¶µadV¸ ú8ýC7'‹+:Ú X¨§ |ggÇgÝ1%ÊGÏ–`½-“üˆàJQu~øhü|÷ÎÑ)ލ¢ó?å¢2ÐÒÒÿJä?íß9X(.Z.²Â{̪|\ï ]šÚ¢ûj8ŽdZ[Kª@[e^5¨øîõÎ!Ç»w 0(ô”Á˜lvÛÐí€DÐ…^ Nvåu ˜‚ë¨aªsþ[Óiëá€yÚ…pãî|Ù…/È( GåÜ[[ç¹,-W-+êÅìð%vö<âÅ!Î#IïOœÝœÔyz>áùH]2ꜬSRˆömbJ{lzÜ^bÌ¢Y¬çNäîÆÖ¼QDôüoô®˜ô™õ[Å=|^)©µ?ù €¸³(d³4 UƒTº£ß|$Tp¹ ¬Äë̵ת|ÍEke׊44bkPôéKîÍ7 ² ³brÙ(R„ ¸É›vtÇgóVòí¶ò¡¦½/‹²¥¡<ãŽ8“6²Fh¤qî²õ¹Cù†œ;Lå™j^ôÂCíJ!­¢¥{Jß;„ê…P4\Á,JÏÔ…Õ0©Îâ]Ž×Ñnt^6‚€ãjGœ&«s¨V€€dåÚ‘04ÉÞð›†M¡hÓò¡†bÁè1Á·¼U¿™Ó«xYw™z?÷eD³ÉÁFe¢`:gÙÓ¼u¦M,“*ö]\oUú+Á!V"ü üÆXÛŠ"dÁò–›£Ÿ”›=]ã5âÞ5³.Z×ùXN{£È¾g)b6Fòhañb·ÇËM4¼Êf‘µÝ2ÔãÂ8ÃP£§çÑzñ5DmÒìÂd²±Hµû`´œ¥YFË~+±B Ô£²´øã‰’6Ùd=+å(ßñ/°í_¡¬B½þ©Ä†öùÏ3uø'”ö ûSÚ?°µß%>ƒni]ÿqÇ?¨Àbÿ@×þƒ ý½ûoø7(-ä÷oÿD†þ!õ»œ :û21.=ã¿‚ÎÒ3þ÷¡³OSah®ù©%”¤þß"SÿtüGÄñ÷ñúøïŸÆôïxÔO³Ìò3üŸgR?=þOb©ÿÿ¥–æ“}­&ÿÿ”úsð÷XêŸ$ñ¿SÿNýÇ+ϰåŸÿ6“ÿ.¢úñ$íŸÕß'íyçýƒ©þîÿ§{þyi|ïÛÿ¬šžé_ê ¦ÿqXõ£v74yT$ÿ=lõ?31?°ÕŒ´ß±ÕOy ~ÃVÿsbõ™‘ÿ”XMGÇòï#«¿3##¥d…ÿNŠ|JÿœÞœÆèiAó/ÐßQ×ßs¹ÿsÊ#=ÝŸì9݉òHÏÆô;ýZBQás7b„žº±iŽ,ìlåLãW%«=Ê× ‚6üø¢¨ ¼ üÛ_FP ¡|½ñY_)—8”~:š‚]XYYtS_ýêåÌcu•{YV¿ÒD¡¦¦æ52ÏævhåµZ¯Ös¤ó"¬=6*:ž8£UºJ%®’Æž6<¹Cw«¯¥_XN”U•§ú­¡ßx7ÆJx6 L;HžU‡”¢9Š™K¨¾t9'žW¡éuBCƒá°ëÃôöhz=-¹Ð}{»`™øK£ýш”Ðö A¶F5“ù˜¤·¥HE¬äÔ$fVŽŠ’#8¹Ì‚½y_C/¶EZ=ßyµzã~¨VÙ$,û¨™N“ (1ûUjwõU,ñN"B&®øÇn?i-^øØ`U]úÊUII<æ— !Îø>süqC’{ u‰èRç¤Kñ·áÍ‚k+½Ue( Q0B"ƒQu_ÐÅ ' X½T°N^ïáþÄ’v>«3¡7ÿ­[zõÞLUwÎNï³ÆUݑۦùÉDp¸pGô‚].öÛÖë :¨~oºÈ~Çpo}·,$-ßîSû³õ(}pòª’D”–†©ýT<œÈíRûùH5¼ø7j{É\Ûû”HšÎ¥­á§&RF¢ºýt¥ŽMÊ4ÏÜß·‹Ö¯ˆ’g¸ã—nu¡½¿F*†Åø j_ ÷±Ðáý!ö³Æ¦˜0´ˆÍƬ1#$ï.t"@÷.TÒ6,»_Gÿစ¨f;7¨«˜5ð¶Úz²K[L4Y­/PJIô[Ê´À7s\#& ï çì6Nd>`¾«$ a6Ü…•m“WjQ«¹7P—Ñ[ëW÷•­£úHC… ɉ‰ò°Ø0P0â´&«"b=Õú‘€¡¹P}šj«LJ3<T{ñøØKÍû¤P~ðÛbØ|Ö@šÕ€ˆ^`ÝR*t+Ú7¤…5¬%ë ¤1ÆÐcB]*í ¾ƒè«ò!éi.¤8,'0Šö¾Ã.€Y,J'àÍ‘3™O„ƒn=Š®Žw!ay´PÀ¥}ïÏÉ0¸u>5â*U«ÐÛLÚ2 FC]#jk<ç=Ĭ]×–[ur n‡…½è¥?É¿KM4ºÕ1b$ZŠIÉ„ÐLÆzÕÆvvûÑbWõ!$ÁÒÛ/ì¾SÇs†Æo£ñÕ9¬„Ô-ÁÔ@˜Prè‹"òÿÔ%äòwa_Ù³Þ¿b«iXΧ—ô= $©I¼˜Ón?yË9çøqÏ¢hS%û…Á• À–p}o{T5ƒ+$:A" ¹‹M}žâxæå»†WW¼7U‹Ê½Ä#sl'ØÛ—Ò3\:p#‚K° ’Ct¤L}@˜4š?\42„’~åGd„«BÀqûöþæòs\‹íAKÃ~$ŽÍ \DZµ" &ÃQ0»Ãµø¤ÃÑKÖDÙÀ`•¼RƒBK”Ó» &Cæúìíµ© OdY px)|­{÷y’bÔaéZâùÐèÔ]¨UgÀ¾¬Ã×wõỦv\¸tQŸ»eÖƒ€[)f¿ܲ&˜~›>¨á«éÕ©Ìn”Ç>“h$)­uÁÅ.|ÝpSÍU¹(âý‘ìΉ%ÛMqr˜F:³6 ï¶–Ž§®t#m«Š‚M%œ›k°7Ÿ2÷Œ©UQ<ŸòV⪲«ÙÌÃRËP›T»äî%îFoÞ9ªÜùªµvï|hue ¶zuÙÊ>Ó‘t ö€÷R>“Ø-ñŠƒªÆ"õúç”o¦Q&‹V7¦.oŠªq jß·’ C„Z@’¿éUó4LÈùvè«¢ŒsظêYùE–é q>…˜W½Øìµ:Ô[ ¦’4v­Óá ªA±øÀž_#ŠkÀk=M¹*þ`éÒͯ¢:!Ë4ÊdÆäpr&³¯LÛ9;>VPœ‰Ü:^nÞÙD_³¦S…u³®×— Åù¡W¯ ‡BŸsKœû%ÞàÄ;îL¸Æñ¾taE5n‹©«”í qg' ,b½Æ÷S €à“ø y%m¥… ÉªÓ{±<äÖ„X˜+6}ÃÇܨ×È¡5u^-N‹‚=‘æó°<ä«’Ì´Ô›¶˜- ıjᢠŠ6˜ÔdÑ=íÑ6òæúÄ•ÔýTñÛi# mtYì}®¥³Ï%@µF7 üWì¹i ÞŽò£ë§ïP×ø?ªHwdeL›¿b‹O“PJ¤îx×´ˆ|ù · jÛyZŒ»ù´g)ÝüV¯Tÿž™öÒ«¬Þ#îË÷L¤ _Ör Ï ø¿¡…îCð›(È¬Ž¯J{ aZìUµ¸¾gt ì•tí $ËmH,µ„ŠJ²ˆ{}¦ì7¬Ït2öO%‰MÃV{ ÎH/B êÕÒ’§á×â$F÷€5 ·§Ì—]ÈÄ,V%ÊÆogbeƒÑ–ÃÁêJe÷“`âh-ê¡ZE•”ŠÎܦ}2 ´<ÀNS3{)Á³+¶2 ®g!É“—Ž<¤·GT£âGe-T¼ `\ò`´ŒÆ¾X3 >@LT~$ŽÛ6 ´ž#ëŸ?ÿ(iÐmF¬™¥,לçrl*ï=‘%¬½eÆH/VÙŽê3ž}\<ÄT®Ë+Ž)¦Å»b s²FÙ€(Dz®>ìÔar"ëé'Zª(§eÁKU8ílŸþîµZ01rW4ç4ܱu%d”aİ! qV= ÄkYuEå´Cb)°Ó €½Íú1û aÿ»‘ðÕ™*¬¨T†&Kž=çq¯S6ûRP K<-‹ªd©×CYuèÞ H7¡è° ·`nNõýYóÆô)>(-^xëý7™8M^jÞµâ[,YèF²ÅÛÔD«ŠÙ &¼zÓèyÌÕÔ“ œ„º˜:;DŸãزʗƒ„¡©Ö!Æ9®? »rv7¿÷²EIð3”=8jö‹v ƒæ½ x›Öã̾ÆZ°WL£h(×]¡‡u‹¢iİ5¬‰ZÔñÒÑ]K(1Á^^Jš• ðˆª¢„BJ lLžÑí8à ¬,ÂËCÍÛvÝÝòîtˆ^¶(“ÉÐPÎäf ê¡!!4íj-¿ATÀÊ]JHû ÷¨ä÷çhׂo±D瀯z]eŠº¥94â&õœ€XÐâT$ †øm„Ý,/OÕ½ü*—}­ÖxQõí–Êt‚{M| "WvõófßÕ/ІÉ·Â8A&ª¢•žÎ‚rH‰-^Š9A‚¨Ýè7 2 Ìcr’’R{Aw¼Ó‹ïwÒîfÝ«ÚYoxÐ}÷ó@Ö’¹Ìéó&©T¯'®ùH¦!h5Ͷ|%Ù .¨–T™éî5?Ú_y[Â-¢0wóÙ]<Ö2È ‹R‡Èõ.¬òã{¶D3¶êh¸^ǧí\…uS)·ShÒ›^Y ;NÔúyN›>éú]ùqyaNØ kåEÅÈŠ3iƧ@Y5áooÁÒF$·gB Ãb¡&ÈZ`D'“‰-vvãc “PPônÓ‡9‹>8")¾JË1YáuH­È­-kÜ&e»w™g#„÷\÷7 `p–:Е…fÌw80ƒ³Èƒõë‹ñ‡Xø–GMóµ`ÒeVòÈâŒzd3 àÔ©œCvÝx3¶|J&ß«Fh Ö± b¹ÄÝ%Æ!jsÛæu™FùÄ.-É.× }Á¨¦Ä¸%˜rØ«#ÀQ~™X‰7”sFÚïã“-@xÍ”“!cÆ^gpö%@Šê(ñIF'ÜMöSG釚 K9œƒ©†7²z„µèEy$x­~‹F¢e["˜[c¢OóU˜šø„(21 öaöc𥶚ȸr{iþûü¬:ïº4éâàÁM›¯<?Ó`¯å·¡¥‡è;‹s:äÊ‚’ƒ9´†úõ)ïëXev™ÅèáÜŠzñ6 Ð±Â4‘ óó}ã)Šu·pIO³¨æ7)Pë»=“4Ú­c1}L#…iª@Š\mm¥t™ *ÂǦ)¿±j`¬…óYZ]+m!¿Š¼ÐÔ<ÞÚà®´ ùâÖÊfÖëÝ´`S#EK¤ rU #‡XP·ËÇ—Õu¤Ãð~çì-Óô‹oQ°ò¡k_32—¦ºë8èì}»Ønׂ£"¶}X[œ£#ôW5¬Ž™Ô+_·(xOËÆ›—õ°Y¦[7§ÑÁénÝPµYÌò.…èsŽOÝTöÀgó–×°°U%°3ŠSóßæ[Z„3"ßt®õ;JÃë.GjYkÈ9¬~)=a”­Ïš=xgf½q멚§E¸ZY‰VL Ä3W4:×@.å¦m–¯¾“¤›l"†(.3‚ª©\øÒÃæï“î4MÒ+ ¢C›‘¶\¬Ï4ÜÍî•XQÈØéU¤À­é¡} ¯ÚCZFÙ`?ƒŒf¶†h/{SRŒ#§–öæó“ƒ"›\¨†j}µR‹ê[Qøê4±„½ämädY¹®\“’z]u…~Å᛺¶i¹4DÅ5kYìÁɾ€Òê”ãœKŒB ,Až0SQº¤?2ÙéquÑèÕ(B_¦ˆžîGL’«“,!È1[V${²ÆÊz½^î5奿±9ü‰CˆD±Ìd–(â¾CÈÓð!é“ f(¯ÜÜÇЬ8±MåUè–/­°W€~3º í9¼æ„м_§÷à­DGŠJçb¿ÔVÕõå‡òÊÊj*˜qÅjFü¬ÃaXÅúÓ>97Î÷޹ âìÅW¢[ÄX«Î×¹/Û,äÌ̯!Øß»XÒW §—u”¿jL(8-c_¡Œ ¦Ú7’ž’­2o£dÀ:‚Aiîæk6Û:³\#ºƒÌ$TQŽJôd­(xPý0,ÍgáÆAhŠãÓìò0BƆ¸°8®>×±&sŒ'!ÏÊM‹i°~5™[zØ'´â𴏡tGðÍ%ˆÖ3’ÒC¥–…CIÅDåäš7¹Œ®C;º®—îborZw°Msž Õ}B^Ž–"ëä ê6iØÉd„Ä¡§Êø˜×>ÛÝ w¸¶Á]ÍEqö®ãö·_,¬šéî-%WqT¬æê©h•µºKO:ãp ,6; ÙƒºCV-wÆ_ó,ü5§'Ý¿húûxö/à -. .3+íÏÃïÄAÚd¢¥ûgA&fædbføKé;€PäG¨é B(ó C¨D£L£ò+èô;}Ðø?Ž<ý  >ƒÿ5Rð¡(ú?…¢èÿK¡(F:ÖßBQñ*FŠ jÍÜtQv²=]‚€é=•—ô#¬uhn"B”Þ¢$¼;ð¯IñüSöÇÔù£²E‹ñçzWÒåŒ(íúÇGÐû­Ü’†5÷€GZW5–qœÒoÁÓÒ[WO8Go̱ ˜C?;ëÁŠ V atûz4òU+8ïOÉí÷»û/ߟ j˜EP~˜(õ(®½tfÔíëL8FÊì_´fuVPmà”ßÅg²8à)pB¡¼=|po²Ÿ7šlÙòjO®Sý’N•jëõíî Ì–s{‡·2^e¡ƒ§•=yá_–bÈcQߣ‚ŽuÒ®-‹T«/°ÓG›(µžZ/ho¶€ÝÚýaQë zÑ)R¿"SÀ;×þÁǯ3ˆ?m{D½ancrk’Ô”½61…M¶¤(yŠÛ…)uAf8VÖ®ÈoŠsž)sAÔ"E.¨hxJתÖAœ*¯NîC!Ö”­)É9Ú9[­ï‚”ß×ley”)cSJ¦ˆ×2j 8rœ¦dE8Âß"Á\¶r)Ez#]ûWûy̘;)'öUì’]RßDàJXû8æ,î´'Ùogô²‡Œã„G`{x|¼¥ëM0L0ý`¤g 7ª:ü~ÁÊÁ€…oœæ(¥¯×Å#0sˆ½|‘ß…”4d„!Éÿ` µØ£Íš©Þ:ËÐÕ)s~žÃ1 ©ôšÔi ½B1Þ}^Ú$ØÙ`ç°ã)5uq)}¼2^~çmj‰qx&>^0[Fº†/ú¼S?1\B'¿ªOAGblX1I'`)àŠÀšÓ‡E ô^@Ÿk ×¾k®¤zû4WóKÏyyš¡õUĆtÙ5 lt.fèÀÉÖ Î’oî.<³M Üa+ÎEiíCÔâçmZÞ \ß- WôVûv½7H˜ 7}ÃcµÆÔ!© Íð-êÃ5ø±?C%VÆ…#,¸90ŽŸñ¸›9ÕL 8fOæˆÍHÄîh NÏ‚“çÒ+lÆnÛûµ‹Îoü˜‚]C´ïrd‘‘HOû8[ºA#çÎäȪ_ÄÏ)Ç#×m¡X„ ø·Ç«Õž„òÎEdέ%׸úÑoI”'XI-øÆé€ÖM¾Eý¥$¥~s1æô“tõÃxO3Æ•~‰ýÒKLVfE´4ì@Ç.ªlì»P·,àŒÙ{ÿq.,ÛvX¹‚wìï €õ€\üqéxãÃIÉXšŒÛk7Áuß¿Ìÿ¬ç´Ëpdô¢z±ßÇU$Ô^Ú&cK{‹(J¶új, êÒ gzI‡W0Ó±DÎôJæ¢zm#ÜŠv”ý+*ePtR ûwLÜEä,ÔT­È9¾øEå9U¡ÝÂ^µÀ÷àê‡vÐ%–R˜åÆP7ùÉ—2¶ºØî½i/fAÖà2áe›üÀ2 •Y•ßÞøú¼ ,Ã`@’ ˆ žF˜ãèÚ ©s3ò«« 6M?O¯a=Ãä­'o†ßÈsaÛgzÏÃt ~‘pZFù"&-6¨>†æi ,sjÍw1÷Þ›ÖéAbA†æ+’ä ;Y/P>¨–0$berŃ=°}Iy!\Bfô'1&ü— К/U+aý•ÌÞ¶¨øËé!²o&æ˜Aïçßì²§„BN"J"#£÷ÔÌL¥ïCšÛÚÁFYðà{:‰ŒЋ#¿ÎÔIùöŽÐ-ºƒWD½’÷âÖ¯G&úª$pƒ$þŠÃs ¥|Ê+ig‹íDþ„º\›‘„ÐÕ\àHž8J¡ÈÛDòÕáülâFLÎÐ@Œh+—‚”ï ß"1SµDª3 O÷”×Ñ:'|×™1;—€ÏD49M+»J`ÒÇeùÒüÁ}uâ•´±&!¤¡»>W]ã£ë°Ìäû©øö?.rJ(f°uȵçÖÚbmõ@Œ}»>¬~:h6Ë0¿qľªNM¬ø-UôZIghC>ßb­WæÞت=8’(x÷xòGœ¹>¾ÓìÊqÚ¿à^@#=i‚?ÅìDm©ˆv½m8¤ƒ¾’鸹;ÌŸÁÐE•1â!%kÍUí,Ùt;R'9D˜­…*­¶†(@bu_ß«Üx9t8yÅ]o•nê’ÉnwŒÓUÆt‡plgÔÚcØ™Œ9íu!§â_ykær6x‘²[WÂ!]Ñáxjøé‹óî%Ô›¥ (8šÒû…€ƒ¥éTA·í†Iþ{aJ½»7ÐÍÉð²ÚŽ‘9•§Q,Žº­Ã•ÊÄ ‰–²ÖçÑcè`B'®жô§äŒp¨3± Œg=-ÊÁfÜq|%—1,6knôàV„g¶|V)'LøÃ-ëêv2 ÇGÞ«Tj#yé¼®Ãð«×ZÆ38Ä/dš›sŒD¹YÕßùŠp˜ÓìÀ䢖9\Ö|œ=Ë—X¡Ø#ÜOž ¿AØ ýòî×-‰ápz/,–ÁMáÚhÖ4iG©Ïú{ÖŸ,ð¥|a„NrSÜ )ò!œ`˜Rf+#_ìäH;µ&½ûJ’{X€¦7¦ š™{,³On·OõR1+7„ë&Oûu5\%‘CÖ¥Î,„êL‡^_üØ¥h𔘬±ËþqC_ÍöÇÅžˆ‰v‰}n´©]KN^zôf[î #NõÊ2£Œmx}½ï…“€s?,ºÊq±åв²P“øÆ±EßÓ@à"ÞBÑaìOu*ñïE÷¿tëä|É9À›!†-ÃêkÔ©á®Z 䀉'±t)Ý d^÷YÆ:À€Š¸J4Ñ‚„• Þ‹%^›ÂTÒ×âµAÈ6100 ‡JêuKÛ®³‹X ½@zF¾<‘a>.ÑK—ÓK¦Ål6óÇSCé#ôÖro‡ÁÊÞ\¸iõŒ¾@—É› ˆEC{Û^äIPuRº¥"åkDÜÙ”3….ê8ñ¦Äbä ¥×œ ˆG·÷· çxðÕhK£ÄêzZuãáŒw¨‘o)ãr¤å¢FVP”1ÄSÚ-.Ò,+Π"Q„zAó,ø>«c»…}Ð롚Mò—·gc2'½ëúr‹NòÀ*b„0¥DÚ¤Ÿ)½";ó`h¬I]^zûª9­k~«'«Îqþ°{G@~ÖìÊo„8“ìD‰}HŠ9‘ÂT|Ït× ¦@ö•˜y'À u—„ý¹Ø|jCφYw‹‹NÏ ìÔDœ&Kç˜ðEüÖç]»“Ó°'ÁX.Ë»L“ÜbˆHÁp’Úx •Ñ/¢a H´üœAEÞ5GÉLŒˆQ ”A›u,$¿N:é¬t.Ès-ð\¸&ʇpoy'O3šß1R¾?"möª ó…2ŒM_H«?½ªdÖ p%"ž¨À—©à3F¶äÅ¡4Tþ&+èƒÎom ï¿î:8߆¶-wì¿Z…ôü¢)"]·¨É5shWƶAÉ‘mÑÞí¿þÖ•Ï‚/9'¦t¨fò¸Ì$M)ýüÔõal#Ú#uÔý}Õ‚ÿÈlMýÊ®eä)µiBB€ò.+ ¤RG8{ÌÚ§AåµYàôø›äùCËÉV^`êmЦûºZ4´ÞB^,o‡ ík\[é ¸Úm-Â8ºoº–¥ï×Fà^ù÷£ÅÓ3øÝ˜pîu0›Ó-žÒÏ…®¡¥ß©V¸ Áø¿¢¿vt ñe„åÉ÷Ÿ-ÉàšØ;ÛÁkR˜_X~} Þª³F\ÖšÃnè”È@A¸ôFª¡–nŸÅYi¹”y Ö³{à4¶ÿEîº'´ÄK+BÜIkÌP_9_vƒÐþ~æ}žX'ƒüVªbj Ëá‘Éݨ ŒãÕÁ•©ÆI¾,W,¡oÐÇâ/cšsl|6±ï×LbÇd$¨£ îÛÙ¯…9Âø+ÄJœÜ6ÑÈæ?@¯’rЋǰw©inOK1ûÌ}"±b-¦ K@ƒB°«¢4ÅqÊG ÜÖO*£uWM1*CVA‡ )¹w+ªÀÌTOT¿‹O2Þ¼ÛêÌkW"fÍ,R‰>‹WƒHsFºïÜ~y%=eÂÛ«q!„5?¯/»m&v¡¢oßÜ„ŸGXl “ìb[­7izÒøÅ­´æ=Md© ‰ÙD¨|d“ïèØ%ó9ÐÜ hGJ6À); kõêÞBñ[©Æ:AH°Ïè.­Ÿ»ó:k»¸|Ö+i¸úQÀe?˜ró´¶™ÙÊÜ$¹º>@¨IIíðND‚›#HN·—4›ïÓOk˜èqïc Ã8Ǚڵëß„Í.wà&k‰´±ŸÌm´-ú~Dõ ë@’ûâbéIÖå¸ËHâ®]Z@ÙÕ™¸k×=òþêBßl”¹þ£ÕÅŠ M7lŸ/lX)ÅrˆÓæEÆÀ‚Bj¬_‚8¤Ò` of¸´à’Òû”Yˆ’oúÐÔˆ®¢„"7™ÜË®9"¶áͶzÍ‹œÌÈ‹Vpduv „Ž IÇY8æßÌI¡ |ß— Í£ƒŽ"éwoÔé-®Îò\o¾WOóòÅ^혂@“ž:Ï¥ž"¬8›íEÌ"ÝÄãAÚÜ=QòfI^ K2vì|¾o@ÕÞ¯Ó'L›j~w‚®NÈÉ6¦è€B7+}}°BO ‹@2¶ÀLœE?ã„Ñ=Ä¥ñµîª‘C°7ž$„°,´ £=˜ôK6 O—8<¢6O.I%W©¦ž8é9™Ñ@¹òyâ¾{Z:ƒÕÆú|à;LeäRfÑZß¾q\ôɤØÔØØT•´X=“yÒÒá ²‘ᕘ%µ59…/ØIœªþcû7ƒ`ÿä5Á_Q0:V\6z\fÖ¿{ÓŠõoZ=}üíM+Öc`û» ØßƽþóúñúïÒ±{zëÌÎìO¯ç†<½{õô¡•ƒ-Ñ3µÊ–Æ˜ÆØÅÚØÀ’ƄƌƜæ)çÅ÷÷Ôh,i,M, h¾§yJFcEcõxá_ÇÎl~{ýí{ ÍÀñQ¾‰3Ís®èÿ(°æHãDãLãBãJó”µóQ6†?EÙþ+Q6fFfúߢlΪ ³ xnVA¯„_Ö†Ô*-¾î7ßµÉ(.|KO>Ä9Šg‡ AHˆ¸­FŒð¢€}ͽf&ÛԬȑՑՂíëÝl~˜ÝC³oëå’ÛÃé-¯wzmõL}Ûçág˜Pƒ¾*å ãCû·ymdbƒå{B5P¬OÙ1²6yfÂ->y›˜Ó—¹­pN¤'AÀTti2€3‡Õ1š¨‹›ZºjHšoßÖ»¯ªUm¶zµV›öMŸØ=\Ü~•C³¡<}µîU•‹¨ ›ÃpÙO$dhð1SÕýþiô›Ö©G®n"ÁÄÃ8üb¡•ÄJB—…ÈõÈÛ¥‘Uvø‚ÑZ"—!‘_#Ùá±^îa|þœ •„Ô sÜWÙ~Z¾Îµ1a°þA¥Tãü~n»Bóó7b>J\Xx+Ä•ž u¸Ê¨#"ÏÝ®Lp\XÄCDAøÊxpâ:‰x]ŽÊ·àDŽðBÒ{ u_U¦^;gÎ ”ÏÀkõ€õpëòTF8§gAàÑ%ãçÃ+„~BÆON’n7'6„g€pêòs_C¬†@é$¸êÁì Ÿ‹¨Ž|D€SÓ‰ÑÞ}Cc Ò(e§Ðníhw$/•‘‹"_ð¥ûl•äF²<åä:®”lUJ“¶Öpá ÂdF[•çuÍ—o“§Ó*I•v}wÉFÅK* ™Ž^;ÇÅýnØ&Øß°gµJ6¨? Û‰ÙR¥w–zT³ÝѺî›q²hÒ¤ªôg޲œ 0Já„J£Nõ·¬ë‡cÙ[wK’›íëë[ÛŠÚ›kT¾¢’åwpG€¶‘Íf3 2ȇ´k´†—Þæå˜¯G9ªïE=ÂSX ôÞ=Q€â•ü{´‰Âd†t²ÒnÑçßÀ—¸»Ê3@ô¾ê¿“‡m2vNCgWR™Üa8ÁCÊ[ÌòGšwþ(opÍÀø1¯ ®½fË:Çùºó¥¸ô`¸ÂµÄ•nñœ>ÓÀ²9 >pÞ¥òÔ—/zøXvíƒÒä ±îà嫹´Ç·#Œ-È» ]—R'¬(8¡lÞ‰¬iI]—;~&³F‡–!¬!dÊKøZÄ©­¥WV‘ÍåiQX딞¼¬ ›; 4Å×sIB[ø%f›†ÚˆYè ¨*kXr üãø^Õ„#ç:ho\v]aÃí›5—[Èù|u¾’mo>‰3FéÐâdµé¦ßP”Ý?oƒ¿Öj|1Öò*,›ÃþáØ‰Ô¿ek5wÖÿé` žhÇA0ðëŠ;eÓ½`íVË&õUܽÎÑ5WgÏKÌÔMýNŽÜ}ºöJ§FR!ÁŒY•-?è,rÙÂw;RqÃVÝöyùsWrr–”@ÊoÆ`§ðr¤÷ÈõÛ³XÖÌ7GÔÉîn\\( ­=ËY •„¥‚ÁÈ®˜?¶]8è}mÄç©4÷þÖâÙ·Oç ±¹ÝI)Í\4˜@jË‹•òn;ªx-F ã¥3±ë·Ã¹Wµ˜YbŒì@ߌ±¡Ò´AÛÈÊVªîrß9x‚ܦ‰¸ÞŽzBᦺiñ¢S·¸sßÌAð¹ùrõVöÇÓŽˆUüúñ¬äNäÍLõ<ö–a\OÀ‚©m5ŸÎôê»uñ!¤U¥v¶WÒw°MÖ}V+çP£Gp¯¸sû¼÷UÛ“h²ÅaPd!w6P¦ñÖ)A`É•VÐ64újlÔi`¸Y«!¤Pœ_d‹á¥Öc|5Mµc9UbÙ«— ô§tÜ¢œ“âG¿]±¹›(£X^õÎ쨌¼£>¸~QÙ4¶ç-ì€ÒDø 3`¡DÊlf²óai³NMBš»,„ƒÊs¬(‹,ÚŒ‡)n?Wf'÷9CªÚùh–¾?Lr»u7z¬xä§åUóøáÛ½âà æ lx|Îvír}@ªÀ!Hò,I‹ñóÉ—qó¡m›¾oÉi(X´¢ÁùŠ™ú£ÇR<^.å¯ÇEz9´RÝtÚƒêb7,€I¸©òDV%®k7éï`è|Ù‘âJo3™Àà¥ÔßBÞʰNJ3Œ …3­eG§òûò.»¶°mÌšz$l„¬DCˆ%*àHjĹ:¸¥‚*£¾‘>{‘8Ñ¢{M·©èËÚv ƒôŒù)ea]lsx ä22º¡ÜW’QæW‰¦JÌ|ySùT`ö­­Å‹h¯¢Ój©¯XÄÍ8“ .QÖûÕtș⛲©‰Å_Ž;“Ñésß{ÕÅi`Òç-á&¸|Šz%íoNÏ„aÌzØá–÷À›·ô®÷|l=‹9Yùú†Q2ª¨àZ\m>ȯ­Xy]fª1³–ëp¤· ØÊjm“¨hpÅԴ𭸡X>ð†;pý·Zœ;rEVÌÕd…x@Äoëd|zn ˆ59i5ªaoE°ù˜eóKìø&§T×Òn®úŽ–«“±nšýƒ’åÉ,¤nÛêò;?”S콘ÔIÝåd(K? ÈË6 ùÂd¢˜Á„Û,öSL¯x­°ãŽ$ûµž½Æ¢ëæPrÆõ)P#…TL"ÈÕøD>ÿÜ ÅÿíÆ=Âå3ׇéHe’ù’Ã⊄€×ª]DZüW/¨bä’T ³é0¤Á–ÊÌMÏ.íf䄚ªG¨!ï_¼ ž CwéVûb§´ƒ=ö–ÅÀ]Uë"BaJ á|º}Î-–¿±n¬œž¤ºsPwâH:ZV¼îÕ‚ï Ev%Ÿ] Å>up &ää¬8¸b‹é—"|òÅ"Fr0m Ù/9sûÞ1omXÕŠ™Q’N$óÒ½[l^7;¬Ø’®Ì›öß"¼58X3x7eS«ÓÃ[,¦’_&ø¥¥–V€ô³ßëTƒßW‰òË âFÞBúÈŸËy³[êu„|”Œ@”¹ +ãíQÖ›%ŠØ5CŠ™ÁG„xކ%6{; Å‡†RhíŠ\Vñò¸† kÚ@’$(dxo“U<&ô?u+k^`:Ÿ$¶ù[yùàõï?P¨P*çy(ª@ƒëà‚Œ˜©¿;WÓÁ\ñÖj"ꡘŒVÐÖÞ(¥šH=GÉ.WÔ¢´Wpû 5è{‡ôºN&Í‹œBìÝu hWÌÙtZ;ñ)qùÈ—T7Ì©8‡‹5¼ÌSñåä2Ñļm#`væ-çö÷ÁôX;>±7;‰Mmé ‹†ÝŽô›ŠÄ°Y³oà%X‡Ç§^Ï[®-Ž““MW›zC“"©} yޝ’«Ý;³¿*h±+N©pqòIXz^΄l’|Ë"¨MÄê>„3_i÷Š¿ ‰ºFaPÜ®1¯¡%GøêEÛ5VŠö;:SŸ8Ûiã&ˆA £ü•7ô@vm†Ýyz^ë¦áS·¶ž¶Ü"üÈ¡Þ cD.]Çâä6„÷P±k©Ö}ù¯Â.oz@?ƒÃ6Ã:¤[Yʆ˜¾øRÛÜÁŒ^)pé 8Í,eLs6)Äb=דþð½hÒš‚$³fMýÊXó`xŸ{l[˜a éÆÝÉI¿ÐK×DÎ.î ›N7ê@'ƒŒw¼dŠP«BTÁ¾½)¡¾¯rŠ¿&xH˼{kJY(ŸŒrÖR¥è·Rj [þTwp‰F:.ß(L¿áþ”öåÖkÛ0Bïø‰Å‰›Ch-(ÈÊûV•Ëê™Ô+jÿe=VªÒ@sC@N˜e„Øu¨-­LÝú0§öraõ€^5¢ÁéO¯;¬Jm¦4èj˜ IIˆåQ13ª J .é¸rªÊ$Æ?[¶òˆø¼¹óƱ?msÚ¿,”odÃx7‰‚³Òd»*ÄÊ¥%V—£*Mõe}‹6Niîó¯’@¸QÌÅÙÖåHÀÙ¬ÌýñÔʧå—Ô ˜tÔ¯dµyä‘&ÉŒ% EKÎúPœº¾2ð¤ëóA1÷ñÁ–E·`¦5òêh” Q6eLu„§›½µØœŠuˆRR!#ðÐi‰šªT(s@øH¶Kd›À¦— &kIb@ µ:¤…” ‹d"õZ¯]Ð`€*=±@\P>Éœ¤[*$"ØÎ˜ŒsÀÌÄ—![]aK ‹DD_±bE`—F†:vcƉ=RM5ið7¢g ”ËU4jiCE|d5Ù]gW××!ˆ!´7¨$–“k<`sz€ÔMq¡"¯Ý"Ž©–âäÞ$²‹ÇÄ¡7±Ø0ÌÁòï*Ù.N/¯Â*Þ(ï}F1gmœz®d0ÇŸ«Ž´p@²®Çqx¹+“ ´§"Û·j¬׿°wH°Ÿ¢&kBÒ*)^rSòœ44W‘£’IY ÐL Y)c„Q7ö+EG'»õ®ógµQá¬Ä½þi¥üÅA\¿ž|¾niHT‰R M/%’,0S=›;B9víø‰Q!ñdÇ!¸r‡†s&…²»¯ÓÞméMÒÁº¤éõÂ_s;YòæŠõ|ÕLÀZÝQÅ:ÉúË-Ï`¥O!à7µ"Ì tp¥Úiî¢ä1ümĽȴ%ãSÅ5H(ÂóbdñÈóí=m“yò§xê(Òõ*XÕ¼Jí ÷ÎØ,jßùbJ“ƒ zmàaßj”L§^¹0¡ƒ½÷¹fß™%óSÔœQ?¨8<ÚIß¡2Lijzó‰5§®ËvdëÄ7m&c± ô-Îçy±}á™îé=6Ç U‹@JÖMV+Š»¹Ð€=ôI{·dôUH`´ÛOÐ ßHc76LÉ“e<õ:5[÷:÷×VX`4òFû.{ õûˆ¦B›¨Pü²Uß0£{Žõ¦Ü^Å%ykÔϲÓX'»'ÑÑ¡ÙKõ™ ùl\õvVG´né§{öØYAˆ‰Gr·x8ìëzŸ½¾lÖ¦Ù‡²øÈž)«<¨îEGqÎ×g±%pDqÕzk2y¾½W¦y¨)ש& ìÞ‡¥‚©´™9Ù5f´]ãw³&i&p¹V0ÊáhMï]!ôpvo¼ù¥f¡Ã1Àÿ²QEÁütûz¹nø ‚*®v¢+î4ajä iÉ †@N?ÐÞb©è,ä`Ÿ¥P,¦éˆ”O]ô¼+Eá-UH3ÛÓÛÌ}§ˆ%HÓÞåEïg™Å-ÖQtmÜÕ^´%;åÏ›|©?CITã#Ð$)ùºE†æûvó¬T²±É{V”©S ³à=‰ù°JHh5ÈŒª¾!%²R¬BòX¼Bi'7ƒñ°´ÓÀè&DótyÐRþ¶P¾cÐi×I/d”°Qâ‡=r‰ár>‰æy y]*ºWÓíæëh6¨3]×7v;§iËCWvYnq*1/åE_‰ê¶zCÓ‰¥~`lû,ìZ‚´Ÿ}²ºÚý¾ðÎ…¬ÉÂÕ|˜›H¤)вF¹Ñ¦2Ï,ËŒ¢d÷®®Tä D·M6üX‚•¨½±¹µš+Â=dåêè¨ðÛ«bÎÔaT;Í÷â¢!ÞÓó~_î»íœ×¾™GÒ¤hÞ4|]Ê$ÄèW% 0¹èz0û¯áL¸§¿G6L(ˆ3âì'¨df›A§›Å4ì z‡Ì“vö¹º\6wÚC@ÚM«\jí-•Âô:%3JªÉYS ãZ'F©V¡Ñ%?Å,Ô®UC]¿ùŒæ€a÷ã?vbòe Æ„úúžúâz¬˜œñ¶ZÂËå¾³í=oêG6âg³îxáœ%¯ƒMè˜rÇ›­ÑJ”Ñ0TÎc8‚¢9zî·9ðLrıìð\›³XžÔz¨iÀwJšéݯÜpaÖ(ߪ®òVƒ˜,E+ÌÑŠd}3›ñãÝîõÉÎÀ \f=D9§KÂT)å•bè™sn| ;ãÖš‡äר˜‚Û“î3"A¹Èh³É­·‹ý~ÍitNÒ=‚Eä†t:èÌ=N¦ Æú†…Æ•XæŠÇëjGê¡£4wÜןÕÄ×Ù-<ÁéÓaúW'À»i¢ÕZ Xífñ`G|œßä yns«öæ]XD8ð$ÏÁV ]{z·ÛékàöVuy[Êóq %"µž¦Ä¡*½›êÏ‹w•‡5Ö…:¨K Ÿ‰üÈ,æksª`÷É ™ìµ“N§ö>U­YÛð¿Å%SJIðèÐêà8^S¼á}pXXA51wM¡%#j¢Ø0(yµªï‹ ÉÂòõØWÌñ€¿$M°¾ßƒÕmݦ&ãäêAƒGÔb5™ñÕ|YJEˆ¶ L?´¯ÄÙQQ†Óu·ÓLØòÁIìôhSõ뇾¶˜ÞË­WXN#·óL¬ÀŒg€$¹jÆ»ÅBÆÔ)ž‡¢œj󗕸ˆeBûßvZѵ|ô4¢¢ >J ¾MèpUØ`=·ÝšNÖ‰¯îœÚù\0“C³ãGÝÅöj{霤Ãõ@wâ³µgûõ"ä.÷<³MôNSÒ'8’èycX°ñû¾¾\ÁÚyÀ—lÖ°ØNš5Ôª„ˆ¼8–{mlú0vM¥¾lÆ:Èú£q4ÌHÈÉRBå&“®Grðà ؿ"û^i7²&Ôþõ ýŸ3"ýÌ ô§1ªR’¿2§102ÿzÃÉãl­£gf`ÿ«ÊErØÜN‚k¢ÏE¢Â$E+e-``l"êjk à*­¨çj¦Ç¦OÂÃýx—ÎcÅTÎ:ÖT†ÏÏ€ìž@¥\øO¹þñŸ 8³;[X[<6×ÙÂÜÒŽÝ™‹äùöÇߟ.Óà>±7ã"Q•’Å}˜™ØãÒS³QÓQÑ1PâÚêXßðDΩ½ÊV­ªS»öá÷ÒÓÓS?ëmS3è°132Òëë3êÿRí¯šù7õ=]xªñÉO¯8äìm Œì¹IE夢¦6Ž?³%žÜÁNJûonÕ“ã¿UOú³¸žl8¤m ݄͌ôxèèY¨éةؕè9˜8˜Y)é8èè¸hc ó=«à÷GÿLÖ_Yþ*«½ÒSHð˜ØÛÿvAOÃÀ@Ãø«l?[qÑþÆ;ÿnéÙJKÿ}YY=‡ô³‡Ó3nC\è¿RÕ¿{Œ þÒ`['{Ëï³ÃЀÖÈÒè¹mO¦j±¡‡±½•ÞS z¶?q§Ÿ*~ŽÎ§xºèhæhiÄó½aü–Ž?½°4{®‚ÃRÏÚ„›Ô•ÚÐÈXÏÉÒ‘”GÙú»µáO£aiöó°|ÏGûײ~g¬hžÛÏ/ÿ²rðü3Œ«êçßWÐ_—˧¥—›Ôåy1üq9þëjü˼&û½iMCû=ˆŸ|ðýdBÏ3…Žýi‰fø>IHéèHŸÌžf×?°øy6ýÞ|!ÿ‹Ø›«½‘1̳‚ Ý_~,ÌÌŒÌcÀÏiLŒ¬Oø~Åúç4&VÆß¤=Ùѱü6‘é·ittÏ"r¿±£ccý¡¼§Š›ÆÌÌFÿ›4zf6&ºìè™›FOÇÎúƒ ÓoûFÇòäÇÛò¬¶ô›4fºÓè™~è/#=ë~aaú±<–ÛÇÌþCËiôôŒ?øŠž…‘î‡1b~ÊýCyôL¿Mc``ûµÿ¾aì¿Ë*š¹=Å €Váïü]û@+nml`øI‚P\ É%Â$ÈÄÎ.ÄÈÎÊÏÈ* ÀÂÈÈÎÎ"ÈÀ*Ä."ÈÏÎDÇó-´a¾ë¶êÙ;~R¦§˜ƒ!&–ù„åÿwü‡§õêßÂ}ùçø/Ì Œ¬t¿â¿0<óßžØÿð_þïð_ÒÕ¿ÙÏ5b¶^*¾~Ï:€ $þÖª€QGtÆÕ¢_]ÒÚä˶¡)Lì´\ž€ÂdñðˆW|›/ôXìþöa(Èâ!û&èÇW(k}¼ƒ‹½+Ñ—8e%°e´mº/Î_0{kž­‚ œwï||Q" Œ¤aI eg÷É«–M‹-ñòëõÔµãÅrxg[ĈôÒçu»Ú«)pb8ÑÄ Úw¶èToyNódÂ[ìÚ¢kF^ˆ°]@ÞF<4]]ë¯èK,}Û#€ûà+RsnocâL>ì°.±bÀ«#µéLá}˜–Ms¡EPüÅŽ¼¸"¡'qëã‡ì.S9xØhð Ž×"ì~×’!›­NñåæÇ¡žáŠÍIŽ&±2yR.o±S¢9ZðI­¨OÃd„1¯(Z®KNälœª®–G‹¢9«P)ϸÂlQÝØ…›…tÓðÝmÞH¯Py„ÅÙèŠè¦m"ÙMã[¿e6;ÅÜÈFè|ÅÆ¡óÁú‡E]¬þ"L‰»¯^¦á­‰ïÎ0¢(0±1¼Å$Ÿˆ;‘$¿ª\ÓÂfR¸óç`ëWa ú,ö,fÕüï§M€œÔÉWÖ‘¬V2œ€¹.sQ&¹RíMõ9˜dBpÊÂì±§˜ãEÒˆ„›¤N™‹aÕ%v^l%¹Aϲ¼ÖXkp6’ÇYír-DY¼þ"²%0®œ¬BF^ÿî$, YªB®“©² ÃÞ Û4n… ¥¿j–Ï=Þ,&Á Â(5ª “)Îh•å£÷ne±¬L A¿CÖšEêÞ1ÞxHÑ%çy|òØè@êο½á»¹£Àù¯Ëþ¯Kù¾q Q´.$¾ÈJ@k²¢blãgûº¯BeôÅDÔ«®\A6Èalå[ãKz4ã&åÝx§ñ/¥Êc@ÔÆ¾%Þ*p‹`¦ÉbÂúÑ›VŒàë¿<% ÚÇšAç&,6Ij Ö>ÀÊ.®sG¸Èt•C>åàž îÍ/Ü9^¹ºÀT#þÄeJCˆD4Þcû. ù+Ôôk^õÆð¬ÎÚU!Ìum_Á²~EeÁ=…­euKéLõ˜¥·´Ÿu+£ÎÈë Ùk¦üã<ôˆgÕÜúË>Ôuýx…±.Å“AN¯·É¶^{½”Á'Aíëhèׄ×3ÛAO•jfóL–aòø´ F7ãøÆ:Gí¸éÅäØN¾y&ˆPαvvKáSE5± dX)-„í›rÅŠRÂØ ZÌ–Ž-kpކ`>ÑK[Ä23(®Ñ:Ð÷@“ôp!mJå½¾ƒVz`æ=È^%QŽYF!’~ óÐ2aT”"¨/¡å´|Þ@¸ð Ÿd#§ÐQ¤¨qˆÊ"ªª~½nÉDxµ®t¹µ„å©»¢'Ûß4±w]ÈšþÀ–ã¾å@Ã{—ü‚ëMÒB4öÄáG­}ýiR˜Ù…‰ʨSŽ!03 ü(ާ½¹5~~l=nŒ+o–€à÷Ãr¢ÂpxÝ¥œÈ}J¦œ­ò> O vg•úÈ…µLW°žt‹x[ù$è] àAúA8Ó«¡ª¦@ù_œ÷×ÑÀ´æÏ[ØcN¥©ÎÕûðbqb “¤…ïÎmë\qŒÅKW…îˆQÐC–é‡n8Órî"(c-z¿g|!Ä)ÿ<ÏAŒtècsêàA>þÆWDZKÓì»R´Ð1fY a/¡ÅÙ.8>¤/d8\«XÂ’¿ÿæ7ì™ÌIÏPv>G² zȽ¹cïÌÜÚä6XWþ±8)ßÄö5òfhOuý4°C÷Š3„Oö©m>DÄ©ö‹ªzh™Þ{Ý#úa¾í9˜ˆé|½”…À4ÈÈÚ¨œÍ©üà8Ý'Ãè7û$s¢Ä«l¾ôÁ¢z¤œpÛÝb|›ÐØyˆ[%p K“'f‡îÝÈÎöW|%¯!ÊÉv‹³¡!¤Ë¬·¸Ô€ÍY¸,99à&Qº$ï_à—5‰¾ÄÜÙ]S*X%±Ò&œy)G€Öº2¸ú‰Qí4•-n̰B´Œ–ÏŽ¼ACûq§ tÏðØÐ{³¥¶"«ÃúeIPy×Q! tñÝë3µÖzp›þWˆ Ò|½­ f#ÈÀ6F^žÎ2–çÑ5”c8 p ²Tv™)rñgV£iÔnÒ²I¯¦Î_‡ âŒE9oìôOé\ }Ñq1 ®pŠu›(é˜qûJê…`S÷MLí5‰4î£æqr„Ðq+¯¾+Sn¼”Aúºò¬¡/ÃûãY;V[»3ƒðî쎧|ërjH!TÌãÖ;Õ€@7D¨ë`.zAåÞÃc÷O±¾Ô/±}î]ØO°!®¶w÷v¾žíØ-9x0²‰Á½Ž›#\'°ÖP_ü¢¡Z¦;UÓïÏpIœêõ7ÑŒ|Ue”²á-GZ’páe… ÁÜ /àPÀþ¼—õÁêØiÌWF^kƹ ù˜d ζ»Œ€s âc(%ŸìHI'‡ïÁ‘fe’?Ð¹×æ!¾¨^gGâk§hR-¨£T&mtäl»¹3ë‰äÚŒ c5¤ïKº;‹Ó 'Æ^×92ÍGlï.b!ࢡò¶˜œ"ðÝ£:ÐO¨îßK¶Ð#ãi~"jþà"`7²±šÿ6aõH¦òíL RÂs„}”àÇÇÈ.ÐmƒP €V’ BŽ· â)Æv„;‹ÐV+Q¾½¥îMRc{ÄkÒ­} µ$Q×é…-·”¼t#‚3¦·2Du'c@)#ŽËûkFɶ@>FïNÞ8¤n8¸©ûM)¾TŽ Úe!¨â„Ãÿˆöj‡Uç“Ðän[Sþ ª=«lýCüŠË6ÓŒ3b>¯øvö·QnRü^ù|¶ zÖ­€JŽ]ÎÇ0› — OѽM£žÃ–S¢"¨EXYOñÈùvé·3»Xt¹0虺óè•*4÷J³±!®“&&÷½m˜kßDƒî«)Nè›[u²vµ?HÐ$áëfvèå/|CWD7‹§ëˆ©¾ž¿©Ô Ɉ¢`l°Sîî5Ö Å2pB`Ó>´pŠk|i7…ÔKB[­ï…nß|Á-ŠHÄ@/d^MöYÿ¾%8'áå”çv|òEèYsãøÃââÈ*í^ØYþ¯@'þ9¤Ã_Xôÿ ËîËá÷È *JÒrêjš¼ÀÎú+EwzÖ¿þ˜rðWýó_RM:øYýüoIBºþwIrêÊÿM¤_ó~T®ÿ5màw5ÖYÿòï?Mx~õ{¼Ö_|úâÀ7ðKúÏjõóêQÝÿ·!4¤Ääÿ› ˆø6@óû˜_ãžó —á¯CH÷dà—¡øEÞÿoQ¿¸ôPtÿÿ üÄêùÃÎþï”ü[д†þŒ`dyþµÕŸgò_ÑŒ È`ÿÛßxeø£ßx¥cûçÙ%˜|—q³ø‹›ÝÏ´§_ÿ¦èO@£ß5ýó¿)ÊÀÌ@ÿk4À;7%EU¼/ºpÐæé)aƒ¹%eýj‰Ö“˜hòí|ü¨yoÁ@ôd¡ g¦R_ð]õࣽ•F).+Ó€^mt„Øw4æøš±í5t>0Й‘‘ì°Ñrù…órÁåðÐåpóöV ½(wÔt˜$ÄLØ"‡¸H_þƳ†!B„F—¯MH´_~Ã`yÕBM 2Ü_ã-H™$Á£*Ý{„L®•dœåp"Fñ²ÍÁ¢ËR™r‰ÊcƒÑýÜ.KPA¯÷6t4*j(ƒ}çbOøJËyiŸxzàa¿ø üæº×‹6RÏL€ … 5Ü#{Þ#¾žš˜µ¿^ŒPJÊ;šƆaÕÝì/Ñûõn+]©€ç¢‰õ‘¦©çB÷;r*M-Yë!ÃÛ]_†÷aÂvpM/š^×Ò¢ãhÑIDçóÂôAa™´|Þ2¦ðËDdY^ƶô"Îfí¸Œ § øjö%ݨ”¿ŠFÿËḩp9£’’ +ÿÌü›Düq;÷Í«.§#*l?ú€£y#]åÖê— ÅcSF‚9>R#¡èI2ÎðǦ¼Ô•òòÐ;cú´KÁl_G¯™(ìÁB¹ZÆ‘µ^i~U†"XÖ&ÊڨĆ…ß4*jÑ z¹uDƒ9Ìr•¢ÔÛo77ÂÀY¤‹¹:š-HKlšâÙõzüÁƒ¶µS£f¸Þdï‰;7qØ‹ƒM <à«/3Ü«ºNƒ‘ Dî¤ÃÎ@i)8F,џŃ¦–Ù^c–ø{BWK&ƒ¨+Ç}=¨ND±…u ®Š,’Ò«4’0:7Ó#ƒóòY©x5ŒÓv²>B~ÕS…ž®šO~6J¢áŸ‹Ok9{"|(œ3å²G “ç¶Cèc‚î1a‘‰âû)ôóÐõ9û'Éò“1Àf`¸­‡àâˆÔeþE9„pßຆlÑ—5pWA€ÜÊ`Üù)LÈø¸R†_jÌ'ÏðW9R‘rþ÷4‰ß@m½#UtÞË~Ý|q˜ãgþÀP1/ZnCstgkakŒÙ¿€°h(9Êáþ¾`A[<ÊW¤f* ¦+hÕé]På­" £I¤ t{elí*é}ÛÁ±Lû†„5w\Ý<¢®1Y²{B{i^”òîÛDEow¥¨ØÊµNyõ¶Ü{è®ä¼ ¸·á!5ˆ_Âo?*Ú'~¢$»sñ¨ˆåœIMÂåMÿ¼‡Ó0a´¡‘ŒþSŠäÕãR(¡Wö³Öúü•ò‘ ª\×Noò«sòÙ ÙúÇmІRB·è%`6ƒnzH  zÈÍ——ɧyø/ [ 6—'çúÕ {µ`æïå‹`´üg´×!>¹„7‚’¾ÔL¶3Mç·3ÅÂÒê•äHBSpœ¸Ðð0Úr1|Û¤KÂÔ…ÅV¼Äƒ ¤üÞ^² á¥Ï‚Rá jÖ”€Ñœ:_,ö:7ëšP[¤D':ìQ4ù1ŒîÈ|íÎAéÅÇÓêÄù%D³&È8›AÉ¢U 0þ£¯{Íꀦ°¿¡-¼daE¢øÐ)ofôù%ú Á}‘Ö"Ò§l[ÍhýÑϸ_˸ø|Içìs‹–fÄÇñ÷5«ÅšËÁd©/nÁ<·–/éŒeDñšânpä‘\ÏCÁ¾™I¸gPœöAí½ÍÏ•è¨S”'i\sÑNöl>¨ä}—.­Á}x|¬Å ½,ûÙAËçR žOHû6*Ä7´ë(Ufö˜d Ñïů?ÄêÛB-ÏÄàì>¬ój±3UV'xä5gá/; ZÕ!@V²7%LÔ›ûÔ<<}X\´®dJné"‹;—e {£/¨a, ,ÖŽ²2Æb#ÁîU×ýMm±«ÌŠË£tôí$ïRêZÉž¢´0¹À9’: SʈÙíQCœK9Ò£'F›óâC·3²sÑ„¬ÕEåo¶ùz[7“œðÇ w,oÎ.Lkõ‰1‚ÞŠ“\ê -¾Ì-*˜X°´"†,$kÚ)Q7ŠWPà§å-*Ø+ÀoÓv¨>Œ«ª¨ÐÝvÊR±¢% ŸÕjÆ€P²Ìú¬Î vqúÍjÑó¤Ö9ò-¯«Y¦Ô×l„•=˜Ñ¬‰¾u‰²(…жÅýbV$„†¯«G\ ‚ÔQhö¡ìߺ¬KXæ ù,TR ÅMU ÓL€´Ôhwqx¾¹ÙÄ–H§›Äë‹s[¯]5 ò˜3“ \©&°;ÆÞr’û0êG!K¤U£Üñ¦šÇHx,K4R-áÛ­œ‡@áUâ2ú38“jÝ?(ä*•0Ù’'ã™Û)º:–}á‰<¾»Ÿ¯ÒD › ;'õ9­Í.#^›†—»s¶ÏbÅA-%IÆÆNT ßÔ ·s¸ù³djR¾ ¶VßÂ}† )xãäZù1›E6t^º3çTÐnÏc—R‰×KÜÚ4KE,¹Â¢YS`TXØÊ\ìA±ŸÔ\¾è–Û%r¡ópï ·É"q^±Åpì";irR*rnÚ¡ÔÁ1paÇâ/(¨¤–T±”Cµ‹ë* YàÐô†v=Æëµ“¸ «Õgv1ÖÀárªÚD«;< œS³vÂôA*„‚AJõË2.ãð6iÍ>žÎ¿ULlÖQÌV,Úrãq +"¿‚«A,?Nÿ(Ã Š TQ>^$­RW°D°Q(|~–«XbŠ‹·ýp2¥Ý®FhCôj÷uJ¦›þò^ŽqÁWáVkÕõ•î—ø=ÙÀßþ±äß¿%ÿ«X2€ý™ÃÈÆò»bÉ,O,™á¿G,YòWrÉò¿Lþ;ò1Æ£ó+™ë¿U†ùç•#÷ò7JÊô¿=*býSJÊll£¤¬ö´sŸjæ}VRΓX(òa9樋š˜Õžtã¡8} eàCG@GÄID&€c '³åÛ•Ûlš-nE¸\ÐÙ?¯›šk›ójL½œœƒ^X.kXÀ·I/MH3;´¹òúxx(Ü(õ¬óïÏ6:6hÖ¡öeĘ$<™9Ô-^îjq#ÊÊüÀré€.ü{¯T°Ûá'«¯Ï2/ÛY¶’ÍLŠoß&1ßúƒò·ÃbÐêœ SâSëï™n/,`‘"å éøx¯uAS\Q¨¹'É™á7#—/ª¹ÿ:9p‘ÚJJ£ò6ýä£Í °ãã÷ãƒfÙšc Öýó4³1ë©­Œ¤æ.µ™LƲ¥Þó W>Ÿºím÷½ºžõþáï¨Â“¸/tvøuÂØ q¾uš©Ë‚Çœ¥.ؽm}ÍQ`âOlZ%E@F ¸‚FìçÒk‡9«+Ð-+¶¼ÓžŠþyb) ܤCÝòýWR¥©”70 'ê=Mu¯AVÜG¨ÆÊ™È˜äQ±ˆ&ä»ÃĈud¬_¡8U»ÛFø(OŒ+i¦Z}6æ;gÉÃ_z^•¸NÌé}Ê-r«¾©ùU}d!ÃËòBCë¯ÔÒu÷.ÃD‡[ëuIõ>¯“×¾®…äUvÎ|F#(Á^ᬜêm9ÐÓÛ+3lˆp{ôË[òë°"Ži’¼è›rŒ²-`£¦§æZo‰ô9‰ÃÚ÷Tz€‘éÂD 6fd¿î!fÑ‹ òC®®(wG-ç"æ;¬?±¤s¼£øâýI¹n¨ÃÝ—&jz È*I+ Ͼ֫òÃlÖ@Å:³Ñ8¥ðÄÔìO²"N*"ù5¤G°ý^BÙx,£”—&Éݨh"z¯q·ÛùZ6t«îÁê?ΘñFu-î'Ú8ÜT°Øç«˜+¥»LŸ›œW±¡Øw¹Ò¬ˆÅ„óU¾(Þ«¼¸L´Oç²0¶zßmÞ.’Ù-âqF×ÿA=·C·rùòˆ~Ó0.œ8ŸAÍ-¡#Å2JŽÒe_»Õp÷…ìaüB §¯ÈðÊ9¾µg9?W¹,-Ÿµ k‹?¡¸¹´æ¨¶TλÑ}ýÒeþÈÅ1¯Á¯¸à›sK™4MýIéŠFyìÉK‹XÇè&—š %6Äê/0z´‘o{Ý4¬cUq²6b²Íf8/…Xgã\å72@ØýFUí¸t}¢mAXén½§oÊO—™ªWÞ”gdœøÐÂvèî•BF•¦›l!.ÏJÉ|*¨Búp©ˆ™»…·ÍúÒaw#tˆôžK¾ŒF÷hË×uø{O×b’’IQµpµd~ä‚uO‰bæû$%‡Ïæmå¹–[!-êÆ½PÙ•Ôö/ùUÒª’l8¸Ðb¦$èÉqÅ•ñ¯ÑWóxêbæŠíwÇMÈ’à×ÉR•7zÓ¶ßøÊÛ•/¹vŸy /]Ðãú;*–"À)U1…s)Ç[’ “†¯ù„ Ú`­wnö ¾*k”ð-A>YýJ°y1žÙÔ5'09ç8ULf}“@1hÁÕÕwyY¹P7^"š~V—r¨ü:W7¼‡å€-!ÕÒ è‚y  ÞÛa'thb¡\' 4º&nÒu®8?’³‹Ó€,ná÷Š\x?áGÉ/XPFŸÑz¯º^›²¸ñr+hOÇ §ÑïØº»˜Ãia(0ù\;#Ý–Æ1˜1ñ,¹½µª|TXx}‰üˆFkÀSMšçSØ<’‡âÖÆúh(Ê>u+‰––±ŽtÞ¹ä‡k²èÛ}‹Ï:èÈMÄx±D†"ïCâøPë\ØVnõú·iݘ³c?!pìÞBØJ ÜÒŒl „â`„5¶>v|úd@¹˜ì…~f›×Ú!Θx¾EÕyìç±Ô–[Ï‹i[Ú#Ú'† ¨“¬@&BtäggØÝê~ª-úÚƒýHfî$¦³Œ°.ô°˜u@:gi Ùg9P¬ÔÄJŸ@T”^¦‰W†‚ =౩¶øšË3[ëôe"ÅçxÉÈL±‹øQ<)ÞX®˜Þž ‹ÁŒ¬>$¸2á‘›¨BÇë—¦ . ;S4B¹êäoÞŒbj“’^9øq}yÿIŠ#2®–ŸÊ`år³RɧÖúí°PÚbR„lÝt"ohÏ®Ñt"´ZjOƒãN%Ÿ†šÊÖgã±R–5 7»zZ˜£Y—°a ¸…O†Lµ*㪮÷”4ŸFbƒLIiìýÃÔ?iÊ[Ò)EŠôO)àæqTSùDDT>¬Á¶âÖ ¢gÔ5m_ªÚ¯®áŒË'½‡µføÊ©. ˆ¤ºN " /ÎÎüP•"Ý'ÀýQ!Â1þÖË3«.ÿñd(®äíp‡›)BÊù‡î£ôàMÎm=§Ws*¢ÚI÷ M,î‘9"NÑúõúoè'8OaÅPð"ý’MUóìÞ%E]uÅì©/‹ˆ–IVH¦Œ_’“ヒ¡ ây­Ó•[ìUÝA5ë¾6pzm »ê„‡Ñî™f¦uÝ)5À-ïNàå£O”÷DúȯŽ$’k8n+áÅf̧ÿ Dz~Ø¿ûcÚ>K&Þò!Ið®%íªb“¾í:B.m[¿¸|¹Éz U3Xàp½$†G³´S”u]!•Ú§™d§ ÌyGªo ViÒc"çÚaËqI>ÎÑ.MõŒˆlKÚßê°öœ[BZ j×|öQ9Ds¦°TQ©W˜|?ßÅx»R! $ZQ:¿_Å›÷‚+ß2¤wÈ‚Äõ`Æ_á3÷¿*Ì“œQt†µPéµ9 øwÛA}[%ª¨J+à0:O*™ýeUQ›¶âT^KÔby-èák¨Þ‹¢Y8œ Ï|\ã.I¼ÔÝXš‚¹dLøø1d C‚§¯Á&±O s¯@ßVȼ'°ƒ—n8Ldëé~Tu…"ÑñÅ;±›úä53‡àÏYå™ÞmíŠQ?ËÆÉt¢q£ãf­ ^ðV7%%šeœb=¿86–0ƒðc)T¹ž…ŠlfÙùt~J‰K`HΘ;ˆœšð~x‹O†íxŒ½›&óèåcnâ9ìEfÇðôàa)ËPÐΊùÄê¼°€tôäÂQcÿÚÕ;¿r|Q ×­ú‡’ZšúØÌm‘J·kBñïü •cÂüˆ¨›»µæNµe×pxÝ<ÝYh%ÓJç!ÈDÍ‚\è‡(8¸=tJƒyŽ´·ŽöáÊiãz¯FL×ðèEß+²¶p¦•d‚±Úö´0V\Y;=›f{£•7UMfýˆgd/!;2%n‹¥uïy¶øq†•­Ào³@½¬·l!«×ÔºˆYÄWn>üã<×ãíCÇ«m\σVøU-+7q=H /œý%LΔëyâDgbŠwÁýù¡Áˆ’Ñmž3®üÒ¦«=IǙ丒|Dé¥dr¡ü/CL¥vb˜Ð'6ñ<æ'ç˜Ø<¯Ý/H©bíŒ1²è<©ø`å×DÓ-hnŽe\Âñó4_YäS«o^z“Þá6ÂAÀ!ΑÙˆN2¯m…¢—{xw…6ÝæÀz른yÅ,že‡_Óé1i×-‡•y xô¦‡0í™K(2ñQW0QžYe÷#œ¼poÓÝþ ´G(™ö£ÀÝi Cwa\˜Ào:‰)‘ûe¸V(¯¡VõŽÑÖú]è¾Å'ÃPÔ³eÍ–’Ù 2b_¿{¿ôÀ‚¼»×_NÁØ–ì&Ú:”7±k±CY%vßFkž¡Ë¯eÀûеÈ0Ë"ŸÆR\kÅ †ß÷Îr§jn¶Ã}D”ÞAv¿;(§ƒEC'ûvŸØƒÐJq82Tᇸ=AîoβXû„µÒðÒ‘Ã7·uõSÛµ#»qàÁ‹ íDBÂ&Ò´Rý›v4å¢é·ZASêÍó.Žm`2¿LñW6f‡DúkÈEõºÛÛ(šÖú+N¨Ñ‚R7PÈn\ã‚Üágv˜éŠrí®äº]òî×û*.¨BÜX# Š!G¸ƒM~‹Ï=ÔÓ¯°‡ì-íH¸Eî`‡½Êö˜™±e´Ïå`3¹Ãñà—+]Ž‹ÃèÈÉ W°SxÌ¡P'¯Sû™†7N&ž-ŸXqÛÔãX=핼QÂz³½U¨ ŽÁdBîvÏ×põpg“˜oŠå$CÐqÓžE#£‹F, RºÅ¯P 4-+Þªú‹éB…µ®ƒ÷9fÔ¸¡IÖÁ¼‚ñ3®À÷¶¶j4ÏÂé\%Ÿ¶eo10‰Þwç,硪Ûð)Cå̹¾u4€Ç$f±"òPâ¥ìàYÖö”Åj`BÀ¹ øuO &¾›Ê»lŸZªwª´i¬8voÇÎÛ Œ»–8#TsÁà /ªóyv~mÃMQ£„rèH¬“ò L‡Ú¢#‹ iS§¨è%F±’;”´ bëQÏ¥‡’1‰Íˆ‚îWUù¢"P’ॻ².m­²Z\Ÿæc³¤îùí"Æ(¬J¦–nGø1Þ·«ŠËXÆZ»aÞïr˜¦˜ÙöHÍÞ£¾oæéž:šRˆM›Œ’¶Ð¢öz­—dÉÒÂv¹ŸOþp–k»ñ–Tmô¦·7RPs¿ª´Á~‘^Þ"Šû\¢ø ÂöÝvÁ…ä;Í]Õûñ9§%ã9R A݃íJ|׋{º< 3°E“6¶;ºÃÇI%,7‚Ñwz‘\+6oP[2ñÈ¢PÀº8’\-yt âB >”‰|{¯dqCâ߄ɤP–\aéf–”ˆT@%#F=é^TB×\—UV[.¬ ¿Sd-î`n.#£Q^Þß[Óe¶žòÒ¨IµE¹ã<ÜãÄ‚($&(V´ÿZÐh£E¡nŒ’XT½ìýE8òX);.ºSAÂ⤠ÝYj‚{Q§²02¿žŒ}O.˜ô ®hé hÄú„0zÆ•™WrkñXÉ«Å,K‰]vC KH¥àîÙÑWE°“ÇNàÍ`ŒQ1õ]„ýÜËÕšŒ1ºÙeLŽ­v7®"ߢ0¡Ù’Ò<ß~© ÂEBPÙñ}û%r|i™±f2‹,B2l'B³\bªzÏ–;<.ßQHKëj9šTö3”oã*òz^Ÿ¾»'¸™æ”øû oøî°ó2‹7CRÿ5FkØW “ƶ¶KèM¨çoŸÄ…Õ’ªØqÙ’?œCÊФ,s˜ô#Ú¤_Rã‚dÛìÚÎSV_À×¢òêZuíº‰¥$ÂØ6“.ÄӔɔL(OšÖ8×dK/jä–Œ7ËN4z¼èò8JüóúØð–õ±Ù~O›íoõ±ÙþMúØ{Ð)ñóA§Ü¯4²!ÂYÚXÿ<¶™³Ñ³F¶Éoe±£ˆýÏÉ`ÿ¤}meöS…Zõšþ·_„cûSª×tŒì¿V½Vƒ~>å¡ßH[B‹ ÑG±À}½6ǵæ{!Gb”±ù–ý-Xl:0°Ôiá€ÿ—lÙ$‡&Úy}ý‚ÌT}É­-ëa™‹ŸWÅeëܹO·_šÃÅÃå¥÷ãÓ½×_^ÃAäèZêÞd®um>ž’¹@0;À³ dåy—c]ú†JÑÙY~Àd/Ÿ&§{¤ntbølHÇFj-!Ó+Õ›t¾À“és‰Auu4,ûŽZ½ÙSEhÈ[7y3;Éï^TÅPÀ^BßPáóÁtWÈÀ™znêðlú}¿Å;YCGc×Ùºít–ûAykÒäE©_ëól§ß5q[ˆ:7:(7Gh–—¿ÅÈ/ŒÒóTµ½9¾EFåQ¿_½tÂßÁ Ñ®vœ¥4.;ùT937€ê¿ß½¡Ï3Í5€‘}­w¨w[yIï½J¤é³ÿ…EßwšÄ’=ÀM?¼òµ%cýË9?«îwús•ûÓ¢Ó–ìõ §<Ÿõ>T)'q² `3¿^­²D~ÐôÚFo·Š<‰r#Hºû½\Døà§ÉQ[ƒ*±=<–N† nö VcªÓ“ibH5luO8<ÿ©«Pº+hП›¢ã"?°¼Ù¼š…V$u•m¤·ëZíÂ' l¤r6sµ¸Ðì赑J‡+è’)r8wòÚaùFÝiõiÿf¼W‘Zñ°RpfÛ’ñƒ5–ÅlY÷×믒‰ƶ'ÙíFl0lKx;¸ÓcqõåÔ ¹Ï1I±EƒE 9G¹’ÉÔ:Ñ>eI²}h,š–ÓPëÀ÷YU‰º¤"“¡ÏÆÈƒ>½«ËJ E"¯­&Æ&ÅR§Q¶•Ûsˆ¨ÊÚ|Q£Qµê !mJº,¯¤&}ŒÄ—Q(==$`,…ªÄ¶¬Ç‰¤DF;™ÐC8¦8» ò‡îH×t‹†Êç!#U9 ] %ôW65ÌÆé娥N„@{&b®þ*w[í«Ž%¥Íx%;yq0¸|äüv€oþQ@ñzÌðb$|Ë* ØRÓ›­¸ž3<ÓSÃÖSüÁkiÇ*£ÿH_œ÷\’ÕŸÖáe.Èt]\B`IµPµå[Ø.;=9·¬k # È;is{2îÕB€s®T½Ž´þLJnó/;mT´K[Ýa:ŸÏ¢¥wkŸòZ«×}¸ˆjjOÒgš¤Í Çy‚sHp²yŒ‚ÇI5Fa?¼ I2¥I9¹®VÅžÀ?Ü|å3ºá©µžßÕ¦Ÿ/þUT¡ª)ª‰ÛÈÿ̳ˆ•‘Tæ2_ó†6ö]ŽFþŽc“®³È é›ü)‡‰YùqÇ_-HÎaÞôÉ|ö_„<4ïE½ÓöWlƒZ"ÔS$¤<Xd±&zÆ”¿5E’êt1xÈæŒ ÿL@®)2¹ ~¤=)– ô1—æÝ+{̈e¬ËzH±¿­ïð6–Úúëy|}t Î6iZŠ -B=’ÑYꪞ•iW#ýÔf°·u'Ÿ_©GMå HóßÙ@×-ð2jìPg}U7¯Ü V7A <‰ñ+TÒ±Oa0y˜ŠË‘–Ꙃ"Æsìqdy‰åD”výÐ’<ò¦ôm…âWaϼX5“·ñæ‡oé ‡ˆ3Lû‰º3G°íÐ& ër>Ÿ+oÙYpHç¥Apâ· Æ®s9ùbúÐÒЙ ¾µ”ýD²8)8ìw±:[Ýÿ•„•‰Çíñ]ÒÐ&’†‚_j©·aÃ=‹\i‘‚â„\æ¡­·ëþJY¦¨sÃ)’3w“”$V#75<(FÊê»I6vŠí÷okÒRÎAØ^< ‰làÜeϦèŠæD‡^q“cö]¿þ ËܶÇÛ¾ËkW·L†(Ñ›×§°ëÇìŠal´R¼‡c†.C_@ÖõfGÀáÈcPTïµ”÷pðѳ1ÆÎxi­þ€9ù†²~Vd ¼žLFEÓÅl]ñaÏímW–Jƒ‹‘¾e¬\¹R‘©Œ#–—ÿÐ ej'MúV)·WiÑû0{F`V‰yÛHÄü-1+«÷•ßگSÔÙáë•Vvà »gçˆ"|6åÒsµ® †pꔽµ²[ ¿á–œû†– Qƒ¬øöXbx9ïwúLß‹ªÚ©, ÷M,£nR JIxÆ–}ö?“¨q~°˜k$°bÎ_+&âcX'D(Û+õ–äÄönT‡Ç3`C<„_ºHC*G@ðøÞ…£¹ ËÕË«T9@ÞalÔšS¹7ÿñè%$(rE:ü’!ñAvb¼ùÇ«©EJò7æY«œä€Œ"«0^CÃt©6{¥~bóHþü±%¶—6Ô•”>@dLažÝ…IŒJùàùŸ:ÀÑXS}ksïõs à|QäYE+ÈàÝÎƲ&7±™!äÀ¤ˆ/ØÐÖ™¾Q10c§u½sTx‡lô/Ï íį”oò.­ŽÌq Š1Ê—PÚà –%¡7”0‘p•]Ñn‚/8"Oã ê>i qd8•þĺíÓÝ%Ÿ¯ ÀW*W@#l––@'ÈD¶ìgžj6"ŒMAÂq¾åEâ+._î°àŸ­‰¦Ö”ÕglÍ8æb…‚ÂŒU“ãÎë(꽉Jš”/œõ")<Ûô^Õ^‡°‰[¡‚¸U£¯™ñ¡«h‹•c‹ £OÓ®}“°»È‰ûµí2‰FËürÓ2[è=:(ƒ úìp00[™5ò”q}°²;¨ýr "¢oov–B´N^³ù˜½ 3©'hrç^üÖõt­i"-£&2ìÊÖÅbëØ¢¢Ó ÌpY×ÇJÂ_îÉ )¬wóh³»k9H‹×Õ«™Ä%tбÑÇ‘öÞ¤8S‚mvÐø3˜•FX\¦_PøœÕxS`.2:BàÊ8Êq©QP±J`Ä|¤Þ%¿ËRéµÏ›qëÆ±“¶ýLf*ÿ˜²2•y×´!”Zˆ‘,®Ç5pÃöEò+Ô¾Fò—Cu(â'ÈŠòâfhHž»Ä)FJÛ|½àì}wlƒ¦zµ (åôm/ýf¼ :;3«'nlí$€ÉYÉ£‰ ÃE^ƒF³³¦ñ*ˆÁus¥MÙÂybÈè\~»ûæaRãö`ðbN–u’L¹e2`§ì5JhR;'7ˆ@ñ®¨¦<ÆyM'ù¬íˆxsýÇ=|«.»Æ˜„ ü$ÜwaÓ×k,že<ÃYV¤EBÞykÙvãÌDðòª¦ Äœ°Ýé4ñÕZòm*ÊYkÞ>)/€Ã•ò¯óeD”§¥½Ü±2  å3uiXa ¢jÓVPÓëåF_ª¡ƒwñÅWi&dú‘ÅLûòϹ¾Ä 3hÄÂ-Äw?°Û" q)Ðî &.c±(óÝ5œ¶ ›è*ôø”gÜI¼·48ºÍ㣵wŽFô†Ûe×Î#”«¯¶‰Tª¸¡­¸zãn£=ÿ¶&÷Õ•ov¯f»9r>µß€Á7#êý– ”¾Ï’yý¼¤÷¸oŠW˜®TIeÚÙ$pG_!å›d€ˆI¦¾Vg»‰RœÙ†å–ƪY ªš½!(ºcŠ‚«–°3Ͷ®1Û럺]gÁÌÏO‘ŸX¤¡iR{µ ŸR„9·c°54D¿A߃Žj‹„<1~KÅy“LÆ·ªŽÖxݯp«Ì íÆVŒã–IüžIf,í½1VF§¥†´ÆŒBÌ(Ç0˧‚ò¯­\j/s§·kµ‘è@«;sB–r‰… -·ÝB„Cs‹\7®e¾,É?Èt¨mfgƒ'ÎðÅ“¯uì) #T¯½ÀýJQ\3¹ß|Ê”•ŒžÙ럀ž½ÿú ¬X¦ÑäŽÒ)tä!´@d:Þ'púˆG.eÊËgæ<±p( ‹UEfb)HW²?9mš¬ÍG¼ì­©‰\ÿ…óQse^ú'Èfbížm¥zóòØ#˜ŒËäò2æªû×Ê@P`ö„ˆBy® ˆÈÇÖ>]—.´ü¥‰Áxˆ3õ¢¢s>”Y,M†ìן‰­—#áÄÆàÏ3âúlFqÏŒLœB ‹üTßi”’p+ K{˜ÞãUøÄ¿Uzc.¦Së̼ôöíó.š½ì&˜¼>)œ=v£höH ëjlqór/ÂçáŠì3«à‚šÃ u{'ìÅZ!£ŽulÒ칸 «‘Pwé¦z<.“R¯ºDÍí×¼­±Cñïïû±1Æ®) àƒH?´šû¨"\â|4ƒœÎãϪ‡±TÇñrJyºÇ´\ +Y §[Ï¥Œ¸Ú§ë­U“ƒB)y £¤zm»C•ª×Z$Ûsw•z)·Ãƒ}J½Û1fq—Æ60b‘ òyþ#‡‡Ü¥‡Üƒ»–ä6àéK;¾ ð]4+{_ 4ù0mqÌ,è0”Ìϲ@ç4±¢˜fç>‰ä•ÇÔÆŠ±3ø{)]‹9¼¥˽,çŒPë÷L¹± º8X½¸Â½U0˜ã“l¥«ŠPÅ4€[\Kòÿ@Ès›q)’[n4é÷ÁÌ=|oÏ ½Nü–Ú?t‘pÈÝ5¸à½ÇªŽ@åÝ»MÊ•÷l c…Œ#ea{Œ›Ç¢+fÚŠ›×dÛ`ÄÓ¡­n,ð÷-a[¸¦4‡ k½Í[ƒž¨B¦\ë<æ7ï_΢S¿oðúÖîz%±] ?\a(ŠU]&.*FµÂ×Ð\CÚÞ%;3‹:SS¼œ@ü†uø†7tP¹Tu4Ôêý¶¶'Éìòæ9†¶^;Ú•ÝyÚ7SF—NrŒNtã@QXWHE%X&oÑC¯ãºÝš)|Di—Ûc,¥éãý@‰p$±5ì}ÞwI4ú^¡C u¹“ZR¦,kõèo­‡—¦—‰÷â#"Öòv>oìì¼±Cä¾ÃþÊlØQ®trùfÝìú‹c"ùâ²òÕ¼•±H›£*P¶¼)É·¨xáäÕùNþB:rR0Ÿ‰û6ÛÒËýÎÄ a¼@u@ä<ž«íê˜öf–$€ÔF„¾Ô|~°DAUËÜ¥Á÷äN‚¸5¶±†´¢7ÖÛã¬åãð‹Mï‹À£7¶Q\Ssvçj€æÈ)dÝ iYÈ\äsAZÐSÙÚ±ûzñïF Þ˜@»"«¼‚P/YÒ˜ìAÓ œ¬6?Æê)¤ÈàâTð±P]£PáP^yÄŽA*(õ•‰¬nu¦ÙÖàýþ’-È€G„¹ÿ¬Ü'fJ8Š,e† >¸¸=×B‚l†;T ¨{vix[œ99gmAN_:èÑüºuPòžÁ‰¼3°ÃŽl¤ë1u…$ÖÑ^.bJî¼ö»*]]¹%rüsÓ{Ôõ,R­+üûe/™HTØ#Hsú7ÜÃȯKâ“[õ¸ÀøëÈýÙËúl#\DîÏTex¿Ñðî—ky_}Á³¥6œ·ø0Ó]²_çIDE|öqF_sa$äxõE9Vüœ­ÿ|1÷ašæé9p‡X7z3>*‹vU”5T™ 4wIò¬ro¹'Ç´ÇÙçS‚­õ;;„53gÏ2†_ã*#Ük& ‹K¶)m@ ½à´yC>‹\:¿J?etBFGô*Có÷i‘‹©‹ÎŽlhR^Œ·$U8?´çÜZ选âõt+sy½³àÕ’[Ë%–P>/¾ð*þæÞO­)3‰’HÎx³?Ñ=œ,): *²BirëÍ>¹ œ¬=ÝCS_(Å·4Ù"Ê5¸a‰j¯)ÌÍ;¶£„÷t K*E¾ðã“jÃ;¦B¸ +~“)ŽçHˆCTãAr( h×ëŸDR×¾’o¾ÍBzQ0~‘h»Ø#…[@ÝcÞèiÈÜÅëŸ?)ÒããŸP`õŽQ…t˾'€£Ç+HŠ$M<°åëØJÜÎXŠÆŽEª¦Â.Ê5Tä}Ãð¤2Âh…lrùY\uù¶õÜÑÃÊl³.˜Z$²ÝŽAB&†ŸOæaVŠÁqIâdT»ÂG1v|†¾iåõ…ËFÍbtæáUSxÐj)ߎîÎD¶£‹â5éXul²’ çØjâ2æá[J™=n_ܸ›2Ɉ¢¥Y-m{7ŸaÏzt‡wyU¶&Þ9ñ¹dp¿v,ò †Ë>ˆ¢}s)™—¸óQ ‚×Ä9gpïiÊ.D›çè£Ï*PÖy§hÅ«¨ÈÚ>¡´Š,}¬©)ëš2ÈÓO–ÛÅñÜä:У©mn1|ÇQoI>GÓ.-` ÷Eãz |#qäÉÙËaÐ…ûºíú–mD°lµ%sfQ¦_)tò±-XÿŇ8æÔÚÚºkd|sü–I­òЉnµøŸRÊŠýSH­DZ~­¶X[_Ò«r[hxiE¬ lÑ(íl=^̯hÈqü:h¤{zÞìþŸ–o.1l‡Ã·­£±Ó7—¹‚+È£ªøà÷Áí£¸½3bÚÞ].|!Ý’ˆ&¶ÅI "¡J žéß—8—7”nÂÑ‚” ¨ou*!ëøuZ¾MϤ– ‰µ×>âf[˜Y/vÓ”;4 ÖƒñE%‹ÙCœ|Ý& ßuóªe'â³€ÿè5³¾Iv§)VädhÝÞG  ì9›ßÑï¤ûœòÿ¨œ² Ý¢¶z,ôL††FtìúÆÿ/ä”ÿùVý[ä”Ùþ¼œ2Ûÿ 9åÿ‚¿þU9墪÷ÿGNùÿ¸œ2Û?”Sfû³rÊôGN™‘ý·2É ôt ?Ê3ü(ÌHÇÊúÏÉ)ÿ(aÌÈÈBÿ£\ñ’ÃôOy”qfeøA†˜•åGÉfF¦åž™Øè~´£û4F†åŠ{¦c£ccü¡ÍL?ú…‰•þ·m¡gg¡£ÿ{²Æôÿ@ÖX˜‘‘^P„•™™Ž‘]€Ž™ž‘•ŽŽŸI˜Qˆ‘Ÿ_˜ç[üVÖ˜žž•í?²ÆÿHÿ×èiY°6Ôµ~Ú²Ð0þ÷ëÿÒ11Ð1Ñ3°0Ó?Û±0=Åãôÿ'~h´ažþmlݾ™ð´ëdè»MÒzz¦NFŽŽqk‡§='G#€1@ÉÈÀÔÚÆÒÆÄæ—BäŒì­ž¿¯ô´Z;ÚžrQ žÊ¥X}ßQQžâ `höô c¦ÿ\Œ£©™Ã÷Œ6ÆŽ.OÁ÷ÝÀì©*ß·ß?POŸêOWÜOŸý¶6?Y¹˜9š>m&¾g762˜9Lìžnb¯gíhdH°µ·q6342|ªGÏñ{žöÎFßÛô½¯ß3[Û8š<]²µ5Ò³˜Yô,-ŸMÌŒ¾Wô=³¾ÍÓÍÆ÷W¿Ÿù»ÝSlÿêÊup²µµ±w4³6ùžõoºHõתžÛù<÷ž,M#N£Dó\ÔÓ-ͳCŸ¼cý=·žáÓ碣ÙówÃOÞ±uÒÚï˜9º=·ÀQÏÌú9ýi þâìç=øTøß:üg7l ÌŒÍ ¨.öfŽŽFÖOÞ3{.ø/ú>Ì¿´ÈJÏâÉ=Ö6{#Û§5ã—n8¾ïð¾÷ÁÁÉÌQOßÌò¹Q6Æß3wÑ_ªþͨÒâŽÏÃø—a#ÔsxzÿShýÒΧÅé©>‡ç>›Y=íñžÌž {ñ_âPI À¯ ¬¨+¬&Ç/#¤+Ã/- `>}¨ÊØ8èèØŸŒÅÏ`~»à´¨ÂßßôB2ŠÔFÏ:DO•ÚX=yõûÀ|Ï­¨.#+§(®CcýÔ7À+3kK'C#×s‘4¦<04rrÏ̬¿­…ÌàÉUŽ'ëçß#~*ÜàYìŠBËXüçÚ´Œå¨žó~ÿù#[=}'ãgÃï5<¿·4²þþþ'‹g‡_ ‚¶´yЇŸkøÉŽ†ÆØì{W„„Äå”Äee`”žãCà‡Ã;Y|¡§Ö<žÃ»ç9ìôž©Œlõ쟶z†Ág©ð§|c¥çihoò=ôahÄ?—cbæüQÏóýæý{ÿ°€ß©ä—ùòײž {ö Ìӕﯟúù½ÔïfOíþeZX=ÅžÉS=NÏÊR2k#ƒç{·ïùlüÏI?5ÆÌÚÐÌÞè§îÛÚß¾>GÄSlØ8Yþ²òÿÔ…ß+XFVZXFÚÈÊæ)~ŸK1r5Õsrpünû¼N ø¥eŸr(üä+ ;'£'ã'¿R~ëìçÔïùø••Äd`DíLbN†ÏQÒâJ€çmúó-ö³Ýžê±zšxúö0ÿÒþá?Ûðÿ]üǧ¿öÏ÷ݺÏ]çò÷ÿÌô¿â<ïÿYè˜ÿ³ÿÿ?Äÿ T¢aT¢â'KOëGëb3úcéaÆ?%<üÏé kÿ¯‘fýJÂÿèÁÓlü+6ôYÙŒõ~¤õ±ÑÐÐÑѳý¿x°ñ_hÕ¿åÁûŸ°ÁþO?ØP¶¶°¶q±æÿë¡û¿é±ÆÅ[ÿâc¦ª÷ÿç±ÆÿñÇìÿð±Æ_,~ûÜ‚íï<¶ c`gÿí;=ëGñÏlÈÐÑ3°ü3-èè$*Ò1²0þ#{¶pbÏ.ÌÌÏ È/(À&ÄÄH/ÂÆÎ&Ä,À((,$B/, ,ÂÏó-~sbOÏNÇòŸûÿáý¿­ž½ÃÓý ž®½‘­¥Û¿Žüûû&¦§àÿ ÿ‰…Žé?ûÿÿ;ûÿÕ]ë9Ô‡Ã@%~‚_ò+ò°ØI=Ÿ9W>˜Íj5j9"Á¬iÇÒöw Ú)X YÕ.óìyÖ* µ‚~Óäý.m‡8^„öG×Zû¤¼ÚkÙit't×LËÆqLø%Ün(¾/0V»x:Åb/ܘ"ÄZ2çÙjv¯Oú"Á<5‡ß%–o*~¾ïIþ¦=\~€üzóÈÇïËê¹E¼ìJAèéñä±µvµØax[ãqæÛæõQ§ ëS}ñe¯[ìDïPzœRP«UßtO›R™Wc5½¡V2ÛU›ß„ä+üÎT˜#z¿CEÙl»Mý z®^¯Ñ §>öÌU÷LŒöBCàd{ß9V…­“zr /Õ^íl|ÈÄ&û¦€[á¥%tño…öWîîUD™æÚ8bmËò(p QÁmŽÆŸ÷cj–Vã)±°¢ßáÓÒT¼3‘ÜMdHþ\„?fYW2•r‹Jƒø ½9oN—šg£¸›ˆ§Én¬”P48¨=iýEløÐ"%_>¡“Ê{Äd¸ r áDü=Ä™&p‡HvâB^ Tu¾û·Ç$¼ïqÁ€á>w¿*IQÓ|•¦H1»oXP#ϰ¤ïÃmNûùy"0|+¸‘ò8%¶gˆÝ%’hR&WxcôMÙÇ+>U6åbF¯Ý6¼=—n ¡ø`P)ÙÍþ†)Õã™õn»¦óBŽc•h)hqe¢\šÐŸÑ8’B’¼¨M>þ5ß&AybjUVxØÐ¦÷D*‚ЉÑrÀ³*Ç50‹ r$Þì—ðê%Œ»¾ëP‡ƒâ4”¢YâÓ¢“àHž³J7~ÄTŒ,xB¥Z=/lÓB & ,üÑtF=V6þÆnÕS 4}1rÛu¬ÅǾr>m®^‘Æ»vð‚$ C™¶—\'!uoWo|©ÀhÉå1š¯‚ÓÕ0gÇId5Ó `ÌÄ«ÓöNö€}zkuÛv‘á0kÊ€"ˆLú^ëÂc/É9±¾[ D¤¼XG9ÚQ9­¤ºskþ2ñP𛨠¼ uÍÛèžòqIû÷\Xp¡yÉÒÝfð›¤g% eý™Vn¢Hàm¾°ì=/éáÛlö½1ßz(&“©f-£SˆÞ wöJMœà!Ï>ÓŒ—™â¨Ú}‡æuéÙ:âãÕäe–KÐáuk*šjú%˜6Ú øÍk¾/¢G “ïAßq^û›­~nÊørXAÛ™¸’ÓȨْI¬Øçzs%‚K ‚! éU٥襛oˆ<¸¦»½¦n„‹cOÖægr+XÙÁIÕð‰²õÓÜ…¸Î=Q”R¼,X7OîçN×O’^û.~ÁA¼]Ã&ÀÂS#W¯Pi¦b=G(þBd ™Ì¬êDÎJ²i£å;%ÖsEN¥‰|á5yÙk‡q›WÜfT_ånç6ë˜Òc¨µ ôÍØ±¯ј~{s½Ž@ÏZ×iïÕáä6–a!<#°Îu¦¥ ß»”¦åé Ã×2™Ã››‘ƒMûB¢nÀŸ™ÐÛ,ãš÷ªý‘‚–aa=ÕPmÃfÚ.ôÞB¹²ÊñØ|èžÑ¿Ø°´C÷満ÛsgðÌxõvÕz‹¡\D pkg $ÈúµMLÅnÂ~u y12ª½¤ÇK…#ö-±øQ›ü›†õ•¯æ\ì¦õíµ¼é¤oå§°ö±§L¡ãK2"kä?ÅODåßï±<–H ëèÚÃW|?AEÈñ=Ê{½]ãʸCà}™˜Z'üó¢§­4ã0Uÿ÷0UjÊ’²üêSõàM†Vóï¸þ+Ó°¬¿Zý•âó ¹çDÖÏ–Oyÿ]°,qUIq©ÿ…°¬ï¶ÿ—õ³íwÆÝïb²èþË,º€È¢û@Ö_¬…Èúw²%$$Tþ›Y¿ Ó_‡êï#²~å¾?ÄcÑý ë—é~ƒÅzúû;`¬_Êÿ½Áúç°XŠõT"Û_ÿýûX,ºÿkP,FvZ;'›g!ûço%ý„Èú×øX´xÿ ë'Ïþ)>Ý(^±2ÿ<–%íOZü¨·ïöïçdѳ3ý '+ÁCuÈLÔ¤¼‹ž4nXÕTTW7É ‰d5å¤!\²¥ÁRXˆó=‚Ž…$ˆN]#!EàCò%ò!j‡ì¬$Ìç°¨;‡v|¿š«¸gmÒðá[2wƒCÚö‚¥‰Éãt2£ÉÐÝûÇkî¶L[*cà Õ«~õn£“.Ü£ãåB=â8Æ~tº »†¼×[™.¶íúj8_[#Ù4 ²÷XéVÑ"üWSv¨Ñ4”íF‘êÖö÷¸KT*Þ\z¿Ë»œ$’4œ}<«ï+ ï#¶© ÇjªÎ©–Ò)—¡¤‰3+&NF3_­ [”tgXÆ2ò•8±{ôê¬Tí£¤Pž0—ö•òP+—Û¤£Âíÿäl @ÛÿÙ¾Õö]¸Uw½Þ\•l¥ô˨îê}z5 [΃O™´…jG>¹KwÈk0M‚:<‡ ‡‡²#²©UaürdW—Æ#6Só_I1k½µfLvô©”‹”Žª•‰Élâ݃õWå3rYJ73½·?V­ »0L5ÇwÉðž˜ÑõE‘ÁFÒý€ÌgƒCÂ(ú±ùzS–”(§®7¯¬!AC¢Çß4—§¨†¬-ÿ(àáéVjäò²Ë’íý‹8œYnßRœ«¤˜þì"¾{÷ÏÆgÈo_XØg,^ç¸Ü] íg›¼rm¹­qZ¹Áj_ÏÈù–¾ÈõV‚¢VùÚ‡MƒîºÐæÍ ›Ùý! gˆó¥ýKÔÍycdðtëòÄ©eh,¼$Ô-xpäâXs¦¼d„—Ò×2ˆ°š×·ßš^ŸZ·~;ß‹¯‡j„!i^ºiº«¢æ¼H|óVæâ¡sßÁÃWŒ«6Ñ9û’Iàå8 'g±ª%¥äÐíjö™–€"ª>h8=¸£ ³zó`sUÕŒ… Š¡ÄŸ µÕ×Ú '}ÿ±´ žÉBÔŸ= vÚßgËÊ"ZÈÜmFPM]Nîí{Z&²ÅÊØ‹¼—ÒCñî1Qø×óÀ|š¹ÊÆÔ¯¦ríhv_Ž%å ;ž—E5NüüÁci^ã w/lÚ+“ÿjÖ7¤Z”c‰â’kIWwó ýÁ#_3ž÷‡ Ü]M¶…ÞÕªmUâž±©àt7±\'9úô^°º0ÅžNõ-æµ°Ö1ß‘Cw³ÓÕD"#E “<ÍëËÆ‡[!®fö]:B¯‘®ôuÙÈ nè9ž{º‘á‡ÈHl“]¯ÂVk^ÒfúWæÝ€ )Uå%àWbîí¸òPŠ`/•.¥1jÁGù\:Œôã{w½W)¢˜L %câÎUÄðƺöÃIÃãäz„ –¡óeìÏ´_êÈ$öÖá…gú$€m…5»“§å\ òî£éÇÕŽú:“”¡òGÜòÖTÎ*/‹(¸î¼R=㥗RU·0šÅ >0ãÔ/y”c[!íÆœc`Ütà%sÇlKOEÖl:×zæ·É"1Åð uÀ쌻án¢#+ðѾ#Ù»=<5z8½¾p[äþ˦ÛÙX ½J¹å “ÀØ•nÒÀvЂ܀qŽôfмýVø@[æ­šîS ¯bk£º…¬IÈ‚ÜÆÎqS`'>•«`ÃÚtT¬¶¸x>6W ø½O; rêÆtc&L _N¡ðÝ öÙà.uAÌ>ë9Ñœ1¿ysyÞ@Ì̹Ý#šeÔ";­IÈsã@ŒsšëÊoÉ\Ý©*xá‰sXG(j/¾õ–šT\. ŠrG3äÈÜ5T / Fˆ[•†'Iémïó š¶¹fVýC B}Mr²«oG$j¬„B±Iòu3±ïNÞ¿Tî âtatPFâГK§ès‹ÑjP¬Œ'¹f9×á¾YX×2X@8}s¹Òi^›E´ûâÅ„&vj«utƒïs³×'Ù€:«,/+';ïõ£»V|½›Ê+¤´U„aüe´)Ø8Ú…T®PŸo;ŽUñ±Î%áÔØ©<ó˜{P™ªg{ýÜ¥ìY/qËÙ µ„‰NrZ ‹ØÛÕÚ‡.ÑáÎÞ’ŸæÆFdDð¥RŽ–±6ª:3uH ÆÈbÚ"ñ¡5vph°­FÃ0f×ô³QÈgÍ_MÝ ßËÄ“¢ö‡½KG¡Ýòº#Þ£}oeR_/ žäâ¼<Ÿ#S1õác…Ù±>Ü-+0U—пÀ8úý;©ÿŒ#ñ_±þ€lô÷¸F†jôG"ŸgÇõïá1Ò³þjÇå¤ ­¦¸™ÂCO²™ÅGÝ$ lÖ¡\[öa¢¹áUH  ŠÓ—ÏHü…”^?>²3?²oV2µFbØ­5†GÉ'ùÜœÙcç}²Û¢óÁ¼ÉFòæšÛÐ íâeÛÓ=$Å‚Tè7üòiŽÇè¡l“nœ™Éƒúžïé+înç©q–ú Ê!=¹àðŽæèv©½ Ú«Xð‘lòÈ„ C“Ûqa`Þx/w?ž®ùõ«ÞˆP>ÜFÖ³‘L¸ð´õD¡HŽ)¬(0‚ ‘ª+,Ä%”Šm| Ëñ[íªrJãoý!ĩРb ï­$3f1ëD‘jXYÖºž¯ôßn}j\éÜeõ¼[¸…E§=K—|áâÕ¥EøVMô é6ÔMè}&Rp(xº>½]À´A=Šd¨lˆQ‚>û²ì‘Ê‹! ]Á]ú´U)G `°ô‘I2H6H©Pèô jF'ñ|\ú¸úÌÒv鱌ë̼¶;øÆÒ÷ 5±ŠýM‘ë³½†׌ B^'å’åý¬_¥°33Øî!§"Ëu¡ç%æƒæµ¿Å͇Ïk~{¼™„dœ7ËÌÎgZ-tÁ†4n¼f:If~¨J@I8¦ó„Íg8Ï@¦‘HÞ ÕMÉtQÚ'ÔS±ÿHP‚Pë´ã|Úô™G6ésM©,:ß{¥p‰pþ6–ŠˆØµd¼\]¾s‹¼FF Ÿd»½707ŸfF‚5¶ìóå§Dùùxà›*­3é¸é2¡öû‰pSÌëhÂüóXŠå¨Ç—¶•TF³,Á ȦÅ@•­¬"ó»5A 3Þ× ‚ä‘Ô÷ô%8ˆ]çg…»yu€V/Ù7B• Ô,‹Ö¸”1.ãÒh!ª#x¨&N‹íI1Ð)´d L*«.eûis˜=ÅûZ•ݹ¸’RĈûìOyGå*ÁòdmÝh½9\¦]ôbàc¾H ‚ˆpŸçU-3e^~ýV^H|KÜS§´4¿áÄ€ï\Í‘¯r?=ò©kdk?ðMöu›'ÆØ YÐEß»n^‚ ¾D]kž!Øuþ[£ÌþÔ¨h4©•?çF?îÞ6‘^WÍî÷oaÖÜÄÇL»8¹G™È(‹U5$wøÒU% œ2³Ñ·v®TÎ"ãkëÉSâ²xoúP®cŒR•ÁñÙ®Ç$¬ ) 'xr²x¡/Ûû?O®Öq'è¸r_cnð6«c,_°á·ÉB‚‡0F÷((¯BOƒƒ¸+ˆ*SúN¡¢êÜÂË`c*u!žàÚ•‰s§’S*å98 L€3dA¸•¦€NV6çú´›òhøÊ¥…oð¤¹ßé¬i˽ù\I[Ýö9^ x³jùÅIÁeâ&ÎÔB6 “ ÅZ‘|F÷n³Ý¥¾…¯”O^å­ší&¼°9Œãèx@ØøgÔâÎt½äÞH)Zøbs©søÁw褬C 9¼€ËÚ{þÞØÉ…ùÞˆ :Ú½ÒÌã0´#ƒz#’–¡@è£è¤x$:äk>"”¬S…5;‡rš´”·1mg9I~x‡`k«òÝ—f'Qxo4Cì(Õ@ßõ¨’Š’âΊu¾e,màÔ.åaàõK^ð­ÿ£¼ƒeÅÛÍÕKÌŠç‚ÝáƒqÓiÏ›†uø%Ü›ûë×éEZ>ž0bMQì«N›Þ©W…Ÿze6Ò¯[ý¾qð?¢húŸž4`È+làÍ@¦1•»HÅ’…бyZ¢d]íà‚¨ñ=@ܬî %V·›`Îk11³èEEùÙW7d£–³Q 0ZyRÂ¥7~v2±[/g­ÉXU[ I@ßœò·@—ŒªGtžR²°ß½ÜŽ4ÇÎr·Ú/ŽmîDΗYªþبSžLµžäwGÖB?Í×̨ãæl¬ÎZr ¹uÊýÄV]=MU©L˜OûM©€VªÑ[óîr/ gx¡»Äq³À]J–"kQGÙ›3wLµ}ŸË¬ŠJK²ŠKßç1>¦ƒÊ=Ú[íÑ^®@`ÀA9;æÍø¤W7hÊ6Ô¢· «ÐÁ»\q=âÝu·»¯El¢Ðî24ú–¼rÁÏõ²~=°¯yŸ.{s5Æ¡®U΀íš_”rv´;})Wóåk«%zEâö˼ܾø×oý>æŒHXŠ·JæÉa$§Q)æƒP°4¸)efs³*›Kiƒõ$l ´aÖ±¾qü˜ŠcY‹U®*ßR[E1OÝš(«o‹YŸ° ÿ–Õ\”œ$a<½!é QQåLBbš~ó]0ÁTPßi=;ãm˜£3ã©]¢(©q&eZdKö%Õ‚¶ˆc: 5õWtÐ .é:q ‹ÖhBÕ®œfâfåÙÅÅ…Yƒ®×ÉWuù Y± ©2'n´´sc—Ðõ±=ÄôRo ¤bˆ}ÉÌm×"%;72-5×L|AY.–X´r¾vÙ£‰ÐO.¸˜½^²èÇnn[Þ¹rLâ—lÇ^×a#yx=ôÅF‰ &É´úÖà¾Ág^7-YËËÆ¶WÑK!äÚó&ÌÇ®j> –WíYÙ.ŒMþFNXðbe½w¼0gó.}<à@JÀ^ue-Uó5h F±ÔÄ F àîtµ…äXÍ€`Û!¤"6×"Ø’’~_™Œ- `%9ÜdcywwWÝ“üŒ¨ftÆÅ±1Ï›5I¶Ìã &øñIG,2-4·†¤NuR@æ ÕM¤LˆÌp8ðx±àpÖe´ö”ˆ´ˆô›ü,2P@ ŒE÷k‹ýͧk÷mø)þž-/Úίô7;û=/?Ú8äp;ù˜ù…O{gZä³N[ô(°TßùVgo‚½%3$ÄgÅÉ‹³?DKŽºëŠ™å3z IÃ/ü¤Ýª°PêÅG/€ìZÁf¥•”˜ª_½çÃà]G +{©_›|ÜÂ΀Xîxâ’d†÷ê,é#(ªZ·ÉʪE_'y­–ŒYÄ'í45^H›¹ÛÑÝ!—Ô¡H(ç¸Nøú°’¤*ƒ œ:Ž;\ø0{% õwR Ð…¯·Ñ®XÎL?ØÏ,K›Ú^è6 D0Ï´—º ¬äë1UÚ³N‘EYÊGøtÕzä„âZñ“„‡Ÿ²°›>V8iûœÏ“=ŽÜª?i/W?µ…“E¢/¾ÿ µ~Ñ!ÎvÐù­`éD²ùk•¨"ª<!¥W¦ïÓEìÜ´±møC<'!Oú<¶OÈ+{Í Aa‡Lª ÝÌ}w;Aóew ÄæótP\×Pó*þrÙ/fCÝQ9ê ܳƒX©ËÑjx˜™ÇuLa§GB1#ˆ×íbTo®^täšây"â"™Æ™‰i‰~=&EºõD†¿‚jï¢ï Ìj ˜×hÅ¡kDáDÆwþ*eZcï²¥ä4›ŠŠã±¡^—‰©)Ã2a¦Ôm$, îéd-,'¯¯ù¾uʜӉ¸Ð{°ü…™¯f^(pI!h‡ä´*¥R¡¤­ ãqÑCíãk xÖJMãR•ƒÏ))ÕÁÏÌÚtíCÓ›æþcö«X¿´|Ö žæWë 4Ö=Ô‹2Ò–¤uÀn31ÝùYY¥Y~ÂVÍJ&ŸiÒjDÑ2ßuÇ[Ôƒö©§ i$œîÈ ÞžFg³¦As£´¥uŸš0¼´¹áZ‰iA!ÉÎ#tf±Wÿà!®ß:BRiÈ´ÝÃ+ š x/nÇ·r¾?ATðÅ’[Êq)Å$÷ñ¢Û·}ýŽ»™¹yfääúòÚT6èš{z$Ñܤõ3„» röÆv4TÈÆ÷ÊšàÝLoGêÖ< ›äpµ¨áÖ¥¸6ßeËÉ@Ni! ²‚2ò½³R@+urîÿÈ®—itOãï‚»w¬ý1õèK÷;ËÊHMq¦Ã%„5]Wp÷ãe”껪ªe‹‚î„Ø†ðø—lg`°Ôzª¯rvà — 0÷pê¸AhÉ\ãÆ½¬™"'Zøƒœ¦ÌDœ»gq·r“håùHÌhÉãÂU ÃÛ‰ðâãÏíîõ ^øu‡Ñ1r_t‰\„êæá½lå³0°²q ,~™>´,«p¢¥ùÙ ‹$Ã]?´ÇOí ÖŽhI«-/¥mééGtí·å¹Æ7Þ"s¦=Mn$®ßB1¡×N)¢ˆHñC÷¤v¦¶}‡KÄ“ÛlÊó)æNo´Þ½n7Øà5ÓÑòôš. `|ÕÚúêÕqët-CCr9ÿ‡}|¹ÑüB•òF©x®‰éû—ïíÛº‡Ìè{³P¬M©!Íï¸wq k–×áùR¨hÜÏ!‘zÀˆ•óËÉÒ‚s8UЏk¾Š šõ¯œ¨uÏ@F¾\5߇¹õ˜ß¶Dßxá5‚ËŽ‡NŽ©îãn|•ýˆ„ꃷô!bS_tズE@¼G2tÒ1üHÈÇ“oá*ñÒzöM²\ ÞË]K§ÕÓ#®t)®oVE¬pï4ù#ËÛª›fÇA¢ëá,ÜßÓ –þŠJ’‡¾Ã]§œÔé>¢2:>>:R\©ÔÐBÌÌÌ©k@Fg|4hçž@#¢¸ƒi3ª$qkx1ßìÈ'¾v/¤ø`Zôº°Ki¬bÄœK±Z™xTc'K(Peè’´kÁAíWß¶³³pQ¬/k%¤î«Ÿ©­%Ÿ³Q…òîÊy>3¸q[éÇÆª.yåå™Í2³wÓ×û>;tš{'A¯ýoMÄè–q¶I1—€_ïf>Òî¥:u{w„²Ò&‘U²tÀÁMÒ¾×ìím"×áD©õåóÎǤ¨ˆðp6w†åäÅW¯ì :Ó#c.­ÐCZ¶çP$¼‘£? û`BpùÔt1†‡újŸQX£¤u»9= @¿œé‘ž¾®lÂ}lLþ°ïaÒ\s~Û{KKºÈÏ¢êgÓ–„s¶«d¤áû±C0zõz~}PJ‰u»Qû+ÀÛ=q!k ›ÂüÜ]U5¸¨¹lLÅ¢päCó¶Ö7è•@ýË HRóÏ• ©aca°°1þ¤æoÙ±1þs†©ù QóãIÕoøÛúözFßÏœ¾¿úéÌétÍO‡WÆf‹©ù“š¿>,ý“¼šÿZ 3˯ùÝ^ªÐjqª“úD‹NE°/á»I&'jË'(ÊV.‘¨Aü|ürö,:Ы!cùìkÐÐ^¢,Àhu“^f» áõÎÙΩγfû÷W´w¬ÓÉn&ׂ\žýÜ— §—•…¡(dèáÌÌTìÜ<êbÆ7£p‡ç$>ÝéŸZ>±œmo‘à³%ÀÈì%sn¾£½q"Qå4‘³D·t¼™(‘·×Wjé† |¨tܦ|l®q_/f>]y86\¨¿Ú[ëŠpƒíåu;6KVß>Æd¿ýºj_³iÃc£k¼Ô’åFpÚd&*üøSx®ÉÀ𪦺!ÜÙpsí`¨Ÿ—" –‚­þòªíªÙ%N V°slL×Û`tÅ[M_«žË9ßqÂüºä„ÜœçMªUf¿]Ž`\€"^C(P²ÐÖ7o!°¨lœ"lV„º ^‘²w\œ´.lVxÿ½NþƒPYö¤‚G‘—s"È8QqrŠ”töX‘Ù¸£9#s‡ÐµÂ%8æp}ùaE_¢Æq!Š ÷O)ÃÕ²IŒü¬Ë‡{Jƒ¡%¤çÀ<˜'ÄPCü»Ýqç6Mã)vS[å:Ç "üÁžoXÄWŒeŒ›$~ÝDé ö¹ ~ŸíÍJRͼT°óßzo>6ÆGæiÙjÔñ"‰êн1¬iꆙÜì™3ë´0Ÿ Áå7)^0|§ŠÅFJÅËØ¸5Õ+ò°Ãa_S¿p¹ŸJv´€’ǹÅÒð²u)wÅ4Ü‘˜£0Ð<®/EñÁ`ÐkA±®É‘(]!Øò÷ŽëªFLÓãþœ±î™kGù®ùq%•I!¢o ÷G²+.çæ•´PŽŽËJ.‡6vÑ_ï|“j(Eb¹½l`Íl{W]œÁ _WBK§È©Ö F@’öá°LàBéê¡nbF¼Y­†},rîB)äáRxš“•hyú®UãH¯ê´CàX‡ÖV&À¢˜Ïëãˆ˜Ž‘§E jAÀ`σSYÜû:°D׺€6õ¹N1Ÿ¦ñÞõâÒy&#°/вpP#¯Zädc(XE@-óYÓ¸¯ôd3?4%ó²mÕdÔo O9Î-–ŸábK‘mar]è„fê¥<ïô~/˜5<@7¾Mëè|~˜_+^¤Á:dz‚e,Ž„,[Å÷y›Ì®(ûeñùŽþ¹þÞ5ßúl_¬„ÚbÉ~= £í²?C³ªb¦¦t7©I™º ¡7VÍ’åhªy-»6·):ÖFÝy]]2pÑíbC“`}Ì()™/C™±V p‹™¨=„ÀÖY°“óÜÛHKdÊ\0ÜâP–*i-JdÑSôܾ/ðң຋jX7‹Äˆò©Ä¢]„ ;ŒŒWeRò0e•˦$ùË^áÊå®qC÷V#<¡W[¤:ç>3‚õ€^h]覾#,OZï(to À—=LÊJ'({¦„02¿ Dzê ùƒW¯¡ÞY…Âô¯±2OŽ«Ã©øKgѲÆóc›rº•³¯yãG&& â†&’v¢úµe)V±ÊœOé4¶_:i–œÞ‚Ê|ÒU¥u P}¡#>UtOè¦"&žL Ž>ëz¯D›2Ž˜áÔ¨ªM5΃ël7öºs5#á„GT‘{Ðê!÷#lÅ»Q«êxÁ|Õø÷_)`Q¯…2JÛFŠB昭ǘ´†ÆX^AÏЫ³ƒøv!¸¸šè–äúuu<%ÙSc)‡QI¥ l\]Ò5à½wø¦z- îøU'ˆ´]Ø›`g:E몃¨¬»ŠiÓ™-ü&ޝòê*£Þ"1Ññ4ÌYð~Õ¹~ô¬é,±'ä+Üü(#’¦Ÿß¢ïÏe¢&#fN³Ž{eçËS—¯»äMìh‹BG„Y`‘ŽòllbÑ~Ë"°ÑÝ»‰˜Î¶¹ a ÞÀGÒ·¦Ÿîž1¥`ÀnŽ“Iåqäà­wgIÂsIÖq…|áú6¿Â*T¤¬A+Áœ2œ²5¤ØyBšˆËξ¹¨QB™„Çr‰½:¢¤™x,ÈH.¥F6–e=t=ïm†Jªº[_^âƒéÑP²¤i;1ð¶wç¼±7mÇ#OYéçèéÏÚXìVnzN0?4þLÀÍv¾G¦3§24šßØ|u„¹8î™Mñù¸îO-ÍÎë7úiROÐ×¹ë!^7yZSµÍÌ>@¼¿ŸrøˆÁµ‹ª(}Ö©h“–îÆfÜ¡ðyÍ?·+m8lŸ…ü‚¸öA8hD²U±u”°dâ&I˜©:þZÉ^ŽÝaØ„*ö¨F¢nÙåÍ‚¹¼ÒÎatͯàSÁ]×Zºá†Êü\σ¾­@~Øp1ªêL$ºÃXdjq…Ãcr*ÿ¬-\ÒO”ÛWQTVÇú«3¢Mà+ø÷ú[™IÁÖ¹fgŒ^rÈé‡z÷w`â­9ÖŽ.…-#W5õäóyn%ðyä˜AÀ7(ßò*˜ÚEÒÃÚƒvq‰ä;ÝlTv«-4Þ!•*Ù´Yͧ–a‚ÏsÄ.‰ImöG¾Çyp•ÖåoÀ’—Ȭ œ°Gç5·Öc$‡‹žkˆò·wh£nˆHTŽ1B¨ôì¯Gã—>nPëØkñÌ/Λæ¥U-!$*ÇêYÄ"ò…ÜåNããyÎ3Ùú.ÎéL{, ‚j$iöq¾î£ ¶Vû:3¡5©½2šú‘kÛÜæÀÒΩý´RY•öHñ‚ë2`#ælÑ™ùÒ†#ÊK%¸6£˜Ö%‹²2ç°qJ£y¨–U|ì›§l,7hv²xðåçÖKÐGÌ/Ãm=7¶`û¯ò‰ìãw-ƒžְ/_z2Ý–uz:N&Ç%ääÈy¿K4£a4sz]Yºòš*á(§œLH9~#çR3|ϽZG1ͬdÇÉÓ`Å8*ç|F™€ãD™ÛÊ|æBq·% Ž­½¶ü9õ”’Af‰M©OðM$Æp'o'¿pt%s›·W+e™þ­|7/ŠfáB)q¨Õ«|#eŽwšØ6KÀ« D~Ìpc<Í=#ÒÑÑw¸Ҩ§ˆ°qµ’âØüû†‡%²ž]Of{p>~8¯‰™íž±šˆ÷ˆ4OG¨\÷@ŰIɰŸÙ¼ÄÈgÐø˜/×ZvååKU¾f¼¾fh<¾^_;1QW¿1nô¢õ1ª…³!¨ý¾—¹ ŸKäDw㪵# V¡õjp\¥ˆØœ¬J¬ÏG×ÄH@@]â“üKJñ^1 J6˜WKØ£]K·_hq,"hUÕN³ ö¢¸î6Š[GjÅÞ À“^ÛÝùq‰ˆæS~B( ãÆÒŸœÓÇðù¤ýæžj{àm’÷ú¹+´ÖV“›;_Út·lj³( >R>¤ZÈø?"ëHŽ-rEru8“üp],Ç<õ죳n7¶Ûyˆ²f )J#›J})µRÅ)ì™;WDéǨJ “W á(†*Ê/i0bÏ’—œ„ &fKúÃáÒ7%šHô% üâ·Ánì¥ÚÓ=!Ó¥²H©‘ UóŽ1d̹òã³ ã#“4–¯¹Žbg±¶ ù,u«fX¿ØL-‡Ï …¨èÜ]ÚÏ[HêJ›7lÓ—Hoüb̈%yýFœ¤ ´O¢N¸(¬uà‹ÖÇRoLËûoWŠè³3_°kÒ=>œžÁëŸz*èJ)8ËØïðÂkHwá€éx'‡vá©³ÝØÃïî°pH~j"¦ÐŽ·uKÉ~!ëçª2[~&ʺ®#æÔèf3ß·7„5ÔVæäíû‘×¢mƾ¦ìöAy¬Ú:kÈEMê•û®b£ÄС±ü™3íÂ.ÏÔä´Ã†?í‡7A¦ÈB5Èo<ÏÅçÕõ´…‚ún‰ Ù‹Œ:in_ ©–»SR’QÛí¾±)ÀgÍ1B° ¡ÌV)”š '–ï²-¨ŸUÔÔXQ>AÓNÑa™5Õ×ÖÓæW ó6ÐH¨Æò›•PÕŽÀ³@éJ|Ïp@Hy¨%i52©ºSè#¥s0” Žšá|ŠvôvÆJê%ë5B›,¶`Þµ}¥mØñAå¦g›GÕ¿, P¨õŽP­„OcÃQáÕ3ŽX3Ò=#Eâî[RI²§j†€yg‡iÅ7×öP~Hà¹öøu¿=ƃÊ73…J2Á²dâXæ¡®dLW A½aù(Ì©Ürá0×0£àq¹ð-‡‡#Úe}-Ï`#ôë•i ¼QÛvô*5SµÍVË>ñ9bpж±)³l>NÓÕÖÏ—ÜJ`±à/fem ¼ñ=­6·9ˆxÝ‹¤ðÔ‚™íî^^Ëei r -èÍ&’Æme¾²ñ¥>K'sÑšÑ].tŠJß›€ ÞGª.[¹ò»“ÔpWÈì±­HÉ woòÂ6×r1¨Ä¦ôÈÇBŸ.Ø£Ê d4‚·ßDí‰Ç‡øIÍ Y ¤Û£æá’ÔWÎ> ´½ëFIOärâörõgó‚Ñ %YžqíÛ d’ýðÈ‘Cßx»¸üeÙ)‰ñ#!ØÖzÇÝŠ€²ž±Œ’Ÿô(âH<åÁn´_qŠˆ%˜n†N8+Ôû^Êä#TÅÞíô»ëx‘ðnózW^Å‚ *ôÔ ý¢¤á{Z'@î#ÿÏ‘#L¬†?*$±2±Ò³ëÓ³±2þ¿@Žüó­ú·(s±þye.ÖÿÈ‘ÿ‚¿þUäÈ?QÕ¿{Œÿ£Íõ\›‹õjs±þw GèÙ~‹Ç g£cù™AÏÆÂö£Æ×ïhrýŽv= ÛyÙÙ@z<÷ó·m¡cùMÂÀÄöCÌl?¶™þwð'Ì,?`HèLcù!‘釶°00ÿVûŒžžŽþG„ óoÛBÏÂÂÄô¯ G˜™Ø…Y„èøéù™Ù„EDžÞ°²Š0ѳ± 21òüc‹ß ˜±1+¶}¯èO¢¡~¨õ÷Q€¿}ú -ê÷~žBÀÉàçª~U Å÷Jxrí3ŠóB¡~hê_ÑPß/ý„pz²´}êÁÏ,¨ßqÔsûŸ.ÁXšY[<õÏò)L¿‰ø5ðóÌ“²2z>/ýÇ´§ï}?cz~iÏo±L¿‚ ý…)cõLç'د@LfŽ5w´ùG¦¿ø@óS\ÿ•œDêðK‹Ì~ž ¿¦ýÔºïËįËùÉ3NÏ“Öôi~š}/ôi >³½žZhý=ô´H|ŸúÏT£Ÿæ/c÷}góý\û9Ÿñ×"¿ûð7>‡ùšåðH’±™‘¥á3$ÉÁ†æÉu”LÖßcý†ÎæïD!€ÂÚÈÕ‘ó»Éo gÆÏ_QÿÝ+Ïxš§Åõw¯Ù™<-?]ú%å;}ëy±ýMÓ§ùi-14²ÿÝ+OkÍÏ:[O›½Ÿ'Çóü<ÿ7õãù©SJ¿žQÏŒ§ï )c'Ë'ÿ}¯î÷‘SOÿËý˜ûgΔž£ã籠ø•øÿ6—¡ÙO$ªŸãðÌý²vpùiZŸÏ¬y¨O5ë™>ùñy,žZ&¦çHõ´?2üê‘Ê_sÀüŸÚÿ=MU7]›ïÇËÿíúït¿Ö§ceù®ÿÎÂúŸýÿÿý÷@åoÖ³t/[‡Õf»¥”µIꙤs¨‹L· ·Æ^Pˆ¬UªL¦KöpMHé jÍ»…‰¼yy6=¿à½©¼žX´]M‹ä®À…{7T#Ø(ä]†H»åàOõ^VbsEu #(òùh÷Úf>s€æÅ{þØ›];ìH𠱃%Å]¨è%I´]^R¬²CWÀ·Ý’¥ã&¢HCdÇë—¼ÆüõŒÊâBE…0•½é6sDT+L½íÒo-ý úµÉß‚MßÜLy° ! å]É` I#!î‚ò§SpdW ‘1²Vw³à0Ç ›€·¹Ùh‰y«ßUÙܬ\@דãÉ}B(ÉÙÌN"ÐþÊ«¸ç4Q¹G.›EIÅéV{VËbeÂL—Ô r÷J– ’Ö® dÝÈMî”P™“0Æ~·cq´-]@‰¢·Œ†9'LJª˜hÌM{…P}CæÀFÔ%®} 0Edžýÿ±÷`M5Mÿ° tAš4Cï„Þ{¯¡IB%tAŠŠ" HE@¤( RTPŠÒ¤JDQŠ"  ˆX¿s’ÐQïûyî÷yÞ÷ÿ™ëR’sfggwgfgwçüÎÇ"ÅFíÊ‘vöwœM2 ª:”9LÅ5O.ž¥²ô¹â›ÙAk®JúRZ¸—ÊŠ Õ á¶ðSþOÛ–$Òõøg´ƒhW•ç”Ò¼êHê]èŒw´9!%Ý©Â8g/Ç#ßûQ9‡ðƒEW—|0GÝždçÎ݇S ¼Ý]؉hvKtSDÌO-Lõo?ôÒÕ8÷ þ¬QÛAΫ¹''a aå'X<'"éz_¯õz.eÎñÀò™BEƒ—›{ (õsψ£› )r¤,#Þ%<ïÒ#x2í¡¯typ/#ä‘?— ùÑK*ær|þ”ŠŒc®ÐáäÖ½‡gæaº„,µN}SxEÎP4ra„R@c·GòXLåiÁcÄÆþ{’R ããÆØú? hŸbp’oÛõp°L"öí›ç£¢Ô65¥; ’-˜>×,¾ôb†¥ Î}¶È™+Œ{%’2“UDÛv߬ú‘®xÛhçœaÞ;¶P>IŽôÃÈ9³mìÒ»{Fv±ã·5§–¦ç¢¤R9„÷õt ‚º$Á7S(€9…ñ6ú¸•µ™I²^x ¤W…»Ÿ|{dêðu÷Db£¸ºc¼ÜM7)vR¡/f¾ý¼¸åöäÜOA°¥Ä„ÿ``ÿßÃÀÖ‡Á Œ´þe lañ5H¿"ËH¿ëÀ¦×ƒL /£àþS ÒV0˜šŠÖTz«x3õJë7ÁJ o•ñ‚ÿ¬´ð/A¥—¢+-…^–Þ+½Ü¢XÚÄT퀮Éÿ0°ôê`mÄÿÞTzk˜éµ8àË¿ , þZuþO‚KoBmÿ °ôZü÷ßABÿŸ•þ'`¤æÿ°0Ò’¢ ¢DL å–(ÒëI—X÷HºðÏI—„þuiWv4z¿ï?--)½#æ¦gâL¯Ó]?x°²K¬;[Þï¤I½žMŒ“u›D4¢EëláÊVfÎÙI—½x‡néï±jyLsYðx9]½-öëÎɨVµKŠSϙ˜ù: “ŒTL¾£8"÷v<èÂý±ŽNžX‹œ¾‚¶¡EËôò©>ñƒP‹pFÑʸH*»æªï<Ô‘LxMÍr_œUYÜCñúŠÆNRâÅÒVÐÙ©Ñ}õ£“mÈÊÚï 5b”ÿë<ó5Úf«¦0þò|7«m÷–Î0µ:jœßmM}Èöd¯@¡è«ôѨQr˪"^T¯ÄyÇğöGBRGŠY?&†ELkòe¸LË«z£uF#òkl÷Þ7¢{ …S[EfÝZèSB¡íûK‹èlGÛ„­mluŒm·þòù˶ãí{*²ù2ˆ9•L}ºÍ-ÍóžÜå¹K$K+ùF—OLÃY¿ú°'DÓ÷¶Ó×RÐù¡F/z‘ÜÞuòó‹·O¿¿ž˜æ ×üÂ;_iøRA‡i"@¶ðêyÂq~E›J†sŒ®V»h&c_¼z%ʧ½§iS^IÂSàÔš÷­ñ+T)ºV^¼Xø¸Ž®ûöÉDÃ{T߯̿Ïì~)1gzãîw«û»Ì ÅÄñ¾^Ÿx1ü­ôÜ ç‰Ú¨D_e$'bww¤9’ÕqÝZ‹ìiËå}î%‹O݈„ž :(6Õ¦ò…È|8D8]¦[0NPpô<Ý›Ú8ÿ&i9!ä^qªª±½(Cê[×É:ÚXvª¾&ŽùŒöÙ=æ¹÷à½Ùavë°êÂ,_VkK„Ù È?G˜]ƒÔšõø{P³ký±˜ð8þ'`fÅ$7ÀÌššôW+ˆœA)q.ò@ôïßìë“)k77UkÀ3ŠÞA¬Š¿CëÞnb­Ôüm$áz¤Ä”»½K¤:Š{íbà Ck>~© }5Q¼àŸúvd¡ÏšÛ“Û9ëîâ°g?¾=s¢ÜeBL{R|æ 2m>Õ>×ZÛ†6„ˆIêâÀ¶¨¯2aîçÙ½œ¶;Ç(ìG%1†ÈìiɫτKœ,_pùê¯m|ƒG† 9Kóm;í~Ûêé°K^½SñÑù?¾;ÎîºhJ-xá6ñ­=t©ö{A 7V ¼ê[RËÁª'×oqãHIÇph–ñ¡º¡J»®Ûkw~l`–MÌå)¸ÝSWÚÍþQý3颿’úÃO'w±È0e½{GA»ßòVˆú«ôª÷$ö,¥YïØ%v“ßÞ bOé}FJ‰‹væqNµm¥qܧ©dÓ4ØsÎI—ƨqÝ9ñ´ÁžbŽrN¤4y@óÕ[ʺ©:zì6Äö2¥QŸ¶ßgc:ÞkÂUsé·ÀþäÓ o¨ç’ˆ¦;8wA™¿2•H ùPKíò ‘öȨ=Kê“d¥›éŸ>AýÖ×uj_þTžGz߸׋74¶rvßj­t;ù†³Ÿ®‡NŸ®cª*Y/óòÉ©ýγY¯ÑôS¶/…“ f ÐÒ–.xF½L=gS |R¼Œê-·µ½¨ÀÑÎ uj ߯ëÄ‹O±¦G©Ü>NÃ+ò÷Å—÷Ö=žÏ¶'A5€ +4ó®š[qF샄#|²Ö÷C7¢ÍŠÃ?W0æ„A¦áÝŸõ¦»dš:ŸÌͯ²ä„¾o»Ñòoœî,®8tÀpZÄÖ ÿõ9/Uчo›:ïÆ\¹Lùá̇×ñ•‡'õ†ÞÛ](ƒq™òô„k^ºZ’BÑq—Õö!ÃõdzGe¢¥-v2 dß‚Ošn<®ý4èæ\rÄì~ؼA¶1µÖE£Ë‘»‚çNk&ã ‚R¨Ò:Æè6½ø¡ý~Z‚5 ÙÉÔ­ÃD˜æªŸ%½¯JUOûí~)g:¨'AÚð¬al«;J²ç‰a o¡²"ÁˆHXzÉŒ/3\eÆÑ&C“Ðôò%Ä1 8ë¾Sª è½xó9£÷<5dÜ:à/g8¿¸ FŸÏ¥–ô.£nM‰±%ÑbÚU«shç¼ÕL“š]ÛƒõÀž·—Ǿ5{MŸß•à<{½~ ¥«'ÀE0Iy7«îõþ¢ÇÛx›Z,Æœ¦•²n{F>ôa(#4šÂ;į#,ÏÓ{îõ.ÓT‰‰êdÇ7~ÛOÆQv’ Ÿ—öiìÉÏï ÔÓks?àvôýEhÆQ¹‹“¾‰ííB<<'ðâõôÓÎR´6ÓYkžÚ{’?¡áGçåšt4µððàq&4Æ> =Ü›^–U›©f òp¬«9r‡¥qÎGŠc#Õ¢j ‰%em—è4zªé¦Bt­óÄœÍ"²(wQþ zÓÖDt(mQèFMVȱ¨ ïSºYîÃ(µãj زìXˆsé Y¼>(Þ_Í|–ÃûÐÁ@McÁ;Ï}Q±Z¹Aœ^v›ø“¢®&þû¹å B]n”pŸ vgÐËãÌx4h¢öøâ)ýðyÝk³“ÐQÇ. q³ýèÏ„¥$TÌ—ÓçJ-øÌtóx•+Ñ8"íâžóg¿òó]U13¸*9~FÐÚ¾}[‹œ’¾YZù•[Mß²(ñœSz£ ! ”g¼M²ðåK#‘êJù=ïýïm‹-è£Nä‘áå•©”œÕ±pCæœpF¹¿’^ ²—{J3îAHÚª9ÁìäÄø†c¬4 YÛÙ5ªFnuø͇¯n_â(⸠Á‹úðv0êμ¾)±`÷L¾Œ6HÈ.|‚õšâþ¨žÚ;Ã?ñu,ô3ûGË|ñóÚû¥‰6X7ªúÒ;ÖÆiÈI–ÞÇ ×-h!ÆÏ¥HÖ1Ÿ5h :ãfúä=;Gù‘–"Á|º‹ ÔF²CÕDð©"ç®1‹¼Þö¾Ï[.^@îJÛ”óBÿ‚éá†JøƒÖÇÏ>—¼'¶ØÃlƒ¥F3«ç>ÿšâÉ[vr'£ÖòûÅǤ(<‡Þ7wgí÷¥!Z:ÜqÈmÎÏ‘ƒ<=Œç;fÍ0æä|%é†i^·›—¯[ùM[[OÈë<•DFÇÁÔ¸[ƒÃ y–ƒuƒVì®…*‰„P¥|™óH;ABdSPRcQ:!BkLIG{ymU£&{qŒÉ›àe~»K#~îQ1þé'c¾î!õ°ª …mþˆùbÑÓ:ÊÏUt³Ts?*4§ž¹ü ÁêY[Yçü3¶©¶Z÷m&„ž:MÍ3îФ9—Ú¢{¶ÑÕ¿Å.u¦­œlJ¢¢½ÿ|6wÁÓœ¬ö‰`hó)îPyÍ'Ä«¤»çu_íÓPÌÚ+-?°»ÜÇ,¸mîåëü‘;Šò YeåBÓiÀs2Ánd_”ºNhó„~·à"ÅØ}ó±•]Wt}J¯1ïÿô#¤˜åËÒ›KY!·žöó½ å -~zFôǽ'ÂzF”c<Õ+ßlc‹ÈÀè‘âûV½öðœE¨u5ÏJR<}xî<Ѳìé.õQ ¿j¹µegjywÈ=Ö³ã÷”’ý Bäš‹‘ý•®”$ÓÇ´Ïæ=ð³ô6 мì'iùß9ÁVÙ6Ch=1¤ûCAà>âÍÍCÊ’RƒìåãIÈNuâÒÝÉN«Qáà IÕ¢æzu¼Éʳî%ÏÉÊŽFŸ®ˆñ<šòøîqåÚooÍ ô»æOß_PeóOxȸø¡ùZ[Ö ÷ÀûhN(©²Ëøêàu"ÿ.­8)£G÷¡ü£„É䨃Ðë»hHUOgŲ0L)ÈKñL“L 1ÆLÚÒ&•{}û¥Î[’~ù6›Ð BÃûKCÙõî³…ŒzÒO¡OºYŒ$ƒÙg(O˜s¼3<FU‘%%x©rqˆÓïâC¹¨O¹Mü²/ëP¥”ýÚ¦°ØWMt"Ïîûy ™¾t4VA›Nñ‘Ï%¾K§ën~”(³[øþ­qè´L]½u£ÛË=gÞ²K}aýÐØ§ˆ«ÇMÚÏëÖËÛ1ûÐu^1‰Ôí:õÈõ[Öù%ÙšIÇìÁÓïo…)zÿð}±×Íñi¢ðDň÷ôl¸ÁÜw… AÛ÷˜ïP—1øbÚt¾¯DòÕBô Ò»#ƒƒNnB¥æô± íB2ΑŸ<å“üë0¸?9ûïÂà.¿²I³©¦³%îú½4Œ«°·¼Û¿‹v‹¸õGþ%pÛ ýÁÿSà¶¢bkwÕBàvÕÆ2^]mà¡<¥XÕ̪ͬ1¸°¯4–oï9í4Gâ÷g"8”Â÷!Ä»w8RuÂÔ½®ôZ5l/Ϲ;ã¡;ä·8ê1bëIôøïnIJѹsŽY£Ïž-þxöã[ŒºTÛ>¹·¯*ßù]¸TÙøå­Ù)²“–2'ƒN}}üÖDVú cú•MuÓ‹aVÛÆ÷×mO"q²\VÏà å•åC¦¿¼Ps­ÄöËçÚƒcÕÞïo\oûagyKRNZFôÈ ßWNA9ó¤Ýt,Y>b2BâAƒmR˜iªÑð‰½,i ŒéÂ,ˆ#Ñ_eÙ~È“^äœ14NýŒzrñC§ðb›‰fC~|t-Ý(åÞñ½3ãÌ·'† Ÿô÷ÝF xp£xh˜Øž`ŽeNtTÙÛŽõ4%ÿ ³ct¥éï¸Nï¹F¥Ðàvliò;öÖ»ßßf¿¿ô1ÇGJÆãߎñ{‡h1qŒpŽ@vQž?!Ø@i/Ñ¥ÖÆúâ8Ýqº¶ øu'žS‘‘ÐŽê½;ÁÙ`¾“TéØŠö}E37Ÿ ¾èÝEƤ¶+^êbÆ.é4C»¼>#m1ýŠvÿŒÅ/Íúè©I½6yé€À íÆå&¢\Μ¶Ý_rØX<ìÑפ¥[Ka:&;¯‡¯ÕóÉ ngÊT˜¬¹Ïü¢¦ãÛ—º+Q/ÞJÑà t^‹±D!ô—Rƒ”ƒ‘®¥ºE*2z´}ƒ­ŽÐ'èâ÷~ÝI0¿§5½õMÔxžÔùíüÍÊ‘$Ô /rxŸŽno|ìK+0®LjÅWĤ™·íýM_þ¯·;¾L³Ñ›i~Ã9~O£ýøyTõ %xQ|¨Åñ:ÞÖ*Žìð亞s¦J/é¡ÏF§=¦¸Ï~ÛðA,žÝr}üðÒºH=Iàz4¯u˹”¬u/ã©\Îc‰øÿÄûÐöWŽ\Þ-Þ\ˆ‘1-Á … Vmç› ¼å·_¹RèÜä×5?ú-6xÇl¯ï…›å–Bá¬ûgO»žvÓá‘5·±3±‚«¢Ã<®—-EìbÔìÂ;ÄØö9zq½Ñàe±ÅÁÞ¤¼ëìº÷æÊzòaö¢õ>#¾áE—õ‰o3g§v÷1Ä^-ÿfå<{íLqíx…+ÉÀ(]µ¹ªƒQ’¹Sâ¹Þ¯‚EŸ’Éôˆ)G*iI:» /îñý:æ‚2CÉ™ ÿjëNZ^Ñ}7Ø£_̸ç}gâÃAü<Û6ÁýjÞr©ÉùçR)\Õˆ=ïýÀ<Ú/]{t—gFíÛóýw"ïŠç97heš\‘ºÿ¢N™†þ+´Æ8ɨ/5AµÍ£»Ûú¡Åw’)‡î}jÌt¹þ&Ɖ`ú º®§Ot;šû=’ûÍ¢vô1ÿ^¶m†¯]GÆúLJ>ç~çñÕá?‘‚†c0Iç¡£! Öï[î²§¼mɹÈýžõZyYåb!g—jäLJomSÛ&Æíþæãž#sÇÎã…êœÞÓt6¢RèÚ½`a—è>AôIòÂñ6,IÇìú:IÆZƒãh3òYÃßøUÝŽ+9ÚM «±åzv5¯+8UíõNBþì‹d§M<Κy\blÂÿ$êü$]y¤ƒ¿µ{¦T3o$‘sèh³“ ¯æ'êþ) ²7£;n{Q¶sPLqÐL‰0äÁ<sé$fëjá'ò E–—Ë?¢bfȪæVú$.ÿ½v\Û|Ó½wæ¯tËá(ž³;ÈÎ^€}¹j:Kª7JôÃM·Ù¨®žÕ$–Ù>qWи^Sð]3Ýú܆M_x×il—ËÈšq:”og~±Ê°>°2á³ 'ÿÐiÏ‹¾Á¶d™üEO¥ŠÛ'EJž{Ø)„œÈ˜I)$ɨ#t¼u¢ÙŸgçÉ. ³½>èiû‰'zxüëGM?ýæH°²)P›i3*í©Í/w}~¨5-Î_sà*“ÓDyéîë§æF‹#Å,¯öM’œöˆ;yšŽßÇŒI;¼آg_vëX_ò™Ò“¶ õ3‘&‡.qÈÒ¼c¿¬/õîëµÇè\–© _³½<ìvX?+a J›`!¯N<ߨéÈÿÝ)&¯Wï[U] Ñ“/¹¹ñ§*û¬¡W4¯Ârý%ãB:‰…¦j¤áNðù§1 3ügFï;]N r ª8Õªß×Å%â—“­GòÕ•#?œÇË„ãòƒ–—ÛBe&l®íVP.t| I¦õ€Ä‘0«Y”í°'ùüYjˆçèç„F§àÚHÅD?(¾†þ“/õœÐ×y‰fWΜ}Ã’”zñáœmKvÍ׊ð·Iü·h^&Z¦2ÓÒ&¿¯®Â;hnT°c¯Rù¶èä¹ëjfÆFx:Ÿž5\Ìç?›•4c<·ýÚ½ +C–ùÝ“Sèw²Yù­’W²‰é[ùeGU¤f‡Cò›.UL&\¢Ûõn·ÁPÔL;DÑ$Í©SF ¹‡ yõE´MÄ UØ9âWÇ'ë¼Pi¬eSKDG¼—Ê3çòØM¶áólßw~Úµë€Nf«à#{ˆ'/•ä%ŽÉbau¹mÛx&Z%zw¯'O†e.!I[½¢Erxzhd®EÐ,åNÁŒZˆÄó^ìÚ®0•tÕ„Žßí[6ÙçÛhKwosJžH¤þBtf­jl‹—íÊwqÙ×/_e$}ÞÑî|x!Š6„¬å윑Ý2ãM¦FM¸›BýBÓ·ãÜÉÍï/‡4¿¢S“îœ×}câÁêD¡tmˆùù{ƒk×®•>f‹bÈ1²½ÄK¨Q]P|닽ÉWïûƤŊlí$$†ú)êG¡•¾Ã_Ž^[\|¼NçÕJÚ‘·X™±]ÉlHâñ)’èÅ<µë<‡¥ŠCvŽÚäçc„:‡‹kÉÚgÓ´$œfõûîþæ&a#¹ iwAÈ4ý ší侬ú³FêVÛ…ñ«ó¥dM¥lÕ 2–vÊÖY¾CJ…MÞìÕŒW_Ê' aj§x]LÞrŠAÙÚ}ïzŒÆô½zTryþ휔”“ìz¢=ûI7m:;ú¹lÇ|C쵆Ö|ŠÏ7>5W'‡>â;Yu:ˆvpO·“Ù-x_MMt:%ÁISš%Âs†/¾©÷…÷ö¦Â‹yhU©\3Z©ÊÒUr{kùðµ"8ƯH™§'%³ÖÛŸCò÷¤ºžÙ&#ÍÎþZÏ ö,3‚ßkœ†ew-¥"MçÍBˆlÎ"½´p”ò¼%žmPĶDy¼»÷¿™h};2>ë|ËG]­à:O¹Ô÷¢JÚwŒnm~ì_+?åjF“|;ªNtÏZì…¼%Å ]u¡•GdžÌÍrä)ÿ¯ñtßÌÌÑ´CqÏf¤x¼­b8N>Š/ÚÔñ^Ÿ”Y¨§Ÿga^ ô¼í©1§)£eßåe#‚Ϙ(×QM9?Ùç§RúÒPä™CÓU£žäY;Ë¥o*§.¹ ’Ë®§J^$Ûßs¦Ê€ n}OŸªOôš_×~S¼ôzi]Ú0˜qª¦*Þ‰¶žk>—ÛÈ’ä]£Ó8ÍÍ{LRO÷ê*´´v_QRÈfGëmW™P¾ßhÜRï¯iT$ˆß>+`Mr–Ÿf$ù LÔa©rïNÒ2¯¨c¼¯%a …I4~epêÑ>»—Ã6U0VCÓÛƒÏ/æ¿Soª’úþn¾“d«_çЮäDæ"ÉÏthh^ÈŒW3´Éð}Kãçq±ÏÉé"{™Ê G§·ÓH?å~õš=ìÄX‹]"}Å¡¼ÓØÙ}kpy¨±$rÊóhR\£{äP`„¬ê Ší†»»™ÂÄoòWè‡îoΰn™¸|Kj¨™þœÂÀ1Z3‹Xw€lØ…£²‚¦x:^ù’E8K}P÷¤{ÿ}?£ý|ÏärÌ$&à}ÒZ¢žª ä?Ї)‚.æ» y šHM}ôúZiý»ÝR[òÏÒß S;¿½,¾UNïƒ'|ÆõdSgõ®ìª{ìnaÕžþ R¼œœ||<=D;”Ù­¿¶Õß—Zöý±¬VÖÛÛtvÄ5ÅJÐB*3Hv} ¦ èAëZxT‰~/Êæ+Õ³Œóh¼éwëùƒÅáÐ=‘TQ'”¥Ï¦W¸T¤vtyÀîê ¸íãjá畼[·ƒ¥ó„ïå ŒgÓQ‰ ­IO™.P<@ëÜ(+çV5(‹ÎÊÛ5+ör 7uHŸ=_g¦°¶/:â3ñ‡–jªtÃÏ[%õU0ýºœÃAú{|«¼_œë—ûJyN¨g ¶ìE3âîÜNgeÙwÛhþJs‹S»pû÷ž&®Jy†’y´²ÜI\Ô/>–Y!Ÿ­è Þ“ØÓ=rÄêªN£úUí®ó5%çvÏe!øñé¹·ÃÛëÙ…åÕ侌ÜÁo(¯5-U Uí0ÅÓ=¬iRZ|¯¨/ ÓvðÉcTñô¶%´]fQœFUnà¤OÖ!üÏ·?59Ȳ·suL|¯Nh™eE°†<`¼é¿³L"öåÕ<&»¥ÔŸ¸dÀBr{!çù’QÅ+Ñ7ßwÈÅêêše휇¨Ô+MÅ_oE±\l~›I}¯Ðô‚‚Õ…¤—œ£ÜfO²{_ÞR[¤™Òž¿À!JšK\®¾°«Ì4‹èCntS¨ µRÁ¢¿ÜûwÊÆI¡e7…3‹šµS£,Ï[yLD½éÑ}ÙqQøÀØÎ*ò”ýo•áæÎöèÀŽ[²üö޼þ±û|ñpn]íçÝ| ³ÄŒša‡ÔˆnvùíV1 5 27ñ–´f¸Ñ®((&ªê%*¢SngrƒæÙaßî×­Í’Ü´hÅëçÎÝŽªâüxR‰/ˆ¾|@«Åwü Õ½kYÞµ0»²ÖAÙáGH˜ól‚Hxy/}zbê¦ëáFëxÈI|Þ×ä^@K¸ f¡DЬš¨i…é²WéšÌÓ–ž¤:NþÂ>}ÈŽ’Ò8ä'õŽ“ šNÑøðwæµt¾ï*‚?™ªj›#´.=[P\jÀn‘S ‰rW6ΰJxƒêK63­NUò«‘¦ƒk?éMDt×fÐo­›–.x5övñŠªé z©â©á“-žÇVÚ²ñ]šå±¥‚‚¸ŸÒ‚PÑE>wÜò>‰FyÇUÒ–¾ †<›Ðƒs›½ò0·$²ï=ÓÝ•’O¦õ(Ù}Üüö%Ûl§ƒŽß"moóñiܽd U*-ÉÀ½+}û^°µ\ì±AñŸ8ÛÍ”Ò|zlH1ECæöŠ—q"П¨S=cø¶ô!q¥›xVKOúùã3šÄ8´\ÍxVÍ{ƒó÷3s¹m@8Ô¢èY¸Ûe[2Vý½ŒûðF±{ùw\«(عÜØÒ2«ò%ð%5ƒ ‘ÂÒÕ—tÛœ·W ¿È—䪦r £š4|zþRÑí)Štÿ³ƒê}·Ž-R ;°/2VŽD _I[ˆ¿ö¼ôÚ€à)ÉýŸwUkºÊs¾Æ#ð­¡æ²˜HÄ >¡~ø\ôb6Yï5Þs‘GÅ`_Dvž”I„½íz.ñDÁxgV|ª€FLíÜX:ž­µ™í³Éž¯´>O¦c?ÕÙì,¶Cžý:»Ã¶cÿDtHDò{T¼rWIWÊ¥v"uÎ|5²Jq‘ò½™9æÖÏ£_‘–+½Ù\n9A©Î¿ûÅ{š3ªÉÝ+ŸÓÙÙÀ`z!ª0´›C¨®›½CFg‰=™PétÖÝ‚ï ùÝ2|9öþ n sTewjd<¦ÃÆÅ~(:Ùræ8ˇ©Gƒ¨ïP|¾êÁœcQýn`'<q…ßæ4-)UÐ:¯ó䚣÷[o¹“|ç–#ÏÙÏÒ0 * ß—¸'N;ë&±„E‚çöRm¨TÑXZÆ·ó{N»Eãœ0Ü„-ŽÒ^ñ¢?]«»œ=EZµ7í×YÞó”÷S-£(RWq‹…$©Ö1{½•ìhWÜaøIÑ3ìà ϩbe½21;\U_ö1{à}?>ÙÇÌ-éþ”CíK—Èé KÑ›HÆ÷OŹ?5'¾;|€ð¹Ì'Ï ÞÜðÌó Šøöá¼]LÀÉî¸JüéâSöîÙ¹7Ê®Ô<¾M‘%öq' ÑaûÂ{w—çõ:%E¥–Š ïuuçÎz‘ÿÍ·£"g#+w¸Ú?9|n©ýéKº'(üÏ9ßÏÔŸí¾rY a“¡ ÙÛÉ“à€˜¿™ª4Í—§Ý½½¸¤ýu•‡Ð¾®yÓ ü¼,oÔYáC‡¢¾±f´ÉŒ»ø1Uz2Å*|v±øøÝw/hÕ‹H5n½4ën¬sL€ªSvû¾{U…%½b¤…‚äyNJa~²'¬¾If ¹ÂW"§Óß7½häy½vâѾ2úTŽ^ô!Û1§üôèþëÿUJ)ŒÞ„Âé€D@¥ bööÿü׿!Õ?‚ÿ*ö¯ã¿ŠýoÀý;ýõoâ¿þ•ªþé1þƒÿúÿUì·ø¯bÿ#ø¯"›pN*E¤7ᵊoÂM–û+ø¯@ 6cŠŠn +¹é𔔤Ä&:q±M× Ò"›1k¡â›±c1ßm”Ebs{E¥7]•ßÔ^1¨È¦kÒ¢[`ÌŠ‹l”YDL\ZâßÁVÑP––‚ª¨+«BÅ%TÕ¥DÕ6KIJ‹‰J ‹BÕ~O±ÿUBDú ÿ‹_ƒöñÇ¡ÿ9üÐ?Çÿ¡ÿ6࿊A…Eþàüçñ_ÿì?ÈÚò<ª¼ †¬ô_‚Ñùû:ö-t¬–A´”ÍÕáê¦ÚÀ?¸¶\‹”YAóC!¡AúîwE˜~ì@Œàê´±¤šÊæBŽö?¡W†)Ã1u­/ƒðñBì«úU9ÃÐD¶UQP;ÐHliw4r-ÛÊM¶ß²V5Ô7R6ýE pÀ¬½kÅü=¯#jË«Àêû7ˆ½€ãRÖ>-dYs\nàÈM@m0…›ÀÌAq@bC PPÄCúÜ‘XÈ1°NjW”/éVs!d+`FDˆ…daHøʑüè+bx…3ÈÍÛÑDI÷Å„©ÛZ/_Ÿ?ð¤‹aˆ¯Zâã710_Ü·ŽùH ‚èÜw,'0ÌÆ8yˆ™žÀ ^s¤üI[À¯.H„ã_£Dñýk”~>@«`ÜL€ÕÃrŸ> ,Žõ€vB>Îд RÈ*ñrUX>š X¤ŸÄÕ $ øW$Åí qA×}<==°L!`{ûÀòˆyÀ1†ÈA´4´¨«™Xñb†ï·zo¹& ¤¯ƒË2N£kpI,„fd!N>@… ɺêp H®f`×RWVÌÐXMÕÐÌÀ›ì9œz¬'S6ØH ¿Ì‘U"ò+ÉqM]f,Þ‚‹¸ÜLu`m‡™”póÑJ“–[´Ðn®^/pè×ÞÃ5Ôb ˜á_éb¬v€Ê Þõ‰© «•8 'à‹ƒ§#„ã°\‡‚:Ìã t›°,ÄÐZ܈?øù× ÔMâÄŒ ÚÞ·„AýÄqź³¿3 8²f<ÀÏïÆd­|àÇX¦»É®\]îóÕž[Ë7v0Ø/†mc +­Úb~)ÎÉâlƒ›Z©ceXœÿ]%RÕS61ÙLªÀ žºÁŠåö®´l‹Vã¸üÏ4yUeT1S.PoT@ (©»§§Sñ)ι8 ]ÑPÒÕ„‹kµ屓õÖ"cffŒv®a,îN«µ¬© ë´%x×M·I7NÑ¿ëŠ-ºc]—à¤SÆ¡ cƒÎØÒ‚ÒâÌŒôQ<WßeSà !¯“yþ[¶4 R1&BâÁˆ ú`PÙÀîÂ"]óÊnh?ë2“¿Õ| |ë_jüúÚ–çößT†£T€JW'úŸ1ǯ¿ã‰‹?~ÏmM².ÆXþøãæ"\Dµq<0k0îÄš*\DBE۔ǭ¥®ð¬íŒôtâY1Ì»5ëìãÿCPÉ\}‘>ˆå`Ó|›£Ö:âuaïj-úàžvÃb…÷F·ì¤WCmœ¤`+WBÒ_Å 8×µ%áª°ØøÀÁ‰@s6 ÒÇp7+믺ô0éz»­gµ³7b&¯Plˆh–ƒ¦•6!ÕUàòÀå0€pÎ(p ‚-±Vl Ñ—«À´kmÀ„ûÿ‰·®üoÝÿV–N®Î‚ŽžÀšüŸÝýÅû_$ Â¢ügQ1QIð»°ˆ(ýgÿ÷?ðYÞ)Á-U 4´5áj†&à6n×d«{˜ýùó?ÀfÕ׬S@ˆ D \0:ø œÀw+`ïnÄN‚àŠbÙüÒ¬´ÙHYUWYSaÃZÛê-ÌÆ˜: f`×Z3)‰¬'ÐT7U70‡ü’ÀT[_ÝPCMÙrKmCUS=CU]uSÈïàÚ†*Ú†›‰ô´õµMMÖJº³·©ñ ˜ºªùú0k  ˜¡þO LÔ Ô~ÉÁĦffôkmU}£_˜©‚›´pe55ØO À.7WÖÛŠƒ¥ ¶GWºb \okýœÀTÙtµ/· #u“ŸUJ·N©6˜h›˜ª­¬ uu5¸¾²žž¡êO(`ê¦&Úš˜•éÚøš³Œ Ú¦ZXq_Ë\3öC¸»:¹‚ K  ¢õ /8©;ø/ÿ·}xx1[=ÎHL,ãŠròäáZg_ J`ú® ÓYQ¾ëIŒÍ”õ@ÑÌîçÖ|D×µ·5ôçµ-“ˆý†èGóu$kzXÕü7íZGòS‘×QAÏHì7$¿4ß bod³ŽDt³Þl¢þžØïIÄ×î£=ÜŽŽ>?'—ø Ç•nøuóàÚ&psCmµµÆ£b¢†9Â&8òÀáZÚšZªp8/$$bƒ‰~yVoj˜aîqqAV~Aä b¼`|½Ì ®²à¾8ypÇ€¡™"|ëÁ} `g+Gë$PÓÑ42ZËnÙÕ©*›¨oô—›© 6‘m¦Âù€ SÝ*se˜¶²š¶*à}Ta@| ©ªŠñ˜…€ Òá¾Eæ³—DNDšÐõÛíh°–Fù:~éë€ÛdŠm!\_ÛÀ†é;L'/× ×7‚i˜j`v=”UÕÁBËçNH÷u#e¡lªj¨ŽÇ/zKds¹åþE¿¬í 0“ \|ñ yW¾ÃÑpà7ïš31Ì ’)Tt#ce Ì ÄV'H›ú}͉á_$^9&ü ±ªž¡ ÐJÈ_e´ MLAÞ¿'ÆŠþ5Îk_ÿ2±©ªÑ&êMÄF§ŸÁi +0ñ… æ?UCÀUbKÃ# ^Û@Ãð7œ7Å-¿'^+ͯ-w}¸ò37Ó6ÜrXÖ1’X·‰ÕÖ‡œbOæ“ðìB<}—¿Ûù"Iq Ùb‚ñ‡Öðÿpþà·ÀãS¯hà7ëQaaÉ ï…ŠŠ@ÿ¬ÿÿëìVÛÊ”¸Å.Àf Ò ‰ìO&ØŸL°ÿ¥™`¨•l¨U­'Eú"}P«¯p]uš¸!\VŽdíO{^ÙµQà:ο`ú+¼ ¸µjm-›æÏMö vÀŸ‰ðÏü¿fþǬ[þýÄï¿6ÿC±ï\;ÿ‹JBÿÌÿÿWò¿ÿLݦîÿ…S÷š×®£Ñ@a²’7e#“®›Q׺?póá°‰¹€Àp¯pwv0ÇÚ˜twl¢#â ¾ ·wµ–+À͘ӭm!ò¸ãv6“•8CÀ”iw$Ø•lØÄa6ðÝò¸ädìù7r%Wìp À“ó-ÈÜ®hÜûÖ1¯zvE¯¼êùWì‘(lK°é³+¤žàëž1Š ª£“'°4ß‚¸—‡!‡ó|$À“Ù ðöôÂå\l)€F¿1/ß×_#4˜¨ò‹»Ž«.ß7Cá,ì5GGŒò8!<\ÝΓh¼|WÕÓÏ}ÍÛ®|!«ò¢—‰@hQP;\ÀÃH!¨[Ъ6X!xl¹r “ŸáƒD8b_§¾zÇ` cSWVDrA PHwÐTì‘` ÜšWÇt]“°Ú¹|KÛÝé -ègó«%Á,hd%åÛ;Ž(ÀIù¸:läáâ ¾òó'œpoævwµ÷A`Òn\}]î®ÁXOr Bú‚Δtµ¶/Ü=±}áêåâî…ðrrtwß<"À:Ô¢‰ô5@ú‚O¶!|«ï _«_Xp@ €ìŽ€K„ârzy09® òapgóC;/.ã g°¼ýË9PË6ÌË».WxÙ²A&¶`öËJ‚Ž€Íå†ò @±ý¯ÍZÙ"þsFú‚ç,ÿXø÷»øOL —6ÄâÀ¥?ñß<þÃ=¿'þˆ @Ô(WÀó˜Ñ=ÒÇù߈ö6…z›Â¡_E{¿ õ°ÁÆÖÑÞß õ@V›ËþC½ qÈëo„z¿ˆó0qÕÏB=È_ô0ÑäºX�Gó›gÌÖ>6¶²­‚ss<˜¸)÷w‹G¸°uz‚àpð$àz 2=0{bnób3Ÿ<Ç 7æ27lWئë=a£8óÚm>ì¯å¹\WžèÊs 2P^xù’½«¯ ó€ÇÆÇÇ€²×TÀ½@'Üg9]TÙ“<1Ç ½øcÆñŒB—: öæwàÄŠé¸+fªÃ‘^¾A<\<¸~TLk™š››ºñ ”R.PÚâY\x(áZ¡Æ[»ÚÊ®æáZ€Y¸îA\í*ëì ¾˜”h‚æd¦fÁ÷ xæ¼ÌU~þÍÏÅ`G á€B¯Ž¨¦ªF`’0 dlË'0yp,ÁÀiu\ؤaOPk«ŒÛLóFc®!8 ›# ²qÄ$‚€ï©\åâ Äí_Ÿ œûkDýçé0_e±õè/w¡¯Ã_ë5CýôÆþÅ8¯ ¹†þ_fÒõÙù8þÞ˜§, XoëÄÝNɸQäÁÙ 8 ÜÁ1òqŬ˜Y×?îò3)-`Ú¦EÊ­”1tå;\\Ž­ãO*ùÏâ$ÊÿŸ ÿÿ‹ˆ‹‰nŒÿ¡Pñ?ñÿ$þÿ³ügøÿñ `¶µnmÓ¡.6QŸ”tÍ0–tÝa+ö¬Ã˹{p m¨(Ü“sˆ›T°‰á^C—^Iÿ¯ú—ÿ˜ÿ—Þtþû³ÿóßËÿÁšÄÏrVîþ™;þÌÿ¿ÈûÁM¸Äœ¿0Qü6ÿfÙ†þë¹7[å }á¸Ý!èÀÿK c÷ÿ%APGI¨˜ÿù'þÿ}„lØHkÜ8¸ñºqÀ¦5} '’sÆüµWr||ÝŸƒ Âo¹ø¿äÂÁ‚ÿ†‹ÿËN,ü/{ñµ…ÿ¦‹þë~,ýo8òuþw<9Xð_vå`áÑ—ƒEÿ’3Çè¡©n;NÝø3W‡™@ 6q ñqpÁ(6@e¢T!Ýèë ¯ÀÁACClw˜ 8d݉fÀpp(ûaó0U™X™h› ¡€žP¬ÉJÁœU&ddÞXM÷\`ýÙ„“6î«“‘À:¸40ÑŽ²ù*\i€Š÷gœ±Mû{üÁ"?©ÄÉÓX5uU˜¶‘©¶¡©) 6N*›šåЬœÙ¯¦ €Jõó®ÄÂç —°Ð€ª |19€¿"Ò†­Ü Åæä`.â8’zybN@ã@@Ü]Qn@9 Ü`zÛvÀ¯xºcŽÖJFºœU‚Á(Ä Ÿé²áâÎ-Ö2_®áãŒ1zÀ€‚@“[°ñsÇÖè>ÒßÕÓMêz!@ÆåÎsÞÔyXº X¦^iHˆk)Ðÿ 2à!±»çH ½*ú_&ÌŽ-<€Ýo_vˆe÷²ŽŒÜÔÇš ЄeÏŽø^[?ÔJ 0 ð0‚¸³G ]Ñ€ÅY9Ó]ÛÄ¿Ú}\÷‘nÑ}8¥ÿ‹¸¢î¹']WsQ09EÌDø9O_PS1ÈXË‚_—U`‚a²¼0g(€3&C‡b³F`!ˆ‰': ´Ä«Õ+ü€–á,ËËÃsÚ‡û}½¦b: „bA¢]A905zø¡1³ÎJŠfn$gw,BÕªî¬4x%̘ ž( %.®^ËGŸ[¥†8`à‰x:„öfW{À<ƒ™Í6”Çœ3] ”ÿŽ[ ‚+¨^à!(Ð~GwŸ¶‘¿fÖ¾H¬íŽeÓZ‚võt Bb† |²|W2XzYI@Ï÷Ä@ð/ëØÙ¤À%Ú ¤ÃÌF†F+³ÑZ“Â(ƒ§=ÚÓXC“›Ò L°ó!¥Äžj®(?4Â)DŠq³0uS3˜Ä\YÏLÝôð[X/)h'¸)PqÃàä Ú0Ø „»-ÌšFqËZ”.mƒ?Æ$¢W’Ýפ{aFb=O,)ζÁ2Ü€]ø#\Ý1CƒÃiY"]~`ÖàV<@œ3¬Æüt€¬HAŽ®( ¡®[ò3Õ6Ð6ÕVÖÓ¶RW#ý›ÙkBØÉ]]¢¬gbp…mžbÐþ`$Vï®ñEî¬U¦ ·ý¼ÀñëS6WÖÖSVÑÖÓ6µ$ý¹×Û h2Önq ’‘ݪÐ:¯¸uQ!al‹•ÍLµ a¤ÚËyžˆÕðr­áaàMÑhOW„/Æj—{\@s *ðù€“÷Darð0xŒ) ÄõŽö·ÕÇá=ìA¯P¨!°?€ÊE……Á'Ò ÙJàúÅp$:4 °a#WwˆŠ;øx)àö@&–ÀLÁÕÊ ;¾œÐ$U¤£«DÐRˆÒÞÇlÁòâh-¸¹Äµ&Ä\aJŠvñsrróPq^“±²bXé-/O`¥àæ!lïCúom©­g€Kè’\|cB×Oñÿ}}qøÿ^ŽNÿ“ëq¨ˆ¤ÿ ø")‚Á“ý³þÿO|8Ô4€Ñ#å|8‰T|õÝ+¸×]I€ïÇØ¯yKd¿¸øÇÂÄbÞsyoK`Æ£C¨¡šÐ~‹1F÷»|ßò’J ýtÏßFWÚå ¡`œÀ-ê×ï¨ò|&š´øo‹UOz!EÄѨ’>ü¶ÜÓ­ƒ»Ž‡[ïÛÀ‹ÛÍû®©øÀõ髲BÒ½¾% ü0—w"‰Ð’?€âš`4PQ®È5ÖK¾Ý\Žö‡Û8D<£}?4þ,¥Ââ}ëÍ׊ɵzR®Ï_Ž¿ xLz#$CjŸ'Ó¢“N{÷mQÞ¬¼Ö0hN‰3gUµÿ÷'c…2‚ó±ÜA‰Ž=it¬ ‡ã’JKÍ™ãû Ûèi˜¢KžY\è°¨iÛ!prîKy’Îä µ´ûI‹ûn? ž )¹°!Ö§MØK7µPž˜t£:T«Eg¤>5Sp4«ói‘gЬ™¼bÁÁ:¡nû¼?€Žl¾àìø^‰ËG‚ÏìèssÓ”¨+ÛKár™Ü2äN`X•”-=º,ƒª[´/YñòŸ[_ÂWiÞ|¹carþŽêa"÷;53õ“¯]Ë»Ö|¡³3滈{·9±²~ú·è*®BX êªA„\ÀiÛ8Š/µÇ½,)ûû¶0ÁSSÖÇÂtdÇT4N©T·³†ËrfT׈¦Åß»wÿ¸ÿ0KÑHû±xêi‘«S7,÷>c¿å'Õ]“ÐsZÄ@½FB§/ßÍW6X,+Ù“Un'dßBˆ÷•¥Ís<å3²’,d⼎åEá» áÑqÊ3K4W;yã¯gù¹+Ùï‡ {ZÇ_9ù-}Ö­É5>PEŸ¿Ã;¦ô„éAAççÇ|FOE‰­SPÞä&ý3ïÞšUŽÓ”¼òQ+œ»òNeÏT‰ÉÍ3ÕÞ1íyžJDOukŸ‹}ÀzÚ#‹ÓÊL}ªXíöU–3Gº}‹î¢uo>›6ÜiŒ3¦M»ÙÙBLez.w©6É "¼]åÍ…„å0ݳÏ% Îê²A«yÎY&\­:Ï ïþÊ¢ziàT1ï¤m–ÅŸ4õÝ|,~-EáÇà3™¯/íñu–1“v'v‹“8˜àšÜ—žë®Ã;$µÍë|ŒÀ¥;ÜŠô.‹Då'ͧ•D\n¹C.¥](.ÎKóæGÓP6Hî×2[$† 3 HÒ|p=/q kxç$êñ°²w4½Â¼æãæ+¢Â×é©……L«ý’ã¾6¸œ¨í«‡&d…Ýœl›ê0mçvEÉÌæ)1FÅÆ Î_ ù¦ïôfÊë¬ÃN¨¸ƒsÝÐ[Íb•GðïÅ=³M™uô´æßØTõ~Ìý>(¬Ö5_Úò6N.ý~è]qŸv^Ökn~÷ ›‹<ˆph]ßGpÅ£äâDÿ7…‘¹Ä·ªâ°ÞCÁ«1á{O²Ê.T˜Ê”£6ïiïG×ÈѦµ¡Ì´©%D#¾m3ªäÍ0š¸X8}=®Å·àͱ®—°’XŸPë^í¥:úÁ¼Ù'ÍâÙŸ^==2¤­·C0ôÔöGYÂvì7¢æõ/za|ONà€òa*"VaHÁ½{½sôþ1á3ñ ‡º‡ß•êÍɵ„d-Æ>:®R1Êa†Öì8wkïhü1—/½F:“F¿jÇÓ;Õˆ„Ï5å(KAÔðÈ4égå߀6J’¤(|¼¯Ô¬LžJüäËõNŽû“e.|…)Tfªé#/îóh9õèè tNü-ËÃ’|áíÓ6S1‚ŠAz7O¹'Þ]Šo›­Ì½˜æÿÕMÄÂp—*›ä´†Z_®ñ±ê×éì‰:§Ób(î¹O©txé3ôXÍ69XyÖ&ßÄÓBíþšš—沟`,Ÿ«ùqê×ÿæú8©Ë3~„î×%¶ŸººïëL_F„µìKó…;ðlJ›ýzÒˆœè%º‚šš2‹öå""¡êJ ¥µª˜{ÝÞÒ~èÎ_ /nøh4Ê”víò%?…íFB£]ex÷팤ë-{ã?ô:.'Ó4ôˆ ­¬üöš4N¦â"Äà®Å£Ôg—žtç¦ìо{ ž©÷…¿ç‹y™$$'9¸ ½‚YK:ÂC ù„Ù.¶gä2ÕéŽâXf›Ö쮊lÁÄ£Ôca'¸‰R©8?¸;zð€äãˆz–ŠdЇìýëelÅ÷jè˜ð^-¸²T8‰**ÉüÿÚ{€&ž'`ÔŽ€Q,€zz ¡A„^“Л„’„$t,ˆ¨XAQŠDQAQP°aEPTlˆˆ¨¨EA,¼Û»$,¿úÿ½÷}ÏSàÊîììììììììNaÿûê»ãû#…nˆ©T°˜}ä33šÙéG—=‰Ù¤’ùˆrNìqñéÐô#÷ çî™ö5ךٲöäæ tWyåHL XÉx=Þ[Y;{AÑMŸµóïlmÖþ¼9„x?vôuÍ…¯ËžI˜;÷Ë/Oú|?’¸{òž¶ÕõÇ &gù5þ…Ж…IiÅo[lÒ.œ*þ8G éÎëç–ä­Ê…_-¥ ýOœº¾~R¬ÂÇÌ JrS§Ûôë§Ü—»òjó`ÿ7©Úùµë/¼YB)Û±ý‘϶°W&©+ðN7å§K‰e|ÛJio©sZýìvñQ\|]dù¸Ð¹GnÆWUíÓÜzÎiM‹õ¦å‹ç×ÍÜYQ«Ü’n~YàŠ¢Mãæ¬EnîOºû…³ß<ÿŽÝ>7ð4‰ûNkD¸ZGrˆY@%›Ðc OÍV[_ÒÓÒðÂèÈŽu8ØO5ÑxwNèeÑŸHa{bไ!QbØp>| Û‚ˆdñø@s:œ#„`&ƘÂÏÈ„÷Š‹³ÎŒ >‚H0ß"ý“CM‚‚!„ È‚06Ôä)„Ö©AÈ‚!((üu^E8 ™M†gà\HœZp# C#‰¤;‚F¼êaí ,/è$–¯¹ ºH>|36VC‹Ä3„oÕ…°êè­žÞˆ<ú¿‚È ù×`øušY@~Œ£³Î¯ 6ȲT­`’Pý‘vá,¥3!,B´ÖàÜpT&‹m Ü'450¶dÎ=V‹q¥°ƒYžBÚ‹_üúß~×V)àßÈ––ﯱÉû‡>qÒ ¿ê¦ž>ò¾¡oМð`c<(PiApUi8‹Ê{憞tÂòQ]ýTw7±qÀÛs¨nB øŽæØ¿Os.ÎH]45‘ôšùýú!iu(ºh*] HGGù˽ßuaê*{ð„BEÒèê !!F‘'mma¹Õ9ïÔRœv‚s€¿\¬Á3·Í8­¿AZ üå¦mrhëðhÿüöÒûAs™ÚÙ™˜¸pš‹@'ÓF¶—þŸl.]ÍŸvnS o.ðþÂUâ²3÷‡¿¹Áo@„iAôUô·¾váAÓ DOHyH#‚÷zð§¡„Ð4 é&DT}¨‘ЄüŒû—׈üØqîu9÷ÜŽ~¸øh }CÙˆ¯#ké!¬¢÷k1Àe„"H` ò1¤Œ2?ã‘£<Ñý” ͨx…NO!M}LD$V@¯¬–:&*x&œJ‹dyó Í… gGäÑžNù©x7vOU¬¦¤ªK(m-}HG_Óè½Að`¨!„Á±üÁè¿…f2à p‚<‚‚À7UƒBÅ!kð#‘M wô`vÀ…„ð;àa!ŒŠ–– î°’ €!cü0þ˜ ˆ ÃÐ0t Ãİ0,ÙŸ‚ac"1`€Éò§3)˜L¬"RXS§h‚ÁÃC¾qÕåùUy¡ágÊUþ54´uyZ>Å%ÖñŽëìÁK©Ï]KKÊ…{ðå ÑáÒZ—}¥¡»\ÎÞ#Ó’ Ž¿°ËŒ™úù“ì™U+ 1Vz5“/ ?'] ½|èÃÁÅA;] /Ñ O?îºÑù9r·æcßöÎÎ9†=mu;¢ë>~þ*ó6bmfì¸5ձƅI»>•Ìsða«”¤§¼T_ÿ‹a½óSñ7_þ5S@¸â¨úþÐw,i¿4Öd¥Ock>Í?ÿ‚qï…2áºrƒ3>9GQ¢¹¶ù ëáûôAºÜë]’×ûÛ‹Îp™.¹]¶ò¼(‰‹/8a›æBÊ>rØþO¶ëöT—o«Šå'[Çú8_8žúmùXœx å…¤ó]!ŠÝ™%‰$¹›vÐZö¼¤æîf:%I–s£¦˜‰–ì~°8lÎä‰PAÑÉWÚl/Šn##ðòZåûØoèØ¤Êm•;¾äñ\)¹’ Ò¯Ô?áý™sõm¬ñ¸ÀóÉnZÚ]±ŸM‰§MÔÔ•Ú(ÕÝX·b»b»Ò–ê3ê'Ö:Ø’a·¬~â9¯_Âùöî°½5iû$CÇ¿ÜU§£7nZî.â@EóJê7=kÚÄÍËb¿™.g?úáí%$é0Ù6¿9>{¯³³Ï/ت¦—g¤Ó8kàiñ*‘+3ü¶˜î|Cwzî©6°úÚÔ6“D¬Ã;ëË_d¤*ˆZXñÿd[èOÝ5³«µúëN^k=IééÃÝÂ;Öù<9µ…2ôbLÅ‘çŸ'}«H‰oÈRú¼:qƒOó Çj™¶úoìäœ4U,ÛX-ašê>û9ôn}†cHGË«Ús/vs9¸ÆÀb—b®àƒ¤Å}¥'ñó´Ï3ñÅ•[j®_·¹3íU@ž" Oè5Z‡;3zþ޼ä˜Ã©ý8fúœ2½ >O_ÚîQhz%/üýÁŽ[k<ì¬o|«»´g¬©{ÃëÇEÉŽæo¶etÞLûºokåŠS^•Mx¼DGȵ'~P²hFù¥enÎxO=36¸‘¦ü 42(-¿&¬41í„‘øáK“ÃOå“ñ£X~îðn÷ºeï}Ï»RªkëNȉ­¸bQ·G¿yþ²©Ï®íz9ÃI=*aZÑ×üroÛ™×_vÖ•Æm¿é²æì-1ñuqk÷Ç„öÏŒIv>4k¦î{—Æ7Þ—Þũωš¡»v™Ÿ_°Ã~Ÿ@»²u¡ã“ÔV˜ÇÏòš ìÖé¼ÿæ¾OÚ·öDÞósÜzLçCJütÌž]Á‰ h®‚m!ºÊƒ èwz7Gžü²áö}\ Eïd‡gz3‰ì¬`~ðŽG¸Kh]c4µ¤¿#iopþ‰ÕïuNížPèÚ[°mÿÆxùë&Ðåwz‚ž=9ðžÞd/£š½wê[CUÇkJE‡¯Õk>xø-À|¥ëÞ™O#‚Ê¥Œ“œ »{¤ýˆ…•n§_ºžn´—x`ùÌþ•R•Qa 5§'=sî}Fݺ6Æäø5š¦ôÔü [G³—ÐNö|×]ž –Ó*P½à„ˆCŽTøØEZõûäB«Ž¾ZŸ¶áv‡°MYõâNR^þàmñãJÆÕÍ\fÏxèe¼+¸SÝÓèÕ˜³/®¨ŠI –ôÉU"Þ {üþ«û÷¥«¦Ab¯Ù‡j¢Â—ï+x:{ÈðöÝEzw×äL×î èm‹~YZñD»éüDy½Ú-^Zƒ÷Ç=Õ>3A6“Zegå¹Ó%ã1uÊSY‡ŽÑD?óeãe¯ri¾–õàÄ2 ãMVi¶y]‰ÍØt¿ë£²NÖM“¸ÆÈ`”ŸÖ‹¿.Zk÷ÈúھϷ“¯F®1,Æ3^h·±vÓn©Í–¶OÈ:€íi„ʶÆÚ<è)«?Úx<Þu³¿âó¤{‡îÌRÒÏ=¤!å,””?-lIÔØSrþ»F[&›ï=8©à3mÞdM}ógG ¨¶W‰= XîœQéQH »?Õç6í°®©êóé ©2rûç=þ˜\*j)ðäEÞyÑiµÙæŠÝ÷ô—[ôŒë‰[«ù~ÆÃ·¬™Íg“³f Hê/¦)KúøêâVåûÏ|Ó ZѹÐïÖ#oÑÓ)ÇÚw¹¨§ÝU-õÎY³2gs×Ëê”OΕ“Ž$Äkt¬É²ùªyï¸À¯þ;cKæŸì0L¿Ñh!òÙ¬{Õ£EXφÅÙ*"k6Ï6Ïi›ñm@C‰Ü‘MI}h\’&uþEP÷«óùuMk‰»ßÙ4{œÄún=á³»â ÞÞëJó_ô$Òé`U…:ûÅ\µ'sž’EÏŠÉæœ1ÿ KGO‡§9j iŽz:Ã4Gxç9ªküDsÄêèüRuÔÑäSqŒ)Æ ƒÇXb¬0¶;Œ=Æ㈵t ãŒqÁ¸Ãê%8S€Ie…ÂZ&pZ!stÍ LL "c¨°æFa±`õ“ üJÀ±ˆ&ÊV®0J ½CTs †GÀD z*%œêO£ÓþœÆª1BcÕø;«–¶–Octt#Þß}»àcÞÚm•ž£Ãý¼O•;çÜ;u÷±µ·¸ëbŠüáÄQ£·,™8WÐÓÞrb¨Iê8‰sK[WÙ<þ˜ïñÙ«yǦ¨„¥Gîì¾nX[©þÆŽu =Éomh´7ú/Uç¨\štÞ¯är—u¸u[±äz‰ªŒ·Ø­îµéØZðyƒ:KcT>•$æ8<™Úœ6êc^ºý éæyTîeWåE¶ªÄÚ‡0­ß4ˆE½8ÈèëÔì©{ûë>ßžDï/žnMتyàÌšEÏ…ñ­‡'‘iÁ!æ »ÚE#̽ÚßÝ.ðÜO“”ÛßFùòDz®Öwk…‹L…ZèÒ¾Õ2V4Ëæ—ÇT߯*JÙs!ÜŠ|MÑý¦QµñxÂ¥1ãÚA>µ ¯Ça7>0·•¿°–rq’Ÿ!vë\¥E炨ɧSÄRŒ.ªø©N¶ª•í“èH‰½8¡u~«¦,ðܯϙ"œbwq^«¿¶dÛ§U™&•¦'úú©`7Íp°…\¦¨\Xã¦Ø«šU~³±.Dê™îþ%µ¡}QQgož6Ž5>˘áÕTÒô¡ÉbßÎ/[M²–VœÁŸÙ|¥xF¨Ôç;å_—}[–üìʆ'Úßn~[ÿeÇ—#v1Ñ&·V];åÛ·{—SîÈ Éo·Ë|0£e¬È·j«sîËø—–¬v5xå–{¬3qŠ£Üq…¶¼ iÅû6¯úX˜´€‘“ÔD«-?çu‡fx÷Á”‰ÇËß8‹\ƒÄ,·µ7¼'8îS>œ» [G?o•À«éŽ_¥ ô¿ÕN?wù“¯¿ÑJbK€^r]¹ ›™;ïíÊ1O( ó ‹r“4nÜnwB;d©Lò€•÷NóY…—®È¬sz8qáhÚ¸Ëí§Nyį߻g¼£·ûéñ–ví[ÒnWNOýV='ѾíÞQWW ·È”ϰ[cßê²Tºùù…©‘bÇ6_'ŒW,Öºn.|éódæ©ø9ãË[T<.X¼\ÐÔñB@rÛÓK9÷É{lmÎkÄl4¾ø¢êË»†Ýǧô¯Õ_2K\=$gþ´¬ñÛ+ž»"z÷¯Oó­8—£ˆacçœvSÓ{#IóAýÕõÁ­3fØ-í7Þ7×g™±ý¬åf “ŒŸTJ/Ýx}^TXÆîËbEÆzl'õu§žšô1®v«Hå?óßæ¡ M¹*tgÁ»µÉÆbfþ{NìýV(ø€SݨmtÙ ÷ÈKÃú2‰ÛÞÍrtû¤¹¯œ lœËa'Éåí]/l*òN•ÛG笜» iÂMO±{‘Y+»—›R»\&pWrèƒê„Os«æ“ÒO»fHl[{^N¼q›~z¬y¬tåþ%/|Ÿ>8¿,–°èÉü0»SýÜ…; -¦Û$JM•ê ‰6è»ûV`ªÅÛ=î Røê×ÁR’u7-nզݞ^ƒ™Ùç~O7SBø©­ŽÌâ¹½}5+“Ní˜ú|«|ÞNk±\èó-†\BP—ðE!›ºGs%šLÓý–.ÔΛ)(™^¦"]±îõ~\dQéù¦0ú;æ3ÛгÞßl<3ß»©±hFWðôž u‚oÝÆ»ë¢W+{eNzri߆ը`¡^ ÂhƒùO}”Â]^í=8YQÐïXþiöÔ Ý×÷Úv?:pG7êÝ£y*ç$Ôú¬âl=¾UÖ­Xç”-PI‘\v¾òεöÄ;ïä2_Ï ;‹XT|÷¡Ö|Eˆë>‹€f•õo§Õž+\¦þ1cŠ÷ƪª1ZÉ áw–b`§It­8ðºuAŠ–¤ãž™®êA+ è>o§tMéïòó©pÏ|"ü°¨ztï¢íÊ£Á¦‚²dÚV#õí[/I.U“<°vïÖ2n"UßOØD’¹£Â„‚%“Üc«ÞTõ˜™ø(^JÅÇͽÓå¬`ªU®é ó|uû˜ão´Æ÷ä ½H“LH—®lZf©}{£cc¢}k¤æ¬¯l¯üÛ“? ¯«•uØ®}°·djû‚;wòÙ.–UÊ^3®{fãʈzRa‰84}׺OQWÇ ŒY®ùðÉ+uŸ‚ý1î‡Jð±W_|¡&PuO!´AdãvÖeZ1E쫵IsqÓÇú´c>øèù¦ùœ>ŽU6ë•ù~CChõù­1e™ ÊìˆˆØØäâ©ã$CBq³1v×\õE<Þîyã'+:=>4c¼æÅšû Ûv¬H9Vê¹¹;sÓðx™à½´«º”}yÓì ­ïøï6¤~=«v %³¢°ä´X¼ncì¦×H™j3o÷íf-]úäAÕì ×É D=È .ÔŽzÛLéORöÁ—%¢œÇ—æÉV½7ü4ÿ,£ÖäέÞ+¬=ƒºò†¾^’¹å;uΕØX,Мg>óXÄIŸ9é³f÷Ö¶¯ mñe.Ù? “ï$“â[¢0áÆbÍ%“vjv+O{sEâ˨.ÉW·©–^¸gÝyevx¯çS”›ˆj8µãìxW)øþcú&*ñÝô@Òi§#‡î{ïmÉÚ}‰!ÓŸŸÿÂ’XåâìáD Ôº*׬K\'¡ÏzüXôå-aøŒ°u©)ïzˆ¥‚K°¥š}2qµw/"a)åÊâGßzÎ)‰^>Æõ¨góêͳšœK³×ÅOm2»U=j¡ì¿Ó#c‰»aáz‹`|Jñi³‚¶²’®ã|iKï`ò2[ª¾B±BqîAV­ôÞ鳑WìåY×Ô<{i}§TzÔ‹mlyÖÓ ’-ËÎHL¨.#/y_mU).·FpÿMhö5À’®²öægltoÚPÅõëÛÙ–‡{xÀ=ÅD\P"û¹+SÑç¦Kx\”I÷¦xj·jùó‡õ9g›.*ÚrÖìÈÁ1]¸ÜŠóOÇŸs^üîÆ`Â×Μ¸u¢”ȉ1Ñ.ÃòϦN+5 º—÷ÊesÑ©={ñçvôX˜›‹éÈ/ÕòÝ}lùÙ/W×Oؼ[¼2åõ³#ñ†ƒrû g±9*ØÛúÅÆXds,ÌbÜœ¨Ü£^ïËI+Y–ýƒwDôÜØ5˜~g}•¾wšÏ7Oû+£3úǿ̌˜±A¼|§‘ÌÓÜ‹©„N ÊÄìyø°þMgðñ¾•£']ê´QXµ™FÎÏpR¾»ç [¡Úlç¢@ÿÓsÞá 61§ë«¯3<¶=Ö|ìÖ[~êYíR… óþbCÚåí&ä¸3Ði¨( TtM¢}ÂZk=ùIûãó— g3®Î3¯·Ãži¶6ÊÎn}âg[é2eïei%«fM3¿ Wò÷_¾4Û¾gR¹XüÂïˆf5?ïO§N® ž½0ï•aJÙªk”UZ¶u ´ÊzèÛ_U25>™²æ^pš`õœa’q¡ïê],»¦zM7²a$vç¦.Å–½eí¶m[¿Yéñx]E¬RW‹K™ó}7œÈALY¨ÃTvhÕÌØ61‡Ï~o诧æÎŒví}®îZ®ÍÒÇ÷7¼¶es÷ã‚Y}uéÑÏ—8õÙÇxµlQrö¾tª¿Ü߇YÁðˆ`Pn0ãÚÌØE‹ÓvŠKìÖ½"]0YÓ½Äù²¡cûòä ¯ (ï£Ç>¨Þ±ìóÍ縣9‡ÔÏ”¨k*Üfzüè ïžú{ŸxéËÆèUFÛRu­Û·ÍÐëÍw¼ë³ÚeÑý>iOÆÏ’¶ ZôÕH_c¶år5EæKÉÔ}›w¶§žêã4óÕ·öŒ[¾æIÛ–Ú˜a =jÎúvî²Áø‡a1ËbÆÏÊÞ.+yyùûÏÁÏ…G¹µ|ùt±=ñÃî‹® D™/R4Ÿl-èö=i cÝ‹ÈÏã­¨îwûðÈ€¡ês5yûíégô_êpÖPTqÔØsÑú7?.Z[1呿ç1²r7óõŽu•¬1Qí-tyyòÛ ðŒËÖǪ%ª\tN9òÌoË«ê¾ þËóÇ6´KÛÖiß›ÆHe¶éë!eOR\äyðî‚ I‰§BjÉcƒ CBÚÕˤBpó#ÝîmÉÊÊÁ¨©Oód~ÒÙƒËw¨ß. ÷°TÎjsCÑÁ›ÒÝä®[–LÙ&<¡æ0¥Š¹KG}¾¯ó´#{£R(×üâ—­)Ús2ýć†v™kÆ„ö<åu”|ÿ )Æ ëðztýGϰg6°|}á]çÄYë¤Â?¨ºIh=(º£ªZUsôø[—MüI~¼ª^³b”ž˜ÿœÏw/4 /Ì Úl° ýˆÆè¥’9Ó u—HØ |Š/ëuùý9JØÂ¯/ocMÈ½ßæ_“·gÏ™%3uöú÷«§&$] vT_êo6Ó¤UÞ|¬Ê¤*aùlj{ô®É³Ã– Ú·VžêÁ~ßðòpk༠š6-÷²õ4*e×jëùñë«Õ·âSë$Ÿ­?b‘wéƒ=ÅcÓòä9Fkï÷dhkFlSw¾Ù%#ÜÿÌ@Ä<é¼›sú§þØÃÚárA»JjZt}Þ¾tß­¸eÆ÷;ý?i°û‰§ºÜ« lvX=H_SÒÑã­öò›ì†/öê _ìÕû™ÉNSÿG&;>+°Ð™#6:ëï¬t®·áV:2ã‡ñc’ý)ˆÙ ¹CÍnÀ~ìlüV¼@ê0C^p,#˜BÃP1!˜P®M/]?¶=*‚¡cèðï?²ì -Ä4ò3P1¬02+˜gðc3)ðßhúpÓ_&˜ÿ0q˜8 “>Ì ¨9 ¨ùw¬€:ÚšÚ|VÀ¥î‚^D×{˱mU/=ÆïMy`öè©Ã£ˆ0ëciÅÉe<þáý£«;ÇYÒ$LLÆ,H=zä˜PùÛÓ'=¦.n¼q"²1ëÞëÖVÿvéÎÚ/gèŸWtÏ}»+þÆàîžÁy²ÿq•i¡­gV¥gÖ^J¤*®!½}‰5V ¼7£-²O'}à£vµ´Þ’yÒ¶2ŒBïIbV/’ÌöI2Ü/6-”hV³ýDoå†UåŸ?îX]Y|Ëpp àÒ±ÊA/¿>«é,Âf FùtÓoËÛD?Âñ>¹}fAA7f{'ô5k=y¸ìøXÿÖc[Å‚¾|–\ ·±¶y¢Ô¸½ÄH34¨¯x§SlýÞ¯ï7u¦É<–î!^î•°Äıõ̾çé©ïï8» wå‘ôt©f÷Ê!¯5^¿—|t¤Ov­îZ1Aß 919¡6‰Ä‹ ç­Ítèœß7…>åüE“y«ÜÌVIìHQ÷.Éœ(RÂfíD?é’ôö*ó£Ä¯§ìº¨ÖêÝ:ÖO¶d‡þÓäøµU¥.¬ÉÄWÚׯJa¡5ùYŠþÅqó’3Ílå|æëH×\}a}·Ü¼ê¸õ-“5SºbÄÖ–˜Mz—¹í²fàëLÚÉTo¨Î¯J¢õ>ë•>×"˜ô9“&%¿jXeÛ¦Ï~_οû:¥Íníîî°Ö¶”Ò­>9 võ>{Î:R”P/d”¿´½© ¯`°ëÙûÂoUÞn¢>;P·kš¾AWë ¦™M9ûŸd—­Ž0ïÚ`£9»6æüç®×?oTó]t'T.ºmÖ®z­X½iåäà9šWê¤D£"æÛ…x~44æ¼cZ±ÙfÒuDëùìì¤h§É/T_ì·f%wO•¹’(zŒî{ ?îyBê\ʼn÷îøç›O­¿œ<5lµVH›màºÄO}—+-)õþÖ‡7O’期CX$|ªòÙ”‹í&GÆJÝM¹v@*4‘<ߨÕáµ®ò6iaꌫMOO><üÕ÷IšÜÎÉ 'ÏÒ%[ül¯ëÙå–öâ ‰z‹tJ—ÉÍeöëoÏ1}-.½Iýì3sýé³Î¯®jÆ…iM·ûsi}h†ôÍâóÂ)8œ*Z»}±³léY/ÿ["õµÂÖ”–0sß\`šÉ®œ]m'\ƒoï°©«ûæ6ãË%‹›´RÙ7¶Ú%é¥G¯ùð2#¬mü—Yº7dNÉJln¸óúù¹ªÑ½·ÅÏÉ6¤›¸?µ¹sŸVà[ìU´÷–D&NÊÃÆ:{´ÈRu5ƒ²¦Š•4hýÓ;Ó±ýz‘›Zq&eø¹OV–e¿Þ/Wý²|áýr÷Ñ’º;{.ãÞhY+GÞ§fÚ•~Ì USU&=oŸUutLý‡M‡Úüõ߬ª.xèy!ù‰Sòå–N½ä³3èAùµŽ¢¯VkPÓų¼×ºtȓל>èj™åXsIx(R¢ûæàu9âñÄÕÇ¿ÍÉ(søØpH$YÏpsÅA¹Øüo“EˆO½Úmªˆ>ߌ}Ö)v>•åéó’Ž{òY“1ïqRt¾;rÓº†iS§M£ê(íܦº]J}ÇÓ“ãJçÄN›[¹ýA–ç6Á-ýNVÔ=žÅû î vO-Ù6#¬yO”cqaϾý' J®võ<ì ýx“2ëÑ#Y³‹»´­õîsc¶½w¸—|æ¤G Ó3Sºãvb_تGÏÞgµãIa¢Û®-©JNÔV%¸ Û·¦ß’eFvìéŠoÇÈLQè|8ºL§åJM6M˜üöfƒ2Ó˜5&ªÂ}y¼à‘Ê€Óû«u¦W”Ü‹—[VÇŒO^üÞùlÏâ;my˪.|"®¶Ðy4E¸¸WûÁ,”(­sKa†÷yÙ¯Ò®æ£g—¶Z „nÈxdzÿÑš:eÊR'醸£õetQªcÙºëw¡ æÖBû$k^êí„úÜÍr‘½ÂO‰Zö»._ô[››–å-×ë}äx•ºú9wÓm¯nTœî|©Ü¿×]×Ú·Áf󂬴3æ±ù´úgï"ðý®rOô±×+ÓUp.\oôíÚãZÝõ“ÉŒ4Gó“Ó Oj0ˆL‹­ô².™ÒXÓjíxYàn”Í”¨\Ç™w÷?èP5^>ïÙ½÷öa%[è êÝHyš‰„% v5•‘zŸy¤ávÈûç[+×ôc:[ôÂåã>}(Ïüb:ß1Q² vòµÒ{6.~¬¹nԮݻ¶-+ǼZ@3^ELž”R­ ü9¯a¾ÅYƒ1C•½Z:"©£²tLe=6iÄ’·?Ÿ:*w¥XH×ö;Ó:iéÚÕ”\+>z^œAmÖ˜zÞs”òú0é£ïp7º¯|Û¨¸·í®Ð‹[þ|›¼§dþ¹I‡_¼°ËŒÒ®¤§ÕLöW91êÌøÌë;¯ìõ-Ëõ1]ãô;‰†€Ë¾Kµ»¥ª ?žz/éÕ=¾xzàÛ+^)^î cÙÛ÷¿_%¾Ú±Å„¼þ°ñéŽÔësê×ë&¦T0;:B›JeãŽ7ÏkØöºèœ‰néýÙ‹¥Ÿò=šabÓg)$z)àeÍ”ÅóÔfâ¤ëÐ{׫\±»x¢Žë˾~öŠì÷7f'ª^Ú—I8XãxõŽ0sÔ¬œ{XHeÏ$]ûÞsK{ Ï<õ>i·F`V€ÆÕH¹œÅw–(¼UÖ»u·¡=L·{Vpò†»O,M¯éÜðܤHÃ!ÍÓñÆÖ»/\_Y_ —’wYh§Ž62s1/s ¯ëœpï4±´«º²EV*m×[¼¶Òpu³VV ]åð4ôIÞCYÿ¹õKbïO•m7Þ»+‹±ãÃ5ñÚ¯«E¦‹ nò ^¨bƒÑËm90±T°gœÛ¨ÇAu‹Td"×LS|7ÛèM8#x ìÓ²oÍ+>õÂu?h¾ã==[º¡U Ïì=šlÞ¹öñ™¹i¥÷ Õ_ÿò¼!»°ËêÔ'ûºìÛ'5Õ^ƒÄ*#,W•ã{í™U%çö½ÍËšZóé`^ëq‰Í§"×V¤ô¨ÕŒËwößžWuÒm¾×Zññ6¥ÛðÛvo8å6aÃŒÝÁúwÝHùǬ¡”ÞÊ÷ì¤æÃ4QÖå13S»¶-¸®Á¼È´õéÏ4ïQ‰•%,ZwifJøÌ±í½W³0Â%1g‰·heww|Ú=)þ*ÃÃMÄáA­4c¦®Ÿ§W ”›1°T´ÀWíÉ`^¡‰dè”ížÄBÙÒOÜž:}¬«·½»¾©<˜ìFj=ºÝ¼é€ ôùyDgFnÁ»Mq»vùhu– Ð1ޏqGŽïB=|ª¥–ŸáòUÜS¿÷×ç®YKõŸ›¿co꧸«N¯óîe\ a/ß“Õ?Ue¦~]ÁòLVަÄê ‡|…åaŠN¤vó™ ŸŽV¶¦ÍœÿZÌ#+«H¥ÍèUuò5OW5¥¶ù£C³ÊôE{§8o¸Ì:dÕ‘d}Eu¾ÈøÌ•uiØ­ ·½–êÏÞ]íU»¿&Ô+ÙGxݨY®KɼY"¸1õbat¼Á¼Â=SÝF?öÞ¿iZ…dêñGÆÍ Ù:åÇŽô–;DOŒ&Ê^b|/êÁNÖ’Ê÷½&Y@]øäe·öU}ÃO¯ó5V&gÆ‘Þ$ˆ¹ùÌ>Úl„­ö\(Óšh£(·s85³­þ•XÃČɬú XýQJ›æäZô}‘ 9® f±¤éP¦Áí^ü]âzéòꥳÞ*㽪7>`(DêN·Æƒp¤íCpcdYpÌV•O–·ÜÚ};ò¨Ü¸U‰cc±‚ywÊÆøJ Î.^Ù –tî-ÌâœóÑå}fyëž·sÌq)a¦žÎl÷‹\¼Å]ÌJçËͧÚ^SW>}£ÃŒø|Û&ñBè²³‹DÞÄ\hQiZhñMÿCÿ™“³.Ѫ ÍFãí_DÊz Ñ='Õk9ò`·ô–œ¹×®Ö¬Û¼¹Vx‚. ÒËóUÁÅœÑIu‹úröÇ Ü¸ç3¡·ðò«Q1åYã©*m›(½R.=Å÷v7 E†”žSTru}zòà©SÅʇޙžMíµLsœê.~À׿³ÜÒ”7[Nm ¹ërs!ñin‚’aŒmõi†Æ‡CØCú¢7aå)N07-*fBôÑ\•'Gû·É„¾× öÉn ²q'µl±vû¡Þ-ŠåÁÒÏÞÚ”80£÷zümÏM;ÝVÎxi-)ø‘öBÇ]Å®þå½Ä²ikæ*¹ÒÔÍû[”*š_Ww¸í³ãÀ¾‚¬º ioã”®ÚUlSÆ<ÞN»Ì<pç^þ²Øè)Éyµ;½ò•¯ÍÙZäL~Zs²p€U¶j­NeÖ—ík®äh÷ùŠ÷žp.MšÍèX<(7¥uûû>iÍë+¦”oŽÔq?½ÎÛ`þ« Wf…Û]Éžµ«E&XñðÖ²;–š[í‰=d$üоY±uŒŽ ~§d¢ª|{Ì•›ëºãß|h»A ߸eês’ôÍã,^åžø”Ÿ·h×m=g¿¯Ÿ‘ÔÊøªÕ¬¦¯”äi_ÇJ™;.ßxæyÇr½žê¤11Û”´d4…Vîû³ɘaë&÷ztèù¹O-%Ú.¬\,Òœ ¹DíhGwÇ¡AR¨3&÷¦öÅð)y ë2m_I·µôuWT*;¯Óî]ÏpLŒ9³^Ú¿¦4?*7Ø­&©Y$ãFâÛs+ò<$î”í¿u\YÕyô\ßÍu®ô†Öá—ò)—KѪ*›gn¦1[”˜ VÆÞ?é¹¹ºà¾¨ªèu}ùi2S/…N' ® é ÅTí®J ¯þ(ygO#îFhÍBsÈ9ÀÄæcD@¦eÍFÉÕçŽÌéºLI§ÏÄY`»¾NÚ4Ëç²ÝÍk›¢:­¨(œzíÝ¥¤øXד;pKiGnîùòrfó[u\yÓò­»;^iÛE ‘²Ê]KkèÜË~Åšaf%A|¶µG4IühŸ™¸LÇ`÷«äù"XŠKôjntò¬¦Ê„›=}ÛTüɼ{Õ×]/5Ò] :s]Í?¿=Àhéø*ãÔom¯}Ï4}œÜj4õLćnAFÖ™¦'K;Îêë·“™ÏG­ÙD0Ì}üéÉÆÕƒFM7ežOËþrÜoê·ØÌEuÖÜ"½Ì;kÜۮЩw{èÅx¦ 9dý>¹#ö>«••¶ìjØÙñ]Íj9²k|—Qwzß7}vL5=1é€FÛ•eÓN´Ø«7\ú êDZR9³CVHLE{‹Çż+U¯›3+¬BnÅÙ¹ ¸k;§jÜÎ0_gõõP‡±ŒÝû|^tJèv\Ÿ{’b@Ò»êUMÞz»øm›é"¡æs¶OͲ»”Pظo|2{ÙEñëK%mÐ=-šc±ž¬~$_Ð>ÙÇÎhvù þ‚qúæåŽêïªSµI®'S›”†5Ïò‡^ˆaΖ{9ùÑl¢Sa)#âËÝB¶ßWêZoÍY‡döåXQîø¾ÛpYÜjCœá½}„š‚î§²kï2Õòz?¿xo„ÏÌôÖo¯gî«—ýïj[gŠj4@¥›ïÝ:Ƽ°ÎzPú`û¸Þ”Æ/ Åt5Ç"¡÷GÉÛ“„Æ0¼©#u,Žÿ@]ì[dï;ß,"ý†o¡`}ëŽÛ2éW3\ôcæ˜_nIw|­6ýy|¬ë”ì¾$Kˆp¸ÙnÑ~­ËŽ+Cr6`ö(ÙºÜLsôÏÒ2Yk­èjrFŒÕÿ¤ìPSõÖ¦Ãg¼;8‡&~cºKábƒ«w÷Þ©'õÎ{×"¼Kÿ¬ ½õåý`ïs¢ía åeiØHgúõ·nñµºÒ‘ye™)Ùíy·æok´¾{37o ñ¥ð¬ØÇëŸ~KÝt1¼Þ£œ zgœ´ídàÕ•¼§wR¦‡Ï®wNI­sì!cÚ”Kv×®ZZ‡_ ¦†¦‡OÑÞ?q²ÔgzÎSRÚkŒ£ØCŸOV”·“ÞîZnÊ*ÏaOj¥ûªçQZ„ûCÁ1o[/zD”]òSOª|¶1p¬ú'7›ÒñVÔ’ÏþÉFµA^o{—ϤÇRvV\ÓònõÉ7שŸpVïþÁ´1é—»eÄÕs¾\Xi÷pð|سf£¨÷r>o¼è .&·Ý×~g½¢Oe[æ´5t 1Yc2õC&ÅmÀîpº:qYÄÑ»OËškÞ|Ø=©-Ëî©â̲â 9bõz+öGb¾Ò|Íüû’÷1åé]]'Š{Ïמ>t¥%¨ûþ:Ìšö“®¸‘è9ºOKÖ«ìmür“BÒLÙþB÷ïv>N:!pó¤;'®;ò¥Ã¨Mc›ßžÙ`<ÿÕÕ:6ç³ö%]úá'Ô'Ûu§†Þ^dûÑfÓ#‰Ç)X¡EÂÓû,|WŸõZ½#¾jwsâ™Í3òA1b"GžÌ€¯5šP·Æ†l@ºËPž”hزðĸñ´ëÍS¥•l×O¶Ú2j—Rô—$ü§‰Æm‡å'Ïœ¾OÒbô¢I2uS„HžWÙSõòˆôÖ‹ÎK7 y»²ñíÄÏÑëÛÌÐñë_oýi¶ÁJæ-µ©«G)­4¬_ãøíù–%™ùfßl•ËŠÊ5ÆŽKJÝy· žúö®“~J¢ñ­¼3›ßÞKhŠôxÐ|ÿQýBƒóVî¥ô±Dú'¨ÖNsÙg{{íú‹ñëwI¸Ú•î?Q^y”ûª¡w…O£‰ûºÐžÐ©)ý"לkBß'„HSúÖ«ï×*ñz®¢ÞsCç´êØíÍ·™ÒÁû:žßË2KÛ®xÕ¶îê B𺘤);oDØìª¨Ðp/>dæ•=ÿè¥[Kìff{\iU·×¥è»ª]¿ÆP¼Ñ&|Z»($ãBñS|e©@Ï|áÖPKijä ã…Öõ·i:žE:…û ¿ÝÅN™ÿjEšêáEKEÆž ,Óø\.ø±Þ´F\¡N³}€ú'³Õ;öѪ¥ŒW7VÙMˆºmùáÑGu•ú²lÚúÙÑ-bW÷ß)ó,l°*]¹ú“ÆFáúÒ‡[¶—^ }¡qqzcWæÂ¯Çg<­YØ+Y\;HTó6{¹óú{=³ô"ÉÝá.˜†ãñ{6v|(3ÒÁº}¿Ö¯ÝaðÆ”ÝûiíúÛ_ê~l²Œ˜±,×îÍìi-v06’Vy•ƒM7ôñq¢vRkª¤Ü?,:·n΃ú•˜7c×ä—DŒÆa×JU`¯ˆ/58h؞Ц͘=‰ésºi,u”ü­în =:ñ©ëËMåß©K$ùåñü 3Unç*ÿÝþÇVOoqþ8éØSßú¸7¢AQ;¾¥Š÷öš¶^¶»›¤æº—|µ§¹›þÈH>ü@ýT†–ÓÔ®ôež>—‹+7_º;su¸V£y–ø­­ã¬p UM<útœíÔgª§ T̶ìÐÔê™ï¼ÄÌ0#âè7ývUŠöz€•ÉÂÚ×_¼¸´ˆÒ>Á½ûÑË09‘37œ3ýÇ’²ÇÆ+AO Ê?||òq™Ðî÷ƒ_¾mÕý˜0'ErìÕ- !U´7ÚL«RtMT¦à»-g»¤òæ±½«×^a\p~¹1Ûœ¼íôùæ1¯Ž8›t¬Úúb›íQs—-FÏÎf×;üt¶Åœ‘³ïÄž¶±ViÛ"ñè¢Õ¸w‹¦û~óù~íNC{Äâ÷¡e7;[ÞA$šZ:¼5…‹bd$ ›%ˆJ3’{ú¬F]£¡¡ §PeÅÒØäUk¾<'Õ—ÆRCp×c¨n¬š:†[wé9¹~FÎ27’Œ¤è)ê:ZêÚª~mU,6« øSÅúúõ´ýýÉÜâ|h+þ¨ Ó¾3pdÒ"ý)L#y G[ÈDßFˇ`rèËcþe¬`Âÿ+¸A9dX§1°CÎê7#³)ÆêXUu}U }VÓ@KÃ@[OY]Ã@]}!fDJ!$«)²`úg²ò¥äËJg’`–0bÒ!p*)¨3VMCCM“/'ÕBÌêüÛô"3ìì~M±ðpÀÒ ç4+³¿RÔ¿ÝÆþ<„‘Ì0¤wøc(è1­,i,Œq€¿'îŸ Fç4nÀ0 ÀÙTvÅA ÆFo¨ ƒ02-ÈH>F5€HŽ cË;ÓÔhk„Q9Í‚äà ÁúA[a8}Üò$‡ñ÷±tÿæõï—°è5’Âð{q<$¹ýZáGÝZQƒ01LÀý f §¨ëkèÃ"Zé$òêêòp2¸wýA NoPøQQää ©C:Bê¼ ÒÑÖÖÔ†!Î;MM=-ýBã¼ÓÀjbG¾ƒÓ“ˆ†¿ÓÐ××ù„sü.¦¶æwð´´ôG¾ÓúþVCWû]:up ÏðwººßÃÓÔÑú®\m¬†Î÷¸è«÷N[ãûwXmï릫ù=]t¿/C[Wã{üÔ¿{§­¥þ]Ýô°Z#iŠÕÔÐýŽ.ÚßÓ«¯ÇO?6“L £0‘sˆ šL NgCȹÆŠH‡4г‹¬Ì Ï…úººêê&z:0Xs¼¾©ÞÔÄTß\[¯©aªi¦cüÇ)¼…#ÏÈL6ÂX-=!YY¼ƒùÿþ2þŸ_$5,à_ ÿ÷ç?cµt55ùÎÖñÿ°º¿ÏþOãÿùr“™8[ÙšñEþù~DÌ?Îùâú*8û\ó'ŒCðèIû‘þ¾ õ](¼_E‰ú£Qh ¹‰ú‹¢¨ïóþ‡aþF„†°þBt¨_D†Bbêý,8ôç#C!‘‡‡úO‚üÁkô/3ü²w ቹ2u°7·²p&à!Sœ#ˆR݉$¼q¤J‰‚ù7°á* ¬¸UE/NW#Â|OÖ)¿LW£Â ÅŒ¤ …ŠAù ¦{…Íe3›Î  Pb`FIŽ´”„ЇF§©EœaŲؔpôÑn•Xz$äO¦A¡ f2râ5y · d¨ªˆbú?l þ&²w°Wj¦Ÿ4ÏÙ@ö°Ü@ˆB"9 2’ACb×!”ɘt€$: '$"p†Ç-[´ “4bÄg„ (LnàU+´=¡hã³èð\ A‹ìÏŽDbÔ€ð:ÜhN ²JŸ\L©‡ƒJ ^MT@ñ€Ù(@²¢Óø1  DQÂè çŒpX/¥‚ø>g"ëOöÕ‚É11j, ¤îç ÖR1( §*$¸v0Ž» G, '¶LF™ ¦½HŒP€Ñ%Lÿ`*NºRÒ)š F%˜SaæE¸ Å…†)âõ2,FÑÓÖØH™ þ øY3¹Õ¥Ã£•FY¹DCF?²_ÚF jPP,v‚ˆmˆˆ„Dl…étÄŠB)Ïk9¾°O<$@°8;šä4§Ò, ·Ò, ‘a® Ú«y„Â- UT·œ¸=p¥Y±á~ô0$àR0Ü¿)L”ƒYÁ`D€Â’´='LõF"¿Èûƒ¦“œ#¨òÈXÏ© 5güâD"ÎñP4=2,ІA ‹d‘éh?èhÎx0{8ò¢[Á3„ÑÙ?“HD0æ°—*¼ ´ðÿ€H  ýð˜J°œcÑi?ƒ‡p¨ ªuЇ%A£Zñõôø[$8ÎðáiÅ( W` R1ªñHaþÓòÂÀ‰@À)ö#àj?Ã…ÀÞ¹‚àÞÍfR(C<Á„¿áÁs‡ŒuHÏ‚‘à &È(0 I@Á`èB5ŽŽ¿¾±¸pQqàメq‹Ì©2â-‡óQp6Ü#.DN»V ¾z4"[¢ƒ(?èÐ DWÃâ²ON#qÏøâÃÄH×TáPD¡Q˜dŽFâ"¤>ÜCpÝ(@Ùe„à÷¦ø‡Bˆ– ²¡Rš•Ë™ Oi#´_D‘‚à¹b…=÷Ô)_‚/ªŠù¢øµ¨ŸTL.9:jF&†È¤Å±ÖòÏ·9íÏr0Àõ‡…ÎÒ˜”ˆH$ 3°{-(é&<åVZ¤DK¡¢&Z? <…UC€ SSGb‡Èn{¾2Q1Ýÿ~ÍPØÿ£ªqñû®nÜR‡UÎ DsQ/‚<[Õþ¬Æ!°þ Õà†<|пŒÖˆuPüßXÿ³Ç»ÿ7Kc?_ÿSÇjk€ø¯:ÚXNGs”:V…~¯ÿý—9f¨uD=§ùS „àNGAí¦–8{ <]ž˜ ¢Ü‡QÈ, ­†ùPËU0b£7Ž]"³ SeeÔ˜¥0º=„ZÆ$fX¶¡3à1Ï?ŒÌbÍSTƒááXÔD‚ w 1›Pƒ 6… Qô &9¤4GLÐd(Íè¼xï~‘A¶‘f,× Pûƒ©ð0@: ˆGï ì=´ Å¡ðÍ,:jßáÄ1¶*x^sMlp¥XÀ‚F޶gîz <‹§û“ƒ0–&,*1PRÈÀ@‹, ÒÃAf -ŠÊ¤ÓO.„*H-9Ëvhpüád& ®ZäÑEVÔÊŒHI‚Va à8ñÏŸÉ@Md „x0 ÷‘’(1 ˜®¾ÀŒ© (Ï‚ùÑ#i,UĘ„P1OsÈì˦†Sè‘l–‚¢ D‰a3Éþl´!Tið3Lª@:ؼÃÂõO¼åÄ&‡© ,E0,*°–šrívhc­‰˜³A©¦dj‡ ŠD#‰ÃÕ÷GD5‡0þh@îìnz¦ Ê÷À¢—¬ñ‚à:Qä°H JM$† ü=Iß- y__øòB>ü4_¤ƒNð™àôœãƒòúyy^HΊox@ÞX°ö]NKx` ˆfÏYm‰Dœ&< ¸PY‘dàÃ@¥Ìÿ— ŒBÃJå+Žg¹GN¡‚Å,|Vý+(ÀA¡!2 àpЦÒà’Á Æž3 ß°Âq²@ôh0Z¡6{*ß*#G~Hž¡µCàÕOp~Sd@Eäï°Å¬@:X~z?Œ‡¬®#‹@ÜðÖ…8C"‚03’fÀC4D·W ž |C ‘•”²ˆøæ_õFœuà$øü9Z Ç` ãè(Ò` àwBéLC Ê F†H<òrª,å!DqsCQ@ŒÁæÜÅÁ¡‡«1X)C§²`ÆõìÊ$&² àoÌ]LFèÏ#7×í],BÖÎFp5R-.L9(±”†ÐÈ09YœºqjU`0òdàÏ,¯ßøƒh˜ÌXyÔwD¨còh%¸ »œ"¨,t œ³C †?°¾÷Lm—‚É0áÁ"ùÐ⺇.!mÇ2² Q¶æj;<°j(ŒlT„J,´Ê:²¸Ôî3¡ÄÂÄ úÕ,Ù¯&ÿ¡LHÇ"û£ë|| $âÉFUO(0Œ—ÃRƒðp: y!å°(<ù†> ,L•Iy@@©¤xï9Wœ¯èÒ è{CReD“€ÎãÍ‚ópNMtá|ZÈR&â%ø ‰(BLJ`Öè’a0ÜL.o¢Šn$GÛ’‚TLG˜óþm9ˆJB~ï dÃ32 8ǃ>öïÁh†“c:-ŠB£‘È’Ÿ‹è÷"ˆ†!kB Tø‚)A¤_• LÐ¥ñ!³éwÐÆ÷~¨JD‡2;Ù@áÇm6Ðö€Õ‘Æø±ÀŽ!¨Œ_ÌGÁÅ!“ +{" gkëkfE6:2ÿ¢‘9ëÚl:cx%PÆ¡™kôøU@ÿä§ *›á*À\§†Js0¼ð!`äoà…BŸql 3šÌ `¡®jCîÜŠJs½“à ¬M#Hóc÷Ëqƒ›å¾* Áxs~_G°¦ÍOyø“<§æœÄ#cxzŽ‘Ižo˜à£'1B*W` û£öãzeplk*Ã[ ÝèHGú£±ÚÏ4˜áš€de†ÿÓ]ilÈØtÔÔ(AW;@(êì£å¯CŽf©°¢‘s™†ÔÈ#Žû‰|”¿< Š;¬q»ÐÜ®úç0Gц¥€ü“¬Ã’r †# ¼Ö 3‡É‰_A Ä0ŽC2ÒŽ”ýûÚýÊqÈ6¢rÃé6,埫Û/ü‰ªý"7#)M:jÿ|âLC†soÌÿSƒ§æIþ¾Â@L2¹#)ꊨé-Ä[øÿÃ:gyVšIV¦¶V&`ÆFÒ‡stž :¯°CYYbŸqxv ¦“0–Aˆ ±X˜GÒæ AÿÇÚÿ‘Ô™ÜY`QóÿßÛÿµÔµ´¹û?±:p:¬¦¶öoûÿcÿ¶«¯¯ÇÝ:dGf±`ýîßlxüÓd*ìÉ„[Å?˜F£ŪýƒÈnÀ{;ÿüÆNÄéý×{;º±äýk{;œ÷?ÜÛ‰¸ÚÛÞùWöv#õwÛ;¾·äûÓ»;Glíäí–ùïîœÏõÙ™‡zÉPØ‘ àøÎõ¾±Ä¹à}íñ$+øÇ×Ê~„Ÿ7 …¡Òøü|øsâŽ8_{œžˆ'ŒÈKf2ÈD¤0Ñ܇2F¼óþ´©ƒ#Žô‹|áŸ<ÌixÕ‘R†q øî-ÜÌQ°„ç ÙÿMòup$ñùÎ!ϰÊÎEx3{¢:DGO©Q§µ¨ŠˆGÕc”%Çæ…œ/£‚Ú5æ¦V]SÙ•õ‡vÄN&uäIžŸÀøÀ Vá!]Òƒ ýï¿"™”UUÿÚ$WÂѲ2ûÙŠå?)ˉŠs` .1P—@2M ˜%pེ" ÏKLàÙÊ?,ëGÈ;™™:8Û“þõzý Îþ¿+ËžøÖ‹ð?( dÄáT ’© DÀ¡cÊ@†"Ûæ€ýYjb1` ÷|2î@Î2ÒO‘ ­¨É“I çŒTJXk¨7rYÛ*, Á_ûi82qçAGgø@¤¢»FQþ!pþ"~8 êŠ@Dsó@ XE^J.›Ã -ÿ,`~‹&Dz 'g<Á—œÀÁ‰@ñD§XˆkºÍ ¹< n Žã˜i5kÛ#‘×F"ÏeÈ¡d+žÑñRpÙh(ºñK‚ë \~øà¾ƒ€¸†’Ãøƒô0½X\Ýæÿ2AùÓ í ˜~sàýH~‘ëçæ_¯—ðÉ…þ9™ÚâˆÄ_ xsÃJ…ze0˜‘[½æÛ0²¬Å¨ ¦ižª‡v>$)FQõ‹…Uø0ô|I…pr 5<2ÒÑTä.y@l`¾RAàjèz|gG2h›42çT2šÁ…º6¤ÀÛÌÙ”C0a= õ'`‚S¬è@Ò)r4C* }7£Uð‡õðSÄëepN q;EŸ€Ó ÊO<Žx®ƒ¬`ädƒ4 þ;Ì«RRò‹ dü ÈÀÕd `BúF0|YÔ8Š¢PÜ-ÑÞCg#§v"û˜”(*=’…œÅ9tì߈âMkè4H5 9@cØ‘…¨ÜE)—x‹€'9ì!œ-<£ü#Î;`8 Ành/ÇÝmwSG« Àðë‰Óþ˜óànŽ>ôY‘aȹ\Æ P 5~ qxä‘çwüçXHJL09PõG0Ìp$äϱ»H¥!½Ž„œ"ˆ³µòÀ› ð åÕ­-ù±6wk ‚/x<„³%:ÀP h€|¾(S² ¸T†>D2@“€|8œ•-ÎÄÊÖŠä.ô£†ChAàœèÉÁ Vè°jêBGÿCN·ŒRóÿWU£_隺ÚÈþo-¬º¶®6ðÿ‚{’öoýï¿ÙÿýÛì·Øÿý`¶VvV¤‘X…QÃa–ûKU?òB p%X‘ð.B,Ο$UàÞËm˜ê\u=»¢Âœé)ÁÐe@øÆŸÆFykv¦ |ƒn‘Dük}ˆÑcç–.êqy.`X+p(ð!ûçy!ÇrŒÚ£€ú'ìðVö°Ò0Ü,¥ :|…Ù†A¥pX!œ«AÀeø#ç<Žº¿…@;Æ¢È öp*R ˆ -ä ߣvp1ÆžTo5.Pcpr¬¯Î ˜/!†/šü¤*ßU†»‚€ÒRÙ^ ¯¾ˆM¥7ÏØÎ¥®øƒOpü2sö>hEÐ?‘íëÜE´úœÃ Ñúð/Âi~ØLˆÊôëf2å_©f0øŸSYèDvæ#HÁ]„lüA°C¹,Ï"]JîC\4¹Dû¹‡4)pHÅoÓT@a({&··ÿ6ÿýHÿƒ't°Rú/€úýOK]]{Äù?šÚØßúßÿ ™çXàIŽ$¾èOÃßr"šðEòW„5F=]U ¸E‘Ù<„ôZŽèw¦Q‘}Rh¬Sx¤€å JFô XJBœ¡#à¸Ú$2<(-Ùg„œˆ†l]GÎð Ò8{¥Âay€žµÏä×ÑÐ)þ\U e46‰i1REä?g€@ÚœNapý2ÕF †Ô”?Rz<>hc¿)¥ÂñØC—×9† þb9£èNp¡þadj8¼2ù¸@>Špa !)ÿG¸ðBHðkµxp> ðøDNn 1Qà92Ÿ®Ç3eðW©œ©dO¡rN|áî¸äÎÂÃ>˜{` }D2Nˆ0ñŽB!ƒ=[œ>¸ç䀙LþÙöNg#æ˜V`ã üJ9G’P¹ð~ªAsgž=LFüï,­ˆÑÁœä w)¾w$8¸X™áÍ wäŒ]SGw‚•…% ²t°5ÈÎÞ Ä•"¬LœIð‹%KpD$xQ^ùгw‡ðnŽp%BÈÊÎÑÖ †AÀÙ“¬ðDX92µu6³²·P`(H¬D†“‘TPÌð?È ‚%Øá àøGÇö€inE²ųùq#Ž@²2u¶Å) 3ÁшB2³"šÚâ¬ìðf@É·‡ †ð.x{'æ(”€·€_ ˜«¦ ³µBÂh!åÀÕ4³"àMI >Cw¦0ý`ìlU ¢#ÞÔ ÜàÝðpUpw,ÂJöD¼“3œþ™áìpà4K…_“4Ž©3ov0G¢i9›IV$g²pp0C°&â .V¦x¢!dë@D(æLÄ«@ÀðŠP`rÁŸá{g¢ Ò~ ÔÁ1õ*ÂÍí S¦Îm†ÙÁ©3L$‚;€ ˆ´ äj‰‡ßÃmÏ©‰€ä Â4%ñ§„K…éIâ«,d·°µ‚©nŠ_ W+"ñœÆ¬ˆ Z¸+.Ù™Ä šj†Þò±± Ò¤•9„3s±È£‰^€)bÅáø-ÑÙÔ’C}ΤmÈ9U7ÀÊ4Ü…™Aþ*œYg–ÞEyz·¡Óa‰´»ù‘Èàç‡Sñ=Á³¾' “É÷ÿç{#8Ÿž3à¡ Ž.É…;ôLo†>"Å }„Ëáûˆ”:ôþÏ÷Abè#‚ï#'J ƒÆ­1‚Š!÷% ŠÀÈWp±#_Áÿ ùÏ 6ªÿé“‚_¿¯ß×ïë÷õûú}ý¾~_¿¯ß×ïë÷õûú}ý¾~_¿¯ß×ïë÷õûú}ýŸrý?!ø&òYxymon-4.3.28/xymonnet/dns.c0000664000076400007640000002235312603142505016026 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor network test tool. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: dns.c 7676 2015-10-01 05:31:49Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include "libxymon.h" #include #include #include "dns.h" #include "dns2.h" #ifdef HPUX /* Doesn't have hstrerror */ char *hstrerror(int err) { return ""; } #endif static ares_channel mychannel; static int pending_dns_count = 0; int use_ares_lookup = 1; int max_dns_per_run = 0; int dns_stats_total = 0; int dns_stats_success = 0; int dns_stats_failed = 0; int dns_stats_lookups = 0; int dnstimeout = 30; FILE *dnsfaillog = NULL; typedef struct dnsitem_t { char *name; struct in_addr addr; struct dnsitem_t *next; int failed; struct timespec resolvetime; } dnsitem_t; static void * dnscache; static void dns_init(void) { static int initdone = 0; if (initdone) return; dnscache = xtreeNew(strcasecmp); if (use_ares_lookup) { struct ares_options options; int status; /* ARES timeout backported from Xymon trunk 20120411 - this should give us a ~23 second timeout */ options.timeout = 2000; options.tries = 4; status = ares_init_options(&mychannel, &options, (ARES_OPT_TIMEOUTMS | ARES_OPT_TRIES)); if (status != ARES_SUCCESS) { errprintf("Cannot initialize ARES resolver, using standard\n"); errprintf("ARES error was: '%s'\n", ares_strerror(status)); use_ares_lookup = 0; } } initdone = 1; } static char *find_dnscache(char *hostname) { struct in_addr inp; xtreePos_t handle; dnsitem_t *dnsc; dns_init(); if (inet_aton(hostname, &inp) != 0) { /* It is an IP, so just use that */ return hostname; } /* In the cache ? */ handle = xtreeFind(dnscache, hostname); if (handle == xtreeEnd(dnscache)) return NULL; dnsc = (dnsitem_t *)xtreeData(dnscache, handle); return inet_ntoa(dnsc->addr); } static void dns_simple_callback(void *arg, int status, int timeout, struct hostent *hent) { struct dnsitem_t *dnsc = (dnsitem_t *)arg; struct timespec etime; getntimer(&etime); tvdiff(&dnsc->resolvetime, &etime, &dnsc->resolvetime); pending_dns_count--; if (status == ARES_SUCCESS) { memcpy(&dnsc->addr, *(hent->h_addr_list), sizeof(dnsc->addr)); dbgprintf("Got DNS result for host %s : %s\n", dnsc->name, inet_ntoa(dnsc->addr)); dns_stats_success++; } else { memset(&dnsc->addr, 0, sizeof(dnsc->addr)); dbgprintf("DNS lookup failed for %s - status %s (%d)\n", dnsc->name, ares_strerror(status), status); dnsc->failed = 1; dns_stats_failed++; if (dnsfaillog) { fprintf(dnsfaillog, "DNS lookup failed for %s - status %s (%d)\n", dnsc->name, ares_strerror(status), status); } } } static void dns_ares_queue_run(ares_channel channel) { int nfds; fd_set read_fds, write_fds; struct timeval *tvp, tv; int loops = 0; if ((channel == mychannel) && (!pending_dns_count)) return; dbgprintf("Processing %d DNS lookups with ARES\n", pending_dns_count); while (1) { /* Loop continues until all requests handled (or time out) */ loops++; FD_ZERO(&read_fds); FD_ZERO(&write_fds); nfds = ares_fds(channel, &read_fds, &write_fds); if (nfds == 0) { dbgprintf("Finished ARES queue after loop %d\n", loops); break; /* No pending requests */ } /* * Determine how long select() waits before processing timeouts. * "dnstimeout" is the user configurable option which is * the absolute maximum timeout value. However, ARES also * has built in timeouts - these are defined at ares_init() * using ARES_OPT_TIMEOUTMS and ARES_OPT_TRIES (default * 5 secs / 4 tries = 20 second timeout). */ tv.tv_sec = dnstimeout; tv.tv_usec = 0; tvp = ares_timeout(channel, &tv, &tv); select(nfds, &read_fds, &write_fds, NULL, tvp); ares_process(channel, &read_fds, &write_fds); } if (pending_dns_count > 0) { errprintf("Odd ... pending_dns_count=%d after a queue run\n", pending_dns_count); pending_dns_count = 0; } } void add_host_to_dns_queue(char *hostname) { dnsitem_t *dnsc; dns_init(); dns_stats_total++; if (find_dnscache(hostname)) return; /* Already resolved */ if (max_dns_per_run && (pending_dns_count >= max_dns_per_run)) { /* Limit the number of requests we do per run */ dns_ares_queue_run(mychannel); } /* New hostname */ dnsc = (dnsitem_t *)calloc(1, sizeof(dnsitem_t)); dbgprintf("Adding hostname '%s' to resolver queue\n", hostname); pending_dns_count++; dnsc->name = strdup(hostname); getntimer(&dnsc->resolvetime); xtreeAdd(dnscache, dnsc->name, dnsc); if (use_ares_lookup) { ares_gethostbyname(mychannel, hostname, AF_INET, dns_simple_callback, dnsc); } else { /* * This uses the normal resolver functions, but * sends the result through the same processing * functions as used when we use ARES. */ struct hostent *hent; int status; hent = gethostbyname(hostname); if (hent) { status = ARES_SUCCESS; dns_stats_success++; } else { status = ARES_ENOTFOUND; dns_stats_failed++; dbgprintf("gethostbyname() failed with err %d: %s\n", h_errno, hstrerror(h_errno)); if (dnsfaillog) { fprintf(dnsfaillog, "Hostname lookup failed for %s - status %s (%d)\n", hostname, hstrerror(h_errno), h_errno); } } /* Send the result to our normal callback function */ dns_simple_callback(dnsc, status, 0, hent); } } void add_url_to_dns_queue(char *url) { weburl_t weburl; dns_init(); decode_url(url, &weburl); if (weburl.proxyurl) { if (weburl.proxyurl->parseerror) return; add_host_to_dns_queue(weburl.proxyurl->host); } else { if (weburl.desturl->parseerror) return; add_host_to_dns_queue(weburl.desturl->host); } } void flush_dnsqueue(void) { dns_init(); dns_ares_queue_run(mychannel); } char *dnsresolve(char *hostname) { char *result; dns_init(); if (hostname == NULL) return NULL; flush_dnsqueue(); dns_stats_lookups++; result = find_dnscache(hostname); if (result == NULL) { errprintf("dnsresolve: name '%s' not in cache. You probably have a NULL IP setting and the 'testip' flag set.\n", hostname); return NULL; } if (strcmp(result, "0.0.0.0") == 0) return NULL; return result; } int dns_test_server(char *serverip, char *hostname, strbuffer_t *banner) { ares_channel channel; struct ares_options options; struct in_addr serveraddr; int status; struct timespec starttime, endtime; struct timespec *tspent; char msg[100]; char *tspec, *tst; dns_resp_t *responses = NULL; dns_resp_t *walk = NULL; int i; dns_init(); if (inet_aton(serverip, &serveraddr) == 0) { errprintf("dns_test_server: serverip '%s' not a valid IP\n", serverip); return 1; } options.flags = ARES_FLAG_NOCHECKRESP; options.servers = &serveraddr; options.nservers = 1; /* ARES timeout backported from Xymon trunk 20120411 - this should give us a ~23 second timeout */ options.timeout = 2000; options.tries = 4; status = ares_init_options(&channel, &options, (ARES_OPT_FLAGS | ARES_OPT_SERVERS | ARES_OPT_TIMEOUTMS | ARES_OPT_TRIES)); if (status != ARES_SUCCESS) { errprintf("Could not initialize ares channel: %s\n", ares_strerror(status)); return 1; } tspec = strdup(hostname); getntimer(&starttime); tst = strtok(tspec, ","); do { dns_resp_t *newtest = (dns_resp_t *)malloc(sizeof(dns_resp_t)); char *p, *tlookup; int atype = T_A; newtest->msgbuf = newstrbuffer(0); newtest->next = NULL; if (responses == NULL) responses = newtest; else walk->next = newtest; walk = newtest; p = strchr(tst, ':'); tlookup = (p ? p+1 : tst); if (p) { *p = '\0'; atype = dns_name_type(tst); *p = ':'; } dbgprintf("ares_search: tlookup='%s', class=%d, type=%d\n", tlookup, C_IN, atype); ares_search(channel, tlookup, C_IN, atype, dns_detail_callback, newtest); tst = strtok(NULL, ","); } while (tst); dns_ares_queue_run(channel); getntimer(&endtime); tspent = tvdiff(&starttime, &endtime, NULL); clearstrbuffer(banner); status = ARES_SUCCESS; strcpy(tspec, hostname); tst = strtok(tspec, ","); for (walk = responses, i=1; (walk); walk = walk->next, i++) { /* Print an identifying line if more than one query */ if ((walk != responses) || (walk->next)) { sprintf(msg, "\n*** DNS lookup of '%s' ***\n", tst); addtobuffer(banner, msg); } addtostrbuffer(banner, walk->msgbuf); if (walk->msgstatus != ARES_SUCCESS) status = walk->msgstatus; xfree(walk->msgbuf); tst = strtok(NULL, ","); } xfree(tspec); sprintf(msg, "\nSeconds: %u.%.9ld\n", (unsigned int)tspent->tv_sec, tspent->tv_nsec); addtobuffer(banner, msg); ares_destroy(channel); return (status != ARES_SUCCESS); } xymon-4.3.28/xymonnet/xymonnet-again.sh.10000664000076400007640000000245113037531444020532 0ustar rpmbuildrpmbuild.TH XYMONNET\-AGAIN.SH 1 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME xymonnet\-again.sh \- Xymon network re-test tool .SH SYNOPSIS .B "xymonnet\-again.sh" .SH DESCRIPTION \fBxymonnet\-again.sh\fR is an extension script for Xymon that runs on the network test server. It picks up the failing network tests executed by the .I xymonnet(1) program, and repeats these tests with a faster test cycle than the normal xymonnet schedule. This means that when the server recovers and the network service becomes available again, this is detected quicker resulting in less reported downtime. Only tests whose first failure occurred within 30 minutes are included in the tests that are run by xymonnet\-again.sh. The 30 minute limit is there to avoid hosts that are down for longer periods of time to bog down xymonnet\-again.sh. You can change this limit with the "\-\-frequenttestlimit=SECONDS" when you run xyxmonnet. .SH INSTALLATION This script runs by default from your .I tasks.cfg(5) file. .SH FILES .IP $XYMONTMP/TESTNAME.LOCATION.status Temporary status file managed by xyxmonnet with status of tests that have currently failed. .IP $XYMONTMP/frequenttests.LOCATION Temporary file managed by xymonnet with the hostnames that xymonnet\-again.sh should test. .SH "SEE ALSO" xymonnet(1), xymon(7), tasks.cfg(5) xymon-4.3.28/xymonnet/dns2.h0000664000076400007640000000200011615341300016074 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor network test tool. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __DNS2_H__ #define __DNS2_H__ typedef struct dns_resp_t { int msgstatus; strbuffer_t *msgbuf; struct dns_resp_t *next; } dns_resp_t; extern void dns_detail_callback(void *arg, int status, int timeouts, unsigned char *abuf, int alen); extern int dns_name_type(char *name); #endif xymon-4.3.28/xymonnet/xymonnet-again.sh.DIST0000664000076400007640000000050011535462534021132 0ustar rpmbuildrpmbuild#!/bin/sh # This extension script picks up the $XYMONTMP/frequenttests.$XYMONNETWORK # file generated by xyxmonnet. It then re-does the network tests # with the same parameters. REDOFILE=$XYMONTMP/frequenttests.$XYMONNETWORK if test -r $REDOFILE then @RUNTIMEDEFS@ $XYMONHOME/bin/xymonnet `cat $REDOFILE` fi exit 0 xymon-4.3.28/xymonnet/protocols.cfg.50000664000076400007640000000506313037531444017753 0ustar rpmbuildrpmbuild.TH PROTOCOLS.CFG 5 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME protocols.cfg \- Configuration of TCP network services .SH SYNOPSIS .BR $XYMONHOME/etc/protocols.cfg .SH DESCRIPTION \fBprotocols.cfg\fR contains definitions of how .I xymonnet(1) should test a TCP-based network service (i.e. all common network services except HTTP and DNS). For each service, a simple dialogue can be defined to check that the service is functioning normally, and optional flags determine if the service has e.g. a banner or requires SSL- or telnet-style handshaking to be tested. .SH FILE FORMAT protocols.cfg is a text file. A simple service definition for the SMTP service would be this: .br .sp [smtp] .br send "mail\\r\\nquit\\r\\n" .br expect "220" .br options banner .br .sp This defines a service called "smtp". When the connection is first established, xymonnet will send the string "mail\\r\\nquit\\r\\n" to the service. It will then expect a response beginning with "220". Any data returned by the service (a so-called "banner") will be recorded and included in the status message. .sp The full set of commands available for the protocols.cfg file are: .IP "[NAME]" Define the name of the TCP service, which will also be the column-name in the resulting display on the test status. If multiple tests share a common definition (e.g. ssh, ssh1 and ssh2 are tested identically), you may list these in a single "[ssh|ssh1|ssh2]" definition, separating each service-name with a pipe-sign. .IP "send STRING" .IP "expect STRING" Defines the strings to send to the service after a connection is established, and the response that is expected. Either of these may be omitted, in which case .I xymonnet(1) will simply not send any data, or match a response against anything. The send- and expect-strings use standard escaping for non-printable characters. "\\r" represents a carriage-return (ASCII 13), "\\n" represents a line-feed (ASCII 10), "\\t" represents a TAB (ASCII 8). Binary data is input as "\\xNN" with NN being the hexadecimal value of the byte. .IP "port NUMBER" Define the default TCP port-number for this service. If no portnumber is defined, .I xymonnet(1) will attempt to lookup the portnumber in the standard /etc/services file. .IP "options option1[,option2][,option3]" Defines test options. The possible options are .br banner - include received data in the status message .br ssl - service uses SSL so perform an SSL handshake .br telnet - service is telnet, so exchange telnet options .SH FILES .BR $XYMONHOME/etc/protocols.cfg .SH "SEE ALSO" xymonnet(1) xymon-4.3.28/xymonnet/xymon-snmpcollect.c0000664000076400007640000007305612603243142020742 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor SNMP data collection tool */ /* */ /* Copyright (C) 2007-2011 Henrik Storner */ /* */ /* Inspired by the asyncapp.c file from the "NET-SNMP demo", available from */ /* the Net-SNMP website. This file carries the attribution */ /* "Niels Baggesen (Niels.Baggesen@uni-c.dk), 1999." */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: xymon-snmpcollect.c 7678 2015-10-01 14:42:42Z jccleaver $"; #include #include #include #include "libxymon.h" /* ----------------- struct's used for the host/requests we need to do ---------------- */ /* List of the OID's we will request */ typedef struct oid_t { mibdef_t *mib; /* pointer to the mib definition for mibs */ oid Oid[MAX_OID_LEN]; /* the internal OID representation */ size_t OidLen; /* size of the oid */ char *devname; /* Users' chosen device name. May be a key (e.g "eth0") */ oidds_t *oiddef; /* Points to the oidds_t definition */ int setnumber; /* All vars fetched in one PDU's have the same setnumber */ char *result; /* the printable result data */ struct oid_t *next; } oid_t; /* Used for requests where we must determine the appropriate table index first */ typedef struct keyrecord_t { mibdef_t *mib; /* Pointer to the mib definition */ mibidx_t *indexmethod; /* Pointer to the mib index definition */ char *key; /* The user-provided key we must find */ char *indexoid; /* Result: Index part of the OID */ struct keyrecord_t *next; } keyrecord_t; /* A host and the OID's we will be polling */ typedef struct req_t { char *hostname; /* Hostname used for reporting to Xymon */ char *hostip[10]; /* Hostname(s) or IP(s) used for testing. Max 10 IP's */ int hostipidx; /* Index into hostip[] for the active IP we use */ long version; /* SNMP version to use */ unsigned char *community; /* Community name used to access the SNMP daemon (v1, v2c) */ unsigned char *username; /* Username used to access the SNMP daemon (v3) */ unsigned char *passphrase; /* Passphrase used to access the SNMP daemon (v3) */ enum { SNMP_V3AUTH_MD5, SNMP_V3AUTH_SHA1 } authmethod; /* Authentication method (v3) */ int setnumber; /* Per-host setnumber used while building requests */ struct snmp_session *sess; /* SNMP session data */ keyrecord_t *keyrecords, *currentkey; /* For keyed requests: Key records */ oid_t *oidhead, *oidtail; /* List of the OID's we will fetch */ oid_t *curr_oid, *next_oid; /* Current- and next-OID pointers while fetching data */ struct req_t *next; } req_t; /* Global variables */ req_t *reqhead = NULL; /* Holds the list of requests */ int active_requests = 0; /* Number of active SNMP requests in flight */ /* dataoperation tracks what we are currently doing */ enum { GET_KEYS, /* Scan for the keys */ GET_DATA /* Fetch the actual data */ } dataoperation; /* Tuneables */ int max_pending_requests = 30; int retries = 0; /* Number of retries before timeout. 0 = Net-SNMP default (5). */ long timeout = 0; /* Number of uS until first timeout, then exponential backoff. 0 = Net-SNMP default (1 second). */ /* Statistics */ char *reportcolumn = NULL; int varcount = 0; int pducount = 0; int okcount = 0; int toobigcount = 0; int timeoutcount = 0; int errorcount = 0; struct timeval starttv, endtv; /* Must forward declare these */ void startonehost(struct req_t *r, int ipchange); void starthosts(int resetstart); struct snmp_pdu *generate_datarequest(req_t *item) { struct snmp_pdu *req; int currentset; if (!item->next_oid) return NULL; req = snmp_pdu_create(SNMP_MSG_GET); pducount++; item->curr_oid = item->next_oid; currentset = item->next_oid->setnumber; while (item->next_oid && (currentset == item->next_oid->setnumber)) { varcount++; snmp_add_null_var(req, item->next_oid->Oid, item->next_oid->OidLen); item->next_oid = item->next_oid->next; } return req; } /* * Store data received in response PDU */ int print_result (int status, req_t *req, struct snmp_pdu *pdu) { struct variable_list *vp; size_t len; keyrecord_t *kwalk; int keyoidlen; oid_t *owalk; int done; switch (status) { case STAT_SUCCESS: if (pdu->errstat == SNMP_ERR_NOERROR) { unsigned char *valstr = NULL, *oidstr = NULL; size_t valsz = 0, oidsz = 0; okcount++; switch (dataoperation) { case GET_KEYS: /* * Find the keyrecord currently processed for this request, and * look through the unresolved keys to see if we have a match. * If we do, determine the index for data retrieval. */ vp = pdu->variables; len = 0; sprint_realloc_value(&valstr, &valsz, &len, 1, vp->name, vp->name_length, vp); len = 0; sprint_realloc_objid(&oidstr, &oidsz, &len, 1, vp->name, vp->name_length); dbgprintf("Got key-oid '%s' = '%s'\n", oidstr, valstr); for (kwalk = req->currentkey, done = 0; (kwalk && !done); kwalk = kwalk->next) { /* Skip records where we have the result already, or that are not keyed */ if (kwalk->indexoid || (kwalk->indexmethod != req->currentkey->indexmethod)) { continue; } keyoidlen = strlen(req->currentkey->indexmethod->keyoid); switch (kwalk->indexmethod->idxtype) { case MIB_INDEX_IN_OID: /* Does the key match the value we just got? */ if (*kwalk->key == '*') { /* Match all. Add an extra key-record at the end. */ keyrecord_t *newkey; newkey = (keyrecord_t *)calloc(1, sizeof(keyrecord_t)); memcpy(newkey, kwalk, sizeof(keyrecord_t)); newkey->indexoid = strdup(oidstr + keyoidlen + 1); newkey->key = valstr; valstr = NULL; newkey->next = kwalk->next; kwalk->next = newkey; done = 1; } else if (strcmp(valstr, kwalk->key) == 0) { /* Grab the index part of the OID */ kwalk->indexoid = strdup(oidstr + keyoidlen + 1); done = 1; } break; case MIB_INDEX_IN_VALUE: /* Does the key match the index-part of the result OID? */ if (*kwalk->key == '*') { /* Match all. Add an extra key-record at the end. */ keyrecord_t *newkey; newkey = (keyrecord_t *)calloc(1, sizeof(keyrecord_t)); memcpy(newkey, kwalk, sizeof(keyrecord_t)); newkey->indexoid = valstr; valstr = NULL; newkey->key = strdup(oidstr + keyoidlen + 1); newkey->next = kwalk->next; kwalk->next = newkey; done = 1; } else if ((*(oidstr+keyoidlen) == '.') && (strcmp(oidstr+keyoidlen+1, kwalk->key)) == 0) { /* * Grab the index which is the value. * Avoid a strdup by grabbing the valstr pointer. */ kwalk->indexoid = valstr; valstr = NULL; valsz = 0; done = 1; } break; } } break; case GET_DATA: owalk = req->curr_oid; vp = pdu->variables; while (vp) { valsz = len = 0; sprint_realloc_value((unsigned char **)&owalk->result, &valsz, &len, 1, vp->name, vp->name_length, vp); owalk = owalk->next; vp = vp->next_variable; } break; } if (valstr) xfree(valstr); if (oidstr) xfree(oidstr); } else { errorcount++; errprintf("ERROR %s: %s\n", req->hostip[req->hostipidx], snmp_errstring(pdu->errstat)); } return 1; case STAT_TIMEOUT: timeoutcount++; dbgprintf("%s: Timeout\n", req->hostip); if (req->hostip[req->hostipidx+1]) { req->hostipidx++; startonehost(req, 1); } return 0; case STAT_ERROR: errorcount++; snmp_sess_perror(req->hostip[req->hostipidx], req->sess); return 0; } return 0; } /* * response handler */ int asynch_response(int operation, struct snmp_session *sp, int reqid, struct snmp_pdu *pdu, void *magic) { struct req_t *req = (struct req_t *)magic; if (operation == NETSNMP_CALLBACK_OP_RECEIVED_MESSAGE) { struct snmp_pdu *snmpreq = NULL; int okoid = 1; if (dataoperation == GET_KEYS) { /* * We're doing GETNEXT's when retrieving keys, so we will get a response * which has nothing really to do with the data we're looking for. In that * case, we should NOT process data from this response. */ struct variable_list *vp = pdu->variables; okoid = ((vp->name_length >= req->currentkey->indexmethod->rootoidlen) && (memcmp(req->currentkey->indexmethod->rootoid, vp->name, req->currentkey->indexmethod->rootoidlen * sizeof(oid)) == 0)); } switch (pdu->errstat) { case SNMP_ERR_NOERROR: /* Pick up the results, but only if the OID is valid */ if (okoid) print_result(STAT_SUCCESS, req, pdu); break; case SNMP_ERR_NOSUCHNAME: dbgprintf("Host %s item %s: No such name\n", req->hostname, req->curr_oid->devname); if (req->hostip[req->hostipidx+1]) { req->hostipidx++; startonehost(req, 1); } break; case SNMP_ERR_TOOBIG: toobigcount++; errprintf("Host %s item %s: Response too big\n", req->hostname, req->curr_oid->devname); break; default: errorcount++; errprintf("Host %s item %s: SNMP error %d\n", req->hostname, req->curr_oid->devname, pdu->errstat); break; } /* Now see if we should send another request */ switch (dataoperation) { case GET_KEYS: /* * While fetching keys, walk the current key-table until we reach the end of the table. * When we reach the end of one key-table, start with the next. * FIXME: Could optimize so we don't fetch the whole table, but only those rows we need. */ if (pdu->errstat == SNMP_ERR_NOERROR) { struct variable_list *vp = pdu->variables; if ( (vp->name_length >= req->currentkey->indexmethod->rootoidlen) && (memcmp(req->currentkey->indexmethod->rootoid, vp->name, req->currentkey->indexmethod->rootoidlen * sizeof(oid)) == 0) ) { /* Still more data in the current key table, get the next row */ snmpreq = snmp_pdu_create(SNMP_MSG_GETNEXT); pducount++; /* Probably only one variable to fetch, but never mind ... */ while (vp) { varcount++; snmp_add_null_var(snmpreq, vp->name, vp->name_length); vp = vp->next_variable; } } else { /* End of current key table. If more keys to be found, start the next table. */ do { req->currentkey = req->currentkey->next; } while (req->currentkey && req->currentkey->indexoid); if (req->currentkey) { snmpreq = snmp_pdu_create(SNMP_MSG_GETNEXT); pducount++; snmp_add_null_var(snmpreq, req->currentkey->indexmethod->rootoid, req->currentkey->indexmethod->rootoidlen); } } } break; case GET_DATA: /* Generate a request for the next dataset, if any */ if (req->next_oid) { snmpreq = generate_datarequest(req); } else { dbgprintf("No more oids left\n"); } break; } /* Send the request we just made */ if (snmpreq) { if (snmp_send(req->sess, snmpreq)) goto finish; else { snmp_sess_perror("snmp_send", req->sess); snmp_free_pdu(snmpreq); } } } else { dbgprintf("operation not successful: %d\n", operation); print_result(STAT_TIMEOUT, req, pdu); } /* * Something went wrong (or end of variables). * This host not active any more */ dbgprintf("Finished host %s\n", req->hostname); active_requests--; finish: /* Start some more hosts */ starthosts(0); return 1; } void startonehost(struct req_t *req, int ipchange) { struct snmp_session s; struct snmp_pdu *snmpreq = NULL; if ((dataoperation < GET_DATA) && !req->currentkey) return; /* Are we retrying a cluster with a new IP? Then drop the current session */ if (req->sess && ipchange) { /* * Apparently, we cannot close a session while in a callback. * So leave this for now - it will leak some memory, but * this is not a problem as long as we only run once. */ /* snmp_close(req->sess); */ req->sess = NULL; } /* Setup the SNMP session */ if (!req->sess) { snmp_sess_init(&s); /* * snmp_session has a "remote_port" field, but it does not work. * Instead, the peername should include a port number (IP:PORT) * if (req->portnumber) s.remote_port = req->portnumber; */ s.peername = req->hostip[req->hostipidx]; /* Set the SNMP version and authentication token(s) */ s.version = req->version; switch (s.version) { case SNMP_VERSION_1: case SNMP_VERSION_2c: s.community = req->community; s.community_len = strlen((char *)req->community); break; case SNMP_VERSION_3: /* set the SNMPv3 user name */ s.securityName = strdup(req->username); s.securityNameLen = strlen(s.securityName); /* set the security level to authenticated, but not encrypted */ s.securityLevel = SNMP_SEC_LEVEL_AUTHNOPRIV; /* set the authentication method */ switch (req->authmethod) { case SNMP_V3AUTH_MD5: s.securityAuthProto = usmHMACMD5AuthProtocol; s.securityAuthProtoLen = sizeof(usmHMACMD5AuthProtocol)/sizeof(oid); s.securityAuthKeyLen = USM_AUTH_KU_LEN; break; case SNMP_V3AUTH_SHA1: s.securityAuthProto = usmHMACSHA1AuthProtocol; s.securityAuthProtoLen = sizeof(usmHMACSHA1AuthProtocol)/sizeof(oid); s.securityAuthKeyLen = USM_AUTH_KU_LEN; break; } /* * set the authentication key to a hashed version of our * passphrase (which must be at least 8 characters long). */ if (generate_Ku(s.securityAuthProto, s.securityAuthProtoLen, (u_char *)req->passphrase, strlen(req->passphrase), s.securityAuthKey, &s.securityAuthKeyLen) != SNMPERR_SUCCESS) { errprintf("Failed to generate Ku from authentication pass phrase for host %s\n", req->hostname); snmp_perror("generate_Ku"); return; } break; } /* Set timeouts and retries */ if (timeout > 0) s.timeout = timeout; if (retries > 0) s.retries = retries; /* Setup the callback */ s.callback = asynch_response; s.callback_magic = req; if (!(req->sess = snmp_open(&s))) { snmp_sess_perror("snmp_open", &s); return; } } switch (dataoperation) { case GET_KEYS: snmpreq = snmp_pdu_create(SNMP_MSG_GETNEXT); pducount++; snmp_add_null_var(snmpreq, req->currentkey->indexmethod->rootoid, req->currentkey->indexmethod->rootoidlen); break; case GET_DATA: /* Build the request PDU and send it */ snmpreq = generate_datarequest(req); break; } if (!snmpreq) return; if (snmp_send(req->sess, snmpreq)) active_requests++; else { errorcount++; snmp_sess_perror("snmp_send", req->sess); snmp_free_pdu(snmpreq); } } void starthosts(int resetstart) { static req_t *startpoint = NULL; static int haverun = 0; struct req_t *rwalk; if (resetstart) { startpoint = NULL; haverun = 0; } if (startpoint == NULL) { if (haverun) { return; } else { startpoint = reqhead; haverun = 1; } } /* startup as many hosts as we want to run in parallel */ for (rwalk = startpoint; (rwalk && (active_requests <= max_pending_requests)); rwalk = rwalk->next) { startonehost(rwalk, 0); } startpoint = rwalk; } void stophosts(void) { struct req_t *rwalk; for (rwalk = reqhead; (rwalk); rwalk = rwalk->next) { if (rwalk->sess) { snmp_close(rwalk->sess); } } } /* * This routine loads MIB files, and computes the key-OID values. * We defer this until the mib-definition is actually being referred to * in snmphosts.cfg, because lots of MIB's are not being used * (and probably do not exist on the host where we're running) and * to avoid spending a lot of time to load MIB's that are not used. */ void setupmib(mibdef_t *mib, int verbose) { mibidx_t *iwalk; size_t sz, len; if (mib->loadstatus != MIB_STATUS_NOTLOADED) return; if (mib->mibfn && (read_mib(mib->mibfn) == NULL)) { mib->loadstatus = MIB_STATUS_LOADFAILED; if (verbose) { errprintf("Failed to read MIB file %s\n", mib->mibfn); snmp_perror("read_objid"); } } for (iwalk = mib->idxlist; (iwalk); iwalk = iwalk->next) { iwalk->rootoid = calloc(MAX_OID_LEN, sizeof(oid)); iwalk->rootoidlen = MAX_OID_LEN; if (read_objid(iwalk->keyoid, iwalk->rootoid, &iwalk->rootoidlen)) { /* Re-use the iwalk->keyoid buffer */ sz = strlen(iwalk->keyoid) + 1; len = 0; sprint_realloc_objid((unsigned char **)&iwalk->keyoid, &sz, &len, 1, iwalk->rootoid, iwalk->rootoidlen); } else { mib->loadstatus = MIB_STATUS_LOADFAILED; if (verbose) { errprintf("Cannot determine OID for %s\n", iwalk->keyoid); snmp_perror("read_objid"); } } } mib->loadstatus = MIB_STATUS_LOADED; } /* * * Config file syntax * * [HOSTNAME] * ip=ADDRESS[:PORT] * version=VERSION * community=COMMUNITY * username=USERNAME * passphrase=PASSPHRASE * authmethod=[MD5|SHA1] * mibname1[=index] * mibname2[=index] * mibname3[=index] * */ static oid_t *make_oitem(mibdef_t *mib, char *devname, oidds_t *oiddef, char *oidstr, struct req_t *reqitem) { oid_t *oitem = (oid_t *)calloc(1, sizeof(oid_t)); oitem->mib = mib; oitem->devname = strdup(devname); oitem->setnumber = reqitem->setnumber; oitem->oiddef = oiddef; oitem->OidLen = sizeof(oitem->Oid)/sizeof(oitem->Oid[0]); if (read_objid(oidstr, oitem->Oid, &oitem->OidLen)) { if (!reqitem->oidhead) reqitem->oidhead = oitem; else reqitem->oidtail->next = oitem; reqitem->oidtail = oitem; } else { /* Could not parse the OID definition */ errprintf("Cannot determine OID for %s\n", oidstr); snmp_perror("read_objid"); xfree(oitem->devname); xfree(oitem); } return oitem; } void readconfig(char *cfgfn, int verbose) { static void *cfgfiles = NULL; FILE *cfgfd; strbuffer_t *inbuf; struct req_t *reqitem = NULL; int tasksleep = atoi(xgetenv("TASKSLEEP")); mibdef_t *mib; /* Check if config was modified */ if (cfgfiles) { if (!stackfmodified(cfgfiles)) { dbgprintf("No files changed, skipping reload\n"); return; } else { stackfclist(&cfgfiles); cfgfiles = NULL; } } cfgfd = stackfopen(cfgfn, "r", &cfgfiles); if (cfgfd == NULL) { errprintf("Cannot open configuration files %s\n", cfgfn); return; } inbuf = newstrbuffer(0); while (stackfgets(inbuf, NULL)) { char *bot, *p, *mibidx; char savech; sanitize_input(inbuf, 0, 0); bot = STRBUF(inbuf) + strspn(STRBUF(inbuf), " \t"); if ((*bot == '\0') || (*bot == '#')) continue; if (*bot == '[') { char *intvl = strchr(bot, '/'); /* * See if we're running a non-standard interval. * If yes, then process only the records that match * this TASKSLEEP setting. */ if (tasksleep != 300) { /* Non-default interval. Skip the host if it HASN'T got an interval setting */ if (!intvl) continue; /* Also skip the hosts that have an interval different from the current */ *intvl = '\0'; /* Clip the interval from the hostname */ if (atoi(intvl+1) != tasksleep) continue; } else { /* Default interval. Skip the host if it HAS an interval setting */ if (intvl) continue; } reqitem = (req_t *)calloc(1, sizeof(req_t)); p = strchr(bot, ']'); if (p) *p = '\0'; reqitem->hostname = strdup(bot + 1); if (p) *p = ']'; reqitem->hostip[0] = reqitem->hostname; reqitem->version = SNMP_VERSION_1; reqitem->authmethod = SNMP_V3AUTH_MD5; reqitem->next = reqhead; reqhead = reqitem; continue; } /* If we have nowhere to put the data, then skip further processing */ if (!reqitem) continue; if (strncmp(bot, "ip=", 3) == 0) { char *nextip = strtok(strdup(bot+3), ","); int i = 0; do { reqitem->hostip[i++] = nextip; nextip = strtok(NULL, ","); } while (nextip); continue; } if (strncmp(bot, "version=", 8) == 0) { switch (*(bot+8)) { case '1': reqitem->version = SNMP_VERSION_1; break; case '2': reqitem->version = SNMP_VERSION_2c; break; case '3': reqitem->version = SNMP_VERSION_3; break; } continue; } if (strncmp(bot, "community=", 10) == 0) { reqitem->community = strdup(bot+10); continue; } if (strncmp(bot, "username=", 9) == 0) { reqitem->username = strdup(bot+9); continue; } if (strncmp(bot, "passphrase=", 10) == 0) { reqitem->passphrase = strdup(bot+10); continue; } if (strncmp(bot, "authmethod=", 10) == 0) { if (strcasecmp(bot+10, "md5") == 0) reqitem->authmethod = SNMP_V3AUTH_MD5; else if (strcasecmp(bot+10, "sha1") == 0) reqitem->authmethod = SNMP_V3AUTH_SHA1; else errprintf("Unknown SNMPv3 authentication method '%s'\n", bot+10); continue; } /* Custom mibs */ p = bot + strcspn(bot, "= \t\r\n"); savech = *p; *p = '\0'; mib = find_mib(bot); *p = savech; p += strspn(p, "= \t"); mibidx = p; if (mib) { int i; mibidx_t *iwalk = NULL; char *oid, *oidbuf; char *devname; oidset_t *swalk; setupmib(mib, verbose); if (mib->loadstatus != MIB_STATUS_LOADED) continue; /* Cannot use this MIB */ /* See if this is an entry where we must determine the index ourselves */ if (*mibidx) { for (iwalk = mib->idxlist; (iwalk && (*mibidx != iwalk->marker)); iwalk = iwalk->next) ; } if ((*mibidx == '*') && !iwalk) { errprintf("Cannot do wildcard matching without an index (host %s, mib %s)\n", reqitem->hostname, mib->mibname); continue; } if (!iwalk) { /* No key lookup */ swalk = mib->oidlisthead; while (swalk) { reqitem->setnumber++; for (i=0; (i <= swalk->oidcount); i++) { if (*mibidx) { oid = oidbuf = (char *)malloc(strlen(swalk->oids[i].oid) + strlen(mibidx) + 2); sprintf(oidbuf, "%s.%s", swalk->oids[i].oid, mibidx); devname = mibidx; } else { oid = swalk->oids[i].oid; oidbuf = NULL; devname = "-"; } make_oitem(mib, devname, &swalk->oids[i], oid, reqitem); if (oidbuf) xfree(oidbuf); } swalk = swalk->next; } reqitem->next_oid = reqitem->oidhead; } else { /* Add a key-record so we can try to locate the index */ keyrecord_t *newitem = (keyrecord_t *)calloc(1, sizeof(keyrecord_t)); char endmarks[6]; mibidx++; /* Skip the key-marker */ sprintf(endmarks, "%s%c", ")]}>", iwalk->marker); p = mibidx + strcspn(mibidx, endmarks); *p = '\0'; newitem->key = strdup(mibidx); newitem->indexmethod = iwalk; newitem->mib = mib; newitem->next = reqitem->keyrecords; reqitem->currentkey = reqitem->keyrecords = newitem; } continue; } else { errprintf("Unknown MIB (not in snmpmibs.cfg): '%s'\n", bot); } } stackfclose(cfgfd); freestrbuffer(inbuf); } void communicate(void) { /* loop while any active requests */ while (active_requests) { int fds = 0, block = 1; fd_set fdset; struct timeval timeout; FD_ZERO(&fdset); snmp_select_info(&fds, &fdset, &timeout, &block); fds = select(fds, &fdset, NULL, NULL, block ? NULL : &timeout); if (fds < 0) { perror("select failed"); exit(1); } if (fds) snmp_read(&fdset); else snmp_timeout(); } } void resolvekeys(void) { req_t *rwalk; keyrecord_t *kwalk; oidset_t *swalk; int i; char *oid; /* Fetch the key data, and determine the indices we want to use */ dataoperation = GET_KEYS; starthosts(1); communicate(); /* Generate new requests for the datasets we now know the indices of */ for (rwalk = reqhead; (rwalk); rwalk = rwalk->next) { if (!rwalk->keyrecords) continue; for (kwalk = rwalk->keyrecords; (kwalk); kwalk = kwalk->next) { if (!kwalk->indexoid) { /* Don't report failed lookups for the pseudo match-all key record */ if (*kwalk->key != '*') { /* We failed to determine the index */ errprintf("Could not determine index for host=%s mib=%s key=%s\n", rwalk->hostname, kwalk->mib->mibname, kwalk->key); } continue; } swalk = kwalk->mib->oidlisthead; while (swalk) { rwalk->setnumber++; for (i=0; (i <= swalk->oidcount); i++) { oid = (char *)malloc(strlen(swalk->oids[i].oid) + strlen(kwalk->indexoid) + 2); sprintf(oid, "%s.%s", swalk->oids[i].oid, kwalk->indexoid); make_oitem(kwalk->mib, kwalk->key, &swalk->oids[i], oid, rwalk); xfree(oid); } swalk = swalk->next; } rwalk->next_oid = rwalk->oidhead; } } } void getdata(void) { dataoperation = GET_DATA; starthosts(1); communicate(); } void sendresult(void) { struct req_t *rwalk; struct oid_t *owalk; char msgline[1024]; char *currdev, *currhost; mibdef_t *mib; strbuffer_t *clientmsg = newstrbuffer(0); int havemsg = 0; int itemcount = 0; currhost = ""; for (rwalk = reqhead; (rwalk); rwalk = rwalk->next) { if (strcmp(rwalk->hostname, currhost) != 0) { /* Flush buffer */ if (havemsg) { sprintf(msgline, "\n.\n", itemcount); addtobuffer(clientmsg, msgline); sendmessage(STRBUF(clientmsg), NULL, XYMON_TIMEOUT, NULL); } clearstrbuffer(clientmsg); havemsg = 0; itemcount = 0; sprintf(msgline, "client/snmpcollect %s.snmpcollect snmp\n\n", rwalk->hostname); addtobuffer(clientmsg, msgline); } currdev = ""; for (mib = first_mib(); (mib); mib = next_mib()) { clearstrbuffer(mib->resultbuf); mib->haveresult = 0; sprintf(msgline, "\n[%s]\nInterval=%d\nActiveIP=%s\n\n", mib->mibname, atoi(xgetenv("TASKSLEEP")), rwalk->hostip[rwalk->hostipidx]); addtobuffer(mib->resultbuf, msgline); } for (owalk = rwalk->oidhead; (owalk); owalk = owalk->next) { if (strcmp(currdev, owalk->devname)) { currdev = owalk->devname; /* OK, because ->devname is permanent */ if (*owalk->devname && (*owalk->devname != '-') ) { addtobuffer(owalk->mib->resultbuf, "\n<"); addtobuffer(owalk->mib->resultbuf, owalk->devname); addtobuffer(owalk->mib->resultbuf, ">\n"); itemcount++; } } addtobuffer(owalk->mib->resultbuf, "\t"); addtobuffer(owalk->mib->resultbuf, owalk->oiddef->dsname); addtobuffer(owalk->mib->resultbuf, " = "); if (owalk->result) { int ival; unsigned int uval; switch (owalk->oiddef->conversion) { case OID_CONVERT_U32: ival = atoi(owalk->result); memcpy(&uval, &ival, sizeof(uval)); sprintf(msgline, "%u", uval); addtobuffer(owalk->mib->resultbuf, msgline); break; default: addtobuffer(owalk->mib->resultbuf, owalk->result); break; } } else addtobuffer(owalk->mib->resultbuf, "NODATA"); addtobuffer(owalk->mib->resultbuf, "\n"); owalk->mib->haveresult = 1; } for (mib = first_mib(); (mib); mib = next_mib()) { if (mib->haveresult) { addtostrbuffer(clientmsg, mib->resultbuf); havemsg = 1; } } } if (havemsg) { sendmessage(STRBUF(clientmsg), NULL, XYMON_TIMEOUT, NULL); } freestrbuffer(clientmsg); } void egoresult(int color, char *egocolumn) { char msgline[1024]; char *timestamps = NULL; init_timestamp(); combo_start(); init_status(color); sprintf(msgline, "status %s.%s %s snmpcollect %s\n\n", xgetenv("MACHINE"), egocolumn, colorname(color), timestamp); addtostatus(msgline); sprintf(msgline, "Variables : %d\n", varcount); addtostatus(msgline); sprintf(msgline, "PDUs : %d\n", pducount); addtostatus(msgline); sprintf(msgline, "Responses : %d\n", okcount); addtostatus(msgline); sprintf(msgline, "Timeouts : %d\n", timeoutcount); addtostatus(msgline); sprintf(msgline, "Too big : %d\n", toobigcount); addtostatus(msgline); sprintf(msgline, "Errors : %d\n", errorcount); addtostatus(msgline); show_timestamps(×tamps); if (timestamps) { addtostatus(timestamps); xfree(timestamps); } finish_status(); combo_end(); } int main (int argc, char **argv) { int argi; char *configfn = NULL; int cfgcheck = 0; int mibcheck = 0; for (argi = 1; (argi < argc); argi++) { if (strcmp(argv[argi], "--debug") == 0) { debug = 1; } else if (strcmp(argv[argi], "--no-update") == 0) { dontsendmessages = 1; } else if (strcmp(argv[argi], "--cfgcheck") == 0) { cfgcheck = 1; } else if (strcmp(argv[argi], "--mibcheck") == 0) { mibcheck = 1; } else if (argnmatch(argv[argi], "--timeout=")) { char *p = strchr(argv[argi], '='); timeout = 1000000*atoi(p+1); } else if (argnmatch(argv[argi], "--retries=")) { char *p = strchr(argv[argi], '='); retries = atoi(p+1); } else if (argnmatch(argv[argi], "--concurrency=")) { char *p = strchr(argv[argi], '='); max_pending_requests = atoi(p+1); } else if (argnmatch(argv[argi], "--report=")) { char *p = strchr(argv[argi], '='); reportcolumn = strdup(p+1); timing = 1; } else if (*argv[argi] != '-') { configfn = strdup(argv[argi]); } } add_timestamp("xymon-snmpcollect startup"); netsnmp_register_loghandler(NETSNMP_LOGHANDLER_STDERR, 7); init_snmp("xymon-snmpcollect"); snmp_mib_toggle_options("e"); /* Like -Pe: Don't show MIB parsing errors */ snmp_out_toggle_options("qn"); /* Like -Oqn: OID's printed as numbers, values printed without type */ readmibs(NULL, mibcheck); if (configfn == NULL) { configfn = (char *)malloc(PATH_MAX); sprintf(configfn, "%s/etc/snmphosts.cfg", xgetenv("XYMONHOME")); } readconfig(configfn, mibcheck); if (cfgcheck) return 0; add_timestamp("Configuration loaded"); resolvekeys(); add_timestamp("Keys lookup complete"); getdata(); stophosts(); add_timestamp("Data retrieved"); sendresult(); add_timestamp("Results transmitted"); if (reportcolumn) egoresult(COL_GREEN, reportcolumn); xfree(configfn); return 0; } xymon-4.3.28/xymonnet/beastat.c0000664000076400007640000002271511615341300016663 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor BEA statistics tool. */ /* */ /* This is used to collect statistics from a BEA Weblogic server */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: beastat.c 6712 2011-07-31 21:01:52Z storner $"; #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" #include "version.h" typedef struct bea_idx_t { char *idx; struct bea_idx_t *next; } bea_idx_t; static bea_idx_t *bea_idxhead = NULL; static char msgline[MAX_LINE_LEN]; static int statuscolor = COL_GREEN; /* Set with environment or command-line options */ static char *location = ""; /* XYMONNETWORK value */ static int testuntagged = 0; static int default_port = 161; static char *default_community = "public"; static int extcmdtimeout = 30; static void find_idxes(char *buf, char *searchstr) { bea_idx_t *idxwalk; char *bol, *eoln, *idxval; /* If we've done it before, clear out the old indexes */ while (bea_idxhead) { idxwalk = bea_idxhead; bea_idxhead = bea_idxhead->next; xfree(idxwalk->idx); xfree(idxwalk); } bea_idxhead = NULL; bol = buf; while ((bol = strstr(bol, searchstr)) != NULL) { idxval = NULL; bol++; eoln = strchr(bol, '\n'); if (eoln) *eoln = '\0'; bol = strchr(bol, '='); if (bol) bol = strchr(bol, '\"'); if (bol) idxval = bol+1; if (bol) bol = strchr(bol+1, '\"'); if (bol) { *bol = '\0'; idxwalk = (bea_idx_t *)malloc(sizeof(bea_idx_t)); idxwalk->idx = strdup(idxval); idxwalk->next = bea_idxhead; bea_idxhead = idxwalk; *bol = '\"'; } if (eoln) *eoln = '\n'; } } int wanted_host(void *host, char *netstring) { char *netlocation = xmh_item(host, XMH_NET); return ((strlen(netstring) == 0) || /* No XYMONNETWORK = do all */ (netlocation && (strcmp(netlocation, netstring) == 0)) || /* XYMONNETWORK && matching NET: tag */ (testuntagged && (netlocation == NULL))); /* No NET: tag for this host */ } char *getstring(char *databuf, char *beaindex, char *key) { static char result[4096]; char keystr[4096]; char *p, *eol; *result = '\0'; sprintf(keystr, "\nBEA-WEBLOGIC-MIB::%s.\"%s\"", key, beaindex); p = strstr(databuf, keystr); if (!p) { /* Might be at the very beginning of the buffer (with no \n first) */ if (strncmp(databuf, keystr+1, strlen(keystr)-1) == 0) p = databuf; } else { p++; } if (p) { eol = strchr(p, '\n'); if (eol) *eol = '\0'; strcpy(result, p); if (eol) *eol = '\n'; } return result; } char *jrockitems[] = { "jrockitRuntimeIndex", "jrockitRuntimeParent", "jrockitRuntimeFreeHeap", "jrockitRuntimeUsedHeap", "jrockitRuntimeTotalHeap", "jrockitRuntimeFreePhysicalMemory", "jrockitRuntimeUsedPhysicalMemory", "jrockitRuntimeTotalPhysicalMemory", "jrockitRuntimeTotalNumberOfThreads", "jrockitRuntimeNumberOfDaemonThreads", "jrockitRuntimeTotalNurserySize", NULL }; char *qitems[] = { "executeQueueRuntimeIndex", "executeQueueRuntimeName", "executeQueueRuntimeParent", "executeQueueRuntimeExecuteThreadCurrentIdleCount", "executeQueueRuntimePendingRequestCurrentCount", "executeQueueRuntimeServicedRequestTotalCount", NULL }; void send_data(void *host, char *beadomain, char *databuf, char **items) { bea_idx_t *idxwalk; strbuffer_t *msgbuf; char *p; int i; msgbuf = newstrbuffer(0); for (idxwalk = bea_idxhead; (idxwalk); idxwalk = idxwalk->next) { sprintf(msgline, "data %s.bea\n\n", commafy(xmh_item(host, XMH_HOSTNAME))); addtobuffer(msgbuf, msgline); if (beadomain && *beadomain) { sprintf(msgline, "DOMAIN:%s\n", beadomain); addtobuffer(msgbuf, msgline); } for (i=0; (items[i]); i++) { p = getstring(databuf, idxwalk->idx, items[i]); sprintf(msgline, "%s\n", p); addtobuffer(msgbuf, msgline); } sendmessage(STRBUF(msgbuf), NULL, XYMON_TIMEOUT, NULL); clearstrbuffer(msgbuf); } freestrbuffer(msgbuf); } int main(int argc, char *argv[]) { void *hwalk; int argi; strbuffer_t *statusmsg, *jrockout, *qout; for (argi = 1; (argi < argc); argi++) { if ((strcmp(argv[argi], "--help") == 0)) { printf("beastat version %s\n\n", VERSION); printf("Usage:\n%s [--debug] [--no-update] [--port=SNMPPORT] [--community=SNMPCOMMUNITY]\n", argv[0]); exit(0); } else if ((strcmp(argv[argi], "--version") == 0)) { printf("beastat version %s\n", VERSION); exit(0); } else if ((strcmp(argv[argi], "--debug") == 0)) { debug = 1; } else if ((strcmp(argv[argi], "--no-update") == 0)) { dontsendmessages = 1; } else if (argnmatch(argv[argi], "--timeout=")) { char *p = strchr(argv[argi], '='); extcmdtimeout = atoi(p+1); } else if (argnmatch(argv[argi], "--port=")) { char *p = strchr(argv[argi], '='); default_port = atoi(p+1); } else if (argnmatch(argv[argi], "--community=")) { char *p = strchr(argv[argi], '='); default_community = strdup(p+1); } } load_hostnames(xgetenv("HOSTSCFG"), "netinclude", get_fqdn()); if (first_host() == NULL) { errprintf("Cannot load file %s\n", xgetenv("HOSTSCFG")); return 1; } if (xgetenv("XYMONNETWORK") && (strlen(xgetenv("XYMONNETWORK")) > 0)) location = strdup(xgetenv("XYMONNETWORK")); else if (xgetenv("BBLOCATION") && (strlen(xgetenv("BBLOCATION")) > 0)) location = strdup(xgetenv("BBLOCATION")); init_timestamp(); combo_start(); statusmsg = newstrbuffer(0); jrockout = newstrbuffer(0); qout = newstrbuffer(0); for (hwalk = first_host(); (hwalk); hwalk = next_host(hwalk, 0)) { char *tspec = xmh_custom_item(hwalk, "bea="); char *snmpcommunity = default_community; char *beadomain = ""; int snmpport = default_port; char *p; char pipecmd[4096]; int jrockres, qres; clearstrbuffer(statusmsg); clearstrbuffer(jrockout); clearstrbuffer(qout); /* Check if we have a "bea" test for this host, and it is a host we want to test */ if (!tspec || !wanted_host(hwalk, location)) continue; /* Parse the testspec: bea=[SNMPCOMMUNITY@]BEADOMAIN[:SNMPPORT] */ tspec = strdup(tspec+strlen("bea=")); p = strchr(tspec, ':'); if (p) { *p = '\0'; snmpport = atoi(p+1); } p = strchr(tspec, '@'); if (p) { *p = '\0'; snmpcommunity = strdup(tspec); beadomain = strdup(p+1); } else { beadomain = strdup(tspec); } /* Prepare for the host status */ statuscolor = COL_GREEN; /* Setup the snmpwalk pipe-command for jrockit stats */ sprintf(pipecmd, "snmpwalk -m BEA-WEBLOGIC-MIB -c %s@%s -v 1 %s:%d enterprises.140.625.302.1", snmpcommunity, beadomain, xmh_item(hwalk, XMH_IP), snmpport); jrockres = run_command(pipecmd, NULL, jrockout, 0, extcmdtimeout); if (jrockres == 0) { find_idxes(STRBUF(jrockout), "BEA-WEBLOGIC-MIB::jrockitRuntimeIndex."); send_data(hwalk, beadomain, STRBUF(jrockout), jrockitems); } else { if (statuscolor < COL_YELLOW) statuscolor = COL_YELLOW; sprintf(msgline, "Could not retrieve BEA jRockit statistics from %s:%d domain %s (code %d)\n", xmh_item(hwalk, XMH_IP), snmpport, beadomain, jrockres); addtobuffer(statusmsg, msgline); } /* Setup the snmpwalk pipe-command for executeQueur stats */ sprintf(pipecmd, "snmpwalk -m BEA-WEBLOGIC-MIB -c %s@%s -v 1 %s:%d enterprises.140.625.180.1", snmpcommunity, beadomain, xmh_item(hwalk, XMH_IP), snmpport); qres = run_command(pipecmd, NULL, qout, 0, extcmdtimeout); if (qres == 0) { find_idxes(STRBUF(qout), "BEA-WEBLOGIC-MIB::executeQueueRuntimeIndex."); send_data(hwalk, beadomain, STRBUF(qout), qitems); } else { if (statuscolor < COL_YELLOW) statuscolor = COL_YELLOW; sprintf(msgline, "Could not retrieve BEA executeQueue statistics from %s:%d domain %s (code %d)\n", xmh_item(hwalk, XMH_IP), snmpport, beadomain, qres); addtobuffer(statusmsg, msgline); } /* FUTURE: Have the statuscolor/statusmsg be updated to check against thresholds */ /* Right now, the "bea" status is always green */ init_status(statuscolor); sprintf(msgline, "status %s.%s %s %s\n\n", commafy(xmh_item(hwalk, XMH_HOSTNAME)), "bea", colorname(statuscolor), timestamp); addtostatus(msgline); if (STRBUFLEN(statusmsg) == 0) addtobuffer(statusmsg, "All BEA monitors OK\n"); addtostrstatus(statusmsg); finish_status(); } combo_end(); freestrbuffer(statusmsg); freestrbuffer(jrockout); freestrbuffer(qout); return 0; } xymon-4.3.28/xymonnet/httpresult.c0000664000076400007640000004670512624223077017476 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor network test tool. */ /* */ /* This is used to implement the testing of HTTP service. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: httpresult.c 7773 2015-11-22 02:19:43Z jccleaver $"; #include #include #include #include #include #include #include #include "libxymon.h" #include "xymonnet.h" #include "contest.h" #include "httpcookies.h" #include "httpresult.h" static int statuscolor(testedhost_t *h, int status) { int result = COL_YELLOW; /* Default behavior is to treat HTTP codes as follows: * <100 = connection error (clear if dialup, otherwise red) * 1xx = yellow (xymonnet will handle 100 Continues already, so if we're here then something went wrong) * 2xx = green * 3xx = yellow * 4xx/5xx = red * Exceptions are listed below. * * TODO: Site-specific defaults; extending 'httpstatus' to be layered ontop of other http modifiers */ switch(status) { case 200: /* OK - most common case */ case 302: /* Temp Redirect */ case 303: /* See Other */ case 307: /* Temp Redirect (HTTP 1.1) */ result = COL_GREEN; break; case 306: /* Defunct HTTP response */ result = COL_RED; break; case STATUS_CONTENTMATCH_FAILED: result = COL_RED; /* Pseudo status: content match fails */ break; case STATUS_CONTENTMATCH_BADREGEX: /* Pseudo status: bad regex to match against */ case STATUS_CONTENTMATCH_NOFILE: /* Pseudo status: content match requested, but no match-file */ result = COL_YELLOW; break; case 000: /* transport layer reports error */ result = (h->dialup ? COL_CLEAR : COL_RED); break; default: /* Unknown or custom status */ result = (status < 100) ? (h->dialup ? COL_CLEAR : COL_RED) : (status < 200) ? COL_YELLOW : (status < 300) ? COL_GREEN : (status < 400) ? COL_YELLOW : COL_RED; break; } return result; } static int statuscolor_by_set(testedhost_t *h, int status, char *okcodes, char *badcodes) { int result = -1; char codestr[10]; pcre *ptn; /* Use code 999 to indicate we could not fetch the URL */ sprintf(codestr, "%d", (status ? status : 999)); if (okcodes) { ptn = compileregex(okcodes); if (matchregex(codestr, ptn)) result = COL_GREEN; else result = COL_RED; freeregex(ptn); } if (badcodes) { ptn = compileregex(badcodes); if (matchregex(codestr, ptn)) result = COL_RED; else result = COL_GREEN; freeregex(ptn); } if (result == -1) result = statuscolor(h, status); dbgprintf("Host %s status %s [%s:%s] -> color %s\n", h->hostname, codestr, (okcodes ? okcodes : ""), (badcodes ? badcodes : ""), colorname(result)); return result; } void send_http_results(service_t *httptest, testedhost_t *host, testitem_t *firsttest, char *nonetpage, int failgoesclear, int usebackfeedqueue) { testitem_t *t; int color = -1; char *svcname; strbuffer_t *msgtext; char *nopagename; int nopage = 0; int anydown = 0, totalreports = 0; if (firsttest == NULL) return; svcname = strdup(httptest->testname); if (httptest->namelen) svcname[httptest->namelen] = '\0'; /* Check if this service is a NOPAGENET service. */ nopagename = (char *) malloc(strlen(svcname)+3); sprintf(nopagename, ",%s,", svcname); nopage = (strstr(nonetpage, svcname) != NULL); xfree(nopagename); dbgprintf("Calc http color host %s : ", host->hostname); msgtext = newstrbuffer(0); for (t=firsttest; (t && (t->host == host)); t = t->next) { http_data_t *req = (http_data_t *) t->privdata; /* Skip the data-reports for now */ if (t->senddata) continue; /* Grab session cookies */ update_session_cookies(host->hostname, req->weburl.desturl->host, req->headers); totalreports++; if (req->weburl.okcodes || req->weburl.badcodes) { req->httpcolor = statuscolor_by_set(host, req->httpstatus, req->weburl.okcodes, req->weburl.badcodes); } else { req->httpcolor = statuscolor(host, req->httpstatus); } if (req->httpcolor == COL_RED) anydown++; /* Dialup hosts and dialup tests report red as clear */ if ((req->httpcolor != COL_GREEN) && (host->dialup || t->dialup)) req->httpcolor = COL_CLEAR; /* If ping failed, report CLEAR unless alwaystrue */ if ( ((req->httpcolor == COL_RED) || (req->httpcolor == COL_YELLOW)) && /* Test failed */ (host->downcount > 0) && /* The ping check did fail */ (!host->noping && !host->noconn) && /* We are doing a ping test */ (failgoesclear) && (!t->alwaystrue) ) /* No "~testname" flag */ { req->httpcolor = COL_CLEAR; } /* If test we depend on has failed, report CLEAR unless alwaystrue */ if ( ((req->httpcolor == COL_RED) || (req->httpcolor == COL_YELLOW)) && /* Test failed */ failgoesclear && !t->alwaystrue ) /* No "~testname" flag */ { char *faileddeps = deptest_failed(host, t->service->testname); if (faileddeps) { req->httpcolor = COL_CLEAR; req->faileddeps = strdup(faileddeps); } } dbgprintf("%s(%s) ", t->testspec, colorname(req->httpcolor)); if (req->httpcolor > color) color = req->httpcolor; /* Build the short msgtext which goes on line 1 of the status message. */ addtobuffer(msgtext, (STRBUFLEN(msgtext) ? " ; " : ": ") ); if (req->tcptest->errcode != CONTEST_ENOERROR) { switch (req->tcptest->errcode) { case CONTEST_ETIMEOUT: req->errorcause = "Server timeout"; break; case CONTEST_ENOCONN : req->errorcause = strdup(strerror(req->tcptest->connres)); break; case CONTEST_EDNS : switch (req->parsestatus) { case 1 : req->errorcause = "Invalid URL"; break; case 2 : req->errorcause = "Hostname not in DNS"; break; default: req->errorcause = "DNS error"; break; } break; case CONTEST_EIO : req->errorcause = "I/O error"; break; case CONTEST_ESSL : req->errorcause = "SSL error"; break; default: req->errorcause = "Xfer failed"; } addtobuffer(msgtext, req->errorcause); } else if (req->tcptest->open == 0) { req->errorcause = "Connect failed"; addtobuffer(msgtext, req->errorcause); } else if ((req->httpcolor == COL_RED) || (req->httpcolor == COL_YELLOW)) { char m1[100]; if (req->weburl.okcodes || req->weburl.badcodes) { sprintf(m1, "Unwanted HTTP status %d", req->httpstatus); } else if (req->headers) { char *p = req->headers; /* Skip past "HTTP/1.x 200 " and pick up the explanatory text, if any */ if (strncasecmp(p, "http/", 5) == 0) { p += 5; p += strspn(p, "0123456789. "); } strncpy(m1, p, sizeof(m1)-1); m1[sizeof(m1)-1] = '\0'; /* Only show the first line of the HTTP status description */ p = m1 + strcspn(m1, "\n\r"); *p = '\0'; } else { sprintf(m1, "Connected, but got empty response (code: %d)", req->httpstatus); } addtobuffer(msgtext, m1); req->errorcause = strdup(m1); } else { addtobuffer(msgtext, "OK"); if (req->weburl.okcodes || req->weburl.badcodes) { char m1[100]; sprintf(m1, " (HTTP status %d)", req->httpstatus); addtobuffer(msgtext, m1); } } } /* It could be that we have 0 http tests - if we only do the apache one */ if (totalreports > 0) { char msgline[4096]; if (anydown) { firsttest->downcount++; if(firsttest->downcount == 1) firsttest->downstart = getcurrenttime(NULL); } else firsttest->downcount = 0; /* Handle the "badtest" stuff for http tests */ if ((color == COL_RED) && (firsttest->downcount < firsttest->badtest[2])) { if (firsttest->downcount >= firsttest->badtest[1]) color = COL_YELLOW; else if (firsttest->downcount >= firsttest->badtest[0]) color = COL_CLEAR; else color = COL_GREEN; } if (nopage && (color == COL_RED)) color = COL_YELLOW; dbgprintf(" --> %s\n", colorname(color)); /* Send off the http status report */ init_status(color); sprintf(msgline, "status+%d %s.%s %s %s", validity, commafy(host->hostname), svcname, colorname(color), timestamp); addtostatus(msgline); addtostrstatus(msgtext); addtostatus("\n"); for (t=firsttest; (t && (t->host == host)); t = t->next) { char *urlmsg; http_data_t *req = (http_data_t *) t->privdata; /* Skip the "data" reports */ if (t->senddata) continue; urlmsg = (char *)malloc(1024 + strlen(req->url)); sprintf(urlmsg, "\n&%s %s - ", colorname(req->httpcolor), req->url); addtostatus(urlmsg); if (req->httpcolor == COL_GREEN) addtostatus("OK"); else { if (req->errorcause) addtostatus(req->errorcause); else addtostatus("failed"); } if (req->weburl.okcodes || req->weburl.badcodes) { char m1[100]; sprintf(m1, " (HTTP status %d)", req->httpstatus); addtostatus(m1); } addtostatus("\n"); if (req->headers) { addtostatus("\n"); addtostatus(req->headers); } if (req->faileddeps) addtostatus(req->faileddeps); sprintf(urlmsg, "\nSeconds: %u.%.9ld\n\n", (unsigned int)req->tcptest->totaltime.tv_sec, req->tcptest->totaltime.tv_nsec); addtostatus(urlmsg); xfree(urlmsg); } addtostatus("\n\n"); finish_status(); } /* Send of any HTTP status tests in separate columns */ for (t=firsttest; (t && (t->host == host)); t = t->next) { int color; char msgline[4096]; char *urlmsg; http_data_t *req = (http_data_t *) t->privdata; if ((t->senddata) || (!req->weburl.columnname) || (req->contentcheck != CONTENTCHECK_NONE)) continue; /* Handle the "badtest" stuff */ color = req->httpcolor; if ((color == COL_RED) && (t->downcount < t->badtest[2])) { if (t->downcount >= t->badtest[1]) color = COL_YELLOW; else if (t->downcount >= t->badtest[0]) color = COL_CLEAR; else color = COL_GREEN; } if (nopage && (color == COL_RED)) color = COL_YELLOW; /* Send off the http status report */ init_status(color); sprintf(msgline, "status+%d %s.%s %s %s", validity, commafy(host->hostname), req->weburl.columnname, colorname(color), timestamp); addtostatus(msgline); addtostatus(" : "); addtostatus(req->errorcause ? req->errorcause : "OK"); if (req->weburl.okcodes || req->weburl.badcodes) { char m1[100]; sprintf(m1, " (HTTP status %d)", req->httpstatus); addtostatus(m1); } addtostatus("\n"); urlmsg = (char *)malloc(1024 + strlen(req->url)); sprintf(urlmsg, "\n&%s %s - ", colorname(req->httpcolor), req->url); addtostatus(urlmsg); xfree(urlmsg); if (req->httpcolor == COL_GREEN) addtostatus("OK"); else { if (req->errorcause) addtostatus(req->errorcause); else addtostatus("failed"); } addtostatus("\n"); if (req->headers) { addtostatus("\n"); addtostatus(req->headers); } if (req->faileddeps) addtostatus(req->faileddeps); sprintf(msgline, "\nSeconds: %u.%.9ld\n\n", (unsigned int)req->tcptest->totaltime.tv_sec, req->tcptest->totaltime.tv_nsec); addtostatus(msgline); addtostatus("\n\n"); finish_status(); } /* Send off any "data" messages now */ for (t=firsttest; (t && (t->host == host)); t = t->next) { http_data_t *req; char *data = ""; strbuffer_t *msg = newstrbuffer(0); char msgline[1024]; if (!t->senddata) continue; req = (http_data_t *) t->privdata; if (req->output) data = req->output; sprintf(msgline, "data %s.%s\n", commafy(host->hostname), req->weburl.columnname); addtobuffer(msg, msgline); addtobuffer(msg, data); combo_add(msg); freestrbuffer(msg); } xfree(svcname); freestrbuffer(msgtext); } static testitem_t *nextcontenttest(service_t *httptest, testedhost_t *host, testitem_t *current) { testitem_t *result; result = current->next; if ((result == NULL) || (result->host != host)) { result = NULL; } return result; } void send_content_results(service_t *httptest, testedhost_t *host, char *nonetpage, char *contenttestname, int failgoesclear) { testitem_t *t, *firsttest; int color = -1; char *nopagename; int nopage = 0; char *conttest; int contentnum = 0; conttest = (char *) malloc(128); if (host->firsthttp == NULL) return; /* Check if this service is a NOPAGENET service. */ nopagename = (char *) malloc(strlen(contenttestname)+3); sprintf(nopagename, ",%s,", contenttestname); nopage = (strstr(nonetpage, contenttestname) != NULL); xfree(nopagename); dbgprintf("Calc content color host %s : ", host->hostname); firsttest = host->firsthttp; for (t=firsttest; (t && (t->host == host)); t = nextcontenttest(httptest, host, t)) { http_data_t *req = (http_data_t *) t->privdata; void *hinfo = hostinfo(host->hostname); int headermatch = (hinfo && xmh_item(hinfo, XMH_FLAG_HTTP_HEADER_MATCH)); char cause[100]; char *msgline; int got_data = 1; /* Skip the "data"-only messages */ if (t->senddata) continue; if (!req->contentcheck) continue; /* We have a content check */ strcpy(cause, "Content OK"); if (req->contstatus == 0) { /* The content check passed initial checks of regexp etc. */ color = statuscolor(t->host, req->httpstatus); if (color == COL_GREEN) { /* We got the data from the server */ regmatch_t foo[1]; int status = 0; switch (req->contentcheck) { case CONTENTCHECK_REGEX: if (headermatch && req->headers) { /* regex() returns 0 on success, REG_NOMATCH on failure */ status = (regexec((regex_t *) req->exp, req->headers, 0, foo, 0) == 0) ? 0 : (req->output && (regexec((regex_t *) req->exp, req->output, 0, foo, 0) == 0)) ? 0 : 1; regfree((regex_t *) req->exp); } else if (req->output) { status = regexec((regex_t *) req->exp, req->output, 0, foo, 0); regfree((regex_t *) req->exp); } else { /* output may be null if we only got a redirect */ status = STATUS_CONTENTMATCH_FAILED; } break; case CONTENTCHECK_NOREGEX: if (headermatch && req->headers) { status = ( (!regexec((regex_t *) req->exp, req->headers, 0, foo, 0)) && (!req->output || (!regexec((regex_t *) req->exp, req->output, 0, foo, 0))) ); regfree((regex_t *) req->exp); } else if (req->output) { status = (!regexec((regex_t *) req->exp, req->output, 0, foo, 0)); regfree((regex_t *) req->exp); } else { /* output may be null if we only got a redirect */ status = STATUS_CONTENTMATCH_FAILED; } break; case CONTENTCHECK_DIGEST: if (req->digest == NULL) req->digest = strdup(""); if (strcmp(req->digest, (char *)req->exp) != 0) { status = STATUS_CONTENTMATCH_FAILED; } else status = 0; req->output = (char *) malloc(strlen(req->digest)+strlen((char *)req->exp)+strlen("Expected:\nGot :\n")+1); sprintf(req->output, "Expected:%s\nGot :%s\n", (char *)req->exp, req->digest); break; case CONTENTCHECK_CONTENTTYPE: if (req->contenttype && (strcasecmp(req->contenttype, (char *)req->exp) == 0)) { status = 0; } else { status = STATUS_CONTENTMATCH_FAILED; } if (req->contenttype == NULL) req->contenttype = strdup("No content-type provdied"); req->output = (char *) malloc(strlen(req->contenttype)+strlen((char *)req->exp)+strlen("Expected content-type: %s\nGot content-type : %s\n")+1); sprintf(req->output, "Expected content-type: %s\nGot content-type : %s\n", (char *)req->exp, req->contenttype); break; } req->contstatus = ((status == 0) ? 200 : STATUS_CONTENTMATCH_FAILED); color = statuscolor(t->host, req->contstatus); if (color != COL_GREEN) strcpy(cause, "Content match failed"); } else { /* * Failed to retrieve the webpage. * Report CLEAR, unless "alwaystrue" is set. */ if (failgoesclear && !t->alwaystrue) color = COL_CLEAR; got_data = 0; strcpy(cause, "Failed to get webpage"); } if (nopage && (color == COL_RED)) color = COL_YELLOW; } else { /* This only happens upon internal errors in Xymon test system */ color = statuscolor(t->host, req->contstatus); strcpy(cause, "Internal Xymon error"); } /* Send the content status message */ dbgprintf("Content check on %s is %s\n", req->url, colorname(color)); if (req->weburl.columnname) { strcpy(conttest, req->weburl.columnname); } else { if (contentnum > 0) sprintf(conttest, "%s%d", contenttestname, contentnum); else strcpy(conttest, contenttestname); contentnum++; } msgline = (char *)malloc(4096 + (2 * strlen(req->url))); init_status(color); sprintf(msgline, "status+%d %s.%s %s %s: %s\n", validity, commafy(host->hostname), conttest, colorname(color), timestamp, cause); addtostatus(msgline); if (!got_data) { if (host->hidehttp) { sprintf(msgline, "\nContent check failed\n"); } else { sprintf(msgline, "\nAn error occurred while testing URL %s\n", req->url, req->url); } } else { if (host->hidehttp) { sprintf(msgline, "\n&%s Content check %s\n", colorname(color), ((color == COL_GREEN) ? "OK" : "Failed")); } else { sprintf(msgline, "\n&%s %s - Testing URL yields:\n", colorname(color), req->url, req->url); } } addtostatus(msgline); xfree(msgline); addtostatus("\n"); if (headermatch && req->headers) { addtostatus(req->headers); addtostatus("\n"); } if (req->output == NULL) { addtostatus("\nNo body output received from server\n\n"); } else if (!host->hidehttp) { /* Don't flood xymond with data */ if (req->outlen > MAX_CONTENT_DATA) { *(req->output + MAX_CONTENT_DATA) = '\0'; req->outlen = MAX_CONTENT_DATA; } if ( (req->contenttype && (strncasecmp(req->contenttype, "text/html", 9) == 0)) || (strncasecmp(req->output, "output, "output, "'); if (p) bodystart = (p+1); } else bodystart = req->output; bodyend = strstr(bodystart, "\n"); addtostatus(bodystart); addtostatus("\n\n"); } else { addtostatus(req->output); } } addtostatus("\n\n"); finish_status(); } xfree(conttest); } void show_http_test_results(service_t *httptest) { http_data_t *req; testitem_t *t; for (t = httptest->items; (t); t = t->next) { req = (http_data_t *) t->privdata; printf("URL : %s\n", req->url); printf("HTTP status : %d\n", req->httpstatus); printf("HTTP headers\n%s\n", textornull(req->headers)); printf("HTTP output\n%s\n", textornull(req->output)); printf("------------------------------------------------------\n"); } } xymon-4.3.28/xymonnet/httptest.h0000664000076400007640000000214411615341300017116 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor network test tool. */ /* */ /* This is used to implement the testing of a HTTP service. */ /* */ /* Copyright (C) 2003-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __HTTPTESTT_H_ #define __HTTPTEST_H_ extern int tcp_http_data_callback(unsigned char *buf, unsigned int len, void *priv); extern void tcp_http_final_callback(void *priv); extern void add_http_test(testitem_t *t); #endif xymon-4.3.28/xymonnet/Makefile0000664000076400007640000001131112473547104016537 0ustar rpmbuildrpmbuild# Xymon - xymonnet Makefile XYMONLIB = ../lib/libxymon.a XYMONLIBS = $(XYMONLIB) XYMONCOMMLIB = ../lib/libxymoncomm.a XYMONCOMMLIBS = $(XYMONCOMMLIB) $(ZLIBLIBS) $(SSLLIBS) $(NETLIBS) $(LIBRTDEF) XYMONTIMELIB = ../lib/libxymontime.a XYMONTIMELIBS = $(XYMONTIMELIB) $(LIBRTDEF) # ARES settings. c-ares is included ifeq ($(SYSTEMCARES),no) CARESINC = -I./c-ares CARESLIBS = libcares.a LOCALCARES = libcares.a endif PROGRAMS = xymonnet xymonping beastat EXTENSIONS = xymonnet-again.sh SNMPPROGRAMS = xymon-snmpcollect DBGTOOLS = contest ifeq ($(DOSNMP),yes) PROGRAMS += $(SNMPPROGRAMS) endif all: $(PROGRAMS) $(EXTENSIONS) $(DBGTOOLS) NETTESTOBJS = xymonnet.o contest.o httptest.o httpresult.o ldaptest.o dns.o dns2.o httpcookies.o PINGTESTOBJS = xymonping.o BEASTATOBJS = beastat.o xymonnet: $(NETTESTOBJS) $(XYMONCOMMLIB) $(XYMONTIMELIB) $(XYMONLIBS) $(CC) $(CFLAGS) -o $@ $(RPATHOPT) $(NETTESTOBJS) $(CARESLIBS) $(LDAPLIBS) $(XYMONTIMELIBS) $(XYMONCOMMLIBS) $(XYMONLIBS) $(PCRELIBS) xymonping: $(PINGTESTOBJS) $(XYMONTIMELIB) ../lib/libxymon.a $(CC) $(CFLAGS) -o $@ $(PINGTESTOBJS) $(XYMONTIMELIBS) $(XYMONCOMMLIBS) xymonnet.o: xymonnet.c $(CC) $(CFLAGS) $(SSLFLAGS) $(LDAPFLAGS) $(SSLINCDIR) $(LDAPINCDIR) -c -o $@ xymonnet.c ldaptest.o: ldaptest.c $(CC) $(CFLAGS) $(LDAPFLAGS) $(LDAPINCDIR) -c -o $@ ldaptest.c httptest.o: httptest.c $(CC) $(CFLAGS) $(SSLFLAGS) $(SSLINCDIR) -c -o $@ httptest.c httpresult.o: httpresult.c $(CC) $(CFLAGS) $(SSLFLAGS) $(SSLINCDIR) -c -o $@ httpresult.c contest.o: contest.c $(CC) $(CFLAGS) $(SSLFLAGS) $(SSLINCDIR) -c -o $@ contest.c dns.o: $(LOCALCARES) dns.c $(CC) $(CFLAGS) $(CARESINC) -c -o $@ dns.c dns2.o: dns2.c $(CC) $(CFLAGS) $(CARESINC) -c -o $@ dns2.c libcares.a: c-ares/.libs/libcares.a ranlib c-ares/.libs/libcares.a || echo "ranlib failure - ignored" cp c-ares/.libs/libcares.a . c-ares/.libs/libcares.a: c-ares/Makefile (cd c-ares && $(MAKE)) c-ares/Makefile: c-ares/configure (cd c-ares && ../c-ares-shim.sh ./configure --disable-shared) c-ares/configure: c-ares-$(ARESVER).tar.gz gzip -dc $< | tar xf - mv c-ares-$(ARESVER) c-ares # Must touch "configure", or it will trigger a rebuild because it is older than the tar.gz file. touch c-ares/configure beastat: $(BEASTATOBJS) $(XYMONCOMMLIB) $(XYMONTIMELIB) $(CC) $(CFLAGS) -o $@ $(RPATHOPT) $(BEASTATOBJS) $(XYMONCOMMLIBS) $(XYMONTIMELIBS) $(PCRELIBS) beastat.o: beastat.c $(CC) $(CFLAGS) $(PCREINCDIR) -c -o $@ beastat.c contest: contest.c httptest.o dns.o dns2.o httpcookies.o $(XYMONCOMMLIB) $(XYMONTIMELIB) $(CC) $(CFLAGS) -o contest -I../include $(CARESINC) -DSTANDALONE contest.c httptest.o dns.o dns2.o httpcookies.o $(CARESLIBS) $(XYMONCOMMLIBS) $(XYMONTIMELIBS) xymon-snmpcollect: xymon-snmpcollect.o $(XYMONCOMMLIB) $(XYMONTIMELIB) $(CC) $(LDFLAGS) -o $@ xymon-snmpcollect.o `net-snmp-config --libs` ../lib/libxymon.a $(XYMONCOMMLIBS) $(XYMONTIMELIBS) xymon-snmpcollect.o: xymon-snmpcollect.c $(CC) $(CFLAGS) -I. `net-snmp-config --cflags` -c -o $@ xymon-snmpcollect.c ################################################ # Default compilation rules ################################################ %.o: %.c $(CC) $(CFLAGS) -c -o $@ $< %.sh: %.sh.DIST cat $< | sed -e 's!@XYMONHOME@!$(XYMONHOME)!g' | sed -e 's!@RUNTIMEDEFS@!$(RUNTIMEDEFS)!g' >$@ chmod 755 $@ clean: rm -f *.o *.a *~ $(PROGRAMS) $(EXTENSIONS) $(DBGTOOLS) install: install-bin install-ext install-config install-man install-bin: $(PROGRAMS) ifndef PKGBUILD chown $(XYMONUSER) $(PROGRAMS) chgrp `$(IDTOOL) -g $(XYMONUSER)` $(PROGRAMS) chmod 755 $(PROGRAMS) endif cp -fp $(PROGRAMS) $(INSTALLROOT)$(INSTALLBINDIR)/ install-ext: $(EXTENSIONS) ifndef PKGBUILD chown $(XYMONUSER) $(EXTENSIONS) chgrp `$(IDTOOL) -g $(XYMONUSER)` $(EXTENSIONS) chmod 755 $(EXTENSIONS) endif cp -fp $(EXTENSIONS) $(INSTALLROOT)$(INSTALLEXTDIR)/ install-config: ../build/convert-bbservices $(INSTALLROOT)$(INSTALLETCDIR)/protocols.cfg ../build/merge-sects protocols.cfg $(INSTALLROOT)$(INSTALLETCDIR)/protocols.cfg ifndef PKGBUILD chown $(XYMONUSER) $(INSTALLROOT)$(INSTALLETCDIR)/protocols.cfg chgrp `$(IDTOOL) -g $(XYMONUSER)` $(INSTALLROOT)$(INSTALLETCDIR)/protocols.cfg chmod 644 $(INSTALLROOT)$(INSTALLETCDIR)/protocols.cfg endif install-man: ifndef PKGBUILD chown $(XYMONUSER) *.1 *.5 chgrp `$(IDTOOL) -g $(XYMONUSER)` *.1 *.5 chmod 644 *.1 *.5 endif mkdir -p $(INSTALLROOT)$(MANROOT)/man1 $(INSTALLROOT)$(MANROOT)/man5 ifndef PKGBUILD chown $(XYMONUSER) $(INSTALLROOT)$(MANROOT)/man1 $(INSTALLROOT)$(MANROOT)/man5 chgrp `$(IDTOOL) -g $(XYMONUSER)` $(INSTALLROOT)$(MANROOT)/man1 $(INSTALLROOT)$(MANROOT)/man5 chmod 755 $(INSTALLROOT)$(MANROOT)/man1 $(INSTALLROOT)$(MANROOT)/man5 endif cp -fp *.1 $(INSTALLROOT)$(MANROOT)/man1/ cp -fp *.5 $(INSTALLROOT)$(MANROOT)/man5/ xymon-4.3.28/xymonnet/httptest.c0000664000076400007640000005113613005712105017116 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor network test tool. */ /* */ /* This is used to implement the testing of HTTP service. */ /* */ /* Copyright (C) 2003-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: httptest.c 7978 2016-10-31 18:58:13Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include "version.h" #include "libxymon.h" #include "xymonnet.h" #include "contest.h" #include "httpcookies.h" #include "httptest.h" #include "dns.h" int tcp_http_data_callback(unsigned char *buf, unsigned int len, void *priv) { /* * This callback receives data from HTTP servers. * While doing that, it splits out the data into a * buffer for the HTTP headers, and a buffer for the * HTTP content-data. * Return 1 if data is complete, 0 if more data wanted. */ http_data_t *item = (http_data_t *) priv; if (item->gotheaders) { unsigned int len1chunk = 0; int i; /* * We already have the headers, so just stash away the data */ while (len > 0) { dbgprintf("HDC IN : state=%d, leftinchunk=%d, len=%d\n", item->chunkstate, item->leftinchunk, len); switch (item->chunkstate) { case CHUNK_NOTCHUNKED: len1chunk = len; if ((item->contlen > 0) && (item->contlen >= len)) item->contlen -= len; break; case CHUNK_INIT: /* We're about to pick up a chunk length */ item->leftinchunk = 0; item->chunkstate = CHUNK_GETLEN; len1chunk = 0; break; case CHUNK_GETLEN: /* We are collecting the length of the chunk */ i = hexvalue(*buf); if (i == -1) { item->chunkstate = CHUNK_SKIPLENCR; } else { item->leftinchunk = item->leftinchunk*16 + i; buf++; len--; } len1chunk = 0; break; case CHUNK_SKIPLENCR: /* We've got the length, now skip to the next LF */ if (*buf == '\n') { buf++; len--; item->chunkstate = ((item->leftinchunk > 0) ? CHUNK_DATA : CHUNK_NOMORE); } else if ((*buf == '\r') || (*buf == ' ')) { buf++; len--; } else { errprintf("Yikes - strange data following chunk len. Saw a '%c'\n", *buf); buf++; len--; } len1chunk = 0; break; case CHUNK_DATA: /* Passing off the data */ if (len > item->leftinchunk) len1chunk = item->leftinchunk; else len1chunk = len; item->leftinchunk -= len1chunk; if (item->leftinchunk == 0) item->chunkstate = CHUNK_SKIPENDCR; break; case CHUNK_SKIPENDCR: /* Skip CR/LF after a chunk */ if (*buf == '\n') { buf++; len--; item->chunkstate = CHUNK_DONE; } else if (*buf == '\r') { buf++; len--; } else { errprintf("Yikes - strange data following chunk data. Saw a '%c'\n", *buf); buf++; len--; } len1chunk = 0; break; case CHUNK_DONE: /* One chunk is done, continue with the next */ len1chunk = 0; item->chunkstate = CHUNK_GETLEN; break; case CHUNK_NOMORE: /* All chunks done. Skip the rest (trailers) */ len1chunk = 0; len = 0; } if (len1chunk > 0) { switch (item->contentcheck) { case CONTENTCHECK_NONE: case CONTENTCHECK_CONTENTTYPE: /* No need to save output - just drop it */ break; case CONTENTCHECK_REGEX: case CONTENTCHECK_NOREGEX: /* Save the full data */ if ((item->output == NULL) || (item->outlen == 0)) { item->output = (unsigned char *)malloc(len1chunk+1); } else { item->output = (unsigned char *)realloc(item->output, item->outlen+len1chunk+1); } memcpy(item->output+item->outlen, buf, len1chunk); item->outlen += len1chunk; *(item->output + item->outlen) = '\0'; /* Just in case ... */ break; case CONTENTCHECK_DIGEST: /* Run the data through our digest routine, but discard the raw data */ if ((item->digestctx == NULL) || (digest_data(item->digestctx, buf, len1chunk) != 0)) { errprintf("Failed to hash data for digest\n"); } break; } buf += len1chunk; len -= len1chunk; dbgprintf("HDC OUT: state=%d, leftinchunk=%d, len=%d\n", item->chunkstate, item->leftinchunk, len); } } } else { /* * Havent seen the end of headers yet. */ unsigned char *p; /* First, add this to the header-buffer */ if (item->headers == NULL) { item->headers = (unsigned char *) malloc(len+1); } else { item->headers = (unsigned char *) realloc(item->headers, item->hdrlen+len+1); } memcpy(item->headers+item->hdrlen, buf, len); item->hdrlen += len; *(item->headers + item->hdrlen) = '\0'; check_for_endofheaders: /* * Now see if we have the end-of-headers delimiter. * This SHOULD be , but RFC 2616 says * you SHOULD recognize just plain . * So try the second form, if the first one is not there. */ p=strstr(item->headers, "\r\n\r\n"); if (p) { p += 4; } else { p = strstr(item->headers, "\n\n"); if (p) p += 2; } if (p) { int http1subver, httpstatus; unsigned int bytesindata; char *p1, *xferencoding; int contlen; /* We have an end-of-header delimiter, but it could be just a "100 Continue" response */ sscanf(item->headers, "HTTP/1.%d %d", &http1subver, &httpstatus); if (httpstatus == 100) { /* * It's a "100" continue-status. * Just drop this set of headers, and move on. */ item->hdrlen -= (p - item->headers); if (item->hdrlen > 0) { memmove(item->headers, p, item->hdrlen); *(item->headers + item->hdrlen) = '\0'; goto check_for_endofheaders; } else { xfree(item->headers); item->headers = NULL; item->hdrlen = 0; return 0; } /* Should never go here ... */ } /* We did find the end-of-header delimiter, and it is not a "100" status. */ item->gotheaders = 1; /* p points at the first byte of DATA. So the header ends 1 or 2 bytes before. */ *(p-1) = '\0'; if (*(p-2) == '\r') { *(p-2) = '\0'; } /* NULL-terminate the headers. */ /* See if the transfer uses chunks */ p1 = item->headers; xferencoding = NULL; contlen = 0; do { if (strncasecmp(p1, "Transfer-encoding:", 18) == 0) { p1 += 18; while (isspace((int)*p1)) p1++; xferencoding = p1; } else if (strncasecmp(p1, "Content-Length:", 15) == 0) { p1 += 15; while (isspace((int)*p1)) p1++; contlen = atoi(p1); } else { p1 = strchr(p1, '\n'); if (p1) p1++; } } while (p1 && (xferencoding == NULL)); if (xferencoding && (strncasecmp(xferencoding, "chunked", 7) == 0)) { item->chunkstate = CHUNK_INIT; } item->contlen = (contlen ? contlen : -1); bytesindata = item->hdrlen - (p - item->headers); item->hdrlen = strlen(item->headers); if (*p) { /* * We received some content data together with the * headers. Save these to the content-data area. */ tcp_http_data_callback(p, bytesindata, priv); } } } if (item->chunkstate == CHUNK_NOTCHUNKED) /* Not chunked - we're done if contlen reaches 0 */ return (item->contlen == 0); else /* Chunked - we're done if we reach state NOMORE*/ return (item->chunkstate == CHUNK_NOMORE); } void tcp_http_final_callback(void *priv) { /* * This callback is invoked when a HTTP request is * complete (when the socket is closed). * We use it to pickup some information from the raw * HTTP response, and parse it into some easier to * handle properties. */ http_data_t *item = (http_data_t *) priv; if ((item->contentcheck == CONTENTCHECK_DIGEST) && item->digestctx) { item->digest = digest_done(item->digestctx); } if (item->headers) { int http1subver; char *p; /* TODO: HTTP2 ? */ sscanf(item->headers, "HTTP/1.%d %d", &http1subver, &item->httpstatus); item->contenttype = NULL; p = item->headers; do { if (strncasecmp(p, "Content-Type:", 13) == 0) { char *p2, savechar; p += 13; while (isspace((int)*p)) p++; p2 = (p + strcspn(p, "\r\n ;")); savechar = *p2; *p2 = '\0'; item->contenttype = strdup(p); *p2 = savechar; } else { p = strchr(p, '\n'); if (p) p++; } } while ((item->contenttype == NULL) && p); } if (item->tcptest->errcode != CONTEST_ENOERROR) { /* Flag error by setting httpstatus to inverted error code. */ item->httpstatus = 0 - item->tcptest->errcode; } } void add_http_test(testitem_t *t) { http_data_t *httptest; char *dnsip = NULL; ssloptions_t *sslopt = NULL; char *sslopt_ciphers = NULL; int sslopt_version = SSLVERSION_DEFAULT; char *sslopt_clientcert = NULL; int httpversion = HTTPVER_11; cookielist_t *ck = NULL; int firstcookie = 1; char *decodedurl; strbuffer_t *httprequest = newstrbuffer(0); void *hinfo = NULL; /* Allocate the private data and initialize it */ httptest = (http_data_t *) calloc(1, sizeof(http_data_t)); t->privdata = (void *) httptest; decodedurl = decode_url(t->testspec, &httptest->weburl); if (!decodedurl) { errprintf("Invalid URL for http check: %s\n", t->testspec); return; } hinfo = hostinfo(t->host->hostname); httptest->url = strdup(decodedurl); httptest->contlen = -1; httptest->parsestatus = (httptest->weburl.proxyurl ? httptest->weburl.proxyurl->parseerror : httptest->weburl.desturl->parseerror); /* If there was a parse error in the URL, don't run the test */ if (httptest->parsestatus) return; if (httptest->weburl.proxyurl && (httptest->weburl.proxyurl->ip == NULL)) { dnsip = dnsresolve(httptest->weburl.proxyurl->host); if (dnsip) { httptest->weburl.proxyurl->ip = strdup(dnsip); } else { dbgprintf("Could not resolve URL hostname '%s'\n", httptest->weburl.proxyurl->host); } } else if (httptest->weburl.desturl->ip == NULL) { dnsip = dnsresolve(httptest->weburl.desturl->host); if (dnsip) { httptest->weburl.desturl->ip = strdup(dnsip); } else { dbgprintf("Could not resolve URL hostname '%s'\n", httptest->weburl.desturl->host); } } switch (httptest->weburl.testtype) { case WEBTEST_PLAIN: case WEBTEST_HEAD: case WEBTEST_STATUS: httptest->contentcheck = CONTENTCHECK_NONE; break; case WEBTEST_CONTENT: { FILE *contentfd; char contentfn[PATH_MAX]; sprintf(contentfn, "%s/content/%s.substring", xgetenv("XYMONHOME"), commafy(t->host->hostname)); contentfd = fopen(contentfn, "r"); if (contentfd) { char l[MAX_LINE_LEN]; char *p; if (fgets(l, sizeof(l), contentfd)) { p = strchr(l, '\n'); if (p) { *p = '\0'; }; httptest->weburl.expdata = strdup(l); } else { httptest->contstatus = STATUS_CONTENTMATCH_NOFILE; } fclose(contentfd); } else { httptest->contstatus = STATUS_CONTENTMATCH_NOFILE; } httptest->contentcheck = CONTENTCHECK_REGEX; } break; case WEBTEST_CONT: httptest->contentcheck = ((*httptest->weburl.expdata == '#') ? CONTENTCHECK_DIGEST : CONTENTCHECK_REGEX); break; case WEBTEST_NOCONT: httptest->contentcheck = CONTENTCHECK_NOREGEX; break; case WEBTEST_POST: case WEBTEST_SOAP: if (httptest->weburl.expdata == NULL) { httptest->contentcheck = CONTENTCHECK_NONE; } else { httptest->contentcheck = ((*httptest->weburl.expdata == '#') ? CONTENTCHECK_DIGEST : CONTENTCHECK_REGEX); } break; case WEBTEST_NOPOST: case WEBTEST_NOSOAP: if (httptest->weburl.expdata == NULL) { httptest->contentcheck = CONTENTCHECK_NONE; } else { httptest->contentcheck = CONTENTCHECK_NOREGEX; } break; case WEBTEST_TYPE: httptest->contentcheck = CONTENTCHECK_CONTENTTYPE; break; } /* Compile the hashes and regex's for those tests that use it */ switch (httptest->contentcheck) { case CONTENTCHECK_DIGEST: { char *hashfunc; httptest->exp = (void *) strdup(httptest->weburl.expdata+1); hashfunc = strchr(httptest->exp, ':'); if (hashfunc) { *hashfunc = '\0'; httptest->digestctx = digest_init(httptest->exp); *hashfunc = ':'; } } break; case CONTENTCHECK_REGEX: case CONTENTCHECK_NOREGEX: { int status; httptest->exp = (void *) malloc(sizeof(regex_t)); status = regcomp((regex_t *)httptest->exp, httptest->weburl.expdata, REG_EXTENDED|REG_NOSUB); if (status) { errprintf("Failed to compile regexp '%s' for URL %s\n", httptest->weburl.expdata, httptest->url); httptest->contstatus = STATUS_CONTENTMATCH_BADREGEX; } } break; case CONTENTCHECK_CONTENTTYPE: httptest->exp = httptest->weburl.expdata; break; } if (httptest->weburl.desturl->schemeopts) { if (strstr(httptest->weburl.desturl->schemeopts, "3")) sslopt_version = SSLVERSION_V3; else if (strstr(httptest->weburl.desturl->schemeopts, "2")) sslopt_version = SSLVERSION_V2; else if (strstr(httptest->weburl.desturl->schemeopts, "t")) sslopt_version = SSLVERSION_TLS10; else if (strstr(httptest->weburl.desturl->schemeopts, "a")) sslopt_version = SSLVERSION_TLS10; else if (strstr(httptest->weburl.desturl->schemeopts, "b")) sslopt_version = SSLVERSION_TLS11; else if (strstr(httptest->weburl.desturl->schemeopts, "c")) sslopt_version = SSLVERSION_TLS12; if (strstr(httptest->weburl.desturl->schemeopts, "h")) sslopt_ciphers = ciphershigh; else if (strstr(httptest->weburl.desturl->schemeopts, "m")) sslopt_ciphers = ciphersmedium; if (strstr(httptest->weburl.desturl->schemeopts, "10")) httpversion = HTTPVER_10; else if (strstr(httptest->weburl.desturl->schemeopts, "11")) httpversion = HTTPVER_11; } /* Get any cookies */ load_cookies(); /* Generate the request */ addtobuffer(httprequest, (httptest->weburl.postdata ? "POST " : (httptest->weburl.testtype == WEBTEST_HEAD) ? "HEAD " : "GET ")); switch (httpversion) { case HTTPVER_10: addtobuffer(httprequest, (httptest->weburl.proxyurl ? httptest->url : httptest->weburl.desturl->relurl)); addtobuffer(httprequest, " HTTP/1.0\r\n"); break; case HTTPVER_11: /* * Experience shows that even though HTTP/1.1 says you should send the * full URL, some servers (e.g. SunOne App server 7) choke on it. * So just send the good-old relative URL unless we're proxying. */ addtobuffer(httprequest, (httptest->weburl.proxyurl ? httptest->url : httptest->weburl.desturl->relurl)); addtobuffer(httprequest, " HTTP/1.1\r\n"); addtobuffer(httprequest, "Connection: close\r\n"); break; } addtobuffer(httprequest, "Host: "); addtobuffer(httprequest, httptest->weburl.desturl->host); if ((httptest->weburl.desturl->port != 80) && (httptest->weburl.desturl->port != 443)) { char hostporthdr[20]; sprintf(hostporthdr, ":%d", httptest->weburl.desturl->port); addtobuffer(httprequest, hostporthdr); } addtobuffer(httprequest, "\r\n"); if (httptest->weburl.postdata) { char hdr[100]; int contlen = strlen(httptest->weburl.postdata); if (strncmp(httptest->weburl.postdata, "file:", 5) == 0) { /* Load the POST data from a file */ FILE *pf = fopen(httptest->weburl.postdata+5, "r"); if (pf == NULL) { errprintf("Cannot open POST data file %s\n", httptest->weburl.postdata+5); xfree(httptest->weburl.postdata); httptest->weburl.postdata = strdup(""); contlen = 0; } else { struct stat st; if (fstat(fileno(pf), &st) == 0) { int n; xfree(httptest->weburl.postdata); httptest->weburl.postdata = (char *)malloc(st.st_size + 1); *(httptest->weburl.postdata) = '\0'; n = fread(httptest->weburl.postdata, 1, st.st_size, pf); if (n == st.st_size) { *(httptest->weburl.postdata+n) = '\0'; contlen = n; } else { errprintf("Cannot read file %s: %s\n", httptest->weburl.postdata+5, strerror(errno)); contlen = 0; } } else { errprintf("Cannot stat file %s\n", httptest->weburl.postdata+5); httptest->weburl.postdata = strdup(""); contlen = 0; } fclose(pf); } } addtobuffer(httprequest, "Content-type: "); if (httptest->weburl.postcontenttype) addtobuffer(httprequest, httptest->weburl.postcontenttype); else if ((httptest->weburl.testtype == WEBTEST_SOAP) || (httptest->weburl.testtype == WEBTEST_NOSOAP)) addtobuffer(httprequest, "application/soap+xml; charset=utf-8"); else addtobuffer(httprequest, "application/x-www-form-urlencoded"); addtobuffer(httprequest, "\r\n"); sprintf(hdr, "Content-Length: %d\r\n", contlen); addtobuffer(httprequest, hdr); } { char useragent[100]; char *browser = NULL; char *httpheaders = NULL; if (hinfo) browser = xmh_item(hinfo, XMH_BROWSER); if (browser) { sprintf(useragent, "User-Agent: %s\r\n", browser); } else { sprintf(useragent, "User-Agent: Xymon xymonnet/%s\r\n", VERSION); } addtobuffer(httprequest, useragent); if (hinfo) httpheaders = xmh_item(hinfo, XMH_HTTPHEADERS); if (httpheaders) { addtobuffer(httprequest, httpheaders); addtobuffer(httprequest, "\r\n"); } } if (httptest->weburl.desturl->auth) { if (strncmp(httptest->weburl.desturl->auth, "CERT:", 5) == 0) { sslopt_clientcert = httptest->weburl.desturl->auth+5; } else { addtobuffer(httprequest, "Authorization: Basic "); addtobuffer(httprequest, base64encode(httptest->weburl.desturl->auth)); addtobuffer(httprequest, "\r\n"); } } if (httptest->weburl.proxyurl && httptest->weburl.proxyurl->auth) { addtobuffer(httprequest, "Proxy-Authorization: Basic "); addtobuffer(httprequest, base64encode(httptest->weburl.proxyurl->auth)); addtobuffer(httprequest, "\r\n"); } for (ck = cookiehead; (ck); ck = ck->next) { int useit = 0; if (ck->tailmatch) { int startpos = strlen(httptest->weburl.desturl->host) - strlen(ck->host); if (startpos > 0) useit = (strcmp(httptest->weburl.desturl->host+startpos, ck->host) == 0); } else useit = (strcmp(httptest->weburl.desturl->host, ck->host) == 0); if (useit) useit = (strncmp(ck->path, httptest->weburl.desturl->relurl, strlen(ck->path)) == 0); if (useit) { if (firstcookie) { addtobuffer(httprequest, "Cookie: "); firstcookie = 0; } addtobuffer(httprequest, ck->name); addtobuffer(httprequest, "="); addtobuffer(httprequest, ck->value); addtobuffer(httprequest, "\r\n"); } } /* Some standard stuff */ addtobuffer(httprequest, "Accept: */*\r\n"); switch (httpversion) { case HTTPVER_10: addtobuffer(httprequest, "Pragma: no-cache\r\n"); break; case HTTPVER_11: addtobuffer(httprequest, "Cache-control: no-cache\r\n"); break; } if ((httptest->weburl.testtype == WEBTEST_SOAP) || (httptest->weburl.testtype == WEBTEST_NOSOAP)) { /* Must provide a SOAPAction header */ addtobuffer(httprequest, "SOAPAction: "); addtobuffer(httprequest, httptest->url); addtobuffer(httprequest, "\r\n"); } /* The final blank line terminates the headers */ addtobuffer(httprequest, "\r\n"); /* Post data goes last */ if (httptest->weburl.postdata) addtobuffer(httprequest, httptest->weburl.postdata); /* Pickup any SSL options the user wants */ if (sslopt_ciphers || (sslopt_version != SSLVERSION_DEFAULT) || sslopt_clientcert){ sslopt = (ssloptions_t *) malloc(sizeof(ssloptions_t)); sslopt->cipherlist = sslopt_ciphers; sslopt->sslversion = sslopt_version; sslopt->clientcert = sslopt_clientcert; } /* Add to TCP test queue */ if (httptest->weburl.proxyurl == NULL) { httptest->tcptest = add_tcp_test(httptest->weburl.desturl->ip, httptest->weburl.desturl->port, httptest->weburl.desturl->scheme, sslopt, t->srcip, t->testspec, t->silenttest, grabstrbuffer(httprequest), httptest, tcp_http_data_callback, tcp_http_final_callback); } else { httptest->tcptest = add_tcp_test(httptest->weburl.proxyurl->ip, httptest->weburl.proxyurl->port, httptest->weburl.proxyurl->scheme, sslopt, t->srcip, t->testspec, t->silenttest, grabstrbuffer(httprequest), httptest, tcp_http_data_callback, tcp_http_final_callback); } if (hinfo && xmh_item(hinfo, XMH_FLAG_SNI)) httptest->tcptest->sni = httptest->weburl.desturl->host; else if (hinfo && xmh_item(hinfo, XMH_FLAG_NOSNI)) httptest->tcptest->sni = NULL; else httptest->tcptest->sni = (snienabled ? httptest->weburl.desturl->host : NULL); } xymon-4.3.28/xymonnet/ldaptest.h0000664000076400007640000000412712000050736017061 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor network test tool. */ /* */ /* This is used to implement the testing of a LDAP service. */ /* */ /* Copyright (C) 2003-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __LDAPTEST_H_ #define __LDAPTEST_H_ #include #ifdef HAVE_LDAP #include #define LDAP_DEPRECATED 1 #include #ifndef LDAPS_PORT #define LDAPS_PORT 636 #endif #endif typedef struct { void *ldapdesc; /* Result from ldap_url_parse() */ int usetls; int skiptest; /* Skip check if failed TCP connect */ int ldapstatus; /* Status from library of the ldap transaction */ char *output; /* Output from ldap query */ int ldapcolor; /* Final color reported */ char *faileddeps; struct timespec duration; char *certinfo; /* Data about SSL certificate */ char *certissuer; /* Data about SSL certificate */ time_t certexpires; /* Expiry time for SSL cert */ int mincipherbits; int certkeysz; } ldap_data_t; extern char *ldap_library_version; extern int init_ldap_library(void); extern void shutdown_ldap_library(void); extern int add_ldap_test(testitem_t *t); extern void run_ldap_tests(service_t *ldaptest, int sslcertcheck, int timeout); extern void show_ldap_test_results(service_t *ldaptest); extern void send_ldap_results(service_t *ldaptest, testedhost_t *host, char *nonetpage, int failgoesclear); #endif xymon-4.3.28/xymonnet/xymonnet.c0000664000076400007640000023411212764675147017146 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor network test tool. */ /* */ /* Copyright (C) 2003-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: xymonnet.c 7967 2016-09-10 03:13:43Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" #ifdef HAVE_RPCENT_H #include #endif #ifdef BROKEN_HPUX_NETDB /* * Some HP-UX include files fail to define RPC functions * and structs that are purely standard. At the same time, * their own docs claim that the DO define them. Go figure ... */ struct rpcent { char *r_name; /* name of server for this rpc program */ char **r_aliases; /* alias list */ int r_number; /* rpc program number */ }; extern struct rpcent *getrpcbyname(char *); #endif #include "libxymon.h" #include "version.h" #include "xymonnet.h" #include "dns.h" #include "contest.h" #include "httptest.h" #include "httpresult.h" #include "httpcookies.h" #include "ldaptest.h" #define DEFAULT_PING_CHILD_COUNT 1 char *reqenv[] = { "NONETPAGE", "HOSTSCFG", "XYMONTMP", "XYMONHOME", NULL }; void * svctree; /* All known services, has service_t records */ service_t *pingtest = NULL; /* Identifies the pingtest within svctree list */ int pingcount = 0; service_t *dnstest = NULL; /* Identifies the dnstest within svctree list */ service_t *httptest = NULL; /* Identifies the httptest within svctree list */ service_t *ldaptest = NULL; /* Identifies the ldaptest within svctree list */ service_t *rpctest = NULL; /* Identifies the rpctest within svctree list */ void * testhosttree; /* All tested hosts, has testedhost_t records */ char *nonetpage = NULL; /* The "NONETPAGE" env. variable */ int dnsmethod = DNS_THEN_IP; /* How to do DNS lookups */ int timeout=10; /* The timeout (seconds) for all TCP-tests */ char *contenttestname = "content"; /* Name of the content checks column */ char *ssltestname = "sslcert"; /* Name of the SSL certificate checks column */ char *failtext = "not OK"; int sslwarndays = 30; /* If cert expires in fewer days, SSL cert column = yellow */ int sslalarmdays = 10; /* If cert expires in fewer days, SSL cert column = red */ int mincipherbits = 0; /* If weakest cipher is weaker than this # of buts, SSL cert column = red */ int validity = 30; int pingchildcount = DEFAULT_PING_CHILD_COUNT; /* How many ping processes to start */ char *location = ""; /* XYMONNETWORK value */ int hostcount = 0; int testcount = 0; int notesthostcount = 0; char **selectedhosts; int selectedcount = 0; int testuntagged = 0; time_t frequenttestlimit = 1800; /* Interval (seconds) when failing hosts are retried frequently */ int checktcpresponse = 0; int dotraceroute = 0; int fqdn = 1; int dosendflags = 1; char *pingcmd = NULL; char pinglog[PATH_MAX]; char pingerrlog[PATH_MAX]; pid_t *pingpids; int respcheck_color = COL_YELLOW; httpstatuscolor_t *httpstatusoverrides = NULL; int extcmdtimeout = 30; int bigfailure = 0; char *defaultsourceip = NULL; int loadhostsfromxymond = 0; int sslminkeysize = 0; void dump_hostlist(void) { xtreePos_t handle; testedhost_t *walk; for (handle = xtreeFirst(testhosttree); (handle != xtreeEnd(testhosttree)); handle = xtreeNext(testhosttree, handle)) { walk = (testedhost_t *)xtreeData(testhosttree, handle); printf("Hostname: %s\n", textornull(walk->hostname)); printf("\tIP : %s\n", textornull(walk->ip)); printf("\tHosttype : %s\n", textornull(walk->hosttype)); printf("\tFlags :"); if (walk->testip) printf(" testip"); if (walk->dialup) printf(" dialup"); if (walk->nosslcert) printf(" nosslcert"); if (walk->dodns) printf(" dodns"); if (walk->dnserror) printf(" dnserror"); if (walk->repeattest) printf(" repeattest"); if (walk->noconn) printf(" noconn"); if (walk->noping) printf(" noping"); if (walk->dotrace) printf(" dotrace"); printf("\n"); printf("\tbadconn : %d:%d:%d\n", walk->badconn[0], walk->badconn[1], walk->badconn[2]); printf("\tdowncount : %d started %s", walk->downcount, ctime(&walk->downstart)); printf("\trouterdeps : %s\n", textornull(walk->routerdeps)); printf("\tdeprouterdown: %s\n", (walk->deprouterdown ? textornull(walk->deprouterdown->hostname) : "")); printf("\tldapauth : '%s' '%s'\n", textornull(walk->ldapuser), textornull(walk->ldappasswd)); printf("\tSSL alerts : %d:%d\n", walk->sslwarndays, walk->sslalarmdays); printf("\n"); } } void dump_testitems(void) { xtreePos_t handle; service_t *swalk; testitem_t *iwalk; for (handle = xtreeFirst(svctree); handle != xtreeEnd(svctree); handle = xtreeNext(svctree, handle)) { swalk = (service_t *)xtreeData(svctree, handle); printf("Service %s, port %d, toolid %d\n", swalk->testname, swalk->portnum, swalk->toolid); for (iwalk = swalk->items; (iwalk); iwalk = iwalk->next) { printf("\tHost : %s\n", textornull(iwalk->host->hostname)); printf("\ttestspec : %s\n", textornull(iwalk->testspec)); printf("\tFlags :"); if (iwalk->dialup) printf(" dialup"); if (iwalk->reverse) printf(" reverse"); if (iwalk->silenttest) printf(" silenttest"); if (iwalk->alwaystrue) printf(" alwaystrue"); printf("\n"); printf("\tOpen : %d\n", iwalk->open); printf("\tBanner : %s\n", textornull(STRBUF(iwalk->banner))); printf("\tcertinfo : %s\n", textornull(iwalk->certinfo)); printf("\tDuration : %ld.%06ld\n", (long int)iwalk->duration.tv_sec, (long int)iwalk->duration.tv_nsec / 1000); printf("\tbadtest : %d:%d:%d\n", iwalk->badtest[0], iwalk->badtest[1], iwalk->badtest[2]); printf("\tdowncount : %d started %s", iwalk->downcount, ctime(&iwalk->downstart)); printf("\n"); } printf("\n"); } } testitem_t *find_test(char *hostname, char *testname) { xtreePos_t handle; testedhost_t *h; service_t *s; testitem_t *t; handle = xtreeFind(svctree, testname); if (handle == xtreeEnd(svctree)) return NULL; s = (service_t *)xtreeData(svctree, handle); handle = xtreeFind(testhosttree, hostname); if (handle == xtreeEnd(testhosttree)) return NULL; h = (testedhost_t *)xtreeData(testhosttree, handle); for (t=s->items; (t && (t->host != h)); t = t->next) ; return t; } char *deptest_failed(testedhost_t *host, char *testname) { static char result[1024]; char *depcopy; char depitem[MAX_LINE_LEN]; char *p, *q; char *dephostname, *deptestname, *nextdep; testitem_t *t; if (host->deptests == NULL) return NULL; depcopy = strdup(host->deptests); sprintf(depitem, "(%s:", testname); p = strstr(depcopy, depitem); if (p == NULL) { xfree(depcopy); return NULL; } result[0] = '\0'; dephostname = p+strlen(depitem); q = strchr(dephostname, ')'); if (q) *q = '\0'; /* dephostname now points to a list of "host1/test1,host2/test2" dependent tests. */ while (dephostname) { p = strchr(dephostname, '/'); if (p) { *p = '\0'; deptestname = (p+1); } else deptestname = ""; p = strchr(deptestname, ','); if (p) { *p = '\0'; nextdep = (p+1); } else nextdep = NULL; t = find_test(dephostname, deptestname); if (t && !t->open) { if (strlen(result) == 0) { strcpy(result, "\nThis test depends on the following test(s) that failed:\n\n"); } if ((strlen(result) + strlen(dephostname) + strlen(deptestname) + 2) < sizeof(result)) { strcat(result, dephostname); strcat(result, "/"); strcat(result, deptestname); strcat(result, "\n"); } } dephostname = nextdep; } xfree(depcopy); if (strlen(result)) strcat(result, "\n\n"); return (strlen(result) ? result : NULL); } service_t *add_service(char *name, int port, int namelen, int toolid) { xtreePos_t handle; service_t *svc; /* Avoid duplicates */ handle = xtreeFind(svctree, name); if (handle != xtreeEnd(svctree)) { svc = (service_t *)xtreeData(svctree, handle); return svc; } svc = (service_t *) malloc(sizeof(service_t)); svc->portnum = port; svc->testname = strdup(name); svc->toolid = toolid; svc->namelen = namelen; svc->items = NULL; xtreeAdd(svctree, svc->testname, svc); return svc; } int getportnumber(char *svcname) { struct servent *svcinfo; int result = 0; result = default_tcp_port(svcname); if (result == 0) { svcinfo = getservbyname(svcname, NULL); if (svcinfo) result = ntohs(svcinfo->s_port); } return result; } void load_services(void) { char *netsvcs; char *p; netsvcs = strdup(init_tcp_services()); p = strtok(netsvcs, " "); while (p) { add_service(p, getportnumber(p), 0, TOOL_CONTEST); p = strtok(NULL, " "); } xfree(netsvcs); /* Save NONETPAGE env. var in ",test1,test2," format for easy and safe grepping */ nonetpage = (char *) malloc(strlen(xgetenv("NONETPAGE"))+3); sprintf(nonetpage, ",%s,", xgetenv("NONETPAGE")); for (p=nonetpage; (*p); p++) if (*p == ' ') *p = ','; } testedhost_t *init_testedhost(char *hostname) { testedhost_t *newhost; hostcount++; newhost = (testedhost_t *) calloc(1, sizeof(testedhost_t)); newhost->hostname = strdup(hostname); newhost->dotrace = dotraceroute; newhost->sslwarndays = sslwarndays; newhost->sslalarmdays = sslalarmdays; newhost->mincipherbits = mincipherbits; return newhost; } testitem_t *init_testitem(testedhost_t *host, service_t *service, char *srcip, char *testspec, int dialuptest, int reversetest, int alwaystruetest, int silenttest, int sendasdata) { testitem_t *newtest; testcount++; newtest = (testitem_t *) calloc(1, sizeof(testitem_t)); newtest->host = host; newtest->service = service; newtest->dialup = dialuptest; newtest->reverse = reversetest; newtest->alwaystrue = alwaystruetest; newtest->silenttest = silenttest; newtest->senddata = sendasdata; newtest->testspec = (testspec ? strdup(testspec) : NULL); if (srcip) newtest->srcip = strdup(srcip); else if (defaultsourceip) newtest->srcip = defaultsourceip; else newtest->srcip = NULL; newtest->privdata = NULL; newtest->open = 0; newtest->banner = newstrbuffer(0); newtest->certinfo = NULL; newtest->certissuer = NULL; newtest->certexpires = 0; newtest->certkeysz = 0; newtest->mincipherbits = 0; newtest->duration.tv_sec = newtest->duration.tv_nsec = -1; newtest->downcount = 0; newtest->badtest[0] = newtest->badtest[1] = newtest->badtest[2] = 0; newtest->internal = 0; newtest->next = NULL; return newtest; } int wanted_host(void *host, char *netstring) { char *netlocation = xmh_item(host, XMH_NET); if (selectedcount == 0) return ((strlen(netstring) == 0) || /* No XYMONNETWORK = do all */ (netlocation && (strcmp(netlocation, netstring) == 0)) || /* XYMONNETWORK && matching NET: tag */ (testuntagged && (netlocation == NULL))); /* No NET: tag for this host */ else { /* User provided an explicit list of hosts to test */ int i; for (i=0; (i < selectedcount); i++) { if (strcmp(selectedhosts[i], xmh_item(host, XMH_HOSTNAME)) == 0) return 1; } } return 0; } void load_tests(void) { char *p, *routestring = NULL; void *hwalk; testedhost_t *h; int badtagsused = 0; if (loadhostsfromxymond) { if (load_hostnames("@", NULL, fqdn) != 0) { errprintf("Cannot load host configuration from xymond\n"); return; } } else { if (load_hostnames(xgetenv("HOSTSCFG"), "netinclude", fqdn) != 0) { errprintf("Cannot load host configuration from %s\n", xgetenv("HOSTSCFG")); return; } } if (first_host() == NULL) { errprintf("Empty configuration from %s\n", (loadhostsfromxymond ? "xymond" : xgetenv("HOSTSCFG"))); return; } /* Each network test tagged with NET:locationname */ if (strlen(location) > 0) { routestring = (char *) malloc(strlen(location)+strlen("route_:")+1); sprintf(routestring, "route_%s:", location); } for (hwalk = first_host(); (hwalk); hwalk = next_host(hwalk, 0)) { int anytests = 0; int ping_dialuptest = 0, ping_reversetest = 0; char *testspec; if (!wanted_host(hwalk, location)) continue; h = init_testedhost(xmh_item(hwalk, XMH_HOSTNAME)); p = xmh_custom_item(hwalk, "badconn:"); if (p) { sscanf(p+strlen("badconn:"), "%d:%d:%d", &h->badconn[0], &h->badconn[1], &h->badconn[2]); badtagsused = 1; } p = xmh_custom_item(hwalk, "route:"); if (p) h->routerdeps = p + strlen("route:"); if (routestring) { p = xmh_custom_item(hwalk, routestring); if (p) h->routerdeps = p + strlen(routestring); } if (xmh_item(hwalk, XMH_FLAG_NOCONN)) h->noconn = 1; if (xmh_item(hwalk, XMH_FLAG_NOPING)) h->noping = 1; if (xmh_item(hwalk, XMH_FLAG_TRACE)) h->dotrace = 1; if (xmh_item(hwalk, XMH_FLAG_NOTRACE)) h->dotrace = 0; if (xmh_item(hwalk, XMH_FLAG_TESTIP)) h->testip = 1; if (xmh_item(hwalk, XMH_FLAG_DIALUP)) h->dialup = 1; if (xmh_item(hwalk, XMH_FLAG_NOSSLCERT)) h->nosslcert = 1; if (xmh_item(hwalk, XMH_FLAG_LDAPFAILYELLOW)) h->ldapsearchfailyellow = 1; if (xmh_item(hwalk, XMH_FLAG_HIDEHTTP)) h->hidehttp = 1; p = xmh_item(hwalk, XMH_SSLDAYS); if (p) sscanf(p, "%d:%d", &h->sslwarndays, &h->sslalarmdays); p = xmh_item(hwalk, XMH_SSLMINBITS); if (p) h->mincipherbits = atoi(p); p = xmh_item(hwalk, XMH_DEPENDS); if (p) h->deptests = p; p = xmh_item(hwalk, XMH_LDAPLOGIN); if (p) { h->ldapuser = strdup(p); h->ldappasswd = (strchr(h->ldapuser, ':')); if (h->ldappasswd) { *h->ldappasswd = '\0'; h->ldappasswd++; } } p = xmh_item(hwalk, XMH_DESCRIPTION); if (p) { h->hosttype = strdup(p); p = strchr(h->hosttype, ':'); if (p) *p = '\0'; } testspec = xmh_item_walk(hwalk); while (testspec) { service_t *s = NULL; int dialuptest = 0, reversetest = 0, silenttest = 0, sendasdata = 0; char *srcip = NULL; int alwaystruetest = (xmh_item(hwalk, XMH_FLAG_NOCLEAR) != NULL); if (xmh_item_idx(testspec) == -1) { /* Test prefixes: * - '?' denotes dialup test, i.e. report failures as clear. * - '|' denotes reverse test, i.e. service should be DOWN. * - '~' denotes test that ignores ping result (normally, * TCP tests are reported CLEAR if ping check fails; * with this flag report their true status) */ if (*testspec == '?') { dialuptest=1; testspec++; } if (*testspec == '!') { reversetest=1; testspec++; } if (*testspec == '~') { alwaystruetest=1; testspec++; } if (pingtest && argnmatch(testspec, pingtest->testname)) { char *p; /* * Ping/conn test. Save any modifier flags for later use. */ ping_dialuptest = dialuptest; ping_reversetest = reversetest; p = strchr(testspec, '='); if (p) { char *ips; /* Extra ping tests - save them for later */ h->extrapings = (extraping_t *)malloc(sizeof(extraping_t)); h->extrapings->iplist = NULL; if (argnmatch(p, "=worst,")) { h->extrapings->matchtype = MULTIPING_WORST; ips = strdup(p+7); } else if (argnmatch(p, "=best,")) { h->extrapings->matchtype = MULTIPING_BEST; ips = strdup(p+6); } else { h->extrapings->matchtype = MULTIPING_BEST; ips = strdup(p+1); } do { ipping_t *newping = (ipping_t *)malloc(sizeof(ipping_t)); newping->ip = ips; newping->open = 0; newping->banner = newstrbuffer(0); newping->next = h->extrapings->iplist; h->extrapings->iplist = newping; ips = strchr(ips, ','); if (ips) { *ips = '\0'; ips++; } } while (ips && (*ips)); } s = NULL; /* Don't add the test now - ping is special (enabled by default) */ } else if ((argnmatch(testspec, "ldap://")) || (argnmatch(testspec, "ldaps://"))) { /* * LDAP test. This uses ':' a lot, so save it here. */ #ifdef HAVE_LDAP s = ldaptest; add_url_to_dns_queue(testspec); #else errprintf("Host %s: ldap test requested, but xymonnet was built with no ldap support\n", xmh_item(hwalk, XMH_HOSTNAME)); #endif } else if ((strcmp(testspec, "http") == 0) || (strcmp(testspec, "https") == 0)) { errprintf("Host %s: http/https tests requires a full URL\n", xmh_item(hwalk, XMH_HOSTNAME)); } else if ( argnmatch(testspec, "http") || argnmatch(testspec, "content=http") || argnmatch(testspec, "cont;http") || argnmatch(testspec, "cont=") || argnmatch(testspec, "nocont;http") || argnmatch(testspec, "nocont=") || argnmatch(testspec, "post;http") || argnmatch(testspec, "post=") || argnmatch(testspec, "nopost;http") || argnmatch(testspec, "nopost=") || argnmatch(testspec, "soap;http") || argnmatch(testspec, "soap=") || argnmatch(testspec, "nosoap;http") || argnmatch(testspec, "nosoap=") || argnmatch(testspec, "type;http") || argnmatch(testspec, "type=") ) { /* HTTP test. */ weburl_t url; decode_url(testspec, &url); if (url.desturl->parseerror || (url.proxyurl && url.proxyurl->parseerror)) { s = NULL; errprintf("Host %s: Invalid URL for http test - ignored: %s\n", xmh_item(hwalk, XMH_HOSTNAME), testspec); } else { s = httptest; if (!url.desturl->ip) add_url_to_dns_queue(testspec); } } else if (argnmatch(testspec, "apache") || argnmatch(testspec, "apache=")) { char *userfmt = "cont=apache;%s;."; char *deffmt = "cont=apache;http://%s/server-status?auto;."; static char *statusurl = NULL; char *userurl; if (statusurl != NULL) xfree(statusurl); userurl = strchr(testspec, '='); if (userurl) { weburl_t url; userurl++; decode_url(userurl, &url); if (url.desturl->parseerror || (url.proxyurl && url.proxyurl->parseerror)) { s = NULL; errprintf("Host %s: Invalid URL for apache test - ignored: %s\n", xmh_item(hwalk, XMH_HOSTNAME), testspec); } else { statusurl = (char *)malloc(strlen(userurl) + strlen(userfmt) + 1); sprintf(statusurl, userfmt, userurl); s = httptest; } } else { char *ip = xmh_item(hwalk, XMH_IP); statusurl = (char *)malloc(strlen(deffmt) + strlen(ip) + 1); sprintf(statusurl, deffmt, ip); s = httptest; } if (s) { testspec = statusurl; add_url_to_dns_queue(testspec); sendasdata = 1; } } else if (argnmatch(testspec, "rpc")) { /* * rpc check via rpcinfo */ s = rpctest; } else if (argnmatch(testspec, "dns=")) { s = dnstest; } else if (argnmatch(testspec, "dig=")) { s = dnstest; } else { /* * Simple TCP connect test. */ char *option; xtreePos_t handle; /* See if there's a source IP */ srcip = strchr(testspec, '@'); if (srcip) { *srcip = '\0'; srcip++; } /* Remove any trailing ":s", ":q", ":Q", ":portnumber" */ option = strchr(testspec, ':'); if (option) { *option = '\0'; option++; } /* Find the service */ handle = xtreeFind(svctree, testspec); s = ((handle == xtreeEnd(svctree)) ? NULL : (service_t *)xtreeData(svctree, handle)); if (option && s) { /* * Check if it is a service with an explicit portnumber. * If it is, then create a new service record named * "SERVICE_PORT" so we can merge tests for this service+port * combination for multiple hosts. * * According to Xymon docs, this type of services must be in * XYMONNETSVCS - so it is known already. */ int specialport = 0; char *specialname; char *opt2 = strrchr(option, ':'); if (opt2) { if (strcmp(opt2, ":s") == 0) { /* option = "portnumber:s" */ silenttest = 1; *opt2 = '\0'; specialport = atoi(option); *opt2 = ':'; } } else if (strcmp(option, "s") == 0) { /* option = "s" */ silenttest = 1; specialport = 0; } else { /* option = "portnumber" */ specialport = atoi(option); } if (specialport) { specialname = (char *) malloc(strlen(s->testname)+10); sprintf(specialname, "%s_%d", s->testname, specialport); s = add_service(specialname, specialport, strlen(s->testname), TOOL_CONTEST); xfree(specialname); } } if (s) h->dodns = 1; if (option) *(option-1) = ':'; } if (s) { testitem_t *newtest; anytests = 1; newtest = init_testitem(h, s, srcip, testspec, dialuptest, reversetest, alwaystruetest, silenttest, sendasdata); newtest->next = s->items; s->items = newtest; if (s == httptest) h->firsthttp = newtest; else if (s == ldaptest) { xtreePos_t handle; service_t *s2 = NULL; testitem_t *newtest2; h->firstldap = newtest; /* * Add a plain tcp-connect test for the LDAP service. * We don't want the LDAP library to run amok and do * time-consuming connect retries if the service * is down. */ handle = xtreeFind(svctree, "ldap"); s2 = ((handle == xtreeEnd(svctree)) ? NULL : (service_t *)xtreeData(svctree, handle)); if (s2) { newtest2 = init_testitem(h, s2, NULL, "ldap", 0, 0, 0, 0, 1); newtest2->internal = 1; newtest2->next = s2->items; s2->items = newtest2; newtest->privdata = newtest2; } } } } testspec = xmh_item_walk(NULL); } if (pingtest && !h->noconn) { /* Add the ping check */ testitem_t *newtest; anytests = 1; newtest = init_testitem(h, pingtest, NULL, NULL, ping_dialuptest, ping_reversetest, 1, 0, 0); newtest->next = pingtest->items; pingtest->items = newtest; h->dodns = 1; } /* * Setup badXXX values. * * We need to do this last, because the testitem_t records do * not exist until the test has been created. * * So after parsing the badFOO tag, we must find the testitem_t * record created earlier for this test (it may not exist). */ testspec = xmh_item_walk(hwalk); while (testspec) { char *testname, *timespec, *badcounts; int badclear, badyellow, badred; int inscope; testitem_t *twalk; service_t *swalk; if (strncmp(testspec, "bad", 3) != 0) { /* Not a bad* tag - skip it */ testspec = xmh_item_walk(NULL); continue; } badtagsused = 1; badclear = badyellow = badred = 0; inscope = 1; testname = testspec+strlen("bad"); badcounts = strchr(testspec, ':'); if (badcounts) { if (sscanf(badcounts, ":%d:%d:%d", &badclear, &badyellow, &badred) != 3) { errprintf("Host %s: Incorrect 'bad' counts: '%s'\n", xmh_item(hwalk, XMH_HOSTNAME), badcounts); badcounts = NULL; } } timespec = strchr(testspec, '-'); if (timespec) inscope = periodcoversnow(timespec); if (strlen(testname) && badcounts && inscope) { char *p; xtreePos_t handle; twalk = NULL; p = strchr(testname, ':'); if (p) *p = '\0'; handle = xtreeFind(svctree, testname); swalk = ((handle == xtreeEnd(svctree)) ? NULL : (service_t *)xtreeData(svctree, handle)); if (p) *p = ':'; if (swalk) { if (swalk == httptest) twalk = h->firsthttp; else if (swalk == ldaptest) twalk = h->firstldap; else for (twalk = swalk->items; (twalk && (twalk->host != h)); twalk = twalk->next) ; } if (twalk) { twalk->badtest[0] = badclear; twalk->badtest[1] = badyellow; twalk->badtest[2] = badred; } else { dbgprintf("No test for badtest spec host=%s, test=%s\n", h->hostname, testname); } } testspec = xmh_item_walk(NULL); } if (anytests) { xtreeStatus_t res; /* * Check for a duplicate host def. Causes all sorts of funny problems. * However, don't drop the second definition - to do this, we will have * to clean up the testitem lists as well, or we get crashes when * tests belong to a non-existing host. */ res = xtreeAdd(testhosttree, h->hostname, h); if (res == XTREE_STATUS_DUPLICATE_KEY) { errprintf("Host %s appears twice in hosts.cfg! This may cause strange results\n", h->hostname); } strcpy(h->ip, xmh_item(hwalk, XMH_IP)); if (!h->testip && (dnsmethod != IP_ONLY)) add_host_to_dns_queue(h->hostname); } else { /* No network tests for this host, so ignore it */ dbgprintf("Did not find any network tests for host %s\n", h->hostname); xfree(h); notesthostcount++; } } if (badtagsused) { errprintf("WARNING: The 'bad' syntax has been deprecated, please convert to 'delayred' and/or 'delayyellow' tags\n"); } return; } char *ip_to_test(testedhost_t *h) { char *dnsresult; int nullip = (strcmp(h->ip, "0.0.0.0") == 0); if (!nullip && (h->testip || (dnsmethod == IP_ONLY))) { /* Already have the IP setup */ } else if (h->dodns) { dnsresult = dnsresolve(h->hostname); if (dnsresult) { strcpy(h->ip, dnsresult); } else if ((dnsmethod == DNS_THEN_IP) && !nullip) { /* Already have the IP setup */ } else { /* Cannot resolve hostname */ h->dnserror = 1; errprintf("xymonnet: Cannot resolve IP for host %s\n", h->hostname); } } return h->ip; } void load_ping_status(void) { FILE *statusfd; char statusfn[PATH_MAX]; char l[MAX_LINE_LEN]; char host[MAX_LINE_LEN]; int downcount; time_t downstart; xtreePos_t handle; testedhost_t *h; sprintf(statusfn, "%s/ping.%s.status", xgetenv("XYMONTMP"), location); statusfd = fopen(statusfn, "r"); if (statusfd == NULL) return; while (fgets(l, sizeof(l), statusfd)) { unsigned int uidownstart; if (sscanf(l, "%s %d %u", host, &downcount, &uidownstart) == 3) { downstart = uidownstart; handle = xtreeFind(testhosttree, host); if (handle != xtreeEnd(testhosttree)) { h = (testedhost_t *)xtreeData(testhosttree, handle); if (!h->noping && !h->noconn) { h->downcount = downcount; h->downstart = downstart; } } } } fclose(statusfd); } void save_ping_status(void) { FILE *statusfd; char statusfn[PATH_MAX]; testitem_t *t; int didany = 0; sprintf(statusfn, "%s/ping.%s.status", xgetenv("XYMONTMP"), location); statusfd = fopen(statusfn, "w"); if (statusfd == NULL) return; for (t=pingtest->items; (t); t = t->next) { if (t->host->downcount) { fprintf(statusfd, "%s %d %u\n", t->host->hostname, t->host->downcount, (unsigned int)t->host->downstart); didany = 1; t->host->repeattest = ((getcurrenttime(NULL) - t->host->downstart) < frequenttestlimit); } } fclose(statusfd); if (!didany) unlink(statusfn); } void load_test_status(service_t *test) { FILE *statusfd; char statusfn[PATH_MAX]; char l[MAX_LINE_LEN]; char host[MAX_LINE_LEN]; int downcount; time_t downstart; xtreePos_t handle; testedhost_t *h; testitem_t *walk; sprintf(statusfn, "%s/%s.%s.status", xgetenv("XYMONTMP"), test->testname, location); statusfd = fopen(statusfn, "r"); if (statusfd == NULL) return; while (fgets(l, sizeof(l), statusfd)) { unsigned int uidownstart; if (sscanf(l, "%s %d %u", host, &downcount, &uidownstart) == 3) { downstart = uidownstart; handle = xtreeFind(testhosttree, host); if (handle != xtreeEnd(testhosttree)) { h = (testedhost_t *)xtreeData(testhosttree, handle); if (test == httptest) walk = h->firsthttp; else if (test == ldaptest) walk = h->firstldap; else for (walk = test->items; (walk && (walk->host != h)); walk = walk->next) ; if (walk) { walk->downcount = downcount; walk->downstart = downstart; } } } } fclose(statusfd); } void save_test_status(service_t *test) { FILE *statusfd; char statusfn[PATH_MAX]; testitem_t *t; int didany = 0; sprintf(statusfn, "%s/%s.%s.status", xgetenv("XYMONTMP"), test->testname, location); statusfd = fopen(statusfn, "w"); if (statusfd == NULL) return; for (t=test->items; (t); t = t->next) { if (t->downcount) { fprintf(statusfd, "%s %d %u\n", t->host->hostname, t->downcount, (unsigned int)t->downstart); didany = 1; t->host->repeattest = ((getcurrenttime(NULL) - t->downstart) < frequenttestlimit); } } fclose(statusfd); if (!didany) unlink(statusfn); } void save_frequenttestlist(int argc, char *argv[]) { FILE *fd; char fn[PATH_MAX]; xtreePos_t handle; testedhost_t *h; int didany = 0; int i; sprintf(fn, "%s/frequenttests.%s", xgetenv("XYMONTMP"), location); fd = fopen(fn, "w"); if (fd == NULL) return; for (i=1; (irepeattest) { fprintf(fd, "%s ", h->hostname); didany = 1; } } fclose(fd); if (!didany) unlink(fn); } void run_nslookup_service(service_t *service) { testitem_t *t; char *lookup; for (t=service->items; (t); t = t->next) { if (!t->host->dnserror) { if (t->testspec && (lookup = strchr(t->testspec, '='))) { lookup++; } else { lookup = t->host->hostname; } t->open = (dns_test_server(ip_to_test(t->host), lookup, t->banner) == 0); } } } void run_ntp_service(service_t *service) { testitem_t *t; char cmd[1024]; char *p; char cmdpath[PATH_MAX]; int use_sntp = 0; p = getenv("SNTP"); /* Plain "getenv" as we want to know if it's unset */ use_sntp = (p != NULL); strcpy(cmdpath, (use_sntp ? xgetenv("SNTP") : xgetenv("NTPDATE")) ); for (t=service->items; (t); t = t->next) { if (!t->host->dnserror) { if (use_sntp) { sprintf(cmd, "%s %s -d %d %s 2>&1", cmdpath, xgetenv("SNTPOPTS"), extcmdtimeout-1, ip_to_test(t->host)); } else { sprintf(cmd, "%s %s %s 2>&1", cmdpath, xgetenv("NTPDATEOPTS"), ip_to_test(t->host)); } t->open = (run_command(cmd, "no server suitable for synchronization", t->banner, 1, extcmdtimeout) == 0); } } } void run_rpcinfo_service(service_t *service) { testitem_t *t; char cmd[1024]; char *p; char cmdpath[PATH_MAX]; p = xgetenv("RPCINFO"); strcpy(cmdpath, (p ? p : "rpcinfo")); for (t=service->items; (t); t = t->next) { if (!t->host->dnserror && (t->host->downcount == 0)) { sprintf(cmd, "%s -p %s 2>&1", cmdpath, ip_to_test(t->host)); t->open = (run_command(cmd, NULL, t->banner, 1, extcmdtimeout) == 0); } } } int start_ping_service(service_t *service) { testitem_t *t; char *cmd; char **cmdargs; int pfd[2]; int i; void *iptree; xtreePos_t handle; /* We build a tree of the IP's to test, so we only test each IP once */ iptree = xtreeNew(strcmp); for (t=service->items; (t); t = t->next) { char *rec; char ip[IP_ADDR_STRLEN+1]; if (t->host->dnserror || t->host->noping) continue; strcpy(ip, ip_to_test(t->host)); handle = xtreeFind(iptree, ip); if (handle == xtreeEnd(iptree)) { rec = strdup(ip); xtreeAdd(iptree, rec, rec); } if (t->host->extrapings) { ipping_t *walk; for (walk = t->host->extrapings->iplist; (walk); walk = walk->next) { handle = xtreeFind(iptree, walk->ip); if (handle == xtreeEnd(iptree)) { rec = strdup(walk->ip); xtreeAdd(iptree, rec, rec); } } } } /* * The idea here is to run ping in a separate process, in parallel * with some other time-consuming task (the TCP network tests). * We cannot use the simple "popen()/pclose()" interface, because * a) ping doesn't start the tests until EOF is reached on stdin * b) EOF on stdin happens with pclose(), but it will also wait * for the process to finish. * * Therefore this slightly more complex solution, which in essence * forks a new process running "xymonping 2>&1 1>$XYMONTMP/ping.$$" * The output is then picked up by the finish_ping_service(). */ pingcount = 0; pingpids = calloc(pingchildcount, sizeof(pid_t)); pingcmd = malloc(strlen(xgetenv("FPING")) + strlen(xgetenv("FPINGOPTS")) + 2); sprintf(pingcmd, "%s %s", xgetenv("FPING"), xgetenv("FPINGOPTS")); sprintf(pinglog, "%s/ping-stdout.%lu", xgetenv("XYMONTMP"), (unsigned long)getpid()); sprintf(pingerrlog, "%s/ping-stderr.%lu", xgetenv("XYMONTMP"), (unsigned long)getpid()); /* Setup command line and arguments */ cmdargs = setup_commandargs(pingcmd, &cmd); for (i=0; (i < pingchildcount); i++) { /* Get a pipe FD */ if (pipe(pfd) == -1) { errprintf("Could not create pipe for xymonping\n"); return -1; } /* Now fork off the ping child-process */ pingpids[i] = fork(); if (pingpids[i] < 0) { errprintf("Could not fork() the ping child\n"); return -1; } else if (pingpids[i] == 0) { /* * child must have * - stdin fed from the parent * - stdout going to a file * - stderr going to another file. This is important, as * putting it together with stdout will wreak havoc when * we start parsing the output later on. We could just * dump it to /dev/null, but it might be useful to see * what went wrong. */ int outfile, errfile; sprintf(pinglog+strlen(pinglog), ".%02d", i); sprintf(pingerrlog+strlen(pingerrlog), ".%02d", i); outfile = open(pinglog, O_CREAT|O_WRONLY|O_TRUNC, S_IRUSR|S_IWUSR); if (outfile == -1) errprintf("Cannot create file %s : %s\n", pinglog, strerror(errno)); errfile = open(pingerrlog, O_CREAT|O_WRONLY|O_TRUNC, S_IRUSR|S_IWUSR); if (errfile == -1) errprintf("Cannot create file %s : %s\n", pingerrlog, strerror(errno)); if ((outfile == -1) || (errfile == -1)) { /* Ouch - cannot create our output files. Abort. */ exit(98); } dup2(pfd[0], STDIN_FILENO); dup2(outfile, STDOUT_FILENO); dup2(errfile, STDERR_FILENO); close(pfd[0]); close(pfd[1]); close(outfile); close(errfile); execvp(cmd, cmdargs); /* Should never go here ... just kill the child */ fprintf(stderr, "Command '%s' failed: %s\n", cmd, strerror(errno)); exit(99); } else { /* parent */ char ip[IP_ADDR_STRLEN+1]; /* Must have room for the \n at the end also */ int hnum, feederror = 0; close(pfd[0]); /* Feed the IP's to test to the child */ for (handle = xtreeFirst(iptree), hnum = 0; ((feederror == 0) && (handle != xtreeEnd(iptree))); handle = xtreeNext(iptree, handle), hnum++) { if ((hnum % pingchildcount) != i) continue; sprintf(ip, "%s\n", xtreeKey(iptree, handle)); if (write(pfd[1], ip, strlen(ip)) != strlen(ip)) { errprintf("Cannot feed IP to ping tool: %s\n", strerror(errno)); feederror = 1; continue; } pingcount++; } close(pfd[1]); /* This is when ping starts doing tests */ } } for (handle = xtreeFirst(iptree); handle != xtreeEnd(iptree); handle = xtreeNext(iptree, handle)) { char *rec = xtreeKey(iptree, handle); xfree(rec); } xtreeDestroy(iptree); return 0; } int finish_ping_service(service_t *service) { testitem_t *t; FILE *logfd; char *p; char l[MAX_LINE_LEN]; char pingip[MAX_LINE_LEN]; int ip1, ip2, ip3, ip4; int pingstatus, failed = 0, i; char fn[PATH_MAX]; /* Load status of previously failed tests */ load_ping_status(); /* * Wait for the ping child to finish. * If we're lucky, it will be done already since it has run * while we were doing tcp tests. */ for (i = 0; (i < pingchildcount); i++) { waitpid(pingpids[i], &pingstatus, 0); switch (WEXITSTATUS(pingstatus)) { case 0: /* All hosts reachable */ case 1: /* Some hosts unreachable */ case 2: /* Some IP's not found (should not happen) */ break; case 3: /* Bad command-line args, or not suid-root */ failed = 1; errprintf("Execution of '%s' failed - program not suid root?\n", pingcmd); break; case 98: failed = 1; errprintf("xymonping child could not create outputfiles in %s\n", xgetenv("XYMONTMP")); break; case 99: failed = 1; errprintf("Could not run the command '%s' (exec failed)\n", pingcmd); break; default: failed = 1; errprintf("Execution of '%s' failed with error-code %d\n", pingcmd, WEXITSTATUS(pingstatus)); } /* Open the new ping result file */ sprintf(fn, "%s.%02d", pinglog, i); logfd = fopen(fn, "r"); if (logfd == NULL) { failed = 1; errprintf("Cannot open ping output file %s\n", fn); } if (!debug) unlink(fn); /* We have an open filehandle, so it's ok to delete the file now */ /* Copy error messages to the Xymon logfile */ sprintf(fn, "%s.%02d", pingerrlog, i); if (failed) { FILE *errfd; char buf[1024]; errfd = fopen(fn, "r"); if (errfd && fgets(buf, sizeof(buf), errfd)) { errprintf("%s", buf); } if (errfd) fclose(errfd); } if (!debug) unlink(fn); if (failed) { /* Flag all ping tests as "undecided" */ bigfailure = 1; for (t=service->items; (t); t = t->next) t->open = -1; } else { /* The test did run, and we have a result-file. Look at it. */ while (fgets(l, sizeof(l), logfd)) { p = strchr(l, '\n'); if (p) *p = '\0'; if (sscanf(l, "%d.%d.%d.%d ", &ip1, &ip2, &ip3, &ip4) == 4) { sprintf(pingip, "%d.%d.%d.%d", ip1, ip2, ip3, ip4); /* * Need to loop through all testitems - there may be multiple entries for * the same IP-address. */ for (t=service->items; (t); t = t->next) { if (strcmp(t->host->ip, pingip) == 0) { if (t->open) dbgprintf("More than one ping result for %s\n", pingip); t->open = (strstr(l, "is alive") != NULL); t->banner = dupstrbuffer(l); } if (t->host->extrapings) { ipping_t *walk; for (walk = t->host->extrapings->iplist; (walk); walk = walk->next) { if (strcmp(walk->ip, pingip) == 0) { if (t->open) dbgprintf("More than one ping result for %s\n", pingip); walk->open = (strstr(l, "is alive") != NULL); walk->banner = dupstrbuffer(l); } } } } } } } if (logfd) fclose(logfd); } /* * Handle the router dependency stuff. I.e. for all hosts * where the ping test failed, go through the list of router * dependencies and if one of the dependent hosts also has * a failed ping test, point the dependency there. */ for (t=service->items; (t); t = t->next) { if (!t->open && t->host->routerdeps) { testitem_t *router; strcpy(l, t->host->routerdeps); p = strtok(l, ","); while (p && (t->host->deprouterdown == NULL)) { for (router=service->items; (router && (strcmp(p, router->host->hostname) != 0)); router = router->next) ; if (router && !router->open) t->host->deprouterdown = router->host; p = strtok(NULL, ","); } } } return 0; } int decide_color(service_t *service, char *svcname, testitem_t *test, int failgoesclear, char *cause) { int color = COL_GREEN; int countasdown = 0; char *deptest = NULL; *cause = '\0'; if (service == pingtest) { /* * "noconn" is handled elsewhere. * "noping" always sends back a status "clear". * If DNS error, return red and count as down. */ if (test->open == -1) { /* Failed to run the ping utility. */ strcpy(cause, "Xymon system failure"); return COL_CLEAR; } else if (test->host->noping) { /* Ping test disabled - go "clear". End of story. */ strcpy(cause, "Ping test disabled (noping)"); return COL_CLEAR; } else if (test->host->dnserror) { strcpy(cause, "DNS lookup failure"); color = COL_RED; countasdown = 1; } else { if (test->host->extrapings == NULL) { /* Red if (open=0, reverse=0) or (open=1, reverse=1) */ if ((test->open + test->reverse) != 1) { sprintf(cause, "Host %s respond to ping", (test->open ? "does" : "does not")); color = COL_RED; countasdown = 1; } } else { /* Host with many pings */ int totalcount = 1; int okcount = test->open; ipping_t *walk; for (walk = test->host->extrapings->iplist; (walk); walk = walk->next) { if (walk->open) okcount++; totalcount++; } switch (test->host->extrapings->matchtype) { case MULTIPING_BEST: if (okcount == 0) { color = COL_RED; countasdown = 1; sprintf(cause, "Host does not respond to ping on any of %d IP's", totalcount); } break; case MULTIPING_WORST: if (okcount < totalcount) { color = COL_RED; countasdown = 1; sprintf(cause, "Host responds to ping on %d of %d IP's", okcount, totalcount); } break; } } } /* Handle the "route" tag dependencies. */ if ((color == COL_RED) && test->host->deprouterdown) { char *routertext; routertext = test->host->deprouterdown->hosttype; if (routertext == NULL) routertext = xgetenv("XYMONROUTERTEXT"); if (routertext == NULL) routertext = "router"; strcat(cause, "\nIntermediate "); strcat(cause, routertext); strcat(cause, " down "); color = COL_YELLOW; } /* Handle "badconn" */ if ((color == COL_RED) && (test->host->downcount < test->host->badconn[2])) { if (test->host->downcount >= test->host->badconn[1]) color = COL_YELLOW; else if (test->host->downcount >= test->host->badconn[0]) color = COL_CLEAR; else color = COL_GREEN; } /* Run traceroute , but not on dialup or reverse-test hosts */ if ((color == COL_RED) && test->host->dotrace && !test->host->dialup && !test->reverse && !test->dialup) { char cmd[PATH_MAX]; if (getenv("TRACEROUTEOPTS")) { /* post 4.3.21 */ sprintf(cmd, "%s %s %s 2>&1", xgetenv("TRACEROUTE"), xgetenv("TRACEROUTEOPTS"), test->host->ip); } else { sprintf(cmd, "%s %s 2>&1", xgetenv("TRACEROUTE"), test->host->ip); } test->host->traceroute = newstrbuffer(0); run_command(cmd, NULL, test->host->traceroute, 0, extcmdtimeout); } } else { /* TCP test */ if (test->host->dnserror) { strcpy(cause, "DNS lookup failure"); color = COL_RED; countasdown = 1; } else { if (test->reverse) { /* * Reverse tests go RED when open. * If not open, they may go CLEAR if the ping test failed */ if (test->open) { strcpy(cause, "Service responds when it should not"); color = COL_RED; countasdown = 1; } else if (failgoesclear && (test->host->downcount != 0) && !test->alwaystrue) { strcpy(cause, "Host appears to be down"); color = COL_CLEAR; countasdown = 0; } } else { if (!test->open) { if (failgoesclear && (test->host->downcount != 0) && !test->alwaystrue) { strcpy(cause, "Host appears to be down"); color = COL_CLEAR; countasdown = 0; } else { tcptest_t *tcptest = (tcptest_t *)test->privdata; strcpy(cause, "Service unavailable"); if (tcptest) { switch (tcptest->errcode) { case CONTEST_ETIMEOUT: strcat(cause, " (connect timeout)"); break; case CONTEST_ENOCONN : strcat(cause, " ("); strcat(cause, strerror(tcptest->connres)); strcat(cause, ")"); break; case CONTEST_EDNS : strcat(cause, " (DNS error)"); break; case CONTEST_EIO : strcat(cause, " (I/O error)"); break; case CONTEST_ESSL : strcat(cause, " (SSL error)"); break; } } color = COL_RED; countasdown = 1; } } else { tcptest_t *tcptest = (tcptest_t *)test->privdata; /* Check if we got the expected data */ if (checktcpresponse && (service->toolid == TOOL_CONTEST) && !tcp_got_expected((tcptest_t *)test->privdata)) { strcpy(cause, "Unexpected service response"); color = respcheck_color; countasdown = 1; } /* Check that other transport issues didn't occur (like SSL) */ if (tcptest && (tcptest->errcode != CONTEST_ENOERROR)) { switch (tcptest->errcode) { case CONTEST_ETIMEOUT : strcpy(cause, "Service listening but unavailable (connect timeout)"); color = COL_RED; countasdown = 1; break; case CONTEST_ENOCONN : strcpy(cause, "Service listening but unavailable ("); strcat(cause, strerror(tcptest->connres)); strcat(cause, ")"); color = COL_RED; countasdown = 1; break; case CONTEST_EDNS : strcpy(cause, "Service listening but unavailable (DNS error)"); color = COL_RED; countasdown = 1; break; case CONTEST_EIO : strcpy(cause, "Service listening but unavailable (I/O error)"); color = COL_RED; countasdown = 1; break; case CONTEST_ESSL : strcpy(cause, "Service listening but unavailable (SSL error)"); color = COL_RED; countasdown = 1; break; default : /* Should not get here */ errprintf("-> TCPtest error %d seen on open connection for %s.%s\n", tcptest->errcode, test->host->hostname, test->service->testname); color = COL_YELLOW; break; } // color = COL_RED; countasdown = 1; } } } } /* Handle test dependencies */ if ( failgoesclear && (color == COL_RED) && !test->alwaystrue && (deptest = deptest_failed(test->host, test->service->testname)) ) { strcpy(cause, deptest); color = COL_CLEAR; } /* Handle the "badtest" stuff for other tests */ if ((color == COL_RED) && (test->downcount < test->badtest[2])) { if (test->downcount >= test->badtest[1]) color = COL_YELLOW; else if (test->downcount >= test->badtest[0]) color = COL_CLEAR; else color = COL_GREEN; } } /* Dialup hosts and dialup tests report red as clear */ if ( ((color == COL_RED) || (color == COL_YELLOW)) && (test->host->dialup || test->dialup) && !test->reverse) { strcat(cause, "\nDialup host or service"); color = COL_CLEAR; countasdown = 0; } /* If a NOPAGENET service, downgrade RED to YELLOW */ if (color == COL_RED) { char *nopagename; /* Check if this service is a NOPAGENET service. */ nopagename = (char *) malloc(strlen(svcname)+3); sprintf(nopagename, ",%s,", svcname); if (strstr(nonetpage, svcname) != NULL) color = COL_YELLOW; xfree(nopagename); } if (service == pingtest) { if (countasdown) { test->host->downcount++; if (test->host->downcount == 1) test->host->downstart = getcurrenttime(NULL); } else test->host->downcount = 0; } else { if (countasdown) { test->downcount++; if (test->downcount == 1) test->downstart = getcurrenttime(NULL); } else test->downcount = 0; } return color; } void send_results(service_t *service, int failgoesclear) { testitem_t *t; int color; char msgline[4096]; char msgtext[4096]; char causetext[1024]; char *svcname; svcname = strdup(service->testname); if (service->namelen) svcname[service->namelen] = '\0'; dbgprintf("Sending results for service %s\n", svcname); for (t=service->items; (t); t = t->next) { char flags[10]; int i; if (t->internal) continue; i = 0; flags[i++] = (t->open ? 'O' : 'o'); flags[i++] = (t->reverse ? 'R' : 'r'); flags[i++] = ((t->dialup || t->host->dialup) ? 'D' : 'd'); flags[i++] = (t->alwaystrue ? 'A' : 'a'); flags[i++] = (t->silenttest ? 'S' : 's'); flags[i++] = (t->host->testip ? 'T' : 't'); flags[i++] = (t->host->dodns ? 'L' : 'l'); flags[i++] = (t->host->dnserror ? 'E' : 'e'); flags[i++] = '\0'; color = decide_color(service, svcname, t, failgoesclear, causetext); init_status(color); if (dosendflags) sprintf(msgline, "status+%d %s.%s %s %s %s %s ", validity, commafy(t->host->hostname), svcname, colorname(color), flags, timestamp, svcname, ( ((color == COL_RED) || (color == COL_YELLOW)) ? "NOT ok" : "ok")); else sprintf(msgline, "status %s.%s %s %s %s %s ", commafy(t->host->hostname), svcname, colorname(color), timestamp, svcname, ( ((color == COL_RED) || (color == COL_YELLOW)) ? "NOT ok" : "ok")); if (t->host->dnserror) { strcat(msgline, ": DNS lookup failed"); sprintf(msgtext, "\nUnable to resolve hostname %s\n\n", t->host->hostname); } else { sprintf(msgtext, "\nService %s on %s is ", svcname, t->host->hostname); switch (color) { case COL_GREEN: strcat(msgtext, "OK "); strcat(msgtext, (t->reverse ? "(down)" : "(up)")); strcat(msgtext, "\n"); break; case COL_RED: case COL_YELLOW: if ((service == pingtest) && t->host->deprouterdown) { char *routertext; routertext = t->host->deprouterdown->hosttype; if (routertext == NULL) routertext = xgetenv("XYMONROUTERTEXT"); if (routertext == NULL) routertext = "router"; strcat(msgline, ": Intermediate "); strcat(msgline, routertext); strcat(msgline, " down"); sprintf(msgtext+strlen(msgtext), "%s.\nThe %s %s (IP:%s) is not reachable, causing this host to be unreachable.\n", failtext, routertext, ((testedhost_t *)t->host->deprouterdown)->hostname, ((testedhost_t *)t->host->deprouterdown)->ip); } else { sprintf(msgtext+strlen(msgtext), "%s : %s\n", failtext, causetext); } break; case COL_CLEAR: strcat(msgtext, "OK\n"); if (service == pingtest) { if (t->host->deprouterdown) { char *routertext; routertext = t->host->deprouterdown->hosttype; if (routertext == NULL) routertext = xgetenv("XYMONROUTERTEXT"); if (routertext == NULL) routertext = "router"; strcat(msgline, ": Intermediate "); strcat(msgline, routertext); strcat(msgline, " down"); strcat(msgtext, "\nThe "); strcat(msgtext, routertext); strcat(msgtext, " "); strcat(msgtext, ((testedhost_t *)t->host->deprouterdown)->hostname); strcat(msgtext, " (IP:"); strcat(msgtext, ((testedhost_t *)t->host->deprouterdown)->ip); strcat(msgtext, ") is not reachable, causing this host to be unreachable.\n"); } else if (t->host->noping) { strcat(msgline, ": Disabled"); strcat(msgtext, "Ping check disabled (noping)\n"); } else if (t->host->dialup) { strcat(msgline, ": Disabled (dialup host)"); strcat(msgtext, "Dialup host\n"); } else if (t->open == -1) { strcat(msgline, ": System failure of the ping test"); strcat(msgtext, "Xymon system error\n"); } /* "clear" due to badconn: no extra text */ } else { /* Non-ping test clear: Dialup test or failed ping */ strcat(msgline, ": Ping failed, or dialup host/service"); strcat(msgtext, "Dialup host/service, or test depends on another failed test\n"); strcat(msgtext, causetext); } break; } strcat(msgtext, "\n"); } strcat(msgline, "\n"); addtostatus(msgline); addtostatus(msgtext); if ((service == pingtest) && t->host->downcount) { sprintf(msgtext, "\nSystem unreachable for %d poll periods (%u seconds)\n", t->host->downcount, (unsigned int)(getcurrenttime(NULL) - t->host->downstart)); addtostatus(msgtext); } if (STRBUFLEN(t->banner)) { if (service == pingtest) { sprintf(msgtext, "\n&%s %s\n", colorname(t->open ? COL_GREEN : COL_RED), STRBUF(t->banner)); addtostatus(msgtext); if (t->host->extrapings) { ipping_t *walk; for (walk = t->host->extrapings->iplist; (walk); walk = walk->next) { if (STRBUFLEN(walk->banner)) { sprintf(msgtext, "&%s %s\n", colorname(walk->open ? COL_GREEN : COL_RED), STRBUF(walk->banner)); addtostatus(msgtext); } } } } else { addtostatus("\n"); addtostrstatus(t->banner); addtostatus("\n"); } } if ((service == pingtest) && t->host->traceroute && (STRBUFLEN(t->host->traceroute) > 0)) { addtostatus("Traceroute results:\n"); addtostrstatus(t->host->traceroute); addtostatus("\n"); } if (t->duration.tv_sec != -1) { sprintf(msgtext, "\nSeconds: %u.%.9ld\n", (unsigned int)t->duration.tv_sec, t->duration.tv_nsec); addtostatus(msgtext); } addtostatus("\n\n"); finish_status(); } } void send_rpcinfo_results(service_t *service, int failgoesclear) { testitem_t *t; int color; char msgline[1024]; char *msgbuf; char causetext[1024]; msgbuf = (char *)malloc(4096); for (t=service->items; (t); t = t->next) { char *wantedrpcsvcs = NULL; char *p; /* First see if the rpcinfo command succeeded */ *msgbuf = '\0'; color = decide_color(service, service->testname, t, failgoesclear, causetext); p = strchr(t->testspec, '='); if (p) wantedrpcsvcs = strdup(p+1); if ((color == COL_GREEN) && STRBUFLEN(t->banner) && wantedrpcsvcs) { char *rpcsvc, *aline; rpcsvc = strtok(wantedrpcsvcs, ","); while (rpcsvc) { struct rpcent *rpcinfo; int svcfound = 0; int aprogram; int aversion; char aprotocol[10]; int aport; rpcinfo = getrpcbyname(rpcsvc); aline = STRBUF(t->banner); while ((!svcfound) && rpcinfo && aline && (*aline != '\0')) { p = strchr(aline, '\n'); if (p) *p = '\0'; if (sscanf(aline, "%d %d %s %d", &aprogram, &aversion, aprotocol, &aport) == 4) { svcfound = (aprogram == rpcinfo->r_number); } aline = p; if (p) { *p = '\n'; aline++; } } if (svcfound) { sprintf(msgline, "&%s Service %s (ID: %d) found on port %d\n", colorname(COL_GREEN), rpcsvc, rpcinfo->r_number, aport); } else if (rpcinfo) { color = COL_RED; sprintf(msgline, "&%s Service %s (ID: %d) NOT found\n", colorname(COL_RED), rpcsvc, rpcinfo->r_number); } else { color = COL_RED; sprintf(msgline, "&%s Unknown RPC service %s\n", colorname(COL_RED), rpcsvc); } strcat(msgbuf, msgline); rpcsvc = strtok(NULL, ","); } } if (wantedrpcsvcs) xfree(wantedrpcsvcs); init_status(color); sprintf(msgline, "status+%d %s.%s %s %s %s %s, %s\n\n", validity, commafy(t->host->hostname), service->testname, colorname(color), timestamp, service->testname, ( ((color == COL_RED) || (color == COL_YELLOW)) ? "NOT ok" : "ok"), causetext); addtostatus(msgline); /* The summary of wanted RPC services */ addtostatus(msgbuf); /* rpcinfo output */ if (t->open) { if (STRBUFLEN(t->banner)) { addtostatus("\n\n"); addtostrstatus(t->banner); } else { sprintf(msgline, "\n\nNo output from rpcinfo -p %s\n", t->host->ip); addtostatus(msgline); } } else { addtostatus("\n\nCould not connect to the portmapper service\n"); if (STRBUFLEN(t->banner)) addtostrstatus(t->banner); } finish_status(); } xfree(msgbuf); } void send_sslcert_status(testedhost_t *host) { int color = -1; xtreePos_t handle; service_t *s; testitem_t *t; char msgline[1024]; strbuffer_t *sslmsg; time_t now = getcurrenttime(NULL); char *certowner; sslmsg = newstrbuffer(0); for (handle = xtreeFirst(svctree); handle != xtreeEnd(svctree); handle = xtreeNext(svctree, handle)) { s = (service_t *)xtreeData(svctree, handle); certowner = s->testname; for (t=s->items; (t); t=t->next) { if ((t->host == host) && t->certinfo && (t->certexpires > 0)) { int sslcolor = COL_GREEN; int ciphercolor = COL_GREEN; int keycolor = COL_GREEN; if (s == httptest) certowner = ((http_data_t *)t->privdata)->url; else if (s == ldaptest) certowner = t->testspec; if (t->certexpires < (now+host->sslwarndays*86400)) sslcolor = COL_YELLOW; if (t->certexpires < (now+host->sslalarmdays*86400)) sslcolor = COL_RED; if (sslcolor > color) color = sslcolor; if (host->mincipherbits && (t->mincipherbits < host->mincipherbits)) ciphercolor = COL_RED; if (ciphercolor > color) color = ciphercolor; if (sslminkeysize > 0) { if ((t->certkeysz > 0) && (t->certkeysz < sslminkeysize)) keycolor = COL_YELLOW; if (keycolor > color) color = keycolor; } if (t->certexpires > now) { sprintf(msgline, "\n&%s SSL certificate for %s expires in %u days\n\n", colorname(sslcolor), certowner, (unsigned int)((t->certexpires - now) / 86400)); } else { sprintf(msgline, "\n&%s SSL certificate for %s expired %u days ago\n\n", colorname(sslcolor), certowner, (unsigned int)((now - t->certexpires) / 86400)); } addtobuffer(sslmsg, msgline); if (host->mincipherbits) { sprintf(msgline, "&%s Minimum available SSL encryption is %d bits (should be %d)\n", colorname(ciphercolor), t->mincipherbits, host->mincipherbits); addtobuffer(sslmsg, msgline); } if (keycolor != COL_GREEN) { sprintf(msgline, "&%s Certificate public key size is less than %d bits\n", colorname(keycolor), sslminkeysize); addtobuffer(sslmsg, msgline); } addtobuffer(sslmsg, "\n"); addtobuffer(sslmsg, t->certinfo); } } } if (color != -1) { /* Send off the sslcert status report */ init_status(color); sprintf(msgline, "status+%d %s.%s %s %s\n", validity, commafy(host->hostname), ssltestname, colorname(color), timestamp); addtostatus(msgline); addtostrstatus(sslmsg); addtostatus("\n\n"); finish_status(); } freestrbuffer(sslmsg); } int main(int argc, char *argv[]) { xtreePos_t handle; service_t *s; testedhost_t *h; testitem_t *t; int argi; int concurrency = 0; char *pingcolumn = ""; char *egocolumn = NULL; int failgoesclear = 0; /* IPTEST_2_CLEAR_ON_FAILED_CONN */ int dumpdata = 0; int runtimewarn; /* 300 = default TASKSLEEP setting */ int servicedumponly = 0; int pingrunning = 0; int usebackfeedqueue = 0; if (init_ldap_library() != 0) { errprintf("Failed to initialize ldap library\n"); return 1; } if (xgetenv("CONNTEST") && (strcmp(xgetenv("CONNTEST"), "FALSE") == 0)) pingcolumn = NULL; runtimewarn = (xgetenv("TASKSLEEP") ? atol(xgetenv("TASKSLEEP")) : 300); for (argi=1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--timeout=")) { char *p = strchr(argv[argi], '='); p++; timeout = atoi(p); } else if (argnmatch(argv[argi], "--conntimeout=")) { int newtimeout; char *p = strchr(argv[argi], '='); p++; newtimeout = atoi(p); if (newtimeout > timeout) timeout = newtimeout; errprintf("Deprecated option '--conntimeout' should not be used\n"); } else if (argnmatch(argv[argi], "--cmdtimeout=")) { char *p = strchr(argv[argi], '='); p++; extcmdtimeout = atoi(p); } else if (argnmatch(argv[argi], "--concurrency=")) { char *p = strchr(argv[argi], '='); p++; concurrency = atoi(p); } else if (argnmatch(argv[argi], "--dns-timeout=") || argnmatch(argv[argi], "--dns-max-all=")) { char *p = strchr(argv[argi], '='); p++; dnstimeout = atoi(p); } else if (argnmatch(argv[argi], "--dns=")) { char *p = strchr(argv[argi], '='); p++; if (strcmp(p, "only") == 0) dnsmethod = DNS_ONLY; else if (strcmp(p, "ip") == 0) dnsmethod = IP_ONLY; else dnsmethod = DNS_THEN_IP; } else if (strcmp(argv[argi], "--no-ares") == 0) { use_ares_lookup = 0; } else if (argnmatch(argv[argi], "--maxdnsqueue=")) { char *p = strchr(argv[argi], '='); max_dns_per_run = atoi(p+1); } else if (argnmatch(argv[argi], "--dnslog=")) { char *fn = strchr(argv[argi], '='); dnsfaillog = fopen(fn+1, "w"); } else if (argnmatch(argv[argi], "--report=") || (strcmp(argv[argi], "--report") == 0)) { char *p = strchr(argv[argi], '='); if (p) { egocolumn = strdup(p+1); } else egocolumn = "xymonnet"; timing = 1; } else if (strcmp(argv[argi], "--test-untagged") == 0) { testuntagged = 1; } else if (argnmatch(argv[argi], "--frequenttestlimit=")) { char *p = strchr(argv[argi], '='); p++; frequenttestlimit = atoi(p); } else if (argnmatch(argv[argi], "--timelimit=")) { char *p = strchr(argv[argi], '='); p++; runtimewarn = atol(p); } else if (argnmatch(argv[argi], "--huge=")) { char *p = strchr(argv[argi], '='); p++; warnbytesread = atoi(p); } else if (strcmp(argv[argi], "--loadhostsfromxymond") == 0) { loadhostsfromxymond = 1; } /* Options for TCP tests */ else if (strcmp(argv[argi], "--checkresponse") == 0) { checktcpresponse = 1; } else if (argnmatch(argv[argi], "--checkresponse=")) { char *p = strchr(argv[argi], '='); checktcpresponse = 1; respcheck_color = parse_color(p+1); if (respcheck_color == -1) { errprintf("Invalid colorname in '%s' - using yellow\n", argv[argi]); respcheck_color = COL_YELLOW; } } else if (strcmp(argv[argi], "--no-flags") == 0) { dosendflags = 0; } else if (strcmp(argv[argi], "--shuffle") == 0) { shuffletests = 1; } else if (argnmatch(argv[argi], "--source-ip=")) { char *p = strchr(argv[argi], '='); struct in_addr aa; p++; if (inet_aton(p, &aa)) defaultsourceip = strdup(p); else errprintf("Invalid source ip address '%s'\n", argv[argi]); } /* Options for PING tests */ else if (argnmatch(argv[argi], "--ping-tasks=")) { /* Note: must check for this before checking "--ping" option */ char *p = strchr(argv[argi], '='); pingchildcount = atoi(p+1); } else if (argnmatch(argv[argi], "--ping")) { char *p = strchr(argv[argi], '='); if (p) { p++; pingcolumn = p; } else pingcolumn = ""; } else if (strcmp(argv[argi], "--noping") == 0) { pingcolumn = NULL; } else if (strcmp(argv[argi], "--trace") == 0) { dotraceroute = 1; } else if (strcmp(argv[argi], "--notrace") == 0) { dotraceroute = 0; } /* Options for HTTP tests */ else if (argnmatch(argv[argi], "--content=")) { char *p = strchr(argv[argi], '='); contenttestname = strdup(p+1); } else if (strcmp(argv[argi], "--bb-proxy-syntax") == 0) { /* Obey the Big Brother format for http proxy listed as part of the URL */ obeybbproxysyntax = 1; } /* Options for SSL certificates */ else if (argnmatch(argv[argi], "--ssl=")) { char *p = strchr(argv[argi], '='); ssltestname = strdup(p+1); } else if (strcmp(argv[argi], "--no-ssl") == 0) { ssltestname = NULL; } else if (argnmatch(argv[argi], "--sslwarn=")) { char *p = strchr(argv[argi], '='); p++; sslwarndays = atoi(p); } else if (argnmatch(argv[argi], "--sslalarm=")) { char *p = strchr(argv[argi], '='); p++; sslalarmdays = atoi(p); } else if (argnmatch(argv[argi], "--sslbits=")) { char *p = strchr(argv[argi], '='); p++; mincipherbits = atoi(p); } else if (argnmatch(argv[argi], "--validity=")) { char *p = strchr(argv[argi], '='); p++; validity = atoi(p); } else if (argnmatch(argv[argi], "--sslkeysize=")) { char *p = strchr(argv[argi], '='); p++; sslminkeysize = atoi(p); } else if (argnmatch(argv[argi], "--sni=")) { char *p = strchr(argv[argi], '='); p++; snienabled = ( (strcasecmp(p, "yes") == 0) || (strcasecmp(p, "on") == 0) || (strcasecmp(p, "enabled") == 0) || (strcasecmp(p, "true") == 0) || (strcasecmp(p, "1") == 0) ); } else if (strcmp(argv[argi], "--no-cipherlist") == 0) { sslincludecipherlist = 0; } else if (strcmp(argv[argi], "--showallciphers") == 0) { sslshowallciphers = 1; } /* Debugging options */ else if (strcmp(argv[argi], "--debug") == 0) { debug = 1; } else if (argnmatch(argv[argi], "--dump")) { char *p = strchr(argv[argi], '='); if (p) { if (strcmp(p, "=before") == 0) dumpdata = 1; else if (strcmp(p, "=after") == 0) dumpdata = 2; else dumpdata = 3; } else dumpdata = 2; debug = 1; } else if (strcmp(argv[argi], "--no-update") == 0) { dontsendmessages = 1; } else if (strcmp(argv[argi], "--timing") == 0) { timing = 1; } /* Informational options */ else if (strcmp(argv[argi], "--services") == 0) { servicedumponly = 1; } else if (strcmp(argv[argi], "--version") == 0) { printf("xymonnet version %s\n", VERSION); if (ssl_library_version) printf("SSL library : %s\n", ssl_library_version); if (ldap_library_version) printf("LDAP library: %s\n", ldap_library_version); printf("\n"); return 0; } else if ((strcmp(argv[argi], "--help") == 0) || (strcmp(argv[argi], "-?") == 0)) { printf("xymonnet version %s\n\n", VERSION); printf("Usage: %s [options] [host1 host2 host3 ...]\n", argv[0]); printf("General options:\n"); printf(" --timeout=N : Timeout (in seconds) for service tests\n"); printf(" --concurrency=N : Number of tests run in parallel\n"); printf(" --dns-timeout=N : DNS lookups timeout and fail after N seconds [30]\n"); printf(" --dns=[only|ip|standard] : How IP's are decided\n"); printf(" --no-ares : Use the system resolver library for hostname lookups\n"); printf(" --dnslog=FILENAME : Log failed hostname lookups to file FILENAME\n"); printf(" --report[=COLUMNNAME] : Send a status report about the running of xymonnet\n"); printf(" --test-untagged : Include hosts without a NET: tag in the test\n"); printf(" --frequenttestlimit=N : Seconds after detecting failures in which we poll frequently\n"); printf(" --timelimit=N : Warns if the complete test run takes longer than N seconds [TASKSLEEP]\n"); printf("\nOptions for simple TCP service tests:\n"); printf(" --checkresponse : Check response from known services\n"); printf(" --no-flags : Don't send extra xymonnet test flags\n"); printf("\nOptions for PING (connectivity) tests:\n"); printf(" --ping[=COLUMNNAME] : Enable ping checking, default columname is \"conn\"\n"); printf(" --noping : Disable ping checking\n"); printf(" --trace : Run traceroute on all hosts where ping fails\n"); printf(" --notrace : Disable traceroute when ping fails (default)\n"); printf(" --ping-tasks=N : Run N ping tasks in parallel (default N=1)\n"); printf("\nOptions for HTTP/HTTPS (Web) tests:\n"); printf(" --content=COLUMNNAME : Define default columnname for CONTENT checks (content)\n"); printf("\nOptions for SSL certificate tests:\n"); printf(" --ssl=COLUMNNAME : Define columnname for SSL certificate checks (sslcert)\n"); printf(" --no-ssl : Disable SSL certificate check\n"); printf(" --sslwarn=N : Go yellow if certificate expires in less than N days (default:30)\n"); printf(" --sslalarm=N : Go red if certificate expires in less than N days (default:10)\n"); printf(" --no-cipherlist : Do not display SSL cipher data in the SSL certificate check\n"); printf(" --showallciphers : List all available ciphers supported by the local SSL library\n"); printf("\nDebugging options:\n"); printf(" --no-update : Send status messages to stdout instead of to Xymon\n"); printf(" --timing : Trace the amount of time spent on each series of tests\n"); printf(" --debug : Output debugging information\n"); printf(" --dump[=before|=after|=all] : Dump internal memory structures before/after tests run\n"); printf(" --maxdnsqueue=N : Only queue N DNS lookups at a time\n"); printf("\nInformational options:\n"); printf(" --services : Dump list of known services and exit\n"); printf(" --version : Show program version and exit\n"); printf(" --help : Show help text and exit\n"); return 0; } else if (strncmp(argv[argi], "-", 1) == 0) { errprintf("Unknown option %s - try --help\n", argv[argi]); } else { /* Must be a hostname */ if (selectedcount == 0) selectedhosts = (char **) malloc(argc*sizeof(char *)); selectedhosts[selectedcount++] = strdup(argv[argi]); } } svctree = xtreeNew(strcasecmp); testhosttree = xtreeNew(strcasecmp); cookietree = xtreeNew(strcmp); init_timestamp(); envcheck(reqenv); fqdn = get_fqdn(); /* Setup SEGV handler */ setup_signalhandler(egocolumn ? egocolumn : "xymonnet"); if (xgetenv("XYMONNETWORK") && (strlen(xgetenv("XYMONNETWORK")) > 0)) location = strdup(xgetenv("XYMONNETWORK")); else if (xgetenv("BBLOCATION") && (strlen(xgetenv("BBLOCATION")) > 0)) location = strdup(xgetenv("BBLOCATION")); if (pingcolumn && (strlen(pingcolumn) == 0)) pingcolumn = xgetenv("PINGCOLUMN"); if (pingcolumn && xgetenv("IPTEST_2_CLEAR_ON_FAILED_CONN")) { failgoesclear = (strcmp(xgetenv("IPTEST_2_CLEAR_ON_FAILED_CONN"), "TRUE") == 0); } if (xgetenv("NETFAILTEXT")) failtext = strdup(xgetenv("NETFAILTEXT")); if (debug) { int i; printf("Command: xymonnet"); for (i=1; (i 0); load_tests(); add_timestamp(use_ares_lookup ? "Tests loaded" : "Tests loaded, hostname lookups done"); flush_dnsqueue(); if (use_ares_lookup) add_timestamp("DNS lookups completed"); if (dumpdata & 1) { dump_hostlist(); dump_testitems(); } /* Ping checks first */ if (pingtest && pingtest->items) pingrunning = (start_ping_service(pingtest) == 0); /* Load current status files */ for (handle = xtreeFirst(svctree); handle != xtreeEnd(svctree); handle = xtreeNext(svctree, handle)) { s = (service_t *)xtreeData(svctree, handle); if (s != pingtest) load_test_status(s); } /* First run the TCP/IP and HTTP tests */ for (handle = xtreeFirst(svctree); handle != xtreeEnd(svctree); handle = xtreeNext(svctree, handle)) { s = (service_t *)xtreeData(svctree, handle); if ((s->items) && (s->toolid == TOOL_CONTEST)) { char tname[128]; for (t = s->items; (t); t = t->next) { if (!t->host->dnserror) { strcpy(tname, s->testname); if (s->namelen) tname[s->namelen] = '\0'; t->privdata = (void *)add_tcp_test(ip_to_test(t->host), s->portnum, tname, NULL, t->srcip, NULL, t->silenttest, NULL, NULL, NULL, NULL); } } } } for (t = httptest->items; (t); t = t->next) add_http_test(t); add_timestamp("Test engine setup completed"); do_tcp_tests(timeout, concurrency); add_timestamp("TCP tests completed"); if (pingrunning) { char msg[512]; finish_ping_service(pingtest); sprintf(msg, "PING test completed (%d hosts)", pingcount); add_timestamp(msg); if (usebackfeedqueue) combo_start_local(); else combo_start(); send_results(pingtest, failgoesclear); if (selectedhosts == 0) save_ping_status(); combo_end(); add_timestamp("PING test results sent"); } if (debug) { show_tcp_test_results(); show_http_test_results(httptest); } for (handle = xtreeFirst(svctree); handle != xtreeEnd(svctree); handle = xtreeNext(svctree, handle)) { s = (service_t *)xtreeData(svctree, handle); if ((s->items) && (s->toolid == TOOL_CONTEST)) { for (t = s->items; (t); t = t->next) { /* * If the test fails due to DNS error, t->privdata is NULL */ if (t->privdata) { char *p; int i; tcptest_t *testresult = (tcptest_t *)t->privdata; t->open = testresult->open; t->banner = dupstrbuffer(testresult->banner); t->certinfo = testresult->certinfo; t->certissuer = testresult->certissuer; t->certexpires = testresult->certexpires; t->certkeysz = testresult->certkeysz; t->mincipherbits = testresult->mincipherbits; t->duration.tv_sec = testresult->duration.tv_sec; t->duration.tv_nsec = testresult->duration.tv_nsec; /* Binary data in banner ... */ for (i=0, p=STRBUF(t->banner); (i < STRBUFLEN(t->banner)); i++, p++) { if (!isprint((int)*p) && !isspace((int)*p)) *p = '.'; } } } } } for (t = httptest->items; (t); t = t->next) { if (t->privdata) { http_data_t *testresult = (http_data_t *)t->privdata; t->certinfo = testresult->tcptest->certinfo; t->certissuer = testresult->tcptest->certissuer; t->certexpires = testresult->tcptest->certexpires; t->certkeysz = testresult->tcptest->certkeysz; t->mincipherbits = testresult->tcptest->mincipherbits; } } add_timestamp("Test result collection completed"); /* Run the ldap tests */ for (t = ldaptest->items; (t); t = t->next) add_ldap_test(t); add_timestamp("LDAP test engine setup completed"); run_ldap_tests(ldaptest, (ssltestname != NULL), timeout); add_timestamp("LDAP tests executed"); if (debug) show_ldap_test_results(ldaptest); for (t = ldaptest->items; (t); t = t->next) { if (t->privdata) { ldap_data_t *testresult = (ldap_data_t *)t->privdata; t->certinfo = testresult->certinfo; t->certissuer = testresult->certissuer; t->mincipherbits = testresult->mincipherbits; t->certexpires = testresult->certexpires; t->certkeysz = testresult->certkeysz; } } add_timestamp("LDAP tests result collection completed"); /* dns, ntp tests */ for (handle = xtreeFirst(svctree); handle != xtreeEnd(svctree); handle = xtreeNext(svctree, handle)) { s = (service_t *)xtreeData(svctree, handle); if (s->items) { switch(s->toolid) { case TOOL_DNS: run_nslookup_service(s); add_timestamp("DNS tests executed"); break; case TOOL_NTP: run_ntp_service(s); add_timestamp("NTP tests executed"); break; case TOOL_RPCINFO: run_rpcinfo_service(s); add_timestamp("RPC tests executed"); break; default: break; } } } if (usebackfeedqueue) combo_start_local(); else combo_start(); for (handle = xtreeFirst(svctree); handle != xtreeEnd(svctree); handle = xtreeNext(svctree, handle)) { s = (service_t *)xtreeData(svctree, handle); switch (s->toolid) { case TOOL_CONTEST: case TOOL_DNS: case TOOL_NTP: send_results(s, failgoesclear); break; case TOOL_FPING: case TOOL_HTTP: case TOOL_LDAP: /* These handle result-transmission internally */ break; case TOOL_RPCINFO: send_rpcinfo_results(s, failgoesclear); break; } } for (handle = xtreeFirst(testhosttree); (handle != xtreeEnd(testhosttree)); handle = xtreeNext(testhosttree, handle)) { h = (testedhost_t *)xtreeData(testhosttree, handle); send_http_results(httptest, h, h->firsthttp, nonetpage, failgoesclear, usebackfeedqueue); send_content_results(httptest, h, nonetpage, contenttestname, failgoesclear); send_ldap_results(ldaptest, h, nonetpage, failgoesclear); if (ssltestname && !h->nosslcert) send_sslcert_status(h); } combo_end(); add_timestamp("Test results transmitted"); /* * The list of hosts to test frequently because of a failure must * be saved - it is then picked up by the frequent-test ext script * that runs xymonnet again with the frequent-test hosts as * parameter. * * Should the retest itself update the frequent-test file ? It * would allow us to kick hosts from the frequent-test file sooner. * However, it is simpler (no races) if we just let the normal * test-engine be alone in updating the file. * At the worst, we'll re-test a host going up a couple of times * too much. * * So for now update the list only if we ran with no host-parameters. */ if (selectedcount == 0) { /* Save current status files */ for (handle = xtreeFirst(svctree); handle != xtreeEnd(svctree); handle = xtreeNext(svctree, handle)) { s = (service_t *)xtreeData(svctree, handle); if (s != pingtest) save_test_status(s); } /* Save frequent-test list */ save_frequenttestlist(argc, argv); } /* Save session cookies - every time */ save_session_cookies(); shutdown_ldap_library(); add_timestamp("xymonnet completed"); if (dumpdata & 2) { dump_hostlist(); dump_testitems(); } /* Tell about us */ if (egocolumn) { char msgline[4096]; char *timestamps; int color; /* Go yellow if it runs for too long */ if ((runtimewarn > 0) && (total_runtime() > runtimewarn)) { errprintf("WARNING: Runtime %ld longer than time limit (%ld)\n", total_runtime(), runtimewarn); } color = (errbuf ? COL_YELLOW : COL_GREEN); if (bigfailure) color = COL_RED; if (usebackfeedqueue) combo_start_local(); else combo_start(); init_status(color); sprintf(msgline, "status+%d %s.%s %s %s\n\n", validity, xgetenv("MACHINE"), egocolumn, colorname(color), timestamp); addtostatus(msgline); sprintf(msgline, "xymonnet version %s\n", VERSION); addtostatus(msgline); if (ssl_library_version) { sprintf(msgline, "SSL library : %s\n", ssl_library_version); addtostatus(msgline); } if (ldap_library_version) { sprintf(msgline, "LDAP library: %s\n", ldap_library_version); addtostatus(msgline); } sprintf(msgline, "\nStatistics:\n Hosts total : %8d\n Hosts with no tests : %8d\n Total test count : %8d\n Status messages : %8d\n Alert status msgs : %8d\n Transmissions : %8d\n", hostcount, notesthostcount, testcount, xymonstatuscount, xymonnocombocount, xymonmsgcount); addtostatus(msgline); sprintf(msgline, "\nDNS statistics:\n # hostnames resolved : %8d\n # successful : %8d\n # failed : %8d\n # calls to dnsresolve : %8d\n", dns_stats_total, dns_stats_success, dns_stats_failed, dns_stats_lookups); addtostatus(msgline); sprintf(msgline, "\nTCP test statistics:\n # TCP tests total : %8d\n # HTTP tests : %8d\n # Simple TCP tests : %8d\n # Connection attempts : %8d\n # bytes written : %8ld\n # bytes read : %8ld\n", tcp_stats_total, tcp_stats_http, tcp_stats_plain, tcp_stats_connects, tcp_stats_written, tcp_stats_read); addtostatus(msgline); if (errbuf) { addtostatus("\n\nError output:\n"); addtostatus(prehtmlquoted(errbuf)); } show_timestamps(×tamps); addtostatus(timestamps); finish_status(); combo_end(); } else show_timestamps(NULL); if (dnsfaillog) fclose(dnsfaillog); if (usebackfeedqueue) sendmessage_finish_local(); return 0; } xymon-4.3.28/Changes0000664000076400007640000051413113037531271014514 0ustar rpmbuildrpmbuildChanges from 4.3.27 -> 4.3.28 (17 Jan 2017) =========================================== * rev 8005 * Catch addition possible errors during SSL handshake for standard TCP checks * Fix misparsing of --timelimit and --huge options in xymonnet (Reported by Foster Patch) * Fix memory leak when processing netapp test reports (Reported by Peter Welter) * The included version of c-ares has been bumped to version 1.12.0 * Fix for building on OpenSSL 1.1.0 (Thanks, Axel Beckert) * Add TLS variant specification to http checks, using newer funcs in OpenSSL 1.1.0 (From Henrik) * Fix overflow when skipping >2G pending data in logfetch (Reported by Sergey, a_s_y at sama.ru) * xymond_alert will no longer exit and be relaunched if started while there's no actual alertable condition. (Thanks, Franco G.) * Fix mis-parsing of PCRE regex's in client-local.cfg when char ranges are present (Reported by Erik D. Schminke) * The size limit of message data passed to SCRIPT alerts is configurable with the MAXMSG_ALERTSCRIPT variable. * Summary messages should work again (Thanks, Axel) * Many typos in comments and man pages have been corrected (Thanks, Axel et al. at Debian) * Change netstat RRD numbers to be slightly more human-readable (Thanks Roland Rosenfeld) Changes from 4.3.26 -> 4.3.27 (24 Mar 2016) =========================================== * rev 7957 * Don't treat empty (0 byte) directory size as invalid (Reported by Bert Willekens) * Fix looping redirect on criticaleditor.sh * Allow NK-critical acknowledgements from status pages * Fix redirect to criticalview.sh, which is just a regular CGI * Properly recognize https URLs as summary links (Thanks, David Steinn Geirsson) * Add compile-time check for SSLv3 support Changes from 4.3.25 -> 4.3.26 (19 Feb 2016) =========================================== * rev 7906 * Fix javascript failures on info/trends pages caused by CSP fixes * Fix incorrect HTTP refresh on rejected enadis.sh POSTs * Do not auto-refresh info or trends svcstatus pages * Revert default svcstatus page refresh interval from 30s back to 60s * Re-introduce XYMWEBREFRESH variable to control refresh interval * HTML encode most fields on info page * Restrict characters allowed for hostnames and testnames * HTML encode error log output on xymond/net/gen pages * HTML encode ghost hostnames output on xymond/ghostlist pages * logfetch: only evaluate the first config of a given type seen for the same file name * xymongen/reports: fix vague error message around missing history files and properly exclude clientlog statuses (Reported by Magdi Mahmoud) * Ensure configured CLASS overrides in hosts.cfg are always passed on to client workers, regardless of 'class' for that specific message (Reported by Steve Hill) Changes from 4.3.24 -> 4.3.25 (05 Feb 2016) =========================================== * rev 7890 * Resolve buffer overflow when handling "config" file requests (CVE-2016-2054) * Restrict "config" files to regular files inside the $XYMONHOME/etc/ directory (symlinks disallowed) (CVE-2016-2055). Also, require that the initial filename end in '.cfg' by default * Resolve shell command injection vulnerability in useradm and chpasswd CGIs (CVE-2016-2056) * Tighten permissions on the xymond BFQ used for message submission to restrict access to the xymon user and group. It is now 0620. (CVE-2016-2057) * Restrict javascript execution in current and historical status messages by the addition of appropriate Content-Security-Policy headers to prevent XSS attacks. (CVE-2016-2058) We would like to thank Markus Krell for reporting the above issues, and for working with us to resolve them. * Fix "TRENDS" entries in hosts.cfg improperly handling partial matches with other graph names (Reported by Jeremy Laidman) * A possible crash in when loading confreport.cgi has been fixed (Thanks, Axel Beckert) * Improve error handling slightly in the CGI wrapper * Fix missing network interface graph data on FreeBSD (Niko ) * In xymonnet, a rare SSL error state that could occur after a connection is opened will now be considered "service down" * Fix a crash in xymonnet when handling certain malformed SSL certificates (Reported by Thomas Leavitt, originally via Jeremy Laidman) * Add new trends_header and trends_footer for use on associated Trends pages * "Jump to page" redirect functionality fixed on findhost.sh (Reported by Francois Claire) * When a note is present for a host, the info page no longer has a spurious hostname on the text link * Add --noexec option to logfetch to ignore commands to dynamically list files, modifiable via new LOGFETCHOPTS variable in xymonclient.cfg (Suggested by Jeremy Laidman) * Add variables in xymonclient.cfg for overriding config files for xymond_client and logfetch when client is running in --local mode without editing xymonclient.sh * Add file globbing capabilities to logfetch to avoid need to fork commands to create dynamic lists (Suggested by Jeremy Laidman) * The "Valid Until" time for an acknowledgement is now displayed on the ack log report page (Thanks, Dominique Frise) * The xymon.sh and runclient.sh scripts are themselves now more LSB compliant (Thanks, Nikolai Lifanov) * Windows systems now have a better calculation of "Actual" memory usage (Thanks, John Rothlisberger) * A bug in xymond_alert that could cause pages about hosts.cfg not present at inital start to cause inconsistent alerting has been fixed * xymond_alert now reloads its hostlist at regular intervals Changes from 4.3.23 -> 4.3.24 (23 Nov 2015) =========================================== * rev 7774 * Fix occasional crash in xymond when handling group names (Thanks, Franco Gasperino) * Fix non-special HTTP <400 status codes red instead of yellow >.< Changes from 4.3.22 -> 4.3.23 (12 Nov 2015) =========================================== * rev 7740 * Fix broken 'TRACK' and 'OPTIONAL' identifiers in analysis.cfg * Prevent logfetch from segfaulting if a file we're tracking line matching deltacounts for wasn't found * Fix a type mismatch compiler warning in display group name alert matching Changes from 4.3.21 -> 4.3.22 (6 Nov 2015) =========================================== * rev 7723 * Ensure we don't leave xymond_hostdata or xymond_history zombies lying around after dropping host records (Reported by Scot Kreienkamp) * Fix up HTML list layout to reflect current standards (Thanks, hallik@calyc3.com) * Fix documentation incorrectly describing multigraph syntax as (e.g.) GRAPH_cpu. Should be GRAPHS_cpu (Thanks, Galen Johnson) * Supports scientific notation for NCV data (Thanks, Axel Beckert) * Increase resolution of xymonnet poll timing results (Thanks, Christoph Berg) * New clock skew RRD files will allow for negative delta values (Thanks, Axel Beckert) * Fix lots of typos! (Debian) * Don't skip over "mailq.rrd" (Roland Rosenfeld) * The signature algorithm used on an SSL-enabled TCP test run by xymonnet is now shown on the sslcert page. (Thanks, Ralph Mitchell) * The cipher list displayed in 'sslcert' tests will now be limited to the cipher that was actually used on the SSL connection. The --showallciphers option to xymonnet will restore the previous behavior. (From idea from Ralph Mitchell) * Provide configurable environment overrides in xymonserver.cfg for standard xymonnet options to fping/xymonping, ntpdate, and traceroute binaries. In regular installs, the intended default options to traceroute (-n -q 2 -w 2 -m 15) were not actually used. This may change in a future release, so it's suggested that users move any custom options to the new TRACEROUTEOPTS setting in xymonserver.cfg. (Orig. thanks, Axel Beckert, ntpdate issues pointed out by Matt Vander Werf) * Enable latent additional SHA digest strengths (sha256, sha512, sha224, sha384) * Don't crash generating wml cards for statuses w/ very long lines (Reported by Axel Beckert) * Flip SenderIP and Hostname columns on ghostlist pages to allow easier cutting and pasting to hosts files * Fix multiple disk volumes reported in on Darwin (OS X) clients. (Thanks, Axel Beckert) * Fix COMPACT parsing; update docs to match expected syntax (Thanks, Brian Scott) * Trailing slash no longer required for URL alias ("http://www.example.com/xymon" should work) * A new XYMONLOCALCLIENTOPTS variable in xymonclient.cfg allows options (e.g., --no-port-listing) to be given to xymond_client when running in local client mode. * Add a method to indicate lines which should be skipped by the NCV RRD processor or which mark the end of data-to-be-processed in the message. * Ensure that nostale is passed down during graph zooming (Thanks, Stef Coene) * Add missing XMH_DATA in loadhosts (Thanks, Jacek Tomasiak) * Search in more locations for default environment files when using xymoncmd * Add a "noflap" override to disable flap detection for any/all tests on a given host (Thanks, Martin Lenko) * Simplify default HTTP error code settings for xymonnet (2xx = green; 3xx = yellow; 4xx/5xx = red) * The protocol.cfg entry for RDP network tests has been updated and should work again (Thanks, Rob Steuer) * Add UDP ports to netstat output returned from darwin clients (Mac OS X) * Fixes to df/inode parsing on darwin clients (Mac OS X) (Thanks, Jason White et al.) * Add httphdr= tag to hosts.cfg to inject arbitrary headers into xymonnet HTTP tests for that host. * Turn memory test yellow if nonsensical numbers are found (>100% used for 'Actual' or Swap) * "optional include" and "optional directory" support actually added * xymongrep: load from the hosts.cfg file and error if unable, unless --loadhostsfromxymond is specified * Collect number of total cores in client data * combostatus: Fix parenthesis processing (Thanks, Andy Smith) * Add per-group anchors to generated pages when a group title is present (Thanks, Thomas Giordmaina) * xymongen: Display group tables even if group has no test results yet unless --no-showemptygroups given * Add chpasswd CGI for user-level htpasswd file updates. Requires Apache 2.4.5 or later (Thanks, Andy Smith) * Fix memory/display on multihost hostgraphs.cgi reports; remove multi-disk (which won't work as-is) * Add ACK_COOKIE_EXPIRATION for environment control of cookie validity duration (Noted by Thomas Giordmaina) * combostatus: fix core dumps on Solaris when dealing with erroneous config Changes from 4.3.20 -> 4.3.21 (22 May 2015) =========================================== * rev 7668 * RSS feeds should now display the short description of the event again. Changes from 4.3.19 -> 4.3.20 (15 May 2015) =========================================== * rev 7661 * Summaries should be properly displayed again, and will display on the nongreen.html page as well. * An icon for green acknowledged states is now included -- ironically, the original icon that the other checkmarks were based off of. * The various utilities in cgi-bin and cgi-secure are now hardlinked to cgiwrap at install time instead of softlink, to allow for FollowSymLinks-less apache configurations * The protocol section of URLs in hosts.cfg is now case-insensitive, and ftps URLs (FTP-over-SSL, not sftp) are recognized as a protocol. * hosts.cfg docs have been clarified to include delayyellow and delayred as allowable options (Reported by John Thurston) * 'optional include' and 'optional directory' syntax has been documented * pulldata directives in the hosts.cfg file now honor a given IP address and port XMH_FLAG_PULLDATA is now retired; XMH_PULLDATA must be used in its place * confreport.sh not displaying time-restricted alerts properly has been fixed (Reported by Gavin Stone-Tolcher) * Planned downtime settings are now applied to 'purple' statuses as well (Thanks, Torsten Richter) * Column documentation links should be working again (Reported by Andy Smith) * Fix missing null termination in certain logfetch situations (Reported by Johan Sjšberg) * New httphead tag to force an http request using HEAD instead of GET * Fix a memory leak introduced in parsing Windows SVCS test data * A divide-by-zero condition when systems erroneously report 0MB of physical memory has been corrected (Reported by John Thurston) * Parse either critical config or xymond-formatted acknowledgements on the report page, and add documentation for the --ack-log option in xymond (Thanks, Andy Smith) * The graphs to be displayed on a specific status page can be customized with environment variables - see xymonserver.cfg(5). From Werner Maier. * When clients are in "server" mode (sending raw data to the xymond server to be centrally processed), a 'clientlog' column will now be shown on xymon pages (similar to trends and info columns). This can be disabled on a per-host basis by adding a 'noclient' tag to the hosts.cfg line, or globally by adding that to the .default. host. * Add protocols.cfg entries for amqp(s), svn, ircd, and mail (submission). (Note that smtp testing here may suffer the same occasional issue as regular smtp conversations with regard to out-of-order commands.) * Fix a crash on non-glibc systems when testing xymond_alert configs with a host not in hosts.cfg (Reported by John Thurston) * On newer Linux kernels with recent procps-ng, use the "Available" memory reported by the kernel to give a more accurate reading for "Actual Used" in the client's memory status. (Reported by Dominique Frise) Changes from 4.3.18 -> 4.3.19 (30 Mar 2015) =========================================== * rev 7619 * Don't crash when receiving an AAAA DNS response (BSD, thanks Mark Felder) * xymonclient.sh running in --local mode was generating reports that were marked as duplicates (and thus being ignored). Reported by Guillaume Chane. * Building with old versions of libpcre not supporting PCRE_FIRSTLINE should once again work * Memory reporting on FreeBSD and OpenBSD has been fixed (Mark Felder) * The process list visible in the 'procs' test of Linux and FreeBSD clients is now generated in ASCII "forest" mode for increased legibility. * clientlog, hostinfo, and modify messages are now tracked in xymond stats * In environment config files (xymonserver.cfg, xymonclient.cfg, and cfgoptions.cfg) an initial "export " line (as if it were actually a shell script) will be ignored and the remainder of the line parsed as normal. * headermatch will now match the headers of an HTTP response even if the body is empty (eg, matching for a 302 Redirect) * --debug mode in most daemons should cause *much* less of a performance hit, and output will be timestamped in microseconds * xymondboard can now be used to PCRE-match against the raw message, and acknowledgement and disable comments. Inequalities can be specified against the lastchange, logtime, validtime, acktime, disabletime fields (in epoch timestamps). The existing net= and tag= filters have been documented. * The sample xymon.conf apache snippet now supports apache 2.4 syntax * Fix missing newline when returning upcoming 'schedule' commands. * EXTIME= syntax in analysis.cfg and alerts.cfg has been added. This is applied after any TIME= filter. Use (e.g.) to exclude Wednesday afternoons on a line which is already restricted to 9:00a to 5:00p on weekdays only. * The included version of c-ares has been bumped to version 1.10.0. * Support for older EGD (entropy gathering daemon) has been removed (Thanks, Bernard Spil) * A crash when xymond_rrd was run in --debug mode on non GNU/glibc systems has been fixed * The msgs and procs tests are now HTML-encoded to ensure that lines with brackets are properly displayed * An acknowledgements.sh log report has been added in (Submitted by Andy Smith) * A number of logfetch issues have been addressed: - --debug syntax is now supported. (If modifying the command line in xymonclient.sh, use --debug=stderr to prevent spurious lines being sent in the client report.) - Invalid POSIX regular expressions for ignore or trigger lines will now be reported but should not cause crashes - Null characters in a log file will no longer cause further processing to stop (Thanks, Franco Gasperino.) - All lines matching a 'trigger' regex will be reported back, even if the total size exceeds the "maxbytes" limit. (Up to the maximum compiled buffer size.) As much of the final section as can be fit in the space remaining will be included, similar to the previous behavior if maxbytes was exceeded but no trigger lines were given. (Thanks, Franco Gasperino.) - The current location (where the previous run left off) is now marked in the status report. - The '<...SKIPPED...>' and '<...CURRENT...>' texts can be overridden by specifying values for LOGFETCHSKIPTEXT and LOGFETCHCURRENTTEXT in xymonclient.cfg - The "scrollback" (number of positions in previous "runs" back) that logfetch starts at can now be specified with the LOGFETCHSCROLLBACK variable, from 0 - 6 (the default) * "deltacount" can be used to count the number of lines matching a specific regex in client-local.cfg, counting only since the last run. These will be shown on the trends page. NOTE: Unlike the "linecount:" option, deltacount is specified after a specific "log:" line. See the client-local.cfg file for details. * ifstat and netstat output from the new Windows PowerShell client is now graphed properly. * Hostnames beginning with a number (allowed by RFC1123) are now supported in combo.cfg * When a Windows service's status has been changed (ie, stopped or started), the relevant line in the 'svcs' test will now be updated to reflect this. (Reported by Gavin Stone-Tolcher and Neil Simmonds) * Various build issues, compiler fixes, and valgrind complaints have been fixed. Changes from 4.3.17 -> 4.3.18 (3 Feb 2015) =========================================== * rev 7494 * Fix CVE-2015-1430, a buffer overflow in the acknowledge.cgi script. Thank you to Mark Felder for noting the impact and Martin Lenko for the original patch. * Mitigate CVE-2014-6271 (bash 'Shell shock' vulnerability) by eliminating the shell script CGI wrappers * Don't crash in XML board output when there is no sender for status * Fix IP sender-address check for maintenance commands, when the target host is listed with IP 0.0.0.0 in hosts.cfg. * Linux client: - Generate 'raid' status from mdstat data - Include UDP listen ports in netstat data - Include full OS version data from SuSE clients * FreeBSD client: Handle 'actual' memory item, once the client starts reporting it. * Additional bugfixes: - xymond_capture: Fix exclude-test pattern handling - xymonlaunch: Guard against cron-times triggering twice in one minute - xymond_client: Fix DISPLAYGROUP handling in analysis.cfg rules - xymonnet: Handle AAAA records in dns checks - xymond_channel: Fix matching in --filter code - xymond: BFQ id may be zero - xymond: Fix bug in hostfilter matching code - xymond: Fix memory leak - xymond: Fix list manipulation for "modify" commands - xymond_rrd: Fix restart of external processor - Linux client: Set CPULOOP for correct top output - AIX client: vmstat behaves differently Changes from 4.3.16 -> 4.3.17 (23 Feb 2014) =========================================== * rev 7446 * Fix crash in xymond when using 'schedule' command * Configure/build/install fixes: - Allow specifying location of the PCRE include/library files for client-side configuration build. - Pass IDTOOL to client installation (for Solaris). - Fix broken configure+Makefiles for client-side configuration - C-ARES: Fix wrong call to Makefile.test-cares during configure - Dont error out if www-dir or man-dir is empty. Mostly an issue when building packages with non-standard layouts. * Fix wrong timestamp on a new status arriving with a non-green status while DOWNTIME was active. Such a status would appear to have been created on Jan 1st, 1970. * Fix hostgraphs so it obeys RRDWIDTH / RRDHEIGHT settings * Add upper limit to showgraph CGI when generating self-referring URI's From Werner Maier * Extra sanity check on extcombo message offsets. * The Enable/Disable webpage now permits filtering on CLASS value. From Galen Johnson Changes from 4.3.15 -> 4.3.16 (9 Feb 2014) ========================================== * rev 7394 * Fix xymonnet crash on sending http test results * Fix xymond crash if client-local.cfg contains empty sections * Fix RPM-based initscript for clients with explicit hostname * Fix misleading error-message when testing for C-ARES library * Fix client-local.cfg handling, so by default it will not merge sections together, i.e. behave like previous 4.x releases. NOTE: The new regexp matching can still be used. * Add "--merge-clientlocal" option for xymond, which causes it to merge all matching sections from client-local.cfg into one. * Use native POSIX binary-tree handling code Changes from 4.3.14 -> 4.3.15 (31 Jan 2014) =========================================== * rev 7384 * Fix xymond_alert crashes introduced in 4.3.14 * Fix missing C-ARES build files * client-local.cfg: Support expression matching of sections * acknowledge.cgi: Acks are enabled for all ALERTCOLORS, not just red and yellow Changes from 4.3.13 -> 4.3.14 (26 Jan 2014) =========================================== * rev 7377 * Fix critical ack not working for hosts where the display-name is set (via "NAME:" tag). From Any Smith. * SNI (Server Name Indication) causes some SSL connections to fail due to server-side buggy SSL implementations. Add "sni" and "nosni" flags to control SNI for specific hosts, and "--sni" option for xymonnet to control the default. Reported by Mark Felder. * Fix build process to fully obey any XYMONTOPDIR setting from the top-level Makefile. NOTE: Client-only builds no longer install the client in a "client/" subdirectory below XYMONHOME. * Fix showgraph so it silently ignores stale rrdctl files when trying to flush RRD data before showing a graph. * Fix xymond_alert crashing when trying to strip characters from the alert message. Bug introduced in 4.3.13. * Fix Solaris client to report memory even when no swap is configured. * Fix bug where alerts that were initially suppressed due to TIME restrictions are delayed until REPEAT interval expires. * Fix crash in xymonlaunch when trying to find tasks.cfg * Fix HTML generated by acknowledge.cgi (missing '>') * Fix Linux client reporting garbled client data if top output ends without a new-line (causes CPU load and other vmstat graphs to stop updating) * Fix Debian installation so it enables Apache mod_rewrite * Fix merge-lines utility crashing when first line was an include * Fix "make install" failing when server/www/help was a symlink * Document existing OPTIONAL setting in analysis.cfg for file-checks on files which may not exist. * Document existing CLASS setting in alerts.cfg * Add new INFOCOLUMNGIF and TRENDSCOLUMNGIF settings so the icons used for these pages are configurable. * Enhance Solaris client to correctly handle Solaris zones. * Add new search facilities to xymond to select hosts with the 'xymondboard' and 'hostinfo' commands. * New --ack-each-color option for xymondd changes ack behaviour so a yellow ack does not apply when status changed to red, but a red ack applies if status goes yellow * New "headermatch" tag for http tests so content checks can look at HTTP headers in addition to the HTML body. * Use system-wide c-ares library. The pre-built Debian packages now require the "libc-ares2" package. Changes from 4.3.12 -> 4.3.13 (08 Jan 2014) =========================================== * rev 7339 * Fixes to FreeBSD client code, from Mark Felder (FreeBSD maintainer) * Fix crash on "client" data sent via status channel when host is unknown * Strip carriage-return from text sent to mail alerts, to avoid mail programs treating the message as binary and putting it in an attachment * xymonnet network tester supports Server Name Indication (SNI) for SSL enabled virtual websites. * HTTP tests now use "Cache-control" header for HTTP/1.1 (default) and "Pragma" for HTTP/1.0, so it is protocol compliant. * netbios-ssn, snpp and lpd protocol.cfg entries (Tom Schmidt) * "temperature" status strips html tags from sensor names (Tom Schmidt) * Extra "total network I/O" line on ifstat graph (Tom Schmidt) * New "backfeed" queue for high-speed transmission of Xymon status updates between modules located on the same server as xymond. Note: This is disabled by default, see the README.backfeed file. * New "extcombo" message type allows for combo messages of all types (usually "status" and "data"). * Status webpage will return an HTTP error code for invalid requests instead of reporting an Ok status (some log analysis tools warn about attack attempts when an 'OK' status is reported). * New setting IMAGEFILETYPE removes hardcoded ".gif" on the various image-files in the "gifs" directory. Directory name is unchanged, though. * FreeBSD: Change from maintainer to enable building with CLANG. * New modifier for https tests for selecting only TLSv1 as protocol * CGI's now return a proper HTTP status code in case of errors (e.g. "404" when requesting a status for a non-existing host). * Fix problem with xymond_rrd dying if an external processors crashes (from J. Cleaver) * Fix configure/build problem with detecting POSIX realtime-clock functions. * Fix for FreeBSD 5+ vmstat reporting (from Jeremy Laidman) * Fix for "make install" not setting correct file/directory permissions * Re-add the "--hf-file" option for criticalview CGI (removed in 4.3.7) Changes from 4.3.11 -> 4.3.12 (24 Jul 2013) =========================================== * rev 7211 * Security fix: Guard against directory traversal via hostname in "drophost" commands * Fix crash in xymongen introduced in 4.3.11 * SCO client: Fix overflow in memory calculation when >2 GB memory * Fix so "include" and "directory" definitions in configuration files now handle after the keyword * Fix for the Xymon webpage menu on iPad's and Android (touch devices) * Fix "drophost" handling so the host data directory is also cleared * xymond_rrd now processes data from "clear" status messages * Xymon clients now report the version number in the client data * Linux clients now align "ps" output so it is more readable. * New "generic" client message handler allows log/file monitoring from systems that are not known to Xymon. * The Xymon client now works if invoked with a relative path to the runclient.sh script * Other minor / internal bugfixes Changes from 4.3.10 -> 4.3.11 (21 Apr 2013) =========================================== * rev 7188 * Fix wrong file permissions when installing * Linux client: Fix handling of root filesystem when mounted on "/dev/root" * trends webpage: Fix case where hostname disappears after zoom. * FreeBSD client: Memory patch for FreeBSD 8.0+ * xymond_alert: Fix problem with UNMATCHED rules triggering when there are actual recipients, but their alerts are suppressed due to a REPEAT setting not having expired. * xymond_rrd: Dont crash if called with an empty status/data message * xymond_channel: Report cause when channel-child exits/crashes * xymongen: Geneate an overview page with only reds (like non-green) * xymongen: Optionally define env. variable BOARDFILTER to select hosts/tests included in the generated pages * links: Add pdf, docx and odt as known document formats * Fix potential crashes after an alert cookie expired * Fix potential crash after deleting/renaming a host * Speedup loading of the hosts.cfg file, noticeable with very large hosts.cfg files (100.000+ hosts) Changes from 4.3.9 -> 4.3.10 (6 Aug 2012) ========================================= * rev 7164 * Fix build problems with "errno" * Fix build problems with OpenSSL in non-default locations * Fix build problems with certain LDAP configurations * Fix build problems with RRDtool on FreeBSD / OpenBSD * Fix problem with ifstat data from Fedora in graphs * "inode" check on FreeBSD, OpenBSD, OSX, Solaris, HP/UX, AIX in addition to existing support for Linux * Document building and installing Xymon on common platforms (Linux, FreeBSD, OpenBSD, Solaris) * Enhance xymoncfg so it can be used to import Xymon configuration settings into shell-scripts. Changes from 4.3.8 -> 4.3.9 (15 Jul 2012) ========================================= * rev 7120 * Fix crash when XYMSRV is undefined but XYMSERVERS is * Fix error in calculating combo-status messages with forward references * Fix error in disable-until-TIME or disable-until-OK code * Fix documentation of DURATION in alerts.cfg / xymond_alert so it is consistenly listed as being in "minutes". * Permit explicit use of ">" and ">=" in alerts.cfg * Permit building without the RRDtool libraries, e.g. for a network-tester build, but with trend-graphing disabled. * Full compiler-warning cleanup * Various configuration/build-script issues fixed. Changes from 4.3.7 -> 4.3.8 (15 Jul 2012) ========================================= * rev 7082 Bugfixes * Workaround for DNS timeout handling, now fixed at approximately 25 seconds. * "hostinfo" command for xymond documented * confreport only shows processes that are monitored * analysis.cfg parsing of COLOR for UP rules was broken * RRD handlers no longer crash after receiving 1 billion updates * Using .netrc for authentication could crash xymonnet * "directory" includes would report the wrong filename for missing directories. * useradm CGI would invoke htpassword twice * "include" and "directory" now ignores trailing whitespace * SSLv2 support disabled if SSL-library does not support it * Minor bugfixes and cleanups of compiler warnings. Enhancements * Service status on info page now links to the detailed status page. * Add RRDGRAPHOPTS setting to permit global user-specified RRD options, e.g. for font to showgraph CGI * Add check for the size of public keys used in SSL certificates (enabled via --sslkeysize=N option for xymonnet) * Optionally disable the display of SSL ciphers in the sslcert status (the --no-cipherlist option for xymonnet) * Improved build-scripts works on newer systems with libraries in new and surprising places * Reduce xymonnet memory usage and runtime for ping tests when there are multiple hosts.cfg entries with the same IP-address. * Add code for inode-monitoring on Linux. Does not currently work on any other client platform. * Added the ability to disable tests until a specific time, instead of for some interval. Disabling a test also now computes the expire time for the disable to happen at the next closest minute. Changes from 4.3.6 -> 4.3.7 (13 Dec 2011) ========================================= * rev 6803 * Fix acknowledge CGI (broken in 4.3.6) * Fix broken uptime calculation for systems reporting "1 day" * Workaround Solaris breakage in the LFS-support detection * Fix/add links to the HTML man-page index. * Fix "Stop after" value not being shown on the "info" page. * Fix broken alert texts when using FORMAT=SMS * Fix wrong description of xymondboard CRITERIA in xymon(1) * Fix missing columnname in analysis.cfg(5) DS example * Fix missing space in output from disk IGNORE rules in xymond_client --dump-config * Fix overwrite of xymon-apache.conf when upgrading * Fix installation so it does not remove include/directory lines from configuration files. * Add client/local/ directory for custom client script Changes from 4.3.5 -> 4.3.6 (5 Dec 2011) ======================================== * rev 6788 * Optionally choose the color for the "cpu" status when it goes non-green due to uptime or clock offset. * Allow for "include" and "directory" in combo.cfg and protocols.cfg * New INTERFACES definition in hosts.cfg to select which network interfaces are tracked in graphs. * New access control mechanism for some CGI scripts returning host-specific information. Access optionally checked against an Apache-style "group" file (see xymonwebaccess(5) CGI manpage). * New "vertical" page-definitions (vpage, vsubpage,vsubparent) for listing hosts across and tests down on a page. * Fix hostlist CGI crash when called with HTTP "HEAD" * Fix svcstatus CGI crash when called with non-existing hostname * Fix "ackinfo" updates being cleared when host hits a DOWNTIME period. * Fix compile-errors on Solaris due to network libraries not being included. * Fix "logrotate" messages not being sent to some channels. * Fix problem with loading the hosts.cfg file. * STATUSLIFETIME now provides the default time a status is valid (in xymond). * Critical systems view: Use priority 99 for un-categorised priorities (imported from NK tags) and show this as 'No priority' on the webpage. * useradm CGI: Sort usernames * New xymond module - xymond_distribute - can forward administrative commands (drop, rename, disable, enable) from one Xymon server to another. * New tool: appfeed CGI provides data for the Android "xymonQV" app by Darrik Mazey. Changes from 4.3.4 -> 4.3.5 (9 Sep 2011) ======================================== * rev 6754 * Fix crash in CGI generating the "info" status column. * Fix broken handling of IGNORE for log-file analysis. * Fix broken clean-up of obsolete cookies (no user impact). * Devmon RRD handler: Fix missing initialisation, which might cause crashes of the RRD handler. * Fix crashes in xymond caused by faulty new library for storing cookies and host-information. * Fix memory corruption/crash in xymond caused by logging of multi-source statuses. * New "delayred" and "delayyellow" definitions for a host can be used to delay change to a yellow/red status for any status column (replaces the network-specific "badFOO" definitions). * analysis.cfg and alerts.cfg: New DISPLAYGROUP setting to select hosts by the group/group-only/group-except text. * New HOSTDOCURL setting in xymonserver.cfg. Replaces the xymongen "--docurl" and "--doccgi" options, and is used by all tools. * xymond_history option to control location of PID file. * Critical Systems view: Optionally show eventlog for the hosts present on the CS view. * Critical Systems view: Multiple --config options can now be used, to display critical systems from multiple configurations on one page. * Detailed status display: Speedup by no longer having to load the hosts.cfg file. * xymongen and xymonnet: Optionally load the hosts.cfg from xymond instead of having to read the file. Changes from 4.3.3 -> 4.3.4 (1 Aug 2011) ======================================== * rev 6722 * Fix crashes and data corruption in Xymon worker modules (xymond_client, xymond_rrd etc) after handling large messages. * Fix xymond lock-up when renaming/deleting hosts * Fix xymond cookie lookup mechanism * Webpages: Add new HOSTPOPUP setting to control what values from hosts.cfg are displayed as a "comment" to the hostname (either in pop-up's or next to the hostname). * Fix xymond_client crash if analysis.cfg contains invalid configuration entries, e.g. expressions that do not compile. * Fix showgraph CGI crash when legends contain colon. * xymonnet: Include hostname when reporting erroneous test-spec * CGI utils: Multiple potential security fixes involving buffer- overruns when generating responses. * CGI utils: Fix crash when invoked with HTTP "HEAD" * CGI utils: Fix crashes on 64-bit platforms due to missing prototype of "basename()" function. * svcstatus CGI: Dont crash if history log is not a file. * Critical systems view CGI: Cross-site scripting fix * Fix recovery-messages for alerts sent to a GROUP * RRD "memory" status handler now recognizes the output from the bb-xsnmp.pl module (for Cisco routers). * Web templates modified so the menu CSS can override the default body CSS. * Acknowledge web page now allows selecting minutes/hours/days * Enable/Disable webpage enhanced, so when selecting multiple hosts the "Tests" column only lists the tests those hosts have. Changes from 4.3.2 -> 4.3.3 (6 May 2011) ======================================== * rev6684 * SECURITY FIX: Some CGI parameters were used to construct filenames of historical logfiles without being sanitized, so they could be abused to read files on the webserver. * SECURITY FIX: More cross-site scripting vulnerabilities. * Remove extra "," before "History" button on status-view * Critical view: Shring priority-column to 10% width * hosts.cfg loader: Check for valid IP spec (nibbles in 0-255 range). Large numbers in a nibble were accepted, triggering problems when trying to ping the host. * Alert macros no longer limited to 8kB Changes from 4.3.1 -> 4.3.2 (4 Apr 2011) ======================================== * rev6672 * Web UI: Fix bug introduced with the 4.3.1 XSS fixes. Changes from 4.3.0 -> 4.3.1 (3 Apr 2011) ======================================== * Web UI: SECURITY FIX - fix potential cross-site scripting vulnerabilities. Initial report by David Ferrest (email April 1st 2011). * Solaris Makefile: Drop guessing of what linker is being used, since we get it wrong too often. * configure: Add missing include to fix compile failure on some systems. * get_ostype(): Check that we have a valid OS identifier. Dont assume we can write to the string passed us. * xymond user messages: Improve error message for oversize messages. Document the MAXMSG_USER setting. * combostatus: Make the set of error-colors configurable. Change default set so BLUE and PURPLE are not considered errors (only RED is an error by default). * xymon(1) manpage: Add missing description of some fields available in the xymondboard command. * hosts.cfg manpage: Fix wrong NOPROP interpretation. From Thomas Brand. * Demotool: Change Hobbit->Xymon Changes from 4.3.0 RC 1 -> 4.3.0 (4 Mar 2011) ============================================= * Critical view and other webpages: Make the 'All systems OK' message configurable. Also allow the header/footer for the Critical Systems view to be configurable. Suggestion and preliminary patch from Buchan Milne. * xymonnet: Improve error report when HTTP tests get an empty response - 'HTTP error 0' sounds weird. * report / snapshot CGI's: Fix buffer overrun in the HTML delimiter generated in the "please wait..." message. Also, fix potential buffer overrun in report CGI if invoked with a large value for the "style" parameter. Reported by Rolf Biesbroek. * Graph definitions (graphs.cfg): Multi graphs cannot use a regex pattern. Problem report by Brian Majeska * Solaris interface statistics: Filter out "mac" and "wrsmd" devices at the client side. Update RRD handler to also filter "wrsmd" at the server side, like we already did for "mac" devices. Cf. http://www.xymon.com/archive/2009/06/msg00204.html * Documentation: Document the XMH_* fields available in xymondboard commands. * Documentation: Document SPLITNCV and "trends" methods of doing custom graphs. * RRD definitions: Allow override of --step/-s option for rrdcreate, from template supplied in rrddefinitions.cfg. Suggestion from Brian Majeska. * mailack: Remove restriction on how long a subjectline/message body can be. * Build procedure: Add notice about running upgrade script before installing the new version. * xymond_alert: Document --trace option * Alerts: For recovery messages, add information so you can tell whether the recovery was due to the service actually recovering, or if it was merely disabled. * xymond_alert: Fix missing element in array of alert status texts used for tracing. Spotted by Dominique Frise. * Add support for FreeBSD v8 modified ifstat output * Documentation: Update information about the Xymon mailing lists following move to Mailman and new archive URL. * HP/UX client: Use "swapinfo" to extract memory utilisation data, instead of the hpux-meminfo utility. By Earl Flack http://lists.xymon.com/pipermail/xymon/2010-December/030100.html Changes from 4.3.0 beta 3 -> 4.3.0 RC 1 (23 Jan 2011) ===================================================== * hosts.cfg badldap documentation: Document that for LDAP URL's you must use 'badldapurl'. Reported by Simo Hmami. * xymond flap detection: Make number of tracked status changes and the flap-check period configurable. Change the defaults to trigger flapping at more than 5 status changes in a 30 minute period. * sendmessage: Enhanced error reporting, to help track down communication problems. * xymond_client: Fix Windows SVC status handling to avoid coredumps, memory corruption and other nasties. Will now report the real name of the service, instead of the pattern used in the analysis.cfg file. NOTE: Slight change to status message format. * Client handler: Fix owner/user check parsing. Reported by Ian Marsh http://www.xymon.com/archive/2011/01/msg00133.html (also broken in 4.2.3). * xymongen: Fix broken --doc-window option handling. Reported by Tom Schmitt. * Xymongen: Fix documentation of the --doc-window/--no-doc-window options. * Webpage background: Use a CSS and a new set of gif's to implement a background that works on all displays, regardless of width. Uses a new xymonbody.css stylesheet which can also control some other aspects of the webpage. From Francois Claire. * Documentation: The xymon 'rename' command should be used AFTER renaming a host in hosts.cfg, not before. From Tom Georgoulias. * Memory status: Add some sanity checks for the memory utilisation reported by clients. Occasionally we get completely bogus data from clients, so only act on them if percentages do not exceed 100. * Critical systems view: Add "--tooltips" option so you can save screen space by hiding the host descriptions in a tooltip, like we do on the statically generated pages. Feature request from Chris Morris. * Solaris client: Report "swap -l" in addition to "swap -s" for swap usage. Backend prefers output from "swap -l" when determining swap utilisation. * Webpage menu: Use the CSS and GIF's by Malcolm Hunter - they are much nicer than the ones from Debian. Distribute both the blue and the grey version, and configure which one to use in xymonserver.cfg. * Graph zoom: Use float variables when calculating the upper/lower limits of the graph. Fixes vertical zoom. * xymond: Make sure we do not perform socket operations on invalid sockets (e.g. those from a scheduled task pseudo-connection) * Installation: Remove any existing old commands before creating symlinks * xymonproxy: Fix broken compatibility option '--bbdisplay' * Fix eventlog summary/count enums so they dont clash with Solaris predefined entities * History- and hostdata-modules: Dont save data if there is less than 5% free space on the filesystem. Also, dont save hostdata info more than 5 times per hour. * Historical statuslog display: Work-around for crash when status-log is empty * fping.sh configure sub-script: Fix syntax error in suggested 'sudoers' configuration, and point to the found fping binary. From Steff Coene. * namematch routine: Fix broken matching when doing simple matching against two strings where one was a subset of the other. http://www.xymon.com/archive/2010/11/msg00177.html . Reported by Elmar Heeb who also provided a patch, although I chose a different solution to this. * Xymon net: Fix broken compile when LDAP-checks are disabled. Reported by Roland Soderstrom, fix from Ralph Mitchell. * xymon(7) manpage: Drop notice that renaming in 4.3.0 is not complete * Installation: Setup links for the commonly used Hobbit binaries (bb, bbcmd, bbdigest, bbhostgrep, bbhostshow) * Upgrade script: Setup symlinks for the old names of the standard webpages * xymonserver.cfg.DIST: Missing end-quote in compatibility BBSERVERSECURECGIURL setting. From Ralph Mitchell * xymongrep: Fix broken commandline parsing resulting from trying to be backwards-compatible. Reported by Jason Chambers. Changes from 4.3.0 beta 2 -> 4.3.0 beta 3 (15 Nov 2010) ======================================================= * Reflect the renaming of the project at Sourceforge in documentation, links etc. * Any data going into graphs can now trigger a status to change color, if the value of the data is outside thresholds. This can be used to e.g. trigger an alert if the response-time of a network test is longer than expected, even though the service is responding. Also works for custom tests that feed data into graphs. (see analysis.cfg "DS" definition). This uses a new xymond command, "modify". * Clients can now use several modules to send "client" data to the Xymon server, all of which are passed to (specialised) client-data processors on the Xymon server. * All tools for the "Critical Systems View" now have a "--config=FILENAME" option for which file to load the configuration from. Configuration files: * Document the "directory" include syntax * Allow the "include" and "directory" definitions to be indented. xymongen: * New "--no-nongreen" option for bbgen disables generating the "All Non-green" page, since this is not useful on large installations. * If xymongen cannot load the current status from xymond, abort updating of the webpages instead of generating a 100% green set of webpages. xymonnet: * New "--source-ip=ADDRESS" option for xymonnet to set the default source IP used for network tests. * HTTP tests now use the source-IP. * New "--ping-tasks=N" option for xymonnet to split the ping-tests to multiple processes. Needed to speed up ping of large installations. * Disable support for the old Big Brother syntax for HTTP proxies in web checks. Necessary to allow testing of URL's beginning with "http". If necessary, the old Big Brother compatible behaviour is enabled with the new "--bb-proxy-syntax" option for xymonnet. xymonproxy: * Rename "--bbdisplay" option to "--server". * Drop support for sending data to Big Brother servers. This means that the Big Brother "page" messages will no longer be relayed by bbproxy, so the "--bbpager" and "--hobbitd" options have been removed. msgcache / xymonfetch: * Fix off-by-one bug when reading data. Could lead to data corruption, crashes and other nasty behaviour. * Remove port-numbers from the "Message received from..." line so these don't show up as multi-source. xymonlaunch: * Support for cron-style time specification, so tasks will run at specific times. xymon tool: * New "--response" option overrides auto-detection of whether to expect a response back from the server. * Support the new "usermsg" and "modify" commands. hosts.cfg configuration settings: * New "multihomed" option disables the multi-source detection for a host. xymond: * Support multiple client-collector modules for each host. * Detect when the same host receives updates from multiple source IP adresses. Usually indicates a misconfigured client reporting with the name of another server. May erroneously flag some multi-homed hosts, so this check can be disabled with the "multihomed" flag in bb-hosts. * Detect when a status is rapidly switching between to states. In that case, the most severe state is enforced until the flapping stops. Such flapping would lead to a huge number of status messages being stored as historical logs. * Fix rare bug where missing status-log data could crash xymond. * Fix small memory leak in processing "config" and "download" commands. xymond_capture: * New server-side tool to capture selected messages from a Xymon channel. xymond_channel: * New "--filter" option allows use of a regular expression to filter data being passed to the worker module based on the message summary line. xymond_client: * Fix bug where very large client messages could result in the next message processed being corrupted. Typically, this would cause semi-random disk graphs to appear, or bogus alerts triggering. * Test for filesystems running out of i-nodes. Currently only the Linux client reports data for this. * Test for any data going into graphs triggering a "modify" of a status if the value is outside limits. * Mangle filenames with a colon (i.e. Windows filenames) when passing them to other status-messages, e.g. xymond_rrd. * Detect/discard duplicated update-messages and discard them. xymond_history: * The SAVESTATUSLOG setting can now select which status-logs to save as historical logs. xymond_rootlogin.pl: * Sample serverside module in Perl. xymond_rrd: * Explicitly update access-times when updating RRD files on Linux, since the memory-mapped I/O on this platform does not modify timestamps, causing Xymon to consider all graphs stale. * Detect/discard duplicated update-messages and discard them. * New "--no-cache" option disables caching of RRD updates. * SPLITNCV bug fixed. * Support output from newer versions of the ntp.org "sntp" tool. Top-changing hosts/statuses: * Eventlog CGI application can now report the most changing hosts/statuses. perfdata CGI: * New "--page=REGEXP" option for selecting which hosts to include. BBWin client: * Fix clock offset calculation in cases where "epoch" time is reported without a decimal part. Linux client: * lsb_release may be installed in /usr/bin SCO Unixware client: * New client AIX client: * Fix wrong data collected in graphs (RRD files) for AIX memory/swap utilisation. Solaris client: * Ignore "mac" interfaces in interface-statistics. These are physical interfaces aggregated into a multi-link virtual interface - statistics are collected for the virtual interface. IBM MQ: * New collector module and sub-client. CGI applications: * New XYMONCGILOGDIR setting in xymonserver.cfg sets a directory where CGI debug output is stored. BEA/NetApp/Database add-on: * Server side updated to hobbit-perl-cl ver. 1.21. Among other things, this means that Tablespace utilisation is now graphed. Devmon add-on: * Server side updated to current version. Changes from 4.3.0 beta 1 -> 4.3.0 beta 2 (24 Apr 2009) ======================================================= * New "--shuffle" option for bbtest-net to run network tests in a random order. * Client startup script now exports important environment variables, so they are actually used in systems with a traditional shell. * hobbitlaunch no longer crashes if there are no tasks * Client configure script includes librt for clock_gettime() * New client support for mainframes: z/OS, z/VM, z/VSE * Enhanced eventlog and top-changing hosts webpages. * Revert debian package pathnames back to use "hobbit", so updates from 4.2.x will actually work. * Ghostlist options in hobbitcgi.cfg had no effect because of typo in setting name. * "data" messages could crash hobbitd. * Debug output from hobbitd_channel now logs only the relevant data instead of the full message. * trimhistory now informs the history module to re-open the "allevents" file after trimming it. * devmon template fix * New "rrdcachectl" utility included. * Fixed sorting routine (affected holiday list and others) * Fix generic crash in communications module between Xymon programs, where an empty response message would crash caller. Changes from 4.2.3 -> 4.3.0 beta 1 (09 Feb 2009) ================================================ Core changes: * New API's for loadhosts and sendmessage, in preparation for the full 5.0 changes. * Always use getcurrenttime() instead of time(). * Support for defining holidays as non-working days in alerts and SLA calculations. * Hosts which appear on multiple pages in the web display can use any page they are on in the alerting rules and elsewhere. * Worker modules (RRD, client-data parsers etc) can operate on remote hosts from the hobbitd daemon, for load-sharing. * Various bugfixes collected over time. Network test changes: * Merged new network tests from trunk: SOAP-over-HTTP, SSL minimum cipher strength * Changed network test code to always report a validity period for network tests, so it it possible to run network tests less often than every 30 minutes (e.g. once an hour). * Make the content-type setting in HTTP POST tests configurable. * Make the source-address used for TCP tests configurable. * Make the acceptable HTTP result codes configurable. * Use and save HTTP session cookies. Web changes * Support generic drop-down lists in templates. * "NOCOLUMNS" changed to work for all columns. * New "group-sorted" definition to auto-sort hosts in a group * Use browser tooltips for host comments * "Compact" status allows several statuses to appear as a single status on the overview webpages. * Trends page can select the time period to show. Buttons provided for the common selections. * Ghost list report now lists possible candidates for a ghost, based on IP-address or unqualified hostname. Report changes * Number of outages as SLA parameter Miscellaneous * hobbitlaunch support for running tasks only on certain hosts, and for a maximum time. * Alert script get a unique ID for each alert. Changes from 4.2.2 -> 4.2.3 (09 Feb 2008) ========================================= * Time-out code changed to use clock_gettime() with CLOCK_MONOTONIC * Bugfix for hobbitd/hobbitd_worker communication going out-of-sync resulting in "garbled data" being logged and worker modules stopping. * NCV module now works with negative numbers. * Several bugfixes in DNS lookup code - could lead to crashes when performing DNS tests. * Switch to C-ARES 1.6.0 - drop support for older versions. * Run more TCP tests in parallel by not waiting for very slow connections to complete before starting new ones. * Added "hostlist" web utility for spreadsheet-reporting of the hosts in Hobbit. Changes from 4.2.0 -> 4.2.2 (01 Dec 2008) ========================================= Changelog extracted from Subversion. ------------------------------------------------------------------------ r5935 | storner | 2008-11-26 12:57:11 +0100 (Wed, 26 Nov 2008) | 3 lines Changed paths: A /branches/4.2.0 (from /trunk:5040) Create branch for maintenance of the 4.2.x release. ------------------------------------------------------------------------ r5936 | storner | 2008-11-26 13:13:50 +0100 (Wed, 26 Nov 2008) | 3 lines Changed paths: M /branches/4.2.0/common/bb-hosts.5 The ability to set a DOWNTIME for an individual test was mentioned in the Changes file, but not documented in the bb-hosts man-page. ------------------------------------------------------------------------ r5937 | storner | 2008-11-26 13:14:48 +0100 (Wed, 26 Nov 2008) | 3 lines Changed paths: M /branches/4.2.0/hobbitd/hobbitd_client.c The hobbitd_client program would crash when running in test-mode, i.e. launched with the --test option to test disk-, procs- and ports-settings. This only applies to running it in test-mode, normal operation is not affected. ------------------------------------------------------------------------ r5938 | storner | 2008-11-26 13:15:40 +0100 (Wed, 26 Nov 2008) | 3 lines Changed paths: M /branches/4.2.0/lib/headfoot.c M /branches/4.2.0/web/bb-datepage.c M /branches/4.2.0/web/bb-eventlog.c M /branches/4.2.0/web/bb-findhost.c M /branches/4.2.0/web/bb-rep.c M /branches/4.2.0/web/bb-snapshot.c M /branches/4.2.0/web/hobbit-enadis.c M /branches/4.2.0/web/hobbit-nkedit.c Some of the web page would generate an extra line with "Content-type: text/html" at the top of the webpage, although this would most often be hidden by the menubar. ------------------------------------------------------------------------ r5939 | storner | 2008-11-26 13:16:21 +0100 (Wed, 26 Nov 2008) | 3 lines Changed paths: M /branches/4.2.0/client/runclient.sh Using extra options with the client-side "runclient.sh" script when performing a restart command fails to pass the extra options to the final command. ------------------------------------------------------------------------ r5940 | storner | 2008-11-26 13:17:12 +0100 (Wed, 26 Nov 2008) | 3 lines Changed paths: M /branches/4.2.0/hobbitd/hobbitfetch.c hobbitfetch insisted that hosts must have a valid IP-adress in bb-hosts. This causes problems for hosts with dynamic IP-adresses. This patch causes hobbitfetch to lookup the IP-address at run-time if the IP is listed as "0.0.0.0". ------------------------------------------------------------------------ r5941 | storner | 2008-11-26 13:20:44 +0100 (Wed, 26 Nov 2008) | 3 lines Changed paths: M /branches/4.2.0/web/hobbit-confreport.c M /branches/4.2.0/web/hobbitsvc-info.c Hostname filtering on the info column page is broken, if you have multiple hosts with similar names, resulting in the same columns showing up multiple times in the disable section. A similar problem affects host filtering in the configuration report tool. ------------------------------------------------------------------------ r5942 | storner | 2008-11-26 13:21:27 +0100 (Wed, 26 Nov 2008) | 3 lines Changed paths: M /branches/4.2.0/client/hobbitclient-sunos.sh The Solaris client would not collect the "top" process-listing data which is normally included in the data on the "cpu" column. ------------------------------------------------------------------------ r5943 | storner | 2008-11-26 13:25:28 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/build/bb-commands.sh M /branches/4.2.0/client/hobbitclient-sunos.sh The Solaris lofs (loopback filesystem) should not be included in the df output appearing on the Disk status. ------------------------------------------------------------------------ r5944 | storner | 2008-11-26 13:29:56 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/lib/cgi.c M /branches/4.2.0/lib/cgi.h M /branches/4.2.0/web/bb-ack.c M /branches/4.2.0/web/bb-datepage.c M /branches/4.2.0/web/hobbit-confreport.c M /branches/4.2.0/web/hobbit-enadis.c M /branches/4.2.0/web/hobbit-hostgraphs.c M /branches/4.2.0/web/hobbit-statusreport.c Cookie handling does not always work. This results in hosts not showing up on the new acknowledgment page, or hosts missing from the Metrics report. ------------------------------------------------------------------------ r5945 | storner | 2008-11-26 13:30:31 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/bbdisplay/bbgen.h Hobbit 4.2.0 fails to build on some OS X releases due to a naming conflict between a system-defined datatype, and a different datatype defined in Hobbit. ------------------------------------------------------------------------ r5946 | storner | 2008-11-26 13:31:41 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/hobbitd/webfiles/zoom.js M /branches/4.2.0/lib/hobbitrrd.c M /branches/4.2.0/lib/hobbitrrd.h M /branches/4.2.0/lib/htmllog.c M /branches/4.2.0/web/hobbitgraph.c M /branches/4.2.0/web/hobbitsvc-trends.c When viewing detailed graphs linked from the detailed status page, the background color of the webpages would always show green, regardless of the actual color of the status it was linked from. This patch keeps the background color at what the status page shows. ------------------------------------------------------------------------ r5947 | storner | 2008-11-26 13:32:55 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/hobbitd/webfiles/confreport_front M /branches/4.2.0/hobbitd/wwwfiles/menu/menu_items.js.DIST M /branches/4.2.0/web/Makefile M /branches/4.2.0/web/hobbit-confreport.c M /branches/4.2.0/web/hobbit-confreport.cgi.1 The Configuration Report did not include information about what systems appears on the "Critical Systems" view. ------------------------------------------------------------------------ r5948 | storner | 2008-11-26 13:33:43 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/web/hobbitsvc-info.c The info-column page for hosts with an IP-address of 0.0.0.0 - i.e. a dynamic or unknown IP - often fails to work because of a buffer overflow when printing the real IP address of the host. ------------------------------------------------------------------------ r5949 | storner | 2008-11-26 13:34:23 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/hobbitd/do_alert.c M /branches/4.2.0/hobbitd/hobbitd_alert.c The hobbitd_alert module is leaking memory each time it sends out an alert, or whenever a status recovers and is removed from the list of active alerts. ------------------------------------------------------------------------ r5950 | storner | 2008-11-26 13:35:03 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/lib/cgi.c Relaying of Hobbit status messages through HTTP via bbmessage.cgi was broken. ------------------------------------------------------------------------ r5951 | storner | 2008-11-26 13:37:00 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/hobbitd/webfiles/hobbitnk_footer M /branches/4.2.0/web/hobbit-nkview.c Let the Critical Systems view include Purple statuses as an option ------------------------------------------------------------------------ r5952 | storner | 2008-11-26 13:38:04 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/lib/Makefile M /branches/4.2.0/lib/color.c M /branches/4.2.0/lib/timefunc.c Avoid use of strtok_r in client code, since this may not exist on all platforms ------------------------------------------------------------------------ r5953 | storner | 2008-11-26 13:39:35 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/hobbitd/rrd/do_ncv.c The NCV custom graphs module would mistakenly include text from lines with no data into the name of the next dataset. Apply this patch. Note that any existing RRD files affected by this bug must be deleted, since this changes the names of the datasets inside the RRD files. ------------------------------------------------------------------------ r5954 | storner | 2008-11-26 13:40:32 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/client/msgcache.c The msgcache utility used on some clients could lock up and/or crash if multiple connections to the program were active at the same time. Thanks to Rolf Masfelder for spotting it. ------------------------------------------------------------------------ r5955 | storner | 2008-11-26 13:41:13 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/hobbitd/client_config.c The hobbitd_client module handling status reports from Hobbit clients could crash while processing the disk status. ------------------------------------------------------------------------ r5956 | storner | 2008-11-26 13:42:04 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/hobbitd/hobbitd_client.c The logfile status display could be corrupted if the logs contained HTML tags. This patch wraps the logfile texts in a pre-formatted HTML sequence. ------------------------------------------------------------------------ r5957 | storner | 2008-11-26 13:42:49 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/bbdisplay/bbgen.h M /branches/4.2.0/bbdisplay/loadbbhosts.c M /branches/4.2.0/bbdisplay/loadbbhosts.h M /branches/4.2.0/bbdisplay/loaddata.c M /branches/4.2.0/bbdisplay/pagegen.c M /branches/4.2.0/bbnet/bbtest-net.c M /branches/4.2.0/bbnet/bbtest-net.h M /branches/4.2.0/hobbitd/hobbitd.c M /branches/4.2.0/lib/headfoot.c M /branches/4.2.0/lib/loadhosts.c M /branches/4.2.0/lib/loadhosts.h M /branches/4.2.0/lib/loadhosts_file.c The modembank-testing feature has been broken for a couple of releases. This patch removes this dead code. ------------------------------------------------------------------------ r5958 | storner | 2008-11-26 13:43:31 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/client/logfetch.c The client-side logfetch utility has been enhanced to support multiple ignore and trigger patterns. ------------------------------------------------------------------------ r5959 | storner | 2008-11-26 13:44:28 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/hobbitd/webfiles/info_header M /branches/4.2.0/web/hobbitsvc-info.c The info page disable function has been enhanced in two ways: A separate status summmary shows the current color of all statuses, and lets you easily pick all red/yellow/purple tests to disable them. Also, the status names in the disable listbox now shows the current color of the status. This enhancement was based on code from Michael Nagel. ------------------------------------------------------------------------ r5960 | storner | 2008-11-26 13:45:38 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/hobbitd/Makefile A /branches/4.2.0/hobbitd/convertnk.c A new convertnk utility has been added to convert the old NK tags in bb-hosts to the new Critical Systems view configuration file. ------------------------------------------------------------------------ r5961 | storner | 2008-11-26 13:46:32 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/configure.server The configuration script would allow you to enter a blank value for the webserver group-ID, causing installation to fail later. This patch changes the configuration script to require a value for this setting. ------------------------------------------------------------------------ r5962 | storner | 2008-11-26 13:47:38 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/client/hobbitclient-aix.sh M /branches/4.2.0/client/hobbitclient-darwin.sh AIX and Darwin clients: Show routing entries using IP-address, not hostnames ------------------------------------------------------------------------ r5963 | storner | 2008-11-26 13:49:04 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/lib/timefunc.c M /branches/4.2.0/web/bb-ack.c The acknowledgment webpage requires you to enter the acknowledgment duration in minutes. This patch lets you enter the duration as "2d" or "4h30m" for an easier way of setting the duration. ------------------------------------------------------------------------ r5964 | storner | 2008-11-26 13:50:35 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/bbnet/httptest.c Include port-number in HTTP "Host" header if it is not standard ------------------------------------------------------------------------ r5965 | storner | 2008-11-26 13:51:57 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/lib/stackio.c Do not crash if a configuration Include directory is empty ------------------------------------------------------------------------ r5966 | storner | 2008-11-26 13:52:58 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/bbdisplay/loadbbhosts.c The bbgen tool which creates the Hobbit webpages might crash if certain noprop settings were used. ------------------------------------------------------------------------ r5967 | storner | 2008-11-26 14:02:51 +0100 (Wed, 26 Nov 2008) | 3 lines Changed paths: A /branches/4.2.0/web/hobbit-confreport-critical.sh.DIST Missed this file in previous commit. ------------------------------------------------------------------------ r5968 | storner | 2008-11-26 14:04:25 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: A /branches/4.2.0/hobbitd/webfiles/notify_footer A /branches/4.2.0/hobbitd/webfiles/notify_form A /branches/4.2.0/hobbitd/webfiles/notify_header M /branches/4.2.0/hobbitd/wwwfiles/menu/menu_items.js.DIST M /branches/4.2.0/include/libbbgen.h M /branches/4.2.0/lib/Makefile A /branches/4.2.0/lib/notifylog.c A /branches/4.2.0/lib/notifylog.h M /branches/4.2.0/web/Makefile A /branches/4.2.0/web/hobbit-notifylog.c A /branches/4.2.0/web/hobbit-notifylog.sh.DIST A utility for viewing the notifications log has been added. ------------------------------------------------------------------------ r5969 | storner | 2008-11-26 14:38:26 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/hobbitd/hobbitd.c M /branches/4.2.0/hobbitd/hobbitd_buffer.c M /branches/4.2.0/hobbitd/hobbitd_buffer.h M /branches/4.2.0/hobbitd/hobbitd_ipc.c The Hobbit daemon now has a "user channel" that may be used to send custom messages through Hobbit. ------------------------------------------------------------------------ r5970 | storner | 2008-11-26 14:45:50 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/lib/Makefile M /branches/4.2.0/web/Makefile Cleanup merge errors from allinone patch ------------------------------------------------------------------------ r5971 | storner | 2008-11-26 14:47:08 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/hobbitd/hobbitd.c Do not hang when reading from socket ------------------------------------------------------------------------ r5972 | storner | 2008-11-26 14:48:02 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/hobbitd/hobbitd.c Make sure there is space for Line-1 in message sent to workers ------------------------------------------------------------------------ r5973 | storner | 2008-11-26 14:48:45 +0100 (Wed, 26 Nov 2008) | 1 line Changed paths: M /branches/4.2.0/web/hobbitgraph.c Hostnames used in URL must be URL-encoded ------------------------------------------------------------------------ r5974 | storner | 2008-11-26 14:51:47 +0100 (Wed, 26 Nov 2008) | 3 lines Changed paths: A /branches/4.2.2 (from /branches/4.2.0:5973) New branch off the 4.2.0 + allinone patch for a 4.2.2 release. ------------------------------------------------------------------------ r5975 | storner | 2008-11-27 14:07:05 +0100 (Thu, 27 Nov 2008) | 3 lines Changed paths: M /branches/4.2.2/build/updmanver Adjusted to work with SVN ------------------------------------------------------------------------ r5976 | storner | 2008-11-27 14:12:12 +0100 (Thu, 27 Nov 2008) | 3 lines Changed paths: M /branches/4.2.2/CREDITS M /branches/4.2.2/README M /branches/4.2.2/README.CLIENT M /branches/4.2.2/bbdisplay/bbgen.1 M /branches/4.2.2/bbnet/bb-services.5 M /branches/4.2.2/bbnet/bbretest-net.sh.1 M /branches/4.2.2/bbnet/bbtest-net.1 M /branches/4.2.2/bbnet/hobbitping.1 M /branches/4.2.2/bbproxy/bbmessage.cgi.8 M /branches/4.2.2/bbproxy/bbproxy.8 M /branches/4.2.2/build/makedeb.sh M /branches/4.2.2/build/makehtml.sh M /branches/4.2.2/common/bb-hosts.5 M /branches/4.2.2/common/bb.1 M /branches/4.2.2/common/bbcmd.1 M /branches/4.2.2/common/bbdigest.1 M /branches/4.2.2/common/bbhostgrep.1 M /branches/4.2.2/common/bbhostshow.1 M /branches/4.2.2/common/clientlaunch.cfg.5 M /branches/4.2.2/common/clientupdate.1 M /branches/4.2.2/common/hobbit.7 M /branches/4.2.2/common/hobbitclient.cfg.5 M /branches/4.2.2/common/hobbitlaunch.8 M /branches/4.2.2/common/hobbitlaunch.cfg.5 M /branches/4.2.2/common/hobbitserver.cfg.5 M /branches/4.2.2/common/logfetch.1 M /branches/4.2.2/common/msgcache.8 M /branches/4.2.2/common/orcahobbit.1 M /branches/4.2.2/configure M /branches/4.2.2/configure.client M /branches/4.2.2/configure.server M /branches/4.2.2/debian/changelog M /branches/4.2.2/debian/control M /branches/4.2.2/debian/hobbit-client.init M /branches/4.2.2/debian/hobbit-client.postinst M /branches/4.2.2/debian/hobbit-client.preinst M /branches/4.2.2/debian/hobbit.conffiles M /branches/4.2.2/debian/hobbit.config M /branches/4.2.2/debian/hobbit.logrotate M /branches/4.2.2/debian/hobbit.postinst M /branches/4.2.2/debian/hobbit.preinst M /branches/4.2.2/debian/rules M /branches/4.2.2/docs/about.html M /branches/4.2.2/docs/bb-to-hobbit.html M /branches/4.2.2/docs/criticalsystems.html M /branches/4.2.2/docs/hobbit-alerts.html M /branches/4.2.2/docs/hobbit-config.html M /branches/4.2.2/docs/hobbit-mrtg.html M /branches/4.2.2/docs/howtograph.html M /branches/4.2.2/docs/install.html M /branches/4.2.2/docs/known-issues.html M /branches/4.2.2/docs/man-index.html M /branches/4.2.2/hobbitd/bbcombotest.1 M /branches/4.2.2/hobbitd/bbcombotest.cfg.5 M /branches/4.2.2/hobbitd/client-local.cfg.5 M /branches/4.2.2/hobbitd/etcfiles/bb-hosts.DIST M /branches/4.2.2/hobbitd/etcfiles/client-local.cfg M /branches/4.2.2/hobbitd/etcfiles/columndoc.csv M /branches/4.2.2/hobbitd/etcfiles/hobbit-apache-open.DIST M /branches/4.2.2/hobbitd/etcfiles/hobbit-apache-secure.DIST M /branches/4.2.2/hobbitd/etcfiles/hobbit-clients.cfg M /branches/4.2.2/hobbitd/etcfiles/hobbitcgi.cfg.DIST M /branches/4.2.2/hobbitd/etcfiles/hobbitlaunch.cfg.DIST M /branches/4.2.2/hobbitd/etcfiles/hobbitserver.cfg.DIST M /branches/4.2.2/hobbitd/hobbit-alerts.cfg.5 M /branches/4.2.2/hobbitd/hobbit-clients.cfg.5 M /branches/4.2.2/hobbitd/hobbit-mailack.8 M /branches/4.2.2/hobbitd/hobbitd.8 M /branches/4.2.2/hobbitd/hobbitd_alert.8 M /branches/4.2.2/hobbitd/hobbitd_channel.8 M /branches/4.2.2/hobbitd/hobbitd_client.8 M /branches/4.2.2/hobbitd/hobbitd_filestore.8 M /branches/4.2.2/hobbitd/hobbitd_history.8 M /branches/4.2.2/hobbitd/hobbitd_hostdata.8 M /branches/4.2.2/hobbitd/hobbitd_rrd.8 M /branches/4.2.2/hobbitd/hobbitd_sample.8 M /branches/4.2.2/hobbitd/hobbitfetch.8 M /branches/4.2.2/hobbitd/hobbitweb.5 M /branches/4.2.2/hobbitd/trimhistory.8 M /branches/4.2.2/hobbitd/webfiles/acknowledge_header M /branches/4.2.2/hobbitd/webfiles/bb2_header M /branches/4.2.2/hobbitd/webfiles/bb_footer M /branches/4.2.2/hobbitd/webfiles/bb_header M /branches/4.2.2/hobbitd/webfiles/bbnk_header M /branches/4.2.2/hobbitd/webfiles/bbrep_header M /branches/4.2.2/hobbitd/webfiles/bbsnap2_header M /branches/4.2.2/hobbitd/webfiles/bbsnap_header M /branches/4.2.2/hobbitd/webfiles/bbsnapnk_header M /branches/4.2.2/hobbitd/webfiles/columndoc_header M /branches/4.2.2/hobbitd/webfiles/confreport_front M /branches/4.2.2/hobbitd/webfiles/confreport_header M /branches/4.2.2/hobbitd/webfiles/event_header M /branches/4.2.2/hobbitd/webfiles/findhost_header M /branches/4.2.2/hobbitd/webfiles/ghosts_header M /branches/4.2.2/hobbitd/webfiles/graphs_header M /branches/4.2.2/hobbitd/webfiles/hist_header M /branches/4.2.2/hobbitd/webfiles/histlog_header M /branches/4.2.2/hobbitd/webfiles/hobbitnk_footer M /branches/4.2.2/hobbitd/webfiles/hobbitnk_header M /branches/4.2.2/hobbitd/webfiles/hostgraphs_header M /branches/4.2.2/hobbitd/webfiles/hostsvc_header M /branches/4.2.2/hobbitd/webfiles/info_header M /branches/4.2.2/hobbitd/webfiles/maint_header M /branches/4.2.2/hobbitd/webfiles/maintact_header M /branches/4.2.2/hobbitd/webfiles/nkedit_header M /branches/4.2.2/hobbitd/webfiles/notify_footer M /branches/4.2.2/hobbitd/webfiles/notify_header M /branches/4.2.2/hobbitd/webfiles/replog_header M /branches/4.2.2/hobbitd/webfiles/report_form M /branches/4.2.2/hobbitd/webfiles/report_form_daily M /branches/4.2.2/hobbitd/webfiles/report_form_monthly M /branches/4.2.2/hobbitd/webfiles/report_form_weekly M /branches/4.2.2/hobbitd/webfiles/report_header M /branches/4.2.2/hobbitd/webfiles/snapshot_form M /branches/4.2.2/hobbitd/webfiles/snapshot_header M /branches/4.2.2/hobbitd/webfiles/zoom.js M /branches/4.2.2/hobbitd/wwwfiles/menu/menu_items.js.DIST M /branches/4.2.2/rpm/hobbit.spec M /branches/4.2.2/web/bb-ack.cgi.1 M /branches/4.2.2/web/bb-csvinfo.cgi.1 M /branches/4.2.2/web/bb-datepage.cgi.1 M /branches/4.2.2/web/bb-eventlog.cgi.1 M /branches/4.2.2/web/bb-findhost.cgi.1 M /branches/4.2.2/web/bb-hist.cgi.1 M /branches/4.2.2/web/bb-rep.cgi.1 M /branches/4.2.2/web/bb-replog.cgi.1 M /branches/4.2.2/web/bb-snapshot.cgi.1 M /branches/4.2.2/web/bb-webpage.cgi.1 M /branches/4.2.2/web/hobbit-ackinfo.cgi.1 M /branches/4.2.2/web/hobbit-confreport.cgi.1 M /branches/4.2.2/web/hobbit-enadis.cgi.8 M /branches/4.2.2/web/hobbit-ghosts.cgi.1 M /branches/4.2.2/web/hobbit-hostgraphs.cgi.1 M /branches/4.2.2/web/hobbit-nkedit.cgi.1 M /branches/4.2.2/web/hobbit-nkview.cfg.5 M /branches/4.2.2/web/hobbit-nkview.cgi.1 M /branches/4.2.2/web/hobbit-statusreport.cgi.1 M /branches/4.2.2/web/hobbitcgi.cfg.5 M /branches/4.2.2/web/hobbitgraph.cfg.5 M /branches/4.2.2/web/hobbitgraph.cgi.1 M /branches/4.2.2/web/hobbitsvc.cgi.1 Documentation etc. updates for renaming project to Xymon. ------------------------------------------------------------------------ r5977 | storner | 2008-11-27 14:13:45 +0100 (Thu, 27 Nov 2008) | 3 lines Changed paths: M /branches/4.2.2/debian/hobbit.init Add standard stanza for daemon init scripts. ------------------------------------------------------------------------ r5978 | storner | 2008-11-27 14:23:39 +0100 (Thu, 27 Nov 2008) | 3 lines Changed paths: A /branches/4.2.2/common/xymon.7 (from /branches/4.2.2/common/hobbit.7:5976) Rename "hobbit.7" to "xymon.7" as part of project rename ------------------------------------------------------------------------ r5979 | storner | 2008-11-27 14:24:24 +0100 (Thu, 27 Nov 2008) | 2 lines Changed paths: A /branches/4.2.2/hobbitd/client/bbwin.c M /branches/4.2.2/hobbitd/client_config.c M /branches/4.2.2/hobbitd/client_config.h M /branches/4.2.2/hobbitd/hobbitd_client.c M /branches/4.2.2/hobbitd/rrd/do_disk.c M /branches/4.2.2/hobbitd/rrd/do_ifstat.c M /branches/4.2.2/hobbitd/rrd/do_netstat.c M /branches/4.2.2/hobbitd/rrd/do_vmstat.c M /branches/4.2.2/lib/misc.c M /branches/4.2.2/lib/misc.h Add support for BBWin in centralized mode. ------------------------------------------------------------------------ r5980 | storner | 2008-11-27 14:25:03 +0100 (Thu, 27 Nov 2008) | 3 lines Changed paths: D /branches/4.2.2/common/hobbit.7 Renamed to xymon.7 ------------------------------------------------------------------------ r5981 | storner | 2008-11-27 14:27:10 +0100 (Thu, 27 Nov 2008) | 3 lines Changed paths: M /branches/4.2.2/common/xymon.7 Actually updated the contents of the file for the Xymon rename. ------------------------------------------------------------------------ r5982 | storner | 2008-11-27 14:31:18 +0100 (Thu, 27 Nov 2008) | 3 lines Changed paths: M /branches/4.2.2/RELEASENOTES Modified notes for 4.2.2. ------------------------------------------------------------------------ r5983 | storner | 2008-11-27 15:07:06 +0100 (Thu, 27 Nov 2008) | 3 lines Changed paths: M /branches/4.2.2/hobbitd/do_rrd.c Drop the BEA and BIND statistics - they never really worked. ------------------------------------------------------------------------ r5984 | storner | 2008-11-27 15:10:26 +0100 (Thu, 27 Nov 2008) | 1 line Changed paths: M /branches/4.2.2/bbdisplay/bbgen.1 M /branches/4.2.2/bbnet/bb-services.5 M /branches/4.2.2/bbnet/bbretest-net.sh.1 M /branches/4.2.2/bbnet/bbtest-net.1 M /branches/4.2.2/bbnet/hobbitping.1 M /branches/4.2.2/bbproxy/bbmessage.cgi.8 M /branches/4.2.2/bbproxy/bbproxy.8 M /branches/4.2.2/common/bb-hosts.5 M /branches/4.2.2/common/bb.1 M /branches/4.2.2/common/bbcmd.1 M /branches/4.2.2/common/bbdigest.1 M /branches/4.2.2/common/bbhostgrep.1 M /branches/4.2.2/common/bbhostshow.1 M /branches/4.2.2/common/clientlaunch.cfg.5 M /branches/4.2.2/common/clientupdate.1 M /branches/4.2.2/common/hobbitclient.cfg.5 M /branches/4.2.2/common/hobbitlaunch.8 M /branches/4.2.2/common/hobbitlaunch.cfg.5 M /branches/4.2.2/common/hobbitserver.cfg.5 M /branches/4.2.2/common/logfetch.1 M /branches/4.2.2/common/msgcache.8 M /branches/4.2.2/common/orcahobbit.1 M /branches/4.2.2/common/xymon.7 M /branches/4.2.2/debian/changelog M /branches/4.2.2/hobbitd/bbcombotest.1 M /branches/4.2.2/hobbitd/bbcombotest.cfg.5 M /branches/4.2.2/hobbitd/client-local.cfg.5 M /branches/4.2.2/hobbitd/hobbit-alerts.cfg.5 M /branches/4.2.2/hobbitd/hobbit-clients.cfg.5 M /branches/4.2.2/hobbitd/hobbit-mailack.8 M /branches/4.2.2/hobbitd/hobbitd.8 M /branches/4.2.2/hobbitd/hobbitd_alert.8 M /branches/4.2.2/hobbitd/hobbitd_channel.8 M /branches/4.2.2/hobbitd/hobbitd_client.8 M /branches/4.2.2/hobbitd/hobbitd_filestore.8 M /branches/4.2.2/hobbitd/hobbitd_history.8 M /branches/4.2.2/hobbitd/hobbitd_hostdata.8 M /branches/4.2.2/hobbitd/hobbitd_rrd.8 M /branches/4.2.2/hobbitd/hobbitd_sample.8 M /branches/4.2.2/hobbitd/hobbitfetch.8 M /branches/4.2.2/hobbitd/hobbitweb.5 M /branches/4.2.2/hobbitd/trimhistory.8 M /branches/4.2.2/include/version.h M /branches/4.2.2/web/bb-ack.cgi.1 M /branches/4.2.2/web/bb-csvinfo.cgi.1 M /branches/4.2.2/web/bb-datepage.cgi.1 M /branches/4.2.2/web/bb-eventlog.cgi.1 M /branches/4.2.2/web/bb-findhost.cgi.1 M /branches/4.2.2/web/bb-hist.cgi.1 M /branches/4.2.2/web/bb-rep.cgi.1 M /branches/4.2.2/web/bb-replog.cgi.1 M /branches/4.2.2/web/bb-snapshot.cgi.1 M /branches/4.2.2/web/bb-webpage.cgi.1 M /branches/4.2.2/web/hobbit-ackinfo.cgi.1 M /branches/4.2.2/web/hobbit-confreport.cgi.1 M /branches/4.2.2/web/hobbit-enadis.cgi.8 M /branches/4.2.2/web/hobbit-ghosts.cgi.1 M /branches/4.2.2/web/hobbit-hostgraphs.cgi.1 M /branches/4.2.2/web/hobbit-nkedit.cgi.1 M /branches/4.2.2/web/hobbit-nkview.cfg.5 M /branches/4.2.2/web/hobbit-nkview.cgi.1 M /branches/4.2.2/web/hobbit-statusreport.cgi.1 M /branches/4.2.2/web/hobbitcgi.cfg.5 M /branches/4.2.2/web/hobbitgraph.cfg.5 M /branches/4.2.2/web/hobbitgraph.cgi.1 M /branches/4.2.2/web/hobbitsvc.cgi.1 Bump version number to 4.2.2 ------------------------------------------------------------------------ r5985 | storner | 2008-11-27 15:34:16 +0100 (Thu, 27 Nov 2008) | 3 lines Changed paths: A /branches/4.2.2/debian/default debian/default had not been checked into SVN. ------------------------------------------------------------------------ r5987 | storner | 2008-11-27 22:40:08 +0100 (Thu, 27 Nov 2008) | 1 line Changed paths: M /branches/4.2.2/build/Makefile.rules Dont try to clean the optional directories ------------------------------------------------------------------------ r5988 | storner | 2008-11-27 22:42:45 +0100 (Thu, 27 Nov 2008) | 1 line Changed paths: M /branches/4.2.2/web/hobbit-confreport.c Fix Config Report (Critical) to work when hosts are in nkview.cfg but have no NK tags in bb-hosts. From Mandriva sources. ------------------------------------------------------------------------ r5989 | storner | 2008-11-27 22:59:07 +0100 (Thu, 27 Nov 2008) | 2 lines Changed paths: M /branches/4.2.2/hobbitd/do_rrd.c A /branches/4.2.2/hobbitd/rrd/do_trends.c "trends" RRD support from http://www.hswn.dk/hobbiton/2007/01/msg00236.html ------------------------------------------------------------------------ r5990 | storner | 2008-11-28 07:43:02 +0100 (Fri, 28 Nov 2008) | 1 line Changed paths: M /branches/4.2.2/build/test-ldap.c Build properly with new OpenLDAP API by using deprecated functions. ------------------------------------------------------------------------ r5991 | storner | 2008-11-28 07:44:53 +0100 (Fri, 28 Nov 2008) | 1 line Changed paths: M /branches/4.2.2/bbnet/contest.c Debian bug #503111: Dont crash on long-living SSL certs. ------------------------------------------------------------------------ r5992 | storner | 2008-11-28 07:47:24 +0100 (Fri, 28 Nov 2008) | 3 lines Changed paths: M /branches/4.2.2/lib/htmllog.c Old BB clients do not send in the "df" header line, so adjust linecount accordingly. From Debian patches for 4.2.0.dfsg-14lenny2. ------------------------------------------------------------------------ r5993 | storner | 2008-11-28 10:18:41 +0100 (Fri, 28 Nov 2008) | 1 line Changed paths: M /branches/4.2.2/lib/url.c The BB proxy-syntax could not handle https target URLs. From Debian. ------------------------------------------------------------------------ r5995 | storner | 2008-11-28 10:27:42 +0100 (Fri, 28 Nov 2008) | 1 line Changed paths: M /branches/4.2.2/bbnet/ldaptest.h Build properly with new OpenLDAP API by using deprecated functions (missed ldaptest.h in previous commit) ------------------------------------------------------------------------ r5996 | storner | 2008-11-28 11:55:16 +0100 (Fri, 28 Nov 2008) | 2 lines Changed paths: M /branches/4.2.2/hobbitd/do_rrd.c M /branches/4.2.2/hobbitd/do_rrd.h M /branches/4.2.2/hobbitd/hobbitd_rrd.8 M /branches/4.2.2/hobbitd/hobbitd_rrd.c M /branches/4.2.2/hobbitd/rrd/do_ncv.c Split-NCV and TRACKMAX support from Charles Goyard (ref: http://www.hobbitmon.com/hobbiton/2007/03/msg00368.html). Taken from the Debian patchset. ------------------------------------------------------------------------ r5997 | storner | 2008-11-28 19:19:10 +0100 (Fri, 28 Nov 2008) | 2 lines Changed paths: M /branches/4.2.2/client/hobbitclient-linux.sh Fix for SuSE being ridiculous with their naming scheme. ------------------------------------------------------------------------ r5998 | storner | 2008-12-01 10:54:58 +0100 (Mon, 01 Dec 2008) | 3 lines Changed paths: M /branches/4.2.2/lib/htmllog.c Dont count lines if there is already a "linecount" HTML comment. ------------------------------------------------------------------------ r5999 | storner | 2008-12-01 10:58:09 +0100 (Mon, 01 Dec 2008) | 1 line Changed paths: M /branches/4.2.2/hobbitd/do_rrd.c M /branches/4.2.2/hobbitd/etcfiles/hobbitgraph.cfg M /branches/4.2.2/hobbitd/etcfiles/hobbitserver.cfg.DIST M /branches/4.2.2/hobbitd/hobbitd_filestore.c A /branches/4.2.2/hobbitd/rrd/do_beastat.c A /branches/4.2.2/hobbitd/rrd/do_dbcheck.c M /branches/4.2.2/hobbitd/rrd/do_disk.c A /branches/4.2.2/hobbitd/rrd/do_fd_lib.c M /branches/4.2.2/hobbitd/rrd/do_la.c A /branches/4.2.2/hobbitd/rrd/do_netapp.c M /branches/4.2.2/lib/htmllog.c M /branches/4.2.2/web/hobbitsvc.c Merge hobbit-perl-client v1.15 server-side patches by Francesco Duranti ------------------------------------------------------------------------ r6000 | storner | 2008-12-01 11:53:35 +0100 (Mon, 01 Dec 2008) | 1 line Changed paths: M /branches/4.2.2/hobbitd/do_rrd.c M /branches/4.2.2/hobbitd/etcfiles/hobbitserver.cfg.DIST M /branches/4.2.2/hobbitd/hobbitd_filestore.c A /branches/4.2.2/hobbitd/rrd/do_devmon.c M /branches/4.2.2/lib/hobbitrrd.c M /branches/4.2.2/lib/htmllog.c M /branches/4.2.2/web/hobbitsvc.c Merged server-side patch for Devmon 0.3.0 ------------------------------------------------------------------------ r6001 | storner | 2008-12-01 12:36:53 +0100 (Mon, 01 Dec 2008) | 1 line Changed paths: M /branches/4.2.2/Changes M /branches/4.2.2/RELEASENOTES Updated to list changes from 4.2.0 to 4.2.2 ------------------------------------------------------------------------ r6002 | storner | 2008-12-01 12:53:04 +0100 (Mon, 01 Dec 2008) | 1 line Changed paths: M /branches/4.2.2/hobbitd/rrd/do_devmon.c DEVMON: Updated with current TRUNK (r90) to fix segfault ------------------------------------------------------------------------ r6007 | storner | 2008-12-01 21:29:05 +0100 (Mon, 01 Dec 2008) | 1 line Changed paths: M /branches/4.2.2/bbnet/hobbitping.c Dont loop indefinitely if we cannot send an ICMP message (backport r5641 from trunk) ------------------------------------------------------------------------ r6008 | storner | 2008-12-01 21:38:26 +0100 (Mon, 01 Dec 2008) | 1 line Changed paths: M /branches/4.2.2/configure.client M /branches/4.2.2/configure.server User information on Darwin queried via dscl instead of nireport, for Leopard support ------------------------------------------------------------------------ r6011 | storner | 2008-12-01 22:10:40 +0100 (Mon, 01 Dec 2008) | 2 lines Changed paths: M /branches/4.2.2/hobbitd/do_alert.c Limit size of alert status-texts sent to a script to 4 KB. http://www.hswn.dk/hobbiton/2008/01/msg00015.html ------------------------------------------------------------------------ r6012 | storner | 2008-12-03 07:27:11 +0100 (Wed, 03 Dec 2008) | 4 lines Changed paths: M /branches/4.2.2/lib/acklog.c Alan Sparks noticed a 64-bit integer conversion problem resulting in strange data going into the acknowledgment logs. Patch from http://www.hobbitmon.com/hobbiton/2008/09/msg00038.html Backported from trunk r5815. ------------------------------------------------------------------------ r6013 | storner | 2008-12-03 07:39:43 +0100 (Wed, 03 Dec 2008) | 3 lines Changed paths: M /branches/4.2.2/bbnet/dns.c M /branches/4.2.2/bbnet/dns2.c Prepare bbtest-net for use of later versions of C-ARES. This way they can just be dropped in. Re-do the timeout code for DNS lookups so we'll always wait the full period for DNS timeouts to happen. ------------------------------------------------------------------------ r6014 | storner | 2008-12-04 12:50:05 +0100 (Thu, 04 Dec 2008) | 2 lines Changed paths: M /branches/4.2.2/hobbitd/rrd/do_disk.c Compiler warning fix ------------------------------------------------------------------------ r6015 | storner | 2008-12-04 12:54:11 +0100 (Thu, 04 Dec 2008) | 6 lines Changed paths: M /branches/4.2.2/hobbitd/rrd/do_ncv.c Several fixes from Graham Nayler: - Recognize signed numbers as values. - Dont index with -1 in dsname[outidx-1] (if DS name begins with non-alphanum) - Memory leak in split-NCV mode - Skip past any &COLOR text (backported from trunk) ------------------------------------------------------------------------ r6016 | storner | 2008-12-04 13:02:54 +0100 (Thu, 04 Dec 2008) | 2 lines Changed paths: M /branches/4.2.2/hobbitd/client/bbwin.c Fix parsing of [clock] section when the epoch reported does not contain a microsecond part. ------------------------------------------------------------------------ r6017 | storner | 2008-12-04 13:32:54 +0100 (Thu, 04 Dec 2008) | 2 lines Changed paths: M /branches/4.2.2/lib/loadalerts.c Fix broken handling of what duration to print on the alert-info webpage. ------------------------------------------------------------------------ r6019 | storner | 2008-12-04 13:45:03 +0100 (Thu, 04 Dec 2008) | 1 line Changed paths: M /branches/4.2.2/lib/loadalerts.c Wrong initialization for maxdur ------------------------------------------------------------------------ r6021 | storner | 2008-12-05 12:58:37 +0100 (Fri, 05 Dec 2008) | 1 line Changed paths: A /branches/4.2.2/hobbitd/webfiles/acknowledge_footer A /branches/4.2.2/hobbitd/webfiles/bb2_footer A /branches/4.2.2/hobbitd/webfiles/bbnk_footer A /branches/4.2.2/hobbitd/webfiles/bbrep_footer A /branches/4.2.2/hobbitd/webfiles/bbsnap2_footer A /branches/4.2.2/hobbitd/webfiles/bbsnap_footer A /branches/4.2.2/hobbitd/webfiles/bbsnapnk_footer A /branches/4.2.2/hobbitd/webfiles/columndoc_footer A /branches/4.2.2/hobbitd/webfiles/event_footer A /branches/4.2.2/hobbitd/webfiles/findhost_footer A /branches/4.2.2/hobbitd/webfiles/ghosts_footer A /branches/4.2.2/hobbitd/webfiles/graphs_footer A /branches/4.2.2/hobbitd/webfiles/hist_footer A /branches/4.2.2/hobbitd/webfiles/histlog_footer A /branches/4.2.2/hobbitd/webfiles/hostgraphs_footer A /branches/4.2.2/hobbitd/webfiles/hostsvc_footer A /branches/4.2.2/hobbitd/webfiles/info_footer A /branches/4.2.2/hobbitd/webfiles/maint_footer A /branches/4.2.2/hobbitd/webfiles/maintact_footer A /branches/4.2.2/hobbitd/webfiles/nkedit_footer A /branches/4.2.2/hobbitd/webfiles/replog_footer A /branches/4.2.2/hobbitd/webfiles/report_footer A /branches/4.2.2/hobbitd/webfiles/snapshot_footer Added missing footer-file symlinks ------------------------------------------------------------------------ r6022 | storner | 2008-12-08 13:10:29 +0100 (Mon, 08 Dec 2008) | 2 lines Changed paths: M /branches/4.2.2/hobbitd/hobbitd_client.c In testmode, dont strip newlines from logfile input ------------------------------------------------------------------------ r6023 | storner | 2008-12-08 13:13:09 +0100 (Mon, 08 Dec 2008) | 3 lines Changed paths: M /branches/4.2.2/hobbitd/client_config.c Add more debugging to the log-matching code. Make the use/ignore test in the logmatching more intuitively correct. ------------------------------------------------------------------------ r6024 | storner | 2008-12-11 21:48:11 +0100 (Thu, 11 Dec 2008) | 2 lines Changed paths: M /branches/4.2.2/configure Make all shell-scripts used during the build be executable. ------------------------------------------------------------------------ r6025 | storner | 2008-12-12 10:46:46 +0100 (Fri, 12 Dec 2008) | 1 line Changed paths: M /branches/4.2.2/configure.server Typo - xmon/xymon. Stef Coene noticed. ------------------------------------------------------------------------ r6026 | storner | 2008-12-15 13:57:54 +0100 (Mon, 15 Dec 2008) | 1 line Changed paths: M /branches/4.2.2/bbdisplay/bbgen.1 M /branches/4.2.2/bbnet/bb-services.5 M /branches/4.2.2/bbnet/bbretest-net.sh.1 M /branches/4.2.2/bbnet/bbtest-net.1 M /branches/4.2.2/bbnet/hobbitping.1 M /branches/4.2.2/bbproxy/bbmessage.cgi.8 M /branches/4.2.2/bbproxy/bbproxy.8 M /branches/4.2.2/common/bb-hosts.5 M /branches/4.2.2/common/bb.1 M /branches/4.2.2/common/bbcmd.1 M /branches/4.2.2/common/bbdigest.1 M /branches/4.2.2/common/bbhostgrep.1 M /branches/4.2.2/common/bbhostshow.1 M /branches/4.2.2/common/clientlaunch.cfg.5 M /branches/4.2.2/common/clientupdate.1 M /branches/4.2.2/common/hobbitclient.cfg.5 M /branches/4.2.2/common/hobbitlaunch.8 M /branches/4.2.2/common/hobbitlaunch.cfg.5 M /branches/4.2.2/common/hobbitserver.cfg.5 M /branches/4.2.2/common/logfetch.1 M /branches/4.2.2/common/msgcache.8 M /branches/4.2.2/common/orcahobbit.1 M /branches/4.2.2/common/xymon.7 A /branches/4.2.2/docs/manpages A /branches/4.2.2/docs/manpages/man1 A /branches/4.2.2/docs/manpages/man1/bb-ack.cgi.1.html A /branches/4.2.2/docs/manpages/man1/bb-csvinfo.cgi.1.html A /branches/4.2.2/docs/manpages/man1/bb-datepage.cgi.1.html A /branches/4.2.2/docs/manpages/man1/bb-eventlog.cgi.1.html A /branches/4.2.2/docs/manpages/man1/bb-findhost.cgi.1.html A /branches/4.2.2/docs/manpages/man1/bb-hist.cgi.1.html A /branches/4.2.2/docs/manpages/man1/bb-rep.cgi.1.html A /branches/4.2.2/docs/manpages/man1/bb-replog.cgi.1.html A /branches/4.2.2/docs/manpages/man1/bb-snapshot.cgi.1.html A /branches/4.2.2/docs/manpages/man1/bb-webpage.cgi.1.html A /branches/4.2.2/docs/manpages/man1/bb.1.html A /branches/4.2.2/docs/manpages/man1/bbcmd.1.html A /branches/4.2.2/docs/manpages/man1/bbcombotest.1.html A /branches/4.2.2/docs/manpages/man1/bbdigest.1.html A /branches/4.2.2/docs/manpages/man1/bbgen.1.html A /branches/4.2.2/docs/manpages/man1/bbhostgrep.1.html A /branches/4.2.2/docs/manpages/man1/bbhostshow.1.html A /branches/4.2.2/docs/manpages/man1/bbretest-net.sh.1.html A /branches/4.2.2/docs/manpages/man1/bbtest-net.1.html A /branches/4.2.2/docs/manpages/man1/clientupdate.1.html A /branches/4.2.2/docs/manpages/man1/hobbit-ackinfo.cgi.1.html A /branches/4.2.2/docs/manpages/man1/hobbit-confreport.cgi.1.html A /branches/4.2.2/docs/manpages/man1/hobbit-ghosts.cgi.1.html A /branches/4.2.2/docs/manpages/man1/hobbit-hostgraphs.cgi.1.html A /branches/4.2.2/docs/manpages/man1/hobbit-nkedit.cgi.1.html A /branches/4.2.2/docs/manpages/man1/hobbit-nkview.cgi.1.html A /branches/4.2.2/docs/manpages/man1/hobbit-statusreport.cgi.1.html A /branches/4.2.2/docs/manpages/man1/hobbitgraph.cgi.1.html A /branches/4.2.2/docs/manpages/man1/hobbitping.1.html A /branches/4.2.2/docs/manpages/man1/hobbitsvc.cgi.1.html A /branches/4.2.2/docs/manpages/man1/logfetch.1.html A /branches/4.2.2/docs/manpages/man1/orcahobbit.1.html A /branches/4.2.2/docs/manpages/man5 A /branches/4.2.2/docs/manpages/man5/bb-hosts.5.html A /branches/4.2.2/docs/manpages/man5/bb-services.5.html A /branches/4.2.2/docs/manpages/man5/bbcombotest.cfg.5.html A /branches/4.2.2/docs/manpages/man5/client-local.cfg.5.html A /branches/4.2.2/docs/manpages/man5/clientlaunch.cfg.5.html A /branches/4.2.2/docs/manpages/man5/hobbit-alerts.cfg.5.html A /branches/4.2.2/docs/manpages/man5/hobbit-clients.cfg.5.html A /branches/4.2.2/docs/manpages/man5/hobbit-nkview.cfg.5.html A /branches/4.2.2/docs/manpages/man5/hobbitcgi.cfg.5.html A /branches/4.2.2/docs/manpages/man5/hobbitclient.cfg.5.html A /branches/4.2.2/docs/manpages/man5/hobbitgraph.cfg.5.html A /branches/4.2.2/docs/manpages/man5/hobbitlaunch.cfg.5.html A /branches/4.2.2/docs/manpages/man5/hobbitserver.cfg.5.html A /branches/4.2.2/docs/manpages/man5/hobbitweb.5.html A /branches/4.2.2/docs/manpages/man7 A /branches/4.2.2/docs/manpages/man7/xymon.7.html A /branches/4.2.2/docs/manpages/man8 A /branches/4.2.2/docs/manpages/man8/bbmessage.cgi.8.html A /branches/4.2.2/docs/manpages/man8/bbproxy.8.html A /branches/4.2.2/docs/manpages/man8/hobbit-enadis.cgi.8.html A /branches/4.2.2/docs/manpages/man8/hobbit-mailack.8.html A /branches/4.2.2/docs/manpages/man8/hobbitd.8.html A /branches/4.2.2/docs/manpages/man8/hobbitd_alert.8.html A /branches/4.2.2/docs/manpages/man8/hobbitd_channel.8.html A /branches/4.2.2/docs/manpages/man8/hobbitd_client.8.html A /branches/4.2.2/docs/manpages/man8/hobbitd_filestore.8.html A /branches/4.2.2/docs/manpages/man8/hobbitd_history.8.html A /branches/4.2.2/docs/manpages/man8/hobbitd_hostdata.8.html A /branches/4.2.2/docs/manpages/man8/hobbitd_rrd.8.html A /branches/4.2.2/docs/manpages/man8/hobbitd_sample.8.html A /branches/4.2.2/docs/manpages/man8/hobbitfetch.8.html A /branches/4.2.2/docs/manpages/man8/hobbitlaunch.8.html A /branches/4.2.2/docs/manpages/man8/msgcache.8.html A /branches/4.2.2/docs/manpages/man8/trimhistory.8.html M /branches/4.2.2/hobbitd/bbcombotest.1 M /branches/4.2.2/hobbitd/bbcombotest.cfg.5 M /branches/4.2.2/hobbitd/client-local.cfg.5 M /branches/4.2.2/hobbitd/hobbit-alerts.cfg.5 M /branches/4.2.2/hobbitd/hobbit-clients.cfg.5 M /branches/4.2.2/hobbitd/hobbit-mailack.8 M /branches/4.2.2/hobbitd/hobbitd.8 M /branches/4.2.2/hobbitd/hobbitd_alert.8 M /branches/4.2.2/hobbitd/hobbitd_channel.8 M /branches/4.2.2/hobbitd/hobbitd_client.8 M /branches/4.2.2/hobbitd/hobbitd_filestore.8 M /branches/4.2.2/hobbitd/hobbitd_history.8 M /branches/4.2.2/hobbitd/hobbitd_hostdata.8 M /branches/4.2.2/hobbitd/hobbitd_rrd.8 M /branches/4.2.2/hobbitd/hobbitd_sample.8 M /branches/4.2.2/hobbitd/hobbitfetch.8 M /branches/4.2.2/hobbitd/hobbitweb.5 M /branches/4.2.2/hobbitd/trimhistory.8 M /branches/4.2.2/web/bb-ack.cgi.1 M /branches/4.2.2/web/bb-csvinfo.cgi.1 M /branches/4.2.2/web/bb-datepage.cgi.1 M /branches/4.2.2/web/bb-eventlog.cgi.1 M /branches/4.2.2/web/bb-findhost.cgi.1 M /branches/4.2.2/web/bb-hist.cgi.1 M /branches/4.2.2/web/bb-rep.cgi.1 M /branches/4.2.2/web/bb-replog.cgi.1 M /branches/4.2.2/web/bb-snapshot.cgi.1 M /branches/4.2.2/web/bb-webpage.cgi.1 M /branches/4.2.2/web/hobbit-ackinfo.cgi.1 M /branches/4.2.2/web/hobbit-confreport.cgi.1 M /branches/4.2.2/web/hobbit-enadis.cgi.8 M /branches/4.2.2/web/hobbit-ghosts.cgi.1 M /branches/4.2.2/web/hobbit-hostgraphs.cgi.1 M /branches/4.2.2/web/hobbit-nkedit.cgi.1 M /branches/4.2.2/web/hobbit-nkview.cfg.5 M /branches/4.2.2/web/hobbit-nkview.cgi.1 M /branches/4.2.2/web/hobbit-statusreport.cgi.1 M /branches/4.2.2/web/hobbitcgi.cfg.5 M /branches/4.2.2/web/hobbitgraph.cfg.5 M /branches/4.2.2/web/hobbitgraph.cgi.1 M /branches/4.2.2/web/hobbitsvc.cgi.1 Update man-page version number and HTML versions of man-pages ------------------------------------------------------------------------ r6027 | storner | 2008-12-15 14:08:28 +0100 (Mon, 15 Dec 2008) | 2 lines Changed paths: M /branches/4.2.2/client/netbsd-meminfo.c Use 64-bit numbers for memory-info, so >2 GB systems are handled correctly. From Tracy Di Marco White. ------------------------------------------------------------------------ Changes from 4.1.2p1 -> 4.2 (10 Aug 2006) ----------------------------------------- New features: * A major overhaul of the "Critical Systems" (NK) webpage. A new hobbit-nkview CGI has been added, allowing much more flexible handling of the NK alerts. This allows the 24x7 monitoring staff to group alerts by priority, filter out acknowledged alerts that have been delegated to resolver groups, to permanently enable or disable a status to appear on their monitoring console when a system goes into or is taken out of production, and also provides direct acces to special instructions for the monitoring staff. To accomodate all of these new configuration items, a separate "Critical Systems Configuration" file is introduced, which is separate from the bb-hosts file. A web-based configuration tool - the "hobbit-nkedit" CGI - is also provided, allowing the monitoring operations staff to control what systems appear and how their monitoring is setup. Since hobbit-nkview is a CGI script, the Critical Systems page will now always show a completely up-to-date version of the Hobbit systems status. * The Hobbit client will now report logfile data as part of the client data. Which logfiles to monitor and how much data to send is configured centrally on the Hobbit server, and automatically transmitted to the client when it contacts the Hobbit server. See the logfetch(1) man-page for details. Apart from size limitations, the logfile data is not filtered by the client. * Two new tools - hobbitfetch and msgcache - can be used to implement a "pull" style of clients, which may be useful if you have systems that cannot make network connections to the Hobbit server to deliver their data. See the hobbitfetch(8) man-page for details. * Disabling a status can now be done until the status goes to an OK state. * A "bulletin_header" or "bulletin_footer" file can now be created in the ~hobbit/server/web/ direectory. This will automatically get added to the header or footer of all webpages. * All configuration files now support the use of "include" statements to split the configuration into several files. * All configuration files now support the statement "directory DIRNAME"; this causes all normal files in this directory and below to be included as part of the configuration file. Note that the sequence of files being included in this way is not controllable. * An acknowledgment sent to Hobbit is only deleted after the status has been OK for a while (12 minutes). This allows a status to be acknowledged, then briefly go OK but return to critical shortly after, without resetting the alert timers. * A new "files" status column uses data from the client to monitor file- and directory attributes and sizes. This can be fed into graphs, so you can track the sizes of individual files or directories. * A new "ports" status column uses data from the client to monitor network ports. This can be fed into graphs, so you can track the number of connections to a given service, from a specific IP-address, or in a particular state. This is based on code provided by Mirko Saam. * The Hobbit clients now report network interface statistics. This allows for Hobbit to track network utilisation, like MRTG does. Note that due to limitations in many client operating systems, and the fact that Hobbit only records network statistics every 5 minutes, this is currently limited to approximately 100 Mbit/sec interfaces (Fast Ethernet). Gigabit interfaces are not handled correctly and will show up with much smaller bandwidth usage than what they actually do use. * When a host status goes critical, any client data from the host is saved. This allows detailed analysis of the host status just prior to a critical event happening, which can be helpful for troubleshooting. Improvements: * All of the core programs have been profiled to identify performance bottlenecks. Several optimizations have been implemented; these are definitely noticable when Hobbit is used in large installations (more than 100 hosts). The most noticable effects is a drop of 25-40% in hobbitd CPU utilisation, a 50% drop in CPU utilisation of the hobbitd_client module, and a huge speedup in the hobbit-enadis CGI program. * DOWNTIME can now be applied to individual tests, and you can specify a text explaining why the service is down. The new format in the bb-hosts file is: DOWNTIME=columns:days:starttime:endtime:cause If you have more than one service that you want to set the downtime for, "column" can be "*" to match all services, or you can define multiple downtime-settings: "DOWNTIME=http,ftp:*:0300:0315:CMS update;*:0:0200:0210:Reboot" * Status changes that happen during DOWNTIME periods do not update the last-status-change timestamp in hobbitd. Hence a service that was red before the start of DOWNTIME and stays red during downtime will not appear to be changed recently - so it wont reappear on the NK view when using time-based filters. * A new hobbit-statusreport CGI has been added. This CGI can generate an HTML report of all hosts with a given status column, e.g. all SSL certificates. By using filters, you can pick out those hosts where e.g. the status is non-green. A sample hobbit-certreport.sh script is included that uses this CGI to generate a report of all SSL certificates which are about to expire, i.e. have a red or yellow status. * When using alerts with FORMAT=SMS, the text will now clearly show when the status has RECOVERED. * The hobbitsvc CGI no longer needs to load the bb-hosts file to get information about the hosts' IP-address and display- name. Instead, it gets them from hobbitd as part of the normal request to get the current status. This avoids a lot of file I/O when looking at the detailed status page. * You can now explicitly choose which colors cause a status to appear on the BB2 page, via the "--bb2-colors=COLOR,COLOR" option to bbgen. * When zooming a graph, the legend now states the period that the graph covers. * bb-findhost now includes JavaScript code to make input focus go to the input field immediately. * SSH testing now sends an SSH version string. This should eliminate some logwarnings (note: requires updating of the bb-services file). * All BLUE status handling is now done by hobbitd. As a result, the detailed status shown while a status is BLUE will include the original status message color in the status text, even though the status will show up as blue. * bbhostgrep now support a "--no-down" option to omit hosts that are currently known to be down. This is determined by the current "conn" status. * The hobbit-mailack tool now recognizes ACK codes if given as a line "ack NUMBER" inside the mail body. Also, the duration of the acknowledge can be given through a "delay MINUTES" line in the message body. * The hobbitd client module can now run in a "local" mode, allowing for configurations to be maintained on individual servers. * Historical status logs generated by planned downtime settings now include a notice in the stored status log that the status was blue due to planned downtime. * For the NCV RRD handler, you can now set all datasets to a specific type by listing them as "NCV_foo=*:GAUGE". * The "bbdigest" utility no longer uses the OpenSSL library, and has been included in the client installation. * The "procs" (and "msgs" and "ports") status messages can now be configured to show an understandable legend for each of the checks, instead of the incomprehensible regular expression used to match the process listing. * Individual proces counts (matched through a PROC entry in hobbit-clients.cfg) can be tracked in a graph. * The event-log report can now select hosts based on the page they are on. Bugs: * The hobbitreports.sh script would calculate the wrong year and week-number for the end-of-year weekly reports. * hobbitd_client ignored qualifiers for individual rules. * The "query" command would return the wrong color for a disabled test. * The ncv handler would fail on input lines that had extra text after the value, e.g. "Temp: 23 degrees". * Memory reports from Mac OS X (Darwin) clients were ignored. Other: * The "NK" and "NKTIME" tags in the bb-hosts file have been deprecated with the introduction of the hobbit-nkview CGI. Similarly, the static NK webpage generated from these tags is now deprecated. They will continue to work for some time, but support for these will be removed in a future release of Hobbit. * The acknowledgment system has been redesigned, to allow for acks to happen at multiple levels of operation. E.g. the 24x7 monitoring staff may acknowledge an alert after raising a trouble-ticket, and a technician may acknowledge the same alert when responding to the ticket. This is currently used only by the new Critical Systems page, but a future release will use this for more advanced handling of alerts. * The HTML "Content-type" generated by the Hobbit CGI's can be configured through the HTMLCONTENTTYPE setting. This may be useful for sites where documentation embedded in the Hobbit webpages is in a different character-set, e.g. UTF-8 or Japanese. Changes from 4.1.2p1 -> 4.1.2p2 (02 Aug 2006) --------------------------------------------- Bugfixes: * [SECURITY] "config" commands would allow remote reading of any file accessible by the hobbit user. * Hosts were showing up twice on alternate pageset pages * Several programs would crash if a configuration file had a newline at exactly 4 KB offset into the file * Possible segfault in bbgen due to uninitialised variable. * Malformed history files could cause errors in reporting. * "query" of a disabled status would report the wrong color. Changes from 4.1.2 -> 4.1.2p1 (10 Nov 2005) ------------------------------------------- Bugfixes: * hobbitd could crash when processing a "combo" message, due to an incorrect test of the color of one message inside the combo-message before that color was actually deciphered. * hobbitd_alert would crash when attempting to save a checkpoint while cleaning up a "dead" alert. * Disk graphs would show up with all graphs in a single image, when the status message included any colored icons (typically, when the status was red or yellow). * The handling of alerts was counting the duration of an event based on when the color last changed. This meant that each time the color changed, any DURATION counters were reset. This would cause alerts to not go out if a status was changing between yellow and red faster than any DURATION setting. Changed this to count the event start as the *first* time the status went into an alert state (yellow or red, usually). * An idle hobbitd process would accumulate zombie processes. Improvements: * When a status goes yellow->red, the repeat-interval is now cleared for any alerts. This makes sure you get an alert immediately for the most severe state seen. This only affects the first such transition; if the status later changes between yellow/red, this normal REPEAT interval applies. Changes from 4.1.1 -> 4.1.2 (11 Oct 2005) ----------------------------------------- NOTE: If you are upgrading from 4.1.1, you MUST change the ~hobbit/server/etc/hobbit-clients.cfg file and add a line with the text "DEFAULT" before the default settings in the file. Post-RC1 fixes: * Linux client now runs ps with "-w" to get more of the command line. * Disk status reports from clients are now processed with sed to make sure each mounted filesystem appears on a single line. * A missing "req." text in the "procs" status report was fixed. * Web checks now recognize status "100" as OK. * All of the build scripts using "head -1" now use the POSIX'ly correct "head -n 1" instead. * Documentation update: We do have a client now; the hobbit-clients.cfg man-page was added. Bugfixes: * The hobbit module handling client reports had several bugs in the way it interpreted the hobbit-clients.cfg file. These were fixed, but this necessitated that the default settings are explicitly flagged with a "DEFAULT" line. * When multiple recipients of an alert had different minimum duration and/or repeat-settings, they would mostly use only the settings for the first recipient. * The alert module could continue sending alerts even though the rules in hobbit-alerts.cfg that triggered the alert had been modified. * The hobbitd daemon would leak memory when responding to a "query" request. In extreme circumstances, it could also crash. * The hobbitd_alert module could leak tiny amounts of memory. * The default timeouts on the server- and client-side have been increased to allow some more time to send in status messages. Because of Hobbit's more agressive use of "combo" messages and larger amounts of data, it could timeout prematurely on busy servers. * Hosts flagged with "nobb2" no longer appear in the acknowledge log on the BB2 page. * The size of the shared-memory buffers used to pass data between the core hobbit daemon and the hobbitd_* modules has been increased, allowing for larger messages. These are now also configurable, so you can change them without having to recompile Hobbit (see the MAXMSG_* settings in hobbitserver.cfg(5)). * bbproxy: When sending to multiple servers and the connection to one server fails, continue feeding a message to the other servers instead of dropping it completely. * bbproxy: Rotating the logs will now also rotate the logfile for any debugging output. * The RSS files now escape special characters, to make sure the file has a valid RSS XML syntax. * The "cpu" status from a Hobbit client with a critical load would include texts showing both that the load was "high" and "critical". Changed to include only the most severe condition. * The "ncv" (name-colon-value) data handler could easily read past end of input, and mis-interpret the input data. Fixed by Matti Klock. Build fixes: * An "autoconf" type of script is now used to check for some of the more common build problems. This should make the client build without problems on more platforms. * The "configure" script will now recognize the "hobbit" user on systems using NIS or NIS+. * "make install" would fail to set the proper permissions for the Hobbit client directories. * The pre-built Debian- and RPM-packages failed to flag the client configuration files as such, so they would be overwritten by an upgrade. Note that this fix only takes effect AFTER you have installed the new .deb or .rpm files. * The pre-built Debian- and RPM-packages failed to set permissions on the client logs/ and tmp/ directories. * A separate "hobbit-client" package is now generated in both .rpm and .deb format. * A bug in the "merge-sects" installation utility has been fixed. This could cause the installation to abort prematurely. Server improvements: * The acknowledge log on the BB 2 page now has a configurable max number and max time of the entries listed, via the --max-ackcount and --max-acktime options for bbgen. * The eventlog script now lets you filter out events based on the hostname, testname, color, and start/stop times. Thanks to Eric Schwimmer for contributing this. * The "netstat" statistics module has been upgraded to collect byte-counter statistics for HP-UX, AIX, OSF/1 and *BSD. This might only work with the Hobbit client, not the BB/LARRD bf-netstat module. * A "group-except" definition is now supported in the bb-hosts file, to show all tests EXCEPT certain ones for a group of hosts. * A "noclear" tag has been added. This is the equivalent of defining all network test with the '~' - "always report true status" - flag. * RPC tests now only run if the ping check of the server did not fail. * The default size of the RRD graphs can be defined via the RRDHEIGHT and RRDWIDTH settings in hobbitserver.cfg. * The hobbitgraph CGI can now generate comparison graphs with e.g. the load graphs from multiple hosts. However, a front-end tool for requsting these has not yet been created. * Stale RRD files (.rrd files that haven't been updated for more than 1 day) are no longer included when generating the graphs on the status pages. They still show up if you view the graphs on the "trends" status column. * The hobbit-confreport CGI is now installed correctly, including an item in the "Reports" menu. * The "info" column now include the "uname" data from the Hobbit client, allowing you to see what operating system is running on the host. Client improvements: * The "runclient.sh" script now accepts two command-line options: "--hostname=CLIENT.HOST.NAME" lets you override the default hostname that the client uses when it reports data to Hobbit; "--os=OSNAME" lets you override the operating system name for certain Linux systems. See the README.CLIENT file. * The client is now re-locatable. I.e. you can pack up the "client" directory and move it to another box or another location for easier deployment of the client on multiple boxes running the same operating system. * Client installations on NIS-based systems should now work. * AIX is now supported - has been tested with 4.3.3 and 5.x. * OSF/1 is now supported (4.x and 5.x) * HP-UX support should work * Darwin / Mac OS X is now supported. * {Free,Net,Open}BSD-based systems failed to build the meminfo tool, so memory reporting was broken. * Solaris clients now reports all types of filesystems (notably "vxfs" filesystems were omitted before). * The client configuration now lets you check for filesystems that MUST be mounted. * The clients now switch locale to use the POSIX locale - previously the system locale was used, which could result in status messages in languages that the backend did not expect. Other: * A new utility "demotool" can be used to simulate a number of servers to Hobbit. This may be useful when demonstrating Hobbit to new users. Note: This is not included in the default build - to build it, run "make demo-build". Changes from 4.1.0 -> 4.1.1 (25 Jul 2005) ----------------------------------------- Bugfixes: * The Hobbit client mis-interpreted the "df" output from filesystems with longer-than-usual device names (e.g. network-mounted filesystems, resulting in some rather incredible values for the disk utilisation. * hobbitsvc.cgi could crash if some of the input parameters from the URL were missing. This would only happen if you accessed it via a URL that was not created by Hobbit. * The hobbitlaunch.cfg file for the server was missing a line, causing it to run the local client much more often than intended. * A faulty initialisation when reloading the Hobbit daemon state could leave a broken pointer in a log-record. If this was then accessed by a "hobbitdxboard" or a "drop" command, hobbitd would crash. Build problems: * The "configure" script failed on certain systems with a "cannot shift" error. * Building the client on systems without the PCRE headers would fail. * Building Hobbit - client or server - would fail on a system if the PCRE headers were in a non-standard location. Changes from 4.0.4 -> 4.1.0 (24 Jul 2005) ----------------------------------------- A Hobbit client for Unix systems has been implemented, and this was found important enough to warrant bumping the version number to 4.1. The README.CLIENT file has the details on how to use it. The client is automatically installed as part of a server installation. Server bugfixes: * [SECURITY] The Hobbit daemon (hobbitd) could crash when processing certain types of messages. It is believed that this could only be used for a denial-of-service attack against Hobbit, although it cannot completely be ruled out that an attacker might be able to exploit it to run arbitrary code with the privileges of the hobbit user. Thanks to Vernon Everett and Stefan Loos for their efforts in helping me track down these bugs. * Workaround a bug in KHTML based browsers (KDE's Konqueror, Mac OS X Safari) when generating reports: They cannot handle "multipart/mixed" documents, but only offer to save the document instead of sending you off to the report URL. * Fix a build problem on OpenBSD: Apparently OpenBSD's linker does not recognize the --rpath option. * A memory leak in the Hobbit daemon has been fixed (it would leak memory upon each reload of the bb-hosts file, which is done every 5 minutes). * Status messages using "&green" or another color in the first line of the status message would display the "&green" text instead of the color GIF image. * bbtest-net's collection of DNS responses has been delayed until an actual test is queued. Previously, a host with a "testip" flag could end up with a DNS lookup which doesn't really make sense. * Handling of the "notrends" tag was broken. * The duration string should no longer be included in the webpage showing a disabled test. (Only applies to tests disabled after installing Hobbit 4.0.5). * bbtest-net now reports "Hobbit" in the User-Agent header of all web requests, instead of "BigBrother". * If an alert was configured to be sent only during certain periods of time, the recovery message would be suppressed if the recovery happened outside of the alerting period. Changed so that recovery messages ignore the time-based restrictions. * hobbit-mailack would generate ack's valid for 30 minutes, instead of the documented 60 minutes. Changed to use 60 minutes. * An off-by-one error in the routine generating the HTML document headers and footers was caught by Valgrind. * A number of minor documentation fixes. * Memory reports from Win32 clients using the Big Brother client could trigger an overflow when calculating the memory usage, resulting in memory utilization being reported as 0. Changed to use a larger internal representation for the memory sizes. Server improvements: * A new reporting tool, hobbit-confreport.cgi, provides a way of generating a printable report summarizing the Hobbit monitoring configuration for a single server or a group of servers. * If a "custom" directory exists, you can have custom Hobbit tools located there and have them built during the normal build proces. * A status handed off to the hobbitd_alert module, but for which there is no alert recipient configured, would be re-checked every minute causing a heavy spike in the CPU load if there were many such statuses. A small code change allows us to skip these until the configuration file changes. * The code handling lookups of data from the bb-hosts file was changed to access the data via a tree-based search instead of a linear search. On large systems this provides a much more efficient retrieval of these data, reducing the overall load of Hobbit. * The internal representation of status-data inside the hobbitd daemon now uses a more efficient tree-structure instead of a simple linked list. * The NETFAILTEXT environment variable can be used to change the "not OK" text added to status messages of failed network tests. * External commands used in network testing (ntpdate, rpcinfo, traceroute) now have max. 30 seconds to complete. This is to avoid a broken ntpdate or similar to lock up the network tests. The "--cmdtimeout=N" option controls the length of the timeout. * hobbitlaunch no longer logs every task started to the hobbitlaunch.log file - this could result in the log file growing to huge proportions. The "--verbose" option for hobbitlaunch will restore the old behaviour, if needed. * A number of arbitrary limits on the size of various buffers, messages, queries and responses have been removed. Hobbit will now handle status-messages of practically any size, except that the interface between the main daemon and the worker modules (handling history, RRD files and alerts) is limited to 100 KB message size. Configuration files (bb-hosts, hobbit-alerts.cfg, hobbitserver.cfg, hobbitlaunch.cfg) can have lines of any length. Continuation lines are now supported in all configuration files. * The moverrd.sh is now included in the default installation. * OpenBSD vmstat output now supported. LARRD / Hobbit cleanup: Upon request from Craig Cook, the code and docs were changed to clarify that Hobbit and LARRD are not related. I therefore decided to remove references to "LARRD" in the configuration files, resulting in these changes: * LARRDCOLUMN renamed to TRENDSCOLUMN, and LARRDS renamed to TEST2RRD in hobbitserver.cfg (handled automatically by "make install"). * The bb-hosts "LARRD:" tag was renamed to "TRENDS:". Existing bb-hosts files using the old tag still work, though. * The hobbitd_larrd program were renamed to hobbitd_rrd. The default hobbitlaunch.cfg file was also changed to reflect this, and the names of the logfiles from the two RRD update tasks were changed as well. All of this should happen automatically when running "make install", but if you have added extra options - e.g. for custom graphs - then you may need to re-do those modifications in hobbitlaunch.cfg. Changes from 4.0.3 -> 4.0.4 (29 May 2005) ----------------------------------------- Bugfixes: * "nodisp" tag re-implemented for hosts that should not appear on the Hobbit webpages. * Enabling the "apache" data collection could crash bbtest-net if the /server-status page returned was larger than 32 KB. * The "bbcmd" tool would not pass a --debug option to the command it was running. * Nested macros in hobbit-alerts.cfg were not working. * Using TAB's in hobbit-alerts.cfg could confuse the alert module. * hobbitd_alert's --test option now determines the page-name for a host automatically. It will also now accept a time-parameter to simulate how alerts are processed at specific time-of-day. * Status messages from "dialup" hosts should not go purple. * The "mailq" RRD handler would pick up the first number from the "requests" line, which might not be the right number. * Scheduling a "disable" did not work. * The startup-script was modified to correctly handle stale PID files left over from an unclean shutdown of Hobbit. These are now removed, and startup will proceed normally. Improvements: * CGI tools now log error-output to dedicated logs in /var/log/hobbit/ * The "bea-snmpstats.sh" script has been removed, and replaced with an enhanced tool "beastat". This collects statistics via SNMP from BEA Weblogic servers, and reports these via "data" messages to Hobbit. The data collected are run-time data for the JRockIT JVM and thread/memory utilization data from each Weblogic server instance. * The "ntpstat" RRD handler now accepts the raw output from "ntpq -c rv" * The heartbeat-timeout for hobbitd has been increased to 60 seconds. Changes from 4.0.2 -> 4.0.3 (22 May 2005) ----------------------------------------- Bugfixes (general): * The bb-datepage and bbmessage CGI tools were reading the POST data in an incorrect way; it worked on most systems, but did not adhere to the CGI specification. Bugfixes (alerting): * Acknowledgments were broken in 4.0.2. * Using PAGE=... in hobbit-alerts.cfg to pick out hosts on the front-page was not possible. The front page is now recognized with the name "/", so PAGE=/ will find them. * The hobbitd_alert --test option would not pick up the correct page-path settings from the bb-hosts file. * The BBALPHAMSG text passed to scripts as a default alert message now includes the URL link to the statuslog. Bugfixes (graphs and trends): * hobbitgraph.cgi could show "@RRDPARAM@" on graphs if it was matched by a NULL string (would happen for mailq graphs). * RRD files were not being updated while a status was blue (disabled), even though status messages were received. Changed so that blue logs are passed off to the RRD * The "disk1" graph definition failed to take into account that the numbers logged were already in KB of data. So the axis-label was wrong. parser - we might as well track data when it's there. * The "mailq" RRD handler now finds the queue-length regardless of whether it is before or after the "requests" keyword in the "mailq" or "nmailq" status message. * If the "apache" data collection was specified for a host, but the host had no "http" tests, a bogus http status report was being generated. * Network statistics used a conversion that would overflow on 32-bit systems. Bugfixes (web pages): * Some header/footer files for the snapshot report were missing. * The "info_header" and "info_footer" files were not being used for the "info" column pages. Bugfixes (installation): * Fix file-descriptor leak in the "setup-newfiles" tool used during installation. This could cause "make install" to abort while installing new files, on systems with a low setting for the max. number of simultaneous open files. * Some systems keep libraries in a /lib64 directory - this was not being searched by the configure script. * If Hobbit was built without SSL support and an SSL network test is configured, it will now always fail with a meaningful error message. * If the configure script found SSL- or LDAP-libraries, but these could not link, the build would not disable SSL- and LDAP-support and therefore it failed. If the libraries do not work, disable the support. * The SSL test would link without required network support libraries on some platforms. * The options for overriding SSL- and LDAP-include files did not match the documented name. * AIX systems built with gcc were missing the OSDEF compile- flags. Improvements: * All remnants of Big Brother compatibility have been removed. If you want to stick with the old Big Brother tool, use bbgen. This allowed for some much needed cleaning up of the bbgen code that loaded the status data, especially for the handling of purple status logs. Also, the sending of messages has dropped all support for the Big Brother method of sending "page" messages when a status-message is sent with an alert-color, so the BBPAGE and BBPAGERS settings are no longer used. * The maint.pl script has been removed. A new tool, hobbit-enadis.cgi, replaces this with a native Hobbit tool. If you are upgrading, you should change the ~/server/www/menu/menu_items.js file to point link to "hobbit-enadis.sh" instead of "maint.pl". * The "info" column page now includes a form to disable and enable tests for a single host. If you prefer not to have this on the info page, add the option "--no-disable" to the hobbit-cgi/bb-hostsvc.sh wrapper. * Some logfiles have been moved to the normal log-file directory - /var/log/hobbit: - nkstatus.log (from ~hobbit/server/) - notifications.log (from ~hobbit/data/acks/) - acklog (from ~hobbit/data/acks), also renamed to acknowledge.log * The hobbit-mailack CGI will now find a "delay=DURATION" line in the mail message, and use that as the duration of the acknowledgment. Reports show that there are some types of mail/SMS systems where you cannot modify the message subject. * Paul D. Backer contributed "favicon" images generated from the Hobbit "recent" GIF files. These have been added and are now loaded from the Hobbit web/*_header files, so that browsers supporting this (Mozilla, Firefox) will display a favicon-image in the titlebar or on the page-tab holding the Hobbit webpage. * Two new settings in hobbitserver.cfg can be used to restrict which filesystems are being tracked by Hobbit. The NORRDDISKS / RRDDISKS settings are regular-expressions that the filesystem names are matched against. See the hobbitserver.cfg(5) man-page. * Hobbit now works with RRDtool 1.2.x. Due to a bug in the first 1.2.x releases of RRDtool, you must use at least version 1.2.2 with Hobbit. * A new report-output option lets you save a CSV (comma- separated values) file with the availability data for each host+test in Hobbit. This allows for further processing of the availability data eg. importing it into a spreadsheet. This can be selected from the report request webpage. * It is now possible to define different values for an environment setting in hobbitserver.cfg, depending on a new "--area=..." command-line option for all tools. See hobbitserver.cfg. * Apache 1.x performance data are now graphed correctly, by mapping the "BusyServers/IdleServers" data into the BusyWorkers/IdleWorkers datasets used by Apache 2.0 RRD graphs. * sendmail RRD's for sendmail 8.13+ now tracks the number of "quarantined" messages also. You must delete any existing sendmail.rrd files for this new data item to be tracked. * All RRD-updates now use the RRDtool "--template" option to map values to RRD datasets. This should keep us from updating datasets with wrong values. * Graphs can now get their title from a script, instead of using a static string in hobbitgraph.cfg. This lets you e.g. pick up the graphtitle from the mrtg.cfg. * All CGI's now pick up command-line options from a new configuration file, hobbitcgi.cfg. This is to ease packaging and make sure the CGI's can be updated without losing local configurations. * The debian- and rpm-specific packaging files are now included in the distribution tarfile. * A historical status-log now includes a "Full History" button to go to the history overview. * "irix" is now recognized as operating system. A preliminary vmstat RRD will be generated, but this may change in a future version. "netstat" reports are not yet handled. Changes from 4.0 -> 4.0.2 (10 Apr 2005) --------------------------------------- Bugfixes: * "meta" reports could crash hobbitd. * Parsing of HTTP responses could crash bbtest-net. * Eventlog entries from hosts not in bb-hosts would crash the eventlog CGI reporting tool. * bbgen would crash when FQDN was set to FALSE (not default) and a host was in bb-hosts with the fully-qualified name. * The external rrd-module might launch more than one script simultaneously, which resulted in the status message being lost. * AS/400 disk reports were not handled correctly by the RRD module, since the format was different from what was expected. * bbtest-net would do DNS lookups of hostnames when run with the "--dns=ip" option, causing a severe slowdown. * When viewing historical disk reports from Unix systems, the "Status unchanged in ..." message might be included in the last line of the disk status report, instead of being on a line by itself at the bottom of the page. * "badconn" tags were not being recognized. Eric Schwimmer found the problem and even provided a patch. * On Solaris, the HOME environment variable may not be defined if Hobbit is started from a bootup-script. This caused network tests to stop running. * Historical logs that are saved when a host is disabled or goes purple would not reflect the blue/purple color, but the color of the status before it was disabled or went purple. * A spelling error in the hobbitgraph.cfg file caused the hobbitgraph CGI to crash when trying to generate mailq graphs. * Some BSD systems do not have an atoll() routine, which broke compilation of the hobbitd_larrd module. Switched to use Hobbit's own atoll() for this platform. * Duration-times could be mis-reported on the "info" page, due to some bad math done when building this page. Improvements: * In bb-hosts you can now define a host called ".default." - the tags set for this host will be the default tag settings for the following hosts (until a new .default. host appears). * Merged the bb-infocolumn and bb-larrdcolumn functionality into the service-display CGI, and make bb-hostsvc into a Hobbit-only CGI called hobbitsvc.cgi. The bb-infocolumn and bb-larrdcolumn binaries have been removed. * --alertcolors, --okcolors and --repeat options for hobbitd, hobbitd_alert and bb-infocolumn were moved to settings in hobbitserver.cfg (ALERTCOLORS, OKCOLORS and ALERTREPEAT respectively). * A new generic RRD handler was added for name-colon-value reports. This can be used to handle RRD tracking of reports where the data is in lines of the form "Name: Value". * New "notrends" tag for bb-hosts entries drops the "trends" tag for a host (similar to the "noinfo" tag). * New "DOC:" tag for bb-hosts entries lets you set a documentation URL for each host, or as a default using the ".default." hostname. The --docurl option on bb-infocolumn (which no longer exists) has been dropped. * Included the "hobbitreports.sh" script to show how reports can be pre-generated by a cron-job. * New "bb-datepage.cgi" CGI makes it easy to select daily/weekly/monthly pre-generated reports. * The hobbitgraph CGI now allows you to show weekday- and month-names in your local language, instead of forcing it to english. Note that the fonts used may not include all non-ASCII characters. * CPU-reports from the bb-xsnmp.pl script should now be handled correctly by the RRD module. * CPU-reports for z/VM should now be handled correctly by the RRD module. * CPU-, disk- and memory-reports from the nwstats2bb script are now handled by the RRD module. Changes from 4.0 -> 4.0.1 (31 Mar 2005) --------------------------------------- Bugfixes: * Compiling Hobbit on some platforms would fail due to a couple of missing standard include files not being pulled in. Changes from RC-6 -> 4.0 (30 Mar 2005) -------------------------------------- Bugfixes: * DOWNTIME handling was broken in some cases. While fixing this, it was also enhanced to allow multiple day-specifications in a single time-specification, e.g. "60:2200:2330" is now valid way of defining downtime between 10 PM and 11:30 PM on Saturday and Sunday. * If bbtest-net was run with "--dns=ip" option to disable DNS lookups, a DHCP host could not be tested. Changed so that hosts with a "0.0.0.0" IP-address always do a DNS lookup to determine the IP-address for network tests. * Links in the RSS file were missing a trailing slash. * Disk- and CPU-reports from AS/400 based systems were not handled properly by the RRD parser. Note that this change means the PCRE library is now needed for the hobbitd_larrd module. * The default hobbitlaunch.cfg had the environment path for the bbcombotest task hard-coded, instead of picking up the configuration value. * Back out the cookie-based filtering of hosts in the Enable/Disable (maint.pl) script - it breaks in too many places. Need further investigation. * Alert rules with the STOP and UNMATCHED keywords now flag this on the info-page alert table. * If a host was removed from the bb-hosts file, and hobbitd reloaded the file before a "drop" command was sent, then it was impossible to get rid of the internal state stored for the host without restarting Hobbit. * Disabled status-logs could go purple while still being disabled, this would show up as the status alternating between blue and purple. Improvements: * If invoking fping failed, the error message was lost and only a "failed with exit code 99" error was reported. Changed so that the real cause of the error is reported in the bbtest-net log. * An "mrtg" definition was added to hobbitgraph.cfg, to handle MRTG generated RRD files. If MRTG is configured to save RRD files directly to the Hobbit rrd-directory, these graphs can be handled as if they were native Hobbit graphs. Wrote up hobbit-mrtg.html to describe this setup. * When hosts are removed from the bb-hosts file, all in-memory data stored about the host is dropped automatically, so e.g. alerts will no longer be sent out. Data stored on disk is unaffected; this only gets removed when a "drop" command is issued. * Time-specifications now accept multiple week-days, e.g. you can define a host that is down Sunday and Monday 20:00->23:00 with "DOWNTIME=01:2000:2300". This applies globally, so also applies to alert-specifications and other time-related settings using the NKTIME syntax. It will also complain rather loudly in the logfile is an invalid time-specification is found in one of the configuration files. * hobbit-mailack added to the HTML man-page index and to the overview description in hobbit(7). * A new "trimhistory" tool was added, allowing you to trim the size of history logs and historical status-log collections. Changes from RC-5 -> RC-6 ------------------------- Bugfixes: * Recovery messages were sent to all recipients, regardless of any color-restrictions on the alerts they received. Changed this so that recipients only get recovery messages for the alerts they received. * The "NOALERT" option was not applied when multiple recipients were listed in one rule. * bbtest-net now performs a syntax check on all URL's before adding them to the test queue. This should stop it from crashing in case you happen to enter a syntactically invalid URL in your bb-hosts file. * The acknowledgment log on the BB2 page could mix up data from different entries in the log. * The default mail-utility used to send out e-mail alerts is now defined per OS. Solaris and HP-UX use "mailx", others use "mail". * Client tests no longer go purple when a host has been disabled. * bb-larrdcolumn no longer dumps core if there are no RRD files. * With the right input, bb-larrdcolumn could use massive amounts of memory and eventually terminate with an out-of-memory error. * A memory leak in hobbitd_larrd handling of "disk" reports was fixed. * bb-infocolumn now accepts a "--repeat=N" setting to inform it of the default alert-repeat interval. If you use --repeat with hobbitd_alert, you should copy that option to bb-infocolumn to make it generate correct info-column pages. * If bbgen cannot create output files or directories, the underlying error is now reported in the error message. * The "merge-lines" and "merge-sects" tools used during installation could crash due to a missing initialization of a pointer. Improvements: * It is now possible to make Hobbit re-open all logfiles, e.g. after a log rotate. Use "server/hobbit.sh rotate". * The hobbit-mailack tool now recognizes the BB format of alert message responses, i.e. putting "delay" and "msg" in the subject line will work. * bbcmd defaults to running /bin/sh if no command is given * hobbitd_larrd now logs the sender IP of a message that results in an error. * A network test definition for SpamAssassin's spamd daemon was added. * The default web/*header files now refer to a HOBBITLOGO setting for the HTML used in the upper-left corner of all pages. The default is just the text "Hobbit", but you can easily replace this with e.g. a company logo by changing this setting in hobbitserver.cfg. * The Hobbit daemon's "hobbitdboard", "hobbitdxboard" and "hobbitdlist" commands now support a set of primitive filtering techniques to limit the number of hosts returned. * maint.pl uses the new Hobbit daemon filtering and a cookie defined by the header in webpages to show only the hosts found on the page where it was called from, or just a single host. * Hobbit should now compile on Mac OS X (Darwin). * The info- and graph-column names are now defined globally as environment variables "INFOCOLUMN" and "LARRDCOLUMN", respectively. This eliminates the need to have them listed as options for multiple commands. Consequently, the --larrd and --info options have been dropped. * Systems with the necessary libraries (RRDtool, PCRE, OpenSSL etc) in unusual locations can now specify the location of these as parameters to the configure script, overriding the auto-detect routine. See "./configure --help" for details. * A definition for the "disk1" graph in LARRD was added, this shows the actual use of filesystems instead of the normal percentage. Changes from RC-4 -> RC-5 ------------------------- Bugfixes: * Very large status- or data-messages could overflow the shared memory segment used for communication between hobbitd and the worker modules. This would cause hobbitd to crash. Such messages are now truncated before being passed off to worker modules. * hobbitd_alert no longer crashes when trying to send a message. * Recovery messages were sent, even when no alert message had been sent. This caused unexpected "green" messages. * The router dependency "route" tag handling was broken. Improvements: * The "starthobbit.sh" script now refuses to start Hobbit if it is already running. * The "starthobbit.sh" script was renamed to just "hobbit.sh". It now also supports a "reload" command that causes hobbitd to reload the bb-hosts file. * The bb-hist CGI now supports the NAME tag for naming hosts. * The history CGI's showed the Host- and service-names twice when in Hobbit mode. Once is enough. * A "NOALERT" setting in hobbit-alerts.cfg was implemented, so it is easier to define recipients who only get notice-messages and not alerts. * The input parameter check for CGI scripts was relaxed, so that special characters are permitted - e.g. when passing a custom hostname to a CGI. Since we do not use any shell scripts in CGI handling, this should not cause any security problem. Building Hobbit: * The /opt/sfw directory is now searched for libraries (Solaris). * The order of libssl and libcrypto has been swapped, to avoid linker problems on some platforms. Changes from RC-3 -> RC-4 ------------------------- Bugfixes: * Loading the bb-services file no longer causes bbtest-net, hobbitd_larrd et al to crash. * The alert configuration loader was fixed, so that recipient criteria are applied correctly. * hobbitd_alert handling of "recovered" status messages was slightly broken. This was probably the cause of the unexpected "green" alerts that some have reported. * SCRIPT recipients can now have a "@" in their names without being silently treated as MAIL recipients. * An acknowledge message is now cleared when the status changes to an OK color (defined by the --okcolors option). Previously it would have to go "green" before the ack was cleared. * Acked and disabled statuses can not go purple while the acknowledge or disable is valid. This was causing brief flickers of purple for tests that were disabled for more than 30 minutes. * maint.pl "combo" message support was dropped. This was causing runtime warnings, and it has never been possible to send enable or disable messages inside combo's (neither with Hobbit nor BB). Building Hobbit: * bb-infocolumn should build without problems again. * The "configure" script now also looks in /opt/csw for tools and libraries (for Solaris/x86) * An OpenBSD Makefile was contributed. * The gcc option "-Wl,--rpath" is now used when linking the tools on Linux and *BSD. This should resolve a lot of the issues with runtime libraries that cannot be found. * "configure" now looks for your perl utility, and adjusts the maint.pl script accordingly. * HP-UX does not have an atoll() routine. So a simple implementation of this routine was added. Configuration file changes: * hobbitlaunch.cfg now supports a DISABLED keyword to shut off unwanted tasks. This permits upgrading without having to re-disable stuff. * All commands in hobbitserver.cfg are now quoted, so it can be sourced by the CGI scripts without causing errors. Note that this is NOT automatically changed in an existing configuration file. Improvements: * The detailed status display now lets you define what graphs should be split onto multiple graph images (the "--multigraphs" option for bb-hostsvc.cgi and hobbitd_filestore). Currently the "disk", "inode" and "qtree" graphs are handled this way. * The detailed status display now includes a line showing how long an acknowledgment is valid. This is configurable via the ACKUNTILMSG setting in hobbitserver.cfg. * A new "notify" message is supported as part of the Hobbit protocol. This takes a normal hostname+testname paramater, plus a text message; this is sent out as an informational message using the hobbit-alerts.cfg rules to determine recipients. This replaces the BB "notify-admin" recipient with a more fine-grained and configurable system. Currently used by maint.pl when enabling and disabling tests. * Alert scripts now receive a CFID environment variable with the linenumber of the hobbit-alerts.cfg file that caused this alert to go out. * A new tool - hobbit-mailack - was added. If setup to run from e.g. the Hobbit users' .procmailrc file, you can acknowledge alerts by responding to an alert email. * Temperature reports now accept additional text in parenthesis without being confused. Changes from RC-2 -> RC-3 ------------------------- Configuration file changes: * The bb-services file format was changed slightly. Instead of "service foo" to define a service, it is now "[foo]". Existing files will be converted automatically by "make install". * The name of the "conn" column (for ping-tests) is used throughout Hobbit, and had to be set in multiple locations. Changed all of them to use the setting from the PINGCOLUMN environment variable, and added this to hobbitserver.cfg. * The --purple-conn option was dropped from hobbitd. It should be removed from hobbitlaunch.cfg. * The --ping=COLUMNNAME option for bbtest-net should not be used any more. "--ping" enables the ping tests, the name of the column is taken from the PINGCOLUMN variable. * The GRAPHS setting in hobbitserver.cfg no longer needs to have the simple TCP tests defined. These are automatically picked up from the bb-services file. Bugfixes: * hobbitd no longer crashes, if the MACHINE name from hobbitserver.cfg is not listed in bb-hosts. Thanks to Stephen Beaudry for helping me track down this bug. * If hobbitd crashed, then hobbitlaunch would attempt to restart it immediately. Added a 5 second delay, so that there's time for the OS to clean up any open sockets, files etc that might prevent a restart from working. * The "disk" RRD handler could be confused by reports from a Unix server, and mistake it for a report from a Windows server. This caused the report to try and store data in an RRD file with an invalid filename, so no graph-data was being stored. * The "cpu" and "disk" RRD handlers were enhanced to support reports from the "filerstats2bb" script for monitoring NetApp systems. The disk-handler also supports the "inode" and "qtree" reports from the same script. * bb-services was overwritten by a "make install". This wiped out custom network test definitions. * bbnet would crash if you happened to define a "http" or "https" test instead of using a full URL. * bbnet was mis-calculating the size of the URL used for th apache-test. This could cause it to overflow a buffer and crash. * hobbitd would ignore the BBPORT setting and always default to using port 1984. * Portability problems on HP-UX 11 should be resolved. From reports it appears that building RRDtool on HP-UX 11 is somewhat of a challenge; however, the core library is all that Hobbit needs, so build-problems with the Perl modules can be ignored as far as Hobbit is concerned. * hobbitd_alert could not handle multiple recipients for scripts, and mistakenly assumed all recipients with a "@" were for e-mail recipients. * Alert messages no longer include the " * bb-xsnmp.pl Version: 1.78 */ p = strstr(msg, "CPU Usage="); if (p) { p += strlen("CPU Usage="); gotload = 1; load = atoi(p); } goto done_parsing; } else if (strstr(msg, "z/VM") || strstr(msg, "VSE/ESA") || strstr(msg, "z/VSE") || strstr(msg, "z/OS")) { /* z/VM cpu message. Looks like this, from Rich Smrcina (client config mode): * green 5 Apr 2005 20:07:34 CPU Utilization 7% z/VM Version 4 Release 4.0, service level 0402 (32-bit) AVGPROC-007% 01 * VSE/ESA or z/VSE cpu message. * VSE/ESA 2.7.2 cr IPLed on ... * or * z/VSE 3.1.1 cr IPLed on ... * In server (centralized) config mode or for z/OS (which is centralized config only) * the operating system name is part of the message (as in the tests above). */ int ovector[30]; char w[100]; int res; if (zVM_exp == NULL) { const char *errmsg = NULL; int errofs = 0; zVM_exp = pcre_compile(".* CPU Utilization *([0-9]+)%", PCRE_CASELESS, &errmsg, &errofs, NULL); } res = pcre_exec(zVM_exp, NULL, msg, strlen(msg), 0, 0, ovector, (sizeof(ovector)/sizeof(int))); if (res >= 0) { /* We have a match - pick up the data. */ *w = '\0'; if (res > 0) pcre_copy_substring(msg, ovector, res, 1, w, sizeof(w)); if (strlen(w)) { load = atoi(w); gotload = 1; } } goto done_parsing; } eoln = strchr(msg, '\n'); if (eoln) *eoln = '\0'; p = strstr(msg, "up: "); if (!p) p = strstr(msg, "Uptime:"); /* Netapp filerstats2bb script */ if (!p) p = strstr(msg, "uptime:"); if (p) { /* First line of cpu report, contains "up: 159 days, 1 users, 169 procs, load=21" */ p = strchr(p, ','); if (p) { gotusers = (sscanf(p, ", %d users", &users) == 1); p = strchr(p+1, ','); } if (p) { gotprocs = (sscanf(p, ", %d procs", &procs) == 1); p = strchr(p+1, ','); } /* * Load can be either * - "load=xx%" (Windows) * - "load=xx.xx" (Unix, DISPREALLOADAVG=TRUE) * - "load=xx" (Unix, DISPREALLOADAVG=FALSE) * * We want the load in percent (Windows), or LA*100 (Unix). */ p = strstr(msg, "load="); if (p) { p += 5; if (strchr(p, '%')) { gotload = 1; load = atoi(p); } else if (strchr(p, '.')) { gotload = 1; load = 100*atoi(p); /* Find the decimal part, and cut off at 2 decimals */ p = strchr(p, '.'); if (strlen(p) > 3) *(p+3) = '\0'; load += atoi(p+1); } else { gotload = 1; load = atoi(p); } } } else { /* * No "uptime" in message - could be from an AS/400. They look like this: * green March 21, 2005 12:33:24 PM EST deltacdc 108 users 45525 jobs(126 batch,0 waiting for message), load=26% */ int ovector[30]; char w[100]; int res; if (as400_exp == NULL) { const char *errmsg = NULL; int errofs = 0; as400_exp = pcre_compile(".* ([0-9]+) users ([0-9]+) jobs.* load=([0-9]+)\\%", PCRE_CASELESS, &errmsg, &errofs, NULL); } res = pcre_exec(as400_exp, NULL, msg, strlen(msg), 0, 0, ovector, (sizeof(ovector)/sizeof(int))); if (res >= 0) { /* We have a match - pick up the AS/400 data. */ *w = '\0'; if (res > 0) pcre_copy_substring(msg, ovector, res, 1, w, sizeof(w)); if (strlen(w)) { users = atoi(w); gotusers = 1; } *w = '\0'; if (res > 0) pcre_copy_substring(msg, ovector, res, 3, w, sizeof(w)); if (strlen(w)) { load = atoi(w); gotload = 1; } } } done_parsing: if (eoln) *eoln = '\n'; p = strstr(msg, "System clock is "); if (p) { if (sscanf(p, "System clock is %d seconds off", &clockdiff) == 1) gotclock = 1; } if (!gotload) { /* See if it's a report from the ciscocpu.pl script. */ p = strstr(msg, "
CPU 5 min average:"); if (p) { /* It reports in % cpu utilization */ p = strchr(p, ':'); load = atoi(p+1); gotload = 1; } } if (gotload) { setupfn("%s.rrd", "la"); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, load); create_and_update_rrd(hostname, testname, classname, pagepaths, la_params, la_tpl); } if (gotprocs) { setupfn("%s.rrd", "procs"); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, procs); create_and_update_rrd(hostname, testname, classname, pagepaths, la_params, la_tpl); } if (gotusers) { setupfn("%s.rrd", "users"); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, users); create_and_update_rrd(hostname, testname, classname, pagepaths, la_params, la_tpl); } if (gotclock) { setupfn("%s.rrd", "clock"); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, clockdiff); create_and_update_rrd(hostname, testname, classname, pagepaths, clock_params, clock_tpl); } /* * If we have run for less than 6 minutes, drop the memory updates here. * We want to be sure not to use memory statistics from the CPU report * if there is a memory add-on sending a separate memory statistics */ if ((now - starttime) < 360) return 0; if (!memhosts_init || (xtreeFind(memhosts, hostname) == xtreeEnd(memhosts))) { /* Pick up memory statistics */ int found, overflow, realuse, swapuse; long long phystotal, physavail, pagetotal, pageavail; found = overflow = realuse = swapuse = 0; phystotal = physavail = pagetotal = pageavail = 0; p = strstr(msg, "Total Physical memory:"); if (p) { phystotal = str2ll(strchr(p, ':') + 1, NULL); if (phystotal != LONG_MAX) found++; else overflow++; } if (found == 1) { p = strstr(msg, "Available Physical memory:"); if (p) { physavail = str2ll(strchr(p, ':') + 1, NULL); if (physavail != LONG_MAX) found++; else overflow++; } } if (found == 2) { p = strstr(msg, "Total PageFile size:"); if (p) { pagetotal = str2ll(strchr(p, ':') + 1, NULL); if (pagetotal != LONG_MAX) found++; else overflow++; } } if (found == 3) { p = strstr(msg, "Available PageFile size:"); if (p) { pageavail = str2ll(strchr(p, ':') + 1, NULL); if (pageavail != LONG_MAX) found++; else overflow++; } } if (found == 4) { if (!phystotal || !pagetotal) { errprintf("Host %s cpu report had 0 total physical/pagefile memory listed\n", hostname); return 0; } phystotal = phystotal / 100; pagetotal = pagetotal / 100; realuse = 100 - (physavail / phystotal); swapuse = 100 - (pageavail / pagetotal); do_memory_rrd_update(tstamp, hostname, testname, classname, pagepaths, realuse, swapuse, -1); } else if (overflow) { errprintf("Host %s cpu report overflows in memory usage calculation\n", hostname); } } return 0; } xymon-4.3.28/xymond/rrd/do_external.c0000664000076400007640000001127512000025440017760 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* Copyright (C) 2004-2009 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char external_rcsid[] = "$Id: do_external.c 7026 2012-07-13 14:05:20Z storner $"; int do_external_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { pid_t childpid; dbgprintf("-> do_external(%s, %s)\n", hostname, testname); childpid = fork(); if (childpid == 0) { FILE *fd; char fn[PATH_MAX]; enum { R_DEFS, R_FN, R_DATA, R_NEXT } pstate; FILE *extfd; char extcmd[2*PATH_MAX]; strbuffer_t *inbuf; char *p; char **params = NULL; int paridx = 0; pid_t mypid = getpid(); MEMDEFINE(fn); MEMDEFINE(extcmd); snprintf(fn, sizeof(fn), "%s/rrd_msg_%d", xgetenv("XYMONTMP"), (int) getpid()); dbgprintf("%09d : Saving msg to file %s\n", (int)mypid, fn); fd = fopen(fn, "w"); if (fd == NULL) { errprintf("Cannot create temp file %s\n", fn); exit(1); } if (fwrite(msg, strlen(msg), 1, fd) != 1) { errprintf("Error writing to file %s: %s\n", fn, strerror(errno)); exit(1) ; } if (fclose(fd)) errprintf("Error closing file %s: %s\n", fn, strerror(errno)); /* * Disable the RRD update cache. * We cannot use the cache, because this child * process terminates without flushing the cache, * and it cannot feed the update-data back to the * parent process which owns the cache. So using * an external handler means the updates will be * sync'ed to disk immediately. * * NB: It is OK to do this now and not re-enable it, * since we're running in the external helper * child process - so this only affects the current * update. * * Thanks to Graham Nayler for the analysis. */ use_rrd_cache = 0; inbuf = newstrbuffer(0); /* Now call the external helper */ snprintf(extcmd, sizeof(extcmd), "%s %s %s %s", exthandler, hostname, testname, fn); dbgprintf("%09d : Calling helper script %s\n", (int)mypid, extcmd); extfd = popen(extcmd, "r"); if (extfd) { pstate = R_DEFS; initfgets(extfd); while (unlimfgets(inbuf, extfd)) { p = strchr(STRBUF(inbuf), '\n'); if (p) *p = '\0'; dbgprintf("%09d : Helper input '%s'\n", (int)mypid, STRBUF(inbuf)); if (STRBUFLEN(inbuf) == 0) continue; if (pstate == R_NEXT) { /* After doing one set of data, allow script to re-use the same DS defs */ if (strncasecmp(STRBUF(inbuf), "DS:", 3) == 0) { /* New DS definitions, scratch the old ones */ if (params) { for (paridx=0; (params[paridx] != NULL); paridx++) xfree(params[paridx]); xfree(params); params = NULL; } pstate = R_DEFS; } else pstate = R_FN; } switch (pstate) { case R_DEFS: if (params == NULL) { params = (char **)calloc(1, sizeof(char *)); paridx = 0; } if (strncasecmp(STRBUF(inbuf), "DS:", 3) == 0) { /* Dataset definition */ params[paridx] = strdup(STRBUF(inbuf)); paridx++; params = (char **)realloc(params, (1 + paridx)*sizeof(char *)); params[paridx] = NULL; break; } else { /* No more DS defs */ pstate = R_FN; } /* Fall through */ case R_FN: setupfn("%s", STRBUF(inbuf)); pstate = R_DATA; break; case R_DATA: snprintf(rrdvalues, sizeof(rrdvalues)-1, "%d:%s", (int)tstamp, STRBUF(inbuf)); rrdvalues[sizeof(rrdvalues)-1] = '\0'; create_and_update_rrd(hostname, testname, classname, pagepaths, params, NULL); pstate = R_NEXT; break; case R_NEXT: /* Should not happen */ break; } } pclose(extfd); } else { errprintf("Pipe open of RRD handler failed: %s\n", strerror(errno)); } if (params) { for (paridx=0; (params[paridx] != NULL); paridx++) xfree(params[paridx]); xfree(params); } dbgprintf("%09d : Unlinking temp file\n", (int)mypid); unlink(fn); freestrbuffer(inbuf); exit(0); } else if (childpid > 0) { /* Parent continues */ } else { errprintf("Fork failed in RRD handler: %s\n", strerror(errno)); } dbgprintf("<- do_external(%s, %s)\n", hostname, testname); return 0; } xymon-4.3.28/xymond/rrd/do_fd_lib.c0000664000076400007640000001127111535424634017375 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* Copyright (C) 2004-2006 Francesco Duranti */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ /* Some function used by do_netapp.pl do_beastat.pl and do_dbcheck.pl */ static char fd_lib_rcs[] = "$Id: do_fd_lib.c 6648 2011-03-08 13:05:32Z storner $"; unsigned long get_kb_data(char *msg,char *search) { char *p,*r,*eoln; unsigned long value=0; /* go to the start of the message */ p = strstr(msg, search); if (p) { /* set the endofline */ eoln = strchr(p, '\n'); if (eoln) *eoln = '\0'; /* search for a ":" or "=" */ if ((r = strchr(p,':')) == NULL) r=strchr(p,'='); // dbgprintf("1getdata %s\n",p); // dbgprintf("2getdata %s\n",r); if (r) { r++; value=atol(r); /* Convert to KB if there's a modifier after the numbers */ r += strspn(r, "0123456789. "); if (*r == 'M') value *= 1024; else if (*r == 'G') value *= (1024*1024); else if (*r == 'T') value *= (1024*1024*1024); } /* reset the endofline */ if (eoln) *eoln = '\n'; } return value; } unsigned long get_long_data(char *msg,char *search) { char *p,*r,*eoln; unsigned long value=0; /* go to the start of the message */ p = strstr(msg, search); if (p) { /* set the endofline */ eoln = strchr(p, '\n'); if (eoln) *eoln = '\0'; /* search for a ":" or "=" */ if ((r = strchr(p, ':')) == NULL) r=strchr(p, '='); // dbgprintf("1getdata %s\n",p); // dbgprintf("2getdata %s\n",r); if (r) { value=atol(++r); } /* reset the endofline */ if (eoln) *eoln = '\n'; } return value; } double get_double_data(char *msg,char *search) { char *p,*r,*eoln; double value=0; /* go to the start of the message */ p = strstr(msg, search); if (p) { /* set the endofline */ eoln = strchr(p, '\n'); if (eoln) *eoln = '\0'; /* search for a ":" or "=" */ if ((r = strchr(p,':')) == NULL) r=strchr(p,'='); // dbgprintf("1getdata %s\n",p); // dbgprintf("2getdata %s\n",r); if (r) value=atof(++r); /* reset the endofline */ if (eoln) *eoln = '\n'; } return value; } int get_int_data(char *msg,char *search) { char *p,*r,*eoln; int value=0; /* go to the start of the message */ p = strstr(msg, search); if (p) { /* set the endofline */ eoln = strchr(p, '\n'); if (eoln) *eoln = '\0'; /* search for a ":" or "=" */ if ((r = strchr(p,':')) == NULL) r=strchr(p,'='); // dbgprintf("\n1getdata\n%s\n",p); // dbgprintf("\n2getdata\n%s\n",r); if (r) value=atoi(++r); /* reset the endofline */ if (eoln) *eoln = '\n'; } return value; } typedef struct sectlist_t { char *sname; char *sdata; struct sectlist_t *next; } sectlist_t; sectlist_t *sections = NULL; void splitmsg(char *clientdata) { char *cursection, *nextsection; char *sectname, *sectdata; /* Free the old list */ if (sections) { sectlist_t *swalk, *stmp; swalk = sections; while (swalk) { stmp = swalk; swalk = swalk->next; xfree(stmp); } sections = NULL; } if (clientdata == NULL) { errprintf("Got a NULL client data message\n"); return; } /* Find the start of the first section */ if (*clientdata == '[') cursection = clientdata; else { cursection = strstr(clientdata, "\n["); if (cursection) cursection++; } while (cursection) { sectlist_t *newsect = (sectlist_t *)malloc(sizeof(sectlist_t)); /* Find end of this section (i.e. start of the next section, if any) */ nextsection = strstr(cursection, "\n["); if (nextsection) { *nextsection = '\0'; nextsection++; } /* Pick out the section name and data */ sectname = cursection+1; sectdata = sectname + strcspn(sectname, "]\n"); *sectdata = '\0'; sectdata++; if (*sectdata == '\n') sectdata++; /* Save the pointers in the list */ newsect->sname = sectname; newsect->sdata = sectdata; newsect->next = sections; sections = newsect; /* Next section, please */ cursection = nextsection; } } char *getdata(char *sectionname) { sectlist_t *swalk; for (swalk = sections; (swalk && strcmp(swalk->sname, sectionname)); swalk = swalk->next) ; if (swalk) return swalk->sdata; return NULL; } xymon-4.3.28/xymond/rrd/do_paging.c0000664000076400007640000000556612000025440017411 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* This module handles "paging" messages. */ /* */ /* Copyright (C) 2006-2011 Henrik Storner */ /* Copyright (C) 2007-2008 Rich Smrcina */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char paging_rcsid[] = "$Id: do_paging.c 7026 2012-07-13 14:05:20Z storner $"; static char *paging_params[] = { "DS:rate:GAUGE:600:0:U", NULL }; static void *paging_tpl = NULL; int do_paging_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { char *pr; char *fn = NULL; int pagerate, xstore, migrate; if (paging_tpl == NULL) paging_tpl = setup_template(paging_params); pr=(strstr(msg, "Rate")); if (pr) { pr += 5; sscanf(pr, "%d per", &pagerate); setupfn("paging.pagerate.rrd", fn); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, pagerate); create_and_update_rrd(hostname, testname, classname, pagepaths, paging_params, paging_tpl); if (strstr(msg, "z/VM")) { /* Additional handling for z/VM */ pr=strstr(msg,"XSTORE-"); if (pr) { /* Extract values if we find XSTORE in results of 'IND' command */ pr += 7; /* Add 7 to get past literal (XSTORE). */ sscanf(pr, "%d/SEC", &xstore); pr=strstr(msg,"MIGRATE-"); pr += 8; /* Add 8 to get past literal (MIGRATE). */ sscanf(pr, "%d/SEC", &migrate); setupfn("paging.xstore.rrd", fn); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, xstore); create_and_update_rrd(hostname, testname, classname, pagepaths, paging_params, paging_tpl); setupfn("paging.migrate.rrd", fn); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, migrate); create_and_update_rrd(hostname, testname, classname, pagepaths, paging_params, paging_tpl); } } } return 0; } xymon-4.3.28/xymond/rrd/do_iishealth.c0000664000076400007640000000457012000025440020110 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char iishealth_rcsid[] = "$Id: do_iishealth.c 7026 2012-07-13 14:05:20Z storner $"; int do_iishealth_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *iishealth_params[] = { "DS:realmempct:GAUGE:600:0:U", NULL }; static void *iishealth_tpl = NULL; char *bol, *eoln, *tok; if (iishealth_tpl == NULL) iishealth_tpl = setup_template(iishealth_params); bol = strchr(msg, '\n'); if (bol) bol++; else return 0; while (bol && *bol) { eoln = strchr(bol, '\n'); if (eoln) *eoln = '\0'; tok = strtok(bol, " \t\r\n"); /* Get color marker */ if (tok) tok = strtok(NULL, " \t\r\n"); /* Get keyword */ if (tok) { int havedata = 0; if (strcmp(tok, "Connections:") == 0) { tok = strtok(NULL, " \t\r\n"); if (tok == NULL) continue; setupfn2("%s.%s.rrd", "iishealth", "connections"); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%lu", (int)tstamp, atol(tok)); havedata = 1; } else if (strcmp(tok, "RequestsQueued:") == 0) { tok = strtok(NULL, " \t\r\n"); if (tok == NULL) continue; setupfn2("%s.%s.rrd", "iishealth", "requestqueued"); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%lu", (int)tstamp, atol(tok)); havedata = 1; } else if (strcmp(tok, "Sessions:") == 0) { tok = strtok(NULL, " \t\r\n"); if (tok == NULL) continue; setupfn2("%s.%s.rrd", "iishealth", "sessions"); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%lu", (int)tstamp, atol(tok)); havedata = 1; } if (havedata) create_and_update_rrd(hostname, testname, classname, pagepaths, iishealth_params, iishealth_tpl); } bol = (eoln ? eoln+1 : NULL); } return 0; } xymon-4.3.28/xymond/rrd/do_counts.c0000664000076400007640000000504512000025440017447 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* This module handles various "counts" messages. */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char counts_rcsid[] = "$Id: do_counts.c 7026 2012-07-13 14:05:20Z storner $"; static int do_one_counts_rrd(char *counttype, char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp, char *params[], char *tpl) { char *boln, *eoln; boln = strchr(msg, '\n'); if (boln) boln++; while (boln && *boln) { char *fn, *countstr = NULL; eoln = strchr(boln, '\n'); if (eoln) *eoln = '\0'; fn = strtok(boln, ":"); if (fn) countstr = strtok(NULL, ":"); if (fn && countstr) { char *p; for (p=strchr(fn, '/'); (p); p = strchr(p, '/')) *p = ','; setupfn2("%s.%s.rrd", counttype, fn); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%s", (int)tstamp, countstr); create_and_update_rrd(hostname, testname, classname, pagepaths, params, tpl); } boln = (eoln ? eoln+1 : NULL); } return 0; } static char *counts_params[] = { "DS:count:GAUGE:600:0:U", NULL }; static void *counts_tpl = NULL; static char *derive_params[] = { "DS:count:DERIVE:600:0:U", NULL }; static void *derive_tpl = NULL; int do_counts_rrd(char *counttype, char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { if (counts_tpl == NULL) counts_tpl = setup_template(counts_params); return do_one_counts_rrd(counttype, hostname, testname, classname, pagepaths, msg, tstamp, counts_params, counts_tpl); } int do_derives_rrd(char *counttype, char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { if (derive_tpl == NULL) derive_tpl = setup_template(derive_params); return do_one_counts_rrd(counttype, hostname, testname, classname, pagepaths, msg, tstamp, derive_params, derive_tpl); } xymon-4.3.28/xymond/rrd/do_xymonnet.c0000664000076400007640000000305412000025440020013 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char xymonnet_rcsid[] = "$Id: do_xymonnet.c 7026 2012-07-13 14:05:20Z storner $"; int do_xymonnet_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *xymonnet_params[] = { "DS:runtime:GAUGE:600:0:U", NULL }; static void *xymonnet_tpl = NULL; char *p; float runtime; if (xymonnet_tpl == NULL) xymonnet_tpl = setup_template(xymonnet_params); p = strstr(msg, "TIME TOTAL"); if (p && (sscanf(p, "TIME TOTAL %f", &runtime) == 1)) { if (strcmp("xymonnet", testname) != 0) { setupfn2("%s.%s.rrd", "xymonnet", testname); } else { setupfn("%s.rrd", "xymonnet"); } snprintf(rrdvalues, sizeof(rrdvalues), "%d:%.2f", (int) tstamp, runtime); return create_and_update_rrd(hostname, testname, classname, pagepaths, xymonnet_params, xymonnet_tpl); } return 0; } xymon-4.3.28/xymond/rrd/do_snmpmib.c0000664000076400007640000001623412003234710017610 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char snmpmib_rcsid[] = "$Id: do_snmpmib.c 7105 2012-07-23 11:47:20Z storner $"; static time_t snmp_nextreload = 0; typedef struct snmpmib_param_t { char *name; char **valnames; char **dsdefs; rrdtpldata_t *tpl; int valcount; } snmpmib_param_t; static void * snmpmib_paramtree; int is_snmpmib_rrd(char *testname) { time_t now = getcurrenttime(NULL); xtreePos_t handle; mibdef_t *mib; oidset_t *swalk; int i; if (now > snmp_nextreload) { int updated = readmibs(NULL, 0); if (updated) { if (snmp_nextreload > 0) { /* Flush the old params and templates */ snmpmib_param_t *walk; int i; for (handle = xtreeFirst(snmpmib_paramtree); (handle != xtreeEnd(snmpmib_paramtree)); handle = xtreeNext(snmpmib_paramtree, handle)) { walk = (snmpmib_param_t *)xtreeData(snmpmib_paramtree, handle); if (walk->valnames) xfree(walk->valnames); for (i=0; (i < walk->valcount); i++) xfree(walk->dsdefs[i]); if (walk->dsdefs) xfree(walk->dsdefs); /* * We don't free the "tpl" data here. We cannot do it, because * there are probably cached RRD updates waiting to use this * template - so freeing it would cause all sorts of bad behaviour. * It DOES cause a memory leak ... */ xfree(walk); } xtreeDestroy(snmpmib_paramtree); } snmpmib_paramtree = xtreeNew(strcasecmp); } snmp_nextreload = now + 600; } mib = find_mib(testname); if (!mib) return 0; handle = xtreeFind(snmpmib_paramtree, mib->mibname); if (handle == xtreeEnd(snmpmib_paramtree)) { snmpmib_param_t *newitem = (snmpmib_param_t *)calloc(1, sizeof(snmpmib_param_t)); int totalvars; newitem->name = mib->mibname; for (swalk = mib->oidlisthead, totalvars = 1; (swalk); swalk = swalk->next) totalvars += swalk->oidcount; newitem->valnames = (char **)calloc(totalvars, sizeof(char *)); newitem->dsdefs = (char **)calloc(totalvars, sizeof(char *)); for (swalk = mib->oidlisthead, newitem->valcount = 0; (swalk); swalk = swalk->next) { for (i=0; (i <= swalk->oidcount); i++) { char *datatypestr = NULL, *minimumstr = NULL; if (swalk->oids[i].rrdtype == RRD_NOTRACK) continue; switch (swalk->oids[i].rrdtype) { case RRD_TRACK_GAUGE: datatypestr = "GAUGE"; minimumstr = "U"; break; case RRD_TRACK_ABSOLUTE: datatypestr = "ABSOLUTE"; minimumstr = "U"; break; case RRD_TRACK_COUNTER: datatypestr = "COUNTER"; minimumstr = "0"; break; case RRD_TRACK_DERIVE: datatypestr = "DERIVE"; minimumstr = "0"; break; case RRD_NOTRACK: break; } if (!datatypestr || !minimumstr) continue; newitem->valnames[newitem->valcount] = swalk->oids[i].dsname; newitem->dsdefs[newitem->valcount] = (char *)malloc(strlen(swalk->oids[i].dsname) + 20); sprintf(newitem->dsdefs[newitem->valcount], "DS:%s:%s:600:%s:U", swalk->oids[i].dsname, datatypestr, minimumstr); newitem->valcount++; } } newitem->valnames[newitem->valcount] = NULL; newitem->dsdefs[newitem->valcount] = NULL; newitem->tpl = setup_template(newitem->dsdefs); xtreeAdd(snmpmib_paramtree, newitem->name, newitem); } return 1; } static void do_simple_snmpmib(char *hostname, char *testname, char *classname, char *pagepaths, char *fnkey, char *msg, time_t tstamp, snmpmib_param_t *params, int *pollinterval) { char *bol, *eoln; char **values; int valcount = 0; values = (char **)calloc(params->valcount, sizeof(char *)); bol = msg; while (bol) { eoln = strchr(bol, '\n'); if (eoln) *eoln = '\0'; bol += strspn(bol, " \t"); if (*bol == '\0') { /* Nothing */ } else if (strncmp(bol, "Interval=", 9) == 0) { *pollinterval = atoi(bol+9); } else if (strncmp(bol, "ActiveIP=", 9) == 0) { /* Nothing */ } else { char *valnam, *valstr = NULL; valnam = strtok(bol, " ="); if (valnam) valstr = strtok(NULL, " ="); if (valnam && valstr) { int validx; for (validx = 0; (params->valnames[validx] && strcmp(params->valnames[validx], valnam)); validx++) ; /* Note: There may be items which are not RRD data (eg text strings) */ if (params->valnames[validx]) { values[validx] = (isdigit(*valstr) ? valstr : "U"); valcount++; } } } bol = (eoln ? eoln+1 : NULL); } if (valcount == params->valcount) { int i; char *ptr; if (fnkey) setupfn2("%s.%s.rrd", testname, fnkey); else setupfn("%s.rrd", testname); setupinterval(*pollinterval); ptr = rrdvalues + snprintf(rrdvalues, sizeof(rrdvalues), "%d", (int)tstamp); for (i = 0; (i < valcount); i++) { ptr += snprintf(ptr, sizeof(rrdvalues)-(ptr-rrdvalues), ":%s", values[i]); } create_and_update_rrd(hostname, testname, classname, pagepaths, params->dsdefs, params->tpl); } xfree(values); } static void do_tabular_snmpmib(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp, snmpmib_param_t *params) { char *fnkey; int pollinterval = 0; char *boset, *eoset, *intvl; boset = strstr(msg, "\n["); if (!boset) return; /* See if there's a poll interval value */ *boset = '\0'; boset++; intvl = strstr(msg, "Interval="); if (intvl) pollinterval = atoi(intvl+9); while (boset) { fnkey = boset+1; boset = boset + strcspn(boset, "]\n"); *boset = '\0'; boset++; eoset = strstr(boset, "\n["); if (eoset) *eoset = '\0'; do_simple_snmpmib(hostname, testname, classname, pagepaths, fnkey, boset, tstamp, params, &pollinterval); boset = (eoset ? eoset+1 : NULL); } } int do_snmpmib_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { time_t now = getcurrenttime(NULL); mibdef_t *mib; xtreePos_t handle; snmpmib_param_t *params; int pollinterval = 0; char *datapart = msg; if (now > snmp_nextreload) readmibs(NULL, 0); mib = find_mib(testname); if (!mib) return 0; handle = xtreeFind(snmpmib_paramtree, mib->mibname); if (handle == xtreeEnd(snmpmib_paramtree)) return 0; params = (snmpmib_param_t *)xtreeData(snmpmib_paramtree, handle); if (params->valcount == 0) return 0; if ((strncmp(msg, "status", 6) == 0) || (strncmp(msg, "data", 4) == 0)) { /* Skip the first line of full status- and data-messages. */ datapart = strchr(msg, '\n'); if (datapart) datapart++; else datapart = msg; } if (mib->tabular) do_tabular_snmpmib(hostname, testname, classname, pagepaths, datapart, tstamp, params); else do_simple_snmpmib(hostname, testname, classname, pagepaths, NULL, datapart, tstamp, params, &pollinterval); return 0; } xymon-4.3.28/xymond/rrd/do_beastat.c0000664000076400007640000003031513033575046017600 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* Copyright (C) 2004-2006 Francesco Duranti */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char beastat_rcsid[] = "$Id: do_beastat.c 7999 2017-01-06 02:00:06Z jccleaver $"; int do_beastat_jta_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *beastat_jta_params[] = { "DS:ActiveTrans:GAUGE:600:0:U", "DS:SecondsActive:DERIVE:600:0:U", "DS:TransAbandoned:DERIVE:600:0:U", "DS:TransCommitted:DERIVE:600:0:U", "DS:TransHeuristics:DERIVE:600:0:U", "DS:TransRBackApp:DERIVE:600:0:U", "DS:TransRBackResource:DERIVE:600:0:U", "DS:TransRBackSystem:DERIVE:600:0:U", "DS:TransRBackTimeout:DERIVE:600:0:U", "DS:TransRBack:DERIVE:600:0:U", "DS:TransTotCount:DERIVE:600:0:U", NULL }; static void *beastat_jta_tpl = NULL; unsigned long heapfree=0, heapsize=0; unsigned long acttrans=0, secact=0, trab=0, trcomm=0, trheur=0, totot=0; unsigned long trrbapp=0, trrbres=0, trrbsys=0, trrbto=0, trrb=0, trtot=0; dbgprintf("beastat: host %s test %s\n",hostname, testname); if (strstr(msg, "beastat.pl")) { setupfn("%s.rrd",testname); if (beastat_jta_tpl == NULL) beastat_jta_tpl = setup_template(beastat_jta_params); acttrans=get_long_data(msg,"ActiveTransactionsTotalCount"); secact=get_long_data(msg,"SecondsActiveTotalCount"); trab=get_long_data(msg,"TransactionAbandonedTotalCount"); trcomm=get_long_data(msg,"TransactionCommittedTotalCount"); trheur=get_long_data(msg,"TransactionHeuristicsTotalCount"); trrbapp=get_long_data(msg,"TransactionRolledBackAppTotalCount"); trrbres=get_long_data(msg,"TransactionRolledBackResourceTotalCount"); trrbsys=get_long_data(msg,"TransactionRolledBackSystemTotalCount"); trrbto=get_long_data(msg,"TransactionRolledBackTimeoutTotalCount"); trrb=get_long_data(msg,"TransactionRolledBackTotalCount"); trtot=get_long_data(msg,"TransactionTotalCount"); dbgprintf("beastat: host %s test %s acttrans %ld secact %ld\n", hostname, testname, acttrans, secact); dbgprintf("beastat: host %s test %s TRANS: aband %ld comm %ld heur %ld total\n", hostname, testname, trab, trcomm, trheur, trtot); dbgprintf("beastat: host %s test %s RB: app %ld res %ld sys %ld timeout %ld total %ld\n", hostname, testname, trrbapp, trrbres, trrbsys, trrbto, trrb); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%ld:%ld:%ld:%ld:%ld:%ld:%ld:%ld:%ld:%ld:%ld", (int) tstamp, acttrans, secact, trab, trcomm, trheur, trrbapp, trrbres, trrbsys, trrbto, trrb, trtot); create_and_update_rrd(hostname, testname, classname, pagepaths, beastat_jta_params, beastat_jta_tpl); } return 0; } int do_beastat_jvm_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *beastat_jvm_params[] = { "DS:HeapFreeCurrent:GAUGE:600:0:U", "DS:HeapSizeCurrent:GAUGE:600:0:U", NULL }; static void *beastat_jvm_tpl = NULL; unsigned long heapfree=0, heapsize=0; dbgprintf("beastat: host %s test %s\n",hostname, testname); if (strstr(msg, "beastat.pl")) { setupfn("%s.rrd",testname); if (beastat_jvm_tpl == NULL) beastat_jvm_tpl = setup_template(beastat_jvm_params); heapfree=get_long_data(msg, "HeapFreeCurrent"); heapsize=get_long_data(msg,"HeapSizeCurrent"); dbgprintf("beastat: host %s test %s heapfree %ld heapsize %ld\n", hostname, testname, heapfree, heapsize); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%ld:%ld", (int) tstamp, heapfree, heapsize); create_and_update_rrd(hostname, testname, classname, pagepaths, beastat_jvm_params, beastat_jvm_tpl); } return 0; } int do_beastat_jms_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *beastat_jms_params[] = { "DS:CurrConn:GAUGE:600:0:U", "DS:HighConn:GAUGE:600:0:U", "DS:TotalConn:DERIVE:600:0:U", "DS:CurrJMSSrv:GAUGE:600:0:U", "DS:HighJMSSrv:GAUGE:600:0:U", "DS:TotalJMSSrv:DERIVE:600:0:U", NULL }; static void *beastat_jms_tpl = NULL; unsigned long conncurr=0, connhigh=0, conntotal=0, jmscurr=0, jmshigh=0, jmstotal=0; dbgprintf("beastat: host %s test %s\n",hostname, testname); if (strstr(msg, "beastat.pl")) { setupfn("%s.rrd",testname); if (beastat_jms_tpl == NULL) beastat_jms_tpl = setup_template(beastat_jms_params); conncurr=get_long_data(msg, "ConnectionsCurrentCount"); connhigh=get_long_data(msg,"ConnectionsHighCount"); conntotal=get_long_data(msg,"ConnectionsTotalCount"); jmscurr=get_long_data(msg,"JMSServersCurrentCount"); jmshigh=get_long_data(msg,"JMSServersHighCount"); jmstotal=get_long_data(msg,"JMSServersTotalCount"); dbgprintf("beastat: host %s test %s conncurr %ld connhigh %ld conntotal %ld\n", hostname, testname, conncurr, connhigh, conntotal); dbgprintf("beastat: host %s test %s jmscurr %ld jmshigh %ld jmstotal %ld\n", hostname, testname, jmscurr, jmshigh,jmstotal); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%ld:%ld:%ld:%ld:%ld:%ld", (int) tstamp, conncurr, connhigh, conntotal, jmscurr, jmshigh, jmstotal); create_and_update_rrd(hostname, testname, classname, pagepaths, beastat_jms_params, beastat_jms_tpl); } return 0; } int do_beastat_exec_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *beastat_exec_params[] = { "DS:ExecThrCurrIdleCnt:GAUGE:600:0:U", "DS:ExecThrTotalCnt:GAUGE:600:0:U", "DS:PendReqCurrCnt:GAUGE:600:0:U", "DS:ServReqTotalCnt:DERIVE:600:0:U", NULL }; static void *beastat_exec_tpl = NULL; static char *checktest = "Type=ExecuteQueueRuntime"; char *curline; char *eoln; dbgprintf("beastat: host %s test %s\n",hostname, testname); if (strstr(msg, "beastat.pl")) { if (beastat_exec_tpl == NULL) beastat_exec_tpl = setup_template(beastat_exec_params); /* ---- Full Status Report ---- Type=ExecuteQueueRuntime - Location=admin - Name=weblogic.kernel.System */ curline=strstr(msg, "---- Full Status Report ----"); if (curline) { eoln = strchr(curline, '\n'); curline = (eoln ? (eoln+1) : NULL); } while (curline) { unsigned long currthr=0, totthr=0,currprq=0,totservrq=0; char *start=NULL, *execname=NULL, *nameptr=NULL; if ((start = strstr(curline,checktest))==NULL) break; if ((eoln = strchr(start, '\n')) == NULL) break; *eoln = '\0'; if ((nameptr=strstr(start,"Name=")) == NULL ) { dbgprintf("do_beastat.c: No name found in host %s test %s line %s\n", hostname,testname,start); goto nextline; } execname=xstrdup(nameptr+5); *eoln = '\n'; start=eoln+1; if ((eoln = strstr(start,checktest))==NULL) eoln=strstr(start,"dbcheck.pl"); if (eoln) *(--eoln)='\0'; setupfn2("%s,%s.rrd",testname,execname); currthr=get_long_data(start, "ExecuteThreadCurrentIdleCount"); totthr=get_long_data(start,"ExecuteThreadTotalCount"); currprq=get_long_data(start,"PendingRequestCurrentCount"); totservrq=get_long_data(start,"ServicedRequestTotalCount"); dbgprintf("beastat: host %s test %s name %s currthr %ld totthr %ld currprq %ld totservrq %ld\n", hostname, testname, execname, currthr, totthr, currprq, totservrq); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%ld:%ld:%ld:%ld", (int) tstamp, currthr, totthr, currprq, totservrq); create_and_update_rrd(hostname, testname, classname, pagepaths, beastat_exec_params, beastat_exec_tpl); if (execname) { xfree(execname); execname = NULL; } nextline: if (eoln) *(eoln)='\n'; curline = (eoln ? (eoln+1) : NULL); } } return 0; } int do_beastat_jdbc_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *beastat_jdbc_params[] = { "DS:ActConnAvgCnt:GAUGE:600:0:U", "DS:ActConnCurrCnt:GAUGE:600:0:U", "DS:ActConnHighCnt:GAUGE:600:0:U", "DS:WtForConnCurrCnt:GAUGE:600:0:U", "DS:ConnDelayTime:GAUGE:600:0:U", "DS:ConnLeakProfileCnt:GAUGE:600:0:U", "DS:LeakedConnCnt:GAUGE:600:0:U", "DS:MaxCapacity:GAUGE:600:0:U", "DS:NumAvailable:GAUGE:600:0:U", "DS:NumUnavailable:GAUGE:600:0:U", "DS:HighNumAvailable:GAUGE:600:0:U", "DS:HighNumUnavailable:GAUGE:600:0:U", "DS:WaitSecHighCnt:GAUGE:600:0:U", "DS:ConnTotalCnt:DERIVE:600:0:U", "DS:FailToReconnCnt:DERIVE:600:0:U", "DS:WaitForConnHighCnt:GAUGE:600:0:U", NULL }; static void *beastat_jdbc_tpl = NULL; static char *checktest = "Type=JDBCConnectionPoolRuntime"; char *curline; char *eoln; dbgprintf("beastat: host %s test %s\n",hostname, testname); if (strstr(msg, "beastat.pl")) { if (beastat_jdbc_tpl == NULL) beastat_jdbc_tpl = setup_template(beastat_jdbc_params); /* ---- Full Status Report ---- Type=ExecuteQueueRuntime - Location=admin - Name=weblogic.kernel.System */ curline=strstr(msg, "---- Full Status Report ----"); if (curline) { eoln = strchr(curline, '\n'); curline = (eoln ? (eoln+1) : NULL); } while (curline) { unsigned long acac=0, accc=0, achc=0, wfccc=0, cdt=0, clpc=0, lcc=0; unsigned long mc=0, na=0, nu=0, hna=0, hnu=0, wshc=0, ctc=0, ftrc=0, wfchc=0; char *start=NULL, *execname=NULL, *nameptr=NULL; if ((start = strstr(curline,checktest))==NULL) break; if ((eoln = strchr(start, '\n')) == NULL) break; *eoln = '\0'; if ((nameptr=strstr(start,"Name=")) == NULL ) { dbgprintf("do_beastat.c: No name found in host %s test %s line %s\n", hostname,testname,start); goto nextline; } execname=xstrdup(nameptr+5); *eoln = '\n'; start=eoln+1; if ((eoln = strstr(start,checktest))==NULL) eoln=strstr(start,"dbcheck.pl"); if (eoln) *(--eoln)='\0'; setupfn2("%s,%s.rrd",testname,execname); acac=get_long_data(start,"ActiveConnectionsAverageCount"); accc=get_long_data(start,"ActiveConnectionsCurrentCount"); achc=get_long_data(start,"ActiveConnectionsHighCount"); wfccc=get_long_data(start,"WaitingForConnectionCurrentCount"); cdt=get_long_data(start,"ConnectionDelayTime"); clpc=get_long_data(start,"ConnectionLeakProfileCount"); lcc=get_long_data(start,"LeakedConnectionCount"); mc=get_long_data(start,"MaxCapacity"); na=get_long_data(start,"NumAvailable"); nu=get_long_data(start,"NumUnavailable"); hna=get_long_data(start,"HighestNumAvailable"); hnu=get_long_data(start,"HighestNumUnavailable"); wshc=get_long_data(start,"WaitSecondsHighCount"); ctc=get_long_data(start,"ConnectionsTotalCount"); ftrc=get_long_data(start,"FailuresToReconnectCount"); wfchc=get_long_data(start,"WaitingForConnectionHighCount"); dbgprintf("beastat: host %s test %s name %s acac %ld accc %ld achc %ld wfccc %ld cdt %ld clpc %ld lcc %ld\n", hostname, testname, execname, acac, accc, achc, wfccc, cdt, clpc, lcc); dbgprintf("beastat: host %s test %s name %s mc %ld na %ld nu %ld hna %ld hnu %ld wshc %ld ctc %ld ftrc %ld wfchc %ld\n",hostname, testname, execname, mc, na, nu, hna, hnu, wshc, ctc, ftrc, wfchc); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%ld:%ld:%ld:%ld:%ld:%ld:%ld:%ld:%ld:%ld:%ld:%ld:%ld:%ld:%ld:%ld", (int) tstamp, acac, accc, achc, wfccc, cdt, clpc, lcc, mc, na, nu, hna, hnu, wshc, ctc, ftrc, wfchc); create_and_update_rrd(hostname, testname, classname, pagepaths, beastat_jdbc_params, beastat_jdbc_tpl); if (execname) { xfree(execname); execname = NULL; } nextline: if (eoln) *(eoln)='\n'; curline = (eoln ? (eoln+1) : NULL); } } return 0; } xymon-4.3.28/xymond/rrd/do_xymonproxy.c0000664000076400007640000000314512000025440020407 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char xymonproxy_rcsid[] = "$Id: do_xymonproxy.c 7026 2012-07-13 14:05:20Z storner $"; int do_xymonproxy_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *xymonproxy_params[] = { "DS:runtime:GAUGE:600:0:U", NULL }; static void *xymonproxy_tpl = NULL; char *p; float runtime; if (xymonproxy_tpl == NULL) xymonproxy_tpl = setup_template(xymonproxy_params); p = strstr(msg, "Average queue time"); if (p && (sscanf(p, "Average queue time : %f", &runtime) == 1)) { if (strcmp("xymonproxy", testname) != 0) { setupfn2("%s.%s.rrd", "xymonproxy", testname); } else { setupfn("%s.rrd", "xymonproxy"); } snprintf(rrdvalues, sizeof(rrdvalues), "%d:%.2f", (int) tstamp, runtime); return create_and_update_rrd(hostname, testname, classname, pagepaths, xymonproxy_params, xymonproxy_tpl); } return 0; } xymon-4.3.28/xymond/rrd/do_xymongen.c0000664000076400007640000001246212173472453020026 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char xymon_rcsid[] = "$Id: do_xymongen.c 7204 2013-07-23 12:20:59Z storner $"; int do_xymongen_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *xymon_params[] = { "DS:runtime:GAUGE:600:0:U", NULL }; static void *xymon_tpl = NULL; static char *xymon2_params[] = { "DS:hostcount:GAUGE:600:0:U", "DS:statuscount:GAUGE:600:0:U", NULL }; static void *xymon2_tpl = NULL; static char *xymon3_params[] = { "DS:redcount:GAUGE:600:0:U", "DS:rednopropcount:GAUGE:600:0:U", "DS:yellowcount:GAUGE:600:0:U", "DS:yellownopropcount:GAUGE:600:0:U", "DS:greencount:GAUGE:600:0:U", "DS:purplecount:GAUGE:600:0:U", "DS:clearcount:GAUGE:600:0:U", "DS:bluecount:GAUGE:600:0:U", "DS:redpct:GAUGE:600:0:100", "DS:rednoproppct:GAUGE:600:0:100", "DS:yellowpct:GAUGE:600:0:100", "DS:yellownoproppct:GAUGE:600:0:100", "DS:greenpct:GAUGE:600:0:100", "DS:purplepct:GAUGE:600:0:100", "DS:clearpct:GAUGE:600:0:100", "DS:bluepct:GAUGE:600:0:100", NULL }; static void *xymon3_tpl = NULL; char *p, *bol, *eoln; float runtime; int hostcount, statuscount; int redcount, rednopropcount, yellowcount, yellownopropcount, greencount, purplecount, clearcount, bluecount; double pctredcount, pctrednopropcount, pctyellowcount, pctyellownopropcount, pctgreencount, pctpurplecount, pctclearcount, pctbluecount; if (xymon_tpl == NULL) xymon_tpl = setup_template(xymon_params); if (xymon2_tpl == NULL) xymon2_tpl = setup_template(xymon2_params); if (xymon3_tpl == NULL) xymon3_tpl = setup_template(xymon3_params); runtime = 0.0; hostcount = statuscount = 0; redcount = rednopropcount = yellowcount = yellownopropcount = 0; greencount = purplecount = clearcount = bluecount = 0; pctredcount = pctrednopropcount = pctyellowcount = pctyellownopropcount = 0.0; pctgreencount = pctpurplecount = pctclearcount = pctbluecount = 0.0; bol = msg; do { int *valptr = NULL; double *pctvalptr = NULL; eoln = strchr(bol, '\n'); if (eoln) *eoln = '\0'; p = bol + strspn(bol, " \t"); if (strncmp(p, "TIME TOTAL", 10) == 0) sscanf(p, "TIME TOTAL %f", &runtime); else if (strncmp(p, "Hosts", 5) == 0) valptr = &hostcount; else if (strncmp(p, "Status messages", 15) == 0) valptr = &statuscount; else if (strncmp(p, "- Red (non-propagating)", 23) == 0) { valptr = &rednopropcount; pctvalptr = &pctrednopropcount; } else if (strncmp(p, "- Red", 5) == 0) { valptr = &redcount; pctvalptr = &pctredcount; } else if (strncmp(p, "- Yellow (non-propagating)", 26) == 0) { valptr = &yellownopropcount; pctvalptr = &pctyellownopropcount; } else if (strncmp(p, "- Yellow", 8) == 0) { valptr = &yellowcount; pctvalptr = &pctyellowcount; } else if (strncmp(p, "- Green", 7) == 0) { valptr = &greencount; pctvalptr = &pctgreencount; } else if (strncmp(p, "- Purple", 8) == 0) { valptr = &purplecount; pctvalptr = &pctpurplecount; } else if (strncmp(p, "- Clear", 7) == 0) { valptr = &clearcount; pctvalptr = &pctclearcount; } else if (strncmp(p, "- Blue", 6) == 0) { valptr = &bluecount; pctvalptr = &pctbluecount; } if (valptr) { p = strchr(bol, ':'); if (p) { *valptr = atoi(p+1); if (pctvalptr) { p = strchr(p, '('); if (p) *pctvalptr = atof(p+1); } } } bol = (eoln ? eoln+1 : NULL); } while (bol); if (strcmp("xymongen", testname) != 0) { setupfn2("%s.%s.rrd", "xymongen", testname); } else { setupfn("%s.rrd", "xymongen"); } snprintf(rrdvalues, sizeof(rrdvalues), "%d:%.2f", (int)tstamp, runtime); create_and_update_rrd(hostname, testname, classname, pagepaths, xymon_params, xymon_tpl); if (strcmp("xymongen", testname) != 0) { setupfn2("%s.%s.rrd", "xymon", testname); } else { setupfn("%s.rrd", "xymon"); } snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d:%d", (int)tstamp, hostcount, statuscount); create_and_update_rrd(hostname, testname, classname, pagepaths, xymon2_params, xymon2_tpl); if (strcmp("xymongen", testname) != 0) { setupfn2("%s.%s.rrd", "xymon2", testname); } else { setupfn("%s.rrd", "xymon2"); } snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d:%d:%d:%d:%d:%d:%d:%d:%05.2f:%05.2f:%05.2f:%05.2f:%05.2f:%05.2f:%05.2f:%05.2f", (int)tstamp, redcount, rednopropcount, yellowcount, yellownopropcount, greencount, purplecount, clearcount, bluecount, pctredcount, pctrednopropcount, pctyellowcount, pctyellownopropcount, pctgreencount, pctpurplecount, pctclearcount, pctbluecount); create_and_update_rrd(hostname, testname, classname, pagepaths, xymon3_params, xymon3_tpl); return 0; } xymon-4.3.28/xymond/rrd/do_dbcheck.c0000664000076400007640000004113412000317413017522 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* Copyright (C) 2004-2006 Francesco Duranti */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char dbcheck_rcsid[] = "$Id: do_dbcheck.c 7060 2012-07-14 16:32:11Z storner $"; int do_dbcheck_memreq_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *dbcheck_memreq_params[] = { "DS:ResFree:GAUGE:600:0:U", "DS:ResAvgFree:GAUGE:600:0:U", "DS:ResUsed:GAUGE:600:0:U", "DS:ResAvgUsed:GAUGE:600:0:U", "DS:ReqFail:DERIVE:600:0:U", "DS:FailSize:GAUGE:600:0:U", NULL }; static void *dbcheck_memreq_tpl = NULL; unsigned long free=0,used=0,reqf=0,fsz=0; double avfr=0,avus=0; char *start,*end; dbgprintf("dbcheck: host %s test %s\n",hostname, testname); if (strstr(msg, "dbcheck.pl")) { if (dbcheck_memreq_tpl == NULL) dbcheck_memreq_tpl = setup_template(dbcheck_memreq_params); if ((start=strstr(msg, ""))==NULL) return 0; *end='\0'; free=get_long_data(start,"ResFree"); avfr=get_double_data(start,"ResAvgFree"); used=get_long_data(start,"ResUsed"); avus=get_double_data(start,"ResAvgUsed"); reqf=get_long_data(start,"ReqFail"); fsz=get_long_data(start,"FailSize"); *end='-'; dbgprintf("dbcheck: host %s test %s free %ld avgfree %f\n", hostname, testname, free, avfr); dbgprintf("dbcheck: host %s test %s used %ld avgused %f\n", hostname, testname, used, avus); dbgprintf("dbcheck: host %s test %s reqfail %ld failsize %ld\n", hostname, testname, reqf, fsz); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%ld:%f:%ld:%f:%ld:%ld", (int) tstamp, free, avfr, used, avus, reqf,fsz); setupfn("%s.rrd",testname); create_and_update_rrd(hostname, testname, classname, pagepaths, dbcheck_memreq_params, dbcheck_memreq_tpl); } return 0; } int do_dbcheck_hitcache_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *dbcheck_hitcache_params[] = { "DS:PinSQLArea:GAUGE:600:0:100", "DS:PinTblProc:GAUGE:600:0:100", "DS:PinBody:GAUGE:600:0:100", "DS:PinTrigger:GAUGE:600:0:100", "DS:HitSQLArea:GAUGE:600:0:100", "DS:HitTblProc:GAUGE:600:0:100", "DS:HitBody:GAUGE:600:0:100", "DS:HitTrigger:GAUGE:600:0:100", "DS:BlBuffHit:GAUGE:600:0:100", "DS:RowCache:GAUGE:600:0:100", NULL }; static void *dbcheck_hitcache_tpl = NULL; double pinsql=0, pintbl=0, pinbody=0, pintrig=0, hitsql=0, hittbl=0, hitbody=0, hittrig=0, blbuff=0, rowchache=0; dbgprintf("dbcheck: host %s test %s\n",hostname, testname); if (strstr(msg, "dbcheck.pl")) { setupfn("%s.rrd",testname); if (dbcheck_hitcache_tpl == NULL) dbcheck_hitcache_tpl = setup_template(dbcheck_hitcache_params); pinsql=get_double_data(msg,"PinSQLArea"); pintbl=get_double_data(msg,"PinTblProc"); pinbody=get_double_data(msg,"PinBody"); pintrig=get_double_data(msg,"PinTrigger"); hitsql=get_double_data(msg,"HitSQLArea"); hittbl=get_double_data(msg,"HitTblProc"); hitbody=get_double_data(msg,"HitBody"); hittrig=get_double_data(msg,"HitTrigger"); blbuff=get_double_data(msg,"BlBuffHit"); rowchache=get_double_data(msg,"RowCache"); dbgprintf("dbcheck: host %s test %s pinsql %5.2f pintbl %5.2f pinbody %5.2f pintrig %5.2f\n", hostname, testname, pinsql, pintbl, pinbody, pintrig); dbgprintf("dbcheck: host %s test %s hitsql %5.2f hittbl %5.2f hitbody %5.2f hittrig %5.2f\n", hostname, testname, hitsql, hittbl, hitbody, hittrig); dbgprintf("dbcheck: host %s test %s blbuff %5.2f rowchache %5.2f\n", hostname, testname, blbuff, rowchache); sprintf(rrdvalues, "%d:%05.2f:%05.2f:%05.2f:%05.2f:%05.2f:%05.2f:%05.2f:%05.2f:%05.2f:%05.2f", (int) tstamp, pinsql, pintbl, pinbody, pintrig, hitsql, hittbl, hitbody, hittrig, blbuff, rowchache); create_and_update_rrd(hostname, testname, classname, pagepaths, dbcheck_hitcache_params, dbcheck_hitcache_tpl); } return 0; } int do_dbcheck_session_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *dbcheck_session_params[] = { "DS:MaxSession:GAUGE:600:0:U", "DS:CurrSession:GAUGE:600:0:U", "DS:SessUsedPct:GAUGE:600:0:100", "DS:MaxProcs:GAUGE:600:0:U", "DS:CurrProcs:GAUGE:600:0:U", "DS:ProcsUsedPct:GAUGE:600:0:100", NULL }; static void *dbcheck_session_tpl = NULL; unsigned long maxsess=0, currsess=0, maxproc=0, currproc=0 ; double pctsess=0, pctproc=0; dbgprintf("dbcheck: host %s test %s\n",hostname, testname); if (strstr(msg, "dbcheck.pl")) { setupfn("%s.rrd",testname); if (dbcheck_session_tpl == NULL) dbcheck_session_tpl = setup_template(dbcheck_session_params); maxsess=get_long_data(msg, "MaxSession"); currsess=get_long_data(msg,"CurrSession"); pctsess=get_double_data(msg,"SessUsedPct"); maxproc=get_long_data(msg,"MaxProcs"); currproc=get_long_data(msg,"CurrProcs"); pctproc=get_double_data(msg,"ProcsUsedPct"); dbgprintf("dbcheck: host %s test %s maxsess %ld currsess %ld pctsess %5.2f\n", hostname, testname, maxsess, currsess, pctsess); dbgprintf("dbcheck: host %s test %s maxproc %ld currproc %ld pctproc %5.2f\n", hostname, testname, maxproc, currproc, pctproc); sprintf(rrdvalues, "%d:%ld:%ld:%05.2f:%ld:%ld:%05.2f", (int) tstamp, maxsess, currsess, pctsess, maxproc, currproc, pctproc); create_and_update_rrd(hostname, testname, classname, pagepaths, dbcheck_session_params, dbcheck_session_tpl); } return 0; } int do_dbcheck_rb_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { /* This check can be done in slow mode so put a long heartbeat */ static char *dbcheck_rb_params[] = { "DS:pct:GAUGE:28800:0:100", NULL }; static void *dbcheck_rb_tpl = NULL; char *curline; char *eoln; dbgprintf("dbcheck: host %s test %s\n",hostname, testname); if (strstr(msg, "dbcheck.pl")) { if (dbcheck_rb_tpl == NULL) dbcheck_rb_tpl = setup_template(dbcheck_rb_params); curline=strstr(msg, "Rollback Checking"); if (curline) { eoln = strchr(curline, '\n'); curline = (eoln ? (eoln+1) : NULL); } while (curline) { float pct=0; char *execname=NULL; char *start; if ((start = strstr(curline,"ROLLBACK")) == NULL) break; if ((eoln = strchr(start, '\n')) == NULL) break; *eoln = '\0'; dbgprintf("dbcheck: host %s test %s line %s\n", hostname, testname, start); execname=xmalloc(strlen(start)); if ( sscanf(start,"ROLLBACK percentage for %s is %f",execname,&pct) !=2) goto nextline; setupfn2("%s,%s.rrd",testname,execname); dbgprintf("dbcheck: host %s test %s name %s pct %5.2f\n", hostname, testname, execname, pct); sprintf(rrdvalues, "%d:%05.2f", (int) tstamp, pct); create_and_update_rrd(hostname, testname, classname, pagepaths, dbcheck_rb_params, dbcheck_rb_tpl); nextline: if (execname) { xfree(execname); execname = NULL; } if (eoln) *(eoln)='\n'; curline = (eoln ? (eoln+1) : NULL); } } return 0; } int do_dbcheck_invobj_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { /* This check can be done in slow mode so put a long heartbeat */ static char *dbcheck_invobj_params[] = { "DS:red:GAUGE:28800:0:U", "DS:yellow:GAUGE:28800:0:U", "DS:green:GAUGE:28800:0:U", NULL }; static void *dbcheck_invobj_tpl = NULL; char *curline; char *eoln; unsigned long yellow=0,red=0,green=0; dbgprintf("dbcheck: host %s test %s\n",hostname, testname); if (strstr(msg, "dbcheck.pl")) { if (dbcheck_invobj_tpl == NULL) dbcheck_invobj_tpl = setup_template(dbcheck_invobj_params); curline=strstr(msg, "Invalid Object Checking"); if (curline) { eoln = strchr(curline, '\n'); curline = (eoln ? (eoln+1) : NULL); } while (curline) { if ( *curline == '\n') { curline++; continue; } if ((eoln = strchr(curline, '\n')) == NULL) break; *eoln = '\0'; if ( *curline =='&' ) curline++; if ( strstr(curline,"red") == curline) red++; if ( strstr(curline,"yellow") == curline) yellow++; if ( strstr(curline,"green") == curline) green++; if (eoln) *(eoln)='\n'; curline = (eoln ? (eoln+1) : NULL); } setupfn("%s.rrd",testname); dbgprintf("dbcheck: host %s test %s red %ld yellow %ld green %ld\n", hostname, testname, red,yellow,green); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%ld:%ld:%ld", (int) tstamp, red,yellow,green); create_and_update_rrd(hostname, testname, classname, pagepaths, dbcheck_invobj_params, dbcheck_invobj_tpl); } return 0; } int do_dbcheck_tablespace_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *tablespace_params[] = { "DS:pct:GAUGE:600:0:U", "DS:used:GAUGE:600:0:U", NULL }; static rrdtpldata_t *tablespace_tpl = NULL; char *eoln, *curline; static int ptnsetup = 0; static pcre *inclpattern = NULL; static pcre *exclpattern = NULL; if (tablespace_tpl == NULL) tablespace_tpl = setup_template(tablespace_params); if (!ptnsetup) { const char *errmsg; int errofs; char *ptn; ptnsetup = 1; ptn = getenv("RRDDISKS"); if (ptn && strlen(ptn)) { inclpattern = pcre_compile(ptn, PCRE_CASELESS, &errmsg, &errofs, NULL); if (!inclpattern) errprintf("PCRE compile of RRDDISKS='%s' failed, error %s, offset %d\n", ptn, errmsg, errofs); } ptn = getenv("NORRDDISKS"); if (ptn && strlen(ptn)) { exclpattern = pcre_compile(ptn, PCRE_CASELESS, &errmsg, &errofs, NULL); if (!exclpattern) errprintf("PCRE compile of NORRDDISKS='%s' failed, error %s, offset %d\n", ptn, errmsg, errofs); } } /* * Francesco Duranti noticed that if we use the "/group" option * when sending the status message, this tricks the parser to * create an extra filesystem called "/group". So skip the first * line - we never have any disk reports there anyway. */ curline = strchr(msg, '\n'); if (curline) curline++; /* FD: For dbcheck.pl move after the Header */ curline=strstr(curline, "TableSpace/DBSpace"); if (curline) { eoln = strchr(curline, '\n'); curline = (eoln ? (eoln+1) : NULL); } while (curline) { char *fsline, *p; char *columns[20]; int columncount; char *diskname = NULL; int pused = -1; int wanteddisk = 1; long long aused = 0; /* FD: Using double instead of long long because we can have decimal on Netapp and DbCheck */ double dused = 0; eoln = strchr(curline, '\n'); if (eoln) *eoln = '\0'; /* FD: Exit if doing DBCHECK and the end of the tablespaces are reached */ if (strstr(eoln+1, "dbcheck.pl") == (eoln+1)) break; /* red/yellow filesystems show up twice */ if (*curline == '&') goto nextline; if ((strstr(curline, " red ") || strstr(curline, " yellow "))) goto nextline; for (columncount=0; (columncount<20); columncount++) columns[columncount] = ""; fsline = xstrdup(curline); columncount = 0; p = strtok(fsline, " "); while (p && (columncount < 20)) { columns[columncount++] = p; p = strtok(NULL, " "); } /* FD: Check TableSpace from dbcheck.pl */ /* FD: Add an initial "/" to TblSpace Name so they're reported in the trends column */ diskname=xmalloc(strlen(columns[0])+2); sprintf(diskname,"/%s",columns[0]); p = strchr(columns[4], '%'); if (p) *p = ' '; pused = atoi(columns[4]); p = columns[2] + strspn(columns[2], "0123456789."); /* FD: Using double instead of long long because we can have decimal */ dused = str2ll(columns[2], NULL); /* FD: dbspace report contains M/G/T Convert to KB if there's a modifier after the numbers */ if (*p == 'M') dused *= 1024; else if (*p == 'G') dused *= (1024*1024); else if (*p == 'T') dused *= (1024*1024*1024); aused=(long long)dused; /* Check include/exclude patterns */ wanteddisk = 1; if (exclpattern) { int ovector[30]; int result; result = pcre_exec(exclpattern, NULL, diskname, strlen(diskname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))); wanteddisk = (result < 0); } if (wanteddisk && inclpattern) { int ovector[30]; int result; result = pcre_exec(inclpattern, NULL, diskname, strlen(diskname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))); wanteddisk = (result >= 0); } if (wanteddisk && diskname && (pused != -1)) { p = diskname; while ((p = strchr(p, '/')) != NULL) { *p = ','; } if (strcmp(diskname, ",") == 0) { diskname = xrealloc(diskname, 6); strcpy(diskname, ",root"); } /* * Use testname here. * The disk-handler also gets data from NetAPP inode- and qtree-messages, * that are virtually identical to the disk-messages. So lets just handle * all of it by using the testname as part of the filename. */ setupfn2("%s%s.rrd", testname,diskname); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d:%lld", (int)tstamp, pused, aused); create_and_update_rrd(hostname, testname, classname, pagepaths, tablespace_params, tablespace_tpl); } if (diskname) { xfree(diskname); diskname = NULL; } if (eoln) *eoln = '\n'; xfree(fsline); nextline: curline = (eoln ? (eoln+1) : NULL); } return 0; } xymon-4.3.28/xymond/rrd/do_disk.c0000664000076400007640000001702612000025440017070 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char disk_rcsid[] = "$Id: do_disk.c 7026 2012-07-13 14:05:20Z storner $"; int do_disk_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *disk_params[] = { "DS:pct:GAUGE:600:0:100", "DS:used:GAUGE:600:0:U", NULL }; static void *disk_tpl = NULL; enum { DT_IRIX, DT_AS400, DT_NT, DT_UNIX, DT_NETAPP, DT_NETWARE, DT_BBWIN } dsystype; char *eoln, *curline; static int ptnsetup = 0; static pcre *inclpattern = NULL; static pcre *exclpattern = NULL; if (strstr(msg, "netapp.pl")) return do_netapp_disk_rrd(hostname, testname, classname, pagepaths, msg, tstamp); if (strstr(msg, "dbcheck.pl")) return do_dbcheck_tablespace_rrd(hostname, testname, classname, pagepaths, msg, tstamp); if (disk_tpl == NULL) disk_tpl = setup_template(disk_params); if (!ptnsetup) { const char *errmsg; int errofs; char *ptn; ptnsetup = 1; ptn = getenv("RRDDISKS"); if (ptn && strlen(ptn)) { inclpattern = pcre_compile(ptn, PCRE_CASELESS, &errmsg, &errofs, NULL); if (!inclpattern) errprintf("PCRE compile of RRDDISKS='%s' failed, error %s, offset %d\n", ptn, errmsg, errofs); } ptn = getenv("NORRDDISKS"); if (ptn && strlen(ptn)) { exclpattern = pcre_compile(ptn, PCRE_CASELESS, &errmsg, &errofs, NULL); if (!exclpattern) errprintf("PCRE compile of NORRDDISKS='%s' failed, error %s, offset %d\n", ptn, errmsg, errofs); } } if (strstr(msg, " xfs ") || strstr(msg, " efs ") || strstr(msg, " cxfs ")) dsystype = DT_IRIX; else if (strstr(msg, "DASD")) dsystype = DT_AS400; else if (strstr(msg, "NetWare Volumes")) dsystype = DT_NETWARE; else if (strstr(msg, "NetAPP")) dsystype = DT_NETAPP; else if (strstr(msg, "Summary")) dsystype = DT_BBWIN; /* BBWin > 0.10 is almost like Windows/NT */ else if (strstr(msg, "Filesystem")) dsystype = DT_NT; else dsystype = DT_UNIX; if (dsystype == DT_NT) { /* * The MrBig client includes HTML tables with the configured disk thresholds. * We simply cut off that part of the message before doing any trend analysis. */ char *mrbigstuff = strstr(msg, "Limits:"); if (mrbigstuff) *mrbigstuff = '\0'; } /* * Francesco Duranti noticed that if we use the "/group" option * when sending the status message, this tricks the parser to * create an extra filesystem called "/group". So skip the first * line - we never have any disk reports there anyway. */ curline = strchr(msg, '\n'); if (curline) curline++; while (curline) { char *fsline, *p; char *columns[20]; int columncount; char *diskname = NULL; int pused = -1; int wanteddisk = 1; long long aused = 0; eoln = strchr(curline, '\n'); if (eoln) *eoln = '\0'; /* AS/400 reports must contain the word DASD */ if ((dsystype == DT_AS400) && (strstr(curline, "DASD") == NULL)) goto nextline; /* All clients except AS/400 report the mount-point with slashes - ALSO Win32 clients. */ if ((dsystype != DT_AS400) && (strchr(curline, '/') == NULL)) goto nextline; /* red/yellow filesystems show up twice */ if ((dsystype != DT_NETAPP) && (dsystype != DT_NETWARE) && (dsystype != DT_AS400)) { if (*curline == '&') goto nextline; if ((strstr(curline, " red ") || strstr(curline, " yellow "))) goto nextline; } for (columncount=0; (columncount<20); columncount++) columns[columncount] = ""; fsline = xstrdup(curline); columncount = 0; p = strtok(fsline, " "); while (p && (columncount < 20)) { columns[columncount++] = p; p = strtok(NULL, " "); } /* * Some Unix filesystem reports contain the word "Filesystem". * So check if there's a slash in the NT filesystem letter - if yes, * then it's really a Unix system after all. */ if ( (dsystype == DT_NT) && (*(columns[5])) && (strchr(columns[0], '/')) ) dsystype = DT_UNIX; switch (dsystype) { case DT_IRIX: diskname = xstrdup(columns[6]); p = strchr(columns[5], '%'); if (p) *p = ' '; pused = atoi(columns[5]); aused = str2ll(columns[3], NULL); break; case DT_AS400: diskname = xstrdup("/DASD"); p = strchr(columns[columncount-1], '%'); if (p) *p = ' '; /* * Yikes ... the format of this line varies depending on the color. * Red: * March 23, 2005 12:32:54 PM EST DASD on deltacdc at panic level at 90.4967% * Yellow: * April 4, 2005 9:20:26 AM EST DASD on deltacdc at warning level at 81.8919% * Green: * April 3, 2005 7:53:53 PM EST DASD on deltacdc OK at 79.6986% * * So we'll just pick out the number from the last column. */ pused = atoi(columns[columncount-1]); aused = 0; /* Not available */ break; case DT_NT: case DT_BBWIN: diskname = xmalloc(strlen(columns[0])+2); sprintf(diskname, "/%s", columns[0]); p = strchr(columns[4], '%'); if (p) *p = ' '; pused = atoi(columns[4]); aused = str2ll(columns[2], NULL); break; case DT_UNIX: diskname = xstrdup(columns[5]); p = strchr(columns[4], '%'); if (p) *p = ' '; pused = atoi(columns[4]); aused = str2ll(columns[2], NULL); break; case DT_NETAPP: diskname = xstrdup(columns[1]); pused = atoi(columns[5]); p = columns[3] + strspn(columns[3], "0123456789"); aused = str2ll(columns[3], NULL); /* Convert to KB if there's a modifier after the numbers */ if (*p == 'M') aused *= 1024; else if (*p == 'G') aused *= (1024*1024); else if (*p == 'T') aused *= (1024*1024*1024); break; case DT_NETWARE: diskname = xstrdup(columns[1]); aused = str2ll(columns[3], NULL); pused = atoi(columns[7]); break; } /* Check include/exclude patterns */ wanteddisk = 1; if (exclpattern) { int ovector[30]; int result; result = pcre_exec(exclpattern, NULL, diskname, strlen(diskname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))); wanteddisk = (result < 0); } if (wanteddisk && inclpattern) { int ovector[30]; int result; result = pcre_exec(inclpattern, NULL, diskname, strlen(diskname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))); wanteddisk = (result >= 0); } if (wanteddisk && diskname && (pused != -1)) { p = diskname; while ((p = strchr(p, '/')) != NULL) { *p = ','; } if (strcmp(diskname, ",") == 0) { diskname = xrealloc(diskname, 6); strcpy(diskname, ",root"); } /* * Use testname here. * The disk-handler also gets data from NetAPP inode- and qtree-messages, * that are virtually identical to the disk-messages. So lets just handle * all of it by using the testname as part of the filename. */ setupfn2("%s%s.rrd", testname, diskname); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d:%lld", (int)tstamp, pused, aused); create_and_update_rrd(hostname, testname, classname, pagepaths, disk_params, disk_tpl); } if (diskname) { xfree(diskname); diskname = NULL; } if (eoln) *eoln = '\n'; xfree(fsline); nextline: curline = (eoln ? (eoln+1) : NULL); } return 0; } xymon-4.3.28/xymond/rrd/do_asid.c0000664000076400007640000000566112000025440017060 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* This module handles combined z/OS and z/VSE ASID and NPARTS messages. */ /* */ /* Copyright (C) 2006-2011 Henrik Storner */ /* Copyright (C) 2007-2009 Rich Smrcina */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char asid_rcsid[] = "$Id: do_asid.c 6585 2010-11-14 15:12:56Z storner $"; static char *asid_params[] = { "DS:util:GAUGE:600:0:100", NULL }; static char *asid_tpl = NULL; int do_asid_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { char *p; p=(strstr(msg, "Maxuser")); if (p) { long maxuser, maxufree, maxuused, rsvtstrt, rsvtfree, rsvtused, rsvnonr, rsvnfree, rsvnused; float maxupct, rsvtpct, rsvnpct; sscanf(p, "Maxuser: %ld Free: %ld Used: %ld %f", &maxuser, &maxufree, &maxuused, &maxupct); p=(strstr(p, "RSVTSTRT")); sscanf(p, "RSVTSTRT: %ld Free: %ld Used: %ld %f", &rsvtstrt, &rsvtfree, &rsvtused, &rsvtpct); p=(strstr(p, "RSVNONR")); sscanf(p, "RSVNONR: %ld Free: %ld Used: %ld %f", &rsvnonr, &rsvnfree, &rsvnused, &rsvnpct); setupfn2("%s.%s.rrd", "maxuser", "maxuser"); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, (int)maxupct); create_and_update_rrd(hostname, testname, classname, pagepaths, asid_params, asid_tpl); setupfn2("%s.%s.rrd", "maxuser", "rsvtstrt"); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, (int)rsvtpct); create_and_update_rrd(hostname, testname, classname, pagepaths, asid_params, asid_tpl); setupfn2("%s.%s.rrd", "maxuser", "rsvnonr"); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, (int)rsvnpct); create_and_update_rrd(hostname, testname, classname, pagepaths, asid_params, asid_tpl); } p=(strstr(msg, "Nparts")); if (p) { char *fn = NULL; long nparts, partfree, partused; float partupct; sscanf(p, "Nparts: %ld Free: %ld Used: %ld %f", &nparts, &partfree, &partused, &partupct); setupfn("nparts.rrd", fn); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, (int)partupct); create_and_update_rrd(hostname, testname, classname, pagepaths, asid_params, asid_tpl); } return 0; } xymon-4.3.28/xymond/rrd/do_trends.c0000664000076400007640000000711312000025440017431 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* This module handles custom "trends" data. */ /* */ /* Copyright (C) 2007-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char trends_rcsid[] = "$Id: do_trends.c 7026 2012-07-13 14:05:20Z storner $"; /* * This module was inspired by a mail from Stef Coene: * * --------------------------------------------------------------------------- * Date: Wed, 17 Jan 2007 14:04:29 +0100 * From: Stef Coene * Subject: Re: [xymon] xymon monitoring * * Just wondering, how hard would it be to create an extra channel for trending? * So you can use the xymon client to send "numbers" to the xymon server together * with some extra control information. * * xymon trends * * ----------------------------------------------------------------------------- * * Instead of a dedicated Xymon channel for this, I decided to use the * existing "data" message type. To use this, send a "data" message to * xymon formatted like this: * * data $MACHINE.trends * [filename.rrd] * DS-definition1 VALUE2 * DS-definition2 VALUE2 * * E.g. to create/update a custom RRD file "weather.rrd" with two * GAUGE datasets "temp" and "wind", with current values "21" and * "8" respectively, send this message: * * [weather.rrd] * DS:temp:GAUGE:600:0:U 21 * DS:wind:GAUGE:600:0:U 8 */ static int do_trends_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { char *boln, *eoln, *p; int dscount; char **creparams; creparams = (char **)calloc(1, sizeof(char *)); dscount = 0; boln = strchr(msg, '\n'); if (boln) boln++; while (boln && *boln) { eoln = strchr(boln, '\n'); if (eoln) *eoln = '\0'; if (*boln == '[') { /* Flush the current RRD file */ if (creparams[0]) create_and_update_rrd(hostname, testname, classname, pagepaths, creparams, NULL); creparams = (char **)realloc(creparams, 1*sizeof(char *)); creparams[0] = NULL; dscount = 0; /* Get the RRD filename */ p = strchr(boln+1, ']'); if (p) *p = '\0'; setupfn("%s", boln+1); /* And setup the initial rrdvalues string */ snprintf(rrdvalues, sizeof(rrdvalues), "%d", (int)tstamp); } else if (strncmp(boln, "DS:", 3) == 0) { char *valptr = boln + strcspn(boln, " \t"); if ((*valptr == ' ') || (*valptr == '\t')) { *valptr = '\0'; valptr += 1 + strspn(valptr+1, " \t"); creparams[dscount] = boln; dscount++; creparams = (char **)realloc(creparams, (1+dscount)*sizeof(char **)); creparams[dscount] = NULL; snprintf(rrdvalues+strlen(rrdvalues), sizeof(rrdvalues)-strlen(rrdvalues), ":%s", valptr); } } boln = (eoln ? eoln+1 : NULL); } /* Do the last RRD set */ if (creparams[0]) create_and_update_rrd(hostname, testname, classname, pagepaths, creparams, NULL); xfree(creparams); return 0; } xymon-4.3.28/xymond/rrd/do_xymond.c0000664000076400007640000000710312000025440017447 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char xymond_rcsid[] = "$Id: do_xymond.c 7026 2012-07-13 14:05:20Z storner $"; int do_xymond_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *xymond_params[] = { "DS:inmessages:DERIVE:600:0:U", "DS:statusmessages:DERIVE:600:0:U", "DS:combomessages:DERIVE:600:0:U", "DS:pagemessages:DERIVE:600:0:U", "DS:summarymessages:DERIVE:600:0:U", "DS:datamessages:DERIVE:600:0:U", "DS:notesmessages:DERIVE:600:0:U", "DS:enablemessages:DERIVE:600:0:U", "DS:disablemessages:DERIVE:600:0:U", "DS:ackmessages:DERIVE:600:0:U", "DS:configmessages:DERIVE:600:0:U", "DS:querymessages:DERIVE:600:0:U", "DS:boardmessages:DERIVE:600:0:U", "DS:listmessages:DERIVE:600:0:U", "DS:logmessages:DERIVE:600:0:U", "DS:dropmessages:DERIVE:600:0:U", "DS:renamemessages:DERIVE:600:0:U", "DS:statuschmsgs:DERIVE:600:0:U", "DS:stachgchmsgs:DERIVE:600:0:U", "DS:pagechmsgs:DERIVE:600:0:U", "DS:datachmsgs:DERIVE:600:0:U", "DS:noteschmsgs:DERIVE:600:0:U", "DS:enadischmsgs:DERIVE:600:0:U", NULL }; static void *xymond_tpl = NULL; struct { char *marker; unsigned long val; } xymond_data[] = { { "\nIncoming messages", 0 }, { "\n- status", 0 }, { "\n- combo", 0 }, { "\n- page", 0 }, { "\n- summary", 0 }, { "\n- data", 0 }, { "\n- notes", 0 }, { "\n- enable", 0 }, { "\n- disable", 0 }, { "\n- ack", 0 }, { "\n- config", 0 }, { "\n- query", 0 }, { "\n- xymondboard", 0 }, { "\n- xymondlist", 0 }, { "\n- xymondlog", 0 }, { "\n- drop", 0 }, { "\n- rename", 0 }, { "\nstatus channel messages", 0 }, { "\nstachg channel messages", 0 }, { "\npage channel messages", 0 }, { "\ndata channel messages", 0 }, { "\nnotes channel messages", 0 }, { "\nenadis channel messages", 0 }, { NULL, 0 } }; int i, gotany = 0; char *p; char valstr[50]; MEMDEFINE(valstr); if (xymond_tpl == NULL) xymond_tpl = setup_template(xymond_params); snprintf(rrdvalues, sizeof(rrdvalues), "%d", (int)tstamp); i = 0; while (xymond_data[i].marker) { p = strstr(msg, xymond_data[i].marker); if (p) { if (*p == '\n') p++; p += strcspn(p, ":\r\n"); if (*p == ':') { xymond_data[i].val = strtoul(p+1, NULL, 10); gotany++; snprintf(valstr, sizeof(valstr), ":%lu", xymond_data[i].val); strncat(rrdvalues, valstr, sizeof(rrdvalues)-strlen(rrdvalues)-1); } else strcat(rrdvalues, ":U"); } else strcat(rrdvalues, ":U"); i++; } if (gotany) { if (strcmp("xymond", testname) != 0) { setupfn2("%s.%s.rrd", "xymond", testname); } else { setupfn("%s.rrd", "xymond"); } MEMUNDEFINE(valstr); return create_and_update_rrd(hostname, testname, classname, pagepaths, xymond_params, xymond_tpl); } MEMUNDEFINE(valstr); return 0; } xymon-4.3.28/xymond/rrd/do_apache.c0000664000076400007640000000424212000025440017353 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char apache_rcsid[] = "$Id: do_apache.c 7026 2012-07-13 14:05:20Z storner $"; int do_apache_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *apache_params[] = { "DS:TA:DERIVE:600:0:U", "DS:TKB:DERIVE:600:0:U", "DS:BW:GAUGE:600:1:U", "DS:IW:GAUGE:600:1:U", "DS:CPU:GAUGE:600:0:U", "DS:REQPERSEC:GAUGE:600:0:U", NULL }; static void *apache_tpl = NULL; char *markers[] = { "Total Accesses:", "Total kBytes:", "BusyWorkers:", "IdleWorkers:", "CPULoad:", "ReqPerSec:", NULL }; int i; char *p, *eoln; if (apache_tpl == NULL) apache_tpl = setup_template(apache_params); /* Apache 1.x uses BusyServers/IdleServers. Convert the status to Apache 2.0 format */ if ((p = strstr(msg, "BusyServers:")) != NULL) memcpy(p, "BusyWorkers:", strlen("BusyWorkers:")); if ((p = strstr(msg, "IdleServers:")) != NULL) memcpy(p, "IdleWorkers:", strlen("IdleWorkers:")); setupfn("%s.rrd", "apache"); snprintf(rrdvalues, sizeof(rrdvalues), "%d", (int)tstamp); i = 0; while (markers[i]) { strcat(rrdvalues, ":"); p = strstr(msg, markers[i]); if (p) { eoln = strchr(p, '\n'); if (eoln) *eoln = '\0'; p = strchr(p, ':')+1; p += strspn(p, " "); strcat(rrdvalues, p); if (eoln) *eoln = '\n'; } else { strcat(rrdvalues, "U"); } i++; } return create_and_update_rrd(hostname, testname, classname, pagepaths, apache_params, apache_tpl); } xymon-4.3.28/xymond/rrd/do_ntpstat.c0000664000076400007640000000336412000025440017633 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char ntpstat_rcsid[] = "$Id: do_ntpstat.c 7026 2012-07-13 14:05:20Z storner $"; int do_ntpstat_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *ntpstat_params[] = { "DS:offsetms:GAUGE:600:U:U", NULL }; static void *ntpstat_tpl = NULL; char *p; float offset; int gotdata = 0; if (ntpstat_tpl == NULL) ntpstat_tpl = setup_template(ntpstat_params); /* First check for the old LARRD ntpstat BF script */ p = strstr(msg, "\nOffset:"); gotdata = (p && (sscanf(p+1, "Offset: %f", &offset) == 1)); /* Or maybe it's just the "ntpq -c rv" output */ if (!gotdata) { p = strstr(msg, "offset="); if (p && (isspace((int)*(p-1)) || (*(p-1) == ','))) { gotdata = (p && (sscanf(p, "offset=%f", &offset) == 1)); } } if (gotdata) { setupfn("%s.rrd", "ntpstat"); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%.6f", (int)tstamp, offset); return create_and_update_rrd(hostname, testname, classname, pagepaths, ntpstat_params, ntpstat_tpl); } return 0; } xymon-4.3.28/xymond/rrd/do_ncv.c0000664000076400007640000001726112615577600016753 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* This module handles any message with data in the form */ /* NAME: VALUE */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* split-ncv added by Charles Goyard November 2006 */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char ncv_rcsid[] = "$Id: do_ncv.c 7711 2015-11-02 06:15:28Z jccleaver $"; int do_ncv_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { char **params = NULL; int paridx; char dsdef[1024]; /* destination DS syntax for rrd engine */ char *l, *name, *val; char *envnam; char *dstypes = NULL; /* contain NCV_testname value */ int split_ncv = 0; int skipblock = 0; int dslen; snprintf(rrdvalues, sizeof(rrdvalues), "%d", (int)tstamp); params = (char **)calloc(1, sizeof(char *)); paridx = 0; /* Get the NCV_* or SPLITNCV_* environment setting */ envnam = (char *)malloc(9 + strlen(testname) + 1); sprintf(envnam, "SPLITNCV_%s", testname); l = getenv(envnam); if (l) { split_ncv = 1; dslen = 200; } else { split_ncv = 0; dslen = 19; setupfn("%s.rrd", testname); sprintf(envnam, "NCV_%s", testname); l = getenv(envnam); } if (l) { dstypes = (char *)malloc(strlen(l)+3); sprintf(dstypes, ",%s,", l); } xfree(envnam); l = strchr(msg, '\n'); if (l) l++; while (l && *l && strncmp(l, "@@\n", 3)) { name = val = NULL; l += strspn(l, " \t\n"); if (*l) { /* Look for a sign to alter processing */ if (strncmp(l, "", 8) == 0) { /* skip the entire line */ l += strcspn(l, "\n"); l++; continue; } else if (strncmp(l, "skipstart -->", 13) == 0) { /* begin ignoring lines until told to stop */ skipblock = 1; } else if (strncmp(l, "skipend -->", 11) == 0) { /* we're done skipping, */ skipblock = 0; l += 11; continue; } else if (strncmp(l, "ignore -->", 10) == 0) { /* allowed syntax: assorted text without html label : value */ l += 10; l += strcspn(l, ">\n"); /* search for closing '>' or the eol */ /* See if it's the expected end marker '', and repeat until we find it (or eol) */ while ((*l != '\n') && (strncmp((l-4), "", 5) != 0) ) { l++; l += strcspn(l, ">\n"); } /* Did we hit the end? Move on. If not, skip any (now) leading whitespace and continue on */ if (*l == '\n') { l++; continue; } else { l++; l += strspn(l, " \t\n"); } } else if (strncmp(l, "end -->", 7) == 0) break; /* abort */ else { dbgprintf("Unexpected NCV directive found\n"); /* skip past directive */ l += strcspn(l, ">"); l++; l += strspn(l, " \t\n"); } } if (skipblock) { l += strcspn(l, "\n"); l++; continue; } /* We're still in a comment block */ /* See if this line contains a '=' or ':' sign */ name = l; l += strcspn(l, ":=\n"); if (*l) { if (( *l == '=') || (*l == ':')) { *l = '\0'; l++; } else { /* No marker, so skip this line */ name = NULL; } } else break; /* We've hit the end of the message */ } /* Skip any color marker "&COLOR " in front of the ds name */ if (name && (*name == '&')) { name++; name += strspn(name, "abcdefghijklmnopqrstuvwxyz"); name += strspn(name, " \t"); if (*name == '\0') name = NULL; } if (name) { val = l + strspn(l, " \t"); /* Find the end of the value string */ l = val; if ((*l == '-') || (*l == '+')) l++; /* Pass leading sign */ l += strspn(l, "0123456789.+-eE"); /* and the numbers. */ if( *val ) { int iseol = (*l == '\n'); *l = '\0'; if (!iseol) { /* If extra data after the value, skip to end of line */ l = strchr(l+1, '\n'); if (l) l++; } else { l++; } } else break; /* No value data */ } if (name && val && *val) { char *endptr; double dummy; dummy = strtod(val, &endptr); /* Dont care - we're only interested in endptr */ if (isspace((int)*endptr) || (*endptr == '\0')) { char dsname[250]; /* name of ncv in status message (with space and all) */ char dskey[252]; /* name of final DS key (stripped) */ char *dstype = NULL; /* type of final DS */ char *inp; int outidx = 0; /* val contains a valid number */ /* rrdcreate(1) says: ds must be in the set [a-zA-Z0-9_] ... */ for (inp=name,outidx=0; (*inp && (outidx < dslen)); inp++) { if ( ((*inp >= 'A') && (*inp <= 'Z')) || ((*inp >= 'a') && (*inp <= 'z')) || ((*inp >= '0') && (*inp <= '9')) ) { dsname[outidx++] = *inp; } /* ... however, for split ncv, we replace anything else */ /* with an underscore, compacting successive invalid */ /* characters into a single one */ else if (split_ncv && ((outidx == 0) || (dsname[outidx - 1] != '_'))) { dsname[outidx++] = '_'; } } if ((outidx > 0) && (dsname[outidx-1] == '_')) { dsname[outidx-1] = '\0'; } else { dsname[outidx] = '\0'; } snprintf(dskey, sizeof(dskey), ",%s:", dsname); if (split_ncv) setupfn2("%s,%s.rrd", testname, dsname); if (dstypes) { dstype = strstr(dstypes, dskey); if (!dstype) { strcpy(dskey, ",*:"); dstype = strstr(dstypes, dskey); } } if (dstype) { /* if ds type is forced */ char *p; dstype += strlen(dskey); p = strchr(dstype, ','); if (p) *p = '\0'; if(split_ncv) { snprintf(dsdef, sizeof(dsdef), "DS:lambda:%s:600:U:U", dstype); } else { snprintf(dsdef, sizeof(dsdef), "DS:%s:%s:600:U:U", dsname, dstype); } if (p) *p = ','; } else { /* nothing specified in the environnement, and no '*:' default */ if(split_ncv) { strcpy(dsdef, "DS:lambda:DERIVE:600:U:U"); } else { snprintf(dsdef, sizeof(dsdef), "DS:%s:DERIVE:600:U:U", dsname); } } if (!dstype || (strncasecmp(dstype, "NONE", 4) != 0)) { /* if we have something */ params[paridx] = strdup(dsdef); paridx++; params = (char **)realloc(params, (1 + paridx)*sizeof(char *)); params[paridx] = NULL; snprintf(rrdvalues+strlen(rrdvalues), sizeof(rrdvalues)-strlen(rrdvalues), ":%s", val); } } if (split_ncv && (paridx > 0)) { create_and_update_rrd(hostname, testname, classname, pagepaths, params, NULL); /* We've created one RRD, so reset the params for the next one */ for (paridx=0; (params[paridx] != NULL); paridx++) xfree(params[paridx]); paridx = 0; params[0] = NULL; snprintf(rrdvalues, sizeof(rrdvalues), "%d", (int)tstamp); } } } /* end of while */ if (!split_ncv && params[0]) create_and_update_rrd(hostname, testname, classname, pagepaths, params, NULL); for (paridx=0; (params[paridx] != NULL); paridx++) xfree(params[paridx]); xfree(params); if (dstypes) xfree(dstypes); return 0; } xymon-4.3.28/xymond/rrd/do_net.c0000664000076400007640000001226712603142505016741 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char do_net_rcsid[] = "$Id: do_net.c 7676 2015-10-01 05:31:49Z jccleaver $"; int do_net_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *xymonnet_params[] = { "DS:sec:GAUGE:600:0:U", NULL }; static void *xymonnet_tpl = NULL; char *p; float seconds = 0.0; int do_default = 1; if (xymonnet_tpl == NULL) xymonnet_tpl = setup_template(xymonnet_params); if (strcmp(testname, "http") == 0) { char *line1, *url = NULL, *eoln; do_default = 0; line1 = msg; while ((line1 = strchr(line1, '\n')) != NULL) { line1++; /* Skip the newline */ eoln = strchr(line1, '\n'); if (eoln) *eoln = '\0'; if ( (strncmp(line1, "&green", 6) == 0) || (strncmp(line1, "&yellow", 7) == 0) || (strncmp(line1, "&red", 4) == 0) ) { p = strstr(line1, "http"); if (p) { url = xstrdup(p); p = strchr(url, ' '); if (p) *p = '\0'; } } else if (url && ((p = strstr(line1, "Seconds:")) != NULL) && (sscanf(p, "Seconds: %f", &seconds) == 1)) { char *urlfn = url; if (strncmp(urlfn, "http://", 7) == 0) urlfn += 7; p = urlfn; while ((p = strchr(p, '/')) != NULL) *p = ','; setupfn3("%s.%s.%s.rrd", "tcp", "http", urlfn); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%.2f", (int)tstamp, seconds); create_and_update_rrd(hostname, testname, classname, pagepaths, xymonnet_params, xymonnet_tpl); xfree(url); url = NULL; } if (eoln) *eoln = '\n'; } if (url) xfree(url); } else if (strcmp(testname, xgetenv("PINGCOLUMN")) == 0) { /* * Ping-tests, possibly using fping. */ char *tmod = "ms"; do_default = 0; if ((p = strstr(msg, "time=")) != NULL) { /* Standard ping, reports ".... time=0.2 ms" */ seconds = atof(p+5); tmod = p + 5; tmod += strspn(tmod, "0123456789. "); } else if ((p = strstr(msg, "alive")) != NULL) { /* fping, reports ".... alive (0.43 ms)" */ seconds = atof(p+7); tmod = p + 7; tmod += strspn(tmod, "0123456789. "); } if (strncmp(tmod, "ms", 2) == 0) seconds = seconds / 1000.0; else if (strncmp(tmod, "usec", 4) == 0) seconds = seconds / 1000000.0; setupfn2("%s.%s.rrd", "tcp", testname); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%.6f", (int)tstamp, seconds); return create_and_update_rrd(hostname, testname, classname, pagepaths, xymonnet_params, xymonnet_tpl); } else if (strcmp(testname, "ntp") == 0) { /* * sntp output: * 2009 Nov 13 11:29:10.000313 + 0.038766 +/- 0.052900 secs * ntpdate output: * server 172.16.10.2, stratum 3, offset -0.040324, delay 0.02568 * 13 Nov 11:29:06 ntpdate[7038]: adjust time server 172.16.10.2 offset -0.040324 sec */ char dataforntpstat[100]; char *offsetval = NULL; char offsetbuf[40]; char *msgcopy = strdup(msg); if (strstr(msgcopy, "ntpdate") != NULL) { /* Old-style "ntpdate" output */ char *p; p = strstr(msgcopy, "offset "); if (p) { p += 7; offsetval = strtok(p, " \r\n\t"); } } else if (strstr(msgcopy, " secs") != NULL) { /* Probably new "sntp" output */ char *year, *tm, *offsetdirection, *offset, *plusminus, *errorbound, *secs; tm = offsetdirection = plusminus = errorbound = secs = NULL; year = strtok(msgcopy, " "); tm = year ? strtok(NULL, " ") : NULL; offsetdirection = tm ? strtok(NULL, " ") : NULL; offset = offsetdirection ? strtok(NULL, " ") : NULL; plusminus = offset ? strtok(NULL, " ") : NULL; errorbound = plusminus ? strtok(NULL, " ") : NULL; secs = errorbound ? strtok(NULL, " ") : NULL; if ( offsetdirection && ((strcmp(offsetdirection, "+") == 0) || (strcmp(offsetdirection, "-") == 0)) && plusminus && (strcmp(plusminus, "+/-") == 0) && secs && (strcmp(secs, "secs") == 0) ) { /* Looks sane */ snprintf(offsetbuf, sizeof(offsetbuf), "%s%s", offsetdirection, offset); offsetval = offsetbuf; } } if (offsetval) { snprintf(dataforntpstat, sizeof(dataforntpstat), "offset=%s", offsetval); do_ntpstat_rrd(hostname, testname, classname, pagepaths, dataforntpstat, tstamp); } xfree(msgcopy); } if (do_default) { /* * Normal network tests - pick up the "Seconds:" value */ p = strstr(msg, "\nSeconds:"); if (p && (sscanf(p+1, "Seconds: %f", &seconds) == 1)) { setupfn2("%s.%s.rrd", "tcp", testname); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%f", (int)tstamp, seconds); return create_and_update_rrd(hostname, testname, classname, pagepaths, xymonnet_params, xymonnet_tpl); } } return 0; } xymon-4.3.28/xymond/rrd/do_vmstat.c0000664000076400007640000002702012263073410017462 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char vmstat_rcsid[] = "$Id: do_vmstat.c 7334 2014-01-07 21:52:08Z storner $"; typedef struct vmstat_layout_t { int index; char *name; } vmstat_layout_t; /* This one matches the vmstat output from Solaris 8, possibly earlier ones as well */ /* LARRD 0.43c compatible. */ static vmstat_layout_t vmstat_solaris_layout[] = { { 0, "cpu_r" }, { 1, "cpu_b" }, { 2, "cpu_w" }, { 3, "mem_swap" }, { 4, "mem_free" }, { 5, "mem_re" }, { 6, "mem_mf" }, { 7, "mem_pi" }, { 8, "mem_po" }, { 11, "sr" }, { 16, "cpu_int" }, { 17, "cpu_syc" }, { 18, "cpu_csw" }, { 19, "cpu_usr" }, { 20, "cpu_sys" }, { 21, "cpu_idl" }, { -1, NULL } }; /* This one for OSF */ /* LARRD 0.43c compatible */ static vmstat_layout_t vmstat_osf_layout[] = { { 0, "cpu_r" }, { 1, "cpu_b" }, { 2, "cpu_w" }, { 4, "mem_free" }, { 6, "mem_mf" }, { 10, "mem_pi" }, { 11, "mem_po" }, { 12, "cpu_int" }, { 13, "cpu_syc" }, { 14, "cpu_csw" }, { 15, "cpu_usr" }, { 16, "cpu_sys" }, { 17, "cpu_idl" }, { -1, NULL } }; /* This one for AIX */ /* LARRD 0.43c compatible */ static vmstat_layout_t vmstat_aix_layout[] = { { 0, "cpu_r" }, { 1, "cpu_b" }, { 2, "mem_avm" }, { 3, "mem_free" }, { 4, "mem_re" }, { 5, "mem_pi" }, { 6, "mem_po" }, { 7, "mem_fr" }, { 8, "sr" }, { 9, "mem_cy" }, { 10, "cpu_int" }, { 11, "cpu_syc" }, { 12, "cpu_csw" }, { 13, "cpu_usr" }, { 14, "cpu_sys" }, { 15, "cpu_idl" }, { 16, "cpu_wait" }, { -1, NULL } }; /* This is for AIX running on Power5 cpu's. */ static vmstat_layout_t vmstat_aix_power5_layout[] = { { 0, "cpu_r" }, { 1, "cpu_b" }, { 2, "mem_avm" }, { 3, "mem_free" }, { 4, "mem_re" }, { 5, "mem_pi" }, { 6, "mem_po" }, { 7, "mem_fr" }, { 8, "sr" }, { 9, "mem_cy" }, { 10, "cpu_int" }, { 11, "cpu_syc" }, { 12, "cpu_csw" }, { 13, "cpu_usr" }, { 14, "cpu_sys" }, { 15, "cpu_idl" }, { 16, "cpu_wait" }, { 17, "cpu_pc" }, { 18, "cpu_ec" }, { -1, NULL } }; /* This one for Christian Perrier's hacked IRIX "vmstat" done with sar */ static vmstat_layout_t vmstat_irix_layout[] = { { 1, "cpu_usr" }, { 2, "cpu_sys" }, { 3, "cpu_int" }, { 4, "cpu_wait" }, { 5, "cpu_idl" }, { -1, "cpu_csw" }, /* Not available, but having it in the RRD makes vmstat3 graph (int+csw) work */ { -1, NULL } }; /* This one matches FreeBSD 4.10 */ /* LARRD 0.43c compatible */ static vmstat_layout_t vmstat_freebsd4_layout[] = { { 0, "cpu_r" }, { 1, "cpu_b" }, { 2, "cpu_w" }, { 3, "mem_avm" }, { 4, "mem_free" }, { 5, "mem_flt" }, { 6, "mem_re" }, { 7, "mem_pi" }, { 8, "mem_po" }, { 9, "mem_fr" }, { 10, "sr" }, { 11, "dsk_da0" }, { 12, "dsk_fd0" }, { 13, "cpu_int" }, { 15, "cpu_csw" }, { 16, "cpu_sys" }, { 17, "cpu_usr" }, { 18, "cpu_idl" }, { -1, NULL } }; /* FreeBSD v6 and later, possibly v5 also */ static vmstat_layout_t vmstat_freebsd_layout[] = { { 0, "cpu_r" }, { 1, "cpu_b" }, { 2, "cpu_w" }, { 3, "mem_avm" }, { 4, "mem_free" }, { 5, "mem_flt" }, { 6, "mem_re" }, { 7, "mem_pi" }, { 8, "mem_po" }, { 9, "mem_fr" }, { 10, "sr" }, { 11, "dsk_da0" }, { 12, "dsk_pa0" }, { 13, "cpu_int" }, { 14, "cpu_syc" }, { 15, "cpu_csw" }, { 16, "cpu_usr" }, { 17, "cpu_sys" }, { 18, "cpu_idl" }, { -1, NULL } }; /* This one matches NetBSD 2.0 */ /* LARRD 0.43c does not support NetBSD */ static vmstat_layout_t vmstat_netbsd_layout[] = { { 0, "cpu_r" }, { 1, "cpu_b" }, { 2, "cpu_w" }, { 3, "mem_avm" }, { 4, "mem_free" }, { 5, "mem_flt" }, { 6, "mem_re" }, { 7, "mem_pi" }, { 8, "mem_po" }, { 9, "mem_fr" }, { 10, "sr" }, { 11, "dsk_f0" }, { 12, "dsk_m0" }, { 13, "dsk_w0" }, { 14, "cpu_int" }, { 15, "cpu_syc" }, { 16, "cpu_csw" }, { 17, "cpu_usr" }, { 18, "cpu_sys" }, { 19, "cpu_idl" }, { -1, NULL } }; static vmstat_layout_t vmstat_openbsd_layout[] = { { 0, "cpu_r" }, { 1, "cpu_b" }, { 2, "cpu_w" }, { 3, "mem_avm" }, { 4, "mem_free" }, { 5, "mem_flt" }, { 6, "mem_re" }, { 7, "mem_pi" }, { 8, "mem_po" }, { 9, "mem_fr" }, { 10, "sr" }, { 11, "dsk_wd0" }, { 12, "dsk_cd0" }, { 13, "cpu_int" }, { 14, "cpu_syc" }, { 15, "cpu_csw" }, { 16, "cpu_usr" }, { 17, "cpu_sys" }, { 18, "cpu_idl" }, { -1, NULL } }; /* This one for HP/UX */ /* LARRD 0.43c does not support HP-UX */ static vmstat_layout_t vmstat_hpux_layout[] = { { 0, "cpu_r" }, { 1, "cpu_b" }, { 2, "cpu_w" }, { 3, "mem_avm" }, { 4, "mem_free" }, { 5, "mem_re" }, { 6, "mem_flt" }, { 7, "mem_pi" }, { 8, "mem_po" }, { 9, "mem_fr" }, { 11, "sr" }, { 12, "cpu_int" }, { 14, "cpu_csw" }, { 15, "cpu_usr" }, { 16, "cpu_sys" }, { 17, "cpu_idl" }, { -1, NULL } }; /* This one is all newer Linux procps versions, with kernel 2.4+ */ /* NOT compatible with LARRD 0.43c */ static vmstat_layout_t vmstat_linux_layout[] = { { 0, "cpu_r" }, { 1, "cpu_b" }, { -1, "cpu_w" }, /* Not present for 2.4+ kernels, so log as "Undefined" */ { 2, "mem_swpd" }, { 3, "mem_free" }, { 4, "mem_buff" }, { 5, "mem_cach" }, { 6, "mem_si" }, { 7, "mem_so" }, { 8, "dsk_bi" }, { 9, "dsk_bo" }, { 10, "cpu_int" }, { 11, "cpu_csw" }, { 12, "cpu_usr" }, { 13, "cpu_sys" }, { 14, "cpu_idl" }, { 15, "cpu_wait" }, /* Requires kernel 2.6, but may not be present */ { -1, NULL } }; /* * This one is for Red Hat Enterprise Linux 3. Identical to the "linux" layout, * except Red Hat for some reason decided to swap the cpu_wait and cpu_idle columns. */ /* NOT compatible with LARRD 0.43c */ static vmstat_layout_t vmstat_rhel3_layout[] = { { 0, "cpu_r" }, { 1, "cpu_b" }, { -1, "cpu_w" }, { 2, "mem_swpd" }, { 3, "mem_free" }, { 4, "mem_buff" }, { 5, "mem_cach" }, { 6, "mem_si" }, { 7, "mem_so" }, { 8, "dsk_bi" }, { 9, "dsk_bo" }, { 10, "cpu_int" }, { 11, "cpu_csw" }, { 12, "cpu_usr" }, { 13, "cpu_sys" }, { 14, "cpu_wait" }, { 15, "cpu_idl" }, { -1, NULL } }; /* This one is for Debian 3.0 (Woody), and possibly others with a Linux 2.2 kernel */ /* NOT compatible with LARRD 0.43c */ static vmstat_layout_t vmstat_linux22_layout[] = { { 0, "cpu_r" }, { 1, "cpu_b" }, { 2, "cpu_w" }, { 3, "mem_swpd" }, { 4, "mem_free" }, { 5, "mem_buff" }, { 6, "mem_cach" }, { 7, "mem_si" }, { 8, "mem_so" }, { 9, "dsk_bi" }, { 10, "dsk_bo" }, { 11, "cpu_int" }, { 12, "cpu_csw" }, { 13, "cpu_usr" }, { 14, "cpu_sys" }, { 15, "cpu_idl" }, { -1, "cpu_wait" }, { -1, NULL } }; /*This one is for sco_sv */ /* NOT compatible with LARRD 0.43c */ static vmstat_layout_t vmstat_sco_sv_layout[] = { { 0, "cpu_r" }, { 1, "cpu_b" }, { 2, "cpu_w" }, { 3, "mem_free" }, { 4, "mem_dmd" }, { 5, "mem_swpd" }, { 6, "mem_cach" }, { 7, "mem_fil" }, { 8, "mem_flt" }, { 9, "mem_frd" }, { 10, "mem_pos" }, { 11, "mem_pif" }, { 12, "mem_pis" }, { 13, "mem_so" }, { 14, "mem_si" }, { 15, "sys_calls" }, { 16, "cpu_csw" }, { 17, "cpu_usr" }, { 18, "cpu_sys" }, { 19, "cpu_idl" }, /* { -1, "cpu_wait" }, */ { -1, NULL } }; #define MAX_VMSTAT_VALUES 30 int do_vmstat_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { enum ostype_t ostype; vmstat_layout_t *layout = NULL; char *datapart = msg; int values[MAX_VMSTAT_VALUES]; int defcount, defidx, datacount, result; char *p; char **creparams; if ((strncmp(msg, "status", 6) == 0) || (strncmp(msg, "data", 4) == 0)) { /* Full message, including "status" or "data" line - so skip the first line. */ datapart = strchr(msg, '\n'); if (datapart) { datapart++; } else { errprintf("Too few lines (only 1) in vmstat report from %s\n", hostname); return -1; } } ostype = get_ostype(datapart); datapart = strchr(datapart, '\n'); if (datapart) { datapart++; } else { errprintf("Too few lines (only 1 or 2) in vmstat report from %s\n", hostname); return -1; } /* Pick up the values in the datapart line. Stop at newline. */ p = strchr(datapart, '\n'); if (p) *p = '\0'; p = strtok(datapart, " "); datacount = 0; while (p && (datacount < MAX_VMSTAT_VALUES)) { values[datacount++] = atoi(p); p = strtok(NULL, " "); } /* Must do this now, to check on the layout of any existing file */ setupfn("%s.rrd", "vmstat"); switch (ostype) { case OS_SOLARIS: layout = vmstat_solaris_layout; break; case OS_OSF: layout = vmstat_osf_layout; break; case OS_AIX: /* Special, because there are two layouts for AIX */ { char **dsnames = NULL; int dscount, i; dscount = rrddatasets(hostname, &dsnames); layout = ((dscount == 17) ? vmstat_aix_layout : vmstat_aix_power5_layout); if ((dscount > 0) && dsnames) { /* Free the dsnames list */ for (i=0; (i 0) && dsnames) { /* Free the dsnames list */ for (i=0; (i= datacount) || (dataidx == -1)) { p += snprintf(p, sizeof(rrdvalues)-(p-rrdvalues), ":U"); } else { p += snprintf(p, sizeof(rrdvalues)-(p-rrdvalues), ":%d", values[layout[defidx].index]); } } result = create_and_update_rrd(hostname, testname, classname, pagepaths, creparams, NULL); for (defidx=0; (defidx < defcount); defidx++) xfree(creparams[defidx]); xfree(creparams); return result; } xymon-4.3.28/xymond/rrd/do_devmon.c0000664000076400007640000000770213033575046017451 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module for Devmon */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* Copyright (C) 2008 Buchan Milne */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char devmon_rcsid[] = "$Id $"; int do_devmon_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { #define MAXCOLS 20 char *devmon_params[MAXCOLS+7] = { NULL, }; char *eoln, *curline; static int ptnsetup = 0; static pcre *inclpattern = NULL; static pcre *exclpattern = NULL; int in_devmon = 1; int numds = 0; char *rrdbasename; int lineno = 0; rrdbasename = NULL; curline = msg; while (curline) { char *fsline = NULL; char *p; char *columns[MAXCOLS]; int columncount; char *ifname = NULL; int pused = -1; int wanteddisk = 1; long long aused = 0; char *dsval; int i; eoln = strchr(curline, '\n'); if (eoln) *eoln = '\0'; lineno++; if(!strncmp(curline, "",3)) { in_devmon = 1; goto nextline; } if (in_devmon != 0 ) goto nextline; for (columncount=0; (columncount 2) { dbgprintf("Skipping line %d, found %d (max 2) columns in devmon rrd data, space in repeater name?\n",lineno,columncount); goto nextline; } /* Now we should be on to values: * eth0.0 4678222:9966777 */ ifname = xstrdup(columns[0]); dsval = strtok(columns[1],":"); if (dsval == NULL) { dbgprintf("Skipping line %d, line is malformed\n",lineno); goto nextline; } snprintf(rrdvalues, sizeof(rrdvalues), "%d:", (int)tstamp); strcat(rrdvalues,dsval); for (i=1;i < numds;i++) { dsval = strtok(NULL,":"); if (dsval == NULL) { dbgprintf("Skipping line %d, %d tokens present, expecting %d\n",lineno,i,numds); goto nextline; } strcat(rrdvalues,":"); strcat(rrdvalues,dsval); } /* File names in the format if_load.eth0.0.rrd */ setupfn2("%s.%s.rrd", rrdbasename, ifname); dbgprintf("Sending from devmon to RRD for %s %s: %s\n",rrdbasename,ifname,rrdvalues); create_and_update_rrd(hostname, testname, classname, pagepaths, devmon_params, NULL); if (ifname) { xfree(ifname); ifname = NULL; } if (eoln) *eoln = '\n'; nextline: if (fsline) { xfree(fsline); fsline = NULL; } curline = (eoln ? (eoln+1) : NULL); } return 0; } xymon-4.3.28/xymond/rrd/do_memory.c0000664000076400007640000002340512010437142017453 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char memory_rcsid[] = "$Id: do_memory.c 7167 2012-08-08 10:24:34Z storner $"; static char *memory_params[] = { "DS:realmempct:GAUGE:600:0:U", NULL }; static void *memory_tpl = NULL; /* * Use the R/B tree to hold names of the hosts * that we receive "memory" status from. When handling * "cpu" reports, those hosts that are in the tree do * NOT take memory data from the cpu data. */ void * memhosts; int memhosts_init = 0; static int get_mem_percent(char *l) { char *p; p = strchr(l, '%'); if (p == NULL) return 0; p--; while ( (p > l) && (isdigit((int) *p) || (*p == '.')) ) p--; return atoi(p+1); } void do_memory_rrd_update(time_t tstamp, char *hostname, char *testname, char *classname, char *pagepaths, int physval, int swapval, int actval) { if (memory_tpl == NULL) memory_tpl = setup_template(memory_params); setupfn2("%s.%s.rrd", "memory", "real"); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, physval); create_and_update_rrd(hostname, testname, classname, pagepaths, memory_params, memory_tpl); setupfn2("%s.%s.rrd", "memory", "swap"); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, swapval); create_and_update_rrd(hostname, testname, classname, pagepaths, memory_params, memory_tpl); if ((actval >= 0) && (actval <= 100)) { setupfn2("%s.%s.rrd", "memory", "actual"); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, actval); create_and_update_rrd(hostname, testname, classname, pagepaths, memory_params, memory_tpl); } } /* bb-xsnmp.pl memory update - Marco Avvisano */ void do_memory_rrd_update_router(time_t tstamp, char *hostname, char *testname, char *classname, char *pagepaths, int procval, int ioval, int fastval) { if (memory_tpl == NULL) memory_tpl = setup_template(memory_params); if ((procval >= 0) && (procval <= 100)) { setupfn2("%s.%s.rrd", "memory", "processor"); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, procval); create_and_update_rrd(hostname, testname, classname, pagepaths, memory_params, memory_tpl); } if ((ioval >= 0) && (ioval <= 100)) { setupfn2("%s.%s.rrd", "memory", "io"); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, ioval); create_and_update_rrd(hostname, testname, classname, pagepaths, memory_params, memory_tpl); } if ((fastval >= 0) && (fastval <= 100)) { setupfn2("%s.%s.rrd", "memory", "fast"); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, fastval); create_and_update_rrd(hostname, testname, classname, pagepaths, memory_params, memory_tpl); } } int do_memory_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { char *phys = NULL; char *swap = NULL; char *actual = NULL; xtreePos_t hwalk; /* Log this hostname in the list of hosts we get true "memory" reports from. */ if (!memhosts_init) { memhosts = xtreeNew(strcmp); memhosts_init = 1; } hwalk = xtreeFind(memhosts, hostname); if (hwalk == xtreeEnd(memhosts)) { char *keyp = xstrdup(hostname); if (xtreeAdd(memhosts, keyp, NULL)) { errprintf("Insert into memhosts failed\n"); } } if (strstr(msg, "z/OS Memory Map")) { long j1, j2, j3; int csautil, ecsautil, sqautil, esqautil; char *p; /* z/OS Memory Utilization: Area Alloc Used HWM Util CSA 3524 3034 3436 86.1 ECSA 20172 19979 20014 99.0 SQA 1540 222 399 14.4 ESQA 13988 4436 4726 31.7 */ p = strstr(msg, "CSA ") + 4; if (p) { sscanf(p, "%ld %ld %ld %d", &j1, &j2, &j3, &csautil); } p = strstr(msg, "ECSA ") + 5; if (p) { sscanf(p, "%ld %ld %ld %d", &j1, &j2, &j3, &ecsautil); } p = strstr(msg, "SQA ") + 4; if (p) { sscanf(p, "%ld %ld %ld %d", &j1, &j2, &j3, &sqautil); } p = strstr(msg, "ESQA ") + 5; if (p) { sscanf(p, "%ld %ld %ld %d", &j1, &j2, &j3, &esqautil); } if (memory_tpl == NULL) memory_tpl = setup_template(memory_params); setupfn2("%s.%s.rrd", "memory", "CSA"); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, csautil); create_and_update_rrd(hostname, testname, classname, pagepaths, memory_params, memory_tpl); setupfn2("%s.%s.rrd", "memory", "ECSA"); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, ecsautil); create_and_update_rrd(hostname, testname, classname, pagepaths, memory_params, memory_tpl); setupfn2("%s.%s.rrd", "memory", "SQA"); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, sqautil); create_and_update_rrd(hostname, testname, classname, pagepaths, memory_params, memory_tpl); setupfn2("%s.%s.rrd", "memory", "ESQA"); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, esqautil); create_and_update_rrd(hostname, testname, classname, pagepaths, memory_params, memory_tpl); return 0; } if (strstr(msg, "z/VSE VSIZE Utilization")) { char *p; float pctused; p = strstr(msg, "Utilization ") + 12; if (p) { sscanf(p, "%f%%", &pctused); } if (memory_tpl == NULL) memory_tpl = setup_template(memory_params); setupfn2("%s.%s.rrd", "memory", "vsize"); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, (int)pctused); create_and_update_rrd(hostname, testname, classname, pagepaths, memory_params, memory_tpl); return 0; } if (strstr(msg, "bb-xsnmp.pl")) { /* bb-xsnmp.pl memory update - Marco Avissano */ /* Cisco Routers memory report. * Aug 22 10:52:17 2006 * Memory Used Total Percentage * green Processor 2710556 13032864 20.80% * green I/O 1664400 4194304 39.68% * green Fast 1987024 8388608 23.69% */ char *proc, *io, *fast; proc = strstr(msg, "Processor"); if (proc == NULL) proc = strstr(msg, "Processor"); io = strstr(msg, "I/O"); if (io == NULL) io = strstr(msg, "I/O"); fast = strstr(msg, "Fast"); if (fast == NULL) fast = strstr(msg, "Fast"); if (proc) { char *eoln; int procval = -1, ioval = -1, fastval = -1; eoln = strchr(proc, '\n'); if (eoln) *eoln = '\0'; procval = get_mem_percent(proc); if (eoln) *eoln = '\n'; if (io) { eoln = strchr(io, '\n'); if (eoln) *eoln = '\0'; ioval = get_mem_percent(io); if (eoln) *eoln = '\n'; } if (fast) { eoln = strchr(fast, '\n'); if (eoln) *eoln = '\0'; fastval = get_mem_percent(fast); if (eoln) *eoln = '\n'; } do_memory_rrd_update_router(tstamp, hostname, testname, classname, pagepaths, procval, ioval, fastval); } return 0; } if (strstr(msg, "Total Cache Buffers")) { /* Netware nwstat2bb memory report. * * some.host.com|memory|green||1111681798|1111681982|1111699982|0|0|127.0.0.1|-1|| * green Thu Mar 24 17:33:02 CET 2005 - Memory OK * &green Original Cache Buffers : 326622 * &green Total Cache Buffers : 56% * &green Dirty Cache Buffers : 0% * &green Long Term Cache Hit Percentage : 0% * &green Least Recently Used (LRU) sitting time : 3 weeks, 2 days, 4 hours, 25 minutes, 36 seconds */ char *p; int val; p = strstr(msg, "Total Cache Buffers"); if (p) { p = strchr(p, ':'); if (p) { val = atoi(p+1); setupfn2("%s.%s.rrd", "memory", "tcb"); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, val); create_and_update_rrd(hostname, testname, classname, pagepaths, memory_params, memory_tpl); } } p = strstr(msg, "Dirty Cache Buffers"); if (p) { p = strchr(p, ':'); if (p) { val = atoi(p+1); setupfn2("%s.%s.rrd", "memory", "dcb"); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, val); create_and_update_rrd(hostname, testname, classname, pagepaths, memory_params, memory_tpl); } } p = strstr(msg, "Long Term Cache Hit Percentage"); if (p) { p = strchr(p, ':'); if (p) { val = atoi(p+1); setupfn2("%s.%s.rrd", "memory", "ltch"); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, val); create_and_update_rrd(hostname, testname, classname, pagepaths, memory_params, memory_tpl); } } return 0; } else { phys = strstr(msg, "Physical"); if (phys == NULL) phys = strstr(msg, "Real"); swap = strstr(msg, "Swap"); if (swap == NULL) swap = strstr(msg, "Page"); actual = strstr(msg, "Actual"); if (actual == NULL) actual = strstr(msg, "Virtual"); if (phys) { char *eoln; int physval = -1, swapval = -1, actval = -1; eoln = strchr(phys, '\n'); if (eoln) *eoln = '\0'; physval = get_mem_percent(phys); if (eoln) *eoln = '\n'; if (swap) { eoln = strchr(swap, '\n'); if (eoln) *eoln = '\0'; swapval = get_mem_percent(swap); if (eoln) *eoln = '\n'; } if (actual) { eoln = strchr(actual, '\n'); if (eoln) *eoln = '\0'; actval = get_mem_percent(actual); if (eoln) *eoln = '\n'; } do_memory_rrd_update(tstamp, hostname, testname, classname, pagepaths, physval, swapval, actval); } } return 0; } xymon-4.3.28/xymond/rrd/do_cics.c0000664000076400007640000000433612000304667017072 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* This module handles "cics" messages. */ /* */ /* Copyright (C) 2006-2011 Henrik Storner */ /* Copyright (C) 2008 Rich Smrcina */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char cics_rcsid[] = "$Id: do_cics.c 6585 2010-11-14 15:12:56Z storner $"; static char *cicsntrans_params[] = { "DS:numtrans:GAUGE:600:0:U", NULL }; static char *cicsdsa_params[] = { "DS:dsa:GAUGE:600:0:100", "DS:edsa:GAUGE:600:0:100", NULL }; static char *cics_tpl = NULL; int do_cics_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { char *pr; char *fn = NULL; int numtrans; float dsapct, edsapct; char cicsappl[9], rrdfn[20]; pr=(strstr(msg, "Appl")); if (!pr) { return 0; } pr=(strstr(pr, "\n")); if (pr) { pr += 1; pr = strtok(pr, "\n"); while (pr != NULL) { sscanf(pr, "%s %d %f %f", cicsappl, &numtrans, &dsapct, &edsapct); snprintf(rrdfn, sizeof(rrdfn), "cics.%-s.rrd", cicsappl); setupfn(rrdfn, fn); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, numtrans); create_and_update_rrd(hostname, testname, classname, pagepaths, cicsntrans_params, cics_tpl); snprintf(rrdfn, sizeof(rrdfn), "dsa.%-s.rrd", cicsappl); setupfn(rrdfn, fn); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d:%d", (int)tstamp, (int)dsapct, (int)edsapct); create_and_update_rrd(hostname, testname, classname, pagepaths, cicsdsa_params, cics_tpl); pr = strtok(NULL, "\n"); } } return 0; } xymon-4.3.28/xymond/rrd/do_ifstat.c0000664000076400007640000003145612634277577017474 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char ifstat_rcsid[] = "$Id: do_ifstat.c 7847 2015-12-16 15:13:03Z jccleaver $"; static char *ifstat_params[] = { "DS:bytesSent:DERIVE:600:0:U", "DS:bytesReceived:DERIVE:600:0:U", NULL }; static void *ifstat_tpl = NULL; /* eth0 Link encap: */ /* RX bytes: 1829192 (265.8 MiB) TX bytes: 1827320 (187.7 MiB */ static const char *ifstat_linux_exprs[] = { "^([a-z0-9]+(_[0-9]+)?:*|lo:?)\\s", "^\\s+RX bytes:([0-9]+) .*TX bytes.([0-9]+) ", "^\\s+RX packets\\s+[0-9]+\\s+bytes\\s+([0-9]+) ", "^\\s+TX packets\\s+[0-9]+\\s+bytes\\s+([0-9]+) " }; /* Name Mtu Network Address Ipkts Ierrs Idrop Ibytes Opkts Oerrs Obytes Coll */ /* em0 1500 14:da:e9:d2:10:b8 505128976 54 0 610016288902 294395839 14 290951791879 0 */ /* tun0 1500 tun0 0 0 0 0 5 0 436 0 */ /* Note: FreeBSD 9 and 10 have a blank column for "Address" when the interface doesn't have a MAC address */ static const char *ifstat_freebsd_exprs[] = { "^([a-z0-9]+)\\s+\\d+\\s+\\s+.*\\s+\\d+\\s+[0-9-]+\\s+[0-9-]+\\s+(\\d+)\\s+\\d+\\s+[0-9-]+\\s+(\\d+)\\s+[0-9-]+" }; /* Name Mtu Network Address Ipkts Ierrs Idrop Ibytes Opkts Oerrs Obytes Coll */ /* bge0 1500 192.168.X.X 192.168.X.X 29292829 - - 1130285651 26543376 - 2832025203 - */ static const char *ifstat_freebsdV8_exprs[] = { "^([a-z0-9]+)\\s+\\d+\\s+[0-9.\\/]+\\s+[0-9.]+\\s+\\d+\\s+[0-9-]+\\s+[0-9-]+\\s+(\\d+)\\s+\\d+\\s+[0-9-]+\\s+(\\d+)\\s+[0-9-]+" }; /* Name MTU Network IP Ibytes Obytes */ /* lnc0 1500 172.16.10.0/24 172.16.10.151 1818 1802 */ static const char *ifstat_openbsd_exprs[] = { "^([a-z0-9]+)\\s+\\d+\\s+[0-9.\\/]+\\s+[0-9.]+\\s+(\\d+)\\s+(\\d+)" }; /* Name MTU Network IP Ibytes Obytes */ /* lnc0 1500 172.16.10.0/24 172.16.10.151 1818 1802 */ static const char *ifstat_netbsd_exprs[] = { "^([a-z0-9]+)\\s+\\d+\\s+[0-9.\\/]+\\s+[0-9.]+\\s+(\\d+)\\s+(\\d+)" }; /* Name Mtu Network Address Ipkts Ierrs Ibytes Opkts Oerrs Obytes Coll en0 1500 fe80::20d:9 fe80::20d:93ff:fe 2013711826 - 2131205566781 331648829 - 41815551289 - en0 1500 130.223.20/24 130.223.20.20 2013711826 - 2131205566781 331648829 - 41815551289 - */ static const char *ifstat_darwin_exprs[] = { "^([a-z0-9]+)\\s+\\d+\\s+[0-9.\\/]+\\s+[0-9.]+\\s+\\d+\\s+[0-9-]+\\s+(\\d+)\\s+\\d+\\s+[0-9-]+\\s+(\\d+)\\s+[0-9-]+" }; /* dmfe:0:dmfe0:obytes64 107901705585 */ /* dmfe:0:dmfe0:rbytes64 1224808818952 */ /* dmfe:1:dmfe1:obytes64 0 */ /* dmfe:1:dmfe1:rbytes64 0 */ static const char *ifstat_solaris_exprs[] = { "^[a-z0-9]+:\\d+:([a-z0-9]+):obytes64\\s+(\\d+)", "^[a-z0-9]+:\\d+:([a-z0-9]+):rbytes64\\s+(\\d+)" }; /* ETHERNET STATISTICS (ent0) : Device Type: 2-Port 10/100/1000 Base-TX PCI-X Adapter (14108902) Hardware Address: 00:11:25:e6:0d:36 Elapsed Time: 45 days 20 hours 18 minutes 41 seconds Transmit Statistics: Receive Statistics: -------------------- ------------------- Packets: 1652404 Packets: 768800 Bytes: 1966314449 Bytes: 78793615 */ static const char *ifstat_aix_exprs[] = { "^ETHERNET STATISTICS \\(([a-z0-9]+)\\) :", "^Bytes:\\s+(\\d+)\\s+Bytes:\\s+(\\d+)" }; /* (lines dropped) PPA Number = 0 Description = lan0 Hewlett-Packard LAN Interface Hw Rev 0 Type (value) = ethernet-csmacd(6) MTU Size = 1500 Operation Status (value) = up(1) Inbound Octets = 3111235429 Outbound Octets = 3892111463 */ static const char *ifstat_hpux_exprs[] = { "^PPA Number\\s+= (\\d+)", "^Inbound Octets\\s+= (\\d+)", "^Outbound Octets\\s+= (\\d+)", }; /* Name Mtu Network Address Ipkts Ierrs Opkts Oerrs Coll net0 1500 195.75.9 10.1.1.2 13096313 0 12257642 0 0 lo0 8232 127 127.0.0.1 26191 0 26191 0 0 Attention, theses numbers are packets, not bytes ! */ static const char *ifstat_sco_sv_exprs[] = { "^([a-z]+[0-9]+)\\s+[0-9]+\\s+[0-9.]+\\s+[0-9.]+\\s+([0-9]+)\\s+[0-9]+\\s+([0-9]+)\\s+" }; /* IP Ibytes Obytes */ /* 192.168.0.1 1818 1802 */ static const char *ifstat_bbwin_exprs[] = { "^([a-zA-Z0-9.:]+)\\s+([0-9]+)\\s+([0-9]+)" }; int do_ifstat_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static int pcres_compiled = 0; static pcre **ifstat_linux_pcres = NULL; static pcre **ifstat_freebsd_pcres = NULL; static pcre **ifstat_freebsdV8_pcres = NULL; static pcre **ifstat_openbsd_pcres = NULL; static pcre **ifstat_netbsd_pcres = NULL; static pcre **ifstat_darwin_pcres = NULL; static pcre **ifstat_solaris_pcres = NULL; static pcre **ifstat_aix_pcres = NULL; static pcre **ifstat_hpux_pcres = NULL; static pcre **ifstat_sco_sv_pcres = NULL; static pcre **ifstat_bbwin_pcres = NULL; enum ostype_t ostype; char *datapart = msg; char *bol, *eoln, *ifname, *rxstr, *txstr, *dummy; int dmatch; void *xmh; pcre *ifname_filter_pcre = NULL; xmh = hostinfo(hostname); if (xmh) { char *ifname_filter_expr = xmh_item(xmh, XMH_INTERFACES); if (ifname_filter_expr && *ifname_filter_expr) ifname_filter_pcre = compileregex(ifname_filter_expr); } if (pcres_compiled == 0) { pcres_compiled = 1; ifstat_linux_pcres = compile_exprs("LINUX", ifstat_linux_exprs, (sizeof(ifstat_linux_exprs) / sizeof(ifstat_linux_exprs[0]))); ifstat_freebsd_pcres = compile_exprs("FREEBSD", ifstat_freebsd_exprs, (sizeof(ifstat_freebsd_exprs) / sizeof(ifstat_freebsd_exprs[0]))); ifstat_freebsdV8_pcres = compile_exprs("FREEBSD", ifstat_freebsdV8_exprs, (sizeof(ifstat_freebsdV8_exprs) / sizeof(ifstat_freebsdV8_exprs[0]))); ifstat_openbsd_pcres = compile_exprs("OPENBSD", ifstat_openbsd_exprs, (sizeof(ifstat_openbsd_exprs) / sizeof(ifstat_openbsd_exprs[0]))); ifstat_netbsd_pcres = compile_exprs("NETBSD", ifstat_netbsd_exprs, (sizeof(ifstat_netbsd_exprs) / sizeof(ifstat_netbsd_exprs[0]))); ifstat_darwin_pcres = compile_exprs("DARWIN", ifstat_darwin_exprs, (sizeof(ifstat_darwin_exprs) / sizeof(ifstat_darwin_exprs[0]))); ifstat_solaris_pcres = compile_exprs("SOLARIS", ifstat_solaris_exprs, (sizeof(ifstat_solaris_exprs) / sizeof(ifstat_solaris_exprs[0]))); ifstat_aix_pcres = compile_exprs("AIX", ifstat_aix_exprs, (sizeof(ifstat_aix_exprs) / sizeof(ifstat_aix_exprs[0]))); ifstat_hpux_pcres = compile_exprs("HPUX", ifstat_hpux_exprs, (sizeof(ifstat_hpux_exprs) / sizeof(ifstat_hpux_exprs[0]))); ifstat_sco_sv_pcres = compile_exprs("SCO_SV", ifstat_sco_sv_exprs, (sizeof(ifstat_sco_sv_exprs) / sizeof(ifstat_sco_sv_exprs[0]))); ifstat_bbwin_pcres = compile_exprs("BBWIN", ifstat_bbwin_exprs, (sizeof(ifstat_bbwin_exprs) / sizeof(ifstat_bbwin_exprs[0]))); } if (ifstat_tpl == NULL) ifstat_tpl = setup_template(ifstat_params); if ((strncmp(msg, "status", 6) == 0) || (strncmp(msg, "data", 4) == 0)) { /* Skip the first line of full status- and data-messages. */ datapart = strchr(msg, '\n'); if (datapart) datapart++; else datapart = msg; } ostype = get_ostype(datapart); datapart = strchr(datapart, '\n'); if (datapart) { datapart++; } else { errprintf("Too few lines in ifstat report from %s\n", hostname); return -1; } dmatch = 0; ifname = rxstr = txstr = dummy = NULL; bol = datapart; while (bol) { eoln = strchr(bol, '\n'); if (eoln) *eoln = '\0'; switch (ostype) { case OS_LINUX22: case OS_LINUX: case OS_RHEL3: case OS_ZVM: case OS_ZVSE: case OS_ZOS: if (pickdata(bol, ifstat_linux_pcres[0], 1, &ifname)) { /* * Linux' netif aliases mess up things. * Clear everything when we see an interface name. * But we don't want to track the "lo" interface. */ /* Strip off the last character if it is a colon (:) */ if (ifname[strlen(ifname)-1] == ':') ifname[strlen(ifname)-1] = '\0'; if (strcmp(ifname, "lo") == 0) { xfree(ifname); ifname = NULL; } else { dmatch = 1; if (rxstr) { xfree(rxstr); rxstr = NULL; } if (txstr) { xfree(txstr); txstr = NULL; } } } else if (pickdata(bol, ifstat_linux_pcres[1], 1, &rxstr, &txstr)) dmatch |= 6; else if (pickdata(bol, ifstat_linux_pcres[2], 1, &rxstr)) dmatch |= 2; else if (pickdata(bol, ifstat_linux_pcres[3], 1, &txstr)) dmatch |= 4; break; case OS_FREEBSD: /* * FreeBSD 8 added an "Idrop" counter in the middle of the data. * See if we match this expression, and if not then fall back to * the old regex without that field. */ if (pickdata(bol, ifstat_freebsdV8_pcres[0], 0, &ifname, &rxstr, &txstr)) dmatch = 7; else if (pickdata(bol, ifstat_freebsd_pcres[0], 0, &ifname, &rxstr, &txstr)) dmatch = 7; break; case OS_OPENBSD: if (pickdata(bol, ifstat_openbsd_pcres[0], 0, &ifname, &rxstr, &txstr)) dmatch = 7; break; case OS_NETBSD: if (pickdata(bol, ifstat_netbsd_pcres[0], 0, &ifname, &rxstr, &txstr)) dmatch = 7; break; case OS_SOLARIS: if (pickdata(bol, ifstat_solaris_pcres[0], 0, &ifname, &txstr)) dmatch |= 1; else if (pickdata(bol, ifstat_solaris_pcres[1], 0, &dummy, &rxstr)) dmatch |= 6; if (ifname && dummy && (strcmp(ifname, dummy) != 0)) { /* They must match, drop the data */ errprintf("Host %s has weird ifstat data - device name mismatch %s:%s\n", hostname, ifname, dummy); xfree(ifname); xfree(txstr); xfree(rxstr); xfree(dummy); dmatch = 0; } /* Ignore "mac" and "wrsmd" entries - these are for sub-devices for multiple nic's aggregated into one */ /* See http://www.xymon.com/archive/2009/06/msg00204.html for more info */ if (ifname && ((strcmp(ifname, "mac") == 0) || (strcmp(ifname, "wrsmd") == 0)) ) { xfree(ifname); xfree(txstr); dmatch = 0; } if (dummy && ((strcmp(dummy, "mac") == 0) || (strcmp(dummy, "wrsmd") == 0)) ) { xfree(dummy); xfree(rxstr); dmatch = 0; } break; case OS_AIX: if (pickdata(bol, ifstat_aix_pcres[0], 1, &ifname)) { /* Interface names comes first, so any rx/tx data is discarded */ dmatch |= 1; if (rxstr) { xfree(rxstr); rxstr = NULL; } if (txstr) { xfree(txstr); txstr = NULL; } } else if (pickdata(bol, ifstat_aix_pcres[1], 1, &txstr, &rxstr)) dmatch |= 6; break; case OS_HPUX: if (pickdata(bol, ifstat_hpux_pcres[0], 1, &ifname)) { /* Interface names comes first, so any rx/tx data is discarded */ dmatch |= 1; if (rxstr) { xfree(rxstr); rxstr = NULL; } if (txstr) { xfree(txstr); txstr = NULL; } } else if (pickdata(bol, ifstat_hpux_pcres[1], 1, &rxstr)) dmatch |= 2; else if (pickdata(bol, ifstat_hpux_pcres[2], 1, &txstr)) dmatch |= 4; break; case OS_DARWIN: if (pickdata(bol, ifstat_darwin_pcres[0], 0, &ifname, &rxstr, &txstr)) dmatch = 7; break; case OS_SCO_SV: if (pickdata(bol, ifstat_sco_sv_pcres[0], 0, &ifname, &rxstr, &txstr)) dmatch = 7; break; case OS_WIN32_BBWIN: case OS_WIN_POWERSHELL: if (pickdata(bol, ifstat_bbwin_pcres[0], 0, &ifname, &rxstr, &txstr)) dmatch = 7; break; default: break; } if ((dmatch == 7) && ifname && rxstr && txstr) { if (!ifname_filter_pcre || matchregex(ifname, ifname_filter_pcre)) { setupfn2("%s.%s.rrd", "ifstat", ifname); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%s:%s", (int)tstamp, txstr, rxstr); create_and_update_rrd(hostname, testname, classname, pagepaths, ifstat_params, ifstat_tpl); } xfree(ifname); xfree(rxstr); xfree(txstr); if (dummy) xfree(dummy); ifname = rxstr = txstr = dummy = NULL; dmatch = 0; } if (eoln) { *eoln = '\n'; bol = eoln+1; if (*bol == '\0') bol = NULL; } else { bol = NULL; } } if (ifname_filter_pcre) freeregex(ifname_filter_pcre); if (ifname) xfree(ifname); if (rxstr) xfree(rxstr); if (txstr) xfree(txstr); if (dummy) xfree(dummy); return 0; } xymon-4.3.28/xymond/rrd/do_iostat.c0000664000076400007640000001642212000304667017453 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char iostat_rcsid[] = "$Id: do_iostat.c 7058 2012-07-14 15:01:11Z storner $"; static char *iostat_params[] = { "DS:rs:GAUGE:600:1:U", "DS:ws:GAUGE:600:1:U", "DS:krs:GAUGE:600:1:U", "DS:kws:GAUGE:600:1:U", "DS:wait:GAUGE:600:1:U", "DS:actv:GAUGE:600:1:U", "DS:wsvc_t:GAUGE:600:1:U", "DS:asvc_t:GAUGE:600:1:U", "DS:w:GAUGE:600:1:U", "DS:b:GAUGE:600:1:U", "DS:sw:GAUGE:600:1:U", "DS:hw:GAUGE:600:1:U", "DS:trn:GAUGE:600:1:U", "DS:tot:GAUGE:600:1:U", NULL }; static void *iostat_tpl = NULL; int do_iostatdisk_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { char *dataline; /* * This format is reported in the "iostatdisk" section: * * data HOSTNAME.iostatdisk * solaris * extended device statistics * device,r/s,w/s,kr/s,kw/s,wait,actv,svc_t,%w,%b, * dad0,a,0.0,0.7,0.0,5.8,0.0,0.0,4.3,0,0 * dad0,b,0.0,0.0,0.0,0.0,0.0,0.0,27.9,0,0 * dad0,c,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0 * dad0,e,0.0,0.6,0.0,4.1,0.0,0.0,3.7,0,0 * dad0,f,0.0,17.2,0.0,89.7,0.0,0.0,0.2,0,0 * dad0,h,0.0,0.5,0.0,2.7,0.0,0.0,2.2,0,0 * dad1,c,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0 * dad1,h,0.0,0.0,0.0,0.0,0.0,0.0,27.1,0,0 * nfs1,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0 * extended device statistics * device,r/s,w/s,kr/s,kw/s,wait,actv,svc_t,%w,%b, * dad0,a,0.0,0.6,0.0,5.1,0.0,0.0,4.2,0,0 * dad0,b,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0 * dad0,c,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0 * dad0,e,0.0,0.5,0.0,3.4,0.0,0.0,3.2,0,0 * dad0,f,0.0,12.6,0.0,65.6,0.0,0.0,0.2,0,0 * dad0,h,0.0,0.4,0.0,2.4,0.0,0.0,1.8,0,0 * dad1,c,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0 * dad1,h,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0 * nfs1,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0 * * There are two chunks of data: Like vmstat, we first get a * summary at the start of data collection, and then another * with the 5-minute average. So we must skip the first chunk. * * Note that real disks are identified by "dad0,a" whereas * NFS mounts show up as "nfs1" (no comma!). */ if (iostat_tpl == NULL) iostat_tpl = setup_template(iostat_params); dataline = strstr(msg, "\ndevice,r/s,w/s,kr/s,kw/s,wait,actv,svc_t,%w,%b,"); if (!dataline) return -1; dataline = strstr(dataline+1, "\ndevice,r/s,w/s,kr/s,kw/s,wait,actv,svc_t,%w,%b,"); if (!dataline) return -1; dataline++; while (dataline && *dataline) { char *elems[12]; char *eoln, *p, *id = ""; int i, valofs; eoln = strchr(dataline, '\n'); if (eoln) *eoln = '\0'; memset(elems, 0, sizeof(elems)); p = elems[0] = dataline; i=0; do { p = strchr(p+1, ','); i++; if (p) { *p = '\0'; elems[i] = p+1; } } while (p); if (elems[9] == NULL) goto nextline; else if (elems[10] == NULL) { /* NFS "disk" */ id = elems[0]; valofs = 1; } else { /* Normal disk - re-instate the "," between elems[0] and elems[1] */ *(elems[1]-1) = ','; /* Hack! */ valofs = 2; } setupfn2("%s.%s.rrd", "iostat", id); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s", (int) tstamp, elems[valofs], /* r/s */ elems[valofs+1], /* w/s */ elems[valofs+2], /* kr/s */ elems[valofs+3], /* kw/s */ elems[valofs+4], /* wait */ elems[valofs+5], /* actv */ elems[valofs+6], /* wsvc_t - we use svc_t here */ "U", /* asvc_t not in this format */ elems[valofs+7], /* %w */ elems[valofs+8], /* %b */ "U", "U", "U", "U" /* sw, hw, trn, tot not in this format */ ); nextline: dataline = (eoln ? eoln+1 : NULL); } return 0; } int do_iostat_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { /* * BEGINKEY * d0 / * d5 /var * d6 /export * ENDKEY * BEGINDATA * r/s w/s kr/s kw/s wait actv wsvc_t asvc_t %w %b s/w h/w trn tot device * 0.9 2.8 7.3 1.8 0.0 0.0 2.7 9.3 1 2 0 0 0 0 d0 * 0.1 0.3 0.8 0.5 0.0 0.0 5.2 11.0 0 0 0 0 0 0 d5 * 0.1 0.2 1.0 1.1 0.0 0.0 6.9 12.9 0 0 0 0 0 0 d6 * ENDDATA */ typedef struct iostatkey_t { char *key; char *value; struct iostatkey_t *next; } iostatkey_t; enum { S_NONE, S_KEYS, S_DATA } state; iostatkey_t *keyhead = NULL; iostatkey_t *newkey; char *eoln, *curline; char *buf, *p; float v[14]; char marker[MAX_LINE_LEN]; MEMDEFINE(marker); if (iostat_tpl == NULL) iostat_tpl = setup_template(iostat_params); curline = msg; state = S_NONE; while (curline) { eoln = strchr(curline, '\n'); if (eoln) *eoln = '\0'; if (strncmp(curline, "BEGINKEY", 8) == 0) { state = S_KEYS; } else if (strncmp(curline, "ENDKEY", 6) == 0) { state = S_NONE; } else if (strncmp(curline, "BEGINDATA", 9) == 0) { state = S_DATA; } else if (strncmp(curline, "ENDDATA", 7) == 0) { state = S_NONE; } else { switch (state) { case S_NONE: break; case S_KEYS: buf = xstrdup(curline); newkey = (iostatkey_t *)xcalloc(1, sizeof(iostatkey_t)); p = strtok(buf, " "); if (p) newkey->key = xstrdup(p); p = strtok(NULL, " "); if (p) { if (strcmp(p, "/") == 0) newkey->value = xstrdup(",root"); else { newkey->value = xstrdup(p); p = newkey->value; while ((p = strchr(p, '/')) != NULL) *p = ','; } } xfree(buf); if (newkey->key && newkey->value) { newkey->next = keyhead; keyhead = newkey; } else { if (newkey->key) xfree(newkey->key); if (newkey->value) xfree(newkey->value); xfree(newkey); } break; case S_DATA: buf = xstrdup(curline); if (sscanf(buf, "%f %f %f %f %f %f %f %f %f %f %f %f %f %f %s", &v[0], &v[1], &v[2], &v[3], &v[4], &v[5], &v[6], &v[7], &v[8], &v[9], &v[10], &v[11], &v[12], &v[13], marker) == 15) { /* Find the disk name */ for (newkey = keyhead; (newkey && strcmp(newkey->key, marker)); newkey = newkey->next) ; if (newkey) { setupfn2("%s.%s.rrd", "iostat", newkey->value); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%.1f:%.1f:%.1f:%.1f:%.1f:%.1f:%.1f:%.1f:%.1f:%.1f:%.1f:%.1f:%.1f:%.1f", (int) tstamp, v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13]); create_and_update_rrd(hostname, testname, classname, pagepaths, iostat_params, iostat_tpl); } } xfree(buf); break; } } if (eoln) { *eoln = '\n'; curline = eoln + 1; } else { curline = NULL; } } /* Free the keylist */ while (keyhead) { newkey = keyhead; keyhead = keyhead->next; if (newkey->key) xfree(newkey->key); if (newkey->value) xfree(newkey->value); xfree(newkey); } MEMUNDEFINE(marker); return 0; } xymon-4.3.28/xymond/rrd/do_mdc.c0000664000076400007640000000374712000025440016706 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* This module handles z/VM "mdc" data messages */ /* */ /* Copyright (C) 2006-2011 Henrik Storner */ /* Copyright (C) 2007 Rich Smrcina */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char mdc_rcsid[] = "$Id: do_mdc.c 6585 2010-11-14 15:12:56Z storner $"; static char *mdc_params[] = { "DS:reads:GAUGE:600:0:U", "DS:writes:GAUGE:600:0:U", NULL }; static char *mdcpct_params[] = { "DS:hitpct:GAUGE:600:0:100", NULL }; static char *mdc_tpl = NULL; int do_mdc_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { char *pr; char *fn = NULL; int mdcreads, mdcwrites, mdchitpct; pr=(strstr(msg, "\n")); pr++; pr=(strstr(pr, "\n")); /* There are two of them... */ if (pr) { pr++; sscanf(pr, "%d:%d:%d", &mdcreads, &mdcwrites, &mdchitpct); setupfn("mdc.rrd", fn); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d:%d", (int)tstamp, mdcreads, mdcwrites); create_and_update_rrd(hostname, testname, classname, pagepaths, mdc_params, mdc_tpl); setupfn("mdchitpct.rrd", fn); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, mdchitpct); create_and_update_rrd(hostname, testname, classname, pagepaths, mdcpct_params, mdc_tpl); } return 0; } xymon-4.3.28/xymond/rrd/do_sendmail.c0000664000076400007640000001320012000025440017720 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char sendmail_rcsid[] = "$Id: do_sendmail.c 7026 2012-07-13 14:05:20Z storner $"; int do_sendmail_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *sendmail_params_1[] = { "DS:msgsfr:DERIVE:600:0:U", "DS:bytes_from:DERIVE:600:0:U", "DS:msgsto:DERIVE:600:0:U", "DS:bytes_to:DERIVE:600:0:U", "DS:msgsrej:DERIVE:600:0:U", "DS:msgsdis:DERIVE:600:0:U", NULL }; static void *sendmail_tpl_1 = NULL; static char *sendmail_params_2[] = { "DS:msgsfr:DERIVE:600:0:U", "DS:bytes_from:DERIVE:600:0:U", "DS:msgsto:DERIVE:600:0:U", "DS:bytes_to:DERIVE:600:0:U", "DS:msgsrej:DERIVE:600:0:U", "DS:msgsdis:DERIVE:600:0:U", "DS:msgsqur:DERIVE:600:0:U", NULL }; static void *sendmail_tpl_2 = NULL; /* * The data we process is the output from the "mailstats" command. * * Statistics from Mon Apr 25 16:29:41 2005 * M msgsfr bytes_from msgsto bytes_to msgsrej msgsdis msgsqur Mailer * 3 183435 215701K 0 0K 0 0 0 local * 5 0 0K 183435 215544K 0 0 0 esmtp * ===================================================================== * T 183435 215701K 183435 215544K 0 0 0 * C 183435 183435 0 * * We pick up those lines that come before the "============" line, and * create one RRD per "Mailer", with the counters. * * The output of the mailstats command will depend on the version of sendmail * used. This example is from sendmail 8.13.x which added the msgsqur column. * Sendmail versions prior to 8.10.0 did not have the mgsdis and msgsrej * columns. * */ char *bofdata, *eofdata, *eoln = NULL; int done, found; unsigned long msgsfr, bytesfr, msgsto, bytesto, msgsrej, msgsdis, msgsqur; if (sendmail_tpl_1 == NULL) sendmail_tpl_1 = setup_template(sendmail_params_1); if (sendmail_tpl_2 == NULL) sendmail_tpl_2 = setup_template(sendmail_params_2); /* Find the line that begins with "=====" and NULL the message there */ eofdata = strstr(msg, "\n=="); if (eofdata) *(eofdata+1) = '\0'; else return -1; /* Find the start of the Statistics part. */ bofdata = strstr(msg, "\nStatistics "); if (!bofdata) return -1; /* Skip the "Statistics from.... " line */ bofdata = strchr(bofdata+1, '\n'); if (!bofdata) return -1; /* Skip the header line */ bofdata = strchr(bofdata+1, '\n'); if (bofdata) bofdata++; else return -1; done = (bofdata == NULL); while (!done) { char mailer[1024]; MEMDEFINE(mailer); *rrdvalues = '\0'; eoln = strchr(bofdata, '\n'); if (eoln) { *eoln = '\0'; /* First try for sendmail 8.13.x format */ found = sscanf(bofdata, "%*s %lu %luK %lu %luK %lu %lu %lu %s", &msgsfr, &bytesfr, &msgsto, &bytesto, &msgsrej, &msgsdis, &msgsqur, mailer); if (found == 8) { snprintf(rrdvalues, sizeof(rrdvalues), "%d:%lu:%lu:%lu:%lu:%lu:%lu:%lu", (int)tstamp, msgsfr, bytesfr*1024, msgsto, bytesto*1024, msgsrej, msgsdis, msgsqur); goto gotdata; } /* Next sendmail 8.10.x - without msgsqur */ found = sscanf(bofdata, "%*s %lu %luK %lu %luK %lu %lu %s", &msgsfr, &bytesfr, &msgsto, &bytesto, &msgsrej, &msgsdis, mailer); if (found == 7) { snprintf(rrdvalues, sizeof(rrdvalues), "%d:%lu:%lu:%lu:%lu:%lu:%lu:U", (int)tstamp, msgsfr, bytesfr*1024, msgsto, bytesto*1024, msgsrej, msgsdis); goto gotdata; } /* Last resort: Sendmail prior to 8.10 - without msgsrej, msgsdis, msgsqur */ found = sscanf(bofdata, "%*s %lu %luK %lu %luK %s", &msgsfr, &bytesfr, &msgsto, &bytesto, mailer); if (found == 5) { snprintf(rrdvalues, sizeof(rrdvalues), "%d:%lu:%lu:%lu:%lu:U:U:U", (int)tstamp, msgsfr, bytesfr*1024, msgsto, bytesto*1024); goto gotdata; } gotdata: if (*rrdvalues) { int dscount, i; char **dsnames = NULL; setupfn2("%s.%s.rrd", "sendmail", mailer); /* Get the RRD-file dataset count, so we can decide what to do */ dscount = rrddatasets(hostname, &dsnames); if ((dscount > 0) && dsnames) { /* Free the dsnames list */ for (i=0; (i */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char netapp_rcsid[] = "$Id: do_netapp.c 7969 2016-10-21 23:26:36Z jccleaver $"; int do_netapp_stats_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *netapp_stats_params[] = { "DS:NETread:GAUGE:600:0:U", "DS:NETwrite:GAUGE:600:0:U", "DS:DISKread:GAUGE:600:0:U", "DS:DISKwrite:GAUGE:600:0:U", "DS:TAPEread:GAUGE:600:0:U", "DS:TAPEwrite:GAUGE:600:0:U", "DS:FCPin:GAUGE:600:0:U", "DS:FCPout:GAUGE:600:0:U", NULL }; static void *netapp_stats_tpl = NULL; unsigned long netread=0, netwrite=0, diskread=0, diskwrite=0, taperead=0, tapewrite=0, fcpin=0, fcpout=0; dbgprintf("netapp: host %s test %s\n",hostname, testname); if (strstr(msg, "netapp.pl")) { setupfn("%s.rrd", testname); if (netapp_stats_tpl == NULL) netapp_stats_tpl = setup_template(netapp_stats_params); netread=get_kb_data(msg, "NET_read"); netwrite=get_kb_data(msg,"NET_write"); diskread=get_kb_data(msg,"DISK_read"); diskwrite=get_kb_data(msg,"DISK_write"); taperead=get_kb_data(msg,"TAPE_read"); tapewrite=get_kb_data(msg,"TAPE_write"); fcpin=get_kb_data(msg,"FCP_in"); fcpout=get_kb_data(msg,"FCP_out"); dbgprintf("netapp: host %s test %s netread %ld netwrite %ld\n", hostname, testname, netread,netwrite); dbgprintf("netapp: host %s test %s diskread %ld diskwrite %ld\n", hostname, testname, diskread,diskwrite); dbgprintf("netapp: host %s test %s taperead %ld tapewrite %ld\n", hostname, testname, taperead,tapewrite); dbgprintf("netapp: host %s test %s fcpin %ld fcpout %ld\n", hostname, testname, fcpin,fcpout); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%ld:%ld:%ld:%ld:%ld:%ld:%ld:%ld", (int) tstamp, netread, netwrite, diskread, diskwrite, taperead, tapewrite, fcpin, fcpout); create_and_update_rrd(hostname, testname, classname, pagepaths, netapp_stats_params, netapp_stats_tpl); } return 0; } int do_netapp_cifs_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *netapp_cifs_params[] = { "DS:sessions:GAUGE:600:0:U", "DS:openshares:GAUGE:600:0:U", "DS:openfiles:GAUGE:600:0:U", "DS:locks:GAUGE:600:0:U", "DS:credentials:GAUGE:600:0:U", "DS:opendirectories:GAUGE:600:0:U", "DS:ChangeNotifies:GAUGE:600:0:U", "DS:sessionsusingsecuri:GAUGE:600:0:U", NULL }; static void *netapp_cifs_tpl = NULL; unsigned long sess=0, share=0, file=0, lock=0, cred=0, dir=0, change=0, secsess=0; dbgprintf("netapp: host %s test %s\n",hostname, testname); if (strstr(msg, "netapp.pl")) { setupfn("%s.rrd", testname); if (netapp_cifs_tpl == NULL) netapp_cifs_tpl = setup_template(netapp_cifs_params); sess=get_long_data(msg, "sessions"); share=get_long_data(msg,"open_shares"); file=get_long_data(msg,"open_files"); lock=get_long_data(msg,"locks"); cred=get_long_data(msg,"credentials"); dir=get_long_data(msg,"open_directories"); change=get_long_data(msg,"ChangeNotifies"); secsess=get_long_data(msg,"sessions_using_security_signatures"); dbgprintf("netapp: host %s test %s Session %ld OpenShare %ld\n", hostname, testname, sess, share); dbgprintf("netapp: host %s test %s OpenFile %ld Locks %ld\n", hostname, testname, file, lock); dbgprintf("netapp: host %s test %s Cred %ld OpenDir %ld\n", hostname, testname, cred, dir); dbgprintf("netapp: host %s test %s ChangeNotif %ld SecureSess %ld\n", hostname, testname, change, secsess); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%ld:%ld:%ld:%ld:%ld:%ld:%ld:%ld", (int) tstamp, sess, share, file, lock, cred, dir, change,secsess); create_and_update_rrd(hostname, testname, classname, pagepaths, netapp_cifs_params, netapp_cifs_tpl); } return 0; } int do_netapp_ops_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *netapp_ops_params[] = { "DS:NFSops:GAUGE:600:0:U", "DS:CIFSops:GAUGE:600:0:U", "DS:iSCSIops:GAUGE:600:0:U", "DS:HTTPops:GAUGE:600:0:U", "DS:FCPops:GAUGE:600:0:U", "DS:Totalops:GAUGE:600:0:U", NULL }; static void *netapp_ops_tpl = NULL; unsigned long nfsops=0, cifsops=0, httpops=0, iscsiops=0, fcpops=0, totalops=0; dbgprintf("netapp: host %s test %s\n",hostname, testname); if (strstr(msg, "netapp.pl")) { setupfn("%s.rrd",testname); if (netapp_ops_tpl == NULL) netapp_ops_tpl = setup_template(netapp_ops_params); nfsops=get_long_data(msg, "NFS_ops"); cifsops=get_long_data(msg,"CIFS_ops"); httpops=get_long_data(msg,"HTTP_ops"); fcpops=get_long_data(msg,"FCP_ops"); iscsiops=get_long_data(msg,"iSCSI_ops"); totalops=get_long_data(msg,"Total_ops"); dbgprintf("netapp: host %s test %s nfsops %ld cifsops %ld\n", hostname, testname, nfsops, cifsops); dbgprintf("netapp: host %s test %s httpops %ld fcpops %ld\n", hostname, testname, httpops, fcpops); dbgprintf("netapp: host %s test %s iscsiops %ld totalops %ld\n", hostname, testname, iscsiops, totalops); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%ld:%ld:%ld:%ld:%ld:%ld", (int) tstamp, nfsops, cifsops, httpops, fcpops, iscsiops, totalops); create_and_update_rrd(hostname, testname, classname, pagepaths, netapp_ops_params, netapp_ops_tpl); } return 0; } int do_netapp_snapmirror_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *netapp_snapmirror_params[] = { "DS:size:GAUGE:600:0:U", NULL }; static void *netapp_snapmirror_tpl = NULL; char *eoln, *curline, *start, *end; dbgprintf("netapp: host %s test %s\n",hostname, testname); if (strstr(msg, "netapp.pl")) { if (netapp_snapmirror_tpl == NULL) netapp_snapmirror_tpl = setup_template(netapp_snapmirror_params); if ((start=strstr(msg, ""))==NULL) return 0; *end='\0'; eoln = strchr(start, '\n'); curline = (eoln ? (eoln+1) : NULL); while (curline && (*curline)) { char *equalsign; long long size; eoln = strchr(curline, '\n'); if (eoln) *eoln = '\0'; equalsign=strchr(curline,'='); if (equalsign) { *(equalsign++)= '\0'; size=str2ll(equalsign,NULL); dbgprintf("netapp: host %s test %s SNAPMIRROR %s size %lld\n", hostname, testname, curline, size); setupfn2("%s,%s.rrd", testname, curline); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%lld", (int)tstamp, size); create_and_update_rrd(hostname, testname, classname, pagepaths, netapp_snapmirror_params, netapp_snapmirror_tpl); *(--equalsign)='='; } if (eoln) *eoln = '\n'; curline = (eoln ? (eoln+1) : NULL); } *end='-'; } return 0; } int do_netapp_snaplist_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *netapp_snaplist_params[] = { "DS:youngsize:GAUGE:600:0:U", "DS:oldsize:GAUGE:600:0:U", NULL }; static void *netapp_snaplist_tpl = NULL; char *eoln, *curline, *start, *end; dbgprintf("netapp: host %s test %s\n",hostname, testname); if (strstr(msg, "netapp.pl")) { if (netapp_snaplist_tpl == NULL) netapp_snaplist_tpl = setup_template(netapp_snaplist_params); if ((start=strstr(msg, ""))==NULL) return 0; *end='\0'; eoln = strchr(start, '\n'); curline = (eoln ? (eoln+1) : NULL); while (curline && (*curline)) { char *fsline, *p; char *columns[5]; int columncount; char *volname = NULL; long long young,old; eoln = strchr(curline, '\n'); if (eoln) *eoln = '\0'; for (columncount=0; (columncount<5); columncount++) columns[columncount] = ""; fsline = xstrdup(curline); columncount = 0; p = strtok(fsline, "="); while (p && (columncount < 5)) { columns[columncount++] = p; p = strtok(NULL, ":"); } volname = xstrdup(columns[0]); young=str2ll(columns[1],NULL); old=str2ll(columns[2],NULL); dbgprintf("netapp: host %s test %s vol %s young %lld old %lld\n", hostname, testname, volname, young, old); setupfn2("%s,%s.rrd", testname, volname); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%lld:%lld", (int)tstamp, young, old); create_and_update_rrd(hostname, testname, classname, pagepaths, netapp_snaplist_params, netapp_snaplist_tpl); if (volname) { xfree(volname); volname = NULL; } if (eoln) *eoln = '\n'; xfree(fsline); curline = (eoln ? (eoln+1) : NULL); } *end='-'; } return 0; } int do_netapp_extratest_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp, char *params[], rrdtpldata_t **tpl, char *varlist[]) { static rrdtpldata_t *netapp_tpl = NULL; char *outp; char *eoln,*curline; char *rrdp; /* Setup the update string */ if (tpl == NULL) netapp_tpl = setup_template(params); else { if ((*tpl) == NULL) *tpl = setup_template(params); netapp_tpl = *tpl; } curline = msg; dbgprintf("MESSAGE=%s\n",msg); rrdp = rrdvalues + snprintf(rrdvalues, sizeof(rrdvalues), "%d", (int)tstamp); while (curline && (*curline)) { char *fsline, *p, *sep, *fname=NULL; char *columns[30]; int columncount; char *volname = NULL; int i,flag,l,first,totnum; char *val; outp=rrdp; eoln = strchr(curline, '\n'); if (eoln) *eoln = '\0'; if ((eoln == curline) || (strstr(curline,"netapp.pl"))) { dbgprintf("SKIP LINE=\n",curline); goto nextline; } fsline = xstrdup(curline); dbgprintf("LINE=%s\n",fsline); for (columncount=0; (columncount<30); columncount++) columns[columncount] = NULL; for (totnum=0; varlist[totnum]; totnum++) ; columncount = 0; p = strtok(fsline, ";"); first=0; while (p) { if (first==0) { fname=p; first=1; } else { sep=strchr(p,':'); if (sep) { l=sep-p; sep++; dbgprintf("Checking %s len=%d\n",p,l); flag=0; i = 0; while ((flag==0) && (varlist[i])) { dbgprintf("with %s\n",varlist[i]); if (strncmp(varlist[i], p, l) == 0) { columns[i]=sep; flag=1; } i++; } } } p = strtok(NULL, ";"); } volname = xstrdup(fname); p = volname; while ((p = strchr(p, '/')) != NULL) { *p = ','; } dbgprintf("netapp: host %s test %s name %s \n", hostname, testname, volname); setupfn2("%s,%s.rrd", testname, volname); for (i=0; varlist[i]; i++) { val=columns[i]; if (val) { outp += snprintf(outp, sizeof(rrdvalues)-(outp-rrdvalues), ":%s",val); dbgprintf("var %s value %s \n", varlist[i], columns[i]); } else { outp += snprintf(outp, sizeof(rrdvalues)-(outp-rrdvalues), ":%s","U"); } } create_and_update_rrd(hostname, testname, classname, pagepaths, params, netapp_tpl); if (volname) { xfree(volname); volname = NULL; } if (eoln) *eoln = '\n'; xfree(fsline); nextline: curline = (eoln ? (eoln+1) : NULL); } return 0; } int do_netapp_extrastats_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *netapp_qtree_params[] = { "DS:nfs_ops:GAUGE:600:0:U", "DS:cifs_ops:GAUGE:600:0:U", NULL }; static char *netapp_aggregate_params[] = { "DS:total_transfers:GAUGE:600:0:U", "DS:user_reads:GAUGE:600:0:U", "DS:user_writes:GAUGE:600:0:U", "DS:cp_reads:GAUGE:600:0:U", "DS:user_read_blocks:GAUGE:600:0:U", "DS:user_write_blocks:GAUGE:600:0:U", "DS:cp_read_blocks:GAUGE:600:0:U", NULL }; static char *netapp_iscsi_params[] = { "DS:iscsi_ops:GAUGE:600:0:U", "DS:iscsi_write_data:GAUGE:600:0:U", "DS:iscsi_read_data:GAUGE:600:0:U", NULL }; static char *netapp_fcp_params[] = { "DS:fcp_ops:GAUGE:600:0:U", "DS:fcp_write_data:GAUGE:600:0:U", "DS:fcp_read_data:GAUGE:600:0:U", NULL }; static char *netapp_cifs_params[] = { "DS:cifs_ops:GAUGE:600:0:U", "DS:cifs_latency:GAUGE:600:0:U", NULL }; static char *netapp_volume_params[] = { "DS:avg_latency:GAUGE:600:0:U", "DS:total_ops:GAUGE:600:0:U", "DS:read_data:GAUGE:600:0:U", "DS:read_latency:GAUGE:600:0:U", "DS:read_ops:GAUGE:600:0:U", "DS:write_data:GAUGE:600:0:U", "DS:write_latency:GAUGE:600:0:U", "DS:write_ops:GAUGE:600:0:U", "DS:other_latency:GAUGE:600:0:U", "DS:other_ops:GAUGE:600:0:U", NULL }; static char *netapp_lun_params[] = { "DS:read_ops:GAUGE:600:0:U", "DS:write_ops:GAUGE:600:0:U", "DS:other_ops:GAUGE:600:0:U", "DS:read_data:GAUGE:600:0:U", "DS:write_data:GAUGE:600:0:U", "DS:queue_full:GAUGE:600:0:U", "DS:avg_latency:GAUGE:600:0:U", "DS:total_ops:GAUGE:600:0:U", NULL }; static char *netapp_nfsv3_params[] = { "DS:ops:GAUGE:600:0:U", "DS:read_latency:GAUGE:600:0:U", "DS:read_ops:GAUGE:600:0:U", "DS:write_latency:GAUGE:600:0:U", "DS:write_ops:GAUGE:600:0:U", NULL }; static char *netapp_ifnet_params[] = { "DS:recv_packets:GAUGE:600:0:U", "DS:recv_errors:GAUGE:600:0:U", "DS:send_packets:GAUGE:600:0:U", "DS:send_errors:GAUGE:600:0:U", "DS:collisions:GAUGE:600:0:U", "DS:recv_data:GAUGE:600:0:U", "DS:send_data:GAUGE:600:0:U", "DS:recv_mcasts:GAUGE:600:0:U", "DS:send_mcasts:GAUGE:600:0:U", "DS:recv_drop_packets:GAUGE:600:0:U", NULL }; static char *netapp_processor_params[] = { "DS:proc_busy:GAUGE:600:0:U", NULL }; static char *netapp_disk_params[] = { "DS:total_transfers:GAUGE:600:0:U", "DS:user_read_chain:GAUGE:600:0:U", "DS:user_reads:GAUGE:600:0:U", "DS:user_write_chain:GAUGE:600:0:U", "DS:user_writes:GAUGE:600:0:U", "DS:cp_read_chain:GAUGE:600:0:U", "DS:cp_reads:GAUGE:600:0:U", "DS:gar_read_chain:GAUGE:600:0:U", "DS:gar_reads:GAUGE:600:0:U", "DS:gar_write_chain:GAUGE:600:0:U", "DS:gar_writes:GAUGE:600:0:U", "DS:user_read_latency:GAUGE:600:0:U", "DS:user_read_blocks:GAUGE:600:0:U", "DS:user_write_latency:GAUGE:600:0:U", "DS:user_write_blocks:GAUGE:600:0:U", "DS:cp_read_latency:GAUGE:600:0:U", "DS:cp_read_blocks:GAUGE:600:0:U", "DS:gar_read_latency:GAUGE:600:0:U", "DS:gar_read_blocks:GAUGE:600:0:U", "DS:gar_write_latency:GAUGE:600:0:U", "DS:gar_write_blocks:GAUGE:600:0:U", "DS:disk_busy:GAUGE:600:0:U", NULL }; static char *netapp_system_params[] = { "DS:nfs_ops:GAUGE:600:0:U", "DS:cifs_ops:GAUGE:600:0:U", "DS:http_ops:GAUGE:600:0:U", "DS:dafs_ops:GAUGE:600:0:U", "DS:fcp_ops:GAUGE:600:0:U", "DS:iscsi_ops:GAUGE:600:0:U", "DS:net_data_recv:GAUGE:600:0:U", "DS:net_data_sent:GAUGE:600:0:U", "DS:disk_data_read:GAUGE:600:0:U", "DS:disk_data_written:GAUGE:600:0:U", "DS:cpu_busy:GAUGE:600:0:U", "DS:avg_proc_busy:GAUGE:600:0:U", "DS:total_proc_busy:GAUGE:600:0:U", "DS:num_proc:GAUGE:600:0:U", "DS:time:GAUGE:600:0:U", "DS:uptime:GAUGE:600:0:U", NULL }; static char *qtree_test[] = { "nfs_ops", "cifs_ops" ,NULL }; static char *aggregate_test[] = { "total_transfers", "user_reads", "user_writes", "cp_reads", "user_read_blocks", "user_write_blocks", "cp_read_blocks" ,NULL }; static char *iscsi_test[] = { "iscsi_ops", "iscsi_write_data", "iscsi_read_data" ,NULL }; static char *fcp_test[] = { "fcp_ops", "fcp_write_data", "fcp_read_data" ,NULL }; static char *cifs_test[] = { "cifs_ops", "cifs_latency" ,NULL }; static char *volume_test[] = { "avg_latency", "total_ops", "read_data", "read_latency", "read_ops", "write_data", "write_latency", "write_ops", "other_latency", "other_ops" ,NULL }; static char *lun_test[] = { "read_ops", "write_ops", "other_ops", "read_data", "write_data", "queue_full", "avg_latency", "total_ops" ,NULL }; static char *nfsv3_test[] = { "nfsv3_ops", "nfsv3_read_latency", "nfsv3_read_ops", "nfsv3_write_latency", "nfsv3_write_ops" ,NULL }; static char *ifnet_test[] = { "recv_packets", "recv_errors", "send_packets", "send_errors", "collisions", "recv_data", "send_data", "recv_mcasts", "send_mcasts", "recv_drop_packets" ,NULL }; static char *processor_test[] = { "processor_busy" ,NULL }; static char *disk_test[] = { "total_transfers", "user_read_chain", "user_reads", "user_write_chain", "user_writes", "cp_read_chain", "cp_reads", "guarenteed_read_chain", "guaranteed_reads", "guarenteed_write_chain", "guaranteed_writes", "user_read_latency", "user_read_blocks", "user_write_latency", "user_write_blocks", "cp_read_latency", "cp_read_blocks", "guarenteed_read_latency", "guarenteed_read_blocks", "guarenteed_write_latency", "guarenteed_write_blocks", "disk_busy" ,NULL }; static char *system_test[] = { "nfs_ops", "cifs_ops", "http_ops", "dafs_ops", "fcp_ops", "iscsi_ops", "net_data_recv", "net_data_sent", "disk_data_read", "disk_data_written", "cpu_busy", "avg_processor_busy", "total_processor_busy", "num_processors", "time", "uptime" ,NULL }; static rrdtpldata_t *qtree_tpl = NULL; static rrdtpldata_t *aggregate_tpl = NULL; static rrdtpldata_t *iscsi_tpl = NULL; static rrdtpldata_t *fcp_tpl = NULL; static rrdtpldata_t *cifs_tpl = NULL; static rrdtpldata_t *volume_tpl = NULL; static rrdtpldata_t *lun_tpl = NULL; static rrdtpldata_t *nfsv3_tpl = NULL; static rrdtpldata_t *ifnet_tpl = NULL; static rrdtpldata_t *processor_tpl = NULL; static rrdtpldata_t *disk_tpl = NULL; static rrdtpldata_t *system_tpl = NULL; char *ifnetstr; char *qtreestr; char *aggregatestr; char *volumestr; char *lunstr; char *diskstr; splitmsg(msg); ifnetstr = getdata("ifnet"); qtreestr = getdata("qtree"); aggregatestr = getdata("aggregate"); volumestr = getdata("volume"); lunstr = getdata("lun"); diskstr = getdata("disk"); if (ifnet_tpl == NULL) ifnet_tpl = setup_template(netapp_ifnet_params); if (qtree_tpl == NULL) qtree_tpl = setup_template(netapp_qtree_params); if (aggregate_tpl == NULL) aggregate_tpl = setup_template(netapp_aggregate_params); if (volume_tpl == NULL) volume_tpl = setup_template(netapp_volume_params); if (lun_tpl == NULL) lun_tpl = setup_template(netapp_lun_params); if (disk_tpl == NULL) disk_tpl = setup_template(netapp_disk_params); do_netapp_extratest_rrd(hostname,"xstatifnet",classname,pagepaths,ifnetstr,tstamp,netapp_ifnet_params,&ifnet_tpl,ifnet_test); do_netapp_extratest_rrd(hostname,"xstatqtree",classname,pagepaths,qtreestr,tstamp,netapp_qtree_params,&qtree_tpl,qtree_test); do_netapp_extratest_rrd(hostname,"xstataggregate",classname,pagepaths,aggregatestr,tstamp,netapp_aggregate_params,&aggregate_tpl,aggregate_test); do_netapp_extratest_rrd(hostname,"xstatvolume",classname,pagepaths,volumestr,tstamp,netapp_volume_params,&volume_tpl,volume_test); do_netapp_extratest_rrd(hostname,"xstatlun",classname,pagepaths,lunstr,tstamp,netapp_lun_params,&lun_tpl,lun_test); do_netapp_extratest_rrd(hostname,"xstatdisk",classname,pagepaths,diskstr,tstamp,netapp_disk_params,&disk_tpl,disk_test); return 0; } int do_netapp_disk_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *netapp_disk_params[] = { "DS:pct:GAUGE:600:0:U", "DS:used:GAUGE:600:0:U", NULL }; static rrdtpldata_t *netapp_disk_tpl = NULL; char *eoln, *curline; static int ptnsetup = 0; static pcre *inclpattern = NULL; static pcre *exclpattern = NULL; int newdfreport; newdfreport = (strstr(msg,"netappnewdf") != NULL); if (netapp_disk_tpl == NULL) netapp_disk_tpl = setup_template(netapp_disk_params); if (!ptnsetup) { const char *errmsg; int errofs; char *ptn; ptnsetup = 1; ptn = getenv("RRDDISKS"); if (ptn && strlen(ptn)) { inclpattern = pcre_compile(ptn, PCRE_CASELESS, &errmsg, &errofs, NULL); if (!inclpattern) errprintf("PCRE compile of RRDDISKS='%s' failed, error %s, offset %d\n", ptn, errmsg, errofs); } ptn = getenv("NORRDDISKS"); if (ptn && strlen(ptn)) { exclpattern = pcre_compile(ptn, PCRE_CASELESS, &errmsg, &errofs, NULL); if (!exclpattern) errprintf("PCRE compile of NORRDDISKS='%s' failed, error %s, offset %d\n", ptn, errmsg, errofs); } } /* * Francesco Duranti noticed that if we use the "/group" option * when sending the status message, this tricks the parser to * create an extra filesystem called "/group". So skip the first * line - we never have any disk reports there anyway. */ curline = strchr(msg, '\n'); if (curline) curline++; while (curline) { char *fsline, *p; char *columns[20]; int columncount; char *diskname = NULL; int pused = -1; int wanteddisk = 1; long long aused = 0; /* FD: Using double instead of long long because we can have decimal on Netapp and DbCheck */ double dused = 0; /* FD: used to add a column if the filesystem is named "snap reserve" for netapp.pl */ int snapreserve=0; eoln = strchr(curline, '\n'); if (eoln) *eoln = '\0'; /* FD: netapp.pl snapshot line that start with "snap reserve" need a +1 */ if (strstr(curline, "snap reserve")) snapreserve=1; /* All clients except AS/400 and DBCHECK report the mount-point with slashes - ALSO Win32 clients. */ if (strchr(curline, '/') == NULL) goto nextline; /* red/yellow filesystems show up twice */ if (*curline == '&') goto nextline; if ((strstr(curline, " red ") || strstr(curline, " yellow "))) goto nextline; for (columncount=0; (columncount<20); columncount++) columns[columncount] = ""; fsline = xstrdup(curline); columncount = 0; p = strtok(fsline, " "); while (p && (columncount < 20)) { columns[columncount++] = p; p = strtok(NULL, " "); } /* FD: Name column can contain "spaces" so it could be split in multiple columns, create a unique string from columns[5] that point to the complete disk name */ while (columncount-- > 6+snapreserve) { p = strchr(columns[columncount-1],0); if (p) *p = '_'; } /* FD: Add an initial "/" to qtree and quotas */ if (newdfreport) { diskname = xstrdup(columns[0]); } else if (*columns[5+snapreserve] != '/') { diskname=xmalloc(strlen(columns[5+snapreserve])+2); sprintf(diskname,"/%s",columns[5+snapreserve]); } else { diskname = xstrdup(columns[5+snapreserve]); } p = strchr(columns[4+snapreserve], '%'); if (p) *p = ' '; pused = atoi(columns[4+snapreserve]); p = columns[2+snapreserve] + strspn(columns[2+snapreserve], "0123456789."); /* Using double instead of long long because we can have decimal */ dused = str2ll(columns[2+snapreserve], NULL); /* snapshot and qtree contains M/G/T Convert to KB if there's a modifier after the numbers */ if (*p == 'M') dused *= 1024; else if (*p == 'G') dused *= (1024*1024); else if (*p == 'T') dused *= (1024*1024*1024); aused=(long long) dused; /* Check include/exclude patterns */ wanteddisk = 1; if (exclpattern) { int ovector[30]; int result; result = pcre_exec(exclpattern, NULL, diskname, strlen(diskname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))); wanteddisk = (result < 0); } if (wanteddisk && inclpattern) { int ovector[30]; int result; result = pcre_exec(inclpattern, NULL, diskname, strlen(diskname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))); wanteddisk = (result >= 0); } if (wanteddisk && diskname && (pused != -1)) { p = diskname; while ((p = strchr(p, '/')) != NULL) { *p = ','; } if (strcmp(diskname, ",") == 0) { diskname = xrealloc(diskname, 6); strcpy(diskname, ",root"); } /* * Use testname here. * The disk-handler also gets data from NetAPP inode- and qtree-messages, * that are virtually identical to the disk-messages. So lets just handle * all of it by using the testname as part of the filename. */ setupfn2("%s%s.rrd", testname, diskname); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d:%lld", (int)tstamp, pused, aused); create_and_update_rrd(hostname, testname, classname, pagepaths, netapp_disk_params, netapp_disk_tpl); } if (diskname) { xfree(diskname); diskname = NULL; } if (eoln) *eoln = '\n'; xfree(fsline); nextline: curline = (eoln ? (eoln+1) : NULL); } return 0; } xymon-4.3.28/xymond/rrd/do_citrix.c0000664000076400007640000000272612000025440017441 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char citrix_rcsid[] = "$Id: do_citrix.c 7026 2012-07-13 14:05:20Z storner $"; int do_citrix_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { static char *citrix_params[] = { "DS:users:GAUGE:600:0:U", NULL }; static void *citrix_tpl = NULL; char *p; int users; if (citrix_tpl == NULL) citrix_tpl = setup_template(citrix_params); p = strstr(msg, " users active\n"); while (p && (p > msg) && (*p != '\n')) p--; if (p && (sscanf(p+1, "\n%d users active\n", &users) == 1)) { setupfn("%s.rrd", "citrix"); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%d", (int)tstamp, users); return create_and_update_rrd(hostname, testname, classname, pagepaths, citrix_params, citrix_tpl); } return 0; } xymon-4.3.28/xymond/rrd/do_filesizes.c0000664000076400007640000000353512000025440020133 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* This module handles "filesizes" messages. */ /* */ /* Copyright (C) 2006-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char filesize_rcsid[] = "$Id: do_filesizes.c 7026 2012-07-13 14:05:20Z storner $"; static char *filesize_params[] = { "DS:size:GAUGE:600:0:U", NULL }; static void *filesize_tpl = NULL; int do_filesizes_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { char *boln, *eoln; if (filesize_tpl == NULL) filesize_tpl = setup_template(filesize_params); boln = strchr(msg, '\n'); if (boln) boln++; while (boln && *boln) { char *fn, *szstr = NULL; eoln = strchr(boln, '\n'); if (eoln) *eoln = '\0'; fn = strtok(boln, ":"); if (fn) szstr = strtok(NULL, ":"); if (fn && szstr) { char *p; for (p=strchr(fn, '/'); (p); p = strchr(p, '/')) *p = ','; setupfn2("%s.%s.rrd", "filesizes", fn); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%s", (int)tstamp, szstr); create_and_update_rrd(hostname, testname, classname, pagepaths, filesize_params, filesize_tpl); } boln = (eoln ? eoln+1 : NULL); } return 0; } xymon-4.3.28/xymond/rrd/do_ifmib.c0000664000076400007640000001343412000025440017223 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon RRD handler module. */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char ifmib_rcsid[] = "$Id: do_ifmib.c 7026 2012-07-13 14:05:20Z storner $"; static char *ifmib_params[] = { "DS:ifInNUcastPkts:COUNTER:600:0:U", "DS:ifInDiscards:COUNTER:600:0:U", "DS:ifInErrors:COUNTER:600:0:U", "DS:ifInUnknownProtos:COUNTER:600:0:U", "DS:ifOutNUcastPkts:COUNTER:600:0:U", "DS:ifOutDiscards:COUNTER:600:0:U", "DS:ifOutErrors:COUNTER:600:0:U", "DS:ifOutQLen:GAUGE:600:0:U", "DS:ifInMcastPkts:COUNTER:600:0:U", "DS:ifInBcastPkts:COUNTER:600:0:U", "DS:ifOutMcastPkts:COUNTER:600:0:U", "DS:ifOutBcastPkts:COUNTER:600:0:U", "DS:ifHCInMcastPkts:COUNTER:600:0:U", "DS:ifHCInBcastPkts:COUNTER:600:0:U", "DS:ifHCOutMcastPkts:COUNTER:600:0:U", "DS:ifHCOutBcastPkts:COUNTER:600:0:U", "DS:InOctets:COUNTER:600:0:U", "DS:OutOctets:COUNTER:600:0:U", "DS:InUcastPkts:COUNTER:600:0:U", "DS:OutUcastPkts:COUNTER:600:0:U", NULL }; static void *ifmib_tpl = NULL; static char *ifmib_valnames[] = { /* These are in the standard interface MIB */ "ifInNUcastPkts", /* 0 */ "ifInDiscards", "ifInErrors", "ifInUnknownProtos", "ifOutNUcastPkts", /* 4 */ "ifOutDiscards", "ifOutErrors", "ifOutQLen", /* The following are the 64-bit counters in the extended MIB */ "ifInMulticastPkts", /* 8 */ "ifInBroadcastPkts", "ifOutMulticastPkts", "ifOutBroadcastPkts", "ifHCInMulticastPkts", /* 12 */ "ifHCInBroadcastPkts", "ifHCOutMulticastPkts", "ifHCOutBroadcastPkts", /* The following counters may be in both 32- (standard) and 64-bit (extended) versions. */ "ifInOctets", /* 16 */ "ifHCInOctets", "ifOutOctets", "ifHCOutOctets", "ifInUcastPkts", /* 20 */ "ifHCInUcastPkts", "ifOutUcastPkts", "ifHCOutUcastPkts", NULL }; static void ifmib_flush_data(int ifmibinterval, char *devname, time_t tstamp, char *hostname, char *testname, char *classname, char *pagepaths, char **values, int inidx, int outidx, int inUcastidx, int outUcastidx) { setupfn2("%s.%s.rrd", "ifmib", devname); setupinterval(ifmibinterval); snprintf(rrdvalues, sizeof(rrdvalues), "%d:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s", (int)tstamp, values[0], values[1], values[2], values[3], values[4], values[5], values[6], values[7], values[8], values[9], values[10], values[11], values[12], values[13], values[14], values[15], values[inidx], values[outidx], values[inUcastidx], values[outUcastidx]); create_and_update_rrd(hostname, testname, classname, pagepaths, ifmib_params, ifmib_tpl); } int do_ifmib_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp) { char *datapart = msg; char *bol, *eoln; char *devname = NULL; char *values[sizeof(ifmib_valnames)/sizeof(ifmib_valnames[0])]; int valcount = 0; int incountidx = 16, outcountidx = 18, inUcastidx = 20, outUcastidx = 22; int pollinterval = 0; if (ifmib_tpl == NULL) ifmib_tpl = setup_template(ifmib_params); if ((strncmp(msg, "status", 6) == 0) || (strncmp(msg, "data", 4) == 0)) { /* Skip the first line of full status- and data-messages. */ datapart = strchr(msg, '\n'); if (datapart) datapart++; else datapart = msg; } memset(values, 0, sizeof(values)); valcount = 0; devname = NULL; bol = datapart; while (bol) { eoln = strchr(bol, '\n'); if (eoln) *eoln = '\0'; bol += strspn(bol, " \t"); if (*bol == '\0') { /* Nothing */ } else if (strncmp(bol, "Interval=", 9) == 0) { pollinterval = atoi(bol+9); } else if (*bol == '[') { /* New interface data begins */ if (devname && (valcount == 24)) { ifmib_flush_data(pollinterval, devname, tstamp, hostname, testname, classname, pagepaths, values, incountidx, outcountidx, inUcastidx, outUcastidx); memset(values, 0, sizeof(values)); valcount = 0; devname = NULL; incountidx = 16; outcountidx = 18; inUcastidx = 20; outUcastidx = 22; } devname = bol+1; bol = strchr(bol, ']'); if (bol) *bol = '\0'; } else { char *valnam, *valstr = NULL; valnam = strtok(bol, " ="); if (valnam) valstr = strtok(NULL, " ="); if (valnam && valstr) { int validx; for (validx = 0; (ifmib_valnames[validx] && strcmp(ifmib_valnames[validx], valnam)); validx++) ; if (ifmib_valnames[validx]) { values[validx] = (isdigit(*valstr) ? valstr : "U"); valcount++; /* See if this is one of the high-speed in/out counts */ if (*values[validx] != 'U') { if (validx == 17) incountidx = validx; if (validx == 19) outcountidx = validx; if (validx == 21) inUcastidx = validx; if (validx == 23) outUcastidx = validx; } } } } bol = (eoln ? eoln+1 : NULL); } /* Flush the last device */ if (devname && (valcount == 24)) { ifmib_flush_data(pollinterval, devname, tstamp, hostname, testname, classname, pagepaths, values, incountidx, outcountidx, inUcastidx, outUcastidx); valcount = 0; } return 0; } xymon-4.3.28/xymond/xymond_rrd.80000664000076400007640000004071013037531444017014 0ustar rpmbuildrpmbuild.TH XYMOND_RRD 8 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME xymond_rrd \- xymond worker module for updating Xymon RRD files .SH SYNOPSIS .B "xymond_channel \-\-channel=status xymond_rrd [options]" .br .B "xymond_channel \-\-channel=data xymond_rrd [options]" .SH DESCRIPTION xymond_rrd is a worker module for xymond, and as such it is normally run via the .I xymond_channel(8) program. It receives "status" and "data" messages from xymond via stdin, and updates the RRD databases used to generate trend-graphs. Clients can send data to Xymon using both status- and data- messages. So you will normally run two instances of this module, once for the "status" channel and once for the "data" channel. xymond_rrd understands data sent by the LARRD 0.43c client-side scripts (the so-called "bottom-feeder" scripts). So you still want to install the LARRD bottom-feeders on the clients you monitor. Note: For certain types of data, the RRD files used by Xymon are imcompatible with those generated by the Big Brother LARRD add-on. See the COMPATIBILITY section below. .SH OPTIONS .IP "\-\-debug" Enable debugging output. .IP "\-\-rrddir=DIRECTORY" Defines the directory where the RRD-files are stored. xymond_rrd will use the location pointed to by the XYMONRRDS environment if this option is not present. .IP "\-\-no\-cache" xymond_rrd by default caches updates to the RRD files, to reduce the disk I/O needed for storing the RRD data. Data is collected for a 30 minute period before being committed to disk in one update. This option disables caching of the data, so that data is stored on disk immediately. .IP "\-\-processor=FILENAME" xymond_rrd can send a parallel copy of all RRD updates to a single external process as a stream on its STDIN. The data will be in a format similar to that used by rrdupdate(1): ts: host If the process exits, xymond_rrd will re-launch it. .IP "\-\-extra\-script=FILENAME" Defines the script that is run to get the RRD data for tests that are not built into xymond_rrd. You must also specify which tests are handled by the external script in the \fB\-\-extra\-tests\fR option. This option can only be given once, so the script must handle all of the external test-data. See the CUSTOM RRD DATA section below. Note that this is NOT needed if your custom graphs are generated by the NCV (Name Colon Value) module described below, it is only required for data where you have a custom script to parse the status message and extract the data that is put into the graph. .IP "\-\-extra\-tests=TEST[,TEST]" List of testnames that are handled by the external script. See the CUSTOM RRD DATA section below. Note that NCV graphs should NOT be listed here, but in the TEST2RRD environment variable - see below. .IP "\-\-no\-rrd" Disable the actual writing of RRD files. This is only really useful if you send all of the data destined for the RRD files to an external processor (the \-\-extra\-script or \-\-processor options). .SH ENVIRONMENT .IP TEST2RRD Defines the mapping between a status-log columnname and the corresponding RRD database format. This is normally defined in the .I xymonserver.cfg(5) file. .IP XYMONRRDS Default directory where RRD files are stored. .IP NCV_testname Defines the types of data collected by the "ncv" module in xymond_rrd. See below for more information. .IP SPLITNCV_testname The same as NCV_testname, but keeps the data into separate files. That is, it creates one rrd file per "NAME : value" line found in the status message. It is useful when the list of NCV lines is varying. .IP TRACKMAX Comma-separated list of columnname for which you want to keep the maximum values along with the default average values. This only works for the NCV backend. .SH COLLECTED DATA The following RRD-file datasets are generated by xymond_rrd: .IP la Records the CPU load average. Data is collected from the "cpu" status report. Requires that a Xymon client is running on the monitored server. .IP disk Records the disk utilization. Data is collected from the "disk" status report. Requires that a Xymon-compatible client is running on the monitored server. .IP memory Records memory- and swap-utilization. Data is collected from the "memory" status report. If no "memory" status is reported, it will use the data from the Win32 client "cpu" status report to generate this dataset. Requires that a Xymon-compatible client is running on the monitored server. .IP netstat Records TCP and UDP statistics. Data is collected from the "netstat" status report; however, this data is often sent via the Xymon "data" protocol, so there need not be a "netstat" column visible on the Xymon display. To get these data, the LARRD netstat bottom-feeder script must be running on the monitored server. .IP vmstat Records system performance metrics from the "vmstat" command. Data is collected from the "vmstat" status report; however, this data is often sent via the Xymon "data" protocol, so there need not be a "vmstat" column visible on the Xymon display. To get these data, the LARRD vmstat bottom-feeder script must be running on the monitored server. .IP tcp Response-time metrics from all of the Xymon network tests are recorded in the "tcp" RRD. .IP apache Apache server performance metrics, taken from the "apache" data report. See the description of the \fBapache\fR keyword in .I hosts.cfg(5) for details. .IP sendmail Sendmail server performance metrics, taken from the "mailstats" output. To get these data, the LARRD sendmail bottom-feeder script must be running on the monitored server. .IP mailq Mail queue size. To get these data, the LARRD nmailq bottom-feeder script must be running on the monitored server. .IP bea BEA Weblogic performance data. This is an experimental set of data collected from BEA Weblogic servers via SNMP, by the "beastats" tool included with Xymon. .IP iishealth IIS webserver performance data, collected by the "iishealth" script. This script is a client-side add-on available from the www.deadcat.net archive. .IP temperature Temperature data, collected with the temperature script from www.deadcat.net. To get these data, the temperature script must be running on the monitored server. .IP ntpstat Tracks the deviation between the local system time and an NTP server, using the output from the "ntpq \-c rv" command. A simple script to collect these data is included in the Xymon contrib/ directory. .IP citrix Tracks the number of active sessions on a Citrix server using the "query session" command. An extension for the BBNT client that generates data for this graph is in the Xymon contrib/ directory. .SH CUSTOM RRD DATA IN NAME-COLON-VALUE (NCV) FORMAT Many data-collection scripts report data in the form "NAME : value" or "NAME = value". So a generic module in xymond_rrd allows for easy tracking of this type of data. The "ncv" module will automatically detect all occurrences of a "NAME : value" or "NAME = value" string in a status message, and generate an RRD file holding all of the name/value data found in the message (unless you use SPLITNCV, see above). The colon- or equal-sign must be present - if there is only whitespace, this module will fail. Only the valid letters (A-Z, a-z) and digits (0-9) are used in the dataset names; whitespace and other characters are stripped off automatically. Only the first 19 characters of a dataset name are used (this is an RRD limitation). Underscore '_' is not allowed, even though RRDtool permits this, and will be stripped from the name. When using the alternative SPLITNCV_testname, the dataset name is not limited in length, and non-valid characters are changed to underscores instead of being stripped off. The dataset inside the resulting rrd file is always "lambda". Note that each "NAME : value" must be on a line by itself. If you have a custom script generating the status- or data-message that is fed into the NCV handler, make sure it inserts a newline before each of the data-items you want to track. Any lines in the status message prepended with a "" will be skipped by the module. This can be used to prevent unneeded RRD files from an existing dataset from being created. A line prepended with a "" will be ignored, along with all subsequent lines until a line starting with "" is found, at which point processing will resume. This can be used to ignore explanatory or other text with a mostly-ncv message. "" can be used to ignore certain text at the beginning of a line, up until a closing '' tag on the same line, at which point the line will continue to be processed as usual. Wrapping is not supported; but skipstart/skipend can be used to handle multiple lines. A bare "" on its own line will stop further NCV processing of that message. All of these ncv_ terms are case-sensitive. Note that if you have full control over your NCV output, it is most efficient to have NCV data near the top of your message and use "" once your data is complete. To enable the ncv module for a status, add a "COLUMNNAME=ncv" to the TEST2RRD setting and the COLUMNNAME to the GRAPHS setting in .I xymonserver.cfg(5) , then restart Xymon. Xymon will now send all status-messages for the column COLUMNNAME through the xymond_rrd ncv-handler. The name of the RRD file will be COLUMNNAME.rrd. When using SPLITNCV, the name of the RRD file will be COLUMNAME,DATASETNAME.rrd. By default, all of the datasets are generated as the RRD type "DERIVE" which works for all types of monotonically increasing counters. If you have data that are of the type GAUGE, you can override the default via an environment variable NCV_COLUMNNAME (or SPLITNCV_COLUMNAME). E.g. if you are using the bb-mysqlstatus script from www.deadcat.net to collect data about your MySQL server, it generates a report in the column called "mysql". One data item is the average number of queries/second, which must be logged in the RRD file as type "GAUGE". To do that, add the following to xymonserver.cfg: .br NCV_mysql="Queriespersecondavg:GAUGE" .br If you have multiple datasets that you myst define, add them to the environment variable separated by commas, e.g. .br NCV_mysql="Uptime:NONE,Queriespersecondavg:GAUGE" .br The dataset type "NONE" used above causes xymond_rrd to ignore this data, it is not included in the RRD file. You can use "*" as the dataset name to match all datasets not listed. E.g. .br NCV_weather="Rain:DERIVE,*:GAUGE" .br will cause the "Rainfall" dataset to be of type DERIVE, and all others of type GAUGE. If you want to track only a few of the variables in your data, you can use "*:NONE" to drop any dataset not explicitly listed. For a more detailed "how to" description, see the on-line HTML documentation of "How to create graph custom data" available in the Help menu section on your Xymon server. .SH SENDING METRIC DATA TO AN ADDITIONAL PROCESS xymond_rrd provides a mechanism to send a copy of isolated metric data to a single external processor for further processing. This can be used to inject metric data that xymond_rrd has prepared into other storage systems, such as OpenTSDB, graphite, etc. The data is printed in a format nearly suitable for injection using .I rrdupdate(1) and easily transformable to other formats. If the process exits, xymond_rrd will re-launch it automatically. .SH CUSTOM RRD DATA VIA SCRIPTS xymond_rrd provides a simple mechanism for adding custom graphs to the set of data collected on your Xymon server. By adding the "\-\-extra\-script" and "\-\-extra\-tests" options, data reported to Xymon from selected tests are passed to an external script, which can define the RRD data-sets to store in an RRD file. \fBNOTE:\fR For performance reasons, you should not use this mechanism for large amounts of data. The overhead involved in storing the received message to disk and launching the script is significantly larger than the normal xymond_rrd overhead. So if you have a large number of reports for a given test, you should consider implementing it in C and including it in the xymond_rrd tool or writing a separate stream listener that injects appropriate "trends" data messages back to xymond. Apart from writing the script, You must also add a section to .I graphs.cfg(5) so that .I showgraph.cgi(1) knows how to generate the graph from the data stored in the RRD file. To make the graphs actually show up on the status-page and/or the "trends" page, add the name of the new graph to the TEST2RRD and/or GRAPHS setting in .I xymonserver.cfg(5). The script is invoked for each message that arrives, where the test-name matches one of the testnames given in the "\-\-extra\-tests" option. The script receives three command-line parameters: .TP .BI "Hostname" The name of the host reporting the data. .TP .BI "Testname" The name of the test being reported. .TP .BI "Filename" File containing the data that was reported. This file is generated for you by xymond_rrd, and is also deleted automatically after your script is finished with it. .LP The script must process the data that is reported, and generate the following output: .TP .BI "RRD data-set definitions" For each dataset that the RRD file holds, a line beginning with "DS:" must be output. If multiple data-sets are used, print one line for each dataset. .br Data-set definitions are described in the .I rrdcreate(1) documentation, but a common definition for e.g. tracking the number of users logged on would be "DS:users:GAUGE:600:0:U". "users" is the name of the dataset, "GAUGE" is the datatype, "600" is the longest time allowed between updates for the data to be valid, "0" is the minimum value, and "U" is the maximum value (a "U" means "unknown"). .TP .BI "RRD filename" The name of the RRD file where the data is stored. Note that Xymon stores all RRD files in host-specific directories, so unlike LARRD you should not include the hostname in the name of the RRD file. .TP .BI "RRD values" One line, with all of the data values collected by the script. Data-items are colon-delimited and must appear in the same sequence as your data-set definitions, e.g. if your RRD has two datasets with the values "5" and "0.4" respectively, then the script must output "5:0.4" as the RRD values. .br In some cases it may be useful to define a dataset even though you will not always have data for it. In that case, use "U" (unknown) for the value. If you want to store the data in multiple RRD files, the script can just print out more sequences of data-set definitions, RRD filenames and RRD values. If the data-set definitions are identical to the previous definition, you need not print the data-set definitions again - just print a new RRD filename and value. .LP The following sample script for tracking weather data shows how to use this mechanism. It assumes the status message include lines like these: .IP .nf green Weather in Copenhagen is FAIR Temperature: 21 degrees Celsius Wind: 4 m/s Humidity: 72 % Rainfall: 5 mm since 6:00 AM .fi .LP A shell-script to track all of these variables could be written like this: .IP .nf #!/bin/sh # Input parameters: Hostname, testname (column), and messagefile HOSTNAME="$1" TESTNAME="$2" FNAME="$3" if [ "$TESTNAME" = "weather" ] then # Analyze the message we got TEMP=`grep "^Temperature:" $FNAME | awk '{print $2}'` WIND=`grep "^Wind:" $FNAME | awk '{print $2}'` HMTY=`grep "^Humidity:" $FNAME | awk '{print $2}'` RAIN=`grep "^Rainfall:" $FNAME | awk '{print $2}'` # The RRD dataset definitions echo "DS:temperature:GAUGE:600:\-30:50" echo "DS:wind:GAUGE:600:0:U" echo "DS:humidity:GAUGE:600:0:100" echo "DS:rainfall:DERIVE:600:0:100" # The filename echo "weather.rrd" # The data echo "$TEMP:$WIND:$HMTY:$RAIN" fi exit 0 .fi .SH COMPATIBILITY Some of the RRD files generated by xymond_rrd are incompatible with the files generated by the Big Brother LARRD add-on: .IP vmstat The vmstat files with data from Linux based systems are incompatible due to the addition of a number of new data-items that LARRD 0.43 do not collect, but xymond_rrd does. This is due to changes in the output from the Linux vmstat command, and changes in the way e.g. system load metrics are reported. .IP netstat All netstat files from LARRD 0.43 are incompatible with xymond_rrd. The netstat data collected by LARRD is quite confusing: For some types of systems LARRD collects packet-counts, for others it collects byte- counts. xymond_rrd uses a different RRD file-format with separate counters for packets and bytes and tracks whatever data the system is reporting. .SH "SEE ALSO" xymond_channel(8), xymond(8), xymonserver.cfg(5), xymon(7) xymon-4.3.28/xymond/client_config.c0000664000076400007640000035504012666144371017520 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Client backend module */ /* This file has routines that load the xymond_client configuration and */ /* finds the rules relevant for a particular test when applied. */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* "PORT" handling (C) Mirko Saam */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: client_config.c 7948 2016-03-03 23:30:01Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" #include "client_config.h" typedef struct exprlist_t { char *pattern; pcre *exp; struct exprlist_t *next; } exprlist_t; typedef struct c_load_t { float warnlevel, paniclevel; } c_load_t; typedef struct c_uptime_t { int recentlimit, ancientlimit, color; } c_uptime_t; typedef struct c_clock_t { int maxdiff, color; } c_clock_t; typedef struct c_disk_t { exprlist_t *fsexp; long warnlevel, paniclevel; int abswarn, abspanic; int dmin, dmax, dcount; int color; int ignored; } c_disk_t; typedef struct c_inode_t { exprlist_t *fsexp; long warnlevel, paniclevel; int abswarn, abspanic; int imin, imax, icount; int color; int ignored; } c_inode_t; typedef struct c_mem_t { enum { C_MEM_PHYS, C_MEM_SWAP, C_MEM_ACT } memtype; int warnlevel, paniclevel; } c_mem_t; typedef struct c_zos_mem_t { enum { C_MEM_CSA, C_MEM_ECSA, C_MEM_SQA, C_MEM_ESQA } zos_memtype; int warnlevel, paniclevel; } c_zos_mem_t; typedef struct c_zvse_vsize_t { int warnlevel, paniclevel; } c_zvse_vsize_t; typedef struct c_zvse_getvis_t { exprlist_t *partid; int warnlevel, paniclevel; int anywarnlevel, anypaniclevel; } c_zvse_getvis_t; typedef struct c_cics_t { exprlist_t *applid; /* CICS Application Identifier */ int dsawarnlevel, dsapaniclevel; int edsawarnlevel, edsapaniclevel; } c_cics_t; typedef struct c_asid_t { enum { C_ASID_MAXUSER, C_ASID_NPARTS } asidtype; int warnlevel, paniclevel; } c_asid_t; typedef struct c_proc_t { exprlist_t *procexp; int pmin, pmax, pcount; int color; } c_proc_t; typedef struct c_log_t { exprlist_t *logfile; exprlist_t *matchexp, *matchone, *ignoreexp; int color; } c_log_t; typedef struct c_paging_t { int warnlevel, paniclevel; } c_paging_t; #define FCHK_NOEXIST (1 << 0) #define FCHK_TYPE (1 << 1) #define FCHK_MODE (1 << 2) #define FCHK_MINLINKS (1 << 3) #define FCHK_MAXLINKS (1 << 4) #define FCHK_EQLLINKS (1 << 5) #define FCHK_MINSIZE (1 << 6) #define FCHK_MAXSIZE (1 << 7) #define FCHK_EQLSIZE (1 << 8) #define FCHK_OWNERID (1 << 10) #define FCHK_OWNERSTR (1 << 11) #define FCHK_GROUPID (1 << 12) #define FCHK_GROUPSTR (1 << 13) #define FCHK_CTIMEMIN (1 << 16) #define FCHK_CTIMEMAX (1 << 17) #define FCHK_CTIMEEQL (1 << 18) #define FCHK_MTIMEMIN (1 << 19) #define FCHK_MTIMEMAX (1 << 20) #define FCHK_MTIMEEQL (1 << 21) #define FCHK_ATIMEMIN (1 << 22) #define FCHK_ATIMEMAX (1 << 23) #define FCHK_ATIMEEQL (1 << 24) #define FCHK_MD5 (1 << 25) #define FCHK_SHA1 (1 << 26) #define FCHK_SHA256 (1 << 27) #define FCHK_SHA512 (1 << 28) #define FCHK_SHA224 (1 << 29) #define FCHK_SHA384 (1 << 30) #define FCHK_RMD160 (1 << 31) #define CHK_OPTIONAL (1 << 0) #define CHK_TRACKIT (1 << 1) typedef struct c_file_t { exprlist_t *filename; int color; int ftype; off_t minsize, maxsize, eqlsize; unsigned int minlinks, maxlinks, eqllinks; unsigned int fmode; int ownerid, groupid; char *ownerstr, *groupstr; unsigned int minctimedif, maxctimedif, ctimeeql; unsigned int minmtimedif, maxmtimedif, mtimeeql; unsigned int minatimedif, maxatimedif, atimeeql; char *md5hash, *sha1hash, *sha256hash, *sha512hash, *sha224hash, *sha384hash, *rmd160hash; } c_file_t; typedef struct c_dir_t { exprlist_t *filename; int color; unsigned long maxsize, minsize; } c_dir_t; typedef struct c_port_t { exprlist_t *localexp; exprlist_t *exlocalexp; exprlist_t *remoteexp; exprlist_t *exremoteexp; exprlist_t *stateexp; exprlist_t *exstateexp; int pmin, pmax, pcount; int color; } c_port_t; typedef struct c_svc_t { exprlist_t *svcexp; exprlist_t *stateexp; exprlist_t *startupexp; char *svcname, *startup, *state; int scount; int color; } c_svc_t; #define MIBCHK_MINVALUE (1 << 0) #define MIBCHK_MAXVALUE (1 << 1) #define MIBCHK_MATCH (1 << 2) typedef struct c_mibval_t { exprlist_t *mibvalexp; /* Key composed of the mib name and the value name */ exprlist_t *keyexp; /* Match pattern for the mib table key */ int color; long minval, maxval; exprlist_t *matchexp; /* * For optimization, we build a tree of c_rule_t pointers, indexed by a key * which is combined from the mib-, key- and value-names. This tree is updated * and/or used whenever an actual lookup happens for the thresholds. * So when doing a lookup, we first check to see if the combination is in the * tree; if not, then we scan the list by matching against the keyexp pattern * and update the tree with the result. */ int havetree; void * valdeftree; } c_mibval_t; #define RRDDSCHK_GT (1 << 0) #define RRDDSCHK_GE (1 << 1) #define RRDDSCHK_LT (1 << 2) #define RRDDSCHK_LE (1 << 3) #define RRDDSCHK_EQ (1 << 4) #define RRDDSCHK_INTVL (1 << 29) typedef struct c_rrdds_t { exprlist_t *rrdkey; /* Pattern match for filename of the RRD file */ char *rrdds; /* DS name */ char *column; /* Status column modified by this check */ int color; /* For absolute min/max values of the data item */ double limitval, limitval2; } c_rrdds_t; typedef struct c_mq_queue_t { exprlist_t *qmgrname, *qname; int warnlen, critlen; int warnage, critage; } c_mq_queue_t; typedef struct c_mq_channel_t { exprlist_t *qmgrname, *chnname, *warnstates, *alertstates; } c_mq_channel_t; typedef enum { C_LOAD, C_UPTIME, C_CLOCK, C_DISK, C_INODE, C_MEM, C_PROC, C_LOG, C_FILE, C_DIR, C_PORT, C_SVC, C_CICS, C_PAGING, C_MEM_GETVIS, C_MEM_VSIZE, C_ASID, C_RRDDS, C_MQ_QUEUE, C_MQ_CHANNEL, C_MIBVAL } ruletype_t; typedef struct c_rule_t { exprlist_t *hostexp; exprlist_t *exhostexp; exprlist_t *pageexp; exprlist_t *expageexp; exprlist_t *dgexp; exprlist_t *exdgexp; exprlist_t *classexp; exprlist_t *exclassexp; char *timespec, *extimespec, *statustext, *rrdidstr, *groups; ruletype_t ruletype; int cfid; uint32_t flags; uint32_t chkflags; struct c_rule_t *next; union { c_load_t load; c_uptime_t uptime; c_clock_t clock; c_disk_t disk; c_inode_t inode; c_mem_t mem; c_zos_mem_t zos_mem; c_zvse_vsize_t zvse_vsize; c_zvse_getvis_t zvse_getvis; c_cics_t cics; c_asid_t asid; c_proc_t proc; c_log_t log; c_file_t fcheck; c_dir_t dcheck; c_port_t port; c_svc_t svc; c_paging_t paging; c_mibval_t mibval; c_rrdds_t rrdds; c_mq_queue_t mqqueue; c_mq_channel_t mqchannel; } rule; } c_rule_t; static c_rule_t *rulehead = NULL; static c_rule_t *ruletail = NULL; static exprlist_t *exprhead = NULL; /* ruletree is a tree indexed by hostname of the rules. */ typedef struct ruleset_t { c_rule_t *rule; struct ruleset_t *next; } ruleset_t; static int havetree = 0; static void * ruletree; static off_t filesize_value(char *s) { /* s is the size in BYTES */ char *modifier; off_t result; modifier = (s + strspn(s, " 0123456789")); #ifdef _LARGEFILE_SOURCE result = (off_t) str2ll(s, NULL); #else result = (off_t) atol(s); #endif switch (*modifier) { case 'K': case 'k': result = (result << 10); break; case 'M': case 'm': result = (result << 20); break; case 'G': case 'g': result = (result << 30); break; case 'T': case 't': result = (result << 40); break; default: break; } return result; } static ruleset_t *ruleset(char *hostname, char *pagename, char *classname) { /* * This routine manages a list of rules that apply to a particular host. * * We maintain a tree indexed by hostname. Each node in the tree contains * a list of c_rule_t records, which point to individual rules in the full * list of rules. So instead of walking the entire list of rules for all hosts, * we can just go through those rules that are relevant for a given host. * This should speed up client-rule matching tremendously, since all of * the expensive pagename/hostname matches are only performed initially * when the list of rules for the host is decided. */ xtreePos_t handle; c_rule_t *rwalk; ruleset_t *head, *tail, *itm; char *pagenamecopy, *pgtok; int pgmatchres, pgexclres; handle = xtreeFind(ruletree, hostname); if (handle != xtreeEnd(ruletree)) { /* We have the tree for this host */ return (ruleset_t *)xtreeData(ruletree, handle); } pagenamecopy = strdup(pagename); /* We must build the list of rules for this host */ head = tail = NULL; for (rwalk = rulehead; (rwalk); rwalk = rwalk->next) { if (rwalk->exclassexp && namematch(classname, rwalk->exclassexp->pattern, rwalk->exclassexp->exp)) continue; if (rwalk->classexp && !namematch(classname, rwalk->classexp->pattern, rwalk->classexp->exp)) continue; if (rwalk->exhostexp && namematch(hostname, rwalk->exhostexp->pattern, rwalk->exhostexp->exp)) continue; if (rwalk->hostexp && !namematch(hostname, rwalk->hostexp->pattern, rwalk->hostexp->exp)) continue; if (rwalk->exdgexp && namematch(hostname, rwalk->exdgexp->pattern, rwalk->exdgexp->exp)) continue; if (rwalk->dgexp && !namematch(hostname, rwalk->dgexp->pattern, rwalk->dgexp->exp)) continue; pgmatchres = pgexclres = -1; pgtok = strtok(pagenamecopy, ","); while (pgtok) { if (rwalk->pageexp && (pgmatchres != 1)) pgmatchres = (namematch(pgtok, rwalk->pageexp->pattern, rwalk->pageexp->exp) ? 1 : 0); if (rwalk->expageexp && (pgexclres != 1)) pgexclres = (namematch(pgtok, rwalk->expageexp->pattern, rwalk->expageexp->exp) ? 1 : 0); pgtok = strtok(NULL, ","); } if (pgexclres == 1) continue; if (pgmatchres == 0) continue; /* All criteria match - add this rule to the list of rules for this host */ itm = (ruleset_t *)calloc(1, sizeof(ruleset_t)); itm->rule = rwalk; itm->next = NULL; if (head == NULL) { head = tail = itm; } else { tail->next = itm; tail = itm; } } /* Add the list to the tree */ xtreeAdd(ruletree, strdup(hostname), head); xfree(pagenamecopy); return head; } static exprlist_t *setup_expr(char *ptn, int multiline) { exprlist_t *newitem = (exprlist_t *)calloc(1, sizeof(exprlist_t)); newitem->pattern = strdup(ptn); if (*ptn == '%') { if (multiline) newitem->exp = multilineregex(ptn+1); else newitem->exp = compileregex(ptn+1); } newitem->next = exprhead; exprhead = newitem; return newitem; } static c_rule_t *setup_rule(ruletype_t ruletype, exprlist_t *curhost, exprlist_t *curexhost, exprlist_t *curpage, exprlist_t *curexpage, exprlist_t *curdg, exprlist_t *curexdg, exprlist_t *curclass, exprlist_t *curexclass, char *curtime, char *curextime, char *curtext, char *curgroup, int cfid) { c_rule_t *newitem = (c_rule_t *)calloc(1, sizeof(c_rule_t)); if (ruletail) { ruletail->next = newitem; ruletail = newitem; } else rulehead = ruletail = newitem; newitem->ruletype = ruletype; newitem->hostexp = curhost; newitem->exhostexp = curexhost; newitem->pageexp = curpage; newitem->expageexp = curexpage; newitem->dgexp = curdg; newitem->exdgexp = curexdg; newitem->classexp = curclass; newitem->exclassexp = curexclass; if (curtime) newitem->timespec = strdup(curtime); if (curextime) newitem->extimespec = strdup(curextime); if (curtext) newitem->statustext = strdup(curtext); if (curgroup) newitem->groups = strdup(curgroup); newitem->cfid = cfid; return newitem; } static int isqual(char *token) { if (!token) return 1; if ( (strncasecmp(token, "HOST=", 5) == 0) || (strncasecmp(token, "EXHOST=", 7) == 0) || (strncasecmp(token, "PAGE=", 5) == 0) || (strncasecmp(token, "EXPAGE=", 7) == 0) || (strncasecmp(token, "DISPLAYGROUP=", 13) == 0) || (strncasecmp(token, "EXDISPLAYGROUP=", 15) == 0) || (strncasecmp(token, "CLASS=", 6) == 0) || (strncasecmp(token, "EXCLASS=", 8) == 0) || (strncasecmp(token, "TEXT=", 5) == 0) || (strncasecmp(token, "GROUP=", 6) == 0) || (strncasecmp(token, "TIME=", 5) == 0) || (strncasecmp(token, "EXTIME=", 7) == 0) ) return 1; return 0; } static char *ftypestr(unsigned int ftype) { if (ftype == S_IFSOCK) return "socket"; else if (ftype == S_IFREG) return "file"; else if (ftype == S_IFBLK) return "block"; else if (ftype == S_IFCHR) return "char"; else if (ftype == S_IFDIR) return "dir"; else if (ftype == S_IFIFO) return "fifo"; else if (ftype == S_IFLNK) return "symlink"; return ""; } static char *grouplist = NULL; void clearalertgroups(void) { if (grouplist) xfree(grouplist); } char *getalertgroups(void) { if (grouplist) { *(grouplist + strlen(grouplist) - 1) = '\0'; return grouplist+1; } else return NULL; } void addalertgroup(char *group) { char *key; int curlen; if (group == NULL) return; key = (char *)malloc(strlen(group)+3); sprintf(key, ",%s,", group); if (!grouplist) { grouplist = key; return; } if (strstr(grouplist, key)) { xfree(key); return; } curlen = strlen(grouplist); grouplist = (char *)realloc(grouplist, curlen + strlen(key) + 2); sprintf(grouplist + curlen, "%s,", key); } int load_client_config(char *configfn) { /* (Re)load the configuration file without leaking memory */ static void *configfiles = NULL; char fn[PATH_MAX]; FILE *fd; strbuffer_t *inbuf; char *tok; exprlist_t *curhost, *curpage, *curclass, *curexhost, *curexpage, *curexclass, *curdg, *curexdg; char *curtime, *curextime, *curtext, *curgroup; c_rule_t *currule = NULL; int cfid = 0; MEMDEFINE(fn); if (configfn) strcpy(fn, configfn); else sprintf(fn, "%s/etc/analysis.cfg", xgetenv("XYMONHOME")); /* First check if there were no modifications at all */ if (configfiles) { if (!stackfmodified(configfiles)){ dbgprintf("No files modified, skipping reload of %s\n", fn); return 0; } else { stackfclist(&configfiles); configfiles = NULL; } } fd = stackfopen(fn, "r", &configfiles); if (!fd) { errprintf("Cannot load config file %s: %s\n", fn, strerror(errno)); MEMUNDEFINE(fn); return 0; } /* First free the old list, if any */ while (rulehead) { c_rule_t *tmp = rulehead; rulehead = rulehead->next; if (tmp->groups) xfree(tmp->groups); if (tmp->timespec) xfree(tmp->timespec); if (tmp->extimespec) xfree(tmp->extimespec); if (tmp->statustext) xfree(tmp->statustext); if (tmp->rrdidstr) xfree(tmp->rrdidstr); switch (tmp->ruletype) { case C_MIBVAL: if (tmp->rule.mibval.havetree) xtreeDestroy(tmp->rule.mibval.valdeftree); break; case C_RRDDS: if (tmp->rule.rrdds.rrdds) xfree(tmp->rule.rrdds.rrdds); if (tmp->rule.rrdds.column) xfree(tmp->rule.rrdds.column); break; default: break; } xfree(tmp); } rulehead = ruletail = NULL; while (exprhead) { exprlist_t *tmp = exprhead; exprhead = exprhead->next; if (tmp->pattern) xfree(tmp->pattern); if (tmp->exp) pcre_free(tmp->exp); xfree(tmp); } exprhead = NULL; if (havetree) { xtreePos_t handle; char *key; ruleset_t *head, *itm; handle = xtreeFirst(ruletree); while (handle != xtreeEnd(ruletree)) { key = (char *)xtreeKey(ruletree, handle); head = (ruleset_t *)xtreeData(ruletree, handle); xfree(key); while (head) { itm = head; head = head->next; xfree(itm); } handle = xtreeNext(ruletree, handle); } xtreeDestroy(ruletree); havetree = 0; } #define NEWRULE(X) (setup_rule(X, curhost, curexhost, curpage, curexpage, curdg, curexdg, curclass, curexclass, curtime, curextime, curtext, curgroup, cfid)); curhost = curpage = curclass = curexhost = curexpage = curexclass = curdg = curexdg = NULL; curtime = curextime = curtext = curgroup = NULL; inbuf = newstrbuffer(0); while (stackfgets(inbuf, NULL)) { exprlist_t *newhost, *newpage, *newexhost, *newexpage, *newclass, *newexclass, *newdg, *newexdg; char *newtime, *newextime, *newtext, *newgroup; int unknowntok = 0; cfid++; sanitize_input(inbuf, 1, 0); if (STRBUFLEN(inbuf) == 0) continue; newhost = newpage = newexhost = newexpage = newclass = newexclass = newdg = newexdg = NULL; newtime = newextime = newtext = newgroup = NULL; currule = NULL; tok = wstok(STRBUF(inbuf)); while (tok) { if (strncasecmp(tok, "HOST=", 5) == 0) { char *p = strchr(tok, '='); newhost = setup_expr(p+1, 0); if (currule) currule->hostexp = newhost; tok = wstok(NULL); continue; } else if (strncasecmp(tok, "EXHOST=", 7) == 0) { char *p = strchr(tok, '='); newexhost = setup_expr(p+1, 0); if (currule) currule->exhostexp = newexhost; tok = wstok(NULL); continue; } else if (strncasecmp(tok, "PAGE=", 5) == 0) { char *p = strchr(tok, '='); newpage = setup_expr(p+1, 0); if (currule) currule->pageexp = newpage; tok = wstok(NULL); continue; } else if (strncasecmp(tok, "EXPAGE=", 7) == 0) { char *p = strchr(tok, '='); newexpage = setup_expr(p+1, 0); if (currule) currule->expageexp = newexpage; tok = wstok(NULL); continue; } else if (strncasecmp(tok, "DISPLAYGROUP=", 13) == 0) { char *p = strchr(tok, '='); newdg = setup_expr(p+1, 0); if (currule) currule->dgexp = newdg; tok = wstok(NULL); continue; } else if (strncasecmp(tok, "EXDISPLAYGROUP=", 15) == 0) { char *p = strchr(tok, '='); newexdg = setup_expr(p+1, 0); if (currule) currule->exdgexp = newexdg; tok = wstok(NULL); continue; } else if (strncasecmp(tok, "CLASS=", 6) == 0) { char *p = strchr(tok, '='); newclass = setup_expr(p+1, 0); if (currule) currule->classexp = newclass; tok = wstok(NULL); continue; } else if (strncasecmp(tok, "EXCLASS=", 8) == 0) { char *p = strchr(tok, '='); newexclass = setup_expr(p+1, 0); if (currule) currule->exclassexp = newexclass; tok = wstok(NULL); continue; } else if (strncasecmp(tok, "TIME=", 5) == 0) { char *p = strchr(tok, '='); if (currule) currule->timespec = strdup(p+1); else newtime = strdup(p+1); tok = wstok(NULL); continue; } else if (strncasecmp(tok, "EXTIME=", 7) == 0) { char *p = strchr(tok, '='); if (currule) currule->extimespec = strdup(p+1); else newextime = strdup(p+1); tok = wstok(NULL); continue; } else if (strncasecmp(tok, "TEXT=", 5) == 0) { char *p = strchr(tok, '='); if (currule) currule->statustext = strdup(p+1); else newtext = strdup(p+1); tok = wstok(NULL); continue; } else if (strncasecmp(tok, "GROUP=", 6) == 0) { char *p = strchr(tok, '='); if (currule) currule->groups = strdup(p+1); else newgroup = strdup(p+1); tok = wstok(NULL); continue; } else if (strncasecmp(tok, "DEFAULT", 6) == 0) { currule = NULL; } else if (strcasecmp(tok, "UP") == 0) { currule = NEWRULE(C_UPTIME) currule->rule.uptime.recentlimit = 3600; currule->rule.uptime.ancientlimit = -1; currule->rule.uptime.color = COL_YELLOW; tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.uptime.recentlimit = 60*durationvalue(tok); tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.uptime.ancientlimit = 60*durationvalue(tok); tok = wstok(NULL); if (isqual(tok)) continue; if (tok) currule->rule.uptime.color = parse_color(tok); } else if (strcasecmp(tok, "CLOCK") == 0) { currule = NEWRULE(C_CLOCK); currule->rule.clock.maxdiff = 60; currule->rule.clock.color = COL_YELLOW; tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.clock.maxdiff = atoi(tok); tok = wstok(NULL); if (isqual(tok)) continue; if (tok) currule->rule.clock.color = parse_color(tok); } else if (strcasecmp(tok, "LOAD") == 0) { currule = NEWRULE(C_LOAD); currule->rule.load.warnlevel = 5.0; currule->rule.load.paniclevel = atof(tok); tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.load.warnlevel = atof(tok); tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.load.paniclevel = atof(tok); } else if (strcasecmp(tok, "DISK") == 0) { currule = NEWRULE(C_DISK); currule->rule.disk.abswarn = 0; currule->rule.disk.warnlevel = 90; currule->rule.disk.abspanic = 0; currule->rule.disk.paniclevel = 95; currule->rule.disk.dmin = 0; currule->rule.disk.dmax = -1; currule->rule.disk.color = COL_RED; currule->rule.disk.ignored = 0; tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.disk.fsexp = setup_expr(tok, 0); tok = wstok(NULL); if (isqual(tok)) continue; if (strcasecmp(tok, "ignore") == 0) { currule->rule.disk.ignored = 1; tok = wstok(NULL); continue; } currule->rule.disk.warnlevel = atol(tok); switch (*(tok + strspn(tok, "0123456789"))) { case 'U': case 'u': currule->rule.disk.abswarn = 1; break; case '%': currule->rule.disk.abswarn = 0; break; default : currule->rule.disk.abswarn = (currule->rule.disk.warnlevel > 200 ? 1 : 0); break; } tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.disk.paniclevel = atol(tok); switch (*(tok + strspn(tok, "0123456789"))) { case 'U': case 'u': currule->rule.disk.abspanic = 1; break; case '%': currule->rule.disk.abspanic = 0; break; default : currule->rule.disk.abspanic = (currule->rule.disk.paniclevel > 200 ? 1 : 0); break; } tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.disk.dmin = atoi(tok); tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.disk.dmax = atoi(tok); tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.disk.color = parse_color(tok); } else if (strcasecmp(tok, "INODE") == 0) { currule = NEWRULE(C_INODE); currule->rule.inode.abswarn = 0; currule->rule.inode.warnlevel = 70; currule->rule.inode.abspanic = 0; currule->rule.inode.paniclevel = 90; currule->rule.inode.imin = 0; currule->rule.inode.imax = -1; currule->rule.inode.color = COL_RED; currule->rule.inode.ignored = 0; tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.inode.fsexp = setup_expr(tok, 0); tok = wstok(NULL); if (isqual(tok)) continue; if (strcasecmp(tok, "ignore") == 0) { currule->rule.inode.ignored = 1; tok = wstok(NULL); continue; } currule->rule.inode.warnlevel = atol(tok); switch (*(tok + strspn(tok, "0123456789"))) { case 'U': case 'u': currule->rule.inode.abswarn = 1; break; case '%': currule->rule.inode.abswarn = 0; break; default : currule->rule.inode.abswarn = (currule->rule.inode.warnlevel > 200 ? 1 : 0); break; } tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.inode.paniclevel = atol(tok); switch (*(tok + strspn(tok, "0123456789"))) { case 'U': case 'u': currule->rule.inode.abspanic = 1; break; case '%': currule->rule.inode.abspanic = 0; break; default : currule->rule.inode.abspanic = (currule->rule.inode.paniclevel > 200 ? 1 : 0); break; } tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.inode.imin = atoi(tok); tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.inode.imax = atoi(tok); tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.inode.color = parse_color(tok); } else if ((strcasecmp(tok, "MEMREAL") == 0) || (strcasecmp(tok, "MEMPHYS") == 0) || (strcasecmp(tok, "PHYS") == 0)) { currule = NEWRULE(C_MEM); currule->rule.mem.memtype = C_MEM_PHYS; currule->rule.mem.warnlevel = 100; currule->rule.mem.paniclevel = 101; tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.mem.warnlevel = atoi(tok); tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.mem.paniclevel = atoi(tok); } else if ((strcasecmp(tok, "MEMSWAP") == 0) || (strcasecmp(tok, "SWAP") == 0)) { currule = NEWRULE(C_MEM); currule->rule.mem.memtype = C_MEM_SWAP; currule->rule.mem.warnlevel = 50; currule->rule.mem.paniclevel = 80; tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.mem.warnlevel = atoi(tok); tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.mem.paniclevel = atoi(tok); } else if ((strcasecmp(tok, "MEMACT") == 0) || (strcasecmp(tok, "ACTUAL") == 0) || (strcasecmp(tok, "ACT") == 0)) { currule = NEWRULE(C_MEM); currule->rule.mem.memtype = C_MEM_ACT; currule->rule.mem.warnlevel = 90; currule->rule.mem.paniclevel = 97; tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.mem.warnlevel = atoi(tok); tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.mem.paniclevel = atoi(tok); } else if (strcasecmp(tok, "MEMCSA") == 0) { currule = NEWRULE(C_MEM); currule->rule.zos_mem.zos_memtype = C_MEM_CSA; currule->rule.zos_mem.warnlevel = 90; currule->rule.zos_mem.paniclevel = 95; tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.zos_mem.warnlevel = atoi(tok); tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.zos_mem.paniclevel = atoi(tok); } else if (strcasecmp(tok, "MEMECSA") == 0) { currule = NEWRULE(C_MEM); currule->rule.zos_mem.zos_memtype = C_MEM_ECSA; currule->rule.zos_mem.warnlevel = 90; currule->rule.zos_mem.paniclevel = 95; tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.zos_mem.warnlevel = atoi(tok); tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.zos_mem.paniclevel = atoi(tok); } else if (strcasecmp(tok, "MEMSQA") == 0) { currule = NEWRULE(C_MEM); currule->rule.zos_mem.zos_memtype = C_MEM_SQA; currule->rule.zos_mem.warnlevel = 90; currule->rule.zos_mem.paniclevel = 95; tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.zos_mem.warnlevel = atoi(tok); tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.zos_mem.paniclevel = atoi(tok); } else if (strcasecmp(tok, "MEMESQA") == 0) { currule = NEWRULE(C_MEM); currule->rule.zos_mem.zos_memtype = C_MEM_ESQA; currule->rule.zos_mem.warnlevel = 90; currule->rule.zos_mem.paniclevel = 95; tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.zos_mem.warnlevel = atoi(tok); tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.zos_mem.paniclevel = atoi(tok); } else if (strcasecmp(tok, "CICS") == 0) { currule = NEWRULE(C_CICS); currule->rule.cics.dsawarnlevel = 90; currule->rule.cics.dsapaniclevel = 95; currule->rule.cics.edsawarnlevel = 90; currule->rule.cics.edsapaniclevel = 95; tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.cics.applid = setup_expr(tok, 0); tok = wstok(NULL); if (isqual(tok)) continue; if (strcasecmp(tok, "DSA") == 0) { tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.cics.dsawarnlevel = atoi(tok); tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.cics.dsapaniclevel = atoi(tok); } else if (strcasecmp(tok, "EDSA") == 0) { tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.cics.edsawarnlevel = atoi(tok); tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.cics.edsapaniclevel = atoi(tok); } tok = wstok(NULL); if (isqual(tok)) continue; if (strcasecmp(tok, "DSA") == 0) { tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.cics.dsawarnlevel = atoi(tok); tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.cics.dsapaniclevel = atoi(tok); } else if (strcasecmp(tok, "EDSA") == 0) { tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.cics.edsawarnlevel = atoi(tok); tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.cics.edsapaniclevel = atoi(tok); } } else if (strcasecmp(tok, "PROC") == 0) { int idx = 0; tok = wstok(NULL); if (tok == NULL) { errprintf("Syntax error line %d: PROC with no definition\n", cfid); unknowntok = 1; break; } currule = NEWRULE(C_PROC); currule->rule.proc.pmin = 1; currule->rule.proc.pmax = -1; currule->rule.proc.color = COL_RED; currule->rule.proc.procexp = setup_expr(tok, 0); do { tok = wstok(NULL); if (!tok || isqual(tok)) { idx = -1; continue; } if (strncasecmp(tok, "min=", 4) == 0) { currule->rule.proc.pmin = atoi(tok+4); } else if (strncasecmp(tok, "max=", 4) == 0) { currule->rule.proc.pmax = atoi(tok+4); /* When we have an explicit max, minimum should not be higher */ if (currule->rule.proc.pmax < currule->rule.proc.pmin) { currule->rule.proc.pmin = currule->rule.proc.pmax; } } else if (strncasecmp(tok, "color=", 6) == 0) { currule->rule.proc.color = parse_color(tok+6); } else if (strncasecmp(tok, "track", 5) == 0) { currule->chkflags |= CHK_TRACKIT; if (*(tok+5) == '=') currule->rrdidstr = strdup(tok+6); } else if (idx == 0) { currule->rule.proc.pmin = atoi(tok); idx++; } else if (idx == 1) { currule->rule.proc.pmax = atoi(tok); idx++; } else if (idx == 2) { currule->rule.proc.color = parse_color(tok); idx++; } } while (tok && (!isqual(tok))); /* It's easy to set max=0 when you only want to define a minimum */ if (currule->rule.proc.pmin && (currule->rule.proc.pmax == 0)) { currule->rule.proc.pmax = -1; } } else if (strcasecmp(tok, "LOG") == 0) { int idx = 0; currule = NEWRULE(C_LOG); currule->rule.log.logfile = NULL; currule->rule.log.matchexp = NULL; currule->rule.log.matchone = NULL; currule->rule.log.ignoreexp = NULL; currule->rule.log.color = COL_RED; do { tok = wstok(NULL); if (!tok || isqual(tok)) { idx = -1; continue; } if (strncasecmp(tok, "file=", 5) == 0) { currule->rule.log.logfile = setup_expr(tok+5, 0); } else if (strncasecmp(tok, "match=", 6) == 0) { currule->rule.log.matchexp = setup_expr(tok+6, 1); currule->rule.log.matchone = setup_expr(tok+6, 0); } else if (strncasecmp(tok, "ignore=", 7) == 0) { currule->rule.log.ignoreexp = setup_expr(tok+7, 1); } else if (strncasecmp(tok, "color=", 6) == 0) { currule->rule.log.color = parse_color(tok+6); } else if (strcasecmp(tok, "optional") == 0) { currule->chkflags |= CHK_OPTIONAL; } else if (idx == 0) { currule->rule.log.logfile = setup_expr(tok, 0); idx++; } else if (idx == 1) { currule->rule.log.matchexp = setup_expr(tok, 1); currule->rule.log.matchone = setup_expr(tok, 0); idx++; } else if (idx == 2) { currule->rule.log.color = parse_color(tok); idx++; } else if (idx == 3) { currule->rule.log.ignoreexp = setup_expr(tok, 1); idx++; } } while (tok && (!isqual(tok))); } else if (strcasecmp(tok, "FILE") == 0) { currule = NEWRULE(C_FILE); currule->rule.fcheck.filename = NULL; currule->rule.fcheck.color = COL_RED; tok = wstok(NULL); currule->rule.fcheck.filename = setup_expr(tok, 0); do { tok = wstok(NULL); if (!tok || isqual(tok)) continue; if (strcasecmp(tok, "noexist") == 0) { currule->flags |= FCHK_NOEXIST; } else if (strncasecmp(tok, "type=", 5) == 0) { currule->flags |= FCHK_TYPE; if (strcasecmp(tok+5, "socket") == 0) currule->rule.fcheck.ftype = S_IFSOCK; else if (strcasecmp(tok+5, "file") == 0) currule->rule.fcheck.ftype = S_IFREG; else if (strcasecmp(tok+5, "block") == 0) currule->rule.fcheck.ftype = S_IFBLK; else if (strcasecmp(tok+5, "char") == 0) currule->rule.fcheck.ftype = S_IFCHR; else if (strcasecmp(tok+5, "dir") == 0) currule->rule.fcheck.ftype = S_IFDIR; else if (strcasecmp(tok+5, "fifo") == 0) currule->rule.fcheck.ftype = S_IFIFO; else if (strcasecmp(tok+5, "symlink") == 0) currule->rule.fcheck.ftype = S_IFLNK; } else if (strncasecmp(tok, "size>", 5) == 0) { currule->flags |= FCHK_MINSIZE; currule->rule.fcheck.minsize = filesize_value(tok+5); } else if (strncasecmp(tok, "size<", 5) == 0) { currule->flags |= FCHK_MAXSIZE; currule->rule.fcheck.maxsize = filesize_value(tok+5); } else if (strncasecmp(tok, "size=", 5) == 0) { currule->flags |= FCHK_EQLSIZE; currule->rule.fcheck.eqlsize = filesize_value(tok+5); } else if (strncasecmp(tok, "links>", 6) == 0) { currule->flags |= FCHK_MINLINKS; currule->rule.fcheck.minlinks = atol(tok+6); } else if (strncasecmp(tok, "links<", 6) == 0) { currule->flags |= FCHK_MAXLINKS; currule->rule.fcheck.maxlinks = atol(tok+6); } else if (strncasecmp(tok, "links=", 6) == 0) { currule->flags |= FCHK_EQLLINKS; currule->rule.fcheck.eqllinks = atol(tok+6); } else if (strncasecmp(tok, "mode=", 5) == 0) { currule->flags |= FCHK_MODE; currule->rule.fcheck.fmode = strtol(tok+5, NULL, 8); } else if ((strncasecmp(tok, "owner=", 6) == 0) || (strncasecmp(tok, "ownerid=", 8) == 0)) { char *p, *eptr; int uid; p = strchr(tok, '='); uid = strtol(p+1, &eptr, 10); if (*eptr == '\0') { /* All numeric */ currule->flags |= FCHK_OWNERID; currule->rule.fcheck.ownerid = uid; } else { currule->flags |= FCHK_OWNERSTR; currule->rule.fcheck.ownerstr = strdup(p+1); } } else if (strncasecmp(tok, "groupid=", 8) == 0) { /* Cannot use "group" because that is reserved */ char *p, *eptr; int uid; p = strchr(tok, '='); uid = strtol(p+1, &eptr, 10); if (*eptr == '\0') { /* All numeric */ currule->flags |= FCHK_GROUPID; currule->rule.fcheck.groupid = uid; } else { currule->flags |= FCHK_GROUPSTR; currule->rule.fcheck.groupstr = strdup(p+1); } } else if (strncasecmp(tok, "mtime>", 6) == 0) { currule->flags |= FCHK_MTIMEMIN; currule->rule.fcheck.minmtimedif = atol(tok+6); } else if (strncasecmp(tok, "mtime<", 6) == 0) { currule->flags |= FCHK_MTIMEMAX; currule->rule.fcheck.maxmtimedif = atol(tok+6); } else if (strncasecmp(tok, "mtime=", 6) == 0) { currule->flags |= FCHK_MTIMEEQL; currule->rule.fcheck.mtimeeql = atol(tok+6); } else if (strncasecmp(tok, "ctime>", 6) == 0) { currule->flags |= FCHK_CTIMEMIN; currule->rule.fcheck.minctimedif = atol(tok+6); } else if (strncasecmp(tok, "ctime<", 6) == 0) { currule->flags |= FCHK_CTIMEMAX; currule->rule.fcheck.maxctimedif = atol(tok+6); } else if (strncasecmp(tok, "ctime=", 6) == 0) { currule->flags |= FCHK_CTIMEEQL; currule->rule.fcheck.ctimeeql = atol(tok+6); } else if (strncasecmp(tok, "atime>", 6) == 0) { currule->flags |= FCHK_ATIMEMIN; currule->rule.fcheck.minatimedif = atol(tok+6); } else if (strncasecmp(tok, "atime<", 6) == 0) { currule->flags |= FCHK_ATIMEMAX; currule->rule.fcheck.maxatimedif = atol(tok+6); } else if (strncasecmp(tok, "atime=", 6) == 0) { currule->flags |= FCHK_ATIMEEQL; currule->rule.fcheck.atimeeql = atol(tok+6); } else if (strncasecmp(tok, "md5=", 4) == 0) { currule->flags |= FCHK_MD5; currule->rule.fcheck.md5hash = strdup(tok+4); } else if (strncasecmp(tok, "sha1=", 5) == 0) { currule->flags |= FCHK_SHA1; currule->rule.fcheck.sha1hash = strdup(tok+5); } else if (strncasecmp(tok, "sha256=", 7) == 0) { currule->flags |= FCHK_SHA256; currule->rule.fcheck.sha256hash = strdup(tok+7); } else if (strncasecmp(tok, "sha512=", 7) == 0) { currule->flags |= FCHK_SHA512; currule->rule.fcheck.sha512hash = strdup(tok+7); } else if (strncasecmp(tok, "sha224=", 7) == 0) { currule->flags |= FCHK_SHA224; currule->rule.fcheck.sha224hash = strdup(tok+7); } else if (strncasecmp(tok, "sha384=", 7) == 0) { currule->flags |= FCHK_SHA384; currule->rule.fcheck.sha384hash = strdup(tok+7); } else if (strncasecmp(tok, "rmd160=", 7) == 0) { currule->flags |= FCHK_RMD160; currule->rule.fcheck.rmd160hash = strdup(tok+7); } else if (strncasecmp(tok, "track", 5) == 0) { currule->chkflags |= CHK_TRACKIT; if (*(tok+5) == '=') currule->rrdidstr = strdup(tok+6); } else if (strcasecmp(tok, "optional") == 0) { currule->chkflags |= CHK_OPTIONAL; } else { int col = parse_color(tok); if (col != -1) currule->rule.fcheck.color = col; } } while (tok && (!isqual(tok))); } else if (strcasecmp(tok, "DIR") == 0) { currule = NEWRULE(C_DIR); currule->rule.dcheck.filename = NULL; currule->rule.dcheck.color = COL_RED; tok = wstok(NULL); currule->rule.dcheck.filename = setup_expr(tok, 0); do { tok = wstok(NULL); if (!tok || isqual(tok)) continue; if (strncasecmp(tok, "size<", 5) == 0) { currule->flags |= FCHK_MAXSIZE; currule->rule.dcheck.maxsize = atol(tok+5); } else if (strncasecmp(tok, "size>", 5) == 0) { currule->flags |= FCHK_MINSIZE; currule->rule.dcheck.minsize = atol(tok+5); } else if (strncasecmp(tok, "track", 5) == 0) { currule->chkflags |= CHK_TRACKIT; if (*(tok+5) == '=') currule->rrdidstr = strdup(tok+6); } else { int col = parse_color(tok); if (col != -1) currule->rule.dcheck.color = col; } } while (tok && (!isqual(tok))); } else if (strcasecmp(tok, "PORT") == 0) { currule = NEWRULE(C_PORT); currule->rule.port.localexp = NULL; currule->rule.port.exlocalexp = NULL; currule->rule.port.remoteexp = NULL; currule->rule.port.exremoteexp = NULL; currule->rule.port.stateexp = NULL; currule->rule.port.exstateexp = NULL; currule->rule.port.pmin = 1; currule->rule.port.pmax = -1; currule->rule.port.color = COL_RED; /* parse syntax [local=ADDR] [remote=ADDR] [state=STATE] [min=mincount] [max=maxcount] [col=color] */ do { tok = wstok(NULL); if (!tok || isqual(tok)) continue; if (strncasecmp(tok, "local=", 6) == 0) { currule->rule.port.localexp = setup_expr(tok+6, 0); } else if (strncasecmp(tok, "exlocal=", 8) == 0) { currule->rule.port.exlocalexp = setup_expr(tok+8, 0); } else if (strncasecmp(tok, "remote=", 7) == 0) { currule->rule.port.remoteexp = setup_expr(tok+7, 0); } else if (strncasecmp(tok, "exremote=", 9) == 0) { currule->rule.port.exremoteexp = setup_expr(tok+9, 0); } else if (strncasecmp(tok, "state=", 6) == 0) { currule->rule.port.stateexp = setup_expr(tok+6, 0); } else if (strncasecmp(tok, "exstate=", 8) == 0) { currule->rule.port.exstateexp = setup_expr(tok+8, 0); } else if (strncasecmp(tok, "min=", 4) == 0) { currule->rule.port.pmin = atoi(tok+4); } else if (strncasecmp(tok, "max=", 4) == 0) { currule->rule.port.pmax = atoi(tok+4); /* When we have an explicit max, minimum should not be higher */ if (currule->rule.port.pmax < currule->rule.port.pmin) { currule->rule.port.pmin = currule->rule.port.pmax; } } else if (strncasecmp(tok, "col=", 4) == 0) { currule->rule.port.color = parse_color(tok+4); } else if (strncasecmp(tok, "color=", 6) == 0) { currule->rule.port.color = parse_color(tok+6); } else if (strncasecmp(tok, "track", 5) == 0) { currule->chkflags |= CHK_TRACKIT; if (*(tok+5) == '=') currule->rrdidstr = strdup(tok+6); } } while (tok && (!isqual(tok))); } else if (strcasecmp(tok, "PAGING") == 0) { currule = NEWRULE(C_PAGING); currule->rule.paging.warnlevel = 5; currule->rule.paging.paniclevel = 10; tok = wstok(NULL); if (!tok || isqual(tok)) continue; currule->rule.paging.warnlevel = atoi(tok); tok = wstok(NULL); if (!tok || isqual(tok)) continue; currule->rule.paging.paniclevel = atoi(tok); } else if (strcasecmp(tok, "GETVIS") == 0) { currule = NEWRULE(C_MEM_GETVIS); currule->rule.zvse_getvis.warnlevel = 90; currule->rule.zvse_getvis.paniclevel = 95; currule->rule.zvse_getvis.anywarnlevel = 90; currule->rule.zvse_getvis.anypaniclevel = 95; tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.zvse_getvis.partid = setup_expr(tok, 0); tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.zvse_getvis.warnlevel = atoi(tok); tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.zvse_getvis.paniclevel = atoi(tok); tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.zvse_getvis.anywarnlevel = atoi(tok); tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.zvse_getvis.anypaniclevel = atoi(tok); } else if (strcasecmp(tok, "VSIZE") == 0) { currule = NEWRULE(C_MEM_VSIZE); currule->rule.zvse_vsize.warnlevel = 90; currule->rule.zvse_vsize.paniclevel = 95; tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.zvse_vsize.warnlevel = atoi(tok); tok = wstok(NULL); if (isqual(tok)) continue; currule->rule.zvse_vsize.paniclevel = atoi(tok); } else if (strcasecmp(tok, "MAXUSER") == 0) { currule = NEWRULE(C_ASID); currule->rule.asid.asidtype = C_ASID_MAXUSER; currule->rule.asid.warnlevel = 101; currule->rule.asid.paniclevel = 101; tok = wstok(NULL); if (!tok || isqual(tok)) continue; currule->rule.asid.warnlevel = atoi(tok); tok = wstok(NULL); if (!tok || isqual(tok)) continue; currule->rule.asid.paniclevel = atoi(tok); } else if (strcasecmp(tok, "NPARTS") == 0) { currule = NEWRULE(C_ASID); currule->rule.asid.asidtype = C_ASID_NPARTS; currule->rule.asid.warnlevel = 101; currule->rule.asid.paniclevel = 101; tok = wstok(NULL); if (!tok || isqual(tok)) continue; currule->rule.asid.warnlevel = atoi(tok); tok = wstok(NULL); if (!tok || isqual(tok)) continue; currule->rule.asid.paniclevel = atoi(tok); } else if (strcasecmp(tok, "SVC") == 0) { tok = wstok(NULL); /* See if there is any service definition at all */ if (tok) { currule = NEWRULE(C_SVC); currule->rule.svc.svcexp = setup_expr(tok, 0); currule->rule.svc.startupexp = NULL; currule->rule.svc.stateexp = NULL; currule->rule.svc.state = NULL; currule->rule.svc.startup = NULL; currule->rule.svc.color = COL_RED; do { tok = wstok(NULL); if (!tok || isqual(tok)) continue; if (strncasecmp(tok, "startup=", 8) == 0) { currule->rule.svc.startupexp = setup_expr(tok+8, 0); } else if (strncasecmp(tok, "status=", 7) == 0) { currule->rule.svc.stateexp = setup_expr(tok+7, 0); } else if (strncasecmp(tok, "col=", 4) == 0) { currule->rule.svc.color = parse_color(tok+4); } else if (strncasecmp(tok, "color=", 6) == 0) { currule->rule.svc.color = parse_color(tok+6); } } while (tok && (!isqual(tok))); if (!currule->rule.svc.stateexp && !currule->rule.svc.startupexp) { /* No criteria defined, so we'll assume they just want to check that the service is running */ currule->rule.svc.stateexp = setup_expr("started", 0); } } } else if (strcasecmp(tok, "MIB") == 0) { currule = NEWRULE(C_MIBVAL); currule->rule.mibval.mibvalexp = NULL; currule->rule.mibval.keyexp = NULL; currule->rule.mibval.color = COL_RED; currule->rule.mibval.minval = -1; currule->rule.mibval.maxval = -1; currule->rule.mibval.matchexp = NULL; tok = wstok(NULL); currule->rule.mibval.mibvalexp = setup_expr(tok, 0); do { tok = wstok(NULL); if (!tok || isqual(tok)) continue; if (strncasecmp(tok, "key=", 4) == 0) { currule->rule.mibval.keyexp = setup_expr(tok+4, 0); } else if (strncasecmp(tok, "max=", 4) == 0) { currule->flags |= MIBCHK_MAXVALUE; currule->rule.mibval.maxval = atol(tok+4); } else if (strncasecmp(tok, "min=", 4) == 0) { currule->flags |= MIBCHK_MINVALUE; currule->rule.mibval.minval = atol(tok+4); } else if (strncasecmp(tok, "match=", 6) == 0) { currule->flags |= MIBCHK_MATCH; currule->rule.mibval.matchexp = setup_expr(tok+6, 0); } else if (strncasecmp(tok, "color=", 6) == 0) { int col = parse_color(tok+6); if (col != -1) currule->rule.mibval.color = col; } } while (tok && (!isqual(tok))); } else if (strcasecmp(tok, "DS") == 0) { char *key, *ds, *column; currule = NEWRULE(C_RRDDS); currule->rule.rrdds.color = COL_RED; tok = wstok(NULL); column = tok; tok = wstok(NULL); key = tok; ds = (tok ? strrchr(tok, ':') : NULL); if (ds) { *ds = '\0'; ds++; } if (!column || !key || !ds) { errprintf("Invalid DS definition at line %d (missing column, key and/or dataset)\n", cfid); continue; } currule->rule.rrdds.rrdkey = setup_expr(key, 0); currule->rule.rrdds.rrdds = strdup(ds); currule->rule.rrdds.column = strdup(column); do { int getnumber = 0; tok = wstok(NULL); if (!tok || isqual(tok)) continue; if (strncasecmp(tok, ">=", 2) == 0) { if (currule->flags) currule->flags |= RRDDSCHK_INTVL; currule->flags |= RRDDSCHK_GE; getnumber = 2; } else if (strncasecmp(tok, "<=", 2) == 0) { if (currule->flags) currule->flags |= RRDDSCHK_INTVL; currule->flags |= RRDDSCHK_LE; getnumber = 2; } else if (strncasecmp(tok, ">", 1) == 0) { if (currule->flags) currule->flags |= RRDDSCHK_INTVL; currule->flags |= RRDDSCHK_GT; getnumber = 1; } else if (strncasecmp(tok, "<", 1) == 0) { if (currule->flags) currule->flags |= RRDDSCHK_INTVL; currule->flags |= RRDDSCHK_LT; getnumber = 1; } else if (strncasecmp(tok, "color=", 6) == 0) { int col = parse_color(tok+6); if (col != -1) currule->rule.rrdds.color = col; } if (getnumber) { if (currule->flags & RRDDSCHK_INTVL) currule->rule.rrdds.limitval2 = atof(tok+getnumber); else currule->rule.rrdds.limitval = atof(tok+getnumber); if ((currule->flags & RRDDSCHK_INTVL) && (currule->rule.rrdds.limitval > currule->rule.rrdds.limitval2)) { /* Swap the two values, so we always have limitval as the lower bound, and limitval2 as the upper */ double tmp; tmp=currule->rule.rrdds.limitval; currule->rule.rrdds.limitval = currule->rule.rrdds.limitval2; currule->rule.rrdds.limitval2 = tmp; } } } while (tok && (!isqual(tok))); } else if (strcasecmp(tok, "MQ_QUEUE") == 0) { char *p; currule = NEWRULE(C_MQ_QUEUE); currule->rule.mqqueue.qmgrname = NULL; currule->rule.mqqueue.qname = NULL; currule->rule.mqqueue.warnlen = -1; currule->rule.mqqueue.critlen = -1; currule->rule.mqqueue.warnage = -1; currule->rule.mqqueue.critage = -1; tok = wstok(NULL); p = strchr(tok, ':'); if (p) { *p = '\0'; p++; currule->rule.mqqueue.qmgrname = setup_expr(tok, 0); currule->rule.mqqueue.qname = setup_expr(p, 0); } else { currule->rule.mqqueue.qmgrname = setup_expr("*", 0); currule->rule.mqqueue.qname = setup_expr(tok, 0); }; do { tok = wstok(NULL); if (!tok || isqual(tok)) continue; if (strncasecmp(tok, "depth-warning=", 14) == 0) { currule->rule.mqqueue.warnlen = atol(tok+14); } else if (strncasecmp(tok, "depth-critical=", 15) == 0) { currule->rule.mqqueue.critlen = atol(tok+15); } else if (strncasecmp(tok, "age-warning=", 12) == 0) { currule->rule.mqqueue.warnage = atol(tok+12); } else if (strncasecmp(tok, "age-critical=", 13) == 0) { currule->rule.mqqueue.critage = atol(tok+13); } else if (strncasecmp(tok, "track", 5) == 0) { currule->chkflags |= CHK_TRACKIT; if (*(tok+5) == '=') currule->rrdidstr = strdup(tok+6); } } while (tok && (!isqual(tok))); } else if (strcasecmp(tok, "MQ_CHANNEL") == 0) { char *p; currule = NEWRULE(C_MQ_CHANNEL); currule->rule.mqchannel.qmgrname = NULL; currule->rule.mqchannel.chnname = NULL; currule->rule.mqchannel.warnstates = NULL; currule->rule.mqchannel.alertstates = NULL; tok = wstok(NULL); p = strchr(tok, ':'); if (p) { *p = '\0'; p++; currule->rule.mqchannel.qmgrname = setup_expr(tok, 0); currule->rule.mqchannel.chnname = setup_expr(p, 0); } else { currule->rule.mqchannel.qmgrname = setup_expr("*", 0); currule->rule.mqchannel.chnname = setup_expr(tok, 0); }; do { tok = wstok(NULL); if (!tok || isqual(tok)) continue; if (strncasecmp(tok, "warning=", 8) == 0) { currule->rule.mqchannel.warnstates = setup_expr(tok+8, 0); } else if (strncasecmp(tok, "alert=", 6) == 0) { currule->rule.mqchannel.alertstates = setup_expr(tok+6, 0); } } while (tok && (!isqual(tok))); if ((currule->rule.mqchannel.warnstates == NULL) && (currule->rule.mqchannel.alertstates == NULL)) { /* Default: Alert on channel in BIND or RETRYING state */ currule->rule.mqchannel.alertstates = setup_expr("%BIND|RETRYING", 0); } } else { errprintf("Unknown token '%s' ignored at line %d\n", tok, cfid); unknowntok = 1; tok = NULL; continue; } if (tok && !isqual(tok)) tok = wstok(NULL); } if (!currule && !unknowntok) { /* No rules on this line - its the new set of criteria */ curhost = newhost; curpage = newpage; curclass = newclass; curexhost = newexhost; curexpage = newexpage; curexclass = newexclass; if (curtime) xfree(curtime); curtime = newtime; if (curextime) xfree(curextime); curextime = newextime; if (curtext) xfree(curtext); curtext = newtext; if (curgroup) xfree(curgroup); curgroup = newgroup; } } stackfclose(fd); freestrbuffer(inbuf); if (curtime) xfree(curtime); if (curextime) xfree(curextime); if (curtext) xfree(curtext); /* Create the ruletree, but leave it empty - it will be filled as clients report */ ruletree = xtreeNew(strcasecmp); havetree = 1; MEMUNDEFINE(fn); return 1; } void dump_client_config(void) { c_rule_t *rwalk; for (rwalk = rulehead; (rwalk); rwalk = rwalk->next) { switch (rwalk->ruletype) { case C_UPTIME: printf("UP %d %d", rwalk->rule.uptime.recentlimit, rwalk->rule.uptime.ancientlimit); break; case C_CLOCK: printf("CLOCK %d", rwalk->rule.clock.maxdiff); break; case C_LOAD: printf("LOAD %.2f %.2f", rwalk->rule.load.warnlevel, rwalk->rule.load.paniclevel); break; case C_DISK: if (!rwalk->rule.disk.fsexp) break; printf("DISK %s", rwalk->rule.disk.fsexp->pattern); if (rwalk->rule.disk.ignored) printf(" IGNORE"); else { printf(" %lu%c", rwalk->rule.disk.warnlevel, (rwalk->rule.disk.abswarn ? 'U' : '%')); printf(" %lu%c", rwalk->rule.disk.paniclevel, (rwalk->rule.disk.abspanic ? 'U' : '%')); printf(" %d %d %s", rwalk->rule.disk.dmin, rwalk->rule.disk.dmax, colorname(rwalk->rule.disk.color)); } break; case C_INODE: if (!rwalk->rule.inode.fsexp) break; printf("INODE %s", rwalk->rule.inode.fsexp->pattern); if (rwalk->rule.inode.ignored) printf(" IGNORE"); else { printf(" %lu%c", rwalk->rule.inode.warnlevel, (rwalk->rule.inode.abswarn ? 'U' : '%')); printf(" %lu%c", rwalk->rule.inode.paniclevel, (rwalk->rule.inode.abspanic ? 'U' : '%')); printf(" %d %d %s", rwalk->rule.inode.imin, rwalk->rule.inode.imax, colorname(rwalk->rule.inode.color)); } break; case C_MEM: switch (rwalk->rule.mem.memtype) { case C_MEM_PHYS: printf("MEMREAL"); break; case C_MEM_SWAP: printf("MEMSWAP"); break; case C_MEM_ACT: printf("MEMACT"); break; } printf(" %d %d", rwalk->rule.mem.warnlevel, rwalk->rule.mem.paniclevel); break; case C_ASID: switch (rwalk->rule.asid.asidtype) { case C_ASID_MAXUSER: printf("MAXUSER: "); break; case C_ASID_NPARTS: printf(" NPARTS: "); break; } printf(" %d %d", rwalk->rule.asid.warnlevel, rwalk->rule.asid.paniclevel); break; case C_PROC: if (!rwalk->rule.proc.procexp) break; if (strchr(rwalk->rule.proc.procexp->pattern, ' ') || strchr(rwalk->rule.proc.procexp->pattern, '\t')) { printf("PROC \"%s\" %d %d %s", rwalk->rule.proc.procexp->pattern, rwalk->rule.proc.pmin, rwalk->rule.proc.pmax, colorname(rwalk->rule.proc.color)); } else { printf("PROC %s %d %d %s", rwalk->rule.proc.procexp->pattern, rwalk->rule.proc.pmin, rwalk->rule.proc.pmax, colorname(rwalk->rule.proc.color)); } break; case C_LOG: if (!rwalk->rule.log.logfile || !rwalk->rule.log.matchexp) break; printf("LOG %s MATCH=%s COLOR=%s", rwalk->rule.log.logfile->pattern, rwalk->rule.log.matchexp->pattern, colorname(rwalk->rule.log.color)); if (rwalk->rule.log.ignoreexp) printf(" IGNORE=%s", rwalk->rule.log.ignoreexp->pattern); break; case C_FILE: if (!rwalk->rule.fcheck.filename) break; printf("FILE %s %s", rwalk->rule.fcheck.filename->pattern, colorname(rwalk->rule.fcheck.color)); if (rwalk->flags & FCHK_NOEXIST) printf(" noexist"); if (rwalk->flags & FCHK_TYPE) printf(" type=%s", ftypestr(rwalk->rule.fcheck.ftype)); if (rwalk->flags & FCHK_MODE) printf(" mode=%o", rwalk->rule.fcheck.fmode); #ifdef _LARGEFILE_SOURCE if (rwalk->flags & FCHK_MINSIZE) printf(" size>%lld", (long long int)rwalk->rule.fcheck.minsize); if (rwalk->flags & FCHK_MAXSIZE) printf(" size<%lld", (long long int)rwalk->rule.fcheck.maxsize); if (rwalk->flags & FCHK_EQLSIZE) printf(" size=%lld", (long long int)rwalk->rule.fcheck.eqlsize); #else if (rwalk->flags & FCHK_MINSIZE) printf(" size>%ld", rwalk->rule.fcheck.minsize); if (rwalk->flags & FCHK_MAXSIZE) printf(" size<%ld", rwalk->rule.fcheck.maxsize); if (rwalk->flags & FCHK_EQLSIZE) printf(" size=%ld", rwalk->rule.fcheck.eqlsize); #endif if (rwalk->flags & FCHK_MINLINKS) printf(" links>%u", rwalk->rule.fcheck.minlinks); if (rwalk->flags & FCHK_MAXLINKS) printf(" links<%u", rwalk->rule.fcheck.maxlinks); if (rwalk->flags & FCHK_EQLLINKS) printf(" links=%u", rwalk->rule.fcheck.eqllinks); if (rwalk->flags & FCHK_OWNERID) printf(" owner=%u", rwalk->rule.fcheck.ownerid); if (rwalk->flags & FCHK_OWNERSTR) printf(" owner=%s", rwalk->rule.fcheck.ownerstr); if (rwalk->flags & FCHK_GROUPID) printf(" group=%u", rwalk->rule.fcheck.groupid); if (rwalk->flags & FCHK_GROUPSTR) printf(" group=%s", rwalk->rule.fcheck.groupstr); if (rwalk->flags & FCHK_CTIMEMIN) printf(" ctime>%u", rwalk->rule.fcheck.minctimedif); if (rwalk->flags & FCHK_CTIMEMAX) printf(" ctime<%u", rwalk->rule.fcheck.maxctimedif); if (rwalk->flags & FCHK_CTIMEEQL) printf(" ctime=%u", rwalk->rule.fcheck.ctimeeql); if (rwalk->flags & FCHK_MTIMEMIN) printf(" mtime>%u", rwalk->rule.fcheck.minmtimedif); if (rwalk->flags & FCHK_MTIMEMAX) printf(" mtime<%u", rwalk->rule.fcheck.maxmtimedif); if (rwalk->flags & FCHK_MTIMEEQL) printf(" mtime=%u", rwalk->rule.fcheck.mtimeeql); if (rwalk->flags & FCHK_ATIMEMIN) printf(" atime>%u", rwalk->rule.fcheck.minatimedif); if (rwalk->flags & FCHK_ATIMEMAX) printf(" atime<%u", rwalk->rule.fcheck.maxatimedif); if (rwalk->flags & FCHK_ATIMEEQL) printf(" atime=%u", rwalk->rule.fcheck.atimeeql); if (rwalk->flags & FCHK_MD5) printf(" md5=%s", rwalk->rule.fcheck.md5hash); if (rwalk->flags & FCHK_SHA1) printf(" sha1=%s", rwalk->rule.fcheck.sha1hash); if (rwalk->flags & FCHK_SHA256) printf(" sha256=%s", rwalk->rule.fcheck.sha256hash); if (rwalk->flags & FCHK_SHA512) printf(" sha512=%s", rwalk->rule.fcheck.sha512hash); if (rwalk->flags & FCHK_SHA224) printf(" sha224=%s", rwalk->rule.fcheck.sha224hash); if (rwalk->flags & FCHK_SHA384) printf(" sha384=%s", rwalk->rule.fcheck.sha384hash); if (rwalk->flags & FCHK_RMD160) printf(" rmd160=%s", rwalk->rule.fcheck.rmd160hash); break; case C_DIR: if (!rwalk->rule.dcheck.filename) break; printf("DIR %s %s", rwalk->rule.dcheck.filename->pattern, colorname(rwalk->rule.dcheck.color)); if (rwalk->flags & FCHK_MINSIZE) printf(" size>%lu", rwalk->rule.dcheck.minsize); if (rwalk->flags & FCHK_MAXSIZE) printf(" size<%lu", rwalk->rule.dcheck.maxsize); break; case C_PORT: printf("PORT"); if (rwalk->rule.port.localexp) printf(" local=%s", rwalk->rule.port.localexp->pattern); if (rwalk->rule.port.exlocalexp) printf(" exlocal=%s", rwalk->rule.port.exlocalexp->pattern); if (rwalk->rule.port.remoteexp) printf(" remote=%s", rwalk->rule.port.remoteexp->pattern); if (rwalk->rule.port.exremoteexp) printf(" exremote=%s", rwalk->rule.port.exremoteexp->pattern); if (rwalk->rule.port.stateexp) printf(" state=%s", rwalk->rule.port.stateexp->pattern); if (rwalk->rule.port.exstateexp) printf(" exstate=%s", rwalk->rule.port.exstateexp->pattern); if (rwalk->rule.port.pmin != -1) printf(" min=%d", rwalk->rule.port.pmin); if (rwalk->rule.port.pmax != -1) printf(" max=%d", rwalk->rule.port.pmax); printf(" color=%s", colorname(rwalk->rule.port.color)); break; case C_PAGING: printf("PAGING %d %d", rwalk->rule.paging.warnlevel, rwalk->rule.paging.paniclevel); break; case C_MEM_VSIZE: printf("z/VSE VSIZE %d %d", rwalk->rule.zvse_vsize.warnlevel, rwalk->rule.zvse_vsize.paniclevel); break; case C_MEM_GETVIS: break; case C_CICS: if (!rwalk->rule.cics.applid) break; printf("CICS: Appid:%s, DSA warning:%d, DSA panic:%d, EDSA warning%d, EDSA panic:%d", rwalk->rule.cics.applid->pattern, rwalk->rule.cics.dsawarnlevel, rwalk->rule.cics.dsapaniclevel, rwalk->rule.cics.edsawarnlevel, rwalk->rule.cics.edsapaniclevel); break; case C_SVC: if (!rwalk->rule.svc.svcexp) break; printf("SVC %s", rwalk->rule.svc.svcexp->pattern); if (rwalk->rule.svc.stateexp) printf(" status=%s", rwalk->rule.svc.stateexp->pattern); if (rwalk->rule.svc.startupexp) printf(" startup=%s", rwalk->rule.svc.startupexp->pattern); printf(" color=%s", colorname(rwalk->rule.svc.color)); break; case C_MIBVAL: printf("MIB"); if (rwalk->rule.mibval.mibvalexp) printf(" %s", rwalk->rule.mibval.mibvalexp->pattern); if (rwalk->rule.mibval.keyexp) printf(" key=%s", rwalk->rule.mibval.keyexp->pattern); if (rwalk->flags & MIBCHK_MINVALUE) printf(" min=%ld", rwalk->rule.mibval.minval); if (rwalk->flags & MIBCHK_MAXVALUE) printf(" max=%ld", rwalk->rule.mibval.maxval); if (rwalk->flags & MIBCHK_MATCH) printf(" match=%s", rwalk->rule.mibval.matchexp->pattern); printf(" color=%s", colorname(rwalk->rule.mibval.color)); break; case C_RRDDS: if (!rwalk->rule.rrdds.rrdkey) break; printf("DS %s %s:%s", rwalk->rule.rrdds.column, rwalk->rule.rrdds.rrdkey->pattern, rwalk->rule.rrdds.rrdds); if (rwalk->flags & RRDDSCHK_GT) printf(" >%.2f", rwalk->rule.rrdds.limitval); if (rwalk->flags & RRDDSCHK_GE) printf(" >=%.2f", rwalk->rule.rrdds.limitval); if (rwalk->flags & RRDDSCHK_INTVL) { if (rwalk->flags & RRDDSCHK_LT) printf(" <%.2f", rwalk->rule.rrdds.limitval2); if (rwalk->flags & RRDDSCHK_LE) printf(" <=%.2f", rwalk->rule.rrdds.limitval2); } else { if (rwalk->flags & RRDDSCHK_LT) printf(" <%.2f", rwalk->rule.rrdds.limitval); if (rwalk->flags & RRDDSCHK_LE) printf(" <=%.2f", rwalk->rule.rrdds.limitval); } printf(" color=%s", colorname(rwalk->rule.rrdds.color)); break; case C_MQ_QUEUE: if (!rwalk->rule.mqqueue.qmgrname || !rwalk->rule.mqqueue.qname) break; printf("MQ_QUEUE %s:%s", rwalk->rule.mqqueue.qmgrname->pattern, rwalk->rule.mqqueue.qname->pattern); if (rwalk->rule.mqqueue.warnlen != -1) printf(" depth-warn=%d", rwalk->rule.mqqueue.warnlen); if (rwalk->rule.mqqueue.critlen != -1) printf(" depth-critical=%d", rwalk->rule.mqqueue.critlen); if (rwalk->rule.mqqueue.warnage != -1) printf(" age-warn=%d", rwalk->rule.mqqueue.warnage); if (rwalk->rule.mqqueue.critage != -1) printf(" age-critical=%d", rwalk->rule.mqqueue.critage); break; case C_MQ_CHANNEL: if (!rwalk->rule.mqchannel.qmgrname || !rwalk->rule.mqchannel.chnname) break; printf("MQ_CHANNEL %s:%s",rwalk->rule.mqchannel.qmgrname->pattern , rwalk->rule.mqchannel.chnname->pattern); if (rwalk->rule.mqchannel.warnstates) printf(" warning=%s", rwalk->rule.mqchannel.warnstates->pattern); if (rwalk->rule.mqchannel.alertstates) printf(" alert=%s", rwalk->rule.mqchannel.alertstates->pattern); break; } if (rwalk->chkflags & CHK_TRACKIT) { printf(" TRACK"); if (rwalk->rrdidstr) printf("=%s", rwalk->rrdidstr); } if (rwalk->chkflags & CHK_OPTIONAL) printf(" OPTIONAL"); if (rwalk->timespec) printf(" TIME=%s", rwalk->timespec); if (rwalk->extimespec) printf(" EXTIME=%s", rwalk->extimespec); if (rwalk->hostexp) printf(" HOST=%s", rwalk->hostexp->pattern); if (rwalk->exhostexp) printf(" EXHOST=%s", rwalk->exhostexp->pattern); if (rwalk->dgexp) printf(" DISPLAYGROUP=%s", rwalk->dgexp->pattern); if (rwalk->exdgexp) printf(" EXDISPLAYGROUP=%s", rwalk->exdgexp->pattern); if (rwalk->pageexp) printf(" PAGE=%s", rwalk->pageexp->pattern); if (rwalk->expageexp) printf(" EXPAGE=%s", rwalk->expageexp->pattern); if (rwalk->classexp) printf(" CLASS=%s", rwalk->classexp->pattern); if (rwalk->exclassexp) printf(" EXCLASS=%s", rwalk->exclassexp->pattern); if (rwalk->statustext) printf(" TEXT=%s", rwalk->statustext); printf(" (line: %d)\n", rwalk->cfid); } } static c_rule_t *getrule(char *hostname, char *pagename, char *classname, void *hinfo, ruletype_t ruletype) { static ruleset_t *rwalk = NULL; char *holidayset; if (hostname || pagename) { rwalk = ruleset(hostname, pagename, classname); } else { if (rwalk) rwalk = rwalk->next; } holidayset = (hinfo ? xmh_item(hinfo, XMH_HOLIDAYS) : NULL); for (; (rwalk); rwalk = rwalk->next) { if (rwalk->rule->ruletype != ruletype) continue; if (rwalk->rule->timespec && !timematch(holidayset, rwalk->rule->timespec)) continue; if (rwalk->rule->extimespec && timematch(holidayset, rwalk->rule->extimespec)) continue; /* If we get here, then we have something that matches */ return rwalk->rule; } return NULL; } int get_cpu_thresholds(void *hinfo, char *classname, float *loadyellow, float *loadred, int *recentlimit, int *ancientlimit, int *uptimecolor, int *maxclockdiff, int *clockdiffcolor) { int result = 0; char *hostname, *pagename; c_rule_t *rule; hostname = xmh_item(hinfo, XMH_HOSTNAME); pagename = xmh_item(hinfo, XMH_ALLPAGEPATHS); *loadyellow = 5.0; *loadred = 10.0; *uptimecolor = *clockdiffcolor = COL_YELLOW; rule = getrule(hostname, pagename, classname, hinfo, C_LOAD); if (rule) { *loadyellow = rule->rule.load.warnlevel; *loadred = rule->rule.load.paniclevel; result = rule->cfid; } *recentlimit = 3600; *ancientlimit = -1; rule = getrule(hostname, pagename, classname, hinfo, C_UPTIME); if (rule) { *recentlimit = rule->rule.uptime.recentlimit; *ancientlimit = rule->rule.uptime.ancientlimit; *uptimecolor = rule->rule.uptime.color; result = rule->cfid; } *maxclockdiff = -1; rule = getrule(hostname, pagename, classname, hinfo, C_CLOCK); if (rule) { *maxclockdiff = rule->rule.clock.maxdiff; *clockdiffcolor = rule->rule.clock.color; } return result; } int get_disk_thresholds(void *hinfo, char *classname, char *fsname, long *warnlevel, long *paniclevel, int *abswarn, int *abspanic, int *ignored, char **group) { char *hostname, *pagename; c_rule_t *rule; hostname = xmh_item(hinfo, XMH_HOSTNAME); pagename = xmh_item(hinfo, XMH_ALLPAGEPATHS); *warnlevel = 90; *paniclevel = 95; *abswarn = 0; *abspanic = 0; *ignored = 0; *group = NULL; rule = getrule(hostname, pagename, classname, hinfo, C_DISK); while (rule && (!rule->rule.disk.fsexp || !namematch(fsname, rule->rule.disk.fsexp->pattern, rule->rule.disk.fsexp->exp))) { rule = getrule(NULL, NULL, NULL, hinfo, C_DISK); } if (rule) { *warnlevel = rule->rule.disk.warnlevel; *abswarn = rule->rule.disk.abswarn; *paniclevel = rule->rule.disk.paniclevel; *abspanic = rule->rule.disk.abspanic; *ignored = rule->rule.disk.ignored; *group = rule->groups; return rule->cfid; } return 0; } int get_inode_thresholds(void *hinfo, char *classname, char *fsname, long *warnlevel, long *paniclevel, int *abswarn, int *abspanic, int *ignored, char **group) { char *hostname, *pagename; c_rule_t *rule; hostname = xmh_item(hinfo, XMH_HOSTNAME); pagename = xmh_item(hinfo, XMH_PAGEPATH); *warnlevel = 70; *paniclevel = 90; *abswarn = 0; *abspanic = 0; *ignored = 0; *group = NULL; rule = getrule(hostname, pagename, classname, hinfo, C_INODE); while (rule && (!rule->rule.inode.fsexp || !namematch(fsname, rule->rule.inode.fsexp->pattern, rule->rule.inode.fsexp->exp))) { rule = getrule(NULL, NULL, NULL, hinfo, C_INODE); } if (rule) { *warnlevel = rule->rule.inode.warnlevel; *abswarn = rule->rule.inode.abswarn; *paniclevel = rule->rule.inode.paniclevel; *abspanic = rule->rule.inode.abspanic; *ignored = rule->rule.inode.ignored; *group = rule->groups; return rule->cfid; } return 0; } void get_cics_thresholds(void *hinfo, char *classname, char *appid, int *dsayel, int *dsared, int *edsayel, int *edsared) { char *hostname, *pagename; c_rule_t *rule; hostname = xmh_item(hinfo, XMH_HOSTNAME); pagename = xmh_item(hinfo, XMH_PAGEPATH); *dsayel = 90; *dsared = 95; *edsayel = 90; *edsared = 95; /* Get thresholds for CICS DSA */ rule = getrule(hostname, pagename, classname, hinfo, C_CICS); /* This is sort of cheating, because the while statement that follows should catch it but it doesn't. So if there is a way to solve the problem I welcome some tips... */ if (!rule) { return; } while (rule && (!rule->rule.cics.applid || !namematch(appid, rule->rule.cics.applid->pattern, rule->rule.cics.applid->exp))) { rule = getrule(NULL, NULL, NULL, hinfo, C_CICS); } if (rule) { *dsayel = rule->rule.cics.dsawarnlevel; *dsared = rule->rule.cics.dsapaniclevel; *edsayel = rule->rule.cics.edsawarnlevel; *edsared = rule->rule.cics.edsapaniclevel; } } void get_zvsevsize_thresholds(void *hinfo, char *classname, int *usedyel, int *usedred) { char *hostname, *pagename; c_rule_t *rule; hostname = xmh_item(hinfo, XMH_HOSTNAME); pagename = xmh_item(hinfo, XMH_PAGEPATH); *usedyel = 90; *usedred = 95; /* Get thresholds for z/VSE System Memory */ rule = getrule(hostname, pagename, classname, hinfo, C_MEM_VSIZE); if (rule) { *usedyel = rule->rule.zvse_vsize.warnlevel; *usedred = rule->rule.zvse_vsize.paniclevel; } } void get_zvsegetvis_thresholds(void *hinfo, char *classname, char *pid, int *gv24yel, int *gv24red, int *gvanyyel, int *gvanyred) { char *hostname, *pagename; c_rule_t *rule; hostname = xmh_item(hinfo, XMH_HOSTNAME); pagename = xmh_item(hinfo, XMH_PAGEPATH); *gv24yel = 90; *gv24red = 95; *gvanyyel = 90; *gvanyred = 95; /* Get thresholds for z/VSE Partition Getvis */ rule = getrule(hostname, pagename, classname, hinfo, C_MEM_GETVIS); /* This is sort of cheating, because the while statement that follows should catch it but it doesn't. So if there is a way to solve the problem I welcome some tips... */ if (!rule) { return; } while (rule && (!rule->rule.zvse_getvis.partid || !namematch(pid, rule->rule.zvse_getvis.partid->pattern, rule->rule.zvse_getvis.partid->exp))) { rule = getrule(NULL, NULL, NULL, hinfo, C_MEM_GETVIS); } if (rule) { *gv24yel = rule->rule.zvse_getvis.warnlevel; *gv24red = rule->rule.zvse_getvis.paniclevel; *gvanyyel = rule->rule.zvse_getvis.anywarnlevel; *gvanyred = rule->rule.zvse_getvis.anypaniclevel; } } void get_memory_thresholds(void *hinfo, char *classname, int *physyellow, int *physred, int *swapyellow, int *swapred, int *actyellow, int *actred) { char *hostname, *pagename; c_rule_t *rule; int gotphys = 0, gotswap = 0, gotact = 0; hostname = xmh_item(hinfo, XMH_HOSTNAME); pagename = xmh_item(hinfo, XMH_ALLPAGEPATHS); *physyellow = 100; *physred = 101; *swapyellow = 50; *swapred = 80; *actyellow = 90; *actred = 97; rule = getrule(hostname, pagename, classname, hinfo, C_MEM); while (rule) { switch (rule->rule.mem.memtype) { case C_MEM_PHYS: if (!gotphys) { *physyellow = rule->rule.mem.warnlevel; *physred = rule->rule.mem.paniclevel; gotphys = 1; } break; case C_MEM_ACT: if (!gotact) { *actyellow = rule->rule.mem.warnlevel; *actred = rule->rule.mem.paniclevel; gotact = 1; } break; case C_MEM_SWAP: if (!gotswap) { *swapyellow = rule->rule.mem.warnlevel; *swapred = rule->rule.mem.paniclevel; gotswap = 1; } break; } rule = getrule(NULL, NULL, NULL, hinfo, C_MEM); } } void get_zos_memory_thresholds(void *hinfo, char *classname, int *csayellow, int *csared, int *ecsayellow, int *ecsared, int *sqayellow, int *sqared, int *esqayellow, int *esqared) { char *hostname, *pagename; c_rule_t *rule; int gotcsa = 0, gotecsa = 0, gotsqa = 0, gotesqa = 0; hostname = xmh_item(hinfo, XMH_HOSTNAME); pagename = xmh_item(hinfo, XMH_ALLPAGEPATHS); *csayellow = 90; *csared = 95; *ecsayellow = 90; *ecsared = 95; *sqayellow = 90; *sqared = 95; *esqayellow = 90; *esqared = 95; rule = getrule(hostname, pagename, classname, hinfo, C_MEM); while (rule) { switch (rule->rule.zos_mem.zos_memtype) { case C_MEM_CSA: if (!gotcsa) { *csayellow = rule->rule.zos_mem.warnlevel; *csared = rule->rule.zos_mem.paniclevel; gotcsa = 1; } break; case C_MEM_ECSA: if (!gotecsa) { *ecsayellow = rule->rule.zos_mem.warnlevel; *ecsared = rule->rule.zos_mem.paniclevel; gotecsa = 1; } break; case C_MEM_SQA: if (!gotsqa) { *sqayellow = rule->rule.zos_mem.warnlevel; *sqared = rule->rule.zos_mem.paniclevel; gotsqa = 1; } break; case C_MEM_ESQA: if (!gotesqa) { *esqayellow = rule->rule.zos_mem.warnlevel; *esqared = rule->rule.zos_mem.paniclevel; gotesqa = 1; } break; } rule = getrule(NULL, NULL, NULL, hinfo, C_MEM); } } /* This routine doubles to get threshold values for z/OS Maxuser and z/VSE Nparts. */ void get_asid_thresholds(void *hinfo, char *classname, int *maxyellow, int *maxred) { int gotmaxuser = 0, gotnparts = 0; char *hostname, *pagename; c_rule_t *rule; hostname = xmh_item(hinfo, XMH_HOSTNAME); pagename = xmh_item(hinfo, XMH_ALLPAGEPATHS); *maxyellow = 101; *maxred = 101; rule = getrule(hostname, pagename, classname, hinfo, C_ASID); while (rule) { switch (rule->rule.asid.asidtype) { case C_ASID_MAXUSER: if (!gotmaxuser) { *maxyellow = rule->rule.asid.warnlevel; *maxred = rule->rule.asid.paniclevel; gotmaxuser = 1; } break; case C_ASID_NPARTS: if (!gotnparts) { *maxyellow = rule->rule.asid.warnlevel; *maxred = rule->rule.asid.paniclevel; gotnparts = 1; } break; } rule = getrule(NULL, NULL, NULL, hinfo, C_ASID); } } int get_paging_thresholds(void *hinfo, char *classname, int *pagingyellow, int *pagingred) { int result = 0; char *hostname, *pagename; c_rule_t *rule; hostname = xmh_item(hinfo, XMH_HOSTNAME); pagename = xmh_item(hinfo, XMH_PAGEPATH); *pagingyellow = 5; *pagingred = 10; rule = getrule(hostname, pagename, classname, hinfo, C_PAGING); if (rule) { *pagingyellow = rule->rule.paging.warnlevel; *pagingred = rule->rule.paging.paniclevel; result = rule->cfid; } return result; } int get_mibval_thresholds(void *hinfo, char *classname, char *mibname, char *keyname, char *valname, long *minval, long *maxval, void **matchexp, int *color, char **group) { static void * mibnametree; static int have_mibnametree = 0; char *hostname, *pagename, *mibkeyval_id; c_rule_t *rule; xtreePos_t namhandle, valdefhandle; void * valdeftree; if (!have_mibnametree) { mibnametree = xtreeNew(strcasecmp); have_mibnametree = 1; } hostname = xmh_item(hinfo, XMH_HOSTNAME); pagename = xmh_item(hinfo, XMH_PAGEPATH); /* Any potential rules at all ? */ rule = getrule(hostname, pagename, classname, hinfo, C_MIBVAL); if (!rule) return -1; *minval = LONG_MIN; *maxval = LONG_MAX; *matchexp = NULL; *color = COL_GREEN; *group = NULL; /* * Configuration rules are indexed by three items: * - the MIB Name * - the MIB Key * - the Value Name * * The MIB- and Value-names are static, so we combine these into * a single key which is referenced directly in the configuration. * This is the pattern listed as the first MIB criteria in the config, * stored in the "mibvalexp" field. * For the MIB Keys we want to use a regex (so the config can refer to * all "eth.*" interfaces), so when searching for a rule we must walk * the list of potential rules for this MIB+Value name, and match the * actual key value against the pattern. * * So all in all rules are keyed with the MIB+Key+Name strings as * a unique key. Hence, to speed things up we gradually build a tree * with this key, which points directly to the rule for this item. * This is the "valdeftree" tree. * * TODO: A further optimization would be to somehow keep * track of how many single MIB variables have a configuration rule, * to avoid scanning for a configuration for variables when all config * items have been used in a message. I cannot tell right away if this * is possible - perhaps by counting the number of configuration cache * hits while processing a message, and for the next message from the * same source then only process data until this count has been done? * * Finally, for optimising memory usage, the MIB+Key+Name strings * are not duplicated for each key; instead we have a separate token- * tree (mibnametree) which holds these. */ /* Setup the key and find/insert it into the mibnametree */ mibkeyval_id = (char *)malloc(strlen(mibname) + (keyname ? strlen(keyname) : 0) + strlen(valname) + 3); sprintf(mibkeyval_id, "%s!%s!%s", mibname, (keyname ? keyname : ""), valname); namhandle = xtreeFind(mibnametree, mibkeyval_id); if (namhandle == xtreeEnd(mibnametree)) { xtreeAdd(mibnametree, mibkeyval_id, mibkeyval_id); } else { xfree(mibkeyval_id); /* Discard our copy - we now use the tree value */ mibkeyval_id = (char *)xtreeData(mibnametree, namhandle); } /* Create the rule tree (if it does not exist); look up the ruleset */ if (!rule->rule.mibval.havetree) { rule->rule.mibval.havetree = 1; valdeftree = rule->rule.mibval.valdeftree = xtreeNew(strcasecmp); valdefhandle = xtreeEnd(rule->rule.mibval.valdeftree); } else { valdeftree = rule->rule.mibval.valdeftree; valdefhandle = xtreeFind(valdeftree, mibkeyval_id); } if (valdefhandle == xtreeEnd(valdeftree)) { /* * Ruleset not in the tree. * Scan the configuration set for a rule matching this * MIB+Value name, and where the keyname matches. * Then insert the result into the tree (even if there is no * rule matching at all - we also cache the negative lookups! */ int found = 0; char *mibval_id = (char *)malloc(strlen(mibname) + strlen(valname) + 2); sprintf(mibval_id, "%s:%s", mibname, valname); while (rule && !found) { found = (rule->rule.mibval.mibvalexp && namematch(mibval_id, rule->rule.mibval.mibvalexp->pattern, rule->rule.mibval.mibvalexp->exp)); if (found && keyname && rule->rule.mibval.keyexp) found = namematch(keyname, rule->rule.mibval.keyexp->pattern, rule->rule.mibval.keyexp->exp); if (!found) rule = getrule(NULL, NULL, NULL, hinfo, C_MIBVAL); } xtreeAdd(valdeftree, mibkeyval_id, rule); xfree(mibval_id); } else { /* Found the rule */ rule = (c_rule_t *)xtreeData(valdeftree, valdefhandle); } if (rule) { *color = rule->rule.mibval.color; *group = rule->groups; if (rule->flags & MIBCHK_MINVALUE) *minval = rule->rule.mibval.minval; if (rule->flags & MIBCHK_MAXVALUE) *maxval = rule->rule.mibval.maxval; if (rule->flags & MIBCHK_MATCH) *matchexp = rule->rule.mibval.matchexp; } return (rule ? rule->cfid : 0); } int check_mibvals(void *hinfo, char *classname, char *mibname, char *keyname, char *mibdata, strbuffer_t *summarybuf, int *anyrules) { char *bol, *eoln, *dnam, *dval, *delimp, delim; long minval, maxval, actval; void *matchexp; int rulecolor, color = COL_GREEN; char msgline[MAX_LINE_LEN]; char *group; /* * Scan a single section of MIB data - without the [key] line - * and check all values against the configured limits. */ *anyrules = 1; bol = mibdata; while (bol && *anyrules) { eoln = strchr(bol, '\n'); if (eoln) *eoln = '\0'; dnam = bol + strspn(bol, " \t"); delimp = dnam + strcspn(dnam, " ="); delim = *delimp; *delimp = '\0'; dval = delimp + 1; dval += strspn(dval, " ="); actval = atol(dval); switch (get_mibval_thresholds(hinfo, classname, mibname, keyname, dnam, &minval, &maxval, &matchexp, &rulecolor, &group)) { case -1: /* This means: No rules at all for this host. So just drop all further processing */ *anyrules = 0; break; case 0: /* No rules for this key/value, but there might be for others */ break; default: if (actval < minval) { if (keyname) sprintf(msgline, "&%s %s:%s %ld (minimum: %ld)\n", colorname(rulecolor), keyname, dnam, actval, minval); else sprintf(msgline, "&%s %s %ld (minimum: %ld)\n", colorname(rulecolor), dnam, actval, minval); addtobuffer(summarybuf, msgline); if (rulecolor > color) color = rulecolor; if (group) addalertgroup(group); } if (actval > maxval) { if (keyname) sprintf(msgline, "&%s %s:%s %ld (maximum: %ld)\n", colorname(rulecolor), keyname, dnam, actval, maxval); else sprintf(msgline, "&%s %s %ld (maximum: %ld)\n", colorname(rulecolor), dnam, actval, maxval); addtobuffer(summarybuf, msgline); if (rulecolor > color) color = rulecolor; if (group) addalertgroup(group); } if (matchexp) { if (!namematch(dval, ((exprlist_t *)matchexp)->pattern, ((exprlist_t *)matchexp)->exp)) { if (rulecolor > color) color = rulecolor; if (group) addalertgroup(group); if (keyname) sprintf(msgline, "&%s %s:%s %s (expected: %s)\n", colorname(rulecolor), keyname, dnam, dval, ((exprlist_t *)matchexp)->pattern); else sprintf(msgline, "&%s %s %s (expected: %s)\n", colorname(rulecolor), dnam, dval, ((exprlist_t *)matchexp)->pattern); } else { if (keyname) sprintf(msgline, "&green %s:%s %s\n", keyname, dnam, dval); else sprintf(msgline, "&green %s %s\n", dnam, dval); } addtobuffer(summarybuf, msgline); } break; } *delimp = delim; if (eoln) { *eoln = '\n'; bol = eoln + 1; } else { bol = NULL; } } return color; } int scan_log(void *hinfo, char *classname, char *logname, char *logdata, char *section, strbuffer_t *summarybuf) { int result = COL_GREEN; char *hostname, *pagename; c_rule_t *rule; int nofile = 0; char *boln, *eoln; char msgline[PATH_MAX]; hostname = xmh_item(hinfo, XMH_HOSTNAME); pagename = xmh_item(hinfo, XMH_ALLPAGEPATHS); nofile = (strncmp(logdata, "Cannot open logfile ", 20) == 0); for (rule = getrule(hostname, pagename, classname, hinfo, C_LOG); (rule); rule = getrule(NULL, NULL, NULL, hinfo, C_LOG)) { int anylines = 0; /* First, check if the filename matches */ if (!rule->rule.log.logfile || !namematch(logname, rule->rule.log.logfile->pattern, rule->rule.log.logfile->exp)) continue; if (nofile) { if (!(rule->chkflags & CHK_OPTIONAL)) { if (COL_YELLOW > result) result = COL_YELLOW; addalertgroup(rule->groups); addtobuffer(summarybuf, "&yellow Logfile not accessible \n"); } continue; } /* Next, check for a match anywhere in the data*/ if (!(rule->rule.log.matchexp && patternmatch(logdata, rule->rule.log.matchexp->pattern, rule->rule.log.matchexp->exp))) continue; /* Some data in there matches what we want. Look at each line. */ boln = logdata; while (boln) { eoln = strchr(boln, '\n'); if (eoln) *eoln = '\0'; if (patternmatch(boln, rule->rule.log.matchone->pattern, rule->rule.log.matchone->exp)) { dbgprintf("Line '%s' matches\n", boln); /* It matches. But maybe we'll ignore it ? */ if (rule->rule.log.ignoreexp && patternmatch(boln, rule->rule.log.ignoreexp->pattern, rule->rule.log.ignoreexp->exp)) { /* Ignore it */ } else { /* We wants it ... */ dbgprintf("FOUND match in line '%s'\n", boln); anylines++; sprintf(msgline, "&%s ", colorname(rule->rule.log.color)); addtobuffer(summarybuf, msgline); addtobuffer(summarybuf, prehtmlquoted(boln)); addtobuffer(summarybuf, "\n"); } } if (eoln) { *eoln = '\n'; boln = eoln+1; } else boln = NULL; } /* We have a match */ if (anylines) { dbgprintf("Log rule at line %d matched\n", rule->cfid); if (rule->rule.log.color != COL_GREEN) addalertgroup(rule->groups); if (rule->rule.log.color > result) result = rule->rule.log.color; } } return result; } int check_file(void *hinfo, char *classname, char *filename, char *filedata, char *section, strbuffer_t *summarybuf, off_t *filesize, char **id, int *trackit, int *anyrules) { int result = COL_GREEN; char *hostname, *pagename; c_rule_t *rwalk; char *boln, *eoln; char msgline[PATH_MAX]; int exists = 1, ftype = 0, islink = 0; off_t fsize = 0; unsigned int fmode = 0, linkcount = 0; int ownerid = -1, groupid = -1; char *ownerstr = NULL, *groupstr = NULL; unsigned int ctime = 0, mtime = 0, atime = 0, clock = 0; unsigned int ctimedif, mtimedif, atimedif; char *md5hash = NULL, *sha1hash = NULL, *sha256hash = NULL, *sha512hash = NULL, *sha224hash = NULL, *sha384hash = NULL, *rmd160hash = NULL; hostname = xmh_item(hinfo, XMH_HOSTNAME); pagename = xmh_item(hinfo, XMH_ALLPAGEPATHS); *trackit = *anyrules = 0; boln = filedata; while (boln && *boln) { eoln = strchr(boln, '\n'); if (eoln) *eoln = '\0'; if (strncmp(boln, "ERROR:", 6) == 0) { exists = 0; } else if (strncmp(boln, "type:", 5) == 0) { char *tstr; tstr = strchr(boln, '('); if (tstr) { if (strncmp(tstr, "(file", 5) == 0) ftype = S_IFREG; else if (strncmp(tstr, "(directory", 10) == 0) ftype = S_IFDIR; else if (strncmp(tstr, "(char-device", 12) == 0) ftype = S_IFCHR; else if (strncmp(tstr, "(block-device", 13) == 0) ftype = S_IFBLK; else if (strncmp(tstr, "(FIFO", 5) == 0) ftype = S_IFIFO; else if (strncmp(tstr, "(socket", 7) == 0) ftype = S_IFSOCK; else if (strstr(tstr, ", symlink -> ") == 0) islink = 1; } } else if (strncmp(boln, "mode:", 5) == 0) { fmode = strtol(boln+5, NULL, 8); } else if (strncmp(boln, "linkcount:", 10) == 0) { linkcount = atoi(boln+6); } else if (strncmp(boln, "owner:", 6) == 0) { ownerid = atoi(boln+6); ownerstr = strchr(boln, '('); if (ownerstr) { char *estr; ownerstr++; estr = strchr(ownerstr, ')'); if (estr) *estr = '\0'; } } else if (strncmp(boln, "group:", 6) == 0) { groupid = atoi(boln+6); groupstr = strchr(boln, '('); if (groupstr) { char *estr; groupstr++; estr = strchr(groupstr, ')'); if (estr) *estr = '\0'; } } else if (strncmp(boln, "size:", 5) == 0) { fsize = filesize_value(boln+5); } else if (strncmp(boln, "clock:", 6) == 0) { clock = atoi(boln+6); } else if (strncmp(boln, "atime:", 6) == 0) { atime = atoi(boln+6); } else if (strncmp(boln, "ctime:", 6) == 0) { ctime = atoi(boln+6); } else if (strncmp(boln, "mtime:", 6) == 0) { mtime = atoi(boln+6); } else if (strncmp(boln, "md5:", 4) == 0) { md5hash = boln+4; } else if (strncmp(boln, "sha1:", 5) == 0) { sha1hash = boln+5; } else if (strncmp(boln, "sha256:", 7) == 0) { sha256hash = boln+7; } else if (strncmp(boln, "sha512:", 7) == 0) { sha512hash = boln+7; } else if (strncmp(boln, "sha224:", 7) == 0) { sha224hash = boln+7; } else if (strncmp(boln, "sha384:", 7) == 0) { sha384hash = boln+7; } else if (strncmp(boln, "rmd160:", 7) == 0) { rmd160hash = boln+7; } if (eoln) { boln = eoln+1; } else boln = NULL; } *filesize = fsize; if (clock == 0) clock = getcurrenttime(NULL); ctimedif = clock - ctime; atimedif = clock - atime; mtimedif = clock - mtime; for (rwalk = getrule(hostname, pagename, classname, hinfo, C_FILE); (rwalk); rwalk = getrule(NULL, NULL, NULL, hinfo, C_FILE)) { int rulecolor = COL_GREEN; /* First, check if the filename matches */ if (!rwalk->rule.fcheck.filename || !namematch(filename, rwalk->rule.fcheck.filename->pattern, rwalk->rule.fcheck.filename->exp)) continue; *anyrules = 1; if (!exists) { if (rwalk->chkflags & CHK_OPTIONAL) goto nextcheck; if (!(rwalk->flags & FCHK_NOEXIST)) { /* Required file does not exist */ rulecolor = rwalk->rule.fcheck.color; addtobuffer(summarybuf, "File is missing\n"); } goto nextcheck; } if (rwalk->flags & FCHK_NOEXIST) { /* File exists, but it shouldn't */ rulecolor = rwalk->rule.fcheck.color; addtobuffer(summarybuf, "File exists\n"); goto nextcheck; } if (rwalk->flags & FCHK_TYPE) { if ( ((rwalk->rule.fcheck.ftype == S_IFLNK) && !islink) || (rwalk->rule.fcheck.ftype != ftype) ) { rulecolor = rwalk->rule.fcheck.color; sprintf(msgline, "File is a %s - should be %s\n", ftypestr(ftype), ftypestr(rwalk->rule.fcheck.ftype)); addtobuffer(summarybuf, msgline); } } if (rwalk->flags & FCHK_MODE) { if (rwalk->rule.fcheck.fmode != fmode) { rulecolor = rwalk->rule.fcheck.color; sprintf(msgline, "File is mode %03o - should be %03o\n", fmode, rwalk->rule.fcheck.fmode); addtobuffer(summarybuf, msgline); } } if (rwalk->flags & FCHK_MINSIZE) { if (fsize < rwalk->rule.fcheck.minsize) { rulecolor = rwalk->rule.fcheck.color; #ifdef _LARGEFILE_SOURCE sprintf(msgline, "File has size %lld - should be >%lld\n", (long long int)fsize, (long long int)rwalk->rule.fcheck.minsize); #else sprintf(msgline, "File has size %ld - should be >%ld\n", (long int)fsize, (long int)rwalk->rule.fcheck.minsize); #endif addtobuffer(summarybuf, msgline); } } if (rwalk->flags & FCHK_MAXSIZE) { if (fsize > rwalk->rule.fcheck.maxsize) { rulecolor = rwalk->rule.fcheck.color; #ifdef _LARGEFILE_SOURCE sprintf(msgline, "File has size %lld - should be <%lld\n", (long long int)fsize, (long long int)rwalk->rule.fcheck.maxsize); #else sprintf(msgline, "File has size %ld - should be <%ld\n", (long int)fsize, (long int)rwalk->rule.fcheck.maxsize); #endif addtobuffer(summarybuf, msgline); } } if (rwalk->flags & FCHK_EQLSIZE) { if (fsize != rwalk->rule.fcheck.eqlsize) { rulecolor = rwalk->rule.fcheck.color; #ifdef _LARGEFILE_SOURCE sprintf(msgline, "File has size %lld - should be %lld\n", (long long int)fsize, (long long int)rwalk->rule.fcheck.eqlsize); #else sprintf(msgline, "File has size %ld - should be %ld\n", (long int)fsize, (long int)rwalk->rule.fcheck.eqlsize); #endif addtobuffer(summarybuf, msgline); } } if (rwalk->flags & FCHK_MINLINKS) { if (linkcount < rwalk->rule.fcheck.minlinks) { rulecolor = rwalk->rule.fcheck.color; sprintf(msgline, "File has linkcount %u - should be >%u\n", linkcount, rwalk->rule.fcheck.minlinks); addtobuffer(summarybuf, msgline); } } if (rwalk->flags & FCHK_MAXLINKS) { if (linkcount > rwalk->rule.fcheck.maxlinks) { rulecolor = rwalk->rule.fcheck.color; sprintf(msgline, "File has linkcount %u - should be <%u\n", linkcount, rwalk->rule.fcheck.maxlinks); addtobuffer(summarybuf, msgline); } } if (rwalk->flags & FCHK_OWNERID) { if (ownerid != rwalk->rule.fcheck.ownerid) { rulecolor = rwalk->rule.fcheck.color; sprintf(msgline, "File is owned by user %u - should be %u\n", ownerid, rwalk->rule.fcheck.ownerid); addtobuffer(summarybuf, msgline); } } if (rwalk->flags & FCHK_OWNERSTR) { if (!ownerstr) ownerstr = "(No owner data)"; if (strcmp(ownerstr, rwalk->rule.fcheck.ownerstr) != 0) { rulecolor = rwalk->rule.fcheck.color; sprintf(msgline, "File is owned by user %s - should be %s\n", ownerstr, rwalk->rule.fcheck.ownerstr); addtobuffer(summarybuf, msgline); } } if (rwalk->flags & FCHK_GROUPID) { if (groupid != rwalk->rule.fcheck.groupid) { rulecolor = rwalk->rule.fcheck.color; sprintf(msgline, "File is owned by group %u - should be %u\n", groupid, rwalk->rule.fcheck.groupid); addtobuffer(summarybuf, msgline); } } if (rwalk->flags & FCHK_GROUPSTR) { if (!groupstr) groupstr = "(No group data)"; if (strcmp(groupstr, rwalk->rule.fcheck.groupstr) != 0) { rulecolor = rwalk->rule.fcheck.color; sprintf(msgline, "File is owned by group %s - should be %s\n", groupstr, rwalk->rule.fcheck.groupstr); addtobuffer(summarybuf, msgline); } } if (rwalk->flags & FCHK_CTIMEMIN) { if (ctimedif < rwalk->rule.fcheck.minctimedif) { rulecolor = rwalk->rule.fcheck.color; sprintf(msgline, "File status changed %u seconds ago - should be >%u\n", ctimedif, rwalk->rule.fcheck.minctimedif); addtobuffer(summarybuf, msgline); } } if (rwalk->flags & FCHK_CTIMEMAX) { if (ctimedif > rwalk->rule.fcheck.maxctimedif) { rulecolor = rwalk->rule.fcheck.color; sprintf(msgline, "File status changed %u seconds ago - should be <%u\n", ctimedif, rwalk->rule.fcheck.maxctimedif); addtobuffer(summarybuf, msgline); } } if (rwalk->flags & FCHK_MTIMEMIN) { if (mtimedif < rwalk->rule.fcheck.minmtimedif) { rulecolor = rwalk->rule.fcheck.color; sprintf(msgline, "File was modified %u seconds ago - should be >%u\n", mtimedif, rwalk->rule.fcheck.minmtimedif); addtobuffer(summarybuf, msgline); } } if (rwalk->flags & FCHK_MTIMEMAX) { if (mtimedif > rwalk->rule.fcheck.maxmtimedif) { rulecolor = rwalk->rule.fcheck.color; sprintf(msgline, "File was modified %u seconds ago - should be <%u\n", mtimedif, rwalk->rule.fcheck.maxmtimedif); addtobuffer(summarybuf, msgline); } } if (rwalk->flags & FCHK_ATIMEMIN) { if (atimedif < rwalk->rule.fcheck.minatimedif) { rulecolor = rwalk->rule.fcheck.color; sprintf(msgline, "File was accessed %u seconds ago - should be >%u\n", atimedif, rwalk->rule.fcheck.minatimedif); addtobuffer(summarybuf, msgline); } } if (rwalk->flags & FCHK_ATIMEMAX) { if (atimedif > rwalk->rule.fcheck.maxatimedif) { rulecolor = rwalk->rule.fcheck.color; sprintf(msgline, "File was accessed %u seconds ago - should be <%u\n", atimedif, rwalk->rule.fcheck.maxatimedif); addtobuffer(summarybuf, msgline); } } if (rwalk->flags & FCHK_MD5) { if (!md5hash) md5hash = "(No MD5 data)"; if (strcmp(md5hash, rwalk->rule.fcheck.md5hash) != 0) { rulecolor = rwalk->rule.fcheck.color; sprintf(msgline, "File has MD5 hash %s - should be %s\n", md5hash, rwalk->rule.fcheck.md5hash); addtobuffer(summarybuf, msgline); } } if (rwalk->flags & FCHK_SHA1) { if (!sha1hash) sha1hash = "(No SHA1 data)"; if (strcmp(sha1hash, rwalk->rule.fcheck.sha1hash) != 0) { rulecolor = rwalk->rule.fcheck.color; sprintf(msgline, "File has SHA1 hash %s - should be %s\n", sha1hash, rwalk->rule.fcheck.sha1hash); addtobuffer(summarybuf, msgline); } } if (rwalk->flags & FCHK_SHA256) { if (!sha256hash) sha256hash = "(No SHA256 data)"; if (strcmp(sha256hash, rwalk->rule.fcheck.sha256hash) != 0) { rulecolor = rwalk->rule.fcheck.color; sprintf(msgline, "File has SHA256 hash %s - should be %s\n", sha256hash, rwalk->rule.fcheck.sha256hash); addtobuffer(summarybuf, msgline); } } if (rwalk->flags & FCHK_SHA512) { if (!sha512hash) sha512hash = "(No SHA256 data)"; if (strcmp(sha512hash, rwalk->rule.fcheck.sha512hash) != 0) { rulecolor = rwalk->rule.fcheck.color; sprintf(msgline, "File has SHA512 hash %s - should be %s\n", sha512hash, rwalk->rule.fcheck.sha512hash); addtobuffer(summarybuf, msgline); } } if (rwalk->flags & FCHK_SHA224) { if (!sha224hash) sha224hash = "(No SHA224 data)"; if (strcmp(sha224hash, rwalk->rule.fcheck.sha224hash) != 0) { rulecolor = rwalk->rule.fcheck.color; sprintf(msgline, "File has SHA224 hash %s - should be %s\n", sha224hash, rwalk->rule.fcheck.sha224hash); addtobuffer(summarybuf, msgline); } } if (rwalk->flags & FCHK_SHA384) { if (!sha384hash) sha384hash = "(No SHA384 data)"; if (strcmp(sha384hash, rwalk->rule.fcheck.sha384hash) != 0) { rulecolor = rwalk->rule.fcheck.color; sprintf(msgline, "File has SHA384 hash %s - should be %s\n", sha384hash, rwalk->rule.fcheck.sha384hash); addtobuffer(summarybuf, msgline); } } if (rwalk->flags & FCHK_RMD160) { if (!rmd160hash) rmd160hash = "(No RMD160 data)"; if (strcmp(rmd160hash, rwalk->rule.fcheck.rmd160hash) != 0) { rulecolor = rwalk->rule.fcheck.color; sprintf(msgline, "File has RMD160 hash %s - should be %s\n", rmd160hash, rwalk->rule.fcheck.rmd160hash); addtobuffer(summarybuf, msgline); } } if (rwalk->chkflags & CHK_TRACKIT) { *trackit = (trackit || (ftype == S_IFREG)); *id = rwalk->rrdidstr; } nextcheck: if (rulecolor != COL_GREEN) addalertgroup(rwalk->groups); if (rulecolor > result) result = rulecolor; } return result; } int check_dir(void *hinfo, char *classname, char *filename, char *filedata, char *section, strbuffer_t *summarybuf, unsigned long *dirsize, char **id, int *trackit) { int result = COL_GREEN; int gotsize = 0; char *hostname, *pagename; c_rule_t *rwalk; char *boln, *eoln; char msgline[PATH_MAX]; unsigned long dsize = 0; hostname = xmh_item(hinfo, XMH_HOSTNAME); pagename = xmh_item(hinfo, XMH_ALLPAGEPATHS); *trackit = 0; boln = filedata; while (boln && *boln) { unsigned long sz; char *p; eoln = strchr(boln, '\n'); if (eoln) *eoln = '\0'; /* * We need to check the directory name on each line, to * find the line that gives us the exact directory we want. * NB: Assumes the output is in the form * 12345 /foo/bar/baz */ sz = atol(boln); p = boln + strcspn(boln, " \t"); if (isspace((int)*p)) p += strspn(p, " \t"); if (strcmp(p, filename) == 0) { gotsize = 1; dsize = sz; } if (eoln) { *eoln = '\0'; boln = eoln+1; } else boln = NULL; } *dirsize = dsize; /* Got the data? */ if (!gotsize) { sprintf(msgline, "Could not determine size of directory %s\n", filename); addtobuffer(summarybuf, msgline); return COL_YELLOW; } for (rwalk = getrule(hostname, pagename, classname, hinfo, C_DIR); (rwalk); rwalk = getrule(NULL, NULL, NULL, hinfo, C_DIR)) { int rulecolor = COL_GREEN; /* First, check if the filename matches */ if (!rwalk->rule.fcheck.filename || !namematch(filename, rwalk->rule.fcheck.filename->pattern, rwalk->rule.fcheck.filename->exp)) continue; if (rwalk->flags & FCHK_MAXSIZE) { if (dsize > rwalk->rule.dcheck.maxsize) { rulecolor = rwalk->rule.dcheck.color; sprintf(msgline, "Directory has size %lu - should be <%lu\n", dsize, rwalk->rule.dcheck.maxsize); addtobuffer(summarybuf, msgline); } } else if (rwalk->flags & FCHK_MINSIZE) { if (dsize < rwalk->rule.dcheck.minsize) { rulecolor = rwalk->rule.dcheck.color; sprintf(msgline, "Directory has size %lu - should be >%lu\n", dsize, rwalk->rule.dcheck.minsize); addtobuffer(summarybuf, msgline); } } if (rwalk->chkflags & CHK_TRACKIT) { *trackit = 1; *id = rwalk->rrdidstr; } if (rulecolor != COL_GREEN) addalertgroup(rwalk->groups); if (rulecolor > result) result = rulecolor; } return result; } strbuffer_t *check_rrdds_thresholds(char *hostname, char *classname, char *pagepaths, char *rrdkey, void * valnames, char *vals) { static strbuffer_t *resbuf = NULL; char msgline[1024]; c_rule_t *rule; char *valscopy = NULL; char **vallist = NULL; xtreePos_t handle; rrdtplnames_t *tpl; double val; void *hinfo; if (!resbuf) resbuf = newstrbuffer(0); clearstrbuffer(resbuf); hinfo = hostinfo(hostname); rule = getrule(hostname, pagepaths, classname, hinfo, C_RRDDS); while (rule) { int rulematch = 0; if (!rule->rule.rrdds.rrdkey || !namematch(rrdkey, rule->rule.rrdds.rrdkey->pattern, rule->rule.rrdds.rrdkey->exp)) goto nextrule; handle = xtreeFind(valnames, rule->rule.rrdds.rrdds); if (handle == xtreeEnd(valnames)) goto nextrule; tpl = (rrdtplnames_t *)xtreeData(valnames, handle); /* Split the value-string into individual numbers that we can index */ if (!vallist) { char *p; int idx = 0; valscopy = strdup(vals); vallist = calloc(128, sizeof(char *)); vallist[0] = valscopy; for (p = strchr(valscopy, ':'); (p); p = strchr(p+1, ':')) { vallist[++idx] = p+1; *p = '\0'; } } if (vallist[tpl->idx] == NULL) goto nextrule; val = atof(vallist[tpl->idx]); /* Do the checks */ if (rule->flags & RRDDSCHK_INTVL) { rulematch = ( ( ((rule->flags & RRDDSCHK_GT) && (val > rule->rule.rrdds.limitval)) || ((rule->flags & RRDDSCHK_GE) && (val >= rule->rule.rrdds.limitval)) ) && ( ((rule->flags & RRDDSCHK_LT) && (val < rule->rule.rrdds.limitval2)) || ((rule->flags & RRDDSCHK_LE) && (val <= rule->rule.rrdds.limitval2)) ) ); if (!rule->statustext) { char fmt[100]; strcpy(fmt, "&N=&V ("); if (rule->flags & RRDDSCHK_GT) strcat(fmt, " > &L"); else if (rule->flags & RRDDSCHK_GE) strcat(fmt, " >= &L"); strcat(fmt, " and"); if (rule->flags & RRDDSCHK_LT) strcat(fmt, " < &U)"); else if (rule->flags & RRDDSCHK_LE) strcat(fmt, " <= &U)"); rule->statustext = strdup(fmt); } } else { rulematch = ( ((rule->flags & RRDDSCHK_GT) && (val > rule->rule.rrdds.limitval)) || ((rule->flags & RRDDSCHK_GE) && (val >= rule->rule.rrdds.limitval)) || ((rule->flags & RRDDSCHK_LT) && (val < rule->rule.rrdds.limitval)) || ((rule->flags & RRDDSCHK_LE) && (val <= rule->rule.rrdds.limitval)) ); if (!rule->statustext) { char *fmt = ""; if (rule->flags & RRDDSCHK_GT) fmt = "&N=&V (> &L)"; else if (rule->flags & RRDDSCHK_GE) fmt = "&N=&V (>= &L)"; else if (rule->flags & RRDDSCHK_LT) fmt = "&N=&V (< &L)"; else if (rule->flags & RRDDSCHK_LE) fmt = "&N=&V (<= &L)"; rule->statustext = strdup(fmt); } } if (rulematch) { char *bot, *marker; sprintf(msgline, "modify %s.%s %s rrdds ", hostname, rule->rule.rrdds.column, colorname(rule->rule.rrdds.color)); addtobuffer(resbuf, msgline); /* Format and add the status text */ bot = rule->statustext; do { marker = strchr(bot, '&'); if (marker) { *marker = '\0'; addtobuffer(resbuf, bot); *marker = '&'; switch (*(marker+1)) { case 'N': addtobuffer(resbuf, rule->rule.rrdds.rrdds); bot = marker+2; break; case 'V': addtobuffer(resbuf, vallist[tpl->idx]); bot = marker+2; break; case 'L': sprintf(msgline, "%.2f", rule->rule.rrdds.limitval); addtobuffer(resbuf, msgline); bot = marker+2; break; case 'U': sprintf(msgline, "%.2f", (rule->flags & RRDDSCHK_INTVL) ? rule->rule.rrdds.limitval2 : rule->rule.rrdds.limitval); addtobuffer(resbuf, msgline); bot = marker+2; break; default: addtobuffer(resbuf, "&"); bot = marker+1; break; } } else { addtobuffer(resbuf, bot); bot = NULL; } } while (bot); addtobuffer(resbuf, "\n\n"); } nextrule: rule = getrule(NULL, NULL, NULL, hinfo, C_RRDDS); } if (valscopy) xfree(valscopy); if (vallist) xfree(vallist); return (STRBUFLEN(resbuf) > 0) ? resbuf : NULL; } void get_mqqueue_thresholds(void *hinfo, char *classname, char *qmgrname, char *qname, int *warnlen, int *critlen, int *warnage, int *critage, char **trackit) { char *hostname, *pagepaths; c_rule_t *rule; hostname = xmh_item(hinfo, XMH_HOSTNAME); pagepaths = xmh_item(hinfo, XMH_ALLPAGEPATHS); *warnlen = *critlen = *warnage = *critage = -1; *trackit = NULL; rule = getrule(hostname, pagepaths, classname, hinfo, C_MQ_QUEUE); while (rule) { if (rule->rule.mqqueue.qname && rule->rule.mqqueue.qmgrname && namematch(qname, rule->rule.mqqueue.qname->pattern, rule->rule.mqqueue.qname->exp) && namematch(qmgrname, rule->rule.mqqueue.qmgrname->pattern, rule->rule.mqqueue.qmgrname->exp)) { *warnlen = rule->rule.mqqueue.warnlen; *critlen = rule->rule.mqqueue.critlen; *warnage = rule->rule.mqqueue.warnage; *critage = rule->rule.mqqueue.critage; if (rule->chkflags & CHK_TRACKIT) *trackit = (rule->rrdidstr ? rule->rrdidstr : ""); return; } rule = getrule(NULL, NULL, NULL, hinfo, C_MQ_QUEUE); } } int get_mqchannel_params(void *hinfo, char *classname, char *qmgrname, char *chnname, char *chnstatus, int *color) { char *hostname, *pagepaths; c_rule_t *rule; hostname = xmh_item(hinfo, XMH_HOSTNAME); pagepaths = xmh_item(hinfo, XMH_ALLPAGEPATHS); rule = getrule(hostname, pagepaths, classname, hinfo, C_MQ_CHANNEL); while (rule) { if (rule->rule.mqchannel.chnname && rule->rule.mqchannel.qmgrname && namematch(chnname, rule->rule.mqchannel.chnname->pattern, rule->rule.mqchannel.chnname->exp) && namematch(qmgrname, rule->rule.mqchannel.qmgrname->pattern, rule->rule.mqchannel.qmgrname->exp)) { if (rule->rule.mqchannel.alertstates && namematch(chnstatus, rule->rule.mqchannel.alertstates->pattern, rule->rule.mqchannel.alertstates->exp)) { *color = COL_RED; } else if (rule->rule.mqchannel.warnstates && namematch(chnstatus, rule->rule.mqchannel.warnstates->pattern, rule->rule.mqchannel.warnstates->exp)) { *color = COL_YELLOW; } else { *color = COL_GREEN; } return 1; } rule = getrule(NULL, NULL, NULL, hinfo, C_MQ_CHANNEL); } return 0; } typedef struct mon_proc_t { c_rule_t *rule; struct mon_proc_t *next; } mon_proc_t; static int clear_counts(void *hinfo, char *classname, ruletype_t ruletype, mon_proc_t **head, mon_proc_t **tail, mon_proc_t **walk) { char *hostname, *pagename; c_rule_t *rule; int count = 0; while (*head) { mon_proc_t *tmp = *head; *head = (*head)->next; xfree(tmp); } *head = *tail = *walk = NULL; hostname = xmh_item(hinfo, XMH_HOSTNAME); pagename = xmh_item(hinfo, XMH_ALLPAGEPATHS); rule = getrule(hostname, pagename, classname, hinfo, ruletype); while (rule) { mon_proc_t *newitem = (mon_proc_t *)calloc(1, sizeof(mon_proc_t)); newitem->rule = rule; newitem->next = NULL; if (*tail) { (*tail)->next = newitem; *tail = newitem; } else { *head = *tail = newitem; } count++; switch (rule->ruletype) { case C_DISK : rule->rule.disk.dcount = 0; break; case C_INODE: rule->rule.inode.icount = 0; break; case C_PROC : rule->rule.proc.pcount = 0; break; case C_PORT : rule->rule.port.pcount = 0; break; case C_SVC : rule->rule.svc.scount = 0; break; default: break; } rule = getrule(NULL, NULL, NULL, hinfo, ruletype); } *walk = *head; return count; } static void add_count(char *pname, mon_proc_t *head) { mon_proc_t *pwalk; if (!pname) return; for (pwalk = head; (pwalk); pwalk = pwalk->next) { switch (pwalk->rule->ruletype) { case C_PROC: if (!pwalk->rule->rule.proc.procexp->exp) { /* * No pattern, just see if the token in the config file is * present in the string we got from "ps". So you can setup * the config to look for "cron" and it will actually find "/usr/sbin/cron". */ if (strstr(pname, pwalk->rule->rule.proc.procexp->pattern)) pwalk->rule->rule.proc.pcount++; } else { /* * Strip the initial spaces, pipes and so forth seen if an ASCII forest was generated * This allows PCRE regexes using a '^' to remain useful. */ pname += strspn(pname, " |\\_"); if (!pname) break; if (namematch(pname, pwalk->rule->rule.proc.procexp->pattern, pwalk->rule->rule.proc.procexp->exp)) pwalk->rule->rule.proc.pcount++; } break; case C_DISK: if (!pwalk->rule->rule.disk.fsexp->exp) { if (strstr(pname, pwalk->rule->rule.disk.fsexp->pattern)) pwalk->rule->rule.disk.dcount++; } else { if (namematch(pname, pwalk->rule->rule.disk.fsexp->pattern, pwalk->rule->rule.disk.fsexp->exp)) pwalk->rule->rule.disk.dcount++; } break; case C_INODE: if (!pwalk->rule->rule.inode.fsexp->exp) { if (strstr(pname, pwalk->rule->rule.inode.fsexp->pattern)) pwalk->rule->rule.inode.icount++; } else { if (namematch(pname, pwalk->rule->rule.inode.fsexp->pattern, pwalk->rule->rule.inode.fsexp->exp)) pwalk->rule->rule.inode.icount++; } default: break; } } } static int check_expr_match(char *s, exprlist_t *inclexp, exprlist_t *exclexp) { int inclmatch = 0; int exclmatch = 0; if (inclexp) { if (namematch(s, inclexp->pattern, inclexp->exp)) inclmatch = 1; } else inclmatch = 1; /* If rejected by include spec, no need to check excludes */ if (inclmatch == 0) return 0; if (exclexp) { if (namematch(s, exclexp->pattern, exclexp->exp)) exclmatch = 1; } /* If the exclude matched, then the whole thing does not match */ if (exclmatch) return 0; /* Include- and exclude-patterns match OK, we have a match */ return 1; } static void add_count3(char *pname0, char *pname1, char *pname2 , mon_proc_t *head) { mon_proc_t *pwalk; int mymatch; if (!pname0) return; if (!pname1) return; if (!pname2) return; for (pwalk = head; (pwalk); pwalk = pwalk->next) { switch (pwalk->rule->ruletype) { case C_PORT: mymatch = 0; if (check_expr_match(pname0, pwalk->rule->rule.port.localexp, pwalk->rule->rule.port.exlocalexp)) mymatch++; if (check_expr_match(pname1, pwalk->rule->rule.port.remoteexp, pwalk->rule->rule.port.exremoteexp)) mymatch++; if (check_expr_match(pname2, pwalk->rule->rule.port.stateexp, pwalk->rule->rule.port.exstateexp)) mymatch++; if (mymatch == 3) {pwalk->rule->rule.port.pcount++;} break; case C_SVC: mymatch = 0; if (check_expr_match(pname0, pwalk->rule->rule.svc.svcexp, NULL)) { mymatch++; /* Save the actual startup-method and state for later display in the status message */ pwalk->rule->rule.svc.svcname = strdup(pname0); pwalk->rule->rule.svc.startup = strdup(pname1); pwalk->rule->rule.svc.state = strdup(pname2); /* Startupexp and stateexp are optional - if no criteria defined, then they do match */ if (!pwalk->rule->rule.svc.startupexp || check_expr_match(pname1, pwalk->rule->rule.svc.startupexp, NULL)) mymatch++; if (!pwalk->rule->rule.svc.stateexp || check_expr_match(pname2, pwalk->rule->rule.svc.stateexp, NULL)) mymatch++; } if (mymatch == 3) {pwalk->rule->rule.svc.scount++;} break; default: break; } } } static char *check_count(int *count, ruletype_t ruletype, int *lowlim, int *uplim, int *color, mon_proc_t **walk, char **id, int *trackit, char **group) { char *result = NULL; *color = COL_GREEN; *count = 0; if (*walk == NULL) return NULL; switch (ruletype) { case C_PROC: result = (*walk)->rule->statustext; if (!result) result = (*walk)->rule->rule.proc.procexp->pattern; *count = (*walk)->rule->rule.proc.pcount; *lowlim = (*walk)->rule->rule.proc.pmin; *uplim = (*walk)->rule->rule.proc.pmax; if ((*lowlim != 0) && (*count < *lowlim)) *color = (*walk)->rule->rule.proc.color; if ((*uplim != -1) && (*count > *uplim)) *color = (*walk)->rule->rule.proc.color; *trackit = ((*walk)->rule->chkflags & CHK_TRACKIT); *id = (*walk)->rule->rrdidstr; if (group) *group = (*walk)->rule->groups; break; case C_DISK: result = (*walk)->rule->rule.disk.fsexp->pattern; *count = (*walk)->rule->rule.disk.dcount; *lowlim = (*walk)->rule->rule.disk.dmin; *uplim = (*walk)->rule->rule.disk.dmax; if ((*lowlim != 0) && (*count < *lowlim)) *color = (*walk)->rule->rule.disk.color; if ((*uplim != -1) && (*count > *uplim)) *color = (*walk)->rule->rule.disk.color; if (group) *group = (*walk)->rule->groups; break; case C_INODE: result = (*walk)->rule->rule.inode.fsexp->pattern; *count = (*walk)->rule->rule.inode.icount; *lowlim = (*walk)->rule->rule.inode.imin; *uplim = (*walk)->rule->rule.inode.imax; *color = COL_GREEN; if ((*lowlim != 0) && (*count < *lowlim)) *color = (*walk)->rule->rule.inode.color; if ((*uplim != -1) && (*count > *uplim)) *color = (*walk)->rule->rule.inode.color; if (group) *group = (*walk)->rule->groups; break; case C_PORT: result = (*walk)->rule->statustext; if (!result) { int sz = 1024; char *p; if ((*walk)->rule->rule.port.localexp) sz += strlen((*walk)->rule->rule.port.localexp->pattern) + 10; if ((*walk)->rule->rule.port.exlocalexp) sz += strlen((*walk)->rule->rule.port.exlocalexp->pattern) + 10; if ((*walk)->rule->rule.port.remoteexp) sz += strlen((*walk)->rule->rule.port.remoteexp->pattern) + 10; if ((*walk)->rule->rule.port.exremoteexp) sz += strlen((*walk)->rule->rule.port.exremoteexp->pattern) + 10; if ((*walk)->rule->rule.port.stateexp) sz += strlen((*walk)->rule->rule.port.stateexp->pattern) + 10; if ((*walk)->rule->rule.port.exstateexp) sz += strlen((*walk)->rule->rule.port.exstateexp->pattern) + 10; (*walk)->rule->statustext = (char *)malloc(sz + 1); p = (*walk)->rule->statustext; if ((*walk)->rule->rule.port.localexp) p += sprintf(p, "local=%s ", (*walk)->rule->rule.port.localexp->pattern); if ((*walk)->rule->rule.port.exlocalexp) p += sprintf(p, "exlocal=%s ", (*walk)->rule->rule.port.exlocalexp->pattern); if ((*walk)->rule->rule.port.remoteexp) p += sprintf(p, "remote=%s ", (*walk)->rule->rule.port.remoteexp->pattern); if ((*walk)->rule->rule.port.exremoteexp) p += sprintf(p, "exremote=%s ", (*walk)->rule->rule.port.exremoteexp->pattern); if ((*walk)->rule->rule.port.stateexp) p += sprintf(p, "state=%s ", (*walk)->rule->rule.port.stateexp->pattern); if ((*walk)->rule->rule.port.exstateexp) p += sprintf(p, "exstate=%s ", (*walk)->rule->rule.port.exstateexp->pattern); *p = '\0'; strcat((*walk)->rule->statustext, ":"); result = (*walk)->rule->statustext; } *count = (*walk)->rule->rule.port.pcount; *lowlim = (*walk)->rule->rule.port.pmin; *uplim = (*walk)->rule->rule.port.pmax; if ((*lowlim != 0) && (*count < *lowlim)) *color = (*walk)->rule->rule.port.color; if ((*uplim != -1) && (*count > *uplim)) *color = (*walk)->rule->rule.port.color; *trackit = ((*walk)->rule->chkflags & CHK_TRACKIT); *id = (*walk)->rule->rrdidstr; if (group) *group = (*walk)->rule->groups; break; case C_SVC: /* Have to clear this each time since it contains current state */ // result = (*walk)->rule->statustext; if (!result) { int sz = 1024; char *p; /* Current state */ if ((*walk)->rule->rule.svc.svcname) sz += strlen((*walk)->rule->rule.svc.svcname) + 10; if ((*walk)->rule->rule.svc.startup) sz += strlen((*walk)->rule->rule.svc.startup) + 10; if ((*walk)->rule->rule.svc.state) sz += strlen((*walk)->rule->rule.svc.state) + 10; if ((*walk)->rule->rule.svc.startupexp) sz += strlen((*walk)->rule->rule.svc.startupexp->pattern) + 10; if ((*walk)->rule->rule.svc.stateexp) sz += strlen((*walk)->rule->rule.svc.stateexp->pattern) + 10; if ((*walk)->rule->statustext != NULL) xfree((*walk)->rule->statustext); (*walk)->rule->statustext = (char *)malloc(sz + 1); p = (*walk)->rule->statustext; if ((*walk)->rule->rule.svc.svcname) { p += sprintf(p, "%s is %s/%s", (*walk)->rule->rule.svc.svcname, ((*walk)->rule->rule.svc.state ? (*walk)->rule->rule.svc.state : "Unknown"), ((*walk)->rule->rule.svc.startup ? (*walk)->rule->rule.svc.startup : "Unknown")); } else { /* Did not find the service matching our wanted criteria */ p += sprintf(p, "%s: No matching service", (*walk)->rule->rule.svc.svcexp->pattern); } p += sprintf(p, " - want %s/%s", ((*walk)->rule->rule.svc.stateexp ? (*walk)->rule->rule.svc.stateexp->pattern : "Any"), ((*walk)->rule->rule.svc.startupexp ? (*walk)->rule->rule.svc.startupexp->pattern : "Any")); *p = '\0'; result = (*walk)->rule->statustext; /* We free the extra buffers */ if ((*walk)->rule->rule.svc.svcname) xfree((*walk)->rule->rule.svc.svcname); if ((*walk)->rule->rule.svc.state) xfree((*walk)->rule->rule.svc.state); if ((*walk)->rule->rule.svc.startup) xfree((*walk)->rule->rule.svc.startup); } *count = (*walk)->rule->rule.svc.scount; if (*count == 0) *color = (*walk)->rule->rule.svc.color; if (group) *group = (*walk)->rule->groups; break; default: break; } *walk = (*walk)->next; return result; } static mon_proc_t *phead = NULL, *ptail = NULL, *pmonwalk = NULL; static mon_proc_t *dhead = NULL, *dtail = NULL, *dmonwalk = NULL; static mon_proc_t *ihead = NULL, *itail = NULL, *imonwalk = NULL; static mon_proc_t *porthead = NULL, *porttail = NULL, *portmonwalk = NULL; static mon_proc_t *svchead = NULL, *svctail = NULL, *svcmonwalk = NULL; int clear_process_counts(void *hinfo, char *classname) { return clear_counts(hinfo, classname, C_PROC, &phead, &ptail, &pmonwalk); } int clear_disk_counts(void *hinfo, char *classname) { return clear_counts(hinfo, classname, C_DISK, &dhead, &dtail, &dmonwalk); } int clear_inode_counts(void *hinfo, char *classname) { return clear_counts(hinfo, classname, C_INODE, &ihead, &itail, &imonwalk); } int clear_port_counts(void *hinfo, char *classname) { return clear_counts(hinfo, classname, C_PORT, &porthead, &porttail, &portmonwalk); } int clear_svc_counts(void *hinfo, char *classname) { return clear_counts(hinfo, classname, C_SVC, &svchead, &svctail, &svcmonwalk); } void add_process_count(char *pname) { add_count(pname, phead); } void add_disk_count(char *dname) { add_count(dname, dhead); } void add_inode_count(char *iname) { add_count(iname, ihead); } void add_port_count(char *localstr, char *foreignstr, char *stname) { add_count3(localstr, foreignstr, stname, porthead); } void add_svc_count(char *localstr, char *foreignstr, char *stname) { add_count3(localstr, foreignstr, stname, svchead); } char *check_process_count(int *count, int *lowlim, int *uplim, int *color, char **id, int *trackit, char **group) { return check_count(count, C_PROC, lowlim, uplim, color, &pmonwalk, id, trackit, group); } char *check_disk_count(int *count, int *lowlim, int *uplim, int *color, char **group) { return check_count(count, C_DISK, lowlim, uplim, color, &dmonwalk, NULL, NULL, group); } char *check_inode_count(int *count, int *lowlim, int *uplim, int *color, char **group) { return check_count(count, C_INODE, lowlim, uplim, color, &imonwalk, NULL, NULL, group); } char *check_port_count(int *count, int *lowlim, int *uplim, int *color, char **id, int *trackit, char **group) { return check_count(count, C_PORT, lowlim, uplim, color, &portmonwalk, id, trackit, group); } char *check_svc_count(int *count, int *color, char **group) { return check_count(count, C_SVC, NULL, NULL, color, &svcmonwalk, NULL, NULL, group); } xymon-4.3.28/xymond/analysis.cfg.50000664000076400007640000006326413037531444017216 0ustar rpmbuildrpmbuild.TH ANALYSIS.CFG 5 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME analysis.cfg \- Configuration file for the xymond_client module .SH SYNOPSIS .B ~Xymon/server/etc/analysis.cfg .SH DESCRIPTION The analysis.cfg file controls what color is assigned to the status-messages that are generated from the Xymon client data - typically the cpu, disk, memory, procs- and msgs-columns. Color is decided on the basis of some \fBsettings\fR defined in this file; settings apply to specific hosts through a set of \fBrules\fR. Note: This file is only used on the Xymon server - it is not used by the Xymon client, so there is no need to distribute it to your client systems. .SH FILE FORMAT Blank lines and lines starting with a hash mark (#) are treated as comments and ignored. .SH CPU STATUS COLUMN SETTINGS .sp .BR "LOAD warnlevel paniclevel" .sp If the system load exceeds "warnlevel" or "paniclevel", the "cpu" status will go yellow or red, respectively. These are decimal numbers. .sp Defaults: warnlevel=5.0, paniclevel=10.0 .sp .BR "UP bootlimit toolonglimit [color]" .sp The cpu status goes yellow/red if the system has been up for less than "bootlimit" time, or longer than "toolonglimit". The time is in minutes, or you can add h/d/w for hours/days/weeks - eg. "2h" for two hours, or "4w" for 4 weeks. .sp Defaults: bootlimit=1h, toolonglimit=\-1 (infinite), color=yellow. .sp .sp .BR "CLOCK max.offset [color]" .sp The cpu status goes yellow/red if the system clock on the client differs more than "max.offset" seconds from that of the Xymon server. Note that this is not a particularly accurate test, since it is affected by network delays between the client and the server, and the load on both systems. You should therefore not rely on this being accurate to more than +/\- 5 seconds, but it will let you catch a client clock that goes completely wrong. The default is NOT to check the system clock. .br \fBNOTE:\fR Correct operation of this test obviously requires that the system clock of the Xymon server is correct. You should therefore make sure that the Xymon server is synchronized to the real clock, e.g. by using NTP. .sp Example: Go yellow if the load average exceeds 5, and red if it exceeds 10. Also, go yellow for 10 minutes after a reboot, and after 4 weeks uptime. Finally, check that the system clock is at most 15 seconds offset from the clock of the Xymon system and go red if that is exceeded. .IP .nf LOAD 5 10 UP 10m 4w yellow CLOCK 15 red .fi .LP .SH DISK STATUS COLUMN SETTINGS .sp .BR "DISK filesystem warnlevel paniclevel" .br .BR "DISK filesystem IGNORE" .br .BR "INODE filesystem warnlevel paniclevel" .br .BR "INODE filesystem IGNORE" .sp If the utilization of "filesystem" is reported to exceed "warnlevel" or "paniclevel", the "disk" status will go yellow or red, respectively. "warnlevel" and "paniclevel" are either the percentage used, or the space available as reported by the local "df" command on the host. For the latter type of check, the "warnlevel" must be followed by the letter "U", e.g. "1024U". The special keyword "IGNORE" causes this filesystem to be ignored completely, i.e. it will not appear in the "disk" status column and it will not be tracked in a graph. This is useful for e.g. removable devices, backup-disks and similar hardware. "filesystem" is the mount-point where the filesystem is mounted, e.g. "/usr" or "/home". A filesystem-name that begins with "%" is interpreted as a Perl-compatible regular expression; e.g. "%^/oracle.*/" will match any filesystem whose mountpoint begins with "/oracle". "INODE" works identical to "DISK", but uses the count of i-nodes in the filesystem instead of the amount of disk space. .sp Defaults DISK: warnlevel=90%, paniclevel=95% .BR Defaults INODE: warnlevel=70%, paniclevel=90% .SH MEMORY STATUS COLUMN SETTINGS .sp .BR "MEMPHYS warnlevel paniclevel" .br .BR "MEMACT warnlevel paniclevel" .br .BR "MEMSWAP warnlevel paniclevel" .sp If the memory utilization exceeds the "warnlevel" or "paniclevel", the "memory" status will change to yellow or red, respectively. Note: The words "PHYS", "ACT" and "SWAP" are also recognized. .sp Example: Go yellow if more than 20% swap is used, and red if more than 40% swap is used or the actual memory utilisation exceeds 90%. Don't alert on physical memory usage. .IP .nf MEMSWAP 20 40 MEMACT 90 90 MEMPHYS 101 101 .fi .LP Defaults: .IP .nf MEMPHYS warnlevel=100 paniclevel=101 (i.e. it will never go red). MEMSWAP warnlevel=50 paniclevel=80 MEMACT warnlevel=90 paniclevel=97 .fi .LP .SH PROCS STATUS COLUMN SETTINGS .sp .BR "PROC processname minimumcount maximumcount color [TRACK=id] [TEXT=text]" .sp The "ps" listing sent by the client will be scanned for how many processes containing "processname" are running, and this is then matched against the min/max settings defined here. If the running count is outside the thresholds, the color of the "procs" status changes to "color". .sp To check for a process that must NOT be running: Set minimum and maximum to 0. .sp "processname" can be a simple string, in which case this string must show up in the "ps" listing as a command. The scanner will find a ps-listing of e.g. "/usr/sbin/cron" if you only specify "processname" as "cron". "processname" can also be a Perl-compatiable regular expression, e.g. "%java.*inst[0123]" can be used to find entries in the ps-listing for "java \-Xmx512m inst2" and "java \-Xmx256 inst3". In that case, "processname" must begin with "%" followed by the regular expression. Note that Xymon defaults to case-insensitive pattern matching; if that is not what you want, put "(?\-i)" between the "%" and the regular expression to turn this off. E.g. "%(?\-i)HTTPD" will match the word HTTPD only when it is upper-case. .br If "processname" contains whitespace (blanks or TAB), you must enclose the full string in double quotes - including the "%" if you use regular expression matching. E.g. .sp PROC "%xymond_channel \-\-channel=data.*xymond_rrd" 1 1 yellow .sp or .sp PROC "java \-DCLASSPATH=/opt/java/lib" 2 5 .sp You can have multiple "PROC" entries for the same host, all of the checks are merged into the "procs" status and the most severe check defines the color of the status. .sp The optional \fBTRACK=id\fR setting causes Xymon to track the number of processes found in an RRD file, and put this into a graph which is shown on the "procs" status display. The \fBid\fR setting is a simple text string which will be used as the legend for the graph, and also as part of the RRD filename. It is recommended that you use only letters and digits for the ID. .br Note that the process counts which are tracked are only performed once when the client does a poll cycle - i.e. the counts represent snapshots of the system state, not an average value over the client poll cycle. Therefore there may be peaks or dips in the actual process counts which will not show up in the graphs, because they happen while the Xymon client is not doing any polling. .sp The optional \fBTEXT=text\fR setting is used in the summary of the "procs" status. Normally, the summary will show the "processname" to identify the process and the related count and limits. But this may be a regular expression which is not easily recognizable, so if defined, the \fBtext\fR setting string will be used instead. This only affects the "procs" status display - it has no effect on how the rule counts or recognizes processes in the "ps" output. .sp Example: Check that "cron" is running: .br PROC cron .sp Example: Check that at least 5 "httpd" processes are running, but not more than 20: .br PROC httpd 5 20 .sp Defaults: .br mincount=1, maxcount=\-1 (unlimited), color="red". .br Note that no processes are checked by default. .SH MSGS STATUS COLUMN SETTINGS .sp .BR "LOG logfilename pattern [COLOR=color] [IGNORE=excludepattern] [OPTIONAL]" .sp The Xymon client extracts interesting lines from one or more logfiles - see the .I client-local.cfg(5) man-page for information about how to configure which logs a client should look at. .sp The \fBLOG\fR setting determine how these extracts of log entries are processed, and what warnings or alerts trigger as a result. .sp "logfilename" is the name of the logfile. Only logentries from this filename will be matched against this rule. Note that "logfilename" can be a regular expression (if prefixed with a '%' character). .sp "pattern" is a string or regular expression. If the logfile data matches "pattern", it will trigger the "msgs" column to change color. If no "color" parameter is present, the default is to go "red" when the pattern is matched. To match against a regular expression, "pattern" must begin with a '%' sign - e.g "%WARNING|NOTICE" will match any lines containing either of these two words. Note that Xymon defaults to case-insensitive pattern matching; if that is not what you want, put "(?\-i)" between the "%" and the regular expression to turn this off. E.g. "%(?\-i)WARNING" will match the word WARNING only when it is upper-case. .sp "excludepattern" is a string or regular expression that can be used to filter out any unwanted strings that happen to match "pattern". .sp The \fBOPTIONAL\fR keyword causes the check to be skipped if the logfile does not exist. .sp Example: Trigger a red alert when the string "ERROR" appears in the "/var/adm/syslog" file: .br LOG /var/adm/syslog ERROR .sp Example: Trigger a yellow warning on all occurrences of the word "WARNING" or "NOTICE" in the "daemon.log" file, except those from the "lpr" system: .br LOG /var/log/daemon.log %WARNING|NOTICE COLOR=yellow IGNORE=lpr .sp Defaults: .br color="red", no "excludepattern". .sp Note that no logfiles are checked by default. Any log data reported by a client will just show up on the "msgs" column with status OK (green). .SH FILES STATUS COLUMN SETTINGS .sp .BR "FILE filename [color] [things to check] [OPTIONAL] [TRACK]" .sp .BR "DIR directoryname [color] [sizeMINSIZE] [TRACK]" .sp These entries control the status of the "files" column. They allow you to check on various data for files and directories. \fBfilename\fR and \fBdirectoryname\fR are names of files or directories, with a full path. You can use a regular expression to match the names of files and directories reported by the client, if you prefix the expression with a '%' character. \fBcolor\fR is the color that triggers when one or more of the checks fail. The \fBOPTIONAL\fR keyword causes this check to be skipped if the file does not exist. E.g. you can use this to check if files that should be temporary are not deleted, by checking that they are not older than the max time you would expect them to stick around, and then using OPTIONAL to ignore the state where no files exist. The \fBTRACK\fR keyword causes the size of the file or directory to be tracked in an RRD file, and presented in a graph on the "files" status display. For files, you can check one or more of the following: .IP "noexist" triggers a warning if the file exists. By default, a warning is triggered for files that have a FILE entry, but which do not exist. .IP "type=TYPE" where TYPE is one of "file", "dir", "char", "block", "fifo", or "socket". Triggers warning if the file is not of the specified type. .IP "ownerid=OWNER" triggers a warning if the owner does not match what is listed here. OWNER is specified either with the numeric uid, or the user name. .IP "groupid=GROUP" triggers a warning if the group does not match what is listed here. GROUP is specified either with the numeric gid, or the group name. .IP "mode=MODE" triggers a warning if the file permissions are not as listed. MODE is written in the standard octal notation, e.g. "644" for the rw\-r\-\-r\-\- permissions. .IP "sizeMIN.SIZE" triggers a warning it the file size is greater than MAX.SIZE or less than MIN.SIZE, respectively. For filesizes, you can use the letters "K", "M", "G" or "T" to indicate that the filesize is in Kilobytes, Megabytes, Gigabytes or Terabytes, respectively. If there is no such modifier, Kilobytes is assumed. E.g. to warn if a file grows larger than 1MB, use \fBsize<1024M\fR. .IP "mtime>MIN.MTIME mtime86400\fR. .IP "mtime=TIMESTAMP" checks if a file was last modified at TIMESTAMP. TIMESTAMP is a unix epoch time (seconds since midnight Jan 1 1970 UTC). .IP "ctime>MIN.CTIME, ctimeMIN.SIZE" triggers a warning it the directory size is greater than MAX.SIZE or less than MIN.SIZE, respectively. Directory sizes are reported in whatever unit the \fBdu\fR command on the client uses - often KB or diskblocks - so MAX.SIZE and MIN.SIZE must be given in the same unit. .LP Experience shows that it can be difficult to get these rules right. Especially when defining minimum/maximum values for file sizes, when they were last modified etc. The one thing you must remember when setting up these checks is that the rules describe criteria that must be met - only when they are met will the status be green. So "mtime<600" means "the difference between current time and the mtime of the file must be less than 600 seconds - if not, the file status will go red". .SH PORTS STATUS COLUMN SETTINGS .sp .BR "PORT criteria [MIN=mincount] [MAX=maxcount] [COLOR=color] [TRACK=id] [TEXT=displaytext]" .sp The "netstat" listing sent by the client will be scanned for how many sockets match the \fBcriteria\fR listed. The criteria you can use are: .IP "LOCAL=addr" "addr" is a (partial) local address specification in the format used on the output from netstat. .IP "EXLOCAL=addr" Exclude certain local addresses from the rule. .IP "REMOTE=addr" "addr" is a (partial) remote address specification in the format used on the output from netstat. .IP "EXREMOTE=addr" Exclude certain remote addresses from the rule. .IP "STATE=state" Causes only the sockets in the specified state to be included, "state" is usually LISTEN or ESTABLISHED but can be any socket state reported by the clients "netstat" command. .IP "EXSTATE=state" Exclude certain states from the rule. .LP "addr" is typically "10.0.0.1:80" for the IP 10.0.0.1, port 80. Or "*:80" for any local address, port 80. Note that the Xymon clients normally report only the numeric data for IP-addresses and port-numbers, so you must specify the port number (e.g. "80") instead of the service name ("www"). .br "addr" and "state" can also be a Perl-compatiable regular expression, e.g. "LOCAL=%[.:](80|443)" can be used to find entries in the netstat local port for both http (port 80) and https (port 443). In that case, portname or state must begin with "%" followed by the reg.expression. .sp The socket count found is then matched against the min/max settings defined here. If the count is outside the thresholds, the color of the "ports" status changes to "color". To check for a socket that must NOT exist: Set minimum and maximum to 0. .sp The optional \fBTRACK=id\fR setting causes Xymon to track the number of sockets found in an RRD file, and put this into a graph which is shown on the "ports" status display. The \fBid\fR setting is a simple text string which will be used as the legend for the graph, and also as part of the RRD filename. It is recommended that you use only letters and digits for the ID. .br Note that the sockets counts which are tracked are only performed once when the client does a poll cycle - i.e. the counts represent snapshots of the system state, not an average value over the client poll cycle. Therefore there may be peaks or dips in the actual sockets counts which will not show up in the graphs, because they happen while the Xymon client is not doing any polling. .sp The \fBTEXT=displaytext\fR option affects how the port appears on the "ports" status page. By default, the port is listed with the local/remote/state rules as identification, but this may be somewhat difficult to understand. You can then use e.g. "TEXT=Secure Shell" to make these ports appear with the name "Secure Shell" instead. .sp Defaults: mincount=1, maxcount=\-1 (unlimited), color="red". Note: No ports are checked by default. .sp Example: Check that the SSH daemon is listening on port 22. Track the number of active SSH connections, and warn if there are more than 5. .br PORT LOCAL=%[.:]22$ STATE=LISTEN "TEXT=SSH listener" .br PORT LOCAL=%[.:]22$ STATE=ESTABLISHED MAX=5 TRACK=ssh TEXT=SSH .sp .sp .SH SVCS status (Microsoft Windows clients) .sp .BR "SVC servicename status=(started|stopped) [startup=automatic|disabled|manual]" .sp .SH DS - RRD based status override .sp .BR "DS column filename:dataset rules COLOR=colorname TEXT=explanation" .sp "column" is the statuscolumn that will be modified. "filename" is the name of the RRD file holding the data you use for comparison. "dataset" is the name of the dataset in the RRD file - the "rrdtool info" command is useful when determining these. "rules" determine when to apply the override. You can use ">", ">=", "<" or "<=" to compare the current measurement value against one or more thresholds. "explanation" is a text that will be shown to explain the override - you can use some placeholders in the text: "&N" is replaced with the name of the dataset, "&V" is replaced with the current value, "&L" is replaced by the low threshold, "&U" is replaced with the upper threshold. .sp NOTE: This rule uses the \fbraw\fR data value from a client to examine the rules. So this type of test is only really suitable for datasets that are of the "GAUGE" type. It cannot be used meaningfully for datasets that use "COUNTER" or "DERIVE" - e.g. the datasets that are used to capture network packet traffic - because the data stored in the RRD for COUNTER-based datasets undergo a transformation (calculation) when going into the RRD. Xymon does not have direct access to the calculated data. .sp Example: Flag "conn" status a yellow if responsetime exceeds 100 msec. .br DS conn tcp.conn.rrd:sec >0.1 COLOR=yellow TEXT="Response time &V exceeds &U seconds" .sp .SH MQ Series SETTINGS .sp .BR "MQ_QUEUE queuename [age\-warning=N] [age\-critical=N] [depth\-warning=N] [depth\-critical=N]" .br .BR "MQ_CHANNEL channelname [warning=PATTERN] [alert=PATTERN]" .sp This is a set of checks for checking the health of IBM MQ message-queues. It requires the "mq.sh" or similar collector module to run on a node with access to the MQ "Queue Manager" so it can report the status of queues and channels. .sp The MQ_QUEUE setting checks the health of a single queue: You can warn (yellow) or alert (red) based on the depth of the queue, and/or the age of the oldest entry in the queue. These values are taken directly from the output generated by the "runmqsc" utility. .sp The MQ_CHANNEL setting checks the health of a single MQ channel: You can warn or alert based on the reported status of the channel. The PATTERN is a normal pattern, i.e. either a list of status keywords, or a regular expression pattern. .sp .SH CHANGING THE DEFAULT SETTINGS If you would like to use different defaults for the settings described above, then you can define the new defaults after a DEFAULT line. E.g. this would explicitly define all of the default settings: .IP .nf DEFAULT UP 1h LOAD 5.0 10.0 DISK * 90 95 MEMPHYS 100 101 MEMSWAP 50 80 MEMACT 90 97 .fi .LP .SH RULES TO SELECT HOSTS All of the settings can be applied to a group of hosts, by preceding them with rules. A rule defines of one of more filters using these keywords (note that this is identical to the rule definitions used in the .I alerts.cfg(5) file). .BR "PAGE=targetstring" Rule matching an alert by the name of the page in Xymon. "targetstring" is the path of the page as defined in the hosts.cfg file. E.g. if you have this setup: .IP .nf page servers All Servers subpage web Webservers 10.0.0.1 www1.foo.com subpage db Database servers 10.0.0.2 db1.foo.com .fi .LP Then the "All servers" page is found with \fBPAGE=servers\fR, the "Webservers" page is \fBPAGE=servers/web\fR and the "Database servers" page is \fBPAGE=servers/db\fR. Note that you can also use regular expressions to specify the page name, e.g. \fBPAGE=%.*/db\fR would find the "Database servers" page regardless of where this page was placed in the hierarchy. The top-level page has a the fixed name \fB/\fR, e.g. \fBPAGE=/\fR would match all hosts on the Xymon frontpage. If you need it in a regular expression, use \fBPAGE=%^/\fR to avoid matching the forward-slash present in subpage-names. .BR "EXPAGE=targetstring" Rule excluding a host if the pagename matches. .BR "HOST=targetstring" Rule matching a host by the hostname. "targetstring" is either a comma-separated list of hostnames (from the hosts.cfg file), "*" to indicate "all hosts", or a Perl-compatible regular expression. E.g. "HOST=dns.foo.com,www.foo.com" identifies two specific hosts; "HOST=%www.*.foo.com EXHOST=www\-test.foo.com" matches all hosts with a name beginning with "www", except the "www\-test" host. .BR "EXHOST=targetstring" Rule excluding a host by matching the hostname. .BR "CLASS=classname" Rule match by the client class-name. You specify the class-name for a host when starting the client through the "\-\-class=NAME" option to the runclient.sh script. If no class is specified, the host by default goes into a class named by the operating system. .BR "EXCLASS=classname" Exclude all hosts belonging to "classname" from this rule. .BR "DISPLAYGROUP=groupstring" Rule matching an alert by the text of the display-group (text following the group, group-only, group-except heading) in the hosts.cfg file. "groupstring" is the text for the group, stripped of any HTML tags. E.g. if you have this setup: .IP .nf group Web 10.0.0.1 www1.foo.com 10.0.0.2 www2.foo.com group Production databases 10.0.1.1 db1.foo.com .fi .LP Then the hosts in the Web-group can be matched with \fBDISPLAYGROUP=Web\fR, and the database servers can be matched with \fBDISPLAYGROUP="Production databases"\fR. Note that you can also use regular expressions, e.g. \fBDISPLAYGROUP=%database\fR. If there is no group-setting for the host, use "DISPLAYGROUP=NONE". .BR "EXDISPLAYGROUP=groupstring" Rule excluding a group by matching the display-group string. .BR "TIME=timespecification" Rule matching by the time-of-day. This is specified as the DOWNTIME time specification in the hosts.cfg file. E.g. "TIME=W:0800:2200" applied to a rule will make this rule active only on week-days between 8AM and 10PM. .BR "EXTIME=timespecification" Rule excluding by the time-of-day. This is also specified as the DOWNTIME time specification in the hosts.cfg file. E.g. "TIME=W:0400:0600" applied to a rule will make this rule exclude on week-days between 4AM and 6AM. This applies on top of any TIME= specification, so both must match. .SH DIRECTING ALERTS TO GROUPS For some tests - e.g. "procs" or "msgs" - the right group of people to alert in case of a failure may be different, depending on which of the client rules actually detected a problem. E.g. if you have PROCS rules for a host checking both "httpd" and "sshd" processes, then the Web admins should handle httpd-failures, whereas "sshd" failures are handled by the Unix admins. To handle this, all rules can have a "GROUP=groupname" setting. When a rule with this setting triggers a yellow or red status, the groupname is passed on to the Xymon alerts module, so you can use it in the alert rule definitions in .I alerts.cfg(5) to direct alerts to the correct group of people. .SH RULES: APPLYING SETTINGS TO SELECTED HOSTS Rules must be placed after the settings, e.g. .IP .nf LOAD 8.0 12.0 HOST=db.foo.com TIME=*:0800:1600 .fi .LP If you have multiple settings that you want to apply the same rules to, you can write the rules *only* on one line, followed by the settings. E.g. .IP .nf HOST=%db.*.foo.com TIME=W:0800:1600 LOAD 8.0 12.0 DISK /db 98 100 PROC mysqld 1 .fi .LP will apply the three settings to all of the "db" hosts on week-days between 8AM and 4PM. This can be combined with per-settings rule, in which case the per-settings rule overrides the general rule; e.g. .IP .nf HOST=%.*.foo.com LOAD 7.0 12.0 HOST=bax.foo.com LOAD 3.0 8.0 .fi .LP will result in the load-limits being 7.0/12.0 for the "bax.foo.com" host, and 3.0/8.0 for all other foo.com hosts. The entire file is evaluated from the top to bottom, and the first match found is used. So you should put the specific settings first, and the generic ones last. .SH NOTES For the LOG, FILE and DIR checks, it is necessary also to configure the actual file- and directory-names in the .I client\-local.cfg(5) file. If the filenames are not listed there, the clients will not collect any data about these files/directories, and the settings in the analysis.cfg file will be silently ignored. The ability to compute file checksums with MD5, SHA1 or RMD160 should not be used for general-purpose file integrity checking, since the overhead of calculating these on a large number of files can be significant. If you need this, look at tools designed for this purpose - e.g. Tripwire or AIDE. At the time of writing (april 2006), the SHA-1 and RMD160 algorithms are considered cryptographically safe. The MD5 algorithm has been shown to have some weaknesses, and is not considered strong enough when a high level of security is required. .SH "SEE ALSO" xymond_client(8), client\-local.cfg(5), xymond(8), xymon(7) xymon-4.3.28/xymond/xymond_filestore.80000664000076400007640000000620713037531444020224 0ustar rpmbuildrpmbuild.TH XYMOND_FILESTORE 8 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME xymond_filestore \- xymond worker module for storing Xymon data .SH SYNOPSIS .B "xymond_channel \-\-channel=status xymond_filestore \-\-status [options]" .br .B "xymond_channel \-\-channel=data xymond_filestore \-\-data [options]" .br .B "xymond_channel \-\-channel=notes xymond_filestore \-\-notes [options]" .br .B "xymond_channel \-\-channel=enadis xymond_filestore \-\-enadis [options]" .SH DESCRIPTION xymond_filestore is a worker module for xymond, and as such it is normally run via the .I xymond_channel(8) program. It receives xymond messages from a xymond channel via stdin, and stores these in the filesystem in a manner that is compatible with the Big Brother daemon, bbd. This program can be started multiple times, if you want to store messages for more than one channel. .SH OPTIONS .IP "\-\-status" Incoming messages are "status" messages, they will be stored in the $XYMONRAWSTATUSDIR/ directory. If you are using .I xymon(7) throughout your Xymon server, you will not need to run this module to save status messages, unless you have a third-party add-on that reads the status-logs directly. This module is NOT needed to get trend graphs, you should run the .I xymond_rrd(8) module instead. .IP "\-\-data" Incoming messages are "data" messages, they will be stored in the $XYMONDATADIR directory. This module is not needed, unless you have a third-party module that processes the data-files. This module is NOT needed to get trend graphs, you should run the .I xymond_rrd(8) module instead. .IP "\-\-notes" Incoming messages are "notes" messages, they will be stored in the $XYMONNOTESDIR directory. This modules is only needed if you want to allow people to remotely update the notes-files available on the Xymon webpages. .IP "\-\-enadis" Incoming messages are enable/disable messages, they will update files in the $XYMONDISABLEDDIR directory. This is only needed if you have third-party add-ons that use these files. .IP "\-\-dir=DIRECTORY" Overrides the default output directory. .IP "\-\-html" Used together with "\-\-status". Tells xymond_filestore to also save an HTML version of the status-log. Should not be used unless you must run with "XYMONLOGSTATUS=static". .IP "\-\-htmldir=DIRECTORY" The directory where HTML-versions of the status logs are stored. Default: $XYMONHTMLSTATUSDIR .IP "\-\-htmlext=.EXT" Set the filename extension for generated HTML files. By default, HTML files are saved with a ".html" extension. .IP "\-\-multigraphs=TEST1[,TEST2]" This causes xymond_filestore to generate HTML status pages with links to service graphs that are split up into multiple images, with at most 5 graphs per image. If not specified, only the "disk" status is split up this way. .IP "\-\-only=test[,test,test]" Save status messages only for the listed set of tests. This can be useful if you have an external script that needs to parse some of the status logs, but you do not want to save all status logs. .IP "\-\-debug" Enable debugging output. .SH FILES This module does not rely on any configuration files. .SH "SEE ALSO" xymond_channel(8), xymond_rrd(8), xymond(8), xymon(7) xymon-4.3.28/xymond/do_rrd.c0000664000076400007640000006417412503303630016154 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: do_rrd.c 7608 2015-03-21 15:00:40Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" #include "xymond_rrd.h" #include "do_rrd.h" #include "client_config.h" #ifndef NAME_MAX #define NAME_MAX 255 /* Solaris doesn't define NAME_MAX, but ufs limit is 255 */ #endif extern int seq; /* from xymond_rrd.c */ char *rrddir = NULL; int use_rrd_cache = 1; /* Use the cache by default */ int no_rrd = 0; /* Write to rrd by default */ static int processorfd = 0; static FILE *processorstream = NULL; static char *exthandler = NULL; static char **extids = NULL; static char rrdvalues[MAX_LINE_LEN]; static char *senderip = NULL; static char rrdfn[PATH_MAX]; /* Base filename without directories, from setupfn() */ static char filedir[PATH_MAX]; /* Full path filename */ static char *fnparams[4] = { NULL, }; /* Saved parameters passed to setupfn() */ /* How often do we feed data into the RRD file */ #define DEFAULT_RRD_INTERVAL 300 static int rrdinterval = DEFAULT_RRD_INTERVAL; #define CACHESZ 12 /* # of updates that can be cached - updates are usually 5 minutes apart */ static int updcache_keyofs = -1; static void * updcache; typedef struct updcacheitem_t { char *key; rrdtpldata_t *tpl; int valcount; char *vals[CACHESZ]; int updseq[CACHESZ]; time_t updtime[CACHESZ]; } updcacheitem_t; static void * flushtree; static int have_flushtree = 0; typedef struct flushtree_t { char *hostname; time_t flushtime; } flushtree_t; void setup_exthandler(char *handlerpath, char *ids) { char *p; int idcount = 0; MEMDEFINE(rrdvalues); exthandler = strdup(handlerpath); idcount=1; p = ids; while ((p = strchr(p, ',')) != NULL) { p++; idcount++; } extids = (char **)malloc((idcount+1)*(sizeof(char *))); idcount = 0; p = strtok(ids, ","); while (p) { extids[idcount++] = strdup(p); p = strtok(NULL, ","); } extids[idcount] = NULL; MEMUNDEFINE(rrdvalues); } void setup_extprocessor(char *cmd) { int n; int pfd[2]; pid_t childpid; if (!cmd) return; processorfd = 0; n = pipe(pfd); if (n == -1) { errprintf("Could not get a pipe: %s\n", strerror(errno)); } else { childpid = fork(); if (childpid == -1) { errprintf("Could not fork channel handler: %s\n", strerror(errno)); } else if (childpid == 0) { /* The channel handler child */ char *argv[2]; argv[0] = strdup(cmd); argv[1] = NULL; n = dup2(pfd[0], STDIN_FILENO); close(pfd[0]); close(pfd[1]); n = execvp(cmd, argv); /* We should never go here */ errprintf("exec() failed for child command %s: %s\n", cmd, strerror(errno)); exit(1); } else { /* Parent process continues */ close(pfd[0]); processorfd = pfd[1]; processorstream = fdopen(processorfd, "w"); errprintf("External processor '%s' started\n", cmd); } } } void shutdown_extprocessor(void) { if (!processorfd) return; close(processorfd); processorfd = 0; processorstream = NULL; errprintf("External processor stopped\n"); } static void setupfn(char *format, char *param) { char *p; memset(fnparams, 0, sizeof(fnparams)); fnparams[0] = param; snprintf(rrdfn, sizeof(rrdfn)-1, format, param); rrdfn[sizeof(rrdfn)-1] = '\0'; while ((p = strchr(rrdfn, ' ')) != NULL) *p = '_'; } static void setupfn2(char *format, char *param1, char *param2) { char *p; while ((p = strchr(param2, '/')) != NULL) *p = ','; memset(fnparams, 0, sizeof(fnparams)); fnparams[0] = param1; fnparams[1] = param2; snprintf(rrdfn, sizeof(rrdfn)-1, format, param1, param2); rrdfn[sizeof(rrdfn)-1] = '\0'; while ((p = strchr(rrdfn, ' ')) != NULL) *p = '_'; } static void setupfn3(char *format, char *param1, char *param2, char *param3) { char *p; memset(fnparams, 0, sizeof(fnparams)); fnparams[0] = param1; fnparams[1] = param2; fnparams[2] = param3; snprintf(rrdfn, sizeof(rrdfn)-1, format, param1, param2, param3); rrdfn[sizeof(rrdfn)-1] = '\0'; while ((p = strchr(rrdfn, ' ')) != NULL) *p = '_'; if (strlen(rrdfn) >= (NAME_MAX - 50)) { /* * Filename is too long. Limit filename length * by replacing the last part of the filename * with an MD5 hash. */ char *hash = md5hash(rrdfn+(NAME_MAX-50)); sprintf(rrdfn+(NAME_MAX-50), "_%s.rrd", hash); } } static void setupinterval(int intvl) { rrdinterval = (intvl ? intvl : DEFAULT_RRD_INTERVAL); } static int flush_cached_updates(updcacheitem_t *cacheitem, char *newdata) { /* Flush any updates we've cached */ char *updparams[5+CACHESZ+1] = { "rrdupdate", filedir, "-t", NULL, NULL, NULL, }; int i, pcount, result; dbgprintf("Flushing '%s' with %d updates pending, template '%s'\n", cacheitem->key, (newdata ? 1 : 0) + cacheitem->valcount, cacheitem->tpl->template); /* ISO C90: parameters cannot be used as initializers */ updparams[3] = cacheitem->tpl->template; /* Setup the parameter list with all of the cached and new readings */ for (i=0; (i < cacheitem->valcount); i++) updparams[4+i] = cacheitem->vals[i]; if (newdata) { updparams[4+cacheitem->valcount] = newdata; updparams[4+cacheitem->valcount+1] = NULL; } else { /* No new data - happens when flushing the cache */ updparams[4+cacheitem->valcount] = NULL; } for (pcount = 0; (updparams[pcount]); pcount++); optind = opterr = 0; rrd_clear_error(); result = rrd_update(pcount, updparams); #if defined(LINUX) && defined(RRDTOOL12) /* * RRDtool 1.2+ uses mmap'ed I/O, but the Linux kernel does not update timestamps when * doing file I/O on mmap'ed files. This breaks our check for stale/nostale RRD's. * So do an explicit timestamp update on the file here. */ utimes(filedir, NULL); #endif /* Clear the cached data */ for (i=0; (i < cacheitem->valcount); i++) { cacheitem->updseq[i] = 0; cacheitem->updtime[i] = 0; if (cacheitem->vals[i]) xfree(cacheitem->vals[i]); } cacheitem->valcount = 0; return result; } static int create_and_update_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *creparams[], void *template) { static int callcounter = 0; struct stat st; int pcount, result; char *updcachekey; xtreePos_t handle; updcacheitem_t *cacheitem = NULL; int pollinterval; strbuffer_t *modifymsg; time_t updtime = 0; /* Reset the RRD poll interval */ pollinterval = rrdinterval; rrdinterval = DEFAULT_RRD_INTERVAL; if ((rrdfn == NULL) || (strlen(rrdfn) == 0)) { errprintf("RRD update for no file\n"); return -1; } MEMDEFINE(rrdvalues); MEMDEFINE(filedir); sprintf(filedir, "%s/%s", rrddir, hostname); if (stat(filedir, &st) == -1) { if (mkdir(filedir, S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH) == -1) { errprintf("Cannot create rrd directory %s : %s\n", filedir, strerror(errno)); MEMUNDEFINE(filedir); MEMUNDEFINE(rrdvalues); return -1; } } /* Watch out here - "rrdfn" may be very large. */ snprintf(filedir, sizeof(filedir)-1, "%s/%s/%s", rrddir, hostname, rrdfn); filedir[sizeof(filedir)-1] = '\0'; /* Make sure it is null terminated */ /* * Prepare to cache the update. Create the cache tree, and find/create a cache record. * Note: Cache records are persistent, once created they remain in place forever. * Only the update-data is flushed from time to time. */ if (updcache_keyofs == -1) { updcache = xtreeNew(strcasecmp); updcache_keyofs = strlen(rrddir); } updcachekey = filedir + updcache_keyofs; handle = xtreeFind(updcache, updcachekey); if (handle == xtreeEnd(updcache)) { if (!template) template = setup_template(creparams); if (!template) { errprintf("BUG: setup_template() returns NULL! host=%s,test=%s,cp[0]=%s, cp[1]=%s\n", hostname, testname, (creparams[0] ? creparams[0] : "NULL"), (creparams[1] ? creparams[1] : "NULL")); return -1; } cacheitem = (updcacheitem_t *)calloc(1, sizeof(updcacheitem_t)); cacheitem->key = strdup(updcachekey); cacheitem->tpl = template; xtreeAdd(updcache, cacheitem->key, cacheitem); } else { cacheitem = (updcacheitem_t *)xtreeData(updcache, handle); if (!template) template = cacheitem->tpl; } /* If the RRD file doesn't exist, create it immediately */ if (stat(filedir, &st) == -1) { char **rrdcreate_params, **rrddefinitions; int rrddefcount, i; char *rrakey = NULL; char stepsetting[10]; int havestepsetting = 0, fixcount = 2; dbgprintf("Creating rrd %s\n", filedir); /* How many parameters did we get? */ for (pcount = 0; (creparams[pcount]); pcount++); /* Add the RRA definitions to the create parameter set */ if (pollinterval != DEFAULT_RRD_INTERVAL) { rrakey = (char *)malloc(strlen(testname) + 10); sprintf(rrakey, "%s/%d", testname, pollinterval); } sprintf(stepsetting, "%d", pollinterval); rrddefinitions = get_rrd_definition((rrakey ? rrakey : testname), &rrddefcount); rrdcreate_params = (char **)calloc(4 + pcount + rrddefcount + 1, sizeof(char *)); rrdcreate_params[0] = "rrdcreate"; rrdcreate_params[1] = filedir; /* Is there already a step-setting in the rrddefinitions? */ for (i=0; (!havestepsetting && (i < rrddefcount)); i++) havestepsetting = ((strcmp(rrddefinitions[i], "-s") == 0) || (strcmp(rrddefinitions[i], "--step") == 0)); if (!havestepsetting) { rrdcreate_params[2] = "-s"; rrdcreate_params[3] = stepsetting; fixcount = 4; } for (i=0; (i < pcount); i++) rrdcreate_params[fixcount+i] = creparams[i]; for (i=0; (i < rrddefcount); i++, pcount++) rrdcreate_params[fixcount+pcount] = rrddefinitions[i]; if (debug) { for (i = 0; (rrdcreate_params[i]); i++) { dbgprintf("RRD create param %02d: '%s'\n", i, rrdcreate_params[i]); } } /* * Ugly! RRDtool uses getopt() for parameter parsing, so * we MUST reset this before every call. */ optind = opterr = 0; rrd_clear_error(); result = rrd_create(4+pcount, rrdcreate_params); xfree(rrdcreate_params); if (rrakey) xfree(rrakey); if (result != 0) { errprintf("RRD error creating %s: %s\n", filedir, rrd_get_error()); MEMUNDEFINE(filedir); MEMUNDEFINE(rrdvalues); return 1; } } updtime = atoi(rrdvalues); if (cacheitem->valcount > 0) { /* Check for duplicate updates */ if (cacheitem->updseq[cacheitem->valcount-1] == seq) { /* * This is usually caused by a configuration error, * e.g. two PORT settings in analysis.cfg that * use the same TRACK string. * Can also be two web checks using the same URL, but * with different POST data. */ dbgprintf("%s/%s: Error - ignored duplicate update for message sequence %d\n", hostname, rrdfn, seq); MEMUNDEFINE(filedir); MEMUNDEFINE(rrdvalues); return 0; } else if (cacheitem->updtime[cacheitem->valcount-1] > updtime) { dbgprintf("%s/%s: Error - RRD time goes backwards: Now=%d, previous=%d\n", hostname, rrdfn, (int) updtime, (int)cacheitem->updtime[cacheitem->valcount-1]); MEMUNDEFINE(filedir); MEMUNDEFINE(rrdvalues); return 0; } else if (cacheitem->updtime[cacheitem->valcount-1] == updtime) { int identical = (strcmp(rrdvalues, cacheitem->vals[cacheitem->valcount-1]) == 0); if (!identical) { int i; errprintf("%s/%s: Bug - duplicate RRD data with same timestamp %d, different data\n", hostname, rrdfn, (int) updtime); for (i=0; (i < cacheitem->valcount); i++) dbgprintf("Val %d: Seq %d: %s\n", i, cacheitem->updseq[i], cacheitem->vals[i]); dbgprintf("NewVal: Seq %d: %s\n", seq, rrdvalues); } else { dbgprintf("%s/%s: Ignored duplicate (and identical) update timestamped %d\n", hostname, rrdfn, (int) updtime); } MEMUNDEFINE(filedir); MEMUNDEFINE(rrdvalues); return 0; } } /* * Match the RRD data against any DS client-configuration modifiers. */ modifymsg = check_rrdds_thresholds(hostname, classname, pagepaths, rrdfn, ((rrdtpldata_t *)template)->dsnames, rrdvalues); if (modifymsg) combo_add(modifymsg); /* * See if we want the data to go to an external handler. */ if (processorstream) { int i, n; n = fprintf(processorstream, "%s %s %s", ((rrdtpldata_t *)template)->template, rrdvalues, hostname); for (i=0; ((n >= 0) && fnparams[i]); i++) n = fprintf(processorstream, " %s", fnparams[i]); if (n >= 0) n = fprintf(processorstream, "\n"); if (n >= 0) fflush(processorstream); if (n == -1) { errprintf("Ext-processor write failed: %s\n", strerror(errno)); shutdown_extprocessor(); } } /* Are we actually handling the writing of RRD files? */ if (no_rrd) return 0; /* * We cannot just cache data every time because then after CACHESZ updates * of each RRD, we will flush all of the data at once (all of the caches * fill at the same speed); this would result in huge load-spikes every * rrdinterval*CACHESZ seconds. * * So to smooth the load, we force the update through for every CACHESZ * updates, regardless of how much is in the cache. This gives us a steady * (although slightly higher) load. */ if (use_rrd_cache && (++callcounter < CACHESZ)) { if (cacheitem && (cacheitem->valcount < CACHESZ)) { cacheitem->updseq[cacheitem->valcount] = seq; cacheitem->updtime[cacheitem->valcount] = updtime; cacheitem->vals[cacheitem->valcount] = strdup(rrdvalues); cacheitem->valcount += 1; MEMUNDEFINE(filedir); MEMUNDEFINE(rrdvalues); return 0; } } else callcounter = 0; /* At this point, we will commit the update to disk */ result = flush_cached_updates(cacheitem, rrdvalues); if (result != 0) { char *msg = rrd_get_error(); if (strstr(msg, "(minimum one second step)") != NULL) { dbgprintf("RRD error updating %s from %s: %s\n", filedir, (senderip ? senderip : "unknown"), msg); } else { errprintf("RRD error updating %s from %s: %s\n", filedir, (senderip ? senderip : "unknown"), msg); } MEMUNDEFINE(filedir); MEMUNDEFINE(rrdvalues); return 2; } MEMUNDEFINE(filedir); MEMUNDEFINE(rrdvalues); return 0; } void rrdcacheflushall(void) { xtreePos_t handle; updcacheitem_t *cacheitem; if (updcache_keyofs == -1) return; /* No cache */ for (handle = xtreeFirst(updcache); (handle != xtreeEnd(updcache)); handle = xtreeNext(updcache, handle)) { cacheitem = (updcacheitem_t *) xtreeData(updcache, handle); if (cacheitem->valcount > 0) { sprintf(filedir, "%s%s", rrddir, cacheitem->key); flush_cached_updates(cacheitem, NULL); } } } void rrdcacheflushhost(char *hostname) { xtreePos_t handle; updcacheitem_t *cacheitem; flushtree_t *flushitem; int keylen; time_t now = gettimer(); if (updcache_keyofs == -1) return; /* If we get a full path for the key, skip the leading rrddir */ if (strncmp(hostname, rrddir, updcache_keyofs) == 0) hostname += updcache_keyofs; keylen = strlen(hostname); if (!have_flushtree) { flushtree = xtreeNew(strcasecmp); have_flushtree = 1; } handle = xtreeFind(flushtree, hostname); if (handle == xtreeEnd(flushtree)) { flushitem = (flushtree_t *)calloc(1, sizeof(flushtree_t)); flushitem->hostname = strdup(hostname); flushitem->flushtime = 0; xtreeAdd(flushtree, flushitem->hostname, flushitem); } else { flushitem = (flushtree_t *) xtreeData(flushtree, handle); } if ((flushitem->flushtime + 60) >= now) { dbgprintf("Flush of '%s' skipped, too soon\n", hostname); return; } flushitem->flushtime = now; handle = xtreeFirst(updcache); while (handle != xtreeEnd(updcache)) { cacheitem = (updcacheitem_t *) xtreeData(updcache, handle); switch (strncasecmp(cacheitem->key, hostname, keylen)) { case 1 : handle = xtreeEnd(updcache); break; case 0: if (cacheitem->valcount > 0) { dbgprintf("Flushing cache '%s'\n", cacheitem->key); sprintf(filedir, "%s%s", rrddir, cacheitem->key); flush_cached_updates(cacheitem, NULL); } /* Fall through */ default: handle = xtreeNext(updcache, handle); break; } } } static int rrddatasets(char *hostname, char ***dsnames) { struct stat st; int result; char *fetch_params[] = { "rrdfetch", filedir, "AVERAGE", "-s", "-30m", NULL }; time_t starttime, endtime; unsigned long steptime, dscount; rrd_value_t *rrddata; snprintf(filedir, sizeof(filedir)-1, "%s/%s/%s", rrddir, hostname, rrdfn); filedir[sizeof(filedir)-1] = '\0'; if (stat(filedir, &st) == -1) return 0; optind = opterr = 0; rrd_clear_error(); result = rrd_fetch(5, fetch_params, &starttime, &endtime, &steptime, &dscount, dsnames, &rrddata); if (result == -1) { errprintf("Error while retrieving RRD dataset names from %s: %s\n", filedir, rrd_get_error()); return 0; } free(rrddata); /* No use for the actual data */ return dscount; } /* Include all of the sub-modules. */ #include "rrd/do_xymongen.c" #include "rrd/do_xymonnet.c" #include "rrd/do_xymonproxy.c" #include "rrd/do_xymond.c" #include "rrd/do_citrix.c" #include "rrd/do_ntpstat.c" #include "rrd/do_memory.c" /* Must go before do_la.c */ #include "rrd/do_la.c" /* * From hobbit-perl-client http://sourceforge.net/projects/hobbit-perl-cl/ * version 1.15 Oct. 17 2006 (downloaded on 2008-12-01). * * Include file for netapp.pl dbcheck.pl and beastat.pl scripts * do_fd_lib.c contains some function used by the other library * * Must go before "do_disk.c" */ #include "rrd/do_fd_lib.c" #include "rrd/do_netapp.c" #include "rrd/do_beastat.c" #include "rrd/do_dbcheck.c" #include "rrd/do_disk.c" #include "rrd/do_netstat.c" #include "rrd/do_vmstat.c" #include "rrd/do_iostat.c" #include "rrd/do_ifstat.c" #include "rrd/do_apache.c" #include "rrd/do_sendmail.c" #include "rrd/do_mailq.c" #include "rrd/do_iishealth.c" #include "rrd/do_temperature.c" #include "rrd/do_net.c" #include "rrd/do_ncv.c" #include "rrd/do_external.c" #include "rrd/do_filesizes.c" #include "rrd/do_counts.c" #include "rrd/do_trends.c" #include "rrd/do_ifmib.c" #include "rrd/do_snmpmib.c" /* z/OS, z/VM, z/VME stuff */ #include "rrd/do_paging.c" #include "rrd/do_mdc.c" #include "rrd/do_cics.c" #include "rrd/do_getvis.c" #include "rrd/do_asid.c" /* * From devmon http://sourceforge.net/projects/devmon/ * version 0.3.0 (downloaded on 2008-12-01). */ #include "rrd/do_devmon.c" void update_rrd(char *hostname, char *testname, char *msg, time_t tstamp, char *sender, xymonrrd_t *ldef, char *classname, char *pagepaths) { char *id; MEMDEFINE(rrdvalues); if (ldef) id = ldef->xymonrrdname; else id = testname; senderip = sender; if (strcmp(id, "bbgen") == 0) do_xymongen_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "xymongen") == 0) do_xymongen_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "bbtest") == 0) do_xymonnet_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "xymonnet") == 0) do_xymonnet_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "bbproxy") == 0) do_xymonproxy_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "xymonproxy") == 0) do_xymonproxy_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "hobbitd") == 0) do_xymond_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "xymond") == 0) do_xymond_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "citrix") == 0) do_citrix_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "ntpstat") == 0) do_ntpstat_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "la") == 0) do_la_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "disk") == 0) do_disk_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "memory") == 0) do_memory_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "netstat") == 0) do_netstat_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "vmstat") == 0) do_vmstat_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "iostat") == 0) do_iostat_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "ifstat") == 0) do_ifstat_rrd(hostname, testname, classname, pagepaths, msg, tstamp); /* These two come from the filerstats2bb.pl script. The reports are in disk-format */ else if (strcmp(id, "inode") == 0) do_disk_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "qtree") == 0) do_disk_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "apache") == 0) do_apache_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "sendmail") == 0) do_sendmail_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "mailq") == 0) do_mailq_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "iishealth") == 0) do_iishealth_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "temperature") == 0) do_temperature_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "ncv") == 0) do_ncv_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "tcp") == 0) do_net_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "filesizes") == 0) do_filesizes_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "proccounts") == 0) do_counts_rrd("processes", hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "portcounts") == 0) do_counts_rrd("ports", hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "linecounts") == 0) do_derives_rrd("lines", hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "deltacounts") == 0) do_counts_rrd("deltalines", hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "trends") == 0) do_trends_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "ifmib") == 0) do_ifmib_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (is_snmpmib_rrd(id)) do_snmpmib_rrd(hostname, testname, classname, pagepaths, msg, tstamp); /* z/OS, z/VSE, z/VM from Rich Smrcina */ else if (strcmp(id, "paging") == 0) do_paging_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "mdc") == 0) do_mdc_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "cics") == 0) do_cics_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "getvis") == 0) do_getvis_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "maxuser") == 0) do_asid_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "nparts") == 0) do_asid_rrd(hostname, testname, classname, pagepaths, msg, tstamp); /* * These are from the hobbit-perl-client * NetApp check for netapp.pl, dbcheck.pl and beastat.pl scripts */ else if (strcmp(id, "xtstats") == 0) do_netapp_extrastats_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "quotas") == 0) do_disk_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "snapshot") == 0) do_disk_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "TblSpace") == 0) do_disk_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "stats") == 0) do_netapp_stats_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "ops") == 0) do_netapp_ops_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "cifs") == 0) do_netapp_cifs_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "snaplist") == 0) do_netapp_snaplist_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "snapmirr") == 0) do_netapp_snapmirror_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "HitCache") == 0) do_dbcheck_hitcache_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "Session") == 0) do_dbcheck_session_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "RollBack") == 0) do_dbcheck_rb_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "InvObj") == 0) do_dbcheck_invobj_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "MemReq") == 0) do_dbcheck_memreq_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "JVM") == 0) do_beastat_jvm_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "JMS") == 0) do_beastat_jms_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "JTA") == 0) do_beastat_jta_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "ExecQueue") == 0) do_beastat_exec_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (strcmp(id, "JDBCConn") == 0) do_beastat_jdbc_rrd(hostname, testname, classname, pagepaths, msg, tstamp); /* * This is from the devmon SNMP collector */ else if (strcmp(id, "devmon") == 0) do_devmon_rrd(hostname, testname, classname, pagepaths, msg, tstamp); else if (extids && exthandler) { int i; for (i=0; (extids[i] && strcmp(extids[i], id)); i++) ; if (extids[i]) do_external_rrd(hostname, testname, classname, pagepaths, msg, tstamp); } senderip = NULL; MEMUNDEFINE(rrdvalues); } xymon-4.3.28/xymond/xymond.c0000664000076400007640000053730213033575046016232 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* This is the master daemon, xymond. */ /* */ /* This is a daemon that implements the Big Brother network protocol, with */ /* additional protocol items implemented for Xymon. */ /* */ /* This daemon maintains the full state of the Xymon system in memory, */ /* eliminating the need for file-based storage of e.g. status logs. The web */ /* frontend programs (xymongen, combostatus, hostsvc.cgi etc) can retrieve */ /* current statuslogs from this daemon to build the Xymon webpages. However, */ /* a "plugin" mechanism is also implemented to allow "worker modules" to */ /* pickup various types of events that occur in the system. This allows */ /* such modules to e.g. maintain the standard Xymon file-based storage, or */ /* implement history logging or RRD database updates. This plugin mechanism */ /* uses System V IPC mechanisms for a high-performance/low-latency communi- */ /* cation between xymond and the worker modules - under no circumstances */ /* should the daemon be tasked with storing data to a low-bandwidth channel. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: xymond.c 7999 2017-01-06 02:00:06Z jccleaver $"; #include #include #include #include #include #include #include #ifdef HAVE_SYS_SELECT_H #include /* Someday I'll move to GNU Autoconf for this ... */ #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" #define DISABLED_UNTIL_OK -1 /* * The absolute maximum size we'll grow our buffers to accommodate an incoming message. * This is really just an upper bound to squash the bad guys trying to data-flood us. */ #define MAX_XYMON_INBUFSZ (10*1024*1024) /* 10 MB */ /* The initial size of an input buffer. Make this large enough for most traffic. */ #define XYMON_INBUF_INITIAL (128*1024) /* How much the input buffer grows per re-allocation */ #define XYMON_INBUF_INCREMENT (32*1024) /* How long to keep an ack after the status has recovered */ #define ACKCLEARDELAY 720 /* 12 minutes */ /* How long messages are good for (by default) before going purple - minutes */ #define DEFAULT_VALIDITY 30 #define DEFAULT_PURPLE_INTERVAL 60 int purplecheckinterval = DEFAULT_PURPLE_INTERVAL; /* Seconds - check for purples every 60s */ #define DEFAULT_STATS_INTERVAL (5*60) int statsinterval = DEFAULT_STATS_INTERVAL; /* Seconds - report xymond status every 5m */ /* How long are sub-client messages valid */ #define MAX_SUBCLIENT_LIFETIME 960 /* 15 minutes + a bit */ #define DEFAULT_FLAPCOUNT 5 int flapcount = DEFAULT_FLAPCOUNT; int flapthreshold = (DEFAULT_FLAPCOUNT+1)*5*60; /* Seconds - if more than flapcount changes during this period, it's flapping */ htnames_t *metanames = NULL; typedef struct xymond_meta_t { htnames_t *metaname; char *value; struct xymond_meta_t *next; } xymond_meta_t; typedef struct ackinfo_t { int level; time_t received, validuntil, cleartime; char *ackedby; char *msg; struct ackinfo_t *next; } ackinfo_t; typedef struct testinfo_t { char *name; int clientsave; } testinfo_t; typedef struct modifier_t { char *source, *cause; int color, valid; struct modifier_t *next; } modifier_t; /* This holds all information about a single status */ typedef struct xymond_log_t { struct xymond_hostlist_t *host; testinfo_t *test; char *origin; int color, oldcolor, activealert, histsynced, downtimeactive, flapping, oldflapcolor, currflapcolor; char *testflags; char *grouplist; /* For extended status reports (e.g. from xymond_client) */ char sender[IP_ADDR_STRLEN]; time_t *lastchange; /* Table of times when the currently logged status began */ time_t logtime; /* time when last update was received */ time_t validtime; /* time when status is no longer valid */ time_t enabletime; /* time when test auto-enables after a disable */ time_t acktime; /* time when test acknowledgement expires */ time_t redstart, yellowstart; int maxackedcolor; /* The most severe color that has been acked */ unsigned char *message; int msgsz; unsigned char *dismsg, *ackmsg; char *cookie; time_t cookieexpires; struct xymond_meta_t *metas; struct modifier_t *modifiers; ackinfo_t *acklist; /* Holds list of acks */ unsigned long statuschangecount; struct xymond_log_t *next; } xymond_log_t; typedef struct clientmsg_list_t { char *collectorid; time_t timestamp; char *msg; struct clientmsg_list_t *next; } clientmsg_list_t; /* This is a list of the hosts we have seen reports for, and links to their status logs */ typedef struct xymond_hostlist_t { char *hostname; char ip[IP_ADDR_STRLEN]; enum { H_NORMAL, H_SUMMARY } hosttype; xymond_log_t *logs; xymond_log_t *pinglog; /* Points to entry in logs list, but we need it often */ clientmsg_list_t *clientmsgs; time_t clientmsgtstamp; } xymond_hostlist_t; typedef struct filecache_t { char *fn; long len; unsigned char *fdata; } filecache_t; typedef struct senderstats_t { char *senderip; unsigned long msgcount; } senderstats_t; void *rbhosts; /* The hosts we have reports from */ void *rbtests; /* The tests (columns) we have seen */ void *rborigins; /* The origins we have seen */ void *rbcookies; /* The cookies we use */ void *rbfilecache; void *rbsenders; sender_t *maintsenders = NULL; sender_t *statussenders = NULL; sender_t *adminsenders = NULL; sender_t *wwwsenders = NULL; sender_t *tracelist = NULL; int traceall = 0; int ignoretraced = 0; int clientsavemem = 1; /* In memory */ int clientsavedisk = 0; /* On disk via the CLICHG channel */ int allow_downloads = 1; int defaultvalidity = 30; /* Minutes */ int ackeachcolor = 0; int defaultcookietime = 86400; /* 1 day */ #define NOTALK 0 #define RECEIVING 1 #define RESPONDING 2 /* This struct describes an active connection with a Xymon client */ typedef struct conn_t { int sock; /* Communications socket */ struct sockaddr_in addr; /* Client source address */ unsigned char *buf, *bufp; /* Message buffer and pointer */ size_t buflen, bufsz; /* Active and maximum length of buffer */ int doingwhat; /* Communications state (NOTALK, READING, RESPONDING) */ time_t timeout; /* When the timeout for this connection happens */ struct conn_t *next; } conn_t; enum droprencmd_t { CMD_DROPHOST, CMD_DROPTEST, CMD_RENAMEHOST, CMD_RENAMETEST, CMD_DROPSTATE }; static volatile int running = 1; static volatile int reloadconfig = 0; static volatile time_t nextcheckpoint = 0; static volatile int dologswitch = 0; static volatile int gotalarm = 0; /* Our channels to worker modules */ xymond_channel_t *statuschn = NULL; /* Receives full "status" messages */ xymond_channel_t *stachgchn = NULL; /* Receives brief message about a status change */ xymond_channel_t *pagechn = NULL; /* Receives alert messages (triggered from status changes) */ xymond_channel_t *datachn = NULL; /* Receives raw "data" messages */ xymond_channel_t *noteschn = NULL; /* Receives raw "notes" messages */ xymond_channel_t *enadischn = NULL; /* Receives "enable" and "disable" messages */ xymond_channel_t *clientchn = NULL; /* Receives "client" messages */ xymond_channel_t *clichgchn = NULL; /* Receives "clichg" messages */ xymond_channel_t *userchn = NULL; /* Receives "usermsg" messages */ static int backfeedqueue = -1; static unsigned long backfeedcount = 0; static char *bf_buf = NULL; static int bf_bufsz = 0; #define NO_COLOR (COL_COUNT) static char *colnames[COL_COUNT+1]; int alertcolors, okcolors; enum alertstate_t { A_OK, A_ALERT, A_UNDECIDED }; typedef struct ghostlist_t { char *name; char *sender; time_t tstamp, matchtime; } ghostlist_t; void *rbghosts; typedef struct multisrclist_t { char *id; char *senders[2]; time_t tstamp; } multisrclist_t; void *rbmultisrc; enum ghosthandling_t ghosthandling = GH_LOG; char *checkpointfn = NULL; FILE *dbgfd = NULL; char *dbghost = NULL; time_t boottimer = 0; int hostcount = 0; char *ackinfologfn = NULL; FILE *ackinfologfd = NULL; char *defaultreddelay = NULL, *defaultyellowdelay = NULL; typedef struct xymond_statistics_t { char *cmd; unsigned long count; } xymond_statistics_t; xymond_statistics_t xymond_stats[] = { { "status", 0 }, { "combo", 0 }, { "extcombo", 0 }, { "page", 0 }, { "summary", 0 }, { "data", 0 }, { "clientlog", 0 }, { "client", 0 }, { "notes", 0 }, { "enable", 0 }, { "disable", 0 }, { "modify", 0 }, { "ack", 0 }, { "config", 0 }, { "query", 0 }, { "xymondboard", 0 }, { "xymondlog", 0 }, { "hostinfo", 0 }, { "drop", 0 }, { "rename", 0 }, { "dummy", 0 }, { "ping", 0 }, { "notify", 0 }, { "schedule", 0 }, { "download", 0 }, { NULL, 0 } }; enum boardfield_t { F_NONE, F_IP, F_HOSTNAME, F_TESTNAME, F_MATCHEDTAG, F_COLOR, F_FLAGS, F_LASTCHANGE, F_LOGTIME, F_VALIDTIME, F_ACKTIME, F_DISABLETIME, F_SENDER, F_COOKIE, F_LINE1, F_ACKMSG, F_DISMSG, F_MSG, F_CLIENT, F_CLIENTTSTAMP, F_ACKLIST, F_HOSTINFO, F_FLAPINFO, F_STATS, F_MODIFIERS, F_LAST }; typedef struct boardfieldnames_t { char *name; enum boardfield_t id; } boardfieldnames_t; boardfieldnames_t boardfieldnames[] = { { "ip", F_IP }, { "hostname", F_HOSTNAME }, { "matchedtag", F_MATCHEDTAG }, { "matchedtags", F_MATCHEDTAG }, { "testname", F_TESTNAME }, { "color", F_COLOR }, { "flags", F_FLAGS }, { "lastchange", F_LASTCHANGE }, { "logtime", F_LOGTIME }, { "validtime", F_VALIDTIME }, { "acktime", F_ACKTIME }, { "disabletime", F_DISABLETIME }, { "sender", F_SENDER }, { "cookie", F_COOKIE }, { "line1", F_LINE1 }, { "ackmsg", F_ACKMSG }, { "dismsg", F_DISMSG }, { "msg", F_MSG }, { "client", F_CLIENT }, { "clntstamp", F_CLIENTTSTAMP }, { "acklist", F_ACKLIST }, { "XMH_", F_HOSTINFO }, { "flapinfo", F_FLAPINFO }, { "stats", F_STATS }, { "modifiers", F_MODIFIERS }, { NULL, F_LAST }, }; typedef struct boardfields_t { enum boardfield_t field; enum xmh_item_t xmhfield; /* Only for field == F_HOSTINFO */ } boardfield_t; enum filtertype_t { FILTER_XMH, FILTER_PAGEPATH, FILTER_TEST, FILTER_FIELD, FILTER_FIELDTIME, FILTER_TAG, FILTER_COLOR, FILTER_ACKLEVEL, FILTER_NOTDOWN, FILTER_DOWN }; /* Filtration comparison flags */ #define COMPARE_GT (1 << 0) #define COMPARE_GE (1 << 1) #define COMPARE_LT (1 << 2) #define COMPARE_LE (1 << 3) #define COMPARE_EQ (1 << 4) #define COMPARE_NE (1 << 5) #define COMPARE_INTVL (1 << 29) typedef struct hostfilter_rec_t { enum filtertype_t filtertype; pcre *wantedptn; int wantedvalue; struct hostfilter_rec_t *next; enum xmh_item_t field; /* Only for filtertype == FILTER_XMH */ enum boardfield_t boardfield; /* Only for filtertype == FILTER_FIELD(TIME) */ unsigned int flags; /* Private filter flags */ xtreePos_t handle; } hostfilter_rec_t; /* Statistics counters */ unsigned long msgs_total = 0; unsigned long msgs_total_last = 0; time_t last_stats_time = 0; /* List of scheduled (future) tasks */ typedef struct scheduletask_t { int id; time_t executiontime; char *command; char *sender; struct scheduletask_t *next; } scheduletask_t; scheduletask_t *schedulehead = NULL; int nextschedid = 1; void update_statistics(char *cmd) { int i; dbgprintf("-> update_statistics\n"); if (!cmd) { dbgprintf("No command for update_statistics\n"); return; } msgs_total++; i = 0; while (xymond_stats[i].cmd && strncmp(xymond_stats[i].cmd, cmd, strlen(xymond_stats[i].cmd))) { i++; } xymond_stats[i].count++; dbgprintf("<- update_statistics\n"); } char *generate_stats(void) { static strbuffer_t *statsbuf = NULL; time_t now = getcurrenttime(NULL); time_t nowtimer = gettimer(); int i, clients; char bootuptxt[40]; char uptimetxt[40]; xtreePos_t ghandle; time_t uptime = (nowtimer - boottimer); time_t boottstamp = (now - uptime); char msgline[2048]; dbgprintf("-> generate_stats\n"); MEMDEFINE(bootuptxt); MEMDEFINE(uptimetxt); if (statsbuf == NULL) { statsbuf = newstrbuffer(8192); } else { clearstrbuffer(statsbuf); } strftime(bootuptxt, sizeof(bootuptxt), "%d-%b-%Y %T", localtime(&boottstamp)); sprintf(uptimetxt, "%d days, %02d:%02d:%02d", (int)(uptime / 86400), (int)(uptime % 86400)/3600, (int)(uptime % 3600)/60, (int)(uptime % 60)); sprintf(msgline, "status %s.xymond %s\nStatistics for Xymon daemon\nVersion: %s\nUp since %s (%s)\n\n", xgetenv("MACHINE"), colorname(errbuf ? COL_YELLOW : COL_GREEN), VERSION, bootuptxt, uptimetxt); addtobuffer(statsbuf, msgline); sprintf(msgline, "Incoming messages : %10ld\n", msgs_total); addtobuffer(statsbuf, msgline); i = 0; while (xymond_stats[i].cmd) { sprintf(msgline, "- %-20s : %10ld\n", xymond_stats[i].cmd, xymond_stats[i].count); addtobuffer(statsbuf, msgline); i++; } sprintf(msgline, "- %-20s : %10ld\n", "Bogus/Timeouts ", xymond_stats[i].count); addtobuffer(statsbuf, msgline); if ((now > last_stats_time) && (last_stats_time > 0)) { sprintf(msgline, "Incoming messages/sec : %10ld (average last %d seconds)\n", ((msgs_total - msgs_total_last) / (now - last_stats_time)), (int)(now - last_stats_time)); addtobuffer(statsbuf, msgline); } msgs_total_last = msgs_total; addtobuffer(statsbuf, "\n"); clients = semctl(statuschn->semid, CLIENTCOUNT, GETVAL); sprintf(msgline, "status channel messages: %10ld (%d readers)\n", statuschn->msgcount, clients); addtobuffer(statsbuf, msgline); clients = semctl(stachgchn->semid, CLIENTCOUNT, GETVAL); sprintf(msgline, "stachg channel messages: %10ld (%d readers)\n", stachgchn->msgcount, clients); addtobuffer(statsbuf, msgline); clients = semctl(pagechn->semid, CLIENTCOUNT, GETVAL); sprintf(msgline, "page channel messages: %10ld (%d readers)\n", pagechn->msgcount, clients); addtobuffer(statsbuf, msgline); clients = semctl(datachn->semid, CLIENTCOUNT, GETVAL); sprintf(msgline, "data channel messages: %10ld (%d readers)\n", datachn->msgcount, clients); addtobuffer(statsbuf, msgline); clients = semctl(noteschn->semid, CLIENTCOUNT, GETVAL); sprintf(msgline, "notes channel messages: %10ld (%d readers)\n", noteschn->msgcount, clients); addtobuffer(statsbuf, msgline); clients = semctl(enadischn->semid, CLIENTCOUNT, GETVAL); sprintf(msgline, "enadis channel messages: %10ld (%d readers)\n", enadischn->msgcount, clients); addtobuffer(statsbuf, msgline); clients = semctl(clientchn->semid, CLIENTCOUNT, GETVAL); sprintf(msgline, "client channel messages: %10ld (%d readers)\n", clientchn->msgcount, clients); addtobuffer(statsbuf, msgline); clients = semctl(clichgchn->semid, CLIENTCOUNT, GETVAL); sprintf(msgline, "clichg channel messages: %10ld (%d readers)\n", clichgchn->msgcount, clients); addtobuffer(statsbuf, msgline); clients = semctl(userchn->semid, CLIENTCOUNT, GETVAL); sprintf(msgline, "user channel messages: %10ld (%d readers)\n", userchn->msgcount, clients); addtobuffer(statsbuf, msgline); sprintf(msgline, "backfeed messages : %10ld\n", backfeedcount); addtobuffer(statsbuf, msgline); ghandle = xtreeFirst(rbghosts); if (ghandle != xtreeEnd(rbghosts)) addtobuffer(statsbuf, "\n\nGhost reports:\n"); for (; (ghandle != xtreeEnd(rbghosts)); ghandle = xtreeNext(rbghosts, ghandle)) { ghostlist_t *gwalk = (ghostlist_t *)xtreeData(rbghosts, ghandle); /* Skip records older than 10 minutes */ if (gwalk->tstamp < (nowtimer - 600)) continue; sprintf(msgline, " %-15s reported host %s\n", gwalk->sender, htmlquoted(gwalk->name)); addtobuffer(statsbuf, msgline); } ghandle = xtreeFirst(rbmultisrc); if (ghandle != xtreeEnd(rbmultisrc)) addtobuffer(statsbuf, "\n\nMulti-source statuses\n"); for (; (ghandle != xtreeEnd(rbmultisrc)); ghandle = xtreeNext(rbmultisrc, ghandle)) { multisrclist_t *mwalk = (multisrclist_t *)xtreeData(rbmultisrc, ghandle); /* Skip records older than 10 minutes */ if (mwalk->tstamp < (nowtimer - 600)) continue; sprintf(msgline, " %-25s reported by %s and %s\n", mwalk->id, mwalk->senders[0], mwalk->senders[1]); addtobuffer(statsbuf, msgline); } if (errbuf) { addtobuffer(statsbuf, "\n\nLatest error messages:\n"); addtobuffer(statsbuf, prehtmlquoted(errbuf)); addtobuffer(statsbuf, "\n"); } MEMUNDEFINE(bootuptxt); MEMUNDEFINE(uptimetxt); dbgprintf("<- generate_stats\n"); return STRBUF(statsbuf); } char *totalclientmsg(clientmsg_list_t *msglist) { static strbuffer_t *result = NULL; clientmsg_list_t *mwalk; time_t nowtimer = gettimer(); if (!result) result = newstrbuffer(10240); clearstrbuffer(result); for (mwalk = msglist; (mwalk); mwalk = mwalk->next) { if ((mwalk->timestamp + MAX_SUBCLIENT_LIFETIME) < nowtimer) continue; /* Expired data */ addtobuffer_many(result, "\n[collector:", mwalk->collectorid, "]\n", mwalk->msg, NULL); } return STRBUF(result); } enum alertstate_t decide_alertstate(int color) { if ((okcolors & (1 << color)) != 0) return A_OK; else if ((alertcolors & (1 << color)) != 0) return A_ALERT; else return A_UNDECIDED; } char *check_downtime(char *hostname, char *testname) { void *hinfo = hostinfo(hostname); char *dtag; char *holkey; if (hinfo == NULL) return NULL; dtag = xmh_item(hinfo, XMH_DOWNTIME); holkey = xmh_item(hinfo, XMH_HOLIDAYS); if (dtag && *dtag) { static char *downtag = NULL; static unsigned char *cause = NULL; static int causelen = 0; char *s1, *s2, *s3, *s4, *s5, *p; char timetxt[30]; if (downtag) xfree(downtag); if (cause) xfree(cause); p = downtag = strdup(dtag); do { /* Its either DAYS:START:END or SERVICE:DAYS:START:END:CAUSE */ s1 = p; p += strcspn(p, ":"); if (*p != '\0') { *p = '\0'; p++; } s2 = p; p += strcspn(p, ":"); if (*p != '\0') { *p = '\0'; p++; } s3 = p; p += strcspn(p, ":;,"); if ((*p == ',') || (*p == ';') || (*p == '\0')) { if (*p != '\0') { *p = '\0'; p++; } snprintf(timetxt, sizeof(timetxt), "%s:%s:%s", s1, s2, s3); cause = strdup("Planned downtime"); s1 = "*"; } else if (*p == ':') { *p = '\0'; p++; s4 = p; p += strcspn(p, ":"); if (*p != '\0') { *p = '\0'; p++; } s5 = p; p += strcspn(p, ",;"); if (*p != '\0') { *p = '\0'; p++; } snprintf(timetxt, sizeof(timetxt), "%s:%s:%s", s2, s3, s4); getescapestring(s5, &cause, &causelen); } if (within_sla(holkey, timetxt, 0)) { char *onesvc, *buf; if (strcmp(s1, "*") == 0) return cause; onesvc = strtok_r(s1, ",", &buf); while (onesvc) { if (strcmp(onesvc, testname) == 0) return cause; onesvc = strtok_r(NULL, ",", &buf); } /* If we didn't use the "cause" we just created, it must be freed */ if (cause) xfree(cause); } } while (*p); } return NULL; } xymond_hostlist_t *create_hostlist_t(char *hostname, char *ip) { xymond_hostlist_t *hitem; hitem = (xymond_hostlist_t *) calloc(1, sizeof(xymond_hostlist_t)); hitem->hostname = strdup(hostname); strcpy(hitem->ip, ip); if (strcmp(hostname, "summary") == 0) hitem->hosttype = H_SUMMARY; else hitem->hosttype = H_NORMAL; xtreeAdd(rbhosts, hitem->hostname, hitem); return hitem; } testinfo_t *create_testinfo(char *name) { testinfo_t *newrec; newrec = (testinfo_t *)calloc(1, sizeof(testinfo_t)); newrec->name = strdup(name); newrec->clientsave = clientsavedisk; xtreeAdd(rbtests, newrec->name, newrec); return newrec; } void posttochannel(xymond_channel_t *channel, char *channelmarker, char *msg, char *sender, char *hostname, xymond_log_t *log, char *readymsg) { struct sembuf s; int clients; int n; struct timeval tstamp; struct timezone tz; int semerr = 0; unsigned int bufsz = 1024*shbufsz(channel->channelid); void *hi; char *pagepath, *classname, *osname; time_t timeroffset = (getcurrenttime(NULL) - gettimer()); dbgprintf("-> posttochannel\n"); /* First see how many users are on this channel */ clients = semctl(channel->semid, CLIENTCOUNT, GETVAL); if (clients == 0) { dbgprintf("Dropping message - no readers\n"); return; } /* * Wait for BOARDBUSY to go low. * We need a loop here, because if we catch a signal * while waiting on the semaphore, then we need to * re-start the semaphore wait. Otherwise we may * end up with semaphores that are out of sync * (GOCLIENT goes up while a worker waits for it * to go to 0). */ gotalarm = 0; alarm(5); do { s.sem_num = BOARDBUSY; s.sem_op = 0; s.sem_flg = 0; n = semop(channel->semid, &s, 1); if (n == -1) { semerr = errno; if (semerr != EINTR) errprintf("semop failed, %s\n", strerror(errno)); } } while ((n == -1) && (semerr == EINTR) && running && !gotalarm); alarm(0); if (!running) return; /* Check if the alarm fired */ if (gotalarm) { errprintf("BOARDBUSY locked at %d, GETNCNT is %d, GETPID is %d, %d clients\n", semctl(channel->semid, BOARDBUSY, GETVAL), semctl(channel->semid, BOARDBUSY, GETNCNT), semctl(channel->semid, BOARDBUSY, GETPID), semctl(channel->semid, CLIENTCOUNT, GETVAL)); return; } /* Check if we failed to grab the semaphore */ if (n == -1) { errprintf("Dropping message due to semaphore error\n"); return; } /* All clear, post the message */ if (channel->seq == 999999) channel->seq = 0; channel->seq++; channel->msgcount++; gettimeofday(&tstamp, &tz); if (readymsg) { n = snprintf(channel->channelbuf, (bufsz-5), "@@%s#%u/%s|%d.%06d|%s|%s", channelmarker, channel->seq, (hostname ? hostname : "*"), (int) tstamp.tv_sec, (int) tstamp.tv_usec, sender, readymsg); if (n > (bufsz-5)) { char *p, *overmsg = readymsg; *(overmsg+100) = '\0'; p = strchr(overmsg, '\n'); if (p) *p = '\0'; errprintf("Oversize data/client msg from %s truncated (n=%d, limit %d)\nFirst line: %s\n", sender, n, bufsz, overmsg); } *(channel->channelbuf + bufsz - 5) = '\0'; } else { switch(channel->channelid) { case C_STATUS: hi = hostinfo(hostname); pagepath = (hi ? xmh_item(hi, XMH_ALLPAGEPATHS) : ""); classname = (hi ? xmh_item(hi, XMH_CLASS) : ""); if (!classname) classname = ""; n = snprintf(channel->channelbuf, (bufsz-5), "@@%s#%u/%s|%d.%06d|%s|%s|%s|%s|%d|%s|%s|%s|%d", channelmarker, channel->seq, hostname, /* 0 */ (int) tstamp.tv_sec, (int) tstamp.tv_usec, /* 1 */ sender, /* 2 */ log->origin, /* 3 */ hostname, /* 4 */ log->test->name, /* 5 */ (int) log->validtime, /* 6 */ colnames[log->color], /* 7 */ (log->testflags ? log->testflags : ""), /* 8 */ colnames[log->oldcolor], /* 9 */ (int) log->lastchange[0]); /* 10 */ if (n < (bufsz-5)) { n += snprintf(channel->channelbuf+n, (bufsz-n-5), "|%d|%s", /* 11+12 */ (int)log->acktime, nlencode(log->ackmsg)); } if (n < (bufsz-5)) { n += snprintf(channel->channelbuf+n, (bufsz-n-5), "|%d|%s", /* 13+14 */ (int)log->enabletime, nlencode(log->dismsg)); } if (n < (bufsz-5)) { n += snprintf(channel->channelbuf+n, (bufsz-n-5), "|%d", /* 15 */ (int)(log->host->clientmsgtstamp + timeroffset)); } if (n < (bufsz-5)) { n += snprintf(channel->channelbuf+n, (bufsz-n-5), "|%s", classname); /* 16 */ } if (n < (bufsz-5)) { n += snprintf(channel->channelbuf+n, (bufsz-n-5), "|%s", pagepath); /* 17 */ } if (n < (bufsz-5)) { n += snprintf(channel->channelbuf+n, (bufsz-n-5), "|%d", /* 18 */ (int)log->flapping); } if (n < (bufsz-5)) { modifier_t *mwalk; n += snprintf(channel->channelbuf+n, (bufsz-n-5), "|"); mwalk = log->modifiers; /* 19 */ while ((n < (bufsz-5)) && mwalk) { if (mwalk->valid > 0) { n += snprintf(channel->channelbuf+n, (bufsz-n-5), "%s", nlencode(mwalk->cause)); } mwalk = mwalk->next; } } if (n < (bufsz-5)) { n += snprintf(channel->channelbuf+n, (bufsz-n-5), "\n%s", msg); } if (n > (bufsz-5)) { errprintf("Oversize status msg from %s for %s:%s truncated (n=%d, limit=%d)\n", sender, hostname, log->test->name, n, bufsz); } *(channel->channelbuf + bufsz - 5) = '\0'; break; case C_STACHG: n = snprintf(channel->channelbuf, (bufsz-5), "@@%s#%u/%s|%d.%06d|%s|%s|%s|%s|%d|%s|%s|%d", channelmarker, channel->seq, hostname, /* 0 */ (int) tstamp.tv_sec, (int) tstamp.tv_usec, /* 1 */ sender, /* 2 */ log->origin, /* 3 */ hostname, /* 4 */ log->test->name, /* 5 */ (int) log->validtime, /* 6 */ colnames[log->color], /* 7 */ colnames[log->oldcolor], /* 8 */ (int) log->lastchange[0]) /* 9 */; if (n < (bufsz-5)) { n += snprintf(channel->channelbuf+n, (bufsz-n-5), "|%d|%s", /* 10+11 */ (int)log->enabletime, nlencode(log->dismsg)); } if (n < (bufsz-5)) { n += snprintf(channel->channelbuf+n, (bufsz-n-5), "|%d", /* 12 */ log->downtimeactive); } if (n < (bufsz-5)) { n += snprintf(channel->channelbuf+n, (bufsz-n-5), "|%d", /* 13 */ (int) (log->host->clientmsgtstamp + timeroffset)); } if (n < (bufsz-5)) { modifier_t *mwalk; n += snprintf(channel->channelbuf+n, (bufsz-n-5), "|"); mwalk = log->modifiers; /* 14 */ while ((n < (bufsz-5)) && mwalk) { if (mwalk->valid > 0) { n += snprintf(channel->channelbuf+n, (bufsz-n-5), "%s", nlencode(mwalk->cause)); } mwalk = mwalk->next; } } if (n < (bufsz-5)) { n += snprintf(channel->channelbuf+n, (bufsz-n-5), "\n%s", msg); } if (n > (bufsz-5)) { errprintf("Oversize stachg msg from %s for %s:%s truncated (n=%d, limit=%d)\n", sender, hostname, log->test->name, n, bufsz); } *(channel->channelbuf + bufsz - 5) = '\0'; break; case C_CLICHG: n = snprintf(channel->channelbuf, (bufsz-5), "@@%s#%u/%s|%d.%06d|%s|%s|%d\n%s", channelmarker, channel->seq, hostname, (int) tstamp.tv_sec, (int) tstamp.tv_usec, sender, hostname, (int) (log->host->clientmsgtstamp + timeroffset), totalclientmsg(log->host->clientmsgs)); if (n > (bufsz-5)) { errprintf("Oversize clichg msg from %s for %s truncated (n=%d, limit=%d)\n", sender, hostname, n, bufsz); } *(channel->channelbuf + bufsz - 5) = '\0'; break; case C_PAGE: if (strcmp(channelmarker, "ack") == 0) { n = snprintf(channel->channelbuf, (bufsz-5), "@@%s#%u/%s|%d.%06d|%s|%s|%s|%s|%d\n%s", channelmarker, channel->seq, hostname, (int) tstamp.tv_sec, (int) tstamp.tv_usec, sender, hostname, log->test->name, log->host->ip, (int) log->acktime, msg); } else { hi = hostinfo(hostname); pagepath = (hi ? xmh_item(hi, XMH_ALLPAGEPATHS) : ""); classname = (hi ? xmh_item(hi, XMH_CLASS) : ""); osname = (hi ? xmh_item(hi, XMH_OS) : ""); if (!classname) classname = ""; if (!osname) osname = ""; n = snprintf(channel->channelbuf, (bufsz-5), "@@%s#%u/%s|%d.%06d|%s|%s|%s|%s|%d|%s|%s|%d|%s|%s|%s|%s|%s", channelmarker, channel->seq, hostname, (int) tstamp.tv_sec, (int) tstamp.tv_usec, sender, hostname, log->test->name, log->host->ip, (int) log->validtime, colnames[log->color], colnames[log->oldcolor], (int) log->lastchange[0], pagepath, (log->cookie ? log->cookie : ""), osname, classname, (log->grouplist ? log->grouplist : "")); if (n < (bufsz-5)) { modifier_t *mwalk; n += snprintf(channel->channelbuf+n, (bufsz-n-5), "|"); mwalk = log->modifiers; while ((n < (bufsz-5)) && mwalk) { if (mwalk->valid > 0) { n += snprintf(channel->channelbuf+n, (bufsz-n-5), "%s", nlencode(mwalk->cause)); } mwalk = mwalk->next; } } if (n < (bufsz-5)) { n += snprintf(channel->channelbuf+n, (bufsz-n-5), "\n%s", msg); } } if (n > (bufsz-5)) { errprintf("Oversize page/ack/notify msg from %s for %s:%s truncated (n=%d, limit=%d)\n", sender, hostname, (log->test->name ? log->test->name : ""), n, bufsz); } *(channel->channelbuf + bufsz - 5) = '\0'; break; case C_DATA: case C_CLIENT: /* Data channel messages are pre-formatted so we never go here */ break; case C_NOTES: case C_USER: n = snprintf(channel->channelbuf, (bufsz-5), "@@%s#%u/%s|%d.%06d|%s|%s\n%s", channelmarker, channel->seq, hostname, (int) tstamp.tv_sec, (int) tstamp.tv_usec, sender, hostname, msg); if (n > (bufsz-5)) { errprintf("Oversize %s msg from %s for %s truncated (n=%d, limit=%d)\n", ((channel->channelid == C_NOTES) ? "notes" : "user"), sender, hostname, n, bufsz); } *(channel->channelbuf + bufsz - 5) = '\0'; break; case C_ENADIS: { char *dism = ""; if (log->dismsg) dism = nlencode(log->dismsg); n = snprintf(channel->channelbuf, (bufsz-5), "@@%s#%u/%s|%d.%06d|%s|%s|%s|%d|%s", channelmarker, channel->seq, hostname, (int) tstamp.tv_sec, (int)tstamp.tv_usec, sender, hostname, log->test->name, (int) log->enabletime, dism); if (n > (bufsz-5)) { errprintf("Oversize enadis msg from %s for %s:%s truncated (n=%d, limit=%d)\n", sender, hostname, log->test->name, n, bufsz); } } *(channel->channelbuf + bufsz - 5) = '\0'; break; case C_FEEDBACK_QUEUE: case C_LAST: break; } } /* Terminate the message */ strncat(channel->channelbuf, "\n@@\n", (bufsz-1)); /* Let the readers know it is there. */ clients = semctl(channel->semid, CLIENTCOUNT, GETVAL); /* Get it again, maybe changed since last check */ dbgprintf("Posting message %u to %d readers\n", channel->seq, clients); /* Up BOARDBUSY */ s.sem_num = BOARDBUSY; s.sem_op = (clients - semctl(channel->semid, BOARDBUSY, GETVAL)); if (s.sem_op <= 0) { errprintf("How did this happen? clients=%d, s.sem_op=%d\n", clients, s.sem_op); s.sem_op = clients; } s.sem_flg = 0; n = semop(channel->semid, &s, 1); /* Make sure GOCLIENT is 0 */ n = semctl(channel->semid, GOCLIENT, GETVAL); if (n > 0) { errprintf("Oops ... GOCLIENT is high (%d)\n", n); } s.sem_num = GOCLIENT; s.sem_op = clients; s.sem_flg = 0; /* Up GOCLIENT */ n = semop(channel->semid, &s, 1); dbgprintf("<- posttochannel\n"); return; } void posttoall(char *msg) { posttochannel(statuschn, msg, NULL, "xymond", NULL, NULL, ""); posttochannel(stachgchn, msg, NULL, "xymond", NULL, NULL, ""); posttochannel(pagechn, msg, NULL, "xymond", NULL, NULL, ""); posttochannel(datachn, msg, NULL, "xymond", NULL, NULL, ""); posttochannel(noteschn, msg, NULL, "xymond", NULL, NULL, ""); posttochannel(enadischn, msg, NULL, "xymond", NULL, NULL, ""); posttochannel(clientchn, msg, NULL, "xymond", NULL, NULL, ""); posttochannel(clichgchn, msg, NULL, "xymond", NULL, NULL, ""); posttochannel(userchn, msg, NULL, "xymond", NULL, NULL, ""); } char *log_ghost(char *hostname, char *sender, char *msg) { xtreePos_t ghandle; ghostlist_t *gwalk; char *result = NULL; time_t nowtimer = gettimer(); dbgprintf("-> log_ghost\n"); /* If debugging, log the full request */ if (dbgfd) { fprintf(dbgfd, "\n---- combo message from %s ----\n%s---- end message ----\n", sender, msg); fflush(dbgfd); } if ((hostname == NULL) || (sender == NULL)) return NULL; ghandle = xtreeFind(rbghosts, hostname); gwalk = (ghandle != xtreeEnd(rbghosts)) ? (ghostlist_t *)xtreeData(rbghosts, ghandle) : NULL; /* Disallow weird test names - Note: a future version may restrict these to valid hostname + DNS labels and not preserve case */ if (!gwalk && (strlen(hostname) != strspn(hostname, "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ:,._-")) ) { errprintf("Bogus message from %s: Invalid new hostname '%s'\n", sender, hostname); return NULL; } if ((gwalk == NULL) || ((gwalk->matchtime + 600) < nowtimer)) { int found = 0; if (ghosthandling == GH_MATCH) { /* See if we can find this host just by ignoring domains */ char *hostnodom, *p; void *hrec; hostnodom = strdup(hostname); p = strchr(hostnodom, '.'); if (p) *p = '\0'; for (hrec = first_host(); (hrec && !found); hrec = next_host(hrec, 0)) { char *candname; candname = xmh_item(hrec, XMH_HOSTNAME); p = strchr(candname, '.'); if (p) *p = '\0'; found = (strcasecmp(hostnodom, candname) == 0); if (p) *p = '.'; if (found) { result = candname; xmh_set_item(hrec, XMH_CLIENTALIAS, hostname); errprintf("Matched ghost '%s' to host '%s'\n", hostname, result); } } } if (!found) { if (gwalk == NULL) { gwalk = (ghostlist_t *)calloc(1, sizeof(ghostlist_t)); gwalk->name = strdup(hostname); gwalk->sender = strdup(sender); gwalk->tstamp = gwalk->matchtime = nowtimer; xtreeAdd(rbghosts, gwalk->name, gwalk); } else { if (gwalk->sender) xfree(gwalk->sender); gwalk->sender = strdup(sender); gwalk->tstamp = gwalk->matchtime = nowtimer; } } } else { if (gwalk->sender) xfree(gwalk->sender); gwalk->sender = strdup(sender); gwalk->tstamp = nowtimer; } dbgprintf("<- log_ghost\n"); return result; } void log_multisrc(xymond_log_t *log, char *newsender) { xtreePos_t ghandle; multisrclist_t *gwalk; char id[1024]; dbgprintf("-> log_multisrc\n"); snprintf(id, sizeof(id), "%s:%s", log->host->hostname, log->test->name); ghandle = xtreeFind(rbmultisrc, id); if (ghandle == xtreeEnd(rbmultisrc)) { gwalk = (multisrclist_t *)calloc(1, sizeof(multisrclist_t)); gwalk->id = strdup(id); gwalk->senders[0] = strdup(log->sender); gwalk->senders[1] = strdup(newsender); gwalk->tstamp = gettimer(); xtreeAdd(rbmultisrc, gwalk->id, gwalk); } else { gwalk = (multisrclist_t *)xtreeData(rbmultisrc, ghandle); xfree(gwalk->senders[0]); gwalk->senders[0] = strdup(log->sender); xfree(gwalk->senders[1]); gwalk->senders[1] = strdup(newsender); gwalk->tstamp = gettimer(); } dbgprintf("<- log_multisrc\n"); } xymond_log_t *find_log(hostfilter_rec_t *filter, xymond_hostlist_t **host) { hostfilter_rec_t *fwalk; xymond_hostlist_t *hrec = NULL; testinfo_t *trec = NULL; xymond_log_t *lwalk; *host = NULL; if (!filter) return NULL; for (fwalk = filter; (fwalk); fwalk = fwalk->next) { switch(fwalk->filtertype) { case FILTER_XMH: if ((fwalk->field == XMH_HOSTNAME) && (fwalk->handle != xtreeEnd(rbhosts))) *host = hrec = xtreeData(rbhosts, fwalk->handle); break; case FILTER_TEST: if (fwalk->handle != xtreeEnd(rbtests)) trec = xtreeData(rbtests, fwalk->handle); break; default: break; } } if (!hrec || !trec) return NULL; for (lwalk = hrec->logs; (lwalk && (lwalk->test != trec)); lwalk = lwalk->next); return lwalk; } int accept_test(void *hrec, char *testname) { char *accept = xmh_item(hrec, XMH_ACCEPT_ONLY); char *p, *endp; if (!accept || !testname || !(*testname)) return 1; p = strstr(accept, testname); if (p) { int testlength = strlen(testname); while (p) { /* * p points to where the testname is in the accept string. Must check that it * points to a full word. * * Check : * - if p points at (beginning of accept string, or there is a ',' right before p) AND * - (p+strlen(testname) hits end of accept string, or it hits a ',') */ endp = p + testlength; if (((*endp == '\0') || (*endp == ',')) && ((p == accept) || (*(p-1) == ','))) return 1; /* no match, keep looking */ p = strstr(endp, testname); } } return 0; } void get_hts(char *msg, char *sender, char *origin, xymond_hostlist_t **host, testinfo_t **test, char **grouplist, xymond_log_t **log, int *color, char **downcause, int *alltests, int createhost, int createlog) { /* * This routine takes care of finding existing status log records, or * (if they don't exist) creating new ones for an incoming status. * * "msg" contains an incoming message. First list is of the form "KEYWORD host,domain.test COLOR" */ char *firstline, *p; char *hosttest, *hostname, *testname, *colstr, *grp; char hostip[IP_ADDR_STRLEN]; xtreePos_t hosthandle, testhandle, originhandle; xymond_hostlist_t *hwalk = NULL; testinfo_t *twalk = NULL; int is_summary = 0; char *owalk = NULL; xymond_log_t *lwalk = NULL; dbgprintf("-> get_hts\n"); MEMDEFINE(hostip); *hostip = '\0'; *host = NULL; *test = NULL; *log = NULL; *color = -1; if (grouplist) *grouplist = NULL; if (downcause) *downcause = NULL; if (alltests) *alltests = 0; hosttest = hostname = testname = colstr = grp = NULL; p = strchr(msg, '\n'); if (p == NULL) { firstline = strdup(msg); } else { *p = '\0'; firstline = strdup(msg); *p = '\n'; } p = strtok(firstline, " \t"); /* Keyword ... */ if (p) { /* There might be a group-list */ grp = strstr(p, "/group:"); if (grp) grp += 7; } if (p) hosttest = strtok(NULL, " \t"); /* ... HOST.TEST combo ... */ if (hosttest == NULL) goto done; colstr = strtok(NULL, " \t"); /* ... and the color (if any) */ if (colstr) { *color = parse_color(colstr); /* Don't create log-entries if we get a bad color spec. */ if (*color == -1) createlog = 0; } else createlog = 0; if (strncmp(msg, "summary", 7) == 0) { /* Summary messages are handled specially */ hostname = hosttest; /* This will always be "summary" */ testname = strchr(hosttest, '.'); if (testname) { *testname = '\0'; testname++; } is_summary = 1; } else { char *knownname; hostname = hosttest; testname = strrchr(hosttest, '.'); if (testname) { *testname = '\0'; testname++; } uncommafy(hostname); /* For BB agent compatibility */ knownname = knownhost(hostname, hostip, ghosthandling); if (knownname == NULL) { knownname = log_ghost(hostname, sender, msg); if (knownname == NULL) goto done; } hostname = knownname; } hosthandle = xtreeFind(rbhosts, hostname); if (hosthandle == xtreeEnd(rbhosts)) hwalk = NULL; else hwalk = xtreeData(rbhosts, hosthandle); if (createhost && (hosthandle == xtreeEnd(rbhosts))) { hwalk = create_hostlist_t(hostname, hostip); hostcount++; } if (testname && *testname) { if (alltests && (*testname == '*')) { *alltests = 1; return; } testhandle = xtreeFind(rbtests, testname); if (testhandle != xtreeEnd(rbtests)) twalk = xtreeData(rbtests, testhandle); /* Disallow new, weird test names - Note: a future version of Xymon may restrict this further and not preserve case */ /* NB: Summary messages are stored under the pseudo-host 'summary' but have invalid test names unpacked by xymongen */ if (!twalk && !is_summary && (strlen(testname) != strspn(testname, "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ:\\/_-")) ) { errprintf("Bogus message from %s: Invalid new testname '%s'\n", sender, testname); return; } if (createlog && (twalk == NULL)) twalk = create_testinfo(testname); } else { if (createlog) errprintf("Bogus message from %s: No testname '%s'\n", sender, msg); } if (origin) { originhandle = xtreeFind(rborigins, origin); if (originhandle != xtreeEnd(rborigins)) owalk = xtreeData(rborigins, originhandle); if (createlog && (owalk == NULL)) { owalk = strdup(origin); xtreeAdd(rborigins, owalk, owalk); } } if (hwalk && twalk && owalk) { for (lwalk = hwalk->logs; (lwalk && ((lwalk->test != twalk) || (lwalk->origin != owalk))); lwalk = lwalk->next); if (createlog && (lwalk == NULL)) { lwalk = (xymond_log_t *)calloc(1, sizeof(xymond_log_t)); lwalk->lastchange = (time_t *)calloc((flapcount > 0) ? flapcount : 1, sizeof(time_t)); lwalk->lastchange[0] = getcurrenttime(NULL); lwalk->color = lwalk->oldcolor = NO_COLOR; lwalk->host = hwalk; lwalk->test = twalk; lwalk->origin = owalk; lwalk->next = hwalk->logs; hwalk->logs = lwalk; if (strcmp(testname, xgetenv("PINGCOLUMN")) == 0) hwalk->pinglog = lwalk; } } done: if (colstr) { if ((*color == COL_RED) || (*color == COL_YELLOW) || (*color == COL_PURPLE)) { char *cause; cause = check_downtime(hostname, testname); if (lwalk) lwalk->downtimeactive = (cause != NULL); if (cause) *color = COL_BLUE; if (downcause) *downcause = cause; } else { if (lwalk) lwalk->downtimeactive = 0; } } if (grouplist && grp) *grouplist = strdup(grp); xfree(firstline); *host = hwalk; *test = twalk; *log = lwalk; MEMUNDEFINE(hostip); dbgprintf("<- get_hts\n"); } void clear_cookie(xymond_log_t *log) { if (!log->cookie) return; xtreeDelete(rbcookies, log->cookie); xfree(log->cookie); log->cookie = NULL; log->cookieexpires = 0; } xymond_log_t *find_cookie(char *cookie) { /* * Find a cookie we have issued. */ xymond_log_t *result = NULL; xtreePos_t cookiehandle; dbgprintf("-> find_cookie\n"); cookiehandle = xtreeFind(rbcookies, cookie); if (cookiehandle != xtreeEnd(rbcookies)) { result = xtreeData(rbcookies, cookiehandle); if (result->cookieexpires <= getcurrenttime(NULL)) { clear_cookie(result); result = NULL; } } dbgprintf("<- find_cookie\n"); return result; } static int changedelay(void *hinfo, int newcolor, char *testname, int currcolor) { char *key, *tok, *dstr = NULL; int keylen, result = 0; /* Ignore any delays when we start with a purple status */ if (currcolor == COL_PURPLE) return 0; switch (newcolor) { case COL_RED: dstr = xmh_item(hinfo, XMH_DELAYRED); if (!dstr) dstr = defaultreddelay; break; case COL_YELLOW: dstr = xmh_item(hinfo, XMH_DELAYYELLOW); if (!dstr) dstr = defaultyellowdelay; break; default: break; } if (!dstr) return result; /* Check "DELAYRED=cpu:10,disk:30,ssh:20" - number is in minutes */ keylen = strlen(testname) + 1; key = (char *)malloc(keylen + 1); sprintf(key, "%s:", testname); dstr = strdup(dstr); tok = strtok(dstr, ","); while (tok && (strncmp(key, tok, keylen) != 0)) tok = strtok(NULL, ","); if (tok) result = 60*atoi(tok+keylen); /* Convert to seconds */ xfree(key); xfree(dstr); return result; } static int isset_noflap(void *hinfo, char *testname, char *hostname) { char *tok, *dstr; int keylen; dstr = xmh_item(hinfo, XMH_NOFLAP); if (!dstr) return 0; /* no 'noflap' set */ /* Check bare noflap (disable for host) vs "noflap=test1,test2" */ /* A bare noflap will be set equal to the key itself (usually NOFLAP) like a flag */ if (strcmp(dstr, "NOFLAP") == 0) return 1; /* if not 'NOFLAP', we should receive "=test1,test2". Skip the = */ if (*dstr == '=') dstr++; keylen = strlen(testname); tok = strtok(dstr, ","); while (tok && (strncmp(testname, tok, keylen) != 0)) tok = strtok(NULL, ","); if (!tok) return 0; /* specifies noflap, but this test is not in the list */ /* do not use flapping for the test */ dbgprintf("Ignoring flapping for %s:%s due to noflap set.\n", hostname, testname); return 1; } void handle_status(unsigned char *msg, char *sender, char *hostname, char *testname, char *grouplist, xymond_log_t *log, int newcolor, char *downcause, int modifyonly) { int validity = defaultvalidity; time_t now = getcurrenttime(NULL); int msglen, issummary; enum alertstate_t oldalertstatus, newalertstatus; int delayval = 0; void *hinfo = hostinfo(hostname); dbgprintf("->handle_status\n"); if (msg == NULL) { errprintf("handle_status got a NULL message for %s.%s, sender %s, color %s\n", textornull(hostname), textornull(testname), textornull(sender), colorname(newcolor)); return; } msglen = strlen(msg); if (msglen == 0) { errprintf("Bogus status message for %s.%s contains no data: Sent from %s\n", textornull(hostname), textornull(testname), textornull(sender)); return; } if (msg_data(msg, 0) == (char *)msg, 0) { errprintf("Bogus status message: msg_data finds no host.test. Sent from: '%s', data:'%s'\n", sender, msg); return; } /* XXX: TODO: Needs revisiting; get_hts() has already run, so * we're leaving test record debris around */ /* Check if disallowed, but let internally-generated messages through */ /* Otherwise existing tests never go purple */ // if ((strcmp(sender, "xymond") != 0) && !accept_test(hinfo, testname)) { // dbgprintf("Rejected status message for %s.%s sent from %s\n", // textornull(hostname), textornull(testname), textornull(sender)); // return; // } issummary = (log->host->hosttype == H_SUMMARY); if (strncmp(msg, "status+", 7) == 0) { validity = durationvalue(msg+7); } if (!modifyonly && log->modifiers) { /* * Original status message - check if there is an active modifier for the color. * We don't do this for status changes triggered by a "modify" command. */ modifier_t *mwalk; modifier_t *mlast; int mcolor = -1; mlast = NULL; mwalk = log->modifiers; while (mwalk) { mwalk->valid--; if (mwalk->valid <= 0) { modifier_t *zombie; /* Modifier no longer valid */ zombie = mwalk; if (zombie->source) xfree(zombie->source); if (zombie->cause) xfree(zombie->cause); /* Remove this modifier from the list. Make sure log->modifiers is updated */ if (mwalk == log->modifiers) log->modifiers = mwalk->next; /* ... link the previous entry to the next, since we're about to free the current record */ if (mlast) mlast->next = mwalk->next; mwalk = mwalk->next; xfree(zombie); } else { if (mwalk->color > mcolor) mcolor = mwalk->color; mlast = mwalk; mwalk = mwalk->next; } } /* If there was an active modifier, this overrides the current "newcolor" status value */ if ((mcolor != -1) && (mcolor != newcolor)) newcolor = mcolor; } /* * Flap check. * * We check if more than flapcount changes have occurred * within "flapthreshold" seconds. If yes, and the newcolor * is less serious than the old color, then we ignore the * color change and keep the status at the more serious level. */ if (modifyonly || issummary) { /* Nothing */ } else if ((flapcount > 0) && ((now - log->lastchange[flapcount-1]) < flapthreshold) && (!isset_noflap(hinfo, testname, hostname))) { if (!log->flapping) { errprintf("Flapping detected for %s:%s - %d changes in %d seconds\n", hostname, testname, flapcount, (now - log->lastchange[flapcount-1])); log->flapping = 1; log->oldflapcolor = log->color; log->currflapcolor = newcolor; } else { log->oldflapcolor = log->currflapcolor; log->currflapcolor = newcolor; } /* Make sure we maintain the most critical level reported by the flapping unit */ if (newcolor < log->color) newcolor = log->color; /* * If the status is actually changing, but we've detected it's a * flap and therefore suppress atatus change events, then we must * update the lastchange-times here because it won't be done in * the status-change handler. */ if ((log->oldflapcolor != log->currflapcolor) && (newcolor == log->color)) { int i; for (i=flapcount-1; (i > 0); i--) log->lastchange[i] = log->lastchange[i-1]; log->lastchange[0] = now; } } else { log->flapping = 0; } if (log->enabletime == DISABLED_UNTIL_OK) { /* The test is disabled until we get an OK status */ if ((newcolor != COL_BLUE) && (decide_alertstate(newcolor) == A_OK)) { /* It's OK now - clear the disable status */ log->enabletime = 0; if (log->dismsg) { xfree(log->dismsg); log->dismsg = NULL; } posttochannel(enadischn, channelnames[C_ENADIS], msg, sender, log->host->hostname, log, NULL); } else { /* Still not OK - keep it BLUE */ newcolor = COL_BLUE; } } else if (log->enabletime > now) { /* The test is currently disabled. */ newcolor = COL_BLUE; } else if (log->enabletime) { /* A disable has expired. Clear the timestamp and the message buffer */ log->enabletime = 0; if (log->dismsg) { xfree(log->dismsg); log->dismsg = NULL; } posttochannel(enadischn, channelnames[C_ENADIS], msg, sender, log->host->hostname, log, NULL); } else { /* If we got a downcause, and the status is not disabled, use downcause as the disable text */ if (log->dismsg) { xfree(log->dismsg); log->dismsg = NULL; } if (downcause && (newcolor == COL_BLUE)) log->dismsg = strdup(downcause); } if (log->acktime) { /* Handling of ack'ed tests */ if (decide_alertstate(newcolor) == A_OK) { /* The test recovered. Clear the ack. */ log->acktime = 0; log->maxackedcolor = 0; } if (ackeachcolor && (log->maxackedcolor < newcolor)) { /* Severity has increased above the one that was acked. Clear the current ack */ log->acktime = 0; } if (log->acktime > now) { /* Don't need to do anything about an acked test */ } else { /* The acknowledge has expired. Clear the timestamp and the message buffer */ log->acktime = 0; log->maxackedcolor = 0; if (log->ackmsg) { xfree(log->ackmsg); log->ackmsg = NULL; } } } if (!modifyonly) { log->logtime = now; /* * Decide how long this status is valid. * * Normally we'll just set the valid time according * to the validity of the status report. * * If the status is acknowledged, make it valid for the longest period * of the acknowledgment and the normal validity (so an acknowledged status * does not go purple because it is not being updated due to the host being down). * * Same tweak must be done for disabled tests. */ log->validtime = now + validity*60; if (log->acktime && (log->acktime > log->validtime)) log->validtime = log->acktime; if (log->enabletime) { if (log->enabletime == DISABLED_UNTIL_OK) log->validtime = INT_MAX; else if (log->enabletime > log->validtime) log->validtime = log->enabletime; } else if ((newcolor == COL_PURPLE) && (xmh_item(hinfo, XMH_DOWNTIME) != NULL) ) { /* * If DOWNTIME is configured, we don't want to wait the default amount of time * to re-scan for validity. */ log->validtime = now + 60; } /* * If we have an existing status, check if the sender has changed. * This could be an indication of a mis-configured host reporting with * the wrong hostname. */ if (*(log->sender) && (strcmp(log->sender, sender) != 0)) { /* * There are a few exceptions: * - if sender is "xymond", then this is an internal update, e.g. a status going purple. * - if the host has "pulldata" enabled, then the sender shows up as the host doing the * data collection, so it does not make sense to check it (thanks to Cade Robinson). * - some multi-homed hosts use a random IP for sending us data. */ if ( (strcmp(log->sender, "xymond") != 0) && (strcmp(sender, "xymond") != 0) && (strcmp(sender, "0.0.0.0") != 0)) { if ((xmh_item(hinfo, XMH_PULLDATA) == NULL) && (xmh_item(hinfo, XMH_FLAG_MULTIHOMED) == NULL)) { log_multisrc(log, sender); } } } strncpy(log->sender, sender, sizeof(log->sender)-1); *(log->sender + sizeof(log->sender) - 1) = '\0'; } /* Handle delayed red/yellow */ switch (newcolor) { case COL_RED: if (log->redstart == 0) log->redstart = now; /* * Do NOT clear yellowstart. If we changed green->red, then it is already clear. * When changing yellow->red, we may drop down to yellow again later and then we * want to count the red time as part of the yellow status. * But do set yellowstart if it is 0. If we go green->red now, and then later * red->yellow, we do want it to look as if the yellow began when the red status * happened. */ if (log->yellowstart == 0) log->yellowstart = now; break; case COL_YELLOW: if (log->yellowstart == 0) log->yellowstart = now; log->redstart = 0; /* Clear it here, so brief red's from a yellow state does not trigger red */ break; default: log->yellowstart = log->redstart = 0; break; } if ((newcolor == COL_RED) && ((delayval = changedelay(hinfo, COL_RED, testname, log->color)) > 0)) { if ((now - log->redstart) >= delayval) { /* Time's up - we will go red */ } else { delayval = changedelay(hinfo, COL_YELLOW, testname, log->color); if ((now - log->redstart) >= delayval) { /* The yellow delay has been passed, so go yellow */ newcolor = COL_YELLOW; } else { /* Neither yellow nor red delay passed - keep current color */ newcolor = log->color; } } } else if ((newcolor == COL_YELLOW) && ((delayval = changedelay(hinfo, COL_YELLOW, testname, log->color)) > 0)) { if ((now - log->yellowstart) < delayval) newcolor = log->color; /* Keep current color */ } log->oldcolor = log->color; log->color = newcolor; oldalertstatus = decide_alertstate(log->oldcolor); newalertstatus = decide_alertstate(newcolor); /* grouplist and log->grouplist can point to the same address.. */ if (log->grouplist && log->grouplist != grouplist) xfree(log->grouplist); if (grouplist && !log->grouplist) log->grouplist = strdup(grouplist); if (log->acklist) { ackinfo_t *awalk; if ((oldalertstatus != A_OK) && (newalertstatus == A_OK)) { /* The status recovered. Set the "clearack" timer, unless it is just because we are in a DOWNTIME period */ if (!log->downtimeactive) { time_t cleartime = now + ACKCLEARDELAY; for (awalk = log->acklist; (awalk); awalk = awalk->next) awalk->cleartime = cleartime; } } else if ((oldalertstatus == A_OK) && (newalertstatus != A_OK)) { /* The status went into a failure-mode. Any acks are revived */ for (awalk = log->acklist; (awalk); awalk = awalk->next) awalk->cleartime = awalk->validuntil; } } if (msg != log->message) { /* They can be the same when called from handle_enadis() or check_purple_status() */ char *p; /* * Note here: * - log->msgsz is the buffer size INCLUDING the final \0. * - msglen is the message length WITHOUT the final \0. */ if ((log->message == NULL) || (log->msgsz == 0)) { /* No buffer - get one */ log->message = (unsigned char *)malloc(msglen+1); memcpy(log->message, msg, msglen+1); log->msgsz = msglen+1; } else if (log->msgsz > msglen) { /* Message - including \0 - fits into the existing buffer. */ memcpy(log->message, msg, msglen+1); } else { /* Message does not fit into existing buffer. Grow it. */ log->message = (unsigned char *)realloc(log->message, msglen+1); memcpy(log->message, msg, msglen+1); log->msgsz = msglen+1; } /* Get at the test flags. They are immediately after the color */ p = msg_data(msg, 0); p += strlen(colorname(newcolor)); if (strncmp(p, " End-of-file */ ioerror = 1; dbgprintf("get_xymond_message: Returning NULL due to EOF\n"); return NULL; } else { /* * Got data - null-terminate it, and update fillpos */ dbgprintf("Got %d bytes\n", res); *(fillpos+res) = '\0'; fillpos += res; /* Did we get an end-of-message marker ? Then we're done. */ endpos = strstr(endsrch, "\n@@\n"); needmoredata = (endpos == NULL); /* * If not done, update endsrch. We need to look at the * last 3 bytes of input we got - they could be "\n@@" so * all that is missing is the final "\n". */ if (needmoredata && (res >= 3)) endsrch = fillpos-3; } } } } /* We have a complete message between startpos and endpos */ result = startpos; *endpos = '\0'; if (truncated) { startpos = fillpos = buf; endpos = NULL; } else { startpos = endpos+4; /* +4 because we skip the "\n@@\n" end-marker from the previous message */ endpos = strstr(startpos, "\n@@\n"); /* To see if we already have a full message loaded */ /* fillpos stays where it is */ } /* Check that it really is a message, and not just some garbled data */ if (strncmp(result, "@@", 2) != 0) { errprintf("Dropping (more) garbled data\n"); goto startagain; } { /* * Get and check the message sequence number. * We don't do this for network based workers, since the * sequence number is globally generated (by xymond) * but a network-based worker may only see some of the * messages (those that are not handled by other network-based * worker modules). */ char *p = result + strcspn(result, "#/|\n"); if (*p == '#') { *seq = atoi(p+1); if (debug) { p = strchr(result, '\n'); if (p) *p = '\0'; dbgprintf("%s: Got message %u %s\n", id, *seq, result); if (p) *p = '\n'; } if ((seqnum == 0) || (*seq == (seqnum + 1))) { /* First message, or the correct sequence # */ seqnum = *seq; } else if (*seq == seqnum) { /* Duplicate message - drop it */ errprintf("%s: Duplicate message %d dropped\n", id, *seq); goto startagain; } else { /* * Out-of-sequence message. Cant do much except accept it. * Since xymond_channel filters out some messages, messages * may be missing. We really could do without the sequence * numbers now, I think. */ seqnum = *seq; } if (seqnum == 999999) seqnum = 0; } } /* Verify checksum - except for truncated messages, where it won't match since we overwrite bytes with the end-marker */ if (result && !truncated) { static struct digestctx_t *ctx = NULL; char *hashstr; if (!ctx) { ctx = (digestctx_t *) malloc(sizeof(digestctx_t)); ctx->digestname = strdup("md5"); ctx->digesttype = D_MD5; ctx->mdctx = (void *)malloc(myMD5_Size()); } hashstr = result + strcspn(result, ":#/|\n"); if (*hashstr == ':') { unsigned char md_value[16]; char md_string[2*16+1]; int i; char *p; myMD5_Init(ctx->mdctx); myMD5_Update(ctx->mdctx, result, (hashstr - result)); myMD5_Update(ctx->mdctx, hashstr + 33, strlen(hashstr + 33)); myMD5_Update(ctx->mdctx, "\n@@\n", 4); /* Stripped earlier */ myMD5_Final(md_value, ctx->mdctx); for(i = 0, p = md_string; (i < sizeof(md_value)); i++) p += sprintf(p, "%02x", md_value[i]); *p = '\0'; if (memcmp(hashstr+1, md_string, 32) != 0) { p = strchr(result, '\n'); if (p) *(p+1) = '\0'; errprintf("get_xymond_message: Invalid checksum, skipping message '%s'\n", result); result = NULL; goto startagain; } } } dbgprintf("startpos %ld, fillpos %ld, endpos %ld\n", (startpos-buf), (fillpos-buf), (endpos ? (endpos-buf) : -1)); return result; } xymon-4.3.28/xymond/do_rrd.h0000664000076400007640000000241712173472453016166 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __DO_RRD_H__ #define __DO_RRD_H__ #include #include "libxymon.h" extern char *rrddir; extern char *trackmax; extern int use_rrd_cache; extern int no_rrd; extern void setup_exthandler(char *handlerpath, char *ids); extern void update_rrd(char *hostname, char *testname, char *restofmsg, time_t tstamp, char *sender, xymonrrd_t *ldef, char *classname, char *pagepaths); extern void rrdcacheflushall(void); extern void rrdcacheflushhost(char *hostname); extern void setup_extprocessor(char *cmd); extern void shutdown_extprocessor(void); #endif xymon-4.3.28/xymond/combostatus.c0000664000076400007640000003055612616007743017256 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon combination test tool. */ /* */ /* Copyright (C) 2003-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: combostatus.c 7718 2015-11-03 01:37:39Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include "version.h" #include "libxymon.h" typedef struct value_t { char *symbol; int color; struct value_t *next; } value_t; typedef struct testspec_t { char *reshostname; char *restestname; char *expression; char *comment; char *resultexpr; value_t *valuelist; long result; char *errbuf; struct testspec_t *next; } testspec_t; static testspec_t *testhead = NULL; static int testcount = 0; static int errorcolors = (1 << COL_RED); static char *gethname(char *spec) { static char *result = NULL; char *p; if (result) xfree(result); /* grab the hostname part from a "www.xxx.com.testname" string */ p = strrchr(spec, '.'); if (!p) { errprintf("Item '%s' has no testname part\n", spec); return NULL; } *p = '\0'; result = strdup(spec); *p = '.'; return result; } static char *gettname(char *spec) { static char *result = NULL; char *p; if (result) xfree(result); /* grab the testname part from a "www.xxx.com.testname" string */ p = strrchr(spec, '.'); if (!p) { errprintf("Item '%s' has no testname part\n", spec); return NULL; } result = strdup(p+1); return result; } static void flush_valuelist(value_t *head) { value_t *walk, *zombie; walk = head; while (walk) { zombie = walk; walk = walk->next; xfree(zombie->symbol); xfree(zombie); } } static void flush_testlist(void) { testspec_t *walk, *zombie; walk = testhead; while (walk) { zombie = walk; walk = walk->next; if (zombie->reshostname) xfree(zombie->reshostname); if (zombie->restestname) xfree(zombie->restestname); if (zombie->expression) xfree(zombie->expression); if (zombie->comment) xfree(zombie->comment); if (zombie->resultexpr) xfree(zombie->resultexpr); if (zombie->errbuf) xfree(zombie->errbuf); flush_valuelist(zombie->valuelist); xfree(zombie); } testhead = NULL; testcount = 0; } static void loadtests(void) { static time_t lastupdate = 0; static char *fn = NULL; struct stat st; FILE *fd; strbuffer_t *inbuf; if (!fn) { fn = (char *)malloc(1024 + strlen(xgetenv("XYMONHOME"))); *fn = '\0'; } sprintf(fn, "%s/etc/combo.cfg", xgetenv("XYMONHOME")); if ((stat(fn, &st) == 0) && (st.st_mtime == lastupdate)) return; lastupdate = st.st_mtime; fd = stackfopen(fn, "r", NULL); if (fd == NULL) { errprintf("Cannot open %s/combo.cfg\n", xgetenv("XYMONHOME")); *fn = '\0'; return; } flush_testlist(); inbuf = newstrbuffer(0); while (stackfgets(inbuf, NULL)) { char *p, *comment; char *inp, *outp; p = strchr(STRBUF(inbuf), '\n'); if (p) *p = '\0'; /* Strip whitespace */ for (inp=outp=STRBUF(inbuf); ((*inp >= ' ') && (*inp != '#')); inp++) { if (isspace((int)*inp)) { } else { *outp = *inp; outp++; } } *outp = '\0'; if (strlen(inp)) memmove(outp, inp, strlen(inp)+1); strbufferrecalc(inbuf); if (STRBUFLEN(inbuf) && (*STRBUF(inbuf) != '#') && (p = strchr(STRBUF(inbuf), '=')) ) { testspec_t *newtest; char *hname, *tname; hname = gethname(STRBUF(inbuf)); tname = gettname(STRBUF(inbuf)); if (hname && tname) { *p = '\0'; comment = strchr(p+1, '#'); if (comment) *comment = '\0'; newtest = (testspec_t *) malloc(sizeof(testspec_t)); newtest->reshostname = strdup(gethname(STRBUF(inbuf))); newtest->restestname = strdup(gettname(STRBUF(inbuf))); newtest->expression = strdup(p+1); newtest->comment = (comment ? strdup(comment+1) : NULL); newtest->resultexpr = NULL; newtest->valuelist = NULL; newtest->result = -1; newtest->errbuf = NULL; newtest->next = testhead; testhead = newtest; testcount++; } else { errprintf("Invalid combo test %s - missing host/test names. Perhaps you need to escape dashes?\n", STRBUF(inbuf)); } } } stackfclose(fd); freestrbuffer(inbuf); } static int getxymondvalue(char *hostname, char *testname, char **errptr) { static char *board = NULL; int xymondresult; int result = COL_CLEAR; char *pattern, *found, *colstr; if (board == NULL) { sendreturn_t *sres = newsendreturnbuf(1, NULL); xymondresult = sendmessage("xymondboard fields=hostname,testname,color", NULL, XYMON_TIMEOUT, sres); board = getsendreturnstr(sres, 1); if ((xymondresult != XYMONSEND_OK) || (board == NULL)) { board = ""; *errptr += sprintf(*errptr, "Could not access xymond board, error %d\n", xymondresult); return COL_CLEAR; } freesendreturnbuf(sres); } pattern = (char *)malloc(1 + strlen(hostname) + 1 + strlen(testname) + 1 + 1); sprintf(pattern, "\n%s|%s|", hostname, testname); if (strncmp(board, pattern+1, strlen(pattern+1)) == 0) { /* The first entry in the board doesn't have the "\n" */ found = board; } else { found = strstr(board, pattern); } if (found) { /* hostname|testname|color */ colstr = found + strlen(pattern); result = parse_color(colstr); } xfree(pattern); return result; } static long getvalue(char *hostname, char *testname, int *color, char **errbuf) { testspec_t *walk; char errtext[1024]; char *errptr; *color = -1; errptr = errtext; *errptr = '\0'; /* First check if it is one of our own tests */ for (walk = testhead; (walk && ( (strcmp(walk->reshostname, hostname) != 0) || (strcmp(walk->restestname, testname) != 0) ) ); walk = walk->next); if (walk != NULL) { /* It is a combo test they want the result of. */ return walk->result; } *color = getxymondvalue(hostname, testname, &errptr); /* Save error messages */ if (strlen(errtext) > 0) { if (*errbuf == NULL) *errbuf = strdup(errtext); else { *errbuf = (char *)realloc(*errbuf, strlen(*errbuf)+strlen(errtext)+1); strcat(*errbuf, errtext); } } if (*color == -1) return -1; else return (((1 << *color) & errorcolors) == 0); } static long evaluate(char *symbolicexpr, char **resultexpr, value_t **valuelist, char **errbuf) { char expr[MAX_LINE_LEN]; char *inp, *outp, *symp; char symbol[MAX_LINE_LEN]; int done; int insymbol = 0; int result, error; long oneval; int onecolor; value_t *valhead = NULL, *valtail = NULL; value_t *newval; char errtext[1024]; done = 0; inp=symbolicexpr; outp=expr; symp = NULL; while (!done) { if (isalpha((int)*inp) || (isdigit((int)*inp) && insymbol && *(inp+1) && (*(inp+1) > ' ') && *(inp+2) && (*(inp+2) > ' ')) ) { /* puke */ if (!insymbol) { insymbol = 1; symp = symbol; } *symp = *inp; symp++; } else if (insymbol && (isdigit((int) *inp) || (*inp == '.'))) { *symp = *inp; symp++; } else if (insymbol && ((*inp == '\\') && (*(inp+1) > ' '))) { *symp = *(inp+1); symp++; inp++; } else { if (insymbol) { /* Symbol finished - evaluate the symbol */ char *hname, *tname; *symp = '\0'; insymbol = 0; hname = gethname(symbol); tname = gettname(symbol); if (hname && tname) { oneval = getvalue(gethname(symbol), gettname(symbol), &onecolor, errbuf); if (oneval == -1) { dbgprintf("Forward lookup of '%s.%s' pending for '%s'\n", hname, tname, symbolicexpr); return -1; } } else { errprintf("Invalid data for symbol calculation - missing host/testname: %s\n", symbol); oneval = 0; onecolor = COL_CLEAR; } sprintf(outp, "%ld", oneval); outp += strlen(outp); newval = (value_t *) malloc(sizeof(value_t)); newval->symbol = strdup(symbol); newval->color = onecolor; newval->next = NULL; if (valhead == NULL) { valtail = valhead = newval; } else { valtail->next = newval; valtail = newval; } } *outp = *inp; outp++; symp = NULL; } if (*inp == '\0') done = 1; else inp++; } *outp = '\0'; if (resultexpr) *resultexpr = strdup(expr); dbgprintf("Symbolic '%s' converted to '%s'\n", symbolicexpr, expr); error = 0; result = compute(expr, &error); if (error) { sprintf(errtext, "compute(%s) returned error %d\n", expr, error); if (*errbuf == NULL) { *errbuf = strdup(errtext); } else { *errbuf = (char *)realloc(*errbuf, strlen(*errbuf)+strlen(errtext)+1); strcat(*errbuf, errtext); } } *valuelist = valhead; return result; } static char *printify(char *exp, int cleanexpr) { static char result[MAX_LINE_LEN]; char *inp, *outp; size_t n; if (!cleanexpr) { return exp; } inp = exp; outp = result; while (*inp) { n = strcspn(inp, "|&"); memcpy(outp, inp, n); inp += n; outp += n; if (*inp == '|') { inp++; if (*inp == '|') { inp++; strcpy(outp, " OR "); outp += 4; } else { strcpy(outp, " bOR "); outp += 5; } } else if (*inp == '&') { inp++; if (*inp == '&') { inp++; strcpy(outp, " AND "); outp += 5; } else { strcpy(outp, " bAND "); outp += 6; } } } *outp = '\0'; return result; } int update_combotests(int showeval, int cleanexpr) { testspec_t *t; int pending; int remaining = 0; init_timestamp(); loadtests(); /* * Loop over the tests to allow us "forward refs" in expressions. * We continue for as long as progress is being made. */ remaining = testcount; do { pending = remaining; for (t=testhead; (t); t = t->next) { if (t->result == -1) { t->result = evaluate(t->expression, &t->resultexpr, &t->valuelist, &t->errbuf); if (t->result != -1) remaining--; } } } while (pending != remaining); combo_start(); for (t=testhead; (t); t = t->next) { char msgline[MAX_LINE_LEN]; int color; value_t *vwalk; color = (t->result ? COL_GREEN : COL_RED); init_status(color); sprintf(msgline, "status %s.%s %s %s\n\n", commafy(t->reshostname), ( t->restestname ? t->restestname : "combostatuserror" ), colorname(color), timestamp); addtostatus(msgline); if (t->comment) { addtostatus(t->comment); addtostatus("\n\n"); } if (showeval) { addtostatus(printify(t->expression, cleanexpr)); addtostatus(" = "); addtostatus(printify(t->resultexpr, cleanexpr)); addtostatus(" = "); sprintf(msgline, "%ld\n", t->result); addtostatus(msgline); for (vwalk = t->valuelist; (vwalk); vwalk = vwalk->next) { sprintf(msgline, "&%s %s\n", colorname(vwalk->color), xgetenv("CGIBINURL"), textornull(gethname(vwalk->symbol)), textornull(gettname(vwalk->symbol)), textornull(vwalk->symbol)); addtostatus(msgline); } if (t->errbuf) { addtostatus("\nErrors occurred during evaluation:\n"); addtostatus(t->errbuf); } } finish_status(); } combo_end(); return 0; } int main(int argc, char *argv[]) { int argi; int showeval = 1; int cleanexpr = 0; setup_signalhandler(argv[0]); for (argi = 1; (argi < argc); argi++) { if ((strcmp(argv[argi], "--help") == 0)) { printf("%s version %s\n\n", argv[0], VERSION); printf("Usage:\n%s [--quiet] [--clean] [--debug] [--no-update]\n", argv[0]); exit(0); } else if ((strcmp(argv[argi], "--version") == 0)) { printf("%s version %s\n", argv[0], VERSION); exit(0); } else if ((strcmp(argv[argi], "--debug") == 0)) { debug = 1; } else if ((strcmp(argv[argi], "--no-update") == 0)) { dontsendmessages = 1; } else if ((strcmp(argv[argi], "--quiet") == 0)) { showeval = 0; } else if ((strcmp(argv[argi], "--clean") == 0)) { cleanexpr = 1; } else if ((strncmp(argv[argi], "--error-colors=", 15) == 0)) { char *tok; int newerrorcolors = 0; tok = strtok(strchr(argv[argi], '=')+1, ","); while (tok) { int col = parse_color(tok); if ((col >= 0) && (col <= COL_RED)) newerrorcolors |= (1 << parse_color(tok)); tok = strtok(NULL, ","); } if (newerrorcolors) errorcolors = newerrorcolors; } } return update_combotests(showeval, cleanexpr); } xymon-4.3.28/xymond/convertnk.c0000664000076400007640000000316111615341300016700 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon utility to convert the deprecated NK tags to a critical.cfg */ /* */ /* Copyright (C) 2006-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: convertnk.c 6712 2011-07-31 21:01:52Z storner $"; #include #include #include #include #include "libxymon.h" int main(int argc, char *argv[]) { void *walk; load_hostnames(xgetenv("HOSTSCFG"), NULL, get_fqdn()); for (walk = first_host(); (walk); walk=next_host(walk, 0)) { char *nk, *nktime, *tok; nk = xmh_item(walk, XMH_NK); if (!nk) continue; nktime = xmh_item(walk, XMH_NKTIME); nk = strdup(nk); tok = strtok(nk, ","); while (tok) { char *hostname = xmh_item(walk, XMH_HOSTNAME); char *startstr = "", *endstr = "", *ttgroup = "", *ttextra = "", *updinfo = "Migrated"; int priority = 2; fprintf(stdout, "%s|%s|%s|%s|%s|%d|%s|%s|%s\n", hostname, tok, startstr, endstr, (nktime ? nktime : ""), priority, ttgroup, ttextra, updinfo); tok = strtok(NULL, ","); } xfree(nk); } return 0; } xymon-4.3.28/xymond/client/0000775000076400007640000000000013037531515016011 5ustar rpmbuildrpmbuildxymon-4.3.28/xymond/client/hpux.c0000664000076400007640000000752012654207223017145 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Client backend module for HP-UX */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char hpux_rcsid[] = "$Id: hpux.c 7886 2016-02-02 20:16:19Z jccleaver $"; void handle_hpux_client(char *hostname, char *clienttype, enum ostype_t os, void *hinfo, char *sender, time_t timestamp, char *clientdata) { char *timestr; char *uptimestr; char *clockstr; char *msgcachestr; char *whostr; char *psstr; char *topstr; char *dfstr; char *inodestr; char *memorystr; char *swapinfostr; char *msgsstr; char *netstatstr; char *ifstatstr; char *portsstr; char *vmstatstr; char *p; char fromline[1024]; sprintf(fromline, "\nStatus message received from %s\n", sender); splitmsg(clientdata); timestr = getdata("date"); uptimestr = getdata("uptime"); clockstr = getdata("clock"); msgcachestr = getdata("msgcache"); whostr = getdata("who"); psstr = getdata("ps"); topstr = getdata("top"); dfstr = getdata("df"); inodestr = getdata("inode"); memorystr = getdata("memory"); swapinfostr = getdata("swapinfo"); msgsstr = getdata("msgs"); netstatstr = getdata("netstat"); ifstatstr = getdata("ifstat"); portsstr = getdata("ports"); vmstatstr = getdata("vmstat"); unix_cpu_report(hostname, clienttype, os, hinfo, fromline, timestr, uptimestr, clockstr, msgcachestr, whostr, 0, psstr, 0, topstr); unix_disk_report(hostname, clienttype, os, hinfo, fromline, timestr, "Available", "Capacity", "Mounted", dfstr); unix_inode_report(hostname, clienttype, os, hinfo, fromline, timestr, "ifree", "%iused", "Mounted", inodestr); unix_procs_report(hostname, clienttype, os, hinfo, fromline, timestr, "COMMAND", NULL, psstr); unix_ports_report(hostname, clienttype, os, hinfo, fromline, timestr, 3, 4, 5, portsstr); msgs_report(hostname, clienttype, os, hinfo, fromline, timestr, msgsstr); file_report(hostname, clienttype, os, hinfo, fromline, timestr); linecount_report(hostname, clienttype, os, hinfo, fromline, timestr); deltacount_report(hostname, clienttype, os, hinfo, fromline, timestr); unix_netstat_report(hostname, clienttype, os, hinfo, fromline, timestr, netstatstr); unix_ifstat_report(hostname, clienttype, os, hinfo, fromline, timestr, ifstatstr); unix_vmstat_report(hostname, clienttype, os, hinfo, fromline, timestr, vmstatstr); if (memorystr && swapinfostr) { unsigned long memphystotal, memphysfree, memphysused; unsigned long memswaptotal, memswapfree, memswapused; int found = 0; memphystotal = memphysfree = memphysused = 0; memswaptotal = memswapfree = memswapused = 0; p = strstr(memorystr, "Total:"); if (p) { memphystotal = atol(p+6); found++; } p = strstr(memorystr, "Free:"); if (p) { memphysfree = atol(p+5); found++; } memphysused = memphystotal - memphysfree; p = strstr(swapinfostr, "\ntotal"); if (p && (sscanf(p, "\ntotal %lu %lu %lu", &memswaptotal, &memswapused, &memswapfree) >= 2)) { found++; } if (found == 3) { unix_memory_report(hostname, clienttype, os, hinfo, fromline, timestr, memphystotal, memphysused, -1, -1, memswaptotal, memswapused); } } splitmsg_done(); } xymon-4.3.28/xymond/client/netbsd.c0000664000076400007640000000725312654207223017443 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Client backend module for NetBSD */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char netbsd_rcsid[] = "$Id: netbsd.c 7886 2016-02-02 20:16:19Z jccleaver $"; void handle_netbsd_client(char *hostname, char *clienttype, enum ostype_t os, void *hinfo, char *sender, time_t timestamp, char *clientdata) { char *timestr; char *uptimestr; char *clockstr; char *msgcachestr; char *whostr; char *psstr; char *topstr; char *dfstr; char *meminfostr; char *msgsstr; char *netstatstr; char *ifstatstr; char *portsstr; char *vmstatstr; char *p; char fromline[1024]; sprintf(fromline, "\nStatus message received from %s\n", sender); splitmsg(clientdata); timestr = getdata("date"); uptimestr = getdata("uptime"); clockstr = getdata("clock"); msgcachestr = getdata("msgcache"); whostr = getdata("who"); psstr = getdata("ps"); topstr = getdata("top"); dfstr = getdata("df"); meminfostr = getdata("meminfo"); msgsstr = getdata("msgsstr"); netstatstr = getdata("netstat"); ifstatstr = getdata("ifstat"); portsstr = getdata("ports"); vmstatstr = getdata("vmstat"); unix_cpu_report(hostname, clienttype, os, hinfo, fromline, timestr, uptimestr, clockstr, msgcachestr, whostr, 0, psstr, 0, topstr); unix_disk_report(hostname, clienttype, os, hinfo, fromline, timestr, "Avail", "Capacity", "Mounted", dfstr); unix_procs_report(hostname, clienttype, os, hinfo, fromline, timestr, "COMMAND", NULL, psstr); unix_ports_report(hostname, clienttype, os, hinfo, fromline, timestr, 3, 4, 5, portsstr); msgs_report(hostname, clienttype, os, hinfo, fromline, timestr, msgsstr); file_report(hostname, clienttype, os, hinfo, fromline, timestr); linecount_report(hostname, clienttype, os, hinfo, fromline, timestr); deltacount_report(hostname, clienttype, os, hinfo, fromline, timestr); unix_netstat_report(hostname, clienttype, os, hinfo, fromline, timestr, netstatstr); unix_ifstat_report(hostname, clienttype, os, hinfo, fromline, timestr, ifstatstr); unix_vmstat_report(hostname, clienttype, os, hinfo, fromline, timestr, vmstatstr); if (meminfostr) { unsigned long memphystotal, memphysfree, memphysused; unsigned long memswaptotal, memswapfree, memswapused; int found = 0; memphystotal = memphysfree = memphysused = 0; memswaptotal = memswapfree = memswapused = 0; p = strstr(meminfostr, "Total:"); if (p) { memphystotal = atol(p+6); found++; } p = strstr(meminfostr, "Free:"); if (p) { memphysfree = atol(p+5); found++; } memphysused = memphystotal - memphysfree; p = strstr(meminfostr, "Swaptotal:"); if (p) { memswaptotal = atol(p+10); found++; } p = strstr(meminfostr, "Swapused:"); if (p) { memswapused = atol(p+9); found++; } memswapfree = memswaptotal - memswapused; if (found == 4) { unix_memory_report(hostname, clienttype, os, hinfo, fromline, timestr, memphystotal, memphysused, -1, -1, memswaptotal, memswapused); } } splitmsg_done(); } xymon-4.3.28/xymond/client/darwin.c0000664000076400007640000001024312654207223017441 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Client backend module for Darwin / Mac OS X */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char darwin_rcsid[] = "$Id: darwin.c 7886 2016-02-02 20:16:19Z jccleaver $"; void handle_darwin_client(char *hostname, char *clienttype, enum ostype_t os, void *hinfo, char *sender, time_t timestamp, char *clientdata) { char *timestr; char *uptimestr; char *clockstr; char *msgcachestr; char *whostr; char *psstr; char *topstr; char *dfstr; char *inodestr; char *meminfostr; char *msgsstr; char *netstatstr; char *ifstatstr; char *portsstr; char fromline[1024]; sprintf(fromline, "\nStatus message received from %s\n", sender); splitmsg(clientdata); timestr = getdata("date"); uptimestr = getdata("uptime"); clockstr = getdata("clock"); msgcachestr = getdata("msgcache"); whostr = getdata("who"); psstr = getdata("ps"); topstr = getdata("top"); dfstr = getdata("df"); inodestr = getdata("inode"); meminfostr = getdata("meminfo"); msgsstr = getdata("msgs"); netstatstr = getdata("netstat"); ifstatstr = getdata("ifstat"); portsstr = getdata("ports"); unix_cpu_report(hostname, clienttype, os, hinfo, fromline, timestr, uptimestr, clockstr, msgcachestr, whostr, 0, psstr, 0, topstr); unix_disk_report(hostname, clienttype, os, hinfo, fromline, timestr, "Avail", "Capacity", "Mounted", dfstr); unix_inode_report(hostname, clienttype, os, hinfo, fromline, timestr, "ifree", "%iused", "Mounted", inodestr); unix_procs_report(hostname, clienttype, os, hinfo, fromline, timestr, "COMMAND", NULL, psstr); unix_ports_report(hostname, clienttype, os, hinfo, fromline, timestr, 3, 4, 5, portsstr); msgs_report(hostname, clienttype, os, hinfo, fromline, timestr, msgsstr); file_report(hostname, clienttype, os, hinfo, fromline, timestr); linecount_report(hostname, clienttype, os, hinfo, fromline, timestr); deltacount_report(hostname, clienttype, os, hinfo, fromline, timestr); unix_netstat_report(hostname, clienttype, os, hinfo, fromline, timestr, netstatstr); unix_ifstat_report(hostname, clienttype, os, hinfo, fromline, timestr, ifstatstr); /* No vmstat on Darwin */ if (meminfostr) { unsigned long pagesfree, pagesactive, pagesinactive, pageswireddown, pgsize; char *p; pagesfree = pagesactive = pagesinactive = pageswireddown = pgsize = -1; p = strstr(meminfostr, "page size of"); if (p && (sscanf(p, "page size of %lu bytes", &pgsize) == 1)) pgsize /= 1024; if (pgsize != -1) { p = strstr(meminfostr, "\nPages free:"); if (p) p = strchr(p, ':'); if (p) pagesfree = atol(p+1); p = strstr(meminfostr, "\nPages active:"); if (p) p = strchr(p, ':'); if (p) pagesactive = atol(p+1); p = strstr(meminfostr, "\nPages inactive:"); if (p) p = strchr(p, ':'); if (p) pagesinactive = atol(p+1); p = strstr(meminfostr, "\nPages wired down:"); if (p) p = strchr(p, ':'); if (p) pageswireddown = atol(p+1); if ((pagesfree >= 0) && (pagesactive >= 0) && (pagesinactive >= 0) && (pageswireddown >= 0)) { unsigned long memphystotal, memphysused; memphystotal = (pagesfree+pagesactive+pagesinactive+pageswireddown); memphystotal = memphystotal * pgsize / 1024; memphysused = (pagesactive+pagesinactive+pageswireddown); memphysused = memphysused * pgsize / 1024; unix_memory_report(hostname, clienttype, os, hinfo, fromline, timestr, memphystotal, memphysused, -1, -1, -1, -1); } } } splitmsg_done(); } xymon-4.3.28/xymond/client/bbwin.c0000664000076400007640000004357112654207223017270 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Client backend module for BBWin/Windoes client */ /* */ /* Copyright (C) 2006-2011 Henrik Storner */ /* Copyright (C) 2007-2008 Francois Lacroix */ /* Copyright (C) 2007-2008 Etienne Grignon */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char bbwin_rcsid[] = "$Id: bbwin.c 7886 2016-02-02 20:16:19Z jccleaver $"; static void bbwin_uptime_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *uptimestr) { char *p, *myuptimestr = NULL; float loadyellow, loadred; int recentlimit, ancientlimit, uptimecolor, maxclockdiff, clockdiffcolor; long uptimesecs = -1; int upcolor = COL_GREEN; char msgline[4096]; strbuffer_t *upmsg; if (!want_msgtype(hinfo, MSG_CPU)) return; if (!uptimestr) return; dbgprintf("Uptime check host %s\n", hostname); uptimesecs = 0; /* Parse to check data */ p = strstr(uptimestr, "sec:"); if (p) { p += strcspn(p, "0123456789\r\n"); uptimesecs = atol(p); dbgprintf("uptimestr [%d]\n", uptimesecs); /* DEBUG TODO REMOVE */ } /* Parse to show a nice msg */ myuptimestr = strchr(uptimestr, '\n'); if (myuptimestr) { ++myuptimestr; } get_cpu_thresholds(hinfo, clientclass, &loadyellow, &loadred, &recentlimit, &ancientlimit, &uptimecolor, &maxclockdiff, &clockdiffcolor); dbgprintf("DEBUG recentlimit: [%d] ancienlimit: [%d]\n", recentlimit, ancientlimit); /* DEBUG TODO REMOVE */ upmsg = newstrbuffer(0); if ((uptimesecs != -1) && (recentlimit != -1) && (uptimesecs < recentlimit)) { if (upcolor != COL_RED) upcolor = uptimecolor; sprintf(msgline, "&%s Machine recently rebooted\n", colorname(uptimecolor)); addtobuffer(upmsg, msgline); } if ((uptimesecs != -1) && (ancientlimit != -1) && (uptimesecs > ancientlimit)) { if (upcolor != COL_RED) upcolor = uptimecolor; sprintf(msgline, "&%s Machine has been up more than %d days\n", colorname(uptimecolor), (ancientlimit / 86400)); addtobuffer(upmsg, msgline); } init_status(upcolor); sprintf(msgline, "status %s.uptime %s %s %s\n", commafy(hostname), colorname(upcolor), (timestr ? timestr : ""), ((upcolor == COL_GREEN) ? "OK" : "NOT ok")); addtostatus(msgline); /* And add the info if pb */ if (STRBUFLEN(upmsg)) { addtostrstatus(upmsg); addtostatus("\n"); } /* And add the msg we recevied */ if (myuptimestr) { addtostatus(myuptimestr); addtostatus("\n"); } dbgprintf("msgline %s", msgline); /* DEBUG TODO REMOVE */ if (fromline && !localmode) addtostatus(fromline); finish_status(); freestrbuffer(upmsg); } static void bbwin_cpu_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *cpuutilstr) { char *p, *topstr; float load1, loadyellow, loadred; int recentlimit, ancientlimit, uptimecolor, maxclockdiff, clockdiffcolor; int cpucolor = COL_GREEN; char msgline[4096]; strbuffer_t *cpumsg; if (!want_msgtype(hinfo, MSG_CPU)) return; if (!cpuutilstr) return; dbgprintf("CPU check host %s\n", hostname); load1 = 0; p = strstr(cpuutilstr, "load="); if (p) { p += strcspn(p, "0123456789%\r\n"); load1 = atol(p); dbgprintf("load1 [%d]\n", load1); /* DEBUG TODO REMOVE */ } topstr = strstr(cpuutilstr, "CPU states"); if (topstr) { *(topstr - 1) = '\0'; } get_cpu_thresholds(hinfo, clientclass, &loadyellow, &loadred, &recentlimit, &ancientlimit, &uptimecolor, &maxclockdiff, &clockdiffcolor); dbgprintf("loadyellow: %d, loadred: %d\n", loadyellow, loadred); cpumsg = newstrbuffer(0); if (load1 > loadred) { cpucolor = COL_RED; addtobuffer(cpumsg, "&red Load is CRITICAL\n"); } else if (load1 > loadyellow) { cpucolor = COL_YELLOW; addtobuffer(cpumsg, "&yellow Load is HIGH\n"); } init_status(cpucolor); sprintf(msgline, "status %s.cpu %s %s %s", commafy(hostname), colorname(cpucolor), (timestr ? timestr : ""), cpuutilstr); addtostatus(msgline); /* And add the info if pb */ if (STRBUFLEN(cpumsg)) { addtostrstatus(cpumsg); addtostatus("\n"); } /* And add the msg we recevied */ if (topstr) { addtostatus(topstr); addtostatus("\n"); } dbgprintf("msgline %s", msgline); /* DEBUG TODO REMOVE */ if (fromline && !localmode) addtostatus(fromline); finish_status(); freestrbuffer(cpumsg); } static void bbwin_clock_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *clockstr, char *msgcachestr) { char *myclockstr; int clockcolor = COL_GREEN; float loadyellow, loadred; int recentlimit, ancientlimit, uptimecolor, maxclockdiff, clockdiffcolor; char msgline[4096]; strbuffer_t *clockmsg; if (!want_msgtype(hinfo, MSG_CPU)) return; if (!clockstr) return; dbgprintf("Clock check host %s\n", hostname); clockmsg = newstrbuffer(0); myclockstr = strstr(clockstr, "local"); if (myclockstr) { *(myclockstr - 1) = '\0'; } get_cpu_thresholds(hinfo, clientclass, &loadyellow, &loadred, &recentlimit, &ancientlimit, &uptimecolor, &maxclockdiff, &clockdiffcolor); if (clockstr) { char *p; struct timeval clockval; p = strstr(clockstr, "epoch:"); if (!p) { /* No epoch reported */ } else { struct timeval clockdiff; struct timezone tz; int cachedelay = 0; /* The clock may be reported with a decimal part. But not always */ p += 6; /* Skip "epoch:" */ clockval.tv_sec = atol(p); /* See if there's a decimal part */ p += strspn(p, "0123456789"); if (*p == '.') { p++; clockval.tv_usec = atol(p); } else { clockval.tv_usec = 0; } if (msgcachestr) { /* Message passed through msgcache, so adjust for the cache delay */ p = strstr(msgcachestr, "Cachedelay:"); if (p) cachedelay = atoi(p+11); } gettimeofday(&clockdiff, &tz); clockdiff.tv_sec -= (clockval.tv_sec + cachedelay); clockdiff.tv_usec -= clockval.tv_usec; if (clockdiff.tv_usec < 0) { clockdiff.tv_usec += 1000000; clockdiff.tv_sec -= 1; } if ((maxclockdiff > 0) && (abs(clockdiff.tv_sec) > maxclockdiff)) { if (clockcolor != COL_RED) clockcolor = clockdiffcolor; sprintf(msgline, "&%s System clock is %ld seconds off (max %ld)\n", colorname(clockdiffcolor), (long) clockdiff.tv_sec, (long) maxclockdiff); addtobuffer(clockmsg, msgline); } else { sprintf(msgline, "System clock is %ld seconds off\n", (long) clockdiff.tv_sec); addtobuffer(clockmsg, msgline); } } } init_status(clockcolor); sprintf(msgline, "status %s.timediff %s %s %s\n", commafy(hostname), colorname(clockcolor), (timestr ? timestr : ""), ((clockcolor == COL_GREEN) ? "OK" : "NOT ok")); addtostatus(msgline); /* And add the info if pb */ if (STRBUFLEN(clockmsg)) { addtostrstatus(clockmsg); addtostatus("\n"); } /* And add the msg we recevied */ if (myclockstr) { addtostatus(myclockstr); addtostatus("\n"); } dbgprintf("msgline %s", msgline); /* DEBUG TODO REMOVE */ if (fromline && !localmode) addtostatus(fromline); finish_status(); freestrbuffer(clockmsg); } void bbwin_who_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *whostr) { int whocolor = COL_GREEN; char msgline[4096]; strbuffer_t *whomsg; if (!want_msgtype(hinfo, MSG_WHO)) return; if (!whostr) return; dbgprintf("Who check host %s\n", hostname); whomsg = newstrbuffer(0); init_status(whocolor); sprintf(msgline, "status %s.who %s %s %s\n", commafy(hostname), colorname(whocolor), (timestr ? timestr : ""), ((whocolor == COL_GREEN) ? "OK" : "NOT ok")); addtostatus(msgline); /* And add the info if pb */ if (STRBUFLEN(whomsg)) { addtostrstatus(whomsg); addtostatus("\n"); } /* And add the msg we recevied */ if (whostr) { addtostatus(whostr); addtostatus("\n"); } dbgprintf("msgline %s", msgline); /* DEBUG TODO REMOVE */ if (fromline && !localmode) addtostatus(fromline); finish_status(); freestrbuffer(whomsg); } void bbwin_svcs_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, int namecol, int startupcol, int statecol, char *svcstr, char *svcauto) { int svccolor = -1; int schecks; char msgline[4096]; static strbuffer_t *monmsg = NULL; char *group; if (!want_msgtype(hinfo, MSG_SVCS)) return; if (!svcstr) return; if (!monmsg) monmsg = newstrbuffer(0); dbgprintf("Services check host %s\n", hostname); clearalertgroups(); schecks = clear_svc_counts(hinfo, clientclass); dbgprintf("schecks: [%d]\n", schecks); /* DEBUG TODO REMOVE */ if (schecks > 0) { /* Count how many instances of each monitored condition are found */ char *sname, *bol, *nl; int scount, scolor; char *namestr, *startupstr, *statestr; bol = svcstr; while (bol) { char *p; nl = strchr(bol, '\n'); if (nl) *nl = '\0'; /* Data lines */ p = strdup(bol); namestr = getcolumn(p, namecol); strcpy(p, bol); startupstr = getcolumn(p, startupcol); strcpy(p, bol); statestr = getcolumn(p, statecol); add_svc_count(namestr, startupstr, statestr); xfree(p); if (nl) { *nl = '\n'; bol = nl+1; } else bol = NULL; } /* Check the status and state found for each monitored svc */ while ((sname = check_svc_count(&scount, &scolor, &group)) != NULL) { if (scolor > svccolor) svccolor = scolor; if (scolor == COL_GREEN) { sprintf(msgline, "&green %s\n", sname); addtobuffer(monmsg, msgline); } else { sprintf(msgline, "&%s %s\n", colorname(scolor), sname); addtobuffer(monmsg, msgline); addalertgroup(group); } } } if ((svccolor == -1) && sendclearsvcs) { /* Nothing to check */ addtobuffer(monmsg, "No Services checks defined\n"); svccolor = noreportcolor; } if (svccolor != -1) { if (svcauto && strlen(svcauto) > 1 && (svccolor == COL_GREEN || svccolor == noreportcolor)) svccolor = COL_YELLOW; /* Now we know the result, so generate a status message */ init_status(svccolor); group = getalertgroups(); if (group) sprintf(msgline, "status/group:%s ", group); else strcpy(msgline, "status "); addtostatus(msgline); sprintf(msgline, "%s.svcs %s %s - Services %s\n", commafy(hostname), colorname(svccolor), (timestr ? timestr : ""), ((svccolor == COL_GREEN) ? "OK" : "NOT ok")); addtostatus(msgline); /* And add the info about what's wrong */ addtostrstatus(monmsg); addtostatus("\n"); clearstrbuffer(monmsg); /* Add AutoRestart status */ if (svcauto && strlen(svcauto) > 1) { addtostatus(svcauto); addtostatus("\n\n"); } /* And the full svc output for those who want it */ if (svclistinsvcs) addtostatus(svcstr); if (fromline) addtostatus(fromline); finish_status(); } else { clearstrbuffer(monmsg); } } void handle_win32_bbwin_client(char *hostname, char *clienttype, enum ostype_t os, void *hinfo, char *sender, time_t timestamp, char *clientdata) { char *timestr; char *cpuutilstr; char *uptimestr; char *clockstr; char *msgcachestr; char *diskstr; char *procsstr; char *msgsstr; char *portsstr; char *memorystr; char *netstatstr; char *ifstatstr; char *svcstr; char *svcauto; char *whostr; char fromline[1024]; sprintf(fromline, "\nStatus message received from %s\n", sender); splitmsg(clientdata); /* Get all data by section timestr is the date time for all status */ timestr = getdata("date"); if (!timestr) return; uptimestr = getdata("uptime"); clockstr = getdata("clock"); msgcachestr = getdata("msgcache"); /* TODO check when it is usefull */ cpuutilstr = getdata("cpu"); procsstr = getdata("procs"); diskstr = getdata("disk"); portsstr = getdata("ports"); memorystr = getdata("memory"); msgsstr = getdata("msg"); netstatstr = getdata("netstat"); ifstatstr = getdata("ifstat"); svcstr = getdata("svcs"); svcauto = getdata("svcautorestart"); whostr = getdata("who"); bbwin_uptime_report(hostname, clienttype, os, hinfo, fromline, timestr, uptimestr); bbwin_clock_report(hostname, clienttype, os, hinfo, fromline, timestr, clockstr, msgcachestr); bbwin_cpu_report(hostname, clienttype, os, hinfo, fromline, timestr, cpuutilstr); unix_procs_report(hostname, clienttype, os, hinfo, fromline, timestr, "Name", NULL, procsstr); unix_ports_report(hostname, clienttype, os, hinfo, fromline, timestr, 1, 2, 3, portsstr); unix_disk_report(hostname, clienttype, os, hinfo, fromline, timestr, "Avail", "Capacity", "Filesystem", diskstr); bbwin_svcs_report(hostname, clienttype, os, hinfo, fromline, timestr, 0, 1, 2, svcstr, svcauto); bbwin_who_report(hostname, clienttype, os, hinfo, fromline, timestr, whostr); msgs_report(hostname, clienttype, os, hinfo, fromline, timestr, msgsstr); file_report(hostname, clienttype, os, hinfo, fromline, timestr); linecount_report(hostname, clienttype, os, hinfo, fromline, timestr); deltacount_report(hostname, clienttype, os, hinfo, fromline, timestr); /* Data status */ unix_netstat_report(hostname, clienttype, os, hinfo, fromline, timestr, netstatstr); unix_ifstat_report(hostname, clienttype, os, hinfo, fromline, timestr, ifstatstr); if (memorystr) { char *p; long memphystotal, memphysused, memactused, memacttotal, memswaptotal, memswapused; memphystotal = memswaptotal = memphysused = memswapused = memactused = memacttotal = -1; p = strstr(memorystr, "\nphysical:"); if (p) sscanf(p, "\nphysical: %ld %ld", &memphystotal, &memphysused); p = strstr(memorystr, "\npage:"); if (p) sscanf(p, "\npage: %ld %ld", &memswaptotal, &memswapused); p = strstr(memorystr, "\nvirtual:"); if (p) sscanf(p, "\nvirtual: %ld %ld", &memacttotal, &memactused); dbgprintf("DEBUG Memory %ld %ld %ld %ld %ld %ld\n", memphystotal, memphysused, memacttotal, memactused, memswaptotal, memswapused); /* DEBUG TODO Remove*/ unix_memory_report(hostname, clienttype, os, hinfo, fromline, timestr, memphystotal, memphysused, memacttotal, memactused, memswaptotal, memswapused); } splitmsg_done(); } xymon-4.3.28/xymond/client/linux.c0000664000076400007640000002042312654207223017315 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Client backend module for Linux */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char linux_rcsid[] = "$Id: linux.c 7886 2016-02-02 20:16:19Z jccleaver $"; void handle_linux_client(char *hostname, char *clienttype, enum ostype_t os, void *hinfo, char *sender, time_t timestamp, char *clientdata) { char *timestr; char *uptimestr; char *clockstr; char *msgcachestr; char *whostr; char *psstr; char *topstr; char *dfstr; char *inodestr; char *freestr; char *msgsstr; char *netstatstr; char *vmstatstr; char *ifstatstr; char *portsstr; char *mdstatstr; char fromline[1024]; sprintf(fromline, "\nStatus message received from %s\n", sender); splitmsg(clientdata); timestr = getdata("date"); uptimestr = getdata("uptime"); clockstr = getdata("clock"); msgcachestr = getdata("msgcache"); whostr = getdata("who"); psstr = getdata("ps"); topstr = getdata("top"); dfstr = getdata("df"); inodestr = getdata("inode"); freestr = getdata("free"); msgsstr = getdata("msgs"); netstatstr = getdata("netstat"); ifstatstr = getdata("ifstat"); vmstatstr = getdata("vmstat"); portsstr = getdata("ports"); mdstatstr = getdata("mdstat"); unix_cpu_report(hostname, clienttype, os, hinfo, fromline, timestr, uptimestr, clockstr, msgcachestr, whostr, 0, psstr, 0, topstr); unix_disk_report(hostname, clienttype, os, hinfo, fromline, timestr, "Available", "Capacity", "Mounted", dfstr); unix_inode_report(hostname, clienttype, os, hinfo, fromline, timestr, "IFree", "IUse%", "Mounted", inodestr); unix_procs_report(hostname, clienttype, os, hinfo, fromline, timestr, "CMD", NULL, psstr); unix_ports_report(hostname, clienttype, os, hinfo, fromline, timestr, 3, 4, 5, portsstr); msgs_report(hostname, clienttype, os, hinfo, fromline, timestr, msgsstr); file_report(hostname, clienttype, os, hinfo, fromline, timestr); linecount_report(hostname, clienttype, os, hinfo, fromline, timestr); deltacount_report(hostname, clienttype, os, hinfo, fromline, timestr); unix_netstat_report(hostname, clienttype, os, hinfo, fromline, timestr, netstatstr); unix_ifstat_report(hostname, clienttype, os, hinfo, fromline, timestr, ifstatstr); unix_vmstat_report(hostname, clienttype, os, hinfo, fromline, timestr, vmstatstr); /* * Sigh. Recent kernels + procps-ng change things up a bit. If 'available' is present * (roughly, 3.14+ and 2.6.27+, but depends on the vendor), then we'll use the inverse of that: * (Physical - Available = ACTUALUSED) * Otherwise, it's: * (Physical Used - (buffers + cached) = ACTUALUSED) * * See discussions at http://lists.xymon.com/pipermail/xymon/2015-April/041628.html * If the legacy meminfo display is NOT used, we should get the old format still * */ if (freestr) { char *p; long memphystotal, memphysused, memphysfree, memacttotal, memactused, memactfree, memswaptotal, memswapused, memswapfree; memphystotal = memswaptotal = memphysused = memswapused = memacttotal = memactused = memactfree = -1; /* check for old style */ p = strstr(freestr, "\n-/+ buffers/cache:"); if (p) { p = strstr(freestr, "\nMem:"); if (p && (sscanf(p, "\nMem: %ld %ld %ld", &memphystotal, &memphysused, &memphysfree) == 3)) { memphystotal /= 1024; memphysused /= 1024; memphysfree /= 1024; } p = strstr(freestr, "\n-/+ buffers/cache:"); if (sscanf(p, "\n-/+ buffers/cache: %ld %ld", &memactused, &memactfree) == 2) { memacttotal = memphystotal; memactused /= 1024; memactfree /= 1024; } } /* check for new style */ else if (strstr(freestr, "available\n")) { long shared, buffcache; p = strstr(freestr, "\nMem:"); if (p && (sscanf(p, "\nMem: %ld %ld %ld %ld %ld %ld", &memphystotal, &memphysused, &memphysfree, &shared, &buffcache, &memactfree) == 6)) { memphystotal /= 1024; memphysused /= 1024; memphysfree /= 1024; /* Provide a Physical Used value that's compatible with previous thresholds. However, use the */ /* new 'Available' line as the basis for "Actual Used", since it'll be more accurate. */ memacttotal = memphystotal; memactfree /= 1024; memactused = memacttotal - memactfree; if (memactused < 0) memactused = 0; memphysused += (buffcache / 1024); } } else errprintf(" -> No readable memory data for %s in freestr\n", hostname); /* There's always a swap line */ p = strstr(freestr, "\nSwap:"); if (p && (sscanf(p, "\nSwap: %ld %ld %ld", &memswaptotal, &memswapused, &memswapfree) == 3)) { memswaptotal /= 1024; memswapused /= 1024; memswapfree /= 1024; } unix_memory_report(hostname, clienttype, os, hinfo, fromline, timestr, memphystotal, memphysused, memacttotal, memactused, memswaptotal, memswapused); } if (mdstatstr) { char *statcopy, *bol, *eol; int color = COL_GREEN; char *mdname = NULL, *mdstatus = NULL; int mddevices = 0, mdactive = 0, recovering = 0; strbuffer_t *alerttext = newstrbuffer(0); char msgline[1024]; char *summary = NULL; int arraycount = 0; statcopy = (char *)malloc(strlen(mdstatstr) + 10); sprintf(statcopy, "%s\nmd999\n", mdstatstr); bol = statcopy; while (bol) { eol = strchr(bol, '\n'); if (eol) *eol = '\0'; if ((strncmp(bol, "md", 2) == 0) && (isdigit(*(bol+2)))) { char *tok; if (mdname && (mddevices >= 0) && (mdactive >= 0)) { int onecolor = COL_GREEN; /* Got a full md device status, flush it before we start on the next one */ arraycount++; if (mddevices != mdactive) { if (!recovering) { onecolor = COL_RED; snprintf(msgline, sizeof(msgline), "&red %s : Disk failure in array : %d devices of %d active\n", mdname, mdactive, mddevices); addtobuffer(alerttext, msgline); summary = "failure"; } else { onecolor = COL_YELLOW; snprintf(msgline, sizeof(msgline), "&yellow %s status %s : %d devices of %d active\n", mdname, mdstatus, mdactive, mddevices); addtobuffer(alerttext, msgline); if (!summary) summary = "recovering"; } } else { snprintf(msgline, sizeof(msgline), "&green %s : %d devices of %d active\n", mdname, mdactive, mddevices); addtobuffer(alerttext, msgline); } if (onecolor > color) { color = onecolor; } } /* First line, holds the name of the array and the active/inactive status */ mddevices = mdactive = -1; recovering = 0; mdname = strtok(bol, " "); tok = strtok(NULL, " "); // Skip the ':' mdstatus = strtok(NULL, " "); } if (mdname && ((mddevices == -1) && (mdactive == -1)) && (strchr(bol, '/'))) { char *p = strchr(bol, '/'); /* Second line: Holds the number of configured/active devices */ mdactive = atoi(p+1); while ((p > bol) && (isdigit(*(p-1)))) p--; mddevices = atoi(p); } if (mdname && (mddevices != mdactive) && strstr(bol, "recovery = ")) { /* Third line: Only present during recovery */ mdstatus = "recovery in progress"; recovering = 1; } bol = (eol ? eol+1 : NULL); } if (arraycount > 0) { init_status(color); sprintf(msgline, "status %s.raid %s %s - RAID %s\n\n", commafy(hostname), colorname(color), (timestr ? timestr : ""), (summary ? summary : "OK")); addtostatus(msgline); if (STRBUFLEN(alerttext) > 0) { addtostrstatus(alerttext); addtostatus("\n\n"); } addtostatus("============================ /proc/mdstat ===========================\n\n"); addtostatus(mdstatstr); finish_status(); } xfree(statcopy); freestrbuffer(alerttext); } splitmsg_done(); } xymon-4.3.28/xymond/client/freebsd.c0000664000076400007640000001111712654207223017570 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Client backend module for FreeBSD */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char freebsd_rcsid[] = "$Id: freebsd.c 7886 2016-02-02 20:16:19Z jccleaver $"; void handle_freebsd_client(char *hostname, char *clienttype, enum ostype_t os, void *hinfo, char *sender, time_t timestamp, char *clientdata) { char *timestr; char *uptimestr; char *clockstr; char *msgcachestr; char *whostr; char *psstr; char *topstr; char *dfstr; char *inodestr; char *meminfostr; char *swapinfostr; char *vmtotalstr; char *msgsstr; char *netstatstr; char *ifstatstr; char *portsstr; char *vmstatstr; char *p; char fromline[1024]; unsigned long memphystotal = 0, memphysfree = 0, memphysused = 0, memphysactual = -1; unsigned long memswaptotal = 0, memswapfree = 0, memswapused = 0; int found = 0; sprintf(fromline, "\nStatus message received from %s\n", sender); splitmsg(clientdata); timestr = getdata("date"); uptimestr = getdata("uptime"); clockstr = getdata("clock"); msgcachestr = getdata("msgcache"); whostr = getdata("who"); psstr = getdata("ps"); topstr = getdata("top"); dfstr = getdata("df"); inodestr = getdata("inode"); meminfostr = getdata("meminfo"); swapinfostr = getdata("swapinfo"); msgsstr = getdata("msgs"); netstatstr = getdata("netstat"); ifstatstr = getdata("ifstat"); portsstr = getdata("ports"); vmstatstr = getdata("vmstat"); vmtotalstr = getdata("vmtotal"); unix_cpu_report(hostname, clienttype, os, hinfo, fromline, timestr, uptimestr, clockstr, msgcachestr, whostr, 0, psstr, 0, topstr); unix_disk_report(hostname, clienttype, os, hinfo, fromline, timestr, "Avail", "Capacity", "Mounted", dfstr); unix_inode_report(hostname, clienttype, os, hinfo, fromline, timestr, "ifree", "%iused", "Mounted", inodestr); unix_procs_report(hostname, clienttype, os, hinfo, fromline, timestr, "COMMAND", NULL, psstr); unix_ports_report(hostname, clienttype, os, hinfo, fromline, timestr, 3, 4, 5, portsstr); msgs_report(hostname, clienttype, os, hinfo, fromline, timestr, msgsstr); file_report(hostname, clienttype, os, hinfo, fromline, timestr); linecount_report(hostname, clienttype, os, hinfo, fromline, timestr); deltacount_report(hostname, clienttype, os, hinfo, fromline, timestr); unix_netstat_report(hostname, clienttype, os, hinfo, fromline, timestr, netstatstr); unix_ifstat_report(hostname, clienttype, os, hinfo, fromline, timestr, ifstatstr); unix_vmstat_report(hostname, clienttype, os, hinfo, fromline, timestr, vmstatstr); if (meminfostr) { p = strstr(meminfostr, "Total:"); if (p) { memphystotal = atol(p+6); found++; } p = strstr(meminfostr, "Actual:"); if (p) memphysactual = atol(p+7); } if (vmtotalstr) { p = strstr(vmtotalstr, "\nFree Memory Pages:"); if (p) { memphysfree = atol(p + 19)/1024; memphysused = memphystotal - memphysfree; found++; } else { p = strstr(vmtotalstr, "\nFree Memory:"); if (p) { memphysfree = atol(p + 13)/1024; memphysused = memphystotal - memphysfree; found++; } } } if ((found == 1) && meminfostr) { p = strstr(meminfostr, "Free:"); if (p) { memphysfree = atol(p+5); found++; } memphysused = memphystotal - memphysfree; } if (swapinfostr) { found++; p = strchr(swapinfostr, '\n'); /* Skip the header line */ while (p) { long stot, sused, sfree; char *bol; bol = p+1; p = strchr(bol, '\n'); if (p) *p = '\0'; if (sscanf(bol, "%*s %ld %ld %ld", &stot, &sused, &sfree) == 3) { memswaptotal += stot; memswapused += sused; memswapfree += sfree; } if (p) *p = '\n'; } memswaptotal /= 1024; memswapused /= 1024; memswapfree /= 1024; } if (found >= 2) { unix_memory_report(hostname, clienttype, os, hinfo, fromline, timestr, memphystotal, memphysused, memphystotal, memphysactual, memswaptotal, memswapused); } splitmsg_done(); } xymon-4.3.28/xymond/client/powershell.c0000664000076400007640000000245611615341300020337 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Client backend module for the Windows Powershell client */ /* */ /* Copyright (C) 2010-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char powershell_rcsid[] = "$Id: powershell.c 6712 2011-07-31 21:01:52Z storner $"; void handle_powershell_client(char *hostname, char *clienttype, enum ostype_t os, void *hinfo, char *sender, time_t timestamp, char *clientdata) { /* At the moment, the Powershell client just uses the same handling as the BBWin client */ handle_win32_bbwin_client(hostname, clienttype, os, hinfo, sender, timestamp, clientdata); } xymon-4.3.28/xymond/client/zos.c0000664000076400007640000006075312503303630016773 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Client backend module for z/VSE, VSE/ESA and z/OS */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* Copyright (C) 2006-2009 Rich Smrcina */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char zos_rcsid[] = "$Id: zos.c 7608 2015-03-21 15:00:40Z jccleaver $"; void zos_cpu_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *cpuutilstr, char *uptimestr) { char *p; float load1, loadyellow, loadred; int recentlimit, ancientlimit, uptimecolor, maxclockdiff, clockdiffcolor; int uphour, upmin; char loadresult[100]; char myupstr[100]; long uptimesecs = -1; long upday; int cpucolor = COL_GREEN; char msgline[4096]; strbuffer_t *upmsg; if (!want_msgtype(hinfo, MSG_CPU)) return; if (!uptimestr) return; if (!cpuutilstr) return; uptimesecs = 0; /* * z/OS: "Uptime: 1 Days, 13 Hours, 38 Minutes" */ sscanf(uptimestr,"Uptime: %ld Days, %d Hours, %d Minutes", &upday, &uphour, &upmin); uptimesecs = upday * 86400; uptimesecs += 60*(60*uphour + upmin); sprintf(myupstr, "%s\n", uptimestr); /* * Looking for average CPU Utilization in CPU message * CPU Utilization=000% */ *loadresult = '\0'; p = strstr(cpuutilstr, "CPU Utilization ") + 16 ; if (p) { if (sscanf(p, "%f%%", &load1) == 1) { sprintf(loadresult, "z/OS CPU Utilization %3.0f%%\n", load1); } } get_cpu_thresholds(hinfo, clientclass, &loadyellow, &loadred, &recentlimit, &ancientlimit, &uptimecolor, &maxclockdiff, &clockdiffcolor); upmsg = newstrbuffer(0); if (load1 > loadred) { cpucolor = COL_RED; addtobuffer(upmsg, "&red Load is CRITICAL\n"); } else if (load1 > loadyellow) { cpucolor = COL_YELLOW; addtobuffer(upmsg, "&yellow Load is HIGH\n"); } if ((uptimesecs != -1) && (recentlimit != -1) && (uptimesecs < recentlimit)) { if (cpucolor != COL_RED) cpucolor = uptimecolor; sprintf(msgline, "&%s Machine recently rebooted\n", colorname(uptimecolor)); addtobuffer(upmsg, msgline); } if ((uptimesecs != -1) && (ancientlimit != -1) && (uptimesecs > ancientlimit)) { if (cpucolor != COL_RED) cpucolor = uptimecolor; sprintf(msgline, "&%s Machine has been up more than %d days\n", colorname(uptimecolor), (ancientlimit / 86400)); addtobuffer(upmsg, msgline); } init_status(cpucolor); sprintf(msgline, "status %s.cpu %s %s %s %s %s\n", commafy(hostname), colorname(cpucolor), (timestr ? timestr : ""), loadresult, myupstr, cpuutilstr); addtostatus(msgline); if (STRBUFLEN(upmsg)) { addtostrstatus(upmsg); addtostatus("\n"); } if (fromline && !localmode) addtostatus(fromline); finish_status(); freestrbuffer(upmsg); } void zos_paging_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *pagingstr) { char *p; int ipagerate, pagingyellow, pagingred; float fpagerate=0.0; char pagingresult[100]; int pagingcolor = COL_GREEN; char msgline[4096]; strbuffer_t *upmsg; if (!pagingstr) return; /* * Looking for Paging rate in message * Paging Rate=0 */ *pagingresult = '\0'; ipagerate=0; p = strstr(pagingstr, "Paging Rate ") + 12; if (p) { if (sscanf(p, "%f", &fpagerate) == 1) { ipagerate=fpagerate + 0.5; /* Rounding up */ sprintf(pagingresult, "z/OS Paging Rate %d per second\n", ipagerate); } } else sprintf(pagingresult, "Can not find page rate value in:\n%s\n", pagingstr); get_paging_thresholds(hinfo, clientclass, &pagingyellow, &pagingred); upmsg = newstrbuffer(0); if (ipagerate > pagingred) { pagingcolor = COL_RED; addtobuffer(upmsg, "&red Paging Rate is CRITICAL\n"); } else if (ipagerate > pagingyellow) { pagingcolor = COL_YELLOW; addtobuffer(upmsg, "&yellow Paging Rate is HIGH\n"); } init_status(pagingcolor); sprintf(msgline, "status %s.paging %s %s %s %s\n", commafy(hostname), colorname(pagingcolor), (timestr ? timestr : ""), pagingresult, pagingstr); addtostatus(msgline); if (STRBUFLEN(upmsg)) { addtostrstatus(upmsg); addtostatus("\n"); } if (fromline && !localmode) addtostatus(fromline); finish_status(); freestrbuffer(upmsg); } void zos_memory_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *memstr) { char *p; char headstr[100], csastr[100], ecsastr[100], sqastr[100], esqastr[100]; long csaalloc, csaused, csahwm, ecsaalloc, ecsaused, ecsahwm; long sqaalloc, sqaused, sqahwm, esqaalloc, esqaused, esqahwm; float csautil, ecsautil, sqautil, esqautil; int csayellow, csared, ecsayellow, ecsared, sqayellow, sqared, esqayellow, esqared; int memcolor = COL_GREEN; char msgline[4096]; strbuffer_t *upmsg; if (!memstr) return; /* * Looking for memory eyecatchers in message */ p = strstr(memstr, "CSA ") + 4; if (p) { sscanf(p, "%ld %ld %ld", &csaalloc, &csaused, &csahwm); } p = strstr(memstr, "ECSA ") + 5; if (p) { sscanf(p, "%ld %ld %ld", &ecsaalloc, &ecsaused, &ecsahwm); } p = strstr(memstr, "SQA ") + 4; if (p) { sscanf(p, "%ld %ld %ld", &sqaalloc, &sqaused, &sqahwm); } p = strstr(memstr, "ESQA ") + 5; if (p) { sscanf(p, "%ld %ld %ld", &esqaalloc, &esqaused, &esqahwm); } csautil = ((float)csaused / (float)csaalloc) * 100; ecsautil = ((float)ecsaused / (float)ecsaalloc) * 100; sqautil = ((float)sqaused / (float)sqaalloc) * 100; esqautil = ((float)esqaused / (float)esqaalloc) * 100; get_zos_memory_thresholds(hinfo, clientclass, &csayellow, &csared, &ecsayellow, &ecsared, &sqayellow, &sqared, &esqayellow, &esqared); upmsg = newstrbuffer(0); if (csautil > csared) { if (memcolor < COL_RED) memcolor = COL_RED; addtobuffer(upmsg, "&red CSA Utilization is CRITICAL\n"); } else if (csautil > csayellow) { if (memcolor < COL_YELLOW) memcolor = COL_YELLOW; addtobuffer(upmsg, "&yellow CSA Utilization is HIGH\n"); } if (ecsautil > ecsared) { if (memcolor < COL_RED) memcolor = COL_RED; addtobuffer(upmsg, "&red ECSA Utilization is CRITICAL\n"); } else if (ecsautil > ecsayellow) { if (memcolor < COL_YELLOW) memcolor = COL_YELLOW; addtobuffer(upmsg, "&yellow ECSA Utilization is HIGH\n"); } if (sqautil > sqared) { if (memcolor < COL_RED) memcolor = COL_RED; addtobuffer(upmsg, "&red SQA Utilization is CRITICAL\n"); } else if (sqautil > sqayellow) { if (memcolor < COL_YELLOW) memcolor = COL_YELLOW; addtobuffer(upmsg, "&yellow SQA Utilization is HIGH\n"); } if (esqautil > esqared) { if (memcolor < COL_RED) memcolor = COL_RED; addtobuffer(upmsg, "&red ESQA Utilization is CRITICAL\n"); } else if (esqautil > esqayellow) { if (memcolor < COL_YELLOW) memcolor = COL_YELLOW; addtobuffer(upmsg, "&yellow ESQA Utilization is HIGH\n"); } *headstr = '\0'; *csastr = '\0'; *ecsastr = '\0'; *sqastr = '\0'; *esqastr = '\0'; strcpy(headstr, "z/OS Memory Map\n Area Alloc Used HWM Util%\n"); sprintf(csastr, "CSA %8ld %8ld %8ld %3.1f\n", csaalloc, csaused, csahwm, csautil); sprintf(ecsastr, "ECSA %8ld %8ld %8ld %3.1f\n", ecsaalloc, ecsaused, ecsahwm, ecsautil); sprintf(sqastr, "SQA %8ld %8ld %8ld %3.1f\n", sqaalloc, sqaused, sqahwm, sqautil); sprintf(esqastr, "ESQA %8ld %8ld %8ld %3.1f\n", esqaalloc, esqaused, esqahwm, esqautil); init_status(memcolor); sprintf(msgline, "status %s.memory %s %s\n%s %s %s %s %s", commafy(hostname), colorname(memcolor), (timestr ? timestr : ""), headstr, csastr, ecsastr, sqastr, esqastr); addtostatus(msgline); if (STRBUFLEN(upmsg)) { addtostrstatus(upmsg); addtostatus("\n"); } if (fromline && !localmode) addtostatus(fromline); finish_status(); freestrbuffer(upmsg); } static void zos_cics_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *cicsstr) { char cicsappl[9], cicsdate[11], cicstime[9]; int numtrans=0, cicsok=1; float dsapct=0.0; float edsapct=0.0; char cicsresult[100]; char tempresult[100]; char *cicsentry = NULL; int cicscolor = COL_GREEN; int dsayel, dsared, edsayel, edsared; char msgline[4096]; char cicsokmsg[]="All CICS Systems OK"; char cicsnotokmsg[]="One or more CICS Systems not OK"; strbuffer_t *headline; strbuffer_t *upmsg; strbuffer_t *cicsmsg; if (!cicsstr) return; cicsmsg = newstrbuffer(0); upmsg = newstrbuffer(0); headline= newstrbuffer(0); addtobuffer(headline, "Appl ID Trans DSA Pct EDSA Pct\n"); /* * * Each CICS system reporting uses one line in the message, the format is: * applid date time numtrans dsapct edsapct * applid is the CICS application id * date and time are the date and time of the report * numtrans is the number of transactions that were executed in CICS since the last report * dsapct is the DSA utilization percentage * edsapct is the EDSA utilization percentage * */ if (cicsstr) { cicsentry=strtok(cicsstr, "\n"); while (cicsentry != NULL) { sscanf(cicsentry, "%8s %10s %8s %d %f %f", cicsappl, cicsdate, cicstime, &numtrans, &dsapct, &edsapct); sprintf(cicsresult,"%-8s %6d %3.1f %3.1f\n", cicsappl, numtrans, dsapct, edsapct); addtobuffer(cicsmsg, cicsresult); if (numtrans == -1 ) { if (cicscolor < COL_YELLOW) cicscolor = COL_YELLOW; cicsok=0; sprintf(tempresult,"&yellow CICS system %s not responding, removed\n", cicsappl); addtobuffer(upmsg, tempresult); } /* Get CICS thresholds for this application ID. */ get_cics_thresholds(hinfo, clientclass, cicsappl, &dsayel, &dsared, &edsayel, &edsared); /* The threshold of the DSA values for each CICS must be checked in this loop. */ if (dsapct > dsared) { if (cicscolor < COL_RED) cicscolor = COL_RED; cicsok=0; sprintf(tempresult,"&red %s DSA Utilization is CRITICAL\n", cicsappl); addtobuffer(upmsg, tempresult); } else if (dsapct > dsayel) { if (cicscolor < COL_YELLOW) cicscolor = COL_YELLOW; cicsok=0; sprintf(tempresult,"&yellow %s DSA Utilization is HIGH\n", cicsappl); addtobuffer(upmsg, tempresult); } if (edsapct > edsared) { if (cicscolor < COL_RED) cicscolor = COL_RED; cicsok=0; sprintf(tempresult,"&red %s EDSA Utilization is CRITICAL\n", cicsappl); addtobuffer(upmsg, tempresult); } else if (edsapct > edsayel) { if (cicscolor < COL_YELLOW) cicscolor = COL_YELLOW; cicsok=0; sprintf(tempresult,"&yellow %s EDSA Utilization is HIGH\n", cicsappl); addtobuffer(upmsg, tempresult); } init_status(cicscolor); cicsentry=strtok(NULL, "\n"); } } sprintf(msgline, "status %s.cics %s %s %s\n", commafy(hostname), colorname(cicscolor), (timestr ? timestr : ""), ( (cicsok==1) ? cicsokmsg : cicsnotokmsg) ); addtostatus(msgline); if (STRBUFLEN(upmsg)) { addtostrstatus(upmsg); } if (STRBUFLEN(cicsmsg)) { addtostrstatus(headline); addtostrstatus(cicsmsg); addtostatus("\n"); } if (fromline && !localmode) addtostatus(fromline); finish_status(); freestrbuffer(headline); freestrbuffer(upmsg); freestrbuffer(cicsmsg); } void zos_jobs_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *psstr) { int pscolor = COL_GREEN; int pchecks; int cmdofs = -1; char msgline[4096]; strbuffer_t *monmsg; static strbuffer_t *countdata = NULL; int anycountdata = 0; char *group; if (!want_msgtype(hinfo, MSG_PROCS)) return; if (!psstr) return; if (!countdata) countdata = newstrbuffer(0); clearalertgroups(); monmsg = newstrbuffer(0); sprintf(msgline, "data %s.proccounts\n", commafy(hostname)); addtobuffer(countdata, msgline); cmdofs = 0; /* Command offset for z/OS isn't necessary */ pchecks = clear_process_counts(hinfo, clientclass); if (pchecks == 0) { /* Nothing to check */ sprintf(msgline, "&%s No process checks defined\n", colorname(noreportcolor)); addtobuffer(monmsg, msgline); pscolor = noreportcolor; } else if (cmdofs >= 0) { /* Count how many instances of each monitored process is running */ char *pname, *pid, *bol, *nl; int pcount, pmin, pmax, pcolor, ptrack; bol = psstr; while (bol) { nl = strchr(bol, '\n'); /* Take care - the ps output line may be shorter than what we look at */ if (nl) { *nl = '\0'; if ((nl-bol) > cmdofs) add_process_count(bol+cmdofs); *nl = '\n'; bol = nl+1; } else { if (strlen(bol) > cmdofs) add_process_count(bol+cmdofs); bol = NULL; } } /* Check the number found for each monitored process */ while ((pname = check_process_count(&pcount, &pmin, &pmax, &pcolor, &pid, &ptrack, &group)) != NULL) { char limtxt[1024]; if (pmax == -1) { if (pmin > 0) sprintf(limtxt, "%d or more", pmin); else if (pmin == 0) sprintf(limtxt, "none"); } else { if (pmin > 0) sprintf(limtxt, "between %d and %d", pmin, pmax); else if (pmin == 0) sprintf(limtxt, "at most %d", pmax); } if (pcolor == COL_GREEN) { sprintf(msgline, "&green %s (found %d, req. %s)\n", pname, pcount, limtxt); addtobuffer(monmsg, msgline); } else { if (pcolor > pscolor) pscolor = pcolor; sprintf(msgline, "&%s %s (found %d, req. %s)\n", colorname(pcolor), pname, pcount, limtxt); addtobuffer(monmsg, msgline); addalertgroup(group); } if (ptrack) { /* Save the count data for later DATA message to track process counts */ if (!pid) pid = "default"; sprintf(msgline, "%s:%u\n", pid, pcount); addtobuffer(countdata, msgline); anycountdata = 1; } } } else { pscolor = COL_YELLOW; sprintf(msgline, "&yellow Expected string not found in ps output header\n"); addtobuffer(monmsg, msgline); } /* Now we know the result, so generate a status message */ init_status(pscolor); group = getalertgroups(); if (group) sprintf(msgline, "status/group:%s ", group); else strcpy(msgline, "status "); addtostatus(msgline); sprintf(msgline, "%s.procs %s %s - Processes %s\n", commafy(hostname), colorname(pscolor), (timestr ? timestr : ""), ((pscolor == COL_GREEN) ? "OK" : "NOT ok")); addtostatus(msgline); /* And add the info about what's wrong */ if (STRBUFLEN(monmsg)) { addtostrstatus(monmsg); addtostatus("\n"); } /* And the full list of jobs for those who want it */ if (pslistinprocs) { /* * Format the list of virtual machines into four per line, * this list could be fairly long. */ char *tmpstr, *tok; /* Make a copy of psstr, strtok() will be changing it */ tmpstr = strdup(psstr); /* Use strtok() to split string into pieces delimited by newline */ tok = strtok(tmpstr, "\n"); while (tok) { sprintf(msgline, "%s\n", tok); addtostatus(msgline); tok = strtok(NULL, "\n"); } free(tmpstr); } if (fromline && !localmode) addtostatus(fromline); finish_status(); freestrbuffer(monmsg); if (anycountdata) combo_add(countdata); clearstrbuffer(countdata); } void zos_maxuser_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *maxuserstr) { char *p; char maxustr[256]; long maxusers, maxufree, maxuused, rsvtstrt, rsvtfree, rsvtused, rsvnonr, rsvnfree, rsvnused; int maxyellow, maxred; float maxutil, rsvtutil, rsvnutil; int maxcolor = COL_GREEN; char msgline[4096]; strbuffer_t *upmsg; if (!maxuserstr) return; /* * Looking for eyecatchers in message */ p = strstr(maxuserstr, "Maxusers: ") + 9; if (p) { sscanf(p, "%ld Free: %ld", &maxusers, &maxufree); } p = strstr(maxuserstr, "RSVTSTRT: ") + 9; if (p) { sscanf(p, "%ld Free: %ld", &rsvtstrt, &rsvtfree); } p = strstr(maxuserstr, "RSVNONR: ") + 8; if (p) { sscanf(p, "%ld Free: %ld", &rsvnonr, &rsvnfree); } maxuused = maxusers - maxufree; rsvtused = rsvtstrt - rsvtfree; rsvnused = rsvnonr - rsvnfree; if ( maxuused == 0.0 ) maxutil = 0; else maxutil = ((float)maxuused / (float)maxusers) * 100; if ( rsvtused == 0.0 ) rsvtutil = 0; else rsvtutil = ((float)rsvtused / (float)rsvtstrt) * 100; if ( rsvnused == 0.0 ) rsvnutil = 0; else rsvnutil = ((float)rsvnused / (float)rsvnonr) * 100; get_asid_thresholds(hinfo, clientclass, &maxyellow, &maxred); upmsg = newstrbuffer(0); if ((int)maxutil > maxred) { if (maxcolor < COL_RED) maxcolor = COL_RED; addtobuffer(upmsg, "&red ASID (Maxuser) Utilization is CRITICAL\n"); } else if ((int)maxutil > maxyellow) { if (maxcolor < COL_YELLOW) maxcolor = COL_YELLOW; addtobuffer(upmsg, "&yellow ASID (Maxuser) Utilization is HIGH\n"); } *maxustr = '\0'; sprintf(maxustr, " Maxuser: %8ld Free: %8ld Used: %8ld %3.1f\nRSVTSTRT: %8ld Free: %8ld Used: %8ld %3.1f\n RSVNONR: %8ld Free: %8ld Used: %8ld %3.1f\n",maxusers,maxufree,maxuused,maxutil,rsvtstrt,rsvtfree,rsvtused,rsvtutil,rsvnonr,rsvnfree,rsvnused,rsvnutil); init_status(maxcolor); sprintf(msgline, "status %s.maxuser %s %s\n%s", commafy(hostname), colorname(maxcolor), (timestr ? timestr : ""), maxustr); addtostatus(msgline); if (STRBUFLEN(upmsg)) { addtostrstatus(upmsg); addtostatus("\n"); } if (fromline && !localmode) addtostatus(fromline); finish_status(); freestrbuffer(upmsg); } void handle_zos_client(char *hostname, char *clienttype, enum ostype_t os, void *hinfo, char *sender, time_t timestamp, char *clientdata) { char *timestr; char *cpuutilstr; char *pagingstr; char *uptimestr; char *dfstr; char *cicsstr; /* z/OS CICS Information */ char *jobsstr; /* z/OS Running jobs */ char *memstr; /* z/OS Memory Utilization */ char *maxuserstr; /* z/OS Maxuser */ char *portsstr; char *ifstatstr; char fromline[1024]; sprintf(fromline, "\nStatus message received from %s\n", sender); splitmsg(clientdata); timestr = getdata("date"); uptimestr = getdata("uptime"); cpuutilstr = getdata("cpu"); pagingstr = getdata("paging"); dfstr = getdata("df"); cicsstr = getdata("cics"); jobsstr = getdata("jobs"); memstr = getdata("memory"); maxuserstr = getdata("maxuser"); portsstr = getdata("ports"); ifstatstr = getdata("ifstat"); zos_cpu_report(hostname, clienttype, os, hinfo, fromline, timestr, cpuutilstr, uptimestr); zos_paging_report(hostname, clienttype, os, hinfo, fromline, timestr, pagingstr); zos_cics_report(hostname, clienttype, os, hinfo, fromline, timestr, cicsstr); zos_jobs_report(hostname, clienttype, os, hinfo, fromline, timestr, jobsstr); zos_memory_report(hostname, clienttype, os, hinfo, fromline, timestr, memstr); zos_maxuser_report(hostname, clienttype, os, hinfo, fromline, timestr, maxuserstr); unix_disk_report(hostname, clienttype, os, hinfo, fromline, timestr, "Available", "Cap", "Mounted", dfstr); unix_ports_report(hostname, clienttype, os, hinfo, fromline, timestr, 3, 4, 5, portsstr); linecount_report(hostname, clienttype, os, hinfo, fromline, timestr); deltacount_report(hostname, clienttype, os, hinfo, fromline, timestr); unix_ifstat_report(hostname, clienttype, os, hinfo, fromline, timestr, ifstatstr); splitmsg_done(); } xymon-4.3.28/xymond/client/zvm.c0000664000076400007640000003420512503303630016765 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Client backend module for z/VM */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* Copyright (C) 2006-2008 Rich Smrcina */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char zvm_rcsid[] = "$Id: zvm.c 7608 2015-03-21 15:00:40Z jccleaver $"; static void zvm_cpu_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *cpuutilstr, char *uptimestr) { char *p; float load1, loadyellow, loadred; int recentlimit, ancientlimit, uptimecolor, maxclockdiff, clockdiffcolor; int uphour, upmin; char loadresult[100]; char myupstr[100]; long uptimesecs = -1; long upday; int cpucolor = COL_GREEN; char msgline[1024]; strbuffer_t *upmsg; if (!want_msgtype(hinfo, MSG_CPU)) return; if (!cpuutilstr) return; if (!uptimestr) return; uptimesecs = 0; /* * z/VM: "Uptime: 1 Days, 13 Hours, 38 Minutes" */ sscanf(uptimestr,"Uptime: %ld Days, %d Hours, %d Minutes", &upday, &uphour, &upmin); uptimesecs = upday * 86400; uptimesecs += 60*(60*uphour + upmin); sprintf(myupstr, "%s\n", uptimestr); /* * Looking for average CPU Utilization in 'IND' command response * AVGPROC-000% */ *loadresult = '\0'; p = strstr(cpuutilstr, "AVGPROC-") + 8 ; if (p) { if (sscanf(p, "%f%%", &load1) == 1) { sprintf(loadresult, "z/VM CPU Utilization %3.0f%%\n", load1); } } get_cpu_thresholds(hinfo, clientclass, &loadyellow, &loadred, &recentlimit, &ancientlimit, &uptimecolor, &maxclockdiff, &clockdiffcolor); upmsg = newstrbuffer(0); if (load1 > loadred) { cpucolor = COL_RED; addtobuffer(upmsg, "&red Load is CRITICAL\n"); } else if (load1 > loadyellow) { cpucolor = COL_YELLOW; addtobuffer(upmsg, "&yellow Load is HIGH\n"); } if ((uptimesecs != -1) && (recentlimit != -1) && (uptimesecs < recentlimit)) { if (cpucolor != COL_RED) cpucolor = uptimecolor; sprintf(msgline, "&%s Machine recently rebooted\n", colorname(uptimecolor)); addtobuffer(upmsg, msgline); } if ((uptimesecs != -1) && (ancientlimit != -1) && (uptimesecs > ancientlimit)) { if (cpucolor != COL_RED) cpucolor = uptimecolor; sprintf(msgline, "&%s Machine has been up more than %d days\n", colorname(uptimecolor), (ancientlimit / 86400)); addtobuffer(upmsg, msgline); } init_status(cpucolor); sprintf(msgline, "status %s.cpu %s %s %s %s %s\n", commafy(hostname), colorname(cpucolor), (timestr ? timestr : ""), loadresult, myupstr, cpuutilstr); addtostatus(msgline); if (STRBUFLEN(upmsg)) { addtostrstatus(upmsg); addtostatus("\n"); } if (fromline && !localmode) addtostatus(fromline); finish_status(); freestrbuffer(upmsg); } static void zvm_paging_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *cpuutilstr) { char *p; int pagerate, pagingyellow, pagingred; char pagingresult[100]; int pagingcolor = COL_GREEN; char msgline[256]; strbuffer_t *upmsg; if (!cpuutilstr) return; /* * Looking for Paging rate info in 'IND' command response * PAGING-0000/SEC */ *pagingresult = '\0'; /* Skip past three newlines in message to the PAGING text */ p=strstr(cpuutilstr,"PAGING-") + 7; if (sscanf(p, "%d/SEC", &pagerate) == 1) { sprintf(pagingresult, "z/VM Paging Rate %d per second\n", pagerate); } get_paging_thresholds(hinfo, clientclass, &pagingyellow, &pagingred); upmsg = newstrbuffer(0); if (pagerate > pagingred) { pagingcolor = COL_RED; addtobuffer(upmsg, "&red Paging Rate is CRITICAL\n"); } else if (pagerate > pagingyellow) { pagingcolor = COL_YELLOW; addtobuffer(upmsg, "&yellow Paging Rate is HIGH\n"); } init_status(pagingcolor); sprintf(msgline, "status %s.paging %s %s %s %s\n", commafy(hostname), colorname(pagingcolor), (timestr ? timestr : ""), pagingresult, cpuutilstr); addtostatus(msgline); if (STRBUFLEN(upmsg)) { addtostrstatus(upmsg); addtostatus("\n"); } if (fromline && !localmode) addtostatus(fromline); finish_status(); freestrbuffer(upmsg); } static void zvm_mdc_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *cpuutilstr) { char *p; int mdcreads, mdcwrites, mdchitpct; char mdcresult[100]; char msgline[256]; strbuffer_t *msg; if (!cpuutilstr) return; msg = newstrbuffer(0); /* * Looking for MDC info in 'IND' command response * MDC READS-000001/SEC WRITES-000001/SEC HIT RATIO-098% */ *mdcresult = '\0'; /* Skip past three newlines in message to the PAGING text */ p=strstr(cpuutilstr,"READS-"); if (p) { p += 6; sscanf(p, "%d/SEC", &mdcreads); p=strstr(cpuutilstr,"WRITES-") + 7; sscanf(p, "%d/SEC", &mdcwrites); p=strstr(cpuutilstr,"RATIO-") + 6; sscanf(p, "%d", &mdchitpct); sprintf(msgline, "data %s.mdc\n%s\n%d:%d:%d\n", commafy(hostname), osname(os), mdcreads, mdcwrites, mdchitpct); addtobuffer(msg, msgline); combo_add(msg); } freestrbuffer(msg); } static void zvm_users_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *psstr) { int pscolor = COL_GREEN; int pchecks; int cmdofs = -1; char msgline[4096]; strbuffer_t *monmsg; static strbuffer_t *countdata = NULL; int anycountdata = 0; char *group; if (!want_msgtype(hinfo, MSG_PROCS)) return; if (!psstr) return; if (!countdata) countdata = newstrbuffer(0); clearalertgroups(); monmsg = newstrbuffer(0); sprintf(msgline, "data %s.proccounts\n", commafy(hostname)); addtobuffer(countdata, msgline); cmdofs = 0; /* Command offset for z/VM isn't necessary */ pchecks = clear_process_counts(hinfo, clientclass); if (pchecks == 0) { /* Nothing to check */ sprintf(msgline, "&%s No process checks defined\n", colorname(noreportcolor)); addtobuffer(monmsg, msgline); pscolor = noreportcolor; } else if (cmdofs >= 0) { /* Count how many instances of each monitored process is running */ char *pname, *pid, *bol, *nl; int pcount, pmin, pmax, pcolor, ptrack; bol = psstr; while (bol) { nl = strchr(bol, '\n'); /* Take care - the ps output line may be shorter than what we look at */ if (nl) { *nl = '\0'; if ((nl-bol) > cmdofs) add_process_count(bol+cmdofs); *nl = '\n'; bol = nl+1; } else { if (strlen(bol) > cmdofs) add_process_count(bol+cmdofs); bol = NULL; } } /* Check the number found for each monitored process */ while ((pname = check_process_count(&pcount, &pmin, &pmax, &pcolor, &pid, &ptrack, &group)) != NULL) { char limtxt[1024]; if (pmax == -1) { if (pmin > 0) sprintf(limtxt, "%d or more", pmin); else if (pmin == 0) sprintf(limtxt, "none"); } else { if (pmin > 0) sprintf(limtxt, "between %d and %d", pmin, pmax); else if (pmin == 0) sprintf(limtxt, "at most %d", pmax); } if (pcolor == COL_GREEN) { sprintf(msgline, "&green %s (found %d, req. %s)\n", pname, pcount, limtxt); addtobuffer(monmsg, msgline); } else { if (pcolor > pscolor) pscolor = pcolor; sprintf(msgline, "&%s %s (found %d, req. %s)\n", colorname(pcolor), pname, pcount, limtxt); addtobuffer(monmsg, msgline); addalertgroup(group); } if (ptrack) { /* Save the count data for later DATA message to track process counts */ if (!pid) pid = "default"; sprintf(msgline, "%s:%u\n", pid, pcount); addtobuffer(countdata, msgline); anycountdata = 1; } } } else { pscolor = COL_YELLOW; sprintf(msgline, "&yellow Expected string not found in ps output header\n"); addtobuffer(monmsg, msgline); } /* Now we know the result, so generate a status message */ init_status(pscolor); group = getalertgroups(); if (group) sprintf(msgline, "status/group:%s ", group); else strcpy(msgline, "status "); addtostatus(msgline); sprintf(msgline, "%s.procs %s %s - Processes %s\n", commafy(hostname), colorname(pscolor), (timestr ? timestr : ""), ((pscolor == COL_GREEN) ? "OK" : "NOT ok")); addtostatus(msgline); /* And add the info about what's wrong */ if (STRBUFLEN(monmsg)) { addtostrstatus(monmsg); addtostatus("\n"); } /* And the full virtual machine names output for those who want it */ if (pslistinprocs) { /* * Format the list of virtual machines into four per line, * this list could be fairly long. */ char *tmpstr, *tok, *nm[4]; int nmidx = 0; /* Make a copy of psstr, strtok() will be changing it */ tmpstr = strdup(psstr); /* Use strtok() to split string into pieces delimited by newline */ tok = strtok(tmpstr, "\n"); while (tok) { nm[nmidx++] = tok; if (nmidx == 4) { sprintf(msgline, "%-8s %-8s %-8s %-8s\n", nm[0], nm[1], nm[2], nm[3]); addtostatus(msgline); nmidx = 0; nm[0] = nm[1] = nm[2] = nm[3] = " "; } tok = strtok(NULL, "\n"); } /* Print any remaining names */ if (nmidx > 0) { sprintf(msgline, "%-8s %-8s %-8s %-8s\n", nm[0], nm[1], nm[2], nm[3]); addtostatus(msgline); } free(tmpstr); } if (fromline && !localmode) addtostatus(fromline); finish_status(); freestrbuffer(monmsg); if (anycountdata) combo_add(countdata); clearstrbuffer(countdata); } void handle_zvm_client(char *hostname, char *clienttype, enum ostype_t os, void *hinfo, char *sender, time_t timestamp, char *clientdata) { char *timestr; char *cpuutilstr; char *uptimestr; char *dfstr; char *usersstr; /* Logged on z/VM Users */ char *msgsstr; char *ifstatstr; char *portsstr; char fromline[1024]; sprintf(fromline, "\nStatus message received from %s\n", sender); splitmsg(clientdata); timestr = getdata("date"); uptimestr = getdata("uptime"); cpuutilstr = getdata("cpu"); dfstr = getdata("df"); usersstr = getdata("UserID"); msgsstr = getdata("msgs"); portsstr = getdata("ports"); ifstatstr = getdata("ifstat"); zvm_cpu_report(hostname, clienttype, os, hinfo, fromline, timestr, cpuutilstr, uptimestr); zvm_paging_report(hostname, clienttype, os, hinfo, fromline, timestr, cpuutilstr); zvm_mdc_report(hostname, clienttype, os, hinfo, fromline, timestr, cpuutilstr); zvm_users_report(hostname, clienttype, os, hinfo, fromline, timestr, usersstr); unix_disk_report(hostname, clienttype, os, hinfo, fromline, timestr, "Available", "Capacity", "Mounted", dfstr); unix_ports_report(hostname, clienttype, os, hinfo, fromline, timestr, 3, 4, 5, portsstr); unix_ifstat_report(hostname, clienttype, os, hinfo, fromline, timestr, ifstatstr); msgs_report(hostname, clienttype, os, hinfo, fromline, timestr, msgsstr); file_report(hostname, clienttype, os, hinfo, fromline, timestr); linecount_report(hostname, clienttype, os, hinfo, fromline, timestr); deltacount_report(hostname, clienttype, os, hinfo, fromline, timestr); splitmsg_done(); } xymon-4.3.28/xymond/client/osf.c0000664000076400007640000001067112654207223016751 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Client backend module for OSF */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char osf_rcsid[] = "$Id: osf.c 7886 2016-02-02 20:16:19Z jccleaver $"; void handle_osf_client(char *hostname, char *clienttype, enum ostype_t os, void *hinfo, char *sender, time_t timestamp, char *clientdata) { char *timestr; char *uptimestr; char *clockstr; char *msgcachestr; char *whostr; char *psstr; char *topstr; char *dfstr; char *msgsstr; char *netstatstr; char *ifstatstr; char *portsstr; char *vmstatstr; char *memorystr; char *swapstr; char fromline[1024]; sprintf(fromline, "\nStatus message received from %s\n", sender); splitmsg(clientdata); timestr = getdata("date"); uptimestr = getdata("uptime"); clockstr = getdata("clock"); msgcachestr = getdata("msgcache"); whostr = getdata("who"); psstr = getdata("ps"); topstr = getdata("top"); dfstr = getdata("df"); msgsstr = getdata("msgs"); netstatstr = getdata("netstat"); ifstatstr = getdata("ifstat"); portsstr = getdata("ports"); vmstatstr = getdata("vmstat"); memorystr = getdata("memory"); swapstr = getdata("swap"); unix_cpu_report(hostname, clienttype, os, hinfo, fromline, timestr, uptimestr, clockstr, msgcachestr, whostr, 0, psstr, 0, topstr); unix_disk_report(hostname, clienttype, os, hinfo, fromline, timestr, "Available", "Capacity", "Mounted", dfstr); unix_procs_report(hostname, clienttype, os, hinfo, fromline, timestr, "CMD", "COMMAND", psstr); unix_ports_report(hostname, clienttype, os, hinfo, fromline, timestr, 3, 4, 5, portsstr); msgs_report(hostname, clienttype, os, hinfo, fromline, timestr, msgsstr); file_report(hostname, clienttype, os, hinfo, fromline, timestr); linecount_report(hostname, clienttype, os, hinfo, fromline, timestr); deltacount_report(hostname, clienttype, os, hinfo, fromline, timestr); unix_netstat_report(hostname, clienttype, os, hinfo, fromline, timestr, netstatstr); unix_ifstat_report(hostname, clienttype, os, hinfo, fromline, timestr, ifstatstr); unix_vmstat_report(hostname, clienttype, os, hinfo, fromline, timestr, vmstatstr); if (memorystr && swapstr) { char *p, *bol; long phystotal, physfree, swaptotal, swapfree, pagecnt, pagesize; /* * Total Physical Memory = 5120.00 M * = 655360 pages * * ... * * Managed Pages Break Down: * * free pages = 499488 * */ phystotal = physfree = swaptotal = swapfree = -1; pagesize = 8; /* Default - appears to be the OSF/1 standard */ bol = strstr(memorystr, "\nTotal Physical Memory ="); if (bol) { p = strchr(bol, '='); phystotal = atol(p+1); bol = strchr(p, '\n'); if (bol) { bol++; bol += strspn(bol, " \t"); if (*bol == '=') { pagecnt = atol(bol+1); pagesize = (phystotal * 1024) / pagecnt; } } } bol = strstr(memorystr, "\nManaged Pages Break Down:"); if (bol) { bol = strstr(bol, "free pages ="); if (bol) { p = strchr(bol, '='); physfree = atol(p+1) * pagesize / 1024; } } bol = strstr(swapstr, "\nTotal swap allocation:"); if (bol) { unsigned long swappages, freepages; int n1, n2; n1 = n2 = 0; p = strstr(bol, "Allocated space:"); if (p) n1 = sscanf(p, "Allocated space: %lu pages", &swappages); p = strstr(bol, "Available space:"); if (p) n2 = sscanf(p, "Available space: %lu pages", &freepages); if ((n1 == 1) && (n2 == 1)) { swaptotal = swappages * pagesize / 1024; swapfree = freepages * pagesize / 1024; } } unix_memory_report(hostname, clienttype, os, hinfo, fromline, timestr, phystotal, (phystotal - physfree), -1, -1, swaptotal, (swaptotal - swapfree)); } splitmsg_done(); } xymon-4.3.28/xymond/client/openbsd.c0000664000076400007640000000753212654207223017616 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Client backend module for OpenBSD */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char openbsd_rcsid[] = "$Id: openbsd.c 7886 2016-02-02 20:16:19Z jccleaver $"; void handle_openbsd_client(char *hostname, char *clienttype, enum ostype_t os, void *hinfo, char *sender, time_t timestamp, char *clientdata) { char *timestr; char *uptimestr; char *clockstr; char *msgcachestr; char *whostr; char *psstr; char *topstr; char *dfstr; char *inodestr; char *meminfostr; char *msgsstr; char *netstatstr; char *ifstatstr; char *portsstr; char *vmstatstr; char *p; char fromline[1024]; sprintf(fromline, "\nStatus message received from %s\n", sender); splitmsg(clientdata); timestr = getdata("date"); uptimestr = getdata("uptime"); clockstr = getdata("clock"); msgcachestr = getdata("msgcache"); whostr = getdata("who"); psstr = getdata("ps"); topstr = getdata("top"); dfstr = getdata("df"); inodestr = getdata("inode"); meminfostr = getdata("meminfo"); msgsstr = getdata("msgs"); netstatstr = getdata("netstat"); ifstatstr = getdata("ifstat"); portsstr = getdata("ports"); vmstatstr = getdata("vmstat"); unix_cpu_report(hostname, clienttype, os, hinfo, fromline, timestr, uptimestr, clockstr, msgcachestr, whostr, 0, psstr, 0, topstr); unix_disk_report(hostname, clienttype, os, hinfo, fromline, timestr, "Avail", "Capacity", "Mounted", dfstr); unix_inode_report(hostname, clienttype, os, hinfo, fromline, timestr, "ifree", "%iused", "Mounted", inodestr); unix_procs_report(hostname, clienttype, os, hinfo, fromline, timestr, "COMMAND", NULL, psstr); unix_ports_report(hostname, clienttype, os, hinfo, fromline, timestr, 3, 4, 5, portsstr); msgs_report(hostname, clienttype, os, hinfo, fromline, timestr, msgsstr); file_report(hostname, clienttype, os, hinfo, fromline, timestr); linecount_report(hostname, clienttype, os, hinfo, fromline, timestr); deltacount_report(hostname, clienttype, os, hinfo, fromline, timestr); unix_netstat_report(hostname, clienttype, os, hinfo, fromline, timestr, netstatstr); unix_ifstat_report(hostname, clienttype, os, hinfo, fromline, timestr, ifstatstr); unix_vmstat_report(hostname, clienttype, os, hinfo, fromline, timestr, vmstatstr); if (meminfostr) { unsigned long memphystotal, memphysfree, memphysused; unsigned long memswaptotal, memswapfree, memswapused; int found = 0; memphystotal = memphysfree = memphysused = 0; memswaptotal = memswapfree = memswapused = 0; p = strstr(meminfostr, "Total:"); if (p) { memphystotal = atol(p+6); found++; } p = strstr(meminfostr, "Free:"); if (p) { memphysfree = atol(p+5); found++; } memphysused = memphystotal - memphysfree; p = strstr(meminfostr, "Swaptotal:"); if (p) { memswaptotal = atol(p+10); found++; } p = strstr(meminfostr, "Swapused:"); if (p) { memswapused = atol(p+9); found++; } memswapfree = memswaptotal - memswapused; if (found == 4) { unix_memory_report(hostname, clienttype, os, hinfo, fromline, timestr, memphystotal, memphysused, -1, -1, memswaptotal, memswapused); } } splitmsg_done(); } xymon-4.3.28/xymond/client/solaris.c0000664000076400007640000001302612654207223017633 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Client backend module for Solaris */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char solaris_rcsid[] = "$Id: solaris.c 7886 2016-02-02 20:16:19Z jccleaver $"; void handle_solaris_client(char *hostname, char *clienttype, enum ostype_t os, void *hinfo, char *sender, time_t timestamp, char *clientdata) { char *timestr; char *uptimestr; char *clockstr; char *msgcachestr; char *whostr; char *psstr; char *topstr; char *prtconfstr; char *memorystr; char *swapstr; char *swapliststr; char *dfstr; char *inodestr; char *msgsstr; char *netstatstr; char *ifstatstr; char *portsstr; char *vmstatstr; char *iostatdiskstr; char fromline[1024]; sprintf(fromline, "\nStatus message received from %s\n", sender); splitmsg(clientdata); timestr = getdata("date"); uptimestr = getdata("uptime"); clockstr = getdata("clock"); msgcachestr = getdata("msgcache"); whostr = getdata("who"); psstr = getdata("ps"); topstr = getdata("top"); dfstr = getdata("df"); inodestr = getdata("inode"); prtconfstr = getdata("prtconf"); memorystr = getdata("memory"); swapstr = getdata("swap"); swapliststr = getdata("swaplist"); msgsstr = getdata("msgs"); netstatstr = getdata("netstat"); ifstatstr = getdata("ifstat"); portsstr = getdata("ports"); vmstatstr = getdata("vmstat"); iostatdiskstr = getdata("iostatdisk"); unix_cpu_report(hostname, clienttype, os, hinfo, fromline, timestr, uptimestr, clockstr, msgcachestr, whostr, 0, psstr, 0, topstr); unix_disk_report(hostname, clienttype, os, hinfo, fromline, timestr, "avail", "capacity", "Mounted", dfstr); unix_inode_report(hostname, clienttype, os, hinfo, fromline, timestr, "ifree", "%iused", "Mounted", inodestr); unix_procs_report(hostname, clienttype, os, hinfo, fromline, timestr, "CMD", "COMMAND", psstr); unix_ports_report(hostname, clienttype, os, hinfo, fromline, timestr, 0, 1, 6, portsstr); msgs_report(hostname, clienttype, os, hinfo, fromline, timestr, msgsstr); file_report(hostname, clienttype, os, hinfo, fromline, timestr); linecount_report(hostname, clienttype, os, hinfo, fromline, timestr); deltacount_report(hostname, clienttype, os, hinfo, fromline, timestr); unix_netstat_report(hostname, clienttype, os, hinfo, fromline, timestr, netstatstr); unix_ifstat_report(hostname, clienttype, os, hinfo, fromline, timestr, ifstatstr); unix_vmstat_report(hostname, clienttype, os, hinfo, fromline, timestr, vmstatstr); if (prtconfstr && memorystr && (swapstr || swapliststr)) { long memphystotal, memphysfree, memswapused, memswapfree; char *p; memphystotal = memphysfree = memswapfree = memswapused = -1; p = strstr(prtconfstr, "\nMemory size:"); if (p && (sscanf(p, "\nMemory size: %ld Megabytes", &memphystotal) == 1)) ; if (sscanf(memorystr, "%*d %*d %*d %*d %ld", &memphysfree) == 1) memphysfree /= 1024; if (!swapliststr) { /* * No "swap -l" output, so use what "swap -s" reports. * Xymon clients prior to 2010-Dec-14 (roughly 4.3.0 release) does not report "swap -l". */ p = strchr(swapstr, '='); if (p && sscanf(p, "= %ldk used, %ldk available", &memswapused, &memswapfree) == 2) { memswapused /= 1024; memswapfree /= 1024; } } else { /* We prefer using "swap -l" output since it matches what other system tools report */ char *bol; long blktotal, blkfree; blktotal = blkfree = 0; bol = swapliststr; while (bol) { char *nl, *tmpline; nl = strchr(bol, '\n'); if (nl) *nl = '\0'; tmpline = strdup(bol); /* According to the Solaris man-page for versions 8 thru 10, the "swap -l" output is always 5 columns */ /* Note: getcolumn() is zero-based (thanks, Dominique Frise) */ p = getcolumn(tmpline, 3); if (p) blktotal += atol(p); strcpy(tmpline, bol); p = getcolumn(tmpline, 4); if (p) blkfree += atol(p); xfree(tmpline); if (nl) { *nl = '\n'; bol = nl+1; } else { bol = NULL; } } if ((blktotal >= 0) && (blkfree >= 0)) { /* Values from swap -l are numbers of 512-byte blocks. Convert to MB = N*512/(1024*1024) = N/2048 */ memswapused = (blktotal - blkfree) / 2048; memswapfree = blkfree / 2048; } } if ((memphystotal>=0) && (memphysfree>=0) && (memswapused>=0) && (memswapfree>=0)) { unix_memory_report(hostname, clienttype, os, hinfo, fromline, timestr, memphystotal, (memphystotal - memphysfree), -1, -1, (memswapused + memswapfree), memswapused); } } if (iostatdiskstr) { char msgline[1024]; strbuffer_t *msg = newstrbuffer(0); char *p; p = strchr(iostatdiskstr, '\n'); if (p) { p++; sprintf(msgline, "data %s.iostatdisk\n%s\n", commafy(hostname), osname(os)); addtobuffer(msg, msgline); addtobuffer(msg, p); combo_add(msg); } freestrbuffer(msg); } splitmsg_done(); } xymon-4.3.28/xymond/client/snmpcollect.c0000664000076400007640000000671112603243142020477 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Client backend module for SNMP collector */ /* */ /* Copyright (C) 2009-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char snmpcollect_rcsid[] = "$Id: snmpcollect.c 7678 2015-10-01 14:42:42Z jccleaver $"; /* * Split the snmpcollect client-message into individual mib-datasets. * Run each dataset through the mib-value configuration module, and * generate a status-message for each dataset. */ void handle_snmpcollect_client(char *hostname, char *clienttype, enum ostype_t os, void *hinfo, char *sender, time_t timestamp, char *clientdata) { void *ns1var, *ns1sects; char *onemib; char *mibname; char fromline[1024], msgline[1024]; strbuffer_t *summary = newstrbuffer(0); sprintf(fromline, "\nStatus message received from %s\n", sender); onemib = nextsection_r(clientdata, &mibname, &ns1var, &ns1sects); while (onemib) { char *bmark, *emark; char *oneds, *dskey; void *ns2var, *ns2sects; int color, rulecolor, anyrules; char *groups; if (strcmp(mibname, "proxy") == 0) { /* * Data was forwarded through a proxy - skip this section. * We don't want a "proxy" status for all SNMP-enabled hosts. */ goto sectiondone; } /* Convert the "" markers to "[NNN]" */ bmark = onemib; while ((bmark = strstr(bmark, "\n<")) != NULL) { emark = strchr(bmark, '>'); *(bmark+1) = '['; if (emark) *emark = ']'; bmark += 2; } /* Match the mib data against the configuration */ anyrules = 1; color = COL_GREEN; clearalertgroups(); clearstrbuffer(summary); oneds = nextsection_r(onemib, &dskey, &ns2var, &ns2sects); if (oneds) { /* Tabular MIB data. Handle each of the rows in the table. */ while (oneds && anyrules) { rulecolor = check_mibvals(hinfo, clienttype, mibname, dskey, oneds, summary, &anyrules); if (rulecolor > color) color = rulecolor; oneds = nextsection_r(NULL, &dskey, &ns2var, &ns2sects); } nextsection_r_done(ns2sects); } else { /* Non-tabular MIB data - no key */ rulecolor = check_mibvals(hinfo, clienttype, mibname, NULL, onemib, summary, &anyrules); if (rulecolor > color) color = rulecolor; } /* Generate the status message */ groups = getalertgroups(); init_status(color); if (groups) sprintf(msgline, "status/group:%s ", groups); else strcpy(msgline, "status "); addtostatus(msgline); sprintf(msgline, "%s.%s %s %s\n", hostname, mibname, colorname(color), ctime(×tamp)); addtostatus(msgline); if (STRBUFLEN(summary) > 0) { addtostrstatus(summary); addtostatus("\n"); } addtostatus(onemib); addtostatus(fromline); finish_status(); sectiondone: onemib = nextsection_r(NULL, &mibname, &ns1var, &ns1sects); } nextsection_r_done(ns1sects); freestrbuffer(summary); } xymon-4.3.28/xymond/client/aix.c0000664000076400007640000000735512654207223016750 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Client backend module for AIX */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char aix_rcsid[] = "$Id: aix.c 7886 2016-02-02 20:16:19Z jccleaver $"; void handle_aix_client(char *hostname, char *clienttype, enum ostype_t os, void *hinfo, char *sender, time_t timestamp, char *clientdata) { char *timestr; char *uptimestr; char *clockstr; char *msgcachestr; char *whostr; char *psstr; char *topstr; char *dfstr; char *inodestr; char *msgsstr; char *netstatstr; char *ifstatstr; char *portsstr; char *vmstatstr; char *realmemstr; char *freememstr; char *swapmemstr; char fromline[1024]; sprintf(fromline, "\nStatus message received from %s\n", sender); splitmsg(clientdata); timestr = getdata("date"); uptimestr = getdata("uptime"); clockstr = getdata("clock"); msgcachestr = getdata("msgcache"); whostr = getdata("who"); psstr = getdata("ps"); topstr = getdata("top"); dfstr = getdata("df"); inodestr = getdata("inode"); msgsstr = getdata("msgs"); netstatstr = getdata("netstat"); ifstatstr = getdata("ifstat"); portsstr = getdata("ports"); vmstatstr = getdata("vmstat"); realmemstr = getdata("realmem"); freememstr = getdata("freemem"); swapmemstr = getdata("swap"); unix_cpu_report(hostname, clienttype, os, hinfo, fromline, timestr, uptimestr, clockstr, msgcachestr, whostr, 0, psstr, 0, topstr); unix_disk_report(hostname, clienttype, os, hinfo, fromline, timestr, "Free", "%Used", "Mounted", dfstr); unix_inode_report(hostname, clienttype, os, hinfo, fromline, timestr, "avail", "%iused", "Mounted", inodestr); unix_procs_report(hostname, clienttype, os, hinfo, fromline, timestr, "COMMAND", "CMD", psstr); unix_ports_report(hostname, clienttype, os, hinfo, fromline, timestr, 3, 4, 5, portsstr); msgs_report(hostname, clienttype, os, hinfo, fromline, timestr, msgsstr); file_report(hostname, clienttype, os, hinfo, fromline, timestr); linecount_report(hostname, clienttype, os, hinfo, fromline, timestr); deltacount_report(hostname, clienttype, os, hinfo, fromline, timestr); unix_ifstat_report(hostname, clienttype, os, hinfo, fromline, timestr, ifstatstr); unix_netstat_report(hostname, clienttype, os, hinfo, fromline, timestr, netstatstr); unix_vmstat_report(hostname, clienttype, os, hinfo, fromline, timestr, vmstatstr); if (realmemstr && freememstr && swapmemstr) { long memphystotal = 0, memphysfree = 0, memswaptotal = 0, memswappct = 0; char *p; if (strncmp(realmemstr, "realmem ", 8) == 0) memphystotal = atol(realmemstr+8) / 1024L; if (sscanf(freememstr, "%*d %*d %*d %ld", &memphysfree) == 1) memphysfree /= 256L; p = strchr(swapmemstr, '\n'); if (p) p++; if (p && (sscanf(p, " %ldMB %ld%%", &memswaptotal, &memswappct) != 2)) { memswaptotal = memswappct = -1L; } unix_memory_report(hostname, clienttype, os, hinfo, fromline, timestr, memphystotal, (memphystotal - memphysfree), -1L, -1L, memswaptotal, ((memswaptotal * memswappct) / 100L)); } splitmsg_done(); } xymon-4.3.28/xymond/client/mqcollect.c0000664000076400007640000001722112000317413020127 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Client backend module for MQ collector */ /* */ /* Copyright (C) 2009-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char mqcollect_rcsid[] = "$Id: mqcollect.c 7060 2012-07-14 16:32:11Z storner $"; void mqcollect_flush_status(int color, char *fromline, time_t timestamp, char *hostname, char *qmid, strbuffer_t *redsummary, strbuffer_t *yellowsummary, strbuffer_t *greensummary, char *clienttext) { char *groups; char msgline[1024]; /* Generate the status message */ groups = getalertgroups(); init_status(color); if (groups) sprintf(msgline, "status/group:%s ", groups); else strcpy(msgline, "status "); addtostatus(msgline); sprintf(msgline, "%s.mq %s %s\n", hostname, colorname(color), ctime(×tamp)); addtostatus(msgline); if (STRBUFLEN(redsummary) > 0) { addtostrstatus(redsummary); addtostatus("\n"); } if (STRBUFLEN(yellowsummary) > 0) { addtostrstatus(yellowsummary); addtostatus("\n"); } if (STRBUFLEN(greensummary) > 0) { addtostrstatus(greensummary); addtostatus("\n"); } addtostatus(clienttext); addtostatus("\n"); addtostatus(fromline); finish_status(); } void handle_mqcollect_client(char *hostname, char *clienttype, enum ostype_t os, void *hinfo, char *sender, time_t timestamp, char *clientdata) { char *qmline = "Starting MQSC for queue manager "; strbuffer_t *redsummary = newstrbuffer(0); strbuffer_t *yellowsummary = newstrbuffer(0); strbuffer_t *greensummary = newstrbuffer(0); char *bol, *eoln, *clienttext; int color = COL_GREEN; char fromline[1024], msgline[1024]; char *qmid = NULL, *qnam = NULL; int qlen = -1, qage = -1; char *chnnam = NULL, *chnstatus = NULL; enum { PARSING_QL, PARSING_QS, PARSING_CHS, PARSER_FLOAT } pstate = PARSER_FLOAT; int lastline = 0; sprintf(fromline, "\nStatus message received from %s\n", sender); bol = strchr(clientdata, '\n'); if (bol) bol++; clienttext = bol; while (bol) { eoln = strchr(bol, '\n'); if (eoln) *eoln = '\0'; else lastline = 1; bol += strspn(bol, " \t"); if (strncmp(bol, qmline, strlen(qmline)) == 0) { char *p; if (qmid) xfree(qmid); qmid = strdup(bol+strlen(qmline)); p = strrchr(qmid, '.'); if (p) *p = '\0'; } else if ( (strncmp(bol, "AMQ8409:", 8) == 0) || /* "ql" command - Queue details, incl. depth */ (strncmp(bol, "AMQ8450:", 8) == 0) || /* "qs" command - Queue status */ (strncmp(bol, "AMQ8417:", 8) == 0) || /* "chs" command - Channel status */ lastline ) { if ( ((pstate == PARSING_QL) || (pstate == PARSING_QS)) && qmid && qnam && (qlen >= 0)) { /* Got a full queue depth status */ int warnlen, critlen, warnage, critage; char *trackid; get_mqqueue_thresholds(hinfo, clienttype, qmid, qnam, &warnlen, &critlen, &warnage, &critage, &trackid); if ((critlen != -1) && (qlen >= critlen)) { color = COL_RED; sprintf(msgline, "&red Queue %s:%s has depth %d (critical: %d, warn: %d)\n", qmid, qnam, qlen, critlen, warnlen); addtobuffer(redsummary, msgline); } else if ((warnlen != -1) && (qlen >= warnlen)) { if (color < COL_YELLOW) color = COL_YELLOW; sprintf(msgline, "&yellow Queue %s:%s has depth %d (warn: %d, critical: %d)\n", qmid, qnam, qlen, warnlen, critlen); addtobuffer(yellowsummary, msgline); } else if ((warnlen != -1) || (critlen != -1)) { sprintf(msgline, "&green Queue %s:%s has depth %d (warn: %d, critical: %d)\n", qmid, qnam, qlen, warnlen, critlen); addtobuffer(greensummary, msgline); } if ((pstate == PARSING_QS) && (qage >= 0)) { if ((critage != -1) && (qage >= critage)) { color = COL_RED; sprintf(msgline, "&red Queue %s:%s has age %d (critical: %d, warn: %d)\n", qmid, qnam, qage, critage, warnage); addtobuffer(redsummary, msgline); } else if ((warnage != -1) && (qage >= warnage)) { if (color < COL_YELLOW) color = COL_YELLOW; sprintf(msgline, "&yellow Queue %s:%s has age %d (warn: %d, critical: %d)\n", qmid, qnam, qage, warnage, critage); addtobuffer(yellowsummary, msgline); } else if ((warnage != -1) || (critage != -1)) { sprintf(msgline, "&green Queue %s:%s has age %d (warn: %d, critical: %d)\n", qmid, qnam, qage, warnage, critage); addtobuffer(greensummary, msgline); } } if (trackid) { /* FIXME: Send "data" message for creating queue-length RRD */ } pstate = PARSER_FLOAT; } if ((pstate == PARSING_CHS) && qmid && chnnam && chnstatus) { /* Got a full channel status */ int chncolor; if (get_mqchannel_params(hinfo, clienttype, qmid, chnnam, chnstatus, &chncolor)) { if (chncolor > color) color = chncolor; switch (chncolor) { case COL_RED: sprintf(msgline, "&red Channel %s:%s has status %s\n", qmid, chnnam, chnstatus); addtobuffer(redsummary, msgline); break; case COL_YELLOW: sprintf(msgline, "&yellow Channel %s:%s has status %s\n", qmid, chnnam, chnstatus); addtobuffer(yellowsummary, msgline); break; case COL_GREEN: sprintf(msgline, "&green Channel %s:%s has status %s\n", qmid, chnnam, chnstatus); addtobuffer(greensummary, msgline); break; } } pstate = PARSER_FLOAT; } if (qnam) xfree(qnam); qlen = qage = -1; if (chnnam) xfree(chnnam); if (chnstatus) xfree(chnstatus); if (strncmp(bol, "AMQ8409:", 8) == 0) pstate = PARSING_QL; else if (strncmp(bol, "AMQ8450:", 8) == 0) pstate = PARSING_QS; else if (strncmp(bol, "AMQ8417:", 8) == 0) pstate = PARSING_CHS; else pstate = PARSER_FLOAT; } else if ((pstate == PARSING_QL) || (pstate == PARSING_QS)) { char *bdup = strdup(bol); char *tok = strtok(bdup, " \t"); while (tok) { if (strncmp(tok, "QUEUE(", 6) == 0) { char *p; qnam = strdup(tok+6); p = strchr(qnam, ')'); if (p) *p = '\0'; } else if (strncmp(tok, "CURDEPTH(", 9) == 0) { qlen = atoi(tok+9); } else if (strncmp(tok, "MSGAGE(", 7) == 0) { if (isdigit(*(tok+7))) qage = atoi(tok+7); } tok = strtok(NULL, " \t"); } xfree(bdup); } else if (pstate == PARSING_CHS) { char *bdup = strdup(bol); char *tok = strtok(bdup, " \t"); while (tok) { if (strncmp(tok, "CHANNEL(", 8) == 0) { char *p; chnnam = strdup(tok+8); p = strchr(chnnam, ')'); if (p) *p = '\0'; } else if (strncmp(tok, "STATUS(", 7) == 0) { char *p; chnstatus = strdup(tok+7); p = strchr(chnstatus, ')'); if (p) *p = '\0'; } tok = strtok(NULL, " \t"); } xfree(bdup); } if (eoln) { *eoln = '\n'; bol = eoln+1; } else bol = NULL; } mqcollect_flush_status(color, fromline, timestamp, hostname, qmid, redsummary, yellowsummary, greensummary, clienttext); if (qmid) xfree(qmid); freestrbuffer(greensummary); freestrbuffer(yellowsummary); freestrbuffer(redsummary); } xymon-4.3.28/xymond/client/generic.c0000664000076400007640000000315112503303630017561 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Client backend module for generic unknown client */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char generic_rcsid[] = "$Id: generic.c 7059 2012-07-14 15:18:14Z storner $"; void handle_generic_client(char *hostname, char *clienttype, enum ostype_t os, void *hinfo, char *sender, time_t timestamp, char *clientdata) { char *timestr; char *msgsstr; char fromline[1024]; sprintf(fromline, "\nStatus message received from %s\n", sender); splitmsg(clientdata); timestr = getdata("date"); msgsstr = getdata("msgs"); msgs_report(hostname, clienttype, os, hinfo, fromline, timestr, msgsstr); file_report(hostname, clienttype, os, hinfo, fromline, timestr); linecount_report(hostname, clienttype, os, hinfo, fromline, timestr); deltacount_report(hostname, clienttype, os, hinfo, fromline, timestr); splitmsg_done(); } xymon-4.3.28/xymond/client/zvse.c0000664000076400007640000006555412503303630017153 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Client backend module for z/VSE or VSE/ESA */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* Copyright (C) 2006-2008 Rich Smrcina */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char zvse_rcsid[] = "$Id: zvse.c 7608 2015-03-21 15:00:40Z jccleaver $"; static void zvse_cpu_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *cpuutilstr, char *uptimestr) { char *p; float load1, loadyellow, loadred; int recentlimit, ancientlimit, uptimecolor, maxclockdiff, clockdiffcolor; int uphour, upmin; char loadresult[100]; char myupstr[100]; long uptimesecs = -1; long upday; int cpucolor = COL_GREEN; char msgline[4096]; strbuffer_t *upmsg; if (!want_msgtype(hinfo, MSG_CPU)) return; if (!uptimestr) return; if (!cpuutilstr) return; uptimesecs = 0; /* * z/VSE: "Uptime: 1 Days, 13 Hours, 38 Minutes" */ sscanf(uptimestr,"Uptime: %ld Days, %d Hours, %d Minutes", &upday, &uphour, &upmin); uptimesecs = upday * 86400; uptimesecs += 60*(60*uphour + upmin); sprintf(myupstr, "%s\n", uptimestr); /* * Looking for average CPU Utilization in CPU message * Avg CPU=000% */ *loadresult = '\0'; p = strstr(cpuutilstr, "Avg CPU=") + 8 ; if (p) { if (sscanf(p, "%f%%", &load1) == 1) { sprintf(loadresult, "z/VSE CPU Utilization %3.0f%%\n", load1); } } get_cpu_thresholds(hinfo, clientclass, &loadyellow, &loadred, &recentlimit, &ancientlimit, &uptimecolor, &maxclockdiff, &clockdiffcolor); upmsg = newstrbuffer(0); if (load1 > loadred) { cpucolor = COL_RED; addtobuffer(upmsg, "&red Load is CRITICAL\n"); } else if (load1 > loadyellow) { cpucolor = COL_YELLOW; addtobuffer(upmsg, "&yellow Load is HIGH\n"); } if ((uptimesecs != -1) && (recentlimit != -1) && (uptimesecs < recentlimit)) { if (cpucolor != COL_RED) cpucolor = uptimecolor; sprintf(msgline, "&%s Machine recently rebooted\n", colorname(uptimecolor)); addtobuffer(upmsg, msgline); } if ((uptimesecs != -1) && (ancientlimit != -1) && (uptimesecs > ancientlimit)) { if (cpucolor != COL_RED) cpucolor = uptimecolor; sprintf(msgline, "&%s Machine has been up more than %d days\n", colorname(uptimecolor), (ancientlimit / 86400)); addtobuffer(upmsg, msgline); } init_status(cpucolor); sprintf(msgline, "status %s.cpu %s %s %s %s %s\n", commafy(hostname), colorname(cpucolor), (timestr ? timestr : ""), loadresult, myupstr, cpuutilstr); addtostatus(msgline); if (STRBUFLEN(upmsg)) { addtostrstatus(upmsg); addtostatus("\n"); } if (fromline && !localmode) addtostatus(fromline); finish_status(); freestrbuffer(upmsg); } static void zvse_paging_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *pagingstr) { char *p; int ipagerate, pagingyellow, pagingred; float fpagerate=0.0; char pagingresult[100]; int pagingcolor = COL_GREEN; char msgline[4096]; strbuffer_t *upmsg; if (!pagingstr) return; /* * Looking for Paging rate in message * Page Rate=0.00 /sec */ *pagingresult = '\0'; ipagerate=0; p = strstr(pagingstr, "Page Rate=") + 10; if (p) { if (sscanf(p, "%f", &fpagerate) == 1) { ipagerate=fpagerate + 0.5; /* Rounding up */ sprintf(pagingresult, "z/VSE Paging Rate %d per second\n", ipagerate); } } else sprintf(pagingresult, "Can not find page rate value in:\n%s\n", pagingstr); get_paging_thresholds(hinfo, clientclass, &pagingyellow, &pagingred); upmsg = newstrbuffer(0); if (ipagerate > pagingred) { pagingcolor = COL_RED; addtobuffer(upmsg, "&red Paging Rate is CRITICAL\n"); } else if (ipagerate > pagingyellow) { pagingcolor = COL_YELLOW; addtobuffer(upmsg, "&yellow Paging Rate is HIGH\n"); } init_status(pagingcolor); sprintf(msgline, "status %s.paging %s %s %s %s\n", commafy(hostname), colorname(pagingcolor), (timestr ? timestr : ""), pagingresult, pagingstr); addtostatus(msgline); if (STRBUFLEN(upmsg)) { addtostrstatus(upmsg); addtostatus("\n"); } if (fromline && !localmode) addtostatus(fromline); finish_status(); freestrbuffer(upmsg); } static void zvse_cics_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *cicsstr) { char cicsappl[9], cicsdate[11], cicstime[9]; int numtrans=0, cicsok=1; float dsapct=0.0; float edsapct=0.0; char cicsresult[100]; char tempresult[100]; char *cicsentry = NULL; int cicscolor = COL_GREEN; int dsayel, dsared, edsayel, edsared; char msgline[4096]; char cicsokmsg[]="All CICS Systems OK"; char cicsnotokmsg[]="One or more CICS Systems not OK"; strbuffer_t *headline; strbuffer_t *upmsg; strbuffer_t *cicsmsg; if (!cicsstr) return; cicsmsg = newstrbuffer(0); upmsg = newstrbuffer(0); headline= newstrbuffer(0); addtobuffer(headline, "Appl ID Trans DSA Pct EDSA Pct\n"); /* * * Each CICS system reporting uses one line in the message, the format is: * applid date time numtrans dsapct edsapct * applid is the CICS application id * date and time are the date and time of the report * numtrans is the number of transactions that were executed in CICS since the last report * dsapct is the DSA utilization percentage * edsapct is the EDSA utilization percentage * */ if (cicsstr) { cicsentry=strtok(cicsstr, "\n"); while (cicsentry != NULL) { sscanf(cicsentry, "%8s %10s %8s %d %f %f", cicsappl, cicsdate, cicstime, &numtrans, &dsapct, &edsapct); sprintf(cicsresult,"%-8s %6d %3.1f %3.1f\n", cicsappl, numtrans, dsapct, edsapct); addtobuffer(cicsmsg, cicsresult); if (numtrans == -1 ) { if (cicscolor < COL_YELLOW) cicscolor = COL_YELLOW; cicsok=0; sprintf(tempresult,"&yellow CICS system %s not responding, removed\n", cicsappl); addtobuffer(upmsg, tempresult); } /* Get CICS thresholds for this application ID. */ get_cics_thresholds(hinfo, clientclass, cicsappl, &dsayel, &dsared, &edsayel, &edsared); /* The threshold of the DSA values for each CICS must be checked in this loop. */ if (dsapct > dsared) { if (cicscolor < COL_RED) cicscolor = COL_RED; cicsok=0; sprintf(tempresult,"&red %s DSA Utilization is CRITICAL\n", cicsappl); addtobuffer(upmsg, tempresult); } else if (dsapct > dsayel) { if (cicscolor < COL_YELLOW) cicscolor = COL_YELLOW; cicsok=0; sprintf(tempresult,"&yellow %s DSA Utilization is HIGH\n", cicsappl); addtobuffer(upmsg, tempresult); } if (edsapct > edsared) { if (cicscolor < COL_RED) cicscolor = COL_RED; cicsok=0; sprintf(tempresult,"&red %s EDSA Utilization is CRITICAL\n", cicsappl); addtobuffer(upmsg, tempresult); } else if (edsapct > edsayel) { if (cicscolor < COL_YELLOW) cicscolor = COL_YELLOW; cicsok=0; sprintf(tempresult,"&yellow %s EDSA Utilization is HIGH\n", cicsappl); addtobuffer(upmsg, tempresult); } init_status(cicscolor); cicsentry=strtok(NULL, "\n"); } } sprintf(msgline, "status %s.cics %s %s %s\n", commafy(hostname), colorname(cicscolor), (timestr ? timestr : ""), ( (cicsok==1) ? cicsokmsg : cicsnotokmsg) ); addtostatus(msgline); if (STRBUFLEN(upmsg)) { addtostrstatus(upmsg); } if (STRBUFLEN(cicsmsg)) { addtostrstatus(headline); addtostrstatus(cicsmsg); addtostatus("\n"); } if (fromline && !localmode) addtostatus(fromline); finish_status(); freestrbuffer(headline); freestrbuffer(upmsg); freestrbuffer(cicsmsg); } static void zvse_jobs_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *psstr) { int pscolor = COL_GREEN; int pchecks; int cmdofs = -1; char msgline[4096]; strbuffer_t *monmsg; static strbuffer_t *countdata = NULL; int anycountdata = 0; char *group; if (!want_msgtype(hinfo, MSG_PROCS)) return; if (!psstr) return; if (!countdata) countdata = newstrbuffer(0); clearalertgroups(); monmsg = newstrbuffer(0); sprintf(msgline, "data %s.proccounts\n", commafy(hostname)); addtobuffer(countdata, msgline); cmdofs = 0; /* Command offset for z/VSE isn't necessary */ pchecks = clear_process_counts(hinfo, clientclass); if (pchecks == 0) { /* Nothing to check */ sprintf(msgline, "&%s No process checks defined\n", colorname(noreportcolor)); addtobuffer(monmsg, msgline); pscolor = noreportcolor; } else if (cmdofs >= 0) { /* Count how many instances of each monitored process is running */ char *pname, *pid, *bol, *nl; int pcount, pmin, pmax, pcolor, ptrack; bol = psstr; while (bol) { nl = strchr(bol, '\n'); /* Take care - the ps output line may be shorter than what we look at */ if (nl) { *nl = '\0'; if ((nl-bol) > cmdofs) add_process_count(bol+cmdofs); *nl = '\n'; bol = nl+1; } else { if (strlen(bol) > cmdofs) add_process_count(bol+cmdofs); bol = NULL; } } /* Check the number found for each monitored process */ while ((pname = check_process_count(&pcount, &pmin, &pmax, &pcolor, &pid, &ptrack, &group)) != NULL) { char limtxt[1024]; if (pmax == -1) { if (pmin > 0) sprintf(limtxt, "%d or more", pmin); else if (pmin == 0) sprintf(limtxt, "none"); } else { if (pmin > 0) sprintf(limtxt, "between %d and %d", pmin, pmax); else if (pmin == 0) sprintf(limtxt, "at most %d", pmax); } if (pcolor == COL_GREEN) { sprintf(msgline, "&green %s (found %d, req. %s)\n", pname, pcount, limtxt); addtobuffer(monmsg, msgline); } else { if (pcolor > pscolor) pscolor = pcolor; sprintf(msgline, "&%s %s (found %d, req. %s)\n", colorname(pcolor), pname, pcount, limtxt); addtobuffer(monmsg, msgline); addalertgroup(group); } if (ptrack) { /* Save the count data for later DATA message to track process counts */ if (!pid) pid = "default"; sprintf(msgline, "%s:%u\n", pid, pcount); addtobuffer(countdata, msgline); anycountdata = 1; } } } else { pscolor = COL_YELLOW; sprintf(msgline, "&yellow Expected string not found in ps output header\n"); addtobuffer(monmsg, msgline); } /* Now we know the result, so generate a status message */ init_status(pscolor); group = getalertgroups(); if (group) sprintf(msgline, "status/group:%s ", group); else strcpy(msgline, "status "); addtostatus(msgline); sprintf(msgline, "%s.procs %s %s - Processes %s\n", commafy(hostname), colorname(pscolor), (timestr ? timestr : ""), ((pscolor == COL_GREEN) ? "OK" : "NOT ok")); addtostatus(msgline); /* And add the info about what's wrong */ if (STRBUFLEN(monmsg)) { addtostrstatus(monmsg); addtostatus("\n"); } /* And the full list of jobs for those who want it */ if (pslistinprocs) { /* * Format the list of virtual machines into four per line, * this list could be fairly long. */ char *tmpstr, *tok; /* Make a copy of psstr, strtok() will be changing it */ tmpstr = strdup(psstr); /* Use strtok() to split string into pieces delimited by newline */ tok = strtok(tmpstr, "\n"); while (tok) { sprintf(msgline, "%s\n", tok); addtostatus(msgline); tok = strtok(NULL, "\n"); } free(tmpstr); } if (fromline && !localmode) addtostatus(fromline); finish_status(); freestrbuffer(monmsg); if (anycountdata) combo_add(countdata); clearstrbuffer(countdata); } static void zvse_memory_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *memstr) { int usedyellow, usedred; /* Thresholds for total used system memory */ int sysmemok=1; long totmem, availmem; float pctavail, pctused; char memorystr[1024]; int memorycolor = COL_GREEN; char memokmsg[]="Memory OK"; char memnotokmsg[]="Memory Not OK"; char msgline[4096]; strbuffer_t *upmsg; if (!memstr) return; upmsg = newstrbuffer(0); /* * The message is just two values, the total system memory and * the available memory; both values are in K. * tttttt aaaaaa */ sscanf(memstr, "%ld %ld", &totmem, &availmem); pctavail = ((float)availmem / (float)totmem) * 100; pctused = 100 - pctavail; sprintf(memorystr, "z/VSE VSIZE Utilization %3.1f%%\nMemory Allocated %ldK, Memory Available %ldK\n", pctused, totmem, availmem); get_zvsevsize_thresholds(hinfo, clientclass, &usedyellow, &usedred); if (pctused > (float)usedred) { memorycolor = COL_RED; sysmemok=0; addtobuffer(upmsg, "&red VSIZE Utilization is CRITICAL\n"); } else if (pctused > (float)usedyellow) { memorycolor = COL_YELLOW; sysmemok=0; addtobuffer(upmsg, "&yellow VSIZE Utilization is HIGH\n"); } init_status(memorycolor); sprintf(msgline, "status %s.memory %s %s %s\n%s", commafy(hostname), colorname(memorycolor), (timestr ? timestr : ""), ( (sysmemok==1) ? memokmsg : memnotokmsg ), memorystr); addtostatus(msgline); if (STRBUFLEN(upmsg)) { addtostrstatus(upmsg); addtostatus("\n"); } if (fromline && !localmode) addtostatus(fromline); finish_status(); freestrbuffer(upmsg); } static void zvse_getvis_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *gvstr) { char *q; int gv24yel, gv24red, gvanyyel, gvanyred; /* Thresholds for getvis */ int getvisok=1; float used24p, usedanyp; char jinfo[11], pid[4], jobname[9]; int size24, used24, free24, sizeany, usedany, freeany; char *getvisentry = NULL; char tempresult[128]; char getvisresult[128]; char msgline[4096]; int memorycolor = COL_GREEN; char getvisokmsg[]="Getvis OK"; char getvisnotokmsg[]="Getvis Not OK"; strbuffer_t *getvismsg; strbuffer_t *upmsg; strbuffer_t *headline; if (!gvstr) return; getvismsg = newstrbuffer(0); upmsg = newstrbuffer(0); headline = newstrbuffer(0); /* * The getvis message is a table if the partitions requested including the SVA. * The format of the table is: * * Partition Used/24 Free/24 Used/Any Free/Any * SVA 748 1500 2056 5604 * F1 824 264 824 264 * Z1-CICSICCF 7160 3844 27516 4992 * O1-CICS1 5912 5092 31584 19352 */ addtobuffer(headline, "z/VSE Getvis Map\nPID Jobname Size24 Used24 Free24 SizeAny UsedAny FreeAny Used24% UsedAny%\n"); getvisentry=strtok(gvstr, "\n"); getvisentry=strtok(NULL, "\n"); /* Skip heading line */ while (getvisentry != NULL) { sscanf(getvisentry, "%s %d %d %d %d", jinfo, &used24, &free24, &usedany, &freeany); q = strchr(jinfo, '-'); /* Check if jobname passed */ if (q) { strncpy(pid, jinfo, 2); /* Copy partition ID */ q++; /* Increment pointer */ strcpy(jobname,q); /* Copy jobname */ } else { strcpy(pid,jinfo); /* Just copy jinfo into partition ID */ strcpy(jobname, "- "); /* Jobname placeholder */ } size24 = used24 + free24; sizeany = usedany + freeany; used24p = ( (float)used24 / (float)size24 ) * 100; usedanyp = ( (float)usedany / (float)sizeany ) * 100; sprintf(getvisresult,"%-3s %-8s %6d %6d %6d %6d %6d %6d %3.0f %3.0f\n", pid, jobname, size24, used24, free24, sizeany, usedany, freeany, used24p, usedanyp); get_zvsegetvis_thresholds(hinfo, clientclass, pid, &gv24yel, &gv24red, &gvanyyel, &gvanyred); if (used24p > (float)gv24red) { memorycolor = COL_RED; getvisok=0; sprintf(tempresult,"&red 24-bit Getvis utilization for %s is CRITICAL\n", pid); addtobuffer(upmsg, tempresult); } else if (used24p > (float)gv24yel) { memorycolor = COL_YELLOW; getvisok=0; sprintf(tempresult,"&yellow 24-bit Getvis utilization for %s is HIGH\n", pid); addtobuffer(upmsg, tempresult); } if (usedanyp > (float)gvanyred) { memorycolor = COL_RED; getvisok=0; sprintf(tempresult,"&red Any Getvis utilization for %s is CRITICAL\n", pid); addtobuffer(upmsg, tempresult); } else if (usedanyp > (float)gvanyyel) { memorycolor = COL_YELLOW; getvisok=0; sprintf(tempresult,"&yellow Any Getvis utilization for %s is HIGH\n", pid); addtobuffer(upmsg, tempresult); } addtobuffer(getvismsg, getvisresult); getvisentry=strtok(NULL, "\n"); } init_status(memorycolor); sprintf(msgline, "status %s.getvis %s %s %s\n", commafy(hostname), colorname(memorycolor), (timestr ? timestr : ""), ( (getvisok==1) ? getvisokmsg : getvisnotokmsg ) ); addtostatus(msgline); if (STRBUFLEN(upmsg)) { addtostrstatus(upmsg); addtostatus("\n"); } if (STRBUFLEN(getvismsg)) { addtostrstatus(headline); addtostrstatus(getvismsg); addtostatus("\n"); } if (fromline && !localmode) addtostatus(fromline); finish_status(); freestrbuffer(headline); freestrbuffer(upmsg); freestrbuffer(getvismsg); } void zvse_nparts_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *npartstr) { char npdispstr[256]; long nparts, runparts, partsavail; int npartsyellow, npartsred; float partutil; int npartcolor = COL_GREEN; char msgline[4096]; strbuffer_t *upmsg; if (!npartstr) return; sscanf(npartstr, "%ld %ld", &nparts, &runparts); /* * The nparts message is two values that indicate the maximum number of partitions * configured in the system (based on the NPARTS value in the IPL proc) and * the number of partitions currently running jobs: * The format of the data is: * * nnnnnnn mmmmmmm * */ partsavail = nparts - runparts; partutil = ((float)runparts / (float)nparts) * 100; get_asid_thresholds(hinfo, clientclass, &npartsyellow, &npartsred); upmsg = newstrbuffer(0); if ((int)partutil > npartsred) { if (npartcolor < COL_RED) npartcolor = COL_RED; addtobuffer(upmsg, "&red NPARTS Utilization is CRITICAL\n"); } else if ((int)partutil > npartsyellow) { if (npartcolor < COL_YELLOW) npartcolor = COL_YELLOW; addtobuffer(upmsg, "&yellow NPARTS Utilization is HIGH\n"); } *npdispstr = '\0'; sprintf(npdispstr, "Nparts: %8ld Free: %8ld Used: %8ld %3.1f\n",nparts,partsavail,runparts,partutil); init_status(npartcolor); sprintf(msgline, "status %s.nparts %s %s\n%s", commafy(hostname), colorname(npartcolor), (timestr ? timestr : ""), npdispstr); addtostatus(msgline); if (STRBUFLEN(upmsg)) { addtostrstatus(upmsg); addtostatus("\n"); } if (fromline && !localmode) addtostatus(fromline); finish_status(); freestrbuffer(upmsg); } void handle_zvse_client(char *hostname, char *clienttype, enum ostype_t os, void *hinfo, char *sender, time_t timestamp, char *clientdata) { char *timestr; char *cpuutilstr; char *pagingstr; char *cicsstr; char *uptimestr; char *dfstr; char *jobsstr; /* z/VSE Running jobs */ char *portsstr; char *memstr; /* System Memory data */ char *gvstr; /* GETVIS data */ char *npartstr; /* Num Parts */ char fromline[1024]; sprintf(fromline, "\nStatus message received from %s\n", sender); splitmsg(clientdata); timestr = getdata("date"); uptimestr = getdata("uptime"); cpuutilstr = getdata("cpu"); pagingstr = getdata("paging"); cicsstr = getdata("cics"); dfstr = getdata("df"); jobsstr = getdata("jobs"); portsstr = getdata("ports"); memstr = getdata("memory"); gvstr = getdata("getvis"); npartstr = getdata("nparts"); zvse_cpu_report(hostname, clienttype, os, hinfo, fromline, timestr, cpuutilstr, uptimestr); zvse_paging_report(hostname, clienttype, os, hinfo, fromline, timestr, pagingstr); zvse_cics_report(hostname, clienttype, os, hinfo, fromline, timestr, cicsstr); zvse_jobs_report(hostname, clienttype, os, hinfo, fromline, timestr, jobsstr); zvse_memory_report(hostname, clienttype, os, hinfo, fromline, timestr, memstr); zvse_getvis_report(hostname, clienttype, os, hinfo, fromline, timestr, gvstr); zvse_nparts_report(hostname, clienttype, os, hinfo, fromline, timestr, npartstr); unix_disk_report(hostname, clienttype, os, hinfo, fromline, timestr, "Available", "Cap", "Mounted", dfstr); unix_ports_report(hostname, clienttype, os, hinfo, fromline, timestr, 3, 4, 5, portsstr); linecount_report(hostname, clienttype, os, hinfo, fromline, timestr); deltacount_report(hostname, clienttype, os, hinfo, fromline, timestr); splitmsg_done(); } xymon-4.3.28/xymond/client/sco_sv.c0000664000076400007640000001106212654207223017451 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Client backend module for SCO_SV */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* Copyright (C) 2006-2008 Charles Goyard */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char sco_sv_rcsid[] = "$Id: sco_sv.c 7886 2016-02-02 20:16:19Z jccleaver $"; void handle_sco_sv_client(char *hostname, char *clienttype, enum ostype_t os, void *hinfo, char *sender, time_t timestamp, char *clientdata) { char *timestr; char *uptimestr; char *clockstr; char *msgcachestr; char *whostr; char *psstr; char *topstr; char *dfstr; char *freememstr; char *memsizestr; char *swapstr; char *msgsstr; char *netstatstr; char *vmstatstr; char *ifstatstr; char *portsstr; char fromline[1024]; sprintf(fromline, "\nStatus message received from %s\n", sender); splitmsg(clientdata); timestr = getdata("date"); uptimestr = getdata("uptime"); clockstr = getdata("clock"); msgcachestr = getdata("msgcache"); whostr = getdata("who"); psstr = getdata("ps"); topstr = getdata("top"); dfstr = getdata("df"); memsizestr = getdata("memsize"); freememstr = getdata("freemem"); swapstr = getdata("swap"); msgsstr = getdata("msgs"); netstatstr = getdata("netstat"); ifstatstr = getdata("ifstat"); vmstatstr = getdata("vmstat"); portsstr = getdata("ports"); unix_cpu_report(hostname, clienttype, os, hinfo, fromline, timestr, uptimestr, clockstr, msgcachestr, whostr, 0, psstr, 0, topstr); unix_disk_report(hostname, clienttype, os, hinfo, fromline, timestr, "Available", "Capacity", "Mounted", dfstr); unix_procs_report(hostname, clienttype, os, hinfo, fromline, timestr, "COMMAND", NULL, psstr); unix_ports_report(hostname, clienttype, os, hinfo, fromline, timestr, 3, 4, 5, portsstr); msgs_report(hostname, clienttype, os, hinfo, fromline, timestr, msgsstr); file_report(hostname, clienttype, os, hinfo, fromline, timestr); linecount_report(hostname, clienttype, os, hinfo, fromline, timestr); deltacount_report(hostname, clienttype, os, hinfo, fromline, timestr); unix_netstat_report(hostname, clienttype, os, hinfo, fromline, timestr, netstatstr); unix_ifstat_report(hostname, clienttype, os, hinfo, fromline, timestr, ifstatstr); unix_vmstat_report(hostname, clienttype, os, hinfo, fromline, timestr, vmstatstr); if(freememstr && memsizestr && swapstr) { long memphystotal, memphysfree, memswaptotal, memswapfree; char *p; memphystotal = memphysfree = 0; memphystotal = (atol(memsizestr) / 1048576); if(sscanf(freememstr, "%*s %ld %ld %*d %*d", &memphysfree, &memswapfree) == 2) memphysfree /= 256; /* comes in 4kb pages */ else memphysfree = -1; memswaptotal = memswapfree = 0; if (swapstr) { p = strchr(swapstr, '\n'); /* Skip the header line */ while (p) { long stot, sfree; char *bol; bol = p+1; p = strchr(bol, '\n'); if (p) *p = '\0'; if (sscanf(bol, "%*s %*s %*d %ld %ld", &stot, &sfree) == 2) { memswaptotal += stot; memswapfree += sfree; } if (p) *p = '\n'; } memswaptotal /= 2048 ; memswapfree /= 2048; } unix_memory_report(hostname, clienttype, os, hinfo, fromline, timestr, memphystotal, (memphystotal - memphysfree), -1, -1, memswaptotal, (memswaptotal - memswapfree)); } splitmsg_done(); } xymon-4.3.28/xymond/client/irix.c0000664000076400007640000001052712654207223017135 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Client backend module for IRIX */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char irix_rcsid[] = "$Id: irix.c 7886 2016-02-02 20:16:19Z jccleaver $"; void handle_irix_client(char *hostname, char *clienttype, enum ostype_t os, void *hinfo, char *sender, time_t timestamp, char *clientdata) { static pcre *memptn = NULL; char *timestr; char *uptimestr; char *clockstr; char *msgcachestr; char *whostr; char *psstr; char *topstr; char *dfstr; char *msgsstr; char *netstatstr; // char *sarstr; char *ifstatstr; char *portsstr; char fromline[1024]; sprintf(fromline, "\nStatus message received from %s\n", sender); splitmsg(clientdata); timestr = getdata("date"); uptimestr = getdata("uptime"); clockstr = getdata("clock"); msgcachestr = getdata("msgcache"); whostr = getdata("who"); psstr = getdata("ps"); topstr = getdata("top"); dfstr = getdata("df"); msgsstr = getdata("msgs"); netstatstr = getdata("netstat"); ifstatstr = getdata("ifstat"); // sarstr = getdata("sar"); portsstr = getdata("ports"); unix_cpu_report(hostname, clienttype, os, hinfo, fromline, timestr, uptimestr, clockstr, msgcachestr, whostr, 0, psstr, 0, topstr); unix_disk_report(hostname, clienttype, os, hinfo, fromline, timestr, "Available", "Capacity", "Mounted", dfstr); unix_procs_report(hostname, clienttype, os, hinfo, fromline, timestr, "COMMAND", NULL, psstr); unix_ports_report(hostname, clienttype, os, hinfo, fromline, timestr, 3, 4, 5, portsstr); msgs_report(hostname, clienttype, os, hinfo, fromline, timestr, msgsstr); file_report(hostname, clienttype, os, hinfo, fromline, timestr); linecount_report(hostname, clienttype, os, hinfo, fromline, timestr); deltacount_report(hostname, clienttype, os, hinfo, fromline, timestr); unix_netstat_report(hostname, clienttype, os, hinfo, fromline, timestr, netstatstr); unix_ifstat_report(hostname, clienttype, os, hinfo, fromline, timestr, ifstatstr); /* unix_sar_report(hostname, clienttype, os, hinfo, fromline, timestr, sarstr); */ if (topstr) { char *memline, *eoln = NULL; int res; int ovector[20]; char w[20]; long memphystotal = -1, memphysused = -1, memphysfree = 0, memacttotal = -1, memactused = -1, memactfree = -1, memswaptotal = -1, memswapused = -1, memswapfree = 0; if (!memptn) { memptn = compileregex("^Memory: (\\d+)M max, (\\d+)M avail, (\\d+)M free, (\\d+)M swap, (\\d+)M free swap"); } memline = strstr(topstr, "\nMemory:"); if (memline) { memline++; eoln = strchr(memline, '\n'); if (eoln) *eoln = '\0'; res = pcre_exec(memptn, NULL, memline, strlen(memline), 0, 0, ovector, (sizeof(ovector)/sizeof(int))); } else res = -1; if (res > 1) { pcre_copy_substring(memline, ovector, res, 1, w, sizeof(w)); memphystotal = atol(w); } if (res > 2) { pcre_copy_substring(memline, ovector, res, 2, w, sizeof(w)); memactfree = atol(w); memacttotal = memphystotal; memactused = memphystotal - memactfree; } if (res > 3) { pcre_copy_substring(memline, ovector, res, 3, w, sizeof(w)); memphysfree = atol(w); memphysused = memphystotal - memphysfree; } if (res > 4) { pcre_copy_substring(memline, ovector, res, 4, w, sizeof(w)); memswaptotal = atol(w); } if (res > 5) { pcre_copy_substring(memline, ovector, res, 5, w, sizeof(w)); memswapfree = atol(w); } memswapused = memswaptotal - memswapfree; if (eoln) *eoln = '\n'; unix_memory_report(hostname, clienttype, os, hinfo, fromline, timestr, memphystotal, memphysused, memacttotal, memactused, memswaptotal, memswapused); } splitmsg_done(); } xymon-4.3.28/xymond/xymond_hostdata.c0000664000076400007640000002020712536407005020104 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* This Xymon worker module saves the client messages that arrive on the */ /* CLICHG channel, for use when looking at problems with a host. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: xymond_hostdata.c 7669 2015-06-11 22:39:01Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" #include "xymond_worker.h" #include #define MAX_META 20 /* The maximum number of meta-data items in a message */ typedef struct savetimes_t { char *hostname; time_t tstamp[12]; } savetimes_t; void * savetimes; static char *clientlogdir = NULL; int nextfscheck = 0; void sig_handler(int signum) { /* * Why this? Because we must have our own signal handler installed to call wait() */ switch (signum) { case SIGCHLD: break; case SIGHUP: nextfscheck = 0; break; } } void update_locator_hostdata(char *id) { DIR *fd; struct dirent *d; fd = opendir(clientlogdir); if (fd == NULL) { errprintf("Cannot scan directory %s\n", clientlogdir); return; } while ((d = readdir(fd)) != NULL) { if (*(d->d_name) == '.') continue; locator_register_host(d->d_name, ST_HOSTDATA, id); } closedir(fd); } int main(int argc, char *argv[]) { char *msg; int running; int argi, seq; int recentperiod = 3600; int maxrecentcount = 5; int logdirfull = 0; int minlogspace = 5; struct sigaction sa; /* Handle program options. */ for (argi = 1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--logdir=")) { clientlogdir = strchr(argv[argi], '=')+1; } else if (argnmatch(argv[argi], "--recent-period=")) { char *p = strchr(argv[argi], '='); recentperiod = 60*atoi(p+1); } else if (argnmatch(argv[argi], "--recent-count=")) { char *p = strchr(argv[argi], '='); maxrecentcount = atoi(p+1); } else if (argnmatch(argv[argi], "--minimum-free=")) { minlogspace = atoi(strchr(argv[argi], '=')+1); } else if (strcmp(argv[argi], "--debug") == 0) { /* * A global "debug" variable is available. If * it is set, then "dbgprintf()" outputs debug messages. */ debug = 1; } else if (net_worker_option(argv[argi])) { /* Handled in the subroutine */ } } if (clientlogdir == NULL) clientlogdir = xgetenv("CLIENTLOGS"); if (clientlogdir == NULL) { clientlogdir = (char *)malloc(strlen(xgetenv("XYMONVAR")) + 10); sprintf(clientlogdir, "%s/hostdata", xgetenv("XYMONVAR")); } save_errbuf = 0; /* Do the network stuff if needed */ net_worker_run(ST_HOSTDATA, LOC_STICKY, update_locator_hostdata); setup_signalhandler("xymond_hostdata"); memset(&sa, 0, sizeof(sa)); sa.sa_handler = sig_handler; signal(SIGCHLD, SIG_IGN); sigaction(SIGHUP, &sa, NULL); signal(SIGPIPE, SIG_DFL); savetimes = xtreeNew(strcasecmp); running = 1; while (running) { char *eoln, *restofmsg, *p; char *metadata[MAX_META+1]; int metacount; msg = get_xymond_message(C_CLICHG, "xymond_hostdata", &seq, NULL); if (msg == NULL) { /* * get_xymond_message will return NULL if xymond_channel closes * the input pipe. We should shutdown when that happens. */ running = 0; continue; } if (nextfscheck < gettimer()) { logdirfull = (chkfreespace(clientlogdir, minlogspace, minlogspace) != 0); if (logdirfull) errprintf("Hostdata directory %s has less than %d%% free space - disabling save of data for 5 minutes\n", clientlogdir, minlogspace); nextfscheck = gettimer() + 300; } /* Split the message in the first line (with meta-data), and the rest */ eoln = strchr(msg, '\n'); if (eoln) { *eoln = '\0'; restofmsg = eoln+1; } else { restofmsg = ""; } metacount = 0; memset(&metadata, 0, sizeof(metadata)); p = gettok(msg, "|"); while (p && (metacount < MAX_META)) { metadata[metacount++] = p; p = gettok(NULL, "|"); } metadata[metacount] = NULL; if (strncmp(metadata[0], "@@clichg", 8) == 0) { xtreePos_t handle; savetimes_t *itm; int i, recentcount; time_t now = gettimer(); char hostdir[PATH_MAX]; char fn[PATH_MAX]; FILE *fd; /* metadata[3] is the hostname */ handle = xtreeFind(savetimes, metadata[3]); if (handle != xtreeEnd(savetimes)) { itm = (savetimes_t *)xtreeData(savetimes, handle); } else { itm = (savetimes_t *)calloc(1, sizeof(savetimes_t)); itm->hostname = strdup(metadata[3]); xtreeAdd(savetimes, itm->hostname, itm); } /* See how many times we've saved the hostdata recently (within the past 'recentperiod' seconds) */ for (i=0, recentcount=0; ((i < 12) && (itm->tstamp[i] > (now - recentperiod))); i++) recentcount++; /* If it's been saved less than 'maxrecentcount' times, then save it. Otherwise just drop it */ if (!logdirfull && (recentcount < maxrecentcount)) { int written, closestatus, ok = 1; for (i = 10; (i > 0); i--) itm->tstamp[i+1] = itm->tstamp[i]; itm->tstamp[0] = now; sprintf(hostdir, "%s/%s", clientlogdir, metadata[3]); mkdir(hostdir, S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH); sprintf(fn, "%s/%s", hostdir, metadata[4]); fd = fopen(fn, "w"); if (fd == NULL) { errprintf("Cannot create file %s: %s\n", fn, strerror(errno)); continue; } written = fwrite(restofmsg, 1, strlen(restofmsg), fd); if (written != strlen(restofmsg)) { errprintf("Cannot write hostdata file %s: %s\n", fn, strerror(errno)); closestatus = fclose(fd); /* Ignore any close errors */ ok = 0; } else { closestatus = fclose(fd); if (closestatus != 0) { errprintf("Cannot write hostdata file %s: %s\n", fn, strerror(errno)); ok = 0; } } if (!ok) remove(fn); } } /* * A "shutdown" message is sent when the master daemon * terminates. The child workers should shutdown also. */ else if (strncmp(metadata[0], "@@shutdown", 10) == 0) { running = 0; continue; } else if (strncmp(metadata[0], "@@idle", 6) == 0) { /* Ignored */ continue; } /* * A "logrotate" message is sent when the Xymon logs are * rotated. The child workers must re-open their logfiles, * typically stdin and stderr - the filename is always * provided in the XYMONCHANNEL_LOGFILENAME environment. */ else if (strncmp(metadata[0], "@@logrotate", 11) == 0) { char *fn = xgetenv("XYMONCHANNEL_LOGFILENAME"); if (fn && strlen(fn)) { reopen_file(fn, "a", stdout); reopen_file(fn, "a", stderr); } continue; } else if ((metacount > 3) && (strncmp(metadata[0], "@@drophost", 10) == 0)) { /* @@drophost|timestamp|sender|hostname */ char hostdir[PATH_MAX]; snprintf(hostdir, sizeof(hostdir), "%s/%s", clientlogdir, basename(metadata[3])); dropdirectory(hostdir, 1); } else if ((metacount > 4) && (strncmp(metadata[0], "@@renamehost", 12) == 0)) { /* @@renamehost|timestamp|sender|hostname|newhostname */ char oldhostdir[PATH_MAX], newhostdir[PATH_MAX]; snprintf(oldhostdir, sizeof(oldhostdir), "%s/%s", clientlogdir, basename(metadata[3])); snprintf(newhostdir, sizeof(newhostdir), "%s/%s", clientlogdir, basename(metadata[4])); rename(oldhostdir, newhostdir); if (net_worker_locatorbased()) locator_rename_host(metadata[3], metadata[4], ST_HOSTDATA); } else if (strncmp(metadata[0], "@@reload", 8) == 0) { /* Do nothing */ } } return 0; } xymon-4.3.28/xymond/xymond_capture.c0000664000076400007640000002547712603243142017751 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* xymond worker module, to capture status messages for a particulr host */ /* or test, or data type. This is fed from the status- or data-channel, and */ /* simply logs the data received to a file. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: xymond_capture.c 7678 2015-10-01 14:42:42Z jccleaver $"; #include #include #include #include #include #include #include #include "libxymon.h" #include "xymond_worker.h" #define MAX_META 20 /* The maximum number of meta-data items in a message */ int main(int argc, char *argv[]) { char *msg; int running; int argi, seq; struct timespec *timeout = NULL; pcre *hostexp = NULL; pcre *exhostexp = NULL; pcre *testexp = NULL; pcre *extestexp = NULL; pcre *colorexp = NULL; const char *errmsg = NULL; int errofs = 0; FILE *logfd = stdout; int batchtimeout = 30; char *batchcmd = NULL; strbuffer_t *batchbuf = NULL; time_t lastmsgtime = 0; int hostnameitem = 4, testnameitem = 5, coloritem = 7; /* Handle program options. */ for (argi = 1; (argi < argc); argi++) { if (strcmp(argv[argi], "--debug") == 0) { /* * A global "debug" variable is available. If * it is set, then "dbgprintf()" outputs debug messages. */ debug = 1; } else if (strncmp(argv[argi], "--timeout=", 10) == 0) { /* * You can have a timeout when waiting for new * messages. If it happens, you will get a "@@idle\n" * message with sequence number 0. * If you don't want a timeout, just pass a NULL for the timeout parameter. */ timeout = (struct timespec *)(malloc(sizeof(struct timespec))); timeout->tv_sec = (atoi(argv[argi]+10)); timeout->tv_nsec = 0; } else if (strcmp(argv[argi], "--client") == 0) { hostnameitem = 3; testnameitem = 4; errprintf("Expecting to be fed from 'client' channel\n"); } else if (argnmatch(argv[argi], "--hosts=")) { char *exp = strchr(argv[argi], '=') + 1; hostexp = pcre_compile(exp, PCRE_CASELESS, &errmsg, &errofs, NULL); if (hostexp == NULL) printf("Invalid expression '%s'\n", exp); } else if (argnmatch(argv[argi], "--exhosts=")) { char *exp = strchr(argv[argi], '=') + 1; exhostexp = pcre_compile(exp, PCRE_CASELESS, &errmsg, &errofs, NULL); if (exhostexp == NULL) printf("Invalid expression '%s'\n", exp); } else if (argnmatch(argv[argi], "--tests=")) { char *exp = strchr(argv[argi], '=') + 1; testexp = pcre_compile(exp, PCRE_CASELESS, &errmsg, &errofs, NULL); if (testexp == NULL) printf("Invalid expression '%s'\n", exp); } else if (argnmatch(argv[argi], "--extests=")) { char *exp = strchr(argv[argi], '=') + 1; extestexp = pcre_compile(exp, PCRE_CASELESS, &errmsg, &errofs, NULL); if (extestexp == NULL) printf("Invalid expression '%s'\n", exp); } else if (argnmatch(argv[argi], "--colors=")) { char *exp = strchr(argv[argi], '=') + 1; colorexp = pcre_compile(exp, PCRE_CASELESS, &errmsg, &errofs, NULL); if (colorexp == NULL) printf("Invalid expression '%s'\n", exp); } else if (argnmatch(argv[argi], "--outfile=")) { char *fn = strchr(argv[argi], '=') + 1; logfd = fopen(fn, "a"); if (logfd == NULL) { printf("Cannot open logfile %s: %s\n", fn, strerror(errno)); logfd = stdout; } } else if (argnmatch(argv[argi], "--batch-timeout=")) { char *p = strchr(argv[argi], '='); batchtimeout = atoi(p+1); timeout = (struct timespec *)(malloc(sizeof(struct timespec))); timeout->tv_sec = batchtimeout; timeout->tv_nsec = 0; } else if (argnmatch(argv[argi], "--batch-command=")) { char *p = strchr(argv[argi], '='); batchcmd = strdup(p+1); batchbuf = newstrbuffer(0); } else { printf("Unknown option %s\n", argv[argi]); printf("Usage: %s [--hosts=EXP] [--tests=EXP] [--exhosts=EXP] [--extests=EXP] [--color=EXP] [--outfile=FILENAME] [--batch-timeout=N] [--batch-command=COMMAND]\n", argv[0]); return 0; } } signal(SIGCHLD, SIG_IGN); running = 1; while (running) { char *eoln, *restofmsg, *p; char *metadata[MAX_META+1]; int metacount; msg = get_xymond_message(C_LAST, argv[0], &seq, timeout); if (msg == NULL) { /* * get_xymond_message will return NULL if xymond_channel closes * the input pipe. We should shutdown when that happens. */ running = 0; continue; } /* * Now we have a message. So do something with it. * * The first line of the message is always a '|' separated * list of meta-data about the message. After the first * line, the content varies by channel. */ /* Split the message in the first line (with meta-data), and the rest */ eoln = strchr(msg, '\n'); if (eoln) { *eoln = '\0'; restofmsg = eoln+1; } else { restofmsg = ""; } /* * Now parse the meta-data into elements. * We use our own "gettok()" routine which works * like strtok(), but can handle empty elements. */ metacount = 0; memset(&metadata, 0, sizeof(metadata)); p = gettok(msg, "|"); while (p && (metacount < MAX_META)) { metadata[metacount++] = p; p = gettok(NULL, "|"); } metadata[metacount] = NULL; /* * A "shutdown" message is sent when the master daemon * terminates. The child workers should shutdown also. */ if (strncmp(metadata[0], "@@shutdown", 10) == 0) { printf("Shutting down\n"); running = 0; continue; } /* * A "logrotate" message is sent when the Xymon logs are * rotated. The child workers must re-open their logfiles, * typically stdin and stderr - the filename is always * provided in the XYMONDHANNEL_LOGFILENAME environment. */ else if (strncmp(metadata[0], "@@logrotate", 11) == 0) { char *fn = xgetenv("XYMONCHANNEL_LOGFILENAME"); if (fn && strlen(fn)) { reopen_file(fn, "a", stdout); reopen_file(fn, "a", stderr); } continue; } /* * A "reload" means the hosts.cfg file has changed. */ else if (strncmp(metadata[0], "@@reload", 8) == 0) { /* Nothing ... right now */ } /* * An "idle" message appears when get_xymond_message() * exceeds the timeout setting (ie. you passed a timeout * value). This allows your worker module to perform * some internal processing even though no messages arrive. */ else if (strncmp(metadata[0], "@@idle", 6) == 0) { dbgprintf("Got an 'idle' message\n"); } /* * The "drophost", "droptest", "renamehost" and "renametst" * indicates that a host/test was deleted or renamed. If the * worker module maintains some internal storage (in memory * or persistent file-storage), it should act on these * messages to maintain data consistency. */ else if ((metacount > 3) && (strncmp(metadata[0], "@@drophost", 10) == 0)) { dbgprintf("Got a 'drophost' message for host '%s'\n", metadata[3]); } else if ((metacount > 3) && (strncmp(metadata[0], "@@dropstate", 11) == 0)) { dbgprintf("Got a 'dropstate' message for host '%s'\n", metadata[3]); } else if ((metacount > 4) && (strncmp(metadata[0], "@@droptest", 10) == 0)) { dbgprintf("Got a 'droptest' message for host '%s' test '%s'\n", metadata[3], metadata[4]); } else if ((metacount > 4) && (strncmp(metadata[0], "@@renamehost", 12) == 0)) { dbgprintf("Got a 'renamehost' message for host '%s' -> '%s'\n", metadata[3], metadata[4]); } else if ((metacount > 5) && (strncmp(metadata[0], "@@renametest", 12) == 0)) { dbgprintf("Got a 'renametest' message for host '%s' test '%s' -> '%s'\n", metadata[3], metadata[4], metadata[5]); } /* * Process this message. */ else { int ovector[30]; int match, i; char *hostname = metadata[hostnameitem]; char *testname = metadata[testnameitem]; char *color = metadata[coloritem]; /* See if we should handle the batched messages we've got */ if (batchcmd && ((lastmsgtime + batchtimeout) < gettimer()) && (STRBUFLEN(batchbuf) > 0)) { pid_t childpid = fork(); int childres = 0; if (childpid < 0) { /* Fork failed! */ errprintf("Fork failed: %s\n", strerror(errno)); } else if (childpid == 0) { /* Child */ FILE *cmdpipe = popen(batchcmd, "w"); if (cmdpipe) { /* Write the data to the batch command pipe */ int n, bytesleft = STRBUFLEN(batchbuf); char *outp = STRBUF(batchbuf); while (bytesleft) { n = fwrite(outp, 1, bytesleft, cmdpipe); if (n >= 0) { bytesleft -= n; outp += n; } else { errprintf("Error while writing data to batch command\n"); bytesleft = 0; } } childres = pclose(cmdpipe); } else { errprintf("Could not open pipe to batch command '%s'\n", batchcmd); childres = 127; } exit(childres); } else if (childpid > 0) { /* Parent continues */ } clearstrbuffer(batchbuf); } if (hostexp) { match = (pcre_exec(hostexp, NULL, hostname, strlen(hostname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0); if (!match) continue; } if (exhostexp) { match = (pcre_exec(exhostexp, NULL, hostname, strlen(hostname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0); if (match) continue; } if (testexp) { match = (pcre_exec(testexp, NULL, testname, strlen(testname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0); if (!match) continue; } if (extestexp) { match = (pcre_exec(extestexp, NULL, testname, strlen(testname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0); if (match) continue; } if (colorexp) { match = (pcre_exec(colorexp, NULL, color, strlen(color), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0); if (!match) continue; } lastmsgtime = gettimer(); if (batchcmd) { addtobuffer(batchbuf, "## "); for (i=0; (i < metacount); i++) { addtobuffer(batchbuf, metadata[i]); addtobuffer(batchbuf, " "); } addtobuffer(batchbuf, "\n"); addtobuffer(batchbuf, restofmsg); addtobuffer(batchbuf, "\n"); } else { fprintf(logfd, "## "); for (i=0; (i < metacount); i++) fprintf(logfd, "%s ", metadata[i]); fprintf(logfd, "\n"); fprintf(logfd, "%s\n", restofmsg); } } } return 0; } xymon-4.3.28/xymond/xymond.80000664000076400007640000003465013037531444016153 0ustar rpmbuildrpmbuild.TH XYMOND 8 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME xymond \- Master network daemon for a Xymon server .SH SYNOPSIS .B "xymond [options]" .SH DESCRIPTION xymond is the core daemon in the Xymon Monitor. It is designed to handle monitoring of a large number of hosts, with a strong focus on being a high-speed, low-overhead implementation of a Big Brother compatible server. To achieve this, xymond stores all information about the state of the monitored systems in memory, instead of storing it in the host filesystem. A number of plug-ins can be enabled to enhance the basic operation; e.g. a set of plugins are provided to implement persistent storage in a way that is compatible with the Big Brother daemon. However, even with these plugins enabled, xymond still performs much faster than the standard bbd daemon. xymond is normally started and controlled by the .I xymonlaunch(8) tool, and the command used to invoke xymond should therefore be in the tasks.cfg file. .SH OPTIONS .IP "\-\-hosts=FILENAME" Specifies the path to the Xymon hosts.cfg file. This is used to check if incoming status messages refer to known hosts; depending on the "\-\-ghosts" option, messages for unknown hosts may be dropped. If this option is omitted, the default path used is set by the HOSTSCFG environment variable. .IP "\-\-checkpoint\-file=FILENAME" With regular intervals, xymond will dump all of its internal state to this check-point file. It is also dumped when xymond terminates, or when it receives a SIGUSR1 signal. .IP "\-\-checkpoint\-interval=N" Specifies the interval (in seconds) between dumps to the check-point file. The default is 900 seconds (15 minutes). .IP "\-\-restart=FILENAME" Specifies an existing file containing a previously generated xymond checkpoint. When starting up, xymond will restore its internal state from the information in this file. You can use the same filename for "\-\-checkpoint\-file" and "\-\-restart". .IP "\-\-ghosts={allow|drop|log|match}" How to handle status messages from unknown hosts. The "allow" setting accepts all status messages, regardless of whether the host is known in the hosts.cfg file or not. "drop" silently ignores reports from unknown hosts. "log" works like drop, but logs the event in the xymond output file. "match" will try to match the name of the unknown host reporting with the known names by ignoring any domain-names - if a match is found, then a temporary client alias is automatically generated. The default is "log". .IP "\-\-no\-purple" Prevent status messages from going purple when they are no longer valid. Unlike the standard bbd daemon, purple-handling is done by xymond. .IP "\-\-merge\-clientconfig" The .I client-local.cfg(5) file contains client-configuration which can be found matching a client against its hostname, its classname, or the name of the OS the client is running. By default xymond will return one entry from the file to the client, looking for a hostname, classname or OS match (in that order). This option causes xymond to merge all matching entries together into one and return all of it to the client. .IP "\-\-listen=IP[:PORT]" Specifies the IP-address and port where xymond will listen for incoming connections. By default, xymond listens on IP 0.0.0.0 (i.e. all IP- addresses available on the host) and port 1984. .IP "\-\-lqueue=NUMBER" Specifies the listen-queue for incoming connections. You don't need to tune this unless you have a very busy xymond daemon. .IP "\-\-no\-bfq" Tells xymond to NOT use the local messagequeue interface for receiving status- updates from xymond_client and xymonnet. .IP "\-\-daemon" xymond is normally started by \fIxymonlaunch(8)\fR. If you do not want to use xymonlaunch, you can start xymond with this option; it will then detach from the terminal and continue running as a background task. .IP "\-\-timeout=N" Set the timeout used for incoming connections. If a status has not been received more than N seconds after the connection was accepted, then the connection is dropped and any status message is discarded. Default: 10 seconds. .IP "\-\-flap\-count=N" Track the N latest status-changes for flap-detection. See the \fB\-\-flap\-seconds\fR option also. To disable flap-checks globally, set N to zero. To disable for a specific host, you must use the "noflap" option in \fIhosts.cfg(5)\fR. Default: 5 .IP "\-\-flap\-seconds=N" If a status changes more than \fBflap\-count\fR times in N seconds or less, then it is considered to be flapping. In that case, the status is locked at the most severe level until the flapping stops. The history information is not updated after the flapping is detected. \fBNOTE:\fR If this is set higher than the default value, you should also use the \fB\-\-flap\-count\fR option to ensure that enough status-changes are stored for flap detection to work. The flap\-count setting should be at least (N/300)\-1, e.g. if you set flap\-seconds to 3600 (1 hour), then flap\-count should be at least (3600/300)\-1, i.e. 11. Default: 1800 seconds (30 minutes). .IP "\-\-delay\-red=N" .IP "\-\-delay\-yellow=N" Sets the delay before a red/yellow status causes a change in the web page display. Is usually controlled on a per-host basis via the \fBdelayred\fR and \fBdelayyellow\fR settings in .I hosts.cfg(5) but these options allow you to set a default value for the delays. The value N is in minutes. Default: 0 minutes (no delay). Note: Since most tests only execute once every 5 minutes, it will usually not make sense to set N to anything but a multiple of 5. .IP "\-\-env=FILENAME" Loads the content of FILENAME as environment settings before starting xymond. This is mostly used when running as a stand-alone daemon; if xymond is started by xymonlaunch, the environment settings are controlled by the xymonlaunch tasks.cfg file. .IP "\-\-pidfile=FILENAME" xymond writes the process-ID it is running with to this file. This is for use in automated startup scripts. The default file is $XYMONSERVERLOGS/xymond.pid. .IP "\-\-log=FILENAME" Redirect all output from xymond to FILENAME. .IP "\-\-store\-clientlogs[=[!]COLUMN]" Determines which status columns can cause a client message to be broadcast to the CLICHG channel. By default, no client messages are pushed to the CLICHG channel. If this option is specified with no parameter list, all status columns that go into an alert state will trigger the client data to be sent to the CLICHG channel. If a parameter list is added to this option, only those status columns listed in the list will cause the client data to be sent to the CLICHG channel. Several column names can be listed, separated by commas. If all columns are given as "!COLUMNNAME", then all status columns except those listed will cause the client data to be sent. .IP "\-\-status\-senders=IP[/MASK][,IP/MASK]" Controls which hosts may send "status", "combo", "config" and "query" commands to xymond. By default, any host can send status-updates. If this option is used, then status-updates are accepted only if they are sent by one of the IP-addresses listed here, or if they are sent from the IP-address of the host that the updates pertains to (this is to allow Xymon clients to send in their own status updates, without having to list all clients here). So typically you will need to list your servers running network tests here. The format of this option is a list of IP-addresses, optionally with a network mask in the form of the number of bits. E.g. if you want to accept status-updates from the host 172.16.10.2, you would use .br \-\-status\-senders=172.16.10.2 .br whereas if you want to accept status updates from both 172.16.10.2 and from all of the hosts on the 10.0.2.* network (a 24-bit IP network), you would use .br \-\-status\-senders=172.16.10.2,10.0.2.0/24 .IP "\-\-maint\-senders=IP[/MASK][,IP/MASK]" Controls which hosts may send maintenance commands to xymond. Maintenance commands are the "enable", "disable", "ack" and "notes" commands. Format of this option is as for the \-\-status\-senders option. It is strongly recommended that you use this to restrict access to these commands, so that monitoring of a host cannot be disabled by a rogue user - e.g. to hide a system compromise from the monitoring system. \fBNote:\fR If messages are sent through a proxy, the IP-address restrictions are of little use, since the messages will appear to originate from the proxy server address. It is therefore strongly recommended that you do NOT include the address of a server running xymonproxy in the list of allowed addresses. .IP "\-\-www\-senders=IP[/MASK][,IP/MASK]" Controls which hosts may send commands to retrieve the state of xymond. These are the "xymondlog", "xymondboard" and "xymondxboard" commands, which are used by .I xymongen(1) and .I combostatus(1) to retrieve the state of the Xymon system so they can generate the Xymon webpages. \fBNote:\fR If messages are sent through a proxy, the IP-address restrictions are of little use, since the messages will appear to originate from the proxy server address. It is therefore strongly recommended that you do NOT include the address of a server running xymonproxy in the list of allowed addresses. .IP "\-\-admin\-senders=IP[/MASK][,IP/MASK]" Controls which hosts may send administrative commands to xymond. These commands are the "drop" and "rename" commands. Access to these should be restricted, since they provide an un-authenticated means of completely disabling monitoring of a host, and can be used to remove all traces of e.g. a system compromise from the Xymon monitor. \fBNote:\fR If messages are sent through a proxy, the IP-address restrictions are of little use, since the messages will appear to originate from the proxy server address. It is therefore strongly recommended that you do NOT include the address of a server running xymonproxy in the list of allowed addresses. .IP "\-\-no\-download" Disable the "download" command which can be used by clients to pull files from the Xymon server. The use of these may be seen as a security risk since they allow file downloads. .IP "\-\-ack\-each\-color" By default, sending an ACK for a yellow status stops alerts from being sent while the status remains yellow or red. A status change from yellow to red will not re-enable alerts - the ACK covers all non-green statuses. With this option, an ACK is valid only for the color of the status when the ACK was sent. So an ACK for a yellow status is ignored if the status later changes to red, but an ACK for a red status covers both yellow and red. .br Note: An ACK for a red status will clear any existing yellow acks. This means that a long-lived ack for yellow is lost when you send a short-lived ack for red. Hence alerts will restart when the red ack expires, even if the status by then has changed to yellow. .IP "\-\-ack\-log=FILENAME" Log acknowledgements created on the Critical Systems page to FILENAME. NB, acknowledgements created by the Acknowledge Alert CGI are automatically written to acknowledge.log in the Xymon server log directory. Alerts from the Critical Systems page can be directed to the same log. .IP "\-\-debug" Enable debugging output. .IP "\-\-dbghost=HOSTNAME" For troubleshooting problems with a specific host, it may be useful to track the exact communications from a single host. This option causes xymond to dump all traffic from a single host to the file "/tmp/xymond.dbg". .SH HOW ALERTS TRIGGER When a status arrives, xymond matches the old and new color against the "alert" colors (from the "ALERTCOLORS" setting) and the "OK" colors (from the "OKCOLORS" setting). The old and new color falls into one of three categories: .sp .BR OK: The color is one of the "OK" colors (e.g. "green"). .sp .BR ALERT: The color is one of the "alert" colors (e.g. "red"). .sp .BR UNDECIDED: The color is neither an "alert" color nor an "OK" color (e.g. "yellow"). If the new status shows an ALERT state, then a message to the .I xymond_alert(8) module is triggered. This may be a repeat of a previous alert, but .I xymond_alert(8) will handle that internally, and only send alert messages with the interval configured in .I alerts.cfg(5). If the status goes from a not-OK state (ALERT or UNDECIDED) to OK, and there is a record of having been in a ALERT state previously, then a recovery message is triggered. The use of the OK, ALERT and UNDECIDED states make it possible to avoid being flooded with alerts when a status flip-flops between e.g yellow and red, or green and yellow. .SH CHANNELS A lot of functionality in the Xymon server is delegated to "worker modules" that are fed various events from xymond via a "channel". Programs access a channel using IPC mechanisms - specifically, shared memory and semaphores - or by using an instance of the .I xymond_channel(8) intermediate program. xymond_channel enables access to a channel via a simple file I/O interface. A skeleton program for hooking into a xymond channel is provided as part of Xymon in the .I xymond_sample(8) program. The following channels are provided by xymond: .sp .BR status This channel is fed the contents of all incoming "status" and "summary" messages. .sp .BR stachg This channel is fed information about tests that change status, i.e. the color of the status-log changes. .sp .BR page This channel is fed information about tests where the color changes between an alert color and a non-alert color. It also receives information about "ack" messages. .sp .BR data This channel is fed information about all "data" messages. .sp .BR notes This channel is fed information about all "notes" messages. .sp .BR enadis This channel is fed information about hosts or tests that are being disabled or enabled. .sp .BR client This channel is fed the contents of the client messages sent by Xymon clients installed on the monitored servers. .sp .BR clichg This channel is fed the contents of a host client messages, whenever a status for that host goes red, yellow or purple. Information about the data stream passed on these channels is in the Xymon source-tree, see the "xymond/new\-daemon.txt" file. .SH SIGNALS .IP SIGHUP Re-read the hosts.cfg configuration file. .IP SIGUSR1 Force an immediate dump of the checkpoint file. .SH BUGS Timeout of incoming connections are not strictly enforced. The check for a timeout only triggers during the normal network handling loop, so a connection that should timeout after N seconds may persist until some activity happens on another (unrelated) connection. .SH FILES If ghost-handling is enabled via the "\-\-ghosts" option, the hosts.cfg file is read to determine the names of all known hosts. .SH "SEE ALSO" xymon(7), xymonserver.cfg(5). xymon-4.3.28/xymond/xymond_worker.h0000664000076400007640000000221512174246230017611 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __XYMOND_WORKER_H__ #define __XYMOND_WORKER_H__ #include typedef void (update_fn_t)(char *); extern int net_worker_option(char *arg); extern int net_worker_locatorbased(void); extern void net_worker_run(enum locator_servicetype_t svc, enum locator_sticky_t sticky, update_fn_t *updfunc); extern unsigned char *get_xymond_message(enum msgchannels_t chnid, char *id, int *seq, struct timespec *timeout); #endif xymon-4.3.28/xymond/combo.cfg.50000664000076400007640000000616713037531444016471 0ustar rpmbuildrpmbuild.TH COMBO.CFG 5 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME combo.cfg \- Configuration of combostatus tool .SH SYNOPSIS .B $XYMONHOME/etc/combo.cfg .SH DESCRIPTION .I combostatus(1) uses it's own configuration file, $XYMONHOME/etc/combo.cfg Each line in this file defines a combined test. .SH FILE FORMAT Each line of the file defines a new combined test. Blank lines and lines starting with a hash mark (#) are treated as comments and ignored. .sp The configuration file uses the hostnames and testnames that are already used in your Xymon hosts.cfg file. These are then combined using normal logical operators - "||" for "or", "&&" for "and" etc. A simple test - e.g. "Web1.http" - results in the value "1" if the "http" test for server "Web1" is green, yellow or clear. It yields the value "0" if it is red, purple or blue. Apart from the logical operations, you can also do integer arithmetic and comparisons. E.g. the following is valid: WebCluster.http = (Web1.http + Web2.http + Web3.http) >= 2 This test is green if two or more of the http tests for Web1, Web2 and Web3 are green. The full range of operators are: + Add - Subtract * Multiply / Divide % Modulo | Bit-wise "or" & Bit-wise "and" || Logical "or" && Logical "and" > Greater than < Less than >= Greater than or equal <= Less than or equal == Equal There is currently no support for a "not" operator. If you need it, use the transcription "(host.test == 0)" instead of "!host.test". NB: All operators have EQUAL PRECEDENCE. If you need something evaluated in a specific order, use parentheses to group the expressions together. If the expression comes out as "0", the combined test goes red. If it comes out as non-zero, the combined test is green. Note: If the expression involves hostnames with a character that is also an operator - e.g. if you have a host "t1-router-newyork.foo.com" with a dash in the hostname - then the operator-character must be escaped with a backslash '\\' in the expression, or it will be interpreted as an operator. E.g. like this: nyc.conn = (t1\\-router\\-nyc.conn || backup\\-router\\-nyc.conn) .SH EXAMPLE WebCluster.http = (Web1.http || Web2.http) .br AppSrvCluster.procs = (AppSrv1.conn && AppSrv1.procs) || (AppSrv2.conn && AppSrv2.procs) .br Customer.cluster = WebCluster.http && AppSrvCluster.procs .br The first line defines a new test, with hostname "WebCluster" and the columnname "http". It will be green if the http test on either the "Web1" or the "Web2" server is green. The second line defines a "procs" test for the "AppSrvCluster" host. Each of the AppSrv1 and AppSrv2 hosts is checked for "conn" (ping) and their "procs" test. On each host, both of these must be green, but the combined test is green if that condition is fulfilled on just one of the hosts. The third line uses the two first tests to build a "double combined" test, defining a test that shows the overall health of the system. .SH FILES .BR "$XYMONHOME/etc/combo.cfg" .SH "SEE ALSO" combostatus(1) xymon-4.3.28/xymond/xymond_client.c0000664000076400007640000020452612654207223017564 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Client backend module */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* "PORT" handling (C) Mirko Saam */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: xymond_client.c 7886 2016-02-02 20:16:19Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include "libxymon.h" #include "xymond_worker.h" #include "client_config.h" #define MAX_META 20 /* The maximum number of meta-data items in a message */ enum msgtype_t { MSG_CPU, MSG_DISK, MSG_INODE, MSG_FILES, MSG_MEMORY, MSG_MSGS, MSG_PORTS, MSG_PROCS, MSG_SVCS, MSG_WHO, MSG_LAST }; typedef struct sectlist_t { char *sname; char *sdata; char *nextsectionrestoreptr, *sectdatarestoreptr; char nextsectionrestoreval, sectdatarestoreval; struct sectlist_t *next; } sectlist_t; static sectlist_t *defsecthead = NULL; int pslistinprocs = 1; int portlistinports = 1; int svclistinsvcs = 1; int sendclearmsgs = 1; int sendclearfiles = 1; int sendclearports = 1; int sendclearsvcs = 1; int localmode = 0; int unknownclientosok = 0; int noreportcolor = COL_CLEAR; int separate_uptime_status = 0; int usebackfeedqueue = 0; typedef struct updinfo_t { char *hostname; time_t updtime; int updseq; } updinfo_t; static void * updinfotree; int add_updateinfo(char *hostname, int seq, time_t tstamp) { xtreePos_t handle; updinfo_t *itm; handle = xtreeFind(updinfotree, hostname); if (handle == xtreeEnd(updinfotree)) { itm = (updinfo_t *)calloc(1, sizeof(updinfo_t)); itm->hostname = strdup(hostname); xtreeAdd(updinfotree, itm->hostname, itm); } else { itm = (updinfo_t *)xtreeData(updinfotree, handle); } if (itm->updtime == tstamp) { dbgprintf("%s: Duplicate client message at time %d, seq %d, lastseq %d\n", hostname, (int) tstamp, seq, itm->updseq); return 1; } itm->updtime = tstamp; itm->updseq = seq; return 0; } void nextsection_r_done(void *secthead) { /* Free the old list */ sectlist_t *swalk, *stmp; swalk = (sectlist_t *)secthead; while (swalk) { if (swalk->nextsectionrestoreptr) *swalk->nextsectionrestoreptr = swalk->nextsectionrestoreval; if (swalk->sectdatarestoreptr) *swalk->sectdatarestoreptr = swalk->sectdatarestoreval; stmp = swalk; swalk = swalk->next; xfree(stmp); } } void splitmsg_r(char *clientdata, sectlist_t **secthead) { char *cursection, *nextsection; char *sectname, *sectdata; if (clientdata == NULL) { errprintf("Got a NULL client data message\n"); return; } if (secthead == NULL) { errprintf("BUG: splitmsg_r called with NULL secthead\n"); return; } if (*secthead) { errprintf("BUG: splitmsg_r called with non-empty secthead\n"); nextsection_r_done(*secthead); *secthead = NULL; } /* Find the start of the first section */ if (*clientdata == '[') cursection = clientdata; else { cursection = strstr(clientdata, "\n["); if (cursection) cursection++; } while (cursection) { sectlist_t *newsect = (sectlist_t *)calloc(1, sizeof(sectlist_t)); /* Find end of this section (i.e. start of the next section, if any) */ nextsection = strstr(cursection, "\n["); if (nextsection) { newsect->nextsectionrestoreptr = nextsection; newsect->nextsectionrestoreval = *nextsection; *nextsection = '\0'; nextsection++; } /* Pick out the section name and data */ sectname = cursection+1; sectdata = sectname + strcspn(sectname, "]\n"); newsect->sectdatarestoreptr = sectdata; newsect->sectdatarestoreval = *sectdata; *sectdata = '\0'; sectdata++; if (*sectdata == '\n') sectdata++; /* Save the pointers in the list */ newsect->sname = sectname; newsect->sdata = sectdata; newsect->next = *secthead; *secthead = newsect; /* Next section, please */ cursection = nextsection; } } void splitmsg_done(void) { /* * NOTE: This MUST be called when we're doing using a message, * and BEFORE the next message is read. If called after the * next message is read, the restore-pointers in the "defsecthead" * list will point to data inside the NEW message, and * if the buffer-usage happens to be setup correctly, then * this will write semi-random data over the new message. */ if (defsecthead) { /* Clean up after the previous message */ nextsection_r_done(defsecthead); defsecthead = NULL; } } void splitmsg(char *clientdata) { if (defsecthead) { errprintf("BUG: splitmsg_done() was not called on previous message - data corruption possible.\n"); splitmsg_done(); } splitmsg_r(clientdata, &defsecthead); } char *nextsection_r(char *clientdata, char **name, void **current, void **secthead) { if (clientdata) { *secthead = NULL; splitmsg_r(clientdata, (sectlist_t **)secthead); *current = *secthead; } else { *current = (*current ? ((sectlist_t *)*current)->next : NULL); } if (*current) { *name = ((sectlist_t *)*current)->sname; return ((sectlist_t *)*current)->sdata; } return NULL; } char *nextsection(char *clientdata, char **name) { static void *current = NULL; if (clientdata && defsecthead) { nextsection_r_done(defsecthead); defsecthead = NULL; } return nextsection_r(clientdata, name, ¤t, (void *)defsecthead); } char *getdata(char *sectionname) { sectlist_t *swalk; for (swalk = defsecthead; (swalk && strcmp(swalk->sname, sectionname)); swalk = swalk->next) ; if (swalk) return swalk->sdata; return NULL; } int linecount(char *msg) { int result = 0; char *nl; if (!msg) return 0; nl = msg - 1; while (nl) { nl++; if (*nl >= ' ') result++; nl = strchr(nl, '\n'); } return result; } int want_msgtype(void *hinfo, enum msgtype_t msg) { static void *currhost = NULL; static unsigned long currset = 0; if (currhost != hinfo) { char *val, *tok; currhost = hinfo; currset = 0; val = xmh_item(currhost, XMH_NOCOLUMNS); if (val) { val = strdup(val); tok = strtok(val, ","); while (tok) { if (strcmp(tok, "cpu") == 0) currset |= (1 << MSG_CPU); else if (strcmp(tok, "disk") == 0) currset |= (1 << MSG_DISK); else if (strcmp(tok, "inode") == 0) currset |= (1 << MSG_INODE); else if (strcmp(tok, "files") == 0) currset |= (1 << MSG_FILES); else if (strcmp(tok, "memory") == 0) currset |= (1 << MSG_MEMORY); else if (strcmp(tok, "msgs") == 0) currset |= (1 << MSG_MSGS); else if (strcmp(tok, "ports") == 0) currset |= (1 << MSG_PORTS); else if (strcmp(tok, "procs") == 0) currset |= (1 << MSG_PROCS); else if (strcmp(tok, "svcs") == 0) currset |= (1 << MSG_SVCS); else if (strcmp(tok, "who") == 0) currset |= (1 << MSG_WHO); tok = strtok(NULL, ","); } xfree(val); } } return ((currset & (1 << msg)) == 0); } char *nocolon(char *txt) { static char *result = NULL; char *p; /* * This function changes all colons in "txt" to semi-colons. * This is needed because some of the data messages we use * for reporting things like file- and directory-sizes, or * linecounts in files, use a colon-delimited string that * is sent to the RRD module, and this breaks for the Windows * Powershell client where filenames may contain a colon. */ if (result) xfree(result); result = strdup(txt); p = result; while ((p = strchr(p, ':')) != NULL) *p = ';'; return result; } void unix_cpu_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *uptimestr, char *clockstr, char *msgcachestr, char *whostr, int usercount, char *psstr, int pscount, char *topstr) { char *p; float load1, load5, load15; float loadyellow, loadred; int recentlimit, ancientlimit, maxclockdiff, uptimecolor, clockdiffcolor; char loadresult[100]; long uptimesecs = -1; char myupstr[100]; int cpucolor = COL_GREEN, upstatuscolor = COL_GREEN; char msgline[4096]; strbuffer_t *cpumsg, *upmsg = NULL; if (!want_msgtype(hinfo, MSG_CPU)) return; if (!uptimestr) return; p = strstr(uptimestr, " up "); if (p) { char *uptimeresult; char *daymark; char *hourmark; long uphour, upmin, upsecs; uptimesecs = 0; uptimeresult = strdup(p+3); /* * Linux: " up 178 days, 9:15," * BSD: "" * Solaris: " up 21 days 20:58," */ daymark = strstr(uptimeresult, " day"); dbgprintf("CPU check host %s: daymark '%s'\n", hostname, daymark); if (daymark) { uptimesecs = atoi(uptimeresult) * 86400; if (strncmp(daymark, " days ", 6) == 0) { hourmark = daymark + 6; } else if (strncmp(daymark, " day ", 5) == 0) { hourmark = daymark + 5; } else { hourmark = strchr(daymark, ','); if (hourmark) hourmark++; else hourmark = ""; } } else { hourmark = uptimeresult; } hourmark += strspn(hourmark, " "); dbgprintf("CPU check host %s: hourmark '%s'\n", hostname, hourmark); if (sscanf(hourmark, "%ld:%ld", &uphour, &upmin) == 2) { uptimesecs += 60*(60*uphour + upmin); } else if (sscanf(hourmark, "%ld hours %ld mins", &uphour, &upmin) == 2) { uptimesecs += 60*(60*uphour + upmin); } else if (strstr(hourmark, " secs") && (sscanf(hourmark, "%ld secs", &upsecs) == 1)) { uptimesecs += upsecs; } else if (strstr(hourmark, "min") && (sscanf(hourmark, "%ld min", &upmin) == 1)) { uptimesecs += 60*upmin; } else if (strncmp(hourmark, "1 hr", 4) == 0) { uptimesecs = 3600; } else { uptimesecs = -1; } xfree(uptimeresult); } if (uptimesecs != -1) { int days = (uptimesecs / 86400); int hours = (uptimesecs % 86400) / 3600; int mins = (uptimesecs % 3600) / 60; if (days) sprintf(myupstr, "up: %d days", days); else sprintf(myupstr, "up: %02d:%02d", hours, mins); } else *myupstr = '\0'; load5 = 0.0; *loadresult = '\0'; p = strstr(uptimestr, "load average: "); if (!p) p = strstr(uptimestr, "load averages: "); /* Many BSD's */ if (p) { p = strchr(p, ':') + 1; p += strspn(p, " "); if ((sscanf(p, "%f, %f, %f", &load1, &load5, &load15) == 3) || (sscanf(p, "%f %f %f", &load1, &load5, &load15) == 3)) { sprintf(loadresult, "%.2f", load5); } } else { p = strstr(uptimestr, " load="); if (p) { char *lstart = p+6; char savech; p = lstart + strspn(lstart, "0123456789."); savech = *p; *p = '\0'; load5 = atof(loadresult); strcpy(loadresult, lstart); *p = savech; if (savech == '%') strcat(loadresult, "%"); } } get_cpu_thresholds(hinfo, clientclass, &loadyellow, &loadred, &recentlimit, &ancientlimit, &uptimecolor, &maxclockdiff, &clockdiffcolor); cpumsg = newstrbuffer(0); if (load5 > loadred) { cpucolor = COL_RED; addtobuffer(cpumsg, "&red Load is CRITICAL\n"); } else if (load5 > loadyellow) { cpucolor = COL_YELLOW; addtobuffer(cpumsg, "&yellow Load is HIGH\n"); } if (separate_uptime_status) { upmsg = newstrbuffer(0); if ((uptimesecs != -1) && (recentlimit != -1) && (uptimesecs < recentlimit)) { upstatuscolor = uptimecolor; sprintf(msgline, "&%s Machine recently rebooted\n", colorname(uptimecolor)); addtobuffer(upmsg, msgline); } if ((uptimesecs != -1) && (ancientlimit != -1) && (uptimesecs > ancientlimit)) { upstatuscolor = uptimecolor; sprintf(msgline, "&%s Machine has been up more than %d days\n", colorname(uptimecolor), (ancientlimit / 86400)); addtobuffer(upmsg, msgline); } } else { if ((uptimesecs != -1) && (recentlimit != -1) && (uptimesecs < recentlimit)) { if (cpucolor != COL_RED) cpucolor = uptimecolor; sprintf(msgline, "&%s Machine recently rebooted\n", colorname(uptimecolor)); addtobuffer(cpumsg, msgline); } if ((uptimesecs != -1) && (ancientlimit != -1) && (uptimesecs > ancientlimit)) { if (cpucolor != COL_RED) cpucolor = uptimecolor; sprintf(msgline, "&%s Machine has been up more than %d days\n", colorname(uptimecolor), (ancientlimit / 86400)); addtobuffer(cpumsg, msgline); } } if (clockstr) { char *p; struct timeval clockval; p = strstr(clockstr, "epoch:"); if (p && (sscanf(p, "epoch: %ld.%ld", (long int *)&clockval.tv_sec, (long int *)&clockval.tv_usec) == 2)) { struct timeval clockdiff; struct timezone tz; int cachedelay = 0; if (msgcachestr) { /* Message passed through msgcache, so adjust for the cache delay */ p = strstr(msgcachestr, "Cachedelay:"); if (p) cachedelay = atoi(p+11); } gettimeofday(&clockdiff, &tz); clockdiff.tv_sec -= (clockval.tv_sec + cachedelay); clockdiff.tv_usec -= clockval.tv_usec; if (clockdiff.tv_usec < 0) { clockdiff.tv_usec += 1000000; clockdiff.tv_sec -= 1; } if ((maxclockdiff > 0) && (abs(clockdiff.tv_sec) > maxclockdiff)) { if (cpucolor != COL_RED) cpucolor = clockdiffcolor; sprintf(msgline, "&%s System clock is %ld seconds off (max %ld)\n", colorname(clockdiffcolor), (long) clockdiff.tv_sec, (long) maxclockdiff); addtobuffer(cpumsg, msgline); } else { sprintf(msgline, "System clock is %ld seconds off\n", (long) clockdiff.tv_sec); addtobuffer(cpumsg, msgline); } } } init_status(cpucolor); sprintf(msgline, "status %s.cpu %s %s %s, %d users, %d procs, load=%s\n", commafy(hostname), colorname(cpucolor), (timestr ? timestr : ""), myupstr, (whostr ? linecount(whostr) : usercount), (psstr ? linecount(psstr)-1 : pscount), loadresult); addtostatus(msgline); if (STRBUFLEN(cpumsg)) { addtostrstatus(cpumsg); addtostatus("\n"); } if (topstr) { addtostatus("\n"); addtostatus(topstr); } if (fromline && !localmode) addtostatus(fromline); finish_status(); if (separate_uptime_status) { init_status(upstatuscolor); sprintf(msgline, "status %s.uptime %s %s Uptime %s\n", commafy(hostname), colorname(upstatuscolor), (timestr ? timestr : ""), ((upstatuscolor == COL_GREEN) ? "OK" : "Not OK")); addtostatus(msgline); sprintf(msgline, "\nSystem has been %s\n", myupstr); addtostatus(msgline); if (fromline && !localmode) addtostatus(fromline); finish_status(); } freestrbuffer(cpumsg); if (upmsg) freestrbuffer(upmsg); } void unix_disk_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *freehdr, char *capahdr, char *mnthdr, char *dfstr) { int diskcolor = COL_GREEN; int freecol = -1; int capacol = -1; int mntcol = -1; char *p, *bol, *nl; char msgline[4096]; strbuffer_t *monmsg, *dfstr_filtered; char *dname; int dmin, dmax, dcount, dcolor; char *group; if (!want_msgtype(hinfo, MSG_DISK)) return; if (!dfstr) return; dbgprintf("Disk check host %s\n", hostname); monmsg = newstrbuffer(0); dfstr_filtered = newstrbuffer(0); clear_disk_counts(hinfo, clientclass); clearalertgroups(); bol = dfstr; /* Must do this always, to at least grab the column-numbers we need */ while (bol) { int ignored = 0; nl = strchr(bol, '\n'); if (nl) *nl = '\0'; if ((capacol == -1) && (mntcol == -1) && (freecol == -1)) { /* First line: Check the header and find the columns we want */ p = strdup(bol); freecol = selectcolumn(p, freehdr); strcpy(p, bol); capacol = selectcolumn(p, capahdr); strcpy(p, bol); mntcol = selectcolumn(p, mnthdr); xfree(p); dbgprintf("Disk check: header '%s', columns %d and %d\n", bol, freecol, capacol, mntcol); } else { char *fsname = NULL, *levelstr = NULL; int abswarn, abspanic; long levelpct = -1, levelabs = -1, warnlevel, paniclevel; p = strdup(bol); fsname = getcolumn(p, mntcol); if (fsname) { char *msgp = msgline; add_disk_count(fsname); get_disk_thresholds(hinfo, clientclass, fsname, &warnlevel, &paniclevel, &abswarn, &abspanic, &ignored, &group); strcpy(p, bol); levelstr = getcolumn(p, freecol); if (levelstr) levelabs = atol(levelstr); strcpy(p, bol); levelstr = getcolumn(p, capacol); if (levelstr) levelpct = atol(levelstr); dbgprintf("Disk check: FS='%s' level %ld%%/%ldU (thresholds: %lu/%lu, abs: %d/%d)\n", fsname, levelpct, levelabs, warnlevel, paniclevel, abswarn, abspanic); if (ignored) { /* Forget about this one */ } else if ( (abspanic && (levelabs <= paniclevel)) || (!abspanic && (levelpct >= paniclevel)) ) { if (diskcolor < COL_RED) diskcolor = COL_RED; msgp += sprintf(msgp, "&red %s ", fsname); if (abspanic) msgp += sprintf(msgp, "(%lu units free)", levelabs); else msgp += sprintf(msgp, "(%lu%% used)", levelpct); msgp += sprintf(msgp, " has reached the PANIC level "); if (abspanic) msgp += sprintf(msgp, "(%lu units)\n", paniclevel); else msgp += sprintf(msgp, "(%lu%%)\n", paniclevel); addtobuffer(monmsg, msgline); addalertgroup(group); } else if ( (abswarn && (levelabs <= warnlevel)) || (!abswarn && (levelpct >= warnlevel)) ) { if (diskcolor < COL_YELLOW) diskcolor = COL_YELLOW; msgp += sprintf(msgp, "&yellow %s ", fsname); if (abswarn) msgp += sprintf(msgp, "(%lu units free)", levelabs); else msgp += sprintf(msgp, "(%lu%% used)", levelpct); msgp += sprintf(msgp, " has reached the WARNING level "); if (abswarn) msgp += sprintf(msgp, "(%lu units)\n", warnlevel); else msgp += sprintf(msgp, "(%lu%%)\n", warnlevel); addtobuffer(monmsg, msgline); addalertgroup(group); } } xfree(p); } if (!ignored) { addtobuffer(dfstr_filtered, bol); addtobuffer(dfstr_filtered, "\n"); } if (nl) { *nl = '\n'; bol = nl+1; } else bol = NULL; } if ((capacol == -1) && (mntcol == -1)) { /* If this happens, we havent found our headers so no filesystems have been processed */ diskcolor = COL_YELLOW; sprintf(msgline, "&red Expected strings (%s and %s) not found in df output\n", capahdr, mnthdr); addtobuffer(monmsg, msgline); errprintf("Host %s (%s) sent incomprehensible disk report - missing columnheaders '%s' and '%s'\n", hostname, osname(os), capahdr, mnthdr); } /* Check for filesystems that must (not) exist */ while ((dname = check_disk_count(&dcount, &dmin, &dmax, &dcolor, &group)) != NULL) { char limtxt[1024]; *limtxt = '\0'; if (dmax == -1) { if (dmin > 0) sprintf(limtxt, "%d or more", dmin); else if (dmin == 0) sprintf(limtxt, "none"); } else { if (dmin > 0) sprintf(limtxt, "between %d and %d", dmin, dmax); else if (dmin == 0) sprintf(limtxt, "at most %d", dmax); } if (dcolor != COL_GREEN) { if (dcolor > diskcolor) diskcolor = dcolor; sprintf(msgline, "&%s Filesystem %s (found %d, req. %s)\n", colorname(dcolor), dname, dcount, limtxt); addtobuffer(monmsg, msgline); addalertgroup(group); } } /* Now we know the result, so generate a status message */ init_status(diskcolor); group = getalertgroups(); if (group) sprintf(msgline, "status/group:%s ", group); else strcpy(msgline, "status "); addtostatus(msgline); sprintf(msgline, "%s.disk %s %s - Filesystems %s\n", commafy(hostname), colorname(diskcolor), (timestr ? timestr : ""), (((diskcolor == COL_RED) || (diskcolor == COL_YELLOW)) ? "NOT ok" : "ok")); addtostatus(msgline); /* And add the info about what's wrong */ if (STRBUFLEN(monmsg)) { addtostrstatus(monmsg); addtostatus("\n"); } /* And the full df output */ addtostrstatus(dfstr_filtered); if (fromline && !localmode) addtostatus(fromline); finish_status(); freestrbuffer(monmsg); freestrbuffer(dfstr_filtered); } void unix_inode_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *freehdr, char *capahdr, char *mnthdr, char *dfstr) { int inodecolor = COL_GREEN; int freecol = -1; int capacol = -1; int mntcol = -1; char *p, *bol, *nl; char msgline[4096]; strbuffer_t *monmsg, *dfstr_filtered; char *iname; int imin, imax, icount, icolor; char *group; if (!want_msgtype(hinfo, MSG_INODE)) return; if (!dfstr) return; dbgprintf("Inode check host %s\n", hostname); monmsg = newstrbuffer(0); dfstr_filtered = newstrbuffer(0); clear_inode_counts(hinfo, clientclass); clearalertgroups(); bol = dfstr; /* Must do this always, to at least grab the column-numbers we need */ while (bol) { int ignored = 0; nl = strchr(bol, '\n'); if (nl) *nl = '\0'; if ((capacol == -1) && (mntcol == -1) && (freecol == -1)) { /* First line: Check the header and find the columns we want */ p = strdup(bol); freecol = selectcolumn(p, freehdr); strcpy(p, bol); capacol = selectcolumn(p, capahdr); strcpy(p, bol); mntcol = selectcolumn(p, mnthdr); xfree(p); dbgprintf("Inode check: header '%s', columns %d and %d\n", bol, freecol, capacol, mntcol); } else { char *fsname = NULL, *levelstr = NULL; int abswarn, abspanic; long levelpct = -1, levelabs = -1, warnlevel, paniclevel; p = strdup(bol); fsname = getcolumn(p, mntcol); if (fsname) { char *msgp = msgline; add_inode_count(fsname); get_inode_thresholds(hinfo, clientclass, fsname, &warnlevel, &paniclevel, &abswarn, &abspanic, &ignored, &group); strcpy(p, bol); levelstr = getcolumn(p, freecol); if (levelstr) levelabs = atol(levelstr); strcpy(p, bol); levelstr = getcolumn(p, capacol); if (levelstr) levelpct = atol(levelstr); dbgprintf("Inode check: FS='%s' level %ld%%/%ldU (thresholds: %lu/%lu, abs: %d/%d)\n", fsname, levelpct, levelabs, warnlevel, paniclevel, abswarn, abspanic); if (ignored) { /* Forget about this one */ } else if ( (abspanic && (levelabs <= paniclevel)) || (!abspanic && (levelpct >= paniclevel)) ) { if (inodecolor < COL_RED) inodecolor = COL_RED; msgp += sprintf(msgp, "&red %s ", fsname, fsname); if (abspanic) msgp += sprintf(msgp, "(%lu units free)", levelabs); else msgp += sprintf(msgp, "(%lu%% used)", levelpct); msgp += sprintf(msgp, " has reached the PANIC level "); if (abspanic) msgp += sprintf(msgp, "(%lu units)\n", paniclevel); else msgp += sprintf(msgp, "(%lu%%)\n", paniclevel); addtobuffer(monmsg, msgline); addalertgroup(group); } else if ( (abswarn && (levelabs <= warnlevel)) || (!abswarn && (levelpct >= warnlevel)) ) { if (inodecolor < COL_YELLOW) inodecolor = COL_YELLOW; msgp += sprintf(msgp, "&yellow %s ", fsname, fsname); if (abswarn) msgp += sprintf(msgp, "(%lu units free)", levelabs); else msgp += sprintf(msgp, "(%lu%% used)", levelpct); msgp += sprintf(msgp, " has reached the WARNING level "); if (abswarn) msgp += sprintf(msgp, "(%lu units)\n", warnlevel); else msgp += sprintf(msgp, "(%lu%%)\n", warnlevel); addtobuffer(monmsg, msgline); addalertgroup(group); } } xfree(p); } if (!ignored) { addtobuffer(dfstr_filtered, bol); addtobuffer(dfstr_filtered, "\n"); } if (nl) { *nl = '\n'; bol = nl+1; } else bol = NULL; } if ((capacol == -1) && (mntcol == -1)) { if (strlen(dfstr) == 0) { /* Empty inode report, happens on Solaris when all filesystems are ZFS */ inodecolor = COL_GREEN; sprintf(msgline, "&green No filesystems reporting inode data\n"); addtobuffer(monmsg, msgline); } else { /* If this happens, we havent found our headers so no filesystems have been processed */ inodecolor = COL_YELLOW; sprintf(msgline, "&red Expected strings (%s and %s) not found in df output\n", capahdr, mnthdr); addtobuffer(monmsg, msgline); errprintf("Host %s (%s) sent incomprehensible inode report - missing columnheaders '%s' and '%s'\n%s\n", hostname, osname(os), capahdr, mnthdr, dfstr); } } /* Check for filesystems that must (not) exist */ while ((iname = check_inode_count(&icount, &imin, &imax, &icolor, &group)) != NULL) { char limtxt[1024]; *limtxt = '\0'; if (imax == -1) { if (imin > 0) sprintf(limtxt, "%d or more", imin); else if (imin == 0) sprintf(limtxt, "none"); } else { if (imin > 0) sprintf(limtxt, "between %d and %d", imin, imax); else if (imin == 0) sprintf(limtxt, "at most %d", imax); } if (icolor != COL_GREEN) { if (icolor > inodecolor) inodecolor = icolor; sprintf(msgline, "&%s Filesystem %s (found %d, req. %s)\n", colorname(icolor), iname, iname, icount, limtxt); addtobuffer(monmsg, msgline); addalertgroup(group); } } /* Now we know the result, so generate a status message */ init_status(inodecolor); group = getalertgroups(); if (group) sprintf(msgline, "status/group:%s ", group); else strcpy(msgline, "status "); addtostatus(msgline); sprintf(msgline, "%s.inode %s %s - Filesystems %s\n", commafy(hostname), colorname(inodecolor), (timestr ? timestr : ""), (((inodecolor == COL_RED) || (inodecolor == COL_YELLOW)) ? "NOT ok" : "ok")); addtostatus(msgline); /* And add the info about what's wrong */ if (STRBUFLEN(monmsg)) { addtostrstatus(monmsg); addtostatus("\n"); } /* And the full df output */ addtostrstatus(dfstr_filtered); if (fromline && !localmode) addtostatus(fromline); finish_status(); freestrbuffer(monmsg); freestrbuffer(dfstr_filtered); } void unix_memory_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, long memphystotal, long memphysused, long memacttotal, long memactused, long memswaptotal, long memswapused) { long memphyspct = 0, memswappct = 0, memactpct = 0; int physyellow, physred, swapyellow, swapred, actyellow, actred; int invaliddata = 0; int memorycolor = COL_GREEN, physcolor = COL_GREEN, swapcolor = COL_GREEN, actcolor = COL_GREEN; char *memorysummary = "OK"; char msgline[4096]; if (!want_msgtype(hinfo, MSG_MEMORY)) return; if (memphystotal == -1) return; if (memphysused == -1) return; get_memory_thresholds(hinfo, clientclass, &physyellow, &physred, &swapyellow, &swapred, &actyellow, &actred); memphyspct = (memphystotal > 0) ? ((100 * memphysused) / memphystotal) : 0; if (memphyspct <= 100) { if (memphyspct > physyellow) physcolor = COL_YELLOW; if (memphyspct > physred) physcolor = COL_RED; } if (memswapused != -1) memswappct = (memswaptotal > 0) ? ((100 * memswapused) / memswaptotal) : 0; if (memswappct <= 100) { if (memswappct > swapyellow) swapcolor = COL_YELLOW; if (memswappct > swapred) swapcolor = COL_RED; } else invaliddata = 1; if (memactused != -1) memactpct = (memacttotal > 0) ? ((100 * memactused) / memacttotal) : 0; if (memactpct <= 100) { if (memactpct > actyellow) actcolor = COL_YELLOW; if (memactpct > actred) actcolor = COL_RED; } else invaliddata = 1; if ((physcolor == COL_RED) || (swapcolor == COL_RED) || (actcolor == COL_RED)) { memorycolor = COL_RED; memorysummary = "CRITICAL"; } else if ((physcolor == COL_YELLOW) || (swapcolor == COL_YELLOW) || (actcolor == COL_YELLOW)) { memorycolor = COL_YELLOW; memorysummary = "low"; } if ((memphystotal == 0) && (memorycolor == COL_GREEN)) { memorycolor = COL_YELLOW; memorysummary = "detection FAILED"; } else if (invaliddata) { if (memorycolor != COL_RED) memorycolor = COL_YELLOW; memorysummary = "invalid data when parsing"; } init_status(memorycolor); sprintf(msgline, "status %s.memory %s %s - Memory %s\n", commafy(hostname), colorname(memorycolor), (timestr ? timestr : ""), memorysummary); addtostatus(msgline); sprintf(msgline, " %-16s%12s%12s%12s\n", "Memory", "Used", "Total", "Percentage"); addtostatus(msgline); sprintf(msgline, "&%s %-16s%11ldM%11ldM%11ld%%\n", colorname(physcolor), "Real/Physical", memphysused, memphystotal, memphyspct); addtostatus(msgline); if (memactused != -1) { if (memactpct <= 100) sprintf(msgline, "&%s %-16s%11ldM%11ldM%11ld%%\n", colorname(actcolor), "Actual/Virtual", memactused, memacttotal, memactpct); else sprintf(msgline, "&%s %-16s%11ldM%11ldM%11ld%% - invalid data\n", colorname(COL_YELLOW), "Actual/Virtual", memactused, memacttotal, 0L); addtostatus(msgline); } if (memswapused != -1) { if (memswappct <= 100) sprintf(msgline, "&%s %-16s%11ldM%11ldM%11ld%%\n", colorname(swapcolor), "Swap/Page", memswapused, memswaptotal, memswappct); else sprintf(msgline, "&%s %-16s%11ldM%11ldM%11ld%% - invalid data\n", colorname(COL_YELLOW), "Swap/Page", memswapused, memswaptotal, 0L); addtostatus(msgline); } if (fromline && !localmode) addtostatus(fromline); finish_status(); } void unix_procs_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *cmdhdr, char *altcmdhdr, char *psstr) { int pscolor = COL_GREEN; int pchecks; int cmdofs = -1; char *p, *eol; char msgline[4096]; strbuffer_t *monmsg; static strbuffer_t *countdata = NULL; int anycountdata = 0; char *group; if (!want_msgtype(hinfo, MSG_PROCS)) return; if (!psstr) return; if (!countdata) countdata = newstrbuffer(0); clearalertgroups(); monmsg = newstrbuffer(0); sprintf(msgline, "data %s.proccounts\n", commafy(hostname)); addtobuffer(countdata, msgline); /* * Find where the command is located. We look for the header for the command, * and calculate the offset from the beginning of the line. * * NOTE: The header strings could show up in the normal "ps" output. So * we look for it only in the first line of output. */ eol = strchr(psstr, '\n'); if (eol) *eol = '\0'; dbgprintf("Host %s need heading %s or %s - ps header line reads '%s'\n", hostname, cmdhdr, (altcmdhdr ? altcmdhdr : ""), psstr); /* Look for the primary key */ p = strstr(psstr, cmdhdr); if (p) { cmdofs = (p - psstr); dbgprintf("Host %s: Found pri. heading '%s' at offset %d\n", hostname, cmdhdr, cmdofs); } /* If there's a secondary key, look for that also */ if (altcmdhdr) { p = strstr(psstr, altcmdhdr); if (p) { dbgprintf("Host %s: Found sec. heading '%s' at offset %d\n", hostname, altcmdhdr, (p - psstr)); if ((cmdofs == -1) || ((p - psstr) < cmdofs)) { /* We'll use the secondary key */ cmdofs = (p - psstr); } } } if (eol) *eol = '\n'; if (cmdofs >= 0) { dbgprintf("Host %s: Found ps command line at offset %d\n", hostname, cmdofs); } else { dbgprintf("Host %s: None of the headings found\n", hostname); } pchecks = clear_process_counts(hinfo, clientclass); if (pchecks == 0) { /* Nothing to check */ sprintf(msgline, "&%s No process checks defined\n", colorname(noreportcolor)); addtobuffer(monmsg, msgline); pscolor = noreportcolor; } else if (cmdofs >= 0) { /* Count how many instances of each monitored process is running */ char *pname, *pid, *bol, *nl; int pcount, pmin, pmax, pcolor, ptrack; bol = psstr; while (bol) { nl = strchr(bol, '\n'); /* Take care - the ps output line may be shorter than what we look at */ if (nl) { *nl = '\0'; if ((nl-bol) > cmdofs) add_process_count(bol+cmdofs); *nl = '\n'; bol = nl+1; } else { if (strlen(bol) > cmdofs) add_process_count(bol+cmdofs); bol = NULL; } } /* Check the number found for each monitored process */ while ((pname = check_process_count(&pcount, &pmin, &pmax, &pcolor, &pid, &ptrack, &group)) != NULL) { char limtxt[1024]; if (pmax == -1) { if (pmin > 0) sprintf(limtxt, "%d or more", pmin); else if (pmin == 0) sprintf(limtxt, "none"); } else { if (pmin > 0) sprintf(limtxt, "between %d and %d", pmin, pmax); else if (pmin == 0) sprintf(limtxt, "at most %d", pmax); } if (pcolor == COL_GREEN) { sprintf(msgline, "&green %s (found %d, req. %s)\n", pname, pcount, limtxt); addtobuffer(monmsg, msgline); } else { if (pcolor > pscolor) pscolor = pcolor; sprintf(msgline, "&%s %s (found %d, req. %s)\n", colorname(pcolor), pname, pcount, limtxt); addtobuffer(monmsg, msgline); addalertgroup(group); } if (ptrack) { /* Save the count data for later DATA message to track process counts */ if (!pid) pid = "default"; sprintf(msgline, "%s:%u\n", pid, pcount); addtobuffer(countdata, msgline); anycountdata = 1; } } } else { pscolor = COL_YELLOW; sprintf(msgline, "&yellow Expected string %s not found in ps output header\n", cmdhdr); addtobuffer(monmsg, msgline); } /* Now we know the result, so generate a status message */ init_status(pscolor); group = getalertgroups(); if (group) sprintf(msgline, "status/group:%s ", group); else strcpy(msgline, "status "); addtostatus(msgline); sprintf(msgline, "%s.procs %s %s - Processes %s\n", commafy(hostname), colorname(pscolor), (timestr ? timestr : ""), (((pscolor == COL_RED) || (pscolor == COL_YELLOW)) ? "NOT ok" : "ok")); addtostatus(msgline); /* And add the info about what's wrong */ if (STRBUFLEN(monmsg)) { addtostrstatus(monmsg); addtostatus("\n"); } /* And the full ps output for those who want it */ if (pslistinprocs) addtostatus(prehtmlquoted(psstr)); if (fromline && !localmode) addtostatus(fromline); finish_status(); freestrbuffer(monmsg); if (anycountdata) combo_add(countdata); clearstrbuffer(countdata); } static void old_msgs_report(char *hostname, void *hinfo, char *fromline, char *timestr, char *msgsstr) { int msgscolor = COL_GREEN; char msgline[4096]; char *summary = "All logs OK"; if (msgsstr) { if (strstr(msgsstr, "&clear ")) { msgscolor = COL_CLEAR; summary = "No log data available"; } if (strstr(msgsstr, "&yellow ")) { msgscolor = COL_YELLOW; summary = "WARNING"; } if (strstr(msgsstr, "&red ")) { msgscolor = COL_RED; summary = "CRITICAL"; } } else if (sendclearmsgs) { msgscolor = noreportcolor; summary = "No log data available"; } else return; init_status(msgscolor); sprintf(msgline, "status %s.msgs %s System logs at %s : %s\n", commafy(hostname), colorname(msgscolor), (timestr ? timestr : ""), summary); addtostatus(msgline); if (msgsstr) addtostatus(msgsstr); else addtostatus("The client did not report any logfile data\n"); if (fromline && !localmode) addtostatus(fromline); finish_status(); } void msgs_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *msgsstr) { static strbuffer_t *greendata = NULL; static strbuffer_t *yellowdata = NULL; static strbuffer_t *reddata = NULL; sectlist_t *swalk; strbuffer_t *logsummary; int msgscolor = COL_GREEN; char msgline[PATH_MAX]; char *group; if (!want_msgtype(hinfo, MSG_MSGS)) return; for (swalk = defsecthead; (swalk && strncmp(swalk->sname, "msgs:", 5)); swalk = swalk->next) ; if (!swalk) { old_msgs_report(hostname, hinfo, fromline, timestr, msgsstr); return; } if (!greendata) greendata = newstrbuffer(0); if (!yellowdata) yellowdata = newstrbuffer(0); if (!reddata) reddata = newstrbuffer(0); clearalertgroups(); logsummary = newstrbuffer(0); while (swalk) { int logcolor; clearstrbuffer(logsummary); logcolor = scan_log(hinfo, clientclass, swalk->sname+5, swalk->sdata, swalk->sname, logsummary); if (logcolor > msgscolor) msgscolor = logcolor; switch (logcolor) { case COL_GREEN: if (!localmode) { sprintf(msgline, "\nNo entries in %s\n", hostsvcclienturl(hostname, swalk->sname), swalk->sname+5); } else { sprintf(msgline, "\nNo entries in %s\n", swalk->sname+5); } addtobuffer(greendata, msgline); break; case COL_YELLOW: if (!localmode) { sprintf(msgline, "\n&yellow Warnings in %s\n", hostsvcclienturl(hostname, swalk->sname), swalk->sname+5); } else { sprintf(msgline, "\n&yellow Warnings in %s\n", swalk->sname+5); } addtobuffer(yellowdata, msgline); addtostrbuffer(yellowdata, logsummary); break; case COL_RED: if (!localmode) { sprintf(msgline, "\n&red Critical entries in %s\n", hostsvcclienturl(hostname, swalk->sname), swalk->sname+5); } else { sprintf(msgline, "\n&red Critical entries in %s\n", swalk->sname+5); } addtobuffer(reddata, msgline); addtostrbuffer(reddata, logsummary); break; } do { swalk=swalk->next; } while (swalk && strncmp(swalk->sname, "msgs:", 5)); } freestrbuffer(logsummary); init_status(msgscolor); group = getalertgroups(); if (group) sprintf(msgline, "status/group:%s ", group); else strcpy(msgline, "status "); addtostatus(msgline); sprintf(msgline, "%s.msgs %s %s - System logs %s\n", commafy(hostname), colorname(msgscolor), (timestr ? timestr : ""), (((msgscolor == COL_RED) || (msgscolor == COL_YELLOW)) ? "NOT ok" : "ok")); addtostatus(msgline); if (STRBUFLEN(reddata)) { addtostrstatus(reddata); clearstrbuffer(reddata); addtostatus("\n"); } if (STRBUFLEN(yellowdata)) { addtostrstatus(yellowdata); clearstrbuffer(yellowdata); addtostatus("\n"); } if (STRBUFLEN(greendata)) { addtostrstatus(greendata); clearstrbuffer(greendata); addtostatus("\n"); } /* * Add the full log message data from each logfile. * It's probably faster to re-walk the section list than * stuffing the full messages into a temporary buffer. */ for (swalk = defsecthead; (swalk && strncmp(swalk->sname, "msgs:", 5)); swalk = swalk->next) ; while (swalk) { if (!localmode) { sprintf(msgline, "\nFull log %s\n", hostsvcclienturl(hostname, swalk->sname), swalk->sname+5); } else { sprintf(msgline, "\nFull log %s\n", swalk->sname+5); } addtostatus(msgline); addtostatus(prehtmlquoted(swalk->sdata)); do { swalk=swalk->next; } while (swalk && strncmp(swalk->sname, "msgs:", 5)); } if (fromline && !localmode) addtostatus(fromline); finish_status(); } void file_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr) { static strbuffer_t *greendata = NULL; static strbuffer_t *yellowdata = NULL; static strbuffer_t *reddata = NULL; static strbuffer_t *sizedata = NULL; sectlist_t *swalk; strbuffer_t *filesummary; int filecolor = -1, onecolor; char msgline[PATH_MAX]; char sectionname[PATH_MAX]; int anyszdata = 0; char *group; if (!want_msgtype(hinfo, MSG_FILES)) return; if (!greendata) greendata = newstrbuffer(0); if (!yellowdata) yellowdata = newstrbuffer(0); if (!reddata) reddata = newstrbuffer(0); if (!sizedata) sizedata = newstrbuffer(0); filesummary = newstrbuffer(0); clearalertgroups(); sprintf(msgline, "data %s.filesizes\n", commafy(hostname)); addtobuffer(sizedata, msgline); for (swalk = defsecthead; (swalk); swalk = swalk->next) { int trackit, anyrules; char *sfn = NULL; char *id = NULL; if (strncmp(swalk->sname, "file:", 5) == 0) { off_t sz; sfn = swalk->sname+5; sprintf(sectionname, "file:%s", sfn); onecolor = check_file(hinfo, clientclass, sfn, swalk->sdata, sectionname, filesummary, &sz, &id, &trackit, &anyrules); if (trackit) { /* Save the size data for later DATA message to track file sizes */ if (id == NULL) id = sfn; #ifdef _LARGEFILE_SOURCE sprintf(msgline, "%s:%lld\n", nocolon(id), (long long int)sz); #else sprintf(msgline, "%s:%ld\n", nocolon(id), (long int)sz); #endif addtobuffer(sizedata, msgline); anyszdata = 1; } } else if (strncmp(swalk->sname, "logfile:", 8) == 0) { off_t sz; sfn = swalk->sname+8; sprintf(sectionname, "logfile:%s", sfn); onecolor = check_file(hinfo, clientclass, sfn, swalk->sdata, sectionname, filesummary, &sz, &id, &trackit, &anyrules); if (trackit) { /* Save the size data for later DATA message to track file sizes */ if (id == NULL) id = sfn; #ifdef _LARGEFILE_SOURCE sprintf(msgline, "%s:%lld\n", nocolon(id), (long long int)sz); #else sprintf(msgline, "%s:%ld\n", nocolon(id), (long int)sz); #endif addtobuffer(sizedata, msgline); anyszdata = 1; } if (!anyrules) { /* Don't clutter the display with logfiles unless they have rules */ continue; } } else if (strncmp(swalk->sname, "dir:", 4) == 0) { unsigned long sz; sfn = swalk->sname+4; sprintf(sectionname, "dir:%s", sfn); onecolor = check_dir(hinfo, clientclass, sfn, swalk->sdata, sectionname, filesummary, &sz, &id, &trackit); if (trackit) { /* Save the size data for later DATA message to track directory sizes */ if (id == NULL) id = sfn; sprintf(msgline, "%s:%lu\n", nocolon(id), sz); addtobuffer(sizedata, msgline); anyszdata = 1; } } else continue; if (onecolor > filecolor) filecolor = onecolor; switch (onecolor) { case COL_GREEN: if (!localmode) { sprintf(msgline, "\n&green %s\n", hostsvcclienturl(hostname, sectionname), sfn); } else { sprintf(msgline, "\n&green %s\n", sfn); } addtobuffer(greendata, msgline); break; case COL_YELLOW: if (!localmode) { sprintf(msgline, "\n&yellow %s\n", hostsvcclienturl(hostname, sectionname), sfn); } else { sprintf(msgline, "\n&yellow %s\n", sfn); } addtobuffer(yellowdata, msgline); addtostrbuffer(yellowdata, filesummary); break; case COL_RED: if (!localmode) { sprintf(msgline, "\n&red %s\n", hostsvcclienturl(hostname, sectionname), sfn); } else { sprintf(msgline, "\n&red %s\n", sfn); } addtobuffer(reddata, msgline); addtostrbuffer(reddata, filesummary); break; } clearstrbuffer(filesummary); } freestrbuffer(filesummary); if ((filecolor == -1) && sendclearfiles) { filecolor = noreportcolor; addtobuffer(greendata, "No files checked\n"); } if (filecolor != -1) { init_status(filecolor); group = getalertgroups(); if (group) sprintf(msgline, "status/group:%s ", group); else strcpy(msgline, "status "); addtostatus(msgline); sprintf(msgline, "%s.files %s %s - Files %s\n", commafy(hostname), colorname(filecolor), (timestr ? timestr : ""), (((filecolor == COL_RED) || (filecolor == COL_YELLOW)) ? "NOT ok" : "ok")); addtostatus(msgline); if (STRBUFLEN(reddata)) { addtostrstatus(reddata); clearstrbuffer(reddata); addtostatus("\n"); } if (STRBUFLEN(yellowdata)) { addtostrstatus(yellowdata); clearstrbuffer(yellowdata); addtostatus("\n"); } if (STRBUFLEN(greendata)) { addtostrstatus(greendata); clearstrbuffer(greendata); addtostatus("\n"); } if (fromline && !localmode) addtostatus(fromline); finish_status(); } else { clearstrbuffer(reddata); clearstrbuffer(yellowdata); clearstrbuffer(greendata); } if (anyszdata) combo_add(sizedata); clearstrbuffer(sizedata); } void linecount_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr) { static strbuffer_t *countdata = NULL; sectlist_t *swalk; char msgline[PATH_MAX]; int anydata = 0; if (!countdata) countdata = newstrbuffer(0); sprintf(msgline, "data %s.linecounts\n", commafy(hostname)); addtobuffer(countdata, msgline); for (swalk = defsecthead; (swalk); swalk = swalk->next) { if (strncmp(swalk->sname, "linecount:", 10) == 0) { char *fn, *boln, *eoln, *id, *countstr; anydata = 1; fn = strchr(swalk->sname, ':'); fn += 1 + strspn(fn+1, "\t "); boln = swalk->sdata; while (boln) { eoln = strchr(boln, '\n'); id = strtok(boln, ":"); countstr = (id ? strtok(NULL, "\n") : NULL); if (id && countstr) { countstr += strspn(countstr, "\t "); snprintf(msgline, sizeof(msgline), "%s#%s:%s\n", nocolon(fn), id, countstr); addtobuffer(countdata, msgline); } boln = (eoln ? eoln + 1 : NULL); } } } if (anydata) combo_add(countdata); clearstrbuffer(countdata); } void deltacount_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr) { static strbuffer_t *countdata = NULL; sectlist_t *swalk; char msgline[PATH_MAX]; int anydata = 0; if (!countdata) countdata = newstrbuffer(0); sprintf(msgline, "data %s.deltacounts\n", commafy(hostname)); addtobuffer(countdata, msgline); for (swalk = defsecthead; (swalk); swalk = swalk->next) { if (strncmp(swalk->sname, "deltacount:", 10) == 0) { char *fn, *boln, *eoln, *id, *countstr; anydata = 1; fn = strchr(swalk->sname, ':'); fn += 1 + strspn(fn+1, "\t "); boln = swalk->sdata; while (boln) { eoln = strchr(boln, '\n'); id = strtok(boln, ":"); countstr = (id ? strtok(NULL, "\n") : NULL); if (id && countstr) { countstr += strspn(countstr, "\t "); snprintf(msgline, sizeof(msgline), "%s#%s:%s\n", nocolon(fn), id, countstr); addtobuffer(countdata, msgline); } boln = (eoln ? eoln + 1 : NULL); } } } if (anydata) combo_add(countdata); clearstrbuffer(countdata); } void unix_netstat_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *netstatstr) { strbuffer_t *msg; char msgline[4096]; if (!netstatstr) return; msg = newstrbuffer(0); sprintf(msgline, "data %s.netstat\n%s\n", commafy(hostname), osname(os)); addtobuffer(msg, msgline); addtobuffer(msg, netstatstr); combo_add(msg); freestrbuffer(msg); } void unix_ifstat_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *ifstatstr) { strbuffer_t *msg; char msgline[4096]; if (!ifstatstr) return; msg = newstrbuffer(0); sprintf(msgline, "data %s.ifstat\n%s\n", commafy(hostname), osname(os)); addtobuffer(msg, msgline); addtobuffer(msg, ifstatstr); combo_add(msg); freestrbuffer(msg); } void unix_vmstat_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, char *vmstatstr) { strbuffer_t *msg; char msgline[4096]; char *p; if (!vmstatstr) return; p = strrchr(vmstatstr, '\n'); if (!p) return; /* No NL in vmstat output ? Unlikely. */ if (strlen(p) == 1) { /* Go back to the previous line */ do { p--; } while ((p > vmstatstr) && (*p != '\n')); } if (strcmp(p+1,"Terminated") == 0) return; /* vmstat process was killed early - ignore data */ msg = newstrbuffer(0); sprintf(msgline, "data %s.vmstat\n%s\n", commafy(hostname), osname(os)); addtobuffer(msg, msgline); addtobuffer(msg, p+1); combo_add(msg); freestrbuffer(msg); } void unix_ports_report(char *hostname, char *clientclass, enum ostype_t os, void *hinfo, char *fromline, char *timestr, int localcol, int remotecol, int statecol, char *portstr) { int portcolor = -1; int pchecks; char msgline[4096]; static strbuffer_t *monmsg = NULL; static strbuffer_t *countdata = NULL; int anycountdata = 0; char *group; if (!want_msgtype(hinfo, MSG_PORTS)) return; if (!portstr) return; if (!monmsg) monmsg = newstrbuffer(0); if (!countdata) countdata = newstrbuffer(0); clearalertgroups(); pchecks = clear_port_counts(hinfo, clientclass); sprintf(msgline, "data %s.portcounts\n", commafy(hostname)); addtobuffer(countdata, msgline); if (pchecks > 0) { /* Count how many instances of each monitored condition are found */ char *pname, *pid, *bol, *nl; int pcount, pmin, pmax, pcolor, ptrack; char *localstr, *remotestr, *statestr; bol = portstr; while (bol) { char *p; nl = strchr(bol, '\n'); if (nl) *nl = '\0'; /* Data lines */ p = strdup(bol); localstr = getcolumn(p, localcol); strcpy(p, bol); remotestr = getcolumn(p, remotecol); strcpy(p, bol); statestr = getcolumn(p, statecol); add_port_count(localstr, remotestr, statestr); xfree(p); if (nl) { *nl = '\n'; bol = nl+1; } else bol = NULL; } /* Check the number found for each monitored port */ while ((pname = check_port_count(&pcount, &pmin, &pmax, &pcolor, &pid, &ptrack, &group)) != NULL) { char limtxt[1024]; *limtxt = '\0'; if (pmax == -1) { if (pmin > 0) sprintf(limtxt, "%d or more", pmin); else if (pmin == 0) sprintf(limtxt, "none"); } else { if (pmin > 0) sprintf(limtxt, "between %d and %d", pmin, pmax); else if (pmin == 0) sprintf(limtxt, "at most %d", pmax); } if (pcolor > portcolor) portcolor = pcolor; if (pcolor == COL_GREEN) { sprintf(msgline, "&green %s (found %d, req. %s)\n", pname, pcount, limtxt); addtobuffer(monmsg, msgline); } else { sprintf(msgline, "&%s %s (found %d, req. %s)\n", colorname(pcolor), pname, pcount, limtxt); addtobuffer(monmsg, msgline); addalertgroup(group); } if (ptrack) { /* Save the size data for later DATA message to track port counts */ if (!pid) pid = "default"; sprintf(msgline, "%s:%u\n", pid, pcount); addtobuffer(countdata, msgline); anycountdata = 1; } } } if ((portcolor == -1) && sendclearports) { /* Nothing to check */ addtobuffer(monmsg, "No port checks defined\n"); portcolor = noreportcolor; } if (portcolor != -1) { /* Now we know the result, so generate a status message */ init_status(portcolor); group = getalertgroups(); if (group) sprintf(msgline, "status/group:%s ", group); else strcpy(msgline, "status "); addtostatus(msgline); sprintf(msgline, "%s.ports %s %s - Ports %s\n", commafy(hostname), colorname(portcolor), (timestr ? timestr : ""), (((portcolor == COL_RED) || (portcolor == COL_YELLOW)) ? "NOT ok" : "ok")); addtostatus(msgline); /* And add the info about what's wrong */ addtostrstatus(monmsg); addtostatus("\n"); clearstrbuffer(monmsg); /* And the full port output for those who want it */ if (portlistinports) addtostatus(portstr); if (fromline) addtostatus(fromline); finish_status(); } else { clearstrbuffer(monmsg); } if (anycountdata) combo_add(countdata); clearstrbuffer(countdata); } #include "client/linux.c" #include "client/freebsd.c" #include "client/netbsd.c" #include "client/openbsd.c" #include "client/solaris.c" #include "client/hpux.c" #include "client/osf.c" #include "client/aix.c" #include "client/darwin.c" #include "client/irix.c" #include "client/sco_sv.c" #include "client/bbwin.c" #include "client/powershell.c" /* Must go after client/bbwin.c */ #include "client/zvm.c" #include "client/zvse.c" #include "client/zos.c" #include "client/mqcollect.c" #include "client/snmpcollect.c" #include "client/generic.c" static volatile int reloadconfig = 0; void sig_handler(int signum) { switch (signum) { case SIGHUP: reloadconfig = 1; break; default: break; } } void clean_instr(char *s) { char *p; p = s + strcspn(s, "\r\n"); *p = '\0'; } void testmode(char *configfn) { void *hinfo, *oldhinfo = NULL; char hostname[1024], clientclass[1024]; char s[4096]; load_hostnames(xgetenv("HOSTSCFG"), NULL, get_fqdn()); load_client_config(configfn); *hostname = '\0'; *clientclass = '\0'; while (1) { hinfo = NULL; while (!hinfo) { printf("Hostname (.=end, ?=dump, !=reload) [%s]: ", hostname); fflush(stdout); if (!fgets(hostname, sizeof(hostname), stdin)) return; clean_instr(hostname); if (strlen(hostname) == 0) { hinfo = oldhinfo; if (hinfo) strcpy(hostname, xmh_item(hinfo, XMH_HOSTNAME)); } else if (strcmp(hostname, ".") == 0) { exit(0); } else if (strcmp(hostname, "!") == 0) { load_hostnames(xgetenv("HOSTSCFG"), NULL, get_fqdn()); load_client_config(configfn); *hostname = '\0'; } else if (strcmp(hostname, "?") == 0) { dump_client_config(); if (oldhinfo) strcpy(hostname, xmh_item(oldhinfo, XMH_HOSTNAME)); } else { hinfo = hostinfo(hostname); if (!hinfo) printf("Unknown host\n"); printf("Hosttype [%s]: ", clientclass); fflush(stdout); if (!fgets(clientclass, sizeof(clientclass), stdin)) return; clean_instr(clientclass); } } oldhinfo = hinfo; printf("Test (cpu, mem, disk, proc, log, port): "); fflush(stdout); if (!fgets(s, sizeof(s), stdin)) return; clean_instr(s); if (strcmp(s, "cpu") == 0) { float loadyellow, loadred; int recentlimit, ancientlimit, uptimecolor; int maxclockdiff, clockdiffcolor; get_cpu_thresholds(hinfo, clientclass, &loadyellow, &loadred, &recentlimit, &ancientlimit, &uptimecolor, &maxclockdiff, &clockdiffcolor); printf("Load: Yellow at %.2f, red at %.2f\n", loadyellow, loadred); printf("Uptime: %s from boot until %s,", colorname(uptimecolor), durationstring(recentlimit)); printf("and after %s uptime\n", durationstring(ancientlimit)); if (maxclockdiff > 0) printf("Max clock diff: %d (%s)\n", maxclockdiff, colorname(clockdiffcolor)); } else if (strcmp(s, "mem") == 0) { int physyellow, physred, swapyellow, swapred, actyellow, actred; get_memory_thresholds(hinfo, clientclass, &physyellow, &physred, &swapyellow, &swapred, &actyellow, &actred); printf("Phys: Yellow at %d, red at %d\n", physyellow, physred); printf("Swap: Yellow at %d, red at %d\n", swapyellow, swapred); printf("Act.: Yellow at %d, red at %d\n", actyellow, actred); } else if (strcmp(s, "disk") == 0) { unsigned long warnlevel, paniclevel; int abswarn, abspanic, ignored; char *groups; printf("Filesystem: "); fflush(stdout); if (!fgets(s, sizeof(s), stdin)) return; clean_instr(s); get_disk_thresholds(hinfo, clientclass, s, &warnlevel, &paniclevel, &abswarn, &abspanic, &ignored, &groups); if (ignored) printf("Ignored\n"); else printf("Yellow at %lu%c, red at %lu%c\n", warnlevel, (abswarn ? 'U' : '%'), paniclevel, (abspanic ? 'U' : '%')); } else if (strcmp(s, "proc") == 0) { int pchecks = clear_process_counts(hinfo, clientclass); char *pname, *pid; int pcount, pmin, pmax, pcolor, ptrack; char *groups; FILE *fd; if (pchecks == 0) { printf("No process checks for this host\n"); continue; } printf("To read 'ps' data from a file, enter '@FILENAME' at the prompt\n"); do { printf("ps command string: "); fflush(stdout); if (!fgets(s, sizeof(s), stdin)) return; clean_instr(s); if (*s == '@') { fd = fopen(s+1, "r"); while (fd && fgets(s, sizeof(s), fd)) { clean_instr(s); if (*s) add_process_count(s); } fclose(fd); } else { if (*s) add_process_count(s); } } while (*s); while ((pname = check_process_count(&pcount, &pmin, &pmax, &pcolor, &pid, &ptrack, &groups)) != NULL) { printf("Process %s color %s: Count=%d, min=%d, max=%d\n", pname, colorname(pcolor), pcount, pmin, pmax); } } else if (strcmp(s, "log") == 0) { FILE *fd; char *sectname; strbuffer_t *logdata, *logsummary; int logcolor; printf("log filename: "); fflush(stdout); if (!fgets(s, sizeof(s), stdin)) return; clean_instr(s); sectname = (char *)malloc(strlen(s) + 20); sprintf(sectname, "msgs:%s", s); logdata = newstrbuffer(0); logsummary = newstrbuffer(0); printf("To read log data from a file, enter '@FILENAME' at the prompt\n"); do { printf("log line: "); fflush(stdout); if (!fgets(s, sizeof(s), stdin)) return; clean_instr(s); if (*s == '@') { fd = fopen(s+1, "r"); while (fd && fgets(s, sizeof(s), fd)) { if (*s) addtobuffer(logdata, s); } fclose(fd); } else { if (*s) addtobuffer(logdata, s); } } while (*s); clearstrbuffer(logsummary); logcolor = scan_log(hinfo, clientclass, sectname+5, STRBUF(logdata), sectname, logsummary); printf("Log status is %s\n\n", colorname(logcolor)); if (STRBUFLEN(logsummary)) printf("%s\n", STRBUF(logsummary)); freestrbuffer(logsummary); freestrbuffer(logdata); } else if (strcmp(s, "port") == 0) { char *localstr, *remotestr, *statestr, *p, *pname, *pid; int pcount, pmin, pmax, pcolor, pchecks, ptrack; char *groups; int localcol = 4, remotecol = 5, statecol = 6, portcolor = COL_GREEN; pchecks = clear_port_counts(hinfo, clientclass); if (pchecks == 0) { printf("No PORT checks for this host\n"); continue; } printf("Need to know netstat columns for 'Local address', 'Remote address' and 'State'\n"); printf("Enter columns [%d %d %d]: ", localcol, remotecol, statecol); fflush(stdout); if (!fgets(s, sizeof(s), stdin)) return; clean_instr(s); if (*s) sscanf(s, "%d %d %d", &localcol, &remotecol, &statecol); printf("To read 'netstat' data from a file, enter '@FILENAME' at the prompt\n"); do { printf("netstat line: "); fflush(stdout); if (!fgets(s, sizeof(s), stdin)) return; clean_instr(s); if (*s == '@') { FILE *fd; fd = fopen(s+1, "r"); while (fd && fgets(s, sizeof(s), fd)) { clean_instr(s); if (*s) { p = strdup(s); localstr = getcolumn(p, localcol-1); strcpy(p, s); remotestr = getcolumn(p, remotecol-1); strcpy(p, s); statestr = getcolumn(p, statecol-1); add_port_count(localstr, remotestr, statestr); xfree(p); } } fclose(fd); } else if (*s) { p = strdup(s); localstr = getcolumn(p, localcol-1); strcpy(p, s); remotestr = getcolumn(p, remotecol-1); strcpy(p, s); statestr = getcolumn(p, statecol-1); add_port_count(localstr, remotestr, statestr); xfree(p); } } while (*s); /* Check the number found for each monitored port */ while ((pname = check_port_count(&pcount, &pmin, &pmax, &pcolor, &pid, &ptrack, &groups)) != NULL) { char limtxt[1024]; if (pmax == -1) { if (pmin > 0) sprintf(limtxt, "%d or more", pmin); else if (pmin == 0) sprintf(limtxt, "none"); } else { if (pmin > 0) sprintf(limtxt, "between %d and %d", pmin, pmax); else if (pmin == 0) sprintf(limtxt, "at most %d", pmax); } if (pcolor == COL_GREEN) { printf("&green %s (found %d, req. %s)\n", pname, pcount, limtxt); } else { if (pcolor > portcolor) portcolor = pcolor; printf("&%s %s (found %d, req. %s)\n", colorname(pcolor), pname, pcount, limtxt); } } } } exit(0); } int main(int argc, char *argv[]) { char *msg; int running; int argi, seq; struct sigaction sa; time_t nextconfigload = 0; char *configfn = NULL; char **collectors = NULL; /* Handle program options. */ for (argi = 1; (argi < argc); argi++) { if (strcmp(argv[argi], "--debug") == 0) { debug = 1; } else if (strcmp(argv[argi], "--no-update") == 0) { dontsendmessages = 1; } else if (strcmp(argv[argi], "--no-ps-listing") == 0) { pslistinprocs = 0; } else if (strcmp(argv[argi], "--no-port-listing") == 0) { portlistinports = 0; } else if (strcmp(argv[argi], "--no-clear-msgs") == 0) { sendclearmsgs = 0; } else if (strcmp(argv[argi], "--no-clear-files") == 0) { sendclearfiles = 0; } else if (strcmp(argv[argi], "--no-clear-ports") == 0) { sendclearports = 0; } else if (strncmp(argv[argi], "--clear-color=", 14) == 0) { char *p = strchr(argv[argi], '='); noreportcolor = parse_color(p+1); } else if (strcmp(argv[argi], "--uptime-status") == 0) { separate_uptime_status = 1; } else if (argnmatch(argv[argi], "--config=")) { char *lp = strchr(argv[argi], '='); configfn = strdup(lp+1); } else if (argnmatch(argv[argi], "--collectors=")) { char *lp = strdup(strchr(argv[argi], '=')+1); char *tok; int i; tok = strtok(lp, ","); i = 0; collectors = (char **)calloc(1, sizeof(char *)); while (tok) { collectors = (char **)realloc(collectors, (i+2)*sizeof(char *)); if (strcasecmp(tok, "default") == 0) tok = ""; collectors[i++] = tok; collectors[i] = NULL; tok = strtok(NULL, ","); } } else if (strcmp(argv[argi], "--unknownclientosok") == 0) { unknownclientosok = 1; } else if (argnmatch(argv[argi], "--dump-config")) { load_client_config(configfn); dump_client_config(); return 0; } else if (strcmp(argv[argi], "--local") == 0) { localmode = 1; } else if (strcmp(argv[argi], "--test") == 0) { testmode(configfn); } else if (net_worker_option(argv[argi])) { /* Handled in the subroutine */ } } save_errbuf = 0; if (collectors == NULL) { /* Setup the default collectors */ collectors = (char **)calloc(2, sizeof(char *)); collectors[0] = ""; collectors[1] = NULL; } /* Do the network stuff if needed */ net_worker_run(ST_CLIENT, LOC_ROAMING, NULL); /* Signals */ setup_signalhandler("xymond_client"); memset(&sa, 0, sizeof(sa)); sa.sa_handler = sig_handler; sigaction(SIGHUP, &sa, NULL); signal(SIGCHLD, SIG_IGN); updinfotree = xtreeNew(strcasecmp); running = 1; usebackfeedqueue = (sendmessage_init_local() > 0); while (running) { char *eoln, *restofmsg, *p; char *metadata[MAX_META+1]; int metacount; time_t nowtimer = gettimer(); msg = get_xymond_message(C_CLIENT, argv[0], &seq, NULL); if (msg == NULL) { if (!localmode) errprintf("Failed to get a message, terminating\n"); running = 0; continue; } if (reloadconfig || (nowtimer >= nextconfigload)) { nextconfigload = nowtimer + 600; reloadconfig = 0; if (!localmode) load_hostnames(xgetenv("HOSTSCFG"), NULL, get_fqdn()); load_client_config(configfn); } /* Split the message in the first line (with meta-data), and the rest */ eoln = strchr(msg, '\n'); if (eoln) { *eoln = '\0'; restofmsg = eoln+1; } else { restofmsg = ""; } metacount = 0; memset(&metadata, 0, sizeof(metadata)); p = gettok(msg, "|"); while (p && (metacount < MAX_META)) { metadata[metacount++] = p; p = gettok(NULL, "|"); } metadata[metacount] = NULL; if ((metacount > 4) && (strncmp(metadata[0], "@@client", 8) == 0)) { int cnum, havecollector; time_t timestamp = atoi(metadata[1]); char *sender = metadata[2]; char *hostname = metadata[3]; char *clientos = metadata[4]; char *clientclass = metadata[5]; char *collectorid = metadata[6]; enum ostype_t os; void *hinfo = NULL; dbgprintf("Client report from host %s\n", (hostname ? hostname : "")); /* Check if we are running a collector module for this type of client */ if (!collectorid) collectorid = ""; for (cnum = 0, havecollector = 0; (collectors[cnum] && !havecollector); cnum++) havecollector = (strcmp(collectorid, collectors[cnum]) == 0); if (!havecollector) continue; hinfo = (localmode ? localhostinfo(hostname) : hostinfo(hostname)); if (!hinfo) continue; os = get_ostype(clientos); /* Default clientclass to the OS name */ if (!clientclass || (*clientclass == '\0')) clientclass = clientos; /* Check for duplicates */ if (add_updateinfo(hostname, seq, timestamp) != 0) continue; if (usebackfeedqueue) combo_start_local(); else combo_start(); switch (os) { case OS_FREEBSD: handle_freebsd_client(hostname, clientclass, os, hinfo, sender, timestamp, restofmsg); break; case OS_NETBSD: handle_netbsd_client(hostname, clientclass, os, hinfo, sender, timestamp, restofmsg); break; case OS_OPENBSD: handle_openbsd_client(hostname, clientclass, os, hinfo, sender, timestamp, restofmsg); break; case OS_LINUX22: case OS_LINUX: case OS_RHEL3: handle_linux_client(hostname, clientclass, os, hinfo, sender, timestamp, restofmsg); break; case OS_DARWIN: handle_darwin_client(hostname, clientclass, os, hinfo, sender, timestamp, restofmsg); break; case OS_SOLARIS: handle_solaris_client(hostname, clientclass, os, hinfo, sender, timestamp, restofmsg); break; case OS_HPUX: handle_hpux_client(hostname, clientclass, os, hinfo, sender, timestamp, restofmsg); break; case OS_OSF: handle_osf_client(hostname, clientclass, os, hinfo, sender, timestamp, restofmsg); break; case OS_AIX: handle_aix_client(hostname, clientclass, os, hinfo, sender, timestamp, restofmsg); break; case OS_IRIX: handle_irix_client(hostname, clientclass, os, hinfo, sender, timestamp, restofmsg); break; case OS_SCO_SV: handle_sco_sv_client(hostname, clientclass, os, hinfo, sender, timestamp, restofmsg); break; case OS_WIN32_BBWIN: handle_win32_bbwin_client(hostname, clientclass, os, hinfo, sender, timestamp, restofmsg); break; case OS_WIN_POWERSHELL: handle_powershell_client(hostname, clientclass, os, hinfo, sender, timestamp, restofmsg); break; case OS_ZVM: handle_zvm_client(hostname, clientclass, os, hinfo, sender, timestamp, restofmsg); break; case OS_ZVSE: handle_zvse_client(hostname, clientclass, os, hinfo, sender, timestamp, restofmsg); break; case OS_ZOS: handle_zos_client(hostname, clientclass, os, hinfo, sender, timestamp, restofmsg); break; case OS_SNMPCOLLECT: handle_snmpcollect_client(hostname, clientclass, os, hinfo, sender, timestamp, restofmsg); break; case OS_MQCOLLECT: handle_mqcollect_client(hostname, clientclass, os, hinfo, sender, timestamp, restofmsg); break; default: if (unknownclientosok) { dbgprintf("No client backend for OS '%s' sent by %s; using generic\n", clientos, sender); handle_generic_client(hostname, clientclass, os, hinfo, sender, timestamp, restofmsg); } else errprintf("No client backend for OS '%s' sent by %s\n", clientos, sender); break; } combo_end(); } else if (strncmp(metadata[0], "@@shutdown", 10) == 0) { printf("Shutting down\n"); running = 0; continue; } else if (strncmp(metadata[0], "@@logrotate", 11) == 0) { char *fn = xgetenv("XYMONCHANNEL_LOGFILENAME"); if (fn && strlen(fn)) { reopen_file(fn, "a", stdout); reopen_file(fn, "a", stderr); } continue; } else if (strncmp(metadata[0], "@@reload", 8) == 0) { reloadconfig = 1; } else { /* Unknown message - ignore it */ } } if (usebackfeedqueue) sendmessage_finish_local(); return 0; } xymon-4.3.28/xymond/xymond_client.80000664000076400007640000000731213037531444017504 0ustar rpmbuildrpmbuild.TH XYMOND_CLIENT 8 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME xymond_client \- xymond worker module for client data .SH SYNOPSIS .B "xymond_channel \-\-channel=client xymond_client [options]" .SH DESCRIPTION xymond_client is a worker module for xymond, and as such it is normally run via the .I xymond_channel(8) program. It receives xymond client messages sent from systems that have the the Xymon client installed, and use the client data to generate the Xymon status messages for the cpu-, disk-, memory- and procs-columns. It also feeds Xymon data messages with the netstat- and vmstat-data collected by the client. When generating these status messages from the client data, xymond_client will use the configuration rules defined in the .I analysis.cfg(5) file to determine the color of each status message. .SH OPTIONS .IP "\-\-clear\-color=COLOR" Define the color used when sending "msgs", "files" or "ports" reports and there are no rules to check for these statuses. The default is to show a "clear" status, but some people prefer to have it "green". If you would rather prefer not to see these status columns at all, then you can use the "\-\-no\-clear\-msgs", "\-\-no\-clear\-files" and "\-\-no\-clear\-ports" options instead. .IP "\-\-no\-clear\-msgs" If there are no logfile checks, the "msgs" column will show a "clear" status. If you would rather avoid having a "msgs" column, this option causes xymond_client to not send in a clear "msgs" status. .IP "\-\-no\-clear\-files" If there are no file checks, the "files" column will show a "clear" status. If you would rather avoid having a "files" column, this option causes xymond_client to not send in a clear "files" status. .IP "\-\-no\-clear\-ports" If there are no port checks, the "ports" column will show a "clear" status. If you would rather avoid having a "ports" column, this option causes xymond_client to not send in a clear "ports" status. .IP "\-\-no\-ps\-listing" Normally the "procs" status message includes the full process-listing received from the client. If you prefer to just have the monitored processes shown, this option will turn off the full ps-listing. .IP "\-\-no\-port\-listing" Normally the "ports" status message includes the full netstat-listing received from the client. If you prefer to just have the monitored ports shown, this option will turn off the full netstat-listing. .IP "\-\-uptime\-status" Generate a separate "uptime" status column. The uptime is normally just reported in the "cpu" status column, but if you would like a separate status column for the uptime, you can use this option. It is useful if you want to generate an alert in case of a reboot, without having this alert mixed in with the cpu load alerts. .IP "\-\-config=FILENAME" Sets the filename for the .I analysis.cfg file. The default value is "etc/analysis.cfg" below the Xymon server directory. .IP "\-\-unknownclientosok" Expect and attempt to parse clients with unknown CLIENTOS types. Useful if you're submitting custom host responses with file or msgs data that you'd like to parse. .IP "\-\-dump\-config" Dumps the configuration after parsing it. May be useful to track down problems with configuration file errors. .IP "\-\-test" Starts an interactive session where you can test the analysis.cfg configuration. .IP "\-\-collectors=COLLECTOR1[,COLLECTOR2,...] Limit the set of collector modules that xymond_client will handle. This is not normally used except for running experimental versions of the program. .IP "\-\-debug" Enable debugging output. .SH FILES .IP "~xymon/server/etc/analysis.cfg" .SH BUGS The "disk" status cannot handle filesystems containing whitespace in the filesystem (device) name. .SH "SEE ALSO" analysis.cfg(5), xymond(8), xymond_channel(8), xymon(7) xymon-4.3.28/xymond/xymond_history.80000664000076400007640000000537713037531444017740 0ustar rpmbuildrpmbuild.TH XYMOND_HISTORY 8 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME xymond_history \- xymond worker module for logging status changes .SH SYNOPSIS .B "xymond_channel \-\-channel=stachg xymond_history [options]" .SH DESCRIPTION xymond_history is a worker module for xymond, and as such it is normally run via the .I xymond_channel(8) program. It receives xymond status-change messages from the "stachg" channel via stdin, and uses these to update the history logfiles in a manner that is compatible with the standard Big Brother daemon, bbd. .SH OPTIONS .IP "\-\-histdir=DIRECTORY" The directory for the history files. If not specified, the directory given by the XYMONHISTDIR environment is used. .IP "\-\-histlogdir=DIRECTORY" The directory for the historical status-logs. If not specified, the directory given by the XYMONHISTLOGS environment is used. .IP "\-\-minimum\-free=N" Sets the minimum percentage of free filesystem space on the $XYMONHISTLOGS directory. If there is less than N% free space, xymond_history will not save the detailed status-logs. Default: 5 .IP "\-\-pidfile=FILENAME" xymond_history writes the process-ID it is running with to this file. This is for use in automated startup scripts. The default file is $XYMONSERVERLOGS/xymond_history.pid. .IP "\-\-debug" Enable debugging output. .SH ENVIRONMENT .IP XYMONALLHISTLOG This environment variable controls if the $XYMONHISTDIR/allevents logfile is updated. This file is used by the event-log display on the nongreen html page and the eventlog-webpage, among other things. You can disable it by setting XYMONALLHISTLOGS=FALSE, but this is not recommended. .IP XYMONHOSTHISTLOG This environment variable controls if the $XYMONHISTDIR/HOSTNAME logfile is updated. This file holds a list of all status changes seen for a single host, but is not used by any of the standard Xymon tools. If you do not want to save this, you can disable it by setting XYMONHOSTHISTLOG=FALSE. .IP SAVESTATUSLOG This environment variable controls if the historical status-logs are saved whenever a status change occurs. These logfiles are stored in the $XYMONHISTLOGS directory, and are used for the detailed log-display of a status from the Xymon "History" page. If you do not want to save these, you can disable it by setting SAVESTATUSLOG=FALSE. If you want to save all except some specific logs, use SAVESTATUSLOG=TRUE,!TEST1[,!TEST2...] If you want to save none except some specific logs, use SAVESTATUSLOG=FALSE,TEST1[,TEST2...] .br NOTE: Status logs will not be saved if there is less than 5% free space on the filesystem hosting the $XYMONHISTLOGS directory. The threshold can be tuned via the "\-\-minimum\-free" option. .SH FILES This module does not rely on any configuration files. .SH "SEE ALSO" xymond_channel(8), xymond(8), xymon(7) xymon-4.3.28/xymond/combostatus.10000664000076400007640000000353113037531444017163 0ustar rpmbuildrpmbuild.TH COMBOSTATUS 1 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME combostatus \- Xymon combination test tool .SH SYNOPSIS .B "combostatus \-\-help" .br .B "combostatus \-\-version" .br .B "combostatus [\-\-debug] [\-\-quiet]" .SH DESCRIPTION \fBcombostatus\fR is a Xymon extension script that runs on the Xymon server. It combines the results of one or more of the normal Xymon test results into a combined test result, using standard arithmetic og logical operators. The resulting tests are sent to the Xymon display server as any normal test - so all of the standard Xymon functions (history, statistics etc.) are available for the combined tests. The tool was born from the need to monitor systems with built-in redundancy and automatic failover - e.g. load-balanced web servers. But other uses are possible. .SH OPTIONS .IP "\-\-error\-colors=COLOR[,COLOR]" Specify which colors trigger an error status. By default only a "red" status counts as an error color - all other colors, including yellow, will count as "green" when evaluating the combined status. COLOR is "red", "yellow", "blue", "purple" or "clear". .IP "\-\-quiet" Normally, the test status sent by combostatus includes information about the underlying test results used to determine the current value of the combined test. "\-\-quiet" eliminates this information from the test status page. .IP "\-\-debug" Provide debugging output for use in troubleshooting problems with combostatus. .IP "\-\-no\-update" Don't send any status messages - instead, the result of the combotests is simply dumped to stdout. Useful for debugging. .SH FILES .IP $XYMONHOME/etc/combo.cfg Configuration file for combostatus, where the combined tests are defined .IP $XYMONHOME/etc/tasks.cfg Configuration file controlling when combostatus is run. .SH "SEE ALSO" combo.cfg(5), hosts.cfg(5), xymonserver.cfg(5), tasks.cfg(5) xymon-4.3.28/xymond/xymonweb.50000664000076400007640000001144413037531444016476 0ustar rpmbuildrpmbuild.TH XYMONWEB 5 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME Xymon-Web-Templates \- web page headers, footers and forms. .SH DESCRIPTION The Xymon webpages are somewhat customizable, by modifying the header- and footer-templates found in the ~xymon/server/web/ directory. There are usually two or more files for a webpage: A \fBtemplate_header\fR file which is the header for this webpage, and a \fBtemplate_footer\fR file which is the footer. Webpages where entry forms are used have a \fBtemplate_form\fR file which is the data-entry form. With the exception of the \fBbulletin\fR files, the header files are inserted into the HTML code at the very beginning and the footer files are inserted at the bottom. The following templates are available: .IP bulletin A \fBbulletin_header\fR and \fBbulletin_footer\fR is not shipped with Xymon, but if they exist then the content of these files will be inserted in all HTML documents generated by Xymon. The "bulletin_header" contents will appear after the normal header for the webpage, and the "bulletin_footer" will appear just before the normal footer for the webpage. These files can be used to post important information about the Xymon system, e.g. to notify users of current operational or monitoring problems. .IP acknowledge Header, footer and form template for the Xymon \fBacknowledge alert\fR webpage generated by .I acknowledge.cgi(1) .IP stdnormal Header and footer for the Xymon \fBMain view\fR webpages, generated by .I xymongen(1) .IP stdnongreen Header and footer for the Xymon \fBAll non-green view\fR webpage, generated by .I xymongen(1) .IP "stdcritical (DEPRECATED)" Header and footer for the now deprecated \fBold critical\fR webpage, generated by xymongen. You should use the newer .I criticalview.cgi(1) utility instead, which uses the \fBcritical\fR templates. .IP repnormal Header and footer for the Xymon \fBMain view\fR availability report webpages, generated by .I xymongen(1) when running in availability report mode. .IP snapnormal Header and footer for the Xymon \fBMain view\fR snapshot webpages, generated by .I xymongen(1) when running in snapshot report mode. .IP snapnongreen Header and footer for the Xymon \fBAll non-green view\fR snapshot webpage, generated by .I xymongen(1) when running in snapshot report mode. .IP columndoc Header and footer for the Xymon \fBColumn documentation\fR webpages, generated by the .I csvinfo.cgi(1) utility in the default Xymon configuration. .IP confreport Header and footer for the Xymon \fBConfiguration report\fR webpage, generated by the .I confreport.cgi(1) utility. Note that there are also "confreport_front" and "confreport_back" templates, these are inserted into the generated report before the hostlist, and before the column documentation, respectively. .IP event Header, footer and form for the Xymon \fBEventlog report\fR, generated by .I eventlog.cgi(1) .IP findhost Header, footer and form for the Xymon \fBFind host\fR webpage, generated by .I findhost.cgi(1) .IP graphs Header and footer for the Xymon \fBGraph details\fR webpages, generated by .I showgraph.cgi(1) .IP hist Header and footer for the Xymon \fBHistory\fR webpage, generated by .I history.cgi(1) .IP histlog Header and footer for the Xymon \fBHistorical status-log\fR webpage, generated by .I svcstatus.cgi(1) utility when used to show a historical (non-current) status log. .IP critical Header and footer for the Xymon \fBCritical Systems view\fR webpage, generated by .I criticalview.cgi(1) .IP hostsvc Header and footer for the Xymon \fBStatus-log\fR webpage, generated by .I svcstatus.cgi(1) utility when used to show a current status log. .IP info Header and footer for the Xymon \fBInfo column\fR webpage, generated by .I svcstatus.cgi(1) utility when used to show the host configuration page. .IP maintact Header and footer for the Xymon \fB\fR webpage, generated by .I enadis.cgi(1) utility when using the Enable/Disable "preview" mode. .IP maint Header, footer and form for the Xymon \fBEnable/disable\fR webpage, generated by .I enadis.cgi(1) .IP critack Form show on the \fBstatus-log\fR webpage when viewed from the "Critical Systems" overview. This form is used to acknowledge a critical status by the operators monitoring the Critical Systems view. .IP critedit Header, footer and form for the \fBCritical Systems Editor\fR, the .I criticaleditor.cgi(1) utility. .IP replog Header and footer for the Xymon \fBReport status-log\fR webpage, generated by .I svcstatus.cgi(1) utility when used to show a status log for an availability report. .IP report Header, footer and forms for selecting a pre-generated \fBAvailability Report\fR. Handled by the .I datepage.cgi(1) utility. .IP snapshot Header and footer for the Xymon \fBSnapshot report\fR selection webpage, generated by .I snapshot.cgi(1) .SH "SEE ALSO" xymongen(1), svcstatus.cgi(1), xymon(7) xymon-4.3.28/xymond/xymond_history.c0000664000076400007640000005410212603243142017772 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* This is a xymond worker module for the "stachg" channel. */ /* This module implements the file-based history logging, and keeps the */ /* historical logfiles in $XYMONVAR/hist/ and $XYMONVAR/histlogs/ updated */ /* to keep track of the status changes. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: xymond_history.c 7678 2015-10-01 14:42:42Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" #include "xymond_worker.h" int rotatefiles = 0; time_t nextfscheck = 0; void sig_handler(int signum) { /* * Why this? Because we must have our own signal handler installed to call wait() */ switch (signum) { case SIGCHLD: break; case SIGHUP: rotatefiles = 1; nextfscheck = 0; break; } } typedef struct columndef_t { char *name; int saveit; } columndef_t; void * columndefs; int main(int argc, char *argv[]) { time_t starttime = gettimer(); char *histdir = NULL; char *histlogdir = NULL; char *msg; int argi, seq; int save_allevents = 1; int save_hostevents = 1; int save_statusevents = 1; int save_histlogs = 1, defaultsaveop = 1; FILE *alleventsfd = NULL; int running = 1; struct sigaction sa; char newcol2[3]; char oldcol2[3]; char alleventsfn[PATH_MAX]; char pidfn[PATH_MAX]; int logdirfull = 0; int minlogspace = 5; MEMDEFINE(pidfn); MEMDEFINE(alleventsfn); MEMDEFINE(newcol2); MEMDEFINE(oldcol2); /* Don't save the error buffer */ save_errbuf = 0; sprintf(pidfn, "%s/xymond_history.pid", xgetenv("XYMONSERVERLOGS")); if (xgetenv("XYMONALLHISTLOG")) save_allevents = (strcmp(xgetenv("XYMONALLHISTLOG"), "TRUE") == 0); if (xgetenv("XYMONHOSTHISTLOG")) save_hostevents = (strcmp(xgetenv("XYMONHOSTHISTLOG"), "TRUE") == 0); if (xgetenv("SAVESTATUSLOG")) save_histlogs = (strncmp(xgetenv("SAVESTATUSLOG"), "FALSE", 5) != 0); for (argi = 1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--histdir=")) { histdir = strchr(argv[argi], '=')+1; } else if (argnmatch(argv[argi], "--histlogdir=")) { histlogdir = strchr(argv[argi], '=')+1; } else if (argnmatch(argv[argi], "--pidfile=")) { strcpy(pidfn, strchr(argv[argi], '=')+1); } else if (argnmatch(argv[argi], "--minimum-free=")) { minlogspace = atoi(strchr(argv[argi], '=')+1); } else if (argnmatch(argv[argi], "--debug")) { debug = 1; } } if (xgetenv("XYMONHISTDIR") && (histdir == NULL)) { histdir = strdup(xgetenv("XYMONHISTDIR")); } if (histdir == NULL) { errprintf("No history directory given, aborting\n"); return 1; } if (save_histlogs && (histlogdir == NULL) && xgetenv("XYMONHISTLOGS")) { histlogdir = strdup(xgetenv("XYMONHISTLOGS")); } if (save_histlogs && (histlogdir == NULL)) { errprintf("No history-log directory given, aborting\n"); return 1; } columndefs = xtreeNew(strcmp); { char *defaultsave, *tok; char *savelist; columndef_t *newrec; savelist = strdup(xgetenv("SAVESTATUSLOG")); defaultsave = strtok(savelist, ","); /* * TRUE: Save everything by default; may list some that are not saved. * ONLY: Save nothing by default; may list some that are saved. * FALSE: Save nothing. */ defaultsaveop = (strcasecmp(defaultsave, "TRUE") == 0); tok = strtok(NULL, ","); while (tok) { newrec = (columndef_t *)malloc(sizeof(columndef_t)); if (*tok == '!') { newrec->saveit = 0; newrec->name = strdup(tok+1); } else { newrec->saveit = 1; newrec->name = strdup(tok); } xtreeAdd(columndefs, newrec->name, newrec); tok = strtok(NULL, ","); } xfree(savelist); } { FILE *pidfd = fopen(pidfn, "w"); if (pidfd) { fprintf(pidfd, "%lu\n", (unsigned long)getpid()); fclose(pidfd); } } sprintf(alleventsfn, "%s/allevents", histdir); if (save_allevents) { alleventsfd = fopen(alleventsfn, "a"); if (alleventsfd == NULL) { errprintf("Cannot open the all-events file '%s'\n", alleventsfn); } setvbuf(alleventsfd, (char *)NULL, _IOLBF, 0); } /* For picking up lost children */ setup_signalhandler("xymond_history"); memset(&sa, 0, sizeof(sa)); sa.sa_handler = sig_handler; signal(SIGCHLD, SIG_IGN); sigaction(SIGHUP, &sa, NULL); signal(SIGPIPE, SIG_DFL); while (running) { char *metadata[20] = { NULL, }; int metacount; char *p; char *statusdata = ""; char *hostname, *hostnamecommas, *testname, *dismsg, *modifiers; time_t tstamp, lastchg, disabletime, clienttstamp; int tstamp_i, lastchg_i; int newcolor, oldcolor; int downtimeactive; struct tm tstamptm; int trend; int childstat; if (rotatefiles && alleventsfd) { fclose(alleventsfd); alleventsfd = fopen(alleventsfn, "a"); if (alleventsfd == NULL) { errprintf("Cannot re-open the all-events file '%s'\n", alleventsfn); } else { setvbuf(alleventsfd, (char *)NULL, _IOLBF, 0); } } msg = get_xymond_message(C_STACHG, "xymond_history", &seq, NULL); if (msg == NULL) { running = 0; continue; } if (nextfscheck < gettimer()) { logdirfull = (chkfreespace(histlogdir, minlogspace, minlogspace) != 0); if (logdirfull) errprintf("Historylog directory %s has less than %d%% free space - disabling save of data for 5 minutes\n", histlogdir, minlogspace); nextfscheck = gettimer() + 300; } p = strchr(msg, '\n'); if (p) { *p = '\0'; statusdata = msg_data(p+1, 0); } metacount = 0; memset(&metadata, 0, sizeof(metadata)); p = gettok(msg, "|"); while (p && (metacount < 20)) { metadata[metacount++] = p; p = gettok(NULL, "|"); } if ((metacount > 9) && (strncmp(metadata[0], "@@stachg", 8) == 0)) { xtreePos_t handle; columndef_t *saveit = NULL; /* @@stachg#seq|timestamp|sender|origin|hostname|testname|expiretime|color|prevcolor|changetime|disabletime|disablemsg|downtimeactive|clienttstamp|modifiers */ sscanf(metadata[1], "%d.%*d", &tstamp_i); tstamp = tstamp_i; hostname = metadata[4]; testname = metadata[5]; newcolor = parse_color(metadata[7]); oldcolor = parse_color(metadata[8]); lastchg = atoi(metadata[9]); disabletime = atoi(metadata[10]); dismsg = metadata[11]; downtimeactive = (atoi(metadata[12]) > 0); clienttstamp = atoi(metadata[13]); modifiers = metadata[14]; if (newcolor == -1) { errprintf("Bad message: newcolor is unknown '%s'\n", metadata[7]); continue; } p = hostnamecommas = strdup(hostname); while ((p = strchr(p, '.')) != NULL) *p = ','; handle = xtreeFind(columndefs, testname); if (handle == xtreeEnd(columndefs)) { saveit = (columndef_t *)malloc(sizeof(columndef_t)); saveit->name = strdup(testname); saveit->saveit = defaultsaveop; xtreeAdd(columndefs, saveit->name, saveit); } else { saveit = (columndef_t *) xtreeData(columndefs, handle); } if (save_statusevents) { char statuslogfn[PATH_MAX]; int logexists; FILE *statuslogfd; char oldcol[100]; char timestamp[40]; struct stat st; MEMDEFINE(statuslogfn); MEMDEFINE(oldcol); MEMDEFINE(timestamp); sprintf(statuslogfn, "%s/%s.%s", histdir, hostnamecommas, testname); stat(statuslogfn, &st); statuslogfd = fopen(statuslogfn, "r+"); logexists = (statuslogfd != NULL); *oldcol = '\0'; if (logexists) { /* * There is a fair chance xymond has not been * running all the time while this system was monitored. * So get the time of the latest status change from the file, * instead of relying on the "lastchange" value we get * from xymond. This is also needed when migrating from * standard bbd to xymond. */ off_t pos = -1; char l[1024]; int gotit; MEMDEFINE(l); fseeko(statuslogfd, 0, SEEK_END); if (ftello(statuslogfd) > 512) { /* Go back 512 from EOF, and skip to start of a line */ fseeko(statuslogfd, -512, SEEK_END); gotit = (fgets(l, sizeof(l)-1, statuslogfd) == NULL); } else { /* Read from beginning of file */ fseeko(statuslogfd, 0, SEEK_SET); gotit = 0; } while (!gotit) { off_t tmppos = ftello(statuslogfd); int dur_i; if (fgets(l, sizeof(l)-1, statuslogfd)) { /* Sun Oct 10 06:49:42 2004 red 1097383782 602 */ if ((strlen(l) > 24) && (sscanf(l+24, " %s %d %d", oldcol, &lastchg_i, &dur_i) == 2) && (parse_color(oldcol) != -1)) { /* * Record the start location of the line */ pos = tmppos; lastchg = lastchg_i; } } else { gotit = 1; } } if (pos == -1) { /* * Couldnt find anything in the log. * Take lastchg from the timestamp of the logfile, * and just append the data. */ lastchg = st.st_mtime; fseeko(statuslogfd, 0, SEEK_END); } else { /* * lastchg was updated above. * Seek to where the last line starts. */ fseeko(statuslogfd, pos, SEEK_SET); } MEMUNDEFINE(l); } else { /* * Logfile does not exist. */ lastchg = tstamp; statuslogfd = fopen(statuslogfn, "a"); if (statuslogfd == NULL) { errprintf("Cannot open status historyfile '%s' : %s\n", statuslogfn, strerror(errno)); } } if (strcmp(oldcol, colorname(newcolor)) == 0) { /* We wont update history unless the color did change. */ if ((gettimer() - starttime) > 300) { errprintf("Will not update %s - color unchanged (%s)\n", statuslogfn, oldcol); } if (hostnamecommas) xfree(hostnamecommas); if (statuslogfd) fclose(statuslogfd); MEMUNDEFINE(statuslogfn); MEMUNDEFINE(oldcol); MEMUNDEFINE(timestamp); continue; } if (statuslogfd) { if (logexists) { struct tm oldtm; /* Re-print the old record, now with the final duration */ memcpy(&oldtm, localtime(&lastchg), sizeof(oldtm)); strftime(timestamp, sizeof(timestamp), "%a %b %e %H:%M:%S %Y", &oldtm); fprintf(statuslogfd, "%s %s %d %d\n", timestamp, oldcol, (int)lastchg, (int)(tstamp - lastchg)); } /* And the new record. */ memcpy(&tstamptm, localtime(&tstamp), sizeof(tstamptm)); strftime(timestamp, sizeof(timestamp), "%a %b %e %H:%M:%S %Y", &tstamptm); fprintf(statuslogfd, "%s %s %d", timestamp, colorname(newcolor), (int)tstamp); fclose(statuslogfd); } MEMUNDEFINE(statuslogfn); MEMUNDEFINE(oldcol); MEMUNDEFINE(timestamp); } if (save_histlogs && saveit->saveit && !logdirfull) { char *hostdash; char fname[PATH_MAX]; FILE *histlogfd; MEMDEFINE(fname); p = hostdash = strdup(hostname); while ((p = strchr(p, '.')) != NULL) *p = '_'; sprintf(fname, "%s/%s", histlogdir, hostdash); mkdir(fname, S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH); p = fname + sprintf(fname, "%s/%s/%s", histlogdir, hostdash, testname); mkdir(fname, S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH); p += sprintf(p, "/%s", histlogtime(tstamp)); histlogfd = fopen(fname, "w"); if (histlogfd) { /* * When a host gets disabled or goes purple, the status * message data is not changed - so it will include a * wrong color as the first word of the message. * Therefore we need to fixup this so it matches the * newcolor value. */ int txtcolor = parse_color(statusdata); char *origstatus = statusdata; char *eoln, *restofdata; int written, closestatus, ok = 1; if (txtcolor != -1) { fprintf(histlogfd, "%s", colorname(newcolor)); statusdata += strlen(colorname(txtcolor)); } if (dismsg && *dismsg) nldecode(dismsg); if (disabletime > 0) { fprintf(histlogfd, " Disabled until %s\n%s\n\n", ctime(&disabletime), (dismsg ? dismsg : "")); fprintf(histlogfd, "Status message when disabled follows:\n\n"); statusdata = origstatus; } else if (dismsg && *dismsg) { fprintf(histlogfd, " Planned downtime: %s\n\n", dismsg); fprintf(histlogfd, "Original status message follows:\n\n"); statusdata = origstatus; } restofdata = statusdata; if (modifiers && *modifiers) { char *modtxt; /* We must finish writing the first line before putting in the modifiers */ eoln = strchr(restofdata, '\n'); if (eoln) { restofdata = eoln+1; *eoln = '\0'; fprintf(histlogfd, "%s\n", statusdata); } nldecode(modifiers); modtxt = strtok(modifiers, "\n"); while (modtxt) { fprintf(histlogfd, "%s\n", modtxt); modtxt = strtok(NULL, "\n"); } } written = fwrite(restofdata, 1, strlen(restofdata), histlogfd); if (written != strlen(restofdata)) { ok = 0; errprintf("Error writing to file %s: %s\n", fname, strerror(errno)); closestatus = fclose(histlogfd); /* Ignore any errors on close */ } else { fprintf(histlogfd, "Status unchanged in 0.00 minutes\n"); fprintf(histlogfd, "Message received from %s\n", metadata[2]); if (clienttstamp) fprintf(histlogfd, "Client data ID %d\n", (int) clienttstamp); closestatus = fclose(histlogfd); if (closestatus != 0) { ok = 0; errprintf("Error writing to file %s: %s\n", fname, strerror(errno)); } } if (!ok) remove(fname); } else { errprintf("Cannot create histlog file '%s' : %s\n", fname, strerror(errno)); } xfree(hostdash); MEMUNDEFINE(fname); } strncpy(oldcol2, ((oldcolor >= 0) ? colorname(oldcolor) : "-"), 2); strncpy(newcol2, colorname(newcolor), 2); newcol2[2] = oldcol2[2] = '\0'; if (oldcolor == -1) trend = -1; /* we don't know how bad it was */ else if (newcolor > oldcolor) trend = 2; /* It's getting worse */ else if (newcolor < oldcolor) trend = 1; /* It's getting better */ else trend = 0; /* Shouldn't happen ... */ if (save_hostevents) { char hostlogfn[PATH_MAX]; FILE *hostlogfd; MEMDEFINE(hostlogfn); sprintf(hostlogfn, "%s/%s", histdir, hostname); hostlogfd = fopen(hostlogfn, "a"); if (hostlogfd) { fprintf(hostlogfd, "%s %d %d %d %s %s %d\n", testname, (int)tstamp, (int)lastchg, (int)(tstamp - lastchg), newcol2, oldcol2, trend); fclose(hostlogfd); } else { errprintf("Cannot open host logfile '%s' : %s\n", hostlogfn, strerror(errno)); } MEMUNDEFINE(hostlogfn); } if (save_allevents) { fprintf(alleventsfd, "%s %s %d %d %d %s %s %d\n", hostname, testname, (int)tstamp, (int)lastchg, (int)(tstamp - lastchg), newcol2, oldcol2, trend); fflush(alleventsfd); } xfree(hostnamecommas); } else if ((metacount > 3) && ((strncmp(metadata[0], "@@drophost", 10) == 0))) { /* @@drophost|timestamp|sender|hostname */ hostname = metadata[3]; if (save_histlogs) { char *hostdash; char testdir[PATH_MAX]; MEMDEFINE(testdir); /* Remove all directories below the host-specific histlog dir */ p = hostdash = strdup(hostname); while ((p = strchr(p, '.')) != NULL) *p = '_'; sprintf(testdir, "%s/%s", histlogdir, hostdash); dropdirectory(testdir, 1); xfree(hostdash); MEMUNDEFINE(testdir); } if (save_hostevents) { char hostlogfn[PATH_MAX]; struct stat st; MEMDEFINE(hostlogfn); sprintf(hostlogfn, "%s/%s", histdir, hostname); if ((stat(hostlogfn, &st) == 0) && S_ISREG(st.st_mode)) { unlink(hostlogfn); } MEMUNDEFINE(hostlogfn); } if (save_statusevents) { DIR *dirfd; struct dirent *de; char *hostlead; char statuslogfn[PATH_MAX]; struct stat st; MEMDEFINE(statuslogfn); /* Remove $XYMONVAR/hist/host,name.* */ p = hostnamecommas = strdup(hostname); while ((p = strchr(p, '.')) != NULL) *p = ','; hostlead = malloc(strlen(hostname) + 2); strcpy(hostlead, hostnamecommas); strcat(hostlead, "."); dirfd = opendir(histdir); if (dirfd) { while ((de = readdir(dirfd)) != NULL) { if (strncmp(de->d_name, hostlead, strlen(hostlead)) == 0) { sprintf(statuslogfn, "%s/%s", histdir, de->d_name); if ((stat(statuslogfn, &st) == 0) && S_ISREG(st.st_mode)) { unlink(statuslogfn); } } } closedir(dirfd); } xfree(hostlead); xfree(hostnamecommas); MEMUNDEFINE(statuslogfn); } } else if ((metacount > 4) && ((strncmp(metadata[0], "@@droptest", 10) == 0))) { /* @@droptest|timestamp|sender|hostname|testname */ hostname = metadata[3]; testname = metadata[4]; if (save_histlogs) { char *hostdash; char testdir[PATH_MAX]; MEMDEFINE(testdir); p = hostdash = strdup(hostname); while ((p = strchr(p, '.')) != NULL) *p = '_'; sprintf(testdir, "%s/%s/%s", histlogdir, hostdash, testname); dropdirectory(testdir, 1); xfree(hostdash); MEMUNDEFINE(testdir); } if (save_statusevents) { char *hostnamecommas; char statuslogfn[PATH_MAX]; struct stat st; MEMDEFINE(statuslogfn); p = hostnamecommas = strdup(hostname); while ((p = strchr(p, '.')) != NULL) *p = ','; sprintf(statuslogfn, "%s/%s.%s", histdir, hostnamecommas, testname); if ((stat(statuslogfn, &st) == 0) && S_ISREG(st.st_mode)) unlink(statuslogfn); xfree(hostnamecommas); MEMUNDEFINE(statuslogfn); } } else if ((metacount > 4) && ((strncmp(metadata[0], "@@renamehost", 12) == 0))) { /* @@renamehost|timestamp|sender|hostname|newhostname */ char *newhostname; hostname = metadata[3]; newhostname = metadata[4]; if (save_histlogs) { char *hostdash; char *newhostdash; char olddir[PATH_MAX]; char newdir[PATH_MAX]; MEMDEFINE(olddir); MEMDEFINE(newdir); p = hostdash = strdup(hostname); while ((p = strchr(p, '.')) != NULL) *p = '_'; p = newhostdash = strdup(newhostname); while ((p = strchr(p, '.')) != NULL) *p = '_'; sprintf(olddir, "%s/%s", histlogdir, hostdash); sprintf(newdir, "%s/%s", histlogdir, newhostdash); rename(olddir, newdir); xfree(newhostdash); xfree(hostdash); MEMUNDEFINE(newdir); MEMUNDEFINE(olddir); } if (save_hostevents) { char hostlogfn[PATH_MAX]; char newhostlogfn[PATH_MAX]; MEMDEFINE(hostlogfn); MEMDEFINE(newhostlogfn); sprintf(hostlogfn, "%s/%s", histdir, hostname); sprintf(newhostlogfn, "%s/%s", histdir, newhostname); rename(hostlogfn, newhostlogfn); MEMUNDEFINE(hostlogfn); MEMUNDEFINE(newhostlogfn); } if (save_statusevents) { DIR *dirfd; struct dirent *de; char *hostlead; char *newhostnamecommas; char statuslogfn[PATH_MAX]; char newlogfn[PATH_MAX]; MEMDEFINE(statuslogfn); MEMDEFINE(newlogfn); p = hostnamecommas = strdup(hostname); while ((p = strchr(p, '.')) != NULL) *p = ','; hostlead = malloc(strlen(hostname) + 2); strcpy(hostlead, hostnamecommas); strcat(hostlead, "."); p = newhostnamecommas = strdup(newhostname); while ((p = strchr(p, '.')) != NULL) *p = ','; dirfd = opendir(histdir); if (dirfd) { while ((de = readdir(dirfd)) != NULL) { if (strncmp(de->d_name, hostlead, strlen(hostlead)) == 0) { char *testname = strchr(de->d_name, '.'); sprintf(statuslogfn, "%s/%s", histdir, de->d_name); sprintf(newlogfn, "%s/%s%s", histdir, newhostnamecommas, testname); rename(statuslogfn, newlogfn); } } closedir(dirfd); } xfree(newhostnamecommas); xfree(hostlead); xfree(hostnamecommas); MEMUNDEFINE(statuslogfn); MEMUNDEFINE(newlogfn); } } else if ((metacount > 5) && (strncmp(metadata[0], "@@renametest", 12) == 0)) { /* @@renametest|timestamp|sender|hostname|oldtestname|newtestname */ char *newtestname; hostname = metadata[3]; testname = metadata[4]; newtestname = metadata[5]; if (save_histlogs) { char *hostdash; char olddir[PATH_MAX]; char newdir[PATH_MAX]; MEMDEFINE(olddir); MEMDEFINE(newdir); p = hostdash = strdup(hostname); while ((p = strchr(p, '.')) != NULL) *p = '_'; sprintf(olddir, "%s/%s/%s", histlogdir, hostdash, testname); sprintf(newdir, "%s/%s/%s", histlogdir, hostdash, newtestname); rename(olddir, newdir); xfree(hostdash); MEMUNDEFINE(newdir); MEMUNDEFINE(olddir); } if (save_statusevents) { char *hostnamecommas; char statuslogfn[PATH_MAX]; char newstatuslogfn[PATH_MAX]; MEMDEFINE(statuslogfn); MEMDEFINE(newstatuslogfn); p = hostnamecommas = strdup(hostname); while ((p = strchr(p, '.')) != NULL) *p = ','; sprintf(statuslogfn, "%s/%s.%s", histdir, hostnamecommas, testname); sprintf(newstatuslogfn, "%s/%s.%s", histdir, hostnamecommas, newtestname); rename(statuslogfn, newstatuslogfn); xfree(hostnamecommas); MEMUNDEFINE(newstatuslogfn); MEMUNDEFINE(statuslogfn); } } else if (strncmp(metadata[0], "@@idle", 6) == 0) { /* Nothing */ } else if (strncmp(metadata[0], "@@shutdown", 10) == 0) { running = 0; } else if (strncmp(metadata[0], "@@logrotate", 11) == 0) { char *fn = xgetenv("XYMONCHANNEL_LOGFILENAME"); if (fn && strlen(fn)) { reopen_file(fn, "a", stdout); reopen_file(fn, "a", stderr); } continue; } else if (strncmp(metadata[0], "@@reload", 8) == 0) { /* Do nothing */ } } MEMUNDEFINE(newcol2); MEMUNDEFINE(oldcol2); MEMUNDEFINE(alleventsfn); MEMUNDEFINE(pidfn); fclose(alleventsfd); unlink(pidfn); return 0; } xymon-4.3.28/xymond/wwwfiles/0000775000076400007640000000000013037531515016402 5ustar rpmbuildrpmbuildxymon-4.3.28/xymond/wwwfiles/menu/0000775000076400007640000000000013037531515017346 5ustar rpmbuildrpmbuildxymon-4.3.28/xymond/wwwfiles/menu/t2b-grey.gif0000775000076400007640000000151611535424634021502 0ustar rpmbuildrpmbuildGIF89açB  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€‚‚‚ƒƒƒ„„„………†††‡‡‡ˆˆˆ‰‰‰ŠŠŠ‹‹‹ŒŒŒŽŽŽ‘‘‘’’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!þCreated with GIMP,õÜ™‡3c¾pÁR%Š%Hˆé¡ÃÆ ,;xymon-4.3.28/xymond/wwwfiles/menu/b2t-blue.gif0000775000076400007640000000147111535424634021463 0ustar rpmbuildrpmbuildGIF89a÷4X4W5Y6Y8[ :\=^=]AbAaDcEdGfGe!Jg!Ki%Mi&Nj*Pj*Ql.Tn/Tm/Uo3Vo3Wq5[u6[t7^y8^x9`:`~9b:b~9d;dƒ;eƒhˆ>jˆ>kˆ@kŒ@mŒAm‹@nŒAn‘@oŒAp‘BpCpCq‘Dq”BrEq“Ds”Dt–Du”Gu™FwšGw™FyšIxGy™HyžIzJzœH{žI|I|ŸJ|¢H}žK|¡J~¢K£J€¢K€¡K€©L‚¨M‚§K„©M„§ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,(` "H p!Ã$N¨QC‡$N;xymon-4.3.28/xymond/wwwfiles/menu/xymonmenu-blue.css0000775000076400007640000000357611535424634023066 0ustar rpmbuildrpmbuild#menue { position:absolute; top: 0px; left: 0; padding-bottom: 2px; z-index: 200; } .outer { float: left; display: block; overflow: hidden; padding-top: 2px; padding-left: 4px; height: 1.6em; text-align: left; font: 14px Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; width: 10em; /* Menu element width 0.05em wider than inner-1 width (see below) */ border: 1px solid #345678; /* Menu button border (button up) */ background: url(t2b-blue.gif); /* Menu button image (button up) */ color: #ffffff; /* Menu button text colour (button up) */ } .outer:hover { height: auto; padding-top: 4px; border: 1px solid #345678; /* Menu button border (button down) */ background: url(b2t-blue.gif); /* Menu button image (button down) */ color: #ebeb77; /* Menu button text colour (button down) */ } a.inner-1 { margin-top: 4px; margin-left: -4px; } a.inner, a.inner-1 { margin-left: -4px; display: block; padding: 2px 0; padding-left: 4px; text-decoration: none; width: 9.95em; /* Menu element width 0.05em narrower than outer width (see above) */ border-top: 1px solid #345678; /* Menu item top border colour */ border-right: 1px solid #345678; /* Menu item right border colour */ color: #eeeeee; /* Unvisited menu item text colour */ background: #456789; /* Unvisited menu item background colour */ } a:visited.inner, a:visited.inner-1 { color: #eeeeee; /* Visited menu item text colour (usually same as unvisited) */ background: #456789; /* Visited menu item background colour (usually same as unvisited) */ } a:hover.inner, a:hover.inner-1 { color: #333333; /* Selected menu item text colour */ background: #00bbbb; /* Selected menu item background colour */ } span.menutag { display: block; cursor: default; } span.invis { display: none; } xymon-4.3.28/xymond/wwwfiles/menu/t2b-blue.gif0000775000076400007640000000147111535424634021463 0ustar rpmbuildrpmbuildGIF89a÷4X4W5Y6Y8[ :\=^=]AbAaDcEdGfGe!Jg!Ki%Mi&Nj*Pj*Ql.Tn/Tm/Uo3Vo3Wq5[u6[t7^y8^x9`:`~9b:b~9d;dƒ;eƒhˆ>jˆ>kˆ@kŒ@mŒAm‹@nŒAn‘@oŒAp‘BpCpCq‘Dq”BrEq“Ds”Dt–Du”Gu™FwšGw™FyšIxGy™HyžIzJzœH{žI|I|ŸJ|¢H}žK|¡J~¢K£J€¢K€¡K€©L‚¨M‚§K„©M„§ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,$¢£† 'H€Øá 0PÀ@;xymon-4.3.28/xymond/wwwfiles/menu/b2t-grey.gif0000775000076400007640000000151611535424634021502 0ustar rpmbuildrpmbuildGIF89aç   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€‚‚‚ƒƒƒ„„„………†††‡‡‡ˆˆˆ‰‰‰ŠŠŠ‹‹‹ŒŒŒŽŽŽ‘‘‘’’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!þCreated with GIMP,YÀ˜aCG D(q¥ ._ƘQÃΜ;z;xymon-4.3.28/xymond/wwwfiles/menu/xymonmenu-grey.css0000775000076400007640000000357611535424634023105 0ustar rpmbuildrpmbuild#menue { position:absolute; top: 0px; left: 0; padding-bottom: 2px; z-index: 200; } .outer { float: left; display: block; overflow: hidden; padding-top: 2px; padding-left: 4px; height: 1.6em; text-align: left; font: 14px Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; width: 10em; /* Menu element width 0.05em wider than inner-1 width (see below) */ border: 1px solid #444444; /* Menu button border (button up) */ background: url(t2b-grey.gif); /* Menu button image (button up) */ color: #dddddd; /* Menu button text colour (button up) */ } .outer:hover { height: auto; padding-top: 4px; border: 1px solid #444444; /* Menu button border (button down) */ background: url(b2t-grey.gif); /* Menu button image (button down) */ color: #ffffff; /* Menu button text colour (button down) */ } a.inner-1 { margin-top: 4px; margin-left: -4px; } a.inner, a.inner-1 { margin-left: -4px; display: block; padding: 2px 0; padding-left: 4px; text-decoration: none; width: 9.95em; /* Menu element width 0.05em narrower than outer width (see above) */ border-top: 1px solid #444444; /* Menu item top border colour */ border-right: 1px solid #444444; /* Menu item right border colour */ color: #eeeeee; /* Unvisited menu item text colour */ background: #666666; /* Unvisited menu item background colour */ } a:visited.inner, a:visited.inner-1 { color: #eeeeee; /* Visited menu item text colour (usually same as unvisited) */ background: #666666; /* Visited menu item background colour (usually same as unvisited) */ } a:hover.inner, a:hover.inner-1 { color: #444444; /* Selected menu item text colour */ background: #bbbbbb; /* Selected menu item background colour */ } span.menutag { display: block; cursor: default; } span.invis { display: none; } xymon-4.3.28/xymond/wwwfiles/gifs/0000775000076400007640000000000013037531515017332 5ustar rpmbuildrpmbuildxymon-4.3.28/xymond/wwwfiles/gifs/clear.gif0000664000076400007640000000156411070452713021112 0ustar rpmbuildrpmbuildGIF89a÷€€€€€€€€€ÀÀÀÀÜÀ¤Èðÿ¥ïÿŒÖÿ1{ÿ!cÿZÿRÿRÿRÿJïBçBÞB¿¿¿ÖBÖBÎc„Îc{ÎBkÎJÎ9ƽ½Æ{”Æ{ŒÆ9½9½1µ1­1œJcœ)”)Œ1J„1„)s1s!k!cZ!ZJJw3f™Ì3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿ3ÿfÿ™3333f3™3Ì3ÿ3333333f33™33Ì33ÿ3f3f33ff3f™3fÌ3fÿ3™3™33™f3™™3™Ì3™ÿ3Ì3Ì33Ìf3Ì™3ÌÌ3ÌÿÿÌ3ÿ3ÿ33ÿf3ÿ™3ÿÌff3fff™fÌfÿf3f33f3ff3™f3Ìf3ÿffff3fffff™ffÌffÿf™f™3f™ff™™f™Ìf™ÿfÌfÌ3fÌffÌ™fÌÌfÌÿ3ÿÿfÿfÿ3fÿffÿ™fÿÌ™™3™f™™™Ì™ÿ™3™33™3f™3™™3Ì™3ÿ™f™f3™ff™f™™fÌ™fÿ™™™™3™™f™™™™™Ì™™ÿ™Ì™Ì3™Ìf™Ì™™ÌÌ™Ìÿfÿÿ™ÿ™ÿ3™ÿf™ÿ™™ÿÌÌÌ3ÌfÌ™ÌÌÌÿÌ3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÌfÌf3Ìff™ÿÿÌf™ÌfÌÌfÿ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÿÌÿ3ÌÿfÌÿ™ÌÿÌÌÿÿÿ3ÿfÿ™ÿÌÿ3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿÿfÿf3ÿffÿf™ÿfÌÿfÿÿ™ÿûð  ¤€€€ÿÿÿÿÿÿÿÿÿÿÿÿ!ù,QH° Áƒ»)\¨ð`7|#BìVð!>3b¤8ð!Æñqh±`Æ‘<^$8‘`I–]jd)R¦Æ›(U‚ÄXӦĖ2DH´(Ñ€;xymon-4.3.28/xymond/wwwfiles/gifs/yellow.gif0000664000076400007640000000504611070452713021336 0ustar rpmbuildrpmbuildGIF89a…       !%!!%,%/,#/%8"8#3(8+8-B/K-B5K4 €¦…Æwªˆ±³Ù‚¿™ÇŸõ“Ò¨ÿ™!ÿ NETSCAPE2.0!ù ,[@€P(XD" Áp) LB¥Rh`!”J… )¬ÂFi»-5À1YeF«Émð»|–áu+VËõ¢PRTh„€QSU`{[]_‘Y“~`‚`EGILA!ù ,[@€P(XD" Áp) LB¥Rh`!”J… )¬ÂFi»-5À1YeF«Émð»|–áu+VËõ¢PRTh„€QSU`{[]_‘Y“~`‚`EGILA!ù ,[@€P(XD" Áp) LB¥Rh`!”J… )¬ÂFi»-5À1YeF«Émð»|–áu+VËõ¢PRTh„€QSU`{[]_‘Y“~`‚`EGILA!ù ,[@€P(XD" Áp) LB¥Rh`!”J… )¬ÂFi»-5À1YeF«Émð»|–áu+VËõ¢PRTh„€QSU`{[]_‘Y“~`‚`EGILA!ù ,[@€P(XD" Áp) LB¥Rh`!”J… )¬ÂFi»-5À1YeF«Émð»|–áu+VËõ¢PRTh„€QSU`{[]_‘Y“~`‚`EGILA!ù ,[@€P(XD" Áp) LB¥Rh`!”J… )¬ÂFi»-5À1YeF«Émð»|–áu+VËõ¢PRTh„€QSU`{[]_‘Y“~`‚`EGILA!ù ,[@€P(XD" Áp) LB¥Rh`!”J… )¬ÂFi»-5À1YeF«Émð»|–áu+VËõ¢PRTh„€QSU`{[]_‘Y“~`‚`EGILA!ù ,[@€P(XD" Áp) LB¥Rh`!”J… )¬ÂFi»-5À1YeF«Émð»|–áu+VËõ¢PRTh„€QSU`{[]_‘Y“~`‚`EGILA!ù ,[@€P(XD" Áp) LB¥Rh`!”J… )¬ÂFi»-5À1YeF«Émð»|–áu+VËõ¢PRTh„€QSU`{[]_‘Y“~`‚`EGILA!ù ,[@€P(XD" Áp) LB¥Rh`!”J… )¬ÂFi»-5À1YeF«Émð»|–áu+VËõ¢PRTh„€QSU`{[]_‘Y“~`‚`EGILA!ù ,}@€@9‘ÈÂ1¢„B†(s •J¡KFÄ€$¤M¥R¡B’Ä ö”Êå’GÍ&¹á*9Ú~Ãõk|v~qsB}x€ubdfh{QSUWY[]P^RTVXZ\Œcegi‡_a®±¦“©–¬PDFHJLNBA!ù ,…@2J‘ÈBQCT9LB¥Rhr¨ˆQ I¢¡T*TH!–„Ç]j´ß’ø\U¿Úzs}cxtv„pr‚ˆnŠdfhjl‰SUWY[]_QQ—VXZ\^`egik~m¶“¹–T¯š²BDFHJLNPA!ù ,‹Àe”‘ÈBHŒ(…‡¨2LB¥RhTD IP„P**¤HH1¹QJ§K 7\ ÛUxzqc}uvoƒs†wy‰|~‡Ž{„fhjl‚RTVXZ\^`  ›UWY[]_a•gikm»—¾šS´ž·¡BDFHJLNPA!ù ,‡@Ì(‘ÈBPLŒ0§Ê˜„J¥Ð$TN)IQB©T¨¢(I…‹Òù\j°Ýb@|®ªßßzrs~m€{ƒv…xp‚tІydfhjwQSUWY[]_EE˜TVXZ\^`’egik‹€“¸–‹®š±´BDFHJLNA!þ‹FILE IDENTITY Created or modified by Created by Alchemy Mindworks' GIF Construction Set Professional http://www.mindworkshop.com!þêUNREGISTERED SHAREWARE Assembled with GIF Construction Set: Alchemy Mindworks Inc. Box 500 Beeton, ON L0G 1A0 CANADA. http://www.mindworkshop.com This comment will not appear in files created with a registered version.!ÿ GIFCONtb1.0     ;xymon-4.3.28/xymond/wwwfiles/gifs/favicon-clear.ico0000664000076400007640000000706611070452713022545 0ustar rpmbuildrpmbuildh& ¨Ž( @ÿÿÿ«««ÊÊÊää丸¸õõõÿÿüðàÀÀ€€€€€ÀÀàðü( @€ÿÿÿ€€€@@@ÀÀÀ    ```àààÐÐа°°PPPððð111ooo‘‘‘èèèØØØ(((ˆˆˆwwwøøøÉÉɹ¹¹WWW§§§ggg™™™ ôôôììì$$$äää,,,ÜÜÜÔÔÔLLLÅÅÅ[[[µµµ¬¬¬kkk{{{•••üüüÍÍÍCCC¼¼¼SSSddd¤¤¤œœœttt‹‹‹ƒƒƒ úúúöööòòòîîî"""êêê&&&æææâââ...ÞÞÞ333ÚÚÚÖÖÖÒÒÒËËËNNNÇÇÇÃÃÃUUUYYY]]]···³³³®®®iiimmm¢¢¢žžžyyy}}}———……… þþþýýýûûûùùù÷÷÷õõõñññïïïííí!!!###ëëëééé'''ççç)))ååå+++ããã---áááßßß222ÝÝÝÛÛÛÙÙÙ×××ÕÕÕAAAÓÓÓÑÑÑÏÏÏÎÎÎÌÌÌQQQTTTÄÄÄVVVÂÂÂÁÁÁZZZ¿¿¿\\\»»»^^^ººº___aaaeeefff±±±hhh¯¯¯jjj­­­lllnnn¦¦¦¥¥¥£££uuuvvv¡¡¡xxxŸŸŸzzz|||ššš~~~˜˜˜–––‚‚‚†††=ccccbHŽ6—))•—Ozc oU ¡¡ VSo=bJ•YZ„D} 2 ˆ‘°£›Oz1‹‘4˜–P&…Lˆ‹P”4®jœ¤n«“ S[lq}ƒ„K„.J)Ÿ†ƒB„_r"9‚&%FGKˆ‹®OaPDGw%¤¢Y—š• ,¡Bds„M„˜•`oY(DyF#ƒL\xuE¨‘‰Œ‰‚£œ¦ˆ{Fs>B+,X•™),ž8‰FN°Sc*FFF#{yD!‚L€QªEtz³&vˆ‘°b €s#####}G{s>B+—œ¥ƒ{ˆˆV™ ­{!}#}{ywy{FDvwLMMƒGƒ Tg]FvG}GFq qFGGyiB#…ŠŠW•g-#s#{{}ƒLƒG{{{}I%wD#Š‹W)g¬} ws„©±„BDB„©±K F„ŠŠW•g¯DvDn X$Š@q@ X$ „Š T?>nFwl2Re5Œipi2Re52hw ˆV—?-ƒ@B{v‹S/2p‹S/‹>D%‹’^b±4y 0‹Ž=5Œipi2R=520B#²S´Ddf‰| @q@ X~ž‰ls‘,kªn„[©„sDs„Z;7ƒvGG–)`<L>hsIƒG{#{Gƒ„€{‰°O'­fA#{qlnDI‘ŽC±I!BllBv!vs vQ°/‡9:¥¢š'g?C³‚!vy#{{€*›m<3§±¯­]­ª•g??????gcÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿàÿÿþ?üøððððÀÀÀÀÀÀÀÀÀððððøüþ?ÿÿàÿÿðÿxymon-4.3.28/xymond/wwwfiles/gifs/purple-ack.gif0000664000076400007640000000151211070452713022060 0ustar rpmbuildrpmbuildGIF89a ç3f™Ìÿ3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿÿ3ÿfÿ™ÿÌÿÿ3333f3™3Ì3ÿ3333333f33™33Ì33ÿf3f33f3ff3™f3Ìf3ÿ™3™33™3f™3™™3Ì™3ÿÌ3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÿ3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿff3fff™fÌfÿ3f3f33ff3f™3fÌ3fÿffff3fffff™ffÌffÿ™f™f3™ff™f™™fÌ™fÿÌfÌf3ÌffÌf™ÌfÌÌfÿÿfÿf3ÿffÿf™ÿfÌÿfÿ™™3™f™™™Ì™ÿ3™3™33™f3™™3™Ì3™ÿf™f™3f™ff™™f™Ìf™ÿ™™™™3™™f™™™™™Ì™™ÿ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÌÌ3ÌfÌ™ÌÌÌÿ3Ì3Ì33Ìf3Ì™3ÌÌ3ÌÿfÌfÌ3fÌffÌ™fÌÌfÌÿ™Ì™Ì3™Ìf™Ì™™ÌÌ™ÌÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ùÿ, 'ÿ H° Á#G D¨paC FtH‘`ĉ&”ˆ±`LJ;xymon-4.3.28/xymond/wwwfiles/gifs/bkg-red.gif0000664000076400007640000000104011535462534021334 0ustar rpmbuildrpmbuildGIF89a}Æu     "#$%'()*+-/0134578:;=>?ABDFGIJL N P R T U X Z \ ] ` b d f i k m o q t v xz|„…ˆŒ‰Ž’—•›™Ÿ¢¤¨§«°­´¶º½ÂÆÎÜûõ ï(è/â3ß6ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù ,}}€t‚srqponmlkjihgefdbca`_^\]Z[YWXUVTSQRPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$##"!  û;xymon-4.3.28/xymond/wwwfiles/gifs/clear-recent.gif0000664000076400007640000000335111070452713022364 0ustar rpmbuildrpmbuildGIF89a³ÿÿÿÿøøøõõõòòòäääÊÊʸ¸¸«««ÀÀÀ!ù ,S0ɉjXV„(W†paÅ`ˆœpºjœ7:xª‰VÉæ+V-˜u —&#²­üvT\®¢pm9”ŒÅ-—"„amPÍ2ËNÏD;>;à,àOE ‡²–±H9ê”ͧŽçT‰Å#û«n¹ÓTÓ Mæ´8!ù ,B %ŠBYŽ(U:C[œ¨P°më8Â(Ðuÿ’4AMØÊí†ÈÁm•‹ÏžÔyœJKVêPÅÓnUè2Ì’ubXJe:‹B!ù ,< %ŠDYŽ(Ulqœ(q´ô;Êtn«-Ñ÷ªË7¤­~Å1Ç, ™ÆeîX ð¢F’²yƒSÔ¡5E2G!!ù ,= %ŠFYŽ(U쑜¨‘$mûŽF­»I9V¨ª ‡/YëhîšÏÝê9%:Î^Qx%’¢^Ü–R™´£!ù ,B %ŠHYŽ(UBI (²°­ûŽ]ï BÒˆZ°åË ÈËHD‡»èS'B£%¡ŠšÕª¬ÑÛ¯šðÅ®ËÎd…!ù ,; %ŠJYŽ(U.ìÒœ¨Ò´ô;*tî*ä¼à,àOE ²–±xÔ)›Ndt$2‹¤§Ž—¦¨ÏÔÍÄ…!ù ,: %ŠLYŽ(0MÛ2A¸ô;²u«.Þø Šï×£ÁŒÅÞ0§dæJN¨m)µ ›º›ó—ª¾‚)’ < !ù ,D %Š…c:cJ…äºÅ¡Ñcßv1¶8“›ã6|HtŠOœ©G:«Bho*\mµ( ”ËÔ‘°OÙªÚ£!ù ,C %ŠKcJ-K京ºLo=Ac[ïÓB¾‰D¸ª ]ÇÈM‡ÖL»(’)&w ²h¼â(ÉSÔ÷«~Gb#Yµ:¡R!!ù ,@ %ŠÑ#cJEÑ京Qo½Žm­ßë+ù¾Ðõs­rÄ¡ëñÐ9‰È§¯è<£kBÕÖf$iVå]‚U+*!ù ,B %ŠKcJ-K京ºPoMAc[ï+ù&/HpUºŒ‘›î¬™vÐã2úCî À#±hÅÝ‚VXŽñŽN×™ŠtB¥B!ù ,D %Š…c:cJ…äºÅ¡Ñcßv1¶8“›ã6|HtŠOœ©G:«Bho*\mµ( ”ËÔ‘°OÙªÚ£!ù ,: %ŠLYŽ(0MÛ2A¸ô;²u«.Þø Šï×£ÁŒÅÞ0§dæJN¨m)µ ›º›ó—ª¾‚)’ < !ù ,9 %ŠJYŽ(U.ì¢*)ÜÎê¨Ì¸ ×ìÝ·0ßoØ“…‹U.§\Κ¸f0ŠÜ ¡=›3C&w©—)!ù ,B %ŠHYŽ(UBI (²°­ûŽ]ï BÒˆZ°åË ÈËHD‡»èS'B£%¡ŠšÕª¬ÑÛ¯šðÅ®ËÎd…!ù ,= %ŠFYŽ(U쑜¨‘$mûŽF­»I9V¨ª ‡/YëhîšÏÝê9%:Î^Qx%’¢^Ü–R™´£!ù ,< %ŠDYŽ(Ulqœ(q´ô;Êtn«-Ñ÷ªË7¤­~Å1Ç, ™ÆeîX ð¢F’²yƒSÔ¡5E2G!!ù ,B %ŠBYŽ(U:C[œ¨P°më8Â(Ðuÿ’4AMØÊí†ÈÁm•‹ÏžÔyœJKVêPÅÓnUè2Ì’ubXJe:‹B!ù_,; %Š@YŽ(Ul0œ(0´ô;tîäà,àOE ²–±xÔ)›Ndt$2‹¤§Ž—¦¨ÏÔÍÄ…!ù_, !ù_, ;xymon-4.3.28/xymond/wwwfiles/gifs/arrow.gif0000664000076400007640000000033711070452713021153 0ustar rpmbuildrpmbuildGIF89aÄÿÀÀÀêêÝÜÎÎÍÍÀ³³²²¤¤££–•Љ!ù,@\` ŽdiGbr ëz¤ð5x®çÔD§ È&,^€%£ÁX0ʆùX0Å‘`@Ìz¿,xT±ˆG$ýx@"I{Á*îø¼O¼øÿ€]`†c'!;xymon-4.3.28/xymond/wwwfiles/gifs/bkg-green.gif0000664000076400007640000000104011535462534021662 0ustar rpmbuildrpmbuildGIF89a}Æu              "#$%'()*+-/0134578:;=>?ABDFGIJL!N"P#R"T#U%X&Z'\&])`)b*d)f,i-k.m-o0q1t2v1x3z4|568„8…9ˆ:‰;Œ<Ž?=’?•B—@™D›EEŸG¢H¤I§I¨K«L­P°R´R¶TºV½XÂZÆ]ÎdÜ[ß_âdèmïpõ sûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù ,}}€o‚pqrstnmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$##"!  û;xymon-4.3.28/xymond/wwwfiles/gifs/blue.gif0000664000076400007640000000164011070452713020746 0ustar rpmbuildrpmbuildGIF89a÷3f™Ìÿ333f3™3Ì3ÿÈàéV1]óLêVôAZA\ôVf¨ÉÿˆšAêVêV ¸ðAp²ÙæêVn¢ö¿‡´ö¿@ôAðAôVÛò@ôAZò ðüôAú[óôA i€ iˆôXÀFC:\FDB\BBTEST\BBTEST_FILES\BLUE.GIF*@È"ù¿¾ìVôVÿÿÿçܨ°hî@ôVÈ>½ÿÿÿçܨ°´û¿ÿÿÿÿ¯¹ö¿ ¾ÁÚíVÔ¨°ÔùVTëV‡·¾p °û¿ÒëV¬¦GƒÿÿÿÿpëVܸö¿ÏAö¿ã€„ëVܸö¿ÏAö¿´û¿÷¸ö¿´û¿ã€œëV‰¹ö¿‡·ÏAö¿´û¿¯¹ö¿p²ÙæÌëVE1ø¿ã€+õõVèëVÀŒõìV<ìVhìVìVeŒõ Ä7ƒìV<ìVoŒõõVlìV®‹õìV<ìVhìVõVW€õV€ iW€õV$õVLìVDìVÀ~A˜ôVy‹õLAìV!ù,}H° @TãâÎñ¢:ˆª¡Å‹îÄÈ1£Àx ˆ)’a<BÆ[Ér¡»>Œ×¬f3…2ŽRÙ áM—£tòô‰Ó]P2!Úü™@Ê™,Wº„ äC’#Mnt(¤«W† ìhQ£Ø„.UJ4È–`@;xymon-4.3.28/xymond/wwwfiles/gifs/favicon-red.ico0000664000076400007640000000706611070452713022231 0ustar rpmbuildrpmbuildh& ¨Ž( @ÿÿÿÿzzÿÀÀÀUÅXXÿ§éÈ                       ÿÿüðàÀÀ€€€€€ÀÀàðü( @€ÿÿÿ>=ÿ_a_މˆìAE è:;¥$&O’’¨Vabã=:0Ã-w:NQ~k8:Y"åÎÿ††»PQìŽ)+yHI¾AC‹v/13’E//ÿ=opÜxWY@6NLÿIK¦؇ˆÿBDdO£ uuíggûÅQQÌò_aN&&ë A .YXöjkíFFìEFz€ã ï;;ñ y€ [÷79fÃMM‹ÿÛ68€ -&)AZZè \23¥SS× jHJ›n wH‹‹ª ‚=?€€ÿ76ÿIJà2PPâBBÂpqÉIHù crröBBô]`A/1€ «þ—&à 5 !IK„rggáEopäÓÌÃ]\ïÂ::ùbeT;=†ADt]=@@ <@ ÿg‡ð cBD|9;mVUã ùÿZ]N_aX‘u'l‡‡ùIHÿVñøâë¾xwÿ)HJ‹  úGJÿllò &Íbd@cOQˆ@Aƒh`_çLs~!± ceß@@ø46e!&ó11ÿ ëÐ Ìjö2¨Ÿƒ”û ó×)z &Yw h <>ƒOOÿ !@kšŠ [[í óìÞ$$ê 1ÈTºi즦¦¦¦ìõåþ¾¾¾¾¾æñ›ì¦›_}<ôô}—;Õiõ×_ÓeØTÙ_ÃÃÃ_ÛÿIö&&JD¼3!¦i\¸kYYyP¨ ŸŸŸŸéééߦÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿàÿÿþ?üøððððÀÀÀÀÀÀÀÀÀððððøüþ?ÿÿàÿÿðÿxymon-4.3.28/xymond/wwwfiles/gifs/yellow-ack.gif0000664000076400007640000000151211070452713022064 0ustar rpmbuildrpmbuildGIF89a ç3f™Ìÿ3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿÿ3ÿfÿ™ÿÌÿÿ3333f3™3Ì3ÿ3333333f33™33Ì33ÿf3f33f3ff3™f3Ìf3ÿ™3™33™3f™3™™3Ì™3ÿÌ3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÿ3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿff3fff™fÌfÿ3f3f33ff3f™3fÌ3fÿffff3fffff™ffÌffÿ™f™f3™ff™f™™fÌ™fÿÌfÌf3ÌffÌf™ÌfÌÌfÿÿfÿf3ÿffÿf™ÿfÌÿfÿ™™3™f™™™Ì™ÿ3™3™33™f3™™3™Ì3™ÿf™f™3f™ff™™f™Ìf™ÿ™™™™3™™f™™™™™Ì™™ÿ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÌÌ3ÌfÌ™ÌÌÌÿ3Ì3Ì33Ìf3Ì™3ÌÌ3ÌÿfÌfÌ3fÌffÌ™fÌÌfÌÿ™Ì™Ì3™Ìf™Ì™™ÌÌ™ÌÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ùÿ, 'ÿ H° ÁW¯ D¨paC FtH‘`ĉ&”ˆ±`LJ;xymon-4.3.28/xymond/wwwfiles/gifs/unknown-recent.gif0000664000076400007640000000110411070452713022767 0ustar rpmbuildrpmbuild‰PNG  IHDR(-SØPLTE33f½¥BýÐîߦÿìžok}ŸŸŸõîÓýÜYÏĦ„ƒ{^Ynÿñ»îÂųxÿøÜ”Œmeavÿ×9ÝÔ¸ÿåÿî¬ÏÌÊýËÿýóõ奭¬»ÔÄa\s‘Œ•üÒ,‚|…©¡–þálˆ…xÿõÌ·°¥ÿûíšgcb†þÚKÿèÿð²ûÌóå±ÖÊ¥DCnÀ¦?ÿí¥ys¤žŸýôÑ………\Z}ÿóÄôÆ Å¶†ÿúåcaÿÚGåâÝÿæ„ÿð²üÌ ÿþùÿê•ÔÆa^}ûÓ3ÿãtž’bRÚ÷ºHtRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœìò`ÓIDATxœ-ëRÂ0F·X FJëÑZŠoц–ˆ™Xmíû¿› ߯=gfg÷ƒÎ]üÔC›rFÖ ë¤(yƒ^ ø¹yÚn¿/rQ9aõÕ÷¥~B_ûÞ¦yî6–𮛘„Ôšøî¯k#ð'IQü½òpÝ œÖY–×µIgÈ£²^OˆÛ¨+º"7›ßé|G¼Ç€6RÞÎÏÆÄ¶bþÓ…1míŸñ_ù.6BÌzX{Ñ1•¦Žm)lÅ”òÓt+ðÙÛ„IEND®B`‚xymon-4.3.28/xymond/wwwfiles/gifs/yellow-recent.gif0000664000076400007640000000056611070452713022616 0ustar rpmbuildrpmbuildGIF89aÃÿÿÿÿû¥ÿû9ÿ¾ÿãÿŠÿÛÿÿ÷ÿ¶ïÿ¢ÿšµÿÛÿ×!ÿ NETSCAPE2.0!ù_,gÐÉ jXÖ Æ WVacp´/J ãñ’/¨ ÈÜ?AôH‰Z’ HM‡Äâ'6DÁTáL'aKÞ2ÎÖÐÛ¶·: aœVÒªyC8Ç‹ (j…†Š!ù ,¸y¦­D!ù ,¸Ié±5ƒ!ù ,ð¸I+=!ùP,ð¸I«½3E!ù ,ÐI¦½³Î!ù ,ÐI¦¬3;xymon-4.3.28/xymond/wwwfiles/gifs/favicon-purple.ico0000664000076400007640000000706611070452713022766 0ustar rpmbuildrpmbuildh& ¨Ž( @ÿÿÿÈÆµšÿþaýÿüš˜ï¶ÿÿÛÿ®¬ïíÖÔ                              ÿÿüðàÀÀ€€€€€ÀÀàðü( @€ÿÿÿÁÀ€ša`ôbóÄÊÂ;P;ÿÿ‰A‰ž‡ÙЦþ/ 4‘ÏFÎMNsnqní1ëãÍãM+Mà Ý«ˆ°k0k*Æ™ÞVnVHGwz©§ÌËŠ‰ÿBÿâQát[Xpÿ!ÿVKYœ<œ´Æ;0=îíy#yÕ«Û$?#Ý9Ýgm…sŒsÒÐ##`U~ ›zo~ÚÀ×îëJÓ  ‚ i#ilglrrvu 8 ËÉñ ïwyw~OM,-}áIà9 8®­ŒŠûùHKm:H9E@..gf  t7tàÝ»¸[Zñ5ñmfy55¤¡’& &²ŠÄÅÃXWi*iîëÕÓÒ¬ÿêèï+í98;‚‹vtóñõ0óú÷!%$dcˆ2ˆ4 9”’''Šƒ~ }…„ÿôÿ   ŒÙ764 4_YonàÐà! !vun3n…7…%%+ +×=Ö›šzy×Ä×ÿÿÿÿÿ;ÿÿ1ÿED ¸¶¬ªJHp ÄÎÄ ãáÍËv3väIãNNQQqeojiŒŠhh‰#ˆá.á(+ÑIв°ut€ƒr3rîëÄÀ¾¼_^“õóÝÛ**88WVŽxwÇÅñï#"ÕÒ2133GFWNZpoù÷;;;;;;;;¬îuéð@ððððÄ÷;ç¸éRH{ÈÈÈÈ ð¸æ¬‡ßx0Íí\\\ííqŒ½‚Äg¸Ô{{{HÇÇHHÇÇÇHÞ|uçıÇ0Ô‡ÒÒÒÒÒÒÒÒ@‡Ô¼H¦uî¬èõ•ª®>¹¹¹ggg¹¹¹>®ªq0¦Äþ¿‚•ÀÍ{ª½½½½±Ô±½½½½ªHÍõ臿ìß0}ëíôäääôøíøôäääô…ë}α¡£ÍÀ}µ›››¨øÀ•ª›››Bä}À•¦Ò;éHUœë•h‹wwÜ¥êqcQwwÜ à0—0Ç|¬æòUÀõÞ©ajs5DÉ#^eÓs5D~PŒ‘0ð;µœÀÍCw¾+d 8=M6+d­b°Ç\Èð;µëÀíÒv«² 3FI²–.1€HíÈð;µœÀ̓/Ëš™"STNš™"'‰ŸuH\Èð;xœÀ—kÚ,Z¢%(v,Z¢ü_W‡†\Èð;æh œ½çpÙm;öÅÊŠpÙm;öÅpæ†\Èð;Ì×Ã$`½Øû££@Oóoãû££@Oó†\Èð;ÌAÐE”ýÈøôHªùæÑ{øôHªO‡Çq ¬¤…Cç:$`—†Äåi$`—†æ‡ÇðŽ4ÕzVYŒÒºáÝVYŒÒßHµ¸Æž<“Ö’ð@£´*¶i’ð@‡½{ÞþÊÏyˆ7JïŽgãùñ‘¯³g÷½èô Äþ·f»Glýýx‘)èý£Ô±òÈôRÒ>2]!KXÛârrÿ}õÍÍíÎÇÞ Ò9„ &- [ÁÀÀÀÀ‘ª‚ĸÌm§¤!?˜”)œõ‘±gæ¬9„LntµµµxúÌö;ÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿàÿÿþ?üøððððÀÀÀÀÀÀÀÀÀððððøüþ?ÿÿàÿÿðÿxymon-4.3.28/xymond/wwwfiles/gifs/green-ack.gif0000664000076400007640000000151212511454274021656 0ustar rpmbuildrpmbuildGIF89a ÷3f™Ìÿ3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿÿ3ÿfÿ™ÿÌÿÿ3333f3™3Ì3ÿ3333333f33™33Ì33ÿf3f33f3ff3™f3Ìf3ÿ™3™33™3f™3™™3Ì™3ÿÌ3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÿ3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿff3fff™fÌfÿ3f3f33ff3f™3fÌ3fÿffff3fffff™ffÌffÿ™f™f3™ff™f™™fÌ™fÿÌfÌf3ÌffÌf™ÌfÌÌfÿÿfÿf3ÿffÿf™ÿfÌÿfÿ™™3™f™™™Ì™ÿ3™3™33™f3™™3™Ì3™ÿf™f™3f™ff™™f™Ìf™ÿ™™™™3™™f™™™™™Ì™™ÿ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÌÌ3ÌfÌ™ÌÌÌÿ3Ì3Ì33Ìf3Ì™3ÌÌ3ÌÿfÌfÌ3fÌffÌ™fÌÌfÌÿ™Ì™Ì3™Ìf™Ì™™ÌÌ™ÌÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿ3ÿfÿ™ÿÌÿÿ3ÿ3ÿ33ÿf3ÿ™3ÿÌ3ÿÿfÿfÿ3fÿffÿ™fÿÌfÿÿ™ÿ™ÿ3™ÿf™ÿ™™ÿÌ™ÿÿÌÿÌÿ3ÌÿfÌÿ™ÌÿÌÌÿÿÿÿÿÿ3ÿÿfÿÿ™ÿÿÌÿÿÿ!ù¬, @'Y H ­ƒ´ *xp¡Á„ :lèp!E‹/2„¨ñ!ÄŠ ;xymon-4.3.28/xymond/wwwfiles/gifs/purple-recent.gif0000664000076400007640000000064011070452713022603 0ustar rpmbuildrpmbuildGIF89aÃýaþüÿÔÖíÆÈ¬®ÿÿÿÿ¶ïÿÛÿÿšµ!ÿ NETSCAPE2.0!ù_ ,_É jXÖ„Wpa€‚EX¨ªµaŒ6j`§?_ŠðXŽÃAU|! À3ªd ^ŠÄÝV‰“Ëe¦´z§€:³ÆF§Ë)€ƒþ’e4G‚ƒ!ù_ ,E!ù_ ,E!ù( ,E!ù , ÐH k¡æ‚Í#!ù , ÐH k¡æ‚Í#!ù2 ,1#§1Å–!ù ,±"'¸ì‚!ù , И$8«´À^;xymon-4.3.28/xymond/wwwfiles/gifs/favicon-blue.ico0000664000076400007640000000706611070452713022406 0ustar rpmbuildrpmbuildh& ¨Ž( @ÿÿÿÿHþžWœ,ý{Ì:ýŒ8ýe(°1½5þ˜M                        ÿÿüðàÀÀ€€€€€ÀÀàðü( @€ÿÿÿÿo tM,Á1ðSQ¾v0†(ïC" À] O6ÿ‡2§EápG݉IþS©eÿ§=k ÿj&¡.×=6ŠR#éX õ} ÿSw4ÿ–Hí†5A,X5¼< ±2õ“/]%È{;ÿEÿ_ # öœ?ónÿ'x$êw"“+?í—H€L ä@Ë9‰Y.F ÿ…€Q,æK\ÿs!ÿŠ'êOƒ? x?íaÿ”2óZ *ÿ]õ’E¹8ÿž:ÿ{÷Hÿb ÿV ìrî}'ÞEÿf÷‡5©0~5ÿ—@ek'éE#ãŠHÿLš, ÿ¦D` rr9¶.Å7/W-}F<ÿXïz J)Ý?õC yP-* ÿ‚"~N(Ï=þZôI}B ¾6éBÈw7DUÿRûIp#†S,¹4µ8  üúBósÓ;îui#ÿ‡*ÿi øFê^ÿpfÿ^t"~%éI’&A ²-µ4ñ†5ÿP¥.ëy%íF ;ÿ~ÿ~^ÿIm‰V,Ï;œ/Â5¬.ƒ%ët ÿ}'XbÿVm!ìCæA–+È8 " ,2Gþyÿf&öFãCà?Û>+ÿ <ý™@A.iv!ž-»5! ùI÷Dq"sK-~E # ÿ¦?ÿ˜Iÿ™AÞˆGÿj$ÿ\ÿMÿJ`ýIdûGípóEñEïFéDz%„'Ø<Œ(}DÒ<Í:Á7³2  4ÿ”0Xÿ_[ÿRÿKëti ô‡‡‡‡‡‡‡£¿á=µµµµµÁ+Ö±ù`%V     í³Ö£§ã턼­­­­ññ%ȸ¶Á¾ö”%¼ÏÏg¼gggggggg{œÈ¤§¬ð| ºÆpÆÆÆÆÆpÆÇŒ«{1µ÷] g«5äâäääää䑯6¼6¼Î£ûñº5 ¨ý¨¨¨¨¨¨¨ý¨çp66ì{á󳸼‘¨¨¨¨¨¨¨¨¨¨¨¨¨ýâ5Œìñ¸³Y®5ýŸŸßßßßßßßßßßߟŸýÄ5go‡cI¢äæ|ºººººººººººººººÆŒñòín£½úàœ–ÌÌÿÿÿÿÿÿÿÿÿÿÿ–»„ðVµ‡rz-Ñ™ÀØ+++++++++++++ØhÓœŒVµ‡rŠÑfÍÓ»ÏðVµ‡rÕQ“€Ò ¹|||¹ ¹|¹ ¹|||¹¹g­ µ‡rj0¥TlŸßßߟüŸŸŸüŸßßߟļ­V=‡²4žøÂE牨ßýä瑨‘çäýßý¹ïg6òá‡PªÚÙ—›¨ýœëœ5œë%¨ýœêë„Ç­”õPs^,mš2dì<Ç–~È1~Ó<Ç/káòïV=‡ƒRB'YŽ”§/…Å…ê§”Ž””/¬ÏãÐU&AF¾t¯Çyypë¿Ø¿p輸³v : eZd)ý¨ß¨­–©–„Ĩ6§9ÜÊ?ˆ’˜‘ý_àààL[é|5pïVù£ ;(ÛbJu•*x··ÞGN_q«`§¤ ;H u¦K>ÝÃM@wg á³"Ô#7}XÉD.´´>Þ$‚Yh†† ;3!¡°þåCS\aOôËi4îzzšW–8PP²rrrr׋ÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿàÿÿþ?üøððððÀÀÀÀÀÀÀÀÀððððøüþ?ÿÿàÿÿðÿxymon-4.3.28/xymond/wwwfiles/gifs/bkg-clear.gif0000664000076400007640000000104011535462534021650 0ustar rpmbuildrpmbuildGIF89a}Æu  """###$$$%%%'''((()))***+++---///000111333444555777888:::;;;===>>>???AAABBBDDDFFFGGGIIIJJJLLLNNNPPPRRRTTTUUUXXXZZZ\\\]]]```bbbdddfffiiikkkmmmoooqqqtttvvvxxxzzz|||„„„………ˆˆˆ‰‰‰ŒŒŒŽŽŽ’’’•••———™™™›››ŸŸŸ¢¢¢¤¤¤§§§¨¨¨«««­­­°°°´´´¶¶¶ººº½½½ÂÂÂÆÆÆÎÎÎÜÜÜßßßâââèèèïïïõõõûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù ,}}€o‚pqrstnmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$##"!  û;xymon-4.3.28/xymond/wwwfiles/gifs/zoom.gif0000664000076400007640000000174711070452713021013 0ustar rpmbuildrpmbuildGIF89a÷þþþÎýýÖýýÐþý÷ñë”§óïìÃþþÉþý˜æûšæûþØtÎÎÖ‚ÑùƒÒûØ‚Ñþý¾ýýýýþ¼þýÂþýÌýý¿ÂÏÒþþ«îü’®Êqo…{ÌùÑÑÚÞüÎÏØÜøyÌý¢‰y©‹x—oU}¥Ò§u  "Ã( 2:Ñs#cš"@¸“$J•!k2ÆÁd@ …xLÀá(#ÐPiQ¡I€ J2®ØÑ£F^(T £|¡ à3S2¾q2ãK0YéÂ!ã#:*–9p$†B{ŒÈÈ€M"XÜx@R ‹:n3!2ç ‰êP³eœER"3ÑÈÇ¡š^ áE Ð ýÈ£! ;xymon-4.3.28/xymond/wwwfiles/gifs/red-ack.gif0000664000076400007640000000151211070452713021323 0ustar rpmbuildrpmbuildGIF89a ç3f™Ìÿ3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿÿ3ÿfÿ™ÿÌÿÿ3333f3™3Ì3ÿ3333333f33™33Ì33ÿf3f33f3ff3™f3Ìf3ÿ™3™33™3f™3™™3Ì™3ÿÌ3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÿ3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿff3fff™fÌfÿ3f3f33ff3f™3fÌ3fÿffff3fffff™ffÌffÿ™f™f3™ff™f™™fÌ™fÿÌfÌf3ÌffÌf™ÌfÌÌfÿÿfÿf3ÿffÿf™ÿfÌÿfÿ™™3™f™™™Ì™ÿ3™3™33™f3™™3™Ì3™ÿf™f™3f™ff™™f™Ìf™ÿ™™™™3™™f™™™™™Ì™™ÿ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÌÌ3ÌfÌ™ÌÌÌÿ3Ì3Ì33Ìf3Ì™3ÌÌ3ÌÿfÌfÌ3fÌffÌ™fÌÌfÌÿ™Ì™Ì3™Ìf™Ì™™ÌÌ™ÌÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ùÿ, 'ÿ H° Á!C D¨paC FtH‘`ĉ&”ˆ±`LJ;xymon-4.3.28/xymond/wwwfiles/gifs/green-recent.gif0000664000076400007640000000025111070452713022372 0ustar rpmbuildrpmbuildGIF89a³ÀÀÀöɹœ†t`!ù,VÈ™jXÖ„0W–paH‚¥é¢ª& AÛ5¨Ãíç)@b€+Þ ÕÐt`:‘J¢kzJ T*LƒM¦ ƒŽÛµ„·±Z%ðC*–јëø|;xymon-4.3.28/xymond/wwwfiles/gifs/favicon-yellow.ico0000664000076400007640000000706611070452713022772 0ustar rpmbuildrpmbuildh& ¨Ž( @ÿÿÿŠÿ9ûÿµšÿ¥ûÿ×ÿï¶ÿÿÛÿ÷ÿ¾ÿ¢ÿãÿÛÿ               ÿÿüðàÀÀ€€€€€ÀÀàðü( @€ÿÿÿ˜ÿ£xlnlÿÿÁÄÂýÿQ;jC”—%NiÁ¥€ÔÇÂ{ÅÉÕ¡ú>.+4ØàkphçÓç’¢?yÍþ9kw‚•—"šÌ`—_Šˆn¼fàä)JjzJk=õúÄ•ÕIQJi— 8<ÿÜÿܹÕ~ßMNNÚâAÈÉŽÙÙc’’}‹È¦¿©´!ÿÿÊÖÖÀÜ-RJ€Z{)1æöè±èðéë]lcYkS†‰†ÀnJ2^˜‹˜(]>9@W÷÷.œŸ’íðOi®íM‹u o€YwyC[\³Ê“â<†‡ÒÚŒky&&'ÊÙ%àäÑáâŹä1q¦ÏãNøRQ¤ü-všš>•P‰†CåÀ$yÈBXeeXŠXX%¯rðÃÓ° NZ†-*Ø™váx3+0|¢ BŒuuš4.{£tiYLžžø†e¤/U¥©J|—ŒŒŒÓÓÃÃÃÃÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿàÿÿþ?üøððððÀÀÀÀÀÀÀÀÀððððøüþ?ÿÿàÿÿðÿxymon-4.3.28/xymond/wwwfiles/gifs/blue-recent.gif0000664000076400007640000000112111070452713022216 0ustar rpmbuildrpmbuildGIF89aÔ Wžþ8Œý{ý:Ì(eý,œM˜þHÿ5½1°ÿŠ„ÿ$ÿÿ‚{ÿMJ!ÿ NETSCAPE2.0!ù_,Z $Ž@YލXÂ0 g ‡[ÜD ³‹üÀÜNÕ*„aðc2a ÐZÑàuµ&Ú—i\új ]¯A‰N'’¤h÷ æå¢xÂ:5(þ kC|}&„‡|!!ù_, !ù_, !ù_, !ù_, !ù_, !ù ,  Š!!ù ,  °0$@@šB!!ù ,  °,Íò"£2‚¾I!ù ,  $>Ð"–ÍB Ó0 4 …!ù ,  $6Ð#BLÊ@ຠ”Ì3!ù ,  1$!@š"'â²!!ù ,  Œ#!( …;xymon-4.3.28/xymond/wwwfiles/gifs/blue-ack.gif0000664000076400007640000000070511070452713021503 0ustar rpmbuildrpmbuildGIF89a Æ3f™Ìÿ3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿÿ3ÿfÿ™ÿÌÿÿ3333f3™3Ì3ÿ3333333f33™33Ì33ÿf3f33f3ff3™f3Ìf3ÿ™3™33™3f™3™™3Ì™3ÿÌ3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÿ3ÿ33ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù, "€‚ƒ„…††ƒˆŠ‹‚Œ‘Ž”„‘“–ˆ‰’˜……;xymon-4.3.28/xymond/wwwfiles/gifs/xymonbody.css0000664000076400007640000000103011535424634022072 0ustar rpmbuildrpmbuild/* body classes definitions */ body { color: #D8D8BF; background-color: black; background-repeat: repeat-y; } a:link { color: #00FFAA; text-decoration: underline; } a:visited { color: #FFFF44; text-decoration: underline; } .green { background-image: url(bkg-green.gif); } .yellow { background-image: url(bkg-yellow.gif); } .red { background-image: url(bkg-red.gif); } .purple { background-image: url(bkg-purple.gif); } .blue { background-image: url(bkg-blue.gif); } .clear { background-image: url(bkg-clear.gif); } xymon-4.3.28/xymond/wwwfiles/gifs/favicon-green.ico0000664000076400007640000000706611070452713022557 0ustar rpmbuildrpmbuildh& ¨Ž( @ÿÿÿöt¹œ`†É ÿÿüðàÀÀ€€€€€ÀÀàðü( @€ÿÿÿÿ¿?ŸÞ^î/nÏO®÷'æ7G¶f—v‡×ÈV§ ó+3Ä;»CK£Z›b“j‹rƒzëá"Ò̳«R ñ äÜÙ$Õ)Ê5Â9=½A¹E±M©¥X¡\`™d•‘lp‰t…x|þø í ÝÖÑÎ !ËÉÅ*Ã,Á.¼2º4¸68µ:<>¬@ªB¨D¦F¤H¢J LžPœQš˜U–W”Y’[]ŽŒaŠˆ†„ik€mq{syuwn@nnnnnlz‹(MŽƒw@ot’15d»3½3b­Knl:Nœž1±¦ª¬¬0¬_4œ‘%w8*2e¼¼5555555¹À- qI*`®>½P”º^¥h§ "l‘d°_¦¤Dwwwww!!yÀ±´5«ƒ6µ,®1Ž‘R˜**š+”K‘¯¶0¿ŽjœµU_¢”5ª_ °°¬¥4G*¹.gr–`®™··¥“>•UU>SŸb¢/2.´[&@P¾¦Z£^_¨ZŸŸXXXŸX¬^¥^cÀW…m#§¡=,.ZV•™¡.£¡¡£¥ZV>U¡0c4¸nB •Š,\.¡ŸZ..££££.£¡XX£0cµ MnB[O,\¦^0¨.Z\^0¨.Z\^ª¦¥ªcµ nB •Q›¡\4dg\V¥4dg\V¥4¿4¨¨³µ nB­VVU1R ¨1R ¨1š²_.±µ nr]=“V§D”0‚•D”0‚•z˜±aµ Mnt¾u)O Tr¬J“¬J“s³Xa¶¸8f}‚'  0“¢tŽ0“¢8‘±,a©…m•';—R‰¬€“Tq‹¬€“TBM°U2 ‰dCS*0LUW~*ª'•«: 4Rr»9†´1d^>-º¦S›5Yº ¦j#3{ F<„SXZ¡¦¬ª¥¡.^®´fW%6?hL$E—••V¡\¦Z™—¾?‡"hxp7E;<ˆ>››,Z¬¶dW #d4³)AikLLŒ¥ºšƒwtv:¼H7}OQV¼”slPd4¹½1·­’|8vvtssq@ÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿàÿÿþ?üøððððÀÀÀÀÀÀÀÀÀððððøüþ?ÿÿàÿÿðÿxymon-4.3.28/xymond/wwwfiles/gifs/unknown.gif0000664000076400007640000000110411070452713021511 0ustar rpmbuildrpmbuild‰PNG  IHDR(-SØPLTE33f½¥BýÐîߦÿìžok}ŸŸŸõîÓýÜYÏĦ„ƒ{^Ynÿñ»îÂųxÿøÜ”Œmeavÿ×9ÝÔ¸ÿåÿî¬ÏÌÊýËÿýóõ奭¬»ÔÄa\s‘Œ•üÒ,‚|…©¡–þálˆ…xÿõÌ·°¥ÿûíšgcb†þÚKÿèÿð²ûÌóå±ÖÊ¥DCnÀ¦?ÿí¥ys¤žŸýôÑ………\Z}ÿóÄôÆ Å¶†ÿúåcaÿÚGåâÝÿæ„ÿð²üÌ ÿþùÿê•ÔÆa^}ûÓ3ÿãtž’bRÚ÷ºHtRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœìò`ÓIDATxœ-ëRÂ0F·X FJëÑZŠoц–ˆ™Xmíû¿› ߯=gfg÷ƒÎ]üÔC›rFÖ ë¤(yƒ^ ø¹yÚn¿/rQ9aõÕ÷¥~B_ûÞ¦yî6–𮛘„Ôšøî¯k#ð'IQü½òpÝ œÖY–×µIgÈ£²^OˆÛ¨+º"7›ßé|G¼Ç€6RÞÎÏÆÄ¶bþÓ…1míŸñ_ù.6BÌzX{Ñ1•¦Žm)lÅ”òÓt+ðÙÛ„IEND®B`‚xymon-4.3.28/xymond/wwwfiles/gifs/red-recent.gif0000664000076400007640000000056611070452713022055 0ustar rpmbuildrpmbuildGIF89aà ÿzzÿXXÈÿéUŧÀÀÀz˜Îÿ!ÿ NETSCAPE2.0!ù_,`ðÉ jXÖ„(WpQœC`cœ0®Z@Tñ;У ‡ð…P=z'®P\KX`ø,X@ó8H*_ÑÀë>K%íŽ20‡e2«½« â45Á'ç3GX€ƒ„!ù ,p­·X!ù ,±Ç"!ù ,°µ'#!ù ,й'#!ù ,°µ'#!ù ,±'#!ù ,p­·";xymon-4.3.28/xymond/wwwfiles/gifs/bkg-yellow.gif0000664000076400007640000000104011535462534022075 0ustar rpmbuildrpmbuildGIF89a}Æu          "#$%'()*+- /!0!1#3$4%5%7'8':)=*;+?+>,A-B/D0F0G2I2J4L6N7P7R8T<U<X>Z?\?]A`BbEdFfIiJkKmKoNqNtPvQxTzV|WY[„[…[‰^ˆ`Œ``Ža—e•f’g›hi™k¢lŸm¤n§p«r¨s°s­t´u¶z½{º|Â~ÆΊÜû¤â«ï¨õ§ ß°è¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù ,}}€s‚ptqronmlkijhgefcdba_`]\^YZ[WXVTUSRQPONMLKJIHGFEDCBA@?>=<;:987654321/0-.,+*)('&%$##"!  û;xymon-4.3.28/xymond/wwwfiles/gifs/bkg-purple.gif0000664000076400007640000000104011535462534022071 0ustar rpmbuildrpmbuildGIF89a}Æu     "#$ %"'#($)%*%+(-)/)0+1-3.4.517183:5;5=6?7>8A:B<D<F>I?G@JCLENEPFRJTKUNXNZN\Q]S`WbWdZf]i]k_mbobqetfvhxlzl|nrq…s„w‰xˆyŒxyŽ•’—„›…™†‡¢ŠŸŒ¤Ž§¨«“­“°“´›¶›º›½Ÿ¢ƯδÜÎûÒ õÎïÑâÖèÕßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù ,}}€t‚rsqponmlkjihgfedcba_`^\][YZWXVTURSQPONMLKJIHGFEDCBA@?>=<;:987564321/0.-,+*)('&%$##"!  û;xymon-4.3.28/xymond/wwwfiles/gifs/favicon-unknown.ico0000664000076400007640000000706611070452713023156 0ustar rpmbuildrpmbuildh& ¨Ž( @ÿÿÿËýsyåÿf33»¬­B¥½¸Ô݆¶ÅGÚÿÌõÿgšnY^•Œ‘¥íÿÝâå–¡©ÆÔ,Òü†bcåúÿnCD¥°·x…ˆÊÌÏÂî¦ßîláþYÜý»ñÿ•êÿÐýx³Å9×ÿÓîõ…|‚}Z\ŸŸŸ±åóvaeÄÔ}koÌûóýÿ¦ÄÏ……… Æô¥åõÜøÿ¥ÊÖ²ðÿmŒ”tãÿÄóÿèÿ3Óûacžìÿb’žs\aíûÿ¬îÿùþÿÑôý{ƒ„ Ìü„æÿŸž¤?¦À}^aKÚþA A..A./8GG" /;.CC5 +;.8)< !5 B/AB33(< C5 .662C5 . >C"A>11@@F->:75G41@$0CG===1@:78B,#D*CBEG?%%9&'/G=1@6>8B>>:BBüðàÀ€€€€Ààø?( @€ÿÿÿÌý–uwÒçc,,Õ¼º5©ÇCóÿ’¥¯¹ôÿuSV[•¤ÜÝàyûÿ¬ÑÜ+Àæ‹‘ªj­¾bßþ áþÜùþ”ºÈtrz–êÿµ¼¿Áªªm@B7×þÁìËËÎB¼ÚcdËéòrœ¦M°É©¬²òæå}äþ«åôÄÛÝ“„ˆ Ÿ ]óÿ¡üÿÎü•ÐàiŒ•}©¸‹– ßíñ/µÖ´ ¡ÊþÿžÅÓIàÿ ÜþÞÒÒoagíøû·ÆÍqÚõ ÙéµÝè‡}‚uÉàÆï1ðÿŒmomëÿw²Å(ÕÿD¨À›µ¿¦ðÿÐòú†ºË€mrQîÿ“áôa¬Œ–i54»ãc¥¶ÏÕÙŠèÿs¦³œ–›,¬ÍrJK;³Ñ ‹Ž Æô-äþpŠ;èÿÊ··’ÂÒ­ÁÇ|\^Ë¿À¡ãõ}Ûô´ìúƒ……Wàþ~íÿ‘îñòŸ¿Ê­÷ÿ¢Òàž¬´Æôÿ ÒÿÜþ—óÿkáþµÎ×Öÿ€v|¾ÕÜ«Úè­œŸ‰×ëãóøÖêïëàáAÞÿ ëüãÿÿÖÿÿ–‘yÔì`çÿxek¾ýÿÖýÌâé~£±÷ýÿX¯Å‰prsäÿÈöÇìõ‘Õè5Ûÿ¨±¸™¨±¤ÎÛ¿òþìÿIîÿÂêwˆ‹‘•<¹Øb”¡ËüÖÿ=¬ÈrNP'´×Ÿòÿ+Üÿtõÿ’ ¨D²ÍÐøÿƒhkމ‰›£a''uŸ¯Âä“‚µñÿRÜÿk;<Ùðð†¶ÅÂîAÚþ¥Þêw—¥‘©³åúÿÌü#Üÿ8ñÿ~‰Œ©ž¡o™¢ÒäìÇÇÊŠÍíôFöÿ¦öÿjÝú«¨¬çúž¡¦—²¼|_aëüÿyêÿe11HÛÿ‹Ž2²Ò¬ëûiçÿšÔà´úÿUíÿ¥âòw\_ÜÿÖ÷þ.¸Û¦ç÷'ãþËõÿ;Þÿ­ñÿ„åþ³ÁÈÔùÝþÿd™¶èõVçÿßø›¹Å€swÑþ“¸ÄnQUt…‘\àÿtWZ‡km Õú›îÿxÙò¬ßîlGI{kqèòöŒzŽ‚‡§™œ`àé`RjZ£ Ÿ\ª$ø’’¾¾¾¾’œßI `Ôj±œyÝÝyyy¢¢t¡^T4$Xž­^ö¢H•‚888‚•Hᄀ¡¸\Qžjç¢áã´ó×FF׈kÓHytÕUž­¡u•ó‘ååìhø>>Êk´¹H¾^ÕQžj‹¢a×W÷Ì”M»°GB>w´¹Ht\Xjuãw÷äKgcm‰ñ;òG‡‘wó´¹Ht¸$`¡D׳ äÛƤSú1'‘w´¹Ht¡4 .Ú÷³ ³(72ûô‰·~ål‘wó´¹y¡TI#jѳ♠³i|o ® ð/PWW'‘w´H¾^ßÁ¡ák™âs™™ êooqÛƒƒWå'‘wkÁ¡ÀÑÖs«âsss@rR©˜ÖäÉ÷WW'‘ÓHt’$¾›š™â«««ââxþ¤Ü®˜äpK÷Wå'w´•¢¾ª`¾O¦âÞÞ«««{*µÒ‰—ùÙpÉ÷W'wó¹¢¾\0¾Ú¦«ÞÞ…"%¬¤AJ|ÖK¦Wå‘Óy¾Ÿé¾ÚKÞ½½½èÞ)%ýe NRíºK¦W'wÓy¾ 0¾O¦«½Ð½½½½è"æ†e[ AÎ?ƒšåwÓy¾\0¡šs½ŽÐÐÐЄ„èÇ=Y¬[ z¼ØÌ÷Ww¹Ý^¡_׳ЎŽÐÐн„„èL{Íϵzð̦šݸ¹¦ÐŽ<ü33½ÐÐè"–!¯Ü¼gÉš´Hy¥ï¨«Žn ÅV€¶Œ=YϵîJà¦Ñ‚ïC¡Èv½&f}]]ÿÂY*!!A—Öšóát¸ÝëɽbEEEõ²+d@i÷וu^‹¿,KÄ:5}ÂÂÂË{“ ¦‘a¢t¡k÷â333€€€"“™ ¦‘ãu¡‹ÝÈ-Š…è„è…6 vl,ÀÝ‹9y¹FvÉpÉÉvlóy9¡¾§OÚÚO›À¿¾¡9t¾¾¾t9¡ÿÿÿÿÿðÿÿàÿÿþ?üøðàÀÀÀÀÀÀÀÀà?ðøÿüÿÿ€ÿÿÀÿxymon-4.3.28/xymond/wwwfiles/gifs/green.gif0000664000076400007640000000016611070452713021121 0ustar rpmbuildrpmbuildGIF89a¢ÿÿÿÀÀÀIøI«5>€&>Y'8ÿ!ù,@;ºÜz$ÊBëiGèÁ¯{å}0Œ˜¦r,@“E>î|ÔNfž¤¾µŒŒa8dABE”‹p ÈsF]$;xymon-4.3.28/xymond/wwwfiles/gifs/purple.gif0000664000076400007640000001025411070452713021327 0ustar rpmbuildrpmbuildGIF89a€€éÿÿpÿ€€!ÿ NETSCAPE2.0!ù ,!ŒiÀí¾ždq¾jÎ`go“(‘WÀAhJ­¬!°B!ù ,"ŒiÀí¾ždq¾jÎ`go“(‘WÀAhJÛ¹oªÔH!ù ,#ŒiÀí¾ždq¾jÎ`go“(‘WÀAR+›Â+öQ!ù ,#ŒiÀí¾ždq¾jÎ`go“(‘W pšª†»lü)öQ!ù ,$ŒiÀí¾ždq¾jÎ`go“(§‰šk«®lËŸ‚!ù ,%ŒiÀí¾ždq¾jÎ`go“!pZ ”&™®hª†/üÍô¨äG!ù ,&ŒiÀí¾ždq¾jÎ`go§ÂHŠgjžhغ_,Oª»JÊŽ!ù ,(ŒiÀí¾ždq¾jÎ`g#pZ „"XždiZ(û­l{ÉóôÎ4¥ôG!ù ,(ŒiÀí¾ždq¾jÎÀ®Âzc)ޤeªYëNp|¥*Þz­ôF!ù ,)ŒiÀí¾ždq¾j›ÁuÀŠd™è¤®×Æá+ËRk{uí)¾Q!ù ,+ŒiÀí¾ždq>#ì "kÊu€užUšZªNl»™òÙ¼r<ßuä:© !ù ,.ŒiÀí¾ždFLYímYïîM`øŒ$êz¦Š¥,[Êó ÀMSú΃¹ÄC!ù ,-ŒiÀínÄ›,J ƒØ¸YÞ} %ŽOizÚÆ¦ÊžkÛfM« ^¿AË)†ˆ!ù ,-ŒiíïƒTNƒØÛ5èiWžgeªd殣bÐÔ¤áè ßÓ)†ˆ!ù ,-Œi"àÝb±NZßÅyóè}ZÀ”¥Eš&˜ªç¸«8òk<7•ë{ï“)†ˆ!ù ,,ŒiÂàÁb"ÆIíÃYó~ÔX…ähž *h8oÃ>sÛs®«|OR!ù ,.ŒiÂãj.Ê@™…3oÐyV(rXF]š>ÆÃ6nÅÚ[ÛxÎî|æû5DD!ù ,+Œi áj.Ê@›}3‹ÝyV(^€G™'Zë¸/,ÏhmgxÞì¼ " !ù ,-Œi ßj.Ê@©33ÛyBdbÅÏù¥;–/+ÏbmgxÞì¼àã)†ˆ!ù ,,ŒiÂ-#X®IH+»Y¿hž…иM扪*„ï(ÏZm;xÎ켟S!ù ,+ŒiÂÍãr.ÂI›5 ×@žpâ(”a„ &;¾p&ÏNm3x¾Ûý¬" !ù ,,ŒiÂÝár4h•jÇE߃‰£Pš_ªRlÛ¼0ÚY–[Û­lǹnR!ù ,&ŒiÂí®Š8©m0ë}yß&ŽUi6h*¬©k£üÑšM):R!ù ,-Œi íâb¯Êiu`Æýx(ˆãfž!–µ(ÛfUê:t]Âq}Çùì(†‡!ù ,&ŒiâÙb° 0©}YïîU`ÈÌyZc ­¬ã¾1;§õyKÊ~!ù ,(ŒiÀâÁbZ1é}YïîY`ÈÔÙ@㩚(Z¾¯³Îõ{£ù©ôH!ù ,&ŒiÀ ãj.Ê@™…3oÑyV(rXF]hI®O뫌ҙM):R!ù ,&ŒiÀ,áj.Ê@›}3ƒÝyV(^^fž‡©+éª|Òž):R!ù ,'ŒiÀ-ßj.Ê@©33Ûy@ŠPir˜˜©¬‡²±8ÃëÛÔ™Â#!ù ,&ŒiÀ £X®IH+»Y¿Øy`àUY:š6aú–±7kuu;ÊŽ!ù ,#ŒiÀÍãr.ÂI›ÅùÝÐQ_(r$`’i¸vmöR±37Ê!ù ,$ŒiÀÝár4ŠI]ÄùÝÐe_˜q$`’i¸vm žÍKÑŽ‚#!ù ,#ŒiÀíÅrÄYŸ ¹î^a #Ž%xvi¶†ÜØ´”ì(6R!ù ,#ŒiÀí âzTŠÅÄoóæ}@ø‘œ‰¡”Ú]"è¾cü*6R!ù ,"ŒiÀí,ÄzÈPëÌnsæ}!7f¥†}ÍI±Û¥* ÔH!ù , ŒiÀí-Ö›LÒgoËpý]!5N%tι¦jå¾ÊŒ!ù , ŒiÀí¾ždq¾jÎ`go“(‘WÀAhJ­¬©*²Q!þ‹FILE IDENTITY Created or modified by Created by Alchemy Mindworks' GIF Construction Set Professional http://www.mindworkshop.com!þêUNREGISTERED SHAREWARE Assembled with GIF Construction Set: Alchemy Mindworks Inc. Box 500 Beeton, ON L0G 1A0 CANADA. http://www.mindworkshop.com This comment will not appear in files created with a registered version.!ÿ GIFCONtb1.0%C:\FDB\bbtest\purple1.gifC:\FDB\bbtest\purple2.gifC:\FDB\bbtest\purple3.gifC:\FDB\bbtest\purple4.gifC:\FDB\bbtest\purple5.gifC:\FDB\bbtest\purple6.gifC:\FDB\bbtest\purple7.gifC:\FDB\bbtest\purple8.gif C:\FDB\bbtest\purple9.gif C:\FDB\bbtest\purple9a.gif C:\FDB\bbtest\purple9b.gif C:\FDB\bbtest\purple9c.gif C:\FDB\bbtest\purple9d.gifC:\FDB\bbtest\purple9e.gifC:\FDB\bbtest\purple9f.gifC:\FDB\bbtest\purple9g.gifC:\FDB\bbtest\purple9h.gifC:\FDB\bbtest\purple9i.gifC:\FDB\bbtest\purple9j.gifC:\FDB\bbtest\purple9k.gifC:\FDB\bbtest\purple9l.gifC:\FDB\bbtest\purple9m.gifC:\FDB\bbtest\purple9n.gifC:\FDB\bbtest\purple9o.gifC:\FDB\bbtest\purple9p.gifC:\FDB\bbtest\purple9q.gifC:\FDB\bbtest\purple9r.gifC:\FDB\bbtest\purple9u.gifC:\FDB\bbtest\purple9v.gifC:\FDB\bbtest\purple9w.gifC:\FDB\bbtest\purple9x.gif C:\FDB\bbtest\purple9y.gif!C:\FDB\bbtest\purple9z.gif"C:\FDB\bbtest\purple9zz.gif#C:\FDB\bbtest\purple9zzz.gif$C:\FDB\bbtest\purple9zzzz.gif%C:\FDB\bbtest\purple9zzzzz.gif;xymon-4.3.28/xymond/wwwfiles/gifs/red.gif0000664000076400007640000000305311070452713020571 0ustar rpmbuildrpmbuildGIF89aƒ€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿ!ÿ NETSCAPE2.0!ù ,<ÈI«LI†ÍoXÆuáTˆU¥¹N›ú(@†kg×ò·k<¬vêb-¥åñ5m)&m$ó© ‹¶!ù ,;ÈI« 8[ÈZGu^ ™d•N뉊œˆ¹/YΟ)َǰ ˜ÒWEÝ.TÉNMÖ Û€~›ì$!ù ,7ÈI« 8[šõN H#há„r¥ ¬£p,Ž=Ùö»Ê²–Î3sÕ(¿œ µ6·4è™Z#!ù ,:ÈI« 8Û™{ØŽÕ—$Ô)r¦ œ(&i0,Ê÷T³søÚ½^k§Ém¸•K¢òÍž«hÉ“¼x6XK!ù ,8ÈI« 8Û™{Øð‰âÈ…•&¡I"µë¨µ´«¢@}ƓΗŸì6‚å\¥“I™úÈ’.ÚÙX-!ù ,2ÈI« 8Û™{ØR£¨™ØužI› æä¾1J3÷ÙwÎï%Ýí·CH•çXYnž–!ù ,+ÈI« 8Û™{ØžW…!×Q"pŽšÚ&‰´®°Ü®è»-Ob¬ˆ´±íŠÈ!ù ,(ÈI« 8Û™{ØžW…!G–€hjiG©ª»+&Ÿ1ÎÖèHn7p(‰!ù ,$ÈI« 8Û™{ØžW…!G–À‰ªbÊjîûůɎ*HnÊÿ’!ù ,=$@«¥3iºÇ›6yŸX™'m–y²\ê¢)PŠÛg×+ÜÅ/_í†Û e,Z Ö» T®&égrMkÕ‹Vˆ!þ‹FILE IDENTITY Created or modified by Created by Alchemy Mindworks' GIF Construction Set Professional http://www.mindworkshop.com!þêUNREGISTERED SHAREWARE Assembled with GIF Construction Set: Alchemy Mindworks Inc. Box 500 Beeton, ON L0G 1A0 CANADA. http://www.mindworkshop.com This comment will not appear in files created with a registered version.!ÿ GIFCONtb1.0 C:\FDB\bbtest\1a.gifC:\FDB\bbtest\2a.gifC:\FDB\bbtest\3a.gifC:\FDB\bbtest\4a.gifC:\FDB\bbtest\5a.gifC:\FDB\bbtest\6a.gifC:\FDB\bbtest\7a.gifC:\FDB\bbtest\8a.gif C:\FDB\bbtest\9a.gif C:\FDB\bbtest\red.gif;xymon-4.3.28/xymond/wwwfiles/gifs/bkg-blue.gif0000664000076400007640000000104011535462534021511 0ustar rpmbuildrpmbuildGIF89a}Æu     "#$'%()*+-/0134578:;?=>ABDFGIJLNPRTUZX\]`bdfikmq ov t x z |  „ … ˆ ‰ Œ Ž ’— • › ™ Ÿ¤ ¢¨ §«­°´¶º½ÂÆÎÜ û õï'è+â.ßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù ,}}€t‚srqponmlkjihgfedbc`a_^\]Z[YWXVUTSRQPONMKLIJHGFEDCBA@>?=<;:987654321.0/-,+*)('&%$##"!  û;xymon-4.3.28/xymond/wwwfiles/gifs/README0000664000076400007640000000206511070452713020212 0ustar rpmbuildrpmbuildThese GIF's were collected from various GPL- and public-domain archives around the Internet. To the best of my knowledge, all of them can be distributed freely. The source of these files are as follows: arrow.gif: From the "dots" collection on www.deadcat.net. (GPL) bkg-*.gif: From the Big Sister "skins/bigbro13/ collection. (No copyright/author notice, assumed public domain) green.gif: From the Big Sister "skins/bigbro13/ collection. (No copyright/author notice, assumed public domain) red,yellow,blue,purple,clear: From the deadcat "animated-bb-icons" collection (GPL) {red,yellow,purple,blue}-ack.gif: From the deadcat altset02 "green.gif" modified with colors. (GPL) {red,yellow,purple,green,blue,clear}-recent.gif: From the deadcat "smile" set. (GPL) unknown.gif, unknown-recent.gif: From http://www.brindilles.net/lune/themes/default/smilies/question.png zoom.gif: From Cacti 0.8.6c favicon*.gif: By "Paul D. Backer" 21. apr.2005, based on the *-recent.gif files. Henrik Storner 2005-01-04 - 2005-02-24 - 2005-04-24 xymon-4.3.28/xymond/xymond_sample.80000664000076400007640000000152413037531444017506 0ustar rpmbuildrpmbuild.TH XYMOND_SAMPLE 8 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME xymond_sample \- example of a xymond worker module .SH SYNOPSIS .B "xymond_channel --channel=status xymond_sample [options]" .SH DESCRIPTION xymond_sample is a worker module for xymond, and as such it is normally run via the .I xymond_channel(8) program. It receives messages from xymond via stdin, and simply displays these on stdout. It can be used with all types of xymond channels. xymond_sample is not designed to actually run, except as a demonstration. The purpose of this tool is to show how xymond worker modules can be implemented to handle different tasks that need to hook into the xymond processing. .SH OPTIONS .IP "--timeout=N" Read messages with a timeout of N seconds. .IP "--debug" Enable debugging output. .SH "SEE ALSO" xymond_channel(8), xymond(8), xymon(7) xymon-4.3.28/xymond/xymond_alert.80000664000076400007640000001216013037531444017332 0ustar rpmbuildrpmbuild.TH XYMOND_ALERT 8 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME xymond_alert \- xymond worker module for sending out alerts .SH SYNOPSIS .B "xymond_channel \-\-channel=page xymond_alert [options]" .SH DESCRIPTION xymond_alert is a worker module for xymond, and as such it is normally run via the .I xymond_channel(8) program. It receives xymond page- and ack-messages from the "page" channel via stdin, and uses these to send out alerts about failed and recovered hosts and services. The operation of this module is controlled by the .I alerts.cfg(5) file. This file holds the definition of rules and recipients, that determine who gets alerts, how often, for what servers etc. .SH OPTIONS .IP "\-\-config=FILENAME" Sets the filename for the .I alerts.cfg file. The default value is "etc/alerts.cfg" below the Xymon server directory. .IP "\-\-dump\-config" Dumps the configuration after parsing it. May be useful to track down problems with configuration file errors. .IP "\-\-checkpoint\-file=FILENAME" File where the current state of the xymond_alert module is saved. When starting up, xymond_alert will also read this file to restore the previous state. .IP "\-\-checkpoint\-interval=N" Defines how often (in seconds) the checkpoint-file is saved. .IP "\-\-cfid" If this option is present, alert messages will include a line with "cfid:N" where N is the linenumber in the alerts.cfg file that caused this message to be sent. This can be useful to track down problems with duplicate alerts. .IP "\-\-test HOST SERVICE [options] Shows which alert rules matches the given HOST/SERVICE combination. Useful to debug configuration problems, and see what rules are used for an alert. The possible options are: .br .BI "\-\-color=COLORNAME" The COLORNAME parameter is the color of the alert: red, yellow or purple. .br .BI "\-\-duration=MINUTES" The MINUTES parameter is the duration of the alert in minutes. .br .BI "\-\-group=GROUPNAME" The GROUPNAME parameter is a groupid string from the analysis.cfg file. .br .BI "\-\-time=TIMESTRING" The TIMESTRING parameter is the time-of-day for the alert, expressed as an absolute time in the epoch format (seconds since Jan 1 1970). This is easily obtained with the GNU date utility using the "+%s" output format. .IP "\-\-trace=FILENAME" Send trace output to FILENAME, This allows for more detailed analysis of how alerts trigger, without having the full debugging enabled. .IP "\-\-debug" Enable debugging output. .SH HOW XYMON DECIDES WHEN TO SEND ALERTS The xymond_alert module is responsible for sending out all alerts. When a status first goes to one of the ALERTCOLORS, xymond_alert is notified of this change. It notes that the status is now in an alert state, and records the \fBtimestamp\fR when this event started, and adds the alert to the list statuses that may potentially trigger one or more alert messages. This list is then matched against the alerts.cfg configuration. This happens at least once a minute, but may happen more often. E.g. when status first goes into an alert state, this will always trigger the matching to happen. When scanning the configuration, xymond_alert looks at all of the configuration rules. It also checks the DURATION setting against how long time has elapsed since the event started - i.e. against the timestamp logged when xymond_alert first heard of this event. When an alert recipient is found, the alert is sent and it is recorded when this recipient is due for his next alert message, based on the REPEAT setting defined for this recipient. The next time xymond_alert scans the configuration for what alerts to send, it will still find this recipient because all of the configuration rules are fulfilled, but an alert message will not be generated until the repeat interval has elapsed. It can happen that a status first goes yellow and triggers an alert, and later it goes red - e.g. a disk filling up. In that case, xymond_alert clears the internal timer for when the next (repeat) alert is due for all recipients. You generally want to be told when something that has been in a warning state becomes critical, so in that case the REPEAT setting is ignored and the alert is sent. This only happens the first time such a change occurs - if the status switches between yellow and red multiple times, only the first transition from yellow->red causes this override. When an status recovers, a recovery message may be sent - depending on the configuration - and then xymond_alert forgets everything about this status. So the next time it goes into an alert state, the entire process starts all over again. .SH ENVIRONMENT .IP MAIL The first part of a command line used to send out an e-mail with a subject, typically set to "/usr/bin/mail \-s" . xymond_alert will add the subject and the mail recipients to form the command line used for sending out email alerts. .IP MAILC The first part of a command line used to send out an e-mail without a subject. Typically this will be "/usr/bin/mail". xymond_alert will add the mail recipients to form the command line used for sending out email alerts. .SH FILES .IP "~xymon/server/etc/alerts.cfg" .SH "SEE ALSO" alerts.cfg(5), xymond(8), xymond_channel(8), xymon(7) xymon-4.3.28/xymond/trimhistory.80000664000076400007640000000612113037531444017222 0ustar rpmbuildrpmbuild.TH TRIMHISTORY 8 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME trimhistory \- Remove old Xymon history-log entries .SH SYNOPSIS .B "trimhistory \-\-cutoff=TIME [options]" .SH DESCRIPTION The \fBtrimhistory\fR tool is used to purge old entries from the Xymon history logs. These logfiles accumulate information about all status changes that have occurred for any given service, host, or the entire Xymon system, and is used to generate the event- and history-log webpages. Purging old entries can be done while Xymon is running, since the tool takes care not to commit updates to a file if it changes mid-way through the operation. In that case, the update is aborted and the existing logfile is left untouched. Optionally, this tool will also remove logfiles from hosts that are no longer defined in the Xymon .I hosts.cfg(5) file. As an extension, even logfiles from services can be removed, if the service no longer has a valid status-report logged in the current Xymon status. .SH OPTIONS .IP "\-\-cutoff=TIME" This defines the cutoff-time when processing the history logs. Entries dated before this time are discarded. TIME is specified as the number of seconds since the beginning of the Epoch. This is easily generated by the GNU .I date(1) utility, e.g. the following command will trim history logs of all entries prior to Oct. 1st 2004: .br .sp trimhistory \-\-cutoff=`date +%s \-\-date="1 Oct 2004"` .IP "\-\-outdir=DIRECTORY" Normally, files in the XYMONHISTDIR directory are replaced. This option causes trimhistory to save the shortened history logfiles to another directory, so you can verify that the operation works as intended. The output directory must exist. .IP \-\-drop Causes trimhistory to delete files from hosts that are not listed in the .I hosts.cfg(5) file. .IP \-\-dropsvcs Causes trimhistory to delete files from services that are not currently tracked by Xymon. Normally these files would be left untouched if only the host exists. .IP \-\-droplogs Process the XYMONHISTLOGS directory also, and delete status-logs from events prior to the cut-off time. Note that this can dramatically increase the processing time, since there are often lots and lots of files to process. .IP "\-\-progress[=N]" This will cause trimhistory to output a status line for every N history logs or status-log collections it processes, to indicate how far it has progressed. The default setting for N is 100. .IP "\-\-env=FILENAME" Loads the environment from FILENAME before executing trimhistory. .IP \-\-debug Enable debugging output. .SH FILES .IP "$XYMONHISTDIR/allevents" The eventlog of all events that have happened in Xymon. .IP "$XYMONHISTDIR/HOSTNAME" The per-host eventlogs. .IP "$XYMONHISTDIR/HOSTNAME.SERVICE" The per-service eventlogs. .IP "$XYMONHISTLOGS/*/*" The historical status-logs. .SH "ENVIRONMENT VARIABLES" .IP XYMONHISTDIR The directory holding all history logs. .IP XYMONHISTLOGS The top-level directory for the historical status-log collections. .IP HOSTSCFG The location of the hosts.cfg file, holding the list of currently known hosts in Xymon. .SH "SEE ALSO" xymon(7), hosts.cfg(5) xymon-4.3.28/xymond/do_alert.h0000664000076400007640000000234111615341300016464 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __DO_ALERT_H__ #define __DO_ALERT_H__ #include #include extern int include_configid; extern int testonly; extern time_t next_alert(activealerts_t *alert); extern void cleanup_alert(activealerts_t *alert); extern void clear_interval(activealerts_t *alert); extern void start_alerts(void); extern void send_alert(activealerts_t *alert, FILE *logfd); extern void finish_alerts(void); extern void load_state(char *filename, char *statusbuf); extern void save_state(char *filename); #endif xymon-4.3.28/xymond/do_alert.c0000664000076400007640000006120613033575046016500 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* This is part of the xymond_alert worker module. */ /* This module implements the standard xymond alerting function. It loads */ /* the alert configuration from alerts.cfg, and incoming alerts are */ /* then sent according to the rules defined. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: do_alert.c 7999 2017-01-06 02:00:06Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" /* * This is the dynamic info stored to keep track of active alerts. We * need to keep track of when the next alert is due for each recipient, * and this goes on a host+test+recipient basis. */ typedef struct repeat_t { char *recipid; /* Essentially hostname|testname|method|address */ time_t nextalert; struct repeat_t *next; } repeat_t; static repeat_t *rpthead = NULL; int include_configid = 0; /* Whether to include the configuration file linenumber in alerts */ int testonly = 0; /* Test mode, don't actually send out alerts */ int max_alertmsg_scripts = 0; /* Max message size to pass to SCRIPT via env variable */ /* * This generates a unique ID for an event. * The ID is an MD5 hash of the hostname, testname and the * event start-time. */ static char *make_alertid(char *hostname, char *testname, time_t eventstart) { static char result[33]; unsigned char id[16]; char *key; void *md5handle; int i, j; key = (char *)malloc(strlen(hostname)+strlen(testname)+15); sprintf(key, "%s|%s|%d", hostname, testname, (int)eventstart); md5handle = (void *)malloc(myMD5_Size()); myMD5_Init(md5handle); myMD5_Update(md5handle, key, strlen(key)); myMD5_Final(id, md5handle); for (i=0, j=0; (i < 16); i++, j+=2) sprintf(result+j, "%02x", id[i]); result[32] = '\0'; return result; } static int servicecode(char *testname) { /* * The SVCCODES environment is a list of servicecodes: * SVCCODES="disk:100,cpu:200,procs:300,msgs:400,conn:500,http:600,dns:800,smtp:725,telnet:721" * This routine returns the number associated with the service. */ static char *svccodes = NULL; char *tname; char *p; if (svccodes == NULL) { p = xgetenv("SVCCODES"); if (p == NULL) p = "none"; svccodes = (char *)malloc(strlen(p)+2); sprintf(svccodes, ",%s", p); } tname = (char *)malloc(strlen(testname)+3); sprintf(tname, ",%s:", testname); p = strstr(svccodes, tname); xfree(tname); if (p) { p = strchr(p, ':'); return atoi(p+1); } return 0; } void start_alerts(void) { /* No special pre-alert setup needed */ return; } static repeat_t *find_repeatinfo(activealerts_t *alert, recip_t *recip, int create) { char *id, *method = "unknown"; repeat_t *walk; if (recip->method == M_IGNORE) return NULL; switch (recip->method) { case M_MAIL: method = "mail"; break; case M_SCRIPT: method = "script"; break; case M_IGNORE: method = "ignore"; break; } id = (char *) malloc(strlen(alert->hostname) + strlen(alert->testname) + strlen(method) + strlen(recip->recipient) + 4); sprintf(id, "%s|%s|%s|%s", alert->hostname, alert->testname, method, recip->recipient); for (walk = rpthead; (walk && strcmp(walk->recipid, id)); walk = walk->next); if ((walk == NULL) && create) { walk = (repeat_t *)malloc(sizeof(repeat_t)); walk->recipid = id; walk->nextalert = 0; walk->next = rpthead; rpthead = walk; } else xfree(id); return walk; } static char *message_recipient(char *reciptext, char *hostname, char *svcname, char *colorname) { static char *result = NULL; char *inpos, *p; if (result) xfree(result); result = (char *)malloc(strlen(reciptext) + strlen(hostname) + strlen(svcname) + strlen(colorname) + 1); *result = '\0'; inpos = reciptext; do { p = strchr(inpos, '&'); if (p) { *p = '\0'; strcat(result, inpos); *p = '&'; p++; if (strncasecmp(p, "HOST&", 5) == 0) { strcat(result, hostname); inpos = p + 5; } else if (strncasecmp(p, "SERVICE&", 8) == 0) { strcat(result, svcname); inpos = p + 8; } else if (strncasecmp(p, "COLOR&", 6) == 0) { strcat(result, colorname); inpos = p + 6; } else { strcat(result, "&"); inpos = p; } } else { strcat(result, inpos); inpos = NULL; } } while (inpos && *inpos); return result; } static char *message_subject(activealerts_t *alert, recip_t *recip) { static char subj[250]; static char *sevtxt[COL_COUNT] = { "is GREEN", "has no data (CLEAR)", "is disabled (BLUE)", "stopped reporting (PURPLE)", "warning (YELLOW)", "CRITICAL (RED)" }; char *sev = ""; char *subjfmt = NULL; /* Only subjects on ALERTFORM_TEXT and ALERTFORM_PLAIN messages */ if ((recip->format != ALERTFORM_TEXT) && (recip->format != ALERTFORM_PLAIN)) return NULL; MEMDEFINE(subj); if ((alert->color >= 0) && (alert->color < COL_COUNT)) sev = sevtxt[alert->color]; switch (alert->state) { case A_PAGING: case A_ACKED: subjfmt = (include_configid ? "Xymon [%d] %s:%s %s [cfid:%d]" : "Xymon [%d] %s:%s %s"); snprintf(subj, sizeof(subj), subjfmt, alert->cookie, alert->hostname, alert->testname, sev, recip->cfid); break; case A_NOTIFY: subjfmt = (include_configid ? "Xymon %s:%s NOTICE [cfid:%d]" : "Xymon %s:%s NOTICE"); snprintf(subj, sizeof(subj), subjfmt, alert->hostname, alert->testname, recip->cfid); break; case A_RECOVERED: subjfmt = (include_configid ? "Xymon %s:%s recovered [cfid:%d]" : "Xymon %s:%s recovered"); snprintf(subj, sizeof(subj), subjfmt, alert->hostname, alert->testname, recip->cfid); break; case A_DISABLED: subjfmt = (include_configid ? "Xymon %s:%s disabled [cfid:%d]" : "Xymon %s:%s disabled"); snprintf(subj, sizeof(subj), subjfmt, alert->hostname, alert->testname, recip->cfid); break; case A_NORECIP: case A_DEAD: /* Cannot happen */ break; } *(subj + sizeof(subj) - 1) = '\0'; MEMUNDEFINE(subj); return subj; } static char *message_text(activealerts_t *alert, recip_t *recip) { static strbuffer_t *buf = NULL; char *eoln, *bom, *p; char info[4096]; MEMDEFINE(info); if (!buf) buf = newstrbuffer(0); else clearstrbuffer(buf); if (alert->state == A_NOTIFY) { sprintf(info, "%s:%s INFO\n", alert->hostname, alert->testname); addtobuffer(buf, info); addtobuffer(buf, alert->pagemessage); MEMUNDEFINE(info); return STRBUF(buf); } switch (recip->format) { case ALERTFORM_TEXT: case ALERTFORM_PLAIN: bom = msg_data(alert->pagemessage, 1); eoln = strchr(bom, '\n'); if (eoln) *eoln = '\0'; /* If there's a "<-- flags:.... -->" then remove it from the message */ if ((p = strstr(bom, ""); if (p) addtobuffer(buf, p+3); /* And if there is more than line 1, add it as well */ if (eoln) { *eoln = '\n'; addtobuffer(buf, eoln); } } else { if (eoln) *eoln = '\n'; addtobuffer(buf, bom); } addtobuffer(buf, "\n"); if (recip->format == ALERTFORM_TEXT) { sprintf(info, "See %s%s\n", xgetenv("XYMONWEBHOST"), hostsvcurl(alert->hostname, alert->testname, 0)); addtobuffer(buf, info); } MEMUNDEFINE(info); return STRBUF(buf); case ALERTFORM_SMS: /* * Send a report containing a brief alert * and any lines that begin with a "&COLOR" */ switch (alert->state) { case A_PAGING: case A_ACKED: sprintf(info, "%s:%s %s [%d]", alert->hostname, alert->testname, colorname(alert->color), alert->cookie); break; case A_RECOVERED: sprintf(info, "%s:%s RECOVERED", alert->hostname, alert->testname); break; case A_DISABLED: sprintf(info, "%s:%s DISABLED", alert->hostname, alert->testname); break; case A_NOTIFY: sprintf(info, "%s:%s NOTICE", alert->hostname, alert->testname); break; case A_NORECIP: case A_DEAD: break; } addtobuffer(buf, info); bom = msg_data(alert->pagemessage, 1); eoln = strchr(bom, '\n'); if (eoln) { bom = eoln; while ((bom = strstr(bom, "\n&")) != NULL) { eoln = strchr(bom+1, '\n'); if (eoln) *eoln = '\0'; if ((strncmp(bom+1, "&red", 4) == 0) || (strncmp(bom+1, "&yellow", 7) == 0)) addtobuffer(buf, bom); if (eoln) *eoln = '\n'; bom = (eoln ? eoln+1 : ""); } } MEMUNDEFINE(info); return STRBUF(buf); case ALERTFORM_SCRIPT: sprintf(info, "%s:%s %s [%d]\n", alert->hostname, alert->testname, colorname(alert->color), alert->cookie); addtobuffer(buf, info); addtobuffer(buf, msg_data(alert->pagemessage, 0)); addtobuffer(buf, "\n"); sprintf(info, "See %s%s\n", xgetenv("XYMONWEBHOST"), hostsvcurl(alert->hostname, alert->testname, 0)); addtobuffer(buf, info); MEMUNDEFINE(info); return STRBUF(buf); case ALERTFORM_PAGER: case ALERTFORM_NONE: MEMUNDEFINE(info); return ""; } MEMUNDEFINE(info); return alert->pagemessage; } void send_alert(activealerts_t *alert, FILE *logfd) { recip_t *recip; static char *bbalphamsg; int first = 1; int alertcount = 0; time_t now = getcurrenttime(NULL); /* A_PAGING, A_NORECIP, A_ACKED, A_RECOVERED, A_DISABLED, A_NOTIFY, A_DEAD */ char *alerttxt[A_DEAD+1] = { "Paging", "Norecip", "Acked", "Recovered", "Disabled", "Notify", "Dead" }; dbgprintf("send_alert %s:%s state %d\n", alert->hostname, alert->testname, (int)alert->state); traceprintf("send_alert %s:%s state %s\n", alert->hostname, alert->testname, alerttxt[alert->state]); if (bbalphamsg == NULL) { int len; len = strlen("BBALPHAMSG="); max_alertmsg_scripts = atoi(xgetenv("MAXMSG_ALERTSCRIPT")) + len; bbalphamsg = (char *)calloc(1, max_alertmsg_scripts + 1); } stoprulefound = 0; while (!stoprulefound && ((recip = next_recipient(alert, &first, NULL, NULL)) != NULL)) { /* If this is an "UNMATCHED" rule, ignore it if we have already sent out some alert */ if (recip->unmatchedonly && (alertcount != 0)) { traceprintf("Recipient '%s' dropped, not unmatched (count=%d)\n", recip->recipient, alertcount); continue; } if (recip->noalerts && ((alert->state == A_PAGING) || (alert->state == A_RECOVERED) || (alert->state == A_DISABLED))) { traceprintf("Recipient '%s' dropped (NOALERT)\n", recip->recipient); continue; } if (recip->method == M_IGNORE) { traceprintf("IGNORE rule found\n"); continue; } if (alert->state == A_PAGING) { repeat_t *rpt = NULL; /* * This runs in a child-process context, so the record we * might create here is NOT used later on. */ rpt = find_repeatinfo(alert, recip, 1); if (!rpt) continue; /* Happens for e.g. M_IGNORE recipients */ /* * Update alertcount here, because we don't want to hit an UNMATCHED * rule when there is actually an alert active - it is just suppressed * for this run due to the REPEAT setting. */ alertcount++; dbgprintf(" repeat %s at %d\n", rpt->recipid, rpt->nextalert); if (rpt->nextalert > now) { traceprintf("Recipient '%s' dropped, next alert due at %ld > %ld\n", rpt->recipid, (long)rpt->nextalert, (long)now); continue; } } else if ((alert->state == A_RECOVERED) || (alert->state == A_DISABLED)) { /* RECOVERED messages require that we've sent out an alert before */ repeat_t *rpt = NULL; rpt = find_repeatinfo(alert, recip, 0); if (!rpt) continue; alertcount++; } dbgprintf(" Alert for %s:%s to %s\n", alert->hostname, alert->testname, recip->recipient); switch (recip->method) { case M_IGNORE: break; case M_MAIL: { char cmd[32768]; char *mailsubj; char *mailrecip; FILE *mailpipe; MEMDEFINE(cmd); mailsubj = message_subject(alert, recip); mailrecip = message_recipient(recip->recipient, alert->hostname, alert->testname, colorname(alert->color)); if (mailsubj) { if (xgetenv("MAIL")) sprintf(cmd, "%s \"%s\" ", xgetenv("MAIL"), mailsubj); else if (xgetenv("MAILC")) sprintf(cmd, "%s -s \"%s\" ", xgetenv("MAILC"), mailsubj); else sprintf(cmd, "mail -s \"%s\" ", mailsubj); } else { if (xgetenv("MAILC")) sprintf(cmd, "%s ", xgetenv("MAILC")); else sprintf(cmd, "mail "); } strcat(cmd, mailrecip); traceprintf("Mail alert with command '%s'\n", cmd); if (testonly) { MEMUNDEFINE(cmd); break; } mailpipe = popen(cmd, "w"); if (mailpipe) { fprintf(mailpipe, "%s", message_text(alert, recip)); pclose(mailpipe); if (logfd) { init_timestamp(); fprintf(logfd, "%s %s.%s (%s) %s[%d] %ld %d", timestamp, alert->hostname, alert->testname, alert->ip, mailrecip, recip->cfid, (long)now, servicecode(alert->testname)); if ((alert->state == A_RECOVERED) || (alert->state == A_DISABLED)) { fprintf(logfd, " %ld\n", (long)(now - alert->eventstart)); } else { fprintf(logfd, "\n"); } fflush(logfd); } } else { errprintf("ERROR: Cannot open command pipe for '%s' - alert lost!\n", cmd); traceprintf("Mail pipe failed - alert lost\n"); } MEMUNDEFINE(cmd); } break; case M_SCRIPT: { pid_t scriptpid; char *scriptrecip; traceprintf("Script alert with command '%s' and recipient %s\n", recip->scriptname, recip->recipient); if (testonly) break; scriptrecip = message_recipient(recip->recipient, alert->hostname, alert->testname, colorname(alert->color)); scriptpid = fork(); if (scriptpid == 0) { /* Setup all of the environment for a paging script */ void *hinfo; char *p; int ip1=0, ip2=0, ip3=0, ip4=0; char *ackcode, *rcpt, *bbhostname, *bbhostsvc, *bbhostsvccommas, *bbnumeric, *machip, *bbsvcname, *bbsvcnum, *bbcolorlevel, *recovered, *downsecs, *eventtstamp, *downsecsmsg, *cfidtxt; char *alertid, *alertidenv; int msglen; cfidtxt = (char *)malloc(strlen("CFID=") + 10); sprintf(cfidtxt, "CFID=%d", recip->cfid); putenv(cfidtxt); p = message_text(alert, recip); if (debug) { msglen = strlen(p); if (msglen > (max_alertmsg_scripts - strlen("BBALPHAMSG="))) { errprintf("Truncated large alert message from %d bytes; consider increasing MAXMSG_ALERTSCRIPT above %d\n", msglen, atoi(xgetenv("MAXMSG_ALERTSCRIPT"))); } } snprintf(bbalphamsg, max_alertmsg_scripts, "BBALPHAMSG=%s", p); putenv(bbalphamsg); ackcode = (char *)malloc(strlen("ACKCODE=") + 10); sprintf(ackcode, "ACKCODE=%d", alert->cookie); putenv(ackcode); rcpt = (char *)malloc(strlen("RCPT=") + strlen(scriptrecip) + 1); sprintf(rcpt, "RCPT=%s", scriptrecip); putenv(rcpt); bbhostname = (char *)malloc(strlen("BBHOSTNAME=") + strlen(alert->hostname) + 1); sprintf(bbhostname, "BBHOSTNAME=%s", alert->hostname); putenv(bbhostname); bbhostsvc = (char *)malloc(strlen("BBHOSTSVC=") + strlen(alert->hostname) + 1 + strlen(alert->testname) + 1); sprintf(bbhostsvc, "BBHOSTSVC=%s.%s", alert->hostname, alert->testname); putenv(bbhostsvc); bbhostsvccommas = (char *)malloc(strlen("BBHOSTSVCCOMMAS=") + strlen(alert->hostname) + 1 + strlen(alert->testname) + 1); sprintf(bbhostsvccommas, "BBHOSTSVCCOMMAS=%s.%s", commafy(alert->hostname), alert->testname); putenv(bbhostsvccommas); bbnumeric = (char *)malloc(strlen("BBNUMERIC=") + 22 + 1); p = bbnumeric; p += sprintf(p, "BBNUMERIC="); p += sprintf(p, "%03d", servicecode(alert->testname)); sscanf(alert->ip, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4); p += sprintf(p, "%03d%03d%03d%03d", ip1, ip2, ip3, ip4); p += sprintf(p, "%d", alert->cookie); putenv(bbnumeric); machip = (char *)malloc(strlen("MACHIP=") + 13); sprintf(machip, "MACHIP=%03d%03d%03d%03d", ip1, ip2, ip3, ip4); putenv(machip); bbsvcname = (char *)malloc(strlen("BBSVCNAME=") + strlen(alert->testname) + 1); sprintf(bbsvcname, "BBSVCNAME=%s", alert->testname); putenv(bbsvcname); bbsvcnum = (char *)malloc(strlen("BBSVCNUM=") + 10); sprintf(bbsvcnum, "BBSVCNUM=%d", servicecode(alert->testname)); putenv(bbsvcnum); bbcolorlevel = (char *)malloc(strlen("BBCOLORLEVEL=") + strlen(colorname(alert->color)) + 1); sprintf(bbcolorlevel, "BBCOLORLEVEL=%s", colorname(alert->color)); putenv(bbcolorlevel); recovered = (char *)malloc(strlen("RECOVERED=") + 2); switch (alert->state) { case A_RECOVERED: strcpy(recovered, "RECOVERED=1"); break; case A_DISABLED: strcpy(recovered, "RECOVERED=2"); break; default: strcpy(recovered, "RECOVERED=0"); break; } putenv(recovered); downsecs = (char *)malloc(strlen("DOWNSECS=") + 20); sprintf(downsecs, "DOWNSECS=%ld", (long)(getcurrenttime(NULL) - alert->eventstart)); putenv(downsecs); eventtstamp = (char *)malloc(strlen("EVENTSTART=") + 20); sprintf(eventtstamp, "EVENTSTART=%ld", (long)alert->eventstart); putenv(eventtstamp); if ((alert->state == A_RECOVERED) || (alert->state == A_DISABLED)) { downsecsmsg = (char *)malloc(strlen("DOWNSECSMSG=Event duration :") + 20); sprintf(downsecsmsg, "DOWNSECSMSG=Event duration : %ld", (long)(getcurrenttime(NULL) - alert->eventstart)); } else { downsecsmsg = strdup("DOWNSECSMSG="); } putenv(downsecsmsg); alertid = make_alertid(alert->hostname, alert->testname, alert->eventstart); alertidenv = (char *)malloc(strlen("ALERTID=") + strlen(alertid) + 10); sprintf(alertidenv, "ALERTID=%s", alertid); putenv(alertidenv); hinfo = hostinfo(alert->hostname); if (hinfo) { enum xmh_item_t walk; char *itm, *id, *bbhenv; for (walk = 0; (walk < XMH_LAST); walk++) { itm = xmh_item(hinfo, walk); id = xmh_item_id(walk); if (itm && id) { bbhenv = (char *)malloc(strlen(id) + strlen(itm) + 2); sprintf(bbhenv, "%s=%s", id, itm); putenv(bbhenv); } } } /* The child starts the script */ execlp(recip->scriptname, recip->scriptname, NULL); errprintf("Could not launch paging script %s: %s\n", recip->scriptname, strerror(errno)); exit(0); } else if (scriptpid > 0) { /* Parent waits for child to complete */ int childstat; wait(&childstat); if (WIFEXITED(childstat) && (WEXITSTATUS(childstat) != 0)) { errprintf("Paging script %s terminated with status %d\n", recip->scriptname, WEXITSTATUS(childstat)); } else if (WIFSIGNALED(childstat)) { errprintf("Paging script %s terminated by signal %d\n", recip->scriptname, WTERMSIG(childstat)); } if (logfd) { init_timestamp(); fprintf(logfd, "%s %s.%s (%s) %s %ld %d", timestamp, alert->hostname, alert->testname, alert->ip, scriptrecip, (long)now, servicecode(alert->testname)); if ((alert->state == A_RECOVERED) || (alert->state == A_DISABLED)) { fprintf(logfd, " %ld\n", (long)(now - alert->eventstart)); } else { fprintf(logfd, "\n"); } fflush(logfd); } } else { errprintf("ERROR: Fork failed to launch script '%s' - alert lost\n", recip->scriptname); traceprintf("Script fork failed - alert lost\n"); } } break; } } } void finish_alerts(void) { /* No special post-alert setup needed */ return; } time_t next_alert(activealerts_t *alert) { time_t now = getcurrenttime(NULL); int first = 1; int found = 0; time_t nexttime = now+(30*86400); /* 30 days from now */ recip_t *recip; repeat_t *rpt; time_t r_next = -1; void *hinfo = hostinfo(alert->hostname); stoprulefound = 0; while (!stoprulefound && ((recip = next_recipient(alert, &first, NULL, &r_next)) != NULL)) { found = 1; if (recip->criteria && recip->criteria->timespec && !timematch(xmh_item(hinfo, XMH_HOLIDAYS), recip->criteria->timespec)) { /* Recipient not active due to time-restrictions. */ if ((r_next != -1) && (r_next < nexttime)) nexttime = r_next; } else { /* * This runs in the parent xymond_alert process, so we must create * a repeat-record here - or all alerts will get repeated every minute. * * NB: Even though we say "create", find_repeatinfo() will return NULL * for ignored alerts. */ rpt = find_repeatinfo(alert, recip, 1); if (rpt) { if (rpt->nextalert <= now) rpt->nextalert = (now + recip->interval); if (rpt->nextalert < nexttime) nexttime = rpt->nextalert; } else if (r_next != -1) { if (r_next < nexttime) nexttime = r_next; } else { /* * This can happen, e.g. if we get an alert, but the minimum * DURATION has not been met. * This simply means we dropped the alert -for now - for some * reason, so it should be retried again right away. Put in a * 1 minute delay to prevent run-away alerts from flooding us. */ if ((now + 60) < nexttime) nexttime = now + 60; } } } if (r_next != -1) { /* * Waiting for a minimum duration to trigger */ if (r_next < nexttime) nexttime = r_next; } else if (!found) { /* * There IS a potential recipient (or we would not be here). * And it's not a DURATION waiting to happen. * Probably waiting for a TIME restriction to trigger, so try * again soon. */ nexttime = now + 60; } return nexttime; } void cleanup_alert(activealerts_t *alert) { /* * A status has recovered and gone green, or it has been deleted. * So we clear out all info we have about this alert and it's recipients. */ char *id; repeat_t *rptwalk, *rptprev; dbgprintf("cleanup_alert called for host %s, test %s\n", alert->hostname, alert->testname); id = (char *)malloc(strlen(alert->hostname)+strlen(alert->testname)+3); sprintf(id, "%s|%s|", alert->hostname, alert->testname); rptwalk = rpthead; rptprev = NULL; while (rptwalk) { if (strncmp(rptwalk->recipid, id, strlen(id)) == 0) { repeat_t *tmp = rptwalk; dbgprintf("cleanup_alert found recipient %s\n", rptwalk->recipid); if (rptwalk == rpthead) { rptwalk = rpthead = rpthead->next; } else { if (rptprev) rptprev->next = rptwalk->next; rptwalk = rptwalk->next; } xfree(tmp->recipid); xfree(tmp); } else { rptprev = rptwalk; rptwalk = rptwalk->next; } } xfree(id); } void clear_interval(activealerts_t *alert) { int first = 1; recip_t *recip; repeat_t *rpt; alert->nextalerttime = 0; stoprulefound = 0; while (!stoprulefound && ((recip = next_recipient(alert, &first, NULL, NULL)) != NULL)) { rpt = find_repeatinfo(alert, recip, 0); if (rpt) { dbgprintf("Cleared repeat interval for %s\n", rpt->recipid); rpt->nextalert = 0; } } } void save_state(char *filename) { FILE *fd = fopen(filename, "w"); repeat_t *walk; if (fd == NULL) return; for (walk = rpthead; (walk); walk = walk->next) { fprintf(fd, "%ld|%s\n", (long) walk->nextalert, walk->recipid); } fclose(fd); } void load_state(char *filename, char *statusbuf) { FILE *fd = fopen(filename, "r"); strbuffer_t *inbuf; char *p; if (fd == NULL) return; initfgets(fd); inbuf = newstrbuffer(0); while (unlimfgets(inbuf, fd)) { sanitize_input(inbuf, 0, 0); p = strchr(STRBUF(inbuf), '|'); if (p) { repeat_t *newrpt; *p = '\0'; if (atoi(STRBUF(inbuf)) > getcurrenttime(NULL)) { char *found = NULL; if (statusbuf) { char *htend; /* statusbuf contains lines with "HOSTNAME|TESTNAME|COLOR" */ htend = strchr(p+1, '|'); if (htend) htend = strchr(htend+1, '|'); if (htend) { *htend = '\0'; *p = '\n'; found = strstr(statusbuf, p); if (!found && (strncmp(statusbuf, p+1, strlen(p+1)) == 0)) found = statusbuf; *htend = '|'; } } if (!found) continue; newrpt = (repeat_t *)malloc(sizeof(repeat_t)); newrpt->recipid = strdup(p+1); newrpt->nextalert = atoi(STRBUF(inbuf)); newrpt->next = rpthead; rpthead = newrpt; } } } fclose(fd); freestrbuffer(inbuf); } xymon-4.3.28/xymond/xymon-mailack.c0000664000076400007640000001376612603243142017457 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon mail-acknowledgment filter. */ /* */ /* This program runs from the Xymon users' .procmailrc file, and processes */ /* incoming e-mails that are responses to alert mails that Xymon has sent */ /* out. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: xymon-mailack.c 7678 2015-10-01 14:42:42Z jccleaver $"; #include #include #include #include #include "libxymon.h" int main(int argc, char *argv[]) { strbuffer_t *inbuf; char *ackbuf; char *subjectline = NULL; char *returnpathline = NULL; char *fromline = NULL; char *firsttxtline = NULL; int inheaders = 1; char *p; pcre *subjexp; const char *errmsg; int errofs, result; int ovector[30]; char cookie[10]; int duration = 0; int argi; char *envarea = NULL; for (argi=1; (argi < argc); argi++) { if (strcmp(argv[argi], "--debug") == 0) { debug = 1; } else if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } } initfgets(stdin); inbuf = newstrbuffer(0); while (unlimfgets(inbuf, stdin)) { sanitize_input(inbuf, 0, 0); if (!inheaders) { /* We're in the message body. Look for a "delay=N" line here. */ if ((strncasecmp(STRBUF(inbuf), "delay=", 6) == 0) || (strncasecmp(STRBUF(inbuf), "delay ", 6) == 0)) { duration = durationvalue(STRBUF(inbuf)+6); continue; } else if ((strncasecmp(STRBUF(inbuf), "ack=", 4) == 0) || (strncasecmp(STRBUF(inbuf), "ack ", 4) == 0)) { /* Some systems cannot generate a subject. Allow them to ack * via text in the message body. */ subjectline = (char *)malloc(STRBUFLEN(inbuf) + 1024); sprintf(subjectline, "Subject: Xymon [%s]", STRBUF(inbuf)+4); } else if (*STRBUF(inbuf) && !firsttxtline) { /* Save the first line of the message body, but ignore blank lines */ firsttxtline = strdup(STRBUF(inbuf)); } continue; /* We don't care about the rest of the message body */ } /* See if we're at the end of the mail headers */ if (inheaders && (STRBUFLEN(inbuf) == 0)) { inheaders = 0; continue; } /* Is it one of those we want to keep ? */ if (strncasecmp(STRBUF(inbuf), "return-path:", 12) == 0) returnpathline = strdup(skipwhitespace(STRBUF(inbuf)+12)); else if (strncasecmp(STRBUF(inbuf), "from:", 5) == 0) fromline = strdup(skipwhitespace(STRBUF(inbuf)+5)); else if (strncasecmp(STRBUF(inbuf), "subject:", 8) == 0) subjectline = strdup(skipwhitespace(STRBUF(inbuf)+8)); } freestrbuffer(inbuf); /* No subject ? No deal */ if (subjectline == NULL) { dbgprintf("Subject-line not found\n"); return 1; } /* Get the alert cookie */ subjexp = pcre_compile(".*(Xymon|Hobbit|BB)[ -]* \\[*(-*[0-9]+)[\\]!]*", PCRE_CASELESS, &errmsg, &errofs, NULL); if (subjexp == NULL) { dbgprintf("pcre compile failed - 1\n"); return 2; } result = pcre_exec(subjexp, NULL, subjectline, strlen(subjectline), 0, 0, ovector, (sizeof(ovector)/sizeof(int))); if (result < 0) { dbgprintf("Subject line did not match pattern\n"); return 3; /* Subject did not match what we expected */ } if (pcre_copy_substring(subjectline, ovector, result, 2, cookie, sizeof(cookie)) <= 0) { dbgprintf("Could not find cookie value\n"); return 4; /* No cookie */ } pcre_free(subjexp); /* See if there's a "DELAY=" delay-value also */ subjexp = pcre_compile(".*DELAY[ =]+([0-9]+[mhdw]*)", PCRE_CASELESS, &errmsg, &errofs, NULL); if (subjexp == NULL) { dbgprintf("pcre compile failed - 2\n"); return 2; } result = pcre_exec(subjexp, NULL, subjectline, strlen(subjectline), 0, 0, ovector, (sizeof(ovector)/sizeof(int))); if (result >= 0) { char delaytxt[4096]; if (pcre_copy_substring(subjectline, ovector, result, 1, delaytxt, sizeof(delaytxt)) > 0) { duration = durationvalue(delaytxt); } } pcre_free(subjexp); /* See if there's a "msg" text also */ subjexp = pcre_compile(".*MSG[ =]+(.*)", PCRE_CASELESS, &errmsg, &errofs, NULL); if (subjexp == NULL) { dbgprintf("pcre compile failed - 3\n"); return 2; } result = pcre_exec(subjexp, NULL, subjectline, strlen(subjectline), 0, 0, ovector, (sizeof(ovector)/sizeof(int))); if (result >= 0) { char msgtxt[4096]; if (pcre_copy_substring(subjectline, ovector, result, 1, msgtxt, sizeof(msgtxt)) > 0) { firsttxtline = strdup(msgtxt); } } pcre_free(subjexp); /* Use the "return-path:" header if we didn't see a From: line */ if ((fromline == NULL) && returnpathline) fromline = returnpathline; if (fromline) { /* Remove '<' and '>' from the fromline - they mess up HTML */ while ((p = strchr(fromline, '<')) != NULL) *p = ' '; while ((p = strchr(fromline, '>')) != NULL) *p = ' '; } /* Setup the acknowledge message */ if (duration == 0) duration = 60; /* Default: Ack for 60 minutes */ if (firsttxtline == NULL) firsttxtline = ""; ackbuf = (char *)malloc(4096 + strlen(firsttxtline) + (fromline ? strlen(fromline) : 0)); p = ackbuf; p += sprintf(p, "xymondack %s %d %s", cookie, duration, firsttxtline); if (fromline) { p += sprintf(p, "\nAcked by: %s", fromline); } if (debug) { printf("%s\n", ackbuf); return 0; } sendmessage(ackbuf, NULL, XYMON_TIMEOUT, NULL); return 0; } xymon-4.3.28/xymond/xymond_hostdata.80000664000076400007640000000247413037531444020041 0ustar rpmbuildrpmbuild.TH XYMOND_HOSTDATA 8 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME xymond_hostdata \- xymond worker module for storing historical client data .SH SYNOPSIS .B "xymond_channel \-\-channel=clichg xymond_hostdata" .SH DESCRIPTION xymond_hostdata is a worker module for xymond, and as such it is normally run via the .I xymond_channel(8) program. Whenever a status column in Xymon changes to an alert state (usually red, yellow or purple), this module receives a copy of the latest Xymon client data sent by the host, and stores it on disk. This allows you to review all of the data collected by the Xymon client on the server around the time that a problem occurred. This can make troubleshooting incidents easier by providing a snapshot of the host status shortly before a problem became apparent. Note: This module requires that .I xymond(8) is launched with the "\-\-store\-clientlogs" option enabled. .SH OPTIONS .IP "\-\-minimum\-free=N" Sets the minimum percentage of free filesystem space on the $CLIENTLOGS directory. If there is less than N% free space, xymond_hostdata will not save the data. Default: 5 .IP "\-\-debug" Enable debugging output. .SH FILES All of the host data are stored in the $CLIENTLOGS directory, by default this is the $XYMONVAR/hostdata/ directory. .SH "SEE ALSO" xymond(8), xymond_channel(8), xymon(7) xymon-4.3.28/xymond/Makefile0000664000076400007640000002715112500500212016161 0ustar rpmbuildrpmbuildXYMONLIB = ../lib/libxymon.a XYMONLIBS = $(XYMONLIB) XYMONCOMMLIB = ../lib/libxymoncomm.a XYMONCOMMLIBS = $(XYMONCOMMLIB) $(ZLIBLIBS) $(SSLLIBS) $(NETLIBS) $(LIBRTDEF) XYMONTIMELIB = ../lib/libxymontime.a XYMONTIMELIBS = $(XYMONTIMELIB) $(LIBRTDEF) PROGRAMS = xymon.sh xymond xymond_channel xymond_locator xymond_filestore xymond_history xymond_alert xymond_sample xymond_client xymond_hostdata xymond_capture xymond_distribute xymonfetch xymon-mailack trimhistory combostatus xymonreports.sh moverrd.sh convertnk rrdcachectl CLIENTPROGRAMS = ../client/xymond_client ifeq ($(DORRD),yes) PROGRAMS += xymond_rrd endif XYMONDOBJS = xymond.o CHANNELOBJS = xymond_channel.o LOCATOROBJS = xymond_locator.o SAMPLEOBJS = xymond_sample.o xymond_worker.o FILESTOREOBJS = xymond_filestore.o xymond_worker.o HISTORYOBJS = xymond_history.o xymond_worker.o ALERTOBJS = xymond_alert.o xymond_worker.o do_alert.o RRDOBJS = xymond_rrd.o xymond_worker.o do_rrd.o client_config.o HOSTDATAOBJS = xymond_hostdata.o xymond_worker.o CAPTUREOBJS = xymond_capture.o xymond_worker.o CLIENTOBJS = xymond_client.o xymond_worker.o client_config.o DISTRIBUTEOBJS= xymond_distribute.o xymond_worker.o COMBOTESTOBJS = combostatus.o MAILACKOBJS = xymon-mailack.o TRIMHISTOBJS = trimhistory.o FETCHOBJS = xymonfetch.o CONVERTNKOBJS = convertnk.o RRDCACHECTLOBJS = rrdcachectl.o IDTOOL := $(shell if test `uname -s` = "SunOS"; then echo /usr/xpg4/bin/id; else echo id; fi) all: $(PROGRAMS) cfgfiles # Need NETLIBS on Solaris for getservbyname(), called by parse_url() client: $(CLIENTPROGRAMS) xymond: $(XYMONDOBJS) $(XYMONCOMMLIB) $(XYMONTIMELIB) $(CC) $(LDFLAGS) -o $@ $(RPATHOPT) $(XYMONDOBJS) $(XYMONCOMMLIBS) $(XYMONTIMELIBS) $(PCRELIBS) xymond_channel: $(CHANNELOBJS) $(XYMONCOMMLIB) $(XYMONTIMELIB) $(CC) $(LDFLAGS) -o $@ $(RPATHOPT) $(CHANNELOBJS) $(XYMONCOMMLIBS) $(XYMONTIMELIBS) $(PCRELIBS) xymond_locator: $(LOCATOROBJS) $(XYMONCOMMLIB) $(CC) $(LDFLAGS) -o $@ $(RPATHOPT) $(LOCATOROBJS) $(XYMONCOMMLIBS) xymond_filestore: $(FILESTOREOBJS) $(XYMONCOMMLIB) $(XYMONTIMELIB) $(CC) $(LDFLAGS) -o $@ $(RPATHOPT) $(FILESTOREOBJS) $(XYMONTIMELIBS) $(XYMONCOMMLIBS) $(PCRELIBS) xymond_history: $(HISTORYOBJS) $(XYMONCOMMLIB) $(XYMONTIMELIB) $(CC) $(LDFLAGS) -o $@ $(RPATHOPT) $(HISTORYOBJS) $(XYMONTIMELIBS) $(XYMONCOMMLIBS) xymond_alert: $(ALERTOBJS) $(XYMONCOMMLIB) $(CC) $(LDFLAGS) -o $@ $(RPATHOPT) $(ALERTOBJS) $(XYMONTIMELIBS) $(XYMONCOMMLIBS) $(PCRELIBS) xymond_rrd: $(RRDOBJS) $(XYMONCOMMLIB) $(CC) $(LDFLAGS) -o $@ $(RPATHOPT) $(RRDOBJS) $(XYMONTIMELIBS) $(XYMONCOMMLIBS) $(RRDLIBS) $(PCRELIBS) xymond.o: xymond.c $(CC) $(CFLAGS) $(SSLFLAGS) -c -o $@ xymond.c do_alert.o: do_alert.c $(CC) $(CFLAGS) $(PCREINCDIR) -c -o $@ do_alert.c do_rrd.o: do_rrd.c do_rrd.h rrd/*.c $(CC) $(CFLAGS) $(RRDINCDIR) $(PCREINCDIR) $(RRDDEF) -c -o $@ do_rrd.c xymond_capture.o: xymond_capture.c $(CC) $(CFLAGS) $(PCREINCDIR) -c -o $@ xymond_capture.c xymond_sample: $(SAMPLEOBJS) $(XYMONCOMMLIB) $(CC) $(LDFLAGS) -o $@ $(RPATHOPT) $(SAMPLEOBJS) $(XYMONTIMELIBS) $(XYMONCOMMLIBS) xymond_capture: $(CAPTUREOBJS) $(XYMONCOMMLIB) $(CC) $(LDFLAGS) -o $@ $(RPATHOPT) $(CAPTUREOBJS) $(XYMONTIMELIBS) $(XYMONCOMMLIBS) $(PCRELIBS) xymond_distribute: $(DISTRIBUTEOBJS) $(XYMONCOMMLIB) $(CC) $(LDFLAGS) -o $@ $(RPATHOPT) $(DISTRIBUTEOBJS) $(XYMONTIMELIBS) $(XYMONCOMMLIBS) $(PCRELIBS) xymond_hostdata: $(HOSTDATAOBJS) $(XYMONCOMMLIB) $(CC) $(LDFLAGS) -o $@ $(RPATHOPT) $(HOSTDATAOBJS) $(XYMONTIMELIBS) $(XYMONCOMMLIBS) xymond_client: $(CLIENTOBJS) $(XYMONCOMMLIB) $(CC) $(LDFLAGS) -o $@ $(RPATHOPT) $(CLIENTOBJS) $(XYMONTIMELIBS) $(XYMONCOMMLIBS) $(PCRELIBS) ../client/xymond_client: $(CLIENTOBJS) ../lib/libxymonclientcomm.a ../lib/libxymontime.a ../lib/libxymonclient.a $(CC) -o $@ $(RPATHOPT) $(CLIENTOBJS) ../lib/libxymonclientcomm.a ../lib/libxymontime.a ../lib/libxymonclient.a $(PCRELIBS) $(NETLIBS) $(LIBRTDEF) xymond_client.o: xymond_client.c client/*.c $(CC) $(CFLAGS) -c -o $@ xymond_client.c combostatus.o: combostatus.c $(CC) $(CFLAGS) $(PCREINCDIR) -c -o $@ $< combostatus: $(COMBOTESTOBJS) $(XYMONCOMMLIB) $(XYMONTIMELIB) $(CC) $(LDFLAGS) -o $@ $(RPATHOPT) $(COMBOTESTOBJS) $(XYMONTIMELIBS) $(XYMONCOMMLIBS) $(PCRELIBS) xymon-mailack.o: xymon-mailack.c $(CC) $(CFLAGS) $(PCREINCDIR) -c -o $@ xymon-mailack.c xymon-mailack: $(MAILACKOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(RPATHOPT) $(MAILACKOBJS) $(XYMONCOMMLIBS) $(PCRELIBS) trimhistory: $(TRIMHISTOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(RPATHOPT) $(TRIMHISTOBJS) $(XYMONCOMMLIBS) xymonfetch: $(FETCHOBJS) $(XYMONCOMMLIB) $(XYMONTIMELIB) $(CC) $(CFLAGS) -o $@ $(RPATHOPT) $(FETCHOBJS) $(XYMONTIMELIBS) $(XYMONCOMMLIBS) convertnk: $(CONVERTNKOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(RPATHOPT) $(CONVERTNKOBJS) $(XYMONCOMMLIBS) rrdcachectl: $(RRDCACHECTLOBJS) $(XYMONCOMMLIB) $(CC) $(CFLAGS) -o $@ $(RPATHOPT) $(RRDCACHECTLOBJS) $(XYMONCOMMLIBS) xymon.sh: xymon.sh.DIST cat $< | sed -e 's!@XYMONHOME@!$(XYMONHOME)!g' | sed -e 's!@XYMONLOGDIR@!$(XYMONLOGDIR)!g' | sed -e 's!@XYMONUSER@!$(XYMONUSER)!g' | sed -e 's!@RUNTIMEDEFS@!$(RUNTIMEDEFS)!g' >$@ chmod 755 $@ xymonreports.sh: xymonreports.sh.DIST cat $< | sed -e 's!@XYMONHOME@!$(XYMONHOME)!g' >$@ chmod 755 $@ moverrd.sh: moverrd.sh.DIST cat $< | sed -e 's!@XYMONHOME@!$(XYMONHOME)!g' | sed -e 's!@XYMONVAR@!$(XYMONVAR)!g' >$@ chmod 755 $@ ifeq ($(XYMONCGIURL),$(SECUREXYMONCGIURL)) APACHECONF = etcfiles/xymon-apache-open.DIST else APACHECONF = etcfiles/xymon-apache-secure.DIST endif cfgfiles: cat $(APACHECONF) | sed -e 's!@XYMONHOME@!$(XYMONHOME)!g' | sed -e 's!@INSTALLETCDIR@!$(INSTALLETCDIR)!g' | sed -e 's!@INSTALLWWWDIR@!$(INSTALLWWWDIR)!g' | sed -e 's!@CGIDIR@!$(CGIDIR)!g' | sed -e 's!@SECURECGIDIR@!$(SECURECGIDIR)!g' | sed -e 's!@XYMONHOSTURL@!$(XYMONHOSTURL)!g' | sed -e 's!@XYMONCGIURL@!$(XYMONCGIURL)!g' | sed -e 's!@SECUREXYMONCGIURL@!$(SECUREXYMONCGIURL)!g' >etcfiles/xymon-apache.conf cat etcfiles/xymonserver.cfg.DIST | sed -e 's!@XYMONTOPDIR@!$(XYMONTOPDIR)!g'| sed -e 's!@XYMONLOGDIR@!$(XYMONLOGDIR)!g'| sed -e 's!@XYMONHOSTNAME@!$(XYMONHOSTNAME)!g'| sed -e 's!@XYMONHOSTIP@!$(XYMONHOSTIP)!g'| sed -e 's!@XYMONHOSTOS@!$(XYMONHOSTOS)!g' | sed -e 's!@XYMONHOSTURL@!$(XYMONHOSTURL)!g' | sed -e 's!@XYMONCGIURL@!$(XYMONCGIURL)!g' | sed -e 's!@SECUREXYMONCGIURL@!$(SECUREXYMONCGIURL)!g' | sed -e 's!@XYMONHOME@!$(XYMONHOME)!g' | sed -e 's!@XYMONVAR@!$(XYMONVAR)!g' | sed -e 's!@FPING@!$(FPING)!g' | sed -e 's!@MAILPROGRAM@!$(MAILPROGRAM)!g' | sed -e 's!@RUNTIMEDEFS@!$(RUNTIMEDEFS)!g' >etcfiles/xymonserver.cfg ../build/bb-commands.sh >>etcfiles/xymonserver.cfg cat etcfiles/hosts.cfg.DIST | sed -e 's!@XYMONHOSTNAME@!$(XYMONHOSTNAME)!g' | sed -e 's!@XYMONHOSTIP@!$(XYMONHOSTIP)!g' >etcfiles/hosts.cfg cat etcfiles/alerts.cfg.DIST | sed -e 's!@XYMONHOSTNAME@!$(XYMONHOSTNAME)!g' | sed -e 's!@XYMONHOSTIP@!$(XYMONHOSTIP)!g' >etcfiles/alerts.cfg cat etcfiles/tasks.cfg.DIST | sed -e 's!@XYMONHOME@!$(XYMONHOME)!g' | sed -e 's!@XYMONTOPDIR@!$(XYMONTOPDIR)!g' >etcfiles/tasks.cfg cat etcfiles/cgioptions.cfg.DIST | sed -e 's!@XYMONHOME@!$(XYMONHOME)!g' >etcfiles/cgioptions.cfg %.o: %.c $(CC) $(CFLAGS) -c -o $@ $< clean: rm -f $(PROGRAMS) *.o *~ client/*~ rrd/*~ rm -f etcfiles/xymon-apache.conf etcfiles/xymonserver.cfg etcfiles/hosts.cfg etcfiles/alerts.cfg etcfiles/tasks.cfg etcfiles/cgioptions.cfg (find etcfiles/ -name "*~"; find wwwfiles/ -name "*~"; find webfiles/ -name "*~") | xargs rm -f install: install-bin install-man install-cfg install-bin: ifndef PKGBUILD chown $(XYMONUSER) $(PROGRAMS) chgrp `$(IDTOOL) -g $(XYMONUSER)` $(PROGRAMS) chmod 755 $(PROGRAMS) endif cp -fp $(PROGRAMS) $(INSTALLROOT)$(INSTALLBINDIR)/ install-man: ifndef PKGBUILD chown $(XYMONUSER) *.1 *.5 *.8 chgrp `$(IDTOOL) -g $(XYMONUSER)` *.1 *.5 *.8 chmod 644 *.1 *.5 *.8 endif mkdir -p $(INSTALLROOT)$(MANROOT)/man1 $(INSTALLROOT)$(MANROOT)/man5 $(INSTALLROOT)$(MANROOT)/man8 ifndef PKGBUILD chown $(XYMONUSER) $(INSTALLROOT)$(MANROOT)/man1 $(INSTALLROOT)$(MANROOT)/man5 $(INSTALLROOT)$(MANROOT)/man8 chgrp `$(IDTOOL) -g $(XYMONUSER)` $(INSTALLROOT)$(MANROOT)/man1 $(INSTALLROOT)$(MANROOT)/man5 $(INSTALLROOT)$(MANROOT)/man8 chmod 755 $(INSTALLROOT)$(MANROOT) $(INSTALLROOT)$(MANROOT)/man1 $(INSTALLROOT)$(MANROOT)/man5 $(INSTALLROOT)$(MANROOT)/man8 endif cp -fp *.1 $(INSTALLROOT)$(MANROOT)/man1/ cp -fp *.5 $(INSTALLROOT)$(MANROOT)/man5/ cp -fp *.8 $(INSTALLROOT)$(MANROOT)/man8/ install-cfg: cd etcfiles; ../../build/merge-lines xymonserver.cfg $(INSTALLROOT)$(INSTALLETCDIR)/xymonserver.cfg LARRDCOLUMN=TRENDSCOLUMN LARRDS=TEST2RRD cd etcfiles; ../../build/merge-lines cgioptions.cfg $(INSTALLROOT)$(INSTALLETCDIR)/cgioptions.cfg cd etcfiles; ../../build/merge-sects tasks.cfg $(INSTALLROOT)$(INSTALLETCDIR)/tasks.cfg larrdstatus=rrdstatus larrddata=rrddata cd etcfiles; ../../build/merge-sects client-local.cfg $(INSTALLROOT)$(INSTALLETCDIR)/client-local.cfg cd etcfiles; ../../build/merge-sects graphs.cfg $(INSTALLROOT)$(INSTALLETCDIR)/graphs.cfg cd etcfiles; ../../build/merge-lines columndoc.csv $(INSTALLROOT)$(INSTALLETCDIR)/columndoc.csv cd etcfiles; (echo "hosts.cfg"; echo "alerts.cfg"; echo "analysis.cfg"; echo "combo.cfg"; echo "client-local.cfg"; echo "holidays.cfg"; echo "rrddefinitions.cfg"; echo snmpmibs.cfg; echo xymonmenu.cfg; echo xymon-apache.conf) | ../../build/setup-newfiles $(INSTALLROOT)$(INSTALLETCDIR)/ cd $(INSTALLROOT)$(XYMONHOME); rm -f xymon.sh; ln -sf bin/xymon.sh . cd wwwfiles; find . | grep -v RCS | grep -v ".svn" | grep -v DIST | ../../build/setup-newfiles $(INSTALLROOT)$(INSTALLWWWDIR)/ ../../build/md5.dat cd webfiles; find . | grep -v RCS | grep -v ".svn" | grep -v DIST | ../../build/setup-newfiles $(INSTALLROOT)$(INSTALLWEBDIR)/ ../../build/md5.dat touch $(INSTALLROOT)$(INSTALLETCDIR)/critical.cfg $(INSTALLROOT)$(INSTALLETCDIR)/critical.cfg.bak chmod 664 $(INSTALLROOT)$(INSTALLETCDIR)/critical.cfg $(INSTALLROOT)$(INSTALLETCDIR)/critical.cfg.bak mkdir -p $(INSTALLROOT)$(XYMONLOGDIR); chmod 755 $(INSTALLROOT)$(XYMONLOGDIR) mkdir -p $(INSTALLROOT)$(INSTALLETCDIR)/tasks.d; chmod 755 $(INSTALLROOT)$(INSTALLETCDIR)/tasks.d ifndef PKGBUILD chown $(XYMONUSER) $(INSTALLROOT)$(XYMONLOGDIR) $(INSTALLROOT)$(XYMONHOME) $(INSTALLROOT)$(XYMONHOME)/* $(INSTALLROOT)$(INSTALLBINDIR)/* $(INSTALLROOT)$(INSTALLETCDIR)/* $(INSTALLROOT)$(INSTALLEXTDIR)/* $(INSTALLROOT)$(INSTALLWEBDIR)/* $(INSTALLROOT)$(INSTALLWWWDIR)/gifs $(INSTALLROOT)$(INSTALLWWWDIR)/gifs/* $(INSTALLROOT)$(INSTALLWWWDIR)/menu $(INSTALLROOT)$(INSTALLWWWDIR)/menu/* $(INSTALLROOT)$(INSTALLWWWDIR)/help $(INSTALLROOT)$(INSTALLWWWDIR)/notes $(INSTALLROOT)$(INSTALLWWWDIR)/html $(INSTALLROOT)$(INSTALLWWWDIR)/wml $(INSTALLROOT)$(XYMONVAR) $(INSTALLROOT)$(XYMONVAR)/* chgrp `$(IDTOOL) -g $(XYMONUSER)` $(INSTALLROOT)$(XYMONLOGDIR) $(INSTALLROOT)$(XYMONHOME) $(INSTALLROOT)$(XYMONHOME)/* $(INSTALLROOT)$(INSTALLBINDIR)/* $(INSTALLROOT)$(INSTALLETCDIR)/* $(INSTALLROOT)$(INSTALLEXTDIR)/* $(INSTALLROOT)$(INSTALLWEBDIR)/* $(INSTALLROOT)$(INSTALLWWWDIR)/gifs $(INSTALLROOT)$(INSTALLWWWDIR)/gifs/* $(INSTALLROOT)$(INSTALLWWWDIR)/menu $(INSTALLROOT)$(INSTALLWWWDIR)/menu/* $(INSTALLROOT)$(INSTALLWWWDIR)/help $(INSTALLROOT)$(INSTALLWWWDIR)/notes $(INSTALLROOT)$(INSTALLWWWDIR)/html $(INSTALLROOT)$(INSTALLWWWDIR)/wml $(INSTALLROOT)$(XYMONVAR) $(INSTALLROOT)$(XYMONVAR)/* chgrp $(HTTPDGID) $(INSTALLROOT)$(INSTALLETCDIR)/critical.cfg $(INSTALLROOT)$(INSTALLETCDIR)/critical.cfg.bak chmod 664 $(INSTALLROOT)$(INSTALLETCDIR)/critical.cfg $(INSTALLROOT)$(INSTALLETCDIR)/critical.cfg.bak chown root $(INSTALLROOT)$(INSTALLBINDIR)/xymonping || echo "Could not make xymonping owned by root, continuing" chmod 4755 $(INSTALLROOT)$(INSTALLBINDIR)/xymonping || echo "Could not make xymonping suid-root, continuing" endif xymon-4.3.28/xymond/client_config.h0000664000076400007640000001142312206407300017477 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __CLIENT_CONFIG_H__ #define __CLIENT_CONFIG_H__ #include "libxymon.h" extern int load_client_config(char *configfn); extern void dump_client_config(void); extern void clearalertgroups(void); extern char *getalertgroups(void); extern void addalertgroup(char *group); extern int get_cpu_thresholds(void *hinfo, char *classname, float *loadyellow, float *loadred, int *recentlimit, int *ancientlimit, int *uptimecolor, int *maxclockdiff, int *clockdiffcolor); extern int get_disk_thresholds(void *hinfo, char *classname, char *fsname, long *warnlevel, long *paniclevel, int *abswarn, int *abspanic, int *ignored, char **group); extern int get_inode_thresholds(void *hinfo, char *classname, char *fsname, long *warnlevel, long *paniclevel, int *abswarn, int *abspanic, int *ignored, char **group); extern void get_memory_thresholds(void *hhinfo, char *classname, int *physyellow, int *physred, int *swapyellow, int *swapred, int *actyellow, int *actred); extern void get_zos_memory_thresholds(void *hinfo, char *classname, int *csayellow, int *csared, int *ecsayellow, int *ecsared, int *sqayellow, int *sqared, int *esqayellow, int *esqared); extern void get_cics_thresholds(void *hinfo, char *classname, char *appid, int *dsayel, int *dsared, int *edsayel, int *edsared); extern void get_zvsevsize_thresholds(void *hinfo, char *classname, int *availyel, int *availred); extern void get_zvsegetvis_thresholds(void *hinfo, char *classname, char *pid, int *gv24yel, int *gv24red, int *gvanyyel, int *gvanyred); extern void get_asid_thresholds(void *hinfo, char *classname, int *maxyellow, int *maxred); extern int get_paging_thresholds(void *hinfo, char *classname, int *pagingyellow, int *pagingred); extern int check_mibvals(void *hinfo, char *classname, char *mibname, char *keyname, char *mibdata, strbuffer_t *summarybuf, int *anyrules); extern strbuffer_t *check_rrdds_thresholds(char *hostname, char *classname, char *pagepaths, char *rrdkey, void *valnames, char *vals); extern int scan_log(void *hinfo, char *classname, char *logname, char *logdata, char *section, strbuffer_t *summarybuf); extern int check_file(void *hinfo, char *classname, char *filename, char *filedata, char *section, strbuffer_t *summarybuf, off_t *sz, char **id, int *trackit, int *anyrules); extern int check_dir(void *hinfo, char *classname, char *filename, char *filedata, char *section, strbuffer_t *summarybuf, unsigned long *sz, char **id, int *trackit); extern int clear_process_counts(void *hinfo, char *classname); extern void add_process_count(char *pname); extern char *check_process_count(int *pcount, int *lowlim, int *uplim, int *pcolor, char **id, int *trackit, char **group); extern int clear_disk_counts(void *hinfo, char *classname); extern void add_disk_count(char *dname); extern char *check_disk_count(int *dcount, int *lowlim, int *uplim, int *dcolor, char **group); extern int clear_inode_counts(void *hinfo, char *classname); extern void add_inode_count(char *iname); extern char *check_inode_count(int *icount, int *lowlim, int *uplim, int *icolor, char **group); extern int clear_port_counts(void *hinfo, char *classname); extern void add_port_count(char *spname, char *tpname, char *stname); extern char *check_port_count(int *pcount, int *lowlim, int *uplim, int *pcolor, char **id, int *trackit, char **group); extern int clear_svc_counts(void *hinfo, char *classname); extern void add_svc_count(char *spname, char *tpname, char *stname); extern char *check_svc_count(int *pcount, int *pcolor, char **group); extern void get_mqqueue_thresholds(void *hinfo, char *classname, char *qmgrname, char *qname, int *warnlen, int *critlen, int *warnage, int *critage, char **trackit); extern int get_mqchannel_params(void *hinfo, char *classname, char *qmgrname, char *chnname, char *chnstatus, int *color); #endif xymon-4.3.28/xymond/client-local.cfg.50000664000076400007640000001757413037531444017744 0ustar rpmbuildrpmbuild.TH CLIENT\-LOCAL.CFG 5 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME client\-local.cfg \- Local configuration settings for Xymon clients .SH SYNOPSIS .B ~xymon/server/etc/client\-local.cfg .SH DESCRIPTION The client\-local.cfg file contains settings that are used by each Xymon client when it runs on a monitored host. It provides a convenient way of configuring clients from a central location without having to setup special configuration maintenance tools on all clients. The client\-local.cfg file is currently used to configure what logfiles the client should fetch data from, to be used as the basis for the "msgs" status column; and to configure which files and directories are being monitored in the "files" status column. Note that there is a dependency between the client\-local.cfg file and the .I analysis.cfg(5) file. When monitoring e.g. a logfile, you must first enter it into the client\-local.cfg file, to trigger the Xymon client into reporting any data about the logfile. Next, you must configure analysis.cfg so the Xymon server knows what to look for in the file data sent by the client. So: client\-local.cfg defines what raw data is collected by the client, and analysis.cfg defines how to analyze them. .SH PROPAGATION TO CLIENTS The client\-local.cfg file resides on the Xymon server. When clients connect to the Xymon server to send in their client data, they will receive part of this file back from the Xymon server. The configuration received by the client is then used the next time the client runs. This method of propagating the configuration means that there is a delay of up to two poll cycles (i.e. 5-10 minutes) from a configuration change is entered into the client\-local.cfg file, and until you see the result in the status messages reported by the client. By default, xymond will look for a matching entry by matching the client hostname, classname or operating system name against the section expressions. Hostname matches are used first, then classname matches, then OS matches. The first match found is the one that is returned to the client. If xymond is started with the "--merge-clientlocal" option, then xymond will instead merge all of the matching sections into one, and return all of this data to the client. So you can have host-specific entries, and then supplement them with class- or os-generic entries. Note that the merging does not remove entries, so if you have e.g. a "log" entry defined in both a hostname- and an osname-matching section, then both entries will be sent back to the client. .SH FILE FORMAT The file is divided into sections, delimited by "[name]" lines. A section name can be either an operating system identifier - linux, solaris, hp-ux, aix, freebsd, openbsd, netbsd, darwin - a class, or a hostname. When deciding which section to send to a client, Xymon will first look for a section named after the hostname of the client; if such a section does not exist, it will look for a section named by the operating system of the client. So you can configure special configurations for individual hosts, and have a default configuration for all other hosts of a certain type. It will often be practical to use regular expressions for hostnames. To do this you must use .sp [host=] .sp where is a Perl-compatible regular expression. The same kind of matching can be done on operating system or host class, using .sp [os=] .br [class=] Apart from the section delimiter, the file format is free-form, or rather it is defined by the tools that make use of the configuration. .SH LOGFILE CONFIGURATION ENTRIES A logfile configuration entry looks like this: .sp log:/var/log/messages:10240 .br ignore MARK .br trigger Oops .sp The \fBlog:FILENAME:SIZE\fR line defines the filename of the log, and the maximum amount of data (in bytes) to send to the Xymon server. FILENAME is usually an explicit full-path filename on the client. If it is enclosed in backticks, it is a command which the Xymon client runs and each line of output from this command is then used as a filename. This allows scripting which files to monitor, e.g. if you have logfiles that are named with some sort of timestamp. If FILENAME is enclosed in angle brackets it is treated as a glob and passed through the local glob(3) function first. .sp The \fBignore PATTERN\fR line (optional) defines lines in the logfile which are ignored entirely, i.e. they are stripped from the logfile data before sending it to the Xymon server. It is used to remove completely unwanted "noise" entries from the logdata processed by Xymon. "PATTERN" is a regular expression. .sp The \fBtrigger PATTERN\fR line (optional) is used only when there is more data in the log than the maximum size set in the "log:FILENAME:SIZE" line. The "trigger" pattern is then used to find particularly interesting lines in the logfile - these will always be sent to the Xymon server. After picking out the "trigger" lines, any remaining space up to the maximum size is filled in with the most recent entries from the logfile. "PATTERN" is a regular expression. .SH COUNTING LOGENTRIES A special type of log-handling is possible, where the number of lines matching a regular expressions are merely counted. This is \fBlinecount:FILENAME\fR, followed by a number of lines of the form \fBID:PATTERN\fR. E.g. .sp linecount:/var/log/messages .br diskerrors:I/O error.*device.*hd .br badlogins:Failed login .sp .SH FILE CONFIGURATION ENTRIES A file monitoring entry is used to watch the meta-data of a file: Owner, group, size, permissions, checksum etc. It looks like this: .sp file:/var/log/messages[:HASH] .sp The \fBfile:FILENAME\fR line defines the filename of the file to monitor. As with the "log:" entries, a filename enclosed in backticks means a command which will generate the filenames dynamically. The optional [:HASH] setting defines what type of hash to compute for the file: \fBmd5\fR, \fBrmd160\fR, \fBsha1\fR, or \fBsha256, \fBsha512\fR, \fBsha224\fR, or \fBsha384\fR. By default, no hash is calculated. .br \fBNOTE:\fR If you want to check multiple files using a wildcard, you \fBmust\fR use a command to generate the filenames. Putting wildcards directly into the \fBfile:\fR entry will not work. .SH DIRECTORY CONFIGURATION ENTRIES A directory monitoring entry is used to watch the size of a directory and any sub-directories. It looks like this: .sp dir:DIRECTORYNAME .sp The \fBdir:DIRECTORYNAME\fR line defines the filename of the file to monitor. As with the "log:" entries, a filename enclosed in backticks means a command which will generate the filenames dynamically and a filename enclosed in angle brackets will be treated as a fileglob. The Xymon client will run the .I du(1) command with the directoryname as parameter, and send the output back to the Xymon server. .br \fBNOTE:\fR If you want to check multiple directories using a wildcard, you \fBmust\fR use a command or glob to generate the directory names. Putting wildcards directly into the \fBdir:\fR entry will not work. E.g. use something like .br dir:`find /var/log \-maxdepth 1 \-type d` The "du" command used can be configured through the \fBDU\fR environment variable in the xymonclient.cfg file if needed. If not specified, \fBdu \-k\fR is used, as on some systems by default \fBdu\fR reports data in disk blocks instead of KB (e.g. Solaris). .SH NOTES The ability of the Xymon client to calculate file hashes and monitor those can be used for file integrity validation on a small scale. However, there is a significant processing overhead in calculating these every time the Xymon client runs, so this should not be considered a replacement for host-based intrusion detection systems such as Tripwire or AIDE. Use of the directory monitoring on directory structures with a large number of files and/or sub-directories can be quite ressource-intensive. .SH "SEE ALSO" analysis.cfg(5), xymond_client(8), xymond(8), xymon(7) xymon-4.3.28/xymond/xymond_alert.c0000664000076400007640000007333613007426256017422 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon message daemon. */ /* */ /* This is the main alert module for xymond. It receives alert messages, */ /* keeps track of active alerts, enable/disable, acks etc., and triggers */ /* outgoing alerts by calling send_alert(). */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ /* * Information from the Xymon docs about "page" modules: * * page * ---- * @@page|timestamp|sender|hostname|testname|expiretime|color|prevcolor|changetime|location * * @@ * * @@ack|timestamp|sender|hostname|testname|expiretime * * @@ * * @@notify|timestamp|sender|hostname|testname|pagepath * * @@ * * Note that "page" modules get messages whenever the alert-state of a test * changes. I.e. a message is generated whenever a test goes from a color * that is non-alerting to a color that is alerting, or vice versa. * * How does the pager know when a test is disabled ? It will get a "page" * message with color=blue, if the old color of the test was in an alert * state. (If it wasn't, the pager module does not need to know that the * test has been disabled). It should then clear any stored info about * active alerts for this host.test combination. */ static char rcsid[] = "$Id: xymond_alert.c 7982 2016-11-05 19:02:06Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include "libxymon.h" #include "xymond_worker.h" #include "do_alert.h" #define DEFAULT_RELOAD_INTERVAL 300 int reloadinterval = DEFAULT_RELOAD_INTERVAL; /* Seconds - how often to check hosts.cfg for changes (which can be expensive) */ int loadhostsfromxymond = 0; static int reloadconfig = 0; static int running = 1; static time_t nextcheckpoint = 0; static int termsig = -1; void * hostnames; void * testnames; void * locations; typedef struct alertanchor_t { activealerts_t *head; } alertanchor_t; activealerts_t *ahead = NULL; char *statename[] = { /* A_PAGING, A_NORECIP, A_ACKED, A_RECOVERED, A_DISABLED, A_NOTIFY, A_DEAD */ "paging", "norecip", "acked", "recovered", "disabled", "notify", "dead" }; char *find_name(void * tree, char *name) { char *result; xtreePos_t handle; handle = xtreeFind(tree, name); if (handle == xtreeEnd(tree)) { result = strdup(name); if (tree == hostnames) { alertanchor_t *anchor = malloc(sizeof(alertanchor_t)); anchor->head = NULL; xtreeAdd(tree, result, anchor); } else { xtreeAdd(tree, result, result); } } else { result = (char *)xtreeKey(tree, handle); } return result; } void add_active(char *hostname, activealerts_t *rec) { xtreePos_t handle; alertanchor_t *anchor; handle = xtreeFind(hostnames, hostname); if (handle == xtreeEnd(hostnames)) return; anchor = (alertanchor_t *)xtreeData(hostnames, handle); rec->next = anchor->head; anchor->head = rec; } void clean_active(alertanchor_t *anchor) { activealerts_t *newhead = NULL, *tmp, *curr; curr = anchor->head; while (curr) { tmp = curr; curr = curr->next; if (tmp->state == A_DEAD) { if (tmp->osname) xfree(tmp->osname); if (tmp->classname) xfree(tmp->classname); if (tmp->groups) xfree(tmp->groups); if (tmp->pagemessage) xfree(tmp->pagemessage); if (tmp->ackmessage) xfree(tmp->ackmessage); xfree(tmp); } else { tmp->next = newhead; newhead = tmp; } } anchor->head = newhead; } void clean_all_active(void) { xtreePos_t handle; for (handle = xtreeFirst(hostnames); handle != xtreeEnd(hostnames); handle = xtreeNext(hostnames, handle)) { alertanchor_t *anchor = (alertanchor_t *)xtreeData(hostnames, handle); clean_active(anchor); } } activealerts_t *find_active(char *hostname, char *testname) { xtreePos_t handle; alertanchor_t *anchor; char *twalk; activealerts_t *awalk; handle = xtreeFind(hostnames, hostname); if (handle == xtreeEnd(hostnames)) return NULL; anchor = (alertanchor_t *)xtreeData(hostnames, handle); handle = xtreeFind(testnames, testname); if (handle == xtreeEnd(testnames)) return NULL; twalk = (char *)xtreeData(testnames, handle); for (awalk = anchor->head; (awalk && (awalk->testname != twalk)); awalk=awalk->next) ; return awalk; } static xtreePos_t alisthandle; static activealerts_t *alistwalk; activealerts_t *alistBegin(void) { alisthandle = xtreeFirst(hostnames); alistwalk = NULL; while ((alisthandle != xtreeEnd(hostnames)) && (alistwalk == NULL)) { alertanchor_t *anchor = (alertanchor_t *)xtreeData(hostnames, alisthandle); alistwalk = anchor->head; if (alistwalk == NULL) alisthandle = xtreeNext(hostnames, alisthandle); } return alistwalk; } activealerts_t *alistNext(void) { if (!alistwalk) return NULL; alistwalk = alistwalk->next; if (alistwalk) return alistwalk; alisthandle = xtreeNext(hostnames, alisthandle); alistwalk = NULL; while ((alisthandle != xtreeEnd(hostnames)) && (alistwalk == NULL)) { alertanchor_t *anchor = (alertanchor_t *)xtreeData(hostnames, alisthandle); alistwalk = anchor->head; if (alistwalk == NULL) alisthandle = xtreeNext(hostnames, alisthandle); } return alistwalk; } void sig_handler(int signum) { switch (signum) { case SIGCHLD: /* Pickup any finished child processes to avoid zombies */ while (waitpid(-1, NULL, WNOHANG) > 0) ; break; case SIGHUP: reloadconfig = 1; break; case SIGUSR1: nextcheckpoint = 0; break; default: running = 0; termsig = signum; break; } } void save_checkpoint(char *filename) { char *subfn; FILE *fd = fopen(filename, "w"); activealerts_t *awalk; unsigned char *pgmsg, *ackmsg; if (fd == NULL) return; for (awalk = alistBegin(); (awalk); awalk = alistNext()) { if (awalk->state == A_DEAD) continue; pgmsg = ackmsg = ""; fprintf(fd, "%s|%s|%s|%s|%s|%d|%d|%s|", awalk->hostname, awalk->testname, awalk->location, awalk->ip, colorname(awalk->maxcolor), (int) awalk->eventstart, (int) awalk->nextalerttime, statename[awalk->state]); if (awalk->pagemessage) pgmsg = nlencode(awalk->pagemessage); fprintf(fd, "%s|", pgmsg); if (awalk->ackmessage) ackmsg = nlencode(awalk->ackmessage); fprintf(fd, "%s\n", ackmsg); } fclose(fd); subfn = (char *)malloc(strlen(filename)+5); sprintf(subfn, "%s.sub", filename); save_state(subfn); xfree(subfn); } int load_checkpoint(char *filename) { char *subfn; FILE *fd; strbuffer_t *inbuf; char statuscmd[1024]; char *statusbuf = NULL; sendreturn_t *sres; int xymondresult; sprintf(statuscmd, "xymondboard fields=hostname,testname,color"); sres = newsendreturnbuf(1, NULL); xymondresult = sendmessage(statuscmd, NULL, XYMON_TIMEOUT, sres); statusbuf = getsendreturnstr(sres, 1); freesendreturnbuf(sres); if ((xymondresult != XYMONSEND_OK) || (statusbuf == NULL) || (*statusbuf == '\0')) { /* * If no data returned for any hosts, chances are xymond is not fully up. * To prevent alerts clearing and spuriously re-firing, bail out here. xymonlaunch * will restart us soon. */ errprintf("xymond_alert: xymond not available or had empty response; error: %d\n", xymondresult); running = 0; return -1; } fd = fopen(filename, "r"); if (fd == NULL) { errprintf("xymond_alert: Couldn't open checkpoint file '%s', but continuing: %s\n", filename, strerror(errno)); return 0; } initfgets(fd); inbuf = newstrbuffer(0); while (unlimfgets(inbuf, fd)) { char *item[20], *p; int i; sanitize_input(inbuf, 0, 0); i = 0; p = gettok(STRBUF(inbuf), "|"); while (p && (i < 20)) { item[i++] = p; p = gettok(NULL, "|"); } if (i == 9) { /* There was no ack message */ item[i++] = ""; } if (i > 9) { char *valid = NULL; activealerts_t *newalert = (activealerts_t *)calloc(1, sizeof(activealerts_t)); newalert->hostname = find_name(hostnames, item[0]); newalert->testname = find_name(testnames, item[1]); newalert->location = find_name(locations, item[2]); strcpy(newalert->ip, item[3]); newalert->color = newalert->maxcolor = parse_color(item[4]); newalert->eventstart = (time_t) atoi(item[5]); newalert->nextalerttime = (time_t) atoi(item[6]); newalert->state = A_PAGING; if (statusbuf) { char *key; key = (char *)malloc(strlen(newalert->hostname) + strlen(newalert->testname) + 100); sprintf(key, "\n%s|%s|%s\n", newalert->hostname, newalert->testname, colorname(newalert->color)); valid = strstr(statusbuf, key); if (!valid && (strncmp(statusbuf, key+1, strlen(key+1)) == 0)) valid = statusbuf; xfree(key); } if (!valid) { errprintf("Stale alert for %s:%s dropped\n", newalert->hostname, newalert->testname); xfree(newalert); continue; } while (strcmp(item[7], statename[newalert->state]) && (newalert->state < A_DEAD)) newalert->state++; /* Config might have changed while we were down */ if (newalert->state == A_NORECIP) newalert->state = A_PAGING; newalert->pagemessage = newalert->ackmessage = NULL; if (strlen(item[8])) { nldecode(item[8]); newalert->pagemessage = strdup(item[8]); } if (strlen(item[9])) { nldecode(item[9]); newalert->ackmessage = strdup(item[9]); } add_active(newalert->hostname, newalert); } } fclose(fd); freestrbuffer(inbuf); subfn = (char *)malloc(strlen(filename)+5); sprintf(subfn, "%s.sub", filename); load_state(subfn, statusbuf); xfree(subfn); if (statusbuf) xfree(statusbuf); return 0; } int main(int argc, char *argv[]) { char *msg; int seq; int argi; int alertcolors, alertinterval; char *configfn = NULL; char *checkfn = NULL; int loadresult; int reloadconfigtime = 0; int checkpointinterval = 900; char acklogfn[PATH_MAX]; FILE *acklogfd = NULL; char notiflogfn[PATH_MAX]; FILE *notiflogfd = NULL; char *tracefn = NULL; struct sigaction sa; int configchanged; time_t lastxmit = 0; MEMDEFINE(acklogfn); MEMDEFINE(notiflogfn); /* Don't save the error buffer */ save_errbuf = 0; /* Load alert config */ alertcolors = colorset(xgetenv("ALERTCOLORS"), ((1 << COL_GREEN) | (1 << COL_BLUE))); alertinterval = 60*atoi(xgetenv("ALERTREPEAT")); /* Create our loookup-trees */ hostnames = xtreeNew(strcasecmp); testnames = xtreeNew(strcasecmp); locations = xtreeNew(strcasecmp); for (argi=1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--debug")) { debug = 1; } else if (argnmatch(argv[argi], "--config=")) { configfn = strdup(strchr(argv[argi], '=')+1); } else if (argnmatch(argv[argi], "--checkpoint-file=")) { checkfn = strdup(strchr(argv[argi], '=')+1); } else if (argnmatch(argv[argi], "--checkpoint-interval=")) { char *p = strchr(argv[argi], '=') + 1; checkpointinterval = atoi(p); } else if (argnmatch(argv[argi], "--reload-interval=")) { char *p = strchr(argv[argi], '=') + 1; reloadinterval = atoi(p); } else if (argnmatch(argv[argi], "--loadhostsfromxymond")) { loadhostsfromxymond = 1; } else if (argnmatch(argv[argi], "--dump-config")) { load_alertconfig(configfn, alertcolors, alertinterval); dump_alertconfig(1); return 0; } else if (argnmatch(argv[argi], "--cfid")) { include_configid = 1; } else if (argnmatch(argv[argi], "--test")) { char *testhost = NULL, *testservice = NULL, *testpage = NULL, *testcolor = "red", *testgroups = NULL; void *hinfo; int testdur = 0; FILE *logfd = NULL; activealerts_t *awalk = NULL; int paramno = 0; set_localalertmode(1); /* create a dummy hostinfo record to try to match against */ argi++; if (argi < argc) testhost = argv[argi]; argi++; if (argi < argc) testservice = argv[argi]; argi++; while (argi < argc) { if (strncasecmp(argv[argi], "--duration=", 11) == 0) { testdur = durationvalue(strchr(argv[argi], '=')+1); } else if (strncasecmp(argv[argi], "--color=", 8) == 0) { testcolor = strchr(argv[argi], '=')+1; } else if (strncasecmp(argv[argi], "--group=", 8) == 0) { testgroups = strchr(argv[argi], '=')+1; } else if (strncasecmp(argv[argi], "--time=", 7) == 0) { fakestarttime = (time_t)atoi(strchr(argv[argi], '=')+1); } else { paramno++; if (paramno == 1) testdur = atoi(argv[argi]); else if (paramno == 2) testcolor = argv[argi]; else if (paramno == 3) fakestarttime = (time_t) atoi(argv[argi]); } argi++; } if ((testhost == NULL) || (testservice == NULL)) { printf("Usage: xymond_alert --test HOST SERVICE [options]\n"); printf("Possible options:\n\t[--duration=MINUTES]\n\t[--color=COLOR]\n\t[--group=GROUPNAME]\n\t[--time=TIMESPEC]\n"); return 1; } load_hostnames(xgetenv("HOSTSCFG"), NULL, get_fqdn()); hinfo = hostinfo(testhost); if (hinfo) { testpage = strdup(xmh_item(hinfo, XMH_ALLPAGEPATHS)); } else { errprintf("Host not found in hosts.cfg - assuming it is on the top page\n"); testpage = ""; } awalk = (activealerts_t *)calloc(1, sizeof(activealerts_t)); awalk->hostname = find_name(hostnames, testhost); awalk->testname = find_name(testnames, testservice); awalk->location = find_name(locations, testpage); strcpy(awalk->ip, "127.0.0.1"); awalk->color = awalk->maxcolor = parse_color(testcolor); awalk->pagemessage = "Test of the alert configuration"; awalk->eventstart = getcurrenttime(NULL) - testdur*60; awalk->groups = (testgroups ? strdup(testgroups) : NULL); awalk->state = A_PAGING; awalk->cookie = 12345; awalk->next = NULL; logfd = fopen("/dev/null", "w"); starttrace(NULL); testonly = 1; load_alertconfig(configfn, alertcolors, alertinterval); load_holidays(0); send_alert(awalk, logfd); return 0; } else if (argnmatch(argv[argi], "--trace=")) { tracefn = strdup(strchr(argv[argi], '=')+1); starttrace(tracefn); } else if (net_worker_option(argv[argi])) { /* Handled in the subroutine */ } else { errprintf("Unknown option '%s'\n", argv[argi]); } } /* Do the network stuff if needed */ net_worker_run(ST_ALERT, LOC_SINGLESERVER, NULL); /* Load our hostnames */ loadresult = load_hostnames( (loadhostsfromxymond ? "@" : xgetenv("HOSTSCFG")) , NULL, get_fqdn() ); if (loadresult != 0) { errprintf("Cannot load host configuration from %s\n", (loadhostsfromxymond ? "xymond" : xgetenv("HOSTSCFG"))); running = 0; return -1; } else { reloadconfig = 0; reloadconfigtime = getcurrenttime(NULL) + reloadinterval; } if (checkfn) { if ( load_checkpoint(checkfn) != 0 ) { errprintf("xymond_alert: cannot load checkpoint file or current state; aborting\n"); return -1; } nextcheckpoint = gettimer() + checkpointinterval; dbgprintf("Next checkpoint at %d, interval %d\n", (int) nextcheckpoint, checkpointinterval); } setup_signalhandler("xymond_alert"); /* Need to handle these ourselves, so we can shutdown and save state-info */ memset(&sa, 0, sizeof(sa)); sa.sa_handler = sig_handler; sigaction(SIGPIPE, &sa, NULL); sigaction(SIGTERM, &sa, NULL); sigaction(SIGINT, &sa, NULL); sigaction(SIGCHLD, &sa, NULL); sigaction(SIGUSR1, &sa, NULL); sigaction(SIGHUP, &sa, NULL); if (xgetenv("XYMONSERVERLOGS")) { sprintf(acklogfn, "%s/acknowledge.log", xgetenv("XYMONSERVERLOGS")); acklogfd = fopen(acklogfn, "a"); sprintf(notiflogfn, "%s/notifications.log", xgetenv("XYMONSERVERLOGS")); notiflogfd = fopen(notiflogfn, "a"); } /* * The general idea here is that this loop handles receiving of alert- * and ack-messages from the master daemon, and maintains a list of * host+test combinations that may have alerts going out. * * This module does not deal with any specific alert-configuration, * it just picks up the alert messages, maintains the list of * known tests that are in some sort of critical condition, and * periodically pushes alerts to the do_alert.c module for handling. * * The only modification of alerts that happen here is the handling * of when the next alert is due. It calls into the next_alert() * routine to learn when an alert should be repeated, and also * deals with Acknowledgments that stop alerts from going out for * a period of time. */ while (running) { char *eoln, *restofmsg; char *metadata[20]; char *p; int metacount; char *hostname = NULL, *testname = NULL; struct timespec timeout; time_t now, nowtimer; int anytogo; activealerts_t *awalk; int childstat; nowtimer = gettimer(); if (checkfn && (nowtimer > nextcheckpoint)) { dbgprintf("Saving checkpoint\n"); nextcheckpoint = nowtimer + checkpointinterval; save_checkpoint(checkfn); if (acklogfd) acklogfd = freopen(acklogfn, "a", acklogfd); if (notiflogfd) notiflogfd = freopen(notiflogfn, "a", notiflogfd); } if (reloadconfig || (nowtimer > reloadconfigtime)) { dbgprintf("Reloading hostnames\n"); reloadconfig = 0; loadresult = load_hostnames( (loadhostsfromxymond ? "@" : xgetenv("HOSTSCFG")) , NULL, get_fqdn() ); if (loadresult == -1) { errprintf("Cannot load host configuration from %s; postponing for 90s\n", (loadhostsfromxymond ? "xymond" : xgetenv("HOSTSCFG"))); reloadconfigtime = nowtimer + 90; } else reloadconfigtime = nowtimer + reloadinterval; } timeout.tv_sec = 60; timeout.tv_nsec = 0; msg = get_xymond_message(C_PAGE, "xymond_alert", &seq, &timeout); if (msg == NULL) { running = 0; continue; } /* See what time it is - must happen AFTER the timeout */ now = getcurrenttime(NULL); /* Split the message in the first line (with meta-data), and the rest */ eoln = strchr(msg, '\n'); if (eoln) { *eoln = '\0'; restofmsg = eoln+1; } else { restofmsg = ""; } /* * Now parse the meta-data into elements. * We use our own "gettok()" routine which works * like strtok(), but can handle empty elements. */ metacount = 0; memset(&metadata, 0, sizeof(metadata)); p = gettok(msg, "|"); while (p && (metacount < 19)) { metadata[metacount] = p; metacount++; p = gettok(NULL, "|"); } metadata[metacount] = NULL; if (metacount > 3) hostname = metadata[3]; if (metacount > 4) testname = metadata[4]; if ((metacount > 10) && (strncmp(metadata[0], "@@page", 6) == 0)) { /* @@page|timestamp|sender|hostname|testname|hostip|expiretime|color|prevcolor|changetime|location|cookie|osname|classname|grouplist|modifiers */ int newcolor, newalertstatus, oldalertstatus; dbgprintf("Got page message from %s:%s\n", hostname, testname); traceprintf("@@page %s:%s:%s=%s\n", hostname, testname, metadata[10], metadata[7]); awalk = find_active(hostname, testname); if (awalk == NULL) { char *hwalk = find_name(hostnames, hostname); char *twalk = find_name(testnames, testname); char *pwalk = find_name(locations, metadata[10]); awalk = (activealerts_t *)calloc(1, sizeof(activealerts_t)); awalk->hostname = hwalk; awalk->testname = twalk; awalk->location = pwalk; awalk->cookie = -1; awalk->state = A_DEAD; /* * Use changetime here, if we restart the alert module then * this gets the duration values more right than using "now". * Also, define this only when a new alert arrives - we should * NOT clear this when a status goes yellow->red, or if it * flaps between yellow and red. */ awalk->eventstart = atoi(metadata[9]); add_active(awalk->hostname, awalk); traceprintf("New record\n"); } newcolor = parse_color(metadata[7]); oldalertstatus = ((alertcolors & (1 << awalk->color)) != 0); newalertstatus = ((alertcolors & (1 << newcolor)) != 0); traceprintf("state %d->%d\n", oldalertstatus, newalertstatus); if (newalertstatus) { /* It's in an alert state. */ awalk->color = newcolor; awalk->state = A_PAGING; if (newcolor > awalk->maxcolor) { if (awalk->maxcolor != 0) { /* * Severity has increased (yellow -> red). * Clear the repeat-interval, and set maxcolor to * the new color. If it drops to yellow again, * maxcolor stays at red, so a test that flaps * between yellow and red will only alert on red * the first time, and then follow the repeat * interval. */ dbgprintf("Severity increased, cleared repeat interval: %s/%s %s->%s\n", awalk->hostname, awalk->testname, colorname(awalk->maxcolor), colorname(newcolor)); clear_interval(awalk); } awalk->maxcolor = newcolor; } } else { /* * Send one "recovered" message out now, then go to A_DEAD. * Don't update the color here - we want recoveries to go out * only if the alert color triggered an alert */ awalk->state = (newcolor == COL_BLUE) ? A_DISABLED : A_RECOVERED; } if (oldalertstatus != newalertstatus) { dbgprintf("Alert status changed from %d to %d\n", oldalertstatus, newalertstatus); clear_interval(awalk); } strcpy(awalk->ip, metadata[5]); awalk->cookie = atoi(metadata[11]); if (awalk->osname) xfree(awalk->osname); awalk->osname = (metadata[12] ? strdup(metadata[12]) : NULL); if (awalk->classname) xfree(awalk->classname); awalk->classname = (metadata[13] ? strdup(metadata[13]) : NULL); if (awalk->groups) xfree(awalk->groups); awalk->groups = (metadata[14] ? strdup(metadata[14]) : NULL); if (awalk->pagemessage) xfree(awalk->pagemessage); if (metadata[15]) { /* Modifiers are more interesting than the message itself */ awalk->pagemessage = (char *)malloc(strlen(awalk->hostname) + strlen(awalk->testname) + strlen(colorname(awalk->color)) + strlen(metadata[15]) + strlen(restofmsg) + 10); sprintf(awalk->pagemessage, "%s:%s %s\n%s\n%s", awalk->hostname, awalk->testname, colorname(awalk->color), metadata[15], restofmsg); } else { awalk->pagemessage = strdup(restofmsg); } } else if ((metacount > 5) && (strncmp(metadata[0], "@@ack", 5) == 0)) { /* @@ack|timestamp|sender|hostname|testname|hostip|expiretime */ /* * An ack is handled simply by setting the next * alert-time to when the ack expires. */ time_t nextalert = atoi(metadata[6]); dbgprintf("Got ack message from %s:%s\n", hostname, testname); traceprintf("@@ack: %s:%s now=%d, ackeduntil %d\n", hostname, testname, (int)now, (int)nextalert); awalk = find_active(hostname, testname); if (acklogfd) { int cookie = (awalk ? awalk->cookie : -1); int color = (awalk ? awalk->color : 0); fprintf(acklogfd, "%d\t%d\t%d\t%d\t%s\t%s.%s\t%s\t%s\n", (int)now, cookie, (int)((nextalert - now) / 60), cookie, "np_filename_not_used", hostname, testname, colorname(color), nlencode(restofmsg)); fflush(acklogfd); } if (awalk && (awalk->state == A_PAGING)) { traceprintf("Record updated\n"); awalk->state = A_ACKED; awalk->nextalerttime = nextalert; if (awalk->ackmessage) xfree(awalk->ackmessage); awalk->ackmessage = strdup(restofmsg); } else { traceprintf("No record\n"); } } else if ((metacount > 4) && (strncmp(metadata[0], "@@notify", 5) == 0)) { /* @@notify|timestamp|sender|hostname|testname|pagepath */ char *hwalk = find_name(hostnames, hostname); char *twalk = find_name(testnames, testname); char *pwalk = find_name(locations, (metadata[5] ? metadata[5] : "")); awalk = (activealerts_t *)calloc(1, sizeof(activealerts_t)); awalk->hostname = hwalk; awalk->testname = twalk; awalk->location = pwalk; awalk->cookie = -1; awalk->pagemessage = strdup(restofmsg); awalk->eventstart = getcurrenttime(NULL); awalk->state = A_NOTIFY; add_active(awalk->hostname, awalk); } else if ((metacount > 3) && ((strncmp(metadata[0], "@@drophost", 10) == 0) || (strncmp(metadata[0], "@@dropstate", 11) == 0))) { /* @@drophost|timestamp|sender|hostname */ /* @@dropstate|timestamp|sender|hostname */ xtreePos_t handle; handle = xtreeFind(hostnames, hostname); if (handle != xtreeEnd(hostnames)) { alertanchor_t *anchor = (alertanchor_t *)xtreeData(hostnames, handle); for (awalk = anchor->head; (awalk); awalk = awalk->next) awalk->state = A_DEAD; } } else if ((metacount > 4) && (strncmp(metadata[0], "@@droptest", 10) == 0)) { /* @@droptest|timestamp|sender|hostname|testname */ awalk = find_active(hostname, testname); if (awalk) awalk->state = A_DEAD; } else if ((metacount > 4) && (strncmp(metadata[0], "@@renamehost", 12) == 0)) { /* @@renamehost|timestamp|sender|hostname|newhostname */ /* * We handle rename's simply by dropping the alert. If there is still an * active alert for the host, it will have to be dealt with when the next * status update arrives. */ xtreePos_t handle; handle = xtreeFind(hostnames, hostname); if (handle != xtreeEnd(hostnames)) { alertanchor_t *anchor = (alertanchor_t *)xtreeData(hostnames, handle); for (awalk = anchor->head; (awalk); awalk = awalk->next) awalk->state = A_DEAD; } } else if ((metacount > 5) && (strncmp(metadata[0], "@@renametest", 12) == 0)) { /* @@renametest|timestamp|sender|hostname|oldtestname|newtestname */ /* * We handle rename's simply by dropping the alert. If there is still an * active alert for the host, it will have to be dealt with when the next * status update arrives. */ awalk = find_active(hostname, testname); if (awalk) awalk->state = A_DEAD; } else if (strncmp(metadata[0], "@@shutdown", 10) == 0) { running = 0; errprintf("Got a shutdown message\n"); continue; } else if (strncmp(metadata[0], "@@logrotate", 11) == 0) { char *fn = xgetenv("XYMONCHANNEL_LOGFILENAME"); if (fn && strlen(fn)) { reopen_file(fn, "a", stdout); reopen_file(fn, "a", stderr); if (tracefn) { stoptrace(); starttrace(tracefn); } } continue; } else if (strncmp(metadata[0], "@@reload", 8) == 0) { logprintf("Received reload request\n"); reloadconfig = 1; /* Nothing ... right now */ } else if (strncmp(metadata[0], "@@idle", 6) == 0) { /* Timeout */ } /* * When a burst of alerts happen, we get lots of alert messages * coming in quickly. So lets handle them in bunches and only * do the full alert handling once every 10 secs - that lets us * combine a bunch of alerts into one transmission process. */ if (nowtimer < (lastxmit+10)) continue; lastxmit = nowtimer; /* * Loop through the activealerts list and see if anything is pending. * This is an optimization, we could just as well just fork off the * notification child and let it handle all of it. But there is no * reason to fork a child process unless it is going to do something. */ configchanged = load_alertconfig(configfn, alertcolors, alertinterval); configchanged += load_holidays(0); if (configchanged) reloadconfig = 1; anytogo = 0; for (awalk = alistBegin(); (awalk); awalk = alistNext()) { int anymatch = 0; switch (awalk->state) { case A_NORECIP: if (!configchanged) break; /* The configuration has changed - switch NORECIP -> PAGING */ awalk->state = A_PAGING; clear_interval(awalk); /* Fall through */ case A_PAGING: if (have_recipient(awalk, &anymatch)) { if (awalk->nextalerttime <= now) anytogo++; } else { if (!anymatch) { awalk->state = A_NORECIP; cleanup_alert(awalk); } } break; case A_ACKED: if (awalk->nextalerttime <= now) { /* An ack has expired, so drop the ack message and switch to A_PAGING */ anytogo++; if (awalk->ackmessage) xfree(awalk->ackmessage); awalk->state = A_PAGING; } break; case A_RECOVERED: case A_DISABLED: case A_NOTIFY: anytogo++; break; case A_DEAD: break; } } dbgprintf("%d alerts to go\n", anytogo); if (anytogo) { pid_t childpid; childpid = fork(); if (childpid == 0) { /* The child */ start_alerts(); for (awalk = alistBegin(); (awalk); awalk = alistNext()) { switch (awalk->state) { case A_PAGING: if (awalk->nextalerttime <= now) { send_alert(awalk, notiflogfd); } break; case A_ACKED: /* Cannot be A_ACKED unless the ack is still valid, so no alert. */ break; case A_RECOVERED: case A_DISABLED: case A_NOTIFY: send_alert(awalk, notiflogfd); break; case A_NORECIP: case A_DEAD: break; } } finish_alerts(); /* Child does not continue */ exit(0); } else if (childpid < 0) { errprintf("Fork failed, cannot send alerts: %s\n", strerror(errno)); } } /* Update the state flag and the next-alert timestamp */ for (awalk = alistBegin(); (awalk); awalk = alistNext()) { switch (awalk->state) { case A_PAGING: if (awalk->nextalerttime <= now) awalk->nextalerttime = next_alert(awalk); break; case A_NORECIP: break; case A_ACKED: /* Still cannot get here except if ack is still valid */ break; case A_RECOVERED: case A_DISABLED: case A_NOTIFY: awalk->state = A_DEAD; /* Fall through */ case A_DEAD: cleanup_alert(awalk); break; } } clean_all_active(); } if (checkfn) save_checkpoint(checkfn); if (acklogfd) fclose(acklogfd); if (notiflogfd) fclose(notiflogfd); stoptrace(); MEMUNDEFINE(notiflogfn); MEMUNDEFINE(acklogfn); if (termsig >= 0) { errprintf("Terminated by signal %d\n", termsig); } return 0; } xymon-4.3.28/xymond/webfiles/0000775000076400007640000000000013037531515016333 5ustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/hostgraphs_header0000664000076400007640000000206411615226067021755 0ustar rpmbuildrpmbuild Xymon - Metrics Report &XYMONBODYHEADER
 
&XYMONLOGO
Metrics Report
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/graphs_header0000664000076400007640000000210511615226067021053 0ustar rpmbuildrpmbuild &XYMWEBBACKGROUND : Xymon - Status @ &XYMWEBDATE &XYMONBODYHEADER
 
&XYMONLOGO
Graphs
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/histlog_header0000664000076400007640000000237711615226067021253 0ustar rpmbuildrpmbuild Xymon Historical Status: &XYMWEBHOST - &XYMWEBSVC @ &LOGTIME &XYMONBODYHEADER
 
&XYMONLOGO
Historical Status
&XYMWEBHOST - &XYMWEBSVC
Log time
&LOGTIME


xymon-4.3.28/xymond/webfiles/notify_footer0000777000076400007640000000000013037531515024443 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/confreport_front0000664000076400007640000000477511415724561021667 0ustar rpmbuildrpmbuild


Explanation of Terms
Basics
AliasesNames for this host other than the primary name, e.g. a hostname used by a client installed on the server
Monitoring locationThe location of this host on the Xymon webpages
Comment
Description
Explanatory text about the host
Planned downtimeTime of day/week when the host monitoring is disabled
SLA Reporting PeriodTime of day/week where the status impacts the SLA availability calculation
Network tests
ServiceCorresponds to the column-name on the Xymon webpage
CriticalWhether this test appears on the Critical Systems view
C/Y/R limitsIf set, this is the number of failures that must happen before the status changes to Clear/Yellow/Red
SpecificsDetails about how this status is monitored
Local tests
ServiceCorresponds to the column-name on the Xymon webpage
CriticalWhether this test appears on the Critical view
C/Y/R limitsIf set, this is the number of failures that must happen before the status changes to Clear/Yellow/Red
ConfigurationDetails about how this status is monitored. NOTE: The exact thresholds for each test are configured on the client, and may differ from that listed here.
xymon-4.3.28/xymond/webfiles/histlog_footer0000777000076400007640000000000013037531515024604 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/repnormal_header0000664000076400007640000000231211615226067021566 0ustar rpmbuildrpmbuild Xymon Availability Report : &XYMWEBDATE &XYMONBODYHEADER
 
&XYMONLOGO
Availability Report
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/maint_footer0000777000076400007640000000000013037531515024243 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/report_header0000664000076400007640000000207611615226067021111 0ustar rpmbuildrpmbuild Xymon - Availability Report &XYMONBODYHEADER
 
&XYMONLOGO
Availability Report
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/maintact_footer0000777000076400007640000000000013037531515024733 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/maintact_header0000664000076400007640000000205611615226067021374 0ustar rpmbuildrpmbuild Xymon - Maintenance &XYMONBODYHEADER
 
&XYMONLOGO
Maintenance
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/report_form_weekly0000664000076400007640000000144211415724561022200 0ustar rpmbuildrpmbuild

Xymon Weekly Availability Report






xymon-4.3.28/xymond/webfiles/acknowledge_form0000664000076400007640000000212211070452713021556 0ustar rpmbuildrpmbuild
Estimated time to resolve issue: minutes
Explanation/Cause of problem:
Acknowledgment Code:


xymon-4.3.28/xymond/webfiles/zoom.js0000664000076400007640000005473412610344744017674 0ustar rpmbuildrpmbuild xymon-4.3.28/xymond/webfiles/critical_header0000664000076400007640000000232012657227265021370 0ustar rpmbuildrpmbuild &XYMWEBBACKGROUND : Xymon - Status @ &XYMWEBDATE &XYMONBODYHEADER
 
&XYMONLOGO
Current Critical Systems
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/columndoc_footer0000777000076400007640000000000013037531515025116 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/event_form0000664000076400007640000001364611535462534020441 0ustar rpmbuildrpmbuild
Starting minutes ago ( Default 1440 )
 - OR - 
From: (ccyy/mm/dd@hh:mm:ss)
To: (ccyy/mm/dd@hh:mm:ss)


Max # of events   ( Default 100 )
Hosts to match   ( ex: ^host.*$ )
Hosts to skip   ( ex: ^host.*$ )
Pages to match  
Pages to skip   ( ex: ^webservers/.*$ )
Tests to match   ( ex: cpu|vmstat )
Tests to skip   ( ex: cpu|vmstat )
Colors to match   ( ex: red|green )
Ignore dialup hosts    


xymon-4.3.28/xymond/webfiles/perfdata_form0000664000076400007640000000776211535424634021107 0ustar rpmbuildrpmbuild
Hosts to match   ( ex: ^host.*$ )
Hosts to skip   ( ex: ^host.*$ )
Pages to match  
Pages to skip   ( ex: ^webservers/.*$ )
Start time   ( ex: 2009/01/15 )
End time   ( ex: 2009/02/01 )
 
Format    
Custom RRD filename    
Custom dataset    


xymon-4.3.28/xymond/webfiles/snapnormal_header0000664000076400007640000000230211615226067021740 0ustar rpmbuildrpmbuild Xymon Snapshot Report : &XYMWEBDATE &XYMONBODYHEADER
 
&XYMONLOGO
Snapshot Report
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/acknowledge_footer0000777000076400007640000000000013037531515025416 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/maint_form0000664000076400007640000001440712277125340020417 0ustar rpmbuildrpmbuild
Current StatusSelect what to Disable
&DISABLELIST
Currently disabled tests
 
&SCHEDULELIST
Scheduled actions
HostsTests 
 
Filter hostlist
Hostname pattern
Pagename pattern
IP address pattern
Class pattern
 
Cause: 
Disable for   
Disable until
    - OR - until OK:
 
Disable now
Schedule disable at
 
   Preview
xymon-4.3.28/xymond/webfiles/report_form_daily0000664000076400007640000000155111415724561022003 0ustar rpmbuildrpmbuild
Xymon Daily Availability Report






xymon-4.3.28/xymond/webfiles/snapnongreen_header0000664000076400007640000000212311615226067022264 0ustar rpmbuildrpmbuild &XYMWEBBACKGROUND : Xymon - Snapshot &XYMONBODYHEADER
 
&XYMONLOGO
Snapshot - All non-green Systems
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/stdnormal_footer0000664000076400007640000000051411535462534021644 0ustar rpmbuildrpmbuild


Xymon &XYMONDREL
&XYMONBODYFOOTER xymon-4.3.28/xymond/webfiles/replog_footer0000777000076400007640000000000013037531515024423 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/confreport_footer0000664000076400007640000000002111070452713022003 0ustar rpmbuildrpmbuild xymon-4.3.28/xymond/webfiles/critedit_form0000664000076400007640000000775311535462534021131 0ustar rpmbuildrpmbuild
Edit Critical Systems

Host:  Test: 
Last update by: &CRITEDITUPDINFO

Priority: 
 
Monitoring time:   from     to  
Start monitoring    
Stop monitoring    
 
Resolver group: 
Instruction: 
 
 
   Even if it has clones:

Clones of this host: Clone this host to:



xymon-4.3.28/xymond/webfiles/snapnongreen_footer0000777000076400007640000000000013037531515025630 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/graphs_footer0000777000076400007640000000000013037531515024417 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/ghosts_footer0000777000076400007640000000000013037531515024442 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/trends_form0000664000076400007640000001633212050700657020604 0ustar rpmbuildrpmbuild
Trends period

Days:  Hours:  Minutes:  Seconds: 
 - OR - 
From: (ccyy/mm/dd@hh:mm:ss)
To: (ccyy/mm/dd@hh:mm:ss)
Show last
Show last
Show this

xymon-4.3.28/xymond/webfiles/hostlist_form0000664000076400007640000000360111535462534021157 0ustar rpmbuildrpmbuild
Page

Select
 Hosts w/ client  Hosts w/ ping  All hosts

Include
Page path
Comment
Downtime
NK columns
NK time
SLA period
SLA level
Network

 
xymon-4.3.28/xymond/webfiles/info_header0000664000076400007640000000564512647753376020554 0ustar rpmbuildrpmbuild Xymon - &XYMWEBHOST Host Information &XYMONBODYHEADER
 
&XYMONLOGO
&XYMWEBHOST - Information
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/trends_header0000664000076400007640000000230012647753376021101 0ustar rpmbuildrpmbuild Xymon - &XYMWEBHOST Host Trends &XYMONBODYHEADER
 
&XYMONLOGO
&XYMWEBHOST - Trends
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/critmulti_header0000664000076400007640000000264412657227265021623 0ustar rpmbuildrpmbuild &XYMWEBBACKGROUND : Xymon - Status @ &XYMWEBDATE &XYMONBODYHEADER
 
&XYMONLOGO
Current Critical Systems
&XYMWEBDATE

 
&DIVIDERTEXT
 
xymon-4.3.28/xymond/webfiles/chpasswd_footer0000777000076400007640000000000013037531515024747 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/divider_footer0000664000076400007640000000001311630352060021245 0ustar rpmbuildrpmbuild

xymon-4.3.28/xymond/webfiles/useradm_header0000664000076400007640000000206011615226067021227 0ustar rpmbuildrpmbuild Xymon - Manage Users &XYMONBODYHEADER
 
&XYMONLOGO
Manage Users
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/useradm_footer0000777000076400007640000000000013037531515024573 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/hostsvc_header0000664000076400007640000000256011615226067021265 0ustar rpmbuildrpmbuild &XYMWEBCOLOR : Xymon - &XYMWEBSVC status for &XYMWEBHOST (&XYMWEBIP) @ &XYMWEBDATE &XYMONBODYHEADER
 
&XYMONLOGO
&XYMWEBHOST - &XYMWEBSVC
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/info_footer0000777000076400007640000000000013037531515024066 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/confreport_header0000664000076400007640000000020611415724561021750 0ustar rpmbuildrpmbuild Xymon configuration Report xymon-4.3.28/xymond/webfiles/findhost_footer0000777000076400007640000000000013037531515024751 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/hist_footer0000777000076400007640000000000013037531515024102 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/snapnormal_footer0000777000076400007640000000000013037531515025305 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/perfdata_header0000664000076400007640000000223511615226067021361 0ustar rpmbuildrpmbuild &XYMWEBBACKGROUND : Xymon - Performance data @ &XYMWEBDATE &XYMONBODYHEADER
 
&XYMONLOGO
Performance data
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/snapcritical_header0000664000076400007640000000213411615226067022245 0ustar rpmbuildrpmbuild &XYMWEBBACKGROUND : Xymon - Snapshot @ &XYMWEBDATE &XYMONBODYHEADER
 
&XYMONLOGO
Snapshot - Critical Systems
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/findhost_header0000664000076400007640000000237311615226067021414 0ustar rpmbuildrpmbuild Xymon - Find Host &XYMONBODYHEADER
 
&XYMONLOGO
Find Host
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/report_footer0000777000076400007640000000000013037531515024446 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/perfdata_footer0000777000076400007640000000000013037531515024721 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/critedit_footer0000777000076400007640000000000013037531515024742 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/replog_header0000664000076400007640000000216711615226067021067 0ustar rpmbuildrpmbuild Xymon Availability Report : &XYMWEBHOST - &XYMWEBSVC &XYMWEBDATE &XYMONBODYHEADER
 
&XYMONLOGO
Availability
&XYMWEBHOST - &XYMWEBSVC
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/acknowledge_header0000664000076400007640000000207211615226067022055 0ustar rpmbuildrpmbuild Xymon - Acknowledge Alert &XYMONBODYHEADER
 
&XYMONLOGO
Acknowledge Alert
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/event_footer0000777000076400007640000000000013037531515024254 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/chpasswd_header0000664000076400007640000000206612615453444021413 0ustar rpmbuildrpmbuild Xymon - Change Password &XYMONBODYHEADER
 
&XYMONLOGO
Change Password
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/useradm_form0000664000076400007640000000155211074633713020746 0ustar rpmbuildrpmbuild
Username: Password:

 
xymon-4.3.28/xymond/webfiles/hostgraphs_footer0000777000076400007640000000000013037531515025315 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/stdnongreen_header0000664000076400007640000000232112657227265022125 0ustar rpmbuildrpmbuild &XYMWEBBACKGROUND : Xymon - Status @ &XYMWEBDATE &XYMONBODYHEADER
 
&XYMONLOGO
Current non-green Systems
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/maint_header0000664000076400007640000001103411615612165020676 0ustar rpmbuildrpmbuild Xymon - Maintenance &XYMONBODYHEADER
 
&XYMONLOGO
Maintenance
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/stdcritical_header0000664000076400007640000000232012657227265022103 0ustar rpmbuildrpmbuild &XYMWEBBACKGROUND : Xymon - Status @ &XYMWEBDATE &XYMONBODYHEADER
 
&XYMONLOGO
Current Critical Systems
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/acknowledgements_form0000664000076400007640000001373212503132277022640 0ustar rpmbuildrpmbuild
Starting minutes ago ( Default 1440 )
 - OR - 
From: (ccyy/mm/dd@hh:mm:ss)
To: (ccyy/mm/dd@hh:mm:ss)


Max # of acknowledgements   ( Default 100 )
Hosts to match   ( ex: ^host.*$ )
Hosts to skip   ( ex: ^host.*$ )
Pages to match  
Pages to skip   ( ex: ^webservers/.*$ )
Tests to match   ( ex: cpu|vmstat )
Tests to skip   ( ex: cpu|vmstat )
Operators to match   ( ex: admin@test.com )
Operators to skip   ( ex: admin@test.com )


xymon-4.3.28/xymond/webfiles/snapshot_header0000664000076400007640000000206611615226067021434 0ustar rpmbuildrpmbuild Xymon - Snapshot Report &XYMONBODYHEADER
 
&XYMONLOGO
Snapshot Report
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/ghosts_header0000664000076400007640000000206211615226067021100 0ustar rpmbuildrpmbuild Xymon - Ghost Clients &XYMONBODYHEADER
 
&XYMONLOGO
Ghost Clients
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/notify_header0000664000076400007640000000223511615226067021103 0ustar rpmbuildrpmbuild &XYMWEBBACKGROUND : Xymon - Notification Log @ &XYMWEBDATE &XYMONBODYHEADER
 
&XYMONLOGO
Notification Log
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/topchanges_header0000664000076400007640000000225011615226067021723 0ustar rpmbuildrpmbuild &XYMWEBBACKGROUND : Xymon - Top Changes @ &XYMWEBDATE &XYMONBODYHEADER
 
&XYMONLOGO
Most changing hosts and services
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/topchanges_footer0000777000076400007640000000000013037531515025266 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/hostsvc_footer0000777000076400007640000000000013037531515024624 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/notify_form0000664000076400007640000001372311535462534020624 0ustar rpmbuildrpmbuild
Starting minutes ago ( Default 1440 )
 - OR - 
From: (ccyy/mm/dd@hh:mm:ss)
To: (ccyy/mm/dd@hh:mm:ss)


Max # of notifications   ( Default 100 )
Hosts to match   ( ex: ^host.*$ )
Hosts to skip   ( ex: ^host.*$ )
Pages to match  
Pages to skip   ( ex: ^webservers/.*$ )
Tests to match   ( ex: cpu|vmstat )
Tests to skip   ( ex: cpu|vmstat )
Recipients to match   ( ex: admin@test.com )
Recipients to skip   ( ex: admin@test.com )


xymon-4.3.28/xymond/webfiles/snapcritical_footer0000777000076400007640000000000013037531515025607 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/trends_footer0000777000076400007640000000000013037531515024432 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/findhost_form0000664000076400007640000000161311070452713021115 0ustar rpmbuildrpmbuild

Pattern to look for

Case Sensitive        Jump to page       
xymon-4.3.28/xymond/webfiles/stdnongreen_footer0000777000076400007640000000000013037531515025461 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/report_form0000664000076400007640000000275511415724561020630 0ustar rpmbuildrpmbuild
Xymon Availability Report

- to -




xymon-4.3.28/xymond/webfiles/snapshot_footer0000777000076400007640000000000013037531515024772 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/acknowledgements_footer0000777000076400007640000000000013037531515026465 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/critack_form0000664000076400007640000000323212263613340020716 0ustar rpmbuildrpmbuild
Priority Resolver group Documentation
&CRITACKTTPRIO &CRITACKTTGROUP Host info
Host docs
&CRITACKTTEXTRA
  Host-ack   
xymon-4.3.28/xymond/webfiles/critedit_header0000664000076400007640000000210611615226067021377 0ustar rpmbuildrpmbuild Xymon - Critical Systems editor &XYMONBODYHEADER
 
&XYMONLOGO
Critical Systems editor
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/divider_header0000664000076400007640000000041011630352060021200 0ustar rpmbuildrpmbuild
 
&DIVIDERTEXT
 
xymon-4.3.28/xymond/webfiles/acknowledgements_header0000664000076400007640000000224312503132277023120 0ustar rpmbuildrpmbuild &XYMWEBBACKGROUND : Xymon - Acknowledgement Log @ &XYMWEBDATE &XYMONBODYHEADER
 
&XYMONLOGO
Acknowledgement Log
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/snapshot_form0000664000076400007640000000177711415724561021157 0ustar rpmbuildrpmbuild
Xymon Snapshot Report






xymon-4.3.28/xymond/webfiles/confreport_back0000664000076400007640000000000011070452713021402 0ustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/report_form_monthly0000664000076400007640000000144411415724561022374 0ustar rpmbuildrpmbuild
Xymon Monthly Availability Report






xymon-4.3.28/xymond/webfiles/chpasswd_form0000664000076400007640000000217012615453444021122 0ustar rpmbuildrpmbuild
Current Username:
Existing Password:
New Password:
Repeat New Password:
xymon-4.3.28/xymond/webfiles/stdcritical_footer0000777000076400007640000000000013037531515025440 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/event_header0000664000076400007640000000221511615226067020712 0ustar rpmbuildrpmbuild &XYMWEBBACKGROUND : Xymon - Eventlog @ &XYMWEBDATE &XYMONBODYHEADER
 
&XYMONLOGO
Eventlog
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/stdnormal_header0000664000076400007640000000250712657227265021610 0ustar rpmbuildrpmbuild &XYMWEBBACKGROUND : Xymon - Status @ &XYMWEBDATE &XYMONBODYHEADER
 
&XYMONLOGO
Current Status
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/hostlist_header0000664000076400007640000000206211615226067021442 0ustar rpmbuildrpmbuild Xymon - List of Hosts &XYMONBODYHEADER
 
&XYMONLOGO
List of Hosts
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/columndoc_header0000664000076400007640000000210311615226067021550 0ustar rpmbuildrpmbuild &XYMWEBBACKGROUND : Xymon - Documentation &XYMONBODYHEADER
 
&XYMONLOGO
Column Info
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/hist_header0000664000076400007640000000234111615226067020540 0ustar rpmbuildrpmbuild &XYMWEBBACKGROUND : Xymon - History @ &XYMWEBDATE &XYMONBODYHEADER
 
&XYMONLOGO
History
&XYMWEBHOST - &XYMWEBSVC
&XYMWEBDATE


xymon-4.3.28/xymond/webfiles/repnormal_footer0000777000076400007640000000000013037531515025132 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/hostlist_footer0000777000076400007640000000000013037531515025004 2stdnormal_footerustar rpmbuildrpmbuildxymon-4.3.28/xymond/webfiles/hostgraphs_form0000664000076400007640000000371012615641657021476 0ustar rpmbuildrpmbuild
Metrics Report

- to -






xymon-4.3.28/xymond/webfiles/topchanges_form0000664000076400007640000001473111535462534021447 0ustar rpmbuildrpmbuild
From: (ccyy/mm/dd@hh:mm:ss)
To: (ccyy/mm/dd@hh:mm:ss)


Hosts to match   ( ex: ^host.*$ )
Hosts to skip   ( ex: ^host.*$ )
Pages to match  
Pages to skip   ( ex: ^webservers/.*$ )
Tests to match   ( ex: cpu|vmstat )
Tests to skip   ( ex: cpu|vmstat )
Colors to match   ( ex: red|green )
Only Critical systems     Ignore dialup hosts    
Rank by    
Show top    


xymon-4.3.28/xymond/webfiles/critical_footer0000664000076400007640000000456411623437505021442 0ustar rpmbuildrpmbuild
Priority Color Age Acked Eventlog  



Xymon &XYMONDREL
&XYMONBODYFOOTER xymon-4.3.28/xymond/xymond_channel.80000664000076400007640000000673113037531444017642 0ustar rpmbuildrpmbuild.TH XYMOND_CHANNEL 8 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME xymond_channel \- Feed a xymond channel to a worker module .SH SYNOPSIS .B "xymond_channel --channel=CHANNEL [options] workerprogram [worker-options]" .SH DESCRIPTION xymond_channel hooks into one of the .I xymond(8) channels that provide information about events occurring in the Xymon system. It retrieves messages from the xymond daemon, and passes them on to the \fBworkerprogram\fR on the STDIN (file descripter 1) of the worker program. Worker programs can then handle messages as they like. A number of worker programs are shipped with xymond, e.g. .I xymond_filestore(8) .I xymond_history(8) .I xymond_alert(8) .I xymond_rrd(8) If you want to write your own worker module, a sample worker module is provided as part of the xymond distribution in the xymond_sample.c file. This illustrates how to easily fetch and parse messages. .SH OPTIONS xymond_channel accepts a few options. .IP "--channel=CHANNELNAME" Specifies the channel to receive messages from, only one channel can be used. This option is required. The following channels are available: .br "status" receives all Xymon status- and summary-messages .br "stachg" receives information about status changes .br "page" receives information about statuses triggering alerts .br "data" receives all Xymon "data" messages .br "notes" receives all Xymon "notes" messages .br "enadis" receives information about hosts being disabled or enabled. .IP "--filter=EXPRESSION" EXPRESSION is a Perl-compatible regular expression. xymond_channel will match the first line of each message against this expression, and silently drops any message that does not match the expression. Especially useful for custom worker modules and during testing, to limit the amount of data that the module must process. .br Note that messages for "logrotate", "shutdown", "drophost", "renamehost", "droptest" and "renametest" are always forwarded by xymond_channel, whether they match the filter or not. .IP "--msgtimeout=TIMEOUT" Modify the default timeout (30 seconds) for the worker module to handle a message. If a message is not handled within this time, it is considered lost. You normally do not have to modify this unless you have an extremely busy server. .IP "--daemon" xymond_channel is normally started by .I xymonlaunch(8) as a task defined in the .I tasks.cfg(5) file. If you are not using xymonlaunch, then starting xymond_channel with this option causes it to run as a stand-alone background task. .IP "--pidfile=FILENAME" If running as a stand-alone daemon, xymond_channel will save the process-ID of the daemon in FILENAME. This is useful for automated startup- and shutdown- scripts. .IP "--env=FILENAME" Loads the environment variables defined in FILENAME before starting xymond_channel. This is normally used only when running as a stand-alone daemon; if xymond_channel is started by xymonlaunch, then the environment is controlled by the task definition in the .I tasks.cfg(5) file. .IP "--log=FILENAME" Redirect output to this log-file. .IP "--md5 / --no-md5" Enable/disable checksumming of messages passed from xymond_channel to the worker module. This may be useful if you suspect that data may be corrupted, e.g. when sent to a remote worker module. Note that enabling this may break communication with old versions of Xymon worker modules. Default: Disabled. .IP "--debug" Enable debugging output. .SH FILES This program does not use any configuration files. .SH "SEE ALSO" xymond(8), xymon(7) xymon-4.3.28/CREDITS0000664000076400007640000000330412610344744014237 0ustar rpmbuildrpmbuildThe following people have contributed to the development of Xymon, Hobbit, bbgen and the bbtest tools, by helping me with testing, suggesting new features or improvements, pointing out bugs, or even coming up with patches. I am very grateful for their help. Marco Avvisano Paul Backer Axel Beckert Olivier Beau Adamets Bluejay Brian Buchanan Massimo Carnevali Japheth Cleaver Stef Coene Craig Cook Douwe Dijkstra Francesco Duranti Lars Ebeling Mark Felder David Ferrest Franco Gasperino Tom Georgoulias Laurent Grilli Kevin Hanrahan Malcolm Hunter Knud Højgaard Asif Iqbal Charles Jones Thomas J Jones Uwe Kirbach Joshua Krause Jeremy Laidman Patrick Lin Brian Lynch Werner Maier Thomas Mattsson Daniel J McDonald Werner Michels Christian Perrier Jure Peternel William Richardson Torsten Richter Chris Ricker Tim Rotunda Thomas Rucker Mirko Saam Thomas Schäfer Tom Schmidt Eric Schwimmer Bill Simaz Andy Smith Bernard Spil Gavin Stone-Tolcher Jeff Stoner David Stuffle Christian Thibodeau John Thurston Rick Waegner Rob Watson Several others have contributed bug reports and helped with testing the beta releases - Xymon would not be as good as it is without their efforts. It would have been hard to implement Xymon without the existing libraries for lots of stuff: libCURL (although this is no longer used, it was quite important while it was in use) http://curl.haxx.se/ Daniel Steenberg and others libCARES Based on the ARES library by Greg Hudson of MIT, C-ARES provides asynchronous parallel DNS lookups. http://c-ares.haxx.se/ Greg Hudson, Daniel Steenberg and others RRDtool http://oss.oetiker.ch/rrdtool/ OpenSSL http://www.openssl.org/ OpenLDAP http://www.openldap.org/ PCRE http://www.pcre.org/ xymon-4.3.28/build/0000775000076400007640000000000013037531513014312 5ustar rpmbuildrpmbuildxymon-4.3.28/build/Makefile.test-ssl30000664000076400007640000000034412674126516017624 0ustar rpmbuildrpmbuildinclude Makefile.$(OS) test-compile: @$(CC) $(CFLAGS) $(OSSLINC) -o test-ssl3.o -c test-ssl3.c test-link: @$(CC) $(CFLAGS) $(OSSLLIB) -o test-ssl3 test-ssl3.o -lssl -lcrypto $(NETLIBS) clean: @rm -f test-ssl3.o test-ssl3 xymon-4.3.28/build/bb-commands.sh0000775000076400007640000000243611535462534017047 0ustar rpmbuildrpmbuild#!/bin/sh # $Id: bb-commands.sh 6650 2011-03-08 17:20:28Z storner $ # Script to pick up most of the commands used by BB extension scripts. # This is used during installation, to build a xymonserver.cfg that # includes these commands so that extension scripts can run from # xymonserver.cfg without having to do special setups. findbin() { MYP="`echo ${PATH} | sed -e 's/:/ /g'`" for D in $MYP do if test -x $D/$1; then echo "${D}/${1}" fi done } echo "" echo "# The following defines a bunch of commands that BB extensions expect to be present." echo "# Xymon does not use them, but they are provided here so if you use BB extension" echo "# scripts, then they will hopefully run without having to do a lot of tweaking." echo "" for CMD in uptime awk cat cp cut date egrep expr find grep head id ln ls mv rm sed sort tail top touch tr uniq who do ENVNAME=`echo $CMD | tr "[a-z]" "[A-Z]"` PGM=`findbin $CMD | head -n 1` echo "${ENVNAME}=\"${PGM}\"" done # WC is special PGM=`findbin wc | head -n 1` echo "WC=\"${PGM} -l\"" echo "WCC=\"${PGM}\"" # DFCMD is an alias for DF PGM=`findbin df | head -n 1` echo "# DF,DFCMD and PS are for compatibility only, NOT USED by the Xymon client" echo "DF=\"${PGM} -Pk\"" echo "DFCMD=\"${PGM} -Pk\"" echo "PS=\"ps ax\"" echo "" echo "MAXLINE=\"32768\"" xymon-4.3.28/build/test-uname.c0000664000076400007640000000040712523024624016540 0ustar rpmbuildrpmbuild#include #include #include int main(int argc, char *argv[]) { struct utsname u_name; if (uname(&u_name) == -1) return -1; printf("system name is: %s, node name is %s\n", u_name.sysname, u_name.nodename); return 0; } xymon-4.3.28/build/test-sysselecth.c0000664000076400007640000000023711070452713017622 0ustar rpmbuildrpmbuild#include #include #include #include #include int main(int argc, char *argv[]) { return 0; } xymon-4.3.28/build/Makefile.NetBSD0000664000076400007640000000161212006166517017033 0ustar rpmbuildrpmbuild# Xymon compile-time settings for NetBSD systems # From Emmanuel Dreyfus. # OSDEF = -DBSD # NETLIBS: None needed NETLIBS = # # Compile flags for normal build PKGDIR?=/usr/pkg CC= gcc GCCVER := $(shell gcc -dumpversion|cut -d. -f1) ifeq ($(GCCVER),4) CFLAGS = -g -O2 -Wall -Wno-unused -Wno-pointer-sign -D_REENTRANT $(LFSDEF) $(OSDEF) \ -I${PKGDIR}/include -L${PKGDIR}/lib, -Wl,--rpath=${PKGDIR}/lib else CFLAGS = -g -O2 -Wall -Wno-unused -D_REENTRANT $(LFSDEF) $(OSDEF) \ -I${PKGDIR}/include -L${PKGDIR}/lib, -Wl,--rpath=${PKGDIR}/lib endif RPATH = "-Wl,--rpath," # Compile flags for debugging # CFLAGS = -g -DDEBUG -Wall -D_REENTRANT $(LFSDEF) $(OSDEF) \ -I${PKGDIR}/include -L${PKGDIR}/lib, -Wl,--rpath=${PKGDIR}/lib # Mail program: This must support "CMD -s SUBJECT ADDRESS" to send out a mail with a subject # Typically, this will be "mail" or "mailx" MAILPROGRAM="mail" xymon-4.3.28/build/dorelease.sh0000775000076400007640000000034312277655770016635 0ustar rpmbuildrpmbuild#!/bin/sh VERSION="$1" if [ "$VERSION" = "" ] then echo "$0 VERSION" exit 1 fi ./build/generate-md5.sh >build/md5.dat.new mv build/md5.dat.new build/md5.dat ./build/updmanver $VERSION ./build/makehtml.sh $VERSION exit 0 xymon-4.3.28/build/convert-bbservices0000775000076400007640000000070611535462534020057 0ustar rpmbuildrpmbuild#!/bin/sh # Script to convert a bbgen v3 protocols.cfg file to the # [NAME] section delimited format used in Xymon v4 (starting with RC3). FN="$1" if test ! -r "${FN}"; then exit 0; fi sed -e 's/^service \(.*\)/\[\1\]/' < "${FN}" >"${FN}.converted" cmp -s "${FN}" "${FN}.converted" if test $? -eq 0; then rm -f "${FN}.converted"; exit 0; fi if test -f "${FN}.v3"; then rm -f "${FN}.v3"; fi mv "${FN}" "${FN}.v3" mv "${FN}.converted" "${FN}" exit 0 xymon-4.3.28/build/Makefile.SCO_SV0000664000076400007640000000122512006166517017010 0ustar rpmbuildrpmbuild# Xymon compile-time settings for SCO_SV (tested on SCO_SV 5.0.5 i386) OSDEF = -DSCO_SV # SCO_SV need this NETLIBS = -lsocket -lnsl # Compile flags for normal build CC = gcc GCCVER := $(shell gcc -dumpversion|cut -d. -f1) ifeq ($(GCCVER),4) CFLAGS = -g -O2 -Wall -Wno-unused -Wno-pointer-sign -D_REENTRANT $(LFSDEF) $(OSDEF) else CFLAGS = -g -O2 -Wall -Wno-unused -D_REENTRANT $(LFSDEF) $(OSDEF) endif # Compile flags for debugging # CFLAGS = -g -DDEBUG -Wall -D_REENTRANT $(LFSDEF) $(OSDEF) # Mail program: This must support "CMD -s SUBJECT ADDRESS" to send out a mail with a subject # Typically, this will be "mail" or "mailx" MAILPROGRAM="mailx" xymon-4.3.28/build/test-ssl2.c0000664000076400007640000000064012000050736016306 0ustar rpmbuildrpmbuild#include #include #include #include #include #if !defined(OPENSSL_VERSION_NUMBER) || (OPENSSL_VERSION_NUMBER < 0x00905000L) #error SSL-protocol testing requires OpenSSL version 0.9.5 or later #endif int main(int argc, char *argv[]) { SSL_CTX *ctx; SSL_library_init(); ctx = SSL_CTX_new(SSLv2_client_method()); return 0; } xymon-4.3.28/build/test-vsnprintf.c0000664000076400007640000000067511070452713017473 0ustar rpmbuildrpmbuild#include #include #include #include #include #include #include #include void errprintf(const char *fmt, ...) { char msg[4096]; va_list args; va_start(args, fmt); vsnprintf(msg, sizeof(msg), fmt, args); va_end(args); } int main(int argc, char *argv[]) { errprintf("testing ... %d %d %d\n", 1, 2, 3); return 0; } xymon-4.3.28/build/clock-gettime-librt.sh0000775000076400007640000000120712003325253020504 0ustar rpmbuildrpmbuild echo "Checking for clock_gettime() requiring librt ..." LIBRTDEF="" cd build OS=`uname -s | sed -e's@/@_@g'` $MAKE -f Makefile.test-clockgettime-librt clean OS=`uname -s | sed -e's@/@_@g'` $MAKE -f Makefile.test-clockgettime-librt test-link 1>/dev/null 2>&1 if [ $? -ne 0 ]; then OS=`uname -s | sed -e's@/@_@g'` $MAKE -f Makefile.test-clockgettime-librt test-link-rt 1>/dev/null 2>&1 if [ $? -eq 0 ]; then echo "clock_gettime() requires librt" LIBRTDEF="-lrt" else echo "clock_gettime() not present, but this should be OK" fi OS=`uname -s | sed -e's@/@_@g'` $MAKE -f Makefile.test-clockgettime-librt clean fi cd .. xymon-4.3.28/build/test-rrd.c0000664000076400007640000000124611535462534016234 0ustar rpmbuildrpmbuild#include #include int main(int argc, char *argv[]) { char *rrdargs[] = { "rrdgraph", "xymongen.png", "-s", "e - 48d", "--title", "xymongen runtime last 48 days", "-w576", "-v", "Seconds", "-a", "PNG", "DEF:rt=xymongen.rrd:runtime:AVERAGE", "AREA:rt#00CCCC:Run Time", "COMMENT: Timestamp", NULL }; char **calcpr=NULL; int pcount, result, xsize, ysize; double ymin, ymax; for (pcount = 0; (rrdargs[pcount]); pcount++); rrd_clear_error(); #ifdef RRDTOOL12 result = rrd_graph(pcount, rrdargs, &calcpr, &xsize, &ysize, NULL, &ymin, &ymax); #else result = rrd_graph(pcount, rrdargs, &calcpr, &xsize, &ysize); #endif return 0; } xymon-4.3.28/build/snmp.sh0000775000076400007640000000050111070452713015621 0ustar rpmbuildrpmbuild echo "Checking for Net-SNMP ..." SNMPINC="" SNMPLIB="" VERSION=`net-snmp-config --version` if test $? -eq 0 then echo "Found Net-SNMP version $VERSION" DOSNMP=yes else sleep 3 echo "Could not find Net-SNMP (net-snmp-config command fails)" echo "Continuing with SNMP support disabled." DOSNMP=no fi xymon-4.3.28/build/md5.dat0000664000076400007640000006227412661715547015521 0ustar rpmbuildrpmbuildmd5:2aef75abd6973d322c5ab1b1d52d2a4f webfiles/acknowledge_form md5:a76f9c67d39286495adf558ba7f4a412 webfiles/acknowledge_form md5:c763137d2728671f4e34af9b213cfd63 webfiles/acknowledge_form md5:205e90ad0bd8da45eaf60af92af3671c webfiles/acknowledge_header md5:43351eb1cf5732e0d03fdc79fd35c8b4 webfiles/acknowledge_header md5:497b4840642f76ac9c79ec8cde7683e3 webfiles/acknowledge_header md5:5c8e8c31770e200a2874a3065bac7b69 webfiles/acknowledge_header md5:6d850290b2b67c67d93ab11dbd33ed40 webfiles/acknowledge_header md5:8a9daf4a620fd82b40f375823a1dd4a8 webfiles/acknowledge_header md5:d79fb47e79f7d29d51a7325a9d243a7a webfiles/acknowledge_header md5:db9a4cba68249970f061f3d96ecd3eb9 webfiles/acknowledge_header md5:e81bf64853683dc48ac1daa8be2dc4c8 webfiles/acknowledge_header md5:f5fff2638b80aa0b05f7dc6f53551e44 webfiles/acknowledge_header md5:373e21f4981ec788d84bebb524879ecb webfiles/acknowledgements_form md5:c92c811a597b27efe580877008e847a4 webfiles/acknowledgements_header md5:0a6a33b186d06ea3b1ce20dd2da0e28e webfiles/bb2_header md5:493c4d72368efb374e5f3009097eb922 webfiles/bb2_header md5:4dedb331a60d9c8e253e3db341722812 webfiles/bb2_header md5:57ce6cc343e9de8a42e4ad34ac348ea8 webfiles/bb2_header md5:64c4e1eff77b5d76eccf58a90fdde99e webfiles/bb2_header md5:c7dd652fac52bae36584391f66e06346 webfiles/bb2_header md5:f012d6c2991d25ca65df1cfd2dbbc920 webfiles/bb2_header md5:679ecf0460d9ee066b53703edfb45bf5 webfiles/bb_footer md5:b927ca734b83973f47762278b1015d32 webfiles/bb_footer md5:c8564c73cec7da1e297ba94ed56f693a webfiles/bb_footer md5:d507ae62602354e576423a7216e875fa webfiles/bb_footer md5:dab9ebea0665fc43eb5beb70d4a02756 webfiles/bb_footer md5:474bc71541cb592df74511a22863cc86 webfiles/bb_header md5:4ac5d2b7f12e01ac6d474a9a3ebd19ce webfiles/bb_header md5:55546fa53e7cef87d5161132376a4dd5 webfiles/bb_header md5:b4faefac3b7b3bf2687ff86b567c616f webfiles/bb_header md5:c9fc71f108007688f15b583aa36fda39 webfiles/bb_header md5:d53ac4c4d96c82c0a03e77cc0d3ae99e webfiles/bb_header md5:e39355b7be74b49b49f8cf0650f43284 webfiles/bb_header md5:1d9e995b3778cf2c40529b47a7af8739 webfiles/bbnk_header md5:5035b17fa863349fdf2ed10524f1e753 webfiles/bbnk_header md5:9094360854ab61a4d2f035a4108ae8c9 webfiles/bbnk_header md5:a3f93fea81ac47b1d78706f6dd0689fc webfiles/bbnk_header md5:b33729d38c73e2ce04514c30a0058f20 webfiles/bbnk_header md5:eb11ca199fb132916136d85ea2237068 webfiles/bbnk_header md5:ebefec59449af568839fd4c3b99c944a webfiles/bbnk_header md5:2fae67a97ac7d2dd1d029416dff48389 webfiles/bbrep_header md5:6a896754a4a7980674c15d42e1f10ba7 webfiles/bbrep_header md5:811f9be38e8554d21d368b1a1097e923 webfiles/bbrep_header md5:9ba890901af2d23bd9344f7a720a43b9 webfiles/bbrep_header md5:d03f2266e60ad6f88e5df878492133bd webfiles/bbrep_header md5:eb6fefe16aade1408f3956ef2c918d9e webfiles/bbrep_header md5:fe409202eed8f8f3f2fffbe35d14820b webfiles/bbrep_header md5:6a801ecc0819d2d5c505945f367b670c webfiles/bbsnap2_header md5:6cecb03deb4f505479e1f2cf582c3bf4 webfiles/bbsnap2_header md5:90f22e6c2933c95417a1d4a060194386 webfiles/bbsnap2_header md5:059a4404abd26025c43111e1f2d83baf webfiles/bbsnap_header md5:77ff5d11d89b6e4b125289e2de15efc6 webfiles/bbsnap_header md5:801e80f099c190002847b20def4a0ec8 webfiles/bbsnap_header md5:8174f9bc6eb7d8c4019331c356b7c83b webfiles/bbsnap_header md5:83c5980f3af0548d7aed029711a67f9d webfiles/bbsnap_header md5:abd6b4accb9cb39e3e4491a8c0905623 webfiles/bbsnap_header md5:4accea67f8fb44aeea4c58c2e70ec6a0 webfiles/bbsnapnk_header md5:d5fd55e8fd8caa675dc2bda3f2d886a6 webfiles/bbsnapnk_header md5:fe3e7e17ff71f189bf5bae2bf924fd16 webfiles/bbsnapnk_header md5:9cc913e3c6403b67cadd2add56e168e3 webfiles/chpasswd_form md5:d4efd5ffc214b3719e384f2a6e112b70 webfiles/chpasswd_header md5:023a7ee2e6267b8bb5f84951ff2e14ef webfiles/columndoc_header md5:40c8ae5d3477449c630110677964ac3d webfiles/columndoc_header md5:488cdd7334c3eb9c193862abb37e7d3e webfiles/columndoc_header md5:4db0e94127a7a106bb9b0a7d868b0b48 webfiles/columndoc_header md5:78891f699ad3f376f67b0e61b0682ebb webfiles/columndoc_header md5:7e183c7cb5b8ce1b05733f9c5f60ecee webfiles/columndoc_header md5:b404bcecd8e569afa285a20062d94e6b webfiles/columndoc_header md5:de754f14cc93e6e1fa3bc29e32b12244 webfiles/columndoc_header md5:e8abaa53a14b000359bd8efca5efeb29 webfiles/columndoc_header md5:f087d77977baf65f2045407186460693 webfiles/columndoc_header md5:d41d8cd98f00b204e9800998ecf8427e webfiles/confreport_back md5:d921357393ccb03ffaef687bfc2e761f webfiles/confreport_footer md5:24b77246484e86b6518ab935e951f77e webfiles/confreport_front md5:49d391762e953602e903ea6dcb795c79 webfiles/confreport_front md5:704d7803ae223200faf7d88f775addac webfiles/confreport_front md5:ba20d150c6e40573658a06f42f0594dc webfiles/confreport_header md5:d212a7ad882942aa236e85ef4ed615a9 webfiles/confreport_header md5:179df9ba60e00a47c2bcfce43fe692a3 webfiles/critack_form md5:578c97c324eab20dc9037ed1b5427468 webfiles/critack_form md5:06b49128133a91498bd2e49429ceda25 webfiles/critedit_form md5:6dd58e48fe7d18233d4cafaf7d3004f4 webfiles/critedit_header md5:c17946f11c129c5cde57fb9620ea1450 webfiles/critedit_header md5:f353bd6812cbe0b401589936a2c3bdd2 webfiles/critedit_header md5:14358551b0e66d351e44fb6b47f11b35 webfiles/critical_footer md5:21db9961013bc43684c4069beda7462b webfiles/critical_footer md5:73ee8e0ee307e0c7647d9cc62811f79d webfiles/critical_footer md5:0a222fda13f6e3f7b4744cb9de2da149 webfiles/critical_header md5:2bd621622835d6184cca9a1296149aaf webfiles/critical_header md5:3b2143d0c4d641504561cb19707d652c webfiles/critical_header md5:d34d8b055b39a084bebb37cdd93b8651 webfiles/critical_header md5:1a6a567318c13f01ea02e71f2219ec6b webfiles/critmulti_header md5:e5b489c2a327657a4a00d5a92d0dcdce webfiles/critmulti_header md5:fe7222ba18aa2f55e71867d310a9c58e webfiles/divider_footer md5:a02584f3d7501468489b2c73b11747ae webfiles/divider_header md5:2b21da4cdd5544a1efd1cb6dbbc12597 webfiles/event_form md5:2cad1811e9d8e08d6677cec8cb7a7578 webfiles/event_form md5:49006fc8f40cac94eca246b2fe5faa97 webfiles/event_form md5:5c7b30b4ab4332c421d674df90ffc4dd webfiles/event_form md5:e48b4c57298510d191d4e25cac276186 webfiles/event_form md5:49c01f3cefeec8d33f3233c216955b0e webfiles/event_header md5:61bde058b46eaed4d9bb394092982953 webfiles/event_header md5:65e553d7a63b1636e857f0901987220a webfiles/event_header md5:79a6d29ab45c7c50ea508c802718ea18 webfiles/event_header md5:7f28375fa8ded2bb7921f5e061d338cc webfiles/event_header md5:982e40879bfcbcc034dc85a9012291e6 webfiles/event_header md5:ba1f75db90350d0435a3456ca346a8cd webfiles/event_header md5:d663673082a6a047c2389e87345e8554 webfiles/event_header md5:fbe38443ac25e9fc8c8d0185a5d8012a webfiles/event_header md5:1ba14ae777f497982d377a8c8bcb4757 webfiles/findhost_form md5:b6a0e5dbd16655e0381987e3273f15a6 webfiles/findhost_form md5:d5bfa8db22b85ffae86b53bff405ba54 webfiles/findhost_form md5:dc043069fbc9d6fbd366118030b999ec webfiles/findhost_form md5:014520c12bad9d3b6813af8caadd72d5 webfiles/findhost_header md5:196ea4f94210b930f963d60e3a9a2413 webfiles/findhost_header md5:290c890f5ea1d83531d1f5d57ca6087b webfiles/findhost_header md5:5fd00142761f5a35bf551f7a76da4918 webfiles/findhost_header md5:75e229b43ad1ffce9cb82ada92010f4b webfiles/findhost_header md5:7b6271f002bd76509a828d1a1de0fbb5 webfiles/findhost_header md5:882d30d43808e3c3f565dda72b4f7379 webfiles/findhost_header md5:9d332c0401798845e73df7cf623ec4bd webfiles/findhost_header md5:b44092ed93b418463cd3a70de72a4719 webfiles/findhost_header md5:d9264b516ba58f25cd468e24830a28f4 webfiles/findhost_header md5:e6b1dc37b53a84c59f9a4db8740b1faa webfiles/findhost_header md5:2a418ce8601d6556975508e06aeee5c4 webfiles/ghosts_header md5:4f5c88a6a3bfb41e57b9801b53ad9c29 webfiles/ghosts_header md5:6c0636a026583b2b1b7f7a188a4316e7 webfiles/ghosts_header md5:6ec27117c57776b55330713fc46f69d0 webfiles/ghosts_header md5:7385028893b6dd65014960bda8587c26 webfiles/ghosts_header md5:c77887553449ea8852989b5af0e43c09 webfiles/ghosts_header md5:13335f1bd9efe02d4fbcc6afcd679a1e webfiles/graphs_header md5:4c95fdb687ff65202afb2d52ba2852e5 webfiles/graphs_header md5:6dc264cc490b1ae66f5277638bf6428f webfiles/graphs_header md5:7475d6cd57634b07d9644a23dd1b0809 webfiles/graphs_header md5:7799acee834dcdf087475295d5ca8620 webfiles/graphs_header md5:86e44561be6cd5f1034261f636ee0260 webfiles/graphs_header md5:a800f27856ac7cbab9dc18a2b5a70dc8 webfiles/graphs_header md5:ad27fb97f7a3699fdcd6e0bb1c566d23 webfiles/graphs_header md5:c0556131f57a929ddba5b6534b46c05f webfiles/graphs_header md5:df9f3d1bddb0c235fd5c79f166c64fa7 webfiles/graphs_header md5:01627dccc3a51003b39c8d8186597782 webfiles/hist_header md5:01d77cfe8ce9e630bce443c1f84b67ba webfiles/hist_header md5:0fb000cfe04a0c9e9d256cb1c46a7908 webfiles/hist_header md5:153b0f20cb7955900f9dbce9a8e96806 webfiles/hist_header md5:21633df466936d9127646e294c2da585 webfiles/hist_header md5:297866f9c07f55f6b7428388877734a4 webfiles/hist_header md5:3ef3eeeb8911b8b7f549ebf9914f853b webfiles/hist_header md5:44681e656173a378615b2d92b117215e webfiles/hist_header md5:4e9a8d280a2fe22bdc300ccf099da3ed webfiles/hist_header md5:e3f6247196a3b8d81c96c45849adb955 webfiles/hist_header md5:0743068fd065363cc4f012999fa295c6 webfiles/histlog_header md5:4310d90bd4b437a315dc3bf11ea3f086 webfiles/histlog_header md5:492374a6e3ad22db61a1adc85df30b1f webfiles/histlog_header md5:5ace7ed2cb41587f9ad9a96093d6cb8b webfiles/histlog_header md5:5bd4e7b3bf41f1f38d5d209157c1dbf8 webfiles/histlog_header md5:8850587715fcd0a1a7b9ed1c7a7f6f59 webfiles/histlog_header md5:9fbcf8fd18f69b0ac7fb2993d2dd5142 webfiles/histlog_header md5:c2bbba732ce2e66e56bd4f722607e9d6 webfiles/histlog_header md5:d75ab4808d7492c974f7db6765649ec0 webfiles/histlog_header md5:e3aee3404892a5117f79b0c8802a55b3 webfiles/histlog_header md5:43b22c9b2bbe4d19e6f1be5047dcd013 webfiles/hobbitnk_footer md5:834b0816b8ba716e35bed8bab1462a09 webfiles/hobbitnk_footer md5:c37a4c5f3fe8d412cc8002b235126f21 webfiles/hobbitnk_footer md5:d20c72f46d33284ac2006960369f9401 webfiles/hobbitnk_footer md5:1d9e995b3778cf2c40529b47a7af8739 webfiles/hobbitnk_header md5:9094360854ab61a4d2f035a4108ae8c9 webfiles/hobbitnk_header md5:eb11ca199fb132916136d85ea2237068 webfiles/hobbitnk_header md5:04370521e21a8f5e8a7f5a4bd90be710 webfiles/hostgraphs_form md5:12a5a143d0176995da2393c5d921a730 webfiles/hostgraphs_form md5:1a89274a84bcb504ec795efe38790a29 webfiles/hostgraphs_form md5:0b93340f61b0ab8a9679ed63f8fdaf1f webfiles/hostgraphs_header md5:6fbce8b850a2b6f6c11eae3de1780a53 webfiles/hostgraphs_header md5:aedd2c25005ee3967fbcfe3d786919bb webfiles/hostgraphs_header md5:c5bb29b190d16c6ca742989e9a1de086 webfiles/hostgraphs_header md5:dcf906c6360cf53462d068b9ce23f0bd webfiles/hostgraphs_header md5:f40ffcfb250ba6cc7d2c6070bf23e8c0 webfiles/hostgraphs_header md5:742b6877f8ce89c7f10c99d28ada808b webfiles/hostlist_form md5:9f0b363a4c8519411e99e44726083b59 webfiles/hostlist_form md5:2cae7e396594a66894f134432bd83cc7 webfiles/hostlist_header md5:598bbbc38bfc7ba88543850eacf98fdb webfiles/hostlist_header md5:93b82bc3ea9af5e11c59fd8a466558c0 webfiles/hostlist_header md5:a6e156a339770dfaa002cf3ff62d9247 webfiles/hostlist_header md5:cb6a2759593b4ad6e242cfaae5a31dfa webfiles/hostlist_header md5:02e7fc8ea569046453deeb97b5acddc6 webfiles/hostsvc_header md5:1b7a69a900b93d30ef3416360bdd4d7f webfiles/hostsvc_header md5:21f51fbc2b68080bd0c9c2b2b8591fde webfiles/hostsvc_header md5:24c42b758752dd05c889ca4990990712 webfiles/hostsvc_header md5:3eae7096b99bdfe104651be21998a56a webfiles/hostsvc_header md5:560cf8fe8dc232a240cd4af8fb4b75fb webfiles/hostsvc_header md5:6dffec4e8d9b920e0635a181969871ea webfiles/hostsvc_header md5:716bff33489a38a2b56ca08b328701a7 webfiles/hostsvc_header md5:b302577baf5e5523e39653fc20224789 webfiles/hostsvc_header md5:c515695830039843ed2eab2ba71b37ac webfiles/hostsvc_header md5:cd6cdc0faa7e7c927893556dfafddc90 webfiles/hostsvc_header md5:04dfb1ba775e198224440bae14ef5d04 webfiles/info_header md5:0fa7f284384cf650788a85f9fd67e80a webfiles/info_header md5:100b94781cee0834b87f920ef9715245 webfiles/info_header md5:2338498e9800f77363e6452fe6ee08a5 webfiles/info_header md5:2afb7ea168587710bcf3a154eab5846c webfiles/info_header md5:2c9fd562e7db17cfc3efe32b4a223059 webfiles/info_header md5:4d6bae7894fa3474ff3b89f89bc4705b webfiles/info_header md5:553d801c12f0ecef0f41192d416ad883 webfiles/info_header md5:60b96f5f65206e650dac7727fc676f66 webfiles/info_header md5:6492e8e810dbfb46e5e7c967fddb892c webfiles/info_header md5:68b104dae211825808194a32f3ad3a05 webfiles/info_header md5:d33a2f0bbdaef3aaa9d9f4a5757978b5 webfiles/info_header md5:02c12f6ad41ac910227d69b73b28e189 webfiles/maintact_header md5:2c243255e690fe983785ba200c28616f webfiles/maintact_header md5:64bc22c385336eaacfd7a6791e330643 webfiles/maintact_header md5:75777a63aa42d7497e3e54f7c27b1af0 webfiles/maintact_header md5:97eac84720003897d2fdeb7471f20805 webfiles/maintact_header md5:c367d4fee01483db265e8e085ad0cb1f webfiles/maintact_header md5:1a5ad876e1e60e8ff8b20f14d18adf33 webfiles/maint_form md5:2228bd803ecddda0c872a55b9bcce38c webfiles/maint_form md5:352b4de71f8e5459322ffb6e84d76e4a webfiles/maint_form md5:a8a0c6187685fdb81d98e46a75751a56 webfiles/maint_form md5:b8ccc42a08ccc98a21323320986a1b8f webfiles/maint_form md5:03b90a406ad8188e0b14d01ac536f3fe webfiles/maint_header md5:31c57123b77c406f0d870eae82ccabb0 webfiles/maint_header md5:379921dfcc1a337ec2077436cebad9f0 webfiles/maint_header md5:3a6e92a359c93e3dda812f23bb56cbed webfiles/maint_header md5:966b865bbb9c67f71b26aa5dddb87d32 webfiles/maint_header md5:b6d4b7d210f57ce85aef99acab48f84d webfiles/maint_header md5:c242f7f162979c7c9a4cb56ca4c2f687 webfiles/maint_header md5:c412630b335d35f136cf81b5b93d282e webfiles/maint_header md5:c77acb7ab0ed935efbbf52974ae02262 webfiles/maint_header md5:fa4fcc8c6c4eb71ea4e76be8b0ddb881 webfiles/maint_header md5:fad36d4b7d04a94c4bb44ea9adedce9b webfiles/maint_header md5:78a9cd70a37dfa793423ffe5be770434 webfiles/nkack_form md5:f4ad6dfcfc96d8588e8a09b3ef59c90a webfiles/nkack_form md5:1df6c9d0e2a5b8253af64ee4d809ddf9 webfiles/nkedit_form md5:233b4a8fbf6cc513143001267be0adbf webfiles/nkedit_form md5:84c18fac4a57fcce6e5815c30844a86f webfiles/nkedit_form md5:bd794af473b37866b09b4ca590f4e6ed webfiles/nkedit_form md5:448fb5f498b13b7e5f89360003266127 webfiles/nkedit_header md5:a54004eaacf0575e1f7f829d45c406ee webfiles/nkedit_header md5:d2e696ae9cc8243c00e30772d67a92d2 webfiles/nkedit_header md5:ee95fdd7461d7518a41f448b51f0c85d webfiles/nkedit_header md5:679ecf0460d9ee066b53703edfb45bf5 webfiles/notify_footer md5:b927ca734b83973f47762278b1015d32 webfiles/notify_footer md5:660d6e4ae0578496e35178f5dd0382c1 webfiles/notify_form md5:c4e7cd276c4a88a9970594f102d78b18 webfiles/notify_form md5:029d369f57ca69d5fb3397a5a05dd4bc webfiles/notify_header md5:4b531c44a8d1b4d26080917ceb27bf5f webfiles/notify_header md5:64c7882aa785d49c13f77c2146ff2809 webfiles/notify_header md5:ae4db871545396b32f3b1ded6d7199d8 webfiles/notify_header md5:c1df159a27547efaa9587c6252fcef5f webfiles/notify_header md5:c61a13654bf5ad0041e572f50d909af0 webfiles/notify_header md5:62daa40456f23e6b67469018fd6851d6 webfiles/perfdata_form md5:0fc17291c4a0473908ee696df0c252fd webfiles/perfdata_header md5:88f0b2d8558257191776c7448e7d1b0d webfiles/perfdata_header md5:94f05352f7c2942833ecc1d3a70f312e webfiles/perfdata_header md5:bf74bde923d7f179d57b697b7e2d1d69 webfiles/perfdata_header md5:5a5fad279887ab62368651d01f5fa930 webfiles/replog_header md5:a3c57748c6384747d331eecf50f6cb67 webfiles/replog_header md5:b870b82a721d97f8e454d87f206931cb webfiles/replog_header md5:c67be08b9e26df6ff1c497f4148ad812 webfiles/replog_header md5:cec633be45f2dab91210dcfdd6244ebd webfiles/replog_header md5:d930c2e8041d1aa34c2e9a9c58e48666 webfiles/replog_header md5:dda39e97fe87ed5d5487c071d99707a7 webfiles/replog_header md5:de60aa05e19471556c17039bff9013b6 webfiles/replog_header md5:deb80a076dcce05567290f0e13f1aa0f webfiles/replog_header md5:f333ce96b7ba5aa8f1a8382d9b0f44da webfiles/replog_header md5:5469e970c51cdd6417f6230ca1397c24 webfiles/repnormal_header md5:5fbb435afe6127f9d8c32a2679feee9b webfiles/repnormal_header md5:b1c85b082fc7ac1f49e851d3f42626ab webfiles/repnormal_header md5:1600c0858a63f2ea16e31d68c23c1c8d webfiles/report_form md5:1ec8e1e00b792c9d4b893616600c3625 webfiles/report_form md5:22cb2a34475ef16c6ea2d70f74edf448 webfiles/report_form md5:99b1dd3b0e281a3a22a2c5821aaaa0a6 webfiles/report_form md5:c45479931e8863f29071733e267440c3 webfiles/report_form md5:08cd5e23cc5b091fbd54dd99ab970eb9 webfiles/report_form_daily md5:3c2bab1a60aeef54ff6106cabc1fd242 webfiles/report_form_daily md5:e69ae5138ab9134422b3cc96993f5ca2 webfiles/report_form_daily md5:6a91b8d2036878883e8779af9b45244c webfiles/report_form_monthly md5:c6fef48851d5cb736ba8ff4b51317464 webfiles/report_form_monthly md5:f86629e4566ad17fab4559919bd34291 webfiles/report_form_monthly md5:3af281e115975b6f139f3f79899b691d webfiles/report_form_weekly md5:7aa455d83886d52a83d7b24d5993c65d webfiles/report_form_weekly md5:f78dd68561c6d8bcc15f919db08fc1dc webfiles/report_form_weekly md5:0a2e9a98428077f2d653841917394976 webfiles/report_header md5:28cb27832f238da19fea4ce263d49e45 webfiles/report_header md5:5373ce8c0780516f53c496a6b571fc68 webfiles/report_header md5:57af05fcb91d32eb5725cf4fcdbc4595 webfiles/report_header md5:8df11e75679f001591ad99069edf176f webfiles/report_header md5:9f3e0a09a8ae034ef1ae1087e4798bdd webfiles/report_header md5:a429189b343613487385804066e52b86 webfiles/report_header md5:b162c38cdc039f78b627c389a2016e5e webfiles/report_header md5:b5f3411b293ba8d116881b59fc3a75ce webfiles/report_header md5:ba52c5aa47f656a4994bef126caf3d10 webfiles/report_header md5:007ab114780bd1339332a09c94f08607 webfiles/snapcritical_header md5:774921d90c4531dbd8665852e1e55ddf webfiles/snapcritical_header md5:cfa74bc7d493f007db5237983ba378c4 webfiles/snapcritical_header md5:18a7b1258bb1f074d4e53d7baf456338 webfiles/snapnongreen_header md5:c6dac37646074d840904d89bf958e533 webfiles/snapnongreen_header md5:d54b7e479d838d28a0bc01d9f7c72038 webfiles/snapnongreen_header md5:0121bc271e6dcb1127e21ffd37daa280 webfiles/snapnormal_header md5:472e23dada587d022290079ab981d240 webfiles/snapnormal_header md5:4aef4af069e68e41392e782504e4a453 webfiles/snapnormal_header md5:178fccce4e579115d29413721f7f920d webfiles/snapshot_form md5:51a077e0abe5299f4e96c4e67961efc1 webfiles/snapshot_form md5:817527af6850157b1471f34fb77d1a54 webfiles/snapshot_form md5:d069271f0256f14dfa2ba5d97effe217 webfiles/snapshot_form md5:07d4847d28ff996ec6a635b79fe727ca webfiles/snapshot_header md5:1afb45714ed5911dd448dcf2771ab72f webfiles/snapshot_header md5:367fc4351b0e18d432b81946332dfeaf webfiles/snapshot_header md5:68363d5ffc97b36221e898bf4e100e2a webfiles/snapshot_header md5:760a1b470f3dfcbc36e453c4c6801405 webfiles/snapshot_header md5:a331684b00910024e9887ee3ce902b8c webfiles/snapshot_header md5:b871efbc9b0a04b269dafb62c6d2286f webfiles/snapshot_header md5:e8c64a75e30ff1d201534e57da0eebb2 webfiles/snapshot_header md5:f088c56cb6da8894fd9cc6d61da06066 webfiles/snapshot_header md5:0a222fda13f6e3f7b4744cb9de2da149 webfiles/stdcritical_header md5:2bd621622835d6184cca9a1296149aaf webfiles/stdcritical_header md5:3b2143d0c4d641504561cb19707d652c webfiles/stdcritical_header md5:d34d8b055b39a084bebb37cdd93b8651 webfiles/stdcritical_header md5:624e3d52c93db2c6f3601d8e24203267 webfiles/stdnongreen_header md5:c682264443af81b4e2dcc02006ca69f9 webfiles/stdnongreen_header md5:c9e6ab9dd10a6437d78bee82c14b3529 webfiles/stdnongreen_header md5:fe55695a2cdb46f7caa2ece116a03eb2 webfiles/stdnongreen_header md5:d57bec4b9fe9dc8dd8f74b590d059ba3 webfiles/stdnormal_footer md5:14395d6a02ce1007374141f691be7e04 webfiles/stdnormal_header md5:725cbb67bf038f584356dcc4978ff946 webfiles/stdnormal_header md5:a9b0db3159a06da8a054912d6f5834a1 webfiles/stdnormal_header md5:ef6cb4583f0a98485cc0f090098e14b1 webfiles/stdnormal_header md5:d41bb6227216667076f8e90c75512fa0 webfiles/topchanges_form md5:4e88e5fec96e1c3e927cf262456cf82c webfiles/topchanges_header md5:b7edf3431851324fb2ebdd71552c3afa webfiles/topchanges_header md5:daa843834a2a8e709b1248d78ba93693 webfiles/topchanges_header md5:e7d6bc63b04dd13aa55ff126f3a3f29e webfiles/topchanges_header md5:77a26d505caa295c0124663d50bd6dc3 webfiles/trends_form md5:78765fbe54edc0ee84dc07b3ba829152 webfiles/trends_form md5:a4d1bb01beeb18453a0312ca15ceabb7 webfiles/trends_form md5:ace5ab7a9ab648e14751005c70287189 webfiles/trends_header md5:b97f9484757a782160ae65f7578452e5 webfiles/useradm_form md5:64acc7c5c91cae0052a9abe95a75a0b1 webfiles/useradm_header md5:8ed0452ebc8934e7a8c5f78d2f37efbb webfiles/useradm_header md5:b20204911a14cf4360e0e02bed6aa1a3 webfiles/useradm_header md5:eb7962eedea531ac0437cd7ba99b2f6b webfiles/useradm_header md5:152758a0a0a028353ea10fb1824e39c1 webfiles/zoom.js md5:1781c28a551f54aba99821a0f70065ad webfiles/zoom.js md5:2e55ae03b1e9deebd4d98f1bdc7fc9fc webfiles/zoom.js md5:36717ff2352222b96514de2fed9003e0 webfiles/zoom.js md5:4cdb87332f200d1d6b1cf1cd37fcd5ff webfiles/zoom.js md5:4d2d2cd984c9046d2332d5e59c527a59 webfiles/zoom.js md5:5bf16eb30301d49011406f71f839c58b webfiles/zoom.js md5:92552cb1b50d3dccd67a7988d08dbf81 webfiles/zoom.js md5:0f7a1e430bd5f3bf75b6876dbb31346a wwwfiles/gifs/arrow.gif md5:15f209b4350be229473a5a17d9f47043 wwwfiles/gifs/bkg-blue.gif md5:550d2867f08912e067ac51dee5552003 wwwfiles/gifs/bkg-blue.gif md5:36b45d8e64a84350099f7fb06c26da0b wwwfiles/gifs/bkg-clear.gif md5:c58f1de41747454ea0beda3ac8cfc4e9 wwwfiles/gifs/bkg-clear.gif md5:30f0bc11f679d95e108da969080c5fc6 wwwfiles/gifs/bkg-green.gif md5:e414d855710fb2c8f4fb50be63b1f52d wwwfiles/gifs/bkg-green.gif md5:339f2319ad364d4ed36ddc0c06f2efc9 wwwfiles/gifs/bkg-purple.gif md5:fffed8a62895572e03fe00ebb7d4d650 wwwfiles/gifs/bkg-purple.gif md5:50920dcb02ff2ac3c317edb8dbdfe047 wwwfiles/gifs/bkg-red.gif md5:7d3c891e2c8d16a9e7529c8a41f2c6be wwwfiles/gifs/bkg-red.gif md5:09f9232bb6d3dba27604e80bacea6caa wwwfiles/gifs/bkg-yellow.gif md5:6e2d929901ca1297a6518129c40dfbf3 wwwfiles/gifs/bkg-yellow.gif md5:6edab754e263eca78cd14414e9c598eb wwwfiles/gifs/blue-ack.gif md5:db01e36f1f4f7623f730525d5a1785a9 wwwfiles/gifs/blue.gif md5:1f7e0d09d3bdcc785556e927031443e6 wwwfiles/gifs/blue-recent.gif md5:7dbeb09959873840f4e2aeddfb2c76a1 wwwfiles/gifs/clear.gif md5:9537b303a8ca9006f7132cd7d10caa74 wwwfiles/gifs/clear-recent.gif md5:b7e7717acc440e90f480fae1e2ca750c wwwfiles/gifs/favicon-blue.ico md5:40a4a21ce27ed5a127dc3182f8e6f761 wwwfiles/gifs/favicon-clear.ico md5:081a360ef5d509a41251308c2592b929 wwwfiles/gifs/favicon-green.ico md5:3a0f210c04cf0ca8112ebdb5acf6931a wwwfiles/gifs/favicon-purple.ico md5:6030caa1c3efb1f78d3371db897d4c1f wwwfiles/gifs/favicon-red.ico md5:f8096714c7bf4ba1de5bb121f37e5843 wwwfiles/gifs/favicon-unknown.ico md5:ec30822e46c1d23bcddf50e901f0841a wwwfiles/gifs/favicon-yellow.ico md5:a1bfa97274f4905d26ff44eb3ddd5376 wwwfiles/gifs/green-ack.gif md5:fcd9f31b34edc95c424654eacd2ce3df wwwfiles/gifs/green.gif md5:720ee80877f25d10e18a2435df8e5515 wwwfiles/gifs/green-recent.gif md5:974f3c1e72b6cec1ff089cbcc0874340 wwwfiles/gifs/purple-ack.gif md5:69f79b571c3dc10be10c6321b37f8480 wwwfiles/gifs/purple.gif md5:59be91136046b6ce6078ff5e51b92f1f wwwfiles/gifs/purple-recent.gif md5:2900d3a7ce74c31df2c3e29081e89ec7 wwwfiles/gifs/README md5:4785eef9a563e895a949ab6fbd43f24c wwwfiles/gifs/README md5:54c9e6c5cf9f3af55c9987f126afe70c wwwfiles/gifs/README md5:71f2e080cfad6a23e2d0f241f071c5e6 wwwfiles/gifs/README md5:771a69c81b193f84a9bbf951b9533d7b wwwfiles/gifs/README md5:569c22387f3e0eae9e167a4e723c4dad wwwfiles/gifs/red-ack.gif md5:cd27207c6975c5fd95acb3edc05a663f wwwfiles/gifs/red.gif md5:3fcb4f34b6579377b91e5aac1125609b wwwfiles/gifs/red-recent.gif md5:cc7def940d5512b3db198bd4198da72f wwwfiles/gifs/unknown.gif md5:cc7def940d5512b3db198bd4198da72f wwwfiles/gifs/unknown-recent.gif md5:9d2ba1a166533c4e7275c8baeee09328 wwwfiles/gifs/xymonbody.css md5:9817d961c3a96a4b4e61f3be2eb0b5f0 wwwfiles/gifs/yellow-ack.gif md5:be7f9a896dad98a28e7fc621fc05934e wwwfiles/gifs/yellow.gif md5:c48ee1c1706fb25f84241d78c2320561 wwwfiles/gifs/yellow-recent.gif md5:2676442ce3bb26c96aa0173d462148d5 wwwfiles/gifs/zoom.gif md5:db3101fb3b347e6fd3f8fbda67e2e390 wwwfiles/menu/b2t-blue.gif md5:bfba2b5ee74c7be23107f580cbfe7d65 wwwfiles/menu/b2t-grey.gif md5:cb0fd3f28fcedcca636d9017e7cf3909 wwwfiles/menu/menu.css md5:fa0d4c587d093e953db4b21e7bacd2f8 wwwfiles/menu/menu_items.js md5:157744fbdd343c55f2866220370277a8 wwwfiles/menu/menu_items.js.DIST md5:2471b1a55835ca094a767ef84a8c923b wwwfiles/menu/menu_items.js.DIST md5:25501f4c319c14cc894fd485d1371c67 wwwfiles/menu/menu_items.js.DIST md5:33222e87f8e5ea46d187383c8ba8ee76 wwwfiles/menu/menu_items.js.DIST md5:42fc35954fb111e39fc7b13a44e0229b wwwfiles/menu/menu_items.js.DIST md5:4698934d41c97abbf79e31f2b254db24 wwwfiles/menu/menu_items.js.DIST md5:676bc52bb8183124b87c90f69afd47a2 wwwfiles/menu/menu_items.js.DIST md5:8a77e51d1da3920af481f96d8aad05ea wwwfiles/menu/menu_items.js.DIST md5:ae61aa6ecb9332a1cb7c4dc1778503e1 wwwfiles/menu/menu_items.js.DIST md5:cdfb74f05ab5f885925666a88973bfaf wwwfiles/menu/menu_items.js.DIST md5:dd15fed90607a93eeec4250c626e4f1f wwwfiles/menu/menu_items.js.DIST md5:feda8f1f05273c80b5048c43f8c38e39 wwwfiles/menu/menu_items.js.DIST md5:47fd53051fb48237501e3cc9d9410cf6 wwwfiles/menu/menu.js md5:7f1a456f123866f518220fad3d1f0137 wwwfiles/menu/menu_tpl.js md5:bc7f251fc00a431f452b9b29042cb5e7 wwwfiles/menu/menu_tpl.js md5:2420fb3d074c15362b4a6380a08e0980 wwwfiles/menu/README md5:a1a37fb8d0abfc5e48b5d00ae5a36f80 wwwfiles/menu/README md5:948d61a485df74b79f75af9406fa3be6 wwwfiles/menu/t2b-blue.gif md5:693c1595105e325af62ad73f5c766041 wwwfiles/menu/t2b-grey.gif md5:52145f5f7f3c5ca6946f18e081ee811a wwwfiles/menu/xymonmenu-blue.css md5:1b68e91383dac5118cfe9c0c9675f0c4 wwwfiles/menu/xymonmenu.css md5:2ec844f6efeaac8fdb5da8badccc3c4f wwwfiles/menu/xymonmenu-grey.css xymon-4.3.28/build/Makefile.test-cares0000664000076400007640000000042112274210064020015 0ustar rpmbuildrpmbuildinclude Makefile.$(OS) include Makefile.rules test-compile: @$(CC) $(CFLAGS) $(CARESINC) -o test-cares.o -c test-cares.c test-link: @$(CC) $(CFLAGS) $(CARESLIB) -o test-cares test-cares.o -lcares && ./test-cares $(ARESVER) ares-clean: @rm -f test-cares.o test-cares xymon-4.3.28/build/Makefile.test-ssl20000664000076400007640000000034412000050736017602 0ustar rpmbuildrpmbuildinclude Makefile.$(OS) test-compile: @$(CC) $(CFLAGS) $(OSSLINC) -o test-ssl2.o -c test-ssl2.c test-link: @$(CC) $(CFLAGS) $(OSSLLIB) -o test-ssl2 test-ssl2.o -lssl -lcrypto $(NETLIBS) clean: @rm -f test-ssl2.o test-ssl2 xymon-4.3.28/build/test-ldap.c0000664000076400007640000000177612000050736016356 0ustar rpmbuildrpmbuild#include #include #include #include #include int main(int argc, char *argv[]) { LDAP *ld; if ((argc >= 1) && (strcmp(argv[1], "vendor") == 0)) { printf("%s\n", LDAP_VENDOR_NAME); } else if ((argc >= 1) && (strcmp(argv[1], "version") == 0)) { printf("%d\n", LDAP_VENDOR_VERSION); } else if ((argc >= 1) && (strcmp(argv[1], "flags") == 0)) { if ((strcasecmp(LDAP_VENDOR_NAME, "OpenLDAP") == 0) && (LDAP_VENDOR_VERSION >= 20400)) { printf("-DLDAP_DEPRECATED=1\n"); } } else { LDAPURLDesc ludp; int protocol, rc; struct timeval nettimeout; protocol = LDAP_VERSION3; nettimeout.tv_sec = 1; nettimeout.tv_usec = 0; rc = ldap_url_parse("ldap://ldap.example.com/cn=xymon,ou=development,o=xymon", &ludp); ld = ldap_init(ludp.lud_host, ludp.lud_port); rc = ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION, &protocol); rc = ldap_set_option(ld, LDAP_OPT_NETWORK_TIMEOUT, &nettimeout); rc = ldap_start_tls_s(ld, NULL, NULL); } return 0; } xymon-4.3.28/build/test-clockgettime-librt.c0000664000076400007640000000026512262773452021233 0ustar rpmbuildrpmbuild#include #include #include #include int main () { struct timespec ts; (void)clock_gettime(CLOCK_MONOTONIC, &ts); return 0; } xymon-4.3.28/build/Makefile.test-pcre0000664000076400007640000000032111070452713017652 0ustar rpmbuildrpmbuildinclude Makefile.$(OS) test-compile: @$(CC) $(CFLAGS) $(PCREINC) -o test-pcre.o -c test-pcre.c test-link: @$(CC) $(CFLAGS) $(PCRELIB) -o test-pcre test-pcre.o -lpcre clean: @rm -f test-pcre.o test-pcre xymon-4.3.28/build/makerpm.sh0000775000076400007640000000316111535462534016315 0ustar rpmbuildrpmbuild#!/bin/sh REL=$1 if [ "$REL" = "" ]; then echo "Error - missing release number" exit 1 fi BASEDIR=`pwd` cd $BASEDIR rm -rf rpmbuild # Setup a temp. rpm build directory. mkdir -p rpmbuild/RPMS rpmbuild/RPMS/i386 rpmbuild/BUILD rpmbuild/SPECS rpmbuild/SRPMS rpmbuild/SOURCES cat >rpmbuild/.rpmmacros <rpmbuild/.rpmrc <rpmbuild/SPECS/xymon.spec cp rpm/xymon-init.d rpmbuild/SOURCES/ cp rpm/xymon.logrotate rpmbuild/SOURCES/ cp rpm/xymon-client.init rpmbuild/SOURCES/ cp rpm/xymon-client.default rpmbuild/SOURCES/ mkdir -p rpmbuild/xymon-$REL for f in xymongen xymonnet bbpatches xymonproxy build common contrib docs xymond web include lib client demotool do find $f/ | egrep -v "RCS|.svn" | cpio -pdvmu $BASEDIR/rpmbuild/xymon-$REL/ done cp -p Changes configure configure.server configure.client COPYING CREDITS README README.CLIENT RELEASENOTES $BASEDIR/rpmbuild/xymon-$REL/ find $BASEDIR/rpmbuild/xymon-$REL -type d|xargs chmod 755 cd rpmbuild #pushd xymon-$REL #make -f $HOME/xymon/Makefile.home distclean #popd tar zcf SOURCES/xymon-$REL.tar.gz xymon-$REL rm -rf xymon-$REL HOME=`pwd` rpmbuild -ba --clean SPECS/xymon.spec #rpm --addsign RPMS/i?86/xymon-$REL-*.i?86.rpm RPMS/i386/xymon-client-$REL-*.i?86.rpm SRPMS/xymon-$REL-*.src.rpm # mv RPMS/i?86/xymon-$REL-*.i?86.rpm RPMS/i?86/xymon-client-$REL-*.i?86.rpm SRPMS/xymon-$REL-*.src.rpm ../rpm/pkg/ xymon-4.3.28/build/Makefile.Linux0000664000076400007640000000203412134742462017053 0ustar rpmbuildrpmbuild# Xymon compile-time settings for LINUX systems OSDEF = -DLINUX # NETLIBS: None needed on Linux NETLIBS = # Compile flags for normal build CC = gcc GCCVER := $(shell gcc -dumpversion|cut -d. -f1) ifeq ($(GCCVER),4) CFLAGS = -g -O2 -Wall -Wno-unused -Wno-pointer-sign -D_REENTRANT $(LFSDEF) $(OSDEF) else CFLAGS = -g -O2 -Wall -Wno-unused -D_REENTRANT $(LFSDEF) $(OSDEF) endif ifndef PKGBUILD RPATH = -Wl,--rpath, endif # Compile flags for debugging # CFLAGS = -g -DDEBUG -Wall -D_REENTRANT $(LFSDEF) $(OSDEF) # For profiling # CFLAGS = -g -pg -Wall -D_REENTRANT $(LFSDEF) $(OSDEF) # Note: Do 'export GMON_OUT_PREFIX=/var/tmp/FILENAME' to save profiling output in /var/tmp # Use gprof to analyse # By default, Xymon uses a static library for common code. # To save some diskspace and run-time memory, you can use a # shared library by un-commenting this. # XYMONLIBRARY=libxymon.so # Mail program: This must support "CMD -s SUBJECT ADDRESS" to send out a mail with a subject # Typically, this will be "mail" or "mailx" MAILPROGRAM="mail" xymon-4.3.28/build/test-lfs.c0000664000076400007640000000065711544715637016243 0ustar rpmbuildrpmbuild#include #include #include #include #include int main(int argc, char *argv[]) { off_t fileofs; int minsize = atoi(argv[1]); memset(&fileofs, 0, sizeof(fileofs)); #ifdef _LARGEFILE_SOURCE printf("%d:%d:%lld\n", sizeof(off_t), (sizeof(off_t) >= minsize), fileofs); #else printf("%d:%d:%ld\n", sizeof(off_t), (sizeof(off_t) >= minsize), fileofs); #endif return 0; } xymon-4.3.28/build/Makefile.test-ssl0000664000076400007640000000033611070452713017530 0ustar rpmbuildrpmbuildinclude Makefile.$(OS) test-compile: @$(CC) $(CFLAGS) $(OSSLINC) -o test-ssl.o -c test-ssl.c test-link: @$(CC) $(CFLAGS) $(OSSLLIB) -o test-ssl test-ssl.o -lssl -lcrypto $(NETLIBS) clean: @rm -f test-ssl.o test-ssl xymon-4.3.28/build/test-shutdown.c0000664000076400007640000000051311070452713017304 0ustar rpmbuildrpmbuild#include #include #include #include #include int main(int argc, char *argv[]) { #ifndef SHUT_RD printf("#define SHUT_RD 0\n"); #endif #ifndef SHUT_WR printf("#define SHUT_WR 1\n"); #endif #ifndef SHUT_RDWR printf("#define SHUT_RDWR 2\n"); #endif return 0; } xymon-4.3.28/build/renamevars.c0000664000076400007640000000107411546253217016630 0ustar rpmbuildrpmbuild#include #include #include #include int main(int argc, char **argv) { char buf[1024]; char *newnam, *oldnam, *oldval, *p; while (fgets(buf, sizeof(buf), stdin)) { p = strchr(buf, '\n'); if (p) *p = '\0'; newnam = buf; oldnam = strchr(buf, '='); if (!oldnam) continue; *oldnam = '\0'; oldnam++; oldval = getenv(oldnam); if (oldval) { printf("%s=\"", newnam); for (p = oldval; (*p); p++) { if (*p == '"') printf("\\\""); else printf("%c", *p); } printf("\"\n"); } } return 0; } xymon-4.3.28/build/lfs.sh0000775000076400007640000000163512003230207015426 0ustar rpmbuildrpmbuild echo "Checking for Large File Support ..." # Solaris is br0ken when it comes to LFS tests. # See http://lists.xymon.com/archive/2011-November/033216.html if test "`uname -s`" = "SunOS"; then echo "Large File Support assumed OK on Solaris" exit 0 fi cd build OS=`uname -s | sed -e's@/@_@g'` $MAKE -f Makefile.test-lfs clean OS=`uname -s | sed -e's@/@_@g'` $MAKE -f Makefile.test-lfs 2>/dev/null if test $? -ne 0; then echo "ERROR: Compiler doesnt recognize the off_t C type." exit 1 fi STDRES="`./test-lfs-std 4`" if test "$STDRES" != "4:1:0" -a "$STDRES" != "8:1:0"; then echo "ERROR: LFS support check failed for standard file support" exit 1 fi LFSRES="`./test-lfs-lfs 8`" if test "$LFSRES" != "8:1:0"; then echo "ERROR: LFS support check failed for large file support" exit 1 fi echo "Large File Support OK" OS=`uname -s | sed -e's@/@_@g'` $MAKE -f Makefile.test-lfs clean cd .. xymon-4.3.28/build/Makefile.test-lfs0000664000076400007640000000037311070452713017514 0ustar rpmbuildrpmbuildinclude Makefile.$(OS) all: test-lfs-std test-lfs-lfs test-lfs-std: @$(CC) -o test-lfs-std test-lfs.c test-lfs-lfs: @$(CC) $(CFLAGS) -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -o test-lfs-lfs test-lfs.c clean: @rm -f test-lfs-std test-lfs-lfs xymon-4.3.28/build/Makefile.test-rrd0000664000076400007640000000036311535462534017526 0ustar rpmbuildrpmbuildinclude Makefile.$(OS) test-compile: @$(CC) $(CFLAGS) $(RRDDEF) $(RRDINC) -o test-rrd.o -c test-rrd.c test-link: @$(CC) $(CFLAGS) $(RRDDEF) $(RRDLIB) -o test-rrd test-rrd.o -lrrd $(PNGLIB) clean: @rm -f test-rrd.o test-rrd xymongen.png xymon-4.3.28/build/fping.sh0000775000076400007640000000413711535462534015770 0ustar rpmbuildrpmbuild#!/bin/sh echo "Checking for fping ..." for DIR in / /usr /usr/local /opt /usr/pkg /opt/csw do if test "$DIR" = "/"; then DIR=""; fi if test -x $DIR/bin/fping then FPING=$DIR/bin/fping elif test -x $DIR/sbin/fping then FPING=$DIR/sbin/fping fi done if test "$USERFPING" != "" then FPING="$USERFPING" fi if test "$USEXYMONPING" = "" then echo "Xymon has a built-in ping utility (xymonping)" echo "However, it is not yet fully stable and therefore it" echo "may be best to use the external fping utility instead." if test "$FPING" = "" then echo "I could not find fping on your system" echo "Do you want to use xymonping [Y/n] ?" read USEXYMONPING if test "$USEXYMONPING" = "n" then echo "What command should Xymon use to run fping ?" read FPING else USEXYMONPING="y" echo "OK, I will use xymonping." FPING="xymonping" fi else echo "I found fping in $FPING" echo "Do you want to use it [Y/n] ?" read USEFPING if test "$USEFPING" = "n" then USEXYMONPING="y" echo "OK, I will use xymonping instead." FPING="xymonping" fi fi elif test "$USEXYMONPING" = "n" then echo "OK, will use '$FPING' for ping tests" else FPING="xymonping" USEXYMONPING="y" fi if test "$USEXYMONPING" = "y" -o "$USERFPING" != "" then NOTOK=0 else NOTOK=1 fi while test $NOTOK -eq 1 do echo "Checking to see if '$FPING 127.0.0.1' works ..." $FPING 127.0.0.1 RC=$? if test $RC -eq 0; then echo "OK, will use '$FPING' for ping tests" echo "NOTE: If you are using an suid-root wrapper, make sure the 'xymond'" echo " user is also allowed to run fping without having to enter passwords." echo " For 'sudo', add something like this to your 'sudoers' file:" echo " xymon ALL=(ALL) NOPASSWD: $FPING" echo "" NOTOK=0 else echo "" echo "Failed to run fping." echo "If fping is not suid-root, you may want to use an suid-root wrapper" echo "like 'sudo' to run fping." echo "" echo "Xymon needs the fping utility. What command should it use to run fping ?" read FPING fi done xymon-4.3.28/build/ldap.sh0000775000076400007640000000570212003230207015561 0ustar rpmbuildrpmbuild echo "Checking for LDAP ..." LDAPINC="" LDAPLIB="" for DIR in /opt/openldap* /opt/ldap* /usr/local/openldap* /usr/local/ldap* /usr/local /usr/pkg /opt/csw /opt/sfw do if test -f $DIR/include/ldap.h then LDAPINC=$DIR/include fi if test -f $DIR/lib/libldap.so then LDAPLIB=$DIR/lib fi if test -f $DIR/lib/libldap.a then LDAPLIB=$DIR/lib fi if test -f $DIR/lib64/libldap.so then LDAPLIB=$DIR/lib64 fi if test -f $DIR/lib64/libldap.a then LDAPLIB=$DIR/lib64 fi done if test "$USERLDAPINC" != ""; then LDAPINC="$USERLDAPINC" fi if test "$USERLDAPLIB" != ""; then LDAPLIB="$USERLDAPLIB" fi # See if it builds LDAPOK="YES" if test "$LDAPINC" != ""; then INCOPT="-I$LDAPINC"; fi if test "$LDAPLIB" != ""; then LIBOPT="-L$LDAPLIB"; fi cd build OS=`uname -s | sed -e's@/@_@g'` $MAKE -f Makefile.test-ldap clean OS=`uname -s | sed -e's@/@_@g'` LDAPINC="$INCOPT" $MAKE -f Makefile.test-ldap test-compile 2>/dev/null if test $? -eq 0; then echo "Compiling with LDAP works OK" else echo "WARNING: Cannot compile with LDAP" LDAPOK="NO" fi if test "$LDAPOK" = "YES" then OS=`uname -s | sed -e's@/@_@g'` $MAKE -f Makefile.test-lber clean OS=`uname -s | sed -e's@/@_@g'` LDAPINC="$INCOPT" $MAKE -f Makefile.test-lber test-compile 2>/dev/null if test $? -eq 0; then OS=`uname -s | sed -e's@/@_@g'` LDAPLIB="$LIBOPT" $MAKE -f Makefile.test-lber test-link 2>/dev/null if test $? -eq 0; then echo "LBER library not needed" LDAPLBER="" else OS=`uname -s | sed -e's@/@_@g'` LDAPLIB="$LIBOPT" LDAPLBER="-llber" $MAKE -f Makefile.test-lber test-link 2>/dev/null if test $? -eq 0; then echo "LDAP requires the LBER library" LDAPLBER="-llber" else echo "LBER library not found, disabling LDAP support" LDAPOK="NO" fi fi else echo "WARNING: Cannot compile with LBER, disabling LDAP support" LDAPOK="NO" fi fi OS=`uname -s | sed -e's@/@_@g'` LDAPLIB="$LIBOPT" LDAPLBER="$LDAPLBER" $MAKE -f Makefile.test-ldap test-link 2>/dev/null if test $? -eq 0; then echo "Linking with LDAP works OK" LDAPVENDOR=`./test-ldap vendor` LDAPVERSION=`./test-ldap version` LDAPCOMPILEFLAGS=`./test-ldap flags` # echo "LDAP vendor is $LDAPVENDOR, version $LDAPVERSION" else echo "WARNING: Cannot link with LDAP" LDAPOK="NO" fi OS=`uname -s | sed -e's@/@_@g'` $MAKE -f Makefile.test-ldap clean OS=`uname -s | sed -e's@/@_@g'` $MAKE -f Makefile.test-lber clean cd .. if test "$LDAPOK" = "NO"; then echo "(Open)LDAP include- or library-files not found." echo "If you want to perform detailed LDAP tests (queries), you need" echo "to install an LDAP client library that Xymon can use." echo "OpenLDAP can be found at http://www.openldap.org/" echo "" echo "If you have OpenLDAP installed, use the \"--ldapinclude DIR\" and \"--ldaplib DIR\"" echo "options to configure to specify where they are." echo "" sleep 3 echo "Continuing with LDAP support disabled." fi xymon-4.3.28/build/merge-sects.c0000664000076400007640000000730512263072434016703 0ustar rpmbuildrpmbuild/* * Merge the current "[...]" sectioned file with a new template. New entries are added, * and existing ones are copied over from the current setup. */ #include #include #include #include #include #include typedef struct entry_t { char *name; char *val; int copied; struct entry_t *next; } entry_t; typedef struct newname_t { char *oldname, *newname; struct newname_t *next; } newname_t; entry_t *head = NULL; entry_t *tail = NULL; newname_t *newnames = NULL; int main(int argc, char *argv[]) { char *curfn, *curbckfn, *srcfn; FILE *curfd, *curbckfd, *srcfd; struct stat st; char l[32768]; entry_t *ewalk; entry_t *newent = NULL; int adding = 0; int showit = 1; if (argc < 3) { printf("Usage: %s DESTINATIONFILE TEMPLATEFILE\n", argv[0]); return 1; } srcfn = strdup(argv[1]); curfn = strdup(argv[2]); if (argc > 3) { int i; char *p; for (i=3; (i < argc); i++) { p = strchr(argv[i], '='); if (p) { newname_t *newitem = (newname_t *)malloc(sizeof(newname_t)); *p = '\0'; newitem->oldname = strdup(argv[i]); newitem->newname = strdup(p+1); newitem->next = newnames; newnames = newitem; } } } curbckfn = (char *)malloc(strlen(curfn) + 5); sprintf(curbckfn, "%s.bak", curfn); if (stat(curfn, &st) == -1) { showit = 0; goto nooriginal; } curfd = fopen(curfn, "r"); unlink(curbckfn); curbckfd = fopen(curbckfn, "w"); if (curfd == NULL) { printf("Cannot open configuration file %s\n", curfn); return 1; } if (curbckfd == NULL) { printf("Cannot open backup file %s\n", curbckfn); return 1; } while (fgets(l, sizeof(l), curfd)) { char *bol, *p; newname_t *nwalk; fprintf(curbckfd, "%s", l); bol = l + strspn(l, " \t\r\n"); if ((*bol == '#') || (*bol == '\0')) continue; if ((*bol == '[') && strchr(bol, ']')) { newent = (entry_t *)malloc(sizeof(entry_t)); p = strchr(bol, ']'); *p = '\0'; for (nwalk = newnames; (nwalk && strcmp(nwalk->oldname, bol+1)); nwalk = nwalk->next); if (nwalk) { newent->name = strdup(nwalk->newname); newent->val = (char *)malloc(strlen(nwalk->newname) + 4); sprintf(newent->val, "[%s]\n", nwalk->newname); } else { newent->name = strdup(bol+1); *p = ']'; newent->val = strdup(l); } newent->copied = 0; newent->next = NULL; if (tail == NULL) { tail = head = newent; } else { tail->next = newent; tail = newent; } } else if (newent) { newent->val = (char *)realloc(newent->val, strlen(newent->val) + strlen(l) + 1); strcat(newent->val, l); } } fclose(curfd); fclose(curbckfd); nooriginal: srcfd = fopen(srcfn, "r"); unlink(curfn); curfd = fopen(curfn, "w"); if (srcfd == NULL) { printf("Cannot open template file %s\n", srcfn); return 1; } if (curfd == NULL) { printf("Cannot open config file %s\n", curfn); return 1; } fchmod(fileno(curfd), S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); while (fgets(l, sizeof(l), srcfd)) { char *bol, *p; bol = l + strspn(l, " \t\r\n"); if ((*bol == '[') && strchr(bol, ']')) { p = strchr(bol, ']'); *p = '\0'; for (ewalk = head; (ewalk && strcmp(ewalk->name, bol+1)); ewalk = ewalk->next) ; *p = ']'; if (ewalk) { fprintf(curfd, "%s", ewalk->val); ewalk->copied = 1; adding = 0; } else { if (showit) printf("Adding new entry to %s: %s", curfn, l); fprintf(curfd, "%s", l); adding = 1; } } else if (adding || (*bol == '#') || (*bol == '\0')) { fprintf(curfd, "%s", l); } } /* Copy over any local settings that have been added */ for (ewalk = head; (ewalk); ewalk = ewalk->next) { if (!ewalk->copied) { fprintf(curfd, "%s", ewalk->val); } } fclose(curfd); fclose(srcfd); return 0; } xymon-4.3.28/build/Makefile.test-clockgettime-librt0000664000076400007640000000067611070452713022522 0ustar rpmbuildrpmbuildinclude Makefile.$(OS) test-clockgettime-librt.o: test-clockgettime-librt.c @$(CC) $(CFLAGS) -o test-clockgettime-librt.o -c test-clockgettime-librt.c test-link: test-clockgettime-librt.o @$(CC) $(CFLAGS) -o test-clockgettime-librt test-clockgettime-librt.o test-link-rt: test-clockgettime-librt.o @$(CC) $(CFLAGS) -o test-clockgettime-librt test-clockgettime-librt.o -lrt clean: @rm -f test-clockgettime-librt.o test-clockgettime-librt xymon-4.3.28/build/test-pcre.c0000664000076400007640000000030011535462534016364 0ustar rpmbuildrpmbuild#include int main(int argc, char *argv[]) { pcre *result; const char *errmsg; int errofs; result = pcre_compile("xymon.*", PCRE_CASELESS, &errmsg, &errofs, NULL); return 0; } xymon-4.3.28/build/Makefile.OpenBSD0000664000076400007640000000146012005761247017207 0ustar rpmbuildrpmbuild# Xymon compile-time settings for OpenBSD systems OSDEF = -DBSD # NETLIBS: None needed NETLIBS = # Compile flags for normal build CC = gcc GCCVER := $(shell gcc -dumpversion|cut -d. -f1) ifeq ($(GCCVER),4) CFLAGS = -g -O2 -Wall -Wno-unused -Wno-pointer-sign -D_REENTRANT -I/usr/local/include -L/usr/local/lib $(LFSDEF) $(OSDEF) else CFLAGS = -g -O2 -Wall -Wno-unused -D_REENTRANT -I/usr/local/include -L/usr/local/lib $(LFSDEF) $(OSDEF) endif # # According to reports, this does not work on OpenBSD # RPATH = "-Wl,--rpath," # Compile flags for debugging # CFLAGS = -g -DDEBUG -Wall -D_REENTRANT -I/usr/local/include -L/usr/local/lib $(LFSDEF) $(OSDEF) # Mail program: This must support "CMD -s SUBJECT ADDRESS" to send out a mail with a subject # Typically, this will be "mail" or "mailx" MAILPROGRAM="mail" xymon-4.3.28/build/Makefile.Darwin0000664000076400007640000000160212006166517017177 0ustar rpmbuildrpmbuild# Xymon compile-time settings for Darwin (Mac OS X) # OSDEF = -DDarwin # NETLIBS: You may need to add -lresolv or similar to pick up network libraries NETLIBS = # Compile flags for normal build CC = gcc GCCVER := $(shell gcc -dumpversion|cut -d. -f1) ifeq ($(GCCVER),4) CFLAGS = -g -O -Wall -Wno-unused -Wno-pointer-sign -D_REENTRANT -DBIND_8_COMPAT=1 $(LFSDEF) $(OSDEF) else CFLAGS = -g -O -Wall -Wno-unused -D_REENTRANT -DBIND_8_COMPAT=1 $(LFSDEF) $(OSDEF) endif # Compile flags for debugging # CFLAGS = -g -DDEBUG -D_REENTRANT -DBIND_8_COMPAT=1 $(LFSDEF) $(OSDEF) # Extra environment settings for runtime stuff. # E.g. RUNTIMEDEFS="LD_LIBRARY_PATH=\"/opt/lib\"" to use # runtime libraries located in /opt/lib RUNTIMEDEFS = # Mail program: This must support "CMD -s SUBJECT ADDRESS" to send out a mail with a subject # Typically, this will be "mail" or "mailx" MAILPROGRAM="mail" xymon-4.3.28/build/test-socklent.c0000664000076400007640000000057311070452713017261 0ustar rpmbuildrpmbuild#include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { int connres; socklen_t connressize = sizeof(connres); int res, sockfd = 0; res = getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &connres, &connressize); return 0; } xymon-4.3.28/build/Makefile.OSF10000664000076400007640000000071411535462534016472 0ustar rpmbuildrpmbuild# Xymon compile-time settings for a OSF/1 system # OSDEF = -DOSF # NETLIBS: You may need to add -lresolv or similar to pick up network libraries NETLIBS = # Compile flags for normal build CC = cc CFLAGS = -g -O -D_REENTRANT $(OSDEF) # Compile flags for debugging # CFLAGS = -g -DDEBUG -D_REENTRANT # Mail program: This must support "CMD -s SUBJECT ADDRESS" to send out a mail with a subject # Typically, this will be "mail" or "mailx" MAILPROGRAM="mail" xymon-4.3.28/build/c-ares.sh0000775000076400007640000000326112275770001016025 0ustar rpmbuildrpmbuild echo "Checking for C-ARES library ..." CARESINC="" CARESLIB="" for DIR in /opt/c*ares* /usr/local/c*ares* /usr/local /usr/pkg /opt/csw /opt/sfw do if test -f $DIR/include/ares.h then CARESINC=$DIR/include fi if test -f $DIR/include/ares/ares.h then CARESINC=$DIR/include/ares fi if test -f $DIR/lib/libcares.so then CARESLIB=$DIR/lib fi if test -f $DIR/lib/libcares.a then CARESLIB=$DIR/lib fi if test -f $DIR/lib64/libcares.so then CARESLIB=$DIR/lib64 fi if test -f $DIR/lib64/libcares.a then CARESLIB=$DIR/lib64 fi done if test "$USERCARESINC" != ""; then CARESINC="$USERCARESINC" fi if test "$USERCARESLIB" != ""; then CARESLIB="$USERCARESLIB" fi # Lets see if it can build CARESOK="YES" cd build if test "$CARESINC" != ""; then INCOPT="-I$CARESINC"; fi if test "$CARESLIB" != ""; then LIBOPT="-L$CARESLIB"; fi OS=`uname -s | sed -e's@/@_@g'` $MAKE -f Makefile.test-cares ares-clean OS=`uname -s | sed -e's@/@_@g'` CARESINC="$INCOPT" $MAKE -f Makefile.test-cares test-compile if test $? -eq 0; then echo "Compiling with c-ares library works OK" else echo "ERROR: Cannot compile using c-ares library." CARESOK="NO" fi if test "$CARESOK" = "YES" then OS=`uname -s | sed -e's@/@_@g'` CARESLIB="$LIBOPT" $MAKE -f Makefile.test-cares test-link if test $? -eq 0; then echo "Linking with c-ares library works OK" else echo "ERROR: Cannot link with c-ares library." CARESOK="NO" fi OS=`uname -s | sed -e's@/@_@g'` $MAKE -f Makefile.test-cares ares-clean fi cd .. if test "$CARESOK" = "NO"; then echo "The system C-ARES library is missing or not usable. I will use the version shipped with Xymon" fi xymon-4.3.28/build/Makefile.test-lber0000664000076400007640000000033512001246456017652 0ustar rpmbuildrpmbuildinclude Makefile.$(OS) test-compile: @$(CC) $(CFLAGS) $(LDAPINC) -o test-lber.o -c test-lber.c test-link: @$(CC) $(CFLAGS) $(LDAPLIB) -o test-lber test-lber.o -lldap $(LDAPLBER) clean: @rm -f test-lber.o test-lber xymon-4.3.28/build/Makefile.AIX0000664000076400007640000000115011535462534016376 0ustar rpmbuildrpmbuild# Xymon compile-time settings for a AIX system # OSDEF = -DAIX # NETLIBS: You may need to add -lresolv or similar to pick up network libraries NETLIBS = # Compile flags for normal build with gcc # CC = gcc # CFLAGS = -O -D_REENTRANT $(OSDEF) # Compile flags for normal build with IBM compiler CC = cc CFLAGS = -g -O3 -qstrict -qcpluscmt -D_REENTRANT $(LFSDEF) $(OSDEF) # Compile flags for debugging # CFLAGS = -g -DDEBUG -D_REENTRANT $(LFSDEF) $(OSDEF) # Mail program: This must support "CMD -s SUBJECT ADDRESS" to send out a mail with a subject # Typically, this will be "mail" or "mailx" MAILPROGRAM="mail" xymon-4.3.28/build/updmanver0000775000076400007640000000106212411274461016241 0ustar rpmbuildrpmbuild#!/bin/bash export LANG=C DATE=`date +"%e %b %Y"` VERSION=$1 if [ "$VERSION" = "" ] then echo "Usage: $0 VERSION" exit 1 fi # cd $HOME/xymon || exit 1 for DIR in xymongen xymonnet xymonproxy common xymond web do pushd $DIR # co -l RCS/*.[1-9],v for f in *.[1-9] do NAME=`head -n 1 $f | awk '{print $2}'`; SECTION=`head -n 1 $f | awk '{print $3}'`; (echo ".TH $NAME $SECTION \"Version $VERSION: $DATE\" \"Xymon\""; tail -n +2 $f) >$f.new mv -f $f.new $f # ci -u -m"Version update" -q -f $f done popd done xymon-4.3.28/build/merge-lines.c0000664000076400007640000001460212271162643016673 0ustar rpmbuildrpmbuild/* * Merge the current xymonserver.cfg file with a new template. New entries are added, * and existing ones are copied over from the current setup. */ #include #include #include #include #include #include typedef struct entry_t { char *name; char *val; int copied; struct entry_t *next; int extracount; char **extralines; } entry_t; typedef struct newname_t { char *oldname, *newname; struct newname_t *next; } newname_t; entry_t *head = NULL; entry_t *tail = NULL; newname_t *newnames = NULL; char *lastblankandcomment = NULL; int main(int argc, char *argv[]) { char *curfn, *curbckfn, *srcfn; FILE *curfd, *curbckfd, *srcfd; char delim = '='; char alldelims[10]; char l[32768]; entry_t *ewalk; struct stat st; int showit = 1; srcfn = strdup(argv[1]); curfn = strdup(argv[2]); if (argc > 3) { int i; char *p; for (i=3; (i < argc); i++) { p = strchr(argv[i], '='); if (p) { newname_t *newitem = (newname_t *)malloc(sizeof(newname_t)); *p = '\0'; newitem->oldname = strdup(argv[i]); newitem->newname = strdup(p+1); newitem->next = newnames; newnames = newitem; } } } curbckfn = (char *)malloc(strlen(curfn) + 5); sprintf(curbckfn, "%s.bak", curfn); if (strstr(srcfn, ".csv")) { delim = ';'; strcpy(alldelims, ";"); } else { sprintf(alldelims, "%c+-", delim); } if (stat(curfn, &st) == -1) { showit = 0; goto nooriginal; } curfd = fopen(curfn, "r"); unlink(curbckfn); curbckfd = fopen(curbckfn, "w"); if (curfd == NULL) { printf("Cannot open config file %s\n", curfn); return 1; } if (curbckfd == NULL) { printf("Cannot create backup file %s\n", curbckfn); return 1; } while (fgets(l, sizeof(l), curfd)) { char *bol, *p; fprintf(curbckfd, "%s", l); bol = l + strspn(l, " \t\r\n"); if ((*bol == '#') || (*bol == '\0')) { if (!lastblankandcomment) lastblankandcomment = strdup(bol); else { lastblankandcomment = (char *)realloc(lastblankandcomment, strlen(lastblankandcomment) + strlen(bol) + 1); strcat(lastblankandcomment, bol); } continue; } if (tail && ((strncmp(bol, "include ", 8) == 0) || (strncmp(bol, "directory ", 10) == 0))) { if (!tail->extralines) { tail->extracount = 1; tail->extralines = (char **)malloc(sizeof(char *)); } else { tail->extracount++; tail->extralines = (char **)realloc(tail->extralines, (tail->extracount*sizeof(char *))); } if (!lastblankandcomment) tail->extralines[tail->extracount-1] = strdup(bol); else { tail->extralines[tail->extracount-1] = (char *)malloc(1 + strlen(bol) + strlen(lastblankandcomment)); sprintf(tail->extralines[tail->extracount-1], "%s%s", lastblankandcomment, bol); } if (lastblankandcomment) { free(lastblankandcomment); lastblankandcomment = NULL; } continue; } p = bol + strcspn(bol, alldelims); if (*p) { entry_t *newent; if (*p == delim) { *p = '\0'; newent = (entry_t *)calloc(1, sizeof(entry_t)); newent->name = strdup(bol); *p = delim; newent->val = strdup(l); if (tail == NULL) { tail = head = newent; } else { tail->next = newent; tail = newent; } } else if (*(p+1) == delim) { char sav = *p; entry_t *walk; *p = '\0'; for (walk = head; (walk && (strcmp(walk->name, bol) != 0)); walk = walk->next) ; *p = sav; if (walk) { if (!walk->extralines) { walk->extracount = 1; walk->extralines = (char **)malloc(sizeof(char *)); } else { walk->extracount++; walk->extralines = (char **)realloc(walk->extralines, (walk->extracount*sizeof(char *))); } if (!lastblankandcomment) walk->extralines[walk->extracount-1] = strdup(bol); else { walk->extralines[walk->extracount-1] = (char *)malloc(1 + strlen(bol) + strlen(lastblankandcomment)); sprintf(walk->extralines[walk->extracount-1], "%s%s", lastblankandcomment, bol); } } } if (lastblankandcomment) { free(lastblankandcomment); lastblankandcomment = NULL; } } } fclose(curfd); fclose(curbckfd); if (lastblankandcomment) { /* Add this to the last entry */ if (!tail->extralines) { tail->extracount = 1; tail->extralines = (char **)malloc(sizeof(char *)); } else { tail->extracount++; tail->extralines = (char **)realloc(tail->extralines, (tail->extracount*sizeof(char *))); } tail->extralines[tail->extracount-1] = strdup(lastblankandcomment); } nooriginal: srcfd = fopen(srcfn, "r"); unlink(curfn); curfd = fopen(curfn, "w"); if (srcfd == NULL) { printf("Cannot open template file %s\n", srcfn); return 1; } if (curfd == NULL) { printf("Cannot create config file %s\n", curfn); return 1; } fchmod(fileno(curfd), S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); while (fgets(l, sizeof(l), srcfd)) { char *bol, *p; bol = l + strspn(l, " \t\r\n"); if ((*bol == '#') || (*bol == '\0') || (strncmp(bol, "include ", 8) == 0) || (strncmp(bol, "directory ", 10) == 0)) { fprintf(curfd, "%s", l); continue; } p = strchr(bol, delim); if (p) { /* Find the old value */ *p = '\0'; for (ewalk = head; (ewalk && strcmp(ewalk->name, bol)); ewalk = ewalk->next) ; if (!ewalk) { /* See if it's been renamed */ newname_t *nwalk; for (nwalk = newnames; (nwalk && strcmp(nwalk->newname, bol)); nwalk = nwalk->next) ; if (nwalk) { /* It has - find the value of the old setting */ for (ewalk = head; (ewalk && strcmp(ewalk->name, nwalk->oldname)); ewalk = ewalk->next) ; if (ewalk) { /* Merge it with the new name */ char *newval; char *oval = strchr(ewalk->val, delim); newval = (char *)malloc(strlen(nwalk->newname) + strlen(oval) + 1); sprintf(newval, "%s%s", nwalk->newname, oval); ewalk->val = newval; } } } *p = delim; if (ewalk) { fprintf(curfd, "%s", ewalk->val); if (ewalk->extralines) { int i; for (i = 0; (i < ewalk->extracount); i++) fprintf(curfd, "%s", ewalk->extralines[i]); } ewalk->copied = 1; } else { if (showit) printf("Adding new entry to %s: %s", curfn, l); fprintf(curfd, "%s", l); } } else { fprintf(curfd, "%s", l); } } /* Copy over any local settings that have been added */ for (ewalk = head; (ewalk); ewalk = ewalk->next) { if (!ewalk->copied) { fprintf(curfd, "%s", ewalk->val); } } fclose(curfd); fclose(srcfd); return 0; } xymon-4.3.28/build/generate-md5.sh0000775000076400007640000000052212277655770017146 0ustar rpmbuildrpmbuild#!/bin/sh # cd ~/xymon/trunk WEBLIST=`(cd xymond; find webfiles -type f) | egrep -v "RCS|\.svn" | xargs echo` WWWLIST=`(cd xymond; find wwwfiles -type f) | egrep -v "RCS|\.svn" | xargs echo` (cat build/md5.dat; for F in $WEBLIST $WWWLIST; do echo "md5:`openssl dgst -md5 xymond/${F} | awk '{print $2}'` ${F}"; done) | sort -k2 | uniq xymon-4.3.28/build/test-lber.c0000664000076400007640000000022112004462124016344 0ustar rpmbuildrpmbuild#include int main(int argc, char **argv) { BerElement *dummy; char *foo = "bar"; dummy = ber_init(ber_bvstrdup(foo)); return 0; } xymon-4.3.28/build/Makefile.IRIX0000664000076400007640000000121311535462534016530 0ustar rpmbuildrpmbuild# Xymon compile-time settings for a IRIX system # OSDEF = -DIRIX # NETLIBS: You may need to add -lresolv or similar to pick up network libraries NETLIBS = # Compile flags for normal build CC = cc CFLAGS = -g -O -D_REENTRANT $(OSDEF) $(LFSDEF) # Compile flags for debugging # CFLAGS = -g -DDEBUG -D_REENTRANT $(OSDEF) $(LFSDEF) # Extra environment settings for runtime stuff. # E.g. RUNTIMEDEFS="LD_LIBRARY_PATH=\"/opt/lib\"" to use # runtime libraries located in /opt/lib RUNTIMEDEFS = # Mail program: This must support "CMD -s SUBJECT ADDRESS" to send out a mail with a subject # Typically, this will be "mail" or "mailx" MAILPROGRAM="mail" xymon-4.3.28/build/renametasks.c0000664000076400007640000001053511535424634017005 0ustar rpmbuildrpmbuild#include #include #include #include int main(int argc, char **argv) { char buf[10240]; while (fgets(buf, sizeof(buf), stdin)) { char *dlim; dlim = (*buf == '[') ? strchr(buf, ']') : NULL; if (dlim != NULL) { *dlim = '\0'; if (strcmp(buf+1, "hobbitd") == 0) printf("[xymond]%s", dlim+1); else if (strcmp(buf+1, "bbstatus") == 0) printf("[storestatus]%s", dlim+1); else if (strcmp(buf+1, "bbhistory") == 0) printf("[history]%s", dlim+1); else if (strcmp(buf+1, "hostdata") == 0) printf("[hostdata]%s", dlim+1); else if (strcmp(buf+1, "bbdata") == 0) printf("[storedata]%s", dlim+1); else if (strcmp(buf+1, "bbnotes") == 0) printf("[storenotes]%s", dlim+1); else if (strcmp(buf+1, "bbenadis") == 0) printf("[storeenadis]%s", dlim+1); else if (strcmp(buf+1, "bbpage") == 0) printf("[alert]%s", dlim+1); else if (strcmp(buf+1, "rrdstatus") == 0) printf("[rrdstatus]%s", dlim+1); else if (strcmp(buf+1, "larrdstatus") == 0) printf("[rrdstatus]%s", dlim+1); else if (strcmp(buf+1, "rrddata") == 0) printf("[rrddata]%s", dlim+1); else if (strcmp(buf+1, "larrddata") == 0) printf("[rrddata]%s", dlim+1); else if (strcmp(buf+1, "clientdata") == 0) printf("[clientdata]%s", dlim+1); else if (strcmp(buf+1, "bbproxy") == 0) printf("[xymonproxy]%s", dlim+1); else if (strcmp(buf+1, "hobbitfetch") == 0) printf("[xymonfetch]%s", dlim+1); else if (strcmp(buf+1, "bbdisplay") == 0) printf("[xymongen]%s", dlim+1); else if (strcmp(buf+1, "bbcombotest") == 0) printf("[combostatus]%s", dlim+1); else if (strcmp(buf+1, "bbnet") == 0) printf("[xymonnet]%s", dlim+1); else if (strcmp(buf+1, "bbretest") == 0) printf("[xymonnetagain]%s", dlim+1); else if (strcmp(buf+1, "hobbitclient") == 0) printf("[xymonclient]%s", dlim+1); else { *dlim = ']'; printf("%s", buf); } continue; } dlim = buf + strspn(buf, " \t"); if (strncasecmp(dlim, "NEEDS", 5) == 0) { char *nam; char savchar; nam = dlim + 5; nam += strspn(nam, " \t"); dlim = nam + strspn(nam, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefhijklmnopqrstuvwxyz"); savchar = *dlim; *dlim = '\0'; if (strcmp(nam, "hobbitd") == 0) { *nam = '\0'; printf("%sxymond%c%s", buf, savchar, dlim); } else if (strcmp(nam, "bbstatus") == 0) { *nam = '\0'; printf("%sstorestatus%c%s", buf, savchar, dlim); } else if (strcmp(nam, "bbhistory") == 0) { *nam = '\0'; printf("%shistory%c%s", buf, savchar, dlim); } else if (strcmp(nam, "hostdata") == 0) { *nam = '\0'; printf("%shostdata%c%s", buf, savchar, dlim); } else if (strcmp(nam, "bbdata") == 0) { *nam = '\0'; printf("%sstoredata%c%s", buf, savchar, dlim); } else if (strcmp(nam, "bbnotes") == 0) { *nam = '\0'; printf("%sstorenotes%c%s", buf, savchar, dlim); } else if (strcmp(nam, "bbenadis") == 0) { *nam = '\0'; printf("%sstoreenadis%c%s", buf, savchar, dlim); } else if (strcmp(nam, "bbpage") == 0) { *nam = '\0'; printf("%salert%c%s", buf, savchar, dlim); } else if (strcmp(nam, "rrdstatus") == 0) { *nam = '\0'; printf("%srrdstatus%c%s", buf, savchar, dlim); } else if (strcmp(nam, "larrdstatus") == 0) { *nam = '\0'; printf("%srrdstatus%c%s", buf, savchar, dlim); } else if (strcmp(nam, "rrddata") == 0) { *nam = '\0'; printf("%srrddata%c%s", buf, savchar, dlim); } else if (strcmp(nam, "larrddata") == 0) { *nam = '\0'; printf("%srrddata%c%s", buf, savchar, dlim); } else if (strcmp(nam, "clientdata") == 0) { *nam = '\0'; printf("%sclientdata%c%s", buf, savchar, dlim); } else if (strcmp(nam, "bbproxy") == 0) { *nam = '\0'; printf("%sxymonproxy%c%s", buf, savchar, dlim); } else if (strcmp(nam, "hobbitfetch") == 0) { *nam = '\0'; printf("%sxymonfetch%c%s", buf, savchar, dlim); } else if (strcmp(nam, "bbdisplay") == 0) { *nam = '\0'; printf("%sxymongen%c%s", buf, savchar, dlim); } else if (strcmp(nam, "bbcombotest") == 0) { *nam = '\0'; printf("%scombostatus%c%s", buf, savchar, dlim); } else if (strcmp(nam, "bbnet") == 0) { *nam = '\0'; printf("%sxymonnet%c%s", buf, savchar, dlim); } else if (strcmp(nam, "bbretest") == 0) { *nam = '\0'; printf("%sxymonnetagain%c%s", buf, savchar, dlim); } else if (strcmp(nam, "hobbitclient") == 0) { *nam = '\0'; printf("%sxymonclient%c%s", buf, savchar, dlim); } else { *dlim = savchar; printf("%s", buf); } continue; } printf("%s", buf); } return 0; } xymon-4.3.28/build/revlog.c0000664000076400007640000000233011070452713015751 0ustar rpmbuildrpmbuild#include int main(int argc, char *argv[]) { char *date = argv[1]; char *fn = argv[2]; FILE *logfd; char cmd[4096]; char buf[4096]; int gotrevmarker = 0; int gotlocksline = 0; int fileislocked = 0; sprintf(cmd, "rlog \"-d>%s\" %s 2>/dev/null", date, fn); logfd = popen(cmd, "r"); while (fgets(buf, sizeof(buf), logfd)) { if (gotlocksline == 0) { if (strncmp(buf, "locks:", 6) == 0) gotlocksline = 1; } else if (gotlocksline == 1) { if (isspace(*buf)) fileislocked = 1; gotlocksline = 2; } if (!gotrevmarker) { gotrevmarker = (strcmp(buf, "----------------------------\n") == 0); if (gotrevmarker) { fprintf(stdout, "%s", fn); if (fileislocked) fprintf(stdout, " (is being edited)"); fprintf(stdout, "\n"); fileislocked = 0; } } if (gotrevmarker) fprintf(stdout, "%s", buf); } pclose(logfd); if (fileislocked) { /* Locked file, but we haven't shown anything yet */ fprintf(stdout, "%s", fn); if (fileislocked) fprintf(stdout, " (is being edited)"); fprintf(stdout, "\n"); fprintf(stdout, "%s\n", "============================================================================="); } if (gotrevmarker || fileislocked) fprintf(stdout, "\n"); return 0; } xymon-4.3.28/build/test-bintree.c0000664000076400007640000000147012275523176017076 0ustar rpmbuildrpmbuild#include #include #include #include void *root = NULL; int compare(const void *pa, const void *pb) { if (*(int *) pa < *(int *) pb) return -1; if (*(int *) pa > *(int *) pb) return 1; return 0; } void action(const void *nodep, const VISIT which, const int depth) { int *datap; switch (which) { case preorder: case endorder: break; case postorder: case leaf: datap = *(int **) nodep; printf("%6d\n", *datap); break; } } int main(void) { int i, *ptr; void *val; srand(time(NULL)); for (i = 0; i < 12; i++) { ptr = malloc(sizeof(int)); *ptr = rand() & 0xff; val = tsearch((void *) ptr, &root, compare); if (val == NULL) exit(EXIT_FAILURE); else if ((*(int **) val) != ptr) free(ptr); } twalk(root, action); exit(EXIT_SUCCESS); } xymon-4.3.28/build/genconfig.sh0000775000076400007640000000654612520566040016622 0ustar rpmbuildrpmbuild#!/bin/sh # Simpler than autoconf, but it does what we need it to do right now. echo "/* This file is auto-generated */" >include/config.h echo "#ifndef __CONFIG_H__" >>include/config.h echo "#define __CONFIG_H__ 1" >>include/config.h echo "Checking for socklen_t" $CC -c -o build/testfile.o $CFLAGS build/test-socklent.c 1>/dev/null 2>&1 if test $? -eq 0; then echo "#define HAVE_SOCKLEN_T 1" >>include/config.h else echo "#undef HAVE_SOCKLEN_T" >>include/config.h fi echo "Checking for snprintf" $CC -c -o build/testfile.o $CFLAGS build/test-snprintf.c 1>/dev/null 2>&1 if test $? -eq 0; then $CC -o build/testfile $CFLAGS build/testfile.o 1>/dev/null 2>&1 if test $? -eq 0; then echo "#define HAVE_SNPRINTF 1" >>include/config.h else echo "#undef HAVE_SNPRINTF" >>include/config.h fi else echo "#undef HAVE_SNPRINTF" >>include/config.h fi echo "Checking for vsnprintf" $CC -c -o build/testfile.o $CFLAGS build/test-vsnprintf.c 1>/dev/null 2>&1 if test $? -eq 0; then $CC -o build/testfile $CFLAGS build/testfile.o 1>/dev/null 2>&1 if test $? -eq 0; then echo "#define HAVE_VSNPRINTF 1" >>include/config.h else echo "#undef HAVE_VSNPRINTF" >>include/config.h fi else echo "#undef HAVE_VSNPRINTF" >>include/config.h fi echo "Checking for rpc/rpcent.h" $CC -c -o build/testfile.o $CFLAGS build/test-rpcenth.c 1>/dev/null 2>&1 if test $? -eq 0; then echo "#define HAVE_RPCENT_H 1" >>include/config.h else echo "#undef HAVE_RPCENT_H" >>include/config.h fi echo "Checking for sys/select.h" $CC -c -o build/testfile.o $CFLAGS build/test-sysselecth.c 1>/dev/null 2>&1 if test $? -eq 0; then echo "#define HAVE_SYS_SELECT_H 1" >>include/config.h else echo "#undef HAVE_SYS_SELECT_H" >>include/config.h fi echo "Checking for u_int32_t typedef" $CC -c -o build/testfile.o $CFLAGS build/test-uint.c 1>/dev/null 2>&1 if test $? -eq 0; then echo "#define HAVE_UINT32_TYPEDEF 1" >>include/config.h else echo "#undef HAVE_UINT32_TYPEDEF" >>include/config.h fi echo "Checking for PATH_MAX definition" $CC -o build/testfile $CFLAGS build/test-pathmax.c 1>/dev/null 2>&1 if test -x build/testfile; then ./build/testfile >>include/config.h; fi echo "Checking for SHUT_RD/WR/RDWR definitions" $CC -o build/testfile $CFLAGS build/test-shutdown.c 1>/dev/null 2>&1 if test -x build/testfile; then ./build/testfile >>include/config.h; fi echo "Checking for strtoll()" $CC -c -o build/testfile.o $CFLAGS build/test-strtoll.c 1>/dev/null 2>&1 if test $? -eq 0; then echo "#define HAVE_STRTOLL_H 1" >>include/config.h else echo "#undef HAVE_STRTOLL_H" >>include/config.h fi echo "Checking for uname" $CC -c -o build/testfile.o $CFLAGS build/test-uname.c 1>/dev/null 2>&1 if test $? -eq 0; then echo "#define HAVE_UNAME 1" >>include/config.h else echo "#undef HAVE_UNAME" >>include/config.h fi echo "Checking for setenv" $CC -c -o build/testfile.o $CFLAGS build/test-setenv.c 1>/dev/null 2>&1 if test $? -eq 0; then echo "#define HAVE_SETENV 1" >>include/config.h else echo "#undef HAVE_SETENV" >>include/config.h fi # This is experimental for 4.3.x #echo "Checking for POSIX binary tree functions" #$CC -c -o build/testfile.o $CFLAGS build/test-bintree.c 1>/dev/null 2>&1 #if test $? -eq 0; then # echo "#define HAVE_BINARY_TREE 1" >>include/config.h #else echo "#undef HAVE_BINARY_TREE" >>include/config.h #fi echo "#endif" >>include/config.h echo "config.h created" rm -f testfile.o testfile exit 0 xymon-4.3.28/build/pcre.sh0000775000076400007640000000337112003230207015572 0ustar rpmbuildrpmbuild echo "Checking for PCRE ..." PCREINC="" PCRELIB="" for DIR in /opt/pcre* /usr/local/pcre* /usr/local /usr/pkg /opt/csw /opt/sfw do if test -f $DIR/include/pcre.h then PCREINC=$DIR/include fi if test -f $DIR/include/pcre/pcre.h then PCREINC=$DIR/include/pcre fi if test -f $DIR/lib/libpcre.so then PCRELIB=$DIR/lib fi if test -f $DIR/lib/libpcre.a then PCRELIB=$DIR/lib fi if test -f $DIR/lib64/libpcre.so then PCRELIB=$DIR/lib64 fi if test -f $DIR/lib64/libpcre.a then PCRELIB=$DIR/lib64 fi done if test "$USERPCREINC" != ""; then PCREINC="$USERPCREINC" fi if test "$USERPCRELIB" != ""; then PCRELIB="$USERPCRELIB" fi # Lets see if it can build PCREOK="YES" cd build if test "$PCREINC" != ""; then INCOPT="-I$PCREINC"; fi if test "$PCRELIB" != ""; then LIBOPT="-L$PCRELIB"; fi OS=`uname -s | sed -e's@/@_@g'` $MAKE -f Makefile.test-pcre clean OS=`uname -s | sed -e's@/@_@g'` PCREINC="$INCOPT" $MAKE -f Makefile.test-pcre test-compile if test $? -eq 0; then echo "Compiling with PCRE library works OK" else echo "ERROR: Cannot compile using PCRE library." PCREOK="NO" fi OS=`uname -s | sed -e's@/@_@g'` PCRELIB="$LIBOPT" $MAKE -f Makefile.test-pcre test-link if test $? -eq 0; then echo "Linking with PCRE library works OK" else echo "ERROR: Cannot link with PCRE library." PCREOK="NO" fi OS=`uname -s | sed -e's@/@_@g'` $MAKE -f Makefile.test-pcre clean cd .. if test "$PCREOK" = "NO"; then echo "Missing PCRE include- or library-files. These are REQUIRED for xymond" echo "PCRE can be found at http://www.pcre.org/" echo "If you have PCRE installed, use the \"--pcreinclude DIR\" and \"--pcrelib DIR\"" echo "options to configure to specify where they are." exit 1 fi xymon-4.3.28/build/upgrade430.sh0000775000076400007640000003243511535424634016544 0ustar rpmbuildrpmbuild#!/bin/sh renameandlink() { if test -f $1 then mv $1 $2 ln -s $2 $1 fi } if test "$BBHOME" = "" then echo "ERROR: This must be invoked using the bbcmd utility" echo " bbcmd $0" exit 1 fi # Get directory where we are running from SDIR=`dirname $0` # Could be a relative path SDIRFULL=`(cd $SDIR; pwd)` if test ! -f $SDIRFULL/renamevars then echo "ERROR: You must run 'make' first to build the 4.3.0 tools" exit 1 fi cd $BBHOME/etc || (echo "Cannot cd to etc directory"; exit 1) if test ! -w .; then echo "Cannot write to etc directory"; exit 1; fi renameandlink bb-hosts hosts.cfg renameandlink bbcombotest.cfg combo.cfg renameandlink hobbit-alerts.cfg alerts.cfg renameandlink hobbit-nkview.cfg critical.cfg renameandlink hobbit-nkview.cfg.bak critical.cfg.bak renameandlink hobbit-rrddefinitions.cfg rrddefinitions.cfg renameandlink hobbitgraph.cfg graphs.cfg renameandlink hobbit-holidays.cfg holidays.cfg renameandlink hobbit-clients.cfg analysis.cfg renameandlink hobbit-snmpmibs.cfg snmpmibs.cfg renameandlink hobbit-apache.conf xymon-apache.conf renameandlink bb-services protocols.cfg renameandlink hobbitcgi.cfg cgioptions.cfg if test -f hobbitlaunch.cfg then mv hobbitlaunch.cfg tasks.old $SDIRFULL/renametasks tasks.cfg ln -s tasks.cfg hobbitlaunch.cfg fi if test -f hobbitserver.cfg then mv hobbitserver.cfg xymonserver.old $SDIRFULL/renamevars >xymonserver.cfg <xymonclient.cfg <&1|head -1|cut -d' ' -f1) #ifeq ($(LDTYPE),GNU) # RPATH=-Wl,--rpath, #else # RPATH=-Wl,-R #endif # Compile flags for debugging # CFLAGS = -g -DDEBUG -Wall -D_REENTRANT $(LFSDEF) $(OSDEF) # Mail program: This must support "CMD -s SUBJECT ADDRESS" to send out a mail with a subject # Typically, this will be "mail" or "mailx" MAILPROGRAM="mailx" xymon-4.3.28/build/test-pathmax.c0000664000076400007640000000033611070452713017076 0ustar rpmbuildrpmbuild#include #include #include int main(int argc, char *argv[]) { long res; #ifndef PATH_MAX res = pathconf("/", _PC_PATH_MAX); printf("#define PATH_MAX %ld\n", res); #endif return 0; } xymon-4.3.28/build/test-rpcenth.c0000664000076400007640000000011211070452713017067 0ustar rpmbuildrpmbuild#include int main(int argc, char *argv[]) { return 0; } xymon-4.3.28/build/test-ssl.c0000664000076400007640000000054511070452713016237 0ustar rpmbuildrpmbuild#include #include #include #include #include #if !defined(OPENSSL_VERSION_NUMBER) || (OPENSSL_VERSION_NUMBER < 0x00905000L) #error SSL-protocol testing requires OpenSSL version 0.9.5 or later #endif int main(int argc, char *argv[]) { SSL_library_init(); return 0; } xymon-4.3.28/build/test-strtoll.c0000664000076400007640000000025611070452713017140 0ustar rpmbuildrpmbuild#include #include int main(int argc, char **argv) { long long l; l = strtoll("1234567890123456789x", NULL, 10); printf("%lld\n", l); return 0; } xymon-4.3.28/build/ssl.sh0000775000076400007640000000732512674126516015472 0ustar rpmbuildrpmbuild echo "Checking for OpenSSL ..." OSSLINC="" OSSLLIB="" for DIR in /opt/openssl* /opt/ssl* /usr/local/openssl* /usr/local/ssl* /usr/local /usr/pkg /opt/csw /opt/sfw/*ssl* /usr/sfw /usr/sfw/*ssl* do if test -d $DIR/include/openssl then OSSLINC=$DIR/include fi if test -f $DIR/lib/libcrypto.so then OSSLLIB=$DIR/lib fi if test -f $DIR/lib/libcrypto.a then OSSLLIB=$DIR/lib fi if test -f $DIR/lib64/libcrypto.so then OSSLLIB=$DIR/lib64 fi if test -f $DIR/lib64/libcrypto.a then OSSLLIB=$DIR/lib64 fi done if test "$USEROSSLINC" != ""; then OSSLINC="$USEROSSLINC" fi if test "$USEROSSLLIB" != ""; then OSSLLIB="$USEROSSLLIB" fi # Red Hat in their wisdom ships an openssl that depends on Kerberos, # and then puts the Kerberos includes where they are not found automatically. if test "`uname -s`" = "Linux" -a -d /usr/kerberos/include then OSSLINC="$OSSLINC -I/usr/kerberos/include" fi # Lets see if it builds SSLOK="YES" cd build if test "$OSSLINC" != ""; then INCOPT="-I$OSSLINC"; fi if test "$OSSLLIB" != ""; then LIBOPT="-L$OSSLLIB"; fi OS=`uname -s | sed -e's@/@_@g'` $MAKE -f Makefile.test-ssl clean OS=`uname -s | sed -e's@/@_@g'` OSSLINC="$INCOPT" $MAKE -f Makefile.test-ssl test-compile if test $? -eq 0; then echo "Compiling with SSL library works OK" else echo "Warning: Cannot compile with SSL library" SSLOK="NO" fi OS=`uname -s | sed -e's@/@_@g'` OSSLLIB="$LIBOPT" $MAKE -f Makefile.test-ssl test-link if test $? -eq 0; then echo "Linking with SSL library works OK" else echo "Warning: Cannot link with SSL library" SSLOK="NO" fi OS=`uname -s | sed -e's@/@_@g'` $MAKE -f Makefile.test-ssl clean cd .. if test "$SSLOK" = "YES"; then SSLFLAGS="-DHAVE_OPENSSL" cd build echo "Checking if your SSL library has SSLv2 enabled" OS=`uname -s | sed -e's@/@_@g'` OSSLINC="$INCOPT" OSSLLIB="$LIBOPT" $MAKE -f Makefile.test-ssl2 test-compile 2>/dev/null CSTAT=$?; LSTAT=$? if test $CSTAT -eq 0; then OS=`uname -s | sed -e's@/@_@g'` OSSLINC="$INCOPT" OSSLLIB="$LIBOPT" $MAKE -f Makefile.test-ssl2 test-link 2>/dev/null LSTAT=$? fi if test $CSTAT -ne 0 -o $LSTAT -ne 0; then echo "SSLv2 support disabled (dont worry, all systems should use SSLv1 or TLS)" OSSL2OK="N" else echo "Will support SSLv2 when testing SSL-enabled network services" OSSL2OK="Y" SSLFLAGS="$SSLFLAGS -DHAVE_SSLV2_SUPPORT" fi OS=`uname -s | sed -e's@/@_@g'` $MAKE -f Makefile.test-ssl2 clean echo "Checking if your SSL library has SSLv3 enabled" OS=`uname -s | sed -e's@/@_@g'` OSSLINC="$INCOPT" OSSLLIB="$LIBOPT" $MAKE -f Makefile.test-ssl3 test-compile 2>/dev/null CSTAT=$?; LSTAT=$? if test $CSTAT -eq 0; then OS=`uname -s | sed -e's@/@_@g'` OSSLINC="$INCOPT" OSSLLIB="$LIBOPT" $MAKE -f Makefile.test-ssl3 test-link 2>/dev/null LSTAT=$? fi if test $CSTAT -ne 0 -o $LSTAT -ne 0; then echo "SSLv3 support disabled (dont worry, all systems should use SSLv1 or TLS)" OSSL3OK="N" else echo "Will support SSLv3 when testing SSL-enabled network services" OSSL3OK="Y" SSLFLAGS="$SSLFLAGS -DHAVE_SSLV3_SUPPORT" fi OS=`uname -s | sed -e's@/@_@g'` $MAKE -f Makefile.test-ssl3 clean cd .. fi if test "$SSLOK" = "NO"; then echo "OpenSSL include- or library-files not found." echo "Although you can use Xymon without OpenSSL, you will not" echo "be able to run network tests of SSL-enabled services, e.g. https." echo "So installing OpenSSL is recommended." echo "OpenSSL can be found at http://www.openssl.org/" echo "" echo "If you have OpenSSL installed, use the \"--sslinclude DIR\" and \"--ssllib DIR\"" echo "options to configure to specify where they are." echo "" sleep 3 echo "Continuing with SSL support disabled." fi xymon-4.3.28/build/Makefile.HP-UX0000664000076400007640000000254312006166517016621 0ustar rpmbuildrpmbuild# Xymon compile-time settings for a HP-UX system OSDEF = -DHPUX # NETLIBS: You may need to add -lresolv or similar to pick up network libraries NETLIBS = -lnsl # Compile flags for normal build # NOTE: HP-UX built-in compiler is horribly broken and will not compile Xymon. # So you should use the GNU compiler, gcc. CC = gcc # NOTE: Some HP-UX 11i systems have a severely broken set of include files. This # will typically show up when compiling the "xymonnet/xymonnet.c" where it bombs with # xymonnet.c: In function 'send_rpcinfo_results': # xymonnet.c:1794: warning: assignment makes pointer from integer without a cast # xymonnet.c:1801: error: dereferencing pointer to incomplete type # xymonnet.c:1813: error: dereferencing pointer to incomplete type # xymonnet.c:1818: error: dereferencing pointer to incomplete type # If that happens, try adding -DBROKEN_HPUX_NETDB at the end of the CFLAGS line below. GCCVER := $(shell gcc -dumpversion|cut -d. -f1) ifeq ($(GCCVER),4) CFLAGS = -Wno-unused -Wno-pointer-sign -g -O -D_REENTRANT $(LFSDEF) $(OSDEF) else CFLAGS = -g -O -D_REENTRANT $(LFSDEF) $(OSDEF) endif # Compile flags for debugging # CFLAGS = -g -DDEBUG -D_REENTRANT $(LFSDEF) $(OSDEF) # Mail program: This must support "CMD -s SUBJECT ADDRESS" to send out a mail with a subject # Typically, this will be "mail" or "mailx" MAILPROGRAM="mailx" xymon-4.3.28/build/setup-newfiles.c0000664000076400007640000000722312603243142017430 0ustar rpmbuildrpmbuild#include #include #include #include #include #include #include #include #include #include "libxymon.h" int main(int argc, char *argv[]) { char srcfn[PATH_MAX]; char destfn[PATH_MAX]; char *p; struct stat st; unsigned char *sumbuf = NULL; if (argc > 2) { if (stat(argv[2], &st) == 0) { FILE *sumfd; printf("Loading md5-data ... "); sumfd = fopen(argv[2], "r"); if (sumfd) { sumbuf = (char *)malloc(st.st_size + 1); if (fread(sumbuf, 1, st.st_size, sumfd) == st.st_size) { printf("OK\n"); } else { printf("failed\n"); free(sumbuf); sumbuf = NULL; } fclose(sumfd); } else { printf("failed\n"); } } } while (fgets(srcfn, sizeof(srcfn), stdin)) { FILE *fd; unsigned char buf[8192]; size_t buflen; digestctx_t *ctx; char srcmd5[40]; char *md5sum; p = strchr(srcfn, '\n'); if (p) *p = '\0'; strcpy(destfn, argv[1]); p = srcfn; if (strcmp(srcfn, ".") == 0) p = ""; else if (strncmp(p, "./", 2) == 0) p += 2; strcat(destfn, p); *srcmd5 = '\0'; if (((fd = fopen(srcfn, "r")) != NULL) && ((ctx = digest_init("md5")) != NULL)) { while ((buflen = fread(buf, 1, sizeof(buf), fd)) > 0) digest_data(ctx, buf, buflen); strcpy(srcmd5, digest_done(ctx)); fclose(fd); } if (stat(destfn, &st) == 0) { /* Destination file exists, see if it's a previous version */ if (sumbuf == NULL) continue; /* No md5-data, don't overwrite an existing file */ if (!S_ISREG(st.st_mode)) continue; fd = fopen(destfn, "r"); if (fd == NULL) continue; if ((ctx = digest_init("md5")) == NULL) continue; while ((buflen = fread(buf, 1, sizeof(buf), fd)) > 0) digest_data(ctx, buf, buflen); md5sum = digest_done(ctx); fclose(fd); if (strstr(sumbuf, md5sum) == NULL) continue; /* Not one of our known versions */ if (strcmp(srcmd5, md5sum) == 0) continue; /* Already installed */ /* We now know the destination that exists is just one of our old files */ printf("Updating old standard file %s\n", destfn); unlink(destfn); } else { printf("Installing new file %s\n", destfn); } if (lstat(srcfn, &st) != 0) { printf("Error - cannot lstat() %s\n", srcfn); return 1; } if (S_ISREG(st.st_mode)) { FILE *infd, *outfd; char buf[16384]; int n; infd = fopen(srcfn, "r"); if (infd == NULL) { /* Don't know how this can happen, but .. */ fprintf(stderr, "Cannot open input file %s: %s\n", srcfn, strerror(errno)); return 1; } outfd = fopen(destfn, "w"); if (outfd == NULL) { /* Don't know how this can happen, but .. */ fprintf(stderr, "Cannot create output file %s: %s\n", destfn, strerror(errno)); return 1; } fchmod(fileno(outfd), S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); while ( (n = fread(buf, 1, sizeof(buf), infd)) > 0) fwrite(buf, 1, n, outfd); fclose(infd); fclose(outfd); } else if (S_ISDIR(st.st_mode)) { struct stat tmpst; /* Create upper-lying directories */ if (*destfn == '/') p = strchr(destfn+1, '/'); else p = strchr(destfn, '/'); while (p) { *p = '\0'; if ((stat(destfn, &tmpst) == 0) || (mkdir(destfn, st.st_mode) == 0)) { *p = '/'; p = strchr(p+1, '/'); } else p = NULL; } /* Create the directory itself */ if (stat(destfn, &tmpst) == -1) mkdir(destfn, st.st_mode); chmod(destfn, S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH); } else if (S_ISLNK(st.st_mode)) { char ldest[PATH_MAX + 1]; memset(ldest, 0, sizeof(ldest)); if ((readlink(srcfn, ldest, sizeof(ldest)-1) != -1) && (symlink(ldest, destfn) == 0)) {}; } } return 0; } xymon-4.3.28/build/Makefile.OSX0000664000076400007640000000074511535462534016437 0ustar rpmbuildrpmbuild# Xymon compile-time settings for Darwin systems # Contributed by "Marc" # NETLIBS: None needed NETLIBS = # Compile flags for normal build CC = cc CFLAGS = -g -O2 -Wall -Wno-unused -D_REENTRANT -D_BSD_SOCKLEN_T_=int $(LFSDEF) $(OSDEF) # Compile flags for debugging # CFLAGS = -g -DDEBUG -Wall -D_REENTRANT $(LFSDEF) $(OSDEF) # Mail program: This must support "CMD -s SUBJECT ADDRESS" to send out a mail with a subject # Typically, this will be "mail" or "mailx" MAILPROGRAM="mail" xymon-4.3.28/build/makehtml.sh0000775000076400007640000000153712007210740016451 0ustar rpmbuildrpmbuild#!/bin/bash export LANG=C DATE=`date +"%e %b %Y"` VERSION="$1" if [ "$VERSION" = "" ] then echo "Usage: $0 VERSION" exit 1 fi # cd ~/xymon/trunk rm -f docs/*~ docs/manpages/index.html* docs/manpages/man1/* docs/manpages/man5/* docs/manpages/man7/* docs/manpages/man8/* for DIR in xymongen xymonnet xymonproxy common xymond web do for SECT in 1 5 7 8 do for FILE in $DIR/*.$SECT do if [ -r $FILE ] then NAME=`head -n 1 $FILE | awk '{print $2}'`; SECTION=`head -n 1 $FILE | awk '{print $3}'`; (echo ".TH $NAME $SECTION \"Version $VERSION: $DATE\" \"Xymon\""; tail -n +2 $FILE) | \ man2html -r - | tail -n +2 >docs/manpages/man$SECT/`basename $FILE`.html fi done done done # Sourceforge update # cd ~/xymon/trunk/docs && rsync -av --rsh=ssh --exclude=RCS ./ storner@shell.sourceforge.net:/home/groups/x/xy/xymon/htdocs/docs/ xymon-4.3.28/build/Makefile.test-ldap0000664000076400007640000000033511070452713017646 0ustar rpmbuildrpmbuildinclude Makefile.$(OS) test-compile: @$(CC) $(CFLAGS) $(LDAPINC) -o test-ldap.o -c test-ldap.c test-link: @$(CC) $(CFLAGS) $(LDAPLIB) -o test-ldap test-ldap.o -lldap $(LDAPLBER) clean: @rm -f test-ldap.o test-ldap xymon-4.3.28/build/test-uint.c0000664000076400007640000000022611070452713016411 0ustar rpmbuildrpmbuild#include #include int main(int argc, char *argv[]) { u_int32_t l; l = 1; printf("%u:%d\n", l, sizeof(l)); return 0; } xymon-4.3.28/build/test-snprintf.c0000664000076400007640000000036411070452713017300 0ustar rpmbuildrpmbuild#include #include #include #include #include #include int main(int argc, char *argv[]) { char l[100]; snprintf(l, sizeof(l), "testing ... %d %d %d\n", 1, 2, 3); return 0; } xymon-4.3.28/build/Makefile0000664000076400007640000000065012000050736015743 0ustar rpmbuildrpmbuildTOOLS = merge-lines merge-sects setup-newfiles renamevars renametasks all: $(TOOLS) merge-lines: merge-lines.c $(CC) -o $@ $(CFLAGS) $< merge-sects: merge-sects.c $(CC) -o $@ $(CFLAGS) $< setup-newfiles: setup-newfiles.c $(CC) -o $@ $(CFLAGS) $< ../lib/libxymonclient.a renamevars: renamevars.c $(CC) -o $@ $(CFLAGS) $< renametasks: renametasks.c $(CC) -o $@ $(CFLAGS) $< clean: rm -f $(TOOLS) testfile *.o *~ xymon-4.3.28/build/test-setenv.c0000664000076400007640000000014012523024624016731 0ustar rpmbuildrpmbuild#include int main(int argc, char *argv[]) { setenv("FOO", "BAR", 1); return 0; } xymon-4.3.28/build/test-cares.c0000664000076400007640000000346612274210064016536 0ustar rpmbuildrpmbuild#include #include #include #include #include #include int main(int argc, char *argv[]) { static ares_channel mychannel; struct ares_options options; int status, version, ver_maj, ver_min, ver_patch; int ver_maj_required, ver_min_required, ver_patch_required, failed = 0; const char *versionstr; char *version_required, *tok; version_required = strdup(argv[1]); tok = strtok(version_required, "."); ver_maj_required = atoi(tok); tok = strtok(NULL, "."); ver_min_required = atoi(tok); tok = strtok(NULL, "."); ver_patch_required = atoi(tok); versionstr = ares_version(&version); ver_maj = ((version >> 16) & 0xFF); ver_min = ((version >> 8) & 0xFF); ver_patch = (version & 0xFF); if (ver_maj > ver_maj_required) failed = 0; else if (ver_maj < ver_maj_required) failed = 1; else { /* Major version matches */ if (ver_min > ver_min_required) failed = 0; else if (ver_min < ver_min_required) failed = 1; else { /* Major and minor version matches */ if (ver_patch > ver_patch_required) failed = 0; else if (ver_patch < ver_patch_required) failed = 1; else { /* Major, minor and patch matches */ failed = 0; } } } printf("C-ARES version: Found %d.%d.%d - %s, require %d.%d.%d\n", ver_maj, ver_min, ver_patch, (failed ? "too old, will use included version" : "OK"), ver_maj_required, ver_min_required, ver_patch_required ); /* ARES timeout backported from Xymon trunk 20120411 - this should give us a ~23 second timeout */ options.timeout = 2000; options.tries = 4; status = ares_init_options(&mychannel, &options, (ARES_OPT_TIMEOUTMS | ARES_OPT_TRIES)); if (status != ARES_SUCCESS) { printf("c-ares init failed\n"); return 1; } ares_destroy(mychannel); return (failed ? 1 : 0); } xymon-4.3.28/build/rrd.sh0000775000076400007640000000705312005761320015440 0ustar rpmbuildrpmbuild echo "Checking for RRDtool ..." RRDDEF="" RRDINC="" RRDLIB="" PNGLIB="" ZLIB="" for DIR in /opt/rrdtool* /usr/local/rrdtool* /usr/local /usr/pkg /opt/csw /opt/sfw /usr/sfw do if test -f $DIR/include/rrd.h then RRDINC=$DIR/include fi if test -f $DIR/lib/librrd.so then RRDLIB=$DIR/lib fi if test -f $DIR/lib/librrd.a then RRDLIB=$DIR/lib fi if test -f $DIR/lib64/librrd.so then RRDLIB=$DIR/lib64 fi if test -f $DIR/lib64/librrd.a then RRDLIB=$DIR/lib64 fi if test -f $DIR/lib/libpng.so then PNGLIB="-L$DIR/lib -lpng" fi if test -f $DIR/lib/libpng.a then PNGLIB="-L$DIR/lib -lpng" fi if test -f $DIR/lib64/libpng.so then PNGLIB="-L$DIR/lib64 -lpng" fi if test -f $DIR/lib64/libpng.a then PNGLIB="-L$DIR/lib64 -lpng" fi if test -f $DIR/lib/libz.so then ZLIB="-L$DIR/lib -lz" fi if test -f $DIR/lib/libz.a then ZLIB="-L$DIR/lib -lz" fi if test -f $DIR/lib64/libz.so then ZLIB="-L$DIR/lib64 -lz" fi if test -f $DIR/lib64/libz.a then ZLIB="-L$DIR/lib64 -lz" fi done if test "$USERRRDINC" != ""; then RRDINC="$USERRRDINC" fi if test "$USERRRDLIB" != ""; then RRDLIB="$USERRRDLIB" fi # See if it builds RRDOK="YES" if test "$RRDINC" != ""; then INCOPT="-I$RRDINC"; fi if test "$RRDLIB" != ""; then LIBOPT="-L$RRDLIB"; fi cd build OS=`uname -s | sed -e's@/@_@g'` $MAKE -f Makefile.test-rrd clean OS=`uname -s | sed -e's@/@_@g'` RRDDEF="$RRDDEF" RRDINC="$INCOPT" $MAKE -f Makefile.test-rrd test-compile 2>/dev/null if test $? -ne 0; then # See if it's the new RRDtool 1.2.x echo "Not RRDtool 1.0.x, checking for 1.2.x" RRDDEF="-DRRDTOOL12" OS=`uname -s | sed -e's@/@_@g'` $MAKE -f Makefile.test-rrd clean OS=`uname -s | sed -e's@/@_@g'` RRDDEF="$RRDDEF" RRDINC="$INCOPT" $MAKE -f Makefile.test-rrd test-compile fi if test $? -eq 0; then echo "Compiling with RRDtool works OK" else echo "ERROR: Cannot compile with RRDtool." RRDOK="NO" fi OS=`uname -s | sed -e's@/@_@g'` RRDLIB="$LIBOPT" PNGLIB="$PNGLIB" $MAKE -f Makefile.test-rrd test-link 2>/dev/null if test $? -ne 0; then # Could be that we need -lz for RRD PNGLIB="$PNGLIB $ZLIB" fi OS=`uname -s | sed -e's@/@_@g'` RRDLIB="$LIBOPT" PNGLIB="$PNGLIB" $MAKE -f Makefile.test-rrd test-link 2>/dev/null if test $? -ne 0; then # Could be that we need -lm for RRD PNGLIB="$PNGLIB -lm" fi OS=`uname -s | sed -e's@/@_@g'` RRDLIB="$LIBOPT" PNGLIB="$PNGLIB" $MAKE -f Makefile.test-rrd test-link 2>/dev/null if test $? -ne 0; then # Could be that we need -L/usr/X11R6/lib (OpenBSD) LIBOPT="$LIBOPT -L/usr/X11R6/lib" RRDLIB="$RRDLIB -L/usr/X11R6/lib" fi OS=`uname -s | sed -e's@/@_@g'` RRDLIB="$LIBOPT" PNGLIB="$PNGLIB" $MAKE -f Makefile.test-rrd test-link 2>/dev/null if test $? -eq 0; then echo "Linking with RRDtool works OK" if test "$PNGLIB" != ""; then echo "Linking RRD needs extra library: $PNGLIB" fi else echo "ERROR: Linking with RRDtool fails" RRDOK="NO" fi OS=`uname -s | sed -e's@/@_@g'` $MAKE -f Makefile.test-rrd clean cd .. if test "$RRDOK" = "NO"; then echo "RRDtool include- or library-files not found." echo "These are REQUIRED for trend-graph support in Xymon, but Xymon can" echo "be built without them (e.g. for a network-probe only installation." echo "" echo "RRDtool can be found at http://oss.oetiker.ch/rrdtool/" echo "If you have RRDtool installed, use the \"--rrdinclude DIR\" and \"--rrdlib DIR\"" echo "options to configure to specify where they are." echo "" echo "Continuing with all trend-graph support DISABLED" sleep 3 fi xymon-4.3.28/build/makedeb.sh0000775000076400007640000000157012463723221016245 0ustar rpmbuildrpmbuild#!/bin/bash REL=$1 if [ "$REL" = "" ]; then echo "Error - missing release number" exit 1 fi BASEDIR=`pwd` cd $BASEDIR rm -rf debbuild mkdir -p $BASEDIR/debbuild/xymon-$REL for f in xymongen xymonnet bbpatches xymonproxy build common contrib docs xymond web include lib client demotool do find $f/ | egrep -v "RCS|\.svn" | cpio -pdvmu $BASEDIR/debbuild/xymon-$REL/ done cp -p Changes configure configure.server configure.client COPYING CREDITS README README.CLIENT RELEASENOTES $BASEDIR/debbuild/xymon-$REL/ find $BASEDIR/debbuild/xymon-$REL -type d|xargs chmod 755 cd debbuild pushd xymon-$REL make -f ../../Makefile distclean popd tar zcf xymon-$REL.tar.gz xymon-$REL cd $BASEDIR find debian | egrep -v "RCS|pkg|\.svn" | cpio -pdvmu $BASEDIR/debbuild/xymon-$REL/ cd debbuild/xymon-$REL dpkg-buildpackage -rfakeroot #mv ../xymon*$REL*.{deb,dsc,changes} ../../debian/pkg/ xymon-4.3.28/build/Makefile.rules0000664000076400007640000005525013003327002017077 0ustar rpmbuildrpmbuild# Xymon main Makefile # # This file is included from the Makefile created by the "configure" script ##################### # Build targets ##################### CFLAGS += -I$(BUILDTOPDIR)/include ifeq ($(CLIENTONLY),yes) BUILDTARGETS = client CFLAGS += -DCLIENTONLY=1 XYMONCLIENTHOME = $(XYMONTOPDIR) XYMONHOME = $(XYMONTOPDIR) ifeq ($(LOCALCLIENT),yes) CLIENTTARGETS = lib-client common-client build-build xymond-client INSTALLTARGETS = install-client install-localclient install-clientmsg CFLAGS += -DLOCALCLIENT=1 $(PCREINCDIR) else CLIENTTARGETS = lib-client common-client build-build INSTALLTARGETS = install-client install-clientmsg endif else BUILDTARGETS = lib-build common-build xymongen-build xymonnet-build xymonproxy-build docs-build build-build xymond-build web-build client CLIENTTARGETS = lib-client common-client build-build INSTALLTARGETS = install-xymongen install-xymonnet install-xymonproxy install-xymond install-web install-docs install-client install-servermsg CFLAGS += $(PCREINCDIR) XYMONCLIENTHOME = $(XYMONTOPDIR)/client XYMONHOME = $(XYMONTOPDIR)/server endif ifndef INSTALLBINDIR INSTALLBINDIR = $(XYMONHOME)/bin endif ifndef INSTALLETCDIR INSTALLETCDIR = $(XYMONHOME)/etc endif ifndef INSTALLEXTDIR INSTALLEXTDIR = $(XYMONHOME)/ext endif ifndef INSTALLTMPDIR INSTALLTMPDIR = $(XYMONHOME)/tmp endif ifndef INSTALLWEBDIR INSTALLWEBDIR = $(XYMONHOME)/web endif ifndef INSTALLWWWDIR INSTALLWWWDIR = $(XYMONHOME)/www endif ARESVER = 1.12.0 FPINGVER = 3.0 IDTOOL := $(shell if test `uname -s` = "SunOS"; then echo /usr/xpg4/bin/id; else echo id; fi) ifdef RPATH RPATHOPT := $(RPATH)$(shell echo $(RPATHVAL) | sed -e 's/ / $(RPATH)/g') endif all: include/config.h $(BUILDTARGETS) @echo "" @echo "Build complete." @echo "" @echo "#####################################################################" @echo "IMPORTANT: If upgrading from 4.2.x, see the docs/upgrade-to-430.txt" @echo " file for instructions. You must run build/upgrade430.sh" @echo " before installing the new version." @echo "#####################################################################" @echo "" @echo "Now run '${MAKE} install' as root" @echo "" client: include/config.h $(CLIENTTARGETS) CC="$(CC)" CFLAGS="$(CFLAGS)" XYMONHOME="$(XYMONCLIENTHOME)" XYMONHOSTIP="$(XYMONHOSTIP)" LOCALCLIENT="$(LOCALCLIENT)" SSLLIBS="$(SSLLIBS)" NETLIBS="$(NETLIBS)" LIBRTDEF="$(LIBRTDEF)" $(MAKE) -C client all include/config.h: MAKE="$(MAKE)" CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" $(BUILDTOPDIR)/build/genconfig.sh build-build: CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" RPATHOPT="$(RPATHOPT)" SSLLIBS="$(SSLLIBS)" NETLIBS="$(NETLIBS)" LIBRTDEF="$(LIBRTDEF)" XYMONHOME="$(XYMONHOME)" $(MAKE) -C build all lib-build: include/config.h CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" OSDEF="$(OSDEF)" RPATHOPT="$(RPATHOPT)" PCREINCDIR="$(PCREINCDIR)" ZLIBINCDIR="$(ZLIBINCDIR)" SSLFLAGS="$(SSLFLAGS)" SSLINCDIR="$(SSLINCDIR)" SSLLIBS="$(SSLLIBS)" NETLIBS="$(NETLIBS)" LIBRTDEF="$(LIBRTDEF)" XYMONTOPDIR="$(XYMONTOPDIR)" XYMONHOME="$(XYMONHOME)" XYMONCLIENTHOME=$(XYMONCLIENTHOME) XYMONLOGDIR="$(XYMONLOGDIR)" XYMONHOSTNAME="$(XYMONHOSTNAME)" XYMONHOSTIP="$(XYMONHOSTIP)" XYMONHOSTOS="$(XYMONHOSTOS)" $(MAKE) -C lib all lib-client: CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" OSDEF="$(OSDEF)" RPATHOPT="$(RPATHOPT)" PCREINCDIR="$(PCREINCDIR)" ZLIBINCDIR="$(ZLIBINCDIR)" SSLFLAGS="$(SSLFLAGS)" SSLINCDIR="$(SSLINCDIR)" SSLLIBS="$(SSLLIBS)" NETLIBS="$(NETLIBS)" LIBRTDEF="$(LIBRTDEF)" XYMONTOPDIR="$(XYMONTOPDIR)" XYMONHOME="$(XYMONCLIENTHOME)" XYMONCLIENTHOME=$(XYMONCLIENTHOME) XYMONLOGDIR="$(XYMONLOGDIR)" XYMONHOSTNAME="$(XYMONHOSTNAME)" XYMONHOSTIP="$(XYMONHOSTIP)" XYMONHOSTOS="$(XYMONHOSTOS)" LOCALCLIENT="$(LOCALCLIENT)" $(MAKE) -C lib client common-build: lib-build CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" RPATHOPT="$(RPATHOPT)" SSLFLAGS="$(SSLFLAGS)" SSLINCDIR="$(SSLINCDIR)" SSLLIBS="$(SSLLIBS)" NETLIBS="$(NETLIBS)" ZLIBLIBS="$(ZLIBLIBS)" LIBRTDEF="$(LIBRTDEF)" XYMONHOME="$(XYMONHOME)" $(MAKE) -C common all common-client: lib-client CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" RPATHOPT="$(RPATHOPT)" SSLFLAGS="$(SSLFLAGS)" SSLINCDIR="$(SSLINCDIR)" SSLLIBS="$(SSLLIBS)" NETLIBS="$(NETLIBS)" ZLIBLIBS="$(ZLIBLIBS)" LIBRTDEF="$(LIBRTDEF)" XYMONHOME="$(XYMONCLIENTHOME)" $(MAKE) -C common client xymongen-build: lib-build common-build CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" RPATHOPT="$(RPATHOPT)" SSLFLAGS="$(SSLFLAGS)" SSLINCDIR="$(SSLINCDIR)" SSLLIBS="$(SSLLIBS)" NETLIBS="$(NETLIBS)" LIBRTDEF="$(LIBRTDEF)" XYMONHOME="$(XYMONHOME)" XYMONVAR="$(XYMONVAR)" HISTGRAPHDEF="$(HISTGRAPHDEF)" RUNTIMEDEFS="$(RUNTIMEDEFS)" PCREINCDIR="$(PCREINCDIR)" PCRELIBS="$(PCRELIBS)" ZLIBINCDIR="$(ZLIBINCDIR)" ZLIBLIBS="$(ZLIBLIBS)" $(MAKE) -C xymongen all xymonnet-build: lib-build common-build CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" RPATHOPT="$(RPATHOPT)" SSLFLAGS="$(SSLFLAGS)" SSLINCDIR="$(SSLINCDIR)" SSLLIBS="$(SSLLIBS)" DOLDAP="$(DOLDAP)" LDAPFLAGS="$(LDAPFLAGS)" LDAPINCDIR="$(LDAPINCDIR)" LDAPLIBS="$(LDAPLIBS)" DOSNMP="$(DOSNMP)" NETLIBS="$(NETLIBS)" XYMONHOME="$(XYMONHOME)" ARESVER="$(ARESVER)" FPINGVER="$(FPINGVER)" RUNTIMEDEFS="$(RUNTIMEDEFS)" PCREINCDIR="$(PCREINCDIR)" PCRELIBS="$(PCRELIBS)" SYSTEMCARES="$(SYSTEMCARES)" CARESINCDIR="$(CARESINCDIR)" CARESLIBS="$(CARESLIBS)" SQLITELIBS="$(SQLITELIBS)" ZLIBINCDIR="$(ZLIBINCDIR)" ZLIBLIBS="$(ZLIBLIBS)" LIBRTDEF="$(LIBRTDEF)" $(MAKE) -C xymonnet all xymonproxy-build: lib-build common-build CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" RPATHOPT="$(RPATHOPT)" SSLLIBS="$(SSLLIBS)" NETLIBS="$(NETLIBS)" LIBRTDEF="$(LIBRTDEF)" XYMONHOME="$(XYMONHOME)" $(MAKE) -C xymonproxy all xymond-build: lib-build build-build common-build CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" RPATHOPT="$(RPATHOPT)" DORRD="$(DORRD)" RRDDEF="$(RRDDEF)" RRDINCDIR="$(RRDINCDIR)" PCREINCDIR="$(PCREINCDIR)" SSLFLAGS="$(SSLFLAGS)" SSLLIBS="$(SSLLIBS)" NETLIBS="$(NETLIBS)" RRDLIBS="$(RRDLIBS)" PCRELIBS="$(PCRELIBS)" SQLITELIBS="$(SQLITELIBS)" ZLIBINCDIR="$(ZLIBINCDIR)" ZLIBLIBS="$(ZLIBLIBS)" LIBRTDEF="$(LIBRTDEF)" XYMONTOPDIR="$(XYMONTOPDIR)" XYMONHOME="$(XYMONHOME)" XYMONVAR="$(XYMONVAR)" XYMONLOGDIR="$(XYMONLOGDIR)" XYMONHOSTNAME="$(XYMONHOSTNAME)" XYMONHOSTIP="$(XYMONHOSTIP)" XYMONHOSTOS="$(XYMONHOSTOS)" XYMONUSER="$(XYMONUSER)" CGIDIR="$(CGIDIR)" SECURECGIDIR="$(SECURECGIDIR)" XYMONHOSTURL="$(XYMONHOSTURL)" XYMONCGIURL="$(XYMONCGIURL)" SECUREXYMONCGIURL="$(SECUREXYMONCGIURL)" MAILPROGRAM="$(MAILPROGRAM)" RUNTIMEDEFS="$(RUNTIMEDEFS)" INSTALLWWWDIR="$(INSTALLWWWDIR)" INSTALLETCDIR="$(INSTALLETCDIR)" FPING="$(FPING)" $(MAKE) -C xymond all web-build: lib-build build-build common-build CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" RPATHOPT="$(RPATHOPT)" DORRD="$(DORRD)" RRDDEF="$(RRDDEF)" RRDINCDIR="$(RRDINCDIR)" PCREINCDIR="$(PCREINCDIR)" ZLIBINCDIR="$(ZLIBINCDIR)" ZLIBLIBS="$(ZLIBLIBS)" SSLLIBS="$(SSLLIBS)" NETLIBS="$(NETLIBS)" RRDLIBS="$(RRDLIBS)" PCRELIBS="$(PCRELIBS)" LIBRTDEF="$(LIBRTDEF)" XYMONTOPDIR="$(XYMONTOPDIR)" XYMONHOME="$(XYMONHOME)" XYMONVAR="$(XYMONVAR)" XYMONLOGDIR="$(XYMONLOGDIR)" XYMONHOSTNAME="$(XYMONHOSTNAME)" XYMONHOSTIP="$(XYMONHOSTIP)" XYMONHOSTOS="$(XYMONHOSTOS)" XYMONUSER="$(XYMONUSER)" CGIDIR="$(CGIDIR)" SECURECGIDIR="$(SECURECGIDIR)" XYMONHOSTURL="$(XYMONHOSTURL)" XYMONCGIURL="$(XYMONCGIURL)" SECUREXYMONCGIURL="$(SECUREXYMONCGIURL)" MAILPROGRAM="$(MAILPROGRAM)" RUNTIMEDEFS="$(RUNTIMEDEFS)" INSTALLWWWDIR="$(INSTALLWWWDIR)" INSTALLETCDIR="$(INSTALLETCDIR)" $(MAKE) -C web all xymond-client: lib-client build-build common-client CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" RPATHOPT="$(RPATHOPT)" LIBRTDEF="$(LIBRTDEF)" RRDDEF="$(RRDDEF)" RRDINCDIR="$(RRDINCDIR)" PCREINCDIR="$(PCREINCDIR)" NETLIBS="$(NETLIBS)" RRDLIBS="$(RRDLIBS)" PCRELIBS="$(PCRELIBS)" ZLIBINCDIR="$(ZLIBINCDIR)" ZLIBLIBS="$(ZLIBLIBS)" XYMONTOPDIR="$(XYMONTOPDIR)" XYMONHOME="$(XYMONHOME)" XYMONVAR="$(XYMONVAR)" XYMONLOGDIR="$(XYMONLOGDIR)" XYMONHOSTNAME="$(XYMONHOSTNAME)" XYMONHOSTIP="$(XYMONHOSTIP)" XYMONHOSTOS="$(XYMONHOSTOS)" XYMONUSER="$(XYMONUSER)" CGIDIR="$(CGIDIR)" SECURECGIDIR="$(SECURECGIDIR)" XYMONHOSTURL="$(XYMONHOSTURL)" XYMONCGIURL="$(XYMONCGIURL)" SECUREXYMONCGIURL="$(SECUREXYMONCGIURL)" MAILPROGRAM="$(MAILPROGRAM)" RUNTIMEDEFS="$(RUNTIMEDEFS)" INSTALLWWWDIR="$(INSTALLWWWDIR)" INSTALLETCDIR="$(INSTALLETCDIR)" $(MAKE) -C xymond client docs-build: XYMONHOSTURL="$(XYMONHOSTURL)" $(MAKE) -C docs all custom-build: lib-build CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" RPATHOPT="$(RPATHOPT)" RRDDEF="$(RRDDEF)" RRDINCDIR="$(RRDINCDIR)" PCREINCDIR="$(PCREINCDIR)" NETLIBS="$(NETLIBS)" RRDLIBS="$(RRDLIBS)" PCRELIBS="$(PCRELIBS)" ZLIBINCDIR="$(ZLIBINCDIR)" ZLIBLIBS="$(ZLIBLIBS)" XYMONTOPDIR="$(XYMONTOPDIR)" XYMONHOME="$(XYMONHOME)" XYMONVAR="$(XYMONVAR)" XYMONLOGDIR="$(XYMONLOGDIR)" XYMONHOSTNAME="$(XYMONHOSTNAME)" XYMONHOSTIP="$(XYMONHOSTIP)" XYMONHOSTOS="$(XYMONHOSTOS)" XYMONUSER="$(XYMONUSER)" CGIDIR="$(CGIDIR)" SECURECGIDIR="$(SECURECGIDIR)" XYMONHOSTURL="$(XYMONHOSTURL)" XYMONCGIURL="$(XYMONCGIURL)" SECUREXYMONCGIURL="$(SECUREXYMONCGIURL)" MAILPROGRAM="$(MAILPROGRAM)" RUNTIMEDEFS="$(RUNTIMEDEFS)" INSTALLWWWDIR="$(INSTALLWWWDIR)" INSTALLETCDIR="$(INSTALLETCDIR)" $(MAKE) -C custom all || echo "Skipped custom modules" demo-build: CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" RPATHOPT="$(RPATHOPT)" NETLIBS="$(NETLIBS)" $(MAKE) -C demotool all win32: include/config.h CC="$(CC)" CFLAGS="$(CFLAGS) -DXYMONWINCLIENT -DCLIENTONLY" LDFLAGS="$(LDFLAGS)" RPATHOPT="$(RPATHOPT)" SSLFLAGS="$(SSLFLAGS)" SSLINCDIR="$(SSLINCDIR)" SSLLIBS="$(SSLLIBS)" NETLIBS="$(NETLIBS)" LIBRTDEF="$(LIBRTDEF)" XYMONHOME="$(XYMONHOME)" XYMONTOPDIR="$(XYMONTOPDIR)" XYMONLOGDIR="$(XYMONLOGDIR)" XYMONHOSTNAME="$(XYMONHOSTNAME)" XYMONHOSTIP="$(XYMONHOSTIP)" XYMONHOSTOS="$(XYMONHOSTOS)" $(MAKE) -C common xymon.exe ##################### # Cleanup targets ##################### distclean: allclean rm -f Makefile rm -rf xymonnet/c-ares rm -rf debbuild rpmbuild allclean: clean (cd xymonnet/c-ares 2>/dev/null && $(MAKE) clean) || true clean: $(MAKE) -C build clean $(MAKE) -C lib clean $(MAKE) -C common clean $(MAKE) -C xymongen clean $(MAKE) DOSNMP="$(DOSNMP)" DOLDAP="$(DOLDAP)" -C xymonnet clean $(MAKE) -C xymonproxy clean $(MAKE) DORRD="$(DORRD)" -C xymond clean $(MAKE) DORRD="$(DORRD)" -C web clean $(MAKE) -C docs clean $(MAKE) -C client clean # $(MAKE) -C demotool clean # $(MAKE) -C custom clean || echo "" rm -f ./*~ include/config.h include/*~ debian/*~ rpm/*~ contrib/*~ #################### # Install targets #################### install: $(INSTALLTARGETS) install-servermsg: @echo "" @echo "Installation complete." @echo "" @echo "You must configure your webserver for the Xymon webpages and CGI-scripts." @echo "A sample Apache configuration is in ${XYMONHOME}/etc/xymon-apache.conf" @echo "If you have your Administration CGI scripts in a separate directory," @echo "then you must also setup the password-file with the htpasswd command." @echo "" @echo "To start Xymon, as the $(XYMONUSER) user run '${XYMONHOME}/bin/xymon.sh start'" @echo "To view the Xymon webpages, go to http://${XYMONHOSTNAME}${XYMONHOSTURL}" install-dirs: mkdir -p $(INSTALLROOT)$(XYMONHOME) $(INSTALLROOT)$(XYMONHOME)/download $(INSTALLROOT)$(XYMONVAR) ifndef PKGBUILD chown $(XYMONUSER) $(INSTALLROOT)$(XYMONHOME) $(INSTALLROOT)$(XYMONHOME)/download $(INSTALLROOT)$(XYMONVAR) chgrp `$(IDTOOL) -g $(XYMONUSER)` $(INSTALLROOT)$(XYMONHOME) $(INSTALLROOT)$(XYMONHOME)/download $(INSTALLROOT)$(XYMONVAR) chmod 755 $(INSTALLROOT)$(XYMONHOME) $(INSTALLROOT)$(XYMONHOME)/download $(INSTALLROOT)$(XYMONVAR) endif mkdir -p $(INSTALLROOT)$(INSTALLBINDIR) ifneq ($(INSTALLBINDIR),$(XYMONHOME)/bin) rm -f $(INSTALLROOT)$(XYMONHOME)/bin || true ln -s $(INSTALLBINDIR) $(INSTALLROOT)$(XYMONHOME)/bin || true endif ifndef PKGBUILD chown $(XYMONUSER) $(INSTALLROOT)$(INSTALLBINDIR) chgrp `$(IDTOOL) -g $(XYMONUSER)` $(INSTALLROOT)$(INSTALLBINDIR) chmod 755 $(INSTALLROOT)$(INSTALLBINDIR) endif mkdir -p $(INSTALLROOT)$(INSTALLETCDIR) ifneq ($(INSTALLETCDIR),$(XYMONHOME)/etc) rm -f $(INSTALLROOT)$(XYMONHOME)/etc || true ln -s $(INSTALLETCDIR) $(INSTALLROOT)$(XYMONHOME)/etc || true endif ifndef PKGBUILD chown $(XYMONUSER) $(INSTALLROOT)$(INSTALLETCDIR) chgrp `$(IDTOOL) -g $(XYMONUSER)` $(INSTALLROOT)$(INSTALLETCDIR) chmod 755 $(INSTALLROOT)$(INSTALLETCDIR) endif mkdir -p $(INSTALLROOT)$(INSTALLEXTDIR) ifneq ($(INSTALLEXTDIR),$(XYMONHOME)/ext) rm -f $(INSTALLROOT)$(XYMONHOME)/ext || true ln -s $(INSTALLEXTDIR) $(INSTALLROOT)$(XYMONHOME)/ext || true endif ifndef PKGBUILD chown $(XYMONUSER) $(INSTALLROOT)$(INSTALLEXTDIR) chgrp `$(IDTOOL) -g $(XYMONUSER)` $(INSTALLROOT)$(INSTALLEXTDIR) chmod 755 $(INSTALLROOT)$(INSTALLEXTDIR) endif mkdir -p $(INSTALLROOT)$(INSTALLTMPDIR) ifneq ($(INSTALLTMPDIR),$(XYMONHOME)/tmp) rm -f $(INSTALLROOT)$(XYMONHOME)/tmp || true ln -s $(INSTALLTMPDIR) $(INSTALLROOT)$(XYMONHOME)/tmp || true endif ifndef PKGBUILD chown $(XYMONUSER) $(INSTALLROOT)$(INSTALLTMPDIR) chgrp `$(IDTOOL) -g $(XYMONUSER)` $(INSTALLROOT)$(INSTALLTMPDIR) chmod 755 $(INSTALLROOT)$(INSTALLTMPDIR) endif mkdir -p $(INSTALLROOT)$(INSTALLWEBDIR) ifneq ($(INSTALLWEBDIR),$(XYMONHOME)/web) rm -f $(INSTALLROOT)$(XYMONHOME)/web || true ln -s $(INSTALLWEBDIR) $(INSTALLROOT)$(XYMONHOME)/web || true endif ifndef PKGBUILD chown $(XYMONUSER) $(INSTALLROOT)$(INSTALLWEBDIR) chgrp `$(IDTOOL) -g $(XYMONUSER)` $(INSTALLROOT)$(INSTALLWEBDIR) chmod 755 $(INSTALLROOT)$(INSTALLWEBDIR) endif mkdir -p $(INSTALLROOT)$(INSTALLWWWDIR) $(INSTALLROOT)$(INSTALLWWWDIR)/gifs $(INSTALLROOT)$(INSTALLWWWDIR)/help $(INSTALLROOT)$(INSTALLWWWDIR)/html $(INSTALLROOT)$(INSTALLWWWDIR)/menu $(INSTALLROOT)$(INSTALLWWWDIR)/notes $(INSTALLROOT)$(INSTALLWWWDIR)/rep $(INSTALLROOT)$(INSTALLWWWDIR)/snap $(INSTALLROOT)$(INSTALLWWWDIR)/wml ifneq ($(INSTALLWWWDIR),$(XYMONHOME)/www) rm -f $(INSTALLROOT)$(XYMONHOME)/www || true ln -s $(INSTALLWWWDIR) $(INSTALLROOT)$(XYMONHOME)/www || true endif ifndef PKGBUILD chown $(XYMONUSER) $(INSTALLROOT)$(INSTALLWWWDIR) $(INSTALLROOT)$(INSTALLWWWDIR)/gifs $(INSTALLROOT)$(INSTALLWWWDIR)/help $(INSTALLROOT)$(INSTALLWWWDIR)/html $(INSTALLROOT)$(INSTALLWWWDIR)/menu $(INSTALLROOT)$(INSTALLWWWDIR)/notes $(INSTALLROOT)$(INSTALLWWWDIR)/rep $(INSTALLROOT)$(INSTALLWWWDIR)/snap $(INSTALLROOT)$(INSTALLWWWDIR)/wml chgrp `$(IDTOOL) -g $(XYMONUSER)` $(INSTALLROOT)$(INSTALLWWWDIR) $(INSTALLROOT)$(INSTALLWWWDIR)/gifs $(INSTALLROOT)$(INSTALLWWWDIR)/help $(INSTALLROOT)$(INSTALLWWWDIR)/html $(INSTALLROOT)$(INSTALLWWWDIR)/menu $(INSTALLROOT)$(INSTALLWWWDIR)/notes $(INSTALLROOT)$(INSTALLWWWDIR)/rep $(INSTALLROOT)$(INSTALLWWWDIR)/snap $(INSTALLROOT)$(INSTALLWWWDIR)/wml chmod 755 $(INSTALLROOT)$(INSTALLWWWDIR) $(INSTALLROOT)$(INSTALLWWWDIR)/gifs $(INSTALLROOT)$(INSTALLWWWDIR)/help $(INSTALLROOT)$(INSTALLWWWDIR)/html $(INSTALLROOT)$(INSTALLWWWDIR)/menu $(INSTALLROOT)$(INSTALLWWWDIR)/notes $(INSTALLROOT)$(INSTALLWWWDIR)/rep $(INSTALLROOT)$(INSTALLWWWDIR)/snap $(INSTALLROOT)$(INSTALLWWWDIR)/wml ifdef HTTPDGID # The www/rep and www/snap directories must be writable by the apache daemon chgrp $(HTTPDGID) $(INSTALLROOT)$(INSTALLWWWDIR)/rep $(INSTALLROOT)$(INSTALLWWWDIR)/snap endif chmod g+w $(INSTALLROOT)$(INSTALLWWWDIR)/rep $(INSTALLROOT)$(INSTALLWWWDIR)/snap endif mkdir -p $(INSTALLROOT)$(XYMONVAR)/acks ifndef PKGBUILD chown $(XYMONUSER) $(INSTALLROOT)$(XYMONVAR)/acks chgrp `$(IDTOOL) -g $(XYMONUSER)` $(INSTALLROOT)$(XYMONVAR)/acks chmod 755 $(INSTALLROOT)$(XYMONVAR)/acks endif mkdir -p $(INSTALLROOT)$(XYMONVAR)/data ifndef PKGBUILD chown $(XYMONUSER) $(INSTALLROOT)$(XYMONVAR)/data chgrp `$(IDTOOL) -g $(XYMONUSER)` $(INSTALLROOT)$(XYMONVAR)/data chmod 755 $(INSTALLROOT)$(XYMONVAR)/data endif mkdir -p $(INSTALLROOT)$(XYMONVAR)/disabled ifndef PKGBUILD chown $(XYMONUSER) $(INSTALLROOT)$(XYMONVAR)/disabled chgrp `$(IDTOOL) -g $(XYMONUSER)` $(INSTALLROOT)$(XYMONVAR)/disabled chmod 755 $(INSTALLROOT)$(XYMONVAR)/disabled endif mkdir -p $(INSTALLROOT)$(XYMONVAR)/hist ifndef PKGBUILD chown $(XYMONUSER) $(INSTALLROOT)$(XYMONVAR)/hist chgrp `$(IDTOOL) -g $(XYMONUSER)` $(INSTALLROOT)$(XYMONVAR)/hist chmod 755 $(INSTALLROOT)$(XYMONVAR)/hist endif mkdir -p $(INSTALLROOT)$(XYMONVAR)/histlogs ifndef PKGBUILD chown $(XYMONUSER) $(INSTALLROOT)$(XYMONVAR)/histlogs || echo "Warning: Could not set owner on the histlogs directory" chgrp `$(IDTOOL) -g $(XYMONUSER)` $(INSTALLROOT)$(XYMONVAR)/histlogs || echo "Warning: Could not set group on the histlogs directory" chmod 755 $(INSTALLROOT)$(XYMONVAR)/histlogs endif mkdir -p $(INSTALLROOT)$(XYMONVAR)/hostdata ifndef PKGBUILD chown $(XYMONUSER) $(INSTALLROOT)$(XYMONVAR)/hostdata || echo "Warning: Could not set owner on the hostdata directory" chgrp `$(IDTOOL) -g $(XYMONUSER)` $(INSTALLROOT)$(XYMONVAR)/hostdata || echo "Warning: Could not set group on the hostdata directory" chmod 755 $(INSTALLROOT)$(XYMONVAR)/hostdata endif mkdir -p $(INSTALLROOT)$(XYMONVAR)/logs ifndef PKGBUILD chown $(XYMONUSER) $(INSTALLROOT)$(XYMONVAR)/logs chgrp `$(IDTOOL) -g $(XYMONUSER)` $(INSTALLROOT)$(XYMONVAR)/logs chmod 755 $(INSTALLROOT)$(XYMONVAR)/logs endif mkdir -p $(INSTALLROOT)$(XYMONVAR)/rrd ifndef PKGBUILD chown $(XYMONUSER) $(INSTALLROOT)$(XYMONVAR)/rrd chgrp `$(IDTOOL) -g $(XYMONUSER)` $(INSTALLROOT)$(XYMONVAR)/rrd chmod 755 $(INSTALLROOT)$(XYMONVAR)/rrd endif install-common: install-dirs XYMONHOME="$(XYMONHOME)" MANROOT="$(MANROOT)" XYMONUSER="$(XYMONUSER)" IDTOOL="$(IDTOOL)" PKGBUILD="$(PKGBUILD)" INSTALLROOT="$(INSTALLROOT)" INSTALLBINDIR="$(INSTALLBINDIR)" INSTALLETCDIR="$(INSTALLETCDIR)" INSTALLEXTDIR="$(INSTALLEXTDIR)" INSTALLTMPDIR="$(INSTALLTMPDIR)" INSTALLWEBDIR="$(INSTALLWEBDIR)" INSTALLWWWDIR="$(INSTALLWWWDIR)" $(MAKE) -C common install install-xymongen: install-common XYMONHOME="$(XYMONHOME)" MANROOT="$(MANROOT)" XYMONUSER="$(XYMONUSER)" IDTOOL="$(IDTOOL)" PKGBUILD="$(PKGBUILD)" CGIDIR="$(CGIDIR)" SECURECGIDIR="$(SECURECGIDIR)" INSTALLROOT="$(INSTALLROOT)" INSTALLBINDIR="$(INSTALLBINDIR)" INSTALLETCDIR="$(INSTALLETCDIR)" INSTALLEXTDIR="$(INSTALLEXTDIR)" INSTALLTMPDIR="$(INSTALLTMPDIR)" INSTALLWEBDIR="$(INSTALLWEBDIR)" INSTALLWWWDIR="$(INSTALLWWWDIR)" $(MAKE) -C xymongen install install-xymongen-nocgi: install-common XYMONHOME="$(XYMONHOME)" MANROOT="$(MANROOT)" XYMONUSER="$(XYMONUSER)" IDTOOL="$(IDTOOL)" PKGBUILD="$(PKGBUILD)" CGIDIR="$(CGIDIR)" SECURECGIDIR="$(SECURECGIDIR)" INSTALLROOT="$(INSTALLROOT)" INSTALLBINDIR="$(INSTALLBINDIR)" INSTALLETCDIR="$(INSTALLETCDIR)" INSTALLEXTDIR="$(INSTALLEXTDIR)" INSTALLTMPDIR="$(INSTALLTMPDIR)" INSTALLWEBDIR="$(INSTALLWEBDIR)" INSTALLWWWDIR="$(INSTALLWWWDIR)" $(MAKE) -C xymongen install-nocgi install-xymonnet: install-common XYMONHOME="$(XYMONHOME)" MANROOT="$(MANROOT)" XYMONUSER="$(XYMONUSER)" IDTOOL="$(IDTOOL)" ARESVER="$(ARESVER)" FPINGVER="$(FPINGVER)" DOSNMP="$(DOSNMP)" INSTALLROOT="$(INSTALLROOT)" INSTALLBINDIR="$(INSTALLBINDIR)" INSTALLETCDIR="$(INSTALLETCDIR)" INSTALLEXTDIR="$(INSTALLEXTDIR)" INSTALLTMPDIR="$(INSTALLTMPDIR)" INSTALLWEBDIR="$(INSTALLWEBDIR)" INSTALLWWWDIR="$(INSTALLWWWDIR)" PKGBUILD="$(PKGBUILD)" $(MAKE) -C xymonnet install install-xymonproxy: install-common XYMONHOME="$(XYMONHOME)" MANROOT="$(MANROOT)" XYMONUSER="$(XYMONUSER)" IDTOOL="$(IDTOOL)" PKGBUILD="$(PKGBUILD)" INSTALLROOT="$(INSTALLROOT)" INSTALLBINDIR="$(INSTALLBINDIR)" INSTALLETCDIR="$(INSTALLETCDIR)" INSTALLEXTDIR="$(INSTALLEXTDIR)" INSTALLTMPDIR="$(INSTALLTMPDIR)" INSTALLWEBDIR="$(INSTALLWEBDIR)" INSTALLWWWDIR="$(INSTALLWWWDIR)" $(MAKE) -C xymonproxy install install-xymond: install-common DORRD="$(DORRD)" MANROOT="$(MANROOT)" XYMONTOPDIR="$(XYMONTOPDIR)" XYMONHOME="$(XYMONHOME)" XYMONVAR="$(XYMONVAR)" CGIDIR="$(CGIDIR)" SECURECGIDIR="$(SECURECGIDIR)" XYMONLOGDIR="$(XYMONLOGDIR)" XYMONUSER="$(XYMONUSER)" IDTOOL="$(IDTOOL)" PKGBUILD="$(PKGBUILD)" INSTALLROOT="$(INSTALLROOT)" INSTALLBINDIR="$(INSTALLBINDIR)" INSTALLETCDIR="$(INSTALLETCDIR)" INSTALLEXTDIR="$(INSTALLEXTDIR)" INSTALLTMPDIR="$(INSTALLTMPDIR)" INSTALLWEBDIR="$(INSTALLWEBDIR)" INSTALLWWWDIR="$(INSTALLWWWDIR)" HTTPDGID="$(HTTPDGID)" $(MAKE) -C xymond install install-web: install-common DORRD="$(DORRD)" MANROOT="$(MANROOT)" XYMONTOPDIR="$(XYMONTOPDIR)" XYMONHOME="$(XYMONHOME)" XYMONVAR="$(XYMONVAR)" CGIDIR="$(CGIDIR)" SECURECGIDIR="$(SECURECGIDIR)" XYMONLOGDIR="$(XYMONLOGDIR)" XYMONUSER="$(XYMONUSER)" IDTOOL="$(IDTOOL)" PKGBUILD="$(PKGBUILD)" INSTALLROOT="$(INSTALLROOT)" INSTALLBINDIR="$(INSTALLBINDIR)" INSTALLETCDIR="$(INSTALLETCDIR)" INSTALLEXTDIR="$(INSTALLEXTDIR)" INSTALLTMPDIR="$(INSTALLTMPDIR)" INSTALLWEBDIR="$(INSTALLWEBDIR)" INSTALLWWWDIR="$(INSTALLWWWDIR)" $(MAKE) -C web install find $(INSTALLROOT)$(INSTALLWWWDIR) -type f -exec chmod 644 {} \; # NOTE: This one is normally not used - man-page install is done by the sub-Makefiles during "make install" install-man: XYMONHOME="$(XYMONHOME)" MANROOT="$(MANROOT)" INSTALLROOT="$(INSTALLROOT)" $(MAKE) -C common install-man XYMONHOME="$(XYMONHOME)" MANROOT="$(MANROOT)" CGIDIR="$(CGIDIR)" SECURECGIDIR="$(SECURECGIDIR)" INSTALLROOT="$(INSTALLROOT)" $(MAKE) -C xymongen install-man XYMONHOME="$(XYMONHOME)" MANROOT="$(MANROOT)" INSTALLROOT="$(INSTALLROOT)" $(MAKE) -C xymonnet install-man XYMONHOME="$(XYMONHOME)" MANROOT="$(MANROOT)" INSTALLROOT="$(INSTALLROOT)" $(MAKE) -C xymonproxy install-man XYMONHOME="$(XYMONHOME)" MANROOT="$(MANROOT)" INSTALLROOT="$(INSTALLROOT)" $(MAKE) -C xymond install-man XYMONHOME="$(XYMONHOME)" MANROOT="$(MANROOT)" INSTALLROOT="$(INSTALLROOT)" $(MAKE) -C web install-man find $(INSTALLROOT)$(MANROOT) -type f -exec chmod 644 {} \; install-docs: XYMONHOME="$(XYMONHOME)" MANROOT="$(MANROOT)" XYMONUSER="$(XYMONUSER)" IDTOOL="$(IDTOOL)" PKGBUILD="$(PKGBUILD)" INSTALLROOT="$(INSTALLROOT)" INSTALLBINDIR="$(INSTALLBINDIR)" INSTALLETCDIR="$(INSTALLETCDIR)" INSTALLEXTDIR="$(INSTALLEXTDIR)" INSTALLTMPDIR="$(INSTALLTMPDIR)" INSTALLWEBDIR="$(INSTALLWEBDIR)" INSTALLWWWDIR="$(INSTALLWWWDIR)" $(MAKE) -C docs install install-custom: XYMONHOME="$(XYMONHOME)" MANROOT="$(MANROOT)" XYMONUSER="$(XYMONUSER)" IDTOOL="$(IDTOOL)" PKGBUILD="$(PKGBUILD)" INSTALLROOT="$(INSTALLROOT)" INSTALLBINDIR="$(INSTALLBINDIR)" INSTALLETCDIR="$(INSTALLETCDIR)" INSTALLEXTDIR="$(INSTALLEXTDIR)" INSTALLTMPDIR="$(INSTALLTMPDIR)" INSTALLWEBDIR="$(INSTALLWEBDIR)" INSTALLWWWDIR="$(INSTALLWWWDIR)" $(MAKE) -C custom install || echo "Skipped custom modules" client-install: install-client install-client: client XYMONHOME="$(XYMONCLIENTHOME)" INSTALLROOT="$(INSTALLROOT)" XYMONUSER="$(XYMONUSER)" IDTOOL="$(IDTOOL)" PKGBUILD="$(PKGBUILD)" LOCALCLIENT="$(LOCALCLIENT)" $(MAKE) -C client install install-clientmsg: @echo "" @echo "Installation complete." @echo "" @echo "To start the Xymon client, as the $(XYMONUSER) user run '${XYMONHOME}/runclient.sh start'" install-localclient: XYMONHOME="$(XYMONCLIENTHOME)" INSTALLROOT="$(INSTALLROOT)" XYMONUSER="$(XYMONUSER)" IDTOOL="$(IDTOOL)" LOCALCLIENT="$(LOCALCLIENT)" $(MAKE) -C client install-localclient xymon-4.3.28/build/test-ssl3.c0000664000076400007640000000064012674126516016330 0ustar rpmbuildrpmbuild#include #include #include #include #include #if !defined(OPENSSL_VERSION_NUMBER) || (OPENSSL_VERSION_NUMBER < 0x00905000L) #error SSL-protocol testing requires OpenSSL version 0.9.5 or later #endif int main(int argc, char *argv[]) { SSL_CTX *ctx; SSL_library_init(); ctx = SSL_CTX_new(SSLv3_client_method()); return 0; } xymon-4.3.28/build/Makefile.generic0000664000076400007640000000117511535462534017400 0ustar rpmbuildrpmbuild# Xymon compile-time settings for a GENERIC system # OSDEF = -Dgeneric # NETLIBS: You may need to add -lresolv or similar to pick up network libraries NETLIBS = # Compile flags for normal build CC = cc CFLAGS = -g -O -D_REENTRANT $(OSDEF) # Compile flags for debugging # CFLAGS = -g -DDEBUG -D_REENTRANT $(OSDEF) # Extra environment settings for runtime stuff. # E.g. RUNTIMEDEFS="LD_LIBRARY_PATH=\"/opt/lib\"" to use # runtime libraries located in /opt/lib RUNTIMEDEFS = # Mail program: This must support "CMD -s SUBJECT ADDRESS" to send out a mail with a subject # Typically, this will be "mail" or "mailx" MAILPROGRAM="mail" xymon-4.3.28/build/Makefile.FreeBSD0000664000076400007640000000110012262737100017152 0ustar rpmbuildrpmbuild# Xymon compile-time settings for FreeBSD systems OSDEF = -DBSD # NETLIBS: None needed NETLIBS = # Compile flags for normal build CC ?= cc CFLAGS = -g -O2 -Wall -Wno-unused -Wno-pointer-sign -D_REENTRANT -I/usr/local/include -L/usr/local/lib $(LFSDEF) $(OSDEF) RPATH = "-Wl,--rpath," # Compile flags for debugging # CFLAGS = -g -DDEBUG -Wall -D_REENTRANT -I/usr/local/include -L/usr/local/lib $(LFSDEF) $(OSDEF) # Mail program: This must support "CMD -s SUBJECT ADDRESS" to send out a mail with a subject # Typically, this will be "mail" or "mailx" MAILPROGRAM="mail" xymon-4.3.28/xymongen/0000775000076400007640000000000013037531513015057 5ustar rpmbuildrpmbuildxymon-4.3.28/xymongen/rssgen.c0000664000076400007640000002103512603243142016521 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon webpage generator tool. */ /* */ /* This file contains code to generate RSS/RDF format output of alerts. */ /* It is heavily influenced by Jeff Stoner's bb_content-feed script. */ /* */ /* Copyright (C) 2003-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: rssgen.c 7678 2015-10-01 14:42:42Z jccleaver $"; #include #include #include #include #include "xymongen.h" #include "util.h" #include "rssgen.h" char *rssversion = "0.91"; int rsscolorlimit = COL_RED; int nssidebarcolorlimit = COL_RED; char *rsstitle = "Xymon Critical Alerts"; #define RSS091 0 #define RSS092 1 #define RSS10 2 #define RSS20 3 static int rssver = 0; static int ttlvalue = 300; static int anyshown = 0; static void initial_rss_setup(void) { static int hasrun = 0; if (hasrun) return; if (xgetenv("XYMONRSSTITLE")) rsstitle = strdup(xgetenv("XYMONRSSTITLE")); if (strcmp(rssversion, "0.91") == 0) rssver = RSS091; else if (strcmp(rssversion, "0.92") == 0) rssver = RSS092; else if (strcmp(rssversion, "1.0") == 0) rssver = RSS10; else if (strcmp(rssversion, "2.0") == 0) rssver = RSS20; else { errprintf("Unknown RSS version requested (%s), using 0.91\n", rssversion); rssver = RSS091; } ttlvalue = (xgetenv("TASKSLEEP") ? (atoi(xgetenv("TASKSLEEP")) / 60) : 5); } void do_rss_header(FILE *fd) { if (fd == NULL) return; initial_rss_setup(); switch (rssver) { case RSS091: fprintf(fd, "\n"); fprintf(fd, "\n"); fprintf(fd, "\n"); fprintf(fd, " %s\n", rsstitle); fprintf(fd, " %s/\n", xgetenv("XYMONWEBHOSTURL")); fprintf(fd, " Last updated on %s\n", timestamp); break; case RSS092: fprintf(fd, "\n"); fprintf(fd, "\n"); fprintf(fd, "\n"); fprintf(fd, " %s\n", rsstitle); fprintf(fd, " %s/\n", xgetenv("XYMONWEBHOSTURL")); fprintf(fd, " Last updated on %s\n", timestamp); fprintf(fd, " \n"); fprintf(fd, " %s/gifs/bblogo.gif\n", xgetenv("XYMONWEBHOSTURL")); fprintf(fd, " Xymon\n"); fprintf(fd, " http://xymon.sourceforge.net/\n"); fprintf(fd, " \n"); break; case RSS10: fprintf(fd, "\n"); fprintf(fd, "\n"); fprintf(fd, " \n", xgetenv("XYMONWEBHOSTURL")); fprintf(fd, " %s\n", rsstitle); fprintf(fd, " %s/\n", xgetenv("XYMONWEBHOSTURL")); fprintf(fd, " Last updated on %s\n", timestamp); fprintf(fd, " \n"); break; case RSS20: fprintf(fd, "\n"); fprintf(fd, "\n"); fprintf(fd, " \n"); fprintf(fd, " %s\n", rsstitle); fprintf(fd, " %s/\n", xgetenv("XYMONWEBHOSTURL")); fprintf(fd, " Last updated on %s\n", timestamp); fprintf(fd, " %d\n", ttlvalue); break; } anyshown = 0; } void do_rss_item(FILE *fd, host_t *h, entry_t *e) { if (fd == NULL) return; if (h->color < rsscolorlimit) return; if (e->color < rsscolorlimit) return; anyshown = 1; switch (rssver) { case RSS091: case RSS092: case RSS20: fprintf(fd, " \n"); break; case RSS10: fprintf(fd, " \n", xgetenv("XYMONWEBHOSTURL"), htmlextension); break; } fprintf(fd, " %s (%s)\n", h->hostname, e->column->name); fprintf(fd, " "); if (generate_static()) { /* * Don't use htmlextension here - the .html files are generated by bbd. */ fprintf(fd, "%s/html/%s.%s.html", xgetenv("XYMONWEBHOSTURL"), h->hostname, e->column->name); } else { fprintf(fd, "%s%s", xgetenv("XYMONWEBHOST"), hostsvcurl(h->hostname, e->column->name, 1)); } fprintf(fd, "\n"); if (e->shorttext) { char *inpos = e->shorttext; int len; char savech; fprintf(fd, ""); /* Must escape any '&', '<' and '>' -characters, or RSS readers will choke on them */ while (*inpos) { len = strcspn(inpos, "&<>"); savech = *(inpos+len); *(inpos+len) = '\0'; fprintf(fd, "%s", inpos); *(inpos+len) = savech; inpos += len; if (savech != '\0') { switch (savech) { case '&': fprintf(fd, "&"); break; case '>': fprintf(fd, ">"); break; case '<': fprintf(fd, "<"); break; } inpos++; /* Skip the escaped char we just output */ } } fprintf(fd, "\n"); } fprintf(fd, " \n"); } void do_rss_footer(FILE *fd) { if (fd == NULL) return; if (!anyshown) { fprintf(fd, " \n"); fprintf(fd, " No Critical Alerts\n"); fprintf(fd, " %s/\n", xgetenv("XYMONWEBHOSTURL")); fprintf(fd, " \n"); } switch (rssver) { case RSS091: case RSS092: case RSS20: fprintf(fd, " \n"); fprintf(fd, "\n"); break; case RSS10: fprintf(fd, "\n"); break; } } void do_netscape_sidebar(char *nssidebarfilename, host_t *hosts) { FILE *fd; char tmpfn[PATH_MAX]; char destfn[PATH_MAX]; int ttlvalue; host_t *h; int anyshown; if (nssidebarfilename == NULL) return; if (xgetenv("XYMONRSSTITLE")) rsstitle = strdup(xgetenv("XYMONRSSTITLE")); ttlvalue = (xgetenv("TASKSLEEP") ? atoi(xgetenv("TASKSLEEP")) : 300); if (*nssidebarfilename == '/') { sprintf(tmpfn, "%s.tmp", nssidebarfilename); sprintf(destfn, "%s", nssidebarfilename); } else { sprintf(tmpfn, "%s/www/%s.tmp", xgetenv("XYMONHOME"), nssidebarfilename); sprintf(destfn, "%s/www/%s", xgetenv("XYMONHOME"), nssidebarfilename); } fd = fopen(tmpfn, "w"); if (fd == NULL) { errprintf("Cannot create Netscape sidebar outputfile %s\n", tmpfn); return; } fprintf(fd, "\n"); fprintf(fd, "\n"); fprintf(fd, " \n"); fprintf(fd, " %s\n", rsstitle); fprintf(fd, " \n"); fprintf(fd, " \n", ttlvalue, xgetenv("XYMONWEBHOSTURL"), nssidebarfilename); fprintf(fd, " \n"); fprintf(fd, " \n"); fprintf(fd, " Last updated:
%s
\n", timestamp); fprintf(fd, " \n"); fprintf(fd, " \n"), fprintf(fd, "\n"); fclose(fd); if (rename(tmpfn, destfn) != 0) { errprintf("Cannot move file %s to destination %s\n", tmpfn, destfn); } return; } xymon-4.3.28/xymongen/process.h0000664000076400007640000000171211615341300016700 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon overview webpage generator tool. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __PROCESS_H_ #define __PROCESS_H_ extern void calc_hostcolors(char *nongreenignores); extern void calc_pagecolors(xymongen_page_t *phead); extern void delete_old_acks(void); extern void send_summaries(summary_t *sumhead); #endif xymon-4.3.28/xymongen/rssgen.h0000664000076400007640000000205311615341300016522 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon webpage generator tool. */ /* */ /* Copyright (C) 2003-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __RSSGEN_H__ #define __RSSGEN_H__ extern char *rssversion; extern int rsscolorlimit; extern int nssidebarcolorlimit; extern void do_rss_header(FILE *fd); extern void do_rss_item(FILE *fd, host_t *h, entry_t *e); extern void do_rss_footer(FILE *fd); extern void do_netscape_sidebar(char *rssfilename, host_t *hosts); #endif xymon-4.3.28/xymongen/pagegen.h0000664000076400007640000000372112615432073016643 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon overview webpage generator tool. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __PAGEGEN_H_ #define __PAGEGEN_H_ extern int subpagecolumns; extern int hostsbeforepages; extern char *includecolumns; extern char *nongreenignorecolumns; extern int nongreencolors; extern int sort_grouponly_items; extern char *documentationurl; extern char *doctargetspec; extern char *rssextension; extern char *defaultpagetitle; extern char *eventignorecolumns; extern char *htaccess; extern char *xymonhtaccess; extern char *xymonpagehtaccess; extern char *xymonsubpagehtaccess; extern int pagetitlelinks; extern int pagetextheadings; extern int underlineheadings; extern int maxrowsbeforeheading; extern int showemptygroups; extern int nongreeneventlog; extern int nongreenacklog; extern int nongreeneventlogmaxcount; extern int nongreeneventlogmaxtime; extern int nongreennodialups; extern int nongreenacklogmaxcount; extern int nongreenacklogmaxtime; extern char *logcritstatus; extern int critonlyreds; extern int wantrss; extern void select_headers_and_footers(char *prefix); extern void do_one_page(xymongen_page_t *page, dispsummary_t *sums, int embedded); extern void do_page_with_subs(xymongen_page_t *curpage, dispsummary_t *sums); extern int do_nongreen_page(char *nssidebarfilename, int summarytype, char *filenamebase); #endif xymon-4.3.28/xymongen/xymongen.h0000664000076400007640000002003611664525562017110 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon overview webpage generator tool. */ /* */ /* This file holds data-definitions and declarations used in xymongen. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef _XYMONGEN_H_ #define _XYMONGEN_H_ #include #include "libxymon.h" /* Structure defs for xymongen */ /* This "drawing" depicts the relations between the various data objects used by xymongen. Think of this as doing object-oriented programming in plain C. xymongen_page_t hostlist_t state_t +-> name hostentry --+ entry --+ | title next | next | | color | | | subpages +-----------+ +-------+ | groups -------> group_t | | | hosts ---+ title V | +--- parent | hosts ---------> host_t | oldage | onlycols hostname | next | next ip | ^ +------------------------> color | | oldage | | nongreencolor | | criticalcolor | +--------------------------------- parent | alerts | waps | anywaps | nopropyellowtests | nopropredtests | noproppurpletests | nopropacktests | rawentry V entries ---------> entry_t dialup column -------> xymongen_col_t reportwarnlevel color name comment age next next oldage acked alert onwap propagate reportinfo fileage next xymongen_page_t structure holds data about one Xymon page - the first record in this list represents the top-level xymon.html page. Other pages in the list are defined using the hosts.cfg "page" directive and access via the page->next link. subpages are stored in xymongen_page_t structures also. Accessible via the "subpages" link from a page. group_t structure holds the data from a "group" directive. groups belong to pages or subpages. Currently, all groups act as "group-compress" directive. host_t structure holds all data about a given host. "color" is calculated as the most critical color of the individual entries belonging to this host. Individual tests are connected to the host via the "entries" link. hostlist_t is a simple 1-dimensional list of all the hosts, for easier traversal of the host list. entry_t holds the data for a given test (basically, a file in $XYMONRAWSTATUSDIR). test-names are not stored directly, but in the linked "xymongen_col_t" list. "age" is the "Status unchanged in X" text from the logfile. "oldage" is a boolean indicating if "age" is more than 1 day. "alert" means this test belongs on the reduced summary (alerts) page. state_t is a simple 1-dimensional list of all tests (entry_t records). */ #define PAGE_NORMAL 0 #define PAGE_NONGREEN 1 #define PAGE_CRITICAL 2 /* Max number of purple messages in one run */ #define MAX_PURPLE_PER_RUN 30 /* Column definitions. */ /* Basically a list of all possible column */ /* names */ typedef struct xymongen_col_t { char *name; char *listname; /* The ",NAME," string used for searches */ struct xymongen_col_t *next; } xymongen_col_t; typedef struct col_list_t { struct xymongen_col_t *column; struct col_list_t *next; } col_list_t; /* Measurement entry definition */ /* This points to a column definition, and */ /* contains the actual color of a measurement */ /* Linked list. */ typedef struct entry_t { struct xymongen_col_t *column; int color; char age[20]; int oldage; time_t fileage; int acked; int alert; int onwap; int propagate; int compacted; char *sumurl; char *skin; char *testflags; struct reportinfo_t *repinfo; struct replog_t *causes; char *histlogname; char *shorttext; struct entry_t *next; } entry_t; /* Aux. list definition for loading state of all tests into one list */ typedef struct state_t { struct entry_t *entry; struct state_t *next; } state_t; /* OSX has a built-in "host_t" type. */ #define host_t xymongen_host_t typedef struct host_t { char *hostname; char *displayname; char *clientalias; char *comment; char *description; char ip[IP_ADDR_STRLEN]; int dialup; struct entry_t *entries; int color; /* Calculated */ int nongreencolor; /* Calculated */ int criticalcolor; /* Calculated */ int oldage; char *alerts; int nktime; int anywaps; int wapcolor; char *waps; char *nopropyellowtests; char *nopropredtests; char *noproppurpletests; char *nopropacktests; char *pretitle; struct xymongen_page_t *parent; double reportwarnlevel; int reportwarnstops; char *reporttime; int nonongreen; struct host_t *next; } host_t; /* Aux. list definition for quick access to host records */ typedef struct hostlist_t { struct host_t *hostentry; struct hostlist_t *clones; } hostlist_t; typedef struct group_t { char *title; char *onlycols; char *exceptcols; struct host_t *hosts; int sorthosts; char *pretitle; struct group_t *next; } group_t; typedef struct xymongen_page_t { char *name; char *title; int color; /* Calculated */ int oldage; char *pretitle; int vertical; struct xymongen_page_t *next; struct xymongen_page_t *subpages; struct xymongen_page_t *parent; struct group_t *groups; struct host_t *hosts; } xymongen_page_t; typedef struct summary_t { char *name; char *receiver; char *url; struct summary_t *next; } summary_t; typedef struct dispsummary_t { char *row; char *column; char *url; int color; struct dispsummary_t *next; } dispsummary_t; enum tooltipuse_t { TT_STDONLY, TT_ALWAYS, TT_NEVER}; extern enum tooltipuse_t tooltipuse; extern xymongen_page_t *pagehead; extern state_t *statehead; extern xymongen_col_t *colhead, null_column; extern summary_t *sumhead; extern dispsummary_t *dispsums; extern int xymon_color, nongreen_color, critical_color; extern time_t reportstart, reportend; extern double reportwarnlevel, reportgreenlevel; extern int reportwarnstops; extern int reportstyle; extern int dynamicreport; extern int fqdn; extern int loadhostsfromxymond; #endif xymon-4.3.28/xymongen/loaddata.c0000664000076400007640000004255312661666466017027 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon overview webpage generator tool. */ /* */ /* This file contains code to load the current Xymon status data. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: loaddata.c 7904 2016-02-19 19:29:58Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include #include #include "xymongen.h" #include "util.h" #include "loadlayout.h" #include "loaddata.h" int statuscount = 0; char *ignorecolumns = NULL; /* Columns that will be ignored totally */ char *dialupskin = NULL; /* XYMONSKIN used for dialup tests */ char *reverseskin = NULL; /* XYMONSKIN used for reverse tests */ time_t recentgif_limit = 86400; /* Limit for recent-gifs display, in seconds */ xymongen_col_t null_column = { "", NULL }; /* Null column */ char *purplelogfn = NULL; static FILE *purplelog = NULL; int colorcount[COL_COUNT] = { 0, }; int colorcount_noprop[COL_COUNT] = { 0, }; static time_t oldestentry; typedef struct compact_t { char *compactname; int color; time_t fileage; char *members; } compact_t; typedef struct logdata_t { /* hostname|testname|color|testflags|lastchange|logtime|validtime|acktime|disabletime|sender|cookie|1st line of message */ char *hostname; char *testname; int color; char *testflags; time_t lastchange; time_t logtime; time_t validtime; time_t acktime; time_t disabletime; char *sender; int cookie; char *msg; } logdata_t; char *parse_testflags(char *l) { char *result = NULL; char *flagstart = strstr(l, "[flags:"); if (flagstart) { char *flagend; flagstart += 7; flagend = strchr(flagstart, ']'); if (flagend) { *flagend = '\0'; result = strdup(flagstart); *flagend = ']'; } } return result; } int testflag_set(entry_t *e, char flag) { if (e->testflags) return (strchr(e->testflags, flag) != NULL); else return 0; } int unwantedcolumn(char *hostname, char *testname) { void *hinfo; char *nc, *tok; int result = 0; hinfo = hostinfo(hostname); if (!hinfo) return 1; nc = xmh_item(hinfo, XMH_NOCOLUMNS); if (!nc) return 0; nc = strdup(nc); tok = strtok(nc, ","); while (tok && (result == 0)) { if (strcmp(tok, testname) == 0) result = 1; tok = strtok(NULL, ","); } return result; } state_t *init_state(char *filename, logdata_t *log) { FILE *fd = NULL; char *p; char *hostname = NULL; char *testname = NULL; char *testnameidx; state_t *newstate; char fullfn[PATH_MAX]; host_t *host; struct stat log_st; time_t now = getcurrenttime(NULL); time_t histentry_start; int propagating, isacked; dbgprintf("init_state(%s, %d, ...)\n", textornull(filename)); /* Ignore summary files and dot-files (this catches "." and ".." also) */ if ( (strncmp(filename, "summary.", 8) == 0) || (filename[0] == '.')) { return NULL; } if (reportstart || snapshot) { /* Don't do reports for info- and trends-columns */ p = strrchr(filename, '.'); if (p == NULL) return NULL; p++; if (strcmp(p, xgetenv("INFOCOLUMN")) == 0) return NULL; if (strcmp(p, xgetenv("TRENDSCOLUMN")) == 0) return NULL; if (strcmp(p, xgetenv("CLIENTCOLUMN")) == 0) return NULL; /* * When doing reports, we are scanning the XYMONHISTDIR directory. It may * contain files that are named as a host only (no test-name). * Skip those. */ if (find_host(filename)) return NULL; } if (!reportstart && !snapshot) { if (log->hostname) hostname = strdup(log->hostname); if (log->testname) testname = strdup(log->testname); } else { sprintf(fullfn, "%s/%s", xgetenv("XYMONHISTDIR"), filename); /* Check that we can access this file */ if (stat(fullfn, &log_st) == -1) { errprintf("Error searching for '%s' history file: %s\n", filename, strerror(errno)); return NULL; } if (!S_ISREG(log_st.st_mode)) { errprintf("Weird file '%s' skipped\n", fullfn); return NULL; } if ((fd = fopen(fullfn, "r")) == NULL) { errprintf("Unable to read file '%s', skipped: %s\n", fullfn, strerror(errno)); return NULL; } /* Pick out host- and test-name */ hostname = strdup(filename); p = strrchr(hostname, '.'); /* Skip files that have no '.' in filename */ if (p) { /* Pick out the testname ... */ *p = '\0'; p++; testname = strdup(p); /* ... and change hostname back into normal form */ for (p=hostname; (*p); p++) { if (*p == ',') *p='.'; } } else { xfree(hostname); fclose(fd); return NULL; } } /* Must do these first to get the propagation value for the statistics */ host = find_host(hostname); isacked = (log->acktime > now); propagating = checkpropagation(host, testname, log->color, isacked); /* Count all of the real columns */ if ( (strcmp(testname, xgetenv("INFOCOLUMN")) != 0) && (strcmp(testname, xgetenv("TRENDSCOLUMN")) != 0) ) { statuscount++; switch (log->color) { case COL_RED: case COL_YELLOW: if (propagating) colorcount[log->color] += 1; else colorcount_noprop[log->color] += 1; break; default: colorcount[log->color] += 1; break; } } testnameidx = (char *)malloc(strlen(testname) + 3); sprintf(testnameidx, ",%s,", testname); if (unwantedcolumn(hostname, testname) || (ignorecolumns && strstr(ignorecolumns, testnameidx))) { xfree(hostname); xfree(testname); xfree(testnameidx); if (fd) fclose(fd); return NULL; /* Ignore this type of test */ } xfree(testnameidx); newstate = (state_t *) calloc(1, sizeof(state_t)); newstate->entry = (entry_t *) calloc(1, sizeof(entry_t)); newstate->next = NULL; newstate->entry->column = find_or_create_column(testname, 1); newstate->entry->color = -1; strcpy(newstate->entry->age, ""); newstate->entry->oldage = 0; newstate->entry->propagate = 1; newstate->entry->testflags = NULL; newstate->entry->skin = NULL; newstate->entry->repinfo = NULL; newstate->entry->causes = NULL; newstate->entry->histlogname = NULL; newstate->entry->shorttext = NULL; if (host) { newstate->entry->alert = checkalert(host->alerts, testname); /* If no WAP's specified, default all tests to be on WAP page */ newstate->entry->onwap = (host->waps ? checkalert(host->waps, testname) : 1); } else { dbgprintf(" hostname %s not found\n", hostname); newstate->entry->alert = newstate->entry->onwap = 0; } newstate->entry->sumurl = NULL; if (reportstart) { /* Determine "color" for this test from the historical data */ newstate->entry->repinfo = (reportinfo_t *) calloc(1, sizeof(reportinfo_t)); newstate->entry->color = parse_historyfile(fd, newstate->entry->repinfo, (dynamicreport ? NULL: hostname), (dynamicreport ? NULL : testname), reportstart, reportend, 0, (host ? host->reportwarnlevel : reportwarnlevel), reportgreenlevel, (host ? host->reportwarnstops : reportwarnstops), (host ? host->reporttime : NULL)); newstate->entry->causes = (dynamicreport ? NULL : save_replogs()); } else if (snapshot) { time_t fileage; newstate->entry->color = history_color(fd, snapshot, &histentry_start, &newstate->entry->histlogname); fileage = snapshot - histentry_start; newstate->entry->oldage = (fileage >= recentgif_limit); newstate->entry->fileage = fileage; strcpy(newstate->entry->age, agestring(fileage)); } else { time_t fileage = (now - log->lastchange); newstate->entry->color = log->color; newstate->entry->testflags = strdup(log->testflags ? log->testflags : ""); if (testflag_set(newstate->entry, 'D')) newstate->entry->skin = dialupskin; if (testflag_set(newstate->entry, 'R')) newstate->entry->skin = reverseskin; newstate->entry->shorttext = strdup(log->msg); newstate->entry->acked = isacked; newstate->entry->oldage = (fileage >= recentgif_limit); newstate->entry->fileage = (log->lastchange ? fileage : -1); if (log->lastchange == 0) strcpy(newstate->entry->age, ""); else strcpy(newstate->entry->age, agestring(fileage)); } if (purplelog && (newstate->entry->color == COL_PURPLE)) { fprintf(purplelog, "%s %s%s\n", hostname, testname, (host ? " (expired)" : " (unknown host)")); } newstate->entry->propagate = propagating; dbgprintf("init_state: hostname=%s, testname=%s, color=%d, acked=%d, age=%s, oldage=%d, propagate=%d, alert=%d\n", textornull(hostname), textornull(testname), newstate->entry->color, newstate->entry->acked, textornull(newstate->entry->age), newstate->entry->oldage, newstate->entry->propagate, newstate->entry->alert); if (host) { hostlist_t *l; /* Add this state entry to the host's list of state entries. */ newstate->entry->next = host->entries; host->entries = newstate->entry; /* There may be multiple host entries, if a host is * listed in several locations in hosts.cfg (for display purposes). * This is handled by updating ALL of the cloned host records. * Bug reported by Bluejay Adametz of Fuji. */ /* Cannot use "find_host()" here, as we need the hostlink record, not the host record */ l = find_hostlist(hostname); /* Walk through the clone-list and set the "entries" for all hosts */ for (l=l->clones; (l); l = l->clones) l->hostentry->entries = host->entries; } else { /* No host for this test - must be missing from hosts.cfg */ newstate->entry->next = NULL; } xfree(hostname); xfree(testname); if (fd) fclose(fd); return newstate; } dispsummary_t *init_displaysummary(char *fn, logdata_t *log) { char l[MAX_LINE_LEN]; dispsummary_t *newsum = NULL; time_t now = getcurrenttime(NULL); dbgprintf("init_displaysummary(%s)\n", textornull(fn)); if (log->validtime < now) return NULL; strcpy(l, log->msg); if (strlen(l)) { char *p; char *color = (char *) malloc(strlen(l)); newsum = (dispsummary_t *) calloc(1, sizeof(dispsummary_t)); newsum->url = (char *) malloc(strlen(l)); if (sscanf(l, "%s %s", color, newsum->url) == 2) { char *rowcol; newsum->color = parse_color(color); rowcol = (char *) malloc(strlen(fn) + 1); strcpy(rowcol, fn+8); p = strrchr(rowcol, '.'); if (p) *p = ' '; newsum->column = (char *) malloc(strlen(rowcol)+1); newsum->row = (char *) malloc(strlen(rowcol)+1); sscanf(rowcol, "%s %s", newsum->row, newsum->column); newsum->next = NULL; xfree(rowcol); } else { xfree(newsum->url); xfree(newsum); newsum = NULL; } xfree(color); } return newsum; } void generate_compactitems(state_t **topstate) { void *xmh; compact_t **complist = NULL; int complistsz = 0; hostlist_t *h; entry_t *e; char *compacted; char *tok1, *savep1, *savep2; compact_t *itm; int i; state_t *newstate; time_t now = getcurrenttime(NULL); for (h = hostlistBegin(); (h); h = hostlistNext()) { xmh = hostinfo(h->hostentry->hostname); compacted = xmh_item(xmh, XMH_COMPACT); if (!compacted) continue; tok1 = strtok_r(compacted, ",", &savep1); while (tok1) { char *members; itm = (compact_t *)calloc(1, sizeof(compact_t)); itm->compactname = strdup(strtok_r(tok1, "=", &savep2)); members = strtok_r(NULL, "\n", &savep2); itm->members = (char *)malloc(3 + (members ? strlen(members) : 0) ); sprintf(itm->members, "|%s|", (members ? members : "") ); if (complistsz == 0) { complist = (compact_t **)calloc(2, sizeof(compact_t *)); } else { complist = (compact_t **)realloc(complist, (complistsz+2)*sizeof(compact_t *)); } complist[complistsz++] = itm; complist[complistsz] = NULL; tok1 = strtok_r(NULL, ",", &savep1); } for (e = h->hostentry->entries; (e); e = e->next) { for (i = 0; (i < complistsz); i++) { if (wantedcolumn(e->column->name, complist[i]->members)) { e->compacted = 1; if (e->color > complist[i]->color) complist[i]->color = e->color; if (e->fileage > complist[i]->fileage) complist[i]->fileage = e->fileage; } } } for (i = 0; (i < complistsz); i++) { logdata_t log; char fn[PATH_MAX]; memset(&log, 0, sizeof(log)); sprintf(fn, "%s.%s", commafy(h->hostentry->hostname), complist[i]->compactname); log.hostname = h->hostentry->hostname; log.testname = complist[i]->compactname; log.color = complist[i]->color; log.testflags = ""; log.lastchange = now - complist[i]->fileage; log.logtime = getcurrenttime(NULL); log.validtime = log.logtime + 300; log.sender = ""; log.msg = ""; newstate = init_state(fn, &log); if (newstate) { newstate->next = *topstate; *topstate = newstate; } } } } state_t *load_state(dispsummary_t **sumhead) { int xymondresult; char fn[PATH_MAX]; state_t *newstate, *topstate; dispsummary_t *newsum, *topsum; char *board = NULL; char *nextline; int done; logdata_t log; sendreturn_t *sres; dbgprintf("load_state()\n"); sres = newsendreturnbuf(1, NULL); if (!reportstart && !snapshot) { char *dumpfn = getenv("BOARDDUMP"); char *filter = getenv("BOARDFILTER"); if (dumpfn) { /* Debugging - read data from a dump file */ struct stat st; FILE *fd; xymondresult = XYMONSEND_ETIMEOUT; if (stat(dumpfn, &st) == 0) { fd = fopen(dumpfn, "r"); if (fd) { board = (char *)malloc(st.st_size + 1); *board = '\0'; if (fread(board, 1, st.st_size, fd)) { fclose(fd); xymondresult = XYMONSEND_OK; } } } } else { char *bcmd; bcmd = (char *)malloc(1024 + (filter ? strlen(filter) : 0)); sprintf(bcmd, "xymondboard fields=hostname,testname,color,flags,lastchange,logtime,validtime,acktime,disabletime,sender,cookie,line1,acklist %s", (filter ? filter: "")); xymondresult = sendmessage(bcmd, NULL, XYMON_TIMEOUT, sres); board = getsendreturnstr(sres, 1); xfree(bcmd); } } else { xymondresult = sendmessage("xymondboard fields=hostname,testname", NULL, XYMON_TIMEOUT, sres); board = getsendreturnstr(sres, 1); } freesendreturnbuf(sres); if ((xymondresult != XYMONSEND_OK) || (board == NULL) || (*board == '\0')) { errprintf("xymond status-board not available, code %d\n", xymondresult); return NULL; } if (reportstart || snapshot) { oldestentry = getcurrenttime(NULL); purplelog = NULL; purplelogfn = NULL; } else { if (purplelogfn) { purplelog = fopen(purplelogfn, "w"); if (purplelog == NULL) errprintf("Cannot open purplelog file %s\n", purplelogfn); else fprintf(purplelog, "Stale (purple) logfiles as of %s\n\n", timestamp); } } topstate = NULL; topsum = NULL; done = 0; nextline = board; while (!done) { char *bol = nextline; char *onelog, *acklist; char *p; int i; nextline = strchr(nextline, '\n'); if (nextline) { *nextline = '\0'; nextline++; } else done = 1; if (strlen(bol) == 0) { done = 1; continue; } memset(&log, 0, sizeof(log)); onelog = strdup(bol); acklist = NULL; p = gettok(onelog, "|"); i = 0; while (p) { switch (i) { /* hostname|testname|color|testflags|lastchange|logtime|validtime|acktime|disabletime|sender|cookie|1st line of message|acklist */ case 0: log.hostname = p; break; case 1: log.testname = p; break; case 2: log.color = parse_color(p); break; case 3: log.testflags = p; break; case 4: log.lastchange = atoi(p); break; case 5: log.logtime = atoi(p); break; case 6: log.validtime = atoi(p); break; case 7: log.acktime = atoi(p); break; case 8: log.disabletime = atoi(p); break; case 9: log.sender = p; break; case 10: log.cookie = atoi(p); break; case 11: log.msg = p; break; case 12: acklist = p; break; } p = gettok(NULL, "|"); i++; } if (!log.hostname || !log.testname) { errprintf("Found incomplete or corrupt log line (%s|%s); skipping\n", textornull(log.hostname), textornull(log.testname) ); xfree(onelog); continue; } if (!log.msg) log.msg = ""; sprintf(fn, "%s.%s", commafy(log.hostname), log.testname); /* Get the data */ if (strncmp(fn, "summary.", 8) == 0) { if (!reportstart && !snapshot) { newsum = init_displaysummary(fn, &log); if (newsum) { newsum->next = topsum; topsum = newsum; } } } else { if (acklist && *acklist) { /* * It's been acked. acklist looks like * 1149489234:1149510834:1:henrik:Joe promised to take care of this right after lunch\n * The "\n" is the delimiter between multiple acks. */ char *tok; tok = strtok(acklist, ":"); if (tok) tok = strtok(NULL, ":"); if (tok) log.acktime = atol(tok); } newstate = init_state(fn, &log); if (newstate) { newstate->next = topstate; topstate = newstate; if (reportstart && (newstate->entry->repinfo->reportstart < oldestentry)) { oldestentry = newstate->entry->repinfo->reportstart; } } } xfree(onelog); } generate_compactitems(&topstate); if (reportstart) sethostenv_report(oldestentry, reportend, reportwarnlevel, reportgreenlevel); if (purplelog) fclose(purplelog); *sumhead = topsum; return topstate; } xymon-4.3.28/xymongen/xymongen.10000664000076400007640000006672213037531444017025 0ustar rpmbuildrpmbuild.TH XYMONGEN 1 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME xymongen \- Xymon webpage generator .SH SYNOPSIS .B "xymongen \-?" .br .B "xymongen \-\-help" .br .B "xymongen \-\-version" .br .B "xymongen [options] [output-directory]" .br (See the OPTIONS section for a description of the available command-line options). .SH DESCRIPTION \fBxymongen\fR generates the overview webpages for the Xymon monitor. These are the webpages that show the overall status of your hosts, not the detailed status pages for each test. Note: The data for the webpages is retrieved from the .I xymond(8) daemon, and xymongen uses the values of the XYMSRV / XYMSERVERS environment variables to determine the network address where xymond can be reached. If you have more than one server listed in XYMSERVERS, make sure the first one is the local Xymon server - this is the one that xymongen will query for data. .SH OPTIONS xymongen has a large number of command-line options. The options can be used to change the behaviour of xymongen and affect the web pages generated by it. .SH GENERAL OPTIONS .sp .IP "\-\-help or \-?" Provide a summary of available command-line options. .sp .IP "\-\-version" Prints the version number of xymongen .sp .IP "\-\-docurl=URL" This option is deprecated, use the HOSTDOCURL setting in .I xymonserver.cfg(5) instead. .sp .IP "\-\-doccgi=URL" This option is deprecated, use the HOSTDOCURL setting in .I xymonserver.cfg(5) instead. .sp .IP "\-\-doc\-window" Causes links to documentation for hosts and services to open in a new window. The default is to show documentation in the same browser window as the Xymon status. .sp .IP "\-\-htmlextension=.EXTENSION" Sets the filename extension used for the webpages generated by xymongen. By default, an extension of ".html" is used. Note that you need to specify the "dot". .sp .IP "\-\-report[=COLUMNNAME]" With this option, xymongen will send a status message with details of how many hosts were processed, how many pages were generated, any errors that occurred during the run, and some timing statistics. The default columnname is "xymongen". .sp .IP "\-\-htaccess[=htaccess-filename]" Create .htaccess files when new web page directories are created. The content of the .htaccess files are determined by the XYMONHTACCESS environment variable (for the top-level directory with xymon.html and nongreen.html); by the XYMONPAGEHTACCESS variable (for the page-level directories); and by the XYMONSUBPAGEHTACCESS variable for subpage- and subparent-level directories. The filename of the .htaccess files default to ".htaccess" if no filename is given with this option. The XYMONHTACCESS variable is copied verbatim into the top-level .htaccess file. The XYMONPAGEHTACCESS variable may contain a "%s" where the name of the page is inserted. The XYMONSUBPAGEHTACCESS variable may contain two "%s" instances: The first is replaced with the pagename, the second with the subpagename. .sp .IP "\-\-max\-eventcount=N" Limit the eventlog on the "All non-green" page to only N events. Default: 100. .sp .IP "\-\-max\-eventtime=N" Limit the eventlog on the "All non-green" page to events that happened within the past N minutes. Default: 240. .sp .IP "\-\-no\-eventlog" Disable the eventlog normally displayed on the "All non-green" page .sp .IP "\-\-max\-ackcount=N" Limit the acknowledgment log on the "All non-green" page to only N events. Default: 25. .sp .IP "\-\-max\-acktime=N" Limit the acknowledgment log on the "All non-green" page to acks that happened within the past N minutes. Default: 240. .sp .IP "\-\-no\-acklog" Disable the acknowledgement log normally displayed on the "All non-green" page. .sp .IP "\-\-cricitcallog[=Critical log column]" This generates a text-based log of what is shown on the critical.html status page, and sends a status message for the Xymon server itself reflecting the color of the Critical status page. This allows you to track when problems have appeared on the critical status page. The logfile is stored in $XYMONSERVERLOGS/criticalstatus.log .sp .IP \-\-loadhostsfromxymond Instead of reading the hosts.cfg file, xymongen will load the hosts.cfg configuration from the xymond daemon. This eliminates the need for reading the hosts.cfg, and if you have xymond and xymongen running on different hosts, it also eliminates the need for copying the hosts.cfg file between systems. Note that the "dispinclude" option in hosts.cfg is ignored when this option is enabled. .SH PAGE LAYOUT OPTIONS These options affect how the webpages generated by xymongen appear in the browser. .sp .IP "\-\-pages\-last" Put page- and subpage-links after hosts. .IP "\-\-pages\-first" Put page- and subpage-links before hosts (default). .sp These two options decide whether a page with links to subpages and hosts have the hosts or the subpages first. .sp .IP "\-\-subpagecolumns=N" Determines the number of columns used for links to pages and subpages. The default is N=1. .sp .IP "\-\-maxrows=N" Column headings on a page are by default only shown at the beginning of a page, subpage or group of hosts. This options causes the column headings to repeat for every N hosts shown. .sp .IP "\-\-showemptygroups" .IP "\-\-no\-showemptygroups" When groups are hosts are made, display the table and host names even if there are no tests present for any of the hosts in question. Use \-\-no\-showemptygroups to hide. (Default: yes) .sp .IP "\-\-pagetitle\-links" Normally, only the colored "dots" next to a page or subpage act as links to the page itself. With this option, the page title will link to the page also. .sp .IP "\-\-pagetext\-headings" Use the description text from the "page" or "subpage" tags as a heading for the page, instead of the "Pages hosted locally" or other standard heading. .sp .IP "\-\-no\-underline\-headings" Normally, page headings are underlined using an HTML "horizontal ruler" tag. This option disables the underlining of headings. .sp .IP "\-\-recentgifs[=MINUTES]" Use images named COLOR\-recent.gif for tests, where the test status has changed within the past 24 hours. These GIF files need to be installed in the $XYMONHOME/www/gifs/ directory. By default, the threshold is set to 24 hours - if you want it differently, you can specify the time limit also. E.g. "\-\-recentgifs=3h" will show the recent GIFs for only 3 hours after a status change. .sp .IP "\-\-sort\-group\-only\-items" In a normal "group-only" directive, you can specify the order in which the tests are displayed, from left to right. If you prefer to have the tests listed in alphabetical order, use this option - the page will then generate "group-only" groups like it generates normal groups, and sort the tests alphabetically. .sp .IP "\-\-dialupskin=URL" If you want to visually show that a test is a dialup-test, you can use an alternate set of icons for the green/red/yellow>/etc. images by specifying this option. The URL parameter specified here overrides the normal setting from the XYMONSKIN environment variable, but only for dialup tests. .sp .IP "\-\-reverseskin=URL" Same as "\-\-dialupskin", but for reverse tests (tests with '!' in front). .sp .IP "\-\-tooltips=[always,never,main]" Determines which pages use tooltips to show the description of the host (from the COMMENT entry in the .I hosts.cfg(5) file). If set to \fBalways\fR, tooltips are used on all pages. If set to \fBnever\fR, tooltips are never used. If set to \fBmain\fR, tooltips are used on the main pages, but not on the "All non-green" or "Critical systems" pages. .SH COLUMN SELECTION OPTIONS These options affect which columns (tests) are included in the webpages generated by xymongen. .sp .IP "\-\-ignorecolumns=test[,test]" The given columns will be completely ignored by xymongen when generating webpages. Can be used to generate reports where you eliminate some of the more noisy tests, like "msgs". .sp .IP "\-\-critical\-reds\-only" Only red status columns will be included on the Critical page. By default, the Critical page will contain hosts with red, yellow and clear status. .sp .IP "\-\-nongreen\-colors=COLOR[,COLOR]" Defines which colors cause a test to appear on the "All non-green" status page. COLOR is red, yellow or purple. The default is to include all three. .sp .IP "\-\-nongreen\-ignorecolumns=test[,test]" Same as the \-\-ignorecolumns, but applies to hosts on the "All non-green" page only. .sp .IP "\-\-nongreen\-ignorepurples" Deprecated, use "\-\-nongreen\-colors" instead. .sp .IP "\-\-nongreen\-ignoredialups" Ignore all dialup hosts on the "All non-green" page, including the eventlog. .sp .IP "\-\-no\-pages" Do not generate the normal pages (normally used to generate only the non-green page). .sp .IP "\-\-no\-nongreen" Do not generate the "All non-green" page. .sp .IP "\-\-includecolumns=test[,test]" Always include these columns on "All non-green" page Will include certain columns on the nongreen.html page, regardless of its color. Normally, nongreen.html drops a test-column, if all tests are green. This can be used e.g. to always have a link to the trends column (with the RRD graphs) from your nongreen.html page. .sp .IP "\-\-eventignore=test[,test]" Ignore these tests in the "All non-green" event log display. .SH STATUS PROPAGATION OPTIONS These options suppress the normal propagation of a status upwards in the page hierarchy. Thus, you can have a test with status yellow or red, but still have the entire page green. It is useful for tests that need not cause an alarm, but where you still want to know the actual status. These options set global defaults for all hosts; you can use the NOPROPRED and NOPROPYELLOW tags in the .I hosts.cfg(5) file to apply similar limits on a per-host basis. .sp .IP "\-\-nopropyellow=test[,test] or \-\-noprop=test[,test] Disable upwards status propagation when YELLOW. The "\-\-noprop" option is deprecated and should not be used. .sp .IP "\-\-noproppurple=test[,test]" Disable upwards status propagation when PURPLE. .sp .IP "\-\-nopropred=test[,test]" Disable upwards status propagation when RED or YELLOW. .sp .IP "\-\-nopropack=test[,test]" Disable upwards status propagation when status has been acknowledged. If you want to disable all acked tests from being propageted, use "\-\-nopropack=*". .SH PURPLE STATUS OPTIONS Purple statuses occur when reporting of a test status stops. A test status is valid for a limited amount of time - normally 30 minutes - and after this time, the test becomes purple. .sp .IP "\-\-purplelog=FILENAME" Generate a logfile of all purple status messages. .SH ALTERNATE PAGESET OPTIONS .sp .IP "\-\-pageset=PAGESETNAME" Build webpages for an alternate pageset than the default. See the PAGESETS section below. .sp .IP "\-\-template=TEMPLATE" Use an alternate template for header and footer files. Typically used together the the "\-\-pageset" option; see the PAGESETS section below. .SH ALTERNATE OUTPUT FORMATS .sp .IP "\-\-wml[=test1,test2,...]" This option causes xymongen to generate a set of WML "card" files that can be accessed by a WAP device (cell phone, PDA etc.) The generated files contain the hosts that have a RED or YELLOW status on tests specified. This option can define the default tests to include - the defaults can be overridden or amended using the "WML:" or "NK:" tags in the .I hosts.cfg(5) file. If no tests are specified, all tests will be included. .sp .IP "\-\-nstab=FILENAME" Generate an HTML file suitable for a Netscape 6/Mozilla sidebar entry. To actually enable your users to obtain such a sidebar entry, you need this Javascript code in a webpage (e.g. you can include it in the $XYMONHOME/web/stdnormal_header file): .sp .sp and then you can include a "Add this to sidebar" link using this as a template: .sp Add to Sidebar .sp or if you prefer to have the standard Netscape "Add tab" button, you would do it with .sp .br [Add Sidebar] .br .sp The "add\-button.gif" is available from Netscape at http://developer.netscape.com/docs/manuals/browser/sidebar/add\-button.gif. If FILENAME does not begin with a slash, the Netscape sidebar file is placed in the $XYMONHOME/www/ directory. .IP "\-\-nslimit=COLOR" The minimum color to include in the Netscape Sidebar - default is "red", meaning only critical alerts are included. If you want to include warnings also, use "\-\-nslimit=yellow". .IP "\-\-rss" Generate RSS/RDF content delivery stream of your Xymon alerts. This output format can be dynamically embedded in other web pages, much like the live newsfeeds often seen on web sites. Two RSS files will be generated, one reflects the "All non-green" page, the other reflects the "Critical" page. They will be in the "nongreen.rss" and "critical.rss" files, respectively. In addition, an RSS file will be generated for each page and/or subpage listing the hosts present on that page or subpage. .br The FILENAME parameter previously allowed on the \-\-rss option is now obsolete. .br For more information about RSS/RDF content feeds, please see http://www.syndic8.com/. .sp .IP "\-\-rssextension=.EXTENSION" Sets the filename extension used for the RSS files generated by xymongen. By default, an extension of ".rss" is used. Note that you need to specify the "dot". .sp .IP "\-\-rssversion={0.91|0.92|1.0|2.0}" The desired output format of the RSS/RDF feed. Version 0.91 appears to be the most commonly used format, and is the default if this option is omitted. .sp .IP "\-\-rsslimit=COLOR" The minimum color to include in the RSS feed - default is "red", meaning only critical alerts are included. If you want to include warnings also, use "\-\-rsslimit=yellow". .SH OPTIONS USED BY CGI FRONT-ENDS .IP "\-\-reportopts=START:END:DYNAMIC:STYLE" Invoke xymongen in report-generation mode. This is normally used by the .I report.cgi(1) CGI script, but may also be used directly when pre-generating reports. The START parameter is the start-time for the report in Unix time_t format (seconds since Jan 1st 1970 00:00 UTC); END is the end-time for the report; DYNAMIC is 0 for a pre-built report and 1 for a dynamic (on-line) report; STYLE is "crit" to include only critical (red) events, "nongr" to include all non-green events, and "all" to include all events. .sp .IP "\-\-csv=FILENAME" Used together with \-\-reportopts, this causes xymongen to generate an availability report in the form of a comma-separated values (CSV) file. This format is commonly used for importing into spreadsheets for further processing. .br The CSV file includes Unix timestamps. To display these as human readable times in Excel, the formula \fB=C2/86400+DATEVALUE(1\-jan\-1970)\fR (if you have the Unix timestamp in the cell C2) can be used. The result cell should be formatted as a date/time field. Note that the timestamps are in UTC, so you may also need to handle local timezone and DST issues yourself. .sp .IP "\-\-csvdelim=DELIMITER" By default, a comma is used to delimit fields in the CSV output. Some non-english spreadsheets use a different delimiter, typically semi-colon. To generate a CSV file with the proper delimiter, you can use this option to set the character used as delimiter. E.g. "\-\-csvdelim=;" - note that this normally should be in double quotes, to prevent the Unix shell from interpreting the delimiter character as a command-line delimiter. .sp .IP "\-\-snapshot=TIME" Generate a snapshot of the Xymon pages, as they appeared at TIME. TIME is given as seconds since Jan 1st 1970 00:00 UTC. Normally used via the .I snapshot.cgi(1) CGI script. .SH DEBUGGING OPTIONS .sp .IP "\-\-debug" Causes xymongen to dump large amounts of debugging output to stdout, if it was compiled with the \-DDEBUG enabled. When reporting a problem with xymongen, please try to reproduce the problem and provide the output from running xymongen with this option. .sp .IP "\-\-timing" Dump information about the time spent by various parts of xymongen to stdout. This is useful to see what part of the processing is responsible for the run-time of xymongen. .br Note: This information is also provided in the output sent to the Xymon display when using the "\-\-report" option. .SH BUILDING ALTERNATE PAGESETS With version 1.4 of xymongen comes the possibility to generate multiple sets of pages from the same data. .br Suppose you have two groups of people looking at the Xymon webpages. Group A wants to have the hosts grouped by the client, they belong to. This is how you have Xymon set up - the default pageset. Now group B wants to have the hosts grouped by operating system - let us call it the "os" set. Then you would add the page layout to hosts.cfg like this: .sp ospage win Microsoft Windows .br ossubpage win\-nt4 MS Windows NT 4 .br osgroup NT4 File servers .br osgroup NT4 Mail servers .br ossubpage win\-xp MS Windows XP .br ospage unix Unix .br ossubpage unix\-sun Solaris .br ossubpage unix\-linux Linux .sp This defines a set of pages with one top-level page (the xymon.html page), two pages linked from xymon.html (win.html and unix.html), and from e.g. the win.html page there are subpages win\-nt4.html and win\-xp.html .br The syntax is identical to the normal "page" and "subpage" directives in hosts.cfg, but the directive is prefixed with the pageset name. Don't put any hosts in-between the page and subpage directives - just add all the directives at the top of the hosts.cfg file. .br How do you add hosts to the pages, then ? Simple - just put a tag "OS:win\-xp" on the host definition line. The "OS" must be the same as prefix used for the pageset names, but in uppercase. The "win\-xp" must match one of the pages or subpages defined within this pageset. E.g. .sp 207.46.249.190 www.microsoft.com # OS:win\-xp http://www.microsoft.com/ .br 64.124.140.181 www.sun.com # OS:unix\-sun http://www.sun.com/ .sp If you want the host to appear inside a group defined on that page, you must identify the group by number, starting at 1. E.g. to put a host inside the "NT4 Mail servers" group in the example above, use "OS:win\-nt4,2" (the second group on the "win\-nt4" page). .br If you want the host to show up on the frontpage instead of a subpage, use "OS:*" . .sp All of this just defines the layout of the new pageset. To generate it, you must run xymongen once for each pageset you define - i.e. create an extension script like this: .IP .nf #!/bin/sh XYMONWEB="/xymon/os" $XYMONHOME/bin/xymongen \\ \-\-pageset=os \-\-template=os \\ $XYMONHOME/www/os/ .fi .LP Save this to $XYMONHOME/ext/os\-display.sh, and set this up to run as a Xymon extension; this means addng an extra section to tasks.cfg to run it. This generates the pages. There are some important options used here: .br * XYMONWEB="/xymon/os" environment variable, and the "$XYMONHOME/www/os/" option work together, and places the new pageset HTML files in a subdirectory off the normal Xymon webroot. If you normally access the Xymon pages as "http://xymon.acme.com/xymon/", you will then access the new pageset as "http://xymon.acme.com/xymon/os/" NB: The directory given as XYMONWEB must contain a symbolic link to the $XYMONHOME/www/html/ directory, or links to individual status messages will not work. Similar links should be made for the gifs/, help/ and notes/ directories. .br * "\-\-pageset=os" tells xymongen to structure the webpages using the "os" layout, instead of the default layout. .br * "\-\-template=os" tells xymongen to use a different set of header- and footer-templates. Normally xymongen uses the standard template in $XYMONHOME/web/stdnormal_header and .../stdnormal_footer - with this option, it will instead use the files "os_header" and "os_footer" from the $XYMONHOME/web/ directory. This allows you to customize headers and footers for each pageset. If you just want to use the normal template, you can omit this option. .SH USING XYMONGEN FOR REPORTS xymongen reporting is implemented via drop-in replacements for the standard Xymon reporting scripts (report.sh and reportlog.sh) installed in your webservers cgi\-bin directory. These two shell script have been replaced with two very small shell-scripts, that merely setup the Xymon environment variables, and invoke the .I report.cgi(1) or .I reportlog.cgi(1) scripts in $XYMONHOME/bin/ You can use xymongen command-line options when generating reports, e.g. to exclude certain types of tests (e.g. "\-\-ignorecolumns=msgs") from the reports, to specify the name of the trends- and info- columns that should not be in the report, or to format the report differently (e.g. "\-\-subpagecolumns=2"). If you want certain options to be used when a report is generated from the web interface, put these options into your $XYMONHOME/etc/xymonserver.cfg file in the XYMONGENREPOPTS environment variable. The report files generated by xymongen are stored in individual directories (one per report) below the $XYMONHOME/www/rep/ directory. These should be automatically cleaned up - as new reports are generated, the old ones get removed. After installing, try generating a report. You will probably see that the links in the upper left corner (to ack.html, nongreen.html etc.) no longer works. To fix these, change your $XYMONHOME/web/repnormal_header file so these links do not refer to "&XYMONWEB" but to the normal URL prefix for your Xymon pages. .SH SLA REPORTING xymongen reporting allows for the generation of true SLA (Service Level Agreement) reports, also for service periods that are not 24x7. This is enabled by defining a "REPORTTIME:timespec" tag for the hosts to define the service period, and optionally a "WARNPCT:level" tag to define the agreed availability. Note: See .I hosts.cfg(5) for the exact syntax of these options. "REPORTTIME:timespec" specifies the time of day when the service is expected to be up and running. By default this is 24 hours a day, all days of the week. If your SLA only covers Mon-Fri 7am - 8pm, you define this as "REPORTTIME=W:0700:2000", and the report generator will then compute both the normal 24x7 availability but also a "SLA availability" which only takes the status of the host during the SLA period into account. The DOWNTIME:timespec parameter affects the SLA availability calculation. If an outage occurs during the time defined as possible "DOWNTIME", then the failure is reported with a status of "blue". (The same color is used if you "disable" then host using the Xymon "disable" function). The time when the test status is "blue" is not included in the SLA calculation, neither in the amount of time where the host is considered down, nor in the total amount of time that the report covers. So "blue" time is effectively ignored by the SLA availability calculation, allowing you to have planned downtime without affecting the reported SLA availability. Example: A host has "DOWNTIME:*:0700:0730 REPORTTIME=W:0600:2200" because it is rebooted every day between 7am and 7.30am, but the service must be available from 6am to 10pm. For the day of the report, it was down from 7:10am to 7:15am (the planned reboot), but also from 9:53pm to 10:15pm. So the events for the day are: 0700 : green for 10 minutes (600 seconds) 0710 : blue for 5 minutes (300 seconds) 0715 : green for 14 hours 38 minutes (52680 seconds) 2153 : red for 22 minutes (1320 seconds) 2215 : green The service is available for 600+52680 = 53280 seconds. It is down (red) for 420 seconds (the time from 21:53 until 22:00 when the SLA period ends). The total time included in the report is 15 hours (7am - 10pm) except the 5 minutes blue = 53700 seconds. So the SLA availability is 53280/53700 = 99,22% The "WARNPCT:level" tag is supported in the hosts.cfg file, to set the availability threshold on a host-by-host basis. This threshold determines whether a test is reported as green, yellow or red in the reports. A default value can be set for all hosts with the via the XYMONREPWARN environment variable, but overridden by this tag. The level is given as a percentage, e.g. "WARNPCT:98.5" .SH PRE-GENERATED REPORTS Normally, xymongen produce reports that link to dynamically generated webpages with the detailed status of a test (via the reportlog.sh CGI script). It is possible to have xymongen produce a report without these dynamic links, so the report can be exported to another server. It may also be useful to pre-generate the reports, to lower the load by having multiple users generate the same reports. To do this, you must run xymongen with the "\-\-reportopts" option to select the time interval that the report covers, the reporting style (critical, non-green, or all events), and to request that no dynamic pages are to be generated. The syntax is: xymongen \-\-reportopts=starttime:endtime:nodynamic:style "starttime" and "endtime" are specified as Unix time_t values, i.e. seconds since Jan 1st 1970 00:00 GMT. Fortunately, this can easily be computed with the GNU date utility if you use the "+%s" output option. If you don't have the GNU date utility, either pick that up from www.gnu.org; or you can use the "etime" utility for the same purpose, which is available from the archive at www.deadcat.net. "nodynamic" is either 0 (for dynamic pages, the default) or 1 (for no dynamic, i.e. pre-generated, pages). "style" is either "crit" (include critical i.e. red events only), "nongr" (include all non-green events), or "all" (include all events). Other xymongen options can be used, e.g. "\-\-ignorecolumns" if you want to exclude certain tests from the report. You will normally also need to specify the XYMONWEB environment variable (it must match the base URL for where the report will be made accessible from), and an output directory where the report files are saved. If you specify XYMONWEB, you should probably also define the XYMONHELPSKIN and XYMONNOTESSKIN environment variables. These should point to the URL where your Xymon help- and notes-files are located; if they are not defined, the links to help- and notes-files will point inside the report directory and will probably not work. So a typical invocation of xymongen for a static report would be: START=`date +%s \-\-date="22 Jun 2003 00:00:00"` END=`date +%s \-\-date="22 Jun 2003 23:59:59"` XYMONWEB=/reports/bigbrother/daily/2003/06/22 \\ XYMONHELPSKIN=/xymon/help \\ XYMONNOTESSKIN=/xymon/notes \\ xymongen \-\-reportopts=$START:$END:1:crit \\ \-\-subpagecolumns=2 \\ /var/www/docroot/reports/xymon/daily/2003/06/22 The "XYMONWEB" setting means that the report will be available with a URL of "http://www.server.com/reports/xymon/daily/2003/06/22". The report contains internal links that use this URL, so it cannot be easily moved to another location. The last parameter is the corresponding physical directory on your webserver matching the XYMONWEB URL. You can of course create the report files anywhere you like - perhaps on another machine - and then move them to the webserver later on. Note how the .I date(1) utility is used to calculate the start- and end-time parameters. .SH "ENVIRONMENT VARIABLES" .IP BOARDFILTER Filter used to select what hosts / tests are included in the webpages, by filtering the data retrieved from xymond vi the xymondboard command. See .I xymon(1) for details on the filter syntax. By default, no filtering is done. .SH "SEE ALSO" hosts.cfg(5), xymonserver.cfg(5), tasks.cfg(5), report.cgi(1), snapshot.cgi(1), xymon(7) xymon-4.3.28/xymongen/csvreport.c0000664000076400007640000000474511615341300017255 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon overview webpage generator tool. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #include #include #include #include "csvreport.h" #include "util.h" void csv_availability(char *fn, char csvdelim) { hostlist_t *hl; FILE *fd; char *header = "Hostname,Testname,Start,End,24x7 availability %,24x7 green %,24x7 green secs,24x7 clear %,24x7 clear secs,24x7 blue %,24x7 blue secs,24x7 purple %,24x7 purple secs,24x7 yellow %,24x7 yellow secs,24x7 red %,24x7 red secs,SLA availability %,SLA green %,SLA green secs,SLA clear %,SLA clear secs,SLA blue %,SLA blue secs,SLA purple %,SLA purple secs,SLA yellow %,SLA yellow secs,SLA red %,SLA red secs"; fd = fopen(fn, "w"); if (fd == NULL) { errprintf("Cannot open output file %s: %s\n", fn, strerror(errno)); return; } if (csvdelim != ',') { char *p, *newheader; newheader = strdup(header); p = newheader; while ((p = strchr(p, ',')) != NULL) *p = csvdelim; header = newheader; } fprintf(fd, "%s\n", header); for (hl = hostlistBegin(); (hl); hl = hostlistNext()) { host_t *hwalk = hl->hostentry; entry_t *ewalk; int i; for (ewalk = hwalk->entries; (ewalk); ewalk = ewalk->next) { fprintf(fd, "%s%c%s%c%ld%c%ld", hwalk->hostname, csvdelim, ewalk->column->name, csvdelim, ewalk->repinfo->reportstart, csvdelim, reportend); fprintf(fd, "%c%.2f", csvdelim, ewalk->repinfo->fullavailability); for (i=0; (irepinfo->fullpct[i], csvdelim, ewalk->repinfo->fullduration[i]); } fprintf(fd, "%c%.2f", csvdelim, ewalk->repinfo->reportavailability); for (i=0; (irepinfo->reportpct[i], csvdelim, ewalk->repinfo->reportduration[i]); } fprintf(fd, "\n"); } } fclose(fd); } xymon-4.3.28/xymongen/util.h0000664000076400007640000000250711615341300016202 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* xymon overview webpage generator tool. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __UTIL_H_ #define __UTIL_H_ extern char *htmlextension; extern char *hostpage_link(host_t *host); extern char *hostpage_name(host_t *host); extern int checkpropagation(host_t *host, char *test, int color, int acked); extern host_t *find_host(char *hostname); extern int host_exists(char *hostname); extern hostlist_t *find_hostlist(char *hostname); extern hostlist_t *hostlistBegin(void); extern hostlist_t *hostlistNext(void); extern void add_to_hostlist(hostlist_t *rec); extern xymongen_col_t *find_or_create_column(char *testname, int create); extern int wantedcolumn(char *current, char *wanted); #endif xymon-4.3.28/xymongen/wmlgen.c0000664000076400007640000003070112605356203016516 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon WML generator. */ /* */ /* This file contains code to generate the WAP/WML documents showing the */ /* Xymon status. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: wmlgen.c 7684 2015-10-08 03:01:23Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include #include #include "xymongen.h" #include "wmlgen.h" #include "util.h" int enable_wmlgen = 0; static char wmldir[PATH_MAX]; static void delete_old_cards(char *dirname) { DIR *xymoncards; struct dirent *d; struct stat st; time_t now = getcurrenttime(NULL); char fn[PATH_MAX]; xymoncards = opendir(dirname); if (!xymoncards) { errprintf("Cannot read directory %s\n", dirname); return; } if (chdir(dirname) == -1) { return; } while ((d = readdir(xymoncards))) { strcpy(fn, d->d_name); stat(fn, &st); if ((fn[0] != '.') && S_ISREG(st.st_mode) && (st.st_mtime < (now-3600))) { unlink(fn); } } closedir(xymoncards); } static char *wml_colorname(int color) { switch (color) { case COL_GREEN: return "GR"; break; case COL_RED: return "RE"; break; case COL_YELLOW: return "YE"; break; case COL_PURPLE: return "PU"; break; case COL_CLEAR: return "CL"; break; case COL_BLUE: return "BL"; break; } return ""; } static void wml_header(FILE *output, char *cardid, int idpart) { fprintf(output, "\n"); fprintf(output, "\n"); fprintf(output, "\n"); fprintf(output, "\n"); fprintf(output, "\n"); fprintf(output, "\n"); fprintf(output, "\n", cardid, idpart); } static void generate_wml_statuscard(host_t *host, entry_t *entry) { char fn[PATH_MAX]; FILE *fd; char *msg = NULL, *logbuf = NULL; char l[MAX_LINE_LEN], lineout[MAX_LINE_LEN]; char *p, *outp, *nextline; char xymondreq[1024]; int xymondresult; sendreturn_t *sres; sres = newsendreturnbuf(1, NULL); sprintf(xymondreq, "xymondlog %s.%s", host->hostname, entry->column->name); xymondresult = sendmessage(xymondreq, NULL, XYMON_TIMEOUT, sres); logbuf = getsendreturnstr(sres, 1); freesendreturnbuf(sres); if ((xymondresult != XYMONSEND_OK) || (logbuf == NULL) || (strlen(logbuf) == 0)) { errprintf("WML: Status not available\n"); return; } msg = strchr(logbuf, '\n'); if (msg) { msg++; } else { errprintf("WML: Unable to parse log data\n"); xfree(logbuf); return; } nextline = msg; l[MAX_LINE_LEN - 1] = '\0'; sprintf(fn, "%s/%s.%s.wml", wmldir, host->hostname, entry->column->name); fd = fopen(fn, "w"); if (fd == NULL) { errprintf("Cannot create file %s\n", fn); return; } wml_header(fd, "name", 1); fprintf(fd, "

\n"); fprintf(fd, "Host
\n", host->hostname); fprintf(fd, "%s

\n", timestamp); fprintf(fd, "

\n"); fprintf(fd, "%s.%s

\n", host->hostname, entry->column->name); /* * We need to parse the logfile a bit to get a decent WML * card that contains the logfile. bbd does this for * HTML, we need to do it ourselves for WML. * * Empty lines are removed. * DOCTYPE lines (if any) are removed. * "http://" is removed * "" tags are replaced with a newline. * All HTML tags are removed * "&COLOR" is replaced with the shortname color * "<", ">", "&", "\"" and "\'" are replaced with the coded name so they display correctly. */ while (nextline) { p = strchr(nextline, '\n'); if (p) *p = '\0'; strncpy(l, nextline, (MAX_LINE_LEN - 1)); if (p) nextline = p+1; else nextline = NULL; outp = lineout; for (p=l; (*p && isspace((int) *p)); p++) ; if (strlen(p) == 0) { /* Empty line - ignore */ } else if (strstr(l, "DOCTYPE")) { /* DOCTYPE - ignore */ } else { for (p=l; (*p); ) { if (strncmp(p, "http://", 7) == 0) { p += 7; } else if (strncasecmp(p, "", 4) == 0) { strcpy(outp, "
"); outp += 5; p += 4; } else if (*p == '<') { char *endtag, *newstarttag; /* * Possibilities: * - : Drop it * - < : Output the < equivalent * - <<< : Handle them one '<' at a time */ endtag = strchr(p+1, '>'); newstarttag = strchr(p+1, '<'); if ((endtag == NULL) || (newstarttag && (newstarttag < endtag))) { /* Single '<', or new starttag before the end */ strcpy(outp, "<"); outp += 4; p++; } else { /* Drop all html tags */ *outp = ' '; outp++; p = endtag+1; } } else if (*p == '>') { strcpy(outp, ">"); outp += 4; p++; } else if (strncmp(p, "&red", 4) == 0) { strcpy(outp, "red"); outp += 10; p += 4; } else if (strncmp(p, "&green", 6) == 0) { strcpy(outp, "green"); outp += 12; p += 6; } else if (strncmp(p, "&purple", 7) == 0) { strcpy(outp, "purple"); outp += 13; p += 7; } else if (strncmp(p, "&yellow", 7) == 0) { strcpy(outp, "yellow"); outp += 13; p += 7; } else if (strncmp(p, "&clear", 6) == 0) { strcpy(outp, "clear"); outp += 12; p += 6; } else if (strncmp(p, "&blue", 5) == 0) { strcpy(outp, "blue"); outp += 11; p += 5; } else if (*p == '&') { strcpy(outp, "&"); outp += 5; p++; } else if (*p == '\'') { strcpy(outp, "'"); outp += 6; p++; } else if (*p == '\"') { strcpy(outp, """); outp += 6; p++; } else { *outp = *p; outp++; p++; } } } *outp = '\0'; if (strlen(lineout)) fprintf(fd, "%s\n
\n", lineout); } fprintf(fd, "

\n"); fclose(fd); if (logbuf) xfree(logbuf); } void do_wml_cards(char *webdir) { FILE *nongreenfd, *hostfd; char nongreenfn[PATH_MAX], hostfn[PATH_MAX]; hostlist_t *h; entry_t *t; int nongreenwapcolor; long wmlmaxchars = 1500; int nongreenpart = 1; /* Determine where the WML files go */ sprintf(wmldir, "%s/wml", webdir); /* Make sure the WML directory exists */ if (chdir(wmldir) != 0) mkdir(wmldir, 0755); if (chdir(wmldir) != 0) { errprintf("Cannot access or create the WML output directory %s\n", wmldir); return; } /* Make sure this is set sensibly */ if (xgetenv("WMLMAXCHARS")) { wmlmaxchars = atol(xgetenv("WMLMAXCHARS")); } /* * Cleanup cards that are too old. */ delete_old_cards(wmldir); /* * Find all the test entries that belong on the WAP page, * and calculate the color for the nongreen wap page. * * We want only tests that have the "onwap" flag set, i.e. * tests given in the "WAP:test,..." for this host (of the * "NK:test,..." if no WAP list). * * At the same time, generate the WML card for the tests, * corresponding to the HTML file for the test logfile. */ nongreenwapcolor = COL_GREEN; for (h = hostlistBegin(); (h); h = hostlistNext()) { h->hostentry->wapcolor = COL_GREEN; for (t = h->hostentry->entries; (t); t = t->next) { if (t->onwap && ((t->color == COL_RED) || (t->color == COL_YELLOW))) { generate_wml_statuscard(h->hostentry, t); h->hostentry->anywaps = 1; } else { /* Clear the onwap flag - makes testing later a bit simpler */ t->onwap = 0; } if (t->onwap && (t->color > h->hostentry->wapcolor)) h->hostentry->wapcolor = t->color; } /* Update the nongreenwapcolor */ if ( (h->hostentry->wapcolor == COL_RED) || (h->hostentry->wapcolor == COL_YELLOW) ) { if (h->hostentry->wapcolor > nongreenwapcolor) nongreenwapcolor = h->hostentry->wapcolor; } } /* Start the non-green WML card */ sprintf(nongreenfn, "%s/nongreen.wml.tmp", wmldir); nongreenfd = fopen(nongreenfn, "w"); if (nongreenfd == NULL) { errprintf("Cannot open non-green WML file %s\n", nongreenfn); return; } /* Standard non-green wap header */ wml_header(nongreenfd, "card", nongreenpart); fprintf(nongreenfd, "

\n"); fprintf(nongreenfd, "%s

\n", timestamp); fprintf(nongreenfd, "

\n"); fprintf(nongreenfd, "Summary Status
%s

\n", colorname(nongreenwapcolor)); /* All green ? Just say so */ if (nongreenwapcolor == COL_GREEN) { fprintf(nongreenfd, "All is OK
\n"); } /* Now loop through the hostlist again, and generate the nongreen WAP links and host pages */ for (h = hostlistBegin(); (h); h = hostlistNext()) { if (h->hostentry->anywaps) { /* Create the host WAP card, with links to individual test results */ sprintf(hostfn, "%s/%s.wml", wmldir, h->hostentry->hostname); hostfd = fopen(hostfn, "w"); if (hostfd == NULL) { errprintf("Cannot create file %s\n", hostfn); return; } wml_header(hostfd, "name", 1); fprintf(hostfd, "

\n"); fprintf(hostfd, "Overall
\n"); fprintf(hostfd, "%s

\n", timestamp); fprintf(hostfd, "

\n"); fprintf(hostfd, "%s

\n", h->hostentry->hostname); for (t = h->hostentry->entries; (t); t = t->next) { if (t->onwap) { fprintf(hostfd, "%s%s %s
\n", t->column->name, wml_colorname(t->color), (t->acked ? "x" : ""), h->hostentry->hostname, t->column->name, t->column->name); } } fprintf(hostfd, "\n

\n"); fclose(hostfd); /* Create the link from the nongreen wap card to the host card */ fprintf(nongreenfd, "%s %s
\n", h->hostentry->hostname, wml_colorname(h->hostentry->wapcolor), h->hostentry->hostname, h->hostentry->hostname); /* * Gross hack. Some WAP phones cannot handle large cards. * So if the card grows larger than WMLMAXCHARS, split it into * multiple files and link from one file to the next. */ if (ftello(nongreenfd) >= wmlmaxchars) { char oldnongreenfn[PATH_MAX]; /* WML link is from the nongreenfd except leading wmldir+'/' */ strcpy(oldnongreenfn, nongreenfn+strlen(wmldir)+1); nongreenpart++; fprintf(nongreenfd, "
Next\n", nongreenpart); fprintf(nongreenfd, "

\n"); fclose(nongreenfd); /* Start a new Nongreen WML card */ sprintf(nongreenfn, "%s/nongreen-%d.wml", wmldir, nongreenpart); nongreenfd = fopen(nongreenfn, "w"); if (nongreenfd == NULL) { errprintf("Cannot open Nongreen WML file %s\n", nongreenfd); return; } wml_header(nongreenfd, "card", nongreenpart); fprintf(nongreenfd, "

\n"); fprintf(nongreenfd, "Previous
\n", oldnongreenfn); fprintf(nongreenfd, "%s

\n", timestamp); fprintf(nongreenfd, "

\n"); fprintf(nongreenfd, "Summary Status
%s

\n", colorname(nongreenwapcolor)); } } } fprintf(nongreenfd, "

\n"); fclose(nongreenfd); if (chdir(wmldir) == 0) { /* Rename the top-level file into place now */ rename("nongreen.wml.tmp", "nongreen.wml"); /* Make sure there is the index.wml file pointing to nongreen.wml */ if (!symlink("nongreen.wml", "index.wml")) { errprintf("symlink nongreen.xml->index.wml failed: %s\n", strerror(errno)); } } return; } xymon-4.3.28/xymongen/debug.h0000664000076400007640000000230411615341300016306 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon overview webpage generator tool. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __DEBUG_H_ #define __DEBUG_H_ extern int timing; extern void add_timestamp(const char *msg); extern void show_timestamps(char **buffer); extern long total_runtime(void); extern const char *textornull(const char *text); extern void dumphosts(host_t *head, char *prefix); extern void dumpgroups(group_t *head, char *prefix, char *hostprefix); extern void dumphostlist(hostlist_t *head); extern void dumpstatelist(state_t *head); extern void dumpall(xymongen_page_t *head); #endif xymon-4.3.28/xymongen/xymongen.c0000664000076400007640000006357112661417753017116 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon overview webpage generator tool. */ /* */ /* This is the main program for generating Xymon overview webpages, showing */ /* the status of hosts in a Xymon system. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: xymongen.c 7902 2016-02-18 19:47:55Z jccleaver $"; #include #include #include #include #include #include #include #include "version.h" #include "xymongen.h" #include "util.h" #include "debug.h" #include "loadlayout.h" #include "loaddata.h" #include "process.h" #include "pagegen.h" #include "wmlgen.h" #include "rssgen.h" #include "csvreport.h" /* Global vars */ xymongen_page_t *pagehead = NULL; /* Head of page list */ state_t *statehead = NULL; /* Head of list of all state entries */ summary_t *sumhead = NULL; /* Summaries we send out */ dispsummary_t *dispsums = NULL; /* Summaries we received and display */ int xymon_color, nongreen_color, critical_color; /* Top-level page colors */ int fqdn = 1; /* Xymon FQDN setting */ int loadhostsfromxymond = 0; time_t reportstart = 0; time_t reportend = 0; double reportwarnlevel = 97.0; double reportgreenlevel = 99.995; int reportwarnstops = -1; int reportstyle = STYLE_CRIT; int dynamicreport = 1; enum tooltipuse_t tooltipuse = TT_STDONLY; char *reqenv[] = { "XYMONACKDIR", "XYMONHISTDIR", "XYMONHISTLOGS", "XYMONHOME", "HOSTSCFG", "XYMONRAWSTATUSDIR", "XYMONLOGSTATUS", "XYMONNOTESDIR", "XYMONREPDIR", "XYMONREPURL", "XYMONSKIN", "XYMONTMP", "XYMONVAR", "XYMONWEB", "XYMONWEBHOST", "XYMONWEBHOSTURL", "CGIBINURL", "DOTHEIGHT", "DOTWIDTH", "MACHINE", "MACHINEADDR", "XYMONPAGECOLFONT", "XYMONPAGELOCAL", "XYMONPAGESUBLOCAL", "XYMONPAGEREMOTE", "XYMONPAGEROWFONT", "XYMONPAGETITLE", "PURPLEDELAY", NULL }; int main(int argc, char *argv[]) { char *pagedir; xymongen_page_t *p; dispsummary_t *s; int i; char *pageset = NULL; char *nssidebarfilename = NULL; char *egocolumn = NULL; char *csvfile = NULL; char csvdelim = ','; int embedded = 0; char *envarea = NULL; int do_normal = 1; int do_nongreen = 1; /* Setup standard header+footer (might be modified by option pageset) */ select_headers_and_footers("std"); xymon_color = nongreen_color = critical_color = -1; pagedir = NULL; init_timestamp(); fqdn = get_fqdn(); /* Setup values from env. vars that may be overridden via command-line options */ if (xgetenv("XYMONPAGECOLREPEAT")) { int i = atoi(xgetenv("XYMONPAGECOLREPEAT")); if (i > 0) maxrowsbeforeheading = i; } for (i = 1; (i < argc); i++) { if ( (strcmp(argv[i], "--hobbitd") == 0) || (argnmatch(argv[i], "--purplelifetime=")) || (strcmp(argv[i], "--nopurple") == 0) ) { /* Deprecated */ } else if (argnmatch(argv[i], "--env=")) { char *lp = strchr(argv[i], '='); loadenv(lp+1, envarea); } else if (argnmatch(argv[i], "--area=")) { char *lp = strchr(argv[i], '='); envarea = strdup(lp+1); } else if (argnmatch(argv[i], "--ignorecolumns=")) { char *lp = strchr(argv[i], '='); ignorecolumns = (char *) malloc(strlen(lp)+2); sprintf(ignorecolumns, ",%s,", (lp+1)); } else if (strcmp(argv[i], "--showemptygroups") == 0) { showemptygroups = 1; } else if (strcmp(argv[i], "--no-showemptygroups") == 0) { showemptygroups = 0; } else if (argnmatch(argv[i], "--critical-reds-only") || argnmatch(argv[i], "--nk-reds-only")) { critonlyreds = 1; } else if (argnmatch(argv[i], "--nongreen-ignorecolumns=") || argnmatch(argv[i], "--bb2-ignorecolumns=")) { char *lp = strchr(argv[i], '='); nongreenignorecolumns = (char *) malloc(strlen(lp)+2); sprintf(nongreenignorecolumns, ",%s,", (lp+1)); } else if (argnmatch(argv[i], "--nongreen-colors=") || argnmatch(argv[i], "--bb2-colors=")) { char *lp = strchr(argv[i], '=') + 1; nongreencolors = colorset(lp, (1 << COL_GREEN)); } else if (argnmatch(argv[i], "--nongreen-ignorepurples") || argnmatch(argv[i], "--bb2-ignorepurples")) { nongreencolors = (nongreencolors & ~(1 << COL_PURPLE)); } else if (argnmatch(argv[i], "--nongreen-ignoredialups") || argnmatch(argv[i], "--bb2-ignoredialups")) { nongreennodialups = 1; } else if (argnmatch(argv[i], "--includecolumns=")) { char *lp = strchr(argv[i], '='); includecolumns = (char *) malloc(strlen(lp)+2); sprintf(includecolumns, ",%s,", (lp+1)); } else if (argnmatch(argv[i], "--eventignore=")) { char *lp = strchr(argv[i], '='); eventignorecolumns = (char *) malloc(strlen(lp)+2); sprintf(eventignorecolumns, ",%s,", (lp+1)); } else if (argnmatch(argv[i], "--doccgi=")) { char *lp = strchr(argv[i], '='); char *url = (char *)malloc(strlen(xgetenv("CGIBINURL"))+strlen(lp+1)+2); sprintf(url, "%s/%s", xgetenv("CGIBINURL"), lp+1); setdocurl(url); xfree(url); } else if (argnmatch(argv[i], "--docurl=")) { char *lp = strchr(argv[i], '='); setdocurl(lp+1); } else if (argnmatch(argv[i], "--no-doc-window")) { /* This is a no-op now */ } else if (argnmatch(argv[i], "--doc-window")) { setdoctarget("TARGET=\"_blank\""); } else if (argnmatch(argv[i], "--htmlextension=")) { char *lp = strchr(argv[i], '='); htmlextension = strdup(lp+1); } else if (argnmatch(argv[i], "--htaccess")) { char *lp = strchr(argv[i], '='); if (lp) htaccess = strdup(lp+1); else htaccess = ".htaccess"; } else if ((strcmp(argv[i], "--wml") == 0) || argnmatch(argv[i], "--wml=")) { char *lp = strchr(argv[i], '='); if (lp) { wapcolumns = (char *) malloc(strlen(lp)+2); sprintf(wapcolumns, ",%s,", (lp+1)); } enable_wmlgen = 1; } else if (argnmatch(argv[i], "--nstab=")) { char *lp = strchr(argv[i], '='); if (strlen(lp+1) > 0) { nssidebarfilename = strdup(lp+1); } else errprintf("--nstab requires a filename\n"); } else if (argnmatch(argv[i], "--nslimit=")) { char *lp = strchr(argv[i], '='); nssidebarcolorlimit = parse_color(lp+1); } else if (argnmatch(argv[i], "--rssversion=")) { char *lp = strchr(argv[i], '='); rssversion = strdup(lp+1); } else if (argnmatch(argv[i], "--rsslimit=")) { char *lp = strchr(argv[i], '='); rsscolorlimit = parse_color(lp+1); } else if (argnmatch(argv[i], "--rss")) { wantrss = 1; } else if (argnmatch(argv[i], "--rssextension=")) { char *lp = strchr(argv[i], '='); rssextension = strdup(lp+1); } else if (argnmatch(argv[i], "--reportopts=")) { char style[MAX_LINE_LEN]; unsigned int rstart, rend; int count = sscanf(argv[i], "--reportopts=%u:%u:%d:%s", &rstart, &rend, &dynamicreport, style); reportstart = rstart; reportend = rend; if (count < 2) { errprintf("Invalid --reportopts option: Must have start- and end-times\n"); return 1; } if (count < 3) dynamicreport = 1; if (count == 4) { if (strcmp(style, stylenames[STYLE_CRIT]) == 0) reportstyle = STYLE_CRIT; else if (strcmp(style, stylenames[STYLE_NONGR]) == 0) reportstyle = STYLE_NONGR; else reportstyle = STYLE_OTHER; } if (reportstart < 788918400) reportstart = 788918400; if (reportend > getcurrenttime(NULL)) reportend = getcurrenttime(NULL); if (xgetenv("XYMONREPWARN")) reportwarnlevel = atof(xgetenv("XYMONREPWARN")); if (xgetenv("XYMONREPGREEN")) reportgreenlevel = atof(xgetenv("XYMONREPGREEN")); if ((reportwarnlevel < 0.0) || (reportwarnlevel > 100.0)) reportwarnlevel = 97.0; if ((reportgreenlevel < 0.0) || (reportgreenlevel > 100.0)) reportgreenlevel = 99.995; select_headers_and_footers("rep"); sethostenv_report(reportstart, reportend, reportwarnlevel, reportgreenlevel); } else if (argnmatch(argv[i], "--csv=")) { char *lp = strchr(argv[i], '='); csvfile = strdup(lp+1); } else if (argnmatch(argv[i], "--csvdelim=")) { char *lp = strchr(argv[i], '='); csvdelim = *(lp+1); } else if (argnmatch(argv[i], "--snapshot=")) { char *lp = strchr(argv[i], '='); snapshot = atol(lp+1); select_headers_and_footers("snap"); sethostenv_snapshot(snapshot); } else if (strcmp(argv[i], "--pages-first") == 0) { hostsbeforepages = 0; } else if (strcmp(argv[i], "--pages-last") == 0) { hostsbeforepages = 1; } else if (argnmatch(argv[i], "--subpagecolumns=")) { char *lp = strchr(argv[i], '='); subpagecolumns = atoi(lp+1); if (subpagecolumns < 1) subpagecolumns=1; } else if (argnmatch(argv[i], "--maxrows=")) { char *lp = strchr(argv[i], '='); maxrowsbeforeheading = atoi(lp+1); if (maxrowsbeforeheading < 0) maxrowsbeforeheading=0; } else if (strcmp(argv[i], "--recentgifs") == 0) { use_recentgifs = 1; } else if (argnmatch(argv[i], "--recentgifs=")) { char *lp = strchr(argv[i], '='); use_recentgifs = 1; recentgif_limit = 60*durationvalue(lp+1); } else if (strcmp(argv[i], "--sort-group-only-items") == 0) { sort_grouponly_items = 1; } else if (argnmatch(argv[i], "--page-title=")) { char *lp = strchr(argv[i], '='); defaultpagetitle = strdup(lp+1); } else if (argnmatch(argv[i], "--dialupskin=")) { char *lp = strchr(argv[i], '='); dialupskin = strdup(lp+1); } else if (argnmatch(argv[i], "--reverseskin=")) { char *lp = strchr(argv[i], '='); reverseskin = strdup(lp+1); } else if (strcmp(argv[i], "--pagetitle-links") == 0) { pagetitlelinks = 1; } else if (strcmp(argv[i], "--pagetext-headings") == 0) { pagetextheadings = 1; } else if (strcmp(argv[i], "--underline-headings") == 0) { underlineheadings = 1; } else if (strcmp(argv[i], "--no-underline-headings") == 0) { underlineheadings = 0; } else if (strcmp(argv[i], "--no-eventlog") == 0) { nongreeneventlog = 0; } else if (argnmatch(argv[i], "--max-eventcount=")) { char *lp = strchr(argv[i], '='); nongreeneventlogmaxcount = atoi(lp+1); } else if (argnmatch(argv[i], "--max-eventtime=")) { char *lp = strchr(argv[i], '='); nongreeneventlogmaxtime = atoi(lp+1); } else if (argnmatch(argv[i], "--max-ackcount=")) { char *lp = strchr(argv[i], '='); nongreenacklogmaxcount = atoi(lp+1); } else if (argnmatch(argv[i], "--max-acktime=")) { char *lp = strchr(argv[i], '='); nongreenacklogmaxtime = atoi(lp+1); } else if (strcmp(argv[i], "--no-acklog") == 0) { nongreenacklog = 0; } else if (strcmp(argv[i], "--no-pages") == 0) { do_normal = 0; } else if ((strcmp(argv[i], "--no-nongreen") == 0) || (strcmp(argv[i], "--no-bb2") == 0)) { do_nongreen = 0; } else if (argnmatch(argv[i], "--noprop=")) { char *lp = strchr(argv[i], '='); nopropyellowdefault = (char *) malloc(strlen(lp)+2); sprintf(nopropyellowdefault, ",%s,", (lp+1)); errprintf("--noprop is deprecated - use --nopropyellow instead\n"); } else if (argnmatch(argv[i], "--nopropyellow=")) { char *lp = strchr(argv[i], '='); nopropyellowdefault = (char *) malloc(strlen(lp)+2); sprintf(nopropyellowdefault, ",%s,", (lp+1)); } else if (argnmatch(argv[i], "--nopropred=")) { char *lp = strchr(argv[i], '='); nopropreddefault = (char *) malloc(strlen(lp)+2); sprintf(nopropreddefault, ",%s,", (lp+1)); } else if (argnmatch(argv[i], "--noproppurple=")) { char *lp = strchr(argv[i], '='); noproppurpledefault = (char *) malloc(strlen(lp)+2); sprintf(noproppurpledefault, ",%s,", (lp+1)); } else if (argnmatch(argv[i], "--nopropack=")) { char *lp = strchr(argv[i], '='); nopropackdefault = (char *) malloc(strlen(lp)+2); sprintf(nopropackdefault, ",%s,", (lp+1)); } else if (strcmp(argv[i], "--bbpageONLY") == 0) { /* Deprecated */ errprintf("--bbpageONLY is deprecated - use --pageset=NAME to generate pagesets\n"); } else if (strcmp(argv[i], "--embedded") == 0) { embedded = 1; } else if (argnmatch(argv[i], "--pageset=")) { char *lp = strchr(argv[i], '='); pageset = strdup(lp+1); } else if (argnmatch(argv[i], "--template=")) { char *lp = strchr(argv[i], '='); lp++; select_headers_and_footers(lp); } else if (argnmatch(argv[i], "--tooltips=")) { char *lp = strchr(argv[i], '='); lp++; if (strcmp(lp, "always") == 0) tooltipuse = TT_ALWAYS; else if (strcmp(lp, "never") == 0) tooltipuse = TT_NEVER; else tooltipuse = TT_STDONLY; } else if (argnmatch(argv[i], "--purplelog=")) { char *lp = strchr(argv[i], '='); if (*(lp+1) == '/') purplelogfn = strdup(lp+1); else { purplelogfn = (char *) malloc(strlen(xgetenv("XYMONHOME"))+1+strlen(lp+1)+1); sprintf(purplelogfn, "%s/%s", xgetenv("XYMONHOME"), (lp+1)); } } else if (argnmatch(argv[i], "--report=") || (strcmp(argv[i], "--report") == 0)) { char *lp = strchr(argv[i], '='); if (lp) { egocolumn = strdup(lp+1); } else egocolumn = "xymongen"; timing = 1; } else if ( argnmatch(argv[i], "--criticallog=") || (strcmp(argv[i], "--criticallog") == 0) || argnmatch(argv[i], "--nklog=") || (strcmp(argv[i], "--nklog") == 0) ){ char *lp = strchr(argv[i], '='); if (lp) { logcritstatus = strdup(lp+1); } else logcritstatus = "critical"; } else if (strcmp(argv[i], "--timing") == 0) { timing = 1; } else if (strcmp(argv[i], "--debug") == 0) { debug = 1; } else if (strcmp(argv[i], "--no-update") == 0) { dontsendmessages = 1; } else if (strcmp(argv[i], "--loadhostsfromxymond") == 0) { loadhostsfromxymond = 1; } else if (strcmp(argv[i], "--version") == 0) { printf("xymongen version %s\n", VERSION); printf("\n"); exit(0); } else if ((strcmp(argv[i], "--help") == 0) || (strcmp(argv[i], "-?") == 0)) { printf("xymongen for Xymon version %s\n\n", VERSION); printf("Usage: %s [options] [WebpageDirectory]\n", argv[0]); printf("Options:\n"); printf(" --ignorecolumns=test[,test] : Completely ignore these columns\n"); printf(" --critical-reds-only : Only show red statuses on the Critical page\n"); printf(" --nongreen-ignorecolumns=test[,test]: Ignore these columns for the non-green page\n"); printf(" --nongreen-ignorepurples : Ignore all-purple hosts on non-green page\n"); printf(" --includecolumns=test[,test]: Always include these columns on non-green page\n"); printf(" --max-eventcount=N : Max number of events to include in eventlog\n"); printf(" --max-eventtime=N : Show events that occurred within the last N minutes\n"); printf(" --eventignore=test[,test] : Columns to ignore in non-green event-log display\n"); printf(" --no-eventlog : Do not generate the non-green eventlog display\n"); printf(" --no-acklog : Do not generate the non-green ack-log display\n"); printf(" --no-pages : Generate only the nongreen and critical pages\n"); printf(" --docurl=documentation-URL : Hostnames link to a general (dynamic) web page for docs\n"); printf(" --doc-window : Open doc-links in a new browser window\n"); printf(" --htmlextension=.EXT : Sets filename extension for generated file (default: .html\n"); printf(" --report[=COLUMNNAME] : Send a status report about the running of xymongen\n"); printf(" --reportopts=ST:END:DYN:STL : Run in Xymon Reporting mode\n"); printf(" --csv=FILENAME : For Xymon Reporting, output CSV file\n"); printf(" --csvdelim=CHARACTER : Delimiter in CSV file output (default: comma)\n"); printf(" --snapshot=TIME : Snapshot mode\n"); printf("\nPage layout options:\n"); printf(" --pages-first : Put page- and subpage-links before hosts (default)\n"); printf(" --pages-last : Put page- and subpage-links after hosts\n"); printf(" --subpagecolumns=N : Number of columns for links to pages and subpages\n"); printf(" --maxrows=N : Repeat column headings for every N hosts shown\n"); printf(" --no-showemptygroups : Do not show groups without test results for the listed hosts\n"); printf(" --recentgifs : Use xxx-recent.gif icons for newly changed tests\n"); printf(" --sort-group-only-items : Display group-only items in alphabetical order\n"); printf(" --page-title=TITLE : Set a default page title for all pages\n"); printf(" --dialupskin=URL : Use a different icon skin for dialup tests\n"); printf(" --reverseskin=URL : Use a different icon skin for reverse tests\n"); printf(" --pagetitle-links : Make page- and subpage-titles act as links\n"); printf(" --pagetext-headings : Use page texts as headings\n"); printf(" --no-underline-headings : Do not underline the page headings\n"); printf("\nStatus propagation control options:\n"); printf(" --noprop=test[,test] : Disable upwards status propagation when YELLOW\n"); printf(" --nopropred=test[,test] : Disable upwards status propagation when RED or YELLOW\n"); printf(" --noproppurple=test[,test] : Disable upwards status propagation when PURPLE\n"); printf("\nAlternate pageset generation support:\n"); printf(" --pageset=SETNAME : Generate non-standard pageset with tag SETNAME\n"); printf(" --template=TEMPLATE : template for header and footer files\n"); printf("\nAlternate output formats:\n"); printf(" --wml[=test1,test2,...] : Generate a small (All nongreen-style) WML page\n"); printf(" --nstab=FILENAME : Generate a Netscape Sidebar feed\n"); printf(" --nslimit=COLOR : Minimum color to include on Netscape sidebar\n"); printf(" --rss : Generate a RSS/RDF feed of alerts\n"); printf(" --rssextension=.EXT : Sets filename extension for RSS files (default: .rss\n"); printf(" --rssversion={0.91|0.92|1.0|2.0} : Specify RSS/RDF version (default: 0.91)\n"); printf(" --rsslimit=COLOR : Minimum color to include on RSS feed\n"); printf("\nDebugging/troubleshooting options:\n"); printf(" --timing : Collect timing information\n"); printf(" --debug : Debugging information\n"); printf(" --version : Show version information\n"); printf(" --purplelog=FILENAME : Create a log of purple hosts and tests\n"); exit(0); } else if (argnmatch(argv[i], "-")) { errprintf("Unknown option : %s\n", argv[i]); } else { /* Last argument is pagedir */ pagedir = strdup(argv[i]); } } /* In case they changed the name of our column ... */ if (egocolumn) setup_signalhandler(egocolumn); if (debug) { int i; printf("Command: xymongen"); for (i=1; (inext) { if (p->color > pagehead->color) pagehead->color = p->color; } xymon_color = pagehead->color; if (xgetenv("SUMMARY_SET_BKG") && (strcmp(xgetenv("SUMMARY_SET_BKG"), "TRUE") == 0)) { /* * Displayed summaries affect the Xymon page only, * but should not go into the color we report to * others. */ for (s=dispsums; (s); s = s->next) { if (s->color > pagehead->color) pagehead->color = s->color; } } add_timestamp("Color calculation done"); if (debug) dumpall(pagehead); /* Generate pages */ if (chdir(pagedir) != 0) { errprintf("Cannot change to webpage directory %s\n", pagedir); exit(1); } if (embedded) { /* Just generate that one page */ do_one_page(pagehead, NULL, 1); return 0; } /* The main page - xymon.html and pages/subpages thereunder */ add_timestamp("Xymon pagegen start"); if (reportstart && csvfile) { csv_availability(csvfile, csvdelim); } if (do_normal) { do_page_with_subs(pagehead, dispsums); } add_timestamp("Xymon pagegen done"); if (reportstart) { /* Reports end here */ return 0; } /* The full summary page - nongreen.html */ if (do_nongreen) { nongreen_color = do_nongreen_page(nssidebarfilename, PAGE_NONGREEN, "nongreen"); nongreencolors = (nongreencolors & ~(1 << COL_YELLOW)); nongreencolors = (nongreencolors & ~(1 << COL_PURPLE)); nongreen_color = do_nongreen_page(nssidebarfilename, PAGE_NONGREEN, "red"); add_timestamp("Non-green page generation done"); } /* Reduced summary (alerts) page - critical.html */ critical_color = do_nongreen_page(NULL, PAGE_CRITICAL, "critical"); add_timestamp("Critical page generation done"); if (snapshot) { /* Snapshots end here */ return 0; } /* Send summary notices - only once, so not on pagesets */ if (pageset == NULL) { send_summaries(sumhead); add_timestamp("Summary transmission done"); } /* Generate WML cards */ if (enable_wmlgen) { do_wml_cards(pagedir); add_timestamp("WML generation done"); } /* Need to do this before sending in our report */ add_timestamp("Run completed"); /* Tell about us */ if (egocolumn) { char msgline[4096]; char *timestamps; long tasksleep = (xgetenv("TASKSLEEP") ? atol(xgetenv("TASKSLEEP")) : -1); int usebackfeedqueue, color; /* Go yellow if it runs for too long */ if ((tasksleep > 0) && (total_runtime() > tasksleep)) { errprintf("WARNING: Runtime %ld longer than TASKSLEEP (%ld)\n", total_runtime(), tasksleep); } color = (errbuf ? COL_YELLOW : COL_GREEN); usebackfeedqueue = (sendmessage_init_local() > 0); if (usebackfeedqueue) combo_start_local(); else combo_start(); init_status(color); sprintf(msgline, "status %s.%s %s %s\n\n", xgetenv("MACHINE"), egocolumn, colorname(color), timestamp); addtostatus(msgline); sprintf(msgline, "xymongen for Xymon version %s\n", VERSION); addtostatus(msgline); addtostatus("\nStatistics:\n"); sprintf(msgline, " Hosts : %5d\n", hostcount); addtostatus(msgline); sprintf(msgline, " Pages : %5d\n", pagecount); addtostatus(msgline); sprintf(msgline, " Status messages : %5d\n", statuscount); addtostatus(msgline); sprintf(msgline, " - Red : %5d (%5.2f %%)\n", colorcount[COL_RED], ((100.0 * colorcount[COL_RED]) / statuscount)); addtostatus(msgline); sprintf(msgline, " - Red (non-propagating) : %5d (%5.2f %%)\n", colorcount_noprop[COL_RED], ((100.0 * colorcount_noprop[COL_RED]) / statuscount)); addtostatus(msgline); sprintf(msgline, " - Yellow : %5d (%5.2f %%)\n", colorcount[COL_YELLOW], ((100.0 * colorcount[COL_YELLOW]) / statuscount)); addtostatus(msgline); sprintf(msgline, " - Yellow (non-propagating) : %5d (%5.2f %%)\n", colorcount_noprop[COL_YELLOW], ((100.0 * colorcount_noprop[COL_YELLOW]) / statuscount)); addtostatus(msgline); sprintf(msgline, " - Clear : %5d (%5.2f %%)\n", colorcount[COL_CLEAR], ((100.0 * colorcount[COL_CLEAR]) / statuscount)); addtostatus(msgline); sprintf(msgline, " - Green : %5d (%5.2f %%)\n", colorcount[COL_GREEN], ((100.0 * colorcount[COL_GREEN]) / statuscount)); addtostatus(msgline); sprintf(msgline, " - Purple : %5d (%5.2f %%)\n", colorcount[COL_PURPLE], ((100.0 * colorcount[COL_PURPLE]) / statuscount)); addtostatus(msgline); sprintf(msgline, " - Blue : %5d (%5.2f %%)\n", colorcount[COL_BLUE], ((100.0 * colorcount[COL_BLUE]) / statuscount)); addtostatus(msgline); if (errbuf) { addtostatus("\n\nError output:\n"); addtostatus(prehtmlquoted(errbuf)); } show_timestamps(×tamps); addtostatus(timestamps); finish_status(); combo_end(); if (usebackfeedqueue) sendmessage_finish_local(); } else show_timestamps(NULL); return 0; } xymon-4.3.28/xymongen/pagegen.c0000664000076400007640000012277512616226703016653 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon overview webpage generator tool. */ /* */ /* This file contains code to generate the HTML for the Xymon overview */ /* webpages. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: pagegen.c 7719 2015-11-03 21:57:23Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include #include #include "xymongen.h" #include "util.h" #include "loadlayout.h" #include "rssgen.h" #include "pagegen.h" int subpagecolumns = 1; int hostsbeforepages = 0; char *includecolumns = NULL; char *nongreenignorecolumns = ""; int nongreennodialups = 0; int sort_grouponly_items = 0; /* Standard Xymon behaviour: Don't sort group-only items */ char *rssextension = ".rss"; /* Filename extension for generated RSS files */ char *defaultpagetitle = NULL; int pagetitlelinks = 0; int pagetextheadings = 0; int underlineheadings = 1; int maxrowsbeforeheading = 0; int showemptygroups = 1; int nongreeneventlog = 1; int nongreenacklog = 1; int nongreeneventlogmaxcount = 100; int nongreeneventlogmaxtime = 240; int nongreenacklogmaxcount = 25; int nongreenacklogmaxtime = 240; char *logcritstatus = NULL; int critonlyreds = 0; int wantrss = 0; int nongreencolors = ((1 << COL_RED) | (1 << COL_YELLOW) | (1 << COL_PURPLE)); /* Format strings for htaccess files */ char *htaccess = NULL; char *xymonhtaccess = NULL; char *xymonpagehtaccess = NULL; char *xymonsubpagehtaccess = NULL; char *hf_prefix[3]; /* header/footer prefixes for xymon, nongreen, critical pages*/ static int hostblkidx = 0; void select_headers_and_footers(char *prefix) { hf_prefix[PAGE_NORMAL] = (char *) malloc(strlen(prefix)+10); sprintf(hf_prefix[PAGE_NORMAL], "%snormal", prefix); hf_prefix[PAGE_NONGREEN] = (char *) malloc(strlen(prefix)+10); sprintf(hf_prefix[PAGE_NONGREEN], "%snongreen", prefix); hf_prefix[PAGE_CRITICAL] = (char *) malloc(strlen(prefix)+10); sprintf(hf_prefix[PAGE_CRITICAL], "%scritical", prefix); } int interesting_column(int pagetype, int color, int alert, xymongen_col_t *column, char *onlycols, char *exceptcols) { /* * Decides if a given column is to be included on a page. */ if (pagetype == PAGE_NORMAL) { /* Fast-path the Xymon page. */ int result = 1; if (onlycols) { /* onlycols explicitly list the columns to include (for xymon.html page only) */ char *search; /* loaddata::init_group guarantees that onlycols start and end with a '|' */ search = (char *) malloc(strlen(column->name)+3); sprintf(search, "|%s|", column->name); result = (strstr(onlycols, search) != NULL); xfree(search); } if (exceptcols) { /* exceptcols explicitly list the columns to exclude (for xymon.html page only) */ char *search; /* loaddata::init_group guarantees that exceptcols start and end with a '|' */ search = (char *) malloc(strlen(column->name)+3); sprintf(search, "|%s|", column->name); result = (strstr(exceptcols, search) == NULL); xfree(search); } /* This is final. */ return result; } /* pagetype is now known NOT to be PAGE_NORMAL */ /* CLIENT, TRENDS and INFO columns are always included on non-Xymon pages */ if (strcmp(column->name, xgetenv("INFOCOLUMN")) == 0) return 1; if (strcmp(column->name, xgetenv("TRENDSCOLUMN")) == 0) return 1; if (strcmp(column->name, xgetenv("CLIENTCOLUMN")) == 0) return 1; if (includecolumns) { int result; result = (strstr(includecolumns, column->listname) != NULL); /* If included, done here. Otherwise may be included further down. */ if (result) return result; } switch (pagetype) { case PAGE_NONGREEN: /* Include all non-green tests */ if (( (1 << color) & nongreencolors ) != 0) { return (strstr(nongreenignorecolumns, column->listname) == NULL); } else return 0; case PAGE_CRITICAL: /* Include only RED or YELLOW tests with "alert" property set. * Even then, the "conn" test is included only when RED. */ if (alert) { if (color == COL_RED) return 1; if (critonlyreds) return 0; if ( (color == COL_YELLOW) || (color == COL_CLEAR) ) { if (strcmp(column->name, xgetenv("PINGCOLUMN")) == 0) return 0; if (logcritstatus && (strcmp(column->name, logcritstatus) == 0)) return 0; return 1; } } break; } return 0; } col_list_t *gen_column_list(host_t *hostlist, int pagetype, char *onlycols, char *exceptcols) { /* * Build a list of all the columns that are in use by * any host in the hostlist passed as parameter. * The column list will be sorted by column name, except * when doing a "group-only" and the standard Xymon behaviour. */ col_list_t *head; host_t *h; entry_t *e; col_list_t *newlistitem, *collist_walk; /* Code de-obfuscation trick: Add a null record as the head item */ /* Simplifies handling since head != NULL and we never have to insert at head of list */ head = (col_list_t *) calloc(1, sizeof(col_list_t)); head->column = &null_column; head->next = NULL; if (!sort_grouponly_items && (onlycols != NULL)) { /* * This is the original handling of "group-only". * All items are included, whether there are any test data * for a column or not. The order given in the group-only * directive is maintained. * We simple convert the group-only directive to a * col_list_t linked list. */ char *p1 = onlycols; char *p2; xymongen_col_t *col; collist_walk = head; do { if (*p1 == '|') p1++; p2 = strchr(p1, '|'); if (p2) { *p2 = '\0'; col = find_or_create_column(p1, 0); if (col) { newlistitem = (col_list_t *) calloc(1, sizeof(col_list_t)); newlistitem->column = col; newlistitem->next = NULL; collist_walk->next = newlistitem; collist_walk = collist_walk->next; } *p2 = '|'; } p1 = p2; } while (p1 != NULL); /* Skip the dummy record */ collist_walk = head; head = head->next; xfree(collist_walk); /* We're done - don't even look at the actual test data. */ return (head); } for (h = hostlist; (h); h = h->next) { /* * This is for everything except "standard group-only" handled above. * So also for group-only with --sort-group-only-items. * Note that in a group-only here, items may be left out if there * are no test data for a column at all. */ for (e = h->entries; (e); e = e->next) { if (!e->compacted && interesting_column(pagetype, e->color, e->alert, e->column, onlycols, exceptcols)) { /* See where e->column should go in list */ collist_walk = head; while ( (collist_walk->next && strcmp(e->column->name, ((col_list_t *)(collist_walk->next))->column->name) > 0) ) { collist_walk = collist_walk->next; } if ((collist_walk->next == NULL) || ((col_list_t *)(collist_walk->next))->column != e->column) { /* collist_walk points to the entry before the new one */ newlistitem = (col_list_t *) calloc(1, sizeof(col_list_t)); newlistitem->column = e->column; newlistitem->next = collist_walk->next; collist_walk->next = newlistitem; } } } } /* Skip the dummy record */ collist_walk = head; head = head->next; xfree(collist_walk); return (head); } void setup_htaccess(const char *pagepath) { char htaccessfn[PATH_MAX]; char htaccesscontent[1024]; if (htaccess == NULL) return; htaccesscontent[0] = '\0'; if (strlen(pagepath) == 0) { sprintf(htaccessfn, "%s", htaccess); if (xymonhtaccess) strcpy(htaccesscontent, xymonhtaccess); } else { char *pagename, *subpagename, *p; char *path = strdup(pagepath); for (p = path + strlen(path) - 1; ((p > path) && (*p == '/')); p--) *p = '\0'; sprintf(htaccessfn, "%s/%s", path, htaccess); pagename = path; if (*pagename == '/') pagename++; p = strchr(pagename, '/'); if (p) { *p = '\0'; subpagename = p+1; p = strchr(subpagename, '/'); if (p) *p = '\0'; if (xymonsubpagehtaccess) sprintf(htaccesscontent, xymonsubpagehtaccess, pagename, subpagename); } else { if (xymonpagehtaccess) sprintf(htaccesscontent, xymonpagehtaccess, pagename); } xfree(path); } if (strlen(htaccesscontent)) { FILE *fd; struct stat st; if (stat(htaccessfn, &st) == 0) { dbgprintf("htaccess file %s exists, not overwritten\n", htaccessfn); return; } fd = fopen(htaccessfn, "w"); if (fd) { fprintf(fd, "%s\n", htaccesscontent); fclose(fd); } else { errprintf("Cannot create %s: %s\n", htaccessfn, strerror(errno)); } } } static int host_t_compare(const void *v1, const void *v2) { host_t **n1 = (host_t **)v1; host_t **n2 = (host_t **)v2; return strcmp((*n1)->hostname, (*n2)->hostname); } typedef struct vprec_t { char *testname; host_t **hosts; entry_t **entries; } vprec_t; void do_vertical(host_t *head, FILE *output, char *pagepath) { /* * This routine outputs the host part of a page or a group, * but with the hosts going across the page, and the test going down. * I.e. it generates buttons and links to all the hosts for * a test, and the host docs. */ host_t *h; entry_t *e; char *xymonskin; int hostcount = 0; int width; int hidx; void *vptree; xtreePos_t handle; if (head == NULL) return; vptree = xtreeNew(strcmp); xymonskin = strdup(xgetenv("XYMONSKIN")); width = atoi(xgetenv("DOTWIDTH")); if ((width < 0) || (width > 50)) width = 16; width += 4; /* Start the table ... */ fprintf(output, "
\n"); /* output column headings */ fprintf(output, ""); for (h = head, hostcount = 0; (h); h = h->next, hostcount++) { fprintf(output, " \n", hostsvcurl(h->hostname, xgetenv("INFOCOLUMN"), 1), xgetenv("XYMONPAGECOLFONT"), h->hostname); } fprintf(output, "\n"); fprintf(output, "\n\n", hostcount); /* Create a tree indexed by the testname, and holding the show/noshow status of each test */ for (h = head, hidx = 0; (h); h = h->next, hidx++) { for (e = h->entries; (e); e = e->next) { vprec_t *itm; handle = xtreeFind(vptree, e->column->name); if (handle == xtreeEnd(vptree)) { itm = (vprec_t *)malloc(sizeof(vprec_t)); itm->testname = e->column->name; itm->hosts = (host_t **)calloc(hostcount, sizeof(host_t *)); itm->entries = (entry_t **)calloc(hostcount, sizeof(entry_t *)); xtreeAdd(vptree, itm->testname, itm); } else { itm = xtreeData(vptree, handle); } (itm->hosts)[hidx] = h; (itm->entries)[hidx] = e; } } for (handle = xtreeFirst(vptree); (handle != xtreeEnd(vptree)); handle = xtreeNext(vptree, handle)) { vprec_t *itm = xtreeData(vptree, handle); fprintf(output, ""); fprintf(output, "", itm->testname); for (hidx = 0; (hidx < hostcount); hidx++) { char *skin, *htmlalttag; host_t *h = (itm->hosts)[hidx]; entry_t *e = (itm->entries)[hidx]; fprintf(output, ""); } fprintf(output, "\n"); } fprintf(output, "
 "); fprintf(output, " %s
 
%s"); if (e == NULL) { fprintf(output, "-"); } else { if (strcmp(e->column->name, xgetenv("INFOCOLUMN")) == 0) { /* show the host ip on the hint display of the "info" column */ htmlalttag = alttag(e->column->name, COL_GREEN, 0, 1, h->ip); } else { htmlalttag = alttag(e->column->name, e->color, e->acked, e->propagate, e->age); } skin = (e->skin ? e->skin : xymonskin); fprintf(output, "", hostsvcurl(h->hostname, e->column->name, 1)); fprintf(output, "\"%s\"", skin, dotgiffilename(e->color, e->acked, e->oldage), htmlalttag, htmlalttag, xgetenv("DOTHEIGHT"), xgetenv("DOTWIDTH")); } fprintf(output, "

\n"); xfree(xymonskin); } void do_hosts(host_t *head, int sorthosts, char *onlycols, char *exceptcols, FILE *output, FILE *rssoutput, char *grouptitle, int pagetype, char *pagepath) { /* * This routine outputs the host part of a page or a group. * I.e. it generates buttons and links to all the tests for * a host, and the host docs. */ host_t *h; entry_t *e; col_list_t *groupcols, *gc; int genstatic; int columncount; char *xymonskin, *infocolumngif, *trendscolumngif, *clientcolumngif; char *safegrouptitle; int rowcount = 0; int usetooltip = 0; if (head == NULL) return; xymonskin = strdup(xgetenv("XYMONSKIN")); infocolumngif = strdup(getenv("INFOCOLUMNGIF") ? getenv("INFOCOLUMNGIF") : dotgiffilename(COL_GREEN, 0, 1)); trendscolumngif = strdup(getenv("TRENDSCOLUMNGIF") ? getenv("TRENDSCOLUMNGIF") : dotgiffilename(COL_GREEN, 0, 1)); clientcolumngif = strdup(getenv("CLIENTCOLUMNGIF") ? getenv("CLIENTCOLUMNGIF") : dotgiffilename(COL_GREEN, 0, 1)); switch (tooltipuse) { case TT_STDONLY: usetooltip = (pagetype == PAGE_NORMAL); break; case TT_ALWAYS: usetooltip = 1; break; case TT_NEVER: usetooltip = 0; break; } /* Generate static or dynamic links (from XYMONLOGSTATUS) ? */ genstatic = generate_static(); if (hostblkidx == 0) fprintf(output, " \n\n"); else fprintf(output, " \n\n", hostblkidx); hostblkidx++; if (!grouptitle) grouptitle = ""; safegrouptitle = stripnonwords(grouptitle); if (*safegrouptitle != '\0') fprintf(output, "\n\n", safegrouptitle); groupcols = gen_column_list(head, pagetype, onlycols, exceptcols); for (columncount=0, gc=groupcols; (gc); gc = gc->next, columncount++) ; if (showemptygroups || groupcols) { int width; width = atoi(xgetenv("DOTWIDTH")); if ((width < 0) || (width > 50)) width = 16; width += 4; /* Start the table ... */ fprintf(output, "
\n", safegrouptitle); /* Generate the host rows */ if (sorthosts) { int i, hcount = 0; host_t **hlist; for (h=head; (h); h=h->next) hcount++; hlist = (host_t **) calloc((hcount+1), sizeof(host_t *)); for (h=head, i=0; (h); h=h->next, i++) hlist[i] = h; qsort(hlist, hcount, sizeof(host_t *), host_t_compare); for (h=head=hlist[0], i=1; (i <= hcount); i++) { h->next = hlist[i]; h = h->next; } xfree(hlist); } for (h = head; (h); h = h->next) { /* If there is a host pretitle, show it. */ dbgprintf("Host:%s, pretitle:%s\n", h->hostname, textornull(h->pretitle)); if (h->pretitle && (pagetype == PAGE_NORMAL)) { fprintf(output, "\n", columncount+1, xgetenv("XYMONPAGETITLE"), h->pretitle); rowcount = 0; } if (rowcount == 0) { /* output group title and column headings */ fprintf(output, ""); fprintf(output, "\n", xgetenv("XYMONPAGETITLE"), grouptitle); for (gc=groupcols; (gc); gc = gc->next) { fprintf(output, " \n", columnlink(gc->column->name), xgetenv("XYMONPAGECOLFONT"), gc->column->name); } if (columncount) fprintf(output, "\n\n\n", columncount); else fprintf(output, "\n\n\n"); } fprintf(output, "\n \n"); } fprintf(output, "\n\n"); } fprintf(output, "

%s
%s
\n"); fprintf(output, " %s

 \n", h->hostname); if (maxrowsbeforeheading) rowcount = (rowcount + 1) % maxrowsbeforeheading; else rowcount++; fprintf(output, "%s", hostnamehtml(h->hostname, ((pagetype != PAGE_NORMAL) ? hostpage_link(h) : NULL), usetooltip)); /* Then the columns. */ for (gc = groupcols; (gc); gc = gc->next) { char *htmlalttag; fprintf(output, ""); /* Any column entry for this host ? */ for (e = h->entries; (e && (e->column != gc->column)); e = e->next) ; if (e == NULL) { fprintf(output, "-"); } else if (e->histlogname) { /* Snapshot points to historical logfile */ htmlalttag = alttag(e->column->name, e->color, e->acked, e->propagate, e->age); fprintf(output, "", histlogurl(h->hostname, e->column->name, 0, e->histlogname)); fprintf(output, "\"%s\"", xymonskin, dotgiffilename(e->color, 0, 1), htmlalttag, htmlalttag, xgetenv("DOTHEIGHT"), xgetenv("DOTWIDTH")); } else if (reportstart == 0) { /* Standard webpage */ char *skin; char *img = dotgiffilename(e->color, e->acked, e->oldage); if (strcmp(e->column->name, xgetenv("INFOCOLUMN")) == 0) { /* Show the host IP on the hint display of the "info" column */ htmlalttag = alttag(e->column->name, COL_GREEN, 0, 1, h->ip); img = infocolumngif; } else if (strcmp(e->column->name, xgetenv("TRENDSCOLUMN")) == 0) { htmlalttag = alttag(e->column->name, COL_GREEN, 0, 1, h->ip); img = trendscolumngif; } else if (strcmp(e->column->name, xgetenv("CLIENTCOLUMN")) == 0) { htmlalttag = alttag(e->column->name, COL_GREEN, 0, 1, h->ip); img = clientcolumngif; } else { htmlalttag = alttag(e->column->name, e->color, e->acked, e->propagate, e->age); } skin = (e->skin ? e->skin : xymonskin); if (e->sumurl) { /* A summary host. */ fprintf(output, "", e->sumurl); } else if (genstatic && strcmp(e->column->name, xgetenv("INFOCOLUMN")) && strcmp(e->column->name, xgetenv("TRENDSCOLUMN")) && strcmp(e->column->name, xgetenv("CLIENTCOLUMN"))) { /* * Don't use htmlextension here - it's for the * pages generated dynamically. * We don't do static pages for the info- and trends-columns, because * they are always generated dynamically. */ fprintf(output, "", xgetenv("XYMONWEB"), h->hostname, e->column->name); do_rss_item(rssoutput, h, e); } else { fprintf(output, "", hostsvcurl(h->hostname, e->column->name, 1)); do_rss_item(rssoutput, h, e); } fprintf(output, "\"%s\"", skin, img, htmlalttag, htmlalttag, xgetenv("DOTHEIGHT"), xgetenv("DOTWIDTH")); } else { /* Report format output */ if ((e->color == COL_GREEN) || (e->color == COL_CLEAR)) { fprintf(output, "\"%s\"", xymonskin, dotgiffilename(e->color, 0, 1), colorname(e->color), colorname(e->color), xgetenv("DOTHEIGHT"), xgetenv("DOTWIDTH")); } else { if (dynamicreport) { fprintf(output, "", replogurl(h->hostname, e->column->name, e->color, stylenames[reportstyle], use_recentgifs, e->repinfo, h->reporttime, reportend, h->reportwarnlevel)); } else { FILE *htmlrep, *textrep; char htmlrepfn[PATH_MAX]; char textrepfn[PATH_MAX]; char textrepurl[PATH_MAX]; /* File names are relative - current directory is the output dir */ /* pagepath is either empty, or it ends with a '/' */ sprintf(htmlrepfn, "%s%s-%s%s", pagepath, h->hostname, e->column->name, htmlextension); sprintf(textrepfn, "%savail-%s-%s.txt", pagepath, h->hostname, e->column->name); sprintf(textrepurl, "%s/%s", xgetenv("XYMONWEB"), textrepfn); htmlrep = fopen(htmlrepfn, "w"); if (!htmlrep) { errprintf("Cannot create output file %s: %s\n", htmlrepfn, strerror(errno)); } textrep = fopen(textrepfn, "w"); if (!textrep) { errprintf("Cannot create output file %s: %s\n", textrepfn, strerror(errno)); } if (textrep && htmlrep) { /* Pre-build the test-specific report */ restore_replogs(e->causes); generate_replog(htmlrep, textrep, textrepurl, h->hostname, e->column->name, e->color, reportstyle, h->ip, h->displayname, reportstart, reportend, reportwarnlevel, reportgreenlevel, reportwarnstops, e->repinfo); fclose(textrep); fclose(htmlrep); } fprintf(output, "\n", h->hostname, e->column->name, htmlextension); } /* Only show #stops if we have this as an SLA parameter */ if (h->reportwarnstops >= 0) { fprintf(output, "%.2f (%d)\n", colorname(e->color), e->repinfo->reportavailability, e->repinfo->reportstops); } else { fprintf(output, "%.2f\n", colorname(e->color), e->repinfo->reportavailability); } } } fprintf(output, "

\n"); } /* Free the columnlist allocated by gen_column_list() */ while (groupcols) { gc = groupcols; groupcols = groupcols->next; xfree(gc); } xfree(xymonskin); xfree(infocolumngif); xfree(trendscolumngif); } void do_groups(group_t *head, FILE *output, FILE *rssoutput, char *pagepath) { /* * This routine generates all the groups on a given page. * It also triggers generating host output for hosts * within the groups. */ group_t *g; if (head == NULL) return; fprintf(output, "
\n\n \n"); for (g = head; (g); g = g->next) { if (g->hosts && g->pretitle) { fprintf(output, "
\n"); fprintf(output, " \n", xgetenv("XYMONPAGETITLE"), g->pretitle); if (underlineheadings) fprintf(output, " \n"); fprintf(output, "
%s

\n"); } do_hosts(g->hosts, g->sorthosts, g->onlycols, g->exceptcols, output, rssoutput, g->title, PAGE_NORMAL, pagepath); } fprintf(output, "\n
\n"); } void do_summaries(dispsummary_t *sums, FILE *output) { /* * Generates output for summary statuses received from others. */ dispsummary_t *s; host_t *sumhosts = NULL; host_t *walk; if (sums == NULL) { /* No summary items */ return; } for (s=sums; (s); s = s->next) { /* Generate host records out of all unique s->row values */ host_t *newhost; entry_t *newentry; dispsummary_t *s2; /* Do we already have it ? */ for (newhost = sumhosts; (newhost && (strcmp(s->row, newhost->hostname) != 0) ); newhost = newhost->next); if (newhost == NULL) { /* New summary "host" */ newhost = init_host(s->row, 1, NULL, NULL, NULL, NULL, 0,0,0,0, 0, 0.0, 0, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL); /* Insert into sorted host list */ if ((!sumhosts) || (strcmp(newhost->hostname, sumhosts->hostname) < 0)) { /* Empty list, or new entry goes before list head item */ newhost->next = sumhosts; sumhosts = newhost; } else { /* Walk list until we find element that goes after new item */ for (walk = sumhosts; (walk->next && (strcmp(newhost->hostname, ((host_t *)walk->next)->hostname) > 0)); walk = walk->next) ; /* "walk" points to element before the new item */ newhost->next = walk->next; walk->next = newhost; } /* Setup the "event" records from the column records */ for (s2 = sums; (s2); s2 = s2->next) { if (strcmp(s2->row, s->row) == 0) { newentry = (entry_t *) calloc(1, sizeof(entry_t)); newentry->column = find_or_create_column(s2->column, 1); newentry->color = s2->color; strcpy(newentry->age, ""); newentry->oldage = 1; /* Use standard gifs */ newentry->propagate = 1; newentry->sumurl = s2->url; newentry->next = newhost->entries; newhost->entries = newentry; } } } } fprintf(output, " \n"); fprintf(output, "
\n"); fprintf(output, "\n"); fprintf(output, "\n"); fprintf(output, "
\n"); do_hosts(sumhosts, 1, NULL, NULL, output, NULL, xgetenv("XYMONPAGEREMOTE"), 0, NULL); fprintf(output, "
\n"); fprintf(output, "
\n"); } void do_page_subpages(FILE *output, xymongen_page_t *subs, char *pagepath) { /* * This routine does NOT generate subpages! * Instead, it generates the LINKS to the subpages below any given page. */ xymongen_page_t *p; int currentcolumn; char pagelink[PATH_MAX]; char *linkurl; if (subs) { fprintf(output, " \n"); fprintf(output, "
\n
\n"); fprintf(output, "\n"); currentcolumn = 0; for (p = subs; (p); p = p->next) { if (p->pretitle) { /* * Output a page-link title text. */ if (currentcolumn != 0) { fprintf(output, "\n"); currentcolumn = 0; } fprintf(output, "\n"); fprintf(output, "\n"); } if (currentcolumn == 0) fprintf(output, "\n"); sprintf(pagelink, "%s/%s/%s/%s%s", xgetenv("XYMONWEB"), pagepath, p->name, p->name, htmlextension); linkurl = hostlink(p->name); fprintf(output, "\n"); fprintf(output, "\n"); if (currentcolumn == (subpagecolumns-1)) { fprintf(output, "\n"); currentcolumn = 0; } else { /* Need to have a little space between columns */ fprintf(output, "", xgetenv("DOTWIDTH")); currentcolumn++; } } if (currentcolumn != 0) fprintf(output, "\n"); fprintf(output, "
\n\n", (2*subpagecolumns + (subpagecolumns - 1)), xgetenv("XYMONPAGETITLE")); fprintf(output, "
%s\n", p->pretitle); fprintf(output, "
", (2*subpagecolumns + (subpagecolumns - 1))); if (underlineheadings) { fprintf(output, "
"); } else { fprintf(output, " "); } fprintf(output, "
", xgetenv("XYMONPAGEROWFONT")); if (linkurl) { fprintf(output, "%s", linkurl, p->title); } else if (pagetitlelinks) { fprintf(output, "%s", cleanurl(pagelink), p->title); } else { fprintf(output, "%s", p->title); } fprintf(output, "
", cleanurl(pagelink)); fprintf(output, "\"%s\"", xgetenv("XYMONSKIN"), dotgiffilename(p->color, 0, ((reportstart > 0) ? 1 : p->oldage)), xgetenv("DOTWIDTH"), xgetenv("DOTHEIGHT"), colorname(p->color), colorname(p->color)); fprintf(output, "
 

\n"); fprintf(output, "
\n"); } } void do_one_page(xymongen_page_t *page, dispsummary_t *sums, int embedded) { FILE *output = NULL; FILE *rssoutput = NULL; char pagepath[PATH_MAX]; char filename[PATH_MAX]; char tmpfilename[PATH_MAX]; char rssfilename[PATH_MAX]; char tmprssfilename[PATH_MAX]; char curdir[PATH_MAX]; char *dirdelim; char *localtext; if (!getcwd(curdir, sizeof(curdir))) { errprintf("Cannot get current directory: %s\n", strerror(errno)); return; } localtext = strdup(xgetenv((page->parent ? "XYMONPAGESUBLOCAL" : "XYMONPAGELOCAL"))); pagepath[0] = '\0'; if (embedded) { output = stdout; } else { if (page->parent == NULL) { char indexfilename[PATH_MAX]; /* top level page */ sprintf(filename, "xymon%s", htmlextension); sprintf(rssfilename, "xymon%s", rssextension); sprintf(indexfilename, "index%s", htmlextension); unlink(indexfilename); if (symlink(filename, indexfilename)) { dbgprintf("Symlinking %s -> %s\n", filename, indexfilename); } } else { char tmppath[PATH_MAX]; xymongen_page_t *pgwalk; for (pgwalk = page; (pgwalk); pgwalk = pgwalk->parent) { if (strlen(pgwalk->name)) { sprintf(tmppath, "%s/%s/", pgwalk->name, pagepath); strcpy(pagepath, tmppath); } } sprintf(filename, "%s/%s%s", pagepath, page->name, htmlextension); sprintf(rssfilename, "%s/%s%s", pagepath, page->name, rssextension); } sprintf(tmpfilename, "%s.tmp", filename); sprintf(tmprssfilename, "%s.tmp", rssfilename); /* Try creating the output file. If it fails, we may need to create the directories */ hostblkidx = 0; output = fopen(tmpfilename, "w"); if (output == NULL) { char indexfilename[PATH_MAX]; char pagebasename[PATH_MAX]; char *p; int res; /* Make sure the directories exist. */ dirdelim = tmpfilename; while ((dirdelim = strchr(dirdelim, '/')) != NULL) { *dirdelim = '\0'; if ((mkdir(tmpfilename, 0755) == -1) && (errno != EEXIST)) { errprintf("Cannot create directory %s (in %s): %s\n", tmpfilename, curdir, strerror(errno)); } *dirdelim = '/'; dirdelim++; } /* We've created the directories. Now retry creating the file. */ output = fopen(tmpfilename, "w"); if (output == NULL) { errprintf("Cannot create file %s (in %s): %s\n", tmpfilename, curdir, strerror(errno)); return; } /* * We had to create the directory. Set up an index.html file for * the directory where we created our new file. */ strcpy(indexfilename, filename); p = strrchr(indexfilename, '/'); if (p) p++; else p = indexfilename; sprintf(p, "index%s", htmlextension); sprintf(pagebasename, "%s%s", page->name, htmlextension); if ((symlink(pagebasename, indexfilename) == -1) && ((res = errno) != EEXIST)) { errprintf("Cannot create symlink %s->%s (in %s): %s\n", indexfilename, pagebasename, curdir, strerror(res)); } if (output == NULL) { return; } } if (wantrss) { /* Just create the RSS files - all the directory stuff is done */ rssoutput = fopen(tmprssfilename, "w"); if (rssoutput == NULL) { errprintf("Cannot open RSS file %s: %s\n", tmprssfilename, strerror(errno)); } } } setup_htaccess(pagepath); headfoot(output, hf_prefix[PAGE_NORMAL], pagepath, "header", page->color); do_rss_header(rssoutput); if (pagetextheadings && page->title && strlen(page->title)) { fprintf(output, "
\n"); fprintf(output, " \n", xgetenv("XYMONPAGETITLE"), page->title); if (underlineheadings) fprintf(output, " \n"); fprintf(output, "
%s

\n"); } else if (page->subpages) { /* If first page does not have a pretitle, use the default ones */ if (page->subpages->pretitle == NULL) { page->subpages->pretitle = (defaultpagetitle ? defaultpagetitle : localtext); } } if (!embedded && !hostsbeforepages && page->subpages) do_page_subpages(output, page->subpages, pagepath); if (page->vertical) { do_vertical(page->hosts, output, pagepath); } else { do_hosts(page->hosts, 0, NULL, NULL, output, rssoutput, "", PAGE_NORMAL, pagepath); do_groups(page->groups, output, rssoutput, pagepath); } if (!embedded && hostsbeforepages && page->subpages) do_page_subpages(output, page->subpages, pagepath); /* Summaries on main page only */ if (!embedded && (page->parent == NULL)) { do_summaries(dispsums, output); } /* Extension scripts */ do_extensions(output, "XYMONSTDEXT", "mkbb"); headfoot(output, hf_prefix[PAGE_NORMAL], pagepath, "footer", page->color); do_rss_footer(rssoutput); if (!embedded) { fclose(output); if (rename(tmpfilename, filename)) { errprintf("Cannot rename %s to %s - error %d\n", tmpfilename, filename, errno); } if (rssoutput) { fclose(rssoutput); if (rename(tmprssfilename, rssfilename)) { errprintf("Cannot rename %s to %s - error %d\n", tmprssfilename, rssfilename, errno); } } } xfree(localtext); } void do_page_with_subs(xymongen_page_t *curpage, dispsummary_t *sums) { xymongen_page_t *levelpage; for (levelpage = curpage; (levelpage); levelpage = levelpage->next) { do_one_page(levelpage, sums, 0); do_page_with_subs(levelpage->subpages, NULL); } } static void do_nongreenext(FILE *output, char *extenv, char *family) { /* * Do the non-green page extensions. Since we have built-in * support for eventlog.sh and acklog.sh, we cannot * use the standard do_extensions() routine. */ char *extensions, *p; FILE *inpipe; char extfn[PATH_MAX]; char buf[4096]; p = xgetenv(extenv); if (p == NULL) { /* No extension */ return; } extensions = strdup(p); p = strtok(extensions, "\t "); while (p) { /* Don't redo the eventlog or acklog things */ if (strcmp(p, "eventlog.sh") == 0) { if (nongreeneventlog && !havedoneeventlog) { do_eventlog(output, nongreeneventlogmaxcount, nongreeneventlogmaxtime, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, nongreennodialups, host_exists, NULL, NULL, NULL, XYMON_COUNT_NONE, XYMON_S_NONE, NULL); } } else if (strcmp(p, "acklog.sh") == 0) { if (nongreenacklog && !havedoneacklog) do_acklog(output, nongreenacklogmaxcount, nongreenacklogmaxtime); } else if (strcmp(p, "summaries") == 0) { do_summaries(dispsums, output); } else { sprintf(extfn, "%s/ext/%s/%s", xgetenv("XYMONHOME"), family, p); inpipe = popen(extfn, "r"); if (inpipe) { while (fgets(buf, sizeof(buf), inpipe)) fputs(buf, output); pclose(inpipe); } } p = strtok(NULL, "\t "); } xfree(extensions); } int do_nongreen_page(char *nssidebarfilename, int summarytype, char *filenamebase) { xymongen_page_t nongreenpage; FILE *output = NULL; FILE *rssoutput = NULL; char filename[PATH_MAX]; char tmpfilename[PATH_MAX]; char rssfilename[PATH_MAX]; char tmprssfilename[PATH_MAX]; hostlist_t *h; /* Build a "page" with the hosts that should be included in nongreen page */ nongreenpage.name = nongreenpage.title = ""; nongreenpage.color = COL_GREEN; nongreenpage.subpages = NULL; nongreenpage.groups = NULL; nongreenpage.hosts = NULL; nongreenpage.next = NULL; for (h=hostlistBegin(); (h); h=hostlistNext()) { entry_t *e; int useit = 0; /* * Why don't we use the interesting_column() routine here ? * * Well, because what we are interested in for now is * to determine if this HOST should be included on the page. * * We don't care if individual COLUMNS are included if the * host shows up - some columns are always included, e.g. * the info- and trends-columns, but we don't want that to * trigger a host being on the nongreen page! */ switch (summarytype) { case PAGE_NONGREEN: /* Normal non-green page */ if (h->hostentry->nonongreen || (nongreennodialups && h->hostentry->dialup)) useit = 0; else useit = (( (1 << h->hostentry->nongreencolor) & nongreencolors ) != 0); break; case PAGE_CRITICAL: /* The Critical page */ for (useit=0, e=h->hostentry->entries; (e && !useit); e=e->next) { if (e->alert && !e->acked) { if (e->color == COL_RED) { useit = 1; } else { if (!critonlyreds) { useit = ((e->color == COL_YELLOW) && (strcmp(e->column->name, xgetenv("PINGCOLUMN")) != 0)); } } } } break; } if (useit) { host_t *newhost, *walk; switch (summarytype) { case PAGE_NONGREEN: if (h->hostentry->nongreencolor > nongreenpage.color) nongreenpage.color = h->hostentry->nongreencolor; break; case PAGE_CRITICAL: if (h->hostentry->criticalcolor > nongreenpage.color) nongreenpage.color = h->hostentry->criticalcolor; break; } /* We need to create a copy of the original record, */ /* as we will diddle with the pointers */ newhost = (host_t *) calloc(1, sizeof(host_t)); memcpy(newhost, h->hostentry, sizeof(host_t)); newhost->next = NULL; /* Insert into sorted host list */ if ((!nongreenpage.hosts) || (strcmp(newhost->hostname, nongreenpage.hosts->hostname) < 0)) { /* Empty list, or new entry goes before list head item */ newhost->next = nongreenpage.hosts; nongreenpage.hosts = newhost; } else { /* Walk list until we find element that goes after new item */ for (walk = nongreenpage.hosts; (walk->next && (strcmp(newhost->hostname, ((host_t *)walk->next)->hostname) > 0)); walk = walk->next) ; /* "walk" points to element before the new item. * * Check for duplicate hosts. We can have a host on two normal Xymon * pages, but in the non-green page we want it only once. */ if (strcmp(walk->hostname, newhost->hostname) == 0) { /* Duplicate at start of list */ xfree(newhost); } else if (walk->next && (strcmp(((host_t *)walk->next)->hostname, newhost->hostname) == 0)) { /* Duplicate inside list */ xfree(newhost); } else { /* New host */ newhost->next = walk->next; walk->next = newhost; } } } } switch (summarytype) { case PAGE_NONGREEN: sprintf(filename, "%s%s", filenamebase, htmlextension); sprintf(rssfilename, "%s%s", filenamebase, rssextension); break; case PAGE_CRITICAL: sprintf(filename, "%s%s", filenamebase, htmlextension); sprintf(rssfilename, "%s%s", filenamebase, rssextension); break; } sprintf(tmpfilename, "%s.tmp", filename); output = fopen(tmpfilename, "w"); if (output == NULL) { errprintf("Cannot create file %s: %s\n", tmpfilename, strerror(errno)); return nongreenpage.color; } if (wantrss) { sprintf(tmprssfilename, "%s.tmp", rssfilename); rssoutput = fopen(tmprssfilename, "w"); if (rssoutput == NULL) { errprintf("Cannot create RSS file %s: %s\n", tmpfilename, strerror(errno)); return nongreenpage.color; } } headfoot(output, hf_prefix[summarytype], "", "header", nongreenpage.color); do_rss_header(rssoutput); fprintf(output, "
\n"); fprintf(output, "\n  \n \n"); if (nongreenpage.hosts) { do_hosts(nongreenpage.hosts, 0, NULL, NULL, output, rssoutput, "", summarytype, NULL); } else { /* All Monitored Systems OK */ fprintf(output, "%s", xgetenv("XYMONALLOKTEXT")); } /* Summaries on nongreenpage as well */ do_summaries(dispsums, output); if ((snapshot == 0) && (summarytype == PAGE_NONGREEN)) { do_nongreenext(output, "XYMONNONGREENEXT", "mkbb"); /* Don't redo the eventlog or acklog things */ if (nongreeneventlog && !havedoneeventlog) { do_eventlog(output, nongreeneventlogmaxcount, nongreeneventlogmaxtime, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, nongreennodialups, host_exists, NULL, NULL, NULL, XYMON_COUNT_NONE, XYMON_S_NONE, NULL); } if (nongreenacklog && !havedoneacklog) do_acklog(output, nongreenacklogmaxcount, nongreenacklogmaxtime); } fprintf(output, "
\n"); headfoot(output, hf_prefix[summarytype], "", "footer", nongreenpage.color); do_rss_footer(rssoutput); fclose(output); if (rename(tmpfilename, filename)) { errprintf("Cannot rename %s to %s - error %d\n", tmpfilename, filename, errno); } if (rssoutput) { fclose(rssoutput); if (rename(tmprssfilename, rssfilename)) { errprintf("Cannot rename %s to %s - error %d\n", tmprssfilename, rssfilename, errno); } } if (nssidebarfilename) do_netscape_sidebar(nssidebarfilename, nongreenpage.hosts); if (logcritstatus && (summarytype == PAGE_CRITICAL)) { host_t *hwalk; entry_t *ewalk; char *msgptr; char msgline[MAX_LINE_LEN]; FILE *nklog; char nklogfn[PATH_MAX]; char svcspace; sprintf(nklogfn, "%s/criticalstatus.log", xgetenv("XYMONSERVERLOGS")); nklog = fopen(nklogfn, "a"); if (nklog == NULL) { errprintf("Cannot log Critical status to %s: %s\n", nklogfn, strerror(errno)); } init_timestamp(); combo_start(); init_status(nongreenpage.color); sprintf(msgline, "status %s.%s %s %s Critical page %s\n\n", xgetenv("MACHINE"), logcritstatus, colorname(nongreenpage.color), timestamp, colorname(nongreenpage.color)); addtostatus(msgline); if (nklog) fprintf(nklog, "%u\t%s", (unsigned int)getcurrenttime(NULL), colorname(nongreenpage.color)); for (hwalk = nongreenpage.hosts; hwalk; hwalk = hwalk->next) { msgptr = msgline; msgptr += sprintf(msgline, "&%s %s :", colorname(hwalk->color), hwalk->hostname); if (nklog) fprintf(nklog, "\t%s ", hwalk->hostname); svcspace = '('; for (ewalk = hwalk->entries; (ewalk); ewalk = ewalk->next) { if ((summarytype == PAGE_NONGREEN) || (ewalk->alert)) { if ((ewalk->color == COL_RED) || (ewalk->color == COL_YELLOW)) { msgptr += sprintf(msgptr, "%s", ewalk->column->name); if (nklog) fprintf(nklog, "%c%s:%s", svcspace, ewalk->column->name, colorname(ewalk->color)); svcspace = ' '; } } } strcpy(msgptr, "\n"); addtostatus(msgline); if (nklog) fprintf(nklog, ")"); } finish_status(); combo_end(); if (nklog) { fprintf(nklog, "\n"); fclose(nklog); } } { /* Free temporary hostlist */ host_t *h1, *h2; h1 = nongreenpage.hosts; while (h1) { h2 = h1; h1 = h1->next; xfree(h2); } } return nongreenpage.color; } xymon-4.3.28/xymongen/util.c0000664000076400007640000001400311630612201016165 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon overview webpage generator tool. */ /* */ /* Various utility functions specific to xymongen. Generally useful code is */ /* in the library. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: util.c 6746 2011-09-04 06:02:41Z storner $"; #include #include #include #include #include #include #include #include "xymongen.h" #include "util.h" char *htmlextension = ".html"; /* Filename extension for generated HTML files */ static void * hosttree; static int havehosttree = 0; static void * columntree; static int havecolumntree = 0; char *hostpage_link(host_t *host) { /* Provide a link to the page where this host lives, relative to XYMONWEB */ static char pagelink[PATH_MAX]; char tmppath[PATH_MAX]; xymongen_page_t *pgwalk; if (host->parent && (strlen(((xymongen_page_t *)host->parent)->name) > 0)) { sprintf(pagelink, "%s%s", ((xymongen_page_t *)host->parent)->name, htmlextension); for (pgwalk = host->parent; (pgwalk); pgwalk = pgwalk->parent) { if (strlen(pgwalk->name)) { sprintf(tmppath, "%s/%s", pgwalk->name, pagelink); strcpy(pagelink, tmppath); } } } else { sprintf(pagelink, "xymon%s", htmlextension); } return pagelink; } char *hostpage_name(host_t *host) { /* Provide a link to the page where this host lives */ static char pagename[PATH_MAX]; char tmpname[PATH_MAX]; xymongen_page_t *pgwalk; if (host->parent && (strlen(((xymongen_page_t *)host->parent)->name) > 0)) { pagename[0] = '\0'; for (pgwalk = host->parent; (pgwalk); pgwalk = pgwalk->parent) { if (strlen(pgwalk->name)) { strcpy(tmpname, pgwalk->title); if (strlen(pagename)) { strcat(tmpname, "/"); strcat(tmpname, pagename); } strcpy(pagename, tmpname); } } } else { sprintf(pagename, "Top page"); } return pagename; } static int checknopropagation(char *testname, char *noproptests) { if (noproptests == NULL) return 0; if (strcmp(noproptests, ",*,") == 0) return 1; if (strstr(noproptests, testname) != NULL) return 1; return 0; } int checkpropagation(host_t *host, char *test, int color, int acked) { /* NB: Default is to propagate test, i.e. return 1 */ char *testname; int result = 1; if (!host) return 1; testname = (char *) malloc(strlen(test)+3); sprintf(testname, ",%s,", test); if (acked) { if (checknopropagation(testname, host->nopropacktests)) result = 0; } if (result) { if (color == COL_RED) { if (checknopropagation(testname, host->nopropredtests)) result = 0; } else if (color == COL_YELLOW) { if (checknopropagation(testname, host->nopropyellowtests)) result = 0; if (checknopropagation(testname, host->nopropredtests)) result = 0; } else if (color == COL_PURPLE) { if (checknopropagation(testname, host->noproppurpletests)) result = 0; } } xfree(testname); return result; } host_t *find_host(char *hostname) { xtreePos_t handle; if (havehosttree == 0) return NULL; /* Search for the host */ handle = xtreeFind(hosttree, hostname); if (handle != xtreeEnd(hosttree)) { hostlist_t *entry = (hostlist_t *)xtreeData(hosttree, handle); return (entry ? entry->hostentry : NULL); } return NULL; } int host_exists(char *hostname) { return (find_host(hostname) != NULL); } hostlist_t *find_hostlist(char *hostname) { xtreePos_t handle; if (havehosttree == 0) return NULL; /* Search for the host */ handle = xtreeFind(hosttree, hostname); if (handle != xtreeEnd(hosttree)) { hostlist_t *entry = (hostlist_t *)xtreeData(hosttree, handle); return entry; } return NULL; } void add_to_hostlist(hostlist_t *rec) { if (havehosttree == 0) { hosttree = xtreeNew(strcasecmp); havehosttree = 1; } xtreeAdd(hosttree, rec->hostentry->hostname, rec); } static xtreePos_t hostlistwalk; hostlist_t *hostlistBegin(void) { if (havehosttree == 0) return NULL; hostlistwalk = xtreeFirst(hosttree); if (hostlistwalk != xtreeEnd(hosttree)) { return (hostlist_t *)xtreeData(hosttree, hostlistwalk); } else { return NULL; } } hostlist_t *hostlistNext(void) { if (havehosttree == 0) return NULL; if (hostlistwalk != xtreeEnd(hosttree)) hostlistwalk = xtreeNext(hosttree, hostlistwalk); if (hostlistwalk != xtreeEnd(hosttree)) { return (hostlist_t *)xtreeData(hosttree, hostlistwalk); } else { return NULL; } } xymongen_col_t *find_or_create_column(char *testname, int create) { xymongen_col_t *newcol = NULL; xtreePos_t handle; dbgprintf("find_or_create_column(%s)\n", textornull(testname)); if (havecolumntree == 0) { columntree = xtreeNew(strcasecmp); havecolumntree = 1; } handle = xtreeFind(columntree, testname); if (handle != xtreeEnd(columntree)) newcol = (xymongen_col_t *)xtreeData(columntree, handle); if (newcol == NULL) { if (!create) return NULL; newcol = (xymongen_col_t *) calloc(1, sizeof(xymongen_col_t)); newcol->name = strdup(testname); newcol->listname = (char *)malloc(strlen(testname)+1+2); sprintf(newcol->listname, ",%s,", testname); xtreeAdd(columntree, newcol->name, newcol); } return newcol; } int wantedcolumn(char *current, char *wanted) { char *tag; int result; tag = (char *) malloc(strlen(current)+3); sprintf(tag, "|%s|", current); result = (strstr(wanted, tag) != NULL); xfree(tag); return result; } xymon-4.3.28/xymongen/csvreport.h0000664000076400007640000000154211615341300017252 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon overview webpage generator tool. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __CSVREPORT_H__ #define __CSVREPORT_H__ #include "xymongen.h" extern void csv_availability(char *fn, char csvdelim); #endif xymon-4.3.28/xymongen/loaddata.h0000664000076400007640000000206111615341300016771 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon overview webpage generator tool. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __LOADDATA_H_ #define __LOADDATA_H_ extern int statuscount; extern char *ignorecolumns; extern char *dialupskin; extern char *reverseskin; extern time_t recentgif_limit; extern char *purplelogfn; extern int colorcount[]; extern int colorcount_noprop[]; extern state_t *load_state(dispsummary_t **sumhead); #endif xymon-4.3.28/xymongen/loadlayout.h0000664000076400007640000000273111615341300017401 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon overview webpage generator tool. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __LOADLAYOUT_H__ #define __LOADLAYOUT_H__ extern int hostcount; extern int pagecount; extern xymongen_page_t *load_layout(char *pgset); /* Needed by the summary handling */ extern host_t *init_host(char *hostname, int issummary, char *displayname, char *clientalias, char *comment, char *description, int ip1, int ip2, int ip3, int ip4, int dialup, double warnpct, int warnstops, char *reporttime, char *alerts, int crittime, char *waps, char *nopropyellowtests, char *nopropredtests, char *noproppurpletests, char *nopropacktests); extern char *nopropyellowdefault; extern char *nopropreddefault; extern char *noproppurpledefault; extern char *nopropackdefault; extern char *wapcolumns; extern time_t snapshot; #endif xymon-4.3.28/xymongen/process.c0000664000076400007640000002015412672550115016706 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon overview webpage generator tool. */ /* */ /* This file contains to to calculate the "color" of hosts and pages, and */ /* handle summary transmission. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: process.c 7953 2016-03-17 15:42:05Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include #include "xymongen.h" #include "process.h" #include "util.h" void calc_hostcolors(char *nongreenignores) { int color, nongreencolor, criticalcolor, oldage; hostlist_t *h, *cwalk; entry_t *e; for (h = hostlistBegin(); (h); h = hostlistNext()) { color = nongreencolor = criticalcolor = 0; oldage = 1; for (e = h->hostentry->entries; (e); e = e->next) { if (e->propagate && (e->color > color)) color = e->color; oldage &= e->oldage; if (e->propagate && (e->color > nongreencolor) && (strstr(nongreenignores, e->column->listname) == NULL)) { nongreencolor = e->color; } if (e->propagate && e->alert && (e->color > criticalcolor)) { criticalcolor = e->color; } } /* Blue and clear is not propagated upwards */ if ((color == COL_CLEAR) || (color == COL_BLUE)) color = COL_GREEN; h->hostentry->color = color; h->hostentry->nongreencolor = nongreencolor; h->hostentry->criticalcolor = criticalcolor; h->hostentry->oldage = oldage; /* Need to update the clones also */ for (cwalk = h->clones; (cwalk); cwalk = cwalk->clones) { cwalk->hostentry->color = color; cwalk->hostentry->nongreencolor = nongreencolor; cwalk->hostentry->criticalcolor = criticalcolor; cwalk->hostentry->oldage = oldage; } } } void calc_pagecolors(xymongen_page_t *phead) { xymongen_page_t *p, *toppage; group_t *g; host_t *h; int color, oldage; for (toppage=phead; (toppage); toppage = toppage->next) { /* Start with the color of immediate hosts */ color = -1; oldage = 1; for (h = toppage->hosts; (h); h = h->next) { if (h->color > color) color = h->color; oldage &= h->oldage; } /* Then adjust with the color of hosts in immediate groups */ for (g = toppage->groups; (g); g = g->next) { for (h = g->hosts; (h); h = h->next) { if ((g->onlycols == NULL) && (g->exceptcols == NULL)) { /* No group-only or group-except directives - use host color */ if (h->color > color) color = h->color; oldage &= h->oldage; } else if (g->onlycols) { /* This is a group-only directive. Color must be * based on the tests included in the group-only * directive, NOT all tests present for the host. * So we need to re-calculate host color from only * the selected tests. */ entry_t *e; for (e = h->entries; (e); e = e->next) { if ( e->propagate && (e->color > color) && wantedcolumn(e->column->name, g->onlycols) ) color = e->color; oldage &= e->oldage; } /* Blue and clear is not propagated upwards */ if ((color == COL_CLEAR) || (color == COL_BLUE)) color = COL_GREEN; } else if (g->exceptcols) { /* This is a group-except directive. Color must be * based on the tests NOT included in the group-except * directive, NOT all tests present for the host. * So we need to re-calculate host color from only * the selected tests. */ entry_t *e; for (e = h->entries; (e); e = e->next) { if ( e->propagate && (e->color > color) && !wantedcolumn(e->column->name, g->exceptcols) ) color = e->color; oldage &= e->oldage; } /* Blue and clear is not propagated upwards */ if ((color == COL_CLEAR) || (color == COL_BLUE)) color = COL_GREEN; } } } /* Then adjust with the color of subpages, if any. */ /* These must be calculated first! */ if (toppage->subpages) { calc_pagecolors(toppage->subpages); } for (p = toppage->subpages; (p); p = p->next) { if (p->color > color) color = p->color; oldage &= p->oldage; } if (color == -1) { /* * If no hosts or subpages, all goes green. */ color = COL_GREEN; oldage = 1; } toppage->color = color; toppage->oldage = oldage; } } void delete_old_acks(void) { DIR *xymonacks; struct dirent *d; struct stat st; time_t now = getcurrenttime(NULL); char fn[PATH_MAX]; xymonacks = opendir(xgetenv("XYMONACKDIR")); if (!xymonacks) { errprintf("No XYMONACKDIR! Cannot cd to directory %s\n", xgetenv("XYMONACKDIR")); return; } if (chdir(xgetenv("XYMONACKDIR")) == -1) { errprintf("Cannot chdir to %s: %s\n", xgetenv("XYMONACKDIR"), strerror(errno)); return; } while ((d = readdir(xymonacks))) { strcpy(fn, d->d_name); if (strncmp(fn, "ack.", 4) == 0) { stat(fn, &st); if (S_ISREG(st.st_mode) && (st.st_mtime < now)) { unlink(fn); } } } closedir(xymonacks); } void send_summaries(summary_t *sumhead) { summary_t *s; for (s = sumhead; (s); s = s->next) { char *suburl; int summarycolor = -1; char *summsg; /* Decide which page to pick the color from for this summary. */ suburl = s->url; if (strncmp(suburl, "http://", 7) == 0) { char *p; /* Skip hostname part */ suburl += 7; /* Skip "http://" */ p = strchr(suburl, '/'); /* Find next '/' */ if (p) suburl = p; } else if(strncmp(suburl, "https://", 8) == 0) { char *p; /* Skip hostname part */ suburl += 8; /* Skip "https://" */ p = strchr(suburl, '/'); /* Find next '/' */ if (p) suburl = p; } if (strncmp(suburl, xgetenv("XYMONWEB"), strlen(xgetenv("XYMONWEB"))) == 0) suburl += strlen(xgetenv("XYMONWEB")); if (*suburl == '/') suburl++; dbgprintf("summ1: s->url=%s, suburl=%s\n", s->url, suburl); if (strcmp(suburl, "xymon.html") == 0) summarycolor = xymon_color; else if (strcmp(suburl, "index.html") == 0) summarycolor = xymon_color; else if (strcmp(suburl, "") == 0) summarycolor = xymon_color; else if (strcmp(suburl, "nongreen.html") == 0) summarycolor = nongreen_color; else if (strcmp(suburl, "critical.html") == 0) summarycolor = critical_color; else { /* * Specific page - find it in the page tree. */ char *p, *pg; xymongen_page_t *pgwalk; xymongen_page_t *sourcepg = NULL; char *urlcopy = strdup(suburl); /* * Walk the page tree */ pg = urlcopy; sourcepg = pagehead; do { p = strchr(pg, '/'); if (p) *p = '\0'; dbgprintf("Searching for page %s\n", pg); for (pgwalk = sourcepg->subpages; (pgwalk && (strcmp(pgwalk->name, pg) != 0)); pgwalk = pgwalk->next); if (pgwalk != NULL) { sourcepg = pgwalk; if (p) { *p = '/'; pg = p+1; } else pg = NULL; } else pg = NULL; } while (pg); dbgprintf("Summary search for %s found page %s (title:%s), color %d\n", suburl, sourcepg->name, sourcepg->title, sourcepg->color); summarycolor = sourcepg->color; xfree(urlcopy); } if (summarycolor == -1) { errprintf("Could not determine sourcepage for summary %s\n", s->url); summarycolor = pagehead->color; } /* Send the summary message */ summsg = (char *)malloc(1024 + strlen(s->name) + strlen(s->url) + strlen(timestamp)); sprintf(summsg, "summary summary.%s %s %s %s", s->name, colorname(summarycolor), s->url, timestamp); sendmessage(summsg, s->receiver, XYMON_TIMEOUT, NULL); xfree(summsg); } } xymon-4.3.28/xymongen/loadlayout.c0000664000076400007640000006005512003234710017375 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon overview webpage generator tool. */ /* */ /* This file holds code to load the page-structure from the hosts.cfg file. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: loadlayout.c 7105 2012-07-23 11:47:20Z storner $"; #include #include #include #include #include #include #include #include #include #include #include "xymongen.h" #include "util.h" #include "loadlayout.h" #define MAX_TARGETPAGES_PER_HOST 10 time_t snapshot = 0; /* Set if we are doing a snapshot */ char *null_text = ""; /* List definition to search for page records */ typedef struct xymonpagelist_t { struct xymongen_page_t *pageentry; struct xymonpagelist_t *next; } xymonpagelist_t; static xymonpagelist_t *pagelisthead = NULL; int pagecount = 0; int hostcount = 0; char *wapcolumns = NULL; /* Default columns included in WAP cards */ char *nopropyellowdefault = NULL; char *nopropreddefault = NULL; char *noproppurpledefault = NULL; char *nopropackdefault = NULL; void addtopagelist(xymongen_page_t *page) { xymonpagelist_t *newitem; newitem = (xymonpagelist_t *) calloc(1, sizeof(xymonpagelist_t)); newitem->pageentry = page; newitem->next = pagelisthead; pagelisthead = newitem; } char *build_noprop(char *defset, char *specset) { static char result[MAX_LINE_LEN]; char *set; char *item; char ibuf[MAX_LINE_LEN]; char op; char *p; /* It's guaranteed that specset is non-NULL. defset may be NULL */ if ((*specset != '+') && (*specset != '-')) { /* Old-style - specset is the full set of tests */ sprintf(result, ",%s,", specset); return result; } set = strdup(specset); strcpy(result, ((defset != NULL) ? defset : "")); item = strtok(set, ","); while (item) { if ((*item == '-') || (*item == '+')) { op = *item; sprintf(ibuf, ",%s,", item+1); } else { op = '+'; sprintf(ibuf, ",%s,", item); } p = strstr(result, ibuf); if (p && (op == '-')) { /* Remove this item */ memmove(p, (p+strlen(item)), strlen(p)); } else if ((p == NULL) && (op == '+')) { /* Add this item (it's not already included) */ if (strlen(result) == 0) { sprintf(result, ",%s,", item+1); } else { strcat(result, item+1); strcat(result, ","); } } item = strtok(NULL, ","); } xfree(set); return result; /* This may be an empty string */ } xymongen_page_t *init_page(char *name, char *title, int vertical) { xymongen_page_t *newpage = (xymongen_page_t *) calloc(1, sizeof(xymongen_page_t)); pagecount++; dbgprintf("init_page(%s, %s)\n", textornull(name), textornull(title)); if (name) { newpage->name = strdup(name); } else name = null_text; if (title) { newpage->title = strdup(title); }else title = null_text; newpage->color = -1; newpage->oldage = 1; newpage->vertical = vertical; newpage->pretitle = NULL; newpage->groups = NULL; newpage->hosts = NULL; newpage->parent = NULL; newpage->subpages = NULL; newpage->next = NULL; return newpage; } group_t *init_group(char *title, char *onlycols, char *exceptcols, int sorthosts) { group_t *newgroup = (group_t *) calloc(1, sizeof(group_t)); dbgprintf("init_group(%s, %s)\n", textornull(title), textornull(onlycols)); if (title) { newgroup->title = strdup(title); } else title = null_text; if (onlycols) { newgroup->onlycols = (char *) malloc(strlen(onlycols)+3); /* Add a '|' at start and end */ sprintf(newgroup->onlycols, "|%s|", onlycols); } else newgroup->onlycols = NULL; if (exceptcols) { newgroup->exceptcols = (char *) malloc(strlen(exceptcols)+3); /* Add a '|' at start and end */ sprintf(newgroup->exceptcols, "|%s|", exceptcols); } else newgroup->exceptcols = NULL; newgroup->pretitle = NULL; newgroup->hosts = NULL; newgroup->sorthosts = sorthosts; newgroup->next = NULL; return newgroup; } host_t *init_host(char *hostname, int issummary, char *displayname, char *clientalias, char *comment, char *description, int ip1, int ip2, int ip3, int ip4, int dialup, double warnpct, int warnstops, char *reporttime, char *alerts, int crittime, char *waps, char *nopropyellowtests, char *nopropredtests, char *noproppurpletests, char *nopropacktests) { host_t *newhost = (host_t *) calloc(1, sizeof(host_t)); hostlist_t *oldlist; hostcount++; dbgprintf("init_host(%s)\n", textornull(hostname)); newhost->hostname = newhost->displayname = strdup(hostname); if (displayname) newhost->displayname = strdup(displayname); newhost->clientalias = (clientalias ? strdup(clientalias) : NULL); newhost->comment = (comment ? strdup(comment) : NULL); newhost->description = (description ? strdup(description) : NULL); sprintf(newhost->ip, "%d.%d.%d.%d", ip1, ip2, ip3, ip4); newhost->pretitle = NULL; newhost->entries = NULL; newhost->color = -1; newhost->oldage = 1; newhost->dialup = dialup; newhost->reportwarnlevel = warnpct; newhost->reportwarnstops = warnstops; newhost->reporttime = (reporttime ? strdup(reporttime) : NULL); if (alerts && crittime) { newhost->alerts = strdup(alerts); } else { newhost->alerts = NULL; } newhost->anywaps = 0; newhost->wapcolor = -1; /* Wap set is : * - Specific WML: tag * - NK: tag * - --wap=COLUMN cmdline option * - NULL */ if (waps || alerts) { newhost->waps = strdup(waps ? waps : alerts); } else { newhost->waps = wapcolumns; } if (nopropyellowtests) { char *p; p = skipword(nopropyellowtests); if (*p) *p = '\0'; else p = NULL; newhost->nopropyellowtests = strdup(build_noprop(nopropyellowdefault, nopropyellowtests)); if (p) *p = ' '; } else { newhost->nopropyellowtests = nopropyellowdefault; } if (nopropredtests) { char *p; p = skipword(nopropredtests); if (*p) *p = '\0'; else p = NULL; newhost->nopropredtests = strdup(build_noprop(nopropreddefault, nopropredtests)); if (p) *p = ' '; } else { newhost->nopropredtests = nopropreddefault; } if (noproppurpletests) { char *p; p = skipword(noproppurpletests); if (*p) *p = '\0'; else p = NULL; newhost->noproppurpletests = strdup(build_noprop(noproppurpledefault, noproppurpletests)); if (p) *p = ' '; } else { newhost->noproppurpletests = noproppurpledefault; } if (nopropacktests) { char *p; p = skipword(nopropacktests); if (*p) *p = '\0'; else p = NULL; newhost->nopropacktests = strdup(build_noprop(nopropackdefault, nopropacktests)); if (p) *p = ' '; } else { newhost->nopropacktests = nopropackdefault; } newhost->parent = NULL; newhost->nonongreen = 0; newhost->next = NULL; /* Summary hosts don't go into the host list */ if (issummary) return newhost; /* * Add this host to the hostlist_t list of known hosts. * HOWEVER: It might be a duplicate! In that case, we need * to figure out which host record we want to use. */ oldlist = find_hostlist(hostname); if (oldlist == NULL) { hostlist_t *newlist; newlist = (hostlist_t *) calloc(1, sizeof(hostlist_t)); newlist->hostentry = newhost; newlist->clones = NULL; add_to_hostlist(newlist); } else { hostlist_t *clone = (hostlist_t *) calloc(1, sizeof(hostlist_t)); dbgprintf("Duplicate host definition for host '%s'\n", hostname); clone->hostentry = newhost; clone->clones = oldlist->clones; oldlist->clones = clone; } return newhost; } void getnamelink(char *l, char **name, char **link) { /* "page NAME title-or-link" splitup */ char *p; dbgprintf("getnamelink(%s, ...)\n", textornull(l)); *name = null_text; *link = null_text; /* Skip page/subpage keyword, and whitespace after that */ p = skipwhitespace(skipword(l)); *name = p; p = skipword(p); if (*p) { *p = '\0'; /* Null-terminate pagename */ p++; *link = skipwhitespace(p); } } void getparentnamelink(char *l, xymongen_page_t *toppage, xymongen_page_t **parent, char **name, char **link) { /* "subparent NAME PARENTNAME title-or-link" splitup */ char *p; char *parentname; xymonpagelist_t *walk; dbgprintf("getnamelink(%s, ...)\n", textornull(l)); *name = null_text; *link = null_text; /* Skip page/subpage keyword, and whitespace after that */ parentname = p = skipwhitespace(skipword(l)); p = skipword(p); if (*p) { *p = '\0'; /* Null-terminate pagename */ p++; *name = p = skipwhitespace(p); p = skipword(p); if (*p) { *p = '\0'; /* Null-terminate parentname */ p++; *link = skipwhitespace(p); } } for (walk = pagelisthead; (walk && (strcmp(walk->pageentry->name, parentname) != 0)); walk = walk->next) ; if (walk) { *parent = walk->pageentry; } else { errprintf("Cannot find parent page '%s'\n", parentname); *parent = NULL; } } void getgrouptitle(char *l, char *pageset, char **title, char **onlycols, char **exceptcols) { char grouponlytag[100], groupexcepttag[100], grouptag[100]; *title = null_text; *onlycols = NULL; *exceptcols = NULL; sprintf(grouponlytag, "%sgroup-only", pageset); sprintf(groupexcepttag, "%sgroup-except", pageset); sprintf(grouptag, "%sgroup", pageset); dbgprintf("getgrouptitle(%s, ...)\n", textornull(l)); if (strncmp(l, grouponlytag, strlen(grouponlytag)) == 0) { char *p; *onlycols = skipwhitespace(skipword(l)); p = skipword(*onlycols); if (*p) { *p = '\0'; p++; *title = skipwhitespace(p); } } else if (strncmp(l, groupexcepttag, strlen(groupexcepttag)) == 0) { char *p; *exceptcols = skipwhitespace(skipword(l)); p = skipword(*exceptcols); if (*p) { *p = '\0'; p++; *title = skipwhitespace(p); } } else if (strncmp(l, grouptag, strlen(grouptag)) == 0) { *title = skipwhitespace(skipword(l)); } } summary_t *init_summary(char *name, char *receiver, char *url) { summary_t *newsum; dbgprintf("init_summary(%s, %s, %s)\n", textornull(name), textornull(receiver), textornull(url)); /* Sanity check */ if ((name == NULL) || (receiver == NULL) || (url == NULL)) return NULL; newsum = (summary_t *) calloc(1, sizeof(summary_t)); newsum->name = strdup(name); newsum->receiver = strdup(receiver); newsum->url = strdup(url); newsum->next = NULL; return newsum; } xymongen_page_t *load_layout(char *pgset) { char pagetag[100], subpagetag[100], subparenttag[100], vpagetag[100], vsubpagetag[100], vsubparenttag[100], grouptag[100], summarytag[100], titletag[100], hosttag[100]; char *name, *link, *onlycols, *exceptcols; char hostname[MAX_LINE_LEN]; xymongen_page_t *toppage, *curpage, *cursubpage, *cursubparent; group_t *curgroup; host_t *curhost; char *curtitle; int ip1, ip2, ip3, ip4; char *p; int fqdn = get_fqdn(); char *cfgdata, *inbol, *ineol, insavchar = '\0'; if (loadhostsfromxymond) { if (load_hostnames("@", NULL, fqdn) != 0) { errprintf("Cannot load host configuration from xymond\n"); return NULL; } } else { if (load_hostnames(xgetenv("HOSTSCFG"), "dispinclude", fqdn) != 0) { errprintf("Cannot load host configuration from %s\n", xgetenv("HOSTSCFG")); return NULL; } } if (first_host() == NULL) { errprintf("Empty configuration from %s\n", (loadhostsfromxymond ? "xymond" : xgetenv("HOSTSCFG"))); return NULL; } dbgprintf("load_layout(pgset=%s)\n", textornull(pgset)); /* * load_hostnames() picks up the hostname definitions, but not the page * layout. So we will scan the file again, this time doing the layout. */ if (pgset == NULL) pgset = ""; sprintf(pagetag, "%spage", pgset); sprintf(subpagetag, "%ssubpage", pgset); sprintf(subparenttag, "%ssubparent", pgset); sprintf(vpagetag, "v%spage", pgset); sprintf(vsubpagetag, "v%ssubpage", pgset); sprintf(vsubparenttag, "v%ssubparent", pgset); sprintf(grouptag, "%sgroup", pgset); sprintf(summarytag, "%ssummary", pgset); sprintf(titletag, "%stitle", pgset); sprintf(hosttag, "%s:", pgset); for (p=hosttag; (*p); p++) *p = toupper((int)*p); toppage = init_page("", "", 0); addtopagelist(toppage); curpage = NULL; cursubpage = NULL; curgroup = NULL; curhost = NULL; cursubparent = NULL; curtitle = NULL; inbol = cfgdata = hostscfg_content(); while (inbol && *inbol) { inbol += strspn(inbol, " \t"); ineol = strchr(inbol, '\n'); if (ineol) { while ((ineol > inbol) && (isspace(*ineol) || (*ineol == '\n'))) ineol--; if (*ineol != '\n') ineol++; insavchar = *ineol; *ineol = '\0'; } dbgprintf("load_layout: -- got line '%s'\n", inbol); if ((strncmp(inbol, pagetag, strlen(pagetag)) == 0) || (strncmp(inbol, vpagetag, strlen(vpagetag)) == 0)) { getnamelink(inbol, &name, &link); if (curpage == NULL) { /* First page - hook it on toppage as a subpage from there */ curpage = toppage->subpages = init_page(name, link, (strncmp(inbol, vpagetag, strlen(vpagetag)) == 0)); } else { curpage = curpage->next = init_page(name, link, (strncmp(inbol, vpagetag, strlen(vpagetag)) == 0)); } curpage->parent = toppage; if (curtitle) { curpage->pretitle = curtitle; curtitle = NULL; } cursubpage = NULL; cursubparent = NULL; curgroup = NULL; curhost = NULL; addtopagelist(curpage); } else if ( (strncmp(inbol, subpagetag, strlen(subpagetag)) == 0) || (strncmp(inbol, vsubpagetag, strlen(vsubpagetag)) == 0) ) { if (curpage == NULL) { errprintf("'subpage' ignored, no preceding 'page' tag : %s\n", inbol); goto nextline; } getnamelink(inbol, &name, &link); if (cursubpage == NULL) { cursubpage = curpage->subpages = init_page(name, link, (strncmp(inbol, vsubpagetag, strlen(vsubpagetag)) == 0)); } else { cursubpage = cursubpage->next = init_page(name, link, (strncmp(inbol, vsubpagetag, strlen(vsubpagetag)) == 0)); } cursubpage->parent = curpage; if (curtitle) { cursubpage->pretitle = curtitle; curtitle = NULL; } cursubparent = NULL; curgroup = NULL; curhost = NULL; addtopagelist(cursubpage); } else if ( (strncmp(inbol, subparenttag, strlen(subparenttag)) == 0) || (strncmp(inbol, vsubparenttag, strlen(vsubparenttag)) == 0) ) { xymongen_page_t *parentpage, *walk; getparentnamelink(inbol, toppage, &parentpage, &name, &link); if (parentpage == NULL) { errprintf("'subparent' ignored, unknown parent page: %s\n", inbol); goto nextline; } cursubparent = init_page(name, link, (strncmp(inbol, vsubparenttag, strlen(vsubparenttag)) == 0)); if (parentpage->subpages == NULL) { parentpage->subpages = cursubparent; } else { for (walk = parentpage->subpages; (walk->next); (walk = walk->next)) ; walk->next = cursubparent; } if (curtitle) { cursubparent->pretitle = curtitle; curtitle = NULL; } cursubparent->parent = parentpage; curgroup = NULL; curhost = NULL; addtopagelist(cursubparent); } else if (strncmp(inbol, grouptag, strlen(grouptag)) == 0) { int sorthosts = (strstr(inbol, "group-sorted") != NULL); getgrouptitle(inbol, pgset, &link, &onlycols, &exceptcols); if (curgroup == NULL) { curgroup = init_group(link, onlycols, exceptcols, sorthosts); if (cursubparent != NULL) { cursubparent->groups = curgroup; } else if (cursubpage != NULL) { /* We're in a subpage */ cursubpage->groups = curgroup; } else if (curpage != NULL) { /* We're on a main page */ curpage->groups = curgroup; } else { /* We're on the top page */ toppage->groups = curgroup; } } else { curgroup->next = init_group(link, onlycols, exceptcols, sorthosts); curgroup = curgroup->next; } if (curtitle) { curgroup->pretitle = curtitle; curtitle = NULL; } curhost = NULL; } else if (sscanf(inbol, "%3d.%3d.%3d.%3d %s", &ip1, &ip2, &ip3, &ip4, hostname) == 5) { void *xymonhost = NULL; int dialup, nonongreen, crittime = 1; double warnpct = reportwarnlevel; int warnstops = reportwarnstops; char *displayname, *clientalias, *comment, *description; char *alertlist, *onwaplist, *reporttime; char *nopropyellowlist, *nopropredlist, *noproppurplelist, *nopropacklist; char *targetpagelist[MAX_TARGETPAGES_PER_HOST]; int targetpagecount; char *hval; /* Check for ".default." hosts - they are ignored. */ if (*hostname == '.') goto nextline; if (!fqdn) { /* Strip any domain from the hostname */ char *p = strchr(hostname, '.'); if (p) *p = '\0'; } /* Get the info */ xymonhost = hostinfo(hostname); if (xymonhost == NULL) { errprintf("Confused - hostname '%s' cannot be found. Ignored\n", hostname); goto nextline; } /* Check for no-display hosts - they are ignored. */ /* But only when we're building the default pageset */ if ((strlen(pgset) == 0) && (xmh_item(xymonhost, XMH_FLAG_NODISP) != NULL)) goto nextline; for (targetpagecount=0; (targetpagecount < MAX_TARGETPAGES_PER_HOST); targetpagecount++) targetpagelist[targetpagecount] = NULL; targetpagecount = 0; dialup = (xmh_item(xymonhost, XMH_FLAG_DIALUP) != NULL); nonongreen = (xmh_item(xymonhost, XMH_FLAG_NONONGREEN) != NULL); alertlist = xmh_item(xymonhost, XMH_NK); hval = xmh_item(xymonhost, XMH_NKTIME); if (hval) crittime = within_sla(xmh_item(xymonhost, XMH_HOLIDAYS), hval, 0); onwaplist = xmh_item(xymonhost, XMH_WML); nopropyellowlist = xmh_item(xymonhost, XMH_NOPROPYELLOW); if (nopropyellowlist == NULL) nopropyellowlist = xmh_item(xymonhost, XMH_NOPROP); nopropredlist = xmh_item(xymonhost, XMH_NOPROPRED); noproppurplelist = xmh_item(xymonhost, XMH_NOPROPPURPLE); nopropacklist = xmh_item(xymonhost, XMH_NOPROPACK); displayname = xmh_item(xymonhost, XMH_DISPLAYNAME); comment = xmh_item(xymonhost, XMH_COMMENT); description = xmh_item(xymonhost, XMH_DESCRIPTION); hval = xmh_item(xymonhost, XMH_WARNPCT); if (hval) warnpct = atof(hval); hval = xmh_item(xymonhost, XMH_WARNSTOPS); if (hval) warnstops = atof(hval); reporttime = xmh_item(xymonhost, XMH_REPORTTIME); clientalias = xmh_item(xymonhost, XMH_CLIENTALIAS); if (xymonhost && (strcmp(xmh_item(xymonhost, XMH_HOSTNAME), clientalias) == 0)) clientalias = NULL; if (xymonhost && (strlen(pgset) > 0)) { /* Walk the clone-list and pick up the target pages for this host */ void *cwalk = xymonhost; do { hval = xmh_item_walk(cwalk); while (hval) { if (strncasecmp(hval, hosttag, strlen(hosttag)) == 0) targetpagelist[targetpagecount++] = strdup(hval+strlen(hosttag)); hval = xmh_item_walk(NULL); } cwalk = next_host(cwalk, 1); } while (cwalk && (strcmp(xmh_item(cwalk, XMH_HOSTNAME), xmh_item(xymonhost, XMH_HOSTNAME)) == 0) && (targetpagecount < MAX_TARGETPAGES_PER_HOST) ); /* * HACK: Check if the pageset tag is present at all in the host * entry. If it isn't, then drop this incarnation of the host. * * Without this, the following hosts.cfg file will have the * www.hswn.dk host listed twice on the alternate pageset: * * adminpage nyc NYC * * 127.0.0.1 localhost # bbd http://localhost/ CLIENT:osiris * 172.16.10.2 www.xymon.com # http://www.xymon.com/ ADMIN:nyc ssh noinfo * * page superdome Superdome * 172.16.10.2 www.xymon.com # noconn * */ if (strstr(inbol, hosttag) == NULL) targetpagecount = 0; } if (strlen(pgset) == 0) { /* * Default pageset generated. Put the host into * whatever group or page is current. */ if (curhost == NULL) { curhost = init_host(hostname, 0, displayname, clientalias, comment, description, ip1, ip2, ip3, ip4, dialup, warnpct, warnstops, reporttime, alertlist, crittime, onwaplist, nopropyellowlist, nopropredlist, noproppurplelist, nopropacklist); if (curgroup != NULL) { curgroup->hosts = curhost; } else if (cursubparent != NULL) { cursubparent->hosts = curhost; } else if (cursubpage != NULL) { cursubpage->hosts = curhost; } else if (curpage != NULL) { curpage->hosts = curhost; } else { toppage->hosts = curhost; } } else { curhost = curhost->next = init_host(hostname, 0, displayname, clientalias, comment, description, ip1, ip2, ip3, ip4, dialup, warnpct, warnstops, reporttime, alertlist, crittime, onwaplist, nopropyellowlist,nopropredlist, noproppurplelist, nopropacklist); } curhost->parent = (cursubparent ? cursubparent : (cursubpage ? cursubpage : curpage)); if (curtitle) { curhost->pretitle = curtitle; curtitle = NULL; } curhost->nonongreen = nonongreen; } else if (targetpagecount) { int pgnum; for (pgnum=0; (pgnum < targetpagecount); pgnum++) { char *targetpagename = targetpagelist[pgnum]; char savechar; int wantedgroup = 0; xymonpagelist_t *targetpage = NULL; /* Put the host into the page specified by the PGSET: tag */ p = strchr(targetpagename, ','); if (p) { savechar = *p; *p = '\0'; wantedgroup = atoi(p+1); } else { savechar = '\0'; p = targetpagename + strlen(targetpagename); } /* Find the page */ if (strcmp(targetpagename, "*") == 0) { *targetpagename = '\0'; } for (targetpage = pagelisthead; (targetpage && (strcmp(targetpagename, targetpage->pageentry->name) != 0)); targetpage = targetpage->next) ; *p = savechar; if (targetpage == NULL) { errprintf("Warning: Cannot find any target page named '%s' in set '%s' - dropping host '%s'\n", targetpagename, pgset, hostname); } else { host_t *newhost = init_host(hostname, 0, displayname, clientalias, comment, description, ip1, ip2, ip3, ip4, dialup, warnpct, warnstops, reporttime, alertlist, crittime, onwaplist, nopropyellowlist,nopropredlist, noproppurplelist, nopropacklist); if (wantedgroup > 0) { group_t *gwalk; host_t *hwalk; int i; for (gwalk = targetpage->pageentry->groups, i=1; (gwalk && (i < wantedgroup)); i++,gwalk=gwalk->next) ; if (gwalk) { if (gwalk->hosts == NULL) gwalk->hosts = newhost; else { for (hwalk = gwalk->hosts; (hwalk->next); hwalk = hwalk->next) ; hwalk->next = newhost; } } else { errprintf("Warning: Cannot find group %d for host %s - dropping host\n", wantedgroup, hostname); } } else { /* Just put in on the page's hostlist */ host_t *walk; if (targetpage->pageentry->hosts == NULL) targetpage->pageentry->hosts = newhost; else { for (walk = targetpage->pageentry->hosts; (walk->next); walk = walk->next) ; walk->next = newhost; } } newhost->parent = targetpage->pageentry; if (curtitle) newhost->pretitle = curtitle; } curtitle = NULL; } } } else if (strncmp(inbol, summarytag, strlen(summarytag)) == 0) { /* summary row.column IP-ADDRESS-OF-PARENT http://xymon.com/ */ char sumname[MAX_LINE_LEN]; char receiver[MAX_LINE_LEN]; char url[MAX_LINE_LEN]; summary_t *newsum; if (sscanf(inbol, "summary %s %s %s", sumname, receiver, url) == 3) { newsum = init_summary(sumname, receiver, url); newsum->next = sumhead; sumhead = newsum; } } else if (strncmp(inbol, titletag, strlen(titletag)) == 0) { /* Save the title for the next entry */ curtitle = strdup(skipwhitespace(skipword(inbol))); } nextline: if (ineol) { *ineol = insavchar; if (*ineol != '\n') ineol = strchr(ineol, '\n'); inbol = (ineol ? ineol+1 : NULL); } else inbol = NULL; } xfree(cfgdata); return toppage; } xymon-4.3.28/xymongen/debug.c0000664000076400007640000000676411615341300016317 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon overview webpage generator tool. */ /* */ /* Debugging code for dumping various data in xymongen. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: debug.c 6712 2011-07-31 21:01:52Z storner $"; #include #include #include #include #include #include #include "xymongen.h" #include "util.h" void dumphosts(host_t *head, char *prefix) { host_t *h; entry_t *e; char format[512]; strcpy(format, prefix); strcat(format, "Host: %s, ip: %s, name: %s, color: %d, old: %d, anywaps: %d, wapcolor: %d, pretitle: '%s', noprop-y: %s, noprop-r: %s, noprop-p: %s, noprop-ack: %s, waps: %s\n"); for (h = head; (h); h = h->next) { printf(format, h->hostname, h->ip, textornull(h->displayname), h->color, h->oldage, h->anywaps, h->wapcolor, textornull(h->pretitle), textornull(h->nopropyellowtests), textornull(h->nopropredtests), textornull(h->noproppurpletests), textornull(h->nopropacktests), textornull(h->waps)); for (e = h->entries; (e); e = e->next) { printf("\t\t\t\t\tTest: %s, alert %d, propagate %d, state %d, age: %s, oldage: %d\n", e->column->name, e->alert, e->propagate, e->color, e->age, e->oldage); } } } void dumpgroups(group_t *head, char *prefix, char *hostprefix) { group_t *g; char format[512]; strcpy(format, prefix); strcat(format, "Group: %s, pretitle: '%s'\n"); for (g = head; (g); g = g->next) { printf(format, textornull(g->title), textornull(g->pretitle)); dumphosts(g->hosts, hostprefix); } } void dumphostlist(hostlist_t *head) { hostlist_t *h; for (h=hostlistBegin(); (h); h=hostlistNext()) { printf("Hostlist entry: Hostname %s\n", h->hostentry->hostname); } } void dumpstatelist(state_t *head) { state_t *s; for (s=head; (s); s=s->next) { printf("test:%s, state: %d, alert: %d, propagate: %d, oldage: %d, age: %s\n", s->entry->column->name, s->entry->color, s->entry->alert, s->entry->propagate, s->entry->oldage, s->entry->age); } } void dumponepagewithsubs(xymongen_page_t *curpage, char *indent) { xymongen_page_t *levelpage; char newindent[100]; char newindentextra[105]; strcpy(newindent, indent); strcat(newindent, "\t"); strcpy(newindentextra, newindent); strcat(newindentextra, " "); for (levelpage = curpage; (levelpage); levelpage = levelpage->next) { printf("%sPage: %s, color=%d, oldage=%d, title=%s, pretitle=%s\n", indent, levelpage->name, levelpage->color, levelpage->oldage, textornull(levelpage->title), textornull(levelpage->pretitle)); dumpgroups(levelpage->groups, newindent, newindentextra); dumphosts(levelpage->hosts, newindentextra); dumponepagewithsubs(levelpage->subpages, newindent); } } void dumpall(xymongen_page_t *head) { dumponepagewithsubs(head, ""); } xymon-4.3.28/xymongen/wmlgen.h0000664000076400007640000000152011615341300016510 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon WML generator. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ #ifndef __WMLGEN_H__ #define __WMLGEN_H__ extern int enable_wmlgen; extern void do_wml_cards(char *webdir); #endif xymon-4.3.28/xymongen/Makefile0000664000076400007640000000255412050700262016516 0ustar rpmbuildrpmbuild# Makefile for xymongen # PROGRAMS = xymongen GENOBJS = xymongen.o loadlayout.o loaddata.o pagegen.o process.o wmlgen.o rssgen.o util.o debug.o csvreport.o XYMONLIB = ../lib/libxymon.a XYMONLIBS = $(XYMONLIB) XYMONCOMMLIB = ../lib/libxymoncomm.a XYMONCOMMLIBS = $(XYMONCOMMLIB) $(ZLIBLIBS) $(SSLLIBS) $(NETLIBS) $(LIBRTDEF) XYMONTIMELIB = ../lib/libxymontime.a XYMONTIMELIBS = $(XYMONTIMELIB) $(LIBRTDEF) all: $(PROGRAMS) xymongen: $(GENOBJS) $(XYMONTIMELIB) $(XYMONCOMMLIB) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(GENOBJS) $(XYMONTIMELIBS) $(XYMONCOMMLIBS) $(PCRELIBS) ################################################ # Default compilation rules ################################################ %.o: %.c $(CC) $(CFLAGS) -c -o $@ $< clean: rm -f *.o *.a *~ $(PROGRAMS) install: install-bin install-man install-bin: $(PROGRAMS) ifndef PKGBUILD chown $(XYMONUSER) $(PROGRAMS) chgrp `$(IDTOOL) -g $(XYMONUSER)` $(PROGRAMS) chmod 755 $(PROGRAMS) endif cp -fp $(PROGRAMS) $(INSTALLROOT)$(INSTALLBINDIR)/ install-man: ifndef PKGBUILD chown $(XYMONUSER) *.1 chgrp `$(IDTOOL) -g $(XYMONUSER)` *.1 chmod 644 *.1 endif mkdir -p $(INSTALLROOT)$(MANROOT)/man1 ifndef PKGBUILD chown $(XYMONUSER) $(INSTALLROOT)$(MANROOT)/man1 chgrp `$(IDTOOL) -g $(XYMONUSER)` $(INSTALLROOT)$(MANROOT)/man1 chmod 755 $(INSTALLROOT)$(MANROOT)/man1 endif cp -fp *.1 $(INSTALLROOT)$(MANROOT)/man1/ xymon-4.3.28/README.CLIENT0000664000076400007640000001164411535462534015065 0ustar rpmbuildrpmbuildUnix client for Xymon ====================== As of version 4.1, Xymon ships with a native client for most Unix-based systems. The Xymon client will generate status columns for: * cpu : CPU utilisation * disk : Filesystem (disk) utilisation * files : File- and directory attributes and sizes * memory : Memory and Swap utilisation * msgs : Log file messages * ports : TCP/IP Network connections * procs : Processes It will also feed data to generate some graphs: * ifstat : Raw traffic data for network interfaces * netstat: TCP/IP statistics * vmstat : Various performance counters (OS-specific) In the default setup, all configuration of disk thresholds, load limits, which processes to monitor etc. is done on the Xymon server, NOT on the client. This is to allow centralized configuration of the monitored systems. If you prefer to have the client configuration done locally on each of the systems you monitor, this is an option when building the client. It is possible to have a mix of systems, with some systems configured locally, and others that use the central configuration. Note: The locally-configured client requires the PCRE libraries to be installed on the client host. The Xymon client is released under the GNU GPL, version 2 or later. See the file COPYING for details. Installation ============ Building the client package requires a working C compiler and GNU make on the target platform. None of the extra libraries needed for building Xymon are used by the client - so a plain C compiler installation with GNU make is all that is needed. To build the client: - create a "xymon" userid on the system (not required, but recommended). - extract the Xymon source archive - cd to the xymon-X.X directory - run "./configure --client; make" - as root, run "make install" The client installation is kept entirely within the "xymon" users' home-directory. All client-related files are in the ~xymon/client/ directory. If convenient, this directory can be copied directly to other systems of the same type, so you need not build the client from source on all systems. Running it ========== To start the client, su to the "xymon" user, then run $HOME/client/runclient.sh start You should arrange for your boot-time scripts to run this command at startup. Client configuration ==================== All of the normal configuration is done on the Xymon SERVER. See the analysis.cfg(5) and client-local.cfg(5) man- pages on the Xymon server. Hostname detection ------------------ The client reports to Xymon using the hostname taken from the "uname -n" command output. Whether this provides a fully qualified DNS name (myserver.foo.com) or a simple hostname (myserver) varies a lot. If your client gets it wrong, you can override the default with the "--hostname=CLIENT.HOST.NAME" option to the runclient.sh startup command. OS detection on Linux systems ----------------------------- The client normally determines the operating system auto- matically from the "uname -s" output. This results in all Linux systems reporting as "Linux" - which causes the vmstat graphs to fail for certain types of systems: - Systems running Linux kernels 2.2.x (e.g. Debian Woody) Must report "linux22" instead. - Red Hat Enterprise Linux 2.1 Must report "linux22" instead. - Red Hat Enterprise Linux 3 update 1 The default is adequate - Red Hat Enterprise Linux 3 update 2 or later Must report "rhel3" instead. - Red Hat Enterprise Linux 4 update 2 and later The default is adequate To override the default, start the client using the "--os=OSNAME" option to the runclient.sh startup command. (Thanks to Thomas Seglard Enata for providing the about the various Red Hat versions). Extension scripts ----------------- The file client/etc/clientlaunch.cfg configures the "xymonlaunch" used to run the client scripts. If you need to run extension scripts for your client, you can add them to this file. The environment variables commonly used by Big Brother-based extensions are made available by xymonlaunch for the scripts, so in most cases extensions written for the Big Brother client will work without modifications on Xymon. Each script should have a separate section in the file, like the default one that runs the core client: [myextension] ENVFILE /usr/lib/xymon/client/etc/xymonclient.cfg CMD /usr/lib/xymon/client/ext/myscript.sh INTERVAL 5m LOGFILE /usr/lib/xymon/client/logs/myscript.log See the tasks.cfg(5) man-page for a full description of this file. Installing on multiple systems ============================== After building and installing the client on one system, you can copy the client installation to other systems. You need only copy the directory structure with the "client" directory. The client does not have any hardcoded file- or directory-paths embedded in it, so you can put the client files anywhere you like, as long as you preserve the directory structure below the "client" directory. Henrik Stoerner, 2006-Apr-23 xymon-4.3.28/README.backfeed0000664000076400007640000000655312174443430015630 0ustar rpmbuildrpmbuildEnabling the "backfeed" channel on the Xymon server =================================================== Background ---------- Traditionally, all communication between modules on the Xymon server uses a TCP connection to xymond. This is a simple standardized way of talking to the daemon, e.g. to send status updates from xymond_client or xymonnet into the xymond daemon. However, a TCP connection also carries quite a bit of overhead. On a server with a very high load of messages this can be a problem - empirical evidence shows that the limit appears to be around 3300 messages/second. Solution -------- To solve this, an alternative interface has been implemented using the standard SysV IPC "message queue" interface. This is a POSIX standard, and other parts of SysV IPC is already used by Xymon. Operating system configuration ------------------------------ Unfortunately, most systems have default settings for the message queue parameters MSGMNB (total # of bytes allowed in the queue) and MSGMAX (maximum size of a single mssage) settings. E.g. on Linux, defaults for these are 16 kB and 8 Kb, respectively. Since Xymon by default permits status messages of up to 256 kB in size, these settings are inadequate. On Linux, you change the settings via the "sysctl" utility. Most Linux systems have these settings defined in /etc/sysctl.conf, so you add these parameters: kernel.msgmax=262144 kernel.msgmnb=1048576 The "msgmax" setting should match your MAXMSG_STATUS setting in xymonserver.cfg, converted to bytes (MAXMSG_STATUS is in kB, so you must multiply it by 1024 for the kernel.msgmax value). "msgmnb" should be 4 times the msgmax setting. After setting these, either run "sysctl -f /etc/sysctl.conf" or reboot the server to enable the new settings. For other systems, please refer to your OS documentation. Enabling the backfeed queue --------------------------- The backfeed queue is disabled by default. To enable it, add the "--bfq" option to xymond (in your tasks.cfg) and restart Xymon. You can verify that this has been enabled by checking the output from "ipcs -q" - you should see a line with a message queue owned by the Xymon userid: ------ Message Queues -------- key msqid owner perms used-bytes messages 0x0a01205e 98305 xymon 666 0 0 Using the backfeed queue ------------------------ xymond_client and xymonnet will automatically use the backfeed queue, if available. If you have custom scripts or tools running on the Xymon server, then you can send messages into the queue using the standard "xymon" utility. To do so, set the recipient to "0". E.g. xymon 0 "status localhost.test green" will send a status update via the backfeed queue. NOTE: The backfeed queue is "one-way", so it can only be used for "status", "data", "drop" and "rename" messages - i.e., any message where xymond does not return a response. Checking if the queue is used ----------------------------- The "xymond" status page includes statistics on the kinds of messages received by xymond. If the backfeed queue is used, you should see the number reported in the "backfeed messages" line increase. You can also query xymond for "senderstats": This lists the number of connections to xymond from each IP-address. The backfeed queue shows up as IP "0.0.0.0": $ xymon 127.0.0.1 "senderstats" 0.0.0.0 1360796 127.0.0.1 1648 10.0.31.155 1397281 xymon-4.3.28/configure0000775000076400007640000000125312411753520015122 0ustar rpmbuildrpmbuild#!/bin/sh # Configuration script for Xymon. # $Id: configure 7474 2014-09-28 09:39:28Z storner $ BASEDIR="`dirname $0`" TARGET="$1" if test "$TARGET" != ""; then shift; fi # Make sure that all shell-scripts are executable. # Subversion has a habit of exporting without the # execute-bit set. chmod 755 $BASEDIR/configure* $BASEDIR/build/*.sh $BASEDIR/client/*.sh case "$TARGET" in "--client") exec $BASEDIR/configure.client $* ;; "--server"|"") exec $BASEDIR/configure.server $* ;; "--help") echo "To configure a Xymon server: $0 --server" echo "To configure a Xymon client: $0 --client" ;; *) echo "unrecognized $0 target $TARGET" exit 1 ;; esac exit 0 xymon-4.3.28/common/0000775000076400007640000000000013037531513014503 5ustar rpmbuildrpmbuildxymon-4.3.28/common/xymongrep.c0000664000076400007640000002055412611263210016676 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon hosts.cfg file grep'er */ /* */ /* This tool will pick out the hosts from a hosts.cfg file that has one of */ /* the tags given on the command line. This allows an extension script to */ /* deal with only the relevant parts of the hosts.cfg file, instead of */ /* having to parse the entire file. */ /* */ /* Copyright (C) 2003-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: xymongrep.c 7706 2015-10-19 21:54:16Z jccleaver $"; #include #include #include #include #include "version.h" #include "libxymon.h" static char *connstatus = NULL; static char *teststatus = NULL; static char *conncolumn = "conn"; static char *testcolumn = NULL; static void load_hoststatus() { int res; char msg[1024]; sendreturn_t *sres; sprintf(msg, "xymondboard fields=hostname,testname,color test=%s", conncolumn); sres = newsendreturnbuf(1, NULL); res = sendmessage(msg, NULL, XYMON_TIMEOUT, sres); if (res == XYMONSEND_OK) connstatus = getsendreturnstr(sres, 1); if ((res == XYMONSEND_OK) && testcolumn) { sprintf(msg, "xymondboard fields=hostname,testname,color test=%s", testcolumn); res = sendmessage(msg, NULL, XYMON_TIMEOUT, sres); if (res == XYMONSEND_OK) teststatus = getsendreturnstr(sres, 1); } if (res != XYMONSEND_OK) { errprintf("Cannot fetch Xymon status, ignoring --no-down\n"); connstatus = NULL; teststatus = NULL; } freesendreturnbuf(sres); } static int netok(char *netstring, char *curnet, int testuntagged) { return ( (netstring == NULL) || (curnet && netstring && (strcmp(curnet, netstring) == 0)) || (testuntagged && (curnet == NULL)) ); } static int downok(char *hostname, int nodownhosts) { char *mark, *colorstr; int color; if (!nodownhosts) return 1; /* Check if the host is down (i.e. "conn" test is non-green) */ if (!connstatus) return 1; mark = (char *)malloc(strlen(hostname) + strlen(conncolumn) + 4); sprintf(mark, "\n%s|%s|", hostname, conncolumn); colorstr = strstr(connstatus, mark); if (colorstr) { colorstr += strlen(mark); /* Skip to the color data */ } else if (strncmp(connstatus, mark+1, strlen(mark+1)) == 0) { colorstr = connstatus + strlen(mark+1); /* First entry we get */ } xfree(mark); color = (colorstr ? parse_color(colorstr) : COL_GREEN); if ((color == COL_RED) || (color == COL_BLUE)) return 0; /* Check if the test is currently disabled */ if (!teststatus) return 1; mark = (char *)malloc(strlen(hostname) + strlen(testcolumn) + 4); sprintf(mark, "\n%s|%s|", hostname, testcolumn); colorstr = strstr(teststatus, mark); if (colorstr) { colorstr += strlen(mark); /* Skip to the color data */ } else if (strncmp(teststatus, mark+1, strlen(mark+1)) == 0) { colorstr = teststatus + strlen(mark+1); /* First entry we get */ } xfree(mark); color = (colorstr ? parse_color(colorstr) : COL_GREEN); if ((color == COL_RED) || (color == COL_BLUE)) return 0; return 1; } int main(int argc, char *argv[]) { void *hwalk; char *hostsfn = NULL; char *netstring = NULL; char *include2 = NULL; int extras = 1; int testuntagged = 0; int nodownhosts = 0; int loadhostsfromxymond = 0; int onlypreferredentry = 0; char *p; char **lookv; int argi, lookc; strbuffer_t *wantedtags; lookv = (char **)malloc(argc*sizeof(char *)); lookc = 0; conncolumn = xgetenv("PINGCOLUMN"); for (argi=1; (argi < argc); argi++) { if (strcmp(argv[argi], "--debug") == 0) { char *delim = strchr(argv[argi], '='); debug = 1; if (delim) set_debugfile(delim+1, 0); } else if (strcmp(argv[argi], "--help") == 0) { printf("Usage:\n%s [options] test1 [test2] [test3] ... \n", argv[0]); exit(1); } else if (strcmp(argv[argi], "--noextras") == 0) { extras = 0; } else if (strcmp(argv[argi], "--test-untagged") == 0) { testuntagged = 1; } else if (argnmatch(argv[argi], "--no-down")) { char *p; nodownhosts = 1; p = strchr(argv[argi], '='); if (p) testcolumn = strdup(p+1); } else if (strcmp(argv[argi], "--version") == 0) { printf("xymongrep version %s\n", VERSION); exit(0); } else if ((strcmp(argv[argi], "--net") == 0) || (strcmp(argv[argi], "--bbnet") == 0)) { include2 = "netinclude"; onlypreferredentry = 0; } else if ((strcmp(argv[argi], "--web") == 0) || (strcmp(argv[argi], "--bbdisp") == 0)) { include2 = "dispinclude"; onlypreferredentry = 1; } else if (argnmatch(argv[argi], "--hosts=")) { hostsfn = strchr(argv[argi], '=') + 1; } else if (strcmp(argv[argi], "--loadhostsfromxymond") == 0) { loadhostsfromxymond = 1; } else if ((*(argv[argi]) == '-') && (strlen(argv[argi]) > 1)) { fprintf(stderr, "Unknown option %s\n", argv[argi]); } else { lookv[lookc] = strdup(argv[argi]); lookc++; } } lookv[lookc] = NULL; if ((hostsfn == NULL) || (strlen(hostsfn) == 0)) { hostsfn = strdup(xgetenv("HOSTSCFG")); if (!loadhostsfromxymond) { /* The default in load_hostnames is to try xymond first when */ /* hostsfn = xgetenv("HOSTSCFG"), however we don't want that here */ /* unless we're told to explicitly. Thus, copy xymond logic here. */ hostsfn = (char *)realloc(hostsfn, strlen(hostsfn) + 2); memmove(hostsfn+1, hostsfn, strlen(hostsfn)+1); *hostsfn = '!'; } } dbgprintf("Loading host configuration from %s%s\n", (loadhostsfromxymond ? "xymond, failing back to " : ""), hostsfn); load_hostnames(hostsfn, include2, get_fqdn()); if (first_host() == NULL) { errprintf("Cannot load %s, or file is empty\n", hostsfn); exit(3); } /* If we must avoid downed or disabled hosts, let's find out what those are */ if (nodownhosts) load_hoststatus(); /* Each network test tagged with NET:locationname */ p = xgetenv("XYMONNETWORK"); if ((p == NULL) || (strlen(p) == 0)) p = xgetenv("BBLOCATION"); if (p && strlen(p)) netstring = strdup(p); hwalk = first_host(); wantedtags = newstrbuffer(0); while (hwalk) { char hostip[IP_ADDR_STRLEN]; char *curnet = xmh_item(hwalk, XMH_NET); char *curname = xmh_item(hwalk, XMH_HOSTNAME); /* * Only look at the hosts whose NET: definition matches the wanted one. * Must also check if the host is currently down (not responding to ping). * And if the host is OK with knownhost(), because it may be time-limited. */ if (netok(netstring, curnet, testuntagged) && downok(curname, nodownhosts) && knownhost(curname, hostip, GH_IGNORE)) { char *item; clearstrbuffer(wantedtags); for (item = xmh_item_walk(hwalk); (item); item = xmh_item_walk(NULL)) { int i; char *realitem = item + strspn(item, "!~?"); for (i=0; lookv[i]; i++) { char *outitem = NULL; if (lookv[i][strlen(lookv[i])-1] == '*') { if (strncasecmp(realitem, lookv[i], strlen(lookv[i])-1) == 0) { outitem = (extras ? item : realitem); } } else if (strcasecmp(realitem, lookv[i]) == 0) { outitem = (extras ? item : realitem); } if (outitem) { int needquotes = ((strchr(outitem, ' ') != NULL) || (strchr(outitem, '\t') != NULL)); addtobuffer(wantedtags, " "); if (needquotes) addtobuffer(wantedtags, "\""); addtobuffer(wantedtags, outitem); if (needquotes) addtobuffer(wantedtags, "\""); } } } if (STRBUF(wantedtags) && (*STRBUF(wantedtags) != '\0') && extras) { if (xmh_item(hwalk, XMH_FLAG_DIALUP)) addtobuffer(wantedtags, " dialup"); if (xmh_item(hwalk, XMH_FLAG_TESTIP)) addtobuffer(wantedtags, " testip"); } if (STRBUF(wantedtags) && *STRBUF(wantedtags)) { printf("%s %s #%s\n", xmh_item(hwalk, XMH_IP), xmh_item(hwalk, XMH_HOSTNAME), STRBUF(wantedtags)); } } do { hwalk = next_host(hwalk, 1); } while (hwalk && onlypreferredentry && (strcmp(curname, xmh_item(hwalk, XMH_HOSTNAME)) == 0)); } return 0; } xymon-4.3.28/common/xymonlaunch.80000664000076400007640000000552413037531444017152 0ustar rpmbuildrpmbuild.TH XYMONLAUNCH 8 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME xymonlaunch \- Master program to launch other Xymon programs .SH SYNOPSIS .B "xymonlaunch [options]" .SH DESCRIPTION .I xymonlaunch(8) is the main program that controls the execution and scheduling of all of the components in the Xymon system. xymonlaunch allows the administrator to add, remove or change the set of Xymon applications and extensions without restarting Xymon - xymonlaunch will automatically notice any changes in the set of tasks, and change the scheduling of activities accordingly. xymonlaunch also allows the administrator to setup specific logfiles for each component of the Xymon system, instead of getting output from all components logged to a single file. .SH OPTIONS .IP "--env=FILENAME" Loads the environment from FILENAME before starting other tools. The environment defined by FILENAME is the default, it can be overridden by the ENVFILE option in .I tasks.cfg(5) .IP "--config=FILENAME" This option defines the file that xymonlaunch scans for tasks it must launch. A description of this file is in .I tasks.cfg(5) If not specified, files at /etc/tasks.cfg, /etc/xymon/tasks.cfg, and /etc/xymon-client/clientlaunch.cfg are searched for, as well as ~/server/etc/tasks.cfg. .IP "--log=FILENAME" Defines the logfile where xymonlaunch logs information about failures to launch tasks and other data about the operation of xymonlaunch. Logs from individual tasks are defined in the tasks.cfg file. By default this is logged to stdout. .IP "--pidfile=FILENAME" Filename which xymonlaunch saves its own process-ID to. Commonly used by automated start/stop scripts. .IP "--verbose" Logs the launch of all tasks to the logfile. Note that the logfile may become quite large if you enable this. .IP "--dump" Just dump the contents of the tasks.cfg file after parsing it. Used for debugging. .IP "--debug" Enable debugging output while running. .IP "--no-daemon" xymonlaunch normally detaches from the controlling tty and runs as a background task. This option keeps it running in the foreground. .SH STARTING TASKS xymonlaunch will read the configuration file and start all of the tasks listed there. If a task completes abnormally (i.e. terminated by a signal or with a non-zero exit status), then xymonlaunch will attempt to restart it 5 times. If it still will not run, then the task is disabled for 10 minutes. This will be logged to the xymonlaunch logfile. If the configuration file changes, xymonlaunch will re-read it and notice any changes. If a running task was removed from the configuration, then the task is stopped. If a new task was added, it will be started. If the command used for a task changed, or it was given a new environment definition file, or the logfile was changed, then the task is stopped and restarted with the new definition. .SH "SEE ALSO" tasks.cfg(5), xymon(7) xymon-4.3.28/common/xymondigest.10000664000076400007640000000232213037531444017141 0ustar rpmbuildrpmbuild.TH XYMONDIGEST 1 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME xymondigest \- calculate message digests .SH SYNOPSIS .B "xymondigest md5|sha1|sha256|sha512|sha224|sha384|rmd160 [filename]" .SH DESCRIPTION .I xymondigest(1) is a utility to calculate message digests for a file or document. It is used when defining HTTP- or FTP-based content checks, where .I xymonnet(1) checks that a URL returns a specific document; instead of having to compare the entire document, the comparison is done against a pre-computed message digest value using the MD5, RIPEMD160, SHA1 or any of the SHA2 (SHA-512, SHA-256, SHA-384, SHA-224) message digest algorithms. The optional \fBfilename\fR parameter is the input file whose message digest should be calculated; if no filename is given, the data is read from standard input. xymondigest outputs a string containing the digest algorithm and the computed message digest. This is in a format suitable for use in the .I hosts.cfg(5) definition of a content check. .SH EXAMPLE $ xymondigest md5 index.html md5:88b81b110a85c83db56a939caa2e2cf6 $ curl \-s http://www.foo.com/ | xymondigest sha1 sha1:e5c69784cb971680e2c7380138e04021a20a45a2 .SH "SEE ALSO" xymonnet(1), hosts.cfg(5) xymon-4.3.28/common/xymongrep.10000664000076400007640000001061613037531444016624 0ustar rpmbuildrpmbuild.TH XYMONGREP 1 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME xymongrep \- pick out lines in hosts.cfg .SH SYNOPSIS .B "xymongrep \-\-help" .br .B "xymongrep \-\-version" .br .B "xymongrep [\-\-noextras] [\-\-test\-untagged] [\-\-web] [\-\-net] [\-\-loadhostsfromxymond] TAG [TAG...]" .SH DESCRIPTION .I xymongrep(1) is for use by extension scripts that need to pick out the entries in a hosts.cfg file that are relevant to the script. The utility accepts test names as parameters, and will then parse the hosts.cfg file and print out the host entries that have at least one of the wanted tests specified. Tags may be given with a trailing asterisk '*', e.g. "xymongrep http*" is needed to find all http and https tags. The xymongrep utility supports the use of "include" directives inside the hosts.cfg file, and will find matching tags in all included files. If the DOWNTIME or SLA tags are used in the .I hosts.cfg(5) file, these are interpreted relative to the current time. xymongrep then outputs a "INSIDESLA" or "OUTSIDESLA" tag for easier use by scripts that want to check if the current time is inside or outside the expected uptime window. .SH OPTIONS .IP "\-\-noextras" Remove the "testip", "dialup", "INSIDESLA" and "OUTSIDESLA" tags from the output. .IP "\-\-test\-untagged" When using the XYMONNETWORK environment variable to test only hosts on a particular network segment, xymonnet will ignore hosts that do not have any "NET:x" tag. So only hosts that have a NET:$XYMONNETWORK tag will be tested. .br With this option, hosts with no NET: tag are included in the test, so that all hosts that either have a matching NET: tag, or no NET: tag at all are tested. .IP "\-\-no\-down[=TESTNAME]" xymongrep will query the Xymon server for the current status of the "conn" test, and if TESTNAME is specified also for the current state of the specified test. If the status of the "conn" test for a host is non-green, or the status of the TESTNAME test is disabled, then this host is ignored and will not be included in the output. This can be used to ignore hosts that are down, or hosts where the custom test is disabled. .IP "\-\-web" Search the hosts.cfg file following include statements as a Xymon web-server would. .IP "\-\-net" Search the hosts.cfg file following include statements as when running xymonnet. .IP "\-\-loadhostsfromxymond" xymongrep will normally attempt to load the HOSTSCFG file by itself when searching for lines to transmit. If the file is unreadable, it will exit out. With this option, it will query the xymond server (set via the XYMONSERVER environment) for the hosts file. This can be used if you're running this on a client or remote system and can't or don't want to have the hosts.cfg file synchronized across your servers. .SH EXAMPLE If your hosts.cfg file looks like this 192.168.1.1 www.test.com # ftp telnet !oracle 192.168.1.2 db1.test.com # oracle 192.168.1.3 mail.test.com # smtp and you have a custom Xymon extension script that performs the "oracle" test, then running "xymongrep oracle" would yield 192.168.1.1 www.test.com # !oracle 192.168.1.2 db1.test.com # oracle so the script can quickly find the hosts that are of interest. Note that the reverse-test modifier - "!oracle" - is included in the output; this also applies to the other test modifiers defined by Xymon (the dial-up and always-true modifiers). If your extension scripts use more than one tag, just list all of the interesting tags on the command line. xymongrep also supports the "NET:location" tag used by xymonnet, so if your script performs network checks then it will see only the hosts that are relevant for the test location that the script currently executes on. .SH USE IN EXTENSION SCRIPTS To integrate xymongrep into an existing script, look for the line in the script that grep's in the $HOSTSCFG file. Typically it will look somewhat like this: $GREP \-i "^[0\-9].*#.*TESTNAME" $HOSTSCFG | ... code to handle test Instead of the grep, we will use xymongrep. It then becomes $XYMONHOME/bin/xymongrep TESTNAME | ... code to handle test which is simpler, less error-prone and more efficient. .SH ENVIRONMENT VARIABLES .IP XYMONNETWORK If set, xymongrep outputs only lines from hosts.cfg that have a matching NET:$XYMONNETWORK setting. .sp .IP HOSTSCFG Filename for the Xymon .I hosts.cfg(5) file. .SH FILES .IP $HOSTSCFG The Xymon hosts.cfg file .SH "SEE ALSO" hosts.cfg(5), xymonserver.cfg(5) xymon-4.3.28/common/logfetch.10000664000076400007640000000563013037531444016367 0ustar rpmbuildrpmbuild.TH LOGFETCH 1 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME logfetch \- Xymon client data collector .SH SYNOPSIS .B "logfetch [options] CONFIGFILE STATUSFILE" .SH DESCRIPTION \fBlogfetch\fR is part of the Xymon client. It is responsible for collecting data from logfiles, and other file-related data, which is then sent to the Xymon server for analysis. logfetch uses a configuration file, which is automatically retrieved from the Xymon server. There is no configuration done locally. The configuration file is usually stored in the \fB$XYMONHOME/tmp/logfetch.cfg\fR file, but editing this file has no effect since it is re-written with data from the Xymon server each time the client runs. logfetch stores information about what parts of the monitored logfiles have been processed already in the \fB$XYMONHOME/tmp/logfetch.status\fR file. This file is an internal file used by logfetch, and should not be edited. If deleted, it will be re-created automatically. .SH OPTIONS .IP "\-\-debug[=stderr]" Enables debug mode. Note that when run by the xymonclient, debug output may be written into the client data report, which can cause false positives and other unintended side effects. Use '=stderr' to cause the output to be written to stderr instead. .IP "\-\-noexec" The client-local.cfg(5) section for this host, class, or OS is automatically retrieved from the server during client submission. Logfetch can be requested to execute arbitrary commands to generate a list of log files to examine dynamically, but this can present a security risk in some environments. Set this option to prevent logfetch from executing requested commands .SH SECURITY logfetch needs read access to the logfiles it should monitor. If you configure monitoring of files or directories through the "file:" and "dir:" entries in .I client\-local.cfg(5) then logfetch will require at least read-acces to the directory where the file is located. If you request checksum calculation for a file, then it must be readable by the Xymon client user. Do \fBNOT\fR install logfetch as suid-root. There is no way that logfetch can check whether the configuration file it uses has been tampered with, so installing logfetch with suid-root privileges could allow an attacker to read any file on the system by using a hand-crafted configuration file. In fact, logfetch will attempt to remove its own suid-root setup if it detects that it has been installed suid-root. .SH "ENVIRONMENT VARIABLES" .IP DU Command used to collect information about the size of directories. By default, this is the command \fBdu \-k\fR. If the local du-command on the client does not recognize the "\-k" option, you should set the DU environment variable in the \fB$XYMONHOME/etc/xymonclient.cfg\fR file to a command that does report directory sizes in kilobytes. .SH FILES .IP $XYMONHOME/tmp/logfetch.cfg .IP $XYMONHOME/tmp/logfetch.status .SH "SEE ALSO" xymon(7), analysis.cfg(5), client-local.cfg(5) xymon-4.3.28/common/xymon-xmh.50000664000076400007640000001120213037531444016534 0ustar rpmbuildrpmbuild.TH XYMON-XMH 5 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME Xymon-XMH-variables \- Configuration items available online .SH DESCRIPTION The .I hosts.cfg(5) file is the most important configuration file for all of the Xymon programs. This file contains the full list of all the systems monitored by Xymon, including the set of tests and other configuration items stored for each host. Although the file is in text format and can be searched using tools like .I xymongrep(1) it can be difficult to pick out specific fields from the configuration due to quoting and other text parsing issues. So Xymon allows for querying this information directly from the .I xymond daemon via the "xymondboard" command. So the information can be provided together with the current status of a host and/or test. This is done by adding a "fields" definition to the "xymondboard" command. .SH XMH items Except where specified below, all items return the text of a particular setting from the hosts.cfg file, or an empty string if the setting has not been set for the host that is queried. .IP XMH_ALLPAGEPATHS List of all pages where the host is found, using the filename hierarchy page path. .IP XMH_BROWSER Value of the "browser" tag. .IP XMH_CLASS The host "class" (if reported by a Xymon client), or the value of the CLASS tag. .IP XMH_CLIENTALIAS Value of the CLIENT tag. .IP XMH_COMMENT Value of the COMMENT tag. .IP XMH_COMPACT Value of the COMPACT tag. .IP XMH_DEPENDS Value of the DEPENDS tag. .IP XMH_DESCRIPTION Value of the DESCR tag. .IP XMH_DGNAME The text string from the hosts.cfg "group" definition (group, group-only, group-except) in which the host is defined. .IP XMH_DISPLAYNAME Value of the NAME tag. .IP XMH_DOCURL Value of the DOC tag. .IP XMH_DOWNTIME Value of the DOWNTIME tag. .IP XMH_PULLDATA Value of the PULLDATA tag (including IP:PORT, if any) .IP XMH_FLAG_DIALUP Value of the "dialup" tag. .IP XMH_FLAG_HIDEHTTP Value of the HIDEHTTP tag. .IP XMH_FLAG_LDAPFAILYELLOW Value of the "ldapyellowfail" tag. .IP XMH_FLAG_MULTIHOMED Value of the MULTIHOMED tag. .IP XMH_FLAG_NOBB2 Value of the "nobb2" tag (deprecated, use NONONGREEN instead). .IP XMH_FLAG_NOCLEAR Value of the NOCLEAR tag. .IP XMH_FLAG_NOCLIENT Value of the "noclient" tag. .IP XMH_FLAG_NOCONN Value of the "noconn" tag. .IP XMH_FLAG_NODISP Value of the "nodisp" tag. .IP XMH_FLAG_NOINFO Value of the "noinfo" atg. .IP XMH_FLAG_NONONGREEN Value of the "nonongreen" tag. .IP XMH_FLAG_NOPING Value of the "noping" tag. .IP XMH_FLAG_NOSSLCERT Value of the "nosslcert" tag. .IP XMH_FLAG_NOTRACE Value of the "notrace" tag. .IP XMH_FLAG_NOTRENDS Value of the "notrends" tag. .IP XMH_FLAG_PREFER Value of the "prefer" tag. .IP XMH_FLAG_TESTIP Value of the "testip" tag. .IP XMH_FLAG_TRACE Value of the "trace" tag. .IP XMH_GROUPID Number of the group where the host is listed - first group is 0. If a host is present on multiple pages, this is the number of the group for the first page where the host is found. .IP XMH_HOLIDAYS Value of the "holidays" tag. .IP XMH_HOSTNAME The name of the host. .IP XMH_HTTPHEADERS Value of the "httphdr" tag. .IP XMH_IP The IP-address of the host (as specified in hosts.cfg). .IP XMH_LDAPLOGIN Value of the "ldaplogin" tag. .IP XMH_NET Value of the NET tag. .IP XMH_NK Value of the NK tag (deprecated). .IP XMH_NKTIME Value of the NKTIME tag (deprecated). .IP XMH_NOCOLUMNS Value of the NOCOLUMNS tag. .IP XMH_NOPROP Value of the NOPROP tag. .IP XMH_NOPROPACK Value of the NOPROPACK tag. .IP XMH_NOPROPPURPLE Value of the NOPROPPURPLE tag. .IP XMH_NOPROPRED Value of the NOPROPRED tag. .IP XMH_NOPROPYELLOW Value of the NOPROPYELLOW tag. .IP XMH_NOTAFTER Value of the NOTAFTER tag. .IP XMH_NOTBEFORE Value of the NOTBEFORE tag. .IP XMH_OS The host operating system (if reported by a Xymon client), or the value of the OS tag. .IP XMH_PAGEINDEX Index of the host on the page where it is shown, first host has index 0. .IP XMH_PAGENAME Name of the page where the host is shown (see also XMH_PAGEPATH). .IP XMH_PAGEPATH File path to the page where the host is shown. .IP XMH_PAGEPATHTITLE Title of the full path to the page where the host is shown. .IP XMH_PAGETITLE Title of the page where the host is shown. .IP XMH_RAW All configuration settings for the host. Settings are separated by a pipe-sign. .IP XMH_REPORTTIME Value of the REPORTTIME tag. .IP XMH_SSLDAYS Value of the "ssldays" tag. .IP XMH_SSLMINBITS Value of the "sslbits" tag. .IP XMH_TRENDS Value of the TRENDS tag. .IP XMH_WARNPCT Value of the WARNPCT tag. .IP XMH_WARNSTOPS Value of the WARNSTOPS tag. .IP XMH_WML Value of the WML tag. .SH "SEE ALSO" xymon(1), hosts.cfg(5), xymongrep(1) xymon-4.3.28/common/xymonserver.cfg.50000664000076400007640000006472213037531444017746 0ustar rpmbuildrpmbuild.TH XYMONSERVER.CFG 5 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME xymonserver.cfg \- Xymon environment variables .SH DESCRIPTION Xymon programs use multiple environment variables beside the normal set of variables. The environment definitions are stored in the ~Xymon/server/etc/xymonserver.cfg file. Each line in this file is of the form \fBNAME=VALUE\fR and defines one environment variable NAME with the value VALUE. You can also append data to existing variables, using the syntax \fBNAME+=VALUE\fR. VALUE is then appended to the existing value of the NAME variable. If NAME has not been defined, then this acts as if it were a normal definition. .SH ENVIRONMENT AREAS In some cases it may be useful to have different values for an environment variable, depending on where it is used. This is possible by defining variables with an associated "area". Such definitions have the form \fBAREA/NAME=VALUE\fR. E.g. to define a special setup of the XYMSERVERS variable when it is used by an application in the "management" area, you would do this: .IP .nf XYMSERVERS="127.0.0.1" # Default definition management/XYMSERVERS="10.1.0.5" # Definition in the "management" area .fi .LP Areas are invoked by using the "\-\-area" option for all tools, or via the ENVAREA setting in the .I tasks.cfg(5) file. .SH GENERAL SETTINGS .IP XYMONSERVERHOSTNAME The fully-qualified hostname of the server that is running Xymon. .IP XYMONSERVERWWWNAME The hostname used to access this servers' web-pages, used to construct URL's in the Xymon webpages. Default is the XYMONSERVERHOSTNAME. .IP XYMONSERVERIP The public IP-address of the server that is running Xymon. .IP XYMONSERVEROS A name identifying the operating system of the Xymon server. The known names are currently "linux", "freebsd", "solaris", "hpux", "aix" and "osf". .IP FQDN If set to TRUE, Xymon will use fully-qualified hostnames throughout. If set to FALSE, hostnames are stripped of their domain-part before being processed. It is \fBhighly recommended\fR that you keep this set to TRUE. Default: TRUE. .IP XYMONLOGSTATUS Controls how the HTML page for a status log is generated. If set to DYNAMIC, the HTML logs are generated on-demand by the .I svcstatus.cgi(1) script. If set to STATIC, you must activate the .I xymond_filestore(8) module (through an entry in the .I tasks.cfg(5) file) to create and store the HTML logs whenever a status update is received. Setting "XYMONLOGSTATUS=STATIC" is \fBdiscouraged\fR since the I/O load on the Xymon server will increase significantly. .IP PINGCOLUMN Defines the name of the column for "ping" test status. The data from the "ping" test is used internally by Xymon, so it must be defined here so all of the Xymon tools know which column to watch for this data. The default setting is PINGCOLUMN=conn. .IP INFOCOLUMN Defines the name of the column for the "info" pages. .IP TRENDSCOLUMN Defines the name of the column for the RRD graph pages. .IP RRDHEIGHT The default height (in pixels) of the RRD graph images. Default: 120 pixels. .IP RRDWIDTH The default width (in pixels) of the RRD graph images. Default: 576 pixels. .IP RRDGRAPHOPTS Extra options for the RRD graph command. These are passed directly to the "rrdgraph" command used to generate graphs, see the .I rrdgraph(1) man-page for details of the options. .IP TRENDSECONDS The graphs on the "trends" page show data for the past TRENDSECONDS seconds. Default: 172800 seconds, i.e. 48 hours. .IP HTMLCONTENTTYPE The Content-type reported by the CGI scripts that generate web pages. By default, this it "text/html". If you have on-line help texts in character sets other than the ISO\-8859\-1 (western european) character set, it may be necessary to modify this to include a character set. E.g. .br HTMLCONTENTTYPE="text/html; charset=euc\-jp" .br for a Japanese character sets. Note: Some webservers will automatically add this, if configured to do so. .IP XYMWEBREFRESH The default HTTP page reload interval for many xymongen and status pages. Note that while this can be overridden in the header template files for regular pages, dynamically generated status logs displayed with svcstatus.cgi(1) use this value in the HTTP response header and for security reasons the value in hostsvc_header may be ignored on many modern browsers. (default [seconds]: 60) .IP HOLIDAYS Defines the default set of holidays used if there is no "holidays" tag for a host in the hosts.cfg file. Holiday sets are defined in the .I holidays.cfg(5) file. If not defined, only the default holidays (those defined outside a named holiday set) will be considered as holidays. .IP WEEKSTART Defines which day is the first day of the week. Set to "0" for Sunday, "1" for Monday. Default: 1 (Monday). .IP XYMONBODYHEADER Text that is included in the Xymon web pages at the location specified by ~xymon/server/web/*_header templates. If this is set to a value beginning with "file:", then the contents of the specified file is included. Default: "file:$XYMONHOME/etc/xymonmenu.cfg" .IP XYMONBODYFOOTER Text that is included in the Xymon web pages at the location specified by ~xymon/server/web/*_footer templates. If this is set to a value beginning with "file:", then the contents of the specified file is included. Default: Empty. .IP XYMONBODYMENUCSS URL for the Xymon menu CSS file. Default: "$XYMONMENUSKIN/xymonmenu.css" .IP HOSTPOPUP Determines what is used as the host comment on the webpages. The comment by default appears as a pop-up when the mouse hovers over the hostname, and is also shown on the "info" status page. This setting must be one or more of the letters "C" (COMMENT), "D" (DESCRIPTION) or "I" (IP-address). Including "C" uses the COMMENT setting for the host, including "D" uses the DESCR setting for the host, and "I" uses the IP-address of the host. If more than one of these is set, then COMMENT takes precedence over DESCR which again has precence over IP. Note that DESCR and IP only appear in pop-up windows (if enabled), whereas the COMMENT is always used - if pop-up's have been disabled, then the COMMENT value is displayed next to the hostname on the webpages. Default: CDI .IP STATUSLIFETIME The number of minutes that a status is considered valid after an update. After this time elapses, the status will go purple. Default: 30 minutes .SH DIRECTORIES .IP XYMONSERVERROOT The top-level directory for the Xymon installation. The default is the home-directory for the user running Xymon. .IP XYMONSERVERLOGS The directory for the Xymon's own logfiles (NOT the status-logs from the monitored hosts). .IP XYMONHOME The Xymon server directory, where programs and configurations are kept. Default: $XYMONSERVERROOT/server/ . .IP XYMONTMP Directory used for temporary files. Default: $XYMONHOME/tmp/ .IP XYMONWWWDIR Directory for Xymon webfiles. The $XYMONWEB URL must map to this directory. Default: $XYMONHOME/www/ .IP XYMONNOTESDIR Directory for Xymon notes-files. The $XYMONNOTESSKIN URL must map to this directory. Default: $XYMONHOME/www/notes/ .IP XYMONREPDIR Directory for Xymon availability reports. The $XYMONREPURL URL must map to this directory. Note also that your webserver must have write-access to this directory, if you want to use the .I report.cgi(1) CGI script to generate reports on-demand. Default: $XYMONHOME/www/rep/ .IP XYMONSNAPDIR Directory for Xymon snapshots. The $XYMONSNAPURL URL must map to this directory. Note also that your webserver must have write-access to this directory, if you want to use the .I snapshot.cgi(1) CGI script to generate snapshots on-demand. Default: $XYMONHOME/www/snap/ .IP XYMONVAR Directory for all data stored about the monitored items. Default: $XYMONSERVERROOT/data/ .IP XYMONRAWSTATUSDIR Directory for storing the raw status-logs. Not used unless "xymond_filestore \-\-status" is running, which is \fBdiscouraged\fR since it increases the load on the Xymon server significantly. Default: $XYMONVAR/logs/ .IP XYMONHTMLSTATUSDIR Directory for storing HTML status-logs. Not used unless "xymond_filestore \-\-status \-\-html" is running, which is \fBdiscouraged\fR since it increases the load on the Xymon server significantly. Default: $XYMONHOME/www/html/ .IP XYMONHISTDIR Directory for storing the history of monitored items. Default: $XYMONVAR/hist/ .IP XYMONHISTLOGS Directory for storing the detailed status-log of historical events. Default: $XYMONVAR/histlogs/ .IP XYMONACKDIR Directory for storing information about alerts that have been acknowledged. Default: $XYMONVAR/acks/ .IP XYMONDISABLEDDIR Directory for storing information about tests that have been disabled. Default: $XYMONVAR/disabled/ .IP XYMONDATADIR Directory for storing incoming "data" messages. Default: $XYMONVAR/data/ .IP XYMONRRDS Top-level directory for storing RRD files (the databases with trend-information used to generate graphs). Default: $XYMONVAR/rrd/ .IP CLIENTLOGS Directory for storing the data sent by a Xymon client around the time a status changes to a warning (yellow) or critical (red) state. Used by the .I xymond_hostdata(8) module. Default: $XYMONVAR/hostdata/ .IP XYMONCGILOGDIR Directory where debug output from CGI applications are stored. If not specified, it defaults to $XYMONSERVERLOGS, but this is often a directory that is not writable by the userid running the CGI applications. It is therefore recommended when using "\-\-debug" on CGI applications that you create a separate directory owned by the user running your webserver, and point XYMONCGILOGDIR to this directory. .SH SYSTEM FILES .IP HOSTSCFG Full path to the Xymon .I hosts.cfg(5) configuration file. Default: $XYMONHOME/etc/hosts.cfg. .IP XYMON Full path to the .I xymon(1) client program. Default: $XYMONHOME/bin/xymon. .IP XYMONGEN Full path to the .I xymongen(1) webpage generator program. Default: $XYMONHOME/bin/xymongen. .SH URLS .IP XYMONSERVERWWWURL The root URL for the Xymon webpages, without the hostname. This URL must be mapped to the ~/server/www/ directory in your webserver configuration. See the sample Apache configuration in ~/server/etc/xymon\-apache.conf. .IP XYMONSERVERCGIURL The root URL for the Xymon CGI-scripts, without the hostname. This directory must be mapped to the ~/cgi\-bin/ directory in your webserver configuration, and must be flagged as holding executable scripts. See the sample Apache configuration in ~/server/etc/xymon\-apache.conf. .IP XYMONWEBHOST Initial part of the Xymon URL, including just the protocol and the hostname, e.g. "http://www.foo.com" .IP XYMONWEBHOSTURL Prefix for all of the static Xymon webpages, e.g. "http://www.foo.com/xymon" .IP XYMONWEBHTMLLOGS URL prefix for the static HTML status-logs generated when XYMONLOGSTATUS=STATIC. Note that this setting is \fBdiscouraged\fR so this setting should not be used. .IP XYMONWEB URL prefix (without hostname) of the Xymon webpages. E.g. "/xymon". .IP XYMONSKIN URL prefix (without hostname) of the Xymon graphics. E.g. "/xymon/gifs". .IP XYMONHELPSKIN URL prefix (without hostname) of the Xymon on-line help files. E.g "/xymon/help". .IP XYMONMENUSKIN URL prefix (without hostname) of the Xymon menu files. E.g "/xymon/menu". .IP XYMONNOTESSKIN URL prefix (without hostname) of the Xymon on-line notes files. E.g "/xymon/notes". .IP XYMONREPURL URL prefix (without hostname) of the Xymon availability reports. E.g. "/xymon/rep". .IP XYMONSNAPURL URL prefix (without hostname) of the Xymon snapshots. E.g. "/xymon/snap". .IP XYMONWAP URL prefix (without hostname) of the Xymon WAP/WML files. E.g. "/xymon/wml". .IP CGIBINURL URL prefix (without hostname) of the Xymon CGI-scripts. Default: $XYMONSERVERCGIURL . .IP COLUMNDOCURL Format string used to build a link to the documentation for a column heading. Default: "$CGIBINURL/columndoc.sh?%s", which causes links to use the .I columndoc.sh(1) script to document a column. .IP HOSTDOCURL Format string used to build a link to the documentation for a host. If not set, then Xymon falls back to scanning the XYMONNOTES directory for files matching the hostname, or the hostname together with a common filename extension (.php, .html, .doc and so on). If set, this string becomes a formatting string for the documentation URL. E.g. for the host "myhost", a setting of HOSTDOCURL="/docs/%s.php" will generate a link to "/docs/myhost.php". Default: Not set, so host documentation will be retrieved from the XYMONNOTES directory. .SH SETTINGS FOR SENDING MESSAGES TO XYMON .IP XYMSRV The IP-address used to contact the .I xymond(8) service. Used by clients and the tools that perform network tests. Default: $XYMONSERVERIP .IP XYMSERVERS List of IP-addresses. Clients and network test tools will try to send status reports to a Xymon server running on each of these addresses. This setting is only used if XYMSRV=0.0.0.0. .IP XYMONDPORT The portnumber for used to contact the .I xymond(8) service. Used by clients and the tools that perform network tests. Default: 1984. .IP MAXMSGSPERCOMBO The maximum number of status messages to combine into one combo message. Default: 100. .IP SLEEPBETWEENMSGS Length of a pause introduced between each successive transmission of a combo-message by xymonnet, in microseconds. Default: 0 (send messages as quickly as possible). .SH XYMOND SETTINGS .IP ALERTCOLORS Comma-separated list of the colors that may trigger an alert-message. The default is "red,yellow,purple". Note that alerts may further be generated or suppresed based on the configuration in the .I alerts.cfg(5) file. .IP OKCOLORS Comma-separated list of the colors that may trigger a recovery-message. The default is "green,clear,blue". .IP ALERTREPEAT How often alerts get repeated while a status is in an alert state. This is the default setting, which may be changed in the .I alerts.cfg(5) file. .IP MAXMSG_STATUS The maximum size of a "status" message in kB, default: 256. Status messages are the ones that end up as columns on the web display. The default size should be adequate in most cases, but some extension scripts can generate very large status messages - close to 1024 kB. You should only change this if you see messages in the xymond log file about status messages being truncated. .IP MAXMSG_CLIENT The maximum size of a "client" message in kB, default: 512. "client" messages are generated by the Xymon client, and often include large process-listings. You should only change this if you see messages in the xymond log file about client messages being truncated. .IP MAXMSG_DATA The maximum size of a "data" message in kB, default: 256. "data" messages are typically used for client reports of e.g. netstat or vmstat data. You should only change this setting if you see messages in the xymond log file about data messages being truncated. .IP MAXMSG_NOTES The maximum size of a "notes" message in kB, default: 256. "notes" messages provide a way for uploading documentation about a host to Xymon; it is not enabled by default. If you want to upload large documents, you may need to change this setting. .IP MAXMSG_STACHG The maximum size of a "status change" message in kB, default: Current value of the MAXMSG_STATUS setting. Status-change messages occur when a status changes color. There is no reason to change this setting. .IP MAXMSG_PAGE The maximum size of a "page" message in kB, default: Current value of the MAXMSG_STATUS setting. "page" messages are alerts, and include the status message that triggers the alert. There is no reason to change this setting. .IP MAXMSG_ENADIS The maximum size of an "enadis" message in kB, default: 32. "enadis" are small messages used when enabling or disabling hosts and tests, so the default size should be adequate. .IP MAXMSG_CLICHG The maximum size of a "client change" message in kB, default: Current value of the MAXMSG_CLIENT setting. Client-change messages occur when a status changes color to one of the alert-colors, usually red, yellow and purple. There is no reason to change this setting. .IP MAXMSG_USER The maximum size of a "user" message in kB, default: 128. "user" messages are for communication between custom Xymon modules you have installed, it is not used directly by Xymon. .SH XYMOND_HISTORY SETTINGS .IP XYMONALLHISTLOG If set to TRUE, .I xymond_history(8) will update the $XYMONHISTDIR/allevents file logging all changes to a status. The allevents file is used by the .I eventlog.cgi(1) tool to show the list of recent events on the "All non-green" webpage. .IP XYMONHOSTHISTLOG If set to TRUE, .I xymond_history(8) will update the host-specific eventlog that keeps record of all status changes for a host. This logfile is not used by any Xymon tool. .IP SAVESTATUSLOG If set to TRUE, .I xymond_history(8) will save historical detailed status-logs to the $XYMONHISTLOGS directory. .SH XYMOND_ALERT SETTINGS .IP MAIL Command used to send alerts via e-mail, including a "Subject:" header in the mail. Default: "mail \-s" .IP MAILC Command used to send alerts via e-mail in a form that does not have a "Subject" in the mail. Default: "mail" .IP SVCCODES Maps status-columns to numeric service-codes. The numeric codes are used when sending an alert using a script, where the numeric code of the service is provided in the BBSVCNUM variable. .SH XYMOND_RRD SETTINGS .IP TEST2RRD List of "COLUMNNAME[=RRDSERVICE]" settings, that define which status- and data-messages have a corresponding RRD graph. You will normally not need to modify this, unless you have added a custom TCP-based test to the protocols.cfg file, and want to collect data about the response-time, OR if you are using the .I xymond_rrd(8) external script mechanism to collect data from custom tests. Note: All TCP tests are automatically added. .IP GRAPHS_ List of GRAPHs that should be displayed on the corresponding colmn page. Note this will override the default, so to add multiple graphs you should include the original one (e.g. GRAPHS_cpu="la,vmstat1"). These are used together by the .I svcstatus.cgi(1) script to determine if the detailed status view of a test should include a graph. .IP GRAPHS List of the RRD databases, that should be shown as a graph on the "trends" column. .IP NORRDDISKS This is used to disable the tracking of certain filesystems. By default all filesystems reported by a client are tracked. In some cases you may want to disable this for certain filesystems, e.g. database filesystems since they are always completely full. This setting is a regular expression that is matched against the filesystem name (the Unix mount-point, or the Windows disk-letter) - if the filesystem name matches this expression, then it will not be tracked by Xymon. .br Note: Setting this does not affect filesystems that are already being tracked by Xymon - to remove them, you must remove the RRD files for the unwanted filesystems from the ~xymon/data/rrd/HOSTNAME/ directory. .IP RRDDISKS This is used to enable tracking of only selected filesystems (see the NORRDDISKS setting above). By default all filesystems are being tracked, setting this changes that default so that only those filesystems that match this pattern will be tracked. .SH XYMONNET NETWORK TEST SETTINGS .IP XYMONNETWORK If this variable is defined, then only the hosts that have been tagged with "NET:$XYMONNETWORK" will be tested by the xymonnet tool. .IP CONNTEST If set to TRUE, the connectivity (ping) test will be performed. .IP IPTEST_2_CLEAR_ON_FAILED_CONN If set to TRUE, then failing network tests go CLEAR if the conn-test fails. .IP NONETPAGE List of network services (separated with ) that should go yellow upon failure instead of red. .IP XYMONROUTERTEXT When using the "router" or "depends" tags for a host, a failure status will include text that an "Intermediate router is down". With todays network topologies, the router could be a switch or another network device; if you define this environment variable the word "router" will be replaced with whatever you put into the variable. So to inform the users that an intermediate switch or router is down, use XYMONROUTERTEXT="switch or router". This can also be set on a per-host basis using the "DESCR:hosttype:description" tag in the .I hosts.cfg(5) file. .IP NETFAILTEXT When a network test fails, the status message reports "SERVICENAME not OK". The "not OK" message can be changed via this variable, e.g. you can change it to "FAILED" or customize it as you like. .IP FPING The command used to run the .I xymonping(1) tool for the connectivity test. (The name FPING is due to the fact that the "fping" utility was used until Xymon version 4.2). This may include suid-root wrappers and xymonping options. Default: "xymonping" .IP FPINGOPTS Options used for the .I fping(1) or .I xymonping(1) tool for the connectivity test. Note that xymonnet will still expect the output to match the default format. Default: "-Ae" .IP TRACEROUTE .IP TRACEROUTEOPTS Defines the location of the "traceroute" tool and any options needed to run it. traceroute is used by the connectivity test when the ping test fails; if requested via the "trace" tag, the TRACEROUTE command is executed to try to indicate the point in the network that is causing the problem. For backwards compatibility, with prior versions, if TRACEROUTEOPTS is unset, TRACEROUTE is assumed to have whatever options are desired and no addl options are used. Recommended defaults are: "\-n \-q 2 \-w 2 \-m 15" (no DNS lookup, max. 2 probes, wait 2 seconds per hop, max 15 hops). .sp If you have the .I mtr(8) tool installed - available from http://www.bitwizard.nl/mtr/ - I strongly recommend using this instead. The recommended TRACEROUTEOPTS for mtr are "\-c 2 \-n \-\-report" Note that mtr needs to be installed suid-root on most systems. .IP NTPDATE Defines the .I ntpdate(1) program used for the "ntp" test. Default: "ntpdate" .IP NTPDATEOPTS Options used for the .I ntpdate(1) program. Default: "\-u \-q \-p 1" .IP RPCINFO Defines the .I rpcinfo(8) program used for "rpc" tests. Default: "rpcinfo" .SH XYMONGEN WEBPAGE GENERATOR SETTINGS .IP XYMONLOGO HTML code that is inserted on all standard headers. The default is to add the text "Xymon" in the upper-left corner of the page, but you can easily replace this with e.g. a company logo. If you do, I suggest that you keep it at about 30-35 pixels high, and 100-150 pixels wide. .IP XYMONPAGELOCAL The string "Pages hosted locally" that appears above all of the pages linked from the main Xymon webpage. .IP XYMONPAGESUBLOCAL The string "Subpages hosted locally" that appears above all of the sub-pages linked from pages below the main Xymon webpage. .IP XYMONPAGEREMOTE The string "Remote status display" that appears about the summary statuses displayed on the min Xymon webpage. .IP XYMONPAGETITLE HTML tags designed to go in a tag, to choose the font for titles of the webpages. .IP XYMONPAGEROWFONT HTML tags designed to go in a tag, to choose the font for row headings (hostnames) on the webpages. .IP XYMONPAGECOLFONT HTML tags designed to go in a tag, to chose the font for column headings (test names) on the webpages. .IP XYMONPAGEACKFONT HTML tags designed to go in a tag, to chose the font for the acknowledgement text displayed on the status-log HTML page for an acknowledged status. .IP ACKUNTILMSG When displaying the detailed status of an acknowledged test, Xymon will include the time that the acknowledge expires using the print-format defined in this setting. You can define the timeformat using the controls in your systems .I strftime(3) routine, and add the text suitable for your setup. .IP ACK_COOKIE_EXPIRATION The valid length of an acknowledgement cookie. You want to set this large enough so that a late-answered acknowledgement for an alert is still processed properly. Default value: 86400 .IP XYMONDATEFORMAT On webpages generated by xymongen, the default header includes the current date and time. Normally this looks like "Tue Aug 24 21:59:47 2004". The XYMONDATEFORMAT controls the format of this timestamp - you can define the format using the controls in the .I strftime(3) routine. E.g. to have it show up as "2004\-08\-24 21:59:47 +0200" you would set XYMONDATEFORMAT="%Y\-%m\-%d %H:%M:%S %z" .IP HOLIDAYFORMAT How holiday dates are displayed. The default is "%d/%m" which show the day and month. American users may want to change this to "%m/%d" to suit their preferred date-display style. This is a formatting string for the system .I strftime(3) routine, so any controls available for this routine may be used. .IP XYMONPAGECOLREPEAT Inspired by Jeff Stoner's col_repeat_patch.tgz patch, this defines the maximum number of rows before repeating the column headings on a webpage. This sets the default value for the .I xymongen(1) "\-\-maxrows" option; if the command-line option is also specified, then it overrides this environment variable. Note that unlike Jeff's patch, xymongen implements this for both the "All non-green" page and all other pages (xymon.html, subpages, critical.html). .IP SUMMARY_SET_BKG If set to TRUE, then summaries will affect the color of the main Xymon webpage. Default: FALSE. .IP DOTHEIGHT The height (in pixels) of the icons showing the color of a status. Default: 16, which matches the default icons. .IP DOTWIDTH The width (in pixels) of the icons showing the color of a status. Default: 16, which matches the default icons. .IP CLIENTSVCS List of the status logs fed by data from the Xymon client. These status logs will - if there are Xymon client data available for the host - include a link to the raw data sent by the client. Default: cpu,disk,memory,procs,svcs. .IP XYMONRSSTITLE If defined, this is the title of the RSS/RDF documents generated when .I xymongen(1) is invoked with the "\-\-rss" option. The default value is "Xymon Alerts". .IP WMLMAXCHARS Maximum size of a WAP/WML output "card" when generating these. Default: 1500. .IP XYMONNONGREENEXT List of scripts to run as extensions to the "All non-green" page. Note that two scripts, "eventlog.sh" and "acklog.sh" are handled specially: They are handled internally by xymongen, but the script names must be listed in this variable for this function to be enabled. .IP XYMONHISTEXT List of scripts to run as extensions to a history page. .IP XYMONREPWARN Default threshold for listing the availability as "critical" (red) when generating the availability report. This can be set on a per-host basis with the WARNPCT setting in .I hosts.cfg(5). Default: 97 (percent) .IP XYMONGENREPOPTS Default xymongen options used for reports. This will typically include such options as "\-\-subpagecolumns", and also "\-\-ignorecolumns" if you wish to exclude certain tests from reports by default. .IP XYMONGENSNAPOPTS Default xymongen options used by snapshots. This should be identical to the options you normally used when building Xymon webpages. .SH FILES .BR "~xymon/server/etc/xymonserver.cfg" .SH "SEE ALSO" xymon(7) xymon-4.3.28/common/tasks.cfg.50000664000076400007640000001234613037531444016465 0ustar rpmbuildrpmbuild.TH TASKS.CFG 5 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME tasks.cfg \- Task definitions for the xymonlaunch utility .SH SYNOPSIS .B ~xymon/server/etc/tasks.cfg .SH DESCRIPTION The tasks.cfg file holds the list of tasks that xymonlaunch runs to perform all of the tasks needed by the Xymon monitor. .SH FILE FORMAT A task is defined by a \fBkey\fR, a \fBcommand\fR, and optionally also \fBinterval\fR, \fBenvironment\fR, and \fBlogfile\fR. Blank lines and lines starting with a hash mark (#) are treated as comments and ignored. Long lines can be broken up by putting a backslash at the end of the line and continuing the entry on the next line. An entry looks like this: .sp [xymond] .br ENVFILE /usr/local/xymon/server/etc/xymonserver.cfg .br CMD /usr/local/xymon/server/bin/xymond .sp [updateweb] .br ENVFILE /usr/local/xymon/server/etc/xymonserver.cfg .br CMD /usr/local/xymon/server/bin/xymongen .br NEEDS xymond .br GROUP webupdates .br INTERVAL 5m .br ONHOST localhost .br MAXTIME 10m .br LOGFILE /var/log/xymon/updateweb.log .sp [monthlyreport] .br ENVFILE /usr/local/xymon/server/etc/xymonserver.cfg .br CMD /usr/local/xymon/server/ext/monthlyreport.sh .br CRONDATE 30 4 1 * * .sp The \fBkey\fR is enclosed in angle brackets, and must be unique for each task. You can choose your key-names as you like, they are only used internally in xymonlaunch to identify each task. The \fBcommand\fR is defined by the \fbCMD\fR keyword. This is the full command including any options you want to use for this task. This is required for all tasks. The \fBDISABLED\fR keyword means that this command is disabled. xymonlaunch will not start this task. It is recommended that you use this to disable standard tasks, instead of removing them or commenting them out. Upgrades to Xymon will add standard tasks back into the file, so unless you have them listed as DISABLED then tasks may re-appear unexpectedly after an upgrade. There is also a corresponding \fBENABLED\fR keyword, to explicitly enable a task. The \fBONHOST\fR keyword tells xymonlaunch that this task should only run on specific hosts. After the ONHOST keyword, you must provide a "regular expression"; if the hostname where xymonlaunch runs matches this expression, then the task will run. If it doesn't match, then the task is treated as if it were DISABLED. The \fBMAXTIME\fR keyword sets a maximum time that the task may run; if exceeded, xymonlaunch will kill the task. The time is in seconds by default, you can specify minutes, hours or days by adding an "m", "h" or "d" after the number. By default there is no upper limit on how long a taskmay run. The \fBNEEDS\fR instructs xymonlaunch not to run this task unless the task defined by the NEEDS keyword is already running. This is used e.g. to delay the start of some application until the needed daemons have been started. The task that must be running is defined by its \fBkey\fR. The \fBGROUP\fR keyword can be used to limit the number of tasks that may run simultaneously. E.g. if you are generating multiple pagesets of webpages, you don't want them to run at the same time. Putting them into a GROUP will cause xymonlaunch to delay the start of new tasks, so that only one task will run per group. You can change the limit by defining the group before the tasks, with a "GROUP groupname maxtasks" line. The \fBINTERVAL\fR keyword defines how often this command is executed. The example shows a command that runs every 5 minutes. If no interval is given, the task is only run once - this is useful for tasks that run continually as daemons - although if the task stops for some reason, then xymonlaunch will attempt to restart it. Intervals can be specified in seconds (if you just put a number there), or in minutes (5m), hours (2h), or days (1d). The \fBCRONDATE\fR keyword is used for tasks that must run at regular intervals or at a specific time. The time specification is identical to the one used by cron in .I crontab(5) entries, i.e. a sequence of numbers for minute, hour, day-of-month, month and day-of-week. Three-letter abbreviations in english can be used for the month and day-of-week fields. An asterisk is a wildcard. So in the example above, this job would run once a month, at 4:30 AM on the 1st day of the month. The \fBENVFILE\fR setting points to a file with definitions of environment variables. Before running the task, xymonlaunch will setup all of the environment variables listed in this file. Since this is a per-task setting, you can use the same xymonlaunch instance to run e.g. both the server- and client-side Xymon tasks. If this option is not present, then the environment defined to xymonlaunch is used. The \fBENVAREA\fR setting modifies which environment variables are loaded, by picking up the ones that are defined for this specific "area". See .I xymonserver.cfg(5) for information about environment areas. The \fBLOGFILE\fR setting defines a logfile for the task. xymonlaunch will start the task with stdout and stderr redirected to this file. If this option is not present, then the output goes to the same location as the xymonlaunch output. .SH "SEE ALSO" xymonlaunch(8), xymond(8), crontab(5), xymon(7) xymon-4.3.28/common/xymoncfg.c0000664000076400007640000000567412004254623016512 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon config file viewer */ /* */ /* Copyright (C) 2003-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: xymoncfg.c 7126 2012-07-26 14:52:03Z storner $"; #include #include #include #include #include "version.h" #include "libxymon.h" int main(int argc, char *argv[]) { FILE *cfgfile; char *fn = NULL; strbuffer_t *inbuf; int argi; char *include2 = NULL; enum { S_NONE, S_KSH, S_CSH } shelltype = S_NONE; char *p; for (argi=1; (argi < argc); argi++) { if (strcmp(argv[argi], "--version") == 0) { printf("xymoncfg version %s\n", VERSION); exit(0); } else if (strcmp(argv[argi], "--help") == 0) { printf("Usage:\n%s [filename]\n", argv[0]); exit(0); } else if ((strcmp(argv[argi], "--net") == 0) || (strcmp(argv[argi], "--bbnet") == 0)) { include2 = "netinclude"; } else if ((strcmp(argv[argi], "--web") == 0) || (strcmp(argv[argi], "--bbdisp") == 0)) { include2 = "dispinclude"; } else if (strcmp(argv[argi], "-s") == 0) { shelltype = S_KSH; } else if (strcmp(argv[argi], "-c") == 0) { shelltype = S_CSH; } else if (*argv[argi] != '-') { fn = strdup(argv[argi]); } } if (!fn || (strlen(fn) == 0)) { fn = getenv("HOSTSCFG"); if (!fn) { errprintf("Environment variable HOSTSCFG is not set - aborting\n"); exit(2); } } cfgfile = stackfopen(fn, "r", NULL); if (cfgfile == NULL) { printf("Cannot open file '%s'\n", fn); exit(1); } inbuf = newstrbuffer(0); while (stackfgets(inbuf, include2)) { switch (shelltype) { case S_NONE: printf("%s", STRBUF(inbuf)); break; case S_KSH: sanitize_input(inbuf, 1, 0); p = STRBUF(inbuf) + strspn(STRBUF(inbuf), "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"); if (*p == '=') { char *val = p+1; *p = '\0'; p = val + strcspn(val, "\r\n"); *p = '\0'; printf("%s=%s;export %s\n", STRBUF(inbuf), val, STRBUF(inbuf)); } break; case S_CSH: sanitize_input(inbuf, 1, 0); p = STRBUF(inbuf) + strspn(STRBUF(inbuf), "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"); if (*p == '=') { char *val = p+1; *p = '\0'; p = val + strcspn(val, "\r\n"); *p = '\0'; printf("setenv %s %s\n", STRBUF(inbuf), val); } break; } } stackfclose(cfgfile); freestrbuffer(inbuf); return 0; } xymon-4.3.28/common/clientupdate.10000664000076400007640000001111413037531444017247 0ustar rpmbuildrpmbuild.TH CLIENTUPDATE 1 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME clientupdate \- Xymon client update utility .SH SYNOPSIS .B "clientupdate [options]" .SH DESCRIPTION \fBclientupdate\fR is part of the Xymon client. It is responsible for updating an existing client installation from a central repository of client packages stored on the Xymon server. When the Xymon client sends a normal client report to the Xymon server, the server responds with the section of the .I client\-local.cfg(5) file that is relevant to this client. Included in this may be a "clientversion" value. The clientversion received from the server is compared against the current clientversion installed on the client, as determined by the contents of the $XYMONHOME/etc/clientversion.cfg file. If the two versions are not identical, clientupdate is launched to update the client installation. .SH OPTIONS .IP "\-\-level" Report the current clientversion. .IP "\-\-update=NEWVERSION" Attempt to update the client to NEWVERSION by fetching this version of the client software from the Xymon server. .IP "\-\-reexec" Used internally during the update process, see \fBOPERATION\fR below. .IP "\-\-remove\-self" Used internally during the update process. This option causes the running clientupdate utility to delete itself - it is used during the update to purge a temporary copy of the clientupdate utility that is installed in $XYMONTMP. .SH USING CLIENTUPDATE IN XYMON To manage updating clients without having to logon to each server, you can use the clientupdate utility. This is how you setup the release of a new client version. .IP "Create the new client" Setup the new client $XYMONHOME directory, e.g. by copying an existing client installation to an empty directory and modifying it for your needs. It is a good idea to delete all files in the tmp/ and logs/ directories, since there is no need to copy these over to all of the clients. Pay attention to the etc/ files, and make sure that they are suitable for the systems where you want to deploy this new client. You can add files - e.g. extension scripts in the ext/ directory - but the clientupdate utility cannot delete or rename files. .IP "Package the client" When your new client software is ready, create a tar-file of the new client. All files in the tar archive must have file names relative to the clients' $XYMONHOME (usually, ~xymon/client/). Save the tar file on the Xymon server in ~xymon/server/download/somefile.tar. Don't compress it. It is recommended that you use some sort of operating-system and version-numbering scheme for the filename, but you can choose whatever filename suits you - the only requirement is that it must end with ".tar". The part of the filename preceding ".tar" is what Xymon will use as the "clientversion" ID. .IP "Configure which hosts receive the new client" In the .I client\-local.cfg(5) file, you must now setup a \fBclientversion:ID\fR line where the \fBID\fR matches the filename you used for the tar-file. So if you have packaged the new client into the file \fBlinux.v2.tar\fR, then the corresponding entry in client\-local.cfg would be \fBclientversion:linux.v2\fR. .IP "Wait for xymond to reload client\-local.cfg" xymond will automatically reload the client\-local.cfg file after at most 10 minutes. If you want to force an immediate reload, send a SIGHUP signal to the xymond process. .IP "Wait for the client to update" The next time the client contacts the Xymon server to send the client data, it will notice the new clientversion setting in client\-local.cfg, and will run \fBclientupdate\fR to install the new client software. So when the client runs the next time, it will use the new client software. .SH OPERATION \fBclientupdate\fR runs in two steps: .IP "Re-exec step" The first step is when clientupdate is first invoked from the xymonclient.sh script with the "\-\-re\-exec" option. This step copies the clientupdate program from $XYMONHOME/bin/ to a temporary file in the $XYMONTMP directory. This is to avoid conflicts when the update procedure installs a new version of the clientupdate utility itself. Upon completion of this step, the clientupdate utility automatically launches the next step by running the program from the file in $XYMONTMP. .IP "Update step" The second step downloads the new client software from the Xymon server. The new software must be packed into a tar file, which clientupdate then unpacks into the $XYMONHOME directory. .SH "ENVIRONMENT VARIABLES" clientupdate uses several of the standard Xymon environment variables, including \fBXYMONHOME\fR and \fBXYMONTMP\fR. .SH "SEE ALSO" xymon(7), xymon(1), client\-local.cfg(5) xymon-4.3.28/common/xymoncmd.c0000664000076400007640000001150412610564002016501 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon application launcher. */ /* */ /* This is used to launch a single Xymon application, with the environment */ /* that would normally be established by xymonlaunch. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: xymoncmd.c 7696 2015-10-18 00:29:54Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include "libxymon.h" #ifdef HAVE_UNAME #include #endif static void xymon_default_envs(char *envfn) { FILE *fd; char buf[1024]; char *evar; char *homedir, *p; int hasuname = 0; #ifdef HAVE_UNAME struct utsname u_name; #endif #ifdef HAVE_UNAME hasuname = (uname(&u_name) != -1); if (!hasuname) errprintf("uname() failed: %s\n", strerror(errno)); #endif if (getenv("MACHINEDOTS") == NULL) { if (getenv("HOSTNAME") != NULL) sprintf(buf, "%s", xgetenv("HOSTNAME")); #ifdef HAVE_UNAME else if (hasuname) sprintf(buf, "%s", u_name.nodename); #endif else { fd = popen("uname -n", "r"); if (fd && fgets(buf, sizeof(buf), fd)) { p = strchr(buf, '\n'); if (p) *p = '\0'; pclose(fd); } else strcpy(buf, "localhost"); } evar = (char *)malloc(strlen(buf) + 13); sprintf(evar, "MACHINEDOTS=%s", buf); putenv(evar); } xgetenv("MACHINE"); if (getenv("SERVEROSTYPE") == NULL) { #ifdef HAVE_UNAME if (hasuname) sprintf(buf, "%s", u_name.sysname); else { #else { #endif fd = popen("uname -s", "r"); if (fd && fgets(buf, sizeof(buf), fd)) { p = strchr(buf, '\n'); if (p) *p = '\0'; pclose(fd); } else strcpy(buf, "unix"); } for (p=buf; (*p); p++) *p = (char) tolower((int)*p); evar = (char *)malloc(strlen(buf) + 14); sprintf(evar, "SERVEROSTYPE=%s", buf); putenv(evar); } if (getenv("XYMONCLIENTHOME") == NULL) { homedir = strdup(envfn); p = strrchr(homedir, '/'); if (p) { *p = '\0'; if (strlen(homedir) > 4) { p = homedir + strlen(homedir) - 4; if (strcmp(p, "/etc") == 0) { *p = '\0'; evar = (char *)malloc(20 + strlen(homedir)); sprintf(evar, "XYMONCLIENTHOME=%s", homedir); putenv(evar); } } } } } int main(int argc, char *argv[]) { int argi; char *cmd = NULL; char **cmdargs = NULL; int argcount = 0; char *envfile = NULL; char *envarea = NULL; char envfn[PATH_MAX]; cmdargs = (char **) calloc(argc+2, sizeof(char *)); for (argi=1; (argi < argc); argi++) { if ((argcount == 0) && (strcmp(argv[argi], "--debug") == 0)) { debug = 1; } else if ((argcount == 0) && (argnmatch(argv[argi], "--env="))) { char *p = strchr(argv[argi], '='); envfile = strdup(p+1); } else if ((argcount == 0) && (argnmatch(argv[argi], "--area="))) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } else if ((argcount == 0) && (strcmp(argv[argi], "--version") == 0)) { fprintf(stdout, "Xymon version %s\n", VERSION); return 0; } else { if (argcount == 0) { cmdargs[0] = cmd = strdup(expand_env(argv[argi])); argcount = 1; } else cmdargs[argcount++] = strdup(expand_env(argv[argi])); } } if (!envfile) { struct stat st; sprintf(envfn, "%s/etc/xymonserver.cfg", xgetenv("XYMONHOME")); if (stat(envfn, &st) == -1) sprintf(envfn, "/etc/xymon/xymonserver.cfg"); if (stat(envfn, &st) == -1) sprintf(envfn, "%s/etc/xymonclient.cfg", xgetenv("XYMONHOME")); if (stat(envfn, &st) == -1) sprintf(envfn, "%s/etc/xymonclient.cfg", xgetenv("XYMONCLIENTHOME")); if (stat(envfn, &st) == -1) sprintf(envfn, "/etc/xymon-client/xymonclient.cfg"); if (stat(envfn, &st) == -1) sprintf(envfn, "xymonserver.cfg"); if (stat(envfn, &st) == -1) sprintf(envfn, "xymonclient.cfg"); envfile = (char *)envfn; dbgprintf("Using default environment file %s\n", envfile); } /* Make sure SERVEROSTYPE, MACHINEDOTS and MACHINE are setup for our child */ xymon_default_envs(envfile); loadenv(envfile, envarea); /* Go! */ if (cmd == NULL) cmd = cmdargs[0] = "/bin/sh"; execvp(cmd, cmdargs); /* Should never go here */ errprintf("execvp() failed: %s\n", strerror(errno)); return 0; } xymon-4.3.28/common/xymon.c0000664000076400007640000001356012475417664016045 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon communications tool. */ /* */ /* This is used to send a single message using the Xymon/BB protocol to the */ /* Xymon server. */ /* */ /* Copyright (C) 2002-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: xymon.c 7594 2015-03-03 20:55:16Z jccleaver $"; #include #include #include #include #include #include #include #include #include #include "libxymon.h" int main(int argc, char *argv[]) { int timeout = XYMON_TIMEOUT; int result = 1; int argi; int showhelp = 0; char *recipient = NULL; strbuffer_t *msg = newstrbuffer(0); FILE *respfd = stdout; char *envarea = NULL; sendreturn_t *sres; int wantresponse = 0, mergeinput = 0, usebackfeedqueue = 0; for (argi=1; (argi < argc); argi++) { if (strcmp(argv[argi], "--debug") == 0) { debug = 1; } else if (strncmp(argv[argi], "--proxy=", 8) == 0) { char *p = strchr(argv[argi], '='); setproxy(p+1); } else if (strcmp(argv[argi], "--help") == 0) { showhelp = 1; } else if (strcmp(argv[argi], "--version") == 0) { fprintf(stdout, "Xymon version %s\n", VERSION); return 0; } else if (strcmp(argv[argi], "--str") == 0) { respfd = NULL; } else if (strncmp(argv[argi], "--out=", 6) == 0) { char *fn = argv[argi]+6; respfd = fopen(fn, "wb"); } else if (strncmp(argv[argi], "--timeout=", 10) == 0) { char *p = strchr(argv[argi], '='); timeout = atoi(p+1); } else if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } else if (strcmp(argv[argi], "--merge") == 0) { mergeinput = 1; } else if (strcmp(argv[argi], "--response") == 0) { wantresponse = 1; } else if (strcmp(argv[argi], "-?") == 0) { showhelp = 1; } else if ((*(argv[argi]) == '-') && (strlen(argv[argi]) > 1)) { fprintf(stderr, "Unknown option %s\n", argv[argi]); } else { /* No more options - pickup recipient and msg */ if (recipient == NULL) { recipient = argv[argi]; } else if (STRBUFLEN(msg) == 0) { msg = dupstrbuffer(argv[argi]); } else { showhelp=1; } } } if ((recipient == NULL) || (STRBUFLEN(msg) == 0) || showhelp) { fprintf(stderr, "Xymon version %s\n", VERSION); fprintf(stderr, "Usage: %s [--debug] [--merge] [--proxy=http://ip.of.the.proxy:port/] RECIPIENT DATA\n", argv[0]); fprintf(stderr, " RECIPIENT: IP-address, hostname or URL\n"); fprintf(stderr, " DATA: Message to send, or \"-\" to read from stdin\n"); return 1; } if (strcmp(STRBUF(msg), "-") == 0) { strbuffer_t *inpline = newstrbuffer(0); sres = newsendreturnbuf(0, NULL); initfgets(stdin); while (unlimfgets(inpline, stdin)) { result = sendmessage(STRBUF(inpline), recipient, timeout, sres); clearstrbuffer(inpline); } return result; } if (mergeinput || (strcmp(STRBUF(msg), "@") == 0)) { strbuffer_t *inpline = newstrbuffer(0); if (mergeinput) /* Must add a new-line before the rest of the message */ addtobuffer(msg, "\n"); else /* Clear input buffer, we'll read it all from stdin */ clearstrbuffer(msg); initfgets(stdin); while (unlimfgets(inpline, stdin)) addtostrbuffer(msg, inpline); freestrbuffer(inpline); } if (strncmp(STRBUF(msg), "query ", 6) == 0) wantresponse = 1; else if (strncmp(STRBUF(msg), "client ", 7) == 0) wantresponse = 1; else if (strncmp(STRBUF(msg), "config ", 7) == 0) wantresponse = 1; else if (strncmp(STRBUF(msg), "download ", 9) == 0) wantresponse = 1; else if ((strncmp(STRBUF(msg), "xymondlog ", 10) == 0) || (strncmp(STRBUF(msg), "hobbitdlog ", 11) == 0)) wantresponse = 1; else if ((strncmp(STRBUF(msg), "xymondxlog ", 11) == 0) || (strncmp(STRBUF(msg), "hobbitdxlog ", 12) == 0)) wantresponse = 1; else if ((strncmp(STRBUF(msg), "xymondboard", 11) == 0) || (strncmp(STRBUF(msg), "hobbitdboard", 12) == 0)) wantresponse = 1; else if ((strncmp(STRBUF(msg), "xymondxboard", 12) == 0) || (strncmp(STRBUF(msg), "hobbitdxboard", 13) == 0)) wantresponse = 1; else if (strncmp(STRBUF(msg), "schedule ", 9) == 0) wantresponse = 0; else if (strncmp(STRBUF(msg), "schedule", 8) == 0) wantresponse = 1; else if (strncmp(STRBUF(msg), "clientlog ", 10) == 0) wantresponse = 1; else if (strncmp(STRBUF(msg), "hostinfo", 8) == 0) wantresponse = 1; else if (strncmp(STRBUF(msg), "ping", 4) == 0) wantresponse = 1; else if (strncmp(STRBUF(msg), "pullclient", 10) == 0) wantresponse = 1; else if (strncmp(STRBUF(msg), "ghostlist", 9) == 0) wantresponse = 1; else if (strncmp(STRBUF(msg), "multisrclist", 12) == 0) wantresponse = 1; usebackfeedqueue = ((strcmp(recipient, "0") == 0) && !wantresponse); if (!usebackfeedqueue) { sres = newsendreturnbuf(wantresponse, respfd); result = sendmessage(STRBUF(msg), recipient, timeout, sres); if (sres->respstr) printf("Buffered response is '%s'\n", STRBUF(sres->respstr)); } else { dbgprintf("Using backfeed channel\n"); sendmessage_init_local(); sendmessage_local(STRBUF(msg)); sendmessage_finish_local(); result = 0; } return result; } xymon-4.3.28/common/clientlaunch.cfg.50000664000076400007640000000103413037531444020001 0ustar rpmbuildrpmbuild.TH CLIENTLAUNCH.CFG 5 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME clientlaunch.cfg \- Task definitions for the xymonlaunch utility .SH SYNOPSIS .B ~xymon/client/etc/clientlaunch.cfg .SH DESCRIPTION The clientlaunch.cfg file holds the list of tasks that xymonlaunch runs on a Xymon client. This is typically just the Xymon client itself, but you can add custom test scripts here and have them executed regularly by the Xymon scheduler. .SH "FILE FORMAT" See the .I tasks.cfg(5) description. .SH "SEE ALSO" xymonlaunch(8), xymon(7) xymon-4.3.28/common/xymoncmd.10000664000076400007640000000206413037531444016430 0ustar rpmbuildrpmbuild.TH XYMONCMD 1 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME xymoncmd \- Run a Xymon command with environment set .SH SYNOPSIS .B "xymoncmd [\-\-env=ENVFILE COMMAND|\-\-version|\-\-debug]" .SH DESCRIPTION .I xymoncmd(1) is a utility that can setup the Xymon environment variables as defined in a .I xymonlaunch(8) compatible environment definition file, and then execute a command with this environment in place. It is mostly used for testing extension scripts or in other situations where you need to run a single command with the environment in place. The "\-\-env=ENVFILE" option points xymoncmd to the file where the environment definitions are loaded from. COMMAND is the command to execute after setting up the environment. If you want to run multiple commands, it is often easiest to just use "sh" as the COMMAND - this gives you a sub-shell with the environment defined globally. The "\-\-debug" option print out more detail steps of xymoncmd execution. The "\-\-version" option print out version number of xymoncmd. .SH "SEE ALSO" xymonlaunch(8), xymon(7) xymon-4.3.28/common/xymon.70000664000076400007640000005313713037531444015761 0ustar rpmbuildrpmbuild.TH XYMON 7 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME Xymon \- Introduction to Xymon .SH OVERVIEW Xymon is a tool for monitoring the health of your networked servers and the applications running on them. It provides a simple, intuitive way of checking the health of your systems from a web browser, and can also alert you to any problems that arise through alarms sent as e-mail, SMS messages, via a pager or by other means. Xymon is Open Source software, licensed under the GNU GPL. This means that you are free to use Xymon as much as you like, and you are free to re-distribute it and change it to suit your specific needs. However, if you change it then you must make your changes available to others on the same terms that you received Xymon originally. See the file COPYING in the Xymon source-archive for details. Xymon was called "Hobbit" until November 2008, when it was renamed to Xymon. This was done because the name "Hobbit" is trademarked. Xymon initially began life as an enhancement to Big Brother called "bbgen". Over a period of 5 years, Xymon has evolved from a small add-on to a full-fledged monitoring system with capabilities far exceeding what was in the original Big Brother package. Xymon does still maintain some compatibility with Big Brother, so it is possible to migrate from Big Brother to Xymon without too much trouble. Migrating to Xymon will give you a significant performance boost, and provide you with much more advanced monitoring. The Xymon tools are designed for installations that need to monitor a large number of hosts, with very little overhead on the monitoring server. Monitoring of thousands of hosts with a single Xymon server is possible - it was developed to handle just this task. .SH FEATURES These are some of the core features in Xymon: .IP "Monitoring of hosts and networks" Xymon collects information about your systems in two ways: From querying network services (Web, LDAP, DNS, Mail etc.), or from scripts that run either on the Xymon server or on the systems you monitor. The Xymon package includes a \fbXymon client\fR which you can install on the servers you monitor; it collects data about the CPU-load, disk- and memory-utilization, log files, network ports in use, file- and directory-information and more. All of the information is stored inside Xymon, and you can define conditions that result in alerts, e.g. if a network service stops responding, or a disk fills up. .IP "Centralized configuration" All configuration of Xymon is done on the Xymon server. Even when monitoring hundreds or thousands of hosts, you can control their configuration centrally on the Xymon server - so there is no need for you to login to a system just to change e.g. which processes are monitored. .IP "Works on all major platforms" The Xymon server works on all Unix-like systems, including Linux, Solaris, FreeBSD, AIX, HP-UX and others. The Xymon client supports all major Unix platforms, and there are other Open Source projects - e.g. BBWin, see http://bbwin.sourceforge.net/ - providing support for Microsoft Windows based systems. .IP "A simple, intuitive web-based front-end" "Green is good, red is bad". Using the Xymon web pages is as simple as that. The hosts you monitor can be grouped together in a way that makes sense in your organisation and presented in a tree-structure. The web pages use many techniques to convey information about the monitored systems, e.g. different icons can be used for recently changed statuses; links to sub-pages can be listed in multiple columns; different icons can be used for dial-up-tests or reverse-tests; selected columns can be dropped or unconditionally included on the web pages to eliminate unwanted information, or always include certain information; user-friendly names can be shown for hosts regardless of their true hostname. You can also have automatic links to on-line documentation, so information about your critical systems is just a click away. .IP "Integrated trend analysis, historical data and SLA reporting" Xymon stores trend- and availability-information about everything it monitors. So if you need to look at how your systems behave over time, Xymon has all of the information you need: Whether it is response times of your web pages during peak hours, the CPU utilization over the past 4 weeks, or what the availability of a site was compared to the SLA - it's all there inside Xymon. All measurements are tracked and made available in time-based graphs. When you need to drill down into events that have occurred, Xymon provides a powerful tool for viewing the event history for each status log, with overviews of when problems have occurred during the past and easy-to-use zoom-in on the event. For SLA reporting, You can configure planned downtime, agreed service availability level, service availability time and have Xymon generate availability reports directly showing the actual availability measured against the agreed SLA. Such reports of service availability can be generated on-the-fly, or pre-generated e.g. for monthly reporting. .IP "Role-based views" You can have multiple different views of the same hosts for different parts of the organisation, e.g. one view for the hardware group, and another view for the webmasters - all of them fed by the same test tools. If you have a dedicated Network Operations Center, you can configure precisely which alerts will appear on their monitors - e.g. a simple anomaly in the system log file need not trigger a call to 3rd-level support at 2 AM, but if the on-line shop goes down you do want someone to respond immediately. So you put the web-check for the on-line shop on the NOC monitor page, and leave out the log-file check. .IP "Also for the techies" The Xymon user-interface is simple, but engineers will also find lots of relevant information. E.g. the data that clients report to Xymon contain the raw output from a number of system commands. That information is available directly in Xymon, so an administrator no longer needs to login to a server to get an overview of how it is behaving - the very commands they would normally run have already been performed, and the results are on-line in Xymon. .IP "Easy to adapt to your needs" Xymon includes a lot of tests in the core package, but there will always be something specific to your setup that you would like to watch. Xymon allows you to write test scripts in your favorite scripting language and have the results show up as regular status columns in Xymon. You can trigger alerts from these, and even track trends in graphs just by a simple configuration setting. .IP "Real network service tests" The network test tool knows how to test most commonly used protocols, including HTTP, SMTP (e-mail), DNS, LDAP (directory services), and many more. When checking websites, it is possible to not only check that the web server is responding, but also that the response looks correct by matching the response against a pre-defined pattern or a check-sum. So you can test that a network service is really working and supplying the data you expect - not just that the service is running. Protocols that use SSL encryption such as https web sites are fully supported, and while checking such services the network tester will automatically run a check of the validity of the SSL server certificate, and warn about certificates that are about to expire. .IP "Highly configurable alerts" You want to know when something breaks. But you don't want to get flooded with alerts all the time. Xymon lets you define several criteria for when to send out an alert, so you only get alerts when there is really something that needs your attention right away. While you are handling an incident, you can tell Xymon about it so it stops sending more alerts, and so that everyone else can check with Xymon and know that the problem is being taken care of. .IP "Combined super-tests and test inter-dependencies" If a single test is not enough, combination tests can be defined that combine the result of several tests to a single status-report. So if you need to monitor that at least 3 out of 5 servers are running at any time, Xymon can do that for you and generate the necessary availability report. Tests can also be configured to depend on each other, so that when a critical router goes down you will get alerts only for the router - and not from the 200 hosts behind the router. .SH SECURITY All of the Xymon server tools run under an unprivileged user account. A single program - the .I xymonping(1) network connectivity tester - must be installed setuid-root, but has been written so that it drops all root privileges immediately after performing the operation that requires root privileges. It is recommended that you setup a dedicated account for Xymon. Communications between the Xymon server and Xymon clients use the Big Brother TCP port 1984. If the Xymon server is located behind a firewall, it must allow for inbound connections to the Xymon server on tcp port 1984. Normally, Xymon clients - i.e. the servers you are monitoring - must be permitted to connect to the Xymon server on this port. However, if that is not possible due to firewall policies, then Xymon includes the .I xymonfetch(8) and .I msgcache(8) tools to allows for a pull-style way of collecting data, where it is the Xymon server that initiates connections to the clients. The Xymon web pages are dynamically generated through CGI programs. Access to the Xymon web pages is controlled through your web server access controls, e.g. you can require a login through some form of HTTP authentication. .SH DEMONSTRATION SITE A site running this software can be seen at http://www.xymon.com/ .SH PREREQUISITES AND INSTALLATION You will need a Unix-like system (Linux, Solaris, HP-UX, AIX, FreeBSD, Mac OS X or similar) with a web server installed. You will also need a C compiler and some additional libraries, but many systems come with the required development tools and libraries pre-installed. The required libraries are: .sp .BR RRDtool This library is used to store and present trend-data. It is required. .sp .BR libpcre This library is used for advanced pattern-matching of text strings in configuration files. This library is required. .sp .BR OpenSSL This library is used for communication with SSL-enabled network services. Although optional, it is recommended that you install this for Xymon since many network tests do use SSL. .sp .BR OpenLDAP This library is used for testing LDAP servers. Use of this is optional. For more detailed information about Xymon system requirements and how to install Xymon, refer to the on-line documentation "Installing Xymon" available from the Xymon web server (via the "Help" menu), or from the "docs/install.html" file in the Xymon source archive. .SH "SUPPORT and MAILING LISTS" xymon@xymon.com is an open mailing list for discussions about Xymon. If you would like to participate, send an e-mail to \fBxymon-subscribe@xymon.com\fR to join the list, or visit http://lists.xymon.com/mailman/listinfo/xymon . An archive of the mailing list is available at http://lists.xymon.com/archive/ If you just want to be notified of new releases of Xymon, please subscribe to the xymon-announce mailing list. This is a moderated list, used only for announcing new Xymon releases. To be added to the list, send an e-mail to \fBxymon-announce-subscribe@xymon.com\fR or visit http://lists.xymon.com/mailman/listinfo/xymon-announce . .SH XYMON SERVER TOOLS These tools implement the core functionality of the Xymon server: .I xymond(8) is the core daemon that collects all reports about the status of your hosts. It uses a number of helper modules to implement certain tasks such as updating log files and sending out alerts: xymond_client, xymond_history, xymond_alert and xymond_rrd. There is also a xymond_filestore module for compatibility with Big Brother. .I xymond_channel(8) Implements the communication between the Xymon daemon and the other Xymon server modules. .I xymond_history(8) Stores historical data about the things that Xymon monitors. .I xymond_rrd(8) Stores trend data, which is used to generate graphs of the data monitored by Xymon. .I xymond_alert(8) handles alerts. When a status changes to a critical state, this module decides if an alert should be sent out, and to whom. .I xymond_client(8) handles data collected by the Xymon clients, analyzes the data and feeds back several status updates to Xymon to build the view of the client status. .I xymond_hostdata(8) stores historical client data when something breaks. E.g. when a web page stops responding xymond_hostdata will save the latest client data, so that you can use this to view a snapshot of how the system state was just prior to it failing. .SH XYMON NETWORK TEST TOOLS These tools are used on servers that execute tests of network services. .I xymonping(1) performs network connectivity (ping) tests. .I xymonnet(1) runs the network service tests. .I xymonnet-again.sh(1) is an extension script for re-doing failed network tests with a higher frequency than the normal network tests. This allows Xymon to pick up the recovery of a network service as soon as it happens, resulting in less downtime being recorded. .SH XYMON TOOLS HANDLING THE WEB USER-INTERFACE These tools take care of generating and updating the various Xymon web-pages. .I xymongen(1) takes care of updating the Xymon web pages. .I svcstatus.cgi(1) This CGI program generates an HTML view of a single status log. It is used to present the Xymon status-logs. .I showgraph.cgi(1) This CGI program generates graphs of the trend-data collected by Xymon. .I hostgraphs.cgi(1) When you want to combine multiple graphs into one, this CGI lets you combine graphs so you can e.g. compare the load on all of the nodes in your server farm. .I criticalview.cgi(1) Generates the Critical Systems view, based on the currently critical systems and the configuration of what systems and services you want to monitor when. .I history.cgi(1) This CGI program generates a web page with the most recent history of a particular host+service combination. .I eventlog.cgi(1) This CGI lets you view a log of events that have happened over a period of time, for a single host or test, or for multiple systems. .I ack.cgi(1) This CGI program allows a user to acknowledge an alert he received from Xymon about a host that is in a critical state. Acknowledging an alert serves two purposes: First, it stops more alerts from being sent so the technicians are not bothered wit more alerts, and secondly it provides feedback to those looking at the Xymon web pages that the problem is being handled. .I xymon-mailack(8) is a tool for processing acknowledgments sent via e-mail, e.g. as a response to an e-mail alert. .I enadis.cgi(8) is a CGI program to disable or re-enable hosts or individual tests. When disabling a host or test, you stop alarms from being sent and also any outages do not affect the SLA calculations. So this tool is useful when systems are being brought down for maintenance. .I findhost.cgi(1) is a CGI program that finds a given host in the Xymon web pages. As your Xymon installation grows, it can become difficult to remember exactly which page a host is on; this CGI script lets you find hosts easily. .I report.cgi(1) This CGI program triggers the generation of Xymon availability reports, using .I xymongen(1) as the reporting back-end engine. .I reportlog.cgi(1) This CGI program generates the detailed availability report for a particular host+service combination. .I snapshot.cgi(1) is a CGI program to build the Xymon web pages in a "snapshot" mode, showing the look of the web pages at a particular point in time. It uses .I xymongen(1) as the back-end engine. .I statusreport.cgi(1) is a CGI program reporting test results for a single status but for several hosts. It is used to e.g. see which SSL certificates are about to expire, across all of the Xymon web pages. .I csvinfo.cgi(1) is a CGI program to present information about a host. The information is pulled from a CSV (Comma Separated Values) file, which is easily exported from any spreadsheet or database program. .SH CLIENT-SIDE TOOLS .I logfetch(1) is a utility used by the Xymon Unix client to collect information from log files on the client. It can also monitor various other file-related data, e.g. file meta-data or directory sizes. .I clientupdate(1) Is used on Xymon clients, to automatically update the client software with new versions. Through this tool, updates of the client software can happen without an administrator having to logon to the server. .I msgcache(8) This tool acts as a mini Xymon server to the client. It stores client data internally, so that the .I xymonfetch(8) utility can pick it up later and send it to the Xymon server. It is typically used on hosts that cannot contact the Xymon server directly due to network- or firewall-restrictions. .SH XYMON COMMUNICATION TOOLS These tools are used for communications between the Xymon server and the Xymon clients. If there are no firewalls then they are not needed, but it may be necessary due to network or firewall issues to make use of them. .I xymonproxy(8) is a proxy-server that forwards Xymon messages between clients and the Xymon server. The clients must be able to talk to the proxy, and the proxy must be able to talk to the Xymon server. .I xymonfetch(8) is used when the client is not able to make outbound connections to neither xymonproxy nor the Xymon server (typically, for clients located in a DMZ network zone). Together with the .I msgcache(8) utility running on the client, the Xymon server can contact the clients and pick up their data. .SH OTHER TOOLS .I xymonlaunch(8) is a program scheduler for Xymon. It acts as a master program for running all of the Xymon tools on a system. On the Xymon server, it controls running all of the server tasks. On a Xymon client, it periodically launches the client to collect data and send them to the Xymon server. .I xymon(1) is the tool used to communicate with the Xymon server. It is used to send status reports to the Xymon server, through the custom Xymon/BB protocol, or via HTTP. It can be used to query the state of tests on the central Xymon server and retrieve Xymon configuration files. The server-side script .I xymoncgimsg.cgi(1) used to receive messages sent via HTTP is also included. .I xymoncmd(1) is a wrapper for the other Xymon tools which sets up all of the environment variables used by Xymon tools. .I xymongrep(1) is a utility for use by Xymon extension scripts. It allows an extension script to easily pick out the hosts that are relevant to a script, so it need not parse a huge hosts.cfg file with lots of unwanted test-specifications. .I xymoncfg(1) is a utility to dump the full .I hosts.cfg(5) file following any "include" statements. .I xymondigest(1) is a utility to compute message digest values for use in content checks that use digests. .I combostatus(1) is an extension script for the Xymon server, allowing you to build complicated tests from simpler Xymon test results. E.g. you can define a test that uses the results from testing your web server, database server and router to have a single test showing the availability of your enterprise web application. .I trimhistory(8) is a tool to trim the Xymon history logs. It will remove all log entries and optionally also the individual status-logs for events that happened before a given time. .SH VERSIONS Version 1 of bbgen was released in November 2002, and optimized the web page generation on Big Brother servers. Version 2 of bbgen was released in April 2003, and added a tool for performing network tests. Version 3 of bbgen was released in September 2004, and eliminated the use of several external libraries for network tests, resulting in a significant performance improvement. With version 4.0 released on March 30 2005, the project was de-coupled from Big Brother, and the name changed to Hobbit. This version was the first full implementation of the Hobbit server, but it still used the data collected by Big Brother clients for monitoring host metrics. Version 4.1 was released in July 2005 included a simple client for Unix. Log file monitoring was not implemented. Version 4.2 was released in July 2006, and includes a fully functional client for Unix. Version 4.3 was released in November 2010, and implemented the renaming of the project to Xymon. This name was already introduced in 2008 with a patch version of 4.2, but with version 4.3.0 this change of names was fully implemented. .SH COPYRIGHT Xymon is .br Copyright (C) 2002-2011 Henrik Storner .br Parts of the Xymon sources are from public-domain or other freely available sources. These are the the Red-Black tree implementation, and the MD5-, SHA1- and RIPEMD160-implementations. Details of the license for these is in the README file included with the Xymon sources. All other files are released under the GNU General Public License version 2, with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. See the file COPYING for details. .SH "SEE ALSO" xymond(8), xymond_channel(8), xymond_history(8), xymond_rrd(8), xymond_alert(8), xymond_client(8), xymond_hostdata(8), xymonping(1), xymonnet(1), xymonnet-again.sh(1), xymongen(1), svcstatus.cgi(1), showgraph.cgi(1), hostgraphs.cgi(1), criticalview.cgi(1), history.cgi(1), eventlog.cgi(1), ack.cgi(1), xymon-mailack(8), enadis.cgi(8), findhost.cgi(1), report.cgi(1), reportlog.cgi(1), snapshot.cgi(1), statusreport.cgi(1), csvinfo.cgi(1), logfetch(1), clientupdate(1), msgcache(8), xymonproxy(8), xymonfetch(8), xymonlaunch(8), xymon(1), xymoncgimsg.cgi(1), xymoncmd(1), xymongrep(1), xymoncfg(1), xymondigest(1), combostatus(1), trimhistory(8), hosts.cfg(5), tasks.cfg(5), xymonserver.cfg(5), alerts.cfg(5), analysis.cfg(5), client-local.cfg(5) xymon-4.3.28/common/xymondigest.c0000664000076400007640000000337012605347542017233 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon monitor message digest tool. */ /* */ /* This is used to implement message digest functions (MD5, SHA1 etc.) */ /* */ /* Copyright (C) 2003-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: xymondigest.c 7683 2015-10-08 02:05:22Z jccleaver $"; #include #include #include #include #include "libxymon.h" int main(int argc, char *argv[]) { FILE *fd; char buf[8192]; int buflen; digestctx_t *ctx; if (argc < 2) { printf("Usage: %s digestmethod [filename]\n", argv[0]); printf("\"digestmethod\" is \"md5\", \"sha1\", \"sha256\", \"sha512\", \"sha224\", \"sha384\", or \"rmd160\"\n"); return 1; } if ((ctx = digest_init(argv[1])) == NULL) { printf("Unknown message digest method %s\n", argv[1]); return 1; } if (argc > 2) fd = fopen(argv[2], "r"); else fd = stdin; if (fd == NULL) { printf("Cannot open file %s\n", argv[2]); return 1; } while ((buflen = fread(buf, 1, sizeof(buf), fd)) > 0) { digest_data(ctx, buf, buflen); } printf("%s\n", digest_done(ctx)); return 0; } xymon-4.3.28/common/hosts.cfg.50000664000076400007640000016365413037531444016511 0ustar rpmbuildrpmbuild.TH HOSTS.CFG 5 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME hosts.cfg \- Main Xymon configuration file .SH SYNOPSIS .IP hosts.cfg .SH DESCRIPTION The .I hosts.cfg(5) file is the most important configuration file for all of the Xymon programs. This file contains the full list of all the systems monitored by Xymon, including the set of tests and other configuration items stored for each host. .SH FILE FORMAT Each line of the file defines a host. Blank lines and lines starting with a hash mark (#) are treated as comments and ignored. Long lines can be broken up by putting a backslash at the end of the line and continuing the entry on the next line. .sp The format of an entry in the hosts.cfg file is as follows: .br IP-address hostname # tag1 tag2 ... .sp The IP-address and hostname are mandatory; all of the tags are optional. Listing a host with only IP-address and hostname will cause a network test to be executed for the host - the connectivity test is enabled by default, but no other tests. The optional tags are then used to define which tests are relevant for the host, and also to set e.g. the time-interval used for availability reporting by .I xymongen(1) An example of setting up the hosts.cfg file is in the Xymon on-line documentation (from the Help menu, choose "Configuring Monitoring"). The following describes the possible settings in a hosts.cfg file supported by Xymon. .SH TAGS RECOGNIZED BY ALL TOOLS .IP "include filename" This tag is used to include another file into the hosts.cfg file at run-time, allowing for a large hosts.cfg file to be split up into more manageable pieces. The "filename" argument should point to a file that uses the same syntax as hosts.cfg. The filename can be an absolute filename (if it begins with a '/'), or a relative filename - relative file names are prefixed with the directory where the main hosts.cfg file is located (usually $XYMONHOME/etc/). You can nest include tags, i.e. a file that is included from the main hosts.cfg file can itself include other files. .IP "dispinclude filename" Acts like the "include" tag, but only for the xymongen tool. Can be used e.g. to put a group of hosts on multiple sub-pages, without having to repeat the host definitions. .IP "netinclude filename" Acts like the "include" tag, but only for the xymonnet tool. .IP "directory directoryname" This tag is used to include all files in the named directory. Files are included in alphabetical order. If there are sub- directories, these are recursively included also. The following files are ignored: Files that begin with a dot, files that end with a tilde, RCS files that end with ",v", RPM package manager files ending in ".rpmsave" or ".rpmnew", DPKG package manager files ending in ".dpkg\-new" or ".dpkg\-orig", and all special files (devices, sockets, pipes etc). .IP "optional include/directory" Both "include" and "directory" can be prefixed with the tag "optional", which will preven an error message being logged if the file or directory is not present on a system. .SH GENERAL PER-HOST OPTIONS .IP noclear Controls whether stale status messages go purple or clear when a host is down. Normally, when a host is down the client statuses ("cpu", "disk", "memory" etc) will stop updating - this would usually make them go "purple" which can trigger alerts. To avoid that, Xymon checks if the "conn" test has failed, and if that is true then the other tests will go "clear" instead of purple so you only get alerts for the "conn" test. If you do want the stale statuses to go purple, you can use the "noclear" tag to override this behaviour. Note that "noclear" also affects the behaviour of network tests; see below. .IP prefer When a single host is defined multiple time in the hosts.cfg file, xymongen tries to guess which definition is the best to use for the information used on the "info" column, or for the NOPROPRED and other xymongen-specific settings. Host definitions that have a "noconn" tag or an IP of 0.0.0.0 get lower priority. By using the "prefer" tag you tell xymongen that this host definition should be used. Note: This only applies to hosts that are defined multiple times in the hosts.cfg file, although it will not hurt to add it on other hosts as well. .IP multihomed Tell Xymon that data from the host can arrive from multiple IP-addresses. By default, Xymon will warn if it sees data for one host coming from different IP-addresses, because this usually indicates a mis-configuration of the hostname on at least one of the servers involved. Some hosts with multiple IP-addresses may use different IP's for sending data to Xymon, however. This tag disables the check of source IP when receiving data. .IP delayred=STATUSCOLUMN:DELAY[,STATUSCOLUMN:DELAY...] Usually, status changes happen immediately. This tag is used to defer an update to red for the STATUSCOLUMN status for DELAY minutes. E.g. with \fBdelayred=disk:10,cpu:30\fR, a red disk-status will not appear on the Xymon webpages until it has been red for at least 10 minutes. Note: Since most tests only execute once every 5 minutes, it will usually not make sense to set N to anything but a multiple of 5. The exception is network tests, since .I xymonnet\-again.sh(1) will re-run failed network tests once a minute for up to 30 minutes. .IP delayyellow=STATUSCOLUMN:DELAY[,STATUSCOLUMN:DELAY...] Same as \fBdelayred\fR, but defers the change to a yellow status. .SH XYMONGEN DISPLAY OPTIONS These tags are processed by the .I xymongen(1) tool when generating the Xymon webpages or reports. .IP "page NAME [Page-title]" This defines a page at the level below the entry page. All hosts following the "page" directive appear on this page, until a new "page", "subpage" or "subparent" line is found. .IP "subpage NAME [Page-title]" This defines a sub-page in the second level below the entry page. You must have a previous "page" line to hook this sub-page to. .IP "subparent parentpage newpage [Page-title]" This is used to define sub-pages in whatever levels you may wish. Just like the standard "subpage" tag, "subparent" defines a new Xymon web page; however with "subparent" you explicitly list which page it should go as a sub-page to. You can pick any page as the parent - pages, sub-pages or even other subparent pages. So this allows you to define any tree structure of pages that you like. E.g. with this in hosts.cfg: page USA United States subpage NY New York subparent NY manhattan Manhattan data centers subparent manhattan wallstreet Wall Street center you get this hierarchy of pages: USA (United States) NY (New York) manhattan (Manhattan data centers) wallstreet (Wall Street center) Note: The parent page must be defined before you define the subparent. If not, the page will not be generated, and you get a message in the log file. Note: xymongen is case-sensitive, when trying to match the name of the parent page. The inspiration for this came from Craig Cook's mkbb.pl script, and I am grateful to Craig for suggesting that I implement it in xymongen. The idea to explicitly list the parent page in the "subparent" tag was what made it easy to implement. .IP "vpage" .IP "vsubpage" .IP "vsubparent" These are page-definitions similar to the "page", "subpage" and "subparent" definitions. However, on these pages the rows are the tests, and the columns are the hosts (normal pages have it the other way around). This is useful if you have a very large number of tests for a few hosts, and prefer to have them listed on a page that can be scrolled vertically. .br Note that the "group" directives have no effect on these types of pages. .IP "group [group-title]" .IP "group\-compress [group-title]" Defines a group of hosts, that appear together on the web page, with a single header-line listing all of the columns. Hosts following the "group" line appear inside the group, until a new "group" or page-line is found. The two group-directives are handled identically by Xymon and xymongen, but both forms are allowed for backwards compatibility. .IP "group\-sorted [group-title]" Same as the "group" line, but will sort the hosts inside the group so they appear in strict lexicographic order. .IP "group\-only COLUMN1|COLUMN2|COLUMN3 [group-title]" Same as the "group" and "group\-compress" lines, but includes only the columns explicitly listed in the group. Any columns not listed will be ignored for these hosts. .IP "group\-except COLUMN1|COLUMN2|COLUMN3 [group-title]" Same as the "group\-only" lines, but includes all columns EXCEPT those explicitly listed in the group. Any columns listed will be ignored for these hosts - all other columns are shown. .IP "title Page, group or host title text" The "title" tag is used to put custom headings into the pages generated by xymongen, in front of page/subpage links, groups or hosts. The title tag operates on the next item in the hosts.cfg file following the title tag. If a title tag precedes a host entry, the title is shown just before the host is listed on the status page. The column headings present for the host will be repeated just after the heading. If a title tag precedes a group entry, the title is show just before the group on the status page. If a title tag precedes a page/subpage/subparent entry, the title text replaces the normal "Pages hosted locally" heading normally inserted by Xymon. This appears on the page that links to the sub-pages, not on the sub-page itself. To get a custom heading on the sub-page, you may want to use the "\-\-pagetext\-heading" when running .I xymongen(1) .IP NAME:hostname Overrides the default hostname used on the overview web pages. If "hostname" contains spaces, it must be enclosed in double quotes, e.g. NAME:"R&D Oracle Server" .IP CLIENT:hostname Defines an alias for a host, which will be used when identifying status messages. This is typically used to accommodate a local client that sends in status reports with a different hostname, e.g. if you use hostnames with domains in your Xymon configuration, but the client is a silly Window box that does not include the hostname. Or vice-versa. Whatever the reason, this can be used to match status reports with the hosts you define in your hosts.cfg file. It causes incoming status reports with the specified hostname to be filed using the hostname defined in hosts.cfg. .IP NOCOLUMNS:column[,column] Used to drop certain of the status columns generated by the Xymon client. \fBcolumn\fR is one of \fBcpu\fR, \fBdisk\fR, \fBfiles\fR, \fBmemory\fR, \fBmsgs\fR, \fBports\fR, \fBprocs\fR. This setting stops these columns from being updated for the host. Note: If the columns already exist, you must use the .I xymon(1) utility to \fBdrop\fR them, or they will go purple. .IP "COMMENT:Host comment" Adds a small text after the hostname on the web page. This can be used to describe the host, without completely changing its display-name as the NAME: tag does. If the comment includes whitespace, it must be in double-quotes, e.g. COMMENT:"Sun web server" .IP "DESCR:Hosttype:Description" Define some informational text about the host. The "Hosttype" is a text describing the type of this device - "router", "switch", "hub", "server" etc. The "Description" is an informational text that will be shown on the "Info" column page; this can e.g. be used to store information about the physical location of the device, contact persons etc. If the text contain whitespace, you must enclose it in double-quotes, e.g. DESCR:"switch:4th floor Marketing switch" .IP "CLASS:Classname" Force the host to belong to a specific class. Class-names are used when configuring log-file monitoring (they can be used as references in .I client\-local.cfg(5), .I analysis.cfg(5) and .I alerts.cfg(5) to group log file checks or alerts). Normally, class-names are controlled on the client by starting the Xymon client with the "\-\-class=Classname" option. If you specify it in the hosts.cfg file on the Xymon server, it overrides any class name that the client reports. If not set, then the host belongs to a class named by the operating system the Xymon client is running on. .IP dialup The keyword "dialup" for a host means that it is OK for it to be off-line - this should not trigger an alert. All network tests will go "clear" upon failure, and any missing reports from e.g. cpu- and disk-status will not go purple when they are not updated. .IP nonongreen Ignore this host on the "All non-green" page. Even if it has an active alert, it will not be included in the "All non-green" page. This also removes the host from the event-log display. .IP nodisp Ignore this host completely when generating the Xymon webpages. Can be useful for monitoring a host without having it show up on the webpages, e.g. because it is not yet in production use. Or for hiding a host that is shown only on a second pageset. .IP TRENDS:[*,][![graph,...]] Defines the RRD graphs to include in the "trends" column generated by xymongen. This option syntax is complex. .br If this option is not present, xymongen provides graphs matching the standard set of RRD files: la, disk, memory, users, vmstat, iostat, netstat, tcp, bind, apache, sendmail .br * If this option is specified, the list of graphs to include start out as being empty (no graphs). .br * To include all default graphs, use an asterisk. E.g. "TRENDS:*" .br * To exclude a certain graph, specify it prefixed with '!'. E.g. to see all graphs except users: "TRENDS:*,!users" .br * The netstat, vmstat and tcp graphs have many "subgraphs". Which of these are shown can be specified like this: "TRENDS:*,netstat:netstat2|netstat3,tcp:http|smtp|conn" This will show all graphs, but instead of the normal netstat graph, there will be two: The netstat2 and netstat3 graphs. Instead of the combined tcp graphs showing all services, there will be three: One for each of the http, conn and smtp services. .br .IP "COMPACT:COLUMN=COLUMN1|COLUMN2|COLUMN3[,ditto]" Collapses a series of statuses into a single column on the overview web page. .br .IP "INTERFACES:REGEXP" On systems with multiple network interfaces, the operating system may report a number of network interface where the statistics are of no interest. By default Xymon tracks and graphs the traffic on all network interfaces. This option defines a regular expression, and only those interfaces whose name matches the expression are tracked. .SH XYMON TAGS FOR THE CRITICAL SYSTEMS OVERVIEW PAGE \fBNOTE:\fR The "NK" set of tags is deprecated. They will be supported for Xymon 4.x, but will be dropped in version 5. It is recommended that you move your critical systems view to the .I criticalview.cgi(1) viewer, which has a separate configuration tool, .I criticaleditor.cgi(1) with more facilities than the NK tags in hosts.cfg. xymongen will create three sets of pages: The main page xymon.html, the all-non-green-statuses page (nongreen.html), and a specially reduced version of nongreen.html with only selected tests (critical.html). This page includes selected tests that currently have a red or yellow status. .IP NK:testname[,testname] NOTE: This has been deprecated, you should use .I criticalview.cgi(1) instead of the NK tag. Define the tests that you want included on the critical page. E.g. if you have a host where you only want to see the http tests on critical.html, you specify it as 12.34.56.78 www.acme.com # http://www.acme.com/ NK:http If you want multiple tests for a host to show up on the critical.html page, specify all the tests separated by commas. The test names correspond to the column names (e.g. https tests are covered by an "NK:http" tag). .IP NKTIME=day:starttime:endtime[,day:starttime:endtime] This tag limits the time when an active alert is presented on the NK web page. By default, tests with a red or yellow status that are listed in the "NK:testname" tag will appear on the NK page. However, you may not want the test to be shown outside of normal working hours - if, for example, the host is not being serviced during week-ends. You can then use the NKTIME tag to define the time periods where the alert will show up on the NK page. The time specification consists of .sp .BR day-of-week: \fBW\fR means Mon-Fri ("weekdays"), \fB*\fR means all days, \fB0\fR .. \fB6\fR = Sunday .. Saturday. Listing multiple days is possible, e.g. "60" is valid meaning "Saturday and Sunday". .sp .BR starttime: Time to start showing errors, must be in 24-hour clock format as HHMM hours/minutes. E.g. for 8 am enter "0800", for 9.30 pm enter "2130" .sp .BR endtime: Time to stop showing errors. If necessary, multiple periods can be specified. E.g. to monitor a site 24x7, except between noon and 1 pm, use NKTIME=*:0000:1159,*:1300:2359 The interval between start time and end time may cross midnight, e.g. \fB*:2330:0200\fR would be valid and have the same effect as \fB*:2330:2400,*:0000:0200\fR. .SH XYMON TAGS FOR THE WML (WAP) CARDS If xymongen is run with the "\-\-wml" option, it will generate a set of WAP-format output "cards" that can be viewed with a WAP-capable device, e.g. a PDA or cell-phone. .IP WML:[+|\-]testname[,[+|\-]testname] This tag determines which tests for this hosts are included in the WML (WAP) page. Syntax is identical to the NK: tag. The default set of WML tests are taken from the \-\-wml command line option. If no "WML:" tag is specified, the "NK:" tag is used if present. .SH XYMON STATUS PROPAGATION OPTIONS These tags affect how a status propagates upwards from a single test to the page and higher. This can also be done with the command-line options \-\-nopropyellow and \-\-nopropred, but the tags apply to individual hosts, whereas the command line options are global. .IP NOPROPRED:[+|\-]testname[,[+|\-]testname] This tag is used to inhibit a yellow or red status from propagating upwards - i.e. from a test status color to the (sub)page status color, and further on to xymon.html or nongreen.html If a host-specific tag begins with a '\-' or a '+', the host-specific tags are removed/added to the default setting from the command-line option. If the host-specific tag does not begin with a '+' or a '\-', the default setting is ignored for this host and the NOPROPRED applies to the tests given with this tag. E.g.: xymongen runs with "\-\-nopropred=ftp,smtp". "NOPROPRED:+dns,\-smtp" gives a NOPROPRED setting of "ftp,dns" (dns is added to the default, smtp is removed). "NOPROPRED:dns" gives a setting of "dns" only (the default is ignored). Note: If you set use the "\-\-nopropred=*" command line option to disable propagation of all alerts, you cannot use the "+" and "\-" methods to add or remove from the wildcard setting. In that case, do not use the "+" or "\-" setting, but simply list the required tests that you want to keep from propagating. .IP NOPROPYELLOW:[+|\-]testname[,[+|\-]testname] Similar to NOPROPRED: tag, but applies to propagating a yellow status upwards. .IP NOPROPPURPLE:[+|\-]testname[,[+|\-]testname] Similar to NOPROPRED: tag, but applies to propagating a purple status upwards. .IP NOPROPACK:[+|\-]testname[,[+|\-]testname] Similar to NOPROPRED: tag, but applies to propagating an acknowledged status upwards. .SH XYMON AVAILABILITY REPORT OPTIONS These options affect the way the Xymon availability reports are processed (see .I report.cgi(1) for details about availability reports). .IP REPORTTIME=day:starttime:endtime[,day:starttime:endtime] This tag defines the time interval where you measure uptime of a service for reporting purposes. When xymongen generates a report, it computes the availability of each service - i.e. the percentage of time that the service is reported as available (meaning: not red). By default, this calculation is done on a 24x7 basis, so no matter when an outage occurs, it counts as downtime. The REPORTTIME tag allows you to specify a period of time other than 24x7 for the service availability calculation. If you have systems where you only guarantee availability from e.g. 7 AM to 8 PM on weekdays, you can use .br REPORTTIME=W:0700:2000 .br and the availability calculation will only be performed for the service with measurements from this time interval. The syntax for REPORTTIME is the same as the one used by the NKTIME parameter. When REPORTTIME is specified, the availability calculation happens like this: * Only measurements done during the given time period is used for the calculation. .br * "blue" time reduces the length of the report interval, so if you are generating a report for a 10-hour period and there are 20 minutes of "blue" time, then the availability calculation will consider the reporting period to be 580 minutes (10 hours minus 20 minutes). This allows you to have scheduled downtime during the REPORTTIME interval without hurting your availability; this is (I believe) the whole idea of the downtime being "planned". .br * "red" and "clear" status counts as downtime; "yellow" and "green" count as uptime. "purple" time is ignored. The availability calculation correctly handles status changes that cross into/out of a REPORTTIME interval. If no REPORTTIME is given, the standard 24x7 calculation is used. .IP WARNPCT:percentage Xymon's reporting facility uses a computed availability threshold to color services green (100% available), yellow (above threshold, but less than 100%), or red (below threshold) in the reports. This option allows you to set the threshold value on a host-by-host basis, instead of using a global setting for all hosts. The threshold is defined as the percentage of the time that the host must be available, e.g. "WARNPCT:98.5" if you want the threshold to be at 98.5% .IP "noflap[=test1,test2,...]" Disable flap detection for this host, or for specific tests on this host. Flap detection is globally controlled by options given to xymond on the command line, but, if enabled, it can be disabled using this option. .SH NETWORK TEST SETTINGS .IP testip By default, Xymon will perform a name lookup of the hostname to get the IP address it will use for network tests. This tag causes Xymon to use the IP listed in the hosts.cfg file. .IP NET:location This tag defines the host as being tested from a specific location. If xymonnet sees that the environment variable XYMONNETWORK is set, it will only test the hosts that have a matching "NET:location" tag in the hosts.cfg file. So this tag is useful if you have more than one system running network tests, but you still want to keep a consolidated hosts.cfg file for all your systems. Note: The "\-\-test\-untagged" option modifies this behaviour, see .I xymonnet(1) .IP noclear Some network tests depend on others. E.g. if the host does not respond to ping, then there's a good chance that the entire host is down and all network tests will fail. Or if the http server is down, then any web content checks are also likely to fail. To avoid floods of alerts, the default behaviour is for xymonnet to change the status of these tests that fail because of another problem to "clear" instead of "red". The "noclear" tag disables this behaviour and causes all failing tests to be reported with their true color. This behaviour can also be implemented on a per-test basis by putting the "~" flag on any network test. Note that "noclear" also affects whether stale status messages from e.g. a client on the host go purple or clear when the host is down; see the "noclear" description in the "GENERAL PER-HOST OPTIONS" section above. .IP nosslcert Disables the standard check of any SSL certificates for this host. By default, if an SSL-enabled service is tested, a second test result is generated with information about the SSL certificate - this tag disables the SSL certificate checks for the host. .IP "ssldays=WARNDAYS:ALARMDAYS" Define the number of days before an SSL certificate expires, in which the sslcert status shows a warning (yellow) or alarm (red) status. These default to the values from the "\-\-sslwarn" and "\-\-sslalarm" options for the .I xymonnet(1) tool; the values specified in the "ssldays" tag overrides the default. .IP "sslbits=MINIMUMKEYBITS" Enable checking of the encryption strength of the SSL protocol offered by the server. If the server offers encryption using a key with fewer than MINIMUMKEYBITS bits, the "sslcert" test will go red. E.g. to check that your server only uses strong encryption (128 bits or better), use "sslbits=128". .IP sni .IP nosni Enables or disables use of SNI (Server Name Indication) for SSL tests. Some SSL implementations cannot handle SSL handshakes with SNI data, so Xymon by default does not use SNI. This default can be changed with the "--sni" option for .I xymonnet(1) but can also be managed per host with these tags. SNI support was added in Xymon 4.3.13, where the default was to use SNI. This was changed in 4.3.14 so SNI support is disabled by default, and the "sni" and "nosni" tags were introduced together with the "--sni" option for xymonnet. .IP DOWNTIME=day:starttime:endtime[,day:starttime:endtime] .IP DOWNTIME=columns:day:starttime:endtime:cause[,columns:day:starttime:endtime:cause] This tag can be used to ignore failed checks during specific times of the day - e.g. if you run services that are only monitored e.g. Mon-Fri 8am-5pm, or you always reboot a server every Monday between 5 and 6 pm. What happens is that if a test fails during the specified time, it is reported with status BLUE instead of red, yellow, or purple. Thus you can still see when the service was unavailable, but alarms will not be triggered and the downtime is not counted in the availability calculations generated by the Xymon reports. The "columns" and "cause" settings are optional, but both or neither must be specified. "columns" may be a comma-separated list of status columns to which DOWNTIME will apply. The "cause" string will be displayed on the status web page to explain why the system is down. The syntax for DOWNTIME is the same as the one used by the NKTIME parameter. .IP SLA=day:starttime:endtime[,day:starttime:endtime] This tag is now deprecated. Use the DOWNTIME tag instead. This tag works the opposite of the DOWNTIME tag - you use it to specify the periods of the day that the service should be green. Failures OUTSIDE the SLA interval are reported as blue. .IP depends=(testA:host1/test1,host2/test2),(testB:host3/test3),[...] This tag allows you to define dependencies between tests. If "testA" for the current host depends on "test1" for host "host1" and test "test2" for "host2", this can be defined with depends=(testA:host1/test1,host2/test2) When deciding the color to report for testA, if either host1/test1 failed or host2/test2 failed, if testA has failed also then the color of testA will be "clear" instead of red or yellow. Since all tests are actually run before the dependencies are evaluated, you can use any host/test in the dependency - regardless of the actual sequence that the hosts are listed, or the tests run. It is also valid to use tests from the same host that the dependency is for. E.g. 1.2.3.4 foo # http://foo/ webmin depends=(webmin:foo/http) is valid; if both the http and the webmin tests fail, then webmin will be reported as clear. Note: The "depends" tag is evaluated by xymonnet while running the network tests. It can therefore only refer to other network tests that are handled by the same server - there is currently no way to use the e.g. the status of locally run tests (disk, cpu, msgs) or network tests from other servers in a dependency definition. Such dependencies are silently ignored. .IP badTEST[\-weekdays\-starttime\-endtime]:x:y:z NOTE: This has been deprecated, use the \fBdelayred\fR and \fBdelayyellow\fR settings instead. Normally when a network test fails, the status changes to red immediately. With a "badTEST:x:y:z" tag this behaviour changes: .br * While "z" or more successive tests fail, the column goes RED. .br * While "y" or more successive tests fail, but fewer than "z", the column goes YELLOW. .br * While "x" or more successive tests fail, but fewer than "y", the column goes CLEAR. .br * While fewer than "x" successive tests fail, the column stays GREEN. The optional time specification can be used to limit this "badTEST" setting to a particular time of day, e.g. to require a longer period of downtime before raising an alarm during out-of-office hours. The time-specification uses: .br * Weekdays: The weekdays this badTEST tag applies, from 0 (Sunday) through 6 (Saturday). Putting "W" here counts as "12345", i.e. all working days. Putting "*" here counts as all days of the week, equivalent to "0123456". .br * start time and end time are specified using 24-hour clocks, e.g. "badTEST\-W\-0900\-2000" is valid for working days between 9 AM (09:00) and 8 PM (20:00). When using multiple badTEST tags, the LAST one specified with a matching time-spec is used. Note: The "TEST" is replaced by the name of the test, e.g. 12.34.56.78 www.foo.com # http://www.foo.com/ badhttp:1:2:4 defines a http test that goes "clear" after the first failure, "yellow" after two successive failures, and "red" after four successive failures. For LDAP tests using URL's, use the option "badldapurl". For the other network tests, use "badftp", "badssh" etc. .SH CONNECTIVITY (PING) TEST These tags affect the behaviour of the xymonnet connectivity test. .IP noping Disables the ping-test, but will keep the "conn" column on the web display with a notice that it has been disabled. .IP noconn Disables the ping-test, and does not put a "conn" column on the web display. .IP conn The "conn" test (which does a ping of the host) is enabled for all hosts by default, and normally you just want to disable it using "noconn" or "noping". However, on the rare occasion where you may want to check that a host is NOT up, you can specify it as an explicit test, and use the normal test modifiers, e.g. "!conn" will be green when the host is NOT up, and red if it does appear on the network. The actual name of the tag - "conn" by default - depends on the "\-\-ping=TESTNAME" option for xymonnet, as that decides the testname for the connectivity test. .IP "conn={best,|worst,}IP1[,IP2...]" This adds additional IP-addresses that are pinged during the normal "conn" test. So the normal "conn" test must be enabled (the default) before this tag has any effect. The IP-addresses listed here are pinged in addition to the main IP-address. When multiple IP's are pinged, you can choose if ALL IP's must respond (the "worst" method), or AT LEAST one IP must respond (the "best" setting). All of the IP's are reported in a single "conn" status, whose color is determined from the result of pinging the IP's and the best/worst setting. The default method is "best" - so it will report green if just one of the IP's respond to ping. .IP badconn[\-weekdays\-starttime\-endtime]:x:y:z This is taken directly from the "fping.sh" connectivity- testing script, and is used by xymonnet when it runs with ping testing enabled (the default). See the description of the "badTEST" tag. .IP route:router1,router2,.... This tag is taken from the "fping.sh" script, and is used by xymonnet when run with the "\-\-ping" option to enable ping testing. The router1,router2,... is a comma-separated list of hosts elsewhere in the hosts.cfg file. You cannot have any spaces in the list - separate hosts with commas. This tag changes the color reported for a ping check that fails, when one or more of the hosts in the "route" list is also down. A "red" status becomes "yellow" - other colors are unchanged. The status message will include information about the hosts in the router-list that are down, to aid tracking down which router is the root cause of the problem. Note: Internally, the ping test will still be handled as "failed", and therefore any other tests run for this host will report a status of "clear". .IP route_LOCATION:router1,router2,... If the XYMONNETWORK environment variable is defined, a tag of "route_XYMONNETWORK:" is recognized by xymonnet with the same effect as the normal "route:" tag (see above). This allows you to have different route: tags for each server running xymonnet. The actual text for the tag then must match the value you have for the XYMONNETWORK setting. E.g. with XYMONNETWORK=dmz, the tag becomes "route_dmz:" .IP "trace" If the connectivity test fails, run a "traceroute" and include the output from this in the status message from the failed connectivity test. Note: For this to work, you may have to define the TRACEROUTE environment variable, see .I xymonserver.cfg(5) .IP "notrace" Similar to the "trace" option, this disables the running of a traceroute for the host after a failed connectivity test. It is only used if running traceroute is made the default via the \-\-trace option. .SH SIMPLE NETWORK TESTS These tests perform a simple network test of a service by connecting to the port and possibly checking that a banner is shown by the server. How these tests operate are configured in the .I protocols.cfg(5) configuration file, which controls which port to use for the service, whether to send any data to the service, whether to check for a response from the service etc. You can modify the behaviour of these tests on a per-test basis by adding one or more modifiers to the test: \fB:NUMBER\fR changes the port number from the default to the one you specify for this test. E.g. to test ssh running on port 8022, specify the test as \fBssh:8022\fR. \fB:s\fR makes the test silent, i.e. it does not send any data to the service. E.g. to do a silent test of an smtp server, enter \fBsmtp:s\fR. You can combine these two: \fBftp:8021:s\fR is valid. If you must test a service from a multi-homed host (i.e. using a specific source IP-address instead of the one your operating system provides), you can use the modifier "@IPADDRESS" at the end of the test specification, \fBafter\fR any other modifiers or port number. "IPADDRESS" must be a valid dotted IP-address (not hostname) which is assigned to the host running the network tests. The name of the test also determines the column name that the test result will appear with in the Xymon webpages. By prefixing a test with "!" it becomes a reverse test: Xymon will expect the service NOT to be available, and send a green status if it does NOT respond. If a connection to the service succeeds, the status will go red. By prefixing a test with "?" errors will be reported with a "clear" status instead of red. This is known as a test for a "dialup" service, and allows you to run tests of hosts that are not always online, without getting alarms while they are off-line. .IP "ftp ssh telnet smtp pop3 imap nntp rsync clamd oratns qmtp qmqp" These tags are for testing services offering the FTP, Secure Shell (ssh), SMTP, POP3, IMAP, NNTP, rsync, CLAM anti-virus daemon (clamd), Oracle TNS listener (oratns), qmail QMTP and QMQP protocols. .IP "ftps telnets smtps pop3s imaps nntps" These tags are for testing of the SSL-tunneled versions of the standard ftp, telnet, smtp, pop3, imap and nntp protocols. If Xymon was configured with support for SSL, you can test these services like any other network service - xymonnet will setup an SSL-encrypted session while testing the service. The server certificate is validated and information about it sent in the "sslcert" column. Note that smtps does not have a standard port number assignment, so you will need to enter this into the protocols.cfg file or your /etc/services file. .IP bbd Test that a Big Brother compatible daemon is running. This check works both for the Xymon .I xymond(8) daemon, and the original Big Brother bbd daemon. .SH DNS SERVER TESTS These tags are used to setup monitoring of DNS servers. .IP dns Simple DNS test. It will attempt to lookup the A record for the hostname of the DNS server. .IP dig This is an alias for the "dns" test. In xymonnet, the "dns" and "dig" tests are handled identically, so all of the facilities for testing described for the "dns" test are also available for the "dig" test. .IP "dns=hostname" .IP "dns=TYPE:lookup[,TYPE:lookup...] The default DNS tests will attempt a DNS lookup of the DNS' servers own hostname. You can specify the hostname to lookup on a DNS server by listing it on each test. The second form of the test allows you to perform multiple queries of the DNS server, requesting different types of DNS records. The TYPE defines the type of DNS data: A (IP-address), MX (Mail eXchanger), PTR (reverse), CNAME (alias), SOA (Start-Of-Authority), NS (Name Server) are among the more common ones used. The "lookup" is the query. E.g. to lookup the MX records for the "foo.com" domain, you would use "dns=mx:foo.com". Or to lookup the nameservers for the "bar.org" domain, "dns=ns:bar.org". You can list multiple lookups, separated by commas. For the test to end up with a green status, all lookups must succeed. .SH OTHER NETWORK TESTS .IP ntp Check for a running NTP (Network Time Protocol) server on this host. This test uses the "ntpdate" utility to check for a NTP server - you should either have ntpdate in your PATH, or set the location of the ntpdate program in $XYMONHOME/etc/xymonserver.cfg .IP rpc[=rpcservice1,rpcservice2,...] Check for one or more available RPC services. This check is indirect in that it only queries the RPC Portmapper on the host, not the actual service. If only "rpc" is given, the test only verifies that the port mapper is available on the remote host. If you want to check that one or more RPC services are registered with the port mapper, list the names of the desired RPC services after the equals-sign. E.g. for a working NFS server the "mount", "nlockmgr" and "nfs" services must be available; this can be checked with "rpc=mount,nlockmgr,nfs". This test uses the rpcinfo tool for the actual test; if this tool is not available in the PATH of xymonnet, you must define the RPCINFO environment variable to point at this tool. See .I xymonserver.cfg(5) .SH HTTP TESTS Simple testing of a http URL is done simply by putting the URL into the hosts.cfg file. Note that this only applies to URL's that begin with "http:" or "https:". The following items describe more advanced forms of http URL's. .IP "Basic Authentication with username/password" If the URL requires authentication in the form of a username and password, it is most likely using the HTTP "Basic" authentication. xymonnet support this, and you can provide the username and password either by embedding them in the URL e.g. .br http://USERNAME:PASSWORD@www.sample.com/ .br or by putting the username and password into the ~/.netrc file (see .I ftp(1) for details). .IP "Authentication with SSL client certificates" An SSL client certificate can be used for authentication. To use this, the client certificate must be stored in a PEM-formatted file together with the client certificate key, in the $XYMONHOME/certs/ directory. The URL is then given as .br http://CERT:FILENAME@www.sample.com/ .br The "CERT:" part is literal - i.e. you write C-E-R-T-colon and then the filename of the PEM-formatted certificate. .br A PEM-formatted certificate file can be generated based on certificates stored in Microsoft Internet Explorer and OpenSSL. Do as follows: .br From the MSIE Tools-Options menu, pick the Content tab, click on Certificates, choose the Personal tab, select the certificate and click Export. Make sure you export the private key also. In the Export File Format, choose PKCS 12 (.PFX), check the "Include all certificates" checkbox and uncheck the "Enable strong protection". Provide a temporary password for the exported file, and select a filename for the PFX-file. .br Now run "openssl pkcs12 \-in file.pfx \-out file.pem". When prompted for the "Import Password", provide the temporary password you gave when exporting the certificate. Then provide a "PEM pass phrase" (twice) when prompted for one. .br The file.pem file is the one you should use in the FILENAME field in the URL - this file must be kept in $XYMONHOME/certs/. The PEM pass phrase must be put into a file named the same as the certificate, but with extension ".pass". E.g. if you have the PEM certificate in $XYMONHOME/certs/client.pem, you must put the pass phrase into the $XYMONHOME/certs/client.pass file. Make sure to protect this file with Unix permissions, so that only the user running Xymon can read it. .IP "Forcing an HTTP or SSL version" Some SSL sites will only allow you to connect, if you use specific "dialects" of HTTP or SSL. Normally this is auto-negotiated, but experience shows that this fails on some systems. xymonnet can be told to use specific dialects, by adding one or more "dialect names" to the URL scheme, i.e. the "http" or "https" in the URL: * "2", e.g. https2://www.sample.com/ : use only SSLv2 .br * "3", e.g. https3://www.sample.com/ : use only SSLv3 .br * "t", e.g. httpst://www.sample.com/ : use only TLSv1.0 .br * "a", e.g. httpsa://www.sample.com/ : use only TLSv1.0 .br * "b", e.g. httpsb://www.sample.com/ : use only TLSv1.1 .br * "c", e.g. httpsc://www.sample.com/ : use only TLSv1.2 .br * "m", e.g. httpsm://www.sample.com/ : use only 128-bit ciphers .br * "h", e.g. httpsh://www.sample.com/ : use only >128-bit ciphers .br * "10", e.g. http10://www.sample.com/ : use HTTP 1.0 .br * "11", e.g. http11://www.sample.com/ : use HTTP 1.1 These can be combined where it makes sense, e.g to force TLS1.2 and HTTP 1.0 you would use "httpsc10". Note that SSLv2 support is disabled in all current OpenSSL releases. TLS version-specific scheme testing requires OpenSSL 1.0.1 or higher. .IP "Testing sites by IP-address" xymonnet ignores the "testip" tag normally used to force a test to use the IP-address from the hosts.cfg file instead of the hostname, when it performs http and https tests. The reason for this is that it interacts badly with virtual hosts, especially if these are IP-based as is common with https-websites. Instead the IP-address to connect to can be overridden by specifying it as: http://www.sample.com=1.2.3.4/index.html The "=1.2.3.4" will case xymonnet to run the test against the IP-address "1.2.3.4", but still trying to access a virtual website with the name "www.sample.com". The "=ip.address.of.host" must be the last part of the hostname, so if you need to combine this with e.g. an explicit port number, it should be done as http://www.sample.com:3128=1.2.3.4/index.html .IP "HTTP Testing via proxy" \fBNOTE:\fR This is not enabled by default. You must add the "\-\-bb\-proxy\-syntax" option when running .I xymonnet(1) if you want to use this. xymonnet supports the Big Brother syntax for specifying an HTTP proxy to use when performing http tests. This syntax just joins the proxy- and the target-URL into one, e.g. .br http://webproxy.sample.com:3128/http://www.foo.com/ .br would be the syntax for testing the www.foo.com website via the proxy running on "webproxy.sample.com" port 3128. If the proxy port number is not specified, the default HTTP port number (80) is used. If your proxy requires authentication, you can specify the username and password inside the proxy-part of the URL, e.g. .br http://fred:Wilma1@webproxy.sample.com:3128/http://www.foo.com/ .br will authenticate to the proxy using a username of "fred" and a password of "Wilma1", before requesting the proxy to fetch the www.foo.com homepage. Note that it is not possible to test https-sites via a proxy, nor is it possible to use https for connecting to the proxy itself. .IP cont[=COLUMN];URL;[expected_data_regexp|#digesttype:digest] This tag is used to specify a http/https check, where it is also checked that specific content is present in the server response. If the URL itself includes a semi-colon, this must be escaped as '%3B' to avoid confusion over which semicolon is part of the URL, and which semicolon acts as a delimiter. The data that must be returned can be specified either as a regular expression (except that is not allowed) or as a message digest (typically using an MD5 sum or SHA-1 hash). The regex is pre-processed for backslash "\\" escape sequences. So you can really put any character in this string by escaping it first: .br \\n Newline (LF, ASCII 10 decimal) .br \\r Carriage return (CR, ASCII 13 decimal) .br \\t TAB (ASCII 8 decimal) .br \\\\ Backslash (ASCII 92 decimal) .br \\XX The character with ASCII hex-value XX .br If you must have whitespace in the regex, use the [[:space:]] syntax, e.g. if you want to test for the string "All is OK", use "All[[:space:]]is[[:space:]]OK". Note that this may depend on your particular implementation of the regex functions found in your C library. Thanks to Charles Goyard for this tip. Note: If you are migrating from the "cont2.sh" script, you must change the '_' used as wildcards by cont2.sh into '.' which is the regular-expression wildcard character. Message digests can use whatever digest algorithms your libcrypto implementation (usually OpenSSL) supports. Common message digests are "md5", "sha1", "sha256" or "sha512". The digest is calculated on the data portion of the response from the server, i.e. HTTP headers are not included in the digest (as they change from one request to the next). The expected digest value can be computed with the .I xymondigest(1) utility. "cont" tags in hosts.cfg result in two status reports: One status with the "http" check, and another with the "content" check. As with normal URL's, the extended syntax described above can be used e.g. when testing SSL sites that require the use of SSLv2 or strong ciphers. The column name for the result of the content check is by default called "content" - you can change the default with the "\-\-content=NAME" option to xymonnet. See .I xymonnet(1) for a description of this option. If more than one content check is present for a host, the first content check is reported in the column "content", the second is reported in the column "content1", the third in "content2" etc. You can also specify the column name directly in the test specification, by writing it as "cont=COLUMN;http://...". Column-names cannot include whitespace or semi-colon. The content-check status by default includes the full URL that was requested, and the HTML data returned by the server. You can hide the HTML data on a per-host (not per-test) basis by adding the \fBHIDEHTTP\fR tag to the host entry. .IP content=URL This syntax is deprecated. You should use the "cont" tag instead, see above. .IP post[=COLUMN];URL;form\-data;[expected_data_regexp|#digesttype:digest] This tag can be used to test web pages, that use an input form. Data can be posted to the form by specifying them in the form-data field, and the result can be checked as if it was a normal content check (see above for a description of the cont-tag and the restrictions on how the URL must be written). The form-data field must be entered in "application/x\-www\-form\-urlencoded" format, which is the most commonly used format for web forms. E.g. if you have a web form defined like this:
.br

Given name

.br

Surname

.br .br
and you want to post the value "John" to the first field and "Doe Jr." to the second field, then the form data field would be givenname=John&surname=Doe+Jr. Note that any spaces in the input value is replaced with '+'. If your form-data requires a different content-type, you can specify it by beginning the form-data with \fB(content\-type=TYPE)\fR, e.g. "(content\-type=text/xml)" followed by the POST data. Note that as with normal forms, the POST data should be specified using escape-sequences for reserved characters: "space" should be entered as "\\x20", double quote as "\\x22", newline as "\\n", carriage-return as "\\r", TAB as "\\t", backslash as "\\\\". Any byte value can be entered using "\\xNN" with NN being the hexadecimal value, e.g. "\\x20" is the space character. The [expected_data_regexp|#digesttype:digest] is the expected data returned from the server in response to the POST. See the "cont;" tag above for details. If you are only interested in knowing if it is possible to submit the form (but don't care about the data), this can be an empty string - but the ';' at the end is required. .IP nocont[=COLUMN];URL;forbidden_data_regexp This tag works just like "cont" tag, but reverses the test. It is green when the "forbidden_data_regexp" is NOT found in the response, and red when it IS found. So it can be used to watch for data that should NOT be present in the response, e.g. a server error message. .IP nopost[=COLUMN];URL;form\-data;expected_data_regexp This tag works just like "post" tag, but reverses the test. It is green when the "forbidden_data_regexp" is NOT found in the response, and red when it IS found. So it can be used to watch for data that should NOT be present in the response, e.g. a server error message. .IP type[=COLUMN];URL;expected_content_type This is a variant of the content check - instead of checking the content data, it checks the type of the data as given by the HTTP Content\-Type: header. This can used to check if a URL returns e.g. a PDF file, regardless of what is inside the PDF file. .IP soap[=COLUMN];URL;SOAPMESSAGE;[expected_data_regexp|#digesttype:digest] Send SOAP message over HTTP. This is identical to the "cont" test, except that the request sent to the server uses a Content\-type of "application/soap+xml", and it also sends a "SOAPAction" header with the URL. SOAPMESSAGE is the SOAP message sent to the server. Since SOAP messages are usually XML documents, you can store this in a separate file by specifying "file:FILENAME" as the SOAPMESSAGE parameter. E.g. a test specification of soap=echo;http://soap.foo.bar/baz?wsdl;file:/home/foo/msg.xml;. will read the SOAP message from the file /home/foo/msg.xml and post it to the URL http://soap.foo.bar/bas?wsdl Note that SOAP XML documents usually must begin with the XML version line, \fB\fR .IP nosoap[=COLUMN];URL;SOAPMESSAGE;[forbidden_data_regexp|#digesttype:digest] This tag works just like "soap" tag, but reverses the test. It is green when the "forbidden_data_regexp" is NOT found in the response, and red when it IS found. So it can be used to watch for data that should NOT be present in the response, e.g. a server error message. .IP httphead[=COLUMN];URL This is used to perform an HTTP HEAD request instead of a GET. .IP httpstatus[=COLUMN];URL;okstatusexpr;notokstatusexpr This is used to explicitly test for certain HTTP statuscodes returned when the URL is requested. The \fBokstatusexpr\fR and \fBnokokstatusexpr\fR expressions are Perl-compatible regular expressions, e.g. "2..|302" will match all OK codes and the redirect (302) status code. If the URL cannot be retrieved, the status is "999". .IP HIDEHTTP The status display for HTTP checks usually includes the URL, and for content checks also the actual data from the web page. If you would like to hide these from view, then the HIDEHTTP tag will keep this information from showing up on the status webpages. .IP headermatch Content checks by default only search the HTML body returned by the webserver. This option causes it to also search the HTTP headers for the string that must / must not be present. .IP browser=BROWSERNAME By default, Xymon sends an HTTP "User\-Agent" header identifying it a "Xymon". Some websites require that you use a specific browser, typically Internet Explorer. To cater for testing of such sites, this tag can be used to modify the data sent in the User\-Agent header. .br E.g. to perform an HTTP test with Xymon masquerading as an Internet Explorer 6.0 browser, use \fBbrowser="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"\fR. If you do not know what the User\-Agent header should be, open up the browser that works with this particular site, and open the URL "javascript:document.writeln(navigator.userAgent)" (just copy this into the "Open URL" dialog. The text that shows up is what the browser sends as the User\-Agent header. .IP httphdr=STRING Xymon can be send additional headers when performing HTTP checks, to allow for validation of any custom configurations needed for your site. Note that this is a host-wide configuration. The string will be added directly to the headers for all URLs on that host. There is currently no way to have this occur only for specific URLs checked. .br The string should be encased in quotes, like \fBhttphdr="X-Requested-With: XMLHttpRequest"\fR. Newlines can be included, however the string MUST NOT end with a newline as that may cause premature ending of the headers sent. .SH LDAP (DIRECTORY SERVER) TESTS .IP ldap .IP ldaps Simple check for an LDAP service. This check merely looks for any service running on the ldap/ldaps service port, but does not perform any actual LDAP transaction. .IP ldap://hostport/dn[?attrs[?scope[?filter[?exts]]]] Check for an LDAP service by performing an LDAP request. This tag is in the form of an LDAP URI (cf. RFC 2255). This type of LDAP test requires that .I xymonnet(1) was built with support for LDAP, e.g. via the OpenLDAP library. The components of the LDAP URI are: .nf \fIhostport\fP is a host name with an optional ":portnumber" \fIdn\fP is the search base \fIattrs\fP is a comma separated list of attributes to request \fIscope\fP is one of these three strings: base one sub (default=base) \fIfilter\fP is filter \fIexts\fP are recognized set of LDAP and/or API extensions. .fi .IP ldaps://hostport/dn[?attrs[?scope[?filter[?exts]]]] LDAP service check using LDAPv3 and STARTTLS for talking to an LDAP server that requires TLS encryption. See .I xymonnet(1) for a discussion of the different ways of running LDAP servers with SSL/TLS, and which of these are supported by xymonnet. .IP ldaplogin=username:password Define a username and password to use when binding to the LDAP server for ldap URI tests. If not specified, xymonnet will attempt an anonymous bind. .IP ldapyellowfail Used with an LDAP URL test. If the LDAP query fails during the search of the directory, the ldap status is normally reported as "red" (alarm). This tag reduces a search failure to a "yellow" (warning) status. .SH PERFORMANCE MONITORING TESTS .IP apache[=URL] If you are running an Apache web server, adding this tag makes .I xymonnet(1) collect performance statistics from the Apache web server by querying the URL \fBhttp://IP.ADDRESS.OF.HOST/server\-status?auto\fR. The response is sent as a data-report and processed by the Xymon xymond_rrd module into an RRD file and an "apache" graph. If your web server requires e.g. authentication, or runs on a different URL for the server-status, you can provide the full URL needed to fetch the server-status page, e.g. \fBapache=http://LOGIN:PASSWORD@10.0.0.1/server\-status?auto\fR for a password protected server\-status page, or \fBapache=http://10.0.0.1:8080/apache/server\-status?auto\fR for a server listening on port 8080 and with a different path to the server-status page. Note that you need to enable the server-status URL in your Apache configuration. The following configuration is needed: .sp .br SetHandler server\-status .br Order deny,allow .br Deny from all .br allow from 127.0.0.1 .br .br ExtendedStatus On .sp Change "127.0.0.1" to the IP-address of the server that runs your network tests. .SH DEFAULT HOST If you have certain tags that you want to apply to all hosts, you can define a host name ".default." and put the tags on that host. Note that per-host definitions will override the default ones. To apply to all hosts this should be listed FIRST in your file. \fBNOTE:\fR The ".default." host entry will only accept the following tags - others are silently ignored: delayyellow, delayred, NOCOLUMNS, COMMENT, DESCR, CLASS, dialup, testip, nonongreen, nodisp, noinfo, notrends, noclient, TRENDS, NOPROPRED, NOPROPYELLOW, NOPROPPURPLE, NOPROPACK, REPORTTIME, WARNPCT, NET, noclear, nosslcert, ssldays, DOWNTIME, depends, noping, noconn, trace, notrace, HIDEHTTP, browser, pulldata. Specifically, note that network tests, "badTEST" settings, and alternate pageset relations cannot be listed on the ".default." host. .SH SENDING SUMMARIES TO REMOTE XYMON SERVERS .IP "summary ROW.COLUMN IP URL" If you have multiple Xymon servers, the "summary" directive lets you form a hierarchy of servers by sending the overall status of this server to a remote Xymon server, which then displays this in a special summary section. E.g. if your offices are spread over three locations, you can have a Xymon server at each office. These branch-office Xymon have a "summary" definition in their hosts.cfg file that makes them report the overall status of their branch Xymon to the central Xymon server you maintain at the corporate headquarters. Multiple "summary" definitions are allowed. The ROW.COLUMN setting defines how this summary is presented on the server that receives the summary. The ROW text will be used as the heading for a summary line, and the COLUMN defines the name of the column where this summary is shown - like the hostname and testname used in the normal displays. The IP is the IP-address of the \fBremote\fR (upstream) Xymon server, where this summary is sent). The URL is the URL of your \fBlocal\fR Xymon server. The URL need not be that of your Xymon server's main page - it could be the URL of a sub-page on the local Xymon server. Xymon will report the summary using the color of the page found at the URL you specify. E.g. on your corporate Xymon server you want a summary from the Las Vegas office - but you would like to know both what the overall status is, and what is the status of the servers on the critical Sales department back-office servers in Las Vegas. So you configure the Las Vegas Xymon server to send \fBtwo\fR summaries: .sp summary Vegas.All 10.0.1.1 http://vegas.foo.com/xymon/ .br summary Vegas.Sales 10.0.1.1 http://vegas.foo.com/xymon/sales/ .sp This gives you one summary line for Baltimore, with two columns: An "All" column showing the overall status, and a "Sales" column showing the status of the "sales" page on the Baltimore Xymon server. Note: Pages defined using alternate pageset definitions cannot be used, the URL must point to a web page from the default set of Xymon webpages. .SH OTHER TAGS .IP pulldata[=[IP][:port]] This option is recognized by the .I xymonfetch(8) utility, and causes it to poll the host for client data. The optional IP-address and port-number can be used if the client-side .I msgcache(8) daemon is listening on a non-standard IP-address or port-number. .SH FILES .BR ~xymon/server/etc/hosts.cfg .SH "SEE ALSO" xymongen(1), xymonnet(1), xymondigest(1), xymonserver.cfg(5), xymon(7) xymon-4.3.28/common/msgcache.80000664000076400007640000000533513037531444016357 0ustar rpmbuildrpmbuild.TH MSGCACHE 8 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME msgcache \- Cache client messages for later pickup by xymonfetch .SH SYNOPSIS .B "msgcache [options]" .SH DESCRIPTION \fBmsgcache\fR implements a Xymon message cache. It is intended for use with clients which cannot deliver their data to the Xymon server in the normal way. Instead of having the client tools connect to the Xymon server, msgcache runs locally and the client tools then deliver their data to the msgcache daemon. The msgcache daemon is then polled regularly by the .I xymonfetch(8) utility, which collects the client messages stored by msgcache and forwards them to the Xymon server. \fBNOTE:\fR When using msgcache, the \fBXYMSRV\fR setting for the clients should be \fBXYMSRV=127.0.0.1\fR instead of pointing at the real Xymon server. .SH RESTRICTIONS Clients delivering their data to msgcache instead of the real Xymon server will in general not notice this. Specifically, the client configuration data provided by the Xymon server when a client delivers its data is forwarded through the xymonfetch / msgcache chain, so the normal centralized client configuration works. However, other commands which rely on clients communicating directly with the Xymon server will not work. This includes the \fBconfig\fR and \fBquery\fR commands which clients may use to fetch configuration files and query the Xymon server for a current status. The \fBdownload\fR command also does not work with msgcache. This means that the automatic client update facility will not work for clients communicating via msgcache. .SH OPTIONS .IP "--listen=IPADDRESS[:PORT]" Defines the IP-address and portnumber where msgcache listens for incoming connections. By default, msgcache listens for connections on all network interfaces, port 1984. .IP "--server=IPADDRESS[,IPADDRESS]" Restricts which servers are allowed to pick up the cached messages. By default anyone can contact the msgcache utility and request all of the cached messages. This option allows only the listed servers to request the cached messages. .IP "--max-age=N" Defines how long cached messages are kept. If the message has not been picked up with N seconds after being delivered to msgcache, it is silently discarded. Default: N=600 seconds (10 minutes). .IP "--daemon" Run as a daemon, i.e. msgcache will detach from the terminal and run as a background task .IP "--no-daemon" Run as a foreground task. This option must be used when msgcache is started by .I xymonlaunch(8) which is the normal way of running msgcache. .IP "--pidfile=FILENAME" Store the process ID of the msgcache task in FILENAME. .IP "--logfile=FILENAME" Log msgcache output to FILENAME. .IP "--debug" Enable debugging output. .SH "SEE ALSO" xymonfetch(8), xymon(7) xymon-4.3.28/common/xymonclient.cfg.50000664000076400007640000000373613037531444017714 0ustar rpmbuildrpmbuild.TH XYMONCLIENT.CFG 5 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME xymonclient.cfg \- Xymon client environment variables .SH DESCRIPTION Xymon programs use multiple environment variables beside the normal set of variables. For the Xymon client, the environment definitions are stored in the ~xymon/client/etc/xymonclient.cfg file. Each line in this file is of the form \fBNAME=VALUE\fR and defines one environment variable NAME with the value VALUE. .SH SETTINGS .IP XYMSRV The IP-address used to contact the Xymon server. Default: Chosen when the Xymon client was compiled. .IP XYMSERVERS List of IP-addresses of Xymon servers. Data will be sent to all of the servers listed here. This setting is only used if XYMSRV=0.0.0.0. .IP XYMONDPORT The port number for used to contact the Xymon server. Default: 1984. .IP XYMONHOME The Xymon client top-level directory. Default: The $XYMONCLIENTHOME setting inherited from the "runclient.sh" script which starts the Xymon client. .IP XYMONCLIENTLOGS The directory for the Xymon clients' own log files. Default: $XYMONHOME/logs .IP XYMONTMP Directory used for temporary files. Default: $XYMONHOME/tmp/ .IP XYMON Full path to the .I xymon(1) client program. Default: $XYMONHOME/bin/xymon. .IP Commands Many extension scripts expect a series of environment variables to point at various system utilities. These are included in the file when the client is built. .SH INHERITED SETTINGS Some environment variables are inherited from the "runclient.sh" script which launches the Xymon client: .IP MACHINEDOTS The hostname of the local system. Default: Taken from "uname \-n". .IP MACHINE The hostname of the local system, with dots replaced by commas. For compatibility with Big Brother extension scripts. .IP SERVEROSTYPE The operating system of the local system, in lowercase. Default: taken from "uname \-s". .IP XYMONCLIENTHOME The top-level directory for the Xymon client. Default: The location of the "runclient.sh" script. .SH "SEE ALSO" xymon(7) xymon-4.3.28/common/orcaxymon.10000664000076400007640000000226713037531444016616 0ustar rpmbuildrpmbuild.TH ORCAXYMON 1 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME orcaxymon \- Xymon client utility to grab data from ORCA .SH SYNOPSIS .B "orcaxymon --orca=PREFIX [options]" .SH NOTICE This utility is included in the client distribution for Xymon 4.2. However, the backend module to parse the data it sends it \fBNOT\fR included in Xymon 4.2. It is possible to use the generic Xymon NCV data handler in .I xymond_rrd(8) to process ORCA data, if you have an urgent need to do so. .SH DESCRIPTION \fBorcaxymon\fR is an add-on tool for the Xymon client. It is used to grab data collected by the ORCA data collection tool (orcallator.se), and send it to the Xymon server in NCV format. orcaxymon should run from the client .I xymonlaunch(8) utility, i.e. there must be an entry in the .I clientlaunch.cfg(5) file for orcaxymon. .SH OPTIONS .IP "--orca=PREFIX" The filename prefix for the ORCA data log. Typically this is the directory for the ORCA logs, followed by "orcallator". The actual filename for the ORCA logs include a timestamp and sequence number, e.g. "orcallator-2006-06-20-000". This option is required. .IP "--debug" Enable debugging output. .SH "SEE ALSO" xymon(7), clientlaunch.cfg(5) xymon-4.3.28/common/xymon.10000664000076400007640000005004413037531444015745 0ustar rpmbuildrpmbuild.TH XYMON 1 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME xymon \- Xymon client communication program .SH SYNOPSIS .B "xymon [options] RECIPIENT message" .SH DESCRIPTION .I xymon(1) is the client program used to communicate with a Xymon server. It is frequently used by Xymon client systems to send in status messages and pager alerts on local tests. In Xymon, the xymon program is also used for administrative purposes, e.g. to rename or delete hosts, or to disable hosts that are down for longer periods of time. .SH OPTIONS AND PARAMETERS .IP "\-\-debug" Enable debugging. This prints out details about how the connection to the Xymon server is being established. .IP "\-\-proxy=http://PROXYSERVER:PROXYPORT/" When sending the status messages via HTTP, use this server as an HTTP proxy instead of connecting directly to the Xymon server. .IP "\-\-timeout=N" Specifies the timeout for connecting to the Xymon server, in seconds. The default is 5 seconds. .IP "\-\-response" The xymon utility normally knows when to expect a response from the server, so this option is not required. However, it will cause any response from the server to be displayed. .IP "\-\-merge" Merge the command line message text with the data provided on standard input, and send the result to the Xymon server. The message text provided on the command line becomes the first line of the merged message. .IP "RECIPIENT" The \fBRECIPIENT\fR parameter defines which server receives the message. If RECIPIENT is given as "0.0.0.0", then the message is sent to all of the servers listed in the XYMSERVERS environment variable. Usually, a client will use "$XYMSRV" for the \fBRECIPIENT\fR parameter, as this is defined for the client scripts to automatically contain the correct value. The \fBRECIPIENT\fR parameter may be a URL for a webserver that has the xymoncgimsg.cgi or similar script installed. This tunnels the Xymon messages to the Xymon server using standard HTTP protocol. The .I xymoncgimsg.cgi(8) CGI tool (included in Xymon) must be installed on the webserver for the HTTP transport to work. .br .IP MESSAGE The \fBmessage\fR parameter is the message to be sent across to the Xymon server. Messages must be enclosed in quotes, but by doing so they can span multiple lines. The maximum size of a message is defined by the maximum allowed length of your shell\(aqs command-line, and is typically 8-32 KB. If you need to send longer status messages, you can specify "@" as the message: xymon will then read the status message from its stdin. .SH XYMON MESSAGE SYNTAX This section lists the most commonly used messages in the Xymon protocol. Each message must begin with one of the Xymon commands. Where a HOSTNAME is specified, it must have any dots in the hostname changed to commas if the Xymon FQDN setting is enabled (which is the default). So the host "www.foo.com", for example, would report as "www,foo,com". .IP "status[+LIFETIME][/group:GROUP] HOSTNAME.TESTNAME COLOR " This sends in a status message for a single test (column) on a single host. TESTNAME is the name of the column where this test will show up; any name is valid except that using dots in the testname will not work. COLOR must be one of the valid colors: "green", "yellow", "red" or "clear". The colors "blue" and "purple" - although valid colors - should not be sent in a status message, as these are handled specially by the Xymon server. As a special case (for supporting older clients), "client" can be used as the name of the color. This causes the status message to be handled by Xymon as a "client" data message, and the TESTNAME parameter is used as the "collector id". .br The "additional text" normally includes a local timestamp and a summary of the test result on the first line. Any lines following the first one are free-form, and can include any information that may be useful to diagnose the problem being reported. .br The LIFETIME defines how long this status is valid after being received by the Xymon server. The default is 30 minutes, but you can set any period you like. E.g. for a custom test that runs once an hour, you will want to set this to at least 60 minutes - otherwise the status will go purple after 30 minutes. It is a good idea to set the LIFETIME to slightly longer than the interval between your tests, to allow for variations in the time it takes your test to complete. The LIFETIME is in minutes, unless you add an "h" (hours), "d" (days) or "w" (weeks) immediately after the number, e.g. "status+5h" for a status that is valid for 5 hours. .br The GROUP option is used to direct alerts from the status to a specific group. It is currently used for status generated from the Xymon clients\(aq data, e.g. to direct alerts for a "procs" status to different people, depending on exactly which process is down. .IP "notify HOSTNAME.TESTNAME " This triggers an informational message to be sent to those who receive alerts for this HOSTNAME+TESTNAME combination, according to the rules defined in .I alerts.cfg(5) This is used by the .I enadis.cgi(1) tool to notify people about hosts being disabled or enabled, but can also serve as a general way of notifying server administrators. .IP "data HOSTNAME.DATANAME" The "data" message allows tools to send data about a host, without it appearing as a column on the Xymon webpages. This is used, for example, to report statistics about a host, e.g. vmstat data, which does not in itself represent something that has a red, yellow or green identity. It is used by RRD bottom-feeder modules, among others. In Xymon, data messages are by default processed only by the .I xymond_rrd(8) module. If you want to handle data-messages using an external application, you may want to enable the .I xymond_filestore(8) module for data-messages, to store data-messages in a format compatible with how the Big Brother daemon does. .IP "disable HOSTNAME.TESTNAME DURATION " Disables a specific test for DURATION minutes. This will cause the status of this test to be listed as "blue" on the Xymon server, and no alerts for this host/test will be generated. If DURATION is given as a number followed by s/m/h/d, it is interpreted as being in seconds/minutes/hours/days respectively. .BR To disable a test until it becomes OK, use "\-1" as the DURATION. .BR To disable all tests for a host, use an asterisk "*" for TESTNAME. .IP "enable HOSTNAME.TESTNAME" Re-enables a test that had been disabled. .IP "query HOSTNAME.TESTNAME" Query the Xymon server for the latest status reported for this particular test. If the host/test status is known, the response is the first line of the status report - the current color will be the first word on the line. Additional lines of text that might be present on the status message cannot be retrieved. .br This allows any Xymon client to determine the status of a particular test, whether it is one pertaining to the host where the client is running, some other host, or perhaps the result of a combined test from multiple hosts managed by .I combostatus(1) This will typically be useful to Xymon client extension scripts, that need to determine the status of other hosts, for example, to decide if an automatic recovery action should be initiated. .IP "config FILENAME" Retrieve one of the Xymon configuration files from the server. This command allows a client to pull files from the $XYMONHOME/etc/ directory on the server, allowing for semi-automatic updates of the client configuration. Since the configuration files are designed to have a common file for the configuration of all hosts in the system - and this is in fact the recommended way of configuring your clients - this makes it easier to keep the configuration files synchronized. .IP "drop HOSTNAME" Removes all data stored about the host HOSTNAME. It is assumed that you have already deleted the host from the hosts.cfg configuration file. .IP "drop HOSTNAME TESTNAME" Remove data about a single test (column). .IP "rename OLDHOSTNAME NEWHOSTNAME" Rename all data for a host that has had its name changed. You should do this after changing the hostname in the hosts.cfg configuration file. .IP "rename HOSTNAME OLDTESTNAME NEWTESTNAME" Rename data about a single test (column). .IP "xymondlog HOSTNAME.TESTNAME" Retrieve the Xymon status-log for a single test. The first line of the response contains a series of fields separated by a pipe-sign: .sp .BR hostname The name of the host .sp .BR testname The name of the test .sp .BR color Status color (green, yellow, red, blue, clear, purple) .sp .BR testflags For network tests, the flags indicating details about the test (used by xymongen). .sp .BR lastchange Unix timestamp when the status color last changed. .sp .BR logtime Unix timestamp when the log message was received. .sp .BR validtime Unix timestamp when the log message is no longer valid (it goes purple at this time). .sp .BR acktime Either \-1 or Unix timestamp when an active acknowledgement expires. .sp .BR disabletime Either \-1 or Unix timestamp when the status is no longer disabled. .sp .BR sender IP address where the status was received from. .sp .BR cookie Either \-1 or the cookie value used to acknowledge an alert. .sp .BR ackmsg Empty or the acknowledgment message sent when the status was acknowledged. Newline, pipe-signs and backslashes are escaped with a backslash, C-style. .sp .BR dismsg Empty or the message sent when the status was disabled. Newline, pipe-signs and backslashes are escaped with a backslash, C-style. .sp After the first line comes the full status log in plain text format. .IP "xymondxlog HOSTNAME.TESTNAME" Retrieves an XML string containing the status log as with the "xymondlog" command. .IP "xymondboard [CRITERIA] [fields=FIELDLIST]" Retrieves a summary of the status of all known tests available to the Xymon daemon. By default - if no CRITERIA is provided - it returns one line for all status messages that are found in Xymon. You can filter the response by selection specific page, host, test, color or various other fields. The PAGEPATH, NETWORK, HOSTNAME, TESTNAME, and *MSG parameters are interpreted perl-compatible regular expressions; the COLOR parameter accepts multiple colors separated by commas; the *TIME values accept unix epoch timestamps. Other variables identified in xymon-xmh(5) may also be used. Because host filtration is done before test filtration, it's more efficient (with very large data sets) to use PAGEPATH, HOSTNAME, NETWORK, and other XMH_ filters when possible, before globally filtering with COLOR, *MSG, *TIME, or TESTNAME. You can filter on, for example, both a hostname and a testname. .sp .BR page=PAGEPATH Include only tests from hosts found on the PAGEPATH page in the hosts.cfg file. .sp .BR net=NETWORK Include only tests from hosts with this NET: tag .sp .BR ip=IP Address Include only tests from hosts with this IP address. This is a regex, not CIDR. .sp .BR host=HOSTNAME Include only tests from the host HOSTNAME .sp .BR test=TESTNAME Include only tests with the testname TESTNAME .sp .BR color=COLORNAME Include only tests where the status color is COLORNAME .sp .BR tag=TAGNAME Include only hosts with a certain tag specified in the hosts.cfg(5) line. Note that only items known to xymon components are included here; arbitrary text is not included .sp .BR XMH_string=VALUE Include only hosts with a xymon-xmh(5) variable matching this value .sp Advanced Filtering .sp .BR msg=MESSAGE Include only tests with full content matching MESSAGE. Use "\\s" to escape spaces (or other PCRE strings) .sp .BR ackmsg=MESSAGE Include only tests with acknowledgement(s) MESSAGE. Use "\\s" to escape spaces (or other PCRE strings) .sp .BR dismsg=MESSAGE Include only tests that have been disabled with strings matching MESSAGE. Use "\\s" to escape spaces (or other PCRE strings). (It is most efficient to pair this with color=blue.) Timestamp Filters Certain fields (explained below) can be filtered with unix timestamps and with the following inequalities: >= > <= < = != These filters are: lastchange, logtime, validtime, acktime, disabletime The response is one line for each status that matches the CRITERIA, or all statuses if no criteria is specified. The line is composed of a number of fields, separated by a pipe-sign. You can select which fields to retrieve by listing them in the FIELDLIST. The following fields are available: .sp .BR hostname The name of the host .sp .BR testname The name of the test .sp .BR color Status color (green, yellow, red, blue, clear, purple) .sp .BR flags For network tests, the flags indicating details about the test (used by xymongen). .sp .BR lastchange Unix timestamp when the status color last changed. .sp .BR logtime Unix timestamp when the log message was received. .sp .BR validtime Unix timestamp when the log message is no longer valid (it goes purple at this time). .sp .BR acktime Either \-1 or Unix timestamp when an active acknowledgement expires. .sp .BR disabletime Either \-1 or Unix timestamp when the status is no longer disabled. .sp .BR sender IP address where the status was received from. .sp .BR cookie Either \-1 or the cookie value used to acknowledge an alert. .sp .BR line1 First line of status log. .sp .BR ackmsg Empty (if no acknowledgement is active), or the text of the acknowledge message. .sp .BR dismsg Empty (if the status is currently enabled), or the text of the disable message. .sp .BR msg The full text of the current status message. .sp .BR client Shows "Y" if there is client data available, "N" if not. .sp .BR clntstamp Timestamp when the last client message was received, in Unix "epoch" format. .sp .BR acklist List of the current acknowledgements for a test. This is a text string with multiple fields, delimited by a colon character. There are 5 fields: Timestamp for when the ack was generated and when it expires; the the "ack level"; the user who sent the ack; and the acknowledgement text. .sp .BR flapinfo Tells if the status is flapping. 5 fields, delimited by "/": A "0" if the status is not flapping and "1" if it is flapping; timestamp when the latest status change was recorded and when the first statuschange was recorded; and the two colors that the status is flapping between. .sp .BR stats Number of status-changes that have been recorded for this status since xymond was started. .sp .BR modifiers Lists all active modifiers for this status (i.e. updates sent using a "modify" command). .sp .BR XMH_* The XMH-tags refer to the Xymon .I hosts.cfg(5) configuration settings. A full list of these can be found in the .I xymon\-xmh(5) man-page. The ackmsg, dismsg and msg fields have certain characters encoded: Newline is "\\n", TAB is "\\t", carriage return is "\\r", a pipe-sign is "\\p", and a backslash is "\\\\". If the "fields" parameter is omitted, a default set of hostname,testname,color,flags,lastchange,logtime,validtime,acktime,disabletime,sender,cookie,line1 is used. .IP "xymondxboard" Retrieves an XML string with the summary of all status logs as for the "xymondboard" command. .IP "hostinfo [CRITERIA]" Retrieves the current configuration of a host (i.e. the .I hosts.cfg(5) definition). CRITERIA selects which host(s) to report, and is identical to the CRITERIA in the xymondboard command. The response is one line for each host that matches the CRITERIA, or all hosts if no criteria is specified. The line is composed of a number of fields, separated by a pipe-sign. The first two fields will always be the hostname and the IP-address. The remaining fields - if any - are the hosts.cfg tags in no particular order. .IP "download FILENAME" Download a file from the Xymon server\(aqs download directory. .IP "client[/COLLECTORID] HOSTNAME.OSTYPE [HOSTCLASS]" Used to send a "client" message to the Xymon server. Client messages are generated by the Xymon client; when sent to the Xymon server they are matched against the rules in the .I analysis.cfg(5) configuration file, and status messages are generated for the client-side tests. The COLLECTORID is used when sending client-data that are additions to the standard client data. The data will be concatenated with the normal client data. .IP "clientlog HOSTNAME [section=SECTIONNAME[,SECTIONNAME...]]" Retrieves the current raw client message last sent by HOSTNAME. The optional "section" filter is used to select specific sections of the client data. .IP "ping" Attempts to contact the Xymon server. If successful, the Xymon server version ID is reported. .IP "pullclient" This message is used when fetching client data via the "pull" mechanism implemented by .I xymonfetch(8) and .I msgcache(8) for clients that cannot connect directly to the Xymon server. .IP "ghostlist" Report a list of \fBghost\fR clients seen by the Xymon server. Ghosts are systems that report data to the Xymon server, but are not listed in the hosts.cfg file. .IP "schedule [TIMESTAMP COMMAND]" Schedules a command sent to the Xymon server for execution at a later time. E.g. used to schedule disabling of a host or service at sometime in the future. COMMAND is a complete Xymon command such as the ones listed above. TIMESTAMP is the Unix epoch time when the command will be executed. .br If no parameters are given, the currently scheduled tasks are listed in the response. The response is one line per scheduled command, with the job-id, the time when the command will be executed, the IP address from which this was sent, and the full command string. .br To cancel a previously scheduled command, \fB"schedule cancel JOBID"\fR can be used. JOBID is a number provided as the first item in the output from the schedule list. .IP "notes FILENAME" The message text will be stored in $XYMONHOME/notes/FILENAME which is then used as hyperlinks from hostnames or column names. This requires that the "storenotes" task is enabled in tasks.cfg (it is disabled by default). FILENAME cannot contain any directory path - these are stripped automatically. .IP "usermsg ID" These messages will be relayed directly to modules listening on the "user" channel of the Xymon daemon. This is intended for custom communication between client-side modules and the Xymon server. .IP "modify HOSTNAME.TESTNAME COLOR SOURCE CAUSE" Modify the color of a specific status, without generating a complete status message. This is for backend processors (e.g. RRD graphs) that can override the color of a status based on some criteria determined outside the normal flow of a status. E.g. the normal "conn" status may appear to be green since it merely checks on whether a host can be ping'ed or not; the RRD handler can then use a "modify" command to override this is the actual ping responsetime exceeds a given threshold. (See the "DS" configuration setting in .I analysis.cfg(5) for how to do this). SOURCE is some identification of the module that generates the "modify" message - future modifications must use the same source. There may be several sources that modify the same status (the most severe status then becomes the actual color of the status). CAUSE is a one-line text string explaining the reason for overriding the normal status color - it will be displayed on the status webpage. .SH EXAMPLE Send a normal status message to the Xymon server, using the standard Xymon protocol on TCP port 1984: .br $ $XYMON $XYMSRV "status www,foo,com.http green \(gadate\(ga Web OK" Send the same status message, but using HTTP protocol via the webserver\(aqs xymoncgimsg.cgi script: .br $ $XYMON http://bb.foo.com/cgi\-bin/xymoncgimsg.cgi "status www,foo,com.http green \(gadate\(ga Web OK" Use "query" message to determine the color of the "www" test, and restart Apache if it is red: .br $ WWW=\(ga$XYMON $XYMSRV "query www,foo,com.www" | awk \(aq{print $1}\(aq\(ga $ if [ "$WWW" = "red" ]; then /etc/init.d/apache restart; fi Use "config" message to update a local mytest.cfg file (but only if we get a response): .br $ $XYMON $XYMSRV "config mytest.cfg" >/tmp/mytest.cfg.new $ if [ \-s /tmp/mytest.cfg.new ]; then mv /tmp/mytest.cfg.new $XYMONHOME/etc/mytest.cfg fi Send a very large status message that has been built in the file "statusmsg.txt". Instead of providing it on the command-line, pass it via stdin to the xymon command: $ cat statusmsg.txt | $XYMON $XYMSRV "@" .SH "SEE ALSO" combostatus(1), hosts.cfg(5), xymonserver.cfg(5), xymon(7) xymon-4.3.28/common/Makefile0000664000076400007640000001147612266741164016164 0ustar rpmbuildrpmbuild# Xymon - common tools # PROGRAMS = xymongrep xymondigest xymon xymoncmd xymonlaunch xymoncfg CLIENTPROGRAMS = ../client/xymon ../client/xymonlaunch ../client/xymoncmd ../client/xymongrep ../client/xymoncfg ../client/xymondigest HOSTGREPOBJS = xymongrep.o HOSTSHOWOBJS = xymoncfg.o DIGESTOBJS = xymondigest.o XYMONOBJS = xymon.o LAUNCHOBJS = xymonlaunch.o CMDOBJS = xymoncmd.o XYMONCLIENTLIB = ../lib/libxymonclient.a XYMONCLIENTLIBS = $(XYMONCLIENTLIB) XYMONCLIENTCOMMLIB = ../lib/libxymonclientcomm.a XYMONCLIENTCOMMLIBS = $(XYMONCLIENTCOMMLIB) $(SSLLIBS) $(NETLIBS) $(LIBRTDEF) XYMONLIB = ../lib/libxymon.a XYMONLIBS = $(XYMONLIB) XYMONCOMMLIB = ../lib/libxymoncomm.a XYMONCOMMLIBS = $(XYMONCOMMLIB) $(SSLLIBS) $(NETLIBS) $(ZLIBLIBS) $(LIBRTDEF) XYMONTIMELIB = ../lib/libxymontime.a XYMONTIMELIBS = $(XYMONTIMELIB) $(LIBRTDEF) all: $(PROGRAMS) client: $(CLIENTPROGRAMS) xymongrep: $(HOSTGREPOBJS) $(XYMONCOMMLIB) $(XYMONLIB) $(CC) $(CFLAGS) -o $@ $(HOSTGREPOBJS) $(XYMONCOMMLIBS) $(XYMONLIBS) ../client/xymongrep: $(HOSTGREPOBJS) $(XYMONCLIENTCOMMLIB) $(XYMONCLIENTLIB) $(CC) $(CFLAGS) -o $@ $(HOSTGREPOBJS) $(XYMONCLIENTCOMMLIBS) $(XYMONCLIENTLIBS) xymoncfg: $(HOSTSHOWOBJS) $(XYMONLIB) $(CC) $(CFLAGS) -o $@ $(HOSTSHOWOBJS) $(XYMONLIBS) ../client/xymoncfg: $(HOSTSHOWOBJS) $(XYMONCLIENTLIB) $(CC) $(CFLAGS) -o $@ $(HOSTSHOWOBJS) $(XYMONCLIENTLIBS) xymon: $(XYMONOBJS) $(XYMONCOMMLIB) $(XYMONLIB) $(CC) $(CFLAGS) -o $@ $(XYMONOBJS) $(XYMONCOMMLIBS) $(XYMONLIBS) ../client/xymon: $(XYMONOBJS) $(XYMONCLIENTCOMMLIB) $(XYMONCLIENTLIB) $(CC) $(CFLAGS) -o $@ $(XYMONOBJS) $(XYMONCLIENTCOMMLIBS) $(XYMONCLIENTLIBS) xymonlaunch: $(LAUNCHOBJS) $(XYMONTIMELIB) $(XYMONLIB) $(CC) $(CFLAGS) -o $@ $(LAUNCHOBJS) $(XYMONTIMELIBS) $(XYMONLIBS) ../client/xymonlaunch: $(LAUNCHOBJS) $(XYMONTIMELIB) $(XYMONCLIENTLIB) $(CC) $(CFLAGS) -o $@ $(LAUNCHOBJS) $(XYMONTIMELIBS) $(XYMONCLIENTLIBS) xymoncmd: $(CMDOBJS) $(XYMONLIB) $(CC) $(CFLAGS) -o $@ $(CMDOBJS) $(XYMONLIBS) ../client/xymoncmd: $(CMDOBJS) $(XYMONCLIENTLIB) $(CC) $(CFLAGS) -o $@ $(CMDOBJS) $(XYMONCLIENTLIBS) xymondigest: $(DIGESTOBJS) $(XYMONLIB) $(CC) $(CFLAGS) -o $@ $(DIGESTOBJS) $(XYMONCOMMLIBS) $(XYMONLIBS) ../client/xymondigest: $(DIGESTOBJS) $(XYMONCLIENTCOMMLIB) $(XYMONCLIENTLIB) $(CC) $(CFLAGS) -o $@ $(DIGESTOBJS) $(XYMONCLIENTCOMMLIBS) $(XYMONCLIENTLIBS) xymon.exe: xymon.c ../lib/strfunc.c ../lib/errormsg.c ../lib/environ.c ../lib/stackio.c ../lib/timefunc.c ../lib/memory.c ../lib/sendmsg.c ../lib/holidays.c ../lib/rbtr.c ../lib/msort.c $(CC) $(CFLAGS) -c xymon.c $(CC) $(CFLAGS) -DXYMONTOPDIR=\"$(XYMONTOPDIR)\" -DXYMONLOGDIR=\"$(XYMONLOGDIR)\" -DXYMONHOSTNAME=\"$(XYMONHOSTNAME)\" -DXYMONHOSTIP=\"$(XYMONHOSTIP)\" -DXYMONHOSTOS=\"$(XYMONHOSTOS)\" -DXYMONHOME=\"$(XYMONHOME)\" -c ../lib/environ.c $(CC) $(CFLAGS) -c ../lib/strfunc.c $(CC) $(CFLAGS) -c ../lib/errormsg.c $(CC) $(CFLAGS) -c ../lib/stackio.c $(CC) $(CFLAGS) -c ../lib/timefunc.c $(CC) $(CFLAGS) -c ../lib/memory.c $(CC) $(CFLAGS) -c ../lib/sendmsg.c $(CC) $(CFLAGS) -c ../lib/holidays.c $(CC) $(CFLAGS) -c ../lib/rbtr.c $(CC) $(CFLAGS) -c ../lib/msort.c $(CC) $(CFLAGS) -c ../lib/misc.c ar cr xymonwin32.a environ.o strfunc.o errormsg.o stackio.o timefunc.o memory.o sendmsg.o holidays.o rbtr.o msort.o misc.o ranlib xymonwin32.a || echo "" $(CC) -o $@ xymon.o xymonwin32.a ################################################ # Default compilation rules ################################################ %.o: %.c $(CC) $(CFLAGS) -c -o $@ $< clean: rm -f *.o *.a *~ $(PROGRAMS) $(CLIENTPROGRAMS) install: install-bin install-man install-bin: $(PROGRAMS) ifndef PKGBUILD chown $(XYMONUSER) $(PROGRAMS) chgrp `$(IDTOOL) -g $(XYMONUSER)` $(PROGRAMS) chmod 755 $(PROGRAMS) endif cp -fp $(PROGRAMS) $(INSTALLROOT)$(INSTALLBINDIR)/ cd $(INSTALLROOT)$(INSTALLBINDIR)/; rm -f bb bbcmd bbhostgrep bbhostshow; ln -s xymon bb; ln -s xymoncmd bbcmd; ln -s xymongrep bbhostgrep; ln -s xymondigest bbdigest; ln -s xymoncfg bbhostshow install-man: ifndef PKGBUILD chown $(XYMONUSER) *.1 *.5 *.7 *.8 chgrp `$(IDTOOL) -g $(XYMONUSER)` *.1 *.5 *.7 *.8 chmod 644 *.1 *.5 *.7 *.8 endif mkdir -p $(INSTALLROOT)$(MANROOT)/man1 $(INSTALLROOT)$(MANROOT)/man5 $(INSTALLROOT)$(MANROOT)/man7 $(INSTALLROOT)$(MANROOT)/man8 ifndef PKGBUILD chown $(XYMONUSER) $(INSTALLROOT)$(MANROOT)/man1 $(INSTALLROOT)$(MANROOT)/man5 $(INSTALLROOT)$(MANROOT)/man7 $(INSTALLROOT)$(MANROOT)/man8 chgrp `$(IDTOOL) -g $(XYMONUSER)` $(INSTALLROOT)$(MANROOT)/man1 $(INSTALLROOT)$(MANROOT)/man5 $(INSTALLROOT)$(MANROOT)/man7 $(INSTALLROOT)$(MANROOT)/man8 chmod 755 $(INSTALLROOT)$(MANROOT)/man1 $(INSTALLROOT)$(MANROOT)/man5 $(INSTALLROOT)$(MANROOT)/man7 $(INSTALLROOT)$(MANROOT)/man8 endif cp -fp *.1 $(INSTALLROOT)$(MANROOT)/man1/ cp -fp *.5 $(INSTALLROOT)$(MANROOT)/man5/ cp -fp *.7 $(INSTALLROOT)$(MANROOT)/man7/ cp -fp *.8 $(INSTALLROOT)$(MANROOT)/man8/ xymon-4.3.28/common/xymoncfg.10000664000076400007640000000233013037531444016420 0ustar rpmbuildrpmbuild.TH XYMONCFG 1 "Version 4.3.28: 17 Jan 2017" "Xymon" .SH NAME xymoncfg \- output the full hosts.cfg file .SH SYNOPSIS .B "xymoncfg [--web] [--net] [filename]" .SH DESCRIPTION .I xymoncfg(1) dumps the full hosts.cfg file to stdout. It follows "include" tags in the hosts.cfg files, and prints the full contents as seen by the .I xymongen(1) and .I xymonnet(1) utilities. If no filename is given, xymoncfg displays the file pointed to by the HOSTSCFG environment variable. .SH OPTIONS .IP "--web" Show the hosts.cfg file following include statements as a Xymon web-server would. .IP "--net" Show the hosts.cfg file following include statements as done when running xymonnet. .IP "-s" Output only the lines that look like environment variable definitions, in a format suitable for use with Bourne-style shells (e.g. bash, ksh). You will probably not use this with the default hosts.cfg input file, but e.g. xymonserver.cfg. To define all the variables in xymonserver.cfg inside your shell script, you can use .br .br eval `xymoncfg -s /etc/xymon/xymonserver.cfg` .IP "-c" Similar to "-s", but for C-shell. .SH ENVIRONMENT VARIABLES .IP HOSTSCFG Filename for the .I hosts.cfg(5) file. .SH "SEE ALSO" hosts.cfg(5), xymonserver.cfg(5) xymon-4.3.28/common/xymonlaunch.c0000664000076400007640000005573112411755466017241 0ustar rpmbuildrpmbuild/* -*- mode:C; tab-width:8; intent-tabs-mode:1; c-basic-offset:8 -*- */ /*----------------------------------------------------------------------------*/ /* Xymon application launcher. */ /* */ /* This is used to launch various parts of the Xymon system. Some programs */ /* start up once and keep running, other must run at various intervals. */ /* */ /* Copyright (C) 2004-2011 Henrik Storner */ /* "CMD +/-" code and enable/disable enhancement by Martin Sperl 2010-2011 */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: xymonlaunch.c 7482 2014-09-28 09:56:06Z storner $"; #include #include #include #include #include #include #include #include #include #include #include #include #include #include "libxymon.h" #include /* * config file format: * * [xymond] * CMD xymond --no-daemon * LOGFILE /var/log/xymond.log * * [xymongen] * CMD xymongen * INTERVAL 5m */ #define MAX_FAILS 5 typedef struct grouplist_t { char *groupname; int currentuse, maxuse; struct grouplist_t *next; } grouplist_t; typedef struct tasklist_t { char *key; int disabled; grouplist_t *group; char *cmd; int interval, maxruntime; char *logfile; char *envfile, *envarea, *onhostptn; pid_t pid; time_t laststart; int exitcode; int failcount; int cfload; /* Used while reloading a configuration */ int beingkilled; char *cronstr; /* pointer to cron string */ void *crondate; /* pointer to cron date-time structure */ int cronmin; /* minute value of the last sucessful cron execution attempt */ struct tasklist_t *depends; struct tasklist_t *next; struct tasklist_t *copy; } tasklist_t; tasklist_t *taskhead = NULL; tasklist_t *tasktail = NULL; grouplist_t *grouphead = NULL; volatile time_t nextcfgload = 0; volatile int running = 1; volatile int dologswitch = 0; volatile int forcereload=0; # define xfreenull(k) { if (k) { xfree(k); k=NULL;} } # define xfreeassign(k,p) { if (k) { xfree(k); } k=p; } # define xfreedup(k,p) { if (k) { xfree(k); } k=strdup(p); } void load_config(char *conffn) { static void *configfiles = NULL; tasklist_t *twalk, *curtask = NULL; FILE *fd; strbuffer_t *inbuf; char *p; char myhostname[256]; /* First check if there were no modifications at all */ if (configfiles) { if (!stackfmodified(configfiles) && (!forcereload)) { dbgprintf("No files modified, skipping reload of %s\n", conffn); return; } else { stackfclist(&configfiles); configfiles = NULL; } } errprintf("Loading tasklist configuration from %s\n", conffn); if (gethostname(myhostname, sizeof(myhostname)) != 0) { errprintf("Cannot get the local hostname, using 'localhost' (error: %s)\n", strerror(errno)); strcpy(myhostname, "localhost"); } /* The cfload flag: -1=delete task, 0=old task unchanged, 1=new/changed task */ for (twalk = taskhead; (twalk); twalk = twalk->next) { twalk->cfload = -1; twalk->group = NULL; /* Create a copy, but retain the settings and pointers are the same */ twalk->copy = xmalloc(sizeof(tasklist_t)); memcpy(twalk->copy,twalk,sizeof(tasklist_t)); /* These should get cleared */ twalk->copy->next = NULL; twalk->copy->copy = NULL; /* And clean the values of all others, so that we really can detect a difference */ twalk->disabled = 0; twalk->cmd = NULL; twalk->interval = 0; twalk->maxruntime = 0; twalk->group = NULL; twalk->logfile = NULL; twalk->envfile = NULL; twalk->envarea = NULL; twalk->onhostptn = NULL; twalk->cronstr = NULL; twalk->crondate = NULL; twalk->depends = NULL; } fd = stackfopen(conffn, "r", &configfiles); if (fd == NULL) { errprintf("Cannot open configuration file %s: %s\n", conffn, strerror(errno)); return; } inbuf = newstrbuffer(0); while (stackfgets(inbuf, NULL)) { sanitize_input(inbuf, 1, 0); if (STRBUFLEN(inbuf) == 0) continue; p = STRBUF(inbuf); if (*p == '[') { /* New task */ char *endp; /* get name */ p++; endp = strchr(p, ']'); if (endp == NULL) continue; *endp = '\0'; /* try to find the task */ for (twalk = taskhead; (twalk && (strcmp(twalk->key, p))); twalk = twalk->next); if (twalk) { curtask=twalk; } else { /* New task, just create it */ curtask = (tasklist_t *)calloc(1, sizeof(tasklist_t)); curtask->key = strdup(p); /* add it to the list */ if (taskhead == NULL) taskhead = curtask; else tasktail->next = curtask; tasktail = curtask; } /* mark task as configured */ curtask->cfload = 0; } else if (curtask && (strncasecmp(p, "CMD ", 4) == 0)) { p += 3; p += strspn(p, " \t"); /* Handle + - options as well */ if (*p == '+') { /* append to command */ if (curtask->cmd) { int l1 = strlen(curtask->cmd); int l2 = strlen(p); char *newcmd = xcalloc(1, l1+l2+1); strncpy(newcmd,curtask->cmd,l1); strncpy(newcmd+l1,p,l2); newcmd[l1]=' '; /* this also overwrites the + */ /* free and assign new */ xfreeassign(curtask->cmd,newcmd); } } else if (*p == '-') { /* remove from command */ if (curtask->cmd) { int l = strlen(p)-1; if (l > 0) { char *found; while((found = strstr(curtask->cmd,p+1)) != NULL) { /* doing a copy - can not use strcpy as we are overlapping */ char *s = found + l; while (*s) { *found=*s; found++; s++; } *found=0; } } else { errprintf("Configuration error, empty command removal (CMD -) for task %s\n", curtask->key); } } } else { xfreedup(curtask->cmd,p); } } else if (strncasecmp(p, "GROUP ", 6) == 0) { /* Note: GROUP can be used by itself to define a group, or inside a task definition */ char *groupname; int maxuse; grouplist_t *gwalk; p += 6; p += strspn(p, " \t"); groupname = p; p += strcspn(p, " \t"); if (isdigit((int) *p)) maxuse = atoi(p); else maxuse = 1; /* Find or create the grouplist entry */ for (gwalk = grouphead; (gwalk && (strcmp(gwalk->groupname, groupname))); gwalk = gwalk->next); if (gwalk == NULL) { gwalk = (grouplist_t *)malloc(sizeof(grouplist_t)); gwalk->groupname = strdup(groupname); gwalk->maxuse = maxuse; gwalk->currentuse = 0; gwalk->next = grouphead; grouphead = gwalk; } if (curtask) curtask->group = gwalk; } else if (curtask && (strncasecmp(p, "INTERVAL ", 9) == 0)) { char *tspec; p += 9; curtask->interval = atoi(p); tspec = p + strspn(p, "0123456789"); switch (*tspec) { case 'm': curtask->interval *= 60; break; /* Minutes */ case 'h': curtask->interval *= 3600; break; /* Hours */ case 'd': curtask->interval *= 86400; break; /* Days */ } } else if (curtask && (strncasecmp(p, "CRONDATE ", 9) == 0)) { p+= 9; xfreedup(curtask->cronstr,p); if (curtask->crondate) crondatefree(curtask->crondate); curtask->crondate = parse_cron_time(curtask->cronstr); if (!curtask->crondate) { errprintf("Can't parse cron date: %s->%s\n", curtask->key, curtask->cronstr); curtask->disabled = 1; } curtask->interval = -1; /* disable interval */ } else if (curtask && (strncasecmp(p, "MAXTIME ", 8) == 0)) { char *tspec; p += 8; curtask->maxruntime = atoi(p); tspec = p + strspn(p, "0123456789"); switch (*tspec) { case 'm': curtask->maxruntime *= 60; break; /* Minutes */ case 'h': curtask->maxruntime *= 3600; break; /* Hours */ case 'd': curtask->maxruntime *= 86400; break; /* Days */ } } else if (curtask && (strncasecmp(p, "LOGFILE ", 8) == 0)) { p += 7; p += strspn(p, " \t"); xfreedup(curtask->logfile,p); } else if (curtask && (strncasecmp(p, "NEEDS ", 6) == 0)) { p += 6; p += strspn(p, " \t"); for (twalk = taskhead; (twalk && strcmp(twalk->key, p)); twalk = twalk->next); if (twalk) { curtask->depends = twalk; } else { errprintf("Configuration error, unknown dependency %s->%s\n", curtask->key, p); } } else if (curtask && (strncasecmp(p, "ENVFILE ", 8) == 0)) { p += 7; p += strspn(p, " \t"); xfreedup(curtask->envfile,p); } else if (curtask && (strncasecmp(p, "ENVAREA ", 8) == 0)) { p += 7; p += strspn(p, " \t"); xfreedup(curtask->envarea,p); } else if (curtask && (strcasecmp(p, "DISABLED") == 0)) { curtask->disabled = 1; } else if (curtask && (strcasecmp(p, "ENABLED") == 0)) { curtask->disabled = 0; } else if (curtask && (strncasecmp(p, "ONHOST ", 7) == 0)) { regex_t cpattern; int status; p += 7; p += strspn(p, " \t"); xfreedup(curtask->onhostptn,p); /* Match the hostname against the pattern; if it doesnt match then disable the task */ status = regcomp(&cpattern, curtask->onhostptn, REG_EXTENDED|REG_ICASE|REG_NOSUB); if (status == 0) { status = regexec(&cpattern, myhostname, 0, NULL, 0); if (status == REG_NOMATCH) curtask->disabled = 1; } else { errprintf("ONHOST pattern '%s' is invalid\n", p); } } } stackfclose(fd); freestrbuffer(inbuf); /* Running tasks that have been deleted or changed are killed off now. */ for (twalk = taskhead; (twalk); twalk = twalk->next) { /* compare the current settings with the copy - if we have one */ if (twalk->cfload == 0) { if (twalk->copy) { /* compare the current version with the new version and decide if we have changed */ int changed=0; int reload=0; /* first the nummeric ones */ if (twalk->disabled!=twalk->copy->disabled) { changed++; } if (twalk->interval!=twalk->copy->interval) { changed++; } if (twalk->maxruntime!=twalk->copy->maxruntime) { changed++; } if (twalk->group!=twalk->copy->group) { changed++; reload++;} /* then the string versions */ #define twalkstrcmp(k,doreload) { \ if (twalk->k!=twalk->copy->k) { \ if (twalk->copy->k) { \ if (twalk->k) { \ if (strcmp(twalk->k,twalk->copy->k)) { \ changed++;reload+=doreload; \ } \ } else { \ changed++;reload+=doreload; \ } \ /* we can always delete the copy*/ \ xfree(twalk->copy->k); \ twalk->copy->k=NULL; \ } else { \ changed++;reload+=doreload; \ } \ } \ } twalkstrcmp(cmd,1); twalkstrcmp(logfile,1); twalkstrcmp(envfile,1); twalkstrcmp(envarea,1); twalkstrcmp(onhostptn,0); twalkstrcmp(cronstr,0); if ((twalk->copy->cronstr == NULL) && twalk->copy->crondate) { crondatefree(twalk->copy->crondate); twalk->copy->crondate = NULL; } /* we can release the copy now - not using xfree, as this releases it from the list making a mess...*/ xfreenull(twalk->copy); /* now make the decision for reloading - if we have changed, then we may assign cfload, - otherwise the entry does not exist any longer */ if (reload) { reload=1;} if (changed) { twalk->cfload=reload; } } else { /* new object, so we need to do this */ twalk->cfload=1; } } /* and based on this decide what to do */ switch (twalk->cfload) { case -1: /* Kill the task, if active */ if (twalk->pid) { dbgprintf("Killing task %s PID %d\n", twalk->key, (int)twalk->pid); twalk->beingkilled = 1; kill(twalk->pid, SIGTERM); } /* And prepare to free this tasklist entry */ xfreenull(twalk->key); xfreenull(twalk->cmd); xfreenull(twalk->logfile); xfreenull(twalk->envfile); xfreenull(twalk->envarea); xfreenull(twalk->onhostptn); xfreenull(twalk->cronstr); if (twalk->crondate) crondatefree(twalk->crondate); break; case 0: /* Do nothing */ break; case 1: /* Bounce the task, if it is active */ if (twalk->pid) { dbgprintf("Killing task %s PID %d\n", twalk->key, (int)twalk->pid); twalk->beingkilled = 1; kill(twalk->pid, SIGTERM); } break; } } /* First clean out dead tasks at the start of the list */ while (taskhead && (taskhead->cfload == -1)) { tasklist_t *tmp; tmp = taskhead; taskhead = taskhead->next; xfree(tmp); } /* Then unlink and free those inside the list */ twalk = taskhead; while (twalk && twalk->next) { tasklist_t *tmp; if (twalk->next->cfload == -1) { tmp = twalk->next; twalk->next = tmp->next; xfree(tmp); } else twalk = twalk->next; } if (taskhead == NULL) tasktail = NULL; else { tasktail = taskhead; while (tasktail->next) tasktail = tasktail->next; } /* Make sure group usage counts are correct (groups can change) */ for (twalk = taskhead; (twalk); twalk = twalk->next) { if (twalk->group) twalk->group->currentuse = 0; } for (twalk = taskhead; (twalk); twalk = twalk->next) { if (twalk->group && twalk->pid) twalk->group->currentuse++; } } void sig_handler(int signum) { switch (signum) { case SIGCHLD: break; case SIGHUP: nextcfgload = 0; dologswitch = 1; break; case SIGTERM: running = 0; break; } } int main(int argc, char *argv[]) { tasklist_t *twalk, *dwalk; grouplist_t *gwalk; int argi; int daemonize = 1; int verbose = 0; int dumpconfig = 0; struct stat st; char *config = NULL; char *logfn = NULL; char *pidfn = NULL; pid_t cpid; int status; struct sigaction sa; char *envarea = NULL; for (argi=1; (argi < argc); argi++) { if (strcmp(argv[argi], "--debug") == 0) { debug = 1; } else if (strcmp(argv[argi], "--no-daemon") == 0) { daemonize = 0; } else if (strcmp(argv[argi], "--verbose") == 0) { verbose = 1; } else if (argnmatch(argv[argi], "--config=")) { char *p = strchr(argv[argi], '='); config = strdup(expand_env(p+1)); } else if (argnmatch(argv[argi], "--log=")) { char *p = strchr(argv[argi], '='); logfn = strdup(expand_env(p+1)); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } else if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--pidfile=")) { char *p = strchr(argv[argi], '='); pidfn = strdup(expand_env(p+1)); } else if (strcmp(argv[argi], "--dump") == 0) { dumpconfig = 1; } else { fprintf(stderr,"%s: Unsupported argument: %s\n",argv[0],argv[argi]); fflush(stderr); return 1; } } /* Find config */ if (!config) { if (stat("/etc/tasks.cfg", &st) != -1) config = strdup("/etc/tasks.cfg"); else if (stat("/etc/xymon/tasks.cfg", &st) != -1) config = strdup("/etc/xymon/tasks.cfg"); else if (stat("/etc/xymon-client/clientlaunch.cfg", &st) != -1) config = strdup("/etc/xymon-client/clientlaunch.cfg"); else if (xgetenv("XYMONHOME")) { config = (char *)malloc(strlen(xgetenv("XYMONHOME")) + strlen("/etc/tasks.cfg") + 1); sprintf(config, "%s/etc/tasks.cfg", xgetenv("XYMONHOME")); } if (config) dbgprintf("Using config file: %s\n", config); } if (!config || stat(config, &st) == -1) { fprintf(stderr,"%s: Error reading config file %s\n", argv[0], config); fflush(stderr); return 1; } /* Dump configuration */ if (dumpconfig) { forcereload=1; load_config(config); forcereload=0; for (gwalk = grouphead; (gwalk); gwalk = gwalk->next) { if (gwalk->maxuse > 1) printf("GROUP %s %d\n", gwalk->groupname, gwalk->maxuse); } printf("\n"); for (twalk = taskhead; (twalk); twalk = twalk->next) { printf("[%s]\n", twalk->key); printf("\tCMD %s\n", twalk->cmd); if (twalk->disabled) printf("\tDISABLED\n"); if (twalk->group) printf("\tGROUP %s\n", twalk->group->groupname); if (twalk->depends) printf("\tNEEDS %s\n", twalk->depends->key); if (twalk->interval > 0) printf("\tINTERVAL %d\n", twalk->interval); if (twalk->cronstr) printf("\tCRONDATE %s\n", twalk->cronstr); if (twalk->maxruntime) printf("\tMAXTIME %d\n", twalk->maxruntime); if (twalk->logfile) printf("\tLOGFILE %s\n", twalk->logfile); if (twalk->envfile) printf("\tENVFILE %s\n", twalk->envfile); if (twalk->envarea) printf("\tENVAREA %s\n", twalk->envarea); if (twalk->onhostptn) printf("\tONHOST %s\n", twalk->onhostptn); printf("\n"); } fflush(stdout); return 0; } /* Go daemon */ if (daemonize) { pid_t childpid; /* Become a daemon */ childpid = fork(); if (childpid < 0) { /* Fork failed */ errprintf("Could not fork child\n"); exit(1); } else if (childpid > 0) { /* Parent exits */ if (pidfn) { FILE *pidfd = fopen(pidfn, "w"); if (pidfd) { fprintf(pidfd, "%d\n", (int)childpid); fclose(pidfd); } } exit(0); } /* Child (daemon) continues here */ setsid(); } /* If using a logfile, switch stdout and stderr to go there */ if (logfn) { /* Should we close stdin here ? No ... */ reopen_file("/dev/null", "r", stdin); reopen_file(logfn, "a", stdout); reopen_file(logfn, "a", stderr); } save_errbuf = 0; setup_signalhandler("xymonlaunch"); memset(&sa, 0, sizeof(sa)); sa.sa_handler = sig_handler; sigaction(SIGHUP, &sa, NULL); sigaction(SIGTERM, &sa, NULL); sigaction(SIGCHLD, &sa, NULL); errprintf("xymonlaunch starting\n"); while (running) { time_t now = gettimer(); struct timeval curtime; struct tm tt; int thisminute = -1; gettimeofday(&curtime, NULL); gmtime_r(&curtime.tv_sec, &tt); thisminute = tt.tm_min; if (now >= nextcfgload) { load_config(config); nextcfgload = (now + 30); } if (logfn && dologswitch) { reopen_file(logfn, "a", stdout); reopen_file(logfn, "a", stderr); dologswitch = 0; } /* Pick up children that have terminated */ while ((cpid = wait3(&status, WNOHANG, NULL)) > 0) { for (twalk = taskhead; (twalk && (twalk->pid != cpid)); twalk = twalk->next); if (twalk) { twalk->pid = 0; twalk->beingkilled = 0; if (WIFEXITED(status)) { twalk->exitcode = WEXITSTATUS(status); if (twalk->exitcode) { errprintf("Task %s terminated, status %d\n", twalk->key, twalk->exitcode); twalk->failcount++; } else { twalk->failcount = 0; } } else if (WIFSIGNALED(status)) { twalk->exitcode = -WTERMSIG(status); twalk->failcount++; errprintf("Task %s terminated by signal %d\n", twalk->key, abs(twalk->exitcode)); } if (twalk->group) twalk->group->currentuse--; /* Tasks that depend on this task should be killed ... */ for (dwalk = taskhead; (dwalk); dwalk = dwalk->next) { if ((dwalk->depends == twalk) && (dwalk->pid > 0)) { dwalk->beingkilled = 1; kill(dwalk->pid, SIGTERM); } } } } /* See what new tasks need to get going */ dbgprintf("\n"); dbgprintf("Starting tasklist scan\n"); crongettime(); for (twalk = taskhead; (twalk); twalk = twalk->next) { if ( (twalk->pid == 0) && !twalk->disabled && ( ((twalk->interval >= 0) && (now >= (twalk->laststart + twalk->interval))) || /* xymon interval condition */ (twalk->crondate && (twalk->cronmin != thisminute) && cronmatch(twalk->crondate) ) /* cron date, has not had run attempt this minute */ ) ) { if (twalk->depends && ((twalk->depends->pid == 0) || (twalk->depends->laststart > (now - 5)))) { dbgprintf("Postponing start of %s due to %s not yet running\n", twalk->key, twalk->depends->key); continue; } if (twalk->group && (twalk->group->currentuse >= twalk->group->maxuse)) { dbgprintf("Postponing start of %s due to group %s being busy\n", twalk->key, twalk->group->groupname); continue; } if ((twalk->failcount > MAX_FAILS) && ((twalk->laststart + 600) < now)) { dbgprintf("Releasing %s from failure hold\n", twalk->key); twalk->failcount = 0; } if (twalk->failcount > MAX_FAILS) { dbgprintf("Postponing start of %s due to multiple failures\n", twalk->key); continue; } if (twalk->laststart > (now - 5)) { dbgprintf("Postponing start of %s, will not try more than once in 5 seconds\n", twalk->key); continue; } dbgprintf("About to start task %s\n", twalk->key); twalk->laststart = now; if (twalk->crondate) twalk->cronmin = thisminute; twalk->pid = fork(); if (twalk->pid == 0) { /* Exec the task */ char *cmd; char **cmdargs = NULL; static char tasksleepenv[20],bbsleepenv[20]; /* Setup environment */ if (twalk->envfile) { dbgprintf("%s -> Loading environment from %s area %s\n", twalk->key, expand_env(twalk->envfile), (twalk->envarea ? twalk->envarea : "")); loadenv(expand_env(twalk->envfile), twalk->envarea); } /* Setup TASKSLEEP to match the interval */ sprintf(tasksleepenv, "TASKSLEEP=%d", twalk->interval); sprintf(bbsleepenv, "BBSLEEP=%d", twalk->interval); /* For compatibility */ putenv(tasksleepenv); putenv(bbsleepenv); /* Setup command line and arguments */ cmdargs = setup_commandargs(twalk->cmd, &cmd); /* Point stdout/stderr to a logfile, if requested */ if (twalk->logfile) { char *logfn = expand_env(twalk->logfile); dbgprintf("%s -> Assigning stdout/stderr to log '%s'\n", twalk->key, logfn); reopen_file(logfn, "a", stdout); reopen_file(logfn, "a", stderr); } /* Go! */ dbgprintf("%s -> Running '%s', XYMONHOME=%s\n", twalk->key, cmd, xgetenv("XYMONHOME")); execvp(cmd, cmdargs); /* Should never go here */ errprintf("Could not start task %s using command '%s': %s\n", twalk->key, cmd, strerror(errno)); exit(0); } else if (twalk->pid == -1) { /* Fork failed */ errprintf("Fork failed!\n"); twalk->pid = 0; } else { if (twalk->group) twalk->group->currentuse++; if (verbose) errprintf("Task %s started with PID %d\n", twalk->key, (int)twalk->pid); } } else if (twalk->pid > 0) { dbgprintf("Task %s active with PID %d\n", twalk->key, (int)twalk->pid); if (twalk->maxruntime && ((now - twalk->laststart) > twalk->maxruntime)) { errprintf("Killing hung task %s (PID %d) after %d seconds\n", twalk->key, (int)twalk->pid, (now - twalk->laststart)); kill(twalk->pid, (twalk->beingkilled ? SIGKILL : SIGTERM)); twalk->beingkilled = 1; /* Next time it's a real kill */ } } /* Crondate + our flag isn't set and we don't need to run... reset the minute value to the flag. */ /* This clears whenever the minute has changed */ if (twalk->crondate && (twalk->cronmin != -1) && !cronmatch(twalk->crondate)) twalk->cronmin = -1; } sleep(5); } /* Shutdown running tasks */ for (twalk = taskhead; (twalk); twalk = twalk->next) { if (twalk->pid) kill(twalk->pid, SIGTERM); } if (pidfn) unlink(pidfn); return 0; } xymon-4.3.28/demotool/0000775000076400007640000000000013037531512015034 5ustar rpmbuildrpmbuildxymon-4.3.28/demotool/demotool.c0000664000076400007640000003020011615341300017007 0ustar rpmbuildrpmbuild/*----------------------------------------------------------------------------*/ /* Xymon demonstration tool. */ /* */ /* This tool fakes several hosts that can be tested by Xymon, both with */ /* fake network services and fake client data. It is used to demonstrate */ /* features in Xymon. */ /* */ /* Copyright (C) 2005-2011 Henrik Storner */ /* */ /* This program is released under the GNU General Public License (GPL), */ /* version 2. See the file "COPYING" for details. */ /* */ /*----------------------------------------------------------------------------*/ static char rcsid[] = "$Id: demotool.c 6712 2011-07-31 21:01:52Z storner $"; #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_SYS_SELECT_H #include #endif char *CONFIGDIR = "/etc/hdemo"; struct sockaddr_in srvaddr; volatile int reconfig = 1; typedef struct netsvc_t { int listenfd; int delay; char *response; int respsize; struct netsvc_t *next; } netsvc_t; netsvc_t *nethead = NULL; typedef struct active_t { int fd; netsvc_t *svc; struct timeval rbegin; char *respbuf, *respptr; int readdone; int bytesleft; struct active_t *next; } active_t; active_t *acthead = NULL; typedef struct client_t { time_t lastupd; char *hostname; char *ostype; time_t bootup; double minload, maxload; char *msg; struct client_t *next; } client_t; client_t *clihead = NULL; static DIR *confdir = NULL; struct dirent *dent = NULL; static char *path = NULL; char *nextservice(char *dirname, char *svc) { struct stat st; char fn[PATH_MAX]; FILE *fd; char *result; if (dirname) { if (confdir) closedir(confdir); if (path) free(path); confdir = opendir(dirname); path = strdup(dirname); } do { do { dent = readdir(confdir); } while (dent && (*(dent->d_name) == '.')); if (!dent) { closedir(confdir); free(path); path = NULL; confdir = NULL; dent = NULL; return NULL; } sprintf(fn, "%s/%s/%s", path, dent->d_name, svc); } while ( (stat(fn, &st) == -1) || ((fd = fopen(fn, "r")) == NULL) ); result = (char *)malloc(st.st_size+1); fread(result, 1, st.st_size, fd); *(result + st.st_size) = '\0'; fclose(fd); return result; } char *svcattrib(char *attr) { struct stat st; char fn[PATH_MAX]; FILE *fd; char *result; if (!dent) return NULL; if (!attr) { sprintf(fn, "%s/%s", path, dent->d_name); return strdup(fn); } sprintf(fn, "%s/%s/%s", path, dent->d_name, attr); if (stat(fn, &st) == -1) return NULL; fd = fopen(fn, "r"); if (!fd) return NULL; result = (char *)calloc(1, st.st_size+1); fread(result, 1, st.st_size, fd); fclose(fd); return result; } void addtobuffer(char **buf, int *bufsz, char *newtext) { if (*buf == NULL) { *bufsz = strlen(newtext) + 4096; *buf = (char *) malloc(*bufsz); **buf = '\0'; } else if ((strlen(*buf) + strlen(newtext) + 1) > *bufsz) { *bufsz += strlen(newtext) + 4096; *buf = (char *) realloc(*buf, *bufsz); } strcat(*buf, newtext); } char *clientdata(char *cpath) { char *res = NULL; int ressz = 0; DIR *cdir; struct dirent *d; char fn[PATH_MAX]; struct stat st; int n; FILE *fd; char buf[4096]; cdir = opendir(cpath); while ((d = readdir(cdir)) != NULL) { if (strncmp(d->d_name, "client_", 7) != 0) continue; sprintf(fn, "%s/%s", cpath, d->d_name); if (stat(fn, &st) == -1) continue; fd = fopen(fn, "r"); if (fd == NULL) continue; sprintf(buf, "[%s]\n", d->d_name+7); addtobuffer(&res, &ressz, buf); while ((n = fread(buf, 1, sizeof(buf)-1, fd)) > 0) { *(buf+n) = '\0'; addtobuffer(&res, &ressz, buf); } fclose(fd); } closedir(cdir); if (!res) res = strdup(""); return res; } int timeafter(struct timeval *lim, struct timeval *now) { if (now->tv_sec > lim->tv_sec) return 1; if (now->tv_sec < lim->tv_sec) return 0; return (now->tv_usec >= lim->tv_usec); } void setuplisteners(void) { netsvc_t *nwalk; char *lspec; struct sockaddr_in laddr; nwalk = nethead; while (nwalk) { netsvc_t *tmp = nwalk; nwalk = nwalk->next; if (tmp->listenfd > 0) close(tmp->listenfd); if (tmp->response) free(tmp->response); free(tmp); } nethead = NULL; lspec = nextservice(CONFIGDIR, "listen"); while (lspec) { char *p, *listenip = NULL; int listenport = -1; int lsocket, opt; p = strchr(lspec, ':'); if (p) { *p = '\0'; p++; listenip = lspec; listenport = atoi(p); } if (listenip && (listenport > 0)) { memset(&laddr, 0, sizeof(laddr)); inet_aton(listenip, (struct in_addr *) &laddr.sin_addr.s_addr); laddr.sin_port = htons(listenport); laddr.sin_family = AF_INET; lsocket = socket(AF_INET, SOCK_STREAM, 0); if (lsocket != -1) { opt = 1; setsockopt(lsocket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); fcntl(lsocket, F_SETFL, O_NONBLOCK); if ( (bind(lsocket, (struct sockaddr *)&laddr, sizeof(laddr)) != -1) && (listen(lsocket, 10) != -1) ) { netsvc_t *newitem = malloc(sizeof(netsvc_t)); newitem->listenfd = lsocket; newitem->response = svcattrib("response"); newitem->respsize = (newitem->response ? strlen(newitem->response) : 0); p = svcattrib("delay"); newitem->delay = (p ? atoi(p) : 0); newitem->next = nethead; nethead = newitem; } } } free(lspec); lspec = nextservice(NULL, "listen"); } } void setupclients(void) { client_t *cwalk; char *cspec; cwalk = clihead; while (cwalk) { client_t *tmp = cwalk; cwalk = cwalk->next; if (tmp->hostname) free(tmp->hostname); if (tmp->ostype) free(tmp->ostype); if (tmp->msg) free(tmp->msg); free(tmp); } clihead = NULL; cspec = nextservice(CONFIGDIR, "client"); while (cspec) { char *p; p = strchr(cspec, ':'); if (p) { client_t *newitem = (client_t *)malloc(sizeof(client_t)); *p = '\0'; newitem->lastupd = 0; newitem->hostname = strdup(cspec); newitem->ostype = strdup(p+1); while ((p = strchr(newitem->hostname, '.')) != NULL) *p = ','; p = svcattrib("uptime"); if (p) newitem->bootup = time(NULL) - 60*atoi(p); else newitem->bootup = time(NULL); p = svcattrib("minload"); if (p) newitem->minload = atof(p); else newitem->minload = 0.2; p = svcattrib("maxload"); if (p) newitem->maxload = atof(p); else newitem->maxload = 1.0; newitem->msg = clientdata(svcattrib(NULL)); newitem->next = clihead; clihead = newitem; } free(cspec); cspec = nextservice(NULL, "client"); } } void do_select(void) { fd_set readfds, writefds; int maxfd, n; netsvc_t *nwalk; active_t *awalk, *aprev; struct timeval now, start; struct timezone tz; struct timeval tmo; char rbuf[4096]; gettimeofday(&start, &tz); do { gettimeofday(&now, &tz); FD_ZERO(&readfds); FD_ZERO(&writefds); maxfd = -1; nwalk = nethead; while (nwalk) { if (nwalk->listenfd) { FD_SET(nwalk->listenfd, &readfds); if (nwalk->listenfd > maxfd) maxfd = nwalk->listenfd; } nwalk = nwalk->next; } awalk = acthead; while (awalk) { if (awalk->fd) { if (!awalk->readdone) { FD_SET(awalk->fd, &readfds); if (awalk->fd > maxfd) maxfd = awalk->fd; } if (timeafter(&awalk->rbegin, &now)) { FD_SET(awalk->fd, &writefds); if (awalk->fd > maxfd) maxfd = awalk->fd; } } awalk = awalk->next; } tmo.tv_sec = 0; tmo.tv_usec = 100000; n = select(maxfd+1, &readfds, &writefds, NULL, &tmo); } while ((n == 0) && ((now.tv_sec - start.tv_sec) < 10)); if (n <= 0) return; gettimeofday(&now, &tz); awalk = acthead; aprev = NULL; while (awalk) { if (awalk->fd && !awalk->readdone && FD_ISSET(awalk->fd, &readfds)) { n = read(awalk->fd, rbuf, sizeof(rbuf)); if (n <= 0) awalk->readdone = 1; } if (awalk->fd && awalk->respptr && FD_ISSET(awalk->fd, &writefds)) { n = write(awalk->fd, awalk->respptr, awalk->bytesleft); if (n > 0) { awalk->respptr += n; awalk->bytesleft -= n; } } else n = 0; if ((awalk->bytesleft == 0) || (n < 0)) { if (awalk->respbuf) free(awalk->respbuf); close(awalk->fd); awalk->fd = 0; } if (awalk->fd) { aprev = awalk; awalk = awalk->next; } else { active_t *tmp = awalk; awalk = awalk->next; if (aprev) aprev->next = awalk; else acthead = awalk; free(tmp); } } nwalk = nethead; while (nwalk) { int newfd; if (nwalk->listenfd && FD_ISSET(nwalk->listenfd, &readfds)) { while ((newfd = accept(nwalk->listenfd, NULL, 0)) > 0) { /* Pick up a new connection */ fcntl(newfd, F_SETFL, O_NONBLOCK); active_t *newitem = (active_t *)malloc(sizeof(active_t)); newitem->fd = newfd; newitem->rbegin.tv_sec = now.tv_sec + nwalk->delay; newitem->rbegin.tv_usec = now.tv_usec + (random() % 1000000); if (newitem->rbegin.tv_usec > 1000000) { newitem->rbegin.tv_usec -= 1000000; newitem->rbegin.tv_sec++; } newitem->svc = nwalk; if (nwalk->response) { newitem->respbuf = strdup(nwalk->response); newitem->respptr = newitem->respbuf; newitem->bytesleft = nwalk->respsize; } else { newitem->respbuf = NULL; newitem->respptr = NULL; newitem->bytesleft = 0; } newitem->readdone = 0; newitem->next = acthead; acthead = newitem; } } nwalk = nwalk->next; } } void do_clients(void) { client_t *cwalk; active_t *conn; time_t now = time(NULL); time_t uptime; int updays, uphours, upmins; int n; struct tm *tm; double curload; cwalk = clihead; while (cwalk && ((cwalk->lastupd + 60) > now)) cwalk = cwalk->next; if (!cwalk) return; cwalk->lastupd = now; tm = localtime(&now); uptime = now - cwalk->bootup; updays = uptime / 86400; uphours = (uptime % 86400) / 3600; upmins = (uptime % 3600) / 60; curload = cwalk->minload + ((random() % 1000) / 1000.0) * (cwalk->maxload - cwalk->minload); conn = malloc(sizeof(active_t)); conn->fd = socket(AF_INET, SOCK_STREAM, 0); fcntl(conn->fd, F_SETFL, O_NONBLOCK); conn->rbegin.tv_sec = now; conn->rbegin.tv_usec = 0; conn->svc = NULL; conn->respbuf = (char *)malloc(strlen(cwalk->msg) + 4096); sprintf(conn->respbuf, "client %s.%s\n[date]\n%s[uptime]\n %02d:%02d:%02d up %d days, %d:%02d, 1 users, load average: 0.21, %5.2f, 0.25\n\n%s\n", cwalk->hostname, cwalk->ostype, ctime(&now), tm->tm_hour, tm->tm_min, tm->tm_sec, updays, uphours, upmins, curload, cwalk->msg); conn->respptr = conn->respbuf; conn->bytesleft = strlen(conn->respbuf); conn->readdone = 0; n = connect(conn->fd, (struct sockaddr *)&srvaddr, sizeof(srvaddr)); if ((n == 0) || ((n == -1) && (errno == EINPROGRESS))) { conn->next = acthead; acthead = conn; } else { close(conn->fd); free(conn->respbuf); free(conn); } } void sigmisc_handler(int signum) { if (signum == SIGHUP) reconfig = 1; } int main(int argc, char *argv[]) { int argi; struct sigaction sa; time_t lastconf = 0; memset(&srvaddr, 0, sizeof(srvaddr)); srvaddr.sin_port = htons(1984); srvaddr.sin_family = AF_INET; inet_aton("127.0.0.1", (struct in_addr *) &srvaddr.sin_addr.s_addr); for (argi = 1; (argi < argc); argi++) { if (strncmp(argv[argi], "--confdir=", 10) == 0) { char *p = strchr(argv[argi], '='); CONFIGDIR = strdup(p+1); } else if (strncmp(argv[argi], "--srvip=", 8) == 0) { char *p = strchr(argv[argi], '='); inet_aton(p+1, (struct in_addr *) &srvaddr.sin_addr.s_addr); } } memset(&sa, 0, sizeof(sa)); sa.sa_handler = sigmisc_handler; sigaction(SIGHUP, &sa, NULL); while (1) { if (reconfig || (time(NULL) > (lastconf+60))) { printf("(Re)loading config\n"); setuplisteners(); setupclients(); reconfig = 0; lastconf = time(NULL); } do_clients(); do_select(); } return 0; } xymon-4.3.28/demotool/Makefile0000664000076400007640000000015111070452713016471 0ustar rpmbuildrpmbuildall: demotool demotool: demotool.o $(CC) $(CFLAGS) -o $@ $< $(NETLIBS) clean: rm -f *.o demotool *~ xymon-4.3.28/demotool/data/0000775000076400007640000000000013037531512015745 5ustar rpmbuildrpmbuildxymon-4.3.28/demotool/data/democonf/0000775000076400007640000000000013037531512017537 5ustar rpmbuildrpmbuildxymon-4.3.28/demotool/data/democonf/smtp/0000775000076400007640000000000013037531512020522 5ustar rpmbuildrpmbuildxymon-4.3.28/demotool/data/democonf/smtp/listen0000664000076400007640000000001711411662565021750 0ustar rpmbuildrpmbuild127.0.0.1:3025 xymon-4.3.28/demotool/data/democonf/smtp/response0000664000076400007640000000003111411662565022304 0ustar rpmbuildrpmbuild220 voodoo.hswn.dk ESMTP xymon-4.3.28/demotool/data/democonf/demohost/0000775000076400007640000000000013037531512021361 5ustar rpmbuildrpmbuildxymon-4.3.28/demotool/data/democonf/demohost/client_ps0000664000076400007640000003713011411662565023277 0ustar rpmbuildrpmbuild PID PPID USER STARTED S PRI %CPU TIME %MEM RSZ VSZ CMD 1 0 root Jan 23 S 23 0.0 00:00:01 0.0 532 1764 /sbin/init splash 2 1 root Jan 23 S 139 0.0 00:00:00 0.0 0 0 [migration/0] 3 1 root Jan 23 S 5 0.0 00:00:00 0.0 0 0 [ksoftirqd/0] 4 1 root Jan 23 S 139 0.0 00:00:00 0.0 0 0 [watchdog/0] 5 1 root Jan 23 S 29 0.0 00:00:05 0.0 0 0 [events/0] 6 1 root Jan 23 S 29 0.0 00:00:00 0.0 0 0 [khelper] 7 1 root Jan 23 S 29 0.0 00:00:00 0.0 0 0 [kthread] 9 7 root Jan 23 S 29 0.0 00:00:01 0.0 0 0 [kblockd/0] 10 7 root Jan 23 S 19 0.0 00:00:00 0.0 0 0 [kacpid] 11 7 root Jan 23 S 19 0.0 00:00:00 0.0 0 0 [kacpi_notify] 124 7 root Jan 23 S 29 0.0 00:00:00 0.0 0 0 [kseriod] 157 7 root Jan 23 S 24 0.0 00:00:21 0.0 0 0 [pdflush] 159 1 root Jan 23 S 24 0.0 00:00:27 0.0 0 0 [kswapd0] 160 7 root Jan 23 S 20 0.0 00:00:00 0.0 0 0 [aio/0] 1715 7 root Jan 23 S 25 0.0 00:00:00 0.0 0 0 [ata/0] 1795 7 root Jan 23 S 23 0.0 00:00:00 0.0 0 0 [scsi_eh_0] 1796 7 root Jan 23 S 23 0.0 00:00:00 0.0 0 0 [scsi_eh_1] 1825 7 root Jan 23 S 29 0.0 00:00:00 0.0 0 0 [khubd] 1838 7 root Jan 23 S 29 0.0 00:00:00 0.0 0 0 [khpsbpkt] 1854 1 root Jan 23 S 24 0.0 00:00:00 0.0 0 0 [knodemgrd_0] 1982 7 root Jan 23 S 29 0.0 00:00:02 0.0 0 0 [reiserfs/0] 2064 1 root Jan 23 S 24 0.0 00:00:00 0.0 544 1728 //sbin/logd 2228 1 root Jan 23 S 27 0.0 00:00:01 0.0 1260 2736 /sbin/udevd --daemon 2960 7 root Jan 23 S 26 0.0 00:00:00 0.0 0 0 [shpchpd] 3044 7 root Jan 23 S 23 0.0 00:00:00 0.0 0 0 [kpsmoused] 3455 1 dhcp Jan 23 S 25 0.0 00:00:00 0.0 840 2520 dhclient3 -pf /var/run/dhclient.eth0.pid -lf /var/lib/dhcp3/dhclient.eth0.leases eth0 3791 1 daemon Jan 23 S 24 0.0 00:00:00 0.0 388 1704 /sbin/portmap 3970 1 root Jan 23 S 23 0.0 00:00:00 0.0 1172 2672 /bin/login -- 3971 1 root Jan 23 S 23 0.0 00:00:00 0.0 508 1600 /sbin/getty 38400 tty2 3972 1 root Jan 23 S 23 0.0 00:00:00 0.0 508 1600 /sbin/getty 38400 tty3 3973 1 root Jan 23 S 23 0.0 00:00:00 0.0 500 1596 /sbin/getty 38400 tty4 3974 1 root Jan 23 S 23 0.0 00:00:00 0.0 504 1596 /sbin/getty 38400 tty5 3975 1 root Jan 23 S 23 0.0 00:00:00 0.0 508 1600 /sbin/getty 38400 tty6 4179 1 root Jan 23 S 23 0.0 00:00:00 0.0 1156 2200 /usr/sbin/acpid -c /etc/acpi/events -s /var/run/acpid.socket 4305 1 root Jan 23 S 24 0.0 00:01:19 0.0 508 1720 /bin/dd bs 1 if /proc/kmsg of /var/run/klogd/kmsg 4307 1 klog Jan 23 S 23 0.0 00:00:17 0.0 1288 2408 /sbin/klogd -P /var/run/klogd/kmsg 4326 1 102 Jan 23 S 24 0.0 00:00:01 0.0 856 2176 /usr/bin/dbus-daemon --system 4341 1 121 Jan 23 S 24 0.0 00:00:03 0.3 5556 7088 /usr/sbin/hald 4342 4341 root Jan 23 S 22 0.0 00:00:00 0.0 1064 2912 hald-runner 4348 4342 121 Jan 23 S 14 0.0 00:00:00 0.0 804 2020 /usr/lib/hal/hald-addon-acpi 4355 4342 121 Jan 23 S 24 0.0 00:00:09 0.0 808 2020 /usr/lib/hal/hald-addon-keyboard 4365 4342 121 Jan 23 S 24 0.0 00:00:19 0.0 916 2028 /usr/lib/hal/hald-addon-storage 4402 1 root Jan 23 S 24 0.0 00:00:00 0.1 1624 4176 /usr/sbin/openvpn --writepid /var/run/openvpn.client.pid --daemon ovpn-client --status /var/run/openvpn.client.status 10 --cd /etc/openvpn --config /etc/openvpn/client.conf 4466 1 root Jan 23 S 19 0.0 00:00:00 0.1 2528 21924 /usr/sbin/slapd 4495 1 root Jan 23 S 23 0.0 00:00:01 0.1 2272 5584 /usr/sbin/apt-index-watcher watch --syslog 4646 1 root Jan 23 S 23 0.0 00:00:00 0.0 680 1744 /usr/sbin/automount --pid-file=/var/run/autofs/_home.pid --timeout=1200 /home file /etc/auto.home 4654 1 root Jan 23 S 23 0.0 00:00:00 0.0 688 1748 /usr/sbin/automount --pid-file=/var/run/autofs/_var_netdisk.pid --timeout=300 /var/netdisk file /etc/auto.netdisk 4709 1 root Jan 23 S 14 0.0 00:00:00 0.0 504 1640 /usr/sbin/inetd 4726 1 ivman Jan 23 S 23 0.0 00:00:00 0.1 1640 4632 /usr/bin/ivman 4767 7 root Jan 23 S 29 0.0 00:00:00 0.0 0 0 [nfsd4] 4768 1 root Jan 23 S 24 0.0 00:00:00 0.0 0 0 [nfsd] 4769 1 root Jan 23 S 14 0.0 00:00:00 0.0 0 0 [lockd] 4770 7 root Jan 23 S 29 0.0 00:00:30 0.0 0 0 [rpciod/0] 4771 1 root Jan 23 S 24 0.0 00:00:00 0.0 0 0 [nfsd] 4772 1 root Jan 23 S 24 0.0 00:00:00 0.0 0 0 [nfsd] 4773 1 root Jan 23 S 24 0.0 00:00:00 0.0 0 0 [nfsd] 4774 1 root Jan 23 S 24 0.0 00:00:00 0.0 0 0 [nfsd] 4775 1 root Jan 23 S 24 0.0 00:00:00 0.0 0 0 [nfsd] 4776 1 root Jan 23 S 24 0.0 00:00:00 0.0 0 0 [nfsd] 4777 1 root Jan 23 S 24 0.0 00:00:00 0.0 0 0 [nfsd] 4781 1 root Jan 23 S 14 0.0 00:00:00 0.0 284 1788 /usr/sbin/rpc.mountd 4857 1 root Jan 23 S 24 0.0 00:00:00 0.1 1620 4796 /usr/lib/postfix/master 4859 4857 postfix Jan 23 S 24 0.0 00:00:00 0.1 1700 4844 qmgr -l -t fifo -u -c 4893 1 root Jan 23 S 23 0.0 00:00:00 0.0 1064 4936 /usr/sbin/sshd 4972 1 root Jan 23 S 23 0.0 00:00:00 0.0 660 2684 /usr/bin/kdm 4986 1 statd Jan 23 S 24 0.0 00:00:00 0.0 720 1744 /sbin/rpc.statd 5009 1 root Jan 23 S 14 0.0 00:00:00 0.0 708 2068 /usr/sbin/hcid 5015 1 root Jan 23 S 14 0.0 00:00:00 0.0 496 1668 /usr/sbin/sdpd 5026 1 root Jan 23 S 15 0.0 00:00:00 0.0 468 1828 /usr/bin/hidd --search --master --server 5033 1 root Jan 23 S 29 0.0 00:00:00 0.0 0 0 [krfcommd] 5046 1 root Jan 23 S 24 0.0 00:00:00 0.0 300 1716 /sbin/mdadm --monitor --pid-file /var/run/mdadm.pid --mail root --daemonise --scan 5081 1 daemon Jan 23 S 23 0.0 00:00:00 0.0 468 1852 /usr/sbin/atd 5111 1 root Jan 23 S 23 0.0 00:00:00 0.0 856 2192 /usr/sbin/cron 5179 1 root Jan 23 S 20 0.0 00:00:00 0.0 164 1452 /opt/VMware/bin/vmnet-bridge -d /var/run/vmnet-bridge-0.pid /dev/vmnet0 eth0 5876 1 henrik Jan 23 S 24 0.0 00:00:00 0.0 444 2564 gpg-agent --daemon 5976 1 henrik Jan 23 S 23 0.0 00:00:00 0.0 464 2684 /opt/applix/axdata/axnet /tmp/.axnetipc -fork 17872 1 henrik Feb 02 S 24 0.0 00:00:00 0.0 444 2560 gpg-agent --daemon 3469 7 root Feb 05 S 24 0.0 00:00:20 0.0 0 0 [pdflush] 32003 1 hobbit Feb 07 S 23 0.0 00:00:05 0.0 444 1908 /usr/lib/hobbit/server/bin/hobbitlaunch --config=/usr/lib/hobbit/server/etc/hobbitlaunch.cfg --env=/usr/lib/hobbit/server/etc/hobbitserver.cfg --log=/var/log/hobbit/hobbitlaunch.log --pidfile=/var/log/hobbit/hobbitlaunch.pid 32004 32003 hobbit Feb 07 S 23 0.0 00:00:17 0.0 1256 4892 hobbitd --pidfile=/var/log/hobbit/hobbitd.pid --restart=/usr/lib/hobbit/server/tmp/hobbitd.chk --checkpoint-file=/usr/lib/hobbit/server/tmp/hobbitd.chk --checkpoint-interval=600 --log=/var/log/hobbit/hobbitd.log --admin-senders=127.0.0.1 127.0.0.1 --store-clientlogs=!msgs 32005 32003 hobbit Feb 07 S 23 0.0 00:00:00 0.0 540 2176 hobbitd_channel --channel=stachg --log=/var/log/hobbit/history.log hobbitd_history 32006 32003 hobbit Feb 07 S 23 0.0 00:00:00 0.0 588 2436 hobbitd_channel --channel=clichg --log=/var/log/hobbit/hostdata.log hobbitd_hostdata 32007 32003 hobbit Feb 07 S 23 0.0 00:00:00 0.0 604 2176 hobbitd_channel --channel=page --log=/var/log/hobbit/page.log hobbitd_alert --checkpoint-file=/usr/lib/hobbit/server/tmp/alert.chk --checkpoint-interval=600 32008 32003 hobbit Feb 07 S 24 0.0 00:00:02 0.0 548 2180 hobbitd_channel --channel=status --log=/var/log/hobbit/rrd-status.log hobbitd_rrd --rrddir=/var/lib/hobbit/rrd 32009 32003 hobbit Feb 07 S 24 0.0 00:00:00 0.0 512 2176 hobbitd_channel --channel=data --log=/var/log/hobbit/rrd-data.log hobbitd_rrd --rrddir=/var/lib/hobbit/rrd 32010 32003 hobbit Feb 07 S 23 0.0 00:00:02 0.0 600 2432 hobbitd_channel --channel=client --log=/var/log/hobbit/clientdata.log hobbitd_client 32015 32005 hobbit Feb 07 S 23 0.0 00:00:00 0.0 676 2320 hobbitd_history 32016 32008 hobbit Feb 07 S 23 0.0 00:00:19 0.0 1528 3896 hobbitd_rrd --rrddir=/var/lib/hobbit/rrd 32062 32010 hobbit Feb 07 S 23 0.0 00:00:01 0.0 1480 2872 hobbitd_client 32063 32009 hobbit Feb 07 S 23 0.0 00:00:08 0.0 1536 3896 hobbitd_rrd --rrddir=/var/lib/hobbit/rrd 32081 32006 hobbit Feb 07 S 23 0.0 00:00:00 0.0 640 2184 hobbitd_hostdata 20945 1 henrik Feb 08 S 24 0.0 00:00:00 0.0 444 2564 gpg-agent --daemon 27371 1 root Feb 09 S 23 0.0 00:00:07 1.1 18172 417020 /work/obm/jvm/bin/java -Xrs -Xmx256m -client -Djava.library.path=/work/obm/bin -cp /work/obm/bin:/work/obm/bin/obcs.jar:/work/obm/bin/obcs-lib.jar obcs /work/obm 12564 3970 henrik Feb 10 S 23 0.0 00:00:00 0.1 2044 3688 -bash 4352 1 henrik Feb 11 S 24 0.0 00:00:00 0.0 444 2564 gpg-agent --daemon 10421 1 cupsys Feb 15 S 14 0.0 00:00:00 0.1 2032 4568 /usr/sbin/cupsd 24441 1 root 07:35:51 S 14 0.0 00:00:00 0.1 2424 7984 /usr/sbin/apache2 -k start -DSSL 24442 24441 www-data 07:35:51 S 14 0.0 00:00:00 0.1 1796 7776 /usr/sbin/apache2 -k start -DSSL 24443 24441 www-data 07:35:51 S 5 0.0 00:00:00 0.2 3624 229728 /usr/sbin/apache2 -k start -DSSL 24455 24441 www-data 07:35:51 S 6 0.0 00:00:00 0.2 3916 230000 /usr/sbin/apache2 -k start -DSSL 24540 1 root 07:35:52 S 14 0.0 00:00:00 0.0 724 2960 /usr/bin/dirmngr --daemon --sh 24678 1 root 07:36:11 S 14 0.0 00:00:00 0.0 572 1648 /sbin/syslogd 29276 4857 postfix 12:35:42 S 23 0.0 00:00:00 0.1 1572 4808 pickup -l -t fifo -u -c 30177 32007 hobbit 13:23:44 S 24 0.0 00:00:00 0.0 984 2424 hobbitd_alert --checkpoint-file=/usr/lib/hobbit/server/tmp/alert.chk --checkpoint-interval=600 30326 4972 root 13:32:15 R 23 3.6 00:01:14 3.5 55148 62960 /usr/bin/X -br -nolisten tcp :0 vt7 -auth /var/run/xauth/A:0-FfyMdk 30327 4972 root 13:32:15 S 23 0.0 00:00:00 0.0 1412 3660 -:0 30336 30327 henrik 13:32:30 S 23 0.0 00:00:00 0.1 1608 3312 /bin/sh /usr/bin/startkde 30407 1 henrik 13:32:32 S 24 0.0 00:00:00 0.0 448 2564 gpg-agent --daemon 30416 30336 henrik 13:32:32 S 24 0.0 00:00:00 0.0 728 4480 /usr/bin/ssh-agent /usr/bin/ssh-agent /usr/bin/dbus-launch --exit-with-session /usr/bin/startkde 30417 30336 henrik 13:32:32 S 24 0.0 00:00:00 0.0 724 4480 /usr/bin/ssh-agent /usr/bin/dbus-launch --exit-with-session /usr/bin/startkde 30420 1 henrik 13:32:32 S 23 0.0 00:00:00 0.0 628 2532 /usr/bin/dbus-launch --exit-with-session /usr/bin/startkde 30421 1 henrik 13:32:32 S 15 0.0 00:00:00 0.0 428 2056 /usr/bin/dbus-daemon --fork --print-pid 9 --print-address 7 --session 30452 1 henrik 13:32:33 S 23 0.0 00:00:00 0.0 140 1448 start_kdeinit --new-startup +kcminit_startup 30453 1 henrik 13:32:33 S 23 0.0 00:00:00 0.4 7692 24320 kdeinit Running... 30456 1 henrik 13:32:33 S 24 0.0 00:00:00 0.1 3008 23856 dcopserver [kdeinit] --nosid 30458 30453 henrik 13:32:33 S 24 0.0 00:00:00 0.5 8732 26016 klauncher [kdeinit] --new-startup 30460 1 henrik 13:32:35 S 24 0.0 00:00:00 0.9 14240 30340 kded [kdeinit] --new-startup 30466 30336 henrik 13:32:37 S 24 0.0 00:00:00 0.0 356 1584 kwrapper ksmserver 30468 1 henrik 13:32:37 S 24 0.0 00:00:00 0.6 9880 25568 ksmserver [kdeinit] 30469 30453 henrik 13:32:37 S 24 0.1 00:00:02 0.8 13480 28012 kwin [kdeinit] -session 10d8e66972000113665488500000147750000_1171801918_683812 30471 1 henrik 13:32:38 S 24 0.0 00:00:01 1.0 15824 29840 kdesktop [kdeinit] 30473 1 henrik 13:32:39 S 24 0.1 00:00:03 1.1 17564 32264 kicker [kdeinit] 30477 30453 henrik 13:32:39 S 24 0.0 00:00:00 0.5 8720 26460 kio_file [kdeinit] file /tmp/ksocket-henrik/klauncherztj4ca.slave-socket /tmp/ksocket-henrik/kdesktopUJZMlb.slave-socket 30480 30453 henrik 13:32:42 S 90 0.0 00:00:01 0.4 7724 21244 /usr/bin/artsd -F 10 -S 4096 -s 60 -m artsmessage -c drkonqi -l 3 -f 30489 1 henrik 13:32:43 S 24 0.0 00:00:00 0.6 9536 25324 kaccess [kdeinit] 30492 1 henrik 13:32:43 S 24 0.0 00:00:00 0.9 15096 29412 kmix [kdeinit] -session 10d8e66972000113137936700000076630078_1171801918_592291 30493 30453 henrik 13:32:43 S 24 0.0 00:00:01 0.6 9448 15276 gkrellm --sm-client-id 101af1c8105108000115942552700000054890012 30498 30453 henrik 13:32:44 S 24 0.0 00:00:00 0.3 6140 26788 xmms --sm-client-id 101af1c8105108000116094585300000054240022 30501 1 henrik 13:32:45 S 24 0.0 00:00:00 0.5 8456 13996 /opt/applix/axdata/axmain -helper 30500 4 8 -servicename axmain:henrik::0 30508 1 henrik 13:32:46 S 24 0.0 00:00:00 0.0 292 2864 applix 30510 1 henrik 13:32:46 S 24 0.0 00:00:00 0.8 12940 33268 knotify [kdeinit] 30516 1 henrik 13:32:47 S 24 0.1 00:00:03 0.9 14752 30436 adept_notifier 30518 1 henrik 13:32:48 S 24 0.0 00:00:00 0.7 11608 26404 klipper [kdeinit] 30520 1 henrik 13:32:48 S 24 0.0 00:00:00 0.9 14404 30680 korgac --miniicon korganizer 30727 1 henrik 13:41:55 S 23 0.0 00:00:00 0.1 1604 3312 /bin/sh /usr/lib/openoffice/program/soffice -impress -splash-pipe=5 30741 30727 henrik 13:41:58 S 24 1.5 00:00:22 6.4 100704 226848 /usr/lib/openoffice/program/soffice.bin -impress -splash-pipe=5 30813 30453 henrik 13:44:16 S 24 0.1 00:00:02 1.0 16532 32268 konsole [kdeinit] 30814 30813 henrik 13:44:17 S 24 0.0 00:00:00 0.1 2080 3688 /bin/bash 30821 30814 henrik 13:44:27 S 24 0.0 00:00:00 0.0 560 1588 ./demotool --confdir=/home/henrik/democonf/ 30822 30453 henrik 13:44:34 S 24 3.0 00:00:40 2.3 37272 126892 /usr/lib/firefox/firefox-bin 30827 1 henrik 13:44:34 S 24 0.0 00:00:00 0.1 2688 4500 /usr/lib/libgconf2-4/gconfd-2 13 30835 30822 henrik 13:44:37 Z 18 0.0 00:00:00 0.0 0 0 [netstat] 30861 30813 henrik 13:46:07 S 24 0.0 00:00:00 0.1 2088 3700 /bin/bash 31254 1 hobbit 14:03:49 S 19 0.0 00:00:00 0.0 1372 2984 sh -c vmstat 300 2 1>/usr/lib/hobbit/client/tmp/hobbit_vmstat.localhost.31226 2>&1; mv /usr/lib/hobbit/client/tmp/hobbit_vmstat.localhost.31226 /usr/lib/hobbit/client/tmp/hobbit_vmstat.localhost 31255 31254 hobbit 14:03:49 S 19 0.0 00:00:00 0.0 564 1852 vmstat 300 2 31298 30861 henrik 14:06:19 R 23 0.0 00:00:00 0.0 948 2480 ps -Aww -o pid,ppid,user,start,state,pri,pcpu,time,pmem,rsz,vsz,cmd xymon-4.3.28/demotool/data/democonf/demohost/client_df0000664000076400007640000000042311411662565023241 0ustar rpmbuildrpmbuildFilsystem 1024-blokke Brugt Tilbage Kapacitet Monteret på /dev/hda2 99511580 27342896 72168684 28% / procbususb 10240 108 10132 2% /proc/bus/usb /dev/hda3 47856164 44684240 3171924 94% /work xymon-4.3.28/demotool/data/democonf/demohost/client_ifconfig0000664000076400007640000000167011411662565024441 0ustar rpmbuildrpmbuildeth0 Link encap:Ethernet HWaddr 00:0E:A6:CE:D6:85 inet addr:172.16.10.100 Bcast:172.16.10.255 Mask:255.255.255.0 inet6 addr: fe80::20e:a6ff:fece:d685/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:15281037 errors:0 dropped:0 overruns:0 frame:0 TX packets:15371394 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:30021682 (28.6 MiB) TX bytes:3023884776 (2.8 GiB) Interrupt:209 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:1057321 errors:0 dropped:0 overruns:0 frame:0 TX packets:1057321 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:574807062 (548.1 MiB) TX bytes:574807062 (548.1 MiB) xymon-4.3.28/demotool/data/democonf/demohost/client_uname0000664000076400007640000000005411411662565023755 0ustar rpmbuildrpmbuildLinux osiris.hswn.dk 2.6.17-10-generic i686 xymon-4.3.28/demotool/data/democonf/demohost/client_ports0000664000076400007640000000506611411662565024027 0ustar rpmbuildrpmbuildActive Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:1984 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:40992 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:43203 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:3110 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:3080 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:720 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:3025 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:9011 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:9012 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:53526 127.0.0.1:1984 TIME_WAIT tcp 0 0 127.0.0.1:53527 127.0.0.1:1984 TIME_WAIT tcp 0 0 127.0.0.1:53530 127.0.0.1:1984 TIME_WAIT tcp 0 0 127.0.0.1:53528 127.0.0.1:1984 TIME_WAIT tcp 0 0 127.0.0.1:58561 127.0.0.1:1984 TIME_WAIT tcp 0 0 172.16.10.100:726 172.16.10.2:32775 ESTABLISHED tcp 0 0 172.16.10.100:881 172.16.10.2:2049 ESTABLISHED tcp 0 0 127.0.0.1:50756 127.0.0.1:80 ESTABLISHED tcp 0 0 127.0.0.1:50754 127.0.0.1:80 ESTABLISHED tcp6 0 0 :::389 :::* LISTEN tcp6 0 0 :::80 :::* LISTEN tcp6 0 0 :::22 :::* LISTEN tcp6 0 0 ::ffff:127.0.0.1:80 ::ffff:127.0.0.1:50754 ESTABLISHED tcp6 0 0 ::ffff:127.0.0.1:80 ::ffff:127.0.0.1:50756 ESTABLISHED tcp6 0 0 ::ffff:127.0.0.1:80 ::ffff:127.0.0.1:34951 TIME_WAIT tcp6 0 0 ::ffff:127.0.0.1:80 ::ffff:127.0.0.1:34953 TIME_WAIT tcp6 0 0 ::ffff:172.16.10.:52475 ::ffff:194.150.112.:443 ESTABLISHED xymon-4.3.28/demotool/data/democonf/demohost/client_top0000664000076400007640000004710711411662565023464 0ustar rpmbuildrpmbuildtop - 14:09:26 up 26 days, 13:28, 2 users, load average: 0.17, 0.20, 0.27 Tasks: 148 total, 2 running, 145 sleeping, 0 stopped, 1 zombie Cpu(s): 1.7%us, 0.3%sy, 1.0%ni, 96.7%id, 0.3%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1555860k total, 1500132k used, 55728k free, 45216k buffers Swap: 1004020k total, 17684k used, 986336k free, 1205916k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 16 0 1764 532 448 S 0.0 0.0 0:01.53 init 2 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 3 root 34 19 0 0 0 S 0.0 0.0 0:00.24 ksoftirqd/0 4 root RT 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0 5 root 10 -5 0 0 0 S 0.0 0.0 0:05.43 events/0 6 root 10 -5 0 0 0 S 0.0 0.0 0:00.01 khelper 7 root 10 -5 0 0 0 S 0.0 0.0 0:00.01 kthread 9 root 10 -5 0 0 0 S 0.0 0.0 0:01.89 kblockd/0 10 root 20 -5 0 0 0 S 0.0 0.0 0:00.00 kacpid 11 root 20 -5 0 0 0 S 0.0 0.0 0:00.00 kacpi_notify 124 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 kseriod 157 root 15 0 0 0 0 S 0.0 0.0 0:21.02 pdflush 159 root 15 0 0 0 0 S 0.0 0.0 0:27.35 kswapd0 160 root 19 -5 0 0 0 S 0.0 0.0 0:00.00 aio/0 1715 root 14 -5 0 0 0 S 0.0 0.0 0:00.00 ata/0 1795 root 16 -5 0 0 0 S 0.0 0.0 0:00.00 scsi_eh_0 1796 root 16 -5 0 0 0 S 0.0 0.0 0:00.00 scsi_eh_1 1825 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 khubd 1838 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 khpsbpkt 1854 root 15 0 0 0 0 S 0.0 0.0 0:00.00 knodemgrd_0 1982 root 10 -5 0 0 0 S 0.0 0.0 0:02.08 reiserfs/0 2064 root 15 0 1728 544 468 S 0.0 0.0 0:00.00 logd 2228 root 12 -4 2736 1260 452 S 0.0 0.1 0:01.00 udevd 2960 root 13 -5 0 0 0 S 0.0 0.0 0:00.00 shpchpd 3044 root 16 -5 0 0 0 S 0.0 0.0 0:00.00 kpsmoused 3455 dhcp 14 -2 2520 840 504 S 0.0 0.1 0:00.09 dhclient3 3791 daemon 15 0 1704 388 292 S 0.0 0.0 0:00.03 portmap 3970 root 16 0 2672 1172 908 S 0.0 0.1 0:00.01 login 3971 root 16 0 1600 508 432 S 0.0 0.0 0:00.00 getty 3972 root 16 0 1600 508 432 S 0.0 0.0 0:00.00 getty 3973 root 16 0 1596 500 432 S 0.0 0.0 0:00.00 getty 3974 root 16 0 1596 504 432 S 0.0 0.0 0:00.00 getty 3975 root 16 0 1600 508 432 S 0.0 0.0 0:00.00 getty 4179 root 16 0 2200 1156 640 S 0.0 0.1 0:00.00 acpid 4305 root 15 0 1720 508 420 S 0.0 0.0 1:19.87 dd 4307 klog 16 0 2408 1288 384 S 0.0 0.1 0:17.28 klogd 4326 messageb 15 0 2176 856 640 S 0.0 0.1 0:01.24 dbus-daemon 4341 haldaemo 16 0 7088 5556 1648 S 0.0 0.4 0:03.98 hald 4342 root 17 0 2912 1064 896 S 0.0 0.1 0:00.04 hald-runner 4348 haldaemo 25 0 2020 804 692 S 0.0 0.1 0:00.00 hald-addon-acpi 4355 haldaemo 15 0 2020 808 692 S 0.0 0.1 0:09.20 hald-addon-keyb 4365 haldaemo 16 0 2028 916 788 S 0.0 0.1 0:19.21 hald-addon-stor 4402 root 15 0 4176 1624 1168 S 0.0 0.1 0:00.98 openvpn 4466 root 20 0 21924 2528 1448 S 0.0 0.2 0:00.00 slapd 4495 root 16 0 5584 2272 2056 S 0.0 0.1 0:01.03 apt-index-watch 4646 root 16 0 1744 680 560 S 0.0 0.0 0:00.02 automount 4654 root 16 0 1748 688 560 S 0.0 0.0 0:00.04 automount 4709 root 25 0 1640 504 424 S 0.0 0.0 0:00.00 inetd 4726 ivman 16 0 4632 1640 1224 S 0.0 0.1 0:00.16 ivman 4767 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 nfsd4 4768 root 15 0 0 0 0 S 0.0 0.0 0:00.00 nfsd 4769 root 25 0 0 0 0 S 0.0 0.0 0:00.00 lockd 4770 root 10 -5 0 0 0 S 0.0 0.0 0:30.16 rpciod/0 4771 root 15 0 0 0 0 S 0.0 0.0 0:00.00 nfsd 4772 root 15 0 0 0 0 S 0.0 0.0 0:00.00 nfsd 4773 root 15 0 0 0 0 S 0.0 0.0 0:00.00 nfsd 4774 root 15 0 0 0 0 S 0.0 0.0 0:00.00 nfsd 4775 root 15 0 0 0 0 S 0.0 0.0 0:00.00 nfsd 4776 root 15 0 0 0 0 S 0.0 0.0 0:00.00 nfsd 4777 root 15 0 0 0 0 S 0.0 0.0 0:00.00 nfsd 4781 root 25 0 1788 284 176 S 0.0 0.0 0:00.00 rpc.mountd 4857 root 15 0 4796 1620 1300 S 0.0 0.1 0:00.72 master 4859 postfix 15 0 4844 1700 1372 S 0.0 0.1 0:00.21 qmgr 4893 root 16 0 4936 1064 728 S 0.0 0.1 0:00.02 sshd 4972 root 16 0 2684 660 520 S 0.0 0.0 0:00.00 kdm 4986 statd 15 0 1744 720 612 S 0.0 0.0 0:00.08 rpc.statd 5009 root 25 0 2068 708 612 S 0.0 0.0 0:00.00 hcid 5015 root 25 0 1668 496 428 S 0.0 0.0 0:00.00 sdpd 5026 root 24 0 1828 468 384 S 0.0 0.0 0:00.00 hidd 5033 root 10 -10 0 0 0 S 0.0 0.0 0:00.00 krfcommd 5046 root 15 0 1716 300 236 S 0.0 0.0 0:00.00 mdadm 5081 daemon 16 0 1852 468 348 S 0.0 0.0 0:00.00 atd 5111 root 16 0 2192 856 684 S 0.0 0.1 0:00.39 cron 5179 root 19 0 1452 164 104 S 0.0 0.0 0:00.00 vmnet-bridge 5876 henrik 15 0 2564 444 288 S 0.0 0.0 0:00.15 gpg-agent 5976 henrik 16 0 2684 464 340 S 0.0 0.0 0:00.00 axnet 17872 henrik 15 0 2560 444 288 S 0.0 0.0 0:00.13 gpg-agent 3469 root 15 0 0 0 0 S 0.0 0.0 0:20.02 pdflush 32003 hobbit 16 0 1908 444 348 S 0.0 0.0 0:05.14 hobbitlaunch 32004 hobbit 16 0 4992 1324 844 S 0.0 0.1 0:17.56 hobbitd 32005 hobbit 16 0 2176 540 444 S 0.0 0.0 0:00.00 hobbitd_channel 32006 hobbit 16 0 2436 588 468 S 0.0 0.0 0:00.00 hobbitd_channel 32007 hobbit 16 0 2176 604 504 S 0.0 0.0 0:00.41 hobbitd_channel 32008 hobbit 15 0 2180 548 448 S 0.0 0.0 0:02.05 hobbitd_channel 32009 hobbit 15 0 2176 512 432 S 0.0 0.0 0:00.21 hobbitd_channel 32010 hobbit 15 0 2432 600 476 S 0.0 0.0 0:02.93 hobbitd_channel 32015 hobbit 16 0 2320 696 508 S 0.0 0.0 0:00.03 hobbitd_history 32016 hobbit 16 0 3896 1528 800 S 0.0 0.1 0:19.16 hobbitd_rrd 32062 hobbit 16 0 2872 1480 712 S 0.0 0.1 0:01.24 hobbitd_client 32063 hobbit 15 0 3896 1580 844 S 0.0 0.1 0:08.32 hobbitd_rrd 32081 hobbit 16 0 2184 664 400 S 0.0 0.0 0:00.00 hobbitd_hostdat 20945 henrik 15 0 2564 444 288 S 0.0 0.0 0:00.06 gpg-agent 27371 root 16 0 407m 17m 7860 S 0.0 1.2 0:07.24 java 12564 henrik 16 0 3688 2044 1328 S 0.0 0.1 0:00.00 bash 4352 henrik 15 0 2564 444 288 S 0.0 0.0 0:00.04 gpg-agent 10421 cupsys 25 10 4568 2032 1484 S 0.0 0.1 0:00.02 cupsd 24441 root 25 10 7984 2424 1504 S 0.0 0.2 0:00.03 apache2 24442 www-data 25 10 7776 1796 872 S 0.0 0.1 0:00.04 apache2 24443 www-data 34 10 224m 3624 1520 S 0.0 0.2 0:00.22 apache2 24455 www-data 33 10 224m 3916 1564 S 0.0 0.3 0:00.19 apache2 24540 root 25 10 2960 724 536 S 0.0 0.0 0:00.03 dirmngr 24678 root 25 10 1648 572 460 S 0.0 0.0 0:00.07 syslogd 29276 postfix 16 0 4808 1572 1272 S 0.0 0.1 0:00.00 pickup 30177 hobbit 15 0 2424 1004 552 S 0.0 0.1 0:00.01 hobbitd_alert 30326 root 15 0 150m 51m 5720 S 0.0 3.4 1:16.79 Xorg 30327 root 16 0 3660 1412 1108 S 0.0 0.1 0:00.00 kdm 30336 henrik 16 0 3312 1608 1112 S 0.0 0.1 0:00.08 startkde 30407 henrik 15 0 2564 448 288 S 0.0 0.0 0:00.00 gpg-agent 30416 henrik 15 0 4480 728 456 S 0.0 0.0 0:00.00 ssh-agent 30417 henrik 15 0 4480 724 456 S 0.0 0.0 0:00.00 ssh-agent 30420 henrik 16 0 2532 628 500 S 0.0 0.0 0:00.00 dbus-launch 30421 henrik 24 0 2056 428 340 S 0.0 0.0 0:00.00 dbus-daemon 30452 henrik 16 0 1448 140 80 S 0.0 0.0 0:00.00 start_kdeinit 30453 henrik 16 0 24320 7692 6012 S 0.0 0.5 0:00.20 kdeinit 30456 henrik 15 0 23856 3008 1736 S 0.0 0.2 0:00.06 dcopserver 30458 henrik 15 0 26016 8732 7376 S 0.0 0.6 0:00.11 klauncher 30460 henrik 15 0 30340 13m 11m S 0.0 0.9 0:00.83 kded 30466 henrik 15 0 1584 356 288 S 0.0 0.0 0:00.00 kwrapper 30468 henrik 15 0 25568 9880 7884 S 0.0 0.6 0:00.10 ksmserver 30469 henrik 15 0 28012 13m 10m S 0.0 0.9 0:02.76 kwin 30471 henrik 15 0 29840 15m 12m S 0.0 1.0 0:01.46 kdesktop 30473 henrik 15 0 32264 17m 13m S 0.0 1.1 0:03.21 kicker 30477 henrik 15 0 26460 8720 6788 S 0.0 0.6 0:00.05 kio_file 30480 henrik -51 0 21244 7724 5532 S 0.0 0.5 0:01.18 artsd 30489 henrik 15 0 25324 9536 7576 S 0.0 0.6 0:00.21 kaccess 30492 henrik 15 0 29412 14m 11m S 0.0 1.0 0:00.30 kmix 30493 henrik 15 0 15276 9448 6684 S 0.0 0.6 0:01.32 gkrellm 30498 henrik 15 0 26788 6140 4916 R 0.0 0.4 0:00.33 xmms 30501 henrik 15 0 13996 8456 4588 S 0.0 0.5 0:00.18 axmain 30508 henrik 15 0 2864 292 112 S 0.0 0.0 0:00.00 applix 30510 henrik 15 0 33268 12m 9956 S 0.0 0.8 0:00.17 knotify 30516 henrik 15 0 30436 14m 10m S 0.0 0.9 0:03.36 adept_notifier 30518 henrik 15 0 26404 11m 9324 S 0.0 0.7 0:00.22 klipper 30520 henrik 15 0 30680 14m 11m S 0.0 0.9 0:00.48 korgac 30727 henrik 16 0 3312 1604 1108 S 0.0 0.1 0:00.00 soffice 30741 henrik 15 0 221m 98m 57m S 0.0 6.5 0:22.98 soffice.bin 30813 henrik 15 0 32532 16m 12m S 0.0 1.1 0:03.87 konsole 30814 henrik 15 0 3688 2080 1368 S 0.0 0.1 0:00.02 bash 30821 henrik 15 0 1588 620 468 S 0.0 0.0 0:00.07 demotool 30822 henrik 15 0 123m 36m 19m S 0.0 2.4 0:41.66 firefox-bin 30827 henrik 16 0 4500 2688 1928 S 0.0 0.2 0:00.11 gconfd-2 30835 henrik 21 0 0 0 0 Z 0.0 0.0 0:00.00 netstat 30861 henrik 15 0 3700 2088 1372 S 0.0 0.1 0:00.06 bash 31302 henrik 15 0 3704 2096 1368 S 0.0 0.1 0:00.03 bash 31303 henrik 15 0 2252 916 744 S 0.0 0.1 0:00.00 less 31384 hobbit 21 0 2984 1372 900 S 0.0 0.1 0:00.00 sh 31386 hobbit 21 0 1848 560 476 S 0.0 0.0 0:00.00 vmstat 31402 henrik 15 0 2240 1068 764 R 0.0 0.1 0:00.01 top xymon-4.3.28/demotool/data/democonf/demohost/client_ifstat0000664000076400007640000000167011411662565024147 0ustar rpmbuildrpmbuildeth0 Link encap:Ethernet HWaddr 00:0E:A6:CE:D6:85 inet addr:172.16.10.100 Bcast:172.16.10.255 Mask:255.255.255.0 inet6 addr: fe80::20e:a6ff:fece:d685/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:15281757 errors:0 dropped:0 overruns:0 frame:0 TX packets:15372376 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:30301551 (28.8 MiB) TX bytes:3024444136 (2.8 GiB) Interrupt:209 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:1057828 errors:0 dropped:0 overruns:0 frame:0 TX packets:1057828 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:575273824 (548.6 MiB) TX bytes:575273824 (548.6 MiB) xymon-4.3.28/demotool/data/democonf/demohost/client0000664000076400007640000000001711411662565022567 0ustar rpmbuildrpmbuilddemohost:linux xymon-4.3.28/demotool/data/democonf/demohost/client_free0000664000076400007640000000034611411662565023575 0ustar rpmbuildrpmbuild total used free shared buffers cached Mem: 1555860 1501240 54620 0 45168 1205488 -/+ buffers/cache: 250584 1305276 Swap: 1004020 17684 986336 xymon-4.3.28/demotool/data/democonf/demohost/client_mount0000664000076400007640000000163411411662565024017 0ustar rpmbuildrpmbuild/dev/hda2 on / type reiserfs (rw,notail) proc on /proc type proc (rw,noexec,nosuid,nodev) /sys on /sys type sysfs (rw,noexec,nosuid,nodev) varrun on /var/run type tmpfs (rw,noexec,nosuid,nodev,mode=0755) varlock on /var/lock type tmpfs (rw,noexec,nosuid,nodev,mode=1777) procbususb on /proc/bus/usb type usbfs (rw) udev on /dev type tmpfs (rw,mode=0755) devshm on /dev/shm type tmpfs (rw) devpts on /dev/pts type devpts (rw,gid=5,mode=620) lrm on /lib/modules/2.6.17-10-generic/volatile type tmpfs (rw) /dev/hda3 on /work type reiserfs (rw) automount(pid4646) on /home type autofs (rw,fd=4,pgrp=4646,minproto=2,maxproto=4) automount(pid4654) on /var/netdisk type autofs (rw,fd=4,pgrp=4654,minproto=2,maxproto=4) nfsd on /proc/fs/nfsd type nfsd (rw) binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) voodoo:/export/home/henrik on /home/henrik type nfs (rw,intr,rsize=8192,wsize=8192,acregmin=30,addr=172.16.10.2) xymon-4.3.28/demotool/data/democonf/demohost/client_osversion0000664000076400007640000000065211411662565024703 0ustar rpmbuildrpmbuildUbuntu 6.10 LSB Version: core-2.0-noarch:core-3.0-noarch:core-3.1-noarch:core-2.0-ia32:core-3.0-ia32:core-3.1-ia32:cxx-2.0-noarch:cxx-3.0-noarch:cxx-3.1-noarch:cxx-2.0-ia32:cxx-3.0-ia32:cxx-3.1-ia32:graphics-2.0-noarch:graphics-3.0-noarch:graphics-3.1-noarch:graphics-2.0-ia32:graphics-3.0-ia32:graphics-3.1-ia32:desktop-3.1-noarch:desktop-3.1-ia32 Distributor ID: Ubuntu Description: Ubuntu 6.10 Release: 6.10 Codename: edgy xymon-4.3.28/demotool/data/democonf/demohost/client_vmstat0000664000076400007640000000047211411662565024172 0ustar rpmbuildrpmbuildprocs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 0 0 17684 53360 45180 1234716 0 0 9 15 6 7 3 0 97 0 1 0 17684 37164 45172 1211468 0 0 1 42 396 868 9 1 89 0 xymon-4.3.28/demotool/data/democonf/demohost/client_who0000664000076400007640000000010611411662565023443 0ustar rpmbuildrpmbuildhenrik :0 Aug 7 18:43 henrik :0 Aug 7 18:43 xymon-4.3.28/demotool/data/democonf/demohost/client_netstat0000664000076400007640000000441311411662565024335 0ustar rpmbuildrpmbuildIp: 16229988 total packets received 1 with invalid addresses 0 forwarded 0 incoming packets discarded 16229987 incoming packets delivered 16336618 requests sent out Icmp: 39210 ICMP messages received 1 input ICMP message failed. ICMP input histogram: destination unreachable: 6 timeout in transit: 50 echo requests: 23329 echo replies: 15825 23356 ICMP messages sent 0 ICMP messages failed ICMP output histogram: destination unreachable: 27 echo replies: 23329 Tcp: 123073 active connections openings 112585 passive connection openings 0 failed connection attempts 1157 connection resets received 3 connections established 16124654 segments received 15187852 segments send out 2410 segments retransmited 0 bad segments received. 1651 resets sent Udp: 56634 packets received 27 packets to unknown port received. 0 packet receive errors 1105170 packets sent TcpExt: 3 packets pruned from receive queue because of socket buffer overrun 115144 TCP sockets finished time wait in fast timer 7 time wait sockets recycled by time stamp 217719 delayed acks sent 95 delayed acks further delayed because of locked socket Quick ack mode was activated 1210 times 176240 packets directly queued to recvmsg prequeue. 100519 of bytes directly received from backlog 75086678 of bytes directly received from prequeue 12606169 packet headers predicted 36912 packets header predicted and directly queued to user 530302 acknowledgments not containing data received 6377012 predicted acknowledgments 1 times recovered from packet loss due to SACK data 154 congestion windows recovered after partial ack 0 TCP data loss events 18 timeouts after SACK recovery 2 fast retransmits 26 retransmits in slow start 537 other TCP timeouts 1 times receiver scheduled too late for direct processing 149 packets collapsed in receive queue due to low socket buffer 1297 DSACKs sent for old packets 1 DSACKs sent for out of order packets 14 DSACKs received 543 connections reset due to unexpected data 1053 connections reset due to early user close 240 connections aborted due to timeout xymon-4.3.28/demotool/data/democonf/demohost/client_route0000664000076400007640000000040411411662565024005 0ustar rpmbuildrpmbuildKernel IP routeing table Destination Gateway Genmask Flags MSS Window irtt Iface 172.16.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 0.0.0.0 172.16.10.254 0.0.0.0 UG 0 0 0 eth0 xymon-4.3.28/demotool/data/democonf/pop3/0000775000076400007640000000000013037531512020420 5ustar rpmbuildrpmbuildxymon-4.3.28/demotool/data/democonf/pop3/listen0000664000076400007640000000001711411662565021646 0ustar rpmbuildrpmbuild127.0.0.1:3110 xymon-4.3.28/demotool/data/democonf/pop3/response0000664000076400007640000000002111411662565022201 0ustar rpmbuildrpmbuild+OK Hello there. xymon-4.3.28/demotool/data/democonf/http/0000775000076400007640000000000013037531512020516 5ustar rpmbuildrpmbuildxymon-4.3.28/demotool/data/democonf/http/listen0000664000076400007640000000001711411662565021744 0ustar rpmbuildrpmbuild127.0.0.1:3080 xymon-4.3.28/demotool/data/democonf/http/response0000664000076400007640000000102211411662565022301 0ustar rpmbuildrpmbuildHTTP/1.1 200 OK Date: Wed, 24 Aug 2005 12:26:36 GMT Server: Apache/2.0.54 (Debian GNU/Linux) PHP/4.3.10-15 mod_ssl/2.0.54 OpenSSL/0.9.7e Last-Modified: Mon, 02 May 2005 06:06:34 GMT ETag: "add-2f4-6d082e80" Accept-Ranges: bytes Content-Type: text/html; charset=ISO-8859-1 This is the Demotool webpage

Welcome to the Demotool site!!

This is a sample webpage returned by the demotool utility to show what Hobbit is like

xymon-4.3.28/demotool/data/democonf/http/delay0000664000076400007640000000000211411662565021536 0ustar rpmbuildrpmbuild4 xymon-4.3.28/demotool/README0000664000076400007640000000044611412134025015711 0ustar rpmbuildrpmbuildREADME file for Demotool ====================== Instead of running local system command to get the system information. demotool will scan /etc/hdemo/data directory that containts demo data. How to install -------------- 1. make 2. mkdir /etc/hdemo 3. cp -rp data/* /etc/hdemo 4. ./demotool xymon-4.3.28/COPYING0000664000076400007640000004325412000054272014245 0ustar rpmbuildrpmbuild GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. xymon-4.3.28/README0000664000076400007640000000573513037531357014113 0ustar rpmbuildrpmbuildREADME file for Xymon ===================== What is it ? ------------ Xymon is a system for monitoring your network servers and applications. It is heavily inspired by the Big Brother tool, but is a complete re-implementation with a lot of added functionality and performance improvements. A slightly more detailed rationale for Xymon is in the docs/about.html file. NOTE: On Nov 10 2008, Hobbit was officially renamed to "Xymon". The name "Hobbit" is trademarked, and therefore cannot be used without permission from the trademark holders. How to install -------------- Detailed installation instructions are in the docs/install.html file. Essentially, it boils down to running ./configure make make install but do have a look at the install.html file for more detailed instructions. Documentation ------------- The docs/ directory holds information about the basic installation and configuration of Xymon. All of the tools and configuration files in Xymon have man-pages that are installed automatically when installing Xymon. The xymon(7) man page provides an introduction to Xymon and has pointers to the other man-pages of the package. License ------- Xymon is copyrighted (C) 2002-2017 by Henrik Storner. Xymon is Open Source software, made available under the GNU General Public License (GPL) version 2, with the explicit exemption that linking with the OpenSSL libraries is permitted. See the file COPYING for details. Xymon is released under the GPL, and therefore available free of charge. However, if you find it useful and want to encourage further development, I do have an Amazon wishlist at http://www.amazon.co.uk/ - just search for my mail-address (henrik@hswn.dk). A contribution in the form of a book, CD or DVD is appreciated. The following files are distributed with Xymon and used by Xymon, but written by others and are NOT licensed under the GPL: * The lib/rmd160c.c, lib/rmdconst.h, lib/rmdlocl.h and lib/ripemd.h files are Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com). The license is BSD-like, but see these files for the exact license. The version in Xymon was taken from the FreeBSD CVS archive. * The lib/md5.c and lib/md5.h files are (C) L. Peter Deutsch, available under a BSD-like license from http://sourceforge.net/projects/libmd5-rfc/ * The lib/sha1.c file is originally written by by Steve Reid and placed in the public domain. The version in Xymon was taken from the "mutt" mail client sources, so some changes were done by Thomas Roessler . Support ------- There is an open mailing list for discussing Xymon, asking questions about how to use Xymon, reporting bugs etc. You can subscribe to the list by sending an e-mail to xymon-subscribe@xymon.com or on the web http://lists.xymon.com/mailman/listinfo/xymon Please note that mail sent from addresses that are not subscribed to the list need to go through a moderator approval, and therefore may not show up on the list for some time.