From c53f54fe2005ee56c0c51c950cb9c1ec2760b764 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Mon, 23 Aug 2004 18:21:09 +0000 Subject: [PATCH] Changed from LZO to GZ compression --- amxmodx/amxxfile.cpp | 34 +- amxmodx/minilzo/lzoconf.h | 451 ------ amxmodx/minilzo/minilzo.c | 2935 ----------------------------------- amxmodx/minilzo/minilzo.h | 100 -- amxmodx/msvc/amxmodx.vcproj | 5 +- amxmodx/zlib/zconf.h | 323 ++++ amxmodx/zlib/zlib.h | 1200 ++++++++++++++ amxmodx/zlib/zlib.lib | Bin 0 -> 221206 bytes 8 files changed, 1541 insertions(+), 3507 deletions(-) delete mode 100755 amxmodx/minilzo/lzoconf.h delete mode 100755 amxmodx/minilzo/minilzo.c delete mode 100755 amxmodx/minilzo/minilzo.h create mode 100755 amxmodx/zlib/zconf.h create mode 100755 amxmodx/zlib/zlib.h create mode 100755 amxmodx/zlib/zlib.lib diff --git a/amxmodx/amxxfile.cpp b/amxmodx/amxxfile.cpp index 642adf70..8053fb12 100755 --- a/amxmodx/amxxfile.cpp +++ b/amxmodx/amxxfile.cpp @@ -31,7 +31,7 @@ #include "amxmodx.h" #include "amxxfile.h" -#include "minilzo/minilzo.h" +#include "zlib/zlib.h" /********************** ****** AMXXFILE ****** @@ -51,7 +51,7 @@ #endif #endif -typedef lzo_byte mint8_t; +typedef char mint8_t; typedef int16_t mint16_t; typedef int32_t mint32_t; @@ -85,13 +85,6 @@ CAmxxReader::CAmxxReader(const char *filename, int cellsize) m_Status = Err_None; m_CellSize = cellsize; - // Make sure the decompressor runs - if (lzo_init() != LZO_E_OK) - { - m_Status = Err_DecompressorInit; - return; - } - m_pFile = fopen(filename, "rb"); if (!m_pFile) { @@ -103,7 +96,7 @@ CAmxxReader::CAmxxReader(const char *filename, int cellsize) DATAREAD(&magic, sizeof(magic), 1); m_OldFile = false; - if (magic != 0x524C4542) + if (magic != 0x414D5842) { // check for old file AMX_HEADER hdr; @@ -205,11 +198,15 @@ size_t CAmxxReader::GetBufferSize() if (!m_pFile) return 0; + + long save = ftell(m_pFile); + if (m_OldFile) { rewind(m_pFile); AMX_HEADER hdr; DATAREAD(&hdr, sizeof(hdr), 1); + fseek(m_pFile, save, SEEK_SET); return hdr.stp; } @@ -217,6 +214,7 @@ size_t CAmxxReader::GetBufferSize() TableEntry entry; DATAREAD(&entry, sizeof(entry), 1); + fseek(m_pFile, save, SEEK_SET); return entry.origSize + 1; // +1 : safe } @@ -255,16 +253,18 @@ CAmxxReader::Error CAmxxReader::GetSection(void *buffer) TableEntry entry; DATAREAD(&entry, sizeof(entry), 1); fseek(m_pFile, entry.offset, SEEK_SET); - +// AMXXLOG_Log("|||| Offset needed: %d At: %d", entry.offset, ftell(m_pFile)); + uLongf destLen = GetBufferSize(); // read the data to a temporary buffer - lzo_byte *tempBuffer = new lzo_byte[m_SectionLength + 1]; + char *tempBuffer = new char[m_SectionLength + 1]; + //fread(tempBuffer, sizeof(char), m_SectionLength, m_pFile); DATAREAD((void*)tempBuffer, 1, m_SectionLength); // decompress - lzo_uint destLen = GetBufferSize(); - int result = lzo1x_decompress_safe(tempBuffer, m_SectionLength, - (lzo_byte*)buffer, &destLen, - NULL /*unused*/ ); - if (result != LZO_E_OK) +// AMXXLOG_Log("|||| First Bytes: %d %d %d %d", tempBuffer[0], tempBuffer[1], tempBuffer[2], tempBuffer[3]); + int result = uncompress((Bytef *)buffer, &destLen, + (Bytef *)tempBuffer, m_SectionLength); +// AMXXLOG_Log("|||| Result: %d, m_SectionLength=%d, destLen=%d", result, m_SectionLength, destLen); + if (result != Z_OK) { m_Status = Err_Decompress; return Err_Decompress; diff --git a/amxmodx/minilzo/lzoconf.h b/amxmodx/minilzo/lzoconf.h deleted file mode 100755 index 96db1805..00000000 --- a/amxmodx/minilzo/lzoconf.h +++ /dev/null @@ -1,451 +0,0 @@ -/* lzoconf.h -- configuration for the LZO real-time data compression library - - This file is part of the LZO real-time data compression library. - - Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer - Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer - Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer - Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer - Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer - Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer - Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer - All Rights Reserved. - - The LZO library 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. - - The LZO library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with the LZO library; see the file COPYING. - If not, write to the Free Software Foundation, Inc., - 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - Markus F.X.J. Oberhumer - - http://www.oberhumer.com/opensource/lzo/ - */ - - -#ifndef __LZOCONF_H -#define __LZOCONF_H - -#define LZO_VERSION 0x1080 -#define LZO_VERSION_STRING "1.08" -#define LZO_VERSION_DATE "Jul 12 2002" - -/* internal Autoconf configuration file - only used when building LZO */ -#if defined(LZO_HAVE_CONFIG_H) -# include -#endif -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -/*********************************************************************** -// LZO requires a conforming -************************************************************************/ - -#if !defined(CHAR_BIT) || (CHAR_BIT != 8) -# error "invalid CHAR_BIT" -#endif -#if !defined(UCHAR_MAX) || !defined(UINT_MAX) || !defined(ULONG_MAX) -# error "check your compiler installation" -#endif -#if (USHRT_MAX < 1) || (UINT_MAX < 1) || (ULONG_MAX < 1) -# error "your limits.h macros are broken" -#endif - -/* workaround a cpp bug under hpux 10.20 */ -#define LZO_0xffffffffL 4294967295ul - -#if !defined(LZO_UINT32_C) -# if (UINT_MAX < LZO_0xffffffffL) -# define LZO_UINT32_C(c) c ## UL -# else -# define LZO_UINT32_C(c) c ## U -# endif -#endif - - -/*********************************************************************** -// architecture defines -************************************************************************/ - -#if !defined(__LZO_WIN) && !defined(__LZO_DOS) && !defined(__LZO_OS2) -# if defined(__WINDOWS__) || defined(_WINDOWS) || defined(_Windows) -# define __LZO_WIN -# elif defined(__WIN32__) || defined(_WIN32) || defined(WIN32) -# define __LZO_WIN -# elif defined(__NT__) || defined(__NT_DLL__) || defined(__WINDOWS_386__) -# define __LZO_WIN -# elif defined(__DOS__) || defined(__MSDOS__) || defined(MSDOS) -# define __LZO_DOS -# elif defined(__OS2__) || defined(__OS2V2__) || defined(OS2) -# define __LZO_OS2 -# elif defined(__palmos__) -# define __LZO_PALMOS -# elif defined(__TOS__) || defined(__atarist__) -# define __LZO_TOS -# endif -#endif - -#if (UINT_MAX < LZO_0xffffffffL) -# if defined(__LZO_WIN) -# define __LZO_WIN16 -# elif defined(__LZO_DOS) -# define __LZO_DOS16 -# elif defined(__LZO_PALMOS) -# define __LZO_PALMOS16 -# elif defined(__LZO_TOS) -# define __LZO_TOS16 -# elif defined(__C166__) -# else - /* porting hint: for pure 16-bit architectures try compiling - * everything with -D__LZO_STRICT_16BIT */ -# error "16-bit target not supported - contact me for porting hints" -# endif -#endif - -#if !defined(__LZO_i386) -# if defined(__LZO_DOS) || defined(__LZO_WIN16) -# define __LZO_i386 -# elif defined(__i386__) || defined(__386__) || defined(_M_IX86) -# define __LZO_i386 -# endif -#endif - -#if defined(__LZO_STRICT_16BIT) -# if (UINT_MAX < LZO_0xffffffffL) -# include -# endif -#endif - -/* memory checkers */ -#if !defined(__LZO_CHECKER) -# if defined(__BOUNDS_CHECKING_ON) -# define __LZO_CHECKER -# elif defined(__CHECKER__) -# define __LZO_CHECKER -# elif defined(__INSURE__) -# define __LZO_CHECKER -# elif defined(__PURIFY__) -# define __LZO_CHECKER -# endif -#endif - - -/*********************************************************************** -// integral and pointer types -************************************************************************/ - -/* Integral types with 32 bits or more */ -#if !defined(LZO_UINT32_MAX) -# if (UINT_MAX >= LZO_0xffffffffL) - typedef unsigned int lzo_uint32; - typedef int lzo_int32; -# define LZO_UINT32_MAX UINT_MAX -# define LZO_INT32_MAX INT_MAX -# define LZO_INT32_MIN INT_MIN -# elif (ULONG_MAX >= LZO_0xffffffffL) - typedef unsigned long lzo_uint32; - typedef long lzo_int32; -# define LZO_UINT32_MAX ULONG_MAX -# define LZO_INT32_MAX LONG_MAX -# define LZO_INT32_MIN LONG_MIN -# else -# error "lzo_uint32" -# endif -#endif - -/* lzo_uint is used like size_t */ -#if !defined(LZO_UINT_MAX) -# if (UINT_MAX >= LZO_0xffffffffL) - typedef unsigned int lzo_uint; - typedef int lzo_int; -# define LZO_UINT_MAX UINT_MAX -# define LZO_INT_MAX INT_MAX -# define LZO_INT_MIN INT_MIN -# elif (ULONG_MAX >= LZO_0xffffffffL) - typedef unsigned long lzo_uint; - typedef long lzo_int; -# define LZO_UINT_MAX ULONG_MAX -# define LZO_INT_MAX LONG_MAX -# define LZO_INT_MIN LONG_MIN -# else -# error "lzo_uint" -# endif -#endif - -typedef int lzo_bool; - - -/*********************************************************************** -// memory models -************************************************************************/ - -/* Memory model for the public code segment. */ -#if !defined(__LZO_CMODEL) -# if defined(__LZO_DOS16) || defined(__LZO_WIN16) -# define __LZO_CMODEL __far -# elif defined(__LZO_i386) && defined(__WATCOMC__) -# define __LZO_CMODEL __near -# else -# define __LZO_CMODEL -# endif -#endif - -/* Memory model for the public data segment. */ -#if !defined(__LZO_DMODEL) -# if defined(__LZO_DOS16) || defined(__LZO_WIN16) -# define __LZO_DMODEL __far -# elif defined(__LZO_i386) && defined(__WATCOMC__) -# define __LZO_DMODEL __near -# else -# define __LZO_DMODEL -# endif -#endif - -/* Memory model that allows to access memory at offsets of lzo_uint. */ -#if !defined(__LZO_MMODEL) -# if (LZO_UINT_MAX <= UINT_MAX) -# define __LZO_MMODEL -# elif defined(__LZO_DOS16) || defined(__LZO_WIN16) -# define __LZO_MMODEL __huge -# define LZO_999_UNSUPPORTED -# elif defined(__LZO_PALMOS16) || defined(__LZO_TOS16) -# define __LZO_MMODEL -# else -# error "__LZO_MMODEL" -# endif -#endif - -/* no typedef here because of const-pointer issues */ -#define lzo_byte unsigned char __LZO_MMODEL -#define lzo_bytep unsigned char __LZO_MMODEL * -#define lzo_charp char __LZO_MMODEL * -#define lzo_voidp void __LZO_MMODEL * -#define lzo_shortp short __LZO_MMODEL * -#define lzo_ushortp unsigned short __LZO_MMODEL * -#define lzo_uint32p lzo_uint32 __LZO_MMODEL * -#define lzo_int32p lzo_int32 __LZO_MMODEL * -#define lzo_uintp lzo_uint __LZO_MMODEL * -#define lzo_intp lzo_int __LZO_MMODEL * -#define lzo_voidpp lzo_voidp __LZO_MMODEL * -#define lzo_bytepp lzo_bytep __LZO_MMODEL * - -#ifndef lzo_sizeof_dict_t -# define lzo_sizeof_dict_t sizeof(lzo_bytep) -#endif - - -/*********************************************************************** -// calling conventions and function types -************************************************************************/ - -/* linkage */ -#if !defined(__LZO_EXTERN_C) -# ifdef __cplusplus -# define __LZO_EXTERN_C extern "C" -# else -# define __LZO_EXTERN_C extern -# endif -#endif - -/* calling convention */ -#if !defined(__LZO_CDECL) -# if defined(__LZO_DOS16) || defined(__LZO_WIN16) -# define __LZO_CDECL __LZO_CMODEL __cdecl -# elif defined(__LZO_i386) && defined(_MSC_VER) -# define __LZO_CDECL __LZO_CMODEL __cdecl -# elif defined(__LZO_i386) && defined(__WATCOMC__) -# define __LZO_CDECL __LZO_CMODEL __cdecl -# else -# define __LZO_CDECL __LZO_CMODEL -# endif -#endif -#if !defined(__LZO_ENTRY) -# define __LZO_ENTRY __LZO_CDECL -#endif - -/* C++ exception specification for extern "C" function types */ -#if !defined(__cplusplus) -# undef LZO_NOTHROW -# define LZO_NOTHROW -#elif !defined(LZO_NOTHROW) -# define LZO_NOTHROW -#endif - - -typedef int -(__LZO_ENTRY *lzo_compress_t) ( const lzo_byte *src, lzo_uint src_len, - lzo_byte *dst, lzo_uintp dst_len, - lzo_voidp wrkmem ); - -typedef int -(__LZO_ENTRY *lzo_decompress_t) ( const lzo_byte *src, lzo_uint src_len, - lzo_byte *dst, lzo_uintp dst_len, - lzo_voidp wrkmem ); - -typedef int -(__LZO_ENTRY *lzo_optimize_t) ( lzo_byte *src, lzo_uint src_len, - lzo_byte *dst, lzo_uintp dst_len, - lzo_voidp wrkmem ); - -typedef int -(__LZO_ENTRY *lzo_compress_dict_t)(const lzo_byte *src, lzo_uint src_len, - lzo_byte *dst, lzo_uintp dst_len, - lzo_voidp wrkmem, - const lzo_byte *dict, lzo_uint dict_len ); - -typedef int -(__LZO_ENTRY *lzo_decompress_dict_t)(const lzo_byte *src, lzo_uint src_len, - lzo_byte *dst, lzo_uintp dst_len, - lzo_voidp wrkmem, - const lzo_byte *dict, lzo_uint dict_len ); - - -/* assembler versions always use __cdecl */ -typedef int -(__LZO_CDECL *lzo_compress_asm_t)( const lzo_byte *src, lzo_uint src_len, - lzo_byte *dst, lzo_uintp dst_len, - lzo_voidp wrkmem ); - -typedef int -(__LZO_CDECL *lzo_decompress_asm_t)( const lzo_byte *src, lzo_uint src_len, - lzo_byte *dst, lzo_uintp dst_len, - lzo_voidp wrkmem ); - - -/* a progress indicator callback function */ -typedef void (__LZO_ENTRY *lzo_progress_callback_t) (lzo_uint, lzo_uint); - - -/*********************************************************************** -// export information -************************************************************************/ - -/* DLL export information */ -#if !defined(__LZO_EXPORT1) -# define __LZO_EXPORT1 -#endif -#if !defined(__LZO_EXPORT2) -# define __LZO_EXPORT2 -#endif - -/* exported calling convention for C functions */ -#if !defined(LZO_PUBLIC) -# define LZO_PUBLIC(_rettype) \ - __LZO_EXPORT1 _rettype __LZO_EXPORT2 __LZO_ENTRY -#endif -#if !defined(LZO_EXTERN) -# define LZO_EXTERN(_rettype) __LZO_EXTERN_C LZO_PUBLIC(_rettype) -#endif -#if !defined(LZO_PRIVATE) -# define LZO_PRIVATE(_rettype) static _rettype __LZO_ENTRY -#endif - -/* exported __cdecl calling convention for assembler functions */ -#if !defined(LZO_PUBLIC_CDECL) -# define LZO_PUBLIC_CDECL(_rettype) \ - __LZO_EXPORT1 _rettype __LZO_EXPORT2 __LZO_CDECL -#endif -#if !defined(LZO_EXTERN_CDECL) -# define LZO_EXTERN_CDECL(_rettype) __LZO_EXTERN_C LZO_PUBLIC_CDECL(_rettype) -#endif - -/* exported global variables (LZO currently uses no static variables and - * is fully thread safe) */ -#if !defined(LZO_PUBLIC_VAR) -# define LZO_PUBLIC_VAR(_type) \ - __LZO_EXPORT1 _type __LZO_EXPORT2 __LZO_DMODEL -#endif -#if !defined(LZO_EXTERN_VAR) -# define LZO_EXTERN_VAR(_type) extern LZO_PUBLIC_VAR(_type) -#endif - - -/*********************************************************************** -// error codes and prototypes -************************************************************************/ - -/* Error codes for the compression/decompression functions. Negative - * values are errors, positive values will be used for special but - * normal events. - */ -#define LZO_E_OK 0 -#define LZO_E_ERROR (-1) -#define LZO_E_OUT_OF_MEMORY (-2) /* not used right now */ -#define LZO_E_NOT_COMPRESSIBLE (-3) /* not used right now */ -#define LZO_E_INPUT_OVERRUN (-4) -#define LZO_E_OUTPUT_OVERRUN (-5) -#define LZO_E_LOOKBEHIND_OVERRUN (-6) -#define LZO_E_EOF_NOT_FOUND (-7) -#define LZO_E_INPUT_NOT_CONSUMED (-8) - - -/* lzo_init() should be the first function you call. - * Check the return code ! - * - * lzo_init() is a macro to allow checking that the library and the - * compiler's view of various types are consistent. - */ -#define lzo_init() __lzo_init2(LZO_VERSION,(int)sizeof(short),(int)sizeof(int),\ - (int)sizeof(long),(int)sizeof(lzo_uint32),(int)sizeof(lzo_uint),\ - (int)lzo_sizeof_dict_t,(int)sizeof(char *),(int)sizeof(lzo_voidp),\ - (int)sizeof(lzo_compress_t)) -LZO_EXTERN(int) __lzo_init2(unsigned,int,int,int,int,int,int,int,int,int); - -/* version functions (useful for shared libraries) */ -LZO_EXTERN(unsigned) lzo_version(void); -LZO_EXTERN(const char *) lzo_version_string(void); -LZO_EXTERN(const char *) lzo_version_date(void); -LZO_EXTERN(const lzo_charp) _lzo_version_string(void); -LZO_EXTERN(const lzo_charp) _lzo_version_date(void); - -/* string functions */ -LZO_EXTERN(int) -lzo_memcmp(const lzo_voidp _s1, const lzo_voidp _s2, lzo_uint _len); -LZO_EXTERN(lzo_voidp) -lzo_memcpy(lzo_voidp _dest, const lzo_voidp _src, lzo_uint _len); -LZO_EXTERN(lzo_voidp) -lzo_memmove(lzo_voidp _dest, const lzo_voidp _src, lzo_uint _len); -LZO_EXTERN(lzo_voidp) -lzo_memset(lzo_voidp _s, int _c, lzo_uint _len); - -/* checksum functions */ -LZO_EXTERN(lzo_uint32) -lzo_adler32(lzo_uint32 _adler, const lzo_byte *_buf, lzo_uint _len); -LZO_EXTERN(lzo_uint32) -lzo_crc32(lzo_uint32 _c, const lzo_byte *_buf, lzo_uint _len); - -/* misc. */ -LZO_EXTERN(lzo_bool) lzo_assert(int _expr); -LZO_EXTERN(int) _lzo_config_check(void); -typedef union { lzo_bytep p; lzo_uint u; } __lzo_pu_u; -typedef union { lzo_bytep p; lzo_uint32 u32; } __lzo_pu32_u; -typedef union { void *vp; lzo_bytep bp; lzo_uint32 u32; long l; } lzo_align_t; - -/* align a char pointer on a boundary that is a multiple of `size' */ -LZO_EXTERN(unsigned) __lzo_align_gap(const lzo_voidp _ptr, lzo_uint _size); -#define LZO_PTR_ALIGN_UP(_ptr,_size) \ - ((_ptr) + (lzo_uint) __lzo_align_gap((const lzo_voidp)(_ptr),(lzo_uint)(_size))) - -/* deprecated - only for backward compatibility */ -#define LZO_ALIGN(_ptr,_size) LZO_PTR_ALIGN_UP(_ptr,_size) - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* already included */ - diff --git a/amxmodx/minilzo/minilzo.c b/amxmodx/minilzo/minilzo.c deleted file mode 100755 index 85771eb4..00000000 --- a/amxmodx/minilzo/minilzo.c +++ /dev/null @@ -1,2935 +0,0 @@ -/* minilzo.c -- mini subset of the LZO real-time data compression library - - This file is part of the LZO real-time data compression library. - - Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer - Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer - Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer - Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer - Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer - Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer - Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer - All Rights Reserved. - - The LZO library 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. - - The LZO library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with the LZO library; see the file COPYING. - If not, write to the Free Software Foundation, Inc., - 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - Markus F.X.J. Oberhumer - - http://www.oberhumer.com/opensource/lzo/ - */ - -/* - * NOTE: - * the full LZO package can be found at - * http://www.oberhumer.com/opensource/lzo/ - */ - -#define __LZO_IN_MINILZO -#define LZO_BUILD - -#ifdef MINILZO_HAVE_CONFIG_H -# include -#endif - -#undef LZO_HAVE_CONFIG_H -#include "minilzo.h" - -#if !defined(MINILZO_VERSION) || (MINILZO_VERSION != 0x1080) -# error "version mismatch in miniLZO source files" -#endif - -#ifdef MINILZO_HAVE_CONFIG_H -# define LZO_HAVE_CONFIG_H -#endif - -#if !defined(LZO_NO_SYS_TYPES_H) -# include -#endif -#include - -#ifndef __LZO_CONF_H -#define __LZO_CONF_H - -#if !defined(__LZO_IN_MINILZO) -# ifndef __LZOCONF_H -# include -# endif -#endif - -#if defined(__BOUNDS_CHECKING_ON) -# include -#else -# define BOUNDS_CHECKING_OFF_DURING(stmt) stmt -# define BOUNDS_CHECKING_OFF_IN_EXPR(expr) (expr) -#endif - -#if !defined(LZO_HAVE_CONFIG_H) -# include -# include -# if !defined(NO_STDLIB_H) -# include -# endif -# define HAVE_MEMCMP -# define HAVE_MEMCPY -# define HAVE_MEMMOVE -# define HAVE_MEMSET -#else -# include -# if defined(HAVE_STDDEF_H) -# include -# endif -# if defined(STDC_HEADERS) -# include -# include -# endif -#endif - -#if defined(__LZO_DOS16) || defined(__LZO_WIN16) -# define HAVE_MALLOC_H -# define HAVE_HALLOC -#endif - -#undef NDEBUG -#if !defined(LZO_DEBUG) -# define NDEBUG -#endif -#if defined(LZO_DEBUG) || !defined(NDEBUG) -# if !defined(NO_STDIO_H) -# include -# endif -#endif -#include - -#if !defined(LZO_COMPILE_TIME_ASSERT) -# define LZO_COMPILE_TIME_ASSERT(expr) \ - { typedef int __lzo_compile_time_assert_fail[1 - 2 * !(expr)]; } -#endif - -#if !defined(LZO_UNUSED) -# if 1 -# define LZO_UNUSED(var) ((void)&var) -# elif 0 -# define LZO_UNUSED(var) { typedef int __lzo_unused[sizeof(var) ? 2 : 1]; } -# else -# define LZO_UNUSED(parm) (parm = parm) -# endif -#endif - -#if !defined(__inline__) && !defined(__GNUC__) -# if defined(__cplusplus) -# define __inline__ inline -# else -# define __inline__ -# endif -#endif - -#if defined(NO_MEMCMP) -# undef HAVE_MEMCMP -#endif - -#if !defined(HAVE_MEMCMP) -# undef memcmp -# define memcmp lzo_memcmp -#endif -#if !defined(HAVE_MEMCPY) -# undef memcpy -# define memcpy lzo_memcpy -#endif -#if !defined(HAVE_MEMMOVE) -# undef memmove -# define memmove lzo_memmove -#endif -#if !defined(HAVE_MEMSET) -# undef memset -# define memset lzo_memset -#endif - -#if 0 -# define LZO_BYTE(x) ((unsigned char) (x)) -#else -# define LZO_BYTE(x) ((unsigned char) ((x) & 0xff)) -#endif - -#define LZO_MAX(a,b) ((a) >= (b) ? (a) : (b)) -#define LZO_MIN(a,b) ((a) <= (b) ? (a) : (b)) -#define LZO_MAX3(a,b,c) ((a) >= (b) ? LZO_MAX(a,c) : LZO_MAX(b,c)) -#define LZO_MIN3(a,b,c) ((a) <= (b) ? LZO_MIN(a,c) : LZO_MIN(b,c)) - -#define lzo_sizeof(type) ((lzo_uint) (sizeof(type))) - -#define LZO_HIGH(array) ((lzo_uint) (sizeof(array)/sizeof(*(array)))) - -#define LZO_SIZE(bits) (1u << (bits)) -#define LZO_MASK(bits) (LZO_SIZE(bits) - 1) - -#define LZO_LSIZE(bits) (1ul << (bits)) -#define LZO_LMASK(bits) (LZO_LSIZE(bits) - 1) - -#define LZO_USIZE(bits) ((lzo_uint) 1 << (bits)) -#define LZO_UMASK(bits) (LZO_USIZE(bits) - 1) - -#define LZO_STYPE_MAX(b) (((1l << (8*(b)-2)) - 1l) + (1l << (8*(b)-2))) -#define LZO_UTYPE_MAX(b) (((1ul << (8*(b)-1)) - 1ul) + (1ul << (8*(b)-1))) - -#if !defined(SIZEOF_UNSIGNED) -# if (UINT_MAX == 0xffff) -# define SIZEOF_UNSIGNED 2 -# elif (UINT_MAX == LZO_0xffffffffL) -# define SIZEOF_UNSIGNED 4 -# elif (UINT_MAX >= LZO_0xffffffffL) -# define SIZEOF_UNSIGNED 8 -# else -# error "SIZEOF_UNSIGNED" -# endif -#endif - -#if !defined(SIZEOF_UNSIGNED_LONG) -# if (ULONG_MAX == LZO_0xffffffffL) -# define SIZEOF_UNSIGNED_LONG 4 -# elif (ULONG_MAX >= LZO_0xffffffffL) -# define SIZEOF_UNSIGNED_LONG 8 -# else -# error "SIZEOF_UNSIGNED_LONG" -# endif -#endif - -#if !defined(SIZEOF_SIZE_T) -# define SIZEOF_SIZE_T SIZEOF_UNSIGNED -#endif -#if !defined(SIZE_T_MAX) -# define SIZE_T_MAX LZO_UTYPE_MAX(SIZEOF_SIZE_T) -#endif - -#if 1 && defined(__LZO_i386) && (UINT_MAX == LZO_0xffffffffL) -# if !defined(LZO_UNALIGNED_OK_2) && (USHRT_MAX == 0xffff) -# define LZO_UNALIGNED_OK_2 -# endif -# if !defined(LZO_UNALIGNED_OK_4) && (LZO_UINT32_MAX == LZO_0xffffffffL) -# define LZO_UNALIGNED_OK_4 -# endif -#endif - -#if defined(LZO_UNALIGNED_OK_2) || defined(LZO_UNALIGNED_OK_4) -# if !defined(LZO_UNALIGNED_OK) -# define LZO_UNALIGNED_OK -# endif -#endif - -#if defined(__LZO_NO_UNALIGNED) -# undef LZO_UNALIGNED_OK -# undef LZO_UNALIGNED_OK_2 -# undef LZO_UNALIGNED_OK_4 -#endif - -#if defined(LZO_UNALIGNED_OK_2) && (USHRT_MAX != 0xffff) -# error "LZO_UNALIGNED_OK_2 must not be defined on this system" -#endif -#if defined(LZO_UNALIGNED_OK_4) && (LZO_UINT32_MAX != LZO_0xffffffffL) -# error "LZO_UNALIGNED_OK_4 must not be defined on this system" -#endif - -#if defined(__LZO_NO_ALIGNED) -# undef LZO_ALIGNED_OK_4 -#endif - -#if defined(LZO_ALIGNED_OK_4) && (LZO_UINT32_MAX != LZO_0xffffffffL) -# error "LZO_ALIGNED_OK_4 must not be defined on this system" -#endif - -#define LZO_LITTLE_ENDIAN 1234 -#define LZO_BIG_ENDIAN 4321 -#define LZO_PDP_ENDIAN 3412 - -#if !defined(LZO_BYTE_ORDER) -# if defined(MFX_BYTE_ORDER) -# define LZO_BYTE_ORDER MFX_BYTE_ORDER -# elif defined(__LZO_i386) -# define LZO_BYTE_ORDER LZO_LITTLE_ENDIAN -# elif defined(BYTE_ORDER) -# define LZO_BYTE_ORDER BYTE_ORDER -# elif defined(__BYTE_ORDER) -# define LZO_BYTE_ORDER __BYTE_ORDER -# endif -#endif - -#if defined(LZO_BYTE_ORDER) -# if (LZO_BYTE_ORDER != LZO_LITTLE_ENDIAN) && \ - (LZO_BYTE_ORDER != LZO_BIG_ENDIAN) -# error "invalid LZO_BYTE_ORDER" -# endif -#endif - -#if defined(LZO_UNALIGNED_OK) && !defined(LZO_BYTE_ORDER) -# error "LZO_BYTE_ORDER is not defined" -#endif - -#define LZO_OPTIMIZE_GNUC_i386_IS_BUGGY - -#if defined(NDEBUG) && !defined(LZO_DEBUG) && !defined(__LZO_CHECKER) -# if defined(__GNUC__) && defined(__i386__) -# if !defined(LZO_OPTIMIZE_GNUC_i386_IS_BUGGY) -# define LZO_OPTIMIZE_GNUC_i386 -# endif -# endif -#endif - -__LZO_EXTERN_C int __lzo_init_done; -__LZO_EXTERN_C const lzo_byte __lzo_copyright[]; -LZO_EXTERN(const lzo_byte *) lzo_copyright(void); -__LZO_EXTERN_C const lzo_uint32 _lzo_crc32_table[256]; - -#define _LZO_STRINGIZE(x) #x -#define _LZO_MEXPAND(x) _LZO_STRINGIZE(x) - -#define _LZO_CONCAT2(a,b) a ## b -#define _LZO_CONCAT3(a,b,c) a ## b ## c -#define _LZO_CONCAT4(a,b,c,d) a ## b ## c ## d -#define _LZO_CONCAT5(a,b,c,d,e) a ## b ## c ## d ## e - -#define _LZO_ECONCAT2(a,b) _LZO_CONCAT2(a,b) -#define _LZO_ECONCAT3(a,b,c) _LZO_CONCAT3(a,b,c) -#define _LZO_ECONCAT4(a,b,c,d) _LZO_CONCAT4(a,b,c,d) -#define _LZO_ECONCAT5(a,b,c,d,e) _LZO_CONCAT5(a,b,c,d,e) - -#if 0 - -#define __LZO_IS_COMPRESS_QUERY(i,il,o,ol,w) ((lzo_voidp)(o) == (w)) -#define __LZO_QUERY_COMPRESS(i,il,o,ol,w,n,s) \ - (*ol = (n)*(s), LZO_E_OK) - -#define __LZO_IS_DECOMPRESS_QUERY(i,il,o,ol,w) ((lzo_voidp)(o) == (w)) -#define __LZO_QUERY_DECOMPRESS(i,il,o,ol,w,n,s) \ - (*ol = (n)*(s), LZO_E_OK) - -#define __LZO_IS_OPTIMIZE_QUERY(i,il,o,ol,w) ((lzo_voidp)(o) == (w)) -#define __LZO_QUERY_OPTIMIZE(i,il,o,ol,w,n,s) \ - (*ol = (n)*(s), LZO_E_OK) - -#endif - -#ifndef __LZO_PTR_H -#define __LZO_PTR_H - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(__LZO_DOS16) || defined(__LZO_WIN16) -# include -# if 1 && defined(__WATCOMC__) -# include - __LZO_EXTERN_C unsigned char _HShift; -# define __LZO_HShift _HShift -# elif 1 && defined(_MSC_VER) - __LZO_EXTERN_C unsigned short __near _AHSHIFT; -# define __LZO_HShift ((unsigned) &_AHSHIFT) -# elif defined(__LZO_WIN16) -# define __LZO_HShift 3 -# else -# define __LZO_HShift 12 -# endif -# if !defined(_FP_SEG) && defined(FP_SEG) -# define _FP_SEG FP_SEG -# endif -# if !defined(_FP_OFF) && defined(FP_OFF) -# define _FP_OFF FP_OFF -# endif -#endif - -#if !defined(lzo_ptrdiff_t) -# if (UINT_MAX >= LZO_0xffffffffL) - typedef ptrdiff_t lzo_ptrdiff_t; -# else - typedef long lzo_ptrdiff_t; -# endif -#endif - -#if !defined(__LZO_HAVE_PTR_T) -# if defined(lzo_ptr_t) -# define __LZO_HAVE_PTR_T -# endif -#endif -#if !defined(__LZO_HAVE_PTR_T) -# if defined(SIZEOF_CHAR_P) && defined(SIZEOF_UNSIGNED_LONG) -# if (SIZEOF_CHAR_P == SIZEOF_UNSIGNED_LONG) - typedef unsigned long lzo_ptr_t; - typedef long lzo_sptr_t; -# define __LZO_HAVE_PTR_T -# endif -# endif -#endif -#if !defined(__LZO_HAVE_PTR_T) -# if defined(SIZEOF_CHAR_P) && defined(SIZEOF_UNSIGNED) -# if (SIZEOF_CHAR_P == SIZEOF_UNSIGNED) - typedef unsigned int lzo_ptr_t; - typedef int lzo_sptr_t; -# define __LZO_HAVE_PTR_T -# endif -# endif -#endif -#if !defined(__LZO_HAVE_PTR_T) -# if defined(SIZEOF_CHAR_P) && defined(SIZEOF_UNSIGNED_SHORT) -# if (SIZEOF_CHAR_P == SIZEOF_UNSIGNED_SHORT) - typedef unsigned short lzo_ptr_t; - typedef short lzo_sptr_t; -# define __LZO_HAVE_PTR_T -# endif -# endif -#endif -#if !defined(__LZO_HAVE_PTR_T) -# if defined(LZO_HAVE_CONFIG_H) || defined(SIZEOF_CHAR_P) -# error "no suitable type for lzo_ptr_t" -# else - typedef unsigned long lzo_ptr_t; - typedef long lzo_sptr_t; -# define __LZO_HAVE_PTR_T -# endif -#endif - -#if defined(__LZO_DOS16) || defined(__LZO_WIN16) -#define PTR(a) ((lzo_bytep) (a)) -#define PTR_ALIGNED_4(a) ((_FP_OFF(a) & 3) == 0) -#define PTR_ALIGNED2_4(a,b) (((_FP_OFF(a) | _FP_OFF(b)) & 3) == 0) -#else -#define PTR(a) ((lzo_ptr_t) (a)) -#define PTR_LINEAR(a) PTR(a) -#define PTR_ALIGNED_4(a) ((PTR_LINEAR(a) & 3) == 0) -#define PTR_ALIGNED_8(a) ((PTR_LINEAR(a) & 7) == 0) -#define PTR_ALIGNED2_4(a,b) (((PTR_LINEAR(a) | PTR_LINEAR(b)) & 3) == 0) -#define PTR_ALIGNED2_8(a,b) (((PTR_LINEAR(a) | PTR_LINEAR(b)) & 7) == 0) -#endif - -#define PTR_LT(a,b) (PTR(a) < PTR(b)) -#define PTR_GE(a,b) (PTR(a) >= PTR(b)) -#define PTR_DIFF(a,b) ((lzo_ptrdiff_t) (PTR(a) - PTR(b))) -#define pd(a,b) ((lzo_uint) ((a)-(b))) - -LZO_EXTERN(lzo_ptr_t) -__lzo_ptr_linear(const lzo_voidp ptr); - -typedef union -{ - char a_char; - unsigned char a_uchar; - short a_short; - unsigned short a_ushort; - int a_int; - unsigned int a_uint; - long a_long; - unsigned long a_ulong; - lzo_int a_lzo_int; - lzo_uint a_lzo_uint; - lzo_int32 a_lzo_int32; - lzo_uint32 a_lzo_uint32; - ptrdiff_t a_ptrdiff_t; - lzo_ptrdiff_t a_lzo_ptrdiff_t; - lzo_ptr_t a_lzo_ptr_t; - lzo_voidp a_lzo_voidp; - void * a_void_p; - lzo_bytep a_lzo_bytep; - lzo_bytepp a_lzo_bytepp; - lzo_uintp a_lzo_uintp; - lzo_uint * a_lzo_uint_p; - lzo_uint32p a_lzo_uint32p; - lzo_uint32 * a_lzo_uint32_p; - unsigned char * a_uchar_p; - char * a_char_p; -} -lzo_full_align_t; - -#ifdef __cplusplus -} -#endif - -#endif - -#define LZO_DETERMINISTIC - -#define LZO_DICT_USE_PTR -#if defined(__LZO_DOS16) || defined(__LZO_WIN16) || defined(__LZO_STRICT_16BIT) -# undef LZO_DICT_USE_PTR -#endif - -#if defined(LZO_DICT_USE_PTR) -# define lzo_dict_t const lzo_bytep -# define lzo_dict_p lzo_dict_t __LZO_MMODEL * -#else -# define lzo_dict_t lzo_uint -# define lzo_dict_p lzo_dict_t __LZO_MMODEL * -#endif - -#if !defined(lzo_moff_t) -#define lzo_moff_t lzo_uint -#endif - -#endif - -LZO_PUBLIC(lzo_ptr_t) -__lzo_ptr_linear(const lzo_voidp ptr) -{ - lzo_ptr_t p; - -#if defined(__LZO_DOS16) || defined(__LZO_WIN16) - p = (((lzo_ptr_t)(_FP_SEG(ptr))) << (16 - __LZO_HShift)) + (_FP_OFF(ptr)); -#else - p = PTR_LINEAR(ptr); -#endif - - return p; -} - -LZO_PUBLIC(unsigned) -__lzo_align_gap(const lzo_voidp ptr, lzo_uint size) -{ - lzo_ptr_t p, s, n; - - assert(size > 0); - - p = __lzo_ptr_linear(ptr); - s = (lzo_ptr_t) (size - 1); -#if 0 - assert((size & (size - 1)) == 0); - n = ((p + s) & ~s) - p; -#else - n = (((p + s) / size) * size) - p; -#endif - - assert((long)n >= 0); - assert(n <= s); - - return (unsigned)n; -} - -#ifndef __LZO_UTIL_H -#define __LZO_UTIL_H - -#ifndef __LZO_CONF_H -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#if 1 && defined(HAVE_MEMCPY) -#if !defined(__LZO_DOS16) && !defined(__LZO_WIN16) - -#define MEMCPY8_DS(dest,src,len) \ - memcpy(dest,src,len); \ - dest += len; \ - src += len - -#endif -#endif - -#if 0 && !defined(MEMCPY8_DS) - -#define MEMCPY8_DS(dest,src,len) \ - { do { \ - *dest++ = *src++; \ - *dest++ = *src++; \ - *dest++ = *src++; \ - *dest++ = *src++; \ - *dest++ = *src++; \ - *dest++ = *src++; \ - *dest++ = *src++; \ - *dest++ = *src++; \ - len -= 8; \ - } while (len > 0); } - -#endif - -#if !defined(MEMCPY8_DS) - -#define MEMCPY8_DS(dest,src,len) \ - { register lzo_uint __l = (len) / 8; \ - do { \ - *dest++ = *src++; \ - *dest++ = *src++; \ - *dest++ = *src++; \ - *dest++ = *src++; \ - *dest++ = *src++; \ - *dest++ = *src++; \ - *dest++ = *src++; \ - *dest++ = *src++; \ - } while (--__l > 0); } - -#endif - -#define MEMCPY_DS(dest,src,len) \ - do *dest++ = *src++; \ - while (--len > 0) - -#define MEMMOVE_DS(dest,src,len) \ - do *dest++ = *src++; \ - while (--len > 0) - -#if 0 && defined(LZO_OPTIMIZE_GNUC_i386) - -#define BZERO8_PTR(s,l,n) \ -__asm__ __volatile__( \ - "movl %0,%%eax \n" \ - "movl %1,%%edi \n" \ - "movl %2,%%ecx \n" \ - "cld \n" \ - "rep \n" \ - "stosl %%eax,(%%edi) \n" \ - : \ - :"g" (0),"g" (s),"g" (n) \ - :"eax","edi","ecx", "memory", "cc" \ -) - -#elif (LZO_UINT_MAX <= SIZE_T_MAX) && defined(HAVE_MEMSET) - -#if 1 -#define BZERO8_PTR(s,l,n) memset((s),0,(lzo_uint)(l)*(n)) -#else -#define BZERO8_PTR(s,l,n) memset((lzo_voidp)(s),0,(lzo_uint)(l)*(n)) -#endif - -#else - -#define BZERO8_PTR(s,l,n) \ - lzo_memset((lzo_voidp)(s),0,(lzo_uint)(l)*(n)) - -#endif - -#if 0 -#if defined(__GNUC__) && defined(__i386__) - -unsigned char lzo_rotr8(unsigned char value, int shift); -extern __inline__ unsigned char lzo_rotr8(unsigned char value, int shift) -{ - unsigned char result; - - __asm__ __volatile__ ("movb %b1, %b0; rorb %b2, %b0" - : "=a"(result) : "g"(value), "c"(shift)); - return result; -} - -unsigned short lzo_rotr16(unsigned short value, int shift); -extern __inline__ unsigned short lzo_rotr16(unsigned short value, int shift) -{ - unsigned short result; - - __asm__ __volatile__ ("movw %b1, %b0; rorw %b2, %b0" - : "=a"(result) : "g"(value), "c"(shift)); - return result; -} - -#endif -#endif - -#ifdef __cplusplus -} -#endif - -#endif - -LZO_PUBLIC(lzo_bool) -lzo_assert(int expr) -{ - return (expr) ? 1 : 0; -} - -/* If you use the LZO library in a product, you *must* keep this - * copyright string in the executable of your product. - */ - -const lzo_byte __lzo_copyright[] = -#if !defined(__LZO_IN_MINLZO) - LZO_VERSION_STRING; -#else - "\n\n\n" - "LZO real-time data compression library.\n" - "Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 Markus Franz Xaver Johannes Oberhumer\n" - "\n" - "http://www.oberhumer.com/opensource/lzo/\n" - "\n" - "LZO version: v" LZO_VERSION_STRING ", " LZO_VERSION_DATE "\n" - "LZO build date: " __DATE__ " " __TIME__ "\n\n" - "LZO special compilation options:\n" -#ifdef __cplusplus - " __cplusplus\n" -#endif -#if defined(__PIC__) - " __PIC__\n" -#elif defined(__pic__) - " __pic__\n" -#endif -#if (UINT_MAX < LZO_0xffffffffL) - " 16BIT\n" -#endif -#if defined(__LZO_STRICT_16BIT) - " __LZO_STRICT_16BIT\n" -#endif -#if (UINT_MAX > LZO_0xffffffffL) - " UINT_MAX=" _LZO_MEXPAND(UINT_MAX) "\n" -#endif -#if (ULONG_MAX > LZO_0xffffffffL) - " ULONG_MAX=" _LZO_MEXPAND(ULONG_MAX) "\n" -#endif -#if defined(LZO_BYTE_ORDER) - " LZO_BYTE_ORDER=" _LZO_MEXPAND(LZO_BYTE_ORDER) "\n" -#endif -#if defined(LZO_UNALIGNED_OK_2) - " LZO_UNALIGNED_OK_2\n" -#endif -#if defined(LZO_UNALIGNED_OK_4) - " LZO_UNALIGNED_OK_4\n" -#endif -#if defined(LZO_ALIGNED_OK_4) - " LZO_ALIGNED_OK_4\n" -#endif -#if defined(LZO_DICT_USE_PTR) - " LZO_DICT_USE_PTR\n" -#endif -#if defined(__LZO_QUERY_COMPRESS) - " __LZO_QUERY_COMPRESS\n" -#endif -#if defined(__LZO_QUERY_DECOMPRESS) - " __LZO_QUERY_DECOMPRESS\n" -#endif -#if defined(__LZO_IN_MINILZO) - " __LZO_IN_MINILZO\n" -#endif - "\n\n" - "$Id: LZO " LZO_VERSION_STRING " built " __DATE__ " " __TIME__ -#if defined(__GNUC__) && defined(__VERSION__) - " by gcc " __VERSION__ -#elif defined(__BORLANDC__) - " by Borland C " _LZO_MEXPAND(__BORLANDC__) -#elif defined(_MSC_VER) - " by Microsoft C " _LZO_MEXPAND(_MSC_VER) -#elif defined(__PUREC__) - " by Pure C " _LZO_MEXPAND(__PUREC__) -#elif defined(__SC__) - " by Symantec C " _LZO_MEXPAND(__SC__) -#elif defined(__TURBOC__) - " by Turbo C " _LZO_MEXPAND(__TURBOC__) -#elif defined(__WATCOMC__) - " by Watcom C " _LZO_MEXPAND(__WATCOMC__) -#endif - " $\n" - "$Copyright: LZO (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 Markus Franz Xaver Johannes Oberhumer $\n"; -#endif - -LZO_PUBLIC(const lzo_byte *) -lzo_copyright(void) -{ - return __lzo_copyright; -} - -LZO_PUBLIC(unsigned) -lzo_version(void) -{ - return LZO_VERSION; -} - -LZO_PUBLIC(const char *) -lzo_version_string(void) -{ - return LZO_VERSION_STRING; -} - -LZO_PUBLIC(const char *) -lzo_version_date(void) -{ - return LZO_VERSION_DATE; -} - -LZO_PUBLIC(const lzo_charp) -_lzo_version_string(void) -{ - return LZO_VERSION_STRING; -} - -LZO_PUBLIC(const lzo_charp) -_lzo_version_date(void) -{ - return LZO_VERSION_DATE; -} - -#define LZO_BASE 65521u -#define LZO_NMAX 5552 - -#define LZO_DO1(buf,i) {s1 += buf[i]; s2 += s1;} -#define LZO_DO2(buf,i) LZO_DO1(buf,i); LZO_DO1(buf,i+1); -#define LZO_DO4(buf,i) LZO_DO2(buf,i); LZO_DO2(buf,i+2); -#define LZO_DO8(buf,i) LZO_DO4(buf,i); LZO_DO4(buf,i+4); -#define LZO_DO16(buf,i) LZO_DO8(buf,i); LZO_DO8(buf,i+8); - -LZO_PUBLIC(lzo_uint32) -lzo_adler32(lzo_uint32 adler, const lzo_byte *buf, lzo_uint len) -{ - lzo_uint32 s1 = adler & 0xffff; - lzo_uint32 s2 = (adler >> 16) & 0xffff; - int k; - - if (buf == NULL) - return 1; - - while (len > 0) - { - k = len < LZO_NMAX ? (int) len : LZO_NMAX; - len -= k; - if (k >= 16) do - { - LZO_DO16(buf,0); - buf += 16; - k -= 16; - } while (k >= 16); - if (k != 0) do - { - s1 += *buf++; - s2 += s1; - } while (--k > 0); - s1 %= LZO_BASE; - s2 %= LZO_BASE; - } - return (s2 << 16) | s1; -} - -LZO_PUBLIC(int) -lzo_memcmp(const lzo_voidp s1, const lzo_voidp s2, lzo_uint len) -{ -#if (LZO_UINT_MAX <= SIZE_T_MAX) && defined(HAVE_MEMCMP) - return memcmp(s1,s2,len); -#else - const lzo_byte *p1 = (const lzo_byte *) s1; - const lzo_byte *p2 = (const lzo_byte *) s2; - int d; - - if (len > 0) do - { - d = *p1 - *p2; - if (d != 0) - return d; - p1++; - p2++; - } - while (--len > 0); - return 0; -#endif -} - -LZO_PUBLIC(lzo_voidp) -lzo_memcpy(lzo_voidp dest, const lzo_voidp src, lzo_uint len) -{ -#if (LZO_UINT_MAX <= SIZE_T_MAX) && defined(HAVE_MEMCPY) - return memcpy(dest,src,len); -#else - lzo_byte *p1 = (lzo_byte *) dest; - const lzo_byte *p2 = (const lzo_byte *) src; - - if (len <= 0 || p1 == p2) - return dest; - do - *p1++ = *p2++; - while (--len > 0); - return dest; -#endif -} - -LZO_PUBLIC(lzo_voidp) -lzo_memmove(lzo_voidp dest, const lzo_voidp src, lzo_uint len) -{ -#if (LZO_UINT_MAX <= SIZE_T_MAX) && defined(HAVE_MEMMOVE) - return memmove(dest,src,len); -#else - lzo_byte *p1 = (lzo_byte *) dest; - const lzo_byte *p2 = (const lzo_byte *) src; - - if (len <= 0 || p1 == p2) - return dest; - - if (p1 < p2) - { - do - *p1++ = *p2++; - while (--len > 0); - } - else - { - p1 += len; - p2 += len; - do - *--p1 = *--p2; - while (--len > 0); - } - return dest; -#endif -} - -LZO_PUBLIC(lzo_voidp) -lzo_memset(lzo_voidp s, int c, lzo_uint len) -{ -#if (LZO_UINT_MAX <= SIZE_T_MAX) && defined(HAVE_MEMSET) - return memset(s,c,len); -#else - lzo_byte *p = (lzo_byte *) s; - - if (len > 0) do - *p++ = LZO_BYTE(c); - while (--len > 0); - return s; -#endif -} - -#if 0 -# define IS_SIGNED(type) (((type) (1ul << (8 * sizeof(type) - 1))) < 0) -# define IS_UNSIGNED(type) (((type) (1ul << (8 * sizeof(type) - 1))) > 0) -#else -# define IS_SIGNED(type) (((type) (-1)) < ((type) 0)) -# define IS_UNSIGNED(type) (((type) (-1)) > ((type) 0)) -#endif - -#define IS_POWER_OF_2(x) (((x) & ((x) - 1)) == 0) - -static lzo_bool schedule_insns_bug(void); -static lzo_bool strength_reduce_bug(int *); - -#if 0 || defined(LZO_DEBUG) -#include -static lzo_bool __lzo_assert_fail(const char *s, unsigned line) -{ -#if defined(__palmos__) - printf("LZO assertion failed in line %u: '%s'\n",line,s); -#else - fprintf(stderr,"LZO assertion failed in line %u: '%s'\n",line,s); -#endif - return 0; -} -# define __lzo_assert(x) ((x) ? 1 : __lzo_assert_fail(#x,__LINE__)) -#else -# define __lzo_assert(x) ((x) ? 1 : 0) -#endif - -#undef COMPILE_TIME_ASSERT -#if 0 -# define COMPILE_TIME_ASSERT(expr) r &= __lzo_assert(expr) -#else -# define COMPILE_TIME_ASSERT(expr) LZO_COMPILE_TIME_ASSERT(expr) -#endif - -static lzo_bool basic_integral_check(void) -{ - lzo_bool r = 1; - - COMPILE_TIME_ASSERT(CHAR_BIT == 8); - COMPILE_TIME_ASSERT(sizeof(char) == 1); - COMPILE_TIME_ASSERT(sizeof(short) >= 2); - COMPILE_TIME_ASSERT(sizeof(long) >= 4); - COMPILE_TIME_ASSERT(sizeof(int) >= sizeof(short)); - COMPILE_TIME_ASSERT(sizeof(long) >= sizeof(int)); - - COMPILE_TIME_ASSERT(sizeof(lzo_uint) == sizeof(lzo_int)); - COMPILE_TIME_ASSERT(sizeof(lzo_uint32) == sizeof(lzo_int32)); - - COMPILE_TIME_ASSERT(sizeof(lzo_uint32) >= 4); - COMPILE_TIME_ASSERT(sizeof(lzo_uint32) >= sizeof(unsigned)); -#if defined(__LZO_STRICT_16BIT) - COMPILE_TIME_ASSERT(sizeof(lzo_uint) == 2); -#else - COMPILE_TIME_ASSERT(sizeof(lzo_uint) >= 4); - COMPILE_TIME_ASSERT(sizeof(lzo_uint) >= sizeof(unsigned)); -#endif - -#if (USHRT_MAX == 65535u) - COMPILE_TIME_ASSERT(sizeof(short) == 2); -#elif (USHRT_MAX == LZO_0xffffffffL) - COMPILE_TIME_ASSERT(sizeof(short) == 4); -#elif (USHRT_MAX >= LZO_0xffffffffL) - COMPILE_TIME_ASSERT(sizeof(short) > 4); -#endif -#if (UINT_MAX == 65535u) - COMPILE_TIME_ASSERT(sizeof(int) == 2); -#elif (UINT_MAX == LZO_0xffffffffL) - COMPILE_TIME_ASSERT(sizeof(int) == 4); -#elif (UINT_MAX >= LZO_0xffffffffL) - COMPILE_TIME_ASSERT(sizeof(int) > 4); -#endif -#if (ULONG_MAX == 65535ul) - COMPILE_TIME_ASSERT(sizeof(long) == 2); -#elif (ULONG_MAX == LZO_0xffffffffL) - COMPILE_TIME_ASSERT(sizeof(long) == 4); -#elif (ULONG_MAX >= LZO_0xffffffffL) - COMPILE_TIME_ASSERT(sizeof(long) > 4); -#endif - -#if defined(SIZEOF_UNSIGNED) - COMPILE_TIME_ASSERT(SIZEOF_UNSIGNED == sizeof(unsigned)); -#endif -#if defined(SIZEOF_UNSIGNED_LONG) - COMPILE_TIME_ASSERT(SIZEOF_UNSIGNED_LONG == sizeof(unsigned long)); -#endif -#if defined(SIZEOF_UNSIGNED_SHORT) - COMPILE_TIME_ASSERT(SIZEOF_UNSIGNED_SHORT == sizeof(unsigned short)); -#endif -#if !defined(__LZO_IN_MINILZO) -#if defined(SIZEOF_SIZE_T) - COMPILE_TIME_ASSERT(SIZEOF_SIZE_T == sizeof(size_t)); -#endif -#endif - - COMPILE_TIME_ASSERT(IS_UNSIGNED(unsigned char)); - COMPILE_TIME_ASSERT(IS_UNSIGNED(unsigned short)); - COMPILE_TIME_ASSERT(IS_UNSIGNED(unsigned)); - COMPILE_TIME_ASSERT(IS_UNSIGNED(unsigned long)); - COMPILE_TIME_ASSERT(IS_SIGNED(short)); - COMPILE_TIME_ASSERT(IS_SIGNED(int)); - COMPILE_TIME_ASSERT(IS_SIGNED(long)); - - COMPILE_TIME_ASSERT(IS_UNSIGNED(lzo_uint32)); - COMPILE_TIME_ASSERT(IS_UNSIGNED(lzo_uint)); - COMPILE_TIME_ASSERT(IS_SIGNED(lzo_int32)); - COMPILE_TIME_ASSERT(IS_SIGNED(lzo_int)); - - COMPILE_TIME_ASSERT(INT_MAX == LZO_STYPE_MAX(sizeof(int))); - COMPILE_TIME_ASSERT(UINT_MAX == LZO_UTYPE_MAX(sizeof(unsigned))); - COMPILE_TIME_ASSERT(LONG_MAX == LZO_STYPE_MAX(sizeof(long))); - COMPILE_TIME_ASSERT(ULONG_MAX == LZO_UTYPE_MAX(sizeof(unsigned long))); - COMPILE_TIME_ASSERT(SHRT_MAX == LZO_STYPE_MAX(sizeof(short))); - COMPILE_TIME_ASSERT(USHRT_MAX == LZO_UTYPE_MAX(sizeof(unsigned short))); - COMPILE_TIME_ASSERT(LZO_UINT32_MAX == LZO_UTYPE_MAX(sizeof(lzo_uint32))); - COMPILE_TIME_ASSERT(LZO_UINT_MAX == LZO_UTYPE_MAX(sizeof(lzo_uint))); -#if !defined(__LZO_IN_MINILZO) - COMPILE_TIME_ASSERT(SIZE_T_MAX == LZO_UTYPE_MAX(sizeof(size_t))); -#endif - - r &= __lzo_assert(LZO_BYTE(257) == 1); - - return r; -} - -static lzo_bool basic_ptr_check(void) -{ - lzo_bool r = 1; - - COMPILE_TIME_ASSERT(sizeof(char *) >= sizeof(int)); - COMPILE_TIME_ASSERT(sizeof(lzo_byte *) >= sizeof(char *)); - - COMPILE_TIME_ASSERT(sizeof(lzo_voidp) == sizeof(lzo_byte *)); - COMPILE_TIME_ASSERT(sizeof(lzo_voidp) == sizeof(lzo_voidpp)); - COMPILE_TIME_ASSERT(sizeof(lzo_voidp) == sizeof(lzo_bytepp)); - COMPILE_TIME_ASSERT(sizeof(lzo_voidp) >= sizeof(lzo_uint)); - - COMPILE_TIME_ASSERT(sizeof(lzo_ptr_t) == sizeof(lzo_voidp)); - COMPILE_TIME_ASSERT(sizeof(lzo_ptr_t) == sizeof(lzo_sptr_t)); - COMPILE_TIME_ASSERT(sizeof(lzo_ptr_t) >= sizeof(lzo_uint)); - - COMPILE_TIME_ASSERT(sizeof(lzo_ptrdiff_t) >= 4); - COMPILE_TIME_ASSERT(sizeof(lzo_ptrdiff_t) >= sizeof(ptrdiff_t)); - - COMPILE_TIME_ASSERT(sizeof(ptrdiff_t) >= sizeof(size_t)); - COMPILE_TIME_ASSERT(sizeof(lzo_ptrdiff_t) >= sizeof(lzo_uint)); - -#if defined(SIZEOF_CHAR_P) - COMPILE_TIME_ASSERT(SIZEOF_CHAR_P == sizeof(char *)); -#endif -#if defined(SIZEOF_PTRDIFF_T) - COMPILE_TIME_ASSERT(SIZEOF_PTRDIFF_T == sizeof(ptrdiff_t)); -#endif - - COMPILE_TIME_ASSERT(IS_SIGNED(ptrdiff_t)); - COMPILE_TIME_ASSERT(IS_UNSIGNED(size_t)); - COMPILE_TIME_ASSERT(IS_SIGNED(lzo_ptrdiff_t)); - COMPILE_TIME_ASSERT(IS_SIGNED(lzo_sptr_t)); - COMPILE_TIME_ASSERT(IS_UNSIGNED(lzo_ptr_t)); - COMPILE_TIME_ASSERT(IS_UNSIGNED(lzo_moff_t)); - - return r; -} - -static lzo_bool ptr_check(void) -{ - lzo_bool r = 1; - int i; - char _wrkmem[10 * sizeof(lzo_byte *) + sizeof(lzo_full_align_t)]; - lzo_bytep wrkmem; - lzo_bytepp dict; - unsigned char x[4 * sizeof(lzo_full_align_t)]; - long d; - lzo_full_align_t a; - lzo_full_align_t u; - - for (i = 0; i < (int) sizeof(x); i++) - x[i] = LZO_BYTE(i); - - wrkmem = LZO_PTR_ALIGN_UP((lzo_byte *)_wrkmem,sizeof(lzo_full_align_t)); - -#if 0 - dict = (lzo_bytepp) wrkmem; -#else - - u.a_lzo_bytep = wrkmem; dict = u.a_lzo_bytepp; -#endif - - d = (long) ((const lzo_bytep) dict - (const lzo_bytep) _wrkmem); - r &= __lzo_assert(d >= 0); - r &= __lzo_assert(d < (long) sizeof(lzo_full_align_t)); - - memset(&a,0,sizeof(a)); - r &= __lzo_assert(a.a_lzo_voidp == NULL); - - memset(&a,0xff,sizeof(a)); - r &= __lzo_assert(a.a_ushort == USHRT_MAX); - r &= __lzo_assert(a.a_uint == UINT_MAX); - r &= __lzo_assert(a.a_ulong == ULONG_MAX); - r &= __lzo_assert(a.a_lzo_uint == LZO_UINT_MAX); - r &= __lzo_assert(a.a_lzo_uint32 == LZO_UINT32_MAX); - - if (r == 1) - { - for (i = 0; i < 8; i++) - r &= __lzo_assert((const lzo_voidp) (&dict[i]) == (const lzo_voidp) (&wrkmem[i * sizeof(lzo_byte *)])); - } - - memset(&a,0,sizeof(a)); - r &= __lzo_assert(a.a_char_p == NULL); - r &= __lzo_assert(a.a_lzo_bytep == NULL); - r &= __lzo_assert(NULL == (void *)0); - if (r == 1) - { - for (i = 0; i < 10; i++) - dict[i] = wrkmem; - BZERO8_PTR(dict+1,sizeof(dict[0]),8); - r &= __lzo_assert(dict[0] == wrkmem); - for (i = 1; i < 9; i++) - r &= __lzo_assert(dict[i] == NULL); - r &= __lzo_assert(dict[9] == wrkmem); - } - - if (r == 1) - { - unsigned k = 1; - const unsigned n = (unsigned) sizeof(lzo_uint32); - lzo_byte *p0; - lzo_byte *p1; - - k += __lzo_align_gap(&x[k],n); - p0 = (lzo_bytep) &x[k]; -#if defined(PTR_LINEAR) - r &= __lzo_assert((PTR_LINEAR(p0) & (n-1)) == 0); -#else - r &= __lzo_assert(n == 4); - r &= __lzo_assert(PTR_ALIGNED_4(p0)); -#endif - - r &= __lzo_assert(k >= 1); - p1 = (lzo_bytep) &x[1]; - r &= __lzo_assert(PTR_GE(p0,p1)); - - r &= __lzo_assert(k < 1+n); - p1 = (lzo_bytep) &x[1+n]; - r &= __lzo_assert(PTR_LT(p0,p1)); - - if (r == 1) - { - lzo_uint32 v0, v1; -#if 0 - v0 = * (lzo_uint32 *) &x[k]; - v1 = * (lzo_uint32 *) &x[k+n]; -#else - - u.a_uchar_p = &x[k]; - v0 = *u.a_lzo_uint32_p; - u.a_uchar_p = &x[k+n]; - v1 = *u.a_lzo_uint32_p; -#endif - r &= __lzo_assert(v0 > 0); - r &= __lzo_assert(v1 > 0); - } - } - - return r; -} - -LZO_PUBLIC(int) -_lzo_config_check(void) -{ - lzo_bool r = 1; - int i; - union { - lzo_uint32 a; - unsigned short b; - lzo_uint32 aa[4]; - unsigned char x[4*sizeof(lzo_full_align_t)]; - } u; - - COMPILE_TIME_ASSERT( (int) ((unsigned char) ((signed char) -1)) == 255); - COMPILE_TIME_ASSERT( (((unsigned char)128) << (int)(8*sizeof(int)-8)) < 0); - -#if 0 - r &= __lzo_assert((const void *)&u == (const void *)&u.a); - r &= __lzo_assert((const void *)&u == (const void *)&u.b); - r &= __lzo_assert((const void *)&u == (const void *)&u.x[0]); - r &= __lzo_assert((const void *)&u == (const void *)&u.aa[0]); -#endif - - r &= basic_integral_check(); - r &= basic_ptr_check(); - if (r != 1) - return LZO_E_ERROR; - - u.a = 0; u.b = 0; - for (i = 0; i < (int) sizeof(u.x); i++) - u.x[i] = LZO_BYTE(i); - -#if defined(LZO_BYTE_ORDER) - if (r == 1) - { -# if (LZO_BYTE_ORDER == LZO_LITTLE_ENDIAN) - lzo_uint32 a = (lzo_uint32) (u.a & LZO_0xffffffffL); - unsigned short b = (unsigned short) (u.b & 0xffff); - r &= __lzo_assert(a == 0x03020100L); - r &= __lzo_assert(b == 0x0100); -# elif (LZO_BYTE_ORDER == LZO_BIG_ENDIAN) - lzo_uint32 a = u.a >> (8 * sizeof(u.a) - 32); - unsigned short b = u.b >> (8 * sizeof(u.b) - 16); - r &= __lzo_assert(a == 0x00010203L); - r &= __lzo_assert(b == 0x0001); -# else -# error "invalid LZO_BYTE_ORDER" -# endif - } -#endif - -#if defined(LZO_UNALIGNED_OK_2) - COMPILE_TIME_ASSERT(sizeof(short) == 2); - if (r == 1) - { - unsigned short b[4]; - - for (i = 0; i < 4; i++) - b[i] = * (const unsigned short *) &u.x[i]; - -# if (LZO_BYTE_ORDER == LZO_LITTLE_ENDIAN) - r &= __lzo_assert(b[0] == 0x0100); - r &= __lzo_assert(b[1] == 0x0201); - r &= __lzo_assert(b[2] == 0x0302); - r &= __lzo_assert(b[3] == 0x0403); -# elif (LZO_BYTE_ORDER == LZO_BIG_ENDIAN) - r &= __lzo_assert(b[0] == 0x0001); - r &= __lzo_assert(b[1] == 0x0102); - r &= __lzo_assert(b[2] == 0x0203); - r &= __lzo_assert(b[3] == 0x0304); -# endif - } -#endif - -#if defined(LZO_UNALIGNED_OK_4) - COMPILE_TIME_ASSERT(sizeof(lzo_uint32) == 4); - if (r == 1) - { - lzo_uint32 a[4]; - - for (i = 0; i < 4; i++) - a[i] = * (const lzo_uint32 *) &u.x[i]; - -# if (LZO_BYTE_ORDER == LZO_LITTLE_ENDIAN) - r &= __lzo_assert(a[0] == 0x03020100L); - r &= __lzo_assert(a[1] == 0x04030201L); - r &= __lzo_assert(a[2] == 0x05040302L); - r &= __lzo_assert(a[3] == 0x06050403L); -# elif (LZO_BYTE_ORDER == LZO_BIG_ENDIAN) - r &= __lzo_assert(a[0] == 0x00010203L); - r &= __lzo_assert(a[1] == 0x01020304L); - r &= __lzo_assert(a[2] == 0x02030405L); - r &= __lzo_assert(a[3] == 0x03040506L); -# endif - } -#endif - -#if defined(LZO_ALIGNED_OK_4) - COMPILE_TIME_ASSERT(sizeof(lzo_uint32) == 4); -#endif - - COMPILE_TIME_ASSERT(lzo_sizeof_dict_t == sizeof(lzo_dict_t)); - -#if defined(__LZO_IN_MINLZO) - if (r == 1) - { - lzo_uint32 adler; - adler = lzo_adler32(0, NULL, 0); - adler = lzo_adler32(adler, lzo_copyright(), 200); - r &= __lzo_assert(adler == 0xc76f1751L); - } -#endif - - if (r == 1) - { - r &= __lzo_assert(!schedule_insns_bug()); - } - - if (r == 1) - { - static int x[3]; - static unsigned xn = 3; - register unsigned j; - - for (j = 0; j < xn; j++) - x[j] = (int)j - 3; - r &= __lzo_assert(!strength_reduce_bug(x)); - } - - if (r == 1) - { - r &= ptr_check(); - } - - return r == 1 ? LZO_E_OK : LZO_E_ERROR; -} - -static lzo_bool schedule_insns_bug(void) -{ -#if defined(__LZO_CHECKER) - return 0; -#else - const int clone[] = {1, 2, 0}; - const int *q; - q = clone; - return (*q) ? 0 : 1; -#endif -} - -static lzo_bool strength_reduce_bug(int *x) -{ - return x[0] != -3 || x[1] != -2 || x[2] != -1; -} - -#undef COMPILE_TIME_ASSERT - -int __lzo_init_done = 0; - -LZO_PUBLIC(int) -__lzo_init2(unsigned v, int s1, int s2, int s3, int s4, int s5, - int s6, int s7, int s8, int s9) -{ - int r; - - __lzo_init_done = 1; - - if (v == 0) - return LZO_E_ERROR; - - r = (s1 == -1 || s1 == (int) sizeof(short)) && - (s2 == -1 || s2 == (int) sizeof(int)) && - (s3 == -1 || s3 == (int) sizeof(long)) && - (s4 == -1 || s4 == (int) sizeof(lzo_uint32)) && - (s5 == -1 || s5 == (int) sizeof(lzo_uint)) && - (s6 == -1 || s6 == (int) lzo_sizeof_dict_t) && - (s7 == -1 || s7 == (int) sizeof(char *)) && - (s8 == -1 || s8 == (int) sizeof(lzo_voidp)) && - (s9 == -1 || s9 == (int) sizeof(lzo_compress_t)); - if (!r) - return LZO_E_ERROR; - - r = _lzo_config_check(); - if (r != LZO_E_OK) - return r; - - return r; -} - -#if !defined(__LZO_IN_MINILZO) - -LZO_EXTERN(int) -__lzo_init(unsigned v,int s1,int s2,int s3,int s4,int s5,int s6,int s7); - -LZO_PUBLIC(int) -__lzo_init(unsigned v,int s1,int s2,int s3,int s4,int s5,int s6,int s7) -{ - if (v == 0 || v > 0x1010) - return LZO_E_ERROR; - return __lzo_init2(v,s1,s2,s3,s4,s5,-1,-1,s6,s7); -} - -#endif - -#define do_compress _lzo1x_1_do_compress - -#define LZO_NEED_DICT_H -#define D_BITS 14 -#define D_INDEX1(d,p) d = DM((0x21*DX3(p,5,5,6)) >> 5) -#define D_INDEX2(d,p) d = (d & (D_MASK & 0x7ff)) ^ (D_HIGH | 0x1f) - -#ifndef __LZO_CONFIG1X_H -#define __LZO_CONFIG1X_H - -#if !defined(LZO1X) && !defined(LZO1Y) && !defined(LZO1Z) -# define LZO1X -#endif - -#if !defined(__LZO_IN_MINILZO) -#include -#endif - -#define LZO_EOF_CODE -#undef LZO_DETERMINISTIC - -#define M1_MAX_OFFSET 0x0400 -#ifndef M2_MAX_OFFSET -#define M2_MAX_OFFSET 0x0800 -#endif -#define M3_MAX_OFFSET 0x4000 -#define M4_MAX_OFFSET 0xbfff - -#define MX_MAX_OFFSET (M1_MAX_OFFSET + M2_MAX_OFFSET) - -#define M1_MIN_LEN 2 -#define M1_MAX_LEN 2 -#define M2_MIN_LEN 3 -#ifndef M2_MAX_LEN -#define M2_MAX_LEN 8 -#endif -#define M3_MIN_LEN 3 -#define M3_MAX_LEN 33 -#define M4_MIN_LEN 3 -#define M4_MAX_LEN 9 - -#define M1_MARKER 0 -#define M2_MARKER 64 -#define M3_MARKER 32 -#define M4_MARKER 16 - -#ifndef MIN_LOOKAHEAD -#define MIN_LOOKAHEAD (M2_MAX_LEN + 1) -#endif - -#if defined(LZO_NEED_DICT_H) - -#ifndef LZO_HASH -#define LZO_HASH LZO_HASH_LZO_INCREMENTAL_B -#endif -#define DL_MIN_LEN M2_MIN_LEN - -#ifndef __LZO_DICT_H -#define __LZO_DICT_H - -#ifdef __cplusplus -extern "C" { -#endif - -#if !defined(D_BITS) && defined(DBITS) -# define D_BITS DBITS -#endif -#if !defined(D_BITS) -# error "D_BITS is not defined" -#endif -#if (D_BITS < 16) -# define D_SIZE LZO_SIZE(D_BITS) -# define D_MASK LZO_MASK(D_BITS) -#else -# define D_SIZE LZO_USIZE(D_BITS) -# define D_MASK LZO_UMASK(D_BITS) -#endif -#define D_HIGH ((D_MASK >> 1) + 1) - -#if !defined(DD_BITS) -# define DD_BITS 0 -#endif -#define DD_SIZE LZO_SIZE(DD_BITS) -#define DD_MASK LZO_MASK(DD_BITS) - -#if !defined(DL_BITS) -# define DL_BITS (D_BITS - DD_BITS) -#endif -#if (DL_BITS < 16) -# define DL_SIZE LZO_SIZE(DL_BITS) -# define DL_MASK LZO_MASK(DL_BITS) -#else -# define DL_SIZE LZO_USIZE(DL_BITS) -# define DL_MASK LZO_UMASK(DL_BITS) -#endif - -#if (D_BITS != DL_BITS + DD_BITS) -# error "D_BITS does not match" -#endif -#if (D_BITS < 8 || D_BITS > 18) -# error "invalid D_BITS" -#endif -#if (DL_BITS < 8 || DL_BITS > 20) -# error "invalid DL_BITS" -#endif -#if (DD_BITS < 0 || DD_BITS > 6) -# error "invalid DD_BITS" -#endif - -#if !defined(DL_MIN_LEN) -# define DL_MIN_LEN 3 -#endif -#if !defined(DL_SHIFT) -# define DL_SHIFT ((DL_BITS + (DL_MIN_LEN - 1)) / DL_MIN_LEN) -#endif - -#define LZO_HASH_GZIP 1 -#define LZO_HASH_GZIP_INCREMENTAL 2 -#define LZO_HASH_LZO_INCREMENTAL_A 3 -#define LZO_HASH_LZO_INCREMENTAL_B 4 - -#if !defined(LZO_HASH) -# error "choose a hashing strategy" -#endif - -#if (DL_MIN_LEN == 3) -# define _DV2_A(p,shift1,shift2) \ - (((( (lzo_uint32)((p)[0]) << shift1) ^ (p)[1]) << shift2) ^ (p)[2]) -# define _DV2_B(p,shift1,shift2) \ - (((( (lzo_uint32)((p)[2]) << shift1) ^ (p)[1]) << shift2) ^ (p)[0]) -# define _DV3_B(p,shift1,shift2,shift3) \ - ((_DV2_B((p)+1,shift1,shift2) << (shift3)) ^ (p)[0]) -#elif (DL_MIN_LEN == 2) -# define _DV2_A(p,shift1,shift2) \ - (( (lzo_uint32)(p[0]) << shift1) ^ p[1]) -# define _DV2_B(p,shift1,shift2) \ - (( (lzo_uint32)(p[1]) << shift1) ^ p[2]) -#else -# error "invalid DL_MIN_LEN" -#endif -#define _DV_A(p,shift) _DV2_A(p,shift,shift) -#define _DV_B(p,shift) _DV2_B(p,shift,shift) -#define DA2(p,s1,s2) \ - (((((lzo_uint32)((p)[2]) << (s2)) + (p)[1]) << (s1)) + (p)[0]) -#define DS2(p,s1,s2) \ - (((((lzo_uint32)((p)[2]) << (s2)) - (p)[1]) << (s1)) - (p)[0]) -#define DX2(p,s1,s2) \ - (((((lzo_uint32)((p)[2]) << (s2)) ^ (p)[1]) << (s1)) ^ (p)[0]) -#define DA3(p,s1,s2,s3) ((DA2((p)+1,s2,s3) << (s1)) + (p)[0]) -#define DS3(p,s1,s2,s3) ((DS2((p)+1,s2,s3) << (s1)) - (p)[0]) -#define DX3(p,s1,s2,s3) ((DX2((p)+1,s2,s3) << (s1)) ^ (p)[0]) -#define DMS(v,s) ((lzo_uint) (((v) & (D_MASK >> (s))) << (s))) -#define DM(v) DMS(v,0) - -#if (LZO_HASH == LZO_HASH_GZIP) -# define _DINDEX(dv,p) (_DV_A((p),DL_SHIFT)) - -#elif (LZO_HASH == LZO_HASH_GZIP_INCREMENTAL) -# define __LZO_HASH_INCREMENTAL -# define DVAL_FIRST(dv,p) dv = _DV_A((p),DL_SHIFT) -# define DVAL_NEXT(dv,p) dv = (((dv) << DL_SHIFT) ^ p[2]) -# define _DINDEX(dv,p) (dv) -# define DVAL_LOOKAHEAD DL_MIN_LEN - -#elif (LZO_HASH == LZO_HASH_LZO_INCREMENTAL_A) -# define __LZO_HASH_INCREMENTAL -# define DVAL_FIRST(dv,p) dv = _DV_A((p),5) -# define DVAL_NEXT(dv,p) \ - dv ^= (lzo_uint32)(p[-1]) << (2*5); dv = (((dv) << 5) ^ p[2]) -# define _DINDEX(dv,p) ((0x9f5f * (dv)) >> 5) -# define DVAL_LOOKAHEAD DL_MIN_LEN - -#elif (LZO_HASH == LZO_HASH_LZO_INCREMENTAL_B) -# define __LZO_HASH_INCREMENTAL -# define DVAL_FIRST(dv,p) dv = _DV_B((p),5) -# define DVAL_NEXT(dv,p) \ - dv ^= p[-1]; dv = (((dv) >> 5) ^ ((lzo_uint32)(p[2]) << (2*5))) -# define _DINDEX(dv,p) ((0x9f5f * (dv)) >> 5) -# define DVAL_LOOKAHEAD DL_MIN_LEN - -#else -# error "choose a hashing strategy" -#endif - -#ifndef DINDEX -#define DINDEX(dv,p) ((lzo_uint)((_DINDEX(dv,p)) & DL_MASK) << DD_BITS) -#endif -#if !defined(DINDEX1) && defined(D_INDEX1) -#define DINDEX1 D_INDEX1 -#endif -#if !defined(DINDEX2) && defined(D_INDEX2) -#define DINDEX2 D_INDEX2 -#endif - -#if !defined(__LZO_HASH_INCREMENTAL) -# define DVAL_FIRST(dv,p) ((void) 0) -# define DVAL_NEXT(dv,p) ((void) 0) -# define DVAL_LOOKAHEAD 0 -#endif - -#if !defined(DVAL_ASSERT) -#if defined(__LZO_HASH_INCREMENTAL) && !defined(NDEBUG) -static void DVAL_ASSERT(lzo_uint32 dv, const lzo_byte *p) -{ - lzo_uint32 df; - DVAL_FIRST(df,(p)); - assert(DINDEX(dv,p) == DINDEX(df,p)); -} -#else -# define DVAL_ASSERT(dv,p) ((void) 0) -#endif -#endif - -#if defined(LZO_DICT_USE_PTR) -# define DENTRY(p,in) (p) -# define GINDEX(m_pos,m_off,dict,dindex,in) m_pos = dict[dindex] -#else -# define DENTRY(p,in) ((lzo_uint) ((p)-(in))) -# define GINDEX(m_pos,m_off,dict,dindex,in) m_off = dict[dindex] -#endif - -#if (DD_BITS == 0) - -# define UPDATE_D(dict,drun,dv,p,in) dict[ DINDEX(dv,p) ] = DENTRY(p,in) -# define UPDATE_I(dict,drun,index,p,in) dict[index] = DENTRY(p,in) -# define UPDATE_P(ptr,drun,p,in) (ptr)[0] = DENTRY(p,in) - -#else - -# define UPDATE_D(dict,drun,dv,p,in) \ - dict[ DINDEX(dv,p) + drun++ ] = DENTRY(p,in); drun &= DD_MASK -# define UPDATE_I(dict,drun,index,p,in) \ - dict[ (index) + drun++ ] = DENTRY(p,in); drun &= DD_MASK -# define UPDATE_P(ptr,drun,p,in) \ - (ptr) [ drun++ ] = DENTRY(p,in); drun &= DD_MASK - -#endif - -#if defined(LZO_DICT_USE_PTR) - -#define LZO_CHECK_MPOS_DET(m_pos,m_off,in,ip,max_offset) \ - (m_pos == NULL || (m_off = (lzo_moff_t) (ip - m_pos)) > max_offset) - -#define LZO_CHECK_MPOS_NON_DET(m_pos,m_off,in,ip,max_offset) \ - (BOUNDS_CHECKING_OFF_IN_EXPR( \ - (PTR_LT(m_pos,in) || \ - (m_off = (lzo_moff_t) PTR_DIFF(ip,m_pos)) <= 0 || \ - m_off > max_offset) )) - -#else - -#define LZO_CHECK_MPOS_DET(m_pos,m_off,in,ip,max_offset) \ - (m_off == 0 || \ - ((m_off = (lzo_moff_t) ((ip)-(in)) - m_off) > max_offset) || \ - (m_pos = (ip) - (m_off), 0) ) - -#define LZO_CHECK_MPOS_NON_DET(m_pos,m_off,in,ip,max_offset) \ - ((lzo_moff_t) ((ip)-(in)) <= m_off || \ - ((m_off = (lzo_moff_t) ((ip)-(in)) - m_off) > max_offset) || \ - (m_pos = (ip) - (m_off), 0) ) - -#endif - -#if defined(LZO_DETERMINISTIC) -# define LZO_CHECK_MPOS LZO_CHECK_MPOS_DET -#else -# define LZO_CHECK_MPOS LZO_CHECK_MPOS_NON_DET -#endif - -#ifdef __cplusplus -} -#endif - -#endif - -#endif - -#endif - -#define DO_COMPRESS lzo1x_1_compress - -static -lzo_uint do_compress ( const lzo_byte *in , lzo_uint in_len, - lzo_byte *out, lzo_uintp out_len, - lzo_voidp wrkmem ) -{ -#if 0 && defined(__GNUC__) && defined(__i386__) - register const lzo_byte *ip __asm__("%esi"); -#else - register const lzo_byte *ip; -#endif - lzo_byte *op; - const lzo_byte * const in_end = in + in_len; - const lzo_byte * const ip_end = in + in_len - M2_MAX_LEN - 5; - const lzo_byte *ii; - lzo_dict_p const dict = (lzo_dict_p) wrkmem; - - op = out; - ip = in; - ii = ip; - - ip += 4; - for (;;) - { -#if 0 && defined(__GNUC__) && defined(__i386__) - register const lzo_byte *m_pos __asm__("%edi"); -#else - register const lzo_byte *m_pos; -#endif - lzo_moff_t m_off; - lzo_uint m_len; - lzo_uint dindex; - - DINDEX1(dindex,ip); - GINDEX(m_pos,m_off,dict,dindex,in); - if (LZO_CHECK_MPOS_NON_DET(m_pos,m_off,in,ip,M4_MAX_OFFSET)) - goto literal; -#if 1 - if (m_off <= M2_MAX_OFFSET || m_pos[3] == ip[3]) - goto try_match; - DINDEX2(dindex,ip); -#endif - GINDEX(m_pos,m_off,dict,dindex,in); - if (LZO_CHECK_MPOS_NON_DET(m_pos,m_off,in,ip,M4_MAX_OFFSET)) - goto literal; - if (m_off <= M2_MAX_OFFSET || m_pos[3] == ip[3]) - goto try_match; - goto literal; - -try_match: -#if 1 && defined(LZO_UNALIGNED_OK_2) - if (* (const lzo_ushortp) m_pos != * (const lzo_ushortp) ip) -#else - if (m_pos[0] != ip[0] || m_pos[1] != ip[1]) -#endif - { - } - else - { - if (m_pos[2] == ip[2]) - { -#if 0 - if (m_off <= M2_MAX_OFFSET) - goto match; - if (lit <= 3) - goto match; - if (lit == 3) - { - assert(op - 2 > out); op[-2] |= LZO_BYTE(3); - *op++ = *ii++; *op++ = *ii++; *op++ = *ii++; - goto code_match; - } - if (m_pos[3] == ip[3]) -#endif - goto match; - } - else - { -#if 0 -#if 0 - if (m_off <= M1_MAX_OFFSET && lit > 0 && lit <= 3) -#else - if (m_off <= M1_MAX_OFFSET && lit == 3) -#endif - { - register lzo_uint t; - - t = lit; - assert(op - 2 > out); op[-2] |= LZO_BYTE(t); - do *op++ = *ii++; while (--t > 0); - assert(ii == ip); - m_off -= 1; - *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); - *op++ = LZO_BYTE(m_off >> 2); - ip += 2; - goto match_done; - } -#endif - } - } - -literal: - UPDATE_I(dict,0,dindex,ip,in); - ++ip; - if (ip >= ip_end) - break; - continue; - -match: - UPDATE_I(dict,0,dindex,ip,in); - if (pd(ip,ii) > 0) - { - register lzo_uint t = pd(ip,ii); - - if (t <= 3) - { - assert(op - 2 > out); - op[-2] |= LZO_BYTE(t); - } - else if (t <= 18) - *op++ = LZO_BYTE(t - 3); - else - { - register lzo_uint tt = t - 18; - - *op++ = 0; - while (tt > 255) - { - tt -= 255; - *op++ = 0; - } - assert(tt > 0); - *op++ = LZO_BYTE(tt); - } - do *op++ = *ii++; while (--t > 0); - } - - assert(ii == ip); - ip += 3; - if (m_pos[3] != *ip++ || m_pos[4] != *ip++ || m_pos[5] != *ip++ || - m_pos[6] != *ip++ || m_pos[7] != *ip++ || m_pos[8] != *ip++ -#ifdef LZO1Y - || m_pos[ 9] != *ip++ || m_pos[10] != *ip++ || m_pos[11] != *ip++ - || m_pos[12] != *ip++ || m_pos[13] != *ip++ || m_pos[14] != *ip++ -#endif - ) - { - --ip; - m_len = ip - ii; - assert(m_len >= 3); assert(m_len <= M2_MAX_LEN); - - if (m_off <= M2_MAX_OFFSET) - { - m_off -= 1; -#if defined(LZO1X) - *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2)); - *op++ = LZO_BYTE(m_off >> 3); -#elif defined(LZO1Y) - *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2)); - *op++ = LZO_BYTE(m_off >> 2); -#endif - } - else if (m_off <= M3_MAX_OFFSET) - { - m_off -= 1; - *op++ = LZO_BYTE(M3_MARKER | (m_len - 2)); - goto m3_m4_offset; - } - else -#if defined(LZO1X) - { - m_off -= 0x4000; - assert(m_off > 0); assert(m_off <= 0x7fff); - *op++ = LZO_BYTE(M4_MARKER | - ((m_off & 0x4000) >> 11) | (m_len - 2)); - goto m3_m4_offset; - } -#elif defined(LZO1Y) - goto m4_match; -#endif - } - else - { - { - const lzo_byte *end = in_end; - const lzo_byte *m = m_pos + M2_MAX_LEN + 1; - while (ip < end && *m == *ip) - m++, ip++; - m_len = (ip - ii); - } - assert(m_len > M2_MAX_LEN); - - if (m_off <= M3_MAX_OFFSET) - { - m_off -= 1; - if (m_len <= 33) - *op++ = LZO_BYTE(M3_MARKER | (m_len - 2)); - else - { - m_len -= 33; - *op++ = M3_MARKER | 0; - goto m3_m4_len; - } - } - else - { -#if defined(LZO1Y) -m4_match: -#endif - m_off -= 0x4000; - assert(m_off > 0); assert(m_off <= 0x7fff); - if (m_len <= M4_MAX_LEN) - *op++ = LZO_BYTE(M4_MARKER | - ((m_off & 0x4000) >> 11) | (m_len - 2)); - else - { - m_len -= M4_MAX_LEN; - *op++ = LZO_BYTE(M4_MARKER | ((m_off & 0x4000) >> 11)); -m3_m4_len: - while (m_len > 255) - { - m_len -= 255; - *op++ = 0; - } - assert(m_len > 0); - *op++ = LZO_BYTE(m_len); - } - } - -m3_m4_offset: - *op++ = LZO_BYTE((m_off & 63) << 2); - *op++ = LZO_BYTE(m_off >> 6); - } - -#if 0 -match_done: -#endif - ii = ip; - if (ip >= ip_end) - break; - } - - *out_len = op - out; - return pd(in_end,ii); -} - -LZO_PUBLIC(int) -DO_COMPRESS ( const lzo_byte *in , lzo_uint in_len, - lzo_byte *out, lzo_uintp out_len, - lzo_voidp wrkmem ) -{ - lzo_byte *op = out; - lzo_uint t; - -#if defined(__LZO_QUERY_COMPRESS) - if (__LZO_IS_COMPRESS_QUERY(in,in_len,out,out_len,wrkmem)) - return __LZO_QUERY_COMPRESS(in,in_len,out,out_len,wrkmem,D_SIZE,lzo_sizeof(lzo_dict_t)); -#endif - - if (in_len <= M2_MAX_LEN + 5) - t = in_len; - else - { - t = do_compress(in,in_len,op,out_len,wrkmem); - op += *out_len; - } - - if (t > 0) - { - const lzo_byte *ii = in + in_len - t; - - if (op == out && t <= 238) - *op++ = LZO_BYTE(17 + t); - else if (t <= 3) - op[-2] |= LZO_BYTE(t); - else if (t <= 18) - *op++ = LZO_BYTE(t - 3); - else - { - lzo_uint tt = t - 18; - - *op++ = 0; - while (tt > 255) - { - tt -= 255; - *op++ = 0; - } - assert(tt > 0); - *op++ = LZO_BYTE(tt); - } - do *op++ = *ii++; while (--t > 0); - } - - *op++ = M4_MARKER | 1; - *op++ = 0; - *op++ = 0; - - *out_len = op - out; - return LZO_E_OK; -} - -#undef do_compress -#undef DO_COMPRESS -#undef LZO_HASH - -#undef LZO_TEST_DECOMPRESS_OVERRUN -#undef LZO_TEST_DECOMPRESS_OVERRUN_INPUT -#undef LZO_TEST_DECOMPRESS_OVERRUN_OUTPUT -#undef LZO_TEST_DECOMPRESS_OVERRUN_LOOKBEHIND -#undef DO_DECOMPRESS -#define DO_DECOMPRESS lzo1x_decompress - -#if defined(LZO_TEST_DECOMPRESS_OVERRUN) -# if !defined(LZO_TEST_DECOMPRESS_OVERRUN_INPUT) -# define LZO_TEST_DECOMPRESS_OVERRUN_INPUT 2 -# endif -# if !defined(LZO_TEST_DECOMPRESS_OVERRUN_OUTPUT) -# define LZO_TEST_DECOMPRESS_OVERRUN_OUTPUT 2 -# endif -# if !defined(LZO_TEST_DECOMPRESS_OVERRUN_LOOKBEHIND) -# define LZO_TEST_DECOMPRESS_OVERRUN_LOOKBEHIND -# endif -#endif - -#undef TEST_IP -#undef TEST_OP -#undef TEST_LOOKBEHIND -#undef NEED_IP -#undef NEED_OP -#undef HAVE_TEST_IP -#undef HAVE_TEST_OP -#undef HAVE_NEED_IP -#undef HAVE_NEED_OP -#undef HAVE_ANY_IP -#undef HAVE_ANY_OP - -#if defined(LZO_TEST_DECOMPRESS_OVERRUN_INPUT) -# if (LZO_TEST_DECOMPRESS_OVERRUN_INPUT >= 1) -# define TEST_IP (ip < ip_end) -# endif -# if (LZO_TEST_DECOMPRESS_OVERRUN_INPUT >= 2) -# define NEED_IP(x) \ - if ((lzo_uint)(ip_end - ip) < (lzo_uint)(x)) goto input_overrun -# endif -#endif - -#if defined(LZO_TEST_DECOMPRESS_OVERRUN_OUTPUT) -# if (LZO_TEST_DECOMPRESS_OVERRUN_OUTPUT >= 1) -# define TEST_OP (op <= op_end) -# endif -# if (LZO_TEST_DECOMPRESS_OVERRUN_OUTPUT >= 2) -# undef TEST_OP -# define NEED_OP(x) \ - if ((lzo_uint)(op_end - op) < (lzo_uint)(x)) goto output_overrun -# endif -#endif - -#if defined(LZO_TEST_DECOMPRESS_OVERRUN_LOOKBEHIND) -# define TEST_LOOKBEHIND(m_pos,out) if (m_pos < out) goto lookbehind_overrun -#else -# define TEST_LOOKBEHIND(m_pos,op) ((void) 0) -#endif - -#if !defined(LZO_EOF_CODE) && !defined(TEST_IP) -# define TEST_IP (ip < ip_end) -#endif - -#if defined(TEST_IP) -# define HAVE_TEST_IP -#else -# define TEST_IP 1 -#endif -#if defined(TEST_OP) -# define HAVE_TEST_OP -#else -# define TEST_OP 1 -#endif - -#if defined(NEED_IP) -# define HAVE_NEED_IP -#else -# define NEED_IP(x) ((void) 0) -#endif -#if defined(NEED_OP) -# define HAVE_NEED_OP -#else -# define NEED_OP(x) ((void) 0) -#endif - -#if defined(HAVE_TEST_IP) || defined(HAVE_NEED_IP) -# define HAVE_ANY_IP -#endif -#if defined(HAVE_TEST_OP) || defined(HAVE_NEED_OP) -# define HAVE_ANY_OP -#endif - -#undef __COPY4 -#define __COPY4(dst,src) * (lzo_uint32p)(dst) = * (const lzo_uint32p)(src) - -#undef COPY4 -#if defined(LZO_UNALIGNED_OK_4) -# define COPY4(dst,src) __COPY4(dst,src) -#elif defined(LZO_ALIGNED_OK_4) -# define COPY4(dst,src) __COPY4((lzo_ptr_t)(dst),(lzo_ptr_t)(src)) -#endif - -#if defined(DO_DECOMPRESS) -LZO_PUBLIC(int) -DO_DECOMPRESS ( const lzo_byte *in , lzo_uint in_len, - lzo_byte *out, lzo_uintp out_len, - lzo_voidp wrkmem ) -#endif -{ - register lzo_byte *op; - register const lzo_byte *ip; - register lzo_uint t; -#if defined(COPY_DICT) - lzo_uint m_off; - const lzo_byte *dict_end; -#else - register const lzo_byte *m_pos; -#endif - - const lzo_byte * const ip_end = in + in_len; -#if defined(HAVE_ANY_OP) - lzo_byte * const op_end = out + *out_len; -#endif -#if defined(LZO1Z) - lzo_uint last_m_off = 0; -#endif - - LZO_UNUSED(wrkmem); - -#if defined(__LZO_QUERY_DECOMPRESS) - if (__LZO_IS_DECOMPRESS_QUERY(in,in_len,out,out_len,wrkmem)) - return __LZO_QUERY_DECOMPRESS(in,in_len,out,out_len,wrkmem,0,0); -#endif - -#if defined(COPY_DICT) - if (dict) - { - if (dict_len > M4_MAX_OFFSET) - { - dict += dict_len - M4_MAX_OFFSET; - dict_len = M4_MAX_OFFSET; - } - dict_end = dict + dict_len; - } - else - { - dict_len = 0; - dict_end = NULL; - } -#endif - - *out_len = 0; - - op = out; - ip = in; - - if (*ip > 17) - { - t = *ip++ - 17; - if (t < 4) - goto match_next; - assert(t > 0); NEED_OP(t); NEED_IP(t+1); - do *op++ = *ip++; while (--t > 0); - goto first_literal_run; - } - - while (TEST_IP && TEST_OP) - { - t = *ip++; - if (t >= 16) - goto match; - if (t == 0) - { - NEED_IP(1); - while (*ip == 0) - { - t += 255; - ip++; - NEED_IP(1); - } - t += 15 + *ip++; - } - assert(t > 0); NEED_OP(t+3); NEED_IP(t+4); -#if defined(LZO_UNALIGNED_OK_4) || defined(LZO_ALIGNED_OK_4) -#if !defined(LZO_UNALIGNED_OK_4) - if (PTR_ALIGNED2_4(op,ip)) - { -#endif - COPY4(op,ip); - op += 4; ip += 4; - if (--t > 0) - { - if (t >= 4) - { - do { - COPY4(op,ip); - op += 4; ip += 4; t -= 4; - } while (t >= 4); - if (t > 0) do *op++ = *ip++; while (--t > 0); - } - else - do *op++ = *ip++; while (--t > 0); - } -#if !defined(LZO_UNALIGNED_OK_4) - } - else -#endif -#endif -#if !defined(LZO_UNALIGNED_OK_4) - { - *op++ = *ip++; *op++ = *ip++; *op++ = *ip++; - do *op++ = *ip++; while (--t > 0); - } -#endif - -first_literal_run: - - t = *ip++; - if (t >= 16) - goto match; -#if defined(COPY_DICT) -#if defined(LZO1Z) - m_off = (1 + M2_MAX_OFFSET) + (t << 6) + (*ip++ >> 2); - last_m_off = m_off; -#else - m_off = (1 + M2_MAX_OFFSET) + (t >> 2) + (*ip++ << 2); -#endif - NEED_OP(3); - t = 3; COPY_DICT(t,m_off) -#else -#if defined(LZO1Z) - t = (1 + M2_MAX_OFFSET) + (t << 6) + (*ip++ >> 2); - m_pos = op - t; - last_m_off = t; -#else - m_pos = op - (1 + M2_MAX_OFFSET); - m_pos -= t >> 2; - m_pos -= *ip++ << 2; -#endif - TEST_LOOKBEHIND(m_pos,out); NEED_OP(3); - *op++ = *m_pos++; *op++ = *m_pos++; *op++ = *m_pos; -#endif - goto match_done; - - while (TEST_IP && TEST_OP) - { -match: - if (t >= 64) - { -#if defined(COPY_DICT) -#if defined(LZO1X) - m_off = 1 + ((t >> 2) & 7) + (*ip++ << 3); - t = (t >> 5) - 1; -#elif defined(LZO1Y) - m_off = 1 + ((t >> 2) & 3) + (*ip++ << 2); - t = (t >> 4) - 3; -#elif defined(LZO1Z) - m_off = t & 0x1f; - if (m_off >= 0x1c) - m_off = last_m_off; - else - { - m_off = 1 + (m_off << 6) + (*ip++ >> 2); - last_m_off = m_off; - } - t = (t >> 5) - 1; -#endif -#else -#if defined(LZO1X) - m_pos = op - 1; - m_pos -= (t >> 2) & 7; - m_pos -= *ip++ << 3; - t = (t >> 5) - 1; -#elif defined(LZO1Y) - m_pos = op - 1; - m_pos -= (t >> 2) & 3; - m_pos -= *ip++ << 2; - t = (t >> 4) - 3; -#elif defined(LZO1Z) - { - lzo_uint off = t & 0x1f; - m_pos = op; - if (off >= 0x1c) - { - assert(last_m_off > 0); - m_pos -= last_m_off; - } - else - { - off = 1 + (off << 6) + (*ip++ >> 2); - m_pos -= off; - last_m_off = off; - } - } - t = (t >> 5) - 1; -#endif - TEST_LOOKBEHIND(m_pos,out); assert(t > 0); NEED_OP(t+3-1); - goto copy_match; -#endif - } - else if (t >= 32) - { - t &= 31; - if (t == 0) - { - NEED_IP(1); - while (*ip == 0) - { - t += 255; - ip++; - NEED_IP(1); - } - t += 31 + *ip++; - } -#if defined(COPY_DICT) -#if defined(LZO1Z) - m_off = 1 + (ip[0] << 6) + (ip[1] >> 2); - last_m_off = m_off; -#else - m_off = 1 + (ip[0] >> 2) + (ip[1] << 6); -#endif -#else -#if defined(LZO1Z) - { - lzo_uint off = 1 + (ip[0] << 6) + (ip[1] >> 2); - m_pos = op - off; - last_m_off = off; - } -#elif defined(LZO_UNALIGNED_OK_2) && (LZO_BYTE_ORDER == LZO_LITTLE_ENDIAN) - m_pos = op - 1; - m_pos -= (* (const lzo_ushortp) ip) >> 2; -#else - m_pos = op - 1; - m_pos -= (ip[0] >> 2) + (ip[1] << 6); -#endif -#endif - ip += 2; - } - else if (t >= 16) - { -#if defined(COPY_DICT) - m_off = (t & 8) << 11; -#else - m_pos = op; - m_pos -= (t & 8) << 11; -#endif - t &= 7; - if (t == 0) - { - NEED_IP(1); - while (*ip == 0) - { - t += 255; - ip++; - NEED_IP(1); - } - t += 7 + *ip++; - } -#if defined(COPY_DICT) -#if defined(LZO1Z) - m_off += (ip[0] << 6) + (ip[1] >> 2); -#else - m_off += (ip[0] >> 2) + (ip[1] << 6); -#endif - ip += 2; - if (m_off == 0) - goto eof_found; - m_off += 0x4000; -#if defined(LZO1Z) - last_m_off = m_off; -#endif -#else -#if defined(LZO1Z) - m_pos -= (ip[0] << 6) + (ip[1] >> 2); -#elif defined(LZO_UNALIGNED_OK_2) && (LZO_BYTE_ORDER == LZO_LITTLE_ENDIAN) - m_pos -= (* (const lzo_ushortp) ip) >> 2; -#else - m_pos -= (ip[0] >> 2) + (ip[1] << 6); -#endif - ip += 2; - if (m_pos == op) - goto eof_found; - m_pos -= 0x4000; -#if defined(LZO1Z) - last_m_off = op - m_pos; -#endif -#endif - } - else - { -#if defined(COPY_DICT) -#if defined(LZO1Z) - m_off = 1 + (t << 6) + (*ip++ >> 2); - last_m_off = m_off; -#else - m_off = 1 + (t >> 2) + (*ip++ << 2); -#endif - NEED_OP(2); - t = 2; COPY_DICT(t,m_off) -#else -#if defined(LZO1Z) - t = 1 + (t << 6) + (*ip++ >> 2); - m_pos = op - t; - last_m_off = t; -#else - m_pos = op - 1; - m_pos -= t >> 2; - m_pos -= *ip++ << 2; -#endif - TEST_LOOKBEHIND(m_pos,out); NEED_OP(2); - *op++ = *m_pos++; *op++ = *m_pos; -#endif - goto match_done; - } - -#if defined(COPY_DICT) - - NEED_OP(t+3-1); - t += 3-1; COPY_DICT(t,m_off) - -#else - - TEST_LOOKBEHIND(m_pos,out); assert(t > 0); NEED_OP(t+3-1); -#if defined(LZO_UNALIGNED_OK_4) || defined(LZO_ALIGNED_OK_4) -#if !defined(LZO_UNALIGNED_OK_4) - if (t >= 2 * 4 - (3 - 1) && PTR_ALIGNED2_4(op,m_pos)) - { - assert((op - m_pos) >= 4); -#else - if (t >= 2 * 4 - (3 - 1) && (op - m_pos) >= 4) - { -#endif - COPY4(op,m_pos); - op += 4; m_pos += 4; t -= 4 - (3 - 1); - do { - COPY4(op,m_pos); - op += 4; m_pos += 4; t -= 4; - } while (t >= 4); - if (t > 0) do *op++ = *m_pos++; while (--t > 0); - } - else -#endif - { -copy_match: - *op++ = *m_pos++; *op++ = *m_pos++; - do *op++ = *m_pos++; while (--t > 0); - } - -#endif - -match_done: -#if defined(LZO1Z) - t = ip[-1] & 3; -#else - t = ip[-2] & 3; -#endif - if (t == 0) - break; - -match_next: - assert(t > 0); NEED_OP(t); NEED_IP(t+1); - do *op++ = *ip++; while (--t > 0); - t = *ip++; - } - } - -#if defined(HAVE_TEST_IP) || defined(HAVE_TEST_OP) - *out_len = op - out; - return LZO_E_EOF_NOT_FOUND; -#endif - -eof_found: - assert(t == 1); - *out_len = op - out; - return (ip == ip_end ? LZO_E_OK : - (ip < ip_end ? LZO_E_INPUT_NOT_CONSUMED : LZO_E_INPUT_OVERRUN)); - -#if defined(HAVE_NEED_IP) -input_overrun: - *out_len = op - out; - return LZO_E_INPUT_OVERRUN; -#endif - -#if defined(HAVE_NEED_OP) -output_overrun: - *out_len = op - out; - return LZO_E_OUTPUT_OVERRUN; -#endif - -#if defined(LZO_TEST_DECOMPRESS_OVERRUN_LOOKBEHIND) -lookbehind_overrun: - *out_len = op - out; - return LZO_E_LOOKBEHIND_OVERRUN; -#endif -} - -#define LZO_TEST_DECOMPRESS_OVERRUN -#undef DO_DECOMPRESS -#define DO_DECOMPRESS lzo1x_decompress_safe - -#if defined(LZO_TEST_DECOMPRESS_OVERRUN) -# if !defined(LZO_TEST_DECOMPRESS_OVERRUN_INPUT) -# define LZO_TEST_DECOMPRESS_OVERRUN_INPUT 2 -# endif -# if !defined(LZO_TEST_DECOMPRESS_OVERRUN_OUTPUT) -# define LZO_TEST_DECOMPRESS_OVERRUN_OUTPUT 2 -# endif -# if !defined(LZO_TEST_DECOMPRESS_OVERRUN_LOOKBEHIND) -# define LZO_TEST_DECOMPRESS_OVERRUN_LOOKBEHIND -# endif -#endif - -#undef TEST_IP -#undef TEST_OP -#undef TEST_LOOKBEHIND -#undef NEED_IP -#undef NEED_OP -#undef HAVE_TEST_IP -#undef HAVE_TEST_OP -#undef HAVE_NEED_IP -#undef HAVE_NEED_OP -#undef HAVE_ANY_IP -#undef HAVE_ANY_OP - -#if defined(LZO_TEST_DECOMPRESS_OVERRUN_INPUT) -# if (LZO_TEST_DECOMPRESS_OVERRUN_INPUT >= 1) -# define TEST_IP (ip < ip_end) -# endif -# if (LZO_TEST_DECOMPRESS_OVERRUN_INPUT >= 2) -# define NEED_IP(x) \ - if ((lzo_uint)(ip_end - ip) < (lzo_uint)(x)) goto input_overrun -# endif -#endif - -#if defined(LZO_TEST_DECOMPRESS_OVERRUN_OUTPUT) -# if (LZO_TEST_DECOMPRESS_OVERRUN_OUTPUT >= 1) -# define TEST_OP (op <= op_end) -# endif -# if (LZO_TEST_DECOMPRESS_OVERRUN_OUTPUT >= 2) -# undef TEST_OP -# define NEED_OP(x) \ - if ((lzo_uint)(op_end - op) < (lzo_uint)(x)) goto output_overrun -# endif -#endif - -#if defined(LZO_TEST_DECOMPRESS_OVERRUN_LOOKBEHIND) -# define TEST_LOOKBEHIND(m_pos,out) if (m_pos < out) goto lookbehind_overrun -#else -# define TEST_LOOKBEHIND(m_pos,op) ((void) 0) -#endif - -#if !defined(LZO_EOF_CODE) && !defined(TEST_IP) -# define TEST_IP (ip < ip_end) -#endif - -#if defined(TEST_IP) -# define HAVE_TEST_IP -#else -# define TEST_IP 1 -#endif -#if defined(TEST_OP) -# define HAVE_TEST_OP -#else -# define TEST_OP 1 -#endif - -#if defined(NEED_IP) -# define HAVE_NEED_IP -#else -# define NEED_IP(x) ((void) 0) -#endif -#if defined(NEED_OP) -# define HAVE_NEED_OP -#else -# define NEED_OP(x) ((void) 0) -#endif - -#if defined(HAVE_TEST_IP) || defined(HAVE_NEED_IP) -# define HAVE_ANY_IP -#endif -#if defined(HAVE_TEST_OP) || defined(HAVE_NEED_OP) -# define HAVE_ANY_OP -#endif - -#undef __COPY4 -#define __COPY4(dst,src) * (lzo_uint32p)(dst) = * (const lzo_uint32p)(src) - -#undef COPY4 -#if defined(LZO_UNALIGNED_OK_4) -# define COPY4(dst,src) __COPY4(dst,src) -#elif defined(LZO_ALIGNED_OK_4) -# define COPY4(dst,src) __COPY4((lzo_ptr_t)(dst),(lzo_ptr_t)(src)) -#endif - -#if defined(DO_DECOMPRESS) -LZO_PUBLIC(int) -DO_DECOMPRESS ( const lzo_byte *in , lzo_uint in_len, - lzo_byte *out, lzo_uintp out_len, - lzo_voidp wrkmem ) -#endif -{ - register lzo_byte *op; - register const lzo_byte *ip; - register lzo_uint t; -#if defined(COPY_DICT) - lzo_uint m_off; - const lzo_byte *dict_end; -#else - register const lzo_byte *m_pos; -#endif - - const lzo_byte * const ip_end = in + in_len; -#if defined(HAVE_ANY_OP) - lzo_byte * const op_end = out + *out_len; -#endif -#if defined(LZO1Z) - lzo_uint last_m_off = 0; -#endif - - LZO_UNUSED(wrkmem); - -#if defined(__LZO_QUERY_DECOMPRESS) - if (__LZO_IS_DECOMPRESS_QUERY(in,in_len,out,out_len,wrkmem)) - return __LZO_QUERY_DECOMPRESS(in,in_len,out,out_len,wrkmem,0,0); -#endif - -#if defined(COPY_DICT) - if (dict) - { - if (dict_len > M4_MAX_OFFSET) - { - dict += dict_len - M4_MAX_OFFSET; - dict_len = M4_MAX_OFFSET; - } - dict_end = dict + dict_len; - } - else - { - dict_len = 0; - dict_end = NULL; - } -#endif - - *out_len = 0; - - op = out; - ip = in; - - if (*ip > 17) - { - t = *ip++ - 17; - if (t < 4) - goto match_next; - assert(t > 0); NEED_OP(t); NEED_IP(t+1); - do *op++ = *ip++; while (--t > 0); - goto first_literal_run; - } - - while (TEST_IP && TEST_OP) - { - t = *ip++; - if (t >= 16) - goto match; - if (t == 0) - { - NEED_IP(1); - while (*ip == 0) - { - t += 255; - ip++; - NEED_IP(1); - } - t += 15 + *ip++; - } - assert(t > 0); NEED_OP(t+3); NEED_IP(t+4); -#if defined(LZO_UNALIGNED_OK_4) || defined(LZO_ALIGNED_OK_4) -#if !defined(LZO_UNALIGNED_OK_4) - if (PTR_ALIGNED2_4(op,ip)) - { -#endif - COPY4(op,ip); - op += 4; ip += 4; - if (--t > 0) - { - if (t >= 4) - { - do { - COPY4(op,ip); - op += 4; ip += 4; t -= 4; - } while (t >= 4); - if (t > 0) do *op++ = *ip++; while (--t > 0); - } - else - do *op++ = *ip++; while (--t > 0); - } -#if !defined(LZO_UNALIGNED_OK_4) - } - else -#endif -#endif -#if !defined(LZO_UNALIGNED_OK_4) - { - *op++ = *ip++; *op++ = *ip++; *op++ = *ip++; - do *op++ = *ip++; while (--t > 0); - } -#endif - -first_literal_run: - - t = *ip++; - if (t >= 16) - goto match; -#if defined(COPY_DICT) -#if defined(LZO1Z) - m_off = (1 + M2_MAX_OFFSET) + (t << 6) + (*ip++ >> 2); - last_m_off = m_off; -#else - m_off = (1 + M2_MAX_OFFSET) + (t >> 2) + (*ip++ << 2); -#endif - NEED_OP(3); - t = 3; COPY_DICT(t,m_off) -#else -#if defined(LZO1Z) - t = (1 + M2_MAX_OFFSET) + (t << 6) + (*ip++ >> 2); - m_pos = op - t; - last_m_off = t; -#else - m_pos = op - (1 + M2_MAX_OFFSET); - m_pos -= t >> 2; - m_pos -= *ip++ << 2; -#endif - TEST_LOOKBEHIND(m_pos,out); NEED_OP(3); - *op++ = *m_pos++; *op++ = *m_pos++; *op++ = *m_pos; -#endif - goto match_done; - - while (TEST_IP && TEST_OP) - { -match: - if (t >= 64) - { -#if defined(COPY_DICT) -#if defined(LZO1X) - m_off = 1 + ((t >> 2) & 7) + (*ip++ << 3); - t = (t >> 5) - 1; -#elif defined(LZO1Y) - m_off = 1 + ((t >> 2) & 3) + (*ip++ << 2); - t = (t >> 4) - 3; -#elif defined(LZO1Z) - m_off = t & 0x1f; - if (m_off >= 0x1c) - m_off = last_m_off; - else - { - m_off = 1 + (m_off << 6) + (*ip++ >> 2); - last_m_off = m_off; - } - t = (t >> 5) - 1; -#endif -#else -#if defined(LZO1X) - m_pos = op - 1; - m_pos -= (t >> 2) & 7; - m_pos -= *ip++ << 3; - t = (t >> 5) - 1; -#elif defined(LZO1Y) - m_pos = op - 1; - m_pos -= (t >> 2) & 3; - m_pos -= *ip++ << 2; - t = (t >> 4) - 3; -#elif defined(LZO1Z) - { - lzo_uint off = t & 0x1f; - m_pos = op; - if (off >= 0x1c) - { - assert(last_m_off > 0); - m_pos -= last_m_off; - } - else - { - off = 1 + (off << 6) + (*ip++ >> 2); - m_pos -= off; - last_m_off = off; - } - } - t = (t >> 5) - 1; -#endif - TEST_LOOKBEHIND(m_pos,out); assert(t > 0); NEED_OP(t+3-1); - goto copy_match; -#endif - } - else if (t >= 32) - { - t &= 31; - if (t == 0) - { - NEED_IP(1); - while (*ip == 0) - { - t += 255; - ip++; - NEED_IP(1); - } - t += 31 + *ip++; - } -#if defined(COPY_DICT) -#if defined(LZO1Z) - m_off = 1 + (ip[0] << 6) + (ip[1] >> 2); - last_m_off = m_off; -#else - m_off = 1 + (ip[0] >> 2) + (ip[1] << 6); -#endif -#else -#if defined(LZO1Z) - { - lzo_uint off = 1 + (ip[0] << 6) + (ip[1] >> 2); - m_pos = op - off; - last_m_off = off; - } -#elif defined(LZO_UNALIGNED_OK_2) && (LZO_BYTE_ORDER == LZO_LITTLE_ENDIAN) - m_pos = op - 1; - m_pos -= (* (const lzo_ushortp) ip) >> 2; -#else - m_pos = op - 1; - m_pos -= (ip[0] >> 2) + (ip[1] << 6); -#endif -#endif - ip += 2; - } - else if (t >= 16) - { -#if defined(COPY_DICT) - m_off = (t & 8) << 11; -#else - m_pos = op; - m_pos -= (t & 8) << 11; -#endif - t &= 7; - if (t == 0) - { - NEED_IP(1); - while (*ip == 0) - { - t += 255; - ip++; - NEED_IP(1); - } - t += 7 + *ip++; - } -#if defined(COPY_DICT) -#if defined(LZO1Z) - m_off += (ip[0] << 6) + (ip[1] >> 2); -#else - m_off += (ip[0] >> 2) + (ip[1] << 6); -#endif - ip += 2; - if (m_off == 0) - goto eof_found; - m_off += 0x4000; -#if defined(LZO1Z) - last_m_off = m_off; -#endif -#else -#if defined(LZO1Z) - m_pos -= (ip[0] << 6) + (ip[1] >> 2); -#elif defined(LZO_UNALIGNED_OK_2) && (LZO_BYTE_ORDER == LZO_LITTLE_ENDIAN) - m_pos -= (* (const lzo_ushortp) ip) >> 2; -#else - m_pos -= (ip[0] >> 2) + (ip[1] << 6); -#endif - ip += 2; - if (m_pos == op) - goto eof_found; - m_pos -= 0x4000; -#if defined(LZO1Z) - last_m_off = op - m_pos; -#endif -#endif - } - else - { -#if defined(COPY_DICT) -#if defined(LZO1Z) - m_off = 1 + (t << 6) + (*ip++ >> 2); - last_m_off = m_off; -#else - m_off = 1 + (t >> 2) + (*ip++ << 2); -#endif - NEED_OP(2); - t = 2; COPY_DICT(t,m_off) -#else -#if defined(LZO1Z) - t = 1 + (t << 6) + (*ip++ >> 2); - m_pos = op - t; - last_m_off = t; -#else - m_pos = op - 1; - m_pos -= t >> 2; - m_pos -= *ip++ << 2; -#endif - TEST_LOOKBEHIND(m_pos,out); NEED_OP(2); - *op++ = *m_pos++; *op++ = *m_pos; -#endif - goto match_done; - } - -#if defined(COPY_DICT) - - NEED_OP(t+3-1); - t += 3-1; COPY_DICT(t,m_off) - -#else - - TEST_LOOKBEHIND(m_pos,out); assert(t > 0); NEED_OP(t+3-1); -#if defined(LZO_UNALIGNED_OK_4) || defined(LZO_ALIGNED_OK_4) -#if !defined(LZO_UNALIGNED_OK_4) - if (t >= 2 * 4 - (3 - 1) && PTR_ALIGNED2_4(op,m_pos)) - { - assert((op - m_pos) >= 4); -#else - if (t >= 2 * 4 - (3 - 1) && (op - m_pos) >= 4) - { -#endif - COPY4(op,m_pos); - op += 4; m_pos += 4; t -= 4 - (3 - 1); - do { - COPY4(op,m_pos); - op += 4; m_pos += 4; t -= 4; - } while (t >= 4); - if (t > 0) do *op++ = *m_pos++; while (--t > 0); - } - else -#endif - { -copy_match: - *op++ = *m_pos++; *op++ = *m_pos++; - do *op++ = *m_pos++; while (--t > 0); - } - -#endif - -match_done: -#if defined(LZO1Z) - t = ip[-1] & 3; -#else - t = ip[-2] & 3; -#endif - if (t == 0) - break; - -match_next: - assert(t > 0); NEED_OP(t); NEED_IP(t+1); - do *op++ = *ip++; while (--t > 0); - t = *ip++; - } - } - -#if defined(HAVE_TEST_IP) || defined(HAVE_TEST_OP) - *out_len = op - out; - return LZO_E_EOF_NOT_FOUND; -#endif - -eof_found: - assert(t == 1); - *out_len = op - out; - return (ip == ip_end ? LZO_E_OK : - (ip < ip_end ? LZO_E_INPUT_NOT_CONSUMED : LZO_E_INPUT_OVERRUN)); - -#if defined(HAVE_NEED_IP) -input_overrun: - *out_len = op - out; - return LZO_E_INPUT_OVERRUN; -#endif - -#if defined(HAVE_NEED_OP) -output_overrun: - *out_len = op - out; - return LZO_E_OUTPUT_OVERRUN; -#endif - -#if defined(LZO_TEST_DECOMPRESS_OVERRUN_LOOKBEHIND) -lookbehind_overrun: - *out_len = op - out; - return LZO_E_LOOKBEHIND_OVERRUN; -#endif -} - -/***** End of minilzo.c *****/ - diff --git a/amxmodx/minilzo/minilzo.h b/amxmodx/minilzo/minilzo.h deleted file mode 100755 index e3270f9a..00000000 --- a/amxmodx/minilzo/minilzo.h +++ /dev/null @@ -1,100 +0,0 @@ -/* minilzo.h -- mini subset of the LZO real-time data compression library - - This file is part of the LZO real-time data compression library. - - Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer - Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer - Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer - Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer - Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer - Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer - Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer - All Rights Reserved. - - The LZO library 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. - - The LZO library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with the LZO library; see the file COPYING. - If not, write to the Free Software Foundation, Inc., - 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - Markus F.X.J. Oberhumer - - http://www.oberhumer.com/opensource/lzo/ - */ - -/* - * NOTE: - * the full LZO package can be found at - * http://www.oberhumer.com/opensource/lzo/ - */ - - -#ifndef __MINILZO_H -#define __MINILZO_H - -#define MINILZO_VERSION 0x1080 - -#ifdef __LZOCONF_H -# error "you cannot use both LZO and miniLZO" -#endif - -#undef LZO_HAVE_CONFIG_H -#include "lzoconf.h" - -#if !defined(LZO_VERSION) || (LZO_VERSION != MINILZO_VERSION) -# error "version mismatch in header files" -#endif - - -#ifdef __cplusplus -extern "C" { -#endif - - -/*********************************************************************** -// -************************************************************************/ - -/* Memory required for the wrkmem parameter. - * When the required size is 0, you can also pass a NULL pointer. - */ - -#define LZO1X_MEM_COMPRESS LZO1X_1_MEM_COMPRESS -#define LZO1X_1_MEM_COMPRESS ((lzo_uint32) (16384L * lzo_sizeof_dict_t)) -#define LZO1X_MEM_DECOMPRESS (0) - - -/* compression */ -LZO_EXTERN(int) -lzo1x_1_compress ( const lzo_byte *src, lzo_uint src_len, - lzo_byte *dst, lzo_uintp dst_len, - lzo_voidp wrkmem ); - -/* decompression */ -LZO_EXTERN(int) -lzo1x_decompress ( const lzo_byte *src, lzo_uint src_len, - lzo_byte *dst, lzo_uintp dst_len, - lzo_voidp wrkmem /* NOT USED */ ); - -/* safe decompression with overrun testing */ -LZO_EXTERN(int) -lzo1x_decompress_safe ( const lzo_byte *src, lzo_uint src_len, - lzo_byte *dst, lzo_uintp dst_len, - lzo_voidp wrkmem /* NOT USED */ ); - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* already included */ - diff --git a/amxmodx/msvc/amxmodx.vcproj b/amxmodx/msvc/amxmodx.vcproj index 4ac19d4b..30e69af3 100755 --- a/amxmodx/msvc/amxmodx.vcproj +++ b/amxmodx/msvc/amxmodx.vcproj @@ -386,7 +386,7 @@ - - diff --git a/amxmodx/zlib/zconf.h b/amxmodx/zlib/zconf.h new file mode 100755 index 00000000..3cea897e --- /dev/null +++ b/amxmodx/zlib/zconf.h @@ -0,0 +1,323 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2003 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + */ +#ifdef Z_PREFIX +# define deflateInit_ z_deflateInit_ +# define deflate z_deflate +# define deflateEnd z_deflateEnd +# define inflateInit_ z_inflateInit_ +# define inflate z_inflate +# define inflateEnd z_inflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateSetDictionary z_deflateSetDictionary +# define deflateCopy z_deflateCopy +# define deflateReset z_deflateReset +# define deflatePrime z_deflatePrime +# define deflateParams z_deflateParams +# define deflateBound z_deflateBound +# define inflateInit2_ z_inflateInit2_ +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateCopy z_inflateCopy +# define inflateReset z_inflateReset +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# define uncompress z_uncompress +# define adler32 z_adler32 +# define crc32 z_crc32 +# define get_crc_table z_get_crc_table + +# define Byte z_Byte +# define uInt z_uInt +# define uLong z_uLong +# define Bytef z_Bytef +# define charf z_charf +# define intf z_intf +# define uIntf z_uIntf +# define uLongf z_uLongf +# define voidpf z_voidpf +# define voidp z_voidp +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) +# define WIN32 +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ +# include /* for off_t */ +# include /* for SEEK_* and off_t */ +# ifdef VMS +# include /* for off_t */ +# endif +# define z_off_t off_t +#endif +#ifndef SEEK_SET +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif +#ifndef z_off_t +# define z_off_t long +#endif + +#if defined(__OS400__) +#define NO_vsnprintf +#endif + +#if defined(__MVS__) +# define NO_vsnprintf +# ifdef FAR +# undef FAR +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) +# pragma map(deflateInit_,"DEIN") +# pragma map(deflateInit2_,"DEIN2") +# pragma map(deflateEnd,"DEEND") +# pragma map(deflateBound,"DEBND") +# pragma map(inflateInit_,"ININ") +# pragma map(inflateInit2_,"ININ2") +# pragma map(inflateEnd,"INEND") +# pragma map(inflateSync,"INSY") +# pragma map(inflateSetDictionary,"INSEDI") +# pragma map(compressBound,"CMBND") +# pragma map(inflate_table,"INTABL") +# pragma map(inflate_fast,"INFA") +# pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/amxmodx/zlib/zlib.h b/amxmodx/zlib/zlib.h new file mode 100755 index 00000000..92edf96f --- /dev/null +++ b/amxmodx/zlib/zlib.h @@ -0,0 +1,1200 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.1, November 17th, 2003 + + Copyright (C) 1995-2003 Jean-loup Gailly and Mark Adler + + 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. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt + (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). +*/ + +#ifndef ZLIB_H +#define ZLIB_H + +#include "zconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.2.1" +#define ZLIB_VERNUM 0x1210 + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed + data. This version of the library supports only one compression method + (deflation) but other algorithms will be added later and will have the same + stream interface. + + Compression can be done in a single step if the buffers are large + enough (for example if an input file is mmap'ed), or can be done by + repeated calls of the compression function. In the latter case, the + application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by the in-memory functions is the zlib + format, which is a zlib wrapper documented in RFC 1950, wrapped around a + deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + This library does not provide any functions to write gzip files in memory. + However such functions could be easily written using zlib's deflate function, + the documentation in the gzip RFC, and the examples in gzio.c. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never + crash even in case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total nb of input bytes read so far */ + + Bytef *next_out; /* next output byte should be put there */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total nb of bytes output so far */ + + char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: ascii or binary */ + uLong adler; /* adler32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + The application must update next_in and avail_in when avail_in has + dropped to zero. It must update next_out and avail_out when avail_out + has dropped to zero. The application must initialize zalloc, zfree and + opaque before calling the init function. All other fields are set by the + compression library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this + if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, + pointers returned by zalloc for objects of exactly 65536 bytes *must* + have their offset normalized to zero. The default allocation function + provided by this library ensures this (see zutil.c). To reduce memory + requirements and avoid any allocation of 64K objects, at the expense of + compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or + progress reports. After compression, total_in holds the total size of + the uncompressed data and may be saved for use in the decompressor + (particularly if the decompressor wants to decompress everything in + a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +#define Z_BLOCK 5 +/* Allowed flush values; see deflate() and inflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative + * values are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_RLE 3 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_ASCII 1 +#define Z_UNKNOWN 2 +/* Possible values of the data_type field (though see inflate()) */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + +#define zlib_version zlibVersion() +/* for compatibility with versions < 1.0.2 */ + + /* basic functions */ + +ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is + not compatible with the zlib.h header file used by the application. + This check is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. + If zalloc and zfree are set to Z_NULL, deflateInit updates them to + use default allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at + all (the input data is simply copied a block at a time). + Z_DEFAULT_COMPRESSION requests a default compromise between speed and + compression (currently equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if level is not a valid compression level, + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). + msg is set to null if there is no error message. deflateInit does not + perform any compression: this will be done by deflate(). +*/ + + +ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce some + output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary (in interactive applications). + Some output may be provided even if flush is not set. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating avail_in or avail_out accordingly; avail_out + should never be zero before the call. The application can consume the + compressed output when it wants, for example when the output buffer is full + (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK + and with zero avail_out, it must be called again after making room in the + output buffer because there might be more output pending. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In particular + avail_in is zero after the call if enough output space has been provided + before the call.) Flushing may degrade compression for some compression + algorithms and so it should be used only when necessary. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + the compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there + was enough output space; if deflate returns with Z_OK, this function must be + called again with Z_FINISH and more output space (updated avail_out) but no + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the + stream are deflateReset or deflateEnd. + + Z_FINISH can be used immediately after deflateInit if all the compression + is to be done in a single step. In this case, avail_out must be at least + the value returned by deflateBound (see below). If deflate does not return + Z_STREAM_END, then it must be called again as described above. + + deflate() sets strm->adler to the adler32 checksum of all input read + so far (that is, total_in bytes). + + deflate() may update data_type if it can make a good guess about + the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered + binary. This field is only for information purposes and does not affect + the compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not + fatal, and deflate() can be called again with more input and more output + space to continue compressing. +*/ + + +ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, + msg may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. If next_in is not Z_NULL and avail_in is large enough (the exact + value depends on the compression method), inflateInit determines the + compression method from the zlib header and allocates all data structures + accordingly; otherwise the allocation will be deferred to the first call of + inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to + use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller. msg is set to null if there is no error + message. inflateInit does not perform any decompression apart from reading + the zlib header if present: this will be done by inflate(). (So next_in and + avail_in may be modified, but next_out and avail_out are unchanged.) +*/ + + +ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing + will resume at this point for the next call of inflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there + is no more input data or no more space in the output buffer (see below + about the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating the next_* and avail_* values accordingly. + The application can consume the uncompressed output when it wants, for + example when the output buffer is full (avail_out == 0), or after each + call of inflate(). If inflate returns Z_OK and with zero avail_out, it + must be called again after making room in the output buffer because there + might be more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, + Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() stop + if and when it get to the next deflate block boundary. When decoding the zlib + or gzip format, this will cause inflate() to return immediately after the + header and before the first block. When doing a raw inflate, inflate() will + go ahead and process the first block, and will return when it gets to the end + of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + Also to assist in this, on return inflate() will set strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 + if inflate() is currently decoding the last block in the deflate stream, + plus 128 if inflate() returned immediately after decoding an end-of-block + code or decoding the complete header up to just before the first byte of the + deflate stream. The end-of-block will not be indicated until all of the + uncompressed data from that block has been written to strm->next_out. The + number of unused bits may in general be greater than seven, except when + bit 7 of data_type is set, in which case the number of unused bits will be + less than eight. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step + (a single call of inflate), the parameter flush should be set to + Z_FINISH. In this case all pending input is processed and all pending + output is flushed; avail_out must be large enough to hold all the + uncompressed data. (The size of the uncompressed data may have been saved + by the compressor for this purpose.) The next operation on this stream must + be inflateEnd to deallocate the decompression state. The use of Z_FINISH + is never required, but can be used to inform inflate that a faster approach + may be used for the single inflate() call. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the only effect of the flush parameter in this implementation + is on the return value of inflate(), as noted below, or when it returns early + because Z_BLOCK is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm-adler to the adler32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the adler32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed adler32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() will decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically. Any information + contained in the gzip header is not retained, so applications that need that + information should instead use raw inflate, see inflateInit2() below, or + inflateBack() and perform their own processing of the gzip header and + trailer. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value), Z_STREAM_ERROR if the stream structure was inconsistent (for example + if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, + Z_BUF_ERROR if no progress is possible or if there was not enough room in the + output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may then + call inflateSync() to look for a good compression block if a partial recovery + of the data is desired. +*/ + + +ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state + was inconsistent. In the error case, msg may be set but then points to a + static string (which must not be deallocated). +*/ + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by + the caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute an adler32 check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), + no header crc, and the operating system will be set to 255 (unknown). + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but + is slow and reduces compression ratio; memLevel=9 uses maximum memory + for optimal speed. The default value is 8. See zconf.h for total memory + usage as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as + Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy + parameter only affects the compression ratio but not the correctness of the + compressed output even if it is not set appropriately. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid + method). msg is set to null if there is no error message. deflateInit2 does + not perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. This function must be called + immediately after deflateInit, deflateInit2 or deflateReset, before any + call of deflate. The compressor and decompressor must use exactly the same + dictionary (see inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size in + deflate or deflate2. Thus the strings most likely to be useful should be + put at the end of the dictionary, not at the front. + + Upon return of this function, strm->adler is set to the adler32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The adler32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + adler32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if the compression method is bsort). deflateSetDictionary does not + perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and + can consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +/* + This function is equivalent to deflateEnd followed by deflateInit, + but does not free and reallocate all the internal compression state. + The stream will keep the same compression level and any other attributes + that may have been set by deflateInit2. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, + int level, + int strategy)); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2. This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different + strategy. If the compression level is changed, the input available so far + is compressed with the old level (and may be flushed); the new level will + take effect only at the next call of deflate(). + + Before the call of deflateParams, the stream state must be set as for + a call of deflate(), since the currently available input may have to + be compressed and flushed. In particular, strm->avail_out must be non-zero. + + deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR + if strm->avail_out was zero. +*/ + +ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, + uLong sourceLen)); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() + or deflateInit2(). This would be used to allocate an output buffer + for deflation in a single pass, and so would be called before deflate(). +*/ + +ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the + bits leftover from a previous deflate stream when appending to it. As such, + this function can only be used for raw deflate, and must be used before the + first deflate() call after a deflateInit2() or deflateReset(). bits must be + less than or equal to 16, and that many of the least significant bits of + value will be inserted in the output. + + deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an adler32 or a crc32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative + memLevel). msg is set to null if there is no error message. inflateInit2 + does not perform any decompression apart from reading the zlib header if + present: this will be done by inflate(). (So next_in and avail_in may be + modified, but next_out and avail_out are unchanged.) +*/ + +ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate + if this call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the adler32 value returned by this call of + inflate. The compressor and decompressor must use exactly the same + dictionary (see deflateSetDictionary). + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect adler32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +/* + Skips invalid compressed data until a full flush point (see above the + description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR + if no more input was provided, Z_DATA_ERROR if no flush point has been found, + or Z_STREAM_ERROR if the stream structure was inconsistent. In the success + case, the application may save the current current value of total_in which + indicates where valid compressed data was found. In the error case, the + application may repeatedly call inflateSync, providing more input each time, + until success or end of the input data. +*/ + +ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate all the internal decompression state. + The stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +/* +ZEXTERN int ZEXPORT inflateBackInit OF((z_stream FAR *strm, int windowBits, + unsigned char FAR *window)); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the paramaters are invalid, Z_MEM_ERROR if the internal state could not + be allocated, or Z_VERSION_ERROR if the version of the library does not + match the version of the header file. +*/ + +typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); +typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + +ZEXTERN int ZEXPORT inflateBack OF((z_stream FAR *strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is more efficient than inflate() for + file i/o applications in that it avoids copying between the output and the + sliding window by simply making the window itself the output buffer. This + function trusts the application to not change the output buffer passed by + the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free + the allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects + only the raw deflate stream to decompress. This is different from the + normal behavior of inflate(), which expects either a zlib or gzip header and + trailer around the deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero--buf is ignored in that + case--and inflateBack() will return a buffer error. inflateBack() will call + out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() + should return zero on success, or non-zero on failure. If out() returns + non-zero, inflateBack() will return with an error. Neither in() nor out() + are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format + error in the deflate stream (in which case strm->msg is set to indicate the + nature of the error), or Z_STREAM_ERROR if the stream was not properly + initialized. In the case of Z_BUF_ERROR, an input or output error can be + distinguished using strm->next_in which will be Z_NULL only if in() returned + an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to + out() returning non-zero. (in() will always be called before out(), so + strm->next_in is assured to be defined if out() returns non-zero.) Note + that inflateBack() cannot return Z_OK. +*/ + +ZEXTERN int ZEXPORT inflateBackEnd OF((z_stream FAR *strm)); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + +ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + + + /* utility functions */ + +/* + The following utility functions are implemented on top of the + basic stream-oriented functions. To simplify the interface, some + default options are assumed (compression level and memory usage, + standard memory allocation functions). The source code of these + utility functions can easily be modified if you need special options. +*/ + +ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be at least the value returned + by compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + This function can be used to compress a whole file at once if the + input file is mmap'ed. + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level)); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before + a compress() or compress2() call to allocate the destination buffer. +*/ + +ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer. + This function can be used to decompress a whole file at once if the + input file is mmap'ed. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. +*/ + + +typedef voidp gzFile; + +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); +/* + Opens a gzip (.gz) file for reading or writing. The mode parameter + is as in fopen ("rb" or "wb") but can also include a compression level + ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for + Huffman only compression as in "wb1h", or 'R' for run-length encoding + as in "wb1R". (See the description of deflateInit2 for more information + about the strategy parameter.) + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. + + gzopen returns NULL if the file could not be opened or if there was + insufficient memory to allocate the (de)compression state; errno + can be checked to distinguish the two cases (if errno is zero, the + zlib error is Z_MEM_ERROR). */ + +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +/* + gzdopen() associates a gzFile with the file descriptor fd. File + descriptors are obtained from calls like open, dup, creat, pipe or + fileno (in the file has been previously opened with fopen). + The mode parameter is as in gzopen. + The next call of gzclose on the returned gzFile will also close the + file descriptor fd, just like fclose(fdopen(fd), mode) closes the file + descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). + gzdopen returns NULL if there was insufficient memory to allocate + the (de)compression state. +*/ + +ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not + opened for writing. +*/ + +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +/* + Reads the given number of uncompressed bytes from the compressed file. + If the input file was not in gzip format, gzread copies the given number + of bytes into the buffer. + gzread returns the number of uncompressed bytes actually read (0 for + end of file, -1 for error). */ + +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes actually written + (0 in case of error). +*/ + +ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the args to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written (0 in case of error). The number of + uncompressed bytes written is limited to 4095. The caller should assure that + this limit is not exceeded. If it is exceeded, then gzprintf() will return + return an error (0) with nothing written. In this case, there may also be a + buffer overflow with unpredictable consequences, which is possible only if + zlib was compiled with the insecure functions sprintf() or vsprintf() + because the secure snprintf() or vsnprintf() functions were not available. +*/ + +ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + gzputs returns the number of characters written, or -1 in case of error. +*/ + +ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +/* + Reads bytes from the compressed file until len-1 characters are read, or + a newline character is read and transferred to buf, or an end-of-file + condition is encountered. The string is then terminated with a null + character. + gzgets returns buf, or Z_NULL in case of error. +*/ + +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +/* + Writes c, converted to an unsigned char, into the compressed file. + gzputc returns the value that was written, or -1 in case of error. +*/ + +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +/* + Reads one byte from the compressed file. gzgetc returns this byte + or -1 in case of end of file or error. +*/ + +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +/* + Push one character back onto the stream to be read again later. + Only one character of push-back is allowed. gzungetc() returns the + character pushed, or -1 on failure. gzungetc() will fail if a + character has been pushed but not read yet, or if c is -1. The pushed + character will be discarded if the stream is repositioned with gzseek() + or gzrewind(). +*/ + +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +/* + Flushes all pending output into the compressed file. The parameter + flush is as in the deflate() function. The return value is the zlib + error number (see function gzerror below). gzflush returns Z_OK if + the flush parameter is Z_FINISH and all output could be flushed. + gzflush should be called only when strictly necessary because it can + degrade compression. +*/ + +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); +/* + Sets the starting position for the next gzread or gzwrite on the + given compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); +/* + Returns the starting position for the next gzread or gzwrite on the + given compressed file. This position represents a number of bytes in the + uncompressed data stream. + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +/* + Returns 1 when EOF has previously been detected reading the given + input stream, otherwise zero. +*/ + +ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +/* + Flushes all pending output if necessary, closes the compressed file + and deallocates all the (de)compression state. The return value is the zlib + error number (see function gzerror below). +*/ + +ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +/* + Returns the error message for the last error which occurred on the + given compressed file. errnum is set to zlib error number. If an + error occurred in the file system and not in the compression library, + errnum is set to Z_ERRNO and the application may consult errno + to get the exact error code. +*/ + +ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +/* + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the + compression library. +*/ + +ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); + +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is NULL, this function returns + the required initial value for the checksum. + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +/* + Update a running crc with the bytes buf[0..len-1] and return the updated + crc. If buf is NULL, this function returns the required initial value + for the crc. Pre- and post-conditioning (one's complement) is performed + within this function so it shouldn't be done by the application. + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size)); +ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateBackInit_ OF((z_stream FAR *strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size)); +#define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) +#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) +#define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, sizeof(z_stream)) + + +#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) + struct internal_state {int dummy;}; /* hack for buggy compilers */ +#endif + +ZEXTERN const char * ZEXPORT zError OF((int err)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); +ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); + +#ifdef __cplusplus +} +#endif + +#endif /* ZLIB_H */ diff --git a/amxmodx/zlib/zlib.lib b/amxmodx/zlib/zlib.lib new file mode 100755 index 0000000000000000000000000000000000000000..d5348407fc90c3a723bfc1a223e0b3baf671eef4 GIT binary patch literal 221206 zcmd>n31C#!x&N6=Hj=<3FbJ~fh|#Jbge)vZWs*$x$$}tQMM6k2Ni-yBG6AHDNQe@~ zSZuBOUTv$@`h2hct8J~Q^;H%Xmuf{?ZEF|1gJ|ngQQIp2-|sv3&b@as0bKBHXXc#q z-E+RPd}sa6e$v^EJxy)rrp@v>#q6B&* zCrkdORPg1IH*P!2$kL^>gV;~b|{6hVolDFrpgrk&h z&%H`yC3I6RePzLdh7x~6PEJW}eQj}3MTvhwc2SXE8O8-=#iiw?6{P|H>;?I`3-V_> zY>SKhHFecBHDz@He`iZe^MZor_NH)qS7&3-WlqFWe_eTbRdG#8slUCmw=WcGZ)$Jp z3@<2H)v~H97P-t{QdL%8Qc_wDu3o-rw99ZUjP4PghS2N_AybSy6Ryl|R(ZpoXK=`U7S4 z<-y|e68}mN(9#nhsiwNRw!Wq+V8zA?tYKX#KUBlI2Kc|Kw-r!RV@F3<6M;}qOAGXl z_LU`|8L=qqXl(7(CQCHss-aI3q^G4977fkqz2SzYu4XuE=xFI|4Y!$J;hu)Zj`r40 zSO5%l^!2titVB4MYJ>L9_OOO}!(BZs&33ymB6OLV|G6c#B_(y0CDr}~^PMS{8z>G| zm!Z(W#+lr?fy$adeMLPiLXJevEw2fd6&Kg~*Q|7!R|V?J{XMaUwMF&CCH2MdrpMX1^J?&v9R=vM2SXEwGToH_7wXU;y#)8Wd%vyrNwyIkfMftRs&DM1` zTYT8ieJrIlzB5eOTno}QK_6a(F^G_|!fUFt~m;&Oj^O`xo#xV+wq3af2n zXH!crV$%{+2Fm@x;_AxU%IY}yh!^U*)Bg&8S$TDJRe4>BJvzEE0RHd@RrrII#WgjR z&xpZEUG2$1v+N& z+*JD!t$MT%Ha9EVk+vo=JuTfWjWNj;^jB6?mj{YUORdP6rII}b`j>E9m$SAP*Z9lI z%7XPE%8FeFDnd_V$AZ~rXv34b#$Q=kQ(jbAJF>HQbk+KUDqjfF{l%P6BKT12Bqi`j9j@$;vr}cGS3(9lUZc$4(5M>7})5|*1+ZlCy z5kBg>+B+>r4WY(f>#G>FMUnYoj|#sTod&aw$PL!ipaVcNs9SIwA2YYKxVE~stO~tV zcAzHI3Mb`XMHO3msJ%NR|U!f(grsX?L#OGvVjd|OJfgON)4kWCLkRJftIe2 zXu2hBT_@c$OvkR7#m6uf3 zBdK!C9y7b7*x`Oou&9bZbWJF+u^sl@;=1aRs?zF!zqPSvWn-(eahqFKTTxb4T2=0E zZjoNX;q%;@(u#`WvS2N$$8g(urB$`{sIJ9+vpH}$2IpE_Qd&|G0K>Nu+(3cVKgD+X zMgEe?l1g+DwSMFT(p~tz5qX3ne|cS?qO_u@4(P&Zke56RdRxu%^;3~{)C|J`TZqq{nXPTG#tE)-^m1UK6(F`r<>>?8d&bRrp*n}_h zqkNT?)S~QkH1@Q%n2iPqh!Rm(J=|4IbycvaqNvmi#L*5pV^ofwpd5W?O+6B+Wogu8zr2anm1xGCBQK6htnpV2 zjWzy?`kJ!JU`dJJh@L?nn|FI|p$TDoI*hNb^`poI%4=$a@d}YKo*XI8wf<^!l4X^w zKxo~1b$LBHf=i11V1`g#Yl{498hbk1J6l;bn%gPF{AieJD~if%5MRkeW2}iLw7aVpJyI>x z2;RV;bsbyosF~$UDMGIa)>Ic&nx!0Fc}(aRHY{3vUTINHLuu3@!w5Yl+P*&_{SZtkb&|e!YEvl?XmKaHcZrf4u zf@sSErGcu7YBTz=7&ZPtc`2BtV9>;1SMTto25b%psV*YJC^?|Zn=K|_*@88-b(P?R z43uHM)cVoy)l~+1cL zsOwb~7~7i#*laC~2*=jbdVhUMRee!Ku*T1^Ye82iI)7uN7G@-x!j<4dta%{SAdG`* z2)D>&g*jrBPorNqEa|8rj*$^P1Iyr+#C_|!_AbNNiKIIWr(cdv#BkLs+-MZf0E)Z% z$V?eunin=cgaI{RlNYvqf)_Tv>J8@0{OoC81uoF|G8kp!%h5qaaqL54j7Rfw!N9d( zx~He9L63}W18lQ@2aX9EG&DAMwDiF3hoA2*m|bAbcaKp@oiS6Xzm+KUa!{!Y9#QI{ zH$IO?@{e&%l^^M_|B_USN)n%R?44=?Vr~5nKacz0aUSn5!?lk##rIK% zF^8SwKHR)v!Lc3y9p$L?2m_^~o8A21GM+lh6$uQd{?81&j^*6xhnf+`%+!aNYWZ2_Rz~M(6K7W|$ZOn!rv(fgkpF020qxoY$+y2q# z3qGA$`j0d(@##(N|Ch~xe8d%nk2!Jjk(VU?i{@J}G4*LLhWsC!;rR%QKSodU$;=IX zGMh1uJi~Ov?Hd2XCZRs|-V!4h|5r_C9mSr84>{>|w3{G4{M6Xtw@nzia}+aZ$8u9o zgE<=%oh7p7i-u1f8Iw-NBvo`?>c8FOSiCt$nIS!jT`JBAwZm;%`Jc0>YfiXEXG9I) zC>PVsWw!siEdX)$0y%aCnDd|ZeMJ9_XP2$zSM230{g@j7(`LnNTt3pi<-D9+J&o&I zkv4N#PYZS?^tLQp*B5T@nAx@R5@neg@r*IWp30Wq7_(LFo$Z)Ig5vF6u;rf z%+%qgE3vI3#+1|iF-9$G8&`FAw8WSiZB>k^G-R=6#@4kMW21o-(^=-$ZzKIiO6l1- zIdkS<*LXp}?78NQdC)agbxb;==-25=^VC)frq3}&m9FG!+q%}@aW&ZqrgM*skesVWe!Uh`uDeCc*D~r z6L^Q>;e}h)hGAz4qIgo28V`9Qqzh{azRda+vH9BtyxFk76_UaY>CYUVzx3~i1`hEk zB;Ry-DbprOF@BE%?=@JXywixci<;M{EBjTA1+ z-#37>4RQzMNa?Z;cza=AGwR6UUJ9Jg8+apyI}Y9q0Ow}NZ$OR|?rp%k5BBG?0zn*( z-d^DJ8+apyn*l$Dfb%bqw?mE;?hx?45Bp*kM2N$My8<}f23|B=oga&}Yo(e2tTS*- zGqxME0;Od|=LZ*KALv=rpp;DWIgILpf!d;)(nZsJY@D#nrv@Qwlq-wAG@Z39(ACtp z3cDkEeT|*XKCE7bv2UVxS@UXqw)89uwDevY?&@CFxN7a%W!z=3?7U&U&Y^kgxGd#U zSne8)hAJsTt2OOSJzc$Bp|J0?^G^5Gb%)zmwXcKcz7oA7zK1bDZH8P5nY}pIm)+9a z?VH)OGT4Qk^u506gcmigZfQQRrInxO__7!0_-6JrF2a_)rnW`l#-1<@TiUzDX1RR8 z52EGMfu@<^j8~(xGFY8NL^th^R;gKTq|NHC_U7)8%E0F|VDtsMI$KpLvICij^}!4S z;@8oOQ-I3#PNnE4R|e5~2*h$UMIc7$c!AjV9w*R5s4U^hfS1AEVwL|6th*P6ifX@zqO#R?r7F27DMw4MFNnRmW)J- z!XYbx($z8pN>j6E=FXgrFUvdmfTG2x5Z)4>dy zT?d86W;*C3`0OqghIUA=Y9)dQ7yMy&6E6Ww!WliguqQxl4x4W1EBIMc7$=ACKMW*5nHatk6(E8(!0LCu){xi*}EtIWJ?lus7T+{ z?C86&N!ry$BLbSbUG&i@?A#(Lb-OqoFlpAfb`GCe?{=LARi~21 z&??i0f;b7v?us^UmsyQ+C*Er1z)X4?wV^cQ&ahHo<93rz+P=9Pg-GR8lDly z>566F?K10D<>&VO%5s%wxFQZ**|>h@l-tGhCl5L{;ctH<#F42r;$&{ST^y5`jmT)p zL$l1oLYMhOaDpGYHtBf>tCr9=ie*NeM=PI7aOJ~`(XcNZ3ay8BA$~N|4F6g{40*5Qs413Cx zM=|5*<{aCa^-H`F`fj-@aJsV5emwA;wCgzAX`duGY+*?I)@NV5dN}Qq1&3*D(mu(gU5+}#LQPVn z{SrX*i=$&L8lo8dj-{QUYue9pQemshf)k~kzFV%&ak{e6J_UGA+I5_bJY5WHHC1q$ z2|C2Tz*p;Jx3z!gLu?#6sx#)rA7-Od(0|0U@3q*&GxC{rgN~s8h%2r+@vjg#iUaz^ zN4!Tsj>Ve;I3r3U+)Xh21by19T<28ok!Espb93{oncNha$#tW_HTwWN-^LIAV|7P0bnyV>Yb~A*2{eRch8)m`FdPjTjR$0DYA>lVI`!B$!=+(PSX9IQ#6Sk;}6Km&_XsW@ijyfEh^{3TCIa!Kqp}xHx+X%zV28**P?T zo=<%rmHtOF2DbNIykux`cIqXG=ZRV5_5Mdw`#*4nbBCg1RSehrKS&6V@BiQ*eW?f( zuEMF2$Co$sKRR#M@(12Obm)+Ph|?7Mb>5)I@IO)GoPxmE|0b&vsJiE8-m?Gqs!O4= zNA#-OqY!x@U5k=rNIXhvM4GtBR8_FcLTRPD6;QpZ1?qUkNy+2XCa4qDW~e79_IVT3 zmju2E>Lm3Qs8iJ4VuA`Q^9-y-rnnctJV<0lR1hXE^;;lg?agTy#)#a*aQjr4S`#rj zG4m7*lYTQ+69{NwTdw3R1Y_WXf{}3;6D4|}KFu%);(Rj4^Xy*7z>D6lzMiHQq)d7i zJ!A>jMkeAD$TgN`qb!@VJ52Z#bu&~#=|V0c`&8V$_~zgw(MTlihSB@9hWn(_9PXP9 zP7};1j@@vdorY7`88J7k+%BdKJBf|&-VDx_4(v=Q)5z^&XF+TVw=iO#%#bcNC3Fa8 z;bd53@yJv%mh8?ffs$YdvUujs18qbT3bJHc2pecy^kffY4ys}Yg6xthh~s3O83D~a zV%%sGCgaR|H2_WKQPMNM~F3si!fTZ9ZtQ0-EEJ6l2xge&GSn zn?)}>7=imqo0V^__iGO3h`i4H-28k&U6B@a1%%hxb|EI}jbay%*SRmsryF#{;dOi% z$NU<2AFz>yAouO(s4yph8F8T{C8;M{yVeViCK z+^O*3G_(Sx(}{EVaGQYBYv7F(ZW;>a6$Z{VIrK4pxFzsl!fd53%q7m@!(9uU%?92` z;jThDe-Su`z(Gwdpnqv`>754;J`4Nn=NviQdw}zZfj3gPx51kyfpf`R#1YbsZaH4L zdI@+>!Ty_MKOo$YBh{l_z}aiyjTG*QiAwznIR8Y$P>i-VMNN(y?n-#@2iTV_kYEoR zZZmMg2Hr^FUIlN~8#sqVN5>VX9{mbp#NQ%SJn^A=B3zA}_a3{d-R0HQ6(c`xp z-vVAM?8g?6Gou-UEqBi_IFk>)We7SC~$sa;EfdSo3QvbaGnby%o_IR)8eM{Sl~Si`012ehK@_>gn6z>AeX!|7PHg6z;9?<2%4v zxDae5WWosf`*YxZ0rqX@0f0DM{$3578x6dX!hHi4w*u$-#n`0>>BitFUU~ij!#W>3 z#~>*V7w#{C^QwV2Qn-JF#X;b_v{b1@7jWJ-em}_m==ZRn3|{g`;m!w6rGXa>*Tyu{ zJ?qgT1Bc%fPfJbW?A%xqkA29RLR_zXtc!~#5mWvWkd=#{LeQGV z{7;EQBhM@fKdpcY8ESJ+*aaPh(Qx(v+Z#c8b_uc=M%!u26@ zxP%hItW9dxBp{osCf&o=QPO}i4G#J`TERM{W=#h=@1NqCilbX&$%czKYb-X8K!X=v z6VW)DVywlGvXc;aeOIqu{R!hkF8Le_8wZ*2gHa_mZt<2inQp*MZH+zJX&-I4Tr&Y^ z@lsL}%5ZNvsYKY~vybkZ+EhidIsG0qpfuG4Xe{j0RjUD|smlRP6tfKml%{S3#F1>e zoGc-frtXE=abk9#0i~&@0gV^49~)4b`W+yznElCs($xEaIB}S+Tqzn#QxgFpAz?Pf zfYMYhAdi^MF`zV61t>$zY7Hn&g#e|C*(C;)rZxgf6SJ!gh+kT88`lYt^xG~@z(=eZ z;|UK$kPf|jn<3!J{WtwI{W9G%#+0O%GS!fypi?sabc*WKW-d^UHYBuSuaFl) z{sQtW$cG@;LH-?*yZx_*EQ5R;@>Iw>Aw!UVf;(zkS9QX4RSf;uOZKc{2}Ce$PXYnCvp{J5#$cYlOS({Y=rzRB-V@7 z^^gl8_dw2u{0`*jAm4x-1vv;=3Hc=C>5%^p*$%lM5>37O7s$^-{v2{X z1UUd%3i%l1DUjcUY=QhEBo?;Smm$xG{3&DsM>=d!gq+&x8Iw=--3h z3%wWmThQNvo(?@7dIWj|dNuTF=ubm`8v1nT)1iM0`nRB83jI>(2cRE-J{kIC=wE^U z73dd1zX zf&OpM{|$O8^j7G9hW=;h6QECkeiQVYpf82K6#9$MUxYpv`dsMSpl^e|2KpN4??8VC zx(B)k`WK*o0eT(uI_N)!{$uE~pwEJS5A=JWcR}xh{#WRKg?=LR6QO?{`q!a1KyQHl z8|c4*z5x0H=#M~u1p1ZGuY`UG`XT6S8T^nw$Q6*8koAx`klm1}kQI=pLAF6oguDQ9 z9^_g`&dmiNvmu)yy^xC`^C82KZurm-SpvBW@?^-{A)6q756RXxQ%Z3X{N~MlN$?{H z?NSojo+Pv{NoYfo&`u)^CqwdfK-rt;N^mD8CM6|9q(Gz^Vw54$Vnlk3$T)%+eFQP)V+zm56w(`v9XHMk zF&^SLLrgHl#29gWjF@x;G5H8$%EuH_Kc-O3|D0WAY3b?APG%Xig-M%fh%7^l zHN-eWFx~8eX=oQ_dYZbKuBIN7yu&_Yl6%k&+)3PxvI0KOo;ip2g%@Xk>;TTcV%w1aaRmEb^5n%Z_7rQ^1&Of#-va zkr@vChe4`7kHr}1qdA21(HugWg|_=eZ#4Fjp^ew#<3Tdkc?TnhLW4Q|+Y>AM-Wl4s z0gd;AWUg&yVfghRndhk4;CJr;<2?A?TSdJ~RBm_)?cR7TNOP&>yJi7j7luSMp)3Yx zLQMusLlzb54TxbA)bwb&1@L8xW)raKq=o55eWlIZ0%>cdYfenM(oec&sB^7!WojDF zF5v>$Ebf=`f}t?emvpdGG7l$SZa_MHt$5OB^H}1-$kqxJ>+_dH!r7UTyYF3$5zkP@ zoWiFDJ8%&03pWCB(G|Io`!-(yi^$!ZX&;Jsw}m28?gpkB^bX#)m6$pn*cs^E^V`Cw)<>{K&wJ7G zK^@}7pWQ`NehV_b2X$PR1LSrPonCG^h?fi|%q(eXU{pDn_!87iFp?aa{u|VBU@{4B z6POE!W5K@DoH_G0q?KMc8jo+9Q<{RT1HV~uA2MLmeks0r@h}DP9)RSR-CnyKxePpN zxMi&7TV3m-^CPD(iF__| zaBDuYba3lDQO_3DFKR&43Q>ci)Eikb&326Fu7&e>owtnGK8k1V5-LOeXQ}YP(4lL^ zEY!cLVh&=P5IQub|FwjH*RFgF0Z$ot-m_^Fyg_RD4!DOZm1o4F0i5O@;In>OBa_Y zQ$J*3*}by9jKh$d6Fv7rJq|-uP7dvWIuS!5cDXM=^~o{*Y1kX6z(`MnI$oU(^%NC^ zdbU~(^-Sp=XR6JBXQ}I<=BOK>=3{uGF#P)p)U(ySP|v}D44cR>EF!!U>H@U~sviR< zh1P!`)Bpxa*bt;rQOe5IIH>2U$xzQ$v!GT|c2c#*u&Bl1T*HXhqX2{fHjU=e4C)9XZ_7+Usg4))$`lqVfd=eP|tm1yqBK!u3^ksVsX6B zFzCYN0-=tsH7FwKS!}U#5s1uyOB-f-*C}5w8;;tdEgFkjiuxH;Lg|>V(U5M@NFp0+ z5Gn*}?1hWYU$WG*ZEZsTGl%jH4jhX7{J|8UJjBfEOM7q&VHVzjmqNP(HzyxDn(@;rDD?P*(WH6^Vtr!<~h1qIOKYA}!>)?<(>m2WDay`uM`f!l`Iu z#3Xd+DsG27fPLy|SB}Eh1N=$>@Gt<0#lF4_E9?W43U}k1Y@)>FK$;at>~hZpM^w$& zcm_I=Caid$-L(YBnxjpWqQMa(J0tR}8OjfJw4~A)%uKOxEQXpT%*t4dbD6d5Exed7 zU?tlK^*FiHV*+L>SSh~SWAMv4XM+OvT(4ceCFI^+c(}KB>4T$E_&LDW)@} zDL8Y?Z)BGGi2C;Rt6RV5eNe!Jc&&IJIEzOfvQD()k zW{flA$mYn_E%)NlMLe5{)f2PpC3j}^%VTxFoP}xs#|F~fA>C8P^4A(RLR z2Fq&fQapTtBSDZUs{hrDMd!0$S+X?po@ZNK0-EH^yo3EuADRz#&MG91g8Z82T3!v+ zzdN}UJ%AUj|HK2yM)!kn6lM6BiQ>%ufo=H}sfB;_Y+4I9g>QO>$UT|(o^21`wHgtO zY`*U}lugEL`itP+mU*__cNfckaSRf0TnK3lukGpA|M>g; z?~T!kxc-7qAkhAuZw^XM8dbUa^pQ!?p+hY&j{ zM@$8_jh{e-Vv7+|fnEUI7SrHYbV8T_rEvF zp!obxAkhAu?>HzvFxEzHiVg_fBO0lJCnLX#>E!m0*vWN(jlVp5V*g`_b!e}=XqhH@ z25SGIJ3E{X+tq}0)Qd)m=&snjPlB2Tu8-Yaz1Up@b&O2TWU38-v(zMH$2d%Hv!j~@ zb-Y|SG*SHkg>{nJ1$DC8frezNdK~Hr>VC9=C#juKr>P%7Jy|^uHCz1>>M82iP)}9K zm_<5WI;mK`klVpI#RIgcAVUcZ-SU zJKv3CpKyfkj&WujNtM03Yw2v(-CevvD0m0uJc`GQVyv~-FZTem3v@1-w_EX&Sd_vl@+bbTvEh2EeA`*vr*Qmt)lLQz?VkE~BpC%? zIw{0#{feR9V;YU|LyHa*eg?wt`{yT`41aSb!}y`||7oK?QPZDy2tD$3waf-_`c`bRp1_w z%M;N`c`FwVZN3&!+Q)cRFB;msVN~=)YAX5cT@OpE!P&yasEsUuUey?dy6H|tiZIDo z&ISG`^{-H|*#T;XDgkzyDuE`W-0Fx2rOHdWLpR7r?5ThEF%9E7)(8K~2UwCX=NW z>KLr&vq)@)nyqeyYIRx7_%g+924H45KeHiO;JByd3y>6cdtG!j-eua_VQ&^Vb5UVd z%o$^b$uMq(3`hn6z~(uuDuhvBE`w*fU(q8hPAISs?1PjYXQPdRL4%H_=;QzsNKbbX z($k%UbeS*-)icOAwk6oQJaCkS7QuV|lDsDeo?q(OREBCJ(`%8fEF_+7GpZt6Sx7wh z=VuiSyoOQOMBS=+1~$PXOs#z{!5SSkc(&z#&)~Jt31xoh(Gen(X=~$btnL0Uqn2TQ z{(DyI=Kk^i4KVcFeI`ZPj9k>0J zT;9;)wAXdVz-}=#_y9+72Tlk@bSR;{e-4cjGtQy7e{A%UXMdS7#Z=5PjOI2mC#L6% zk!`FX!-K^im0_jN@e}YsdX!%^<5P3h`>da=wExM79mt6MbjK^Gwhz%5WM*SN_(9AE zbKv?zN!K?EpVjFJvSFM5&?gj8_DNQn8bhlClfc?!ha&ku3|Vo$wr#Wb^pU0!8gwL# zbn|Tc62o48@!;0G;SQ748M{J}FELzu?J*pAwnYr=%~5R5AL$l(ElR>fd?jNKkDh8x zR#~WZx|KdL3Ox#Fg5d3CofK#bR4up*g{|WmP)A{^nvGK-)O76ZA{)+$aF5J-Why+O ziLft+I##B-$6@yjnU5s+dz?y^a88CgN$r3-Sv>)Dih2&}RP`d%6VyVqVyCJ`sHdr4 zK|Ni)2K5Z}hM1%y8BSM|p`IbF{o4rp4oFk*%q3fWHoc~>vm)gD?e-kZ*jbUJ7<&$8 zOy5|C+;Q!7KQkWouOpUr|FwJFU6?&f>~b~Z%s7&&GL4Ea3_0`zvoTAnTvp@A1jvd@ zYkG6EIaZ;G-V@FKhI7?@!0T9x4AK+a{FIH}ys6S0@o*xY-{uTBzfGovCb{3j(p6pG+e6o1i!6C$11vn-Cb@TM(;a_FD15zP()JIwFW+1=<)U4} zu>*yf%cM<>7M4w7s+Fs3unGDBFlo847=W}3JKuT^EQ~X@Q54#{jiTp=>D;J|254_G zC1zpBiuy2XYqoTpZJC`Ur^u2np>*s9RoMMz=95LL zA7n@+!D#s+!8h9yDnopww4o_tZt}KXQiTJz2PCy%#epdWvO9 zq}#iBN-nZ)c}&jz5RuWsp8Uy@{3(+B>5}|zxl<`o#xKcon-cC?gF|a`PP6F|^i?+4 z1ntSc(lj)5d-5-anNAK1N!#l_?+wE^c7=#x(j8;v%$_yvoy~pDeH&)}kbFHlA*4qq zgmeTfGW55`UW8SjpGW?_4`^gVGY6jBy@9+5qZckD6BJ!ksZS+~w)yNVq(4l{2D`mm zo<6u|bH;IoLFDOo_P}uSjN_0u122V7;>3*jz!A!p6Ilu26mVI2H4yuL*RcGeT?~nF z@d|4~3fPjd_9V*6ev-7z$#SRk7_|cC9&8pT<6_p8P53g!Mg!2LUw_a?e!CzyKvJ0Y z%nW^SLN6Dt*VYdEB%_yLd&t2uh26bg9JT6NYkn$*fBvLTuc9qHx} z{5I>@%$PX>(+zc79pfB2zv)EA-Nc8u=>skLNEOESa`Pt`VaJUVd zV!|`>wud5t#i^ccPxwQF0FX<~*($QX|BtTp$82mtXfSbGS>apjAHSGm%jHtN`yb8T z#q{_yWU{Qr)7Xm>4iw00$djR_NluN!<`vp<)@Qu5mlLG$Pm!WeHo~M8AWom?`4+;a zppOiX`dY|rNT;AJH_2di71C~BC01-2to(~@BN-N$=ZfL&un()by>u6py zDB9qr>txFsE+yQ2Lk@RJM)n;@3Jos4CV_3Yzi`LpPxk+i4ic_d(*J(K6-lL$#||Xq zZI9L_fvzn2-%VAXk9rdnvoQtNX9iGcgEK-$9m6}Yh@4VmK#ox zt)zQ;l05f6b-?Yp|H%(_Y`%6T4MT$+*Cassdcxqh844p%s>7BD@$ScW6FfteoWGa6 zh)DEEHR8Iq zc-7yaYKGh7TsW?G!-lQr@leM|H|W78GtLdLJ5&9aaQ)N7H z0?r+A7tI||eK;FM^Jk!*Ec;?k!wDL0c4N;tOPvliS5-jGlY7zUs5Zd!WHw^H`ZC}m z+4xqhz6m&hlQ`T`whL;t`X$s_^%tmh(e_~z{5Az|XGz6}RBOYKb%x(G|5J?p_h6x) z{?K*&4>9&rk{D^a)OGK7aqMFUZ?WAn^>p_!#xI$wuiM$@U&Wpk|boI5c zTq0#Ga-C01HlXd(CPP=V!!{oq$#{ShMtbMw{hI+QYzDoKOJS-nxuXAF_Z9neZ68|f z&%&-#sqo8pWx;+4q*wX?4Y6ltOuW&XOp_INALx>5E|Px+-#in@66uFJR)#g><)+g~ z(b5orjVZ|0#tJf5EDiMjl2}W8o29|*&0~k+^pk#E3VE*88|d6b>n^Lw@kTWyNRMg= z=}`?KoiSEa={ce&*s{)JEX0mpf5{^5e4luj`Pm9%IT&oS@X%m{Wn)X^0&|BFS{QFh z|IW9JdBx>}7kHzS-WeBN;*zYF9qgHVe-~YBgsTj5Qj^!(nrOX<>C=#2Suxbm7{pu) zmu%NdmQFbZhaj2gEGWr10LQdoHpI>o+zK-aD`oXJaanX0>dzQ^+FBiW>~ll6iY=~m zhF)xWOa`ns+||?4Y;ea;M$CM)g*-AjWbP5ofDh9k4QJ*I8T|}HwseJ}^^nP+vzw64 zZbCY{Zv{4mjyPIf!M3vdAy(48zgx7#NcH~rMz61lP81ju4M)iBAJPwON@I2-n~faT zxqV=imA6v9@}9Srz~39SzUo7Um3L4F^iI5hjIA`fRnb%ZGK)QZPyf#J{=bj%43Skd zNd7M(_`*+$V4-rk9^7&;hIyVH_5^TP{RRl%f%GcwgVxZ?QD`zCEnKoR9y@RImCe)bZ*CG5?L2|541jhs_$)G;5DV}E`8a;F zjsJCwJ;$=#e~uFPbu6Xi$h56b!@$TVTZ?8XL`Y`0FEAlhyFo7cDemHFP7nj`K7-QXh?~ zH}Zny%fO+Aa2l>kzxbm4q=$Q3PJn(Bq*o>aG&3;=-x~4*Vvp*@k!s!8devxrvjirq zv0_8$ctBfV=Ed=CeKgW5bxWH)3o|{5@GC%iE=iwPU`v~X+Qm}O{vjP#6L9{BO!V9DzgB2-I`rdBt;;47X)xsxW# zV2atqy%fhjLndQ%I6LFmo3VKV?kNglCQTS;<_@Wf>9b|x_*it=%uBtfMMy7d5z>u| znTm;uj|^ZTQn1-XeOmXkPeoYf{p@5jduKK=A|m`;7(6D=vH4IFxj)qs_A9PY6mTav zhn^TIsmANCWS3?Lrp;-Pf+J>LsFaq;$zpDr*e}JVYqyKnVpA+?IrCc@qM8f29q|$z zF=kDxaF|rlBvs?E6e}4n@Dd=p(k9J-oG?JyI51 zcIX?$ceRF)dPj57Fy$S3%f9HnP>V6PV|;}B3rJQqL#4VGS3#p zdCR;(yX_GfWGir*#e)>}LjIk5ho>P518{iU$4oR0>759B!HH5zzbsd;I9=H& zW$)~ybfm}fxb>ZszWc#hKN?OcxhA)(#73!pijHpHpaS6)N?QQYFMT~d&Fz%3U(uBQ z%^7DKrGgWslzv&RrkV*&kInie^%T5x45cGImdCc7`ywvAV)2E;DP>xtN3&6?AD&}) z|D*yjK`3R*PrrB}z7}>$xg|kUTIr0lK`Gl6!HH5zzbseFovv(o$_Zd+o{sc1-fhH0 z-EZg`JAF8%lf|Ex1P2O)erApkpADy&1WFTJ;EXqF=o9Ukf{>3`KNKvB%k11 z1(kGsbK$f9Ih@jy1m{jHCi_L6gE45u_(aK1&AXb>kyDV-y6pb06x z6L$1VKWsouJEaUuQ+k;*&IYCA90VsyDgClsZE(7>QF;pSoRsPq+9_qn=a%}#KKk={ zHLHeG`WeBwnJOg3sZmOc4N6ZHN>TJ>?5v+sAf}yChNUUJ#u;aWQr1(!iBigXZ@IeO z>B>gwX~1(*s$*!U^mM@ic@XJp@4+qK7*6RKg7Y9%qCuPBk#r zZl{!CX-aQ)#@R-x;6y2qxa>Wy6mawNrK8&5Ip{cN^1{of=>rKRt4{JQ$`YgH_M%A7goY!-^IBRF7MnN<+ z?lkBsP(I)s1Sb7Tr~x3tp6?7xQ`+f_vyt!9U@tgPO6iy7>OY;XY$Y7kGKNweLp!DO z1g8TkpYk|v(QE|A$lEEMFF0SN3P~|9O6hlrEGDGXjW7Der$Mx^Q_8S3rKgx436ece z1t&@={jyvwaJsTldKU1Ud8%V*r<9v++^$=p^6`-CE1#|!PARH4aDGk|lAoy|0aZwfbEA~*H7LcrFDT{ckACs_6D{nNGAvE$deb98GV_$9 zRl$i;O1~^uUvj##QR;_FC#5=uc1nu`=a2A_52Rf9^YQQ)ACA&nEI9V@PEnLnbFQFB zkJrAC@q0YC#5=uMje!N4+suh ze5d#;!Z5E6H1B#hzm0q0%}?Vd_y+5yc@1LyxHa6S8XR}+H#At+>zf|v!yD$8KHPyB zaN~OX27T|oafiO~)hu`I8y_9|Bj&C{*?wqDq&L{^YHP6Fq|{(t7SkZdU}b-U2CWmZ z4c382>|=ABPywp_kOFRKitf%QtapJEGBzB;eRR93cq@A(B}#g?T|)!BZ0hT24_^k{ zu1ninl;3XD*3xvTVd2kL4YqAI25fH95Z@ge0K`NuKMH7HX_z%U)+Z&w0|-2`zg#Dfinl~)Q=#s?r{Lf7z`12Sm^sXNdC-ByD=+83gR5b`i(^%Y zQIPTIfH!I?TV|VxM+e*H+@ru_IWLHZ7l+>Yz^gQHN22$A__qi+^~d8f638qp-^Qc2 z3LdP*jMC1@nvjv`B^^^Zt7H=+)sGW_H_N~sDSrE5F&{Y7PQX2wn8TTd8XYfwZNR(G zhxnbO10E@U%#SH(f9xV&ez2I36}5|ac%--VDDf(e60iCw@oJ9(k4@>qczAKj%M##) z4BTjbXuQQ{I*RZ*)8SeEpb~gJKwS>d%ovppg znpfkqrDs{7rT5ZsSNF2URcqHSTi4OPa@l#<@QKR^m#sq2*t)L0duG?lOVrkR>Nu_k zU=zb=v_MH2TCHhs>gnq33Wa^Aop-vgt~=bms(l^&_m!ZRZtuXk4kg!A{y$W&WAl*O zG4hrV8JSNT<<0-J9^INf=YLyR=Bs6&23`Nl!^+9~)L!$-F&_)Gz32651g~@OQ=@Y@ zmC>NlZoL6Xk%h;}+M^s@LwnasG2*^mExLQUS}{yb&2qzNbys_HH`+-3)w-?>t)P5f z059kmTYdR@RUh2St5f`-U0G$YRINa_LdGIpH5*Wx>IFpZI9;tVpfn{rd4&V6U)aW2 zwE3azBZR$x#{TIakr$;)w%NS*fDl+j2_ab)7RY3I6}xt@T!3h+g-Z@C>fP#Z!zkOd zfKJ|@BANpFQ@+hqn;x^_%5-xIaF<6@Gqt6sr>h4{Z4%g9ip=a_Ztm>a!%T9)F6!$C zTyVUqw^f;2HW_7okd2T&$VMm)&*td$*L0b0C*zT3T;WPQt`LxENmHlvp5;5GHw~~w z8oOxlw!bz(xpS#AHVQ?Bcn2Km2I8&VrVhlo+lQT+wjwE3c^57H1bvN`7}LA#f`cr zSZIhuMt#)Ih|IM(RE5&F{9^Ixsz*uAE|!i$NSqXd%BjF)*;Y7D%oalBG^1BeF=(^T z<9iNdvf2QZlg3_|4Ay05E52uo*^N+h1o{S4PGl#`Me|HduWSS2VuTm(@aP2g;sU}=(9hB^w}RmX?USXFG68?%z)C=ZvmYFnJ#C;2&D-x zI77_dfl3IxB+@EZ%($pT2=C1`qSPv=Y?ul4M4d zn0HdPZzB>9gFh@)5;c=0Uur38hPQsHU`1ZX1vdi+FP|T|MOV#(i^4@qP&ZKr&8^v) zg^%}Ls2$?Irt=&QuXt9fnKr{NZe7j9YaG2pg-mN>JjB36qOsR9wxEbvJ1-La!_-cu z*ZGiMxwni%2d|u$(`J|9Ti2_NfOK8E29U0kUjlRou`Z+7 z$-x|Z4Q08p*Fby<4a8+m$JW5Fpsbi@saUPP4{3LwlE4Y$RG4ai7{1-U7xu9y>+)i1 zDC0!B8S9l&+yLOp^mPq=o#r%TY;DWW8D^3{%me{B>v4YWFq7HQTFYu`tF^4eAEwqa zr*y3)q-!mqG`vBlPjIG7wPFjKCWk+&1n1Q$=Y@X@;dh4adx1N!z3-HW@K&hgsfXdO>UBq~JvF>SyRzJ@$BgQ(6p%0=w*n<}k zStGv*bu3v z+$}ET|4bOYX;*hkr?9#`E7iJDAc&$GUn&-esLU)OV7ulS@V(?}(!)>x*hUtiBuFzv1z< z*;5cT)L7nLyN@AW^(YIIt*;0Zvw4R{`q#``&-a!4;;aWw1kn}BpZz5X!YY)8wHAP?R{WevU(>R7q8beud1<;7c{tjFy4C&&X(6XmYG(Qi}vGp;L8;617ITJ9~CTE{ARuUBVn7py~cZC_sbajDmRNg)0Q^^ z=>Ed)p7!R&-VBGFXso^FAgmT4_An6ROt+*eWcBmXB8=SA&l$#z&l$#h&zU>CP2fP* zYy#}uHSX}A!N7rcmVP5-V$T;v+Y?H&QtUW{M| z$J3SPx_^bbG~#}QUy;`zL{{jEp0*o^2u&Sm8)ldCcp!U1=s;b3i?#!E;#-_|VCsf> zXZB@psc>z0Z}#O=HoQ0g$_ZQQ6VTo;O2_F)dcMF{UvP>&vjNv@5BvyGXk+5AMn;Fx znp;P!qOE-KtOgE-E5%WKmuOsUEPflki2Azx;=Jt_@urP^Fh%n+Wf%B}%z8mGj1r^B zPLJyCp`{M@2(cO+NjFC*i3c(xZm=$y=S96kPSy1N9D!$x<7f<+y_yS21H@iCSq>6v zh;2!#m{maicY&IrvfWCS>wj+-=tiiw3iJw8-M0M|&{rY7>RqVh^|5&!S+8x=0BPHC zfVAz2fOPwr9mP96ikA!ME8@$!fLOqiRSBT6Vpai2`&RLeBzb^vPE^Y!uZo;d0pho-m03cQr%ufJn6zI26+pYN4>6U~_&brGM zTi;lkCbJgl!qsJn%h7VgdW_6q=(&qbX?3%VnGxp1IGIQA;=N(E!%stMV6T z)Ev2T{WNtS;M4IMFvsdUpiY-(zs{6HpE+?`c&;3>C1!~+#bf|1V@!uVG4@ZQS;!Du z-KXu2vCoA=^J+5s!&un;r@ihw`1qJUhCAF|H`{Lz72=GTksRYpzh8vjX0`CE8ZoYl zVdLfvW9;S)Yu4vk&3YKVHukhONjuLZxd`6FV70J%e9UVZ3@~1cvVVVo8C@AYOLTT+ zE6jBJPe`}_gwmwp`l6V<3YAbA-aA)Pe$w&sxQ5c?=)+C;N>^-r3E{C$gY|0`-mf>@ z%%S5jLnOnQJ?hLhb!JGN*^EwOjt{PtV!EY3Pf(LVg;F|>%#cs(P$~yv=AqQ+iewYx zqSUcFl*(N&QtWgL;o7|?7DdERz7TmW4&Q4xnoBQW4;|n;us%FG0Ej2InxBYyzq3b zDd3N42zB?gcZSJGLWqehjOcHwNFUqI7}Du>nJvbnKiUX37ehS}W;zqcxmB3)X<;(r zC3m|pw;<~Ha_}>=MMs6SS*|X&J2La4jE2d?bFoN^_x#d%VarqIlH2uDsN6fW^|eO| zhUY0Ma=W;PC>;<5-xSwkx}m2qeOzbbi+*u0k`_#7%;<`#ge57D8C{tX)+Puh-l ze>BcKB{SX{$DYok;I-SuR+ysciidVt=?q6Ah=Uw7=T^mxJ~!BAWptiO4CgADX*c52 zZHo@+a^y033%84DOR;L{uH&uH8?+%>BqMY^Ata_c^ynNf%xFUKc~P~ZO|FZYh^vOC zwo7}%96mwN#J;hUan|LhRqRd0EI-UM!HJe1=8)xTz3D)7W7DRTAG&mwAD!>^Hi1>l z?b-{Kd$!zv%sh2?`C;qkc5&|(Aqu{AuLb!qiVV`_S^|iEaSxal%pJ@&im8MpWg|ad z&sS;_d)Z*YbGyvqm;COUca)LJ`cYo`N?TpV@=-&-hcBDYXcKOUn%I42d9!?;{j*2W zO_;U&*RZ1?j^Xoc?C`>u_PN2B86=L*L6l5eQSiZ)Jx}RM=jpe^g{hc%%JL;R(L80U zS*{*79f)qvQ?>@qJk@z&&(kcyc?v4`uYKdJcitbKr_3O?i~HDE(V6L7zdBsuJML{MG4P=?J@I$ zJU9h$qy->PASPCQ$1Il2`5B>yY$y`CJuENW;%I>3!{qP(Q2f=O=AkFzI9mzE%^f{& z`I8&I`7$MMDv{~Yq@&KastSn?@WAWz7IcWJV9`f z+3<0^TJ)~JZ+O0Q9N~6xKcAWJ*6~}8LMSFM4P66(=oj||YQcQRe1e!tSdz<_Pmoy` zZDLP(IeNi-lLmrd64{!a|!Osj&RdOtD7k43=sXAF&$Ohrvb-0riQK4*DFfrsRL;tCp*&hAZMYU7h4`^~K|JQT0u_%qt6s<8(F6;VSdu$WOM+T7)p%)cfm#Rpph%6+ypVKU+{>FmKw8fmTpfQD0Y76)5)0a=GE3 z{piAxPct}|HVu#K{IykqKt)}kE*ie>v>n0M`Ga+pMP-PAg(b^;Mnq&bHM(kQcwJoP zuP!SI1}Xz(R)S!3x?oAt)sSXNwI>tEya0ud@HtEsH5C=U9qct{;xP@qT8jv$Lm{bjYa<-w|8eO&zZP6v8! zNo`3oHl{Vnm~O;JuE^o7RABpvfBDu*fcwA^2^H0 zOM>M{RE*@AfGk?G<~fg&%+8sgmpgY}-fX9_&pcsLkYgT6;R%xzIbp(8aF%k4cqdF| zIBFe`;+!yPLT%uPNv4Z|!piLD2@~6R5k@KpIM28VS;DXUemg%#n?o2tz7P3NbPy}R z{-t4dG2Tx0jR@#(U<6l_6@?%VFDDD)?AZPTaQ^^8I9OSH)-)(3(|iu2x?rHTsHSw$G#?@@y9}>|{z>fEZto1~yO%zJ9ow9J{U5hu z+t>k|JI{BfZ@KTBV?=;$Z@9T%)V5DH8o0IIG)ARlb#r*3O6mfoi!j#H-!2s_tzCqT zmZP)Qh&54=i5-n$E=6}=*3;hF7Dho$&FX}`yr6_P-Ni3{$g@0$xAmaVlQm9P;|wTG z`HUcZvuEbcoQ3(&)+J(im1lAmg%$Q#m-10Zp_>F^4{CSPv zc(B;~WvZZTCvvF-BMvDDe>7YkuTH|YrXozNU!`_n_4+E8D*;E86J5!!R96O$@J@93 zTsbbkYlS_0GfXoqhH)Hz6Y!ge-|_fO!f!HuQ}COLpC7;eS1-Sf{$TZMZQgdM^B~WL z^g{-?KV`GF4W5s!o?8K9wJeam81e$hWvj<}wq=xr4h4e#p?Q2V=wN1;t&^@*6xE-EHGWZ zYsn9p)NmILsJ^qPm#MyK)GJiqRO(f#ZxZ#O>YLF2cvAldp4HDC$SgZBy8rQn1F8Lw zyAQbgA5ScNwl@*$e3=i?yU0%CU0Tn!U?AXre)^uZ^Z1&>>c8UQN9?a7q3h>kSL+yD zvY%ZMd1m?({qMQLpTTPSun5L63So`#63jfHSmGH$BPiJm5Q;2LYzw&;Csu?a!NjVN z`zbsPka!86lSu67-;SH@Pw4q2u33F;b)K1CXP2n(NuF)q5=3=zTjYl9JD41UiB&X1 z!Y^(cTD-W83BNb8yMLd02vhKf!i5##;}8i92k>G6a+ErrDx7g({sRQhOhD9->hr8G zV9iiSn*-w_n4c?HuQQxsgF1WNw&r;R8^o{qe~moHWN zhVlmxY32U=P{xCNjB@&O)1Mu9esF%@K{%K=RCUO3G4NP8jn8)M**EZ5-`}ylF@31w z(8@KRqQ)~V$JSVT4-5u7sQ-Ar<(KMfCj z61gF7`reldU+nb_g%?+Nww*hD_rUh`9^w`iBTjo@*Ru}+1VGVg208BMm?!$3JB^&-G*;vVZ2Ok%P2QZbH8N%k>gDFZ^{z-VQ*HVaJKjrxs~nWmtqJ?f`MCDO zg1%+v8M_8vV@~-u2ePw_3h`N&2>cS%{jy)BUcD^v@5KC%0{>aySD-FbZ$e!xdn?YD35ca?6ykk>%7S{K;)?V| ziWf6Ya+QjCrNHE2m#d4RHmGi>E7T28n`Di(Sv>>z8hKCR2DxPR%j#8_+$h(DTqjKL zR+WY{xn7Nh`bFi1I;i+M<`(rCfu}?Ls+tG&HdPJvo2m`!or;%i<)> zLH)M66Y9O{KcId`-4FGH-|>TZ<>^+{C#^(i$M>NDzGsL!f8s6SSph5DRY1@$Lt2`YP1lsD}mK4)taA7}VbifB!r6JmBA}pF#bN`X$sq%j=u_6nC4ws?wmo zrjCR97e$u&uPPtv8)`n(_tgrhhg1(#muofD1lM|~iLOmhQ(e6HDc$uIs2Q$Xp^kRl z33ZI?KcISC_dv~beIM!s*G{MtT`xdA-t}{+lVpbSZIp~VAWgxs#^w0X9m>xykUIA8wR_Dwz9CrLLFPPXz&JDP zKS5uuQHg2tnc>EjIH45Xxd;SdE6tsYC&3k_pL)TK>Guix;8x$1Kok1cK{rufyfEp5 zBe@cSzA&xm%bKp9OTmk#XKh8}PG9iah=hBK@!i+k(kuvf7zQ0(YXo5vzR3WG+uHg3 zc}7;4!HQ_c-4udjzID_U3iXO7x57~vICxuKzOOYs#gsRrbpyUHg+F{8Neng{2t8e0 zVQ{7ySv}EEI(V~&nAt)WGx~I&;c!)B@1^3?-7x5dW5Hl5-D?=gMH)hZ&2NTJq=$jz zgDd@hlesCBsi$`Z5YoE>2&Jj7qdc&cO_%)~gs>|NHJk12|7Y(_;G?R}{_%4&S%xGq z34}!mGQcR&fFvY9Fenoygg_DqgiQq!gg`(xv!H?~7@`bU)LONBt97Gl)z%iZY9&Ms zQY|Q2wQ7r7Wzo8{B5G~^-|utoow<`tBKEC)fA9a(liX*XbIx=2eS4lH)y=|iD;pU5 zr3w3Cr^y89)<&4jhb}9^WIc3L^ap#I zj&o>+;4;{XxwG-ooOP2s?vi8n2paBiuzabwWczpBEofg35&*z<3yD=;^t3GLo8ys)bRtAw;;=k9Ghj3Re$ zt^9Gk!cP#ICEBqA?gc)9{fvJ?_Jj!$-KO6^&OZ*8Z0McZuI$RG^emk@1p}S-djTOM z-Qj*cW;G+Tvoy;XuU22R12`&gjDyF_IN1TbU>-+NojuWZ0RQ23WF65cJAgUJ>Qn9G z9E+SgXU;Z9<2&FN-=H~_Uv=C8oC1P2c2!Wta;BCNbq8=W?03NaG)`xs*w!37dqrXh zz#u1sX0AoY}jZaVD$fsd-IaQovx>U17TL3I``y~zd541Cr2I7USa_b$){ zVV}dH1d1)IvwXe;G(n55vv7OE;@cL@4ljKi6g6Bg=*}MurjtWR({*}p2F?8zU1#CW z!d&Jzpy`2=KHr&KWlS-mrT1ENL4Pd3l*+0>We8i++ipjj=cX61vN}{W-Y30bf5i#V zA&b>_PJoUl+`m2nI#$o$od6yEd-nwB=--zoKqvKiDu^8_TE6&TpK}6q>;mSV03GY| z+7qDToMih6&~fT}^9j%~e!n^aI@XtGPk@f$zI_68=z`SoXmn9dKzfzn)-XP*&e}&Y z>_%8L4f5M9YPhHV*0;<2a`1c6c$Y2m-?@=V3K$D7bAQAkDln|{)f)< ztaHQgY2G&WkXZLEY;Y7JFXS}-|m9iwJVDVv0)zqWR%=@lW`ST$)L zPMJgcIOu21EWj?2CXQFUjDRJN)+XSHx~y!{v{@knw<-?I3}9bN6Ldq=0<)$RhU^o? zAf!!Fv(71>6e3R+ZQ=BgL3dR#Yx>MdVfQ@{V);3t_<7W}uQF?p&L zgH$<17o%j$s3(a+LG+>ysSL#_O|moOWpB}vz|PP6EZ-KNTpR z6etP#e-izljPooz5Bsaa>C+~KTn|taQCPNL>8fl}S%`F?syJs_07d0a^`clOUIL~F zWF2K|mLit!)cz>s^G4e4mZK7E0^N> zlMwZU37G1xS*(rHKy(F+>|KVsdfYp}IlNmcnQbcXmb$)V@YPP}o?E`c@rvo?%B!Jt z&FW>UimO9+IldH?=B`sc6R^^Auf>;zJDg$M4f_==(b5bm*hb7NNGPE)KdDiVV{KnwB z0^daF--df+p!-~WSVncb0pSOLug7;L^e-U%Ucgu2!*s6Oukg$K+=g!|^nZtYY!tdN zi*ol-ek7$=LJshC_{PBg8HDcvz7*f7(BFe!=J%EOilBcF?z;hBh!4xrZa+l$i-BK; z?`-H_L-<&BxUqHTJ_Gtk@!JF6HTb4M{|~GDF|&2!YPGx3D*p?i&xZYO_|Nz*!Z#TD zpW+wOH}__I1<=0yWT4QOQ0VI{qt7&FNgj#=zob{#y5y>3iKbtJ3-Dn%+3ovQ`EP{&Ea?Ae zmH#T}M?n7@{IWi6$5#gZ=Wx&RXPxPV^tV{$Uk5$Pq1#hd`7=+4LVpK-N#BSs0R3O! zp5=cYKIC(^o2>HR0DV66f3V8`0_ah%yY0j;>ywGE1o~re&-7qs?C$F*|BIj>3;W+& z<-ZL2VbI@;Uxs%TzRA%474DgzmH5zZyZzWI|I4AD0R5k=@?Qh}Na%lyU)HB<@lA*R zpI_1bo8dppzY3oh^ta$w;oF4I5B(dkXZg>=*AMz{S>=B*^m))fXO({q^cm3q0>3P; zt@w(e{|N3`{++e|r>*i|0vaFae}-SuZ^2gx{b9JLfAjIBL;pRi{4a%mJoK+v<-Zd8 z;m|*f-(-AO<12;!Gq`7YcGmu%w95Z{&X^@sjOtNhnP ze%uKIh;&3HoohYyStV@?Q@7(_sGqei`2&zA4cE4enW<01no~f3 zH-4F4P5353e-!Rn{tNI8g#HIs`EP{&Ea+dg%6}E~BcOi-zuoa|$5#gZ7jVz=@2vf| zTIIhOG($muCw@uah%W&ByKv9)KM&sk=)Yr?{|4yup?}FL{|lhcg#JPNCgC&jl|cU~ z+%r9$wf}uq`7Z;_FwozJUxs%TzRA#k0QbyKyZ!&fDu28E|Jf@4HJ}*@`p5C>!FMgb z>Cm^S6zq=ojWdj1U;#NG&PYj(i&H1X8L_?N3e>$Bm z{&9x8PuynZN7Per=GixHGu)p<_x)1i66ij@cibYnuS$uFrF&OeTsGZj^^EII_sMQVw<`fHneewis@M_W@Ro+v|=zvG%y3h4Vu`Tr}LkyA7@TX&u^|D6)f%- zoSGJ#>JCor7jy@UV}r%X!D4T)*cU9$3Kr*X-R^Fww68! zN-Gxv=6hi@TLg>Bg9r=))FPg{$vx{t5pbI%=l99Nsj0j0bL*k}piGflGMEnocPVsd z@DY_+_;va4Yb#WAQM7X^>OZm!z<`X=2`SqRechT8GPY)gGpq4T1=*t63Ua!N$?7UO z5J2xHj1V+WP9|5gpdp5q3}t(bb}WiE31n%SJU6E;ztywl7ckhAm+fiV0i^L#Us|50 z=|?~*V?8B1ySflu@$-4Fdc)+va$| z;|HuZ-3uT32a2Gwh1aO^_XUg6Hzouxc7OWH(Ny!f=Fej%Hhz{BEO&2oHNN3#{LFo6 z-^R~8m-n0#EKUzzJp2#?0dv2Fl`ZA)9KQO%K_qxt`a&t!%9e*d7r)Wy4g zx_EUnAQPD;!q{aMGO_*8&fih4?JUEL5 z`~)Af%2woi`6oD~!FjqiF*csH&;X1Do#iw2ZtDdMVdTE@Tx+O%4TTviJ z=_aQ(h72iNho<)R9i~WU8!?@2#1f^!GW|)y&X!oB)I8>du6e|C_S$iUfhg^31vxb( zn+wvx?({=5Fr1xdLxx$BZe3_K%QDdY&1jpg`@djdctc|7dS}bH4c>-cAeOt{2i^>B z$Ovxm1uMMf#uT%}oB65vRDN^q=_Z)AZ5W>Uk=fjQIOcD+n|m7HaQ*Ez5Wu6>Kn7zI zEb-wkX-j5F2Ck~(%JaH-Q+~~g3^;`cuFuiE9*)WU5bpPC_aMt`uFufEn|sXXGC$P* zYx~MzAj1rJ7X|}9GE-_XH&E;P%zP<-KO%}=UI%Sf`11GH#krmfR`?Jhl9oyaVM>UK zf{7L~Uk^MZfF}uev=Jht$|Iv@if}kh#m!Nc@*KcE!n3EZoCWj~Zaw{l$MJBv?J`1o z*nzmUsqk#$CxC-+pHeBW^rwS`YuXU?Dolo|KLPsGUjT=z!+;~y5x`-%%Sf^Hd>nC_ z+%O$3H~U6}D)w!#w-rymsaTP1rPIc)M4y1r+_uLw4n3&WVVQtCjBcD?8KAN)EeNZr?58V#DbBe z30qXCIk9y0Z8&23HXJeCOzhk;RJ??%smUw7@x8pJT@{`!JA2_W^t|+@S3O(qCR&`_ z^t5No%|ILTR6~+k91DHZb=2o4HN>~NlHob1%!;hp<^{QP%&fWQ#j&X68D=q1OJ7VgKHh(_IMAn?0^ZxAFn%iM8 zkhUUbJ1)aNg+K=Zj5f`Rv>EnD)DQMS@Lg3L7nCfeiny19STo1RUdyX$%Rz7*qKN~<4hZrrkd89t#a zX+9K-8|x{J2R)6u+>P(Y<~OfP!_cTn3pDA^K^l%ZJekMXP0WIqaPR(ff8)UzOxGIs zbPKu|X+(DueMe~Ys@3v_Z2FjYr^&uT40MiWA7PBNT^SJB7%sp&2K_od?k_WGv zc6pj^#|)y?#r{ZA=#!{N8lL9*IQA2zO&P`!>mZ13hb$iWWv|6q!1PtLAwOME?>-*BS|xb|$1 zO=TNL;OG(xvUKBO*UqY#jMCh)9l<$c74ANeWuaJM$ygre*>V?%%|I-wP(Sn8#y1iU z9LYS~>S8y<_#8e>qVCc)`!Z;vWtdAc>vePQb4MEAFwEVJ2VG@gZyPL$y{OLW)SHjQ zw7QUT@wM^&n8W*#Gc*ho!cesa^z0YMOQMt6Z>y^(G>irv{KRtLLh}k4Zi6AJm)$M3 zy0Dt1x3;4dw6~LmBA|KQ>D#A3&V*;neXxv{9HFwxAAQiL&z-^=(0n)rTN)9SARZpD z9P)G_paQcHO7f(g;Q3Y~T2%f%w9c@k{5BdIn>MdWI)g8KJo&$kO%v zuO9E4_yFxvyqn_Vt~AhQ;Dr*+9BtVP0=DN2dWAN9xB<1H@yi~%%=SVPEs;I!GHZNe zQ1g+v&CLeJJ#%-kWM1Pz8u&R2^#lX+&A`0I=Gf*Vv5oKdIO}8(1xscz8$DNjfb=$Q zn18b8s&|032C4wj;Lxk1tE$Q`nN@dAnuriW=xAVj5gg zRr}8NMs6}~FIf^af`P*A-#&zqXy*1nY59y+SwF4lwLMT%Za3js>?`}ByTU9%UYvzS z(|%Z=IqKSBZjpu(jmZKMJ)6tkq%US*UN77yKRCU5rad@}z@l%Rjz zcvivT@WUz{5OYrB+8=gO#6HvMjs*<27d?S^_%RwTJu5}k&GhViHvcedSly}g^JVmS zwx2N6o)&?^>h^2@xD?JOvY{gv@#?Xp#tc;XnbW~Q)!||kaYGIK++Glqe@MK|)boeS zqk62#Y`?<*d1PQ`*6eJ1o>ojIaD~6g5O~CR8L=pac zX8Ch@A?7OY`*-;M$i&E0HPLz3{?!LOJuc$8Qt>=|*FR7Vf3Azc_ z)--x&c?C4(@KW?YW?%`cexTT@_-4ht?Sb<08D`1+R#}0}*j`wH>K}86sf05}^^cea zo&?WykKEW6Ut7Hyy%LvawdWxxOOdJ!?Cs(Qo4YB&tRUw96~U~Hu}|$4?Ruy;TP7d?C5&r@Qv+diSJWyXces-Qlf=7UPUM zypURdGps~{0e`ED-KiO1ot}i2a|#o%9o8LNPQYJewVGGW62F~K*w!pDGi6K}!JLEKWAH2*(8AV<}Aj316pD0PA0R2BE>@t@a9xUls zkL6YhmaMSMXxc^6^7^FAJ=PY)(QY9W1ok=t({)Vp8F$2VINZbG?uL_3k>$bO<~Pt8 zp<=GY@&G#$&F0?b!~M_)1=7F*Jv=QwTBVmNTu5>c+)Ckh1ci^DEmvEKl@$ujzapLa z75(Zfm`H0V(<7Jc^?0t#{cBsBKJS6Zh{h-KS{M~3+8!Y=IAm2~oLGpVVFAVoVQ(Rn z;dpYhoZCalb9K~BOosS&K3QW8_C1ly6q*y3!6J8X4ht0- z=-P)6QKqB8+ap`bWo~_{IVTw_;mnsTUh^2>r(sttEpwk$##pkkK#Q`l;xc=E`tpEX zIZrnp^f!K<QHq8)#KP|cuG3;0PD1>1QBqAia6rmPLp+KV zX;{EO5+J!Q7(Du4S63khzs3h{27nLXOH*Hju!ShuUy5xI7)M}8-2!%x(Cr7t`C+{3 zgAPd3@vZ-zVn&X5+P_Cb*bsEp+KipH#-0mdMHpMO*}Wkw6T>r4OygAnFm3x1Fdc*W znD5*qwi|$9I8F(1;@$-u4@+cSVQ z3bq!WT`t(>5VjMTcJU0bOU0HutlDfKFrI71t4d(p`b|?GV_nS?De&ya+IWp%X;_6_ zAlPMCn&`9zf!!l6UIA7uw)t3MFB0rsV5MR^qnGXCd|=weeqg^6x)*@$5bR}Ow+Z$d zuv-N?2<)eVy$$RZ!43htS+Mtj{Y0=2f&EypzXSWeV8?-dPq2Rg`>tR}p73aoSFymZ z5i{IDl+%WIl?*H>W+}k73YG?JlVJUTtrILA*oA_5fvpwH2W+Ka8Ng};8xCxlU|GPH z3YH7(e8KX7Efj1#umytoft@EjgUpP^;b|C-Nk)Xd>?r znh#PY;9#K~VjZ!vhMoeR5F+=%)&r~A;XQ^DkIqF=%xvC0qo>~fct}+47Q%?cTSI+=0P|pKaDi>O1l^PDX zNRd0{`RYu-C2AsIwORqVOx*-nqkasyLfrG6dT5(pqU40Mm8g)D1wQ3jOb&A|EzNMZ3yk5Nwc!O|pxk-3R zd*`F z5&RCpcMARp;4|tez-JYORHnjZJ_z7>@$pWIO@*ed9Rb4~$+IF@I=W z0Qh604)A7UBj7DY6W~vc>i};vZUnr;_#xn(#_fPRjJpBvGJXkoxA7|AJ;sNCKR3Pr zywB*4vG;zXAK)*Ifq=g@h5|ll@Vx6GV>IBy#(2Qr7-s`MVoU*i)F=Ub%$N)KxWV`Q zyNu<4%?7#Av=|oyK4Dx2_@uENu+{hh;2z@^z^9G-0e@%g27JbN2Jl(qb->>nZvyT& z{tEb<@ejb~4c;R;V8jEyU?c(l!N7AlNPL+L__8q_@D*bY;2(|i0ADqh0={ni81PTV z9e{5c&jY?~ybkymKQ<--4pQZSu`%ZW z4vtv>c$eA;c(-a4ldAwfF|Gyt%(xNo3*$$C|1f?6_)p_bz#cKb1@y$c4ww@2F<@%U z7l1u+Bb|Q60j9+y1NM&T3)m+n9k6dqCSbpqGXPJDIU8_5%o@OfG1mf~9CJV5pctNd z503eb;JXEX3b2oQMsRfJauw+|{Mw2y-}9hB2NF_fwsNz8zx2gvpNA1u+oClByQH1{ zEn=^ID}{Z1RC_cpsOk9DMzu#VLwzKW_bDQ8EHciF8&h??CMBhHdkmLBl2MEy)lM50 z0z@9+V{@D`TeS%;tA*q}(qwdm%vLeUaY}I&lL-0D+8?KQA(&*3&CbD_8(aQ4qg%PM zdeOS-$l$Waj&@2R5{G$C0dzFU%XSK%6_XsND0MLz)4^nH2a~+^CgZZ&B`teg_SkkY z95<>1&8T*nmOXBC2cJiGa0LMf5m^ma?TRCN+?Woo@;cCrYnL0NvcU*H!e@w@Z|7>% zsIl!`lDq6oFA1lI;-Qo7czcgv#7_nbY(+b4KAG}rBXx` z7eJKN#JeyQBjrUqU0S z1~n8rNP|5v7=mzW)~wV_vfhIMqf%?#?%fYP0}e6CdKm_c*~;prT5dR_rVUo3i6y1} z-O@v%6hnB%($=s>+eu-hRxYa39vlP(gIJ5S+PCJoV9?imi0NxS#1g^$O)p)O(@fZU3+4QvUoUO%y>*gED@6$y%Ry=L zCUn2FutW@%dij}zAyQ+B9O`5tnuH-vV~N6I@Mdv)2xi0*)iGdPk|wFoEi6$Uk8p9C zq>`~PleW7PD;@h8vK;t`{@1HYAoPEDf&_vwLAiEKzZDWSf}n zvam#9aTpXcF2;x@s)N9|P)<^BTUes{7}$kkcFe*ORVTUer62#gErBz3-pC8~#janORaUkgjb z5U_YnZEf}9dM~b+E~~HcF0QFwe1XFl7wHy-4A(7MxqOM2x8xSBUR>?1U$e%$bWyGM z{6*rVoh=#n!6R+D5)!#<7p)v=hvKxe{j2lxqJMN3k#^wsXUDg;dTsThdc~-$TD1BS z+jvcFIGS~rtU71|#8n%e3m-t+Nl^#Yq9x;NOj^A}I(+)r;eiMf zmVliMtOD>Q$zC8aHU&L{+X<=hi?nb3yJve`!7|cb#3wLwB8V65xZkVWLXCmEDpFNB7_Z zH{B364_K*~{T`4H1z6}O0Vd!sG4p36V3J&vPZnwIUR41TTc$HRu2fYE=mjHoN_t`* z_ZBJ7eWddqXx&==snFaC*dIG730e?KQ_x*l_@&vi(n|=a$X~jKc_3q`kDm&?@1~ zc9oWKrZ-I04Vn}fdKBTbS5aMGxO{Ov8u_AHJ&9s$L)F)QYSIG^mxSqP%s4dQqj9Np z+Xx2RxG-Wi=-CW0J)0q>D?1}Z+-gxWi@^l zGvL+DZyBh*o}EWFx8U}c%0JrRDma?D<@tI%Q9Ii0H;i)TbGTzV%a`oW-(B0X;Jl!x zU-ex zTZXp%O;Utf7w%UgFOb`QGSr*GMO1gm>cw@{i)zuacjs+!cyf}Gc_lB8d!g;8II-mf zngOshFtmk=ff=Ct9Adi9A*PGL4ixoPg4ERdi3LPSZ#f7`JhkA>@fV3sLWeQ;aW~M0 z9^*FT)^)424z5}n^9RnU$91V(TpH(liG%}hX5u6>zqQph5ac||3*^=g{w=5H=KgJg ztgVH~X}B_i+t02)6y(1Y3}n?E4p!uD-%vGUJ8n+!j!#&4wOJNxHYnOj$7O;W`fO#E zxzR!G0SEJj*x+mxEOVO)=+YXG$C@9ZzeCil{%&KMzA+BVAl}0TH>OoC(03@M3s!}N=_!P0<+NsAqVeOkV)V4Qr|YvuXD5x`UB zRmCt_9wbOV6@Dmm8|-a$%tBZ{Y{eQ$J$tObTZXoM`yT84cJ_~pp0$9zCi!M-WxLn* zx_`=p)tyo8bse{x16IhX7Mc7o&Ws~_-;Tp<1zJVNah7d>vEpjaDPx{xr@JCzx+@~4 z+kl-r5V#>x($qMf<=~iZ`Z<^B-I&)MeDRBOo1Sinm+LPrp|`D!p;j(Li6fU6FdnBq z#Mz_A%P8i;84q#h65aUl+3Iu)v2)Nir{2yX?0ZDyknM)PM$e)0HIP=@F`Mijnvu}2 zw20|fTEuj=*xs{(P-*H4yt;yL1kOjg!3HzFw5DTt#{mL!q4X0U6D{)c62iMgISKS^ zc}>ua+1B&a8EyN`LpV8adcS@oE|j3hf4UwwNz(Dg)Owk%r7zds3^=lu=xnDhcW$=^IEtV=di}C z9S^7nlO8f(Ns$F{Piu~H5p2^`6JT#SCG-h@|NgQ#93YF-bnvd{?1Y2k$s!GXkhFU* z&OLalm^8Wz)nM3Ax%H1g#+9_R;uZmwZO@)SKikx; zv0oH>!=k1?Jh7y5y0>R4ewec#qq6P)DFb8IJptoPznQA7DjGmDs>=0?$x%ydNJA6hsHKf);>-=kN9V?7%Z>iAb3-recs0Nl zV9xNuu5OQX<;ab0u!+o#jsmFJj$KB7Kr)Da>HVP}bj%H$iGt?mg!rh)|3a&J>lYHk zkQM7oT-0GYp3-9st8LL0!u3z`Dx=oeXBYvoKS!_p~z#I}}SJEg3r zLK8|U{R+E!Gt!l#OgUwWOsS5cGo`Hm5K(K;lR@f_*Oe{mm{RteE`x)FU8XqnpaZCD z^$*rKUeHW~j(+X%TE-EzmtpCYjsi_s*(v3OS7<^hrC(uJm65I-DeVcDktx+Nbf&bI z&~Sf^Y`4Gvt@99BdgyG+u!KKkzg-553MXlRHkW*D!rIH}1N|Z!Z>_8o8Fd_yk+8)0 zM}Rzz)h49DIga8nt-}N}c^=|w6X)pA8?IeOUmbutr|c7~Q)FC+$6qdbfsS$JxZpAvE2{f%y6i7ue56j!-5Uc@e@uC;H0)}qRY^#r^9M)C zidS;fk)gAET?TWB>N^RSSBG6)Z@D6kMtQMKE3XwF z9AqnAKeEdUq9Rcfc#SD+f)iM|Ak{I>>?w5rOkZ=7@1AIfglkq-SfpXv)dI zyr6OMK7^=S&!~3Pgzi>n=Y^g22dBo0SH8kA#L2Sag)oN+@|oAg946UHE|b|N5RnUi z3e%i4IMAYOO3;CRf6MVVS7dF8uzg!cvO>m`QG&XPHmu->_$-hd@uEHj`KcN1A@(7uX z#T^5+B4px>^AL%%U88>c=fN1_tfExQtT>ZK;>_C%a_v(4?DS`-_`@EC>eXHW#MAcY z2bMpi!CY$*1(LF5Pph==ot+pIfd- zgV1rbWQVOow=QqUlGV;J3RFhBfYwUs`AfxT0-EUYlp>kJ${tUrpzjcx(0IxbE9~k_ zjB{b-oFknIDiHSUa50~vsa-BrIdb!T@^>Va?Bh~16^cFbqt*;MW+Co{e;*O z-tbY~_>L*f6dDQ$uv2<^D5d#U=%-6c=?^~&8qms_Qii2dIxRBJR!TYI2~8-a^egOY zb)+jtN{53kGNn3(&XkT2nwfxHzq>E}eo@Dio*^`k5RwdPL@1>*tk6dwr7q)j*wL@% z>7=4^rj%jnlwKYgXDg*#NeE3SrSvQ8>bgi*j+BlBU1Umi44o;>5}IR#-~;vYi^sXG$5CPU#Jiakf&*QCet1DWzXwSC2%x za-?(==ps|9W9Uq2j?l1%aC4}1>$LqHQ;Goz{xlJi3@Rs-(iK+dIg(OLO{BK@W(gU9 zGo=hmr?fRP&Q?m@uos$8N*S-Pt7ju!IZ}#Fyj@Cl44o;(&;lC0&(v4d-1+UZJEjza zC}=3?!A|LzP)aYgLLVb3C95L(r3FU7Swu=1mQLyOk#V+C%JD~NLMf$RVOPf@T{%*U zfvsIibquZkS@Io|C(tYbj8sARIzeu5IYofkQpGeYF|l!QC9`aCvIWEFmiF>Tb7{17 z7XLh_wo+9(d{&haJequ=tBAhrv7^SQ2@@&<{>rS0#r~qnB_&fQPY?J*H&rH#)|W^o zjF!796MO{){*Z$rf7zrdlP48VoaA)CODs{zr~4-b%F7C-Po4~NxsWkow0#|A!f0G7 znJ^j`Tqca>4VTD(Ci_b#mQ0y8rKCKXOI|UFq%ZRq6&011Pn^hoe^Goie3ta>0~ood+7tS&4sQSy_3}L}Y&` zuDEg&&Uk(4CL*lBB*bmXcUgxo6QWp{FiG}|1sey@83Jb%|EOK7- ziKImWr%x*>om5`t*Ee}kqiPpV7;Rqxilm@_9PCbW>OVOc5s3?*Fzre(pZ?~MvPsxCeO(87#I05-pDe>w{D;s?q;Rkt6>j2_uc~jjx!E)A~YRxd|REvF3c=tf|{e zQ@=24G~b4`$)-QW+>`mcY1_ACwc+&I^?R@+$TcVVz&BSDGg;i{GO)1 zm>84sgF*~unPej|>%c*{O#$PS;-RhJoWPg~XORdW8h#7Xlp?TN+8TfO`{*YvH)P2H zpX$ftzg*YTvvY;S@g0fPmyFe(#~9dwcR)U?Z0HBBXTeZ_teX%vqW1EMCT%=I_eDt> zl65wdm4g`B$?{9G{2h|z>yWG+DfPR<>BxT>@dBH~P%03Aosj5hlkm*LNXR>xFC%TZ z%n1&ZE*g9QUklBrGMm9324J1t^$;xckRhsDV)@1f&Iy1i~0v}=%BX) zL9}K~fz$DsjLj@~>^BcNyiE@WUe`~16}Dxuo4?PL$Tc31SvPij`Iisfeb-%gefp+( zbl`Lldkbu;qo zeYu`1n!(cI=p?uOFhgb~CrLE> z%R%7)nHLNcuKy>?J3Fsj&>kWO?>;$@KUEIchsh0^47ooyLLOqAp>BqsBZX%{mhd&m z#(QZl+MfU%t$qiXC$~?=sXqXpp#BK>DBdvRji%zQmb386m*&F&{pt+B0yP?NB3|v{ zZ7$yH@@n~1z)5&#%j@4f=$nE!vAnxn3s|N$08W#4`P1=Q6>o6mUH(jwSwBl=cysZl zl<(<(0r*R4=?~y_B`?tP*~+IJwEFCO{M{#3v!bsFGed81#g zCIMfj$^dKBIe^R6d4MZKzWo}t9QayQ3wWVg4_GUYPwLclz#G(!fa?_d!1d~8zzu2# z;HBywz>VrxfS0LVfSc5lfSc7`z$@grNuzodc$0b;@GA8l;8yh!;CA&lz-!c}fY+)v z!0Qy`SfHE|0l%$0fHx?1-QQ7JfZtVP0ly~?NPeIy#C$H`k5nb#kJVDZpQu%UH>*0p zTU7(#ZE6$X9qKB;JJmISJJgMUKT|&hyi45%+aKG># zI3TY$`Noz;4hT;FX>VA!#~BX!B(%5JbM)}tL%cgo1!+hz&UDLE zeUH<5t*pB=daJ+_e%`rc4X-5QwA=P%$r>)fBkpa9C=L5zU<3Ta)1KOTIMUDQ$dO+2 zqo)a9=#l24TD;~#?-721w`Q$4`OqR*vT9M?1rp8^FbTa2q#t}2D1OL`7rxRX2~8w! zB;n)2jR<(9yddKBQu|F}H5Q|!;L|}mSt;R=0_(2OC2U5FuMNG(COi$K1M()4P~{Fc zP58Kwfh>_g7!N*#q!W29$g6DjYe9>TID_FmYSNrvy$q$TuiP_t_0=|F`f3}oL~vcu zmphW=t}hQt6BWC1t^kw3OF?6NgmvPNq`VSe+l9TQ68RJh-pi_$i?|q-fK>8UG-HXV z|HrP>u}BSP7C7-m%8+?6`6>LZnNJ&(=>o1<(;T*dbs{cD^Vpco>y_L)a6gR6PA zH7b|1_c}bzCMNgW@<45*N;R^_n zmnNoIu1FKJ~J$W8|{Hrh7%GcdQet0FgFzvd3Ey*2rDH;TXh zmb6dz>%QzUxmgMt^!mU@jaDPGM~`xBw0Xa3r!9MQE|&gO+-d7CJ8gZlHK#0QbhMo| zADfF)McHYq0ZrtQC3*nvv^g%i&UmRKS_1@DBRksNsH&M%V+}pOpSaH5i|S+b*Bk zyUaX;6k*lb4&>SspyPOUKD!KCL%0Edc} zFRTZdCqTz)R~(Hl%FgV0pu51L?W`W~Ftov<*&)Apbr3~X{jH#T8TK2pfIxLs@4p9{ zpILOFa2@?5-7mrSfJH++72EIss;qh*$^Bb)g!$6*|LBhJe^{t_M_J?FOumJ~$+4uI ze?tWn-tx}P@{aH>^qv(Z=#O-T$6L>Y)U_$p1f~~G(h||BHz=Z83qhy0y*%}HLdruj z$!&Sywh(fA2VKh-x3|}$iuCJli@7{!8KlBG7U=%apkbvL+3i$r7fbV?N2ds1cE8rXLFJ02u=DECb+(K_~p+h9~!i;eXyAny= zqUEu2BmBIUU{N}RX?32ZGIN-%m?J+ZlveyyqIZ80jjN1eF zeyT}SGOJ`dEWlB0jwZ$KN;=CsEeaUt0(>^Hi(9{TX5p^Lhu}R&W+g*F!>b&goiP+Vi+c|# z(;6YDZO=rw6nRoG;f0a{Ej_?hSgx08_Ar$by0@5JSjoab}ihs2aX z9`oI^g*PmkjzJg@GM@L#d<}!(Zv1v+BN(}av!B6vwovwCQ(MC@bAy*v0k@3imd`*8 zhC^N$C33?-DcQs9@-*EA(sA`Z-?~^h^^Ln!FhKb3Bl{VI=fzDa%GxG-78I;kOIxJ4 zHcD2k_oYK%(Q(8{q>)k5B4nmQa91;;4@(g6j+z%@h&)Z>FehQDZV<35v zm8q^+suOalJhD0+01W~{?xrG6lEbV{OsH!&>lvz552Q_3soy}h>TXD6l$$gV%V_Qm z2Ilb>h7cee3+au)z$}P_D~OQLIA3!4s=;vxtGV$wL^Spx8o*to)<6}as@7e~dOuZ5 zckQI+XE3TrL9~hxuK9LFD1ijVjL)Sm#Q)XxYnJ zJkenaUV+>@SIImp6Tou_d#EG~OPYh+HA*UzyMQ8RE@NGFsCQuXj4aMr`UzvJcd(06 zF5^Ks(?oU*@Z4ey#B!ZF6ykCV%~6aBC9R5tlZ8h8v9ksB6gopl+Hi z9qm}d03@kn^YCohf-ydN8RdV#Iu&ZGkDzl3RGIq@99fF$ce<9S8K}zqK!lG4167B2 zU>jXe;?S&ojjb_=L8+FO+j;o0UnhLDbHu?ZACk{GJr5QJP(xscO6?K>jxp@m4x&7f z8>tP;woj&D$f>BN1CUeWrIViN=p{T`HlhYZ&jxs$ChqOrsC@`IfoynK1WF-DTV^DJ zq0GoqNW1Jjy=h+&kR?!(*&Yh0y->-0tw=0uD{f70n8zBq4{{@2$MZj9v%P2%Myo+6 zBj3>ktNf!#mxN$eI<0cG=I`-baTd~Y^klfnweR&MA)|7m$(7u&B$z-ss3zs0&Y&FB zR&b|7?gi$}Ef-0sMnp@3pRAqsB|;fp4!_Obq_5=%q+C*@q!uR$38-^}6~*P-XO+~< zY%f)^KFZ+mJ$PlwmHcPC=ZY`Ao>?UdZZUT z0>=e>5cyS?VD8U+4l{>x&8O4^Xs8 zxn}hf@ic8OyVcntEbF2}_#0-gx+c0&&oF+5x&#h3DX!=ItdSAkv()WA=Y{+i8QY6) zAu(lCHX}nQ;qYPnLe$$H^bH{J$t_IRKFmkbW4U`F{m73FUcAJVlVr2EapM5;YIEM-hH9nPh+7v#>0+%eLsee!s|F5 zBKWlY3;dxjhBLtuzq!G_*v`^9f=R`Oyv)Na?XXl#v!vKAdTTUTx8%Am%IXF^U?C1? zA}X9dylYo5SF1JJl(!#kiX%oFsapR+m4Yu6qIyDA>U}ic|8bQnK7lHg`GF-pGfLNT zHY1^{9Lrf`Xx1-BQHN*09Sb>!j=okQkGF0_hYESTRmiN-KGdr8{5=Dn9=b0RlA*`1 zixSV9*ylww1I%vuh5~X6In8a?3|dLfN)&(?PfGvBgf)L(od;fcw~sgIQ)ctgL|Aw; zk5i{*ZgMIdV>UyaW=Y;@Fx}=M#a7Q`wjZEAX-U3@cP;suD>%31atn(s&y_#>xUKDR z@+^dhxrkU=aBXbRZMJIBgWeVlXh_uy!!w(C8@*Vj z_jd6r;lScsk}ST2^$Rf6RK z<6cm_8V{^OFh8(Kf)xTABUmx8(SlJzQm$Z2fGrfP2G|0@Rsx$Z*jixc2{sB)t5jk6 z)kp5<^p$sv{p8i+Ny5UQzwq52An`s~(lH1U?*g7CoO3gU zN9Az!9!y5aUeg&W9{C>-?vRBdkRqVS9H|g;t7tx7@I`=rwGyyE?$Zb4?PMXOMKNEu z0ZxJZBFeC1UsR%w1C~OL5O3bQVpuW>fU`xuUO~ItGfVypza6!q2dwok5m%ikJZV5x2j=)x2chUx2w^BcPc;N z4)ra-pQ#%G?@_k{-mC5eyia`&c)$85-~*~ZYVxnuNWkAHKj0&3Cg8QI8t^l<4Dcta z7Vs8T54clZ4)~yI0^Fsp18i2`27E$22>7IW1n?>KIN%=jBH&*265z9{4e&YTMZ0)G zoeKD}$_IQ!%>?|TssemfEdzW_tpP5hJ zR4yjHZ>v1OcU3XqQMC~8J+%e!ef6o}UjTlf47A0MlpFA4l?wQYN(cN*O$Yp3%>(>G zEd~6CS_$~2x)9JX8US6!2EbTj6QJAJ0@%&C7BJDc5irU4KA^|A88F58DPXGccfg)T zEIOoKMk?S*h7Yj6kp(!wxK{9Q0}eEP065tA1>g|lCBUJ^RP+=>jA?+U7_$I}84Cb2 zjB3EsjJ1HL8|wfwjSYY!j4J@M3==Th*bX?#cm*)WI1HF;90MF{bVr|)XY>OcXPnIb z#~2FeH|78q81n%q8cP8K#wx%kmi-u-qqOL z_B7)eo`F^0f@ks#%Ku@RCO6?zw9ON_ET{uq8-^ zL`0DwLPQjwurRJp5mBs-`Y42$J_;e0D1xCl6G~E_0uoD<+0pr8#_^X}B6=h}cS;f# zn2W@WuR5!Q&TC+7iI6R6i~Kpq!V*P3E$19b>H?S% zOBBISoP8vzjW8pYD1xCl*GZDsa>NqVk6_DLPZDG{YAjLR2W*m`0&2*Ae++hiQxCiT2(m z(ypV3Av=bQm@OSBLSoU0iVs4*D0W0_UU4c}x*=V~Y*{`-A*=_FRKb|thfS>BGr))) zyxXzw(ot;BYWk*-@%Z`zy3}C6SW9?MCh!C`956=uRQ&>or>2GYY{lM`3e`TO=p*&~ z&9+RP_BOTM)1tddwaDa$e$p)y){##>Pc^#~+QVdN0UE@#01aZSRJ!};uPwAkQ!{%1 zOZ>v+GV)?Z3F@1B+{A|zk;?gm0`p-^mG00Z=vVR!_tGQKiYwykY=O3k^U(!^bs4_` z9D-$c>4ooEcqxztFOyNn<>?g zl7`q`$glk5sk**vm#caP_N_7mK zHHz)nWw00IW0s$u`uWC=H43wF(C|^qU@I)mjhmYFArqE6TOR%5;~1^LnK(Op9Ja(U zNtCcC6_XPk#VM}C1gm*YhP4UZUWJd7XKmtaUz|90_7v_rbP7e9$Om-r3a)rRf-3Ua z-E-Pd9^yy3LL}iT-Lj8-;%8VDh%}L|c%I!Ezg|84ruZ(pqT=&;t&oSp4VV0B$-Ve~%N1!NU9s_Y#=ZDm%N1!NUG)-IyrM)E$#qx@ z^V0lHb=oOQQY$O%oI1-!M8~wV`E{eHktP^#IqlS;qt1^aS6yyV*(S0|k*y@#1T+XM*FiICR4&3Q z51Bao4Z6}jYieqqc!NF_n z;(xr_vESh3G?#HJA<3Zn$^|Q8Emr7#70TUM3lsXKA5+oZnNo(OQ@SKF&JK>1LK8|U z{R+FfAkvkihh!~{OsS5claC|EvS<%f55U)sd>lEU`nU0Nq-XlhStQFw$CWhYx21WcJuxuS0#+JLOSh zMvco6dcIShEAN!|7K85zIzFms@09Q1IP6qW-YL()Jnj#m8*WV>IR)Z7N9QDfUT_Ll zW6@Ag88Y z)k%8)0lHI9#%}f?AW&U}>jzD_Mb}xlH^7f`LGxF9r+ax?78f zV3Zj?s?NgYE`}F0CHQ9JGdcN7YrhuY%^NMb}xl+!y=Aq8WS|eT@E|o{P;Hu>YOVbRF(t(0pdm zbrvq`l?z}5zOnc^tItn?ZZ_-(umM1ImELinnPSm(7H%H=r~r+L?*V+Vouv0c(7grw z?=yp-x(fFp(Co43ItzCa{CFNTeMeyGiZ8a4aqx$r+W`B%XE4;R!yOHpNfupa;rbK{62TD|%Jbe=45E5b(=N^d*988lDN7LpK%#vg+58PtI;#qV6~(1R3w zUeIM(w4J46DCo`v%>sPO@EPcNqow0=(3!ALWJ87urNgoGpgF_M08O4n*IBp?F*uh5 z&4an%BR3lTv^pbdxHI6vomgfbA4}gI;kL^^P9OTP5;|10{ELTuW;D7e>EM=5fkoR{ zIv8#VXsYn7z}Hznel_SWg*_kpQgxMor-EjTMb}xlbKr*`G&kXU9$$PX<@PA(j=}zy zXEIbrxb5=K4ZHmojSvDz{zb``mqB;PqU|hx*P?ts2F>QPa6XSO33ouE)hmj*XqbTe z6n-6QSNU=)XdbZWItv#=hk6V&Z{d3%UuXSa5Ohfe;C+LSs;h8+37Xv&odMcte zRu-YZnk>O~8SVw3*xoR=yimA))KbAI8P#SN>fSJ&5h7p-361v~os<*S#~&0n$( z+UnZ*h1GQz)UR1Pf6=OoFP^`CzqPl7RIlvmfTUbM1O zv-eDfG4E}xTeEx#d3m~1cYp}4^wZENCJ{Vlx?9edtuI1r!6`_X|NBy$IJi@L!?%!U zHnjw{6iT?; zIyH1!GzDEPBQk_GrE69%Q(koB9D99YA3HI$e|DY$h%(wycui;8E|C_isYl?RKG4}liXs8Y_NQGG&dQ64Uqw6zwc zP%qbx3w_Bm%jZ~h$qQTL+U~*@t{t#ltxL{t;>En1bwPyZw#jl; z!-H#=oZg))lvRQw+vMt2A%1PO$U>5B1N_o=((<;DW zmRhzRQfbyMs$I0IPHx~Z2v#(aB27lDZWypiudH5Iy;ANFF;tqM>OlF&woMg`Nw-$}3U)!c8!~L;lZ+)L&Q6Bs$492%ji#6l7x&6U-&(7u+#)35~UhZ0) z0xS(T@oZ&C3~^lw1~Irw#W-U72HDL6gE+a3oFI3cwZ!^F+@WRWp9k0-0-M3rPm1Of zU_N}dT52QhewoJ~S!QP_kBpu+iS35I?sODWb$#Xemw>BpqKZ$w1Lpm3+mq{m<~viO z-!v1`Z<>kee7AjsfhbKq$NbQo77Lc^byc{@(#?!F=M-*JTVou#KgT~4h7Ykp960WJ zu6%_tGh74>DQHv23X;8{wqwqT#Y2YOU?U%#6AOpIK6P=yqInBj%=k@tgFH>YN9da_ zHcU^`6TlF7MPu_n8+XOb4Ni*<#*5G9aUDRL+kDy6bUnz9wH)*`ah~~jJb>6vZ#aIe zCANNu(?#<^x9hmsIvrIhQG0Q`t>J@XE$;f>*4r{Mg>_sbY(75Ll2YHJy-`ek&&OjB zio69BO9W+38~^Dm1D>vIeB;aWg46OAwp5;nzJhP+7Phn&&13aj*wP>HRDAK$;&t`< z7WB;OG`R$>v7I5amJqf#guNQVSUI!{N;1>f;1D(nwydJuNM)`hO2thQ7W2v2(q*M& zpVLFCtnPDC6{|r{T-}D8SX|vEvxrTA1LZvZWUwUXDLyw~hu{h|!@M8xG_ZlkR2&Sy zvFWa!1{|Rd0FK0!VqQD?5O9>@GCmh)VZ2<%i*#eLK91_KrpG7HBuSQSF)?!(z4(GkEf*@(^m;m)9?K#@N|;!ZZc@Do3^K zRxTB;@rhWo2=Bz|Pu^BEfBZ!aZaw}SO&nj_kYtZVvF35~j37EGE(?LJx=0TG_&3t`J`u_7(Udff$#p69p>;ED(%?ny&sF z<+Y2Z5O!k-`*8@H08AGq*F4Pn?tp_(W!c}J445DsOWe|5C(A9h9wPm~Bk|}duR+pO z6)5}QodWyAm4N;6;sE<`>T1ArDU5-*^RM9J4!}X7>c%+Q>Ss3M_+<^VtJ|Fp^Ds)= za4$ZhU3H?L^n;-~dU4#it*>2kNvI|{J8@=-9z2QZ!IPM-N#RJ+TZ&{LHQpY%(R)wa zbjkeM21-$hMekOh(|F0swuTYrjGC!)%}ervGiq|4Z)`I>H|!1;tgLK$J~(47I&Hlv z(^@c|-nDT2Ehi?*CHIozq%Vn=XEX^?=x#hVVT`5%x|1roF-PJyJ2#*gy5O zj3ezMv-FI17ZziWeP2$Lv@KxQV3Whz78LsJ=htYji}HWSm? zOiX999Y_pJs5G@Tr}S)j2u7S&dYbM9HXEFOQs&}GS-+;X;2FWoV(Ty0?<)1A)AtpV z&W5SMq7<`e3C2xxT8(RW5NJ_~YtITbCpfL<5QE1cY0g=a`5f$nb3mAqxfhpAIseH6 z35H;qF? z;&Ry*2Li@pXyEQ_7GR$UyTU`R!N4N*|#VZ-M%bx=Fz&jhZ z&R+qh<24Kio+klaB7v#p9A#yRK7fO+$5bRpXd{0oU zUc{0hgGFPyRx(s7%$y}mi#iq>sV2A3(!AQoRc3IDkNd~lxA;=H08xC~#Z3L#3O9tLpd8Fu)M~bmgvntb~cV-ohoLM!z zU1hi3oDRAtBeJRi{cVSgVh2p`>+vndcy4jIqHb|0ix_jAMZ|O#5z|>@hiG@dni{Kd zx4C=H_O*uYUa_h}P5mtMDL%Bt8r{yWg)Qu+7T`-$+W@sPFpFiTGo_#4E7ZmUnKCM8 zt|UNDTK*2fN9DBFw&4oaKG*0c-7?hHcDWX1iEZZ^t5R~U8^Pswj> z*kH~n4$euoHbI(RZ8#SLkBmteZ7|nJnW3kL=E53tT1w_C9E;jG7A>r4a5oomm;K&RGhk8jwd7&6s-XEIgU@{^y5qzc0kG{ zMXDxH3sb@sL>uoXN6uGDW6AQ{_UM(`5oQ1K*Hx0>oi`mP~pI&36G$gwh?( z=^uqX7B?Fawhd`7-mH1j1?XoDVLmK@AGnUz|9g11w-vFmGZq@JzrC%f0Pc5*Z=%0l z{)uzC#FYf5iS(FiPxtNE(caZNu&WzAG*gxoC&kx#h|cb-2$rqg3Kt!m2YA^`RpbA2Q!?3(RlmqSiCcT{GW%1#_Mkj*A{2;&`+8Sy8w@;IJaD@g_Xh% zy=!NQ<;h%W=O(0`n~;{LP5T&$P1Prk(`8Le9LrwsZ${Vd8)(4HZvFc8=y1_J%MRD{ zqDzfH1a%iuDEHM|f*}OGdc1a8mUiRiSTtJ?y(4=%qI*=t1Wr2^HPHRqhRJ?a4!ju9 zy?8?S5?nvo2;pWn8n$M?2=L?4o0w=OI9rxCC(3vBLFuc0(*gIO6gk;0->m6$feh<_ zfA(g+lm2ErG+zI)?i=ymA-;+JwlZz?C6D`zlVO>TZ|AxMD7p1@QVC<~aAsRSv#m3H zLOR1Iq_t(U!YzLq#YXE#YwthnrroHi=}zr3Owuy%XV!+DrqYr}2j9SK?2vP4xa8pQ zAqhuo9M}!BaXRdPTpc)GJ`)SbSTato0F2MK3K_&Twmo|bj9z@V1yYnWy4x_U^n?QG z+>u5KvZcY)>iA7a$8SPf8kVLHE;Ndb>sDX>9+ToO#W@e3J%YDpJ8)+m`hC{wffvvW znRD`!kjpR`Xbc5UG`X{2XGlq8O1_dC)m-=|8;0k@^vq87#JiUTpOePlvS3?=$DcGst0E;XGM6ESGL6QA~mwQd^!J7_@Z}($+;t%QK!Q#-hUrcmc{& zc&fWxDvO`uaOk;Qzq^ErRZh+dxlnoNxqLqqm<*G9&B7CkEgFYppF-WjG2fp7vgMX7 z5Ig!<*<#6*1@3XC7%n*94?Er>JMd-=2k&IVJn&&{;515#@z%zo6koOk<=3Ot2IC}s zrt0x{ZD4gkYQwIadzbH+RV{u(TKt5x_~V%%S!!P(w!0eOF5tBd%SO}eo{Xe{uBN`( zX^Ut*VP@}w8^ob)csfYwXg41aYdj!c2 zyE;ebtjwE^gM@S(B&3CJQ)<57ieZxt|TG=m96+sZLsatzLJa$!8}R4?rvB zFy|fC;o$@Ixqd4#gTqIwn+C?;kq=^R8<2vQbvN%1RP2-K$!qJK8=6+%ynlsn#omJh zC%PQ=A=4F|dOPL4eJjQ|!_H&Q$o|~O-lqos4BVna&MUxQ4g5#3?eK_d?tDbGc2+mF zGX}~)WSyD9&E67dMa=CIK&*q1sG#|aK)1wvzYXXOJejz-(?YKSvaM@8pt0EBBgQn? zQ)C><5@~F_D8AwGGS(CO*95Z~c2LBHTv=|-g8~+Yx()UuTs6wCxsJdN8OAah3Pb42 zmc%x>7mqc}2aWb_g}rU^uj&-@KbM|vo7@FxUs`{q#&j^HG?u=G&k?uL+BDO|Xqf6J zJiO#u?B4I_OKsD3m7pIPzHdy$(&2&E z_O)I1)xMicg9HA3jhF2ox9sZvjAfe!G9IqE>}tFfU!Sw=!W*-K-#s??Qt|P{%en>v z&^ES{g>n4cW!?Hl=5c)5vbFl==NnaE<{}0v+*`4982kw|@5e~H%A;)KKiGBi*j`EP6A2&MDL)H-<` zeDIQC2_$bW&7N0Uquh9RF+!N_4PV$+)z7Qt`^$z=c_DXUA$kVWu;zvwBz&iCDId?Y zrI^K1jP&o5QT4)}Y*ZIaPgb{sFg-K68PwtyAFjEaEysBn2~13$I~ZfSqY=n*ct+8o zXwBv6u@tJRM58xM}t|*fV5N zBrHq!GlioUii~~^u5yO*C8(I9Z2bq=bA+?cmAn_pe(*dfg5sVrcZKJhsj$zN^cPFc z7MOW(DKQtpUL?E1OQ1-JyTY4bUu@X)BXV(gxrqYqG5-R)%G?gS#@q+H!5oCWPA&^? zHGc%WUakzk)ch6jMl&6GZZk7sZ#A=F_n5`7JIylKU54KnZ#Avr&idxKbSEBbc)Xfp zs*V)u8pa=SS$dn3{6By=r@EYUBK$Wb`JaIQBzF{I9ap6Bx3RHC^3(b&!?nCQc}BuC zhY^-(`;wyKjR(bc>~wYPF!@|<+_|a0TR3%=>#z-qQ)273{c!Bk+nm1uA?tGp&?N|5 zu>34sc;0K<$7dWWDji>Nd{Y1Z*2-$Hd3Tf{Ix%(U0ARBWLpFX`Ga>?~jL7V0UMsU7{8 zLLL1G>F7sDM?V`2@-9ZP2Vcy;gRh)*goj?kpqGC`Zppzm6olO;$cK!IqVcdscow&E z>nGpket3t<@HUsdP~%z zt9OxNdtB70BC2az@lR3NTk`BiObh>so9u4|6I(OMi*lsNu#EL<-kRxBHvoVi4H6f%^6G8#AtgB<`*&P>y3hD$;CY~{p2C#Yw z#b)YGQ`S==;hE%{Zn&&3IJ6az(@;A2=Qo3Usds7c$Vl0d;NE(IfA$TGZ7(^vahMgI zFBKh%R_8T`tjm=OJmiW!3cqtuAc;IO_`z z(Yr-(dcfp+VtbqjF7v|R(8IuxdHF&DOMqih^zZaLay%E_&>0fj`#*;>?E2ucjCOw$U83mhSHMGT@O zqY}lnfbJFFAwVhx6{6iLyq4;z$Y1i7;8 zn3mv&)6%TYwkIY<4k}WO7aEdDx{gj$b5F$a3RD zdLm{b>~a}JDn#8lvAF~;ZRS$g7n;jqZ!kMyZ!|ZF`@3O}Gw%_2AMCN_ z{Q{Hc{Rz)rJl61IA{wtWLzuW@@kEpSIZIYXu3@fE<8PUH1mP)D(OCNFX4%ODE7L@L zruti6_TAUHDb13+Jx$?9n$w-8pn^k^3&Wo}2iu|L5X@N*$+BhYG@Ou5!wKo&YfH!P z>U&e{H5f>_GhbCWE-rF#SAHCK<^7j(*YeU~%6h~PK`AFdh#!<(X28xs8z5XLFiV=X z!Z&N!GwII98iwb)9rTh*jbVsGItlA-atkW`9>J%@r`&URb>%EDvJ=(;;>QJ z#W%&)OV5U|wDtS`3O)Cxz1~P_5Zp>_Na~=YRYU6k}7Xh{Ou4JZAU(8*mKw;P!u3BgcAmilB{TSKGjSCrj z;bTpU3)oi3S1V+Yd~=dNTWOYC`i$AG71{9G3$i2>>2Quj##dg=OgL`)Z5sf<+2f%}S zH}j>Y6sx6>O8^g^fPm5nfRpg`16K|`DwRCoFKX);diI8K8+5x+&Xx{fN*-}f2016N z&VmyGd#d_>_AM?{mmGZc^Fz<>nI&h)%bvl3)Zr$CihossO|q{QJu~#|jX!s4IyPXB z0&)-N;`oHvCMZzu85-&D#rGf(dP4EkGwnE8SKIFl?&%%rKf`Io*@vAK zI8$!7S6jQ~usaF{*EH>!3vKM0u@lJHVPve6y4rb2 za*{N-(_~l;K_=o*%H`6j=4#maa#D7h+^9EQj(-=JTi|}CoP-F=K)c4=0he=RQhcu5 z?KcM+u1Wts*hO+eqF9cCFBI+OCFb|y%f)~TWZAdWoB({G8H6qx}# zBFi5YvJ6lqLvoE-3HMsb?@H04y2?;xVZAJ>G?;e+ZZucJZW2A{YeaAASW)P;M!GQ> zYzH1|-VIzD+hGaQi4BMUH>L5n?06CUSETh)(XPgZ7E?AFxJN&NB&MQ+FNA242 zBm~*f)rIeIu!W-|8To*J->0n-$D=0=e=?3|t4wf= zS6Lf<{Ju@Fsrkrhy&v70De}fn(a`VX`6Py?$q;dIzI-62E>ap9`2M#e;rm}SiWx$q+`YK~IV-X-#~`zEEqJt!{lxF)eQm>w++a^$$N zrNN_Ef)gtZ#upDYIWd$+y8*?V#L^f|wJ1N0q5i3r(LaDSkf66TvW3ofXyc)Ys}@D! ziGi*z#Kkw#qCP7%-g;-fYEEY|ikPuEoe3AgiRF~E;-R>xA2)6aYv{u9Br&I{$`DzO ze&6R{Q{&ZlH~F`u=9Den@4J;Y9-0Z#zo?yEz7-LdFmS2?krp**scG-h9d>mWGZ5@VXR#MHKkw#3-z1SeKvOjA76-cd`8d^54cG^bvU#8JZU z)AWuvcdwgVl3HRMPW(PD+Sn3<`hL98P`aYYWxjlC0g;yK{-V1#r;JPUI7SPO2rxFM zY|DZZ%PDEaL**of^7I0-sl=RW3cWc!O>n+X8*Ss*_B$I=bIP*z`zRCIoZ|KZytUi! z4FE%94syB)5NT1{n40#@eVa=b+Bd29j!wC;Sl#I2Ee)neOXK{+e7VXrnHIr`l?LOB zhvFh;+<1G+WH=|5hUUUs8dC)47TDBTw(G`4Uq~$tc5uJ%cG`Goro`&KLmlA4(&)n* zY0VA0&hocC_QJf=TpM#SuFHX#3vt@pH+NsTtN%)Mq>H!2m}V_8F4Dw}Z9l9j!HJa^ z(-aSNRbnVl`{8((SYnz}Z;A1UhTm5No7!1!7aW8JFhtU}BoxoU)w?PAsRS6%X~_iJ?3>WfMxwsix4I)0u)p_C%?FXx%s7oto2G zg7YQXcxYzYI@R;k;=($;8xUzxC!U)2t{4g&fRoU38N25Fg~VLAdC!Eu;KcGy>hVx7 zCx-Imokg9PcTKZ5?`I26CvC_DAD#38Fj61hyz&n-;`jZB;J|`8J66kIQwO*(@8855 zX;Ckqns&?}G0k)h^G@>}_dT^Vm>w;S^|qh|*YYurgMt$)4aOG_)s+~^QyNTCVrghD zyrnT)aOT10LfoOgrthVe#vH*Rx3*Euwk?5&mBq}K(ijFzT4ync7;l?rT$zy*V;KXuDTJcbWiJ?3>B^OA{six4IQ}RTe>ycxB@x{|$OwB3d^ZOpAjfbX4b83$i zi%S?dM*%Tb>L*mw-W6l&a7b?Rj9v5YSke;A*78`q2~I5UBpeU*!NgFWyq^cW#Jp>o zy?LK6IAGkEQ)QWbhwsOlL2{cvUvMx5jpcp5Tg&bNUii#MzWlyl03t2wNL1skWyYmB z{a9j}J+&-2v7C}tJk+NXLwRyq47|jgY6`tMT_8Bsu&G6{_theFpX8j9oA`aV(Z)lw zz_#a@K)--B=sONS(xO&IHQt;uF3suZEg?a&bsE5%;KXuDTJcc-kr>L8(-Pn%=2TPY z&FLb+;mnwN8*?9fVsmOv7YoiGXyc(-WOJ$qDaD03Wg(Fk^+2leu5T=Xliz1){CCxE zurteqkGS~6fy}mTQ*ZAMBt;A;8!w#;;Ogg|pvPD`zjob-qi%mq!19(n^R6ZTs7;jM z+LEVSEI6@}XWrtWewi4`Q}S$!i6yTk<}LXP1!op)Zj}7_zGuIXTJlQ;=SJFiXs`;a zfLuVJE+`)#H%Cc}nk(amtF&sQ46kt6ESwm-=KVL8v>@8NXIh+C-bpZQa`p1hX< zFEQ_$W^dk?3635Rns0I*{VWE5Ce=H7UL-hc;B2E>W?P*egM$Au6GmL;0*ADyJyT74 zm#j{@Z_GRRs(uEBki1ZE zVl~JziidhE7J`6xt{1_3Vhw7^duy;RFji#c z1|{a>kzUfG-cU8(e#*Esr%zjN`L{VGb-{_{l(gcZewY}_(^f0tlbBOYp*N>hg3}6{ znnfF$3%;D1Q*va#?>n^d&{Wx+##&32VNR=kdg6$hO4YRQI$6uC0aAQTIQviIo{hH+ z9zCTYPGZ|&nzh7!L4=sGCC0WUII$9A{^Fr57uA5?wy^?Ei6y2v^_Ezz;BYgZx=tsp z>I2(kQoU_srP6`3EwNf#VzFh=TEi0Kkq*+L?o>7QW&?c#PQtu^v1{Jn&q!m&=Di#) zf)mR-smDXTm>9~_T2>)sV%{~)-n`cd&N;9tA65;HtWC{(z2HP?67<&cYQgynZ9FuMo}B88zR@tJ+YpqripVs?cyr3QG^h5GAs5FZ4GK;yr=%4R zH48NyH{SN#1n0z@Y6`tMT_ZT}MhdA@_POFWi&ArnY6hL>Y2%?;V{;mt$gPo_@(>nj zQAe#BZ%!GP=5!=6&2CO9y$Vh&r=%4R)nua=(%zgl!zD4NnnG_**9p!f*yQTJefpLC zsX1lI;;vxYcxcwyoW=&-b&}KfB4wmSt+;BuIb~d$(;b$OAlZION5P5Zl(gcZ-kBK6 z(|XCv5_764bW4LIMDtX-i+>(Nnz1tL>hS~=SFDJ|d|7&JQay|9=&P#D4-1SQ1!I;w z@y-<+MBtc`BT#i&etY{>ySB&R_FbKu2l}@5U(>#M$BrwvcA7}L$4TN)kH{iWwi*CH z&Heh>#=N$ZyU*^8KMU&{8dj{REMFB_Ub1}g^1|}+i1jM2Y;0<*D6g%IsB?Qvttn{6 zJ_BlxLG})znn=y6@`_beHB|^$S+n_Xw3q^$R9=9zusv2z?yDQo;+l%;71g!XRgneD z7cE@AXhA~iFQ~3)tZS@U)rdq?HFR|#dq_+NUREn!;QR&d1vX(dZ+GKON%6vx3j~!n z-drL#-rNWl_7SuR8t8h z12~^?@fdBy6d&};ip1pT{bd)2?=c)8Tn|4Nzn^>1V)u(Z!W|%SHWqc8`ho8*ud3fb+9yXg38s4}+DE+@{ODBPQ|w z2Lz5`G5n{P2hdE%ldha+!TnemmdB(kXNJ!{%Yy_k9UhWp&N&481w7X8Wv770 z`sh7HylYPZkMZt1MZAxm0v-pN&z=Gv+x_QH0gwInKTZ*E_!RJ%-$zdYkMiJ8P63bg z@rzTyW4XMT4lhmr_yh1pTwEW*rMo#`0zAgg1ph(9K7t2&xYPEJnZV00#96enK?sKZ zG+qB7Ke)xkAs$V-c2E9t+bQ7X0PpT}cxm$cb>I!VxTEElCpI4kPVu>zf6V3%)TFfe z{VMRj0sl@8I4~S?(&aY@_uslW#G^@&&PSBV$I2D<%cF^Zgz1LGky7C2sGbF zhnFTFj{xr(7k9LL@blAO0cXKN+%8lydOKh~?uCE-;*;lt{r3kh&dKsI8J<5o1-yLV zy^;a=iCUCI+s(9NMFv`!21CF|FuHMjhbJ!mx4;g zv9{zlP5Kr9uiV82d9Al3dFU>9)B)#}Dq}9K;ZfD8Y1_d*;Qbf;udLNr$>-AXKaRh? zm5O8SboBud%$#-#c$9PIoC4ld;MJtVOH(czfw#@Y9j#n$g2&asd3_biu%4eFO;1}c z=doPipWCRpjrETtd7S07$Hh_1^zC#UJP(`#-U8s=ate570q>zxz@vQnn{;?-%Fl=S zSRNjlSotZQ%R@n2b;nPKK2)_3sUOy z!tzJvtF<7Xi}g(GW)OS?8H#=1gpa5DXEcesS`lCzBN{$w?(qrakiNmECppxS9%_mP zoyn*c(+X8E;Wg`{>oaVCQy}(Tp>?=_a9mM^uU>WAMKyAAG*5QeDXdKH;D{B zJO;Y6epYhu_}J+O2cH=kI=G>KT1xuxL8nB#UVPj%Wa0a)EX2Vw&6H!UlpI4Q44XTP znR4KXl5D0d-a+05bUthjX{x)eSRhJP^YLWL(z-&I;~ldN;BAA=`BSFpgRS(g2Bh?^ z2c-1g14!v{AkkDk1n3+*nWBY7Lp*_Z4e=8|8se9L*hMns)2tbQLUKe=hrJBZ>or!s zsvIZ!-o~3PzzN8A);Xe_eS-NBTqc^I!_GA?!H#Q_;}B`h?_Gec&KeG_tY-ed=sJ4+ z)mOL8?o8{?dWbWOk|ga@jFYsPs;A?G`*B@ZiYLcDD|FtK#iow1n<5~;gC{cj&!$2Xm)p2(CITFxJNRJ8 z?ZFb6ST-=eIL<;~e6{VWsvbQszK8Q^Fi#@fl;b;A-05(Vl&dyBeid6lRUZY-P=0X- z8%oQ1sK{`WiNs8l#N@6~x}zsX+1o?lZbz0*87Kg63z4@SS=#Cwh;z2*Je;j14QI>o zmWw0;nLH7%jnLp*nX33h-KZ7q;o#6%bf=iZ;E8Y=$}yhV6LvEPy&We*Y;JL*eF$IW zLS5R;R)r$&hZ-l8pjJWX zPSfDNpM?~C5KpFjq4s`2%32SI+gY%cEt5?vTP_B~CnUp2RG^Ds@57TR>~~1qT4C=M z=rY)YcrxXiH>KBwccr%zkkT6fbfe($WbE|<-30p@JR$R8*h=qXfOg}_G@pR2^gazp z>3tE9(z_2(Kc0~2KWASL$;D57fHKV^ur?4urP>(p-K8&=v3viTaLB0{sAPmrIDJ0V(BY04e2P0aD7p1H^g?nb!erkPv?b zq#=A`Y=~??8saoS>m|fuK$`P1K&P zL)-;OLwo^Hqu_lNkmme8Kw7I01G+-e@;IP6!Fvjj()%$WrT07_rB@9c-L)SN(VQa< zXWrSO7BolBHBOZCVL?%#kSq0>C*^#aCE+ko@UA=syzqp+vTSXLmT z*BLUt%#aU|&k~g_GtC7k*;(dd*k_AUxO3#A<#WyZ;4(*)!p$?E0eqhM9_$iP!LrEw z67XX48`!0y6z)Qkh5RfvLD(0G@|BCte89^Mzg>!m!j%g1LBN&f)3B?|J+N!cy|7oB z2VmEk2VtLYegV5!gq%Mi^{h*4egmHjyl_3v8b1KK!OI*><8Kw`6Ysle{B_q?Rkl8a z+<57;McLS15t!*qRL{#akv4Pi!(0~$oqz%pzrRfudoCzVb}79u#U&Nzf)t!3DK3js zTo$FcqzGoX1wBbrE2UtTAmEjz2zVDT%__Y4km)W_??pL{EIf=d^vY?hu9B4?l=zu@>%Ze7rq0y$~qQ67ACe_%LAx3#;dPDq3HHJ$_3rb zFC9!9$>58nu5MIHv(Q=yb*^Nm2LFrPf6gtfSbHjy>cQ&^vnE1u%d*z>pu)CnsC?|Z zjJ#J^HHlsWza~x9Cn%~?`p;3(4Z2&qNnWi8AeUaQ3fApygAbMtXTp5~9-Tga5l~1J zNq<4ymcd>uP&sTJhiU-nIMf7)1s5`#Vdvq=lu_lg;>M9hp@(7+Wt6+cm;LT8Jee{h z`m{hV!`9fyzcscu0BLNLRy4MMgPR@o=ogSPWI>U&@&*$+Z`>QY3&fxdCwEjx%75LGBeX_`6 zhH)~E@%aC7Zp>N61N(_^B6}?ikiiRseEQYWTRgB_okBF53@ z`<|H>65ignaRWI6%TnhFlq?l01f<-8tn?_JkjTAH0?HIQTKg|$aP7aF0I`pTM1f$j zKp%(weSz+S{g^-x!ajm0Q|@$9DnG!xQh6GXQu#R`r9uwE)|DxIO+&ndcMb7BfHcHk z0ci*yYAa7dEC$3jnklLVH3a7|8iKlxGz3R!7Imgs2T0}hZ{b~gD!-Xy51`CFQ8YXS zW&F;QyQ?M%FFZ|@Qip`=shpiJ6sMWz5o)rmnN2r~K)pbeKAs_3GiHdw!?T3n{0Vq> z;<1KjOvrn3tponqL0Dg`o3%;)2jOOAS>iP%`Om?-<#g|Rvdtf16AIvrr7hPf=4WxpZe70^yR|iyVJ1qIYG%N0TV0u{x? zMR-c_EOVJ&E+mz=-G1mVtl|P)J-PNeE>6~yf%cd+(d!EfL2S0mpJSX9qR&ojS3q-p zKh(m(bVp!WK6|{k$AGzpAXSMIQdiJpj{d&Ml5-KM_S|T%>*LJ?a8nTc!k%G&R&^4jZo#Yw<{s&%oovY9CFDHt=GJM5s+T^tfE;7-j(UG zvnmU_2#~U{6@Zk5T?Oc~c=YZ?cJ55M09HfXf_DvZH=y4L-haT>5KqP2=%a400{S$b zOi>}HDR>j_N{_8s>E!^@6tE3z*s}rsw}fRI))40d(h!_5X^2WdOixId)m;*z1#TMK zI{;}|vJ(xv6_AGI0HMqe2_9pM7Yz;4ZsVTcfp=4O8=(FO(|1F z!k8{19(2dTcZMvo&6K^Dvt@q+nqm>(Y*Cgs#}opdYnH$+lBwQ#qPcdyD8)NJ#=`f4 zk~KW$=4G*TC;PU~wlx0gtDn@Ip5%Wg-YpA%2O#nfFMah_7XAuRVZavi6jGaMV*KyK ze=>{i-PE_G(|-Ao!j_ZQ97;-3gwT@Y)q@h~z)527CI5(R9WSF!k!jgfbj^T}t{D&t zNLBw*+YbK>?QY(fFKxaWCsdkZ$9fMLV`wYag75DJ(x0sT(gc+!fSNX+Y#>T+_|H#Km3mN=5=eU%NyFO8>`|t+jsPbw_uyP9abj;^HyGCX; zi9#{CYZXP-`e>$=i#<|tV@C317w??y8Ih2C3-gch1)Bt?un9~iz7AY2hfJI^TQG7r zxUj~#?gev0(CqzQP;C-nI1T2&&zVHaRx?f^YK#lvqc0t(zro-_p3_~SIf6KB@>8~6 zz=I*-Qowy15&Qe>4fFA2%Fe7pXX9OYawDLlcyN~o>?iSLn#*A;kLm=ZJgNtf@+b;d z%A*bd`aYhJDC|_|QM{`t%t`VQJelTM*h=p?KuV7dO6mOpkka#`Iq=CeS+Et4^Crcc z3P|w^0F59NMif9Z0ENr~KopTPg@b8qWpGm}5kN|16(FVZ8n6=uV3tU>Y>rM44m(jc zJ0=N-Jxx?Th0N{1nJiLGzLeH9Ir=nRG=Ucg$2vpqMwwx_gm#vw9i5z(dr~O(ayJl` zvlOf^ri7i%>px)(HEGjV@i-nO`&;gL4RF4KC)NMt+>>dVgm6rIdhR)jn7b&2GcHOI zd>19J*p@6xUa>7%M4tOk6?54PlzS3V?ny|w=LvBm_avm;^UvZ&?ny|wC#EI{OYTWX zxo3vBk$VzS?m1T6$UO-`g9nGCuq{*_pxif#zN_nWJ3Rpn>x*3dq+xw21Lb)i9G=G` z4D|25GDsdAA&0DWg5Y~uJ^r;|wGt^fU;*HeACY6VFl>1yB-Ppb8~xygS#KSJn7Oaf zPqb{HSro1=%sK`B2(FyR=F13~Z=QmEx(Ec*W#)E<34mt$MMNHoCm+eeV-2gC zoTvp4^PcQ)r94V;j4{<;sl5U}n&dm+7$@Uks(vDkOweQzQB`jxNnMLm_|M`L{|n4)5Ps-$N-^$IS7c7ZMI0|gaT3@lf~^v z@Ff(G8O9WGI|esG+UHp|?DKXdQDgV6B(ks8CdfHVJsW8+#`P8QVKg zMP|ZYK|R<(hHeJrqxyAF-*v1*hNN2UT>ac%@52aHh(=8 zL94Z!32{@CCG%6ZzA zNeWw9!U^N3EC&gSv7EoxIv#6JFPkEymrW50$T6Ejar+=5CKQk@klEtK@r;lj8Dtq} z3$G`nM+VOmx5L0Aq(=t%X_OurBor{ZHS3Br%_vxkH8}pugMzMW($ul4d|i2a_1d+o z*Tygy4zb{P1!$_g!@9$+I^I*{o$-H0z-IDD99Ou&M!+ zDaU=3r|brf@{}6@DNo@PS$WFG08PS^DY8JGK;(3v#S@Z^67sW5^8?sQzF_F`$#B>6Xrhq(8!;V4PG;DnBj)!}cgJp@|c;Q_+vZ*{lq@F4XIlGYmrrBm^{Z;W#I^Zkv z7Q363nKYSRnMtNL(Q&%QgdSYgQyN{J!FfkF39LbfWiw1GH~ozQ4kjn{lv{9N29}ue zA$i622*?Ji22YF`C#VDhs?|J zty7YVNXIyb|Ar&NZ6{$^NgqFuAxYA^BZ%b~qrwjDscjK^*00D<=i|wgZ-ksB!wA~#YVG!7J$ ze{m&?T|QHqcPHL5<@y&5QIB^G(HaYJ8K6yqM_XmF?SR_EjYq09>~26B_T7Lqwtax! zfhW@(fUW8K5Fib~V^$jC4nP`W9iUVxFI#SCPnGpT=0m`qY;J|Ex3W()UjSSn^P4ke z&F?I!>Y1{XTqxc9Y`F*T97)-1xpZf)+=G`dcNtGJ??D>U&qD8lPqK{17GPySmQ}L9 zl>s>plmIu?KMSt$Z$XlIGUH?%Tk)SPBl6QQt1Ac%#(P|_q%>usd0`5_y)b3ZH{}>) zNomTKL@6h=r^KcIUeY65h0bjW>D-o3Kx9F-)oi&bkx)SPbJvR-dkLX{$o{-!DO;BJ z2?gY^)D_~!l@3Ay!#>j`Za&zA0*14eZgJz>nNUn73}3yqzdOuoz`4rK-8(xs_jh*4 zyZb4hl`dm=>aM5r_>D>mg3hm5>l`aGr0${E3-9;<<#0w}9=S5A&#De2ez)~ z3XpO;=jCr@0xo&#)w}v9rE)^yh)vzOlk73KSil}%cPv&Hc3yTFDDLa!1+b3;c?egl zJ%oQjUN5$uj^oAxzL~?AuxC8rkQ2!`KK6c+S5zG}JONTDyuHKVgH;?S-A`gLy5(w^ zwVH&J5myZRokS^asKs{@Qa)}Taj%p>-ye@8JE(~eR0XgVkh7f*dq3PVg*Pf^qa3E3 zjU$C}HgZ4qV;qx#tyJm(y+^{X0iqfOGgo#(GDDpyP&sT$ zE;y_No9!}WE`fcWKpYhm>IHNyo=n*V)s)glOQRo$9u_{^2BUzUn zCWp7wUV%T&+$5QtaWW3_|L$Btp|x$(*6m3we^GHVJ6}|sEOalzF-LoQCil>=^1oRe zn57LM4~MJd13(@Op9#m8E5PB&b68s5b*~N=?&kHjPTYEdhI2*Oab?@CBFjsHt+rD-CmZjj= zU0t1ho!k4vUK(Wb47sU)>lFx`=!F!?wR%Vs3V=4wCgV?U?EGh4(>4{c+H2aZ5(QnO zz%++x|A$=DMumOe9sqgRqpFYdN57A)TuTK&%+Qraa1xZ3(`Pg#&u2&&?Kx0p>rvk^ zRzgj2{g2H3*l%4Be`R>sT8RV2)cUbE;Fyd1UA;{cD0>vJaG>=2C|^_E-(`2N`kCg( ztBh`(;M5_T*??$xu@6e)?{aNia(zk!uvWN0rU_%$gkuR)NyUU}+;4%!RdQk4y&9Am zDxnNnlYSoteKFs8Y59JZml}>mG{hNWgfiG1M+v3utqYEgs#X+$`TF5Zl#8YFK03h= z$EAb84iTlH!_Mya*%GbzVjn8e()lL*Xo#b3&&WHiFkHOpA%(bV=*8c-ajy-d=cX8j zIBt3{&`4*g*@>sT^c&N3p z5Cptxa+#w<<*{y?_w*ggMt&bZ$)XC!<3B$4U~1oC&-DBL2WgxRh$bj~hY)9sG(i(a z3;z%x(xOU8HEf6YfXn&%AM^EkRpKIwwx73-$=V z&!%oocI2#hsL#78B#yQp%#!3&I!%u^_S1yUG&lCAKG}0eoX(3b9pbojF2JWzv3z;y zu!H-3mKQd+f99vhB#=e`puEJXxm_kVLm9I1*WEuD;n{hdwKJ*SL2l1T*|~z zaG&eqp$yUXH^@mUWpd_tFZj&8n?7Ty7{kvzX^3OfY{#y!y2KPFyDi+q`8o2%DK{NC zbaR~Yw_M7^aZ7cPkq;?TQd45fcsJQO{K&7jhEq_ukN}b zPG=g2I~d|fPGc(EJ!QC1`FJX2&M)HEf=s`c;*za`T9-0$gmUa^6{U=p5L2)1i3_~$ zs|b-A7h8LLEcnS+ANQ2TMmH|vX#DSYT~cd@T{S+MfBC8_|7yb+^HDbxaT0qR+jczE zzwJJ6OFYzf+)%`E>!Mgca!$>~nL@|b>D52&EsN86#-&3XDKUKcwxbU(FkyA!2XX2k zF5W)KS&ZMuF`nk0KkXlkQy%9E62uY8o|}qDS-2K>6q;h1k`Kc*-kzK9`a^Y`@=TX9 zafEX0dWh7LKTGJinKUn7JpiU|Tgyt94slTOp7DZZsN=;3KyhQoi}`R8oY;6ljvNo= z#Df6xju$iWo;Y48pZCgIvjm4LlT>NC?dP9>h=UhPrx~E!)9m+g25LvgS+VhAlbf$u zCXDgoOTZ>Asz_CXlIPc5;wo{mF8FnqT-L2F-da8z!QzsG>HqBEcp2_+<04LC>pe$8 zab%_0dUgHv@lXfcP{h&N__FKbwmSRmmV^xhM^XrGvkoq)DLfahejnurnxgevzh>#; zO9+=TaWt-9B*f*dcT(1RXQ{=Ft#`^Af)lHEmTWxK_v1kTdFy>P-V^Ix>&sj3a|CBI zC{nfSyoOdJ7cZ8M)cah)`6`^57MeM+dVkT)*BpZq^F0MW(xR$ZH7r9a(WI-yl^`D$ z0m<)U8>U%!WzXHVyzm*iOPM%Y7x-RAJ|;?~GY>d^pH1CwCygzP)0yY83gWnQz_pmk zR66Gg9ZK3XMT_rgi_=-_(jku0!M8c)dAz04VPB2Q&mTKfx;jp0r%Q)8+BQDqy14Do zU5$h{OxVT+*=7gcQ{y@xuJLyGuA{$2aVlM7KH*X(j=CL6h|Aj!Nm<+Be*%gd+YTqe zNpNEA(AKGj`cpgzAa6TlaVNGzZ9m?2h^hq+kAYJ~ZsgiOElh2Pa01S)z_B&0mxaOE zJmKbR0ZYtx94@3qmAh)#4i};f=_+wa@5aG?*>&)^pub-f!|`$?cp!E(EHN|R`|i7J znL@>-8#{5dZSYE5?%*nA2APggKn+ru&)ZrE$u0-B84FDT8Dk-juSp z2I-=8@uo{l|7;CXh7z1u4cgMsQ1g)9xbfB?giEB5qq#*%y`~MKEpS!?ft;jp!}t}c zH3&uk9B&OSiE)xk-JC8lC?6kZuB1g}!)jQAI9zNR;VN-S4dQUI$HiM;sBFYF(GC6e zKi8lW*nY9ijf*&mb%8F8P?WT3UYh!4FnAm4LvASIXkFkSvz+nP^mt?Entxe*;*wg%5l&$1)nI;gL57|}5DyN@a9zyBTVlk~659wGabrsi3{&WI z#!8H7iihHgdE9vW#l>(=EV0yU$d(HZ&nr=xbIp^NLnt6YZ;3?&hb`N3w&k&Yk>i%w za>EiU0S;+VIkXy<7|x`LtHhPSTgruUfs4DyzY36T&r@B>#L;$$lWcMZPw5C{w8Pio zpGvs`u8;;{)A&C)=RlnDB`#&+xRg<+NAQ+Pr;?##a@4J#zV}$1&dn|z;%KVB?z+TB zMx3LQoe7t+N1~>S*83nzEN*PQv!@77tln9&@lbashVt~3Duhg|cdajPPpKB15NJ@T z^}rLy9#5_J8o|j1j;;6VSiK)~b6Rb}sCV{S(pp@OAY!C;z>4T9aY?_xnI9QAEGf<43U<7o+| zg=S@}E~dC5;Y!20*a{rdqC#*rtP8H~dC_9IDVhlLiO#Y1tGGj6;*d^MaC+mF_}xBWB;&P|{}Mdv?!vjfqQpqGcQ z5uEejY)8E&X+OB93%i7BnoJn&=Y7B-EheAbV^)0!~vbnC%f*Jectaw za~JdKl-fOUI%`}y#L?FA5!WR(JuSfT`_57_=4)S#U=Cb@8sR2QQ6^4tKYmu_Hx^XtRpxRc)7z8KQ>TW{4#zW0W z4CUck>k%@s)oE*STNDdRRB@%d0Im?}T^`%}jVxcVd^y`#BywToLVI!AC>N8pbHmL& z7So=n%GO?;RvD?NY^-l=EMFao>u$xpWh?Ql(hJ%uYj!PPl5o>mML9xMSJqZltcu`7 z&GN;bpoy6Ek(Jfub*rmtDiX-cjcf5hHX9dItgfqERb5vVaTUfU#JW0CT~S$!NcEPt zUCS5CN}^3cN(>U_0GL|L6%9Fts7|t&Tf}CgqCV14-B44vqM{L0sH-eipo`^PJcDwT*d{%t zd{;&4YY`r$q2=pRNeZ1<)QGIEeD#W&m31~!me2B}FmmNy+8SM5Ue~a?wt=Asw)5Ig zn{_uDtZb{h&F1RJ%KFNhsw!M~C+SNL;Fjs?Nd4-SHPsC(RsxOd@Ug-;Nm^D`H=qET zZ0;r4=;$j}SJhV6q6xbZNXAD&U%0BOX+@;(iiD zPam-x-J<%sn%btu>Xi}djZ2`kI>hDgZ%p1>+3Bx z^|d6T(*@Tq3X`%+Vs7xJ$jYYb6{~71>msht+qIy^2nuL*UHz&$Z9q0yVu!h)p}MxV zqNctvPL_PhjkP|~SYKVfvI*VE4Ia;8+`(cupf5Buu3lMDVX-|~bkV(8OjJqXMp;=M zsj6zIZ>TF@X$xxkV%4v(e6cE6SiU%}VF8y`x^?4T0P2#dsE*XFs;pXBvvPHu3{)_H z>xd2p%O|z46TUsR*;ySyd#!C+SsxMa<%?|zdT;BjsEMHMS64Q!TBT_AT&%ZxR@d3+ zZ0c4<8tdxH8^CL{a*|?jyDd1Zk` z53ea>8NyXn)zy|)HmPBYk4!o?fadmlBUDaxvvgM0;7!GeW?&zof&oRi0UI;N3xIdg>> zEnY6lE&|RDJlEjy;fPSW{N4(@e}n%bcg^`^`CSW~D_p$M;yoAidR?3k%YR1Ncn<^b z^YHJR1_0({@!kxa+g-fT;_U#9dt97}n6~kVR=WHigikB{r?|7clf}CTI8`p*Xz`X} zs@Vvf_sqbduP_fIwWf`i{bA8e)bT7N0On-zUIm=@xOk(*`!&$G*~O_SB*kFbc)tgq z+u*<9Y~q|e-fMspb@4`vmy4Sp2F_AcbQK;Swr$dt^Q(yKMfm@6wnTf<{JsgC33C*0 zw0N(E_f+7#AJ3=ojKL=s>Ee9@c(1|#<+*Pk@5CZ}EQE(r z@%|WiMe~rZ^GNOFDEQ zyu09k?_!Der0wcy;QW`1H(I=TSZa9*IB#8mIw|D=6Qknm`ES*cn~-Y|0lWf40E!0e-E6u zT)ffZ<;@LQSR-Dt2A_W584Cpx>GFF31m3+C+xi37BAWN2H@O; zXFnbva*{4y85iKcp+)08S$?kp4lWQ96N^_DB|$+=2mU_n;#fDzYyWpQQ@V2`xtTKe ze|a(Sa^XKdA}z^|90pwZO12Y zofweR&1bIY-Ld(~_KqFf8G|~GFOAn^$_$hKJWWOEZ)sK zws&paGSG*Q-*#+o@85(k;6N}d?~lL$o&K$x+xvOdXGiC*&B$hYkM>% z-vwpK#i;|mTOeX*-+i{W0_D#JkFeK@e zt~Mo-CpJ(Exzub8DlsNGULHUjtq{&aDK+ib)g=hUNL8%35s3LD!oaR>DX{^I)wz#cup@0dyWfPYBS;LjKjfWRpc;Vvn z78VzmgjaQL+J0W|j)9%w6`Qv9_FfYPi3F1YDKHBUO$H<+RD=s-tpYz9;^g8-lZAil zPWUGL)IChdN0<ou|wI6s6ZQ*J4ETA)i{E7TE#b^`j9_+B4__QjxE zV$kg|=nF9jU&&_-9c*rq3nvSlKLq#w7Jkkp1w+pU_x_Ave_{U6Yr(xw60XZ1{PURL z-Uk5>{@FJW7`!fHZgA*c^%{D#f3g!PUf-%;*+ZoZzQxapmKP6>_=E3`5~;Fq>>F>5 zjFg?YD$_Yu^rruH=elC&ap&lv7skB$8Ry90^Zr-wbefBux~Axr9nmY-1;05aS{Zrz zx!^Zf`AQDWs;tLb$x{ag-gK^u0LiH=4t}#LcZ_r8yr+Nb)YX?9o^{BnTLz>qC!^eX zW7eC_m8D(LsvD5hoDQifH4sxdX2;do_=`Jkai=QRmh!={cUWmG=^6~QZ z``J?Ce**TMc&y=~9}OF{HC#x{z%vfdi0f$m*W=xj_+eo?WKA*yD^ z%E42gdZGCcpCQnXEdTeo#0J*pig zR-|+wTk6Mi#a4V?MExm@l@3>J>K*8el_S%qx~mAO?kYlBjy87Av}hC?+AgvVR4hMq zEc3vsafe>;`yV(^<;zCFWuRCKoRuuy$%EI-4h{qduc-|VjJL|0GKNb)gb#FAlb)DN zsh;t28}vkRpCmdfPK)&qMr#cVf=1b{!n8B+j8=#?4Aw5pZ&C`eV#ffsYf}m_cuj)3Ji_e6r{R7~+k2Ts z)!jfybvF>w(qjZ_7>$u*s^g4Pn~MT0a9TrUN3R;=936V9ztOoWw;AP`;~a5*qNB%S zI(opVw!r^Jba#$#O|ElE$l0Asho43-2^GOLcg`AUg(*Op4?WtxVIb3~&5G9Mwhh;7 zw6Oic@-om+Ir7efJr1iOY<6r!H?(8a{(7-F|aiu|M@Xd_i2eR-o^iuGBOqWwh zb#8lK0(%)OGXvR9Wd`1devWsiCgY-iMfVvP&rm~0=v0?G^yom|9R-NDEn1ns@&3Qa zs6BXMuG1J^A3YPgCPUHf;ouNYu{$;S|IY4L_CRpxKk@H0hMbzLhcmKf04k5-?U2*R zcgLv-0g6OxLU_w^_V8^*6n}^D&Tw9A(Dh)OQ@|!+=Mkso`oR<92Qr)oj!(YuUv5Hz zZpbQo;Q9<+KYc%n!Z@v2`!e#-x)FOt6n_sO_7TM1W6FC>k3otL*JQjCn8)y#7e2@^ zjkBHi+yr3og{(u*=e+9>xnkJ^H_UMMTwnIa_4$J%nKz8PpM2o>#FB$}3x4FF|AFIU zN)8@+E;Acx>VO(@|KOux=TOO0-p6pSfTr0Uzfb&m#dy3^Q;zthmD_I?s1q}c@b-U1MX-f|!((mE14 zfP$g=J*XM%A3J!$KQIotWcyhM9z+159>fXg|c?8jKNH-UhM1c>!ItLGEu}C@q*Su_n2{xrFcA*@&v6 z+d(GFd5A8tM!mmzymOc?o`$x+IY1XnH`~%3sRQ{;T4zeQj;F#duiFeNaGDSVoMnEBR6s59Up#O?Nuf(9g z0#Z>u7qv+46EYV8QYx3nAl5PGfl#yx=rY0kC7=xgQGLIL{V5=g?N|)@L(F$JdZ<#q z6ybDe+4)WzfqG_TG{d99baHflT>jLvLz-P#HO=pU*Jwud7 zh0W>6(JWI1yHM0zonv|c&o(S8UW8>OfymzU|(mx z5BqxaL)bSM-if`(@WbwRo8zztO&-eoJtiOad(9cJqh=QD514tdZ#K(d-(xO`we!!##Bx@)>K!1E4bs z+bl`)=d{hPBQVUIB>(S8IHg89jGxBRr@x&^To33I$OBEHzYh6UkUKAFZoxE@Hgol% zxOCu7+fpTB<*kvk1MAz{<#U+0on4uC7*sU|-QW8X=vd5mE`lme?3GUgB14s`1aF z(C`T$IyD94&mRT|DKBGiWG?0vBk%0beb)&4b$?d7OwQVdod~Ys?ayvt+Sifx{fskPNY;E8)rAIaUEL=oQmQ!!CPmqal>)!d?&_Ea4`;2rmc4H zxi@uU*f!il7pY^vsN5Kf(*<#9aWUY@GBeDPg@g&hFD9BkxCh+}D?S3)-sb*!z~@%Aa876eCPjH#6{m-5Pyn24bV_pe{D6koj|QyUOcRkr3}*kDxQ5Q z?SyAtQzlQg39xWfh$N&!B%uHvCCq=HBwa7n9%owE26EX3K8RQ$IOcF@A0o{50L8<( z!M)V#*1Y~(6A{{Zv-^Hb)v8gf-uyhsOSn#bcjRpJ{VAU1& zjENRGEv(*_Fy)oXLZ@MN<1_gl(>ZcV#Jvtrc3%Eg;^L5v^QigJ8L8@WJAtk!WRB zaPLo6IH8?q7o z@XfFf489M^I^f)d&VS&;{iuuf=wL2J$*5C6`@^$gZ@@slak%9eFd;Z)v~Os;pDOw` z4!234+c^Awlr5_=B%d*Hno4d`1Uo37s^p34ut~CT7Lw~Drh=Pt)ZPPonq1IwI`}b_ z-#!U@mfWpYh)+d0Z7qO(j^QVuvrQ%JIdYxgT(b%AJW)}6o_x+e-|#cGVo`9pP?YY> zFdv0W*n9%^LUTLpfPBKXPc#MU{hNr)M zV_968)<1_xvE>Tr$xY~QOcQC}h5wJH^fxYBCv-UMiS%QCL3y*R0m*6wNa#}8)gYyp zJrUB&o(O3lv;{E6jFG4m8}fOJbFAzIOtfDZdT9XDl#Rnh4@E08oJz3Je5%_HI@wsH zZCRs>JI5zcgZF8U->EBZX|h_lIU8toN~mW%H)VylGRw*KKh*Aj9Q~-xc_^B_ahQjP zRH`cnq;g=qws;xc1Axk5Z(fTOck+WsV>eP5yK*|xd#}h=h%az&hBx!pga}_Y- zoHb5cKgNTn%PR>f%$C519GiwPjn=fjQHHcjEs6fxE^w$qMg@jT^iOOF^ONT9tPJ8a z)yLy4fnS8QUop@Xo4QZdsry7U0-}duS#Mo>*|qiB_?q8dplE|2qz!_QHVDQ^gH|pv zDz;Nm=&Y(b`dqYPkyEj(xwYiAu4sSlTX2(E&rjAn*DeEVlbMgK!QA6iTz?=Va_G4+ z!TUsqS9H~GK%^YqPnvkikQcfI@4Jb0+a9gxkM?y$`_@JKdhcf+i1u9`?TfTUD|SXJ zF4-`AF`U4hQ028Ts3itn5raMmNDU8@u+c1pJx;#6&5~=c#|uje2n)-R75xcjCvYap z4G%%lNRTTxyyQVB9j(#47e2}6EI2S{K|HoFEzWuXliVi2(%oS_+<*FGt5DuZr^a=+ zfAqIv-z%=;c}b0iX<}HW`hs|)>D`7;6rg6%uFZvzQOhD&T-qWCX^SAFEh3&tk~K!L z2VcZ2v)^g$z#Z<}cdmE7%X-8TOs>;d3>E(&XHVgQPja8ff28c`t0orx_+1Zhe*l{Q z^N(lYW&!qd9QT+iFAI$94+ZuieaxlPI&apKPEBd>zKo_a6vS155foc+XfDQA z>`@ey9lLsr^AN5Q9(*t~OgWhCmmQK_WQ?@`vC_ISO&Bg&(yH_2R)A^pP5MkMwQ@k+ z0(-W(3HE$UuQ-vr5B4T=5O%L$&lD=DRK)haVZ@fWtEWArJ7Y~X?qakUv z$;0Osgd+>~8n%13e>R>=ll*VTyKatXKVF~YKOTKvuV&Z&vo?)?a{EtS^kkZthRyhY z(bN91MU9aX-zfKQ?vC|>eDs1z?h5rJvw5J;_2>4}A5kBi*=*msxzly#6zBw;$yIx| zZbNtC%^-h(OBgP@HgDSAj#X6@Np{}vlN=Y|Ktp!k%WmM!-S~{vJ)sfnhOBGthJ>^m z64GwSd_jhV2}-UM8@&w+bj|w^%J#c{s&h@|^)uNx*X3^6LFf7a+O?>$C%#au#^3H971+b@M34;P4d-_~V*D3Vf4f}lgc%oR^ z@o94RdU4uzc@VfXY=_p^cF9<{AVXvQ$ye=koa4*a=?P=~Io-DHlETKF^n~&HC%4Pe zB))tQ_)G(7jn*#PyEZ|Xvn-m8lTC@Su*Jojr)AtMJ#8_Bw8aq87IP2~4Yn+$#V9uT zH5!UjUD&#wm$)3y0M7|IExpdhMNUIU(NCS0!UMPDl5-dRr0huF4(EnqtY33?{=lMf z@eTTcZl|TgX;@eEa?z7Tk3{i0P!(-h=QJ#fwsaf_y)$^T{7zKo(ru;%<| zV^=gV@PgA)>b!g)R56OT{~4zmTRq%KY+$xkH#qX_n&`9`ry@hvB+(7A^15M| z6STc}LT-~Fi_L(9$YKq{o`$&vn_~^^0#UMXhDeoX$|vjR$g1GE!f5BnB~f!la43>F z&iOI~FOVz87Rsd|OGFKRsa!a=6l+dgb2|uol_-p95H&xIa%J3V^FMIEM40rY(#*(u zZLIM04n;>CLJu4iIffkJQXA`%q7hKlx^e~O}_cn29K56`I6VFDtwvGI;PW7jXllbv-1JTtd4txUk?<_F`^xb*Nce8r~jcd)dod zIGnl;v^yY0>pGmebxw1~;mTe{av;OkpH=o`@ZJA{m!c{Hv*=_eTe;4ge+0VpoW>Z$Q zDHl_*T5OmF_p;GA&FheSEOZndIgfpz?2+KRk?oP8r;y6ZV%-$N72r+(H)$N&%RK_w z9Jq8Clf{Cek^YyRUF(Kk)8swOJu4J=$)kfK8Npi)75!+{r%tPeg2={d_MQw=bAaQoSC`KnVIX%89NpOT9NKENtP*oaFWMOJ0aY( zgV!AP>jW1T(ILA?NWyeVU}4cnXc`?Y52m~!M4j9_Kb(?>97j+`z#m1{`3hv; zek9dNLb||*X+6BAqyG5r;|UOaZ}HXOIGl!I7E^yfkSRNj%9LQey=`N6i%80TUwGG_*@LG?TZsAbb=n zVLj9y6!6wcvPxKA$(Vnq7}d@Q>w~*8G7ju8sB7Ge1*{nhplYn76xjA-Zkz;!v$Aj_ zF#eV|WbLgzW6Anv2Gqu$m4rKktSm%CZ4{DXDl@w@j!v76i#|#iIi+`3bkcSh9o~~E zfrKpt43T19y3WkTno;khnU`)AG>bB`H()~pb_{MbvXXEgl`a4zxc>E7M$i%~;X@(o z6Vy`smQf+d@^C+(WVx3GRvl*-x~#P(Q(-;<3VsrT(72%BH)j$k_|33ntsTi}(GI#r zSFz@k7M)?Dej7qaqs}2MimeG{SYXRS&S6KIH$g?|0vHvnLNZ|ygX~LYEI<-a;c$it zGkcx@cB7?!p?U#4zk}AqD#e4&KmsvjqB& z6+`GJt*KvX0pem;0qb+uoPe$wp19YY&`tI=Hf3P8BbQ6Sf3;`CL4QinnH03iAzxf%l5Ll_O= z_eYw0&w@2G4J`tQ=HAtS%~?z%pOYXLy-5OB#+i*F_)N+Kd_}UPRw7sbsFF*>hmotl zhEw?vJA%yCw5W#wk0!G-T4gNwZ68uG!Ce+@Q8Vdjksj&WB-;B^A>n9;E|)kqq57Q9a_3`-`xp1ImcCe~9Nu2YAy-{rJnr^gX4+ zm>$vr>x^lUsy|2vvMl=Z)Q~3|aH)i{0Vj(~+~5Sl64)mNis@}|?0Z@)AViA=glMsV zdWX6^W!)Rp?mRSJKR`}!s+)1_o$VIt;$^|GF=CI66 zSXOgkr;HV7$%;hLV8sy)EUQWC#c^h|WawboqhwgcG8@UV@`MMJ3?pZeIL^u`E^;w3U6DqkzkDyF4H zACwkyC@rM8-*@65Q!|hi!r_CW@-cxxD995)gJQMqmu%=jeYh12D2ink3=zzYE1|h2 zm@Qy#LInj_-ebwhgcTk@=9sWXtTWy!SpT{=M0jhPIf0=UmhK|If7wM{R>5J%Fz1-ZC1#7ENUFpP2Lv#e-I z1Qnzukv&@y{iTjj39EpqGvn+%?p)w8)p^^+Oh}Hu{3nJtVbeIM}bQtP5(qX8KM29_x zGB^SYr>m0W{y#7i0kAYR0eo4?6nrJJLD84o0@Mlwv;Lo8xf^S6`K&|Hz6(C#67~uI73JecwH~3*x z3iuAxVep-)@8G*o?cmb_%Z<_oO57;}@I5Ib@O`N%;KL=r;0F)|olV)Tf|4G@l)gDO%2J>suH7)Q)O z(L^l>{h= z2+;zK(>ieWgRFCCY+G`|M;5r^&(PJZa8;w$(9j94YN0_BTs1=d;#?KtT*cyCl}pS= z3PMhxf*5Be3yO+HMR6_)YuQSEpyzk%d!0&YRO4masDfqi-PbnGO2{@$l$I{SD^+4=-pz3=n=yqm;Pc3rVj`<88A|y)Cn`2 zU?>>|4K7!_5QMK*QSDt}61azk+j{ThV83Y#PQ0Vq#hKeoX&lh8XKoos0vXJ0sLaQL z>rz=(YZ4UZ6+9QTW$hJ%v;!{ye85GC6X^E2=!XLH7i`EVX^=Qbtf7B1I zmbfek&L5y9UdX5hMRnM7`-7f%E-uf$xANo~VGwnX~&8zin~)o@Ff*216}WfhCR7 zI?kHLdAAJ4f()%AE=qL6;n;}T8b5&q1yl@A!m$VXf<{F>^}<8@L6{=Wk_Xb$2bkrv z_-hF&3O85s>c zAn%Av-b^0i@EwYSZ|X4mUE`A1!;?!9N5#<-o^ab;gnVY8A^doO3{-@|nJvvmaT#e0 zVG5KX7c%2QHUQB~)(;?hjzB-ZoWC5a63VzEV#iuYiI44Pt)X+Dq%M(VdK(;y$Q-TW!Z~=^DEv4c&+dXAYYxaB%Bq%sU0{s?h^qS z(<@zUY?{p@M6-E>Xg1Gj76x14i^gVw-hqCVQQ`cn$QYT?eV~@>4fU8Y5&%T4(aw zpHNv8L>hiGiVIhb3sh#6kyfaF73VS>>Z*|gF;v2wt~jfa3A073pT${Oz$bK26E&M| z5oczZbL!;DliwRF-^NXe3)G0SpUZL>K7Sr$9cKpL<~3N>v~DRBWskb0W`-Nbc3oK*cnctir5OH5rh}nk+#9PlN#HkOF-d)HkDUU=tE2 z3HxU_TQdZIK3T%ZktK{gQR(VKF8oo1B?W#%SqlCDnEvCJlyL9|kwe!*sPzD=6J2Hv zGRqo47C0lRcMz^aj!2Ip))PmQvlU}VUB{BUoyU`Voee2nsLw>AUpk3gCq9`NKc7M_ z<2E5zo=>HA0M2yk5cuX)0r+#MTi{z!cfp@a)q-zBJqF*7`U(Dg3eTiiPz<1XCM5>` zEUGW~v#9~#&!^PD*CM-o^QmC~OHn!`{7sf+I#BRn{}b4Du;C~^$J}Q|n5QYRTn%I8eKBK6$`Ip)UZrunn1lD3O#?;~{#vEp;Uy zko$t+kw@J6FO6{JB;c@59I7WES1w;V(iUBItO4wvMBuF z9Tb}j4`MbjLlg63`iae>Z6ie8P%9b$*&(_D8J+L|4ov=ok5(jTp@vT!H<8VLbZ>2ZI1YR>}*R1W)KN1nzj?GwzBl3wK~Z`=cpYH|LYV^g@>ZZVzFC zGahg-JvuaV0yX@%+%n#?jY$FES+fBlN)1e*poSIJ5{=%{&ehE`z-u|)G=~mwy4_uY zba??jeOoU6(~fg@1@p{ZY<+rR~T_A-`E(_Y@4iU4nt2K$QOaB0Wfd8zOt9MAF7j$Exf?R1^_ zX_qEA(6!)%D7VB7f1n*tBQXR@&_^_I(p=iN(*Y2o1~{hhgn7~ChB1o2m$59G()Zo# z%%&7aF2Uhaih1!;;fF?^AM};NU?-G=aQrcErZslp+g)yD*`497_8TN;%gLVCi6f6~?nGK$w@V8isM)X%2um z1kUdk;_9*7gTvQo&W6#YTpX$gufsaiEhf{Qc6N)|Lp;IZwiwolmnx@wD!zMq6d`5z z7NaTUZ!uU$08S?O_^JGZLqL7+7Q@$>A%MH#oEB5!j*V(e2u_K#SO7qn*HjG*L&rZh zuq>KVvN$C11cyy2j%9+wr4;kxrK&&K972*jFmr~4&mr90H zJe@ONpQ=DecS`9R@>7brGX!vXg$AmZOZe9GrWB{C41o^x;fGF@OX+($07BFNCl;PC zFEn^fJAO*BESgdkPDTWYBfpS?5*#k2m=`aVZueAtlnw;E?v&Cs}N_PT;d7+7I+VNA0Wzm$5=VU~X_$ehgTuL!7 zUMkD(srV=z40zosrEADf=@5eBgT%qHgQQx~;k_wUCpc(~n^V*fZl8X`gy4oyNNE~C znAbu4&O#hNrC1hCDenC79EZ}r5JYgelww}IR4==y;-eJVLU&5(8uC+$YY18rk#*VX z4PSdxigPN4zz_7{hi)jBQemhI9ij#}X8^nozYTgAhK`?7EQ_Y}BPSyohy9-7+=t+B zDZS1KA*BoiPRw)s(hAu^cS`9R@>2?32spUyf`-O_@9~K2O)0)~a9bYWa4I;QODV3d z&<&^50Otxom=_u@ryW0~SQbsGMfWp;rxw9|FwryXB0h5)S&rA~>q+{hsW7Qnjy*02tbZh+XP8Yj1)FGbWa9ab*S^~>eEqHuDZ5kJ`%ZCu4H*K7;G^+S zGr3HY-jt3bIF0DT58YU9zprIeIu9JK8i zo71~BrVyNK=)(`)WNvF*V3$6bw1x^iVP1HJ0PXnu9m}FAt>i?Le-5RXJHg>nih1!; z!K9ea@l$FH;oT{vYskhSwJ{+$o_smbAbwVW`%O7}(By(szJ1v-uJlc(V2``EeQeGO zl+RcJo1G=5X?fys~fpq0R6UNDgT{>MZZN!kA|KOIxP77DR za?G2%cC&)c%Lo;%I8U_J3?YV`kmrQ6KgV(&*`GN0A6==@WAw+X@wxx%?lHZw;|=Kq zc=wnrxqB=P_^26sX#DB!v0d=Wb#q|UmOZ#^IpL^QlMi@r**pW2nEc`HF?ds`-)tOC zT9ZHAJthK?zu^rK(uA!W`2Fopj%9$S2JwmTLx-=?-|hlA3pm%U^kL8%PxUzK|aa7x&Ce=D~iWKan>Z-L`^>tVU_e=K(x zWKae1?KtcBFUsu;a(@`gesF&)R~h2;0B0urY~hCr2!En?58(Mjyb#Jb9Dd9Hv*ujNkDy+Zs$gMyvhmabgsgtz!P&GQQIatrZtBKu(E=98}f!ObUN2MX$; z0;A~v(YsIn)0ay8C$F>k&))8$$G$d$Mr>L~k^fIinx_J@M8 zB%n|iAmZUMnc4AGS}fs~TA-1Otgq!u)5SH*m-!s3e94$(eqU&IXN+`}f0o42juTnq z0#Y)kJ}Aw7Y|@^0`bEIQF=0*(Gs>kOJXtuo^3-YFI?ahxz0G=?+FMF)71y%bE)G_| zalw91(v@=N(W^NJas-EqZ5DRTtdqK_(JXm>)0&{sa+XULoEqR(Fj>btd%NkA6(Y+X z3*@O)rD)04w8X`nUp6Q!Tjc1=YpMG8bD9p7imn{nPBFKh5KmT4k!j48_FJbjd8yd$ z0MA4LCy&={HvazZZUL$fb-iM&DEBWPl0*Vl9~Dq3XcOD$aD(~vX5Bfjxy_g4-{$1A z)@;7~t6{)X_nA766kFF+Z}GCc|8s#`=A3&rSrbF4yu;6RbMKoTZJ1S?^lH%i?`kP=vUH8~(@D#O=bkhb940F(nIEer zRXQ|liNl4MAT{y(-j`Efy4{m$uXjl)ts5~UrQ+Ph6SXCMCtp~&LHgn-Bd4pE&IDY! zt`?Q^A^XC$y;9G!8GEbFhfXlBd3!dz>K{eT$3js`PeSA+Jzhi`dG4Cxw^aIsqu(mY za+#O^bcydAmO)9JKOnkx`cCGjs>5QNmV6Ny_`6WV*V)1Sdzp{d`egN3wTjJ@pA{xZK{}lD~CY{-wS(ThA?SI{e^4Us8VUD7HD+kJ)wGNW|MoQb4ZjfY&zP4EG<^UH)z}$^(>EK9@-QSS4L+7bRp> zc!4p&P1EQ2ccsM@bIg5bJ`N9@GRvecwdE4OubUa&oO_@aieLB*AwBDHr%IMmx+^QluGwaWWK&MdbZf+|a#cWDP{ zjn9|7cyOy!kxGNGV?v7{?gde%dMf=kx*LosvenTRDh}|R(H6co_PC>cNwTT6SbW{B znYo3P@l7oqWp!;Yq^z?}&xy>)+Nu+EpjIQ_XQVN~$^<-|sBz`07;azI?#z2><#lJCoFC>xB#CWt945Gi8*1z`RiAv^ztiir zOK2{iC)QOT$4agLaJ*8n$`c~1l zVuV@b&n4kr&%Z?&kG^D~VGyb!K46@dywI0C+u0WqEanB*dqwEAL@xf_`ufea!p`4o z5-VyZrC!C9i+H>9R$+j!ROS!l%{M z1vn10)=_kgG?3b_qcZHNDm6u(O1W&S7nQc%J%d$go3%r!xb3M!Tg#1I#|v9(lIy-T z=ZR*VNKn1xU$3`ct3@m3LxlhB(-y(iK`PEaMroNfHX77>r->G?^RR2O8{*YE=T&Q_ z;E}>~6`#atUCp%A5jh#fFWXb=J15?0eXzQ-sXWg=eSN26=AJ3yshR5xqfedFP#yVM zQFPoGGp&Ik;d-JM8-p#rR`}Z(M47D$&vf>%s_iIazHY3#lXa&(A-eY2EcxWKlIjWB zw}R9Di8IZOHgi^Ihz1z;zhSJX7b7Dxd}@ld4tB1^-D@A(M%?Rb-8j=evSV(NPVMUZs(0M`#3$&?%S|4e*pxe{ zqApG3eQTu4nL;n~z(k9H(P_3}O$PE4(?!MA{Xkty+sjz)WyJC1qZWDFyj2p94AY9g z`Yf;P%fW<-ckcC_*VS8I*IjMQQ}|VJT-rD)UNbT?(fG1PMeq;BGG8OJ*Hc%8cP`5E z_j=Oi7+E}C-1g%NLyPa{GsJT~rOF@FzhfM~yi;Q*zW?L>3Izi1M>7`Yn+ZNSAujr^ zuuLQq%;v=?Sqtab^pV+SRLOi0vs=2cWxkYWdw+4;oe#w%bPh;NHg}Q?KCG!~Uixyt z!0`WH5wQvRCd+wazwaq?X$-}@ZXJTI4M86vCTI7v}m_qW2T ztvO0_Uaso<%xsQf?Z|Btw(cl3y8J_O;-rt$jU}UFr_7speUjH)!O08yx)=nl-9O%- z=+QWVbmg(p*BtaN)FkP?^{*cDR6tID`zwEq({hfx`s!h6Lx${m zt)|$jF?jgJm0E-9uV|Ys{xxEm#FXJ}s>^hWR$Lgl_tw`@XAX@YeLZ1s@b@z7Bpb(y%T)s9P!mPena z%t_gM!|d!Q5%X_WCNl~&Hcp>D=B{bT0;Y-9>zPvrY++5CyX3Q-kD&hiDS2TI;twv_ zZ@K=%HuvPjdCwKr%&m#cw`rR2+_Aw{ZBgt8?}g_#9a%6o@trf{=Ljdq89^>fN1t(B zuQIOj(z5T*K9-+mGNUG}vjDdGFwF6(cLombX5jKA_wChpgx2`{ER&ilHo zo|Sr`p=$8gr>|y@fAUbuzqZ9Y{XzD_mirqrb!vo;xL4@kORMw?eqHU{U!zL)w@dM` zUHflDYCXC+(?q%Cj=e+S&q+x|hc;FhBsIxhKXGII}YduHY8?OR*fx>t8xT!N_U>@6;h(p!C5<=fu>vp)Xu_o=Ln zGlk-^)NgLy?727Un#_WYug?u!U-{_C2D>{uqdkt<#7tD~yGeR^O>A1l^Yq&*Q(3@vYD{uIGeDpj0V=Lx|9Wgb&bo9oEA8D=ACLTQ5 zx#sXcyYmlKgxtt_(@*4L{&AD+xVsxKNj<)sX>^`>!JRqt{CqFgxg|qtb6qVIuZVoJ z&C%PRc==*{eO}Zv)vJ$O9It&Co05<3zn4#54(pcq$&Y8V-T5PT7v#UV@n*?feu05Fb^r7Du{qTlo_Oc!eQXTru?a)2iq>w7xvFyj` zskg4LZa8zi#Alk=@-WSydv}A^ok>zumecup>4@=x3gu11n#%i6-4=4_wA#&crRJ-| zrkovPYjE=|<{q3oYFtj@Awbo_`CPxo)S}*OIlzO=^^{|5|EQ zkvdNMl6pe1a&l_gI;~;-%sa2FQ8N|Xv8_$^dy~b9$qN+rEigWzp1pm5UiJ5baen11 z6qqM&pKcUgmmj^jNTez_&E-;G)z=Gi(%U9AC|bt6DXe_9KGIiablGZui}0dDOzESM$$B z&NZ*;_r5D&u#vmC*``Ntn#bJQxOHpr{R1C{pKrI>?rQ&X<3zm$6Qjhp9e*9DKS-<~ zR(k2NiCIS)O|BNi{t_NNVrJi2R$tGyt{5^VS?)mm%6#pV0d>38W|y|D9F<{l{klMB z)lqL#KUJ6H?-3KUtam4;I)C}B{z|x?|D45#>^{>gi+o8{@_BMnX0J#f}63cL`vV$Fk(w{HYJ z7_d;{{K3YT0~J~~M4Xsi>s!_*QzrbB)4{^a6K+NdtpA<9|J5Ev4M~GEgFqYAt;dzT zV+)r(nliFJXynYx)w@1z5E4&%opXNmOzFb|N1a!(m{K)OXJO#aqHm9zk0tup3`#$D zXVpEa&|Pkqy+4Zx*W>#iE~=aSQO0fL9&wv1qDyb|3-)W<*6eX~+yT#|!!nOIkBNAa zbL3e~^T6Fzb(_VrEwv-huetgrM@Mw~wE>9(F3EcOom2bLdU=^ebiQeQ|3~-NE`9p) zUEBREo2crTl0E?`_MZMHu6Me(uZs67eXk(kWbGjmP}jkn?2#ZQ{naQ??UtpltV_*e z)0c;QmMx#ecv(4H=)QTCbWG<_i7fwdStmNCW~Kx@&Mkd#I~FN14L~a}Kx)Zx*{LRhM~Q zvRPwv(3(vPmRQOaxD7a!?X5F;#S_!*0*{x8q*STpwbaOJEju3*Cz72tDD~RQqfI&Y z^;e3P9%54MW0S>CY;BZDQC{aKoh!CiP9dBef$T-{CiOU-jx`8jWYUEaLL{po-P#YZ|bw^Xlb{dwQgYfh%y zf{9r+_YUV#q4#rjpU-MIYC8F0Qtgq-8%wJnwEdjs+w3psq~uCxx&jP4HGmynJ+0TTPmd%>#!tis9I3Wh0EUe#qYVjOm(Smml;u4 znsTlpWk^ZwiHi#_Ozu1CqV$GKSDlQmUkNz#Aty?0@3jlrjO^!9q35gizO6Bz@K06v zS)s?8iXl&wqF#7N%J1?tik4pLH)WNdT^ z{Ar8NZLN9m;BeEy%AJvh4-0QtH+-2_nd|fUSe}EAahAwai%f&r52dvqot03rG+@m7 zW-7F5al_)4q7yz1^YsF^wwU?mN0hl;*plZR)qiMERoc8I&kgQKg(u}onlpw7DqWs0 ztU0>)icx;%RmtJn7aeyvUGNhstnE6URZ*@tvhDzDQGLdMeV&Eq-g|t}4D&m@UvTM8 ziT&at>F;C=jF*f0#0XOkeUh%t+W0(YmBQ-t+8I*WDuz3%w(fgXlP|sINy{b4#|?vH ztE=vRzW;pclBXAb40;q5xFKKZ?zhXDi-OLDH!5E;58o{2__~Yf7wj!!bX!h9(rKI5 zfvz9!8NP1*UDZkfK)eD&%V)!SDJ<83eO)YZ6n_}G;S1L3>1 zB0KHs9Y(0v`CPl;y=v4Aw^=#POH>54g0y#Cl*}JrB(?RRqi}B~9-ZsPD@p!DYX>!S}x_Gh5!rYl1Elu$++Um+qXIV>SWkk+75T&zq zQ;KT&tU`Gk+d6gGm2JV*ZY`!eMrG8_AD{JFK{X|-RyZm;d810o!hKY_@;RN3$LR)T zdtZk;J9h;HsNOd2Y)bon(|`8*Oi2$#u3noED(CIl=frVzSKc`r4GaC3n*0-ZyqseeEdQx!k?h$v@)t028~c z`i0ifsY){P3z&-P{WJ`NA5B&_-RITme|!yW063J154EZ=^b|`dt6`oxxgp zor}+CG@iX^T=6kgK1wH6JTsuwLgQ40t>W9Ck!B;Fdxb9 zR-M-(N2#phJeBC^Wv21{mpJAwnik%a;uug@r>J8+P|6_Eb(o6I{wb8|)5|H8d|H&A zEi1!)`;IKz%BO9`N;g{C99jyG@A_7kT$3T1*L+De;lzHudjA;M0J!ZR@u51{;`9$^ zm7qp5tx?|f294{AMblvU?=h#noM?!XvuTi9RDz(==ZeXXJF&r?x+6y)&`A zsdM%EbpO0PnU0;Asp3;kMH{Xgsj6{qoT%dGfm&u`MD@Z$EP@*^+W1#|U1b(!;NhGZ zUe-}-Rn_>K*$x{3&uXI+&L+#x%1%(1{3k8=R&=gu97EmNtiNG^sGg$njo~sfF+SEQ zQzPxt8S^7Lu3Ng7ZP;K~JSauI&E&)N2&a>)^n_Nci(d_!uH|JM(e(F zJ0k5@*Xks>-%-7C&dp>f%_O!3Fm*JehGI>T2z@$%0qj&yAMXe&PcyM^J39Py0v2jx>g#T(zz z->K2L9N&L|Lcj5h==*_!X88+6#ZNpDDJy&@l&~gK*jgz@rjJbyv(jjr^zN7kQuA9H z#rwB=iap$ED{(+aLej~6va06c-~lg7%?BL{A2@LFfDtOAB~SPN;I>csR6}7u->k3l zbvUY9K$(g&n9deS!-0fW9vl8AD4}% zf1ETWHd=Dh^@;N)3(oa2aOt~X{Qk8;;~o_mj8#q-&~vyJt(#PHVNA9ETYWi!ryBmR zwhv9;c6?Zi-fvBvMWyQQb1a9X4O^}Dde4x-8m)?2D=!Y$zEVGE#IMC>!>33r(^;n4 zHuA!XqETOO?HxV-(3#-93D=h`c=J7E;KGdMPxSYM?;NVS!p2%VwD0HTVKw_^M8-W? zxo&p0^;&5$r8VX5gCo|59$7hc;LcS-X}4G3yxkd)H|pHd$myGc3_I!rJGM9bXT=8i zg}-04L~ov;Z>!-r_p|H7JeDdNyJ?^DUff(@<8`d|zNhEa7v4h{SA3rNCRo&#sm)Y8 z*mt(=Agfu4VG-8#9>1(q#mg)mFYTC<^7N?LjlC)6BA?FAFtPeJeWON!>D@8YO_&Qp zrp|n=HI21pfZgXMbLZ;|`Z$E;O|if9K-~7n^)2%zp3I%QM&Y?leq@c~^9fCh)NC6T zdVh#raAebY=XZ%?oksj*xCG5`bUibAY2!GR_0PU9yY&2g`NtO_N9$fsy5RKYcb)&M z9G@{SS4j)EXwEYH_)?Ae{?GyY4~yH}nnpi=+5BO1^}ACB@o#;du6Fjx`Sh!@s^s_X zfCF9gMbbO^%Z~i{aFt5?fg4kQIAw&jQq2}$3ZvG2ik__b*~~$%P26mw>-?Q z(aGFU;eJG@GVPvz_3L22Dvkcm#V)^PZ|vVS?B*k_$P#6fnS~DacZ!lG{Vb^7c<8!Z zQ&QQSvnOtED^9&ty833Rq}=B_(?vt?#x9*!e!aT?J;BR5iD#2dwlDn^zC(NJsGZHj z`z0TnvVXUy-KnG@Z@=t%w!SzuujI#p$TQ{p4f`bj(-CnnB`Zi{Pq=WOeR{dG_O@28 zO^6$(yJfbk=vL`Qmu=-N-}v?ayk|}Q{y0u(=Elu8)w81ZdT!phK<3)|f#+Utc=D(+ zdgmRx7@K1roBAqGjICKNo&LNc?S$Hu-6y?;?wvXk*q-rj<(ji27+0!u1z;$lA~C=aAZTRJWr;HdSHj=^x7)R$ss6Q*!)F*mALHckcyhCY@OqtRtta zXnf?-&rQk|2l|&c4LcOFZR)w3YNy3knU|)GIXgvp>#ao+Mm|}Yo2ZJ>a}9lWzju|2 zS@`Ms|j^X;ljo-eMjh(k3{DsMfhtfZ6t}Xeb{o|m;?$jHO zLv*#CA8@coMca ze1GG#{nb$=?F9x)`bNYvm%nr#U*^;}H^a)V%j8>A%Fqnf<`AXvElNTgO@8D}8TQZM z=0O^J=C3qmJ*z#d?{x0=hlSZj^IuiEn9q$o*Y&<%jl0p{fJd9m#BYsheiOWP>&D?9 z4&2{v(|&&AOMBOe3-l%)-zFY4NI&qkbZmiG*2H5=ubMO-5&jih(0AsD(PzI}%^EXg zMQi*4x#Se>{FQ3E>jtcBE1iAaB4bolr@(bTQ}3hSlU-D;wI)P3rzY=yrT+QL9RGg8 zUuz>5zj3eJ>RO-uu26jIyj5Av1w;izDYVXl|Bf2iFj+JAUG=}bwt-GsrI{$=WKRL7YM^~snyy+dbc$I+c z^74$|w?j(zIUM;sq(wQ|yz|V2^ciw4cUH{#D01&}oX3;tnhBmiOq<$AN7$I|95~ii z^ZcWCdmmi8(0;R7a>l_e{XWUKAGGupowUy;KYEzKVIu< zUM4@bQ7Js#VAMUi_?f2|#;<4OMr}}g@hox0BByVCW;QSE{5*e3O29^u!S|=QO~1*y zcQSH(dijHOriOt?`{RR!10Do59y~A6sxa{7>=O|i`jq+Bo(h-Ayj*zD zNg(p(g#GEi*J~*5d1a7hAh}i5CNS1p>G+gK%L+#Z)sNg&eR-z1(1uUvb6zJMmY%s< z<@~6D)2gOe{0v;E)BN~bk&RE{u{-C|2Zc)ATjhP(ZCAap$Y;=Xq{s!0L^D7HPJnY9 zeZ-Wu)&3O%H8>IQFTw}&gP@7b)oSQzbcB-z)xO%f+76VDS12AnW2-!HPHbZ}=o8xr z(I>VMq7@c6SwR4CG`5YcJ?l%%x9=69n&fJgZv~7{uqF~Or(dz*IjZBbRFe?Bph--> z$kZyVA?mlDRCxqGk4i zcgh%tnJpC3uNjKj>MO*c^%Z?ER#eagsq5LPqY8w;${|aL+*zVu%z6a&q~93z7=`sS$Xc(5)J*hx#?W`ho6+8rDeC4@g2yug>6A0-J$X z32YGF=)i6)#te$0KB`$WW8Q+X%c$Q%%Pm+B3f>Cp3-D@1x5pX{dDf(>I6$CcoxEJ> z8g=SV;?yYWqtGl?N!ZnxZ?4XvLufOu|6*vqbopMfXkih)aya5ez}yE1TEK<;xX@}Y zw1o?ysveydl)Kr`RW4M?h2UTZI~L~xbc)|xNFFrz=rC0-G>QwEaG`}<2v1efDMGkV z6c@rvW9eADvW|vMbD=^mRLzB+aiK3<2#uT2Y5Q>@buOgGg{E>LUoI5Eg*I`aBrb&Z zZ0Vc_LmSY#?;>Cs1i2BOCJ`eiEu<(@fThV*v@(-iEz?Y-;gD+1V0bhwa2Yz3w z6ntgsF8KY3+La29mR`n^QQ;KB`5iJ!41*|gZ7_el1B5ZyDNqUXc8~NJ4>lLUM}yE{ zovBAWYO-@|M&a3rWq*vPx%6j(i$(yMM7@&zNMW6^j;KublgH4B2Bm9&Z)j+M7jQKZ zxgmf9ml`eiAWt%Y*@xT+A!{!5i+-6t=J4Na2wnwPs&qeqw4uet3%0nhWZi>% zir}tb{n~Cdqnl@qh7t-5AQSqCBQ#))uqz2tgH#Pf#!Oai*k#Be=9@E)P(#-3f@Wp? za(207gqm1|z5ZUsDjZ6N`0av5Sw;aABdcE;AD|&$@J!6L;H|RDBDjsKuxKib9h$iX zav`4R*v<_*#Dy+!q3c|ziVMBuLSMO%AiR%s846qoj|kFX6S>fIE;Nq|;q^8&-exYe zjSC&-LK$4>8W$?%LN#3I9T)n=g(Tr6rpp-2g@$vXX)qOc?Gr;mx3HW`ea_|)i z%Tp$|miMDRLP&q=Gx#c0EBLD9*75;=6fk(Q03E*&LGggk&^T0|9`O?(kl#$P+#ljO zW{R1Ro*V^$KTiIbo+Dsv0on-lL&u3fNaEoQ1ji9Dqk9M#tTWb88UA|-7q z><~cuyL^%7$`{NGB@R!%V7Jin1tD6#AcP$W5}Qpln9C(KrLn=97FdG~W9VNm0;5_| zAZmn~5gS(_gULUhoui!q$w?J*#;!%;@m0~FBZ&`efH;_Xc5{f!X&CJu_8U2A`T$PP zhUwKP*hok?3SPX96`!#%YzP#*98rsvrk7j@(Mv9b=%(Nl$!-y1GKU@?|0yF`ILbIi zvdA2RYa)yKUo?`1Cz{wp7s^N1+ej9rMk1))Cx*YEA@n&T9b1g?2Lo8Rh{f|v@`7z` z^gGCZnhGaY41r}NEqLJmod&RawjW&r@*Ud2=^r@QiAGGYmU!}tcKk;fkv{q;V-_cx z{PQ1WBskoojF=ZM)s^n4_>Qn5UiYJne=~Q56F@whb;nL{R_`{%QO^*-Gg_Qc%QJU1 zkX^bcP|6TchbPPn&wA00pHfi>qAC5vi6;LXO0m@l4wq8QiW`!6|y2c4R%eYe`{|_k-abk@KhLwQl7c1kysEoGbGX zGUUZ`97^ROh~RK3#k_c_#&u7{*QdyFx>Nc$<5tLN@ch|zsdJINDU~7l;Nq4;DQ!B6 z-++-cP%0>Zhh{M^JkLfueoCbwh^Dld6HWd(l;SugI9y6GFJ7wZ?y2}F#nI56Qnqm` zzO!#AO*qD__%p%--h8`ZuH84sXc{?7EA|u0L5b00#{K#H=UBc&p#bXX>KYgrsHy3X zGaN(5;Q3E!%CEncsW%KpJT8syPv<{XyR$*)_TJ||5yz|t9y$NXXQ&SIPlum7G_fSG zxykSo2C4L?^M-0Lo)RJcJhB9E*yrS2C!e8049DnlHV!_cGm+Ib;eXdK4BNd1@LsWT zak!HFdem>z^hW#uJ+(uZ6_UHI|EDs6^@(xuSK5vAYb#N$Lg}e&Rd8$o=#J*su z5$XcWlDZDR|3}YZ8tAI&sJW<3=1v9w`)2}~a1c-t2Hq+-uMTJ4mqOEt$uZ!iTM^{z z8SD+4Ro&xVLtuF!Cf5&=_y&f0Ee~`HfRtd<8%D2~TptKVn+~qtVSyebtvrMfn+|l) zzc_ao_1+NX%oZ?No&=NS>1cR+x}PDeqop9&ZVB`b1xr?C*iw~ZF>DfG^*Rq=4KUU{ z7USUGko`~iQxiT!-9QulGwl<=qOG40ZOImGXp2St76=`f08?}uHXf{=bAE!o=uj2b zO&7S#+z@B&s+ewWTptb&9f7YsvUw30!noMNIX%7_II~wESL*g5(0=e~NDd(SwHGD= zUxK{qk|c#ZF(2KB*sWJ2Mx>P}9Fl#hb>J&g_^J#fS7`KSU-5R7gg_UORRWgGamX;S z5wIp42klR$Q}~|*KmK^!|Km(SodB|cU+;J^MB)yu(LGifSSIF;wdz8Eb{ta;upP)= zeyKr?J>gPwn4Zu}jUns+OITiT3@zjGBP1wnxrY}JK^s~g0vXalh=?|tk-Sj&(dOkb z=`H9v9L4N0%vr2pyNgmO;3FhSVUHjrLFtVeGfEF2TFBsZL6}fM$BUv_cCI~Szb>?h zECsi?vd4i!QC~=a87c5B(ges|FZ7)%Um;EdejJBG1|6?`=x1mFZo`i1(XgB}I0x;^ zOUP;1e{;KXnha}AukR3|*LMiv?2R`0hW}V^bTl@uZQ<7Kih^dDg11tPTM5%8B#Y?Q zMI-?-9{=1h`1YXVWJo{J&!5>3JwFk0(%>+lkMa{lPQ%c~K{!{DcON|*DzS1jl?c&P zB1BWkDFEdlIvN|R_@7$E;yjqUisi^S53CE!M3B%?zMjHTt`uHz%AicVz1%`a>7to< zb_oB>3_}?LT9~w(<6lSOWQ-xuYwp%XM)NeJsoOBwzVUu=<)7?-NwgJ6*P-WxLf1K3=S*0KjclChv=A}Z@MLfqp zOU0UWUp=tfnQw-QlTC&IauJ-De!j`P)w{otwbSPHIQ_+2`I$Zk-3TOg^dEq>l zcKquk45TTY#)&5X97-{Fg2Sa0^WvqN(LEL4yjUD!x>NeMwJ-hFGN|@Z#(BLdrPscj zFgJEtytS_lHv}owhbPR7o>^lQKc&1?>>P~ZI(|wC4wq8QiF6hrA}Maasr4PFq=d%(}1pz7pCav=eP_}m{>j`%qk zKP>Y*T!HW#>cY4YfP;1{(0wHx4hsX>xr_OE6~=YKZxOJM1^DuUL)5=n1X=+&v1~l7 z0w10orbXuozwK-s5&+)+w-pi#Qd<8TR!D4H^#9WZ(*L_Fq+m4-J6$!7eHHF(3l}14 z(8hl-lkzXtD0suJ6uDN2RSw@cyWpd4i)_p{ykQ83gi8^wT9o0!_1I7FIDh+wpXcE9 zXB90M&Ot!?Vbl*<=9W~5Lj@io*4yt-3tkB^ir_7oVJNXx6|1;SC zLhOHG_P+@GUzGhX#{L&)|4Xp{CE5Q{?0;$YzYP1IiT{lDsGG90m@(lnnTA_>WD;h= z7gi<4Z8Ju@Mc7wXfqvEH&p`3_&#aPb2(WJJSAG8;^O)7a+|&oJ+F_L}DtIRADp}xC zBnKqYOjwvw1E?>tp({%10xU-E{1PYH5fap52$7^3z?Y($!Dmv~bg~p$^_8Q3fGC@yi5fKj;piH<*Bm_7eQyg`46 zr#~>^1={qLH2mr5H58rOXN&-+(_<=+b;7){)_h-LIQK;0ng**k1b!rpe0@RL{9k>I z!Dgnfe?f@8{skeFH#8T-e+DHYi~lq>mh}I}JeI?WJg_R@{`cmwC?&c(e))hro*_UF z6OalsX20k?TfjDA2%vO8Y;^z5d2G*?!2J0y4WZ|;xOITFq~#al@XtfAUi6F$=PNwN qnTKFs6CCb51oPshn#D^35dS;`#aH(k7n^pzc?b^XKg~n1-Tn^*;xW1a literal 0 HcmV?d00001