From e8c2250d0a4d39843de8c5ec96675d130dacd630 Mon Sep 17 00:00:00 2001 From: terminx Date: Tue, 20 Aug 2013 21:49:44 +0000 Subject: [PATCH] Rip out all traces of nedmalloc. Sorry, XP users--it's time to upgrade to something newer than an OS from 2001 if this affects you. git-svn-id: https://svn.eduke32.com/eduke32@4027 1a8010ca-5511-0410-912e-c29ae57300e0 --- polymer/eduke32/build/include/nedmalloc.h | 1639 --------------------- polymer/eduke32/build/src/winbits.c | 26 +- polymer/eduke32/eduke32.vcxproj | 2 - polymer/eduke32/eduke32.vcxproj.filters | 6 - polymer/eduke32/package/nedmalloc.dll | Bin 87040 -> 0 bytes polymer/eduke32/source/game.c | 4 - polymer/eduke32/source/sdlmusic.c | 2 +- 7 files changed, 2 insertions(+), 1677 deletions(-) delete mode 100644 polymer/eduke32/build/include/nedmalloc.h delete mode 100644 polymer/eduke32/package/nedmalloc.dll diff --git a/polymer/eduke32/build/include/nedmalloc.h b/polymer/eduke32/build/include/nedmalloc.h deleted file mode 100644 index a438d2df0..000000000 --- a/polymer/eduke32/build/include/nedmalloc.h +++ /dev/null @@ -1,1639 +0,0 @@ -/* nedalloc, an alternative malloc implementation for multiple threads without -lock contention based on dlmalloc v2.8.4. (C) 2005-2010 Niall Douglas - -Boost Software License - Version 1.0 - August 17th, 2003 - -Permission is hereby granted, free of charge, to any person or organization -obtaining a copy of the software and accompanying documentation covered by -this license (the "Software") to use, reproduce, display, distribute, -execute, and transmit the Software, and to prepare derivative works of the -Software, and to permit third-parties to whom the Software is furnished to -do so, all subject to the following: - -The copyright notices in the Software and this entire statement, including -the above license grant, this restriction and the following disclaimer, -must be included in all copies of the Software, in whole or in part, and -all derivative works of the Software, unless such copies or derivative -works are solely in the form of machine-executable object code generated by -a source language processor. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -*/ - -#ifndef NEDMALLOC_H -#define NEDMALLOC_H - -#ifndef UNREFERENCED_PARAMETER - #define UNREFERENCED_PARAMETER(x) x=x -#endif - -#if defined __GNUC__ || defined __clang__ -# define ATTRIBUTE(attrlist) __attribute__(attrlist) -#else -# define ATTRIBUTE(attrlist) -#endif - -/*! \file nedmalloc.h -\brief Defines the functionality provided by nedalloc. -*/ - -/*! \mainpage - -Please see the Readme.html -*/ - -/*! \def NEDMALLOC_DEBUG -\brief Defines the assertion checking performed by nedalloc - -NEDMALLOC_DEBUG can be defined to cause DEBUG to be set differently for nedmalloc -than for the rest of the build. Remember to set NDEBUG to disable all assertion -checking too. -*/ - -/*! \def ENABLE_LARGE_PAGES -\brief Defines whether nedalloc uses large pages (>=2Mb) - -ENABLE_LARGE_PAGES enables support for requesting memory from the system in large -(typically >=2Mb) pages if the host OS supports this. These occupy just a single -TLB entry and can significantly improve performance in large working set applications. -*/ - -/*! \def ENABLE_FAST_HEAP_DETECTION -\brief Defines whether nedalloc takes platform specific shortcuts when detecting foreign blocks. - -ENABLE_FAST_HEAP_DETECTION enables special logic to detect blocks allocated -by the system heap. This avoids 1.5%-2% overhead when checking for non-nedmalloc -blocks, but it assumes that the NT and glibc heaps function in a very specific -fashion which may not hold true across OS upgrades. -*/ - -/*! \def HAVE_CPP0XRVALUEREFS -\ingroup C++ -\brief Enables rvalue references - -Define to enable the usage of rvalue references which enables move semantics and -other things. Automatically defined if __cplusplus indicates a C++0x compiler, -otherwise you'll need to set it yourself. -*/ - -/*! \def HAVE_CPP0XVARIADICTEMPLATES -\ingroup C++ -\brief Enables variadic templates - -Define to enable the usage of variadic templates which enables the use of arbitrary -numbers of policies and other useful things. Automatically defined if __cplusplus -indicates a C++0x compiler, otherwise you'll need to set it yourself. -*/ - -/*! \def HAVE_CPP0XSTATICASSERT -\ingroup C++ -\brief Enables static assertions - -Define to enable the usage of static assertions. Automatically defined if __cplusplus -indicates a C++0x compiler, otherwise you'll need to set it yourself. -*/ - -/*! \def HAVE_CPP0XTYPETRAITS -\ingroup C++ -\brief Enables type traits - -Define to enable the usage of <type_traits>. Automatically defined if __cplusplus -indicates a C++0x compiler, otherwise you'll need to set it yourself. -*/ - -#if __cplusplus > 199711L || defined(HAVE_CPP0X) /* Do we have C++0x? */ -#undef HAVE_CPP0XRVALUEREFS -#define HAVE_CPP0XRVALUEREFS 1 -#undef HAVE_CPP0XVARIADICTEMPLATES -#define HAVE_CPP0XVARIADICTEMPLATES 1 -#undef HAVE_CPP0XSTATICASSERT -#define HAVE_CPP0XSTATICASSERT 1 -#undef HAVE_CPP0XTYPETRAITS -#define HAVE_CPP0XTYPETRAITS 1 -#endif - -#include /* for size_t */ - -/*! \def NEDMALLOCEXTSPEC -\brief Defines how nedalloc's API is to be made visible. - -NEDMALLOCEXTSPEC can be defined to be __declspec(dllexport) or -__attribute__ ((visibility("default"))) or whatever you like. It defaults -to extern unless NEDMALLOC_DLL_EXPORTS is set as it would be when building -nedmalloc.dll. - */ -#ifndef NEDMALLOCEXTSPEC - #ifdef NEDMALLOC_DLL_EXPORTS - #ifdef _WIN32 - #define NEDMALLOCEXTSPEC extern __declspec(dllexport) - #elif defined(__GNUC__) - #define NEDMALLOCEXTSPEC extern __attribute__ ((visibility("default"))) - #endif - #ifndef ENABLE_TOLERANT_NEDMALLOC - #define ENABLE_TOLERANT_NEDMALLOC 1 - #endif - #else - #define NEDMALLOCEXTSPEC extern - #endif -#endif - -/*! \def NEDMALLOCDEPRECATED -\brief Defined to mark an API as deprecated */ -#ifndef NEDMALLOCDEPRECATED -#if defined(_MSC_VER) && !defined(__GCCXML__) - #define NEDMALLOCDEPRECATED __declspec(deprecated) -#elif defined(__GNUC__) && !defined(__GCCXML__) - #define NEDMALLOCDEPRECATED __attribute ((deprecated)) -#else -//! Marks a function as being deprecated - #define NEDMALLOCDEPRECATED -#endif -#endif - -/*! \def RESTRICT -\brief Defined to the restrict keyword or equivalent if available */ -#ifndef RESTRICT -#if __STDC_VERSION__ >= 199901L /* C99 or better */ - #define RESTRICT restrict -#else - #if defined(_MSC_VER) && _MSC_VER>=1400 - #define RESTRICT __restrict - #endif - #ifdef __GNUC__ - #define RESTRICT __restrict - #endif -#endif -#ifndef RESTRICT - #define RESTRICT -#endif -#endif - -#if defined(_MSC_VER) && _MSC_VER>=1400 - #define NEDMALLOCPTRATTR __declspec(restrict) - #define NEDMALLOCNOALIASATTR __declspec(noalias) -#endif -#ifdef __GNUC__ - #define NEDMALLOCPTRATTR __attribute__ ((malloc)) -#endif -/*! \def NEDMALLOCPTRATTR -\brief Defined to the specifier for a pointer which points to a memory block. Like NEDMALLOCNOALIASATTR, but sadly not identical. */ -#ifndef NEDMALLOCPTRATTR - #define NEDMALLOCPTRATTR -#endif -/*! \def NEDMALLOCNOALIASATTR -\brief Defined to the specifier for a pointer which does not alias any other variable. */ -#ifndef NEDMALLOCNOALIASATTR - #define NEDMALLOCNOALIASATTR -#endif - -/*! \def USE_MAGIC_HEADERS -\brief Defines whether nedalloc should use magic headers in foreign heap block detection - -USE_MAGIC_HEADERS causes nedalloc to allocate an extra three sizeof(size_t) -to each block. nedpfree() and nedprealloc() can then automagically know when -to free a system allocated block. Enabling this typically adds 20-50% to -application memory usage, and is mandatory if USE_ALLOCATOR is not 1. -*/ -#ifndef USE_MAGIC_HEADERS - #define USE_MAGIC_HEADERS 0 -#endif - -/*! \def USE_ALLOCATOR -\brief Defines the underlying allocator to use - -USE_ALLOCATOR can be one of these settings (it defaults to 1): - 0: System allocator (nedmalloc now simply acts as a threadcache) which is - very useful for testing with valgrind and Glowcode. - WARNING: Intended for DEBUG USE ONLY - not all functions work correctly. - 1: dlmalloc -*/ -#ifndef USE_ALLOCATOR - #define USE_ALLOCATOR 1 /* dlmalloc */ -#endif - -#if !USE_ALLOCATOR && !USE_MAGIC_HEADERS -#error If you are using the system allocator then you MUST use magic headers -#endif - -/*! \def REPLACE_SYSTEM_ALLOCATOR -\brief Defines whether to replace the system allocator (malloc(), free() et al) with nedalloc's implementation. - -REPLACE_SYSTEM_ALLOCATOR on POSIX causes nedalloc's functions to be called -malloc, free etc. instead of nedmalloc, nedfree etc. You may or may not want -this. On Windows it causes nedmalloc to patch all loaded DLLs and binaries -to replace usage of the system allocator. - -Always turns on ENABLE_TOLERANT_NEDMALLOC. -*/ -#ifdef REPLACE_SYSTEM_ALLOCATOR - #if USE_ALLOCATOR==0 - #error Cannot combine using the system allocator with replacing the system allocator - #endif - #ifndef ENABLE_TOLERANT_NEDMALLOC - #define ENABLE_TOLERANT_NEDMALLOC 1 - #endif - #ifndef _WIN32 /* We have a dedicated patcher for Windows */ - #define nedmalloc malloc - #define nedmalloc2 malloc2 - #define nedcalloc calloc - #define nedrealloc realloc - #define nedrealloc2 realloc2 - #define nedfree free - #define nedfree2 free2 - #define nedmemalign memalign - #define nedmallinfo mallinfo - #define nedmallopt mallopt - #define nedmalloc_trim malloc_trim - #define nedmalloc_stats malloc_stats - #define nedmalloc_footprint malloc_footprint - #define nedindependent_calloc independent_calloc - #define nedindependent_comalloc independent_comalloc - #ifdef __GNUC__ - #define nedmemsize malloc_usable_size - #endif - #endif -#endif - -/*! \def ENABLE_TOLERANT_NEDMALLOC -\brief Defines whether nedalloc should check for blocks from the system allocator. - -ENABLE_TOLERANT_NEDMALLOC is automatically turned on if REPLACE_SYSTEM_ALLOCATOR -is set or the Windows DLL is being built. This causes nedmalloc to detect when a -system allocator block is passed to it and to handle it appropriately. Note that -without USE_MAGIC_HEADERS there is a very tiny chance that nedmalloc will segfault -on non-Windows builds (it uses Win32 SEH to trap segfaults on Windows and there -is no comparable system on POSIX). -*/ - -#if defined(__cplusplus) -extern "C" { -#endif -/*! \brief Returns information about a memory pool */ -struct nedmallinfo { - size_t arena; /*!< non-mmapped space allocated from system */ - size_t ordblks; /*!< number of free chunks */ - size_t smblks; /*!< always 0 */ - size_t hblks; /*!< always 0 */ - size_t hblkhd; /*!< space in mmapped regions */ - size_t usmblks; /*!< maximum total allocated space */ - size_t fsmblks; /*!< always 0 */ - size_t uordblks; /*!< total allocated space */ - size_t fordblks; /*!< total free space */ - size_t keepcost; /*!< releasable (via malloc_trim) space */ -}; -#if defined(__cplusplus) -} -#endif - -/*! \def NO_NED_NAMESPACE -\brief Defines the use of the nedalloc namespace for the C functions. - -NO_NED_NAMESPACE prevents the functions from being defined in the nedalloc -namespace when in C++ (uses the global C namespace instead). -*/ -/*! \def THROWSPEC -\brief Defined to throw() or noexcept(true) (as in, throws nothing) under C++, otherwise nothing. -*/ -#if defined(__cplusplus) - #if !defined(NO_NED_NAMESPACE) -namespace nedalloc { - #else -extern "C" { - #endif - #if __cplusplus > 199711L - #define THROWSPEC noexcept(true) - #else - #define THROWSPEC throw() - #endif -#else - #define THROWSPEC -#endif - -/* These are the global functions */ - -/*! \defgroup v2malloc The v2 malloc API - -\warning This API is being completely retired in v1.10 beta 2 and replaced with the API -being developed for inclusion into the C1X programming language standard - -For the v1.10 release which was generously sponsored by -Applied Research Associates (USA), -a new general purpose allocator API was designed which is intended to remedy many -of the long standing problems and inefficiencies introduced by the ISO C allocator -API. Internally nedalloc's implementations of nedmalloc(), nedcalloc(), nedmemalign() -and nedrealloc() call into this API: - - - -If nedmalloc.h is being included by C++ code, the alignment and flags parameters -default to zero which makes the new API identical to the old API (roll on the introduction -of default parameters to C!). The ability for realloc2() to take an alignment is -particularly useful for extending aligned vector arrays such as SSE/AVX -vector arrays. Hitherto SSE/AVX vector code had to jump through all sorts of unpleasant -hoops to maintain alignment :(. - -Note that using any of these flags other than M2_ZERO_MEMORY or any alignment -other than zero inhibits the threadcache. - -Currently MREMAP support is limited to Linux and Windows. Patches implementing -support for other platforms are welcome. - -On Linux the non portable mremap() kernel function is currently used, so in fact -the M2_RESERVE_* options are currently ignored. - -On Windows, there are two different MREMAP implementations which are chosen according -to whether a 32 bit or a 64 bit build is being performed. The 32 bit implementation -is based on Win32 file mappings where it reserves the address space within the Windows -VM system, so you can safely specify silly reservation quantities like 2Gb per block -and not exhaust local process address space. Note however that on x86 this costs -2Kb (1Kb if PAE is off) of kernel memory per Mb reserved, and as kernel memory has -a hard limit of 447Mb on x86 you will find the total address space reservable in -the system is limited. On x64, or if you define WIN32_DIRECT_USE_FILE_MAPPINGS=0 -on x86, a much faster implementation of using VirtualAlloc(MEM_RESERVE) to directly -reserve the address space is used. - -When using M2_RESERVE_* with realloc2(), the setting only takes effect when the -mmapped chunk has exceeded its reservation space and a new reservation space needs -to be created. -*/ - -#ifndef M2_FLAGS_DEFINED -#define M2_FLAGS_DEFINED - -/*! \def M2_ZERO_MEMORY -\ingroup v2malloc -\brief Sets the contents of the allocated block (or any increase in the allocated -block) to zero. - -Note that this zeroes only the increase from what dlmalloc thinks -the chunk's size is, so if you realloc2() a block which wasn't allocated using -malloc2() using this flag then you may have garbage just before the newly extended -space. - -\li Rationale: Memory returned by the system is guaranteed to -be zero on most platforms, and hence dlmalloc knows when it can skip zeroing -memory. This improves performance. -*/ -#define M2_ZERO_MEMORY (1<<0) - -/*! \def M2_PREVENT_MOVE -\ingroup v2malloc -\brief Cause realloc2() to attempt to extend a block in place, but to never move -it. - -\li Rationale: C++ makes almost no use of realloc(), even for -contiguous arrays such as std::vector<> because most C++ objects cannot be relocated -in memory without a copy or rvalue construction (though some clever STL implementations -specialise for Plain Old Data (POD) types, and use realloc() then and only then). -This flag allows C++ containers to speculatively try to extend in place, thus -improving performance especially for large allocations which will use -mmap(). -*/ -#define M2_PREVENT_MOVE (1<<1) - -/*! \def M2_ALWAYS_MMAP -\ingroup v2malloc -\brief Always allocate as though mmap_threshold were being exceeded. - -In the case of realloc2(), note that setting this bit will not necessarily mmap a chunk -which isn't already mmapped, but it will force a mmapped chunk if new memory -needs allocating. - -\li Rationale: If you know that an array you are allocating -is going to be repeatedly extended up into the hundred of kilobytes range, then -you can avoid the constant memory copying into larger blocks by specifying this -flag at the beginning along with one of the M2_RESERVE_* flags below. This can -greatly improve performance for large arrays. -*/ -#define M2_ALWAYS_MMAP (1<<2) -#define M2_RESERVED1 (1<<3) -#define M2_RESERVED2 (1<<4) -#define M2_RESERVED3 (1<<5) -#define M2_RESERVED4 (1<<6) -#define M2_RESERVED5 (1<<7) -#define M2_RESERVE_ISMULTIPLIER (1<<15) -/* 7 bits is given to the address reservation specifier. -This lets you set a multiplier (bit 15 set) or a 1<< shift value. -*/ -#define M2_RESERVE_MASK 0x00007f00 - -/*! \def M2_RESERVE_MULT(n) -\ingroup v2malloc -\brief Reserve n times as much address space such that mmapped realloc2(size <= -n * original size) avoids memory copying and hence is much faster. -*/ -#define M2_RESERVE_MULT(n) (M2_RESERVE_ISMULTIPLIER|(((n)<<8)&M2_RESERVE_MASK)) - -/*! \def M2_RESERVE_SHIFT(n) -\ingroup v2malloc -\brief Reserve (1<0.01%) but real chance of segfault on non-Windows -systems when passing non-nedmalloc blocks if you don't use USE_MAGIC_HEADERS. -*/ -NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR size_t nedblksize(int *RESTRICT isforeign, void *RESTRICT mem, unsigned flags=0) THROWSPEC; -#else -NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR size_t nedblksize(int *RESTRICT isforeign, void *RESTRICT mem, unsigned flags) THROWSPEC; -#endif -/*! \brief Identical to nedblksize() except without the isforeign */ -NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR size_t nedmemsize(void *RESTRICT mem) THROWSPEC; - -/*! \brief Equivalent to nedpsetvalue((nedpool *) 0, v) */ -NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR void nedsetvalue(void *v) THROWSPEC; - -/*! \brief Equivalent to nedpmalloc2((nedpool *) 0, size, 0, 0) */ -NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void * nedmalloc(size_t size) THROWSPEC; -/*! \brief Equivalent to nedpmalloc2((nedpool *) 0, no*size, 0, M2_ZERO_MEMORY) */ -NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void * nedcalloc(size_t no, size_t size) THROWSPEC; -/*! \brief Equivalent to nedprealloc2((nedpool *) 0, size, mem, size, 0, M2_RESERVE_MULT(8)) */ -NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void * nedrealloc(void *mem, size_t size) THROWSPEC; -/*! \brief Equivalent to nedpfree2((nedpool *) 0, mem, 0) */ -NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR void nedfree(void *mem) THROWSPEC; -/*! \brief Equivalent to nedpmalloc2((nedpool *) 0, size, alignment, 0) */ -NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void * nedmemalign(size_t alignment, size_t bytes) THROWSPEC; - -#if defined(__cplusplus) -/*! \ingroup v2malloc -\brief Equivalent to nedpmalloc2((nedpool *) 0, size, alignment, flags) */ -NEDMALLOCDEPRECATED NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void * nedmalloc2(size_t size, size_t alignment=0, unsigned flags=0) THROWSPEC; -/*! \ingroup v2malloc -\brief Equivalent to nedprealloc2((nedpool *) 0, mem, size, alignment, flags) */ -NEDMALLOCDEPRECATED NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void * nedrealloc2(void *mem, size_t size, size_t alignment=0, unsigned flags=0) THROWSPEC; -/*! \ingroup v2malloc -\brief Equivalent to nedpfree2((nedpool *) 0, mem, flags) */ -NEDMALLOCDEPRECATED NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR void nedfree2(void *mem, unsigned flags=0) THROWSPEC; -#else -NEDMALLOCDEPRECATED NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void * nedmalloc2(size_t size, size_t alignment, unsigned flags) THROWSPEC; -NEDMALLOCDEPRECATED NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void * nedrealloc2(void *mem, size_t size, size_t alignment, unsigned flags) THROWSPEC; -NEDMALLOCDEPRECATED NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR void nedfree2(void *mem, unsigned flags) THROWSPEC; -#endif - -/*! \brief Equivalent to nedpmallinfo((nedpool *) 0) */ -NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR struct nedmallinfo nedmallinfo(void) THROWSPEC; -/*! \brief Equivalent to nedpmallopt((nedpool *) 0, parno, value) */ -NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR int nedmallopt(int parno, int value) THROWSPEC; -/*! \brief Returns the internal allocation granularity and the magic header XOR used for internal consistency checks. */ -NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR void* nedmalloc_internals(size_t *granularity, size_t *magic) THROWSPEC; -/*! \brief Equivalent to nedpmalloc_trim((nedpool *) 0, pad) */ -NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR int nedmalloc_trim(size_t pad) THROWSPEC; -/*! \brief Equivalent to nedpmalloc_stats((nedpool *) 0) */ -NEDMALLOCEXTSPEC void nedmalloc_stats(void) THROWSPEC; -/*! \brief Equivalent to nedpmalloc_footprint((nedpool *) 0) */ -NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR size_t nedmalloc_footprint(void) THROWSPEC; -/*! \brief Equivalent to nedpindependent_calloc((nedpool *) 0, elemsno, elemsize, chunks) */ -NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void **nedindependent_calloc(size_t elemsno, size_t elemsize, void **chunks) THROWSPEC; -/*! \brief Equivalent to nedpindependent_comalloc((nedpool *) 0, elems, sizes, chunks) */ -NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void **nedindependent_comalloc(size_t elems, size_t *sizes, void **chunks) THROWSPEC; - -/*! \brief Destroys the system memory pool used by the functions above. - -Useful for when you have nedmalloc in a DLL you're about to unload. -If you call ANY nedmalloc functions after calling this you will -get a fatal exception! -*/ -NEDMALLOCEXTSPEC void neddestroysyspool() THROWSPEC; - -/*! \brief A nedpool type */ -struct nedpool_t; -/*! \brief A nedpool type */ -typedef struct nedpool_t nedpool; - -/*! \brief Creates a memory pool for use with the nedp* functions below. - -Capacity is how much to allocate immediately (if you know you'll be allocating a lot -of memory very soon) which you can leave at zero. Threads specifies how many threads -will *normally* be accessing the pool concurrently. Setting this to zero means it -extends on demand, but be careful of this as it can rapidly consume system resources -where bursts of concurrent threads use a pool at once. -*/ -NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR nedpool *nedcreatepool(size_t capacity, int threads) THROWSPEC; - -/*! \brief Destroys a memory pool previously created by nedcreatepool(). -*/ -NEDMALLOCEXTSPEC void neddestroypool(nedpool *p) THROWSPEC; - -/*! \brief Returns a zero terminated snapshot of threadpools existing at the time of call. - -Call nedfree() on the returned list when you are done. Returns zero if there is only the -system pool in existence. -*/ -NEDMALLOCEXTSPEC nedpool **nedpoollist() THROWSPEC; - -/*! \brief Sets a value to be associated with a pool. - -You can retrieve this value by passing any memory block allocated from that pool. -*/ -NEDMALLOCEXTSPEC void nedpsetvalue(nedpool *p, void *v) THROWSPEC; - -/*! \brief Gets a previously set value using nedpsetvalue() or zero if memory is unknown. - -Optionally can also retrieve pool. You can detect an unknown block by the return -being zero and *p being unmodifed. -*/ -NEDMALLOCEXTSPEC void *nedgetvalue(nedpool **p, void *mem) THROWSPEC; - -/*! \brief Trims the thread cache for the calling thread, returning any existing cache -data to the central pool. - -Remember to ALWAYS call with zero if you used the system pool. Setting disable to -non-zero replicates neddisablethreadcache(). -*/ -NEDMALLOCEXTSPEC void nedtrimthreadcache(nedpool *p, int disable) THROWSPEC; - -/*! \brief Disables the thread cache for the calling thread, returning any existing cache -data to the central pool. - -Remember to ALWAYS call with zero if you used the system pool. -*/ -NEDMALLOCEXTSPEC void neddisablethreadcache(nedpool *p) THROWSPEC; - -/*! \brief Releases all memory in all threadcaches in the pool, and writes all -accumulated memory operations to the log if enabled. - -You can pass zero for filepath to use the compiled default, or else a char[MAX_PATH] -containing the path you wish to use for the log file. The log file is always -appended to if it already exists. After writing the logs, the logging ability -is disabled for that pool. - -\warning Do NOT call this if the pool is in use - this call is NOT threadsafe. -*/ -NEDMALLOCEXTSPEC size_t nedflushlogs(nedpool *p, char *filepath) THROWSPEC; - - -/*! \brief Equivalent to nedpmalloc2(p, size, 0, 0) */ -NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void * nedpmalloc(nedpool *p, size_t size) THROWSPEC; -/*! \brief Equivalent to nedpmalloc2(p, no*size, 0, M2_ZERO_MEMORY) */ -NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void * nedpcalloc(nedpool *p, size_t no, size_t size) THROWSPEC; -/*! \brief Equivalent to nedprealloc2(p, mem, size, 0, M2_RESERVE_MULT(8)) */ -NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void * nedprealloc(nedpool *p, void *mem, size_t size) THROWSPEC; -/*! \brief Equivalent to nedpfree2(p, mem, 0) */ -NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR void nedpfree(nedpool *p, void *mem) THROWSPEC; -/*! \brief Equivalent to nedpmalloc2(p, bytes, alignment, 0) */ -NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void * nedpmemalign(nedpool *p, size_t alignment, size_t bytes) THROWSPEC; -#if defined(__cplusplus) -/*! \ingroup v2malloc -\brief Allocates a block of memory sized \em size from pool \em p, aligned to \em alignment and according to the flags \em flags. -*/ -NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void * nedpmalloc2(nedpool *p, size_t size, size_t alignment=0, unsigned flags=0) THROWSPEC; -/*! \ingroup v2malloc -\brief Resizes the block of memory at \em mem in pool \em p to size \em size, aligned to \em alignment and according to the flags \em flags. -*/ -NEDMALLOCDEPRECATED NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void * nedprealloc2(nedpool *p, void *mem, size_t size, size_t alignment=0, unsigned flags=0) THROWSPEC; -/*! \brief Frees the block \em mem from the pool \em p according to flags \em flags. */ -NEDMALLOCDEPRECATED NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR void nedpfree2(nedpool *p, void *mem, unsigned flags=0) THROWSPEC; -#else -NEDMALLOCDEPRECATED NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void * nedpmalloc2(nedpool *p, size_t size, size_t alignment, unsigned flags) THROWSPEC; -NEDMALLOCDEPRECATED NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void * nedprealloc2(nedpool *p, void *mem, size_t size, size_t alignment, unsigned flags) THROWSPEC; -NEDMALLOCDEPRECATED NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR void nedpfree2(nedpool *p, void *mem, unsigned flags) THROWSPEC; -#endif -/*! \brief Returns information about the memory pool */ -NEDMALLOCEXTSPEC struct nedmallinfo nedpmallinfo(nedpool *p) THROWSPEC; -/*! \brief Changes the operational parameters of the memory pool */ -NEDMALLOCEXTSPEC int nedpmallopt(nedpool *p, int parno, int value) THROWSPEC; -/*! \brief Tries to release as much free memory back to the system as possible, leaving \em pad remaining per threadpool. */ -NEDMALLOCEXTSPEC int nedpmalloc_trim(nedpool *p, size_t pad) THROWSPEC; -/*! \brief Prints some operational statistics to stdout. */ -NEDMALLOCEXTSPEC void nedpmalloc_stats(nedpool *p) THROWSPEC; -/*! \brief Returns how much memory is currently in use by the memory pool */ -NEDMALLOCEXTSPEC size_t nedpmalloc_footprint(nedpool *p) THROWSPEC; -/*! \brief Returns a series of guaranteed consecutive cleared memory allocations. - - independent_calloc is similar to calloc, but instead of returning a - single cleared space, it returns an array of pointers to n_elements - independent elements that can hold contents of size elem_size, each - of which starts out cleared, and can be independently freed, - realloc'ed etc. The elements are guaranteed to be adjacently - allocated (this is not guaranteed to occur with multiple callocs or - mallocs), which may also improve cache locality in some - applications. - - The "chunks" argument is optional (i.e., may be null, which is - probably the most typical usage). If it is null, the returned array - is itself dynamically allocated and should also be freed when it is - no longer needed. Otherwise, the chunks array must be of at least - n_elements in length. It is filled in with the pointers to the - chunks. - - In either case, independent_calloc returns this pointer array, or - null if the allocation failed. If n_elements is zero and "chunks" - is null, it returns a chunk representing an array with zero elements - (which should be freed if not wanted). - - Each element must be individually freed when it is no longer - needed. If you'd like to instead be able to free all at once, you - should instead use regular calloc and assign pointers into this - space to represent elements. (In this case though, you cannot - independently free elements.) - - independent_calloc simplifies and speeds up implementations of many - kinds of pools. It may also be useful when constructing large data - structures that initially have a fixed number of fixed-sized nodes, - but the number is not known at compile time, and some of the nodes - may later need to be freed. For example: - - struct Node { int item; struct Node* next; }; - - struct Node* build_list() { - struct Node** pool; - int n = read_number_of_nodes_needed(); - if (n <= 0) return 0; - pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0); - if (pool == 0) die(); - // organize into a linked list... - struct Node* first = pool[0]; - for (i = 0; i < n-1; ++i) - pool[i]->next = pool[i+1]; - free(pool); // Can now free the array (or not, if it is needed later) - return first; - } -*/ -NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void **nedpindependent_calloc(nedpool *p, size_t elemsno, size_t elemsize, void **chunks) THROWSPEC; -/*! \brief Returns a series of guaranteed consecutive allocations. - - independent_comalloc allocates, all at once, a set of n_elements - chunks with sizes indicated in the "sizes" array. It returns - an array of pointers to these elements, each of which can be - independently freed, realloc'ed etc. The elements are guaranteed to - be adjacently allocated (this is not guaranteed to occur with - multiple callocs or mallocs), which may also improve cache locality - in some applications. - - The "chunks" argument is optional (i.e., may be null). If it is null - the returned array is itself dynamically allocated and should also - be freed when it is no longer needed. Otherwise, the chunks array - must be of at least n_elements in length. It is filled in with the - pointers to the chunks. - - In either case, independent_comalloc returns this pointer array, or - null if the allocation failed. If n_elements is zero and chunks is - null, it returns a chunk representing an array with zero elements - (which should be freed if not wanted). - - Each element must be individually freed when it is no longer - needed. If you'd like to instead be able to free all at once, you - should instead use a single regular malloc, and assign pointers at - particular offsets in the aggregate space. (In this case though, you - cannot independently free elements.) - - independent_comallac differs from independent_calloc in that each - element may have a different size, and also that it does not - automatically clear elements. - - independent_comalloc can be used to speed up allocation in cases - where several structs or objects must always be allocated at the - same time. For example: - - struct Head { ... } - struct Foot { ... } - - void send_message(char* msg) { - int msglen = strlen(msg); - size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) }; - void* chunks[3]; - if (independent_comalloc(3, sizes, chunks) == 0) - die(); - struct Head* head = (struct Head*)(chunks[0]); - char* body = (char*)(chunks[1]); - struct Foot* foot = (struct Foot*)(chunks[2]); - // ... - } - - In general though, independent_comalloc is worth using only for - larger values of n_elements. For small values, you probably won't - detect enough difference from series of malloc calls to bother. - - Overuse of independent_comalloc can increase overall memory usage, - since it cannot reuse existing noncontiguous small chunks that - might be available for some of the elements. -*/ -NEDMALLOCEXTSPEC NEDMALLOCNOALIASATTR NEDMALLOCPTRATTR void **nedpindependent_comalloc(nedpool *p, size_t elems, size_t *sizes, void **chunks) THROWSPEC; - -#if defined(__cplusplus) -} /* namespace or extern "C" */ -#include -#include -#ifdef HAVE_CPP0XTYPETRAITS -#include -#endif - -// Touch into existence for future platforms -namespace std { namespace tr1 { } } - -/*! \defgroup C++ C++ language support - -Thanks to the generous support of Applied Research Associates (USA), nedalloc has extensive -C++ language support which uses C++ metaprogramming techniques to provide a policy driven -STL container reimplementor. The metaprogramming silently overrides or replaces the STL implementation -on your system (MSVC and GCC are the two currently supported) to \b substantially improve -the performance of STL containers by making use of nedalloc's additional features. - -Sounds difficult to use? Not really. Simply do this: -\code -using namespace nedalloc; -typedef nedallocatorise::policy, - nedpolicy::mmap<>::policy, - nedpolicy::reserveN<26>::policy // 1<<26 = 64Mb. 10,000,000 * sizeof(unsigned int) = 38Mb. ->::value myvectortype; -myvectortype a; -for(int n=0; n<10000000; n++) - a.push_back(n); -\endcode - -The metaprogramming requires a new C++ compiler (> year 2008), and it will readily make use -of a C++0x compiler where it will use rvalue referencing, variadic templates, type traits and more. -Visual Studio 2008 or later is sufficent, as is GCC v4.4 or later. - -nedalloc's metaprogramming is designed to be extensible, so the rest of this page is intended for those -wishing to customise the metaprogramming. If you simply wish to know how to use the -nedalloc::nedallocator STL allocator or the nedalloc::nedallocatorise STL reimplementor, please refer -to test.cpp which gives several examples of usage. - -

Extending the metaprogramming:

-A nedallocator policy looks as follows: -\code -namespace nedpolicy { - template struct sizedalign - { - template class policy : public Base - { - template friend class nedallocatorI::baseimplementation; - protected: - size_t policy_alignment(size_t bytes) const - { - return (bytes < size) ? alignment : 0; - } - }; - }; -} -\endcode -The policy above implements a size based alignment, so if the block being allocated is -less than \em size then it causes \em alignment to be used, otherwise it does not align. -The sizedalign struct is merely a template parameter encapsulator used to capture -additional parameters, so the real policy is in fact the class policy held within in. -If you did not need to specify any additional parameters e.g. if you were defining -policy_nedpool(), then you would directly define a policy returning your nedpool and pass -it directly to nedallocator<>. - -The primary policy functions which are intended to be overridden are listed in -nedalloc::nedallocatorI::baseimplementation in nedmalloc.h and are prefixed by "policy_". -However, there is absolutely no reason why the meatier functions such as -nedalloc::nedallocatorI::baseimplementation::allocate() cannot be overriden, and indeed -some of the policies defined in nedmalloc.h do just that. - -Policy composition is handled by a dedicated recursive variadic template called -nedalloc::nedallocatorI::policycompositor. If you have \em really specialised needs, you -can partially specialise this class to make it do all sorts of interesting things - hence -its separation into its own class. -*/ - -/*! \brief The nedalloc namespace */ -namespace nedalloc { - -/*! \def NEDSTATIC_ASSERT(expr, msg) -\brief Generates a static assertion if (expr)==0 at compile time. - -Make SURE your message contains no spaces or anything else which would make it an invalid -variable name. -*/ -#ifndef HAVE_CPP0XSTATICASSERT -template struct StaticAssert; -template<> struct StaticAssert -{ - StaticAssert() { } -}; -#define NEDSTATIC_ASSERT(expr, msg) \ - nedalloc::StaticAssert<(expr)!=0> ERROR_##msg -#else -#define NEDSTATIC_ASSERT(expr, msg) static_assert((expr)!=0, #msg ) -#endif - -/*! \brief The policy namespace in which all nedallocator policies live. */ -namespace nedpolicy { - /*! \class empty - \ingroup C++ - \brief An empty policy which does nothing. - */ - template class empty : public Base - { - }; -} - -/*! \brief The implementation namespace where the internals live. */ -namespace nedallocatorI -{ - using namespace std; - using namespace tr1; - - /* Roll on variadic templates is all I can say! */ -#ifdef HAVE_CPP0XVARIADICTEMPLATES - template class... policies> class policycompositor - { - public: - typedef policies value; - }; -#else - template class A=nedpolicy::empty, - template class B=nedpolicy::empty, - template class C=nedpolicy::empty, - template class D=nedpolicy::empty, - template class E=nedpolicy::empty, - template class F=nedpolicy::empty, - template class G=nedpolicy::empty, - template class H=nedpolicy::empty, - template class I=nedpolicy::empty, - template class J=nedpolicy::empty, - template class K=nedpolicy::empty, - template class L=nedpolicy::empty, - template class M=nedpolicy::empty, - template class N=nedpolicy::empty, - template class O=nedpolicy::empty - > class policycompositor - { - typedef policycompositor temp; - public: - typedef A value; - }; -#endif - template class policycompositor - { - public: - typedef Impl value; - }; -} - -template class... policies -#else - template class policy1=nedpolicy::empty, - template class policy2=nedpolicy::empty, - template class policy3=nedpolicy::empty, - template class policy4=nedpolicy::empty, - template class policy5=nedpolicy::empty, - template class policy6=nedpolicy::empty, - template class policy7=nedpolicy::empty, - template class policy8=nedpolicy::empty, - template class policy9=nedpolicy::empty, - template class policy10=nedpolicy::empty, - template class policy11=nedpolicy::empty, - template class policy12=nedpolicy::empty, - template class policy13=nedpolicy::empty, - template class policy14=nedpolicy::empty, - template class policy15=nedpolicy::empty -#endif -> class nedallocator; - -namespace nedallocatorI -{ - /*! \brief The base implementation class */ - template class baseimplementation - { - //NEDSTATIC_ASSERT(false, Bad_policies_specified); - }; - /*! \brief The base implementation class */ - template class... policies -#else - template class policy1, - template class policy2, - template class policy3, - template class policy4, - template class policy5, - template class policy6, - template class policy7, - template class policy8, - template class policy9, - template class policy10, - template class policy11, - template class policy12, - template class policy13, - template class policy14, - template class policy15 -#endif - > class baseimplementation > - { - protected: - //! \brief The most derived nedallocator implementation type - typedef nedallocator implementationType; - //! \brief Returns a this for the most derived nedallocator implementation type - implementationType *_this() { return static_cast(this); } - //! \brief Returns a this for the most derived nedallocator implementation type - const implementationType *_this() const { return static_cast(this); } - //! \brief Specifies the nedpool to use. Defaults to zero (the system pool). - nedpool *policy_nedpool(size_t bytes) const - { - UNREFERENCED_PARAMETER(bytes); - return 0; - } - //! \brief Specifies the granularity to use. Defaults to \em bytes (no granularity). - size_t policy_granularity(size_t bytes) const - { - return bytes; - } - //! \brief Specifies the alignment to use. Defaults to zero (no alignment). - size_t policy_alignment(size_t bytes) const - { - UNREFERENCED_PARAMETER(bytes); - return 0; - } - //! \brief Specifies the flags to use. Defaults to zero (no flags). - unsigned policy_flags(size_t bytes) const - { - UNREFERENCED_PARAMETER(bytes); - return 0; - } - //! \brief Specifies what to do when the allocation fails. Defaults to throwing std::bad_alloc. - void policy_throwbadalloc(size_t bytes) const - { - UNREFERENCED_PARAMETER(bytes); -#if defined __EXCEPTIONS && !defined DISABLE_EXCEPTIONS - throw std::bad_alloc(); -#endif - } - //! \brief Specifies if the type is POD. Is std::is_pod::value on C++0x compilers, otherwise false. - static const bool policy_typeIsPOD= -#ifdef HAVE_CPP0XTYPETRAITS - is_pod::value; -#else - false; -#endif - public: - typedef T *pointer; - typedef const T *const_pointer; - typedef T &reference; - typedef const T &const_reference; - typedef T value_type; - typedef size_t size_type; - typedef ptrdiff_t difference_type; - T *address(T &r) const { return &r; } - const T *address(const T &s) const { return &s; } - size_t max_size() const { return (static_cast(0) - static_cast(1)) / sizeof(T); } - bool operator!=(const baseimplementation &other) const { return !(*this == other); } - bool operator==(const baseimplementation &other) const { UNREFERENCED_PARAMETER(other); return true; } - - void construct(T *const p, const T &t) const { - void *const _p = static_cast(p); - new (_p) T(t); - } - void destroy(T *const p) const { - p->~T(); - } - baseimplementation() { } - baseimplementation(const baseimplementation &) { } -#ifdef HAVE_CPP0XRVALUEREFS - baseimplementation(baseimplementation &&) { } -#endif - template struct rebind { - typedef nedallocator other; - }; - template baseimplementation(const nedallocator &) { } - - T *allocate(const size_t n) const { - // Leave these spelled out to aid debugging - const size_t t_size = sizeof(T); - size_t size = _this()->policy_granularity(n*t_size); - nedpool *pool = _this()->policy_nedpool(size); - size_t alignment = _this()->policy_alignment(size); - unsigned flags = _this()->policy_flags(size); - void *ptr = nedpmalloc2(pool, size, alignment, flags); - if(!ptr) - _this()->policy_throwbadalloc(size); - return static_cast(ptr); - } - void deallocate(T *p, const size_t n) const { - UNREFERENCED_PARAMETER(n); - nedpfree(0/*not needed*/, p); - } - template T *allocate(const size_t n, const U * /* hint */) const { - return allocate(n); - } - private: - baseimplementation &operator=(const baseimplementation &); - }; - -} - -namespace nedpolicy -{ - /*! \class granulate - \ingroup C++ - \brief A policy setting the granularity of the allocated memory. - - Memory is sized according to (size+granularity-1) & ~(granularity-1). - In other words, granularity \b must be a power of two. - */ - template struct granulate - { - template class policy : public Base - { - template friend class nedallocatorI::baseimplementation; - protected: - size_t policy_granularity(size_t bytes) const - { - return (bytes+granularity-1) & ~(granularity-1); - } - }; - }; - /*! \class align - \ingroup C++ - \brief A policy setting the alignment of the allocated memory. - */ - template struct align - { - template class policy : public Base - { - template friend class nedallocatorI::baseimplementation; - protected: - size_t policy_alignment(size_t bytes) const - { - UNREFERENCED_PARAMETER(bytes); - return alignment; - } - }; - }; - /*! \class zero - \ingroup C++ - \brief A policy causing the zeroing of the allocated memory. - */ - template struct zero - { - template class policy : public Base - { - template friend class nedallocatorI::baseimplementation; - protected: - unsigned policy_flags(size_t bytes) const - { - return dozero ? Base::policy_flags(bytes)|M2_ZERO_MEMORY : Base::policy_flags(bytes); - } - }; - }; - /*! \class preventmove - \ingroup C++ - \brief A policy preventing the moving of the allocated memory. - */ - template struct preventmove - { - template class policy : public Base - { - template friend class nedallocatorI::baseimplementation; - protected: - unsigned policy_flags(size_t bytes) const - { - return doprevent ? Base::policy_flags(bytes)|M2_PREVENT_MOVE : Base::policy_flags(bytes); - } - }; - }; - /*! \class mmap - \ingroup C++ - \brief A policy causing the mmapping of the allocated memory. - */ - template struct mmap - { - template class policy : public Base - { - template friend class nedallocatorI::baseimplementation; - protected: - unsigned policy_flags(size_t bytes) const - { - return dommap ? Base::policy_flags(bytes)|M2_ALWAYS_MMAP : Base::policy_flags(bytes); - } - }; - }; - /*! \class reserveX - \ingroup C++ - \brief A policy causing the address reservation of X times the allocated memory. - */ - template struct reserveX - { - template class policy : public Base - { - template friend class nedallocatorI::baseimplementation; - protected: - unsigned policy_flags(size_t bytes) const - { - return Base::policy_flags(bytes)|M2_RESERVE_MULT(X); - } - }; - }; - /*! \class reserveN - \ingroup C++ - \brief A policy causing the address reservation of (1< struct reserveN - { - template class policy : public Base - { - template friend class nedallocatorI::baseimplementation; - protected: - unsigned policy_flags(size_t bytes) const - { - return Base::policy_flags(bytes)|M2_RESERVE_SHIFT(N); - } - }; - }; - /*! \class badalloc - \ingroup C++ - \brief A policy specifying what to throw when an allocation failure occurs. - - A type specialisation exists for badalloc which is equivalent to new(nothrow) - i.e. return zero and don't throw anything. - */ - template struct badalloc - { - template class policy : public Base - { - template friend class nedallocatorI::baseimplementation; - protected: - void policy_throwbadalloc(size_t bytes) const - { - UNREFERENCED_PARAMETER(bytes); -#if defined __EXCEPTIONS && !defined DISABLE_EXCEPTIONS - throw T(); -#endif - } - }; - }; - template<> struct badalloc - { - template class policy : public Base - { - template friend class nedallocatorI::baseimplementation; - protected: - void policy_throwbadalloc(size_t bytes) const - { - UNREFERENCED_PARAMETER(bytes); - } - }; - }; - /*! \class typeIsPOD - \ingroup C++ - \brief A policy forcing the treatment of the type as Plain Old Data (POD) - - On C++0x compilers, the <type_traits> is_pod::value is used by default. - However, for earlier compilers and for types where is_pod<>::value returns false - even though the type actually is POD (for example, if you declare a - constructor you lose PODness even if the data contents are still POD), you can - force PODness one way or another. When treated as POD, memcpy() is used instead - of copy construction and realloc() is permitted to move the memory contents when - resizing. - */ - template struct typeIsPOD - { - template class policy : public Base - { - template friend class nedallocatorI::baseimplementation; - protected: - static const bool policy_typeIsPOD=ispod; - }; - }; -} - -/*! \class nedallocator -\ingroup C++ -\brief A policy driven STL allocator which uses nedmalloc - -One of the lesser known features of STL container classes is their ability to take -an allocator implementation class, so where you had std::vector you can now -have std::vector > such that -std::vector<> will now use nedalloc as the policy specifies. - -You almost certainly don't want to use this directly except in the naive -case. See nedalloc::nedallocatorise to see what I mean. -*/ -template class... policies -#else - template class policy1, - template class policy2, - template class policy3, - template class policy4, - template class policy5, - template class policy6, - template class policy7, - template class policy8, - template class policy9, - template class policy10, - template class policy11, - template class policy12, - template class policy13, - template class policy14, - template class policy15 -#endif -> class nedallocator : public nedallocatorI::policycompositor< -#ifdef HAVE_CPP0XVARIADICTEMPLATES - nedallocatorI::baseimplementation >, - policies... -#else - nedallocatorI::baseimplementation >, - policy1, policy2, policy3, policy4, policy5, - policy6, policy7, policy8, policy9, policy10, - policy11, policy12, policy13, policy14, policy15 -#endif ->::value -{ - typedef typename nedallocatorI::policycompositor< -#ifdef HAVE_CPP0XVARIADICTEMPLATES - nedallocatorI::baseimplementation >, - policies... -#else - nedallocatorI::baseimplementation >, - policy1, policy2, policy3, policy4, policy5, - policy6, policy7, policy8, policy9, policy10, - policy11, policy12, policy13, policy14, policy15 -#endif - >::value Base; -public: - nedallocator() { } - nedallocator(const nedallocator &o) : Base(o) { } -#ifdef HAVE_CPP0XRVALUEREFS - nedallocator(nedallocator &&o) : Base(std::move(o)) { } -#endif - /* This templated constructor and rebind() are used by MSVC's secure iterator checker. - I think it's best to not copy state even though it may break policies which store data. */ - template nedallocator(const nedallocator &o) { UNREFERENCED_PARAMETER(o); } -#ifdef HAVE_CPP0XRVALUEREFS - template nedallocator(nedallocator &&o) { } -#endif - - template struct rebind { - typedef nedallocator other; - }; -}; - -namespace nedallocatorI { - // Holds a static allocator instance shared by anything allocating from allocator - template struct StaticAllocator - { - static allocator &get() - { - static allocator a; - return a; - } - }; - // RAII holder for a Newed object - template struct PtrHolder - { - T *mem; - PtrHolder(T *_mem) : mem(_mem) { } - ~PtrHolder() - { - if(mem) - { - allocator &a=nedallocatorI::StaticAllocator::get(); - a.deallocate(mem, sizeof(T)); - mem=0; - } - } - T *release() { T *ret=mem; mem=0; return ret; } - T *operator *() { return mem; } - const T *operator *() const { return mem; } - }; -} -/*! \brief Allocates the memory for an instance of object \em T and constructs it. - -If an exception is thrown during construction, the memory is freed before -rethrowing the exception. - -Usage is very simple: -\code - SSEVectorType *foo1=New(4, 5, 6, 7); -\endcode -*/ -#ifdef HAVE_CPP0XVARIADICTEMPLATES -template, typename... Parameters> inline T *New(const Parameters&... parameters) -#else -template inline T *New() -#endif -{ - allocator &a=nedallocatorI::StaticAllocator::get(); - nedallocatorI::PtrHolder ret(a.allocate(sizeof(T))); - if(*ret) - { -#ifdef HAVE_CPP0XVARIADICTEMPLATES - new((void *) *ret) T(parameters...); -#else - new((void *) *ret) T; -#endif - } - return ret.release(); -} -#ifndef HAVE_CPP0XVARIADICTEMPLATES -// Extremely annoying not to have default template arguments for functions pre-C++0x -template inline T *New() -{ - return New >(); -} -// Also, it's painful to replicate function overloads :( -#define NEDMALLOC_NEWIMPL \ -template inline T *New(NEDMALLOC_NEWIMPLPARSDEFS) \ -{ \ - allocator &a=nedallocatorI::StaticAllocator::get(); \ - nedallocatorI::PtrHolder ret(a.allocate(sizeof(T))); \ - if(*ret) \ - { \ - new((void *) *ret) T(NEDMALLOC_NEWIMPLPARS); \ - } \ - return ret.release(); \ -} \ -template inline T *New(NEDMALLOC_NEWIMPLPARSDEFS)\ -{ \ - return New >(NEDMALLOC_NEWIMPLPARS); \ -} -#define NEDMALLOC_NEWIMPLTYPES typename P1 -#define NEDMALLOC_NEWIMPLPARSDEFS const P1 &p1 -#define NEDMALLOC_NEWIMPLPARS p1 -NEDMALLOC_NEWIMPL -#undef NEDMALLOC_NEWIMPLTYPES -#undef NEDMALLOC_NEWIMPLPARSDEFS -#undef NEDMALLOC_NEWIMPLPARS - -#define NEDMALLOC_NEWIMPLTYPES typename P1, typename P2 -#define NEDMALLOC_NEWIMPLPARSDEFS const P1 &p1, const P2 &p2 -#define NEDMALLOC_NEWIMPLPARS p1, p2 -NEDMALLOC_NEWIMPL -#undef NEDMALLOC_NEWIMPLTYPES -#undef NEDMALLOC_NEWIMPLPARSDEFS -#undef NEDMALLOC_NEWIMPLPARS - -#define NEDMALLOC_NEWIMPLTYPES typename P1, typename P2, typename P3 -#define NEDMALLOC_NEWIMPLPARSDEFS const P1 &p1, const P2 &p2, const P3 &p3 -#define NEDMALLOC_NEWIMPLPARS p1, p2, p3 -NEDMALLOC_NEWIMPL -#undef NEDMALLOC_NEWIMPLTYPES -#undef NEDMALLOC_NEWIMPLPARSDEFS -#undef NEDMALLOC_NEWIMPLPARS - -#define NEDMALLOC_NEWIMPLTYPES typename P1, typename P2, typename P3, typename P4 -#define NEDMALLOC_NEWIMPLPARSDEFS const P1 &p1, const P2 &p2, const P3 &p3, const P4 &p4 -#define NEDMALLOC_NEWIMPLPARS p1, p2, p3, p4 -NEDMALLOC_NEWIMPL -#undef NEDMALLOC_NEWIMPLTYPES -#undef NEDMALLOC_NEWIMPLPARSDEFS -#undef NEDMALLOC_NEWIMPLPARS - -#define NEDMALLOC_NEWIMPLTYPES typename P1, typename P2, typename P3, typename P4, typename P5 -#define NEDMALLOC_NEWIMPLPARSDEFS const P1 &p1, const P2 &p2, const P3 &p3, const P4 &p4, const P5 &p5 -#define NEDMALLOC_NEWIMPLPARS p1, p2, p3, p4, p5 -NEDMALLOC_NEWIMPL -#undef NEDMALLOC_NEWIMPLTYPES -#undef NEDMALLOC_NEWIMPLPARSDEFS -#undef NEDMALLOC_NEWIMPLPARS - -#undef NEDMALLOC_NEWIMPL -#endif - -/*! \brief Destructs an instance of object T, and releases the memory used to store it. -*/ -template inline void Delete(const T *_obj) -{ - T *obj=const_cast(_obj); - allocator &a=nedallocatorI::StaticAllocator::get(); - obj->~T(); - a.deallocate(obj, sizeof(T)); -} -template inline void Delete(const T *obj) { Delete >(obj); } - -/*! \class nedallocatorise -\ingroup C++ -\brief Reimplements a given STL container to make full and efficient usage of nedalloc -\param stlcontainer The STL container you wish to reimplement -\param T The type to be contained -\param policies... Any policies you want applied to the allocator - - -This is a clever bit of C++ metaprogramming if I do say so myself! What it does -is to specialise a STL container implementation to make full use of nedalloc's -advanced facilities, so for example if you do: -\code -using namespace nedalloc; -typedef nedallocatorise::policy, - nedpolicy::mmap<>::policy, - nedpolicy::reserveN<26>::policy // 1<<26 = 64Mb. 10,000,000 * sizeof(unsigned int) = 38Mb. ->::value myvectortype; -myvectortype a; -for(int n=0; n<10000000; n++) - a.push_back(n); -\endcode -What happens here is that nedallocatorise reimplements the parts of -std::vector which extend and shrink the actual memory allocation. -Because the typeIsPOD policy is specified, it means that realloc() -rather than realloc(M2_PREVENT_MOVE) can be used. Also, because the -mmap and the reserveN policies are specified, std::vector immediately -reserves 64Mb of address space and forces the immediate use of mmap(). -This allows you to push_back() a lot of data very, very quickly indeed. -You will also find that pop_back() actually reduces the allocation now -(most implementations don't bother ever releasing memory except when -reaching empty or when resize() is called). When mmapped, reserve() -is automatically held at a minimum of <page size>/sizeof(type) though -larger values are respected. - -test.cpp has a benchmark of the speed differences you may realise, plus -an example of usage. -*/ -template class stlcontainer, - typename T, -#ifdef HAVE_CPP0XVARIADICTEMPLATES - template class... policies -#else - template class policy1=nedpolicy::empty, - template class policy2=nedpolicy::empty, - template class policy3=nedpolicy::empty, - template class policy4=nedpolicy::empty, - template class policy5=nedpolicy::empty, - template class policy6=nedpolicy::empty, - template class policy7=nedpolicy::empty, - template class policy8=nedpolicy::empty, - template class policy9=nedpolicy::empty, - template class policy10=nedpolicy::empty, - template class policy11=nedpolicy::empty, - template class policy12=nedpolicy::empty, - template class policy13=nedpolicy::empty, - template class policy14=nedpolicy::empty, - template class policy15=nedpolicy::empty -#endif -> class nedallocatorise -{ -public: - //! The reimplemented STL container type - typedef stlcontainer > value; -}; - -} /* namespace */ -#endif - -/* Some miscellaneous dlmalloc option documentation */ - -#ifdef DOXYGEN_IS_PARSING_ME -/* Just some false defines to keep doxygen happy */ - -#define NEDMALLOC_DEBUG DEBUG -#define ENABLE_LARGE_PAGES undef -#define ENABLE_FAST_HEAP_DETECTION undef -#define REPLACE_SYSTEM_ALLOCATOR undef -#define ENABLE_TOLERANT_NEDMALLOC undef -#define NO_NED_NAMESPACE undef - -/*! \def MALLOC_ALIGNMENT -\brief Defines what alignment normally returned blocks should use. Is 16 bytes on Mac OS X, otherwise 8 bytes. */ -#define MALLOC_ALIGNMENT 8 - -/*! \def USE_LOCKS -\brief Defines the threadsafety of nedalloc - -USE_LOCKS can be 2 if you want to define your own MLOCK_T, INITIAL_LOCK, -ACQUIRE_LOCK, RELEASE_LOCK, TRY_LOCK, IS_LOCKED and NULL_LOCK_INITIALIZER. -*/ -#define USE_LOCKS 1 - -/*! \def DEFAULT_GRANULARITY -\brief Defines the granularity in which to request or free system memory. -*/ -#define DEFAULT_GRANULARITY (2*1024*1024) - -/*! \def DEFAULT_TRIM_THRESHOLD -\brief Defines how much memory must be free before returning it to the system. -*/ -#define DEFAULT_TRIM_THRESHOLD (2*1024*1024) - -/*! \def DEFAULT_MMAP_THRESHOLD -\brief Defines the threshold above which mmap() is used to perform direct allocation. -*/ -#define DEFAULT_MMAP_THRESHOLD (256*1024) - -/*! \def MAX_RELEASE_CHECK_RATE -\brief Defines how many free() ops should occur before checking how much free memory there is. -*/ -#define MAX_RELEASE_CHECK_RATE 4095 - -/*! \def NEDMALLOC_FORCERESERVE -\brief Lets you force address space reservation in the \b standard malloc API - -Note that by default realloc() sets M2_RESERVE_MULT(8) when thunking to realloc2(), -so you probably don't need to override this -*/ -#define NEDMALLOC_FORCERESERVE(p, mem, size) 0 - -/*! \def NEDMALLOC_TESTLOGENTRY -\brief Used to determine whether a given memory operation should be logged. -*/ -#define NEDMALLOC_TESTLOGENTRY(tc, np, type, mspace, size, mem, alignment, flags, returned) ((type)&ENABLE_LOGGING) - -/*! \def NEDMALLOC_STACKBACKTRACEDEPTH -\brief Turns on stack backtracing in the logger. - -You almost certainly want to constrain what gets logged using NEDMALLOC_TESTLOGENTRY -if you turn this on as the sheer volume of data output can make execution very slow. -*/ -#define NEDMALLOC_STACKBACKTRACEDEPTH 0 - -#endif - -#endif diff --git a/polymer/eduke32/build/src/winbits.c b/polymer/eduke32/build/src/winbits.c index b155dc2e0..fdcfa927b 100644 --- a/polymer/eduke32/build/src/winbits.c +++ b/polymer/eduke32/build/src/winbits.c @@ -9,17 +9,10 @@ #include "cache1d.h" #include "winbits.h" -#ifndef DEBUGGINGAIDS -# define DISABLE_EXCEPTIONS -# include "nedmalloc.h" -#endif - #if defined(_M_X64) || defined(__amd64__) || defined(__x86_64__) # define EBACKTRACEDLL "ebacktrace1-64.dll" -# define NEDMALLOCDLL "nedmalloc-64.dll" #else # define EBACKTRACEDLL "ebacktrace1.dll" -# define NEDMALLOCDLL "nedmalloc.dll" #endif int32_t backgroundidle = 1; @@ -34,8 +27,6 @@ static HANDLE instanceflag = NULL; static OSVERSIONINFOEX osv; -static HMODULE nedhandle = NULL; - static int32_t togglecomp = 1; // @@ -188,19 +179,7 @@ static void ToggleDesktopComposition(BOOL compEnable) // void win_open(void) { -#ifndef DEBUGGINGAIDS - if ((nedhandle = LoadLibrary(NEDMALLOCDLL))) - { -#ifdef __cplusplus - nedalloc::nedpool_t *(WINAPI *nedcreatepool)(size_t, int); - if ((nedcreatepool = (nedalloc::nedpool_t *(WINAPI *)(size_t, int))GetProcAddress(nedhandle, "nedcreatepool"))) -#else - nedpool *(WINAPI *nedcreatepool)(size_t, int); - if ((nedcreatepool = (void *)GetProcAddress(nedhandle, "nedcreatepool"))) -#endif - nedcreatepool(SYSTEM_POOL_SIZE, -1); - } -#else +#ifdef DEBUGGINGAIDS LoadLibraryA(EBACKTRACEDLL); /* wm_msgbox("boo","didn't load backtrace DLL (code %d)\n", (int)GetLastError()); @@ -230,9 +209,6 @@ void win_init(void) } win_printversion(); - - if (nedhandle) - initprintf("Initialized nedmalloc\n"); } void win_setvideomode(int32_t c) diff --git a/polymer/eduke32/eduke32.vcxproj b/polymer/eduke32/eduke32.vcxproj index 84e089f95..0acb1d972 100644 --- a/polymer/eduke32/eduke32.vcxproj +++ b/polymer/eduke32/eduke32.vcxproj @@ -89,11 +89,9 @@ - - diff --git a/polymer/eduke32/eduke32.vcxproj.filters b/polymer/eduke32/eduke32.vcxproj.filters index 155458524..7cc71ccda 100644 --- a/polymer/eduke32/eduke32.vcxproj.filters +++ b/polymer/eduke32/eduke32.vcxproj.filters @@ -102,9 +102,6 @@ build\headers - - build\headers - build\headers @@ -378,9 +375,6 @@ eduke32\headers - - build\headers - eduke32\headers diff --git a/polymer/eduke32/package/nedmalloc.dll b/polymer/eduke32/package/nedmalloc.dll deleted file mode 100644 index e52c86a66c2e6d6e6a3503c6fdbfa06643e2f0d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87040 zcmeFadtekrwm&|T=_C#5FcX--pixE{-Cz)b0c9NG2FME`Fd<|DLK1fu*=&|oOr`R~?>^L(#l2tL$6dd7-4zruVSowm06yY^YgE?lFd#vc1PRRVbE;?Z0QBzf z-uwIS7wGQls_Lp!r%s(Z=hUg1qK7t`EGCmlz!i;}Oxy6JzZ`!5=35(*`we-$pXt>; zhi=fibuO%V?E5v}`H}N`-+A=W#{$mpKH{vAA9eoVQD^S-66cQ|oA=0w z)YQJNSkce@$~Lt5s}&35SLpliEZl|n(Dz#wzK7@0r_L@s%F|aae1*q1EqtFp-(I+l zKmQSXKNWj^!k;sK@VzQ3^V$~p@=T_w=0wxrnM-}~v=-Ctx22f-noOS|=DS90(^5Qb z6gJb%#={9FQzG8YroQ}138prr19{u)&87rX4qosP|1SPCUfZ(Frp?G_A8IzuqwkPE zkVt`R{+i6DF%l)4O&QlD^?V&S#C%O3nN90Bs6BIahere+SrWkO-_GDh@KIXH8BHI@%M1*lYCwQxzOHJX^GDOGkjiU2*!xd8 zlTlLYFJqV3=K!cG7!5qh?#`ilZkdYv#_9|$*JbzlqwfUk0}prtE}J|Kce^}#^)i=} zDv~oj%Ul_YZ?B?eRGa+KtY>L*JJF zMwp4F=imqCq58P zT*X69gz6AV1~k$1LKHvNS6W)Cv~(zq;ufmCk`utN#DjpTLLLxKY(fCJP40cK6P#=N zD!X0Xt>6$VXY3{J6QzE2h*~MAm7-cHsg*Xh(ymrI)XEIC(y3Ou(7lOzDjLZaxLg;5 zR82x)fcBSz2g@8Pv>2fY?aN<*gh{0`&`gBA#p>QtAF9aZPL zq~M9b4_Ox5qqHOk65E^c(8gqXzpRQ^&SejN{Hp`+p*JX>MaE2n4k2);pygC{mx-MA;MqVKlTB=I4~$7k-orKbvQokFt~%3Y^P-`(-||jz1a4;& z1f?T6a1(1<^|58uS7texH7Or=WPJtvSsJ~EYmc)ZiNUk-9|863!_^8$pUd z9=-`7{-I+`8HI?Tq>SWsGR>Vty&f;y&eIJd7rg9cAt8k=IPD93;o zybZM$b&|~-!#iQ$%dx*GN###%qF6aQE+LxYVZc&_z`(s?( z$PicnggOvK3=^f=l&_+JS(bH)Dz#++ zH1l6Lp=umq8jtG(;TW_QX0+b1RHFg}ky|9%?QXS)Rxm)#Y|& zpIMzQsKU5w^09n@HLm)|vg(rA8Y}|}ScOE433IlE#;S73Sv!H{i{6l&7Mqvbn{LZ9 zwL-`=X;TkndK&_Lym>b3Q+*KOeIGC7cQ71WAKF!ku=^GIvO`YXH{n_!%`Su=(b|cXlPXrDvZI&iw zzHpW8H+q5XC*<1iC)_>}gGvh=%49_*_V-|e>`ZA;^N4FX)D@z-6cd@KE|z+9F7*dM zxrH@0-EmbOck6dZ`C*QoU+{gJ-!GEPcs$3?%jVL^>U=p^K`q@H9 znYNB*E|%u~yrvI(La==0ZLdjYlf~dZ`7|pQENL`dDZ7rMbGz8NnNx8AQCC3_Jj~N z({$p!T-%?uvLh6c$9bjqa?NMncdd1wAT{e3`81x|GHHD^GdYgMxSA%0Mmgx zR$uB#o&&9K?qioQ1KG9d$?R{(Bg!Wr(4}v1cs>Eo4d>ednkk&m#YVP7(EhNFm_qQf zJUHdDxb_nHv!luV)^fqm>i5(#NT=0wy zKpo7L2>6u)S%h?mcH+^9Mw8CCy|iCH;Z4G}aV6 zX07`PQZUzIf=0mnAAIIq!)MMleCAA2`BPcpFj<2dkZwt=ceU-f5E2$UAHw+TW!AH{86KZyi> zo3@7MsSotiq`N#~U@6NHf$=Y^&80KgUi}}J36B!XmmuFM3bk;WBP)zr0S3+efMB9A zQ!7U-)$GeWhiEPEg}Fu#Q2Ebr(q zpt~Z!WQEej22rlN*Z_HHDQPUCxk^xNeiqjMV037CWyKuGbo|jJn@~VG%cA_FV>~2?Zy|%0Yi-t~5#C1YQx3d(YwdE1T4GmA#MZM^ z-3o~TRWn_7?^TEcn93%RIIu)g3&hAowt|ZTQHTR8xHu3Ej8IlW94H`hU?s$X0ul$t zadBWuPjTQs=AdkpO2itZdh#I(C|ne%;}3`e?I=W0K8TZs^v<1HakpoT<& zCvA~_>XUZN?v?T4qJjIpOKmkH)v}lv(4PRtq+?T;I3kJqy_AuQ0PzI7k#GwoOm$@d zs7!agzUdq(P4ewPcLwQt!xTP-pjso73q2*Ng<|Wc1o4RHnvpIo@LbdU|3F12}6cdM-zo|j@P=1YDqA-U6i=p zTb$cnVnwq@DObo=3}en7>3Y2UGwoF%*Q2sKHgQ6<=tQNEn;^I zMRl5pQ4!;IkwJvLRP{a;G9a%VI7@g4^@AXR3m4kr_>kDJ^3ihDdxCv&jOe;H21(0fLoiy;V7a*7;ejBY4qTw~JajNm9a@ zFea_}IlZM4+sg`Txnk6Pto^*UBx?QBC1b=G?G?S}Yf@R2U}^P!X?=?GGR_G;bzj8j z$2gveaqNR4?>$m8nGG~P_3o-k)`s_mWOA>;H$KZcVmZo==+B?!{qDqgvcb0G7`8%S zB@&zB7{>KAaJ38i%NL?iJ-3q^CTtd6wz4UbcS^>hNXNUG|!`qJA2eCu=iOTE2L@!SPU&J2RY=w^ERW?@3Ekpsfa=mV7_lvZlwsH&HK6a zseTA*<3~W5RV+p}7h5Q?LgINgZ(G2M-a}vJs0$@EUyNk4g?6pb4tV>rg*FXUUJMLV zR)8Vp6GK`7hLleXX(VSz`@7VWME%w>Oql3%leKO$ksSs(n?TIK>0SR6wM(nx53r?? zDE@vnxrc@_QHVT7`0`F9)>KHWX`wCBS6yhw=-KVZu)Y|W#*3u#YHT&*DK~}~n_y@v z_zr{6rYGZjZB(7OWAKxeS#&V zOwAO`m8z6UckCz< z5o!bVwM*^$4Vn&`VrV+9ugRqUxs>iw7*uGe>B-1Q=H*PVO>oo9zpMVz}H=+<{Qe+_`Y z_T&7uTi-bV{#qL2uX*6Fz4RTIdP99jCVl4tL*H>-2bR8Wrh%#+`i>qz9NxK!8U`)s zKMeMS#`gDzHd=QaWxLq=wM4HlV*G%_2oYUr$9$i4n!V5M(VXP)0mk8EJBFluUXzYz-(XSnS(|d{ozb--PGhGf0K?y_fS2P5tWO$!@#u$415gU5rkr3-< z*ft7;$m5_%$y-1}Z&qyR^{1his!xuUN*Mr6VT4p($-9`$1Q>jijKPO5y9eLE_$QML zGl7xF2VNij(u^3CS8TO+LhQ6eG~q6m&dpf+Eb0_NDHO~V?)Ow%xi*O`J5Z(g@ImYC_# z8}tAHahMtcj;Br_IRrfb3J$3&_a_GDhSJ{egJLJ_-6#-JDCbM=^%YmzZh5s(+x z5<(NOt^%X+Yuso&_Me8)_$+lhOyMlQQ`y_Wn%(=9Pdc>WZsNbh>VZt_Q!h~_7)UJ& z>{4|Oze^6RAKMUs?VR@jB1mk&l$GJR!`+0!B5?{lu=n&LH;T&IpR!9Eo`Q0F7O6}Y%SGc?5$YQcSTdxU0vXf>tdq2QB z&j-{|CH^wK5xS@XT1bK9NuACAsD5Mf$CbuGY zj4BL~B`&Wx*!#*Aaj|uVUJZx<3#s8!2>nu<_$GC!Rul~$3OKe?*xR}&HD({O?1Sm& zE7rQb9#T-&A;0&iRoRMqi560JQf44EBO+-JTA?|jlQP(OZRQAZ20NhB+AwQ$*P}L0 zYmL^rAK}xOvA>K61(#iWq9bryY_VhcDWcmz-);_x`O^W!Kx$=vL}AF){%~JG>1tEF9&G zY2m0A>n1Lds3Ou=fpXB&fp&I!b|WfxGGQHkl)Q}>oMdF3V9~w%&^3M)5Vt7IzorSZ| zGm0)?rMyIc0J0E<5tlq+BXr8QX~KxCD;jt@z>iHH?}4MC>oH+S$?OUmWYhejN*u!F z-uGZ&7C^*$1vrkt_Cy9FoXLdD>l@5;68Rn#*xg)WjHttt2z!>c30WOlg{TRnJDJps zOacU``JF+-FyrjAfUKtps{OuiqNw_{7J{vEPI+vpjS~#5)puYC1{%s)ESb=PE7Pko z$?_1mN5t~Gem?{n$Zu=xh*Q@PPgU0txyD+bPRq~X+Y5C? zudt~*xuNO>zKZ$6EBIP{fg7z1QaiOdtT3-(%*`B$B}#4-)^dl$4OW(;-)yU@ zRQ(ws_VTW|l^Sf={@i3dNYtmdM5EhZfs&k+O3Uls^R-3XjK>-wjwERt$Wl|H%@w1C z)k1p{ye&+oq0J?6Qy#|V?X>uKi~br`yOni(lAaS@6}Q7xhQQZD#N2y80DF>wIKTTM z4M9(#%NpE-jxE!;nK=lf;7{;cQW~=-!5n`ddrV*}Md-9r$r%H=`_cG=Uq!S0S2KtW7M%@5 zB$x?7B+iij?~~Ed#4wzp%GlH3Gx2-Z{6p(;vEhb67?)GDzZ-JOB4Cnzc`+ndgX0if zeWeX;w60x*Zda~g=<}HdHZ<9aB~&(ueb#W+0$KUcaeb>LP|@B5LBOK3z`2o-v$WiE zSSX9Fpdm{O?5!k&^@jikQ4wQvf&?`z0!C^K5ltdfnF-?rqePkd8Ho<6{WC3JY<&#? zco&P-HFgAO#q>BbQklwu=n0;j!O;GD|^&L#+)P3j;BoKs=~r-e#CfL^m> zfiNa;&N9|;9>em1y_K4ztQ1TEw_pDeY$M>55vOvcz9vyQ9F5#+;GAdZ58>qUXI#o7 z3->Px7iFUN^To3u0kd6MdzB7bO{Qia1?wVfh8(LLFslz?AvA#xE9J1o9abL~xS2Kr zUm9eC-p6*)y6c3PHFs)XpdT_{Uzliu(o!tMNfz^o;5WPhJde8qee~V=#NH}GN{6_(?+g~w z?*c!Fh(3f~ya*do8_-3n(#4QDkaaP?(-OD?!uD3nb|42b9v2BDO~gx91Lh3B-gi3Z zgBUF|>@hyTU};o81Mfjr(5ZwwO4u!2Cu!+$XN=>R^GtFD`jYf1wT=NiF*e@qBa(l@ z7)Fy(Mk!2y)~9abr9n@Oi}igdLWd@)+3$f~Y1?X+zt57hNQA##3uM|@GPIKS^tpdC zO8O9!{IEY0CvJTkL8ycl9mYSHk)c{5!n@RNt$P{CP<)gQr&akkB8KTAE0ZwyRC6te zH6H&MR^I`b>1^JwtjZcHXre$i?xhHl4Ba0yv$w=y4Js(g{6h)WLpYp3y;|x}%LG&+ zi|&2u6gyV0y^}JmYYOol=F0>6JSZEj_v1~=4P}z?3l0<_))`W~??TD4=0O5krxr`< zgJNVATP!h<49Pd`(3cBhMsUOCG?6XF!j@rkT5Qv%lioYxYqj29M(~$&(H@jaLa77d zF)PUM?&xI%zlmF$ps@5Zg11J<`-$7ZpCpa9hL*%@NaHPwm57NQ5W%2I8EesqZ49T*s z+r&Sh^;_skZR!ETSApP2LxlGzd=*OYBH%^!N$Nzg^(s-!t}c6^1NJ~0*#r3sh0!?= z+`u4+HMg%Z2=?flL|vK$c$c}bKvqZ7C&smn6=!(Y|I{!^@JGxfac?hc;3W7ffLl5U zj_a&}f1Sv!f%#M%I;LhE^*?n?%o5nEV^n13^-dr?GPYpBI|S3u0!rkpy#S2;9wPO@ z=#rXBr^cU=QqE8lL0CyawaPz zP`k>&%5SWU{Vcr-0&nnGAkl*b+dj;1Q+W(acfltV@q%~%qJb=(#A3_-2iuPg-LIxn z5*A5&VT@Y@$svp540GLAfl(#weLX<@vTY99m4U&Q;SIxoqob_UuOBGF6c$ZiUj}!) z-8K$-2Z?^9x0`KMCe>t{ zx0w*`Bd-;I*=FBVvu#vfhkK7t%WIprg_6`qbeaxm_7CTgW0q+%VUjgp+?8w%l3~=_ zWPR$Vc!CPpdF9hCN+BsgPE@X%14}M82y(5v9y36fjfk>#WVLz65|S7Dku{B*8(6Nb z6M}!=8Yd z0~73Zc{uUl#vPGi$10;CKvvnLa1ybkcF31_tdboNBEqN#tRxk_)Ejv}3Kf+hBQMnp zDW{iwR8gtLB_!&BUi3rNi1>6gdskm*6e~fQi5DBXR@SQMSrjBJCA%5uH_10wN8!A_ z4q^QX!(0OLlD52!h!DwqYAO#N1Tm8Hy9uJ2zOg?IAKP{CfQn(~W=E`lIt<9H+%k31 z+Yv~FNLvxAHdmX9@%0Sj>q;)>#nDIQi&S5gX&rg5`zU9}0IJ7u3pVPf+JBSI2XC+1 z;ZF+q@I5qd{^?n4ujmCL(j`jAyd?OFXP}(@y|N(PhIBGGLxu$~#WScfISv9v5q!M# zA=iU|@t~aQP|jrf%iwWKVCXLoM3=U~_fgp`ZilJV#5ykgwz7gKE2d9#Wjf&~Xb+!2 zC6*IX>Zuat(iQk0UV>+Waw#g`v4uQH3}W;q5@)IDuN6kIaFw!!R*{Vq@Ru#*f@8dK zd{6_P9Ylx_LkLcGfVAUigP*$R79s)JRvj%d2w(|BVRXLdmX@t%Ti`zbHhPx9&wd{K z{bP0ucN831hNBmWz?d-JydU4}6)Ybr4?y9So6)`yu~f9^8hrl_)pvKv_32MyeX2XX zm>lWJj^nAc2P*yAVh2oP5@FHM?>!Yl-~n>`m@Z`%3b4hF!b&XjVcB2s9tb4Du``mO z-a4$z?r{VpcasO6p%DgO#8*^8GPab!w%@Ok zZ2Ksnx{4D&w4fJAK8UR>gg9Fb^oJ;*=px2Mnf~h>-f>7^sWc01?Vjs<$O~9RO!Q2l zS$>L5<@p$&%DG!XgLTahXwu*YFwJfzpZlXKmjYUSgw*thVJUK-fK#-GHz+Vr+dvJA z;U9>aqlhp(`=~`g5U=4huj~V`jp+Fk= zrQJN;HtaFGI+~9oz+qQMT{ooQFXMl66*>;ix7?qnz;5j0nU7K`dJgZGT*$?T$A52p z?}7(T@9}-~ti17BfDCyRCI*u4fv!e)ddz)~`(J1e3Y?CPw|Mth^K^`Tr@!i9+Me+; zF+1AOQ97Ozkp9+KbOf|`P$!LYH3@bZGDtltsul1(BD=f^_Vh%x))o=ezC&p}Xe6dg)l6s5=PEu&%>-kj2shDf-Kl_1Ao`@j}oM z1Hma5#HsA#F{td+AIPZOPujBP^OK!$V>?jR30 zuglITH?V^#I$Cc7G@Rr$o@;Fyr1I&?9t=0^3u2eq9(fz(L$^7B)tgp)Ukg%AWT52Z z%?!p^qP@abmiQoM15v`Ap8P_21h%@hHlS)Mz_9FxdBun_wbJrm&pmJtqDf8##R`+W zj%8cC%Y9aD0Da8)9PCSpdeT1h2$o7;=f-rdHF)=16*9YWgE}$|fJ;NVnqL?;w$8QE zUeVPJWMTgX13TO+Q3R;MaQo4xVc8q{(gx~@gl>;l1Dn)x_X+qB1EGCAd4+QSXkKpQ zZo^b{h~sbIB-+k*vU@up^;YDdnpYUk%SD-{Yq|>tiz1)*((*o-o(eEY$QRK1We-P- za>3#947Pua?E#0|tKSZ@By|Q$V6XC?=-y};=@Xx=qAb?s*1EN*&a;zNRjk4F2pe7B zN)1+D<;1djFLjm@lbP^(OSTwNiDky61@s3>K#GG1VB& z3i+`4u#4>;9fi&_@{w(HcE}(zzN)j9l)u4*CTo!Re>bXHC*W1(0Cy7$I^D_A2s-$e zQN>1qap{BfY4=&b`$U=N?vXU~^5OqmJ+)L%Cm9_Ro6UPgPL65B>fNi5MZJ3&?mNfv zAl>!Jd(r;z7WzJ%%$EqQJXs%!gv}JqL{Fh0PvtUqsWwKN3LN@gK9pNYl<1mw z>)GM8W@FC9jN8Qv-@OM-f|VL#^z8<`F)F<~7wnQY#cn3ZKuk7IHg$*Wh$a%~krA9F zyw2gKow5D+P&&%#m*9J@cS*4eak7j>2y0ow>G+cLAMUNK{vN;F#(b-0^LNqNp!Q(%}zH5-7@Ir z#BK9Qd=Ztp@UjcQ*txLDWsS?A0a?F4ag3qsK8v;NKtJob(Smo8nF&kUQh!ZG?UjWp@ zvB??Gc@nwmm0lf1S>_IdPoeMB{HYbBc1!9s3P2ZCeN%ZuD6FrASW99%TSZeYLj90e z08u5VW|lLxr;W)N5Aa&MIi~6JdgWA7_x<_??!7OuHN@zE)iFfG&Df&m^nkGk7O@SK zP#x{&e&4H@(|UBc$+Y4jzGoAf{tG@Vr{0V;M_x$#-)5kkE>`*P$O?f7!^I7yLcvnd z*}$#gWD<{~Ov8Kk4dB1&ddN!w`5=OPssSkn zoejDM;4ib{06%peFkK5NTA=>`yrT=)p0EX8I7P1k1>#Fl z#@TC=!X~nBffva37^Q`is6a?JI%Hdx#MTilfs%;Gg7qs>*+7>2luu1&Ce;#>N3bOQ z*Fd?NjNx&H^F)`8=n;M>p38^;ET9Q`etmszx%CBBA6goNtGRp|P)%FPoP=(& z(K%qF(=8w}AjNP>f+$^zDG^3>`13)%!NTrtDR|ZzJcA;twvrC_53mBR!~Gc32P)Pt ze+ynCL^zos90v%;4#IKjH`5-FfNQvNRkW_Xh|gik9Z95P4eEq!vA!=ME`S2z%aRR^dWs2#!aSm@D5K)>LW8L$5!>_q{7=0L3Xj6L-PafuIydPx3aeIE(_5D;;8g?w{W z8$bU5Jd1bE7t~AWoQgZikj8N>4~X%Xw_@x?#W@D---ug)SHzghT`YI454@>>udm1j z+LSo9rjTD+68ZwgR+8aF9txHC4r5=;QN}f3OvgRuu#fKm4CJ^Su)?w)LlytDat=qK z(CWt+Gl&)~x{2^vRq09wz>Vf%SJv! ze+S!j6f%*=>ZkDzafZ0XX@1N@9E5K8e8qYtA2W1pMAx5TzlKlhnVBW5Tr{{XEmXoc zW)im0+tf)os6j@^p-#%cPN*_y(KsX;C5}jIt!%4dF$R!0Ccr5elt)NZd(Zlhm8E9M%6N%34 z@rDBoEEokYd2-yR#~Sn3oVJZGG~Ej*GQj+&!_3g_W9IDT;oZN7W(@22+1uf7G8c~N zdjxJT*&}ZvT$5uPEVN;|b9@p#6WlixFYhrR?@a-2)>aY`V+#Go_imi2#vw z#15~vVA9E$QCgyB9Ve97jB{fuD>O#%l+Wok_kz0OBuV4{jKo)N-Fwu$PT*UXutNVA zOjstp;@9ByZ>yzWKw25-uGb#XX^FI`(|t()qZ3J3(!yc`&I7S!HO2fdF{tddiQ7py zRHX!r&S`Rl$wV@P!g(UGaL-t-1SRVAkZX|COB;cpD6+Y0d@Ln0S{{ZeW+|o^uA-d1 zUc|@#S3rTSg2@mM-6ygd*$!@NSBpAgz432dz0q418)x(ePmcA*wX#?`E5dS~me=7c zDb`E*UJi(0tiWXqZSO90!E2b0(FFrp-WNEg3H+Dk*^A5c|AVDH^g*|yUDu9;V`~TX zL?TWP<4EkLKNvyVqUizB%P?Dl7;KnXaW! zWAoLYtq01tgSo=kiSt1M<4M2^QH_W-yEwmM72zAB#)JBP z51SsE)dY~dz(^5J#Gdg;g1g>VT(uQ|D7&QU2{ZH!kRC8Qa{Kc&1<>Idc6YrW*7*e0 z0%j&{FM7yin(yfcPycD-Er%ls?C@$29itdXtxk=mF9CYFy}Qi%8r-MY%u7pP@k`Z& z(I_GbuglZ{UDlL?2UnljjUF(@({8oSRZsm<=Q@Z7jQj2rRn$w^5;E15%f2cp#w_3j z8gg+8PoZw&U`w9oTqIov2C|=#X^3sez@5DH$cH{+XKU!)NFxlA^WrvY0~`Z!de?kU zGFnnF-V#Pj!mG#emh_FcB$CEftwQ0nxT8tqya(W9HPxdw4sl#3SfyDB-0B9je9D>s-#FG0f4rwznS+HR3)RSbb`xCvAg*U@9 z&~VuXA%IWfA|^H*7kLMd!8MLkfy?Jd{loDY&VI--3axtsZ;+11kP-za~B!-*9g+NO=x|1Y+W2kjNX&4X5Wj*g=5Q6)l{*#-b59}s72pK~e zMHE)xQyR(`$5UN1X&~pieBDDCSstcZy2tagyu`@H?jjyR5s^2#->d2U_wkWoJPmnn z^_h7{>!!ko@rFa2AmL$^#U15D2x=nI!=Y_b}-j1!;|*@z%5_$JYcPxgw&173c;kU5afYuVA+i71bC+Kj+B!O z(+W!_@e6W0akv;d*1OK2F2YEii&U&0NU3vmAcAAR&ee(F)2Op2il~{be?tPC|FYMk z%wive*XVl~3knS$Z-cciiJ-%~$04=WokkX> z&rcBmu;!ue;qyua{{S&jdrGgH&v0oLiO)iGox{$ske*L`sN;mpO#^)^|{_ zXDN0E{DcB;P*Ve<=MCPvMBRzjF-DQAJgwjc#b!9xC9d*B<&;%VnD3Ai*@Ofpy6gF7 zh> z5Vmi2;pihMCcSY4)Li(jvcuJkMwqPY)A6M{iuT%9hnxt5n@fyHkU=V#<@bN_6OGje7gF~vsC}pDwFd%*S&2gb1>F_gR#yz2KV4ogBy__Q&ulm zJ{Eitv1;Cn>@P1-K;FT$trRHw1Kacm3Y5MA)n+*keKT<;Q>Nt!KK)w|bBK*B?^KsJ zsmphJvK!$BCu2j{JTpu)&5*6PP>fczySU1f1KQdoy%mjuO>iEr-vf^-SP5^hYDVL# zc#r3qwC5$XOFzI(!Xi);Qw4LiAeFPdg~~Sk3zVxuO&Si=vdQ08 zK7-GS0EdjoX<}z*u)g!O?fx|RPWT*J*L*;)KJ)#>W;tECnqXaXkRoyt?w^ogt*b{^ z)2M8EJkj1`9Vy7c?Z28TI)m$$Wd!>B1V?wY*t&CtrQx5Vb!SC_<+2el#{#!nj$7Wt zN63Jtx$mIIa}s5Yw!g=HPZja_Oumx_Hqc*TKm zC$n(g-%0irzQ<-1yzZyWjkvK6%6I*@(ha_~-Qe5A8+>bVzt_9czV2}E8m;al%3g^r z-=>_C4E(q5B;!Vd0Fb6D(Z1HTb--xU_2zR6O*XW=Z^J(wyoCt&Y51ot9v0D}co-OT z#4(jbd16>gq&%^(5D%b79C6eqQ07=Sm?^Unz8A-d0)5>mJ>T$Is+-4kqxAEJPenJ5 zbLffEHp+LncX!}h=?350Zt!j54ZgM9;M=~}eA}Q~-MmYGDuL>-KcaAGgC^wAepc33 z84o`%iS5VgwP4GdU?-{jb)s5U)C9W5)HT|((S`4DUcxKHz1h9qQGr{PZ8RsD;4t)O zUg#=%&C0h&4nS`T(>X%{hiCZ?Yh4GN5LsTMn%Ai0H3_Y+VnVGNj=a_8GW|6}&Bu8! z@>YW9#E^VFNHM4V%Mul8~bQmEZ`kA*cvajJ@D5@Kndr zfW@Lb;_0t?IIUOlIz(+J2lGR|ERkFt)iZB3GWhiG+=TLz)g?HJC_F)M;zKqlJW&MP zhz{r2>BFj3xS_OvaDCCvtXQBMq}-1)Z&B0-w{&G-eT(%pln1Uzg=Bs-B<;n>-3BGE z4sj4H@DNlV7nucT$7K2JDpv+#;8_R?OEgDfDXNvd8(x!%YP;D<;~TtVvZym2Z z?=YUMnR0)qzCcA8h0v$$a>F@^I7dqs|B4rK3B!;$%&B1;dQ{w_pu`&&WN{zqT?*LE z*A-!n7Xek1mDei~sr6Z6JiG^lDavJVp0%KesO$Mg&Uqf{+wh6Q%)z(re5g;uC$_E^ z5smJ8Nk%pcwFSA7kSiWeM5cHccsDXwC^O*!nG+~;ENrICM!3HPEV{+O7)J+T?Pr9S zhSRBTp2lG&oOA3QZTMJpgUiRU$Mb@D@u$%Zf4i<5jyIf^jKaFR0R`E0Hf%$}e=D6QVh<6`;LF}C<8Y^qJvrmBgSeV(Z{!TQt~6v>j5 zB`&NQa>~mQG<%Na82uxc^Y{2N32gx_KZr#S;sr-ZL{DPKDCLk>2mCr{q2fxq!4s00 z5641@6WCYB&rznSrs&Z9?eE{bul;??B{q-_ijg+gtWW}ghR=lG3S z+?-8IbVXaS;5t#za`9>?>y|;{LBu>L@x+n#b<8Mh8FAqJ59}0LB*LQLGaTVd3fNLzSVYqI=m4+)3 zSNj5!ErRPqT*q(<3 zWm0|{)?pv4qv%W#68%C{qULp|rJXFVBPFjBE`xa;thBRr3JT#~j?hYrP9nE70}35L zc@dzHVtFSrgoE`^2nnQcaCcYe)mR84LfeM0s_nqNO27x&rma|1LrE+|SC<poFS1}7x(l2KC*e0r={ckrP(}Gmi(54woqo&aqH((yR z9~{BJzyiWq@I^F4-SiUfIF}0$OTelK!)Y&!0+SH|F5kyk(c2)mWUBig<+~()m@CKt z{R1V?>FlipuHIb*$FCmRU*4%}RljKZA2{|T02vONAf6e$AjCo-7?OOnpoj>cK8EkI zk-|Y6@>9;LMhq;ZYj#8w>vkhu$>t;`S5_y`3ThR-#VvO+177^G71bk&qoR|Lu!-)< zejA8t31VptHBP+&yjM9NH`#O>Y;jm0G~h@Ej7qkUgM#FYsvR)FRBgpAn*I{X27QnL zX$vJAnXmw?X#_uzOtFz!7~4jxJ5V)+*d_{v6Q&^?8~BmY2CGO@H_ZZ4HI4yv)tO?( zBWCE^fFTHeJ$9IdgToOAwGb?aLTYe4?o6Y*s!0^yL}UULaucCm4HDX!_BO>GQ?-#4 zw`mN;ar(tT2s$ZFbKxEiE(9R!ARbq(!VR6UX$c}`=+9XBYy-S61gkA=YM% z*EE9#smFaRmAa<5YASjeo=eC{zId&4D3hmU51UG^`bgv<}5alo9Rz0oG z^&*HK>z%M%zJw6{=@TH@fUPOn^^mnpvRBDI$pfR|C5ynw#U@A;bqH+tg@esM# z_?A#AZDVahsEWROqUe`aRI992kNrw2jX2 zfgPS?as8{0$t%CA3B!WD2hkNj;{@JAJDb^h7c~kiHZ90Vg8?za5rYjb2f0k6)9*d> z8YMmPv#{U)EBxFB`y@?r;ILR%h&5?0yw$p!w2e2(`Cm2ZTmM3nQopWAWP9#z5`3$G zWis@#&*j7|^iu5i>228m3LmYj7Wv!y_G2JcY{tg9?#Zkjvf==2gnAos`2sDT!N<2= zK3k^GfCo8Vpc{-sB0}612mS#lVo|(^J7YzplY`qv>_>f?Bx4Dh z;diUL7nRBXM1p}9Zl8@n7Glk?3%`xJHq|dT*;x2>5(AW0p$0#NVzD$vUBS1PnQT#))`aAZ zc+RBfDa6?j7=vr*(WjHvB|n{SURPj#IzIu$t}94T_F9xMFZ^Iv;n+{mm6zu-D|-`^ zFwUS5YyQ0}*G40cve!%ihRu|^t}7K~yoNeo!u1@kXK}5^g&$wCEyESS#d0^CQgfd< zg{O`uHr;GEgXbAM+wg3|^9ww`z!T@;J=1|_C!U?LBik%(mX0_!qSWYST&Hk#P}zB6 zMdiNGMrv`-u+jQh3}Ebq5uhWUR||~l)RuWVV}0Q2?t|1T7k=A`dgrc0Es(>3X$e7; z74MTvMxSI+pFF&R_X%a*xDerIaqYnMbiQTi(RBqD3gR2A=aGe2M z3os}9%CsqA>) zz(b^vUfVLrz5!b8lSd>`oau}QMj>;m~_1Fc!A`$%+h)&=U4!>SB2;;uZ zSPb*&SFkoTTTO!U$-gXC9_fU8VP2;%DoZFp|0U0jc?pcj;eoz6K$j4Ok>6LhP+CzZ zy!Q51>@&V6CrIUT%i_oUWlA>HY?2-NA2DdFZ`Iq8y@~`${SAm!vuDErL|~za#f`0@ z-GIIdK>67fcUDUkp2X)iLzqe}(f=>Xn2iR!3{istW_6@q#~ z*8nH$AJxA=V)q-CgOKEyauY|;5>EeQ$tfiv)EP zKA*VyQqF_;_%J^vLNA4(eO0#fbK;tb`fY$AI+p6vPecEJ4x2jI4xlAY9w17k!@hhVHmm#e`N#}4 zdUc_ZAK1>5lzJ!RbowNQe0;%Mjty8tvU!D$)elS2l{f^k0S)B^L#-aPz&+E`Z3^F_NF4U?cxO2N_iM%9ZXqqkRIW*Wk^Fyl10#rjN5p|9M`IVT@OP- zh(R=iASyZ)^^~8IhnDFR(L5X;0jp05#$cI#s}t0ocM6`ZyO9Fdu9%{%!!`l@pVBn| zNtCQJg5Kz9PV*`FUVj97BalmzE{1R_`0&f| z>!X1?48OoF%GH)d2mJc&^sXoHMi`@w>{t4E46JV6vKepSEs>A)_j|>wMm!5g_H(iX zjm(F=Dk9FuFG=->mz?!AaXwr;+va<00T@1Gq@?B9iBHI|K5*7#;X4uRy$;;u4kEO< z>sa6i?)s-8+SJv{16O|qf;QFki%S)WtvUD>CrBz^2{ohWhubUxDeLIEWSXv9&GJR` zUW;hKPt!EC*znj7IRleNAnC&IQE*=)-)YK+3UKabt_#LY8ep7#lA92jsjdB%(%a}Q!aYicLm|`_ZMH0?|a&J72!MYFTN_@ z_OvgGug;ssLz1C2q#L2`a;->i5C5OJH{ky^Xn}j z7QcQ1T8>|T8*zU9Eq?!ADusW8u(I2M-FtCH1p>8#+2Le;+Nl>k3SrqROEqWWyhzFJ z4d$s1gl5GMTg;Eo^xr##gc^9K5IINP{Et*cTM5Wcvs)vaS zy_SjjPSo=W1vH;xg7YNW!I`af%^-*^HUyu}v;BscwXz&Gkl>4mj*k5TK(n!pKxOn@ zTI^`T3|SQ&+lFXFbg0YUR?ESsnw4_`!uX}HDf%xl_C3jgvv_$RdLMnJuSJxa96fH7 zM^W)2Jmn|lL{DCGpdXb}j&PBj~+>-t)wZIl_Ev za4`XWKD=sqlzuWSsW%AIVj%cA2>0s`a1g$LDoDC300-Qr$Ua!WS9`u! z`=b_2UD-P5%oK1|(NiBflEx#X4g9b}saS1>&5`0sp#)PY74=i2X!emjv!p=(Dg!CU zS)=}`5zUG^)I#Z6sJ3D8i4YTqYAd~?nOO9CPk$0$zK-sUdP*c~-E;(E#U9XqjHK4V z)RX^H{qZu42w$f^n$|-Gzk&W}XIxjYA(`|?(1~rM3pXFG0In{b@SF5UDjfaWl{cn~ zT%$iyuCLc0V`a3XPK-_4NnCH^I*4mGt{u2u#RZ+?e?fob*oac29k^V$#^C}P|9`AM zKBu7;Lw}r#AaEA%lb-tHi+}}vL76wcg7Dk8I&sByz8mU~lpE#6^L&H;$jj}K@4wa` zV`ckL#VlM8qOSeHC z%%yGpn5Sv#pebxN#O-T^Y_jNv^r6UU%r%tvHE<;I>1}VGU5MFVta_1(-0tLzQRy(t zPwK;f12mRo!Es>xdND);de=uFA=0Yv7={@uy@}d-irDVCdmtZVKrYaAaH?Sa6Uq7& z7jhoaZ$b)qzf=De=63`JVfOn1OZ0@xlxU&@-?SbBQ`f(MJRaG{e}Zm~C!69|td6GA z6Aq-FY!W_T{o8@l6FkdtM2Nl{`SqWp68)FS&`FF_9d!gvtxw^GJz&TN(K%;2x&W%> zkB~JKsa84?GLpS(fI<-i{u%fA_G--0jGxm?qP31tvenMd&5 z?AgXHBlPMtAsT^c;@j8)IlHxq=JXDWoLr{AdMC0$e9~Wrt_kC0Y&y1av%2y~hl#qa zr0lI}pXR)Qtqz#W!-3RbDA1?9Y0FGZ)R9ME%jkdvdlDFi9PE~{v#A+jcbic+Jq!6e zj@(4Pw<%xV7w)_^H`*a5@0^a3BeviLm@N0ErWL^br^S}irgAZ${atk|)lyN(Nf2|> z>NA-zKW-WK3m`jn4BgX5(*2gFzG+~=>~)WILx8UA>l zR)FWP=L@{^*Z-Eh1?I2+BY8SJ_e`)250)orMS`k*fpD1DM+jAeI;BnSRJBtSD8ec! zfeRT9F$k!^Gq@W#gvS90j1Z@BB!i*|br_=bTL)6C(VH=XXTxw-={__^e+k>U4F+c3 zIS2^#S10IuXawx0gGra+YZOArjj2Y_v4mP%W`11G!$bIL3cu}&*_$^n-ySL`d5BEuy zBC!HLSf5DATrZD~r7{d)LQsF|o#0&CpaYT@`zfd@+#Hy)ateOwBvhR+JF6jZJ1!9y z!tx|N4Q!QkkY=FAPG*^z;F3ED#LaYzltvfNWyke$G-9@fpEym56yv-G-HLNQ^`yXU zg@OM1a&VuRB}GKG$o8EC(`LFw2JWPWZl+tL?@ns!X1YPwK{a%O3o#`%uLT>pm$$(C z>|Mlq@><|xX3^^|fJ5e;3MBjVWnhtDL)hP`Towa;mCGrCL}>N$&20L^a5Gj59!9+U z0GmD!{_Np`dFxRO#SCYuKA=-AI>}OJB4FXKo}!b>2eYD+KqxDltLCPO(Y%w95A?$@ z@2E*}28^{6UdE8<;&~;}(w5oyEthhULHk>Nic}|)o(ffZHjX1eT5qtRyTxHjf^V2w zFb_Yo^L=QeA^fhE(gLm88f-xE?5Oh5%7)X)fk)y$Cp+KzSQ4&jHr)J9+$u)Sx2{aa zH62ka%Mi7)5>b!M&%y0cA8v~t#%;wyBzzxnD<4DL%EgFVxpJZQ*Hx%RdyDQ5%3Gkw zOlC)M$|7tigN*I2_!RZ6Ox70Jw3W68<#WnMRwy$KWNg8KC+Z+=k)W*xX1At*KC1gh)7#MN zTWEm^r@!(k1(c6pEfNkr44xPmFhRL=cg=aN@T_tvZE?Tq)L9rG!l8LcD-R{+QW^bb zd!a)PZNRBUuzF2J$6<&kZEJ)f5N1p}RlPp*hG1S6z#EmX-c!! zeFiXAUnRF9Yu&xbRCTZ)W-U8r;kOn7Z)N%mcab8CUzxQAw;>nzT-*5@B>79`Z~5Kx z#J!#a0^YccCZpsbRnMUSoKibK{#`(dv(hqn0>BiCgd9LMe$ici{SLfnLf&xdqQ?J+ zy|00bvdZ^=h8bW~bVfx*)0_;;!k0lnfdK@05esw_1<6+w5DK$ z?bdGX=9;Z--Cf%awHFM;1+BK#YRfGv+T40*yc=yUVv+Oz{?2)xnE`EY_ul`#`~QD# z=$Yrd{?70G&in8De&J`(#=?t6K zuqRj#SfvT$=i$z?WMWO!%6V=lWngtXDa_ii@+&!k)>NtorkFmIo+hJJG#iaZ`#jwS z(!UJciS*(qIGV{p#8Jp@8(l^emnQ=zXS3V@TcN^xrb*@@v?Qh4y>aC5O;`r3oV{lN zO$^4uj_ycT;yEtnV6pZr24y2kSCLv_S_Kv%HN-;n%~s4qm>vvpLlzW^=L5u3cg3B@ zujNGDEJsVQBl|0FX-BG880^Z{!ZJ}9+@5+995D^qGo(0*k4sYA)~|N8v#rTnwZG3R zC{4)y*ib(V#FB7lX{(`LOV$YRXEEAq+m2IAFkvk3Zwr#%Pnba2ZQt>}w|49cy9)jvszagMr)(K{5a(?Q1~Fa<=w$a2$CS z+kWl|kyvJUI_ljWwZ!gWx0S9SHctVnt8q|It47SFhsKA1WMLo~ut=6JJ3gK$b>L*B z_2Uq2EI&n}#JFQMv#(KT$kLTPhRv2ci*9$;vs8xq7g3qsEWIPMS2xd_*=PA`+x@uN z@(TjN$VPk|FD|Y^-XZn{I=koY_AK2l@VJ93dX{+xyVKb=$kFn5z+_Fc*WvYwb0PDP zf;-z4++rqsk&P>bHVyGRBU*;12YbMRm#C5%|8^Fy2voyO?wT;i4qUq&ipCy}L{Oq_PYtGOaxb_9 z=HH*av*q8R-8*hYi|^3w^3u$(?KxZ{!^iA`m>$~gjmOh=Qg0y^Dz_#CKek_E+%ypY zBLL97TSmvWa8E6e!9`e5(|wtaCY8nwwc#G(YqEojED~SB)kb089u~VpBmkBI$p|?$ z;6zAGO~?!rza?g^9J2~zS*HmLw$Kq6+v(H{EBo)GBy<8+p?QJeXAV-L$~Kg1Bhk3YvB zp6A)GE_4Q=RnRe3`*18!fWa*4Qk?X3n+6`K$1|w*54ADx+OGuJQlHeLgNg}Yt`OBk$#GD=90z0yJu~v^W}fR3~iMkp?wSX{Wr7_4}#|I z@G{{h(DDTYD~sRrD9l_c4EEi4ea+TsVdujJw*#3lLb!E@6XL~HlE4U>k77KCc8Kxr z^|=u6R%t0^hxN2N#2E=o^>`mdzJo9$qTdLjd&VYg*W1E-T7#%QW+*{6?I37DZts)P z#)T|TJyZm2ooYqo%Rgh8fD6p|^{9RD>-8E`f(WsL^D;C#SWP^Q037CM{-3Xg2o^@fb+0hZ9jw@mqW~az)Z(x{5UvfmUh_s0KT=L>g zDry}0$0;!?5<|sE=)P-2Jo4~HfjsL2bjMrJw%YYLrUv6-+j$mqHC@Ib;^}Uk#-_#P z1pe@kA>^bk<-D=KBe334{45!~o+(r{CX6vL-g(%V&?Ww~fWpb}@GF>6Z@I6s#BDs>oU~SYAfNLdQwC(H6yM zfsv1oueLD-a>@HhD!&eSRGtW(%`?Q6;sKB24hmB1LhTICfsxe)sJAJU2X6t>YQCG7 z49e^_NRiPkWi&18D~8KoVI(N@&gy?$Pu(Y9{>xBmv2C<;q87bP9!u11FyYbJY19;RRZr+Dv)!M;O5hnU3E`yrqsC z0Pyy3$TGa5j9a|1Mw~;>0j0QBMYvY!AWjg3zKM}Kb-B`4SUoWrm0N*f71E!cIqNgn%aCDAfyv>L^MikUnome3W{foQo4ht9-=5T(AnZf4Yl4u8 z#xq#b19Ga40`ca}37ycB7M3c8IB-X-80np_+cHEN-Vo%~7>=}f!VJe-7FiW87>)nh zK_PA45Z)>m^`wWT;w=CuKthIQsN-IUq(A^GOcUZs!MsDKfIG}6UZdc}@yaXmK2)t2 z!WJoBu-@j}j?wIu!*k>v@T90a|A@-KH3XS`u25C-X4geK#+rcDH9N7wduMptc{?!& z-0sK0zfd_O#LI9obqW__ez=$(1!s1+oWwtIIf*yI6*}bYn1kh!*b%#&`{0YgGD_CL zscgI-0OQWyd>A2uI9PH%4U1z<&DXSIn~hy+PZq=}u$o&Ad*SmW1wrGNB2z))6jFEV z)nF!5(Zob0f~1$3K*die-dI|9K%j!8DXs(u2vh_~CwfvN?FQ%FpbOTBe=^jshplm> z!WeQh#t>5-Y537+z^NX$4co-2T zrt1mVcdV8AZV8ij3-5L5bye)LiL6ED7O4b#tfW4(ZSPCPsqZn9ndAkNNfMgE@$e{cc(~vmEPvl@<^u*wT(qNzJu8lBYc3dKp1 z`wT2@*52eJm`ED6={(!|7DN4EjC=iJ>_d#M<6y#5Q|T=>Ja7bqv7vq$y11h^&+x$W zsCY5QA*YE(G@VEoeRj6N`4j}}>?cee&IV+L6asJeUHM3Nne}rsa5gx9il6|BKLDpc z*f!W7B(auF&*=oyHhm}RpGP!O+5HWS*s+HCt2*qVA*!-J7E?Co(SkpXAg*mj2z9-R zI1U-qn}n4n@ZK4PO&67p@b@54Vok!Us?o!4hABWXOhleo0l#Zniy$|ubLif7GQ z#EBhj*rKdFBOB-SHL!>sEFO9CgdDf7ZIm5^ew40)rdaLkGWN)>>`3dOK!|KY;Nx_i^DuP(4)C}Nw);OHhzjYG(NHu+O9ys@; z>9-cMGlyUj!%8J5jd7)r!_sprc#J+8b)}%iC=_QSN-EC{V;hw2sDE5;73_q2C#VPM z^8y{7Ebj^f0{v3CAEo+Wf|9OBiCQk_WB5&A!^d{$vC#k!0-&A>+i?4r>uu|}7ptd& z1Qxs_gik-ankn)DMBb4sF#x;TS0ZA*T!~YGMmCaT96p9fs4<1&t|rP)I_DY80aJ3I z8%GRYdSu;cr{H;gE@wR~N>BB&0UKS+%d+9^+3IDW+$=?&6)bL4tM@JM8L64*0Rg;S zpMW9)WZ@X1xWQQgmj{lT61T9>-b_7zy)6PAA|OJUKZ0eNZMagOC>=%vqFY{9D}H$y zsLEYT8`5*TL#{K_S7DeyH>qES*_h21FHohh{?ftba&U{(w!`ZYLnrEPCgL};2)ae> z&Nq>Pxxx8ImJiKOs7#@27~-I=k-*>#C-@zBh2A7aaH90IV%cMOX&$sAsS`fz83|gF zr}kmYk+1tBjdQ-fbM!XIjnv_~qmgf2e#c)zrBCez%3n(7Y(Y3#?AJV4TNvkHqw;0e zl=`;|sclGyE#xLPrMkfpW{t+n1}JCC&JYU5qwuV!Lq)V8Po9W%ouk$4dXzT}NYh?P z*b$;-6m1x`z|-u`{35D7OTi0Nz*!T>;cB9a5Z9t{;SpPVf>|u^vJpUHzwH`xs%Osp zQuv2LRuOWFUqrD%?rg7T3LE|W;{YH1JfZXLc=0JX6>MG z9O?lc;vimE(>&vd*Q22+6(R1-OUQCB zIiO%6e{#DrxZ7qWFkf-Hw~0dgVan1lG$ocb!NP{e_JrqV2RkS9ddBet=-^brN}*OF zc3~k$RoFIDDU^7dQmAXF_9a%mfd%`((R_@u5=VNQ$Rgi!1`!T2ze0(vG8?rGY#C4w z-5<$K>jmCt8_#srf~413IP-zp$Cb6eN?h5!xBfyf-f|Gi?l8~72u}#cAux+zb|FmN z|6+4AN-l*irm{N!9GojG#lh@I1yeRa8tz&vf0fcpY!Ey(fXnGBaUncRR3}uN*ybWS zvkwncx=LiPtrr^*W#bAKsqf9ow!r5exy0EbWfw%-y?l1LybC(;Sz(2TzGoXFzkt1K zhk$jXz?d}HG|WJQK9njBl^%`eU1EwmTZ1j&f{3Wz`SeEKS34#YKw>3K?!a*xIC$92d2$`6OvsfOMO$$^jKvbR zHh6__G`*-f5hq?>@=c2(F0M#{>r5gx&Uv^T^#`{J!p$eJe4)(_Ui;QJ=IR^tp3&e{ z;QlYD@FTlrzU&gV_kjUI%q-*w`FK5Jt1>ny-&bEW<>8{t3W%H(x^V`(vh$0l5>|$T z)v<&gV&FpXAAlD}n=@kk;tB$)7CgE)9&dI<$kY7Mjw#XhAzDY~#ku&nY%(}myD(;W z=WH5;gH&1-;`mTE2SPJY3wLKK$I({rQoP`Z!_{ycQ{-FPw$1hCUf41iHwiREcr!aa z!x0m&t6i-ax!Fhh!Js&_K_!v!nCnF$v6C888)HMuyPuoa& zEK5YqP=1`l1xupT@L9{EJgQ`pQ{IVp=l{I3RSp$rD|e;gU{eE=W~3hz{g~;8PD#_~ zlr)V_Nz-cFE<506+s@!vbT+g`6EW}NW;9Xn8ta~~ zyTjHC{WdYAVQgBq?aSrM+N5)r-*vPZqrh%kEWH7Nb%bfs?y!A{yF-u$kaTz2dhhC5 ziVB0MQZ{kKhG9J+hhpNBQnz5X8_k5E&UnytQUkQ>W#cJCyA^TU%HH}d%wV zKp8(yaBcdItQ9SA6N8Dkf;+-pJ8If@pF&-vx9_IgG}1e=%4z_*VyJvCZnt8h+}=%P z-cjShxl|c;DTrSYCf`L7z;Ojj$CXuy=AhqCd??txn=0j9kY4h!_~>9?{u7qyZO9gQ z0DL+S1*0`gPGlBhv~v9{EvJ>El}mH4q$|ry1~=y5fi^j)+&M?-{?hR zRoIF|t*{jUtNV4_ZeAGEgPgX2AoMZ^YBOKniHul2`U<0b@O8wY5Rh>%k?}m(rK~^U z#xayb%8H~_l2vvRFez&)cWvgbSnew4t|abS&Rwb8mCIcj+%<>0vbigoyH+GqHBlxe z@&LL14NAYPHl!V8U>uJ_5lpBOP~EW0OEo5ft@;HTt&ipfyq2D&gs3^TT-s5Iw9vPy z!%=;qC7H1e!*_WFVjqSPe+@voDNL};b}hxlg52J>P{xs}fE;VC*kQOJ!HGU|9kDq&fZBp;^tJUtkdoq$E>N#4 z2yEIo6R{1F+tFXabcNzi+#Y0Db{Iq~@V-^{IDHR>=i0z3;8Ez0ARc_1QVZs zp}rNAV?@>Z?Pgl+qQ0sRXk(=w@uUCv76j0erv?t zg4tn?dv${C)iMn#L`v7oGoi@9?)f4|1{|Kl#SZ{qT1!S?sm$IEznrEcP6@j~L5x9u zIN{L8oRaTp@nTphi}2Qjd25W`ns7OVQ7CLBi-Tggf{uZCB(yCBc6#YH@7?3QcSm^d zo+6J@B4WtG>kN6)r?}$i-I&*7deGj^;*AP4p--jHrBil8Ou_kmzivZ$GtFaH|I7P`d{O=AeO^ggZ7%`1>!!}5wwv|Y)Ua0-PH`V|f# z&l8g`??3{3N^+rlnMRycp~;gULu|w)g{?XHxJ3Wb47MuAOfV0w2W6+c3+P^Z1!S=5P z*?tB{y7swVCIO9N^1FH(Ly}CQE@_Z0B+K)~0?$V*;0*9%r)`7K!5D%@uO{Z*bUgeJ zl$B;rSs`8_Y;OUR0TMpQM#S6P8hiXCT%+BM+au8!Pz)3TWjNaf?&yg5Ec2ihb5Wqv zw$G_7s6lZl!%+_u?o1ja&V%+^GS0-Th#dVkjuSStOrpHHO-pwyam_SVsEzpCt z78m$3VOGh{YnTxEIE}4Suv*wp^7gJc9ohqK^QU9E_z0WUW$VKgVC>b3JoolX@?bP< z2;ZP>CnMK6b$3X)m$1RBn~QsUKM8W{4A5(y1#a(qY%;-4=Qbs|_G&>s0XU5<3X zKt`)_#a+ZNj$KJkMA2QKwE|FwG)XKFlg`ETSl(wxvztp3V(^%KOAwe%Snu<1cL5%| zM7;d`{HV74v%RU-y!?Du<|U{{Ku)P$jJL`eKnF?;eQ@2L59MA+z}qe%7G3vGA}D?G zA77#vwmv*&HI?#2>l~!m*(eX0n#t!NOA~N)9b*==R2(fXeHWkPq4=%2HY%QqHWuAVxlkwE(y$_y}Gx$n$%5 z8oS#ksc;GBrc{`g&NIsPGUFg8!J?X7d+}?}5_lcl|wo540CsAh&M>VA`-C(?L zUy8i73vCb;1-KJPAV2daAWka8jS`=Ge#zG=OZCtf2+uEov>DzCwiy$ahS^3aD-jwR zI5H#UO_Y=&6U315yvKF0OI^5C5W|LwRgmXR?9{)))?fNt)aM+TVG1(00vXRF>GP<+ z8IFd9;LR55awP7$P}JUO^N_$BF$MH^!OpoA;{jx80SGl3R$&EO;*P7!x{BeAEagw$ z@Rg*i0)Fbkt5i~ef)kvnKidn%Ar^EEai1UntUNQpv{Hym(zv!@BJBs#TTy37PoBLJ z#IW>{@=YRTsUHE)i#&Id6W(&8<4VvDFsZb*@coe({8qNHk83D*$kUNdVWB+t2lOAt zH&k`93mku-i9B4^`(ynOv4(VbGH}T65aaXZx$i)r6<-yGu;)tV>FDIb_0+qUGph7bs;g|x7#jD`h1u)s< zciNPj9NBwLG?q}ahe($*7K|}hb3FSsS_O)7ZD|T$C^tpFb5@rPwyEW9WL2S$CVpu#w%}`Ho zsC!4n)2#6*BMD0k?Fi>oB1)#wu={2Z*yT)xv(ZWA!4bD}J;vF_AyN~SGN#3TWiTx$ zoa5n=LbM%@EjS<<)o6`vSbC`;_wSB1@zAZOa{$kshU2YPIUb@uv^GeT+>~e3E81L4 zqN$cshTR7N7;&8$@W&D`9IH-D*Wd>k>VJS^)^smJ#B&4Ii#!sp=fX`iYMd&>p+#Or zusin>23WV70O4VtCZdUw+B=G7Tw;qD>XVTGcaX8tS|PD~$tpRiP?7-BadB#*_+Uhn zSk{u8T8p;T<)pTg&_rZ1?CHTI>S(6&W9{~PG)Nyz;1B?`J@eAget@502?>bCu;(xw zUMIo#GU#0nKuW^4Fe%7(li_Gg%xT9}P`VWY5e|k-kgJKx=WO~W({UdHxVM(I8iQZEX z8+FKhu3wF$2_dm~8b%9CyJ3%o{Mw?}fM7v;|6V1E-9?A{9Q7cBlPWX->1>2K4pN5z z?i_P!vV{98LO$Jabforu?Q0x=2k;-KX`))K7`nXF6(O-=Y1=hT1cLvTx{TWPUCrci zl}dK(KU%VKTKEhoSrPdKmTVrCjF_PkAO3hBr+ToFr<9LBj$B$z>hDf=JrN_aR zAa8=zVPgB(Fo_`&K?vQ$Rq~X>Oxwd))=LwvKpZi;zU!*(204+Zl_xTAgbr=q z=^)7Y?iRg;=_b^UlSeAidSCWo?dU*(Uzgf2+d*=a3FLnPr35GwNTG(~8D<@rIAVLA z{N~LVKxlrJ@Mx16qQ8m;W1d_E-DC{USi*b8$UpT%egal14;BR~PnNWhXwG-xh_emI z=gH$E0k#dI?Gckurm65($~02W^MRtW?C)Qe5pt|ASbnJ;Wq9Ws%MilK@LHa13@k$k z$`G9=|8Noz0B_ceEe2LBLzJe4!sr|&7qAnD`rcUi9q_WH+zU_xYlclZ{k%@W4ntO( z7c8Cf;wu$wbm&~lAn)>}B{rb51vSIeP-;iWrM@8f^WUK~@2dioQW(3A3UZXF4Gl^H zC7fxGV|*4TIdJwg#vuSkQ67_U2Pe1TPV z9HD95aP*Ya>e`_r`QII3tsfePw7Pc~pL*)4=ZGzjIz{BD*Ipu)Nn^MM8QQb==>|9wmZqggx#ju{pe@#FdR8$IHI+j+B`a{HP!0gHD`sU;=C`(he3WlIXT4ld{1|PaI~?37KGQ+!IV-J;O=ZV-$Ir$P0iP_Jk0@JfRJb zFbkFSCC_3`#t!ENfcY5^jyZiBvr9iBA9wvQN~AsGzRTqJYV790_MBl8jP6Ay&rrvg zV>gG9)8t;%*#!flpkUw= z9(xRhHPjP#lyqrY%*oxb)_$_fD`S>3)QgC@%S$t!p}q`u!_f|mF(x*~@JHj^nX(lp zVbm$8Kg>oX)d^pjD_9nK%IPj*%LIUV1Yj_10nCQeW(WefpE*pGWV_&r!ZnoWWVacPq>wZ`NY>eC ze*}U049f&S)6BEM~=mj&1oJw$Jf^``b8&>3SBO(w?K8pi8y1Zt5ZMJ4mL=45GW! zZ+z}5pxO2M)cLk6Qo2qajwFEU%F}zaE?nru$1FZn-AhB2=NAca)J_b}B>;?>!p94_ za)@<=@Umsp5zd}RXl|!hZpRQ!I_&3Vx>rG3U4{*#d^b8Tj`J+(Is@)(1`SPE0?JQe zP%h+rr!06r*8tqmYv{#U$ISxn`_s$MA|Y7XnVqOaCsmMSJI_v?m0mJj$|_6d{lqE{ zL)R>Htt!itlBs8S-|oq(!Rqr_Kw~iewF(Hwz2Ke?Ml)00 zZANdd-UiTbB7QJ|L`GoyDqJ5z1I(m)2LcE+s^fneS~y1QfKol<6>-hG-7f;Kn0E`n zAg@mDrGxP@X*W>}9;*@}YUW%fr{>5ovt zB6yDwJUP?vp9m`@Y~cwr06A6KeG;x|)Rpm4G9pO3Uxl6BED+UUl|z`<8F-Pa7yZxP7f2q!{!!vu`BM<_@>iHL=T?j63m-O1~AxD*QPhX4r( zApDFXC9Lj)deJIFq4ilWAi05URj({07g*-b#*#( z&6ocQE3~=_A;EB!NgzNZt&WRN{0Wx#Gz(WE1xc4Qorasq_{5R4gQLANUoHfxXt?oRc*OePam4=BDN1d- z(8gvo$0-e1MZwE3B7mKM>j+pgp}7|Pu`sj|h><~jY`EpCO+!&q5GTkLfn$z)xkKyF zdzsMK&P^lbSB|T!&4L$zZ@ULa6cIFEkHHEYQ*FYsaD#I%YNZrXU(b=&a4AOiSvXxW z0Q`^wXy=Dx;KL*&+X1RW0H;xqZLmrLpO^WZ&W=}*>K4man@#dk%5@TPt3Q0+>!o;3 zW&UPr^$k#vCbV(a0Sy=kH`FJAIBFa=o!}Xsyn=i%XmZ0B<+)bk92Uz^+JGWqINc@d zte_;g4B-{A*`-mRM|JexV{lp#f_t;->*)KHVfO}nsVMU?sG%rb%PA!>TCwa5yv^l@ zS1BCVoT?OuJRlM4Q`C>)2(E0&?Ur1pfU@DJE^V@4rzxGZot1@+ayCXl_3WyJLfi)H z6a37llkXudwkbGNp;PcMyk+${-aN;lGrrwY+vQ^TpOV_?t3B(P2m1>6&^x?{bGGa3 zyJtT=dv3^S+oj82NZp79MJrwgCPV;Mx}VI8)Sd;^BQH^?e)LYhL)A2=^o$9AWDZ|cSt)NcA3 zwT%P3)ljOd2rqkxy4$BXSAgCyyD_s9O@uaH` zDc(7Jm0kThtc^Wq+5N!oB(@cUx;Wn-L-{NxTIcu>`(vy8Y&Ztc!2R*~e$C=-)+|uQ z^RA_xp0V;Ke-1l%rW|E;Zsj}W^LVXEUV$R93xm5U3*N4{)+f7vL=JAHo}a77lV+gW zP{;f*eMedZsRnq4!=ZDhg(C=FG*(DydPfoTsWtuv8n6VW!GXB*1qLVG&XF%K!@)t} z3#tm>^n7_9d60(Rq=gm%D!A_|pufQ$2qB--9Vrx*4YIAIThzLDn7s>hTSiDBjXBAe8uZdI!x2rIYnW#kHsZ;but0woQ3GjCDV%VM%ID@vAftJF-)HHtLqrK*&e%uDf8De*z-%K|T-};^9~jOhUoPsRd`;5Qpxr z(DcvE;7mj$&-1>a6-S-y7KT6a4x}_&Xy8M`#jyp7z2gXyJcF&npQGx->|+ad41)l@ zH$;j45A=D{Rejz#(9v*|6nd@L@jVDEAbb%7m0ry9q|w3y(*L3|1_Fc^1j^^97mr^iimlM`f2UKyRB(0-Or&bOjf}NeK)CUBbxa8Tj1U}G? zft3_zk1CqDEGU5@AEaUlUDH&!ll#G?K!Q7r!DSTa3Stn+9te@#U7vuNM+NVlkDF_H z%fwViFSKzTz0k&e6+yg6r2g2|jGt1+oJ!kp?G?ov6G7J#@a6)Tk6;u6l)s+Nh~EHXwSFAdH-;fhlI6or50>__yE5K7Z*JG zcV#%&WMz3-0TP-i@wPKv=K+}M?0x|JNniIzgtr`OsK10k6dq1`%Gz+08hT7mmWp4~ z86;O5{^PKVa~qte@O3+%#V<}}=+o{zjbFigm?i)`=SU&osnSP|#*q)3NVghXO^4y- z2`zQ8FdhSU7r>JbJzcYaLqMOv#FWUjd1E+PecHT~MjU~IB!Bzp`Wy^!$3a3^=pqf= z02*R@`7Sk{GZclCdH;f@f-_tEI(nhZdz|@0nfDXg#6g+2ij;XHnKJLs5yr`3hgu=! zyH@E7prj|?H!z?U<$Zr+UATS=__YcNnffk`m8C8%sqd22rR`vY8a3;#%TzOLz=7f} z!N*9bv?9SySU!ws+V`dOUMa7y>yL2QMqpH0Z!6%fl7M*bw44IJp0!fx)UGQB;J0J8 z`ul(Ie@Ovx%JZ>s)f+GrAA5#@!mGqxorc)z3`OMp>w+r7Nyd? zP1KW^&Ml?k%>$?H)YPE#hhHdI`E_m|rOrY+w;!Q6Oy`zTF`e6IVFAZ8K*!+ocLhwW~rQ3Tka!{Lpgw_jm zMZ;@I$YbHWT&-PBeT1& z_V;aZJZ}N1oIa#`o6dA^)B7Iwj8VcsT2=p+P5p|ucms5B$1ok-;n-chE|3zgT4E*3 zy{IWg3D>~}7=e_usr;-(Kns@=s9Lz>Pukh^RkU!OR0wy|S7`DQ^Y^k5F;Eegs)8%x zKKMDxMvAz52*5d?A}$ezE8;o{5YxqFh@x}wG1SEdE)mc0U_;w(k2i~XUN^NpiM2pJ zPPGeWPZAsW_`L)EaDNB)3|d&~fQ(6qwiUu=(AcF&XM1@rj^@K~p%M|oA`CJ#)FZNqRICm1+QLGy`90W zI@>K0%f&OU!pvbyZ42e81EK%f(R>C#1ltDb(TlL)M!6y=v$IT|#ji3Dt0ORt)CJZ% zH`3cgLA)?LJGtc&BwLy(0-kf)dDt@@SE0b+^-ShHnwQASYEdm0 zE6@=nB(+;|2-{+m0*SXP1-gc01&H6DWRB)Tl$P{v$sz~+2r&*azd|VQ!b@Vk0;>_6 zys*Ks6aulK(wVNiL7@b;y2S3bnbr-V2B!v|*IDlJLDzQ%@b|s6#lkJ}&-__1KGP`} zKY~g55I4`mJP30h<_(0g{RVabXt^VB#mlbv_rQoJCgNTDP;#*Ig5-IR!sh425K{(> z4@lcDrME508nB$Dok-4bymk#<7JFfl)TA%fTxqI<`el#Y3hR zF>>mrY0z?z!hY+@i3}q(hi$)wp2HY+P$XsiRxi(IsbN_Si{~hb>=wHq%s~h-MTeM{ zVu`tTZPgJD*v%{olNN_1EYjP8nd(DZ-l7*e!KU;KQ7ixw=DJhwO4qqIge_fUT~@fV za5*#@yk|HI1Fup*Of*0wblopiKI3Okpf$96V%T-2HeExI=g*M->~7RIgoUKmpC&2P zFEA_&hn%@QjZ!HxsO=St`AHi+|9)5JJ$kj%f-xHPF$^+pfOS8+yb{kg4(hSjgNPbD2Xr;a zHohk{0~*n2N;e`Z-r?<)M^PH^$LJQ@?OfnZ!Uo zSYbODVYtLa#LH9ji4%`)He*183=pa~Ml7+n!5{JoiVR022RK|k;Cd@!4A__xlKlil zK1DD^`-3lBmn@=0_a+&p#}V*wOGTp@I$S(Z+%`$dlAH3b^uRp=BP!5von$w6mR zoV^2Pp+KBR;tT5`IXEhu5nTK;v2WBn(R1}oH^K7Cw&j+gbX8~_REJ3-^m8!(R6&_g zNXc+vm|2b_vsW~$7p_i-dPOwO7xnXPBl9XQdGvV|fA?tfDtd5PDphHyBP;}Xdq&CC zzfh||-VCdYbZ-1-5x|G|ml5)Egi&>*`l2IVKM9g?@@yr}cwZd(7Y9&fe`LH%MT`Vo zHE`#8GV~CB`MspWb;u;YOReOYm(WV^#wT4y%C05#-$<(5zYV>TReD<-uDQG68LCcP zo(K2XYc2zYTE@x?xDQliWt!2rpa?EbV6fFE@)$GMoe@tLo4!ayfml#2aA?C-rrY(% ztC)s-3HTG^YhGSW5#1JfMG?PH{I`O z^#F!bB+egkhTM(I1xcoOF}!!A^DCV%T2%AUBA+)hS2}a)d4m_)h z0T$OnZoeO;gV&%Afo2-qLJge|9C5F_l(6!W_%!%Mm$^Rqb!}dMkuyqn#hxOX$hIVh6iYd0OI2V6L#HC5Vzxs#2s@3ke@}! zTUs}dmUFOEm-=wmKv_p9VUDYLJmai#i+dpQe3U}OIpF6bi*ANLM-LUZ-frypH^&Cn{a|cO2G;$qJ=c&Ax-H`KxRt?LA>_#)V{pR}6VZo+?5G7G zCy;SCngn}h5O-Cg6@Y4aayqWUkzB_S46BxMl6s&kW3!h%$yv5Ju=bQ zOJdaPwBXro(#dy9fPw)yoqfY(3;P=781@a9qu4h>zL~zWm+8y#tqCYX5B~DFlK#-tQuy0gseSi+}R)Eo7V>?GSx=JnS!O*&)+d=2omG&33M)hT47v8Q0FnTZoy>ZU ztoJbMd9qeBYbRNYne_r$3z=0W>jGxINY->_eUq&5%-T)XY0P?wtdp3vm#kx$wU4Y} z%t{+IS;MS4vi3Ak`ALvS_Q1+ert4tj_gDalgvhTmYdBdum^Ff|FET4J1LbF!)kM}O zm^G5DKVjA>WZlcGQ_1RNRx?@eVb)l(Rx@inS&Nx9iL8apno8CM%$h;gbY{&aYdowB zI#N;JF!p-u>>QqyknrT&r8PNPGy5~O`o|Lr;L&+`?PaOj0YN15J}3mQy!QlHQmp3+6)a%;R) zaM}xhXva2&u%LF0;eal(?ytBj=%fj<1wQeMS0PBD!@gF3`2?mz!ImTiC2DNbk?5Ah zB8_eGU@UT5Wn*GmkZmkHhbIYU%=}eC{x?s8(PkGI$AVsmrtNY31UQJ z5O4vQPk;atoxgknJ0C%Oyi`H}!G8_D?F9dKfZq&xN>77|(YGs~g6g2{nNg_#9&JIrVp^DP=71!e)v8kicGdte%29)fuS<_OHIFy~?Z26GiA>{g_Q znF13JlMS;1rVPdo^8=X2VV;M18Ri|BZkQn8I2vXOOcG2s%o3P2Fk4`L3iC9~i!iUk zybse0Gwe2`fk}c{2D1sK5#|Y)XJJmjyaw|=OgBu#?Hb`0n0Oc~%rcl7m!*>VF378+lJPmURMhAL?!|Z{5;9sv@F#h6x z!T9=vg7IJ9B(WU+=lN1FKDo>9R{h5=xz|c|8U^lxu}=g&hokPQi;8o~*VY!*ZY@~7 zxxA{TNL*J|Qrpj;(gnmz`-XUF6tAkJcx~l|y7GHUFgkDKU-*^QmXrwWhsUWcDXOfj zUI*cJ#ez8N6fZ%wz;C1Kr&{jJT)ZGNCuZjKjGP?GFE=kgeQ~teoS}HA?tbA3zF;0d z!OVhL-1q@u@d078qgAjx-Rx+8y4eHL%??PngePP0mvBrHg~>v(KnHVzkSWySUp0(L zSch-1Py!o;n}jL&)(N-4RwRh{rN2DEhIs1`s}BFJO{2yv5XyxrAx4;qIGMs0mZAnw z%8^GE{3ZjA3U{(l!(cB>T(PvSq_%Fwl9JkuTa8I9D>2oHMe8=0s!N%J>a?WxCPskV z>S9}EiD`0;Y0Bif+mNQtR9#!XzPt)?wwfx-t2S_8lj{ZxS=F|xViQkIuy{K#mD;M- ziRIN*rXo>=Gg#OF3e}>dB|;^m0u^wvSeaf_Bid?9(yOb)k}V?q{Pc%raCL3wmU7Wr zTfMHNu1*j(g2GfMwSZD0Oh=tm;vfH`rxfXl#ahs@iqUl=;+SCk^+_>@D)qcX$PpHz z_VW70;h}lLd|`nw?>ZrZkbzXWLK=$^2wjD{SePZ4QNkFO(=@TkK!>dFD99O0Gty+?^ht!}We#0Q_^6(f8d3#Zmhd76-$O(6IbZbH7*ELRGv!9Rk? zQ}A{?9dYKfQgW;}B7PlnQ%q_D9Cs=g)ehBU9UxY+IMqTa{0JV^E9FQz7qOgGI!$9O zfM{8cI3-HIoB`iTK%>4{3V2m;`}>xko>Zc1DOJUAq?SXec;Dy0{*)OEr(9q|cun`U zBelL~`s%w15U8F@5Ra&}9%VHlhZ>}%ae^@9&@1ufr6pg2%R@FIri%T*b`|Z*=lbo6 zp!BbAg00d!U094dH=z~rUc^H4ay%H1;p!ZB6-j|+g zyNLA)UQ+5^*MnhVZI0TliVKYgy#8hivwiSXJicB1ZAM<#&+*zi49suVe-8M9FZwB_(ks>n@7vRBH87_cU<>jUg&C}st1fDZ zYAyP6Q|l*MNbu!%z51?3tx|pQQIz^~H5(mhlq_N8q?Ua>xc%D^VMCB;9N=RMjZ@TS zt~b{E>oYo_{SbcF!r2Ha(HW3D2q z&^$%dr%^$~I)}#5GWgIeuok6JY0F1uqKryQ4#yl&Ki|GR5LDgry;X>HK5W(YWX3v7Eq5vErJB)(Mh%*AYTzb2jp8&r(M-oFL$e1T-FX^n zU4B|nd!RMEc_@@B@jVxY=biDj<4cRHczkIy&^bh7gvfwk$CuvripO^(`483@Bk--k zcPzdpd~xHAaCnf$2sv^g72omrcI!1py6f~Xz7z44L-DR5zIJ?X!gnv8gx-R04Zd6P zU4rjD_{QT)JXtfoV9*Fgd~;FKb)Xl`(=`85ne*XC<>sS8x)6nbCXAHSvZ)30l~oRG zYmt(uO}PkYM|=%E9dih-iW8DRH-fyL#iI2Ljnq6f!P>y6xf#DHEd9V7{A(q`zPn=41;}`|;J}*wLD{WEr`R71u!GOo!jMB4 z&hLD7yb9y9?+vg+N7?89g8=&v1MJTR`QtPN*on(UZ5Hs@ld?cuS$`LlR~1)p&J&Ah zZ7;x|_9hG0R+Ow0=U0_h*KTA1bdfK@a*FE2H0%O4l~}85Y&Fb}yEzyk7c2Ur^(Aww zw-g9Vu?8lJ4y0wakS!#ly==rUt$yjRSot>l3tgB^;^mtiwo)c7t&0P1Nhu{&WZI)Vft4j<1TNfSm~8MSD=fhhP&9 zYTo=?1vlkGnDD&SeAPTD9_2%DXw5>a1DY#1?pbh^2e_92TZ&N^;8%eBi&+W%zDp2` z*7ho-T+okp7%E)aH}`i_-h>n7hcS!ggRA}-Y;qGk!kysoeK&oxvlBONOr+f*+6Mln znsV`HBFk3%3Awp5ii>B!f)_V5KllH0pSEz2(jCD+jrS9Flu+(cYn_w9vqC3(dl#sV_q=Zt#*1Icgn5t z)&e`mJq(UkYXg#*rq~qEEH)NHP)={GJS_<#MM38PT|e^W3=@qhjO zukXsnjP;NH)eG1D>mPrY;Qyx)zTLk-2;UR@|AMfd`8NO5^rrvy^)C#leX8ZM|LGQ> z+2#AE`Idib4bt~}8vnl_&A0ofroVox{*U{prsh+yC#u%&_?h4Q_SvQ*M~^-C{0lEOAAhN(^+emr-?ev~I{or1um1kE zKb$%H`WtWl@vXPd{pp=|&%gKn2b~}O`J)Se`S=sL>r>CgfBWla-Jk#Mi%Wm+x!il@ z%dh&rz6#}uAgwMqBve0W@Q|>f!wkmZBSwag8a*ar?6@1oPq=ZS>843HM^3)w)+x8$ z9yN8^^cm*pnK7|(vu4L9BwCV^Q|6==tzB1KQo6pZykbM;#;WR?yKC!2+osK1w%)UR z#mZHy*L-vMz1z0$*!j;c|35qb|1$m4=B8(4X3fiSNY(&mTPfO3vT%DeinYJJxO<)+$=KARru)e$o#`UA) zPp_oeShU4dx3v!IR@2(8Vo9AT*)%!YTxp{nc|U&>{sO|vt4y}K5+%)mFeIfjLw>B2 zXi5_Sy+)*?BswiL6;8F^DytWUH(cw*keu1g2|9{qkW`G1SEyDjmvRxB>5EGeoh@t^3e zM%{_iYl_#ZxVgZ`c>()zkLuC?OZ#;C>pM;|H-Z4UPVf90!MGBJ+_*B5`Da6UMhzE5 z!T1P_>Zb3TN<2zW?k64n!|}9*FFl1XYv><7F#WIx`iGwzkUnT{|L}qE-9PFder7=W znxFO$$9+`&@cZ&-Je+WChg~h#Ks>ka?++&s&mO#`^(73!P}2v7lmE&lKkUi?`@nb; zkNV?91=s`QJ@vd`JPs3>-#~oNpX?t#kS_oF>OT(O{rmpm1L6PtO#kqKbQRz1A3iXB z@7w*u2d01L-TvVN@o)cY|L}qEPj>eY52RmgieOBHd6DEmmA|_tL#_i$vNHjGweVX8 zzjFb8k&xwB1HUad`_sO~&A2p=vBn=Y#{s$48Dsw82apOG8f=7lxHnymx>j6+o2#cS7>l~mR+lsj}wD(ip)=S&x9 zbBk*7%S$#dEX{(Li13zfY1PJlKA-FI%WFkjQRO0A330cYba|B}B{i8_gdYY0%#!kT z8`2>L0uI?lH74VKpQ3zx9PlnROyPa+5z^W8PMHFO8mtmP@j8N-#}+X}2H|%axYKR5 zwIx;Jk}_Is%r6#%-w|X5&SD|GvbwG$yQr!d*tb&%%YBt5i!r2?dIRhrf=yiM%-Y&& zaQ^CaKrX=D5|EcFaFP*RStr)6+gMYchVde+(pFbCzY0D!Cf<@>1Ys=UGqq$$B!U$V z2^PwUK%^BH*D|@4(d5Hh0mn3R3)*OsHc)O$5atBBfpNG$6_JTrHhll4=Ev#-)gVOp z<8kPSB?}q0n#%HZSV1YYIT=tsPD?@fLr``}Q4J%Q@CvhYvcAdec}!01ujol)No{&9 zTHCs!$~+X2*#AO;Hm9U$Q^_^{ud}p^OE{#lnm_@bmx=RQU5q1va)K#*3fO_}-3-U- zjT=#&IptO8$iL9CVp>aT*#SeI-(reaInIK zs6Y|5dWAR8+RIqeDbC!o4oqK^3<(IlaFE)^HwSCy*JYHfwXI)YQfoyeqk#%K_$i>P zYqPL;g9|ie4 z{s7{qRTbxfkYLp~q`t>#OL z=T~7hzL5$kcmn-VovMF?4$@ppt00e7ER6KGNWwrFlZ!Oe(lVy%0`wlvZqnn*@WxD%v`b$Mh#+IEH6%{MvBuZp_J%PP}C+Xtk?Q5 zTvDx~EkyDGJ&bI8B?Aj&Y8c82z)H*9Vn<3F-$v4+M;e1%gkKlFc%K z>khK3@}d`}5qDQ$XRXumjhKpc4on05tvK*C(@6rTu?EMhYv$m*_zs*g-zf+toPiu( zi14{M5QKkfD!$mS)?ifH3$q69RQL<{8p*v3c6__x-V4)-urq*Z&xb#7uUQIM5L`7a zhk<(y{5ux`W+7%#n7x!9rjz0$pB8)%=OI1pj{%kmFpcQVfFh7L(3C!a#hhf@b-iP@V<`Rq-X5UeisgTX^?Roj;klI8>2@?jMU$sEppOeh3l>~$b_~E>jd1Fum998}oR*dE( zY%Ij!7BC;8I9h(J_tdyq5%IfuX1f!IWz?JVzvaBx= zH?gyD*fB(u)Rf?-N?h$nqMvWIB2tXlWGkoDfMVw;^Kb^5TUVD>SBp54!x-g@xSCBf zkX&UrDe)lrDh9eS2yOHwso|+h5Vw4N74t6Pg3_1=x)Nc3pt|QjkBb9AG~eV1G5h z{$har=>Yp90d^G^`tJD#e+sMr2VoTczwu9>3i&P21#_^m<~#aa(*%e<#h}X?&}YSW z^tmp5te^|lR>th_=yP5Aq=GIjpilgF^tmp5rh+b5;~U3+N1tox^Ek#I9ns}(!FcIA zP1Wnt=RD|Q1bwav{LZ5v1%mpyuor%cuf^z#;|TxXbtp+`1EcsOa~p*Zgg-FOckb^f z5J-UqAE&?IZ->?j5w zY$%pD$?OuGjW8yd8W_^4sD&Y1=@w|h#|}d{?^3?s!Q@D&y4CMD`F~UR ze>A=dNByel|CwK-0plwf<&W>4z23WU#pSm#YP$cPukjoIcz&jD{QK|0=YJaNHwzVV zOuktP?0*{5|Gxabu?Z+`_8Xgk>Aw%Be*)zH&zl0hh^GnC=^w|0x#oLYzju>D!Y4l9 zmi-6$ch}E4NhME6-C<|nLx|sc;GF{|9(>I&ULRwBsmizMTgFdQ;vYf$Km7c{&&LUW z`MLaa9M}x_^TFS-pQTuY34YN#tKKmQtKX@3XXb#|m>=Ib_kQOUL5SYLQ<9uiI$}-1 zb0Cp0CYbRs5isE}^n8dOMu6!ZsWD!J>4Z54^D4|Kn3FIqFfYO!gLxL_FwE01hhQFu zc?{+en0+t}Fm{+NFciNArVM5c%o3O!m{gcp7&FXN7!ynwi~utTiy3u}>K&mmcEiXp zoiOKM&cK|4IRQThFgY+8Fi9}6FjHY7VaCIR!-T=;VETq@jF(_8!kmXW z1@j`zVHk@4IKB_TG{A^3#V}TwB$!y3sW1^R-A1H`p~_J4zNTXSiyriDVjzhBs+;f} zh$~%lr{=MD6v{RZ<-Y-j@>ar3!9N_U#-ZU;*_smY^?-Js#LHutrgbU&D zgE4-bC_ie?``|~oQ{Ds15M>vPo}Gg6w~&{72H%(9?wz19UVwQM<`~Q)Fm{+S7%NN? z%oG@c|9|TbO&EVcZ2fG)@|D)+@q8Ie0c^ca*c1NN>-f`}wCpiSq`RF3*(bUcWIl8R=`IaHfSxPjm_ZBD zQ8x=Dg=L2S9XN;821!4XCeVsBnCY$+(zWEboRC(04qU~o zMF_$^-1&kNW+iXZ(xiK8NRQEf!;c>(-R?p9%5?V!=`fR~Bi+W31%J{WrPQQ_O`4FT zc~3ZS?Q`{h1QWC%N%xd|=_Z&oA3V~bBwwm~+#2k|DIf7kXOrVkxI{C3*=W#$^k&sx z0rVlt6a5I2T6_sxKV>*w0?R;qs9TUG2l3al*hJMDU`7<6+fN`i!YJL}kM2`SXEzPZ zME+*%?507N+6>Ihz-R%|aypryUCr-NsbmzQJ9vg6zl92X($uGzD*eetI_7E}2IA_! zGiVjg+#w|a82;Mzm-2dP36HHTuZ_TM9dINKc+z6$w*I>CNsRve;Sa2ZZ>oa~;I2V$ zA-!LtfZmUv5M^4jDdC%>2+l5%g#UsI5YiSAo~$j{90&-_i?dvP%d zixPgB`1{1K6K5ySPu`b&Ecw=y`{!JkgARAd2t>r)STO zcgG)$|4qCcKPKVMgnv!2ByLK4KJmT8j}qm?zb1Z}7-|`AnP*vMdE9c?@|>mBa>_C* zDKDuoX>C$vl9*&q`f<`@Nxw|`D5)Hj0S$=+F=CDv;uUpfXJ%)1XJ!XbD~cCP&~PGYFx8Y=tj2gj)QG8CS~b-a3sDT1 zVvCj*VlYr84MtRqXs8fF0~J&dH5jR4ypgm&%xV9Jo+Dr2)4Y40`@UycbRJzrchPsK z2kwJI@K79vDVF$Eya@jS7vY~=zg&S|IGx$h*oC*2Y9H*$x}m*?btIa__GE-F7gM90}hHGqag4_bo-fER?@=cLxGf+Cd zq%QD18VW+A0h1h*i}K*p3Q-X%L8X9CIjTUFs0u#27S*Fh)P$~}R@8>N;wSMCKni1l zJ)DBKQT5j2^>iJp<8-`E(DQX7sB(!uq|0io{(%xKL&2V9&7x-EQ&SvS=S zP+O|js!Wxwa#bFncUs+1qcqYKGDzugJyA#LY5I3MOXuiZ@a_ZM)qBiK@z!~1UWRwb z``9b@>b!B_)1R5;W}i6%7@h6JXdCP)z{n37Gzmqc1e6KcTmkB<2j#V)0iZb>D;$ZV z@C+P_=i*oJPw^7G62E~r;;ncG-i`O+1GpG}giqiqT!&l0DIK_r)zj)@4YNi=l1E!( z2qTdsmHd*VlbxiR)RKRai{vI5LPyZ?bOl{a57I;Q2t7_u)3daZMu0+N*g3n-zG3_E zaXf-21D0F)Z}~g?Ja6J(^Kl|VJTG=a9+rwPM1yD+x5NmCI#Zk!C&RhqJmCs=k{j(V zcXzpa+*59V>@UOQ>vApNS|-oSuF6sq0n;67mnu|M>b44oWEczDTclS(?j6=AbffM9 z7-G-!CU~>FFf-G)b3mKnD@6w)ZDC1(Ra|9HCZX4Ad&eOe4Xa)#E>^VG+l zVv?<9>)D^!`>Yt;-pu^$jdmV1%r)@52mKNYdHO0ie+_?=Z|B*3A1~m?_^13VujLKA znYZ$r{61t^57Afj7sJFzNM0hi(2xyLV!DVIOGUCs6&oQV-Uddp#UI2$aY&Sjlj5ql zA$mHY&M0T9GZXS6#YuHWx?^4AzU02jy~ua6o(d|#js&EL8q0Y&!Ee0q7L*pCU_yv2EK<{#!9p9KqhY{ z8Du}C@fW0lw2<#ee@dtV-lAy?eVJ~e1+)w}8q5|0FMjqJyTe|_-vaz=d3O;YLY+wG zukLZT0oucn^W<01<}avK>Jw7T$umiGK4$EbEum=iR5i4P(tc;bj3fNp#tcKOX?rvmF z>7vk diff --git a/polymer/eduke32/source/game.c b/polymer/eduke32/source/game.c index 658379b68..154014e38 100644 --- a/polymer/eduke32/source/game.c +++ b/polymer/eduke32/source/game.c @@ -11051,11 +11051,7 @@ int32_t app_main(int32_t argc, const char **argv) int32_t i = 0, j; char cwd[BMAX_PATH]; // extern char datetimestring[]; -#ifdef NEDMALLOC - ENetCallbacks callbacks = { Bmalloc, Bfree, NULL }; -#else ENetCallbacks callbacks = { NULL, NULL, NULL }; -#endif G_ExtPreInit(); diff --git a/polymer/eduke32/source/sdlmusic.c b/polymer/eduke32/source/sdlmusic.c index 43c5b4d53..0a7e88d90 100644 --- a/polymer/eduke32/source/sdlmusic.c +++ b/polymer/eduke32/source/sdlmusic.c @@ -180,7 +180,7 @@ int32_t MUSIC_Init(int32_t SoundCard, int32_t Address) sz = (numargs+2)*sizeof(char *) + (c-command+1); sz = ((sz+pagesize-1)/pagesize)*pagesize; -#if defined(NEDMALLOC) || defined(__APPLE__) || defined(__ANDROID__) +#if defined(__APPLE__) || defined(__ANDROID__) external_midi_argv = Bcalloc(1,sz+pagesize); if (!external_midi_argv) goto fallback;