From e431d92809a521444594010cbe0dce4b836f6f18 Mon Sep 17 00:00:00 2001 From: hughsando Date: Fri, 15 Nov 2019 18:47:36 +0800 Subject: [PATCH] Remove unused stand-alone ndlls --- project/build.n | Bin 37838 -> 0 bytes project/libs/common/osdef.h | 68 -- project/libs/common/sha1.cpp | 128 -- project/libs/common/sha1.h | 40 - project/libs/common/socket.cpp | 224 ---- project/libs/common/socket.h | 62 - project/libs/linuxcompat/FdeltChk.c | 17 - project/libs/msvccompat/StlLink.cpp | 246 ---- project/libs/mysql/Build.xml | 36 - project/libs/mysql/my_proto/my_api.cpp | 513 -------- project/libs/mysql/my_proto/my_proto.cpp | 422 ------- project/libs/mysql/my_proto/my_proto.h | 183 --- project/libs/mysql/my_proto/mysql.h | 129 -- project/libs/mysql/mysql.cpp | 562 --------- project/libs/nekoapi/NekoAPI.cpp | 651 ---------- project/libs/nekoapi/bin/Linux/libneko.so | Bin 153912 -> 0 bytes project/libs/nekoapi/bin/Linux64/libneko.so | Bin 120885 -> 0 bytes project/libs/nekoapi/bin/Mac/libneko.dylib | Bin 96204 -> 0 bytes project/libs/nekoapi/bin/Mac64/libneko.dylib | Bin 105444 -> 0 bytes project/libs/nekoapi/bin/RPi/libneko.so | Bin 101576 -> 0 bytes project/libs/nekoapi/bin/Windows/neko.lib | Bin 18916 -> 0 bytes project/libs/nekoapi/neko.h | 411 ------- project/libs/nekoapi/neko2.h | 450 ------- project/libs/regexp/Build.xml | 56 - project/libs/regexp/RegExp.cpp | 291 ----- project/libs/sqlite/Build.xml | 31 - project/libs/sqlite/sqlite.cpp | 366 ------ project/libs/std/Build.xml | 43 - project/libs/std/File.cpp | 425 ------- project/libs/std/Init.cpp | 88 -- project/libs/std/Interface.cpp | 5 - project/libs/std/Misc.cpp | 238 ---- project/libs/std/Process.cpp | 473 ------- project/libs/std/Random.cpp | 174 --- project/libs/std/Socket.cpp | 1153 ------------------ project/libs/std/String.cpp | 403 ------ project/libs/std/Sys.cpp | 941 -------------- project/libs/std/Xml.cpp | 386 ------ project/libs/zlib/Build.xml | 48 - project/libs/zlib/ZLib.cpp | 312 ----- project/libs/zlib/zlib.vcproj | 263 ---- 41 files changed, 9838 deletions(-) delete mode 100644 project/build.n delete mode 100644 project/libs/common/osdef.h delete mode 100644 project/libs/common/sha1.cpp delete mode 100644 project/libs/common/sha1.h delete mode 100644 project/libs/common/socket.cpp delete mode 100644 project/libs/common/socket.h delete mode 100644 project/libs/linuxcompat/FdeltChk.c delete mode 100644 project/libs/msvccompat/StlLink.cpp delete mode 100644 project/libs/mysql/Build.xml delete mode 100644 project/libs/mysql/my_proto/my_api.cpp delete mode 100644 project/libs/mysql/my_proto/my_proto.cpp delete mode 100644 project/libs/mysql/my_proto/my_proto.h delete mode 100644 project/libs/mysql/my_proto/mysql.h delete mode 100644 project/libs/mysql/mysql.cpp delete mode 100644 project/libs/nekoapi/NekoAPI.cpp delete mode 100755 project/libs/nekoapi/bin/Linux/libneko.so delete mode 100755 project/libs/nekoapi/bin/Linux64/libneko.so delete mode 100755 project/libs/nekoapi/bin/Mac/libneko.dylib delete mode 100755 project/libs/nekoapi/bin/Mac64/libneko.dylib delete mode 100755 project/libs/nekoapi/bin/RPi/libneko.so delete mode 100644 project/libs/nekoapi/bin/Windows/neko.lib delete mode 100644 project/libs/nekoapi/neko.h delete mode 100644 project/libs/nekoapi/neko2.h delete mode 100644 project/libs/regexp/Build.xml delete mode 100644 project/libs/regexp/RegExp.cpp delete mode 100644 project/libs/sqlite/Build.xml delete mode 100644 project/libs/sqlite/sqlite.cpp delete mode 100644 project/libs/std/Build.xml delete mode 100644 project/libs/std/File.cpp delete mode 100644 project/libs/std/Init.cpp delete mode 100644 project/libs/std/Interface.cpp delete mode 100644 project/libs/std/Misc.cpp delete mode 100644 project/libs/std/Process.cpp delete mode 100644 project/libs/std/Random.cpp delete mode 100644 project/libs/std/Socket.cpp delete mode 100644 project/libs/std/String.cpp delete mode 100644 project/libs/std/Sys.cpp delete mode 100644 project/libs/std/Xml.cpp delete mode 100644 project/libs/zlib/Build.xml delete mode 100644 project/libs/zlib/ZLib.cpp delete mode 100644 project/libs/zlib/zlib.vcproj diff --git a/project/build.n b/project/build.n deleted file mode 100644 index 27124a9f2862e9e10f67dab94c931ec57d4a5d43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37838 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 diff --git a/project/libs/common/osdef.h b/project/libs/common/osdef.h deleted file mode 100644 index 74a21e928..000000000 --- a/project/libs/common/osdef.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C)2005-2012 Haxe Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ -#ifndef OS_H -#define OS_H - -#if defined(_WIN32) -# define OS_WINDOWS -#endif - -#if defined(__APPLE__) || defined(__MACH__) || defined(macintosh) -# define OS_MAC -#endif - -#if defined(linux) || defined(__linux__) -# define OS_LINUX -#endif - -#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) -# define OS_BSD -#endif - -#if defined(HX_LINUX) || defined(HX_MAC) -# define OS_POSIX -#endif - -#if defined(OS_WINDOWS) || defined(BLACKBERRY) -# define LITTLE_ENDIAN 1 -# define BIG_ENDIAN 2 -# define BYTE_ORDER LITTLE_ENDIAN -#elif defined(OS_MAC) || defined(OS_BSD) -# include -#else -# include -#endif - -#ifndef BYTE_ORDER -# warning BYTE_ORDER unknown, assuming BIG_ENDIAN -# define BYTE_ORDER BIG_ENDIAN -#endif - -#if BYTE_ORDER == BIG_ENDIAN -# define IS_BIG_ENDIAN -#else -# define IS_LITTLE_ENDIAN -#endif - - -#endif -/* ************************************************************************ */ diff --git a/project/libs/common/sha1.cpp b/project/libs/common/sha1.cpp deleted file mode 100644 index fa40e44be..000000000 --- a/project/libs/common/sha1.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (C)2005-2012 Haxe Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ -#include "osdef.h" -#include "sha1.h" -#include -#include - -// original code by Steve Reid - -#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) -#ifdef IS_BIG_ENDIAN -# define blk0(i) block[i] -#else -# define blk0(i) (block[i] = (rol(block[i],24)&0xFF00FF00) \ - |(rol(block[i],8)&0x00FF00FF)) -#endif -#define blk(i) (block[i&15] = rol(block[(i+13)&15]^block[(i+8)&15] \ - ^block[(i+2)&15]^block[i&15],1)) -/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ -#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30); -#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); -#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); -#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); -#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); - -static void sha1_transform( unsigned int state[5], unsigned char buffer[64] ) { - unsigned int a, b, c, d, e; - unsigned int block[16]; - memcpy(block, buffer, 64); - /* Copy context->state[] to working vars */ - a = state[0]; - b = state[1]; - c = state[2]; - d = state[3]; - e = state[4]; - /* 4 rounds of 20 operations each. Loop unrolled. */ - R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); - R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); - R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); - R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); - R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); - R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); - R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); - R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); - R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); - R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); - R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); - R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); - R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); - R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); - R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); - R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); - R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); - R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); - R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); - R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79); - /* Add the working vars back into context.state[] */ - state[0] += a; - state[1] += b; - state[2] += c; - state[3] += d; - state[4] += e; -} - -void sha1_init( SHA1_CTX *context ) { - /* SHA1 initialization constants */ - context->state[0] = 0x67452301; - context->state[1] = 0xEFCDAB89; - context->state[2] = 0x98BADCFE; - context->state[3] = 0x10325476; - context->state[4] = 0xC3D2E1F0; - context->count[0] = context->count[1] = 0; -} - -void sha1_update( SHA1_CTX *context, const unsigned char *data, unsigned int len ) { - unsigned int i, j; - j = (context->count[0] >> 3) & 63; - if ((context->count[0] += len << 3) < (len << 3)) context->count[1]++; - context->count[1] += (len >> 29); - if ((j + len) > 63) { - memcpy(&context->buffer[j], data, (i = 64-j)); - sha1_transform(context->state, context->buffer); - for ( ; i + 63 < len; i += 64 ) - sha1_transform(context->state, (unsigned char *)&data[i]); - j = 0; - } else - i = 0; - memcpy(&context->buffer[j], &data[i], len - i); -} - -void sha1_final( SHA1_CTX *context, unsigned char digest[SHA1_SIZE] ) { - unsigned int i; - unsigned char finalcount[8]; - for (i = 0; i < 8; i++) { - finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)] - >> ((3-(i & 3)) * 8) ) & 255); /* Endian independent */ - } - sha1_update(context, (unsigned char *)"\200", 1); - while ((context->count[0] & 504) != 448) { - sha1_update(context, (unsigned char *)"\0", 1); - } - sha1_update(context, finalcount, 8); - for (i = 0; i < SHA1_SIZE; i++) { - digest[i] = (unsigned char) - ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255); - } - sha1_transform(context->state, context->buffer); -} - diff --git a/project/libs/common/sha1.h b/project/libs/common/sha1.h deleted file mode 100644 index 3d680a8f3..000000000 --- a/project/libs/common/sha1.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C)2005-2012 Haxe Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ -#ifndef SHA1_H -#define SHA1_H - -#define SHA1_SIZE 20 - -typedef unsigned char SHA1_DIGEST[SHA1_SIZE]; - -typedef struct { - unsigned int state[5]; - unsigned int count[2]; - unsigned char buffer[64]; -} SHA1_CTX; - -void sha1_init( SHA1_CTX *c ); -void sha1_update( SHA1_CTX *c, const unsigned char *data, unsigned int len ); -void sha1_final( SHA1_CTX *c, SHA1_DIGEST digest ); - -#endif -/* ************************************************************************ */ diff --git a/project/libs/common/socket.cpp b/project/libs/common/socket.cpp deleted file mode 100644 index f00ccf124..000000000 --- a/project/libs/common/socket.cpp +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright (C)2005-2012 Haxe Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ -#include "socket.h" -#include -#include - - -#ifdef OS_WINDOWS - static int init_done = 0; - static WSADATA init_data; -#else -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# define closesocket close -# define SOCKET_ERROR (-1) -#endif - -#if defined(OS_WINDOWS) || defined(OS_MAC) -# define MSG_NOSIGNAL 0 -#endif - -static SERR block_error() { -#ifdef OS_WINDOWS - int err = WSAGetLastError(); - if( err == WSAEWOULDBLOCK || err == WSAEALREADY ) -#else - if( errno == EAGAIN || errno == EWOULDBLOCK || errno == EINPROGRESS || errno == EALREADY ) -#endif - return PS_BLOCK; - return PS_ERROR; -} - -void psock_init() { -#ifdef OS_WINDOWS - if( !init_done ) { - WSAStartup(MAKEWORD(2,0),&init_data); - init_done = 1; - } -#endif -} - -PSOCK psock_create() { - AutoGCBlocking block; - PSOCK s = socket(AF_INET,SOCK_STREAM,0); -# if defined(OS_MAC) || defined(OS_BSD) - if( s != INVALID_SOCKET ) - setsockopt(s,SOL_SOCKET,SO_NOSIGPIPE,NULL,0); -# endif -# ifdef OS_POSIX - // we don't want sockets to be inherited in case of exec - { - int old = fcntl(s,F_GETFD,0); - if( old >= 0 ) fcntl(s,F_SETFD,old|FD_CLOEXEC); - } -# endif - return s; -} - -void psock_close( PSOCK s ) { - AutoGCBlocking block; - POSIX_LABEL(close_again); - if( closesocket(s) ) { - HANDLE_EINTR(close_again); - } -} - -int psock_send( PSOCK s, const char *buf, int size ) { - AutoGCBlocking block; - return psock_send_no_gc(s,buf,size); -} - -int psock_send_no_gc( PSOCK s, const char *buf, int size ) { - int ret; - POSIX_LABEL(send_again); - ret = send(s,buf,size,MSG_NOSIGNAL); - if( ret == SOCKET_ERROR ) { - HANDLE_EINTR(send_again); - return block_error(); - } - return ret; -} - -int psock_recv( PSOCK s, char *buf, int size ) { - AutoGCBlocking block; - return psock_recv_no_gc(s,buf,size); -} - -int psock_recv_no_gc( PSOCK s, char *buf, int size ) { - int ret; - POSIX_LABEL(recv_again); - ret = recv(s,buf,size,MSG_NOSIGNAL); - if( ret == SOCKET_ERROR ) { - HANDLE_EINTR(recv_again); - return block_error(); - } - return ret; -} - -PHOST phost_resolve( const char *host ) { - AutoGCBlocking block; - PHOST ip = inet_addr(host); - if( ip == INADDR_NONE ) { - struct hostent *h; -# if defined(OS_WINDOWS) || defined(OS_MAC) || defined(BLACKBERRY) - h = gethostbyname(host); -# else - struct hostent hbase; - char buf[1024]; - int errcode; - gethostbyname_r(host,&hbase,buf,1024,&h,&errcode); -# endif - if( h == NULL ) - return UNRESOLVED_HOST; - ip = *((unsigned int*)h->h_addr); - } - return ip; -} - -SERR psock_connect( PSOCK s, PHOST host, int port ) { - AutoGCBlocking block; - struct sockaddr_in addr; - memset(&addr,0,sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_port = htons(port); - *(int*)&addr.sin_addr.s_addr = host; - if( connect(s,(struct sockaddr*)&addr,sizeof(addr)) != 0 ) - return block_error(); - return PS_OK; -} - -SERR psock_set_timeout( PSOCK s, double t ) { -#ifdef OS_WINDOWS - int time = (int)(t * 1000); -#else - struct timeval time; - time.tv_usec = (int)((t - (int)t)*1000000); - time.tv_sec = (int)t; -#endif - if( setsockopt(s,SOL_SOCKET,SO_SNDTIMEO,(char*)&time,sizeof(time)) != 0 ) - return PS_ERROR; - if( setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,(char*)&time,sizeof(time)) != 0 ) - return PS_ERROR; - return PS_OK; -} - - -SERR psock_set_blocking( PSOCK s, int block ) { -#ifdef OS_WINDOWS - { - unsigned long arg = !block; - if( ioctlsocket(s,FIONBIO,&arg) != 0 ) - return PS_ERROR; - } -#else - { - int rights = fcntl(s,F_GETFL); - if( rights == -1 ) - return PS_ERROR; - if( block ) - rights &= ~O_NONBLOCK; - else - rights |= O_NONBLOCK; - if( fcntl(s,F_SETFL,rights) == -1 ) - return PS_ERROR; - } -#endif - return PS_OK; -} - -SERR psock_set_fastsend( PSOCK s, int fast ) { - if( setsockopt(s,IPPROTO_TCP,TCP_NODELAY,(char*)&fast,sizeof(fast)) ) - return block_error(); - return PS_OK; -} - -void psock_wait( PSOCK s ) { - AutoGCBlocking block; -# ifdef OS_WINDOWS - fd_set set; - FD_ZERO(&set); - FD_SET(s,&set); - select((int)s+1,&set,NULL,NULL,NULL); -# else - struct pollfd fds; - POSIX_LABEL(poll_again); - fds.fd = s; - fds.events = POLLIN; - fds.revents = 0; - if( poll(&fds,1,-1) < 0 ) { - HANDLE_EINTR(poll_again); - } -# endif -} - -/* ************************************************************************ */ diff --git a/project/libs/common/socket.h b/project/libs/common/socket.h deleted file mode 100644 index ab3e3acb6..000000000 --- a/project/libs/common/socket.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C)2005-2012 Haxe Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ -#ifndef SOCKET_H -#define SOCKET_H - -#include "osdef.h" - -#ifdef OS_WINDOWS -# include - typedef SOCKET PSOCK; -#else - typedef int PSOCK; -# define INVALID_SOCKET (-1) -#endif - -typedef unsigned int PHOST; - -#define UNRESOLVED_HOST ((PHOST)-1) - -typedef enum { - PS_OK = 0, - PS_ERROR = -1, - PS_BLOCK = -2, -} SERR; - -void psock_init(); -PSOCK psock_create(); -void psock_close( PSOCK s ); -SERR psock_connect( PSOCK s, PHOST h, int port ); -SERR psock_set_timeout( PSOCK s, double timeout ); -SERR psock_set_blocking( PSOCK s, int block ); -SERR psock_set_fastsend( PSOCK s, int fast ); - -int psock_send( PSOCK s, const char *buf, int size ); -int psock_recv( PSOCK s, char *buf, int size ); - -int psock_send_no_gc( PSOCK s, const char *buf, int size ); -int psock_recv_no_gc( PSOCK s, char *buf, int size ); - -PHOST phost_resolve( const char *hostname ); - -#endif -/* ************************************************************************ */ diff --git a/project/libs/linuxcompat/FdeltChk.c b/project/libs/linuxcompat/FdeltChk.c deleted file mode 100644 index 7409b1f9c..000000000 --- a/project/libs/linuxcompat/FdeltChk.c +++ /dev/null @@ -1,17 +0,0 @@ -#define __fdelt_chk __fdelt_chk_local -#include -#undef __fdelt_chk - -// Some linux variations use "unsigned int" and some don't have it -// int the dlls. So force it here. -long int __fdelt_chk (long int d) -{ - if (d >= FD_SETSIZE) - { - //printf("Select - bad fd.\n"); - return 0; - } - - return d / __NFDBITS; -} - diff --git a/project/libs/msvccompat/StlLink.cpp b/project/libs/msvccompat/StlLink.cpp deleted file mode 100644 index 2b8405c1b..000000000 --- a/project/libs/msvccompat/StlLink.cpp +++ /dev/null @@ -1,246 +0,0 @@ -#ifdef _MSC_VER - - - -#if _MSC_VER>=1800 && _MSC_VER<1900 - -#include -#include -#include -#pragma warning(disable: 4005) -#include - -namespace std -{ - -_CRTIMP2_PURE _NO_RETURN(__CLRCALL_PURE_OR_CDECL _Xbad_alloc()) - { // report a bad_alloc error - _THROW_NCEE(_XSTD bad_alloc, _EMPTY_ARGUMENT); - - } - -_CRTIMP2_PURE _NO_RETURN(__CLRCALL_PURE_OR_CDECL _Xinvalid_argument(_In_z_ const char *_Message)) - { // report an invalid_argument error - _THROW_NCEE(invalid_argument, _Message); - } - -_CRTIMP2_PURE _NO_RETURN(__CLRCALL_PURE_OR_CDECL _Xlength_error(_In_z_ const char *_Message)) - { // report a length_error - _THROW_NCEE(length_error, _Message); - } - -_CRTIMP2_PURE _NO_RETURN(__CLRCALL_PURE_OR_CDECL _Xout_of_range(_In_z_ const char *_Message)) - { // report an out_of_range error - _THROW_NCEE(out_of_range, _Message); - } - -_CRTIMP2_PURE _NO_RETURN(__CLRCALL_PURE_OR_CDECL _Xoverflow_error(_In_z_ const char *_Message)) - { // report an overflow error - _THROW_NCEE(overflow_error, _Message); - } - -_CRTIMP2_PURE _NO_RETURN(__CLRCALL_PURE_OR_CDECL _Xruntime_error(_In_z_ const char *_Message)) - { // report a runtime_error - _THROW_NCEE(runtime_error, _Message); - } - - - - -struct _Win_errtab_t - { // maps Windows error_code to NTBS - int _Errcode; - const char *_Name; - }; - -static const _Win_errtab_t _Win_errtab[] = - { // table of Windows code/name pairs - ERROR_ACCESS_DENIED, "permission denied", - ERROR_ALREADY_EXISTS, "file exists", - ERROR_BAD_UNIT, "no such device", - ERROR_BUFFER_OVERFLOW, "filename too long", - ERROR_BUSY, "device or resource busy", - ERROR_BUSY_DRIVE, "device or resource busy", - ERROR_CANNOT_MAKE, "permission denied", - ERROR_CANTOPEN, "io error", - ERROR_CANTREAD, "io error", - ERROR_CANTWRITE, "io error", - ERROR_CURRENT_DIRECTORY, "permission denied", - ERROR_DEV_NOT_EXIST, "no such device", - ERROR_DEVICE_IN_USE, "device or resource busy", - ERROR_DIR_NOT_EMPTY, "directory not empty", - ERROR_DIRECTORY, "invalid argument", - ERROR_DISK_FULL, "no space on device", - ERROR_FILE_EXISTS, "file exists", - ERROR_FILE_NOT_FOUND, "no such file or directory", - ERROR_HANDLE_DISK_FULL, "no space on device", - ERROR_INVALID_ACCESS, "permission denied", - ERROR_INVALID_DRIVE, "no such device", - ERROR_INVALID_FUNCTION, "function not supported", - ERROR_INVALID_HANDLE, "invalid argument", - ERROR_INVALID_NAME, "invalid argument", - ERROR_LOCK_VIOLATION, "no lock available", - ERROR_LOCKED, "no lock available", - ERROR_NEGATIVE_SEEK, "invalid argument", - ERROR_NOACCESS, "permission denied", - ERROR_NOT_ENOUGH_MEMORY, "not enough memory", - ERROR_NOT_READY, "resource unavailable try again", - ERROR_NOT_SAME_DEVICE, "cross device link", - ERROR_OPEN_FAILED, "io error", - ERROR_OPEN_FILES, "device or resource busy", - ERROR_OPERATION_ABORTED, "operation canceled", - ERROR_OUTOFMEMORY, "not enough memory", - ERROR_PATH_NOT_FOUND, "no such file or directory", - ERROR_READ_FAULT, "io error", - ERROR_RETRY, "resource unavailable try again", - ERROR_SEEK, "io error", - ERROR_SHARING_VIOLATION, "permission denied", - ERROR_TOO_MANY_OPEN_FILES, "too many files open", - ERROR_WRITE_FAULT, "io error", - ERROR_WRITE_PROTECT, "permission denied", - WSAEACCES, "permission_denied", - WSAEADDRINUSE, "address_in_use", - WSAEADDRNOTAVAIL, "address_not_available", - WSAEAFNOSUPPORT, "address_family_not_supported", - WSAEALREADY, "connection_already_in_progress", - WSAEBADF, "bad_file_descriptor", - WSAECONNABORTED, "connection_aborted", - WSAECONNREFUSED, "connection_refused", - WSAECONNRESET, "connection_reset", - WSAEDESTADDRREQ, "destination_address_required", - WSAEFAULT, "bad_address", - WSAEHOSTUNREACH, "host_unreachable", - WSAEINPROGRESS, "operation_in_progress", - WSAEINTR, "interrupted", - WSAEINVAL, "invalid_argument", - WSAEISCONN, "already_connected", - WSAEMFILE, "too_many_files_open", - WSAEMSGSIZE, "message_size", - WSAENAMETOOLONG, "filename_too_long", - WSAENETDOWN, "network_down", - WSAENETRESET, "network_reset", - WSAENETUNREACH, "network_unreachable", - WSAENOBUFS, "no_buffer_space", - WSAENOPROTOOPT, "no_protocol_option", - WSAENOTCONN, "not_connected", - WSAENOTSOCK, "not_a_socket", - WSAEOPNOTSUPP, "operation_not_supported", - WSAEPROTONOSUPPORT, "protocol_not_supported", - WSAEPROTOTYPE, "wrong_protocol_type", - WSAETIMEDOUT, "timed_out", - WSAEWOULDBLOCK, "operation_would_block", - 0, 0 - }; - -const char *_Winerror_map(int _Errcode) - { // convert to name of Windows error - const _Win_errtab_t *_Ptr = &_Win_errtab[0]; - for (; _Ptr->_Name != 0; ++_Ptr) - if ((int)_Ptr->_Errcode == _Errcode) - return (_Ptr->_Name); - return (0); - } - -struct _Sys_errtab_t - { // maps error_code to NTBS - generic_errno _Errcode; - const char *_Name; - }; - -static const _Sys_errtab_t _Sys_errtab[] = - { // table of Posix code/name pairs - errc::address_family_not_supported, "address family not supported", - errc::address_in_use, "address in use", - errc::address_not_available, "address not available", - errc::already_connected, "already connected", - errc::argument_list_too_long, "argument list too long", - errc::argument_out_of_domain, "argument out of domain", - errc::bad_address, "bad address", - errc::bad_file_descriptor, "bad file descriptor", - errc::bad_message, "bad message", - errc::broken_pipe, "broken pipe", - errc::connection_aborted, "connection aborted", - errc::connection_already_in_progress, "connection already in progress", - errc::connection_refused, "connection refused", - errc::connection_reset, "connection reset", - errc::cross_device_link, "cross device link", - errc::destination_address_required, "destination address required", - errc::device_or_resource_busy, "device or resource busy", - errc::directory_not_empty, "directory not empty", - errc::executable_format_error, "executable format error", - errc::file_exists, "file exists", - errc::file_too_large, "file too large", - errc::filename_too_long, "filename too long", - errc::function_not_supported, "function not supported", - errc::host_unreachable, "host unreachable", - errc::identifier_removed, "identifier removed", - errc::illegal_byte_sequence, "illegal byte sequence", - errc::inappropriate_io_control_operation, - "inappropriate io control operation", - errc::interrupted, "interrupted", - errc::invalid_argument, "invalid argument", - errc::invalid_seek, "invalid seek", - errc::io_error, "io error", - errc::is_a_directory, "is a directory", - errc::message_size, "message size", - errc::network_down, "network down", - errc::network_reset, "network reset", - errc::network_unreachable, "network unreachable", - errc::no_buffer_space, "no buffer space", - errc::no_child_process, "no child process", - errc::no_link, "no link", - errc::no_lock_available, "no lock available", - errc::no_message_available, "no message available", - errc::no_message, "no message", - errc::no_protocol_option, "no protocol option", - errc::no_space_on_device, "no space on device", - errc::no_stream_resources, "no stream resources", - errc::no_such_device_or_address, "no such device or address", - errc::no_such_device, "no such device", - errc::no_such_file_or_directory, "no such file or directory", - errc::no_such_process, "no such process", - errc::not_a_directory, "not a directory", - errc::not_a_socket, "not a socket", - errc::not_a_stream, "not a stream", - errc::not_connected, "not connected", - errc::not_enough_memory, "not enough memory", - errc::not_supported, "not supported", - errc::operation_canceled, "operation canceled", - errc::operation_in_progress, "operation in progress", - errc::operation_not_permitted, "operation not permitted", - errc::operation_not_supported, "operation not supported", - errc::operation_would_block, "operation would block", - errc::owner_dead, "owner dead", - errc::permission_denied, "permission denied", - errc::protocol_error, "protocol error", - errc::protocol_not_supported, "protocol not supported", - errc::read_only_file_system, "read only file system", - errc::resource_deadlock_would_occur, "resource deadlock would occur", - errc::resource_unavailable_try_again, "resource unavailable try again", - errc::result_out_of_range, "result out of range", - errc::state_not_recoverable, "state not recoverable", - errc::stream_timeout, "stream timeout", - errc::text_file_busy, "text file busy", - errc::timed_out, "timed out", - errc::too_many_files_open_in_system, "too many files open in system", - errc::too_many_files_open, "too many files open", - errc::too_many_links, "too many links", - errc::too_many_symbolic_link_levels, "too many symbolic link levels", - errc::value_too_large, "value too large", - errc::wrong_protocol_type, "wrong protocol type", - (generic_errno)0, 0 - }; - -const char *__cdecl _Syserror_map(int _Errcode) - { // convert to name of generic error - const _Sys_errtab_t *_Ptr = &_Sys_errtab[0]; - for (; _Ptr->_Name != 0; ++_Ptr) - if ((int)_Ptr->_Errcode == _Errcode) - return (_Ptr->_Name); - return (0); - } -} -#endif - - -#endif diff --git a/project/libs/mysql/Build.xml b/project/libs/mysql/Build.xml deleted file mode 100644 index 8d087442e..000000000 --- a/project/libs/mysql/Build.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/project/libs/mysql/my_proto/my_api.cpp b/project/libs/mysql/my_proto/my_api.cpp deleted file mode 100644 index 6c1fd2bef..000000000 --- a/project/libs/mysql/my_proto/my_api.cpp +++ /dev/null @@ -1,513 +0,0 @@ -/* ************************************************************************ */ -/* */ -/* MYSQL 5.0 Protocol Implementation */ -/* Copyright (c)2008 Nicolas Cannasse */ -/* */ -/* This program is free software; you can redistribute it and/or modify */ -/* it under the terms of the GNU General Public License as published by */ -/* the Free Software Foundation; either version 2 of the License, or */ -/* (at your option) any later version. */ -/* */ -/* This program is distributed in the hope that it will be useful, */ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ -/* GNU General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU General Public License */ -/* along with this program; if not, write to the Free Software */ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* */ -/* ************************************************************************ */ -#include -#include -#include -#include "my_proto.h" - -static void error( MYSQL *m, const char *err, const char *param ) { - if( param ) { - unsigned int max = MAX_ERR_SIZE - (strlen(err) + 3); - if( strlen(param) > max ) { - char *p2 = (char*)malloc(max + 1); - memcpy(p2,param,max-3); - p2[max - 3] = '.'; - p2[max - 2] = '.'; - p2[max - 1] = '.'; - p2[max] = 0; - sprintf(m->last_error,err,param); - free(p2); - return; - } - } - sprintf(m->last_error,err,param); - m->errcode = -1; -} - -static void save_error( MYSQL *m, MYSQL_PACKET *p ) { - int ecode; - p->pos = 0; - // seems like we sometimes get some FFFFFF sequences before - // the actual error... - do { - if( myp_read_byte(p) != 0xFF ) { - m->errcode = -1; - error(m,"Failed to decode error",NULL); - return; - } - ecode = myp_read_ui16(p); - } while( ecode == 0xFFFF ); - if( m->is41 && p->buf[p->pos] == '#' ) - p->pos += 6; // skip sqlstate marker - error(m,"%s",myp_read_string(p)); - m->errcode = ecode; -} - -static int myp_ok( MYSQL *m, int allow_others ) { - int code; - MYSQL_PACKET *p = &m->packet; - if( !myp_read_packet(m,p) ) { - error(m,"Failed to read packet",NULL); - return 0; - } - code = myp_read_byte(p); - if( code == 0x00 ) - return 1; - if( code == 0xFF ) - save_error(m,p); - else if( allow_others ) - return 1; - else - error(m,"Invalid packet error",NULL); - return 0; -} - -static void myp_close( MYSQL *m ) { - psock_close(m->s); - m->s = INVALID_SOCKET; -} - -MYSQL *mysql_init( void *unused ) { - MYSQL *m = (MYSQL*)malloc(sizeof(struct _MYSQL)); - psock_init(); - memset(m,0,sizeof(struct _MYSQL)); - m->s = INVALID_SOCKET; - error(m,"NO ERROR",NULL); - m->errcode = 0; - m->last_field_count = -1; - m->last_insert_id = -1; - m->affected_rows = -1; - return m; -} - -MYSQL *mysql_real_connect( MYSQL *m, const char *host, const char *user, const char *pass, void *unused, int port, const char *socket, int options ) { - PHOST h; - char scramble_buf[21]; - MYSQL_PACKET *p = &m->packet; - int pcount = 1; - if( socket && *socket ) { - error(m,"Unix Socket connections are not supported",NULL); - return NULL; - } - h = phost_resolve(host); - if( h == UNRESOLVED_HOST ) { - error(m,"Failed to resolve host '%s'",host); - return NULL; - } - m->s = psock_create(); - if( m->s == INVALID_SOCKET ) { - error(m,"Failed to create socket",NULL); - return NULL; - } - psock_set_fastsend(m->s,1); - psock_set_timeout(m->s,50); // 50 seconds - if( psock_connect(m->s,h,port) != PS_OK ) { - myp_close(m); - error(m,"Failed to connect on host '%s'",host); - return NULL; - } - if( !myp_read_packet(m,p) ) { - myp_close(m); - error(m,"Failed to read handshake packet",NULL); - return NULL; - } - // process handshake packet - { - char filler[13]; - unsigned int len; - m->infos.proto_version = myp_read_byte(p); - // this seems like an error packet - if( m->infos.proto_version == 0xFF ) { - myp_close(m); - save_error(m,p); - return NULL; - } - m->infos.server_version = strdup(myp_read_string(p)); - m->infos.thread_id = myp_read_int(p); - myp_read(p,scramble_buf,8); - myp_read_byte(p); // should be 0 - m->infos.server_flags = myp_read_ui16(p); - m->infos.server_charset = myp_read_byte(p); - m->infos.server_status = myp_read_ui16(p); - m->infos.server_flags |= myp_read_ui16(p) << 16; - len = myp_read_byte(p); - myp_read(p,filler,10); - // try to disable 41 - m->is41 = (m->infos.server_flags & FL_PROTOCOL_41) != 0; - if( !p->error && m->is41 ) - myp_read(p,scramble_buf + 8,13); - if( p->pos != p->size ) - myp_read_string(p); // 5.5+ - if( p->error ) { - myp_close(m); - error(m,"Failed to decode server handshake",NULL); - return NULL; - } - // fill answer packet - { - unsigned int flags = m->infos.server_flags; - int max_packet_size = 0x01000000; - SHA1_DIGEST hpass; - char filler[23]; - flags &= (FL_PROTOCOL_41 | FL_TRANSACTIONS | FL_SECURE_CONNECTION); - myp_begin_packet(p,128); - if( m->is41 ) { - myp_write_int(p,flags); - myp_write_int(p,max_packet_size); - myp_write_byte(p,m->infos.server_charset); - memset(filler,0,23); - myp_write(p,filler,23); - myp_write_string(p,user); - if( *pass ) { - myp_encrypt_password(pass,scramble_buf,hpass); - myp_write_bin(p,SHA1_SIZE); - myp_write(p,hpass,SHA1_SIZE); - myp_write_byte(p,0); - } else - myp_write_bin(p,0); - } else { - myp_write_ui16(p,flags); - // max_packet_size - myp_write_byte(p,0xFF); - myp_write_byte(p,0xFF); - myp_write_byte(p,0xFF); - myp_write_string(p,user); - if( *pass ) { - char hpass[SEED_LENGTH_323 + 1]; - myp_encrypt_pass_323(pass,scramble_buf,hpass); - hpass[SEED_LENGTH_323] = 0; - myp_write(p,hpass,SEED_LENGTH_323 + 1); - } else - myp_write_bin(p,0); - } - } - } - // send connection packet -send_cnx_packet: - if( !myp_send_packet(m,p,&pcount) ) { - myp_close(m); - error(m,"Failed to send connection packet",NULL); - return NULL; - } - // read answer packet - if( !myp_read_packet(m,p) ) { - myp_close(m); - error(m,"Failed to read packet",NULL); - return NULL; - } - // increase packet counter (because we read one packet) - pcount++; - // process answer - { - int code = myp_read_byte(p); - switch( code ) { - case 0: // OK packet - break; - case 0xFF: // ERROR - myp_close(m); - save_error(m,p); - return NULL; - case 0xFE: // EOF - // we are asked to send old password authentification - if( p->size == 1 ) { - char hpass[SEED_LENGTH_323 + 1]; - myp_encrypt_pass_323(pass,scramble_buf,hpass); - hpass[SEED_LENGTH_323] = 0; - myp_begin_packet(p,0); - myp_write(p,hpass,SEED_LENGTH_323 + 1); - goto send_cnx_packet; - } - // fallthrough - default: - myp_close(m); - error(m,"Invalid packet error",NULL); - return NULL; - } - } - // we are connected, setup a longer timeout - psock_set_timeout(m->s,18000); - return m; -} - -int mysql_select_db( MYSQL *m, const char *dbname ) { - MYSQL_PACKET *p = &m->packet; - int pcount = 0; - myp_begin_packet(p,0); - myp_write_byte(p,COM_INIT_DB); - myp_write_string(p,dbname); - if( !myp_send_packet(m,p,&pcount) ) { - error(m,"Failed to send packet",NULL); - return -1; - } - return myp_ok(m,0) ? 0 : -1; -} - -int mysql_real_query( MYSQL *m, const char *query, int qlength ) { - MYSQL_PACKET *p = &m->packet; - int pcount = 0; - myp_begin_packet(p,0); - myp_write_byte(p,COM_QUERY); - myp_write(p,query,qlength); - m->last_field_count = -1; - m->affected_rows = -1; - m->last_insert_id = -1; - if( !myp_send_packet(m,p,&pcount) ) { - error(m,"Failed to send packet",NULL); - return -1; - } - if( !myp_ok(m,1) ) - return -1; - p->id = IS_QUERY; - return 0; -} - -static int do_store( MYSQL *m, MYSQL_RES *r ) { - int i; - MYSQL_PACKET *p = &m->packet; - p->pos = 0; - r->nfields = myp_read_bin(p); - if( p->error ) return 0; - r->fields = (MYSQL_FIELD*)malloc(sizeof(MYSQL_FIELD) * r->nfields); - memset(r->fields,0,sizeof(MYSQL_FIELD) * r->nfields); - for(i=0;infields;i++) { - if( !myp_read_packet(m,p) ) - return 0; - { - MYSQL_FIELD *f = r->fields + i; - f->catalog = m->is41 ? myp_read_bin_str(p) : NULL; - f->db = m->is41 ? myp_read_bin_str(p) : NULL; - f->table = myp_read_bin_str(p); - f->org_table = m->is41 ? myp_read_bin_str(p) : NULL; - f->name = myp_read_bin_str(p); - f->org_name = m->is41 ? myp_read_bin_str(p) : NULL; - if( m->is41 ) myp_read_byte(p); - f->charset = m->is41 ? myp_read_ui16(p) : 0x08; - f->length = m->is41 ? myp_read_int(p) : myp_read_bin(p); - f->type = (FIELD_TYPE)(m->is41 ? myp_read_byte(p) : myp_read_bin(p)); - f->flags = m->is41 ? myp_read_ui16(p) : myp_read_bin(p); - f->decimals = myp_read_byte(p); - if( m->is41 ) myp_read_byte(p); // should be 0 - if( m->is41 ) myp_read_byte(p); // should be 0 - if( p->error ) - return 0; - } - } - // first EOF packet - if( !myp_read_packet(m,p) ) - return 0; - if( myp_read_byte(p) != 0xFE || p->size >= 9 ) - return 0; - // reset packet buffer (to prevent to store large buffer in row data) - free(p->buf); - p->buf = NULL; - p->mem = 0; - // datas - while( 1 ) { - if( !myp_read_packet(m,p) ) - return 0; - // EOF : end of datas - if( (unsigned char)p->buf[0] == 0xFE && p->size < 9 ) - break; - // ERROR ? - if( (unsigned char)p->buf[0] == 0xFF ) { - save_error(m,p); - return 0; - } - // allocate one more row - if( r->row_count == r->memory_rows ) { - MYSQL_ROW_DATA *rows; - r->memory_rows = r->memory_rows ? (r->memory_rows << 1) : 1; - rows = (MYSQL_ROW_DATA*)malloc(r->memory_rows * sizeof(MYSQL_ROW_DATA)); - memcpy(rows,r->rows,r->row_count * sizeof(MYSQL_ROW_DATA)); - free(r->rows); - r->rows = rows; - } - // read row fields - { - MYSQL_ROW_DATA *current = r->rows + r->row_count++; - int prev = 0; - current->raw = p->buf; - current->lengths = (unsigned long*)malloc(sizeof(unsigned long) * r->nfields); - current->datas = (char**)malloc(sizeof(char*) * r->nfields); - for(i=0;infields;i++) { - int l = myp_read_bin(p); - if( !p->error ) - p->buf[prev] = 0; - if( l == -1 ) { - current->lengths[i] = 0; - current->datas[i] = NULL; - } else { - current->lengths[i] = l; - current->datas[i] = p->buf + p->pos; - p->pos += l; - } - prev = p->pos; - } - if( !p->error ) - p->buf[prev] = 0; - } - // the packet buffer as been stored, don't reuse it - p->buf = NULL; - p->mem = 0; - if( p->error ) - return 0; - } - return 1; -} - -MYSQL_RES *mysql_store_result( MYSQL *m ) { - MYSQL_RES *r; - MYSQL_PACKET *p = &m->packet; - if( p->id != IS_QUERY ) - return NULL; - // OK without result - if( p->buf[0] == 0 ) { - p->pos = 0; - m->last_field_count = myp_read_byte(p); // 0 - m->affected_rows = myp_read_bin(p); - m->last_insert_id = myp_read_bin(p); - return NULL; - } - r = (MYSQL_RES*)malloc(sizeof(struct _MYSQL_RES)); - memset(r,0,sizeof(struct _MYSQL_RES)); - m->errcode = 0; - if( !do_store(m,r) ) { - mysql_free_result(r); - if( !m->errcode ) - error(m,"Failure while storing result",NULL); - return NULL; - } - m->last_field_count = r->nfields; - return r; -} - -int mysql_field_count( MYSQL *m ) { - return m->last_field_count; -} - -int mysql_affected_rows( MYSQL *m ) { - return m->affected_rows; -} - -int mysql_escape_string( MYSQL *m, char *sout, const char *sin, int length ) { - return myp_escape_string(m->infos.server_charset,sout,sin,length); -} - -const char *mysql_character_set_name( MYSQL *m ) { - const char *name = myp_charset_name(m->infos.server_charset); - if( name == NULL ) { - static char tmp[512]; - sprintf(tmp,"#%d",m->infos.server_charset); - return tmp; - } - return name; -} - -int mysql_real_escape_string( MYSQL *m, char *sout, const char *sin, int length ) { - if( !myp_supported_charset(m->infos.server_charset) ) - return -1; - if( m->infos.server_status & SERVER_STATUS_NO_BACKSLASH_ESCAPES ) - return myp_escape_quotes(m->infos.server_charset,sout,sin,length); - return myp_escape_string(m->infos.server_charset,sout,sin,length); -} - -void mysql_close( MYSQL *m ) { - myp_close(m); - free(m->packet.buf); - free(m->infos.server_version); - free(m); -} - -const char *mysql_error( MYSQL *m ) { - return m->last_error; -} - -// RESULTS API - -unsigned int mysql_num_rows( MYSQL_RES *r ) { - return r->row_count; -} - -int mysql_num_fields( MYSQL_RES *r ) { - return r->nfields; -} - -MYSQL_FIELD *mysql_fetch_fields( MYSQL_RES *r ) { - return r->fields; -} - -unsigned long *mysql_fetch_lengths( MYSQL_RES *r ) { - return r->current ? r->current->lengths : NULL; -} - -MYSQL_ROW mysql_fetch_row( MYSQL_RES * r ) { - MYSQL_ROW_DATA *cur = r->current; - if( cur == NULL ) - cur = r->rows; - else { - // free the previous result, since we're done with it - free(cur->datas); - free(cur->lengths); - free(cur->raw); - cur->datas = NULL; - cur->lengths = NULL; - cur->raw = NULL; - // next - cur++; - } - if( cur >= r->rows + r->row_count ) { - free(r->rows); - r->rows = NULL; - r->memory_rows = 0; - cur = NULL; - } - r->current = cur; - return cur ? cur->datas : NULL; -} - -void mysql_free_result( MYSQL_RES *r ) { - if( r->fields ) { - int i; - for(i=0;infields;i++) { - MYSQL_FIELD *f = r->fields + i; - free(f->catalog); - free(f->db); - free(f->table); - free(f->org_table); - free(f->name); - free(f->org_name); - } - free(r->fields); - } - if( r->rows ) { - int i; - for(i=0;irow_count;i++) { - MYSQL_ROW_DATA *row = r->rows + i; - free(row->datas); - free(row->lengths); - free(row->raw); - } - free(r->rows); - } - free(r); -} - -/* ************************************************************************ */ diff --git a/project/libs/mysql/my_proto/my_proto.cpp b/project/libs/mysql/my_proto/my_proto.cpp deleted file mode 100644 index d72d2b720..000000000 --- a/project/libs/mysql/my_proto/my_proto.cpp +++ /dev/null @@ -1,422 +0,0 @@ -/* ************************************************************************ */ -/* */ -/* MYSQL 5.0 Protocol Implementation */ -/* Copyright (c)2008 Nicolas Cannasse */ -/* */ -/* This program is free software; you can redistribute it and/or modify */ -/* it under the terms of the GNU General Public License as published by */ -/* the Free Software Foundation; either version 2 of the License, or */ -/* (at your option) any later version. */ -/* */ -/* This program is distributed in the hope that it will be useful, */ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ -/* GNU General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU General Public License */ -/* along with this program; if not, write to the Free Software */ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* */ -/* ************************************************************************ */ -#include -#include -#include -#include "my_proto.h" -#include - -#define MAX_PACKET_LENGTH 0xFFFFFF - -int myp_recv( MYSQL *m, void *buf, int size ) { - AutoGCBlocking blocking; - return myp_recv_no_gc(m,buf,size); -} - -int myp_recv_no_gc( MYSQL *m, void *buf, int size ) { - while( size ) { - int len = psock_recv_no_gc(m->s,(char*)buf,size); - if( len <= 0 ) return size == 0 ? 1 : 0; - buf = ((char*)buf) + len; - size -= len; - } - return 1; -} - - -int myp_send( MYSQL *m, void *buf, int size ) { - AutoGCBlocking blocking; - return myp_send_no_gc(m,buf,size); -} - -int myp_send_no_gc( MYSQL *m, void *buf, int size ) { - while( size ) { - int len = psock_send_no_gc(m->s,(char*)buf,size); - if( len <= 0 ) return size == 0 ? 1 : 0; - buf = ((char*)buf) + len; - size -= len; - } - return 1; -} - -int myp_read( MYSQL_PACKET *p, void *buf, int size ) { - if( p->size - p->pos < size ) { - p->error = 1; - return 0; - } - memcpy(buf,p->buf + p->pos,size); - p->pos += size; - return 1; -} - -unsigned char myp_read_byte( MYSQL_PACKET *p ) { - unsigned char c; - if( !myp_read(p,&c,1) ) - return 0; - return c; -} - -unsigned short myp_read_ui16( MYSQL_PACKET *p ) { - unsigned short i; - if( !myp_read(p,&i,2) ) - return 0; - return i; -} - -int myp_read_int( MYSQL_PACKET *p ) { - int i; - if( !myp_read(p,&i,4) ) - return 0; - return i; -} - -int myp_read_bin( MYSQL_PACKET *p ) { - int c = myp_read_byte(p); - if( c <= 250 ) - return c; - if( c == 251 ) - return -1; // NULL - if( c == 252 ) - return myp_read_ui16(p); - if( c == 253 ) { - c = 0; - myp_read(p,&c,3); - return c; - } - if( c == 254 ) - return myp_read_int(p); - p->error = 1; - return 0; -} - -const char *myp_read_string( MYSQL_PACKET *p ) { - char *str; - if( p->pos >= p->size ) { - p->error = 1; - return ""; - } - str = p->buf + p->pos; - p->pos += strlen(str) + 1; - return str; -} - -char *myp_read_bin_str( MYSQL_PACKET *p ) { - int size = myp_read_bin(p); - char *str; - if( size == -1 ) - return NULL; - if( p->error || p->pos + size > p->size ) { - p->error = 1; - return NULL; - } - str = (char*)malloc(size + 1); - memcpy(str,p->buf + p->pos, size); - str[size] = 0; - p->pos += size; - return str; -} - -int myp_read_packet( MYSQL *m, MYSQL_PACKET *p ) { - AutoGCBlocking blocking; - unsigned int psize; - p->pos = 0; - p->error = 0; - if( !myp_recv_no_gc(m,&psize,4) ) { - p->error = 1; - p->size = 0; - return 0; - } - //p->id = (psize >> 24); - psize &= 0xFFFFFF; - p->size = psize; - if( p->mem < (int)psize ) { - free(p->buf); - p->buf = (char*)malloc(psize + 1); - p->mem = psize; - } - p->buf[psize] = 0; - if( psize == 0 || !myp_recv_no_gc(m,p->buf,psize) ) { - p->error = 1; - p->size = 0; - p->buf[0] = 0; - return 0; - } - return 1; -} - -int myp_send_packet( MYSQL *m, MYSQL_PACKET *p, int *packet_counter ) { - AutoGCBlocking blocking; - unsigned int header; - char *buf = p->buf; - int size = p->size; - int next = 1; - while( next ) { - int psize; - if( size >= MAX_PACKET_LENGTH ) - psize = MAX_PACKET_LENGTH; - else { - psize = size; - next = 0; - } - header = psize | (((*packet_counter)++) << 24); - if( !myp_send_no_gc(m,&header,4) || !myp_send_no_gc(m,buf,psize) ) { - p->error = 1; - return 0; - } - buf += psize; - size -= psize; - } - return 1; -} - -void myp_begin_packet( MYSQL_PACKET *p, int minsize ) { - if( p->mem < minsize ) { - free(p->buf); - p->buf = (char*)malloc(minsize + 1); - p->mem = minsize; - } - p->error = 0; - p->size = 0; -} - -void myp_write( MYSQL_PACKET *p, const void *data, int size ) { - if( p->size + size > p->mem ) { - char *buf2; - if( p->mem == 0 ) p->mem = 32; - do { - p->mem <<= 1; - } while( p->size + size > p->mem ); - buf2 = (char*)malloc(p->mem + 1); - memcpy(buf2,p->buf,p->size); - free(p->buf); - p->buf = buf2; - } - memcpy( p->buf + p->size , data, size ); - p->size += size; -} - -void myp_write_byte( MYSQL_PACKET *p, int i ) { - unsigned char c = (unsigned char)i; - myp_write(p,&c,1); -} - -void myp_write_ui16( MYSQL_PACKET *p, int i ) { - unsigned short c = (unsigned char)i; - myp_write(p,&c,2); -} - -void myp_write_int( MYSQL_PACKET *p, int i ) { - myp_write(p,&i,4); -} - -void myp_write_string( MYSQL_PACKET *p, const char *str ) { - myp_write(p,str,strlen(str) + 1); -} - -void myp_write_bin( MYSQL_PACKET *p, int size ) { - if( size <= 250 ) { - unsigned char l = (unsigned char)size; - myp_write(p,&l,1); - } else if( size < 0x10000 ) { - unsigned char c = 252; - unsigned short l = (unsigned short)size; - myp_write(p,&c,1); - myp_write(p,&l,2); - } else if( size < 0x1000000 ) { - unsigned char c = 253; - unsigned int l = (unsigned short)size; - myp_write(p,&c,1); - myp_write(p,&l,3); - } else { - unsigned char c = 254; - myp_write(p,&c,1); - myp_write(p,&size,4); - } -} - -void myp_crypt( unsigned char *out, const unsigned char *s1, const unsigned char *s2, unsigned int len ) { - unsigned int i; - for(i=0;imax_value = 0x3FFFFFFFL; - r->max_value_dbl = (double)r->max_value; - r->seed1 = seed1 % r->max_value ; - r->seed2 = seed2 % r->max_value; -} - -static double myp_rnd( rand_ctx *r ) { - r->seed1 = (r->seed1 * 3 + r->seed2) % r->max_value; - r->seed2 = (r->seed1 + r->seed2 + 33) % r->max_value; - return (((double) r->seed1)/r->max_value_dbl); -} - -static void hash_password( unsigned long *result, const char *password, int password_len ) { - register unsigned long nr = 1345345333L, add = 7, nr2 = 0x12345671L; - unsigned long tmp; - const char *password_end = password + password_len; - for(; password < password_end; password++) { - if( *password == ' ' || *password == '\t' ) - continue; - tmp = (unsigned long)(unsigned char)*password; - nr ^= (((nr & 63)+add)*tmp)+(nr << 8); - nr2 += (nr2 << 8) ^ nr; - add += tmp; - } - result[0] = nr & (((unsigned long) 1L << 31) -1L); - result[1] = nr2 & (((unsigned long) 1L << 31) -1L); -} - -void myp_encrypt_pass_323( const char *password, const char seed[SEED_LENGTH_323], char to[SEED_LENGTH_323] ) { - rand_ctx r; - unsigned long hash_pass[2], hash_seed[2]; - char extra, *to_start = to; - const char *seed_end = seed + SEED_LENGTH_323; - hash_password(hash_pass,password,(unsigned int)strlen(password)); - hash_password(hash_seed,seed,SEED_LENGTH_323); - random_init(&r,hash_pass[0] ^ hash_seed[0],hash_pass[1] ^ hash_seed[1]); - while( seed < seed_end ) { - *to++ = (char)(floor(myp_rnd(&r)*31)+64); - seed++; - } - extra= (char)(floor(myp_rnd(&r)*31)); - while( to_start != to ) - *(to_start++) ^= extra; -} - -// defined in mysql/strings/ctype-*.c -const char *myp_charset_name( int charset ) { - switch( charset ) { - case 8: - case 31: - case 47: - return "latin1"; - case 63: - return "binary"; - // 101+ : utf16 - // 160+ : utf32 - case 33: - case 83: - case 223: - case 254: - return "utf8"; - case 45: - case 46: - return "utf8mb4"; // superset of utf8 with up to 4 bytes per-char - default: - if( charset >= 192 && charset <= 211 ) - return "utf8"; - if( charset >= 224 && charset <= 243 ) - return "utf8mb4"; - } - return NULL; -} - -int myp_supported_charset( int charset ) { - return myp_charset_name(charset) != NULL; -} - -int myp_escape_string( int charset, char *sout, const char *sin, int length ) { - // this is safe for UTF8 as well since mysql protects against invalid UTF8 char injection - const char *send = sin + length; - char *sbegin = sout; - while( sin != send ) { - char c = *sin++; - switch( c ) { - case 0: - *sout++ = '\\'; - *sout++ = '0'; - break; - case '\n': - *sout++ = '\\'; - *sout++ = 'n'; - break; - case '\r': - *sout++ = '\\'; - *sout++ = 'r'; - break; - case '\\': - *sout++ = '\\'; - *sout++ = '\\'; - break; - case '\'': - *sout++ = '\\'; - *sout++ = '\''; - break; - case '"': - *sout++ = '\\'; - *sout++ = '"'; - break; - case '\032': - *sout++ = '\\'; - *sout++ = 'Z'; - break; - default: - *sout++ = c; - } - } - *sout = 0; - return sout - sbegin; -} - -int myp_escape_quotes( int charset, char *sout, const char *sin, int length ) { - const char *send = sin + length; - char *sbegin = sout; - while( sin != send ) { - char c = *sin++; - *sout++ = c; - if( c == '\'' ) - *sout++ = c; - } - *sout = 0; - return sout - sbegin; -} - -/* ************************************************************************ */ diff --git a/project/libs/mysql/my_proto/my_proto.h b/project/libs/mysql/my_proto/my_proto.h deleted file mode 100644 index 6f4b9a815..000000000 --- a/project/libs/mysql/my_proto/my_proto.h +++ /dev/null @@ -1,183 +0,0 @@ -/* ************************************************************************ */ -/* */ -/* MYSQL 5.0 Protocol Implementation */ -/* Copyright (c)2008 Nicolas Cannasse */ -/* */ -/* This program is free software; you can redistribute it and/or modify */ -/* it under the terms of the GNU General Public License as published by */ -/* the Free Software Foundation; either version 2 of the License, or */ -/* (at your option) any later version. */ -/* */ -/* This program is distributed in the hope that it will be useful, */ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ -/* GNU General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU General Public License */ -/* along with this program; if not, write to the Free Software */ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* */ -/* ************************************************************************ */ -#ifndef MY_PROTO_H -#define MY_PROTO_H - -#include "mysql.h" -#include "../../common/socket.h" -#include "../../common/sha1.h" - -typedef enum { - FL_LONG_PASSWORD = 1, - FL_FOUND_ROWS = 2, - FL_LONG_FLAG = 4, - FL_CONNECT_WITH_DB = 8, - FL_NO_SCHEMA = 16, - FL_COMPRESS = 32, - FL_ODBC = 64, - FL_LOCAL_FILES = 128, - FL_IGNORE_SPACE = 256, - FL_PROTOCOL_41 = 512, - FL_INTERACTIVE = 1024, - FL_SSL = 2048, - FL_IGNORE_SIGPIPE = 4096, - FL_TRANSACTIONS = 8192, - FL_RESERVED = 16384, - FL_SECURE_CONNECTION = 32768, - FL_MULTI_STATEMENTS = 65536, - FL_MULTI_RESULTS = 131072, -} MYSQL_FLAG; - -typedef enum { - COM_SLEEP = 0x00, - COM_QUIT = 0x01, - COM_INIT_DB = 0x02, - COM_QUERY = 0x03, - COM_FIELD_LIST = 0x04, - //COM_CREATE_DB = 0x05, - //COM_DROP_DB = 0x06 - COM_REFRESH = 0x07, - COM_SHUTDOWN = 0x08, - COM_STATISTICS = 0x09, - COM_PROCESS_INFO = 0x0A, - //COM_CONNECT = 0x0B, - COM_PROCESS_KILL = 0x0C, - COM_DEBUG = 0x0D, - COM_PING = 0x0E, - //COM_TIME = 0x0F, - //COM_DELAYED_INSERT = 0x10, - COM_CHANGE_USER = 0x11, - COM_BINLOG_DUMP = 0x12, - COM_TABLE_DUMP = 0x13, - COM_CONNECT_OUT = 0x14, - COM_REGISTER_SLAVE = 0x15, - COM_STMT_PREPARE = 0x16, - COM_STMT_EXECUTE = 0x17, - COM_STMT_SEND_LONG_DATA = 0x18, - COM_STMT_CLOSE = 0x19, - COM_STMT_RESET = 0x1A, - COM_SET_OPTION = 0x1B, - COM_STMT_FETCH = 0x1C, -} MYSQL_COMMAND; - -typedef enum { - SERVER_STATUS_IN_TRANS = 1, - SERVER_STATUS_AUTOCOMMIT = 2, - SERVER_MORE_RESULTS_EXISTS = 8, - SERVER_QUERY_NO_GOOD_INDEX_USED = 16, - SERVER_QUERY_NO_INDEX_USED = 32, - SERVER_STATUS_CURSOR_EXISTS = 64, - SERVER_STATUS_LAST_ROW_SENT = 128, - SERVER_STATUS_DB_DROPPED = 256, - SERVER_STATUS_NO_BACKSLASH_ESCAPES = 512, -} MYSQL_SERVER_STATUS; - -typedef struct { - unsigned char proto_version; - char *server_version; - unsigned int thread_id; - unsigned int server_flags; - unsigned char server_charset; - unsigned short server_status; -} MYSQL_INFOS; - -typedef struct { - int id; - int error; - int size; - int pos; - int mem; - char *buf; -} MYSQL_PACKET; - -#define MAX_ERR_SIZE 1024 -#define IS_QUERY -123456 - -struct _MYSQL { - PSOCK s; - MYSQL_INFOS infos; - MYSQL_PACKET packet; - int is41; - int errcode; - int last_field_count; - int affected_rows; - int last_insert_id; - char last_error[MAX_ERR_SIZE]; -}; - -typedef struct { - char *raw; - unsigned long *lengths; - char **datas; -} MYSQL_ROW_DATA; - -struct _MYSQL_RES { - int nfields; - MYSQL_FIELD *fields; - MYSQL_ROW_DATA *rows; - MYSQL_ROW_DATA *current; - int row_count; - int memory_rows; -}; - - -// network -int myp_recv_no_gc( MYSQL *m, void *buf, int size ); -int myp_send_no_gc( MYSQL *m, void *buf, int size ); -int myp_recv( MYSQL *m, void *buf, int size ); -int myp_send( MYSQL *m, void *buf, int size ); -int myp_read_packet( MYSQL *m, MYSQL_PACKET *p ); -int myp_send_packet( MYSQL *m, MYSQL_PACKET *p, int *packet_counter ); - -// packet read -int myp_read( MYSQL_PACKET *p, void *buf, int size ); -unsigned char myp_read_byte( MYSQL_PACKET *p ); -unsigned short myp_read_ui16( MYSQL_PACKET *p ); -int myp_read_int( MYSQL_PACKET *p ); -const char *myp_read_string( MYSQL_PACKET *p ); -int myp_read_bin( MYSQL_PACKET *p ); -char *myp_read_bin_str( MYSQL_PACKET *p ); - -// packet write -void myp_begin_packet( MYSQL_PACKET *p, int minsize ); -void myp_write( MYSQL_PACKET *p, const void *data, int size ); -void myp_write_byte( MYSQL_PACKET *p, int b ); -void myp_write_ui16( MYSQL_PACKET *p, int b ); -void myp_write_int( MYSQL_PACKET *p, int b ); - -void myp_write_string( MYSQL_PACKET *p, const char *str ); -void myp_write_bin( MYSQL_PACKET *p, int size ); - -// passwords -#define SEED_LENGTH_323 8 - -void myp_crypt( unsigned char *out, const unsigned char *s1, const unsigned char *s2, unsigned int len ); -void myp_encrypt_password( const char *pass, const char *seed, SHA1_DIGEST out ); -void myp_encrypt_pass_323( const char *pass, const char seed[SEED_LENGTH_323], char out[SEED_LENGTH_323] ); - -// escaping -int myp_supported_charset( int charset ); -const char *myp_charset_name( int charset ); -int myp_escape_string( int charset, char *sout, const char *sin, int length ); -int myp_escape_quotes( int charset, char *sout, const char *sin, int length ); - -#endif -/* ************************************************************************ */ diff --git a/project/libs/mysql/my_proto/mysql.h b/project/libs/mysql/my_proto/mysql.h deleted file mode 100644 index 78a4a6daa..000000000 --- a/project/libs/mysql/my_proto/mysql.h +++ /dev/null @@ -1,129 +0,0 @@ -/* ************************************************************************ */ -/* */ -/* MYSQL 5.0 Protocol Implementation */ -/* Copyright (c)2008 Nicolas Cannasse */ -/* */ -/* This program is free software; you can redistribute it and/or modify */ -/* it under the terms of the GNU General Public License as published by */ -/* the Free Software Foundation; either version 2 of the License, or */ -/* (at your option) any later version. */ -/* */ -/* This program is distributed in the hope that it will be useful, */ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ -/* GNU General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU General Public License */ -/* along with this program; if not, write to the Free Software */ -/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* */ -/* ************************************************************************ */ -#ifndef MYSQL_H -#define MYSQL_H - -struct _MYSQL; -struct _MYSQL_RES; -typedef struct _MYSQL MYSQL; -typedef struct _MYSQL_RES MYSQL_RES; -typedef char **MYSQL_ROW; - -typedef enum enum_field_types { - FIELD_TYPE_DECIMAL = 0x00, - FIELD_TYPE_TINY = 0x01, - FIELD_TYPE_SHORT = 0x02, - FIELD_TYPE_LONG = 0x03, - FIELD_TYPE_FLOAT = 0x04, - FIELD_TYPE_DOUBLE = 0x05, - FIELD_TYPE_NULL = 0x06, - FIELD_TYPE_TIMESTAMP = 0x07, - FIELD_TYPE_LONGLONG = 0x08, - FIELD_TYPE_INT24 = 0x09, - FIELD_TYPE_DATE = 0x0A, - FIELD_TYPE_TIME = 0x0B, - FIELD_TYPE_DATETIME = 0x0C, - FIELD_TYPE_YEAR = 0x0D, - FIELD_TYPE_NEWDATE = 0x0E, - FIELD_TYPE_VARCHAR = 0x0F, - FIELD_TYPE_BIT = 0x10, - FIELD_TYPE_NEWDECIMAL = 0xF6, - FIELD_TYPE_ENUM = 0xF7, - FIELD_TYPE_SET = 0xF8, - FIELD_TYPE_TINY_BLOB = 0xF9, - FIELD_TYPE_MEDIUM_BLOB = 0xFA, - FIELD_TYPE_LONG_BLOB = 0xFB, - FIELD_TYPE_BLOB = 0xFC, - FIELD_TYPE_VAR_STRING = 0xFD, - FIELD_TYPE_STRING = 0xFE, - FIELD_TYPE_GEOMETRY = 0xFF -} FIELD_TYPE; - -typedef enum { - NOT_NULL_FLAG = 1, - PRI_KEY_FLAG = 2, - UNIQUE_KEY_FLAG = 4, - MULTIPLE_KEY_FLAG = 8, - BLOB_FLAG = 16, - UNSIGNED_FLAG = 32, - ZEROFILL_FLAG = 64, - BINARY_FLAG = 128, - ENUM_FLAG = 256, - AUTO_INCREMENT_FLAG = 512, - TIMESTAMP_FLAG = 1024, - SET_FLAG = 2048, - NUM_FLAG = 32768, -} __FIELD_FLAG; - -typedef struct { - char *catalog; - char *db; - char *table; - char *org_table; - char *name; - char *org_name; - int charset; - int length; - int flags; - int decimals; - FIELD_TYPE type; -} MYSQL_FIELD; - -#define mysql_init mp_init -#define mysql_real_connect mp_real_connect -#define mysql_select_db mp_select_db -#define mysql_real_query mp_real_query -#define mysql_store_result mp_store_result -#define mysql_field_count mp_field_count -#define mysql_affected_rows mp_affected_rows -#define mysql_escape_string mp_escape_string -#define mysql_real_escape_string mp_real_escape_string -#define mysql_close mp_close -#define mysql_error mp_error -#define mysql_num_rows mp_num_rows -#define mysql_num_fields mp_num_fields -#define mysql_fetch_fields mp_fetch_fields -#define mysql_fetch_lengths mp_fetch_lengths -#define mysql_fetch_row mp_fetch_row -#define mysql_free_result mp_free_result - -MYSQL *mysql_init( void * ); -MYSQL *mysql_real_connect( MYSQL *m, const char *host, const char *user, const char *pass, void *unused, int port, const char *socket, int options ); -int mysql_select_db( MYSQL *m, const char *dbname ); -int mysql_real_query( MYSQL *m, const char *query, int qlength ); -MYSQL_RES *mysql_store_result( MYSQL *m ); -int mysql_field_count( MYSQL *m ); -int mysql_affected_rows( MYSQL *m ); -int mysql_escape_string( MYSQL *m, char *sout, const char *sin, int length ); -int mysql_real_escape_string( MYSQL *m, char *sout, const char *sin, int length ); -void mysql_close( MYSQL *m ); -const char *mysql_error( MYSQL *m ); -const char *mysql_character_set_name( MYSQL *m ); - -unsigned int mysql_num_rows( MYSQL_RES *r ); -int mysql_num_fields( MYSQL_RES *r ); -MYSQL_FIELD *mysql_fetch_fields( MYSQL_RES *r ); -unsigned long *mysql_fetch_lengths( MYSQL_RES *r ); -MYSQL_ROW mysql_fetch_row( MYSQL_RES * r ); -void mysql_free_result( MYSQL_RES *r ); - -#endif -/* ************************************************************************ */ diff --git a/project/libs/mysql/mysql.cpp b/project/libs/mysql/mysql.cpp deleted file mode 100644 index 37c27dfba..000000000 --- a/project/libs/mysql/mysql.cpp +++ /dev/null @@ -1,562 +0,0 @@ -/* - * Copyright (C)2005-2012 Haxe Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifndef STATIC_LINK -#define IMPLEMENT_API -#endif - -#include -#include -#include - - -#include -#include -#include "my_proto/mysql.h" -#include - -#ifdef HX_ANDROID -#define atof(x) strtod((x),0) -#endif - -/** - -

MySQL

-

- API to connect and use MySQL database -

-
-**/ - -#define CNX(o) ((connection*)val_data(o)) -#define RESULT(o) ((result*)val_data(o)) - -namespace -{ - -typedef struct { - MYSQL *m; - value conv_date; - value conv_bytes; - value conv_string; -} connection; - -DEFINE_KIND(k_mysql_connection); -DEFINE_KIND(k_mysql_result); - -static void error( MYSQL *m, const char *msg ) { - buffer b = alloc_buffer(msg); - buffer_append(b," "); - buffer_append(b,mysql_error(m)); - bfailure(b); -} - -// --------------------------------------------------------------- -// Result - -/** -

Result

-**/ - -#undef CONV_FLOAT -typedef enum { - CONV_INT, - CONV_STRING, - CONV_FLOAT, - CONV_BINARY, - CONV_DATE, - CONV_DATETIME, - CONV_BOOL -} CONV; - -typedef struct { - MYSQL_RES *r; - int nfields; - CONV *fields_convs; - field *fields_ids; - MYSQL_ROW current; - value conv_date; - value conv_string; - value conv_bytes; -} result; - -static void free_result( value o ) { - result *r = RESULT(o); - mysql_free_result(r->r); -} - -/** - result_set_conv_date : 'result -> function:1 -> void - Set the function that will convert a Date or DateTime string - to the corresponding value. -**/ -static value result_set_conv_date( value o, value c ) { - val_check_function(c,1); - if( val_is_int(o) ) - return val_true; - val_check_kind(o,k_mysql_result); - RESULT(o)->conv_date = c; - return val_true; -} - -/** - result_get_length : 'result -> int - Return the number of rows returned or affected -**/ -static value result_get_length( value o ) { - if( val_is_int(o) ) - return o; - val_check_kind(o,k_mysql_result); - return alloc_int( (int)mysql_num_rows(RESULT(o)->r) ); -} - -/** - result_get_nfields : 'result -> int - Return the number of fields in a result row -**/ -static value result_get_nfields( value o ) { - val_check_kind(o,k_mysql_result); - return alloc_int(RESULT(o)->nfields); -} - -/** - result_get_fields_names : 'result -> string array - Return the fields names corresponding results columns -**/ -static value result_get_fields_names( value o ) { - result *r; - value a; - int k; - MYSQL_FIELD *fields; - val_check_kind(o,k_mysql_result); - r = RESULT(o); - fields = mysql_fetch_fields(r->r); - a = alloc_array(r->nfields); - for(k=0;knfields;k++) - { - val_array_set_i(a,k,alloc_string(fields[k].name)); - } - return a; -} - -/** - result_next : 'result -> object? - - Return the next row if available. A row is represented - as an object, which fields have been converted to the - corresponding Neko value (int, float or string). For - Date and DateTime you can specify your own conversion - function using [result_set_conv_date]. By default they're - returned as plain strings. Additionally, the TINYINT(1) will - be converted to either true or false if equal to 0. - -**/ -static value result_next( value o ) { - result *r; - unsigned long *lengths = NULL; - MYSQL_ROW row; - val_check_kind(o,k_mysql_result); - r = RESULT(o); - row = mysql_fetch_row(r->r); - if( row == NULL ) - return val_null; - { - int i; - value cur = alloc_empty_object(); - r->current = row; - for(i=0;infields;i++) - if( row[i] != NULL ) { - value v; - switch( r->fields_convs[i] ) { - case CONV_INT: - v = alloc_best_int(atoi(row[i])); - break; - case CONV_STRING: - v = alloc_string(row[i]); - if( r->conv_string != NULL ) - v = val_call1(r->conv_string,v); - break; - case CONV_BOOL: - v = alloc_bool( *row[i] != '0' ); - break; - case CONV_FLOAT: - v = alloc_float(atof(row[i])); - break; - case CONV_BINARY: - if( lengths == NULL ) { - lengths = mysql_fetch_lengths(r->r); - if( lengths == NULL ) - val_throw(alloc_string("mysql_fetch_lengths")); - } - v = copy_string(row[i],lengths[i]); - if( r->conv_bytes != NULL ) - v = val_call1(r->conv_bytes,v); - break; - case CONV_DATE: - if( r->conv_date == NULL ) - v = alloc_string(row[i]); - else { - struct tm t; - sscanf(row[i],"%4d-%2d-%2d",&t.tm_year,&t.tm_mon,&t.tm_mday); - t.tm_hour = 0; - t.tm_min = 0; - t.tm_sec = 0; - t.tm_isdst = -1; - t.tm_year -= 1900; - t.tm_mon--; - v = val_call1(r->conv_date,alloc_int32((int)mktime(&t))); - } - break; - case CONV_DATETIME: - if( r->conv_date == NULL ) - v = alloc_string(row[i]); - else { - struct tm t; - sscanf(row[i],"%4d-%2d-%2d %2d:%2d:%2d",&t.tm_year,&t.tm_mon,&t.tm_mday,&t.tm_hour,&t.tm_min,&t.tm_sec); - t.tm_isdst = -1; - t.tm_year -= 1900; - t.tm_mon--; - v = val_call1(r->conv_date,alloc_int32((int)mktime(&t))); - } - break; - default: - v = val_null; - break; - } - alloc_field(cur,r->fields_ids[i],v); - } - return cur; - } -} - -/** - result_get : 'result -> n:int -> string - Return the [n]th field of the current row -**/ -static value result_get( value o, value n ) { - result *r; - const char *s; - val_check_kind(o,k_mysql_result); - val_check(n,int); - r = RESULT(o); - if( val_int(n) < 0 || val_int(n) >= r->nfields ) - neko_error(); - if( !r->current ) { - result_next(o); - if( !r->current ) - neko_error(); - } - s = r->current[val_int(n)]; - return alloc_string( s?s:"" ); -} - -/** - result_get_int : 'result -> n:int -> int - Return the [n]th field of the current row as an integer (or 0) -**/ -static value result_get_int( value o, value n ) { - result *r; - const char *s; - val_check_kind(o,k_mysql_result); - val_check(n,int); - r = RESULT(o); - if( val_int(n) < 0 || val_int(n) >= r->nfields ) - neko_error(); - if( !r->current ) { - result_next(o); - if( !r->current ) - neko_error(); - } - s = r->current[val_int(n)]; - return alloc_int( s?atoi(s):0 ); -} - -/** - result_get_float : 'result -> n:int -> float - Return the [n]th field of the current row as a float (or 0) -**/ -static value result_get_float( value o, value n ) { - result *r; - const char *s; - val_check_kind(o,k_mysql_result); - val_check(n,int); - r = RESULT(o); - if( val_int(n) < 0 || val_int(n) >= r->nfields ) - neko_error(); - if( !r->current ) { - result_next(o); - if( !r->current ) - neko_error(); - } - s = r->current[val_int(n)]; - return alloc_float( s?atof(s):0 ); -} - -static CONV convert_type( enum enum_field_types t, int flags, unsigned int length ) { - // FIELD_TYPE_TIME - // FIELD_TYPE_YEAR - // FIELD_TYPE_NEWDATE - // FIELD_TYPE_NEWDATE + 2: // 5.0 MYSQL_TYPE_BIT - switch( t ) { - case FIELD_TYPE_TINY: - if( length == 1 ) - return CONV_BOOL; - case FIELD_TYPE_SHORT: - case FIELD_TYPE_LONG: - case FIELD_TYPE_INT24: - return CONV_INT; - case FIELD_TYPE_LONGLONG: - case FIELD_TYPE_DECIMAL: - case FIELD_TYPE_FLOAT: - case FIELD_TYPE_DOUBLE: - case 246: // 5.0 MYSQL_NEW_DECIMAL - return CONV_FLOAT; - case FIELD_TYPE_BLOB: - case FIELD_TYPE_TINY_BLOB: - case FIELD_TYPE_MEDIUM_BLOB: - case FIELD_TYPE_LONG_BLOB: - if( (flags & BINARY_FLAG) != 0 ) - return CONV_BINARY; - return CONV_STRING; - case FIELD_TYPE_DATETIME: - case FIELD_TYPE_TIMESTAMP: - return CONV_DATETIME; - case FIELD_TYPE_DATE: - return CONV_DATE; - case FIELD_TYPE_NULL: - case FIELD_TYPE_ENUM: - case FIELD_TYPE_SET: - //case FIELD_TYPE_VAR_STRING: - //case FIELD_TYPE_GEOMETRY: - // 5.0 MYSQL_TYPE_VARCHAR - default: - if( (flags & BINARY_FLAG) != 0 ) - return CONV_BINARY; - return CONV_STRING; - } -} - -static value alloc_result( connection *c, MYSQL_RES *r ) { - value o = create_abstract(k_mysql_result,sizeof(result),free_result); - result *res = RESULT(o); - int num_fields = mysql_num_fields(r); - int i,j; - MYSQL_FIELD *fields = mysql_fetch_fields(r); - res->r = r; - res->conv_date = c->conv_date; - res->conv_bytes = c->conv_bytes; - res->conv_string = c->conv_string; - res->current = NULL; - res->nfields = num_fields; - res->fields_ids = (field*)alloc_private(sizeof(field)*num_fields); - res->fields_convs = (CONV*)alloc_private(sizeof(CONV)*num_fields); - for(i=0;ifields_ids[j] == id ) { - buffer b = alloc_buffer("Error, same field ids for : "); - buffer_append(b,fields[i].name); - buffer_append(b,":"); - val_buffer(b,alloc_int(i)); - buffer_append(b," and "); - buffer_append(b,fields[j].name); - buffer_append(b,":"); - val_buffer(b,alloc_int(j)); - buffer_append(b,"."); - bfailure(b); - } - } - res->fields_ids[i] = id; - res->fields_convs[i] = convert_type(fields[i].type,fields[i].flags,fields[i].length); - } - return o; -} - -// --------------------------------------------------------------- -// Connection - -/**

Connection

**/ - -/** - close : 'connection -> void - Close the connection. Any subsequent operation will fail on it -**/ -static value close( value o ) { - val_check_kind(o,k_mysql_connection); - mysql_close(CNX(o)->m); - free_abstract(o); - return val_true; -} - -/** - select_db : 'connection -> string -> void - Select the database -**/ -static value select_db( value o, value db ) { - val_check_kind(o,k_mysql_connection); - val_check(db,string); - if( mysql_select_db(CNX(o)->m,val_string(db)) != 0 ) - error(CNX(o)->m,"Failed to select database :"); - return val_true; -} - -/** - request : 'connection -> string -> 'result - Execute an SQL request. Exception on error -**/ -static value request( value o, value r ) { - MYSQL_RES *res; - connection *c; - val_check_kind(o,k_mysql_connection); - val_check(r,string); - c = CNX(o); - if( mysql_real_query(c->m,val_string(r),val_strlen(r)) != 0 ) - error(c->m,val_string(r)); - res = mysql_store_result(c->m); - if( res == NULL ) { - if( mysql_field_count(c->m) == 0 ) - return alloc_int( (int)mysql_affected_rows(c->m) ); - else - error(c->m,val_string(r)); - } - return alloc_result(c,res); -} - -/** - escape : 'connection -> string -> string - Escape the string for inserting into a SQL request -**/ -struct AutoBuf -{ - AutoBuf(int inLen) { buffer = new char[inLen]; } - ~AutoBuf() { delete [] buffer; } - char *buffer; -}; - -static value escape( value o, value s ) { - int len; - val_check_kind(o,k_mysql_connection); - val_check(s,string); - len = val_strlen(s) * 2 + 1; - AutoBuf sout(len); - len = mysql_real_escape_string(CNX(o)->m,sout.buffer,val_string(s),val_strlen(s)); - if( len < 0 ) { - buffer b = alloc_buffer("Unsupported charset : "); - buffer_append(b,mysql_character_set_name(CNX(o)->m)); - bfailure(b); - } - return alloc_string_len(sout.buffer,len); -} - -/** - set_conv_funs : 'connection -> function:1 -> function:1 -> function:1 -> void - Set three wrapper methods to be be called when creating a string, a date, and binary data in results -**/ -static value set_conv_funs( value o, value fstring, value fdate, value fbytes ) { - val_check_kind(o,k_mysql_connection); - val_check_function(fstring,1); - val_check_function(fdate,1); - val_check_function(fbytes,1); - CNX(o)->conv_string = fstring; - CNX(o)->conv_date = fdate; - CNX(o)->conv_bytes = fbytes; - return val_null; -} - -// --------------------------------------------------------------- -// Sql - - -static void free_connection( value o ) { - mysql_close(CNX(o)->m); -} - -/** - connect : { host => string, port => int, user => string, pass => string, socket => string? } -> 'connection - Connect to a database using the connection informations -**/ -static value mysql_connect( value params ) { - value host, port, user, pass, socket; - val_check(params,object); - host = val_field(params,val_id("host")); - port = val_field(params,val_id("port")); - user = val_field(params,val_id("user")); - pass = val_field(params,val_id("pass")); - socket = val_field(params,val_id("socket")); - val_check(host,string); - val_check(port,int); - val_check(user,string); - val_check(pass,string); - if( !val_is_string(socket) && !val_is_null(socket) ) - neko_error(); - { - MYSQL *cnx = mysql_init(NULL); - if( mysql_real_connect(cnx,val_string(host),val_string(user),val_string(pass),NULL,val_int(port),val_is_null(socket)?NULL:val_string(socket),0) == NULL ) { - buffer b = alloc_buffer("Failed to connect to mysql server : "); - buffer_append(b,mysql_error(cnx)); - mysql_close(cnx); - bfailure(b); - } - - value v = create_abstract(k_mysql_connection,sizeof(connection),free_connection); - connection *c = CNX(v); - c->m = cnx; - return v; - } -} - -// --------------------------------------------------------------- -// Registers - -DEFINE_PRIM(mysql_connect,1); -DEFINE_LIB_PRIM("mysql5",close,1); -DEFINE_LIB_PRIM("mysql5",request,2); -DEFINE_LIB_PRIM("mysql5",select_db,2); -DEFINE_LIB_PRIM("mysql5",escape,2); - -DEFINE_LIB_PRIM("mysql5",result_get_length,1); -DEFINE_LIB_PRIM("mysql5",result_get_nfields,1); -DEFINE_LIB_PRIM("mysql5",result_get_fields_names,1); -DEFINE_LIB_PRIM("mysql5",result_next,1); -DEFINE_LIB_PRIM("mysql5",result_get,2); -DEFINE_LIB_PRIM("mysql5",result_get_int,2); -DEFINE_LIB_PRIM("mysql5",result_get_float,2); -DEFINE_LIB_PRIM("mysql5",result_set_conv_date,2); - -DEFINE_LIB_PRIM("mysql5",set_conv_funs,4); - -/* ************************************************************************ */ - -} - - -extern "C" int mysql_register_prims() -{ - return 0; -} - - - diff --git a/project/libs/nekoapi/NekoAPI.cpp b/project/libs/nekoapi/NekoAPI.cpp deleted file mode 100644 index 382ff6e5c..000000000 --- a/project/libs/nekoapi/NekoAPI.cpp +++ /dev/null @@ -1,651 +0,0 @@ -// Get headers etc. -// - -//#define HAVE_NEKO_TYPES - -typedef struct _vkind *vkind; -typedef struct _value *value; -typedef struct _buffer *buffer; - - -#define IGNORE_CFFI_API_H -#include -#include "string.h" - - -extern "C" { - -// Proto-type the functions -#define DEFFUNC(name,r,b,c) r api_##name b; -#include -#undef DEFFUNC - - - -EXPORT -void * hx_cffi(const char *inName) -{ - #define DEFFUNC(name,r,b,c) if ( !strcmp(inName,#name) ) return (void *)api_##name; - - #include - return 0; -} - -} - - -#ifndef neko_v1 -#include "neko2.h" -#else -#include "neko.h" -#endif - -static int __a_id = val_id("__a"); -static int __s_id = val_id("__s"); -static int b_id = val_id("b"); -static int length_id = val_id("length"); - -value *gNeko2HaxeString = 0; -value *gNekoNewArray = 0; - -value haxe_alloc_string(const char *inString) -{ - value neko_string = alloc_string(inString); - if (gNeko2HaxeString) - return val_call1(*gNeko2HaxeString,neko_string); - return neko_string; -} - -void api_hx_error() -{ - failure("error"); -} - - -void api_val_throw(value arg1) -{ - val_throw(arg1); -} - - -void api_hx_fail(const char * arg1,const char * arg2,int arg3) -{ - _neko_failure( haxe_alloc_string(arg1), arg2, arg3 ); -} -#define NEKO_NOT_IMPLEMENTED(func) api_hx_fail("NOT Implemented:" func,__FILE__,__LINE__) - - -// Determine value type -int api_val_type(value arg1) -{ - int t=val_type(arg1); - if (t==VAL_OBJECT) - { - value __a = val_field(arg1,__a_id); - if (val_is_array(__a)) - return valtArray; - value __s = val_field(arg1,__s_id); - if (val_is_string(__s)) - return valtString; - } - if (t<7) - return (ValueType)t; - if (t==VAL_ABSTRACT) - return valtAbstractBase; - - if (t==VAL_PRIMITIVE || t==VAL_JITFUN) - return valtFunction; - if (t==VAL_32_BITS || t==VAL_INT) - return valtInt; - return valtNull; -} - - -vkind api_val_kind(value arg1) -{ - return (vkind)val_kind(arg1); -} - - -void * api_val_to_kind(value arg1,vkind arg2) -{ - vkind k = (vkind)val_kind(arg1); - if (k!=arg2) - return 0; - return val_data(arg1); -} - - -// don't check the 'kind' ... -void * api_val_data(value arg1) -{ - return val_data(arg1); -} - - -int api_val_fun_nargs(value arg1) -{ - return val_fun_nargs(arg1); -} - - - - -// Extract value type -bool api_val_bool(value arg1) -{ - return val_bool(arg1); -} - - -int api_val_int(value arg1) -{ - return val_int32(arg1); -} - - -double api_val_float(value arg1) -{ - return val_float(arg1); -} - - -double api_val_number(value arg1) -{ - return val_number(arg1); -} - - -// Create value type - -value api_alloc_null() { return val_null; } -value api_alloc_bool(bool arg1) { return alloc_bool(arg1); } -value api_alloc_int(int arg1) -{ - // TODO int32 ? - return alloc_int(arg1); -} -value api_alloc_float(double arg1) { return alloc_float(arg1); } - -value api_alloc_empty_object() { return alloc_object(0); } - - -value api_alloc_abstract(vkind arg1,void * arg2) -{ - return alloc_abstract(arg1,arg2); -} - -void api_free_abstract(value inAbstract) -{ - val_gc(inAbstract,0); - val_kind(inAbstract) = 0; -} - -value api_create_abstract(vkind inKind,int inMemSize, finalizer inFree ) -{ - void *mem = alloc(inMemSize); - value result = alloc_abstract(inKind, mem ); - val_gc(result, inFree); - return result; -} - - -value api_alloc_best_int(int arg1) { return alloc_best_int(arg1); } -value api_alloc_int32(int arg1) { return alloc_int32(arg1); } - - - -// String access -int api_val_strlen(value arg1) -{ - if (val_is_string(arg1)) - return val_strlen(arg1); - value l = val_field(arg1,length_id); - if (val_is_int(l)) - return val_int(l); - return 0; -} - - -const wchar_t * api_val_wstring(value arg1) -{ - int len = api_val_strlen(arg1); - unsigned char *ptr = (unsigned char *)api_val_string(arg1); - wchar_t *result = (wchar_t *)alloc_private((len+1)*sizeof(wchar_t)); - for(int i=0;i?_xJg{Uf(~y$Jb`| znmw~-tu<@btXVUAJA3GeY`5F(vVWaiom_;f&ULxck*ce5aHz1-=Vuj@&u{O45*&HFeHhn?xVjMN;5P?(<+#qmW#F2D>or`Pa1Fv`|1QDJ3Akz`BTmv6 zktXAM4A(oj7UPuB4vJFh|Ib5&f8co3Qn}_?Z z4tTEPek$%?!Sy(cuEG7exMtyc57&jbe(N_v9y}oF z%}C3BqwoOaKZ>gluG4YF9rx98 zpXA7^llyf@$IE?hq+@a2DzKg0CO4ar9wGO~+7JIgdKAi>EaiqH?T>3FuD{^&;NtHs zow$xh`UtK(fukgKCItZQmyANB_sabkq(!)%7I=ZAH%ZFm16(N%c)r{}-%$}^|j)g=k`Dkds(C(@ddCz6wI%lyi9MpZ`c;3$vln5dHq@^h1=(ZOrkE9MSdB!NWYRWv)h7jK>vq&+zKZ3$D0$yt`}H%!GvH!#Y=; zL0V|9_#=&%O?3c;7XfxOkZGRlU zZGW^&)L(nd2BZMzL|YGS{o^C*&F#FAAIC6%vvHNCI{_OERhaNFt^6lft* z&NFx8x(C-HT+}J**xzv3KiUA=JzG~E#yxeFWBzem%Wyr3YdNl`a6OCbIb8g4eDcS! zzf#@lKda=Pc8$N)xL(7x2G{Gj-oVA*o4D5EswIFQ$1Qbo6Rv;bdKXtct_EEEajep| zy^o7}`Y|s4HV!FXe)N_Lu1g&FSbYAZe_sC2w5|oete=_h^*lVH2d;q^J^tD)r=Pwu z4){)@|wUop9mjeIL61)vLR`bX-64h?CFw@?XL4 zdjvNH0{1+)r`Egf)OAJAJ~VIiyHR)CT`{I$?t&ikCqCUbJLAlkKDp;V_n)=(iA6Vm zx4S&GJ~7^N>4Eh5UF)+C{E~FZfV0rv;<$LvSHX$v9=r43vturP<-TR7+`S_0le4aQ z=e-lhj(=(0o?pk84c`4?FaN0z4lqV%KQrv-#ne01~J#JkUr z_n2i<%HF*9!Fl&bzyHf~BNv^0;XPe;{dnnys8<)fno_}V)z z=`rx3tG8V4t@&)xghOxKHTvx5-@N+LjThcp|NhVYViTi(MVm|ZO0e;c=N*XeI3KA9iP zH(t0n`>JC*#d{`JJn+N`Gaeo=Xn5J=&#sL3H0A|kif5lib#L|C)mei}ko3aU+*QNJ z3%ol@{F=kvPY20t!=`2199pK}x8>}dSKZ!9jt)$;rsDZgLv z{Y&6qg}=W_`KN_HQ{Za_zFOd=ZTPQ7K7ZfiVtX?L-%RjD_-o;h_MI^4{?h$^oc}Bk+ZS{}h2I3O$o-SjzhZ-Xm~^z(yPS)(gIOguYyq<1Zj^ zPr*-nN`6iheAmkJ`vuknx^#2W%8H&PP7s@zUO%@_aV% z@Mp_+kjQT_@>qVM^rr{+?6XS2pCHdS3%DedsFA?}GfpY}zjg-Hia1lp;kss%N*6%O$mJ2)ujIBE%O8JaEUA3y8?gpBW~A9C=j1dio){?bxeTp*C-!{^1~Iq-CZW=J>+PAH{hy7w~8^ad^+XP zU#~R@{{nn_e{?JVm~bK5tN+2R){}%k0>3LV++uIKyEu-vftF3u-e2)NF3GL@1eUKS zKX+<>moW8yJd7`zQS?6mdG|jXfP%ZaE`z-1pwp6pm*uyT-oY+coqFEgH3H?ALRm%% zd>fu`b?|pGaTXxe;4qakKL~KF#z}+Rb6v1*_26pJ_usY0PW}T z`HASi73Dg1K=?7#-{rv9AMI?Lr`L6S{xSPI#_f6xcnBYh@^3rJKM47!ntH9u=Uq{M zheJL?z)#6BZsoV~`AFcY9_Vt>&m=q>{jp-d+x4};zd-&~m$+OzF}V3W7wykOcL3iC2Rs~b3E)h5eiX_l0k+4-jpXkqx9hMxzaQ;o&eJ|M+j|oAU47l+ z4|I2(2l|s7@_7pK-r}HlDf<^nuI)>A*9_E8#dsSf_>*I?wn2IR;#}Xiyny=6j{1A> zXp#f&kLMu={37tX&T+fqk&?dEz+a!@R`EE(&3K#%{lXAa&(A{tRygW^3H;+7a1Y>* zI~)CreAfR0@~Osnu>0pA;JAFZi`~HIXQTW+NBvJafj^AbA@Y0%3N}0Rt1~Me>sIj% zg&%Z>9M6veeN`BbIY(*y{{p_f7~hM9p0`lF$kARk=qZ6c@kx7)NVm<6^zSv0M^!&} zSl?EI-o1|cTn|xsZ24S?=i405m!sW!=;twle+l$?@9AzA=MB=Ij{b`|5ryz$|J8xN zkr>olqfPa@m|GH4#7W^5(KMD0$06)xvqVHV5ae$$o3O*Bb&w+m0?ca^| zcR1RA4&}F*E*DU$^7QLVV6T=5d^zM@0(-*sJ^5b`{oe+C1zH9F3Vb8cAJ+@~1fH)z ze=Km=I-vs)rySZIU1)d1}`yBjr2jW5peba%z-T|*i{S{E|Y^e{`bXBAO z&J}n%<#C70b(_ei4)t9Q{Wu@>UB^eM@z@hmN(a3o!}uY!yu2Hx7EjBY?$0mv=jFNb zCQq3*1(_4e@_CzIH08DeSKg&F@KOZ(t^C=$&>R+@^6p^Z<;b~Qr`5!{L%s!+MGDG#8EeI$~6DE=QuFr`-`Ve zndmGrxu`f_TGu=mOfB)>3aOP&nRY|Fnt2_Ppest1JSF+b`BRDlAV~oei%Y^7rxr|| zSaK^#Eh?DiBE!=HMMb(Cp&KT$(NgKna37cEO)JhTE}c|R>LfnDq@?K9RvD$G`K>ah z7EcNk7357uPx_}6Pji;-D6gb+%8Y!!kbT2MDvy6U2|^d;6&B=|=tpWyLFts@(!7#l zb*s3)F@HvQxaBK30>6z09W$v&6`NR8kYB3CkWepdtCC6+C`Ny~(d6Jyt5SqLR?TZI z9%{*yNv!aDcnxXpIBJHo05EgVWbpGZ$^J};GYYM{ukVEbm$lo<+^6v*{sopN*&yFJJiOX0593>Qzh5mrX` zDEadjmKNV)+ZPTW7tO*1TC&mtf1p&49Diw`Kn-#)E46`;bNc<3z zN{U>QDY$S;O4IYEPesy`6PaUUAVRF`i+9{Do7dyV#94+BTNsreON?JeYd1x_BBW(J*>AZvv(n z)VNu5rDr0jYW_6gQ;jgG8s@^$JBllZxD}ilkrA0bw>4-#oeC-fm=JA=PPHdPj1tWf zrXmz5o~pruGG*;-vx13gQeY~~9cNEhNx(l5GYmRvQgOiVnmoBEVCxtPmKIE!QW{ZT z-I5bGXT3maX#r$zH$A<8)2as5@Q;iSln#%MiTTqa03IkEb74f47EPH7D>nI-QfP%n zqlKx>-xWhIyD~55+L1%A%+?PvQxssHWVf?p3eg3a7F5R-6;Hb%+@)xvpsZkGz(zW$ zU~)c&yKQRFa>2A28l`BnV5V(=9#1Tk2}&~vJ+uvPtKv|!GR`e7P*GZn83Pvd)~T-P zN--xBk-{{&7*y-lhzOEa22Tl*_qH9IJh7-420#@0CZSfFJaJNrOZ<=+=B}_lb2#a7 zA{t?HqQ<7=wW2ytDS<*j3!Rrg@#X+}UZYewrRY|AT472e_GQZSya`io$U`qo$rql$ zCY%hLD@=*`lUy(!lt*43Qp_yWjmX3;vpLnH)!?NIBqn|8RE))`foV)iV7!!+(4A#@ zlM2vY@vUug1Jg*jg9U$S+akzOWm=t>e*!ghH#72FCgi=d<7V$7NdA=vsX60!X&`U#VYB3dSoCy+V%f2yw~ zQ_$E1wCC1lbW#C~Mj_Q(c}jMLj_TW-Vsf5T)OUJu-*a5Jy*{m*{F6_)-n$K&dZD_X6)u*5+cBjsao-&L@%jGljQ#ToiPcSb|!JS5}%BbfBb}l4eOdT+$Jej+At)q`8ugmvoY(g_0IYS|X`m z(lSZsNLnH3d`TBbS|#aXN$;0*siey!T`p-gVkqp-b&@h>PMEPvri>vm( z_Q^C8F%hO&k`9-2grp-S&5?Ahq`8ugmvoY(g_0IYS|X`m(lSYBN;*f<3Q6ZnxV9-k}j9@SxHw&x>C~BlCF`oTGDlrZj|(GN$VxuBI!qxZk2SKq&p-H zNxDnYy^`*ev{}+alDZIsqWnFQ#z-0~X`H0-k|s!+C~1QF3HymmPr}^6^kl^InVy2ZM5aEReP((p z#v#+wFb|Ae{vF2OcaGo)37JO z6uw6ZQv^%>Oc6INV~YKSnM@IcpTiXUF%?V^2cFLq`vD7>V&AWdDfW{VGew;Jex`^o zKgjeV#LAgwB7V$tFwS)`9fEm=>BWf6GDW|yWI7c6&lJJjtIe-R8@oIq^nhzzd2Qh? zx64|T+|trgx!K=2v=F%=hOR?zZ^B;gxJ|V!F9CA3JWgHYujO%czN?V8joVPI<#BYj ztB{Wy>lMt-Eo5e6wSv*9u0sB4T%lleqN^~8@KOcywlJA+m4eYpu0lxE)i_7Nd{hVt zxf)9p4CQteW)dE+U=}SLPI#n(A#7LSNWz&4X4S&6gi{p^p}Gpk6HZcaCgDQDaSDde zT!kfsT?!`Z!ZN~p4=$@ZMj^{{q7ByTHGKs|aJK8T>1FF<~ClXslN7{e-de z1^yNMAmJp!OBKA7Ft_y^s}#J9a4O+B3SLgQKj9JuKT9~1@OTBUAUvG#NCmGXJd$vx zf>#qBOE^`*YY2}goTT7t!i9w66ugdb31OFlDcZs^!g~*q|F;RxA-qk&6m{Wz!u1N? zLb!@>wSp=7!utuYQ1Dj5O9?Mk@HWEB30En22jLZj=O~z6Q@EONiGp_#t|mNQ!R)HS zjf6)kcpu?fdo;E$c(7niM>TXnfOd|nV zEt@TsT5*+|1C1LD)^r=|JmdaS8(ax1t?gC_cGp#2`_i`xzqQB%{e;;%%374d1~&V< z2My+-ftJm>ww36st>W)T8&Pl#tUb=*?uxatd~qzA$g z?7a_ZGT>&UsYnl*exJu20WPu+nV`J?<)l1*-1W7StI!_JS9$GEUz6Zg?Nz`2=i5u^ zpuLSFTD3>>RbE@!zP*vsUYyO}PLHwE9gMwK^VfrXp%;3PFYwnx^OY0kYkat!;0(Jz z!Cw`0p}h8}_U&z3qxp*q4%hP3?WIe5X>14Wr5!TS2IS|l1}phBUl!qKbSO=sU$ukc zOK^5qInn3%lF(&rz*Q6S7$LWrQ+|jV<-oUG;iD$aa8X~;Y+UFQsAqX?9?)J$OEBXI z6Fv9M0nu3k88#pasPyORYryfts_rR@q*$v6B+T^rEMpx;ua#Q4KhU-5bZbUT<$iyX z6>ZLhZUCDF4XvyWd~0QU%%M<^*m2kA{iW8{-vTP()h^2-4k~d^vp>|=gfY+stHd6R z4xOYLfAT9^|6|a5q0bI#{jXEbGZ1LS2fv~3(QtX~3{^hiGpO}vxxP5N-6v2Fd2w}= zf$Oues7E>ZPqX{i*p+DJ`r<>+C@iVK0%cFI{Jx~h{Xrucwftw5L*ZJyw`2vgW0Wj! zIfD#e3e@IWb8pQykFl|n8D-XQ$U4X4vVaZM6O46<><^Z#hM>*0OH|w)HiN!66pu%jDjJ)PP{bWEldCL)-WeK5Q29^4hh-)IyM#ObJ%Gl!C^fQi~w)p!6jl~IvTYx48P{Vj4 zc=soayOz%8hB_Rv!C)L2G!6@27L+T(SGt3*@AqT5fDZJTvpi;YtYvKE_;Z=rapvB( zy=Yauw&U}b7WYRj+aQKxAcpLirrMy9b)3Fk9W-_vt8bqR8h*Kb4D+ho-q(ts_|V_M za(Qi%<|jNJk~khtlkt!q^t?>@=rNH84W~x&!`0Pf=plN&1I2v>k zzUNmb;|)M$cWCoZ(0>Q+8Oxg9ut-Dqi*!)>XO_iiolq2Jdu;OjPzz07GKE!u#ycj{$P)U7w4!gjgTCc(9h>HB z`oiXDtv~gCW zest(6RsMs|boq7P+g_9Q|1kfl=d0xT2%J6CGYv_&9?!Ji6B?p_GxtJQE*gVdz#R*1x)EeHofKQd9;2W zG%9FwK-{Nb41O>hXS--_xw@w@3tf-Cwv0)UjE8J7V75(F2w&bx0eM2>-bURybjD2s z=SYD^8B{<%K%tqy5$ZyA7LidiDzx(@0_4q%g7(Z|d)e$2i;{Vjmdtc(n(8u@Ju~Z# zwK1LCq*U63Kl;<@zP}A;~pWZjt0ZF1gcH?k>rFT5|uQa+gZ(3z9ob4OYVD;`?1RPNbbjyTdQ)>fm$t8f1a&Pjv5?6 zjXMKYs9QTIauu{68B&3sLJOK*YpEH-5Pz|j%&iLz&Ll`UqGFTo$Mo}rQs zxZUMH<>xv!h3WeukH2@&_(I58My~;lJ&OaNP%qBSq1C%p9olH>rT=1USS)N_5FR9E z>)%VLLtERatQ!cQvW7%Jsmv$_Q8%ZvWRv;@tkvtr5Q1h680MvZ03QT%X3FF|<8Dt0$VQ9w#j-Q!~zT(Q%Eer_-v< zL?2MZh2~+wUtZf?Hy!VWr{kf!LsKQ2ln5 z$GSPD0So$BThcZ)#a1bQc(^;`ty$}Wo}LZO0|suGz2|lhT;*MsQKE2FHN9X@#F~H5 z9Sd4wtSI*;W0TvA;c7an*4!`jYN315s(-AdJgq3zy`2KP%?9tPQJ&RQPNT+CvDyE* zYQLe`yK3{4>MxM(uJ^9G%5BuRl{6|g2fq5TwrX_f?mc9>_lK%Oo$@yNdjda-c?MMj z;sRbpnX7KF(!p`Hsuu$PAD9Ynti0Ee50o3TP4IHF<8Fq z;idE~G)UF2+hX^(ZHj)UzVxiBKbky-e#JagUON{^qz~gV8vKb`7YD@ndl?7ZdQiqm zSH+Dp>(#Q?$cPCvS%W>$svR7EP2aTUPvd_`;Xk=G{xie)Pa^(A40k}zZLrS-SVYM!*f5LGsKb$1TR?Ox-c$KN#LWaD6$)!1Qj`M-etZy8`5 z?7ZR#|9i&4XwvJ?gtapcx>t1eR}-Edt%fwRqE>W4dH>VK!A^lsS7U3-h0GZLz2yg6 za39#Hz1XJ8)m}cb#~*F*t0X1^q|EN-eW=>Isy>+0t3~9s`fgYZhdqS<+eFz%zo-0J z^f5%NCcilUk^9%W{arAc(yGVRa=`DKTxG`lLaQ;s>M^F`GYO$V3PtT^r2|Q*lUA+b z62O)u7AqRPG{j>xyZxPwYIorCpyA$zX%5r|jdfQXX3T&yzM50#)4N1fb7XAOD;pf<4&^Uz2Klswh>);`)fI$N3w`P&m4U zal{J_&JwKCS8#M^3Bc1jz|l?N=o!XQak=gt8^=z}*W{&_;5efL92*+ROF|gO%F|lo zcv5g2BRIbKs=YksDjX+`cv9gQ8O9NRy2cSD{W4E*TqQU*eA!+e6BLdyVH|$JVe7{b!Eue?nA-u4 z6BLfzFpkC7XgX~DIILXppz#;MF{lF^pL|1kObp{#Hm0>aUKJdZ1joT`?RiI~6z8&Cr>ubv6wg`@^TjO|IaQszp?1Zn{R@dh#97Y(&jyC!+S#VScjwd_7F+|}A zhH?0X4qF~43yy_?V?qZw4r9d{H0}@M@CXjOUp|LlL0$iw;5eZJ9Iq-IkB4zAJF9iy zJ|H-j364)bZ!eD-3dd7n9E+1%;}|12o)#QSI>2#`!tqiV$CjMdIC=?=m4ahb2RL?r zMR~j$#<4@_ux0vgla|M8f}=+VIG$EG>cTj(`n0CwPQkHJaJ=7*(%X#v+XP3W;CQtI9AgxYym!Lj;A}ok*#p_3gcKOGPQA>COD219Fsf15v6b>hH-2;v$cL~$6QKz94|Od?f}Od zcosBH3ghs%@f{u(948Bo&k;>(s~@*19LZrES#5A!Cph{Djt4rx(NEz>3*+#&8FRe_ z$2o#yOb0lAfMx`Z{$U&|FV*s}=iAMgODPXOvK)d7xwDjb8tIF_}cW1--<(~j=VHLPHjE=j z%QHOxs<%zEI9ggfMfG#q+>=HN5!z#I9?PSw+N0OK5Wm+ zLWN^y7{`w5H4cvpWua5k1jp@yuS1;=R};8?qr^0+&UV@IyWVfXE0g5w^+vHgSg@|dM?JP^jQOl+a8W7i9g zzYC6sJHT;)!m%`rV_%!`a;)HZRB&9^0gnBjl9%OS9O-Sw%LkZCDUYWFNAC`Byr^(I zAI7mItF=7t5gaQ7$L9Cj%VV0tu_}yX-^HzQTp>7K5gZFUz;TAcu_lbe*9J#7!STA_ zxU>Tt-+V%OtPSJH8q%7M4VX(Qk6OVI-2slr6pl?{9O;8w$6*{Ep~J>;koFwBd?Gk5=m5tDA5$JX!Z>!w zd~4%aB{;qo9Q)sE&&xdu$9G{IS;C90>!pHYx8QiO0~}WX2To|HqdMXJYl~arIMflk z?<0nd606l-56=K3>(DVab|mbbs&;0==Uouo^SJ|_wEa!rHt@ty4$dxcHuCtmRUX;~ zd`<7PjyK}G9@_GR&Qxu!cvH0%gSHS>Yi{9o0`1t0`w;20G64@rGuH-=t(ya(s-NY? z){qC~)n3EoDt&sy--Een)pouWt+oN810ftwGMb}wQ0-ImMWShXO>IQj`zw!rNUl!< zB|J*yAmaNaAY#rs)G)Y3F8k@Bn^pP!Z?r34gYqQ4D~_A%8i-dSfQAUJPwl0huWGJA zO-PA{a+1uA#x^(i+srz(v39fhPQ!QJ#cR{5u^n-lxff68XZgAZrr;dU7*9pD|3-6T zL$kTwtgktE;?KWw8J<~IG-sx-yUTx_`9s4&vl)dhQ-x}Dp#v(i*U^5OiZ5GJJe6#* zX@Ta?{K0H)I9O2~Sc0H&)4f&vyAo|TJ)xiLwoVGSmDs8+vVR7~OVeGf@;NJi)wcf= zRp^rYdyq@$ln*HV<*!2~6a#kWxXlzN^0>-7Z{Y`F#40EGZ>QVRtD?px&?$#F+x-=VIs-Po7*J98#J!{twDe2rz)~XPHHZ@#N z_&}R`leXJAoLRR}=KJ z-{j8x0p%2$z`r1R!E)=X3d@-`mK2SJOjU4fzKnSFMssIFGqmkt_Si!acnjh8s>lyR z&31oH-$I_6U;Cr|6|6|5l2%ri=?*KlB|ME1cGv$VN4C6M_g5I5bXcm5?re>YtUZNc z*0#UyVgKA6>8}RD^}4^**!=r@iaoR66>IEjEC9;Z<7;%NVKX@y^QyK_*!m@sQ!&BPCMj_{ z&qK<7UVP{QRqaGnQ$csB_t2X-?{yeG=osN9&-b4vwp)ugk@gVV#y)KKtAl!B8@|nH!{38wQ{92LA)Qo; zw$>@yRS<0|%u2d7D#pZiW{xi*bS6wbvJ%X-G?}-0EO*WJr~&8WS-h1J=bw<)Qu$pV zzUguiqct?v+=Daj7nq1-S`H`P`~jGEEjNP-wc?!d=5*fokphw(sJf`RuY>^)NT zc8a~z+IR{&C~be`cmD5yO$3{6qC>LYz#+zJ|A|Dh8#nKm>zlTcPGnd;aT9NPdNw@< zwb;ob*|AMal)bj)+f>h9F2QCP?50o2wFvU147GgE_V@dFJ$(aF-}dswsa+n0hz@)K z+QO6MW-Z`gx3;>1xnAer4I-_{gwy>D{Q1xkVwZ47& zAIf9=EB`mhV>J#pb|jCpI+n+j6SO?~+Vbeqn5!l6QyWQm*El7S9RqxgX_NyTjqv%6 zM4aD{I{NPM`X%w^KwwcOukaR&3KF+HT5rR^ddV9NlNxQ(uNaoMzSD zug3WwReoOU@>l;>d3!wk`)%?&61CKLreUxRg+C!pp9^nq5;(deN2ET&`62W)ddIsE z?eXP=RAa3N8RR?_;>P;mB`Yp%f7&MdT$TTrrbqEG*7Dqmhf5sT?gTa-w)r3fM~ecV z!mNg7W75SoUpzGkX#!KT4)RM-C{pHH0awj#Pv!nury?UhZ4*qll@%l!GwT8mXvugN zXAgkEy%${&Z=j|dB@;40bKsT6-q1yRqxwj+W!61=YO*v1E$r9G_;)L;P4|<^|}2GO2hnbp)?P;`x*{6w3Mx>++ViZ-0N;Gdr=+# zy5$)PU>0V{%KhfrS&sx`Vdd~&^|YwhFS7c8M`+cn9;42k@pE8j<6nhr>NBZee}bma zS8tK-!WWg@i`O%%a#|A7HYuVvwj;W?-B*FFAjQOig`YX9`__DirGQ!E-#bqi5Y2KLmcnc_Y4_(z1y>RsgH9i}LrG1AU>3Srw*g*74}@ zq_j=;{2fIN&00tu$v6<$YplcRd8~Ks*TU5KhJPxA=PHD;%I9zl@`Lj+$O~iG#uu1m zRU5}h8<@}9;HRm>1Q*%?<;CeY$I4odcaBFoHF(hh5=so6tD0Vo_X0U2jXiEo-M1c- zwqLER+l|O7G|Vw)l^&A!B;F7EMgN8qvdNm}$@tZOqw#BtzaV4J(2Zy>%Sd>#h zd)j8Rglpy0;BcBKOxR11YVm$J`}>UdXC+uK(HjenxZ4A~Yu$K3r^b`9Gw=htG@;M0 zdg}IsqG86(4UJ<_6x{}fv^#X-(HO5A8V4iWwpX^jy$tg}d2Rjk=rgdd6ag|w0@Lx{ zg?B)+tfP5)rX%yK52!@r5aB3~aj?bT9klq2P*ld+nX`CH?uL>eyorQYUc?&5`#43x z4u{g#gCQe^;Shj9BmF8J^Z}JB@O}v-W0u4=%~R8+k;sBT`2#FwaM3|TPhg5-jz$=g zE+3zaU5}R}N1%2vTzGw}!uTdZxbT@Qd^HQNQUhq$K=gY`Xh0q1QT(dF zhJ%=Bh`mi^gBj^>tQ*J^S6Mjw)!$ejg9eiTs`VTiqE04*RrT5oP{x8?^_H0l&0pUG zagyihuVnc$F$6Hc{lt|hen2JESZB{V4!DxiHrwMb>t4iv?&bjg5LyI&DmTqCVIpSw zGK29wEYDpSm;jOn;E|biUvuE=#v355*7_44>b`;Us(MbzE5SD6?_xQk`a6kgNM~{Z z{Ak>V{41bRx$tN3CKBI4ir`D(5JDgLLa#tE%4-K|oXK=E(yVS=lEVw`n#iD|!4&%(e?vF%60!BL-je8xJSnhX^~3aSK3sxqaXAWb0%BTWf4Sny$#2j2Va zqo!xHK72aF)3ok0{CQKuW3T{Ar;tO(DC!=5RvoB3&WbVLQb*)E`Om%OSiIKg_ecDL zbRODXsotmMk+!uf>B*@BB?jjCJXHrFVTTt5A)R!adwOSRWS+z42yC%f~Z)CwO1U@}00Ub}~3l z{J6-M_{B_L9MTiOP#my~yI!w1y{od_1Izp|1IKzRr=zoR8aUCOMuxmOu=6cvc;8rC z^Cez)Jilv=vBB+KH6{u{kCfn$`hi_<*=j#b?ON0HWpKzN13P=~*mD?%Q>D^1$lql0 z%fg6;B?LWPu}E$F00m48-oInuHEtph>kBO;u!ewret0yF;vwt@e<5^#E!E@rXW# zR15%GBANmN<;N)j>I|foDo66ZUXJniBE}!r=b^)ENtvM=bDrm;m~kq3FFcNTx4#iV z*mxj`7i4jQZ1_LavZ0&3c4}H{FS(jl13#Uuq|gJZjT6}h21aKbXY?Oo>yyEkDA9%r z_EtBsxny_XCp47|J=FuKbKq;jP&|f$VWwi)I@AZbK1h-@h2FqfOq}pmmQnm+Tl&YU z_8)nw;i{t)I;kWP6DNVnSKVVCwq{texR|4VeFoAVBgZUSszqAZB%L#gEt zOl6|6E{W#N7xv~l1wK(+`WbLYVZdP~jH}nS7J)VJ26Mn}$OApWJW=*c#@gHe0q*g7Z9e81UC)^WDgws{dZaaR+HcH%Om<2@%Mi#z~c1wHNWX@#czM|%jxNM zm)R@_>R*E#2D<$#kz~64&w;yv;3U1_K*Qm(M=Cd!{T)-U$NAQ|xgq~c$#R}%a^)LJ$?1)@VDtCLQF?dUnIPCiAF?DlWL z(`2e>Lo?nK*?{=$T62T@-Lf_8rVnm;nKnW91bPH!)DL^t^yp-@UJp%EjsN(BYP^j- za*Uuxv=PT82F8b&qO*wRz1Hyx(#h2W$7fngsHZ}{1jw;|z!3GHYOfYDVIq*DP84%e z!W+-puD1LO58A!ytm0+#_xX*8BF_I1E#`kn z^CBi8bD*|aXTVxz{51O;z@Z*6%aq0{RI!X_slE8Z0$wuLjz2lE;%Gm+NdTdfpRcBq z*ibLjG3%QCZemuM(Yk)q8{zrr>TArpG3E!xuB6IMFeBcIv54VWgYi}fd&66iN^p2A z9^$C)z*__4~{jvf$0Q1N?^w`#M=5%JRZe&{3s5O;yQlB zy`k8SAI0F2diAM&TOK@8uXwe61fv_POnaLLu=@OHfpb2x?ThsqbtUfcKWSeWlK#>e zG2MdU1}pOp^h*2XqxeQt3x)*NL3g7=g6V4EZ^9o-h32=?@AcHRlV3r1U{Z&kVZY$A zI*1$97>tRxqVP8X!B#{~ldLOZ&4Xqr^y;rDk2OAdZ3*VwizO>URpvRYpaUepkTJwF z`*mV9lg%0?T#ct9d6U7pHxRpWDaX8Be4q9wHgwagl+WHrBld^m_xJZpFgn`H z2V`+o;st~7HSN0mhjCemUBRgj1u|dzh!g7+a5uqQr*BC@t)-k%n^-Jid zH4xo;vp+Ez*)eW&C}a1@X0v&9jCqivKxkUHL=dS{Z#e!?_A}J{+F}30q@e%7AK0?@ zF9yQS|L^Z#6zTm7M9tA-p_^VqUt>B2*9^GFgRKM$%X!tm2dts40q0vORsKQP#pu?Q zUu8|@NXFg-S0Jbp3A;zZk>}pUXTX4kCtn4FaM0-&;SP09WgUnXji|8uV^1iru|Z)B zY{z6DZ(ZRbDe$l}hQ{1}nJxS>j1~F(YS{%PXbhh=kuJD0 z*1VwcP4r{X6J!rd?}CI>6UtD02(!iCFn0B~fA~%(zW;&ofbW0c|Hz>0=vY7xz6A^D z%vj~EJM1X}NN=br7o$q~uD8*QwbHkZiKDUyl^KaMD|{RIC^Oc&l)G{Ak`=6Nl8Qq6 z{GH6wSRmMoQkDC?70LkiD^yo^ktV=Kpe9cA<_IxH;i*;iQ z6gF!}tm#I*P%>U-k_r$h&kyibAJ8^D##qaBgIdX{R%9p)ViTg?Xwz4|j%=!6lptcW zRS~>F-SU7c3^$i|?l<_mzru$%Ra|awB_=tSwMIc!7o)kiw_+D^WV0yVD)tO`*2f%- zjAU=c8JL2C#uXApc^10BwpKo@cu-QR_NO_hxD!s1m%;)A?|T1vcq~32 zW3^^Y$8YSG&ykidV9QSGD~CYmno?wx8y57(%r8l!&(PxR0@hsI5^BbOURKmKK)qsc+61YZQ;2XD8Wr-aArJ0&TLp zt%^nSAv^uek#Qo$HL#PxMYjT~1M=Z0MsJTSpA7G#X%*;F^bTe-ad0^lJ%jZ|_h4;s z7_V#@!z`cr)}GBH7$NZ>SkbKuM>z^F(gM{D{3gn&EG1$a(jEz30b{QyBu+~DA>XD7 zM*=y7l@v54kiqu#Kj5^x(Oi8HZ(PV05kJaj30rZ2Eh=6Mjz|BN#DLN~lfOT6oEI!1>XK-oL6 zANt^LXa&{~_fQMfC`6+6%aq^{X$(y`2x=V>J3T((tS19`|4=uD{4O8|hFAnxNd-NH zfusiFVq@Xi4f$%u_zQS8)+LV%$Nw1LK;dL5jMoBRAkpUwUW^gq<)o)9^YN-aq8)bp zP{l{c>}{%E%l(=jiV<`v;X3PohQ2l!EooCfIdp-l|E8|5Bq9p~ROcZAN}KE`8HR=) z5IiD}^w2?QLV4|MT|Y)0*5&L3QK6z!E({NoA0?05JCFzEn;v>v;X7OKIpj-xwtT~Q zxDZuxr948@RNWtONDrb_YC^&(4<%0w{?4`>M~4Qh!W&SSp(ZIO^5eN>mx=Q4+j4`} z(2b9=<_-id^G^PCo>#$hO37nZW#S2-ShFfimC^AzK2v4p)B`ml-(8z}A)=1iwtGe# z;%SIUXL=Az3dc{eHl#(> zHifQyo?W$t#{to|*rhoFweT4}{EcOVXfF;2G@n>=FsdeWg1f$^IV$K;TQ()DFo)D| z0|p@?RE_smaNE_Wrj1Dm&LaKR`R1>5J9v=M8k1bP*<0}iZ?D{EG{&5HMM}+qr~y~R zdX2Y`X>Rb;Fu4B>M++Za`y+x&u!1xG8^f}uXjPGOR zRCySXIV!T#PisM3GJ9{=Hg` z_+BLbmJ~W)(Ygj-Sb)N-?MJIpTWSAMX`3@r1JOi>qeoN?RvT-kq znyLJXWEqAjAw%MBV7WUo!{BB=zrukb()1ZqRkmrf(rqqw#WJOMT z+vj!4RrzQs4{wIU$GLPoP-xe~d|;n%zf9GtufijQMY!3o4!O^a4IE!LuNt)TXU(hT zUmRVBK$MxP3jOjvxNMgnws$-au?H$qUh60BUHs(WaLj+9AD>YQY&!;+nAJ=cdi)8l zHNBNw+i~Dw%^Spk!|quHj;XOH_=N|4kSVkRDDcraWa8jevz~Pb#v$q=seE;`i`?df5y5bp7X#C@oXK)vgc>c&fqCM^a=(w;=gx6 z|7Ic@hX6(8{@LA{vioen38PFmkKo6$qu|KsFApH%TcN}^duz~mp92yl=;mM{P4_SS zeS+&z%ET#<)0R1mgWBby{)YyshHDox{(waRR#H9+Ew~8Ap6jJtECN;{gR}WP$Km+` z-wGC6sS~k`Io7j2Wh%Q`Gen4>Cl`(fKe0I$YMC^-s%5*(pd)-aRxgFSCyx>V#G@i) zzEnb6cD2h`@3Hy;K@KYC;u$NbsF1}9=wxI7Cm*qz(4y*{(r2zEB`+(-?NGUR|7{p49KNmfV9s|QMbfUUcXn$luu##n?!b3j}i{H_%5yj}ev z`YhjAh+Fjn<$%~j4n#~b4~K^liymT!aq>k;vj?!Gm^h|kd_gV2HWHYA6ihRH3ZX63 z&anb9RyS+JLUu;3;!jCTbA~W+t~+o9@Z=hUJl=}jv!xQ(yP;Kx6r)Dc0K5m`t@!8p zjJU*X*XUnG`~q_G;FSrKoXPk@JC=Sr6S+lTX|ZOBq8ARx61*X-0paSv3kGi}C>-7B zG0!nE3VPp#Hh}%}1;E3~_#m(HN~u)f1|MPaRyJbbQVy#*Agw`i(zK^_G`{oWtr#&F z`n@UO#U2$aWFSH@h&+;3Tk?-3BjeAI88rG)3R?V%SPo1*(DqnTiWU0D|yN3Zumz9<|!HKK6THhlNZ zsc;>NDNl&HfkYk6&2%&ajpHz;VNjO9%&Ejm$hIv?A9IvU+uNfGt^G7-7|@qvXT)g) z)_Z8w!pc~R|MdgCpa=a`F~W&Cg-eRD94XMZ!L}j5=UgI+cn$^m_>)?o&zL~NE*1kC zV~ycFM>Cdd7TxJ-GnAm5bXU9L`~@cH6x5~VP)6Vd+7bOyoH7GZX-+fn(gRL25MThN zof+74JaYfc_;QXcm;o=;mArj8A9y&BU>d_COWS{rFR|5lsK%8W-v)MAI^?BTJ$Azp`@;nXP#GNM-<7_tuastc!U z@Zkj?Xs{J0bqs~zJUgczr=?J2_h#Q56JAPm_EzjU4}}k)ujXDTq=KZ#7}$?PS~k7V zB?zChCe$ZJ6bYf)_PXRSYD$-`fm=a(^X>q)R@8Fp)Uu7pU6jjKINP+C(_&?6EHiomYJp!02qHQMFjd3tFnY2t1S_18>aFN^f?_j=%-Pg~biH?kai0^x*_pe%M+BA_ck_o=$L^KC@A6^*l0e9 z$kR3x(en+7!TU_@+gevO*A3ps z?7G3tOpL}j$b75`bLi+~wtqW)Q`m;#bUnsFg|J_~9)WWZgk$muL*tby6-5eDW@h2Q ze4_^^<-gSgt|oy>t-TeW_JX8n3pd2!G-is|71;Gsa_LT)whY_sN?E5Od;Ikucy;p%x2!A1HJV7y%i>EnC_kG1n~Q zpd{1q8ADKbtVB*Hqd3s6&ksB0|2^bSA;jOQx-B9$;q-+gh0|6xC@ulHe@^cXd;x}9 zdsXi}qIvvut`c4@2+6T3;hDIjTn@?9YZL#Yx z#8?Umox^z6e-*hRON%^9$Qc20~gZeYQgC2rtg2LOBbei-JR!PqzOU$%fqYztyI;M8znPtfxm zx#|NdD_bB9q-mRRJUcvZXB>o9jo{F_8{?4&$j73P-Ah;^uGK}YOj{V{N^R&rutqi4 zWvjtV^Pj!1E?W(7V|SdMQLdu?XL&1T;52!J@3C}Pk!Q?nC z&b$<{0yQ_PkM^hVyW{p&@34ooE?zlDV{#f0Om3LkWI)_=gc5ONg^`tnjQ{ib?A-@- z!yn8B8izxw2e7tUBZAo~n*Z3tjBc8B{=Q1NQW(m2nT=MI!)j&FY8kuT0Uni0aj%Eb zqb_lEI0E{VYhHu@Ii>aTJs`$$q;4iSP~i=wqczqdyYs5#9b1XdACPIQPv z4Lou3I5-`gYt^Z|&MTz!*9%#=C3KD0Ie0Y@`~SWAV_-JJNqqu-xX}z3@R}=80K+G| zgxJUh?w_-~E85Ta*FKm)6t7vwzdXuAB*M=(ENj5i3IoG#3(Ejfq&K z`!&0Q6eFH=5Hh?+&(SH?ARah&v$syfWQGs_dMldx@dkz7PUQ^*eddTT?P^A!yS*ne zWHu)YT3PtUi<+Om1u;bV3ozNmwB^C)i>+S4o4IvC^%~oFKQQ5=><})#IkCZ8c`_{s z2sLhZfr3Mv!kj{T@6Y>mKeX@RTkh9FoBday2kjV|j&)UQ^>-4N6YC_dm_yM?+<{Zn z<3Aqt2^wA7kIhf+)5LAR?avYSax2MQ$Y6kzxZ*!Axuo{QT`0s2{X@jrCasBbV;^&k zIsMc&l%2|qKQ|Eix2Np!C0cCH+^X98FMVoLcCwSQSKDgaV<-P<%G4L1S`X2#LRrs0 zK$&))H~=#GdMj2r45+f2Txv$V&~W5AH=~=kVx}srg3auC74>azW7N#(>pPbEKu*~Td!BvfYGR2Gvo znc}bn&Be=s>c8qBaT!;;{73LjGMt)}Zh@Uq{pj#9oRyDsc0azM^qm_a?BA(N_fhOB zc%{~u-ON%h8)!{$55<@n*`hJ)G~43s5Cif z1*(D-ym>Xl>hjfrZ)pwizt2sz9RR2U?Ek`A&UwP1t-s;~I2-t{Y}`To!bVT)W}M3w zM}wR!{8xARW(p$pxD5*oPNLJ}P&+9Q4P6>?D8WfgLQs@kGmZ-wKR8mczoXcqFb>8p zk2Hz$-uW4kCi^;@#ISQV8FBBlCRcog?LzEh<#N}MGIvUW@|6~UL(FqvKsc>VMfEV3 zQpMJ+tCdd%1hRLGN79`conv0!u_pr zg88BofR(didXS+KSe8_AK>e-;}?Q% zK&m3>)?JPcXKy>1pmlfS%QN1J!|?mm3FC*4<;`i{ivJ)o)k>x}pM(stDwHV)h%6Q< zQ@p)^^&*Un4y0loO4aIXMl}xoK`)8uucN7dAgZXEnuu9cHPwiwaH?tmRzO~3TyJMH zS?EQz9-WCMZd1F~XyuBy$dZ%`?sFOozsE-U!}vcWs)K$PU*5=VT!ynmG8d>9i@lW} z3Im%|i!=m*+2LI(9Ja4foh7AC!hTx4gPwn8yziYmf;b@4#*26(THm-3 z!7#RETmS~=eg{BnqxOmukkNQ0`b}Xnl3MT_R%g4{im!sho7>ox)zj=(-Y{h|@JhAd zns6w-J%Mn%aoFRnyeWj9t?*SrPas~#eo_D~CTQ#bw_&U|Na(D&}3gA zi>k_g@c*o%!@G5r{6;1Ph4&%5^M$&4@7($`Y_Z@$iq#cJa~tznPLBrlDJE~_g}cya z58{txQ*)2Uw52rnpi*HBk}-O@6gE6}j7108gM9BAyF2q0YH zA9jWJG5W$4&K&Eg@IHn*6as5KdrkTlZ41L4_}-BBdC1LNU%npQg7?uUV6Zyfg4TX? zTf;)E(WLu*cx#I8EBCatRBX1&uxk8Zln}8WRPQ_nfVeV^dr+t~Mc;IZP;_Q1f*yl8 z`r`y~Fh$nhkHu)L5La#k-g!CNtSPV2e17_;(1!U;1f7b{E$AQNbKO-AJ{NP63>R;* z#nL@ee4gEz6iY<{is#t9Ki2NdA-`SH6aO8Yw{kJ% zO6gVj?gyKeu}<3xd9!lGO~_N{JqJYbTtk8GhOk!8d;Ve+kU=b#B0Pt-j~Hu(HZSG5 z_7uE_WYS=;UHYF+qv2*APVsPiVJp7-)5ctM#j{-OLUP#uIkU0Rwi07v8h>fVkv*Ib zr0gR>jqYf>p+)IB-%2x^f2P{kch*Yq674SrqI7$5AWqJ5iU8I73HrneHU7 z4_6lAq-gv5NA`Ig6smpR;(409Tc!ZpAX*7T!?xoLsT(K5D%WTiAh)vG>glcg5_5!F zAb$)|tMFKe@gEFDh%dP>^E}W$-18iRrd7KIFO%orR-RYUIF;w!Q&6v6|ChC{Y~swd z=uW6yD*lDSQHvC)u#T$DKv&pW!|sarDW$>kCUlw9ieW9GN~Wf%e7D-%i3aGAj&1x8 zH3l6I_o*?O81>Q?N5|kPHEx6}1`Xl%W#f9PxZSO@X;y4gKa_yr&w)B&Kqymy;ISF& z3%y>bnP1Z#)QJ8HQT?C|(BG6GPK-kl8{?@U=py3+*uDys$ERHye`KaMhtrgsi6FpA zm`L_Y<+er=g1tgLxx35-+B}Ild~`C}RGU=;qG=Al84TE|WTOTk0~P_Tj>YzfQ{URS zz_O+o%vY>af?@@`b!Y<_B845?vH?^Hr^0tXWe0~UrmZ;JQG%s{^^`r`k%z>kGOyOo zR5PF2UesQ^U)neVb`YJGiv<^hx&0t0rLE>);Toxb8Hlt&`(B-lQ|~+p6ll zLHE|Rm^|C7>RePl1ugS~$+kOD4lN7M-i?RpXX)PZB(amwTS;mmg5J8E7RM<1t={@^ z654e1*25RJrhVRofynq@>aEk(N96K9+FNJ;48%CFho0&MtEYOZ4_u{4;B9=m?ySl? zC_G~<<-?hZI-w?8(dPFif_-}#Ky5y+jeIus``?pKG#m|EZ~jN+GkJdmaR(FcEGPwS z=N346?G^H*4}Z7vV5$5fE8}olz!St78*Kp8#NFxBmX>qdDs)$;LRar-QO<>T6}8)X;tuCj177rcEN3tf(>XsGDN0wzK;ywG(1#Fk;2(Q58q{dv_@16 zTaFn8Yst_{ zr6>fuP8c>S^f+NL+>7;*7Z=Xn=;CVW5-NcJmCfSJz6O@KdmCXey8&0d`;rV9aet#z2B{TuT;LQ!^+Vgpt5vQ2dmMsQu#JkmSWPgZC9h! z9|6+>-QD#5s3mkaIcvd>>miuF;Cfh!3BtA;d&9Q;E~a(kwKP`zcT9H?({FQkn_&8d zn0}wT(l3B%*r5UV4t-@zBzmKdq5HTPkosgj;_bFSKAWrd1#<22fysDAoOL_i^ofzP z8jV-5DJVNW7v`<>(0PJyhCzzm?C|QWkha`q%8S3fu1EX!1cx|Ie1E`BcjV#oks(6= zZ*d&9^zp=IQcXEV$Z7#cy*C; z;+4-5QoY8pg3~*GxW)&W32Tp!$Abbk2$veKY~m2o?TmvI;V{lLPvf+$C`N+_>cLPU zX&!3(h;P*-u@moDad1Ir$)jQAOb(B){FnpDcOC8Fe_^6a`4San3G8z*w*pou$A6X&h0 zp=JqPmngcn&2Z4Q1@0N+4>CaQIm)qCZvbsx-f6&j1qhAU7qtL%HGaf6pl8_jFMppoRnQZ6m372efz^|ModwV%pWkf5H;SF8(Q(JF56e zs<_84e%m&?_$6>Q?BZwR{{Lg{&Euo4uK)i`GFb?L2^cYItWie=p+an06BbQU2-Kp2 zBHBvT)}?B#>qJ}-!FK|@JC4$-wY7G$+G?vGt+mv>gk>VuD#5i?D_Yym+n|EAh=}C( zeBFCz3khn!_VM`f2buR>&OPVcbIv{Y+|3prWQsoxGna(0 z-hb=(R=LpoyI9EIp5tM}4G6eoj$-Vx4mT<|$H|3yjHkH^W-C+tJgffioWcL22JaKx z#>V_z8mGGUzeW2r%^46_e9dC%1a`2WjoDa>MEx}~8o}39%CR=B_%2H06CQj4km|4U zJpjFf+xYm--Nqle${YHvyb<%fla^0%m9Ou&@;;1cSv$GIBE~+h@>?3RoH=!FqcdCb z9_bmgoD?^kPZh1vU=tkj#7+@gO%PlxnJd^kuw>TGS+c}c-n-w*f0Hx3gOJ|wsR-#| z7g`~0B_tmNU3|#CYkZ-bH<2isDukBfkQ0hQ&}gQVv1dT89})SztNRlbKfN%r9>ZhJ zX-qDdv%X*DH+W-x2R#;ydM6iLF;T+4;Oa8qK9>PEAqU((8E|!v1$S*UmzC-;?!QZD z=3H%HnG?)*0V;7XclJR2wd8;W7Vq(;1}h_{kSw(G>ixmw|vEIUcV4cb6I zTieR#XmOhL?_(78<0G@Rzy<5RRHnn-&S=Zf>IUv}iQ83h1|zsn19c2LQ-aJaxffLJ z!lm~sVJ+Lotst_;IFj079egW~AJ1zCTwi`{P4nZLEopviD$4TXd44;7Yza6ix_SQT6{`*C`OTU0kjyf5<;ROk4yh2h{ZeYiPPkRA`x$HnfBX1E3k=4^-9 z#e%*)ZXiB!gx8G$BJ$EQPO3W|9a9N=(xJ|ohD(QPEW)1PxQb2Z2`SE_?4ICoBiDf>Sl?O%u z(s9a}mA)bJDf!+9ZRXA1XE;dHcFXpXv+I3l@24spA>m^HMhH*CH)w>jKhk=UE@RuI z)dOpu?CkkL^}GZ2-wnX85&HFU0NywnNSOin3u{1xuGskiTxme@Eh;& zYynSJtJ-_ys{p^xDUWA4+ zC74Z@iiM0z9!c#?rydo4dVSEP)TVF{k#8snq;3h8xKy*(#HFT!-4*Si>`7|Pk*{v* zBOwQiCS+}I&6-`Y0VHIQhS|IYp<{)|z_8aHWnqU1jHZhX0Q*?M9vIRR2WcI#yL7Pu zAiece?o8>*v#p3NK9b@4Rfg~EOz1S1b&j%@t;o&#lFOQ@tn)i_vkrDyUr^S+^0Ibu zS$isLBffXGtu1F+Gzye;l$I9KH*}zJ!5qNEkJqj4EL7_zRsHC8!?S-R=Gn*Ds6Ugx zQc!v@m_lL}{0|-YpHBz;mGZ+Ja~Rkpl4dT<)WBz>$|O)whfftNU9kZ|g9#aX8C*7v zj7BZek#7GaP47^QpMNt4rP(q?u5{$?+~PmM>s0XzbBljpt|;VaKMHq2rJqOeFCe|A zTfE>#qR|w{X8lW9i*2PM>SXZQ-{CVXw}HKc&p9-JvG%u!tsIDV`vCkcO!9(XZU--D zlPVRl8zH@heV=C3?(>fVI9D()dV~ZVq5xtBF)O_32G0Qr;(}yjD_XMdx(cm0&ro2o13SEwmgo zEua2red)in=Ht_ERBTGxqw+siocAlYgX5Q6Mm$JfzFHbe0(hpA{R?L>=yS|DUIyD1j`k365rR^ zUn!?^;0eg?4pQenK+4mWc;5-g@&C%jztZ7fE&PwlqxwJM6;yxtMY8_Wom=a#F6%Y2 z7+Pip4V^nh?=ql^(91p=z0I0)TS86HW{gZxS*pQ7_-ZXJIvzQW4d=88{?eFW8c~is z{rq)~i_EZ|JI(das*qiFHa0uq^;ukqMPoD_^|?B7rb=me8>4&SIh(+JWb+STsGF6j zSZcyE@n#(>hY8?$?>6>$v2{EdYFxqN80?>-W|Tac6E03Q4_3_K9?t2^*6a-kKWl*= zYuD2K#=gBT^xaz&1A&jVzX&6Lstf(tAjwU#*_L4)Z-P!{7e6Da*}g9}WVZ0zDOH2L z&ix))#F-U|>F{GZ^x<%EF$J9VN6g;?Mn~(`6zQ7nmTlY`;D@i_UW~?oDOH+g8TY<) zpW^7gy*Yzcnr=+`7kD}eQf1ez5O;wB<3ZYV+YMFQl-6Z;r@Jj!+Fs=hdxgk%9Mza4 zd~*W5Z_}_u@rg_nj}|i_yq~_>M}*=MA*rsDxsS2OvKA-2&zZDef6c1Wy-lc6(b_(3 z+^G4kgU<*m=@L%rp0n(s2s@1CU#^tX%ppPbeZXWfjJ4Jmi9u-ZaYqT}4_I?voMOx- zRzBEOlT%yl9is83*n#r8vEDB-_1q(yzkw*F$^Z6WviZxDKd=?L4)Vm?&5HEf4osK+ zf>ti*+Qj+hG(m74R>)z}k;Y_&TWb|2_Yf`2TG_MbSpHpjIQ)xgHkLaK&sNmM8G}A* zZiG7%&2k#;tc$t7&Tfj9P})^MZf7ZTu#78U?t}L$qP>+?c_ZyBSy)TUm!t9jRbyAn zjnAbhp*EaENcgP$yFCs^DwfH;JlU)1(wiK-#^U&K724+QXseui7#oh-y(L5 zoa_}b6~e=4^_<`$JF&~b9(;v8_?Bhy4Zf^$xlp;o##kW-XSDKZF%5UmK5#RX2O)B@ z5}5jmmB5V?k-&#`KH6Q)wns7T`e86_=V~w{Z!q>;BXKqIAXB+)`)9hW^Of}i?Ps%& zbXmudl~y-Q2-mp8Q}^ znN)g2@SFx9ySKZ)nydTNjLP$~H47Emb{4%Kzj-uxNx_cNW;s{PiC160`S&m861J}+ z?4U*n+t17Z5nKhYcO>k9KIk2rC2U{CKJf`{xO&o_VBwn2`d1oxb(@d%u`H51xLG_j zfwkrB963E$?mFMB(Aw+Uv1@kQS^80u^a%7YVe@o@&b&C8_$jM6r% z0xm32aVYJZu<``P5hljZYXHt2zvd~Sf3Jys2KHdek(IeaSY}85LD=*%>E8}|pe=Ar zM-IC&D;tjM!>MB~7{k|-?>H_$CV&$^z@bKUV*2K$nXLCc2IyQmZpqn=nT~JR!?n&M zt8m(wbJZWK$mWcJ3H#zcYX>jx1xv*Yaq==W4KcGCE-YRSW3#S>u6Icf7*4D|S=@`B zOGmn#H+<9Gh9tA_us#?h4-4<=ZM4FuT5Fi4i7r48^Og%renZNR;y}Dw7SV~r zhxL8Lp+*bbxhAnW^1l;@u{VHAz76=a#Nm5dv4VO#k=mx6JXYYm-eM%@lh34bXHb#F zx5=k!f9Pjv-%O^@EDwF}ue3`qU827`azB>G{VP8Qlw4&zR$fQ05MQcw1IM9{iq+EG zC*6}8+`{@zKWGxL$Ptnk4(WqtZQs?&)jD4EKe8F+*MZCbMo5O)*@)@7RB+v2Xo#-6 zRDac>W*u>FeW75bHZ{BG@F!_XrfWWKfWl2wwm=Eb~!*zVn*D^smu z7A^nuf<@tX`kR$0^Zu0FXw7?!jWyh!Ds0_=an+UXJ6XO9NM?NvpTa>D_92VCw&G|ClzJT<%V57Y&p#h^r1j|PKstCw zgS=;qIF671uptZjs-ogU>a$}(DDBZPy0=$m2(upUQknCN)b4!o=f5#1yNYq1u^)1x zGWgj+GnF_PGP~STUPGjPXdlKeI!hk-{}8|LYFzM)8J4-s;Ag$H)SI8B`RpNqj`I{W z$q|f2y5M5~OGh!^x<@(Fd$u;@1bcMpZSd`7LczFY{jun5P{?IbLSt7h3Wq4+f5@Wc zN$?w3_RppZWl{c~qvr$2{+sg228LAYAnhW8cCJOGX{U!(>fE*CmOrwx{K|ToAwqVG z%!D-%gsbFmYAHVT01Oqv-8p=7NDYb;Z^5DlUwS!rs_};}S&jSS7&LC7<_-fBaiW8M zkR;g=ai?1+j(+RO?(s=JXNt6_xoP`9vIiVp+}rJ zNiP1*8GhQTokBX@LHc`+0UUtpN$&y4iEBUe!95+M{j_D#6|;S~!(E2k@TsyB-Qlbu z$#U*7TAlQ4wvlw;*aij7*szQ;BK!vxS;AdgeUAm0J$DQvFXIXPhyi3L>^#LmeX}$R z)iJ;CC~(p%JB2jDK{}m<%yh>Lz|LvvdK2bL)gA=ppVfXOjd87Ev$Z3$t>XK{e}aD_ z*Xf``nlBo0+?e?jAc!wN8ce%8Y!m*1KwHUriNgsjFCH}oo~OsygC5SnHtL261$62N z2eXACj%|g2rN)>bqIoyhzsl;GZ8w|+ea;=`^q+qOTsxS;EZqsaH?d_@$bLp9c<0hP zOT+)bdhja)DfaD;fO1*@6elKW=H&?0*Bw4vb3%m!2vsSp%1Z7D;v$lJ%1HXJHz}@8JL74NoCG~m(_F;w(U{Ty#D-#hIZVMFhx=uB?3As0I>g`1aeM|~Ya3p9Rvv~s z#P<;5uVVkQS?{%2ntJyq>paMHj7zJj7G-}yHFc-C5Y{#5dML9fyCyvizzCR!kKD>a z@Jl*4+uRb@+)_1n3tF7V!jk`Y$xQyL56pc8(;+?GuDaP3x9qKHA0_RNJeXk%Hg1QD zGuoj=>{*!On+zaNN6O_LSTe^uNWaU0G{7iPAqOT`{Py@rI)nYU^{KN^g5*#YZ-}eW z?P{L^!ePZ3tiS_%KC}0aGjDSHD??i0j47Ld?B^NINX3( zWSiW>!QEGI+keZgIZ1h$_PL_;L4lX#L#oGIcl>ut-*+Eo8Tp5OXzG5b%j4j0|GPGV zF; zH`1=ds<~|adNGLY)Dj1KW#`bAZTqJMXFy*im_(hd$RFs487pG85&QrJyP8~rZ%I%p z%pZbM#;;XuD!UTAO*TeL3;3N}4WMEzDs2{bC}!4d<^<2GSZ-*o&(ibnZT_5e`P=ku zyDfK6JqiRRpoMTTFx8!Y0|0QLF=NRd(`*%R{dr#B{0iIc^u84m-aE_oezQsstb~_9Ebj_`DXoC6WZya7+cG(vj&U7( zRShii-yjX{Ik`DwY49v5+5SAT(RTH5D*S%{$Yvelvc@axgumxz?dG!fR@VF%bF;QJ zSb$+=O(rms1^BAV3Rv?DZu?7aR?=lXsjM#gCR^(_F6(#7TCYfp>&t$Iv7>1eMoo?H zFodl^!0R>#Ppx5_Dlv%7Dbt zJ0j7uWv3OtYb)06SaHPrxybzRP|M<a$2+S;=^Ig^=Wvy3p154Guwz;#?QspS> zYu0b3?X-$oS2s_SU!oh04@GXo;`j33zmXcI7u5!$RqAym$gb+`{mX8xy!mk zS;K#yOZOs|b&axqEIk<5_8ep})*G?+5Cl(isIT2=lvh1)FTYMp(A`gG-I7PohR<74 z->n9-f4rNEbhpd;i?YtitF_E!J*upwc^dm8m-P!}-HuxB1j)k(L~>@{U_I5rJX$dC z%TvEGE~{Qyds3^eH~2QrWLDJg$uFcs|#COxcKCrO1*@}mKgs}c- zb1r7**IV9S!WN=nSsum5xvZ}#>vU>CR%qvO=XWRy?qB%`6mEDs7lk)JXHobM5zpW- zoaHRv*14>|Dl2?{Zq^@M)*qEMIS=5?F6&lheS^S67T`jc#Ai9kMdZ@Gm~A5s_!u4fP6@=b@#Cv?4?wM4 zGujx<8{0hl$bH_4AtWWjH&7~#V*IkIQC$LO~Ao zN8{eSUViO1p)%5OYfh`UmFv=+KfXG+eLICb%v~=Jo2u-1{cJAl-fotDnZ6W_OCxL- zt^Kl|q*>)Tq1n9BcpXM-)6b1K?&d<7CUy58?7|EgVtbTj?i*BDKqD zX=us3^L_xdBeM|~0`X|B z7>n)86=N1moQ@3N!zl_qlK{Hgh-@^@Et~tVu5eV%q)r?M%7C&bA1mWiIh|3Vbvh&8 z26{y*xeds(qE$M$K}(eIR@InZIX2ZfQdqTumA9c9Vk!hy9pwIo&0p8rkqh;Jef5be zm%4xE{rdR^M3Dh85mINRk$X~OsiiP=FO23%!pYHU4vp}jTwQM>c0fVAMBx?)yY90F z#cF@@gFGw{YJ9ux^@O+9b<)r%J%@e?mGnLXPH>B5J7E1H_ zLv7-`P~`gM-tzHFO5^mnT3v8OK|!p1!4;wLk@m-c3h?lF*XoS@47TA3_S^4D9YzYZ zYCC#kLz%wR(#0bh0eq2e>Zp|kxmPxUlw@fE%!8nU)WU;JrIC?kQ+p?ljdTD*%uJm% z#&D`HwjIYkPTgp0zrSPcD{O7*t)!l* zlS9wR)Qf|Gw`!s_Q5P2^+6psWiDY!_lhc*#@#{)mM2fmH7>BJ$chz%riIww_sn_=9 z$&Y1|i|Mo2;E8i$rMP0}e<-I#@*a%0)g&wWPMt~*na!**tI;r>m*rtZ$4xx2vi0^lzOvzN@Lq7O5V4&RO5+YN{D~?&;s^YN|bN{Mfdx zrszc%s=~OS=1Xx)~1b@OLVE?@hWBfVMn$$yR z*us@O94aQ+G4q`0$hgOxOM*g26uu4vlkrQ+;@_W)u=-m%*2VUKS4O88lu#tuDAx^0$J&4g6J+dj4uq80Q;HZ-95K<3Zou1ROSL#LETl zr{Z9Y38^*1255S##;kPq(%7T7;OWAZ7jc=sw_zS*$Mphor+J1Dju`9~AqRqD>F*R{-bGu^uBFeqD8h#YCU8ng4tea5|H1JHfSzcVWTB6aTBy}h^dPGao9 zy3PK^xUH3*aM+^si;6B>CAcfOezfhG&F#_Ue1zH_#}CmjUg$AT<+MFO)+%Mi?v8uT z&N$wA#G`4dtL+A_p|ou&FOgVFHKDT2gDlm;Ekbd*560V49$5@(7_+Q=@B6ADl40H% zM+f*I1-dOBVrLV8?3-CNKpP_?d&*u;h1r1Bi6~$S8xnYB*xmSfWywPIag7+>MHkS# z83pTOdsD8Scb$>qnr)5i{O*7M(s`2KF6(%+?bU?0k&dF!7$8YgWYPH3CnIW2<|NT6kAV(B8I zNTKzHWI>Z^Xk$*|I^DAe3T1B!1r4ZRFoQrPVk-wC)s6~+`Z!*jr6;826u4HdHAJ&V zQv(1$#THdh-3$-;9!X4jN?F3&ODJmlJBI=c?3Zf9<5;+NZSPvZHTX$GP8ysPcVp|y(CVSAeNH1I1e@Uq^uSmI>c{Djw}ieRkk zPmQTqE;^k=G~hxeykRQhxL86lWJE%yLLz7vQz(~@uaZJ;-R9K45UDH+PX}F9QF}vV zBGN+NnF<>YIO!P{H7u%iEm%ubmb!_-7ZfMsLEkUK+yMucV%)`ylE}3k{G?MfoTkQV zyyLncdSrH)o)DQ)mbmV|e=}^dxwW+-_zGnWyS#A_m&3HwkUiKk@c4G1y73~8v@Kj& zS&~0qq^>x_Dg21K<^5S{>GwZ)9c^5w?Qar~jApMTu|Cwc2JfieYYew7k9*Gla7_ON z3nS<^#<1;HLHTK}?w;{7EVRSRILj9~?5U^VIIUFqMsIK}>6a5NoE2?@uoEnONmlx3 zd;>+KUI(i?#aRRFue%!wEMIU*=v;Q|sUGu!gm=7^gEDmsGo;jIM85nL3Gb^;J`yI7 zo_Y}uB3-N7S`yyZlm&i!6QytsI4U1u#txv=YSw7867qW?;v}R;+Blt&^t(;!>~*o- z65a*ClQNPZHt2R_#$YL(7M5i^yjfT~H93*_L$c8tMSv%WZ z52Km}--U+U<*{7_C_^lJq~J^M+SKF=0qAD*OBBlxi*~4E=u6j$Ppu73z>->Qn0Zg& zpzuZ|Fr99y4JPt)!6k)UDZ2}TuVxe8GqzJrXG_Zy@6qgvU?>Ibgh>8}x4~FzYSg4o z#nLQXnJQ$?r|amwEtbDk(OBL5vHps>-k#FLrJ=^H^Y@L9i6$z>cfX$q|5<1z>POhoK6PbJJRD8bKbE;1r!@?u`z0*a>+Ks~@ixd}SEqi3$Szzt2HY_q!ih_; zFX6?T`A5`kPQT^)UU))zYV=~rZp4mPy{CsMD|PPwt+u~R7!#deqvn|sn){L& z{<>s~7(>e%Qyh@5ikiNz^j3upHa$bqQ%my~etH|^HrA#a-;c)aB&;kReoqn@pZp%T zyGo3DnYq#IE8eQglTQBHO8i^u*KMXp4C0i<)6}S>ITHL!|0%B z^HC}ain?A)8N>^#IWp& z&yiW?cXqy3F`Ulo^=KPM^$tVWoaW>t$TO$BhJ#4nAPbgnNFU5_BX@e#seYM28#C|eoH z#?HO5D_MX5R23lbLu-f%Sosg9zGdKT>_up#%0y4bMB_(>xpbZz)JN5A?iu33db&P% zel-`WYgS?|Ri7~O%HWFq%w_5+L?_@*6`6`Lm%hKb}J@2fkIM z;--~KS}}fjPBVXf&Uisa4w9*d87JejYyCy?4QRVo_ioyTE8B))HZjz|gNcTLiPpUK zpR4NIKB6qIe`KoMAaLz=5I_`2GR9afXaEHF6%6K{LN$5uQ;px6*l{ta=6xVz1_FLt*xx>y*1YxGOdU~`8D%ba75ugW|B5PZ zjxq);IG2IM5%@=;0DY#GXj9-<^oib)q}HdNr9T(0{OX6$_hvXgj{8Cr;e)N|NEKr3 zC@QzTn)3p}qf1X8h2Boj`L+x7ea zgQa5C{4%0WtK%iH{S&c~;iW`#_{`}n|`g2hPKOqr5W?eFgjt1oHKP<6-Wzc>M@e}?w2tJSe1kXU~f6Thf_DG z3NwVnR0EAnJJ$-QE+?nww@ame=KvDp3qhS|IpZ|_z`6jjtIy0i6272@X$naNMUp8#;FUODqtENWLLEd+&3oYRfg83KT7@M z!&hts*t7HN84%eRTafxO3gZ*tOs0Ov2;i4QmSG{65QQz{!Gx|>>yfd6W^P%}^^eG^ z^sLUeC$g6`T$LJcF#h9Kx+vwXKOFlTzit}BT~rt^)2O><{@z&4Qghw<{HpW=6xhl) zuh_-d$_>^$A{+67udT#38Yv+Fa({uW)VyenNXP%moZImr}TqVE_g2~+}nzI2KlwfptY0A2#*l6#81BXq)BBAf|2$E*@VRS z5?Q1f;iMvJ+4m9J?+%l_sDwd(QW>e-@I=C-UVbY673ugMpu4x%t?TY>+#c!p8MT8O zNpftOR7gcO*3guNw`dZ(xWGi^BFM{y$@BWYG}@KX~Hsy9`Vw6=l9VZh=C^S2MR8qtF&Yo7F_(P1B`r zQotWnpjKRszZx{h7$kK;NOk{6ww(@wV6f8%?R_HRPbgNy|QJ%e6;;pG=hc@*Xx^GNaes7wsW zy@dGF%1L-r1#N%QrDRjXe_2zv?&VisS^tyE3S(V=vq=o6483?2-RAsaJj4@olPFCb7Ip9iPQ{52AcN2oVJV!$5Dm1Uhsbob9G@ z3GaIA_}hkEqg%?e{WH$=&$xm6hX*-mhZe_0Iv!$X5!}n?i>+ZZt4?^c6d;$2Y92Dc z2az}xOc)m%p73t6ZOb!gLJtZIp@?jgA=VLEI}o8q*k+rMP=3{|LztQ(KVD(P_h3>i zZFF6lucAB6*IgkokFOIyimxw18&po@ja?j&;0Zo0b@77%N_6df_zNYIMW0l#A%{dQ z3{EyA@)yx>Oqu3lc=ZEl<~g>x$&vPN@XJs)Ir0-r-3(Hot8N`{fc#~Rk*Y}iEE0n= z_|JL`-PCEE&vohtf-UkE>`7L|Z;#mQlfJ=Sb80BX`#OD}fJRMn*aw z`2Y;=<5N~|!d%+^jZ$t=0km$Ddf1aZ5_fm!Yk&DJ(y_uCc-B1I&k(Zh#y-O_jYJAq z*h8?G6XQAHi|u`!qA`*7Ln-dB=-wI}#t*l%ZuqGF?g4k`YKV0FV=Gj= z#3vkuj&=O9y$zKOk?U=rJgn5I^hqPRz!T7G-^|f%)_%x~guz?F# z-u`dKDeJb5>)1@!L?i7h#HZ=ehK@CnYczvpYJpBPgt(SYnp7QYlrJ?mJSxeJ-wly# zeyK9J7Dc5rU|EEXjSk{AsJXT#ZI0Tgs`2A89>A1>dBd_Uz?1_2xbPKkPtY3b^YboC zdjU5Ng}-!FGIbXY7mZZ=C7LR!ISjeFBlVCtE5k8AtgBC^DB$KZ+Ty4}Y~E4^)f&LE z4}i-ofQHc2vYs`vY&{E**W>)v$NNvs_Mc;7a8Bw!sO!R&m%T$^NGpuP{Kwi#dd_Ve z7dsn&pkq1Z+upHbd89)t7x58p!6F=K*NR(Y(XFI^ToP&5 z!-^v9uaTYbmWkGRob(c&9I`;Eb-B$cs+^$#{{07I0EcE#4rbTm`S`+=u=^nRwZ9-wZpR2^VDE4W3!&A7vOdYBzgRY?Pl0ZW7Js&pa+6W#+3rs+$^ z&(oEyfS?`AR6AFET9v&Q*%CbNSj!Q-(aI`RO%rCLKNS*-+ z*HA}4H)$T^zX2AxGoj$8;GXcF?!ymP_ZaGSwVE-fXK^O}qWKvMQMQ7ha_ga^f`X2T!^;_Utz8*iyh?P=ir3^>%Sf=vor)nb6n zYSRd;I95MtcRO`8g(aOVp!0u0OiT@{6QIY6{w{YfinfsRr~#}8)^@)bC!uIptK#|U0IsOP}M zC85Uc^J^6ZO@t3q3!VI~Z!A{}yQzg_eKjEv*lRwDO2c3Q&wD1`+c z9_K$NRJMVOW}h9G!a)<;a%3OFRyXlB(lJswKa`#3aa&S?zw^6p9Turx-5HEg*7Rs~ zXnP$FCW{GXgr?PZG@7zvUAMer^Zb$6AjX$?)l>1wPlfr(8uL?#;8O}uZ)*E{BK#jg z^WTfxlR+~=TJovKtx1iZ46RjmY?zN}qOsceAg*&_B?5PB{#Y1BPZDE;N{#>}VwK@g zr`9F9SeGDlorzjA!Zo!0)6@q6FBI}G4F?+fG;z(@?}<*P_AHbh{wy$ERu8qAy$&tg zw`&MU?{k2}>eRtXvuhSOWz!;zrdSq#^+jRmsZMy|f7t&0Kl%!E$1!BXOXDo0j-VxM zRZ(Jo$j6+1fZ_3z39rmmxm?{FqbyZu)gYGehPd3XS%3}XhSq6?H4XLMkmP2#iedK> zUX1Xqur^$#cb>t5DJL`fI`9uu4`8YGK)#RNvzH(5R6M#e^+AF7vmiyEIs2H}gkooz z@H?htrs@+qLzO1qWn6OlJ1FUPQCkc>OFz!R5#rB24XKumA5*yl<{*q^iNEE(7Rpq z|H~{A&x=m>yHNUR{;28UgH}M`>cYV&k%MMvTY7?vbz?J*?Uj`H~+0;-8dMls(eE zOeP4+<-d{oF~;4zw6fIk8(W0wl;1ups@<~eFdz(kvBm&C(9r$qt;1Jl{Gr+EN3ysu z-RlgWb%;6(x1qv6)E#anDf#(I9pHEcTE7}B-NvjE&OrYIH)2N#2ph9hmRb%?m^_^eRa z-=x_?>8MWb9ITIAtI1a9)}p%Qjql`?_qK;@RxpZlcovsvc7L7rsKK|nzNVs{8^;dt-^glDgU{qMynGxA%%ju2LY3QaQ_zBV%XYru}H^dj=!Pp@tI?SzmPF%JHcAx zruOllH5g%#My5{ODnVZVDuO&U+?XV)l#JUz49Z8lQJ+EZ#`oBYv@vw(sJY?3PHYu=t?(S{yQ4im}B78cUXL*$zop?yGTimH8bjPwmOx zWA+urSgbdCY$6q-lE_On(B24j_1q`>ul7^du+wX_lI_t4 z`4eL7l}nbobQ@I3+~-UKet*B6@0$6T8R{n{>}fGdY9t8vKF?MOcXY?*Ogd`Hmyd3{ zn7(U(PCNgk>RPSB%`&S7wo>d^NSK~e#9MAW8v`-+g&i_0GR?(yN4}>oyc8jVn&yhR zgBD&|rr#HjOwV&B!zMsahcNlD)9t=Z!z{BtFbNw|Ft;1rCt>LdB3FH#|9$%Q^3B_O z)0;-Xu6d*&&~lT(M;}bs#_11R0Gp%SRNlGXxc1{eprYt&sbXV}OWa?H;OaM5$J?W3 zVY9g=jpGT$M#864V4~kro4Zp=Zj?Ar9((3El@2?dGv=tKH*z3F`((z#m1@Q>2MKN$aP)$ zf`<*1l8bkTFHLG{9sBdr91nbyH?qvOgi#&Gpe3Vvzjz(oAkD_!`Pd}AY#sVx-PZPZeMI6J|6f|&&X8~o-m3EK?-tyaMa7gj{PUNPBv2AR%f?&y?x zCSxxRH6_F2LXl-xo1XR`^VS#Xaf$X0@QPe>8gWMx(flo+gc#a>A>hk{LdJ~9vToY0 z_p9y^s>XJ}Ow5>rzXnrG>88X{Aum~&441351`XrRwuHYE%!EIQ>!T0Af(*UdVyqc% z29Wrwj!~(0-Z5QBsEi>9QqQE)EK&veOh&}B^w&pBpQcxUYeZslG^Qew2dbQgOmK*$ z-)`o{N_dhHnAjfB*RQa&JxWfKPxr6bxSb=rOcxRsKX#TgtL@p>1u4_5-x zZMm==-Z4caI==iGtZ3g@=HTm0${?a%2xZ5Zv>X<)R_{bYE%HVo+r4`WCd@>FJK(HC zurpO%bU~GxH_`#`uVKW6;wQy@D?@M}>B-aiZ%G4jpVjt`I?v^+S-xj<-tj#+QLQ_I z7K$OWSY+mfAb;|A_l@k@jqw%-Y_GE~w-S+);hKPvSbpj3q>v{Xbo z{$MraG#flQ=fOWe@x&AFy{5AoD+=l2)DWE^A|CDPc+2UNY-enw>R)mROXn!^fR`&~#OU}s>ETVSrZpwC2=!dex#@7-2|ITyFekbnK9 z;t5?X)S{ho?C%8DH`|_vrK;+0T%IbyFtz{2jEBoZ^h27q;6~DJ4@cS?;EBI!c~BHt z*4bruz^hzpl$EP<*g|=Nb{Xl>;5qh`!uj?EKrXbG42+|-AJCefm4;Q3#FZM&baxxL zZMK-~?ax}mLgue2mLb3r;`17xL7#Nt916BuiN*EHn%+E#-5u$VEVGIw+oY16uaym2 z5!6Bxax`$&TAJ!x6^_i30(!4qX`sOAGlR*p47S_M^ue+Fy>9Q-y`Nq`s3jbjb2ZHS zsNRqM{=xDf&q!y*_IRKRa|yiTdFT3Kn0$WP)-F%cAIk^16b%=h>xbww^<7*`xcl+? z<$6_g{c`o0;!gNtLfZ^PM_4eYII(4-+HMYjG5t=2wUb_&sOKb7BZ&?`zCihFVa_SR z-T*?@1m;i5#Cj0EZ>fM4VNIr)Jt&*{sow;~8cd8YoCuHQ1WqVJIv6>{VzzZDh8Ys$)5x;!54!KIhhyIj-s9Q{ zTeZ+ur5fhNd9>J!gpAaH&QU#KRR;k;msVb0%)h%Jj226*>EG) zg>sk7Ye|HgtYqF}L1j>GH#J#Xr5I=dS3wHSr z={eTJnGKR|1+hWR;hrTDm}IyvgumJqzUPZ1gZd8cc-rrlk)cQd#LFGO=cC+llu^2N zyd0mic_)T#ADpvn;oPAVBXaG58sNczbqti{XQb&X@@R8tLi=?JW3kaeMQmQe+l9C? zI839UrZP9{FaPL;8aO{0jw>nj1_zZ=oZgr)m(k0c?xtN3HVqy&5PP)_wtS4mUleC) zRN5G6|Gd5|l*Hr?0Ph-R;F+dqnq17uOtTk^4|%gd0g;);i|=xQ_>7-5rt`HzzZ(G) z3h`OH7R2Wb$s=~WxIm?%c0(yhPmVlVkS4U_aFjh5p)!^*Z}P}+VVwUQwj_&b@Y6p_ zMen6^y?>SRqDN$r+!)0>f*+HZn9BLOqR65zs?=$lSZU~GYq;HCxOkpwIf@K765&h5 z2k%tLifviMcAqvf9I!t{m6;qy7RNCM7zYz8i7Y}Ujd$gEWg#{rLWRxX7<7|u1DcUV z56j$pTO}$;^H*_864$-Nmt<*o@WPbK@THa$a#YI(R&Xt~*k2^#F6U?PAsWGXitE^} z(95kH?FWKR{5rxN`s(ghU`O#Px3oa`ZCzdPtbH2wD%c2b}zvP6SbT6DsP+om2f zf@9ElRB{}@6NI(!%-ePaBKqD~F%wvz8fXJ7E^o3p;=s38=2Z7Se+%QNv(U$r2@`o53cm-%QAJgECV3j2+OR zC0l@8V>Ffn2bXbnW;Va4Dkr=HtlC=tB&SM)Sg>TK>ASo((iMOw<+g34wm%Gpt4&k) zn{YvIY=1DNfeC#ZV0Hd^gZKj~NL0Y|rST^igJ0QrLB&PS z>pbSV4U$;FRNHDVLocz0=YxC6C$*t&jlY$gu&`tR(x22D7%dG}KgT2oO)Q70U?MJo z$3k&D#zbTi6ivjtEGOrwBAK;4!&R8Ro+q)H*Ep^0;%^FZeZ*U;jwfgS(8|}D)L~2b@<_W?+)%Y?kv%tO2Q>KjO#bpcCpi{dqF`4XHobXb@5Lgdb zU&EC1a?0&PIkOWpcS(=nuTYLJYvkP@IBa zreGNbd){VQ@uZdB8==_Q zK%iE577(I92m^tdWwU`mljWbhEuaknhoLpe<_M4~hkBjEOmn%!aO;BTX{x}JKqd`Y zJ=f)~r`!F4;?ZNTiAP61j^JESX7QN@?O<92!@}<`nOO|t5fJb2H^CmSx3CL0Rrcge z==IAU#5NS9z9WNhWI+}{rDGn*7K5x|9)L5@O}t97)pACKB**q80o|5t6fO1B7Ik2ji7&aqkpP1{gVul6r$e? zIVM@uPx6-jlj*YD(h{h*Bv9bH64tO^pxod1-V2Gzp>2LiGIVC#+X!=X60@lyN4AiL zLZqPx+``8|;9D37#W1O))axwG zVUS2BxsU^lMP?AN@wVfR_n+5^*UGrwvMuwsq%K%5vD(a5EG$qsSr|{Ygr+51kgJv= zZ%IpWvL*a}vIV(nDeWKvQN}?~pWvEgsX%kK5&lLiSatGTMkEVo5cFYzDvY#TgZyP7 zRshil+?SIr#egaCdWoNYhNw^7=DIaK2blGU#KHx@H5*OmUJNF4mmE>(tw6w~@QvGJ z)g5b+g}rSr*aQk3N+hUpds`||@d)j6=UmU&To_FhnQCDe_^KC#GuQ)hj39QkJx;+= zVD-Grk3T59R1S4Li}+fc`Ra7u0IaLUc%n8-ek+5?qmyU(lVI53jPiuZzy?@N#2Ue44R3v3lm2IkWL77_>Xr@5%Z;o zbVvp9r1rH8L8k3AQj6~{ra*IOvJgRtx#1>Su>^Vi-2&ND)64J%jc6&FL7zO}ttj>n zp>W5Wi31TOghE2Bma*PeEA6Z$DCXFKd7(#M;2d89_XK3vQr83G9oGnqx)sLUY6u!u+#^Pay0g{Yd zc$Otkz*YjpMgDlBEHf#DBotzMu(#}OL}E}1tY%9oN>N6a4WhMj6vjvlc|#~al)MOe zl_<=xj7T8EiKB89#*BmL3wEhuOQij5G**ZfFM-2Wix>Y`BU>MZVI@{NI6XInZ_Em?IjO!k&nEHQlk|Fha)7tk7mbw+Xg$J6$KVRQ;K zxp6cxvzT#IK7o%T*AkjVw?CGiXdR{>O-KYJ5ur4 zjzu(&*It1LadR~vY<$b?xAePa`%fMlFG$_~f(G)>E@uzXjN-(ZWp(S41@UAPgLxB! zc@tx36C-&OBY9J4M^}>x=OBr;>LzAHJKoIJuAsJ0?Jp;ripzii zq|yz^rn1Up6OK$1j!e^F(s5*(hD=X34UHz7aPykDb+KvK4#+aKhMxYoYP!jhG z6D@`tFNgx6mCZ%(;|m^u&QZFg-An+i_iz1Catli+MQ#{a z#h9#_np9hOes|hv72*$jAND3gGiemCg&U}Z4u)||i*ZcN#E3i?-aLr!a+)8^H@-{r z5Wa`v=tgF8qoaJH=E^e@N9^jKJuL1mRo{gkP?%4ioM}P=-yLcHk}&=>-4o0W#wf|=~1FMOTOZ{h^ zEWl-iRLv=lYF3WhZ$ezX-q7yL-(#oP%q1Axkk^Y{)?!H#ZncJG}bg!lL~p`?BJOnApC)azM z2{v>o5G@RaR@`IQp>nZ22ku7JO?#Un?IS@v+fLkDPa%=m8hRixb5}$LjVbMBjJJm^ zkex|gdZrtn4n-e=hz{*w>g@T=gV?c|2zOMIMU-LHlIC4OGcyj1(ICS30nSKY%OGri zIpe@!#sNTUqHo55N(5mTf>6QMpXHI*ATvMM&u6ag-Rv-H8UB^T1ue;zT^M?*R{1TT z$!WJ`*D&J@bFAI)aI5iVcW1oXgTH$+Ue%Dd*8|CxeQ9Gq2DK>o>`(py{5_ETk>rm8 z=t1D#lx%KZi7;0C;b?G&af7rGqvK7sz>7)t`P_n@V_~~V zk6jS=)Q$0ip2IU~$GSIK3wlOp(mwB=wk_z{EuGf3Tiny)L)_j^khn1H7Y6k->Ry>G z=;5M^b1d-J;@;2fuNUIpD*Nk6_e^m?&nmNDlXzEMuObu#Xc4{YR5$X;{ZFh=?`&YK z%9yF_s3=Q=#R;R8#jg=&>k3IoFkKz%5*HM6;M5wwt=It~XLe}xJFQmDADt}dOk6UU zQ9MXY(|C^)QnV1MeczYx4kD?1QCAa}D+;l=`Xy1-p{X(P@4fQO^vh;|3pF_#jR(s` zr=7%&dNdpo6Hd$wabbt)+HU;3TEXmCKL22hS-HQ(S+`Or?Vv6@eurtZ7y?TmaAe{FM_`q|iHWuhcNG??N~955 zD9jSdL;}AiJ&%}=DXvVm7M}@@erpJPEvCuVa_u*)@movSW14KmR<~lSTV<=GG_aSK ztQ;MKv8`85(uEk2#qaVzHKP8;B`m3NYK}sQxxEys%@*pgg=$@)krdk978;o@G*_E# zMyh~+MFIEN+K^v!XhFv6?=RV(Vk~Xf8Z7M;V`U%aXV%Kj#_ngW>~=y4X)F8i<5=07 zUH!$``t$PYkI1Y4VNU&d)DId^t@M6!i^-%cq(kx`J;6d<7L#o`kPZt2P>1lN$SkH1xjTeOwLQsq1QE*J;=FOcNkiRMvJp^Y@yNJlBwq=Xf~YvQpTq zpc`)JS1!|zbetgHvoI5@4bfxO@yScmfnE7q>vHw47Ue?^2GAdQ&LalUpW}#&XQeV9 zxnsb>A-A`N5`$dZe*GXeD_4Uuh;{U$HL?z1=Wj|I0<;DF@TA?%1g3JF`ef@MsYzEW zeMoa@Rk29T9_qK2i)C}NSnZ$1YE-gyXnIn9lx}RSj<+wBE0Jv71=XrTwIVM5lQvra zPdZ&OfKE%FGXt;FYSzAL(QGbAa9W+Cu*)z((q@0t5?1q2eVJaP)j6vF7Zrk!{yR&C zQMg~NZc1x)Vro&c)Jskctx8TU3@hmAbUf|fOWe{nI?{1JUSP12|D47?yE>!skMlFD z@uxkRt7jcZYg*$UPonV)Bo@*rOMUy2c9@Ty$I9awl;C}Yf`8D=()@Chmz>k5&~mw@ zd9WrgnV3^1jk*91?x$=tr>x36FTYm8k&E0DLhdMhsbVhR4@o|P*MX(+dxx^xG25rC znCAF(+o}w|ZsKQ_U-f^^<(HSkubWoGavh2>@lprpYgstQwJth9+$J;eh+&vUUbbY>Zrwp2QI$uDwp%n8FYJ(yTG$ z3#Ggsz)WOYLewUxhuaY=N){HQAa(={MV8FOMJNousj&w^aQxK$Fmo8F8E4IzzSZn~ zh!U*&0PW!XCv)1w`6W!l3*w2R%5kzlfp^jcCDdy z&Iwp{z)>!3CHXy)J591HnV4Vb3j5nBVZA+WK1!B!Q}lfr;BV0u|2c++Dt6a=g?jNO z>)1yk_vfgGBG1EqFe)v5jE z4K{i0U+XXLZ8><}tW)~Sd)nmP_x1kr{-8W96h4i@Z3(u@{HH%tW?xk1bA9kqI`?xF z?hO8%{@l-eYG0HoJlK5RtA-||NuAQH zN?f=bfsFSEgm)6WV7X&>M^}rP_F?{j@EO7p@vfF3G8tVhy9gaX4-?$JKob}4OPz|Y zmd}_{E&Ea;w49PCXVJ?vPt9V|N;;)F$<{K`28A#^cuMS}dsEiM3jO_T1a#K(E`DbD zHC3)s#=0Dn!>_v@L4nb)*3br8EFMwm zhcmUsj=i3>W2g6H$Bg`Z3}YtOce`<)jWNsdjPIpKY0FNEnbzVy?=asziUMZ7`_UH9 zPKF)wTO9JxQPJbXQH{ymrxg@0|r^FX}6 zA{T^?!llRJlLf+B!`S6mnH{X?{~3!HzPP`<@0q;o@vwHRcd^Nf5$4)4@2kq2TbL~U z8>2;MaInl<`ZEaj&iz~yRPu>9^&g&CBvsr>E)ykCcWYTf9jCr)M35Jsl&UIQ;A?stzz!8YgzC;;2IaQ z2p6(5J#h$*U`5j;kIqZ}oJlUS4(HuC%h?*$%4%j1A7WkU7sA10eW^Io!fZ`!NH_1|Yj zmVQ}kYta71C>Xcy;7k0>O7X?Zb4BorIU@Md{fOY9>Z|(>kUi~leug#lqcxk(!Qqc0TsR9!k(zbi8tEUr5hH;KWB{P9lxp6$-X{W;mE0i z96@{+)(UIWFm43*99TwY<|CSm=q4TAcP4W_GIibq;`h5hGyJw!RBwU>@VmMnZvWJB zd(2L`eVXI;w;#3KZu`08_71mK>&}c2uV;P1f4;jHW*+8m?A}th#d7*LlV>5g5F-N*3vFR1qp{GBYO!{6yY z{p9?;n+tFjuB^uld}{n{aQwaNA&b`UfAWd=J7_@u4*I10{eYG~E`J9Z{$7eY@4(;J z#dP?);m04v-@N;5jXgg4_u}s}#6#ilr)7@^ISzl>A$BZ?eNubuxZJ-z-tsZ+@l7=R zN$s&YxH$~9-oYNv6Z7G7`^}cmA8n6!pv#H4}vqFl;7)x@y}879r#`0$f<&yk2n5JgsJs76_XkN#-uK~SG?ZxLwFtI zP9EM}V?~*fkGs)^;cnUsG$S3~m+M*T=_24G6hr-w_Ybq4JOtOvT!zuY%BRWxgGu3t z^#WBfOU;^l5jAu-(tYQLFg|G)GbfCTwEu#dan6y(r-kE{iRMZkWA=v0V|tv}$#nk+ zop@^E!C<}qfD?H{rJjPJJkJ*4>&dqvrjK`4$+)a@+SyyR*%?BksWsdYfF3sqj!p;D zOjncE1KEtAfBwvx_>65`P2228MSRAVuBI*aqbxCPqiZbCex#)|P|aVu^Xqs zTQxE5W*KCzOCxiF*fYZ1tfxgegIDT92ukGBr_j_0Js<74dXky}U@2OBwN?C=q$CSDBC3-qlWZQWKbkxZ# z++_ry0j8hj|TIgrY}bhfEID2G~0Nv4VvhU?(L$$J#i5nA~t1MvA1}P6dni-PK1KbiWU9P zx!(=>bn?)=CeOL*a8)(j>5Ez%*g~xn9;7>q8*I|;WmHM~_CG$4yjrKmbFjA};WW?- z?iFihhl9n?kfpNG6=|kOn#x!DVdAUgGmxB_#_~^0Or1ER1HpTFQuO+7ZMz#-$Vmg; zU1XI8dYqsy7dkBLgVV5ieI^IP8y&Ep<^a=9^2g_l`ptrdd zWZ}vfR>S|0aYggK^kCF>rAD1l>=JBS>>_s+e)}J#EpM9m7tcZ-jL|3WYTgLYtyc7Iw=BKVtd&RC=G5-pUl{17zKDs{E2 zQ6KZ)NN=UXjLXI4HwNg2!Y+FcgiH`t0D9Ghox zx?I*%WTh$jWnPKfT#37KO5D~D4M)NYY?5)%MCYtLyK%CE^35D5hfqT1>QFhi z5Asi+{*`RQ3G7=;n}p2UR}HuxO|kh-yMBWv80{)gI~sxfEuJvs%3AAH>ctG0KHY!Z zXE}Zf$47YAgR>$Pi7!?96r5sxo_m}z_$|Bkefsx-YZ0^leV&V*eTcL_uTGPx!WAPK7*-&(va5e;9+SMf&6Tzi-Jj#iz)>M?@;JN*#4ux*NFwCF=5qgRn>SZ^tXs->IaBe+NH?s~yr& z+`qZ>e=7ZZ@^AXu+f#3my-oT5g}qHl#B=R{UZ?A~Yx3>wP0rpnJLJ9ua-YQBZlM`t z`TN-04X`BN-bQ>(;bIZN1Yx_bqM)^{Ra&*8rHU05t+iYe z_3H(#`t8Lk+KaoQ7OfY&vA_2-GiT4)BvQ2B{{H#>_Vt=Q=W}M}nVDy1o_S`@%yXhc z4#mXnoAKgyI5prFw|@~isl@Fmh+F76@>b{b^}AF)mAoxZa^+z88foAm?JYY>;+o#K z6t`_sP{_Tomaeo4V($LCd|kY_y-5kI8fjf|GwX-0uEZ;9IqlZP6~Lq~CYJZ!hc?bRJb>f?M3~?LhNh9i$6!`&;23tlA4VI*8k!8?XDtD_-2LHC{L3$rmG4O`(#}b5{eg%8QNhw% z|B8=N!;0yv&ZoLQuq8vXh_7i$!M;Y}9f?N}+jm;w<-1WRyv4S{OSodK@U|KOyh9jD z;h%1$DTG<%>-24k1?$a%aO>YCSA4TbvZW@rvKI9N^5C-@zY79$J z81@yzM5|gzhp#Oa;?EZcTMJ|**p>Z0EU$H$eKIaX2;VnXtG{AiJ$^DPb2j<7(=hBp z{*^-QMJ#op{X$^2Tl<~u)_!NFMn03CZVGuV1y;NtBhnU4AI*1+&G?t)=I!*BFZgiU ze&I}tG6V@yUoml&Y27zg3A!=UpemAl>FZf~IrDXv^H^K>!yQtDNVVifPcddw(F}P? zUN*oz(N8CK4vk5DzZz8)BVj8j-`3w!STAuerPQqX7$6*3Fa((%m5!qi%Ta0PQ zS5ZqMvLBXmPfLpY60u`!U6Fn`jTIinYxNfs>&$e^+T_AXFG77NLrfZ&vX#^Zs<#2i-4xu^P#Aeq`8?F54~4IhrKm1b=WKF@b7f7Vtpp#n<~iN=+GyMDo+RVs&kbXB?piKuU9ecmC5_X+N*S9i!^R^)q7afX4nByso{ zAr-Z->aOLDFh^=R*VOVH#l$9IeO#Y??i!WF!Lck37A9WNA&aLUWftYDir>t{VOf#0 z;S}rbv?!@;TBZobRH^KTuO%aUBQufyZkZu#YyXxx?1nKS?|H1Na-xF?K~ljqVMsIso*_Rlc>LE|qy z1o0F3k(6a*Vop9^mBLZ(zpNymBcpDw zCyduF@tPIqb*J&VSG+Eb^J+C-*NazuoL9B+S}b0R#Y-Q!kg1&Pe+rc*QNe>lo8>Ej z>;_^>(#}Hz!+*R*M#d|y#%^#p)3a;!+kB|P8nSE1tF(YDIN+s4WC{t9{!mpGGEUVv zRkpgSR+E$^LBc1YwDCC)KBaYXU_^*rQC;kNQt~j=Qusa$hBbMz?9&zq?>y8)pMYe@ zl7{y#v+q#LmGA0M*Z&wsnzhq?_(+KD*J!_0S2OI}A3`zvkJ$Pz>#rH%FHpT#@4jXQ ztq2=%?vJ;ni#2OL1vIny&vtOGrK+ZqvZPwV=|6;d z*vZvvQkc%%$J6#gnt@!PAs1c8g{t$n7pga9?S%uhpI0t%-+S0YMF%nWjY)h(Oq)zq z!L(WDz+%*(%mdA)yk;x+Nvxr$XdLT-YrTNZZobX8xp(uu#0MYj4W+$g=~s*kU#~wX zgTjW?o|?F^rGVMz*cm+oqcI1&mE_Z}JxvA{^WhoEV9Bsx(t1iiS8Pb<4qZ&+S}z}m z;cF^AgA+1B51fe*9lLjBwMZLT84UGYBjtEv_N-a60#AST?#|B#4tX}PZ^*&3hv3T> zdR`TMXSXQ{iWOxML1Bi!cW`r56B;f9!7Z{6TMpttwwP}YG|p%dCHb9R~iZX7C#VzK3AS3?Puda&Q3 z+HAmsyp)F9IGCt2G3uK*J2RND*~524E#1PKda00@ev)tvZ;#_Yz4b8}^>nWZV)I|V zrOWs+r zpvv^H2Z^Mx_lCH}S{4F|wP^`kkJ0pV0#{`O5~%wm+a~D(=@q(-hBh>b+C3qMb}r30 zd?qiB$?lvW-$YLya;T}>xZ;eJJ=(iH_nZ4AQ>xB`^#jDp+{(egs?1>W6Aa60*j>VR zw-Pa<%I85dQ}{Nd(3!?3Nt*`P{cDC;x;>B6nYUP;FR*e!umd)elsu_Io?!mZd=JEU zaX@YCl%yq-gPAvoXo<9(mE8O{(;UZMmC^hMj(rnmD4mEt*PbA<3l0ad*eu#CTSas| zKxFA}R0Ft5KCK`kAuv|D$*}7Yzk8kptMhAybVorIykuC!!vH__MLx9A;eCLn1B6578 zisqr|U|YuLVO!LxP@63l+dkMA;I)VQU^}IzYeaNdc zR=GJ);xaLpzV<`}I(eVIZW`GXGd#&1&G2-$L(G;CEfKN7!|913m=)#ZUUIPcLE`f* zA~D009BAIH5TP)|B>|iNx8-ZZNZuJrj0h``AKCvk`5~e~nf8;O703n73tKyB0V3i@ z8|mVqhqfiVYwr43&2hrASEuR^&F18@I-eqE{H7w=IKI*iDJLi1Ql@ZthWqYFydHZv z%a}^(bd&0qeq)b8u{vWwxIs*UnJUbE|97cW5eMY4%M(dLL{uHPCa!YcKrM1AC$u)! zGGKK2+B@(KaE=HINvdk3Hrmr$zt7`1Dr+^B5?#eof$d4-wx|MA7v@yrYZ$Ml^|kEP zm72b$Q8#L-*aK@q)6(@Z#|sednXo{P-dzj}`kC`XZ^MEFSTGb8JPQjrN7M7gwqk6$ z6!&W7oFB&-5wg+*%;taTY=v2-dsRv8$di(u!AoqT7P{xz)&L}UstUg5nb2$o59x6) zt3y^#%lRG52r=|9FbpkFo89lD6U#Ij1$Sy{Nw`QPDu2 zdU%?U5o$QSy$Eho&Z5)pr#(Xr!`qACtvnrWKTQoa6toxR=%)qt)1*+tg!ZD*`sp~# z*o{wVFFISp338f>fC>FV4U;10V5M4^>1JGLWsW2TB`|F*Gmm(a;$po-l1SBQ;;R8U<3pxWz`4_6($MDQb}lS(@9CJn0xJ!5)Ryb5-< za4K1v4>z%cm1|tbi`$Y3!?4FD4Ebgc7)W^qXP0EVh2 z^YM3=y&JTM9_YE+M2tDxj#a|s?U*-WRi}uR$5kIQ7rQEH$Up6q-05pe7~2A$ue;ES zl;bJw`Uz34P{a>~2Qm)|j*gr!9wOhniAQeW>F|PGIw+pQZBLfiwC8z_XNGt(AUq*+ zlR!>5TfAs8!Mw;P|1w?)+Uq#S>rdh(>51r4>3td-Ng}^B@i+*Y6MjRUYkK$CkyKKW z$q)D7sfM4(I@>dr$yXfDMTVjpz99Ozcxj@gwwKCDPWTSTYovHVoqPzZTE%B{WS~4% zt5K$gb??>{9kT0pO`K$Q*Y7i(>o+E5wY7o{HTu9uooaLka)M#jo=XG>RHvRKxg9U$JV-Yu5}Qjv^{Zr^;%h6 z5mFl@S;O1})opbNLv^vv^MQ0fItM=jI=v^>6I(m=#F*KDSRJ`XPfi!pjbsWpkVWj% zP%IvnTm+M`#PohhnfyM0F1S$=Eb3<2MqU#VIN0u(Y67M>eH4VLSE%kvF@#@c1k-g) zZ%sg15qj7Mllg4>L8<1%p-<|E#tuXJ+RG&~<`Ykc)+I#lBwVm1N3lp`E3ysCuJppT zWUM1#cI$P#oWk0c58_1=($ABM6lC_8_?8l7$_^N!Y<4#-=op_967fZ>Can>jGD%y4 zML#00KFsS_BtSwZ??9jZ#8rA8^tI%>P)WWQ z+>%cWU~vw&M_^yo%jt>!zz(@`=}&Ay6-Yqye3le9u~UOTNps1d_(0W#n=pwc&1E zO~Kz3%1tpQQ;uSw($gE8Z~tzfVw6eiJic_4KMZAh#)Xd8X?%&vAL;8ag|12=r&LeE zG3`Z(QaRWLX-FROfo<{uE1R@qj@$r=Al#FTY%+q7quI)V0 z!&8LCFEvbt#4{&+uXyPZ=mqhTc(NN(jfFpO;yq-?yFthEJMnJCODl{elu&7sEwM+` zcS58|L6Hg$^Zyfhklckl2-T(POiYnX5CBn-^tpT*RwnH0re-Z%H?14p9XXP6V<1j$ z^GI25Q7hNBF6BrcI)IWst*i(j8+bF>lr_N2sa~+Pq9e)%ZztK{77W4X4lW9>ma5C0ZFy^0zfgR~NqFqXeJ%kWp$4n^sQc929 zRI)M2EQ*8{pU(P=aB1f|32gIzUskkg0`ID+>wyVzs}%>2qg5AsF45D`j?>jU@eLfp zzjU1>jX__vlJHFW4XG>@w?sU$ejrADi#^B7r1N)Xn!GbSFj230aHg482jA3D|?}C4_(!p)kKEFYsH)>0y{H+g{7j51GW*424-`|@)5L6Fa!e~mOg); z&dI?R9VlEtD8XML!mxZ=Xl0ZERgj|&KX|el zP~{=P6X1+qgSY_Vn9ooX@b1)GBK5|EJB6A~WfI<R>DV3J8y?uf*+D+FL3sYC6xhw1i zc%mz8i~5q7SYzG!jw*RSmcXdE+v6(kM^rGHkUW%%i`*h%nR=*s!fW>fv_QR@=bB|w zrKmZoN_)eU)l}&hrtxDIX6OE-mZ!TZ4Kt=Vu8mV1-AgL=OjS;os3nzBmOSmR6n*28 z3WCej^~-@csf8kC3xZ7b{SZ0q)W%!7xQ_2XUUmEly5mQF{tqeIIn?)ErgzbRl%f?` ztGojC>gC%k8m71Yx+A@8O|QhzyGTXa9%G5t5hCMwtXjEVc2#Y%`94)MEcHbOs94e= zyKIy34H9EqNjp26?OH>|jWCxJma?EL1gRyZl)kMRxviAe8KsmZIqcHfN@?6+5;w}l zSumR9%+oQX7BgQ&YKf$#I?KDX3px*G^NUk=(bXwdkCr&4SGpJqZUQ1-wI&hl(wZ=& zgKml$9a?z3*d~%XR(dKUQ-c1AU1+&TFed4XlYRLis+dnsl1grJ$cCit+@Y>U#i8#x|K4lTx}RR)%Ldxj?DF|4c*X%5*bhWr$YF-4Id zA(JcQ{9i(ohK%4H9}>I!XK#ikjRm0B=bPRas-9%qyhSF8(c4Q>S)735?-o-+Et3jJoIpjM|KW2U z*wRLuDS~bh+DuXM;~iGYm|!?|)lCjX>NN2Qz<8}~4@pa#CHbVw=peM?WI9R8mui|P z&6Zpq;r*m^GMfhRljcAJTFl?1q_61sZ9>xXc}#o=$=QZ;t#N(UDZNK;SI|P5mlI#{ zRuLjI$S+#if4VG5F?%2f(vSlyJ%MdmtH`K`g2T2bND)z>mW)D|Bx_MHUF=ntAPV&N zaG5q)fs&XkND*0pj#P-vN$HWY3$jqU3?9i?*0W32Nxuy(?Pt10+{|}Xrbq(5D#OIL zt>k!l%R8QR3L!n720mVq&I}~9mGo-~O+Up{1C1_Gs)1_hMztsjNp+;kAlynB121r7 zWQ;N}>-P@bqMn5&+vcU4`Vu0%t|XZ@C>)VBj=#RC#*i_3beE@2_xQXI-D6{xJXAg8 zF~a^AMseFJT9u4%C_fyaXGL2x%`|-1>b?D9M&t-)#{&}l{5AOzY zUk)E)p+hMQxsm8!&?WV20bWj?fHip8Y6Fe#JM3|Y ztR{6$=$}Ry(ZQ48X1B-!y!7H*+`_H>zT=igGxh&>?>7eUeglaUm@vSo8G+aI(immn zB}pJ7@)b*PHraE&9a)be8#(aHBjofz!*|T-n#c^*W?+d^<`tohKOawQ@Ad z9B-43sLZYGQkiq?vg*v(ilC#e^9C-au4~R;M=R3n0)x#!$R>b*8S`SF9!PKfX^#$C z^^e&)MRUhm+XTKq5NXBVVF6`KL}5*et(iDuUTnB6_%~&=S5e~?R`)8Zbh}GT6BVxR za;wPSw9+k+x)bRovM6fUP9$^0NM_Mpd9HO=MkB`O9M||PQKf?ESBa>&YVCq{poIEO zL}dW$t`*sBS?iF&opf2^e-WbYTxuz8Bea+;6y1a7+kdVyT|^p6VGS)l-mR=M{7pF4 zNZ7!PUZEK$qpofy!Qd*{xy;v28KjPbkXv14BCObkKH(7^U;yYMheiIE^#3 z_^h@GV@2i6Apsd%#TrPC(sV}!QfQXKSG-OOEg#F|R**CNJ=jYPfAUbNo2{y(DzsX| zka9brHyuN09Ypj_v}pHNDcP(5Bh;#3d$CN^Sv$fSZ*gi$doin)0$F)4?!}{Y%nN2j zF8G6626XBGG5t!v2nek-Uxjmes1efZ5~a$bRA15R53v7-_d&MCC6h1bwT!Z) z?7TAIGfLm-l>rMFajy&3zR2K4Wif4242Qe&rW5WmN^6FrJ9Uq|{~Fva_NOKX4N0 z&jT|kTTPdz-*6up&3*a6$k3WqWLRy9S~@0xDB;^(YP*t=9DKGG!@ut*jWZh>TkDA^ z8f<$rHNn@rSWSF|8g5L-IB$)6Y}l@9Mk2l6Uqnol8v`Syl-J^*Pmz&uY7Jt$)dAqM>KJ!I;Q9r~nFDFkOa*&TQVK4cl zHGIV>;w4GDC8f7+ewB|g-oTf3EK`zDW{4MGQFbqmb+2Px_YA8RB(2(sG-%VlcB=OE zZqhi-hxFFZ2q&x6?afr2X9Izd()=13@K{M(*;hMgtm#Dd7#AxUe zRQ10_coBEr*o|r@UwZ2)f0Xx0={Nit+I&?`l^}YcAg%-vN!L{Z`6eEpwXPC{O;1>0UA~(A8?|g6hs{}^ zakmj3sN?KyDMrr;Eln|#ykP74zu_&ig(?5b$d|}JX?rN5GFjx!EHApg;SD&s??V4V z`Lah=zVW7Bgd1H z1%vUhKwf$WH`2R;p2(2Da8Vyz30jfeuLHE&z|w|Wl&+oFDa~h}|Hi-xodQd((CFA; zq;_dET^{$&z7puXvyWD~-`V$Zy|b^pf_L_hu-f7xH6)(YiE*U1#gRH8m6j&w8rku5 zqL7*+<#lrP#@x7Ey$E!2RUJp_dRMMqyc|;R{4I{uhImq~aimU;BlWbX1}0bXbqi%o z-Ic2;@ubGak@|gwn^*GA&?YrjNQpTjwZ@~jd3}8u1yto#Joo_U6mVS}sn1-bK9~!s zI`kD+u6`|~Tp42gMr0$I)Rqra`F+%DevPn>tNHx)yE{)^WE}+A!xpAcKa*^6~8KnBi4nHSX z*9j?yS4-na^^PO;sH=cWg;ereaiqq@lNuIBs%^fTSC6ZO$8HpoxX*{V5;z<3y%w0hF5{TW} zFA!1_;z^~)ld|GS{Wy-)VFZ><$`Vp3_S;n5arVrKYYdM79bQe3BlWe5)FT{Sj%+~q zyBfoCA>}lNE8|Ed#gY2TMe0f+b()ZJnrL=>t_H@DdVHRnS6{kF4HQxj$IGj~UJ{q9 zSAb3d>*7d-T$wADSD%L zT)?|K$K$8U1Fb&PGA%AftMce69;4!7EK(jB;_7_Tai!GUDBQ!Lzhg*MLp$4mnQN?Q!y zOz-1K7QTVDa0P=0hwFI5i}BzL33e1GQ`?efp-jj-%Gu0{SO8Tg9OklQlEn-Z=`liG^CC^M%pqdyfor{R~ybr621<9EjQ+KLB*hg{HBd?xgU`r3+zUC~xNoVQ@v zm$wy<;H%X+ft;Zf`e1n0F8IxdyTn|F(xu19hG$Nfh6+Xp%mLHDEP4X`3FHJgzj$!S zA?&;IT1=viE6PZ}@e6t9g}*vX*yIf^OFHsdLgEF_m$QUkzHJb^GE<$;4t8~(&{SOb zO}d*?We?HdOf`9C@V6KIWolNOv4^@Mob25?4qj(+?E|m-@=VngGqw|Wb|N(TXHi$&pHxm=4W_QR z_d@fOVbm4%avJrLbpdq+J{^1pcrbVfVb25)1rGxchfX$l1ULtrOFPJ8F*;wq6P+1a zQefBLEjv{GWyb1ndj?Ioa~xx@1+J?P`8-6_F3Il()WY5lK!P_B?B&QD>-R) zTgl0nw3Q5eysab)|3Q2==XAcCbH<@IPM@@u3`uV*Ide^0$%v{z2`7U@sJ53JFA21l z43%W%ZFm8Z#}fIhmjWd@!Io8|6et-PIMlLZsLsNe(SeeoZ6)J^p`}yWO2$uWD><9b z^_oNbTS?)#wvq{4iyGTXCMLC&Od|cse7C1KqphT5H}%yokT;ZXaUTr-_$gKO z{bE&5zw6X@pP!-XollF$`tI;!RlWC9_3jlQ7HQ=ma8s7~3bKz*)@Kc}t}4J`NZkX984D;qpUx}pZzSGKBpwp%RA`=t z)XFj|NSx3_)It1AzB@cfdUIdXE6)fN_YJkAGR6l=h6h_(B}*kk>6XK)+DdZyl2u-? zWuAIC3XjqB%P}p1lCy&?{nW#;bda;?EaQkVp8hw1Kt%+a$o&-V&*T1lI?@G%o63=O zKDAXcDO7SH8(LWIR&6nSL9J>BUN*N`fj}E8XyaIT4zTdtC?6Qbv_L7Q1s>Nu8vam> zo-YN8S+hIF?vbg#(IjF`X}j!L>D-#eOjE7N>uODZl^18^OSPug1jsu4QMV?qZcPJq zYf}C9NbTuHtrQs*sEo1UaWZN>fl4eQILkDlqwSdFH7oq(3JT9n&}bH4KCYON9x}E#=cSj7U!ZnsJfM52jPX zkHO!bAA`dOzOVQ(*yhK9?TR0R9e&80;?Df&kBM8#JJ`jK#~32v$6&>e`vu4v;KPlvQ6FRwcaP;AjJXgkoU%yqWSGs9 z|9wpHq-TsLE7r>^?O~m{((MApm0>ZiG zIgAFX!@!H2@5YOq@R!w!7dbXB{^!w7yvU-6Ih}d&`FV;L=sS%!{0(=S7a@ z#mPp1V88uH@?$z9ki(8sro#@DAn7Uv-;Esw;rFT(I|^)eJo!i`cE~2bg3j!CcZy;M zDzTd#1)bSZaP;gb(Cj!`d3x?lH$QqK-c>&t^WB&+COqOw#f&jFGalU5i5W9tMi+Cn zzmzCujEQH)n9j@?^KInEn4^^+MsAE?L~+`O2MKR?m+{|?CF8>bbaxqVv*h-NJF%n& zmZkj;Qa(ydZ5|$Kp?lO-}RxBxuXGvjamJ}X6OZWhbvJa#s$dUEgbVd?~A8(y+`pcy6 z#*9hf7wc4inPfBLnuj_uL(bd4j7goDasMR6j7jm#nADjWla8JllfGU1h$2B9e!PTy zxBJVK@5YiT;U`6%<+y^)lA5iZSh7vCWJ+h2{BWXT$&`4OOzF&$DM!zeDc_=f{1XZ4 z@M9+e-tI3`zZ*ZMhPTuxeqh#2FMQ2?uoFL?)BKp)nICJ56hEfM^J8jfeoQ@jeoQ?I zeqfBOr-xJbJ(JVdRAFBQo+!QSMI@@jpPwP~pI{y&CihAef4-GkRvIqUZKc%aP2mHI zH>EMPY`d6$>CBe;35qSHF}842O9Em#3)ZCHc#i<`q?vMtSzOTe2#=`0mulYp`}ILK z8&PSN&6mf}ogKae5d5%Yrrl)bd@Huh3=h#wW~R-SA-_^=nG<8nlWH3T#huxiH!}+r zZ)V1Lqm;Cnotw~D^agmqakAu%*4bbKL8E>0hu$Xs#E?C0bL>KJO z3$yjkkJ(W)%F47A`<`!442C9!e@Po#y*pe{p!Riuvhad0C=Na|U<;av>3vS^o_z0lZk9LvCH1~~_bNikhK~@3y*Up(m_{ki?#IdI+f%xBq{bK zus2FM_l`IDisfH3Av1ib3jO98N?lK)duDLJf*AQWXUzA9-|HD;xYWaGD%xhEVNHbK zStKAe@FZ7v4cO_)_k!nUWrhz>&egl?B{@#d!iOX&?WdGXiq1VRVT4|$@IyXZok>~y zwd@&S8!nBthq*9PPAt!ZZfSUfqT5f?orxK_LBW=fY3l6f=^x#f`?6HxF36Pz_Cata z@#fIlcLyJquS&4gc{){-K>?y0zT$y|Z+=NZ@y~r(ELq>W>%dcXCds(uHGH*HNgJ=D z=m^LbWjOYkaf%gz7Ks{aX*OQrhwSH)La1e}{rpEf4+d2}o(b#J z7D<{xcM<8kBBQy4TDGzMR;O^_RU1ip9VF2Y#M-NRUsy+-uHOBxLDB_!25V@KzqylK zsP&qv#d z^+KU3tEb96W$QUsxYu;L5UH02LZmrF&fP&{t)Z#b(^Q*+QPK7gKAicYk^sPq$^sHdxHSdbv=HR7=8QClrAb zzLKJ>`Ly}u^rz(gk0wA+iLrW*5LNbyDT;hiQrdi|SZXP{Q9Ym*Z(-x}jstt+zsJ7% zy{Qs>TUH?#$jP^($lZ9kJef5~E?csuh+p4uJ0)Aad#dDgqt0nv626jlaAhjNCEINO zW22wsA;{~~)~vzmE|a@q>aHJmIqGfzcLnOsi|I312p$8DzD&~$UqEr;Pd}RtT$2!; zN(TByOYMF9XH|P*Lk{s`g@4943YF-qFh}xFRheSxg0Q<(3bJ~Slz6up(q;wz&I|kZ zsjJny8%~w}f9Pv^Ug=lC!mlt`-IN}9ExIpQ{8h^bNx7+1;T9>Wf zJ)UUcOelQsvS)VJmM!x&HZ@e&E%Y^3UsdUCs4Oe5s;sb<)Q%{tsqvR*ms?B9YJ3aJ zt(ktmx3;WqxwovozJ~vXh0V2&ly|{dJap z8iO_dvWm(Et8!VrzX4L^lDJi0)>LKrd^Oec8@Xr-+?4xk>&qG{xzicurmUiZ{|0?& zY@RPbUuv6cngp3^MfDOv`T|Aer7jCAC0rx_S#_05t#JbnM}LOff_n_N3wJ9ns~#Q^ zMirDxZP}tqF6I9EsiZ3NkTe=dM8&CA9IsaGA*)&%LRRIn z^2VmJ@i!xYNNJQe}mAL4&{6YYl1?XDz6%sq}JRQ(eck!aDcdbFDJ(L~pDIUN)g<`b9G* zPrBT?sIsgAIpCe%+|*cIQR$srwi%)ja@$Up5?V>)ipNPOGhRX{`$&> zGS%a4&ZwSalenaz8fJE#*5tYh@63j>`dB)ZbxW!n{BFVk5E}x#+ z<u_|$ z+lQlr{(Lx^&NciNlXu*<7Y;`k{_Sw|n!g^7{tkB=?oHguFCLCgn|#6a(g`!CSR#dy zZ?)>i$lL4@R(4$lO|!U+CRE{V@_Qv14QW0?V7b({cd&E}c}lDF`RXbc`F+$;!*XA} zU&P9wMxXD(SyN}K8`@qeNl@)eD!m8`+IKS*4VmmZt6{!%p&BUSeH2ATqzZcwu-lT( zqeLE*ojY=&wVpqKAzi)Z3wl1@VS*MlFN8FT^H(94O*Db2^ zFRinNQHZn8@mj?qCA~=O1vS;>P2TyHO-m~)>+mcii&98`Qx$T7V%9d28Vs?dLy>NE z4Fb~F}s$NO*Hze}F}i0g{}9-h0J#1U^%^{kFgB6NIaW7|)z z^0S|Jb?xY{BK(*C?0j^UjQGj#NMUq{BmXmz>yp3n935NzV(EZ9#<{7=7KJZ(uEKTU z&!hkNXQwBG?0Y*sHgA$;Z6@x5RvQF`RC2_RyH*Fm5N0`-?A~I z$iW3gme!U~Z?(2$m%ron>?wR>0M`fS!9_}tA(Nxg-*a7Ej4a`cMEh{>;ZkQuqglB9 zGo#TfxEA83<5u8;xLVv7>`Cu?Su~o5n}*xW7Vay#F2}9I{Sfy*xYOoFqi5k};A(IW z;CB5Y8oeKPGwws&pKyzDvvD`x1O1;zqi5b3ji%u~z9Sm_9qw-2Ge1Q>ZXxaaqS4Pb zN27nk?Y%b|Ex~2sl5pqqY(Li@a9w^wG}>@|G+KTgW#WD^A9QWq5RE=^Gx8269|r&Q zCcc)2dkXh6TmV;tn}HjJI|29A`e^j8xL@8FjoxxwG`b9TIj#^V^k)4K9^4v@KFJBD zdvWjlI2wH!zuma4xQEF1^4p`)TXA0pkm+mSBi9RYuamcqbtTyD>+b6}J$K6oo0dCX z$NP?S>^T3;tDT3g(s1Wr?j21EMcvQju+l5-pXrSsg~}?K=xeB4$dstE!B@N7XL<-v znFXOG5Bev;*kCRKd{t7-u;s1K~X_YS90DT0DqfbeG6%gv8?SUCs zcL(kP+*7z0aBtu~z#Yc*%CW4IaoM%|vsPR3>9&cRK?U4g5^t;ET12YlTEUnX)d?O1-&Ugam;68AJ= zmchfrqZ?Qp_fc(L`bj#jH_oQTZI{1`LY7sF3*hd??ZRba4tXkW z0WS4Mp5gAg$+9lG*|G|7f7)PKHC&J3`VsEFjriSSS?~SWvXVHpUdpBhKll?|@~xJ2 zChkI98}7y*lDFF|YcF9gzQ?leyvwql!+nnX)!mkL^BpwtJ1y()xQ&}w)chHI#Vz_d zvt?+dn?t0;G$;63gc?XwFn>EB+ke!!Z;2k_`J_|(68V%2F zRw#E!r;zz^A@hgl>5!xU|B!Be{(qTEM`%l`pJwqdeV-ns{$>0-l{*>#j#E$cpAJXk zHQ_1rt0jAk0zc&jCdA3$UEU;Z(erpnCu+Ovr1>?ShA4hVQjO!-!U_F{}-9@^tLjR zXC)`5_D>y@dYs78&QGr8X@WIP{5)UwI);B`co|N5zAY0`O*9u(HFQgmicRe0Ic3Bt zXJ2~C!i6J7By@wk)h$74I&rY^;GDk4v+Vyk7s5W13u!iq-94wAa!P_nCoc^sF*EkW z*54$%m*OOMOL6wk_7_4`IElW>m0h)Eb`&W#ZWU`ghlX1dz5UeO7c`ajnVDcrJZhTz}lB=%o@)bYXE}JQBh3 zv%?MIUi4uJCpxk?v2!N=Qj2oUzzxSqTnQ&SwK&nG?VnxaBY7Ztv4j(ySll)|?R4e2 zxFVeB(Q+@kw77lT+xe2K{AS>~<0PEu;^IUXx9Lf^RNSRFJDlk5;zXyHaH99y;mWy} zyuvaycaV0AN*Mdu>0ZGTJDjvzabDXKKe-iG?FzR(A6*0Y%3hlr&RoUs3MYL;+yI{0 zKbv$j4x!U1w@19_ZvuQ{W`+ltnCw$n1KDmi-!Y})0heHKY z^d#J7!fpPBaHwvva9att^&8Sf{H<->}FRunX_$4V~*2BxQATfM2Ftd6W+MOdGVLuV>n4)(w&P=H@6owxwn6IKA+@) zE4m7|L@LMpY`?u=`(C{M!1vorO&Gb@Jb#6Iceug56D+1(v7ddrzeBj9V-u{bSSW|a z2OYvKARMAP_Ooxl=n$^zIOcS*P)`1O^GtYR|27lOT^}|*xw_b3Nn0o+gCd_6;VJx+ zW-EQtP4D2@3Dy)5PUdIRv$6XsvQ2)8hGQbbG}bALtkPJgATmi~U3(&XG!}`eWsJts z`?W05SQ8eRp|P$lkqsJ4DYOjGSRL9`eO+UbpnB}nSZB;0=MvQlg{Ata_U|PZ)gLuZ zS6KR;#=64`Pc@cW(fvqcQIT|i(O7GK(l0d5R99*L8uw9GY3CaERag5jQLT8`Nci2) z0o)~8hOy>pqIF^ie^-U7@B`x7c#`#D)HPJlHa?8X8jHvy`FWU?$~a_~pH%}3F{;{> z_U~;KawD=;ehG|Nv$;xnr2TlTzE&mIJ*K=KtB+L!KIjVHF@4dQ?slcW1}yV!`APar zV`KH@v3gmXz;=Cjm_cs==OCNqC;4%=V=3P*<)i-uKg(@Sf$lRB{*T~7u+*gBcLXzd z))_4QdaDb60``t#?rr?P;<_FzR&3P09^*Sqi?;2q$LjsGvf-iZ!BWrx~& z@U_PO8S$T_*8+v!o8Ut5bmMCXml0!xvFUL|(SXRyJQ;DZYs+zg%vZZ-bbf<>6v?dN82X{BX7X#DR47gjLWFzIgr=ajRyXYk|T z^;fahW^fyL>vCj_iT``>zB1~^`2SVHBXoNk{4a1R{)0?-s~hE+$C{$Sy}+C3EPpY$ zKX@O)?nQ$KgAZQr_>Thbp9}8{{fXdJ;4@A5nc%J9VFoXd_|)$jgRcVbuYq4Ceh{3o zl=?P!1K9qFytxB>$13|tnspcWIv3syUg*NV0#9(^UxPDU_%ZPQYb^6ivz`RoKS^&d zcvY(--(Can0Nd^99q_#CEsH8q?MFZRQKY#7`=YwDR)WKuHzj67W3*P9$lfesI_yX{}cb)h%z{gP% z{Y$eh0S}Ej{+ELnxo|mnk_%UZgD&g`KkK6347Pv5?-k(n(pYJy(m$^k%piIq{aWxH z;CbmD>lq>mzQ05KM>^oAz}_Jq>wXjedGLPT%e0&LZ;F4u$NJFV4?Dy^B>wCYu1e79 zc~YqVQ69@{!uJB(Kgs{`;Dh*!u?WfEV6c}#O1Fn&tO5z2m|*o(?c*4061Z@z!{773 z%SJnR8u$#C|Ha?~vP)V0(yTe)mtFXB@MIUB56*F6=|5fAVxYwu)n)`BzYJXVUq8^K<`$2#4_zZ1OaDvx!E@&6?_XO+jAZ}4N_ z9V;EYTl|+hcpunW;lzI(Jnw1;zXL8sY5gPpR`T}=c++Z+b&bKE?&Rl(yt6j^I0n4+ zCXcmPLSCzv{wQfOooZ1^8Dkd?ol67p@22M*Z0ImVmEu`L6&E7iOwonsqIB-eL!@1Fvx5 z8^E`@@J8@97ydDLp9^mSUtjOg`vtg%OcG3bTfpzR!v7llr3-Hd4|aur3Ow3{_kd4u z;b+0WSmMy%2j1nvuYuoi;n%@mxbWNHnaxi8Fu3nh2Y&z_cUyzx?PU{Q1EOQ&I6z0!ehZdb>TwrbuL^2 zKFNirffHPK7I@rFC%w7g6P|K#Irz0F9DF7CF&AD8-sHl|z>8e?8gQu#Uk7e}+@Ti& z-}|(KH-di=TgOeaegeL0kK_My@Ol@%54?D{C3!eeL(uK3Z7rO9B@JJUP5ANr}6Tx3^ane5@{I(0v z0Pl6-IpEDM>;vEE!VAEc{L-OU3!We^DhxlHz*#Q*eQ98d%znWb^N!0SGv-B80>f9C%|)EcqjOBS9^XMJZQT^PrjN`%Mwa(SPJ_p-B(H|0fBJV%)Sfa+tc-9NN$)yjR z2EN;c^T3;3_#E&y7oHB@>cW?Tx43XQIOmYZ`rM>f2j29VC$_$@Lc*K%QBT5$(VM~c z`lu(Nk98;bv=zDp2?=S|qu?`GpOc^9=fUY}M;FAnaI0pUc9OgLa zN5@kBf05uZ^bzHsW|f=pqfL0f z_(NY-Y9;(?<3Hc{-vss!^r-a@@&6fkyWwAN)(1C(pLF4eCH#23J|W>>0N0=3u~r-U zZ-8Z=+B}0l0?)gacWMSF^x}pe>WbQL)ZgGUz*4>?wx}9{Te6f{TjT(RleUEe+lEoJ=X#6 z2d|&N=~Mh9{g1%12S}Hvua%On_uy&V$La^pKp&F!F5w3WZnemX#v{S9U++$XOTc?v z^k#tNSB#VVmK%(Ut8lZyuN(ihV0niqzhkYQRtTI!`_=qqyfWcECjJA0^E_6j!mKZV z_mARLzKWk_y=cPw6t=AQ!LqN=F5jo%Re$tYulCdBNz$(<)cU97w=Xz{`n=K5I}EOc{`AKj?#2Ia#{c^YGgamljO?j|#mYYuEWZFw;-4n| z?02-=>lpApSNi9g@Uu+#QgD^azf8gplQ$un{$lWY>c_6nYa~9MU(1IyYlC2Zn!o5? z;8$Gq?g8hJxqApB<#|+ahR5=m`foS!KUDs#)qpoqKcy!88{iE3^Av+W0RO>7{}Zsh zxIEkVdtkz*G>`RL8kD5hN0`EI1@jlV9mU^P#se?+;y(o}dll{WaT$0Y{)3HwHF!Vy zM+BtF9pJ5>daS=IdTG}0!Ll#;HiQ3W;y-B8`_$k(gHsT^^;E{)Cj3Bf zDf8oMgNK9Vr`rpAaKQ&DPb<%a-#+nYJn|a6So~f2`#yLph0*y>vu*&_|3I(LO8h&( zrLp?%V{HNNZ*keM+%fgBOnPAz&{XnvgKhF3=PWfMGu#V4r5AeKL{`*?>;7#!7 zOckE>78Cw?(;jXI%f4_OzmK)q_{)@6(%)+EA53~L8vH%u{}wpxN-qLF2>BAD}rCB}Y1v0;>IH8{jmiNK(%RvA18h@5(lz$$0>sr>w6;87z8-G~`miXo1Que7| z!M)J;OZc-awZ1EO6?h-@dx`PC9xQv`?eg9Z-hVyqi2*~x{|da`Rh}on@44_!a6R&F zl%cl|EI-|!nA;dUnj%U5J~5aqC@e3~3r9Qr=+RGNqc7ql{7`TX@~%kXG;6%^-)Q`& zgJ;I_)5p3DydsACT6JJA?bVk5SA!3_{MUfDe&VqX8~Q(%@HD0w2LBSA%HDqYNquYu z%g=6KyTBj2==~3P6NMW_7~$WaOnA9Sc@BvGwT^!ICD=>*xYC4A6UOn&#;Njy<@~`b z3a43TgXJv3-xWX8tnZ*sD--@l#{U!WskleL>(Pg1 zB8Q~BZD83Ouj{w3^#*v=SlXD0e^BDn9&G>5z%{P$Dg9|1F8>U${51cOV_CCXAHNl1-knxsy|VY@}^$YF@B_Tc2;@%;^{Trk;24OrH-lDGr@K(dES%r-e2C z`4}Zpn?QYK&C4vYLQzwR-GS_pV+!(_fN;sR)Rs|SMRRTKayx;^(FJVo!uhKa?;$lw5*}dhb0Xufxpg2!LR~>Ef8feW2C+m=u5u7|A9dYGrMG6V_9-^$iu(2HHm-tn}CWYOw2JHTl#b_a>jRozdhohu^1;&bP9s zjxLbDk@7c6{zl8+7|Uh7!rc0_(GnYJ^CU4OhBsnBEN|GrHZ{`eK_iFP%41Js21s1- zVg^WD&qznxA+euniy=1BCPN$)vmD|)Quab@XbgbFpt1vEBV%mDhGMY9zBdL>Y#6g@ zVn49=FxyzHli2sRQ517^tb*79)YfPlXfrZ4(iIy+%2G@WDN8XiB<4$EK-r3kA!BLA z#@gUa48@UAc4uN?aDwVu*c+n2)kP zVMSQ4<61s@4W;VqRjm#s)F-HTDB3o;oKQ3qoFFHf%ast-&mg z>a!9}%-A5)vZvbaOPdo?s1?71i{1p&>pFh8L844sS+BgQW{B8;yZ@_f{~Jy zf{_xwV5DTGV5H=xV5Ed87%5>!j+HPY$10j*CCtdN5@zIBMQ7|7W!8jji=`6I*2*Pj z?ZjYX^aSoTHHti6w%npkbIzfrl87ffg_fITcZ`yj`HHO`)zE9J|TqUK5&bA=7LWBJR=k-uE|8>1fP zD1TNY36LWpa&sj}ZmxvM%~iEspz60kLgp1n$h-mxnLkod9H~f-R5VAb@TyMoRGs9h zI>}RYlBenD*ewA+-9V^t+dTA(f?4nUYX@EYl5}><2X28UHfkan6s;*)P z(=N(OWF^*SmM8!}X^uWd$c2^KTS-=*F<4|rR$-ee8AIjCd~V2v23(155xugZy4<%6 ziv;$4V^xjo-g!xSxvER#sxFZ`Mpe7&7`durp*xX{U0 zRh^$NohmTLORHhHd^k5WbQl`fL6l#zU; zjpU<_5N4F*Gk=syMTvv_Q7V;Ds%huxOy}v6<>{j3>9XbN!sY4G<>`Xusa)jdscdkO zG`Ogu=jSN?x34<>yG!x%q7NRTtHn@^e(``MTHS>u!^;`%S*?IQhEg=U zb&2vdm3&nFq>SUR0R5bd1RdisiI{AFnqp(0CY1Wrxf&oKO+2zZ+d_14WlfE}?!iDEe zv=-2_3kyr8o>w%{m&XxFpAVxZb$*5#tUO>%&h4i}y_vzN6L0Fll3HJRb7PagR*$7J zvWW1@vl`V1yPy*VA}GnA!)qa-&G?DMh;l!s;IMRM(?$^xCWy7h+Oqmi#89flGK2`j z>I$(pAs5>yqoSb`(BqY3&Cv*Ue|-~{y_ojsNdV8 zDX(g97l8_8q;x-#vAEi#1Iy@*@V~jKys9iNqPFQ~lo}npy3vObAV%Jb>ax06ouS(L zDk^0P?oLHov6`!@;!0yz#bX?!dffpv*K{Mam4F!E)ci?>SXd4d8Kre_H7-(zNI&(! zs9@?|Qns~!S7_TVobb=q2BkV^lXmMX$1V}3DPsW~CaLy2O_Y?5{Ea24TewXMwl~&S zmRB#RF7H%Wu^~qemGx6n7eR$i>G#t^W7K4dpnFoI5&i=5cH zi#XU}qwdQw1p=Cgs)`zwh%%9?b5KkEw4SetG*Z7PS<3nyacUJA?M217L>atSyvkF} z6y3&%2{q+WwC(AEu7g-Bs%_@*FAaRTl%x~O2o0E2Soz{574@(d?1BP})`}e+~sa6y@Ilp@^xrrrUe*Lp%`lVl$b%5c2!duH|8(ET&e4U$*YbNxA>=M z**boVzq($!V1f#6bP0*2d7%10S^45-Ch4km>J>s2IIg_0PEy|7&>+@TyBMTwO(aJL zRzln?IJiWW2)@b7bP$z&)qPZoMrV+5t)iwQAEarErRExc-NFvFr6Q};jos(YiV%(J z%CaS8GMLG-tF||5im9#j>Kq}SwDJ?zvXsbjHz^f!ks7W=&?<)7F=$O)$?^qDF=Xp% zg*npMmHlc(OtFIMD67#K(KSv%mdF@G8cJ&Vd{`;aS_Q_mWmxN!EBZL=*!2H*ZGI;7HM;Ri9$)Z9>KSFkMd=y6uW&3xn_eQB{2Os1o8 z^Jz1AQ&_Y>6v2h+D%#IW)U(G ztJh{oFpt#Qo-Qq-Pl}qa1ToD~=fZSidp@Bb3e#-ON^~6ha)rOyCD&91Ycu7VxQsAL z)i#`{sw|_L;*?=E7@Gd0>q4q5R*T;x;S_yU;i8Jm0z<4g)#hGw0UbhFhO2F^>q@(q zPNcP9s;Mk)q7tLHkQW-te(y4Swxma$PSvD?k#KXp9)o<9jtNRtPxkylSz?cCs$Gl| zIWab<#;ig>To&Y=dgfJ5r#2PKxm4{m$)-IZ+u{J_3BAVOAO_|U$>s5bfr>A2O`pQP z{IZxNai^V~uZt|Kv&Z4MrY7%k+*-V@Vm-o2lcPAM=9uI8nf74cgvZ)6J^3~xs;`Wx XK~s}VLX}joIVY;M9%&qgmWK*0oj!50JsWrlztDg+Sne5<=>cQPdR^Yc9aKFepA z>FTcP>guZM>X(@;%=Qn9v)Lr$7cbo`QEFcnhlrar@u^suEGb=TEoDjFrAt`Z1YWe+ z|39D4@r=79xmh`aw!$@a8PA`(tS5sT_uUSbl#aLIcLOgDNx~}^c;y1mxVxwTe#Tvp zk?ercwS`xA!9AIf@H6gImVUWE1}4+<@d+H!dhbrm;Ah+oyxV{$vUq|2<9~zC+eLjX z$z?@6CuH13b6DFtBa5N@cckORP1$zI9j8le z+n2{xW@Tj!8a~wRXwxPuY3Zug39dfGiys&LM&ioFbsMfRxbDC;4%eNy?#A^OTzRN%`VVw*v88XoAsW5w5AYrr|2aRf5aq9C3dD_j%%ZzPQtE zA+B)dN_s4KOf$K?JPvKgD>p5J{<1&6L z@$dq!RRZuL?l0kb8Q0%&{R0;%!0Wi)!1Xq+HMr>aPkxi$!Tmk)Ot<&N^Ez?=FYX`V zT92y=S2ZsBZNRk&*JeuKSA%OSu1|68z*UE97p~87(eDdfU*g)0>swsk;i6xc&u_YG z>n$a#yAOV;bN=MFa^6a7Q+RgMynLtq1^=vGz5d++_sk)G`)}W~D;Iaf^YBH3(zgBQ zt3eCMg%2(3u(aT{{=+h^dFPuWKQBuC?v=;yfBdr*{c5{+wvRY{{n9qI z!%m-d`v&zxT|Yz$K7P{G+5YmC%h$a0@FxpXzv(xw&CvIr-oC5H_&+Aj@#Mer@v)!( z)hTe*^MgX8hrK@hwO5K>Rtlc-eRcorqf-(~2G6~@Yv)q$szG~?#i#BUmuuM6?+@U4 zbLyVV-&0TgeaWrqV;-CS$c{truUx!fRL=I@_mA(s{Kn39WzMuY>z{mn@f*31U;9j} zFV1E@*80e=BR0paTehz6BD8zyr018}YlhyrB*U|JiLb-pm1958aaQkn{Pt_#USIIX zM~{vju_beE?H8wRXy3inIn?*mZ+R~t*tc@AGkw$Q6A$ zpx>tjIZwhk-<;fv+BFZiw{ITqYk{B1E%0*|Qf;o@Q!VuS>n-pzs0H}07U1VwpnpRP za{dK;Hm48MS}0Gxxw-PaS}0%DLcgzXp?rEm^K!ehh5m*3B{weXZ&C~NeJ$vN+Co1b zYeAknTWHs`7W!p<3-A>!&^g>f`HB|!oDI8fPTwZ9z<;;}`fs*SzJCkyY}JBYOhAXY zt(}7O)h*PkBd9|!!{w(q97*0Y5AF zNzLYfBmw^&^oh^Z9A3V&fM3q^u$|-{!2z=jIO|7r@g|D+%Ed!O}V zJ89yjynHnWOS=s@2ssggG5jXcJb~Kf67m<# zmdb>DT*Em1xA;ve5^_$l$ax6(=_qxPCO+1al{ECNuPE=fly5KEyJ|RRBq->g5%A+e z&LGQvBLtoH7CIjaIpl_Uxsi|;{eBd5a+5iIB-yV{z)QPxxKIn}4ME>!p}!7rl255c z-%>=qwL<1*L9McCb{ z$9O@S)9-fBr+%4Z>6cc5zSlzkRUsc&7f$CHPDXlD=&bDe-aVxD(}YW9}sjViFWN19o1dHvr&xtrQFK_ z<;QK_o`ik;T3Vj%C(TA0SepYW@;UG~y1pns3xR52}DZtW7LC0^Q^DXp& z#*v8@`6r9=oh{|}ih3)1@p>T^_FE(PFBkj>HI-(e80kZmmzOifktfhWRPQQFy@y1- zQ!Vf_LT^{~;q`us`snwn=$A_22T+Xtx(PbT7XA;3^0~r~8T`L0=(_~m(34e6Kf6ff z7CW6G`aLy?^D|1+dzrA)((5_=ii>&1H1JFIUTUGURMcA~#;FHIyJ+o;C_&*f+!^;e2T{?Ca1$`bzkB0*@K zfR_vXnJVD(SbMu%V2=r)Px4F^{22Y^67n2lk!M)IyIbH78}boxo#AJ;pghsf%HfOz z1wSj%UTRmmrCmP3|0Me$M=nU3H`0&RT#28F zLO#MQq+^C0#Q1V6D=kS*qh8@i`ip*`n&$YG_hi&SA3!v&qq0$ypc7q`%#%4}Xx z7Ug~5hvYNWVy78GPqIWjfF%1Z5cDOn5ZqJn*%o)!UN0|a$n9NGzFhEQ=+Au7t}IKt z5=Ff(F;F}z>P-{;m-;wBkdq!4@O@o5BZeF@g`P|larG2Ir!V@E@p(NjFS<)=FW_#W zp9cS53%x40#9jXtd>(Jj>68ol@1S0iXQf4++fWhd&v=Xed?)CvxrEa({A!+%Pr5}u z?+AF31uhFZZd#DXZyqNnofqFO`9=I%JYrM$(vkQRybwa%s^q;n4F=-B{K@g;q-#ix#nzvfLn3l42gPmMzFZpT%u&sy^t`6P<~)) zS;=gvBtUuw`8Oq(Us_r`SIT3(P?SHdI9S$1F!^O=`Aw>yUNSidGDX1|1xx`LB5z%@ zuxW+Gla0E|3QLRg3j}@QYzh;wq4iN6FUx~2m6X9!%*`TwqD~k60S34#G4tX4lPVa+ zNG~}0l;V;}sEp|;*EZ-;fQiFQpV^BAa34<>Q7dLbhYOkjcqY-!n-rW@9GEu4Fh#0v zvNUZnQ1Yo6cq*JzT2cl*#$!Q#!PG)}D9sN{jg^8$OcDf;#|6!bmrO6sN4EedIv-E@ zlNtRoai1BSMEPanK0R0*U}@uF^0ZkjE$$%Bv-zEz1W`A91#8m1@D5yDTz)ZuGLwsD zH*Gr0Gl|kj3&D}Efjt-8mp3VYrs$vhrp-XzQ>lq)U%~WJrqxCH#VEk^w=7sFk?Wd7 zcx8owVA%}L838#to~F`M^Jh+tr3!@XSVQi!WP%hk4VFo`L@&*RjAZs4p2lNI0lK-U z$k0kcFsJ!*UZBM2r6^gZK6x|prx(U7VS34|LW!&!&Be_~M!SHh!z;}&*)ef9fJ78P zud!RPR75=~OnVwUc8q!Q{)V$BVvGrlOHA7L<&_jqCLa&~BtSw!lr51a+zZAS49~&R zJoqh0&+B4I#DO@}tm3`{Nw8Umf37uDc`{28$X zhS5M-5aYAp9%-Sp#%RVMG>CDgnX<=hhlb%`Sy^GU=O{fBqlsuDCuaeb6;7U37NuA? zr=W>ePtThioQ_eCB#Z81YEhI|F!esEG#Ds=;c(Ji&U~aDnSJZ1yfJs?W{(=iGvVh8 zVP>RI)Mr!CJ8pxC9sa7YAPAWX9bkiY(KKVg7Rt`4f~Pq&NHg=D zT1L0B0^EyAP$wrqm@r-D3>igwHhf%BL2(Ie9nr(w>7X^!)Ig+|KB2LBG(4eDVObdh z1x93YVNpIjo#AEC(}go;@vJ5c=8;>Bsy_G0+}jG%DJcy=Ll9IjvQ2Sg0v0kv^Dtza zT|Eqs+m`@BCGN}1FStL5PUR#Sq^uBu5gHohB<8E8&CHuLZAu=xXj;AynHXtFOW{QG zCrj`=)bhMM+%Z6s-o=Js&XghICN@p(Rg5O3aCl7c=-D}W!5PFBXHaAmARC=-l*7g}NpMN&R7$flH%NJf zlk)@lP?Je;(&(VF06_4?!~MQnhUN|EKcN4>=yO_H^zpj>*GHezVvpCenGU8!QXKx# zkLG~<$$-XE@$3W}<;Sys9EWCy1TiSYv9o^!X>BU!z;hc>hR-v3O++2jVunvtTT2ef z_W%F;6B59FCH~#Q)|e#84H*V6orW1}Yv~EV=tueEFUU`5l0WH!{CHD-f>b8*iQe+% zPhm#iMp`9cflH`9hxEEgKf&@_N$-ht=V{Zh#9@~pZtd+D;C z?7@JS3V7usP2t8m)(Q*USg&1Ufg9@(Yb|hNov+FQH`bxISm4I`Q>_JV?1SyLz>WR1 zeHOT}uccYwYsGrQaSPm7FKMvAJB#%X>CvY0G1f&K7PztR2wR+Sa+8#@D#ykt_5!Fr;WG3jeX;Z7Wnmo&QuHBSRX32z>WQrITpCF-cxRYPZaAw zOD%9?eXi01H`eu6Sm4IK$|?)o*xy@ify<&@Yb|hNAE3$tH}-RCEpTH!exC(ytZQl( z_!v>|aSPm7_i|g-?~Jq|C&Ny2MLDA$13pH;4LKR`r9#gQeKg>yqI|if-bzuv(gI&0 z;L_tw_5b)w+@ClsaL3;`++~5g1w6?DPZ4mp1-@JCGo)DHb42-63%pXm(=G5-0-j}o zyImN zO2Efk;HjeCi5B>3p$}6naMvnMztjSk1$>SL?s$=xFSo#R1$?OmUM}cVTHv(;zQO{Z zDEfDm1-?SiUu}U`3HTZd+%5d!S_`~fz^g3qRRX@n0?&Ppx3|^;A20maZVP;>fbX-w z*-H-~rCH#q!jB!dz}d?ZDBoa((}5}aiE+RfN2(0}Z-K87cI2|avjm?>7WfuH#~2R{ z`m01aBYrgCs|DPMj|})40Z+HkUn|n9L|lg;8&P)bx7q~9)?D=G7UMOQcSoU;lwyKk zVS;Cw;3+2f8WTLj1m9wUn~&n}Ho-ln@(m_3=yG`(T6FkKP#};4o zmuiA1M4^(DZi166j9-=sPIVhU*#tNGhVpVv@ODOF+{c^Xn94+d6HRbTbfUkhCU}P^ z6yvE0Zk*kq>^UYlomDV?Nm*-5@UBK-+}E1m#@S5Dt}?+dF_qt9f?sNa*P7tnOz_<%xN+8uviF(b#+e<0 zYbN;R1Q5UDCb)6ti?SL_aIUEWVR=k%uM{Ar<>rbP4Jsc@HHm5aW;yw z*P7s&rt(!L_{}Ex7887k30`Z0XPMx;P4HVx@O>uuP!n7;!M!H1*acEuP$>q?;j*XJkIB>w|o>Jpg*W-U@k1RY2;K*AwWNV9)PR#JD$VM>!r*DG22Axe`g*UMS@0ZNk#*GpNtjMC(~^@%KfFQv(4>$xmF ziPGe%^(>aYi_+wx^;DL=ozmo*bvH|opftH;-Nn+kP?}t^F0u4YlqMIfA3sO!A3$k0 zrT4LPA4-$+)oWS$3QAKbqgS!?rIaR@tgm6|PLw8Btgm9}wv;9ptXHyh9Hq(i>g6nb z<~F3s{l%B}ahbc|2SI=eXA1F;OSI=VUZzxT!R!?Q=os=dQtGiix8>Pv$ z>MoYvKxuNRy2R4!C{3)Rsjp$_ z$0$uMQeVZ=4^x_4qh86<4^f(2qF&C@4^Wz1pmTJelvyB4G>!jDtL-2P=5C* zpXVr>WHnvu*Ul#SRoUfH+xQ~)yQ+12Ils|#s&^pjl~J!( zwaFLOt5LnEaxzufJy{lQc2JvLXl{}|5S2N5c%g5o4^?pyQ$5$Qdd@=1RL^!C7p8jD zj#N$cVSDJXO*HN}Rl=KORKRI}jd3!j&uYT{TYE~Q(Hf#RpV7;5sV+HED(H#s0;xHU z3Hoz{ZPKqu=2o~7Hmtf%<3UY$5%g-fv8V~ZLCb2e_k&2dj?7C<_$CS=%hJCEl8K() z&657Mp-H|;9^jZnul%l!Lm4GrD`)jXiIi*z1v*5cwAjOAf7v5=t{uKEJUZ0wv_7o;Vyb1(JuisVy%)4o61*cdvO0D;xutgR%?$_3{$aFkd( z2uCYN20n=Ab=O0Ks1>DX1r+*DxMjam;8O0hb9r*8QF)Hd!Da*ZUs2u%czqyBYg4;nY}F+8#Kb3FYE*$?HbJbk}N>vJI0s6Is!z7}*? z{7BsyNmvYZSJJM5 zXzR6@zldZ$)C%(WoQys)@IE}RL+3DgOx!O?^)Fk;3k(%(oKU{tBLy7VKFB*Ibfyt% z>QjE7cPsD2eAJ(Y7H;$_Qyt1wdkx#X*KPvK5HCbI)FpJ+#Vn!e2(i(SW9I1u@OM4u z?-M+)J0|$6+6Vp~Z;3yd6oUM$!5}o+!^X0}?VQ1?-vom&Nr#tlNJ^rufNuDeL&Tu= z0d*SlJ-qiBlY(6_mNC15UQHoBmr?o1z$=MQs1uW867jiAvib#q3WG)j0I0Kc&&C92h_~^Ghy(Mi%9Fas;gdZdCU)D$t%J z-Hi*_-|#w8}KTj83c4=Bx#uYI#x|v72z$a5yYA;T#50rYKx(xC^TCX+8N`g#?Jjujn~B;QfPxqUUY`MUGM;? z%|qnA9s-cGTZl#^b0J>nk;U+-BwPf;)l#Sz)Wn`dJ(5|70;uw04jjXQ<2msB_pIcj z;0+~x9H?{PO&plPfuD0=HV0nAf$KR?yq_!@GTBJSz!Lzno}>O}-X?Q_JQ+ zc`Z+-QnDst5A>9Nl=EaG-4jL%yv33YDvVLbq5l^{no0ky@x5mZ(Eb5R@Wq%~{61P% zF_eEBbk+A0R}KCftM4G2;Lp3lc6>yQWnsb)o&v(CLI=2ZXT^Zzr3)Vq;Nd zS{36sI-j|qeEgp%KfpvkK6rK3$<4NayYBp)D^OF$movM`1t*>FdT&In64gp^4b{u$ z8*0KcStNZ5cMy-W`fpL4X;mI&izl?t=?OK&2d`r!`<>ii3#5QSlG11RxN*}!4#cE-plM~(Jh!)6_)KQMQ^L}->E4+2V!L-Ku4#E#c z=GZbmo4+$+ch)t?1+{YZ4|dO>>s<>E%}-RS>kmf9@3bo34v_6A$dX5o%2!t7B7qxh z;9FKw=u(GU^`NPI z66SJzIin_U1vLBtN)Eay&_xb4+5#?WPM{;I`4=xnRYPw=Lma`w>NtCNXYfFMeN3Jx z*gHlq4fOg5dRH-e(J0yxXix1o+NqARhqnfgRs!G0@p(N|{aRX$47OLhrt(g5%xXhi zl(Y6n5~|NZ3`X?1wj-b>lUz$Hf#x)=9GcU#(r8Y%v7}pD(zNnvE>9}3k#Pu?vLrd< z6iX~@=UiFke78!5zBIB%^8Q-890(?Sw6{$r2|PW}j%g0>X+6L~0@4pQ;fv}k%G*%h znBT5ELn@HCc`&I!CplwR;O3JXZNc7ZJLY^^1$(Hs+C!%sgHBmlk&dcmrIuo0DReq6 za0K_XoeUDSC%LAaiqVf{&_oz@Mpy+{|6uj8mygLCZ>$vg(?$M8l#dKVT>39Vux%zQ zzl8SN!dnA(D97tG=Mz;GRlz%bN&{StEgOz^TzD%KG%#M-;8A|@)Sa$A)5CM>GzmFt z&K)S=tau2|N<&=(XiQQz)SX9(Q|E|TdDhw?gasXO2MRKz=kh8FbiahNV=^AqZfD9YUJKuO^!y$D6G zI@Z|8`1lBXL`j(V{+hw{6(|?=Z~t4Kk!2KxW`(y}CB&V`$7zJZZsh=KRkCmMc;Mjv;k;G`*QXQ3h{^v``wn3S4PvRLhD7_5^2hOfS2Ow4OlO#8xLAonS+$3< z8&OH9A;B501+==}9{$$(2ne8t;aFBFajXWye~?yPO07}!70Qo{a-~)wrsx4bC#xM1 z%{ar$s9-0I=?>+~&`-|L`Gnv+T4t=W*}lry7~HKrhrZ8F+nSxWll8|4HLzV$yP!yT z=YpHOk-HjwSnZ7r-r`lh@ki`mkVMl=^CMaHcY*iw--M-|4GurVdUSYX%%wITq6lxs zCkx-^a)lWActA-eSGX?r+z6qY^v^SfB*IpuoZ*GUJVG_)v(O=Ds4*cpmBne3C{DY_ zqx`0P;i>zh?p%21obg`ehw8&U5T=auL^}7S_-)(lo0MbP2TXAS*M^STdRtN4Fh^Z~LVGp%|>ve}FoFALeG~OOdQv&6za*7$^TSV>Xf@Da8$Xw4vA?y%x zh>74t@MqC+6kVF^nawv!zy`$6dWmK)t$&pyFBVYLsV?nSRFNG%xFE$7I)X|@M6Uml z^D6pZwbnC1R*qqj5;F^ZA-1I~^|93)shR!uQE4Jdvn^Et4bOnJT^KIIa zBUliM$PT|U(eXZUk7W&Gyi>{k=IUk?XkJK>M`YhBb|KCH|u9SPB&u{HRM7j37t5w^_KdoSNFVe2H=RHA*8 z_Vwgzv%tYYzp^j35_I9>8J91tlsdv#Flt&%e<4)}I2K=Fy+@M^zGqt^Y(W)@k`y|N zWuJ4-NB)ks%j#H(xe}6-+7=TBn&!0%`qW$Op@zml>&WQy8MX87fU=GPvvQ>K9u$N( zngc!m*{6K0t@we!i4&nESk-tKnI9ptXwX-8I6y@ru+#eb%_Yt`94?mQ9DHf zk>L5Ek@i<-R0lFhFxLa^GN4g!BvJd^)V>tz<5a&INKVJ3)UVD<&O%4a#yA7hkt3s% z0*>tPNxyO?c&(o_llKan|NGPpqn2(>ye zJRXhrtfhgKoFUD^AdeBMH{LNq@x~qZVbbW!Xb2u9D_)dSa1vFGhzvf#<$SAZuNk4( zYf#FTo$>L)WBLRL)HEJ8SwDmlr8R0x|BI@WpV`Vvjn)==bm5ZV6CZGY#=KwKx<-BI zdd8P^J|O0YGR+TrvC*I>dA7Rqw2-OIco*hg6}%LZe>^oBRlp<0^j%H(n&;FXr2c2# z(&XQ$erLD?rUbnANjs}AuZh$MrEcZOepD2XL!#S?g9HlyM}y;S*{ z7YQy@e)nLcz@T1t&YN-08F>@=idL=lsHk#=S0Ul)eM~OcZ}-?ft51rx#~1q8=2Z~5?t>p1!8+JadqszaMFLkz+K1n><({vHM!Z-Q zSkas&HB}=+4}H*LJmB(z*d;HG)Y-~54~9e!#zbfMIY7BQ zmg9-ZV<{`xDO=g)2^~POvkAdDC#!9NnVyqXw!n0c@~g4~ak!`MY~6VTx%pmYHxo{9 z9A+_dZXX)4$9pii-x6ux%A2uew#S3fHm%B=Q8zm+r{LS1f+{S0_^S8C%aOnd$B4+h zy%^Guz>jax4nPuU)Uy62wP1dr>3p-r_Mm^CjqwD#PP;zl03U~%rGKesJ7S*8iIF6Wd=%`xebfBK`v1m2-9H5UhO$XT>%=3%*E$%i5@Y|1AJ~zmxA7 z!Bw&y;ix@(#`-Y!k6~dBq!T)C3)~HtllUGS!BGr83%aF!OZw|m1AAc7hvd*kjPD;y zQpTQz^+;>o){;A_(S{;afPOrG4VS5!MSGQ)5qR$QnD;AXbqEt_TeUTBa9|Uv`#TH( zmDN99$uhC>XA2~PT8F-jS`+^>9Q(O+bi}RHE!q#EN^PnGpD+3We{y0W_7(7da5FHk z7nn`yeZ;x@zvu-oq<2tYlK;f2Txsa$*1@4zNqN2xaoASQ80nx@P$)|_TGr4y&>xvo zqM5E>|4@S?*c+TZYw*D0Mz+)gzaXo_Tyn;6M_`W_kFh=}3N|Sx{C5g=lY&>Gie#gT zQH~%2@!>8tt9^7P3%XYSY{fs=Tks#lcl# zhtc15ra#}a)|uDOnDt&kmV@OgjCyQ){ljbEtVL5+8YX{-|By^p%52;CD-iHY|Pzgpr#9Gb1>AUfH)U@*6Z1ZGfI~Hz%BH4K3OlC%pG&y887djK? ztSClsf$hQAco!RqWxgS;kw>Y;=6{orE#0s7dl9_*291>hJ=xHM%^%E!qs{KEj^)jU z%^A&3q-KNt#7BBXn;q!aTr^FCCL+0c$yj6mINfBAes#8s+)4mZj#!6V;P4Ha4hPiA zUvLJZYH(K2K$4wyl=f-5)Q=VOuc0`>u!mN=y%Z>^qcLjzL{fbCDo8QZU<-bi6F%y! zcpkXeyg}h?1eFQx(MV5dMtjT-C3XZXI!{Sh&Ke=I73bzkg&7=PEtJi7O*tKO{cIrXaV>FLbyMGzHs{VSD{>3`x7aSU;jtRhz zawY!(9nuY~qc7?!sCPTnAC1b96$$KNa|TH8N-W_ZR6P{UPw;R|eYm-Q&|f#2)2zQ7 zfUwiSbe`?c$nz-(#bgQyt(%qS+s()`l>Glzp7(Dy$y3e7R>3AA(!iZ0oQvw$fPXGJ z+MkSS{E91t#zUS%UG)zeeny{^25V#Zw-8O4m<) z9p#H@GwT#t*~Rpnrj(dU2G~?G1+FMq5Y^>`;6RXZL&W?j4NWiC?MLTa>{m;1j*9%~ zCLE_pf{G&2)xLMryd((2|G)Gaar!qTH(FHWds>NgIO*1>Mmw_`MjHB9jAw`pH?UDK zK9EehJcOE$c|<}1Ya0}tN}BXPl85*Oj%lxUTO9}u>Yf~YqyDp~f5Bn8;r9AxP3b;J zKO9XHKW;Y2xz(;>{W3n#lWN7Hr!A0&sRGMI7ur(;a}g6K zyVlVudg7$lPU7V5WLKbC*|2B>pjpnPh^VBMPYYV&(oK-XPHx?g|5n@pXD2thxPof;o@Dnjg4yXt$z!{Ip)@R|%$4ENn>hdY0fuH125p1Sdh; zkWG-r0V&<1wrVEp4rHZz;PRWv8;iV@=CWjEEGkQ(XbUT2#mQN;S|-z&ol9f(c#5_r z!Xl?OiMK^pWBpE6el_(nKOKrlgHF1Kj*N#}S$;XW*)M&{XYwEig2HMn^iVIW9iu^E zAN4jK6b=NOB8yG7V3*K*iARNVE+cKkuJc$2&bNV2Fw55RCMP4_WE=;G<9W%s;B!0- zBnyf%-9;{HGR9nG0~DaUM-4jIp01C^#DblE6}qY>{0id!LFvwlZKOougF$Eg5a@Rf zga9=<80hbVeqcEG-mf%jv$}~9avv~X1!fM$7Z-(qh0LX7VG%s&h}dsHu-)Dnp>ch^ z8~@_rValH5q>&M<{S z2*(?{MFsB+Uk8{s(*8f_AxO8-g-vwKMx2kVLE2ZK-y&8(^FjdD^J~z~_nEaSRV(8f@ zD#jHQBphYvgR{+&tlmod^1FOoAUW3DPl4*iCd@f)54o4{1kZ!vTgsldph# zV8d7vP5&;&R0KP1%Pt}L-XLepb_A}G741)%JH|trBO_SzDPL*#W7#{5V`iJ@tfwh6 z)-KzSInE!$O>w|y&|~F<7ss@e&9u|xSLV22h+dpTICY^d-T}E$%=rlz6SkP57m&Iz zy9y0z9sCFQ{ya(WJ<}0<79))2h|74y0b<9i-a5MSa4)P4&P@mV(z@Mb$ zZ$Tg46EhQZdSRsuy+?<`KE4gyN*yl4-I0+rwU8i=PO9-_AhaaSMl`FHz{`Betb}U> zw~|3Qj(N{hi~*84@C@0Kz5{k*>Sb;xKGw^S_t^DuXb{^v*Q$1rx47)5zXl|(YP(I%C8%}1cnsC`H=Y$WkZ%8q2djVuO7QHS;-%gg*PL*1lJ z!o)#V+rg1wYfjD3HjpcgB)-H^pTHg$CwVVNTMttN7uq!zG?k;3akPsFjk-v?j-yQw zwf*+5rnQaXXt!{*S%}U!+8?k}aDI(I`_O`R8At2H(MEk~pl#x4XTRc1F1Dck#KrOh zWk)in?gJW~Nz)$TXrBnQQ5LkfIodxt+Wtd8qli}<$I+e@Xh{~dIUH>fM?3tz!K9m` z-7C=cLv_s^;NfVaIojW_LC8g-vo6mZEYM!FpkZ@~`t3@NR{Vv5_AidsUZBmipzUJJ zB>ws(6G=j}wg)-dcLYaw54NB^&(St=v>Di)6ya(%XWjaI~Gf7+O7MFTCHq50LNiO4P z$pS6Mg7zjyyNIJ5gG1s>j^$`4Kj&@hVnLh5(e_bxBr^#s&K&J>j+qC1X?c(+7gcD zUy)sE&%hCD?wBrbh%@&Z$(Goe@&S={j5SF2B=Xatw4Cj3d+9e$AC(4dwwj=k- z#=dHf_L)F?$b$9*Vos7HBpLT0TcB;b<3Q z*y6Rd;b`Lp+P2r4ilh%m8^Y0w>w(5R*G`0U=>I-KB#&Freq~e>J8-mtXhQ^Axdm+>VLW?dT3JlE!~DZCf5k`;xLFnaiUNuQf+oFVMDF&{8%*n1?_vrOkxE`b0d`EXp1@8bb&V9g7y!NHkzZoif|+Cq;@;U86t2lw&2X< zIK4T}lN{%Aj*}>G_P)|o7(+OY#Br8m=tn(=H!?{a`IHOrbqh{Aj`Ia&M>1CehkKrP zINC=7EzlGV>v?oKdO~sVh&(?ftTjxLx z@q;}E`Y#vLXIag{l-^5=odi|0faJwtK0;#n&sZ= z0ME`P8=(g$v4(}k&~!W!ahDnwYUtvu@FOjDhgvx+Zl@+jGC%$V&gH4~kTKTM7Q6%) zXKOmISg z%zQh;b*OYT+V)SnqqPbNOij4d5$nw;Ygn|YKntnBJjgrGj@>K2GyME{+6m*swFyg@m>l3o=j!raW{Ifiz|Vy)}B+5z|rLew;W~ z+e1yN(6Y8v0EY#CBve=Ed@EVaWrBld=DM5}-;fqSrzjVnCV`CbH3v0ebZcq`APFzF z!UwmQvZm;bc%zlAKS48I+X~H?_aWDe$*ZVsQC$lE8wJ(7?6P``i<&Cf@}RzdK? z*ktKR6-P1)h|EAi<}xA!1xt~f;m1LO@W8{|BrP5}>>Jj_7GW9xP4&!KF%&&fzpbcJ?Xo&fsH3yuY65=2*W2bL`xBgx&S%VH ze{LK?YP{LMAIgq*^H#7gLy&)PzSkwB#mS+~aYYK0xF$|d08_F4!F#JP6K2t&&FG!4 zmfn(uVxF~d7n1(jAIAEg3NqL-+iYi4?D|&Z5Ph_J21c zygDgL6y*o7Z(otTxOJ(Cf5ck=Jt96y;v;xX zmK#(-HsKaKGYIX>Y?3zoj(!4*-WT@wc5D{J`rF!%?<1G#3F!f6E(HGrUGOZ;%HmqE zh?Nokf_vLSYQ95T(3V&s4{(9E4Nl=6>v3>Po;Enw?5+N!myKj@-UQ|P$NNmVe#7&+ z`>6F$uIpApxg=`w|J2~wP(N#%X99MioXCQTDwR5H%gD+JSvjB9sK0<^Wb65%3%=i^ ze1Q$VB#-i`RV3jkGldu{zlIxex%*3(PEER<6hCdh8(KAjCR2ElC>&0<1(O@Kc)PQ&dg6zb>sO zFO%m9O@Zm3Lems8(4{zNNv2c~_ zlyP9SAr5J?qAmiZR1gG z4l*a)gAFOXUG?JIIKMP@{aSRxhxCVZY11S{d;Q;NI$G&k&ovd!MC-*!20QZ@fZk`$ULmCu)C~5U)L{J$G1H(~aJPl3KzI&HY z@ns?A1#7a>sivB8mr-Zz_3oPTmt(-yvBx#WBhCcUr>UCyo6vb_-k@N|nk5EBc2q2j z`2liNkdbsJ=VSztKDbhe(}rMr!Z`Qe^fR7k}MIudrp| zC~;GIo-u~D$?Btw63ia2o+rr}X~DMjcgYz^m~r6cTGc~zgU9%XLW2K-*wrUF0#0;H zL>D27RKf%iFHe?JSCARDqkIMw{3#w+{Wmy-BP&~i2N-3JSih-~Hmji**6;Jt8%)28 z?>K>B?e~9D{f{$6Q_%U3Gqu8()=-rgz!N)S*o21h99|To0UH)#FPb4{(=mw28B2&( z5XUo@Fa(Np5f~^>^C}pyem(KOgwzy5<^9Xw+LhH3=x3grHi|>_Q0?91P2m;enfvrL z$kmN;S}K`ZM!i3hw+%-8M3!5wSwgZNZZukma@Qpf@(uF(=>#U3k~QO-B#l z;(||ezl4Lu*=(TCx6= z)q7x=1G{}h=VR7G68Qej>u8qok|o;`jtq3f@-cI>YXhl_IutFe3Y5y&4d*Sqm9#!PUPSB$8KsYLV125sp({2gJ&B>e| zLP_**WZ)DN`g{QE*JGT-fi-+WBKRUEOAb2CwnA+yUZ{D5Ob%1i#W0e{z%D?h7T29N zIJgNU^tsIa!wxaL;vLk1NAS9vQQ#6PFrF2l^O{&sP=~N1^r2&^_`HU!44RdX#wW?w z%!GpB9dI0qm8;Lkv+ukp!=b1{)2Y{$8|BazOd;^i6gA;xG>rL3ilc|7@>e2|mx5FZ zef5-m!gOdVdzFFsQohmlEoO&s=xcwU!MA8@Fkn!qw*v7reLe`s`gMxk;6bA23Aw%u zPbIeD9=MrPoT8Sb$n+vs?@f5C!;N=H>0>%O{gLEaS$&#&`h__1@RRnyDXJyJLD>j- z=3@c^mr(%gL!;GfxE1p6*;oMChZi1(rmNX0bq)TE&oCk?LsMrh^Y`BFSGM|yvJr+pCfX;eC+V{Xh+`l14I5y-%?Y;s{@42D}_z{_MF35EcgT6D+BIWwZADBcOqo zyB9aQi4V4>fr(>|g10i1VZ1$f;ElioYlIKuk3+LPL~X3mo_Q4a8j6l!*&ET2n3%Je zU5HP1I4e3Op$NV~!CQie`2AF{1Ytsu&c!FMFgU=s0~z=D>R(i*Eef*F8(ff`Ol;H) zMPS6(K?_<_>kU1CozenU@RI1k?gVE=5AK7w3mC7*GE)@w96#N%T+g^c1;s zh-Lw#%RVz6wFj`11L-9Ro-iN5aEK5)bog?jeod5JF`oF;Avuvzjxdh&4R3Tl@>gn= z^1WBtK(GB({{&P1c}T`7=Pjo~jjf!+PGJIYdD>R^7Yqu*wCF<%u-uGa%IY&t1@89X zV+X%@djING_SPNqC}*-^xC8L1gHH%83m?usRs~#`Y%5H%T^XOvKI&EQuKv#Kj9nOg zwgkFyeI%;11VciuazsYplRgXUM?~(X{D4+*lHgZ;U#1laCCo?lOdh+KhjT*5+k^%#1 z{PzXbj&+m0n$471kQZ~wByGd1yzbYQ(JQUu7_!3?nQJo@nvRZVHinlH9Pl};U`~eS zd?aZwf<2`k_S*Ybw=^=+8H)vg^xl}Z)rSLxQGcu6gwCMh9}4)jPnkEs5v=zr+q}Iu z42#(N;4R<4U|&Il7lSFz9^zAw(YRv({9!s4VB&bE90QFFj*xB(9`xXQFW`msju)qU zmCfGX$F!Yjk5AcTHdpjlj_PDS%#ZhsL;JBB>`hJ`8R?E41oSipRd4Sde%rS=P#Q?j zj(9NP!H5GzJcL7X8{|_6P}=We{my13aGDugWTkU@@VFNa>eOx-3epfh>5UA7E@OiO zy1duW5uK3x{o z=M(>@KI7$LCN!LLZIC0`4SqWRTa!)vFvW&~?ek#(NCL2dfQWujDEByNL<;4&ammm}7WQ78oE|!Z&4c|{Q+S3wg&TU)!`04;f1(WgK3&E}=aTo3@GC#~ z6%2ZNnYytP^4iD+6p?U+qlG`jc|A$ZyC>(+$zgpV@VLE_zad);meIL$syG!RzO&-= zW#sx$@k6kWPy;Hy6;3+plb0n6t7+Ns)%(eB_*Fy`HBdhoA2Gg>)#j{tlQ=g#d^?a9 zV+?H2LXsOF4D+FXp%jKnHctBS`D^*_-11Ttc++l(scBt?{7N_()IB%~?Qm8+22P_D z6+()!ia;~_<P5_Z41I%~DkK11h5V%pmR$5aiIHw+s>|`TB64-P~Hlb^)DiFKUlX z@y4*8!k!U0meqvdF*ihpI73j<1FTtDG+s8TuX~I2IhT${b)dENXGTl(voYMYz{jWa zTjGD=zxCEF^Z$gvlUG<Ln>+g+Gd=-F(A3;vfn zpJ^JtYoaYg5x8i*mudYAdXG^raFHit)2K-MW6p<`VYxOZ;>Tx-AHtJ4^vn@ARGLLeezlJnw;|y=z@el1tF$3wv|m>ReT=*?0V9ry z&36!&YA;?evQPzn^%@@akiTH*`zXX^kpfS*5Ra3c7%?TYYD+vmj_f`MU;bht+r?MF zDxzUyBy$t%lIi~=6eoTus;I3X+dvpj@pz7Mj0NIqG!T!*GrzyX0u74AJIDOwpNz$Wv#8NE+C^xB ze(|ql4tV1I?pH5n-{W(JH;`UqcJ2%(65FAh5b~}?$V(gH@eD$)G~CdU+7!p%MRSIA zB+<08!=w&<^lh}~7VB>sQ@ZhYnb=wb!s(CPG?aigy@n%v@~i;&$C1osZvyz|Ok~t5 z-Z3{qF!~j=PgKdqFiU;kUM}kUT+~Ne1zniE3}Ytyu+CmBc{bnk%4fz3-%b92c+)4t zc{FVgf3K!#oBH@(HM@t!*@D(5HZME%m@)s zMrc-skgXM2X*to#fgRE(yYPKn78hvskQvu3e4xu$P)obxh#E2CyBzrBQY6q(1dn{Y z!2YDH+#Id(=V;XUQ+8xdBdZxTvWlrzjE4z#YHqL#0qcS8(2Ki}^k?)5xO|~=cvTn$ zR`3GkQWmC{|t3gf#{0QP&gOL<4cl0 zig#n)rl^wMDg%H@&@qGFwQ|PBfIk{&oVb{}p3R#1tm3QJF3|1^XBFD4m0Yp^fZ-nu`=ZgO;zTRQP z*Jo(Hi1%>5qWJoBwr%VGnlG~WdaJkhw(Jai7V*!_7g=ykF{zrP8NoFVs@1W_qk%OA z)HJPRK{cSqxg4@JE{CJ&R2$~_l{xB-%=)qMkcugR_8laR?|b3JHV-Bp0S~?%jnxlf zh;r{U;4x-}uw&SvPYF0Lw8QEkK0F3H>O$s4Od|8p6r z_&Kf#6dz(rfEjHN3Oqka`x~hUDIdM|L`F|16XK%dC9wg=j#D9Rgio*dqCL5mukc1& zT_e5@drmoHyz2cBe7rX@W{54P;IQ5n>xnUc=T~(0Jzi(Ht(`c?hUdnF{T#x0ymRiX z_ze%Jhm9H)^RYjb>p6=}FZZrgvr$vH){o{hxG-J;Hc!oFRQ3RX%Yv3v-U#2eM!z5dpr&KyC zUcm?y^&i(?W~p%epQ`W%QQ_rOVFp!bjQ6}gx2e91&GiMW4V3;=eVbSC2EO$m>f8F; z1@(mud7^!bx|rJ6*IM7-G3&ReM>7JwL)3RO)pw`4J{la@{y%ow$p#Jetw^C1z6(L$ zOt7){(908Gg>=s4S*WL1sU^c`5U-)0Q)-b*pFtRxjLE>5PM8cF){n8kiRl@a;|@cP z&I*^gS$i<-M=hT8WacY>rdbQ0=3<=k0Gjm>D&z4Cv*W^6P!WpFD()gHt2+aBheihX z5g$cxF0HtdzSl4Wj2_d65iTDWvHrWy&Fw*kp!9ki9u|7e=q^D!Io)J<3d28O0Vw7k zZi5J-?x7w>oq-><`2g`%cjko0*=Ga2!~YE9?i{7JpK$)ATHE#{pQQW?h}juA2>Z5Q z1;JAs>%)5@OiZ)}4JoaD2?2|82b{QASM`>-sANGSZ?4aLeqk)Q)-2*XwI{Lb(X=pZ&0$m#=0TJJfK z$7cZ1JPLkpD{yF@_BNy~8u}*d>SI044aGa+QT=HZ6XCVIXd83UbMBZ-zCF%m!oTL` z3?~597nyI5PE@sN=qhidSiGfR5evwT}`Wv0oH4O2VT4>%$; z5mPmsa$;wJOyjbtU&OKt-C4qvb<5Hbq>}>iiHdW{aSedzWM%ffe6r%ed@aTZO;)y`9G}6Bw!<#fPR3sq zafbVmh18v!(;mB2o{TS?4{fB0u$s8;J5rB6dMES@t!FXAxe?wn);EWuebdR*H>Bw_ zXo25J7-S9cF6l^#D6gMPW5EXHC)KxBdWCCK)oXLyWN zsb~z%sht&Dt~K>!_uir>N&Csq{{C0wHk~{+GkkP?j1;FvYYf0rE~RF`v2s2p!hJD5 z{))LGi*T+46MQQC*MU(kP7g3~QP9WWB9bXz$bd)1qA51F;xlU!0y2!2|cW+KFaGU?`jo)_In-MqfN9QAN#=(lK zGfpqumxD8lI7FDEd=Y%lr+$!}ZiDU9mwEhyBxz`5OgC(bi-kp;GSKe$k~|y%u$TZx zr|-i%mMor#HaQDJsnL&LKli8m@%cx1Yb)+YKmPTwWvr|?NUDOda>?)Th_UWkT*$lY zV=O{7?XK<2b8=NEU}G>wh!L1|GrzGBiW}v412o0p_{BfZ@!<&PcxNd%J_^TdXkH(q zx;u^P?3b9Td(%{1_dj3VgQB_us&0X)x^E0ce-uJst!pw<(7*(5op6PRpS_?{E>uCS zy{PWD5>)3jRhMQ|Hy+g)-#EkIizc$l&%tt{qJ0g+LX*l9|5W9VF5{w|O_e`JL!5fA zLl1m!?s~O=cYPhxH>f1j#}m-Un0ibRWu9nK<|LdM#vuMB3zrK*^BEyygr|XZ5Fdc~4x4sz5@%`#%CVg^W-JI|^{>G^JO7-vHI$CE z(w8vmhIgu^7`ZmWV<5V$Yix6V(Plomn1;nF@>D%s_$wU^bjY_oo-j&#+H4w*jRh7m z&4r4aNv@BP9BGj386|lP1c>B+od(I(cp{QLVB^X< z&llxhzo6U?-?4H+LC2cvZK|LjH*u`}M7doT(7SpM_sx6`(+;m?My>tt@Bz%)efYi; zMO!&)^QT@YCZlsrY(9g(ij4tMfA9dTGLre$6F4CE=u%<-_rd=E0Ap-KUy8Vt#XR%6 znLW>e{=)OP@DSzY>Z=UT6UkilWpO_K-DHE|%0>Z2MOh_kKq`rXO@v66Y+x5Q5(NYcLP7|KT#+Pz%4L%v z>#~?uZK?IZmj0w3l~${0Ee67+^$2(&Xh9Twm!Jeu#EboZpPBdF-5lD({_|m(_nmp> znP;AP=9y=nnRiCY%C*Wmqn9qLXRggz?X}7~vtL|!+hKY$4gT1_Ro<)1b>03tgYp^> z5-c#Z-u>9r+CB;I7ArrLv+&3+^Z5+O2TY2VT>d^ z3x0BxOTuU~VUQ$Dc~>R;OcDl~3B4rYIgQFK2^X3P9VB5kmPfQ#`4LR+vz1Le=iMm% zRjrSxtvSx>_b~sPn;dV0l+h!V(c@g^OfrxRafEF$u?^+C{R@hEwuWcs7Y|LRsPB+# z68$yY9n zhpetIYgf3kM{~F!3V`e~f5xbc_iMN4e0uWSkxzi5{FLdrOqM5ri{%9w`28?oME_tM_!p~0X_+rY{mZTQVadM2Q?jq{ zzg;KV`R}b0g)e~8XrDGl-JnO_M^rn;n{s|p3c*A^_Ek6U1$MG4iXIo(mbq)^DR*$O zBm5`nfXyNLHHXM<0r9r8`YD0f4h|X#)$sS$5aRHNgE-y-0y=s!;ftfAH?Q$@P)ead z#7g-YuPj~2fvhXmVAXQ-1Xr^;L-+8^{)@NN28!@$+BPtky0gb=&g_lnOjP%0hD82yz?6EPDjK$`#yX#fb7S@dN|Lg(z{@D$>dcev&f zQBUF>zS=5Cxi-Z`EWTkWt+juc-R*i!5XHfQtyNMASj7+gD#q5%lg<_2QZ2dLY=^Vz z7?0l7=m$2&9OOABIcJa6{JFOke-vx#5VNY2J)O(v;bD^rd3YV{u^OR^lwdZ(X$tME zcap>3?a~ai{CUfN(sH&oYGtdQ8Z#x#oo=XmW5QC%W@zy+15v|NI0M|R)WS)$fl>>j zv7wY&kZ<-awU8TZRoM5bg(FLJd2bdsR|`)|EB)}|@dc=b+Sd9&ts7&8uuY^bop80a z*SMO&M0O`O-*4P<{n%L@`374fy5FSDeaGRwzzC1H^9BLQbyi;?vs#7YhN~bD#p8e9}67I=hEe!Mt)$kY|FmFVwI;ApFG){<{hy% zX6uFabCmz4P5!8b>+lEf#P@D})-Uu;H(cnH$y<0K|6#B_aR+wUDl_AJ zGKLf0LInnAJHpq=qDQVHJeW{Le2Q%;5qk--&62meD5g(11IDSb<`$;!l0Jn{MU|h=cicbn)~ZYiB`wrWMwrW03z;=T9mP#n7@^x=K4^5!FFTuEvRO8NDk0oHIo5@Q{rh^8-;7X-56uS zbr!f2&YH_(a37;M)kHtA{f(nWUlZ^n8cTd4_Gr0}gU^Ed*l?I|F9_UA&YIUSw#|Yk zflz8B3ysEm3pIiFXnZvf#o#8Qk1T`{<0%txCV(;No?U46()KNTOA|vL)^6X;a69mh z*ujO;dxPv3VI#OveXTNo|4ysy9CSee|X3IyA# zT8tms*6+DN21d~d;zyQmM}OQh+1xkd>wfb{UH4PTE$e<}{OnG9**ywaIoF-l-CN}t ztlfL2g>;sQS#I8JuKO+pGi@hxzODRs!w`pYc)o5yIZrSyX&gzfn@P_`ljvuXmzD7e zn~e2l@@kSj0fWs4o;1&1e(v{&w76fvtL|6u>iZQ&^+R=(o0-Rpks-}BMG;GL{eZz= zwe)0?wvNp0^U5G|F26*~MY$cPQ+$nSE+riQ?bPhA$3>xN-@FUN;_j&V`$22U3?s(n zJB&vwHUEC8>=+IGt_9sb9(n@Mi%jS#anKVj=rL$8VXtEH4M1OGLSGpN?X#eN$2j4B zKi}cr`-9wmxDVV;G7){UQw+)QjTkT3llW7@eRvez`xPd}&Xcv_msA+OkAUdf@C+X4 zht)5(-4DMlQ2lTK$u0WfwKyJB!(M%Hv>!4}ru(V6x3sdFa5wLVj88Htmkt@-KVba& z=~n$Px>PNtsssqg)NZ@a#obba$TwyN(T zs;TO`69x3+^v)wswW{xrTAr8leT~b@b$t)Z%SHNy`tFt2GtIQuSgltIv#!;Kga&%f6LEDuquoLH|wh3#|r{;{BJRV31%pztw*Xo!&MEtST)oOqW}IwFT5(XOEmp!(%A~B?8Q_TA5;Wkpz*SJQ=MN` zXuQj8w>~_y(Qf~NukE4rtt#`Q`oYmx1m9S`bxX=x3h5^ zol69>?YFO!hGJnpd}gzS$4`f96Xb2R{uw{{`9)K_sj|(4o33~i4_C1_9_~RC?$RDY zRy^FzV$Owf7Tm^QG|r?d7plU^+9^I!5(b+Imq^0tAH-w!n3#v3-xBlXhZN@X1i`5} zy1s|74#R^%5ZhJuhD3dUyD4UTHs$NupM{U1Ikgq>aJm8N6|l+n*IU)^?k}u)h-ntw zJzJ}X+g=tbxKk;3g*!4vEXnY7U}r;?^_s^km&}`q15_eMfCSY=ii~Ktx%l|dN25h6QgUsf!i;5z)}3EjKYLzM7>e``{(he)wT)?H9da>{c_+ z6Xb~^6MN=yGvOW*Xy0Go0`NkrE>c&7aUXtg8 z|Dv?A7N)d0`428Q+02NRvnE1ak1Nf!q$dYprIqPpB;|scKqn5yTfkLloE@3HZK)w* zrL|gRic*8#;KJ@kC3TN>q3DuGxaxD$18_Z>Nx1?p(kg210%}$`Q`am@Wkzj=)0(wz z;Sk-rvK1hTT)A+v>GP`cg`iWbkREY}v7f4DB|a&r8Q3VB6?*^6dM@hKTOqeGLO*)}g5^gpV zZjb~y;#>5;B#bi?awTCvy-JuU34_gqOC({@&Ny-nkD}CB{d`JGB42nr99SRb^y!N;uZsI^q@-fn@QKD^EsdB~h1-$O@ei`Soi0qg)oWzSe}weHv(S~X_nTfm7jdqyR} z>hJGcKFb@RR%oKLMcqJsOgnEGa`k-;WR8&1ET}S+s@i`3sLXI;jq&4L2muz)qhovH zy=^psHB93UX=x{vXm(o=qnk6?iq4VfP|kVt=s>4Rd1kCQJ$^Pu7k9QJrBXr)>LE18Ziq+4=hl_3L+LY_)B*B?0ePt_b)Ae8UHP9z+lM@ za$S8Kb>owh`OTA-vl|w%gu(4`^hIebJ!-1{=&b%@{Fon`5G3P`iB)3cKwSyD8rkEO z+376e$tOR!e`0R8=2x0FbGcoJZZ~WQl-MK2i)JUwvpSh-L{;$?-L1LB(7dDlmu3T( zddKVLsJaXPMpo2f@~Zq_lQqRx3dPYSo2;ueTh_N~+rO}E5r;wy)Q%>KxuDqkEx0AAtM>ZmnzCFlPSj^A-*3KX~0$m2holM8V zFFe;)w>|NQl8SymRji!8E?z1wKy|9(tADgqy#B!dRw{ZvPh~{l)KTcuU|HpN@meodD<-i|W*XdXNRh?cZsYRXo z;$Dij)6GA+kN@Pit=j2F_3_2eDhXXS4fCUTyp~HJ)@67Bvoxc)ZhE;q9*dVUq+^u8AsL zP|0mnplY@nAR8YB#_*ZW=sYC{)*8T_;^qh@RXp5Eny!VH==nQIiAhs`C{i6uj&Lxg z>A&n)$9~mHntqh-aH|0;>33^d)#MI%KuzjMiPdCm2eT%t+x^&@T=GAz$pY3N-9h#N ziCf$9MgIwUEnoEY7JxXbqg#pAGwrh=`UBBY9HNUum;59uyJ~uA3dRX`3d9zN+S6ea z5zZ&$sJMh7!z!cU&jK;TVQzy0D(VnVi6i!pfEgd*jgXFgKQApL{x^N2)NmSz(%11* z*B}!AeKqk1Ch$e+xEO+1b^Jk+I0jMSvxGedU#D?{Ny_Q*q!?XHB+9`Y1e3 z&Yot@ch<*M!g%*mO~1?|)9|J7v}zTTZWfOP$bmMkX0*O$Gv9CeNbQ`}@}YQhmYj2f`yuF7 zGajJB1^a{_|AW$UTPC5J{xC|D5W-drU;mz2pEak&_cS!(twpUW)rLVn&P0|g$i_dZ zN|`973^o%kkp$U#2+Dj(xY$fck%WCR@3fSxajB}0De*yP%SxS1rDDqzuVEX8Z)YHm z??uo(#8bf)0w1kvir}q$71vNpUklyJB9mulU*!ynThb z(%UgH!v`K$H99x}YPOjPf0Bd`u*VDsG3dA2@ZSUsA7_?0hgFLjD}Yk%7ryF9eC5|% z5~ny$SL11X8%&N@97eeUc2;*#eJCC-_bc`BS+!06qD32L2yGjL15w%UXX1E5jd<}m zMjwl{ccRqrqmjDmuV7M!pKgf5qFel;@h!5t{FY{eE3J74*jwnaHaK5u z7GEI6Pk$_~c;lw{l4rEy#wSv;Rbx$SR(y_6?Jc`}EtXz%O0-@fjFXgi#{WC?{`DHo zt_LvZ!&OYPTafVAi{jX|JELMJozb4)_5seT~_ zFzcTRq`4N}=O>AQbh`x{r-cv8Zc62S=EF!?_uXui<+I&=o1wTqf0{OqLpi@vh?}XJ z@8kGfv%ImC7oN9H(N#IlBK=x3HQS;loZA#9XvVeddy|oRPb&$(IT8=o+l2c`E4bI2 zsVBP$cX~ogam_lZNZT`3NP}g@Gb1#k9=uGrDkG4bRb(6;Zq9!m;pKq&avv}7`vEI+ zY}C`%+)XB~>l7}GxR&GJ!b5sbiDo-X+9&hiyYDT9b|`3#OH33_P=wD$1ybHmtn!TZ zX6iAlU`_0K^b|lkL_rQgt2F#;QIIt>Hy|Hh5BeQu>UvVczio`$;nJtTVcaCt?4(em z$)~Ho?*Ft%+-QkJl`81p5{U_BSsp2C5{MvTvJjDHCR{2Bwco`zu=fHj2=_1^G&k99 zLl8i40SI(=_zn`Kq6e{lb$3WUtUykUu|W2iAe*Bg9z+~0djTW+5Kwx* z;Zif9izKwu37L{`hMDj+25@)=Jy>tvw|3|of5}B|?`5Q?Y@1~GV3?-yjw_i6$1Y=QaI1-cVI^C=fLei2r2oP|byU3r?$y1T5@WW#2weDqG=c z-jFWc+n%}(X5M3>Sp=H!g_@ZAB;htQp+pjX{-q+}c1f6QCJdK^w{-8AE(ty}AyX1Q zqCY8SJ{M(XD5saI!oQ_ozGci35&Z}wIvin{FjgtMs+6<3sueSzp-ZYlbzg~V!9POa zziz=h%tGf%p?5YbbY&04$&t-D*-LYB#s+rnF5-5x&&jz!a*i`|=1R`LVJea^Q4$85371I1nPHWXF9{c$ z2`Q5BQ)+{OqB}aqim_u5J^hAe0^ChgFs>N|;g?XPl=az2P`;7JGlKFrjOp;0T`J*S z63m&abd~ic$Z9}Tm(pD&yLCTST%i zL%La_rqw{|+M-3i&$Q}lV*3_DJbace>l}-G;{-%V<^D;kCff5vykMO;TQ$%b&Dm24 zV`0x5*HE#iO$_%7{s|2Fwd;=o{M z8CSpub2HdRB9|n(aN%Ic$^0)EOfo$?1JGdVcNA1tMU zLm-N;=&C;AqMRYAT+QYWOiAm$^JGEx9=V@w2$zRFjl%Kwe%~M1@`IdrF&Z;DmO#fGj-(_bOCA#Vo(RaN)1eZAla;1y%#==I)j6$HY* zone3ARj>UMeLq`4$ni#I?7U#^(zZ`^JD18`uc_P_H}6wl_9q<3U{rL|{*V}MU-sq& zO}>!hAF@-P>lEx&SD#kt!IyqA;DTS=^>cl4Wq)t*8umCO-A^36^6sSCd(`Eh-o(sE zYAx4M2&?p66!mf*CC%&&wxiX!lM}>Tta(i#$Fitql~)+;(ziJ`{X+Oo?=`inWZ`^FX zKilcdsrsJX1TI^Atnr`ve4e=b*(-k8_%8Q1=8P-=_4XkdA~VL3tF zvVl{TY~HuM;@aHjMHs@rWEhE_2jYA-rRuPGe>*JW{`SR^9R1!sNV2|{T~Zz48KkOn zYXir)hYCR{zk?b_+c=UMK1U#0-3tFKu`Tb(enKF*UE88_n|+0wX9Psu3ofD^t^`I! z>HB^^VQ`QOUZeEM?SgX0>$lt}{KY7LaBgbmUVm^wcjIn4d2mc8x>`?t&Tf8sU{6)O z-5Yc?@CmiUn0KMgmVINV1qa#uK7X(%b!8VM4VMaW?MJYnkPpJ>7wX^&<2a`2_#5T! zH}=z2u;Xol`$qS~dQnvka-ZvNZ{Ryo4g2L&UW5A!{XjMOIme#8THFWYn{05 zv_RBhmOs!b&3M!!I=l#l$>pWX)+0CmV5c#V|;-x)HuK`n1L_7w;!n$*{e;3R=Lt@tBggL z^CtH-KYBW0sLa9T-RcHVUto*zs{x|yD=**Jk9;iP8u#|6Sw;P?B!W&X`22zW))hCg z`-D%_+bj14yU2N)9KD-V`39%sR(+jN`44|^Cif^Cavq;1z#AM7J3ck;#0(V8CHL>} zDB)QxNFsxgs7ZRr7dR4@X{Ol^H{$M76du1qQ&=;RM0#Dn;nes+rzCzVO+}4!)tg-D zWeng^Lb)!B3M-3D>))t+a7()ggOU+$6IEiOWCZaThwvH~RLNl|+;rfqd7H+Qt0HS& z^rbY@B<6RtPGB2dp{rq6`JFX4tIVgN-CnP9QA>7tLU(7p?!|C+9U9xZb!TVaDptx?@)%)5xFh)U1E*PwMa<) ztFH&z7pzWOC%G6|PS-skG@wD{|5zkEC;W4v=CD6-%9x)HoNTj=Wl2HaLj%@W@KR!J zrjYarXEA|RzG!(en+WsMc!qlVe3sFXIQl_Xjvo?1eIWZ-`i&uUC!e3Gw&C&-AY`r8!gZ?n>JrRRC2=M~cP#?kYnC5u)4 z_~96Msq_(=+FA1%*p*C&c~E_1KM%1!vWqwOi7nU*J9vVhUoCTi>L@+q5_+lG zGgSY{I?Y-0dkysX?EsHn z3v>zI&`bxVY(gh&%!O_W6^QP}L;XYm>*OW1qLh=8Q2Ix=!OM$D0DnPEgrqcQ^-YxF zFKKE_;Xah5sYE-gONiof7=Pe1q|Mk$1{CTC(qs%!+qT(qecY2RLcQlQ3aL8zGw1T% zLMazz=2OB)9fXd5(i|uRV`_Iv8Bj-x2>AjM3B@+{>y%;{lt{Tzr{rgTV(jXu@_5Me ze5qijWm9N%(@wd9s%-j{{m56U{^OF1pasJ~)yEjxghf>wWLUCQ4CK=kSG%SCUrgZ5 zILV-{?$r(yVkhy9N!80VG1sk!x;-GC2e}?OFe+L1pS|ATJxUs;c(3ScipOqe%`BlP zcz@bD;dk)ywDpAk;M%keDttVxPK8gW?NH$hX$^#oJG%+${UsGJ-Rd`s7#Bm`K7awj z=x-GP+m-d98d0nuA_DIh5q%n(KnVVg~A^$;NLiDcS6-?m@4~tcx&oZ z?j}$)K56{EFZIN?3y`k(&y$7oSVpRf+l_=Xc@GU34}d6!E+iZ0lb07PM>Fm(~WlU zJFrhA{eBtd_j&`4v?Z5SHQN25B5s);^ge~#GWRMyyXZVyL8yNZx$@F@kU`&{{f#fs zuJRC-J3#5ioqa?E5#XeZ#V$r8%uD8`1xT(O(kO^*jgzAG^q>jO>Sq+a`;0QF6H}d@ z+Fnp2$2Lz|&wj?+Nu*#dEFpV=+-@|C`|75#7{n=mmLKE!;fp4An)K%4823C_oYjvZ=o{IyuJT`VX(Y07pngFM7+3R-as*{X2VeH5^G|2EtLUW0yn*E7 zHaqvWb~fGXeh!b2Pq*`#p^-uToHaNE$h*(DkAYheRC7YnR5MEwkhf%LP*WP?*S(1e zCat*5MbmO@g6Pz{>G#-UD`nUZY$o+ll`2UKNh0FfMJ`(=*W70rkH|o*fJ&o4qXa0F zQ<4MA-x1LXc1;Ux6AhBBQo2nd9KiT z7M!s1JfZWPYv!2~pJykc!tl!kKmMvkQ!gl<sPn95E$e;H+h2{s$=s9==XE^WPZ(F=c;N_ z0GjnM%o zHr_HxaF5{=5}ClhDH=@cujJrhJX72m&UI}|osIou{^|+k+Vit_EWR)=+AQt^|Sg3C@Q|C<|%eh>}V?W_@Ta4aS;&9IojiD!2CUa+X z)n>bo%F)eIyn(KayNgn&-y*rea1#~WS$WV`@~S6TVB`D--=>2OpM9$*`z3eaMuwQu zPRxUf|HVK>Xu}1-8MLB5@}J!*u>PBzd^no z4PL=ufwUZmyyeestUMA&r=qXH^as2Vvv1>!+o~g39B;PjMVf;z%zOb3DSL|NAXni| zgX-_xfw$~C3u-j)PxfKws>cEKB@Rj}DB;MpMzn8%{giPQ zHKL{R?X%K4xdZP9^BtkCH2~VOUtW5q?sxXOXw;J90Xb=rQwonLyT#)y*l$!ba(Hle zph$niqp##GbOo~)8Fx2a1XqL7P9^+icG3pfjmV6!73y$DOyM98p718%50sfq23*Oi zuN7M5#)=AXxa||tIyJu3%zx9oJ>`?T!10PcumL}V;Y_1oF?-EuXvwm3b`k^7C88AMdeZ8i3(@g(2oS&=SR zF?r~y+w(gKI6WfO8qztBv3kbofh*A)!H+8oyMEjIniF<#m4i2I}aVLwNMW zy6gr)BSM4vc|(;BZ^;`*67POga#T8Ed~PA3rXCiI-V#2JC4XR#yNcTxLA&unxy)|5Rv)lR-xip;dCqSeov=bchSpb8bYpS<%U*F zam54=@FPNwBmTe@{y>Qf@N_k@hl^wwh}Xy69=_Q{wNF;o-%v(Ym3hfIZ|Zsl%ix@A9&T$LyNm&qrA50AeO;M!4$M<|I3hM34bBh`EpL#CBJ zk@ljAls}|NE0?Mx)8qUf9I235Cu=3Ls+K%;gDq0Yc!f7`(|)CZlb?^kWbp`Awqx;& zi=5jx$mnbWXC0I3*oYnaXj}Vb#SH<2h|6{i}mk&`;D)MPT zo+yts;t%u$XY=c&`dsKXhnxQ4-gLx~pUr3GhuzL=-jso3@A+z-u%;Io^0N;*tIy%V z`Cy&%nL6yONVucC_O#_Vgo5fZf_(WM#O2skjn5)FN9LN&nw?PR36}E9Q{|v}#$1kO z<2;zu=UpT!wZnvY1sfr}CA)nkZwhIi><<-)*LlqwMuADqy@0#3-*eW?6Gq&@o2f@~ z5`~`X8by^yh`Eo%oMaU{5$bXxJXU%+qmm;kIWIEL;k@(LlE2y~Fn2sG(}tLQH!jg~ zlanZX?g`jifW^|~OaE#oQ5#Ny1pA1kn5?L4#95O;k)k=g(w_^ZKaZ3CTtru%F7lmY z7jmBC_{w~TrY0y=qR?vanT_7~$LM=bM6va5l5*@yOl}2y=Qkjbb6)yjd0)2U)|bL4 zYqd_46H(1QhF5pMaMSrho%dz5#q~3KV#HkPFWK)!7G&C-D)Nwh#9Q)~4_PpF_0WQF z4yZgL2&YRC4@3naf!Cei4V>wy^iZ$Ny6`bLSt|_=ZFykqeB~9b%2hHgLTB7f%ZA&L z1%bcOQSqX4l^uk&;nQXE#rcr4UAFv8t`Ht@Sjh||4or7D@7?0A+9Hp^OF1oNJN|F4 z)6=90kIC>^Ch3zvPmSLrRSPdJocO}n*bvdaDZFjsNR%bsSKuu3@lp}i#7r=A{)Vb<<;=|K$zaxQ`9N+1d z$UmqhQRYv`ftyR(cAk{h4%>*fL^e+Ze~0rrSWS%a;}<5ay|}Cag=6$l5g&h zVCnKQW<~oO+naJI`xLlmAq{AjH002c%0`wNg@r}PLVotqimudgwpE}cOruPm zoS*$IXVOE7IG7sO(CKcT;llF#5^;8lvp3kyO9bLvaRyQ>`(Y4bvCEE46d|rm#b>ay z>H}xhSKOs2N|(|;rzfiFQJNTC*xJ}kVjH^f5vBuVGY%XRrm<59_!C43$_EiS8Z=#2 zLPg(_^q8QcQKg3&eix;zoRe?=+Bl*i)tfJ5`-SGrN>pr=pzX=I^j@na;V1bDzS4_Y?)9d z)Y>F&JaNYIGp+J7cZFY~OF@htPu!#3fzNSuyfum&4`m9)A_&vr8ngDV&{wpaJk=D5 zY|rm5GQ;e~=!y$ZV8wO3PGm}+LjxWZctubZ@EX8S>-__}iyKD^2umhRA`eR+2@ixC z^q)MFe~9E4-h}hWPdstMBu-ku=to@R?al1{F{6ZN+y!EdRdz7Xj!%^RJjOEWuS!zu z;W8e{T5A^m|8R4pl@GevlVov#$c!9p;O1LNtH?Z)F5h#X+~)6MnH0N}6#K z3BHndbi%7Dq1(?SQz)k=l7Y*2p>S8ZtA{EE%gDD@0OQ&EeG|;^Rdlu(f8*CHOi@Z- zHW;&REsdtMtM0d)Uj0lL+)VZvb^9RD-oO%oz9$L4SzwEM=eGrcgYK$>gT*&TquoCR zC6<_;&ynD)E8*{~TauNZ`BG!5HO_{H<3HTAxL01Nt9|F!-jbKK|8SEh`+`LWv~QFd zJ0OeR_Xh{$gRUTWHHd#(B2AxV+FsaZ)wGdRqS6&i+fCOFNkk>AIv{gWqk38%$ZM# z6Oit)0Ly@m{U=gHPpu$PO+oh=i`C;kq*A0R zOTLU?zY_&Y`>2gUq^criS8Mm|*YTVuFUblmU{=EpHbL0?HJ^Qx-`>EEB1kyo@C7@a z&N5yqE0F%v8E^fm%1!Id{;cvNYF7{#gJWy4Eqo=_mO(Lm6V(s>X5VQRPq95l}W|W$=0osPAk0j9jN=L{-yuUs1wwQd5%E7t??0yE;h2Id$Z4> zM=0@Zpl^4Q@hY3mICGW4&rQ~j$I8a4Q&`5bm2%Tj24;LYNC;h)c?YfLE!kdml!ef= ztynt|Z|{@-P~WZaN%LcPa8WOKggy1CPnz`z4PKCar1Imi%)6%6f>984R*1fYT5x$o z*TdRR6TH1o)rLCNg*thi8$DgvHF(%=-+>5G5AyF3Jy=VQP*;4>h3JEfA{PdXY2Vu$ z01N*WAk{7=oTE@;A5yWJk5+!?#=MU925s?iwlY_}KUQz<~S|Eeo5iV7!luKXhE<2kl(mG*TvIPfu_mYSe z*$H{;j?XkQxIQLN?y>$*=V@4=zQC96>kCSntnHG4w*tFH1^xj(e8t0P4o8F6{+aWc z4*n9uyV@Oe+`jCq2=faH@Q2Pjm?oYJo>w4&D+rnVLvM9{0%KEs)i<{}@A`~b51((Y z4D;X)jrpeP>#G;Id?j7)_S^SF4w!Px8oWFEpU%6s03`ZDJ~2aUcUyb0%{HWJ(4+RV zcZFv4NeHl;(b3?yf8COx>iLwLS(p7Tv%-X; z58827<)c+w9gUZ$egK%WTJ|F=!UJJ}3{?t$6y&nN7x{svz`Klf_+8a--~la*Q$5lQ z8}cegzA*N9U=u?^kF?4^;TiG8=#S?|b`Rrw>#gA6GtPBycGn%wm0sx#b>UO0Yf3x% zX@@avukE_i+Z*HJ>%_oL_7-$m@DI<*h`|=PeI4cEpNQ>VJ=#m!@^#t0np8CoD;EouMqe$s z)chhvND3~^VuF#^MGW6bYUe`rhfspLcL_z>-q7=QkWE4_sF-&1ugAZD z6UAsuVh-C?mT$_$klj@Vqa^x@>UEpxQE>nPBwj}0BNx`4T)#V** zk-INI(d=qbmwSk`>LN>9Ojt6U)jv%UExZ&<;4E)&0lVaeC0Bht#2q;1yz9^CK-njT zrFY&pe6s2<*~PKqEJm@D+2h=}d+5L(cRQ^oE+f!{J9N&?02U48KSmheE72@B}zv#SFt@DJ`?^V87CN-x+fw+NlpMUk0 zS6)#*E~+$6{D@y3z!ev|HNp4;f+-a(lGv)co|}v$bH&zp9_=UQ00a*6`a{!CDicG_ z$#OqO9};<%R$P>}P@1w#zEr`8&B&LNo3~vQcY*gm5MZf zT5j-k2;rjJ*ymFGnfT7yXC?JTb+^MzM#JDaJ#&a=R8|B_4Lp|oIgLEd}_yZF6i0!RndnnQ0nzc4=7elgb5z|8xX9#;hB3I&yCrS;*#;+{*Bg0 zzhU_!T7edFvY51(oVZsw&abSuG+-uM_P<0@8;nnEcuT#>(pZV%!((~KL+8`>T{C|A$ozf${E1K;)$f|0;olLd z`>~8|w#cbSxR=27w5?+XEPSdn5)n>&z1qL&#@k`ssYZW)+BmVi*qj~moNM>4rZc2U zrz#4jBDwDDw-;rF23;py-5D{)N|qAgE0SD<*AoVNc&pmRH>d{^jbGD>YGbnOgf5a6 zDDstT6H%idZRSG)_W0w)ZY6W!LWIj+`m+#C!DCnkhgOfk@ZyzD2rrkVnyn1(!L}WkW;e4rK7$trTC< zRHAsTS;Z^W!oiL7;lQ{ITxL<~{e0fJoiuPJVdH(u9?QNac|Nn*p)PjigdDj1b*cn~}^TjU0A`&&(B!o*|bY0gSdRp=y&ysYhI6S0W zDNmJjr7CG@VW7binrVlGWnU+#zT|v{mg&!?wW#6ktbPFJ&*2JYnd+%h1*#+@ z4-a%T!u!97>ygrp_7Ch*mMfx@qqr)X0#B)WUB;!}S}m9l@&Ql*^)!4IfXKXfX(6jFu0 zZKYb-qYZ`1o^pFQ8O7H^O*I~%zdk(Ng@)u`mT~bOVN>TxBZxthXLtwlnOF{T?ham0 zO_b15>5OotGGCbHc>`Tk&z(Yq2M=#XLEuZJ9neK=75v!f0^uxKZItfB)?oQ?!S=P( zg?W5%y{zuYb;Rpb8N-rg!FLUi9JR2wF@=7BS%Ga=wURg)+Ql{1_hq%A>!9AyRrPhd z$~_!Okeok|4@IhO0a1S7gS=&fQs{3p1#R}{&Yw@_LB^k~;GL?-mnu#N9Zh-&OW|cN zZv4i3g9Q$c5XhxoC^kOPcL#PDZ{k1KjuHIHJxnSa>!lih{PL7ifDaQ&)5K40^;ed8 z-9(nvyjE&kn<};4RWX!xO=~{V#T<$TgalS*R*?qTVR=Lm+!oR)7E&A~Q~xf4t3D#j zl3n`>Z2|Md^F={PA35f$j(ARjD^$s$0VB?UQB2uHvSlfs?a6_+y`e!(-r!ID z!A{5h0k-WfN=py+e>ODwa=Ryc^Zb2$H0`W@AD_6I4K{VPDBc;~A(4Br3}x)~ZBH0N z(Mm4-3@h&7l1}2>{SA=?p(QLF8JRD6*dEMugRRFC*m@<~yI*k!wl{VVxyc_mwNv>- zxgEt5V9(&7-Rk4AcR!3oFlTcs-$Nlsx}bb7c|*jNLoKjag8f+o^WabZ-F}JWNk-QJ zZ}Jiva0uwzSXM0A+ld2ym)5chG;*|PaKW0C> zudmsK3p((Yd``ZkSQgW9VP>8vC^@LdRqTOdzM*u<`|VqV zihAQQERwkTLY;tlpR=2Pfv?-3GS~SGw!p_;=aZWhQ8l}usj`=Iqa&>~4LvDKa4P=# z0>?tPM%3dj`-^kXHD^8VrRQ`)C3 z6_Qe-Zna9OkkH2}V=a^!<0wzEtS1ZW1Fsolc`(-v^zw}Ckoiunt1@ndW!#dkr|KB& zrr+5!vj&`UR*&)JXF~3PNvSl1Ols>(Hi7ZVcm*8* z{R$xC0us0@jMuw(tw2)4k2>LE_vM@ z)fN`)c=^DT;W6?S4%aNnWUjZ$@fnc=>{q2f?w8JJwAlW`UjV6s(QMvFwc zZRJ@$v8~xv`DYcemI%4a@K;La9*E9Y6~FIbYbh*r;f7HB-fA4A1&K*hF>GRiuSvzA zFkaCK=UE9`NEjyxPm!Rx-J92nGugRPkqJvHdLS8x#6p&(JmhbWm>_{}U4UxbgWL6G z^`3Ox%R5WS-JaL!iIV=J(FxMx_0gyonKs#sN+d)?T%B97TEr!=dpx{Q8-4ir8 zMwO(3X{7>J&i~6W3QzJ&X4vn}FN2@K`v$hZt>d?v-wJ*U`Az3Hj-Qv`Mt;Iu-yAA6 zV~VR}*4*;Sd8IL4y5>~Qo=h!a>Ey~8vnpoHDTk{j*rXEpIJvlFrY)@uHdWZt6srkl z7tbsuD4AP!3xTj+0xFqSJbBg(0W6t2r=*yNat&IpVaj!mas^s0^-C+4`lXfYY~@pD z%$Z_Kn>+a?l}4yi3567uFm*=hEDbWRboSi&6ilj$EVrdiFD{>MOPg9;USU2(fx%NY zZ*Ik03%U8CYBiOn78;Z+*wQL)DJz{j)s|**fy#*d+0y10&qD?&#cJ)evgp&Cxge;R zK93t|)8>_$4|7a#Mf!~LImL5qX*0@a%%PGqDj<9YB~}tr*O{u`Gs<;1UBo|ay5hm~ z*`>32R(zN)(v&vcsyGjtt=cbc$>0yt%Vowu{Q; zXPY`>R;i2USu^GkPO%LhJlIz3%5z0~^>wAiQ|QvJk(CwYGp3Zf^5@KtQmMqmRa{b1 zT3+5}r0Xh|ZOokV$};Km6g{`BbY8L29aaxgJ-|XScHRtnOxtDU&za&HJ+HVdT2ASl z`7`Ftog*qN8W+XyO24#sTd_ZBGqz8gvHjYNy{OIDL4(?izWVC#iEcZdV@oZ*#MR{D zHe)BoVij9#qpFzW^ULJ-TYk&<74y3@5Q!Y*w}am)el~s&@r&FUi3|!xBE9*I;1}S% z1L0-;Y?sZk&6{j1Q0m@AS48Y8VLy$D(1{*L;O6iZ|0KqTDVEl@DA!6{fQJ?%TvJ>X zb6t`L5t~ehzeQ49=_q1_f!3RM%cQcoqBt%ppERjpjDNIxKo$$<&6tfq%r9+D!)0@( z&^ctEK%slISB)#E)7k3596_cQ&nhpqU36LIfN8cll|c8h%OoBj(+a|6gli<8uukGxS~)54 zgsGk3FJU_2dRAl?5*B_(edL|6fzXC)yGh~+yR)mQPF&rDE_&%g3F)9~2+Np*HW02S zY$9wROvX`@kr;`j6Be;nRVMFA%wY*_ENickc)|^YwS*0X`w5!}%TB}Yz*$yDDBI{# zlNm1wYY7(;HW130sj2Om8xxihHW02SGze`S&@-n4M_5Q$%XW^1g!|dbw1&{-#P%dC zBiv7DONCyRH);v92vhkIri`$Nu$FK=;X1-5!aBnJd{<=<)}6(ejo;sPHuG`9{pT>w z6BhN3MAj3o&j3GR1K~+RzHN(iXAvZWFoUp=&`VfGSVXvna3SG(!dk)x!gYjAgmr|e zmq#MI30;J;n6mx~@UU2u+MoP{xoje+C9EY}N4SQtj&MEUZo&q_Cc^!M$(-2bx)OVa za6MrWVIlLg6@*2EYX~#4;H#u(!%xnPE4m7J!Zib_FJa*$lq2zkb%eIZ;YWAmi?EQe z=n3jWxaLo!6R!U=zb+EVB~0CfuY}OH8NLt}5w0VwBdnA69pob{BeeB^ z&VNu2;d;X9gk`S)Pq?43fw1sZ=qIctOg#^{*N_*&Wjmptuy7Z62^&~MG6AY9)_d{6j%1bz}OBV0&WOIS;|hHxF>dcr!wI>OzA4TMdE%RV8$ zi~4;E9fS>p(+TU2(ys_z$B;k5TteFg)R)jjSVovdSW8$)X#0$E2~!Dc2{Q=S5#|!s zNjiUsoBFfgdY#R_Fx7r;r_++<+=?_}VToB4C zXcUs}puQVOA0X-8l+>z(=~4Vrk2KPElb$c>BT`Z;NtO6P#HW66D#EUl=%2)oCO)}E zyp*FhD-eIVKo1uxhNZZQbWxITCHY*W)0Lxt5-%&&>21WzK}Q+Hrwg|-Dd$b% zy~InGw7I1|*GKCk>7SeF10~&}V}=Hi^sY4Ibn<(3y2a0%1wzvMlfIhtzLM?{{MU9! zNgmPB3qXIOMw7md^gl^DqSe5Um%VA9?z$>%!2*d!6d zt0=cnwPO+3hcZsepOi1hq!_@>lZZSizY++qf)G4!lJ5QRROFYEK76@jC3rGI2~|l6 zBY_(hh5Ht`I^gb$!XbwWZX9s=3Qo#POSIXtJ~|cog}_DSM-wIO;~{+m>6jYPKgl6lOu_ed1h`)#U4a6(D z%rt?2oOl;DW6S=rh4^&hTjGC@c(FN$x4{27@vDiyv_*U;7`~qPv=;Gc#P1+}Xp8tk z(m>d(Ez2EEd=~MKw}78Tyx6!hq*{McuWI6V6OYLq{ge3nP555XSlv&aCf)$POyZTk zT7*z}I$p#7!#j?Qw$ppSWnfD)q$qj#87YGIbKuVJqYcn4r~)bDJ@OSX7f^bT@~nD(PW<#1@qXYt zF-IvQzCHR;^t`FJq@1^;oO+ONOG&0A3Nl}$v!KZ1V#v#%&^-Zs8LSunS|U{c%9sA- zmj0EnOjAy;%I}DJq*`i35`Nr6zSZQLAo=n|zbVD#>6n+2Ea^{^zMFK9r28cOmU_i3 zUPX4_Bt4lWJGZ1Oe&q?jd?~J*qbgT)_qReHaK!=_>;IZQNFA1vsyjW&0^b+?Uk3bj z!k_%Aq%kQOqFfob57J`3juVyq-KaS7xJ=cNQ;F1gtASg{ z9BioI9bI+W@^&keLO>U;O1vu}p+rf;E&MNm+t;N-C84Q&PoBKpgpX5(UnjPR4uNoRq@55-eI)B_{0Z@cL`7zOoHQ zdpnY)e%mXrzV^B|r7#9^m*`iKyV2k=z*En&E#VI-sSLjoKa2P^%nfz?!_oL^;>R&3 z93}APpTOTQ@WjXWe^r0tHxRGdUya{GQ(Wa*0)!`Tl5UWGm*ApZLkTqIN|C$ej=Yrg zsw591abbs)bYc)aAZX?hxn2Q!le)CV_`w}m6)Ryrc;@1&>s|8Fb@Dqqn zWiG4i9WzbhD+GUwc#)Tt#LL`ww7@F4pHHjjcO0tZ1>q-J@;?pSYT&LAxa(6=uO&s| zUm?DZc%_eTN^y-NUi!71?S7K@tpcz3F(k?lkHwGQwBUzZ^htVN9EaS(A)&KB4-1)- z|5@Z@xJc{7l-!V`>NF*U+6O7GqB)9Q{{JDqTziVZ`KdjfL-^` z(d1hlG221q^QB}gRmG@wlDiakSm~09KdIkJ;>A;_+EpI;llrYCKArfFOnz6LHa?|H zRD|$5aid)XL*QNkt_k188`2SnOUIm;QY0_}n@|oX@;iD+`W(1*_%5yzd<#R4l9b$4 ziMk)7Z~kWW^WiDE@tqrK(w&}6y1YU7P}bo4*sJIg*c(%dEV>f%6zBT_I|aCL_&ny} zL(%$}sgxSO5{puz8d>$*iE*Px#@--oBvB_!Tu*No2Zm~gLtLWv6BwgA7Q zM?BF3X{uhYP zAYQ6r{VDxt!Uv>XRDbtMe`iv-+@bnAGm*spaI={L)b_r#S66&h3(t>4CJ9pVuS}r5 zOuIM%RETuG$ejEMya)Joz+WKck+@v!XldWv#1wmr_7y%>2z*boT_&Ws#+&t7N&J4| z>VgB9R9rzmhXO|Gt49pp+)jLf0(d>VPv@C(w$2)x>Wg{&k5^ z{8RHqBro9+T_QG}iAebUH1OjtV9m{J-<2}IwCpN_9N5H+Xv)M8nfVC#br(h=Yfb#v zQ)Q5*CW8HmbKon?>cu)<8~6&MRrYjDbm`UC5F zu8_l*lD;y@je*q8osv~`+OU-U_QZ^i9a6IBAMTWNV1Ol$HS!97R)TNMUCrBH%2`YN zYU1y9=yF0*jyax#t14-jsD};-Ed)BRW5V(lQJ#*{-k*cdxEr4)&qDVq!50#`S4#g_ zF7`oHyM!XuKl~P%0<7D+KLVG24|-1`l%6e!H`x9neZxc21mN}qr^Yo^4t7W=F<;7o z?&ZRts&)k_b#}2vGAJ5@B+3?TAxe9%1<&q#;Y%Vf*NdJNm40nXk&FO|ovAmIAClxx z;NJv(!)o@V2)|_koxsp`< zy+4)ABA*;3p!qvKB{w?mg<qy@u5%>W^3HWJb=Ap*eA*$)6-CqH&a4maG1djTcdIA1bITklp+Y0Zuz?T94 zp}>!|#`-a04PXaUD@vvOG#n0De~3gv0v9(w(Qwlgp#tXzZVhk;1y0#v*n6uI#1g|; z()xxXZ56;x|G!A&Mu9W`Bz`6F>xmy@MG~s|6MvHU-!N~N`isA`Oy*sQ#ZlRp{I394 z_IUI0T;%E_;-?eer@4I74?~Wae4Bb|ja_P1#<9VOkJu!EL=eVxD9ExcjMI=*#+E<89}39CB#@Q-^kfN3dM{5;M$SM- zX&S>cj-wC*CM4t~5Eqh=C|?fE2UVDaLPLv&Qo=N8>JBbLGbAXP)NM0N+}}CpclPbB z-s@zho#{W?v32(T?z!ild-vRP@7=e%NBqhb;BCOaE}-^*VjjWrOD0bEyG;w%#^;?r zZl#?EP<|5ScT4%|Jb;^|4e$18RP5y&;F~{zH$#Qb?FFL%W~cV_Eb@0EU+-_~{Smo? zX!E<&^Bd%kB7d>iZ~Ojv-5)yDt#{+1wua+!L8af$!;PBaSMf}YtS9UGh4tp&yXJld zD~cL^!5mF1L<~UQ^w&?Gd=lr@KHZngJogZK1S=cNb64rz1zRkGO|L)7-TsY}CvUZN ztzQ2wx&GDLo;tri1-@hW4d#s^pNCwp9iCTWh z_4pF-3E&sPZ`HgW*kih+JYWNa*6C)Zc zHgKpn=uB_3rLfukrywspjc3zro`KzWEE=1mH=N`yx=y&#jvs(;%@p?&@Ead$kQKEZ zl7F1}(w8#sKGb0M79}azDHt$PKIzW{KM!~da4|POq<>q<-zT8T!>u*xJJ}d>T_NRf z0N)tOi`(`?@G|gG;BZ4S9vej)!4K5n7yTa~KbAGDZ%f=hfo6}{9+>Tc*&dkff!Q9I z?Sa`InC*et9+>Tc*&dkff!QAT|LTE>wN`VH)b)_9yc}1aX4KPLGiiD5T@KIRl}VSF z#!ow`gK(Iso)F8+eE~WA-h|w;lVftVQOBRZ z*wU`&ORNZwg6QG({qCgce=hk?GJOj9rkTEBnF0UB^j_xwUz0U=TD!;YFq)M=PJ9{p z`bg*BW&Ed+RyNMjqK!;HLcX1(=MX=abd++>W4ehnTYn47UzEvT#`GnmEu^iaYe=sk zt+2i>(l+8n$63#M;+sfapAP14$>N!GALVrtZ(=!@Ge*1iw9^+kUQUqCdxzyLCS6Lp znsfu{b)>zddr9|`-bH$Z^eE}$q|cGQNP2>F-aA=8=~B|wq#H=DBkd*KOS+%*F47~U zM@b(ieU9`+(i5cf{+RWXE+t(}x`FgM(q7WNr29$lB0WNSl=N}Z=SW{9JwZCJjrEf* zC0$Lrf%H1kUedj!`$_L2Jwkev^l{SXNCS^1+K;E#@x=X<`#aAUe--;IoOihWk={=G zYhijkV~>Y3X&c2Mcs=gl+>g2cbiaNE6~Ry1dbplU&LGpDGid((Mw>{Nkv@O7;iF8C zlU7KZ9w1s>R zQs2gkUL|5;0Skd6_bBJHAnhnYV~+QjQMMp_~5xYy+E`PMlsu+{r0^ zLfQ;^0&5m8@9Q+DFR{Q}^80$p#jL@}Lj3pgzK(PH$T`L-VuZ)bpKEYv0~Og`-q(dr zeH}>lczx^XO*oM?nV0u?%{({NTga6(( zN&C9esjn-&elPFsAIg;Xb*fWeAWQiL_@6C53QR6Jm%s5k-q-Vske56}*W@vbM6&!8 z*E3G_UA9C4-#{#zN z*Wc}6DpUXX!3%)kIfH}N{-P1ZZMgBxa{>#AUz`JCx<3b3m)emO_*M6WJ_W>6YpU&Vd#KV=S2*)i(!sW!rh|79F zj(0l$I!o^{655FuiNBlp7UEOHFC%^}aOs~S{i^$)F2xszHtv(%uMQAjL)`iI5%+zy z;~%8_v5b6~zUG9*@&4TBuS3K;Dc|vXDaZHkj(-k#t^R))xb%O=Hf!ibZ0~o7k7e*D ziBAx}n*7fZ5Bg9tz6nhH1>#-AWt}I-Z-^fwjuEKG0vLek6FMyI^500jgZNeCUrxM2 z{11t*BR)mk+x0G&|1M+PK>jY5Pu%MraQVc!Z4UA-xAxmLCcy9S%DeD_7m53_?Nh|Z zh`)vP%7^oXe}Z_C_;-mnU2DLbiT^F}whaEy#Jh;gd@je!#5=^X;CRSL_$~3U!+^uY zPn~P}RER%F{2byP*BQX=RJee6k@#}*uW&iUj}U*S%i(}?kGaj|WN>*GU;1a9xW3~H zSpzPArwP8B^7j#MyWW5sh~MV?#McwQllV08wZ!jtIqxx`oA@_~PY}Nbb}YwZ#2Z=R zs|JT>9KX>3eODHzFA(o~pW#=K|JTGT#Lp%!n>*=;N#Zn@a2D|;P|mxFj}c!_JWqUz_{WG36Yt6yz+o9aNPHrL z%eMriy}GeQkq=PL{lv$53|LA0Ys4or_$2X=H%1PFFh#tJ_$tczC*l?2?gw5bK27|G zprG$19)=VS-mXF79U1&q;uYfFKL>~(Bd+guLgXRhQ*>bZE+_EM z5}z2hdiC8+oPL$~blLEqa2!1fyw*JRWF7n&$_WQej&HMHAl^t^-zfx(d_zI{xkAI_ zunDKYQOi6VK5>BxYJz{1V=?er`kW73N^c^Q; zU0p~1b#?HFa=JLs_1zH28FBf4VD)~T`rJmmc&Xt}62GU8{0jNonvGxIT|k+Kh)>D_ z42R!NI9f-}Uy;9Yh4JgV3Me-Pd=B;tW7iwrXhgsHAb8hK15P9Uavk|6>fmw{Qm)Iy zCKCWQJr)w5B>s8gi-{LE8~-Tri-5~|Z!)tUyNvi$25%$&dRU)m&yj z^&{YCVtlR1wD%{#&!Wyr@`~aM!mp(@uOG$@dRMpJVMN;1bID(>ikQCjU73H<4eypLizh z&40f@QjepGFAigweZ*tHYxUdTD-Qp5hn2sNa*o&G|Mxoh*{{VKf@PCrIdHkxlRee} zucgoSI(Sj#EDqzDcHN@<3qunp%-67@gT#+5vFpXlA3j+}{+H|Ej{z4uT$ZuJzf*ik z=*!?gtt00Z^851)SO(~Eg1A55;P{*cW+(oB__|zuD z`Lko#0$l8;lF`4L{4M0CS%h0$&c{v83M1ho#K*Q;Klc&8m-78N4R6=yi2LtsFeg2} z;_{c7oL=IOl7DAL&!@>hPXEklGyIhJ;ElMBS^p#7`PA{a-WcJD^jNsi z@Rm249AE!jK)i$F@$KZl%<;L#ukUapPhJzMW#>D9OaJ@xD&9XgQcery`+jGrj+{~Q zcYMMWd7Ap%PQ3C_1I{OY*!f>)dVY)e5#XYaKR4t0JWT!~`CcD8zQFYo669y(pLo65`F7_0iug4Bm0!oXi=@3XkJEwIva2`O;cr!b+#ma} z$G1^d7WSvl zkI&YT^Ah>n=x2Pq|3@AEGtQ9yTpU_5ep_NislVmEU@7%!Cf>n)3Z_Lp);Z1_Illkx zRQXGSKdks#kWu64aWMgBJOyZ?U}xQrKn zUeNXVW*s?CP)-x=obFP;=_38pNJZ|Up2x`_xX!`OQ;%O0pCCWCVPQ_A>Eq8Wx<2!P zi~NbJt)ZQ4@A-~XA0HQ&5O3r-ZD+l2Q=Ewek#K6Y`mK+0rcbpB$5=+b2VIN*v%sZ4 z{dr5*|Dihk-=qAFH<|n$l>by6{$JF=&wvw<{;6*mZ`@$%FB4ycj+K6%TyKD{yIv2x5&G=pewOUv zO~A#URJi`%#EgrHcV+ek^6eUFmp^~&dR_rs>K)JMxsCYb0Tb;0@O{8VpX|EvCdxmY z>7QFwj%!_|cT;}j9fp03SzjRD#&sj6Cq2GhN6tTzf0BO8@ALnh_&9O*pT8wuVY`sj z4!#+cjteD;$%vYR`O47HPF|An}Ex8DQ5crU3KL2x*XcWH0!vTcyY4~dHy zl6u@mIsV+ax9cGJD|Z^-1LVI?aV8Svi1TOs;Zc>JVC3o3b>zIF{Ad^bfa~+SI{fqC zK)g?qwY))b+#jGmTbOxi9sc#?ALG971@dcYIGo-BT*iezr|;{f z50iiTOtV}478UsKQT`>tpXc}XKA`-pEJ40i2Y*uK;J#eO9)7I+m@itbUf(bOypEg& zSYTY3sLxNA0zWIvd_Lq7#j&p7{HxzELZNpMuUu^P>Nj?PZzev@AL8`eYQWz^d~Chd zxY9`IQ=Ewek$4BSuKO1$Cvcs-gJr%~hyR&6cvwC%Tw0DmW6O8va?3~8td3T@Le96-Fv!NQOQi3xy*%OeQZnM2I7tJYl;ZP|Qn zXA}hlv-A)#<-rKS4Tti>p#~I5?3vvIgcTa z!4%1J!VJf$angc4C)_hKIJgf*5~)ZYFHW(d6&le~!k)>ABk6z`)l?jovF6y}!WYkk08r9SK3W6ulxa2_S)3~Ib>A_6nw1hj26Uotp z^OQnjW-+IQaP@K$oYBvH+zls@R9SFHJ+QshNYs$4F2zHw#%Zxsks{%7;b~E0zEs3X zDc{qN@eD@^|0Q~8jIZ8-k>NfI#05Xx+l>gomW}AD2)PS~qY;XSn_J(uYPAN2geZ)m z^00Wp(R~UbwwJ`EWXMQ4C8E(J(F(jCGLT2XIEHS`(4 zm6wG$5}G7i11@qjyi3kkVOrU6&DyQ)QTw*_m>O-K^z)wKLez(lm;;FCy#D%aYqxG* z2ae9I>zsSzmhD%r-4bozu;JSF&Zu+km0Q}QAkDKvg( zTsedsPSiwyR2(Vi`npRsN=m3^pGTueC(1o&;c#Er6BPz}FoTy@trX1$sd~8}FZgH` zdk0}CHV}jZ!#_2p=S!ub0*pDQv31jRN1HphM%A?nx?NT(onqR!@;!x-a++VdCRae9 z;9PlzGEx8Tp#nmn7J7T5V)t&ge~&iC6on3ZpehUw(eVmusE87XsMZ)Wr9!4#P!(&6 zx)B1rT!u>8T=t8e(?cLqv4rwV>)LPE8^q@`Eg~_Ep@fDT$7LxOGR2fhRznC|Y{sRC zb-M?Og^BVSxo40V+{S zC7275i@C@0a~QjEa6_7(M-vQDz8aa)^oR4>8=EG_Mm1z@LjO4KtzzbIL$A!Y8M}w( z8m2u_He;)H29q2ZSmBnyIaw|nx`OqhL!^1`{BhyRBc-84ZfpSw1#EtT z0mTb$U(=T00i!}mLe1;?8Ae_j$Pc9r2L*cu5Mp^K6xpMLBX~8hyId||te`|;U%G$< zqQ}e><@)wuS=&EQ&24pOA`T$yKb#MCc2K-W>Gra510j@9oc3RTY=%4BFn>ZH2x`lTVe<9+H~U zQdKP-F2its+LAg=L9YxH3Psc0ELM8M(ilCMx)F7=Ct%rvHq@vkHRlG4>4M$||5NkD+;#Bk{>L;+DGTH2 zhEbwfH)Z9=I#_|YH)LRlRn+9iMuEc(?c$^{GDMH6{=IrxxX6j?(Rn9M$qLeRr&SKa zgXge;gCiC5&2?i@0*6@L6=RZ*OJlt;94wkQ7e1nMxsVtn@nkKX?oU9TdS}-JjTJ@QLC3S$HfV$wt0k{gPHSfipvbl$y)sEu zyI@tbo3mVpa%y=XYtXW-=KX5#$?xOhvMM4qdUQrzX>E&jYpJGXp4gUXx{Yh-i)G(# zIG(h2D^?gQ8|`t8MX=tk!Pp!u?9E*HYQIK$11VWs>aLJ7a!+K1xJcKVM#DaMbpwmb zV6#rTDVdh76f1>yksVIFK&!5vdu2|q(Q#&PXk>`4+8bTN`*!Pa%WBxCYjq4Vgjhco zas_Nc@w&cWn)<5)Yp2ZrHm<~^Fpv~Rr6WaKWx~m*vr*ivS(iS*anWQ0kT3NYN>Q<( zr^9j0ViY|X!&z^lf~>L;cxuSebwuyYC3I zAoq7?)@|CYX^~Ns8;vLWOkX6ff*5*g?;rp^{9rw+HzA;juU9Zzm}hWpZ51U}lde6T ck9le)i`HQ7ijzJz$TRmySa_=6tl?Gu8};W6-~a#s diff --git a/project/libs/nekoapi/bin/Mac/libneko.dylib b/project/libs/nekoapi/bin/Mac/libneko.dylib deleted file mode 100755 index 3006f39ab8bd5edd63c79312cf1ec5a93010c299..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96204 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 M!v$>Vqs)q+hsH_ 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

Regexp

-

- Regular expressions using PCRE engine. -

- -**/ - -static void free_regexp( value p ) { - pcredata *pdata = PCRE(p); - if (pdata->matchs) - free(pdata->matchs); - val_gc_remove_root(&pdata->str); - pcre_free( pdata->r ); - free(pdata); - free_abstract(p); -} - -/** - regexp_new_options : reg:string -> options:string -> 'regexp - Build a new regexpr with the following options : -
    -
  • i : case insensitive matching
  • -
  • s : . match anything including newlines
  • -
  • m : treat the input as a multiline string
  • -
  • u : run in utf8 mode
  • -
  • g : turn off greedy behavior
  • -
-
-**/ -static value regexp_new_options( value s, value opt ) { - val_check(s,string); - val_check(opt,string); - { - value v; - const char *error; - int err_offset; - pcre *p; - pcredata *pdata; - const char *o = val_string(opt); - int options = 0; - while( *o ) { - switch( *o++ ) { - case 'i': - options |= PCRE_CASELESS; - break; - case 's': - options |= PCRE_DOTALL; - break; - case 'm': - options |= PCRE_MULTILINE; - break; - case 'u': - options |= PCRE_UTF8; - break; - case 'g': - options |= PCRE_UNGREEDY; - break; - default: - return alloc_null(); - break; - } - } - p = pcre_compile(val_string(s),options,&error,&err_offset,NULL); - if( p == NULL ) { - buffer b = alloc_buffer("Regexp compilation error : "); - buffer_append(b,error); - buffer_append(b," in "); - val_buffer(b,s); - bfailure(b); - } - v = alloc_abstract(k_regexp,malloc(sizeof(pcredata))); - pdata = PCRE(v); - pdata->r = p; - pdata->str = alloc_null(); - val_gc_add_root(&pdata->str); - pdata->nmatchs = 0; - pcre_fullinfo(p,NULL,PCRE_INFO_CAPTURECOUNT,&pdata->nmatchs); - pdata->nmatchs++; - pdata->matchs = (int*)malloc(sizeof(int) * 3 * pdata->nmatchs); - val_gc(v,free_regexp); - return v; - } -} - -/** - regexp_new : string -> 'regexp - Build a new regexp -**/ -static value regexp_new( value s ) { - return regexp_new_options(s,alloc_string("")); -} - -/** - regexp_match : 'regexp -> string -> pos:int -> len:int -> bool - Match [len] chars of a string starting at [pos] using the regexp. - Return true if match found -**/ -static value regexp_match( value o, value s, value p, value len ) { - pcredata *d; - int pp,ll; - val_check_kind(o,k_regexp); - val_check(s,string); - val_check(p,int); - val_check(len,int); - pp = val_int(p); - ll = val_int(len); - if( pp < 0 || ll < 0 || pp > val_strlen(s) || pp + ll > val_strlen(s) ) - return alloc_null(); - d = PCRE(o); - if( pcre_exec(d->r,NULL,val_string(s),ll+pp,pp,PCRE_NO_UTF8_CHECK,d->matchs,d->nmatchs * 3) >= 0 ) { - d->str = s; - return alloc_bool(true); - } else { - d->str = alloc_null(); - return alloc_bool(false); - } -} - -static value do_replace( value o, value s, value s2, bool all ) { - val_check_kind(o,k_regexp); - val_check(s,string); - val_check(s2,string); - { - pcredata *d = PCRE(o); - buffer b = alloc_buffer(NULL); - int pos = 0; - int len = val_strlen(s); - const char *str = val_string(s); - const char *str2 = val_string(s2); - int len2 = val_strlen(s2); - while( pcre_exec(d->r,NULL,str,len,pos,PCRE_NO_UTF8_CHECK,d->matchs,d->nmatchs * 3) >= 0 ) { - buffer_append_sub(b,str+pos,d->matchs[0] - pos); - buffer_append_sub(b,str2,len2); - pos = d->matchs[1]; - if( !all ) - break; - } - d->str = alloc_null(); - buffer_append_sub(b,str+pos,len-pos); - return buffer_to_string(b); - } -} - -/** - regexp_replace : 'regexp -> from:string -> by:string -> string - Perform a replacement using a regexp -**/ -static value regexp_replace( value o, value s, value s2 ) { - return do_replace(o,s,s2,false); -} - -/** - regexp_replace_all : 'regexp -> from:string -> by:string -> string - Perform a replacement of all matched substrings using a regexp -**/ -static value regexp_replace_all( value o, value s, value s2 ) { - return do_replace(o,s,s2,true); -} - -/** - regexp_replace_fun : 'regexp -> from:string -> f:('regexp -> any) -> string - Perform a replacement of all matched substrings by calling [f] for every match -**/ -static value regexp_replace_fun( value o, value s, value f ) { - val_check_kind(o,k_regexp); - val_check(s,string); - val_check_function(f,1); - { - pcredata *d = PCRE(o); - buffer b = alloc_buffer(NULL); - int pos = 0; - int len = val_strlen(s); - const char *str = val_string(s); - d->str = s; - while( pcre_exec(d->r,NULL,str,len,pos,PCRE_NO_UTF8_CHECK,d->matchs,d->nmatchs * 3) >= 0 ) { - buffer_append_sub(b,str+pos,d->matchs[0] - pos); - val_buffer(b,val_call1(f,o)); - pos = d->matchs[1]; - } - d->str = alloc_null(); - buffer_append_sub(b,str+pos,len-pos); - return buffer_to_string(b); - } -} - -/** - regexp_matched : 'regexp -> n:int -> string? - Return the [n]th matched block by the regexp. If [n] is 0 then return - the whole matched substring. If the [n]th matched block was optional and not matched, returns null -**/ -static value regexp_matched( value o, value n ) { - pcredata *d; - int m; - val_check_kind(o,k_regexp); - d = PCRE(o); - val_check(n,int); - m = val_int(n); - if( m < 0 || m >= d->nmatchs || val_is_null(d->str) ) - val_throw(alloc_string("regexp@regexp_matched")); - { - int start = d->matchs[m*2]; - int len = d->matchs[m*2+1] - start; - value str; - if( start == -1 ) - return alloc_null(); - return copy_string( val_string(d->str)+start,len ); - } -} - -/** - regexp_matched_pos : 'regexp -> n:int -> { pos => int, len => int } - Return the [n]th matched block position by the regexp. If [n] is 0 then - return the whole matched substring position -**/ -static value regexp_matched_pos( value o, value n ) { - pcredata *d; - int m; - val_check_kind(o,k_regexp); - d = PCRE(o); - val_check(n,int); - m = val_int(n); - if( m < 0 || m >= d->nmatchs || val_is_null(d->str) ) - return alloc_null(); - { - int start = d->matchs[m*2]; - int len = d->matchs[m*2+1] - start; - value o = alloc_empty_object(); - alloc_field(o,id_pos,alloc_int(start)); - alloc_field(o,id_len,alloc_int(len)); - return o; - } -} - -extern "C" { -void regexp_main() { - id_pos = val_id("pos"); - id_len = val_id("len"); - k_regexp = alloc_kind(); -} - -// Called when static linking to bring in the required symbols and initaliaze -int regexp_register_prims() -{ - static bool init = false; - if (init) return 0; - init = true; - - regexp_main(); - return 0; -} - -} - -DEFINE_PRIM(regexp_new,1); -DEFINE_PRIM(regexp_new_options,2); -DEFINE_PRIM(regexp_match,4); -DEFINE_PRIM(regexp_replace,3); -DEFINE_PRIM(regexp_replace_all,3); -DEFINE_PRIM(regexp_replace_fun,3); -DEFINE_PRIM(regexp_matched,2); -DEFINE_PRIM(regexp_matched_pos,2); -DEFINE_ENTRY_POINT(regexp_main); - -/* ************************************************************************ */ diff --git a/project/libs/sqlite/Build.xml b/project/libs/sqlite/Build.xml deleted file mode 100644 index 682e90a35..000000000 --- a/project/libs/sqlite/Build.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/project/libs/sqlite/sqlite.cpp b/project/libs/sqlite/sqlite.cpp deleted file mode 100644 index df2cc9f18..000000000 --- a/project/libs/sqlite/sqlite.cpp +++ /dev/null @@ -1,366 +0,0 @@ -/* - * Copyright (C)2005-2012 Haxe Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ -#ifndef STATIC_LINK -#define IMPLEMENT_API -#endif - -#include -#include -#include -#include "sqlite3.h" - - -// Put in anon-namespace to avoid conflicts if static-linked -namespace { - -/** - -

SQLite

-

- Sqlite is a small embeddable SQL database that store all its data into - a single file. See http://sqlite.org for more details. -

-
-**/ - -DEFINE_KIND(k_sqlite_db); -DEFINE_KIND(k_sqlite_result); - -#define val_db(v) ((database*)val_data(v)) -#define val_result(v) ((result*)val_data(v)) - -typedef struct _database { - sqlite3 *db; - value last; -} database; - -typedef struct _result { - database *db; - int ncols; - int count; - field *names; - int *bools; - int done; - int first; - sqlite3_stmt *r; -} result; - -static void sqlite_error( sqlite3 *db ) { - buffer b = alloc_buffer("Sqlite error : "); - buffer_append(b,sqlite3_errmsg(db)); - val_throw(buffer_to_string(b)); -} - -static void finalize_result( result *r, int exc, bool throwError = true ) { - r->first = 0; - r->done = 1; - if( r->ncols == 0 ) - r->count = sqlite3_changes(r->db->db); - if( sqlite3_finalize(r->r) != SQLITE_OK && exc ) - { - if (throwError) - val_throw(alloc_string("Could not finalize request")); - return; - } - r->r = NULL; - r->db->last = NULL; - r->db = NULL; -} - -static void free_db( value v ) { - database *db = val_db(v); - if( db->last != NULL ) - { - // No point throwing in a finalizer... - finalize_result(val_result(db->last),0, false); - } - if( sqlite3_close(db->db) != SQLITE_OK ) { - // No exception : we shouldn't alloc memory in a finalizer anyway - } - free_abstract(v); -} - -/** - connect : filename:string -> 'db - Open or create the database stored in the specified file. -**/ -static value sqlite_connect( value filename ) { - int err; - val_check(filename,string); - value v = create_abstract(k_sqlite_db,sizeof(database),free_db); - database *db = val_db(v); - db->last = NULL; - if( (err = sqlite3_open(val_string(filename),&db->db)) != SQLITE_OK ) { - buffer b = alloc_buffer("Sqlite error : "); - buffer_append(b,sqlite3_errmsg(db->db)); - sqlite3_close(db->db); - free_abstract(v); - val_throw(buffer_to_string(b)); - } - return v; -} - -/** - close : 'db -> void - Closes the database. -**/ -static value close( value v ) { - val_check_kind(v,k_sqlite_db); - - database *db = val_db(v); - if( db->last != NULL ) - finalize_result(val_result(db->last),0); - if( sqlite3_close(db->db) != SQLITE_OK ) { - val_throw(alloc_string("Could not close sqlite db")); - } - free_abstract(v); - return val_null; -} - -/** - last_insert_id : 'db -> int - Returns the last inserted auto_increment id. -**/ -static value last_insert_id( value db ) { - val_check_kind(db,k_sqlite_db); - return alloc_int(sqlite3_last_insert_rowid(val_db(db)->db)); -} - -/** - request : 'db -> sql:string -> 'result - Executes the SQL request and returns its result -**/ -static value request( value v, value sql ) { - database *db; - const char *tl; - int i,j; - val_check_kind(v,k_sqlite_db); - val_check(sql,string); - db = val_db(v); - value abstract = create_abstract( k_sqlite_result, sizeof(result), free_abstract ); - result *r = val_result(abstract); - r->db = db; - if( sqlite3_prepare(db->db,val_string(sql),val_strlen(sql),&r->r,&tl) != SQLITE_OK ) { - buffer b = alloc_buffer("Sqlite error in "); - val_buffer(b,sql); - buffer_append(b," : "); - buffer_append(b,sqlite3_errmsg(db->db)); - val_throw(buffer_to_string(b)); - } - if( *tl ) { - sqlite3_finalize(r->r); - val_throw(alloc_string("Cannot execute several SQL requests at the same time")); - } - r->ncols = sqlite3_column_count(r->r); - r->names = (field*)alloc_private(sizeof(field)*r->ncols); - r->bools = (int*)alloc_private(sizeof(int)*r->ncols); - r->first = 1; - r->done = 0; - for(i=0;incols;i++) { - field id = val_id(sqlite3_column_name(r->r,i)); - const char *dtype = sqlite3_column_decltype(r->r,i); - for(j=0;jnames[j] == id ) { - if( strcmp(sqlite3_column_name(r->r,i),sqlite3_column_name(r->r,j)) == 0 ) { - buffer b = alloc_buffer("Error, same field is two times in the request "); - val_buffer(b,sql); - sqlite3_finalize(r->r); - val_throw(buffer_to_string(b)); - } else { - buffer b = alloc_buffer("Error, same field ids for : "); - buffer_append(b,sqlite3_column_name(r->r,i)); - buffer_append(b," and "); - buffer_append(b,sqlite3_column_name(r->r,j)); - buffer_append_char(b,'.'); - sqlite3_finalize(r->r); - val_throw(buffer_to_string(b)); - } - } - r->names[i] = id; - r->bools[i] = dtype?(strcmp(dtype,"BOOL") == 0):0; - } - // changes in an update/delete - if( db->last != NULL ) - finalize_result(val_result(db->last),0); - db->last = abstract; - return abstract; -} - -/** - result_get_length : 'result -> int - Returns the number of rows in the result or the number of rows changed by the request. -**/ -static value result_get_length( value v ) { - result *r; - val_check_kind(v,k_sqlite_result); - r = val_result(v); - if( r->ncols != 0 ) - neko_error(); // ??? - return alloc_int(r->count); -} - -/** - result_get_nfields : 'result -> int - Returns the number of fields in the result. -**/ -static value result_get_nfields( value r ) { - val_check_kind(r,k_sqlite_result); - return alloc_int(val_result(r)->ncols); -} - -/** - result_next : 'result -> object? - Returns the next row in the result or [null] if no more result. -**/ -static value result_next( value v ) { - int i; - result *r; - val_check_kind(v,k_sqlite_result); - r = val_result(v); - if( r->done ) - return val_null; - switch( sqlite3_step(r->r) ) { - case SQLITE_ROW: - r->first = 0; - v = alloc_empty_object(); - for(i=0;incols;i++) { - value f; - switch( sqlite3_column_type(r->r,i) ) { - case SQLITE_NULL: - f = val_null; - break; - case SQLITE_INTEGER: - if( r->bools[i] ) - f = alloc_bool(sqlite3_column_int(r->r,i)); - else - f = alloc_int(sqlite3_column_int(r->r,i)); - break; - case SQLITE_FLOAT: - f = alloc_float(sqlite3_column_double(r->r,i)); - break; - case SQLITE_TEXT: - f = alloc_string((char*)sqlite3_column_text(r->r,i)); - break; - case SQLITE_BLOB: - { - int size = sqlite3_column_bytes(r->r,i); - f = alloc_string_len((const char *)sqlite3_column_blob(r->r,i),size); - break; - } - default: - { - buffer b = alloc_buffer("Unknown Sqlite type #"); - val_buffer(b,alloc_int(sqlite3_column_type(r->r,i))); - val_throw(buffer_to_string(b)); - } - } - alloc_field(v,r->names[i],f); - } - return v; - case SQLITE_DONE: - finalize_result(r,1); - return val_null; - case SQLITE_BUSY: - val_throw(alloc_string("Database is busy")); - case SQLITE_ERROR: - sqlite_error(r->db->db); - default: - neko_error(); - } - return val_null; -} - -/** - result_get : 'result -> n:int -> string - Return the [n]th field of the current result row. -**/ -static value result_get( value v, value n ) { - result *r; - val_check_kind(v,k_sqlite_result); - r = val_result(v); - if( val_int(n) < 0 || val_int(n) >= r->ncols ) - neko_error(); - if( r->first ) - result_next(v); - if( r->done ) - neko_error(); - return alloc_string((char*)sqlite3_column_text(r->r,val_int(n))); -} - -/** - result_get_int : 'result -> n:int -> int - Return the [n]th field of the current result row as an integer. -**/ -static value result_get_int( value v, value n ) { - result *r; - val_check_kind(v,k_sqlite_result); - r = val_result(v); - if( val_int(n) < 0 || val_int(n) >= r->ncols ) - neko_error(); - if( r->first ) - result_next(v); - if( r->done ) - neko_error(); - return alloc_int(sqlite3_column_int(r->r,val_int(n))); -} - -/** - result_get_float : 'result -> n:int -> float - Return the [n]th field of the current result row as a float. -**/ -static value result_get_float( value v, value n ) { - result *r; - val_check_kind(v,k_sqlite_result); - r = val_result(v); - if( val_int(n) < 0 || val_int(n) >= r->ncols ) - neko_error(); - if( r->first ) - result_next(v); - if( r->done ) - neko_error(); - return alloc_float(sqlite3_column_double(r->r,val_int(n))); -} - -DEFINE_PRIM(sqlite_connect,1); -DEFINE_LIB_PRIM("sqlite",close,1); -DEFINE_LIB_PRIM("sqlite",request,2); -DEFINE_LIB_PRIM("sqlite",last_insert_id,1); - -DEFINE_LIB_PRIM("sqlite",result_get_length,1); -DEFINE_LIB_PRIM("sqlite",result_get_nfields,1); - -DEFINE_LIB_PRIM("sqlite",result_next,1); -DEFINE_LIB_PRIM("sqlite",result_get,2); -DEFINE_LIB_PRIM("sqlite",result_get_int,2); -DEFINE_LIB_PRIM("sqlite",result_get_float,2); - -/* ************************************************************************ */ - -} // End anon-namespace - - -extern "C" int sqlite_register_prims() -{ - return 0; -} - - diff --git a/project/libs/std/Build.xml b/project/libs/std/Build.xml deleted file mode 100644 index 3753df02c..000000000 --- a/project/libs/std/Build.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/project/libs/std/File.cpp b/project/libs/std/File.cpp deleted file mode 100644 index 92f4ad096..000000000 --- a/project/libs/std/File.cpp +++ /dev/null @@ -1,425 +0,0 @@ -#include -#include -#include -#ifdef NEKO_WINDOWS -# include -#endif - -/** - -

File

-

- The file api can be used for different kind of file I/O. -

-
-**/ - -int __file_prims() { return 0; } - -#if defined(ANDROID) || defined(IPHONE) || defined(APPLETV) -typedef char FilenameChar; -#define val_filename val_string -#define alloc_filename alloc_string - -#define MAKE_STDIO(k) \ - static value file_##k() { \ - fio *f; \ - f = new fio(#k,k); \ - value result = alloc_abstract(k_file,f); \ - val_gc(result,free_stdfile); \ - return result; \ - } \ - DEFINE_PRIM(file_##k,0); - - -#else -typedef wchar_t FilenameChar; -#define val_filename val_wstring -#define alloc_filename alloc_wstring - -#define MAKE_STDIO(k) \ - static value file_##k() { \ - fio *f; \ - f = new fio(L###k,k); \ - value result = alloc_abstract(k_file,f); \ - val_gc(result,free_stdfile); \ - return result; \ - } \ - DEFINE_PRIM(file_##k,0); - - -#endif - -struct fio -{ - fio(const FilenameChar *inName, FILE *inFile=0) : io(inFile) - { - int len = 0; - for(const FilenameChar *p = inName; *p; p++) - len++; - name = new FilenameChar[len+1]; - memcpy(name, inName, len*sizeof(FilenameChar)); - name[len] = '\0'; - } - ~fio() - { - delete [] name; - } - - void close() - { - if (io) - { - fclose(io); - io = 0; - } - } - - FilenameChar *name; - FILE *io; -}; - -#define val_file(o) ((fio *)val_data(o)) - -static void free_file( value v ) -{ - fio *file = val_file(v); - file->close(); - delete file; - free_abstract(v); -} - -static void free_stdfile( value v ) -{ - // Delete, but do not close... - fio *file = val_file(v); - delete file; - free_abstract(v); -} - - - - -DECLARE_KIND(k_file); - -static void file_error( const char *msg, fio *f, bool delete_f = false ) { - gc_exit_blocking(); - value a = alloc_array(2); - val_array_set_i(a,0,alloc_string(msg)); - val_array_set_i(a,1,alloc_filename(f->name)); - if (delete_f) - delete f; - val_throw(a); -} - -/** - file_open : f:string -> r:string -> 'file - - Call the C function [fopen] with the file path and access rights. - Return the opened file or throw an exception if the file couldn't be open. - -**/ -static value file_open( value name, value r ) { - val_check(name,string); - val_check(r,string); - fio *f = new fio(val_filename(name)); - #ifdef NEKO_WINDOWS - const wchar_t *fname = val_wstring(name); - const wchar_t *mode = val_wstring(r); - gc_enter_blocking(); - f->io = _wfopen(fname,mode); - #else - const char *fname = val_string(name); - const char *mode = val_string(r); - gc_enter_blocking(); - f->io = fopen(fname,mode); - #endif - if( f->io == NULL ) - { - file_error("file_open",f,true); - } - gc_exit_blocking(); - value result = alloc_abstract(k_file,f); - val_gc(result,free_file); - return result; -} - -/** - file_close : 'file -> void - Close an file. Any other operations on this file will fail -**/ -static value file_close( value o ) { - fio *f; - val_check_kind(o,k_file); - f = val_file(o); - f->close(); - return alloc_bool(true); -} - -/** - file_name : 'file -> string - Return the name of the file which was opened -**/ -static value file_name( value o ) { - val_check_kind(o,k_file); - return alloc_filename(val_file(o)->name); -} - -/** - file_write : 'file -> s:string -> p:int -> l:int -> int - - Write up to [l] chars of string [s] starting at position [p]. - Returns the number of chars written which is >= 0. - -**/ -static value file_write( value o, value s, value pp, value n ) { - int p, len; - int buflen; - fio *f; - val_check_kind(o,k_file); - val_check(s,buffer); - buffer buf = val_to_buffer(s); - buflen = buffer_size(buf); - val_check(pp,int); - val_check(n,int); - f = val_file(o); - p = val_int(pp); - len = val_int(n); - if( p < 0 || len < 0 || p > buflen || p + len > buflen ) - return alloc_null(); - - gc_enter_blocking(); - while( len > 0 ) { - int d; - POSIX_LABEL(file_write_again); - d = (int)fwrite(buffer_data(buf)+p,1,len,f->io); - if( d <= 0 ) { - HANDLE_FINTR(f->io,file_write_again); - file_error("file_write",f); - } - p += d; - len -= d; - } - gc_exit_blocking(); - return n; -} - -/** - file_read : 'file -> s:string -> p:int -> l:int -> int - - Read up to [l] chars into the string [s] starting at position [p]. - Returns the number of chars readed which is > 0 (or 0 if l == 0). - -**/ -static value file_read( value o, value s, value pp, value n ) { - fio *f; - int p; - int len; - int buf_len; - val_check_kind(o,k_file); - val_check(s,buffer); - buffer buf = val_to_buffer(s); - buf_len = buffer_size(buf); - val_check(pp,int); - val_check(n,int); - f = val_file(o); - p = val_int(pp); - len = val_int(n); - if( p < 0 || len < 0 || p > buf_len || p + len > buf_len ) - return alloc_null(); - gc_enter_blocking(); - while( len > 0 ) { - int d; - POSIX_LABEL(file_read_again); - d = (int)fread(buffer_data(buf)+p,1,len,f->io); - if( d <= 0 ) { - int size = val_int(n) - len; - HANDLE_FINTR(f->io,file_read_again); - if( size == 0 ) - file_error("file_read",f); - gc_exit_blocking(); - return alloc_int(size); - } - p += d; - len -= d; - } - gc_exit_blocking(); - return n; -} - -/** - file_write_char : 'file -> c:int -> void - Write the char [c]. Error if [c] outside of the range 0..255 -**/ -static value file_write_char( value o, value c ) { - unsigned char cc; - fio *f; - val_check(c,int); - val_check_kind(o,k_file); - if( val_int(c) < 0 || val_int(c) > 255 ) - return alloc_null(); - cc = (char)val_int(c); - f = val_file(o); - gc_enter_blocking(); - POSIX_LABEL(write_char_again); - if( fwrite(&cc,1,1,f->io) != 1 ) { - HANDLE_FINTR(f->io,write_char_again); - file_error("file_write_char",f); - } - gc_exit_blocking(); - return alloc_bool(true); -} - -/** - file_read_char : 'file -> int - Read a char from the file. Exception on error -**/ -static value file_read_char( value o ) { - unsigned char cc; - fio *f; - val_check_kind(o,k_file); - f = val_file(o); - gc_enter_blocking(); - POSIX_LABEL(read_char_again); - if( fread(&cc,1,1,f->io) != 1 ) { - HANDLE_FINTR(f->io,read_char_again); - file_error("file_read_char",f); - } - gc_exit_blocking(); - return alloc_int(cc); -} - -/** - file_seek : 'file -> pos:int -> mode:int -> void - Use [fseek] to move the file pointer. -**/ -static value file_seek( value o, value pos, value kind ) { - fio *f; - val_check_kind(o,k_file); - val_check(pos,int); - val_check(kind,int); - f = val_file(o); - gc_enter_blocking(); - if( fseek(f->io,val_int(pos),val_int(kind)) != 0 ) - file_error("file_seek",f); - gc_exit_blocking(); - return alloc_bool(true); -} - -/** - file_tell : 'file -> int - Return the current position in the file -**/ -static value file_tell( value o ) { - int p; - fio *f; - val_check_kind(o,k_file); - f = val_file(o); - gc_enter_blocking(); - p = ftell(f->io); - if( p == -1 ) - file_error("file_tell",f); - gc_exit_blocking(); - return alloc_int(p); -} - -/** - file_eof : 'file -> bool - Tell if we have reached the end of the file -**/ -static value file_eof( value o ) { - val_check_kind(o,k_file); - return alloc_bool( feof(val_file(o)->io) ); -} - -/** - file_flush : 'file -> void - Flush the file buffer -**/ -static value file_flush( value o ) { - fio *f; - val_check_kind(o,k_file); - f = val_file(o); - gc_enter_blocking(); - if( fflush( f->io ) != 0 ) - file_error("file_flush",f); - gc_exit_blocking(); - return alloc_bool(true); -} - -/** - file_contents : f:string -> string - Read the content of the file [f] and return it. -**/ -static value file_contents( value name ) { - buffer s=0; - int len; - int p; - val_check(name,string); - fio f(val_filename(name)); - #ifdef NEKO_WINDOWS - const wchar_t *fname = val_wstring(name); - gc_enter_blocking(); - f.io = _wfopen(fname,L"rb"); - #else - const char *fname = val_string(name); - gc_enter_blocking(); - f.io = fopen(fname,"rb"); - #endif - if( f.io == NULL ) - file_error("file_contents",&f); - fseek(f.io,0,SEEK_END); - len = ftell(f.io); - fseek(f.io,0,SEEK_SET); - gc_exit_blocking(); - s = alloc_buffer_len(len); - p = 0; - gc_enter_blocking(); - while( len > 0 ) { - int d; - POSIX_LABEL(file_contents); - d = (int)fread((char*)buffer_data(s)+p,1,len,f.io); - if( d <= 0 ) { - HANDLE_FINTR(f.io,file_contents); - fclose(f.io); - file_error("file_contents",&f); - } - p += d; - len -= d; - } - fclose(f.io); - gc_exit_blocking(); - return buffer_val(s); -} - - -/** - file_stdin : void -> 'file - The standard input -**/ -MAKE_STDIO(stdin); -/** - file_stdout : void -> 'file - The standard output -**/ -MAKE_STDIO(stdout); -/** - file_stderr : void -> 'file - The standard error output -**/ -MAKE_STDIO(stderr); - -DEFINE_PRIM(file_open,2); -DEFINE_PRIM(file_close,1); -DEFINE_PRIM(file_name,1); -DEFINE_PRIM(file_write,4); -DEFINE_PRIM(file_read,4); -DEFINE_PRIM(file_write_char,2); -DEFINE_PRIM(file_read_char,1); -DEFINE_PRIM(file_seek,3); -DEFINE_PRIM(file_tell,1); -DEFINE_PRIM(file_eof,1); -DEFINE_PRIM(file_flush,1); -DEFINE_PRIM(file_contents,1); - -/* ************************************************************************ */ diff --git a/project/libs/std/Init.cpp b/project/libs/std/Init.cpp deleted file mode 100644 index 52e721114..000000000 --- a/project/libs/std/Init.cpp +++ /dev/null @@ -1,88 +0,0 @@ -#include - -field id_h; -field id_m; -field id_s; -field id_y; -field id_d; -field id_module; -field id_loadmodule; -field id_loadprim; -field id_done; -field id_comment; -field id_xml; -field id_pcdata; -field id_cdata; -field id_doctype; -field id_serialize; -field id_unserialize; -field id___s; - - -DEFINE_KIND( k_file ); -DEFINE_KIND( k_socket ); -DEFINE_KIND( k_random ); -DEFINE_KIND( k_poll ); - -extern "C" void std_main() { - id_h = val_id("h"); - id_m = val_id("m"); - id_s = val_id("s"); - id_y = val_id("y"); - id_d = val_id("d"); - id_loadmodule = val_id("loadmodule"); - id_loadprim = val_id("loadprim"); - id_module = val_id("__module"); - id_done = val_id("done"); - id_comment = val_id("comment"); - id_xml = val_id("xml"); - id_pcdata = val_id("pcdata"); - id_cdata = val_id("cdata"); - id_doctype = val_id("doctype"); - id___s = val_id("__s"); - id_serialize = val_id("__serialize"); - id_unserialize = val_id("__unserialize"); - kind_share(&k_file,"file"); - kind_share(&k_socket,"socket"); - kind_share(&k_poll,"poll"); - kind_share(&k_random,"random"); -} - -DEFINE_ENTRY_POINT(std_main); - -extern int __file_prims(); -extern int __misc_prims(); -extern int __process_prims(); -extern int __random_prims(); -extern int __socket_prims(); -extern int __string_prims(); -extern int __sys_prims(); -extern int __xml_prims(); - - -extern "C" { - -// Called when static linking to bring in the required symbols and initaliaze -int std_register_prims() -{ - static bool init = false; - if (init) return 0; - init = true; - - std_main(); - return - __file_prims() - + __misc_prims() - + __process_prims() - + __random_prims() - + __socket_prims() - + __string_prims() - + __sys_prims() - + __xml_prims(); - -} - -} - - -/* ************************************************************************ */ diff --git a/project/libs/std/Interface.cpp b/project/libs/std/Interface.cpp deleted file mode 100644 index 4004bf876..000000000 --- a/project/libs/std/Interface.cpp +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef STATIC_LINK -#define IMPLEMENT_API - -#include -#endif diff --git a/project/libs/std/Misc.cpp b/project/libs/std/Misc.cpp deleted file mode 100644 index 318fa9bcb..000000000 --- a/project/libs/std/Misc.cpp +++ /dev/null @@ -1,238 +0,0 @@ -#include - -int __misc_prims() { return 0; } - -static bool is_big_endian() -{ - static unsigned char bytes[] = { 1, 0, 0, 0 }; - return (*(int *)bytes) != 1; -}; - -/** - float_bytes : number -> bigendian:bool -> string - Returns the 4 bytes representation of the number as an IEEE 32-bit float -**/ -static value float_bytes( value n, value be ) { - float f; - val_check(n,number); - val_check(be,bool); - f = (float)val_number(n); - char *ptr = (char *)&f; - buffer bytes = alloc_buffer_len(4); - char *dest = (char *)buffer_data(bytes); - if( is_big_endian() != val_bool(be) ) { - dest[3] = *ptr++; - dest[2] = *ptr++; - dest[1] = *ptr++; - dest[0] = *ptr++; - } - else { - dest[0] = *ptr++; - dest[1] = *ptr++; - dest[2] = *ptr++; - dest[3] = *ptr++; - } - return buffer_val(bytes); -} - - -static value double_bytes( value n, value be ) { - double f; - val_check(n,number); - val_check(be,bool); - f = (double)val_number(n); - unsigned char *ptr = (unsigned char *)&f; - buffer bytes = alloc_buffer_len(8); - char *dest = (char *)buffer_data(bytes); - if( is_big_endian() != val_bool(be) ) { - dest[7] = *ptr++; - dest[6] = *ptr++; - dest[5] = *ptr++; - dest[4] = *ptr++; - dest[3] = *ptr++; - dest[2] = *ptr++; - dest[1] = *ptr++; - dest[0] = *ptr++; - } - else { - dest[0] = *ptr++; - dest[1] = *ptr++; - dest[2] = *ptr++; - dest[3] = *ptr++; - dest[4] = *ptr++; - dest[5] = *ptr++; - dest[6] = *ptr++; - dest[7] = *ptr++; - } - return buffer_val(bytes); -} - - -/** - float_of_bytes : string -> bigendian:bool -> float - Returns a float from a 4 bytes IEEE 32-bit representation -**/ -static value float_of_bytes( value s, value be ) { - float f; - val_check(be,bool); - buffer bytes = val_to_buffer(s); - if( bytes==0) - return alloc_null(); - f = *(float*)buffer_data(bytes); - char *c = (char*)&f; - if( is_big_endian() != val_bool(be) ) { - char *c = (char*)&f; - char tmp; - tmp = c[0]; c[0] = c[3]; c[3] = tmp; - tmp = c[1]; c[1] = c[2]; c[2] = tmp; - } - return alloc_float(f); -} - -static value double_of_bytes( value s, value be ) { - double f; - val_check(be,bool); - buffer bytes = val_to_buffer(s); - if( bytes==0) - return alloc_null(); - f = *(double*)buffer_data(bytes); - if( is_big_endian() != val_bool(be) ) { - char *c = (char*)&f; - char tmp; - tmp = c[0]; c[0] = c[7]; c[7] = tmp; - tmp = c[1]; c[1] = c[6]; c[6] = tmp; - tmp = c[2]; c[2] = c[5]; c[5] = tmp; - tmp = c[3]; c[3] = c[4]; c[4] = tmp; - } - return alloc_float(f); -} - - - -#if 0 - -/** - double_of_bytes : string -> bigendian:bool -> float - Returns a float from a 8 bytes IEEE 64-bit representation -**/ - -/** - run_gc : major:bool -> void - Run the Neko garbage collector -**/ -static value run_gc( value b ) { - val_check(b,bool); - if( val_bool(b) ) - neko_gc_major(); - else - neko_gc_loop(); - return val_null; -} - -/** - gc_stats : void -> { heap => int, free => int } - Return the size of the GC heap and the among of free space, in bytes -**/ -static value gc_stats() { - int heap, free; - value o; - neko_gc_stats(&heap,&free); - o = alloc_object(NULL); - alloc_field(o,val_id("heap"),alloc_int(heap)); - alloc_field(o,val_id("free"),alloc_int(free)); - return o; -} - -/** - enable_jit : bool -> void - Enable or disable the JIT. -**/ -static value enable_jit( value b ) { - val_check(b,bool); - neko_vm_jit(neko_vm_current(),val_bool(b)); - return val_null; -} - -/** - test : void -> void - The test function, to check that library is reachable and correctly linked -**/ -static value test() { - val_print(alloc_string("Calling a function inside std library...\n")); - return val_null; -} - -/** - print_redirect : function:1? -> void - - Set a redirection function for all printed values. - Setting it to null will cancel the redirection and restore previous printer. - -**/ - -static void print_callback( const char *s, int size, void *f ) { - val_call1(f,copy_string(s,size)); -} - -static value print_redirect( value f ) { - neko_vm *vm = neko_vm_current(); - if( val_is_null(f) ) { - neko_vm_redirect(vm,NULL,NULL); - return val_null; - } - val_check_function(f,1); - neko_vm_redirect(vm,print_callback,f); - return val_null; -} - -/** - set_trusted : bool -> void - - Change the trusted mode of the VM. - This can optimize some operations such as module loading by turning off some checks. - -**/ -static value set_trusted( value b ) { - val_check(b,bool); - neko_vm_trusted(neko_vm_current(),val_bool(b)); - return val_null; -} - -/** - same_closure : f1 -> f2 -> bool - - Compare two functions by checking that they refer to the same implementation and that their environments contains physically equal values. - -**/ -static value same_closure( value _f1, value _f2 ) { - vfunction *f1 = (vfunction*)_f1; - vfunction *f2 = (vfunction*)_f2; - int i; - if( !val_is_function(f1) || !val_is_function(f2) ) - return val_false; - if( f1 == f2 ) - return val_true; - if( f1->nargs != f2->nargs || f1->addr != f2->addr || f1->module != f2->module || val_array_size(f1->env) != val_array_size(f2->env) ) - return val_false; - for(i=0;ienv);i++) - if( val_array_ptr(f1->env)[i] != val_array_ptr(f2->env)[i] ) - return val_false; - return val_true; -} - -DEFINE_PRIM(run_gc,1); -DEFINE_PRIM(gc_stats,0); -DEFINE_PRIM(enable_jit,1); -DEFINE_PRIM(test,0); -DEFINE_PRIM(print_redirect,1); -DEFINE_PRIM(set_trusted,1); -DEFINE_PRIM(same_closure,2); - -/* ************************************************************************ */ - -#endif - -DEFINE_PRIM(float_bytes,2); -DEFINE_PRIM(double_bytes,2); -DEFINE_PRIM(float_of_bytes,2); -DEFINE_PRIM(double_of_bytes,2); diff --git a/project/libs/std/Process.cpp b/project/libs/std/Process.cpp deleted file mode 100644 index 24d2e4c83..000000000 --- a/project/libs/std/Process.cpp +++ /dev/null @@ -1,473 +0,0 @@ -#include - -#if !defined(HX_WINRT) && !defined(EPPC) - -#ifdef NEKO_WINDOWS -# include -#else -# include -# include -# include -# include -# if defined(ANDROID) || defined(BLACKBERRY) || defined(EMSCRIPTEN) -# include -# elif !defined(NEKO_MAC) -# include -# endif -#endif - -#include -#include - - -typedef struct { -#ifdef NEKO_WINDOWS - HANDLE oread; - HANDLE eread; - HANDLE iwrite; - PROCESS_INFORMATION pinf; -#else - int oread; - int eread; - int iwrite; - int pid; -#endif -} vprocess; - -DEFINE_KIND(k_process); - -#define val_process(v) ((vprocess*)val_data(v)) - -/** - -

Process

-

- An API for starting and communication with sub processes. -

-
-**/ -#ifndef NEKO_WINDOWS -static int do_close( int fd ) { - POSIX_LABEL(close_again); - if( close(fd) != 0 ) { - HANDLE_EINTR(close_again); - return 1; - } - return 0; -} -#endif - -static void free_process( value vp ) { - vprocess *p = val_process(vp); -# ifdef NEKO_WINDOWS - CloseHandle(p->eread); - CloseHandle(p->oread); - CloseHandle(p->iwrite); - CloseHandle(p->pinf.hProcess); - CloseHandle(p->pinf.hThread); -# else - do_close(p->eread); - do_close(p->oread); - do_close(p->iwrite); -# endif - free(p); -} - -/** - process_run : cmd:string -> args:string array -> 'process - - Start a process using a command. - When args is not null, cmd and args will be auto-quoted/escaped. - If no auto-quoting/escaping is desired, you should append necessary - arguments to cmd as if it is inputted to the shell directly, and pass - null to args. - -**/ -static value process_run( value cmd, value vargs ) { - #ifdef APPLETV - return alloc_null(); - #else - int i; - vprocess *p; - val_check(cmd,string); - bool isRaw = val_is_null(vargs); -# ifdef NEKO_WINDOWS - { - SECURITY_ATTRIBUTES sattr; - STARTUPINFOW sinf; - HANDLE proc = GetCurrentProcess(); - HANDLE oread,eread,iwrite; - // creates commandline - buffer b = alloc_buffer(NULL); - value sargs; - if (isRaw) { - buffer_append(b,"\""); - char* cmdexe = getenv("COMSPEC"); - if (!cmdexe) cmdexe = "cmd.exe"; - buffer_append(b,cmdexe); - buffer_append(b,"\" /C \""); - buffer_append(b,val_string(cmd)); - buffer_append_char(b,'"'); - } else { - val_check(vargs,array); - buffer_append(b,"\""); - val_buffer(b,cmd); - buffer_append(b,"\""); - for(i=0;ioread,0,FALSE,DUPLICATE_SAME_ACCESS); - DuplicateHandle(proc,eread,proc,&p->eread,0,FALSE,DUPLICATE_SAME_ACCESS); - DuplicateHandle(proc,iwrite,proc,&p->iwrite,0,FALSE,DUPLICATE_SAME_ACCESS); - CloseHandle(oread); - CloseHandle(eread); - CloseHandle(iwrite); - //printf("Cmd %s\n",val_string(cmd)); - if( !CreateProcessW(NULL,name,NULL,NULL,TRUE,0,NULL,NULL,&sinf,&p->pinf) ) - { - free(p); - gc_exit_blocking(); - val_throw(alloc_null()); - return alloc_null(); - } - // close unused pipes - CloseHandle(sinf.hStdOutput); - CloseHandle(sinf.hStdError); - CloseHandle(sinf.hStdInput); - gc_exit_blocking(); - } -#else - char **argv; - if (isRaw) { - argv = (char**)malloc(sizeof(char*)*4); - argv[0] = strdup("/bin/sh"); - argv[1] = strdup("-c"); - argv[2] = strdup(val_string(cmd)); - argv[3] = NULL; - } else { - argv = (char**)malloc(sizeof(char*)*(val_array_size(vargs)+2)); - - argv[0] = strdup(val_string(cmd)); - for(i=0;ipid = fork(); - if( p->pid == -1 ) { - for(i=0;i<=(isRaw ? 2 : val_array_size(vargs));i++) - free(argv[i]); - free(argv); - free(p); - return alloc_null(); - } - gc_enter_blocking(); - // child - if( p->pid == 0 ) { - close(input[1]); - close(output[0]); - close(error[0]); - dup2(input[0],0); - dup2(output[1],1); - dup2(error[1],2); - execvp(argv[0],argv); - fprintf(stderr,"Command not found : %s\n",val_string(cmd)); - exit(1); - } - // parent - for(i=0;i<=(isRaw ? 2 : val_array_size(vargs));i++) - free(argv[i]); - free(argv); - do_close(input[0]); - do_close(output[1]); - do_close(error[1]); - p->iwrite = input[1]; - p->oread = output[0]; - p->eread = error[0]; - gc_exit_blocking(); -# endif - { - value vp = alloc_abstract(k_process,p); - val_gc(vp,free_process); - return vp; - } - #endif -} - -// CPP streams are byte-based, not char based ... -#define CHECK_ARGS() \ - vprocess *p; \ - buffer buf; \ - val_check_kind(vp,k_process); \ - val_check(str,buffer); \ - buf = val_to_buffer(str); \ - val_check(pos,int); \ - val_check(len,int); \ - if( val_int(pos) < 0 || val_int(len) < 0 || val_int(pos) + val_int(len) > buffer_size(buf) ) \ - return alloc_null(); \ - p = val_process(vp); \ - - -/** - process_stdout_read : 'process -> buf:string -> pos:int -> len:int -> int - - Read up to [len] bytes in [buf] starting at [pos] from the process stdout. - Returns the number of bytes readed this way. Raise an exception if this - process stdout is closed and no more data is available for reading. - - For hxcpp, the input buffer is in bytes, not characters - -**/ -static value process_stdout_read( value vp, value str, value pos, value len ) { - CHECK_ARGS(); - gc_enter_blocking(); -# ifdef NEKO_WINDOWS - { - DWORD nbytes; - if( !ReadFile(p->oread,buffer_data(buf)+val_int(pos),val_int(len),&nbytes,NULL) ) - { - gc_exit_blocking(); - return alloc_null(); - } - gc_exit_blocking(); - return alloc_int(nbytes); - } -# else - int nbytes = read(p->oread,buffer_data(buf) + val_int(pos),val_int(len)); - if( nbytes <= 0 ) - { - gc_exit_blocking(); - return alloc_null(); - } - gc_exit_blocking(); - return alloc_int(nbytes); -# endif -} - -/** - process_stderr_read : 'process -> buf:string -> pos:int -> len:int -> int - - Read up to [len] bytes in [buf] starting at [pos] from the process stderr. - Returns the number of bytes readed this way. Raise an exception if this - process stderr is closed and no more data is available for reading. - -**/ -static value process_stderr_read( value vp, value str, value pos, value len ) { - CHECK_ARGS(); - - gc_enter_blocking(); -# ifdef NEKO_WINDOWS - DWORD nbytes; - if( !ReadFile(p->eread,buffer_data(buf)+val_int(pos),val_int(len),&nbytes,NULL) ) -# else - int nbytes = read(p->eread,buffer_data(buf)+val_int(pos),val_int(len)); - if( nbytes <= 0 ) -# endif - { - gc_exit_blocking(); - return alloc_null(); - } - gc_exit_blocking(); - return alloc_int(nbytes); -} - -/** - process_stdin_write : 'process -> buf:string -> pos:int -> len:int -> int - - Write up to [len] bytes from [buf] starting at [pos] to the process stdin. - Returns the number of bytes writen this way. Raise an exception if this - process stdin is closed. - -**/ -static value process_stdin_write( value vp, value str, value pos, value len ) { - CHECK_ARGS(); - gc_enter_blocking(); -# ifdef NEKO_WINDOWS - DWORD nbytes; - if( !WriteFile(p->iwrite,buffer_data(buf)+val_int(pos),val_int(len),&nbytes,NULL) ) -# else - int nbytes = write(p->iwrite,buffer_data(buf)+val_int(pos),val_int(len)); - if( nbytes == -1 ) -# endif - { - gc_exit_blocking(); - return alloc_null(); - } - gc_exit_blocking(); - return alloc_int(nbytes); -} - -/** - process_stdin_close : 'process -> void - - Close the process standard input. - -**/ -static value process_stdin_close( value vp ) { - vprocess *p; - val_check_kind(vp,k_process); - p = val_process(vp); -# ifdef NEKO_WINDOWS - if( !CloseHandle(p->iwrite) ) - return alloc_null(); -# else - if( do_close(p->iwrite) ) - return alloc_null(); - p->iwrite = -1; -# endif - return val_null; -} - -/** - process_exit : 'process -> int - - Wait until the process terminate, then returns its exit code. - -**/ -static value process_exit( value vp ) { - vprocess *p; - val_check_kind(vp,k_process); - p = val_process(vp); - gc_enter_blocking(); -# ifdef NEKO_WINDOWS - { - DWORD rval; - WaitForSingleObject(p->pinf.hProcess,INFINITE); - gc_exit_blocking(); - if( !GetExitCodeProcess(p->pinf.hProcess,&rval) ) - return alloc_null(); - return alloc_int(rval); - } -# else - int rval; - while( waitpid(p->pid,&rval,0) != p->pid ) { - if( errno == EINTR ) - continue; - gc_exit_blocking(); - return alloc_null(); - } - gc_exit_blocking(); - if( !WIFEXITED(rval) ) - return alloc_null(); - return alloc_int(WEXITSTATUS(rval)); -# endif -} - -/** - process_pid : 'process -> int - - Returns the process id. - -**/ -static value process_pid( value vp ) { - vprocess *p; - val_check_kind(vp,k_process); - p = val_process(vp); -# ifdef NEKO_WINDOWS - return alloc_int(p->pinf.dwProcessId); -# else - return alloc_int(p->pid); -# endif -} - -/** - process_close : 'process -> void - - Close the process I/O. - -**/ -static value process_close( value vp ) { - val_check_kind(vp,k_process); - free_process(vp); - free_abstract(vp); - return val_null; -} - -#else // !HX_WINRT - -static value process_run(value , value ) { return alloc_null(); } -static value process_stdout_read(value, value, value, value) { return alloc_null(); } -static value process_stderr_read(value ,value ,value ,value ) { return alloc_null(); } -static value process_stdin_close(value) { return alloc_null(); } -static value process_stdin_write(value ,value ,value ,value ) { return alloc_null(); } -static value process_exit( value ) { return alloc_null(); } -static value process_pid( value ) { return alloc_null(); } -static value process_close( value ) { return alloc_null(); } - -#endif // HX_WINRT - -int __process_prims() { return 0; } - -DEFINE_PRIM(process_run,2); -DEFINE_PRIM(process_stdout_read,4); -DEFINE_PRIM(process_stderr_read,4); -DEFINE_PRIM(process_stdin_close,1); -DEFINE_PRIM(process_stdin_write,4); -DEFINE_PRIM(process_exit,1); -DEFINE_PRIM(process_pid,1); -DEFINE_PRIM(process_close,1); - -/* ************************************************************************ */ diff --git a/project/libs/std/Random.cpp b/project/libs/std/Random.cpp deleted file mode 100644 index b7c0b42b4..000000000 --- a/project/libs/std/Random.cpp +++ /dev/null @@ -1,174 +0,0 @@ -#include -#include -#include -#ifdef NEKO_WINDOWS -# include -# include -#elif defined(EPPC) -# include -#else -# include -# include -# include -#endif - - -int __random_prims() {return 0; } -/** - -

Random

-

A seeded pseudo-random generator

-
-**/ - -DECLARE_KIND(k_random); - -#define val_rnd(o) ((rnd*)val_data(o)) - -#define NSEEDS 25 -#define MAX 7 - -typedef struct _rnd rnd; - -struct _rnd { - unsigned long seeds[NSEEDS]; - unsigned long cur; -}; - -static unsigned long mag01[2]={ - 0x0, 0x8ebfd028 // magic, don't change -}; - -static const unsigned long init_seeds[] = { - 0x95f24dab, 0x0b685215, 0xe76ccae7, 0xaf3ec239, 0x715fad23, - 0x24a590ad, 0x69e4b5ef, 0xbf456141, 0x96bc1b7b, 0xa7bdf825, - 0xc1de75b7, 0x8858a9c9, 0x2da87693, 0xb657f9dd, 0xffdc8a9f, - 0x8121da71, 0x8b823ecb, 0x885d05f5, 0x4e20cd47, 0x5a9ad5d9, - 0x512c0c03, 0xea857ccd, 0x4cc1d30f, 0x8891a8a1, 0xa6b7aadb -}; - -static int rnd_size() { - return sizeof(rnd); -} - -static void rnd_set_seed( rnd *r, int s ) { - int i; - r->cur = 0; - memcpy(r->seeds,init_seeds,sizeof(init_seeds)); - for(i=0;iseeds[i] ^= s; -} - -static rnd *rnd_init( void *data ) { - rnd *r = (rnd*)data; -#if defined(NEKO_WINDOWS) - #if defined(HX_WINRT) && defined(__cplusplus_winrt) - int pid = Windows::Security::Cryptography::CryptographicBuffer::GenerateRandomNumber(); - #else - int pid = GetCurrentProcessId(); - #endif -#elif defined(EPPC) - int pid = 1; -#else - int pid = getpid(); -#endif - - unsigned int t; -#ifdef HX_WINRT - t = (unsigned int)GetTickCount64(); -#elif defined(NEKO_WINDOWS) - t = GetTickCount(); -#elif defined(EPPC) - time_t tod; - time(&tod); - t = (double)tod; -#else - struct timeval tv; - gettimeofday(&tv,NULL); - t = tv.tv_sec * 1000000 + tv.tv_usec; -#endif - rnd_set_seed(r,t ^ (pid | (pid << 16))); - return r; -} - -static unsigned int rnd_int( rnd *r ) { - unsigned int y; - int pos = r->cur++; - if( pos >= NSEEDS ) { - int kk; - for(kk=0;kkseeds[kk] = r->seeds[kk+MAX] ^ (r->seeds[kk] >> 1) ^ mag01[r->seeds[kk] % 2]; - for(;kkseeds[kk] = r->seeds[kk+(MAX-NSEEDS)] ^ (r->seeds[kk] >> 1) ^ mag01[r->seeds[kk] % 2]; - r->cur = 1; - pos = 0; - } - y = r->seeds[pos]; - y ^= (y << 7) & 0x2b5b2500; - y ^= (y << 15) & 0xdb8b0000; - y ^= (y >> 16); - return y; -} - -static double rnd_float( rnd *r ) { - double big = 4294967296.0; - return ((rnd_int(r) / big + rnd_int(r)) / big + rnd_int(r)) / big; -} - -/** - random_new : void -> 'random - Create a new random with random seed -**/ - - -#include -void free_rand(value v) -{ - free(val_data(v)); - free_abstract(v); -} - -static value random_new() { - value v = alloc_abstract( k_random, rnd_init(malloc(rnd_size())) ); - val_gc(v,free_rand); - return v; -} - -/** - random_set_seed : 'random -> int -> void - Set the generator seed -**/ -static value random_set_seed( value o, value v ) { - val_check_kind(o,k_random); - val_check(v,int); - rnd_set_seed(val_rnd(o),val_int(v)); - return alloc_bool(true); -} - -/** - random_int : 'random -> max:int -> int - Return a random integer modulo [max] -**/ -static value random_int( value o, value max ) { - val_check_kind(o,k_random); - val_check(max,int); - if( val_int(max) <= 0 ) - return alloc_int(0); - return alloc_int( (rnd_int(val_rnd(o)) & 0x3FFFFFFF) % val_int(max) ); -} - -/** - random_float : 'random -> float - Return a random float -**/ -static value random_float( value o ) { - val_check_kind(o,k_random); - return alloc_float( rnd_float(val_rnd(o)) ); -} - -DEFINE_PRIM(random_new,0); -DEFINE_PRIM(random_set_seed,2); -DEFINE_PRIM(random_int,2); -DEFINE_PRIM(random_float,1); - -/* ************************************************************************ */ diff --git a/project/libs/std/Socket.cpp b/project/libs/std/Socket.cpp deleted file mode 100644 index 239e05e49..000000000 --- a/project/libs/std/Socket.cpp +++ /dev/null @@ -1,1153 +0,0 @@ -#if !defined(HX_WINRT) && !defined(EPPC) - -#include -#include -#ifdef NEKO_WINDOWS -# include -# define FDSIZE(n) (sizeof(u_int) + (n) * sizeof(SOCKET)) -# define SHUT_WR SD_SEND -# define SHUT_RD SD_RECEIVE -# define SHUT_RDWR SD_BOTH - static bool init_done = false; - static WSADATA init_data; -typedef int SocketLen; -#else -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include - typedef int SOCKET; -# define closesocket close -# define SOCKET_ERROR (-1) -# define INVALID_SOCKET (-1) -typedef socklen_t SocketLen; -#endif - -#if defined(NEKO_WINDOWS) || defined(NEKO_MAC) -# define MSG_NOSIGNAL 0 -#endif - - -typedef struct { - int max; -# ifdef NEKO_WINDOWS - struct fd_set *fdr; - struct fd_set *fdw; - struct fd_set *outr; - struct fd_set *outw; -# else - struct pollfd *fds; - int rcount; - int wcount; -# endif - value ridx; - value widx; -} polldata; - -DECLARE_KIND(k_socket); -DECLARE_KIND(k_poll); - -typedef size_t socket_int; - -#define val_poll(o) ((polldata*)val_data(o)) - -extern field id___s; -static field f_host; -static field f_port; - - -SOCKET val_sock(value inValue) -{ - if (!val_is_null(inValue)) - { - if (val_is_kind(inValue,k_socket) ) - return ((SOCKET)(socket_int)val_data(inValue)); - inValue = val_field(inValue,id___s); - if (val_is_kind(inValue,k_socket) ) - return ((SOCKET)(socket_int)val_data(inValue)); - } - val_throw(alloc_string("Invalid socket handle")); - return 0; -} - - -/** - -

Socket

-

- TCP and UDP sockets -

-
-**/ - -static value block_error() { - gc_exit_blocking(); -#ifdef NEKO_WINDOWS - int err = WSAGetLastError(); - if( err == WSAEWOULDBLOCK || err == WSAEALREADY ) -#else - if( errno == EAGAIN || errno == EWOULDBLOCK || errno == EINPROGRESS || errno == EALREADY ) -#endif - val_throw(alloc_string("Blocking")); - else { - val_throw(alloc_string("EOF")); - } - return alloc_null(); -} - -/** - socket_init : void -> void - - Initialize the socket API. Must be called at least once per process - before using any socket or host function. - -**/ -static value socket_init() { -#ifdef NEKO_WINDOWS - if( !init_done ) { - WSAStartup(MAKEWORD(2,0),&init_data); - init_done = true; - } -#endif - f_host = val_id("host"); - f_port = val_id("port"); - return alloc_bool(true); -} - - -/** - socket_new : udp:bool -> 'socket - Create a new socket, TCP or UDP -**/ -static value socket_new( value udp ) { - SOCKET s; - val_check(udp,bool); - if( val_bool(udp) ) - s = socket(AF_INET,SOCK_DGRAM,0); - else - s = socket(AF_INET,SOCK_STREAM,0); - if( s == INVALID_SOCKET ) - return alloc_null(); -# ifdef NEKO_MAC - int set = 1; - setsockopt(s,SOL_SOCKET,SO_NOSIGPIPE,(void *)&set, sizeof(int)); -# endif -# ifdef NEKO_POSIX - // we don't want sockets to be inherited in case of exec - { - int old = fcntl(s,F_GETFD,0); - if( old >= 0 ) fcntl(s,F_SETFD,old|FD_CLOEXEC); - } -# endif - return alloc_abstract(k_socket,(void *)(socket_int)s); -} - -/** - socket_close : 'socket -> void - Close a socket. Any subsequent operation on this socket will fail -**/ -static value socket_close( value o ) { - POSIX_LABEL(close_again); - if( closesocket(val_sock(o)) ) { - HANDLE_EINTR(close_again); - } - return alloc_bool(true); -} - -/** - socket_send_char : 'socket -> int -> void - Send a character over a connected socket. Must be in the range 0..255 -**/ -static value socket_send_char( value o, value v ) { - int c; - unsigned char cc; - SOCKET sock = val_sock(o); - val_check(v,int); - c = val_int(v); - if( c < 0 || c > 255 ) - return alloc_null(); - cc = (unsigned char)c; - gc_enter_blocking(); - POSIX_LABEL(send_char_again); - if( send(sock,(const char *)&cc,1,MSG_NOSIGNAL) == SOCKET_ERROR ) { - HANDLE_EINTR(send_char_again); - return block_error(); - } - gc_exit_blocking(); - return alloc_bool(true); -} - -/** - socket_send : 'socket -> buf:string -> pos:int -> len:int -> int - Send up to [len] bytes from [buf] starting at [pos] over a connected socket. - Return the number of bytes sent. -**/ -static value socket_send( value o, value data, value pos, value len ) { - int p,l,dlen; - SOCKET sock = val_sock(o); - val_check(pos,int); - val_check(len,int); - buffer buf = val_to_buffer(data); - if (!buf) - hx_failure("not bytebuffer"); - p = val_int(pos); - l = val_int(len); - dlen = buffer_size(buf); - if( p < 0 || l < 0 || p > dlen || p + l > dlen ) - return alloc_null(); - gc_enter_blocking(); - dlen = send(sock, buffer_data(buf) + p , l, MSG_NOSIGNAL); - if( dlen == SOCKET_ERROR ) - return block_error(); - gc_exit_blocking(); - return alloc_int(dlen); -} - -/** - socket_recv : 'socket -> buf:string -> pos:int -> len:int -> int - Read up to [len] bytes from [buf] starting at [pos] from a connected socket. - Return the number of bytes readed. -**/ -static value socket_recv( value o, value data, value pos, value len ) { - int p,l,dlen; - SOCKET sock = val_sock(o); - val_check(data,buffer); - buffer buf = val_to_buffer(data); - val_check(pos,int); - val_check(len,int); - p = val_int(pos); - l = val_int(len); - dlen = buffer_size(buf); - if( p < 0 || l < 0 || p > dlen || p + l > dlen ) - return alloc_null(); - gc_enter_blocking(); - POSIX_LABEL(recv_again); - dlen = recv(sock, buffer_data(buf) + p, l, MSG_NOSIGNAL); - if( dlen == SOCKET_ERROR ) { - HANDLE_EINTR(recv_again); - return block_error(); - } - gc_exit_blocking(); - return alloc_int(dlen); -} - -/** - socket_recv_char : 'socket -> int - Read a single char from a connected socket. -**/ -static value socket_recv_char( value o ) { - int ret; - unsigned char cc; - SOCKET sock = val_sock(o); - gc_enter_blocking(); - POSIX_LABEL(recv_char_again); - ret = recv(sock,(char *)&cc,1,MSG_NOSIGNAL); - if( ret == SOCKET_ERROR ) { - HANDLE_EINTR(recv_char_again); - return block_error(); - } - gc_exit_blocking(); - if( ret == 0 ) - val_throw(alloc_string("Connection closed")); - return alloc_int(cc); -} - - -/** - socket_write : 'socket -> string -> void - Send the whole content of a string over a connected socket. -**/ -static value socket_write( value o, value data ) { - const char *cdata; - int datalen, slen; - SOCKET sock = val_sock(o); - val_check(data,buffer); - buffer buf = val_to_buffer(data); - cdata = buffer_data(buf); - datalen = buffer_size(buf); - gc_enter_blocking(); - while( datalen > 0 ) { - POSIX_LABEL(write_again); - slen = send(sock,cdata,datalen,MSG_NOSIGNAL); - if( slen == SOCKET_ERROR ) { - HANDLE_EINTR(write_again); - return block_error(); - } - cdata += slen; - datalen -= slen; - } - gc_exit_blocking(); - return alloc_bool(true); -} - - -/** - socket_read : 'socket -> string - Read the whole content of a the data available from a socket until the connection close. - If the socket hasn't been close by the other side, the function might block. - -**/ -static value socket_read( value o ) { - buffer b; - char buf[256]; - int len; - SOCKET sock = val_sock(o); - b = alloc_buffer(NULL); - gc_enter_blocking(); - while( true ) { - POSIX_LABEL(read_again); - len = recv(sock,buf,256,MSG_NOSIGNAL); - if( len == SOCKET_ERROR ) { - HANDLE_EINTR(read_again); - return block_error(); - } - if( len == 0 ) - break; - gc_exit_blocking(); - buffer_append_sub(b,buf,len); - gc_enter_blocking(); - } - gc_exit_blocking(); - return buffer_val(b); -} - -/** - host_resolve : string -> 'int32 - Resolve the given host string into an IP address. -**/ -static value host_resolve( value host ) { - unsigned int ip; - val_check(host,string); - - const char *hostName = val_string(host); - gc_enter_blocking(); - ip = inet_addr(hostName); - if( ip == INADDR_NONE ) { - struct hostent *h; -# if defined(NEKO_WINDOWS) || defined(NEKO_MAC) || defined(BLACKBERRY) || defined(EMSCRIPTEN) - h = gethostbyname(hostName); -# else - struct hostent hbase; - char buf[1024]; - int errcode; - gethostbyname_r(hostName,&hbase,buf,1024,&h,&errcode); -# endif - if( h == NULL ) { - gc_exit_blocking(); - return alloc_null(); - } - ip = *((unsigned int*)h->h_addr); - } - gc_exit_blocking(); - return alloc_int32(ip); -} - -/** - host_to_string : 'int32 -> string - Return a string representation of the IP address. -**/ -static value host_to_string( value ip ) { - struct in_addr i; - val_check(ip,int); - *(int*)&i = val_int(ip); - return alloc_string( inet_ntoa(i) ); -} - -/** - host_reverse : 'int32 -> string - Reverse the DNS of the given IP address. -**/ -static value host_reverse( value host ) { - struct hostent *h; - unsigned int ip; - val_check(host,int); - ip = val_int(host); - gc_enter_blocking(); -# if defined(NEKO_WINDOWS) || defined(NEKO_MAC) || defined(ANDROID) || defined(BLACKBERRY) || defined(EMSCRIPTEN) - h = gethostbyaddr((char *)&ip,4,AF_INET); -# else - struct hostent htmp; - int errcode; - char buf[1024]; - gethostbyaddr_r((char *)&ip,4,AF_INET,&htmp,buf,1024,&h,&errcode); -# endif - gc_exit_blocking(); - if( h == NULL ) - return alloc_null(); - return alloc_string( h->h_name ); -} - -/** - host_local : void -> string - Return the local host name. -**/ -static value host_local() { - char buf[256]; - gc_enter_blocking(); - if( gethostname(buf,256) == SOCKET_ERROR ) - { - gc_exit_blocking(); - return alloc_null(); - } - gc_exit_blocking(); - return alloc_string(buf); -} - -/** - socket_connect : 'socket -> host:'int32 -> port:int -> void - Connect the socket the given [host] and [port] -**/ -static value socket_connect( value o, value host, value port ) { - struct sockaddr_in addr; - val_check(host,int); - val_check(port,int); - memset(&addr,0,sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_port = htons(val_int(port)); - *(int*)&addr.sin_addr.s_addr = val_int(host); - gc_enter_blocking(); - if( connect(val_sock(o),(struct sockaddr*)&addr,sizeof(addr)) != 0 ) - { - // This will throw a "Blocking" exception if the "error" was because - // it's a non-blocking socket with connection in progress, otherwise - // it will do nothing. - (void) block_error(); - // If the previous line did not throw an exception, then it was a real - // connect failure. - val_throw(alloc_string("std@socket_connect")); - } - gc_exit_blocking(); - return alloc_bool(true); -} - -/** - socket_listen : 'socket -> int -> void - Listen for a number of connections -**/ -static value socket_listen( value o, value n ) { - SOCKET sock = val_sock(o); - val_check(n,int); - gc_enter_blocking(); - if( listen(sock,val_int(n)) == SOCKET_ERROR ) - { - gc_exit_blocking(); - return alloc_null(); - } - gc_exit_blocking(); - return alloc_bool(true); -} - -static fd_set INVALID; - -static fd_set *make_socket_array( value a, fd_set *tmp, SOCKET *n ) { - int i, len; - SOCKET sock; - FD_ZERO(tmp); - if( val_is_null(a) ) - return tmp; - if( !val_is_array(a) ) - return &INVALID; - len = val_array_size(a); - if( len > FD_SETSIZE ) - val_throw(alloc_string("Too many sockets in select")); - for(i=0;i *n ) - *n = sock; - FD_SET(sock,tmp); - } - return tmp; -} - -static value make_array_result( value a, fd_set *tmp ) { - value r; - int i, len; - int pos = 0; - if( tmp == NULL ) - return val_null; - len = val_array_size(a); - r = alloc_array(len); - for(i=0;itv_usec = (f - (int)f ) * 1000000; - t->tv_sec = (int)f; -} - -/** - socket_select : read : 'socket array -> write : 'socket array -> others : 'socket array -> timeout:number? -> 'socket array array - Perform the [select] operation. Timeout is in seconds or [null] if infinite -**/ -static value socket_select( value rs, value ws, value es, value timeout ) { - struct timeval tval; - struct timeval *tt; - SOCKET n = 0; - fd_set rx, wx, ex; - fd_set *ra, *wa, *ea; - value r; - POSIX_LABEL(select_again); - ra = make_socket_array(rs,&rx,&n); - wa = make_socket_array(ws,&wx,&n); - ea = make_socket_array(es,&ex,&n); - if( ra == &INVALID || wa == &INVALID || ea == &INVALID ) - { - val_throw( alloc_string("No valid sockets") ); - return alloc_null(); - } - if( val_is_null(timeout) ) - tt = NULL; - else { - val_check(timeout,number); - tt = &tval; - init_timeval(val_number(timeout),tt); - } - gc_enter_blocking(); - if( select((int)(n+1),ra,wa,ea,tt) == SOCKET_ERROR ) { - HANDLE_EINTR(select_again); - gc_exit_blocking(); - char buf[100]; - sprintf(buf,"Select error %d", errno ); - val_throw( alloc_string(buf) ); - } - gc_exit_blocking(); - r = alloc_array(3); - val_array_set_i(r,0,make_array_result(rs,ra)); - val_array_set_i(r,1,make_array_result(ws,wa)); - val_array_set_i(r,2,make_array_result(es,ea)); - return r; -} - -/** - socket_select : read : 'socket array -> write : 'socket array -> others : 'socket array -> timeout:number? - Perform the [select] operation. Timeout is in seconds or [null] if infinite -**/ -static value socket_fast_select( value rs, value ws, value es, value timeout ) -{ - struct timeval tval; - struct timeval *tt; - SOCKET n = 0; - fd_set rx, wx, ex; - fd_set *ra, *wa, *ea; - value r; - POSIX_LABEL(select_again); - ra = make_socket_array(rs,&rx,&n); - wa = make_socket_array(ws,&wx,&n); - ea = make_socket_array(es,&ex,&n); - if( ra == &INVALID || wa == &INVALID || ea == &INVALID ) - { - val_throw( alloc_string("No valid sockets") ); - return alloc_null(); - } - if( val_is_null(timeout) ) - tt = NULL; - else { - val_check(timeout,number); - tt = &tval; - init_timeval(val_number(timeout),tt); - } - gc_enter_blocking(); - if( select((int)(n+1),ra,wa,ea,tt) == SOCKET_ERROR ) { - HANDLE_EINTR(select_again); - gc_exit_blocking(); - char buf[100]; - sprintf(buf,"Select error %d", errno ); - val_throw( alloc_string(buf) ); - } - gc_exit_blocking(); - make_array_result_inplace(rs, ra); - make_array_result_inplace(ws, wa); - make_array_result_inplace(es, ea); - return alloc_null(); -} - -/** - socket_bind : 'socket -> host : 'int -> port:int -> void - Bind the socket for server usage on the given host and port -**/ -static value socket_bind( value o, value host, value port ) { - int opt = 1; - struct sockaddr_in addr; - SOCKET sock = val_sock(o); - val_check(host,int); - val_check(port,int); - memset(&addr,0,sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_port = htons(val_int(port)); - *(int*)&addr.sin_addr.s_addr = val_int(host); - #ifndef NEKO_WINDOWS - setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char*)&opt,sizeof(opt)); - #endif - gc_enter_blocking(); - if( bind(sock,(struct sockaddr*)&addr,sizeof(addr)) == SOCKET_ERROR ) - { - gc_exit_blocking(); - val_throw(alloc_string("Bind failed")); - } - gc_exit_blocking(); - return alloc_bool(true); -} - -/** - socket_accept : 'socket -> 'socket - Accept an incoming connection request -**/ - -#ifdef _WIN32 - typedef int SockLen; -#elif defined(ANDROID) - typedef socklen_t SockLen; -#else - typedef unsigned int SockLen; -#endif -static value socket_accept( value o ) { - SOCKET sock = val_sock(o); - struct sockaddr_in addr; - SockLen addrlen = sizeof(addr); - SOCKET s; - gc_enter_blocking(); - s = accept(sock,(struct sockaddr*)&addr,&addrlen); - if( s == INVALID_SOCKET ) - return block_error(); - gc_exit_blocking(); - return alloc_abstract(k_socket,(void *)(socket_int)s); -} - -/** - socket_peer : 'socket -> #address - Return the socket connected peer address composed of an (host,port) array -**/ -static value socket_peer( value o ) { - SOCKET sock = val_sock(o); - struct sockaddr_in addr; - SockLen addrlen = sizeof(addr); - value ret; - gc_enter_blocking(); - if( getpeername(sock,(struct sockaddr*)&addr,&addrlen) == SOCKET_ERROR ) - { - gc_exit_blocking(); - return alloc_null(); - } - gc_exit_blocking(); - ret = alloc_array(2); - val_array_set_i(ret,0,alloc_int32(*(int*)&addr.sin_addr)); - val_array_set_i(ret,1,alloc_int(ntohs(addr.sin_port))); - return ret; -} - -/** - socket_host : 'socket -> #address - Return the socket local address composed of an (host,port) array -**/ -static value socket_host( value o ) { - SOCKET sock = val_sock(o); - struct sockaddr_in addr; - SockLen addrlen = sizeof(addr); - value ret; - gc_enter_blocking(); - if( getsockname(sock,(struct sockaddr*)&addr,&addrlen) == SOCKET_ERROR ) - { - gc_exit_blocking(); - return alloc_null(); - } - gc_exit_blocking(); - ret = alloc_array(2); - val_array_set_i(ret,0,alloc_int32(*(int*)&addr.sin_addr)); - val_array_set_i(ret,1,alloc_int(ntohs(addr.sin_port))); - return ret; -} - -/** - socket_set_timeout : 'socket -> timout:number? -> void - Set the socket send and recv timeout in seconds to the given value (or null for blocking) -**/ -static value socket_set_timeout( value o, value t ) { - SOCKET sock = val_sock(o); -#ifdef NEKO_WINDOWS - int time; - if( val_is_null(t) ) - time = 0; - else { - val_check(t,number); - time = (int)(val_number(t) * 1000); - } -#else - struct timeval time; - if( val_is_null(t) ) { - time.tv_usec = 0; - time.tv_sec = 0; - } else { - val_check(t,number); - init_timeval(val_number(t),&time); - } -#endif - gc_enter_blocking(); - if( setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,(char*)&time,sizeof(time)) != 0 ) - { - gc_exit_blocking(); - return alloc_null(); - } - if( setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,(char*)&time,sizeof(time)) != 0 ) - { - gc_exit_blocking(); - return alloc_null(); - } - gc_exit_blocking(); - return alloc_bool(true); -} - -/** - socket_shutdown : 'socket -> read:bool -> write:bool -> void - Prevent the socket from further reading or writing or both. -**/ -static value socket_shutdown( value o, value r, value w ) { - SOCKET sock = val_sock(o); - val_check(r,bool); - val_check(w,bool); - if( !val_bool(r) && !val_bool(w) ) - return alloc_bool(true); - gc_enter_blocking(); - if( shutdown(sock,val_bool(r)?(val_bool(w)?SHUT_RDWR:SHUT_RD):SHUT_WR) ) - { - gc_exit_blocking(); - return alloc_null(); - } - gc_exit_blocking(); - return alloc_bool(true); -} - -/** - socket_set_blocking : 'socket -> bool -> void - Turn on/off the socket blocking mode. -**/ -#include - -static value socket_set_blocking( value o, value b ) { - SOCKET sock = val_sock(o); - val_check(b,bool); - gc_enter_blocking(); -#ifdef NEKO_WINDOWS - { - unsigned long arg = val_bool(b)?0:1; - if( ioctlsocket(sock,FIONBIO,&arg) != 0 ) - { - gc_exit_blocking(); - return alloc_null(); - } - } -#else - { - int rights = fcntl(sock,F_GETFL); - if( rights == -1 ) - { - gc_exit_blocking(); - return alloc_null(); - } - if( val_bool(b) ) - rights &= ~O_NONBLOCK; - else - rights |= O_NONBLOCK; - if( fcntl(sock,F_SETFL,rights) == -1 ) - { - gc_exit_blocking(); - return alloc_null(); - } - } -#endif - gc_exit_blocking(); - return alloc_bool(true); -} - - -value socket_set_fast_send( value o, value b ) -{ - SOCKET sock = val_sock(o); - val_check(b,bool); - int fast = val_bool(b); - gc_enter_blocking(); - setsockopt(sock,IPPROTO_TCP,TCP_NODELAY,(char*)&fast,sizeof(fast)); - gc_exit_blocking(); - return alloc_null(); -} - -value socket_set_broadcast( value o, value b ) -{ - SOCKET sock = val_sock(o); - val_check(b,bool); - int broadcast = val_bool(b); - gc_enter_blocking(); - setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(char*)&broadcast,sizeof(broadcast)); - gc_exit_blocking(); - return alloc_null(); -} - -/** - socket_poll_alloc : int -> 'poll - Allocate memory to perform polling on a given number of sockets -**/ - -void free_sock(value v) -{ - polldata *p = (polldata *)val_data(v); -# ifdef NEKO_WINDOWS - free(p->fdr); - free(p->fdw); - free(p->outr); - free(p->outw); -# else -# endif - val_gc_remove_root(&p->ridx); - val_gc_remove_root(&p->widx); - free(p); - free_abstract(v); -} - -static value socket_poll_alloc( value nsocks ) { - polldata *p; - int i; - val_check(nsocks,int); - p = (polldata*)malloc(sizeof(polldata)); - p->max = val_int(nsocks); - if( p->max < 0 || p->max > 1000000 ) - return alloc_null(); -# ifdef NEKO_WINDOWS - { - p->fdr = (fd_set*)malloc(FDSIZE(p->max)); - p->fdw = (fd_set*)malloc(FDSIZE(p->max)); - p->outr = (fd_set*)malloc(FDSIZE(p->max)); - p->outw = (fd_set*)malloc(FDSIZE(p->max)); - p->fdr->fd_count = 0; - p->fdw->fd_count = 0; - } -# else - p->fds = (struct pollfd*)malloc(sizeof(struct pollfd) * p->max); - p->rcount = 0; - p->wcount = 0; -# endif - p->ridx = alloc_array(p->max+1); - p->widx = alloc_array(p->max+1); - val_gc_add_root(&p->ridx); - val_gc_add_root(&p->widx); - for(i=0;i<=p->max;i++) { - val_array_set_i(p->ridx,i, alloc_int(-1)); - val_array_set_i(p->widx,i, alloc_int(-1)); - } - value v = alloc_abstract(k_poll, p); - val_gc(v,free_sock); - return v; -} - -/** - socket_poll_prepare : 'poll -> read:'socket array -> write:'socket array -> int array array - - Prepare a poll for scanning events on sets of sockets. - -**/ -static value socket_poll_prepare( value pdata, value rsocks, value wsocks ) { - polldata *p; - int i,len; - val_check(rsocks,array); - val_check(wsocks,array); - val_check_kind(pdata,k_poll); - p = val_poll(pdata); - len = val_array_size(rsocks); - if( len + val_array_size(wsocks) > p->max ) - val_throw(alloc_string("Too many sockets in poll")); -# ifdef NEKO_WINDOWS - for(i=0;ifdr->fd_array[i] = val_sock(s); - } - p->fdr->fd_count = len; - len = val_array_size(wsocks); - for(i=0;ifdw->fd_array[i] = val_sock(s); - } - p->fdw->fd_count = len; -# else - for(i=0;ifds[i].fd = val_sock(s); - p->fds[i].events = POLLIN; - p->fds[i].revents = 0; - } - p->rcount = len; - len = val_array_size(wsocks); - for(i=0;ircount; - value s = val_array_i(wsocks,i); - p->fds[k].fd = val_sock(s); - p->fds[k].events = POLLOUT; - p->fds[k].revents = 0; - } - p->wcount = len; -# endif - { - value a = alloc_array(2); - val_array_set_i(a,0, p->ridx); - val_array_set_i(a,1, p->widx); - return a; - } -} - -/** - socket_poll_events : 'poll -> timeout:float -> void - - Update the read/write flags arrays that were created with [socket_poll_prepare]. - -**/ -static value socket_poll_events( value pdata, value timeout ) { - polldata *p; -# ifdef NEKO_WINDOWS - unsigned int i; - int k = 0; - struct timeval t; - val_check_kind(pdata,k_poll); - p = val_poll(pdata); - memcpy(p->outr,p->fdr,FDSIZE(p->fdr->fd_count)); - memcpy(p->outw,p->fdw,FDSIZE(p->fdw->fd_count)); - val_check(timeout,number); - init_timeval(val_number(timeout),&t); - gc_enter_blocking(); - if( p->fdr->fd_count + p->fdw->fd_count != 0 && select(0,p->outr,p->outw,NULL,&t) == SOCKET_ERROR ) - { - gc_exit_blocking(); - return alloc_null(); - } - gc_exit_blocking(); - k = 0; - for(i=0;ifdr->fd_count;i++) - if( FD_ISSET(p->fdr->fd_array[i],p->outr) ) - val_array_set_i(p->ridx,k++,alloc_int(i)); - val_array_set_i(p->ridx,k,alloc_int(-1)); - k = 0; - for(i=0;ifdw->fd_count;i++) - if( FD_ISSET(p->fdw->fd_array[i],p->outw) ) - val_array_set_i(p->widx,k++, alloc_int(i)); - val_array_set_i(p->widx,k,alloc_int(-1)); -#else - int i,k; - int tot; - val_check_kind(pdata,k_poll); - val_check(timeout,number); - p = val_poll(pdata); - tot = p->rcount + p->wcount; - gc_enter_blocking(); - POSIX_LABEL(poll_events_again); - if( poll(p->fds,tot,(int)(val_number(timeout) * 1000)) < 0 ) { - HANDLE_EINTR(poll_events_again); - gc_exit_blocking(); - return alloc_null(); - } - gc_exit_blocking(); - k = 0; - for(i=0;ircount;i++) - if( p->fds[i].revents & (POLLIN|POLLHUP) ) - val_array_set_i(p->ridx,k++,alloc_int(i)); - val_array_set_i(p->ridx,k, alloc_int(-1)); - k = 0; - for(;ifds[i].revents & (POLLOUT|POLLHUP) ) - val_array_set_i(p->widx,k++, alloc_int(i - p->rcount)); - val_array_set_i(p->widx,k, alloc_int(-1)); -#endif - return val_null; -} - - -/** - socket_poll : 'socket array -> 'poll -> timeout:float -> 'socket array - - Perform a polling for data available over a given set of sockets. This is similar to [socket_select] - except that [socket_select] is limited to a given number of simultaneous sockets to check. - -**/ -static value socket_poll( value socks, value pdata, value timeout ) { - polldata *p; - value a; - int i, rcount = 0; - if( val_is_null( socket_poll_prepare(pdata,socks,alloc_array(0))) ) - return alloc_null(); - socket_poll_events(pdata,timeout); - p = val_poll(pdata); - while( val_int(val_array_i(p->ridx,rcount)) != -1 ) - rcount++; - a = alloc_array(rcount); - for(i=0;iridx,i)))); - return a; -} - - - -/** - socket_send_to : 'socket -> buf:string -> pos:int -> length:int -> addr:{host:'int32,port:int} -> int - - Send data from an unconnected UDP socket to the given address. - -**/ -static value socket_send_to( value o, value dataBuf, value pos, value len, value vaddr ) { - int p,l; - value host, port; - struct sockaddr_in addr; - val_check_kind(o,k_socket); - buffer buf = val_to_buffer(dataBuf); - const char *cdata = buffer_data(buf); - int dlen = buffer_size(buf); - val_check(pos,int); - val_check(len,int); - val_check(vaddr,object); - host = val_field(vaddr, f_host); - port = val_field(vaddr, f_port); - val_check(host,int); - val_check(port,int); - p = val_int(pos); - l = val_int(len); - memset(&addr,0,sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_port = htons(val_int(port)); - *(int*)&addr.sin_addr.s_addr = val_int(host); - if( p < 0 || l < 0 || p > dlen || p + l > dlen ) - neko_error(); - - SOCKET sock = val_sock(o); - gc_enter_blocking(); - POSIX_LABEL(send_again); - dlen = sendto(sock, cdata + p , l, MSG_NOSIGNAL, (struct sockaddr*)&addr, sizeof(addr)); - if( dlen == SOCKET_ERROR ) { - HANDLE_EINTR(send_again); - return block_error(); - } - gc_exit_blocking(); - return alloc_int(dlen); -} - -/** - socket_recv_from : 'socket -> buf:string -> pos:int -> length:int -> addr:{host:'int32,port:int} -> int - - Read data from an unconnected UDP socket, store the address from which we received data in addr. - -**/ -#define NRETRYS 20 -static value socket_recv_from( value o, value dataBuf, value pos, value len, value addr ) { - int p,l,ret; - int retry = 0; - struct sockaddr_in saddr; - SockLen slen = sizeof(saddr); - val_check_kind(o,k_socket); - val_check(dataBuf,buffer); - buffer buf = val_to_buffer(dataBuf); - char *data = buffer_data(buf); - int dlen = buffer_size(buf); - val_check(pos,int); - val_check(len,int); - val_check(addr,object); - p = val_int(pos); - l = val_int(len); - - if( p < 0 || l < 0 || p > dlen || p + l > dlen ) - neko_error(); - SOCKET sock = val_sock(o); - gc_enter_blocking(); - POSIX_LABEL(recv_from_again); - if( retry++ > NRETRYS ) { - ret = recv(sock,data+p,l,MSG_NOSIGNAL); - } else - ret = recvfrom(sock, data + p , l, MSG_NOSIGNAL, (struct sockaddr*)&saddr, &slen); - if( ret == SOCKET_ERROR ) { - HANDLE_EINTR(recv_from_again); - return block_error(); - } - gc_exit_blocking(); - alloc_field(addr,f_host,alloc_int32(*(int*)&saddr.sin_addr)); - alloc_field(addr,f_port,alloc_int(ntohs(saddr.sin_port))); - return alloc_int(ret); -} - - - - - -DEFINE_PRIM(socket_init,0); -DEFINE_PRIM(socket_new,1); -DEFINE_PRIM(socket_send,4); -DEFINE_PRIM(socket_send_char,2); -DEFINE_PRIM(socket_recv,4); -DEFINE_PRIM(socket_recv_char,1); -DEFINE_PRIM(socket_write,2); -DEFINE_PRIM(socket_read,1); -DEFINE_PRIM(socket_close,1); -DEFINE_PRIM(socket_connect,3); -DEFINE_PRIM(socket_listen,2); -DEFINE_PRIM(socket_select,4); -DEFINE_PRIM(socket_fast_select,4); -DEFINE_PRIM(socket_bind,3); -DEFINE_PRIM(socket_accept,1); -DEFINE_PRIM(socket_peer,1); -DEFINE_PRIM(socket_host,1); -DEFINE_PRIM(socket_set_timeout,2); -DEFINE_PRIM(socket_shutdown,3); -DEFINE_PRIM(socket_set_blocking,2); -DEFINE_PRIM(socket_set_fast_send,2); -DEFINE_PRIM(socket_set_broadcast,2); - -DEFINE_PRIM(socket_send_to,5); -DEFINE_PRIM(socket_recv_from,5); - -DEFINE_PRIM(socket_poll_alloc,1); -DEFINE_PRIM(socket_poll,3); -DEFINE_PRIM(socket_poll_prepare,3); -DEFINE_PRIM(socket_poll_events,2); - - -DEFINE_PRIM(host_local,0); -DEFINE_PRIM(host_resolve,1); -DEFINE_PRIM(host_to_string,1); -DEFINE_PRIM(host_reverse,1); - -#else // !HX_WINRT -// TODO: WinRT StreamSocket port -#endif // HX_WINRT - -int __socket_prims() { return 0; } - -/* ************************************************************************ */ diff --git a/project/libs/std/String.cpp b/project/libs/std/String.cpp deleted file mode 100644 index 034a998e1..000000000 --- a/project/libs/std/String.cpp +++ /dev/null @@ -1,403 +0,0 @@ -#include -#include - -int __string_prims() { return 0; } - -/** - -

String Functions

-

- Some useful functions dealing with string manipulation. -

-
-**/ - -/** - string_split : s:string -> sep:string -> string list - split the string [s] using separator [sep] -**/ -static value string_split( value o, value s ) { - value l, first; - int ilen; - int slen; - int start = 0; - int pos; - val_check(s,string); - val_check(o,string); - ilen = val_strlen(o); - slen = val_strlen(s); - l = alloc_null(); - first = alloc_null(); - for(pos=slen?0:1;pos<=ilen-slen;pos++) - if( memcmp(val_string(o)+pos,val_string(s),slen) == 0 ) { - value ss = copy_string(val_string(o)+start,pos-start); - value l2 = alloc_array(2); - val_array_set_i(l2,0,ss); - val_array_set_i(l2,1,alloc_null()); - if( val_is_null(first) ) - first = l2; - else - val_array_set_i(l,1,l2); - l = l2; - start = pos + slen; - if( slen ) - pos = start - 1; - } - if( ilen > 0 && slen ) { - value ss = start ? copy_string(val_string(o)+start,ilen-start) : o; - value l2 = alloc_array(2); - val_array_set_i(l2,0,ss); - val_array_set_i(l2,1,alloc_null()); - if( val_is_null(first)) - first = l2; - else - val_array_set_i(l,1,l2); - } - return first; -} - -#define HEX 1 -#define HEX_SMALL 2 - -/** - sprintf : fmt:string -> params:(any | array) -> string - - Format a string. If only one parameter is needed then it can be - directly passed, either the parameters need to be stored in an array. - The following formats are accepted (with corresponding types) : -
    -
  • [%s] : string
  • -
  • [%d] [%x] [%X] : int
  • -
  • [%c] : int in the 0..255 range
  • -
  • [%b] : bool
  • -
  • [%f] : float
  • -
-
-**/ -static value neko_sprintf( value fmt, value params ) { - const char *last, *cur, *end; - int count = 0; - buffer b; - val_check(fmt,string); - b = alloc_buffer(0); - last = val_string(fmt); - cur = last; - end = cur + val_strlen(fmt); - while( cur != end ) { - if( *cur == '%' ) { - int width = 0, prec = 0, flags = 0; - buffer_append_sub(b,last,cur - last); - cur++; - while( *cur >= '0' && *cur <= '9' ) { - width = width * 10 + (*cur - '0'); - cur++; - } - if( *cur == '.' ) { - cur++; - while( *cur >= '0' && *cur <= '9' ) { - prec = prec * 10 + (*cur - '0'); - cur++; - } - } - if( *cur == '%' ) { - buffer_append_sub(b,"%",1); - cur++; - } else { - value param; - if( count == 0 && !val_is_array(params) ) { // first ? - param = params; - count++; - } else if( !val_is_array(params) || val_array_size(params) <= count ) - return alloc_null(); - else - param = val_array_i(params,count++); - switch( *cur ) { - case 'c': - { - int c; - char cc; - val_check(param,int); - c = val_int(param); - if( c < 0 || c > 255 ) - return alloc_null(); - cc = (char)c; - buffer_append_sub(b,&cc,1); - } - break; - case 'x': - flags |= HEX_SMALL; - case 'X': - flags |= HEX; - case 'd': - { - char tmp[10]; - int sign = 0; - int size = 0; - int tsize; - int n; - val_check(param,int); - n = val_int(param); - if( !(flags & HEX) && n < 0 ) { - sign++; - prec--; - n = -n; - } else if( n == 0 ) - tmp[9-size++] = '0'; - if( flags & HEX ) { - unsigned int nn = (unsigned int)n; - while( nn > 0 ) { - int k = nn&15; - if( k < 10 ) - tmp[9-size++] = k + '0'; - else - tmp[9-size++] = (k - 10) + ((flags & HEX_SMALL)?'a':'A'); - nn = nn >> 4; - } - } else { - while( n > 0 ) { - tmp[9-size++] = (n % 10) + '0'; - n = n / 10; - } - } - tsize = (size > prec)?size:prec + sign; - while( width > tsize ) { - width--; - buffer_append_sub(b," ",1); - } - if( sign ) - buffer_append_sub(b,"-",1); - while( prec > size ) { - prec--; - buffer_append_sub(b,"0",1); - } - buffer_append_sub(b,tmp+10-size,size); - } - break; - case 'f': - { - val_check(param,float); - val_buffer(b,param); - } - break; - case 's': - { - int size; - int tsize; - val_check(param,string); - size = val_strlen(param); - tsize = (size > prec)?size:prec; - while( width > tsize ) { - width--; - buffer_append_sub(b," ",1); - } - while( prec > size ) { - prec--; - buffer_append_sub(b," ",1); - } - buffer_append_sub(b,val_string(param),size); - } - break; - case 'b': - { - val_check(param,bool); - buffer_append_sub(b,val_bool(param)?"true":"false",val_bool(param)?4:5); - } - break; - default: - return alloc_null(); - break; - } - } - cur++; - last = cur; - } else - cur++; - } - buffer_append_sub(b,last,cur - last); - return buffer_to_string(b); -} - -/** - url_decode : string -> string - Decode an url using escaped format -**/ -static value url_decode( value v ) { - val_check(v,string); - { - int pin = 0; - int pout = 0; - const char *in = val_string(v); - int len = val_strlen(v); - buffer v2 = alloc_buffer_len(len); - char *out = (char*)buffer_data(v2); - while( len-- > 0 ) { - char c = in[pin++]; - if( c == '+' ) - c = ' '; - else if( c == '%' ) { - int p1, p2; - if( len < 2 ) - break; - p1 = in[pin++]; - p2 = in[pin++]; - len -= 2; - if( p1 >= '0' && p1 <= '9' ) - p1 -= '0'; - else if( p1 >= 'a' && p1 <= 'f' ) - p1 -= 'a' - 10; - else if( p1 >= 'A' && p1 <= 'F' ) - p1 -= 'A' - 10; - else - continue; - if( p2 >= '0' && p2 <= '9' ) - p2 -= '0'; - else if( p2 >= 'a' && p2 <= 'f' ) - p2 -= 'a' - 10; - else if( p2 >= 'A' && p2 <= 'F' ) - p2 -= 'A' - 10; - else - continue; - c = (char)((unsigned char)((p1 << 4) + p2)); - } - out[pout++] = c; - } - out[pout] = 0; - buffer_set_size(v2,pout); - return buffer_to_string(v2); - } -} - -/** - url_encode : string -> string - Encode an url using escaped format -**/ -static value url_encode( value v ) { - val_check(v,string); - { - int pin = 0; - int pout = 0; - const unsigned char *in = (const unsigned char*)val_string(v); - static const char *hex = "0123456789ABCDEF"; - int len = val_strlen(v); - buffer v2 = alloc_buffer_len(len * 3); - unsigned char *out = (unsigned char*)buffer_data(v2); - while( len-- > 0 ) { - unsigned char c = in[pin++]; - if( (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '_' || c == '-' || c == '.' ) - out[pout++] = c; - else { - out[pout++] = '%'; - out[pout++] = hex[c >> 4]; - out[pout++] = hex[c & 0xF]; - } - } - out[pout] = 0; - buffer_set_size(v2,pout); - return buffer_to_string(v2); - } -} - -/** - base_encode : s:string -> base:string -> string - - Encode a string using the specified base. - The base length must be a power of two. - -**/ -static value base_encode( value s, value base ) { - int nbits; - int len; - int size; - int mask; - unsigned int buf; - int curbits; - buffer out; - unsigned char *cin, *cout, *chars; - val_check(s,string); - val_check(base,string); - len = val_strlen(base); - cin = (unsigned char *)val_string(s); - chars = (unsigned char *)val_string(base); - nbits = 1; - while( len > 1 << nbits ) - nbits++; - if( nbits > 8 || len != 1 << nbits ) - return alloc_null(); - size = (val_strlen(s) * 8 + nbits - 1) / nbits; - out = alloc_buffer_len(size); - cout = (unsigned char *)buffer_data(out); - buf = 0; - curbits = 0; - mask = ((1 << nbits) - 1); - while( size-- > 0 ) { - while( curbits < nbits ) { - curbits += 8; - buf <<= 8; - buf |= *cin++; - } - curbits -= nbits; - *cout++ = chars[(buf >> curbits) & mask]; - } - return buffer_to_string(out); -} - -/** - base_decode : s:string -> base:string -> string - - Decode a string encode in the specified base. - The base length must be a power of two. - -**/ -static value base_decode( value s, value base ) { - int nbits; - int len; - int size; - unsigned int buf; - int curbits; - buffer out; - int i; - int tbl[256]; - unsigned char *cin, *cout, *chars; - val_check(s,string); - val_check(base,string); - len = val_strlen(base); - cin = (unsigned char *)val_string(s); - chars = (unsigned char *)val_string(base); - nbits = 1; - while( len > 1 << nbits ) - nbits++; - if( nbits > 8 || len != 1 << nbits ) - return alloc_null(); - for(i=0;i<256;i++) - tbl[i] = -1; - for(i=0;i 0 ) { - while( curbits < 8 ) { - curbits += nbits; - buf <<= nbits; - i = tbl[*cin++]; - if( i == -1 ) - return alloc_null(); - buf |= i; - } - curbits -= 8; - *cout++ = (buf >> curbits) & 0xFF; - } - return buffer_to_string(out); -} - -#define neko_sprintf__2 sprintf__2 -DEFINE_PRIM(neko_sprintf,2); -DEFINE_PRIM(string_split,2); -DEFINE_PRIM(url_decode,1); -DEFINE_PRIM(url_encode,1); -DEFINE_PRIM(base_encode,2); -DEFINE_PRIM(base_decode,2); - -/* ************************************************************************ */ diff --git a/project/libs/std/Sys.cpp b/project/libs/std/Sys.cpp deleted file mode 100644 index 17d142a3b..000000000 --- a/project/libs/std/Sys.cpp +++ /dev/null @@ -1,941 +0,0 @@ -#include -#include -#include -#include -#include -#ifndef EPPC -#include -#include -#endif - - -int __sys_prims() { return 0; } - -#ifdef NEKO_WINDOWS -# include -# include -# include -# include -# include "Shlwapi.h" -#else -# include -#ifndef EPPC -# include -# include -# include -# include -# include -#endif -# include -#ifndef ANDROID -# include -#if !defined(BLACKBERRY) && !defined(EPPC) && !defined(GCW0) && !defined(__GLIBC__) -# include -#endif -#endif -#endif - -#ifdef EMSCRIPTEN -#include -#endif - -#if !defined(IPHONE) && !defined(APPLETV) -#ifdef NEKO_MAC -# include -# include -# include -#endif -#endif - -#if defined(HX_WINRT) && !defined(_XBOX_ONE) -#include -#endif - -#ifndef CLK_TCK -# define CLK_TCK 100 -#endif - -/** - -

System

-

- Interactions with the operating system. -

-
-**/ - -/** - get_env : string -> string? - Get some environment variable if exists -**/ -static value get_env( value v ) { - char *s = 0; - val_check(v,string); - #ifndef HX_WINRT - s = getenv(val_string(v)); - #endif - if( s == NULL ) - return val_null; - return alloc_string(s); -} - -/** - put_env : var:string -> val:string -> void - Set some environment variable value -**/ -static value put_env( value e, value v ) { -#ifdef HX_WINRT - // Do nothing - return alloc_null(); -#elif defined(NEKO_WINDOWS) - val_check(e,string); - val_check(v,string); - buffer b = alloc_buffer(0); - val_buffer(b,e); - buffer_append_sub(b,"=",1); - val_buffer(b,v); - if( putenv(buffer_data(b)) != 0 ) - return alloc_null(); -#else - val_check(e,string); - val_check(v,string); - if( setenv(val_string(e),val_string(v),1) != 0 ) - return alloc_null(); -#endif - return alloc_bool(true); -} - -/** - sys_sleep : number -> void - Sleep a given number of seconds -**/ - -static value sys_sleep( value f ) { - val_check(f,number); - gc_enter_blocking(); -#if defined(NEKO_WINDOWS) - Sleep((DWORD)(val_number(f) * 1000)); -#elif defined(EPPC) -//TODO: Implement sys_sleep for EPPC -#else - { - struct timespec t; - struct timespec tmp; - t.tv_sec = (int)val_number(f); - t.tv_nsec = (int)((val_number(f) - t.tv_sec) * 1e9); - while( nanosleep(&t,&tmp) == -1 ) { - if( errno != EINTR ) { - gc_exit_blocking(); - return alloc_null(); - } - t = tmp; - } - } -#endif - gc_exit_blocking(); - return alloc_bool(true); -} - -/** - set_time_locale : string -> bool - Set the locale for LC_TIME, returns true on success -**/ -static value set_time_locale( value l ) { -#if defined(ANDROID) || defined(GCW0) - return alloc_null(); -#else - -#ifdef NEKO_POSIX - locale_t lc, old; - val_check(l,string); - lc = newlocale(LC_TIME_MASK,val_string(l),NULL); - if( lc == NULL ) return alloc_bool(false); - old = uselocale(lc); - if( old == NULL ) { - freelocale(lc); - return alloc_bool(false); - } - if( old != LC_GLOBAL_LOCALE ) - freelocale(old); - return alloc_bool(true); -#else - val_check(l,string); - return alloc_bool(setlocale(LC_TIME,val_string(l)) != NULL); -#endif - -#endif // !Android -} - -/** - get_cwd : void -> string - Return current working directory -**/ -static value get_cwd() { - #ifdef HX_WINRT - return alloc_string("ms-appdata:///local/"); - #elif defined(EPPC) - return alloc_null(); - #else - #ifdef NEKO_WINDOWS - wchar_t buf[256]; - int l; - if( GetCurrentDirectoryW(256,buf) == NULL ) - return alloc_null(); - l = (int)wcslen(buf); - if( buf[l-1] != '/' && buf[l-1] != '\\' ) { - buf[l] = '/'; - buf[l+1] = 0; - } - return alloc_wstring(buf); - #else - char buf[256]; - int l; - if( getcwd(buf,256) == NULL ) - return alloc_null(); - l = (int)strlen(buf); - if( buf[l-1] != '/' && buf[l-1] != '\\' ) { - buf[l] = '/'; - buf[l+1] = 0; - } - return alloc_string(buf); - #endif - #endif -} - -/** - set_cwd : string -> void - Set current working directory -**/ -static value set_cwd( value d ) { - #if !defined(HX_WINRT) && !defined(EPPC) - val_check(d,string); - #ifdef NEKO_WINDOWS - if( SetCurrentDirectoryW(val_wstring(d)) ) - return alloc_null(); - #else - if( chdir(val_string(d)) ) - return alloc_null(); - #endif - #endif - return alloc_bool(true); -} - - -/** - sys_string : void -> string - - Return the local system string. The current value are possible : -
    -
  • [Windows]
  • -
  • [Linux]
  • -
  • [BSD]
  • -
  • [Mac]
  • -
-
-**/ -static value sys_string() { -#if defined(HX_WINRT) - return alloc_string("WinRT"); -#elif defined(NEKO_WINDOWS) - return alloc_string("Windows"); -#elif defined(NEKO_GNUKBSD) - return alloc_string("GNU/kFreeBSD"); -#elif defined(NEKO_LINUX) - return alloc_string("Linux"); -#elif defined(NEKO_BSD) - return alloc_string("BSD"); -#elif defined(NEKO_MAC) - return alloc_string("Mac"); -#elif defined(ANDROID) - return alloc_string("Android"); -#elif defined(BLACKBERRY) - return alloc_string("BlackBerry"); -#elif defined(EMSCRIPTEN) - return alloc_string("Emscripten"); -#elif defined(EPPC) - return alloc_string("EPPC"); -#else -#error Unknow system string -#endif -} - -/** - sys_is64 : void -> bool - - Returns true if we are on a 64-bit system - -**/ -static value sys_is64() { -#ifdef NEKO_64BITS - return alloc_bool(true); -#else - return alloc_bool(false); -#endif -} - -/** - sys_command : string -> int - Run the shell command and return exit code -**/ -static value sys_command( value cmd ) { - #if defined(HX_WINRT) || defined(EMSCRIPTEN) || defined(EPPC) || defined(IPHONE) || defined(APPLETV) || defined(HX_APPLEWATCH) - return alloc_int( -1 ); - #else - val_check(cmd,string); - if( val_strlen(cmd) == 0 ) - return alloc_int(-1); - #ifdef NEKO_WINDOWS - const wchar_t* _cmd = val_wstring(cmd); - gc_enter_blocking(); - int result = _wsystem(_cmd); - #else - gc_enter_blocking(); - int result = system(val_string(cmd)); - #endif - gc_exit_blocking(); - #if !defined(NEKO_WINDOWS) && !defined(ANDROID) - result = WEXITSTATUS(result) | (WTERMSIG(result) << 8); - #endif - return alloc_int( result ); - #endif -} - - -/** - sys_exit : int -> void - Exit with the given errorcode. Never returns. -**/ -static value sys_exit( value ecode ) { - val_check(ecode,int); - exit(val_int(ecode)); - return alloc_bool(true); -} - -/** - sys_exists : string -> bool - Returns true if the file or directory exists. -**/ -static value sys_exists( value path ) { - #ifdef EPPC - return alloc_bool(true); - #else - val_check(path,string); - #ifdef NEKO_WINDOWS - const wchar_t* _path = val_wstring(path); - gc_enter_blocking(); - bool result = GetFileAttributesW(_path) != INVALID_FILE_ATTRIBUTES; - #else - struct stat st; - gc_enter_blocking(); - bool result = stat(val_string(path),&st) == 0; - #endif - gc_exit_blocking(); - return alloc_bool(result); - #endif -} - -/** - file_exists : string -> bool - Deprecated : use sys_exists instead. -**/ -static value file_exists( value path ) { - gc_enter_blocking(); - bool result = sys_exists(path); - gc_exit_blocking(); - return alloc_bool(result); -} - -/** - file_delete : string -> void - Delete the file. Exception on error. -**/ -static value file_delete( value path ) { - #ifdef EPPC - return alloc_bool(true); - #else - val_check(path,string); - #ifdef NEKO_WINDOWS - const wchar_t* _path = val_wstring(path); - gc_enter_blocking(); - if( DeleteFileW(_path) != 0 ) - #else - gc_enter_blocking(); - if( unlink(val_string(path)) != 0 ) - #endif - { - gc_exit_blocking(); - return alloc_null(); - } - gc_exit_blocking(); - return alloc_bool(true); - #endif -} - -/** - sys_rename : from:string -> to:string -> void - Rename the file or directory. Exception on error. -**/ -static value sys_rename( value path, value newname ) { - val_check(path,string); - val_check(newname,string); - - #ifdef NEKO_WINDOWS - const wchar_t* _path = val_wstring(path); - const wchar_t* _newname = val_wstring(newname); - gc_enter_blocking(); - if( MoveFileExW(_path,_newname,MOVEFILE_COPY_ALLOWED|MOVEFILE_WRITE_THROUGH) != 0 ) - { - gc_exit_blocking(); - return alloc_null(); - } - #else - gc_enter_blocking(); - if( rename(val_string(path),val_string(newname)) != 0 ) - { - gc_exit_blocking(); - return alloc_null(); - } - #endif - gc_exit_blocking(); - return alloc_bool(true); -} - -#define STATF(f) alloc_field(o,val_id(#f),alloc_int(s.st_##f)) -#define STATF32(f) alloc_field(o,val_id(#f),alloc_int32(s.st_##f)) - -/** - sys_stat : string -> { - gid => int, - uid => int, - atime => 'int32, - mtime => 'int32, - ctime => 'int32, - dev => int, - ino => int, - nlink => int, - rdev => int, - mode => int, - size => int - } - Run the [stat] command on the given file or directory. -**/ -static value sys_stat( value path ) { - #ifdef EPPC - return alloc_null(); - #else - value o; - val_check(path,string); - - #ifdef NEKO_WINDOWS - const wchar_t* _path = val_wstring(path); - gc_enter_blocking(); - WIN32_FILE_ATTRIBUTE_DATA data; - if( !GetFileAttributesExW(_path,GetFileExInfoStandard,&data) ) - { - gc_exit_blocking(); - return alloc_null(); - } - gc_exit_blocking(); - wchar_t fullPath[MAX_PATH+1]; - GetFullPathNameW(_path,MAX_PATH+1,fullPath,NULL); - int dev = PathGetDriveNumberW(fullPath); - #define EPOCH_DIFF (134774*24*60*60.0) - ULARGE_INTEGER ui; - o = alloc_empty_object( ); - alloc_field(o,val_id("gid"),alloc_int(0)); - alloc_field(o,val_id("uid"),alloc_int(0)); - ui.LowPart = data.ftLastAccessTime.dwLowDateTime; - ui.HighPart = data.ftLastAccessTime.dwHighDateTime; - alloc_field(o,val_id("atime"),alloc_int32(((double)ui.QuadPart) / 10000000.0 - EPOCH_DIFF)); - ui.LowPart = data.ftLastWriteTime.dwLowDateTime; - ui.HighPart = data.ftLastWriteTime.dwHighDateTime; - alloc_field(o,val_id("mtime"),alloc_int32(((double)ui.QuadPart) / 10000000.0 - EPOCH_DIFF)); - ui.LowPart = data.ftCreationTime.dwLowDateTime; - ui.HighPart = data.ftCreationTime.dwHighDateTime; - alloc_field(o,val_id("ctime"),alloc_int32(((double)ui.QuadPart) / 10000000.0 - EPOCH_DIFF)); - alloc_field(o,val_id("dev"),alloc_int(dev)); - alloc_field(o,val_id("ino"),alloc_int(0)); - int mode = 0; - if ((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) mode |= _S_IFDIR; - if ((data.dwFileAttributes & FILE_ATTRIBUTE_OFFLINE) == 0) mode |= _S_IFREG; - mode |= _S_IREAD; - if ((data.dwFileAttributes & FILE_ATTRIBUTE_READONLY) == 0) mode |= _S_IWRITE; - if ((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) mode |= _S_IEXEC; - alloc_field(o,val_id("mode"),alloc_int(mode)); - alloc_field(o,val_id("nlink"),alloc_int(1)); - alloc_field(o,val_id("rdev"),alloc_int(dev)); - alloc_field(o,val_id("size"),alloc_int32(data.nFileSizeLow)); - #else - gc_enter_blocking(); - struct stat s; - if( stat(val_string(path),&s) != 0 ) - { - gc_exit_blocking(); - return alloc_null(); - } - gc_exit_blocking(); - o = alloc_empty_object( ); - STATF(gid); - STATF(uid); - STATF32(atime); - STATF32(mtime); - STATF32(ctime); - STATF(dev); - STATF(ino); - STATF(mode); - STATF(nlink); - STATF(rdev); - STATF(size); - #endif - return o; - #endif -} - -/** - sys_file_type : string -> string - - Return the type of the file. The current values are possible : -
    -
  • [file]
  • -
  • [dir]
  • -
  • [symlink]
  • -
  • [sock]
  • -
  • [char]
  • -
  • [block]
  • -
  • [fifo]
  • -
-
-**/ -static value sys_file_type( value path ) { - #ifdef EPPC - return alloc_null(); - #else - struct stat s; - val_check(path,string); - #ifdef NEKO_WINDOWS - const wchar_t* _path = val_wstring(path); - gc_enter_blocking(); - WIN32_FILE_ATTRIBUTE_DATA data; - if( !GetFileAttributesExW(_path,GetFileExInfoStandard,&data) ) - { - gc_exit_blocking(); - return alloc_null(); - } - gc_exit_blocking(); - if ((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) - { - return alloc_string("dir"); - } - else - { - return alloc_string("file"); - } - #else - gc_enter_blocking(); - if( stat(val_string(path),&s) != 0 ) - { - gc_exit_blocking(); - return alloc_null(); - } - gc_exit_blocking(); - if( s.st_mode & S_IFREG ) - return alloc_string("file"); - if( s.st_mode & S_IFDIR ) - return alloc_string("dir"); - if( s.st_mode & S_IFCHR ) - return alloc_string("char"); -#ifndef NEKO_WINDOWS - if( s.st_mode & S_IFLNK ) - return alloc_string("symlink"); - if( s.st_mode & S_IFBLK ) - return alloc_string("block"); - if( s.st_mode & S_IFIFO ) - return alloc_string("fifo"); - if( s.st_mode & S_IFSOCK ) - return alloc_string("sock"); -#endif - #endif - return alloc_null(); - #endif -} - -/** - sys_create_dir : string -> mode:int -> void - Create a directory with the specified rights -**/ -static value sys_create_dir( value path, value mode ) { - #ifdef EPPC - return alloc_bool(true); - #else - val_check(path,string); - val_check(mode,int); - #ifdef NEKO_WINDOWS - const wchar_t* _path = val_wstring(path); - gc_enter_blocking(); - if( _wmkdir(_path) != 0 ) - { - gc_exit_blocking(); - return alloc_null(); - } - #else - const char* _path = val_string(path); - gc_enter_blocking(); - if( mkdir(val_string(path),val_int(mode)) != 0 ) - { - gc_exit_blocking(); - return alloc_null(); - } - #endif - gc_exit_blocking(); - return alloc_bool(true); - #endif -} - -/** - sys_remove_dir : string -> void - Remove a directory. Exception on error -**/ -static value sys_remove_dir( value path ) { - #ifdef EPPC - return alloc_bool(true); - #else - val_check(path,string); - #ifdef NEKO_WINDOWS - const wchar_t* _path = val_wstring(path); - gc_enter_blocking(); - bool ok = _wrmdir(_path) != 0; - #else - const char* _path = val_string(path); - gc_enter_blocking(); - bool ok = rmdir(_path) != 0; - #endif - gc_exit_blocking(); - return alloc_bool(ok); - #endif -} - -/** - sys_time : void -> float - Return an accurate local time stamp in seconds since Jan 1 1970 -**/ -static value sys_time() { -#ifdef NEKO_WINDOWS -#define EPOCH_DIFF (134774*24*60*60.0) - SYSTEMTIME t; - FILETIME ft; - ULARGE_INTEGER ui; - GetSystemTime(&t); - if( !SystemTimeToFileTime(&t,&ft) ) - return alloc_null(); - ui.LowPart = ft.dwLowDateTime; - ui.HighPart = ft.dwHighDateTime; - return alloc_float( ((double)ui.QuadPart) / 10000000.0 - EPOCH_DIFF ); -#elif defined(EPPC) - time_t tod; - time(&tod); - return alloc_float ((double)tod); -#else - struct timeval tv; - if( gettimeofday(&tv,NULL) != 0 ) - return alloc_null(); - return alloc_float( tv.tv_sec + ((double)tv.tv_usec) / 1000000.0 ); -#endif -} - -/** - sys_cpu_time : void -> float - Return the most accurate CPU time spent since the process started (in seconds) -**/ -static value sys_cpu_time() { -#if defined(HX_WINRT) && !defined(_XBOX_ONE) - return alloc_float ((double)GetTickCount64()/1000.0); -#elif defined(NEKO_WINDOWS) - FILETIME unused; - FILETIME stime; - FILETIME utime; - if( !GetProcessTimes(GetCurrentProcess(),&unused,&unused,&stime,&utime) ) - return alloc_null(); - return alloc_float( ((double)(utime.dwHighDateTime+stime.dwHighDateTime)) * 65.536 * 6.5536 + (((double)utime.dwLowDateTime + (double)stime.dwLowDateTime) / 10000000) ); -#elif defined(EPPC) - return alloc_float ((double)clock()/(double)CLOCKS_PER_SEC); -#else - struct tms t; - times(&t); - return alloc_float( ((double)(t.tms_utime + t.tms_stime)) / CLK_TCK ); -#endif -} - -/** - sys_read_dir : string -> string list - Return the content of a directory -**/ -static value sys_read_dir( value p) { - val_check(p,string); - - value result = alloc_array(0); -#if defined(HX_WINRT) && defined(__cplusplus_winrt) - auto folder = (Windows::Storage::StorageFolder::GetFolderFromPathAsync( ref new Platform::String(val_wstring(p)) ))->GetResults(); - auto results = folder->GetFilesAsync(Windows::Storage::Search::CommonFileQuery::DefaultQuery)->GetResults(); - for(int i=0;iSize;i++) - val_array_push(result,alloc_wstring(results->GetAt(i)->Path->Data())); -#elif defined(NEKO_WINDOWS) - const wchar_t *path = val_wstring(p); - size_t len = wcslen(path); - if (len>MAX_PATH) - return alloc_null(); - - WIN32_FIND_DATAW d; - HANDLE handle; - buffer b; - #if defined(HX_WINRT) && !defined(_XBOX_ONE) - std::wstring tempWStr(path); - std::string searchPath(tempWStr.begin(), tempWStr.end()); - #else - wchar_t searchPath[ MAX_PATH + 4 ]; - memcpy(searchPath,path, len*sizeof(wchar_t)); - #endif - - - if( len && path[len-1] != '/' && path[len-1] != '\\' ) - searchPath[len++] = '/'; - searchPath[len++] = '*'; - searchPath[len++] = '.'; - searchPath[len++] = '*'; - searchPath[len] = '\0'; - - gc_enter_blocking(); - #if defined(HX_WINRT) && !defined(_XBOX_ONE) - handle = FindFirstFileEx(searchPath.c_str(), FindExInfoStandard, &d, FindExSearchNameMatch, NULL, 0); - #else - handle = FindFirstFileW(searchPath,&d); - #endif - if( handle == INVALID_HANDLE_VALUE ) - { - gc_exit_blocking(); - return alloc_null(); - } - while( true ) { - // skip magic dirs - if( d.cFileName[0] != '.' || (d.cFileName[1] != 0 && (d.cFileName[1] != '.' || d.cFileName[2] != 0)) ) { - gc_exit_blocking(); - val_array_push(result,alloc_wstring(d.cFileName)); - gc_enter_blocking(); - } - if( !FindNextFileW(handle,&d) ) - break; - } - FindClose(handle); -#elif !defined(EPPC) - DIR *d; - struct dirent *e; - const char *name = val_string(p); - gc_enter_blocking(); - d = opendir(name); - if( d == NULL ) - { - gc_exit_blocking(); - val_throw(alloc_string("Invalid directory")); - } - while( true ) { - e = readdir(d); - if( e == NULL ) - break; - // skip magic dirs - if( e->d_name[0] == '.' && (e->d_name[1] == 0 || (e->d_name[1] == '.' && e->d_name[2] == 0)) ) - continue; - gc_exit_blocking(); - val_array_push(result, alloc_string(e->d_name) ); - gc_enter_blocking(); - } - closedir(d); -#endif - gc_exit_blocking(); - return result; -} - -/** - file_full_path : string -> string - Return an absolute path from a relative one. The file or directory must exists -**/ -static value file_full_path( value path ) { -#if defined(HX_WINRT) - return path; -#elif defined(NEKO_WINDOWS) - wchar_t buf[MAX_PATH+1]; - val_check(path,string); - if( GetFullPathNameW(val_wstring(path),MAX_PATH+1,buf,NULL) == 0 ) - return alloc_null(); - return alloc_wstring(buf); -#elif defined(EPPC) - return path; -#else - char buf[PATH_MAX]; - val_check(path,string); - if( realpath(val_string(path),buf) == NULL ) - return alloc_null(); - return alloc_string(buf); -#endif -} - -/** - sys_exe_path : void -> string - Return the path of the executable -**/ -static value sys_exe_path() { -#if defined(HX_WINRT) && defined(__cplusplus_winrt) - Windows::ApplicationModel::Package^ package = Windows::ApplicationModel::Package::Current; - Windows::Storage::StorageFolder^ installedLocation = package->InstalledLocation; - return(alloc_wstring(installedLocation->Path->Data())); -#elif defined(NEKO_WINDOWS) - wchar_t path[MAX_PATH+1]; - if( GetModuleFileNameW(NULL,path,MAX_PATH+1) == 0 ) - return alloc_null(); - return alloc_wstring(path); -#elif defined(NEKO_MAC) && !defined(IPHONE) && !defined(APPLETV) - char path[PATH_MAX+1]; - uint32_t path_len = PATH_MAX; - if( _NSGetExecutablePath(path, &path_len) ) - return alloc_null(); - return alloc_string(path); -#elif defined(EPPC) - return alloc_string(""); -#else - const char *p = getenv("_"); - if( p != NULL ) - return alloc_string(p); - { - char path[PATH_MAX]; - int length = readlink("/proc/self/exe", path, sizeof(path)); - if( length < 0 ) - return alloc_null(); - path[length] = '\0'; - return alloc_string(path); - } -#endif -} - -#if !defined(IPHONE) && !defined(APPLETV) -#ifdef NEKO_MAC -#include -# define environ (*_NSGetEnviron()) -#endif -#endif - -#ifndef NEKO_WINDOWS -extern char **environ; -#endif - -/** - sys_env : void -> #list - Return all the (key,value) pairs in the environment as a chained list -**/ -static value sys_env() { - value result = alloc_array(0); - #ifndef HX_WINRT - char **e = environ; - while( *e ) { - char *x = strchr(*e,'='); - if( x == NULL ) { - e++; - continue; - } - val_array_push(result,alloc_string_len(*e,(int)(x-*e))); - val_array_push(result,alloc_string(x+1)); - e++; - } - #endif - return result; -} - -#ifdef HX_ANDROID - #define tcsetattr(fd,opt,s) ioctl(fd,opt,s) - #define tcgetattr(fd,s) ioctl(fd,TCGETS,s) - - static __inline__ void inline_cfmakeraw(struct termios *s) - { - s->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON); - s->c_oflag &= ~OPOST; - s->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN); - s->c_cflag &= ~(CSIZE|PARENB); - s->c_cflag |= CS8; - } - - #define cfmakeraw inline_cfmakeraw - -#endif - -/** - sys_getch : bool -> int - Read a character from stdin with or without echo -**/ -static value sys_getch( value b ) { -#if defined(HX_WINRT) || defined(EMSCRIPTEN) || defined(EPPC) - return alloc_null(); -#elif defined(NEKO_WINDOWS) - val_check(b,bool); - gc_enter_blocking(); - int result = val_bool(b)?getche():getch(); - gc_exit_blocking(); - return alloc_int( result ); -#else - // took some time to figure out how to do that - // without relying on ncurses, which clear the - // terminal on initscr() - int c; - struct termios term, old; - val_check(b,bool); - gc_enter_blocking(); - tcgetattr(fileno(stdin), &old); - term = old; - cfmakeraw(&term); - tcsetattr(fileno(stdin), 0, &term); - c = getchar(); - tcsetattr(fileno(stdin), 0, &old); - if( val_bool(b) ) fputc(c,stdout); - gc_exit_blocking(); - return alloc_int(c); -# endif -} - -/** - sys_get_pid : void -> int - Returns the current process identifier -**/ -static value sys_get_pid() { -# ifdef NEKO_WINDOWS - return alloc_int(GetCurrentProcessId()); -#elif defined(EPPC) - return alloc_int(1); -# else - return alloc_int(getpid()); -# endif -} - -DEFINE_PRIM(get_env,1); -DEFINE_PRIM(put_env,2); -DEFINE_PRIM(set_time_locale,1); -DEFINE_PRIM(get_cwd,0); -DEFINE_PRIM(set_cwd,1); -DEFINE_PRIM(sys_sleep,1); -DEFINE_PRIM(sys_command,1); -DEFINE_PRIM(sys_exit,1); -DEFINE_PRIM(sys_string,0); -DEFINE_PRIM(sys_is64,0); -DEFINE_PRIM(sys_stat,1); -DEFINE_PRIM(sys_time,0); -DEFINE_PRIM(sys_cpu_time,0); -DEFINE_PRIM(sys_env,0); -DEFINE_PRIM(sys_create_dir,2); -DEFINE_PRIM(sys_remove_dir,1); -DEFINE_PRIM(sys_read_dir,1); -DEFINE_PRIM(file_full_path,1); -DEFINE_PRIM(file_exists,1); -DEFINE_PRIM(sys_exists,1); -DEFINE_PRIM(file_delete,1); -DEFINE_PRIM(sys_rename,2); -DEFINE_PRIM(sys_exe_path,0); -DEFINE_PRIM(sys_file_type,1); -DEFINE_PRIM(sys_getch,1); -DEFINE_PRIM(sys_get_pid,0); - -/* ************************************************************************ */ diff --git a/project/libs/std/Xml.cpp b/project/libs/std/Xml.cpp deleted file mode 100644 index 55d08a7f2..000000000 --- a/project/libs/std/Xml.cpp +++ /dev/null @@ -1,386 +0,0 @@ -#include -#ifdef EPPC -#include -#else -#include -#endif - - -#ifdef HXCPP -#define NULL_VAL null() -#else -#define NULL_VAL NULL -#endif - -#ifndef NEKO_WINDOWS -# include -# undef strcmpi -# define strcmpi(a,b) strcasecmp(a,b) -#else -# include -#endif - -int __xml_prims() { return 0; } - -#define ERROR(msg) xml_error(xml,p,line,msg); - -// -------------- parsing -------------------------- - -typedef enum { - IGNORE_SPACES, - BEGIN, - BEGIN_NODE, - TAG_NAME, - BODY, - ATTRIB_NAME, - EQUALS, - ATTVAL_BEGIN, - ATTRIB_VAL, - CHILDS, - CLOSE, - WAIT_END, - WAIT_END_RET, - PCDATA, - HEADER, - COMMENT, - DOCTYPE, - CDATA, -} STATE; - -extern field id_pcdata; -extern field id_xml; -extern field id_done; -extern field id_comment; -extern field id_cdata; -extern field id_doctype; - -static void xml_error( const char *xml, const char *p, int *line, const char *msg ) { - buffer b = alloc_buffer("Xml parse error : "); - int l = (int)strlen(p); - int nchars = 30; - buffer_append(b,msg); - buffer_append(b," at line "); - val_buffer(b,alloc_int(*line)); - buffer_append(b," : "); - if( p != xml ) - buffer_append(b,"..."); - buffer_append_sub(b,p,(l < nchars)?l:nchars); - if( l > nchars ) - buffer_append(b,"..."); - if( l == 0 ) - buffer_append(b,""); - bfailure(b); -} - -static bool is_valid_char( int c ) { - return ( c >= 'a' && c <= 'z' ) || ( c >= 'A' && c <= 'Z' ) || ( c >= '0' && c <= '9' ) || c == ':' || c == '.' || c == '_' || c == '-'; -} - -static void do_parse_xml( const char *xml, const char **lp, int *line, value callb, const char *parentname ) { - STATE state = BEGIN; - STATE next = BEGIN; - field aname = (field)0; - value attribs = NULL_VAL; - value nodename = NULL_VAL; - const char *start = NULL; - const char *p = *lp; - char c = *p; - int nsubs = 0, nbrackets = 0; - while( c ) { - switch( state ) { - case IGNORE_SPACES: - switch( c ) { - case '\n': - case '\r': - case '\t': - case ' ': - break; - default: - state = next; - continue; - } - break; - case BEGIN: - switch( c ) { - case '<': - state = IGNORE_SPACES; - next = BEGIN_NODE; - break; - default: - start = p; - state = PCDATA; - continue; - } - break; - case PCDATA: - if( c == '<' ) { - val_ocall1(callb,id_pcdata,copy_string(start,p-start)); - nsubs++; - state = IGNORE_SPACES; - next = BEGIN_NODE; - } - break; - case CDATA: - if( c == ']' && p[1] == ']' && p[2] == '>' ) { - val_ocall1(callb,id_cdata,copy_string(start,p-start)); - nsubs++; - p += 2; - state = BEGIN; - } - break; - case BEGIN_NODE: - switch( c ) { - case '!': - if( p[1] == '[' ) { - p += 2; - if( (p[0] != 'C' && p[0] != 'c') || - (p[1] != 'D' && p[1] != 'd') || - (p[2] != 'A' && p[2] != 'a') || - (p[3] != 'T' && p[3] != 't') || - (p[4] != 'A' && p[4] != 'a') || - (p[5] != '[') ) - ERROR("Expected ': - state = CHILDS; - nsubs++; - val_ocall2(callb,id_xml,nodename,attribs); - break; - default: - state = ATTRIB_NAME; - start = p; - continue; - } - break; - case ATTRIB_NAME: - if( !is_valid_char(c) ) { - value tmp; - if( start == p ) - ERROR("Expected attribute name"); - tmp = copy_string(start,p-start); - aname = val_id(val_string(tmp)); - if( !val_is_null(val_field(attribs,aname)) ) - ERROR("Duplicate attribute"); - state = IGNORE_SPACES; - next = EQUALS; - continue; - } - break; - case EQUALS: - switch( c ) { - case '=': - state = IGNORE_SPACES; - next = ATTVAL_BEGIN; - break; - default: - ERROR("Expected ="); - } - break; - case ATTVAL_BEGIN: - switch( c ) { - case '"': - case '\'': - state = ATTRIB_VAL; - start = p; - break; - default: - ERROR("Expected \""); - } - break; - case ATTRIB_VAL: - if( c == *start ) { - value aval = copy_string(start+1,p-start-1); - alloc_field(attribs,aname,aval); - state = IGNORE_SPACES; - next = BODY; - } - break; - case CHILDS: - *lp = p; - do_parse_xml(xml,lp,line,callb,val_string(nodename)); - p = *lp; - start = p; - state = BEGIN; - break; - case WAIT_END: - switch( c ) { - case '>': - val_ocall0(callb,id_done); - state = BEGIN; - break; - default : - ERROR("Expected >"); - } - break; - case WAIT_END_RET: - switch( c ) { - case '>': - if( nsubs == 0 ) - val_ocall1(callb,id_pcdata,alloc_string("")); - val_ocall0(callb,id_done); - *lp = p; - return; - default : - ERROR("Expected >"); - } - break; - case CLOSE: - if( !is_valid_char(c) ) { - if( start == p ) - ERROR("Expected node name"); - { - value v = copy_string(start,p - start); - if( strcmpi(parentname,val_string(v)) != 0 ) { - buffer b = alloc_buffer("Expected "); - ERROR(buffer_data(b)); - } - } - state = IGNORE_SPACES; - next = WAIT_END_RET; - continue; - } - break; - case COMMENT: - if( c == '-' && p[1] == '-' && p[2] == '>' ) { - val_ocall1(callb,id_comment,copy_string(start,p-start)); - p += 2; - state = BEGIN; - } - break; - case DOCTYPE: - if( c == '[' ) - nbrackets++; - else if( c == ']' ) - nbrackets--; - else if( c == '>' && nbrackets == 0 ) { - val_ocall1(callb,id_doctype,copy_string(start,p-start)); - state = BEGIN; - } - break; - case HEADER: - if( c == '?' && p[1] == '>' ) { - p++; - val_ocall1(callb,id_comment,copy_string(start,p-start)); - state = BEGIN; - } - break; - } - c = *++p; - if( c == '\n' ) - (*line)++; - } - if( state == BEGIN ) { - start = p; - state = PCDATA; - } - if( parentname == NULL && state == PCDATA ) { - if( p != start || nsubs == 0 ) - val_ocall1(callb,id_pcdata,copy_string(start,p-start)); - return; - } - ERROR("Unexpected end"); -} - -// ---------------------------------------------- - -/** - -

Xml

-

- The standard event-driven XML parser. -

-
-**/ - -/** - parse_xml : xml:string -> events:object -> void - - The [parse_xml] parse a string and for each parsed element call the - corresponding object method in [events] : -
    -
  • [void xml( name : string, attribs : object)] when an XML node is found
  • -
  • [void done()] when an XML node is closed
  • -
  • [void pcdata(string)] when PCData chars found
  • -
  • [void cdata(string)] when a CData session is found
  • -
  • [void comment(string)] when some comment or special header is found
  • -
- You can then implement the events so they build the appropriate XML data - structure needed by your language. -
-**/ -static value parse_xml( value str, value callb ) { - const char *p; - int line = 0; - val_check(str,string); - val_check(callb,object); - p = val_string(str); - // skip BOM - if( p[0] == (char)0xEF && p[1] == (char)0xBB && p[2] == (char)0xBF ) - p += 3; - do_parse_xml(p,&p,&line,callb,NULL); - return alloc_bool(true); -} - -DEFINE_PRIM(parse_xml,2); - -/* ************************************************************************ */ diff --git a/project/libs/zlib/Build.xml b/project/libs/zlib/Build.xml deleted file mode 100644 index a633d230b..000000000 --- a/project/libs/zlib/Build.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
-
- - - - - - - - - - - -
diff --git a/project/libs/zlib/ZLib.cpp b/project/libs/zlib/ZLib.cpp deleted file mode 100644 index edb130608..000000000 --- a/project/libs/zlib/ZLib.cpp +++ /dev/null @@ -1,312 +0,0 @@ -#ifndef STATIC_LINK -#define IMPLEMENT_API -#endif - -#include -#include -#include -#include - -/** - -

ZLib

-

- Give access to the popular ZLib compression library, used in several file - formats such as ZIP and PNG. -

-
-**/ - -DEFINE_KIND(k_stream_def); -DEFINE_KIND(k_stream_inf); - -#define val_stream(v) ((z_stream *)val_data(v)) -#define val_flush(s) *((int*)(((char*)s)+sizeof(z_stream))) - -static field id_read, id_write, id_done; - -DEFINE_ENTRY_POINT(zlib_main); - -void zlib_main() { - id_read = val_id("read"); - id_write = val_id("write"); - id_done = val_id("done"); -} - -static void free_stream_def( value v ) { - z_stream *s = val_stream(v); - deflateEnd(s); // no error - free(s); - free_abstract(v); -} - -static void free_stream_inf( value v ) { - z_stream *s = val_stream(v); - inflateEnd(s); // no error - free(s); - free_abstract(v); -} - -static void zlib_error( z_stream *z, int err ) { - buffer b = alloc_buffer("ZLib Error : "); - if( z && z->msg ) { - buffer_append(b,z->msg); - buffer_append(b," ("); - } - val_buffer(b,alloc_int(err)); - if( z && z->msg ) - buffer_append_char(b,')'); - val_throw(buffer_to_string(b)); -} - -/** - deflate_init : level:int -> 'dstream - Open a compression stream with the given level of compression -**/ -static value deflate_init( value level ) { - z_stream *z; - value s; - int err; - val_check(level,int); - z = (z_stream*)malloc(sizeof(z_stream) + sizeof(int)); - memset(z,0,sizeof(z_stream)); - val_flush(z) = Z_NO_FLUSH; - if( (err = deflateInit(z,val_int(level))) != Z_OK ) { - free(z); - zlib_error(NULL,err); - } - s = alloc_abstract(k_stream_def,z); - val_gc(s,free_stream_def); - return s; -} - -/** - deflate_buffer : 'dstream -> src:string -> srcpos:int -> dst:string -> dstpos:int -> { done => bool, read => int, write => int } -**/ -static value deflate_buffer( value s, value src, value srcpos, value dst, value dstpos ) { - z_stream *z; - int err; - value o; - val_check_kind(s,k_stream_def); - - buffer src_buf = val_to_buffer(src); - if (!src_buf) - hx_failure("invalid source buffer"); - buffer dst_buf = val_to_buffer(dst); - if (!dst_buf) - hx_failure("invalid destination buffer"); - - - val_check(srcpos,int); - val_check(dstpos,int); - z = val_stream(s); - if( val_int(srcpos) < 0 || val_int(dstpos) < 0 ) - return alloc_null(); - int slen = buffer_size(src_buf) - val_int(srcpos); - int dlen = buffer_size(dst_buf) - val_int(dstpos); - if( slen < 0 || dlen < 0 ) - return alloc_null(); - z->next_in = (Bytef*)(buffer_data(src_buf) + val_int(srcpos)); - z->next_out = (Bytef*)(buffer_data(dst_buf) + val_int(dstpos)); - z->avail_in = slen; - z->avail_out = dlen; - if( (err = deflate(z,val_flush(z))) < 0 ) - zlib_error(z,err); - z->next_in = NULL; - z->next_out = NULL; - o = alloc_empty_object(); - alloc_field(o,id_done,alloc_bool(err == Z_STREAM_END)); - alloc_field(o,id_read,alloc_int((int)(slen - z->avail_in))); - alloc_field(o,id_write,alloc_int((int)(dlen - z->avail_out))); - return o; -} - -/** - deflate_end : 'dstream -> void - Close a compression stream -**/ -static value deflate_end( value s ) { - val_check_kind(s,k_stream_def); - free_stream_def(s); - return alloc_null(); -} - -/** - inflate_init : window_size:int? -> 'istream - Open a decompression stream -**/ -static value inflate_init( value wsize ) { - z_stream *z; - value s; - int err; - int wbits; - if( val_is_null(wsize) ) - wbits = MAX_WBITS; - else { - val_check(wsize,int); - wbits = val_int(wsize); - } - z = (z_stream*)malloc(sizeof(z_stream) + sizeof(int)); - memset(z,0,sizeof(z_stream)); - val_flush(z) = Z_NO_FLUSH; - if( (err = inflateInit2(z,wbits)) != Z_OK ) { - free(z); - zlib_error(NULL,err); - } - s = alloc_abstract(k_stream_inf,z); - val_gc(s,free_stream_inf); - return s; -} - -/** - inflate_buffer : 'istream -> src:string -> srcpos:int -> dst:string -> dstpos:int -> { done => bool, read => int, write => int } -**/ -static value inflate_buffer( value s, value src, value srcpos, value dst, value dstpos ) { - z_stream *z; - int err; - value o; - val_check_kind(s,k_stream_inf); - val_check(srcpos,int); - - buffer src_buf = val_to_buffer(src); - if (!src_buf) - hx_failure("invalid source buffer"); - buffer dst_buf = val_to_buffer(dst); - if (!dst_buf) - hx_failure("invalid destination buffer"); - - int slen = buffer_size(src_buf); - int dlen = buffer_size(dst_buf); - - val_check(dstpos,int); - z = val_stream(s); - if( val_int(srcpos) < 0 || val_int(dstpos) < 0 ) - return alloc_null(); - slen -= val_int(srcpos); - dlen -= val_int(dstpos); - if( slen < 0 || dlen < 0 ) - return alloc_null(); - - z->next_in = (Bytef*)buffer_data(src_buf) + val_int(srcpos); - z->next_out = (Bytef*)buffer_data(dst_buf) + val_int(dstpos); - z->avail_in = slen; - z->avail_out = dlen; - if( (err = inflate(z,val_flush(z))) < 0 ) - zlib_error(z,err); - z->next_in = NULL; - z->next_out = NULL; - o = alloc_empty_object(); - alloc_field(o,id_done,alloc_bool(err == Z_STREAM_END)); - alloc_field(o,id_read,alloc_int((int)(slen - z->avail_in))); - alloc_field(o,id_write,alloc_int((int)(dlen - z->avail_out))); - return o; -} - -/** - inflate_end : 'istream -> void - Close a decompression stream -**/ -static value inflate_end( value s ) { - val_check_kind(s,k_stream_inf); - free_stream_inf(s); - return alloc_null(); -} - -/** - set_flush_mode : 'stream -> string -> void - Change the flush mode ("NO","SYNC","FULL","FINISH","BLOCK") -**/ -static value set_flush_mode( value s, value flush ) { - int f; - if( !val_is_kind(s,k_stream_inf) ) - val_check_kind(s,k_stream_def); - val_check(flush,string); - if( strcmp(val_string(flush),"NO") == 0 ) - f = Z_NO_FLUSH; - else if( strcmp(val_string(flush),"SYNC") == 0 ) - f = Z_SYNC_FLUSH; - else if( strcmp(val_string(flush),"FULL") == 0 ) - f = Z_FULL_FLUSH; - else if( strcmp(val_string(flush),"FINISH") == 0 ) - f = Z_FINISH; - else if( strcmp(val_string(flush),"BLOCK") == 0 ) - f = Z_BLOCK; - else - return alloc_null(); - val_flush(val_stream(s)) = f; - return alloc_null(); -} - -/** - get_adler32 : 'stream -> 'int32 - Returns the adler32 value of the stream -**/ -static value get_adler32( value s ) { - if( !val_is_kind(s,k_stream_inf) ) - val_check_kind(s,k_stream_def); - return alloc_int32(val_stream(s)->adler); -} - - -/** - update_adler32 : adler:'int32 -> string -> pos:int -> len:int -> 'int32 - Update an adler32 value with a substring -**/ -static value update_adler32( value adler, value s, value pos, value len ) { - val_check(adler,int); - val_check(s,string); - val_check(pos,int); - val_check(len,int); - if( val_int(pos) < 0 || val_int(len) < 0 || val_int(pos) + val_int(len) > val_strlen(s) ) - return alloc_null(); - return alloc_int32(adler32(val_int(adler),(Bytef*)(val_string(s)+val_int(pos)),val_int(len))); -} - -/** - update_crc32 : crc:'int32 -> string -> pos:int -> len:int -> 'int32 - Update a CRC32 value with a substring -**/ -static value update_crc32( value crc, value s, value pos, value len ) { - val_check(crc,int); - val_check(s,string); - val_check(pos,int); - val_check(len,int); - if( val_int(pos) < 0 || val_int(len) < 0 || val_int(pos) + val_int(len) > val_strlen(s) ) - return alloc_null(); - return alloc_int32(crc32(val_int(crc),(Bytef*)(val_string(s)+val_int(pos)),val_int(len))); -} - -/** - deflate_bound : 'dstream -> n:int -> int - Return the maximum buffer size needed to write [n] bytes -**/ -static value deflate_bound( value s, value size ) { - val_check_kind(s,k_stream_def); - val_check(size,int); - return alloc_int(deflateBound(val_stream(s),val_int(size))); -} - -extern "C" int zlib_register_prims() -{ - static bool init = false; - if (init) return 0; - init = true; - - zlib_main(); - return 0; -} - -DEFINE_PRIM(deflate_init,1); -DEFINE_PRIM(deflate_buffer,5); -DEFINE_PRIM(deflate_end,1); -DEFINE_PRIM(inflate_init,1); -DEFINE_PRIM(inflate_buffer,5); -DEFINE_PRIM(inflate_end,1); -DEFINE_PRIM(set_flush_mode,2); -DEFINE_PRIM(deflate_bound,2); - -DEFINE_PRIM(get_adler32,1); -DEFINE_PRIM(update_adler32,4); -DEFINE_PRIM(update_crc32,4); - -/* ************************************************************************ */ diff --git a/project/libs/zlib/zlib.vcproj b/project/libs/zlib/zlib.vcproj deleted file mode 100644 index 4beecb2bf..000000000 --- a/project/libs/zlib/zlib.vcproj +++ /dev/null @@ -1,263 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

U{#l9)yN)0bSN)4?*-SqA(IB?^5|BN$s9r2$B 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 diff --git a/project/libs/nekoapi/bin/RPi/libneko.so b/project/libs/nekoapi/bin/RPi/libneko.so deleted file mode 100755 index 50af23819ec4505ef36ea9d7eb948a3e8120266b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101576 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 diff --git a/project/libs/nekoapi/bin/Windows/neko.lib b/project/libs/nekoapi/bin/Windows/neko.lib deleted file mode 100644 index e26302e926648024935592a3bdd1cc9b8359c1ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18916 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 WIOM% -#ifndef NEKO_VCC -# include -#endif - -#define NEKO_VERSION 180 - -typedef intptr_t int_val; - -typedef enum { - VAL_INT = 0xFF, - VAL_NULL = 0, - VAL_FLOAT = 1, - VAL_BOOL = 2, - VAL_STRING = 3, - VAL_OBJECT = 4, - VAL_ARRAY = 5, - VAL_FUNCTION = 6, - VAL_ABSTRACT = 7, - VAL_PRIMITIVE = 6 | 8, - VAL_JITFUN = 6 | 16, - VAL_32_BITS = 0xFFFFFFFF -} val_type; - -struct _value { - val_type t; -}; - -struct _objtable; -struct _buffer; -typedef int field; - -#ifndef HAVE_NEKO_TYPES -typedef struct _vkind *vkind; -typedef struct _value *value; -typedef struct _buffer *buffer; -#endif - -typedef struct _objtable* objtable; -typedef double tfloat; - -typedef void (*finalizer)(value v); - -#pragma pack(4) -typedef struct { - val_type t; - tfloat f; -} vfloat; -#pragma pack() - -typedef struct _vobject { - val_type t; - objtable table; - struct _vobject *proto; -} vobject; - -typedef struct { - val_type t; - int nargs; - void *addr; - value env; - void *module; -} vfunction; - -typedef struct { - val_type t; - char c; -} vstring; - -typedef struct { - val_type t; - value ptr; -} varray; - -typedef struct { - val_type t; - vkind kind; - void *data; -} vabstract; - -typedef struct hcell { - int hkey; - value key; - value val; - struct hcell *next; -} hcell; - -typedef struct { - hcell **cells; - int ncells; - int nitems; -} vhash; - -struct _mt_local; -struct _mt_lock; -typedef struct _mt_local mt_local; -typedef struct _mt_lock mt_lock; - -#define val_tag(v) (*(val_type*)(v)) -#define val_is_null(v) ((v) == val_null) -#define val_is_int(v) ((((int)(int_val)(v)) & 1) != 0) -#define val_is_bool(v) ((v) == val_true || (v) == val_false) -#define val_is_number(v) (val_is_int(v) || val_tag(v) == VAL_FLOAT) -#define val_is_float(v) (!val_is_int(v) && val_tag(v) == VAL_FLOAT) -#define val_is_string(v) (!val_is_int(v) && (val_tag(v)&7) == VAL_STRING) -#define val_is_function(v) (!val_is_int(v) && (val_tag(v)&7) == VAL_FUNCTION) -#define val_is_object(v) (!val_is_int(v) && val_tag(v) == VAL_OBJECT) -#define val_is_array(v) (!val_is_int(v) && (val_tag(v)&7) == VAL_ARRAY) -#define val_is_abstract(v) (!val_is_int(v) && val_tag(v) == VAL_ABSTRACT) -#define val_is_kind(v,t) (val_is_abstract(v) && val_kind(v) == (t)) -#define val_check_kind(v,t) if( !val_is_kind(v,t) ) neko_error(); -#define val_check_function(f,n) if( !val_is_function(f) || (val_fun_nargs(f) != (n) && val_fun_nargs(f) != VAR_ARGS) ) neko_error(); -#define val_check(v,t) if( !val_is_##t(v) ) neko_error(); -#define val_data(v) ((vabstract*)(v))->data -#define val_kind(v) ((vabstract*)(v))->kind - -#define val_type(v) (val_is_int(v) ? VAL_INT : (val_tag(v)&7)) -#define val_int(v) (((int)(int_val)(v)) >> 1) -#define val_float(v) (CONV_FLOAT ((vfloat*)(v))->f) -#define val_bool(v) ((v) == val_true) -#define val_number(v) (val_is_int(v)?val_int(v):val_float(v)) -#define val_hdata(v) ((vhash*)val_data(v)) -#define val_string(v) (&((vstring*)(v))->c) -#define val_strlen(v) (val_tag(v) >> 3) -#define val_set_length(v,l) val_tag(v) = (val_tag(v)&7) | ((l) << 3) -#define val_set_size val_set_length - -#define val_array_size(v) (val_tag(v) >> 3) -#define val_array_ptr(v) (&((varray*)(v))->ptr) -#define val_fun_nargs(v) ((vfunction*)(v))->nargs -#define alloc_int(v) ((value)(int_val)((((int)(v)) << 1) | 1)) -#define alloc_bool(b) ((b)?val_true:val_false) - -#define max_array_size ((1 << 29) - 1) -#define max_string_size ((1 << 29) - 1) -#define invalid_comparison 0xFE - -#undef EXTERN -#undef EXPORT -#undef IMPORT -#if defined(NEKO_VCC) || defined(NEKO_MINGW) -# define INLINE __inline -# define EXPORT __declspec( dllexport ) -# define IMPORT __declspec( dllimport ) -#else -# define INLINE inline -# define EXPORT -# define IMPORT -#endif - -#if defined(NEKO_SOURCES) || defined(NEKO_STANDALONE) -# define EXTERN EXPORT -#else -# define EXTERN IMPORT -#endif - -#define VEXTERN extern EXTERN - -#ifdef __cplusplus -# define C_FUNCTION_BEGIN extern "C" { -# define C_FUNCTION_END }; -#else -# define C_FUNCTION_BEGIN -# define C_FUNCTION_END -# ifndef true -# define true 1 -# define false 0 - typedef int bool; -# endif -#endif - -#define alloc_int32(i) alloc_abstract(k_int32, (value)(int_val)(i)) -// the two upper bits must be either 00 or 11 -#define need_32_bits(i) ( ((((unsigned int)i) >> 30) + 1) & 2 ) -#define alloc_best_int(i) (need_32_bits(i) ? alloc_int32(i) : alloc_int(i)) -#define val_int32(v) (val_is_int(v)?val_int(v):(int)(int_val)val_data(v)) -#define val_is_int32(v) (val_is_int(v) || val_is_kind(v,k_int32)) - -#define neko_error() return NULL -#define failure(msg) _neko_failure(alloc_string(msg),__FILE__,__LINE__) -#define bfailure(buf) _neko_failure(buffer_to_string(b),__FILE__,__LINE__) - -#ifndef CONV_FLOAT -# define CONV_FLOAT -#endif - -#ifdef NEKO_POSIX -# include -# define POSIX_LABEL(name) name: -# define HANDLE_EINTR(label) if( errno == EINTR ) goto label -# define HANDLE_FINTR(f,label) if( ferror(f) && errno == EINTR ) goto label -#else -# define POSIX_LABEL(name) -# define HANDLE_EINTR(label) -# define HANDLE_FINTR(f,label) -#endif - -#define VAR_ARGS (-1) - -#define NEKO_DEFINE_PRIM_MULT(func) C_FUNCTION_BEGIN EXPORT void *func##__MULT() { return (void*)(&func); } C_FUNCTION_END -#define NEKO_DEFINE_PRIM(func,nargs) C_FUNCTION_BEGIN EXPORT void *func##__##nargs() { return (void*)(&func); } C_FUNCTION_END - -#define DEFINE_KIND(name) int_val __kind_##name = 0; vkind name = (vkind)&__kind_##name; - -#ifdef NEKO_STANDALONE -# define DEFINE_ENTRY_POINT(name) -#else -# define DEFINE_ENTRY_POINT(name) C_FUNCTION_BEGIN void name(); EXPORT void *__neko_entry_point() { return &name; } C_FUNCTION_END -#endif - -#ifdef HEADER_IMPORTS -# define H_EXTERN IMPORT -#else -# define H_EXTERN EXPORT -#endif - -#define DECLARE_PRIM(func,nargs) C_FUNCTION_BEGIN H_EXTERN void *func##__##nargs(); C_FUNCTION_END -#define DECLARE_KIND(name) C_FUNCTION_BEGIN H_EXTERN extern vkind name; C_FUNCTION_END - -#define alloc_float neko_alloc_float -#define alloc_string neko_alloc_string -#define alloc_empty_string neko_alloc_empty_string -#define copy_string neko_copy_string -#define val_this neko_val_this -#define val_id neko_val_id -#define val_field neko_val_field -#define alloc_object neko_alloc_object -#define alloc_field neko_alloc_field -#define alloc_array neko_alloc_array -#define val_call0 neko_val_call0 -#define val_call1 neko_val_call1 -#define val_call2 neko_val_call2 -#define val_call3 neko_val_call3 -#define val_callN neko_val_callN -#define val_ocall0 neko_val_ocall0 -#define val_ocall1 neko_val_ocall1 -#define val_ocall2 neko_val_ocall2 -#define val_ocallN neko_val_ocallN -#define val_callEx neko_val_callEx -#define alloc_root neko_alloc_root -#define free_root neko_free_root -#define alloc neko_alloc -#define alloc_private neko_alloc_private -#define alloc_abstract neko_alloc_abstract -#define alloc_function neko_alloc_function -#define alloc_buffer neko_alloc_buffer -#define buffer_append neko_buffer_append -#define buffer_append_sub neko_buffer_append_sub -#define buffer_append_char neko_buffer_append_char -#define buffer_to_string neko_buffer_to_string -#define val_buffer neko_val_buffer -#define val_compare neko_val_compare -#define val_print neko_val_print -#define val_gc neko_val_gc -#define val_throw neko_val_throw -#define val_rethrow neko_val_rethrow -#define val_iter_fields neko_val_iter_fields -#define val_field_name neko_val_field_name -#define val_hash neko_val_hash -#define k_int32 neko_k_int32 -#define k_hash neko_k_hash -#define kind_share neko_kind_share - -#define alloc_local neko_alloc_local -#define local_get neko_local_get -#define local_set neko_local_set -#define free_local neko_free_local -#define alloc_lock neko_alloc_lock -#define lock_acquire neko_lock_acquire -#define lock_try neko_lock_try -#define lock_release neko_lock_release -#define free_lock neko_free_lock - -C_FUNCTION_BEGIN - - VEXTERN vkind k_int32; - VEXTERN vkind k_hash; - - VEXTERN value val_null; - VEXTERN value val_true; - VEXTERN value val_false; - - EXTERN value alloc_float( tfloat t ); - - EXTERN value alloc_string( const char *str ); - EXTERN value alloc_empty_string( unsigned int size ); - EXTERN value copy_string( const char *str, int_val size ); - - EXTERN value val_this(); - EXTERN field val_id( const char *str ); - EXTERN value val_field( value o, field f ); - EXTERN value alloc_object( value o ); - EXTERN void alloc_field( value obj, field f, value v ); - EXTERN void val_iter_fields( value obj, void f( value v, field f, void * ), void *p ); - EXTERN value val_field_name( field f ); - - EXTERN value alloc_array( unsigned int n ); - EXTERN value alloc_abstract( vkind k, void *data ); - - EXTERN value val_call0( value f ); - EXTERN value val_call1( value f, value arg ); - EXTERN value val_call2( value f, value arg1, value arg2 ); - EXTERN value val_call3( value f, value arg1, value arg2, value arg3 ); - EXTERN value val_callN( value f, value *args, int nargs ); - EXTERN value val_ocall0( value o, field f ); - EXTERN value val_ocall1( value o, field f, value arg ); - EXTERN value val_ocall2( value o, field f, value arg1, value arg2 ); - EXTERN value val_ocallN( value o, field f, value *args, int nargs ); - EXTERN value val_callEx( value vthis, value f, value *args, int nargs, value *exc ); - - EXTERN value *alloc_root( unsigned int nvals ); - EXTERN void free_root( value *r ); - EXTERN char *alloc( unsigned int nbytes ); - EXTERN char *alloc_private( unsigned int nbytes ); - EXTERN value alloc_function( void *c_prim, unsigned int nargs, const char *name ); - - EXTERN buffer alloc_buffer( const char *init ); - EXTERN void buffer_append( buffer b, const char *s ); - EXTERN void buffer_append_sub( buffer b, const char *s, int_val len ); - EXTERN void buffer_append_char( buffer b, char c ); - EXTERN value buffer_to_string( buffer b ); - EXTERN void val_buffer( buffer b, value v ); - - EXTERN int val_compare( value a, value b ); - EXTERN void val_print( value s ); - EXTERN void val_gc( value v, finalizer f ); - EXTERN void val_throw( value v ); - EXTERN void val_rethrow( value v ); - EXTERN int val_hash( value v ); - - EXTERN void kind_share( vkind *k, const char *name ); - EXTERN void _neko_failure( value msg, const char *file, int line ); - - // MULTITHREADING API - EXTERN mt_local *alloc_local(); - EXTERN void *local_get( mt_local *l ); - EXTERN void local_set( mt_local *l, void *v ); - EXTERN void free_local( mt_local *l ); - - EXTERN mt_lock *alloc_lock(); - EXTERN void lock_acquire( mt_lock *l ); - EXTERN int lock_try( mt_lock *l ); - EXTERN void lock_release( mt_lock *l ); - EXTERN void free_lock( mt_lock *l ); - -C_FUNCTION_END - -#endif -/* ************************************************************************ */ diff --git a/project/libs/nekoapi/neko2.h b/project/libs/nekoapi/neko2.h deleted file mode 100644 index ea9e71311..000000000 --- a/project/libs/nekoapi/neko2.h +++ /dev/null @@ -1,450 +0,0 @@ -/* - * Copyright (C)2005-2012 Haxe Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ -#ifndef _NEKO_H -#define _NEKO_H - -// OS FLAGS -#if defined(_WIN32) -# define NEKO_WINDOWS -#endif - -#if defined(__APPLE__) || defined(__MACH__) || defined(macintosh) -# define NEKO_MAC -#endif - -#if defined(linux) || defined(__linux__) -# define NEKO_LINUX -#endif - -#if defined(__FreeBSD_kernel__) -# define NEKO_GNUKBSD -#endif - -#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) -# define NEKO_BSD -#endif - -// COMPILER/PROCESSOR FLAGS -#if defined(__GNUC__) -# define NEKO_GCC -#endif - -#if defined(_MSC_VER) -# define NEKO_VCC -// remove deprecated C API usage warnings -# pragma warning( disable : 4996 ) -#endif - -#if defined(__MINGW32__) -# define NEKO_MINGW -#endif - -#if defined(__i386__) || defined(_WIN32) -# define NEKO_X86 -#endif - -#if defined(__ppc__) -# define NEKO_PPC -#endif - -#if defined(_64BITS) || defined(__x86_64__) -# define NEKO_64BITS -#endif - -#if defined(NEKO_LINUX) || defined(NEKO_MAC) || defined(NEKO_BSD) || defined(NEKO_GNUKBSD) -# define NEKO_POSIX -#endif - -#if defined(NEKO_GCC) -# define NEKO_THREADED -# define NEKO_DIRECT_THREADED -#endif - -#ifndef NEKO_NO_THREADS -# define NEKO_THREADS -#endif - -#include -#ifndef NEKO_VCC -# include -#endif - -#define NEKO_VERSION 200 - -typedef intptr_t int_val; - -typedef enum { - VAL_INT = 0xFF, - VAL_NULL = 0, - VAL_FLOAT = 1, - VAL_BOOL = 2, - VAL_STRING = 3, - VAL_OBJECT = 4, - VAL_ARRAY = 5, - VAL_FUNCTION = 6, - VAL_ABSTRACT = 7, - VAL_INT32 = 8, - VAL_PRIMITIVE = 6 | 16, - VAL_JITFUN = 6 | 32, - VAL_32_BITS = 0xFFFFFFFF -} val_type; - -struct _value { - val_type t; -}; - -struct _buffer; -typedef int field; -/* -typedef struct { int __zero; } *vkind; -*/ -typedef struct _value *value; - -typedef struct { - field id; - value v; -} objcell; - -typedef struct _objtable -{ - int count; - objcell *cells; -} objtable; - -typedef struct _buffer *buffer; -typedef double tfloat; - -typedef void (*finalizer)(value v); - -#pragma pack(4) -typedef struct { - val_type t; - tfloat f; -} vfloat; - -typedef struct { - val_type t; - int i; -} vint32; -#pragma pack() - -typedef struct _vobject { - val_type t; - objtable table; - struct _vobject *proto; -} vobject; - -typedef struct { - val_type t; - int nargs; - void *addr; - value env; - void *module; -} vfunction; - -typedef struct { - val_type t; - char c; -} vstring; - -typedef struct { - val_type t; - value ptr; -} varray; - -typedef struct { - val_type t; - vkind kind; - void *data; -} vabstract; - -typedef struct hcell { - int hkey; - value key; - value val; - struct hcell *next; -} hcell; - -typedef struct { - hcell **cells; - int ncells; - int nitems; -} vhash; - -struct _mt_local; -struct _mt_lock; -typedef struct _mt_local mt_local; -typedef struct _mt_lock mt_lock; - -#define TAG_BITS 4 - -#define val_tag(v) (*(val_type*)(v)) -#define val_short_tag(v) (val_tag(v)&((1<data -#define val_kind(v) ((vabstract*)(v))->kind - -#define val_type(v) (val_is_int(v) ? VAL_INT : val_short_tag(v)) -#define val_int(v) (((int)(int_val)(v)) >> 1) -#define val_float(v) (CONV_FLOAT ((vfloat*)(v))->f) -#define val_int32(v) (((vint32*)(v))->i) -#define val_any_int(v) (val_is_int(v)?val_int(v):val_int32(v)) -#define val_bool(v) ((v) == val_true) -#define val_number(v) (val_is_int(v)?val_int(v):((val_tag(v)==VAL_FLOAT)?val_float(v):val_int32(v))) -#define val_hdata(v) ((vhash*)val_data(v)) -#define val_string(v) (&((vstring*)(v))->c) -#define val_strlen(v) (val_tag(v) >> TAG_BITS) -#define val_set_length(v,l) val_tag(v) = val_short_tag(v) | ((l) << TAG_BITS) -#define val_set_size val_set_length - -#define val_array_size(v) (val_tag(v) >> TAG_BITS) -#define val_array_ptr(v) (&((varray*)(v))->ptr) -#define val_fun_nargs(v) ((vfunction*)(v))->nargs -#define alloc_int(v) ((value)(int_val)((((int)(v)) << 1) | 1)) -#define alloc_bool(b) ((b)?val_true:val_false) - -#define max_array_size ((1 << (32 - TAG_BITS)) - 1) -#define max_string_size ((1 << (32 - TAG_BITS)) - 1) -#define invalid_comparison 0xFE - -#undef EXTERN -#undef EXPORT -#undef IMPORT -#if defined(NEKO_VCC) || defined(NEKO_MINGW) -# define INLINE __inline -# define EXPORT __declspec( dllexport ) -# define IMPORT __declspec( dllimport ) -#else -# define INLINE inline -# define EXPORT -# define IMPORT -#endif - -#if defined(NEKO_SOURCES) || defined(NEKO_STANDALONE) -# define EXTERN EXPORT -#else -# define EXTERN IMPORT -#endif - -#define VEXTERN extern EXTERN - -#ifdef __cplusplus -# define C_FUNCTION_BEGIN extern "C" { -# define C_FUNCTION_END }; -#else -# define C_FUNCTION_BEGIN -# define C_FUNCTION_END -# ifndef true -# define true 1 -# define false 0 - typedef int bool; -# endif -#endif - -// the two upper bits must be either 00 or 11 -#define need_32_bits(i) ( (((unsigned int)(i)) + 0x40000000) & 0x80000000 ) -#define alloc_best_int(i) (need_32_bits(i) ? alloc_int32(i) : alloc_int(i)) - -#define neko_error() return NULL -#define failure(msg) _neko_failure(alloc_string(msg),__FILE__,__LINE__) -#define bfailure(buf) _neko_failure(buffer_to_string(buf),__FILE__,__LINE__) - -#ifndef CONV_FLOAT -# define CONV_FLOAT -#endif - -#ifdef NEKO_POSIX -# include -# define POSIX_LABEL(name) name: -# define HANDLE_EINTR(label) if( errno == EINTR ) goto label -# define HANDLE_FINTR(f,label) if( ferror(f) && errno == EINTR ) goto label -#else -# define POSIX_LABEL(name) -# define HANDLE_EINTR(label) -# define HANDLE_FINTR(f,label) -#endif - -#define VAR_ARGS (-1) -#define NEKO_DEFINE_PRIM_MULT(func) C_FUNCTION_BEGIN EXPORT void *func##__MULT() { return (void*)(&func); } C_FUNCTION_END -#define NEKO_DEFINE_PRIM(func,nargs) C_FUNCTION_BEGIN EXPORT void *func##__##nargs() { return (void*)(&func); } C_FUNCTION_END -#define DEFINE_KIND(name) int_val __kind_##name = 0; vkind name = (vkind)&__kind_##name; - -#ifdef NEKO_STANDALONE -# define DEFINE_ENTRY_POINT(name) -#else -# define DEFINE_ENTRY_POINT(name) C_FUNCTION_BEGIN void name(); EXPORT void *__neko_entry_point() { return &name; } C_FUNCTION_END -#endif - -#ifdef HEADER_IMPORTS -# define H_EXTERN IMPORT -#else -# define H_EXTERN EXPORT -#endif - -#define DECLARE_PRIM(func,nargs) C_FUNCTION_BEGIN H_EXTERN void *func##__##nargs(); C_FUNCTION_END -#define DECLARE_KIND(name) C_FUNCTION_BEGIN H_EXTERN extern vkind name; C_FUNCTION_END - -#define alloc_int32 neko_alloc_int32 -#define alloc_float neko_alloc_float -#define alloc_string neko_alloc_string -#define alloc_empty_string neko_alloc_empty_string -#define copy_string neko_copy_string -#define val_this neko_val_this -#define val_id neko_val_id -#define val_field neko_val_field -#define alloc_object neko_alloc_object -#define alloc_field neko_alloc_field -#define alloc_array neko_alloc_array -#define val_call0 neko_val_call0 -#define val_call1 neko_val_call1 -#define val_call2 neko_val_call2 -#define val_call3 neko_val_call3 -#define val_callN neko_val_callN -#define val_ocall0 neko_val_ocall0 -#define val_ocall1 neko_val_ocall1 -#define val_ocall2 neko_val_ocall2 -#define val_ocallN neko_val_ocallN -#define val_callEx neko_val_callEx -#define alloc_root neko_alloc_root -#define free_root neko_free_root -#define alloc neko_alloc -#define alloc_private neko_alloc_private -#define alloc_abstract neko_alloc_abstract -#define alloc_function neko_alloc_function -#define alloc_buffer neko_alloc_buffer -#define buffer_append neko_buffer_append -#define buffer_append_sub neko_buffer_append_sub -#define buffer_append_char neko_buffer_append_char -#define buffer_to_string neko_buffer_to_string -#define val_buffer neko_val_buffer -#define val_compare neko_val_compare -#define val_print neko_val_print -#define val_gc neko_val_gc -#define val_throw neko_val_throw -#define val_rethrow neko_val_rethrow -#define val_iter_fields neko_val_iter_fields -#define val_field_name neko_val_field_name -#define val_hash neko_val_hash -#define k_hash neko_k_hash -#define kind_share neko_kind_share - -#define alloc_local neko_alloc_local -#define local_get neko_local_get -#define local_set neko_local_set -#define free_local neko_free_local -#define alloc_lock neko_alloc_lock -#define lock_acquire neko_lock_acquire -#define lock_try neko_lock_try -#define lock_release neko_lock_release -#define free_lock neko_free_lock - -C_FUNCTION_BEGIN - - VEXTERN vkind k_hash; - - VEXTERN value val_null; - VEXTERN value val_true; - VEXTERN value val_false; - - EXTERN value alloc_float( tfloat t ); - EXTERN value alloc_int32( int i ); - - EXTERN value alloc_string( const char *str ); - EXTERN value alloc_empty_string( unsigned int size ); - EXTERN value copy_string( const char *str, int_val size ); - - EXTERN value val_this(); - EXTERN field val_id( const char *str ); - EXTERN value val_field( value o, field f ); - EXTERN value alloc_object( value o ); - EXTERN void alloc_field( value obj, field f, value v ); - EXTERN void val_iter_fields( value obj, void f( value v, field f, void * ), void *p ); - EXTERN value val_field_name( field f ); - - EXTERN value alloc_array( unsigned int n ); - EXTERN value alloc_abstract( vkind k, void *data ); - - EXTERN value val_call0( value f ); - EXTERN value val_call1( value f, value arg ); - EXTERN value val_call2( value f, value arg1, value arg2 ); - EXTERN value val_call3( value f, value arg1, value arg2, value arg3 ); - EXTERN value val_callN( value f, value *args, int nargs ); - EXTERN value val_ocall0( value o, field f ); - EXTERN value val_ocall1( value o, field f, value arg ); - EXTERN value val_ocall2( value o, field f, value arg1, value arg2 ); - EXTERN value val_ocallN( value o, field f, value *args, int nargs ); - EXTERN value val_callEx( value vthis, value f, value *args, int nargs, value *exc ); - - EXTERN value *alloc_root( unsigned int nvals ); - EXTERN void free_root( value *r ); - EXTERN char *alloc( unsigned int nbytes ); - EXTERN char *alloc_private( unsigned int nbytes ); - EXTERN value alloc_function( void *c_prim, unsigned int nargs, const char *name ); - - EXTERN buffer alloc_buffer( const char *init ); - EXTERN void buffer_append( buffer b, const char *s ); - EXTERN void buffer_append_sub( buffer b, const char *s, int_val len ); - EXTERN void buffer_append_char( buffer b, char c ); - EXTERN value buffer_to_string( buffer b ); - EXTERN void val_buffer( buffer b, value v ); - - EXTERN int val_compare( value a, value b ); - EXTERN void val_print( value s ); - EXTERN void val_gc( value v, finalizer f ); - EXTERN void val_throw( value v ); - EXTERN void val_rethrow( value v ); - EXTERN int val_hash( value v ); - - EXTERN void kind_share( vkind *k, const char *name ); - EXTERN void _neko_failure( value msg, const char *file, int line ); - - // MULTITHREADING API - EXTERN mt_local *alloc_local(); - EXTERN void *local_get( mt_local *l ); - EXTERN void local_set( mt_local *l, void *v ); - EXTERN void free_local( mt_local *l ); - - EXTERN mt_lock *alloc_lock(); - EXTERN void lock_acquire( mt_lock *l ); - EXTERN int lock_try( mt_lock *l ); - EXTERN void lock_release( mt_lock *l ); - EXTERN void free_lock( mt_lock *l ); - -C_FUNCTION_END - -#endif -/* ************************************************************************ */ diff --git a/project/libs/regexp/Build.xml b/project/libs/regexp/Build.xml deleted file mode 100644 index c2ebc4ac8..000000000 --- a/project/libs/regexp/Build.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/project/libs/regexp/RegExp.cpp b/project/libs/regexp/RegExp.cpp deleted file mode 100644 index 1d91d8bbc..000000000 --- a/project/libs/regexp/RegExp.cpp +++ /dev/null @@ -1,291 +0,0 @@ -#ifndef STATIC_LINK -#define IMPLEMENT_API -#endif - -#include -#include -#ifndef PCRE_STATIC -#define PCRE_STATIC -#endif -#include - -#define PCRE(o) ((pcredata*)val_data(o)) - -typedef struct { - value str; - pcre *r; - int nmatchs; - int *matchs; -} pcredata; - -DEFINE_KIND(k_regexp); - -static field id_pos; -static field id_len; - -/** - -