From dba8ae680c1deec9379d9a6fca2d3183de32710b Mon Sep 17 00:00:00 2001 From: RainbowHype123 Date: Tue, 23 Jun 2026 01:39:07 -0700 Subject: [PATCH 01/17] Add Multiple Icons Support + ZlibStream Unicode + DarkExt.json changes ZlibStream Unicode is from a port I did in my own rSDK repo, and then hastily ported into the MMF2EXTs repo. It may need some extra review and/or fixes before the pull request is accepted. --- DarkEdif/DarkEdif Template/DarkExt.json | 12 +- DarkEdif/DarkEdif Template/Edittime.cpp | 7 + DarkEdif/DarkEdif Template/Ext.rc | 3 + DarkEdif/DarkEdif Template/Image.png | Bin 0 -> 1306 bytes DarkEdif/DarkEdif Template/Resource.h | 3 + DarkEdif/Inc/Shared/Edif.hpp | 4 + DarkEdif/Lib/Shared/DarkEdif.cpp | 1 + DarkEdif/Lib/Shared/Edif.cpp | 47 ++ rSDK/Inc/zconf.h | 67 +- rSDK/Inc/zlib.h | 845 +++++++++++++--------- rSDK/Lib/zlib.lib | Bin 331624 -> 344806 bytes rSDK/ZlibStream/Data.h | 28 +- rSDK/ZlibStream/Edittime.cpp | 195 +++-- rSDK/ZlibStream/Ext.rc | 8 +- rSDK/ZlibStream/General.cpp | 65 +- rSDK/ZlibStream/{EXTICON.BMP => Icon.bmp} | Bin rSDK/ZlibStream/{EXTIMG.BMP => Img.bmp} | Bin rSDK/ZlibStream/Information.h | 12 +- rSDK/ZlibStream/Main.cpp | 599 +++++++-------- rSDK/ZlibStream/Runtime.cpp | 102 +-- rSDK/ZlibStream/UpgradeLog.htm | Bin 0 -> 31898 bytes rSDK/ZlibStream/UpgradeLog2.htm | Bin 0 -> 31898 bytes 22 files changed, 1135 insertions(+), 863 deletions(-) create mode 100644 DarkEdif/DarkEdif Template/Image.png rename rSDK/ZlibStream/{EXTICON.BMP => Icon.bmp} (100%) rename rSDK/ZlibStream/{EXTIMG.BMP => Img.bmp} (100%) create mode 100644 rSDK/ZlibStream/UpgradeLog.htm create mode 100644 rSDK/ZlibStream/UpgradeLog2.htm diff --git a/DarkEdif/DarkEdif Template/DarkExt.json b/DarkEdif/DarkEdif Template/DarkExt.json index eeefd454..bb1f591b 100644 --- a/DarkEdif/DarkEdif Template/DarkExt.json +++ b/DarkEdif/DarkEdif Template/DarkExt.json @@ -77,6 +77,11 @@ { "Type": "FolderEnd" }, + { + "Title": "Props outside folder", + "Info": "This blue header is called a group inside the DarkExt.json file.", + "Type": "Group" + }, { "Title": "Static text 1", "Info": "Blank text", @@ -139,7 +144,7 @@ "About": { "Name": "Exemple objet", "Author": "Votre Nom", - "Copyright": "Copyright \u00A9 2022 par Votre Nom", + "Copyright": "Copyright \u00A9 2026 par Votre Nom", "Comment": "Une ou deux phrases pour décrire votre poste", "Help": "Help/Example.chm", "URL": "http://www.example.com/" @@ -209,6 +214,11 @@ { "Type": "FolderEnd" }, + { + "Title": "Groupe", + "Info": "Voir le fichier DarkExt.json.", + "Type": "Group" + }, { "Title": "Texte statique 1", "Info": "Texte vide", diff --git a/DarkEdif/DarkEdif Template/Edittime.cpp b/DarkEdif/DarkEdif Template/Edittime.cpp index 95885540..62555fb7 100644 --- a/DarkEdif/DarkEdif Template/Edittime.cpp +++ b/DarkEdif/DarkEdif Template/Edittime.cpp @@ -19,7 +19,11 @@ int FusionAPI MakeIconEx(mv * mV, cSurface * pIconSf, TCHAR * lpName, ObjInfo * { #pragma DllExportHint pIconSf->Delete(); + #ifdef MULTIPLEICONS + pIconSf->Clone(*Edif::SDK->Image); + #else pIconSf->Clone(*Edif::SDK->Icon); + #endif pIconSf->SetTransparentColor(RGB(255, 0, 255)); return 0; @@ -153,6 +157,8 @@ BOOL FusionAPI EditObject(mv *mV, ObjInfo * oiPtr, LevelObject * loPtr, EDITDATA // PROPERTIES // ============================================================================ +#ifndef NOPROPS + // Inserts properties into the properties of the object. BOOL FusionAPI GetProperties(mv * mV, EDITDATA * edPtr, BOOL bMasterItem) { @@ -227,6 +233,7 @@ void FusionAPI ReleasePropCreateParam(mv *mV, EDITDATA *edPtr, unsigned int Prop #pragma DllExportHint return DarkEdif::DLL::DLL_ReleasePropCreateParam(mV, edPtr, PropID, lParam); } +#endif // ============================================================================ // ROUTINES USED WHEN BUILDING diff --git a/DarkEdif/DarkEdif Template/Ext.rc b/DarkEdif/DarkEdif Template/Ext.rc index 7a032d2a..e27e3368 100644 --- a/DarkEdif/DarkEdif Template/Ext.rc +++ b/DarkEdif/DarkEdif Template/Ext.rc @@ -154,6 +154,9 @@ END #if EditorBuild IDR_EDIF_ICON Edif "Icon.png" +#ifdef MULTIPLEICONS +IDR_EDIF_IMAGE Edif "Image.png" +#endif #if !defined(DARKEXT_JSON_FILE_EXTERNAL) IDR_EDIF_JSON Edif "DarkExt.json" #endif diff --git a/DarkEdif/DarkEdif Template/Image.png b/DarkEdif/DarkEdif Template/Image.png new file mode 100644 index 0000000000000000000000000000000000000000..e5e942d41a8b9fe51c04ec0c6e4bc456e4650cca GIT binary patch literal 1306 zcmV+#1?BpQP)$bC{XBax3jymvokw0K5Qv%fwo&zUO35@`Tyr~ z&iT${zJYtV%MbvntE;W-?Ck$dR1`&gKA!*}0Zf@Ph3D6-NnDivJ7FW9IMy9GGI&k` z@cDc~C={|>PA9*&t8|1+BvAxF(_>hsIgBW77=vrO-Hy$6!?h9D2G@ekhQppRxG#MG zJnj_g>gsOXGnCkjg{`x_CeI#_=u{<~f=)ObAsSHu$aD*+hJY%E5)X(HnI0!Ly8}hl zkwg)RI6+wjDFs)mleDx{LYm0#5}h{|3Yh%sBL0WVjvl zDHdip1sfukB_Rn;LaN0Vf0$hB6R0eV0kE(3n~_qtHURML{_lut7OyVSF?4~_`A*80 z=iturpv3Jgnw7??Wi$Bf|ijDRZ}hr@|YO2>3$5l5sy>S4npaSHQHI8JLmoNPWfIQ4FYTfTzpXl=W|ys0MJN@OsyflMG1K^iDC9n4fPT?3U0F%S7u{8D)L4v-g=estdLo696@>DFR`MnXxYixO@Ar?{{kRPP^aP^J zncl_P$J!wX#D-J|?w{1h`X^iH4;%dW!}sH*9lwF~FTE(p5tG#m&ybTLC%TT2h&~4E z3Y(Dxh33;|sjaOYSNBO7065!z3Adx4(t?&m3K|fGnfG0@o3V#7Ix;1DLS*9U0iM;{!oeb EdittimeProperties; #ifndef NOPROPS diff --git a/DarkEdif/Lib/Shared/DarkEdif.cpp b/DarkEdif/Lib/Shared/DarkEdif.cpp index d3070faf..aec4c79f 100644 --- a/DarkEdif/Lib/Shared/DarkEdif.cpp +++ b/DarkEdif/Lib/Shared/DarkEdif.cpp @@ -2,6 +2,7 @@ #include "Extension.hpp" #include #include +#include #ifdef _WIN32 extern HINSTANCE hInstLib; diff --git a/DarkEdif/Lib/Shared/Edif.cpp b/DarkEdif/Lib/Shared/Edif.cpp index a1899f5c..ebf45f22 100644 --- a/DarkEdif/Lib/Shared/Edif.cpp +++ b/DarkEdif/Lib/Shared/Edif.cpp @@ -698,6 +698,53 @@ Edif::SDKClass::SDKClass(mv * mV, json_value &_json) : json (_json) DarkEdif::MsgBox::Error(_T("DarkEdif error"), _T("Blitting to ext icon surface failed. Last error: %i."), tempIcon->GetLastError()); } ExtIcon = new DarkEdif::Surface(nullptr, Icon); + + #ifdef MULTIPLEICONS + Image = new cSurface(); + char * ImageData; + size_t ImageSize; + + int resultTwo = Edif::GetDependency (ImageData, ImageSize, _T("png"), IDR_EDIF_IMAGE); + if (resultTwo != Edif::DependencyNotFound) + { + CInputMemFile * File = CInputMemFile::NewInstance(); + File->Create((LPBYTE)ImageData, ImageSize); + + const std::unique_ptr tempImage = std::make_unique(); + const bool loadedOK = ImportImageFromInputFile(mV->ImgFilterMgr, File, tempImage.get(), NULL, 0); + if (!loadedOK) + { + // Read PNG bit depth: Skip 8 byte PNG header, IHDR 4 byte chunk length/type, img width/height, + // and then get bit depth byte. + // 4 bit or less bit depth is not loadable by Fusion's PNG filter. + const std::uint8_t bitDepth = File->GetMemBuffer()[8 + 4 + 4 + 4 + 4]; + + if (bitDepth <= 4) + DarkEdif::MsgBox::Error(_T("Failed to load ext image"), _T("" PROJECT_NAME "'s Image.png uses a bit depth of %hhu, which is too small."), bitDepth); + else + DarkEdif::MsgBox::Error(_T("Failed to load ext image"), _T("" PROJECT_NAME "'s Image.png failed to load.")); + } + + File->Delete(); + + if (!tempImage->HasAlpha()) + tempImage->SetTransparentColor(RGB(255, 0, 255)); + + if (resultTwo != Edif::DependencyWasResource) + free(ImageData); + + Image->Create(tempImage->GetWidth(), tempImage->GetHeight(), proto); + + if (!tempImage->HasAlpha()) + Image->SetTransparentColor(RGB(255, 0, 255)); + else + Image->CreateAlpha(); + + if (loadedOK && tempImage->Blit(*Image) == FALSE) + DarkEdif::MsgBox::Error(_T("DarkEdif error"), _T("Blitting to ext image surface failed. Last error: %i."), tempImage->GetLastError()); + } + ExtImage = new DarkEdif::Surface(nullptr, Image); + #endif } #if USE_DARKEDIF_UPDATE_CHECKER diff --git a/rSDK/Inc/zconf.h b/rSDK/Inc/zconf.h index 5e1d68a0..828ca617 100644 --- a/rSDK/Inc/zconf.h +++ b/rSDK/Inc/zconf.h @@ -1,5 +1,5 @@ /* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * Copyright (C) 1995-2026 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -33,14 +33,21 @@ # ifndef Z_SOLO # define compress z_compress # define compress2 z_compress2 +# define compress_z z_compress_z +# define compress2_z z_compress2_z # define compressBound z_compressBound +# define compressBound_z z_compressBound_z # endif # define crc32 z_crc32 # define crc32_combine z_crc32_combine # define crc32_combine64 z_crc32_combine64 +# define crc32_combine_gen z_crc32_combine_gen +# define crc32_combine_gen64 z_crc32_combine_gen64 +# define crc32_combine_op z_crc32_combine_op # define crc32_z z_crc32_z # define deflate z_deflate # define deflateBound z_deflateBound +# define deflateBound_z z_deflateBound_z # define deflateCopy z_deflateCopy # define deflateEnd z_deflateEnd # define deflateGetDictionary z_deflateGetDictionary @@ -56,6 +63,7 @@ # define deflateSetDictionary z_deflateSetDictionary # define deflateSetHeader z_deflateSetHeader # define deflateTune z_deflateTune +# define deflateUsed z_deflateUsed # define deflate_copyright z_deflate_copyright # define get_crc_table z_get_crc_table # ifndef Z_SOLO @@ -125,9 +133,12 @@ # define inflate_copyright z_inflate_copyright # define inflate_fast z_inflate_fast # define inflate_table z_inflate_table +# define inflate_fixed z_inflate_fixed # ifndef Z_SOLO # define uncompress z_uncompress # define uncompress2 z_uncompress2 +# define uncompress_z z_uncompress_z +# define uncompress2_z z_uncompress2_z # endif # define zError z_zError # ifndef Z_SOLO @@ -231,14 +242,20 @@ # endif #endif -#if defined(ZLIB_CONST) && !defined(z_const) -# define z_const const -#else -# define z_const +#ifndef z_const +# ifdef ZLIB_CONST +# define z_const const +# else +# define z_const +# endif #endif #ifdef Z_SOLO - typedef unsigned long z_size_t; +# ifdef _WIN64 + typedef unsigned long long z_size_t; +# else + typedef unsigned long z_size_t; +# endif #else # define z_longlong long long # if defined(NO_SIZE_T) @@ -293,14 +310,6 @@ # endif #endif -#ifndef Z_ARG /* function prototypes for stdarg */ -# if defined(STDC) || defined(Z_HAVE_STDARG_H) -# define Z_ARG(args) args -# else -# define Z_ARG(args) () -# endif -#endif - /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have @@ -349,6 +358,9 @@ # ifdef FAR # undef FAR # endif +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif # include /* No need for _export, use ZLIB.DEF instead. */ /* For complete Windows compatibility, use WINAPI, not __stdcall. */ @@ -431,11 +443,11 @@ typedef uLong FAR uLongf; typedef unsigned long z_crc_t; #endif -#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +#if HAVE_UNISTD_H-0 /* may be set to #if 1 by ./configure */ # define Z_HAVE_UNISTD_H #endif -#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +#if HAVE_STDARG_H-0 /* may be set to #if 1 by ./configure */ # define Z_HAVE_STDARG_H #endif @@ -467,11 +479,14 @@ typedef uLong FAR uLongf; # undef _LARGEFILE64_SOURCE #endif -#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) -# define Z_HAVE_UNISTD_H +#ifndef Z_HAVE_UNISTD_H +# if defined(__WATCOMC__) || defined(__GO32__) || \ + (defined(_LARGEFILE64_SOURCE) && !defined(_WIN32)) +# define Z_HAVE_UNISTD_H +# endif #endif #ifndef Z_SOLO -# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# if defined(Z_HAVE_UNISTD_H) # include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ # ifdef VMS # include /* for off_t */ @@ -501,17 +516,19 @@ typedef uLong FAR uLongf; #endif #ifndef z_off_t -# define z_off_t long +# define z_off_t long long #endif #if !defined(_WIN32) && defined(Z_LARGE64) # define z_off64_t off64_t +#elif defined(__MINGW32__) +# define z_off64_t long long +#elif defined(_WIN32) && !defined(__GNUC__) +# define z_off64_t __int64 +#elif defined(__GO32__) +# define z_off64_t offset_t #else -# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) -# define z_off64_t __int64 -# else -# define z_off64_t z_off_t -# endif +# define z_off64_t z_off_t #endif /* MVS linker does not support external names larger than 8 bytes */ diff --git a/rSDK/Inc/zlib.h b/rSDK/Inc/zlib.h index f09cdaf1..a57d3361 100644 --- a/rSDK/Inc/zlib.h +++ b/rSDK/Inc/zlib.h @@ -1,7 +1,7 @@ /* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.11, January 15th, 2017 + version 1.3.2, February 17th, 2026 - Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler + Copyright (C) 1995-2026 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -24,24 +24,28 @@ The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 + Comments) 1950 to 1952 at https://datatracker.ietf.org/doc/html/rfc1950 (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). */ #ifndef ZLIB_H #define ZLIB_H -#include "zconf.h" +#ifdef ZLIB_BUILD +# include +#else +# include "zconf.h" +#endif #ifdef __cplusplus extern "C" { #endif -#define ZLIB_VERSION "1.2.11" -#define ZLIB_VERNUM 0x12b0 +#define ZLIB_VERSION "1.3.2" +#define ZLIB_VERNUM 0x1320 #define ZLIB_VER_MAJOR 1 -#define ZLIB_VER_MINOR 2 -#define ZLIB_VER_REVISION 11 +#define ZLIB_VER_MINOR 3 +#define ZLIB_VER_REVISION 2 #define ZLIB_VER_SUBREVISION 0 /* @@ -78,8 +82,8 @@ extern "C" { even in the case of corrupted input. */ -typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); -typedef void (*free_func) OF((voidpf opaque, voidpf address)); +typedef voidpf (*alloc_func)(voidpf opaque, uInt items, uInt size); +typedef void (*free_func)(voidpf opaque, voidpf address); struct internal_state; @@ -217,7 +221,7 @@ typedef gz_header FAR *gz_headerp; /* basic functions */ -ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +ZEXTERN const char * ZEXPORT zlibVersion(void); /* The application can compare zlibVersion and ZLIB_VERSION for consistency. If the first character differs, the library code actually used is not compatible with the zlib.h header file used by the application. This check @@ -225,12 +229,12 @@ ZEXTERN const char * ZEXPORT zlibVersion OF((void)); */ /* -ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); +ZEXTERN int ZEXPORT deflateInit(z_streamp strm, int level); Initializes the internal stream state for compression. The fields zalloc, zfree and opaque must be initialized before by the caller. If zalloc and zfree are set to Z_NULL, deflateInit updates them to use default - allocation functions. + allocation functions. total_in, total_out, adler, and msg are initialized. The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: 1 gives best speed, 9 gives best compression, 0 gives no compression at all @@ -247,7 +251,7 @@ ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); */ -ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +ZEXTERN int ZEXPORT deflate(z_streamp strm, int flush); /* deflate compresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce @@ -276,7 +280,7 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); == 0), or after each call of deflate(). If deflate returns Z_OK and with zero avail_out, it must be called again after making room in the output buffer because there might be more output pending. See deflatePending(), - which can be used if desired to determine whether or not there is more ouput + which can be used if desired to determine whether or not there is more output in that case. Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to @@ -320,8 +324,8 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); with the same value of the flush parameter and more output space (updated avail_out), until the flush is complete (deflate returns with non-zero avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that - avail_out is greater than six to avoid repeated flush markers due to - avail_out == 0 on return. + avail_out is greater than six when the flush marker begins, in order to avoid + repeated flush markers upon calling deflate() again when avail_out == 0. If the parameter flush is set to Z_FINISH, pending input is processed, pending output is flushed and deflate returns with Z_STREAM_END if there was @@ -360,7 +364,7 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); */ -ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +ZEXTERN int ZEXPORT deflateEnd(z_streamp strm); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending @@ -375,7 +379,7 @@ ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); /* -ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateInit(z_streamp strm); Initializes the internal stream state for decompression. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by @@ -383,7 +387,8 @@ ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); read or consumed. The allocation of a sliding window will be deferred to the first call of inflate (if the decompression does not complete on the first call). If zalloc and zfree are set to Z_NULL, inflateInit updates - them to use default allocation functions. + them to use default allocation functions. total_in, total_out, adler, and + msg are initialized. inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the @@ -397,7 +402,7 @@ ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); */ -ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +ZEXTERN int ZEXPORT inflate(z_streamp strm, int flush); /* inflate decompresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce @@ -440,7 +445,7 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); The Z_BLOCK option assists in appending to or combining deflate streams. To assist in this, on return inflate() always sets strm->data_type to the - number of unused bits in the last byte taken from strm->next_in, plus 64 if + number of unused bits in the input taken from strm->next_in, plus 64 if inflate() is currently decoding the last block in the deflate stream, plus 128 if inflate() returned immediately after decoding an end-of-block code or decoding the complete header up to just before the first byte of the deflate @@ -517,7 +522,7 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); */ -ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateEnd(z_streamp strm); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending @@ -535,16 +540,15 @@ ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); */ /* -ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, - int level, - int method, - int windowBits, - int memLevel, - int strategy)); +ZEXTERN int ZEXPORT deflateInit2(z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy); This is another version of deflateInit with more compression options. The - fields next_in, zalloc, zfree and opaque must be initialized before by the - caller. + fields zalloc, zfree and opaque must be initialized before by the caller. The method parameter is the compression method. It must be Z_DEFLATED in this version of the library. @@ -587,18 +591,21 @@ ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, The strategy parameter is used to tune the compression algorithm. Use the value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a - filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no - string match), or Z_RLE to limit match distances to one (run-length - encoding). Filtered data consists mostly of small values with a somewhat - random distribution. In this case, the compression algorithm is tuned to - compress them better. The effect of Z_FILTERED is to force more Huffman - coding and less string matching; it is somewhat intermediate between - Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as - fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The - strategy parameter only affects the compression ratio but not the - correctness of the compressed output even if it is not set appropriately. - Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler - decoder for special applications. + filter (or predictor), Z_RLE to limit match distances to one (run-length + encoding), or Z_HUFFMAN_ONLY to force Huffman encoding only (no string + matching). Filtered data consists mostly of small values with a somewhat + random distribution, as produced by the PNG filters. In this case, the + compression algorithm is tuned to compress them better. The effect of + Z_FILTERED is to force more Huffman coding and less string matching than the + default; it is intermediate between Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. + Z_RLE is almost as fast as Z_HUFFMAN_ONLY, but should give better + compression for PNG image data than Huffman only. The degree of string + matching from most to none is: Z_DEFAULT_STRATEGY, Z_FILTERED, Z_RLE, then + Z_HUFFMAN_ONLY. The strategy parameter affects the compression ratio but + never the correctness of the compressed output, even if it is not set + optimally for the given data. Z_FIXED uses the default string matching, but + prevents the use of dynamic Huffman codes, allowing for a simpler decoder + for special applications. deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid @@ -608,9 +615,9 @@ ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, compression: this will be done by deflate(). */ -ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); +ZEXTERN int ZEXPORT deflateSetDictionary(z_streamp strm, + const Bytef *dictionary, + uInt dictLength); /* Initializes the compression dictionary from the given byte sequence without producing any compressed output. When using the zlib format, this @@ -652,16 +659,16 @@ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, not perform any compression: this will be done by deflate(). */ -ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm, - Bytef *dictionary, - uInt *dictLength)); +ZEXTERN int ZEXPORT deflateGetDictionary(z_streamp strm, + Bytef *dictionary, + uInt *dictLength); /* Returns the sliding dictionary being maintained by deflate. dictLength is set to the number of bytes in the dictionary, and that many bytes are copied to dictionary. dictionary must have enough space, where 32768 bytes is always enough. If deflateGetDictionary() is called with dictionary equal to Z_NULL, then only the dictionary length is returned, and nothing is copied. - Similary, if dictLength is Z_NULL, then it is not set. + Similarly, if dictLength is Z_NULL, then it is not set. deflateGetDictionary() may return a length less than the window size, even when more than the window size in input has been provided. It may return up @@ -674,8 +681,8 @@ ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm, stream state is inconsistent. */ -ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, - z_streamp source)); +ZEXTERN int ZEXPORT deflateCopy(z_streamp dest, + z_streamp source); /* Sets the destination stream as a complete copy of the source stream. @@ -692,31 +699,32 @@ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, destination. */ -ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +ZEXTERN int ZEXPORT deflateReset(z_streamp strm); /* This function is equivalent to deflateEnd followed by deflateInit, but does not free and reallocate the internal compression state. The stream will leave the compression level and any other attributes that may have been - set unchanged. + set unchanged. total_in, total_out, adler, and msg are initialized. deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being Z_NULL). */ -ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, - int level, - int strategy)); +ZEXTERN int ZEXPORT deflateParams(z_streamp strm, + int level, + int strategy); /* Dynamically update the compression level and compression strategy. The interpretation of level and strategy is as in deflateInit2(). This can be used to switch between compression and straight copy of the input data, or to switch to a different kind of input data requiring a different strategy. If the compression approach (which is a function of the level) or the - strategy is changed, and if any input has been consumed in a previous - deflate() call, then the input available so far is compressed with the old - level and strategy using deflate(strm, Z_BLOCK). There are three approaches - for the compression levels 0, 1..3, and 4..9 respectively. The new level - and strategy will take effect at the next call of deflate(). + strategy is changed, and if there have been any deflate() calls since the + state was initialized or reset, then the input available so far is + compressed with the old level and strategy using deflate(strm, Z_BLOCK). + There are three approaches for the compression levels 0, 1..3, and 4..9 + respectively. The new level and strategy will take effect at the next call + of deflate(). If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does not have enough output space to complete, then the parameter change will not @@ -729,7 +737,7 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, Then no more input data should be provided before the deflateParams() call. If this is done, the old level and strategy will be applied to the data compressed before deflateParams(), and the new level and strategy will be - applied to the the data compressed after deflateParams(). + applied to the data compressed after deflateParams(). deflateParams returns Z_OK on success, Z_STREAM_ERROR if the source stream state was inconsistent or if a parameter was invalid, or Z_BUF_ERROR if @@ -740,11 +748,11 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, retried with more output space. */ -ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, - int good_length, - int max_lazy, - int nice_length, - int max_chain)); +ZEXTERN int ZEXPORT deflateTune(z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain); /* Fine tune deflate's internal compression parameters. This should only be used by someone who understands the algorithm used by zlib's deflate for @@ -757,8 +765,8 @@ ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. */ -ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, - uLong sourceLen)); +ZEXTERN uLong ZEXPORT deflateBound(z_streamp strm, uLong sourceLen); +ZEXTERN z_size_t ZEXPORT deflateBound_z(z_streamp strm, z_size_t sourceLen); /* deflateBound() returns an upper bound on the compressed size after deflation of sourceLen bytes. It must be called after deflateInit() or @@ -770,11 +778,14 @@ ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, to return Z_STREAM_END. Note that it is possible for the compressed size to be larger than the value returned by deflateBound() if flush options other than Z_FINISH or Z_NO_FLUSH are used. + + delfateBound_z() is the same, but takes and returns a size_t length. Note + that a long is 32 bits on Windows. */ -ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, - unsigned *pending, - int *bits)); +ZEXTERN int ZEXPORT deflatePending(z_streamp strm, + unsigned *pending, + int *bits); /* deflatePending() returns the number of bytes and bits of output that have been generated, but not yet provided in the available output. The bytes not @@ -784,12 +795,27 @@ ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, or bits are Z_NULL, then those values are not set. deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. If an int is 16 bits and memLevel is 9, then + it is possible for the number of pending bytes to not fit in an unsigned. In + that case Z_BUF_ERROR is returned and *pending is set to the maximum value + of an unsigned. + */ + +ZEXTERN int ZEXPORT deflateUsed(z_streamp strm, + int *bits); +/* + deflateUsed() returns in *bits the most recent number of deflate bits used + in the last byte when flushing to a byte boundary. The result is in 1..8, or + 0 if there has not yet been a flush. This helps determine the location of + the last bit of a deflate stream. + + deflateUsed returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ -ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, - int bits, - int value)); +ZEXTERN int ZEXPORT deflatePrime(z_streamp strm, + int bits, + int value); /* deflatePrime() inserts bits in the deflate output stream. The intent is that this function is used to start off the deflate output with the bits @@ -804,8 +830,8 @@ ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, source stream state was inconsistent. */ -ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, - gz_headerp head)); +ZEXTERN int ZEXPORT deflateSetHeader(z_streamp strm, + gz_headerp head); /* deflateSetHeader() provides gzip header information for when a gzip stream is requested by deflateInit2(). deflateSetHeader() may be called @@ -821,16 +847,17 @@ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, gzip file" and give up. If deflateSetHeader is not used, the default gzip header has text false, - the time set to zero, and os set to 255, with no extra, name, or comment - fields. The gzip header is returned to the default state by deflateReset(). + the time set to zero, and os set to the current operating system, with no + extra, name, or comment fields. The gzip header is returned to the default + state by deflateReset(). deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ /* -ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, - int windowBits)); +ZEXTERN int ZEXPORT inflateInit2(z_streamp strm, + int windowBits); This is another version of inflateInit with an extra parameter. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized @@ -865,9 +892,11 @@ ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, detection, or add 16 to decode only the gzip format (the zlib format will return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a CRC-32 instead of an Adler-32. Unlike the gunzip utility and gzread() (see - below), inflate() will not automatically decode concatenated gzip streams. - inflate() will return Z_STREAM_END at the end of the gzip stream. The state - would need to be reset to continue decoding a subsequent gzip stream. + below), inflate() will *not* automatically decode concatenated gzip members. + inflate() will return Z_STREAM_END at the end of the gzip member. The state + would need to be reset to continue decoding a subsequent gzip member. This + *must* be done if there is more data after a gzip member, in order for the + decompression to be compliant with the gzip standard (RFC 1952). inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the @@ -881,9 +910,9 @@ ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, deferred until inflate() is called. */ -ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); +ZEXTERN int ZEXPORT inflateSetDictionary(z_streamp strm, + const Bytef *dictionary, + uInt dictLength); /* Initializes the decompression dictionary from the given uncompressed byte sequence. This function must be called immediately after a call of inflate, @@ -904,22 +933,22 @@ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, inflate(). */ -ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, - Bytef *dictionary, - uInt *dictLength)); +ZEXTERN int ZEXPORT inflateGetDictionary(z_streamp strm, + Bytef *dictionary, + uInt *dictLength); /* Returns the sliding dictionary being maintained by inflate. dictLength is set to the number of bytes in the dictionary, and that many bytes are copied to dictionary. dictionary must have enough space, where 32768 bytes is always enough. If inflateGetDictionary() is called with dictionary equal to Z_NULL, then only the dictionary length is returned, and nothing is copied. - Similary, if dictLength is Z_NULL, then it is not set. + Similarly, if dictLength is Z_NULL, then it is not set. inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the stream state is inconsistent. */ -ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateSync(z_streamp strm); /* Skips invalid compressed data until a possible full flush point (see above for the description of deflate with Z_FULL_FLUSH) can be found, or until all @@ -932,14 +961,14 @@ ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); inflateSync returns Z_OK if a possible full flush point has been found, Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. - In the success case, the application may save the current current value of - total_in which indicates where valid compressed data was found. In the - error case, the application may repeatedly call inflateSync, providing more - input each time, until success or end of the input data. + In the success case, the application may save the current value of total_in + which indicates where valid compressed data was found. In the error case, + the application may repeatedly call inflateSync, providing more input each + time, until success or end of the input data. */ -ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, - z_streamp source)); +ZEXTERN int ZEXPORT inflateCopy(z_streamp dest, + z_streamp source); /* Sets the destination stream as a complete copy of the source stream. @@ -954,18 +983,19 @@ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, destination. */ -ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateReset(z_streamp strm); /* This function is equivalent to inflateEnd followed by inflateInit, but does not free and reallocate the internal decompression state. The stream will keep attributes that may have been set by inflateInit2. + total_in, total_out, adler, and msg are initialized. inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being Z_NULL). */ -ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, - int windowBits)); +ZEXTERN int ZEXPORT inflateReset2(z_streamp strm, + int windowBits); /* This function is the same as inflateReset, but it also permits changing the wrap and window size requests. The windowBits parameter is interpreted @@ -978,17 +1008,19 @@ ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, the windowBits parameter is invalid. */ -ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, - int bits, - int value)); +ZEXTERN int ZEXPORT inflatePrime(z_streamp strm, + int bits, + int value); /* - This function inserts bits in the inflate input stream. The intent is - that this function is used to start inflating at a bit position in the - middle of a byte. The provided bits will be used before any bytes are used - from next_in. This function should only be used with raw inflate, and - should be used before the first inflate() call after inflateInit2() or - inflateReset(). bits must be less than or equal to 16, and that many of the - least significant bits of value will be inserted in the input. + This function inserts bits in the inflate input stream. The intent is to + use inflatePrime() to start inflating at a bit position in the middle of a + byte. The provided bits will be used before any bytes are used from + next_in. This function should be used with raw inflate, before the first + inflate() call, after inflateInit2() or inflateReset(). It can also be used + after an inflate() return indicates the end of a deflate block or header + when using Z_BLOCK. bits must be less than or equal to 16, and that many of + the least significant bits of value will be inserted in the input. The + other bits in value can be non-zero, and will be ignored. If bits is negative, then the input stream bit buffer is emptied. Then inflatePrime() can be called again to put bits in the buffer. This is used @@ -996,10 +1028,18 @@ ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, to feeding inflate codes. inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. + stream state was inconsistent, or if bits is out of range. If inflate was + in the middle of processing a header, trailer, or stored block lengths, then + it is possible for there to be only eight bits available in the bit buffer. + In that case, bits > 8 is considered out of range. However, when used as + outlined above, there will always be 16 bits available in the buffer for + insertion. As noted in its documentation above, inflate records the number + of bits in the bit buffer on return in data_type. 32 minus that is the + number of bits available for insertion. inflatePrime does not update + data_type with the new number of bits in buffer. */ -ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); +ZEXTERN long ZEXPORT inflateMark(z_streamp strm); /* This function returns two values, one in the lower 16 bits of the return value, and the other in the remaining upper bits, obtained by shifting the @@ -1027,8 +1067,8 @@ ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); source stream state was inconsistent. */ -ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, - gz_headerp head)); +ZEXTERN int ZEXPORT inflateGetHeader(z_streamp strm, + gz_headerp head); /* inflateGetHeader() requests that gzip header information be stored in the provided gz_header structure. inflateGetHeader() may be called after @@ -1042,20 +1082,22 @@ ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, The text, time, xflags, and os fields are filled in with the gzip header contents. hcrc is set to true if there is a header CRC. (The header CRC - was valid if done is set to one.) If extra is not Z_NULL, then extra_max - contains the maximum number of bytes to write to extra. Once done is true, - extra_len contains the actual extra field length, and extra contains the - extra field, or that field truncated if extra_max is less than extra_len. - If name is not Z_NULL, then up to name_max characters are written there, - terminated with a zero unless the length is greater than name_max. If - comment is not Z_NULL, then up to comm_max characters are written there, - terminated with a zero unless the length is greater than comm_max. When any - of extra, name, or comment are not Z_NULL and the respective field is not - present in the header, then that field is set to Z_NULL to signal its - absence. This allows the use of deflateSetHeader() with the returned - structure to duplicate the header. However if those fields are set to - allocated memory, then the application will need to save those pointers - elsewhere so that they can be eventually freed. + was valid if done is set to one.) The extra, name, and comment pointers + much each be either Z_NULL or point to space to store that information from + the header. If extra is not Z_NULL, then extra_max contains the maximum + number of bytes that can be written to extra. Once done is true, extra_len + contains the actual extra field length, and extra contains the extra field, + or that field truncated if extra_max is less than extra_len. If name is not + Z_NULL, then up to name_max characters, including the terminating zero, are + written there. If comment is not Z_NULL, then up to comm_max characters, + including the terminating zero, are written there. The application can tell + that the name or comment did not fit in the provided space by the absence of + a terminating zero. If any of extra, name, or comment are not present in + the header, then that field's pointer is set to Z_NULL. This allows the use + of deflateSetHeader() with the returned structure to duplicate the header. + Note that if those fields initially pointed to allocated memory, then the + application will need to save them elsewhere so that they can be eventually + freed. If inflateGetHeader is not used, then the header information is simply discarded. The header is always checked for validity, including the header @@ -1068,8 +1110,8 @@ ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, */ /* -ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, - unsigned char FAR *window)); +ZEXTERN int ZEXPORT inflateBackInit(z_streamp strm, int windowBits, + unsigned char FAR *window); Initialize the internal stream state for decompression using inflateBack() calls. The fields zalloc, zfree and opaque in strm must be initialized @@ -1089,13 +1131,13 @@ ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, the version of the header file. */ -typedef unsigned (*in_func) OF((void FAR *, - z_const unsigned char FAR * FAR *)); -typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); +typedef unsigned (*in_func)(void FAR *, + z_const unsigned char FAR * FAR *); +typedef int (*out_func)(void FAR *, unsigned char FAR *, unsigned); -ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, - in_func in, void FAR *in_desc, - out_func out, void FAR *out_desc)); +ZEXTERN int ZEXPORT inflateBack(z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc); /* inflateBack() does a raw inflate with a single call using a call-back interface for input and output. This is potentially more efficient than @@ -1163,7 +1205,7 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, cannot return Z_OK. */ -ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateBackEnd(z_streamp strm); /* All memory allocated by inflateBackInit() is freed. @@ -1171,7 +1213,7 @@ ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); state was inconsistent. */ -ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +ZEXTERN uLong ZEXPORT zlibCompileFlags(void); /* Return flags indicating compile-time options. Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: @@ -1203,13 +1245,14 @@ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); 21: FASTEST -- deflate algorithm with only one, lowest compression level 22,23: 0 (reserved) - The sprintf variant used by gzprintf (zero is best): + The sprintf variant used by gzprintf (all zeros is best): 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format - 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() is not secure! 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + 27: 0 = gzprintf() present, 1 = not -- 1 means gzprintf() returns an error Remainder: - 27-31: 0 (reserved) + 28-31: 0 (reserved) */ #ifndef Z_SOLO @@ -1221,11 +1264,14 @@ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); stream-oriented functions. To simplify the interface, some default options are assumed (compression level and memory usage, standard memory allocation functions). The source code of these utility functions can be modified if - you need special options. + you need special options. The _z versions of the functions use the size_t + type for lengths. Note that a long is 32 bits on Windows. */ -ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); +ZEXTERN int ZEXPORT compress(Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen); +ZEXTERN int ZEXPORT compress_z(Bytef *dest, z_size_t *destLen, + const Bytef *source, z_size_t sourceLen); /* Compresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size @@ -1239,9 +1285,12 @@ ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, buffer. */ -ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen, - int level)); +ZEXTERN int ZEXPORT compress2(Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level); +ZEXTERN int ZEXPORT compress2_z(Bytef *dest, z_size_t *destLen, + const Bytef *source, z_size_t sourceLen, + int level); /* Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte @@ -1255,22 +1304,25 @@ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, Z_STREAM_ERROR if the level parameter is invalid. */ -ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +ZEXTERN uLong ZEXPORT compressBound(uLong sourceLen); +ZEXTERN z_size_t ZEXPORT compressBound_z(z_size_t sourceLen); /* compressBound() returns an upper bound on the compressed size after compress() or compress2() on sourceLen bytes. It would be used before a compress() or compress2() call to allocate the destination buffer. */ -ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); +ZEXTERN int ZEXPORT uncompress(Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen); +ZEXTERN int ZEXPORT uncompress_z(Bytef *dest, z_size_t *destLen, + const Bytef *source, z_size_t sourceLen); /* Decompresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total size + the byte length of the source buffer. On entry, *destLen is the total size of the destination buffer, which must be large enough to hold the entire uncompressed data. (The size of the uncompressed data must have been saved previously by the compressor and transmitted to the decompressor by some - mechanism outside the scope of this compression library.) Upon exit, destLen + mechanism outside the scope of this compression library.) On exit, *destLen is the actual size of the uncompressed data. uncompress returns Z_OK if success, Z_MEM_ERROR if there was not @@ -1280,8 +1332,10 @@ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, buffer with the uncompressed data up to that point. */ -ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong *sourceLen)); +ZEXTERN int ZEXPORT uncompress2(Bytef *dest, uLongf *destLen, + const Bytef *source, uLong *sourceLen); +ZEXTERN int ZEXPORT uncompress2_z(Bytef *dest, z_size_t *destLen, + const Bytef *source, z_size_t *sourceLen); /* Same as uncompress, except that sourceLen is a pointer, where the length of the source is *sourceLen. On return, *sourceLen is the number of @@ -1300,22 +1354,26 @@ ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen, typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ /* -ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); +ZEXTERN gzFile ZEXPORT gzopen(const char *path, const char *mode); - Opens a gzip (.gz) file for reading or writing. The mode parameter is as - in fopen ("rb" or "wb") but can also include a compression level ("wb9") or - a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only - compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' - for fixed code compression as in "wb9F". (See the description of - deflateInit2 for more information about the strategy parameter.) 'T' will - request transparent writing or appending with no compression and not using - the gzip format. + Open the gzip (.gz) file at path for reading and decompressing, or + compressing and writing. The mode parameter is as in fopen ("rb" or "wb") + but can also include a compression level ("wb9") or a strategy: 'f' for + filtered data as in "wb6f", 'h' for Huffman-only compression as in "wb1h", + 'R' for run-length encoding as in "wb1R", or 'F' for fixed code compression + as in "wb9F". (See the description of deflateInit2 for more information + about the strategy parameter.) 'T' will request transparent writing or + appending with no compression and not using the gzip format. 'T' cannot be + used to force transparent reading. Transparent reading is automatically + performed if there is no gzip header at the start. Transparent reading can + be disabled with the 'G' option, which will instead return an error if there + is no gzip header. 'N' will open the file in non-blocking mode. - "a" can be used instead of "w" to request that the gzip stream that will - be written be appended to the file. "+" will result in an error, since + 'a' can be used instead of 'w' to request that the gzip stream that will + be written be appended to the file. '+' will result in an error, since reading and writing to the same gzip file is not supported. The addition of - "x" when writing will create the file exclusively, which fails if the file - already exists. On systems that support it, the addition of "e" when + 'x' when writing will create the file exclusively, which fails if the file + already exists. On systems that support it, the addition of 'e' when reading or writing will set the flag to close the file on an execve() call. These functions, as well as gzip, will read and decode a sequence of gzip @@ -1334,14 +1392,22 @@ ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); insufficient memory to allocate the gzFile state, or if an invalid mode was specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). errno can be checked to determine if the reason gzopen failed was that the - file could not be opened. + file could not be opened. Note that if 'N' is in mode for non-blocking, the + open() itself can fail in order to not block. In that case gzopen() will + return NULL and errno will be EAGAIN or ENONBLOCK. The call to gzopen() can + then be re-tried. If the application would like to block on opening the + file, then it can use open() without O_NONBLOCK, and then gzdopen() with the + resulting file descriptor and 'N' in the mode, which will set it to non- + blocking. */ -ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +ZEXTERN gzFile ZEXPORT gzdopen(int fd, const char *mode); /* - gzdopen associates a gzFile with the file descriptor fd. File descriptors - are obtained from calls like open, dup, creat, pipe or fileno (if the file - has been previously opened with fopen). The mode parameter is as in gzopen. + Associate a gzFile with the file descriptor fd. File descriptors are + obtained from calls like open, dup, creat, pipe or fileno (if the file has + been previously opened with fopen). The mode parameter is as in gzopen. An + 'e' in mode will set fd's flag to close the file on an execve() call. An 'N' + in mode will set fd's non-blocking flag. The next call of gzclose on the returned gzFile will also close the file descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor @@ -1360,15 +1426,15 @@ ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); will not detect if fd is invalid (unless fd is -1). */ -ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); +ZEXTERN int ZEXPORT gzbuffer(gzFile file, unsigned size); /* - Set the internal buffer size used by this library's functions. The - default buffer size is 8192 bytes. This function must be called after - gzopen() or gzdopen(), and before any other calls that read or write the - file. The buffer memory allocation is always deferred to the first read or - write. Three times that size in buffer space is allocated. A larger buffer - size of, for example, 64K or 128K bytes will noticeably increase the speed - of decompression (reading). + Set the internal buffer size used by this library's functions for file to + size. The default buffer size is 8192 bytes. This function must be called + after gzopen() or gzdopen(), and before any other calls that read or write + the file. The buffer memory allocation is always deferred to the first read + or write. Three times that size in buffer space is allocated. A larger + buffer size of, for example, 64K or 128K bytes will noticeably increase the + speed of decompression (reading). The new buffer size also affects the maximum length for gzprintf(). @@ -1376,20 +1442,20 @@ ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); too late. */ -ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +ZEXTERN int ZEXPORT gzsetparams(gzFile file, int level, int strategy); /* - Dynamically update the compression level or strategy. See the description - of deflateInit2 for the meaning of these parameters. Previously provided - data is flushed before the parameter change. + Dynamically update the compression level and strategy for file. See the + description of deflateInit2 for the meaning of these parameters. Previously + provided data is flushed before applying the parameter changes. gzsetparams returns Z_OK if success, Z_STREAM_ERROR if the file was not opened for writing, Z_ERRNO if there is an error writing the flushed data, or Z_MEM_ERROR if there is a memory allocation error. */ -ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +ZEXTERN int ZEXPORT gzread(gzFile file, voidp buf, unsigned len); /* - Reads the given number of uncompressed bytes from the compressed file. If + Read and decompress up to len uncompressed bytes from file into buf. If the input file is not in gzip format, gzread copies the given number of bytes into the buffer directly from the file. @@ -1411,20 +1477,26 @@ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); stream. Alternatively, gzerror can be used before gzclose to detect this case. + gzread can be used to read a gzip file on a non-blocking device. If the + input stalls and there is no uncompressed data to return, then gzread() will + return -1, and errno will be EAGAIN or EWOULDBLOCK. gzread() can then be + called again. + gzread returns the number of uncompressed bytes actually read, less than len for end of file, or -1 for error. If len is too large to fit in an int, then nothing is read, -1 is returned, and the error state is set to - Z_STREAM_ERROR. + Z_STREAM_ERROR. If some data was read before an error, then that data is + returned until exhausted, after which the next call will signal the error. */ -ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, - gzFile file)); +ZEXTERN z_size_t ZEXPORT gzfread(voidp buf, z_size_t size, z_size_t nitems, + gzFile file); /* - Read up to nitems items of size size from file to buf, otherwise operating - as gzread() does. This duplicates the interface of stdio's fread(), with - size_t request and return types. If the library defines size_t, then - z_size_t is identical to size_t. If not, then z_size_t is an unsigned - integer type that can contain a pointer. + Read and decompress up to nitems items of size size from file into buf, + otherwise operating as gzread() does. This duplicates the interface of + stdio's fread(), with size_t request and return types. If the library + defines size_t, then z_size_t is identical to size_t. If not, then z_size_t + is an unsigned integer type that can contain a pointer. gzfread() returns the number of full items read of size size, or zero if the end of the file was reached and a full item could not be read, or if @@ -1435,26 +1507,29 @@ ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, In the event that the end of file is reached and only a partial item is available at the end, i.e. the remaining uncompressed data length is not a - multiple of size, then the final partial item is nevetheless read into buf + multiple of size, then the final partial item is nevertheless read into buf and the end-of-file flag is set. The length of the partial item read is not provided, but could be inferred from the result of gztell(). This behavior - is the same as the behavior of fread() implementations in common libraries, - but it prevents the direct use of gzfread() to read a concurrently written - file, reseting and retrying on end-of-file, when size is not 1. + is the same as that of fread() implementations in common libraries. This + could result in data loss if used with size != 1 when reading a concurrently + written file or a non-blocking file. In that case, use size == 1 or gzread() + instead. */ -ZEXTERN int ZEXPORT gzwrite OF((gzFile file, - voidpc buf, unsigned len)); +ZEXTERN int ZEXPORT gzwrite(gzFile file, voidpc buf, unsigned len); /* - Writes the given number of uncompressed bytes into the compressed file. - gzwrite returns the number of uncompressed bytes written or 0 in case of - error. + Compress and write the len uncompressed bytes at buf to file. gzwrite + returns the number of uncompressed bytes written, or 0 in case of error or + if len is 0. If the write destination is non-blocking, then gzwrite() may + return a number of bytes written that is not 0 and less than len. + + If len does not fit in an int, then 0 is returned and nothing is written. */ -ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, - z_size_t nitems, gzFile file)); +ZEXTERN z_size_t ZEXPORT gzfwrite(voidpc buf, z_size_t size, + z_size_t nitems, gzFile file); /* - gzfwrite() writes nitems items of size size from buf to file, duplicating + Compress and write nitems items of size size from buf to file, duplicating the interface of stdio's fwrite(), with size_t request and return types. If the library defines size_t, then z_size_t is identical to size_t. If not, then z_size_t is an unsigned integer type that can contain a pointer. @@ -1463,76 +1538,117 @@ ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, if there was an error. If the multiplication of size and nitems overflows, i.e. the product does not fit in a z_size_t, then nothing is written, zero is returned, and the error state is set to Z_STREAM_ERROR. + + If writing a concurrently read file or a non-blocking file with size != 1, + a partial item could be written, with no way of knowing how much of it was + not written, resulting in data loss. In that case, use size == 1 or + gzwrite() instead. */ -ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +ZEXTERN int ZEXPORTVA gzprintf(gzFile file, const char *format, ...); +#else +ZEXTERN int ZEXPORTVA gzprintf(); +#endif /* - Converts, formats, and writes the arguments to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of + Convert, format, compress, and write the arguments (...) to file under + control of the string format, as in fprintf. gzprintf returns the number of uncompressed bytes actually written, or a negative zlib error code in case of error. The number of uncompressed bytes written is limited to 8191, or one less than the buffer size given to gzbuffer(). The caller should assure that this limit is not exceeded. If it is exceeded, then gzprintf() will - return an error (0) with nothing written. In this case, there may also be a - buffer overflow with unpredictable consequences, which is possible only if - zlib was compiled with the insecure functions sprintf() or vsprintf() - because the secure snprintf() or vsnprintf() functions were not available. - This can be determined using zlibCompileFlags(). + return an error (0) with nothing written. + + In that last case, there may also be a buffer overflow with unpredictable + consequences, which is possible only if zlib was compiled with the insecure + functions sprintf() or vsprintf(), because the secure snprintf() and + vsnprintf() functions were not available. That would only be the case for + a non-ANSI C compiler. zlib may have been built without gzprintf() because + secure functions were not available and having gzprintf() be insecure was + not an option, in which case, gzprintf() returns Z_STREAM_ERROR. All of + these possibilities can be determined using zlibCompileFlags(). + + If a Z_BUF_ERROR is returned, then nothing was written due to a stall on + the non-blocking write destination. */ -ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +ZEXTERN int ZEXPORT gzputs(gzFile file, const char *s); /* - Writes the given null-terminated string to the compressed file, excluding + Compress and write the given null-terminated string s to file, excluding the terminating null character. gzputs returns the number of characters written, or -1 in case of error. + The number of characters written may be less than the length of the string + if the write destination is non-blocking. + + If the length of the string does not fit in an int, then -1 is returned + and nothing is written. */ -ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +ZEXTERN char * ZEXPORT gzgets(gzFile file, char *buf, int len); /* - Reads bytes from the compressed file until len-1 characters are read, or a - newline character is read and transferred to buf, or an end-of-file - condition is encountered. If any characters are read or if len == 1, the - string is terminated with a null character. If no characters are read due - to an end-of-file or len < 1, then the buffer is left untouched. + Read and decompress bytes from file into buf, until len-1 characters are + read, or until a newline character is read and transferred to buf, or an + end-of-file condition is encountered. If any characters are read or if len + is one, the string is terminated with a null character. If no characters + are read due to an end-of-file or len is less than one, then the buffer is + left untouched. gzgets returns buf which is a null-terminated string, or it returns NULL - for end-of-file or in case of error. If there was an error, the contents at - buf are indeterminate. + for end-of-file or in case of error. If some data was read before an error, + then that data is returned until exhausted, after which the next call will + return NULL to signal the error. + + gzgets can be used on a file being concurrently written, and on a non- + blocking device, both as for gzread(). However lines may be broken in the + middle, leaving it up to the application to reassemble them as needed. */ -ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +ZEXTERN int ZEXPORT gzputc(gzFile file, int c); /* - Writes c, converted to an unsigned char, into the compressed file. gzputc + Compress and write c, converted to an unsigned char, into file. gzputc returns the value that was written, or -1 in case of error. */ -ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +ZEXTERN int ZEXPORT gzgetc(gzFile file); /* - Reads one byte from the compressed file. gzgetc returns this byte or -1 - in case of end of file or error. This is implemented as a macro for speed. - As such, it does not do all of the checking the other functions do. I.e. - it does not check to see if file is NULL, nor whether the structure file - points to has been clobbered or not. + Read and decompress one byte from file. gzgetc returns this byte or -1 in + case of end of file or error. If some data was read before an error, then + that data is returned until exhausted, after which the next call will return + -1 to signal the error. + + This is implemented as a macro for speed. As such, it does not do all of + the checking the other functions do. I.e. it does not check to see if file + is NULL, nor whether the structure file points to has been clobbered or not. + + gzgetc can be used to read a gzip file on a non-blocking device. If the + input stalls and there is no uncompressed data to return, then gzgetc() will + return -1, and errno will be EAGAIN or EWOULDBLOCK. gzread() can then be + called again. */ -ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +ZEXTERN int ZEXPORT gzungetc(int c, gzFile file); /* - Push one character back onto the stream to be read as the first character - on the next read. At least one character of push-back is allowed. + Push c back onto the stream for file to be read as the first character on + the next read. At least one character of push-back is always allowed. gzungetc() returns the character pushed, or -1 on failure. gzungetc() will fail if c is -1, and may fail if a character has been pushed but not read yet. If gzungetc is used immediately after gzopen or gzdopen, at least the output buffer size of pushed characters is allowed. (See gzbuffer above.) The pushed character will be discarded if the stream is repositioned with gzseek() or gzrewind(). + + gzungetc(-1, file) will force any pending seek to execute. Then gztell() + will report the position, even if the requested seek reached end of file. + This can be used to determine the number of uncompressed bytes in a gzip + file without having to read it into a buffer. */ -ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +ZEXTERN int ZEXPORT gzflush(gzFile file, int flush); /* - Flushes all pending output into the compressed file. The parameter flush - is as in the deflate() function. The return value is the zlib error number - (see function gzerror below). gzflush is only permitted when writing. + Flush all pending output to file. The parameter flush is as in the + deflate() function. The return value is the zlib error number (see function + gzerror below). gzflush is only permitted when writing. If the flush parameter is Z_FINISH, the remaining data is written and the gzip stream is completed in the output. If gzwrite() is called again, a new @@ -1544,18 +1660,19 @@ ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); */ /* -ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, - z_off_t offset, int whence)); +ZEXTERN z_off_t ZEXPORT gzseek(gzFile file, + z_off_t offset, int whence); - Sets the starting position for the next gzread or gzwrite on the given - compressed file. The offset represents a number of bytes in the + Set the starting position to offset relative to whence for the next gzread + or gzwrite on file. The offset represents a number of bytes in the uncompressed data stream. The whence parameter is defined as in lseek(2); the value SEEK_END is not supported. If the file is opened for reading, this function is emulated but can be extremely slow. If the file is opened for writing, only forward seeks are supported; gzseek then compresses a sequence of zeroes up to the new - starting position. + starting position. For reading or writing, any actual seeking is deferred + until the next read or write operation, or close operation when writing. gzseek returns the resulting offset location as measured in bytes from the beginning of the uncompressed stream, or -1 in case of error, in @@ -1563,52 +1680,52 @@ ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, would be before the current position. */ -ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +ZEXTERN int ZEXPORT gzrewind(gzFile file); /* - Rewinds the given file. This function is supported only for reading. + Rewind file. This function is supported only for reading. - gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET). */ /* -ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); +ZEXTERN z_off_t ZEXPORT gztell(gzFile file); - Returns the starting position for the next gzread or gzwrite on the given - compressed file. This position represents a number of bytes in the - uncompressed data stream, and is zero when starting, even if appending or - reading a gzip stream from the middle of a file using gzdopen(). + Return the starting position for the next gzread or gzwrite on file. + This position represents a number of bytes in the uncompressed data stream, + and is zero when starting, even if appending or reading a gzip stream from + the middle of a file using gzdopen(). gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) */ /* -ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); +ZEXTERN z_off_t ZEXPORT gzoffset(gzFile file); - Returns the current offset in the file being read or written. This offset - includes the count of bytes that precede the gzip stream, for example when - appending or when using gzdopen() for reading. When reading, the offset - does not include as yet unused buffered input. This information can be used - for a progress indicator. On error, gzoffset() returns -1. + Return the current compressed (actual) read or write offset of file. This + offset includes the count of bytes that precede the gzip stream, for example + when appending or when using gzdopen() for reading. When reading, the + offset does not include as yet unused buffered input. This information can + be used for a progress indicator. On error, gzoffset() returns -1. */ -ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +ZEXTERN int ZEXPORT gzeof(gzFile file); /* - Returns true (1) if the end-of-file indicator has been set while reading, - false (0) otherwise. Note that the end-of-file indicator is set only if the - read tried to go past the end of the input, but came up short. Therefore, - just like feof(), gzeof() may return false even if there is no more data to - read, in the event that the last read request was for the exact number of - bytes remaining in the input file. This will happen if the input file size - is an exact multiple of the buffer size. + Return true (1) if the end-of-file indicator for file has been set while + reading, false (0) otherwise. Note that the end-of-file indicator is set + only if the read tried to go past the end of the input, but came up short. + Therefore, just like feof(), gzeof() may return false even if there is no + more data to read, in the event that the last read request was for the exact + number of bytes remaining in the input file. This will happen if the input + file size is an exact multiple of the buffer size. If gzeof() returns true, then the read functions will return no more data, unless the end-of-file indicator is reset by gzclearerr() and the input file has grown since the previous end of file was detected. */ -ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +ZEXTERN int ZEXPORT gzdirect(gzFile file); /* - Returns true (1) if file is being copied directly while reading, or false + Return true (1) if file is being copied directly while reading, or false (0) if file is a gzip stream being decompressed. If the input file is empty, gzdirect() will return true, since the input @@ -1616,8 +1733,11 @@ ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); If gzdirect() is used immediately after gzopen() or gzdopen() it will cause buffers to be allocated to allow reading the file to determine if it - is a gzip file. Therefore if gzbuffer() is used, it should be called before - gzdirect(). + is a gzip file. Therefore if gzbuffer() is used, it should be called before + gzdirect(). If the input is being written concurrently or the device is non- + blocking, then gzdirect() may give a different answer once four bytes of + input have been accumulated, which is what is needed to confirm or deny a + gzip header. Before this, gzdirect() will return true (1). When writing, gzdirect() returns true (1) if transparent writing was requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note: @@ -1627,10 +1747,10 @@ ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); gzip file reading and decompression, which may not be desired.) */ -ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose(gzFile file); /* - Flushes all pending output if necessary, closes the compressed file and - deallocates the (de)compression state. Note that once file is closed, you + Flush all pending output for file, if necessary, close file and + deallocate the (de)compression state. Note that once file is closed, you cannot call gzerror with file, since its structures have been deallocated. gzclose must not be called more than once on the same file, just as free must not be called more than once on the same allocation. @@ -1640,8 +1760,8 @@ ZEXTERN int ZEXPORT gzclose OF((gzFile file)); last read ended in the middle of a gzip stream, or Z_OK on success. */ -ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); -ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_r(gzFile file); +ZEXTERN int ZEXPORT gzclose_w(gzFile file); /* Same as gzclose(), but gzclose_r() is only for use when reading, and gzclose_w() is only for use when writing or appending. The advantage to @@ -1652,12 +1772,13 @@ ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); zlib library. */ -ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +ZEXTERN const char * ZEXPORT gzerror(gzFile file, int *errnum); /* - Returns the error message for the last error which occurred on the given - compressed file. errnum is set to zlib error number. If an error occurred - in the file system and not in the compression library, errnum is set to - Z_ERRNO and the application may consult errno to get the exact error code. + Return the error message for the last error which occurred on file. + If errnum is not NULL, *errnum is set to zlib error number. If an error + occurred in the file system and not in the compression library, *errnum is + set to Z_ERRNO and the application may consult errno to get the exact error + code. The application must not modify the returned string. Future calls to this function may invalidate the previously returned string. If file is @@ -1668,9 +1789,9 @@ ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); functions above that do not distinguish those cases in their return values. */ -ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +ZEXTERN void ZEXPORT gzclearerr(gzFile file); /* - Clears the error and end-of-file flags for file. This is analogous to the + Clear the error and end-of-file flags for file. This is analogous to the clearerr() function in stdio. This is useful for continuing to read a gzip file that is being written concurrently. */ @@ -1685,11 +1806,12 @@ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); library. */ -ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +ZEXTERN uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len); /* Update a running Adler-32 checksum with the bytes buf[0..len-1] and - return the updated checksum. If buf is Z_NULL, this function returns the - required initial value for the checksum. + return the updated checksum. An Adler-32 value is in the range of a 32-bit + unsigned integer. If buf is Z_NULL, this function returns the required + initial value for the checksum. An Adler-32 checksum is almost as reliable as a CRC-32 but can be computed much faster. @@ -1704,15 +1826,16 @@ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); if (adler != original_adler) error(); */ -ZEXTERN uLong ZEXPORT adler32_z OF((uLong adler, const Bytef *buf, - z_size_t len)); +ZEXTERN uLong ZEXPORT adler32_z(uLong adler, const Bytef *buf, + z_size_t len); /* - Same as adler32(), but with a size_t length. + Same as adler32(), but with a size_t length. Note that a long is 32 bits + on Windows. */ /* -ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, - z_off_t len2)); +ZEXTERN uLong ZEXPORT adler32_combine(uLong adler1, uLong adler2, + z_off_t len2); Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for @@ -1722,12 +1845,13 @@ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, negative, the result has no meaning or utility. */ -ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +ZEXTERN uLong ZEXPORT crc32(uLong crc, const Bytef *buf, uInt len); /* Update a running CRC-32 with the bytes buf[0..len-1] and return the - updated CRC-32. If buf is Z_NULL, this function returns the required - initial value for the crc. Pre- and post-conditioning (one's complement) is - performed within this function so it shouldn't be done by the application. + updated CRC-32. A CRC-32 value is in the range of a 32-bit unsigned integer. + If buf is Z_NULL, this function returns the required initial value for the + crc. Pre- and post-conditioning (one's complement) is performed within this + function so it shouldn't be done by the application. Usage example: @@ -1739,20 +1863,35 @@ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); if (crc != original_crc) error(); */ -ZEXTERN uLong ZEXPORT crc32_z OF((uLong adler, const Bytef *buf, - z_size_t len)); +ZEXTERN uLong ZEXPORT crc32_z(uLong crc, const Bytef *buf, + z_size_t len); /* - Same as crc32(), but with a size_t length. + Same as crc32(), but with a size_t length. Note that a long is 32 bits on + Windows. */ /* -ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); +ZEXTERN uLong ZEXPORT crc32_combine(uLong crc1, uLong crc2, z_off_t len2); Combine two CRC-32 check values into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, CRC-32 check values were calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and - len2. + len2. len2 must be non-negative, otherwise zero is returned. +*/ + +/* +ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t len2); + + Return the operator corresponding to length len2, to be used with + crc32_combine_op(). len2 must be non-negative, otherwise zero is returned. +*/ + +ZEXTERN uLong ZEXPORT crc32_combine_op(uLong crc1, uLong crc2, uLong op); +/* + Give the same result as crc32_combine(), using op in place of len2. op is + is generated from len2 by crc32_combine_gen(). This will be faster than + crc32_combine() if the generated op is used more than once. */ @@ -1761,20 +1900,20 @@ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); /* deflateInit and inflateInit are macros to allow checking the zlib version * and the compiler's view of z_stream: */ -ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, - int windowBits, int memLevel, - int strategy, const char *version, - int stream_size)); -ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, - unsigned char FAR *window, - const char *version, - int stream_size)); +ZEXTERN int ZEXPORT deflateInit_(z_streamp strm, int level, + const char *version, int stream_size); +ZEXTERN int ZEXPORT inflateInit_(z_streamp strm, + const char *version, int stream_size); +ZEXTERN int ZEXPORT deflateInit2_(z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size); +ZEXTERN int ZEXPORT inflateInit2_(z_streamp strm, int windowBits, + const char *version, int stream_size); +ZEXTERN int ZEXPORT inflateBackInit_(z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size); #ifdef Z_PREFIX_SET # define z_deflateInit(strm, level) \ deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) @@ -1819,7 +1958,7 @@ struct gzFile_s { unsigned char *next; z_off64_t pos; }; -ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ +ZEXTERN int ZEXPORT gzgetc_(gzFile file); /* backward compatibility */ #ifdef Z_PREFIX_SET # undef z_gzgetc # define z_gzgetc(g) \ @@ -1836,12 +1975,13 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ * without large file support, _LFS64_LARGEFILE must also be true */ #ifdef Z_LARGE64 - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); - ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); + ZEXTERN gzFile ZEXPORT gzopen64(const char *, const char *); + ZEXTERN z_off64_t ZEXPORT gzseek64(gzFile, z_off64_t, int); + ZEXTERN z_off64_t ZEXPORT gztell64(gzFile); + ZEXTERN z_off64_t ZEXPORT gzoffset64(gzFile); + ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off64_t); + ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off64_t); + ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off64_t); #endif #if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) @@ -1852,6 +1992,7 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ # define z_gzoffset z_gzoffset64 # define z_adler32_combine z_adler32_combine64 # define z_crc32_combine z_crc32_combine64 +# define z_crc32_combine_gen z_crc32_combine_gen64 # else # define gzopen gzopen64 # define gzseek gzseek64 @@ -1859,49 +2000,53 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ # define gzoffset gzoffset64 # define adler32_combine adler32_combine64 # define crc32_combine crc32_combine64 +# define crc32_combine_gen crc32_combine_gen64 # endif # ifndef Z_LARGE64 - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); - ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN gzFile ZEXPORT gzopen64(const char *, const char *); + ZEXTERN z_off_t ZEXPORT gzseek64(gzFile, z_off_t, int); + ZEXTERN z_off_t ZEXPORT gztell64(gzFile); + ZEXTERN z_off_t ZEXPORT gzoffset64(gzFile); + ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off64_t); + ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off64_t); + ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off64_t); # endif #else - ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); - ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); - ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); - ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN gzFile ZEXPORT gzopen(const char *, const char *); + ZEXTERN z_off_t ZEXPORT gzseek(gzFile, z_off_t, int); + ZEXTERN z_off_t ZEXPORT gztell(gzFile); + ZEXTERN z_off_t ZEXPORT gzoffset(gzFile); + ZEXTERN uLong ZEXPORT adler32_combine(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t); #endif #else /* Z_SOLO */ - ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT adler32_combine(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t); #endif /* !Z_SOLO */ /* undocumented functions */ -ZEXTERN const char * ZEXPORT zError OF((int)); -ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); -ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); -ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); -ZEXTERN int ZEXPORT inflateValidate OF((z_streamp, int)); -ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF ((z_streamp)); -ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); -ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); -#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(Z_SOLO) -ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, - const char *mode)); +ZEXTERN const char * ZEXPORT zError(int); +ZEXTERN int ZEXPORT inflateSyncPoint(z_streamp); +ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table(void); +ZEXTERN int ZEXPORT inflateUndermine(z_streamp, int); +ZEXTERN int ZEXPORT inflateValidate(z_streamp, int); +ZEXTERN unsigned long ZEXPORT inflateCodesUsed(z_streamp); +ZEXTERN int ZEXPORT inflateResetKeep(z_streamp); +ZEXTERN int ZEXPORT deflateResetKeep(z_streamp); +#if defined(_WIN32) && !defined(Z_SOLO) +ZEXTERN gzFile ZEXPORT gzopen_w(const wchar_t *path, + const char *mode); #endif #if defined(STDC) || defined(Z_HAVE_STDARG_H) # ifndef Z_SOLO -ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file, - const char *format, - va_list va)); +ZEXTERN int ZEXPORTVA gzvprintf(gzFile file, + const char *format, + va_list va); # endif #endif diff --git a/rSDK/Lib/zlib.lib b/rSDK/Lib/zlib.lib index 9d76f3d1948eb6e27f35b37c156283ca2862fdfa..5e7f3e3499be2e68c568df6310c28fd0494c7124 100644 GIT binary patch literal 344806 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 literal 331624 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 z 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 diff --git a/rSDK/ZlibStream/Data.h b/rSDK/ZlibStream/Data.h index 5693c099..b311c7ed 100644 --- a/rSDK/ZlibStream/Data.h +++ b/rSDK/ZlibStream/Data.h @@ -1,6 +1,20 @@ class rRundata; typedef rRundata * LPRRDATA; +#ifdef _UNICODE + #define EDITDATA EDITDATAW + #define LPEDATA LPEDATAW + typedef std::wstring tstring; + typedef std::wstringstream tstringstream; + #define t_gzopen(path, mode) gzopen_w(path, mode) +#else + #define EDITDATA EDITDATAA + #define LPEDATA LPEDATAA + typedef std::string tstring; + typedef std::stringstream tstringstream; + #define t_gzopen(path, mode) gzopen(path, mode) +#endif + // -------------------------------- // RUNNING OBJECT DATA STRUCTURE // -------------------------------- @@ -12,18 +26,18 @@ typedef struct tagRDATA #include "MagicRDATA.h" //bool is volatile so it can be changed instantly by threads - unsigned short inbuffersize; // Default size of memory buffer - double PercentageDifference; // Percentage difference input->output - string LastOutput; // Last finished file name - string returnstring; // String to return with statistics or errors - volatile bool threadsafe; // Ensure only one thread accesses rdPtr's variables + unsigned short inbuffersize; //Default size of memory buffer + double PercentageDifference; //Percentage difference input->output + tstring LastOutput; //Last finished file name + tstring returnstring; //String to return with statistics or errors + volatile bool threadsafe; //Ensure only one thread accesses rdPtr's variables - tagRDATA() : inbuffersize(8192), PercentageDifference(0.0), LastOutput(""), returnstring(""), threadsafe(false) // Constructor + tagRDATA() : inbuffersize(8192), PercentageDifference(0.0), LastOutput(_T("")), returnstring(_T("")), threadsafe(false) //Constructor { //vars initialized above in the initializer list } //functions - ~tagRDATA(){} // Destructor + ~tagRDATA(){} //Destructor } RUNDATA; typedef RUNDATA * LPRDATA; diff --git a/rSDK/ZlibStream/Edittime.cpp b/rSDK/ZlibStream/Edittime.cpp index 32bcc5f9..406fa1fd 100644 --- a/rSDK/ZlibStream/Edittime.cpp +++ b/rSDK/ZlibStream/Edittime.cpp @@ -4,7 +4,7 @@ // under the Frame and Event editors. // // Including creating, display, and setting up your object. -// +// // ============================================================================ #include "common.h" @@ -41,7 +41,7 @@ DEBUGGER_ITEMS_START() // DB_CURRENTSTRING, // DB_CURRENTSTRING|DB_EDITABLE, - // DB_CURRENTVALUE|DB_EDITABLE, + // DB_CURRENTVALUE|DB_EDITABLE, // DB_CURRENTCHECK, // DB_CURRENTCOMBO, @@ -202,23 +202,23 @@ void WINAPI DLLExport SetPropValue(LPMV mV, LPEDATA edPtr, UINT nPropID, LPVOID // // or have an adaptive size of structure like below // // // If the length is different -// if (strlen(pStr)!=strlen(edPtr->text)) +// if (_tcslen(pStr)!=_tcslen(edPtr->text)) // { // // Asks MMF to reallocate the structure with the new size -// LPEDATA pNewPtr = (LPEDATA)mvReAllocEditData(mV, edPtr, sizeof(EDITDATA)+strlen(pStr)); -// +// LPEDATA pNewPtr = (LPEDATA)mvReAllocEditData(mV, edPtr, sizeof(EDITDATA)+_tcslen(pStr)); +// // // If reallocation worked // if (pNewPtr!=NULL) // { // // Copy the string // edPtr=pNewPtr; -// strcpy(edPtr->text, pStr); +// _tcscpy(edPtr->text, pStr); // } // } // else -// { +// { // // Same size : simply copy -// strcpy(edPtr->text, pStr); +// _tcscpy(edPtr->text, pStr); // } // } // break; @@ -303,7 +303,7 @@ BOOL WINAPI IsPropEnabled(LPMV mV, LPEDATA edPtr, UINT nPropID) // ============================================================================ // // TEXT PROPERTIES -// +// // ============================================================================ // -------------------- @@ -324,7 +324,7 @@ DWORD WINAPI DLLExport GetTextCaps(mv _far *mV, LPEDATA edPtr) // Note: the pStyle and cbSize parameters are obsolete and passed for compatibility reasons only. // -BOOL WINAPI DLLExport GetTextFont(mv _far *mV, LPEDATA edPtr, LPLOGFONT plf, LPSTR pStyle, UINT cbSize) +BOOL WINAPI DLLExport GetTextFont(mv _far *mV, LPEDATA edPtr, LPLOGFONT plf, LPTSTR pStyle, UINT cbSize) { #if !RUN_ONLY // Example: copy LOGFONT structure from EDITDATA @@ -482,7 +482,7 @@ WORD BmpToImg(int bmID, npAppli idApp, short HotX = 0, short HotY = 0, short Act // ============================================================================ // // ROUTINES USED UNDER FRAME EDITOR -// +// // ============================================================================ // -------------------- @@ -497,7 +497,7 @@ WORD BmpToImg(int bmID, npAppli idApp, short HotX = 0, short HotY = 0, short Act // /* -int WINAPI DLLExport MakeIconEx ( mv _far *mV, cSurface* pIconSf, LPSTR lpName, fpObjInfo oiPtr, LPEDATA edPtr ) +int WINAPI DLLExport MakeIconEx ( mv _far *mV, cSurface* pIconSf, LPTSTR lpName, fpObjInfo oiPtr, LPEDATA edPtr ) { int error = -1; #ifndef RUN_ONLY @@ -512,7 +512,7 @@ int WINAPI DLLExport MakeIconEx ( mv _far *mV, cSurface* pIconSf, LPSTR lpName, // -------------------- // CreateObject // -------------------- -// Called when you choose "Create new object". It should display the setup box +// Called when you choose "Create new object". It should display the setup box // and initialize everything in the datazone. int WINAPI DLLExport CreateObject(mv _far *mV, fpLevObj loPtr, LPEDATA edPtr) @@ -521,7 +521,7 @@ int WINAPI DLLExport CreateObject(mv _far *mV, fpLevObj loPtr, LPEDATA edPtr) // Do some rSDK stuff #include "rCreateObject.h" - + // Set default object settings // edPtr->swidth = 32; @@ -545,7 +545,7 @@ int WINAPI DLLExport CreateObject(mv _far *mV, fpLevObj loPtr, LPEDATA edPtr) BOOL WINAPI EditObject (mv _far *mV, fpObjInfo oiPtr, fpLevObj loPtr, LPEDATA edPtr) { #ifndef RUN_ONLY - + return TRUE; #endif // !RUN_ONLY @@ -594,7 +594,7 @@ void WINAPI DLLExport RemoveObject(mv _far *mV, fpLevObj loPtr, LPEDATA edPtr, u { #ifndef RUN_ONLY // Is the last object removed? - if (0 == cpt) + if (0 == cpt) { // Do whatever necessary to remove our data } @@ -676,7 +676,7 @@ void WINAPI DLLExport EditorDisplay(mv _far *mV, fpObjInfo oiPtr, fpLevObj loPtr // IsTransparent // -------------------- // This routine tells MMF2 if the mouse pointer is over a transparent zone of the object. -// +// extern "C" BOOL WINAPI DLLExport IsTransparent(mv _far *mV, fpLevObj loPtr, LPEDATA edPtr, int dx, int dy) { @@ -690,7 +690,7 @@ extern "C" BOOL WINAPI DLLExport IsTransparent(mv _far *mV, fpLevObj loPtr, LPED // PrepareToWriteObject // -------------------- // Just before writing the datazone when saving the application, MMF2 calls this routine. -// +// void WINAPI DLLExport PrepareToWriteObject(mv _far *mV, LPEDATA edPtr, fpObjInfo adoi) { @@ -725,23 +725,23 @@ BOOL WINAPI GetFilters(LPMV mV, LPEDATA edPtr, DWORD dwFlags, LPVOID pReserved) // Return TRUE if you can create an object from the given file // -BOOL WINAPI DLLExport UsesFile (LPMV mV, LPSTR fileName) +BOOL WINAPI DLLExport UsesFile (LPMV mV, LPTSTR fileName) { BOOL r = FALSE; #ifndef RUN_ONLY // Example: return TRUE if file extension is ".txt" -/* - LPSTR ext, npath; +/* + LPTSTR ext, npath; if ( fileName != NULL ) { - if ( (ext=(LPSTR)malloc(_MAX_EXT)) != NULL ) + if ( (ext=(LPTSTR)malloc(_MAX_EXT)) != NULL ) { - if ( (npath=(LPSTR)malloc(_MAX_PATH)) != NULL ) + if ( (npath=(LPTSTR)malloc(_MAX_PATH)) != NULL ) { - strcpy(npath, fileName); - _splitpath(npath, NULL, NULL, NULL, ext); + _tcscpy(npath, fileName); + _tsplitpath(npath, NULL, NULL, NULL, ext); if ( _stricmp(ext, ".txt") == 0 ) r = TRUE; free(npath); @@ -760,7 +760,7 @@ BOOL WINAPI DLLExport UsesFile (LPMV mV, LPSTR fileName) // Creates a new object from file // -void WINAPI DLLExport CreateFromFile (LPMV mV, LPSTR fileName, LPEDATA edPtr) +void WINAPI DLLExport CreateFromFile (LPMV mV, LPTSTR fileName, LPEDATA edPtr) { #ifndef RUN_ONLY // Initialize your extension data from the given file @@ -768,7 +768,7 @@ void WINAPI DLLExport CreateFromFile (LPMV mV, LPSTR fileName, LPEDATA edPtr) // edPtr->sheight = 32; // Example: store the filename - // strcpy(edPtr->myFileName, fileName); + // _tcscpy(edPtr->myFileName, fileName); #endif // !RUN_ONLY } @@ -778,24 +778,24 @@ void WINAPI DLLExport CreateFromFile (LPMV mV, LPSTR fileName, LPEDATA edPtr) // // ROUTINES USED UNDER EVENT / TIME / STEP-THROUGH EDITOR // You should not need to change these routines -// +// // ============================================================================ // ----------------- // menucpy // ----------------- // Internal routine used later, copy one menu onto another -// -#ifndef RUN_ONLY + void menucpy(HMENU hTargetMenu, HMENU hSourceMenu) { - int n, id, nMn; - TCHAR * strBuf; - HMENU hSubMenu; - +#ifndef RUN_ONLY + int n, id, nMn; + LPTSTR strBuf; + HMENU hSubMenu; + nMn = GetMenuItemCount(hSourceMenu); - strBuf = (TCHAR *)LocalAlloc(LPTR, 80); - for (n=0; n < nMn; n++) + strBuf = (LPTSTR)calloc(80, sizeof(TCHAR)); + for (n = 0; n < nMn; n++) { if (0 == (id = GetMenuItemID(hSourceMenu, n))) AppendMenu(hTargetMenu, MF_SEPARATOR, 0, 0L); @@ -812,26 +812,31 @@ void menucpy(HMENU hTargetMenu, HMENU hSourceMenu) } } } - LocalFree((HLOCAL)strBuf); + free(strBuf); +#endif } // ----------------- // GetPopupMenu // ----------------- // Internal routine used later. Returns the first popup from a menu -// +// HMENU GetPopupMenu(LPEDATA edPtr,short mn) { +#ifndef RUN_ONLY HMENU hPopup = CreatePopupMenu(); if (mn == MN_CONDITIONS) - menucpy(hPopup, ConditionMenu(edPtr)); + menucpy(hPopup,ConditionMenu(/*edPtr*/)); else if (mn == MN_ACTIONS) - menucpy(hPopup, ActionMenu(edPtr)); + menucpy(hPopup,ActionMenu(/*edPtr*/)); else if (mn == MN_EXPRESSIONS) - menucpy(hPopup, ExpressionMenu(edPtr)); + menucpy(hPopup,ExpressionMenu(/*edPtr*/)); return hPopup; +#else + return NULL; +#endif } // -------------------- @@ -842,14 +847,13 @@ HMENU GetPopupMenu(LPEDATA edPtr,short mn) // static LPEVENTINFOS2 GetEventInformations(LPEVENTINFOS2 eiPtr, short code) + { while (eiPtr->infos.code != code) eiPtr = EVINFO2_NEXT(eiPtr); - + return eiPtr; } -#endif // !RUN_ONLY - // ---------------------------------------------------- // GetConditionMenu / GetActionMenu / GetExpressionMenu @@ -862,7 +866,7 @@ HMENU WINAPI DLLExport GetConditionMenu(mv _far *mV, fpObjInfo oiPtr, LPEDATA ed { #ifndef RUN_ONLY // Check compatibility - return GetPopupMenu(edPtr, MN_CONDITIONS); + return GetPopupMenu(edPtr,MN_CONDITIONS); #endif // !RUN_ONLY return NULL; } @@ -871,7 +875,7 @@ HMENU WINAPI DLLExport GetActionMenu(mv _far *mV, fpObjInfo oiPtr, LPEDATA edPtr { #ifndef RUN_ONLY // Check compatibility - return GetPopupMenu(edPtr, MN_ACTIONS); + return GetPopupMenu(edPtr,MN_ACTIONS); #endif // !RUN_ONLY return NULL; } @@ -880,7 +884,7 @@ HMENU WINAPI DLLExport GetExpressionMenu(mv _far *mV, fpObjInfo oiPtr, LPEDATA e { #ifndef RUN_ONLY // Check compatibility - return GetPopupMenu(edPtr, MN_EXPRESSIONS); + return GetPopupMenu(edPtr,MN_EXPRESSIONS); #endif // !RUN_ONLY return NULL; } @@ -897,42 +901,37 @@ HMENU WINAPI DLLExport GetExpressionMenu(mv _far *mV, fpObjInfo oiPtr, LPEDATA e #ifndef RUN_ONLY void GetCodeTitle(LPEVENTINFOS2 eiPtr, short code, short param, short mn, LPTSTR strBuf, WORD maxLen) { - HMENU hMn; + HMENU hMn; // Finds event in array - eiPtr = GetEventInformations(eiPtr, code); + eiPtr=GetEventInformations(eiPtr, code); // If a special string is to be returned short strID = EVINFO2_PARAMTITLE(eiPtr, param); - if (strID) - { - switch(mn) - { + if (strID) { + switch(mn) { case MN_CONDITIONS: - if (code >= 0 && code < (short)Conditions.size()) { - if (param >= 0 && param < (short)Conditions[code]->getParamCount()) - _tcscpy_s(strBuf, maxLen, Conditions[code]->getParamName(param)); + if (code>=0&&code<(short)Conditions.size()) { + if (param>=0&¶m<(short)Conditions[code]->getParamCount()) + _tcscpy(strBuf,Conditions[code]->getParamName(param)); } break; case MN_ACTIONS: - if (code >= 0 && code < (short)Actions.size()) { - if (param >= 0 && param < (short)Actions[code]->getParamCount()) - _tcscpy_s(strBuf, maxLen, Actions[code]->getParamName(param)); + if (code>=0&&code<(short)Actions.size()) { + if (param>=0&¶m<(short)Actions[code]->getParamCount()) + _tcscpy(strBuf,Actions[code]->getParamName(param)); } break; case MN_EXPRESSIONS: - if (code >= 0 && code < (short)Expressions.size()) { - if (param >= 0 && param < (short)Expressions[code]->getParamCount()) - _tcscpy_s(strBuf, maxLen, Expressions[code]->getParamName(param)); + if (code>=0&&code<(short)Expressions.size()) { + if (param>=0&¶m<(short)Expressions[code]->getParamCount()) + _tcscpy(strBuf,Expressions[code]->getParamName(param)); } break; } - } - else - { - if ((hMn = LoadMenu(hInstLib, MAKEINTRESOURCE(mn)))) - { + } else { + if ((hMn=LoadMenu(hInstLib, MAKEINTRESOURCE(mn)))) { GetMenuString(hMn, eiPtr->menu, strBuf, maxLen, MF_BYCOMMAND); DestroyMenu(hMn); } @@ -964,9 +963,9 @@ short WINAPI DLLExport GetConditionCodeFromMenu(mv _far *mV, short menuId) #ifndef RUN_ONLY LPEVENTINFOS2 eiPtr; int n; - for (n = Conditions.size(), eiPtr = (LPEVENTINFOS2)conditionsInfos; n > 0 && eiPtr->menu != menuId; n--) - eiPtr = EVINFO2_NEXT(eiPtr); - if (n > 0) + for (n=Conditions.size(),eiPtr=(LPEVENTINFOS2)conditionsInfos;n>0&&eiPtr->menu!=menuId;n--) + eiPtr=EVINFO2_NEXT(eiPtr); + if (n>0) return eiPtr->infos.code; #endif // !RUN_ONLY return -1; @@ -978,9 +977,9 @@ short WINAPI DLLExport GetActionCodeFromMenu(mv _far *mV, short menuId) LPEVENTINFOS2 eiPtr; int n; - for (n = Actions.size(), eiPtr = (LPEVENTINFOS2)actionsInfos; n > 0 && eiPtr->menu != menuId; n--) + for (n=Actions.size(),eiPtr=(LPEVENTINFOS2)actionsInfos;n>0&&eiPtr->menu!=menuId;n--) eiPtr = EVINFO2_NEXT(eiPtr); - if (n > 0) + if (n>0) return eiPtr->infos.code; #endif // !RUN_ONLY return -1; @@ -991,9 +990,9 @@ short WINAPI DLLExport GetExpressionCodeFromMenu(mv _far *mV, short menuId) #ifndef RUN_ONLY LPEVENTINFOS2 eiPtr; int n; - for (n = Expressions.size(), eiPtr = (LPEVENTINFOS2)expressionsInfos; n > 0 && eiPtr->menu != menuId; n--) + for (n=Expressions.size(),eiPtr=(LPEVENTINFOS2)expressionsInfos;n>0&&eiPtr->menu!=menuId;n--) eiPtr = EVINFO2_NEXT(eiPtr); - if (n > 0) + if (n>0) return eiPtr->infos.code; #endif // !RUN_ONLY return -1; @@ -1003,8 +1002,8 @@ short WINAPI DLLExport GetExpressionCodeFromMenu(mv _far *mV, short menuId) // ------------------------------------------------------- // GetConditionInfos / GetActionInfos / GetExpressionInfos // ------------------------------------------------------- -// From a action / condition / expression code, returns -// an infosEvents structure. +// From a action / condition / expression code, returns +// an infosEvents structure. // LPINFOEVENTSV2 WINAPI DLLExport GetConditionInfos(mv _far *mV, short code) @@ -1038,31 +1037,31 @@ LPINFOEVENTSV2 WINAPI DLLExport GetExpressionInfos(mv _far *mV, short code) // ---------------------------------------------------------- // GetConditionString / GetActionString / GetExpressionString // ---------------------------------------------------------- -// From a action / condition / expression code, returns +// From a action / condition / expression code, returns // the string to use for displaying it under the event editor // void WINAPI DLLExport GetConditionString(mv _far *mV, short code, LPTSTR strPtr, short maxLen) { #ifndef RUN_ONLY - if (code >= 0 && code < (short)Conditions.size()) - _tcscpy(strPtr, Conditions[code]->getName()); + if (code>=0&&code<(short)Conditions.size()) + _tcscpy(strPtr,Conditions[code]->getName()); #endif // !RUN_ONLY } void WINAPI DLLExport GetActionString(mv _far *mV, short code, LPTSTR strPtr, short maxLen) { #ifndef RUN_ONLY - if (code >= 0 && code < (short)Actions.size()) - _tcscpy(strPtr, Actions[code]->getName()); + if (code>=0&&code<(short)Actions.size()) + _tcscpy(strPtr,Actions[code]->getName()); #endif // !RUN_ONLY } void WINAPI DLLExport GetExpressionString(mv _far *mV, short code, LPTSTR strPtr, short maxLen) { #ifndef RUN_ONLY - if (code >= 0 && code < (short)Expressions.size()) - _tcscpy_s(strPtr, maxLen, Expressions[code]->getName()); + if (code>=0&&code<(short)Expressions.size()) + _tcscpy(strPtr,Expressions[code]->getName()); #endif // !RUN_ONLY } @@ -1076,9 +1075,9 @@ void WINAPI DLLExport GetExpressionParam(mv _far *mV, short code, short param, L { #ifndef RUN_ONLY if (_tcslen(Expressions[code]->getParamName(param))) - _tcscpy_s(strBuf, maxLen, Expressions[code]->getParamName(param)); + _tcscpy(strBuf,Expressions[code]->getParamName(param)); else - *strBuf = 0; + *strBuf=0; #endif } @@ -1097,8 +1096,8 @@ void WINAPI InitParameter(mv _far *mV, short code, paramExt* pExt) #if !RUN_ONLY // Example // ------- - // strcpy(&pExt->pextData[0], "Parameter Test"); - // pExt->pextSize = sizeof(paramExt) + strlen(pExt->pextData) + 1; + // _tcscpy(&pExt->pextData[0], "Parameter Test"); + // pExt->pextSize = sizeof(paramExt) + _tcslen(pExt->pextData)+1; #endif // !RUN_ONLY } @@ -1116,7 +1115,7 @@ BOOL CALLBACK DLLExport SetupProc(HWND hDlg, UINT msgType, WPARAM wParam, LPARAM // Save edptr SetWindowLong(hDlg, DWL_USER, lParam); - pExt = (paramExt *)lParam; + pExt=(paramExt*)lParam; SetDlgItemText(hDlg, IDC_EDIT, pExt->pextData); return TRUE; @@ -1130,7 +1129,7 @@ BOOL CALLBACK DLLExport SetupProc(HWND hDlg, UINT msgType, WPARAM wParam, LPARAM { case IDOK: // Exit GetDlgItemText(hDlg, IDC_EDIT, pExt->pextData, 500); - pExt->pextSize = sizeof(paramExt) + strlen(pExt->pextData) + 1; + pExt->pextSize=sizeof(paramExt)+_tcslen(pExt->pextData)+1; EndDialog(hDlg, TRUE); return TRUE; @@ -1170,7 +1169,7 @@ void WINAPI EditParameter(mv _far *mV, short code, paramExt* pExt) // Initialize the parameter. // -void WINAPI GetParameterString(mv _far *mV, short code, paramExt* pExt, LPSTR pDest, short size) +void WINAPI GetParameterString(mv _far *mV, short code, paramExt* pExt, LPTSTR pDest, short size) { #if !RUN_ONLY @@ -1190,14 +1189,14 @@ void WINAPI GetParameterString(mv _far *mV, short code, paramExt* pExt, LPSTR pD // Note: ObjComment is also displayed in the Quick Description box in the Insert Object dialog box // -void WINAPI DLLExport GetObjInfos (mv _far *mV, LPEDATA edPtr, LPSTR ObjName, LPSTR ObjAuthor, LPSTR ObjCopyright, LPSTR ObjComment, LPSTR ObjHttp) +void WINAPI DLLExport GetObjInfos (mv _far *mV, LPEDATA edPtr, LPTSTR ObjName, LPTSTR ObjAuthor, LPTSTR ObjCopyright, LPTSTR ObjComment, LPTSTR ObjHttp) { #ifndef RUN_ONLY - strcpy_s(ObjName, 255, ObjectName); - strcpy_s(ObjAuthor, 255, ObjectAuthor); - strcpy_s(ObjCopyright, 255, ObjectCopyright); - strcpy_s(ObjComment, 1023, ObjectComment); - strcpy_s(ObjHttp, 255, ObjectURL); + _tcscpy(ObjName, ObjectName); + _tcscpy(ObjAuthor,ObjectAuthor); + _tcscpy(ObjCopyright,ObjectCopyright); + _tcscpy(ObjComment,ObjectComment); + _tcscpy(ObjHttp,ObjectURL); #endif } @@ -1207,10 +1206,10 @@ void WINAPI DLLExport GetObjInfos (mv _far *mV, LPEDATA edPtr, LPSTR ObjName, LP // Returns the help filename of the object. // -LPCSTR WINAPI GetHelpFileName() +LPCTSTR WINAPI GetHelpFileName() { #ifndef RUN_ONLY - return ObjectHelp; + return _T(ObjectHelp); #else return NULL; #endif diff --git a/rSDK/ZlibStream/Ext.rc b/rSDK/ZlibStream/Ext.rc index 9f122903..1da7c4ee 100644 --- a/rSDK/ZlibStream/Ext.rc +++ b/rSDK/ZlibStream/Ext.rc @@ -68,16 +68,16 @@ END #if defined(APSTUDIO_INVOKED) || defined(EDITOR) #if defined(APSTUDIO_INVOKED) -EXO_ICON$(EDITOR) BITMAP "EXTICON.BMP" +EXO_ICON$(EDITOR) BITMAP "Icon.bmp" #else -EXO_ICON BITMAP "EXTICON.BMP" +EXO_ICON BITMAP "Icon.bmp" #endif #endif #if defined(APSTUDIO_INVOKED) || defined(EDITOR) #if defined(APSTUDIO_INVOKED) -EXO_IMAGE$(EDITOR) BITMAP "EXTIMG.BMP" +EXO_IMAGE$(EDITOR) BITMAP "Img.bmp" #else -EXO_IMAGE BITMAP "EXTIMG.BMP" +EXO_IMAGE BITMAP "Img.bmp" #endif #endif diff --git a/rSDK/ZlibStream/General.cpp b/rSDK/ZlibStream/General.cpp index 4e2113c6..6b47b6f3 100644 --- a/rSDK/ZlibStream/General.cpp +++ b/rSDK/ZlibStream/General.cpp @@ -1,7 +1,7 @@ /// ===================================================================================== // // The following routines are used internally by MMF, and should not need to be modified -// +// // ===================================================================================== #include "common.h" @@ -12,7 +12,7 @@ EXT_INIT() // ============================================================================ // // LIBRARY ENTRY & QUIT POINTS -// +// // ============================================================================ // ----------------- @@ -27,16 +27,16 @@ BOOL WINAPI DllMain(HINSTANCE hDLL, DWORD dwReason, LPVOID lpReserved) conditionsInfos = getConditionInfos(); actionsInfos = getActionInfos(); expressionsInfos = getExpressionInfos(); - + ConditionJumps = getConditions(); ActionJumps = getActions(); ExpressionJumps = getExpressions(); - + switch (dwReason) { // DLL is attaching to the address space of the current process. case DLL_PROCESS_ATTACH: - + hInstLib = hDLL; // Store HINSTANCE break; @@ -49,10 +49,10 @@ BOOL WINAPI DllMain(HINSTANCE hDLL, DWORD dwReason, LPVOID lpReserved) break; // The calling process is detaching the DLL from its address space. - case DLL_PROCESS_DETACH: + case DLL_PROCESS_DETACH: break; } - + return TRUE; } @@ -73,7 +73,7 @@ extern "C" int WINAPI DLLExport Initialize(mv _far *mV, int quiet) // ----------------- // Where you want to kill and initialized data opened in the above routine // Called just before freeing the DLL. -// +// extern "C" int WINAPI DLLExport Free(mv _far *mV) { // No error @@ -83,18 +83,18 @@ extern "C" int WINAPI DLLExport Free(mv _far *mV) // ============================================================================ // // GENERAL INFO -// +// // ============================================================================ // ----------------- // Get Infos // ----------------- -// -extern "C" +// +extern "C" { DWORD WINAPI DLLExport GetInfos(int info) { - + switch (info) { case KGI_VERSION: @@ -105,6 +105,12 @@ extern "C" return ForVersion; case KGI_BUILD: return MinimumBuild; + case KGI_UNICODE: + #ifdef _UNICODE + return TRUE; + #else + return FALSE; + #endif default: return 0; } @@ -116,7 +122,7 @@ extern "C" // ---------------------------------------------------------- // Fills an information structure that tells MMF2 everything // about the object, its actions, conditions and expressions -// +// short WINAPI DLLExport GetRunObjectInfos(mv _far *mV, fpKpxRunInfos infoPtr) { @@ -129,7 +135,7 @@ short WINAPI DLLExport GetRunObjectInfos(mv _far *mV, fpKpxRunInfos infoPtr) infoPtr->numOfExpressions = (short)Expressions.size(); infoPtr->editDataSize = sizeof(EDITDATA); - + MagicFlags(infoPtr->editFlags); infoPtr->windowProcPriority = WINDOWPROC_PRIORITY; @@ -138,7 +144,7 @@ short WINAPI DLLExport GetRunObjectInfos(mv _far *mV, fpKpxRunInfos infoPtr) infoPtr->identifier = IDENTIFIER; infoPtr->version = 1; - + return TRUE; } @@ -150,13 +156,13 @@ short WINAPI DLLExport GetRunObjectInfos(mv _far *mV, fpKpxRunInfos infoPtr) // Data\Runtime folder). // -LPCSTR* WINAPI DLLExport GetDependencies() +LPCTSTR* WINAPI DLLExport GetDependencies() { // Do some rSDK stuff #include "rGetDependencies.h" - - //LPCSTR szDep[] = { - // "MyDll.dll", + + //LPCTSTR szDep[] = { + // _T("MyDll.dll"), // NULL //}; @@ -190,7 +196,7 @@ void WINAPI DLLExport UnloadObject(mv _far *mV, LPEDATA edPtr, int reserved) // -------------------- // For you to update your object structure to newer versions // Called at both edit time and run time -// +// HGLOBAL WINAPI DLLExport UpdateEditStructure(mv __far *mV, void __far * OldEdPtr) { // We do nothing here @@ -205,9 +211,10 @@ HGLOBAL WINAPI DLLExport UpdateEditStructure(mv __far *mV, void __far * OldEdPtr // Called at edit time and run time. // // Call lpfnUpdate to update your file pathname (refer to the documentation) -// -void WINAPI DLLExport UpdateFileNames(mv _far *mV, LPSTR appName, LPEDATA edPtr, void (WINAPI * lpfnUpdate)(LPSTR, LPSTR)) +// +void WINAPI DLLExport UpdateFileNames(mv _far *mV, LPTSTR appName, LPEDATA edPtr, void (WINAPI * lpfnUpdate)(LPTSTR, LPTSTR)) { + } // --------------------- @@ -216,22 +223,22 @@ void WINAPI DLLExport UpdateFileNames(mv _far *mV, LPSTR appName, LPEDATA edPtr, // // Uncomment this function if you need to store an image in the image bank. // -// Note: do not forget to enable the function in the .def file +// Note: do not forget to enable the function in the .def file // if you remove the comments below. // /* int WINAPI DLLExport EnumElts (mv __far *mV, LPEDATA edPtr, ENUMELTPROC enumProc, ENUMELTPROC undoProc, LPARAM lp1, LPARAM lp2) -{ +{ int error = 0; // Replace wImgIdx with the name of the WORD variable you create within the edit structure - - // Enum images + + // Enum images if ( (error = enumProc(&edPtr->wImgIdx, IMG_TAB, lp1, lp2)) != 0 ) { - // Undo enum images - undoProc (&edPtr->wImgIdx, IMG_TAB, lp1, lp2); - } + // Undo enum images + undoProc (&edPtr->wImgIdx, IMG_TAB, lp1, lp2); + } return error; } diff --git a/rSDK/ZlibStream/EXTICON.BMP b/rSDK/ZlibStream/Icon.bmp similarity index 100% rename from rSDK/ZlibStream/EXTICON.BMP rename to rSDK/ZlibStream/Icon.bmp diff --git a/rSDK/ZlibStream/EXTIMG.BMP b/rSDK/ZlibStream/Img.bmp similarity index 100% rename from rSDK/ZlibStream/EXTIMG.BMP rename to rSDK/ZlibStream/Img.bmp diff --git a/rSDK/ZlibStream/Information.h b/rSDK/ZlibStream/Information.h index 4c830222..0706502d 100644 --- a/rSDK/ZlibStream/Information.h +++ b/rSDK/ZlibStream/Information.h @@ -3,12 +3,12 @@ // -------------------- // Basic object details -#define ObjectName "ZlibStream object" -#define ObjectAuthor "Darkwire Software" -#define ObjectCopyright "Copyright \xA9 2019 Darkwire Software" -#define ObjectComment "Compress and decompress files with Zlib without loading them into the memory. Allows several actions at once." -#define ObjectURL "http://www.dark-wire.com/" -#define ObjectHelp "Help\\ZlibStream.chm" +#define ObjectName _T("ZlibStream") +#define ObjectAuthor _T("Darkwire Software") +#define ObjectCopyright _T("Copyright \xA9 2011-2026 Darkwire Software") +#define ObjectComment _T("Compress and decompress files with Zlib without loading them into the memory. Allows several actions at once.") +#define ObjectURL _T("http://www.dark-wire.com/") +#define ObjectHelp _T("Help\\ZlibStream.chm") // If you register your object with Clickteam, change this to the ID you were given #define ObjectRegID REGID_PRIVATE diff --git a/rSDK/ZlibStream/Main.cpp b/rSDK/ZlibStream/Main.cpp index 857c206a..8c09820f 100644 --- a/rSDK/ZlibStream/Main.cpp +++ b/rSDK/ZlibStream/Main.cpp @@ -1,7 +1,7 @@ // ============================================================================ // // This file contains the actions, conditions and expressions your object uses -// +// // ============================================================================ #include "Common.h" @@ -12,7 +12,7 @@ { \ Sleep(0); \ } \ - rdPtr -> threadsafe=true + rdPtr -> threadsafe=true #define ThreadSafe_End() rdPtr -> threadsafe=false //Macro for simplicity #define Terminate() \ @@ -21,13 +21,13 @@ rdPtr -> LastOutput = outfilename; \ rdPtr -> rRd -> CallEvent(1); \ ThreadSafe_End(); \ - return 1 + return 1 // Please note: Using GenerateEvent in place of PushEvent is not a good idea, being that // access to rdPtr is blocked by ThreadSafe_Start. Example code: -// ThreadSafe_Start(); -// rdPtr -> GenerateEvent(0); -// ThreadSafe_End(); +// ThreadSafe_Start(); +// rdPtr -> GenerateEvent(0); +// ThreadSafe_End(); // If the user retrieves expressions with GenerateEvent, the ThreadSafe_End is not run // until after they retrieve the variables. So of course the while loop in ThreadSafe_Start // runs without stopping. @@ -39,401 +39,416 @@ //Define struct used to export data from actions to threads struct Params { - char para_infilename [MAX_PATH]; // Input file name - char para_outfilename [MAX_PATH]; // Output file name - bool para_UseAppend; // If true, append; otherwise (over)write output - LPRDATA para_rdPtr; //rdPtr (must be given or threads cannot access rdPtr) + TCHAR para_infilename [MAX_PATH]; //Input file name + TCHAR para_outfilename [MAX_PATH]; //Output file name + bool para_UseAppend; //If true, append; otherwise (over)write output + LPRDATA para_rdPtr; //rdPtr (must be given or threads cannot access rdPtr) }; //Calculate file size -unsigned long file_size(char *filename) { - FILE *pFile = NULL; - if (fopen_s(&pFile, filename, "rb")) // Open file - return 0; // If handle has a problem, return 0, eg no file - fseek(pFile, 0, SEEK_END); // If not, goto end of file - unsigned long size = ftell(pFile); //Get position (Must be stored so fclose can be run) - fclose(pFile); // Close file - return size; // Return +unsigned long file_size(TCHAR *filename) { + FILE *pFile = NULL; + if (_tfopen_s(&pFile, filename, _T("rb"))) // Open file + return 0; // If handle has a problem, return 0, eg no file + fseek(pFile, 0, SEEK_END); //If not, goto end of file + unsigned long size = ftell(pFile); //Get position (Must be stored so fclose can be run) + fclose(pFile); //Close file + return size; //Return } -bool FileSizeCheck(char *infilename, LPRDATA rdPtr) +bool FileSizeCheck(TCHAR *infilename, LPRDATA rdPtr) { - if (file_size(infilename) < 1) - { - ThreadSafe_Start(); - rdPtr -> returnstring = "Input file size 0 or nonexistent."; - ThreadSafe_End(); - return true; - } - else - return false; + if (file_size(infilename) < 1) + { + ThreadSafe_Start(); + rdPtr -> returnstring = _T("Input file size 0 or nonexistent."); + ThreadSafe_End(); + return true; + } + else + return false; } bool HandleCheck(FILE *file, gzFile gzfile, LPRDATA rdPtr) { - if (!file) - { - ThreadSafe_Start(); - rdPtr -> returnstring = "Input file malfunctioned."; - gzclose(gzfile); - ThreadSafe_End(); - return true; - } - else if (!gzfile) - { - ThreadSafe_Start(); - rdPtr -> returnstring = "Output file malfunctioned."; - fclose(file); - ThreadSafe_End(); - return true; - } - else - { - return false; - } + if (!file) + { + ThreadSafe_Start(); + rdPtr -> returnstring = _T("Input file malfunctioned."); + gzclose(gzfile); + ThreadSafe_End(); + return true; + } + else if (!gzfile) + { + ThreadSafe_Start(); + rdPtr -> returnstring = _T("Output file malfunctioned."); + fclose(file); + ThreadSafe_End(); + return true; + } + else + { + return false; + } } //Compress a file DWORD WINAPI compress_one_file(Params *pDataArray) -{ - //Open struct and set variables - char *infilename = new char [MAX_PATH]; // Get input file name - strcpy_s(infilename, MAX_PATH, pDataArray -> para_infilename); - char *outfilename = new char [MAX_PATH]; // Get output file name - strcpy_s(outfilename, MAX_PATH, pDataArray -> para_outfilename); - bool UseAppend = pDataArray -> para_UseAppend; // G et whether to append or write - LPRDATA rdPtr = pDataArray -> para_rdPtr; //Get rdPtr - delete pDataArray; // Container is expendable - - char * WriteType = "wb9"; //User is using write (overwriting) - if (UseAppend) WriteType = "ab9"; // User is using append - +{ + //Open struct and set variables + TCHAR *infilename = new TCHAR [MAX_PATH]; //Get input file name + _tcscpy_s(infilename, MAX_PATH, pDataArray -> para_infilename); + TCHAR *outfilename = new TCHAR [MAX_PATH]; //Get output file name + _tcscpy_s(outfilename, MAX_PATH, pDataArray -> para_outfilename); + bool UseAppend = pDataArray -> para_UseAppend; //G et whether to append or write + LPRDATA rdPtr = pDataArray -> para_rdPtr; //Get rdPtr + delete pDataArray; //Container is expendable + + const char * WriteType = "wb9"; //User is using write (overwriting) + if (UseAppend) WriteType = "ab9"; //User is using append + //Check input file size - no handles to close - if (FileSizeCheck(infilename, rdPtr)) {Terminate();} + if (FileSizeCheck(infilename, rdPtr)) {Terminate();} - //Open handles to both files - FILE *infile = fopen(infilename, "rb"); // r = read, b = binary - gzFile outfile = gzopen(outfilename, WriteType); // a = append (or w=write), b = binary, 9 = max compression + //Open handles to both files + FILE *infile = _tfopen(infilename, _T("rb")); //r = read, b = binary + //gzFile outfile = gzopen(outfilename, WriteType); //a = append (or w=write), b = binary, 9 = max compression + gzFile outfile = t_gzopen(outfilename, WriteType); + //Check handles - HandleCheck() automatically closes handles if invalid - if (HandleCheck(infile, outfile, rdPtr)) {Terminate();} + if (HandleCheck(infile, outfile, rdPtr)) {Terminate();} - //Declare variables - unsigned long PreviousOutputSize = 0; // For calculation purposes - signed int num_read = 0; - unsigned long total_read = 0; - ThreadSafe_Start(); - unsigned short tempinbuffersize = rdPtr -> inbuffersize; - ThreadSafe_End(); + //Declare variables + unsigned long PreviousOutputSize = 0; //For calculation purposes + signed int num_read = 0; + unsigned long total_read = 0; + ThreadSafe_Start(); + unsigned short tempinbuffersize = rdPtr -> inbuffersize; + ThreadSafe_End(); //If using Write, output size should not be included in the calculation later. Otherwise: - if (UseAppend) PreviousOutputSize = file_size(outfilename); - - //This makes sure that the buffer is the right size - if too large, set buffer smaller - if ( file_size(infilename) < tempinbuffersize) - tempinbuffersize = (unsigned short)file_size(infilename); - - //Then declare final variable, the buffer - char *inbuffer = new char[tempinbuffersize]; - - //Iteration through the files - while ((num_read = fread(inbuffer, 1, tempinbuffersize, infile)) > 0) - { - total_read += num_read; - gzwrite(outfile, inbuffer, num_read); - } - - //Close thread - fclose(infile); - gzclose(outfile); - delete[] inbuffer, infilename, outfilename; + if (UseAppend) PreviousOutputSize = file_size(outfilename); + + //This makes sure that the buffer is the right size - if too large, set buffer smaller + if ( file_size(infilename) < tempinbuffersize) + tempinbuffersize = (unsigned short)file_size(infilename); + + //Then declare final variable, the buffer + char *inbuffer = new char[tempinbuffersize]; + + //Iteration through the files + while ((num_read = fread(inbuffer, 1, tempinbuffersize, infile)) > 0) + { + total_read += num_read; + gzwrite(outfile, inbuffer, num_read); + } + + //Close thread + fclose(infile); + gzclose(outfile); + delete[] inbuffer, infilename, outfilename; + //delete[] inbuffer; + //delete[] infilename; + //delete[] outfilename; //Set variables afnter completion - ThreadSafe_Start(); + ThreadSafe_Start(); unsigned long saveoutfilesize = file_size(outfilename); unsigned long saveinfilesize = file_size(infilename); - rdPtr -> PercentageDifference = ((file_size(outfilename)-PreviousOutputSize)*(1.0/file_size(infilename)))*100.0; - - stringstream temp; - temp <<"Buffer used: " - << tempinbuffersize - <<", total bytes read: " - << file_size(infilename) - <<", total bytes written: " - << file_size(outfilename)-PreviousOutputSize - <<", compression rate: " - << rdPtr -> PercentageDifference - <<"%."; - rdPtr -> returnstring = temp.str(); - temp.flush(); - rdPtr -> LastOutput = outfilename; - rdPtr -> rRd -> PushEvent(0); - ThreadSafe_End(); - return 0; + rdPtr -> PercentageDifference = ((file_size(outfilename)-PreviousOutputSize)*(1.0/file_size(infilename)))*100.0; + + tstringstream temp; + temp << _T("Buffer used: ") + << tempinbuffersize + << _T(", total bytes read: ") + << file_size(infilename) + << _T(", total bytes written: ") + << file_size(outfilename)-PreviousOutputSize + << _T(", compression rate: ") + << rdPtr -> PercentageDifference + << _T("%."); + rdPtr -> returnstring = temp.str(); + temp.flush(); + //temp.str(_T("")); + //temp.clear(); + rdPtr -> LastOutput = outfilename; + rdPtr -> rRd -> PushEvent(0); + ThreadSafe_End(); + return 0; } //Decompress a file DWORD WINAPI decompress_one_file(Params *pDataArray) -{ - //Open struct and set variables - char *infilename = new char [MAX_PATH]; // Get input file name - strcpy_s(infilename, MAX_PATH, pDataArray -> para_infilename); - char *outfilename = new char [MAX_PATH]; // Get output file name - strcpy_s(outfilename, MAX_PATH, pDataArray -> para_outfilename); - bool UseAppend = pDataArray -> para_UseAppend; // Get whether to append or write - LPRDATA rdPtr = pDataArray -> para_rdPtr; //Get rdPtr - delete pDataArray; // Container is expendable - - char * WriteType = "wb"; //User is using write (overwriting) - if (UseAppend) WriteType = "ab"; // User is using append - - if (FileSizeCheck(infilename, rdPtr)) {Terminate();} - //Open handles to both files - gzFile infile = gzopen(infilename, "rb"); // r = read, b = binary - FILE *outfile = fopen(outfilename, WriteType); // a = append or w = write, b = binary - - if (HandleCheck(outfile, infile, rdPtr)) {Terminate();} - //Declare variables - unsigned long PreviousOutputSize = 0; // For calculation purposes - int num_read = 0; - unsigned long total_read = 0; - ThreadSafe_Start(); - unsigned short tempinbuffersize = rdPtr -> inbuffersize; - ThreadSafe_End(); - +{ + //Open struct and set variables + TCHAR *infilename = new TCHAR [MAX_PATH]; //Get input file name + _tcscpy_s(infilename, MAX_PATH, pDataArray -> para_infilename); + TCHAR *outfilename = new TCHAR [MAX_PATH]; //Get output file name + _tcscpy_s(outfilename, MAX_PATH, pDataArray -> para_outfilename); + bool UseAppend = pDataArray -> para_UseAppend; //Get whether to append or write + LPRDATA rdPtr = pDataArray -> para_rdPtr; //Get rdPtr + delete pDataArray; //Container is expendable + + TCHAR * WriteType = _T("wb"); //User is using write (overwriting) + if (UseAppend) WriteType = _T("ab"); //User is using append + + if (FileSizeCheck(infilename, rdPtr)) {Terminate();} + //Open handles to both files + //gzFile infile = gzopen(infilename, "rb"); //r = read, b = binary + + gzFile infile = t_gzopen(infilename, "rb"); + + FILE *outfile = _tfopen(outfilename, WriteType); //a = append or w = write, b = binary + + if (HandleCheck(outfile, infile, rdPtr)) {Terminate();} + //Declare variables + unsigned long PreviousOutputSize = 0; //For calculation purposes + int num_read = 0; + unsigned long total_read = 0; + ThreadSafe_Start(); + unsigned short tempinbuffersize = rdPtr -> inbuffersize; + ThreadSafe_End(); + //If using Write, output size should not be included in the calculation later. Otherwise: - if (UseAppend) PreviousOutputSize = file_size(outfilename); - + if (UseAppend) PreviousOutputSize = file_size(outfilename); + //This makes sure that the buffer is the right size - if too large, set buffer smaller - if ( file_size(infilename) < tempinbuffersize) - tempinbuffersize = (unsigned short)file_size(infilename); - - //Then declare final variable, the buffer - char *inbuffer = new char[tempinbuffersize]; - - //Iteration through the files - while ((num_read = gzread(infile, inbuffer, tempinbuffersize)) > 0) - { - total_read += num_read; - fwrite(inbuffer, 1, num_read, outfile); - } - - //Close thread - gzclose(infile); - fclose(outfile); - delete[] inbuffer, infilename, outfilename; - - //Set variables after completion - ThreadSafe_Start(); - rdPtr -> PercentageDifference = ((file_size(outfilename)-PreviousOutputSize)*(1.0/file_size(infilename)))*100.0; - stringstream temp; - temp <<"Buffer used: " - << tempinbuffersize - <<", total bytes read: " - << file_size(infilename) - <<", total bytes written: " - << file_size(outfilename)-PreviousOutputSize - <<", decompression rate: " - << rdPtr -> PercentageDifference - <<"%."; - rdPtr -> returnstring = temp.str(); - temp.flush(); - rdPtr -> LastOutput = outfilename; - rdPtr -> rRd -> CallEvent(0); - ThreadSafe_End(); - return 0; + if ( file_size(infilename) < tempinbuffersize) + tempinbuffersize = (unsigned short)file_size(infilename); + + //Then declare final variable, the buffer + TCHAR *inbuffer = new TCHAR[tempinbuffersize]; + + //Iteration through the files + while ((num_read = gzread(infile, inbuffer, tempinbuffersize)) > 0) + { + total_read += num_read; + fwrite(inbuffer, 1, num_read, outfile); + } + + //Close thread + gzclose(infile); + fclose(outfile); + delete[] inbuffer, infilename, outfilename; + //delete[] inbuffer; + //delete[] infilename; + //delete[] outfilename; + + //Set variables after completion + ThreadSafe_Start(); + rdPtr -> PercentageDifference = ((file_size(outfilename)-PreviousOutputSize)*(1.0/file_size(infilename)))*100.0; + tstringstream temp; + temp <<_T("Buffer used: ") + << tempinbuffersize + << _T(", total bytes read: ") + << file_size(infilename) + << _T(", total bytes written: ") + << file_size(outfilename)-PreviousOutputSize + << _T(", decompression rate: ") + << rdPtr -> PercentageDifference + << _T("%."); + rdPtr -> returnstring = temp.str(); + temp.flush(); + //temp.str(_T("")); + //temp.clear(); + rdPtr -> LastOutput = outfilename; + rdPtr -> rRd -> CallEvent(0); + ThreadSafe_End(); + return 0; } // ============================================================================ // // CONDITIONS -// +// // ============================================================================ CONDITION( - /* ID */ 0, - /* Name */ "%o: On success", - /* Flags */ 0, - /* Params */ (0) + /* ID */ 0, + /* Name */ "%o: On success", + /* Flags */ 0, + /* Params */ (0) ) { - return true; + return true; } CONDITION( - /* ID */ 1, - /* Name */ "%o: On error", - /* Flags */ 0, - /* Params */ (0) + /* ID */ 1, + /* Name */ "%o: On error", + /* Flags */ 0, + /* Params */ (0) ) { - return true; + return true; } // ============================================================================ // // ACTIONS -// +// // ============================================================================ -ACTION( // Old compress function - /* ID */ 0, - /* Name */ "<> Compress a file (%0) --> (%1)", - /* Flags */ 0, - /* Params */ (2, PARAM_STRING, "Input file:", PARAM_STRING, "Output file:") +ACTION( //Old compress function + /* ID */ 0, + /* Name */ "<> Compress a file (%0) --> (%1)", + /* Flags */ 0, + /* Params */ (2, PARAM_STRING, _T("Input file:"), PARAM_STRING, _T("Output file:")) ) { //Old version of compress action: Notify user - MessageBoxA(NULL, "Sorry to interrupt your programming, but you have\nan old \"Compress file\" action in ZlibStream which needs replacing.\nClick the ZlibStream icon in your event editor to see all the events\nZlibStream is in.", "Darkwire Software - Old Event Notice", MB_OK); + MessageBox(NULL, _T("Sorry to interrupt your programming, but you have\nan old \"Compress file\" action in ZlibStream which needs replacing.\nClick the ZlibStream icon in your event editor to see all the events\nZlibStream is in."), _T("Darkwire Software - Old Event Notice"), MB_OK); } -ACTION( // Old decompress function - /* ID */ 1, - /* Name */ "<> Decompress a file (%0) --> (%1)", - /* Flags */ 0, - /* Params */ (2, PARAM_STRING, "Input file:", PARAM_STRING, "Output file:") +ACTION( //Old decompress function + /* ID */ 1, + /* Name */ "<> Decompress a file (%0) --> (%1)", + /* Flags */ 0, + /* Params */ (2, PARAM_STRING, _T("Input file:"), PARAM_STRING, _T("Output file:")) ) { - //Old version of decompress action: Notify user - MessageBoxA(NULL, "Sorry to interrupt your programming, but you have\nan old \"Decompress file\" action in ZlibStream which needs replacing.\nClick the ZlibStream icon in your event editor to see all the events\nZlibStream is in.", "Darkwire Software - Old Event Notice", MB_OK); + //Old version of decompress action: Notify user + MessageBox(NULL, _T("Sorry to interrupt your programming, but you have\nan old \"Decompress file\" action in ZlibStream which needs replacing.\nClick the ZlibStream icon in your event editor to see all the events\nZlibStream is in."), _T("Darkwire Software - Old Event Notice"), MB_OK); } ACTION( - /* ID */ 2, - /* Name */ "Set buffer size to %0 bytes", - /* Flags */ 0, - /* Params */ (1, PARAM_NUMBER, "Buffer size (1 to 16384 bytes):") + /* ID */ 2, + /* Name */ "Set buffer size to %0 bytes", + /* Flags */ 0, + /* Params */ (1, PARAM_NUMBER, _T("Buffer size (1 to 16384 bytes):")) ) { - int p1 = Param(TYPE_INT); - ThreadSafe_Start(); - if (p1 > 0 && p1 < 16385) - rdPtr -> inbuffersize = p1; - else - { - rdPtr -> returnstring = "Buffer is an invalid size. Must be between 0 and 16385 (exclusive)."; - rdPtr -> rRd -> CallEvent(1); - } - ThreadSafe_End(); + int p1 = Param(TYPE_INT); + ThreadSafe_Start(); + if (p1 > 0 && p1 < 16385) + rdPtr -> inbuffersize = p1; + else + { + rdPtr -> returnstring = _T("Buffer is an invalid size. Must be between 0 and 16385 (exclusive)."); + rdPtr -> rRd -> CallEvent(1); + } + ThreadSafe_End(); } ACTION( - /* ID */ 3, - /* Name */ "Compress a file (%0) --> (%1), append = %2", - /* Flags */ 0, - /* Params */ (3, PARAM_STRING, "Input file:", PARAM_STRING, "Output file:", PARAM_NUMBER, "Append if output file already exists? (0 for overwriting, 1 for adding to end)") + /* ID */ 3, + /* Name */ "Compress a file (%0) --> (%1), append = %2", + /* Flags */ 0, + /* Params */ (3, PARAM_STRING, _T("Input file:"), PARAM_STRING, _T("Output file:"), PARAM_NUMBER, _T("Append if output file already exists? (0 for overwriting, 1 for adding to end)")) ) { - //Retrieve variables from parameters - char *p1 = (char *) Param(TYPE_STRING); - char *p2 = (char *) Param(TYPE_STRING); - int p3 = Param(TYPE_INT); - + //Retrieve variables from parameters + TCHAR *p1 = (TCHAR *) Param(TYPE_STRING); + TCHAR *p2 = (TCHAR *) Param(TYPE_STRING); + int p3 = Param(TYPE_INT); + //Set bool for simplicity bool temp = false; if (p3 != 0) temp = true; - //Declare struct and set variables in struct - Params* Parameters = new Params; // Declaration - strcpy_s(Parameters -> para_infilename, MAX_PATH, p1); // Pass the input file name - strcpy_s(Parameters -> para_outfilename, MAX_PATH, p2); // Pass the output file name - Parameters -> para_UseAppend = temp; // Pass the append command - Parameters -> para_rdPtr = rdPtr; // Pass rdPtr - + //Declare struct and set variables in struct + Params* Parameters = new Params; //Declaration + _tcscpy_s(Parameters -> para_infilename, MAX_PATH, p1); //Pass the input file name + _tcscpy_s(Parameters -> para_outfilename, MAX_PATH, p2); //Pass the output file name + Parameters -> para_UseAppend = temp; //Pass the append command + Parameters -> para_rdPtr = rdPtr; //Pass rdPtr + //Create thread - CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&compress_one_file, Parameters, 0, NULL); + CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&compress_one_file, Parameters, 0, NULL); } ACTION( - /* ID */ 4, - /* Name */ "Decompress a file (%0) --> (%1), append = %2", - /* Flags */ 0, - /* Params */ (3, PARAM_STRING, "Input file:", PARAM_STRING, "Output file:", PARAM_NUMBER, "Append if output file already exists? (0 for overwriting, 1 for adding to end)") + /* ID */ 4, + /* Name */ "Decompress a file (%0) --> (%1), append = %2", + /* Flags */ 0, + /* Params */ (3, PARAM_STRING, _T("Input file:"), PARAM_STRING, _T("Output file:"), PARAM_NUMBER, _T("Append if output file already exists? (0 for overwriting, 1 for adding to end)")) ) { - //Retrieve variables from parameters - char *p1 = (char *) Param(TYPE_STRING); - char *p2 = (char *) Param(TYPE_STRING); - int p3 = Param(TYPE_INT); - + //Retrieve variables from parameters + TCHAR *p1 = (TCHAR *) Param(TYPE_STRING); + TCHAR *p2 = (TCHAR *) Param(TYPE_STRING); + int p3 = Param(TYPE_INT); + //Set bool for simplicity bool temp = false; if (p3 != 0) temp = true; - //Declare struct and set variables in struct - Params* Parameters = new Params; // Declaration - strcpy_s(Parameters -> para_infilename, MAX_PATH, p1); // Pass the input file name - strcpy_s(Parameters -> para_outfilename, MAX_PATH, p2); // Pass the output file name - Parameters -> para_UseAppend = temp; // Pass the append command - Parameters -> para_rdPtr = rdPtr; // Pass rdPtr - - //Create thread - CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&decompress_one_file, Parameters, 0, NULL); + //Declare struct and set variables in struct + Params* Parameters = new Params; //Declaration + _tcscpy_s(Parameters -> para_infilename, MAX_PATH, p1); //Pass the input file name + _tcscpy_s(Parameters -> para_outfilename, MAX_PATH, p2); //Pass the output file name + Parameters -> para_UseAppend = temp; //Pass the append command + Parameters -> para_rdPtr = rdPtr; //Pass rdPtr + + //Create thread + CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&decompress_one_file, Parameters, 0, NULL); } // ============================================================================ // // EXPRESSIONS -// +// // ============================================================================ EXPRESSION( - /* ID */ 0, - /* Name */ "ReturnedCode(", - /* Flags */ 0, - /* Params */ (0) + /* ID */ 0, + /* Name */ "ReturnedCode(", + /* Flags */ 0, + /* Params */ (0) ) { - //Deprecated variable: Notify user - MessageBoxA(NULL, "Sorry to interrupt your programming, but you have\nan old \"ReturnedCode()\" expression from ZlibStream which is removed.\nClick the ZlibStream icon in your event editor to see all the events\nZlibStream is in.", "Darkwire Software - Old Expression Notice", MB_OK); + //Deprecated variable: Notify user + MessageBox(NULL, _T("Sorry to interrupt your programming, but you have\nan old \"ReturnedCode()\" expression from ZlibStream which is removed.\nClick the ZlibStream icon in your event editor to see all the events\nZlibStream is in."), _T("Darkwire Software - Old Expression Notice"), MB_OK); return false; } EXPRESSION( - /* ID */ 1, - /* Name */ "ReturnedString$(", - /* Flags */ EXPFLAG_STRING, - /* Params */ (0) + /* ID */ 1, + /* Name */ "ReturnedString$(", + /* Flags */ EXPFLAG_STRING, + /* Params */ (0) ) { - ThreadSafe_Start(); - string temp = rdPtr -> returnstring; - ThreadSafe_End(); - ReturnStringSafe(temp.c_str()); + ThreadSafe_Start(); + tstring temp = rdPtr -> returnstring; + ThreadSafe_End(); + ReturnStringSafe(temp.c_str()); } EXPRESSION( - /* ID */ 2, - /* Name */ "BufferSize(", - /* Flags */ 0, - /* Params */ (0) + /* ID */ 2, + /* Name */ "BufferSize(", + /* Flags */ 0, + /* Params */ (0) ) { - ThreadSafe_Start(); - unsigned short temp = rdPtr -> inbuffersize; - ThreadSafe_End(); - return temp; + ThreadSafe_Start(); + unsigned short temp = rdPtr -> inbuffersize; + ThreadSafe_End(); + return temp; } EXPRESSION( - /* ID */ 3, - /* Name */ "Percentage(", - /* Flags */ EXPFLAG_DOUBLE, - /* Params */ (0) + /* ID */ 3, + /* Name */ "Percentage(", + /* Flags */ EXPFLAG_DOUBLE, + /* Params */ (0) ) { ThreadSafe_Start(); double temp = rdPtr -> PercentageDifference; - ThreadSafe_End(); + ThreadSafe_End(); //This casts to 2 decimal places - char sprintfdest[20]; - sprintf(sprintfdest,"%.2f", temp); - float temp2 = (float)atof(sprintfdest); + TCHAR sprintfdest[20]; + _stprintf(sprintfdest,_T("%.2f"), temp); + float temp2 = (float)_tstof(sprintfdest); //Voila - ReturnFloat(temp2); + ReturnFloat(temp2); } EXPRESSION( - /* ID */ 4, - /* Name */ "LastOutputFile$(", - /* Flags */ EXPFLAG_STRING, - /* Params */ (0) + /* ID */ 4, + /* Name */ "LastOutputFile$(", + /* Flags */ EXPFLAG_STRING, + /* Params */ (0) ) { - ThreadSafe_Start(); - string temp = rdPtr -> LastOutput; - ThreadSafe_End(); - ReturnStringSafe(temp.c_str()); + ThreadSafe_Start(); + tstring temp = rdPtr -> LastOutput; + ThreadSafe_End(); + ReturnStringSafe(temp.c_str()); } \ No newline at end of file diff --git a/rSDK/ZlibStream/Runtime.cpp b/rSDK/ZlibStream/Runtime.cpp index 97fe6a47..38983111 100644 --- a/rSDK/ZlibStream/Runtime.cpp +++ b/rSDK/ZlibStream/Runtime.cpp @@ -1,7 +1,7 @@ // ============================================================================ // // This file contains routines that are handled during the Runtime -// +// // ============================================================================ // Common Include @@ -10,7 +10,7 @@ // GetRunObjectDataSize // -------------------- // Returns the size of the runtime datazone of the object -// +// short WINAPI DLLExport GetRunObjectDataSize(fprh rhPtr, LPEDATA edPtr) { @@ -22,19 +22,19 @@ short WINAPI DLLExport GetRunObjectDataSize(fprh rhPtr, LPEDATA edPtr) // CreateRunObject // --------------- // The routine where the object is actually created -// +// short WINAPI DLLExport CreateRunObject(LPRDATA rdPtr, LPEDATA edPtr, fpcob cobPtr) { // Do some rSDK stuff - new (rdPtr) RUNDATA; // Call rdPtr's Constructor + new (rdPtr) RUNDATA; //Call rdPtr's Constructor #include "rCreateRunObject.h" /* - This routine runs when your object is created, as you might have guessed. - It is here that you must transfer any data you need in rdPtr from edPtr, - because after this has finished you cannot access it again! - Also, if you have anything to initialise (e.g. dynamic arrays, surface objects) - you should do it here, and free your resources in DestroyRunObject. - See Graphic_Object_Ex.txt for an example of what you may put here. + This routine runs when your object is created, as you might have guessed. + It is here that you must transfer any data you need in rdPtr from edPtr, + because after this has finished you cannot access it again! + Also, if you have anything to initialise (e.g. dynamic arrays, surface objects) + you should do it here, and free your resources in DestroyRunObject. + See Graphic_Object_Ex.txt for an example of what you may put here. */ // No errors @@ -46,13 +46,13 @@ short WINAPI DLLExport CreateRunObject(LPRDATA rdPtr, LPEDATA edPtr, fpcob cobPt // DestroyRunObject // ---------------- // Destroys the run-time object -// +// short WINAPI DLLExport DestroyRunObject(LPRDATA rdPtr, long fast) { /* - When your object is destroyed (either with a Destroy action or at the end of - the frame) this routine is called. You must free any resources you have allocated! - See Graphic_Object_Ex.txt for an example of what you may put here. + When your object is destroyed (either with a Destroy action or at the end of + the frame) this routine is called. You must free any resources you have allocated! + See Graphic_Object_Ex.txt for an example of what you may put here. */ // No errors delete rdPtr->rRd; @@ -63,34 +63,34 @@ short WINAPI DLLExport DestroyRunObject(LPRDATA rdPtr, long fast) // HandleRunObject // ---------------- // Called (if you want) each loop, this routine makes the object live -// +// short WINAPI DLLExport HandleRunObject(LPRDATA rdPtr) { - //Needs to add fixed value to vector array + //Needs to add fixed value to vector array /* - If your extension will draw to the MMF window you should first - check if anything about its display has changed : + If your extension will draw to the MMF window you should first + check if anything about its display has changed : - return rdPtr->roc.rcChanged?REFLAG_DISPLAY:0; + return rdPtr->roc.rcChanged?REFLAG_DISPLAY:0; - You will also need to make sure you change this flag yourself - to 1 whenever you want to redraw your object - - If your extension won't draw to the window, but it still needs - to do something every MMF loop use : + You will also need to make sure you change this flag yourself + to 1 whenever you want to redraw your object + + If your extension won't draw to the window, but it still needs + to do something every MMF loop use : return 0; - If you don't need to do something every loop, use : + If you don't need to do something every loop, use : return REFLAG_ONESHOT; - This doesn't mean this function can never run again. If you want MMF - to handle your object again (causing this code to run) use this function: + This doesn't mean this function can never run again. If you want MMF + to handle your object again (causing this code to run) use this function: rdPtr->rRd->Rehandle(); - At the end of the loop this code will run + At the end of the loop this code will run */ return 0; } @@ -99,12 +99,12 @@ short WINAPI DLLExport HandleRunObject(LPRDATA rdPtr) // DisplayRunObject // ---------------- // Draw the object in the application screen. -// +// short WINAPI DLLExport DisplayRunObject(LPRDATA rdPtr) { /* - If you return REFLAG_DISPLAY in HandleRunObject this routine will run. - See Graphic_Object_Ex.txt for an example of what you may put here. + If you return REFLAG_DISPLAY in HandleRunObject this routine will run. + See Graphic_Object_Ex.txt for an example of what you may put here. */ // Ok return 0; @@ -118,7 +118,7 @@ short WINAPI DLLExport DisplayRunObject(LPRDATA rdPtr) // in DisplayRunObject too, but this is automatically done if you implement // GetRunObjectSurface (MMF applies the ink effect to the transition). // -// Note: do not forget to enable the function in the .def file +// Note: do not forget to enable the function in the .def file // if you remove the comments below. /* cSurface* WINAPI DLLExport GetRunObjectSurface(LPRDATA rdPtr) @@ -135,7 +135,7 @@ cSurface* WINAPI DLLExport GetRunObjectSurface(LPRDATA rdPtr) // // Should return NULL if the object is not transparent. // -// Note: do not forget to enable the function in the .def file +// Note: do not forget to enable the function in the .def file // if you remove the comments below. // /* @@ -179,7 +179,7 @@ cSurface* WINAPI DLLExport GetRunObjectCollisionMask(LPRDATA rdPtr, LPARAM lPara // PauseRunObject // ---------------- // Enters the pause mode -// +// short WINAPI DLLExport PauseRunObject(LPRDATA rdPtr) { // Ok @@ -202,7 +202,7 @@ short WINAPI DLLExport ContinueRunObject(LPRDATA rdPtr) // ============================================================================ // // START APP / END APP / START FRAME / END FRAME routines -// +// // ============================================================================ // ------------------- @@ -210,7 +210,7 @@ short WINAPI DLLExport ContinueRunObject(LPRDATA rdPtr) // ------------------- // Called when the application starts or restarts. // Useful for storing global data -// +// void WINAPI DLLExport StartApp(mv _far *mV, CRunApp* pApp) { // Example @@ -228,7 +228,7 @@ void WINAPI DLLExport StartApp(mv _far *mV, CRunApp* pApp) // EndApp // ------------------- // Called when the application ends. -// +// void WINAPI DLLExport EndApp(mv _far *mV, CRunApp* pApp) { // Example @@ -246,7 +246,7 @@ void WINAPI DLLExport EndApp(mv _far *mV, CRunApp* pApp) // StartFrame // ------------------- // Called when the frame starts or restarts. -// +// void WINAPI DLLExport StartFrame(mv _far *mV, DWORD dwReserved, int nFrameIndex) { @@ -256,7 +256,7 @@ void WINAPI DLLExport StartFrame(mv _far *mV, DWORD dwReserved, int nFrameIndex) // EndFrame // ------------------- // Called when the frame ends. -// +// void WINAPI DLLExport EndFrame(mv _far *mV, DWORD dwReserved, int nFrameIndex) { @@ -265,17 +265,17 @@ void WINAPI DLLExport EndFrame(mv _far *mV, DWORD dwReserved, int nFrameIndex) // ============================================================================ // // TEXT ROUTINES (if OEFLAG_TEXT) -// +// // ============================================================================ // ------------------- // GetRunObjectFont // ------------------- // Return the font used by the object. -// +// /* - // Note: do not forget to enable the functions in the .def file + // Note: do not forget to enable the functions in the .def file // if you remove the comments below. void WINAPI GetRunObjectFont(LPRDATA rdPtr, LOGFONT* pLf) @@ -289,7 +289,7 @@ void WINAPI GetRunObjectFont(LPRDATA rdPtr, LOGFONT* pLf) // SetRunObjectFont // ------------------- // Change the font used by the object. -// +// void WINAPI SetRunObjectFont(LPRDATA rdPtr, LOGFONT* pLf, RECT* pRc) { // Example @@ -309,7 +309,7 @@ void WINAPI SetRunObjectFont(LPRDATA rdPtr, LOGFONT* pLf, RECT* pRc) // GetRunObjectTextColor // --------------------- // Return the text color of the object. -// +// COLORREF WINAPI GetRunObjectTextColor(LPRDATA rdPtr) { // Example @@ -321,7 +321,7 @@ COLORREF WINAPI GetRunObjectTextColor(LPRDATA rdPtr) // SetRunObjectTextColor // --------------------- // Change the text color of the object. -// +// void WINAPI SetRunObjectTextColor(LPRDATA rdPtr, COLORREF rgb) { // Example @@ -335,7 +335,7 @@ void WINAPI SetRunObjectTextColor(LPRDATA rdPtr, COLORREF rgb) // ============================================================================ // // DEBUGGER ROUTINES -// +// // ============================================================================ // ----------------- @@ -357,14 +357,14 @@ LPWORD WINAPI DLLExport GetDebugTree(LPRDATA rdPtr) // ----------------- // This routine returns the text of a given item. // -void WINAPI DLLExport GetDebugItem(LPSTR pBuffer, LPRDATA rdPtr, int id) +void WINAPI DLLExport GetDebugItem(LPTSTR pBuffer, LPRDATA rdPtr, int id) { #if !defined(RUN_ONLY) // Example // ------- /* - char temp[DB_BUFFERSIZE]; + TCHAR temp[DB_BUFFERSIZE]; switch (id) { @@ -410,16 +410,16 @@ void WINAPI DLLExport EditDebugItem(LPRDATA rdPtr, int id) case DB_CURRENTSTRING: { EditDebugInfo dbi; - char buffer[256]; + TCHAR buffer[256]; dbi.pText=buffer; dbi.lText=TEXT_MAX; dbi.pTitle=NULL; - strcpy(buffer, rdPtr->text); + _tcscpy(buffer, rdPtr->text); long ret=callRunTimeFunction(rdPtr, RFUNCTION_EDITTEXT, 0, (LPARAM)&dbi); if (ret) - strcpy(rdPtr->text, dbi.pText); + _tcscpy(rdPtr->text, dbi.pText); } break; case DB_CURRENTVALUE: diff --git a/rSDK/ZlibStream/UpgradeLog.htm b/rSDK/ZlibStream/UpgradeLog.htm new file mode 100644 index 0000000000000000000000000000000000000000..3f20e7509a787128c56e5294a7efbb9d14834ce0 GIT binary patch literal 31898 zcmeI5`%@H4mVoQm-H81kdUWUNT?ct7qIbL#JQaBef_QbjF@e10A<{gZnf=pu_xmzQ ztE*|MsTOc2!szI(s;tbDC(k=iW>x?1|NJ@oLpGYd%to?>>}@uijb*iLBRj};vhD2G z>_4)9&#ckKrTrR*qM%~m*H%l5NR)T(8NoNZ@Mv%6UjpWf_2_A~W9aQ6^6PqNKy zm*Xn6cKJP^h0r4G8qia3wd^GHx=TM#IIDAA50Gz#K6WXsXUo)I22DzNE?t{dRw)!7l-)4WR6Ufz)~m%mYT&1!V^+;k1yQ zf_Wn@2jG7IMOW$NZyY}{{t39Bk4Wy?^JW;|E3Wo9+ox3zeJ7sPXkYwH(_)=^OVo^Q zYguD!<*3*~&Uc5}5hHn2=lV3@_batqwP}WtuDi4UqQx+{t^h$vO_2V?)mj)sjWVU6 z##e4{g0ELA++BvsN`>V$V0BmOU0Ju^Dj5I0QtdR(4^VhH+X}Q+zjo>O2^inb#zjS#66Y+9WMT7hmsf(pP8W-viPLAMMq8z_O=9NMgSa3?Vt% zs&M`p_*X@mqWnLH0**mC^wMup3$$s;cFW~lAH-K&Ey*oJRV~<{&nh@~rUB=<)C+z0 zu%psB9`llP)|o`)@~cJs0`=r(ALHDEQk}tUrNPl>HR|3Ny`*oa{mA1e3thn*AAoc8 zjI}TVDRvuA)_eBt<61Ae%~)3$T{R1wEL5`<>4Pi1SSF91jpSRkDPfj#^B7L*uZ%q8 z=q{t)4>o7JB92#~sgdrD{_4D@-XcPazWE5uSF_^~326C@#Xd0(J)1hMjxTc^y>Ok9 z>U!LF1A3fuqfxhdv%zoBtsLgnaX3j&E4%aXtKF$(`T6&e@~e=<{vbc)l2|9|_;BWJ z8|6%I?LFi38vaDd+e0EhWgpKZQav*Y(BoH^$^ILa$*Y&2TsDjHuH1C$ORmZ?Ubk#t z#^)U%D>0H28zXZg$7;INsSY@si{4ks-R9%WFV3Ev+Zr2f1&KDERep0XS6!BuZa|WA z{Pb_P@xc99);>J_*bULtNd5z~lUjKkn*33<*y7+Ttm}_2oy+BMQyuMe#??3{s2u$_-f87>OHWF9)e;mJR1wdmVDFJ#|y08IRSdo22@DfY#eY5s4LcfDG%jdp#C{LEjynf7* z8V$vEmc=YvjX2)?qgT#9Q{K3GG;}}U8)-RpM#<~<80X`oZ_RaHES+P>e*BDfs9}jG zT_K-yb>5=7^ta;H6C^lE!1v%>r;%;4g%@*f9IN8zF`v$CxF!~3CM|^)#k$eL2*Z3p zwK>84FbY@C8pmXQ`}$=t(XH95(6ZzR(BafP*r%;Cv z;f(o2?`;LRhxqb*PVDM$jDj2Ic5#Lz7FDx4_nYvRlS_Xdw2hI!$-;S+B5Q5mF;}NS1`;0|Ib78O-fpsh#lCNvqj5yl_}MA#hk~WA zvGN}+og=SGz58EV&m)V=d}6#YhMo%5+{#MWN08T?;GWr$vN~@9$9KbQWWBWJ775i4O~6zbRM4|>Ra;F(Hv$qolJV(D!T51UhXV%w}LCM&OwW1 z)nu@|FLyAx=91P#p9DF%**L8zpJoc8)W^L@xvXB74qU%H#&~oFS{of}%SSnnYwJcB z>Y_PQ?-rw+onQlF9P%O5`h-;9r`80uQ&uIPpTz7)^n>p9ale;-SGZDAjf`vH=1-k} zB+r{_8B;aVd^31!_wCg}Tk|IFYSf<8Sj7-?af;_!kGOLz!HeshE5Qck7+c2?n`w#r zZmQb1B-fF)e?>?9{06*jM!X1Qb5HJulB!xZkM6VdP8a*(V&4Po$t>EtiLWDma)AxK zO>1{(X=QFhgYy~oF7D~YrJMYY`#|rW;j=_pe!m-ScURRf0h06(r#}ICo^vCsnE#ft zx7k1XOUM`+ZQag(2X?2FyDq#pq5d#?GF~ASJ=rAt)ZEK9boQBHRIic9F@D$2%7(w* z9m?jIvktM_Hq~FlZg&$GZhS2nfy={i<_*W`vr<ON& z^JDa|2yPE({h7#m0f~9dcZA

|=UP6xmCpwNAh9vKO=(rYHC2ZGzQX%11)q%RqjN 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

|=UP6xmCpwNAh9vKO=(rYHC2ZGzQX%11)q%RqjN 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 Date: Tue, 23 Jun 2026 01:54:24 -0700 Subject: [PATCH 02/17] Add VOLINFO Unicode --- MMF2SDK/VOLINFO/Ext.rc | 214 ----- MMF2SDK/VOLINFO/VOLINFO.vcxproj | 103 --- MMF2SDK_Unicode/VOLINFO/.gitattributes | 22 + MMF2SDK_Unicode/VOLINFO/.gitignore | 163 ++++ {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/Common.h | 16 +- .../VOLINFO/Edittime.cpp | 113 +-- {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/Ext.def | 0 MMF2SDK_Unicode/VOLINFO/Ext.rc | 215 +++++ .../VOLINFO/General.cpp | 63 +- MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.sln | 40 + .../VOLINFO/MMF2SDK - VOLINFO.vcproj | 807 ++++++++++++++++++ .../VOLINFO/MMF2SDK - VOLINFO.vcxproj | 678 +++++++++++++++ .../VOLINFO/MMF2SDK - VOLINFO.vcxproj.filters | 12 +- {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/Main.cpp | 22 +- {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/Main.h | 20 +- .../VOLINFO/Resource.h | 20 +- .../VOLINFO/Runtime.cpp | 100 +-- .../VOLINFO/VOLINFO Example.mfa | Bin .../VOLINFO/res/EXTICON.BMP | Bin .../VOLINFO/res/EXTIMG.BMP | Bin 20 files changed, 2117 insertions(+), 491 deletions(-) delete mode 100644 MMF2SDK/VOLINFO/Ext.rc delete mode 100644 MMF2SDK/VOLINFO/VOLINFO.vcxproj create mode 100644 MMF2SDK_Unicode/VOLINFO/.gitattributes create mode 100644 MMF2SDK_Unicode/VOLINFO/.gitignore rename {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/Common.h (87%) rename {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/Edittime.cpp (95%) rename {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/Ext.def (100%) create mode 100644 MMF2SDK_Unicode/VOLINFO/Ext.rc rename {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/General.cpp (90%) create mode 100644 MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.sln create mode 100644 MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcproj create mode 100644 MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcxproj rename MMF2SDK/VOLINFO/VOLINFO.vcxproj.filters => MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcxproj.filters (98%) rename {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/Main.cpp (88%) rename {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/Main.h (86%) rename {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/Resource.h (78%) rename {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/Runtime.cpp (86%) rename {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/VOLINFO Example.mfa (100%) rename {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/res/EXTICON.BMP (100%) rename {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/res/EXTIMG.BMP (100%) diff --git a/MMF2SDK/VOLINFO/Ext.rc b/MMF2SDK/VOLINFO/Ext.rc deleted file mode 100644 index 99921718..00000000 --- a/MMF2SDK/VOLINFO/Ext.rc +++ /dev/null @@ -1,214 +0,0 @@ -//Microsoft Developer Studio generated resource script. -// -#include "resource.h" - -// Wraps str into double-quotes, like "str". This function cannot be defined via /D. -#define sub_asStr(str) "" #str "" -#define asStr(str) sub_asStr(str) - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "..\Inc\ccx.h" -#define APSTUDIO_HIDDEN_SYMBOLS -#include -#undef APSTUDIO_HIDDEN_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif // _WIN32 - -#ifndef _MAC -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -1 VERSIONINFO - FILEVERSION 1,0,0,EXTENSION_VERSION - PRODUCTVERSION 1,0,0,EXTENSION_VERSION - FILEFLAGSMASK VS_FFI_FILEFLAGSMASK -#ifdef _DEBUG - FILEFLAGS VS_FF_DEBUG -#else - FILEFLAGS 0 -#endif - FILEOS VOS__WINDOWS32 - FILETYPE VFT_DLL - FILESUBTYPE VFT2_UNKNOWN -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904e4" - BEGIN - VALUE "ProductName", PROJECT_NAME "\0" - VALUE "CompanyName", COMPANY_NAME "\0" - VALUE "FileDescription", PROJECT_NAME ", " asStr(CONFIG) " build " asStr(EXTENSION_VERSION) ".\0" - VALUE "FileVersion", "2.00" "\0" - VALUE "InternalName", PROJECT_NAME ".mfx\0" - VALUE "LegalCopyright", "Copyright \xA9 " YEAR " " COMPANY_NAME "\0" - VALUE "OriginalFilename", PROJECT_NAME ".mfx\0" - VALUE "ProductVersion", "Build " asStr(EXTENSION_VERSION) ", date " BUILD_DATE ".\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x0409, 1252 - END -END - -#endif // !_MAC - - -///////////////////////////////////////////////////////////////////////////// -// -// Data -// - -KPX_MAGICNUMBER RCDATA -BEGIN - 0x9978, 0x8989 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -#if defined(APSTUDIO_INVOKED) || defined(EDITOR) -#if defined(APSTUDIO_INVOKED) -EXO_ICON$(EDITOR) BITMAP "RES\\EXTICON.BMP" -#else -EXO_ICON BITMAP "RES\\EXTICON.BMP" -#endif -#endif -#if defined(APSTUDIO_INVOKED) || defined(EDITOR) -#if defined(APSTUDIO_INVOKED) -EXO_IMAGE$(EDITOR) BITMAP "RES\\EXTIMG.BMP" -#else -EXO_IMAGE BITMAP "RES\\EXTIMG.BMP" -#endif -#endif - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -#if defined(APSTUDIO_INVOKED) || defined(EDITOR) -#if defined(APSTUDIO_INVOKED) -MN_CONDITIONS$(EDITOR) MENU -#else -MN_CONDITIONS MENU -#endif -BEGIN - MENUITEM "", 65535 -END -#endif - -#if defined(APSTUDIO_INVOKED) || defined(EDITOR) -#if defined(APSTUDIO_INVOKED) -MN_ACTIONS$(EDITOR) MENU -#else -MN_ACTIONS MENU -#endif -BEGIN - MENUITEM "", 65535 -END -#endif - -#if defined(APSTUDIO_INVOKED) || defined(EDITOR) -#if defined(APSTUDIO_INVOKED) -MN_EXPRESSIONS$(EDITOR) MENU -#else -MN_EXPRESSIONS MENU -#endif -BEGIN - POPUP "" - BEGIN - MENUITEM "Get Volume Label", IDMN_EXPRESSION2 - END -END -#endif - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""..\\Inc\\ccx.h""\r\n" - "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" - "#include \r\n" - "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE -BEGIN - KPX_MARK "MF2" - KPX_NAME "NRG753 Volume Information" -END - -STRINGTABLE -BEGIN - M_EXPRESSION2 "VolInfo$(" -END - -STRINGTABLE -BEGIN - IDST_OBJNAME "NRG753 Volume Information" - IDST_AUTHOR "Jack Webster" - IDST_COPYRIGHT "Copyright \xA9 2006 Jack Webster" - IDST_COMMENT "Given a root path, will give the volumes label. By request of NRG753" - IDST_HTTP "(No webpage right now)" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/MMF2SDK/VOLINFO/VOLINFO.vcxproj b/MMF2SDK/VOLINFO/VOLINFO.vcxproj deleted file mode 100644 index 3532a72d..00000000 --- a/MMF2SDK/VOLINFO/VOLINFO.vcxproj +++ /dev/null @@ -1,103 +0,0 @@ - - - - - Debug - Win32 - - - Edittime - Win32 - - - Runtime - Win32 - - - Vitalize - Win32 - - - - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145} - VOLINFO - - - - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.40219.1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/MMF2SDK_Unicode/VOLINFO/.gitattributes b/MMF2SDK_Unicode/VOLINFO/.gitattributes new file mode 100644 index 00000000..412eeda7 --- /dev/null +++ b/MMF2SDK_Unicode/VOLINFO/.gitattributes @@ -0,0 +1,22 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp +*.sln merge=union +*.csproj merge=union +*.vbproj merge=union +*.fsproj merge=union +*.dbproj merge=union + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/MMF2SDK_Unicode/VOLINFO/.gitignore b/MMF2SDK_Unicode/VOLINFO/.gitignore new file mode 100644 index 00000000..5ebd21a1 --- /dev/null +++ b/MMF2SDK_Unicode/VOLINFO/.gitignore @@ -0,0 +1,163 @@ +################# +## Eclipse +################# + +*.pydevproject +.project +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath + + +################# +## Visual Studio +################# + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results +[Dd]ebug/ +[Rr]elease/ +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.vspscc +.builds +*.dotCover + +## TODO: If you have NuGet Package Restore enabled, uncomment this +#packages/ + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf + +# Visual Studio profiler +*.psess +*.vsp + +# ReSharper is a .NET coding add-in +_ReSharper* + +# Installshield output folder +[Ee]xpress + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish + +# Others +[Bb]in +[Oo]bj +sql +TestResults +*.Cache +ClientBin +stylecop.* +~$* +*.dbmdl +Generated_Code #added for RIA/Silverlight projects + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML + + + +############ +## Windows +############ + +# Windows image file caches +Thumbs.db + +# Folder config file +Desktop.ini + + +############# +## Python +############# + +*.py[co] + +# Packages +*.egg +*.egg-info +dist +build +eggs +parts +bin +var +sdist +develop-eggs +.installed.cfg + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox + +#Translations +*.mo + +#Mr Developer +.mr.developer.cfg + +# Mac crap +.DS_Store diff --git a/MMF2SDK/VOLINFO/Common.h b/MMF2SDK_Unicode/VOLINFO/Common.h similarity index 87% rename from MMF2SDK/VOLINFO/Common.h rename to MMF2SDK_Unicode/VOLINFO/Common.h index 40061092..5ec7b90f 100644 --- a/MMF2SDK/VOLINFO/Common.h +++ b/MMF2SDK_Unicode/VOLINFO/Common.h @@ -6,24 +6,26 @@ #define _CRTDBG_MAP_ALLOC 1 #endif +#define IN_EXT_VERSION2 + // ---------------------------------------------- // VERSION AND BUILD YOUR EXTENSION CAN WORK WITH // ---------------------------------------------- -//#define TGFEXT // TGF, MMF Standard and MMF Pro +//#define TGFEXT // TGF, MMF Standard and MMF Pro #define MMFEXT // MMF Standard and MMF Pro -//#define PROEXT // MMF Pro only +//#define PROEXT // MMF Pro only // Build number of the minimum required version of MMF #define MINBUILD 228 // General includes -#include "ccxhdr.h" -#include "Surface.h" +#include "ccxhdr.h" +#include "Surface.h" // Specific to this cox -#include "resource.h" -#include "main.h" -#include "TigsExt.hpp" +#include "resource.h" +#include "main.h" +#include "TigsExt.hpp" // Globals and Prototypes extern HINSTANCE hInstLib; diff --git a/MMF2SDK/VOLINFO/Edittime.cpp b/MMF2SDK_Unicode/VOLINFO/Edittime.cpp similarity index 95% rename from MMF2SDK/VOLINFO/Edittime.cpp rename to MMF2SDK_Unicode/VOLINFO/Edittime.cpp index 3ef1adaf..ac2ea78f 100644 --- a/MMF2SDK/VOLINFO/Edittime.cpp +++ b/MMF2SDK_Unicode/VOLINFO/Edittime.cpp @@ -5,7 +5,7 @@ // under the Frame and Event editors. // // Including creating, display, and setting up your object. -// +// // ============================================================================ // Common @@ -21,8 +21,8 @@ enum { // Example // ------- -// PROPID_TEXTTITLE, -// PROPID_TEXT, +// PROPID_TEXTTITLE, +// PROPID_TEXT, // PROPID_CHECK, // PROPID_COMBO, // PROPID_COLOR, @@ -31,9 +31,9 @@ enum { // Example of content of the PROPID_COMBO combo box //LPCSTR ComboList[] = { // 0, // reserved -// MAKEINTRESOURCE(IDS_FIRSTOPTION), -// MAKEINTRESOURCE(IDS_SECONDOPTION), -// MAKEINTRESOURCE(IDS_THIRDOPTION), +// MAKEINTRESOURCE(IDS_FIRSTOPTION), +// MAKEINTRESOURCE(IDS_SECONDOPTION), +// MAKEINTRESOURCE(IDS_THIRDOPTION), // NULL //}; @@ -78,7 +78,7 @@ typedef struct tagSetP // Info displayed in the object's About properties // Note: ObjComment is also displayed in the Quick Description box in the Insert Object dialog box // -void WINAPI DLLExport GetObjInfos (mv _far *mV, LPEDATA edPtr, LPSTR ObjName, LPSTR ObjAuthor, LPSTR ObjCopyright, LPSTR ObjComment, LPSTR ObjHttp) +void WINAPI DLLExport GetObjInfos (mv _far *mV, LPEDATA edPtr, LPTSTR ObjName, LPTSTR ObjAuthor, LPTSTR ObjCopyright, LPTSTR ObjComment, LPTSTR ObjHttp) { #ifndef RUN_ONLY // Name @@ -103,7 +103,7 @@ void WINAPI DLLExport GetObjInfos (mv _far *mV, LPEDATA edPtr, LPSTR ObjName, LP // ----------------- // Returns the help filename of the object. // -LPCSTR WINAPI GetHelpFileName() +LPCTSTR WINAPI GetHelpFileName() { #ifndef RUN_ONLY // Return a file without path if your help file can be loaded by the MMF help file. @@ -111,7 +111,7 @@ LPCSTR WINAPI GetHelpFileName() // Or return the path of your file, relatively to the MMF directory // if your file is not loaded by the MMF help file. - return "Help\\MyExt.chm"; + return _T("Help\\MyExt.chm"); #else return NULL; #endif // !defined(RUN_ONLY) @@ -161,7 +161,7 @@ WORD BmpToImg(int bmID, npAppli idApp, short HotX = 0, short HotY = 0, short Act // ============================================================================ // // ROUTINES USED UNDER FRAME EDITOR -// +// // ============================================================================ @@ -176,7 +176,7 @@ WORD BmpToImg(int bmID, npAppli idApp, short HotX = 0, short HotY = 0, short Act // If you need to draw the icon manually, remove the comments around this function and in the .def file. // /* -int WINAPI DLLExport MakeIconEx ( mv _far *mV, cSurface* pIconSf, LPSTR lpName, fpObjInfo oiPtr, LPEDATA edPtr ) +int WINAPI DLLExport MakeIconEx ( mv _far *mV, cSurface* pIconSf, LPTSTR lpName, fpObjInfo oiPtr, LPEDATA edPtr ) { int error = -1; #ifndef RUN_ONLY @@ -196,7 +196,7 @@ int WINAPI DLLExport MakeIconEx ( mv _far *mV, cSurface* pIconSf, LPSTR lpName, // -------------------- // CreateObject // -------------------- -// Called when you choose "Create new object". It should display the setup box +// Called when you choose "Create new object". It should display the setup box // and initialize everything in the datazone. int WINAPI DLLExport CreateObject(mv _far *mV, fpLevObj loPtr, LPEDATA edPtr) @@ -276,7 +276,7 @@ void WINAPI DLLExport RemoveObject(mv _far *mV, fpLevObj loPtr, LPEDATA edPtr, u { #ifndef RUN_ONLY // Is the last object removed? - if (0 == cpt) + if (0 == cpt) { // Do whatever necessary to remove our data } @@ -355,7 +355,7 @@ void WINAPI DLLExport EditorDisplay(mv _far *mV, fpObjInfo oiPtr, fpLevObj loPtr // IsTransparent // -------------------- // This routine tells CC&C if the mouse pointer is over a transparent zone of the object. -// +// extern "C" BOOL WINAPI DLLExport IsTransparent(mv _far *mV, fpLevObj loPtr, LPEDATA edPtr, int dx, int dy) { @@ -369,7 +369,7 @@ extern "C" BOOL WINAPI DLLExport IsTransparent(mv _far *mV, fpLevObj loPtr, LPED // PrepareToWriteObject // -------------------- // Just before writing the datazone when saving the application, CC&C calls this routine. -// +// void WINAPI DLLExport PrepareToWriteObject(mv _far *mV, LPEDATA edPtr, fpObjInfo adoi) { #ifndef RUN_ONLY @@ -401,20 +401,20 @@ BOOL WINAPI GetFilters(LPMV mV, LPEDATA edPtr, DWORD dwFlags, LPVOID pReserved) // Triggers when a file is dropped onto the frame // Return TRUE if you can create an object from the given file // -BOOL WINAPI DLLExport UsesFile (LPMV mV, LPSTR fileName) +BOOL WINAPI DLLExport UsesFile (LPMV mV, LPTSTR fileName) { BOOL r = FALSE; #ifndef RUN_ONLY // Example: return TRUE if file extension is ".txt" -/* - LPSTR ext, npath; +/* + LPTSTR ext, npath; if ( fileName != NULL ) { - if ( (ext=(LPSTR)malloc(_MAX_EXT)) != NULL ) + if ( (ext=(LPTSTR)malloc(_MAX_EXT)) != NULL ) { - if ( (npath=(LPSTR)malloc(_MAX_PATH)) != NULL ) + if ( (npath=(LPTSTR)malloc(_MAX_PATH)) != NULL ) { strcpy(npath, fileName); _splitpath(npath, NULL, NULL, NULL, ext); @@ -435,7 +435,7 @@ BOOL WINAPI DLLExport UsesFile (LPMV mV, LPSTR fileName) // -------------------- // Creates a new object from file // -void WINAPI DLLExport CreateFromFile (LPMV mV, LPSTR fileName, LPEDATA edPtr) +void WINAPI DLLExport CreateFromFile (LPMV mV, LPTSTR fileName, LPEDATA edPtr) { #ifndef RUN_ONLY // Initialize your extension data from the given file @@ -450,7 +450,7 @@ void WINAPI DLLExport CreateFromFile (LPMV mV, LPSTR fileName, LPEDATA edPtr) // ============================================================================ // // PROPERTIES -// +// // ============================================================================ // -------------------- @@ -536,7 +536,7 @@ LPVOID WINAPI DLLExport GetPropValue(LPMV mV, LPEDATA edPtr, UINT nPropID) // // // Returns a string // case PROPID_TEXT: -// return new CPropDataValue(&edPtr->szText[0]); +// return new CPropStringValue(&edPtr->szText[0]); // // // Returns the value of the combo box // case PROPID_COMBO: @@ -595,7 +595,7 @@ void WINAPI DLLExport SetPropValue(LPMV mV, LPEDATA edPtr, UINT nPropID, LPVOID // case PROPID_TEXT: // { // // Gets the string -// LPSTR pStr = (LPSTR)((CPropDataValue*)pValue)->m_pData; +// LPTSTR pStr = ((CPropStringValue*)pValue)->GetString(); // // // You can simply poke the string if your EDITDATA structure has a fixed size, // // or have an adaptive size of structure like below @@ -605,7 +605,7 @@ void WINAPI DLLExport SetPropValue(LPMV mV, LPEDATA edPtr, UINT nPropID, LPVOID // { // // Asks MMF to reallocate the structure with the new size // LPEDATA pNewPtr = (LPEDATA)mvReAllocEditData(mV, edPtr, sizeof(EDITDATA)+strlen(pStr)); -// +// // // If reallocation worked // if (pNewPtr!=NULL) // { @@ -615,7 +615,7 @@ void WINAPI DLLExport SetPropValue(LPMV mV, LPEDATA edPtr, UINT nPropID, LPVOID // } // } // else -// { +// { // // Same size : simply copy // strcpy(edPtr->text, pStr); // } @@ -699,7 +699,7 @@ BOOL WINAPI IsPropEnabled(LPMV mV, LPEDATA edPtr, UINT nPropID) // ============================================================================ // // TEXT PROPERTIES -// +// // ============================================================================ // -------------------- @@ -718,7 +718,7 @@ DWORD WINAPI DLLExport GetTextCaps(mv _far *mV, LPEDATA edPtr) // Return the font used the object. // Note: the pStyle and cbSize parameters are obsolete and passed for compatibility reasons only. // -BOOL WINAPI DLLExport GetTextFont(mv _far *mV, LPEDATA edPtr, LPLOGFONT plf, LPSTR pStyle, UINT cbSize) +BOOL WINAPI DLLExport GetTextFont(mv _far *mV, LPEDATA edPtr, LPLOGFONT plf, LPTSTR pStyle, UINT cbSize) { #if !defined(RUN_ONLY) // Example: copy LOGFONT structure from EDITDATA @@ -830,24 +830,24 @@ void WINAPI DLLExport SetTextAlignment(mv _far *mV, LPEDATA edPtr, DWORD dwAlign // // ROUTINES USED UNDER EVENT / TIME / STEP-THROUGH EDITOR // You should not need to change these routines -// +// // ============================================================================ // ----------------- // menucpy // ----------------- // Internal routine used later, copy one menu onto another -// -#ifndef RUN_ONLY +// void menucpy(HMENU hTargetMenu, HMENU hSourceMenu) { +#ifndef RUN_ONLY int n, id, nMn; - NPSTR strBuf; + LPTSTR strBuf; HMENU hSubMenu; - + nMn = GetMenuItemCount(hSourceMenu); - strBuf = (NPSTR)LocalAlloc(LPTR, 80); - for (n=0; ninfos.code != code) eiPtr = EVINFO2_NEXT(eiPtr); - + return eiPtr; } -#endif // !defined(RUN_ONLY) +//#endif // !defined(RUN_ONLY) // ---------------------------------------------------- @@ -951,7 +952,7 @@ HMENU WINAPI DLLExport GetExpressionMenu(mv _far *mV, fpObjInfo oiPtr, LPEDATA e // #ifndef RUN_ONLY -void GetCodeTitle(LPEVENTINFOS2 eiPtr, short code, short param, short mn, LPSTR strBuf, WORD maxLen) +void GetCodeTitle(LPEVENTINFOS2 eiPtr, short code, short param, short mn, LPTSTR strBuf, WORD maxLen) { HMENU hMn; @@ -965,7 +966,7 @@ void GetCodeTitle(LPEVENTINFOS2 eiPtr, short code, short param, short mn, LPSTR LoadString(hInstLib, strID, strBuf, maxLen); else { - // Otherwise, returns the menu option + // Otherwise, returns the menu option if ((hMn = LoadMenu(hInstLib, MAKEINTRESOURCE(mn))) != NULL ) { GetMenuString(hMn, eiPtr->menu, strBuf, maxLen, MF_BYCOMMAND); @@ -977,15 +978,15 @@ void GetCodeTitle(LPEVENTINFOS2 eiPtr, short code, short param, short mn, LPSTR #define GetCodeTitle(a,b,c,d,e,f) #endif // !defined(RUN_ONLY) -void WINAPI DLLExport GetConditionTitle(mv _far *mV, short code, short param, LPSTR strBuf, short maxLen) +void WINAPI DLLExport GetConditionTitle(mv _far *mV, short code, short param, LPTSTR strBuf, short maxLen) { GetCodeTitle((LPEVENTINFOS2)conditionsInfos, code, param, MN_CONDITIONS, strBuf, maxLen); } -void WINAPI DLLExport GetActionTitle(mv _far *mV, short code, short param, LPSTR strBuf, short maxLen) +void WINAPI DLLExport GetActionTitle(mv _far *mV, short code, short param, LPTSTR strBuf, short maxLen) { GetCodeTitle((LPEVENTINFOS2)actionsInfos, code, param, MN_ACTIONS, strBuf, maxLen); } -void WINAPI DLLExport GetExpressionTitle(mv _far *mV, short code, LPSTR strBuf, short maxLen) +void WINAPI DLLExport GetExpressionTitle(mv _far *mV, short code, LPTSTR strBuf, short maxLen) { GetCodeTitle((LPEVENTINFOS2)expressionsInfos, code, 0, MN_EXPRESSIONS, strBuf, maxLen); } @@ -1005,7 +1006,7 @@ short WINAPI DLLExport GetConditionCodeFromMenu(mv _far *mV, short menuId) for (n=CND_LAST, eiPtr=(LPEVENTINFOS2)conditionsInfos; n>0 && eiPtr->menu!=menuId; n--) eiPtr = EVINFO2_NEXT(eiPtr); - if (n>0) + if (n>0) return eiPtr->infos.code; #endif // !defined(RUN_ONLY) return -1; @@ -1019,7 +1020,7 @@ short WINAPI DLLExport GetActionCodeFromMenu(mv _far *mV, short menuId) for (n=ACT_LAST, eiPtr=(LPEVENTINFOS2)actionsInfos; n>0 && eiPtr->menu!=menuId; n--) eiPtr = EVINFO2_NEXT(eiPtr); - if (n>0) + if (n>0) return eiPtr->infos.code; #endif // !defined(RUN_ONLY) return -1; @@ -1033,7 +1034,7 @@ short WINAPI DLLExport GetExpressionCodeFromMenu(mv _far *mV, short menuId) for (n=EXP_LAST, eiPtr=(LPEVENTINFOS2)expressionsInfos; n>0 && eiPtr->menu!=menuId; n--) eiPtr = EVINFO2_NEXT(eiPtr); - if (n>0) + if (n>0) return eiPtr->infos.code; #endif // !defined(RUN_ONLY) return -1; @@ -1043,8 +1044,8 @@ short WINAPI DLLExport GetExpressionCodeFromMenu(mv _far *mV, short menuId) // ------------------------------------------------------- // GetConditionInfos / GetActionInfos / GetExpressionInfos // ------------------------------------------------------- -// From a action / condition / expression code, returns -// an infosEvents structure. +// From a action / condition / expression code, returns +// an infosEvents structure. // LPINFOEVENTSV2 WINAPI DLLExport GetConditionInfos(mv _far *mV, short code) @@ -1078,11 +1079,11 @@ LPINFOEVENTSV2 WINAPI DLLExport GetExpressionInfos(mv _far *mV, short code) // ---------------------------------------------------------- // GetConditionString / GetActionString / GetExpressionString // ---------------------------------------------------------- -// From a action / condition / expression code, returns +// From a action / condition / expression code, returns // the string to use for displaying it under the event editor // -void WINAPI DLLExport GetConditionString(mv _far *mV, short code, LPSTR strPtr, short maxLen) +void WINAPI DLLExport GetConditionString(mv _far *mV, short code, LPTSTR strPtr, short maxLen) { #ifndef RUN_ONLY // Check compatibility @@ -1091,7 +1092,7 @@ void WINAPI DLLExport GetConditionString(mv _far *mV, short code, LPSTR strPtr, #endif // !defined(RUN_ONLY) } -void WINAPI DLLExport GetActionString(mv _far *mV, short code, LPSTR strPtr, short maxLen) +void WINAPI DLLExport GetActionString(mv _far *mV, short code, LPTSTR strPtr, short maxLen) { #ifndef RUN_ONLY // Check compatibility @@ -1100,7 +1101,7 @@ void WINAPI DLLExport GetActionString(mv _far *mV, short code, LPSTR strPtr, sho #endif // !defined(RUN_ONLY) } -void WINAPI DLLExport GetExpressionString(mv _far *mV, short code, LPSTR strPtr, short maxLen) +void WINAPI DLLExport GetExpressionString(mv _far *mV, short code, LPTSTR strPtr, short maxLen) { #ifndef RUN_ONLY // Check compatibility @@ -1114,7 +1115,7 @@ void WINAPI DLLExport GetExpressionString(mv _far *mV, short code, LPSTR strPtr, // ---------------------------------------------------------- // Returns the parameter name to display in the expression editor // -void WINAPI DLLExport GetExpressionParam(mv _far *mV, short code, short param, LPSTR strBuf, short maxLen) +void WINAPI DLLExport GetExpressionParam(mv _far *mV, short code, short param, LPTSTR strBuf, short maxLen) { #if !defined(RUN_ONLY) short strID; @@ -1216,7 +1217,7 @@ void WINAPI EditParameter(mv _far *mV, short code, paramExt* pExt) // -------------------- // Initialize the parameter. // -void WINAPI GetParameterString(mv _far *mV, short code, paramExt* pExt, LPSTR pDest, short size) +void WINAPI GetParameterString(mv _far *mV, short code, paramExt* pExt, LPTSTR pDest, short size) { #if !defined(RUN_ONLY) diff --git a/MMF2SDK/VOLINFO/Ext.def b/MMF2SDK_Unicode/VOLINFO/Ext.def similarity index 100% rename from MMF2SDK/VOLINFO/Ext.def rename to MMF2SDK_Unicode/VOLINFO/Ext.def diff --git a/MMF2SDK_Unicode/VOLINFO/Ext.rc b/MMF2SDK_Unicode/VOLINFO/Ext.rc new file mode 100644 index 00000000..a4072c0c --- /dev/null +++ b/MMF2SDK_Unicode/VOLINFO/Ext.rc @@ -0,0 +1,215 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "..\Inc\ccx.h" +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +1 VERSIONINFO + FILEVERSION 1,0,0,0 + PRODUCTVERSION 1,0,0,0 + FILEFLAGSMASK 0x0L +#ifdef _DEBUG + FILEFLAGS 0x21L +#else + FILEFLAGS 0x20L +#endif + FILEOS 0x10001L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Clickteam\0" + VALUE "FileDescription", "NRG753 Volume Information\0" + VALUE "FileVersion", "2.00\0" + VALUE "InternalName", "VOLINFO\0" + VALUE "LegalCopyright", "Copyright � 2006 Jack Webster\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "VOLINFO.mfx\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "\0" + VALUE "ProductVersion", "1, 0, 0, 0\0" + VALUE "SpecialBuild", "00000001\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // !_MAC + + +///////////////////////////////////////////////////////////////////////////// +// +// Data +// + +KPX_MAGICNUMBER RCDATA MOVEABLE PURE +BEGIN + 0x9978, 0x8989 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Bitmap +// + +#if defined(APSTUDIO_INVOKED) || defined(EDITOR) +#if defined(APSTUDIO_INVOKED) +EXO_ICON$(EDITOR) BITMAP MOVEABLE PURE "RES\\EXTICON.BMP" +#else +EXO_ICON BITMAP MOVEABLE PURE "RES\\EXTICON.BMP" +#endif +#endif +#if defined(APSTUDIO_INVOKED) || defined(EDITOR) +#if defined(APSTUDIO_INVOKED) +EXO_IMAGE$(EDITOR) BITMAP MOVEABLE PURE "RES\\EXTIMG.BMP" +#else +EXO_IMAGE BITMAP MOVEABLE PURE "RES\\EXTIMG.BMP" +#endif +#endif + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +#if defined(APSTUDIO_INVOKED) || defined(EDITOR) +#if defined(APSTUDIO_INVOKED) +MN_CONDITIONS$(EDITOR) MENU DISCARDABLE +#else +MN_CONDITIONS MENU DISCARDABLE +#endif +BEGIN + MENUITEM "", 65535 +END +#endif + +#if defined(APSTUDIO_INVOKED) || defined(EDITOR) +#if defined(APSTUDIO_INVOKED) +MN_ACTIONS$(EDITOR) MENU DISCARDABLE +#else +MN_ACTIONS MENU DISCARDABLE +#endif +BEGIN + MENUITEM "", 65535 +END +#endif + +#if defined(APSTUDIO_INVOKED) || defined(EDITOR) +#if defined(APSTUDIO_INVOKED) +MN_EXPRESSIONS$(EDITOR) MENU DISCARDABLE +#else +MN_EXPRESSIONS MENU DISCARDABLE +#endif +BEGIN + POPUP "" + BEGIN + MENUITEM "Get Volume Label", IDMN_EXPRESSION2 + MENUITEM SEPARATOR + END +END +#endif + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""..\\Inc\\ccx.h""\r\n" + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + KPX_MARK "MF2" + KPX_NAME "NRG753 Volume Information" +END + +STRINGTABLE DISCARDABLE +BEGIN + M_EXPRESSION2 "VolInfo$(" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDST_OBJNAME "NRG753 Volume Information" + IDST_AUTHOR "Jack Webster" + IDST_COPYRIGHT "Copyright \xA9 2006-2026 Jack Webster" + IDST_COMMENT "Given a root path, will give the volumes label. By request of NRG753" + IDST_HTTP "(No webpage right now)" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/MMF2SDK/VOLINFO/General.cpp b/MMF2SDK_Unicode/VOLINFO/General.cpp similarity index 90% rename from MMF2SDK/VOLINFO/General.cpp rename to MMF2SDK_Unicode/VOLINFO/General.cpp index 670cbf39..986a4647 100644 --- a/MMF2SDK/VOLINFO/General.cpp +++ b/MMF2SDK_Unicode/VOLINFO/General.cpp @@ -4,7 +4,7 @@ // The following routines are used internally by MMF, and should not need to // be modified. // -// +// // ============================================================================ // Common Include @@ -15,13 +15,13 @@ HINSTANCE hInstLib; // ============================================================================ // // LIBRARY ENTRY & QUIT POINTS -// +// // ============================================================================ // ----------------- // Entry points // ----------------- -// Usually you do not need to do any initialization here: you will prefer to +// Usually you do not need to do any initialization here: you will prefer to // do them in "Initialize" found in Edittime.cpp BOOL WINAPI DllMain(HINSTANCE hDLL, DWORD dwReason, LPVOID lpReserved) { @@ -29,7 +29,7 @@ BOOL WINAPI DllMain(HINSTANCE hDLL, DWORD dwReason, LPVOID lpReserved) { // DLL is attaching to the address space of the current process. case DLL_PROCESS_ATTACH: - + hInstLib = hDLL; // Store HINSTANCE break; @@ -42,10 +42,10 @@ BOOL WINAPI DllMain(HINSTANCE hDLL, DWORD dwReason, LPVOID lpReserved) break; // The calling process is detaching the DLL from its address space. - case DLL_PROCESS_DETACH: + case DLL_PROCESS_DETACH: break; } - + return TRUE; } @@ -66,7 +66,7 @@ extern "C" int WINAPI DLLExport Initialize(mv _far *mV, int quiet) // ----------------- // Where you want to kill and initialized data opened in the above routine // Called just before freeing the DLL. -// +// extern "C" int WINAPI DLLExport Free(mv _far *mV) { // No error @@ -76,18 +76,18 @@ extern "C" int WINAPI DLLExport Free(mv _far *mV) // ============================================================================ // // GENERAL INFO -// +// // ============================================================================ // ----------------- // Get Infos // ----------------- -// -extern "C" +// +extern "C" { DWORD WINAPI DLLExport GetInfos(int info) { - + switch (info) { case KGI_VERSION: @@ -98,6 +98,12 @@ extern "C" return PRODUCT_VERSION_STANDARD; // Works with MMF Standard or above case KGI_BUILD: return 240; // Works with build 240 or above + case KGI_UNICODE: + #ifdef _UNICODE + return TRUE; + #else + return FALSE; + #endif default: return 0; } @@ -109,7 +115,7 @@ extern "C" // ---------------------------------------------------------- // Fills an information structure that tells CC&C everything // about the object, its actions, conditions and expressions -// +// short WINAPI DLLExport GetRunObjectInfos(mv _far *mV, fpKpxRunInfos infoPtr) { @@ -131,10 +137,10 @@ short WINAPI DLLExport GetRunObjectInfos(mv _far *mV, fpKpxRunInfos infoPtr) // Identifier, for run-time identification infoPtr->identifier = IDENTIFIER; - + // Current version infoPtr->version = KCX_CURRENT_VERSION; - + return TRUE; } @@ -144,14 +150,14 @@ short WINAPI DLLExport GetRunObjectInfos(mv _far *mV, fpKpxRunInfos infoPtr) // Returns the name of the external modules that you wish MMF to include // with stand-alone applications (these modules must be in the MMF // Data\Runtime folder). -// +// -//LPCSTR szDep[] = { -// "MyDll.dll", +//LPCTSTR szDep[] = { +// _T("MyDll.dll"), // NULL //}; -LPCSTR* WINAPI DLLExport GetDependencies() +LPCTSTR* WINAPI DLLExport GetDependencies() { return NULL; // szDep; } @@ -183,7 +189,7 @@ void WINAPI DLLExport UnloadObject(mv _far *mV, LPEDATA edPtr, int reserved) // -------------------- // For you to update your object structure to newer versions // Called at both edit time and run time -// +// HGLOBAL WINAPI DLLExport UpdateEditStructure(mv __far *mV, void __far * OldEdPtr) { // We do nothing here @@ -198,9 +204,10 @@ HGLOBAL WINAPI DLLExport UpdateEditStructure(mv __far *mV, void __far * OldEdPtr // Called at edit time and run time. // // Call lpfnUpdate to update your file pathname (refer to the documentation) -// -void WINAPI DLLExport UpdateFileNames(mv _far *mV, LPSTR appName, LPEDATA edPtr, void (WINAPI * lpfnUpdate)(LPSTR, LPSTR)) +// +void WINAPI DLLExport UpdateFileNames(mv _far *mV, LPTSTR appName, LPEDATA edPtr, void (WINAPI * lpfnUpdate)(LPTSTR, LPTSTR)) { + } // --------------------- @@ -209,22 +216,22 @@ void WINAPI DLLExport UpdateFileNames(mv _far *mV, LPSTR appName, LPEDATA edPtr, // // Uncomment this function if you need to store an image in the image bank. // -// Note: do not forget to enable the function in the .def file +// Note: do not forget to enable the function in the .def file // if you remove the comments below. // /* int WINAPI DLLExport EnumElts (mv __far *mV, LPEDATA edPtr, ENUMELTPROC enumProc, ENUMELTPROC undoProc, LPARAM lp1, LPARAM lp2) -{ +{ int error = 0; // Replace wImgIdx with the name of the WORD variable you create within the edit structure - - // Enum images + + // Enum images if ( (error = enumProc(&edPtr->wImgIdx, IMG_TAB, lp1, lp2)) != 0 ) { - // Undo enum images - undoProc (&edPtr->wImgIdx, IMG_TAB, lp1, lp2); - } + // Undo enum images + undoProc (&edPtr->wImgIdx, IMG_TAB, lp1, lp2); + } return error; } diff --git a/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.sln b/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.sln new file mode 100644 index 00000000..ed072de5 --- /dev/null +++ b/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.sln @@ -0,0 +1,40 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.37327.16 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MMF2SDK - VOLINFO", "MMF2SDK - VOLINFO.vcxproj", "{2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug Unicode|x86 = Debug Unicode|x86 + Debug|x86 = Debug|x86 + Edittime Unicode|x86 = Edittime Unicode|x86 + Edittime|x86 = Edittime|x86 + Runtime Unicode|x86 = Runtime Unicode|x86 + Runtime|x86 = Runtime|x86 + Vitalize|x86 = Vitalize|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Debug Unicode|x86.ActiveCfg = Debug Unicode|Win32 + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Debug Unicode|x86.Build.0 = Debug Unicode|Win32 + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Debug|x86.ActiveCfg = Debug|Win32 + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Debug|x86.Build.0 = Debug|Win32 + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Edittime Unicode|x86.ActiveCfg = Edittime Unicode|Win32 + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Edittime Unicode|x86.Build.0 = Edittime Unicode|Win32 + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Edittime|x86.ActiveCfg = Edittime|Win32 + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Edittime|x86.Build.0 = Edittime|Win32 + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Runtime Unicode|x86.ActiveCfg = Runtime Unicode|Win32 + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Runtime Unicode|x86.Build.0 = Runtime Unicode|Win32 + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Runtime|x86.ActiveCfg = Runtime|Win32 + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Runtime|x86.Build.0 = Runtime|Win32 + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Vitalize|x86.ActiveCfg = Vitalize|Win32 + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Vitalize|x86.Build.0 = Vitalize|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {244770B2-A722-4976-85DA-F5FFB2A012A3} + EndGlobalSection +EndGlobal diff --git a/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcproj b/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcproj new file mode 100644 index 00000000..43cd5121 --- /dev/null +++ b/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcproj @@ -0,0 +1,807 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcxproj b/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcxproj new file mode 100644 index 00000000..632b655b --- /dev/null +++ b/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcxproj @@ -0,0 +1,678 @@ + + + + + Debug Unicode + Win32 + + + Debug + Win32 + + + Edittime Unicode + Win32 + + + Edittime + Win32 + + + Runtime Unicode + Win32 + + + Runtime + Win32 + + + Vitalize + Win32 + + + + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145} + MMF2SDK - VOLINFO + 10.0.19041.0 + + + + DynamicLibrary + false + v141 + + + DynamicLibrary + false + v141 + + + DynamicLibrary + false + v141 + + + DynamicLibrary + false + v141 + + + DynamicLibrary + false + v141 + + + DynamicLibrary + false + v141 + + + DynamicLibrary + false + v141 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + .\Vitalize_Small\ + .\Vitalize_Small\ + false + .\Release_Small\ + .\Release_Small\Unicode\ + .\Release_Small\ + .\Release_Small\Unicode\ + false + false + .\Debug\ + .\Debug\Unicode\ + .\Debug\ + .\Debug\Unicode\ + true + true + .\Run_Only_Small\ + .\Run_Only_Small\Unicode\ + .\Run_Only_Small\ + .\Run_Only_Small\Unicode\ + false + false + AllRules.ruleset + AllRules.ruleset + + + + + AllRules.ruleset + AllRules.ruleset + + + + + AllRules.ruleset + AllRules.ruleset + + + + + AllRules.ruleset + + + false + false + false + false + false + false + false + false + false + + + + NDEBUG;RUN_ONLY;%(PreprocessorDefinitions) + true + true + Win32 + .\Vitalize_Small/Template.tlb + + + + + MinSpace + OnlyExplicitInline + ..\Inc;.\;..\..\Inc;%(AdditionalIncludeDirectories) + NDEBUG;WIN32;_WINDOWS;STRICT;RUN_ONLY;VITALIZE;COXSDK;%(PreprocessorDefinitions) + true + Sync + MultiThreaded + true + true + .\Vitalize_Small/Template.pch + .\Vitalize_Small/ + .\Vitalize_Small/ + .\Vitalize_Small/ + Level3 + true + + + NDEBUG;RUN_ONLY;VITALIZE;%(PreprocessorDefinitions) + 0x0409 + ..\..\Inc;%(AdditionalIncludeDirectories) + .\Vitalize_Small\Ext.res + + + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;..\lib\mmfs2.lib;%(AdditionalDependencies) + $(ProjectDir)MOX\$(ProjectName).mox + true + false + .\Ext.def + .\Vitalize_Small/Template.pdb + false + + + .\Vitalize_Small/Template.lib + MachineX86 + false + ..\..\lib\;%(AdditionalLibraryDirectories) + + + true + .\Vitalize_Small/Template.bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + .\Release_Small/Template.tlb + + + + + MinSpace + OnlyExplicitInline + ..\Inc;.\;..\..\Inc;%(AdditionalIncludeDirectories) + NDEBUG;WIN32;_WINDOWS;STRICT;COXSDK;%(PreprocessorDefinitions) + true + Sync + MultiThreaded + true + true + .\Release_Small/Template.pch + .\Release_Small/ + .\Release_Small/ + .\Release_Small/ + Level3 + true + + + NDEBUG;EDITOR;%(PreprocessorDefinitions) + 0x0409 + ..\..\Inc;%(AdditionalIncludeDirectories) + .\Release_Small\Ext.res + + + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;..\lib\mmfs2.lib;%(AdditionalDependencies) + $(ProjectDir)MFX\Extensions\$(ProjectName).mfx + true + false + .\Ext.def + .\Release_Small/Template.pdb + false + + + .\Release_Small/Template.lib + MachineX86 + ..\..\lib\;%(AdditionalLibraryDirectories) + + + true + .\Release_Small/Template.bsc + + + + + + + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + .\Release_Small/Template.tlb + + + + + MinSpace + OnlyExplicitInline + ..\Inc;.\;..\..\Inc;%(AdditionalIncludeDirectories) + NDEBUG;WIN32;_WINDOWS;STRICT;COXSDK;_UNICODE;UNICODE;%(PreprocessorDefinitions) + true + Sync + MultiThreaded + true + true + .\Release_Small/Template.pch + .\Release_Small/ + .\Release_Small/ + .\Release_Small/ + Level3 + true + + + NDEBUG;EDITOR;%(PreprocessorDefinitions) + 0x0409 + ..\..\Inc;%(AdditionalIncludeDirectories) + .\Release_Small\Ext.res + + + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;..\lib\mmfs2.lib;%(AdditionalDependencies) + $(ProjectDir)MFX\Extensions\Unicode\$(ProjectName).mfx + true + false + .\Ext.def + .\Release_Small/Template.pdb + false + + + .\Release_Small/Template.lib + MachineX86 + ..\..\lib\;%(AdditionalLibraryDirectories) + + + true + .\Release_Small/Template.bsc + + + + + + + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + .\Debug/Template.tlb + + + + + Disabled + ..\Inc;.\;..\..\Inc;%(AdditionalIncludeDirectories) + _DEBUG;WIN32;_WINDOWS;STRICT;COXSDK;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebug + + + .\Debug/ + .\Debug/ + .\Debug/ + Level3 + true + ProgramDatabase + + + _DEBUG;EDITOR;%(PreprocessorDefinitions) + 0x0409 + ..\..\Inc;%(AdditionalIncludeDirectories) + .\Debug\Ext.res + + + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;..\lib\mmfs2.lib;%(AdditionalDependencies) + $(ProjectDir)MFX\Extensions\$(ProjectName).mfx + true + ..\lib\;..\..\lib\;%(AdditionalLibraryDirectories) + .\Ext.def + false + .\Debug/Template.pdb + false + + + .\Debug/Template.lib + MachineX86 + + + true + .\Debug/Template.bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + .\Debug/Template.tlb + + + + + Disabled + ..\Inc;.\;..\..\Inc;%(AdditionalIncludeDirectories) + _DEBUG;WIN32;_WINDOWS;STRICT;COXSDK;_UNICODE;UNICODE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebug + + + .\Debug/ + .\Debug/ + .\Debug/ + Level3 + true + ProgramDatabase + + + _DEBUG;EDITOR;%(PreprocessorDefinitions) + 0x0409 + ..\..\Inc;%(AdditionalIncludeDirectories) + .\Debug\Ext.res + + + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;..\lib\mmfs2.lib;%(AdditionalDependencies) + $(ProjectDir)MFX\DEBUG\Extensions\Unicode\$(ProjectName).mfx + true + ..\lib\;..\..\lib\;%(AdditionalLibraryDirectories) + .\Ext.def + false + .\Debug/Template.pdb + false + + + .\Debug/Template.lib + MachineX86 + + + true + .\Debug/Template.bsc + + + + + NDEBUG;RUN_ONLY;%(PreprocessorDefinitions) + true + true + Win32 + .\Run_Only_Small/Template.tlb + + + + + MinSpace + OnlyExplicitInline + ..\Inc;.\;..\..\Inc;%(AdditionalIncludeDirectories) + NDEBUG;WIN32;_WINDOWS;STRICT;RUN_ONLY;COXSDK;%(PreprocessorDefinitions) + true + Sync + MultiThreaded + true + true + .\Run_Only_Small/Template.pch + .\Run_Only_Small/ + .\Run_Only_Small/ + .\Run_Only_Small/ + Level3 + true + + + NDEBUG;RUN_ONLY;%(PreprocessorDefinitions) + 0x0409 + ..\..\Inc;%(AdditionalIncludeDirectories) + .\Run_Only_Small\Ext.res + + + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;..\lib\mmfs2.lib;%(AdditionalDependencies) + $(ProjectDir)MFX\Data\Runtime\$(ProjectName).mfx + true + false + .\Ext.def + $(ProjectDir)..\..\MFX\Data\Runtime\$(ProjectName)_Full.pdb + false + + + .\Run_Only_Small/Template.lib + MachineX86 + true + $(ProjectDir)..\..\MFX\Data\Runtime\$(ProjectName).pdb + ..\..\lib\;%(AdditionalLibraryDirectories) + + + true + .\Run_Only_Small/Template.bsc + + + + + + + + + + + NDEBUG;RUN_ONLY;%(PreprocessorDefinitions) + true + true + Win32 + .\Run_Only_Small/Template.tlb + + + + + MinSpace + OnlyExplicitInline + ..\Inc;.\;..\..\Inc;%(AdditionalIncludeDirectories) + NDEBUG;WIN32;_WINDOWS;STRICT;RUN_ONLY;COXSDK;_UNICODE;UNICODE;%(PreprocessorDefinitions) + true + Sync + MultiThreaded + true + true + .\Run_Only_Small/Template.pch + .\Run_Only_Small/ + .\Run_Only_Small/ + .\Run_Only_Small/ + Level3 + true + + + NDEBUG;RUN_ONLY;%(PreprocessorDefinitions) + 0x0409 + ..\..\Inc;%(AdditionalIncludeDirectories) + .\Run_Only_Small\Ext.res + + + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;..\lib\mmfs2.lib;%(AdditionalDependencies) + $(ProjectDir)MFX\Data\Runtime\Unicode\$(ProjectName).mfx + true + false + .\Ext.def + $(ProjectDir)..\..\MFX\Data\Runtime\$(ProjectName)_Full.pdb + false + + + .\Run_Only_Small/Template.lib + MachineX86 + true + $(ProjectDir)..\..\MFX\Data\Runtime\$(ProjectName).pdb + ..\..\lib\;%(AdditionalLibraryDirectories) + + + true + .\Run_Only_Small/Template.bsc + + + + + + + + + + + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + + + + + + \ No newline at end of file diff --git a/MMF2SDK/VOLINFO/VOLINFO.vcxproj.filters b/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcxproj.filters similarity index 98% rename from MMF2SDK/VOLINFO/VOLINFO.vcxproj.filters rename to MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcxproj.filters index 794fd3f0..8b5e055f 100644 --- a/MMF2SDK/VOLINFO/VOLINFO.vcxproj.filters +++ b/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcxproj.filters @@ -32,15 +32,15 @@ + + Source Files + Resource Files Resource Files - - Resource Files - @@ -49,6 +49,9 @@ Header Files + + Header Files + MMF Headers @@ -139,9 +142,6 @@ MMF Headers - - Resource Files - diff --git a/MMF2SDK/VOLINFO/Main.cpp b/MMF2SDK_Unicode/VOLINFO/Main.cpp similarity index 88% rename from MMF2SDK/VOLINFO/Main.cpp rename to MMF2SDK_Unicode/VOLINFO/Main.cpp index 8f25bdf5..3b94af8b 100644 --- a/MMF2SDK/VOLINFO/Main.cpp +++ b/MMF2SDK_Unicode/VOLINFO/Main.cpp @@ -38,7 +38,7 @@ short expressionsInfos[]= // ============================================================================ // // CONDITION ROUTINES -// +// // ============================================================================ @@ -47,20 +47,20 @@ short expressionsInfos[]= // ============================================================================ // // EXPRESSIONS ROUTINES -// +// // ============================================================================ long WINAPI DLLExport GetVol(LPRDATA rdPtr,long param1) { long p1 = CNC_GetFirstExpressionParameter(rdPtr, param1, TYPE_STRING); //Reversing the string. - LPSTR buf = (LPSTR)callRunTimeFunction(rdPtr, RFUNCTION_GETSTRINGSPACE, MAX_PATH , 0); + LPTSTR buf = (LPTSTR)callRunTimeFunction(rdPtr, RFUNCTION_GETSTRINGSPACE, MAX_PATH , 0); buf[0] = '\0'; DWORD w1,w2,w3; - char ignore[10]; + TCHAR ignore[10]; //None of the info is null because sometimes that crashes Win9x machines. - GetVolumeInformation( (LPSTR)p1 , buf , MAX_PATH , &w1 , &w2 , &w3 , ignore , 9 ); - + GetVolumeInformation( (LPTSTR)p1 , buf , MAX_PATH , &w1 , &w2 , &w3 , ignore , 9 ); + rdPtr->rHo.hoFlags |= HOF_STRING; return (long)buf; } @@ -74,18 +74,18 @@ long WINAPI DLLExport GetVol(LPRDATA rdPtr,long param1) // Located at the end of the source for convinience // Must finish with a 0 // -long (WINAPI * ConditionJumps[])(LPRDATA rdPtr, long param1, long param2) = - { +long (WINAPI * ConditionJumps[])(LPRDATA rdPtr, long param1, long param2) = + { 0 }; - + short (WINAPI * ActionJumps[])(LPRDATA rdPtr, long param1, long param2) = { 0 }; -long (WINAPI * ExpressionJumps[])(LPRDATA rdPtr, long param) = - { +long (WINAPI * ExpressionJumps[])(LPRDATA rdPtr, long param) = + { GetVol, 0 }; \ No newline at end of file diff --git a/MMF2SDK/VOLINFO/Main.h b/MMF2SDK_Unicode/VOLINFO/Main.h similarity index 86% rename from MMF2SDK/VOLINFO/Main.h rename to MMF2SDK_Unicode/VOLINFO/Main.h index 43918d48..821d95c6 100644 --- a/MMF2SDK/VOLINFO/Main.h +++ b/MMF2SDK_Unicode/VOLINFO/Main.h @@ -2,6 +2,14 @@ // and then remove the #pragma message above. If you do not do this, MMF2 // could confuse your object with another in the event editor. +#ifdef _UNICODE + #define EDITDATA EDITDATAW + #define LPEDATA LPEDATAW +#else + #define EDITDATA EDITDATAA + #define LPEDATA LPEDATAA +#endif + // ------------------------------ // DEFINITION OF CONDITIONS CODES // ------------------------------ @@ -20,10 +28,10 @@ #define EXP_EXPRESSION2 0 -#define EXP_LAST 1 +#define EXP_LAST 1 // --------------------- -// OBJECT DATA STRUCTURE +// OBJECT DATA STRUCTURE // --------------------- // Used at edit time and saved in the MFA/CCN/EXE files @@ -48,7 +56,7 @@ typedef EDITDATA * LPEDATA; // Used at runtime. Initialize it in the CreateRunObject function. // Free any allocated memory or object in the DestroyRunObject function. // -// Note: if you store C++ objects in this structure and do not store +// Note: if you store C++ objects in this structure and do not store // them as pointers, you must call yourself their constructor in the // CreateRunObject function and their destructor in the DestroyRunObject // function. As the RUNDATA structure is a simple C structure and not a C++ object. @@ -75,11 +83,11 @@ typedef RUNDATA * LPRDATA; // Default flags - see documentation for more info // ------------- -#define OEFLAGS 0 -#define OEPREFS 0 +#define OEFLAGS 0 +#define OEPREFS 0 // If to handle message, specify the priority of the handling procedure -// 0= low, 255= very high. You should use 100 as normal. +// 0= low, 255= very high. You should use 100 as normal. // -------------------------------------------------------------------- #define WINDOWPROC_PRIORITY 100 diff --git a/MMF2SDK/VOLINFO/Resource.h b/MMF2SDK_Unicode/VOLINFO/Resource.h similarity index 78% rename from MMF2SDK/VOLINFO/Resource.h rename to MMF2SDK_Unicode/VOLINFO/Resource.h index 01025157..8eb5246f 100644 --- a/MMF2SDK/VOLINFO/Resource.h +++ b/MMF2SDK_Unicode/VOLINFO/Resource.h @@ -2,7 +2,7 @@ // App Studio generated include file. // Used by Ext.rc // -#define _APS_NO_MFC 1 +#define _APS_NO_MFC 1 // About box information #define IDST_OBJNAME 128 @@ -12,10 +12,10 @@ #define IDST_HTTP 132 // Dialog Box ID -#define DB_SETUP 20003 +#define DB_SETUP 20003 // Help ID -#define ID_HELP 20004 +#define ID_HELP 20004 // Actions @@ -25,10 +25,10 @@ #define MN_ACTIONS 20000 // Commands of action menu -#define IDMN_ACTION 25000 +#define IDMN_ACTION 25000 // Action strings -#define M_ACTION 5000 +#define M_ACTION 5000 // Titles of action parameters #define M_ACT_P1 5501 @@ -73,13 +73,13 @@ #define M_EXP_P2 7501 // Next default values for new objects -// +// #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 101 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/MMF2SDK/VOLINFO/Runtime.cpp b/MMF2SDK_Unicode/VOLINFO/Runtime.cpp similarity index 86% rename from MMF2SDK/VOLINFO/Runtime.cpp rename to MMF2SDK_Unicode/VOLINFO/Runtime.cpp index 8f3f4a81..36a19b42 100644 --- a/MMF2SDK/VOLINFO/Runtime.cpp +++ b/MMF2SDK_Unicode/VOLINFO/Runtime.cpp @@ -3,7 +3,7 @@ // This file contains routines that are handled during the Runtime. // // Including creating, display, and handling your object. -// +// // ============================================================================ // Common Include @@ -44,7 +44,7 @@ WORD DebugTree[]= // GetRunObjectDataSize // -------------------- // Returns the size of the runtime datazone of the object -// +// ushort WINAPI DLLExport GetRunObjectDataSize(fprh rhPtr, LPEDATA edPtr) { return(sizeof(RUNDATA)); @@ -55,15 +55,15 @@ ushort WINAPI DLLExport GetRunObjectDataSize(fprh rhPtr, LPEDATA edPtr) // CreateRunObject // --------------- // The routine where the object is actually created -// +// short WINAPI DLLExport CreateRunObject(LPRDATA rdPtr, LPEDATA edPtr, fpcob cobPtr) { /* - This routine runs when your object is created, as you might have guessed. - It is here that you must transfer any data you need in rdPtr from edPtr, - because after this has finished you cannot access it again! - Also, if you have anything to initialise (e.g. dynamic arrays, surface objects) - you should do it here, and free your resources in DestroyRunObject. + This routine runs when your object is created, as you might have guessed. + It is here that you must transfer any data you need in rdPtr from edPtr, + because after this has finished you cannot access it again! + Also, if you have anything to initialise (e.g. dynamic arrays, surface objects) + you should do it here, and free your resources in DestroyRunObject. */ // No errors return 0; @@ -74,12 +74,12 @@ short WINAPI DLLExport CreateRunObject(LPRDATA rdPtr, LPEDATA edPtr, fpcob cobPt // DestroyRunObject // ---------------- // Destroys the run-time object -// +// short WINAPI DLLExport DestroyRunObject(LPRDATA rdPtr, long fast) { /* - When your object is destroyed (either with a Destroy action or at the end of - the frame) this routine is called. You must free any resources you have allocated! + When your object is destroyed (either with a Destroy action or at the end of + the frame) this routine is called. You must free any resources you have allocated! */ // No errors return 0; @@ -90,38 +90,38 @@ short WINAPI DLLExport DestroyRunObject(LPRDATA rdPtr, long fast) // HandleRunObject // ---------------- // Called (if you want) each loop, this routine makes the object live -// +// short WINAPI DLLExport HandleRunObject(LPRDATA rdPtr) { /* - If your extension will draw to the MMF window you should first - check if anything about its display has changed : + If your extension will draw to the MMF window you should first + check if anything about its display has changed : - if (rdPtr->roc.rcChanged) - return REFLAG_DISPLAY; - else - return 0; + if (rdPtr->roc.rcChanged) + return REFLAG_DISPLAY; + else + return 0; - You will also need to make sure you change this flag yourself - to 1 whenever you want to redraw your object + You will also need to make sure you change this flag yourself + to 1 whenever you want to redraw your object + + If your extension won't draw to the window, but it still needs + to do something every MMF loop use : - If your extension won't draw to the window, but it still needs - to do something every MMF loop use : + return 0; - return 0; + If you don't need to do something every loop, use : - If you don't need to do something every loop, use : + return REFLAG_ONESHOT; - return REFLAG_ONESHOT; + This doesn't mean this function can never run again. If you want MMF + to handle your object again (causing this code to run) use this function: - This doesn't mean this function can never run again. If you want MMF - to handle your object again (causing this code to run) use this function: + callRun-timeFunction(rdPtr, RFUNCTION_REHANDLE, 0, 0); - callRun-timeFunction(rdPtr, RFUNCTION_REHANDLE, 0, 0); - - At the end of the loop this code will run + At the end of the loop this code will run */ - // Will not be called next loop + // Will not be called next loop return REFLAG_ONESHOT; } @@ -129,11 +129,11 @@ short WINAPI DLLExport HandleRunObject(LPRDATA rdPtr) // DisplayRunObject // ---------------- // Draw the object in the application screen. -// +// short WINAPI DLLExport DisplayRunObject(LPRDATA rdPtr) { /* - If you return REFLAG_DISPLAY in HandleRunObject this routine will run. + If you return REFLAG_DISPLAY in HandleRunObject this routine will run. */ // Ok return 0; @@ -147,7 +147,7 @@ short WINAPI DLLExport DisplayRunObject(LPRDATA rdPtr) // in DisplayRunObject too, but this is automatically done if you implement // GetRunObjectSurface (MMF applies the ink effect to the surface). // -// Note: do not forget to enable the function in the .def file +// Note: do not forget to enable the function in the .def file // if you remove the comments below. /* cSurface* WINAPI DLLExport GetRunObjectSurface(LPRDATA rdPtr) @@ -164,7 +164,7 @@ cSurface* WINAPI DLLExport GetRunObjectSurface(LPRDATA rdPtr) // // Should return NULL if the object is not transparent. // -// Note: do not forget to enable the function in the .def file +// Note: do not forget to enable the function in the .def file // if you remove the comments below. // /* @@ -208,7 +208,7 @@ LPSMASK WINAPI DLLExport GetRunObjectCollisionMask(LPRDATA rdPtr, LPARAM lParam) // PauseRunObject // ---------------- // Enters the pause mode -// +// short WINAPI DLLExport PauseRunObject(LPRDATA rdPtr) { // Ok @@ -231,7 +231,7 @@ short WINAPI DLLExport ContinueRunObject(LPRDATA rdPtr) // ============================================================================ // // START APP / END APP / START FRAME / END FRAME routines -// +// // ============================================================================ // ------------------- @@ -239,7 +239,7 @@ short WINAPI DLLExport ContinueRunObject(LPRDATA rdPtr) // ------------------- // Called when the application starts or restarts. // Useful for storing global data -// +// void WINAPI DLLExport StartApp(mv _far *mV, CRunApp* pApp) { // Example @@ -257,7 +257,7 @@ void WINAPI DLLExport StartApp(mv _far *mV, CRunApp* pApp) // EndApp // ------------------- // Called when the application ends. -// +// void WINAPI DLLExport EndApp(mv _far *mV, CRunApp* pApp) { // Example @@ -275,7 +275,7 @@ void WINAPI DLLExport EndApp(mv _far *mV, CRunApp* pApp) // StartFrame // ------------------- // Called when the frame starts or restarts. -// +// void WINAPI DLLExport StartFrame(mv _far *mV, DWORD dwReserved, int nFrameIndex) { } @@ -284,7 +284,7 @@ void WINAPI DLLExport StartFrame(mv _far *mV, DWORD dwReserved, int nFrameIndex) // EndFrame // ------------------- // Called when the frame ends. -// +// void WINAPI DLLExport EndFrame(mv _far *mV, DWORD dwReserved, int nFrameIndex) { } @@ -292,17 +292,17 @@ void WINAPI DLLExport EndFrame(mv _far *mV, DWORD dwReserved, int nFrameIndex) // ============================================================================ // // TEXT ROUTINES (if OEFLAG_TEXT) -// +// // ============================================================================ // ------------------- // GetRunObjectFont // ------------------- // Return the font used by the object. -// +// /* - // Note: do not forget to enable the functions in the .def file + // Note: do not forget to enable the functions in the .def file // if you remove the comments below. void WINAPI GetRunObjectFont(LPRDATA rdPtr, LOGFONT* pLf) @@ -316,7 +316,7 @@ void WINAPI GetRunObjectFont(LPRDATA rdPtr, LOGFONT* pLf) // SetRunObjectFont // ------------------- // Change the font used by the object. -// +// void WINAPI SetRunObjectFont(LPRDATA rdPtr, LOGFONT* pLf, RECT* pRc) { // Example @@ -336,7 +336,7 @@ void WINAPI SetRunObjectFont(LPRDATA rdPtr, LOGFONT* pLf, RECT* pRc) // GetRunObjectTextColor // --------------------- // Return the text color of the object. -// +// COLORREF WINAPI GetRunObjectTextColor(LPRDATA rdPtr) { // Example @@ -348,7 +348,7 @@ COLORREF WINAPI GetRunObjectTextColor(LPRDATA rdPtr) // SetRunObjectTextColor // --------------------- // Change the text color of the object. -// +// void WINAPI SetRunObjectTextColor(LPRDATA rdPtr, COLORREF rgb) { // Example @@ -364,7 +364,7 @@ void WINAPI SetRunObjectTextColor(LPRDATA rdPtr, COLORREF rgb) // WINDOWPROC (interception of messages sent to hMainWin and hEditWin) // // Do not forget to enable the WindowProc function in the .def file if you implement it -// +// // ============================================================================ /* // Get the pointer to the object's data from its window handle @@ -416,7 +416,7 @@ LRESULT CALLBACK DLLExport WindowProc(LPRH rhPtr, HWND hWnd, UINT nMsg, WPARAM w // ============================================================================ // // DEBUGGER ROUTINES -// +// // ============================================================================ // ----------------- @@ -438,7 +438,7 @@ LPWORD WINAPI DLLExport GetDebugTree(LPRDATA rdPtr) // ----------------- // This routine returns the text of a given item. // -void WINAPI DLLExport GetDebugItem(LPSTR pBuffer, LPRDATA rdPtr, int id) +void WINAPI DLLExport GetDebugItem(LPTSTR pBuffer, LPRDATA rdPtr, int id) { #if !defined(RUN_ONLY) diff --git a/MMF2SDK/VOLINFO/VOLINFO Example.mfa b/MMF2SDK_Unicode/VOLINFO/VOLINFO Example.mfa similarity index 100% rename from MMF2SDK/VOLINFO/VOLINFO Example.mfa rename to MMF2SDK_Unicode/VOLINFO/VOLINFO Example.mfa diff --git a/MMF2SDK/VOLINFO/res/EXTICON.BMP b/MMF2SDK_Unicode/VOLINFO/res/EXTICON.BMP similarity index 100% rename from MMF2SDK/VOLINFO/res/EXTICON.BMP rename to MMF2SDK_Unicode/VOLINFO/res/EXTICON.BMP diff --git a/MMF2SDK/VOLINFO/res/EXTIMG.BMP b/MMF2SDK_Unicode/VOLINFO/res/EXTIMG.BMP similarity index 100% rename from MMF2SDK/VOLINFO/res/EXTIMG.BMP rename to MMF2SDK_Unicode/VOLINFO/res/EXTIMG.BMP From a6354110fde9ffbfe082aa5f4cbb14e1689c1b6d Mon Sep 17 00:00:00 2001 From: RainbowHype123 Date: Sun, 28 Jun 2026 14:42:27 -0700 Subject: [PATCH 03/17] Reorganizing & removing unneeded files I also renamed the preprocessor MULTIPLEICONS to DARKEDIF_MULTIPLE_ICONS, per Phi's request. There's still a little more work to do. --- .gitignore | 2 + AllExts VS2017.sln | 2 +- AllExts VS2019.sln | 2 +- DarkEdif/DarkEdif Template/Edittime.cpp | 2 +- DarkEdif/DarkEdif Template/Ext.rc | 2 +- DarkEdif/DarkEdif Template/Resource.h | 2 +- DarkEdif/Inc/Shared/Edif.hpp | 2 +- DarkEdif/Lib/Shared/Edif.cpp | 2 +- MMF2SDK_Unicode/VOLINFO/.gitattributes | 22 - MMF2SDK_Unicode/VOLINFO/.gitignore | 163 ---- .../VOLINFO/Examples/VOLINFO Example.mfa | Bin 0 -> 113551 bytes MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.sln | 40 - .../VOLINFO/MMF2SDK - VOLINFO.vcproj | 807 ------------------ MMF2SDK_Unicode/VOLINFO/Runtime.cpp | 2 +- MMF2SDK_Unicode/VOLINFO/VOLINFO Example.mfa | Bin 217415 -> 0 bytes rSDK/ZlibStream/Ext.rc | 8 +- rSDK/ZlibStream/{ => Icons}/Icon.bmp | Bin rSDK/ZlibStream/{ => Icons}/Img.bmp | Bin rSDK/ZlibStream/Runtime.cpp | 78 +- rSDK/ZlibStream/UpgradeLog.htm | Bin 31898 -> 0 bytes rSDK/ZlibStream/UpgradeLog2.htm | Bin 31898 -> 0 bytes 21 files changed, 53 insertions(+), 1083 deletions(-) delete mode 100644 MMF2SDK_Unicode/VOLINFO/.gitattributes delete mode 100644 MMF2SDK_Unicode/VOLINFO/.gitignore create mode 100644 MMF2SDK_Unicode/VOLINFO/Examples/VOLINFO Example.mfa delete mode 100644 MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.sln delete mode 100644 MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcproj delete mode 100644 MMF2SDK_Unicode/VOLINFO/VOLINFO Example.mfa rename rSDK/ZlibStream/{ => Icons}/Icon.bmp (100%) rename rSDK/ZlibStream/{ => Icons}/Img.bmp (100%) delete mode 100644 rSDK/ZlibStream/UpgradeLog.htm delete mode 100644 rSDK/ZlibStream/UpgradeLog2.htm diff --git a/.gitignore b/.gitignore index 01880e6d..020f4c70 100644 --- a/.gitignore +++ b/.gitignore @@ -204,3 +204,5 @@ DarkEdif*.sln *.sdf *.db *.001 +*.mf2backup.mfa +*.mfacfg diff --git a/AllExts VS2017.sln b/AllExts VS2017.sln index 52d95c11..8428a228 100644 --- a/AllExts VS2017.sln +++ b/AllExts VS2017.sln @@ -45,7 +45,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BitMask", "MMF2SDK\Bit Mask EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PackX", "MMF2SDK\PackX\PackX.vcxproj", "{29B44557-9BC0-43BC-BBF6-0AB4C9B69198}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VOLINFO", "MMF2SDK\VOLINFO\VOLINFO.vcxproj", "{2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VOLINFO", "MMF2SDK_Unicode\VOLINFO\VOLINFO.vcxproj", "{2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Stochastic Utility", "Edif\Stochastic Utility\Stochastic Utility.vcxproj", "{5BC0EA76-0F7D-4F52-ADC9-CE378742E9B9}" EndProject diff --git a/AllExts VS2019.sln b/AllExts VS2019.sln index 56346ce9..01928f41 100644 --- a/AllExts VS2019.sln +++ b/AllExts VS2019.sln @@ -47,7 +47,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BitMask", "MMF2SDK\Bit Mask EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PackX", "MMF2SDK\PackX\PackX.vcxproj", "{29B44557-9BC0-43BC-BBF6-0AB4C9B69198}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VOLINFO", "MMF2SDK\VOLINFO\VOLINFO.vcxproj", "{2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VOLINFO", "MMF2SDK_Unicode\VOLINFO\VOLINFO.vcxproj", "{2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Stochastic Utility", "Edif\Stochastic Utility\Stochastic Utility.vcxproj", "{5BC0EA76-0F7D-4F52-ADC9-CE378742E9B9}" EndProject diff --git a/DarkEdif/DarkEdif Template/Edittime.cpp b/DarkEdif/DarkEdif Template/Edittime.cpp index 62555fb7..0a322989 100644 --- a/DarkEdif/DarkEdif Template/Edittime.cpp +++ b/DarkEdif/DarkEdif Template/Edittime.cpp @@ -19,7 +19,7 @@ int FusionAPI MakeIconEx(mv * mV, cSurface * pIconSf, TCHAR * lpName, ObjInfo * { #pragma DllExportHint pIconSf->Delete(); - #ifdef MULTIPLEICONS + #ifdef DARKEDIF_MULTIPLE_ICONS pIconSf->Clone(*Edif::SDK->Image); #else pIconSf->Clone(*Edif::SDK->Icon); diff --git a/DarkEdif/DarkEdif Template/Ext.rc b/DarkEdif/DarkEdif Template/Ext.rc index e27e3368..55f2825d 100644 --- a/DarkEdif/DarkEdif Template/Ext.rc +++ b/DarkEdif/DarkEdif Template/Ext.rc @@ -154,7 +154,7 @@ END #if EditorBuild IDR_EDIF_ICON Edif "Icon.png" -#ifdef MULTIPLEICONS +#ifdef DARKEDIF_MULTIPLE_ICONS IDR_EDIF_IMAGE Edif "Image.png" #endif #if !defined(DARKEXT_JSON_FILE_EXTERNAL) diff --git a/DarkEdif/DarkEdif Template/Resource.h b/DarkEdif/DarkEdif Template/Resource.h index e0c57c4a..176d27be 100644 --- a/DarkEdif/DarkEdif Template/Resource.h +++ b/DarkEdif/DarkEdif Template/Resource.h @@ -2,7 +2,7 @@ // Microsoft Developer Studio generated include file. // Used by Ext.rc // -#ifdef MULTIPLEICONS +#ifdef DARKEDIF_MULTIPLE_ICONS #define IDR_EDIF_IMAGE 100 #endif #define IDR_EDIF_ICON 101 diff --git a/DarkEdif/Inc/Shared/Edif.hpp b/DarkEdif/Inc/Shared/Edif.hpp index ece83500..bfcfc2c2 100644 --- a/DarkEdif/Inc/Shared/Edif.hpp +++ b/DarkEdif/Inc/Shared/Edif.hpp @@ -162,7 +162,7 @@ namespace Edif #if EditorBuild cSurface * Icon = nullptr; DarkEdif::Surface * ExtIcon = nullptr; -#ifdef MULTIPLEICONS +#ifdef DARKEDIF_MULTIPLE_ICONS cSurface * Image = nullptr; DarkEdif::Surface * ExtImage = nullptr; #endif diff --git a/DarkEdif/Lib/Shared/Edif.cpp b/DarkEdif/Lib/Shared/Edif.cpp index ebf45f22..6e01dfa8 100644 --- a/DarkEdif/Lib/Shared/Edif.cpp +++ b/DarkEdif/Lib/Shared/Edif.cpp @@ -699,7 +699,7 @@ Edif::SDKClass::SDKClass(mv * mV, json_value &_json) : json (_json) } ExtIcon = new DarkEdif::Surface(nullptr, Icon); - #ifdef MULTIPLEICONS + #ifdef DARKEDIF_MULTIPLE_ICONS Image = new cSurface(); char * ImageData; size_t ImageSize; diff --git a/MMF2SDK_Unicode/VOLINFO/.gitattributes b/MMF2SDK_Unicode/VOLINFO/.gitattributes deleted file mode 100644 index 412eeda7..00000000 --- a/MMF2SDK_Unicode/VOLINFO/.gitattributes +++ /dev/null @@ -1,22 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto - -# Custom for Visual Studio -*.cs diff=csharp -*.sln merge=union -*.csproj merge=union -*.vbproj merge=union -*.fsproj merge=union -*.dbproj merge=union - -# Standard to msysgit -*.doc diff=astextplain -*.DOC diff=astextplain -*.docx diff=astextplain -*.DOCX diff=astextplain -*.dot diff=astextplain -*.DOT diff=astextplain -*.pdf diff=astextplain -*.PDF diff=astextplain -*.rtf diff=astextplain -*.RTF diff=astextplain diff --git a/MMF2SDK_Unicode/VOLINFO/.gitignore b/MMF2SDK_Unicode/VOLINFO/.gitignore deleted file mode 100644 index 5ebd21a1..00000000 --- a/MMF2SDK_Unicode/VOLINFO/.gitignore +++ /dev/null @@ -1,163 +0,0 @@ -################# -## Eclipse -################# - -*.pydevproject -.project -.metadata -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.classpath -.settings/ -.loadpath - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# CDT-specific -.cproject - -# PDT-specific -.buildpath - - -################# -## Visual Studio -################# - -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. - -# User-specific files -*.suo -*.user -*.sln.docstates - -# Build results -[Dd]ebug/ -[Rr]elease/ -*_i.c -*_p.c -*.ilk -*.meta -*.obj -*.pch -*.pdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.vspscc -.builds -*.dotCover - -## TODO: If you have NuGet Package Restore enabled, uncomment this -#packages/ - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opensdf -*.sdf - -# Visual Studio profiler -*.psess -*.vsp - -# ReSharper is a .NET coding add-in -_ReSharper* - -# Installshield output folder -[Ee]xpress - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish - -# Others -[Bb]in -[Oo]bj -sql -TestResults -*.Cache -ClientBin -stylecop.* -~$* -*.dbmdl -Generated_Code #added for RIA/Silverlight projects - -# Backup & report files from converting an old project file to a newer -# Visual Studio version. Backup files are not needed, because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML - - - -############ -## Windows -############ - -# Windows image file caches -Thumbs.db - -# Folder config file -Desktop.ini - - -############# -## Python -############# - -*.py[co] - -# Packages -*.egg -*.egg-info -dist -build -eggs -parts -bin -var -sdist -develop-eggs -.installed.cfg - -# Installer logs -pip-log.txt - -# Unit test / coverage reports -.coverage -.tox - -#Translations -*.mo - -#Mr Developer -.mr.developer.cfg - -# Mac crap -.DS_Store diff --git a/MMF2SDK_Unicode/VOLINFO/Examples/VOLINFO Example.mfa b/MMF2SDK_Unicode/VOLINFO/Examples/VOLINFO Example.mfa new file mode 100644 index 0000000000000000000000000000000000000000..c50093082477f93ac74e4c447b1a4270892a7944 GIT binary patch literal 113551 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


58!+A-B1*9^W_`}O^%eiAb$_6 zIB>frxqkU}iSYQnftNICnT{Qd|I`MN1!=z~Jn0gWM}CVuz&|aS1-7y?{Yzg;V8vX+tL>8p|nl!l+;Sc9v9f(;K#g1h2 z*f8=Jh-ZCJ;QO&zqDhZ!5`S1L%H;)fmvDlR`CPI3PF|595r5xDune8g@k8CYFi!5q z_74dIdNdY$bxx2h5Jz2B@Mm-2tS9z2_zP>iYKuQpC;?(UVK5U2_BIxYh4nWr41bYT zk^sIk5(z_t(LjD6e+e&$y9|H-5BK^hpE-{?$2r^h%Q*7|L5LsX$%VNRFLq!^IK=-z z!hrG`B;}A%=l660QC28 zS3{c*4dTrZ_;Ui$Ks1;g781FN4=0Ss0{%C_x{+`oHYC~?Lmz>WKMsmzeTZ2PV!FSU z_)9J*1BgTY{JJa@s&rV^_ua^4XCHhCT(>`vJ`lZhnA1%4`Vy!M`Vo zKg6La8_o};c%m*`M|23dVdylBmnOUBfEmgNKlMeB&fNO7ZBPXq94hQ zrA4mxXSuajV#o6N&6e3>3RpSss^mvB^t$gVlnMZ;1B!!kt$K&AHtu7`2cRh zNFW{wz-vN9Rl&`VKd}1IaFojl6-LwpIcBePiG~$Bsl{lndVcSkw;zc0cU% zN4|;r)-wL{4gQz~Kt_VZBLSlMuy{tGIq@g@L(xd!0ef-Wcy1hTSl`QC&xaMbE(zbiAHStV4nWR_ix$QLo5K>sGrd?>FdE4TRjncIznA`NlK2zRZ8!-d z5}ZIH>H}YP_r>Bqrp$)IU+ThZf<#q;p?Ex)hy^zn{!!RY1fu?Ye~vH3hck*hitEGk z;f>;t;`?xXfFC%6@6Qe71am^saHIkA7j=;eN%^P|Ybguseh1j2*c1%x^y5(<518#C z=DRU}%mE1UPh$qDlzWNU5vci|Rcs!9e>)u9fx!3WpoqJ`o99CrPx+PSgO1{{IWDLR0<1o8 z`a_9(zXjl5rzMcE`tS)zQ9|uc%=baDd=E-Dt!}5jN2FLpVb?qmWU2Z`2d$18;#pFA$6LwV3`Th->XR6)ngy zB^vBC4@Vy%=Q}vVTtCeBm`bhmY$*KOkrIFq@nEq@(RfV&h2KQ`i(CEpEU++6AlD0c zea_JDLtVHoJg_+KC_tVc$m8-txnXD|O1xwN(ehNJKVM6rX*jRrz zmg|?O^Q>>w@B8=@zlm3ch);?PBl^Rlo2Wko-uh(xE11jSdr(|ZN5mGfrPxwT1&F|g z@66+HxtuT#j}wVTp?sh@vHJ-T$SD4?Y|PIEyNu`hVZ;}DeGaGtf}mKurz!9k{&w^B zhl%PtgV8{qm%t5yuPy@oVaGm~#YH&I91a@F=CPxQuJx9Zsjf4pRqzideSYjs7l&2Q z?_){gFQ%;<6MyObVUqnJjjUO;quViTGUgL3?C*2-wONJuB5YKn;Q4YX&cOP0;5xubt`K{!8^?>o0cSrL z4M(Hc{FXeksz&^ANyp>cz|y6Jbx2k|8FIMBCS7!j0TaORzqh6 zar9w@AAASEA4nhk3Kp<`;Ics-P!#3BI3F5@@}Six1Dz_><4@>)Xz5_l9$@!j_1#{+ z9=>iUnd|!o{l>*#!V|38A3{ch@R{)qUmq%}?~DW|!3+FtdX@SFHzW{&mE7>&kCAz+ z567P`mg&LXafg{+c=wBEdc}PGro*4ycT_AU3@gL%NNdB_hm!T3QLy3>@%RRRV2^+k zB5CtCH`h&lOLi~xk1Yw6NR+UKF{IZGvH&!1J=_jW; z!1{jTEw5(4U$`WGAHnQEJSHr(1B8|!|A+A>OVI0ww-g?^|9tVY3Jgurhd z*|z#{{P9>%7*=Be(f7h){g}@O>^_z$vzl0cqhcWDud_`lHV zw*dt4AKuqhrM|a?;g3rI=?e;D!ov5%V(@w! zeAVf6;#vL}xZvx5;MbiA>}`li^&XU9VJ)}p;V-rukW=j5$1|JZM12R|*W-pwb9EqZ z{T7Hn6VuDz#)QMMm>^yo5KBab>wrII2}culKNqw6Y;a#+IGrr4%KHS(jcI-Ghx!e# zXo$k=I}ozIgF}IR9nP@27tV4tm2&o*1OFi+XUJT~#@o>8j_Vf|&x1fjv-qlyNzN-;3z4gRjXa|U9 zhKWl+xX=>h*D*hc)%OxTPGCRadsajrVkq8&Ok|s6-R8sdd!qb4^l>r059@mn1Z9!; zeoMrkA`O3W9e~>bWK_7W_(y`14{acPK}*;R#(9xwc5_voHWvPo;;|mY3!mT*Z+&0* zdMAZlMe|ddRqKo6PkaTFhy+0WEG_}KB^WN@pV#glsER)aTmCT4i`jh5jo**pE*|OS zv#~A~GQUs3G(SGUpG`#iWdeT|VV8S|X#ui6BurQ%M%0Sd!c)ifKmL+AzJjs-J<{fD zZXD~0K0-{WMPd=MrWfdb1jc&;iK<>0?QzE6Z!m@US8ww-JN{z#Kly%?2cZXWOF+~u z1Z#xIs9R!CB%*X=emGEABZ7Mbk;3^A-^E{aKT70vWZdc#Nwu((hp_oj zH_2PSI<4O_@fZ6xrtmfp^$Lh&fP7Od<{M0_;xDw1#VR_Q8^1c^U1cRyli$N8_rmH9 zEYBm`_|wJa2B1Whpm^UXUM{FTV!BjS88 zstM7D^}NJeop64a$m)|l{DrHE46v|j4Lm>OC7dTt<_Abk@NIlp+)tLpYCg&ME}s%b z^zUKk9(uL#)<@ygRupwc9kBULQuF&Q*XFAZe<@!r{-%hyM}Sv~ko}p`@RwZ8jcQ%- z$K!i^%-ScbIxu@5ujNPK)J{0F7tZaZOTYDH4}VfmiG4e(N`6R`AE*w0SzlH0Cn~wg z7(Zt5kHwymvEMXL@67dqV2FXgHNJP{}j#UlTvudFEuqJc)U%h&2KRk7B;m?{1KvRgCm?MOHP#z$5teT%oI!b1u}%c zxUEN6dwBGU!b9-BeUaXGL*cCt-)g`*x!6n+|LUy1=0>%?vLF!^LNHsQ!)`G|Qcn5`F$S$mO0Mjz(%@frO@oCkRN!doAk-vDhs8MperkH3_f zVewi4kv$M9j1l895GynIlU*D5T~FXnYJ9@l=fHV=9A}PA2rGoeVG^^tzv<&@J@{9> z3EGiUrAZ0!BKn8?#Uq4b_2aUKKc34MTKYtM*B|TOgB^Tmh(ic+fO&u!LieSk5;wjS zYHs`*1Ap?2ZF`rNI}V?@M7;10oEH$ae}NeJ$c;O@RS0fM``%i_-N-S>OH|D1czJ?Gx(Q@b;}(=zo;Rae*a zRC_|cC#0DfMR+_JPCUb6-)arwaD>&YQ%@*HE+M`Vd_fz4B;d%Zpv2Ofr+ki!vXB|< zy_29V?4!h<(R9-MrGLQvUTW=C%%P+()$8a;$Yg2d!ME7EAkpM+zYdYD30~gKGGh`b zAjIH*Tcj>{dCqY1X!`~D+;gFW< zl*u%a#UE#`ot}GP>37sjD5GEAHsSoB_9c4ZjPwCd>Lr^LS2nAG_RiK4UCrKGU7l(= zjChgj+$x5b+5M4^Uh^1API}jrbvGP}WB52aF3?_+Px3t`WloVyvpb51NLqh|Uyo4j zMahRS`YBb&eUy~@6V4MeSQ5jyxkgQNFTByMXI%7WsE1zto2Q{A&sx`9IF?1riw|Ch z+)Fs~jf;22p&RVYv@bgJOj#UXqg7>e-FH8LdN+}Saeus52yGJig7G{cmrKOtD2?vG zEybcl+_Qz-5t))0;p=_Z>cE&axH0eY?R646y?*X+8!Zl=#fxvW30Ob9RCUQ=l%ww+KU&N@tFai=#wR1yoUkq1cWo?qmv1F zm+2I-gt6k8-vCCW(Yq?~T+e;!Wwc*!U8Z zj9j9uy>txF?;yVEz!#|q)k+w7{t9wDBdSH0UO|4^`Je2YCWa4)FL zp5V;~aRk<7v2SMtogqaVNr>+`tNM4?rP68R1ie~AFJtwo@48{k1wX1Pfi=r0eZTQh z3tfk;#*y@nccm&`xSDlUWFLM}xqv71Jv2>4w~TQ`d)MBPJ8G0-I0{W8c&?jX>vtB| zY$)F8N}I%0LV{qbPYxe7id$CjixGZy7vzttP@hPB>VoS3HFu$XLj6=-YUtD*WzvTc2Oq8?qNV`(1&Bt=2~Q_%AIZ^GP=>E7)L#4JZnj7iOsMZv^eO3LxPkEgF1=JeE%ggbF8%(_(S^oYU6bu7+V zIv>T$HkpQ3@nE{T>_5Y-D+-Bl_UyaWWy67<&hb1N*Y{uJ!5Z3wHrE>FRG*e^9=?K> zjK$BL!!sS_>~&e}ODgT&boO&1#8PbnJ&gp4ho_bGxKh((Im(hL{8>L8O2>m1nF*s3uiFGvMF)IfF4m8Wr;$DjUQ)lJW6 z;oG63ubcGpNf3I!j|rr{S0I&{y~(6#y*^%XUS}Nr>#J=yiV6O@x+R0{F8wIv-M}$E zGXapj&(|P`q_Abre?p=`J)W{1TC~n=xpp}aHvQJhz~FM9#_JF?V2dR|GrT)?k$re{ z!Z{tgl8)hB82bG0L+D-;de%;Q_mGmbEy^GB){ z`-RQ0;3)oUz5WNBeE z-JMD*PSclGzY~*m@6%PhE@7Abv$eu^XU?l_z8LxG$SX}=2Tu#!g>kUJ?K7z8QqO0R zvX3o3T^R=n?E}6o*C(sL6Ml<%QNIWrzqol{bcBze$_fPN&Z&!KkSKm=JdTMJ83ua_ z?{;l5RJ*EXi-MpRp5_{E+7Hxn0k=0JM_-cJv&3TqJz%SuM?|Ai6ykLbTM!yWYvnWY z&BdOyJ}ndm1m-VEMc5orPNRWwu9`a6eSYi1<*?EQ3cjywK#d^ z&lN6kaOPi}KxG#qHG;H6(E2nIOLA^O9~Z~TGHCkFgvc?r<$nF(@o&pfYuY{g=-9B2 z_uh6#CJ5CR%jIBoaPqa^kcSJwAKrmirhiyCrg`cx%UW+p*2SD;T;%pgLC(E>;K!ea z-hsM!2!U!^-!9J=Vrv<&9rZc=nQhAavrmnLQ*4>LOIH>%tki} zj&8_>@dBUE(|?Yc)J7jxKkt@@3O?~mcKbghDX)B(eALr z`VbN*SW?oV&A_1hivQ`XdOsx@A|CLRmT972$Zumf;WP&-8y( z71v?4-ooB);8)iDtS$tT#VMlmJj+PO#mqweyR#~xZ3UwSEhp0}Hs>KRc?FwbOg)rT z2$gY6)N-}Qq}rTV9O1)ani6XL%jGv09lC0>jYpy`^LIJpXMx{|C_4}s#49)0MGv&} z)pZPhWGCHSZDd}e&9a;DOqGK3V}DmSxZx3h@nKC@_-&_mdz&TZtu1x++?4z^o7?>Y z{m5*4)*tCJF5@4C$BYaYNcZ5MGlB%PTSS#$RLSqF^ZW<}Hw3mG(wU=_wYpzUn^V4J zC7VPtb@XfcYk1|<)R4cBFtb+paQu8J92(?m;axkejzX3*-ed#lK4KDR_nfXq!!XTep4*RJ*0IVK(@;Bz1ha}dU0I~gzthQy*;R1pt=!hsbF}VB zZ>cXFntb|OH|BgQbFu=R!yO$DdY3u!nXva{LuQ@w=Qn7ALiL15nHm=+aYVK#RTdUC(-&-XTQ zyFe%Hn=bD`)%uy7NIHq z1N3hkuVP{IQuVYpNnQ9Jn4<0a=QI}UNz1ELFihtueYAIKNzoRynW9oi3UHZ?4{UzIrv9&8+z!0PtWMssF5+#BO)zh>Yyb z&JS^z9~8|HD2+L)$av^#CUg=n~T3@%Y0~ZT_!}$+edLkL2?mi>G?Y z^jTzgH4L@_^a^B9BuKEOCAitM(!_g}FyJ9gGcrsdJ$>S^2p4q_ECMDbsphoRlT9ih z4ZX2A2Z)a~rayc-c^q4&dgNsQHFpN4xs!Msvu%(tXzo zJA7=~gaz$i+d*F&Kedsyw(=^X^!Fap0&31fEG1m^j^W5oF#>+)_j8+EB&JlT(v#wJ z;3oWz-t4W3sgIi4sTFEeip0_0jHM1o-X!4D-s{#e@m+q$nA%k>b)AoT-yXKNtxq?Z zoV-}Ecuil@)2f=MWUYW1h zsZm3`x|e>I;p%USv!DBIS12n6eq_beC&dhFX+=!g$+tV>o3_*!$iZ5>wWev;&!w`n@oC?&_`jBxt1v zN{$P+kGc{v=+?`Voav|a8D6!RGqE9TeTx^i^-o7y*g6@!{J}ZGMS~b_~r;wHMaE`inXD0ijMe zhlvx@Pj$`ZY;AaK(!jQ;RYyzTI3qj#es^-zsuo1Cup%Xi)sN%=_r8~?DzBLDM}eF~ z15$smXzDm?!-pzN@9wV7EbshIuevC%JbAQi-FO`VOh4O05Aw#Z*(pDgrZgm1>S^^j z4ASloAHMboC&isc5$_i<&Cc^6wiy@jm0tFqMbzLx%DytYt*wDw>|yrVl)Eylp1(3)%~KJ0RyQ;D;i0%e$tCn+L+4r*4S0>v;Z)`-(} zbli>&og+O8=^qv`P8Q8zz%Rf~I5xe}t!KhNTanq4c3mGSkzm*IS9?d5YyW=k^D$Nm zru3rsy{_psl-JU|H?_$lwc|lbOWok(x9k9my|$P6Xr7$2YG#0HlhDo5@ZbdI0>Y6O zRr4KJZT*>vj)vCNfr`{wrC5(&ihVINi_Wk($1}b*TR7W7;M3EJw_pwEhBG8nvd=C) zuEOZ`dQU^w1;Pwtr&m=+!j6FJRP$rCa|e&MxU2=9&f8Q1s&<>6!{#g_WjzD?nXr(> zDXscz<;TB*~Rrw1#Jz9mTh zQ!&RL%N#8xzLPE7;Je%Tsvvxk1D`$-M5j!P(MrSeF39N=;^@K*#RcsR9b^VO-R$;0|&M z)wCNOm>Yv+>Iqka;ztP=F;T*t`2bs~w5+KYYpKgU@!aW;?qnH57_}Oj#wIIb!xpB_ z{z%%3jkz4eSA3`Zc3ndwg~r=Fw|jg7+CK?*cLRc|K<9VgkuqO< zL3?;^|0!u*%nHpR!N(t#r-3Dj<wv@$kanp=ki@X}N2O0QPd!>{ ztLak?0kSR4dUh-<=tsee#S56Jlx=>u1QINJ;5q@=%EGvvMfh#?gtoc{{>4}w8Nro* zO3a-9jGT+T+Qwsa`mPG;k$q)h|7%o)MF)@6&Xul5$c7CG+jTibSKis?_EBrn=oQ7O z<*$lv>K4Ss`nf|+&*xk`-K@fTd#D+H&edh+GnhS1aJElNQ#n=TqVfc{>SWEm5tqxr zY+v%n5O`VmV(!9MtbODhY8nDFuJz7p@woM*jd|y2rUl)R*p@jB`5MSpH=`Z)baaEY z=)cjQ-}{M#&9hQ8u~78E`)HA_HkL+qzH6=TrrTaROwuDOueG0<)_2AWqzx^P(njiO?r%$f5(^sx`QtFUaA z^Z{30TIVS-A18g+Ux4(;uJq+S)x|(!Ba=yuRqJXapVs$8mlLYhBmod3q6JDad!dx9QIhQOD} zl^-5rX}Gd7HZ`{Zw+nnQ4{NtwDG-+@xTnfqY4$ST`We))D`Vi82unyW$fID5k%!t@ zgX<`u;-cW;c=YuCQ(L>dknOxuqel`urYRX zr>DlgwffrF;yA8R@Q*NEvQ5}ddwOBxDDl3jL&1{FJ=oLQu#?!_F>NrSsvzCO<5`gGCSI zyvtmohe5K$T58yRSX&E2iwn%tx4`=>>o8{LLH1{V!8AK&4Vrp3C|{<2Nu1lvvfzT@(uRbIQl7lXLd$~7^Yc6+<0Uc^lZ$W%vtgmcK398 zt!ZeD>2_?}_2y2OhpP6(Os0di&G{@}D-~`MY;9I!X`*@bZ^DRS9-3pyjpEjpM0K;X z>^R!n=#(FY0`IU*rbkKPf$DiIdrh8hv%$Od!4Jt9y(#VtKBWxT2c~vPyW)2AJ+Lp= zs$61_D){|-c{-YEfkT7mw`4$U_x*_s+sK~=`aIB}21`O(i&$u%EKH7VrWq8U8IScp zbPX^!AS(j>4GMg|>!KKL%P3dE`tv}95;#XE>n!3!vvsNBAi1M|o=i*2$3{9e(k-Pb z`Mn5ckt^Y!Un%alhI*LIZ6ZZA-|UnntIJJGs1KvBT(UW>fW7PEf%tbQf7l@z8@*_F z=Ct{eU!40+^A8B3zoeQ0zGlw9zJxCX?$Nu;TN^G+jrs;!pIKNT?(=kUSy|o+L%0F| z5*2H9Ux_+6z3G4Gey|Z7slaPmy3MrTc~*5nSCBt^{u8?#mVo8~clK)0+&Nb|iTgnp zXV+jla0kTIIiK@LUh39^UUl6xiB=v=dc;ewv!)(r?uUUVj5dI(iu(Q`i@?1w&W&?! z0{;eFr(5fq-C#RYF$}L9Po--}wWYyffff9H)Os-wntfA}RFSa9x`O*$!FvmWnMm8I zOQ>w_P;_zAV?)AixwHueq2gA*=4?mH#x*Mq-C-areRU@tgQo@M%cr&#^4MwZu;=)b zpP1xmeo7y2Zii<@UaY8I+{43{61Ul+;P7q!8GqB_Cy({FxDnId8Ui9NH?-M;)b8xC<&-3xQ*83$z7gR9x91Oof9y#N_IH zI6L75+nxI)AIck^ODXI~}N|Ge^DpuUq z-5fGtAOCTCJ>Dqv!k_NO9XUD{RsPmU1PS_DO+mq^m8(GyRxBAHW1WxRlA#yNuTJww z@-yH|5mjzJSwKXOgkw`gEOv5d1z;Tl{In-MJs_CDYmUK{2`NL(>-779lO;`F)|Oi; zAH|6l_y70R#B2(`QcG^o)%D`e@230iu-Ix z%lIA@MTE(N^D5a#Wk1~o24gQS^nWxdH-PSJ7e_t3!y_zz^|&WtFYjAQ9A<2+@hv^` z>Fh3PM$snjbfK#o*&n9J3_JOZ_kOB|j3?-@+ff%8g|7S!?#HC;b3wY`F~eHZSt)*5 zcUsZESIN*9Jo7}p+7=N(p>4Vua(|du?NKhP;Db4_4rL!7zu|5sJlUHD&hZJgU}^SA z_`19A9l3=EB;2t@hd&Wqk0(kWgb=wlLSJH?k?=t~>*Pk8Q)}9wPW~Tb%_93<**n!WKFdq1b6oY6~2YU2YKO60(a&}GI&pq#Z8!z@u zfdDmUVM$MI)b8E%T0ul`s5S7nA`po>nGNE$^WxRz}>pzRV*ELi9oVYj_+xU8&Ew7eC~iJA=g zTbXTayxeYm{)x&<)*_ICzMb$1iT(2s&yk?pQ(a;NgrU%8XV_j-$=B>5f}b7o)arV! zBp#oYyuCIMna%>YOlnVRePeI4mF4IxJ2AU8*~`_(&1M zn_8lP?#5da4@Ruab1*;P2pG&Ii_d1T8r-M*M_q0GJrB&SZ4bxxsz%k###OFZEH#ON zd39psl-lp7+@wE)F&e4bm6InFbGC=4qG9Co4dzh;ok2!_>xiSeZ;kDDv-{PiI1U9J zF9#JHjeimTSvp!%T7>|F=5}#l= zg#kXQPf1R=d3czhAd|F?H52x(=TytrEapuSdkZr~+qR3s#41Hd*kfNiyKVoaw2nTg zr4DCFe<5}yBy+jJ{vhKVDO1QG-Im4TnzDYKY6*!LU30e9CZ3qzed?ZwDVzJkikZ?l zE#b%674%+oSx|ET`@q`jQ%*iQm1t$y4J|(q9x|;7X9X7AoXjgf<*5qQj@+n*W z^qr0$>E9B_^K1z027O25apt@)Ni!ajRwmV;us43H2+nRPz zRLpgzlD&9|?U|F;l2z@iJC+0P#?Atz>1fg8WxdxoyP0DTnU9ve{bb1PaP@h0e4!c87O_KxvK@MnPx=bNX&ay-N2k*q_}qG$s1qH=|Z-%g&^ zRAXop+Sg@5!p&pCthDE*0UcvA`A56=u~Z9%`CmIKghCCJI|{9#JH?%NT#$KR__}x_ zjf2_T7z#r}hNmP&{~7r!M76@7Ijm|UYz?%u&J)+vb7Y+G!)c*^gzR{g>%sRwcT;)gyly8VZFoRQf3wnhm9-US_BRnDT^Ym z>tmz90u*S__GtQc(xaHjF~o<`|8hHycR1uJycyo@o8`Qs5-d+X#XAW`R92T?nYJ63 z%g#AtVP7r$)i~{==6gDDC(D`q3RdrPGi~x9td~k^UpiiVaV`A#2F?eMmNfOkj!;pX zPfrl&7N+UF$v&duV}RF~-J|Lm;%)H7)-?TLh8 zh}JL`vc`Wb_AJmW-G^kFRLKKzh+4ny*$-XfFMpXP5MT;+nng7rwdYt-S6yLmKv*YL zQ$tRw3RbSf*?J~CZMv(W>qDxVgyvy(MKf?tw2iOl9KeV7E>*STHq0y&#q}?|=TuO) zgK@R2^gWOGZM#dh*qA9l&+rrcq8DlMyw{u0D^BQtb!hG2lvh|GS6(<{ID*QkM!*{* zEOdQ=DHgy0b#$Y@`KX669~yNr`D1fAe$2^4(0_kS5U>9gWNu+u&crbBriZ~K1eAlk zZ;z^TqY{e5m)+)fbiOoQmhog=5nuGBK9CM&fy9pKym2gBpvB_;=R^;xkT)PB9Y=Zo9jOsidveMzY6Qf=c z=r^BUQ^&JD)qv%G6GjGje2#)oYmmOp6$`4ByvgVYVtB_?DCms93eHTwxtX|DEW~zx z`7(>&Q)}&=7hmK%&9GpycC3D}4x}o1E#;-U1b1iewQrGlHqP|F_zRiz^mQ_l6H=e9 z4hQoeyOYMQC?LUJ4IG@)>PS&Av{>T<;c??&8C{JT&gz7TC=H1Ag-Fpne#3Wuv zEkLI(IXQ`N&n8HPPy`HxWR-*1u+K;j;=DNL<|Z^W^M?3e!8-AE;9hA@%os<%*v$Gb ztp{hnAFJ7M#cg(iMQyp1Begvf@wY9l0{m{THda^$yr9)wJ_U`!t&IugxeY>^sd0V6 zq*1A7(I~`s3hB;n~`K%E5>e%i3|kKm98DEwmsfEe^+ghiBgAVVR(H zR6Hp2j;Xcy*sLs(TbyG4@%A0nLfbt#ecd%KoF z@+tvjuzmRYtuU!FL!PakMD@q=x-N|p` zjuEORy8|Lbzk)_S{iGRE+mF8B*3=Yh3nc6T2S5d!m-@wZ|58FYJxtlr9Nc@~D{9Ms zS4k|jNGi<|2G|gUGILAdla##o#Y}r`T?jrc*F)wL8Jywal}XJaoveK2)g_Ek)%;W; zCW1kxw{h1jA=b*-Jh&$lzZ2@=^S2MxiX;Pjut3O{27M+xH~rcJA>EC|1@f}EpAp;Xb4f!vF`UHWd{6w4rX#YHe|mF zpeSGxcpBj;k_|wOxrr+0eYP)pY$|_nM}HQ5fp3N~9hNAb_o^C1ks?g6Lw7Hze?Vm- z+T#BF^u636$WX*#vMAT7D53rL5~HyR2Uc3jpZep;4i;+-iGyR}x6KA}qS9I#zQHLKo`5qJ-xxmU3YO1<0A4BTbXPD;ez-Lne3|8}>#lTVgB znk|Ie5v2TQ(sxP_4@83cGswn}Tau96Q~{~OcuJu|z^o8h?D4SjbWG}~PHfNDboQ=f zLb%lVauO{PbgHv_)Vp1I{U=$w+m}L+BpcUcU|^-)<3VaW3yXz_Jw>$7rf%T1m$$zm zizX8FeTl+!IHucdI_Q{wdU}GFqqh2Jxg91)HCmT5lkR;Y>Xt@z$#FUp!A?SwsxK%g z*zD^IpGMWGlJr6PGdczaI{L+>TX4tl-38N*q&a*w0Z#sRr*UQ3w-J^ST&>7YY!Sa z;5uf~&(Ic>p28>xz1lhA|C#h~e_0sMMD+t1vevHPbN}X4{con>69z0(!0WB~u!(~t z;aJA;bM)S8FXv>Z%(BxV(!q%nInED@yKY<_2G=eOFshG=E77HL;UGlyZhy0SZ$#y zg}9%oNpD5@k>p%BYwD4B*cNYhy$RJ`g%_XBZa*s$rSMt zcoVRcgavX*W;YaZ-n}X&cgDVzc=i`wSTIOU-#@Z-=U>td7tb)2ks7CAI&+-jbE1%jb)4CT|*{9 zA8EbHOj_-CChu#Jo(h#NNVfz7)Yd3f;=GdRQT^U;NamtNbm*(LYrWA%;D|and%M3+ zLK>PdUhl8k&^l0L(y9K!xMlMe%olz#e|rns8_g7Em)KLu{>RlAPaZj6?|$^4J)F#% zM#RzQeQ{S!*%OX=xOY5XoX?wweJWf~^CnZp@pFb#58kMF0lMut^X&NS3^z~hsVQVU zf9!Lx6QyxR@e~pw5u1L)MSN8z>~Rg|CAla$d1|!O=(Nygwz4=wGfXswl_D0l#clm_ zz@-u4`Qhepc5rqGabj*_T1`_u&!QkmaR*G{^jf``ht7((poMU_bH4ZQ;%IJk0*26d z;GZ*fu+O8?1Fxx*n%a1P9EMyP6_5AmvHoXg@wKn3`LeIbxSBxO#-f>-Geg^~tRpt$UKm}nuEb2W@QE{om2hT`AzN!|juxsJBHy9ywWhDZWgjqsz zc?A`la(|IZ`tj;`b!Gw{Q6@1gEcI(H0{xAB$&kYPm4xv|rPZ)6&WKuJouYXx%%zA^ zfS#=118RSPHDQtq!?CdEA?6bPK2KIp&%gkoh7jjTRuRLUn;ZG8VqkJY!-i`{i&%l9 zWQG;G58an7(&ZQ`0;B10IX;L00I7O2dDP{2Y~hhzVp9t!~o!vaWdZZ z@-xS4sR0l4v<`CIl1(An7ubS`%S1w&^*?d=$leKY_>Z-D{-xmLhotQ9aEXa!&}C~$Oi z1S~Br0mH+?Kx=C&P*_+9Bqt{W5fKr9x3@Q7VPOGiYH9+Kl9B*7H#a~490%J#yKYQVXzXCIhsR zAb4II0FOlxz#!uWUSN~K+YJGFdbWVd$~hoCeHh;69>Cqb5#Hufc$>2US=j_YSU4Kq zZg+r%#RQ{u>Sy1Ytsni>y`q^vgtrH ze>~vN0s@?=+yM(B3qTh`7m!6$1cc#<9iCu&djJd!24HZ0!Q9;en4%&8qooC)aPI8E zX&6qma7u?$D4ZPNqzNZsIMKohwgktZCjo#}I>XD51z;dr;L!#Ejw}FR&JX~4bOE4J z6`miSA%YzM+^GP-ga`l>G2msO!Sln0;S>QUNdR^U0FW&JSc6wOR*MGoq@w|~5okcZ zI~tH+fd)iqq5GzKtqow4uLq*1Hf)W2GAPf0c7xs@!%C>umAuWye(sw!$9d)ArL(k3OEed0Gf@80Dmbr zK${M~N21}41i>%T8BQi}`sczW;lvLo1~`!cz!JsJKwr}%;R9tHr^NCY?+ zVgM%Ta2_2|0km^e0K)(+z|aV%d^jc00<@u20M$Rt*n(d${JsTh;apCKX9x|2GuZ)N z7rZiYaR3H^^Jfo^&sHs**M$IVE*pT2!TCJ^=NT9Tz-rwANWKlQ7HR?cFrc9UdvLj0gVWf52+qsP zEnwgh0t_5o0t0LCZ+MuZfw4W{5t0nt?nMB%YyQCPoC9z>W&+&yr~bDB{(As}|G@OmfAH;>%fHGAev1IF z;R*SFQ%?UmAL$?E^f-0~gH_33Vq(5!>aV2KPeMSAy&&9|ajmCloov1#TM<2tTWurO*mW<1x60-!_wndM1YU_zohH0haT$BWdf>#{ zYubBms=&Fb$0Is_hC0;yrK&(I=-=L%pYx@S ze?W@QT5sBFb8e*XF!mC5sJ-vKcDrXCkj`6+Fvb?5*!NnX6mM9f#)Ubr;8PAfrZ(n}GL_$Yt;85PZ{L&QWM{zf8|7p#(s**;P+PL^VJe&;Xuc>b% z(2@G=_e?kxb8Z z506(on9PO0reR~7iB5rDULUlcw>~a`##9%XS48|;O5*H);8T}S~t$n(N$9P zKc<^OE#0D>F;R&kUuTj_*}0x047i<1;Kb%F{8EV^#lo%KPwsJXTK(-ZI_ZS>r<~BL z_NR&_z2wkt;sAQnU+<`Kjubg&>A`KWq0!$XPZ#a$a_uTRTy(hj@l+c@cbg3pJ*g(l z&l}N~*Y0Hu>1a>qu46>q_m)S27(Dn({{vQ06)Nvq_3yJ3P8rOhuH_-XI*QV#G3(eL$m z1N66lzfLk&ADQdCCQN2bzO27DC2ZRi+_JgsVikFTzj0rt7KM(og3b5DdLPg^@~CAh zE>{BT`bXx3;Kx20fBn<8)rpgSFMrV6Vj3ce?D)AbnOWc&^PelXYCOqnz;O_43DR=w^ z$49T*Anv`>e{h8y!63s* zsx}^WefBP9p#(@YDwb_j&iHVWU zO4K&$1o#%xoi4q3gs=p8EJVz22t90t99u`&lD$KNTfYn1iiEsUp5RL-8V{E&opQ;zK)EUq~aro5}&xSx=-=S>d(i!vBx!kqbOve?_n@$n_w1S!o-3ClYl>F>E8 zy2!CZt@Ul}lWD@V>CVEGhAB{w?*aig-9I5obz&8Cqf&Kkc{2$@%GfAHOEh+4IG%zkiK#pEc0Q*OHb6;tc z{g3csz;$U3T$e5_q-UMA1^Tl4&JSY^s*NJM{I>zanFAvZQGk7&o&DjiWUb+n;2ee@>tRVY(s z;#2@wxo%{aM8+c$8n=27`RPWf=NJ9r#+gLj%;EQ-xhUIu1EBX8dTeE!Z3j%bZs(#) ziWVofM&7`~^M)riwo-*8X^P{M5?`5$b#%omp5~Tb`R^myN( zHGSAi_QessR|Y#(Ik7T`6nT}e{py(&ehZMAtoS`kh2Yrp^{CkMAmU(Ux5G5*f(=0#~69%bTui!(BR zsHiDabyLg*x@VN`=hw@G<@}s23anE$`m}wGr23+a85NH0NBMuT?fO3yGd8@N#QsNS zf&VJzS<%DNWL|i1{5odJ%yZrGZ@^4k%yg5y^7Ygh=yiUnh z66z57Aa3O5%hgO3@619VR~Q(u_F}1FXXUlalVd5$4p;PR1N`kRt`XH9pX4g77i#Lr zloD3x_`y)W=Wq$VFZsu(`iyhBU#Vd(cU?7Q@MyGY*4FiYMyy$ZuFUq|=dh!wVZ;;5 z5b#9ySayg@5c*RN9VEmBIp*8r4<<(PU};9m;9K@I#QTd#nH~`OkLYcgjLdFR;4b%F zB6YU6nD?RPI@-yw`OJ}8X?2N?zL`|@i?D7KqCsI>1cp?NBDMF~2Dw})7e+~zFDc(D zzDXJ;G6H|EimI6_eCOD>=yJDqI9>z6=S#1g__N?1>68&We{wPZM9oM3>SOX*Yt$Tl zlBj=R&s`_@P4!j)@@j^UzH=|H#N@EDhfV#{M>MnzVC9e{u)u{p5+##h+i$?0WR{MD*^{Dvvwk2Mpg zZi4q)E}@cpuMmUWze+_aX7l50#-h&iozZ^?5b1z;P$vXyMX}-Zxuz-qu?`#iA<*e+ zz*bczzQ*AiGrSgmlpvQvud*p{(r}g_pWiDOz|+#RXUHreq^#Pz-m`IH>S9zWSuLmZ z6up%!Q1|7HilXgC%S*(HEb6VOuYoSC$&f6#rfyr8=9mqDie!rQZ@Jm?GU9i-_Ra<; zj7h#@c*haUm1Sw(`1oV%QM?1zz7k|^&gC09&}!7FTyGGjfHGut&Lo?*L7PK|?`rS? zV@~j}u^Is;yMZ0ONg7!`vHcGqnL zj=0?V!$@8j-Z|mK`FF$MW2NY+Eij(> zO*H{)&6q?{6Lh*S8Up z@0Pp$X)y3RcQ09!-No;^w8gMwH>2C}(OJ_yQ+K#Zwc^gVqI)KKe9w?H%3G91bvNh} zZj~C3F6f$U&T*H&sJh^@cPZcTWONStTp%%kKhp1A79L!gaW(U&wpo{(pGWsyy4{Bh zj1twX1W~{4%8TM4@2S_&>^$|#7Kzi`BGjg-&=w~b3ScKiX`~LHqgUHtN*keMJ5u;q zy5^#C{97jKT4?1cQ>V?0z3uzVVfz~Pd|9*fiB;{OIm#XZgaMbJ;W@+*AN}KD*qt6i zhLFvj{iFjJHEfa?{m+)eY3N(JFz>nvk(8?)81P`O18) z`rDneYIf>POd|dcn5$P9`%T+M z0M58J(PbJYv-dVERGz6gcOox58^+iP>y*2Xy&DVKFr&!{=-uDc6jJQbY15{S@gmc_LDxF*1MSur`U&%OQAOWsyk=bUsFp zpp}yWPi|4ga^Q}yYKrKcdf?KmC~<4`0m)3v-J02C1@TEsxiH_RjXE?d4#%gZ_tK~t zo33lc@MI`hIuy`7jLFzMPlHPH>82Vp??keG=d5fMGmiM#ZQZv%59Vy|<;~!%h|H-S zR;R<%;x)1(xMPQd>PwZ#n0HV+aWrG`45Vr7&M`Wz?RZ&@D}G?xNnUuNi5EoKL93ZD z7V|cj?Nvj;RcBEZ`daKlx%IGf`tfa)8F!kd*0pdJW9Z;It9LzMbDlg!Bd#J^W~Gs1 zvLsmR7}s%MSS3uXM(;fi7-B}F5rxKd>gx)ds9j>Nvfy$O-q0EV-Q*(~+BxLDJ&hK? zfGfsu({z8xNqT-W>xB@Nn}ckMI{mvh+$ug1sc(ERiR+5>4}7;~4XEV~PZhCe-vHdt zQ+ls|UkYIZ%OJ#s_;<1t3O`oVx*rtv1wP=v9BCzK1&d&u7X?BFY6u_oEF)^UyaZ`^ zDY&`9g5P%8meX!#EzA)DnvUjPIwe9O;xk{N9p4RQ`9K?Y#@yYvN#uR1oGjgQN50jX z;ARCzksN{sk=(v4wZOH=dur^r0q;;FCvJC|K%@nQtRY?R(%SCrkxI{mDDLptsk7qO zec3_6xa_plC2FZgYzaf~31cR=w=15dDhfLvwN7nT^t!#Z^e`xV)$sYlZg=yjeK3Zq z7C}G#O@ZO%?ZnO()=?yh9#Ln~ClK&NC!076grw5!CRS~5 z2934f-FLd60eHY!#iR1F*ip-ApWV7ern8t(t2wUw`@G5;`~1ZQzKlP;j@D(lTQsCE zMm?SKEcOWoH|_43?A>G(p|4HTWLETjqF_wDTVk?(S4S-|#Hw9ea0QqAAsUdz6?5gt zAcg?n*IqR!)HUYgwGO+JJ0Z``bH%`4QNMOQ-Jw-Limk4N%bo)x@Xq6wyJT@~cT!MVQWf3Ym9jn?38y8+jZQ3bRG;>`Q|p1=Dth&5 zAj361iwqAE<~Lfm0!{BE3b_h|-{a&eRzablK`$o`(Bji~B*Oec9FERH!E&a}4*Yq( zy~ibe)ntZ@%hri}|%ObG*&UM-PEk8T+`DAgfDp+lHt?5(%IS zkf>ghVa)M}^9PQse(~2=c8ThfUWTsRyy_Q!YBMY+@gl$stuiDt>H%hajSBr$ zl7CnSm4DN?YhQVRp^R>s7S3S_vWv8_DO_-{YKmos%<)x&Z1uSbpR1IZ?pMoHUoyT* zIod6l&G2FU+54{f(fIBsyR&Tge*UhHJ)M=&>qEuGs^9uBj+<-no!ghsDnOTLuA)28 zTjN5xhuin|y*xb~enLCf4ILFdu5)9Nn4wLdjS3R3-`CT5$V0sob^(rh2#0toqQ2Z{ zwX!d4*r^av_DJu6_FO{MoUO!+Nb>QzvxOQD;^3}-CfL+7h8oX+)eNZT{N{|Us(B3O zB-#g?>Mu^R`i1qivd*++BJHeAFqdzYjd=d5dq?c{6 zHC_?k5sB`~x}l-A4NYDza>F_Aaxnk#ajnrNNzU!W3#^2LHMM!R@4kp{i)xq8!3d?% zo@=;9vF3MR0j%bhMY0+Ku=;Co2)PDA2*S7EP#7>-3gZKl8@^Hm0Y|mS*QrFL3945IKq3_fF*`Sd2vn_bpoJ6-Knk67g zl45#&re*rJPpXbvU9vFUy@AC!o)$YkqT9ZuI8g!=!rrOYKF{3h-fR%WDG0JH+Y@;c zEV87N(rK!MCW|&-0nHYLig(O@(lVDCv$N&b4_&>Vk_>xot16lV#45vMQC>OoICtsp z1)?#IRjsa1bkt2aUO&}Ge+oC`fqR^rWZgv{YaZIWO;0YcMs|_n)fAH9+MKHPzV-+M zoiOX34}l+{E}wPkL)1A{qMGQ77mmgc0DlSN`Xv7Z!>ok9`doA_@o*1I(WMLn#0-h@ z5Xs`Af3i3h2onJd-P*77=Lw5_j@LuD$oZ2GF@GYo**lzLyi{WNNu@>AkZJ%_HyFCT z-ZEHrH=;*ImXI{y38xBr*oBv5GmSPQ)(N#lRCIJIIk#Tcg8F@@oSej>27lOFUuWl5!b$i=#kn zzJ{*vD=1j*`qevYCE-4BC-5`S;|=jLAs~780ysv@@_>%?dAP}kFLPVhgWF>lLJKom zNFwgOi#6%K??)0_CC@8GKGa|W1Vuh)?-pk!$w%mMRZfSnlMJn$kD5tglz1DMtCngO z(ff%cXnDtjCd3h)tV>;6}@zu z7(B+=HxRoe5`sv+R{Uh85dk9PUdlg1MA7}}C(#4nA3{W;z;Rl%1!Kf1ek#hPRqdAYx$MtG@S?*Esuc*5fz17M$`*l8bVq;JziQ(pkZ?=bO+d#qQP{xVO&0xC##BG;nucq86!KiFl^= zNj&wrOVa7JfzP3yrFul4O)8urj$3Q1R(939@84yiI9HM#DBb;ZuI}+!x724lvfl3u z65B2@yQnDX1kGDM!_E#VAjJi^i*qsu8w1?^$AaiMHbhjnT91qkIS~IPHdG13hA!Dy z2M?<6*SQNH+;3IFV!7%EapgKMCZu(^81ae4WA)7?|KdfDiArOcoB1mDO8qwb2N$c^ zX;5P7O2)WAlk?(a6Kqu!9Hf4`b1(5KLF^%if|qAKWEqcPw6d&@qR;f^y^S&zmxPJ5hL| zeDSJ#C(HO&Bj|l!v%XBIxjNKF@M(CH63?A4)8^Oq{4UM1^@0ZXJrO9!$-~}RDKzI@@P%AD9cILI>h!_I=>50sF^L&-+ z<>A{|mv-Z-tPUv4zbs(4vF~`{K4u=tP1Mp#yEAWdu5YpW70$ip48?|m|2{#42Wb3jd4K|rF8&#Evo1atVJ+hwhw3{t<(?s_D5HhbMGThu7 zY8d&SbXIRsjNskdG{+hx(r}Y_JG+5P)hT(pNxQ5uqEWjnE(p`RG^srnW1DoiituG# zIJN%GvfxpN>b?Fi-b%Y-(RO*8Pj5e$n0gvT2$Ah$oU#N05E*wj9b~z5xWuO1BirN? zwV=AJzV-BxMbHbdnil)DM_gMd9Kk!-48164#fnft!@;7s569@o)yrb8m^X~mzs8@s zH73(yWnU%o?*4@yx8%+)v(ENucgAsg6i8q4=u}J*#%uA1S@&q!@$?8EzSs^>;sWg? zffJ|(*RDg2@$b_>1+R>~e}v&DGUNAFHmZlgZN>F;98Z1+9>8?x6Q)-IO#dDtLhhXb zk558GDX;kvGba!a{CVe05V<(I=?xfIG$4`yKaC6#?b|hgTgy$lt2P4}v7wffZOsc< z56fJr2o6CXMxTL3&3Am)Xr(-Y)VGaF8QvRy?C@d5rQjezRg2(TW*5)eExya_0-x7g zG^gt|6Lfq3uwdt*`!WPv|HRsD^^G}-7UT%iZ5gkX-pgg!goDNW(hyNBqn;?WN={t& zyumrkb1K(^-Pfkq9pAU6Q_b5Lah&CPQ9J(PMR?MN?!-Pf0ZFV;tT~k}&-gpGgsCz$ zff{;G!dT3h^mVl+Nt&L{*_@$_3*~lxI6_>}LmARdXDueoNgS2t{U;P80y@j)im+d2 zuj?!mV#|{zC)@M`X_t4s4f8@s^AyryZ*5hdgSbU6Uh>!yzCnJ~ z)4)r(x{B_g%h3z-Fg*{ahQ2gnpWA*wdM&9?Eme{RRk~ao(u}h9Y|i#fu9;uSF2m* z7HXJPf+yICv7l6r0-XX;toT_ujrk|wg8 zsWrn}Rl9&($+imcuN4=vHBEVVg4cK%*5v~j%dyi8DW%=0@#hQ z8I7Rs`52n_t+B<*d`5;>f+%Y}-jiXXznED^3%MN&ysKTmaKHUazkdJ3?LxVSRU@=F zBcBtNN0VT&)K8G&F-+>gjBc#p*5g}7Nsh%x>KD>$2X~Tba?$b&-1dywS_o_o;g-ra zm)-+eKF(<3j%48HOl#sk)J{Q>&+BUKdx}avXPeP^HPTR%-m-iCbfUrq9)`$d%g7Ex zqvG@-nh2KAdKQ8+ympFw6xMVENebeu!nWLLYSIq|BHxpXUkly28vW=6YiJB!O|(gm zj&%C_W<9D%e`9- zJ90VcaJOP~o7fUI;o3(URk?`ry>*?WpxCYikzwt!y_KL2Wo(Gs_N;Xxz{M485U3t; zEi(%rn-)W#iv*Fb!sgB!^HhaVi)0VxIN;8Q5h5;aIR>;;2?o%o*L8niHA#*22J=bf` z+S#b84dO0eu(%O|TX2svdM@s)qLm;!VTKy~$%AkUyvOBd{ps*g9Un=0$oiQr=G-uPz&+QHxd2%n6?^_)q zAcp}F9MTXaY#8XXaxg)ENfTcl4|PRn{TTnM?e6u4eeQz*#wLN7fqm{TqVV|qhaAwR z?4Df3|Y`MdlP|?wyHc^QJQ}D1l|paTckhB!oLGcUs*{!}k-}-P;Te z3dNqXRh+e@v((T>>z~~??PllY1vS?4YvM1jd={y0RQ#NY*>3kqO%tPeG+xI!`k5yL z&t8=&%$LSQJeHNvLQ@f(TxgC`d^nuYLUX1aduEXXEvJVPXA#&VB{ObWGgEToAjKA23qX>#))X-=rx!SN?|O^_hXlK@sC~yk%+T ztQd{Oes|TD;=}X$6wQ=hcduy`Ikm)nsx3yf&6qN_Wz6egwaCdkYA|Odoh;$BOIQ9V z(zV8}d97{grbUjc)|mkj>9+R|Kd-U-eQF>hXVNSzu9SWMHg(E4m9=U88Do?RNuWMS zRZO>5XfYdE3!5I+v~W$<*wfUj+=NU4Bh#AIbzY`GTH`6)W~B5~1Jd&txDe9Acyb}6 zXILE}J&XOU64b)LUV1^WF=Ojo#XgaPqFe0;b!pv?q91BRFt{u40LJ0@l?!f&jlH`} zrfwtB)XTd>`ucVT2DU>|TSqgROwsuVS~L72p_z<%l(R0$6$TjspJhqha@vImo_=|8 zu2$&F_K|GZo``AadA1FqJCD)bKWG}|ZTmUcuuGYuU?9rMX)?HEmzQ1T?m@MP(;6@? zPQADi7O7*L4B?{wh;ottbAmlpW#vJdzLEb%_6skHr*t6HmNClW5zxci?4mwrNgNWi zsdvcmJys4XA5?*((=;?(Ql_6|v`u=RWAhckK@%=3-<7T^d-E13bb9P5dKG=#-1#to z$4PH)clR1h>t#Iq^#Y+YB#~I~rZ9e9OjPhWiIr@65Wo95wzs&KA{h1)K4q^HWxP5| z^7+0P`kQ1{^x69Rm=Zk~*!bAR)pN)98|I1G610tp(5r?)a}&DJ;;uLB9p+>yDZg|h9g_6t(BA=`>K0qIT_3{ch@mfSVyYJ%yR!3;>SGkAaPv4)!fAmVOIzSVNH`*!7;z!~F(w^L_yDT}sWw^t zSNm9vnIr!p@pCH24dx42=O*^ag7X2FdXBXm{IRuus33E8g(XNzO z7to5`yEeN;mC1nz1Yt78BS!{J*A6ZO2?9v7pE|)@j`DJPjQcw*u(ThZr7(Js84(e0YGAMo5Ms8NN#+XFvu}Ll ztgN{?J|1GaqGFns1_GWj72}E$X?w_L>U)q|3`xmdY)ua-T7PIqW2cQM$CbubT_E+{ z$c!w?vOKuzZ+_VmL!rfCh}<=->?XDU%^LJHg%)(xNt;rkIr?&B37V&S=Fk%Mz>qpa z)KO66_O?XHz<_4^La@8Kx^qETMwICON!8p_6J+Li2y$MxvL12 zGdO0YBfSevdonv;J}pjO8(uAlKDxXRjE6tmXQ8SYRGN>YQAiB3Xm4>9%DUV}DBU4S zG?s}GREZ5T~V6(jGDJCs%IULT*QzK}?uu&GU(?t8Pw<`RW;>;rHw#yXp(-SKe2 zF54eGsk*7ORN)8EORaWwF}d{Gz|R>+ zG2M5)Bz(g2X&(`#&|KR*DjA8!HQ!{+7*-Kb%=_a~Ebz6(8}EJjX^iW9t??aD+{tZw zwY}AQnMYys&TY0j7J6r9)suS<88N+n3)Coic#kuhdMgOnt;KrC8gd2eHQwf zB+V|bbC?X;941hY5e#^d+p-VXfb-tl`+9G8j zApw<=nliKO=xg@By-%B#7W>S=;5nj`&|FVoIBqOZ#TR5}TT_)*E;LscRm?RHD-E*< zIpz}(#yaob8r&%>EGQVGq0v!-u1g}jZYg{laAsRWp%N_ zQ8(!%>enh!ludbQfDuQGX9Z8&n|E>VD-R4GR4QfVBS#TxhPp^aK0$wm_KWxi-W$2V zhRpbIwxuVCDs$LCHRH+%UN6Ms{;1pSrBQ4|K);n-duRKfg-H{0=@JmcTwk&E)JF*6 zG0!{Ft;K>YZM%u<^iuD2I&%k5<)eqS@+@Kw&h zdN-!I1eg7F-vuL!BvS7;mUA1_V!cjv?e41i)(YL|7k;I&Hzuk`owy!Sd`5x+Nr5$# zIiRu-k0tR0scF{&{1k@JD-{wzV_ku8D&XIrx&b6Z=K~i)qm@rCghrnNLacyB53%}% zDt*`JUE<@kuD&;q3XlmQ7lDKjX2h8TG)C0EM-rr~Bav4P=h@ulR> z$7QY92-AkJZWYXGl}x})dZqgs$FPQ#l2t=nvetONd)d@JD;XM>io%jIC?7 zG*3x>sKF8G6av+a7zc_Pfhy2X(HNtL`w&ZSZ%8=5^PY3=$`w8E*QWr&y1}=3BTKL> z%|>5uTYD1|B(_F-qGwrW=!_w*tUc~$^sIiYptju;zXbJ$SYK%+9bN$NXQT-WgVr)J=zLi(2@9)$>-|$zr} zHVIa;;>;UIfzTe%X+BrDZr?=x$n=FEmaBS2Xz1VZ zA&~2CeLma-$Aq-S9lnZoF>IpX-{VoTFA}L(f9kma9OXkIeBtfy9qjl8OKWpIu@X*u z8Z&R@sVA3^0O22y^;k*g3ZT(r^R2u;gSbJxPW5`MC-MfZk^z585?O|LVD6s>VVcpi zy9%~=wf3#JdGjXW`>`=lIVWhVsnOLRzO`8Xt|#y4Q!(XOtzW!lw7G!w4C_#pW60nT z*rpWJw$K_|v38~rEoP}ZCz8qH`427RUmbXajfSQ<)!&xrM7}hV=eT38k4@1Prup^| zy&hgBu`u0I(G+1|JKY?!xCo2o=PleyTUc((-n6aZhB1IEp*@-??=OwSDWjbF*3g}iiuK;`GkVu%j>qlmExQv+;$c!FJQt(J^PL@N z6zAqzb@|bJ*2gevf0B|j*iak7cYDGPhYqn;mZk{7`TG2(tQ~~}*%d;TZf?pzh98ju zl0%dWepQY(TW)33+R*ayyD+`*et{5%P*)-+o*8HzQj3m7_G#IYhzfRV1C#GpEh2ep zLqW*g#Z6hl`Bkm~?SeAhm^|3!nVDp+Jyt=W@t7=jt8W;+$1YF3$0cF&&Pz;p_UR{6s|W`|#1O z>zU8!R@bJmYXb#B9Ax5M)U(B6sRL#INQsGrPn5m$+v$z#5BcXGmcG_4GF3tn$w>YU zIY$Xy8t``99@=x3QQ5icKDsV8#?|>Bh;;o~>%QJ%iFEm60;!FH#Rk^fpw{2Yze14e zn4Eu@RVGj%ZNtDVN}2@>+DTQD>j*qvMDt@seFrMbhx=7J(Jh`jlmZJqj@wJyI-3&Y zi<|TDzNYMH4Re88D`V0HXxJoRyS%}}{i(S;Zk5A5yXEj`C+!KkIz@H_)&f&X1j^o$ zAfOQpVqUJDOpQZ7*m7@@SOEVsxuw;Ky195|NZ0r^ujSU*x?D{byH%YYTe~LpiZ12D z07u8Es5%}PYf0uYji&p@gqAqdcJxj<5^{o;BnJXWr=m1%=M~HMu;)_8YGcX7x{8eh zVg)sq7W(R1W9aRc20uy(q!KxndILCAkG_r)Yn@_N?)f}1b-dy6@V$Gmn5ef#(gW9h zzYWIM5v?PM#ss~qpsA#=iLHOSZZ(I`e)K^pEuD?_>#!X|F5r`7%|Emwv(Ku^XIPP9(GUpe4`D%X_w6Y#@X?_R>R}KT1OIw0BQZ?)l}d#X7ZkW!K+e)=SUX zNZBjpaZK-hK{Q2Rs1HEw?+4_pkNTybN2~MYv+MYrm+AXtvLU0=!|r8WuBUxSPWzn@F+BryM|gnmH`Ik&K{xvy)$)WfaNQF zgS3o!z}ci(;6hkN>yry%8JAp8j>BvaUj;Oxx*t8K_f%RO`gXOVAE-PDE=l5?oHQfN z$I(+{GW`gaNEHuWC+ELy&=$YFus*?L0Q`$LnpVxRMmdzXQDEO>2!m5rH3n!*iRM`* zDV4Wp4SsQ*L`4)-&NBDbPlt#d+!NoAQYk(tpv-VeH)0%cE z10qaH!`o&lcIX`n-l8m3>frq) zg_F}^wk1Hr!73?Yco6wBfDXeb!@3Yy-1oX9zkA6ZCOBW%F z3tj21E64U^Lr+Us@_>Sjbbr8<>tCr7WjmAZ*#Vc8NKwtXHk9gM2@n(^6{X=Yn-Vd+ zniPTfVt4Q*1@VPE7tsTi8|1`Bt}uz~{CKd94hfd3jX=t(<1Z6pz>f}zWt{{p>k%%z z^rYZ8Xuy=@{Z0hXG357K;JMA1LC#j2p;!%J62C%Hljsm+v zdWXQ9OG6Bb0`Csg?UuTDgY!7PsMi6*Y6ozc_s1rdXLxz`GRxP_f)uNv*pvj02W5cC z-E8cU6O7TvttU|*Q)w*RBJ03V$XCfiObM--TF<;5fV(ONHE)y zt480gPM zo;!W+G{U62pIiu&ZgTAm!lVzd`Y9-peKYC1$0wrRn=~)^1{@zAescwghPj>WoTvla zs)x4ve)udkja+%>iu?td*5n(MUdX+#e9TVnc6uyW!SQ4 z!j<{t*gp8Yx=;be`(o_j1pvm4*2~LR zxfEY{?SUpDQB7xOeHO-O!)h#c4OV7~$%$2U_L0;)V~SIxb7} z|Fy!~HkB5a4{I_qNA$xD4H}ExOgibIm-CA#+~7gK!k!@a5g2$o<+`__v^rc3{E0&r zjRVvf^ICh3YGJ|Bbjupd1&DI2!KzyxKQGu7;Dj8^_hbQ!{9Rze7%8`!0-I|W zscMh8>kEz-+T4{q0Qdl~YjVO#Q+m+Q*J^G;CUq=6jpKSOAP&vgNIS^X7 zX7u4X#LbooLhw&H!YPovlj865Bt7)3GKu)(?KR`Vk@suftpGPQ{r)B%NXb!7Jum)v zOri=mrAP&?Tv&RL_g8uPLDa4rUw?8sydZh7T)qk`V#ML8D&99m{zYk3QpsOgE~;!Y zYTiLA`Y+EBR-mcqo*Wi-R*%tcai1!D>o?o*wMw{QdMIu|S27uyLLLn0-|$)~=bvl| z0=`J{VhSUU_O8+8zfp#0S)#;@UMWuzz@~cCz&`uCnKO*6du=%-4v?>k|D%ybnoFim zS$d2(qIXVzvb9B$?6^RGs%?3HF`a;UR7s5rEo9Ur|8BLv+F!tycPbFL1m-Kj%xwszo5&|?G&nVJ+doycejGY z2^nB6k{i%^V56@m&|JayqadNRCCapxwer|iH zvaVF*KR)EDcCyREhmRJgnl!WcpRL^~?mL}Jg$uRu|9ejmz3eJzLESvqZG%w=!mCNV z_M((^1BxZH3+hy8x|MaA08$IW0WjsJk0i#~h+cNzDySndCMQKzke7Fr1;WP)ixcDu zi|t9EEN!1L#8@C90Al|G5l;zLg1D5nY^T>%ulR46|5?w*BuAK?E#SB2;T)E1{PA0r3^NMrA=BLn&dbmjX^HxTj2^iH6(=F1+k~dsEl(n_D z84n|=cUT>dFk*{kg9d@^Kw14m;3=~aX1f{b^13vVGz%b1vxK>Q6!8g(`;+dXGLkrs z9c5lcB#jpZx&tpG>2(h()@ASOhr>BxB#>N-v854~?G^2EH0(z9)_jZXKF}z8e@k?Z zdb!-v!7ly4FmowbHFwpMmv@S!o94FO@fet{oOHkc_19sL_&OX+hS}sjD%%hfO>ha! zPAMVU~_kH|hLY7)-aiqqJ4WuV98GkVHL?LNM~La{aAl|3W~UIdF)6h!_hc z6HJqEEcM@>{#!W;InkjdAD1vegLG*4$149v9r_uY=@vorN=J&N5IyDJ%>%-87;bgP zjty&+3kw0mR{XG_E()OSuOEF72{hzYuT~jY)eJ|r^M9&A=5^6n$nf+(up(L%rE6Fj zueEf49<^`uwBbL1_49b47=(?dQ=|gFTKZpXHk)H75y$Y0Q=xx1{e?aG=R&(!yOV#Z zikv+<7TAeUt^@Y&#HjxUR6Mmw=_Y%onG%@W1T~OzA1m-05TVmT$8%r8DddHi`%dMf z9%mU;WvV>^_9RWIIS5qxo)N(nL@rzvZNUbT3`{w+d*YbkoBAf`!Z`PYo)5N*Cl}=$st@|FD&H}ybBj=pR5`L> z?$1||+Rn6gLcgT$9m&Pw6@>6DY>(t&?{D^$dbeyJ&Za4O;a0dU zfvUMlw>En^s}C&ul{BTI^J3%Y{8&=SrB5hC@GY+9KiX3Nu)H`Rb1@pSe6a7bzgVPN zn(DkgRJ0p8v#+sZ42g7x?-p&3#BX)0f|nb^4102=q6K&7V1|Vw&erS417(aDL3)1# z+X3bH%WZ^qYTG_GkK;E|xsYfYDJa$vXz{-+zmPD-?y2w3Epk-Jsq2q8uC_uR1vBe-b$>kTxtOa`#W z!%X!H+22@yjD|uGDIvR4+dBxZt3#};^Ae(EMeO_#z5bVyd>6+dBWpqWA&*NA2;us! zMc)DbgeOOIdjkB-3V7v0E&*aN{!=NB(Sc#oQrqBVY3k6=ioie|YwN$;L5$b3;y~Qe zd`}u~Ce#05hx(1~4FM8Ct&oNXImiSo#=kyBSveVwTN3FTb_Z)&KwJO(Tj z8{kSHbq{bTnWvY4Ja5DX6x-ML79cjDWSC4Rht(~s_*`wh%SZTb@9(Y|+ZlvM%9QeD zg*hxh-X+<}kCd?${>@#aR&*!Pzj$YM;I9B2lAWuo@wJLslz@N6OZpdo((t3#i#=c= z-`zdmREyZqVaF_9_&ZLXbYO4zKqEWfE0F-_Kh|>}Unls&46a}TZf}L}zr8g!o!I9* z+`Fa4`RtfBqW`hx63up%rKR0g;T0HW2rmlPyFV@oET#YDsRqDqN*zAmTbo+$29_8( zfJ-b`%)u>$Nl5(fE*vjQKicAT4U|HFKN`MP->u(bp8qjJv%~XexAEsC@Ap+WX@NAG zr*PFXtK8zwp0r*+!jV!AW3S@7m|}nMJ^z4&Lr2K;tWodHkLCzJBIQ4wNmAAXl!X5s zx7OB-mF~r#+!Me@oVPl5VZd6ZSP4;4&uh#@5$ zl4nRCXH&47BM4CzPzDKPLwlSq39HwHC(^=)X zZEP$Q%MPWLQOx0YQCl2?PE+t3Vrk;Ke9Wt*P3h_ON6T3#lI*;ijWoDJz6E30-K)4@~3vA2p|3d*Y+%292BQC3=|m5;Y^ z6PaPn)dfs5s~auVcpA;LaoVkpe41iTK|m6{{M}4ppJ@!gIU9w#Z0# z(lAh)``CT|N)iH}z_F)ZGSThJqpd74DCHIVoJ76zo$zJEi2p&1eu;F@U_(#cNw7sz zzy;X-%d2ARj_FFbvOEwh`rD^-@;b2wSP=l^{W}n%a_3|~>&hI=NXXDY z_vfJCH&;$-_@>t;F}l!$k-8sZhTk3o!NjP_8kNNJbcTPm_aRC*`7Y8KX8+B0M=Gmo z9Gy`y>ngYkOj(A?$SF+)n9|Trqy4r4m(GOTfD`n?w*#g$31p1)8FB+ot$FC>4;yeV zfDJeq;ONrvxklUR`@vN4BX+&S)3*9{8ldW_caE+Cc}Bglw$sH?8{S4%h5{Dh=ug$Aa6^U{(#Z!-J1l2DNmj+02L7#;>zuG1-t7^JqvwYZmqXq4IKiWm zXJHY~UXM*JjQ^z%2oe~}FZR2#!vhZ?4x4w@rAt3o0@)pA8dE9m%>?$3ZxJ(>jZy() zzzp>K_bn%XULLVz-Wz+Z2yGK9|CuGSmI>jF-_SxaBO$gK;w@I4*g z--dAJIUE6db(v$=Z{f;ug-IViga{*WhHCc=HOzMYyCw1qT^nXvrJr3-d?bD-kwiG z8dnzBvDBH& z^{YNJ7TrY%$%pQBF#SUj*aLrz|TYxO@a9SKa`jY^Cm#x}4(-#q^gHZODAS94Oknw*) zzXIelEP~grzsK%ipx`K@wB*503jK>d7CAUq`QJ}nyETftTWq{I&kIn8XsPYSHxuw% z4Lpb0EAmzF(FAAbdWhE{-~;~yyeo^?p>G5<@;GP&zNz^q6NAA2bdzR7uKdjyJPpob zIP_P7Ve|8V7G)_77#u~J{>iFc%^CL5$W=4c99bQJ&;)(6!QafW1FT14)48gk4s;ZC z=XVT64q+JkJ+DtJ_qSSrJ%?pg5<$YrelyO1Nj159bV_QV_=pOaeYC8RvyU5)(KiQN zi1ZJelMCTcWxqgX^cDC%`r+gR;w%*4Q2ATne?L@z5Ao`Fgg+$;Y|t&WN=D`%nRZ7m z4jVW-#zo|j1$sxOsla)8_fVWkW-VYPknD~4U-RgwNZk8#2@OpdzUS#7ll^@9!LgT9zyal87m>44wOaMGxRQ?8&vpJkI5# zSDG`WtqPtqJu+f<{55d~w*|F$u-6#`9u80_4N2u;`(r*2wTk5I7#0?s!c3s*exAS| zVG#L5aAPGN$}V?zh}Xb~psE>7)nc+b`ZnJ8#K0d?oN#S0Hlf~vUXF)*GnPP-Gw0yz zkTQ=Nb$rqZMSu-5a%vK6?9oIawZm7vE< z4Iz2n#MQrLM?GLC{>RPoZKI6gD1f1QKP0O;qD*1CN-#`O^dUztK zR5hJnZDuQf;sjy<`fIA)uvFsG;-SjY5O^IpaU4qwq;FtM0ZB5>Wox>cReKqOzKPP; zoXhsN?Yw|2>E2l0&81-`MY!HBhG8G4kZ66!Y2brHyi6$E{8COX_U(?Z_Mh@$`J5cydBPvm*-p+q?rawryY;= z@vU^`8(K4!(qoBOdThhnB{wT7Yamx~Q^8@M__vJ6T#aRG*zMrqFBWCjhM*HGz0MOK zX$L(MOBmECj84FtPBJXlkcoLq+M=up1DG`x}`2!Rp zLC{tXL5d9RB99&WAEgsqT_WwU7ckWly*bF4`*#fqgGoCGz!rh*xZD|@ZTml_&n`F4 zg>QIbY?i=1=6Oovk@>7YWZxmOUDY*JX{*4hZFsrx-*aET!Xg^0m}9L>OxPCp6GQMz9XgV>%>Nk!h5r|AfN$=334F;kwzaZfWiRWg|#&#>`s)UDvu zhI!%Q*_D+Z9Y;q^7*rg0 zK3~w&0Ge%+srm^(GTAUN)#g#2OL&reRN(-w-;XV{v}dPt?C-4R>2!+gf|RHNiX@YR z!(Xy>+zJ*|q3O6ET}h!ZP?q`d5G?3NP7z1XkyAwBxYI&nnEd2-*re-fVd)%>NAPVO zASq6H0Z5aco7yelB={A&f0F4%=2)gE%zAUYcDpu?Z?|HYWWi=lb#K4z9*JS(eQGAW zpXy9MJ+I{M{jLS@0djk%qv^MHRwFhY7P!H`Q_?@#5|G*XXlC~-v zt*h*oTL~T4r%N3+!BtMXcdFFw*!4k$j@w(lLsbL4ivv?jgY-%e{ldLN(2$WybRnss zF)0FR|3f6&hyAP(TVL7+X~4Lq+op;3}7T|mbfHHr#VgX8uE7Eu{zF=^-Lfb z{3t1^`w@2LqWZ~r0Ms*?`2)kO8dk*WIIu!0;KfGyyluc(;B`UgjGsTlPYggbpnAt@ zz<6!GfRGC;wR692l{@qzFup&_NQsu!di2WGSFO6AR(9WZ!fs~jPGtsulVSwFfeNM> zYg;AUUV~*1&32p$UJHh@93Ia6CdLS0jPRKrr^lwtz?MJM`&N)%_SKI2CrG|ZW=bPK z6|Zacpivv4TEHKrmcT^OQOae1e~PRz@Xl`nC;`(2k-8KYX)CBLT7NePfVyU+76X}v z<=P6dx#94GF47ZI@zrV&n7kSB!~l?Pd^Ih{R;E+Vravowibz1y+=h?(o7q7=bAxpx zbdddI7g918EmF9@+oxl|=uFpBSK$q=*8tOb)e>nsZ~yyf@Zg`01_Sxc6*|awi<5kP zw>Y*k`nxRP-KY==ujFUb{CiUR(+dmDEN z`>VxoM|4Fpbi#rW_v21Z_Edf@7#|d!`s#p#@UQagZ(B1y8+#5Oc71HnK3o3Ka_2+F zl>*13j`;Yo;tAal1EGhVaem|Aa_1uUao5);YAb7YH6F;{zEkC4-izYNdbK_5>^@k- zB2;MArAvAD+L~AS!;>KUf(tIgFBDI09;Mfp@y>EIjq=)>>s~$BTXlX_)YG0%)jeaR zWhJ}prp0wWlY4g6of_Gfl^sKhnjbw9pDj!YeE)3L;uf>J+2Qpm`G17g9M6xB3XqnU zSCx6*|5lwFoOu1!tC9tpf;a{7ui^3H*_vBA8k?HxcDlyAyjyZt^WGWDoRwA{%#*=+ zvt!=Zmw09zcZgaM5LhRBl9XOo+z`)#CvZ>d-&vm&IZ8UJQ-tEyI&(j*{sW}qKb0Tzg@?t(lTcB2HIF82 zA8(vuqEIYHZv(Vx>iML$6rSe2`xs2(lSh3|>YGe3_c<=`)bmzS;)H&ci?7}5=@*t= z)^ftW+y06Y`#Hih$2``dlAy1HO%GS!`H6k{9v}TZIX=Zb?M3>|>S3&jTiyF|`&%7FNcaHD#5;yMLBQ@wOe!xYwKief7!z5MJ&Q=u-4DfP|kLmg@pBW3=hA*@)y zzk2YWt$DDANGg1AM)tM*1I4fh0X-wTcmC@|&bk|zA0nAOL@tip9`c?39g}$nD<-eQ zoq5$^U%?0R85vmCLA$_!C;h|`wdrdDGm>-NeZMOhDC>90)A-1~m+{g3#ONpL%(foK z_8qC4TlqfFL)N*0!uq#MHF`OfMvZSMajuGIHc?pq^iBNgk6uS>WTCG9REM$TQ0n4nkSw(kw54N-@DJCh?KS?DQqn$^-XfFT*PSaFd=__4P@4&r`S8IaO{hv{JG2Qm%vUvrF-{XuuZ#VnW8lix2SN$jWpKI=C!0;-?C-Kl?^_l1jfc; zrE~4KaYw^;6_u;+EUy~<`qw{Jo|}F&ZOOj5_BNBAM}+L7H{gJME`C4hE*#Xl;IWfY zU8!JQZL@rLkm1qu@5Y_DeEz3%kyqaS>UQ`;JZ$!XyN2+y&vL$cTe;&_>f!R;jSqDO zGh1?;80O-j`AvaLeDD7KqxOx}<7#TkMfvC3=a#h0_4f8D+1me`{gQAFXRmKt+wJI> zV=rI+AV|3O(LnsNK2_bxnck&iYWU{p^ACmz%EAIWp7+;0He5f=Vf^p4tEV@5p9-CG z>Lowe)bwdU!0Ni_;?mOjf`r=o5c|S1$wnm1b{%Xb@+|t1Y>v;uIuaUnD!tLAuI_e8 zTTzSp*zrq>i*Ns&RqWxpK(zaWjrE|jx59jZ8Elxgb@6_l-J$2tvaE)SvLd%#|8h*B zY2R-eWtF{gi<18N@u^K^gOmRhT(wI*{M%*C9p7JJHyg1$>F)8|-kEp)BJn+BXEbqM zX)J>?`Tm)z(NRa+XVepS6!}rpVX;Hjt<-(o0G@ck3)%7QYP+-;4S`(q z<8*_);yo)4jSl9uE%;(Ivz^E9e>X1_Pb}!eZg5ll^Q5A0KMQVJ;{JNGVmA^uJvXVxcf6JI z9Y)MW(;ZHn>~xm5*X$kMe9>2q;%d<=i!}pAzA^&moe8_hp>t0G=Z5#%($1~C*Veo& zX0NUDU+d0Nb#8itAWix0*2XT*y(%VPS&2;da@F2FTy8_jm~!#L>tEJoUrRR>d1eit zxGG9Ew^{V##qitf1yK`Iei`=bE8FVFaFt_}ek3@R4>oxF`MIyON#O){yWq?7waR|b zKDj2om0#C%p~~F+fiX9{gu4NOP5-)G^YW#)$iB_pI=ij%m|42@qoaMKFZ$ly_UKfL zRJxyAo4{fSbQl~`z0#gjn)FaBU>mfyeza)u6+S1)>2yNk?OnxjkM*|!Y~I;*r|skR zzLZETs!K})t6N&~{URP}EoEEy-wDmSyJYd2lY94`_Xv1+XgBAQh{seOm2SPTf$%LX zobGHWIR5h8yQpzJEv}r~lhNza5b0@$!m8TwdMUqalwEA9wUd0uEj#7F;b-c{Wo|31 z;%AmhF8VXYuCdmY+aIg{Xxo@Ff`+rcJJrXf$U3adwO3$z^()%|HnJ;~l^G$v)o&h(hwDX$a5xs#)q?7pn8t$8np638yRPU4rbk@O8zT*E zo;yxv))LnC?3ur@acE&-=zFaVIXack&gDo>pRTpB)wxrDwEFTo(fOqb4@zVDuR~hx z-0ZUU9kR6!uys0l|u?A#YWRncTM9;{+b8-kG=gq8Hy!~jthQ` z`|?bf-fFw4K7OW1!EapcLBA<|8edYXEC#}~r$r=IS* zZ=(~|li$u5P}3k={iuse=0^leGR72X1bU$UeKu(pKGN2?f1*hY*3`OL)TVzosqC9){XMM zb8_msLl?Z41XWDAP^ zi4#8FUhE^=Ushf)v&nyLFROKi8^uqb+P`)*sh z%znb0TbI;wa|>TK6pYd@;>N_}P0$XSB=*UyZl83+d%M_f{9{kgGZLPsO^yJB#Xpz>|^?j_SYZO0^Jw(F1O2M4=9p7OamT$=$ zCHC`orR5b}Xzgu>nyP&}Z`ZCfMg}z89{1hX2A#fO>)kNKs>In)aPUSrq0c7TueBQD z+)G0+_vQ!AZ*R>UO~7_{PGxL+9N6|m_@Heo?`J!E4BGbnJMQj1X2E{8%eD9mZvDDg z-$gL!WbdL9PUyfzCo8^P|1Fp{^HlA(1`^)$skPNr_WMpO-&Z+A8ZqIc&bZAT`&VW2 zc09RW|Ndrmifu-CYt`YOvwqya_`P`6aT^Qmu*D896I-s=NteIgCON&qKb1>t0(1D8CvN+n6$RdzR2wK!9DN>(Bxi8!6uWO-12%h#;)dEN_J`Q z82u!t=Ft4TSHspiZGwgmO=sT8kM+sES+TOE|Ba^S?=Jl|zai|@s9&o7coB8<#>Hor6Biy?)~c~e z@9mO?9zRvyY|E{lm%Alu{NQs!^RubmN9G+6j{YL?ie%oG-`@Da?~6=p!Rwq|b>6EE zk6Qkvwq^Vxb6H1=Zrk=fk{f7YJtFG!W0 zn5Mhi_0G|!rxQvyoN5X_eK02A)!UsPG&Cn=mzuZ#&^I9VyAQlt^U4qW0>1-``sYlX zy1Juaq(jTBj>w_voA%@{`Xc}QfnoKpcjpzmejH^xf$C``NL$#JGry#?^mL`z+cUE{ zaNNAzrB7_TW3)zx{==s{igC zTK~k$)yJs3Ts^1Z9KKxr-r^iLc9T{i)tR7xdQ+H`8)$aI8>x^d8Fb$Km5h8!y z{O!fRZRK+_jQW9F;R&3~N^uEdA4OeZdJT1{k~x#X%I`1cPrAF@Vgx&5WgI_}G4PcrDc$Nc( zK9n=GiUcfEDJ!T&I%j|_MM7;D6$)4|eU#&l105SdnZn*wd-0;7+f|_XG{ws)UKffy zXjtZ}11OpXJ^BIV2GDm9edNP;D6~ci*>yq-DK&z!i~_nt0NM*MuLMYhRdC}9SCLQ# zYp>LHpm`dchX7xgWYC)n%^gA@9C9(0vZQPAOGr`Bhco31P*G5CPJhtKHK2D2pl4F= zz-{`#M&C{J(F08QaJsxqdvtF!1R;wT z-h3(i2J}50_MY_w3CsXKnO3k%t6tJUp^1&Kd zYl+>nX%mYd``ElojnX`XXEe>isQ{0*gBUC+<+z00y<-4{_^QUQd<7H_SRD+~ngrz- zw`h^UL5Sz@C6u2CJuTL~JH3`U^ zNE+Knd0iXHm$Z?rnl`etvWt?;RbIZrrt5c(9MSovvnt0 z#$2MVqfe@(ZA4tzOpX*blC<0gl9<&%g461Vce0eY#7K!la53Tf{YAI2rUHHQJ+4MZ%KknHSAA`%q?&0-=DA;}5MC7IqwNSd37Y_Uxtt4tF~n7)AU zba=#D-J7^^+zBi`5DUtJ$fQytD<~i`ke5s#AToD%A~Q53uwgNgLN11!16c$)334!G zhzii2B8HG<)u03MP9n<=0~~HdmS{-Y0x43*qe$gKiio`_l05_3J5VIqf+7NaiumYI z#9bY5aG<@c7;-XX7b0tV|ZXv-nq zrX1pK$RQFL=)IwUZTOo04?Q>#pH-2i)^`>M1l(giC3;Wu|2{ih9a<$E$W0yqzJeLp?n~FL3V*` z3)vX*Fp5;mR*}L69`x@{GH=?F6tOW$%+(=bS?a_`1Tw1ACx(^!#JJFq80SLHguK&` z7$)fxeStoqBoab_-BLL@gc6Aem6SxN;9%&>i%?EZMAiWEk%E3CIUwsSBCE_GvT~4j zA;_#Ck;rlcq#-kq)TAsVHreqb@kc64)6CZsYGDAm; zxM*n-uDUug=5UA<{Hg|WIh{e4jS^DW*gy*F8cAUd94qTcVY!sFHKdVdX)fqz=j!b`!_#Daock|c4LvIyHAXCoNcxn+GC(Dm6^5Ycw(N%t&DnGi( zkJIGGk$(tmB_Q`QS0p%a#YZkdF`wVZJ{C?^&I!T*C6_OJ1Q1avkzJRO+86}0UjY53*f+2iO48BMMG(!gp-02th zw8Tx&aIYGD$Oe!{Kt^kX@sb(^8Sk@_E?M{~j>TaL`)c@tz5FeWTx6P}}2 zl|V+JVnQ5j!gH+u4LYACCkXMe3D2<}6-y5bY=zPh>w5v9YjmU_0dVNaddM;1VE|=7 z9aRd(Ujx2&`r3e|#E3S6k#OtKm%cWDn=mFkz@$_LZUgBHFd8%y8QeXv6MTw_2NRk{ zbC0qNf%R!L6t*?;*^6#56G}~BA|D1vycP5X`Qj}SPSXv*8I>pSesJXvHwp$|HesLx z16mi%tpgeull(e4>;XOh=QvdB!l9K4hekAq|5#F}g&DrA2GxLmIPVb2WDW? z<(#1I&<51Nwf?oxh&boMe9i@Kix}HNoao$Yv<6he9)>|LxD7*%J%)WGs7PiL@~6Fg?<}%Bu%Zp{7hm|Pm!Mpr?Dk-d|=y_6%SMfF6%a7Ay=N zVK@`=AYSkRf>~Q5wz#qkbF!i)FHrFCrSwJdq{ zC^%y3!NzzYT+kV5QqYK{IHY!)FpxqLk`>Gm&tZ)1WFQV0i2{-thQdL-p|Eyl4w)%m z2JVZisDM6x<&Qd(V^h*eHM4S32mu5kCa%rQ)F@IXZb_mFY25>WEfV~JY zUmXMA*cq;W2|BsKa}<$)=8XmJ308mB2Cgvu&#Ve5*v@kKBj5qOD5gN^Ovosk3}yem zc%R@*1%jWFSYDy6KoVkpi{0Z1n~UVNSV&dibOYv75J*vnJXlFotS7>X5=ewuDa2A7 zCQLA9_;rtVFL5}*vIX4HsYW)J69aKwiH zs7{Uy4vO?pndfK!y4qf#ID1gns9kVWqw&|Xn!Hm2aRK6x5a$VzAb>zB0{qq&<{JTE zLKaZUhmRTDAaP+0!w$a9pq39a2?0P@!L}kA~&;naB@JLGxwF2k~_=KWy0A&w6 z;c{p9@TwHq03~)nizU!$+bw?NPr(6lYzdIIG{+1*fj|o`kE68B0gt5;JYvU>4NVVA zQP&pAGU5XD$OXy=>FTZzd!-%_))v|z-wK`sL1zN61z(`6tJcQRJlgAp8AWZmzheRqtFt&~w!g@dW;M_T!mRtZ>{R*HMx#Ytc{`BDsIbNwf z>dKmyB1#3@;}1LdgM(@>Xun7s0~H9i5~qX(eFAHdADq$qL2I-FRf(dWS-(M_#HD-u zfk_n(wacX?gt%fZBm+RaQC_pS20~8WtyvGi>LV5TDtUthwhwr5{p9)Cq1+9d& zA@oZ00$+f~dz2Nl4DcGG4-<)y>j1!OPwN`BVg}dvGZoIQL%=R#>2}DGIg~Ajs|ffY zt{^2UQRXNOWzxqKqx%RQW>> zc%Q3~fpR2c+eU&6aKU5+Kr0|oo@n7*nsTHj0%XBhl>!R+Mq2QQFsPdVz!wkD0Z^`h zL`?WW4@1aE+P3k|PyvHIB412Y2%@zROXF6Cv4$S)01oj40iHsbL(u=<2Y?9B>jVkln$d#(H6eg45PJ0m>sE%s=we6r%R+?$q?HN`6GvIf(6>TpOsdvr1Fg_%P-AvSj^kEx%`lJ= zFj-Xei~Jxy#={s0oI?78&EUv{GYaL=7~#Q_VIPPE+wuZJiLMYlYu>!4-(RNdG@NTNbIM3sLf!R@c7%PSEp^3!7SMg) z=y5oUV6>*%PBj*N+9$Tb_<%m!wNH%iLA3Um`E6u3eB=0ry`zrMyHtB;FreRt1D;QN z$DUEr=#$Veqxt+JF5Dz*z0jseVwigZM)L<^KL%8Ie82;c|rJs1mCjuY4uGZG?A5wz?= zXc=G(M2&{Q=%}!Cj1@R)Fyjis^XWE>e;7bZX2iyJIR17&=fL*pe@u@E$LbB|qn}16 z#wQ~nisGMaFy7&eM?n>GfukqRF^~_O!|>rs0fF_XJ9eyKA(n#Ot)S;Z0`POxL6k}> zjE*QDX5_|s5Y9U>HsHJ>PzjceO-%pcppP(s!8vO*NPoE!B=U}QFfxp!Ayi?R`$Sdh zQP)i5SJn(Ok5-;HBA;mCjA!F40%Pf?BM_r`c0P_eK&Vi#GK^NZD#pw{6jY$)W6Wf{ zN6}*GCy?kLw(=N-+K2^=0W?M&>6zGWtt1hY9nMx5o9`apMg<<{@JuB7d-#>@gBkmo z_{_jZf=j^f`a1ym!h=!}A5oW3pt rQ$_>zh0gIN1Wnrp&Tx1gOB1(@HZ`0YF}DpoC>;yTqVXZD6-E6Q)az== literal 0 HcmV?d00001 diff --git a/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.sln b/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.sln deleted file mode 100644 index ed072de5..00000000 --- a/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.sln +++ /dev/null @@ -1,40 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.37327.16 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MMF2SDK - VOLINFO", "MMF2SDK - VOLINFO.vcxproj", "{2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug Unicode|x86 = Debug Unicode|x86 - Debug|x86 = Debug|x86 - Edittime Unicode|x86 = Edittime Unicode|x86 - Edittime|x86 = Edittime|x86 - Runtime Unicode|x86 = Runtime Unicode|x86 - Runtime|x86 = Runtime|x86 - Vitalize|x86 = Vitalize|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Debug Unicode|x86.ActiveCfg = Debug Unicode|Win32 - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Debug Unicode|x86.Build.0 = Debug Unicode|Win32 - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Debug|x86.ActiveCfg = Debug|Win32 - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Debug|x86.Build.0 = Debug|Win32 - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Edittime Unicode|x86.ActiveCfg = Edittime Unicode|Win32 - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Edittime Unicode|x86.Build.0 = Edittime Unicode|Win32 - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Edittime|x86.ActiveCfg = Edittime|Win32 - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Edittime|x86.Build.0 = Edittime|Win32 - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Runtime Unicode|x86.ActiveCfg = Runtime Unicode|Win32 - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Runtime Unicode|x86.Build.0 = Runtime Unicode|Win32 - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Runtime|x86.ActiveCfg = Runtime|Win32 - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Runtime|x86.Build.0 = Runtime|Win32 - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Vitalize|x86.ActiveCfg = Vitalize|Win32 - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Vitalize|x86.Build.0 = Vitalize|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {244770B2-A722-4976-85DA-F5FFB2A012A3} - EndGlobalSection -EndGlobal diff --git a/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcproj b/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcproj deleted file mode 100644 index 43cd5121..00000000 --- a/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcproj +++ /dev/null @@ -1,807 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/MMF2SDK_Unicode/VOLINFO/Runtime.cpp b/MMF2SDK_Unicode/VOLINFO/Runtime.cpp index 36a19b42..e26da1eb 100644 --- a/MMF2SDK_Unicode/VOLINFO/Runtime.cpp +++ b/MMF2SDK_Unicode/VOLINFO/Runtime.cpp @@ -3,7 +3,7 @@ // This file contains routines that are handled during the Runtime. // // Including creating, display, and handling your object. -// +// // ============================================================================ // Common Include diff --git a/MMF2SDK_Unicode/VOLINFO/VOLINFO Example.mfa b/MMF2SDK_Unicode/VOLINFO/VOLINFO Example.mfa deleted file mode 100644 index 8444a92917fe5ddf769a123a6d9736b7d419741f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217415 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 diff --git a/rSDK/ZlibStream/Ext.rc b/rSDK/ZlibStream/Ext.rc index 1da7c4ee..2c9aa0f2 100644 --- a/rSDK/ZlibStream/Ext.rc +++ b/rSDK/ZlibStream/Ext.rc @@ -68,16 +68,16 @@ END #if defined(APSTUDIO_INVOKED) || defined(EDITOR) #if defined(APSTUDIO_INVOKED) -EXO_ICON$(EDITOR) BITMAP "Icon.bmp" +EXO_ICON$(EDITOR) BITMAP "Icons\\Icon.bmp" #else -EXO_ICON BITMAP "Icon.bmp" +EXO_ICON BITMAP "Icons\\Icon.bmp" #endif #endif #if defined(APSTUDIO_INVOKED) || defined(EDITOR) #if defined(APSTUDIO_INVOKED) -EXO_IMAGE$(EDITOR) BITMAP "Img.bmp" +EXO_IMAGE$(EDITOR) BITMAP "Icons\\Img.bmp" #else -EXO_IMAGE BITMAP "Img.bmp" +EXO_IMAGE BITMAP "Icons\\Img.bmp" #endif #endif diff --git a/rSDK/ZlibStream/Icon.bmp b/rSDK/ZlibStream/Icons/Icon.bmp similarity index 100% rename from rSDK/ZlibStream/Icon.bmp rename to rSDK/ZlibStream/Icons/Icon.bmp diff --git a/rSDK/ZlibStream/Img.bmp b/rSDK/ZlibStream/Icons/Img.bmp similarity index 100% rename from rSDK/ZlibStream/Img.bmp rename to rSDK/ZlibStream/Icons/Img.bmp diff --git a/rSDK/ZlibStream/Runtime.cpp b/rSDK/ZlibStream/Runtime.cpp index 38983111..c2ee1db6 100644 --- a/rSDK/ZlibStream/Runtime.cpp +++ b/rSDK/ZlibStream/Runtime.cpp @@ -1,7 +1,7 @@ // ============================================================================ // // This file contains routines that are handled during the Runtime -// +// // ============================================================================ // Common Include @@ -10,7 +10,7 @@ // GetRunObjectDataSize // -------------------- // Returns the size of the runtime datazone of the object -// +// short WINAPI DLLExport GetRunObjectDataSize(fprh rhPtr, LPEDATA edPtr) { @@ -22,7 +22,7 @@ short WINAPI DLLExport GetRunObjectDataSize(fprh rhPtr, LPEDATA edPtr) // CreateRunObject // --------------- // The routine where the object is actually created -// +// short WINAPI DLLExport CreateRunObject(LPRDATA rdPtr, LPEDATA edPtr, fpcob cobPtr) { // Do some rSDK stuff @@ -46,7 +46,7 @@ short WINAPI DLLExport CreateRunObject(LPRDATA rdPtr, LPEDATA edPtr, fpcob cobPt // DestroyRunObject // ---------------- // Destroys the run-time object -// +// short WINAPI DLLExport DestroyRunObject(LPRDATA rdPtr, long fast) { /* @@ -63,35 +63,35 @@ short WINAPI DLLExport DestroyRunObject(LPRDATA rdPtr, long fast) // HandleRunObject // ---------------- // Called (if you want) each loop, this routine makes the object live -// +// short WINAPI DLLExport HandleRunObject(LPRDATA rdPtr) { - //Needs to add fixed value to vector array - /* - If your extension will draw to the MMF window you should first - check if anything about its display has changed : + //Needs to add fixed value to vector array +/* + If your extension will draw to the MMF window you should first + check if anything about its display has changed : - return rdPtr->roc.rcChanged?REFLAG_DISPLAY:0; + return rdPtr->roc.rcChanged?REFLAG_DISPLAY:0; - You will also need to make sure you change this flag yourself - to 1 whenever you want to redraw your object - - If your extension won't draw to the window, but it still needs - to do something every MMF loop use : + You will also need to make sure you change this flag yourself + to 1 whenever you want to redraw your object - return 0; + If your extension won't draw to the window, but it still needs + to do something every MMF loop use : - If you don't need to do something every loop, use : + return 0; - return REFLAG_ONESHOT; + If you don't need to do something every loop, use : - This doesn't mean this function can never run again. If you want MMF - to handle your object again (causing this code to run) use this function: + return REFLAG_ONESHOT; - rdPtr->rRd->Rehandle(); + This doesn't mean this function can never run again. If you want MMF + to handle your object again (causing this code to run) use this function: - At the end of the loop this code will run - */ + rdPtr->rRd->Rehandle(); + + At the end of the loop this code will run +*/ return 0; } @@ -99,7 +99,7 @@ short WINAPI DLLExport HandleRunObject(LPRDATA rdPtr) // DisplayRunObject // ---------------- // Draw the object in the application screen. -// +// short WINAPI DLLExport DisplayRunObject(LPRDATA rdPtr) { /* @@ -118,7 +118,7 @@ short WINAPI DLLExport DisplayRunObject(LPRDATA rdPtr) // in DisplayRunObject too, but this is automatically done if you implement // GetRunObjectSurface (MMF applies the ink effect to the transition). // -// Note: do not forget to enable the function in the .def file +// Note: do not forget to enable the function in the .def file // if you remove the comments below. /* cSurface* WINAPI DLLExport GetRunObjectSurface(LPRDATA rdPtr) @@ -135,7 +135,7 @@ cSurface* WINAPI DLLExport GetRunObjectSurface(LPRDATA rdPtr) // // Should return NULL if the object is not transparent. // -// Note: do not forget to enable the function in the .def file +// Note: do not forget to enable the function in the .def file // if you remove the comments below. // /* @@ -179,7 +179,7 @@ cSurface* WINAPI DLLExport GetRunObjectCollisionMask(LPRDATA rdPtr, LPARAM lPara // PauseRunObject // ---------------- // Enters the pause mode -// +// short WINAPI DLLExport PauseRunObject(LPRDATA rdPtr) { // Ok @@ -202,7 +202,7 @@ short WINAPI DLLExport ContinueRunObject(LPRDATA rdPtr) // ============================================================================ // // START APP / END APP / START FRAME / END FRAME routines -// +// // ============================================================================ // ------------------- @@ -210,7 +210,7 @@ short WINAPI DLLExport ContinueRunObject(LPRDATA rdPtr) // ------------------- // Called when the application starts or restarts. // Useful for storing global data -// +// void WINAPI DLLExport StartApp(mv _far *mV, CRunApp* pApp) { // Example @@ -228,7 +228,7 @@ void WINAPI DLLExport StartApp(mv _far *mV, CRunApp* pApp) // EndApp // ------------------- // Called when the application ends. -// +// void WINAPI DLLExport EndApp(mv _far *mV, CRunApp* pApp) { // Example @@ -246,7 +246,7 @@ void WINAPI DLLExport EndApp(mv _far *mV, CRunApp* pApp) // StartFrame // ------------------- // Called when the frame starts or restarts. -// +// void WINAPI DLLExport StartFrame(mv _far *mV, DWORD dwReserved, int nFrameIndex) { @@ -256,7 +256,7 @@ void WINAPI DLLExport StartFrame(mv _far *mV, DWORD dwReserved, int nFrameIndex) // EndFrame // ------------------- // Called when the frame ends. -// +// void WINAPI DLLExport EndFrame(mv _far *mV, DWORD dwReserved, int nFrameIndex) { @@ -265,17 +265,17 @@ void WINAPI DLLExport EndFrame(mv _far *mV, DWORD dwReserved, int nFrameIndex) // ============================================================================ // // TEXT ROUTINES (if OEFLAG_TEXT) -// +// // ============================================================================ // ------------------- // GetRunObjectFont // ------------------- // Return the font used by the object. -// +// /* - // Note: do not forget to enable the functions in the .def file + // Note: do not forget to enable the functions in the .def file // if you remove the comments below. void WINAPI GetRunObjectFont(LPRDATA rdPtr, LOGFONT* pLf) @@ -289,7 +289,7 @@ void WINAPI GetRunObjectFont(LPRDATA rdPtr, LOGFONT* pLf) // SetRunObjectFont // ------------------- // Change the font used by the object. -// +// void WINAPI SetRunObjectFont(LPRDATA rdPtr, LOGFONT* pLf, RECT* pRc) { // Example @@ -309,7 +309,7 @@ void WINAPI SetRunObjectFont(LPRDATA rdPtr, LOGFONT* pLf, RECT* pRc) // GetRunObjectTextColor // --------------------- // Return the text color of the object. -// +// COLORREF WINAPI GetRunObjectTextColor(LPRDATA rdPtr) { // Example @@ -321,7 +321,7 @@ COLORREF WINAPI GetRunObjectTextColor(LPRDATA rdPtr) // SetRunObjectTextColor // --------------------- // Change the text color of the object. -// +// void WINAPI SetRunObjectTextColor(LPRDATA rdPtr, COLORREF rgb) { // Example @@ -335,7 +335,7 @@ void WINAPI SetRunObjectTextColor(LPRDATA rdPtr, COLORREF rgb) // ============================================================================ // // DEBUGGER ROUTINES -// +// // ============================================================================ // ----------------- diff --git a/rSDK/ZlibStream/UpgradeLog.htm b/rSDK/ZlibStream/UpgradeLog.htm deleted file mode 100644 index 3f20e7509a787128c56e5294a7efbb9d14834ce0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31898 zcmeI5`%@H4mVoQm-H81kdUWUNT?ct7qIbL#JQaBef_QbjF@e10A<{gZnf=pu_xmzQ ztE*|MsTOc2!szI(s;tbDC(k=iW>x?1|NJ@oLpGYd%to?>>}@uijb*iLBRj};vhD2G z>_4)9&#ckKrTrR*qM%~m*H%l5NR)T(8NoNZ@Mv%6UjpWf_2_A~W9aQ6^6PqNKy zm*Xn6cKJP^h0r4G8qia3wd^GHx=TM#IIDAA50Gz#K6WXsXUo)I22DzNE?t{dRw)!7l-)4WR6Ufz)~m%mYT&1!V^+;k1yQ zf_Wn@2jG7IMOW$NZyY}{{t39Bk4Wy?^JW;|E3Wo9+ox3zeJ7sPXkYwH(_)=^OVo^Q zYguD!<*3*~&Uc5}5hHn2=lV3@_batqwP}WtuDi4UqQx+{t^h$vO_2V?)mj)sjWVU6 z##e4{g0ELA++BvsN`>V$V0BmOU0Ju^Dj5I0QtdR(4^VhH+X}Q+zjo>O2^inb#zjS#66Y+9WMT7hmsf(pP8W-viPLAMMq8z_O=9NMgSa3?Vt% zs&M`p_*X@mqWnLH0**mC^wMup3$$s;cFW~lAH-K&Ey*oJRV~<{&nh@~rUB=<)C+z0 zu%psB9`llP)|o`)@~cJs0`=r(ALHDEQk}tUrNPl>HR|3Ny`*oa{mA1e3thn*AAoc8 zjI}TVDRvuA)_eBt<61Ae%~)3$T{R1wEL5`<>4Pi1SSF91jpSRkDPfj#^B7L*uZ%q8 z=q{t)4>o7JB92#~sgdrD{_4D@-XcPazWE5uSF_^~326C@#Xd0(J)1hMjxTc^y>Ok9 z>U!LF1A3fuqfxhdv%zoBtsLgnaX3j&E4%aXtKF$(`T6&e@~e=<{vbc)l2|9|_;BWJ z8|6%I?LFi38vaDd+e0EhWgpKZQav*Y(BoH^$^ILa$*Y&2TsDjHuH1C$ORmZ?Ubk#t z#^)U%D>0H28zXZg$7;INsSY@si{4ks-R9%WFV3Ev+Zr2f1&KDERep0XS6!BuZa|WA z{Pb_P@xc99);>J_*bULtNd5z~lUjKkn*33<*y7+Ttm}_2oy+BMQyuMe#??3{s2u$_-f87>OHWF9)e;mJR1wdmVDFJ#|y08IRSdo22@DfY#eY5s4LcfDG%jdp#C{LEjynf7* z8V$vEmc=YvjX2)?qgT#9Q{K3GG;}}U8)-RpM#<~<80X`oZ_RaHES+P>e*BDfs9}jG zT_K-yb>5=7^ta;H6C^lE!1v%>r;%;4g%@*f9IN8zF`v$CxF!~3CM|^)#k$eL2*Z3p zwK>84FbY@C8pmXQ`}$=t(XH95(6ZzR(BafP*r%;Cv z;f(o2?`;LRhxqb*PVDM$jDj2Ic5#Lz7FDx4_nYvRlS_Xdw2hI!$-;S+B5Q5mF;}NS1`;0|Ib78O-fpsh#lCNvqj5yl_}MA#hk~WA zvGN}+og=SGz58EV&m)V=d}6#YhMo%5+{#MWN08T?;GWr$vN~@9$9KbQWWBWJ775i4O~6zbRM4|>Ra;F(Hv$qolJV(D!T51UhXV%w}LCM&OwW1 z)nu@|FLyAx=91P#p9DF%**L8zpJoc8)W^L@xvXB74qU%H#&~oFS{of}%SSnnYwJcB z>Y_PQ?-rw+onQlF9P%O5`h-;9r`80uQ&uIPpTz7)^n>p9ale;-SGZDAjf`vH=1-k} zB+r{_8B;aVd^31!_wCg}Tk|IFYSf<8Sj7-?af;_!kGOLz!HeshE5Qck7+c2?n`w#r zZmQb1B-fF)e?>?9{06*jM!X1Qb5HJulB!xZkM6VdP8a*(V&4Po$t>EtiLWDma)AxK zO>1{(X=QFhgYy~oF7D~YrJMYY`#|rW;j=_pe!m-ScURRf0h06(r#}ICo^vCsnE#ft zx7k1XOUM`+ZQag(2X?2FyDq#pq5d#?GF~ASJ=rAt)ZEK9boQBHRIic9F@D$2%7(w* z9m?jIvktM_Hq~FlZg&$GZhS2nfy={i<_*W`vr<ON& z^JDa|2yPE({h7#m0f~9dcZA

|=UP6xmCpwNAh9vKO=(rYHC2ZGzQX%11)q%RqjN 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 z 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 diff --git a/rSDK/ZlibStream/Data.h b/rSDK/ZlibStream/Data.h index 5693c099..b311c7ed 100644 --- a/rSDK/ZlibStream/Data.h +++ b/rSDK/ZlibStream/Data.h @@ -1,6 +1,20 @@ class rRundata; typedef rRundata * LPRRDATA; +#ifdef _UNICODE + #define EDITDATA EDITDATAW + #define LPEDATA LPEDATAW + typedef std::wstring tstring; + typedef std::wstringstream tstringstream; + #define t_gzopen(path, mode) gzopen_w(path, mode) +#else + #define EDITDATA EDITDATAA + #define LPEDATA LPEDATAA + typedef std::string tstring; + typedef std::stringstream tstringstream; + #define t_gzopen(path, mode) gzopen(path, mode) +#endif + // -------------------------------- // RUNNING OBJECT DATA STRUCTURE // -------------------------------- @@ -12,18 +26,18 @@ typedef struct tagRDATA #include "MagicRDATA.h" //bool is volatile so it can be changed instantly by threads - unsigned short inbuffersize; // Default size of memory buffer - double PercentageDifference; // Percentage difference input->output - string LastOutput; // Last finished file name - string returnstring; // String to return with statistics or errors - volatile bool threadsafe; // Ensure only one thread accesses rdPtr's variables + unsigned short inbuffersize; //Default size of memory buffer + double PercentageDifference; //Percentage difference input->output + tstring LastOutput; //Last finished file name + tstring returnstring; //String to return with statistics or errors + volatile bool threadsafe; //Ensure only one thread accesses rdPtr's variables - tagRDATA() : inbuffersize(8192), PercentageDifference(0.0), LastOutput(""), returnstring(""), threadsafe(false) // Constructor + tagRDATA() : inbuffersize(8192), PercentageDifference(0.0), LastOutput(_T("")), returnstring(_T("")), threadsafe(false) //Constructor { //vars initialized above in the initializer list } //functions - ~tagRDATA(){} // Destructor + ~tagRDATA(){} //Destructor } RUNDATA; typedef RUNDATA * LPRDATA; diff --git a/rSDK/ZlibStream/Edittime.cpp b/rSDK/ZlibStream/Edittime.cpp index 32bcc5f9..406fa1fd 100644 --- a/rSDK/ZlibStream/Edittime.cpp +++ b/rSDK/ZlibStream/Edittime.cpp @@ -4,7 +4,7 @@ // under the Frame and Event editors. // // Including creating, display, and setting up your object. -// +// // ============================================================================ #include "common.h" @@ -41,7 +41,7 @@ DEBUGGER_ITEMS_START() // DB_CURRENTSTRING, // DB_CURRENTSTRING|DB_EDITABLE, - // DB_CURRENTVALUE|DB_EDITABLE, + // DB_CURRENTVALUE|DB_EDITABLE, // DB_CURRENTCHECK, // DB_CURRENTCOMBO, @@ -202,23 +202,23 @@ void WINAPI DLLExport SetPropValue(LPMV mV, LPEDATA edPtr, UINT nPropID, LPVOID // // or have an adaptive size of structure like below // // // If the length is different -// if (strlen(pStr)!=strlen(edPtr->text)) +// if (_tcslen(pStr)!=_tcslen(edPtr->text)) // { // // Asks MMF to reallocate the structure with the new size -// LPEDATA pNewPtr = (LPEDATA)mvReAllocEditData(mV, edPtr, sizeof(EDITDATA)+strlen(pStr)); -// +// LPEDATA pNewPtr = (LPEDATA)mvReAllocEditData(mV, edPtr, sizeof(EDITDATA)+_tcslen(pStr)); +// // // If reallocation worked // if (pNewPtr!=NULL) // { // // Copy the string // edPtr=pNewPtr; -// strcpy(edPtr->text, pStr); +// _tcscpy(edPtr->text, pStr); // } // } // else -// { +// { // // Same size : simply copy -// strcpy(edPtr->text, pStr); +// _tcscpy(edPtr->text, pStr); // } // } // break; @@ -303,7 +303,7 @@ BOOL WINAPI IsPropEnabled(LPMV mV, LPEDATA edPtr, UINT nPropID) // ============================================================================ // // TEXT PROPERTIES -// +// // ============================================================================ // -------------------- @@ -324,7 +324,7 @@ DWORD WINAPI DLLExport GetTextCaps(mv _far *mV, LPEDATA edPtr) // Note: the pStyle and cbSize parameters are obsolete and passed for compatibility reasons only. // -BOOL WINAPI DLLExport GetTextFont(mv _far *mV, LPEDATA edPtr, LPLOGFONT plf, LPSTR pStyle, UINT cbSize) +BOOL WINAPI DLLExport GetTextFont(mv _far *mV, LPEDATA edPtr, LPLOGFONT plf, LPTSTR pStyle, UINT cbSize) { #if !RUN_ONLY // Example: copy LOGFONT structure from EDITDATA @@ -482,7 +482,7 @@ WORD BmpToImg(int bmID, npAppli idApp, short HotX = 0, short HotY = 0, short Act // ============================================================================ // // ROUTINES USED UNDER FRAME EDITOR -// +// // ============================================================================ // -------------------- @@ -497,7 +497,7 @@ WORD BmpToImg(int bmID, npAppli idApp, short HotX = 0, short HotY = 0, short Act // /* -int WINAPI DLLExport MakeIconEx ( mv _far *mV, cSurface* pIconSf, LPSTR lpName, fpObjInfo oiPtr, LPEDATA edPtr ) +int WINAPI DLLExport MakeIconEx ( mv _far *mV, cSurface* pIconSf, LPTSTR lpName, fpObjInfo oiPtr, LPEDATA edPtr ) { int error = -1; #ifndef RUN_ONLY @@ -512,7 +512,7 @@ int WINAPI DLLExport MakeIconEx ( mv _far *mV, cSurface* pIconSf, LPSTR lpName, // -------------------- // CreateObject // -------------------- -// Called when you choose "Create new object". It should display the setup box +// Called when you choose "Create new object". It should display the setup box // and initialize everything in the datazone. int WINAPI DLLExport CreateObject(mv _far *mV, fpLevObj loPtr, LPEDATA edPtr) @@ -521,7 +521,7 @@ int WINAPI DLLExport CreateObject(mv _far *mV, fpLevObj loPtr, LPEDATA edPtr) // Do some rSDK stuff #include "rCreateObject.h" - + // Set default object settings // edPtr->swidth = 32; @@ -545,7 +545,7 @@ int WINAPI DLLExport CreateObject(mv _far *mV, fpLevObj loPtr, LPEDATA edPtr) BOOL WINAPI EditObject (mv _far *mV, fpObjInfo oiPtr, fpLevObj loPtr, LPEDATA edPtr) { #ifndef RUN_ONLY - + return TRUE; #endif // !RUN_ONLY @@ -594,7 +594,7 @@ void WINAPI DLLExport RemoveObject(mv _far *mV, fpLevObj loPtr, LPEDATA edPtr, u { #ifndef RUN_ONLY // Is the last object removed? - if (0 == cpt) + if (0 == cpt) { // Do whatever necessary to remove our data } @@ -676,7 +676,7 @@ void WINAPI DLLExport EditorDisplay(mv _far *mV, fpObjInfo oiPtr, fpLevObj loPtr // IsTransparent // -------------------- // This routine tells MMF2 if the mouse pointer is over a transparent zone of the object. -// +// extern "C" BOOL WINAPI DLLExport IsTransparent(mv _far *mV, fpLevObj loPtr, LPEDATA edPtr, int dx, int dy) { @@ -690,7 +690,7 @@ extern "C" BOOL WINAPI DLLExport IsTransparent(mv _far *mV, fpLevObj loPtr, LPED // PrepareToWriteObject // -------------------- // Just before writing the datazone when saving the application, MMF2 calls this routine. -// +// void WINAPI DLLExport PrepareToWriteObject(mv _far *mV, LPEDATA edPtr, fpObjInfo adoi) { @@ -725,23 +725,23 @@ BOOL WINAPI GetFilters(LPMV mV, LPEDATA edPtr, DWORD dwFlags, LPVOID pReserved) // Return TRUE if you can create an object from the given file // -BOOL WINAPI DLLExport UsesFile (LPMV mV, LPSTR fileName) +BOOL WINAPI DLLExport UsesFile (LPMV mV, LPTSTR fileName) { BOOL r = FALSE; #ifndef RUN_ONLY // Example: return TRUE if file extension is ".txt" -/* - LPSTR ext, npath; +/* + LPTSTR ext, npath; if ( fileName != NULL ) { - if ( (ext=(LPSTR)malloc(_MAX_EXT)) != NULL ) + if ( (ext=(LPTSTR)malloc(_MAX_EXT)) != NULL ) { - if ( (npath=(LPSTR)malloc(_MAX_PATH)) != NULL ) + if ( (npath=(LPTSTR)malloc(_MAX_PATH)) != NULL ) { - strcpy(npath, fileName); - _splitpath(npath, NULL, NULL, NULL, ext); + _tcscpy(npath, fileName); + _tsplitpath(npath, NULL, NULL, NULL, ext); if ( _stricmp(ext, ".txt") == 0 ) r = TRUE; free(npath); @@ -760,7 +760,7 @@ BOOL WINAPI DLLExport UsesFile (LPMV mV, LPSTR fileName) // Creates a new object from file // -void WINAPI DLLExport CreateFromFile (LPMV mV, LPSTR fileName, LPEDATA edPtr) +void WINAPI DLLExport CreateFromFile (LPMV mV, LPTSTR fileName, LPEDATA edPtr) { #ifndef RUN_ONLY // Initialize your extension data from the given file @@ -768,7 +768,7 @@ void WINAPI DLLExport CreateFromFile (LPMV mV, LPSTR fileName, LPEDATA edPtr) // edPtr->sheight = 32; // Example: store the filename - // strcpy(edPtr->myFileName, fileName); + // _tcscpy(edPtr->myFileName, fileName); #endif // !RUN_ONLY } @@ -778,24 +778,24 @@ void WINAPI DLLExport CreateFromFile (LPMV mV, LPSTR fileName, LPEDATA edPtr) // // ROUTINES USED UNDER EVENT / TIME / STEP-THROUGH EDITOR // You should not need to change these routines -// +// // ============================================================================ // ----------------- // menucpy // ----------------- // Internal routine used later, copy one menu onto another -// -#ifndef RUN_ONLY + void menucpy(HMENU hTargetMenu, HMENU hSourceMenu) { - int n, id, nMn; - TCHAR * strBuf; - HMENU hSubMenu; - +#ifndef RUN_ONLY + int n, id, nMn; + LPTSTR strBuf; + HMENU hSubMenu; + nMn = GetMenuItemCount(hSourceMenu); - strBuf = (TCHAR *)LocalAlloc(LPTR, 80); - for (n=0; n < nMn; n++) + strBuf = (LPTSTR)calloc(80, sizeof(TCHAR)); + for (n = 0; n < nMn; n++) { if (0 == (id = GetMenuItemID(hSourceMenu, n))) AppendMenu(hTargetMenu, MF_SEPARATOR, 0, 0L); @@ -812,26 +812,31 @@ void menucpy(HMENU hTargetMenu, HMENU hSourceMenu) } } } - LocalFree((HLOCAL)strBuf); + free(strBuf); +#endif } // ----------------- // GetPopupMenu // ----------------- // Internal routine used later. Returns the first popup from a menu -// +// HMENU GetPopupMenu(LPEDATA edPtr,short mn) { +#ifndef RUN_ONLY HMENU hPopup = CreatePopupMenu(); if (mn == MN_CONDITIONS) - menucpy(hPopup, ConditionMenu(edPtr)); + menucpy(hPopup,ConditionMenu(/*edPtr*/)); else if (mn == MN_ACTIONS) - menucpy(hPopup, ActionMenu(edPtr)); + menucpy(hPopup,ActionMenu(/*edPtr*/)); else if (mn == MN_EXPRESSIONS) - menucpy(hPopup, ExpressionMenu(edPtr)); + menucpy(hPopup,ExpressionMenu(/*edPtr*/)); return hPopup; +#else + return NULL; +#endif } // -------------------- @@ -842,14 +847,13 @@ HMENU GetPopupMenu(LPEDATA edPtr,short mn) // static LPEVENTINFOS2 GetEventInformations(LPEVENTINFOS2 eiPtr, short code) + { while (eiPtr->infos.code != code) eiPtr = EVINFO2_NEXT(eiPtr); - + return eiPtr; } -#endif // !RUN_ONLY - // ---------------------------------------------------- // GetConditionMenu / GetActionMenu / GetExpressionMenu @@ -862,7 +866,7 @@ HMENU WINAPI DLLExport GetConditionMenu(mv _far *mV, fpObjInfo oiPtr, LPEDATA ed { #ifndef RUN_ONLY // Check compatibility - return GetPopupMenu(edPtr, MN_CONDITIONS); + return GetPopupMenu(edPtr,MN_CONDITIONS); #endif // !RUN_ONLY return NULL; } @@ -871,7 +875,7 @@ HMENU WINAPI DLLExport GetActionMenu(mv _far *mV, fpObjInfo oiPtr, LPEDATA edPtr { #ifndef RUN_ONLY // Check compatibility - return GetPopupMenu(edPtr, MN_ACTIONS); + return GetPopupMenu(edPtr,MN_ACTIONS); #endif // !RUN_ONLY return NULL; } @@ -880,7 +884,7 @@ HMENU WINAPI DLLExport GetExpressionMenu(mv _far *mV, fpObjInfo oiPtr, LPEDATA e { #ifndef RUN_ONLY // Check compatibility - return GetPopupMenu(edPtr, MN_EXPRESSIONS); + return GetPopupMenu(edPtr,MN_EXPRESSIONS); #endif // !RUN_ONLY return NULL; } @@ -897,42 +901,37 @@ HMENU WINAPI DLLExport GetExpressionMenu(mv _far *mV, fpObjInfo oiPtr, LPEDATA e #ifndef RUN_ONLY void GetCodeTitle(LPEVENTINFOS2 eiPtr, short code, short param, short mn, LPTSTR strBuf, WORD maxLen) { - HMENU hMn; + HMENU hMn; // Finds event in array - eiPtr = GetEventInformations(eiPtr, code); + eiPtr=GetEventInformations(eiPtr, code); // If a special string is to be returned short strID = EVINFO2_PARAMTITLE(eiPtr, param); - if (strID) - { - switch(mn) - { + if (strID) { + switch(mn) { case MN_CONDITIONS: - if (code >= 0 && code < (short)Conditions.size()) { - if (param >= 0 && param < (short)Conditions[code]->getParamCount()) - _tcscpy_s(strBuf, maxLen, Conditions[code]->getParamName(param)); + if (code>=0&&code<(short)Conditions.size()) { + if (param>=0&¶m<(short)Conditions[code]->getParamCount()) + _tcscpy(strBuf,Conditions[code]->getParamName(param)); } break; case MN_ACTIONS: - if (code >= 0 && code < (short)Actions.size()) { - if (param >= 0 && param < (short)Actions[code]->getParamCount()) - _tcscpy_s(strBuf, maxLen, Actions[code]->getParamName(param)); + if (code>=0&&code<(short)Actions.size()) { + if (param>=0&¶m<(short)Actions[code]->getParamCount()) + _tcscpy(strBuf,Actions[code]->getParamName(param)); } break; case MN_EXPRESSIONS: - if (code >= 0 && code < (short)Expressions.size()) { - if (param >= 0 && param < (short)Expressions[code]->getParamCount()) - _tcscpy_s(strBuf, maxLen, Expressions[code]->getParamName(param)); + if (code>=0&&code<(short)Expressions.size()) { + if (param>=0&¶m<(short)Expressions[code]->getParamCount()) + _tcscpy(strBuf,Expressions[code]->getParamName(param)); } break; } - } - else - { - if ((hMn = LoadMenu(hInstLib, MAKEINTRESOURCE(mn)))) - { + } else { + if ((hMn=LoadMenu(hInstLib, MAKEINTRESOURCE(mn)))) { GetMenuString(hMn, eiPtr->menu, strBuf, maxLen, MF_BYCOMMAND); DestroyMenu(hMn); } @@ -964,9 +963,9 @@ short WINAPI DLLExport GetConditionCodeFromMenu(mv _far *mV, short menuId) #ifndef RUN_ONLY LPEVENTINFOS2 eiPtr; int n; - for (n = Conditions.size(), eiPtr = (LPEVENTINFOS2)conditionsInfos; n > 0 && eiPtr->menu != menuId; n--) - eiPtr = EVINFO2_NEXT(eiPtr); - if (n > 0) + for (n=Conditions.size(),eiPtr=(LPEVENTINFOS2)conditionsInfos;n>0&&eiPtr->menu!=menuId;n--) + eiPtr=EVINFO2_NEXT(eiPtr); + if (n>0) return eiPtr->infos.code; #endif // !RUN_ONLY return -1; @@ -978,9 +977,9 @@ short WINAPI DLLExport GetActionCodeFromMenu(mv _far *mV, short menuId) LPEVENTINFOS2 eiPtr; int n; - for (n = Actions.size(), eiPtr = (LPEVENTINFOS2)actionsInfos; n > 0 && eiPtr->menu != menuId; n--) + for (n=Actions.size(),eiPtr=(LPEVENTINFOS2)actionsInfos;n>0&&eiPtr->menu!=menuId;n--) eiPtr = EVINFO2_NEXT(eiPtr); - if (n > 0) + if (n>0) return eiPtr->infos.code; #endif // !RUN_ONLY return -1; @@ -991,9 +990,9 @@ short WINAPI DLLExport GetExpressionCodeFromMenu(mv _far *mV, short menuId) #ifndef RUN_ONLY LPEVENTINFOS2 eiPtr; int n; - for (n = Expressions.size(), eiPtr = (LPEVENTINFOS2)expressionsInfos; n > 0 && eiPtr->menu != menuId; n--) + for (n=Expressions.size(),eiPtr=(LPEVENTINFOS2)expressionsInfos;n>0&&eiPtr->menu!=menuId;n--) eiPtr = EVINFO2_NEXT(eiPtr); - if (n > 0) + if (n>0) return eiPtr->infos.code; #endif // !RUN_ONLY return -1; @@ -1003,8 +1002,8 @@ short WINAPI DLLExport GetExpressionCodeFromMenu(mv _far *mV, short menuId) // ------------------------------------------------------- // GetConditionInfos / GetActionInfos / GetExpressionInfos // ------------------------------------------------------- -// From a action / condition / expression code, returns -// an infosEvents structure. +// From a action / condition / expression code, returns +// an infosEvents structure. // LPINFOEVENTSV2 WINAPI DLLExport GetConditionInfos(mv _far *mV, short code) @@ -1038,31 +1037,31 @@ LPINFOEVENTSV2 WINAPI DLLExport GetExpressionInfos(mv _far *mV, short code) // ---------------------------------------------------------- // GetConditionString / GetActionString / GetExpressionString // ---------------------------------------------------------- -// From a action / condition / expression code, returns +// From a action / condition / expression code, returns // the string to use for displaying it under the event editor // void WINAPI DLLExport GetConditionString(mv _far *mV, short code, LPTSTR strPtr, short maxLen) { #ifndef RUN_ONLY - if (code >= 0 && code < (short)Conditions.size()) - _tcscpy(strPtr, Conditions[code]->getName()); + if (code>=0&&code<(short)Conditions.size()) + _tcscpy(strPtr,Conditions[code]->getName()); #endif // !RUN_ONLY } void WINAPI DLLExport GetActionString(mv _far *mV, short code, LPTSTR strPtr, short maxLen) { #ifndef RUN_ONLY - if (code >= 0 && code < (short)Actions.size()) - _tcscpy(strPtr, Actions[code]->getName()); + if (code>=0&&code<(short)Actions.size()) + _tcscpy(strPtr,Actions[code]->getName()); #endif // !RUN_ONLY } void WINAPI DLLExport GetExpressionString(mv _far *mV, short code, LPTSTR strPtr, short maxLen) { #ifndef RUN_ONLY - if (code >= 0 && code < (short)Expressions.size()) - _tcscpy_s(strPtr, maxLen, Expressions[code]->getName()); + if (code>=0&&code<(short)Expressions.size()) + _tcscpy(strPtr,Expressions[code]->getName()); #endif // !RUN_ONLY } @@ -1076,9 +1075,9 @@ void WINAPI DLLExport GetExpressionParam(mv _far *mV, short code, short param, L { #ifndef RUN_ONLY if (_tcslen(Expressions[code]->getParamName(param))) - _tcscpy_s(strBuf, maxLen, Expressions[code]->getParamName(param)); + _tcscpy(strBuf,Expressions[code]->getParamName(param)); else - *strBuf = 0; + *strBuf=0; #endif } @@ -1097,8 +1096,8 @@ void WINAPI InitParameter(mv _far *mV, short code, paramExt* pExt) #if !RUN_ONLY // Example // ------- - // strcpy(&pExt->pextData[0], "Parameter Test"); - // pExt->pextSize = sizeof(paramExt) + strlen(pExt->pextData) + 1; + // _tcscpy(&pExt->pextData[0], "Parameter Test"); + // pExt->pextSize = sizeof(paramExt) + _tcslen(pExt->pextData)+1; #endif // !RUN_ONLY } @@ -1116,7 +1115,7 @@ BOOL CALLBACK DLLExport SetupProc(HWND hDlg, UINT msgType, WPARAM wParam, LPARAM // Save edptr SetWindowLong(hDlg, DWL_USER, lParam); - pExt = (paramExt *)lParam; + pExt=(paramExt*)lParam; SetDlgItemText(hDlg, IDC_EDIT, pExt->pextData); return TRUE; @@ -1130,7 +1129,7 @@ BOOL CALLBACK DLLExport SetupProc(HWND hDlg, UINT msgType, WPARAM wParam, LPARAM { case IDOK: // Exit GetDlgItemText(hDlg, IDC_EDIT, pExt->pextData, 500); - pExt->pextSize = sizeof(paramExt) + strlen(pExt->pextData) + 1; + pExt->pextSize=sizeof(paramExt)+_tcslen(pExt->pextData)+1; EndDialog(hDlg, TRUE); return TRUE; @@ -1170,7 +1169,7 @@ void WINAPI EditParameter(mv _far *mV, short code, paramExt* pExt) // Initialize the parameter. // -void WINAPI GetParameterString(mv _far *mV, short code, paramExt* pExt, LPSTR pDest, short size) +void WINAPI GetParameterString(mv _far *mV, short code, paramExt* pExt, LPTSTR pDest, short size) { #if !RUN_ONLY @@ -1190,14 +1189,14 @@ void WINAPI GetParameterString(mv _far *mV, short code, paramExt* pExt, LPSTR pD // Note: ObjComment is also displayed in the Quick Description box in the Insert Object dialog box // -void WINAPI DLLExport GetObjInfos (mv _far *mV, LPEDATA edPtr, LPSTR ObjName, LPSTR ObjAuthor, LPSTR ObjCopyright, LPSTR ObjComment, LPSTR ObjHttp) +void WINAPI DLLExport GetObjInfos (mv _far *mV, LPEDATA edPtr, LPTSTR ObjName, LPTSTR ObjAuthor, LPTSTR ObjCopyright, LPTSTR ObjComment, LPTSTR ObjHttp) { #ifndef RUN_ONLY - strcpy_s(ObjName, 255, ObjectName); - strcpy_s(ObjAuthor, 255, ObjectAuthor); - strcpy_s(ObjCopyright, 255, ObjectCopyright); - strcpy_s(ObjComment, 1023, ObjectComment); - strcpy_s(ObjHttp, 255, ObjectURL); + _tcscpy(ObjName, ObjectName); + _tcscpy(ObjAuthor,ObjectAuthor); + _tcscpy(ObjCopyright,ObjectCopyright); + _tcscpy(ObjComment,ObjectComment); + _tcscpy(ObjHttp,ObjectURL); #endif } @@ -1207,10 +1206,10 @@ void WINAPI DLLExport GetObjInfos (mv _far *mV, LPEDATA edPtr, LPSTR ObjName, LP // Returns the help filename of the object. // -LPCSTR WINAPI GetHelpFileName() +LPCTSTR WINAPI GetHelpFileName() { #ifndef RUN_ONLY - return ObjectHelp; + return _T(ObjectHelp); #else return NULL; #endif diff --git a/rSDK/ZlibStream/Ext.rc b/rSDK/ZlibStream/Ext.rc index 9f122903..1da7c4ee 100644 --- a/rSDK/ZlibStream/Ext.rc +++ b/rSDK/ZlibStream/Ext.rc @@ -68,16 +68,16 @@ END #if defined(APSTUDIO_INVOKED) || defined(EDITOR) #if defined(APSTUDIO_INVOKED) -EXO_ICON$(EDITOR) BITMAP "EXTICON.BMP" +EXO_ICON$(EDITOR) BITMAP "Icon.bmp" #else -EXO_ICON BITMAP "EXTICON.BMP" +EXO_ICON BITMAP "Icon.bmp" #endif #endif #if defined(APSTUDIO_INVOKED) || defined(EDITOR) #if defined(APSTUDIO_INVOKED) -EXO_IMAGE$(EDITOR) BITMAP "EXTIMG.BMP" +EXO_IMAGE$(EDITOR) BITMAP "Img.bmp" #else -EXO_IMAGE BITMAP "EXTIMG.BMP" +EXO_IMAGE BITMAP "Img.bmp" #endif #endif diff --git a/rSDK/ZlibStream/General.cpp b/rSDK/ZlibStream/General.cpp index 4e2113c6..6b47b6f3 100644 --- a/rSDK/ZlibStream/General.cpp +++ b/rSDK/ZlibStream/General.cpp @@ -1,7 +1,7 @@ /// ===================================================================================== // // The following routines are used internally by MMF, and should not need to be modified -// +// // ===================================================================================== #include "common.h" @@ -12,7 +12,7 @@ EXT_INIT() // ============================================================================ // // LIBRARY ENTRY & QUIT POINTS -// +// // ============================================================================ // ----------------- @@ -27,16 +27,16 @@ BOOL WINAPI DllMain(HINSTANCE hDLL, DWORD dwReason, LPVOID lpReserved) conditionsInfos = getConditionInfos(); actionsInfos = getActionInfos(); expressionsInfos = getExpressionInfos(); - + ConditionJumps = getConditions(); ActionJumps = getActions(); ExpressionJumps = getExpressions(); - + switch (dwReason) { // DLL is attaching to the address space of the current process. case DLL_PROCESS_ATTACH: - + hInstLib = hDLL; // Store HINSTANCE break; @@ -49,10 +49,10 @@ BOOL WINAPI DllMain(HINSTANCE hDLL, DWORD dwReason, LPVOID lpReserved) break; // The calling process is detaching the DLL from its address space. - case DLL_PROCESS_DETACH: + case DLL_PROCESS_DETACH: break; } - + return TRUE; } @@ -73,7 +73,7 @@ extern "C" int WINAPI DLLExport Initialize(mv _far *mV, int quiet) // ----------------- // Where you want to kill and initialized data opened in the above routine // Called just before freeing the DLL. -// +// extern "C" int WINAPI DLLExport Free(mv _far *mV) { // No error @@ -83,18 +83,18 @@ extern "C" int WINAPI DLLExport Free(mv _far *mV) // ============================================================================ // // GENERAL INFO -// +// // ============================================================================ // ----------------- // Get Infos // ----------------- -// -extern "C" +// +extern "C" { DWORD WINAPI DLLExport GetInfos(int info) { - + switch (info) { case KGI_VERSION: @@ -105,6 +105,12 @@ extern "C" return ForVersion; case KGI_BUILD: return MinimumBuild; + case KGI_UNICODE: + #ifdef _UNICODE + return TRUE; + #else + return FALSE; + #endif default: return 0; } @@ -116,7 +122,7 @@ extern "C" // ---------------------------------------------------------- // Fills an information structure that tells MMF2 everything // about the object, its actions, conditions and expressions -// +// short WINAPI DLLExport GetRunObjectInfos(mv _far *mV, fpKpxRunInfos infoPtr) { @@ -129,7 +135,7 @@ short WINAPI DLLExport GetRunObjectInfos(mv _far *mV, fpKpxRunInfos infoPtr) infoPtr->numOfExpressions = (short)Expressions.size(); infoPtr->editDataSize = sizeof(EDITDATA); - + MagicFlags(infoPtr->editFlags); infoPtr->windowProcPriority = WINDOWPROC_PRIORITY; @@ -138,7 +144,7 @@ short WINAPI DLLExport GetRunObjectInfos(mv _far *mV, fpKpxRunInfos infoPtr) infoPtr->identifier = IDENTIFIER; infoPtr->version = 1; - + return TRUE; } @@ -150,13 +156,13 @@ short WINAPI DLLExport GetRunObjectInfos(mv _far *mV, fpKpxRunInfos infoPtr) // Data\Runtime folder). // -LPCSTR* WINAPI DLLExport GetDependencies() +LPCTSTR* WINAPI DLLExport GetDependencies() { // Do some rSDK stuff #include "rGetDependencies.h" - - //LPCSTR szDep[] = { - // "MyDll.dll", + + //LPCTSTR szDep[] = { + // _T("MyDll.dll"), // NULL //}; @@ -190,7 +196,7 @@ void WINAPI DLLExport UnloadObject(mv _far *mV, LPEDATA edPtr, int reserved) // -------------------- // For you to update your object structure to newer versions // Called at both edit time and run time -// +// HGLOBAL WINAPI DLLExport UpdateEditStructure(mv __far *mV, void __far * OldEdPtr) { // We do nothing here @@ -205,9 +211,10 @@ HGLOBAL WINAPI DLLExport UpdateEditStructure(mv __far *mV, void __far * OldEdPtr // Called at edit time and run time. // // Call lpfnUpdate to update your file pathname (refer to the documentation) -// -void WINAPI DLLExport UpdateFileNames(mv _far *mV, LPSTR appName, LPEDATA edPtr, void (WINAPI * lpfnUpdate)(LPSTR, LPSTR)) +// +void WINAPI DLLExport UpdateFileNames(mv _far *mV, LPTSTR appName, LPEDATA edPtr, void (WINAPI * lpfnUpdate)(LPTSTR, LPTSTR)) { + } // --------------------- @@ -216,22 +223,22 @@ void WINAPI DLLExport UpdateFileNames(mv _far *mV, LPSTR appName, LPEDATA edPtr, // // Uncomment this function if you need to store an image in the image bank. // -// Note: do not forget to enable the function in the .def file +// Note: do not forget to enable the function in the .def file // if you remove the comments below. // /* int WINAPI DLLExport EnumElts (mv __far *mV, LPEDATA edPtr, ENUMELTPROC enumProc, ENUMELTPROC undoProc, LPARAM lp1, LPARAM lp2) -{ +{ int error = 0; // Replace wImgIdx with the name of the WORD variable you create within the edit structure - - // Enum images + + // Enum images if ( (error = enumProc(&edPtr->wImgIdx, IMG_TAB, lp1, lp2)) != 0 ) { - // Undo enum images - undoProc (&edPtr->wImgIdx, IMG_TAB, lp1, lp2); - } + // Undo enum images + undoProc (&edPtr->wImgIdx, IMG_TAB, lp1, lp2); + } return error; } diff --git a/rSDK/ZlibStream/EXTICON.BMP b/rSDK/ZlibStream/Icon.bmp similarity index 100% rename from rSDK/ZlibStream/EXTICON.BMP rename to rSDK/ZlibStream/Icon.bmp diff --git a/rSDK/ZlibStream/EXTIMG.BMP b/rSDK/ZlibStream/Img.bmp similarity index 100% rename from rSDK/ZlibStream/EXTIMG.BMP rename to rSDK/ZlibStream/Img.bmp diff --git a/rSDK/ZlibStream/Information.h b/rSDK/ZlibStream/Information.h index 4c830222..0706502d 100644 --- a/rSDK/ZlibStream/Information.h +++ b/rSDK/ZlibStream/Information.h @@ -3,12 +3,12 @@ // -------------------- // Basic object details -#define ObjectName "ZlibStream object" -#define ObjectAuthor "Darkwire Software" -#define ObjectCopyright "Copyright \xA9 2019 Darkwire Software" -#define ObjectComment "Compress and decompress files with Zlib without loading them into the memory. Allows several actions at once." -#define ObjectURL "http://www.dark-wire.com/" -#define ObjectHelp "Help\\ZlibStream.chm" +#define ObjectName _T("ZlibStream") +#define ObjectAuthor _T("Darkwire Software") +#define ObjectCopyright _T("Copyright \xA9 2011-2026 Darkwire Software") +#define ObjectComment _T("Compress and decompress files with Zlib without loading them into the memory. Allows several actions at once.") +#define ObjectURL _T("http://www.dark-wire.com/") +#define ObjectHelp _T("Help\\ZlibStream.chm") // If you register your object with Clickteam, change this to the ID you were given #define ObjectRegID REGID_PRIVATE diff --git a/rSDK/ZlibStream/Main.cpp b/rSDK/ZlibStream/Main.cpp index 857c206a..8c09820f 100644 --- a/rSDK/ZlibStream/Main.cpp +++ b/rSDK/ZlibStream/Main.cpp @@ -1,7 +1,7 @@ // ============================================================================ // // This file contains the actions, conditions and expressions your object uses -// +// // ============================================================================ #include "Common.h" @@ -12,7 +12,7 @@ { \ Sleep(0); \ } \ - rdPtr -> threadsafe=true + rdPtr -> threadsafe=true #define ThreadSafe_End() rdPtr -> threadsafe=false //Macro for simplicity #define Terminate() \ @@ -21,13 +21,13 @@ rdPtr -> LastOutput = outfilename; \ rdPtr -> rRd -> CallEvent(1); \ ThreadSafe_End(); \ - return 1 + return 1 // Please note: Using GenerateEvent in place of PushEvent is not a good idea, being that // access to rdPtr is blocked by ThreadSafe_Start. Example code: -// ThreadSafe_Start(); -// rdPtr -> GenerateEvent(0); -// ThreadSafe_End(); +// ThreadSafe_Start(); +// rdPtr -> GenerateEvent(0); +// ThreadSafe_End(); // If the user retrieves expressions with GenerateEvent, the ThreadSafe_End is not run // until after they retrieve the variables. So of course the while loop in ThreadSafe_Start // runs without stopping. @@ -39,401 +39,416 @@ //Define struct used to export data from actions to threads struct Params { - char para_infilename [MAX_PATH]; // Input file name - char para_outfilename [MAX_PATH]; // Output file name - bool para_UseAppend; // If true, append; otherwise (over)write output - LPRDATA para_rdPtr; //rdPtr (must be given or threads cannot access rdPtr) + TCHAR para_infilename [MAX_PATH]; //Input file name + TCHAR para_outfilename [MAX_PATH]; //Output file name + bool para_UseAppend; //If true, append; otherwise (over)write output + LPRDATA para_rdPtr; //rdPtr (must be given or threads cannot access rdPtr) }; //Calculate file size -unsigned long file_size(char *filename) { - FILE *pFile = NULL; - if (fopen_s(&pFile, filename, "rb")) // Open file - return 0; // If handle has a problem, return 0, eg no file - fseek(pFile, 0, SEEK_END); // If not, goto end of file - unsigned long size = ftell(pFile); //Get position (Must be stored so fclose can be run) - fclose(pFile); // Close file - return size; // Return +unsigned long file_size(TCHAR *filename) { + FILE *pFile = NULL; + if (_tfopen_s(&pFile, filename, _T("rb"))) // Open file + return 0; // If handle has a problem, return 0, eg no file + fseek(pFile, 0, SEEK_END); //If not, goto end of file + unsigned long size = ftell(pFile); //Get position (Must be stored so fclose can be run) + fclose(pFile); //Close file + return size; //Return } -bool FileSizeCheck(char *infilename, LPRDATA rdPtr) +bool FileSizeCheck(TCHAR *infilename, LPRDATA rdPtr) { - if (file_size(infilename) < 1) - { - ThreadSafe_Start(); - rdPtr -> returnstring = "Input file size 0 or nonexistent."; - ThreadSafe_End(); - return true; - } - else - return false; + if (file_size(infilename) < 1) + { + ThreadSafe_Start(); + rdPtr -> returnstring = _T("Input file size 0 or nonexistent."); + ThreadSafe_End(); + return true; + } + else + return false; } bool HandleCheck(FILE *file, gzFile gzfile, LPRDATA rdPtr) { - if (!file) - { - ThreadSafe_Start(); - rdPtr -> returnstring = "Input file malfunctioned."; - gzclose(gzfile); - ThreadSafe_End(); - return true; - } - else if (!gzfile) - { - ThreadSafe_Start(); - rdPtr -> returnstring = "Output file malfunctioned."; - fclose(file); - ThreadSafe_End(); - return true; - } - else - { - return false; - } + if (!file) + { + ThreadSafe_Start(); + rdPtr -> returnstring = _T("Input file malfunctioned."); + gzclose(gzfile); + ThreadSafe_End(); + return true; + } + else if (!gzfile) + { + ThreadSafe_Start(); + rdPtr -> returnstring = _T("Output file malfunctioned."); + fclose(file); + ThreadSafe_End(); + return true; + } + else + { + return false; + } } //Compress a file DWORD WINAPI compress_one_file(Params *pDataArray) -{ - //Open struct and set variables - char *infilename = new char [MAX_PATH]; // Get input file name - strcpy_s(infilename, MAX_PATH, pDataArray -> para_infilename); - char *outfilename = new char [MAX_PATH]; // Get output file name - strcpy_s(outfilename, MAX_PATH, pDataArray -> para_outfilename); - bool UseAppend = pDataArray -> para_UseAppend; // G et whether to append or write - LPRDATA rdPtr = pDataArray -> para_rdPtr; //Get rdPtr - delete pDataArray; // Container is expendable - - char * WriteType = "wb9"; //User is using write (overwriting) - if (UseAppend) WriteType = "ab9"; // User is using append - +{ + //Open struct and set variables + TCHAR *infilename = new TCHAR [MAX_PATH]; //Get input file name + _tcscpy_s(infilename, MAX_PATH, pDataArray -> para_infilename); + TCHAR *outfilename = new TCHAR [MAX_PATH]; //Get output file name + _tcscpy_s(outfilename, MAX_PATH, pDataArray -> para_outfilename); + bool UseAppend = pDataArray -> para_UseAppend; //G et whether to append or write + LPRDATA rdPtr = pDataArray -> para_rdPtr; //Get rdPtr + delete pDataArray; //Container is expendable + + const char * WriteType = "wb9"; //User is using write (overwriting) + if (UseAppend) WriteType = "ab9"; //User is using append + //Check input file size - no handles to close - if (FileSizeCheck(infilename, rdPtr)) {Terminate();} + if (FileSizeCheck(infilename, rdPtr)) {Terminate();} - //Open handles to both files - FILE *infile = fopen(infilename, "rb"); // r = read, b = binary - gzFile outfile = gzopen(outfilename, WriteType); // a = append (or w=write), b = binary, 9 = max compression + //Open handles to both files + FILE *infile = _tfopen(infilename, _T("rb")); //r = read, b = binary + //gzFile outfile = gzopen(outfilename, WriteType); //a = append (or w=write), b = binary, 9 = max compression + gzFile outfile = t_gzopen(outfilename, WriteType); + //Check handles - HandleCheck() automatically closes handles if invalid - if (HandleCheck(infile, outfile, rdPtr)) {Terminate();} + if (HandleCheck(infile, outfile, rdPtr)) {Terminate();} - //Declare variables - unsigned long PreviousOutputSize = 0; // For calculation purposes - signed int num_read = 0; - unsigned long total_read = 0; - ThreadSafe_Start(); - unsigned short tempinbuffersize = rdPtr -> inbuffersize; - ThreadSafe_End(); + //Declare variables + unsigned long PreviousOutputSize = 0; //For calculation purposes + signed int num_read = 0; + unsigned long total_read = 0; + ThreadSafe_Start(); + unsigned short tempinbuffersize = rdPtr -> inbuffersize; + ThreadSafe_End(); //If using Write, output size should not be included in the calculation later. Otherwise: - if (UseAppend) PreviousOutputSize = file_size(outfilename); - - //This makes sure that the buffer is the right size - if too large, set buffer smaller - if ( file_size(infilename) < tempinbuffersize) - tempinbuffersize = (unsigned short)file_size(infilename); - - //Then declare final variable, the buffer - char *inbuffer = new char[tempinbuffersize]; - - //Iteration through the files - while ((num_read = fread(inbuffer, 1, tempinbuffersize, infile)) > 0) - { - total_read += num_read; - gzwrite(outfile, inbuffer, num_read); - } - - //Close thread - fclose(infile); - gzclose(outfile); - delete[] inbuffer, infilename, outfilename; + if (UseAppend) PreviousOutputSize = file_size(outfilename); + + //This makes sure that the buffer is the right size - if too large, set buffer smaller + if ( file_size(infilename) < tempinbuffersize) + tempinbuffersize = (unsigned short)file_size(infilename); + + //Then declare final variable, the buffer + char *inbuffer = new char[tempinbuffersize]; + + //Iteration through the files + while ((num_read = fread(inbuffer, 1, tempinbuffersize, infile)) > 0) + { + total_read += num_read; + gzwrite(outfile, inbuffer, num_read); + } + + //Close thread + fclose(infile); + gzclose(outfile); + delete[] inbuffer, infilename, outfilename; + //delete[] inbuffer; + //delete[] infilename; + //delete[] outfilename; //Set variables afnter completion - ThreadSafe_Start(); + ThreadSafe_Start(); unsigned long saveoutfilesize = file_size(outfilename); unsigned long saveinfilesize = file_size(infilename); - rdPtr -> PercentageDifference = ((file_size(outfilename)-PreviousOutputSize)*(1.0/file_size(infilename)))*100.0; - - stringstream temp; - temp <<"Buffer used: " - << tempinbuffersize - <<", total bytes read: " - << file_size(infilename) - <<", total bytes written: " - << file_size(outfilename)-PreviousOutputSize - <<", compression rate: " - << rdPtr -> PercentageDifference - <<"%."; - rdPtr -> returnstring = temp.str(); - temp.flush(); - rdPtr -> LastOutput = outfilename; - rdPtr -> rRd -> PushEvent(0); - ThreadSafe_End(); - return 0; + rdPtr -> PercentageDifference = ((file_size(outfilename)-PreviousOutputSize)*(1.0/file_size(infilename)))*100.0; + + tstringstream temp; + temp << _T("Buffer used: ") + << tempinbuffersize + << _T(", total bytes read: ") + << file_size(infilename) + << _T(", total bytes written: ") + << file_size(outfilename)-PreviousOutputSize + << _T(", compression rate: ") + << rdPtr -> PercentageDifference + << _T("%."); + rdPtr -> returnstring = temp.str(); + temp.flush(); + //temp.str(_T("")); + //temp.clear(); + rdPtr -> LastOutput = outfilename; + rdPtr -> rRd -> PushEvent(0); + ThreadSafe_End(); + return 0; } //Decompress a file DWORD WINAPI decompress_one_file(Params *pDataArray) -{ - //Open struct and set variables - char *infilename = new char [MAX_PATH]; // Get input file name - strcpy_s(infilename, MAX_PATH, pDataArray -> para_infilename); - char *outfilename = new char [MAX_PATH]; // Get output file name - strcpy_s(outfilename, MAX_PATH, pDataArray -> para_outfilename); - bool UseAppend = pDataArray -> para_UseAppend; // Get whether to append or write - LPRDATA rdPtr = pDataArray -> para_rdPtr; //Get rdPtr - delete pDataArray; // Container is expendable - - char * WriteType = "wb"; //User is using write (overwriting) - if (UseAppend) WriteType = "ab"; // User is using append - - if (FileSizeCheck(infilename, rdPtr)) {Terminate();} - //Open handles to both files - gzFile infile = gzopen(infilename, "rb"); // r = read, b = binary - FILE *outfile = fopen(outfilename, WriteType); // a = append or w = write, b = binary - - if (HandleCheck(outfile, infile, rdPtr)) {Terminate();} - //Declare variables - unsigned long PreviousOutputSize = 0; // For calculation purposes - int num_read = 0; - unsigned long total_read = 0; - ThreadSafe_Start(); - unsigned short tempinbuffersize = rdPtr -> inbuffersize; - ThreadSafe_End(); - +{ + //Open struct and set variables + TCHAR *infilename = new TCHAR [MAX_PATH]; //Get input file name + _tcscpy_s(infilename, MAX_PATH, pDataArray -> para_infilename); + TCHAR *outfilename = new TCHAR [MAX_PATH]; //Get output file name + _tcscpy_s(outfilename, MAX_PATH, pDataArray -> para_outfilename); + bool UseAppend = pDataArray -> para_UseAppend; //Get whether to append or write + LPRDATA rdPtr = pDataArray -> para_rdPtr; //Get rdPtr + delete pDataArray; //Container is expendable + + TCHAR * WriteType = _T("wb"); //User is using write (overwriting) + if (UseAppend) WriteType = _T("ab"); //User is using append + + if (FileSizeCheck(infilename, rdPtr)) {Terminate();} + //Open handles to both files + //gzFile infile = gzopen(infilename, "rb"); //r = read, b = binary + + gzFile infile = t_gzopen(infilename, "rb"); + + FILE *outfile = _tfopen(outfilename, WriteType); //a = append or w = write, b = binary + + if (HandleCheck(outfile, infile, rdPtr)) {Terminate();} + //Declare variables + unsigned long PreviousOutputSize = 0; //For calculation purposes + int num_read = 0; + unsigned long total_read = 0; + ThreadSafe_Start(); + unsigned short tempinbuffersize = rdPtr -> inbuffersize; + ThreadSafe_End(); + //If using Write, output size should not be included in the calculation later. Otherwise: - if (UseAppend) PreviousOutputSize = file_size(outfilename); - + if (UseAppend) PreviousOutputSize = file_size(outfilename); + //This makes sure that the buffer is the right size - if too large, set buffer smaller - if ( file_size(infilename) < tempinbuffersize) - tempinbuffersize = (unsigned short)file_size(infilename); - - //Then declare final variable, the buffer - char *inbuffer = new char[tempinbuffersize]; - - //Iteration through the files - while ((num_read = gzread(infile, inbuffer, tempinbuffersize)) > 0) - { - total_read += num_read; - fwrite(inbuffer, 1, num_read, outfile); - } - - //Close thread - gzclose(infile); - fclose(outfile); - delete[] inbuffer, infilename, outfilename; - - //Set variables after completion - ThreadSafe_Start(); - rdPtr -> PercentageDifference = ((file_size(outfilename)-PreviousOutputSize)*(1.0/file_size(infilename)))*100.0; - stringstream temp; - temp <<"Buffer used: " - << tempinbuffersize - <<", total bytes read: " - << file_size(infilename) - <<", total bytes written: " - << file_size(outfilename)-PreviousOutputSize - <<", decompression rate: " - << rdPtr -> PercentageDifference - <<"%."; - rdPtr -> returnstring = temp.str(); - temp.flush(); - rdPtr -> LastOutput = outfilename; - rdPtr -> rRd -> CallEvent(0); - ThreadSafe_End(); - return 0; + if ( file_size(infilename) < tempinbuffersize) + tempinbuffersize = (unsigned short)file_size(infilename); + + //Then declare final variable, the buffer + TCHAR *inbuffer = new TCHAR[tempinbuffersize]; + + //Iteration through the files + while ((num_read = gzread(infile, inbuffer, tempinbuffersize)) > 0) + { + total_read += num_read; + fwrite(inbuffer, 1, num_read, outfile); + } + + //Close thread + gzclose(infile); + fclose(outfile); + delete[] inbuffer, infilename, outfilename; + //delete[] inbuffer; + //delete[] infilename; + //delete[] outfilename; + + //Set variables after completion + ThreadSafe_Start(); + rdPtr -> PercentageDifference = ((file_size(outfilename)-PreviousOutputSize)*(1.0/file_size(infilename)))*100.0; + tstringstream temp; + temp <<_T("Buffer used: ") + << tempinbuffersize + << _T(", total bytes read: ") + << file_size(infilename) + << _T(", total bytes written: ") + << file_size(outfilename)-PreviousOutputSize + << _T(", decompression rate: ") + << rdPtr -> PercentageDifference + << _T("%."); + rdPtr -> returnstring = temp.str(); + temp.flush(); + //temp.str(_T("")); + //temp.clear(); + rdPtr -> LastOutput = outfilename; + rdPtr -> rRd -> CallEvent(0); + ThreadSafe_End(); + return 0; } // ============================================================================ // // CONDITIONS -// +// // ============================================================================ CONDITION( - /* ID */ 0, - /* Name */ "%o: On success", - /* Flags */ 0, - /* Params */ (0) + /* ID */ 0, + /* Name */ "%o: On success", + /* Flags */ 0, + /* Params */ (0) ) { - return true; + return true; } CONDITION( - /* ID */ 1, - /* Name */ "%o: On error", - /* Flags */ 0, - /* Params */ (0) + /* ID */ 1, + /* Name */ "%o: On error", + /* Flags */ 0, + /* Params */ (0) ) { - return true; + return true; } // ============================================================================ // // ACTIONS -// +// // ============================================================================ -ACTION( // Old compress function - /* ID */ 0, - /* Name */ "<> Compress a file (%0) --> (%1)", - /* Flags */ 0, - /* Params */ (2, PARAM_STRING, "Input file:", PARAM_STRING, "Output file:") +ACTION( //Old compress function + /* ID */ 0, + /* Name */ "<> Compress a file (%0) --> (%1)", + /* Flags */ 0, + /* Params */ (2, PARAM_STRING, _T("Input file:"), PARAM_STRING, _T("Output file:")) ) { //Old version of compress action: Notify user - MessageBoxA(NULL, "Sorry to interrupt your programming, but you have\nan old \"Compress file\" action in ZlibStream which needs replacing.\nClick the ZlibStream icon in your event editor to see all the events\nZlibStream is in.", "Darkwire Software - Old Event Notice", MB_OK); + MessageBox(NULL, _T("Sorry to interrupt your programming, but you have\nan old \"Compress file\" action in ZlibStream which needs replacing.\nClick the ZlibStream icon in your event editor to see all the events\nZlibStream is in."), _T("Darkwire Software - Old Event Notice"), MB_OK); } -ACTION( // Old decompress function - /* ID */ 1, - /* Name */ "<> Decompress a file (%0) --> (%1)", - /* Flags */ 0, - /* Params */ (2, PARAM_STRING, "Input file:", PARAM_STRING, "Output file:") +ACTION( //Old decompress function + /* ID */ 1, + /* Name */ "<> Decompress a file (%0) --> (%1)", + /* Flags */ 0, + /* Params */ (2, PARAM_STRING, _T("Input file:"), PARAM_STRING, _T("Output file:")) ) { - //Old version of decompress action: Notify user - MessageBoxA(NULL, "Sorry to interrupt your programming, but you have\nan old \"Decompress file\" action in ZlibStream which needs replacing.\nClick the ZlibStream icon in your event editor to see all the events\nZlibStream is in.", "Darkwire Software - Old Event Notice", MB_OK); + //Old version of decompress action: Notify user + MessageBox(NULL, _T("Sorry to interrupt your programming, but you have\nan old \"Decompress file\" action in ZlibStream which needs replacing.\nClick the ZlibStream icon in your event editor to see all the events\nZlibStream is in."), _T("Darkwire Software - Old Event Notice"), MB_OK); } ACTION( - /* ID */ 2, - /* Name */ "Set buffer size to %0 bytes", - /* Flags */ 0, - /* Params */ (1, PARAM_NUMBER, "Buffer size (1 to 16384 bytes):") + /* ID */ 2, + /* Name */ "Set buffer size to %0 bytes", + /* Flags */ 0, + /* Params */ (1, PARAM_NUMBER, _T("Buffer size (1 to 16384 bytes):")) ) { - int p1 = Param(TYPE_INT); - ThreadSafe_Start(); - if (p1 > 0 && p1 < 16385) - rdPtr -> inbuffersize = p1; - else - { - rdPtr -> returnstring = "Buffer is an invalid size. Must be between 0 and 16385 (exclusive)."; - rdPtr -> rRd -> CallEvent(1); - } - ThreadSafe_End(); + int p1 = Param(TYPE_INT); + ThreadSafe_Start(); + if (p1 > 0 && p1 < 16385) + rdPtr -> inbuffersize = p1; + else + { + rdPtr -> returnstring = _T("Buffer is an invalid size. Must be between 0 and 16385 (exclusive)."); + rdPtr -> rRd -> CallEvent(1); + } + ThreadSafe_End(); } ACTION( - /* ID */ 3, - /* Name */ "Compress a file (%0) --> (%1), append = %2", - /* Flags */ 0, - /* Params */ (3, PARAM_STRING, "Input file:", PARAM_STRING, "Output file:", PARAM_NUMBER, "Append if output file already exists? (0 for overwriting, 1 for adding to end)") + /* ID */ 3, + /* Name */ "Compress a file (%0) --> (%1), append = %2", + /* Flags */ 0, + /* Params */ (3, PARAM_STRING, _T("Input file:"), PARAM_STRING, _T("Output file:"), PARAM_NUMBER, _T("Append if output file already exists? (0 for overwriting, 1 for adding to end)")) ) { - //Retrieve variables from parameters - char *p1 = (char *) Param(TYPE_STRING); - char *p2 = (char *) Param(TYPE_STRING); - int p3 = Param(TYPE_INT); - + //Retrieve variables from parameters + TCHAR *p1 = (TCHAR *) Param(TYPE_STRING); + TCHAR *p2 = (TCHAR *) Param(TYPE_STRING); + int p3 = Param(TYPE_INT); + //Set bool for simplicity bool temp = false; if (p3 != 0) temp = true; - //Declare struct and set variables in struct - Params* Parameters = new Params; // Declaration - strcpy_s(Parameters -> para_infilename, MAX_PATH, p1); // Pass the input file name - strcpy_s(Parameters -> para_outfilename, MAX_PATH, p2); // Pass the output file name - Parameters -> para_UseAppend = temp; // Pass the append command - Parameters -> para_rdPtr = rdPtr; // Pass rdPtr - + //Declare struct and set variables in struct + Params* Parameters = new Params; //Declaration + _tcscpy_s(Parameters -> para_infilename, MAX_PATH, p1); //Pass the input file name + _tcscpy_s(Parameters -> para_outfilename, MAX_PATH, p2); //Pass the output file name + Parameters -> para_UseAppend = temp; //Pass the append command + Parameters -> para_rdPtr = rdPtr; //Pass rdPtr + //Create thread - CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&compress_one_file, Parameters, 0, NULL); + CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&compress_one_file, Parameters, 0, NULL); } ACTION( - /* ID */ 4, - /* Name */ "Decompress a file (%0) --> (%1), append = %2", - /* Flags */ 0, - /* Params */ (3, PARAM_STRING, "Input file:", PARAM_STRING, "Output file:", PARAM_NUMBER, "Append if output file already exists? (0 for overwriting, 1 for adding to end)") + /* ID */ 4, + /* Name */ "Decompress a file (%0) --> (%1), append = %2", + /* Flags */ 0, + /* Params */ (3, PARAM_STRING, _T("Input file:"), PARAM_STRING, _T("Output file:"), PARAM_NUMBER, _T("Append if output file already exists? (0 for overwriting, 1 for adding to end)")) ) { - //Retrieve variables from parameters - char *p1 = (char *) Param(TYPE_STRING); - char *p2 = (char *) Param(TYPE_STRING); - int p3 = Param(TYPE_INT); - + //Retrieve variables from parameters + TCHAR *p1 = (TCHAR *) Param(TYPE_STRING); + TCHAR *p2 = (TCHAR *) Param(TYPE_STRING); + int p3 = Param(TYPE_INT); + //Set bool for simplicity bool temp = false; if (p3 != 0) temp = true; - //Declare struct and set variables in struct - Params* Parameters = new Params; // Declaration - strcpy_s(Parameters -> para_infilename, MAX_PATH, p1); // Pass the input file name - strcpy_s(Parameters -> para_outfilename, MAX_PATH, p2); // Pass the output file name - Parameters -> para_UseAppend = temp; // Pass the append command - Parameters -> para_rdPtr = rdPtr; // Pass rdPtr - - //Create thread - CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&decompress_one_file, Parameters, 0, NULL); + //Declare struct and set variables in struct + Params* Parameters = new Params; //Declaration + _tcscpy_s(Parameters -> para_infilename, MAX_PATH, p1); //Pass the input file name + _tcscpy_s(Parameters -> para_outfilename, MAX_PATH, p2); //Pass the output file name + Parameters -> para_UseAppend = temp; //Pass the append command + Parameters -> para_rdPtr = rdPtr; //Pass rdPtr + + //Create thread + CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&decompress_one_file, Parameters, 0, NULL); } // ============================================================================ // // EXPRESSIONS -// +// // ============================================================================ EXPRESSION( - /* ID */ 0, - /* Name */ "ReturnedCode(", - /* Flags */ 0, - /* Params */ (0) + /* ID */ 0, + /* Name */ "ReturnedCode(", + /* Flags */ 0, + /* Params */ (0) ) { - //Deprecated variable: Notify user - MessageBoxA(NULL, "Sorry to interrupt your programming, but you have\nan old \"ReturnedCode()\" expression from ZlibStream which is removed.\nClick the ZlibStream icon in your event editor to see all the events\nZlibStream is in.", "Darkwire Software - Old Expression Notice", MB_OK); + //Deprecated variable: Notify user + MessageBox(NULL, _T("Sorry to interrupt your programming, but you have\nan old \"ReturnedCode()\" expression from ZlibStream which is removed.\nClick the ZlibStream icon in your event editor to see all the events\nZlibStream is in."), _T("Darkwire Software - Old Expression Notice"), MB_OK); return false; } EXPRESSION( - /* ID */ 1, - /* Name */ "ReturnedString$(", - /* Flags */ EXPFLAG_STRING, - /* Params */ (0) + /* ID */ 1, + /* Name */ "ReturnedString$(", + /* Flags */ EXPFLAG_STRING, + /* Params */ (0) ) { - ThreadSafe_Start(); - string temp = rdPtr -> returnstring; - ThreadSafe_End(); - ReturnStringSafe(temp.c_str()); + ThreadSafe_Start(); + tstring temp = rdPtr -> returnstring; + ThreadSafe_End(); + ReturnStringSafe(temp.c_str()); } EXPRESSION( - /* ID */ 2, - /* Name */ "BufferSize(", - /* Flags */ 0, - /* Params */ (0) + /* ID */ 2, + /* Name */ "BufferSize(", + /* Flags */ 0, + /* Params */ (0) ) { - ThreadSafe_Start(); - unsigned short temp = rdPtr -> inbuffersize; - ThreadSafe_End(); - return temp; + ThreadSafe_Start(); + unsigned short temp = rdPtr -> inbuffersize; + ThreadSafe_End(); + return temp; } EXPRESSION( - /* ID */ 3, - /* Name */ "Percentage(", - /* Flags */ EXPFLAG_DOUBLE, - /* Params */ (0) + /* ID */ 3, + /* Name */ "Percentage(", + /* Flags */ EXPFLAG_DOUBLE, + /* Params */ (0) ) { ThreadSafe_Start(); double temp = rdPtr -> PercentageDifference; - ThreadSafe_End(); + ThreadSafe_End(); //This casts to 2 decimal places - char sprintfdest[20]; - sprintf(sprintfdest,"%.2f", temp); - float temp2 = (float)atof(sprintfdest); + TCHAR sprintfdest[20]; + _stprintf(sprintfdest,_T("%.2f"), temp); + float temp2 = (float)_tstof(sprintfdest); //Voila - ReturnFloat(temp2); + ReturnFloat(temp2); } EXPRESSION( - /* ID */ 4, - /* Name */ "LastOutputFile$(", - /* Flags */ EXPFLAG_STRING, - /* Params */ (0) + /* ID */ 4, + /* Name */ "LastOutputFile$(", + /* Flags */ EXPFLAG_STRING, + /* Params */ (0) ) { - ThreadSafe_Start(); - string temp = rdPtr -> LastOutput; - ThreadSafe_End(); - ReturnStringSafe(temp.c_str()); + ThreadSafe_Start(); + tstring temp = rdPtr -> LastOutput; + ThreadSafe_End(); + ReturnStringSafe(temp.c_str()); } \ No newline at end of file diff --git a/rSDK/ZlibStream/Runtime.cpp b/rSDK/ZlibStream/Runtime.cpp index 97fe6a47..38983111 100644 --- a/rSDK/ZlibStream/Runtime.cpp +++ b/rSDK/ZlibStream/Runtime.cpp @@ -1,7 +1,7 @@ // ============================================================================ // // This file contains routines that are handled during the Runtime -// +// // ============================================================================ // Common Include @@ -10,7 +10,7 @@ // GetRunObjectDataSize // -------------------- // Returns the size of the runtime datazone of the object -// +// short WINAPI DLLExport GetRunObjectDataSize(fprh rhPtr, LPEDATA edPtr) { @@ -22,19 +22,19 @@ short WINAPI DLLExport GetRunObjectDataSize(fprh rhPtr, LPEDATA edPtr) // CreateRunObject // --------------- // The routine where the object is actually created -// +// short WINAPI DLLExport CreateRunObject(LPRDATA rdPtr, LPEDATA edPtr, fpcob cobPtr) { // Do some rSDK stuff - new (rdPtr) RUNDATA; // Call rdPtr's Constructor + new (rdPtr) RUNDATA; //Call rdPtr's Constructor #include "rCreateRunObject.h" /* - This routine runs when your object is created, as you might have guessed. - It is here that you must transfer any data you need in rdPtr from edPtr, - because after this has finished you cannot access it again! - Also, if you have anything to initialise (e.g. dynamic arrays, surface objects) - you should do it here, and free your resources in DestroyRunObject. - See Graphic_Object_Ex.txt for an example of what you may put here. + This routine runs when your object is created, as you might have guessed. + It is here that you must transfer any data you need in rdPtr from edPtr, + because after this has finished you cannot access it again! + Also, if you have anything to initialise (e.g. dynamic arrays, surface objects) + you should do it here, and free your resources in DestroyRunObject. + See Graphic_Object_Ex.txt for an example of what you may put here. */ // No errors @@ -46,13 +46,13 @@ short WINAPI DLLExport CreateRunObject(LPRDATA rdPtr, LPEDATA edPtr, fpcob cobPt // DestroyRunObject // ---------------- // Destroys the run-time object -// +// short WINAPI DLLExport DestroyRunObject(LPRDATA rdPtr, long fast) { /* - When your object is destroyed (either with a Destroy action or at the end of - the frame) this routine is called. You must free any resources you have allocated! - See Graphic_Object_Ex.txt for an example of what you may put here. + When your object is destroyed (either with a Destroy action or at the end of + the frame) this routine is called. You must free any resources you have allocated! + See Graphic_Object_Ex.txt for an example of what you may put here. */ // No errors delete rdPtr->rRd; @@ -63,34 +63,34 @@ short WINAPI DLLExport DestroyRunObject(LPRDATA rdPtr, long fast) // HandleRunObject // ---------------- // Called (if you want) each loop, this routine makes the object live -// +// short WINAPI DLLExport HandleRunObject(LPRDATA rdPtr) { - //Needs to add fixed value to vector array + //Needs to add fixed value to vector array /* - If your extension will draw to the MMF window you should first - check if anything about its display has changed : + If your extension will draw to the MMF window you should first + check if anything about its display has changed : - return rdPtr->roc.rcChanged?REFLAG_DISPLAY:0; + return rdPtr->roc.rcChanged?REFLAG_DISPLAY:0; - You will also need to make sure you change this flag yourself - to 1 whenever you want to redraw your object - - If your extension won't draw to the window, but it still needs - to do something every MMF loop use : + You will also need to make sure you change this flag yourself + to 1 whenever you want to redraw your object + + If your extension won't draw to the window, but it still needs + to do something every MMF loop use : return 0; - If you don't need to do something every loop, use : + If you don't need to do something every loop, use : return REFLAG_ONESHOT; - This doesn't mean this function can never run again. If you want MMF - to handle your object again (causing this code to run) use this function: + This doesn't mean this function can never run again. If you want MMF + to handle your object again (causing this code to run) use this function: rdPtr->rRd->Rehandle(); - At the end of the loop this code will run + At the end of the loop this code will run */ return 0; } @@ -99,12 +99,12 @@ short WINAPI DLLExport HandleRunObject(LPRDATA rdPtr) // DisplayRunObject // ---------------- // Draw the object in the application screen. -// +// short WINAPI DLLExport DisplayRunObject(LPRDATA rdPtr) { /* - If you return REFLAG_DISPLAY in HandleRunObject this routine will run. - See Graphic_Object_Ex.txt for an example of what you may put here. + If you return REFLAG_DISPLAY in HandleRunObject this routine will run. + See Graphic_Object_Ex.txt for an example of what you may put here. */ // Ok return 0; @@ -118,7 +118,7 @@ short WINAPI DLLExport DisplayRunObject(LPRDATA rdPtr) // in DisplayRunObject too, but this is automatically done if you implement // GetRunObjectSurface (MMF applies the ink effect to the transition). // -// Note: do not forget to enable the function in the .def file +// Note: do not forget to enable the function in the .def file // if you remove the comments below. /* cSurface* WINAPI DLLExport GetRunObjectSurface(LPRDATA rdPtr) @@ -135,7 +135,7 @@ cSurface* WINAPI DLLExport GetRunObjectSurface(LPRDATA rdPtr) // // Should return NULL if the object is not transparent. // -// Note: do not forget to enable the function in the .def file +// Note: do not forget to enable the function in the .def file // if you remove the comments below. // /* @@ -179,7 +179,7 @@ cSurface* WINAPI DLLExport GetRunObjectCollisionMask(LPRDATA rdPtr, LPARAM lPara // PauseRunObject // ---------------- // Enters the pause mode -// +// short WINAPI DLLExport PauseRunObject(LPRDATA rdPtr) { // Ok @@ -202,7 +202,7 @@ short WINAPI DLLExport ContinueRunObject(LPRDATA rdPtr) // ============================================================================ // // START APP / END APP / START FRAME / END FRAME routines -// +// // ============================================================================ // ------------------- @@ -210,7 +210,7 @@ short WINAPI DLLExport ContinueRunObject(LPRDATA rdPtr) // ------------------- // Called when the application starts or restarts. // Useful for storing global data -// +// void WINAPI DLLExport StartApp(mv _far *mV, CRunApp* pApp) { // Example @@ -228,7 +228,7 @@ void WINAPI DLLExport StartApp(mv _far *mV, CRunApp* pApp) // EndApp // ------------------- // Called when the application ends. -// +// void WINAPI DLLExport EndApp(mv _far *mV, CRunApp* pApp) { // Example @@ -246,7 +246,7 @@ void WINAPI DLLExport EndApp(mv _far *mV, CRunApp* pApp) // StartFrame // ------------------- // Called when the frame starts or restarts. -// +// void WINAPI DLLExport StartFrame(mv _far *mV, DWORD dwReserved, int nFrameIndex) { @@ -256,7 +256,7 @@ void WINAPI DLLExport StartFrame(mv _far *mV, DWORD dwReserved, int nFrameIndex) // EndFrame // ------------------- // Called when the frame ends. -// +// void WINAPI DLLExport EndFrame(mv _far *mV, DWORD dwReserved, int nFrameIndex) { @@ -265,17 +265,17 @@ void WINAPI DLLExport EndFrame(mv _far *mV, DWORD dwReserved, int nFrameIndex) // ============================================================================ // // TEXT ROUTINES (if OEFLAG_TEXT) -// +// // ============================================================================ // ------------------- // GetRunObjectFont // ------------------- // Return the font used by the object. -// +// /* - // Note: do not forget to enable the functions in the .def file + // Note: do not forget to enable the functions in the .def file // if you remove the comments below. void WINAPI GetRunObjectFont(LPRDATA rdPtr, LOGFONT* pLf) @@ -289,7 +289,7 @@ void WINAPI GetRunObjectFont(LPRDATA rdPtr, LOGFONT* pLf) // SetRunObjectFont // ------------------- // Change the font used by the object. -// +// void WINAPI SetRunObjectFont(LPRDATA rdPtr, LOGFONT* pLf, RECT* pRc) { // Example @@ -309,7 +309,7 @@ void WINAPI SetRunObjectFont(LPRDATA rdPtr, LOGFONT* pLf, RECT* pRc) // GetRunObjectTextColor // --------------------- // Return the text color of the object. -// +// COLORREF WINAPI GetRunObjectTextColor(LPRDATA rdPtr) { // Example @@ -321,7 +321,7 @@ COLORREF WINAPI GetRunObjectTextColor(LPRDATA rdPtr) // SetRunObjectTextColor // --------------------- // Change the text color of the object. -// +// void WINAPI SetRunObjectTextColor(LPRDATA rdPtr, COLORREF rgb) { // Example @@ -335,7 +335,7 @@ void WINAPI SetRunObjectTextColor(LPRDATA rdPtr, COLORREF rgb) // ============================================================================ // // DEBUGGER ROUTINES -// +// // ============================================================================ // ----------------- @@ -357,14 +357,14 @@ LPWORD WINAPI DLLExport GetDebugTree(LPRDATA rdPtr) // ----------------- // This routine returns the text of a given item. // -void WINAPI DLLExport GetDebugItem(LPSTR pBuffer, LPRDATA rdPtr, int id) +void WINAPI DLLExport GetDebugItem(LPTSTR pBuffer, LPRDATA rdPtr, int id) { #if !defined(RUN_ONLY) // Example // ------- /* - char temp[DB_BUFFERSIZE]; + TCHAR temp[DB_BUFFERSIZE]; switch (id) { @@ -410,16 +410,16 @@ void WINAPI DLLExport EditDebugItem(LPRDATA rdPtr, int id) case DB_CURRENTSTRING: { EditDebugInfo dbi; - char buffer[256]; + TCHAR buffer[256]; dbi.pText=buffer; dbi.lText=TEXT_MAX; dbi.pTitle=NULL; - strcpy(buffer, rdPtr->text); + _tcscpy(buffer, rdPtr->text); long ret=callRunTimeFunction(rdPtr, RFUNCTION_EDITTEXT, 0, (LPARAM)&dbi); if (ret) - strcpy(rdPtr->text, dbi.pText); + _tcscpy(rdPtr->text, dbi.pText); } break; case DB_CURRENTVALUE: diff --git a/rSDK/ZlibStream/UpgradeLog.htm b/rSDK/ZlibStream/UpgradeLog.htm new file mode 100644 index 0000000000000000000000000000000000000000..3f20e7509a787128c56e5294a7efbb9d14834ce0 GIT binary patch literal 31898 zcmeI5`%@H4mVoQm-H81kdUWUNT?ct7qIbL#JQaBef_QbjF@e10A<{gZnf=pu_xmzQ ztE*|MsTOc2!szI(s;tbDC(k=iW>x?1|NJ@oLpGYd%to?>>}@uijb*iLBRj};vhD2G z>_4)9&#ckKrTrR*qM%~m*H%l5NR)T(8NoNZ@Mv%6UjpWf_2_A~W9aQ6^6PqNKy zm*Xn6cKJP^h0r4G8qia3wd^GHx=TM#IIDAA50Gz#K6WXsXUo)I22DzNE?t{dRw)!7l-)4WR6Ufz)~m%mYT&1!V^+;k1yQ zf_Wn@2jG7IMOW$NZyY}{{t39Bk4Wy?^JW;|E3Wo9+ox3zeJ7sPXkYwH(_)=^OVo^Q zYguD!<*3*~&Uc5}5hHn2=lV3@_batqwP}WtuDi4UqQx+{t^h$vO_2V?)mj)sjWVU6 z##e4{g0ELA++BvsN`>V$V0BmOU0Ju^Dj5I0QtdR(4^VhH+X}Q+zjo>O2^inb#zjS#66Y+9WMT7hmsf(pP8W-viPLAMMq8z_O=9NMgSa3?Vt% zs&M`p_*X@mqWnLH0**mC^wMup3$$s;cFW~lAH-K&Ey*oJRV~<{&nh@~rUB=<)C+z0 zu%psB9`llP)|o`)@~cJs0`=r(ALHDEQk}tUrNPl>HR|3Ny`*oa{mA1e3thn*AAoc8 zjI}TVDRvuA)_eBt<61Ae%~)3$T{R1wEL5`<>4Pi1SSF91jpSRkDPfj#^B7L*uZ%q8 z=q{t)4>o7JB92#~sgdrD{_4D@-XcPazWE5uSF_^~326C@#Xd0(J)1hMjxTc^y>Ok9 z>U!LF1A3fuqfxhdv%zoBtsLgnaX3j&E4%aXtKF$(`T6&e@~e=<{vbc)l2|9|_;BWJ z8|6%I?LFi38vaDd+e0EhWgpKZQav*Y(BoH^$^ILa$*Y&2TsDjHuH1C$ORmZ?Ubk#t z#^)U%D>0H28zXZg$7;INsSY@si{4ks-R9%WFV3Ev+Zr2f1&KDERep0XS6!BuZa|WA z{Pb_P@xc99);>J_*bULtNd5z~lUjKkn*33<*y7+Ttm}_2oy+BMQyuMe#??3{s2u$_-f87>OHWF9)e;mJR1wdmVDFJ#|y08IRSdo22@DfY#eY5s4LcfDG%jdp#C{LEjynf7* z8V$vEmc=YvjX2)?qgT#9Q{K3GG;}}U8)-RpM#<~<80X`oZ_RaHES+P>e*BDfs9}jG zT_K-yb>5=7^ta;H6C^lE!1v%>r;%;4g%@*f9IN8zF`v$CxF!~3CM|^)#k$eL2*Z3p zwK>84FbY@C8pmXQ`}$=t(XH95(6ZzR(BafP*r%;Cv z;f(o2?`;LRhxqb*PVDM$jDj2Ic5#Lz7FDx4_nYvRlS_Xdw2hI!$-;S+B5Q5mF;}NS1`;0|Ib78O-fpsh#lCNvqj5yl_}MA#hk~WA zvGN}+og=SGz58EV&m)V=d}6#YhMo%5+{#MWN08T?;GWr$vN~@9$9KbQWWBWJ775i4O~6zbRM4|>Ra;F(Hv$qolJV(D!T51UhXV%w}LCM&OwW1 z)nu@|FLyAx=91P#p9DF%**L8zpJoc8)W^L@xvXB74qU%H#&~oFS{of}%SSnnYwJcB z>Y_PQ?-rw+onQlF9P%O5`h-;9r`80uQ&uIPpTz7)^n>p9ale;-SGZDAjf`vH=1-k} zB+r{_8B;aVd^31!_wCg}Tk|IFYSf<8Sj7-?af;_!kGOLz!HeshE5Qck7+c2?n`w#r zZmQb1B-fF)e?>?9{06*jM!X1Qb5HJulB!xZkM6VdP8a*(V&4Po$t>EtiLWDma)AxK zO>1{(X=QFhgYy~oF7D~YrJMYY`#|rW;j=_pe!m-ScURRf0h06(r#}ICo^vCsnE#ft zx7k1XOUM`+ZQag(2X?2FyDq#pq5d#?GF~ASJ=rAt)ZEK9boQBHRIic9F@D$2%7(w* z9m?jIvktM_Hq~FlZg&$GZhS2nfy={i<_*W`vr<ON& z^JDa|2yPE({h7#m0f~9dcZA

|=UP6xmCpwNAh9vKO=(rYHC2ZGzQX%11)q%RqjN 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

|=UP6xmCpwNAh9vKO=(rYHC2ZGzQX%11)q%RqjN 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 Date: Tue, 23 Jun 2026 01:54:24 -0700 Subject: [PATCH 13/17] Add VOLINFO Unicode --- MMF2SDK/VOLINFO/Ext.rc | 214 ----- MMF2SDK/VOLINFO/VOLINFO.vcxproj | 103 --- MMF2SDK_Unicode/VOLINFO/.gitattributes | 22 + MMF2SDK_Unicode/VOLINFO/.gitignore | 163 ++++ {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/Common.h | 16 +- .../VOLINFO/Edittime.cpp | 113 +-- {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/Ext.def | 0 MMF2SDK_Unicode/VOLINFO/Ext.rc | 215 +++++ .../VOLINFO/General.cpp | 63 +- MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.sln | 40 + .../VOLINFO/MMF2SDK - VOLINFO.vcproj | 807 ++++++++++++++++++ .../VOLINFO/MMF2SDK - VOLINFO.vcxproj | 678 +++++++++++++++ .../VOLINFO/MMF2SDK - VOLINFO.vcxproj.filters | 12 +- {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/Main.cpp | 22 +- {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/Main.h | 20 +- .../VOLINFO/Resource.h | 20 +- .../VOLINFO/Runtime.cpp | 100 +-- .../VOLINFO/VOLINFO Example.mfa | Bin .../VOLINFO/res/EXTICON.BMP | Bin .../VOLINFO/res/EXTIMG.BMP | Bin 20 files changed, 2117 insertions(+), 491 deletions(-) delete mode 100644 MMF2SDK/VOLINFO/Ext.rc delete mode 100644 MMF2SDK/VOLINFO/VOLINFO.vcxproj create mode 100644 MMF2SDK_Unicode/VOLINFO/.gitattributes create mode 100644 MMF2SDK_Unicode/VOLINFO/.gitignore rename {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/Common.h (87%) rename {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/Edittime.cpp (95%) rename {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/Ext.def (100%) create mode 100644 MMF2SDK_Unicode/VOLINFO/Ext.rc rename {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/General.cpp (90%) create mode 100644 MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.sln create mode 100644 MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcproj create mode 100644 MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcxproj rename MMF2SDK/VOLINFO/VOLINFO.vcxproj.filters => MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcxproj.filters (98%) rename {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/Main.cpp (88%) rename {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/Main.h (86%) rename {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/Resource.h (78%) rename {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/Runtime.cpp (86%) rename {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/VOLINFO Example.mfa (100%) rename {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/res/EXTICON.BMP (100%) rename {MMF2SDK => MMF2SDK_Unicode}/VOLINFO/res/EXTIMG.BMP (100%) diff --git a/MMF2SDK/VOLINFO/Ext.rc b/MMF2SDK/VOLINFO/Ext.rc deleted file mode 100644 index 99921718..00000000 --- a/MMF2SDK/VOLINFO/Ext.rc +++ /dev/null @@ -1,214 +0,0 @@ -//Microsoft Developer Studio generated resource script. -// -#include "resource.h" - -// Wraps str into double-quotes, like "str". This function cannot be defined via /D. -#define sub_asStr(str) "" #str "" -#define asStr(str) sub_asStr(str) - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "..\Inc\ccx.h" -#define APSTUDIO_HIDDEN_SYMBOLS -#include -#undef APSTUDIO_HIDDEN_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif // _WIN32 - -#ifndef _MAC -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -1 VERSIONINFO - FILEVERSION 1,0,0,EXTENSION_VERSION - PRODUCTVERSION 1,0,0,EXTENSION_VERSION - FILEFLAGSMASK VS_FFI_FILEFLAGSMASK -#ifdef _DEBUG - FILEFLAGS VS_FF_DEBUG -#else - FILEFLAGS 0 -#endif - FILEOS VOS__WINDOWS32 - FILETYPE VFT_DLL - FILESUBTYPE VFT2_UNKNOWN -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904e4" - BEGIN - VALUE "ProductName", PROJECT_NAME "\0" - VALUE "CompanyName", COMPANY_NAME "\0" - VALUE "FileDescription", PROJECT_NAME ", " asStr(CONFIG) " build " asStr(EXTENSION_VERSION) ".\0" - VALUE "FileVersion", "2.00" "\0" - VALUE "InternalName", PROJECT_NAME ".mfx\0" - VALUE "LegalCopyright", "Copyright \xA9 " YEAR " " COMPANY_NAME "\0" - VALUE "OriginalFilename", PROJECT_NAME ".mfx\0" - VALUE "ProductVersion", "Build " asStr(EXTENSION_VERSION) ", date " BUILD_DATE ".\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x0409, 1252 - END -END - -#endif // !_MAC - - -///////////////////////////////////////////////////////////////////////////// -// -// Data -// - -KPX_MAGICNUMBER RCDATA -BEGIN - 0x9978, 0x8989 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -#if defined(APSTUDIO_INVOKED) || defined(EDITOR) -#if defined(APSTUDIO_INVOKED) -EXO_ICON$(EDITOR) BITMAP "RES\\EXTICON.BMP" -#else -EXO_ICON BITMAP "RES\\EXTICON.BMP" -#endif -#endif -#if defined(APSTUDIO_INVOKED) || defined(EDITOR) -#if defined(APSTUDIO_INVOKED) -EXO_IMAGE$(EDITOR) BITMAP "RES\\EXTIMG.BMP" -#else -EXO_IMAGE BITMAP "RES\\EXTIMG.BMP" -#endif -#endif - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -#if defined(APSTUDIO_INVOKED) || defined(EDITOR) -#if defined(APSTUDIO_INVOKED) -MN_CONDITIONS$(EDITOR) MENU -#else -MN_CONDITIONS MENU -#endif -BEGIN - MENUITEM "", 65535 -END -#endif - -#if defined(APSTUDIO_INVOKED) || defined(EDITOR) -#if defined(APSTUDIO_INVOKED) -MN_ACTIONS$(EDITOR) MENU -#else -MN_ACTIONS MENU -#endif -BEGIN - MENUITEM "", 65535 -END -#endif - -#if defined(APSTUDIO_INVOKED) || defined(EDITOR) -#if defined(APSTUDIO_INVOKED) -MN_EXPRESSIONS$(EDITOR) MENU -#else -MN_EXPRESSIONS MENU -#endif -BEGIN - POPUP "" - BEGIN - MENUITEM "Get Volume Label", IDMN_EXPRESSION2 - END -END -#endif - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""..\\Inc\\ccx.h""\r\n" - "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" - "#include \r\n" - "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE -BEGIN - KPX_MARK "MF2" - KPX_NAME "NRG753 Volume Information" -END - -STRINGTABLE -BEGIN - M_EXPRESSION2 "VolInfo$(" -END - -STRINGTABLE -BEGIN - IDST_OBJNAME "NRG753 Volume Information" - IDST_AUTHOR "Jack Webster" - IDST_COPYRIGHT "Copyright \xA9 2006 Jack Webster" - IDST_COMMENT "Given a root path, will give the volumes label. By request of NRG753" - IDST_HTTP "(No webpage right now)" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/MMF2SDK/VOLINFO/VOLINFO.vcxproj b/MMF2SDK/VOLINFO/VOLINFO.vcxproj deleted file mode 100644 index 3532a72d..00000000 --- a/MMF2SDK/VOLINFO/VOLINFO.vcxproj +++ /dev/null @@ -1,103 +0,0 @@ - - - - - Debug - Win32 - - - Edittime - Win32 - - - Runtime - Win32 - - - Vitalize - Win32 - - - - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145} - VOLINFO - - - - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.40219.1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/MMF2SDK_Unicode/VOLINFO/.gitattributes b/MMF2SDK_Unicode/VOLINFO/.gitattributes new file mode 100644 index 00000000..412eeda7 --- /dev/null +++ b/MMF2SDK_Unicode/VOLINFO/.gitattributes @@ -0,0 +1,22 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp +*.sln merge=union +*.csproj merge=union +*.vbproj merge=union +*.fsproj merge=union +*.dbproj merge=union + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/MMF2SDK_Unicode/VOLINFO/.gitignore b/MMF2SDK_Unicode/VOLINFO/.gitignore new file mode 100644 index 00000000..5ebd21a1 --- /dev/null +++ b/MMF2SDK_Unicode/VOLINFO/.gitignore @@ -0,0 +1,163 @@ +################# +## Eclipse +################# + +*.pydevproject +.project +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath + + +################# +## Visual Studio +################# + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results +[Dd]ebug/ +[Rr]elease/ +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.vspscc +.builds +*.dotCover + +## TODO: If you have NuGet Package Restore enabled, uncomment this +#packages/ + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf + +# Visual Studio profiler +*.psess +*.vsp + +# ReSharper is a .NET coding add-in +_ReSharper* + +# Installshield output folder +[Ee]xpress + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish + +# Others +[Bb]in +[Oo]bj +sql +TestResults +*.Cache +ClientBin +stylecop.* +~$* +*.dbmdl +Generated_Code #added for RIA/Silverlight projects + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML + + + +############ +## Windows +############ + +# Windows image file caches +Thumbs.db + +# Folder config file +Desktop.ini + + +############# +## Python +############# + +*.py[co] + +# Packages +*.egg +*.egg-info +dist +build +eggs +parts +bin +var +sdist +develop-eggs +.installed.cfg + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox + +#Translations +*.mo + +#Mr Developer +.mr.developer.cfg + +# Mac crap +.DS_Store diff --git a/MMF2SDK/VOLINFO/Common.h b/MMF2SDK_Unicode/VOLINFO/Common.h similarity index 87% rename from MMF2SDK/VOLINFO/Common.h rename to MMF2SDK_Unicode/VOLINFO/Common.h index 40061092..5ec7b90f 100644 --- a/MMF2SDK/VOLINFO/Common.h +++ b/MMF2SDK_Unicode/VOLINFO/Common.h @@ -6,24 +6,26 @@ #define _CRTDBG_MAP_ALLOC 1 #endif +#define IN_EXT_VERSION2 + // ---------------------------------------------- // VERSION AND BUILD YOUR EXTENSION CAN WORK WITH // ---------------------------------------------- -//#define TGFEXT // TGF, MMF Standard and MMF Pro +//#define TGFEXT // TGF, MMF Standard and MMF Pro #define MMFEXT // MMF Standard and MMF Pro -//#define PROEXT // MMF Pro only +//#define PROEXT // MMF Pro only // Build number of the minimum required version of MMF #define MINBUILD 228 // General includes -#include "ccxhdr.h" -#include "Surface.h" +#include "ccxhdr.h" +#include "Surface.h" // Specific to this cox -#include "resource.h" -#include "main.h" -#include "TigsExt.hpp" +#include "resource.h" +#include "main.h" +#include "TigsExt.hpp" // Globals and Prototypes extern HINSTANCE hInstLib; diff --git a/MMF2SDK/VOLINFO/Edittime.cpp b/MMF2SDK_Unicode/VOLINFO/Edittime.cpp similarity index 95% rename from MMF2SDK/VOLINFO/Edittime.cpp rename to MMF2SDK_Unicode/VOLINFO/Edittime.cpp index 3ef1adaf..ac2ea78f 100644 --- a/MMF2SDK/VOLINFO/Edittime.cpp +++ b/MMF2SDK_Unicode/VOLINFO/Edittime.cpp @@ -5,7 +5,7 @@ // under the Frame and Event editors. // // Including creating, display, and setting up your object. -// +// // ============================================================================ // Common @@ -21,8 +21,8 @@ enum { // Example // ------- -// PROPID_TEXTTITLE, -// PROPID_TEXT, +// PROPID_TEXTTITLE, +// PROPID_TEXT, // PROPID_CHECK, // PROPID_COMBO, // PROPID_COLOR, @@ -31,9 +31,9 @@ enum { // Example of content of the PROPID_COMBO combo box //LPCSTR ComboList[] = { // 0, // reserved -// MAKEINTRESOURCE(IDS_FIRSTOPTION), -// MAKEINTRESOURCE(IDS_SECONDOPTION), -// MAKEINTRESOURCE(IDS_THIRDOPTION), +// MAKEINTRESOURCE(IDS_FIRSTOPTION), +// MAKEINTRESOURCE(IDS_SECONDOPTION), +// MAKEINTRESOURCE(IDS_THIRDOPTION), // NULL //}; @@ -78,7 +78,7 @@ typedef struct tagSetP // Info displayed in the object's About properties // Note: ObjComment is also displayed in the Quick Description box in the Insert Object dialog box // -void WINAPI DLLExport GetObjInfos (mv _far *mV, LPEDATA edPtr, LPSTR ObjName, LPSTR ObjAuthor, LPSTR ObjCopyright, LPSTR ObjComment, LPSTR ObjHttp) +void WINAPI DLLExport GetObjInfos (mv _far *mV, LPEDATA edPtr, LPTSTR ObjName, LPTSTR ObjAuthor, LPTSTR ObjCopyright, LPTSTR ObjComment, LPTSTR ObjHttp) { #ifndef RUN_ONLY // Name @@ -103,7 +103,7 @@ void WINAPI DLLExport GetObjInfos (mv _far *mV, LPEDATA edPtr, LPSTR ObjName, LP // ----------------- // Returns the help filename of the object. // -LPCSTR WINAPI GetHelpFileName() +LPCTSTR WINAPI GetHelpFileName() { #ifndef RUN_ONLY // Return a file without path if your help file can be loaded by the MMF help file. @@ -111,7 +111,7 @@ LPCSTR WINAPI GetHelpFileName() // Or return the path of your file, relatively to the MMF directory // if your file is not loaded by the MMF help file. - return "Help\\MyExt.chm"; + return _T("Help\\MyExt.chm"); #else return NULL; #endif // !defined(RUN_ONLY) @@ -161,7 +161,7 @@ WORD BmpToImg(int bmID, npAppli idApp, short HotX = 0, short HotY = 0, short Act // ============================================================================ // // ROUTINES USED UNDER FRAME EDITOR -// +// // ============================================================================ @@ -176,7 +176,7 @@ WORD BmpToImg(int bmID, npAppli idApp, short HotX = 0, short HotY = 0, short Act // If you need to draw the icon manually, remove the comments around this function and in the .def file. // /* -int WINAPI DLLExport MakeIconEx ( mv _far *mV, cSurface* pIconSf, LPSTR lpName, fpObjInfo oiPtr, LPEDATA edPtr ) +int WINAPI DLLExport MakeIconEx ( mv _far *mV, cSurface* pIconSf, LPTSTR lpName, fpObjInfo oiPtr, LPEDATA edPtr ) { int error = -1; #ifndef RUN_ONLY @@ -196,7 +196,7 @@ int WINAPI DLLExport MakeIconEx ( mv _far *mV, cSurface* pIconSf, LPSTR lpName, // -------------------- // CreateObject // -------------------- -// Called when you choose "Create new object". It should display the setup box +// Called when you choose "Create new object". It should display the setup box // and initialize everything in the datazone. int WINAPI DLLExport CreateObject(mv _far *mV, fpLevObj loPtr, LPEDATA edPtr) @@ -276,7 +276,7 @@ void WINAPI DLLExport RemoveObject(mv _far *mV, fpLevObj loPtr, LPEDATA edPtr, u { #ifndef RUN_ONLY // Is the last object removed? - if (0 == cpt) + if (0 == cpt) { // Do whatever necessary to remove our data } @@ -355,7 +355,7 @@ void WINAPI DLLExport EditorDisplay(mv _far *mV, fpObjInfo oiPtr, fpLevObj loPtr // IsTransparent // -------------------- // This routine tells CC&C if the mouse pointer is over a transparent zone of the object. -// +// extern "C" BOOL WINAPI DLLExport IsTransparent(mv _far *mV, fpLevObj loPtr, LPEDATA edPtr, int dx, int dy) { @@ -369,7 +369,7 @@ extern "C" BOOL WINAPI DLLExport IsTransparent(mv _far *mV, fpLevObj loPtr, LPED // PrepareToWriteObject // -------------------- // Just before writing the datazone when saving the application, CC&C calls this routine. -// +// void WINAPI DLLExport PrepareToWriteObject(mv _far *mV, LPEDATA edPtr, fpObjInfo adoi) { #ifndef RUN_ONLY @@ -401,20 +401,20 @@ BOOL WINAPI GetFilters(LPMV mV, LPEDATA edPtr, DWORD dwFlags, LPVOID pReserved) // Triggers when a file is dropped onto the frame // Return TRUE if you can create an object from the given file // -BOOL WINAPI DLLExport UsesFile (LPMV mV, LPSTR fileName) +BOOL WINAPI DLLExport UsesFile (LPMV mV, LPTSTR fileName) { BOOL r = FALSE; #ifndef RUN_ONLY // Example: return TRUE if file extension is ".txt" -/* - LPSTR ext, npath; +/* + LPTSTR ext, npath; if ( fileName != NULL ) { - if ( (ext=(LPSTR)malloc(_MAX_EXT)) != NULL ) + if ( (ext=(LPTSTR)malloc(_MAX_EXT)) != NULL ) { - if ( (npath=(LPSTR)malloc(_MAX_PATH)) != NULL ) + if ( (npath=(LPTSTR)malloc(_MAX_PATH)) != NULL ) { strcpy(npath, fileName); _splitpath(npath, NULL, NULL, NULL, ext); @@ -435,7 +435,7 @@ BOOL WINAPI DLLExport UsesFile (LPMV mV, LPSTR fileName) // -------------------- // Creates a new object from file // -void WINAPI DLLExport CreateFromFile (LPMV mV, LPSTR fileName, LPEDATA edPtr) +void WINAPI DLLExport CreateFromFile (LPMV mV, LPTSTR fileName, LPEDATA edPtr) { #ifndef RUN_ONLY // Initialize your extension data from the given file @@ -450,7 +450,7 @@ void WINAPI DLLExport CreateFromFile (LPMV mV, LPSTR fileName, LPEDATA edPtr) // ============================================================================ // // PROPERTIES -// +// // ============================================================================ // -------------------- @@ -536,7 +536,7 @@ LPVOID WINAPI DLLExport GetPropValue(LPMV mV, LPEDATA edPtr, UINT nPropID) // // // Returns a string // case PROPID_TEXT: -// return new CPropDataValue(&edPtr->szText[0]); +// return new CPropStringValue(&edPtr->szText[0]); // // // Returns the value of the combo box // case PROPID_COMBO: @@ -595,7 +595,7 @@ void WINAPI DLLExport SetPropValue(LPMV mV, LPEDATA edPtr, UINT nPropID, LPVOID // case PROPID_TEXT: // { // // Gets the string -// LPSTR pStr = (LPSTR)((CPropDataValue*)pValue)->m_pData; +// LPTSTR pStr = ((CPropStringValue*)pValue)->GetString(); // // // You can simply poke the string if your EDITDATA structure has a fixed size, // // or have an adaptive size of structure like below @@ -605,7 +605,7 @@ void WINAPI DLLExport SetPropValue(LPMV mV, LPEDATA edPtr, UINT nPropID, LPVOID // { // // Asks MMF to reallocate the structure with the new size // LPEDATA pNewPtr = (LPEDATA)mvReAllocEditData(mV, edPtr, sizeof(EDITDATA)+strlen(pStr)); -// +// // // If reallocation worked // if (pNewPtr!=NULL) // { @@ -615,7 +615,7 @@ void WINAPI DLLExport SetPropValue(LPMV mV, LPEDATA edPtr, UINT nPropID, LPVOID // } // } // else -// { +// { // // Same size : simply copy // strcpy(edPtr->text, pStr); // } @@ -699,7 +699,7 @@ BOOL WINAPI IsPropEnabled(LPMV mV, LPEDATA edPtr, UINT nPropID) // ============================================================================ // // TEXT PROPERTIES -// +// // ============================================================================ // -------------------- @@ -718,7 +718,7 @@ DWORD WINAPI DLLExport GetTextCaps(mv _far *mV, LPEDATA edPtr) // Return the font used the object. // Note: the pStyle and cbSize parameters are obsolete and passed for compatibility reasons only. // -BOOL WINAPI DLLExport GetTextFont(mv _far *mV, LPEDATA edPtr, LPLOGFONT plf, LPSTR pStyle, UINT cbSize) +BOOL WINAPI DLLExport GetTextFont(mv _far *mV, LPEDATA edPtr, LPLOGFONT plf, LPTSTR pStyle, UINT cbSize) { #if !defined(RUN_ONLY) // Example: copy LOGFONT structure from EDITDATA @@ -830,24 +830,24 @@ void WINAPI DLLExport SetTextAlignment(mv _far *mV, LPEDATA edPtr, DWORD dwAlign // // ROUTINES USED UNDER EVENT / TIME / STEP-THROUGH EDITOR // You should not need to change these routines -// +// // ============================================================================ // ----------------- // menucpy // ----------------- // Internal routine used later, copy one menu onto another -// -#ifndef RUN_ONLY +// void menucpy(HMENU hTargetMenu, HMENU hSourceMenu) { +#ifndef RUN_ONLY int n, id, nMn; - NPSTR strBuf; + LPTSTR strBuf; HMENU hSubMenu; - + nMn = GetMenuItemCount(hSourceMenu); - strBuf = (NPSTR)LocalAlloc(LPTR, 80); - for (n=0; ninfos.code != code) eiPtr = EVINFO2_NEXT(eiPtr); - + return eiPtr; } -#endif // !defined(RUN_ONLY) +//#endif // !defined(RUN_ONLY) // ---------------------------------------------------- @@ -951,7 +952,7 @@ HMENU WINAPI DLLExport GetExpressionMenu(mv _far *mV, fpObjInfo oiPtr, LPEDATA e // #ifndef RUN_ONLY -void GetCodeTitle(LPEVENTINFOS2 eiPtr, short code, short param, short mn, LPSTR strBuf, WORD maxLen) +void GetCodeTitle(LPEVENTINFOS2 eiPtr, short code, short param, short mn, LPTSTR strBuf, WORD maxLen) { HMENU hMn; @@ -965,7 +966,7 @@ void GetCodeTitle(LPEVENTINFOS2 eiPtr, short code, short param, short mn, LPSTR LoadString(hInstLib, strID, strBuf, maxLen); else { - // Otherwise, returns the menu option + // Otherwise, returns the menu option if ((hMn = LoadMenu(hInstLib, MAKEINTRESOURCE(mn))) != NULL ) { GetMenuString(hMn, eiPtr->menu, strBuf, maxLen, MF_BYCOMMAND); @@ -977,15 +978,15 @@ void GetCodeTitle(LPEVENTINFOS2 eiPtr, short code, short param, short mn, LPSTR #define GetCodeTitle(a,b,c,d,e,f) #endif // !defined(RUN_ONLY) -void WINAPI DLLExport GetConditionTitle(mv _far *mV, short code, short param, LPSTR strBuf, short maxLen) +void WINAPI DLLExport GetConditionTitle(mv _far *mV, short code, short param, LPTSTR strBuf, short maxLen) { GetCodeTitle((LPEVENTINFOS2)conditionsInfos, code, param, MN_CONDITIONS, strBuf, maxLen); } -void WINAPI DLLExport GetActionTitle(mv _far *mV, short code, short param, LPSTR strBuf, short maxLen) +void WINAPI DLLExport GetActionTitle(mv _far *mV, short code, short param, LPTSTR strBuf, short maxLen) { GetCodeTitle((LPEVENTINFOS2)actionsInfos, code, param, MN_ACTIONS, strBuf, maxLen); } -void WINAPI DLLExport GetExpressionTitle(mv _far *mV, short code, LPSTR strBuf, short maxLen) +void WINAPI DLLExport GetExpressionTitle(mv _far *mV, short code, LPTSTR strBuf, short maxLen) { GetCodeTitle((LPEVENTINFOS2)expressionsInfos, code, 0, MN_EXPRESSIONS, strBuf, maxLen); } @@ -1005,7 +1006,7 @@ short WINAPI DLLExport GetConditionCodeFromMenu(mv _far *mV, short menuId) for (n=CND_LAST, eiPtr=(LPEVENTINFOS2)conditionsInfos; n>0 && eiPtr->menu!=menuId; n--) eiPtr = EVINFO2_NEXT(eiPtr); - if (n>0) + if (n>0) return eiPtr->infos.code; #endif // !defined(RUN_ONLY) return -1; @@ -1019,7 +1020,7 @@ short WINAPI DLLExport GetActionCodeFromMenu(mv _far *mV, short menuId) for (n=ACT_LAST, eiPtr=(LPEVENTINFOS2)actionsInfos; n>0 && eiPtr->menu!=menuId; n--) eiPtr = EVINFO2_NEXT(eiPtr); - if (n>0) + if (n>0) return eiPtr->infos.code; #endif // !defined(RUN_ONLY) return -1; @@ -1033,7 +1034,7 @@ short WINAPI DLLExport GetExpressionCodeFromMenu(mv _far *mV, short menuId) for (n=EXP_LAST, eiPtr=(LPEVENTINFOS2)expressionsInfos; n>0 && eiPtr->menu!=menuId; n--) eiPtr = EVINFO2_NEXT(eiPtr); - if (n>0) + if (n>0) return eiPtr->infos.code; #endif // !defined(RUN_ONLY) return -1; @@ -1043,8 +1044,8 @@ short WINAPI DLLExport GetExpressionCodeFromMenu(mv _far *mV, short menuId) // ------------------------------------------------------- // GetConditionInfos / GetActionInfos / GetExpressionInfos // ------------------------------------------------------- -// From a action / condition / expression code, returns -// an infosEvents structure. +// From a action / condition / expression code, returns +// an infosEvents structure. // LPINFOEVENTSV2 WINAPI DLLExport GetConditionInfos(mv _far *mV, short code) @@ -1078,11 +1079,11 @@ LPINFOEVENTSV2 WINAPI DLLExport GetExpressionInfos(mv _far *mV, short code) // ---------------------------------------------------------- // GetConditionString / GetActionString / GetExpressionString // ---------------------------------------------------------- -// From a action / condition / expression code, returns +// From a action / condition / expression code, returns // the string to use for displaying it under the event editor // -void WINAPI DLLExport GetConditionString(mv _far *mV, short code, LPSTR strPtr, short maxLen) +void WINAPI DLLExport GetConditionString(mv _far *mV, short code, LPTSTR strPtr, short maxLen) { #ifndef RUN_ONLY // Check compatibility @@ -1091,7 +1092,7 @@ void WINAPI DLLExport GetConditionString(mv _far *mV, short code, LPSTR strPtr, #endif // !defined(RUN_ONLY) } -void WINAPI DLLExport GetActionString(mv _far *mV, short code, LPSTR strPtr, short maxLen) +void WINAPI DLLExport GetActionString(mv _far *mV, short code, LPTSTR strPtr, short maxLen) { #ifndef RUN_ONLY // Check compatibility @@ -1100,7 +1101,7 @@ void WINAPI DLLExport GetActionString(mv _far *mV, short code, LPSTR strPtr, sho #endif // !defined(RUN_ONLY) } -void WINAPI DLLExport GetExpressionString(mv _far *mV, short code, LPSTR strPtr, short maxLen) +void WINAPI DLLExport GetExpressionString(mv _far *mV, short code, LPTSTR strPtr, short maxLen) { #ifndef RUN_ONLY // Check compatibility @@ -1114,7 +1115,7 @@ void WINAPI DLLExport GetExpressionString(mv _far *mV, short code, LPSTR strPtr, // ---------------------------------------------------------- // Returns the parameter name to display in the expression editor // -void WINAPI DLLExport GetExpressionParam(mv _far *mV, short code, short param, LPSTR strBuf, short maxLen) +void WINAPI DLLExport GetExpressionParam(mv _far *mV, short code, short param, LPTSTR strBuf, short maxLen) { #if !defined(RUN_ONLY) short strID; @@ -1216,7 +1217,7 @@ void WINAPI EditParameter(mv _far *mV, short code, paramExt* pExt) // -------------------- // Initialize the parameter. // -void WINAPI GetParameterString(mv _far *mV, short code, paramExt* pExt, LPSTR pDest, short size) +void WINAPI GetParameterString(mv _far *mV, short code, paramExt* pExt, LPTSTR pDest, short size) { #if !defined(RUN_ONLY) diff --git a/MMF2SDK/VOLINFO/Ext.def b/MMF2SDK_Unicode/VOLINFO/Ext.def similarity index 100% rename from MMF2SDK/VOLINFO/Ext.def rename to MMF2SDK_Unicode/VOLINFO/Ext.def diff --git a/MMF2SDK_Unicode/VOLINFO/Ext.rc b/MMF2SDK_Unicode/VOLINFO/Ext.rc new file mode 100644 index 00000000..a4072c0c --- /dev/null +++ b/MMF2SDK_Unicode/VOLINFO/Ext.rc @@ -0,0 +1,215 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "..\Inc\ccx.h" +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +1 VERSIONINFO + FILEVERSION 1,0,0,0 + PRODUCTVERSION 1,0,0,0 + FILEFLAGSMASK 0x0L +#ifdef _DEBUG + FILEFLAGS 0x21L +#else + FILEFLAGS 0x20L +#endif + FILEOS 0x10001L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Clickteam\0" + VALUE "FileDescription", "NRG753 Volume Information\0" + VALUE "FileVersion", "2.00\0" + VALUE "InternalName", "VOLINFO\0" + VALUE "LegalCopyright", "Copyright � 2006 Jack Webster\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "VOLINFO.mfx\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "\0" + VALUE "ProductVersion", "1, 0, 0, 0\0" + VALUE "SpecialBuild", "00000001\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // !_MAC + + +///////////////////////////////////////////////////////////////////////////// +// +// Data +// + +KPX_MAGICNUMBER RCDATA MOVEABLE PURE +BEGIN + 0x9978, 0x8989 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Bitmap +// + +#if defined(APSTUDIO_INVOKED) || defined(EDITOR) +#if defined(APSTUDIO_INVOKED) +EXO_ICON$(EDITOR) BITMAP MOVEABLE PURE "RES\\EXTICON.BMP" +#else +EXO_ICON BITMAP MOVEABLE PURE "RES\\EXTICON.BMP" +#endif +#endif +#if defined(APSTUDIO_INVOKED) || defined(EDITOR) +#if defined(APSTUDIO_INVOKED) +EXO_IMAGE$(EDITOR) BITMAP MOVEABLE PURE "RES\\EXTIMG.BMP" +#else +EXO_IMAGE BITMAP MOVEABLE PURE "RES\\EXTIMG.BMP" +#endif +#endif + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +#if defined(APSTUDIO_INVOKED) || defined(EDITOR) +#if defined(APSTUDIO_INVOKED) +MN_CONDITIONS$(EDITOR) MENU DISCARDABLE +#else +MN_CONDITIONS MENU DISCARDABLE +#endif +BEGIN + MENUITEM "", 65535 +END +#endif + +#if defined(APSTUDIO_INVOKED) || defined(EDITOR) +#if defined(APSTUDIO_INVOKED) +MN_ACTIONS$(EDITOR) MENU DISCARDABLE +#else +MN_ACTIONS MENU DISCARDABLE +#endif +BEGIN + MENUITEM "", 65535 +END +#endif + +#if defined(APSTUDIO_INVOKED) || defined(EDITOR) +#if defined(APSTUDIO_INVOKED) +MN_EXPRESSIONS$(EDITOR) MENU DISCARDABLE +#else +MN_EXPRESSIONS MENU DISCARDABLE +#endif +BEGIN + POPUP "" + BEGIN + MENUITEM "Get Volume Label", IDMN_EXPRESSION2 + MENUITEM SEPARATOR + END +END +#endif + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""..\\Inc\\ccx.h""\r\n" + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + KPX_MARK "MF2" + KPX_NAME "NRG753 Volume Information" +END + +STRINGTABLE DISCARDABLE +BEGIN + M_EXPRESSION2 "VolInfo$(" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDST_OBJNAME "NRG753 Volume Information" + IDST_AUTHOR "Jack Webster" + IDST_COPYRIGHT "Copyright \xA9 2006-2026 Jack Webster" + IDST_COMMENT "Given a root path, will give the volumes label. By request of NRG753" + IDST_HTTP "(No webpage right now)" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/MMF2SDK/VOLINFO/General.cpp b/MMF2SDK_Unicode/VOLINFO/General.cpp similarity index 90% rename from MMF2SDK/VOLINFO/General.cpp rename to MMF2SDK_Unicode/VOLINFO/General.cpp index 670cbf39..986a4647 100644 --- a/MMF2SDK/VOLINFO/General.cpp +++ b/MMF2SDK_Unicode/VOLINFO/General.cpp @@ -4,7 +4,7 @@ // The following routines are used internally by MMF, and should not need to // be modified. // -// +// // ============================================================================ // Common Include @@ -15,13 +15,13 @@ HINSTANCE hInstLib; // ============================================================================ // // LIBRARY ENTRY & QUIT POINTS -// +// // ============================================================================ // ----------------- // Entry points // ----------------- -// Usually you do not need to do any initialization here: you will prefer to +// Usually you do not need to do any initialization here: you will prefer to // do them in "Initialize" found in Edittime.cpp BOOL WINAPI DllMain(HINSTANCE hDLL, DWORD dwReason, LPVOID lpReserved) { @@ -29,7 +29,7 @@ BOOL WINAPI DllMain(HINSTANCE hDLL, DWORD dwReason, LPVOID lpReserved) { // DLL is attaching to the address space of the current process. case DLL_PROCESS_ATTACH: - + hInstLib = hDLL; // Store HINSTANCE break; @@ -42,10 +42,10 @@ BOOL WINAPI DllMain(HINSTANCE hDLL, DWORD dwReason, LPVOID lpReserved) break; // The calling process is detaching the DLL from its address space. - case DLL_PROCESS_DETACH: + case DLL_PROCESS_DETACH: break; } - + return TRUE; } @@ -66,7 +66,7 @@ extern "C" int WINAPI DLLExport Initialize(mv _far *mV, int quiet) // ----------------- // Where you want to kill and initialized data opened in the above routine // Called just before freeing the DLL. -// +// extern "C" int WINAPI DLLExport Free(mv _far *mV) { // No error @@ -76,18 +76,18 @@ extern "C" int WINAPI DLLExport Free(mv _far *mV) // ============================================================================ // // GENERAL INFO -// +// // ============================================================================ // ----------------- // Get Infos // ----------------- -// -extern "C" +// +extern "C" { DWORD WINAPI DLLExport GetInfos(int info) { - + switch (info) { case KGI_VERSION: @@ -98,6 +98,12 @@ extern "C" return PRODUCT_VERSION_STANDARD; // Works with MMF Standard or above case KGI_BUILD: return 240; // Works with build 240 or above + case KGI_UNICODE: + #ifdef _UNICODE + return TRUE; + #else + return FALSE; + #endif default: return 0; } @@ -109,7 +115,7 @@ extern "C" // ---------------------------------------------------------- // Fills an information structure that tells CC&C everything // about the object, its actions, conditions and expressions -// +// short WINAPI DLLExport GetRunObjectInfos(mv _far *mV, fpKpxRunInfos infoPtr) { @@ -131,10 +137,10 @@ short WINAPI DLLExport GetRunObjectInfos(mv _far *mV, fpKpxRunInfos infoPtr) // Identifier, for run-time identification infoPtr->identifier = IDENTIFIER; - + // Current version infoPtr->version = KCX_CURRENT_VERSION; - + return TRUE; } @@ -144,14 +150,14 @@ short WINAPI DLLExport GetRunObjectInfos(mv _far *mV, fpKpxRunInfos infoPtr) // Returns the name of the external modules that you wish MMF to include // with stand-alone applications (these modules must be in the MMF // Data\Runtime folder). -// +// -//LPCSTR szDep[] = { -// "MyDll.dll", +//LPCTSTR szDep[] = { +// _T("MyDll.dll"), // NULL //}; -LPCSTR* WINAPI DLLExport GetDependencies() +LPCTSTR* WINAPI DLLExport GetDependencies() { return NULL; // szDep; } @@ -183,7 +189,7 @@ void WINAPI DLLExport UnloadObject(mv _far *mV, LPEDATA edPtr, int reserved) // -------------------- // For you to update your object structure to newer versions // Called at both edit time and run time -// +// HGLOBAL WINAPI DLLExport UpdateEditStructure(mv __far *mV, void __far * OldEdPtr) { // We do nothing here @@ -198,9 +204,10 @@ HGLOBAL WINAPI DLLExport UpdateEditStructure(mv __far *mV, void __far * OldEdPtr // Called at edit time and run time. // // Call lpfnUpdate to update your file pathname (refer to the documentation) -// -void WINAPI DLLExport UpdateFileNames(mv _far *mV, LPSTR appName, LPEDATA edPtr, void (WINAPI * lpfnUpdate)(LPSTR, LPSTR)) +// +void WINAPI DLLExport UpdateFileNames(mv _far *mV, LPTSTR appName, LPEDATA edPtr, void (WINAPI * lpfnUpdate)(LPTSTR, LPTSTR)) { + } // --------------------- @@ -209,22 +216,22 @@ void WINAPI DLLExport UpdateFileNames(mv _far *mV, LPSTR appName, LPEDATA edPtr, // // Uncomment this function if you need to store an image in the image bank. // -// Note: do not forget to enable the function in the .def file +// Note: do not forget to enable the function in the .def file // if you remove the comments below. // /* int WINAPI DLLExport EnumElts (mv __far *mV, LPEDATA edPtr, ENUMELTPROC enumProc, ENUMELTPROC undoProc, LPARAM lp1, LPARAM lp2) -{ +{ int error = 0; // Replace wImgIdx with the name of the WORD variable you create within the edit structure - - // Enum images + + // Enum images if ( (error = enumProc(&edPtr->wImgIdx, IMG_TAB, lp1, lp2)) != 0 ) { - // Undo enum images - undoProc (&edPtr->wImgIdx, IMG_TAB, lp1, lp2); - } + // Undo enum images + undoProc (&edPtr->wImgIdx, IMG_TAB, lp1, lp2); + } return error; } diff --git a/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.sln b/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.sln new file mode 100644 index 00000000..ed072de5 --- /dev/null +++ b/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.sln @@ -0,0 +1,40 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.37327.16 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MMF2SDK - VOLINFO", "MMF2SDK - VOLINFO.vcxproj", "{2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug Unicode|x86 = Debug Unicode|x86 + Debug|x86 = Debug|x86 + Edittime Unicode|x86 = Edittime Unicode|x86 + Edittime|x86 = Edittime|x86 + Runtime Unicode|x86 = Runtime Unicode|x86 + Runtime|x86 = Runtime|x86 + Vitalize|x86 = Vitalize|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Debug Unicode|x86.ActiveCfg = Debug Unicode|Win32 + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Debug Unicode|x86.Build.0 = Debug Unicode|Win32 + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Debug|x86.ActiveCfg = Debug|Win32 + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Debug|x86.Build.0 = Debug|Win32 + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Edittime Unicode|x86.ActiveCfg = Edittime Unicode|Win32 + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Edittime Unicode|x86.Build.0 = Edittime Unicode|Win32 + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Edittime|x86.ActiveCfg = Edittime|Win32 + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Edittime|x86.Build.0 = Edittime|Win32 + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Runtime Unicode|x86.ActiveCfg = Runtime Unicode|Win32 + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Runtime Unicode|x86.Build.0 = Runtime Unicode|Win32 + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Runtime|x86.ActiveCfg = Runtime|Win32 + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Runtime|x86.Build.0 = Runtime|Win32 + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Vitalize|x86.ActiveCfg = Vitalize|Win32 + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Vitalize|x86.Build.0 = Vitalize|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {244770B2-A722-4976-85DA-F5FFB2A012A3} + EndGlobalSection +EndGlobal diff --git a/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcproj b/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcproj new file mode 100644 index 00000000..43cd5121 --- /dev/null +++ b/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcproj @@ -0,0 +1,807 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcxproj b/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcxproj new file mode 100644 index 00000000..632b655b --- /dev/null +++ b/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcxproj @@ -0,0 +1,678 @@ + + + + + Debug Unicode + Win32 + + + Debug + Win32 + + + Edittime Unicode + Win32 + + + Edittime + Win32 + + + Runtime Unicode + Win32 + + + Runtime + Win32 + + + Vitalize + Win32 + + + + {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145} + MMF2SDK - VOLINFO + 10.0.19041.0 + + + + DynamicLibrary + false + v141 + + + DynamicLibrary + false + v141 + + + DynamicLibrary + false + v141 + + + DynamicLibrary + false + v141 + + + DynamicLibrary + false + v141 + + + DynamicLibrary + false + v141 + + + DynamicLibrary + false + v141 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 + .\Vitalize_Small\ + .\Vitalize_Small\ + false + .\Release_Small\ + .\Release_Small\Unicode\ + .\Release_Small\ + .\Release_Small\Unicode\ + false + false + .\Debug\ + .\Debug\Unicode\ + .\Debug\ + .\Debug\Unicode\ + true + true + .\Run_Only_Small\ + .\Run_Only_Small\Unicode\ + .\Run_Only_Small\ + .\Run_Only_Small\Unicode\ + false + false + AllRules.ruleset + AllRules.ruleset + + + + + AllRules.ruleset + AllRules.ruleset + + + + + AllRules.ruleset + AllRules.ruleset + + + + + AllRules.ruleset + + + false + false + false + false + false + false + false + false + false + + + + NDEBUG;RUN_ONLY;%(PreprocessorDefinitions) + true + true + Win32 + .\Vitalize_Small/Template.tlb + + + + + MinSpace + OnlyExplicitInline + ..\Inc;.\;..\..\Inc;%(AdditionalIncludeDirectories) + NDEBUG;WIN32;_WINDOWS;STRICT;RUN_ONLY;VITALIZE;COXSDK;%(PreprocessorDefinitions) + true + Sync + MultiThreaded + true + true + .\Vitalize_Small/Template.pch + .\Vitalize_Small/ + .\Vitalize_Small/ + .\Vitalize_Small/ + Level3 + true + + + NDEBUG;RUN_ONLY;VITALIZE;%(PreprocessorDefinitions) + 0x0409 + ..\..\Inc;%(AdditionalIncludeDirectories) + .\Vitalize_Small\Ext.res + + + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;..\lib\mmfs2.lib;%(AdditionalDependencies) + $(ProjectDir)MOX\$(ProjectName).mox + true + false + .\Ext.def + .\Vitalize_Small/Template.pdb + false + + + .\Vitalize_Small/Template.lib + MachineX86 + false + ..\..\lib\;%(AdditionalLibraryDirectories) + + + true + .\Vitalize_Small/Template.bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + .\Release_Small/Template.tlb + + + + + MinSpace + OnlyExplicitInline + ..\Inc;.\;..\..\Inc;%(AdditionalIncludeDirectories) + NDEBUG;WIN32;_WINDOWS;STRICT;COXSDK;%(PreprocessorDefinitions) + true + Sync + MultiThreaded + true + true + .\Release_Small/Template.pch + .\Release_Small/ + .\Release_Small/ + .\Release_Small/ + Level3 + true + + + NDEBUG;EDITOR;%(PreprocessorDefinitions) + 0x0409 + ..\..\Inc;%(AdditionalIncludeDirectories) + .\Release_Small\Ext.res + + + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;..\lib\mmfs2.lib;%(AdditionalDependencies) + $(ProjectDir)MFX\Extensions\$(ProjectName).mfx + true + false + .\Ext.def + .\Release_Small/Template.pdb + false + + + .\Release_Small/Template.lib + MachineX86 + ..\..\lib\;%(AdditionalLibraryDirectories) + + + true + .\Release_Small/Template.bsc + + + + + + + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + .\Release_Small/Template.tlb + + + + + MinSpace + OnlyExplicitInline + ..\Inc;.\;..\..\Inc;%(AdditionalIncludeDirectories) + NDEBUG;WIN32;_WINDOWS;STRICT;COXSDK;_UNICODE;UNICODE;%(PreprocessorDefinitions) + true + Sync + MultiThreaded + true + true + .\Release_Small/Template.pch + .\Release_Small/ + .\Release_Small/ + .\Release_Small/ + Level3 + true + + + NDEBUG;EDITOR;%(PreprocessorDefinitions) + 0x0409 + ..\..\Inc;%(AdditionalIncludeDirectories) + .\Release_Small\Ext.res + + + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;..\lib\mmfs2.lib;%(AdditionalDependencies) + $(ProjectDir)MFX\Extensions\Unicode\$(ProjectName).mfx + true + false + .\Ext.def + .\Release_Small/Template.pdb + false + + + .\Release_Small/Template.lib + MachineX86 + ..\..\lib\;%(AdditionalLibraryDirectories) + + + true + .\Release_Small/Template.bsc + + + + + + + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + .\Debug/Template.tlb + + + + + Disabled + ..\Inc;.\;..\..\Inc;%(AdditionalIncludeDirectories) + _DEBUG;WIN32;_WINDOWS;STRICT;COXSDK;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebug + + + .\Debug/ + .\Debug/ + .\Debug/ + Level3 + true + ProgramDatabase + + + _DEBUG;EDITOR;%(PreprocessorDefinitions) + 0x0409 + ..\..\Inc;%(AdditionalIncludeDirectories) + .\Debug\Ext.res + + + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;..\lib\mmfs2.lib;%(AdditionalDependencies) + $(ProjectDir)MFX\Extensions\$(ProjectName).mfx + true + ..\lib\;..\..\lib\;%(AdditionalLibraryDirectories) + .\Ext.def + false + .\Debug/Template.pdb + false + + + .\Debug/Template.lib + MachineX86 + + + true + .\Debug/Template.bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + .\Debug/Template.tlb + + + + + Disabled + ..\Inc;.\;..\..\Inc;%(AdditionalIncludeDirectories) + _DEBUG;WIN32;_WINDOWS;STRICT;COXSDK;_UNICODE;UNICODE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebug + + + .\Debug/ + .\Debug/ + .\Debug/ + Level3 + true + ProgramDatabase + + + _DEBUG;EDITOR;%(PreprocessorDefinitions) + 0x0409 + ..\..\Inc;%(AdditionalIncludeDirectories) + .\Debug\Ext.res + + + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;..\lib\mmfs2.lib;%(AdditionalDependencies) + $(ProjectDir)MFX\DEBUG\Extensions\Unicode\$(ProjectName).mfx + true + ..\lib\;..\..\lib\;%(AdditionalLibraryDirectories) + .\Ext.def + false + .\Debug/Template.pdb + false + + + .\Debug/Template.lib + MachineX86 + + + true + .\Debug/Template.bsc + + + + + NDEBUG;RUN_ONLY;%(PreprocessorDefinitions) + true + true + Win32 + .\Run_Only_Small/Template.tlb + + + + + MinSpace + OnlyExplicitInline + ..\Inc;.\;..\..\Inc;%(AdditionalIncludeDirectories) + NDEBUG;WIN32;_WINDOWS;STRICT;RUN_ONLY;COXSDK;%(PreprocessorDefinitions) + true + Sync + MultiThreaded + true + true + .\Run_Only_Small/Template.pch + .\Run_Only_Small/ + .\Run_Only_Small/ + .\Run_Only_Small/ + Level3 + true + + + NDEBUG;RUN_ONLY;%(PreprocessorDefinitions) + 0x0409 + ..\..\Inc;%(AdditionalIncludeDirectories) + .\Run_Only_Small\Ext.res + + + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;..\lib\mmfs2.lib;%(AdditionalDependencies) + $(ProjectDir)MFX\Data\Runtime\$(ProjectName).mfx + true + false + .\Ext.def + $(ProjectDir)..\..\MFX\Data\Runtime\$(ProjectName)_Full.pdb + false + + + .\Run_Only_Small/Template.lib + MachineX86 + true + $(ProjectDir)..\..\MFX\Data\Runtime\$(ProjectName).pdb + ..\..\lib\;%(AdditionalLibraryDirectories) + + + true + .\Run_Only_Small/Template.bsc + + + + + + + + + + + NDEBUG;RUN_ONLY;%(PreprocessorDefinitions) + true + true + Win32 + .\Run_Only_Small/Template.tlb + + + + + MinSpace + OnlyExplicitInline + ..\Inc;.\;..\..\Inc;%(AdditionalIncludeDirectories) + NDEBUG;WIN32;_WINDOWS;STRICT;RUN_ONLY;COXSDK;_UNICODE;UNICODE;%(PreprocessorDefinitions) + true + Sync + MultiThreaded + true + true + .\Run_Only_Small/Template.pch + .\Run_Only_Small/ + .\Run_Only_Small/ + .\Run_Only_Small/ + Level3 + true + + + NDEBUG;RUN_ONLY;%(PreprocessorDefinitions) + 0x0409 + ..\..\Inc;%(AdditionalIncludeDirectories) + .\Run_Only_Small\Ext.res + + + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;..\lib\mmfs2.lib;%(AdditionalDependencies) + $(ProjectDir)MFX\Data\Runtime\Unicode\$(ProjectName).mfx + true + false + .\Ext.def + $(ProjectDir)..\..\MFX\Data\Runtime\$(ProjectName)_Full.pdb + false + + + .\Run_Only_Small/Template.lib + MachineX86 + true + $(ProjectDir)..\..\MFX\Data\Runtime\$(ProjectName).pdb + ..\..\lib\;%(AdditionalLibraryDirectories) + + + true + .\Run_Only_Small/Template.bsc + + + + + + + + + + + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + + + + + + \ No newline at end of file diff --git a/MMF2SDK/VOLINFO/VOLINFO.vcxproj.filters b/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcxproj.filters similarity index 98% rename from MMF2SDK/VOLINFO/VOLINFO.vcxproj.filters rename to MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcxproj.filters index 794fd3f0..8b5e055f 100644 --- a/MMF2SDK/VOLINFO/VOLINFO.vcxproj.filters +++ b/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcxproj.filters @@ -32,15 +32,15 @@ + + Source Files + Resource Files Resource Files - - Resource Files - @@ -49,6 +49,9 @@ Header Files + + Header Files + MMF Headers @@ -139,9 +142,6 @@ MMF Headers - - Resource Files - diff --git a/MMF2SDK/VOLINFO/Main.cpp b/MMF2SDK_Unicode/VOLINFO/Main.cpp similarity index 88% rename from MMF2SDK/VOLINFO/Main.cpp rename to MMF2SDK_Unicode/VOLINFO/Main.cpp index 8f25bdf5..3b94af8b 100644 --- a/MMF2SDK/VOLINFO/Main.cpp +++ b/MMF2SDK_Unicode/VOLINFO/Main.cpp @@ -38,7 +38,7 @@ short expressionsInfos[]= // ============================================================================ // // CONDITION ROUTINES -// +// // ============================================================================ @@ -47,20 +47,20 @@ short expressionsInfos[]= // ============================================================================ // // EXPRESSIONS ROUTINES -// +// // ============================================================================ long WINAPI DLLExport GetVol(LPRDATA rdPtr,long param1) { long p1 = CNC_GetFirstExpressionParameter(rdPtr, param1, TYPE_STRING); //Reversing the string. - LPSTR buf = (LPSTR)callRunTimeFunction(rdPtr, RFUNCTION_GETSTRINGSPACE, MAX_PATH , 0); + LPTSTR buf = (LPTSTR)callRunTimeFunction(rdPtr, RFUNCTION_GETSTRINGSPACE, MAX_PATH , 0); buf[0] = '\0'; DWORD w1,w2,w3; - char ignore[10]; + TCHAR ignore[10]; //None of the info is null because sometimes that crashes Win9x machines. - GetVolumeInformation( (LPSTR)p1 , buf , MAX_PATH , &w1 , &w2 , &w3 , ignore , 9 ); - + GetVolumeInformation( (LPTSTR)p1 , buf , MAX_PATH , &w1 , &w2 , &w3 , ignore , 9 ); + rdPtr->rHo.hoFlags |= HOF_STRING; return (long)buf; } @@ -74,18 +74,18 @@ long WINAPI DLLExport GetVol(LPRDATA rdPtr,long param1) // Located at the end of the source for convinience // Must finish with a 0 // -long (WINAPI * ConditionJumps[])(LPRDATA rdPtr, long param1, long param2) = - { +long (WINAPI * ConditionJumps[])(LPRDATA rdPtr, long param1, long param2) = + { 0 }; - + short (WINAPI * ActionJumps[])(LPRDATA rdPtr, long param1, long param2) = { 0 }; -long (WINAPI * ExpressionJumps[])(LPRDATA rdPtr, long param) = - { +long (WINAPI * ExpressionJumps[])(LPRDATA rdPtr, long param) = + { GetVol, 0 }; \ No newline at end of file diff --git a/MMF2SDK/VOLINFO/Main.h b/MMF2SDK_Unicode/VOLINFO/Main.h similarity index 86% rename from MMF2SDK/VOLINFO/Main.h rename to MMF2SDK_Unicode/VOLINFO/Main.h index 43918d48..821d95c6 100644 --- a/MMF2SDK/VOLINFO/Main.h +++ b/MMF2SDK_Unicode/VOLINFO/Main.h @@ -2,6 +2,14 @@ // and then remove the #pragma message above. If you do not do this, MMF2 // could confuse your object with another in the event editor. +#ifdef _UNICODE + #define EDITDATA EDITDATAW + #define LPEDATA LPEDATAW +#else + #define EDITDATA EDITDATAA + #define LPEDATA LPEDATAA +#endif + // ------------------------------ // DEFINITION OF CONDITIONS CODES // ------------------------------ @@ -20,10 +28,10 @@ #define EXP_EXPRESSION2 0 -#define EXP_LAST 1 +#define EXP_LAST 1 // --------------------- -// OBJECT DATA STRUCTURE +// OBJECT DATA STRUCTURE // --------------------- // Used at edit time and saved in the MFA/CCN/EXE files @@ -48,7 +56,7 @@ typedef EDITDATA * LPEDATA; // Used at runtime. Initialize it in the CreateRunObject function. // Free any allocated memory or object in the DestroyRunObject function. // -// Note: if you store C++ objects in this structure and do not store +// Note: if you store C++ objects in this structure and do not store // them as pointers, you must call yourself their constructor in the // CreateRunObject function and their destructor in the DestroyRunObject // function. As the RUNDATA structure is a simple C structure and not a C++ object. @@ -75,11 +83,11 @@ typedef RUNDATA * LPRDATA; // Default flags - see documentation for more info // ------------- -#define OEFLAGS 0 -#define OEPREFS 0 +#define OEFLAGS 0 +#define OEPREFS 0 // If to handle message, specify the priority of the handling procedure -// 0= low, 255= very high. You should use 100 as normal. +// 0= low, 255= very high. You should use 100 as normal. // -------------------------------------------------------------------- #define WINDOWPROC_PRIORITY 100 diff --git a/MMF2SDK/VOLINFO/Resource.h b/MMF2SDK_Unicode/VOLINFO/Resource.h similarity index 78% rename from MMF2SDK/VOLINFO/Resource.h rename to MMF2SDK_Unicode/VOLINFO/Resource.h index 01025157..8eb5246f 100644 --- a/MMF2SDK/VOLINFO/Resource.h +++ b/MMF2SDK_Unicode/VOLINFO/Resource.h @@ -2,7 +2,7 @@ // App Studio generated include file. // Used by Ext.rc // -#define _APS_NO_MFC 1 +#define _APS_NO_MFC 1 // About box information #define IDST_OBJNAME 128 @@ -12,10 +12,10 @@ #define IDST_HTTP 132 // Dialog Box ID -#define DB_SETUP 20003 +#define DB_SETUP 20003 // Help ID -#define ID_HELP 20004 +#define ID_HELP 20004 // Actions @@ -25,10 +25,10 @@ #define MN_ACTIONS 20000 // Commands of action menu -#define IDMN_ACTION 25000 +#define IDMN_ACTION 25000 // Action strings -#define M_ACTION 5000 +#define M_ACTION 5000 // Titles of action parameters #define M_ACT_P1 5501 @@ -73,13 +73,13 @@ #define M_EXP_P2 7501 // Next default values for new objects -// +// #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 101 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/MMF2SDK/VOLINFO/Runtime.cpp b/MMF2SDK_Unicode/VOLINFO/Runtime.cpp similarity index 86% rename from MMF2SDK/VOLINFO/Runtime.cpp rename to MMF2SDK_Unicode/VOLINFO/Runtime.cpp index 8f3f4a81..36a19b42 100644 --- a/MMF2SDK/VOLINFO/Runtime.cpp +++ b/MMF2SDK_Unicode/VOLINFO/Runtime.cpp @@ -3,7 +3,7 @@ // This file contains routines that are handled during the Runtime. // // Including creating, display, and handling your object. -// +// // ============================================================================ // Common Include @@ -44,7 +44,7 @@ WORD DebugTree[]= // GetRunObjectDataSize // -------------------- // Returns the size of the runtime datazone of the object -// +// ushort WINAPI DLLExport GetRunObjectDataSize(fprh rhPtr, LPEDATA edPtr) { return(sizeof(RUNDATA)); @@ -55,15 +55,15 @@ ushort WINAPI DLLExport GetRunObjectDataSize(fprh rhPtr, LPEDATA edPtr) // CreateRunObject // --------------- // The routine where the object is actually created -// +// short WINAPI DLLExport CreateRunObject(LPRDATA rdPtr, LPEDATA edPtr, fpcob cobPtr) { /* - This routine runs when your object is created, as you might have guessed. - It is here that you must transfer any data you need in rdPtr from edPtr, - because after this has finished you cannot access it again! - Also, if you have anything to initialise (e.g. dynamic arrays, surface objects) - you should do it here, and free your resources in DestroyRunObject. + This routine runs when your object is created, as you might have guessed. + It is here that you must transfer any data you need in rdPtr from edPtr, + because after this has finished you cannot access it again! + Also, if you have anything to initialise (e.g. dynamic arrays, surface objects) + you should do it here, and free your resources in DestroyRunObject. */ // No errors return 0; @@ -74,12 +74,12 @@ short WINAPI DLLExport CreateRunObject(LPRDATA rdPtr, LPEDATA edPtr, fpcob cobPt // DestroyRunObject // ---------------- // Destroys the run-time object -// +// short WINAPI DLLExport DestroyRunObject(LPRDATA rdPtr, long fast) { /* - When your object is destroyed (either with a Destroy action or at the end of - the frame) this routine is called. You must free any resources you have allocated! + When your object is destroyed (either with a Destroy action or at the end of + the frame) this routine is called. You must free any resources you have allocated! */ // No errors return 0; @@ -90,38 +90,38 @@ short WINAPI DLLExport DestroyRunObject(LPRDATA rdPtr, long fast) // HandleRunObject // ---------------- // Called (if you want) each loop, this routine makes the object live -// +// short WINAPI DLLExport HandleRunObject(LPRDATA rdPtr) { /* - If your extension will draw to the MMF window you should first - check if anything about its display has changed : + If your extension will draw to the MMF window you should first + check if anything about its display has changed : - if (rdPtr->roc.rcChanged) - return REFLAG_DISPLAY; - else - return 0; + if (rdPtr->roc.rcChanged) + return REFLAG_DISPLAY; + else + return 0; - You will also need to make sure you change this flag yourself - to 1 whenever you want to redraw your object + You will also need to make sure you change this flag yourself + to 1 whenever you want to redraw your object + + If your extension won't draw to the window, but it still needs + to do something every MMF loop use : - If your extension won't draw to the window, but it still needs - to do something every MMF loop use : + return 0; - return 0; + If you don't need to do something every loop, use : - If you don't need to do something every loop, use : + return REFLAG_ONESHOT; - return REFLAG_ONESHOT; + This doesn't mean this function can never run again. If you want MMF + to handle your object again (causing this code to run) use this function: - This doesn't mean this function can never run again. If you want MMF - to handle your object again (causing this code to run) use this function: + callRun-timeFunction(rdPtr, RFUNCTION_REHANDLE, 0, 0); - callRun-timeFunction(rdPtr, RFUNCTION_REHANDLE, 0, 0); - - At the end of the loop this code will run + At the end of the loop this code will run */ - // Will not be called next loop + // Will not be called next loop return REFLAG_ONESHOT; } @@ -129,11 +129,11 @@ short WINAPI DLLExport HandleRunObject(LPRDATA rdPtr) // DisplayRunObject // ---------------- // Draw the object in the application screen. -// +// short WINAPI DLLExport DisplayRunObject(LPRDATA rdPtr) { /* - If you return REFLAG_DISPLAY in HandleRunObject this routine will run. + If you return REFLAG_DISPLAY in HandleRunObject this routine will run. */ // Ok return 0; @@ -147,7 +147,7 @@ short WINAPI DLLExport DisplayRunObject(LPRDATA rdPtr) // in DisplayRunObject too, but this is automatically done if you implement // GetRunObjectSurface (MMF applies the ink effect to the surface). // -// Note: do not forget to enable the function in the .def file +// Note: do not forget to enable the function in the .def file // if you remove the comments below. /* cSurface* WINAPI DLLExport GetRunObjectSurface(LPRDATA rdPtr) @@ -164,7 +164,7 @@ cSurface* WINAPI DLLExport GetRunObjectSurface(LPRDATA rdPtr) // // Should return NULL if the object is not transparent. // -// Note: do not forget to enable the function in the .def file +// Note: do not forget to enable the function in the .def file // if you remove the comments below. // /* @@ -208,7 +208,7 @@ LPSMASK WINAPI DLLExport GetRunObjectCollisionMask(LPRDATA rdPtr, LPARAM lParam) // PauseRunObject // ---------------- // Enters the pause mode -// +// short WINAPI DLLExport PauseRunObject(LPRDATA rdPtr) { // Ok @@ -231,7 +231,7 @@ short WINAPI DLLExport ContinueRunObject(LPRDATA rdPtr) // ============================================================================ // // START APP / END APP / START FRAME / END FRAME routines -// +// // ============================================================================ // ------------------- @@ -239,7 +239,7 @@ short WINAPI DLLExport ContinueRunObject(LPRDATA rdPtr) // ------------------- // Called when the application starts or restarts. // Useful for storing global data -// +// void WINAPI DLLExport StartApp(mv _far *mV, CRunApp* pApp) { // Example @@ -257,7 +257,7 @@ void WINAPI DLLExport StartApp(mv _far *mV, CRunApp* pApp) // EndApp // ------------------- // Called when the application ends. -// +// void WINAPI DLLExport EndApp(mv _far *mV, CRunApp* pApp) { // Example @@ -275,7 +275,7 @@ void WINAPI DLLExport EndApp(mv _far *mV, CRunApp* pApp) // StartFrame // ------------------- // Called when the frame starts or restarts. -// +// void WINAPI DLLExport StartFrame(mv _far *mV, DWORD dwReserved, int nFrameIndex) { } @@ -284,7 +284,7 @@ void WINAPI DLLExport StartFrame(mv _far *mV, DWORD dwReserved, int nFrameIndex) // EndFrame // ------------------- // Called when the frame ends. -// +// void WINAPI DLLExport EndFrame(mv _far *mV, DWORD dwReserved, int nFrameIndex) { } @@ -292,17 +292,17 @@ void WINAPI DLLExport EndFrame(mv _far *mV, DWORD dwReserved, int nFrameIndex) // ============================================================================ // // TEXT ROUTINES (if OEFLAG_TEXT) -// +// // ============================================================================ // ------------------- // GetRunObjectFont // ------------------- // Return the font used by the object. -// +// /* - // Note: do not forget to enable the functions in the .def file + // Note: do not forget to enable the functions in the .def file // if you remove the comments below. void WINAPI GetRunObjectFont(LPRDATA rdPtr, LOGFONT* pLf) @@ -316,7 +316,7 @@ void WINAPI GetRunObjectFont(LPRDATA rdPtr, LOGFONT* pLf) // SetRunObjectFont // ------------------- // Change the font used by the object. -// +// void WINAPI SetRunObjectFont(LPRDATA rdPtr, LOGFONT* pLf, RECT* pRc) { // Example @@ -336,7 +336,7 @@ void WINAPI SetRunObjectFont(LPRDATA rdPtr, LOGFONT* pLf, RECT* pRc) // GetRunObjectTextColor // --------------------- // Return the text color of the object. -// +// COLORREF WINAPI GetRunObjectTextColor(LPRDATA rdPtr) { // Example @@ -348,7 +348,7 @@ COLORREF WINAPI GetRunObjectTextColor(LPRDATA rdPtr) // SetRunObjectTextColor // --------------------- // Change the text color of the object. -// +// void WINAPI SetRunObjectTextColor(LPRDATA rdPtr, COLORREF rgb) { // Example @@ -364,7 +364,7 @@ void WINAPI SetRunObjectTextColor(LPRDATA rdPtr, COLORREF rgb) // WINDOWPROC (interception of messages sent to hMainWin and hEditWin) // // Do not forget to enable the WindowProc function in the .def file if you implement it -// +// // ============================================================================ /* // Get the pointer to the object's data from its window handle @@ -416,7 +416,7 @@ LRESULT CALLBACK DLLExport WindowProc(LPRH rhPtr, HWND hWnd, UINT nMsg, WPARAM w // ============================================================================ // // DEBUGGER ROUTINES -// +// // ============================================================================ // ----------------- @@ -438,7 +438,7 @@ LPWORD WINAPI DLLExport GetDebugTree(LPRDATA rdPtr) // ----------------- // This routine returns the text of a given item. // -void WINAPI DLLExport GetDebugItem(LPSTR pBuffer, LPRDATA rdPtr, int id) +void WINAPI DLLExport GetDebugItem(LPTSTR pBuffer, LPRDATA rdPtr, int id) { #if !defined(RUN_ONLY) diff --git a/MMF2SDK/VOLINFO/VOLINFO Example.mfa b/MMF2SDK_Unicode/VOLINFO/VOLINFO Example.mfa similarity index 100% rename from MMF2SDK/VOLINFO/VOLINFO Example.mfa rename to MMF2SDK_Unicode/VOLINFO/VOLINFO Example.mfa diff --git a/MMF2SDK/VOLINFO/res/EXTICON.BMP b/MMF2SDK_Unicode/VOLINFO/res/EXTICON.BMP similarity index 100% rename from MMF2SDK/VOLINFO/res/EXTICON.BMP rename to MMF2SDK_Unicode/VOLINFO/res/EXTICON.BMP diff --git a/MMF2SDK/VOLINFO/res/EXTIMG.BMP b/MMF2SDK_Unicode/VOLINFO/res/EXTIMG.BMP similarity index 100% rename from MMF2SDK/VOLINFO/res/EXTIMG.BMP rename to MMF2SDK_Unicode/VOLINFO/res/EXTIMG.BMP From f6312ac370e29d185940c330d1ede3e8202ce643 Mon Sep 17 00:00:00 2001 From: RainbowHype123 Date: Sun, 28 Jun 2026 14:42:27 -0700 Subject: [PATCH 14/17] Reorganizing & removing unneeded files I also renamed the preprocessor MULTIPLEICONS to DARKEDIF_MULTIPLE_ICONS, per Phi's request. There's still a little more work to do. --- .gitignore | 2 + AllExts VS2017.sln | 2 +- AllExts VS2019.sln | 2 +- DarkEdif/DarkEdif Template/Edittime.cpp | 2 +- DarkEdif/DarkEdif Template/Ext.rc | 2 +- DarkEdif/DarkEdif Template/Resource.h | 2 +- DarkEdif/Inc/Shared/Edif.hpp | 2 +- DarkEdif/Lib/Shared/Edif.cpp | 2 +- MMF2SDK_Unicode/VOLINFO/.gitattributes | 22 - MMF2SDK_Unicode/VOLINFO/.gitignore | 163 ---- .../VOLINFO/Examples/VOLINFO Example.mfa | Bin 0 -> 113551 bytes MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.sln | 40 - .../VOLINFO/MMF2SDK - VOLINFO.vcproj | 807 ------------------ MMF2SDK_Unicode/VOLINFO/Runtime.cpp | 2 +- MMF2SDK_Unicode/VOLINFO/VOLINFO Example.mfa | Bin 217415 -> 0 bytes rSDK/ZlibStream/Ext.rc | 8 +- rSDK/ZlibStream/{ => Icons}/Icon.bmp | Bin rSDK/ZlibStream/{ => Icons}/Img.bmp | Bin rSDK/ZlibStream/Runtime.cpp | 78 +- rSDK/ZlibStream/UpgradeLog.htm | Bin 31898 -> 0 bytes rSDK/ZlibStream/UpgradeLog2.htm | Bin 31898 -> 0 bytes 21 files changed, 53 insertions(+), 1083 deletions(-) delete mode 100644 MMF2SDK_Unicode/VOLINFO/.gitattributes delete mode 100644 MMF2SDK_Unicode/VOLINFO/.gitignore create mode 100644 MMF2SDK_Unicode/VOLINFO/Examples/VOLINFO Example.mfa delete mode 100644 MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.sln delete mode 100644 MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcproj delete mode 100644 MMF2SDK_Unicode/VOLINFO/VOLINFO Example.mfa rename rSDK/ZlibStream/{ => Icons}/Icon.bmp (100%) rename rSDK/ZlibStream/{ => Icons}/Img.bmp (100%) delete mode 100644 rSDK/ZlibStream/UpgradeLog.htm delete mode 100644 rSDK/ZlibStream/UpgradeLog2.htm diff --git a/.gitignore b/.gitignore index 01880e6d..020f4c70 100644 --- a/.gitignore +++ b/.gitignore @@ -204,3 +204,5 @@ DarkEdif*.sln *.sdf *.db *.001 +*.mf2backup.mfa +*.mfacfg diff --git a/AllExts VS2017.sln b/AllExts VS2017.sln index 52d95c11..8428a228 100644 --- a/AllExts VS2017.sln +++ b/AllExts VS2017.sln @@ -45,7 +45,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BitMask", "MMF2SDK\Bit Mask EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PackX", "MMF2SDK\PackX\PackX.vcxproj", "{29B44557-9BC0-43BC-BBF6-0AB4C9B69198}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VOLINFO", "MMF2SDK\VOLINFO\VOLINFO.vcxproj", "{2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VOLINFO", "MMF2SDK_Unicode\VOLINFO\VOLINFO.vcxproj", "{2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Stochastic Utility", "Edif\Stochastic Utility\Stochastic Utility.vcxproj", "{5BC0EA76-0F7D-4F52-ADC9-CE378742E9B9}" EndProject diff --git a/AllExts VS2019.sln b/AllExts VS2019.sln index 56346ce9..01928f41 100644 --- a/AllExts VS2019.sln +++ b/AllExts VS2019.sln @@ -47,7 +47,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BitMask", "MMF2SDK\Bit Mask EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PackX", "MMF2SDK\PackX\PackX.vcxproj", "{29B44557-9BC0-43BC-BBF6-0AB4C9B69198}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VOLINFO", "MMF2SDK\VOLINFO\VOLINFO.vcxproj", "{2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VOLINFO", "MMF2SDK_Unicode\VOLINFO\VOLINFO.vcxproj", "{2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Stochastic Utility", "Edif\Stochastic Utility\Stochastic Utility.vcxproj", "{5BC0EA76-0F7D-4F52-ADC9-CE378742E9B9}" EndProject diff --git a/DarkEdif/DarkEdif Template/Edittime.cpp b/DarkEdif/DarkEdif Template/Edittime.cpp index 62555fb7..0a322989 100644 --- a/DarkEdif/DarkEdif Template/Edittime.cpp +++ b/DarkEdif/DarkEdif Template/Edittime.cpp @@ -19,7 +19,7 @@ int FusionAPI MakeIconEx(mv * mV, cSurface * pIconSf, TCHAR * lpName, ObjInfo * { #pragma DllExportHint pIconSf->Delete(); - #ifdef MULTIPLEICONS + #ifdef DARKEDIF_MULTIPLE_ICONS pIconSf->Clone(*Edif::SDK->Image); #else pIconSf->Clone(*Edif::SDK->Icon); diff --git a/DarkEdif/DarkEdif Template/Ext.rc b/DarkEdif/DarkEdif Template/Ext.rc index e27e3368..55f2825d 100644 --- a/DarkEdif/DarkEdif Template/Ext.rc +++ b/DarkEdif/DarkEdif Template/Ext.rc @@ -154,7 +154,7 @@ END #if EditorBuild IDR_EDIF_ICON Edif "Icon.png" -#ifdef MULTIPLEICONS +#ifdef DARKEDIF_MULTIPLE_ICONS IDR_EDIF_IMAGE Edif "Image.png" #endif #if !defined(DARKEXT_JSON_FILE_EXTERNAL) diff --git a/DarkEdif/DarkEdif Template/Resource.h b/DarkEdif/DarkEdif Template/Resource.h index e0c57c4a..176d27be 100644 --- a/DarkEdif/DarkEdif Template/Resource.h +++ b/DarkEdif/DarkEdif Template/Resource.h @@ -2,7 +2,7 @@ // Microsoft Developer Studio generated include file. // Used by Ext.rc // -#ifdef MULTIPLEICONS +#ifdef DARKEDIF_MULTIPLE_ICONS #define IDR_EDIF_IMAGE 100 #endif #define IDR_EDIF_ICON 101 diff --git a/DarkEdif/Inc/Shared/Edif.hpp b/DarkEdif/Inc/Shared/Edif.hpp index 20bd0e59..18945ac4 100644 --- a/DarkEdif/Inc/Shared/Edif.hpp +++ b/DarkEdif/Inc/Shared/Edif.hpp @@ -162,7 +162,7 @@ namespace Edif #if EditorBuild cSurface * Icon = nullptr; DarkEdif::Surface * ExtIcon = nullptr; -#ifdef MULTIPLEICONS +#ifdef DARKEDIF_MULTIPLE_ICONS cSurface * Image = nullptr; DarkEdif::Surface * ExtImage = nullptr; #endif diff --git a/DarkEdif/Lib/Shared/Edif.cpp b/DarkEdif/Lib/Shared/Edif.cpp index e65c9acb..9f9fca8b 100644 --- a/DarkEdif/Lib/Shared/Edif.cpp +++ b/DarkEdif/Lib/Shared/Edif.cpp @@ -700,7 +700,7 @@ Edif::SDKClass::SDKClass(mv * mV, json_value &_json) : json (_json) } ExtIcon = new DarkEdif::Surface(nullptr, Icon); - #ifdef MULTIPLEICONS + #ifdef DARKEDIF_MULTIPLE_ICONS Image = new cSurface(); char * ImageData; size_t ImageSize; diff --git a/MMF2SDK_Unicode/VOLINFO/.gitattributes b/MMF2SDK_Unicode/VOLINFO/.gitattributes deleted file mode 100644 index 412eeda7..00000000 --- a/MMF2SDK_Unicode/VOLINFO/.gitattributes +++ /dev/null @@ -1,22 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto - -# Custom for Visual Studio -*.cs diff=csharp -*.sln merge=union -*.csproj merge=union -*.vbproj merge=union -*.fsproj merge=union -*.dbproj merge=union - -# Standard to msysgit -*.doc diff=astextplain -*.DOC diff=astextplain -*.docx diff=astextplain -*.DOCX diff=astextplain -*.dot diff=astextplain -*.DOT diff=astextplain -*.pdf diff=astextplain -*.PDF diff=astextplain -*.rtf diff=astextplain -*.RTF diff=astextplain diff --git a/MMF2SDK_Unicode/VOLINFO/.gitignore b/MMF2SDK_Unicode/VOLINFO/.gitignore deleted file mode 100644 index 5ebd21a1..00000000 --- a/MMF2SDK_Unicode/VOLINFO/.gitignore +++ /dev/null @@ -1,163 +0,0 @@ -################# -## Eclipse -################# - -*.pydevproject -.project -.metadata -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.classpath -.settings/ -.loadpath - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# CDT-specific -.cproject - -# PDT-specific -.buildpath - - -################# -## Visual Studio -################# - -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. - -# User-specific files -*.suo -*.user -*.sln.docstates - -# Build results -[Dd]ebug/ -[Rr]elease/ -*_i.c -*_p.c -*.ilk -*.meta -*.obj -*.pch -*.pdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.vspscc -.builds -*.dotCover - -## TODO: If you have NuGet Package Restore enabled, uncomment this -#packages/ - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opensdf -*.sdf - -# Visual Studio profiler -*.psess -*.vsp - -# ReSharper is a .NET coding add-in -_ReSharper* - -# Installshield output folder -[Ee]xpress - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish - -# Others -[Bb]in -[Oo]bj -sql -TestResults -*.Cache -ClientBin -stylecop.* -~$* -*.dbmdl -Generated_Code #added for RIA/Silverlight projects - -# Backup & report files from converting an old project file to a newer -# Visual Studio version. Backup files are not needed, because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML - - - -############ -## Windows -############ - -# Windows image file caches -Thumbs.db - -# Folder config file -Desktop.ini - - -############# -## Python -############# - -*.py[co] - -# Packages -*.egg -*.egg-info -dist -build -eggs -parts -bin -var -sdist -develop-eggs -.installed.cfg - -# Installer logs -pip-log.txt - -# Unit test / coverage reports -.coverage -.tox - -#Translations -*.mo - -#Mr Developer -.mr.developer.cfg - -# Mac crap -.DS_Store diff --git a/MMF2SDK_Unicode/VOLINFO/Examples/VOLINFO Example.mfa b/MMF2SDK_Unicode/VOLINFO/Examples/VOLINFO Example.mfa new file mode 100644 index 0000000000000000000000000000000000000000..c50093082477f93ac74e4c447b1a4270892a7944 GIT binary patch literal 113551 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


58!+A-B1*9^W_`}O^%eiAb$_6 zIB>frxqkU}iSYQnftNICnT{Qd|I`MN1!=z~Jn0gWM}CVuz&|aS1-7y?{Yzg;V8vX+tL>8p|nl!l+;Sc9v9f(;K#g1h2 z*f8=Jh-ZCJ;QO&zqDhZ!5`S1L%H;)fmvDlR`CPI3PF|595r5xDune8g@k8CYFi!5q z_74dIdNdY$bxx2h5Jz2B@Mm-2tS9z2_zP>iYKuQpC;?(UVK5U2_BIxYh4nWr41bYT zk^sIk5(z_t(LjD6e+e&$y9|H-5BK^hpE-{?$2r^h%Q*7|L5LsX$%VNRFLq!^IK=-z z!hrG`B;}A%=l660QC28 zS3{c*4dTrZ_;Ui$Ks1;g781FN4=0Ss0{%C_x{+`oHYC~?Lmz>WKMsmzeTZ2PV!FSU z_)9J*1BgTY{JJa@s&rV^_ua^4XCHhCT(>`vJ`lZhnA1%4`Vy!M`Vo zKg6La8_o};c%m*`M|23dVdylBmnOUBfEmgNKlMeB&fNO7ZBPXq94hQ zrA4mxXSuajV#o6N&6e3>3RpSss^mvB^t$gVlnMZ;1B!!kt$K&AHtu7`2cRh zNFW{wz-vN9Rl&`VKd}1IaFojl6-LwpIcBePiG~$Bsl{lndVcSkw;zc0cU% zN4|;r)-wL{4gQz~Kt_VZBLSlMuy{tGIq@g@L(xd!0ef-Wcy1hTSl`QC&xaMbE(zbiAHStV4nWR_ix$QLo5K>sGrd?>FdE4TRjncIznA`NlK2zRZ8!-d z5}ZIH>H}YP_r>Bqrp$)IU+ThZf<#q;p?Ex)hy^zn{!!RY1fu?Ye~vH3hck*hitEGk z;f>;t;`?xXfFC%6@6Qe71am^saHIkA7j=;eN%^P|Ybguseh1j2*c1%x^y5(<518#C z=DRU}%mE1UPh$qDlzWNU5vci|Rcs!9e>)u9fx!3WpoqJ`o99CrPx+PSgO1{{IWDLR0<1o8 z`a_9(zXjl5rzMcE`tS)zQ9|uc%=baDd=E-Dt!}5jN2FLpVb?qmWU2Z`2d$18;#pFA$6LwV3`Th->XR6)ngy zB^vBC4@Vy%=Q}vVTtCeBm`bhmY$*KOkrIFq@nEq@(RfV&h2KQ`i(CEpEU++6AlD0c zea_JDLtVHoJg_+KC_tVc$m8-txnXD|O1xwN(ehNJKVM6rX*jRrz zmg|?O^Q>>w@B8=@zlm3ch);?PBl^Rlo2Wko-uh(xE11jSdr(|ZN5mGfrPxwT1&F|g z@66+HxtuT#j}wVTp?sh@vHJ-T$SD4?Y|PIEyNu`hVZ;}DeGaGtf}mKurz!9k{&w^B zhl%PtgV8{qm%t5yuPy@oVaGm~#YH&I91a@F=CPxQuJx9Zsjf4pRqzideSYjs7l&2Q z?_){gFQ%;<6MyObVUqnJjjUO;quViTGUgL3?C*2-wONJuB5YKn;Q4YX&cOP0;5xubt`K{!8^?>o0cSrL z4M(Hc{FXeksz&^ANyp>cz|y6Jbx2k|8FIMBCS7!j0TaORzqh6 zar9w@AAASEA4nhk3Kp<`;Ics-P!#3BI3F5@@}Six1Dz_><4@>)Xz5_l9$@!j_1#{+ z9=>iUnd|!o{l>*#!V|38A3{ch@R{)qUmq%}?~DW|!3+FtdX@SFHzW{&mE7>&kCAz+ z567P`mg&LXafg{+c=wBEdc}PGro*4ycT_AU3@gL%NNdB_hm!T3QLy3>@%RRRV2^+k zB5CtCH`h&lOLi~xk1Yw6NR+UKF{IZGvH&!1J=_jW; z!1{jTEw5(4U$`WGAHnQEJSHr(1B8|!|A+A>OVI0ww-g?^|9tVY3Jgurhd z*|z#{{P9>%7*=Be(f7h){g}@O>^_z$vzl0cqhcWDud_`lHV zw*dt4AKuqhrM|a?;g3rI=?e;D!ov5%V(@w! zeAVf6;#vL}xZvx5;MbiA>}`li^&XU9VJ)}p;V-rukW=j5$1|JZM12R|*W-pwb9EqZ z{T7Hn6VuDz#)QMMm>^yo5KBab>wrII2}culKNqw6Y;a#+IGrr4%KHS(jcI-Ghx!e# zXo$k=I}ozIgF}IR9nP@27tV4tm2&o*1OFi+XUJT~#@o>8j_Vf|&x1fjv-qlyNzN-;3z4gRjXa|U9 zhKWl+xX=>h*D*hc)%OxTPGCRadsajrVkq8&Ok|s6-R8sdd!qb4^l>r059@mn1Z9!; zeoMrkA`O3W9e~>bWK_7W_(y`14{acPK}*;R#(9xwc5_voHWvPo;;|mY3!mT*Z+&0* zdMAZlMe|ddRqKo6PkaTFhy+0WEG_}KB^WN@pV#glsER)aTmCT4i`jh5jo**pE*|OS zv#~A~GQUs3G(SGUpG`#iWdeT|VV8S|X#ui6BurQ%M%0Sd!c)ifKmL+AzJjs-J<{fD zZXD~0K0-{WMPd=MrWfdb1jc&;iK<>0?QzE6Z!m@US8ww-JN{z#Kly%?2cZXWOF+~u z1Z#xIs9R!CB%*X=emGEABZ7Mbk;3^A-^E{aKT70vWZdc#Nwu((hp_oj zH_2PSI<4O_@fZ6xrtmfp^$Lh&fP7Od<{M0_;xDw1#VR_Q8^1c^U1cRyli$N8_rmH9 zEYBm`_|wJa2B1Whpm^UXUM{FTV!BjS88 zstM7D^}NJeop64a$m)|l{DrHE46v|j4Lm>OC7dTt<_Abk@NIlp+)tLpYCg&ME}s%b z^zUKk9(uL#)<@ygRupwc9kBULQuF&Q*XFAZe<@!r{-%hyM}Sv~ko}p`@RwZ8jcQ%- z$K!i^%-ScbIxu@5ujNPK)J{0F7tZaZOTYDH4}VfmiG4e(N`6R`AE*w0SzlH0Cn~wg z7(Zt5kHwymvEMXL@67dqV2FXgHNJP{}j#UlTvudFEuqJc)U%h&2KRk7B;m?{1KvRgCm?MOHP#z$5teT%oI!b1u}%c zxUEN6dwBGU!b9-BeUaXGL*cCt-)g`*x!6n+|LUy1=0>%?vLF!^LNHsQ!)`G|Qcn5`F$S$mO0Mjz(%@frO@oCkRN!doAk-vDhs8MperkH3_f zVewi4kv$M9j1l895GynIlU*D5T~FXnYJ9@l=fHV=9A}PA2rGoeVG^^tzv<&@J@{9> z3EGiUrAZ0!BKn8?#Uq4b_2aUKKc34MTKYtM*B|TOgB^Tmh(ic+fO&u!LieSk5;wjS zYHs`*1Ap?2ZF`rNI}V?@M7;10oEH$ae}NeJ$c;O@RS0fM``%i_-N-S>OH|D1czJ?Gx(Q@b;}(=zo;Rae*a zRC_|cC#0DfMR+_JPCUb6-)arwaD>&YQ%@*HE+M`Vd_fz4B;d%Zpv2Ofr+ki!vXB|< zy_29V?4!h<(R9-MrGLQvUTW=C%%P+()$8a;$Yg2d!ME7EAkpM+zYdYD30~gKGGh`b zAjIH*Tcj>{dCqY1X!`~D+;gFW< zl*u%a#UE#`ot}GP>37sjD5GEAHsSoB_9c4ZjPwCd>Lr^LS2nAG_RiK4UCrKGU7l(= zjChgj+$x5b+5M4^Uh^1API}jrbvGP}WB52aF3?_+Px3t`WloVyvpb51NLqh|Uyo4j zMahRS`YBb&eUy~@6V4MeSQ5jyxkgQNFTByMXI%7WsE1zto2Q{A&sx`9IF?1riw|Ch z+)Fs~jf;22p&RVYv@bgJOj#UXqg7>e-FH8LdN+}Saeus52yGJig7G{cmrKOtD2?vG zEybcl+_Qz-5t))0;p=_Z>cE&axH0eY?R646y?*X+8!Zl=#fxvW30Ob9RCUQ=l%ww+KU&N@tFai=#wR1yoUkq1cWo?qmv1F zm+2I-gt6k8-vCCW(Yq?~T+e;!Wwc*!U8Z zj9j9uy>txF?;yVEz!#|q)k+w7{t9wDBdSH0UO|4^`Je2YCWa4)FL zp5V;~aRk<7v2SMtogqaVNr>+`tNM4?rP68R1ie~AFJtwo@48{k1wX1Pfi=r0eZTQh z3tfk;#*y@nccm&`xSDlUWFLM}xqv71Jv2>4w~TQ`d)MBPJ8G0-I0{W8c&?jX>vtB| zY$)F8N}I%0LV{qbPYxe7id$CjixGZy7vzttP@hPB>VoS3HFu$XLj6=-YUtD*WzvTc2Oq8?qNV`(1&Bt=2~Q_%AIZ^GP=>E7)L#4JZnj7iOsMZv^eO3LxPkEgF1=JeE%ggbF8%(_(S^oYU6bu7+V zIv>T$HkpQ3@nE{T>_5Y-D+-Bl_UyaWWy67<&hb1N*Y{uJ!5Z3wHrE>FRG*e^9=?K> zjK$BL!!sS_>~&e}ODgT&boO&1#8PbnJ&gp4ho_bGxKh((Im(hL{8>L8O2>m1nF*s3uiFGvMF)IfF4m8Wr;$DjUQ)lJW6 z;oG63ubcGpNf3I!j|rr{S0I&{y~(6#y*^%XUS}Nr>#J=yiV6O@x+R0{F8wIv-M}$E zGXapj&(|P`q_Abre?p=`J)W{1TC~n=xpp}aHvQJhz~FM9#_JF?V2dR|GrT)?k$re{ z!Z{tgl8)hB82bG0L+D-;de%;Q_mGmbEy^GB){ z`-RQ0;3)oUz5WNBeE z-JMD*PSclGzY~*m@6%PhE@7Abv$eu^XU?l_z8LxG$SX}=2Tu#!g>kUJ?K7z8QqO0R zvX3o3T^R=n?E}6o*C(sL6Ml<%QNIWrzqol{bcBze$_fPN&Z&!KkSKm=JdTMJ83ua_ z?{;l5RJ*EXi-MpRp5_{E+7Hxn0k=0JM_-cJv&3TqJz%SuM?|Ai6ykLbTM!yWYvnWY z&BdOyJ}ndm1m-VEMc5orPNRWwu9`a6eSYi1<*?EQ3cjywK#d^ z&lN6kaOPi}KxG#qHG;H6(E2nIOLA^O9~Z~TGHCkFgvc?r<$nF(@o&pfYuY{g=-9B2 z_uh6#CJ5CR%jIBoaPqa^kcSJwAKrmirhiyCrg`cx%UW+p*2SD;T;%pgLC(E>;K!ea z-hsM!2!U!^-!9J=Vrv<&9rZc=nQhAavrmnLQ*4>LOIH>%tki} zj&8_>@dBUE(|?Yc)J7jxKkt@@3O?~mcKbghDX)B(eALr z`VbN*SW?oV&A_1hivQ`XdOsx@A|CLRmT972$Zumf;WP&-8y( z71v?4-ooB);8)iDtS$tT#VMlmJj+PO#mqweyR#~xZ3UwSEhp0}Hs>KRc?FwbOg)rT z2$gY6)N-}Qq}rTV9O1)ani6XL%jGv09lC0>jYpy`^LIJpXMx{|C_4}s#49)0MGv&} z)pZPhWGCHSZDd}e&9a;DOqGK3V}DmSxZx3h@nKC@_-&_mdz&TZtu1x++?4z^o7?>Y z{m5*4)*tCJF5@4C$BYaYNcZ5MGlB%PTSS#$RLSqF^ZW<}Hw3mG(wU=_wYpzUn^V4J zC7VPtb@XfcYk1|<)R4cBFtb+paQu8J92(?m;axkejzX3*-ed#lK4KDR_nfXq!!XTep4*RJ*0IVK(@;Bz1ha}dU0I~gzthQy*;R1pt=!hsbF}VB zZ>cXFntb|OH|BgQbFu=R!yO$DdY3u!nXva{LuQ@w=Qn7ALiL15nHm=+aYVK#RTdUC(-&-XTQ zyFe%Hn=bD`)%uy7NIHq z1N3hkuVP{IQuVYpNnQ9Jn4<0a=QI}UNz1ELFihtueYAIKNzoRynW9oi3UHZ?4{UzIrv9&8+z!0PtWMssF5+#BO)zh>Yyb z&JS^z9~8|HD2+L)$av^#CUg=n~T3@%Y0~ZT_!}$+edLkL2?mi>G?Y z^jTzgH4L@_^a^B9BuKEOCAitM(!_g}FyJ9gGcrsdJ$>S^2p4q_ECMDbsphoRlT9ih z4ZX2A2Z)a~rayc-c^q4&dgNsQHFpN4xs!Msvu%(tXzo zJA7=~gaz$i+d*F&Kedsyw(=^X^!Fap0&31fEG1m^j^W5oF#>+)_j8+EB&JlT(v#wJ z;3oWz-t4W3sgIi4sTFEeip0_0jHM1o-X!4D-s{#e@m+q$nA%k>b)AoT-yXKNtxq?Z zoV-}Ecuil@)2f=MWUYW1h zsZm3`x|e>I;p%USv!DBIS12n6eq_beC&dhFX+=!g$+tV>o3_*!$iZ5>wWev;&!w`n@oC?&_`jBxt1v zN{$P+kGc{v=+?`Voav|a8D6!RGqE9TeTx^i^-o7y*g6@!{J}ZGMS~b_~r;wHMaE`inXD0ijMe zhlvx@Pj$`ZY;AaK(!jQ;RYyzTI3qj#es^-zsuo1Cup%Xi)sN%=_r8~?DzBLDM}eF~ z15$smXzDm?!-pzN@9wV7EbshIuevC%JbAQi-FO`VOh4O05Aw#Z*(pDgrZgm1>S^^j z4ASloAHMboC&isc5$_i<&Cc^6wiy@jm0tFqMbzLx%DytYt*wDw>|yrVl)Eylp1(3)%~KJ0RyQ;D;i0%e$tCn+L+4r*4S0>v;Z)`-(} zbli>&og+O8=^qv`P8Q8zz%Rf~I5xe}t!KhNTanq4c3mGSkzm*IS9?d5YyW=k^D$Nm zru3rsy{_psl-JU|H?_$lwc|lbOWok(x9k9my|$P6Xr7$2YG#0HlhDo5@ZbdI0>Y6O zRr4KJZT*>vj)vCNfr`{wrC5(&ihVINi_Wk($1}b*TR7W7;M3EJw_pwEhBG8nvd=C) zuEOZ`dQU^w1;Pwtr&m=+!j6FJRP$rCa|e&MxU2=9&f8Q1s&<>6!{#g_WjzD?nXr(> zDXscz<;TB*~Rrw1#Jz9mTh zQ!&RL%N#8xzLPE7;Je%Tsvvxk1D`$-M5j!P(MrSeF39N=;^@K*#RcsR9b^VO-R$;0|&M z)wCNOm>Yv+>Iqka;ztP=F;T*t`2bs~w5+KYYpKgU@!aW;?qnH57_}Oj#wIIb!xpB_ z{z%%3jkz4eSA3`Zc3ndwg~r=Fw|jg7+CK?*cLRc|K<9VgkuqO< zL3?;^|0!u*%nHpR!N(t#r-3Dj<wv@$kanp=ki@X}N2O0QPd!>{ ztLak?0kSR4dUh-<=tsee#S56Jlx=>u1QINJ;5q@=%EGvvMfh#?gtoc{{>4}w8Nro* zO3a-9jGT+T+Qwsa`mPG;k$q)h|7%o)MF)@6&Xul5$c7CG+jTibSKis?_EBrn=oQ7O z<*$lv>K4Ss`nf|+&*xk`-K@fTd#D+H&edh+GnhS1aJElNQ#n=TqVfc{>SWEm5tqxr zY+v%n5O`VmV(!9MtbODhY8nDFuJz7p@woM*jd|y2rUl)R*p@jB`5MSpH=`Z)baaEY z=)cjQ-}{M#&9hQ8u~78E`)HA_HkL+qzH6=TrrTaROwuDOueG0<)_2AWqzx^P(njiO?r%$f5(^sx`QtFUaA z^Z{30TIVS-A18g+Ux4(;uJq+S)x|(!Ba=yuRqJXapVs$8mlLYhBmod3q6JDad!dx9QIhQOD} zl^-5rX}Gd7HZ`{Zw+nnQ4{NtwDG-+@xTnfqY4$ST`We))D`Vi82unyW$fID5k%!t@ zgX<`u;-cW;c=YuCQ(L>dknOxuqel`urYRX zr>DlgwffrF;yA8R@Q*NEvQ5}ddwOBxDDl3jL&1{FJ=oLQu#?!_F>NrSsvzCO<5`gGCSI zyvtmohe5K$T58yRSX&E2iwn%tx4`=>>o8{LLH1{V!8AK&4Vrp3C|{<2Nu1lvvfzT@(uRbIQl7lXLd$~7^Yc6+<0Uc^lZ$W%vtgmcK398 zt!ZeD>2_?}_2y2OhpP6(Os0di&G{@}D-~`MY;9I!X`*@bZ^DRS9-3pyjpEjpM0K;X z>^R!n=#(FY0`IU*rbkKPf$DiIdrh8hv%$Od!4Jt9y(#VtKBWxT2c~vPyW)2AJ+Lp= zs$61_D){|-c{-YEfkT7mw`4$U_x*_s+sK~=`aIB}21`O(i&$u%EKH7VrWq8U8IScp zbPX^!AS(j>4GMg|>!KKL%P3dE`tv}95;#XE>n!3!vvsNBAi1M|o=i*2$3{9e(k-Pb z`Mn5ckt^Y!Un%alhI*LIZ6ZZA-|UnntIJJGs1KvBT(UW>fW7PEf%tbQf7l@z8@*_F z=Ct{eU!40+^A8B3zoeQ0zGlw9zJxCX?$Nu;TN^G+jrs;!pIKNT?(=kUSy|o+L%0F| z5*2H9Ux_+6z3G4Gey|Z7slaPmy3MrTc~*5nSCBt^{u8?#mVo8~clK)0+&Nb|iTgnp zXV+jla0kTIIiK@LUh39^UUl6xiB=v=dc;ewv!)(r?uUUVj5dI(iu(Q`i@?1w&W&?! z0{;eFr(5fq-C#RYF$}L9Po--}wWYyffff9H)Os-wntfA}RFSa9x`O*$!FvmWnMm8I zOQ>w_P;_zAV?)AixwHueq2gA*=4?mH#x*Mq-C-areRU@tgQo@M%cr&#^4MwZu;=)b zpP1xmeo7y2Zii<@UaY8I+{43{61Ul+;P7q!8GqB_Cy({FxDnId8Ui9NH?-M;)b8xC<&-3xQ*83$z7gR9x91Oof9y#N_IH zI6L75+nxI)AIck^ODXI~}N|Ge^DpuUq z-5fGtAOCTCJ>Dqv!k_NO9XUD{RsPmU1PS_DO+mq^m8(GyRxBAHW1WxRlA#yNuTJww z@-yH|5mjzJSwKXOgkw`gEOv5d1z;Tl{In-MJs_CDYmUK{2`NL(>-779lO;`F)|Oi; zAH|6l_y70R#B2(`QcG^o)%D`e@230iu-Ix z%lIA@MTE(N^D5a#Wk1~o24gQS^nWxdH-PSJ7e_t3!y_zz^|&WtFYjAQ9A<2+@hv^` z>Fh3PM$snjbfK#o*&n9J3_JOZ_kOB|j3?-@+ff%8g|7S!?#HC;b3wY`F~eHZSt)*5 zcUsZESIN*9Jo7}p+7=N(p>4Vua(|du?NKhP;Db4_4rL!7zu|5sJlUHD&hZJgU}^SA z_`19A9l3=EB;2t@hd&Wqk0(kWgb=wlLSJH?k?=t~>*Pk8Q)}9wPW~Tb%_93<**n!WKFdq1b6oY6~2YU2YKO60(a&}GI&pq#Z8!z@u zfdDmUVM$MI)b8E%T0ul`s5S7nA`po>nGNE$^WxRz}>pzRV*ELi9oVYj_+xU8&Ew7eC~iJA=g zTbXTayxeYm{)x&<)*_ICzMb$1iT(2s&yk?pQ(a;NgrU%8XV_j-$=B>5f}b7o)arV! zBp#oYyuCIMna%>YOlnVRePeI4mF4IxJ2AU8*~`_(&1M zn_8lP?#5da4@Ruab1*;P2pG&Ii_d1T8r-M*M_q0GJrB&SZ4bxxsz%k###OFZEH#ON zd39psl-lp7+@wE)F&e4bm6InFbGC=4qG9Co4dzh;ok2!_>xiSeZ;kDDv-{PiI1U9J zF9#JHjeimTSvp!%T7>|F=5}#l= zg#kXQPf1R=d3czhAd|F?H52x(=TytrEapuSdkZr~+qR3s#41Hd*kfNiyKVoaw2nTg zr4DCFe<5}yBy+jJ{vhKVDO1QG-Im4TnzDYKY6*!LU30e9CZ3qzed?ZwDVzJkikZ?l zE#b%674%+oSx|ET`@q`jQ%*iQm1t$y4J|(q9x|;7X9X7AoXjgf<*5qQj@+n*W z^qr0$>E9B_^K1z027O25apt@)Ni!ajRwmV;us43H2+nRPz zRLpgzlD&9|?U|F;l2z@iJC+0P#?Atz>1fg8WxdxoyP0DTnU9ve{bb1PaP@h0e4!c87O_KxvK@MnPx=bNX&ay-N2k*q_}qG$s1qH=|Z-%g&^ zRAXop+Sg@5!p&pCthDE*0UcvA`A56=u~Z9%`CmIKghCCJI|{9#JH?%NT#$KR__}x_ zjf2_T7z#r}hNmP&{~7r!M76@7Ijm|UYz?%u&J)+vb7Y+G!)c*^gzR{g>%sRwcT;)gyly8VZFoRQf3wnhm9-US_BRnDT^Ym z>tmz90u*S__GtQc(xaHjF~o<`|8hHycR1uJycyo@o8`Qs5-d+X#XAW`R92T?nYJ63 z%g#AtVP7r$)i~{==6gDDC(D`q3RdrPGi~x9td~k^UpiiVaV`A#2F?eMmNfOkj!;pX zPfrl&7N+UF$v&duV}RF~-J|Lm;%)H7)-?TLh8 zh}JL`vc`Wb_AJmW-G^kFRLKKzh+4ny*$-XfFMpXP5MT;+nng7rwdYt-S6yLmKv*YL zQ$tRw3RbSf*?J~CZMv(W>qDxVgyvy(MKf?tw2iOl9KeV7E>*STHq0y&#q}?|=TuO) zgK@R2^gWOGZM#dh*qA9l&+rrcq8DlMyw{u0D^BQtb!hG2lvh|GS6(<{ID*QkM!*{* zEOdQ=DHgy0b#$Y@`KX669~yNr`D1fAe$2^4(0_kS5U>9gWNu+u&crbBriZ~K1eAlk zZ;z^TqY{e5m)+)fbiOoQmhog=5nuGBK9CM&fy9pKym2gBpvB_;=R^;xkT)PB9Y=Zo9jOsidveMzY6Qf=c z=r^BUQ^&JD)qv%G6GjGje2#)oYmmOp6$`4ByvgVYVtB_?DCms93eHTwxtX|DEW~zx z`7(>&Q)}&=7hmK%&9GpycC3D}4x}o1E#;-U1b1iewQrGlHqP|F_zRiz^mQ_l6H=e9 z4hQoeyOYMQC?LUJ4IG@)>PS&Av{>T<;c??&8C{JT&gz7TC=H1Ag-Fpne#3Wuv zEkLI(IXQ`N&n8HPPy`HxWR-*1u+K;j;=DNL<|Z^W^M?3e!8-AE;9hA@%os<%*v$Gb ztp{hnAFJ7M#cg(iMQyp1Begvf@wY9l0{m{THda^$yr9)wJ_U`!t&IugxeY>^sd0V6 zq*1A7(I~`s3hB;n~`K%E5>e%i3|kKm98DEwmsfEe^+ghiBgAVVR(H zR6Hp2j;Xcy*sLs(TbyG4@%A0nLfbt#ecd%KoF z@+tvjuzmRYtuU!FL!PakMD@q=x-N|p` zjuEORy8|Lbzk)_S{iGRE+mF8B*3=Yh3nc6T2S5d!m-@wZ|58FYJxtlr9Nc@~D{9Ms zS4k|jNGi<|2G|gUGILAdla##o#Y}r`T?jrc*F)wL8Jywal}XJaoveK2)g_Ek)%;W; zCW1kxw{h1jA=b*-Jh&$lzZ2@=^S2MxiX;Pjut3O{27M+xH~rcJA>EC|1@f}EpAp;Xb4f!vF`UHWd{6w4rX#YHe|mF zpeSGxcpBj;k_|wOxrr+0eYP)pY$|_nM}HQ5fp3N~9hNAb_o^C1ks?g6Lw7Hze?Vm- z+T#BF^u636$WX*#vMAT7D53rL5~HyR2Uc3jpZep;4i;+-iGyR}x6KA}qS9I#zQHLKo`5qJ-xxmU3YO1<0A4BTbXPD;ez-Lne3|8}>#lTVgB znk|Ie5v2TQ(sxP_4@83cGswn}Tau96Q~{~OcuJu|z^o8h?D4SjbWG}~PHfNDboQ=f zLb%lVauO{PbgHv_)Vp1I{U=$w+m}L+BpcUcU|^-)<3VaW3yXz_Jw>$7rf%T1m$$zm zizX8FeTl+!IHucdI_Q{wdU}GFqqh2Jxg91)HCmT5lkR;Y>Xt@z$#FUp!A?SwsxK%g z*zD^IpGMWGlJr6PGdczaI{L+>TX4tl-38N*q&a*w0Z#sRr*UQ3w-J^ST&>7YY!Sa z;5uf~&(Ic>p28>xz1lhA|C#h~e_0sMMD+t1vevHPbN}X4{con>69z0(!0WB~u!(~t z;aJA;bM)S8FXv>Z%(BxV(!q%nInED@yKY<_2G=eOFshG=E77HL;UGlyZhy0SZ$#y zg}9%oNpD5@k>p%BYwD4B*cNYhy$RJ`g%_XBZa*s$rSMt zcoVRcgavX*W;YaZ-n}X&cgDVzc=i`wSTIOU-#@Z-=U>td7tb)2ks7CAI&+-jbE1%jb)4CT|*{9 zA8EbHOj_-CChu#Jo(h#NNVfz7)Yd3f;=GdRQT^U;NamtNbm*(LYrWA%;D|and%M3+ zLK>PdUhl8k&^l0L(y9K!xMlMe%olz#e|rns8_g7Em)KLu{>RlAPaZj6?|$^4J)F#% zM#RzQeQ{S!*%OX=xOY5XoX?wweJWf~^CnZp@pFb#58kMF0lMut^X&NS3^z~hsVQVU zf9!Lx6QyxR@e~pw5u1L)MSN8z>~Rg|CAla$d1|!O=(Nygwz4=wGfXswl_D0l#clm_ zz@-u4`Qhepc5rqGabj*_T1`_u&!QkmaR*G{^jf``ht7((poMU_bH4ZQ;%IJk0*26d z;GZ*fu+O8?1Fxx*n%a1P9EMyP6_5AmvHoXg@wKn3`LeIbxSBxO#-f>-Geg^~tRpt$UKm}nuEb2W@QE{om2hT`AzN!|juxsJBHy9ywWhDZWgjqsz zc?A`la(|IZ`tj;`b!Gw{Q6@1gEcI(H0{xAB$&kYPm4xv|rPZ)6&WKuJouYXx%%zA^ zfS#=118RSPHDQtq!?CdEA?6bPK2KIp&%gkoh7jjTRuRLUn;ZG8VqkJY!-i`{i&%l9 zWQG;G58an7(&ZQ`0;B10IX;L00I7O2dDP{2Y~hhzVp9t!~o!vaWdZZ z@-xS4sR0l4v<`CIl1(An7ubS`%S1w&^*?d=$leKY_>Z-D{-xmLhotQ9aEXa!&}C~$Oi z1S~Br0mH+?Kx=C&P*_+9Bqt{W5fKr9x3@Q7VPOGiYH9+Kl9B*7H#a~490%J#yKYQVXzXCIhsR zAb4II0FOlxz#!uWUSN~K+YJGFdbWVd$~hoCeHh;69>Cqb5#Hufc$>2US=j_YSU4Kq zZg+r%#RQ{u>Sy1Ytsni>y`q^vgtrH ze>~vN0s@?=+yM(B3qTh`7m!6$1cc#<9iCu&djJd!24HZ0!Q9;en4%&8qooC)aPI8E zX&6qma7u?$D4ZPNqzNZsIMKohwgktZCjo#}I>XD51z;dr;L!#Ejw}FR&JX~4bOE4J z6`miSA%YzM+^GP-ga`l>G2msO!Sln0;S>QUNdR^U0FW&JSc6wOR*MGoq@w|~5okcZ zI~tH+fd)iqq5GzKtqow4uLq*1Hf)W2GAPf0c7xs@!%C>umAuWye(sw!$9d)ArL(k3OEed0Gf@80Dmbr zK${M~N21}41i>%T8BQi}`sczW;lvLo1~`!cz!JsJKwr}%;R9tHr^NCY?+ zVgM%Ta2_2|0km^e0K)(+z|aV%d^jc00<@u20M$Rt*n(d${JsTh;apCKX9x|2GuZ)N z7rZiYaR3H^^Jfo^&sHs**M$IVE*pT2!TCJ^=NT9Tz-rwANWKlQ7HR?cFrc9UdvLj0gVWf52+qsP zEnwgh0t_5o0t0LCZ+MuZfw4W{5t0nt?nMB%YyQCPoC9z>W&+&yr~bDB{(As}|G@OmfAH;>%fHGAev1IF z;R*SFQ%?UmAL$?E^f-0~gH_33Vq(5!>aV2KPeMSAy&&9|ajmCloov1#TM<2tTWurO*mW<1x60-!_wndM1YU_zohH0haT$BWdf>#{ zYubBms=&Fb$0Is_hC0;yrK&(I=-=L%pYx@S ze?W@QT5sBFb8e*XF!mC5sJ-vKcDrXCkj`6+Fvb?5*!NnX6mM9f#)Ubr;8PAfrZ(n}GL_$Yt;85PZ{L&QWM{zf8|7p#(s**;P+PL^VJe&;Xuc>b% z(2@G=_e?kxb8Z z506(on9PO0reR~7iB5rDULUlcw>~a`##9%XS48|;O5*H);8T}S~t$n(N$9P zKc<^OE#0D>F;R&kUuTj_*}0x047i<1;Kb%F{8EV^#lo%KPwsJXTK(-ZI_ZS>r<~BL z_NR&_z2wkt;sAQnU+<`Kjubg&>A`KWq0!$XPZ#a$a_uTRTy(hj@l+c@cbg3pJ*g(l z&l}N~*Y0Hu>1a>qu46>q_m)S27(Dn({{vQ06)Nvq_3yJ3P8rOhuH_-XI*QV#G3(eL$m z1N66lzfLk&ADQdCCQN2bzO27DC2ZRi+_JgsVikFTzj0rt7KM(og3b5DdLPg^@~CAh zE>{BT`bXx3;Kx20fBn<8)rpgSFMrV6Vj3ce?D)AbnOWc&^PelXYCOqnz;O_43DR=w^ z$49T*Anv`>e{h8y!63s* zsx}^WefBP9p#(@YDwb_j&iHVWU zO4K&$1o#%xoi4q3gs=p8EJVz22t90t99u`&lD$KNTfYn1iiEsUp5RL-8V{E&opQ;zK)EUq~aro5}&xSx=-=S>d(i!vBx!kqbOve?_n@$n_w1S!o-3ClYl>F>E8 zy2!CZt@Ul}lWD@V>CVEGhAB{w?*aig-9I5obz&8Cqf&Kkc{2$@%GfAHOEh+4IG%zkiK#pEc0Q*OHb6;tc z{g3csz;$U3T$e5_q-UMA1^Tl4&JSY^s*NJM{I>zanFAvZQGk7&o&DjiWUb+n;2ee@>tRVY(s z;#2@wxo%{aM8+c$8n=27`RPWf=NJ9r#+gLj%;EQ-xhUIu1EBX8dTeE!Z3j%bZs(#) ziWVofM&7`~^M)riwo-*8X^P{M5?`5$b#%omp5~Tb`R^myN( zHGSAi_QessR|Y#(Ik7T`6nT}e{py(&ehZMAtoS`kh2Yrp^{CkMAmU(Ux5G5*f(=0#~69%bTui!(BR zsHiDabyLg*x@VN`=hw@G<@}s23anE$`m}wGr23+a85NH0NBMuT?fO3yGd8@N#QsNS zf&VJzS<%DNWL|i1{5odJ%yZrGZ@^4k%yg5y^7Ygh=yiUnh z66z57Aa3O5%hgO3@619VR~Q(u_F}1FXXUlalVd5$4p;PR1N`kRt`XH9pX4g77i#Lr zloD3x_`y)W=Wq$VFZsu(`iyhBU#Vd(cU?7Q@MyGY*4FiYMyy$ZuFUq|=dh!wVZ;;5 z5b#9ySayg@5c*RN9VEmBIp*8r4<<(PU};9m;9K@I#QTd#nH~`OkLYcgjLdFR;4b%F zB6YU6nD?RPI@-yw`OJ}8X?2N?zL`|@i?D7KqCsI>1cp?NBDMF~2Dw})7e+~zFDc(D zzDXJ;G6H|EimI6_eCOD>=yJDqI9>z6=S#1g__N?1>68&We{wPZM9oM3>SOX*Yt$Tl zlBj=R&s`_@P4!j)@@j^UzH=|H#N@EDhfV#{M>MnzVC9e{u)u{p5+##h+i$?0WR{MD*^{Dvvwk2Mpg zZi4q)E}@cpuMmUWze+_aX7l50#-h&iozZ^?5b1z;P$vXyMX}-Zxuz-qu?`#iA<*e+ zz*bczzQ*AiGrSgmlpvQvud*p{(r}g_pWiDOz|+#RXUHreq^#Pz-m`IH>S9zWSuLmZ z6up%!Q1|7HilXgC%S*(HEb6VOuYoSC$&f6#rfyr8=9mqDie!rQZ@Jm?GU9i-_Ra<; zj7h#@c*haUm1Sw(`1oV%QM?1zz7k|^&gC09&}!7FTyGGjfHGut&Lo?*L7PK|?`rS? zV@~j}u^Is;yMZ0ONg7!`vHcGqnL zj=0?V!$@8j-Z|mK`FF$MW2NY+Eij(> zO*H{)&6q?{6Lh*S8Up z@0Pp$X)y3RcQ09!-No;^w8gMwH>2C}(OJ_yQ+K#Zwc^gVqI)KKe9w?H%3G91bvNh} zZj~C3F6f$U&T*H&sJh^@cPZcTWONStTp%%kKhp1A79L!gaW(U&wpo{(pGWsyy4{Bh zj1twX1W~{4%8TM4@2S_&>^$|#7Kzi`BGjg-&=w~b3ScKiX`~LHqgUHtN*keMJ5u;q zy5^#C{97jKT4?1cQ>V?0z3uzVVfz~Pd|9*fiB;{OIm#XZgaMbJ;W@+*AN}KD*qt6i zhLFvj{iFjJHEfa?{m+)eY3N(JFz>nvk(8?)81P`O18) z`rDneYIf>POd|dcn5$P9`%T+M z0M58J(PbJYv-dVERGz6gcOox58^+iP>y*2Xy&DVKFr&!{=-uDc6jJQbY15{S@gmc_LDxF*1MSur`U&%OQAOWsyk=bUsFp zpp}yWPi|4ga^Q}yYKrKcdf?KmC~<4`0m)3v-J02C1@TEsxiH_RjXE?d4#%gZ_tK~t zo33lc@MI`hIuy`7jLFzMPlHPH>82Vp??keG=d5fMGmiM#ZQZv%59Vy|<;~!%h|H-S zR;R<%;x)1(xMPQd>PwZ#n0HV+aWrG`45Vr7&M`Wz?RZ&@D}G?xNnUuNi5EoKL93ZD z7V|cj?Nvj;RcBEZ`daKlx%IGf`tfa)8F!kd*0pdJW9Z;It9LzMbDlg!Bd#J^W~Gs1 zvLsmR7}s%MSS3uXM(;fi7-B}F5rxKd>gx)ds9j>Nvfy$O-q0EV-Q*(~+BxLDJ&hK? zfGfsu({z8xNqT-W>xB@Nn}ckMI{mvh+$ug1sc(ERiR+5>4}7;~4XEV~PZhCe-vHdt zQ+ls|UkYIZ%OJ#s_;<1t3O`oVx*rtv1wP=v9BCzK1&d&u7X?BFY6u_oEF)^UyaZ`^ zDY&`9g5P%8meX!#EzA)DnvUjPIwe9O;xk{N9p4RQ`9K?Y#@yYvN#uR1oGjgQN50jX z;ARCzksN{sk=(v4wZOH=dur^r0q;;FCvJC|K%@nQtRY?R(%SCrkxI{mDDLptsk7qO zec3_6xa_plC2FZgYzaf~31cR=w=15dDhfLvwN7nT^t!#Z^e`xV)$sYlZg=yjeK3Zq z7C}G#O@ZO%?ZnO()=?yh9#Ln~ClK&NC!076grw5!CRS~5 z2934f-FLd60eHY!#iR1F*ip-ApWV7ern8t(t2wUw`@G5;`~1ZQzKlP;j@D(lTQsCE zMm?SKEcOWoH|_43?A>G(p|4HTWLETjqF_wDTVk?(S4S-|#Hw9ea0QqAAsUdz6?5gt zAcg?n*IqR!)HUYgwGO+JJ0Z``bH%`4QNMOQ-Jw-Limk4N%bo)x@Xq6wyJT@~cT!MVQWf3Ym9jn?38y8+jZQ3bRG;>`Q|p1=Dth&5 zAj361iwqAE<~Lfm0!{BE3b_h|-{a&eRzablK`$o`(Bji~B*Oec9FERH!E&a}4*Yq( zy~ibe)ntZ@%hri}|%ObG*&UM-PEk8T+`DAgfDp+lHt?5(%IS zkf>ghVa)M}^9PQse(~2=c8ThfUWTsRyy_Q!YBMY+@gl$stuiDt>H%hajSBr$ zl7CnSm4DN?YhQVRp^R>s7S3S_vWv8_DO_-{YKmos%<)x&Z1uSbpR1IZ?pMoHUoyT* zIod6l&G2FU+54{f(fIBsyR&Tge*UhHJ)M=&>qEuGs^9uBj+<-no!ghsDnOTLuA)28 zTjN5xhuin|y*xb~enLCf4ILFdu5)9Nn4wLdjS3R3-`CT5$V0sob^(rh2#0toqQ2Z{ zwX!d4*r^av_DJu6_FO{MoUO!+Nb>QzvxOQD;^3}-CfL+7h8oX+)eNZT{N{|Us(B3O zB-#g?>Mu^R`i1qivd*++BJHeAFqdzYjd=d5dq?c{6 zHC_?k5sB`~x}l-A4NYDza>F_Aaxnk#ajnrNNzU!W3#^2LHMM!R@4kp{i)xq8!3d?% zo@=;9vF3MR0j%bhMY0+Ku=;Co2)PDA2*S7EP#7>-3gZKl8@^Hm0Y|mS*QrFL3945IKq3_fF*`Sd2vn_bpoJ6-Knk67g zl45#&re*rJPpXbvU9vFUy@AC!o)$YkqT9ZuI8g!=!rrOYKF{3h-fR%WDG0JH+Y@;c zEV87N(rK!MCW|&-0nHYLig(O@(lVDCv$N&b4_&>Vk_>xot16lV#45vMQC>OoICtsp z1)?#IRjsa1bkt2aUO&}Ge+oC`fqR^rWZgv{YaZIWO;0YcMs|_n)fAH9+MKHPzV-+M zoiOX34}l+{E}wPkL)1A{qMGQ77mmgc0DlSN`Xv7Z!>ok9`doA_@o*1I(WMLn#0-h@ z5Xs`Af3i3h2onJd-P*77=Lw5_j@LuD$oZ2GF@GYo**lzLyi{WNNu@>AkZJ%_HyFCT z-ZEHrH=;*ImXI{y38xBr*oBv5GmSPQ)(N#lRCIJIIk#Tcg8F@@oSej>27lOFUuWl5!b$i=#kn zzJ{*vD=1j*`qevYCE-4BC-5`S;|=jLAs~780ysv@@_>%?dAP}kFLPVhgWF>lLJKom zNFwgOi#6%K??)0_CC@8GKGa|W1Vuh)?-pk!$w%mMRZfSnlMJn$kD5tglz1DMtCngO z(ff%cXnDtjCd3h)tV>;6}@zu z7(B+=HxRoe5`sv+R{Uh85dk9PUdlg1MA7}}C(#4nA3{W;z;Rl%1!Kf1ek#hPRqdAYx$MtG@S?*Esuc*5fz17M$`*l8bVq;JziQ(pkZ?=bO+d#qQP{xVO&0xC##BG;nucq86!KiFl^= zNj&wrOVa7JfzP3yrFul4O)8urj$3Q1R(939@84yiI9HM#DBb;ZuI}+!x724lvfl3u z65B2@yQnDX1kGDM!_E#VAjJi^i*qsu8w1?^$AaiMHbhjnT91qkIS~IPHdG13hA!Dy z2M?<6*SQNH+;3IFV!7%EapgKMCZu(^81ae4WA)7?|KdfDiArOcoB1mDO8qwb2N$c^ zX;5P7O2)WAlk?(a6Kqu!9Hf4`b1(5KLF^%if|qAKWEqcPw6d&@qR;f^y^S&zmxPJ5hL| zeDSJ#C(HO&Bj|l!v%XBIxjNKF@M(CH63?A4)8^Oq{4UM1^@0ZXJrO9!$-~}RDKzI@@P%AD9cILI>h!_I=>50sF^L&-+ z<>A{|mv-Z-tPUv4zbs(4vF~`{K4u=tP1Mp#yEAWdu5YpW70$ip48?|m|2{#42Wb3jd4K|rF8&#Evo1atVJ+hwhw3{t<(?s_D5HhbMGThu7 zY8d&SbXIRsjNskdG{+hx(r}Y_JG+5P)hT(pNxQ5uqEWjnE(p`RG^srnW1DoiituG# zIJN%GvfxpN>b?Fi-b%Y-(RO*8Pj5e$n0gvT2$Ah$oU#N05E*wj9b~z5xWuO1BirN? zwV=AJzV-BxMbHbdnil)DM_gMd9Kk!-48164#fnft!@;7s569@o)yrb8m^X~mzs8@s zH73(yWnU%o?*4@yx8%+)v(ENucgAsg6i8q4=u}J*#%uA1S@&q!@$?8EzSs^>;sWg? zffJ|(*RDg2@$b_>1+R>~e}v&DGUNAFHmZlgZN>F;98Z1+9>8?x6Q)-IO#dDtLhhXb zk558GDX;kvGba!a{CVe05V<(I=?xfIG$4`yKaC6#?b|hgTgy$lt2P4}v7wffZOsc< z56fJr2o6CXMxTL3&3Am)Xr(-Y)VGaF8QvRy?C@d5rQjezRg2(TW*5)eExya_0-x7g zG^gt|6Lfq3uwdt*`!WPv|HRsD^^G}-7UT%iZ5gkX-pgg!goDNW(hyNBqn;?WN={t& zyumrkb1K(^-Pfkq9pAU6Q_b5Lah&CPQ9J(PMR?MN?!-Pf0ZFV;tT~k}&-gpGgsCz$ zff{;G!dT3h^mVl+Nt&L{*_@$_3*~lxI6_>}LmARdXDueoNgS2t{U;P80y@j)im+d2 zuj?!mV#|{zC)@M`X_t4s4f8@s^AyryZ*5hdgSbU6Uh>!yzCnJ~ z)4)r(x{B_g%h3z-Fg*{ahQ2gnpWA*wdM&9?Eme{RRk~ao(u}h9Y|i#fu9;uSF2m* z7HXJPf+yICv7l6r0-XX;toT_ujrk|wg8 zsWrn}Rl9&($+imcuN4=vHBEVVg4cK%*5v~j%dyi8DW%=0@#hQ z8I7Rs`52n_t+B<*d`5;>f+%Y}-jiXXznED^3%MN&ysKTmaKHUazkdJ3?LxVSRU@=F zBcBtNN0VT&)K8G&F-+>gjBc#p*5g}7Nsh%x>KD>$2X~Tba?$b&-1dywS_o_o;g-ra zm)-+eKF(<3j%48HOl#sk)J{Q>&+BUKdx}avXPeP^HPTR%-m-iCbfUrq9)`$d%g7Ex zqvG@-nh2KAdKQ8+ympFw6xMVENebeu!nWLLYSIq|BHxpXUkly28vW=6YiJB!O|(gm zj&%C_W<9D%e`9- zJ90VcaJOP~o7fUI;o3(URk?`ry>*?WpxCYikzwt!y_KL2Wo(Gs_N;Xxz{M485U3t; zEi(%rn-)W#iv*Fb!sgB!^HhaVi)0VxIN;8Q5h5;aIR>;;2?o%o*L8niHA#*22J=bf` z+S#b84dO0eu(%O|TX2svdM@s)qLm;!VTKy~$%AkUyvOBd{ps*g9Un=0$oiQr=G-uPz&+QHxd2%n6?^_)q zAcp}F9MTXaY#8XXaxg)ENfTcl4|PRn{TTnM?e6u4eeQz*#wLN7fqm{TqVV|qhaAwR z?4Df3|Y`MdlP|?wyHc^QJQ}D1l|paTckhB!oLGcUs*{!}k-}-P;Te z3dNqXRh+e@v((T>>z~~??PllY1vS?4YvM1jd={y0RQ#NY*>3kqO%tPeG+xI!`k5yL z&t8=&%$LSQJeHNvLQ@f(TxgC`d^nuYLUX1aduEXXEvJVPXA#&VB{ObWGgEToAjKA23qX>#))X-=rx!SN?|O^_hXlK@sC~yk%+T ztQd{Oes|TD;=}X$6wQ=hcduy`Ikm)nsx3yf&6qN_Wz6egwaCdkYA|Odoh;$BOIQ9V z(zV8}d97{grbUjc)|mkj>9+R|Kd-U-eQF>hXVNSzu9SWMHg(E4m9=U88Do?RNuWMS zRZO>5XfYdE3!5I+v~W$<*wfUj+=NU4Bh#AIbzY`GTH`6)W~B5~1Jd&txDe9Acyb}6 zXILE}J&XOU64b)LUV1^WF=Ojo#XgaPqFe0;b!pv?q91BRFt{u40LJ0@l?!f&jlH`} zrfwtB)XTd>`ucVT2DU>|TSqgROwsuVS~L72p_z<%l(R0$6$TjspJhqha@vImo_=|8 zu2$&F_K|GZo``AadA1FqJCD)bKWG}|ZTmUcuuGYuU?9rMX)?HEmzQ1T?m@MP(;6@? zPQADi7O7*L4B?{wh;ottbAmlpW#vJdzLEb%_6skHr*t6HmNClW5zxci?4mwrNgNWi zsdvcmJys4XA5?*((=;?(Ql_6|v`u=RWAhckK@%=3-<7T^d-E13bb9P5dKG=#-1#to z$4PH)clR1h>t#Iq^#Y+YB#~I~rZ9e9OjPhWiIr@65Wo95wzs&KA{h1)K4q^HWxP5| z^7+0P`kQ1{^x69Rm=Zk~*!bAR)pN)98|I1G610tp(5r?)a}&DJ;;uLB9p+>yDZg|h9g_6t(BA=`>K0qIT_3{ch@mfSVyYJ%yR!3;>SGkAaPv4)!fAmVOIzSVNH`*!7;z!~F(w^L_yDT}sWw^t zSNm9vnIr!p@pCH24dx42=O*^ag7X2FdXBXm{IRuus33E8g(XNzO z7to5`yEeN;mC1nz1Yt78BS!{J*A6ZO2?9v7pE|)@j`DJPjQcw*u(ThZr7(Js84(e0YGAMo5Ms8NN#+XFvu}Ll ztgN{?J|1GaqGFns1_GWj72}E$X?w_L>U)q|3`xmdY)ua-T7PIqW2cQM$CbubT_E+{ z$c!w?vOKuzZ+_VmL!rfCh}<=->?XDU%^LJHg%)(xNt;rkIr?&B37V&S=Fk%Mz>qpa z)KO66_O?XHz<_4^La@8Kx^qETMwICON!8p_6J+Li2y$MxvL12 zGdO0YBfSevdonv;J}pjO8(uAlKDxXRjE6tmXQ8SYRGN>YQAiB3Xm4>9%DUV}DBU4S zG?s}GREZ5T~V6(jGDJCs%IULT*QzK}?uu&GU(?t8Pw<`RW;>;rHw#yXp(-SKe2 zF54eGsk*7ORN)8EORaWwF}d{Gz|R>+ zG2M5)Bz(g2X&(`#&|KR*DjA8!HQ!{+7*-Kb%=_a~Ebz6(8}EJjX^iW9t??aD+{tZw zwY}AQnMYys&TY0j7J6r9)suS<88N+n3)Coic#kuhdMgOnt;KrC8gd2eHQwf zB+V|bbC?X;941hY5e#^d+p-VXfb-tl`+9G8j zApw<=nliKO=xg@By-%B#7W>S=;5nj`&|FVoIBqOZ#TR5}TT_)*E;LscRm?RHD-E*< zIpz}(#yaob8r&%>EGQVGq0v!-u1g}jZYg{laAsRWp%N_ zQ8(!%>enh!ludbQfDuQGX9Z8&n|E>VD-R4GR4QfVBS#TxhPp^aK0$wm_KWxi-W$2V zhRpbIwxuVCDs$LCHRH+%UN6Ms{;1pSrBQ4|K);n-duRKfg-H{0=@JmcTwk&E)JF*6 zG0!{Ft;K>YZM%u<^iuD2I&%k5<)eqS@+@Kw&h zdN-!I1eg7F-vuL!BvS7;mUA1_V!cjv?e41i)(YL|7k;I&Hzuk`owy!Sd`5x+Nr5$# zIiRu-k0tR0scF{&{1k@JD-{wzV_ku8D&XIrx&b6Z=K~i)qm@rCghrnNLacyB53%}% zDt*`JUE<@kuD&;q3XlmQ7lDKjX2h8TG)C0EM-rr~Bav4P=h@ulR> z$7QY92-AkJZWYXGl}x})dZqgs$FPQ#l2t=nvetONd)d@JD;XM>io%jIC?7 zG*3x>sKF8G6av+a7zc_Pfhy2X(HNtL`w&ZSZ%8=5^PY3=$`w8E*QWr&y1}=3BTKL> z%|>5uTYD1|B(_F-qGwrW=!_w*tUc~$^sIiYptju;zXbJ$SYK%+9bN$NXQT-WgVr)J=zLi(2@9)$>-|$zr} zHVIa;;>;UIfzTe%X+BrDZr?=x$n=FEmaBS2Xz1VZ zA&~2CeLma-$Aq-S9lnZoF>IpX-{VoTFA}L(f9kma9OXkIeBtfy9qjl8OKWpIu@X*u z8Z&R@sVA3^0O22y^;k*g3ZT(r^R2u;gSbJxPW5`MC-MfZk^z585?O|LVD6s>VVcpi zy9%~=wf3#JdGjXW`>`=lIVWhVsnOLRzO`8Xt|#y4Q!(XOtzW!lw7G!w4C_#pW60nT z*rpWJw$K_|v38~rEoP}ZCz8qH`427RUmbXajfSQ<)!&xrM7}hV=eT38k4@1Prup^| zy&hgBu`u0I(G+1|JKY?!xCo2o=PleyTUc((-n6aZhB1IEp*@-??=OwSDWjbF*3g}iiuK;`GkVu%j>qlmExQv+;$c!FJQt(J^PL@N z6zAqzb@|bJ*2gevf0B|j*iak7cYDGPhYqn;mZk{7`TG2(tQ~~}*%d;TZf?pzh98ju zl0%dWepQY(TW)33+R*ayyD+`*et{5%P*)-+o*8HzQj3m7_G#IYhzfRV1C#GpEh2ep zLqW*g#Z6hl`Bkm~?SeAhm^|3!nVDp+Jyt=W@t7=jt8W;+$1YF3$0cF&&Pz;p_UR{6s|W`|#1O z>zU8!R@bJmYXb#B9Ax5M)U(B6sRL#INQsGrPn5m$+v$z#5BcXGmcG_4GF3tn$w>YU zIY$Xy8t``99@=x3QQ5icKDsV8#?|>Bh;;o~>%QJ%iFEm60;!FH#Rk^fpw{2Yze14e zn4Eu@RVGj%ZNtDVN}2@>+DTQD>j*qvMDt@seFrMbhx=7J(Jh`jlmZJqj@wJyI-3&Y zi<|TDzNYMH4Re88D`V0HXxJoRyS%}}{i(S;Zk5A5yXEj`C+!KkIz@H_)&f&X1j^o$ zAfOQpVqUJDOpQZ7*m7@@SOEVsxuw;Ky195|NZ0r^ujSU*x?D{byH%YYTe~LpiZ12D z07u8Es5%}PYf0uYji&p@gqAqdcJxj<5^{o;BnJXWr=m1%=M~HMu;)_8YGcX7x{8eh zVg)sq7W(R1W9aRc20uy(q!KxndILCAkG_r)Yn@_N?)f}1b-dy6@V$Gmn5ef#(gW9h zzYWIM5v?PM#ss~qpsA#=iLHOSZZ(I`e)K^pEuD?_>#!X|F5r`7%|Emwv(Ku^XIPP9(GUpe4`D%X_w6Y#@X?_R>R}KT1OIw0BQZ?)l}d#X7ZkW!K+e)=SUX zNZBjpaZK-hK{Q2Rs1HEw?+4_pkNTybN2~MYv+MYrm+AXtvLU0=!|r8WuBUxSPWzn@F+BryM|gnmH`Ik&K{xvy)$)WfaNQF zgS3o!z}ci(;6hkN>yry%8JAp8j>BvaUj;Oxx*t8K_f%RO`gXOVAE-PDE=l5?oHQfN z$I(+{GW`gaNEHuWC+ELy&=$YFus*?L0Q`$LnpVxRMmdzXQDEO>2!m5rH3n!*iRM`* zDV4Wp4SsQ*L`4)-&NBDbPlt#d+!NoAQYk(tpv-VeH)0%cE z10qaH!`o&lcIX`n-l8m3>frq) zg_F}^wk1Hr!73?Yco6wBfDXeb!@3Yy-1oX9zkA6ZCOBW%F z3tj21E64U^Lr+Us@_>Sjbbr8<>tCr7WjmAZ*#Vc8NKwtXHk9gM2@n(^6{X=Yn-Vd+ zniPTfVt4Q*1@VPE7tsTi8|1`Bt}uz~{CKd94hfd3jX=t(<1Z6pz>f}zWt{{p>k%%z z^rYZ8Xuy=@{Z0hXG357K;JMA1LC#j2p;!%J62C%Hljsm+v zdWXQ9OG6Bb0`Csg?UuTDgY!7PsMi6*Y6ozc_s1rdXLxz`GRxP_f)uNv*pvj02W5cC z-E8cU6O7TvttU|*Q)w*RBJ03V$XCfiObM--TF<;5fV(ONHE)y zt480gPM zo;!W+G{U62pIiu&ZgTAm!lVzd`Y9-peKYC1$0wrRn=~)^1{@zAescwghPj>WoTvla zs)x4ve)udkja+%>iu?td*5n(MUdX+#e9TVnc6uyW!SQ4 z!j<{t*gp8Yx=;be`(o_j1pvm4*2~LR zxfEY{?SUpDQB7xOeHO-O!)h#c4OV7~$%$2U_L0;)V~SIxb7} z|Fy!~HkB5a4{I_qNA$xD4H}ExOgibIm-CA#+~7gK!k!@a5g2$o<+`__v^rc3{E0&r zjRVvf^ICh3YGJ|Bbjupd1&DI2!KzyxKQGu7;Dj8^_hbQ!{9Rze7%8`!0-I|W zscMh8>kEz-+T4{q0Qdl~YjVO#Q+m+Q*J^G;CUq=6jpKSOAP&vgNIS^X7 zX7u4X#LbooLhw&H!YPovlj865Bt7)3GKu)(?KR`Vk@suftpGPQ{r)B%NXb!7Jum)v zOri=mrAP&?Tv&RL_g8uPLDa4rUw?8sydZh7T)qk`V#ML8D&99m{zYk3QpsOgE~;!Y zYTiLA`Y+EBR-mcqo*Wi-R*%tcai1!D>o?o*wMw{QdMIu|S27uyLLLn0-|$)~=bvl| z0=`J{VhSUU_O8+8zfp#0S)#;@UMWuzz@~cCz&`uCnKO*6du=%-4v?>k|D%ybnoFim zS$d2(qIXVzvb9B$?6^RGs%?3HF`a;UR7s5rEo9Ur|8BLv+F!tycPbFL1m-Kj%xwszo5&|?G&nVJ+doycejGY z2^nB6k{i%^V56@m&|JayqadNRCCapxwer|iH zvaVF*KR)EDcCyREhmRJgnl!WcpRL^~?mL}Jg$uRu|9ejmz3eJzLESvqZG%w=!mCNV z_M((^1BxZH3+hy8x|MaA08$IW0WjsJk0i#~h+cNzDySndCMQKzke7Fr1;WP)ixcDu zi|t9EEN!1L#8@C90Al|G5l;zLg1D5nY^T>%ulR46|5?w*BuAK?E#SB2;T)E1{PA0r3^NMrA=BLn&dbmjX^HxTj2^iH6(=F1+k~dsEl(n_D z84n|=cUT>dFk*{kg9d@^Kw14m;3=~aX1f{b^13vVGz%b1vxK>Q6!8g(`;+dXGLkrs z9c5lcB#jpZx&tpG>2(h()@ASOhr>BxB#>N-v854~?G^2EH0(z9)_jZXKF}z8e@k?Z zdb!-v!7ly4FmowbHFwpMmv@S!o94FO@fet{oOHkc_19sL_&OX+hS}sjD%%hfO>ha! zPAMVU~_kH|hLY7)-aiqqJ4WuV98GkVHL?LNM~La{aAl|3W~UIdF)6h!_hc z6HJqEEcM@>{#!W;InkjdAD1vegLG*4$149v9r_uY=@vorN=J&N5IyDJ%>%-87;bgP zjty&+3kw0mR{XG_E()OSuOEF72{hzYuT~jY)eJ|r^M9&A=5^6n$nf+(up(L%rE6Fj zueEf49<^`uwBbL1_49b47=(?dQ=|gFTKZpXHk)H75y$Y0Q=xx1{e?aG=R&(!yOV#Z zikv+<7TAeUt^@Y&#HjxUR6Mmw=_Y%onG%@W1T~OzA1m-05TVmT$8%r8DddHi`%dMf z9%mU;WvV>^_9RWIIS5qxo)N(nL@rzvZNUbT3`{w+d*YbkoBAf`!Z`PYo)5N*Cl}=$st@|FD&H}ybBj=pR5`L> z?$1||+Rn6gLcgT$9m&Pw6@>6DY>(t&?{D^$dbeyJ&Za4O;a0dU zfvUMlw>En^s}C&ul{BTI^J3%Y{8&=SrB5hC@GY+9KiX3Nu)H`Rb1@pSe6a7bzgVPN zn(DkgRJ0p8v#+sZ42g7x?-p&3#BX)0f|nb^4102=q6K&7V1|Vw&erS417(aDL3)1# z+X3bH%WZ^qYTG_GkK;E|xsYfYDJa$vXz{-+zmPD-?y2w3Epk-Jsq2q8uC_uR1vBe-b$>kTxtOa`#W z!%X!H+22@yjD|uGDIvR4+dBxZt3#};^Ae(EMeO_#z5bVyd>6+dBWpqWA&*NA2;us! zMc)DbgeOOIdjkB-3V7v0E&*aN{!=NB(Sc#oQrqBVY3k6=ioie|YwN$;L5$b3;y~Qe zd`}u~Ce#05hx(1~4FM8Ct&oNXImiSo#=kyBSveVwTN3FTb_Z)&KwJO(Tj z8{kSHbq{bTnWvY4Ja5DX6x-ML79cjDWSC4Rht(~s_*`wh%SZTb@9(Y|+ZlvM%9QeD zg*hxh-X+<}kCd?${>@#aR&*!Pzj$YM;I9B2lAWuo@wJLslz@N6OZpdo((t3#i#=c= z-`zdmREyZqVaF_9_&ZLXbYO4zKqEWfE0F-_Kh|>}Unls&46a}TZf}L}zr8g!o!I9* z+`Fa4`RtfBqW`hx63up%rKR0g;T0HW2rmlPyFV@oET#YDsRqDqN*zAmTbo+$29_8( zfJ-b`%)u>$Nl5(fE*vjQKicAT4U|HFKN`MP->u(bp8qjJv%~XexAEsC@Ap+WX@NAG zr*PFXtK8zwp0r*+!jV!AW3S@7m|}nMJ^z4&Lr2K;tWodHkLCzJBIQ4wNmAAXl!X5s zx7OB-mF~r#+!Me@oVPl5VZd6ZSP4;4&uh#@5$ zl4nRCXH&47BM4CzPzDKPLwlSq39HwHC(^=)X zZEP$Q%MPWLQOx0YQCl2?PE+t3Vrk;Ke9Wt*P3h_ON6T3#lI*;ijWoDJz6E30-K)4@~3vA2p|3d*Y+%292BQC3=|m5;Y^ z6PaPn)dfs5s~auVcpA;LaoVkpe41iTK|m6{{M}4ppJ@!gIU9w#Z0# z(lAh)``CT|N)iH}z_F)ZGSThJqpd74DCHIVoJ76zo$zJEi2p&1eu;F@U_(#cNw7sz zzy;X-%d2ARj_FFbvOEwh`rD^-@;b2wSP=l^{W}n%a_3|~>&hI=NXXDY z_vfJCH&;$-_@>t;F}l!$k-8sZhTk3o!NjP_8kNNJbcTPm_aRC*`7Y8KX8+B0M=Gmo z9Gy`y>ngYkOj(A?$SF+)n9|Trqy4r4m(GOTfD`n?w*#g$31p1)8FB+ot$FC>4;yeV zfDJeq;ONrvxklUR`@vN4BX+&S)3*9{8ldW_caE+Cc}Bglw$sH?8{S4%h5{Dh=ug$Aa6^U{(#Z!-J1l2DNmj+02L7#;>zuG1-t7^JqvwYZmqXq4IKiWm zXJHY~UXM*JjQ^z%2oe~}FZR2#!vhZ?4x4w@rAt3o0@)pA8dE9m%>?$3ZxJ(>jZy() zzzp>K_bn%XULLVz-Wz+Z2yGK9|CuGSmI>jF-_SxaBO$gK;w@I4*g z--dAJIUE6db(v$=Z{f;ug-IViga{*WhHCc=HOzMYyCw1qT^nXvrJr3-d?bD-kwiG z8dnzBvDBH& z^{YNJ7TrY%$%pQBF#SUj*aLrz|TYxO@a9SKa`jY^Cm#x}4(-#q^gHZODAS94Oknw*) zzXIelEP~grzsK%ipx`K@wB*503jK>d7CAUq`QJ}nyETftTWq{I&kIn8XsPYSHxuw% z4Lpb0EAmzF(FAAbdWhE{-~;~yyeo^?p>G5<@;GP&zNz^q6NAA2bdzR7uKdjyJPpob zIP_P7Ve|8V7G)_77#u~J{>iFc%^CL5$W=4c99bQJ&;)(6!QafW1FT14)48gk4s;ZC z=XVT64q+JkJ+DtJ_qSSrJ%?pg5<$YrelyO1Nj159bV_QV_=pOaeYC8RvyU5)(KiQN zi1ZJelMCTcWxqgX^cDC%`r+gR;w%*4Q2ATne?L@z5Ao`Fgg+$;Y|t&WN=D`%nRZ7m z4jVW-#zo|j1$sxOsla)8_fVWkW-VYPknD~4U-RgwNZk8#2@OpdzUS#7ll^@9!LgT9zyal87m>44wOaMGxRQ?8&vpJkI5# zSDG`WtqPtqJu+f<{55d~w*|F$u-6#`9u80_4N2u;`(r*2wTk5I7#0?s!c3s*exAS| zVG#L5aAPGN$}V?zh}Xb~psE>7)nc+b`ZnJ8#K0d?oN#S0Hlf~vUXF)*GnPP-Gw0yz zkTQ=Nb$rqZMSu-5a%vK6?9oIawZm7vE< z4Iz2n#MQrLM?GLC{>RPoZKI6gD1f1QKP0O;qD*1CN-#`O^dUztK zR5hJnZDuQf;sjy<`fIA)uvFsG;-SjY5O^IpaU4qwq;FtM0ZB5>Wox>cReKqOzKPP; zoXhsN?Yw|2>E2l0&81-`MY!HBhG8G4kZ66!Y2brHyi6$E{8COX_U(?Z_Mh@$`J5cydBPvm*-p+q?rawryY;= z@vU^`8(K4!(qoBOdThhnB{wT7Yamx~Q^8@M__vJ6T#aRG*zMrqFBWCjhM*HGz0MOK zX$L(MOBmECj84FtPBJXlkcoLq+M=up1DG`x}`2!Rp zLC{tXL5d9RB99&WAEgsqT_WwU7ckWly*bF4`*#fqgGoCGz!rh*xZD|@ZTml_&n`F4 zg>QIbY?i=1=6Oovk@>7YWZxmOUDY*JX{*4hZFsrx-*aET!Xg^0m}9L>OxPCp6GQMz9XgV>%>Nk!h5r|AfN$=334F;kwzaZfWiRWg|#&#>`s)UDvu zhI!%Q*_D+Z9Y;q^7*rg0 zK3~w&0Ge%+srm^(GTAUN)#g#2OL&reRN(-w-;XV{v}dPt?C-4R>2!+gf|RHNiX@YR z!(Xy>+zJ*|q3O6ET}h!ZP?q`d5G?3NP7z1XkyAwBxYI&nnEd2-*re-fVd)%>NAPVO zASq6H0Z5aco7yelB={A&f0F4%=2)gE%zAUYcDpu?Z?|HYWWi=lb#K4z9*JS(eQGAW zpXy9MJ+I{M{jLS@0djk%qv^MHRwFhY7P!H`Q_?@#5|G*XXlC~-v zt*h*oTL~T4r%N3+!BtMXcdFFw*!4k$j@w(lLsbL4ivv?jgY-%e{ldLN(2$WybRnss zF)0FR|3f6&hyAP(TVL7+X~4Lq+op;3}7T|mbfHHr#VgX8uE7Eu{zF=^-Lfb z{3t1^`w@2LqWZ~r0Ms*?`2)kO8dk*WIIu!0;KfGyyluc(;B`UgjGsTlPYggbpnAt@ zz<6!GfRGC;wR692l{@qzFup&_NQsu!di2WGSFO6AR(9WZ!fs~jPGtsulVSwFfeNM> zYg;AUUV~*1&32p$UJHh@93Ia6CdLS0jPRKrr^lwtz?MJM`&N)%_SKI2CrG|ZW=bPK z6|Zacpivv4TEHKrmcT^OQOae1e~PRz@Xl`nC;`(2k-8KYX)CBLT7NePfVyU+76X}v z<=P6dx#94GF47ZI@zrV&n7kSB!~l?Pd^Ih{R;E+Vravowibz1y+=h?(o7q7=bAxpx zbdddI7g918EmF9@+oxl|=uFpBSK$q=*8tOb)e>nsZ~yyf@Zg`01_Sxc6*|awi<5kP zw>Y*k`nxRP-KY==ujFUb{CiUR(+dmDEN z`>VxoM|4Fpbi#rW_v21Z_Edf@7#|d!`s#p#@UQagZ(B1y8+#5Oc71HnK3o3Ka_2+F zl>*13j`;Yo;tAal1EGhVaem|Aa_1uUao5);YAb7YH6F;{zEkC4-izYNdbK_5>^@k- zB2;MArAvAD+L~AS!;>KUf(tIgFBDI09;Mfp@y>EIjq=)>>s~$BTXlX_)YG0%)jeaR zWhJ}prp0wWlY4g6of_Gfl^sKhnjbw9pDj!YeE)3L;uf>J+2Qpm`G17g9M6xB3XqnU zSCx6*|5lwFoOu1!tC9tpf;a{7ui^3H*_vBA8k?HxcDlyAyjyZt^WGWDoRwA{%#*=+ zvt!=Zmw09zcZgaM5LhRBl9XOo+z`)#CvZ>d-&vm&IZ8UJQ-tEyI&(j*{sW}qKb0Tzg@?t(lTcB2HIF82 zA8(vuqEIYHZv(Vx>iML$6rSe2`xs2(lSh3|>YGe3_c<=`)bmzS;)H&ci?7}5=@*t= z)^ftW+y06Y`#Hih$2``dlAy1HO%GS!`H6k{9v}TZIX=Zb?M3>|>S3&jTiyF|`&%7FNcaHD#5;yMLBQ@wOe!xYwKief7!z5MJ&Q=u-4DfP|kLmg@pBW3=hA*@)y zzk2YWt$DDANGg1AM)tM*1I4fh0X-wTcmC@|&bk|zA0nAOL@tip9`c?39g}$nD<-eQ zoq5$^U%?0R85vmCLA$_!C;h|`wdrdDGm>-NeZMOhDC>90)A-1~m+{g3#ONpL%(foK z_8qC4TlqfFL)N*0!uq#MHF`OfMvZSMajuGIHc?pq^iBNgk6uS>WTCG9REM$TQ0n4nkSw(kw54N-@DJCh?KS?DQqn$^-XfFT*PSaFd=__4P@4&r`S8IaO{hv{JG2Qm%vUvrF-{XuuZ#VnW8lix2SN$jWpKI=C!0;-?C-Kl?^_l1jfc; zrE~4KaYw^;6_u;+EUy~<`qw{Jo|}F&ZOOj5_BNBAM}+L7H{gJME`C4hE*#Xl;IWfY zU8!JQZL@rLkm1qu@5Y_DeEz3%kyqaS>UQ`;JZ$!XyN2+y&vL$cTe;&_>f!R;jSqDO zGh1?;80O-j`AvaLeDD7KqxOx}<7#TkMfvC3=a#h0_4f8D+1me`{gQAFXRmKt+wJI> zV=rI+AV|3O(LnsNK2_bxnck&iYWU{p^ACmz%EAIWp7+;0He5f=Vf^p4tEV@5p9-CG z>Lowe)bwdU!0Ni_;?mOjf`r=o5c|S1$wnm1b{%Xb@+|t1Y>v;uIuaUnD!tLAuI_e8 zTTzSp*zrq>i*Ns&RqWxpK(zaWjrE|jx59jZ8Elxgb@6_l-J$2tvaE)SvLd%#|8h*B zY2R-eWtF{gi<18N@u^K^gOmRhT(wI*{M%*C9p7JJHyg1$>F)8|-kEp)BJn+BXEbqM zX)J>?`Tm)z(NRa+XVepS6!}rpVX;Hjt<-(o0G@ck3)%7QYP+-;4S`(q z<8*_);yo)4jSl9uE%;(Ivz^E9e>X1_Pb}!eZg5ll^Q5A0KMQVJ;{JNGVmA^uJvXVxcf6JI z9Y)MW(;ZHn>~xm5*X$kMe9>2q;%d<=i!}pAzA^&moe8_hp>t0G=Z5#%($1~C*Veo& zX0NUDU+d0Nb#8itAWix0*2XT*y(%VPS&2;da@F2FTy8_jm~!#L>tEJoUrRR>d1eit zxGG9Ew^{V##qitf1yK`Iei`=bE8FVFaFt_}ek3@R4>oxF`MIyON#O){yWq?7waR|b zKDj2om0#C%p~~F+fiX9{gu4NOP5-)G^YW#)$iB_pI=ij%m|42@qoaMKFZ$ly_UKfL zRJxyAo4{fSbQl~`z0#gjn)FaBU>mfyeza)u6+S1)>2yNk?OnxjkM*|!Y~I;*r|skR zzLZETs!K})t6N&~{URP}EoEEy-wDmSyJYd2lY94`_Xv1+XgBAQh{seOm2SPTf$%LX zobGHWIR5h8yQpzJEv}r~lhNza5b0@$!m8TwdMUqalwEA9wUd0uEj#7F;b-c{Wo|31 z;%AmhF8VXYuCdmY+aIg{Xxo@Ff`+rcJJrXf$U3adwO3$z^()%|HnJ;~l^G$v)o&h(hwDX$a5xs#)q?7pn8t$8np638yRPU4rbk@O8zT*E zo;yxv))LnC?3ur@acE&-=zFaVIXack&gDo>pRTpB)wxrDwEFTo(fOqb4@zVDuR~hx z-0ZUU9kR6!uys0l|u?A#YWRncTM9;{+b8-kG=gq8Hy!~jthQ` z`|?bf-fFw4K7OW1!EapcLBA<|8edYXEC#}~r$r=IS* zZ=(~|li$u5P}3k={iuse=0^leGR72X1bU$UeKu(pKGN2?f1*hY*3`OL)TVzosqC9){XMM zb8_msLl?Z41XWDAP^ zi4#8FUhE^=Ushf)v&nyLFROKi8^uqb+P`)*sh z%znb0TbI;wa|>TK6pYd@;>N_}P0$XSB=*UyZl83+d%M_f{9{kgGZLPsO^yJB#Xpz>|^?j_SYZO0^Jw(F1O2M4=9p7OamT$=$ zCHC`orR5b}Xzgu>nyP&}Z`ZCfMg}z89{1hX2A#fO>)kNKs>In)aPUSrq0c7TueBQD z+)G0+_vQ!AZ*R>UO~7_{PGxL+9N6|m_@Heo?`J!E4BGbnJMQj1X2E{8%eD9mZvDDg z-$gL!WbdL9PUyfzCo8^P|1Fp{^HlA(1`^)$skPNr_WMpO-&Z+A8ZqIc&bZAT`&VW2 zc09RW|Ndrmifu-CYt`YOvwqya_`P`6aT^Qmu*D896I-s=NteIgCON&qKb1>t0(1D8CvN+n6$RdzR2wK!9DN>(Bxi8!6uWO-12%h#;)dEN_J`Q z82u!t=Ft4TSHspiZGwgmO=sT8kM+sES+TOE|Ba^S?=Jl|zai|@s9&o7coB8<#>Hor6Biy?)~c~e z@9mO?9zRvyY|E{lm%Alu{NQs!^RubmN9G+6j{YL?ie%oG-`@Da?~6=p!Rwq|b>6EE zk6Qkvwq^Vxb6H1=Zrk=fk{f7YJtFG!W0 zn5Mhi_0G|!rxQvyoN5X_eK02A)!UsPG&Cn=mzuZ#&^I9VyAQlt^U4qW0>1-``sYlX zy1Juaq(jTBj>w_voA%@{`Xc}QfnoKpcjpzmejH^xf$C``NL$#JGry#?^mL`z+cUE{ zaNNAzrB7_TW3)zx{==s{igC zTK~k$)yJs3Ts^1Z9KKxr-r^iLc9T{i)tR7xdQ+H`8)$aI8>x^d8Fb$Km5h8!y z{O!fRZRK+_jQW9F;R&3~N^uEdA4OeZdJT1{k~x#X%I`1cPrAF@Vgx&5WgI_}G4PcrDc$Nc( zK9n=GiUcfEDJ!T&I%j|_MM7;D6$)4|eU#&l105SdnZn*wd-0;7+f|_XG{ws)UKffy zXjtZ}11OpXJ^BIV2GDm9edNP;D6~ci*>yq-DK&z!i~_nt0NM*MuLMYhRdC}9SCLQ# zYp>LHpm`dchX7xgWYC)n%^gA@9C9(0vZQPAOGr`Bhco31P*G5CPJhtKHK2D2pl4F= zz-{`#M&C{J(F08QaJsxqdvtF!1R;wT z-h3(i2J}50_MY_w3CsXKnO3k%t6tJUp^1&Kd zYl+>nX%mYd``ElojnX`XXEe>isQ{0*gBUC+<+z00y<-4{_^QUQd<7H_SRD+~ngrz- zw`h^UL5Sz@C6u2CJuTL~JH3`U^ zNE+Knd0iXHm$Z?rnl`etvWt?;RbIZrrt5c(9MSovvnt0 z#$2MVqfe@(ZA4tzOpX*blC<0gl9<&%g461Vce0eY#7K!la53Tf{YAI2rUHHQJ+4MZ%KknHSAA`%q?&0-=DA;}5MC7IqwNSd37Y_Uxtt4tF~n7)AU zba=#D-J7^^+zBi`5DUtJ$fQytD<~i`ke5s#AToD%A~Q53uwgNgLN11!16c$)334!G zhzii2B8HG<)u03MP9n<=0~~HdmS{-Y0x43*qe$gKiio`_l05_3J5VIqf+7NaiumYI z#9bY5aG<@c7;-XX7b0tV|ZXv-nq zrX1pK$RQFL=)IwUZTOo04?Q>#pH-2i)^`>M1l(giC3;Wu|2{ih9a<$E$W0yqzJeLp?n~FL3V*` z3)vX*Fp5;mR*}L69`x@{GH=?F6tOW$%+(=bS?a_`1Tw1ACx(^!#JJFq80SLHguK&` z7$)fxeStoqBoab_-BLL@gc6Aem6SxN;9%&>i%?EZMAiWEk%E3CIUwsSBCE_GvT~4j zA;_#Ck;rlcq#-kq)TAsVHreqb@kc64)6CZsYGDAm; zxM*n-uDUug=5UA<{Hg|WIh{e4jS^DW*gy*F8cAUd94qTcVY!sFHKdVdX)fqz=j!b`!_#Daock|c4LvIyHAXCoNcxn+GC(Dm6^5Ycw(N%t&DnGi( zkJIGGk$(tmB_Q`QS0p%a#YZkdF`wVZJ{C?^&I!T*C6_OJ1Q1avkzJRO+86}0UjY53*f+2iO48BMMG(!gp-02th zw8Tx&aIYGD$Oe!{Kt^kX@sb(^8Sk@_E?M{~j>TaL`)c@tz5FeWTx6P}}2 zl|V+JVnQ5j!gH+u4LYACCkXMe3D2<}6-y5bY=zPh>w5v9YjmU_0dVNaddM;1VE|=7 z9aRd(Ujx2&`r3e|#E3S6k#OtKm%cWDn=mFkz@$_LZUgBHFd8%y8QeXv6MTw_2NRk{ zbC0qNf%R!L6t*?;*^6#56G}~BA|D1vycP5X`Qj}SPSXv*8I>pSesJXvHwp$|HesLx z16mi%tpgeull(e4>;XOh=QvdB!l9K4hekAq|5#F}g&DrA2GxLmIPVb2WDW? z<(#1I&<51Nwf?oxh&boMe9i@Kix}HNoao$Yv<6he9)>|LxD7*%J%)WGs7PiL@~6Fg?<}%Bu%Zp{7hm|Pm!Mpr?Dk-d|=y_6%SMfF6%a7Ay=N zVK@`=AYSkRf>~Q5wz#qkbF!i)FHrFCrSwJdq{ zC^%y3!NzzYT+kV5QqYK{IHY!)FpxqLk`>Gm&tZ)1WFQV0i2{-thQdL-p|Eyl4w)%m z2JVZisDM6x<&Qd(V^h*eHM4S32mu5kCa%rQ)F@IXZb_mFY25>WEfV~JY zUmXMA*cq;W2|BsKa}<$)=8XmJ308mB2Cgvu&#Ve5*v@kKBj5qOD5gN^Ovosk3}yem zc%R@*1%jWFSYDy6KoVkpi{0Z1n~UVNSV&dibOYv75J*vnJXlFotS7>X5=ewuDa2A7 zCQLA9_;rtVFL5}*vIX4HsYW)J69aKwiH zs7{Uy4vO?pndfK!y4qf#ID1gns9kVWqw&|Xn!Hm2aRK6x5a$VzAb>zB0{qq&<{JTE zLKaZUhmRTDAaP+0!w$a9pq39a2?0P@!L}kA~&;naB@JLGxwF2k~_=KWy0A&w6 z;c{p9@TwHq03~)nizU!$+bw?NPr(6lYzdIIG{+1*fj|o`kE68B0gt5;JYvU>4NVVA zQP&pAGU5XD$OXy=>FTZzd!-%_))v|z-wK`sL1zN61z(`6tJcQRJlgAp8AWZmzheRqtFt&~w!g@dW;M_T!mRtZ>{R*HMx#Ytc{`BDsIbNwf z>dKmyB1#3@;}1LdgM(@>Xun7s0~H9i5~qX(eFAHdADq$qL2I-FRf(dWS-(M_#HD-u zfk_n(wacX?gt%fZBm+RaQC_pS20~8WtyvGi>LV5TDtUthwhwr5{p9)Cq1+9d& zA@oZ00$+f~dz2Nl4DcGG4-<)y>j1!OPwN`BVg}dvGZoIQL%=R#>2}DGIg~Ajs|ffY zt{^2UQRXNOWzxqKqx%RQW>> zc%Q3~fpR2c+eU&6aKU5+Kr0|oo@n7*nsTHj0%XBhl>!R+Mq2QQFsPdVz!wkD0Z^`h zL`?WW4@1aE+P3k|PyvHIB412Y2%@zROXF6Cv4$S)01oj40iHsbL(u=<2Y?9B>jVkln$d#(H6eg45PJ0m>sE%s=we6r%R+?$q?HN`6GvIf(6>TpOsdvr1Fg_%P-AvSj^kEx%`lJ= zFj-Xei~Jxy#={s0oI?78&EUv{GYaL=7~#Q_VIPPE+wuZJiLMYlYu>!4-(RNdG@NTNbIM3sLf!R@c7%PSEp^3!7SMg) z=y5oUV6>*%PBj*N+9$Tb_<%m!wNH%iLA3Um`E6u3eB=0ry`zrMyHtB;FreRt1D;QN z$DUEr=#$Veqxt+JF5Dz*z0jseVwigZM)L<^KL%8Ie82;c|rJs1mCjuY4uGZG?A5wz?= zXc=G(M2&{Q=%}!Cj1@R)Fyjis^XWE>e;7bZX2iyJIR17&=fL*pe@u@E$LbB|qn}16 z#wQ~nisGMaFy7&eM?n>GfukqRF^~_O!|>rs0fF_XJ9eyKA(n#Ot)S;Z0`POxL6k}> zjE*QDX5_|s5Y9U>HsHJ>PzjceO-%pcppP(s!8vO*NPoE!B=U}QFfxp!Ayi?R`$Sdh zQP)i5SJn(Ok5-;HBA;mCjA!F40%Pf?BM_r`c0P_eK&Vi#GK^NZD#pw{6jY$)W6Wf{ zN6}*GCy?kLw(=N-+K2^=0W?M&>6zGWtt1hY9nMx5o9`apMg<<{@JuB7d-#>@gBkmo z_{_jZf=j^f`a1ym!h=!}A5oW3pt rQ$_>zh0gIN1Wnrp&Tx1gOB1(@HZ`0YF}DpoC>;yTqVXZD6-E6Q)az== literal 0 HcmV?d00001 diff --git a/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.sln b/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.sln deleted file mode 100644 index ed072de5..00000000 --- a/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.sln +++ /dev/null @@ -1,40 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.37327.16 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MMF2SDK - VOLINFO", "MMF2SDK - VOLINFO.vcxproj", "{2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug Unicode|x86 = Debug Unicode|x86 - Debug|x86 = Debug|x86 - Edittime Unicode|x86 = Edittime Unicode|x86 - Edittime|x86 = Edittime|x86 - Runtime Unicode|x86 = Runtime Unicode|x86 - Runtime|x86 = Runtime|x86 - Vitalize|x86 = Vitalize|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Debug Unicode|x86.ActiveCfg = Debug Unicode|Win32 - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Debug Unicode|x86.Build.0 = Debug Unicode|Win32 - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Debug|x86.ActiveCfg = Debug|Win32 - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Debug|x86.Build.0 = Debug|Win32 - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Edittime Unicode|x86.ActiveCfg = Edittime Unicode|Win32 - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Edittime Unicode|x86.Build.0 = Edittime Unicode|Win32 - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Edittime|x86.ActiveCfg = Edittime|Win32 - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Edittime|x86.Build.0 = Edittime|Win32 - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Runtime Unicode|x86.ActiveCfg = Runtime Unicode|Win32 - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Runtime Unicode|x86.Build.0 = Runtime Unicode|Win32 - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Runtime|x86.ActiveCfg = Runtime|Win32 - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Runtime|x86.Build.0 = Runtime|Win32 - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Vitalize|x86.ActiveCfg = Vitalize|Win32 - {2196C17D-EDAC-43AD-AF88-1D7D6CBD9145}.Vitalize|x86.Build.0 = Vitalize|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {244770B2-A722-4976-85DA-F5FFB2A012A3} - EndGlobalSection -EndGlobal diff --git a/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcproj b/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcproj deleted file mode 100644 index 43cd5121..00000000 --- a/MMF2SDK_Unicode/VOLINFO/MMF2SDK - VOLINFO.vcproj +++ /dev/null @@ -1,807 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/MMF2SDK_Unicode/VOLINFO/Runtime.cpp b/MMF2SDK_Unicode/VOLINFO/Runtime.cpp index 36a19b42..e26da1eb 100644 --- a/MMF2SDK_Unicode/VOLINFO/Runtime.cpp +++ b/MMF2SDK_Unicode/VOLINFO/Runtime.cpp @@ -3,7 +3,7 @@ // This file contains routines that are handled during the Runtime. // // Including creating, display, and handling your object. -// +// // ============================================================================ // Common Include diff --git a/MMF2SDK_Unicode/VOLINFO/VOLINFO Example.mfa b/MMF2SDK_Unicode/VOLINFO/VOLINFO Example.mfa deleted file mode 100644 index 8444a92917fe5ddf769a123a6d9736b7d419741f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217415 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 diff --git a/rSDK/ZlibStream/Ext.rc b/rSDK/ZlibStream/Ext.rc index 1da7c4ee..2c9aa0f2 100644 --- a/rSDK/ZlibStream/Ext.rc +++ b/rSDK/ZlibStream/Ext.rc @@ -68,16 +68,16 @@ END #if defined(APSTUDIO_INVOKED) || defined(EDITOR) #if defined(APSTUDIO_INVOKED) -EXO_ICON$(EDITOR) BITMAP "Icon.bmp" +EXO_ICON$(EDITOR) BITMAP "Icons\\Icon.bmp" #else -EXO_ICON BITMAP "Icon.bmp" +EXO_ICON BITMAP "Icons\\Icon.bmp" #endif #endif #if defined(APSTUDIO_INVOKED) || defined(EDITOR) #if defined(APSTUDIO_INVOKED) -EXO_IMAGE$(EDITOR) BITMAP "Img.bmp" +EXO_IMAGE$(EDITOR) BITMAP "Icons\\Img.bmp" #else -EXO_IMAGE BITMAP "Img.bmp" +EXO_IMAGE BITMAP "Icons\\Img.bmp" #endif #endif diff --git a/rSDK/ZlibStream/Icon.bmp b/rSDK/ZlibStream/Icons/Icon.bmp similarity index 100% rename from rSDK/ZlibStream/Icon.bmp rename to rSDK/ZlibStream/Icons/Icon.bmp diff --git a/rSDK/ZlibStream/Img.bmp b/rSDK/ZlibStream/Icons/Img.bmp similarity index 100% rename from rSDK/ZlibStream/Img.bmp rename to rSDK/ZlibStream/Icons/Img.bmp diff --git a/rSDK/ZlibStream/Runtime.cpp b/rSDK/ZlibStream/Runtime.cpp index 38983111..c2ee1db6 100644 --- a/rSDK/ZlibStream/Runtime.cpp +++ b/rSDK/ZlibStream/Runtime.cpp @@ -1,7 +1,7 @@ // ============================================================================ // // This file contains routines that are handled during the Runtime -// +// // ============================================================================ // Common Include @@ -10,7 +10,7 @@ // GetRunObjectDataSize // -------------------- // Returns the size of the runtime datazone of the object -// +// short WINAPI DLLExport GetRunObjectDataSize(fprh rhPtr, LPEDATA edPtr) { @@ -22,7 +22,7 @@ short WINAPI DLLExport GetRunObjectDataSize(fprh rhPtr, LPEDATA edPtr) // CreateRunObject // --------------- // The routine where the object is actually created -// +// short WINAPI DLLExport CreateRunObject(LPRDATA rdPtr, LPEDATA edPtr, fpcob cobPtr) { // Do some rSDK stuff @@ -46,7 +46,7 @@ short WINAPI DLLExport CreateRunObject(LPRDATA rdPtr, LPEDATA edPtr, fpcob cobPt // DestroyRunObject // ---------------- // Destroys the run-time object -// +// short WINAPI DLLExport DestroyRunObject(LPRDATA rdPtr, long fast) { /* @@ -63,35 +63,35 @@ short WINAPI DLLExport DestroyRunObject(LPRDATA rdPtr, long fast) // HandleRunObject // ---------------- // Called (if you want) each loop, this routine makes the object live -// +// short WINAPI DLLExport HandleRunObject(LPRDATA rdPtr) { - //Needs to add fixed value to vector array - /* - If your extension will draw to the MMF window you should first - check if anything about its display has changed : + //Needs to add fixed value to vector array +/* + If your extension will draw to the MMF window you should first + check if anything about its display has changed : - return rdPtr->roc.rcChanged?REFLAG_DISPLAY:0; + return rdPtr->roc.rcChanged?REFLAG_DISPLAY:0; - You will also need to make sure you change this flag yourself - to 1 whenever you want to redraw your object - - If your extension won't draw to the window, but it still needs - to do something every MMF loop use : + You will also need to make sure you change this flag yourself + to 1 whenever you want to redraw your object - return 0; + If your extension won't draw to the window, but it still needs + to do something every MMF loop use : - If you don't need to do something every loop, use : + return 0; - return REFLAG_ONESHOT; + If you don't need to do something every loop, use : - This doesn't mean this function can never run again. If you want MMF - to handle your object again (causing this code to run) use this function: + return REFLAG_ONESHOT; - rdPtr->rRd->Rehandle(); + This doesn't mean this function can never run again. If you want MMF + to handle your object again (causing this code to run) use this function: - At the end of the loop this code will run - */ + rdPtr->rRd->Rehandle(); + + At the end of the loop this code will run +*/ return 0; } @@ -99,7 +99,7 @@ short WINAPI DLLExport HandleRunObject(LPRDATA rdPtr) // DisplayRunObject // ---------------- // Draw the object in the application screen. -// +// short WINAPI DLLExport DisplayRunObject(LPRDATA rdPtr) { /* @@ -118,7 +118,7 @@ short WINAPI DLLExport DisplayRunObject(LPRDATA rdPtr) // in DisplayRunObject too, but this is automatically done if you implement // GetRunObjectSurface (MMF applies the ink effect to the transition). // -// Note: do not forget to enable the function in the .def file +// Note: do not forget to enable the function in the .def file // if you remove the comments below. /* cSurface* WINAPI DLLExport GetRunObjectSurface(LPRDATA rdPtr) @@ -135,7 +135,7 @@ cSurface* WINAPI DLLExport GetRunObjectSurface(LPRDATA rdPtr) // // Should return NULL if the object is not transparent. // -// Note: do not forget to enable the function in the .def file +// Note: do not forget to enable the function in the .def file // if you remove the comments below. // /* @@ -179,7 +179,7 @@ cSurface* WINAPI DLLExport GetRunObjectCollisionMask(LPRDATA rdPtr, LPARAM lPara // PauseRunObject // ---------------- // Enters the pause mode -// +// short WINAPI DLLExport PauseRunObject(LPRDATA rdPtr) { // Ok @@ -202,7 +202,7 @@ short WINAPI DLLExport ContinueRunObject(LPRDATA rdPtr) // ============================================================================ // // START APP / END APP / START FRAME / END FRAME routines -// +// // ============================================================================ // ------------------- @@ -210,7 +210,7 @@ short WINAPI DLLExport ContinueRunObject(LPRDATA rdPtr) // ------------------- // Called when the application starts or restarts. // Useful for storing global data -// +// void WINAPI DLLExport StartApp(mv _far *mV, CRunApp* pApp) { // Example @@ -228,7 +228,7 @@ void WINAPI DLLExport StartApp(mv _far *mV, CRunApp* pApp) // EndApp // ------------------- // Called when the application ends. -// +// void WINAPI DLLExport EndApp(mv _far *mV, CRunApp* pApp) { // Example @@ -246,7 +246,7 @@ void WINAPI DLLExport EndApp(mv _far *mV, CRunApp* pApp) // StartFrame // ------------------- // Called when the frame starts or restarts. -// +// void WINAPI DLLExport StartFrame(mv _far *mV, DWORD dwReserved, int nFrameIndex) { @@ -256,7 +256,7 @@ void WINAPI DLLExport StartFrame(mv _far *mV, DWORD dwReserved, int nFrameIndex) // EndFrame // ------------------- // Called when the frame ends. -// +// void WINAPI DLLExport EndFrame(mv _far *mV, DWORD dwReserved, int nFrameIndex) { @@ -265,17 +265,17 @@ void WINAPI DLLExport EndFrame(mv _far *mV, DWORD dwReserved, int nFrameIndex) // ============================================================================ // // TEXT ROUTINES (if OEFLAG_TEXT) -// +// // ============================================================================ // ------------------- // GetRunObjectFont // ------------------- // Return the font used by the object. -// +// /* - // Note: do not forget to enable the functions in the .def file + // Note: do not forget to enable the functions in the .def file // if you remove the comments below. void WINAPI GetRunObjectFont(LPRDATA rdPtr, LOGFONT* pLf) @@ -289,7 +289,7 @@ void WINAPI GetRunObjectFont(LPRDATA rdPtr, LOGFONT* pLf) // SetRunObjectFont // ------------------- // Change the font used by the object. -// +// void WINAPI SetRunObjectFont(LPRDATA rdPtr, LOGFONT* pLf, RECT* pRc) { // Example @@ -309,7 +309,7 @@ void WINAPI SetRunObjectFont(LPRDATA rdPtr, LOGFONT* pLf, RECT* pRc) // GetRunObjectTextColor // --------------------- // Return the text color of the object. -// +// COLORREF WINAPI GetRunObjectTextColor(LPRDATA rdPtr) { // Example @@ -321,7 +321,7 @@ COLORREF WINAPI GetRunObjectTextColor(LPRDATA rdPtr) // SetRunObjectTextColor // --------------------- // Change the text color of the object. -// +// void WINAPI SetRunObjectTextColor(LPRDATA rdPtr, COLORREF rgb) { // Example @@ -335,7 +335,7 @@ void WINAPI SetRunObjectTextColor(LPRDATA rdPtr, COLORREF rgb) // ============================================================================ // // DEBUGGER ROUTINES -// +// // ============================================================================ // ----------------- diff --git a/rSDK/ZlibStream/UpgradeLog.htm b/rSDK/ZlibStream/UpgradeLog.htm deleted file mode 100644 index 3f20e7509a787128c56e5294a7efbb9d14834ce0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31898 zcmeI5`%@H4mVoQm-H81kdUWUNT?ct7qIbL#JQaBef_QbjF@e10A<{gZnf=pu_xmzQ ztE*|MsTOc2!szI(s;tbDC(k=iW>x?1|NJ@oLpGYd%to?>>}@uijb*iLBRj};vhD2G z>_4)9&#ckKrTrR*qM%~m*H%l5NR)T(8NoNZ@Mv%6UjpWf_2_A~W9aQ6^6PqNKy zm*Xn6cKJP^h0r4G8qia3wd^GHx=TM#IIDAA50Gz#K6WXsXUo)I22DzNE?t{dRw)!7l-)4WR6Ufz)~m%mYT&1!V^+;k1yQ zf_Wn@2jG7IMOW$NZyY}{{t39Bk4Wy?^JW;|E3Wo9+ox3zeJ7sPXkYwH(_)=^OVo^Q zYguD!<*3*~&Uc5}5hHn2=lV3@_batqwP}WtuDi4UqQx+{t^h$vO_2V?)mj)sjWVU6 z##e4{g0ELA++BvsN`>V$V0BmOU0Ju^Dj5I0QtdR(4^VhH+X}Q+zjo>O2^inb#zjS#66Y+9WMT7hmsf(pP8W-viPLAMMq8z_O=9NMgSa3?Vt% zs&M`p_*X@mqWnLH0**mC^wMup3$$s;cFW~lAH-K&Ey*oJRV~<{&nh@~rUB=<)C+z0 zu%psB9`llP)|o`)@~cJs0`=r(ALHDEQk}tUrNPl>HR|3Ny`*oa{mA1e3thn*AAoc8 zjI}TVDRvuA)_eBt<61Ae%~)3$T{R1wEL5`<>4Pi1SSF91jpSRkDPfj#^B7L*uZ%q8 z=q{t)4>o7JB92#~sgdrD{_4D@-XcPazWE5uSF_^~326C@#Xd0(J)1hMjxTc^y>Ok9 z>U!LF1A3fuqfxhdv%zoBtsLgnaX3j&E4%aXtKF$(`T6&e@~e=<{vbc)l2|9|_;BWJ z8|6%I?LFi38vaDd+e0EhWgpKZQav*Y(BoH^$^ILa$*Y&2TsDjHuH1C$ORmZ?Ubk#t z#^)U%D>0H28zXZg$7;INsSY@si{4ks-R9%WFV3Ev+Zr2f1&KDERep0XS6!BuZa|WA z{Pb_P@xc99);>J_*bULtNd5z~lUjKkn*33<*y7+Ttm}_2oy+BMQyuMe#??3{s2u$_-f87>OHWF9)e;mJR1wdmVDFJ#|y08IRSdo22@DfY#eY5s4LcfDG%jdp#C{LEjynf7* z8V$vEmc=YvjX2)?qgT#9Q{K3GG;}}U8)-RpM#<~<80X`oZ_RaHES+P>e*BDfs9}jG zT_K-yb>5=7^ta;H6C^lE!1v%>r;%;4g%@*f9IN8zF`v$CxF!~3CM|^)#k$eL2*Z3p zwK>84FbY@C8pmXQ`}$=t(XH95(6ZzR(BafP*r%;Cv z;f(o2?`;LRhxqb*PVDM$jDj2Ic5#Lz7FDx4_nYvRlS_Xdw2hI!$-;S+B5Q5mF;}NS1`;0|Ib78O-fpsh#lCNvqj5yl_}MA#hk~WA zvGN}+og=SGz58EV&m)V=d}6#YhMo%5+{#MWN08T?;GWr$vN~@9$9KbQWWBWJ775i4O~6zbRM4|>Ra;F(Hv$qolJV(D!T51UhXV%w}LCM&OwW1 z)nu@|FLyAx=91P#p9DF%**L8zpJoc8)W^L@xvXB74qU%H#&~oFS{of}%SSnnYwJcB z>Y_PQ?-rw+onQlF9P%O5`h-;9r`80uQ&uIPpTz7)^n>p9ale;-SGZDAjf`vH=1-k} zB+r{_8B;aVd^31!_wCg}Tk|IFYSf<8Sj7-?af;_!kGOLz!HeshE5Qck7+c2?n`w#r zZmQb1B-fF)e?>?9{06*jM!X1Qb5HJulB!xZkM6VdP8a*(V&4Po$t>EtiLWDma)AxK zO>1{(X=QFhgYy~oF7D~YrJMYY`#|rW;j=_pe!m-ScURRf0h06(r#}ICo^vCsnE#ft zx7k1XOUM`+ZQag(2X?2FyDq#pq5d#?GF~ASJ=rAt)ZEK9boQBHRIic9F@D$2%7(w* z9m?jIvktM_Hq~FlZg&$GZhS2nfy={i<_*W`vr<ON& z^JDa|2yPE({h7#m0f~9dcZA

|=UP6xmCpwNAh9vKO=(rYHC2ZGzQX%11)q%RqjN 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

|=UP6xmCpwNAh9vKO=(rYHC2ZGzQX%11)q%RqjN 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 Date: Tue, 30 Jun 2026 13:58:45 -0700 Subject: [PATCH 15/17] Revert Edittime.cpp change Removed the NOPROPS reference I previously added due to me having misunderstood what it's actually used for. --- DarkEdif/DarkEdif Template/Edittime.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/DarkEdif/DarkEdif Template/Edittime.cpp b/DarkEdif/DarkEdif Template/Edittime.cpp index 0a322989..dbb92370 100644 --- a/DarkEdif/DarkEdif Template/Edittime.cpp +++ b/DarkEdif/DarkEdif Template/Edittime.cpp @@ -157,8 +157,6 @@ BOOL FusionAPI EditObject(mv *mV, ObjInfo * oiPtr, LevelObject * loPtr, EDITDATA // PROPERTIES // ============================================================================ -#ifndef NOPROPS - // Inserts properties into the properties of the object. BOOL FusionAPI GetProperties(mv * mV, EDITDATA * edPtr, BOOL bMasterItem) { @@ -233,7 +231,6 @@ void FusionAPI ReleasePropCreateParam(mv *mV, EDITDATA *edPtr, unsigned int Prop #pragma DllExportHint return DarkEdif::DLL::DLL_ReleasePropCreateParam(mV, edPtr, PropID, lParam); } -#endif // ============================================================================ // ROUTINES USED WHEN BUILDING From 6ec31a741fa80449d219ddf8dc51f1f460ec3c39 Mon Sep 17 00:00:00 2001 From: RainbowHype123 Date: Tue, 7 Jul 2026 01:41:20 -0700 Subject: [PATCH 16/17] Update zlib.lib --- rSDK/Lib/zlib.lib | Bin 344806 -> 345166 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/rSDK/Lib/zlib.lib b/rSDK/Lib/zlib.lib index 5e7f3e3499be2e68c568df6310c28fd0494c7124..e1dea9f22e203271b2dcee2dc71e60430813ed30 100644 GIT binary patch delta 23624 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 delta 23376 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 Date: Tue, 7 Jul 2026 02:30:57 -0700 Subject: [PATCH 17/17] revert changes (I think?) Struggling to get my pull request's files up-to-date with the current version of MMF2EXTS --- .gitattributes | 4 + .../DarkEdif SDK/DarkEdif SDK.hnd | Bin 3256320 -> 3256320 bytes .../DarkEdif Template.iOS.vcxproj | 1 + .../DarkEdif Template.iOS.vcxproj.filters | 3 + DarkEdif/DarkEdif Template/DarkExt.json | 2 +- .../Inc/Android/MMFAndroidMasterHeader.hpp | 69 +- DarkEdif/Inc/Mac/MMFMacMasterHeader.hpp | 6 +- DarkEdif/Inc/Shared/AllPlatformDefines.hpp | 128 ++- DarkEdif/Inc/Shared/DarkEdif.hpp | 5 +- DarkEdif/Inc/Shared/Edif.hpp | 16 +- DarkEdif/Inc/Shared/Strings.hpp | 2 + DarkEdif/Inc/Shared/SurfaceMultiPlat.hpp | 8 +- DarkEdif/Inc/Windows/CFile.hpp | 720 ++++++++++---- DarkEdif/Inc/Windows/FilterMgr.hpp | 4 +- .../Inc/Windows/MMFWindowsMasterHeader.hpp | 883 ++++++++++++------ DarkEdif/Inc/Windows/Mvt.hpp | 8 +- DarkEdif/Inc/Windows/Props.hpp | 24 +- DarkEdif/Inc/Windows/WindowsDefines.hpp | 36 + DarkEdif/Inc/Windows/WindowsSurface.hpp | 60 +- DarkEdif/Inc/iOS/MMFiOSMasterHeader.hpp | 6 +- DarkEdif/Lib/Shared/DarkEdif.cpp | 287 ++++-- DarkEdif/Lib/Shared/Edif.General.cpp | 56 +- DarkEdif/Lib/Shared/Edif.Runtime.cpp | 189 +++- DarkEdif/Lib/Shared/Edif.cpp | 46 +- DarkEdif/Lib/Shared/SurfaceMultiPlat.cpp | 36 +- DarkEdif/Lib/Windows/Edif.Edittime.cpp | 30 + DarkEdif/Phi Object/DarkExt.json | 12 +- DarkEdif/Phi Object/Extension.cpp | 131 ++- DarkEdif/Phi Object/Extension.hpp | 1 + cpp.hint | 15 +- 30 files changed, 2029 insertions(+), 759 deletions(-) diff --git a/.gitattributes b/.gitattributes index 5c68ec89..a85ceae6 100644 --- a/.gitattributes +++ b/.gitattributes @@ -73,3 +73,7 @@ *.plist text eol=lf *.java text eol=lf CodeResources text eol=lf + +# HelpNDoc and generated compressed help files +*.hnd binary +*.chm binary diff --git a/DarkEdif/- MFAs and documentation/DarkEdif SDK/DarkEdif SDK.hnd b/DarkEdif/- MFAs and documentation/DarkEdif SDK/DarkEdif SDK.hnd index 11c3b2f76b64348b3b528ab09e6d83bae634550c..c987a4b5665165d081833093ed170109014084bf 100644 GIT binary patch delta 900 zcmciAUr19?7y$5lwsW_<_kQQ7scTpFCv}=G-BKvbfuphp^H$QLC(Ge3DQ-1vz4ajd zVe}Af4IB0nK|~M+as#c>TVII<0-uqL7YZrJlE_7vMKNfyp1if1lfcN`KUNzy-lCd zKI>NzjHQwrkwrn$SeizKT{He^S8Pz92Zj1&ZjA&x3h6{<#iQ4Oj^b;yDC zAtzE%J!(KM delta 567 zcmajcO=}ZT7zNUrz-Hbyiy3vA&A`!|^2epB^uy&P2cL5hg_x%B`JpKX~&+>5Im$S0JLsq~^lBAnD zPm&w6Z*B|>s + diff --git a/DarkEdif/DarkEdif Template/DarkEdif Template.iOS.vcxproj.filters b/DarkEdif/DarkEdif Template/DarkEdif Template.iOS.vcxproj.filters index 4798e84c..76b8fc32 100644 --- a/DarkEdif/DarkEdif Template/DarkEdif Template.iOS.vcxproj.filters +++ b/DarkEdif/DarkEdif Template/DarkEdif Template.iOS.vcxproj.filters @@ -123,5 +123,8 @@ Global to all extensions + + Global to all extensions + \ No newline at end of file diff --git a/DarkEdif/DarkEdif Template/DarkExt.json b/DarkEdif/DarkEdif Template/DarkExt.json index bb1f591b..437f7d78 100644 --- a/DarkEdif/DarkEdif Template/DarkExt.json +++ b/DarkEdif/DarkEdif Template/DarkExt.json @@ -2,7 +2,7 @@ // 4-character identifer that uniquely identifies your extension. // Can be letters, numbers, or punctuation, but must be 4 ASCII characters. "Identifier": "EXMP", - "Dependencies": "", + "Dependencies": [ "" ], "UK English": { "About": { "Name": "DarkEdif Template", diff --git a/DarkEdif/Inc/Android/MMFAndroidMasterHeader.hpp b/DarkEdif/Inc/Android/MMFAndroidMasterHeader.hpp index 90d63261..610ac53e 100644 --- a/DarkEdif/Inc/Android/MMFAndroidMasterHeader.hpp +++ b/DarkEdif/Inc/Android/MMFAndroidMasterHeader.hpp @@ -15,7 +15,7 @@ #include "../Shared/AllPlatformDefines.hpp" #include "../Shared/NonWindowsDefines.hpp" -#include +#include #include #include #include @@ -212,16 +212,19 @@ std::string ThreadIDToStr(std::thread::id); std::string GetJavaExceptionStr(); // JNI global ref wrapper for Java objects. You risk your jobject/jclass expiring without use of this. -extern const char* globalToMonitor[1]; +extern const char* const globalToMonitor[1]; template struct global { static_assert(std::is_pointer::value, "Must be a pointer!"); + static_assert(std::is_base_of_v<_jobject, std::remove_pointer_t>, "Must be jobject or a derived lass!"); T ref; const char * name; bool monitor = false; - global(global &p) = delete; + global(const global& p) = delete; + global& operator=(const global& p) = delete; - global swap_out() noexcept { + // Releases this object, returning the ref for storing in the caller's global + [[nodiscard]] global swap_out() noexcept { #if _DEBUG if (std::is_same_v && ref && threadEnv->GetObjectRefType(ref) == 0) { @@ -229,18 +232,14 @@ struct global { raise(SIGTRAP); } #endif - if (ref == nullptr) - { - global newO2; - newO2.name = this->name; - newO2.monitor = this->monitor; - return std::move(newO2); - } - global newO(this->ref, this->name); - newO.monitor = this->monitor; + // Don't call global(jobject, name) ctor, as that will pass ref to NewGlobalRef again + global newObj; + newObj.name = this->name; + newObj.monitor = this->monitor; + newObj.ref = this->ref; this->ref = nullptr; this->name = "unset [swapped out]"; - return std::move(newO); + return std::move(newObj); } global & operator= (global && p) noexcept { if (std::is_same_v && p.ref && threadEnv->GetObjectRefType(p.ref) == 0) @@ -248,6 +247,20 @@ struct global { LOGE("Invalid global ref at %p \"%s\" was moved!\n", this, name); raise(SIGTRAP); } + + // Phi note: We're not expecting to overwrite a ref with another. + // Generally a JNI ref expires, then later is re-assigned, as two separate ops. + // Combining them with one op, discarding a ref for another, + // suggests the expiry already happened and wasn't marked at the time, + // or that we're treating a set of refs (e.g. an array) as global when local refs would be a better fit. + // I've made this non-fatal as we can cleanly free the original, but it's likely a design error. + if (ref) + { + LOGE("Overwriting a global ref! Holder %p \"%s\" ref %p was moved into and overwrote holder %p \"%s\" ref %p! The overwritten one will be freed.\n", + &p, p.name, p.ref, this, name, ref); + threadEnv->DeleteGlobalRef(ref); + } + this->ref = p.ref; this->name = p.name; this->monitor = p.monitor; @@ -262,7 +275,7 @@ struct global { global(T p, const char * name) { this->name = name; -#if (DARKEDIF_LOG_MIN_LEVEL <= DARKEDIF_LOG_VERBOSE) +#if (DARKEDIF_LOG_MIN_LEVEL <= DARKEDIF_LOG_DEBUG) // Check ref names to monitor for (std::size_t i = 0; i < std::size(globalToMonitor); ++i) { if (globalToMonitor[i] && !strcmp(globalToMonitor[i], name)) { @@ -300,12 +313,12 @@ struct global { } operator const T() const { if (ref == NULL) { - LOGE("null global ref at %p \"%s\" was copied!\n", this, name); + LOGE("null global ref at %p \"%s\" was used!\n", this, name); raise(SIGTRAP); } -#if _DEBUG if (monitor) LOGD("Monitored global ref at %p \"%s\" was used.\n", this, name); +#if _DEBUG if (std::is_same_v && ref && threadEnv->GetObjectRefType(ref) == 0) { LOGE("Invalid global ref at %p \"%s\" was used!\n", this, name); @@ -334,6 +347,7 @@ struct global { } } private: + // Only called in swap_out() global(global&& p) noexcept { #if _DEBUG if (std::is_same_v && p.ref && threadEnv->GetObjectRefType(p.ref) == 0) @@ -623,34 +637,45 @@ struct CEventProgram { global meClass; Edif::Runtime* runtime; }; -struct CRunFrame { - NO_DEFAULT_CTORS(CRunFrame); +struct CRunFrameMultiPlat { + NO_DEFAULT_CTORS(CRunFrameMultiPlat); CEventProgram* get_eventProgram(); + const TCHAR * get_name(); + CRunFrameMultiPlat(jobject app, Edif::Runtime* runtime); protected: friend class Edif::Runtime; friend struct RunHeader; + std::string frameName; + + global me; + global meClass; Edif::Runtime* runtime; - jobject me; }; struct CRunAppMultiPlat { NO_DEFAULT_CTORS(CRunAppMultiPlat); int get_nCurrentFrame(); - CRunFrame* get_Frame(); + CRunFrameMultiPlat * get_Frame(); CRunAppMultiPlat * get_ParentApp(); std::size_t GetNumFusionFrames(); + const TCHAR * get_name(); + const TCHAR * get_appFileName(); + const TCHAR * get_editorFileName(); + const TCHAR * get_targetFileName(); CRunAppMultiPlat(jobject app, Edif::Runtime * runtime); protected: friend class Edif::Runtime; friend struct RunHeader; friend DarkEdif::Surface; - std::unique_ptr frame; + std::unique_ptr frame; std::optional nCurrentFrame; std::size_t numTotalFrames = 0; // 0 if unset + std::uint16_t currentFrame = 0; // 0 if unset, 1+ if set + std::string appName; // Blank if unset std::unique_ptr parentApp; bool parentAppIsNull = false; global me; diff --git a/DarkEdif/Inc/Mac/MMFMacMasterHeader.hpp b/DarkEdif/Inc/Mac/MMFMacMasterHeader.hpp index 9b603dea..aa1e864f 100644 --- a/DarkEdif/Inc/Mac/MMFMacMasterHeader.hpp +++ b/DarkEdif/Inc/Mac/MMFMacMasterHeader.hpp @@ -230,7 +230,7 @@ inline namespace FusionInternals }; struct CRunFrameMultiPlat { - + const TCHAR * get_name(); }; struct CRunAppMultiPlat { NO_DEFAULT_CTORS(CRunAppMultiPlat); @@ -238,6 +238,10 @@ inline namespace FusionInternals CRunFrameMultiPlat* get_Frame(); CRunAppMultiPlat* get_ParentApp(); std::size_t GetNumFusionFrames(); + const TCHAR * get_name(); + const TCHAR * get_appFileName(); + const TCHAR * get_editorFileName(); + const TCHAR * get_targetFileName(); }; struct RunHeader { diff --git a/DarkEdif/Inc/Shared/AllPlatformDefines.hpp b/DarkEdif/Inc/Shared/AllPlatformDefines.hpp index cd77db47..4759e626 100644 --- a/DarkEdif/Inc/Shared/AllPlatformDefines.hpp +++ b/DarkEdif/Inc/Shared/AllPlatformDefines.hpp @@ -104,7 +104,7 @@ using namespace std::string_view_literals; #elif defined(__clang__) && !defined (__INTELLISENSE__) #define PrintFHintInside /* no op */ // Defined after a C printf-style function declaration to allow code analysers to check the %x are correct type - #define PrintFHintAfter(formatParamIndex,dotsParamIndex) __printflike(formatParamIndex, dotsParamIndex) + #define PrintFHintAfter(formatParamIndex,dotsParamIndex) __attribute__((format(printf, formatParamIndex, dotsParamIndex))) #else // Defined inside a C printf-style function declaration + definition to allow code analysers to check argument types. #define PrintFHintInside /* no op */ @@ -335,10 +335,10 @@ enum_class_is_a_bitmask(TextCapacity); // ================================================================================================== // DarkEdif logging and macros. -// +// // These are printf-based, and expect a newline at end: // LOGI(_T("Some text with variable: %d\n"), 50); -// +// // Log levels are based on the ANDROID_LOG_XXX enum; in order of highest to lowest severity: // LOGF, LOGE, LOGW, LOGI, LOGD, LOGV. // @@ -354,6 +354,7 @@ enum_class_is_a_bitmask(TextCapacity); #define DARKEDIF_LOG_FATAL 7 namespace DarkEdif { void Log(int logLevel, PrintFHintInside const TCHAR* msgFormat, ...) PrintFHintAfter(2,3); + [[noreturn]] void LOGFInternal(PrintFHintInside const TCHAR* msgFormat, ...) PrintFHintAfter(1, 2); } #ifndef DARKEDIF_LOG_MIN_LEVEL @@ -419,16 +420,12 @@ namespace DarkEdif { #define NO_DEFAULT_CTORS_OR_DTORS(className) \ className() = delete; \ ~className() = delete; \ - className(className&) = delete; \ className(className&&) = delete; \ - className(const className&) = delete; \ - className(const className&&) = delete; + className(const className&) = delete; #define NO_DEFAULT_CTORS(className) \ className() = delete; \ - className(className&) = delete; \ className(className&&) = delete; \ - className(const className&) = delete; \ - className(const className&&) = delete; + className(const className&) = delete; struct extHeader final { @@ -696,8 +693,22 @@ enum class RunSpriteFlag : std::uint16_t { Rotate_Antialias = 0x10, // Object is visible, flashing accounted for, layer visibility not accounted for - overridden by Hidden flag Visible = 0x20, - // Runtime use only: Object's effect has been constructed in runtime side + +#ifndef __JAVASCRIPT__ + // For runtime use only: Object's effect has been constructed in runtime side + // Value used differently in JS based runtimes Created_Effect = 0x40 +#else // JavaScript-based runtime + // Probably JS based CSprite and CRSpr flags were conflated, + // as Rambo is SF_RAMBO, in non-JS based, used in CSprite sprFlags only, + + // RSFLAG_RAMBO: HTML5/UWP: Enables collision detection, + // used in place of CSprite.sprFlags and its SpriteFlag::Rambo + Rambo = 0x40, + // RSFLAG_COLBOX: HTML5/UWP: Collision based on rectangle, not fine collision, + // used in place of CSprite.sprFlags and its SpriteFlag::Rambo + CollisionBox = 0x80, +#endif // JavaScript }; // RSFLAG_XX enum enum_class_is_a_bitmask(RunSpriteFlag); @@ -765,3 +776,100 @@ enum class BlitOperation { }; enum_class_is_a_bitmask(BlitOperation); + +// Sprite flags (SF_XX enum) +// @remarks Source: a list of defines, gathered from CSprite.java/m/h +enum class SpriteFlag : std::uint32_t +{ +#ifndef __APPLE__ + // SF_RAMBO: Flag for "collides into everyone". + // Different value in iOS/Mac. + // Seems to decide if collision checks are run, + // but in Android is usually reset to true by movements. + Rambo = 0x00000001, +#else // Apple + // SF_TOKILL: Marked for destruction + // Different value in Windows/Android. + ToKill = 0x00000001, +#endif // Apple + // SF_RECALCSURF: Recalculates surface (if rotated or stretch) + // Commented out in Android/iOS, may not be used anymore + RecalcSurf = 0x00000002, + // SF_PRIVATE: Internal flag used for fade destruction + Private = 0x00000004, + // SF_INACTIF: Inactive: redraw only if intersecting another object + Inactive = 0x00000008, + // SF_TOHIDE: Marked for hiding + ToHide = 0x00000010, +#ifdef __APPLE__ + // SF_RAMBO: Flag for "collides into everyone". + // Different value in Windows/Android. + // Seems to decide if collision checks are run, + // but in Android is usually reset to true by movements. + Rambo = 0x00000020, +#else // not Apple + // SF_TOKILL: Marked for destruction + // Different value in iOS/Mac. + ToKill = 0x00000020, +#endif // not Apple + + // SF_REAF: Marked for redraw + Redraw = 0x00000040, + // SF_HIDDEN: Currently hidden by set invisible; see Disabled flag + Hidden = 0x00000080, + // SF_COLBOX: Use bounding-box collision detection, rather than fine collision + BoxCollision = 0x00000100, + // SF_NOSAVE: Do not save background + NoBackgroundSave = 0x00000200, + // SF_FILLBACK: Fill background with solid color + FillBackgroundWithColor = 0x00000400, + // SF_DISABLED: Indicates alpha/semi-transp value shows full transparency; also see flag + Disabled = 0x00000800, + // SF_REAFINT: Redraw internal-use flag (seems only to be turned off in runtimes) + Redraw_Internal = 0x00001000, + // SF_OWNERDRAW: Drawn by owner, not by runtime rendering sprImg. See also RunSpriteFlag::OwnerDraw. + OwnerDraw = 0x00002000, + // SF_OWNERSAVE: Background save handled by owner. + // @remarks See OEFLAGS::INTERNAL_BACK_SAVE, and HeaderObject::hoBackSave. + OwnerBackgroundSave = 0x00004000, + // SF_FADE: Internal flag indicating fade + Fade = 0x00008000, + // SF_OBSTACLE: Obstacle + Obstacle = 0x00010000, + // SF_PLATFORM: Platform + Platform = 0x00020000, + // SF_BACKGROUND: Backdrop object + Background = 0x00080000, + // SF_SCALE_RESAMPLE: Resample when scaling + ScaleResample = 0x00100000, + // SF_ROTATE_ANTIA: Antialias when rotating + Rotate_Antialis = 0x00200000, + // SF_NOHOTSPOT: Ignore hotspot/origin + NoHotspot = 0x00400000, + // SF_OWNERCOLMASK: Owner-drawn sprite provides collision mask + OwnerDrawn_CollisionMask = 0x00800000, + // SF_UPDATECOLLIST: Update collision list + UpdateCollisionList = 0x10000000, + +#if defined(__APPLE__) + // SF_NOKILLDATA: iOS/Mac: Does not kill the sprite data when killing the sprite. + // Only checked for when OwnerDraw is also set, in CSpriteGen::KillSprite() + NoKillData = 0x20000000, + + // Notes for posterity +#elif 0 + // SF_ANTIALIASING: Android: Antialias when rendering + // iOS/Mac use NoKillData for this value. + // May be a typo and meant to be BlitOperation::Antialias, + // as EFFECTFLAG_ANTIALIAS is also defined there to the same value, + // and both are stored in rsCreationFlags. + // @remarks Android does not seem to reference SF_ANTIALIASING or SF_NOKILLDATA + // in the runtime java files. It may be used in the display SOs. + // Note that Android display doesn't implement GetRunObjectSurface, + // so possibly that's the difference. + Antialiasing = 0x20000000, + // SF_TRUEOBJECT: XNA: Used with software QuickDisplay drawing + TrueObject = 0x20000000, +#endif +}; +enum_class_is_a_bitmask(SpriteFlag); diff --git a/DarkEdif/Inc/Shared/DarkEdif.hpp b/DarkEdif/Inc/Shared/DarkEdif.hpp index 9a58c4ff..6a601bb5 100644 --- a/DarkEdif/Inc/Shared/DarkEdif.hpp +++ b/DarkEdif/Inc/Shared/DarkEdif.hpp @@ -173,7 +173,6 @@ namespace DarkEdif { } public: // Explicitly not copiable - DebugItem(DebugItem&) = delete; DebugItem(const DebugItem&) = delete; // Explicitly moveable - moves are done by std::vector adding DebugItem(DebugItem&&) = default; @@ -686,12 +685,14 @@ namespace DarkEdif { FontInfoMultiPlat(jobject nativeFont); // Creates a copy of font settings of this native font void SetFont(const jobject nativeFont); -#else // Apple +#elif defined(__APPLE__) CFontInfo* cfontinfo = nullptr; // Creates a font info pointing to a native font FontInfoMultiPlat(CFontInfo* nativeFont); // Creates a copy of font settings of this native font void SetFont(const void* const nativeFont); +#else + #error Unexpected platform #endif #if TEXT_OEFLAG_EXTENSION // Creates a runtime-usable font from a EDITDATA font, tying it to an ext diff --git a/DarkEdif/Inc/Shared/Edif.hpp b/DarkEdif/Inc/Shared/Edif.hpp index bfcfc2c2..18945ac4 100644 --- a/DarkEdif/Inc/Shared/Edif.hpp +++ b/DarkEdif/Inc/Shared/Edif.hpp @@ -25,13 +25,13 @@ class Prop; #include "..\Windows\MMFWindowsMasterHeader.hpp" extern HINSTANCE hInstLib; #elif defined (__ANDROID__) - #include "..\Android\MMFAndroidMasterHeader.hpp" + #include "../Android/MMFAndroidMasterHeader.hpp" #elif defined (__APPLE__) -#if MacBuild == 0 - #include "../iOS/MMFiOSMasterHeader.hpp" -#else - #include "../Mac/MMFMacMasterHeader.hpp" -#endif + #if MacBuild == 0 + #include "../iOS/MMFiOSMasterHeader.hpp" + #else + #include "../Mac/MMFMacMasterHeader.hpp" + #endif #else #error Unexpected platform #endif @@ -221,9 +221,11 @@ namespace Edif // Attaches current thread, and gets JNIEnv for it; errors are fatal static void AttachJVMAccessForThisThread(const char * threadName, bool asDaemon = false); static void DetachJVMAccessForThisThread(); -#else +#elif defined(__APPLE__) Runtime(Extension* ext, void * const objCExtPtr); void * curCEvent; +#else + #error Unexpected platform #endif DarkEdif::FontInfoMultiPlat* extFont = NULL; diff --git a/DarkEdif/Inc/Shared/Strings.hpp b/DarkEdif/Inc/Shared/Strings.hpp index 2ce7ac5c..23b94e4e 100644 --- a/DarkEdif/Inc/Shared/Strings.hpp +++ b/DarkEdif/Inc/Shared/Strings.hpp @@ -122,3 +122,5 @@ namespace DarkEdif [[nodiscard]] bool SVComparePrefix(const std::string_view& text, const std::string_view& prefix); } +// VS 2017 won't define std::tolower without a manual include; later VS does +#include diff --git a/DarkEdif/Inc/Shared/SurfaceMultiPlat.hpp b/DarkEdif/Inc/Shared/SurfaceMultiPlat.hpp index d97a3287..5a7f54a2 100644 --- a/DarkEdif/Inc/Shared/SurfaceMultiPlat.hpp +++ b/DarkEdif/Inc/Shared/SurfaceMultiPlat.hpp @@ -204,8 +204,6 @@ namespace DarkEdif } Holder(C* clazz, T ptr, void (deleter)(C*,T)) : clazz(clazz), ptr(ptr), deleter(deleter) { } - Holder(Holder&&) = delete; - Holder(Holder&) = delete; Holder(const Holder&&) = delete; Holder(const Holder&) = delete; ~Holder() { @@ -371,11 +369,13 @@ namespace DarkEdif //global paint; //global paintClass; public: - #else // apple + #elif defined(__APPLE__) // Raw pixels, size and clip rectangle CRenderToTexture* bmp = nullptr; // Data around an image, can wrap a bmp and collision masks //CImage* img; + #else + #error Unexpected platform #endif /** Updates screen display manually. Runtime does not auto-redraw in some display modes. * @param zone If NULL or not specified, the whole surface. */ @@ -475,10 +475,8 @@ namespace DarkEdif // Copying and moving surfaces is explicitly disallowed, as it's unclear // if you want to copy the entire underlying memory, and allows edge cases // of copying when a buffer is locked. - Surface(Surface&) = delete; Surface(const Surface&) = delete; Surface(Surface&&) = delete; - Surface(const Surface&&) = delete; ~Surface(); bool wasaltered = false; diff --git a/DarkEdif/Inc/Windows/CFile.hpp b/DarkEdif/Inc/Windows/CFile.hpp index f77cf994..8170d2e4 100644 --- a/DarkEdif/Inc/Windows/CFile.hpp +++ b/DarkEdif/Inc/Windows/CFile.hpp @@ -1,7 +1,10 @@ #pragma once + // General errors -enum class CFCERROR { - NOT_ENOUGH_MEM = 0x40000000, +enum class CFCERROR : int { + NONE = 0, + MIN = 0x40000000, + NOT_ENOUGH_MEM = MIN, READ_ERROR, END_OF_FILE, WRITE_ERROR, @@ -14,37 +17,98 @@ enum class CFCERROR { MAX = 0x40010000, }; - - -FusionAPIImport HFILE FusionAPI File_OpenA(const char * fname, int mode); -FusionAPIImport HFILE FusionAPI File_CreateA(const char * fname); -FusionAPIImport int FusionAPI File_Read(HFILE hf, void * buf, unsigned int len); -FusionAPIImport int FusionAPI File_ReadAndCount(HFILE hf, void * buf, unsigned int len); -FusionAPIImport int FusionAPI File_ReadShortIntelData(HFILE hf, void ** pBuf); -FusionAPIImport int FusionAPI File_ReadShortIntelString(HFILE hf, void ** pBuf); -FusionAPIImport int FusionAPI File_ReadLongIntelData(HFILE hf, void ** pBuf); -FusionAPIImport int FusionAPI File_Write(HFILE hf, void * buf, unsigned int len); -FusionAPIImport unsigned int FusionAPI File_GetPosition(HFILE hf); -FusionAPIImport unsigned int FusionAPI File_SeekBegin(HFILE hf, long pos); -FusionAPIImport unsigned int FusionAPI File_SeekCurrent(HFILE hf, long pos); -FusionAPIImport unsigned int FusionAPI File_SeekEnd(HFILE hf, long pos); -FusionAPIImport long FusionAPI File_GetLength(HFILE hf); -FusionAPIImport void FusionAPI File_Close(HFILE hf); -FusionAPIImport BOOL FusionAPI File_ExistA(const char * pName); - -FusionAPIImport HFILE FusionAPI File_OpenW(const UShortWCHAR * fname, int mode); -FusionAPIImport HFILE FusionAPI File_CreateW(const UShortWCHAR * fname); -FusionAPIImport BOOL FusionAPI File_ExistW(const UShortWCHAR * pName); +#define _In_valid_hfile_ _In_ _Pre_satisfies_(hf != INVALID_HANDLE_VALUE) + +// Opens an existing filepath +FusionAPIImport _Success_(return != HFILE_ERROR) _Must_inspect_result_ _NODISCARD + HFILE FusionAPI File_OpenA(_In_z_ const char* fname, _In_ int mode) EXDEF; +// Creates a new file +// TODO: if file exists? +FusionAPIImport _Success_(return != HFILE_ERROR) _Must_inspect_result_ _NODISCARD + HFILE FusionAPI File_CreateA(_In_z_ const char* fname) EXDEF; +// Reads the given number of bytes from the file handle. Returns 0 on success, CFCERROR enum on failure. +FusionAPIImport _Success_(return == 0) _Must_inspect_result_ + int FusionAPI File_Read(_In_valid_hfile_ HFILE hf, _Out_writes_bytes_(len) void* buf, _In_ DWORD len) EXDEF; +// Reads given number of bytes, counting how many bytes were successfully read until EOF +// TODO: Confirm error handling +FusionAPIImport _Success_(return >= 0) _Must_inspect_result_ _NODISCARD + int FusionAPI File_ReadAndCount(_In_valid_hfile_ HFILE hf, _Out_writes_bytes_(len) void* buf, _In_ DWORD len) EXDEF; + +// TODO: Confirm usage and update code docs and SAL +FusionAPIImport _Success_(return == 0) _Must_inspect_result_ + int FusionAPI File_ReadShortIntelData(_In_valid_hfile_ HFILE hf, _Outptr_result_buffer_maybenull_(return) void** pBuf) EXDEF; + +// TODO: Confirm usage and update code docs and SAL +FusionAPIImport _Success_(return >= 0) _Must_inspect_result_ + int FusionAPI File_ReadShortIntelString(_In_valid_hfile_ HFILE hf, _Outptr_result_maybenull_z_ void** pBuf) EXDEF; + +// TODO: Confirm usage and update code docs and SAL +FusionAPIImport _Success_(return == 0) _Must_inspect_result_ + int FusionAPI File_ReadLongIntelData(_In_valid_hfile_ HFILE hf, + _Outptr_result_buffer_maybenull_(return) void** pBuf) EXDEF; + +// Returns 0 on success, CFCERROR enum on failure. +FusionAPIImport _Success_(return == 0) _Must_inspect_result_ + int FusionAPI File_Write(_In_valid_hfile_ HFILE hf, _In_reads_bytes_(len) void* buf, _In_ DWORD len) EXDEF; + +// Gets offset from start of file +// TODO: What does this return when HFILE is invalid? 0? INT64_MAX? +FusionAPIImport _NODISCARD + DWORD FusionAPI File_GetPosition(_In_valid_hfile_ HFILE hf) EXDEF; +// Seeks to new position relative to file start, returning original position (from start?) +// TODO: What does this return when HFILE is invalid? 0? INT64_MAX? +FusionAPIImport Fusion64APISwitch("Use File_SeekBegin_Ex") + DWORD FusionAPI File_SeekBegin(_In_valid_hfile_ HFILE hf, _In_range_(0, INT32_MAX) long pos) EXDEF; +// Seeks to new position relative to current position, returning original position (from start?) +// TODO: What does this return when HFILE is invalid? 0? INT64_MAX? +FusionAPIImport Fusion64APISwitch("Use File_SeekCurrent_Ex") + DWORD FusionAPI File_SeekCurrent(_In_valid_hfile_ HFILE hf, _In_ long pos) EXDEF; +// Performs a seek from the end of the file backwards by the specified amount. +// The position parameter should usually be <= 0. +// TODO: What does this return when HFILE is invalid? 0? INT64_MAX? +FusionAPIImport Fusion64APISwitch("Use File_SeekEnd_Ex") + DWORD FusionAPI File_SeekEnd(_In_valid_hfile_ HFILE hf, _In_ long pos) EXDEF; + +// Returns the file length. Limited to 2GiB files; see File_GetLength_Ex, or SetFilePointerEx. +FusionAPIImport Fusion64APISwitch("Use File_GetLength_Ex") _Success_(return >= 0) _Must_inspect_result_ _NODISCARD + long FusionAPI File_GetLength(_In_valid_hfile_ HFILE hf) EXDEF; + +// Closes the given HFILE. Does not change its value. Recommended to use CloseHandle() instead. +// @remarks Due to possible write issues (e.g. out of space), you should avoid using this function +// if writing the file, as you will not be able to flushing error scenarios, e.g. disk full. +// A successful write does not mean it got to the disk; it means OS cached it for writing successfully. +FusionAPIImport __declspec(deprecated("Use CloseHandle()")) + void FusionAPI File_Close(_In_valid_hfile_ _Pre_satisfies_(hf != INVALID_HANDLE_VALUE) _Post_invalid_ HFILE hf) EXDEF; +FusionAPIImport _Must_inspect_result_ _NODISCARD + BOOL FusionAPI File_ExistA(_In_z_ const char* pName) EXDEF; #ifdef _UNICODE +FusionAPIImport _Success_(return != HFILE_ERROR) _Must_inspect_result_ _NODISCARD + HFILE FusionAPI File_OpenW(_In_z_ const UShortWCHAR* fname, _In_ int mode) EXDEF; +FusionAPIImport _Success_(return != HFILE_ERROR) _Must_inspect_result_ _NODISCARD + HFILE FusionAPI File_CreateW(_In_z_ const UShortWCHAR* fname) EXDEF; +FusionAPIImport _Must_inspect_result_ _NODISCARD + BOOL FusionAPI File_ExistW(_In_z_ const UShortWCHAR* pName) EXDEF; + +// Phi note: limited some position parameters to signed int64 max, cos GetLengthEx is. +// I doubt we'll ever have >8 EiB files though. + +FusionAPIImport _Ret_range_(0, INT64_MAX) _Must_inspect_result_ _NODISCARD + std::int64_t FusionAPI File_GetLength_Ex(_In_valid_hfile_ HFILE hf) EXDEF; +FusionAPIImport _Ret_range_(0, INT64_MAX) _Must_inspect_result_ _NODISCARD + std::uint64_t FusionAPI File_GetPosition_Ex(_In_valid_hfile_ HFILE hf) EXDEF; +FusionAPIImport std::uint64_t FusionAPI File_SeekBegin_Ex(_In_valid_hfile_ HFILE hf, _In_range_(0, INT64_MAX) std::int64_t pos) EXDEF; +FusionAPIImport std::uint64_t FusionAPI File_SeekCurrent_Ex(_In_valid_hfile_ HFILE hf, _In_ std::int64_t pos) EXDEF; +FusionAPIImport std::uint64_t FusionAPI File_SeekEnd_Ex(_In_valid_hfile_ HFILE hf, _In_ std::int64_t pos) EXDEF; + #define File_Open File_OpenW #define File_Create File_CreateW #define File_Exist File_ExistW -#else +#else // !_UNICODE #define File_Open File_OpenA #define File_Create File_CreateA #define File_Exist File_ExistA -#endif +#endif // !_UNICODE #define File_ReadIntelWord(h,p,l) File_Read(h,p,l) #define File_ReadIntelDWord(h,p,l) File_Read(h,p,l) @@ -53,39 +117,117 @@ FusionAPIImport BOOL FusionAPI File_ExistW(const UShortWCHAR * pName); class FusionAPIImport CInputFile { public: - virtual ~CInputFile() {}; - - virtual void Delete(); - - virtual int Read(unsigned char * dest, unsigned long lsize) = 0; - virtual int Read(unsigned char * dest, unsigned long lsize, LPDWORD pRead) = 0; - virtual int ReadByte(unsigned char * dest) = 0; - virtual int ReadIntelWord(LPWORD dest); - virtual int ReadIntelDWord(LPDWORD dest); - virtual int ReadMacWord(LPWORD dest); - virtual int ReadMacDWord(LPDWORD dest); - virtual int ReadIntelFloat(PFLOAT dest); - virtual int ReadMacFloat(PFLOAT dest); - virtual int ReadIntelWordArray(LPWORD dest, int count); - virtual int ReadIntelDWordArray(LPDWORD dest, int count); - virtual int ReadIntelFloatArray(PFLOAT dest, int count); - virtual int ReadMacWordArray(LPWORD dest, int count); - virtual int ReadMacDWordArray(LPDWORD dest, int count); - virtual int ReadMacFloatArray(PFLOAT dest, int count); - - virtual long GetPosition() = 0; - virtual long GetLength() = 0; - virtual long Seek(long pos, int method) = 0; - - virtual int Attach(HANDLE hnd) = 0; - virtual HANDLE Detach() = 0; - - virtual unsigned char * GetBuffer(UINT nSize); - virtual void FreeBuffer(unsigned char * buf); - - virtual char * GetFileNameA() = 0; - virtual UShortWCHAR * GetFileNameW() = 0; - + virtual ~CInputFile() {}; + + // Deletes the object. + // TODO: Is this opposite of Create() like cSurface, or opposite of NewInstance? + virtual void Delete() EXDEF; + + // Reads a buffer of unsigned int8. Returns 0 on success, CFCERROR enum on failure. + // Written contents of buffer is undefined if EOF error occurs. + // TODO: Confirm return type is CFCERROR or not + virtual _Success_(return == 0) _Must_inspect_result_ + int Read(_Out_writes_bytes_(lsize) LPBYTE dest, _In_ DWORD lsize) = 0; + + // Reads a buffer of unsigned int8. Returns 0 on success, CFCERROR enum on failure. + // EOF may result in incomplete buffer. + // Passing null as pRead may be acceptable, or may not. + virtual _Success_(return == 0) _Must_inspect_result_ + int Read(_Out_writes_bytes_to_(lsize, *pRead) LPBYTE dest, _In_ DWORD lsize, _Out_ LPDWORD pRead) = 0; + + // Reads a byte (uint8). Returns 0 on success, CFCERROR enum on failure. + virtual _Success_(return == 0) _Must_inspect_result_ + int ReadByte(_Out_ LPBYTE dest) = 0; + + // Reads a little endian unsigned int16. Returns 0 on success, CFCERROR enum on failure. + virtual _Success_(return == 0) _Must_inspect_result_ + int ReadIntelWord(_Out_ LPWORD dest) EXDEF; + // Reads a little endian unsigned int32. Returns 0 on success, CFCERROR enum on failure. + virtual _Success_(return == 0) _Must_inspect_result_ + int ReadIntelDWord(_Out_ LPDWORD dest) EXDEF; + // Reads a big endian unsigned int16. Returns 0 on success, CFCERROR enum on failure. + virtual _Success_(return == 0) _Must_inspect_result_ + int ReadMacWord(_Out_ LPWORD dest) EXDEF; + // Reads a big endian unsigned int32. Returns 0 on success, CFCERROR enum on failure. + virtual _Success_(return == 0) _Must_inspect_result_ + int ReadMacDWord(_Out_ LPDWORD dest) EXDEF; + // Reads a little endian float32. Returns 0 on success, CFCERROR enum on failure. + virtual _Success_(return == 0) _Must_inspect_result_ + int ReadIntelFloat(_Out_ PFLOAT dest) EXDEF; + // Reads a big endian float32. Returns 0 on success, CFCERROR enum on failure. + virtual _Success_(return == 0) _Must_inspect_result_ + int ReadMacFloat(_Out_ PFLOAT dest) EXDEF; + // Reads array of little endian unsigned int16. Returns 0 on success, CFCERROR enum on failure. + // Contents of array is undefined if EOF error occurs. + virtual _Success_(return == 0) _Must_inspect_result_ + int ReadIntelWordArray(_Out_writes_(count) LPWORD dest, _In_range_(0, INT_MAX) int count) EXDEF; + // Reads an array of little endian unsigned int32. Returns 0 on success, CFCERROR enum on failure. + // Contents of array is undefined if EOF error occurs. + virtual _Success_(return == 0) _Must_inspect_result_ + int ReadIntelDWordArray(_Out_writes_(count) LPDWORD dest, _In_range_(0, INT_MAX) int count) EXDEF; + // Reads an array of little endian float32. Returns 0 on success, CFCERROR enum on failure. + // Contents of array is undefined if EOF error occurs. + virtual _Success_(return == 0) _Must_inspect_result_ + int ReadIntelFloatArray(_Out_writes_(count) PFLOAT dest, _In_range_(0, INT_MAX) int count) EXDEF; + // Reads an array of big endian unsigned int16. Returns 0 on success, CFCERROR enum on failure. + // Contents of array is undefined if EOF error occurs. + virtual _Success_(return == 0) _Must_inspect_result_ + int ReadMacWordArray(_Out_writes_(count) LPWORD dest, _In_range_(0, INT_MAX) int count) EXDEF; + // Reads an array of big endian unsigned int32. Returns 0 on success, CFCERROR enum on failure. + // Contents of array is undefined if EOF error occurs. + virtual _Success_(return == 0) _Must_inspect_result_ + int ReadMacDWordArray(_Out_writes_(count) LPDWORD dest, _In_range_(0, INT_MAX) int count) EXDEF; + // Reads an array of big endian float32. Returns 0 on success, CFCERROR enum on failure. + // Contents of array is undefined if EOF error occurs. + virtual _Success_(return == 0) _Must_inspect_result_ + int ReadMacFloatArray(_Out_writes_(count) PFLOAT dest, _In_range_(0, INT_MAX) int count) EXDEF; + + // Gets byte position inside file, limited to 2GiB; undefined return if file is larger than 2GiB. + // For files that may be that large, you may want to detach the file and use GetFileSizeEx(). + virtual _Success_(return >= 0) _Must_inspect_result_ + long GetPosition() = 0; + // Gets number of bytes of the file, limited to 2GiB; undefined return if file is larger than 2GiB. + // For files that may be larger, you may want to detach the file and use GetFileSizeEx(). + virtual _Success_(return >= 0) _Must_inspect_result_ + long GetLength() = 0; + + // Relocates the read position by byte offset relative to start or end of file, or current position of read cursor, depending on method. + // See SEEK_XX methods. When seeking from end, SEEK_END, an offset of -5 is 5 bytes from the end of the file. + // Returns original byte position from start of file, limited to 2GiB. + // @remarks While you can pass a positive offset and write beyond end of file, + // this may create a sparse file and that's probably not wanted. + // TODO: Confirm return value semantics when not using start of file seek + virtual _Success_(return >= 0) + long Seek(_In_ _When_(method==SEEK_SET, _In_range_(0, INT32_MAX)) + _When_(method==SEEK_END, _In_range_(INT32_MIN, 0)) + long offset, _In_range_(0,2) int method) EXDEF; + + // Stores a file handle inside the file. The file pointer is not invalidated. + // TODO: Confirm NULL or INVALID_HANDLE_VALUE. + // TODO: Confirm HFILE swap possible or not. + virtual _Success_(return >= 0) _Must_inspect_result_ + int Attach(_In_valid_hfile_ HANDLE hf) = 0; + // Removes the stored file handle from the class. The next detach call will return null. + // TODO: Confirm NULL or INVALID_HANDLE_VALUE. + virtual _Must_inspect_result_ _NODISCARD + HANDLE Detach() = 0; + + // Reads a section of the file. The memory is const! + virtual _Success_(return != nullptr) _Must_inspect_result_ _Ret_bytecount_(nSize) _NODISCARD + LPBYTE GetBuffer(_In_ UINT nSize) EXDEF; + + // For freeing if you did Create() then DetachBuffer() only. + // Otherwise, destroy the object, or detach the buffer then free. + virtual void FreeBuffer(_Pre_notnull_ _Post_ptr_invalid_ LPBYTE buf) EXDEF; + + // Gets the file name of this CInputFile. May be null if a memory-based file like CInputMemFile. + virtual _Ret_maybenull_z_ + char * GetFileNameA() = 0; + // Gets the file name of this CInputFile. May be null if a memory-based file like CInputMemFile. + virtual _Ret_maybenull_z_ + UShortWCHAR * GetFileNameW() = 0; + + // Recommended you don't use these, due to conflict with e.g. IFileDialog::GetFileName #ifdef _CFCFILE_UNICODE_DEFS #if defined(_UNICODE) #define GetFileName GetFileNameW @@ -100,51 +242,93 @@ class FusionAPIImport CInputFile class FusionAPIImport CInputBufFile : public CInputFile { public: - CInputBufFile(); - virtual ~CInputBufFile(); - - static CInputBufFile * NewInstance(); - - int Create(HFILE hf); - int Create(HFILE hf, unsigned int dwOffset, unsigned int dwSize); - int Create(const char * filename); - int Create(const char * filename, unsigned int dwOffset, unsigned int dwSize); - int Create(const UShortWCHAR * filename); - int Create(const UShortWCHAR * filename, unsigned int dwOffset, unsigned int dwSize); - - virtual int Read(unsigned char * dest, unsigned int lsize); - virtual int Read(unsigned char * dest, unsigned int lsize, LPDWORD pRead); - virtual int ReadByte(unsigned char * dest); - // virtual int ReadWord(LPWORD dest); - // virtual int ReadDWord(LPDWORD dest); - virtual long GetPosition(); - virtual long GetLength(); - virtual long Seek(long pos, int method); - - virtual int Attach(HANDLE hnd); - virtual HANDLE Detach(); - - // virtual unsigned char * GetBuffer(UINT nSize); - // virtual void FreeBuffer(unsigned char * buf); - - virtual char * GetFileNameA(); - virtual UShortWCHAR * GetFileNameW(); + CInputBufFile() EXDEF; + virtual ~CInputBufFile() EXDEF; + + static _Ret_maybenull_ + CInputBufFile * NewInstance() EXDEF; + + // Creates a buffer that is attached to the file. + // Returns 0 on success, CFCERROR enum on failure. + _Success_(return == 0) _Must_inspect_result_ + int Create(_In_valid_hfile_ HFILE hf) EXDEF; + // Creates a buffer that is attached to the given byte range of a file, from [dwOffset, dwOffset+dwSize). + // Returns 0 on success, CFCERROR enum on failure. + _Success_(return == 0) _Must_inspect_result_ + int Create(_In_valid_hfile_ HFILE hf, _In_ DWORD dwOffset, _In_ DWORD dwSize) EXDEF; + // Returns 0 on success, CFCERROR enum on failure. + _Success_(return == 0) _Must_inspect_result_ + int Create(_In_z_ const char * filename) EXDEF; + // Returns 0 on success, CFCERROR enum on failure. + _Success_(return == 0) _Must_inspect_result_ + int Create(_In_z_ const char * filename, _In_ DWORD dwOffset, _In_ DWORD dwSize) EXDEF; + // Returns 0 on success, CFCERROR enum on failure. + _Success_(return == 0) _Must_inspect_result_ + int Create(_In_z_ const UShortWCHAR * filename) EXDEF; + // Returns 0 on success, CFCERROR enum on failure. + _Success_(return == 0) _Must_inspect_result_ + int Create(_In_z_ const UShortWCHAR * filename, _In_ DWORD dwOffset, _In_ DWORD dwSize) EXDEF; + + // Reads the given number of bytes, returns 0 on success; to see read amount, pass third param + virtual _Success_(return == 0 && return < (int)CFCERROR::MIN) _Must_inspect_result_ + int Read(_Out_writes_bytes_(lsize) LPBYTE dest, _In_ DWORD lsize) EXDEF; + // Reads the given number of bytes, returns 0 on success. The amount read is stored in pRead. + virtual _Success_(return == 0 || return == CFCERROR::END_OF_FILE) _Must_inspect_result_ + int Read(_Out_writes_bytes_to_(lsize, *pRead) LPBYTE dest, _In_ DWORD lsize, _Out_ LPDWORD pRead) EXDEF; + // Reads a byte, returns 0 on success + virtual _Success_(return == 0) _Must_inspect_result_ + int ReadByte(_Out_ LPBYTE dest) EXDEF; + // virtual int ReadWord(LPWORD dest) EXDEF; + // virtual int ReadDWord(LPDWORD dest) EXDEF; + virtual _Success_(return >= 0) _Must_inspect_result_ _NODISCARD + long GetPosition() EXDEF; + virtual _Success_(return >= 0) _Must_inspect_result_ _NODISCARD + long GetLength() EXDEF; + + // Seeks to the specified relative offset from the given exact position. + // When seeking from end, SEEK_END, an offset of 5 is 5 bytes from the end of the file. + // The return value is the position from start of file. + // TODO: Confirm return value semantics when not using start of file seek + virtual _Success_(return >= 0) + long Seek( + _In_ _When_(method==SEEK_SET, _In_range_(0, INT32_MAX)) + long offset, _In_range_(0,2) int method) EXDEF; + + // Stores the underlying file handle and adjusts the internal range to the full file + // TODO: Investigate ownership mechanics + virtual _Success_(return >= 0) _Must_inspect_result_ + int Attach(_In_valid_hfile_ HANDLE hf) EXDEF; + // Returns the underlying file handle and removes it from ownership + virtual _Must_inspect_result_ _NODISCARD + HANDLE Detach() EXDEF; + + // virtual unsigned char * GetBuffer(UINT nSize) EXDEF; + // virtual void FreeBuffer(LPBYTE buf) EXDEF; + + // Returns the filename in ANSI - null if no underlying handle, e.g. a CInputMemFile + virtual _Ret_maybenull_z_ + char * GetFileNameA() EXDEF; + // Returns the filename in Unicode format - null if no underlying handle, e.g. a CInputMemFile + virtual _Ret_maybenull_z_ + UShortWCHAR * GetFileNameW() EXDEF; protected: - int Attach(HANDLE hnd, unsigned int dwOffset, unsigned int dwSize); + // Attach to a byte range [dwOffset, dwOffset + dwSize) of the passed handle. + virtual _Success_(return == 0) _Must_inspect_result_ + int Attach(_In_valid_hfile_ HANDLE hf, _In_ DWORD dwOffset, _In_ DWORD dwSize) EXDEF; private: - HFILE m_hf; - unsigned int m_curpos; - unsigned char * m_buffer; - unsigned char * m_bufcurr; - unsigned int m_remains; - UShortWCHAR * m_fnameW; - char * m_fnameA; - - unsigned int m_startOffset; - unsigned int m_length; + HFILE m_hf; + DWORD m_curpos; + LPBYTE m_buffer; + LPBYTE m_bufcurr; + DWORD m_remains; + UShortWCHAR * m_fnameW; + char * m_fnameA; + + DWORD m_startOffset; + DWORD m_length; }; -typedef CInputBufFile * LPINPUTBUFFILE; +//typedef CInputBufFile * LPINPUTBUFFILE; #define BUFFILE_BUFFER_SIZE 16384 @@ -152,39 +336,88 @@ typedef CInputBufFile * LPINPUTBUFFILE; class FusionAPIImport CInputMemFile : public CInputFile { public: - CInputMemFile(); - virtual ~CInputMemFile(); - - static CInputMemFile * NewInstance(); - - int Create(unsigned char * buffer, unsigned long lsize); - int Create(unsigned long lsize); - unsigned char * GetMemBuffer(); - - virtual int Read(unsigned char * dest, unsigned long lsize); - virtual int Read(unsigned char * dest, unsigned long lsize, LPDWORD pRead); - virtual int ReadByte(unsigned char * dest); - // virtual int ReadWord(LPWORD dest); - // virtual int ReadDWord(LPDWORD dest); - virtual long GetPosition(); - virtual long GetLength(); - virtual long Seek(long pos, int method); - - virtual int Attach(HANDLE hnd); - virtual HANDLE Detach(); - - virtual unsigned char * GetBuffer(UINT nSize); - virtual void FreeBuffer(unsigned char * buf); - - virtual char * GetFileNameA() { return NULL; } - virtual UShortWCHAR * GetFileNameW() { return NULL; } + CInputMemFile() EXDEF; + virtual ~CInputMemFile() EXDEF; + + static _Ret_maybenull_ + CInputMemFile * NewInstance() EXDEF; + + // Points the internal buffer to the given pointer and size + // Returns 0 on success, CFCERROR enum on failure. + _Success_(return == 0) _Must_inspect_result_ + int Create(_Pre_notnull_ _Pre_readable_byte_size_(lsize) LPBYTE buffer, _In_ DWORD lsize) EXDEF; + // Allocates a buffer pointing to the given pointer and size + // Returns 0 on success, CFCERROR enum on failure. + _Success_(return == 0) _Must_inspect_result_ + int Create(_In_ DWORD lsize) EXDEF; + + // Gets the underlying memory buffer, pointing to the start. + _Ret_maybenull_ _Must_inspect_result_ _NODISCARD + LPBYTE GetMemBuffer() EXDEF; + + // Reads a given section from the buffer, advancing the internal cursor. Returns 0 on success. + virtual _Success_(return == 0) _Must_inspect_result_ + int Read(_Out_writes_bytes_(lsize) LPBYTE dest, _In_ DWORD lsize) EXDEF; + // Reads a given section from the buffer, advancing the internal cursor. Returns 0 on success. + // Writes the number of read bytes to parameter. + virtual _Success_(return == 0 || return == CFCERROR::END_OF_FILE) _Must_inspect_result_ + int Read(_Out_writes_bytes_to_(lsize, *pRead) LPBYTE dest, _In_ DWORD lsize, _Out_ LPDWORD pRead) EXDEF; + // Reads a single byte from the buffer to the parameter, advancing the internal cursor. Returns 0 on success. + virtual _Success_(return == 0) _Must_inspect_result_ + int ReadByte(_Out_ LPBYTE dest) EXDEF; + // virtual int ReadWord(LPWORD dest) EXDEF; + // virtual int ReadDWord(LPDWORD dest) EXDEF; + + // Reads the current position of the internal cursor relative to start of buffer, limited to 2GiB. + // TODO: What does this return if no buffer? + virtual _Success_(return >= 0) _Must_inspect_result_ + long GetPosition() EXDEF; + + // Reads the size of the current buffer, limited to 2GiB. + // TODO: What does this return if no buffer? 0? + virtual _Success_(return >= 0) _Must_inspect_result_ _NODISCARD + long GetLength() EXDEF; + // Moves the internal cursor to a new position relative to the buffer. + // Relocates the read position by byte offset relative to start or end of file, or current position of read cursor, depending on method. + // See SEEK_XX methods. When seeking from end, SEEK_END, an offset of -5 is 5 bytes from the end of the file. + // Returns original byte position from start of file, limited to 2GiB. + // TODO: Confirm return value semantics when not using start of file seek + virtual _Success_(return >= 0) + long Seek(_In_ _When_(method == SEEK_SET, _In_range_(0, INT32_MAX)) + _When_(method == SEEK_END, _In_range_(INT32_MIN, 0)) + long offset, + _In_range_(0, 2) int method) EXDEF; + + // Stores a file handle inside the file. The file pointer is not invalidated. + // TODO: Confirm NULL or INVALID_HANDLE_VALUE. + // TODO: Confirm HFILE swap possible or not. + virtual _Success_(return == 0) _Must_inspect_result_ + int Attach(_In_valid_hfile_ HANDLE hf) EXDEF; + // Removes the stored file handle from the class. The next detach call will return null. + // TODO: Confirm NULL or INVALID_HANDLE_VALUE. + virtual _Must_inspect_result_ _NODISCARD + HANDLE Detach() EXDEF; + + // Reads a section of the file. The memory is const! + virtual _Success_(return != nullptr) _Must_inspect_result_ _Ret_bytecount_(nSize) _NODISCARD + LPBYTE GetBuffer(_In_ UINT nSize) EXDEF; + // For freeing if you did Create() then DetachBuffer() only. + // Otherwise, destroy the object, or detach the buffer then free. + virtual void FreeBuffer(_Pre_notnull_ _Post_ptr_invalid_ LPBYTE buf) EXDEF; + + // Returns null ptr, always + virtual _Ret_maybenull_z_ + char * GetFileNameA() EXDEF; + // Returns null ptr, always + virtual _Ret_maybenull_z_ + UShortWCHAR * GetFileNameW() EXDEF; private: - unsigned char * m_buffer; - unsigned char * m_bufcurr; - unsigned int m_curpos; - unsigned int m_remains; - BOOL m_bAutoDelete; + LPBYTE m_buffer; + LPBYTE m_bufcurr; + DWORD m_curpos; + DWORD m_remains; + BOOL m_bAutoDelete; }; //typedef CInputMemFile * LPINPUTMEMFILE; @@ -195,24 +428,45 @@ class FusionAPIImport COutputFile COutputFile() {}; virtual ~COutputFile() {}; - // virtual int WriteByte(BYTE b) = 0; - // virtual int WriteWord(WORD b) = 0; - - int WriteIntelWord(LPWORD pw); - int WriteIntelDWord(LPDWORD pdw); - int WriteIntelFloat(PFLOAT dest); - int WriteMacWord(LPWORD pw); - int WriteMacDWord(LPDWORD pdw); - - virtual int Write(unsigned char * pb, UINT sz) = 0; - virtual int Flush() = 0; - virtual unsigned int GetLength() = 0; - - virtual long GetPosition() = 0; - virtual long Seek(long pos, int method) = 0; - - virtual char * GetFileNameA() = 0; - virtual UShortWCHAR * GetFileNameW() = 0; + // virtual int WriteByte(BYTE b) = 0; + // virtual int WriteWord(WORD b) = 0; + + // Returns 0 on success, CFCERROR enum on failure. + _Success_(return == 0) _Must_inspect_result_ + int WriteIntelWord(_In_ LPWORD pw) EXDEF; + // Returns 0 on success, CFCERROR enum on failure. + _Success_(return == 0) _Must_inspect_result_ + int WriteIntelDWord(_In_ LPDWORD pdw) EXDEF; + // Returns 0 on success, CFCERROR enum on failure. + _Success_(return == 0) _Must_inspect_result_ + int WriteIntelFloat(_In_ PFLOAT dest) EXDEF; + // Returns 0 on success, CFCERROR enum on failure. + _Success_(return == 0) _Must_inspect_result_ + int WriteMacWord(_In_ LPWORD pw) EXDEF; + // Returns 0 on success, CFCERROR enum on failure. + _Success_(return == 0) _Must_inspect_result_ + int WriteMacDWord(_In_ LPDWORD pdw) EXDEF; + + // Returns 0 on success, CFCERROR enum on failure. + virtual _Success_(return == 0) _Must_inspect_result_ + int Write(_In_reads_bytes_(sz) LPBYTE pb, _In_ UINT sz) = 0; + // Returns 0 on success, CFCERROR enum on failure. + virtual _Success_(return == 0) _Must_inspect_result_ + int Flush() = 0; + // Gets number of bytes written so far. Unsigned; no failure value documented. + virtual _Must_inspect_result_ + DWORD GetLength() = 0; + + virtual _Success_(return >= 0) _Must_inspect_result_ _NODISCARD + long GetPosition() = 0; + virtual long Seek(long pos, int method) = 0; + + // Returns the filename in ANSI - null if no underlying handle, e.g. a COutputMemFile + virtual _Ret_maybenull_z_ + char * GetFileNameA() = 0; + // Returns the filename in Unicode - null if no underlying handle, e.g. a COutputMemFile + virtual _Ret_maybenull_z_ + UShortWCHAR * GetFileNameW() = 0; }; //typedef COutputFile * LPOUTPUTFILE; @@ -220,62 +474,136 @@ class FusionAPIImport COutputFile class FusionAPIImport COutputMemFile : public COutputFile { public: - COutputMemFile(); - virtual ~COutputMemFile(); - - int Create(UINT nBlockSize = 512); - int Create(unsigned char * buffer, unsigned int nBufferSize = 0x7FFFFFF); - unsigned char * GetBuffer(); - unsigned char * DetachBuffer(); - static void FreeBuffer(unsigned char * pBuffer); // car il faut libérer à l'interieur de la DLL - - virtual int Write(unsigned char * pb, UINT sz); - virtual int Flush(); - virtual unsigned int GetLength(); - - virtual long GetPosition(); - virtual long Seek(long pos, int method); - - virtual char * GetFileNameA() { return NULL; } - virtual UShortWCHAR * GetFileNameW() { return NULL; } + // Creates a RAM-backed faux file. + COutputMemFile() EXDEF; + // @remarks Is this noexcept? + virtual ~COutputMemFile() EXDEF; + + // Creates a buffer using Fusion runtime memory. Must free this with FreeBuffer(). + // Returns 0 on success, CFCERROR enum on failure. + _Success_(return == 0) _Must_inspect_result_ + int Create(_In_ UINT nBlockSize = 512) EXDEF; + + // Creates a buffer using Fusion runtime memory. Must free with FreeBuffer(). + // Returns 0 on success, CFCERROR enum on failure. + // @remarks Phi note: I removed the default value. Not sure why there's + // a default size for an input buffer. + // TODO: What sort of free does the COutputMemFile() do in dtor? + // DLL memory or runtime free? + // If the latter, we'll probably have to advise to not use this Create variant, + // as it makes state inconsistent + _Success_(return == 0) _Must_inspect_result_ + int Create(_Pre_notnull_ LPBYTE buffer, + _In_range_(0, INT32_MAX) DWORD nBufferSize) EXDEF; + + // Gets a copy of the underlying buffer pointer. + _Ret_maybenull_ _Must_inspect_result_ _NODISCARD + LPBYTE GetBuffer() EXDEF; + + // Gets the underlying buffer, releasing it from the class. + // The caller must free it using the correct function. + _Ret_maybenull_ _Must_inspect_result_ _NODISCARD + LPBYTE DetachBuffer() EXDEF; + + // For freeing if you did Create() then DetachBuffer() only. + // Otherwise, destroy the object, or detach the buffer then free. + static void FreeBuffer(_Pre_notnull_ _Post_ptr_invalid_ LPBYTE pBuffer) EXDEF; + + // Writes passed data to the memory buffer. + // Returns 0 on success, CFCERROR enum on failure. + virtual _Success_(return == 0) _Must_inspect_result_ + int Write(_In_reads_bytes_(sz) LPBYTE pb, _In_ UINT sz) EXDEF; + + // Flushes any pending writes to the file. + // Returns 0 on success, CFCERROR enum on failure. + virtual _Success_(return == 0) _Must_inspect_result_ + int Flush() EXDEF; + // Gets number of bytes written so far. Unsigned; no failure value documented. + virtual _Must_inspect_result_ + DWORD GetLength() EXDEF; + + virtual _Success_(return == 0) _Must_inspect_result_ + long GetPosition() EXDEF; + virtual long Seek(long pos, int method) EXDEF; + + // Returns null, as COutputMemFile stores in memory only. + virtual _Ret_null_ + char * GetFileNameA() { return nullptr; } + // Returns null, as COutputMemFile stores in memory only. + virtual _Ret_null_ + UShortWCHAR * GetFileNameW() { return nullptr; } private: - unsigned char * m_buffer; - unsigned char * m_curptr; - unsigned int m_totalsize; - unsigned int m_cursize; - unsigned int m_blocksize; - BOOL m_bReallocable; + LPBYTE m_buffer; + LPBYTE m_curptr; + DWORD m_totalsize; + DWORD m_cursize; + DWORD m_blocksize; + BOOL m_bReallocable; }; // Bufferized output file class FusionAPIImport COutputBufFile : public COutputFile { public: - COutputBufFile(); - virtual ~COutputBufFile(); - - int Create(HFILE hf, UINT nBufferSize = 4096); - int Create(const char * fname, UINT nBufferSize = 4096); - int Create(const UShortWCHAR * fname, UINT nBufferSize = 4096); - - virtual int Write(unsigned char * pb, UINT sz); - virtual int Flush(); - virtual unsigned int GetLength(); - - virtual long GetPosition(); - virtual long Seek(long pos, int method); - - virtual char * GetFileNameA(); - virtual UShortWCHAR * GetFileNameW(); + COutputBufFile() EXDEF; + virtual ~COutputBufFile() EXDEF; + + // Returns 0 on success, CFCERROR enum on failure. + _Success_(return == 0) _Must_inspect_result_ + int Create(_In_ HFILE hf, _In_ UINT nBufferSize = 0xFFFF) EXDEF; + // Opens write access to the given file, overwriting? + // Returns 0 on success, CFCERROR enum on failure. + // Use _FUSIONT("X") for filename if wanting Unicode compatibility. + _Success_(return == 0) _Must_inspect_result_ + int Create(_In_z_ const char * fname, _In_ UINT nBufferSize = 0xFFFF) EXDEF; + // Returns 0 on success, CFCERROR enum on failure. + // Use _FUSIONT("X") for filename if wanting ANSI compatibility. + _Success_(return == 0) _Must_inspect_result_ + int Create(_In_z_ const UShortWCHAR * fname, _In_ UINT nBufferSize = 0xFFFF) EXDEF; + + // Writes passed data to file. It may not be flushed to disk immediately. + // Returns 0 on success, CFCERROR enum on failure. + virtual _Success_(return == 0) _Must_inspect_result_ + int Write(_In_reads_bytes_(sz) _Const_ LPBYTE pb, _In_ UINT sz) EXDEF; + // Flushes any pending writes to the file. + // Returns 0 on success, CFCERROR enum on failure. + virtual _Success_(return == 0) _Must_inspect_result_ + int Flush() EXDEF; + + // Gets file length, 0+. + // @remarks TODO: Is this file length, or written file length? + // On invalid HFILE, what happens? + virtual _Must_inspect_result_ + DWORD GetLength() EXDEF; + + // Gets file position, 0+ for valid file. + // @remarks TODO: Is this file length, or written file length? + virtual _Success_(return >= 0) _Must_inspect_result_ + long GetPosition() EXDEF; + // Seeks to the specified relative offset from the given exact position. + // When seeking from end, SEEK_END, an offset of 5 is 5 bytes from the end of the file. + // The return value is the position from start of file. + // TODO: Confirm return value semantics when not using start of file seek + virtual _Success_(return >= 0) _Must_inspect_result_ + long Seek( + _When_(method==SEEK_SET, _In_range_(0, INT32_MAX)) + _In_ long offset, _In_range_(0,2) int method) EXDEF; + + // Gets filename in ANSI, or null if class is not holding a file (no successful Create call). + virtual _Ret_maybenull_z_ + char * GetFileNameA() EXDEF; + // Gets filename in Unicode characters, or null if class is not holding a file (no successful Create call). + virtual _Ret_maybenull_z_ + UShortWCHAR * GetFileNameW() EXDEF; private: - HFILE m_hf; - UShortWCHAR * m_fnameW; - unsigned char * m_buffer; - unsigned char * m_curptr; - unsigned int m_cursize; - unsigned int m_buffersize; - BOOL m_bBuffered; - char * m_fnameA; + HFILE m_hf; + UShortWCHAR * m_fnameW; + LPBYTE m_buffer; + LPBYTE m_curptr; + DWORD m_cursize; + DWORD m_buffersize; + BOOL m_bBuffered; + char * m_fnameA; }; diff --git a/DarkEdif/Inc/Windows/FilterMgr.hpp b/DarkEdif/Inc/Windows/FilterMgr.hpp index 92ee73f0..9fbac27b 100644 --- a/DarkEdif/Inc/Windows/FilterMgr.hpp +++ b/DarkEdif/Inc/Windows/FilterMgr.hpp @@ -38,8 +38,8 @@ class FusionAPIImport CFilterMgrANSI20 virtual LPCSTR GetFilterFileNameA(int nIndex); virtual DWORD GetFilterID(int nIndex); virtual int GetFilterIndex(DWORD dwID); - virtual LPCSTR* GetFilterExtsA(int nIndex); - virtual LPCSTR* GetFilterDependenciesA(int nIndex); + virtual LPCSTR * GetFilterExtsA(int nIndex); + virtual LPCSTR * GetFilterDependenciesA(int nIndex); virtual BOOL CanReadFile(int nIndex, CInputFile* pif); // Filter object creation diff --git a/DarkEdif/Inc/Windows/MMFWindowsMasterHeader.hpp b/DarkEdif/Inc/Windows/MMFWindowsMasterHeader.hpp index 9ab431af..455d4c95 100644 --- a/DarkEdif/Inc/Windows/MMFWindowsMasterHeader.hpp +++ b/DarkEdif/Inc/Windows/MMFWindowsMasterHeader.hpp @@ -1,5 +1,3 @@ -/// - #pragma once #ifndef _WIN32 #error Included the wrong header for this OS. @@ -144,88 +142,153 @@ enum class CallFunctionIDs : int { CREATEIMAGEFROMFILEW, // Create image from file (runtime only) }; +// @remarks Source: cnpdll.h, not used in any C++ DLL funcs struct Obj { NO_DEFAULT_CTORS_OR_DTORS(Obj); - unsigned int size, // Taille de l'objet: 0 = fin objets - PrevSize, // Taille objet precedent (0 = 1er objet) - Type, // Type d'objet (1=vide,2=appli,3=fenetre,...) - Prev, // Adresse objet precedent de meme type (0 = first) - Next; // Adresse objet suivant de meme type (0 = last) + // Taille de l'objet: 0 = fin objets + std::uint32_t objSize; + // Taille objet precedent (0 = 1er objet) + std::uint32_t objPrevSize; + // Type d'objet (1=vide,2=appli,3=fenetre,...) + std::uint32_t objType; + // Adresse objet precedent de meme type (0 = first) + std::uint32_t objPrev; + // Adresse objet suivant de meme type (0 = last) + std::uint32_t objNext; }; //typedef Obj *npObj; //typedef Obj *fpObj; -// This is the CSprite class, not the CRSpr class. -struct Sprite +// Sprite information: layer, angle, z order, etc. For Actives, mostly. +// See related RunSprite, used for any object with OEFLAGS::SPRITES. +// @remarks Source: cnpdll.h, Spr. Only used in C, not C++ exported DLL funcs +// This is the CSprite class in non-Windows. Not to be confused with CRSpr. +struct CSprite { - NO_DEFAULT_CTORS_OR_DTORS(Sprite); - #ifndef SPRLIST - Obj Obj; - #endif - unsigned int Flags; // Flags - unsigned short Layer; // Sprite plane (layer) - short Angle; // Angle - int ZOrder, // Z-order value - X, // X Position - Y, // Y Position - X1, // Bounding box, top left corner X pos - Y1, // Bounding box, top left corner Y pos - X2, // Bounding box, bottom right corner X pos - Y2, // Bounding box, bottom right corner Y pos - Xnew, // New X Position - Ynew, // New Y Position - X1new, // New bounding box, top left corner X pos - Y1new, // New bounding box, top left corner Y pos - X2new, // New bounding box, bottom right corner X pos - Y2new, // New bounding box, bottom right corner Y pos - X1z, // Background bounding box, top left corner X pos - Y1z, // Background bounding box, top left corner Y pos - X2z, // Background bounding box, bottom right corner X pos - Y2z; // Background bounding box, bottom right corner Y pos - float XScale, - YScale; + NO_DEFAULT_CTORS_OR_DTORS(CSprite); + + // @remarks Only present #ifndef SPRLIST, but SPRLIST is never explained or defined + // in ext SDK + Obj sprObj; + + // Sprite flag bit + SpriteFlag sprFlags; + // Sprite plane (layer) + std::uint16_t sprLayer; + // Angle + std::int16_t sprAngle; + // Z-order value + std::int32_t sprZOrder; + // X Position + std::int32_t sprX; + // Y Position + std::int32_t sprY; + // Bounding box, top left corner X pos + std::int32_t sprX1; + // Bounding box, top left corner Y pos + std::int32_t sprY1; + // Bounding box, bottom right corner X pos + std::int32_t sprX2; + // Bounding box, bottom right corner Y pos + std::int32_t sprY2; + // New X Position + std::int32_t sprXnew; + // New Y Position + std::int32_t sprYnew; + // New bounding box, top left corner X pos + std::int32_t sprX1new; + // New bounding box, top left corner Y pos + std::int32_t sprY1new; + // New bounding box, bottom right corner X pos + std::int32_t sprX2new; + // New bounding box, bottom right corner Y pos + std::int32_t sprY2new; + // Background bounding box, top left corner X pos, + std::int32_t sprX1z; + // Background bounding box, top left corner Y pos + std::int32_t sprY1z; + // Background bounding box, bottom right corner X pos + std::int32_t sprX2z; + // Background bounding box, bottom right corner Y pos + std::int32_t sprY2z; + + // TODO: Note: this section was commented out in earlier CF2.5 SDK. + // Still present in MMF2 Unicode SDK, so probably MMF2 HWA DLC -> core killed it. +#ifndef _UNICODE + // MMF2: Sprite X scale. Removed in CF2.5. + float sprXScale; + // MMF2: Sprite Y scale. Removed in CF2.5. + float sprYScale; + // Temporary values for collisions - unsigned short TempImg; // TODO: use unsigned intlater? - short TempAngle; - float TempScaleX, - TempScaleY; + + // Temporary image num for collision + // TODO: Is this image bank ID? texture bank ID? + std::int16_t sprTempImg; + // Temporary angle for collision + std::int16_t sprTempAngle; + // Temporary scale X for collision + float sprTempScaleX; + // Temporary scale Y for collision + float sprTempScaleY; +#endif // Image or owner-draw routine union { struct { - unsigned int Img; // Numero d'image - unsigned int ImgNew; // Nouvelle image + // Current image bank ID? + std::uint32_t sprImg; + // New image bank ID? + std::uint32_t sprImgNew; }; - LPARAM Rout; // Ownerdraw callback routine + // Ownerdraw callback routine + // IDrawable ref in Android + // Obj-C class id in iOS, Mac + LPARAM sprRout; }; - // Ink effect - unsigned int Effect; // 0 = normal, 1 = semi-transparent, > 16 = routine - LPARAM EffectParam; // parametre effet (coef transparence, etc...) + // Ink effect; see RunSprite::rsEffect + BlitOperation sprEffect; + // Ink effect parameter e.g. blend coefficient. See RunSprite::rsEffectParam. + LPARAM sprEffectParam; - // Fill color (wipe with color mode) - COLORREF BackColor; + // Fill color (wipe with color mode; standard display type only?) + COLORREF sprBackColor; // Surfaces - cSurfaceImplementation * BackSurf; // Background surface, if no general background surface + cSurfaceImplementation * sprBackSurf; // Background surface, if no general background surface + + // Surface (if stretched or rotated) + cSurfaceImplementation * sprSf; - cSurfaceImplementation * Sf; // Surface (if stretched or rotated) - sMask * ColMask; // Collision mask (if stretched or rotated) +#ifndef _UNICODE + // MMF2: Collision mask (if stretched or rotated) + // Removed in CF2.5 SDK + sMask * sprColMask; - cSurfaceImplementation* TempSf; // Temp surface (if stretched or rotated) - sMask * TempColMask; // Temp collision mask (if stretched or rotated) + // MMF2: Temp surface (if stretched or rotated) + // Removed in CF2.5 SDK + cSurfaceImplementation * sprTempSf; + // MMF2: Temp collision mask (if stretched or rotated) + // Removed in CF2.5 SDK + sMask * sprTempColMask; +#endif // _UNICODE - // User data - LPARAM ExtraInfo; + // User data - may be a RunObject ptr + // This ptr may not be valid offset + LPARAM sprExtraInfo; // Colliding ites - int CollisList[2]; // liste de ites entrant en collisions + // This ptr may not be valid offset + std::int32_t sprCollisList[2]; // liste de ites entrant en collisions }; -// Maximum number of parameters +// Maximum number of parameters in A/C/E +// @remarks Source: evtccx.h #define EVI_MAXPARAMS 16 // Structure de definition des conditions / actions POUR LES EXTENSIONS V1 +// @remarks Source: evtccx.h, data struct not used in exported DLL funcs struct infosEvents { NO_DEFAULT_CTORS_OR_DTORS(infosEvents); short code; // Le numero de type + code event @@ -237,7 +300,7 @@ struct infosEvents { //typedef infosEvents * PINFOEVENTS; // Event information structure -// --------------------------- +// @remarks Source: evtccx.h, data struct not used in exported DLL funcs struct eventInformations { NO_DEFAULT_CTORS_OR_DTORS(eventInformations); short menu; // Menu identifier @@ -258,41 +321,60 @@ struct eventInformations { // Definitions for extensions +// @remarks Source: cncf.h #define TYPE_LONG 0x0000 +// @remarks Source: cncf.h #define TYPE_INT TYPE_LONG +// @remarks Source: cncf.h #define TYPE_STRING 0x1 -#define TYPE_FLOAT 0x2 // Pour les extensions +// @remarks Source: cncf.h +#define TYPE_FLOAT 0x2 +// @remarks Source: cncf.h #define TYPE_DOUBLE 0x2 +// @remarks Originally CValue, source: cncf.h; not used in exported DLL funcs struct CValueMultiPlat { NO_DEFAULT_CTORS_OR_DTORS(CValueMultiPlat); - unsigned int m_type, - m_padding; + std::uint32_t m_type; + std::uint32_t m_padding; union { std::int32_t m_long; double m_double; - TCHAR * m_pString; + FusionANSIWarning TCHAR * m_pString; }; }; typedef short * LPSHORT; //class CValue; -// Structure for SaveRect +// Structure for SaveRect, used to save background +// @remarks Probably only used for software display mode +// Source: cnpdll.h, only used in C, not C++ exported DLL funcs struct saveRect { NO_DEFAULT_CTORS_OR_DTORS(saveRect); - unsigned char * pData; - RECT rc; + LPBYTE pData; + RECT rc; }; //typedef saveRect* fpSaveRect; -// Number of values +// Number of alterable values, applies to MMF2, not CF2.5 +// Used to be VALUES_NUMBEROF_ALTERABLE +// @remarks Source: cncf.h #define ALTERABLE_VALUES_COUNT 26 + +// Number of alterable strings, applies to MMF2 and CF2.5, not CF2.5+ +// Used to be STRINGS_NUMBEROF_ALTERABLE +// @remarks Source: cncf.h #define ALTERABLE_STRINGS_COUNT 10 +// @remarks Source: cncf.h typedef short ITEMTYPE; +// Object info number +// @remarks Source: cncf.h typedef short OINUM; +// Handle to frame item instance? +// @remarks Source: cncf.h typedef short HFII; // LOGFONT 16 structure for compatibility with old extensions ///////////////////////////////////////////////////////////// @@ -310,12 +392,12 @@ struct LOGFONTV1 { ClipPrecision, Quality, PitchAndFamily; - TCHAR FaceName[32]; + FusionANSIWarning TCHAR FaceName[32]; }; // Flags modifiable by the program enum class OEPREFS : short; -enum class OEFLAGS : unsigned int; +enum class OEFLAGS : uint32_t; ////////////////////////////////////////////////////////////////////////////// @@ -366,7 +448,11 @@ struct OCStrings { NO_DEFAULT_CTORS_OR_DTORS(OCStrings); unsigned short number; - TCHAR str[2]; + // TODO: In OG SDK, this was aligned to have two chars or one wchar_t. + // Not sure what the use of either is, as it should be 4 bytes if it's a pointer, + // and if it's an offset it should be a number, and if this struct is a header, + // the plurality naming and careful 2-byte sizing is counter-intuitive. + FusionANSIWarning TCHAR str[sizeof(wchar_t) / sizeof(TCHAR)]; }; // typedef OCStringsA* LPOCSTRINGS; // typedef OCStringsW* LPOCSTRINGS; @@ -375,7 +461,8 @@ struct OCValueNames { NO_DEFAULT_CTORS_OR_DTORS(OCValueNames); unsigned short number; - char str[2]; + // TODO: OG SDK has this as ANSI, but it may be TCHAR? + char str[2]; }; //typedef OCValueNames* LPOCVALUENAMES; @@ -1027,9 +1114,13 @@ enum class CPF { struct ParamObject { NO_DEFAULT_CTORS_OR_DTORS(ParamObject); - unsigned short OffsetListOI, // - Number, // - Type; // Version > FVERSION_NEWOBJECTS + // if positive, index of object in rhOiList + // If below -1, a qualifier oiList; mask with & 0x8000 then read rhQualToOiList + uint16_t oiList; + // Object unique OI number (hoOi) + uint16_t oi; + // Present only if Fusion version > FVERSION_NEWOBJECTS + uint16_t type; }; struct ParamTime { NO_DEFAULT_CTORS_OR_DTORS(ParamTime); @@ -1057,9 +1148,10 @@ struct ParamInt { }; struct ParamSound { NO_DEFAULT_CTORS_OR_DTORS(ParamSound); + // TODO: Entry index in sound bank? or do we need handleTo? short Handle, Flags; - TCHAR name[64]; // Max sound name + FusionANSIWarning TCHAR name[64]; // Max sound name enum SoundFlags { UNINTERRUPTABLE = 0x1, BAD = 0x2, @@ -1098,8 +1190,8 @@ struct ParamShoot { }; struct ParamAnimation { NO_DEFAULT_CTORS_OR_DTORS(ParamAnimation); - short Number; - TCHAR * name; + short Number; + FusionANSIWarning TCHAR * name; }; struct ParamNoP { NO_DEFAULT_CTORS_OR_DTORS(ParamNoP); @@ -1111,8 +1203,7 @@ struct ParamPlayer { }; struct ParamEvery { NO_DEFAULT_CTORS_OR_DTORS(ParamEvery); - long Delay, - Counter; + long Delay, Counter; }; struct ParamKey { NO_DEFAULT_CTORS_OR_DTORS(ParamKey); @@ -1173,8 +1264,10 @@ struct ParamClick { struct ParamProgram { NO_DEFAULT_CTORS_OR_DTORS(ParamProgram); short Flags; // Default flags - TCHAR Path[MAX_PATH], // name of the program - Command[108]; // Command line + // name of the program + FusionANSIWarning TCHAR Path[MAX_PATH]; + // Command line + FusionANSIWarning TCHAR Command[108]; enum Masks { Wait = 0x1, @@ -1183,27 +1276,30 @@ struct ParamProgram { }; struct ParamCondSound { NO_DEFAULT_CTORS_OR_DTORS(ParamCondSound); - unsigned short Number, - Flags, - Loops; - TCHAR * name; + std::uint16_t Number; + std::uint16_t Flags; + std::uint16_t Loops; + FusionANSIWarning TCHAR * name; }; struct ParamEditorComment { NO_DEFAULT_CTORS_OR_DTORS(ParamEditorComment); LOGFONTV1 LogFont; // Font - COLORREF ColourFont, // text color - ColourBack; // Background color + // These may be incorrectly positioned if ANSI ext working with Unicode runtime + COLORREF ColourFont; // text color + COLORREF ColourBack; // Background color short Align; // Alignement flags unsigned short TextId; // text number in the buffer - TCHAR Style[40]; // Style + FusionANSIWarning TCHAR Style[40]; // Style }; struct ParamGroup { NO_DEFAULT_CTORS_OR_DTORS(ParamGroup); short Flags, // Active / Inactive? ID; // Group identifier // May be editor-only, missing in runtime: - TCHAR Title[80], // Title (max 80? chars) - Password[16]; // Protection (max 16? chars) + FusionANSIWarning TCHAR Title[80]; + // If not missing in runtime, ANSI ext + Uni runtime will have this misaligned + FusionANSIWarning TCHAR Password[16]; + // If not missing in runtime, ANSI ext + Uni runtime will have this misaligned unsigned long Checksum; // Checksum enum Masks { INACTIVE = 0x1, @@ -1225,11 +1321,11 @@ struct ParamGroupPointer { }; struct ParamFilename { NO_DEFAULT_CTORS_OR_DTORS(ParamFilename); - TCHAR * FileName; + FusionANSIWarning TCHAR * FileName; }; struct ParamString { NO_DEFAULT_CTORS_OR_DTORS(ParamString); - TCHAR * String; + FusionANSIWarning TCHAR * String; }; struct ParamCmpTime { NO_DEFAULT_CTORS_OR_DTORS(ParamCmpTime); @@ -1285,7 +1381,7 @@ struct Param8Dirs { struct ParamMvt { NO_DEFAULT_CTORS_OR_DTORS(ParamMvt); short mvtNumber; - TCHAR mvtName[32]; // Max movement name = 32 bytes + FusionANSIWarning TCHAR mvtName[32]; }; struct ParamProgram2 { NO_DEFAULT_CTORS_OR_DTORS(ParamProgram2); @@ -1297,7 +1393,7 @@ struct ParamProgram2 { }; struct ParamEffect { NO_DEFAULT_CTORS_OR_DTORS(ParamEffect); - TCHAR * name; + FusionANSIWarning TCHAR * name; }; namespace Edif { @@ -1312,10 +1408,10 @@ namespace Edif { struct FastLoop { NO_DEFAULT_CTORS_OR_DTORS(FastLoop); - TCHAR * Next; - TCHAR name[64]; // Max fast loop name (64 bytes) - unsigned short Flags; - long Index; + FusionANSIWarning TCHAR * Next; + FusionANSIWarning TCHAR name[64]; // Max fast loop name (64 bytes) + unsigned short Flags; + long Index; enum Masks { Stop = 0x1, }; @@ -1410,9 +1506,15 @@ enum struct EditDebugInfo { + // Title to edit. Cannot be null if ANSI ext in Unicode editor; otherwise if null uses a default text. + // @remarks This is Fusion internals, but matches the ext encoding. TCHAR * Title; + // Integer to edit. Floats aren't allowed. int value; + // Text to edit. + // @remarks Fusion internals, but matches the ext encoding. TCHAR * text; + // Text length in characters, not including null; used to indicate buffer size, max of DB_BUFFERSIZE. int lText; }; @@ -1450,17 +1552,50 @@ struct objectsList { #define MAX_INTERMEDIATERESULTS 256 #define STEP_TEMPSTRINGS 64 +enum class JoystickBtn : uint8_t { + Up = 0b00000001, + Down = 0b00000010, + Left = 0b00000100, + Right = 0b00001000, + Fire1 = 0b00010000, + Fire2 = 0b00100000, + Fire3 = 0b01000000, + Fire4 = 0b10000000, +}; + struct RunHeader2 { NO_DEFAULT_CTORS_OR_DTORS(RunHeader2); - unsigned long rh2OldPlayer, // Previous player entries - rh2NewPlayer, // Modified player entries - rh2InputMask, // Inhibated players entries - rh2InputPlayers; // Valid players entries (mask!) - unsigned char rh2MouseKeys, // Mousekey entries - rh2ActionLoop, // Actions flag - rh2ActionOn, // Flag: are we in actions? Confirmed by Yves to be used bool-like, 0 or 1 only. - rh2EnablePick; // Flag: Are we in pick for actions? - + friend Edif::Runtime; + friend RunHeader; +DarkEdifInternalAccessProtected: + // Previous player button press/dir move entries; see RunHeader.rhPlayer + // @remarks Player buttons are triggered in game tick before even timer events + JoystickBtn rh2OldPlayer[MAX_PLAYERS]; + // Modified player button press/dir move entries; see RunHeader.rhPlayer + // @remarks Set by (rhPlayer & rh2InputMask) ^ rh2OldPlayer = rh2NewPlayer + JoystickBtn rh2NewPlayer[MAX_PLAYERS]; + // Inhibited player button press/dir move entries + std::uint8_t rh2InputMask[MAX_PLAYERS]; + // Valid player button press/dir move entries (bitmask) + std::uint8_t rh2InputPlayers[MAX_PLAYERS]; + + // Mousekey entries (for player object set to mouse movement) + std::uint8_t rh2MouseKeys; + // Actions flag? + // TODO: If true, continues looping other action instances? + bool rh2ActionLoop; + + // If true, currently in an action. If false, in condition, Handle, etc. + // @remarks Confirmed by Yves to be used bool-like, 0 or 1 only, + // so was replaced with bool + bool rh2ActionOn; + // Flag: Are we in pick for actions? + // If this and rh2ActionOn are both false, object instances that return false in conditions are deselected. + // Otherwise, they are unaffected. + // @remarks Replaced with bool due to bool usage in Android/iOS + bool rh2EnablePick; + + // Number of the event int rh2EventCount; // Number of the event qualToOi * rh2EventQualPos; // Position in event objects HeaderObject * rh2EventPos; // Position in event objects @@ -1476,14 +1611,24 @@ struct RunHeader2 { int rh2ActionLoopCount; // Action loops counter void (*rh2ActionEndRoutine)(); // End of action routine - // Number of objects created since frame start. Increments per object instance create of any object; wraps at 16-bit. - // @remarks While CreationCount starts as 0, 0 isn't used since Fusion b243 and it is incremented again to 1 - unsigned short rh2CreationCount; // Number of objects created since beginning of frame + // Number of objects created since frame start. Increments per object instance create of any object; wraps at 16-bit back to 1, not 0. + // @remarks CreationCount starts as 0, but since Fusion b243, the wrap increment will be doubled to move from 65535 [-> 0] -> 1. + std::uint16_t rh2CreationCount; + // The oilType to pick, used with Create's "Pick objects with reference to value", + // tied with rh4PickFlags. -1 for all type. short rh2EventType; - POINT rh2Mouse; // Mouse coordinate + // Mouse coordinate, relative to screen + // TODO: Confirm it is relative to screen, not window + POINT rh2Mouse; + // Mouse coordinate, relative to client window? + // TODO: Confirm it is relative to client window POINT rh2MouseClient; // Mouse coordinates in the window - short rh2CurrentClick, // For click events II - rh2Free2; // Ignore - Padding + // During click events, set to the click value compared to PARAM_CLICK. + // Mouse button 1+ and PARAMCLICK_DOUBLE mask. + short rh2CurrentClick; +private: + short rh2Free2; // Ignore - Padding +DarkEdifInternalAccessProtected: HeaderObject ** rh2ShuffleBuffer, ** rh2ShufflePos; int rh2ShuffleNumber; @@ -1509,6 +1654,9 @@ struct RunHeader2 { struct RunHeader3 { NO_DEFAULT_CTORS_OR_DTORS(RunHeader3); + friend Edif::Runtime; + friend RunHeader; +DarkEdifInternalAccessProtected: unsigned short rh3Graine, // Random generator seed rh3Free; // Ignore - padding @@ -1544,7 +1692,7 @@ struct RunHeader3 { // ~~~~~~~~~~~~~~~~~~~~ #define KPX_MAXNUMBER 96 typedef struct tagKPXMSG { - short ( WINAPI * routine) (unsigned int, HWND, unsigned int, WPARAM, LPARAM); + short ( WINAPI * routine) (DWORD, HWND, unsigned int, WPARAM, LPARAM); } kpxMsg; #define KPX_MAXFUNCTIONS 32 typedef struct tagKPXLIB { @@ -1600,7 +1748,7 @@ enum class RFUNCTION { typedef void (* CALLANIMATIONS) (HeaderObject *, int); #define callAnimations(hoPtr, anim) ( (hoPtr->hoAdRunHeader)->rh4.rh4Animations(hoPtr, anim) ) -typedef unsigned int (* CALLDIRATSTART) (HeaderObject *, unsigned int); +typedef DWORD (* CALLDIRATSTART) (HeaderObject *, DWORD); #define callDirAtStart(hoPtr, initDir) ( (hoPtr->hoAdRunHeader)->rh4.rh4DirAtStart(hoPtr, initDir) ) typedef BOOL (* CALLMOVEIT) (HeaderObject *); @@ -1648,7 +1796,7 @@ struct RunHeader4 // ? void (* rh4Animations)(HeaderObject *, int); // Get direction at start - std::uint32_t (* rh4DirAtStart)(HeaderObject *, unsigned int); + DWORD (* rh4DirAtStart)(HeaderObject *, DWORD); // Move object BOOL (* rh4MoveIt)(HeaderObject *); // Approach object @@ -1668,14 +1816,14 @@ struct RunHeader4 // Save the current action event2 * rh4ActionStart; std::int32_t rh4PauseKey; - TCHAR * rh4CurrentFastLoop; + FusionANSIWarning TCHAR * rh4CurrentFastLoop; std::int32_t rh4EndOfPause; // Number of the event for OR conditions - not useful for exts std::int32_t rh4EventCountOR; std::int16_t rh4ConditionsFalse; std::int16_t rh4MouseWheelDelta; std::int32_t rh4OnMouseWheel; - TCHAR * rh4PSaveFilename; + FusionANSIWarning TCHAR * rh4PSaveFilename; std::uint32_t rh4MusicHandle; std::uint32_t rh4MusicFlags; std::uint32_t rh4MusicLoops; @@ -1712,10 +1860,10 @@ struct RunHeader4 std::int16_t rh4DroppedFlag; std::int16_t rh4NDroppedFiles; - TCHAR * rh4DroppedFiles; + FusionANSIWarning TCHAR * rh4DroppedFiles; FastLoop * rh4FastLoops; - TCHAR * rh4CreationErrorMessages; + FusionANSIWarning TCHAR * rh4CreationErrorMessages; // New V2 CValueMultiPlat rh4ExpValue1; CValueMultiPlat rh4ExpValue2; @@ -1803,7 +1951,7 @@ struct RunHeader4 std::int32_t rh4Operators[MAX_INTERMEDIATERESULTS]; // Debut zone 256 long ? - TCHAR ** rh4PTempStrings; + FusionANSIWarning TCHAR ** rh4PTempStrings; std::int32_t rh4MaxTempStrings; // Free buffer ? std::int32_t rh4Free4[256-2]; @@ -2064,7 +2212,7 @@ struct HeaderObject { // Used with path movement, works with rhLoopCount int hoMark1, hoMark2; // Name of the current node for path movements - TCHAR * hoMT_NodeName; + FusionANSIWarning TCHAR * hoMT_NodeName; // 0+ ID of the current A/C/E call, set before their ext function is run // This is not Fusion event number, it is A/C/E index in ext @@ -2316,7 +2464,7 @@ struct rMvt { int MT_XStart; int MT_YStart; int MT_Pause; - TCHAR * MT_GotoNode; + FusionANSIWarning TCHAR * MT_GotoNode; }; struct { @@ -2461,8 +2609,9 @@ struct RunSprite int rsFlash, // When flashing objects rsFlashCount, rsLayer, // Layer - rsZOrder, // Z-order value - rsCreationFlags; // Creation flags + rsZOrder; // Z-order value + // Creation flags; although used throughout sprite lifetime + SpriteFlag rsCreaFlags; std::uint32_t rsBackColor; // background saving color // Sprite blit effects, a bitmask? @@ -2475,8 +2624,17 @@ struct RunSprite // For software display modes, semi-transparency stores 0 to 0x80, // and other display modes are std::uint32_t rsEffectParam; - RunSpriteFlag rsFlags; // Handling flags - unsigned short rsFadeCreationFlags; // Saved during a fadein + // Handling flags + RunSpriteFlag rsFlags; + + // Saved during a fade-in, then put in rsCreaFlags. + // This is technically a SpriteFlag set, but the type is too large. + // @remarks Noted as something to fix collisions during transition fade-in. + // However, as it's too large to save all flags, I am concerned it erases + // higher level flags if it's ever read back. + // Besides the initial copy with trim-out from rsCreaFlags, + // only SpriteFlag::Hidden is set and removed. + std::uint16_t rsFadeCreaFlags; }; //typedef RunSprite rSpr; //typedef RunSprite * LPRSP; @@ -2497,7 +2655,7 @@ struct AltVals { int Free1[25 - 1]; // 26 = number of alterable values std::uint32_t InternalFlags; std::uint8_t Free2[26]; // 26 = number of alterable values - const TCHAR * * Strings; // Alterable strings (will be null if never used, including if blank in obj properties); change with mvMalloc/mvFree + FusionANSIWarning const TCHAR * * Strings; // Alterable strings (will be null if never used, including if blank in obj properties); change with mvMalloc/mvFree int NumAltStrings; } CF25; struct MMF2 { @@ -2505,14 +2663,14 @@ struct AltVals { int rvFree1[26 - 1]; std::uint32_t rvValueFlags; std::uint8_t rvFree2[26]; - const TCHAR * rvStrings[10]; // Alterable strings (will be null if never used, including if blank in obj properties); change with mvMalloc/mvFree + FusionANSIWarning const TCHAR * rvStrings[10]; // Alterable strings (will be null if never used, including if blank in obj properties); change with mvMalloc/mvFree } MMF2; }; public: std::size_t GetAltValueCount() const; std::size_t GetAltStringCount() const; - const TCHAR* GetAltStringAtIndex(const std::size_t) const; + FusionANSIWarning const TCHAR* GetAltStringAtIndex(const std::size_t) const; const CValueMultiPlat * GetAltValueAtIndex(const std::size_t) const; void SetAltStringAtIndex(const std::size_t, const std::tstring_view&); void SetAltValueAtIndex(const std::size_t, const double); @@ -2610,10 +2768,16 @@ struct rCom { RCROUTINE rcRoutineAnimation; // Offset to animation routine int rcPlayer; // Player who controls - + int rcNMovement; // Number of the current movement CRunMvt * rcRunMvt; // Pointer to extension movement - Sprite * rcSprite; // Sprite ID if defined + // Sprite ID if defined; can be nulled mid-runtime for a live object, + // if object is deactivated by being out of frame area (rh3XMinimum etc) + // @remarks An inactivated object is also indicated by RSFLAG::SLEEPING set in ros.rsFlags + // When it's destroyed from being far instead (rh3XMinimumKill etc), + // then not just rcSprite, but the whole ext instance is destroyed, + // like the usual Destroy action. + CSprite * rcSprite; int rcAnim; // Wanted animation int rcImage; // Current frame float rcScaleX; @@ -2650,6 +2814,7 @@ struct rCom { struct ForbiddenInternals2; // RUNDATA, but with all OEFlags and all parts, like what an Active object has +// @remarks Source: cncf.h struct RunObject { NO_DEFAULT_CTORS_OR_DTORS(RunObject); // Reads the header information all objects have available. Cross-platform safe. Never null. @@ -2700,63 +2865,93 @@ struct RunObject { -// ------------------------------------------------------ -// EXTENSION EDITION HEADER STRUCTURE -// ------------------------------------------------------ +// Old extHeader struct, the first member of an ext's EDITDATA +// @remarks Source: cncf.h +// TODO: was this used for MMF1? struct extHeader_v1 { NO_DEFAULT_CTORS_OR_DTORS(extHeader_v1); DarkEdifInternalAccessProtected: - short extSize, - extMaxSize, - extOldFlags, // For conversion purpose - extVersion; // Version number -}; -//typedef extHeader_v1* extHeader *V1; - -// ------------------------------------------------------ -// System objects (text, question, score, lives, counter) -// ------------------------------------------------------ + // Size of EDITDATA that follows + int16_t extSize; + // Max possible size of EDITDATA that follows? + int16_t extMaxSize; + // For conversion purpose + int16_t extOldFlags; + // Version number + int16_t extVersion; +}; +//typedef extHeader_v1* LPEXTV1; + +// System object struct (text, question, score, lives, counter) +// @remarks Source: cncf.h struct rs { NO_DEFAULT_CTORS_OR_DTORS(rs); DarkEdifInternalAccessProtected: - HeaderObject HeaderObject; // For all the objects - rCom Common; // Anims / movements / sprites structures - rMvt Movement; // Mouvement structure - RunSprite Sprite; // Sprite handling + HeaderObject rsHeaderObject; // For all the objects + rCom rsCommon; // Anims / movements / sprites structures + rMvt rsMovement; // Mouvement structure + RunSprite rsSprite; // Sprite handling - short Player; // Number of the player if score or lives - short Flags; // Type + flags + short rsPlayer; // Number of the player if score or lives + short rssFlags; // Type + flags union { - unsigned char * SubAppli; // Application (CCA object) + LPBYTE rsSubAppli; // Application (CCA object) }; union { - int Mini; - int OldLevel; + int rsMini; + int rsOldLevel; }; union { - int Maxi; // - int Level; + int rsMaxi; // + int rsLevel; }; - CValueMultiPlat Value; - LONG BoxCx; // Dimensions box (for lives, counters, texts) - LONG BoxCy; - double MiniDouble; - double MaxiDouble; - short OldFrame; // Counter only - unsigned char Hidden; - unsigned char Free; - TCHAR * TextBuffer; // text buffer - int LBuffer; // Length of the buffer in BYTES - unsigned int Font; // Temporary font for texts + CValueMultiPlat rsValue; + // Max width capacity (for lives, counters, texts) + LONG rsBoxCx; + // Max height capacity (for lives, counters, texts) + LONG rsBoxCy; + double rsMiniDouble; + double rsMaxiDouble; + // Counter only. When displaying as animation, the index in CDefCounters frames + // @remarks When HBar/VBar, is used as a clobber for calculating bar size + short rsOldFrame; + // String only. Stores CreateObjectInfo::Flags on create. + // If FirstText is set, this object won't be destroyed on request, just hidden. + // @remarks The first instance of a String object is not destroyed on request, but hidden. + // It is kept so the font entry ID is kept live, but it was a dubious + // optimization that nowadays is not useful. + // Note rsHidden is also declared in non-Windows Counter ports, + // but seems unused. + unsigned char rsHidden; +private: + // Padding + unsigned char rsFree; +DarkEdifInternalAccessProtected: + // String object: the buffer containing alterable text, or a copy of paragraph text. + // May be null indicating blank. + FusionANSIWarning TCHAR * rsTextBuffer; + // String object: Length of rsTextBuffer in BYTES + // Only present in Windows. + int rsBuffer; + // Font bank entry ID + int16_t rsFont; +private: + // Padding added as rsFont is only int16 in non-Windows, + // so it was probably a int32 in OG Windows SDK for faux padding + int16_t rsFree2; +DarkEdifInternalAccessProtected: union { - COLORREF TextColor; // text color - COLORREF Color1; // Bar color + // String object: Text color + COLORREF rsTextColor; + // Counter object: If VBar/HBar mode, the first bar color + COLORREF rsColor1; }; - COLORREF Color2; // Gradient bar color + // Counter object: If VBar/HBar mode, the second bar color for gradient mode + COLORREF rsColor2; }; //typedef rs * LPRS; @@ -2766,16 +2961,28 @@ struct rs { // OI (frame object) // -// Object Info Load Flags +// Object Info Load Flags, used in COI structs +// @remarks Source: cncr.h +// TODO: Flesh out usage enum class OILFlags : std::uint16_t { - OC_LOADED = 0x1, // - ELT_LOADED = 0x2, // - TO_LOAD = 0x4, // - TO_DELETE = 0x8, // - CUR_FRAME = 0x10, // - TO_RELOAD = 0x20, // Reload images when frame change - IGNORE_LOAD_ON_CALL = 0x40, // Ignore load on call option + // OILF_OCLOADED: ObjectCommon loaded? + OC_LOADED = 0x1, + // OILF_ELTLOADED: Font/Image bank elements loaded? + ELT_LOADED = 0x2, + // OILF_TOLOAD: ? + TO_LOAD = 0x4, + // OILF_TODELETE: ? + TO_DELETE = 0x8, + // OILF_CURFRAME: ? + CUR_FRAME = 0x10, + // OILF_TORELOAD: Reload images when frame change + // Used with animation replace color action + // TODO: When is this used? Just there? + TO_RELOAD = 0x20, + // OILF_ELTLOADED: Ignore load on call option + // TODO: What does this override, including app level and Android frame level options? + IGNORE_LOAD_ON_CALL = 0x40, }; enum_class_is_a_bitmask(OILFlags); @@ -2812,10 +3019,10 @@ struct objInfoList { // @remarks Ties with EventProgram RepeatFlag, which doesn't feature in Windows SDK std::int8_t oilNextFlag; -private: - std::uint16_t oilFree; // Padding + // Qualifier optimization variable, previously oilFree + // https://community.clickteam.com/forum/thread/111194-about-the-oilfree/?postID=784444#post784444 + std::uint16_t oilQualOptValue; -DarkEdifInternalAccessProtected: // Number of all object instances of this type std::int32_t oilNObjects; @@ -2870,7 +3077,7 @@ struct objInfoList { // Qualifiers for this object std::int16_t oilQualifiers[MAX_QUALIFIERS]; // user-specified object name, cropped to 24 chars, guaranteed end with NULL - TCHAR oilName[OINAME_SIZE]; + FusionANSIWarning TCHAR oilName[OINAME_SIZE]; // Selection in a list of events with OR std::int32_t oilEventCountOR; #ifdef HWABETA @@ -2922,7 +3129,7 @@ struct objInfoList { // @remarks The name is the top field in the About tab of object properties. // This cropping is done on Fusion runtime side, and stored in built apps pre-cropped, // so it is cropped on all platforms. - const TCHAR * get_name(); + FusionANSIWarning const TCHAR * get_name(); // Reads the qualifiers array of this object at passed zero-based index. Pass 0 to 7 only. Returns -1 if invalid. // @remarks Objects cannot have more than MAX_QUALIFIERS (8) qualifiers. @@ -3526,6 +3733,13 @@ enum class BUILDTYPE { XNA_PHONE, XNA_XBOX_APP, XNA_PHONE_APP, + HTML5, + VITA, + VITADEVEL, + VITAFINAL, // no longer used + HTML5DEVEL, + HTML5FINAL, + OUYA, STDMAX, // end of standard build types }; @@ -3934,10 +4148,10 @@ typedef otText * fpot; typedef struct txString { NO_DEFAULT_CTORS_OR_DTORS(txString); DarkEdifInternalAccessProtected: - unsigned short tsFont; // Font - unsigned short tsFlags; // Flags - COLORREF tsColor; // Color - TCHAR tsChar[]; + unsigned short tsFont; // Font + unsigned short tsFlags; // Flags + COLORREF tsColor; // Color + FusionANSIWarning TCHAR tsChar[]; } txString; typedef txString * fpts; //#define sizeof_ts 8 // (sizeof(txString)-1) @@ -4298,36 +4512,44 @@ struct mv { HPALETTE HPal256; // 256 color palette unsigned short AppMode, // Screen mode with flags ScrMode; // Screen mode (SM_8=256, SM_15=32768, SM_16=65536, SM_32=16 million colors) - unsigned int EditDXDocToClient, // Edit time only: top-left coordinates - EditDYDocToClient; - CImageFilterMgr * ImgFilterMgr; // Image filter manager - CSoundFilterMgr * SndFilterMgr; // Sound filter manager - CSoundManager * SndMgr; // Sound manager + // Edit time only: top-left coordinates + DWORD EditDXDocToClient, EditDYDocToClient; - union { - CEditApp * EditApp; // Current application, edit time - different address per loaded MFA - CRunApp * RunApp; // Current application, runtime - not usable in frame editor and co, just runtime - }; - union { - CEditFrame * EditFrame; - CRunFrame * RunFrame; - }; + // Image filter manager + CImageFilterMgr * ImgFilterMgr; + // Sound filter manager + CSoundFilterMgr * SndFilterMgr; + // Sound manager + CSoundManager * SndMgr; + +#if EditorBuild + // Opaque struct for Fusion. Only known detail is it is a different address between MFAs loaded in Fusion. + CEditApp * EditApp; + CEditFrame * EditFrame; +#else + // Current application, runtime - not usable in frame editor and co, just runtime + CRunApp * RunApp; + CRunFrame * RunFrame; +#endif - // Runtime - RunHeader * RunHdr; // Current RunHeader - unsigned int PextsHoldingGlobals; // Preferences (sound on/off) - TCHAR * subType; - BOOL FullScreen; // Full screen mode - TCHAR * MainAppFileName; // App filename + // Current RunHeader, containing most main details as rhPtr + RunHeader * RunHdr; + DWORD PextsHoldingGlobals; + // Preferences (sound on/off) + FusionANSIWarning TCHAR * subType; + // Full screen mode + BOOL FullScreen; + // App filename + FusionANSIWarning TCHAR * MainAppFileName; int AppListCount; int AppListSize; CRunApp** AppList; int ExtListCount; int ExtListSize; - TCHAR ** ExtList; + FusionANSIWarning TCHAR ** ExtList; int NbDllTrans; dllTrans* DllTransList; - unsigned int JoyCaps[32]; + DWORD JoyCaps[32]; HHOOK HMsgHook; int ModalLoop; int ModalSubAppCount; @@ -4337,7 +4559,7 @@ struct mv { //////////// // Editor: Open Help file - void (CALLBACK * HelpA) (const char * pHelpFile, unsigned int nID, LPARAM lParam); + void (CALLBACK * HelpA) (const char * pHelpFile, DWORD nID, LPARAM lParam); // Editor: Get default font for object creation // pStyle can be NULL to ignore; cbSize is size of pStyle's buffer. @@ -4358,29 +4580,29 @@ struct mv { void (CALLBACK * UnregisterDialogBox) (HWND hDlg); // Runtime: Add surface as backdrop object - void (CALLBACK * AddBackdrop) (cSurface * pSf, int x, int y, unsigned int dwInkEffect, unsigned int dwInkEffectParam, int nObstacleType, int nLayer); + void (CALLBACK * AddBackdrop) (cSurface * pSf, int x, int y, DWORD dwInkEffect, DWORD dwInkEffectParam, int nObstacleType, int nLayer); // Runtime: Binary files - BOOL (CALLBACK * GetFileA)(const char * pPath, char * pFilePath, unsigned int dwFlags); + BOOL (CALLBACK * GetFileA)(const char * pPath, char * pFilePath, DWORD dwFlags); void (CALLBACK * ReleaseFileA)(const char * pPath); - HANDLE (CALLBACK * OpenHFileA)(const char * pPath, unsigned int * pDwSize, unsigned int dwFlags); + HANDLE (CALLBACK * OpenHFileA)(const char * pPath, DWORD * pDwSize, DWORD dwFlags); void (CALLBACK * CloseHFile)(HANDLE hf); // Plugin: download file int (CALLBACK * LoadNetFileA) (char * pFilename); // Plugin: send command to Vitalize - int (CALLBACK * NetCommandA) (int, void *, unsigned int, void *, unsigned int); + int (CALLBACK * NetCommandA) (int, void *, DWORD, void *, DWORD); // Editor & Runtime: Returns the version of MMF or of the runtime // Return is a bitmask of three different flag sets; MMFVERSION_MASK, MMFBUILD_MASK, MMFVERFLAG_MASK - unsigned int (CALLBACK * GetVersion) (); + DWORD (CALLBACK * GetVersion) (); // Editor & Runtime: callback function for properties or other functions LRESULT (CALLBACK * CallFunction) (EDITDATA * edPtr, CallFunctionIDs nFnc, LPARAM lParam1, LPARAM lParam2, LPARAM lParam3); // Editor: Open Help file (UNICODE) - void (CALLBACK * HelpW) (const wchar_t * pHelpFile, unsigned int nID, LPARAM lParam); + void (CALLBACK * HelpW) (const wchar_t * pHelpFile, DWORD nID, LPARAM lParam); // Editor: Get default font for object creation (UNICODE) // pStyle can be NULL to ignore; cbSize is size of pStyle's buffer in WCHARs. @@ -4392,15 +4614,15 @@ struct mv { BOOL (CALLBACK * EditAnimationW) (EDITDATA * edPtr, EditAnimationParamsW * Params, HWND Parent); // Runtime: Binary files (UNICODE) - BOOL (CALLBACK * GetFileW)(const wchar_t * pPath, wchar_t * pFilePath, unsigned int dwFlags); + BOOL (CALLBACK * GetFileW)(const wchar_t * pPath, wchar_t * pFilePath, DWORD dwFlags); void (CALLBACK * ReleaseFileW)(const wchar_t * pPath); - HANDLE (CALLBACK * OpenHFileW)(const wchar_t * pPath, unsigned int * pDwSize, unsigned int dwFlags); + HANDLE (CALLBACK * OpenHFileW)(const wchar_t * pPath, DWORD * pDwSize, DWORD dwFlags); // Plugin: download file int (CALLBACK * LoadNetFileW) (wchar_t * pFilename); // Plugin: send command to Vitalize - int (CALLBACK * NetCommandW) (int, void *, unsigned int, void *, unsigned int); + int (CALLBACK * NetCommandW) (int, void *, DWORD, void *, DWORD); // Place-holder for next versions void * AdditionalFncs[6]; @@ -4483,22 +4705,22 @@ inline void mvSetAppPropValue(mv * mV, EDITDATA * edPtr, unsigned int nPropID, P inline void mvSetFramePropValue(mv * mV, EDITDATA * edPtr, unsigned int nPropID, Prop * pValue) \ { mV->CallFunction(edPtr, CallFunctionIDs::SETFRAMEPROPVALUE, (LPARAM)nPropID, (LPARAM)pValue, (LPARAM)0); } -inline unsigned int mvGetPropCheck(mv * mV, EDITDATA * edPtr, unsigned int nPropID) \ - { return (unsigned int)mV->CallFunction(edPtr, CallFunctionIDs::GETPROPCHECK, (LPARAM)nPropID, (LPARAM)0, (LPARAM)0); } +inline bool mvGetPropCheck(mv * mV, EDITDATA * edPtr, unsigned int nPropID) \ + { return mV->CallFunction(edPtr, CallFunctionIDs::GETPROPCHECK, (LPARAM)nPropID, (LPARAM)0, (LPARAM)0) != 0; } -inline unsigned int mvGetAppPropCheck(mv * mV, EDITDATA * edPtr, unsigned int nPropID) \ - { return (unsigned int)mV->CallFunction(edPtr, CallFunctionIDs::GETAPPPROPCHECK, (LPARAM)nPropID, (LPARAM)0, (LPARAM)0); } +inline bool mvGetAppPropCheck(mv * mV, EDITDATA * edPtr, unsigned int nPropID) \ + { return mV->CallFunction(edPtr, CallFunctionIDs::GETAPPPROPCHECK, (LPARAM)nPropID, (LPARAM)0, (LPARAM)0) != 0; } -inline unsigned int mvGetFramePropCheck(mv * mV, EDITDATA * edPtr, unsigned int nPropID) \ - { return (unsigned int)mV->CallFunction(edPtr, CallFunctionIDs::GETFRAMEPROPCHECK, (LPARAM)nPropID, (LPARAM)0, (LPARAM)0); } +inline bool mvGetFramePropCheck(mv * mV, EDITDATA * edPtr, unsigned int nPropID) \ + { return mV->CallFunction(edPtr, CallFunctionIDs::GETFRAMEPROPCHECK, (LPARAM)nPropID, (LPARAM)0, (LPARAM)0) != 0; } -inline void mvSetPropCheck(mv * mV, EDITDATA * edPtr, unsigned int nPropID, unsigned int nCheck) \ +inline void mvSetPropCheck(mv * mV, EDITDATA * edPtr, unsigned int nPropID, bool nCheck) \ { mV->CallFunction(edPtr, CallFunctionIDs::SETPROPCHECK, (LPARAM)nPropID, (LPARAM)nCheck, (LPARAM)0); } -inline void mvSetAppPropCheck(mv * mV, EDITDATA * edPtr, unsigned int nPropID, unsigned int nCheck) \ +inline void mvSetAppPropCheck(mv * mV, EDITDATA * edPtr, unsigned int nPropID, bool nCheck) \ { mV->CallFunction(edPtr, CallFunctionIDs::SETAPPPROPCHECK, (LPARAM)nPropID, (LPARAM)nCheck, (LPARAM)0); } -inline void mvSetFramePropCheck(mv * mV, EDITDATA * edPtr, unsigned int nPropID, unsigned int nCheck) \ +inline void mvSetFramePropCheck(mv * mV, EDITDATA * edPtr, unsigned int nPropID, bool nCheck) \ { mV->CallFunction(edPtr, CallFunctionIDs::SETFRAMEPROPCHECK, (LPARAM)nPropID, (LPARAM)nCheck, (LPARAM)0); } // Forces a redraw of the object in the frame editor and updates its icon @@ -4602,12 +4824,12 @@ enum class KGI : int { struct kpxFunc { NO_DEFAULT_CTORS_OR_DTORS(kpxFunc); HINSTANCE kpxHInst; - TCHAR * kpxName, - * kpxSubType; + FusionANSIWarning TCHAR * kpxName; + FusionANSIWarning TCHAR * kpxSubType; void * kpxUserData; // See KGI:: above for int - unsigned int (FusionAPI * kpxGetInfos) (int); + DWORD (FusionAPI * kpxGetInfos) (int); int (FusionAPI * kpxLoadObject) (mv *, ObjectInfo *, unsigned char * , int); void (FusionAPI * kpxUnloadObject) (mv *, unsigned char * , int); void (FusionAPI * kpxUpdateFileNames) (mv *, TCHAR *, unsigned char * , void (FusionAPI *)(LPCTSTR, TCHAR *)); @@ -4634,9 +4856,9 @@ struct kpxFunc { struct MvxFnc { NO_DEFAULT_CTORS_OR_DTORS(MvxFnc); HINSTANCE mvxHInst; - TCHAR * mvxFileTitle; + FusionANSIWarning TCHAR * mvxFileTitle; - CMvt * (CALLBACK * mvxCreateMvt) (unsigned int); + CMvt * (CALLBACK * mvxCreateMvt) (DWORD); #ifdef VITALIZE BOOL bValidated; @@ -4664,7 +4886,7 @@ struct LevelObject { OiParentHandle, // HOI Parent Layer, // Layer Type; - Sprite * Spr[4]; // Sprite handles for backdrop objects from layers > 1 + CSprite * Spr[4]; // Sprite handles for backdrop objects from layers > 1 }; // typedef LO *LPLO; // typedef LO *fpLevObj; @@ -4686,7 +4908,7 @@ struct bkd2 { colMode, nLayer, obstacleType; - Sprite* pSpr[4]; + CSprite* pSpr[4]; unsigned int inkEffect, inkEffectParam; }; @@ -4701,8 +4923,8 @@ struct bkd2 { struct RunFrameLayer { NO_DEFAULT_CTORS_OR_DTORS(RunFrameLayer); - // name - TCHAR * pName; // name + // Layer name + FusionANSIWarning TCHAR * pName; // Offset int x, y, // Current offset @@ -4788,11 +5010,17 @@ struct objTransInfo { struct CRunFrame { NO_DEFAULT_CTORS_OR_DTORS(CRunFrame); + + // Gets the frame name + _Notnull_ FusionANSIWarning const TCHAR * get_name(); + +DarkEdifInternalAccessProtected: + friend Edif::Runtime; // Header FrameHeader hdr; - // name - TCHAR * name; + // Frame name + FusionANSIWarning TCHAR * name; // Palette LPLOGPALETTE palette; @@ -4876,14 +5104,15 @@ struct CRunFrame { PasteMask; int CurTempString; - TCHAR * TempString[MAX_TEMPSTRING]; // not used + // Not sure if this is always Fusion runtime native, or just a set of ptrs. + FusionANSIWarning TCHAR * TempString[MAX_TEMPSTRING]; // Other cSurface * SaveSurface; int EditWinWidth, // Frame (not virtual) width EditWinHeight; // Frame (not virtual) height unsigned int ColMaskBits; - TCHAR * demoFilePath; + FusionANSIWarning TCHAR * demoFilePath; unsigned short RandomSeed, Free; // Ignore - padding unsigned int MvtTimerBase; @@ -4911,27 +5140,22 @@ struct CRunFrame { // Binary files // struct CBinaryFile { - TCHAR Path[MAX_PATH], // path stored in ccn file - * TempPath; // path in temporary folder, if any - unsigned int FileSize, // file size - FileOffset; // file offset in EXE/CCN file - int TempCount; // usage count - - CBinaryFile() : - TempPath(NULL), FileSize(0), FileOffset(0), TempCount(0) - { - memset(Path, 0, MAX_PATH); - } - ~CBinaryFile() - { - if (TempPath) - { - _tremove(TempPath); - free(TempPath); - TempPath = NULL; - TempCount = 0; - } - } + // Path stored in ccn file + FusionANSIWarning TCHAR Path[MAX_PATH]; + // Path in temporary folder, if any + // Will not be valid in ANSI ext in Unicode runtime, due to Path offset prior. + FusionANSIWarning TCHAR * TempPath; + + // file size + std::uint32_t FileSize; + // file offset in EXE/CCN file + std::uint32_t FileOffset; + // usage count + int TempCount; + + // While this struct was defined with C++ ctors/dtors in original Fusion SDK, it is not used in any MMFS2 function, + // and creating new CBinaryFile isn't expected. + NO_DEFAULT_CTORS_OR_DTORS(CBinaryFile); }; ////////////////////////////////////////////////////////////////////////////// @@ -4946,39 +5170,67 @@ struct CBinaryFile { struct CRunApp { NO_DEFAULT_CTORS_OR_DTORS(CRunApp); - CRunApp* get_ParentApp(); + // Returns parent app if subapp, or null if not subapp + // Subapps can themselves have subapps, but it is uncommon + _Maybenull_ CRunAppMultiPlat* get_ParentApp(); + // Returns number of Fusion frames std::size_t GetNumFusionFrames(); + // Gets current Fusion frame number (0-based) + int get_nCurrentFrame(); + // Gets frame pointer + CRunFrameMultiPlat * get_Frame(); + // Gets application name + FusionANSIWarning const TCHAR * get_name(); + // Gets application filepath - Windows only! + FusionANSIWarning const TCHAR * get_appFileName(); + // Gets editor filepath - not available in Android + FusionANSIWarning const TCHAR * get_editorFileName(); + // Gets original MFA filepath - not available in Android + FusionANSIWarning const TCHAR * get_targetFileName(); DarkEdifInternalAccessProtected: friend Edif::Runtime; friend DarkEdif::FontInfoMultiPlat; - // Application info - AppMiniHeader miniHdr; // Version - AppHeader hdr; // General info - TCHAR * name, // name of the application - * appFileName, // filename (temporary file in editor mode) - * editorFileName, // filename of original .mfa file - * copyright, // copyright - * aboutText; // text to display in the About box - - // File infos - TCHAR * targetFileName; // filename of original CCN/EXE file - TCHAR * tempPath; // Temporary directory for external files - HFILE file; // File handle - Yves confirmed it was opened with CreateFile, not fopen - unsigned int startOffset; - - // Help file - TCHAR * doc; // Help file pathname - - // Icon - unsigned char * icon16x16x8; // = LPBITMAPINFOHEADER - HICON hIcon16x16x8; // Small icon for the main window - - // Menu - HMENU hRunMenu; // Menu - unsigned char * accels; // Accelerators - TCHAR * pMenuTexts; // Menu texts (for ownerdraw menu) - unsigned char * pMenuImages; // Images index used in the menu + + // Application version info + AppMiniHeader miniHdr; + // Application general info + AppHeader hdr; + // Application name + FusionANSIWarning TCHAR * name; + // filename (temporary file in editor mode) + FusionANSIWarning TCHAR* appFileName; + // filename of original .mfa file + FusionANSIWarning TCHAR * editorFileName; + // Fusion-app copyright + FusionANSIWarning TCHAR * copyright; + // text to display in the About box + FusionANSIWarning TCHAR * aboutText; + + // Filename of original CCN/EXE file + FusionANSIWarning TCHAR * targetFileName; + // Temporary directory for external files + FusionANSIWarning TCHAR * tempPath; + // File handle - Yves confirmed it was opened with CreateFile, not fopen + HFILE file; + unsigned int startOffset; + + // Fusion app help filepath + FusionANSIWarning TCHAR * doc; + + // Fusion app icon - documented as LPBITMAPINFOHEADER, but may be LPBITMAPINFO itself? + unsigned char* icon16x16x8; + // Small icon for the main window + HICON hIcon16x16x8; + + // Menu handle + HMENU hRunMenu; + // Menu accelerators + unsigned char * accels; + // Menu texts (for ownerdraw menu) + FusionANSIWarning TCHAR * pMenuTexts; + // Images index used in the menu + unsigned char * pMenuImages; MenuHdr * pMenu; // Frame offsets @@ -4987,8 +5239,8 @@ struct CRunApp { unsigned short * frame_handle_to_index; // Handle -> index table unsigned int * frameOffset; // Frame offsets in the file - // Frame passwords - TCHAR ** framePasswords; // Table of frame passwords (TCHAR * []) + // Table of frame passwords + FusionANSIWarning TCHAR ** framePasswords; // Extensions int nbKpx; // Number of extensions @@ -4999,9 +5251,10 @@ struct CRunApp { int nbMvx; // Number of movement extensions MvxFnc * mvxTable; // DLL info - // Elements - TCHAR * eltFileName[MAX_TABREF]; // Element banks - HFILE hfElt[MAX_TABREF]; + // Element bank file paths + FusionANSIWarning TCHAR * eltFileName[MAX_TABREF]; + // Element bank handles + HFILE hfElt[MAX_TABREF]; unsigned int eltBaseOff; unsigned short nbEltOff[MAX_TABREF]; // Sizes of file offset tables @@ -5085,16 +5338,21 @@ struct CRunApp { * pScores; // Global values (warning: not valid if sub-app and global values are shared) + // Default global value values unsigned char * pGlobalValuesInit; - int nGlobalValues; // Number of global values + // Number of global values + int nGlobalValues; CValueMultiPlat * pGlobalValues; // Global values - unsigned char * pFree, // No longer used - * pGlobalValueNames, - - // Global strings (warning: not valid if sub-app and global values are shared) - * pGlobalStringInit; // Default global string values - int nGlobalStrings; // Number of global strings - TCHAR ** pGlobalString; // Pointers to global strings + unsigned char * pFree; // No longer used + // Global value names + unsigned char * pGlobalValueNames; + + // Default global string values + unsigned char * pGlobalStringInit; + // Number of global strings + int nGlobalStrings; + // Global strings (warning: not valid if sub-app and global strings are shared) + FusionANSIWarning TCHAR ** pGlobalString; unsigned char * pGlobalStringNames; // Global objects @@ -5104,18 +5362,19 @@ struct CRunApp { short NConditions[7+32-1]; // NUMBER_OF_SYSTEM_OBJECTS + KPX_BASE - 1->0 base change // External sound files - TCHAR * pExtMusicFile, - * pExtSampleFile[32]; // External sample file per channel + FusionANSIWarning TCHAR * pExtMusicFile; + // External sample file per channel + FusionANSIWarning TCHAR * pExtSampleFile[32]; int nInModalLoopCount; - TCHAR * pPlayerNames; + FusionANSIWarning TCHAR * pPlayerNames; unsigned int dwColorCache; unsigned char * pVtz4Opt; // not used unsigned int dwFree; // not used // Application load - TCHAR * pLoadFilename; + FusionANSIWarning TCHAR * pLoadFilename; unsigned int saveVersion; BOOL bLoading; @@ -5152,13 +5411,15 @@ struct CRunApp { #if 0 // Dibs // ---- -typedef Appli void; -unsigned long FusionAPI InitDibHeader(Appli *, int, int, int, BITMAPINFO *); -void FusionAPI FillDib(BITMAPINFO *, COLORREF); -unsigned long FusionAPI ImageToDib(Appli *, DWORD, DWORD, LPBYTE); -unsigned long FusionAPI DibToImage(Appli *, Image *, BITMAPINFOHEADER *); -unsigned long FusionAPI DibToImageEx(Appli *, Image *, BITMAPINFOHEADER *, COLORREF, DWORD); -void FusionAPI RemapDib(BITMAPINFO *, Appli *, LPBYTE); +typedef void Appli; +extern "C" { + DWORD FusionAPI InitDibHeader(_Notnull_ Appli*, int, int, int, BITMAPINFO*) EXDEF; + void FusionAPI FillDib(_Notnull_ BITMAPINFO *, COLORREF) EXDEF; + DWORD FusionAPI ImageToDib(_Notnull_ Appli *, DWORD, DWORD, _Notnull_ LPBYTE) EXDEF; + DWORD FusionAPI DibToImage(_Notnull_ Appli *, _Notnull_ Img *, _Notnull_ BITMAPINFOHEADER *) EXDEF; + DWORD FusionAPI DibToImageEx(_Notnull_ Appli *, _Notnull_ Img *, _Notnull_ BITMAPINFOHEADER *, COLORREF, DWORD) EXDEF; + void FusionAPI RemapDib(_Notnull_ BITMAPINFO *, _Notnull_ Appli *, _Notnull_ LPBYTE) EXDEF; +} #endif //#include "StockSDKDefines.hpp" diff --git a/DarkEdif/Inc/Windows/Mvt.hpp b/DarkEdif/Inc/Windows/Mvt.hpp index e70e0f43..53f63042 100644 --- a/DarkEdif/Inc/Windows/Mvt.hpp +++ b/DarkEdif/Inc/Windows/Mvt.hpp @@ -102,8 +102,8 @@ class CMvt { virtual int DirAtStart() { return 0; } // Load / Save - virtual BOOL Load(LPBYTE pBuf, unsigned int dwSize, unsigned int dwFlags) { return 0; } - virtual BOOL Save(LPBYTE pBuf, LPDWORD pDWSize, unsigned int dwFlags) { return 0; } + virtual BOOL Load(LPBYTE pBuf, DWORD dwSize, DWORD dwFlags) { return 0; } + virtual BOOL Save(LPBYTE pBuf, LPDWORD pDWSize, DWORD dwFlags) { return 0; } // Run-time virtual CRunMvt* CreateRunMvt() { return NULL; } @@ -168,8 +168,8 @@ class CRunMvt { virtual void SetRotSpeed(LPHO pHo, int speed) {} virtual void Set8Dirs(LPHO pHo, int dirs) {} virtual void SetGravity(LPHO hoPtr, int gravity) {} - virtual unsigned int Extension(LPHO hoPtr, int function, unsigned int param) {return 0;} - virtual unsigned int ActionEntry(LPHO hoPtr, int action, unsigned int param) {return 0;} + virtual DWORD Extension(LPHO hoPtr, int function, DWORD param) {return 0;} + virtual DWORD ActionEntry(LPHO hoPtr, int action, DWORD param) {return 0;} virtual int GetSpeed(LPHO hoPtr) {return 0;} virtual int GetAcceleration(LPHO hoPtr) {return 0;} virtual int GetDeceleration(LPHO hoPtr) {return 0;} diff --git a/DarkEdif/Inc/Windows/Props.hpp b/DarkEdif/Inc/Windows/Props.hpp index efc2f09d..9a78529d 100644 --- a/DarkEdif/Inc/Windows/Props.hpp +++ b/DarkEdif/Inc/Windows/Props.hpp @@ -63,7 +63,7 @@ class Prop virtual void Delete() = 0; virtual Prop * CreateCopy() = 0; virtual BOOL IsEqual(Prop * P) = 0; - virtual unsigned int GetClassID() = 0; + virtual DWORD GetClassID() = 0; }; // Integer @@ -86,7 +86,7 @@ class Prop_SInt : public Prop { return (this->Value == ((Prop_SInt *)P)->Value); } - virtual unsigned int GetClassID() + virtual DWORD GetClassID() { return 'INT '; } @@ -124,7 +124,7 @@ class Prop_UInt : public Prop { return (this->Value == ((Prop_UInt *)P)->Value); } - virtual unsigned int GetClassID() + virtual DWORD GetClassID() { return 'DWRD'; } @@ -159,7 +159,7 @@ class Prop_Float : public Prop { return (this->Value == ((Prop_Float *)P)->Value); } - virtual unsigned int GetClassID() + virtual DWORD GetClassID() { return 'FLOT'; } @@ -193,7 +193,7 @@ class Prop_Double : public Prop { return (this->Value == ((Prop_Double *)P)->Value); } - virtual unsigned int GetClassID() + virtual DWORD GetClassID() { return 'DBLE'; } @@ -228,7 +228,7 @@ class Prop_Size : public Prop return (this->X == ((Prop_Size *)P)->X) && (this->Y == ((Prop_Size *)P)->Y); } - virtual unsigned int GetClassID() + virtual DWORD GetClassID() { return 'SIZE'; } @@ -264,7 +264,7 @@ class Prop_Int64 : public Prop { return (this->Value == ((Prop_Int64 *)P)->Value); } - virtual unsigned int GetClassID() + virtual DWORD GetClassID() { return 'INT2'; } @@ -298,7 +298,7 @@ class Prop_Ptr : public Prop { return (this->Address == ((Prop_Ptr *)P)->Address); } - virtual unsigned int GetClassID() + virtual DWORD GetClassID() { return 'LPTR'; } @@ -353,7 +353,7 @@ class Prop_Buff : public Prop return ((this->Address == ((Prop_Buff *)P)->Address && this->Size == ((Prop_Buff *)P)->Size) || // Same address AND size means equiv. !memcmp(this->Address, ((Prop_Buff *)P)->Address, this->Size)); // Otherwise compare buffers } - virtual unsigned int GetClassID() + virtual DWORD GetClassID() { return 'DATA'; } @@ -407,7 +407,7 @@ class Prop_AStr : public Prop !strcmp(this->String, ((Prop_AStr *)P)->String); } char * GetString() {return String;} - virtual unsigned int GetClassID() + virtual DWORD GetClassID() { return 'STRA'; } @@ -476,7 +476,7 @@ class Prop_WStr : public Prop ((Prop_WStr *)P)->String == NULL || !wcscmp(this->String, ((Prop_WStr *)P)->String); // Otherwise compare buffers } - virtual unsigned int GetClassID() + virtual DWORD GetClassID() { return 'STRW'; } @@ -763,7 +763,7 @@ typedef struct { // Initialization structure for file selector property typedef struct { - const char * extFilter; // Filter string for GetOpenFilename dialog (for example "All Files (*.*)|*.*|") + const TCHAR * extFilter; // Filter string for GetOpenFilename dialog (for example "All Files (*.*)|*.*|") unsigned int options; // Options for GetOpenFilename dialog (OFN_FILEMUSTEXIST, OFN_PATHMUSTEXIST, OFN_HIDEREADONLY, etc.) } FilenameCreateParam; diff --git a/DarkEdif/Inc/Windows/WindowsDefines.hpp b/DarkEdif/Inc/Windows/WindowsDefines.hpp index 7bd36321..39b4c005 100644 --- a/DarkEdif/Inc/Windows/WindowsDefines.hpp +++ b/DarkEdif/Inc/Windows/WindowsDefines.hpp @@ -1,8 +1,44 @@ #pragma once +#ifndef __INTELLISENSE__ // Hints to the compiler that the class/function this is attached to is defined externally and imported. // Annotating this is not required, but makes more efficient code. #define FusionAPIImport __declspec(dllimport) +#define EXDEF /* no op */ +#else +// Lie to IntelliSense that the dllimported func is defined locally, so it stops complaining about missing definition +#define FusionAPIImport /* no op */ +// Make IntelliSense see the function as defined, but contents are assumed unreachable code +#define EXDEF { __assume(0); } +#endif + +// Windows 64-bit exporter is surely soon(tm) +#if !defined(FusionSDKWin64Compat) && defined(_WIN64) +#define FusionSDKWin64Compat +#endif +#ifdef FusionSDKWin64Compat +// Requires the use of 64-bit replacement function +#define Fusion64APISwitch(repl) __declspec(deprecated, repl) +#else +// When enabled, requires the use of 64-bit replacement function +#define Fusion64APISwitch(repl) /* no op */ +#endif + +// Fusion runtime doesn't host two variants of its internals for ANSI and Unicode extensions; +// a string pointer is based on what runtime is. Unicode runtime = Unicode strings. +// If you have an ANSI extension loaded by Unicode runtime, it won't correctly read the Wide +// Fusion internal strings, and the compiler will not suggest why. +// Most of the time this will result in a single character being read. +// +// You can test for Unicode runtime using mvIsUnicodeVersion(), and LOSSILY convert with +// DarkEdif::WideToANSI(), but it will not be able to convert all characters. +// DarkEdif::WideToUTF8() is better, but most char-functions on Windows are ANSI, not UTF8. +// If you don't understand this error: build Unicode or don't read Fusion internals. +#if defined(DARKEDIF_INTERNAL_INCLUDE) || defined(_UNICODE) || (defined(ALLOW_ANSI_EXT_IN_UNICODE_RUNTIME) && !defined(DARKEDIF_SUPPRESS_ANSI_INTERNALS_WARNING)) + #define FusionANSIWarning /* no op */ +#else // non-Unicode and warning alive + #define FusionANSIWarning [[deprecated("This string is not ANSI. It may be wide if the Fusion runtime is Unicode (CF2.5 or MMF2 + Unicode add-on).")]] +#endif // FusionAPI; incoming or outgoing to Fusion runtime. Uses __stdcall convention. #define FusionAPI __stdcall diff --git a/DarkEdif/Inc/Windows/WindowsSurface.hpp b/DarkEdif/Inc/Windows/WindowsSurface.hpp index 0afda7af..7243fac3 100644 --- a/DarkEdif/Inc/Windows/WindowsSurface.hpp +++ b/DarkEdif/Inc/Windows/WindowsSurface.hpp @@ -435,7 +435,7 @@ struct FusionD3DSurfDriverInfo final { // Size of this struct in bytes, varies per D3D level. // It is recommended you set this to whatever GetDriverInfo(NULL) returns. - DWORD surfInfoSize; + std::uint32_t surfInfoSize; // Set to 8, 9, 11. int D3DVersion; @@ -509,7 +509,7 @@ enum class LockImageSurfaceMode : int HWACompatible }; // Call to populate a cSurface from an image bank ID. Warning: invalid ID will cause a crash. -FusionAPIImport BOOL FusionAPI LockImageSurface(void* idApp, DWORD hImage, cSurface& cs, int flags = (int)LockImageSurfaceMode::ReadBlitOnly); +FusionAPIImport BOOL FusionAPI LockImageSurface(void* idApp, ULONG hImage, cSurface& cs, int flags = (int)LockImageSurfaceMode::ReadBlitOnly); FusionAPIImport void FusionAPI UnlockImageSurface(cSurface& cs); // Allocate/Free surface @@ -655,12 +655,13 @@ class FusionAPIImport cSurface // Sets this cSurface as the current one in a double-buffer... in what context? How are surfaces paired, and how do we know what the pairs target? void SetCurrentDevice(); - // TODO: YQ: Rendering to GetRenderTargetSurface()? Where and why do we need to call BeginRendering()? // Implemented in Direct3D 9 and 11 on CF2.5+. Not available in Direct3D 8. + // Use if you plan to do your own HWA rendering (i.e, doing rendering with DirectX driver info) onto the surface; if the surface is an HWA render target this function binds the render target as the current one in Fusion's D3D device state. int BeginRendering(BOOL clear, RGBAREF rgba); - // TODO: YQ: Rendering to GetRenderTargetSurface()? + // Call after you've finished rendering after a previous BeginRendering() call. int EndRendering(); - // TODO: YQ: update how? + // Only works on frame surface; redraws Fusion's window. + // Note that on D3D9 this usually can't be called in a Display/DisplayRunObject() routine, probably because it is within a BeginScene()/EndScene() pair, which prevents screen updates. BOOL UpdateScreen(); #ifdef HWABETA @@ -671,6 +672,7 @@ class FusionAPIImport cSurface // TODO: YQ: What does this do, how does Max affect it ? void Flush(BOOL bMax); // TODO: YQ: I would guess this is the Z position of the buffer, but a float makes no sense here. + // Frame-surface only. In D3D9, this enables Z-buffering similar to how you can also enable it in shaders, but I still have no idea what the z2D parameter does.. void SetZBuffer(float z2D); #endif @@ -1054,10 +1056,17 @@ class FusionAPIImport cSurface // Transparent monochrome mask ULONG CreateMask(sMask * pMask, UINT dwFlags); - // Lost device callback #ifdef HWABETA + // In the LostDeviceCallback, you must call OnLostDevice() to free resources. + // Do not call this function otherwise. void OnLostDevice(); + // Adds a lost device callback to the surface. + // Such callback is executed right when the D3D device is lost, and you must free + // all D3D resources and unmanaged textures you had associated with this surface. + // You must call OnLostDevice() on this surface in the callback! + // This is not called after a new device is available, so do not re-create those resources. void AddLostDeviceCallBack(LOSTDEVICECALLBACKPROC pCallback, LPARAM lUserParam); + // Removes a lost device callback added with AddLostDeviceCallBack(). void RemoveLostDeviceCallBack(LOSTDEVICECALLBACKPROC pCallback, LPARAM lUserParam); // CF2.5+'s Direct3D11 surfaces: Set premultiplied alpha flag @@ -1114,15 +1123,21 @@ class FusionAPIImport cSurface extern "C" FusionAPIImport BOOL WINAPI BuildRemapTable (LPBYTE, LOGPALETTE *, LOGPALETTE *, WORD); -// Used by EditorDisplay of most Fusion exts -FusionAPIImport cSurface* FusionAPI WinGetSurface(int idWin, int surfID = 0); +// Grabs a window's cSurface ptr. Used by EditorDisplay of most Fusion exts. +// @param idWin a Win ID, from mV->mvIdEditWin or rhIdEditWin +// @param surfID 0 for screen surface, 1 for background save buffer +// @remarks Relates to WSURF_LOGSCREEN, WSURF_BACKSAVE. Background saving is a +// standard display tech; see OEFLAGS::BACK_SAVE etc. +// Not sure if D3D back buffers are 2+, or unrelated. +// TODO: What happens if bad ptr? null? crash? Are back buffers unrelated? +FusionAPIImport _Ret_maybenull_ cSurface* FusionAPI WinGetSurface(_In_ int idWin, _In_range_(0,1) int surfID = 0); // Required struct name due to Cnpdll.h GetImageInfos() func // Corresponds to image bank entry? struct Img final { // Img struct flags; bitmask - enum class Flags : BYTE { + enum class Flags : std::uint8_t { // For bit ops None = 0, // Lossless image compression using Run-Length Encoding @@ -1149,25 +1164,24 @@ struct Img final }; // Checksum algorithm; not sure what is used or what it's run on - DWORD imgCheckSum; + std::uint32_t imgCheckSum; // Probably ref count - DWORD imgCount; + std::uint32_t imgCount; // Byte count, including both color and alpha, not including this header - DWORD imgSize; + std::uint32_t imgSize; // Why is this signed? - short imgWidth; + std::int16_t imgWidth; // Why is this signed? - short imgHeight; + std::int16_t imgHeight; // Format, may affect flags - BYTE imgFormat; + std::uint8_t imgFormat; // Flags, including alpha and compression Flags imgFlags; - WORD imgNotUsed; + std::uint16_t imgNotUsed; // XY coord of this image hot spot (display offset relative to object's hoX/hoY) - short imgXSpot, imgYSpot; - // X coord of this image hot spot (display offset relative to object's hoX/hoY) - short imgXAction; - short imgYAction; + std::int16_t imgXSpot, imgYSpot; + // XY coord of this image action point (used for Launching by default?) + std::int16_t imgXAction, mgYAction; // Image transparent color (ignored if imgFlags say it's alpha) COLORREF imgTrspColor; }; @@ -1175,15 +1189,17 @@ enum_class_is_a_bitmask(Img::Flags); extern "C" { /** Returns number of elements in the Fusion bank. Returns 0+. + * @remarks There are 0 images in a fresh Fusion application. + * The standard lightning-bolt app icon won't make an entry. * @param appli mv->mvAppli or rhPtr->rhAppli. * @param bkNum Bank number: see BK_XX enum. * @return Number of elements in bank, 0+. */ - FusionAPIImport int FusionAPI Bank_GetEltCount(void * appli, UINT bkNum); + FusionAPIImport int FusionAPI Bank_GetEltCount(void * appli, UINT bkNum) EXDEF; /** Returns the image ID's info to the given struct. * @param appli mv->mvAppli or rhPtr->rhAppli. * @param imgID Image ID number (1-65535). * @param imgPtr Output image info struct. * @return 1 if successful. 0 if failed. */ - FusionAPIImport int FusionAPI GetImageInfos(void* appli, DWORD imgID, Img* imgPtr); + FusionAPIImport int FusionAPI GetImageInfos(void* appli, ULONG imgID, Img* imgPtr) EXDEF; } diff --git a/DarkEdif/Inc/iOS/MMFiOSMasterHeader.hpp b/DarkEdif/Inc/iOS/MMFiOSMasterHeader.hpp index f88264f0..c85a3da1 100644 --- a/DarkEdif/Inc/iOS/MMFiOSMasterHeader.hpp +++ b/DarkEdif/Inc/iOS/MMFiOSMasterHeader.hpp @@ -222,7 +222,7 @@ inline namespace FusionInternals }; struct CRunFrameMultiPlat { - + const TCHAR * get_name(); }; struct CRunAppMultiPlat { NO_DEFAULT_CTORS(CRunAppMultiPlat); @@ -230,6 +230,10 @@ inline namespace FusionInternals CRunFrameMultiPlat* get_Frame(); CRunAppMultiPlat* get_ParentApp(); std::size_t GetNumFusionFrames(); + const TCHAR * get_name(); + const TCHAR * get_appFileName(); + const TCHAR * get_editorFileName(); + const TCHAR * get_targetFileName(); }; struct RunHeader { diff --git a/DarkEdif/Lib/Shared/DarkEdif.cpp b/DarkEdif/Lib/Shared/DarkEdif.cpp index aec4c79f..190b4196 100644 --- a/DarkEdif/Lib/Shared/DarkEdif.cpp +++ b/DarkEdif/Lib/Shared/DarkEdif.cpp @@ -1,3 +1,6 @@ +// Suppress warnings for popping up for DE's own internal usage +#define DARKEDIF_INTERNAL_INCLUDE + #include "Common.hpp" #include "Extension.hpp" #include @@ -1768,79 +1771,6 @@ BOOL DarkEdif::DLL::DLL_IsPropEnabled(mv * mV, EDITDATA * edPtr, unsigned int Pr return FALSE; } -int FusionAPI EnumElts(mv* mV, EDITDATA* edPtr, ENUMELTPROC enumProc, ENUMELTPROC undoProc, LPARAM p1, LPARAM p2) -{ -#pragma DllExportHint - LOGV(_T("Call to %s with edPtr %p.\n"), _T(__FUNCTION__), edPtr); - // Note from Yves that the textual font properties - that is, TEXT_OEFLAG_EXTENSION, - // GetTextFont(), do not need their fonts enumed here, they are automatically grabbed during build. - // - // Direct3D 11 apps: All LOGFONT used by TEXT_OEFLAG_EXTENSION automatically stored. - // Only TTF fonts are supported by D3D11. - // Direct3D 8 + 9 apps: Will need to use Font Embed object, the one for Windows. - // It's manual: you embed the font yourself in Data Elements, - // then extract it at runtime, then pass the extracted path to its action. - // This supports all fonts. - // Android apps: Requires the Android Font Embed object to embed fonts. - // iOS + Mac apps: You have to manually add the font into your xcodeproj's Resources, - // and then add them to the plist as UIAppFonts. Don't just put them in - // the Resources directory, you must link them. - // You may also need to add the font to Build Phases. - // https://community.clickteam.com/forum/thread/67739-custom-fonts/ - - // Note that enumProc may change the image or font number passed to it. - int error = 0; - std::vector> IdAndType; - - const auto& realProps = Elevate(edPtr->Props); - if (realProps.propVersion != 'DAR2') - { - DarkEdif::MsgBox::Error(_T("DarkEdif property error"), _T("Properties aren't as expected inside EnumElts().")); - return 0; - } - - const DarkEdif::Properties::Data* d = realProps.Internal_FirstData(); - for (std::size_t i = 0, j = realProps.numProps; i < j; ++i) - { - if (d->propTypeID == Edif::Properties::IDs::PROPTYPE_FONT) - { - LOGV(_T("Adding font of property %s from font bank ID %hu.\n"), - UTF8ToTString(d->ReadPropName()).c_str(), *(std::uint16_t*)d->ReadPropValue()); - if ((error = enumProc((std::uint16_t*)d->ReadPropValue(), FONT_TAB, p1, p2)) != 0) - { - MsgBox::Error(_T("EnumElts"), _T("Adding font property %s, font ID %hu failed! Error %d.\n"), - UTF8ToTString(d->ReadPropName()).c_str(), *(std::uint16_t *)d->ReadPropValue(), error); - goto postLoop; - } - IdAndType.emplace_back(std::make_pair((std::uint16_t*)d->ReadPropValue(), FONT_TAB)); - } - else if (d->propTypeID == Edif::Properties::IDs::PROPTYPE_IMAGELIST) - { - ImgListProperty* imgProp = (ImgListProperty*)d->ReadPropValue(); - LOGV(_T("Adding images of property %s, num IDs %hu...\n"), - UTF8ToTString(d->ReadPropName()).c_str(), imgProp->numImages); - for (std::size_t i = 0; i < imgProp->numImages; ++i) - { - if ((error = enumProc(&imgProp->imageIDs[i], IMG_TAB, p1, p2)) != 0) - { - MsgBox::Error(_T("EnumElts"), _T("Adding image of property %s, ID %hu failed! Error %d.\n"), - UTF8ToTString(d->ReadPropName()).c_str(), imgProp->imageIDs[i], error); - goto postLoop; - } - IdAndType.emplace_back(std::make_pair(&imgProp->imageIDs[i], IMG_TAB)); - } - } - d = d->Next(); - } -postLoop: - // In case of error, undo it - if (error != 0) - { - for (int i = IdAndType.size() - 1; i >= 0; --i) - undoProc(std::get<0>(IdAndType[i]), std::get<1>(IdAndType[i]), p1, p2); - } - return error; -} struct Properties::PreSmartPropertyReader : Properties::PropertyReader { @@ -4811,12 +4741,12 @@ void DarkEdif::DLL::GeneratePropDataFromJSON() { if (Property["Case"sv].type != json_type::json_none) { - MsgBox::WarningOK(_T("DarkEdif JSON property"), _T(R"(Property "%s" is set to "Case"="%hs", but that won't work with property type %hs.)"), + MsgBox::WarningOK(errorPrefix, _T(R"(Property "%s" is set to "Case"="%hs", but that won't work with property type %hs.)"), UTF8ToTString(Property["Title"sv]).c_str(), Property["Case"sv].c_str(), Names[CurrentProperty->Type_ID % 1000]); } if (Property["Password"sv].type != json_type::json_none) { - MsgBox::WarningOK(_T("DarkEdif JSON property"), _T("Property \"%s\" is set to password mask, but that won't work with property type %hs."), + MsgBox::WarningOK(errorPrefix, _T("Property \"%s\" is set to password mask, but that won't work with property type %hs."), UTF8ToTString(Property["Title"sv]).c_str(), Names[CurrentProperty->Type_ID % 1000]); } } @@ -4861,7 +4791,7 @@ void DarkEdif::DLL::GeneratePropDataFromJSON() if (std::any_of(Edif::SDK->EdittimePropertySets.cbegin(), Edif::SDK->EdittimePropertySets.cend(), [i](const auto& es) { return es.nameListIdx == i; })) { - MsgBox::Error(_T("DarkEdif JSON property"), _T("Items detected in a property set list box %s."), + MsgBox::Error(errorPrefix, _T("Items detected in a property set list box %s."), UTF8ToTString(Property["Title"sv]).c_str()); SetAllProps(PROPOPT_PARAMREQUIRED, NULL); break; @@ -4870,7 +4800,7 @@ void DarkEdif::DLL::GeneratePropDataFromJSON() const json_value& itemsJSON = Property["Items"sv]; if (itemsJSON.type != json_type::json_array || itemsJSON.u.array.length == 0) { - MsgBox::Error(_T("DarkEdif JSON property"), _T("No Items detected in combobox property %s."), + MsgBox::Error(errorPrefix, _T("No Items detected in combobox property %s."), UTF8ToTString(Property["Title"sv]).c_str()); } @@ -4903,7 +4833,7 @@ void DarkEdif::DLL::GeneratePropDataFromJSON() sizeEntry[0].type != json_type::json_integer || sizeEntry[1].type != json_type::json_integer || (json_int_t)sizeEntry[0] < 0 || (json_int_t)sizeEntry[1] < 0) { - DarkEdif::MsgBox::Error(_T("DarkEdif JSON property"), _T("Invalid preset size index %d in size property %s."), + MsgBox::Error(errorPrefix, _T("Invalid preset size index %d in size property %s."), index, UTF8ToTString(Property["Title"sv]).c_str()); } @@ -4919,7 +4849,7 @@ void DarkEdif::DLL::GeneratePropDataFromJSON() } if (presetList.type != json_type::json_none) { - DarkEdif::MsgBox::Error(_T("DarkEdif JSON property"), _T("Invalid PresetSizes array in size property %s."), + MsgBox::Error(errorPrefix, _T("Invalid PresetSizes array in size property %s."), UTF8ToTString(Property["Title"sv]).c_str()); } @@ -4941,9 +4871,90 @@ void DarkEdif::DLL::GeneratePropDataFromJSON() // Edit box + browse file button, Parameter = FilenameCreateParams case PROPTYPE_FILENAME: - case PROPTYPE_PICTUREFILENAME: - SetAllProps(0, NULL); + { + const auto& filters = Property["Filters"sv]; + std::tstring filterName; + if (filters.type == json_none) + filterName = _T("All files (*.*)|*.*|"s); + else if (filters.type != json_array) + { + MsgBox::Error(errorPrefix, _T("Property \"Filters\" must be a filter string or array of filter strings.")); + } + else + { + for (unsigned int i = 0; i < filters.u.array.length; ++i) + { + const auto& filter = filters[i]; + if (filter.type != json_array) + { + MsgBox::Error(errorPrefix, _T("Invalid file filter type; property ID %u must be an array containing the display name, then the corresponding file extensions array."), i); + break; + } + else if (filter.u.array.length != 2) + { + MsgBox::Error(errorPrefix, _T("File filter index %u must have 2 elements; a display name string, then afterwards the corresponding file extensions array."), i); + break; + } + else if (filter[0].type != json_string) + { + MsgBox::Error(errorPrefix, _T("File filter index %u's first element must be a display name string."), i); + break; + } + + std::tstring filterDisplay = UTF8ToTString(filter[0]); + if (filterDisplay.find(_T('|')) != std::tstring::npos) + { + MsgBox::Error(errorPrefix, _T("File filter index %u's display name must not have a \"|\" character. Fusion uses it to seperate file extension names and file extensions themselves."), i); + break; + } + + filterName += filterDisplay + _T("|"s); + + const auto& filterExts = filter[1]; + if (filterExts.type == json_array) + { + if (filterExts.u.array.length < 1) + { + MsgBox::Error(errorPrefix, _T("File filter index %u's file extensions array is empty."), i); + break; + } + + for (unsigned int j = 0; j < filterExts.u.array.length; ++j) + { + const auto& filterExt = filterExts[j]; + if (filterExt.type != json_string) + { + MsgBox::Error(errorPrefix, _T("File filter index %u, file extension index %u must be a string."), i, j); + break; + } + + filterName += UTF8ToTString(filterExt) + _T(";"s); + } + } + else if (filterExts.type == json_string) + filterName += UTF8ToTString(filterExts) + _T(";"s); + else + { + MsgBox::Error(errorPrefix, _T("File filter index %u's second element must be either an array of file extension strings or a single file extension."), i); + } + filterName += _T("|"sv); + } + } + + // TODO: this is a memory leak, but fixing it via GetPropCreateParam + // will mean JSON isn't validated until object is selected and props fully loaded, + // rather than error check on object create. + FilenameCreateParam * p = new FilenameCreateParam {}; + p->extFilter = Edif::ConvertString(TStringToUTF8(filterName)); + p->options = OFN_FILEMUSTEXIST | OFN_EXPLORER; + SetAllProps(PROPOPT_PARAMREQUIRED, p); + } + case PROPTYPE_PICTUREFILENAME: + { + bool includeAnimations = (bool)Property["UseAnimationFiles"sv]; + SetAllProps(PROPOPT_PARAMREQUIRED, includeAnimations); + } // Font dialog box case PROPTYPE_FONT: SetAllProps(0, NULL); @@ -5373,7 +5384,7 @@ void DarkEdif::FontInfoMultiPlat::SetFont(const jobject ptr) { JavaAndCString str((jstring)threadEnv->GetObjectField(ptr, lfFaceName)); fontNameDesired = str.str(); } -#else // apple +#elif defined(__APPLE__) DarkEdif::FontInfoMultiPlat::FontInfoMultiPlat(CFontInfo* ptr) { cfontinfo = ptr; SetFont(cfontinfo); @@ -5387,7 +5398,8 @@ void DarkEdif::FontInfoMultiPlat::SetFont(const void * ptr2) { strikeOut = ptr->lfStrikeOut != 0; fontNameDesired = [ptr->lfFaceName UTF8String]; } - +#else + #error Unexpected platform #endif DarkEdif::FontInfoMultiPlat::FontInfoMultiPlat() { @@ -5441,7 +5453,7 @@ std::tstring DarkEdif::FontInfoMultiPlat::GetActualFontName() { // Font names may be localised, particularly for CJK and English. // Hat tip: https://stackoverflow.com/a/7193439 // See a workaround: https://chromium.googlesource.com/chromium/blink/+/e2b472488d4a23f4eb7acdf2d590d513b802820e/Source/platform/fonts/win/FontCacheWin.cpp#64 - HWND ourWin = Edif::SDK->mV->RunApp->hEditWin; + HWND ourWin = DarkEdif::Internal_WindowHandle; HDC ourDC = GetDC(ourWin); if (ourDC == NULL) return LOGE(_T("Couldn't get original DC, error %u."), GetLastError()), _T(""s); @@ -5677,8 +5689,10 @@ int DarkEdif::GetCurrentFusionEventNum(const Extension * const ext) } return threadEnv->CallIntMethod(ext->javaExtPtr, getEventIDMethod); -#else // iOS +#elif defined(__APPLE__) return DarkEdifObjCFunc(PROJECT_TARGET_NAME_UNDERSCORES_RAW, getCurrentFusionEventNum)(ext->objCExtPtr); +#else + #error Unexpected platform #endif } @@ -5716,8 +5730,10 @@ std::tstring DarkEdif::MakePathUnembeddedIfNeeded(const Extension * ext, const s JavaAndCString newPath((jstring)threadEnv->CallObjectMethod(ext->javaExtPtr, getEventIDMethod, origPath.javaRef)); // Copy the C++ memory out into its own variable const std::string truePath(newPath.str()); -#else +#elif defined(__APPLE__) const std::string truePath = DarkEdifObjCFunc(PROJECT_TARGET_NAME_UNDERSCORES_RAW, makePathUnembeddedIfNeeded)(ext->objCExtPtr, std::string(filePath).c_str()); +#else + #error Unexpected platform #endif if (filePath != truePath) LOGV(_T("File path extracted from \"%s\" to \"%s\".\n"), std::tstring(filePath).c_str(), truePath.c_str()); @@ -6273,7 +6289,7 @@ void DarkEdif::LOGFInternal(PrintFHintInside const TCHAR * x, ...) DarkEdif::MsgBox::Error(_T("Fatal error"), _T("%s"), buf); std::abort(); } -#else // APPLE +#elif defined(__APPLE__) #include #include @@ -6410,6 +6426,8 @@ void DarkEdif::LOGFInternal(PrintFHintInside const TCHAR * x, ...) va_end(va); exit(EXIT_FAILURE); } +#else + #error Unexpected platform #endif @@ -6436,7 +6454,7 @@ bool DarkEdif::IsDebuggerAttached() return std::stoi(line.substr(10)) != 0; // if no match, fall thru } -#else // APPLE +#elif defined(__APPLE__) // Apple is heavily sandboxed. This solution seems like it should work on non-jailbroken iOS. // Other possible alternatives for Apple: getppid() != 1 or isatty(STDERR_FILENO) int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid() }; @@ -6447,7 +6465,9 @@ bool DarkEdif::IsDebuggerAttached() if (!sysctl(mib, 4, &info, &size, nullptr, 0)) return (info.kp_proc.p_flag & P_TRACED) != 0; LOGE(_T("Couldn't detect debugger: sysctl() returned error %d\n"), errno); -#endif // Apple +#else + #error Unexpected platform +#endif #ifdef _DEBUG // If debug, if debugger detect fails, we'll assume a debugger is present. @@ -6794,7 +6814,7 @@ namespace DarkEdif // To not make this ANSI ext clobber the debugger's text with replacement characters, // we always talk to CF2.5+ with Wide characters - + // Move caret to end of Fusion debugger text int curTextLen = GetWindowTextLengthW(CF25PlusEditBoxHandle); // On error, default to passing -1, -1, which resets caret @@ -6901,6 +6921,86 @@ void FusionAPI EditDebugItem(RUNDATA *rdPtr, int id) #endif // USE_DARKEDIF_FUSION_DEBUGGER +#ifdef _WIN32 +// Called by Fusion edittime and runtime, requesting IDs used in the element banks (image bank, font bank) +// @remarks There are only object property types for images and fonts, but there are banks +// for samples, collision masks and image HWA textures as well; see BK_XX enum in Cnpdll.h +int FusionAPI EnumElts(mv* mV, EDITDATA* edPtr, ENUMELTPROC enumProc, ENUMELTPROC undoProc, LPARAM p1, LPARAM p2) +{ +#pragma DllExportHint + LOGV(_T("Call to %s with edPtr %p.\n"), _T(__FUNCTION__), edPtr); + + // Note from Yves that the textual font properties - that is, TEXT_OEFLAG_EXTENSION, + // GetTextFont(), do not need their fonts enumed here, they are automatically grabbed during build. + // + // Direct3D 11 apps: All LOGFONT used by TEXT_OEFLAG_EXTENSION automatically stored. + // Only TTF fonts are supported by D3D11. + // Direct3D 8 + 9 apps: Will need to use Font Embed object, the one for Windows. + // It's manual: you embed the font yourself in Data Elements, + // then extract it at runtime, then pass the extracted path to its action. + // This supports all fonts. + // Android apps: Requires the Android Font Embed object to embed fonts. + // iOS + Mac apps: You have to manually add the font into your xcodeproj's Resources, + // and then add them to the plist as UIAppFonts. Don't just put them in + // the Resources directory, you must link them. + // You may also need to add the font to Build Phases. + // https://community.clickteam.com/forum/thread/67739-custom-fonts/ + + // Note that enumProc may change the image or font number passed to it. + int error = 0; + std::vector> IdAndType; + + const auto& realProps = Elevate(edPtr->Props); + if (realProps.propVersion != 'DAR2') + { + DarkEdif::MsgBox::Error(_T("DarkEdif property error"), _T("Properties aren't as expected inside EnumElts().")); + return 0; + } + + const DarkEdif::Properties::Data* d = realProps.Internal_FirstData(); + for (std::size_t i = 0, j = realProps.numProps; i < j; ++i) + { + if (d->propTypeID == Edif::Properties::IDs::PROPTYPE_FONT) + { + LOGV(_T("Adding font of property %s from font bank ID %hu.\n"), + UTF8ToTString(d->ReadPropName()).c_str(), *(std::uint16_t*)d->ReadPropValue()); + if ((error = enumProc((std::uint16_t*)d->ReadPropValue(), FONT_TAB, p1, p2)) != 0) + { + MsgBox::Error(_T("EnumElts"), _T("Adding font property %s, font ID %hu failed! Error %d.\n"), + UTF8ToTString(d->ReadPropName()).c_str(), *(std::uint16_t*)d->ReadPropValue(), error); + goto postLoop; + } + IdAndType.emplace_back(std::make_pair((std::uint16_t*)d->ReadPropValue(), FONT_TAB)); + } + else if (d->propTypeID == Edif::Properties::IDs::PROPTYPE_IMAGELIST) + { + ImgListProperty* imgProp = (ImgListProperty*)d->ReadPropValue(); + LOGV(_T("Adding images of property %s, num IDs %hu...\n"), + UTF8ToTString(d->ReadPropName()).c_str(), imgProp->numImages); + for (std::size_t i = 0; i < imgProp->numImages; ++i) + { + if ((error = enumProc(&imgProp->imageIDs[i], IMG_TAB, p1, p2)) != 0) + { + MsgBox::Error(_T("EnumElts"), _T("Adding image of property %s, ID %hu failed! Error %d.\n"), + UTF8ToTString(d->ReadPropName()).c_str(), imgProp->imageIDs[i], error); + goto postLoop; + } + IdAndType.emplace_back(std::make_pair(&imgProp->imageIDs[i], IMG_TAB)); + } + } + d = d->Next(); + } +postLoop: + // In case of error, undo it + if (error != 0) + { + for (int i = IdAndType.size() - 1; i >= 0; --i) + undoProc(std::get<0>(IdAndType[i]), std::get<1>(IdAndType[i]), p1, p2); + } + return error; +} +#endif // _WIN32 + static bool didLateInit = false; void DarkEdif::LateInit(Extension* ext) { @@ -7756,6 +7856,11 @@ DWORD WINAPI DarkEdifUpdateThread(void * pIsUniVer) reportError = false; updateLog << "The DNS provider couldn't find the update server; is your computer offline?\n"sv; } + // This machine had internet, but doesn't anymore + else if (lastWSAError == WSAENETUNREACH) { + reportError = false; + updateLog << "The network is unreachable; is your computer offline?\n"sv; + } // Server machine is online, but refusing connection - e.g. http service is offline else if (lastWSAError == WSAECONNREFUSED) { reportError = false; @@ -7809,12 +7914,12 @@ DWORD WINAPI DarkEdifUpdateThread(void * pIsUniVer) #pragma warning (push) #pragma warning (disable: 4996) struct hostent * host = gethostbyname(domain); -#pragma warning (pop) // Port 80, default of Darkwire hardcode IP: 80.229.219.2, network byte order // We'll look it up on DNS in case Darkwire migrates, although we'll make every effort not to! SOCKADDR_IN SockAddr = { AF_INET, htons(80), { (UCHAR)80, (UCHAR)229, (UCHAR)219, (UCHAR)2 } }; assert(SockAddr.sin_family == AF_INET && SockAddr.sin_port == htons(80) && SockAddr.sin_addr.s_addr == inet_addr("80.229.219.2")); +#pragma warning (pop) // DNS found, switch over; guaranteed IPv4 as we specified AF_INET if (host != NULL) diff --git a/DarkEdif/Lib/Shared/Edif.General.cpp b/DarkEdif/Lib/Shared/Edif.General.cpp index 8f4cafd5..300aa8f1 100644 --- a/DarkEdif/Lib/Shared/Edif.General.cpp +++ b/DarkEdif/Lib/Shared/Edif.General.cpp @@ -99,24 +99,29 @@ void FusionAPI UnloadObject(mv * mV, EDITDATA * edPtr, int reserved) } +// This is pointed to by Dependencies, as a stream of null-terminated TCHAR strings. +static TCHAR singleton[1024]; const TCHAR * Dependencies[32] = {}; const TCHAR ** FusionAPI GetDependencies() { #pragma DllExportHint - // This is pointed to by Dependencies. - static TCHAR singleton[1024]; - - if (!Dependencies) + if (!Dependencies[0]) { + // CurLang shouldn't be used here; GetDependencies may be requested early const json_value &DependenciesJSON = Edif::SDK->json["Dependencies"sv]; + TCHAR* singletonPtr = singleton; std::size_t Offset = 0; + // If external JSON, add our own JSON to the requested list if (Edif::ExternalJSON) { - TCHAR JSONFilename [MAX_PATH]; + // We calculate filename live, assuming the MFX is being used like a dummy, + // and so we can't rely on the PROJECT_TARGET_NAME defines. + // +2 for the off chance of mfx being exactly MAX_PATH chars. + TCHAR JSONFilename [MAX_PATH + 2]; GetModuleFileName (hInstLib, JSONFilename, sizeof (JSONFilename) / sizeof(*JSONFilename)); @@ -134,21 +139,44 @@ const TCHAR ** FusionAPI GetDependencies() // We append it, then add a pointer to what we just appended // to our pointer list - _tcscpy(singletonPtr, ++Iterator); + _tcscpy_s(singletonPtr, std::size(singleton), ++Iterator); Dependencies[Offset++] = singletonPtr; singletonPtr += _tcslen(singletonPtr) + 1; } - for (unsigned int i = 0; i < DependenciesJSON.u.array.length; ++i) + // Add any other JSON dependencies, or abort + if (DependenciesJSON.type == json_none) + return Dependencies; + + std::tstring tstr; + if (DependenciesJSON.type == json_string) { - std::tstring tstr = DarkEdif::UTF8ToTString(DependenciesJSON[i]); + if (DependenciesJSON.u.string.length != 0) + { + tstr = DarkEdif::UTF8ToTString(DependenciesJSON); + _tcscpy_s(singletonPtr, std::size(singleton) - (singletonPtr - singleton), tstr.c_str()); + Dependencies[Offset++] = singletonPtr; + singletonPtr += _tcslen(singletonPtr) + 1; + } + + return Dependencies; + } + + if (DependenciesJSON.type != json_array) + return DarkEdif::MsgBox::Error(_T("GetDependencies() error"), _T("DarkExt.json contains incorrect Dependencies type.")), nullptr; - _tcscpy(singletonPtr, tstr.c_str()); + // Limit of 31 entries, as Dependencies must end with a null entry. + // If JSON will be inserted as dependency too, then limit is 30. + if (DependenciesJSON.u.array.length > std::size(Dependencies) - (Edif::ExternalJSON ? 2 : 1)) + return DarkEdif::MsgBox::Error(_T("GetDependencies() error"), _T("DarkExt.json contains too many dependencies.")), nullptr; + + for (unsigned int i = 0; i < DependenciesJSON.u.array.length; ++i) + { + tstr = DarkEdif::UTF8ToTString(DependenciesJSON[i]); + _tcscpy_s(singletonPtr, std::size(singleton) - (singletonPtr - singleton), tstr.c_str()); Dependencies[Offset++] = singletonPtr; singletonPtr += tstr.size() + 1; } - - Dependencies[Offset] = 0; } return Dependencies; @@ -768,7 +796,7 @@ ProjectFunc void JNICALL JNI_OnUnload([[maybe_unused]] JavaVM * vm, [[maybe_unus #endif // DARKEDIF_SIGNAL_HANDLERS } -#else // iOS +#elif defined(__APPLE__) #include "Extension.hpp" #include "MMF2Lib/CTexture.h" #include "MMF2Lib/CImage.h" @@ -840,7 +868,9 @@ Extension* RunObject::GetExtension() return (Extension *)DarkEdifObjCFunc(PROJECT_TARGET_NAME_UNDERSCORES_RAW, getCPtr)((CExtension *)this); } -#endif // Apple +#else + #error Unexpected platform +#endif #if DARKEDIF_DISPLAY_TYPE > DARKEDIF_DISPLAY_ANIMATIONS diff --git a/DarkEdif/Lib/Shared/Edif.Runtime.cpp b/DarkEdif/Lib/Shared/Edif.Runtime.cpp index 638b5447..86186243 100644 --- a/DarkEdif/Lib/Shared/Edif.Runtime.cpp +++ b/DarkEdif/Lib/Shared/Edif.Runtime.cpp @@ -1,3 +1,5 @@ +// Suppress warnings for popping up for DE's own internal usage +#define DARKEDIF_INTERNAL_INCLUDE #include "Common.hpp" #include "Edif.hpp" #include "DarkEdif.hpp" @@ -9,6 +11,7 @@ #include "MMF2Lib/CRunApp.h" #include "MMF2Lib/CRCom.h" #include "MMF2Lib/CRSpr.h" +#include "MMF2Lib/CRunFrame.h" #endif struct EdifGlobal @@ -99,10 +102,12 @@ std::vector qualToOi::HalfVector(std::size_t first) get_OiList(0); for (std::size_t i = first; i < OiAndOiListLength; i += 2) list.push_back(OiAndOiList[i]); -#else // apple +#elif defined(__APPLE__) const short* const qoiList = ((CQualToOiList*)this)->qoiList; for (std::size_t i = first; qoiList[i] != -1; i += 2) list.push_back(qoiList[i]); +#else + #error Unexpected platform #endif return list; } @@ -113,12 +118,53 @@ std::vector qualToOi::GetAllOi() { return HalfVector(0); } +const TCHAR * CRunFrameMultiPlat::get_name() +{ +#ifdef _WIN32 + return name; +#elif defined(__APPLE__) + return [((CRunFrame*)this)->frameName UTF8String]; +#elif defined(__ANDROID__) + if (frameName.empty()) + { + const jfieldID fieldID = threadEnv->GetFieldID(meClass, "frameName", "Ljava/lang/String;"); + JNIExceptionCheck(); + JavaAndCString javaFrameName((jstring)threadEnv->GetObjectField(me, fieldID)); + frameName = std::string(javaFrameName.str()); + } + return frameName.c_str(); +#else +#error Unexpected platform +#endif +} + +int CRunAppMultiPlat::get_nCurrentFrame() +{ +#ifdef _WIN32 + return nCurrentFrame; +#elif defined(__APPLE__) + return (std::size_t)((CRunApp*)this)->currentFrame; +#elif defined(__ANDROID__) + LOGV(_T("Running %s().\n"), _T(__FUNCTION__)); + if (!nCurrentFrame.has_value()) + { + static jfieldID fieldID = threadEnv->GetFieldID(meClass, "currentFrame", "I"); + JNIExceptionCheck(); + nCurrentFrame = threadEnv->GetIntField(me, fieldID); + JNIExceptionCheck(); + } + return nCurrentFrame.value(); +#else +#error Unexpected platform +#endif +} + CRunAppMultiPlat* CRunAppMultiPlat::get_ParentApp() { #ifdef _WIN32 return ParentApp; #elif defined(__APPLE__) return (CRunAppMultiPlat*)((CRunApp*)this)->parentApp; -#else // Android +#elif defined(__ANDROID__) if (!parentApp && !parentAppIsNull) { // Application/CRunApp parentApp @@ -132,15 +178,18 @@ CRunAppMultiPlat* CRunAppMultiPlat::get_ParentApp() { parentAppIsNull = true; } return parentApp.get(); +#else + #error Unexpected platform #endif } +// Gets current Fusion frame number (1+) std::size_t CRunAppMultiPlat::GetNumFusionFrames() { #ifdef _WIN32 return hdr.NbFrames; #elif defined(__APPLE__) return (std::size_t)((CRunApp*)this)->gaNbFrames; -#else // Android +#elif defined(__ANDROID__) if (numTotalFrames == 0) { jfieldID fieldID = threadEnv->GetFieldID(meClass, "gaNbFrames", "I"); @@ -150,9 +199,108 @@ std::size_t CRunAppMultiPlat::GetNumFusionFrames() { numTotalFrames = (std::size_t)totalFrames; } return numTotalFrames; +#else + #error Unexpected platform +#endif +} + +// Gets frame pointer +CRunFrameMultiPlat* CRunAppMultiPlat::get_Frame() +{ +#ifdef _WIN32 + return Frame; +#elif defined(__APPLE__) + return (CRunFrameMultiPlat *)((CRunApp*)this)->frame; +#elif defined(__ANDROID__) + if (!frame) + { + const jfieldID fieldID = threadEnv->GetFieldID(meClass, "frame", "LApplication/CRunFrame;"); + JNIExceptionCheck(); + const jobject javaCurrentFrame = threadEnv->GetObjectField(me, fieldID); + JNIExceptionCheck(); + assert(javaCurrentFrame); // should never be null + frame = std::make_unique(javaCurrentFrame, runtime); + } + return frame.get(); +#else +#error Unexpected platform +#endif +} + +// Gets application name +const TCHAR * CRunAppMultiPlat::get_name() +{ +#ifdef _WIN32 + // TODO: Is this ANSI or Unicode? + return name; +#elif defined(__APPLE__) + // NSString to C++ string + return [((CRunApp*)this)->appName UTF8String]; +#elif defined(__ANDROID__) + if (appName.empty()) + { + const jfieldID fieldID = threadEnv->GetFieldID(meClass, "appName", "Ljava/lang/String;"); + JNIExceptionCheck(); + JavaAndCString javaAppName((jstring)threadEnv->GetObjectField(me, fieldID)); + JNIExceptionCheck(); + appName = std::tstring(javaAppName.str()); + } + return appName.c_str(); +#else +#error Unexpected platform +#endif +} + +// Gets application filepath +const TCHAR * CRunAppMultiPlat::get_appFileName() +{ +#ifdef _WIN32 + // TODO: Is this ANSI or Unicode? + return appFileName; +#elif defined(__ANDROID__) || defined(__APPLE__) + LOGV("Reading CRunAppMultiPlat::appFileName variable, not available in non-Windows\n"); + return ""; +#else +#error Unexpected platform +#endif +} +// Gets editor filepath +const TCHAR * CRunAppMultiPlat::get_editorFileName() +{ +#ifdef _WIN32 + // TODO: Is this ANSI or Unicode? + return editorFileName; +#elif defined(__APPLE__) + // NSString to C++ string + return [((CRunApp*)this)->appEditorPathname UTF8String]; +#elif defined(__ANDROID__) + // available in chunk CHUNK_APPEDITORFILENAME 0x222E, but high effort + LOGV("Reading CRunAppMultiPlat::editorFileName variable, not available in Android\n"); + return ""; +#else +#error Unexpected platform #endif } +// Gets original MFA filepath +const TCHAR * CRunAppMultiPlat::get_targetFileName() +{ +#ifdef _WIN32 + // TODO: Is this ANSI or Unicode? + return targetFileName; +#elif defined(__APPLE__) + // NSString to C++ string + return [((CRunApp*)this)->appTargetPathname UTF8String]; +#elif defined(__ANDROID__) + // available in chunk CHUNK_APPTARGETFILENAME 0x222F, but high effort + LOGV("Reading CRunAppMultiPlat::targetFileName variable, not available in Android\n"); + return ""; +#else +#error Unexpected platform +#endif +} + + // Static definition int Edif::Runtime::actionLoopIncrement = 0; @@ -1581,11 +1729,10 @@ void Edif::Runtime::AttachJVMAccessForThisThread(const char* threadName, bool as pthread_setname_np(pthread_self(), threadName); - JavaVMAttachArgs args = { - .name = threadName, - .group = NULL, - .version = JNI_VERSION_1_6 - }; + JavaVMAttachArgs args = {}; + args.name = threadName; + args.group = NULL; + args.version = JNI_VERSION_1_6; // Daemon means the JVM won't keep the app running if this thread is still alive. // Do you want main thread exiting to choose whether the app is running or not? jint error; @@ -1894,7 +2041,7 @@ ProjectFunc void setRunObjectTextColor(JNIEnv*, jobject, jlong ext, int rgb) { // Edit this to monitor specific jobject/jclass references. End with null. -const char * globalToMonitor[] = { NULL }; +const char * const globalToMonitor[] = { NULL }; // Gets the RH2 event count, used in object selection int RunHeader::GetRH2EventCount() @@ -3091,18 +3238,12 @@ AltVals::AltVals(RunObject * ro) : ro(ro) } } -int CRunAppMultiPlat::get_nCurrentFrame() +CRunFrameMultiPlat::CRunFrameMultiPlat(jobject me, Edif::Runtime* runtime) : + me(me, "CRunFrame"), meClass(threadEnv->GetObjectClass(me), "CRunFrame class"), runtime(runtime) { - LOGV(_T("Running %s().\n"), _T(__FUNCTION__)); - if (!nCurrentFrame.has_value()) - { - static jfieldID fieldID = threadEnv->GetFieldID(meClass, "currentFrame", "I"); - JNIExceptionCheck(); - nCurrentFrame = threadEnv->GetIntField(me, fieldID); - JNIExceptionCheck(); - } - return nCurrentFrame.value(); + } + CRunAppMultiPlat::CRunAppMultiPlat(jobject me, Edif::Runtime* runtime) : me(me, "CRunApp"), meClass(threadEnv->GetObjectClass(me), "CRunApp class"), runtime(runtime) { @@ -3800,7 +3941,7 @@ EventGroupMP::EventGroupMP(jobject me, Edif::Runtime * runtime) : } } -#else // iOS +#elif defined(__APPLE__) #include "MMF2Lib/CRunExtension.h" #include "MMF2Lib/CRun.h" #include "MMF2Lib/CObject.h" @@ -4384,6 +4525,10 @@ std::uint16_t EventGroupMP::get_evgIdentifier() const { std::uint16_t EventGroupMP::get_evgInhibit() const { return *(std::uint16_t*)&((tagEVG*)this)->evgInhibit; } +EventGroupFlags EventGroupMP::get_evgFlags() const { + return *(EventGroupFlags*)&((tagEVG*)this)->evgFlags; +} + event2* EventGroupMP::GetCAByIndex(size_t index) { @@ -4398,6 +4543,8 @@ event2* EventGroupMP::GetCAByIndex(size_t index) return ret; } -#endif // APPLE +#else // not APPLE + #error Unexpected platform +#endif // not APPLE #endif // Apple or Android diff --git a/DarkEdif/Lib/Shared/Edif.cpp b/DarkEdif/Lib/Shared/Edif.cpp index 6e01dfa8..9f9fca8b 100644 --- a/DarkEdif/Lib/Shared/Edif.cpp +++ b/DarkEdif/Lib/Shared/Edif.cpp @@ -37,7 +37,7 @@ bool Edif::IS_COMPATIBLE(mv * v) { // mV is not valid at runtime; so someone's trying to use a Runtime MFX as Editor, // which won't work anyway because Runtime MFX lacks A/C/E menus and such. - + // No GetVersion function provided, abort if (!v->GetVersion) return false; @@ -327,7 +327,7 @@ int Edif::Init(mv * mV, bool fusionStartupScreen) { DarkEdif::Internal_WindowHandle = mV->HMainWin; DarkEdif::IsFusion25 = ((mV->GetVersion() & MMFVERSION_MASK) == CFVERSION_25); - + // 2.0 uses floats for angles if it's a Direct3D display, Software or DirectDraw uses int // Fusion 2.5 always uses floats, even in Software, and doesn't use DirectDraw at all DarkEdif::IsHWAFloatAngles = DarkEdif::IsFusion25 || mvIsHWAVersion(mV) != FALSE; @@ -371,7 +371,7 @@ int Edif::Init(mv * mV, bool fusionStartupScreen) = (decltype(pIsWow64Process2))GetProcAddress(kernDll, "IsWow64Process2"); BOOL (WINAPI * pIsWow64Process)(HANDLE hProcess, _Out_ PBOOL Wow64Process) = (decltype(pIsWow64Process))GetProcAddress(kernDll, "IsWow64Process"); - + // If this Win10+ func is defined, use it to check if emulation is active // This is the way to distinguish Windows ARM64. if (pIsWow64Process2) @@ -379,7 +379,7 @@ int Edif::Init(mv * mV, bool fusionStartupScreen) USHORT procMachine, nativeMachine; if (!pIsWow64Process2(curProc, &procMachine, &nativeMachine)) return DarkEdif::MsgBox::Error(_T("DarkEdif CPU detection error"), _T("Couldn't detect CPU arch: IsWow64Process2() error %u."), GetLastError()), -1; - + // If unknown process machine, it matches native machine, so we're not under emulation. if (procMachine == IMAGE_FILE_MACHINE_UNKNOWN) procMachine = nativeMachine; @@ -529,11 +529,12 @@ int Edif::Init(mv * mV, bool fusionStartupScreen) #endif // Non-Unicode ext used in Unicode-compatible runtime + // This is dangerous if reading Fusion internals, as strings are incorrect type #if !defined(_UNICODE) && !defined(ALLOW_ANSI_EXT_IN_UNICODE_RUNTIME) if (mvIsUnicodeVersion(mV)) { - DarkEdif::MsgBox::Error(_T("Not using Unicode"), _T("You are using a non-Unicode extension when the Fusion runtime and ") - PROJECT_TARGET_NAME " extension is capable of Unicode.\nEnsure you have extracted all the " PROJECT_TARGET_NAME " extension files."); + return DarkEdif::MsgBox::Error(_T("Not using Unicode"), _T("You are using a non-Unicode extension when the Fusion runtime and ") + PROJECT_TARGET_NAME " extension is capable of Unicode.\nEnsure you have extracted all the " PROJECT_TARGET_NAME " extension files."), -1; } #endif @@ -1310,7 +1311,7 @@ jmethodID ConditionOrActionManager_Android::getActOrCondParamInt, ConditionOrActionManager_Android::getCndParamString, ConditionOrActionManager_Android::getCndParamFloat, ConditionOrActionManager_Android::getCndParamObject, ConditionOrActionManager_Android::setCndRetInt, ConditionOrActionManager_Android::setCndRetFloat, ConditionOrActionManager_Android::setCndRetString; jfieldID ConditionOrActionManager_Android::getRH; -#else +#elif defined(__APPLE__) extern "C" { @@ -1400,6 +1401,8 @@ struct ConditionOrActionManager_iOS : ACEParamReader } }; } // namespace FusionInternals +#else + #error Unexpected platform #endif #ifdef _WIN32 @@ -1415,12 +1418,14 @@ ProjectFunc jlong conditionJump(JNIEnv *, jobject, jlong extPtr, int ID, CCndExt ConditionOrActionManager_Android params(true, ext, (jobject)cndExt); global lastCEvent = ext->Runtime.curCEvent.swap_out(); // prevent subfunctions causing this variable to be incorrect ext->Runtime.curCEvent = global((jobject)cndExt, "Current Cnd ext"); -#else +#elif defined(__APPLE__) ProjectFunc long PROJ_FUNC_GEN(PROJECT_TARGET_NAME_UNDERSCORES_RAW, _conditionJump(void * cppExtPtr, int ID, void * cndExt)) { Extension* const ext = (Extension*)cppExtPtr; ConditionOrActionManager_iOS params(true, ext, cndExt); ext->Runtime.curCEvent = cndExt; +#else + #error Unexpected platform #endif LOGV(PROJECT_NAME _T(" Condition ID %i start.\n"), ID); @@ -1476,7 +1481,7 @@ ProjectFunc void actionJump(JNIEnv *, jobject, jlong extPtr, jint ID, CActExtens const jobject lastAct = ext->Runtime.curRH4ActBasedOnCEventOnly; ext->Runtime.curRH4ActBasedOnCEventOnly = ext->Runtime.curCEvent.ref; #define actreturn /* void */ -#else +#elif defined(__APPLE__) ProjectFunc void PROJ_FUNC_GEN(PROJECT_TARGET_NAME_UNDERSCORES_RAW, _actionJump(void * cppExtPtr, int ID, void * act)) { Extension* ext = (Extension*)cppExtPtr; @@ -1484,6 +1489,8 @@ ProjectFunc void PROJ_FUNC_GEN(PROJECT_TARGET_NAME_UNDERSCORES_RAW, _actionJump( auto lastCEvent = ext->Runtime.curCEvent; ext->Runtime.curCEvent = act; #define actreturn /* void */ +#else + #error Unexpected platform #endif LOGV(PROJECT_NAME _T(" Action ID %i start.\n"), ID); @@ -1669,7 +1676,7 @@ struct ExpressionManager_Windows : ACEParamReader { } }; -#else +#elif defined(__APPLE__) // segregate to prevent two iOS exts conflicting inline namespace FusionInternals { struct ExpressionManager_iOS : ACEParamReader { @@ -1728,6 +1735,8 @@ struct ExpressionManager_iOS : ACEParamReader { } }; } // namespace FusionInternals +#else + #error Unexpected platform #endif #ifdef _WIN32 @@ -1747,11 +1756,13 @@ ProjectFunc void expressionJump(JNIEnv *, jobject, jlong extPtr, jint ID, CNativ // whereas an expresssion is a sub-variable of a CEvent. //if (ext->Runtime.curCEvent.invalid()) // ext->Runtime.curCEvent = global((jobject)expU, "Current Exp ext"); -#else +#elif defined(__APPLE__) ProjectFunc void PROJ_FUNC_GEN(PROJECT_TARGET_NAME_UNDERSCORES_RAW, _expressionJump(void * cppExtPtr, int ID)) { Extension* ext = (Extension*)cppExtPtr; ExpressionManager_iOS params(ext); +#else + #error Unexpected platform #endif if (Edif::SDK->ExpressionFunctions.size() < (unsigned int)ID) @@ -1995,7 +2006,7 @@ int Edif::GetDependency (char *& Buffer, size_t &Size, const TCHAR * FileExtensi Buffer = (char *)(void *) darkExtJSON; Size = darkExtJSONSize; return DependencyWasResource; -#else +#elif defined(__APPLE__) if (_tcsicmp(FileExtension, _T("json"))) return DependencyNotFound; @@ -2032,6 +2043,8 @@ int Edif::GetDependency (char *& Buffer, size_t &Size, const TCHAR * FileExtensi AAssetDir_close(assetDir); return DependencyWasFile; #endif // File reading +#else + #error Unexpected platform #endif // _WIN32 } @@ -2206,13 +2219,13 @@ char* Edif::ConvertAndCopyString(char* str, const std::string_view & utf8String, #endif // _UNICODE -#if defined(_DEBUG) - - Edif::recursive_mutex::recursive_mutex() { +#if defined(_DEBUG) this->log << "New recursive mutex.\n"sv; +#endif } +#if defined(_DEBUG) Edif::recursive_mutex::~recursive_mutex() { this->log << "Recursive mutex dying.\n"sv; @@ -2317,9 +2330,6 @@ void Edif::recursive_mutex::unlock(edif_lock_debugParams) #else // Not debug -Edif::recursive_mutex::recursive_mutex() -{ -} Edif::recursive_mutex::~recursive_mutex() { } diff --git a/DarkEdif/Lib/Shared/SurfaceMultiPlat.cpp b/DarkEdif/Lib/Shared/SurfaceMultiPlat.cpp index 35c8af79..0353d36b 100644 --- a/DarkEdif/Lib/Shared/SurfaceMultiPlat.cpp +++ b/DarkEdif/Lib/Shared/SurfaceMultiPlat.cpp @@ -37,7 +37,7 @@ int hotSpotX, int hotspotY, int x, int y, int w, int h, int shaderIndex, int inkEffect, int inkEffectParam); - #else // apple + #elif defined(__APPLE__) #ifndef __INTELLISENSE__ #import "MMF2Lib/CBitmap.h" #import "MMF2Lib/CImage.h" @@ -53,7 +53,9 @@ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunreachable-code" #endif - #endif // iOS/Mac + #else + #error Unexpected platform + #endif #endif // not Windows DarkEdif::Rect::Rect(const std::int32_t right, const std::int32_t bottom) : @@ -1078,7 +1080,7 @@ DarkEdif::Surface::Surface(RunHeader * rhPtr, cSurface* surf, bool isFrameSurfac else LOGI(_T("%sCreated surface, describing as: \"%s\".\n"), debugID, Describe().c_str()); } -extern "C" FusionAPIImport void* FusionAPI ModifSpriteEffect(void* ptrWin, Sprite * ptSpr, DWORD effect, LPARAM effectParam); +extern "C" FusionAPIImport void* FusionAPI ModifSpriteEffect(void* ptrWin, CSprite * ptSpr, DWORD effect, LPARAM effectParam) EXDEF; #endif std::size_t DarkEdif::Surface::Internal_CreateMask(void* mask, const std::uint32_t flags) { @@ -1086,7 +1088,7 @@ std::size_t DarkEdif::Surface::Internal_CreateMask(void* mask, const std::uint32 return surf->CreateMask((sMask *)mask, flags); #else LOGF(_T("%sCannot create mask; not implemented on this platform.\n"), debugID); - return SIZE_T_MAX; + return SIZE_MAX; #endif } @@ -1718,7 +1720,7 @@ DarkEdif::Surface::Surface(RunHeader* const rhPtr, bool needBitmapFuncs, bool ne format = PixelFormat::ABGR; hasGeometryCapacity = needBitmapFuncs; hasTextCapacity = needTextFuncs; -#else // apple +#elif defined(__APPLE__) //img = [CImage alloc]; //[img initWithWidth: (int)width andHeight : (int)height] ; @@ -1739,6 +1741,8 @@ DarkEdif::Surface::Surface(RunHeader* const rhPtr, bool needBitmapFuncs, bool ne format = PixelFormat::ABGR; else format = PixelFormat::BGR; +#else + #error Unexpected platform #endif LOGI(_T("%sCreated a surface, describing as \"%s\".\n"), debugID, Describe().c_str()); @@ -1854,8 +1858,10 @@ std::tstring DarkEdif::Surface::Describe() const { result << _T("cSurface 0x"sv) << (void*)surf; #elif defined(__ANDROID__) result << _T("Java BMP ref 0x"sv) << (void *)textSurface.ref; -#else // apple +#elif defined(__APPLE__) result << _T("CBitmap 0x"sv) << (void*)bmp; // << _T(", CImage 0x") << (void*)img; +#else + #error Unexpected platform #endif result << _T(". Image ("sv) << GetSize() << _T("), "sv) << std::dec << sizeBytes << _T(" bytes, "sv); @@ -1878,12 +1884,14 @@ std::tstring DarkEdif::Surface::Describe() const { std::size_t DarkEdif::Surface::GetWidth() const { #ifdef _WIN32 return (std::size_t)surf->GetWidth(); -#elif defined (__ANDROID__) +#elif defined(__ANDROID__) const jint width = threadEnv->CallIntMethod(bmp, bitmapGetWidthMethod); JNIExceptionCheck(); return width; -#else // apple +#elif defined(__APPLE__) return bmp->width; +#else + #error Unexpected platform #endif } std::size_t DarkEdif::Surface::GetHeight() const { @@ -1893,8 +1901,10 @@ std::size_t DarkEdif::Surface::GetHeight() const { const jint height = threadEnv->CallIntMethod(bmp, bitmapGetHeightMethod); JNIExceptionCheck(); return height; -#else // apple +#elif defined(__APPLE__) return bmp->height; +#else + #error Unexpected platform #endif } std::size_t DarkEdif::Surface::GetDepth() const { @@ -2035,9 +2045,11 @@ DarkEdif::Surface::~Surface() surf = nullptr; #elif defined(__ANDROID__) // Should auto-free the global refs and delete the object by GC -#else +#elif defined(__APPLE__) [bmp release]; bmp = nullptr; +#else + #error Unexpected platform #endif } bool DarkEdif::Surface::CopySection(Rect srcRect, Surface& dest, Rect destRect, @@ -2301,9 +2313,11 @@ bool DarkEdif::Surface::FillImageWith(const SurfaceFill& sf) // Overwrites alpha as well threadEnv->CallVoidMethod(bmp, bitmapEraseMethod, sf.solid.color); JNIExceptionCheck(); -#else // apple +#elif defined(__APPLE__) // TODO: Alpha? [bmp fillWithColor: sf.solid.color]; +#else + #error Unexpected platform #endif WasAltered(); return true; diff --git a/DarkEdif/Lib/Windows/Edif.Edittime.cpp b/DarkEdif/Lib/Windows/Edif.Edittime.cpp index 2c8b79a4..32149a6c 100644 --- a/DarkEdif/Lib/Windows/Edif.Edittime.cpp +++ b/DarkEdif/Lib/Windows/Edif.Edittime.cpp @@ -420,4 +420,34 @@ void FusionAPI PrepareFlexBuild(mv * pMV, EDITDATA * edPtr, const wchar_t * wTem } #endif // DARKEXT_JSON_FILE_EXTERNAL +// Return true if your extension uses filters. Called only in editor builds, during Windows EXE building. +BOOL FusionAPI GetFilters(mv* mV, EDITDATA* edPtr, DWORD dwFlags, LPVOID pReserved) +{ +#pragma DllExportHint + // These are taken from defines in ccx.h + static constexpr DWORD GETFILTERS_IMAGES = 1, GETFILTERS_SOUNDS = 2; + + const json_value& useImgFiltersJSON = Edif::SDK->json["UsesImageFilters"sv], + useSoundFiltersJSON = Edif::SDK->json["UsesSoundFilters"sv]; + + // Default to image filters supported, as DarkEdif::Surface expects it, + // but this can be overridden with UsesImageFilters false. + // Non-display extensions may use Surface, so we can't use the DE display type. + int jsonFlags = GETFILTERS_IMAGES; + if (useImgFiltersJSON.type == json_boolean) + jsonFlags = (bool)useImgFiltersJSON ? GETFILTERS_IMAGES : 0; + else if (useImgFiltersJSON.type != json_none) + DarkEdif::MsgBox::Error(_T("GetFilters error"), _T("UsesImageFilters JSON value was set to an invalid type.")); + + // Default to sound filters not requested + if (useSoundFiltersJSON.type == json_boolean) + jsonFlags |= (bool)useSoundFiltersJSON ? GETFILTERS_SOUNDS : 0; + else if (useSoundFiltersJSON.type != json_none) + DarkEdif::MsgBox::Error(_T("GetFilters error"), _T("UsesSoundFilters JSON value was set to an invalid type.")); + + return (dwFlags & jsonFlags) != 0; +} + + + #endif // EditorBuild diff --git a/DarkEdif/Phi Object/DarkExt.json b/DarkEdif/Phi Object/DarkExt.json index ae8dc85e..2ee39dbf 100644 --- a/DarkEdif/Phi Object/DarkExt.json +++ b/DarkEdif/Phi Object/DarkExt.json @@ -80,7 +80,9 @@ [ 25, "Get app root folder" ] ], [ "CPU", - [ 20, "Get CPU temperature (C)", true ] + [ 20, "Get CPU temperature (C)", true ], + [ 27, "Get CPU processor count", true ], + [ 28, "Get CPU core count", true ] ], [ "Discrete ACL loop entry", [ 21, "Account name" ], @@ -386,6 +388,14 @@ { "Title": "NetworkType$(", "Returns": "Text" + }, + { + "Title": "GetCPUProcessorCount(", + "Returns": "Integer" + }, + { + "Title": "GetCPUCoreCount(", + "Returns": "Integer" } ] } diff --git a/DarkEdif/Phi Object/Extension.cpp b/DarkEdif/Phi Object/Extension.cpp index 65f71f79..23fdf1ef 100644 --- a/DarkEdif/Phi Object/Extension.cpp +++ b/DarkEdif/Phi Object/Extension.cpp @@ -3,6 +3,7 @@ #ifdef __ANDROID__ #include #endif +#include /// /// EXTENSION CONSTRUCTOR/DESTRUCTOR /// @@ -73,16 +74,134 @@ Extension::Extension(const EDITDATA* const edPtr, void* const objCExtPtr, const LinkExpression(25, GetAppRoot); LinkExpression(26, GetNetworkType); +#ifdef _WIN32 +#if WINVER < _WIN32_WINNT_WIN7 +#if WINVER < _WIN32_WINNT_WIN8 + _Struct_size_bytes_(Size) struct SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX { + LOGICAL_PROCESSOR_RELATIONSHIP Relationship; + DWORD Size; + union { + PROCESSOR_RELATIONSHIP Processor; + NUMA_NODE_RELATIONSHIP NumaNode; + CACHE_RELATIONSHIP Cache; + GROUP_RELATIONSHIP Group; + SHARED_COMPUTE_UNIT_RELATIONSHIP SharedComputeUnit; + } DUMMYUNIONNAME; + }; + typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, * PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX; +#endif + DWORD slpiSizeExp, slpiSizeAct; + if (DarkEdif::Windows::Has7Plus()) + { + std::vector slpiEx; + BOOL(WINAPI* const GLPIExFunc)(PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, PDWORD) = + (decltype(GLPIExFunc))GetProcAddress(GetModuleHandle(_T("kernel32")), "GetLogicalProcessorInformationEx"); + assert(GLPIExFunc); + while (true) + { + slpiEx.push_back({}); + slpiSizeAct = slpiSizeExp = slpiEx.size() * sizeof(slpiEx[0]); + if (GLPIExFunc(&slpiEx[0], &slpiSizeAct) && slpiSizeAct <= slpiSizeExp) + break; - /* - This is where you'd do anything you'd do in CreateRunObject in the original SDK - - It's the only place you'll get access to edPtr at runtime, so you should transfer - anything from edPtr to the extension class here. + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) + { + DarkEdif::MsgBox::Error(_T("!!"), _T("Error code: %u."), GetLastError()); + break; + } + if (slpiSizeAct < slpiSizeExp && !(slpiSizeAct % sizeof(slpi[0]))) + slpi.resize((slpiSizeAct / sizeof(slpi[0])) - 1); + } + // extra data? + if (slpiSizeAct % sizeof(slpiEx[0])) + { + DarkEdif::MsgBox::Error(_T("!!"), _T("Extra data: %zu (%zu bytes) is actually %zu, has %zu extra bytes."), + slpiEx.size(), slpiSizeExp, + slpiSizeAct, slpiSizeAct % sizeof(slpiEx[0])); + slpiEx.erase(slpiEx.cend()); + } + } + else + { + std::vector slpi; + BOOL(WINAPI* const GLPIFunc)(PSYSTEM_LOGICAL_PROCESSOR_INFORMATION, PDWORD) = + (decltype(GLPIFunc))GetProcAddress(GetModuleHandle(_T("kernel32")), "GetLogicalProcessorInformation"); + assert(GLPIFunc); + while (true) + { + slpi.push_back({}); + slpiSizeAct = slpiSizeExp = slpi.size() * sizeof(slpi[0]); + if (GLPIFunc(&slpi[0], &slpiSizeAct) && slpiSizeAct <= slpiSizeExp) + break; + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) + { + DarkEdif::MsgBox::Error(_T("!!"), _T("Error code: %u."), GetLastError()); + break; + } + if (slpiSizeAct < slpiSizeExp && !(slpiSizeAct % sizeof(slpi[0]))) + slpi.resize((slpiSizeAct / sizeof(slpi[0])) - 1); + } + // extra data? + if (slpiSizeAct % sizeof(slpi[0])) + { + DarkEdif::MsgBox::Error(_T("!!"), _T("Extra data: %zu (%zu bytes) is actually %zu, has %zu extra bytes."), + slpi.size(), slpiSizeExp, + slpiSizeAct, slpiSizeAct % sizeof(slpi[0])); + slpi.erase(slpi.cend()); + } + struct CPUCore { + int baseFrequencyMHz; + int turboFrequencyMHz; + // + int curFrequencyMHz; + int maxFrequencyMHz; + }; + struct CPUPackage { + bool isEfficiency = false; + int numCores = 0; + int numLogicalProcessors = 0; + std::vector coreStockMHz; + int (*mHZAtCore)(int); + int mHZTotal(int); + }; + std::vector packages; + std::optional cur; + + for (const auto& i : slpi) + { + if (i.Relationship == RelationProcessorCore) + { + ++cur->numCores; + cur->numLogicalProcessors += __builtin_popcount(i.ProcessorMask); + CallNtPowerInformation() + int cpuInfo[4]; + __cpuid(cpuInfo, 0x16); + CallNtPowerInformation() + cur->coreStockMHz = i. + } + else if (i.Relationship == RelationProcessorPackage) + { + if (cur.has_value()) + packages.emplace_back(CPUPackage()); + cur = CPUPackage(); + } + } + } + /* + Windows: Use GetLogicalProcessorInformationEx() and group cores by EfficiencyClass to get P/E. + Win11+ has EfficiencyClass; lower doesn't. + Current frequency sometimes available with __cpuid(int[4], 0x16), EAX = Base MHz, EBX = Max MHz, ECX = Bus MHz + CallNtPowerInformation(ProcessorInformation or ProcessorPerformanceInformation, xx) + requires #include #pragma comment(lib, "PowrProf.lib") + + Android/Linux: Read /sys/devices/system/cpu/cpu##/cpufreq/cpuinfo_max_freq (or cpu_capacity if available) + and group cores with the same capacity/frequency into clusters. + macOS/iOS: Prefer the undocumented hw.perflevel*.physicalcpu and hw.perflevel*.logicalcpu sysctls when available, + falling back to just total physical / logical core counts if they aren't present. */ -#ifdef __ANDROID__ +#elif defined(__ANDROID__) do { androidSensorManager = ASensorManager_getInstance(); if (androidSensorManager == NULL) { diff --git a/DarkEdif/Phi Object/Extension.hpp b/DarkEdif/Phi Object/Extension.hpp index 5e7b5016..6d019acf 100644 --- a/DarkEdif/Phi Object/Extension.hpp +++ b/DarkEdif/Phi Object/Extension.hpp @@ -57,6 +57,7 @@ class Extension final std::vector errorList; Edif::recursive_mutex errorListLock; std::vector frameNames; + std::size_t cpuProcessorCount, cpuCoreCount = 0; void GetFrameNames(); diff --git a/cpp.hint b/cpp.hint index 7852295a..edbbc83f 100644 --- a/cpp.hint +++ b/cpp.hint @@ -17,6 +17,17 @@ #define lw_downgrade_to(x) downgrade(lw_rwlock_debugParamDefs, x) //#endif #define z_const -#define FusionAPIImport __declspec(dllimport) -#define FusionAPI __stdcall +#define FusionAPIImport /* no op */ +#define FusionAPI /* no op */ #define PrintFHintAfter(formatParamIndex, dotsParamIndex) /* no op */ +#define EXDEF { __assume(0); } +#define ProjectFunc /* no op */ +#define DLLExport32 /* no op */ +#define npWin void * +#define Fusion64APISwitch /* no op */ +#define FusionANSIWarning /* no op */ +#define CRunApp CRunAppMultiPlat +#define CRunFrame CRunFrameMultiPlat +#define NO_DEFAULT_CTORS_OR_DTORS(x) /* no op */ +#define NO_DEFAULT_CTORS(x) /* no op */ +#define DarkEdifInternalAccessProtected protected

|=UP6xmCpwNAh9vKO=(rYHC2ZGzQX%11)q%RqjN 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 Date: Tue, 30 Jun 2026 13:58:45 -0700 Subject: [PATCH 04/17] Revert Edittime.cpp change Removed the NOPROPS reference I previously added due to me having misunderstood what it's actually used for. --- DarkEdif/DarkEdif Template/Edittime.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/DarkEdif/DarkEdif Template/Edittime.cpp b/DarkEdif/DarkEdif Template/Edittime.cpp index 0a322989..dbb92370 100644 --- a/DarkEdif/DarkEdif Template/Edittime.cpp +++ b/DarkEdif/DarkEdif Template/Edittime.cpp @@ -157,8 +157,6 @@ BOOL FusionAPI EditObject(mv *mV, ObjInfo * oiPtr, LevelObject * loPtr, EDITDATA // PROPERTIES // ============================================================================ -#ifndef NOPROPS - // Inserts properties into the properties of the object. BOOL FusionAPI GetProperties(mv * mV, EDITDATA * edPtr, BOOL bMasterItem) { @@ -233,7 +231,6 @@ void FusionAPI ReleasePropCreateParam(mv *mV, EDITDATA *edPtr, unsigned int Prop #pragma DllExportHint return DarkEdif::DLL::DLL_ReleasePropCreateParam(mV, edPtr, PropID, lParam); } -#endif // ============================================================================ // ROUTINES USED WHEN BUILDING From bfbe453ca83d09ec18b820d127ddf784f8179bcd Mon Sep 17 00:00:00 2001 From: Phi Date: Mon, 6 Jul 2026 07:00:22 +0100 Subject: [PATCH 05/17] DarkEdif: ANSI load is now forbidden + add compile warning If ANSI ext is loaded by Unicode runtime, the Fusion internal strings are in Unicode, not ANSI. This is a subtle error as the compiler will define the TCHAR as char, but the contents is wchar_t. --- DarkEdif/Inc/Windows/WindowsDefines.hpp | 16 ++++++++++++++++ DarkEdif/Lib/Shared/Edif.cpp | 5 +++-- cpp.hint | 1 + 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/DarkEdif/Inc/Windows/WindowsDefines.hpp b/DarkEdif/Inc/Windows/WindowsDefines.hpp index f5027c1e..39b4c005 100644 --- a/DarkEdif/Inc/Windows/WindowsDefines.hpp +++ b/DarkEdif/Inc/Windows/WindowsDefines.hpp @@ -24,6 +24,22 @@ #define Fusion64APISwitch(repl) /* no op */ #endif +// Fusion runtime doesn't host two variants of its internals for ANSI and Unicode extensions; +// a string pointer is based on what runtime is. Unicode runtime = Unicode strings. +// If you have an ANSI extension loaded by Unicode runtime, it won't correctly read the Wide +// Fusion internal strings, and the compiler will not suggest why. +// Most of the time this will result in a single character being read. +// +// You can test for Unicode runtime using mvIsUnicodeVersion(), and LOSSILY convert with +// DarkEdif::WideToANSI(), but it will not be able to convert all characters. +// DarkEdif::WideToUTF8() is better, but most char-functions on Windows are ANSI, not UTF8. +// If you don't understand this error: build Unicode or don't read Fusion internals. +#if defined(DARKEDIF_INTERNAL_INCLUDE) || defined(_UNICODE) || (defined(ALLOW_ANSI_EXT_IN_UNICODE_RUNTIME) && !defined(DARKEDIF_SUPPRESS_ANSI_INTERNALS_WARNING)) + #define FusionANSIWarning /* no op */ +#else // non-Unicode and warning alive + #define FusionANSIWarning [[deprecated("This string is not ANSI. It may be wide if the Fusion runtime is Unicode (CF2.5 or MMF2 + Unicode add-on).")]] +#endif + // FusionAPI; incoming or outgoing to Fusion runtime. Uses __stdcall convention. #define FusionAPI __stdcall diff --git a/DarkEdif/Lib/Shared/Edif.cpp b/DarkEdif/Lib/Shared/Edif.cpp index c6285f99..64a491a1 100644 --- a/DarkEdif/Lib/Shared/Edif.cpp +++ b/DarkEdif/Lib/Shared/Edif.cpp @@ -529,11 +529,12 @@ int Edif::Init(mv * mV, bool fusionStartupScreen) #endif // Non-Unicode ext used in Unicode-compatible runtime + // This is dangerous if reading Fusion internals, as strings are incorrect type #if !defined(_UNICODE) && !defined(ALLOW_ANSI_EXT_IN_UNICODE_RUNTIME) if (mvIsUnicodeVersion(mV)) { - DarkEdif::MsgBox::Error(_T("Not using Unicode"), _T("You are using a non-Unicode extension when the Fusion runtime and ") - PROJECT_TARGET_NAME " extension is capable of Unicode.\nEnsure you have extracted all the " PROJECT_TARGET_NAME " extension files."); + return DarkEdif::MsgBox::Error(_T("Not using Unicode"), _T("You are using a non-Unicode extension when the Fusion runtime and ") + PROJECT_TARGET_NAME " extension is capable of Unicode.\nEnsure you have extracted all the " PROJECT_TARGET_NAME " extension files."), -1; } #endif diff --git a/cpp.hint b/cpp.hint index 96569c62..7486fe2a 100644 --- a/cpp.hint +++ b/cpp.hint @@ -25,3 +25,4 @@ #define DLLExport32 /* no op */ #define npWin void * #define Fusion64APISwitch /* no op */ +#define FusionANSIWarning /* no op */ From e9ecf33c9140430a1a796d6c4f8a67083488ac4d Mon Sep 17 00:00:00 2001 From: Phi Date: Mon, 6 Jul 2026 10:00:21 +0100 Subject: [PATCH 06/17] DarkEdif: More RunApp/RunFrame wrappers This is a breaking change for iOS, as CRunFrame isn't linked in default iOS projects. To fix, add CRunFrame.h into your iOS project under Global for all extensions folder. Currently iOS only copies the headers that the VS project references, which is somewhat messy. Later I'll change the DE PreBuildTool to do what it does for Mac: copying the entire Inc folder. This commit adds: * CRunApp nCurrentFrame, Frame, name, appFileName, editorFileName, targetFileName * CRunFrame --- .../DarkEdif Template.iOS.vcxproj | 1 + .../DarkEdif Template.iOS.vcxproj.filters | 3 + .../Inc/Android/MMFAndroidMasterHeader.hpp | 20 ++- DarkEdif/Inc/Mac/MMFMacMasterHeader.hpp | 6 +- .../Inc/Windows/MMFWindowsMasterHeader.hpp | 17 ++- DarkEdif/Inc/iOS/MMFiOSMasterHeader.hpp | 6 +- DarkEdif/Lib/Shared/Edif.Runtime.cpp | 137 ++++++++++++++++++ 7 files changed, 182 insertions(+), 8 deletions(-) diff --git a/DarkEdif/DarkEdif Template/DarkEdif Template.iOS.vcxproj b/DarkEdif/DarkEdif Template/DarkEdif Template.iOS.vcxproj index efd4ac4c..aa08cc1c 100644 --- a/DarkEdif/DarkEdif Template/DarkEdif Template.iOS.vcxproj +++ b/DarkEdif/DarkEdif Template/DarkEdif Template.iOS.vcxproj @@ -70,6 +70,7 @@ + diff --git a/DarkEdif/DarkEdif Template/DarkEdif Template.iOS.vcxproj.filters b/DarkEdif/DarkEdif Template/DarkEdif Template.iOS.vcxproj.filters index 4798e84c..76b8fc32 100644 --- a/DarkEdif/DarkEdif Template/DarkEdif Template.iOS.vcxproj.filters +++ b/DarkEdif/DarkEdif Template/DarkEdif Template.iOS.vcxproj.filters @@ -123,5 +123,8 @@ Global to all extensions + + Global to all extensions + \ No newline at end of file diff --git a/DarkEdif/Inc/Android/MMFAndroidMasterHeader.hpp b/DarkEdif/Inc/Android/MMFAndroidMasterHeader.hpp index 6810f17b..610ac53e 100644 --- a/DarkEdif/Inc/Android/MMFAndroidMasterHeader.hpp +++ b/DarkEdif/Inc/Android/MMFAndroidMasterHeader.hpp @@ -637,35 +637,45 @@ struct CEventProgram { global meClass; Edif::Runtime* runtime; }; -struct CRunFrame { - NO_DEFAULT_CTORS(CRunFrame); +struct CRunFrameMultiPlat { + NO_DEFAULT_CTORS(CRunFrameMultiPlat); CEventProgram* get_eventProgram(); + const TCHAR * get_name(); + CRunFrameMultiPlat(jobject app, Edif::Runtime* runtime); protected: friend class Edif::Runtime; friend struct RunHeader; + std::string frameName; + + global me; + global meClass; Edif::Runtime* runtime; - jobject me; }; struct CRunAppMultiPlat { NO_DEFAULT_CTORS(CRunAppMultiPlat); int get_nCurrentFrame(); - CRunFrame* get_Frame(); + CRunFrameMultiPlat * get_Frame(); CRunAppMultiPlat * get_ParentApp(); std::size_t GetNumFusionFrames(); + const TCHAR * get_name(); + const TCHAR * get_appFileName(); + const TCHAR * get_editorFileName(); + const TCHAR * get_targetFileName(); CRunAppMultiPlat(jobject app, Edif::Runtime * runtime); protected: friend class Edif::Runtime; friend struct RunHeader; friend DarkEdif::Surface; - std::unique_ptr frame; + std::unique_ptr frame; std::optional nCurrentFrame; std::size_t numTotalFrames = 0; // 0 if unset std::uint16_t currentFrame = 0; // 0 if unset, 1+ if set + std::string appName; // Blank if unset std::unique_ptr parentApp; bool parentAppIsNull = false; global me; diff --git a/DarkEdif/Inc/Mac/MMFMacMasterHeader.hpp b/DarkEdif/Inc/Mac/MMFMacMasterHeader.hpp index 9b603dea..aa1e864f 100644 --- a/DarkEdif/Inc/Mac/MMFMacMasterHeader.hpp +++ b/DarkEdif/Inc/Mac/MMFMacMasterHeader.hpp @@ -230,7 +230,7 @@ inline namespace FusionInternals }; struct CRunFrameMultiPlat { - + const TCHAR * get_name(); }; struct CRunAppMultiPlat { NO_DEFAULT_CTORS(CRunAppMultiPlat); @@ -238,6 +238,10 @@ inline namespace FusionInternals CRunFrameMultiPlat* get_Frame(); CRunAppMultiPlat* get_ParentApp(); std::size_t GetNumFusionFrames(); + const TCHAR * get_name(); + const TCHAR * get_appFileName(); + const TCHAR * get_editorFileName(); + const TCHAR * get_targetFileName(); }; struct RunHeader { diff --git a/DarkEdif/Inc/Windows/MMFWindowsMasterHeader.hpp b/DarkEdif/Inc/Windows/MMFWindowsMasterHeader.hpp index 6f78cd23..cd39d2af 100644 --- a/DarkEdif/Inc/Windows/MMFWindowsMasterHeader.hpp +++ b/DarkEdif/Inc/Windows/MMFWindowsMasterHeader.hpp @@ -5145,8 +5145,23 @@ struct CBinaryFile { struct CRunApp { NO_DEFAULT_CTORS_OR_DTORS(CRunApp); - CRunApp* get_ParentApp(); + // Returns parent app if subapp, or null if not subapp + // Subapps can themselves have subapps, but it is uncommon + _Maybenull_ CRunAppMultiPlat* get_ParentApp(); + // Returns number of Fusion frames std::size_t GetNumFusionFrames(); + // Gets current Fusion frame number (0-based) + int get_nCurrentFrame(); + // Gets frame pointer + CRunFrameMultiPlat * get_Frame(); + // Gets application name + FusionANSIWarning const TCHAR * get_name(); + // Gets application filepath - Windows only! + FusionANSIWarning const TCHAR * get_appFileName(); + // Gets editor filepath - not available in Android + FusionANSIWarning const TCHAR * get_editorFileName(); + // Gets original MFA filepath - not available in Android + FusionANSIWarning const TCHAR * get_targetFileName(); DarkEdifInternalAccessProtected: friend Edif::Runtime; diff --git a/DarkEdif/Inc/iOS/MMFiOSMasterHeader.hpp b/DarkEdif/Inc/iOS/MMFiOSMasterHeader.hpp index f88264f0..c85a3da1 100644 --- a/DarkEdif/Inc/iOS/MMFiOSMasterHeader.hpp +++ b/DarkEdif/Inc/iOS/MMFiOSMasterHeader.hpp @@ -222,7 +222,7 @@ inline namespace FusionInternals }; struct CRunFrameMultiPlat { - + const TCHAR * get_name(); }; struct CRunAppMultiPlat { NO_DEFAULT_CTORS(CRunAppMultiPlat); @@ -230,6 +230,10 @@ inline namespace FusionInternals CRunFrameMultiPlat* get_Frame(); CRunAppMultiPlat* get_ParentApp(); std::size_t GetNumFusionFrames(); + const TCHAR * get_name(); + const TCHAR * get_appFileName(); + const TCHAR * get_editorFileName(); + const TCHAR * get_targetFileName(); }; struct RunHeader { diff --git a/DarkEdif/Lib/Shared/Edif.Runtime.cpp b/DarkEdif/Lib/Shared/Edif.Runtime.cpp index f11b059f..86186243 100644 --- a/DarkEdif/Lib/Shared/Edif.Runtime.cpp +++ b/DarkEdif/Lib/Shared/Edif.Runtime.cpp @@ -1,3 +1,5 @@ +// Suppress warnings for popping up for DE's own internal usage +#define DARKEDIF_INTERNAL_INCLUDE #include "Common.hpp" #include "Edif.hpp" #include "DarkEdif.hpp" @@ -9,6 +11,7 @@ #include "MMF2Lib/CRunApp.h" #include "MMF2Lib/CRCom.h" #include "MMF2Lib/CRSpr.h" +#include "MMF2Lib/CRunFrame.h" #endif struct EdifGlobal @@ -115,6 +118,47 @@ std::vector qualToOi::GetAllOi() { return HalfVector(0); } +const TCHAR * CRunFrameMultiPlat::get_name() +{ +#ifdef _WIN32 + return name; +#elif defined(__APPLE__) + return [((CRunFrame*)this)->frameName UTF8String]; +#elif defined(__ANDROID__) + if (frameName.empty()) + { + const jfieldID fieldID = threadEnv->GetFieldID(meClass, "frameName", "Ljava/lang/String;"); + JNIExceptionCheck(); + JavaAndCString javaFrameName((jstring)threadEnv->GetObjectField(me, fieldID)); + frameName = std::string(javaFrameName.str()); + } + return frameName.c_str(); +#else +#error Unexpected platform +#endif +} + +int CRunAppMultiPlat::get_nCurrentFrame() +{ +#ifdef _WIN32 + return nCurrentFrame; +#elif defined(__APPLE__) + return (std::size_t)((CRunApp*)this)->currentFrame; +#elif defined(__ANDROID__) + LOGV(_T("Running %s().\n"), _T(__FUNCTION__)); + if (!nCurrentFrame.has_value()) + { + static jfieldID fieldID = threadEnv->GetFieldID(meClass, "currentFrame", "I"); + JNIExceptionCheck(); + nCurrentFrame = threadEnv->GetIntField(me, fieldID); + JNIExceptionCheck(); + } + return nCurrentFrame.value(); +#else +#error Unexpected platform +#endif +} + CRunAppMultiPlat* CRunAppMultiPlat::get_ParentApp() { #ifdef _WIN32 return ParentApp; @@ -159,19 +203,104 @@ std::size_t CRunAppMultiPlat::GetNumFusionFrames() { #error Unexpected platform #endif } + +// Gets frame pointer +CRunFrameMultiPlat* CRunAppMultiPlat::get_Frame() +{ #ifdef _WIN32 + return Frame; #elif defined(__APPLE__) + return (CRunFrameMultiPlat *)((CRunApp*)this)->frame; #elif defined(__ANDROID__) + if (!frame) { + const jfieldID fieldID = threadEnv->GetFieldID(meClass, "frame", "LApplication/CRunFrame;"); JNIExceptionCheck(); + const jobject javaCurrentFrame = threadEnv->GetObjectField(me, fieldID); JNIExceptionCheck(); + assert(javaCurrentFrame); // should never be null + frame = std::make_unique(javaCurrentFrame, runtime); } + return frame.get(); #else #error Unexpected platform #endif +} +// Gets application name +const TCHAR * CRunAppMultiPlat::get_name() +{ +#ifdef _WIN32 + // TODO: Is this ANSI or Unicode? + return name; +#elif defined(__APPLE__) + // NSString to C++ string + return [((CRunApp*)this)->appName UTF8String]; +#elif defined(__ANDROID__) + if (appName.empty()) + { + const jfieldID fieldID = threadEnv->GetFieldID(meClass, "appName", "Ljava/lang/String;"); + JNIExceptionCheck(); + JavaAndCString javaAppName((jstring)threadEnv->GetObjectField(me, fieldID)); + JNIExceptionCheck(); + appName = std::tstring(javaAppName.str()); + } + return appName.c_str(); +#else +#error Unexpected platform +#endif +} + +// Gets application filepath +const TCHAR * CRunAppMultiPlat::get_appFileName() +{ +#ifdef _WIN32 + // TODO: Is this ANSI or Unicode? + return appFileName; +#elif defined(__ANDROID__) || defined(__APPLE__) + LOGV("Reading CRunAppMultiPlat::appFileName variable, not available in non-Windows\n"); + return ""; +#else +#error Unexpected platform +#endif +} +// Gets editor filepath +const TCHAR * CRunAppMultiPlat::get_editorFileName() +{ +#ifdef _WIN32 + // TODO: Is this ANSI or Unicode? + return editorFileName; +#elif defined(__APPLE__) + // NSString to C++ string + return [((CRunApp*)this)->appEditorPathname UTF8String]; +#elif defined(__ANDROID__) + // available in chunk CHUNK_APPEDITORFILENAME 0x222E, but high effort + LOGV("Reading CRunAppMultiPlat::editorFileName variable, not available in Android\n"); + return ""; +#else +#error Unexpected platform +#endif } +// Gets original MFA filepath +const TCHAR * CRunAppMultiPlat::get_targetFileName() +{ +#ifdef _WIN32 + // TODO: Is this ANSI or Unicode? + return targetFileName; +#elif defined(__APPLE__) + // NSString to C++ string + return [((CRunApp*)this)->appTargetPathname UTF8String]; +#elif defined(__ANDROID__) + // available in chunk CHUNK_APPTARGETFILENAME 0x222F, but high effort + LOGV("Reading CRunAppMultiPlat::targetFileName variable, not available in Android\n"); + return ""; +#else +#error Unexpected platform +#endif +} + + // Static definition int Edif::Runtime::actionLoopIncrement = 0; @@ -3109,8 +3238,12 @@ AltVals::AltVals(RunObject * ro) : ro(ro) } } +CRunFrameMultiPlat::CRunFrameMultiPlat(jobject me, Edif::Runtime* runtime) : + me(me, "CRunFrame"), meClass(threadEnv->GetObjectClass(me), "CRunFrame class"), runtime(runtime) { + } + CRunAppMultiPlat::CRunAppMultiPlat(jobject me, Edif::Runtime* runtime) : me(me, "CRunApp"), meClass(threadEnv->GetObjectClass(me), "CRunApp class"), runtime(runtime) { @@ -4392,6 +4525,10 @@ std::uint16_t EventGroupMP::get_evgIdentifier() const { std::uint16_t EventGroupMP::get_evgInhibit() const { return *(std::uint16_t*)&((tagEVG*)this)->evgInhibit; } +EventGroupFlags EventGroupMP::get_evgFlags() const { + return *(EventGroupFlags*)&((tagEVG*)this)->evgFlags; +} + event2* EventGroupMP::GetCAByIndex(size_t index) { From 4859a605e67e920bd6f2f43c169d9a5bcc7cb8a2 Mon Sep 17 00:00:00 2001 From: Phi Date: Mon, 6 Jul 2026 10:02:15 +0100 Subject: [PATCH 07/17] DarkEdif: Windows docs improve + ANSI warn MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nothing ever goes wrong when I mess with Windows structs 👍 --- .../Inc/Windows/MMFWindowsMasterHeader.hpp | 325 ++++++++++-------- DarkEdif/Lib/Shared/DarkEdif.cpp | 5 +- cpp.hint | 5 + 3 files changed, 194 insertions(+), 141 deletions(-) diff --git a/DarkEdif/Inc/Windows/MMFWindowsMasterHeader.hpp b/DarkEdif/Inc/Windows/MMFWindowsMasterHeader.hpp index cd39d2af..455d4c95 100644 --- a/DarkEdif/Inc/Windows/MMFWindowsMasterHeader.hpp +++ b/DarkEdif/Inc/Windows/MMFWindowsMasterHeader.hpp @@ -341,7 +341,7 @@ struct CValueMultiPlat { { std::int32_t m_long; double m_double; - TCHAR * m_pString; + FusionANSIWarning TCHAR * m_pString; }; }; @@ -392,7 +392,7 @@ struct LOGFONTV1 { ClipPrecision, Quality, PitchAndFamily; - TCHAR FaceName[32]; + FusionANSIWarning TCHAR FaceName[32]; }; // Flags modifiable by the program @@ -448,7 +448,11 @@ struct OCStrings { NO_DEFAULT_CTORS_OR_DTORS(OCStrings); unsigned short number; - TCHAR str[2]; + // TODO: In OG SDK, this was aligned to have two chars or one wchar_t. + // Not sure what the use of either is, as it should be 4 bytes if it's a pointer, + // and if it's an offset it should be a number, and if this struct is a header, + // the plurality naming and careful 2-byte sizing is counter-intuitive. + FusionANSIWarning TCHAR str[sizeof(wchar_t) / sizeof(TCHAR)]; }; // typedef OCStringsA* LPOCSTRINGS; // typedef OCStringsW* LPOCSTRINGS; @@ -457,7 +461,8 @@ struct OCValueNames { NO_DEFAULT_CTORS_OR_DTORS(OCValueNames); unsigned short number; - char str[2]; + // TODO: OG SDK has this as ANSI, but it may be TCHAR? + char str[2]; }; //typedef OCValueNames* LPOCVALUENAMES; @@ -1146,7 +1151,7 @@ struct ParamSound { // TODO: Entry index in sound bank? or do we need handleTo? short Handle, Flags; - TCHAR name[64]; // Max sound name + FusionANSIWarning TCHAR name[64]; // Max sound name enum SoundFlags { UNINTERRUPTABLE = 0x1, BAD = 0x2, @@ -1185,8 +1190,8 @@ struct ParamShoot { }; struct ParamAnimation { NO_DEFAULT_CTORS_OR_DTORS(ParamAnimation); - short Number; - TCHAR * name; + short Number; + FusionANSIWarning TCHAR * name; }; struct ParamNoP { NO_DEFAULT_CTORS_OR_DTORS(ParamNoP); @@ -1198,8 +1203,7 @@ struct ParamPlayer { }; struct ParamEvery { NO_DEFAULT_CTORS_OR_DTORS(ParamEvery); - long Delay, - Counter; + long Delay, Counter; }; struct ParamKey { NO_DEFAULT_CTORS_OR_DTORS(ParamKey); @@ -1260,8 +1264,10 @@ struct ParamClick { struct ParamProgram { NO_DEFAULT_CTORS_OR_DTORS(ParamProgram); short Flags; // Default flags - TCHAR Path[MAX_PATH], // name of the program - Command[108]; // Command line + // name of the program + FusionANSIWarning TCHAR Path[MAX_PATH]; + // Command line + FusionANSIWarning TCHAR Command[108]; enum Masks { Wait = 0x1, @@ -1270,27 +1276,30 @@ struct ParamProgram { }; struct ParamCondSound { NO_DEFAULT_CTORS_OR_DTORS(ParamCondSound); - unsigned short Number, - Flags, - Loops; - TCHAR * name; + std::uint16_t Number; + std::uint16_t Flags; + std::uint16_t Loops; + FusionANSIWarning TCHAR * name; }; struct ParamEditorComment { NO_DEFAULT_CTORS_OR_DTORS(ParamEditorComment); LOGFONTV1 LogFont; // Font - COLORREF ColourFont, // text color - ColourBack; // Background color + // These may be incorrectly positioned if ANSI ext working with Unicode runtime + COLORREF ColourFont; // text color + COLORREF ColourBack; // Background color short Align; // Alignement flags unsigned short TextId; // text number in the buffer - TCHAR Style[40]; // Style + FusionANSIWarning TCHAR Style[40]; // Style }; struct ParamGroup { NO_DEFAULT_CTORS_OR_DTORS(ParamGroup); short Flags, // Active / Inactive? ID; // Group identifier // May be editor-only, missing in runtime: - TCHAR Title[80], // Title (max 80? chars) - Password[16]; // Protection (max 16? chars) + FusionANSIWarning TCHAR Title[80]; + // If not missing in runtime, ANSI ext + Uni runtime will have this misaligned + FusionANSIWarning TCHAR Password[16]; + // If not missing in runtime, ANSI ext + Uni runtime will have this misaligned unsigned long Checksum; // Checksum enum Masks { INACTIVE = 0x1, @@ -1312,11 +1321,11 @@ struct ParamGroupPointer { }; struct ParamFilename { NO_DEFAULT_CTORS_OR_DTORS(ParamFilename); - TCHAR * FileName; + FusionANSIWarning TCHAR * FileName; }; struct ParamString { NO_DEFAULT_CTORS_OR_DTORS(ParamString); - TCHAR * String; + FusionANSIWarning TCHAR * String; }; struct ParamCmpTime { NO_DEFAULT_CTORS_OR_DTORS(ParamCmpTime); @@ -1372,7 +1381,7 @@ struct Param8Dirs { struct ParamMvt { NO_DEFAULT_CTORS_OR_DTORS(ParamMvt); short mvtNumber; - TCHAR mvtName[32]; // Max movement name = 32 bytes + FusionANSIWarning TCHAR mvtName[32]; }; struct ParamProgram2 { NO_DEFAULT_CTORS_OR_DTORS(ParamProgram2); @@ -1384,7 +1393,7 @@ struct ParamProgram2 { }; struct ParamEffect { NO_DEFAULT_CTORS_OR_DTORS(ParamEffect); - TCHAR * name; + FusionANSIWarning TCHAR * name; }; namespace Edif { @@ -1399,10 +1408,10 @@ namespace Edif { struct FastLoop { NO_DEFAULT_CTORS_OR_DTORS(FastLoop); - TCHAR * Next; - TCHAR name[64]; // Max fast loop name (64 bytes) - unsigned short Flags; - long Index; + FusionANSIWarning TCHAR * Next; + FusionANSIWarning TCHAR name[64]; // Max fast loop name (64 bytes) + unsigned short Flags; + long Index; enum Masks { Stop = 0x1, }; @@ -1497,9 +1506,15 @@ enum struct EditDebugInfo { + // Title to edit. Cannot be null if ANSI ext in Unicode editor; otherwise if null uses a default text. + // @remarks This is Fusion internals, but matches the ext encoding. TCHAR * Title; + // Integer to edit. Floats aren't allowed. int value; + // Text to edit. + // @remarks Fusion internals, but matches the ext encoding. TCHAR * text; + // Text length in characters, not including null; used to indicate buffer size, max of DB_BUFFERSIZE. int lText; }; @@ -1801,14 +1816,14 @@ struct RunHeader4 // Save the current action event2 * rh4ActionStart; std::int32_t rh4PauseKey; - TCHAR * rh4CurrentFastLoop; + FusionANSIWarning TCHAR * rh4CurrentFastLoop; std::int32_t rh4EndOfPause; // Number of the event for OR conditions - not useful for exts std::int32_t rh4EventCountOR; std::int16_t rh4ConditionsFalse; std::int16_t rh4MouseWheelDelta; std::int32_t rh4OnMouseWheel; - TCHAR * rh4PSaveFilename; + FusionANSIWarning TCHAR * rh4PSaveFilename; std::uint32_t rh4MusicHandle; std::uint32_t rh4MusicFlags; std::uint32_t rh4MusicLoops; @@ -1845,10 +1860,10 @@ struct RunHeader4 std::int16_t rh4DroppedFlag; std::int16_t rh4NDroppedFiles; - TCHAR * rh4DroppedFiles; + FusionANSIWarning TCHAR * rh4DroppedFiles; FastLoop * rh4FastLoops; - TCHAR * rh4CreationErrorMessages; + FusionANSIWarning TCHAR * rh4CreationErrorMessages; // New V2 CValueMultiPlat rh4ExpValue1; CValueMultiPlat rh4ExpValue2; @@ -1936,7 +1951,7 @@ struct RunHeader4 std::int32_t rh4Operators[MAX_INTERMEDIATERESULTS]; // Debut zone 256 long ? - TCHAR ** rh4PTempStrings; + FusionANSIWarning TCHAR ** rh4PTempStrings; std::int32_t rh4MaxTempStrings; // Free buffer ? std::int32_t rh4Free4[256-2]; @@ -2197,7 +2212,7 @@ struct HeaderObject { // Used with path movement, works with rhLoopCount int hoMark1, hoMark2; // Name of the current node for path movements - TCHAR * hoMT_NodeName; + FusionANSIWarning TCHAR * hoMT_NodeName; // 0+ ID of the current A/C/E call, set before their ext function is run // This is not Fusion event number, it is A/C/E index in ext @@ -2449,7 +2464,7 @@ struct rMvt { int MT_XStart; int MT_YStart; int MT_Pause; - TCHAR * MT_GotoNode; + FusionANSIWarning TCHAR * MT_GotoNode; }; struct { @@ -2640,7 +2655,7 @@ struct AltVals { int Free1[25 - 1]; // 26 = number of alterable values std::uint32_t InternalFlags; std::uint8_t Free2[26]; // 26 = number of alterable values - const TCHAR * * Strings; // Alterable strings (will be null if never used, including if blank in obj properties); change with mvMalloc/mvFree + FusionANSIWarning const TCHAR * * Strings; // Alterable strings (will be null if never used, including if blank in obj properties); change with mvMalloc/mvFree int NumAltStrings; } CF25; struct MMF2 { @@ -2648,14 +2663,14 @@ struct AltVals { int rvFree1[26 - 1]; std::uint32_t rvValueFlags; std::uint8_t rvFree2[26]; - const TCHAR * rvStrings[10]; // Alterable strings (will be null if never used, including if blank in obj properties); change with mvMalloc/mvFree + FusionANSIWarning const TCHAR * rvStrings[10]; // Alterable strings (will be null if never used, including if blank in obj properties); change with mvMalloc/mvFree } MMF2; }; public: std::size_t GetAltValueCount() const; std::size_t GetAltStringCount() const; - const TCHAR* GetAltStringAtIndex(const std::size_t) const; + FusionANSIWarning const TCHAR* GetAltStringAtIndex(const std::size_t) const; const CValueMultiPlat * GetAltValueAtIndex(const std::size_t) const; void SetAltStringAtIndex(const std::size_t, const std::tstring_view&); void SetAltValueAtIndex(const std::size_t, const double); @@ -2918,10 +2933,10 @@ struct rs { DarkEdifInternalAccessProtected: // String object: the buffer containing alterable text, or a copy of paragraph text. // May be null indicating blank. - TCHAR * rsTextBuffer; + FusionANSIWarning TCHAR * rsTextBuffer; // String object: Length of rsTextBuffer in BYTES // Only present in Windows. - int rsBuffer; + int rsBuffer; // Font bank entry ID int16_t rsFont; private: @@ -3062,7 +3077,7 @@ struct objInfoList { // Qualifiers for this object std::int16_t oilQualifiers[MAX_QUALIFIERS]; // user-specified object name, cropped to 24 chars, guaranteed end with NULL - TCHAR oilName[OINAME_SIZE]; + FusionANSIWarning TCHAR oilName[OINAME_SIZE]; // Selection in a list of events with OR std::int32_t oilEventCountOR; #ifdef HWABETA @@ -3114,7 +3129,7 @@ struct objInfoList { // @remarks The name is the top field in the About tab of object properties. // This cropping is done on Fusion runtime side, and stored in built apps pre-cropped, // so it is cropped on all platforms. - const TCHAR * get_name(); + FusionANSIWarning const TCHAR * get_name(); // Reads the qualifiers array of this object at passed zero-based index. Pass 0 to 7 only. Returns -1 if invalid. // @remarks Objects cannot have more than MAX_QUALIFIERS (8) qualifiers. @@ -4133,10 +4148,10 @@ typedef otText * fpot; typedef struct txString { NO_DEFAULT_CTORS_OR_DTORS(txString); DarkEdifInternalAccessProtected: - unsigned short tsFont; // Font - unsigned short tsFlags; // Flags - COLORREF tsColor; // Color - TCHAR tsChar[]; + unsigned short tsFont; // Font + unsigned short tsFlags; // Flags + COLORREF tsColor; // Color + FusionANSIWarning TCHAR tsChar[]; } txString; typedef txString * fpts; //#define sizeof_ts 8 // (sizeof(txString)-1) @@ -4497,33 +4512,41 @@ struct mv { HPALETTE HPal256; // 256 color palette unsigned short AppMode, // Screen mode with flags ScrMode; // Screen mode (SM_8=256, SM_15=32768, SM_16=65536, SM_32=16 million colors) - DWORD EditDXDocToClient, // Edit time only: top-left coordinates - EditDYDocToClient; - CImageFilterMgr * ImgFilterMgr; // Image filter manager - CSoundFilterMgr * SndFilterMgr; // Sound filter manager - CSoundManager * SndMgr; // Sound manager + // Edit time only: top-left coordinates + DWORD EditDXDocToClient, EditDYDocToClient; - union { - CEditApp * EditApp; // Current application, edit time - different address per loaded MFA - CRunApp * RunApp; // Current application, runtime - not usable in frame editor and co, just runtime - }; - union { - CEditFrame * EditFrame; - CRunFrame * RunFrame; - }; + // Image filter manager + CImageFilterMgr * ImgFilterMgr; + // Sound filter manager + CSoundFilterMgr * SndFilterMgr; + // Sound manager + CSoundManager * SndMgr; - // Runtime - RunHeader * RunHdr; // Current RunHeader - DWORD PextsHoldingGlobals; // Preferences (sound on/off) - TCHAR * subType; - BOOL FullScreen; // Full screen mode - TCHAR * MainAppFileName; // App filename +#if EditorBuild + // Opaque struct for Fusion. Only known detail is it is a different address between MFAs loaded in Fusion. + CEditApp * EditApp; + CEditFrame * EditFrame; +#else + // Current application, runtime - not usable in frame editor and co, just runtime + CRunApp * RunApp; + CRunFrame * RunFrame; +#endif + + // Current RunHeader, containing most main details as rhPtr + RunHeader * RunHdr; + DWORD PextsHoldingGlobals; + // Preferences (sound on/off) + FusionANSIWarning TCHAR * subType; + // Full screen mode + BOOL FullScreen; + // App filename + FusionANSIWarning TCHAR * MainAppFileName; int AppListCount; int AppListSize; CRunApp** AppList; int ExtListCount; int ExtListSize; - TCHAR ** ExtList; + FusionANSIWarning TCHAR ** ExtList; int NbDllTrans; dllTrans* DllTransList; DWORD JoyCaps[32]; @@ -4801,8 +4824,8 @@ enum class KGI : int { struct kpxFunc { NO_DEFAULT_CTORS_OR_DTORS(kpxFunc); HINSTANCE kpxHInst; - TCHAR * kpxName, - * kpxSubType; + FusionANSIWarning TCHAR * kpxName; + FusionANSIWarning TCHAR * kpxSubType; void * kpxUserData; // See KGI:: above for int @@ -4833,7 +4856,7 @@ struct kpxFunc { struct MvxFnc { NO_DEFAULT_CTORS_OR_DTORS(MvxFnc); HINSTANCE mvxHInst; - TCHAR * mvxFileTitle; + FusionANSIWarning TCHAR * mvxFileTitle; CMvt * (CALLBACK * mvxCreateMvt) (DWORD); @@ -4900,8 +4923,8 @@ struct bkd2 { struct RunFrameLayer { NO_DEFAULT_CTORS_OR_DTORS(RunFrameLayer); - // name - TCHAR * pName; // name + // Layer name + FusionANSIWarning TCHAR * pName; // Offset int x, y, // Current offset @@ -4987,11 +5010,17 @@ struct objTransInfo { struct CRunFrame { NO_DEFAULT_CTORS_OR_DTORS(CRunFrame); + + // Gets the frame name + _Notnull_ FusionANSIWarning const TCHAR * get_name(); + +DarkEdifInternalAccessProtected: + friend Edif::Runtime; // Header FrameHeader hdr; - // name - TCHAR * name; + // Frame name + FusionANSIWarning TCHAR * name; // Palette LPLOGPALETTE palette; @@ -5075,14 +5104,15 @@ struct CRunFrame { PasteMask; int CurTempString; - TCHAR * TempString[MAX_TEMPSTRING]; // not used + // Not sure if this is always Fusion runtime native, or just a set of ptrs. + FusionANSIWarning TCHAR * TempString[MAX_TEMPSTRING]; // Other cSurface * SaveSurface; int EditWinWidth, // Frame (not virtual) width EditWinHeight; // Frame (not virtual) height unsigned int ColMaskBits; - TCHAR * demoFilePath; + FusionANSIWarning TCHAR * demoFilePath; unsigned short RandomSeed, Free; // Ignore - padding unsigned int MvtTimerBase; @@ -5110,27 +5140,22 @@ struct CRunFrame { // Binary files // struct CBinaryFile { - TCHAR Path[MAX_PATH], // path stored in ccn file - * TempPath; // path in temporary folder, if any - unsigned int FileSize, // file size - FileOffset; // file offset in EXE/CCN file - int TempCount; // usage count - - CBinaryFile() : - TempPath(NULL), FileSize(0), FileOffset(0), TempCount(0) - { - memset(Path, 0, MAX_PATH); - } - ~CBinaryFile() - { - if (TempPath) - { - _tremove(TempPath); - free(TempPath); - TempPath = NULL; - TempCount = 0; - } - } + // Path stored in ccn file + FusionANSIWarning TCHAR Path[MAX_PATH]; + // Path in temporary folder, if any + // Will not be valid in ANSI ext in Unicode runtime, due to Path offset prior. + FusionANSIWarning TCHAR * TempPath; + + // file size + std::uint32_t FileSize; + // file offset in EXE/CCN file + std::uint32_t FileOffset; + // usage count + int TempCount; + + // While this struct was defined with C++ ctors/dtors in original Fusion SDK, it is not used in any MMFS2 function, + // and creating new CBinaryFile isn't expected. + NO_DEFAULT_CTORS_OR_DTORS(CBinaryFile); }; ////////////////////////////////////////////////////////////////////////////// @@ -5166,33 +5191,46 @@ struct CRunApp { DarkEdifInternalAccessProtected: friend Edif::Runtime; friend DarkEdif::FontInfoMultiPlat; - // Application info - AppMiniHeader miniHdr; // Version - AppHeader hdr; // General info - TCHAR * name, // name of the application - * appFileName, // filename (temporary file in editor mode) - * editorFileName, // filename of original .mfa file - * copyright, // copyright - * aboutText; // text to display in the About box - - // File infos - TCHAR * targetFileName; // filename of original CCN/EXE file - TCHAR * tempPath; // Temporary directory for external files - HFILE file; // File handle - Yves confirmed it was opened with CreateFile, not fopen - unsigned int startOffset; - - // Help file - TCHAR * doc; // Help file pathname - - // Icon - unsigned char * icon16x16x8; // = LPBITMAPINFOHEADER - HICON hIcon16x16x8; // Small icon for the main window - - // Menu - HMENU hRunMenu; // Menu - unsigned char * accels; // Accelerators - TCHAR * pMenuTexts; // Menu texts (for ownerdraw menu) - unsigned char * pMenuImages; // Images index used in the menu + + // Application version info + AppMiniHeader miniHdr; + // Application general info + AppHeader hdr; + // Application name + FusionANSIWarning TCHAR * name; + // filename (temporary file in editor mode) + FusionANSIWarning TCHAR* appFileName; + // filename of original .mfa file + FusionANSIWarning TCHAR * editorFileName; + // Fusion-app copyright + FusionANSIWarning TCHAR * copyright; + // text to display in the About box + FusionANSIWarning TCHAR * aboutText; + + // Filename of original CCN/EXE file + FusionANSIWarning TCHAR * targetFileName; + // Temporary directory for external files + FusionANSIWarning TCHAR * tempPath; + // File handle - Yves confirmed it was opened with CreateFile, not fopen + HFILE file; + unsigned int startOffset; + + // Fusion app help filepath + FusionANSIWarning TCHAR * doc; + + // Fusion app icon - documented as LPBITMAPINFOHEADER, but may be LPBITMAPINFO itself? + unsigned char* icon16x16x8; + // Small icon for the main window + HICON hIcon16x16x8; + + // Menu handle + HMENU hRunMenu; + // Menu accelerators + unsigned char * accels; + // Menu texts (for ownerdraw menu) + FusionANSIWarning TCHAR * pMenuTexts; + // Images index used in the menu + unsigned char * pMenuImages; MenuHdr * pMenu; // Frame offsets @@ -5201,8 +5239,8 @@ struct CRunApp { unsigned short * frame_handle_to_index; // Handle -> index table unsigned int * frameOffset; // Frame offsets in the file - // Frame passwords - TCHAR ** framePasswords; // Table of frame passwords (TCHAR * []) + // Table of frame passwords + FusionANSIWarning TCHAR ** framePasswords; // Extensions int nbKpx; // Number of extensions @@ -5213,9 +5251,10 @@ struct CRunApp { int nbMvx; // Number of movement extensions MvxFnc * mvxTable; // DLL info - // Elements - TCHAR * eltFileName[MAX_TABREF]; // Element banks - HFILE hfElt[MAX_TABREF]; + // Element bank file paths + FusionANSIWarning TCHAR * eltFileName[MAX_TABREF]; + // Element bank handles + HFILE hfElt[MAX_TABREF]; unsigned int eltBaseOff; unsigned short nbEltOff[MAX_TABREF]; // Sizes of file offset tables @@ -5299,16 +5338,21 @@ struct CRunApp { * pScores; // Global values (warning: not valid if sub-app and global values are shared) + // Default global value values unsigned char * pGlobalValuesInit; - int nGlobalValues; // Number of global values + // Number of global values + int nGlobalValues; CValueMultiPlat * pGlobalValues; // Global values - unsigned char * pFree, // No longer used - * pGlobalValueNames, - - // Global strings (warning: not valid if sub-app and global values are shared) - * pGlobalStringInit; // Default global string values - int nGlobalStrings; // Number of global strings - TCHAR ** pGlobalString; // Pointers to global strings + unsigned char * pFree; // No longer used + // Global value names + unsigned char * pGlobalValueNames; + + // Default global string values + unsigned char * pGlobalStringInit; + // Number of global strings + int nGlobalStrings; + // Global strings (warning: not valid if sub-app and global strings are shared) + FusionANSIWarning TCHAR ** pGlobalString; unsigned char * pGlobalStringNames; // Global objects @@ -5318,18 +5362,19 @@ struct CRunApp { short NConditions[7+32-1]; // NUMBER_OF_SYSTEM_OBJECTS + KPX_BASE - 1->0 base change // External sound files - TCHAR * pExtMusicFile, - * pExtSampleFile[32]; // External sample file per channel + FusionANSIWarning TCHAR * pExtMusicFile; + // External sample file per channel + FusionANSIWarning TCHAR * pExtSampleFile[32]; int nInModalLoopCount; - TCHAR * pPlayerNames; + FusionANSIWarning TCHAR * pPlayerNames; unsigned int dwColorCache; unsigned char * pVtz4Opt; // not used unsigned int dwFree; // not used // Application load - TCHAR * pLoadFilename; + FusionANSIWarning TCHAR * pLoadFilename; unsigned int saveVersion; BOOL bLoading; diff --git a/DarkEdif/Lib/Shared/DarkEdif.cpp b/DarkEdif/Lib/Shared/DarkEdif.cpp index b586af8f..00b3556b 100644 --- a/DarkEdif/Lib/Shared/DarkEdif.cpp +++ b/DarkEdif/Lib/Shared/DarkEdif.cpp @@ -1,3 +1,6 @@ +// Suppress warnings for popping up for DE's own internal usage +#define DARKEDIF_INTERNAL_INCLUDE + #include "Common.hpp" #include "Extension.hpp" #include @@ -5449,7 +5452,7 @@ std::tstring DarkEdif::FontInfoMultiPlat::GetActualFontName() { // Font names may be localised, particularly for CJK and English. // Hat tip: https://stackoverflow.com/a/7193439 // See a workaround: https://chromium.googlesource.com/chromium/blink/+/e2b472488d4a23f4eb7acdf2d590d513b802820e/Source/platform/fonts/win/FontCacheWin.cpp#64 - HWND ourWin = Edif::SDK->mV->RunApp->hEditWin; + HWND ourWin = DarkEdif::Internal_WindowHandle; HDC ourDC = GetDC(ourWin); if (ourDC == NULL) return LOGE(_T("Couldn't get original DC, error %u."), GetLastError()), _T(""s); diff --git a/cpp.hint b/cpp.hint index 7486fe2a..edbbc83f 100644 --- a/cpp.hint +++ b/cpp.hint @@ -26,3 +26,8 @@ #define npWin void * #define Fusion64APISwitch /* no op */ #define FusionANSIWarning /* no op */ +#define CRunApp CRunAppMultiPlat +#define CRunFrame CRunFrameMultiPlat +#define NO_DEFAULT_CTORS_OR_DTORS(x) /* no op */ +#define NO_DEFAULT_CTORS(x) /* no op */ +#define DarkEdifInternalAccessProtected protected From 7c23dabaeea5ab72b5babc8af8fb0d38cb5369fd Mon Sep 17 00:00:00 2001 From: Phi Date: Tue, 7 Jul 2026 09:02:10 +0100 Subject: [PATCH 08/17] Mark HelpNDoc and CHM as binary HelpNDoc now exports incomplete topics too for HTML. A little better when doing git diffs to see what I edited. --- .gitattributes | 4 ++++ .../DarkEdif SDK/DarkEdif SDK.hnd | Bin 3256320 -> 3256320 bytes 2 files changed, 4 insertions(+) diff --git a/.gitattributes b/.gitattributes index 5c68ec89..a85ceae6 100644 --- a/.gitattributes +++ b/.gitattributes @@ -73,3 +73,7 @@ *.plist text eol=lf *.java text eol=lf CodeResources text eol=lf + +# HelpNDoc and generated compressed help files +*.hnd binary +*.chm binary diff --git a/DarkEdif/- MFAs and documentation/DarkEdif SDK/DarkEdif SDK.hnd b/DarkEdif/- MFAs and documentation/DarkEdif SDK/DarkEdif SDK.hnd index 11c3b2f76b64348b3b528ab09e6d83bae634550c..c987a4b5665165d081833093ed170109014084bf 100644 GIT binary patch delta 900 zcmciAUr19?7y$5lwsW_<_kQQ7scTpFCv}=G-BKvbfuphp^H$QLC(Ge3DQ-1vz4ajd zVe}Af4IB0nK|~M+as#c>TVII<0-uqL7YZrJlE_7vMKNfyp1if1lfcN`KUNzy-lCd zKI>NzjHQwrkwrn$SeizKT{He^S8Pz92Zj1&ZjA&x3h6{<#iQ4Oj^b;yDC zAtzE%J!(KM delta 567 zcmajcO=}ZT7zNUrz-Hbyiy3vA&A`!|^2epB^uy&P2cL5hg_x%B`JpKX~&+>5Im$S0JLsq~^lBAnD zPm&w6Z*B|>s Date: Thu, 18 Jun 2026 22:26:49 +0100 Subject: [PATCH 09/17] DarkEdif: Minor edit to mutex --- DarkEdif/Lib/Shared/Edif.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/DarkEdif/Lib/Shared/Edif.cpp b/DarkEdif/Lib/Shared/Edif.cpp index 64a491a1..2ea50e53 100644 --- a/DarkEdif/Lib/Shared/Edif.cpp +++ b/DarkEdif/Lib/Shared/Edif.cpp @@ -2172,13 +2172,13 @@ char* Edif::ConvertAndCopyString(char* str, const std::string_view & utf8String, #endif // _UNICODE -#if defined(_DEBUG) - - Edif::recursive_mutex::recursive_mutex() { +#if defined(_DEBUG) this->log << "New recursive mutex.\n"sv; +#endif } +#if defined(_DEBUG) Edif::recursive_mutex::~recursive_mutex() { this->log << "Recursive mutex dying.\n"sv; @@ -2283,9 +2283,6 @@ void Edif::recursive_mutex::unlock(edif_lock_debugParams) #else // Not debug -Edif::recursive_mutex::recursive_mutex() -{ -} Edif::recursive_mutex::~recursive_mutex() { } From 2a7bf8b034224f0b114b65a222c8f3271db1031d Mon Sep 17 00:00:00 2001 From: Phi Date: Tue, 7 Jul 2026 08:47:41 +0100 Subject: [PATCH 10/17] Phi Object: Add draft code for CPU reading I started feature creeping this, so... yeah. More complicated than it should be, with NUMA nodes, physical core packages, cores, logical cores (hyperthreading), Performance vs Efficiency, etc. Gonna drop it for now and focus on DebugObject. --- DarkEdif/Phi Object/DarkExt.json | 12 ++- DarkEdif/Phi Object/Extension.cpp | 131 ++++++++++++++++++++++++++++-- DarkEdif/Phi Object/Extension.hpp | 1 + 3 files changed, 137 insertions(+), 7 deletions(-) diff --git a/DarkEdif/Phi Object/DarkExt.json b/DarkEdif/Phi Object/DarkExt.json index ae8dc85e..2ee39dbf 100644 --- a/DarkEdif/Phi Object/DarkExt.json +++ b/DarkEdif/Phi Object/DarkExt.json @@ -80,7 +80,9 @@ [ 25, "Get app root folder" ] ], [ "CPU", - [ 20, "Get CPU temperature (C)", true ] + [ 20, "Get CPU temperature (C)", true ], + [ 27, "Get CPU processor count", true ], + [ 28, "Get CPU core count", true ] ], [ "Discrete ACL loop entry", [ 21, "Account name" ], @@ -386,6 +388,14 @@ { "Title": "NetworkType$(", "Returns": "Text" + }, + { + "Title": "GetCPUProcessorCount(", + "Returns": "Integer" + }, + { + "Title": "GetCPUCoreCount(", + "Returns": "Integer" } ] } diff --git a/DarkEdif/Phi Object/Extension.cpp b/DarkEdif/Phi Object/Extension.cpp index 65f71f79..23fdf1ef 100644 --- a/DarkEdif/Phi Object/Extension.cpp +++ b/DarkEdif/Phi Object/Extension.cpp @@ -3,6 +3,7 @@ #ifdef __ANDROID__ #include #endif +#include /// /// EXTENSION CONSTRUCTOR/DESTRUCTOR /// @@ -73,16 +74,134 @@ Extension::Extension(const EDITDATA* const edPtr, void* const objCExtPtr, const LinkExpression(25, GetAppRoot); LinkExpression(26, GetNetworkType); +#ifdef _WIN32 +#if WINVER < _WIN32_WINNT_WIN7 +#if WINVER < _WIN32_WINNT_WIN8 + _Struct_size_bytes_(Size) struct SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX { + LOGICAL_PROCESSOR_RELATIONSHIP Relationship; + DWORD Size; + union { + PROCESSOR_RELATIONSHIP Processor; + NUMA_NODE_RELATIONSHIP NumaNode; + CACHE_RELATIONSHIP Cache; + GROUP_RELATIONSHIP Group; + SHARED_COMPUTE_UNIT_RELATIONSHIP SharedComputeUnit; + } DUMMYUNIONNAME; + }; + typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, * PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX; +#endif + DWORD slpiSizeExp, slpiSizeAct; + if (DarkEdif::Windows::Has7Plus()) + { + std::vector slpiEx; + BOOL(WINAPI* const GLPIExFunc)(PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, PDWORD) = + (decltype(GLPIExFunc))GetProcAddress(GetModuleHandle(_T("kernel32")), "GetLogicalProcessorInformationEx"); + assert(GLPIExFunc); + while (true) + { + slpiEx.push_back({}); + slpiSizeAct = slpiSizeExp = slpiEx.size() * sizeof(slpiEx[0]); + if (GLPIExFunc(&slpiEx[0], &slpiSizeAct) && slpiSizeAct <= slpiSizeExp) + break; - /* - This is where you'd do anything you'd do in CreateRunObject in the original SDK - - It's the only place you'll get access to edPtr at runtime, so you should transfer - anything from edPtr to the extension class here. + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) + { + DarkEdif::MsgBox::Error(_T("!!"), _T("Error code: %u."), GetLastError()); + break; + } + if (slpiSizeAct < slpiSizeExp && !(slpiSizeAct % sizeof(slpi[0]))) + slpi.resize((slpiSizeAct / sizeof(slpi[0])) - 1); + } + // extra data? + if (slpiSizeAct % sizeof(slpiEx[0])) + { + DarkEdif::MsgBox::Error(_T("!!"), _T("Extra data: %zu (%zu bytes) is actually %zu, has %zu extra bytes."), + slpiEx.size(), slpiSizeExp, + slpiSizeAct, slpiSizeAct % sizeof(slpiEx[0])); + slpiEx.erase(slpiEx.cend()); + } + } + else + { + std::vector slpi; + BOOL(WINAPI* const GLPIFunc)(PSYSTEM_LOGICAL_PROCESSOR_INFORMATION, PDWORD) = + (decltype(GLPIFunc))GetProcAddress(GetModuleHandle(_T("kernel32")), "GetLogicalProcessorInformation"); + assert(GLPIFunc); + while (true) + { + slpi.push_back({}); + slpiSizeAct = slpiSizeExp = slpi.size() * sizeof(slpi[0]); + if (GLPIFunc(&slpi[0], &slpiSizeAct) && slpiSizeAct <= slpiSizeExp) + break; + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) + { + DarkEdif::MsgBox::Error(_T("!!"), _T("Error code: %u."), GetLastError()); + break; + } + if (slpiSizeAct < slpiSizeExp && !(slpiSizeAct % sizeof(slpi[0]))) + slpi.resize((slpiSizeAct / sizeof(slpi[0])) - 1); + } + // extra data? + if (slpiSizeAct % sizeof(slpi[0])) + { + DarkEdif::MsgBox::Error(_T("!!"), _T("Extra data: %zu (%zu bytes) is actually %zu, has %zu extra bytes."), + slpi.size(), slpiSizeExp, + slpiSizeAct, slpiSizeAct % sizeof(slpi[0])); + slpi.erase(slpi.cend()); + } + struct CPUCore { + int baseFrequencyMHz; + int turboFrequencyMHz; + // + int curFrequencyMHz; + int maxFrequencyMHz; + }; + struct CPUPackage { + bool isEfficiency = false; + int numCores = 0; + int numLogicalProcessors = 0; + std::vector coreStockMHz; + int (*mHZAtCore)(int); + int mHZTotal(int); + }; + std::vector packages; + std::optional cur; + + for (const auto& i : slpi) + { + if (i.Relationship == RelationProcessorCore) + { + ++cur->numCores; + cur->numLogicalProcessors += __builtin_popcount(i.ProcessorMask); + CallNtPowerInformation() + int cpuInfo[4]; + __cpuid(cpuInfo, 0x16); + CallNtPowerInformation() + cur->coreStockMHz = i. + } + else if (i.Relationship == RelationProcessorPackage) + { + if (cur.has_value()) + packages.emplace_back(CPUPackage()); + cur = CPUPackage(); + } + } + } + /* + Windows: Use GetLogicalProcessorInformationEx() and group cores by EfficiencyClass to get P/E. + Win11+ has EfficiencyClass; lower doesn't. + Current frequency sometimes available with __cpuid(int[4], 0x16), EAX = Base MHz, EBX = Max MHz, ECX = Bus MHz + CallNtPowerInformation(ProcessorInformation or ProcessorPerformanceInformation, xx) + requires #include #pragma comment(lib, "PowrProf.lib") + + Android/Linux: Read /sys/devices/system/cpu/cpu##/cpufreq/cpuinfo_max_freq (or cpu_capacity if available) + and group cores with the same capacity/frequency into clusters. + macOS/iOS: Prefer the undocumented hw.perflevel*.physicalcpu and hw.perflevel*.logicalcpu sysctls when available, + falling back to just total physical / logical core counts if they aren't present. */ -#ifdef __ANDROID__ +#elif defined(__ANDROID__) do { androidSensorManager = ASensorManager_getInstance(); if (androidSensorManager == NULL) { diff --git a/DarkEdif/Phi Object/Extension.hpp b/DarkEdif/Phi Object/Extension.hpp index 5e7b5016..6d019acf 100644 --- a/DarkEdif/Phi Object/Extension.hpp +++ b/DarkEdif/Phi Object/Extension.hpp @@ -57,6 +57,7 @@ class Extension final std::vector errorList; Edif::recursive_mutex errorListLock; std::vector frameNames; + std::size_t cpuProcessorCount, cpuCoreCount = 0; void GetFrameNames(); From 681c76107338fae7d6dffe845b3886da975326f0 Mon Sep 17 00:00:00 2001 From: RainbowHype123 Date: Tue, 7 Jul 2026 01:41:20 -0700 Subject: [PATCH 11/17] Update zlib.lib --- rSDK/Lib/zlib.lib | Bin 344806 -> 345166 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/rSDK/Lib/zlib.lib b/rSDK/Lib/zlib.lib index 5e7f3e3499be2e68c568df6310c28fd0494c7124..e1dea9f22e203271b2dcee2dc71e60430813ed30 100644 GIT binary patch delta 23624 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 delta 23376 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 Date: Tue, 23 Jun 2026 01:39:07 -0700 Subject: [PATCH 12/17] Add Multiple Icons Support + ZlibStream Unicode + DarkExt.json changes ZlibStream Unicode is from a port I did in my own rSDK repo, and then hastily ported into the MMF2EXTs repo. It may need some extra review and/or fixes before the pull request is accepted. --- DarkEdif/DarkEdif Template/DarkExt.json | 12 +- DarkEdif/DarkEdif Template/Edittime.cpp | 7 + DarkEdif/DarkEdif Template/Ext.rc | 3 + DarkEdif/DarkEdif Template/Image.png | Bin 0 -> 1306 bytes DarkEdif/DarkEdif Template/Resource.h | 3 + DarkEdif/Inc/Shared/Edif.hpp | 4 + DarkEdif/Lib/Shared/DarkEdif.cpp | 1 + DarkEdif/Lib/Shared/Edif.cpp | 47 ++ rSDK/Inc/zconf.h | 67 +- rSDK/Inc/zlib.h | 845 +++++++++++++--------- rSDK/Lib/zlib.lib | Bin 331624 -> 344806 bytes rSDK/ZlibStream/Data.h | 28 +- rSDK/ZlibStream/Edittime.cpp | 195 +++-- rSDK/ZlibStream/Ext.rc | 8 +- rSDK/ZlibStream/General.cpp | 65 +- rSDK/ZlibStream/{EXTICON.BMP => Icon.bmp} | Bin rSDK/ZlibStream/{EXTIMG.BMP => Img.bmp} | Bin rSDK/ZlibStream/Information.h | 12 +- rSDK/ZlibStream/Main.cpp | 599 +++++++-------- rSDK/ZlibStream/Runtime.cpp | 102 +-- rSDK/ZlibStream/UpgradeLog.htm | Bin 0 -> 31898 bytes rSDK/ZlibStream/UpgradeLog2.htm | Bin 0 -> 31898 bytes 22 files changed, 1135 insertions(+), 863 deletions(-) create mode 100644 DarkEdif/DarkEdif Template/Image.png rename rSDK/ZlibStream/{EXTICON.BMP => Icon.bmp} (100%) rename rSDK/ZlibStream/{EXTIMG.BMP => Img.bmp} (100%) create mode 100644 rSDK/ZlibStream/UpgradeLog.htm create mode 100644 rSDK/ZlibStream/UpgradeLog2.htm diff --git a/DarkEdif/DarkEdif Template/DarkExt.json b/DarkEdif/DarkEdif Template/DarkExt.json index 3cb749d2..437f7d78 100644 --- a/DarkEdif/DarkEdif Template/DarkExt.json +++ b/DarkEdif/DarkEdif Template/DarkExt.json @@ -77,6 +77,11 @@ { "Type": "FolderEnd" }, + { + "Title": "Props outside folder", + "Info": "This blue header is called a group inside the DarkExt.json file.", + "Type": "Group" + }, { "Title": "Static text 1", "Info": "Blank text", @@ -139,7 +144,7 @@ "About": { "Name": "Exemple objet", "Author": "Votre Nom", - "Copyright": "Copyright \u00A9 2022 par Votre Nom", + "Copyright": "Copyright \u00A9 2026 par Votre Nom", "Comment": "Une ou deux phrases pour décrire votre poste", "Help": "Help/Example.chm", "URL": "http://www.example.com/" @@ -209,6 +214,11 @@ { "Type": "FolderEnd" }, + { + "Title": "Groupe", + "Info": "Voir le fichier DarkExt.json.", + "Type": "Group" + }, { "Title": "Texte statique 1", "Info": "Texte vide", diff --git a/DarkEdif/DarkEdif Template/Edittime.cpp b/DarkEdif/DarkEdif Template/Edittime.cpp index 95885540..62555fb7 100644 --- a/DarkEdif/DarkEdif Template/Edittime.cpp +++ b/DarkEdif/DarkEdif Template/Edittime.cpp @@ -19,7 +19,11 @@ int FusionAPI MakeIconEx(mv * mV, cSurface * pIconSf, TCHAR * lpName, ObjInfo * { #pragma DllExportHint pIconSf->Delete(); + #ifdef MULTIPLEICONS + pIconSf->Clone(*Edif::SDK->Image); + #else pIconSf->Clone(*Edif::SDK->Icon); + #endif pIconSf->SetTransparentColor(RGB(255, 0, 255)); return 0; @@ -153,6 +157,8 @@ BOOL FusionAPI EditObject(mv *mV, ObjInfo * oiPtr, LevelObject * loPtr, EDITDATA // PROPERTIES // ============================================================================ +#ifndef NOPROPS + // Inserts properties into the properties of the object. BOOL FusionAPI GetProperties(mv * mV, EDITDATA * edPtr, BOOL bMasterItem) { @@ -227,6 +233,7 @@ void FusionAPI ReleasePropCreateParam(mv *mV, EDITDATA *edPtr, unsigned int Prop #pragma DllExportHint return DarkEdif::DLL::DLL_ReleasePropCreateParam(mV, edPtr, PropID, lParam); } +#endif // ============================================================================ // ROUTINES USED WHEN BUILDING diff --git a/DarkEdif/DarkEdif Template/Ext.rc b/DarkEdif/DarkEdif Template/Ext.rc index 7a032d2a..e27e3368 100644 --- a/DarkEdif/DarkEdif Template/Ext.rc +++ b/DarkEdif/DarkEdif Template/Ext.rc @@ -154,6 +154,9 @@ END #if EditorBuild IDR_EDIF_ICON Edif "Icon.png" +#ifdef MULTIPLEICONS +IDR_EDIF_IMAGE Edif "Image.png" +#endif #if !defined(DARKEXT_JSON_FILE_EXTERNAL) IDR_EDIF_JSON Edif "DarkExt.json" #endif diff --git a/DarkEdif/DarkEdif Template/Image.png b/DarkEdif/DarkEdif Template/Image.png new file mode 100644 index 0000000000000000000000000000000000000000..e5e942d41a8b9fe51c04ec0c6e4bc456e4650cca GIT binary patch literal 1306 zcmV+#1?BpQP)$bC{XBax3jymvokw0K5Qv%fwo&zUO35@`Tyr~ z&iT${zJYtV%MbvntE;W-?Ck$dR1`&gKA!*}0Zf@Ph3D6-NnDivJ7FW9IMy9GGI&k` z@cDc~C={|>PA9*&t8|1+BvAxF(_>hsIgBW77=vrO-Hy$6!?h9D2G@ekhQppRxG#MG zJnj_g>gsOXGnCkjg{`x_CeI#_=u{<~f=)ObAsSHu$aD*+hJY%E5)X(HnI0!Ly8}hl zkwg)RI6+wjDFs)mleDx{LYm0#5}h{|3Yh%sBL0WVjvl zDHdip1sfukB_Rn;LaN0Vf0$hB6R0eV0kE(3n~_qtHURML{_lut7OyVSF?4~_`A*80 z=iturpv3Jgnw7??Wi$Bf|ijDRZ}hr@|YO2>3$5l5sy>S4npaSHQHI8JLmoNPWfIQ4FYTfTzpXl=W|ys0MJN@OsyflMG1K^iDC9n4fPT?3U0F%S7u{8D)L4v-g=estdLo696@>DFR`MnXxYixO@Ar?{{kRPP^aP^J zncl_P$J!wX#D-J|?w{1h`X^iH4;%dW!}sH*9lwF~FTE(p5tG#m&ybTLC%TT2h&~4E z3Y(Dxh33;|sjaOYSNBO7065!z3Adx4(t?&m3K|fGnfG0@o3V#7Ix;1DLS*9U0iM;{!oeb EdittimeProperties; #ifndef NOPROPS diff --git a/DarkEdif/Lib/Shared/DarkEdif.cpp b/DarkEdif/Lib/Shared/DarkEdif.cpp index 00b3556b..190b4196 100644 --- a/DarkEdif/Lib/Shared/DarkEdif.cpp +++ b/DarkEdif/Lib/Shared/DarkEdif.cpp @@ -5,6 +5,7 @@ #include "Extension.hpp" #include #include +#include #ifdef _WIN32 extern HINSTANCE hInstLib; diff --git a/DarkEdif/Lib/Shared/Edif.cpp b/DarkEdif/Lib/Shared/Edif.cpp index 2ea50e53..e65c9acb 100644 --- a/DarkEdif/Lib/Shared/Edif.cpp +++ b/DarkEdif/Lib/Shared/Edif.cpp @@ -699,6 +699,53 @@ Edif::SDKClass::SDKClass(mv * mV, json_value &_json) : json (_json) DarkEdif::MsgBox::Error(_T("DarkEdif error"), _T("Blitting to ext icon surface failed. Last error: %i."), tempIcon->GetLastError()); } ExtIcon = new DarkEdif::Surface(nullptr, Icon); + + #ifdef MULTIPLEICONS + Image = new cSurface(); + char * ImageData; + size_t ImageSize; + + int resultTwo = Edif::GetDependency (ImageData, ImageSize, _T("png"), IDR_EDIF_IMAGE); + if (resultTwo != Edif::DependencyNotFound) + { + CInputMemFile * File = CInputMemFile::NewInstance(); + File->Create((LPBYTE)ImageData, ImageSize); + + const std::unique_ptr tempImage = std::make_unique(); + const bool loadedOK = ImportImageFromInputFile(mV->ImgFilterMgr, File, tempImage.get(), NULL, 0); + if (!loadedOK) + { + // Read PNG bit depth: Skip 8 byte PNG header, IHDR 4 byte chunk length/type, img width/height, + // and then get bit depth byte. + // 4 bit or less bit depth is not loadable by Fusion's PNG filter. + const std::uint8_t bitDepth = File->GetMemBuffer()[8 + 4 + 4 + 4 + 4]; + + if (bitDepth <= 4) + DarkEdif::MsgBox::Error(_T("Failed to load ext image"), _T("" PROJECT_NAME "'s Image.png uses a bit depth of %hhu, which is too small."), bitDepth); + else + DarkEdif::MsgBox::Error(_T("Failed to load ext image"), _T("" PROJECT_NAME "'s Image.png failed to load.")); + } + + File->Delete(); + + if (!tempImage->HasAlpha()) + tempImage->SetTransparentColor(RGB(255, 0, 255)); + + if (resultTwo != Edif::DependencyWasResource) + free(ImageData); + + Image->Create(tempImage->GetWidth(), tempImage->GetHeight(), proto); + + if (!tempImage->HasAlpha()) + Image->SetTransparentColor(RGB(255, 0, 255)); + else + Image->CreateAlpha(); + + if (loadedOK && tempImage->Blit(*Image) == FALSE) + DarkEdif::MsgBox::Error(_T("DarkEdif error"), _T("Blitting to ext image surface failed. Last error: %i."), tempImage->GetLastError()); + } + ExtImage = new DarkEdif::Surface(nullptr, Image); + #endif } #if USE_DARKEDIF_UPDATE_CHECKER diff --git a/rSDK/Inc/zconf.h b/rSDK/Inc/zconf.h index 5e1d68a0..828ca617 100644 --- a/rSDK/Inc/zconf.h +++ b/rSDK/Inc/zconf.h @@ -1,5 +1,5 @@ /* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * Copyright (C) 1995-2026 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -33,14 +33,21 @@ # ifndef Z_SOLO # define compress z_compress # define compress2 z_compress2 +# define compress_z z_compress_z +# define compress2_z z_compress2_z # define compressBound z_compressBound +# define compressBound_z z_compressBound_z # endif # define crc32 z_crc32 # define crc32_combine z_crc32_combine # define crc32_combine64 z_crc32_combine64 +# define crc32_combine_gen z_crc32_combine_gen +# define crc32_combine_gen64 z_crc32_combine_gen64 +# define crc32_combine_op z_crc32_combine_op # define crc32_z z_crc32_z # define deflate z_deflate # define deflateBound z_deflateBound +# define deflateBound_z z_deflateBound_z # define deflateCopy z_deflateCopy # define deflateEnd z_deflateEnd # define deflateGetDictionary z_deflateGetDictionary @@ -56,6 +63,7 @@ # define deflateSetDictionary z_deflateSetDictionary # define deflateSetHeader z_deflateSetHeader # define deflateTune z_deflateTune +# define deflateUsed z_deflateUsed # define deflate_copyright z_deflate_copyright # define get_crc_table z_get_crc_table # ifndef Z_SOLO @@ -125,9 +133,12 @@ # define inflate_copyright z_inflate_copyright # define inflate_fast z_inflate_fast # define inflate_table z_inflate_table +# define inflate_fixed z_inflate_fixed # ifndef Z_SOLO # define uncompress z_uncompress # define uncompress2 z_uncompress2 +# define uncompress_z z_uncompress_z +# define uncompress2_z z_uncompress2_z # endif # define zError z_zError # ifndef Z_SOLO @@ -231,14 +242,20 @@ # endif #endif -#if defined(ZLIB_CONST) && !defined(z_const) -# define z_const const -#else -# define z_const +#ifndef z_const +# ifdef ZLIB_CONST +# define z_const const +# else +# define z_const +# endif #endif #ifdef Z_SOLO - typedef unsigned long z_size_t; +# ifdef _WIN64 + typedef unsigned long long z_size_t; +# else + typedef unsigned long z_size_t; +# endif #else # define z_longlong long long # if defined(NO_SIZE_T) @@ -293,14 +310,6 @@ # endif #endif -#ifndef Z_ARG /* function prototypes for stdarg */ -# if defined(STDC) || defined(Z_HAVE_STDARG_H) -# define Z_ARG(args) args -# else -# define Z_ARG(args) () -# endif -#endif - /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have @@ -349,6 +358,9 @@ # ifdef FAR # undef FAR # endif +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif # include /* No need for _export, use ZLIB.DEF instead. */ /* For complete Windows compatibility, use WINAPI, not __stdcall. */ @@ -431,11 +443,11 @@ typedef uLong FAR uLongf; typedef unsigned long z_crc_t; #endif -#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +#if HAVE_UNISTD_H-0 /* may be set to #if 1 by ./configure */ # define Z_HAVE_UNISTD_H #endif -#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +#if HAVE_STDARG_H-0 /* may be set to #if 1 by ./configure */ # define Z_HAVE_STDARG_H #endif @@ -467,11 +479,14 @@ typedef uLong FAR uLongf; # undef _LARGEFILE64_SOURCE #endif -#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) -# define Z_HAVE_UNISTD_H +#ifndef Z_HAVE_UNISTD_H +# if defined(__WATCOMC__) || defined(__GO32__) || \ + (defined(_LARGEFILE64_SOURCE) && !defined(_WIN32)) +# define Z_HAVE_UNISTD_H +# endif #endif #ifndef Z_SOLO -# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# if defined(Z_HAVE_UNISTD_H) # include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ # ifdef VMS # include /* for off_t */ @@ -501,17 +516,19 @@ typedef uLong FAR uLongf; #endif #ifndef z_off_t -# define z_off_t long +# define z_off_t long long #endif #if !defined(_WIN32) && defined(Z_LARGE64) # define z_off64_t off64_t +#elif defined(__MINGW32__) +# define z_off64_t long long +#elif defined(_WIN32) && !defined(__GNUC__) +# define z_off64_t __int64 +#elif defined(__GO32__) +# define z_off64_t offset_t #else -# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) -# define z_off64_t __int64 -# else -# define z_off64_t z_off_t -# endif +# define z_off64_t z_off_t #endif /* MVS linker does not support external names larger than 8 bytes */ diff --git a/rSDK/Inc/zlib.h b/rSDK/Inc/zlib.h index f09cdaf1..a57d3361 100644 --- a/rSDK/Inc/zlib.h +++ b/rSDK/Inc/zlib.h @@ -1,7 +1,7 @@ /* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.11, January 15th, 2017 + version 1.3.2, February 17th, 2026 - Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler + Copyright (C) 1995-2026 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -24,24 +24,28 @@ The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 + Comments) 1950 to 1952 at https://datatracker.ietf.org/doc/html/rfc1950 (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). */ #ifndef ZLIB_H #define ZLIB_H -#include "zconf.h" +#ifdef ZLIB_BUILD +# include +#else +# include "zconf.h" +#endif #ifdef __cplusplus extern "C" { #endif -#define ZLIB_VERSION "1.2.11" -#define ZLIB_VERNUM 0x12b0 +#define ZLIB_VERSION "1.3.2" +#define ZLIB_VERNUM 0x1320 #define ZLIB_VER_MAJOR 1 -#define ZLIB_VER_MINOR 2 -#define ZLIB_VER_REVISION 11 +#define ZLIB_VER_MINOR 3 +#define ZLIB_VER_REVISION 2 #define ZLIB_VER_SUBREVISION 0 /* @@ -78,8 +82,8 @@ extern "C" { even in the case of corrupted input. */ -typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); -typedef void (*free_func) OF((voidpf opaque, voidpf address)); +typedef voidpf (*alloc_func)(voidpf opaque, uInt items, uInt size); +typedef void (*free_func)(voidpf opaque, voidpf address); struct internal_state; @@ -217,7 +221,7 @@ typedef gz_header FAR *gz_headerp; /* basic functions */ -ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +ZEXTERN const char * ZEXPORT zlibVersion(void); /* The application can compare zlibVersion and ZLIB_VERSION for consistency. If the first character differs, the library code actually used is not compatible with the zlib.h header file used by the application. This check @@ -225,12 +229,12 @@ ZEXTERN const char * ZEXPORT zlibVersion OF((void)); */ /* -ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); +ZEXTERN int ZEXPORT deflateInit(z_streamp strm, int level); Initializes the internal stream state for compression. The fields zalloc, zfree and opaque must be initialized before by the caller. If zalloc and zfree are set to Z_NULL, deflateInit updates them to use default - allocation functions. + allocation functions. total_in, total_out, adler, and msg are initialized. The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: 1 gives best speed, 9 gives best compression, 0 gives no compression at all @@ -247,7 +251,7 @@ ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); */ -ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +ZEXTERN int ZEXPORT deflate(z_streamp strm, int flush); /* deflate compresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce @@ -276,7 +280,7 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); == 0), or after each call of deflate(). If deflate returns Z_OK and with zero avail_out, it must be called again after making room in the output buffer because there might be more output pending. See deflatePending(), - which can be used if desired to determine whether or not there is more ouput + which can be used if desired to determine whether or not there is more output in that case. Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to @@ -320,8 +324,8 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); with the same value of the flush parameter and more output space (updated avail_out), until the flush is complete (deflate returns with non-zero avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that - avail_out is greater than six to avoid repeated flush markers due to - avail_out == 0 on return. + avail_out is greater than six when the flush marker begins, in order to avoid + repeated flush markers upon calling deflate() again when avail_out == 0. If the parameter flush is set to Z_FINISH, pending input is processed, pending output is flushed and deflate returns with Z_STREAM_END if there was @@ -360,7 +364,7 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); */ -ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +ZEXTERN int ZEXPORT deflateEnd(z_streamp strm); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending @@ -375,7 +379,7 @@ ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); /* -ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateInit(z_streamp strm); Initializes the internal stream state for decompression. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by @@ -383,7 +387,8 @@ ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); read or consumed. The allocation of a sliding window will be deferred to the first call of inflate (if the decompression does not complete on the first call). If zalloc and zfree are set to Z_NULL, inflateInit updates - them to use default allocation functions. + them to use default allocation functions. total_in, total_out, adler, and + msg are initialized. inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the @@ -397,7 +402,7 @@ ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); */ -ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +ZEXTERN int ZEXPORT inflate(z_streamp strm, int flush); /* inflate decompresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce @@ -440,7 +445,7 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); The Z_BLOCK option assists in appending to or combining deflate streams. To assist in this, on return inflate() always sets strm->data_type to the - number of unused bits in the last byte taken from strm->next_in, plus 64 if + number of unused bits in the input taken from strm->next_in, plus 64 if inflate() is currently decoding the last block in the deflate stream, plus 128 if inflate() returned immediately after decoding an end-of-block code or decoding the complete header up to just before the first byte of the deflate @@ -517,7 +522,7 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); */ -ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateEnd(z_streamp strm); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending @@ -535,16 +540,15 @@ ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); */ /* -ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, - int level, - int method, - int windowBits, - int memLevel, - int strategy)); +ZEXTERN int ZEXPORT deflateInit2(z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy); This is another version of deflateInit with more compression options. The - fields next_in, zalloc, zfree and opaque must be initialized before by the - caller. + fields zalloc, zfree and opaque must be initialized before by the caller. The method parameter is the compression method. It must be Z_DEFLATED in this version of the library. @@ -587,18 +591,21 @@ ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, The strategy parameter is used to tune the compression algorithm. Use the value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a - filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no - string match), or Z_RLE to limit match distances to one (run-length - encoding). Filtered data consists mostly of small values with a somewhat - random distribution. In this case, the compression algorithm is tuned to - compress them better. The effect of Z_FILTERED is to force more Huffman - coding and less string matching; it is somewhat intermediate between - Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as - fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The - strategy parameter only affects the compression ratio but not the - correctness of the compressed output even if it is not set appropriately. - Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler - decoder for special applications. + filter (or predictor), Z_RLE to limit match distances to one (run-length + encoding), or Z_HUFFMAN_ONLY to force Huffman encoding only (no string + matching). Filtered data consists mostly of small values with a somewhat + random distribution, as produced by the PNG filters. In this case, the + compression algorithm is tuned to compress them better. The effect of + Z_FILTERED is to force more Huffman coding and less string matching than the + default; it is intermediate between Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. + Z_RLE is almost as fast as Z_HUFFMAN_ONLY, but should give better + compression for PNG image data than Huffman only. The degree of string + matching from most to none is: Z_DEFAULT_STRATEGY, Z_FILTERED, Z_RLE, then + Z_HUFFMAN_ONLY. The strategy parameter affects the compression ratio but + never the correctness of the compressed output, even if it is not set + optimally for the given data. Z_FIXED uses the default string matching, but + prevents the use of dynamic Huffman codes, allowing for a simpler decoder + for special applications. deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid @@ -608,9 +615,9 @@ ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, compression: this will be done by deflate(). */ -ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); +ZEXTERN int ZEXPORT deflateSetDictionary(z_streamp strm, + const Bytef *dictionary, + uInt dictLength); /* Initializes the compression dictionary from the given byte sequence without producing any compressed output. When using the zlib format, this @@ -652,16 +659,16 @@ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, not perform any compression: this will be done by deflate(). */ -ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm, - Bytef *dictionary, - uInt *dictLength)); +ZEXTERN int ZEXPORT deflateGetDictionary(z_streamp strm, + Bytef *dictionary, + uInt *dictLength); /* Returns the sliding dictionary being maintained by deflate. dictLength is set to the number of bytes in the dictionary, and that many bytes are copied to dictionary. dictionary must have enough space, where 32768 bytes is always enough. If deflateGetDictionary() is called with dictionary equal to Z_NULL, then only the dictionary length is returned, and nothing is copied. - Similary, if dictLength is Z_NULL, then it is not set. + Similarly, if dictLength is Z_NULL, then it is not set. deflateGetDictionary() may return a length less than the window size, even when more than the window size in input has been provided. It may return up @@ -674,8 +681,8 @@ ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm, stream state is inconsistent. */ -ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, - z_streamp source)); +ZEXTERN int ZEXPORT deflateCopy(z_streamp dest, + z_streamp source); /* Sets the destination stream as a complete copy of the source stream. @@ -692,31 +699,32 @@ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, destination. */ -ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +ZEXTERN int ZEXPORT deflateReset(z_streamp strm); /* This function is equivalent to deflateEnd followed by deflateInit, but does not free and reallocate the internal compression state. The stream will leave the compression level and any other attributes that may have been - set unchanged. + set unchanged. total_in, total_out, adler, and msg are initialized. deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being Z_NULL). */ -ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, - int level, - int strategy)); +ZEXTERN int ZEXPORT deflateParams(z_streamp strm, + int level, + int strategy); /* Dynamically update the compression level and compression strategy. The interpretation of level and strategy is as in deflateInit2(). This can be used to switch between compression and straight copy of the input data, or to switch to a different kind of input data requiring a different strategy. If the compression approach (which is a function of the level) or the - strategy is changed, and if any input has been consumed in a previous - deflate() call, then the input available so far is compressed with the old - level and strategy using deflate(strm, Z_BLOCK). There are three approaches - for the compression levels 0, 1..3, and 4..9 respectively. The new level - and strategy will take effect at the next call of deflate(). + strategy is changed, and if there have been any deflate() calls since the + state was initialized or reset, then the input available so far is + compressed with the old level and strategy using deflate(strm, Z_BLOCK). + There are three approaches for the compression levels 0, 1..3, and 4..9 + respectively. The new level and strategy will take effect at the next call + of deflate(). If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does not have enough output space to complete, then the parameter change will not @@ -729,7 +737,7 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, Then no more input data should be provided before the deflateParams() call. If this is done, the old level and strategy will be applied to the data compressed before deflateParams(), and the new level and strategy will be - applied to the the data compressed after deflateParams(). + applied to the data compressed after deflateParams(). deflateParams returns Z_OK on success, Z_STREAM_ERROR if the source stream state was inconsistent or if a parameter was invalid, or Z_BUF_ERROR if @@ -740,11 +748,11 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, retried with more output space. */ -ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, - int good_length, - int max_lazy, - int nice_length, - int max_chain)); +ZEXTERN int ZEXPORT deflateTune(z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain); /* Fine tune deflate's internal compression parameters. This should only be used by someone who understands the algorithm used by zlib's deflate for @@ -757,8 +765,8 @@ ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. */ -ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, - uLong sourceLen)); +ZEXTERN uLong ZEXPORT deflateBound(z_streamp strm, uLong sourceLen); +ZEXTERN z_size_t ZEXPORT deflateBound_z(z_streamp strm, z_size_t sourceLen); /* deflateBound() returns an upper bound on the compressed size after deflation of sourceLen bytes. It must be called after deflateInit() or @@ -770,11 +778,14 @@ ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, to return Z_STREAM_END. Note that it is possible for the compressed size to be larger than the value returned by deflateBound() if flush options other than Z_FINISH or Z_NO_FLUSH are used. + + delfateBound_z() is the same, but takes and returns a size_t length. Note + that a long is 32 bits on Windows. */ -ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, - unsigned *pending, - int *bits)); +ZEXTERN int ZEXPORT deflatePending(z_streamp strm, + unsigned *pending, + int *bits); /* deflatePending() returns the number of bytes and bits of output that have been generated, but not yet provided in the available output. The bytes not @@ -784,12 +795,27 @@ ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, or bits are Z_NULL, then those values are not set. deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. If an int is 16 bits and memLevel is 9, then + it is possible for the number of pending bytes to not fit in an unsigned. In + that case Z_BUF_ERROR is returned and *pending is set to the maximum value + of an unsigned. + */ + +ZEXTERN int ZEXPORT deflateUsed(z_streamp strm, + int *bits); +/* + deflateUsed() returns in *bits the most recent number of deflate bits used + in the last byte when flushing to a byte boundary. The result is in 1..8, or + 0 if there has not yet been a flush. This helps determine the location of + the last bit of a deflate stream. + + deflateUsed returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ -ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, - int bits, - int value)); +ZEXTERN int ZEXPORT deflatePrime(z_streamp strm, + int bits, + int value); /* deflatePrime() inserts bits in the deflate output stream. The intent is that this function is used to start off the deflate output with the bits @@ -804,8 +830,8 @@ ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, source stream state was inconsistent. */ -ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, - gz_headerp head)); +ZEXTERN int ZEXPORT deflateSetHeader(z_streamp strm, + gz_headerp head); /* deflateSetHeader() provides gzip header information for when a gzip stream is requested by deflateInit2(). deflateSetHeader() may be called @@ -821,16 +847,17 @@ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, gzip file" and give up. If deflateSetHeader is not used, the default gzip header has text false, - the time set to zero, and os set to 255, with no extra, name, or comment - fields. The gzip header is returned to the default state by deflateReset(). + the time set to zero, and os set to the current operating system, with no + extra, name, or comment fields. The gzip header is returned to the default + state by deflateReset(). deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ /* -ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, - int windowBits)); +ZEXTERN int ZEXPORT inflateInit2(z_streamp strm, + int windowBits); This is another version of inflateInit with an extra parameter. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized @@ -865,9 +892,11 @@ ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, detection, or add 16 to decode only the gzip format (the zlib format will return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a CRC-32 instead of an Adler-32. Unlike the gunzip utility and gzread() (see - below), inflate() will not automatically decode concatenated gzip streams. - inflate() will return Z_STREAM_END at the end of the gzip stream. The state - would need to be reset to continue decoding a subsequent gzip stream. + below), inflate() will *not* automatically decode concatenated gzip members. + inflate() will return Z_STREAM_END at the end of the gzip member. The state + would need to be reset to continue decoding a subsequent gzip member. This + *must* be done if there is more data after a gzip member, in order for the + decompression to be compliant with the gzip standard (RFC 1952). inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the @@ -881,9 +910,9 @@ ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, deferred until inflate() is called. */ -ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); +ZEXTERN int ZEXPORT inflateSetDictionary(z_streamp strm, + const Bytef *dictionary, + uInt dictLength); /* Initializes the decompression dictionary from the given uncompressed byte sequence. This function must be called immediately after a call of inflate, @@ -904,22 +933,22 @@ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, inflate(). */ -ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, - Bytef *dictionary, - uInt *dictLength)); +ZEXTERN int ZEXPORT inflateGetDictionary(z_streamp strm, + Bytef *dictionary, + uInt *dictLength); /* Returns the sliding dictionary being maintained by inflate. dictLength is set to the number of bytes in the dictionary, and that many bytes are copied to dictionary. dictionary must have enough space, where 32768 bytes is always enough. If inflateGetDictionary() is called with dictionary equal to Z_NULL, then only the dictionary length is returned, and nothing is copied. - Similary, if dictLength is Z_NULL, then it is not set. + Similarly, if dictLength is Z_NULL, then it is not set. inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the stream state is inconsistent. */ -ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateSync(z_streamp strm); /* Skips invalid compressed data until a possible full flush point (see above for the description of deflate with Z_FULL_FLUSH) can be found, or until all @@ -932,14 +961,14 @@ ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); inflateSync returns Z_OK if a possible full flush point has been found, Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. - In the success case, the application may save the current current value of - total_in which indicates where valid compressed data was found. In the - error case, the application may repeatedly call inflateSync, providing more - input each time, until success or end of the input data. + In the success case, the application may save the current value of total_in + which indicates where valid compressed data was found. In the error case, + the application may repeatedly call inflateSync, providing more input each + time, until success or end of the input data. */ -ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, - z_streamp source)); +ZEXTERN int ZEXPORT inflateCopy(z_streamp dest, + z_streamp source); /* Sets the destination stream as a complete copy of the source stream. @@ -954,18 +983,19 @@ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, destination. */ -ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateReset(z_streamp strm); /* This function is equivalent to inflateEnd followed by inflateInit, but does not free and reallocate the internal decompression state. The stream will keep attributes that may have been set by inflateInit2. + total_in, total_out, adler, and msg are initialized. inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being Z_NULL). */ -ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, - int windowBits)); +ZEXTERN int ZEXPORT inflateReset2(z_streamp strm, + int windowBits); /* This function is the same as inflateReset, but it also permits changing the wrap and window size requests. The windowBits parameter is interpreted @@ -978,17 +1008,19 @@ ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, the windowBits parameter is invalid. */ -ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, - int bits, - int value)); +ZEXTERN int ZEXPORT inflatePrime(z_streamp strm, + int bits, + int value); /* - This function inserts bits in the inflate input stream. The intent is - that this function is used to start inflating at a bit position in the - middle of a byte. The provided bits will be used before any bytes are used - from next_in. This function should only be used with raw inflate, and - should be used before the first inflate() call after inflateInit2() or - inflateReset(). bits must be less than or equal to 16, and that many of the - least significant bits of value will be inserted in the input. + This function inserts bits in the inflate input stream. The intent is to + use inflatePrime() to start inflating at a bit position in the middle of a + byte. The provided bits will be used before any bytes are used from + next_in. This function should be used with raw inflate, before the first + inflate() call, after inflateInit2() or inflateReset(). It can also be used + after an inflate() return indicates the end of a deflate block or header + when using Z_BLOCK. bits must be less than or equal to 16, and that many of + the least significant bits of value will be inserted in the input. The + other bits in value can be non-zero, and will be ignored. If bits is negative, then the input stream bit buffer is emptied. Then inflatePrime() can be called again to put bits in the buffer. This is used @@ -996,10 +1028,18 @@ ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, to feeding inflate codes. inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. + stream state was inconsistent, or if bits is out of range. If inflate was + in the middle of processing a header, trailer, or stored block lengths, then + it is possible for there to be only eight bits available in the bit buffer. + In that case, bits > 8 is considered out of range. However, when used as + outlined above, there will always be 16 bits available in the buffer for + insertion. As noted in its documentation above, inflate records the number + of bits in the bit buffer on return in data_type. 32 minus that is the + number of bits available for insertion. inflatePrime does not update + data_type with the new number of bits in buffer. */ -ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); +ZEXTERN long ZEXPORT inflateMark(z_streamp strm); /* This function returns two values, one in the lower 16 bits of the return value, and the other in the remaining upper bits, obtained by shifting the @@ -1027,8 +1067,8 @@ ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); source stream state was inconsistent. */ -ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, - gz_headerp head)); +ZEXTERN int ZEXPORT inflateGetHeader(z_streamp strm, + gz_headerp head); /* inflateGetHeader() requests that gzip header information be stored in the provided gz_header structure. inflateGetHeader() may be called after @@ -1042,20 +1082,22 @@ ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, The text, time, xflags, and os fields are filled in with the gzip header contents. hcrc is set to true if there is a header CRC. (The header CRC - was valid if done is set to one.) If extra is not Z_NULL, then extra_max - contains the maximum number of bytes to write to extra. Once done is true, - extra_len contains the actual extra field length, and extra contains the - extra field, or that field truncated if extra_max is less than extra_len. - If name is not Z_NULL, then up to name_max characters are written there, - terminated with a zero unless the length is greater than name_max. If - comment is not Z_NULL, then up to comm_max characters are written there, - terminated with a zero unless the length is greater than comm_max. When any - of extra, name, or comment are not Z_NULL and the respective field is not - present in the header, then that field is set to Z_NULL to signal its - absence. This allows the use of deflateSetHeader() with the returned - structure to duplicate the header. However if those fields are set to - allocated memory, then the application will need to save those pointers - elsewhere so that they can be eventually freed. + was valid if done is set to one.) The extra, name, and comment pointers + much each be either Z_NULL or point to space to store that information from + the header. If extra is not Z_NULL, then extra_max contains the maximum + number of bytes that can be written to extra. Once done is true, extra_len + contains the actual extra field length, and extra contains the extra field, + or that field truncated if extra_max is less than extra_len. If name is not + Z_NULL, then up to name_max characters, including the terminating zero, are + written there. If comment is not Z_NULL, then up to comm_max characters, + including the terminating zero, are written there. The application can tell + that the name or comment did not fit in the provided space by the absence of + a terminating zero. If any of extra, name, or comment are not present in + the header, then that field's pointer is set to Z_NULL. This allows the use + of deflateSetHeader() with the returned structure to duplicate the header. + Note that if those fields initially pointed to allocated memory, then the + application will need to save them elsewhere so that they can be eventually + freed. If inflateGetHeader is not used, then the header information is simply discarded. The header is always checked for validity, including the header @@ -1068,8 +1110,8 @@ ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, */ /* -ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, - unsigned char FAR *window)); +ZEXTERN int ZEXPORT inflateBackInit(z_streamp strm, int windowBits, + unsigned char FAR *window); Initialize the internal stream state for decompression using inflateBack() calls. The fields zalloc, zfree and opaque in strm must be initialized @@ -1089,13 +1131,13 @@ ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, the version of the header file. */ -typedef unsigned (*in_func) OF((void FAR *, - z_const unsigned char FAR * FAR *)); -typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); +typedef unsigned (*in_func)(void FAR *, + z_const unsigned char FAR * FAR *); +typedef int (*out_func)(void FAR *, unsigned char FAR *, unsigned); -ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, - in_func in, void FAR *in_desc, - out_func out, void FAR *out_desc)); +ZEXTERN int ZEXPORT inflateBack(z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc); /* inflateBack() does a raw inflate with a single call using a call-back interface for input and output. This is potentially more efficient than @@ -1163,7 +1205,7 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, cannot return Z_OK. */ -ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateBackEnd(z_streamp strm); /* All memory allocated by inflateBackInit() is freed. @@ -1171,7 +1213,7 @@ ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); state was inconsistent. */ -ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +ZEXTERN uLong ZEXPORT zlibCompileFlags(void); /* Return flags indicating compile-time options. Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: @@ -1203,13 +1245,14 @@ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); 21: FASTEST -- deflate algorithm with only one, lowest compression level 22,23: 0 (reserved) - The sprintf variant used by gzprintf (zero is best): + The sprintf variant used by gzprintf (all zeros is best): 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format - 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() is not secure! 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + 27: 0 = gzprintf() present, 1 = not -- 1 means gzprintf() returns an error Remainder: - 27-31: 0 (reserved) + 28-31: 0 (reserved) */ #ifndef Z_SOLO @@ -1221,11 +1264,14 @@ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); stream-oriented functions. To simplify the interface, some default options are assumed (compression level and memory usage, standard memory allocation functions). The source code of these utility functions can be modified if - you need special options. + you need special options. The _z versions of the functions use the size_t + type for lengths. Note that a long is 32 bits on Windows. */ -ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); +ZEXTERN int ZEXPORT compress(Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen); +ZEXTERN int ZEXPORT compress_z(Bytef *dest, z_size_t *destLen, + const Bytef *source, z_size_t sourceLen); /* Compresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size @@ -1239,9 +1285,12 @@ ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, buffer. */ -ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen, - int level)); +ZEXTERN int ZEXPORT compress2(Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level); +ZEXTERN int ZEXPORT compress2_z(Bytef *dest, z_size_t *destLen, + const Bytef *source, z_size_t sourceLen, + int level); /* Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte @@ -1255,22 +1304,25 @@ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, Z_STREAM_ERROR if the level parameter is invalid. */ -ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +ZEXTERN uLong ZEXPORT compressBound(uLong sourceLen); +ZEXTERN z_size_t ZEXPORT compressBound_z(z_size_t sourceLen); /* compressBound() returns an upper bound on the compressed size after compress() or compress2() on sourceLen bytes. It would be used before a compress() or compress2() call to allocate the destination buffer. */ -ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); +ZEXTERN int ZEXPORT uncompress(Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen); +ZEXTERN int ZEXPORT uncompress_z(Bytef *dest, z_size_t *destLen, + const Bytef *source, z_size_t sourceLen); /* Decompresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total size + the byte length of the source buffer. On entry, *destLen is the total size of the destination buffer, which must be large enough to hold the entire uncompressed data. (The size of the uncompressed data must have been saved previously by the compressor and transmitted to the decompressor by some - mechanism outside the scope of this compression library.) Upon exit, destLen + mechanism outside the scope of this compression library.) On exit, *destLen is the actual size of the uncompressed data. uncompress returns Z_OK if success, Z_MEM_ERROR if there was not @@ -1280,8 +1332,10 @@ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, buffer with the uncompressed data up to that point. */ -ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong *sourceLen)); +ZEXTERN int ZEXPORT uncompress2(Bytef *dest, uLongf *destLen, + const Bytef *source, uLong *sourceLen); +ZEXTERN int ZEXPORT uncompress2_z(Bytef *dest, z_size_t *destLen, + const Bytef *source, z_size_t *sourceLen); /* Same as uncompress, except that sourceLen is a pointer, where the length of the source is *sourceLen. On return, *sourceLen is the number of @@ -1300,22 +1354,26 @@ ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen, typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ /* -ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); +ZEXTERN gzFile ZEXPORT gzopen(const char *path, const char *mode); - Opens a gzip (.gz) file for reading or writing. The mode parameter is as - in fopen ("rb" or "wb") but can also include a compression level ("wb9") or - a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only - compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' - for fixed code compression as in "wb9F". (See the description of - deflateInit2 for more information about the strategy parameter.) 'T' will - request transparent writing or appending with no compression and not using - the gzip format. + Open the gzip (.gz) file at path for reading and decompressing, or + compressing and writing. The mode parameter is as in fopen ("rb" or "wb") + but can also include a compression level ("wb9") or a strategy: 'f' for + filtered data as in "wb6f", 'h' for Huffman-only compression as in "wb1h", + 'R' for run-length encoding as in "wb1R", or 'F' for fixed code compression + as in "wb9F". (See the description of deflateInit2 for more information + about the strategy parameter.) 'T' will request transparent writing or + appending with no compression and not using the gzip format. 'T' cannot be + used to force transparent reading. Transparent reading is automatically + performed if there is no gzip header at the start. Transparent reading can + be disabled with the 'G' option, which will instead return an error if there + is no gzip header. 'N' will open the file in non-blocking mode. - "a" can be used instead of "w" to request that the gzip stream that will - be written be appended to the file. "+" will result in an error, since + 'a' can be used instead of 'w' to request that the gzip stream that will + be written be appended to the file. '+' will result in an error, since reading and writing to the same gzip file is not supported. The addition of - "x" when writing will create the file exclusively, which fails if the file - already exists. On systems that support it, the addition of "e" when + 'x' when writing will create the file exclusively, which fails if the file + already exists. On systems that support it, the addition of 'e' when reading or writing will set the flag to close the file on an execve() call. These functions, as well as gzip, will read and decode a sequence of gzip @@ -1334,14 +1392,22 @@ ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); insufficient memory to allocate the gzFile state, or if an invalid mode was specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). errno can be checked to determine if the reason gzopen failed was that the - file could not be opened. + file could not be opened. Note that if 'N' is in mode for non-blocking, the + open() itself can fail in order to not block. In that case gzopen() will + return NULL and errno will be EAGAIN or ENONBLOCK. The call to gzopen() can + then be re-tried. If the application would like to block on opening the + file, then it can use open() without O_NONBLOCK, and then gzdopen() with the + resulting file descriptor and 'N' in the mode, which will set it to non- + blocking. */ -ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +ZEXTERN gzFile ZEXPORT gzdopen(int fd, const char *mode); /* - gzdopen associates a gzFile with the file descriptor fd. File descriptors - are obtained from calls like open, dup, creat, pipe or fileno (if the file - has been previously opened with fopen). The mode parameter is as in gzopen. + Associate a gzFile with the file descriptor fd. File descriptors are + obtained from calls like open, dup, creat, pipe or fileno (if the file has + been previously opened with fopen). The mode parameter is as in gzopen. An + 'e' in mode will set fd's flag to close the file on an execve() call. An 'N' + in mode will set fd's non-blocking flag. The next call of gzclose on the returned gzFile will also close the file descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor @@ -1360,15 +1426,15 @@ ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); will not detect if fd is invalid (unless fd is -1). */ -ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); +ZEXTERN int ZEXPORT gzbuffer(gzFile file, unsigned size); /* - Set the internal buffer size used by this library's functions. The - default buffer size is 8192 bytes. This function must be called after - gzopen() or gzdopen(), and before any other calls that read or write the - file. The buffer memory allocation is always deferred to the first read or - write. Three times that size in buffer space is allocated. A larger buffer - size of, for example, 64K or 128K bytes will noticeably increase the speed - of decompression (reading). + Set the internal buffer size used by this library's functions for file to + size. The default buffer size is 8192 bytes. This function must be called + after gzopen() or gzdopen(), and before any other calls that read or write + the file. The buffer memory allocation is always deferred to the first read + or write. Three times that size in buffer space is allocated. A larger + buffer size of, for example, 64K or 128K bytes will noticeably increase the + speed of decompression (reading). The new buffer size also affects the maximum length for gzprintf(). @@ -1376,20 +1442,20 @@ ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); too late. */ -ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +ZEXTERN int ZEXPORT gzsetparams(gzFile file, int level, int strategy); /* - Dynamically update the compression level or strategy. See the description - of deflateInit2 for the meaning of these parameters. Previously provided - data is flushed before the parameter change. + Dynamically update the compression level and strategy for file. See the + description of deflateInit2 for the meaning of these parameters. Previously + provided data is flushed before applying the parameter changes. gzsetparams returns Z_OK if success, Z_STREAM_ERROR if the file was not opened for writing, Z_ERRNO if there is an error writing the flushed data, or Z_MEM_ERROR if there is a memory allocation error. */ -ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +ZEXTERN int ZEXPORT gzread(gzFile file, voidp buf, unsigned len); /* - Reads the given number of uncompressed bytes from the compressed file. If + Read and decompress up to len uncompressed bytes from file into buf. If the input file is not in gzip format, gzread copies the given number of bytes into the buffer directly from the file. @@ -1411,20 +1477,26 @@ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); stream. Alternatively, gzerror can be used before gzclose to detect this case. + gzread can be used to read a gzip file on a non-blocking device. If the + input stalls and there is no uncompressed data to return, then gzread() will + return -1, and errno will be EAGAIN or EWOULDBLOCK. gzread() can then be + called again. + gzread returns the number of uncompressed bytes actually read, less than len for end of file, or -1 for error. If len is too large to fit in an int, then nothing is read, -1 is returned, and the error state is set to - Z_STREAM_ERROR. + Z_STREAM_ERROR. If some data was read before an error, then that data is + returned until exhausted, after which the next call will signal the error. */ -ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, - gzFile file)); +ZEXTERN z_size_t ZEXPORT gzfread(voidp buf, z_size_t size, z_size_t nitems, + gzFile file); /* - Read up to nitems items of size size from file to buf, otherwise operating - as gzread() does. This duplicates the interface of stdio's fread(), with - size_t request and return types. If the library defines size_t, then - z_size_t is identical to size_t. If not, then z_size_t is an unsigned - integer type that can contain a pointer. + Read and decompress up to nitems items of size size from file into buf, + otherwise operating as gzread() does. This duplicates the interface of + stdio's fread(), with size_t request and return types. If the library + defines size_t, then z_size_t is identical to size_t. If not, then z_size_t + is an unsigned integer type that can contain a pointer. gzfread() returns the number of full items read of size size, or zero if the end of the file was reached and a full item could not be read, or if @@ -1435,26 +1507,29 @@ ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, In the event that the end of file is reached and only a partial item is available at the end, i.e. the remaining uncompressed data length is not a - multiple of size, then the final partial item is nevetheless read into buf + multiple of size, then the final partial item is nevertheless read into buf and the end-of-file flag is set. The length of the partial item read is not provided, but could be inferred from the result of gztell(). This behavior - is the same as the behavior of fread() implementations in common libraries, - but it prevents the direct use of gzfread() to read a concurrently written - file, reseting and retrying on end-of-file, when size is not 1. + is the same as that of fread() implementations in common libraries. This + could result in data loss if used with size != 1 when reading a concurrently + written file or a non-blocking file. In that case, use size == 1 or gzread() + instead. */ -ZEXTERN int ZEXPORT gzwrite OF((gzFile file, - voidpc buf, unsigned len)); +ZEXTERN int ZEXPORT gzwrite(gzFile file, voidpc buf, unsigned len); /* - Writes the given number of uncompressed bytes into the compressed file. - gzwrite returns the number of uncompressed bytes written or 0 in case of - error. + Compress and write the len uncompressed bytes at buf to file. gzwrite + returns the number of uncompressed bytes written, or 0 in case of error or + if len is 0. If the write destination is non-blocking, then gzwrite() may + return a number of bytes written that is not 0 and less than len. + + If len does not fit in an int, then 0 is returned and nothing is written. */ -ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, - z_size_t nitems, gzFile file)); +ZEXTERN z_size_t ZEXPORT gzfwrite(voidpc buf, z_size_t size, + z_size_t nitems, gzFile file); /* - gzfwrite() writes nitems items of size size from buf to file, duplicating + Compress and write nitems items of size size from buf to file, duplicating the interface of stdio's fwrite(), with size_t request and return types. If the library defines size_t, then z_size_t is identical to size_t. If not, then z_size_t is an unsigned integer type that can contain a pointer. @@ -1463,76 +1538,117 @@ ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, if there was an error. If the multiplication of size and nitems overflows, i.e. the product does not fit in a z_size_t, then nothing is written, zero is returned, and the error state is set to Z_STREAM_ERROR. + + If writing a concurrently read file or a non-blocking file with size != 1, + a partial item could be written, with no way of knowing how much of it was + not written, resulting in data loss. In that case, use size == 1 or + gzwrite() instead. */ -ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +ZEXTERN int ZEXPORTVA gzprintf(gzFile file, const char *format, ...); +#else +ZEXTERN int ZEXPORTVA gzprintf(); +#endif /* - Converts, formats, and writes the arguments to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of + Convert, format, compress, and write the arguments (...) to file under + control of the string format, as in fprintf. gzprintf returns the number of uncompressed bytes actually written, or a negative zlib error code in case of error. The number of uncompressed bytes written is limited to 8191, or one less than the buffer size given to gzbuffer(). The caller should assure that this limit is not exceeded. If it is exceeded, then gzprintf() will - return an error (0) with nothing written. In this case, there may also be a - buffer overflow with unpredictable consequences, which is possible only if - zlib was compiled with the insecure functions sprintf() or vsprintf() - because the secure snprintf() or vsnprintf() functions were not available. - This can be determined using zlibCompileFlags(). + return an error (0) with nothing written. + + In that last case, there may also be a buffer overflow with unpredictable + consequences, which is possible only if zlib was compiled with the insecure + functions sprintf() or vsprintf(), because the secure snprintf() and + vsnprintf() functions were not available. That would only be the case for + a non-ANSI C compiler. zlib may have been built without gzprintf() because + secure functions were not available and having gzprintf() be insecure was + not an option, in which case, gzprintf() returns Z_STREAM_ERROR. All of + these possibilities can be determined using zlibCompileFlags(). + + If a Z_BUF_ERROR is returned, then nothing was written due to a stall on + the non-blocking write destination. */ -ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +ZEXTERN int ZEXPORT gzputs(gzFile file, const char *s); /* - Writes the given null-terminated string to the compressed file, excluding + Compress and write the given null-terminated string s to file, excluding the terminating null character. gzputs returns the number of characters written, or -1 in case of error. + The number of characters written may be less than the length of the string + if the write destination is non-blocking. + + If the length of the string does not fit in an int, then -1 is returned + and nothing is written. */ -ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +ZEXTERN char * ZEXPORT gzgets(gzFile file, char *buf, int len); /* - Reads bytes from the compressed file until len-1 characters are read, or a - newline character is read and transferred to buf, or an end-of-file - condition is encountered. If any characters are read or if len == 1, the - string is terminated with a null character. If no characters are read due - to an end-of-file or len < 1, then the buffer is left untouched. + Read and decompress bytes from file into buf, until len-1 characters are + read, or until a newline character is read and transferred to buf, or an + end-of-file condition is encountered. If any characters are read or if len + is one, the string is terminated with a null character. If no characters + are read due to an end-of-file or len is less than one, then the buffer is + left untouched. gzgets returns buf which is a null-terminated string, or it returns NULL - for end-of-file or in case of error. If there was an error, the contents at - buf are indeterminate. + for end-of-file or in case of error. If some data was read before an error, + then that data is returned until exhausted, after which the next call will + return NULL to signal the error. + + gzgets can be used on a file being concurrently written, and on a non- + blocking device, both as for gzread(). However lines may be broken in the + middle, leaving it up to the application to reassemble them as needed. */ -ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +ZEXTERN int ZEXPORT gzputc(gzFile file, int c); /* - Writes c, converted to an unsigned char, into the compressed file. gzputc + Compress and write c, converted to an unsigned char, into file. gzputc returns the value that was written, or -1 in case of error. */ -ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +ZEXTERN int ZEXPORT gzgetc(gzFile file); /* - Reads one byte from the compressed file. gzgetc returns this byte or -1 - in case of end of file or error. This is implemented as a macro for speed. - As such, it does not do all of the checking the other functions do. I.e. - it does not check to see if file is NULL, nor whether the structure file - points to has been clobbered or not. + Read and decompress one byte from file. gzgetc returns this byte or -1 in + case of end of file or error. If some data was read before an error, then + that data is returned until exhausted, after which the next call will return + -1 to signal the error. + + This is implemented as a macro for speed. As such, it does not do all of + the checking the other functions do. I.e. it does not check to see if file + is NULL, nor whether the structure file points to has been clobbered or not. + + gzgetc can be used to read a gzip file on a non-blocking device. If the + input stalls and there is no uncompressed data to return, then gzgetc() will + return -1, and errno will be EAGAIN or EWOULDBLOCK. gzread() can then be + called again. */ -ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +ZEXTERN int ZEXPORT gzungetc(int c, gzFile file); /* - Push one character back onto the stream to be read as the first character - on the next read. At least one character of push-back is allowed. + Push c back onto the stream for file to be read as the first character on + the next read. At least one character of push-back is always allowed. gzungetc() returns the character pushed, or -1 on failure. gzungetc() will fail if c is -1, and may fail if a character has been pushed but not read yet. If gzungetc is used immediately after gzopen or gzdopen, at least the output buffer size of pushed characters is allowed. (See gzbuffer above.) The pushed character will be discarded if the stream is repositioned with gzseek() or gzrewind(). + + gzungetc(-1, file) will force any pending seek to execute. Then gztell() + will report the position, even if the requested seek reached end of file. + This can be used to determine the number of uncompressed bytes in a gzip + file without having to read it into a buffer. */ -ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +ZEXTERN int ZEXPORT gzflush(gzFile file, int flush); /* - Flushes all pending output into the compressed file. The parameter flush - is as in the deflate() function. The return value is the zlib error number - (see function gzerror below). gzflush is only permitted when writing. + Flush all pending output to file. The parameter flush is as in the + deflate() function. The return value is the zlib error number (see function + gzerror below). gzflush is only permitted when writing. If the flush parameter is Z_FINISH, the remaining data is written and the gzip stream is completed in the output. If gzwrite() is called again, a new @@ -1544,18 +1660,19 @@ ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); */ /* -ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, - z_off_t offset, int whence)); +ZEXTERN z_off_t ZEXPORT gzseek(gzFile file, + z_off_t offset, int whence); - Sets the starting position for the next gzread or gzwrite on the given - compressed file. The offset represents a number of bytes in the + Set the starting position to offset relative to whence for the next gzread + or gzwrite on file. The offset represents a number of bytes in the uncompressed data stream. The whence parameter is defined as in lseek(2); the value SEEK_END is not supported. If the file is opened for reading, this function is emulated but can be extremely slow. If the file is opened for writing, only forward seeks are supported; gzseek then compresses a sequence of zeroes up to the new - starting position. + starting position. For reading or writing, any actual seeking is deferred + until the next read or write operation, or close operation when writing. gzseek returns the resulting offset location as measured in bytes from the beginning of the uncompressed stream, or -1 in case of error, in @@ -1563,52 +1680,52 @@ ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, would be before the current position. */ -ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +ZEXTERN int ZEXPORT gzrewind(gzFile file); /* - Rewinds the given file. This function is supported only for reading. + Rewind file. This function is supported only for reading. - gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET). */ /* -ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); +ZEXTERN z_off_t ZEXPORT gztell(gzFile file); - Returns the starting position for the next gzread or gzwrite on the given - compressed file. This position represents a number of bytes in the - uncompressed data stream, and is zero when starting, even if appending or - reading a gzip stream from the middle of a file using gzdopen(). + Return the starting position for the next gzread or gzwrite on file. + This position represents a number of bytes in the uncompressed data stream, + and is zero when starting, even if appending or reading a gzip stream from + the middle of a file using gzdopen(). gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) */ /* -ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); +ZEXTERN z_off_t ZEXPORT gzoffset(gzFile file); - Returns the current offset in the file being read or written. This offset - includes the count of bytes that precede the gzip stream, for example when - appending or when using gzdopen() for reading. When reading, the offset - does not include as yet unused buffered input. This information can be used - for a progress indicator. On error, gzoffset() returns -1. + Return the current compressed (actual) read or write offset of file. This + offset includes the count of bytes that precede the gzip stream, for example + when appending or when using gzdopen() for reading. When reading, the + offset does not include as yet unused buffered input. This information can + be used for a progress indicator. On error, gzoffset() returns -1. */ -ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +ZEXTERN int ZEXPORT gzeof(gzFile file); /* - Returns true (1) if the end-of-file indicator has been set while reading, - false (0) otherwise. Note that the end-of-file indicator is set only if the - read tried to go past the end of the input, but came up short. Therefore, - just like feof(), gzeof() may return false even if there is no more data to - read, in the event that the last read request was for the exact number of - bytes remaining in the input file. This will happen if the input file size - is an exact multiple of the buffer size. + Return true (1) if the end-of-file indicator for file has been set while + reading, false (0) otherwise. Note that the end-of-file indicator is set + only if the read tried to go past the end of the input, but came up short. + Therefore, just like feof(), gzeof() may return false even if there is no + more data to read, in the event that the last read request was for the exact + number of bytes remaining in the input file. This will happen if the input + file size is an exact multiple of the buffer size. If gzeof() returns true, then the read functions will return no more data, unless the end-of-file indicator is reset by gzclearerr() and the input file has grown since the previous end of file was detected. */ -ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +ZEXTERN int ZEXPORT gzdirect(gzFile file); /* - Returns true (1) if file is being copied directly while reading, or false + Return true (1) if file is being copied directly while reading, or false (0) if file is a gzip stream being decompressed. If the input file is empty, gzdirect() will return true, since the input @@ -1616,8 +1733,11 @@ ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); If gzdirect() is used immediately after gzopen() or gzdopen() it will cause buffers to be allocated to allow reading the file to determine if it - is a gzip file. Therefore if gzbuffer() is used, it should be called before - gzdirect(). + is a gzip file. Therefore if gzbuffer() is used, it should be called before + gzdirect(). If the input is being written concurrently or the device is non- + blocking, then gzdirect() may give a different answer once four bytes of + input have been accumulated, which is what is needed to confirm or deny a + gzip header. Before this, gzdirect() will return true (1). When writing, gzdirect() returns true (1) if transparent writing was requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note: @@ -1627,10 +1747,10 @@ ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); gzip file reading and decompression, which may not be desired.) */ -ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose(gzFile file); /* - Flushes all pending output if necessary, closes the compressed file and - deallocates the (de)compression state. Note that once file is closed, you + Flush all pending output for file, if necessary, close file and + deallocate the (de)compression state. Note that once file is closed, you cannot call gzerror with file, since its structures have been deallocated. gzclose must not be called more than once on the same file, just as free must not be called more than once on the same allocation. @@ -1640,8 +1760,8 @@ ZEXTERN int ZEXPORT gzclose OF((gzFile file)); last read ended in the middle of a gzip stream, or Z_OK on success. */ -ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); -ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_r(gzFile file); +ZEXTERN int ZEXPORT gzclose_w(gzFile file); /* Same as gzclose(), but gzclose_r() is only for use when reading, and gzclose_w() is only for use when writing or appending. The advantage to @@ -1652,12 +1772,13 @@ ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); zlib library. */ -ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +ZEXTERN const char * ZEXPORT gzerror(gzFile file, int *errnum); /* - Returns the error message for the last error which occurred on the given - compressed file. errnum is set to zlib error number. If an error occurred - in the file system and not in the compression library, errnum is set to - Z_ERRNO and the application may consult errno to get the exact error code. + Return the error message for the last error which occurred on file. + If errnum is not NULL, *errnum is set to zlib error number. If an error + occurred in the file system and not in the compression library, *errnum is + set to Z_ERRNO and the application may consult errno to get the exact error + code. The application must not modify the returned string. Future calls to this function may invalidate the previously returned string. If file is @@ -1668,9 +1789,9 @@ ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); functions above that do not distinguish those cases in their return values. */ -ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +ZEXTERN void ZEXPORT gzclearerr(gzFile file); /* - Clears the error and end-of-file flags for file. This is analogous to the + Clear the error and end-of-file flags for file. This is analogous to the clearerr() function in stdio. This is useful for continuing to read a gzip file that is being written concurrently. */ @@ -1685,11 +1806,12 @@ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); library. */ -ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +ZEXTERN uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len); /* Update a running Adler-32 checksum with the bytes buf[0..len-1] and - return the updated checksum. If buf is Z_NULL, this function returns the - required initial value for the checksum. + return the updated checksum. An Adler-32 value is in the range of a 32-bit + unsigned integer. If buf is Z_NULL, this function returns the required + initial value for the checksum. An Adler-32 checksum is almost as reliable as a CRC-32 but can be computed much faster. @@ -1704,15 +1826,16 @@ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); if (adler != original_adler) error(); */ -ZEXTERN uLong ZEXPORT adler32_z OF((uLong adler, const Bytef *buf, - z_size_t len)); +ZEXTERN uLong ZEXPORT adler32_z(uLong adler, const Bytef *buf, + z_size_t len); /* - Same as adler32(), but with a size_t length. + Same as adler32(), but with a size_t length. Note that a long is 32 bits + on Windows. */ /* -ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, - z_off_t len2)); +ZEXTERN uLong ZEXPORT adler32_combine(uLong adler1, uLong adler2, + z_off_t len2); Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for @@ -1722,12 +1845,13 @@ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, negative, the result has no meaning or utility. */ -ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +ZEXTERN uLong ZEXPORT crc32(uLong crc, const Bytef *buf, uInt len); /* Update a running CRC-32 with the bytes buf[0..len-1] and return the - updated CRC-32. If buf is Z_NULL, this function returns the required - initial value for the crc. Pre- and post-conditioning (one's complement) is - performed within this function so it shouldn't be done by the application. + updated CRC-32. A CRC-32 value is in the range of a 32-bit unsigned integer. + If buf is Z_NULL, this function returns the required initial value for the + crc. Pre- and post-conditioning (one's complement) is performed within this + function so it shouldn't be done by the application. Usage example: @@ -1739,20 +1863,35 @@ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); if (crc != original_crc) error(); */ -ZEXTERN uLong ZEXPORT crc32_z OF((uLong adler, const Bytef *buf, - z_size_t len)); +ZEXTERN uLong ZEXPORT crc32_z(uLong crc, const Bytef *buf, + z_size_t len); /* - Same as crc32(), but with a size_t length. + Same as crc32(), but with a size_t length. Note that a long is 32 bits on + Windows. */ /* -ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); +ZEXTERN uLong ZEXPORT crc32_combine(uLong crc1, uLong crc2, z_off_t len2); Combine two CRC-32 check values into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, CRC-32 check values were calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and - len2. + len2. len2 must be non-negative, otherwise zero is returned. +*/ + +/* +ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t len2); + + Return the operator corresponding to length len2, to be used with + crc32_combine_op(). len2 must be non-negative, otherwise zero is returned. +*/ + +ZEXTERN uLong ZEXPORT crc32_combine_op(uLong crc1, uLong crc2, uLong op); +/* + Give the same result as crc32_combine(), using op in place of len2. op is + is generated from len2 by crc32_combine_gen(). This will be faster than + crc32_combine() if the generated op is used more than once. */ @@ -1761,20 +1900,20 @@ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); /* deflateInit and inflateInit are macros to allow checking the zlib version * and the compiler's view of z_stream: */ -ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, - int windowBits, int memLevel, - int strategy, const char *version, - int stream_size)); -ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, - unsigned char FAR *window, - const char *version, - int stream_size)); +ZEXTERN int ZEXPORT deflateInit_(z_streamp strm, int level, + const char *version, int stream_size); +ZEXTERN int ZEXPORT inflateInit_(z_streamp strm, + const char *version, int stream_size); +ZEXTERN int ZEXPORT deflateInit2_(z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size); +ZEXTERN int ZEXPORT inflateInit2_(z_streamp strm, int windowBits, + const char *version, int stream_size); +ZEXTERN int ZEXPORT inflateBackInit_(z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size); #ifdef Z_PREFIX_SET # define z_deflateInit(strm, level) \ deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) @@ -1819,7 +1958,7 @@ struct gzFile_s { unsigned char *next; z_off64_t pos; }; -ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ +ZEXTERN int ZEXPORT gzgetc_(gzFile file); /* backward compatibility */ #ifdef Z_PREFIX_SET # undef z_gzgetc # define z_gzgetc(g) \ @@ -1836,12 +1975,13 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ * without large file support, _LFS64_LARGEFILE must also be true */ #ifdef Z_LARGE64 - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); - ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); + ZEXTERN gzFile ZEXPORT gzopen64(const char *, const char *); + ZEXTERN z_off64_t ZEXPORT gzseek64(gzFile, z_off64_t, int); + ZEXTERN z_off64_t ZEXPORT gztell64(gzFile); + ZEXTERN z_off64_t ZEXPORT gzoffset64(gzFile); + ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off64_t); + ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off64_t); + ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off64_t); #endif #if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) @@ -1852,6 +1992,7 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ # define z_gzoffset z_gzoffset64 # define z_adler32_combine z_adler32_combine64 # define z_crc32_combine z_crc32_combine64 +# define z_crc32_combine_gen z_crc32_combine_gen64 # else # define gzopen gzopen64 # define gzseek gzseek64 @@ -1859,49 +2000,53 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ # define gzoffset gzoffset64 # define adler32_combine adler32_combine64 # define crc32_combine crc32_combine64 +# define crc32_combine_gen crc32_combine_gen64 # endif # ifndef Z_LARGE64 - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); - ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN gzFile ZEXPORT gzopen64(const char *, const char *); + ZEXTERN z_off_t ZEXPORT gzseek64(gzFile, z_off_t, int); + ZEXTERN z_off_t ZEXPORT gztell64(gzFile); + ZEXTERN z_off_t ZEXPORT gzoffset64(gzFile); + ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off64_t); + ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off64_t); + ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off64_t); # endif #else - ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); - ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); - ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); - ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN gzFile ZEXPORT gzopen(const char *, const char *); + ZEXTERN z_off_t ZEXPORT gzseek(gzFile, z_off_t, int); + ZEXTERN z_off_t ZEXPORT gztell(gzFile); + ZEXTERN z_off_t ZEXPORT gzoffset(gzFile); + ZEXTERN uLong ZEXPORT adler32_combine(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t); #endif #else /* Z_SOLO */ - ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT adler32_combine(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t); #endif /* !Z_SOLO */ /* undocumented functions */ -ZEXTERN const char * ZEXPORT zError OF((int)); -ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); -ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); -ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); -ZEXTERN int ZEXPORT inflateValidate OF((z_streamp, int)); -ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF ((z_streamp)); -ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); -ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); -#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(Z_SOLO) -ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, - const char *mode)); +ZEXTERN const char * ZEXPORT zError(int); +ZEXTERN int ZEXPORT inflateSyncPoint(z_streamp); +ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table(void); +ZEXTERN int ZEXPORT inflateUndermine(z_streamp, int); +ZEXTERN int ZEXPORT inflateValidate(z_streamp, int); +ZEXTERN unsigned long ZEXPORT inflateCodesUsed(z_streamp); +ZEXTERN int ZEXPORT inflateResetKeep(z_streamp); +ZEXTERN int ZEXPORT deflateResetKeep(z_streamp); +#if defined(_WIN32) && !defined(Z_SOLO) +ZEXTERN gzFile ZEXPORT gzopen_w(const wchar_t *path, + const char *mode); #endif #if defined(STDC) || defined(Z_HAVE_STDARG_H) # ifndef Z_SOLO -ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file, - const char *format, - va_list va)); +ZEXTERN int ZEXPORTVA gzvprintf(gzFile file, + const char *format, + va_list va); # endif #endif diff --git a/rSDK/Lib/zlib.lib b/rSDK/Lib/zlib.lib index 9d76f3d1948eb6e27f35b37c156283ca2862fdfa..5e7f3e3499be2e68c568df6310c28fd0494c7124 100644 GIT binary patch literal 344806 zcmeFa34D~*-8OvBOcKIOU=j$MAVdU3QMLfG36q^Ii?UXM5Rwc;Ac;hw<61j-;83NU?X)cGF3ak1^u*+d$(9u^r;WC( z<4BwRh}BG<-p{gWdEtGQ?SEO?+udy$Ic>LPKN)h%YRmo$q@&j`>pvoceJsZfRVPKp z{HB|AJQ?elVMUd_=2@{JIc7{@hNp1AfQ-C?y!5oO86Jg?wRuy)u3l>xq zQ{k;DEd^arHYWpdgU{Iuisn{JWU7pzRah$`UR7ERgOGYqGfm;La4mI(C1uq$g~b&m z@St!(Y5Clmd0JOfRams3Y;HLWp!6=Nt)5pnr>q9fhv^Z*`4T8AFRPKN>Y9qG(vreC zA+s7pWvMO|={cT>=@Z7~jhj$_+*$-bMD|zL6qOevO&J!G;_11b?Ck7`1?lM-A>IXL zHKkQW3&sqT;f=JC@5#z2$W24h30Yw*rSmlv6=Q~Yi;y>Sii+oZtirN#?}DP5(n4=h zHNvlT#TAuHtIFoi3xm96OG-;Z95qEKVJ1$Qo`Ufi>EkjpLw<_*j~P<4v@$F{S)Q!i z{G5!5Ir$;R#bxCs6^q9VsV-aAj58-cZ^Fc^f?UtM(xMWUrsAq%l>M^mg+(>R^FnEq z?a9p=myAAV%a?-+?O~9KokN2ccM2_a?=6h<(=a*M3E*~>Qvm!I* zMuud(XKZFxK|xOb*ifRen2Z@BLlenA!GoX_WT&Tx@uTEw_Ax`MN-Il?!lF9SGj8mJ zoXoVWtWbd1jIcJL`Cx-nGp{1lPM}zh8<(4tHZJej#WFHbd7g%h8-F zOVkupl$D2Eol=fUwy>-`3N%{eax}@ZM;w!iV3&$!6#-TKtg)EyNzcp6NS~OM=c%Yggi!iI9eQDYC5Hjk zlhB70%`Nqe8HlE<5Y?k-L1A@GNm)gqOtZoY$>;G5_Y6n3a~u|{aPG3=1r^n$g^Q^a z9hp#wte{FdDO9yJC?Y^=+0V^ghEi8qR8_Q4XcmR|l+{JmxVIMRxH#a9IBW=8gMbRY1(9Ch;3$n)L=Sg;9r@6)R zveNS=7nBxNfraXlipo-q zo#rkpt?&w>ZB}@_qA{DhOsa+srm^NG4I#3~R+VyyK(6Z2QZzu4O0JsH1q+Cf5-}wb zm`H1@P*p{vNUx}+YYG-R4h5B7w(&|M+Bc;}YaZUlD^$1WVOnII(iNz>qqQj7XqrOC zvW-`!s*MlV$wplv5si8X)qRXYCZjSLFJ$+nOfa%FqdJVGQqhG70({{d(eO9ZGC7+8 zg>#vsEufZs73hj28`2d8mYPC2V5DDSTmcTHVlcFl8KE^QpPFgI&8aRbSx{QVh$sau z%cw*E45WsZSwDB}A$9lwv-aS|;=|D%mNj{VWsRO@Sx4+PtKaE1>%I$Z*4^#w*6wL` zYxNepHLRDz>JxNWRW~@SZoi4KW;kN4dA(w}aADajCw}@r&f?F8A8BhV22x`DkB5vA zdg862CqkTR+LAx1kGC8VKer`+ZLQF+jTQb&uzvj4MueE5b_su5E4}oU;nE0s7)F{< zO&$Mr$Xi+bh2nQCRV-p1i=Wf7t6z9*ZF-auW#0WWo5f>K(@(I$)Sco_n(Y5?&Y({I zLPPq0Xi}Er`RU_}pEJ+?d1I0Pi>8J@cMPBY3+9qPdx_(}GyP2ec`GTpw*S`$s{b3a zrvK{9T%~Nr2~5>~*-$>?m(KD2|GLhqQu4S{P`R9)kJ-;LW-(*_Ba_ts=1Qy{35JG* zKW*4(hNhuG>WK_q#Sj@zaVQ=dxHi+a99#dQF}Rulm}$ZPn*!Cen3!Nr`_pH)YHHbR zJ|DKo5}Mi{a~d34htYF;uUU{0b9_u-Nt-PL{QS9dXw3#|I?dL0w718bT{m0*iJWTB zU8Yte5Ym=wLu!Gf*>YhsP4u-xy*~N>7GEP5U(rIC*}F>Ih)tWQJ2YV{BB5=u@NF=( zU?GD+oK%Oj)P)xLPJEYcS#3?(f_@cqE>RQkW9|75957($(4i?QLx&Dam8St_J15$@ zSnax`Uh;H%%gV+anxbC`m(UiKN}Xl(hvKM1>lAe+g0FN=?c83Iw8{Ed%jz3rSzB65 z#17)I64MnQ&IL#@8{|#Jqaevw#qA}HSXLsG=kZiRnD8VH@brt|bHP04C-B+8cVP>@ z#Hj8~YQfji-!^b>)=%JL_~!ovzGUz%`U!mWckNH$>j1tRe*#}0@cj{duPa^>kA?Ww zlrE|1wXhsoA^PHf7$Q^52thD^QxXeiN0x(bNa)4jxi&$tVT}UrC88WexX1AQ3p{p4 z2!i<&&As(7NC3~>Z3P=vS)#kg@^S_il7@0I3F27pjfH^+JZoqH;#lE}gV{%lM=;_q zTKHZBz6X4dBuOq*gQ)SPd!K@5zv4Sq__l%XFnFGB7vWw+xu<&v6p!SjzsR@ZdGo6= z#?eB!7r}=GAPa3k|IDoHv?&uOW1n?IPyA)%PVU(p%%7NmmwsjD44di&s zCL)nBVg?pNtEy*|R4yo5IwKRit_v!PN~&iZxZ|p8QZnXMRV*w`386e~aPGi9vxe z?F!4-Zz`%8I=Bq0tMsl0PGEc_+#m~DVIFtDF6Gd{%FE~AZ1%W`S;9p|M#Y65ke$rR zKbm5de38=9W?@+cb`q>^VBSJ4#>F){kd@r2MCQTPA;?BZB&C&TTR5rv;j%wJcDr-h zMc3t*$L$$1#(kBfj?7l-pGuZ&hPC*-WwhJ>|Kj3t1H@`MBCf1T=VO< z3&wxvD*1XuufA`8YFS^w-?!K<6_1!v8&)uJ6e7G}7R!PeLR%EfV!BXSRWTR)bSd03 zt4`^&WZ2NNX2^3D)hY9FXl2I00W)xlVL@$4DU|&N^cy&Qz~F)X2F$2MD$l51T0Mig z-EZDWa7%2zo(z|;ZC1)MfYVOJl}ih&Po|rT|wLR)-D;uKUBKPcHdG)-!GAJkb4v zc8%;APoT|4^WCqqWR7)^$Lmr;r|ZxrV&bzf1zT~J#oCf0Cw&?gyObQJ>Vowq~Kf4blphC4hKnoX*hU}*oK;-G}>W}MJ>6e^Cq(Aog&jDNIW zQ1KrdQc$JfpS?z$)eHa9l_|mf!QA-zv^f8f_{E7E+2r)y6pUE~YR%lTk&Ho~)X+)h zPn`IdDhBLpNb+gH;S~kVC^o=Rj=HI5p5F|4j+KKP4++{K&smV?8k0J8@Grp{EqWLm z`xx{$X`(yhuz?|JXJsXIfJ*zv)<4e5Okz@Xv)VD9(Zm();F3#lsou-7Tlw(&OK^L_ zZ0PvJ0voLGpk?{!|5cz&;Cj&RO3ye@&kPy`*~*%(R4!|VQaP>54CXV~H3qxRVDB1i zm%*56Sqbh3vl0vT0JQwi#?0J8?{GxfO178~k(t5-q97MVWTu>n4(i;9OrafS3QO5E zlZY(fV zWr&>CMM(&`^&~XM&+8QOAJgU_K?9IQ7WhPj=?@K zSU%D~x;IIwoYp*pEif1gPE&0{sLZs23+F>dFEdOD3Y|xhW#$c-MOI|mVZ1rTxkx); zq0ES5x<9MPu-41+RasMIN`VfHE(J_fT?(Fphd;X%uo0jm^okyZ8i4^owa`%s&*MQV zj|YP?zC%j_{;6_VS1Og$dca^08>};O%mbav;vAGJr?v5VkSz#g zi@GfvLKrAfZI=r29)!FIa%e=|)^^yaonsnYUyEbZ$4}1aX{Fr`Ppcki5aE@z1eAU* zRSo1wsAXDFCDV#3r*$j-CALASkOoj$TaYATATRsHuc7NjTnX*F)<>qs6c`LVPHOaR zo*McH`A$Klwd13Gc03i+|LSS6cfC?R*mY~uUzV+} zUi0O39X`ou9JRP=SD~4A9a1+2P5Ci zYdmN0%cp)h(tp(jm4V-Xx%*GIR{rjZkM9`v(rLb@Z|EJ^xMuK$SFOJ9yNl}@8}FGu z`SmrIy>x5(!-uyfubO-Rlp`D0&AmAHfjJr8?2?z?JbL4q|NJ=ik(nP(UG7^J#N4;j z)xOU4A2c93LWtvl{mM%IR2E}vYGMoG@!||}zX1b&gE}RV@YOt)0Eex=vK=DfD>$qK z4jb3=C)W~95%)-By{MN-Rsl&!mCB^4i zXP{tdzm`c*wEWF&wT4N^uRl(T*&VWVi?T(Y=C(MBb=Z=X`P3yD7_Mr+9#<%Nn%iRP zg+kaPe)-=*wmw$2$kW`GXv=N7Paf3y?i)k4VpP(Sr@1YrgTvMb{|rZSfj(Ra^1xQu z>K|Kuhpn%`E$er0G$CGO4ljqCsyJ+H$C)k^ZAH$9yTj7u5Mie6g0=VD-qIa5ODNA^ z(0P{F!X2*i$g)az+C16$ftK!YG~%#v?NEoOT?==ZQx2PMy{dlS?q4n4VG28JFXEr& zm?F7_JDinBcNm^__CtqSy315%BwuL1@driI`6 z!mM5Q#x3uAsjx>muIE%cR%U1E$M%)ZOC3Bgw6D}g>?<`OJA0{&4DX2uu^;ND3xwja zqU`ag3oh|eWh!4;jb(P<+#_lLn@;*b<)s6qc! zsK0_-g(7qUYwtR9ihub6DHl$E$;xUYA1X zJ!7Ed*%9U=S@VRciaGQHBBtwfllJ>T_E9z0vg%Z=<0Wq{A*O)EX5p4*jafXRB`HEn z#ED?-X;>%X5(^iY*{8{F^-N=%nIMG?Jn3T9Na_>N7L88oia6S=>WbQ`;^VJcwxgG@ zshR1iUJ%vkL{oaA`b2QIvpQM1Cbn#`TrsYGaWM(;?ezj!Z-9ES9J|H170S5KPHz!V zmoQ}$X<2hCXewjD`4Go9dgT>OC~vlE|2eI&tnQZG%1eq|2MHyqg%x!yJBsyKhK`G= zOfu$!$_2U7#?&UjXmeSXQD)kyluHK0STltrL`E((MJ~J!00%|*^2!{`@-a*$pe!Gy zpp4!rkgd4eeX=oa%+q84Esi`SSoo4*x82Sv9O}T@@rh|2x zd7?!q-qzZ7Ctjc7bf`Xa*`2{-fY}tWwP3i!_>GN^Tw4}Pss%bgpezFvY@9QN3YYCH zxu}fMn~(9D2FgU44muF@SD-^dF9K!R!J?RG6S_g&N-VEZ&D;eJ4m|$+=s-~LwRomSw*??g$aaE&xacs|n*dh5Q|nxH7%hc6>$%{8ONP~FZ42aXn+FrCU~ATkq+7FS6J)<6Oeae~{%7g% zs_UQ+)V?0b+Ueikw5qW-VdPuEE$*C60Q&CqFMrXhZR2lh3T_q9i+zv4k4r4Mvl%?# ze>Q&A;o8_>*3NyKFdA_ze-T5EvxY(M*m9N)tY!<;|AVd8m3p`^_}r|E*?#$du-CNq z|L|RH>s3v)u}^=G!e-1i{y?4NLn*ONgN(D5;h(#>$<~wjXG@T5eS&|^{X$!0E1}bZ zQ(TrPU0K6hL6*=i5#}p^*)3Ve;-T&oVZI%hO>MZbrRxx3eg^cqePSzVN7t7cF*;(H zXg39vwOWd>(GidFMhuX2BQ!)XUxY@8Lm-kYf!z4pb#^!^lS{TUjmL5dW z^FG4Go?;-vaRdt$$1-}n!&HzWv;o{=FvZ}}vYdqf_~1$gCA_hbqo7xXPc9J{W-l8Y zR(Bm3osBwb&D&gk_<+%3Msj6ACX{7u7WxaUA?W;05o0c$c-M0djA9j!!wsdv=TO3? zitd9m-gtHN1P*410ULuNsu#-3DFU;JQg*fQ=q%$XoB3_cn)wB#UXFOvM2|5@uz!RG zEk^jAj4WcaL?1)_#R4$^O-o{$$d2J#>wR!A-8&l_ad7pbBo4NYB6M#;?u2Bg!78AI zOjDu5fbf`uKxWZT7zC0nl#d)OGO|oDxhkQ$362bR>JWgk4p1;cG8IM5_OV{{M(dvj zikXKm9~2`MUmfUR&;TfU3g1wWJ zuyDs#`n%O&uNmx3gMDVOeFke|*LIVX%4wZyu+t1S&|pIhmTRyJ3|3{ZMFv}Ku(byJ ztHB;K*mi@xWU$W+w$EVS8LY`*ccb3OG`LTxMDN^ef{n8odVY<`^~^1uRL+I^o?bw- zNKp#Z1tHk?uyUfth&6-Tk%ogJ`i2z6!(Q&pXnjM=u0gkrbXJPvHT#)g8{YspBUv1cZTh&Krru^<7jq5j0Sat7nZI|YiuRn80`_8-XeC)hyTF)Gl zSoZv~r~mL;kD&vevfaJ@^|-Fxik^M#zjvU3n>fwIPdZQ#wsk`X9JT@YN8(sJ?yN&6 zLsj^uajf9s#*G~EutX3G-!#U~58Od-By2x)Z}t~0-QgJ2VdI7k+Y*Yn7VfaBI&ADQ z8M1rk#ogM{9hN(XjT<%np`wUy;f@oi!6FRWScwyHFJlvqsjgM2fqc8Ts z7$OC|Iz=d{HKJ>NjN$1fI9b{?5BhZ>c;HpKgPvT7c!OjsMEVuJ*~=Prtj*rZ$`*N= zZ}xI0%we0S%tNFcN*y)cGU6s($fV_+J9VS4*#m0Pb~>?9Q(A5IIa5-8Y^QTD zp01HwoxDNUU+i?Ay8*L46@zFyoeNl|!bOywP9Jjj7VvddrI*W6o@4BE_Ml;y5PT6k zbu}nkmxJ%CUXqbj!DD$^-0a#7ymxO*e^B%&nElaq9M{;;8H4AZGX**h3p^!hf=!$_j^^G{823zkII_KTh(oTt$m- z0@Dxki~$oRADh`|;kz7sw}a=@e94Dm7S+A=F!&XC4o;DLlaAqDcNDn(zrvITV-$*G zg>MEb(zW3EVvgivbfSgtQsCQ5C6E4(7T=>tzY$*K$2`f^0VJAx-+(W^OuHm$RQC`* z+kDIVzEbiq+R@y*8hCyU@&l3r$r&~M4xpfa37(IZ2sZ0XkZA6$0zPk<Ar-MWbABU%V>m-llBXsOdKk1~-7`hkD7^8zfrz1|Z)mnJHl+TKG~>o;O@)S&cVK z#$1qS?jf12&9{X)24yt&8i8*CpZ|8ri(p9i!p?uuWCrb#5tbW~OaMaUA8Vhzk2jAg}z3mAK0gc+t1%BVybH4odI zBD{=>)iJ#MjfJuBun7}J39EAnNgwIqthiN6e{g@bx;VO7i8SjP%^pH8EGFY9%Uq0h z_2Y~TV=0P`JWW$uJP#A!=68ZSC>#1YQgK7K6yyGQ5jqt~#!>nZ<$MnhjzkY8!Vqz4h=-8aO!Km{S2&^^^kRK9 zK4}rckH=c%i`gQP!eS)YYhigD0}y#}x#f8zB7cH|p;T*eLP;NRLYBze(KEvXP${yk zCw#13Fc&2*B77=^Q((>mQeMH)%tLU{2SyQZ(Rzh*N+S}6kvZn+r`a&HK_=Rk4BI>Y z;h1Uj+BQ|qZSB7f&0vPWTi$qPi<@X`dE@y*fw#Qz%oR)zB*le@I>jus3++{nxCQ!- zO8qg^-IW^eUs|Ur^$Spc1+zL%tbX~8XXa9Mzmsv}`Tww6$~^A%pTDwu0w>bs(JOPP z=>%MoXWLH3A+F{wo!moQKjyYMM>lZjNjNeleLE?q&mx@qkA}0Q<0cbugz;pZT|9Y( zPP=5neez1-VD0vapVc%@nP3k74}`O&<0kKhoQzYDvK$URiN!!W6$<%DO!H$qZj$As zM^0i3hI7Lws{t`inQ#s|dFg!|$4wTbp1cZmGDEHt!6eIn zBAhK94<*aV>pF*?ywYNvG9e$T6Y9j<_TxBilI6UUS6XzyO;k=|1wFRgCMG9wY^3wo z#3amndBY$SHB3PcLdHY##ClvXZwneF&;sgq(FfQv|{8Qx= z=NH=uj58&w#I~wi!Xw4O69WBmC9-T3Mx*UT-Hpba#}S| zaW%sw7M!SZTI+yuS>9#+R;irUy-+0!?DtCLv^GP<2+=7*bp8?1 z2`y9Hif`3A&Kc{9NpQ5Wx3#eaYAz!Ei*#SRi4}IVmvRe;+dynTDY;ca z$@WvWp=@hp>&O<8?FZ$F3Z@0aM!zYrOo-Q+;&Ib59wz|ft#cs%2)O`qKO|lf#Ch*{ zyvP)f);b=i`r>h-E*|$n;;o~QcE~Fr(;+uQ_Jq6(at`E2kVrY}w~!Y??tmNw`De%~ z$S)!JVUx9x;~}4iJR9=&ke5LI6Y>e8E zS&;WbmO<`?#DcGN6XdTT-+~+t`55F<$ZsHHAy+|WLH-T0H{?B#rI4RMV!7M89&!rg zKOl!d{uQzo@@q(}8sinNc$~J3w_bug7xDqfg^>S(JQeab$eEDuL7or!6y$Qq?;+bG z2JLOFt!qKA1)T&s3G_A4*FaN2Q$ha%`WMh@&}z`HK)(Xzhj3h=LC_%R1keefFMz%P z+84Ah=pR7;06HIZKIlHseV|=IyMo>VdJE{qpcjL_1Nsi=NYIg>Pk=rF`fJc%gMJ74 z9cU}iR-jjcUJ055nghBObSvnYpl5>q59t4Z&IO$d`WfhFpq)TFf!+vuBj_~HX`pX{ zz6p9B=y{+GpbemlK^KGm8}#3xZcsPq)u2~{=7Z*gz5@CRXn)ZDpbvsR2wDMJ0r~~# z7oa^rdw|{ndIxABXd&napdWya0UZPS4CphUmxEpo+63AJ%9g+bnF2W*G7+)>asXr{ zWIW_p$UczsAUi`&ha3jE1TqFP6S5a%31l+lWXQpgHINRt;D^kB+yZ$z zYs&{ZSdu$K^86Mb$Vh40nx>4NME*$T1~Bn8`S-5#?2C#u_KhK%hn+g^@5IlknWurnmjQl&ulfgAwIlZhV4 z0?65rm5@Hj4UmnHyCB0wq`&l&{?RY`LqAd=>9z-QHlz=-5t4!S{SpUg7s3X+-611; zFrJi*#5gWyKQRmm!EnV{qo86aG2(}cz>3o+56fquWR*2sN4;I_kYu7#h74raxgF68@Pesnq*rO^iv6~UHur580W)@?uOO0 z45PER`GxW;?`vPU8@BFq)u%ZE0ts&R286>wp>;P12mMD{uNW!4m>Sjb)JC`}-Tb$5 zU=PB}cLED>Vb|Z-N;^L_it*#%tb$Ayuir`)OVQVmC6HR|RtlO?6e0DQ+tgFO4@sfT zZ-%+P0Z6{LglWk9BNi9of}DXp0A2rx^UJ#x$48*knRPirL>Hu zQjl??P~lL3L*7tb3VJE9WuVu9t^nNvdO7Id6#jRGGrq)GMk^rYtu?CTtu?Bg=)a_? z3q7_}Ing(2jOi`;1|TP--N8!bM4t=+oyvM<8Z*2Xq!zMq31t{FoPxXuA$hoBa72b_ zJEW74Qc{Qv3;Sqx^ISW24(ZE^(Q-$-4SI~+`4UEb!q{}!nCEQzC@PW2q?fA1E{9qk zuBJ*JuBOU~!I_1@6tT5RM^voT9rxL4V!gw=)Mlr@y2rmM#{X@P75lxzZ{G;R+M!T9NyWKP zY@?#rV<{l@tCQiJyNAc}4)0u>nC5Scsr!ccdD$1Kjr(FZGOGeP=hUz6jKO!o)IHF` zPOp%r>CtY`)URd`lzG#meFU@yy{WM>AY{e=?0_e@*dToMx_dBM&^_uW@%o=!y#no~ zRXYI)?(8&$kYPZ00WXA{280*%LWtA9FUJ3!WBEh-T>gEIeR2MM_Ixwe9V4G#)Ykv>8t}x_w%X_LZ;B1R8qA7EqKw?^ zzVZj){^hu{zw!`NvJH1P+|ITd*Cg41j}KhUy&W}Zg?m7!oOeJv^RcDf?f3> zV9Jd@{OYEC8p}(DMc9HPu$~skOUCWZ4!|biGKpi8xs2PmFYDKW-|g$k^lfw? z4zdHP&#@y-jN_Y-H1iM)49FmwB@)8F_fdeb%0Nz6_hyzb-A-N*_jN_+RNp9GzCei) znYI-nQ(a|!hOHpDnl-}%%1Yxgl|$5&W_5@Wezu#eZ^&g_yKQYWxPLlx%MFMWkF_Ra z^r%&g=rVzAH>x*`DNjncAu(cPl@}`BBbBPNjEc9Us$rUJ@z`gbPz`YC(ajL3*dE7O z=}@f@rk_H!T&TV^SR7jSMFMLNm2?jZ(K*Np4-Ev5HdE*}o}EKm=m~SI)iJ`{4LwKM z6!DPB5$3;wK2D7W=uVpm^JI2~V$3ExpMhx2heUKf3={313OZQ_%nI*(_-XlOV+MT@ z7TF5HlWi?~BVIXTkflgMAV!PtE!g<>w;5rCI6@a&+k>+wtYLJ5Pk5J>@Msw_%Z@=jO{!u znaG4VAY47yF#!c`ie<-=iyhN?2Zl?ZS~^e{++wx0HQM~5KrvVN36BLLaXE7ma}Kx_dITcev`}QncnrWo zZ^ZDdmBaTxadt=hxH!mm39*TB_JpzR;~b6&P`Fyf#U->(!m_cx*xL;@DEWzx=!veg z`Xdp(wm&(M`F2d7u(0v$m!o%Fyu;<{=^7rF;Bet38&_9X|2RiNLM#V_G6m#wJS_WO z;bT{k9!%juLO)pO+aV?EguaV159xKKv#dF+?syNfdcI&n2zUt?B3+egZK*X%2!DA= z=Y$2B$J-or8<3orLLwy{r$Y91^~HaOxV8zgae92(0Z!9)Ps}LT_%S&tQy_aN+8LC5 zk+Y0YHRU+A9UjzS&eCsYCzGxD%tOCl%`d*N{po;t3F{V1bXY5+FCa2iMO_b@u^a)W zg>J_=Al|P)^b0-)Vjt+Kpr3>G2K@rG9`s944*m~={tqacbzd&ZHCiB_s6L>)@<4qd z%RA_NrDr{HL0<=oKEcO3#Yv#77o9*ifTn<6ho+?`=pR8(2knml^#UCSdKPFN=-Hs# zLGke}-#l?>wnl)S0-6TOCy{QJ{eQJqaVz6?9Ei>2(gK-~Ex_5)Y?ll;9^rU-_ z8|-O=eQ2;x3>J%&lrS2_s%jHdl`w1Ggz*{er2$k2D{o|*Bb0WgZ;%| z|1#J?gYkr@3|}9ma#|A&R$#D22E$BRh3`6ptv6TuT*%e#bBKcw#Z=147S=} zYYldT!EQF#y$1We!Co-fD+YVVU>_Llb&OzS_;xClydjRybJSgjlD4%jMUG0WKpkgs z^>rL>2I@G8tFOBZbFDxfXJ@I6TkFnIoLlSop)(3^piT_->$vC?sB7eZZv0F!?Pu$n z42g9x{Bt)rPJBcUJW$QSzZ?M~s4W%+WUI_7Ed|GYNOGY+2>K9Yzld=e?U09bD%&a{ z#JH@iysW0hfGjlf;maf~2V@-0aJZ$LUpB3g&8qT*1kI{`r>s+p=2X8kRvBhN$B{`{ zqVR1t*(SaK$~NRhP_~&EI{Es5z6v@R^mWh+K>qCSve zx!^#RTyUUDelbL1KIkQOjZ(QRmJo>@FxVl3VG&{y-T;aZUd`-xH{8Lpz?p7tFejN0 zgn5H+aJHKtFJ`+p(wI}-oaErNWT0!W3|qInQmk9%aNSZUv2OXfyWzQ6`#N&6D?bIizE!8*GS_3d~y=LDxPoSv`&xj}e0PmGjjVFaYTlo6!iF{d6JS9Su! zX~GGQv1%f$tkN4@&wph2gg47h=1}QN_*^MMr~Z&H6fVdTp~71Y7y+>y;0A<`Gii*< zeOw-#4f;QzMW8!C=YYNkS`7LHXbI?7pz}cwEB*IM&%~p@a)d&a9HCGp-+qx8OSZ(0 zDiuP8FiPwUrE*zk8;oN!X?L2zDhyU_FqTTm$2ENE9>*IJ`;)*#)JiCWX>827@S!U% zJ5W9t7r6~WKk3H9w=BHdd_8&>C z9mZAXsqyYd#U3SgHO)RJAT?kBl-eklRMi41cOZ|%Uv{RnyjI&)R?N=jkq|qxh1D(- zQVXt`Qs`35YDcw}?CmMEIa@BRW3{>!vY(Z0Di2NRCixdba*Iidx;bTq@_X#zwW|5% zVkOSWgt|NJr!Lhj!I7mp#M81=M;n9c__7w4sF2-j$s&uM#m6!7eW1fY(d76>fc_rT z1Nso?c+fw9=7atbltmcD(l-zEPoNc`w}Gs#D&=EP;8!jz{?HeE=wQeIG%ORbXgl;f45u=iPM zUj3EZtW^r!50FN?~ZVd=98_b<@WN`8LpYpm%_#fNlU~y4?xNKwkt_U6O6uF^cR$1erpYj>y)D z9R-Cpk1Vn`!K{Bok)@mDpAX5AuM{k@{FZMmuNt@P^kvUoVhWx1P!~EDt)JU8!OEAA zvmv$6@nw~otUzS6kKR2B%Hq=iIv8{#C|fCHzb_N?3DAo{p9C!deF~Iu+yu(v#g<$a zFREnmqRPpFDNJ3Wph@gugR!7VjIEKh%hpI@s)+oeZSRzgj8EjY_Znc__FgBqy?^a~ zbdB2fR>(XcYTH{OX+YGrw?aI>s+oomY$lwkV@$9?dKLwIrLh7)IxvbcYW9?*`{tahB%Jbtfy>^%-9 zemW$3$!NPH$Eh?e=AB{`$||!>I4J*gx-n-^^o2;l^pEkz(x(`M_69u{dMtqY&IcU` zS^zo-biLAV0L5mm??KSvpy^# zbtibN)W7i^`>X{2^G%pp#!n3n2xM&wdg7<0HU(xr8>oFT7$5W`1aef0CZ^!dyjVm&|{!#0!nx0L<7^g!74P51)fdLjCmws-gYdY=iYn9sM4P3U) zo;GsZWiJGupksk4fA=@pmtU0HSU=w8|JLr#-BzD&bLVaj{=GiO76^AqoV)P`V%7z- zUe``G1zDk2HP*P?4Vi1~XZd-gMY;@UFS{Sk2l2{wK};}6--4TN>bp63z8y{=E;1fQ7Ah^!1UK9|_02K>}F2^Xac!JtH#DD{Ka z1x4xvr@VNHE%2mBg{B~lB(4(18;tWhVjd69+=)2dj5w`Lh+mtG<2;*2yc*2i>3;NW zclu7iKWtgk4GVnFx*Ilm1KIXq?Tb?|eG+XKSWv_S4o5epf3|FfO_-`L&tW7%9v zPsM*z?Y5u@_N0J}hp>~n15bk2Z5f5=Ao<-5j{1x3j=wv0cmtDj-%ay><6f~ZIP>qR zO{?BnGR)mD`Dy#A9W`eorKh|bJm5hfro5Zl=)ER#@QEP4x(AVZI%ni}E4JY)2!*p! zU%FTZ5^ssKUAY1hpWQ~06!Qb@=4#arql!c6S^~agYcW(lp<;z*qq!1N3!car1x>sH z*l6~Gn!Ies3M0%@u_n<*m|`Ol=F=n0+2yoWuF;*m2=jMfuE(wiq1pwHB8S8b6YZ9R zazYH6RhIf^+^Od82`?;$acnY2OS(GoGQ-pJc z!a0Vaz0mK)g6Ye~Ih|;F48xX)ok5M@4Q&{+e?!kHhS8m&vLTVthT;_=?(Eydk~uda zVsR>f-=~)LOBe9_)OzSWkXEb|iz}Q-uycXXZ@?x=GOi{}7qf(V4wA(iF~S;y%soAJ zYqZAvJe69cQl_oYI?H}4_|lVJMCzR*@JV(aB#_?ofPvs}G#w!j_ZNQ!Hn z5ZfiPsIX`Z5{c?D=V7oyTUH}W0RznkOED5riD~iGRB!%%IErc^dMP`PKaqI$DuH$idmp64dL@g`DG-TOU-R`K>6y3;Du6z zQ`!Xk6%$>Vh_&BtWIkE(lB^f-vT+lku3qY>`oet^;T?mTr!ughg;>B=Z z9Vq!$gKh$4MZ|u$k0tsV&<4=ofHs0+_uID%l;-^6fvWw1>Kd&ywfkyU;$g`~en3>Je_kyyM^ImJgk zC6;2aF@`V0VEG1Pb&>HXG+430Ru~NBO7X2T*l!JnTvuVa*I<7(*rNt}-e4~q?0tiM zWUwC$W_M_R+bWgIYG<(S2J2}sOd(WQh8m1#ZDhJ!Xt28t#`o=I8f-DxR)f7}us03X z4sC;UkEcYX-7^e^Q#}gf+uM>4i}VVcZZIskE9?$~{mx)d8ElimUNYFL2K&lj|2CK} zR{OhBsnpy3@&5hESks&|HTCec`dNv?AKHN4+P!iyVivrH`&sTsCl0c?A00Kw{pgHA zcK>sZO&`VwYL7a;aj&`w#T|Bo8|9At#GCDb+#~LWgqwpik9dQx267JtU%{6AW9(YI zu4}k~-uDG}!;Zj|10%m#krNz?0rr95ax9YzGym2D7~HSv=4|pL2P>0<1@UXwh$Z-h zjt?iEy@s9yryPQzLwFdhJ?ee!pZn~N@7xW~djo6ed_b7&MH_=~2jQ)S&j8jZ*Haak zvftfs-Jm$6N$?>$7MOAfp$E1$hS>9g+ylXv5ndHkxC-wOBN6_-&yPG9%sqnB1_d}h zE<9uSvyNcT0O#_L7vuvlL`bE3{>=yAkK-B!U|+1eVY}mvfY4}1bN2@y7QwCE&o3CQ zfx0gf+IpPH=x%tS?;A{5ksKqRU-2toKOr>{v|#Rj z|E2>f8*IYqeeK|yx3zG@@p3?5`E^a`=D8;+Mr`|B!B;lzZM8N)5ZjwFRo#!iwdrGf zVCDgL!^HM>cSCY}1{aCD|EDD`%Z^Fkmcd7fSrc9!_P0pf{l`gMtOq0CXYOD1j(g>D zD1*5NRI)xKO6O~RA0vlJ-5jQ5@B^K&?|TD3o~j~1U&tg?Y1!8M+Gk$Z4~`dPI(h>e z=^G00NLk&k_zk`zhO+pC%;LxGD39)j-*UFp_X8Q2;FsYgb4Q>yJ}@O=D;8E_8>1R4b~ty7 z^aw3a%h5mMNYOdQV~fK;y5-3(PI5#51m80bJm~}Sphun+&jOXSs_vLG_bc5~}Aa{6wRfkchzMg`z=;`q_hM?R#=hTl= zi!rom^>?`O8LjT{fKlf+l~M%00{8_Ey;qLrVTrKFIV0V~ri(D5hEtE%^E1|_D1m2llF%Na|fUPvbo*3mMifN}ssBE^}Sx&_92%2-IE^81GmNX)=%!}1(F~Z-eodjhar=ZU-3KeEU zSO#Vwt^!Q~{SD|DpuYv}4|**qi~seYS)ez7ZU@DgTp#BbH-oac-U7M?sdp>rouIdY z-Vcfx`W^(m1C*uUPEgL&?*iqy<9k3q0lgQL-(311PzM5p5vVT?^nOs>vb7!o8M;lJDZY1rN8*HuNTW2s_Rn2ZPy>X42n|O69UnF&Mw2 zCH)v~FrMs|SdqalHCU~|Fi%!|0fXISu-gpwfWaO%*i#0>Y*mGia~bLHrw04dV22IH zT$g-KrE+pJMPWQgPE)5f*kHp9Hr8M~WiI)q8*GNba79?TS7R`gc!i;iE4zO(*q;sd zcZ0oduw4e*ZLlK-J8Cf2KpD55O69ax8f=Zh)Xt{3Qk=R&UMj|w;y5q9{t{!@~$&JBz z)@-aD=}ugSO?ToP7(^}(ve}*p$%ao42HFb!Xrbpia*5ElQRX52aW5XR{oyh$1IUGC z>4+1-a~y9&KKkCG+>oynPRc)>{v2FNr!DI_humF!1(Y2I3Zt((DD_;%{|9IeC?@9O z#M@5L=}J#GK7hUq^bJtv0riZ=<&bh0kSe(gNR?AOoF}pS6rWScM4K~DJ!wr^YuyF>v%3xdqm;R#q`1kk0{-S$YqugIi z433S#{vsw}m^EN?u`)4`y9-z#cQ@t_?j%3=q5`=`Q@2As5o)z(R=YE}QtYI80~4>X z2e0LJT6*2L+<|o0v%jksyK@@})F=F=?`F*PQg;Nh4onLU$474KW1d39v8ng21E0#p z(trmO!ijbE;B#psUv}qh!h|}IwTC;8dDwXjW?}m(%|3GZ{>!s*!Zm|oO5Hwk`O(W- z_g#K8h@d7shSdTG?pTj;Ke*NA7uV*qc3~f~V{qoX*dTM*v6~8W8j3B++(UeQVBrB9 z!sT8y4+E3Hly_I{aIbs;!K%-0s(bEsEQi#Ostz6qEI(j&9$&7nBaRK$4BXVusCCwR zei+9lq~@^KzjDH81kAp%sR3yxxEop_Y}4x> zf0M~G>WN_f(fZ4ejt}I%8v2aLTT+_yF-E!Q}`1U)T|7|L3;a8`O7zV-Tyz+15A6r9Qyf zG*GY^!$3(iL!51K%{AQo5jdh}TjcvV!n}!|DA!g(#naZ|_W7Y4J-0guRTuC_?$a?$ zbo*;iE}~0OH@CFB5StdL}OJa z3foUkPGpltrXDTYQHC>!0Q1JM9+t1B7V`?-1hPu-1eXIm@&>U@ZJJit?AW8b2#;nx zhzFlSZ8Sg1Atz|FXw|yT))Os5zHN|ci@y|Zwi4mng%Yg&2yM7k;JBZ6LB(Qa#j$mOC@r36Ar*sl)Yo3vaghu>r`GirD^Rj}Z_~bT*;mU>{#LvQ5AfSa;ZZ3$NG$ zKPj9_Frj@{=p7=oOwAs&X1yJ@w`aDcn4o71_Bdgk-lhxv`NCUvdc7dg%-iBHyH2uk ze@$+DdITRkLb-=GQSd!rE3@?lkDhBR5q>dq==Mv3XB3)u22Z-vS_Lni z5S)d|Sz$M!e=j^n_{55Gk!78N2_omZBZU4L*o(GM5nL#WFQdxu z-Ey#SHg@7=s@W`E+}Z<-Fo=>f|0>Iuqp?hnfD9y2X*{*HR4A7)%)k1G}QPUtZ&@I4JW40H?V z2vGJ2*q`*Vlwfts_YUZ2(EXs;G4Zja&|Mx$PXlF`$AYrNVhv2(4xRv71wGbUd`mzt z0KE)!Iw;c&_e*_jLM{TmTItt=UJU&`pff;!4>}X{F;MKl_;5SVnhnZ|H3xJTDD8g+ zN_V*vR0_(pUjiv-gH*}cAXRcNOky7?J~~n*CYcTGVN%y*A-X;CuUYNuN8EmM*rWlM5Vo1JHgOwR^g(3H`pTv+i0+74Yti-oIlF&VVJJ`-EXi121|_5e7x%{!`I7TeGKL?Sf;^nwMF^C zT{dZVp1~Fv>`8+)8cYnMd)eSz8!>W4+>!9!Ec6% zc2_{^Pbp#E%K;x(e))wgISR3b4k2-LLCMP(#~bSDuG=PFRuK!yayX_Jt_$Ey=p!Uv&IN9>(ee=QsqCgFNZvcpSeOjNH(n2tR%^UU(Wh2@|rxqcPyshoE_& zAA|C!0L@u%_JA^~46p3usgj*MRZhAfOywGc#10wkh*CN6D6Qr@U8$TnPN%Vv2J;&1 z5`%FmSNhAPTayK%|Kqbd?RYA|-s5=&Gnr`6A37`Q3B7>X&rbc59y zjEl9>kKY*VdV~GNU^rx?__i2qtHJgfjE{Lp_t@3R@L`KUVdxm}h}+}c5s9htVT;tm z^`01Spz^5ypSIdB<+B!#v%z!s$VBfEVakUt9_KjL-NT3f2y?L}8F-lM7lDU4^$$GE z`@w;SH{c&{U|ffyd5k5?Rdfvk973?^N2rCKMQ5>ujd|pf<;^gUoU7AKy5Wc9s}xey z@s*1xyP|SlrFTUyN4wB+M^wLc!FsISBh{gX@`}iN@1Y%?>0wrMd|9t2Djdn@V|bqg zO#wym^Nj|58gv$DBWN)w#*|_Sa5E_5wgr@Fv`{XqH5eL1;hs2ab3t%QJcba7(}HWoq4+0no`IF4`k1bP<%uIVxvzc*)-bk6s2}_^ z&etp-9enbN*o_u8o}f9Bd!`mve@R) z)^d*qm&00Xcf+U#@5ooGMg^BA)+VmKs*_~zNV2F);1Lm+;7%DfM}oo{k6hey2il>-HR;I3==taLGmc46m^xCmQ*Y*$5%I-Uqh4KE6W7Mdw6A? z8{o$-)lo(=90249>wMH+uJ&XKyu&r>*dp z;q4;y&snEo8~8q;j3>_sTq7V_}ADAA{Qp^bSy*KK1Lj`$+LQ@x=pa!zFfU zCEuwiy^`-VrIII8CB~DflJ9)Omu9eBgI!=S);?*MGjwT}b8v|T40fl%?lIWI2K%eQ zcrsPmebr$9GT1?bA>|bxRza1&9hAx?UhI-#>20vH4BtwFtudIGnZ@%#;)K-g)1Ki< z{MIZUENOB#;I7W!(T-&$Vy6Swo>s@LYILt*EQpyd3kH-8mVgq#j{Z0Dp&1MKKvp4ufM>tuj9zqpyTYR ze%kl@;-6vQpz>!WV9Vl&&AqA?5jxJwKFd6t1zmNRyDaZ4<8{gX;2cg1hREvoo!$iBEL-G|yDe9_=i^^MGd1MI2E#L114K9!GxToYxy|>Ux(YL6_yW4rsrt01^!#KmL-@XY5Sa0aGpjkbjMat!Sy1x zR%76T<|?kO(vvyHyi_o)7M3{knl1G8nEtIs4j4-!Sb9{}M(}(R9&~Y6he4MOw!SfX zztY?A?h=J9EVwukw@8LWu5h0sIChFAJ(T{sqzJ{=mVg;Kpz492$X%r$DrK%+zq-F^b^n*KymiN z$1%-kpqL19u|&M0#PIEhejg|c-ZDtpcTgq!4yv3Ofk;yqCyIj4DW0yEd>nsCzRqY3 zB-Tx-oYpx8oLt*i*ck@PHrRNBU1G3ugDo@I3WMEhunh)_LCYrnjaMo;Vi!-| z<0}_Dty?c%SDz-|TK9kB!VBxm6Y91$;X1s2XB|hc|BjDZcmwU5y|JEQJI2>CzE)q$ zIJG`4RzKOD5G!2dlj1I~i_eLB0}lPbdn5hL!U#V9M7``1=4IkoZ*=eQC6EM0GuglO zCc%f z4UXlz8&-;E_;F=g*l@rG9(?zI+h#=?zDL5T5K<_+`MdVb(_DR=#9|>?=)=u9jcF$kIkirSFdvULFG+Ov(w(*u=J&Eq z4C}hF!PMdiG{eL&oC(Soex<0ZE-f#?mr3M{1=V6MFbKis*GbrA(1zSqKNW{iTTYAE zbA~#FzV;2anWj&}!k}FJ)sv1T!q0#$7UySmea$kN{dj` zTTZ%?!j?x>8W3Xq*kPK4c8Mqw(n%$IZLzV-E>;VcFA9u>&Dv->&R?WVyT|P!g6`njb7~>%^p45_j*BR_?gWYGa zmkqYVVDB63BZKjHhjj0-!MY$-B*vCV`g@+iu+gosDF(ylw8FTtDeZD&Q`$w5R~S1> ziE$kik67&QJjvZK-98nsSNLCU8ooTyeU%H1*s6CPYlS3ud@cUmS+AyU$EBO=H~AYe z;X2~qMM=q%9-d~w z(FwD||3ljq)BIb%$JH@)3k%<}!SyzD`NzA6#pqxRfvZkuKkxTZiQ7{cgS?_{mhEL* zRG(+xi$+>S+TY}KU(GQy>^6#`w0<*F#9Una-%NxyCnpi)*V#-WoPpTZ=Q(7`W8p#E z&vQ43yN&ovPUu$UUan{(UAT;aqVe4Sa=M5*=Wh7Y|4r)^6HylYTfYt~9Y5oao-7*p zzMQy@x35e6G>ph`{qqg~rdFy#s|r5zXlfI-{keQ2+Ozt6$G&dEXC^=^)^Emtzpu^X zZ0+iyas+1{^=BQyBF+J{23@~9?jp_rw3HkS=&qO}LH4oirjgE8&j|Bw=q}~8I^+e+ zyG5AKg}F_Q1nJHx5$4Z|!J72#Ak0_5qsZNQhKY910p+kk3ON#N@rnvRGD4n<1lKDu z3lO|Ba9ZzC$S3S^)@zQ?*ex{nIPSs@onx}%z?B)Lg%A5Urqt<$<^9+R*84G07I*ZJ z%_E$OKHzJs+o!(k*R3mb7_*@y#0u2|rpL~ORTKE@d<4^eVi zQ@gCkxwvr^S`1>a&PA!=l}kpM8;gEwF(aU!=lh=*=5FZaI+k`Ya-oP(VQHkBD3`I* z?UV5!^ki#EOt$qVA}vR~HfyiQNq+v*B$Zi6(w~nxTe#5_Gu7H)^|CFo{n?&md)^Ue z`$r6(e1=i=YeSh_Z1+{u$_qyGKc&KALet}!osnMkZHJ^SVn^Q7-9c8ZdM3ikLBif z!t`@|`Z>eIOy;K}EEM5k@mJTgKb+G01;pZ;!A+d~L`$KUm_$DD^yk=K{qdp_KrN%XY$i3n=x>Rr3D})D6niYX|x@XnRl|kxvFiA-6h! zCV+MXZ4257v@(C+%{PPuk_up2V&;*ewRT!(iAzSA1OVlXgEa*vAG-LaIvl zIw+OXI?Z6*0+M!z8|-|8;oz&XJIi3KLDD@g{7Ji9_>&kH{v@{6VCxL_dxQPSV9y)u zWrKZgurCdU994cG@01@NgJl|w*Y0FkW*cmU!LBgaI)nYzU=JCLhbm<}8V&ZW!QMC6 zM+W=SV22IH1C%l>{8)^1Z;-);8Z6sj;|<1RlhQ7aO-j3~4aPP?V*Heh_-S44$^XBjQ$`u~cDV1)xm|2;3_9fM^I@m5*{yCq z#drO$dp+p*>ob=pKEJtoZSB9lw_Ww!Z7r&TmPwK?)~4t*8AI?t{JoM zxv_U)iF}% ztsTDN-sxRFO*q`Yal7}tUq5qh-k$W`*LJ__l-BEqe75m|ejN@L-7~!P+%D&?+R<>h z&9{Huo;_`BmuCi#IWwVgTF*D%&g_1{z>lrpe^mX<^0RMQ`>%)pJ^G!xFDIVgSa$Gt zyZ^T6lTO`Nc6#{yvp3xL()4Fy@A>|N-%RgxWrr8up8MYa$KH7dMpdQ#|IADplY~hK zp-2l7rGyd))c~nO5dxt^EMTai2nJIqB04xk7)Dm?uDX_8T)VRBB3KhZ1B!~muBfb{ zYXL#U6%lOteV%jgoK$vwcis2>=XaAk-{(B{^nTBM&U5t+-tyOs@m!O1aPu7TDEvKWf2}t`Rv=%QBQMOvnU}0md<&1z)R?kj891abr zW9MQxdzg#Yx>^Wl6fYIE91&WqtjAdmM@}lQwR0mJIj6jq^Lsec4X1Y*-$auaT?$j@ zfy?nRl%)5ICEe#+rBOHM<#oa3kUbUztS>oj9$kHP{E_!F7i-Iw>&NcfaaLo0g)Mc97zGfmHA#tGU#)pJpXE)Kxfs(6PBY&hSx*SFP>Rg!C zj78ms{>YSo+EOQ7(T)6(uevUWIFfrQ$RBwHaXG%? zSL#OR?w|3>i-UUQF4JR|LxfsG9Zl;-{ z{As7{$ewzM&jp7bc(1WP?X?}*lQ|knu6B+5k!iNeahZO~m+^u>KiJqG=}}ycA4#s{ zrd%Bw`O^um%W+DwgzM59R+KgNCy6KcLwpLv5?7~2{&a@xa$LtRS)^XR=&9k2{W(+H zkv$?^q2%h^$e%87U5*Ow{tQ*(ZpJZ)ECcvS7qe~-yqy}33k9aj;#N;a*`*XIo z!^?p!=`Z`&NMybKM`G%7{DWV)I!)X5RAYZ+uHkYVt&^^!vGhb=! zPY-Qp9u_3_a&>RyPYPU@BlNQ6FN>qHNa5A($9ifzNz}tUD7jJ^`O^!oi%)FU<-Tzd zF>B~gZ*8ZNU&$4@dKu~oi$RM?(j{K2Ox$BQ)wZ2xhO^)1L>kT^n-gw0-`Jd3!;u#z zxf0+=?(rgLbK(t0UKiy`G#ptem8-Mi^tCy?3@6LxbTOPfn{$@oTwrrL8O|J=)7Ee< zvpHQ2M?N9Rm0~z+Y))&#k@KzO>TWoHv^nhzXS2=eU^qK%j)LPf4 zUfe>LQ}v!T?~>Ai{WYTxzb+PbLQg{|AE656DB-zf^DJeug@vL|%BJ-e)xw2(drYBa zm|fQ}(|*MEi{g^mb4pZb%5G`<37ITSKZP^dduxZKEQ3~E6|%LkP%Bdn8E4lw5`^^_ z*|b9aMo=h}bpVwn^{F|woO@k{sMgiy84Ksnz0@M>9c9Nxc5@Dk(AM!gLfJ=M6xMEj zk}&JOmguO20<9yKteucmvO-j7og|=_V+(7=>k9SfdW&2CtO4su?T36yqn>Uva-x9} zlFUNfu+TWaY&%d;&h!ePb7tdVKCyA@?puv3y zrKJrVkSeCyt8Z%Rz<~pkk_Pu3%&%P2-D6p|Ytc4s!92#I(A2r^I_I3J1*IH0GQNaxY&ve`c?~ zz0-R4n_8#RsB_d%>4cfhB=Gs+vH8+VTbMV0R!MPbaZy=Pw~5`8#xE|Lzi9sD^Dmv7 zltUe!zmPt{iqj&BJyu1=-$AT0GA3V;FKeKdaY9CRRxazEQF?P(N$LE{=MyBEC`aJ?nV5So=VtRQB?+IV31bM~-AKoKZHXaFOUakA>+XTbC5ipS`$9d$9yB z=3ZXNW(4T~C0yoGYEDVXrNx9Rfpo)05n9TvU_Ef^rb9<Lq z4zDm#@%2Kpvmg}ZA{{+hw6L>Gazu>fqY)bAI?g?vTUuP4Q8A>w`GF|cAqL;bMeyBq)X`Dr}j;ycFtN@K6?&i@6_IXhotuJ+dFk? z`K*$%sZYcVN!BGLd4U7{gZlWpMOQK@I1}(eDME<=LFYZ2REo+C^)OX zk=23-H8wtuW+naNg(@-e*i8>#_S~|Ey)QPO`Dn)vT2#s#{J-BnO6~2vc=k;7wchhE zRQ8aaHzjy(`(Soh@C<+D55bZc*Y<#SPcSVr zj+z?u9<9kcw)fzuz_cH+V{cmY*LX^kJ)2#@H})P}KR(KZ`lcTd==qV4-#MPmYVSeU z9_;(8TEfoR#g8luC@fCy6vs?o%5PqN<~8=O+(ake|Ufh*X2bkRKGv%8w;Q z4mPg5oWdzWsMJC+@J`P)Kah_pJJa)aETIUF`?u_n^#V`Di{vlo+XPo0N~x--DL*5) za=+_j`m3c&Qr=k?x&A5#dFnsxDF5cjbQfD;4y9L>=DJqyPuWTSV=F)9os^%o@YTAo zLAKRzu@+ppFMWGyzu?Z4{dWDR?^yzFTQ&$G_;bq2ll~u^O9rnW^V61xAA0Da?>>C< z^K9F_XLF?gh-+jmnEhn5%__R z>C^U zE!~yaWn!o*@u%+dVxBwoQ)_wa*#^(0>4s!a#GkDVp0}3aTZdqEpVOID_fsP!g65Jq ziCe*MnZQ^V+l{RWle}RtBN?tIS;!!ll`PU9v1P5$TES_@3xu_e<{E;RBOr50%tGGw zE4V{Kzmi1js+B|$VF;Poh_^FJYE?jlvPYiO-&6D!v%BH(N!qjdmuiUyNz6v=^F@wG z4g!2#U9BS|3!Wl9idq9_6gzzSP!e0z?;RpOBV{GG=4EavwXXBYHhuJ?W~|)?B<; zJCJB6YwzP73F;L3GAwzQo!XNNTyx3v>xuLksJ$BEh*DFr)!O-$iP`|2*DfOqvq8H% z=R)1+U93R+pPpn#;76O|C1b%!Bc=+}T^@lMGRbEzL6I-7U1JF^-A&6N>HZ zMKek-F)3WB{gJhJk-L&qJ8ZW->25mf@)H%?bF{tZbou>O*8%IbMB1*45eWBpiq-iN$nsD4I2SIZrE;lS}1I%LG3}`)6s$lkq_`QAsx}(UH@uq=ROE zna)A!z0iuSOG2I>e?NxYqxZ; zNjlHJbh@0e%1hr=;9SX0z*c%dv6^WSOBLF=wDf-3`7rHVB0Eh-_GuP|V^nVnawbK0 zIo+E`vWb*k{Z8*mr&MCu1OJkC_b5djtFrKYKEEP*U=3@JvJY_JBfkN|_y1C-^vjH_}<13j+OCu6XsUXPmXlSY*f zO7oZiO1Cr->vAr31bgluon|oC!_`B`;{)zMH`!@J^7%=-UjkvZFUi z(zt!nT=+ESlYxfO$@dCa4DJROgKvSCfqw;;f_&prEgZ`CF_-|xQ>3KW*Bbl=Y!5C2 zrKnlT_Q^nVIoJ(c0m>H0E5P9(dEk>~cojGX^zlC)Tm?=5SA*w)72tGm4Y&kc3oZv) z0`si~uLb4P^LlU{_#5zA@H+4Yki78S3Pus%dq8Bhe6qLWdiXNB+yK4@-Uy1s)J@=F zki7F91#bc6)7!0JGZ|Sv%puuOF+uPw-|f_ECKg`E5J8Fk*}hRd_Hh5xCYz@ZU8AW z-!0(V;2q#Q;CDvVU4cr304?Yim1ilD<0&WLC1*Hug0@>J$a4q=;egPf> zzXZPlzXp-J)AgVYcpP&F@LTXK@C29wQa605;P;qi;_@Rn82lL=2G)QRK!v^YKnHjs z=mZNvKDPVjf`|$DMAlO3T?r`u`oS)s3`EJ`1`xSJ9|r}}Mv>wZzv>(gfJ%+c@@OBv9PQ%-0c>4|SABK0r@FJ)gRv2!ZLg>oyq`g?-N=vcq z$?hnNS7>XLvst9ulc`{E#`d z!)<4Hoeb|B!y9gR?5nfgvXjnsd$HloG`vdYQl)@SZlj zXAN(!;k|8mpBdf}!~4$gelWbm@K8G1+7v423~#vMoojgG3~#>SEi%084ew^d+iG~v z8{RI%d(H6PF}%MS-YLWT$?#f7gyP)Jrr7alczq0SjNy$pyo(I4(C}6m-c^QotKr>Y zcn=%ig-x}U2!wZiL#krYHaUh1_4K}=7!y9FIvkh;a;ay>PKErzgs=2O{ zn{CRic0k2y-cFlhog^w07xseK^?ClK$j{H8og`DY8JEtQlT=n*oK!TUBx&Z1S(oqy zromJFbt%MMIKOO8$&7`4tPki(`dLUw^rx7O7rwY-W1mOAY%!tvE!W)KHu>tuCrx?l z!pP^pF7O@uIWTqP(afCXj+a)RJ>j08dydY#cGRWMS3cdW4^h@v=6_A-QNFs?zv_N( zrJ*xwPOonPQ(f^q8WDCn17h3RV!#p^fa{B+NFa>9bQM7;xx$PXiMW?5OeOJpBv%V= z<{)t7bw#cY+%glhICa0c%5#@PzRk+j^Nq;o>rv|}lrFJTU)-XZb~Va&RSPdbA~8^BeJpu)F_kB| zZ|Xn=DRmHf5MM+Kb21B4v&Uz8bMo`D#*ZACY1g@o0ilYTF@TzyF@UO?F+l2Srg1eg zb8PmQ(c?ys$#2S))Y4kJd6^?dj2N4rot;x_*RIwXeXV+(F~D*{#6?=6G$c0gucQY0 z_DdboKS{1yse$iOL^Q{`{#~ho-Bc}+8dxgD#U*8`r2#DQUU|*Y*K~d-N#WGFw7ojD zLLP0RxSnieFEg`ljTd{#+_R{tYoxMrNu6s-x*(Of-GQA~6SOtG*r}xp8b~XMl>S*Q zc^8ovRxbLdCjA>r8~PeM!_LyyA2R%k+M;BoS|-i4roCWW#l zna?UuwUBNqI9$E=kIojZ|9_(?mVNjbPa(iXq=kKE;yH@eDAn`D)NfbwMgPjjsqf zEY8kCC6izML2YL_hovfg#gXrI|Kf2ge=Y341bmXemiAvFi`()S$D-gEd~h%!vEmR( z__4Tb%T%kc%2G4bDpkeO*eZv^>5wfm5soNFj3ds`#*ySmb!0lGO9Vn;hr$enC1Hpn z`quol;jb-!XYkjKzxMof;4hQE=`tOQ%IA(#Eu%_Ri^xvUi@8%-N3B$Gk<`Q}f{IGQ zd=Du0ecYLt5AvKzd(`>d%ypV=PzjOg(95_7W8S0UBdO3)^SHZV-UQ-7)LQOQn2+I} z8WF|pFRGNoKLCpT)!ez558+y_9DGH*F%y>9ES5 z*+J9*p1)$3{~XNBqnkYhN`6&vdoh2Gdnx~E+`M`=yWKATm6(TNe%CJlMVNbGeg>5K zw4OT;^Y^%y@|QZ3K>D}aO<6#IVe9L%5MUdsO>Zt}U=Eq3{@ zz?_cxuXg!gf|+{VY%?hJDabtr^9kHbdZuuvs9i#oQJ1W1xh$hI=ID zFL5vV$*XV_?UoI0R{39rIRo?icKH`$?t}RSQ0mil+~YC-{4d&n75+>4Pv=g;{=J~$ z_Hk!o{*dQV{^xVI!F;`4{>v~A#{8yT{_`+*!~7>u%4;q6D9m5uUdsP;?SGeD{!-7xQ7VCO9CKMYEKRd9PTAHltp|1|CnnD4O5exz}^&Vg3R4QvRoF|J8Q+&%#a@?B5THeLr^&=Ff01<$n=(JIuG*<-Y=RI_9_S z^1lRg3g)N5Xzn2Q7|h?{Uea^A_Wy=m{&TU@75k5a65bl_k(j^2z2s-8{oieuf2jR` zV3&U}cKTrdMbN{29rt+5H7bq`TdfhNOW^BwyKqNbe0aEO8}0~849`*>!X24$;Vw3O zIGioRJEIE8k<=o*87hw)QLVyPsZ63C7w*LUD%`gf_if@?ImUfNV)zVkKRu4av~llh z8Qxdir?v=>756c%!mG4P}KI+GcQNameSY5@8J0ohimrfnAc~{Dv0l#89m1iVSU*}0!8$ZYe76L1>L_=lhcs6xZ4x9so4)wq=aabexz9(f zR+oV-!4i<#s7gUeR~bmJ$IMSYPtsRw%F>%4Jhyy+w|N1Za;x7O-tP?Wkl`IQJW6oY z(G3{y<+cv;3VPcI3tDRR@l%2;+XTG#q*VsWR|g8#2A;nHp^|E^*hi)OO%^;L5IP*z ze=^DAZ$=rW?cz|}@B{uzr~hQfC5JfK17T9n2G7%BuX6fNbu2k7>L1H`1`F;9mamp9D&l0^7KGx(T1>X)kY~?jk!c5m1y2!B z@MZrYRo2&k$WfNaPkHb9#d4%$eRH+<0ZH_cNC>HA!MwH4N{Xtz8~Ft`S%7K>BxoJM zyxaEvJ>Y#LxIHlK&VcvY^`mM6>z7IX{p=|3Fl;i3UedMj;w|FEMfEe%|Fg3^W>`K+ zUi!W$d%JVpwjSP1YrR{8-g`Vxrv_hNpXEsRK2Yj@*}H{IDSzh3SwZgu={rkWB1P@J zXPQ5Zrl+Cg+51e;yD|7mO5P@25PLrj?hWQ`+IuLN_lRp-;N~)- zw!S?BG)ucNt0?)DR|Afezm}g2<~^lLcJ$tlf_WP&-YkoF^Ye-~%fIJ%g68Y9Yr0gq zwgvYGyc>^%r@a@LwvoKuD#|U0D>av@U*s5DaG*Rf{cX?c5AYlnoWVRwsAU$_BIvy> zeUImwwvuCimdxqGsR(xl{=676z1-(n?UW~Zn<{n%r#<5FRt0wkDsXej$XU%!2;HI<#<(#d#w*4l`cG_)gr*3it zn+3g(q*PU%bW#)lS@audO=hEOgk-h@?xKN~^42 z_L%%TIg}yowTn!{(!_4&A#}Ae3P?3%w#OUwYf#ejMIgmytv^Jlzd=Q7-p5eV??tF{ zNr&ZP1RaY-U1+FTP|RNN4?>SB8^O>e3;xnwF~8N9j4GX=#4d9_mC@k22w#Njr&gbu z-r)IjJP*^;Xv-f_3RKsBSuMBX%~nUANsoWJ=Q66Tj-rETFsezMC60n8;vn>8MzyjT zGZ)IXxZ!&Bm?Hs~FRmTbUXme&ea<3uC*y5C@nzI?wl2{YzI3froe`NHhyRVWREu9G*OcYg z6MFo&a!#JFB|W{gU+08b@`+0QptEYIvy*y*MVp?))6y0wl?xrqVc)9B2-;fV)%tJ6 zUE*e4R`!+a?9(F35}b@YypeMCM}MM~eaEy}WOIk$ttGO2rsjFWiqyL%s9LYBph7j7 zEs%9eYH4wasLsxgzlWgC(%xk2l#y_9Pp(K;yc+48?%b$nKnZX*=oFuAN~G3nD=2Ad z)@7$k8`u)K(0K8zF4$hWI+p9lCB?;-2(i==pJqLXD#rmh35oD7no%}up3Yy1-CFHM zM;6d5N&E*$!6@ynQyp<{c3R6;Pis5CYF*1iW`~?e%oSB97PCtb-4E5&+1h$C=Ir=Q z_-@IgXF6qPfE8&}S!&x7pE7Mb+LS-?V_cJ6SF0CveNLc0Z`C}f<9?=}BD62vx)q5Q z2+TI;Z+QGHT}iByPh>tR!t}KvmM*V7SlWuiHI8UxAFVh$M7onpWMV^cWV@x6Vkx>q zI>kM7q@|sU5EUYFb*vkKb18=&`td;GDqVmjk88zu5Z!HiyvdH25iC{P>xcmGaJ{jY zPDrG;rHM$^yf1-p&U0(dz3=RdrgzJY-%>AG);a6h@iLDP1$Ige(VpEc&h_z-I?7^d ztslGX_^{hto98%MaNu>Qpy%tdXs6@%2wry5cKT>9FW31i8V-z?x9i7Y+WH2p^A^w5 zODnLn3wp*f-C;>pU#p+K=9+?R^`9My>V8+JI{7!Ryr{@{?9lPBP7{^<{89(hk)>hl zC~|3}ylZg{LWPo(kGRiix1#0J>iaBpr5lMIxnB&u~Z!^XL#Ebx@7u?o~QAL$q_LAo9sTUX&zfKe*WOy4qwHF+Dp7adOp>(M(%D-)>qz)(iKz$?%E1Y> zm7h<(IwZ+T`EJ2j>*}wTJDzmRama8YHGH$?-{y27xcjJjT)pp*vtZ>}{pKh6@f4wm zs53&@E;m~Jg^VE=M2vicuiQgCpC{V|#B1q6q{di%iufdrPd4D|Rw_RI#rQPa_*91{K8ZW2XyTKuc_Be~SsV#n zGWU?{V(uSx`N>Iv$|s{(CMYc{3*=VWU_MAb=u?B1fQvCN1+N4z2mRm*P}>4Vpj{aUk!eWnYo$|VQ|HIi7yevtq0y%1?CSy(S!97=m-A} zR)8Oa*Mgsbw}RxA?=J8&@E-6mxDosu{3G}!D6gPjfg&h=4CF*7IfBCXF8B@jK6o5F z2!033i|a}7AK)qQB=|ijb>Rn4I>aAAsWU%;Zm6`(I zAok@T;?ll#U`y~fHvcA&viAKJYz6)fYz_V%Yy+NnTT)^3h^MC95|Yi6dTP1NG`w8HD>OW*rY_Qw;AS!z(ttQp1y)E}=y$ zsq0p_QmZZA?+x!U!+XN;wi%u%C$`*5&9>Z1-L`n28=ef{7Ecy%EPJsw((qn1 zyzPd!*YMspyuTaXXNJdyK0D44HpNue@LCyOs^RrFJP{nX(kp`FRvuhpc*TY%BIK4m zzu}26xy2J7Vmw-`^fOVG`xQpUTkE@zj&K+s}6?O+3N8fcy}6}h@V^Ol_MrB|6Vt|w+!!d!~4?kel|R|Q`&Ab zp*rZgmTOaP^#YWvN=2(}Hsw}tLCGi)t^R6LZvA;oRIERGTJ)0xO_KN<(l~dBklQnbV4fCJ-cJDK{y|+H&V_%P+Jum#I@`LH? zMqHB|xp(4CSufww`qjIi-Fj2vj0avM2z~wcgxEz0*jh>mh4qVs*z1V?(zKZ!i14pm zH(tp_u6FE{Di7h)? z*&eJ^VqtOW3LTR~VwlXY#NokbZ$2RFVD-i9X&TrOAMJ$DQHi^{{!p>7BeQ5(`8;vg zk4%Oe`a`wBj))rH2PK!KO;;%9wDy%`=f;D!IZ}l~NMC#Qe+3%xb@1RM zxkU0lOY7@<;bCish2(crlJ`TUZq&V+(AW1I{mv!W>uR?=sj``;(bqS=e(SXC)oFeb z)Y;sRH?oI*y#|uqk?`*VeQ+WK)v&**s3T(6STy zZAy~=T3Sf~_CCDGvL)SVQ~q6vy;)PSH_fugoTth7t>r-tcGk?W>~%hkf3x7fIn%Ne z`fVzHn+Uf*mOq|t**abPd^|3i!^;`BTu$z${F9x%-(%;AdDB{3t9=9cuyCtGrc;96Hb)!E2 z6+1t#*4Fe?rK$G8xTTV=vFwC?n@aB^1oR{J9$0JHI$e2e<8iA1ix%8+5sfC}cP9@{ zVCRPQ+L{(jXexd~czn-qEIXm!rs5~{^d0Pt-eB1}UHN8V?^W!?++f)|UHs%#tOs`P zy4kYV7HBGdusz;P$LnSN*4Ih}vAc)aE=%TDOGDgUIu`W$<|zt^%QleDJd z_XYg5zh^P!50<^tmB&;b+=!j8{%F}V<@j^&3x9z<83)$=0((+V?{3OogPnsi zE^KaKPu>-nK>j;B2iFnoucB{Q6z|HU_dnY>sHcIq(X{`EI|D=NiTh`a@@C~~*P^X> zK*or%StG4|g<>9Jm$`$by?9W@cx#iPJR6+hJ)d2N#_bTylP6~JWzVvFPKKyz z=6i}|OwY&}pO@zyH`!PinlUP8Vh$azWnoxG?&zG!qjSyk;hJHLwkG9}^-Qf;Id{Bq zpOrCb^7x6~+QeiNV*Uk%#)BMfHu25Pn4Fb8wl;#^3{s=FQO4Ub8i9jcuV#f3HBu}U zvL0c@d6XDU3`UEIOfVsyOA01UHd!!68^wZ@mgM2sjJ&MLIirk!c^P9z*FGJWku%Dh zGsgHoUi=?9d6e-#KO=YixQ5E5Lvfp!k>|}bRwrdlx?r4~wAXN(=l`uH>PCAro7_kF z-`KGEAMMSozrnS^PR)AzU60dWOy_2HfUwSIZ+auT?tbZ;J4d$adBLhD2K;(@sZZd4 zH*UF3#aVa}@V!mXh5o^&WyZ+2DD_qZKmXA#Pu+?A|4p9%E1NtmRnxzQ8teK#neCRp z#_rL7;Wc4d>bU#cZZ8ulyR@~r+1DezyOq&%xvYbqJ)a;V_B?a`B8 zvCFf1A*Lbmo{HJR%?d-We)#T6wh)}`sM5IR%eUpoWRPXY~W}%Fr46NLrRufpcCy0${ z#{vZ>1LcPT({{2C#j|EVbB!Xcp}i)#g8U<5L}EupWqFJp$l-gj;{Q3Wv{%J@p4GSV z-iNOB;Ol!2`d^M3gHNKk|JX?Jb>&g4mAr%g@}PIe1J1GwR(;X;k=0q< zWU*y|{yU_@$~(Tm8OUnC-urQWQMLEuPQjYX+J~N`z2)E025-|&NOZH>6P*Dh^Kc8I z6U<6xLr7$GW-4-9HAMLVhiCOcy!32-CAh8X!>F{kst!fDsKz zITc~$(ej8uRyU4I@SpT7y&&DYd+Fq0-VU<~;kcE)KvtXTELj6lq4fB7#86*INFY0v zxKw=}_1#A0ib^O;yt~Pdc+ci-fe}%}FIc`iusA08awvkoI74IbDB2jIxpg6LM(}@H__wNiLflVDmpYWc_@+9eM9Agx{(%1HSTNYuVnZI zIQ`fClg_@5o~N_gr|)U1XNqH>PpeaLts-kh{#Je8%>R)iklzy)gM+-x*B@>gbi%}0 z2GqkZG?Pv=sWe$4`4kfb>T)#2k!U^`QuOx_0Ugk|F0TG1Bk2s_3xTMHlMp z)85h@9zhK!DF5;}3i3z3iu{s@1-&u;li{A#or#kFWQ1pR8zGiQsj`m2*Zm(xaypI- zZq~3t2;(F%UsK2ZKfA2{<1<1!ZDL$jkGAd2&!t;u?8%A>Zu1{>`PoUiRCZEk$j_M! zMOB|W{a?E5aOw}5R}-A|mv(v>6cxPM0&2e4paq~yW(q~uH@riZ~= zj}H&3>s3~*SDoPN^rn2h_jAj8GkQeSCa}o~NfHy1ZJwuJ`EE}juaXfWoilHaH&v@d zS}N$R)WdLAu771rgq_^1uxz5@S$!vhDWo6=gY+`qO8SX&htSn+=fEP*2ybP2m1hL| zVJl^>SB&KeQ)<8`txw%yr zyW!1gi?2Dw=RF>LrRwu=|A(D|-><52P~-idb%HT6Flu&S**yQ3%>yedgWG~Dk296= zSIWf3N>*Uxbo$~|r#j-qvnE0uuB>E2_@lJuyyMkbd<)l+^6K<1OwXELI#;SyN}cu` z;OppVqbIdXq9JbU)7(_^VM1BlT~W{gv9|4rpn6qSDhbl5@NXQHqM8bFmXYG zzp^ZUL7h2R8}gm=uPC}cjb~U-<11WAe*HRrmkutJBO}O>YVSUQVAecW*6bl!3q7(? zTX6`MJrQJsFfpJqba^GXEI+VvM=!)P| z_WuwEH;}i3zyf)@OM6oeav;{Ol&@(9q|vGe!O;uZ?>e3`unK_D`LK`LP~=~ED6V|5 zc(-{M+pK;Zqj7lm5TZ)P970XMQYaf1I>I1bfo}^3m2M!9)@U^^P#Ma2`|55qyipw?6uPM^dtjjwO_my8cBr?cY`Y%IK=k zBgMZ{_?J>u&HR^(%yb=-8O`X0WHLj79Ev7yS;5SCu935)kfqmInjM_BFIceKnr~9S zivrYYvV?QAs3C#n3;jnN<)2Y%B*Lm$I342M;ko(`a-LLH*par4D=iy>sI>cr$th4C zz0`&*}2Yd051fdP6Qrq75{j>J2oi2Ta8RP252=Reqo{B$82Jd{4m?-I3_INhG_rNr91ie>cfu4^frKG=_i+rNjaImJatJM|5kluVwtD5dLEuC-S&k3=unB_Xw8)G zQ>tBAgO5aVs3z1lSwqRnO+QJ?9r1RcUa8_3FC7nZQrneG3|QU0xr^93@a9I`yuQ}HExIEk_Jj)y;j_OCq1!0%@M@+6!WBc?{ORBIjgoow7ly;)6J{`zLB&&Oa9ep#{hlRVtGt9cG|t%<#Tt-)U@;E05%lg$&uZV)RR4`1 zP(NUn+sK6RQo6G6$(){vzT^SXv{yICjZ}O7fgIW|%8yDSoS!}+sccMbWgr+Cq7P3b za9zg_1Q>zx4hBZ)$(RgMB1@(U8Ky2~w9?&H)uNN~enek=^0I$LOLboUg!<(k$Z0Rj zgCkRelfqVgFK>rsF{{3p7p}4}StWcyzQ_m1M1A*8wKvK~a@*}ntMq@Ex$1j)S@Pt1 zqg=1Ms$4ml{*^mbU}Vqo2wmU!jR`An$yu9Q$?lrMipq;UxmEUAntKW_)>P33{QEz< z_7d_+?g*7Z5-)*jsV*>->`9dVJVJG+QY_F<=RnDrAE9J7>^+*2`P_q=>O#kD`SO6F zL>r66+hV8-8Sq!&q9sKgdfJtFh-GiTp)Td+>JjbpV^G%9kx`+z{0Q~9etI^u$R*mp z9Z*kbUN_!jtT3{pt#3LJYQCW!g(}xBs-d=M7YCvKtf?zl;&@h5vI6~rrj9^aE=1v5 zmF8tYSv*-)+M#)yp^$whZ9cx2RBPUBmX}}AR43NsU(-}hVkkxDLRq={IMg2fv?sE1 zQaTapFw}CWmMR@Nwo5dX4Q0950d=Lew-f3rP3?yAX=)GDDoyQ!x>{5Fq5PUU0JU0E z2car7^)b{nnmPovMpH+j)@te)R6tY5q1I{YBvepSKSEurDa9v^^_mKU`i-VUo#l0! zih+`9AEDx)uGdscC|SpiP;H=Y)Kq(@n>3XKb+e|Dp>EMsH>g`R)f4JAO{GFf{}`eA zL*1^a!BBT-YADq2G(|;hbhNCzZD+!#Qt3-}ug5@%T{rhrq%IQ-J%5&(TlZ+$CmKAL z9foy}mfh6g`7EAWAy{7_Pf=TXHPAXFagsO)zRiNGb%nGJ@gcC@sj@R|jUYRSIXTxd zfpYnia#06IaG=(juxG-H9it-uj8@oVjs!M`_jCuGJ7e0Z6EUOIN(16v$S;{-!_NGmtn!7iWZia z&ckeJI+?4pejt1EtT?36)|GlDHbI>oF*f4Uh~crdYI8!RB)*776v@TfBV_AnmT^-o zAsrl|JY&2z_axBlcsYMo8afTDb*;`9eX^v)fdW(8b*X$6-d-Jd^mO`MkA-(p6L}_| z-R>2a>h9L%VbQ9Bdt!KV<%(#o4n}*_3GQ2B&r-)d6`U;*qrzI;#9j|c z-RE*~GH-_Z7IcNht4?7bg?Gday`7SGIy#2tGx>a7fjX@OM>Eul6As$Hso5sg(tI!=vK55I&2CL8=O25*p^tiL=_MTD`W1BVasWkw}sg?54 z8wqHR$=v76CUf|(T_fEo8x&iQ3mdKSBA!$qqh|HoW&_oG&9YQvbXzqgdX6)u`5)AH z&m715adGOB_#ib&q4TTE;p_eAs-4FMNO4H22vwi_ihCi|r#` zB>@HE5C!Q;6j?|Q)^-LJQWg=d$|5Qv3T&k-3~)NvMx$)a(judqowh6I=}PH^s!Sy2 zY^|;2eDO*h(uKWS=h(cNUBpilo6~}zjac9ol{gtS67bWouVFf^-v$VhO3@oIgb0om#gz5a@3O%XOo_} zYGUL-bzS5{bt1B}I+G4$4(fPUqS|;9xD(Z^FnByzW%B(jBj!a$liFN3T*} zM0Zt#V|p`Hi&Xc=3{~I6WU3rGfQ7O992a>C)f=87wTSYph)Ym^i|e6U$9GqG@zLtC z_^Il%_>0xb7SZa4776O(7ClvmglLtU5b2oJa;rKs(bCT&IXRAXed+K|=rlX@&@6SS zKRak{rwn2px2d-rZP1!@fw~^mOW!!1s=X^(^>AIN9s|GQkk|O|BsC&@u-XQG2bM&% zQJW&%s&izNDn!-omdHf)B`VRopzb#tmFZWY&UQWc$Ed5+qs^k!{${yqtUF50p}t6c zy*IiG+60r;u$bm*VoZPaOiY||$HuAtu^!dh(@tIQ;jGuV!D@0`lq!z%s(o>1koH*B zC%&!P7=MOp-(s*TY~fZ{w8&7OwTM+UE!wLy8GXN@!|9jUPOVRjQeP$xQ@vVM>l!5O zDnXZh1Z~hd!d50kOeb2eiN0EOjv1?Ni+Ns;MWXcv$^Fo|(b5gvp!>%zoQ3<7ZW_Dm zG^a$z2Gz+qfkSI2s(xX=S06FQYYnJO`6u6iP7w2EVBy(M<2IuyHHl{Fu(UTVHV zUF?~p-ts)8*2X2OgVfG5;>W47_(aFeEfOh}$!cW6gY<~)RL_>(R8h;P)me#h5V_T! z-`9E2lgUR{4yTYb*VfE)*sEBohH&obneC;l<6n;Oc{SP?%& zy%m3}y0XPEwW~#n@+8ElixLPUAy<8xaE9vEvW2>|?x8Y#rdt;3+da^+M!XC`Q`I>AtNTVXCuZg?h+w)N!}# zTgUC;t(?;HNu5g(t17Y0KKA*wLFZ0C?nTtEzdPK@Ne^G*?0|YEMl5>2Rg8@Hfu1mz z8Wh%5T@SWp#3&HOWDzd)C+-%J9n>0>W#7F2 zIriC|#|uo7dL%kR9gTiS-A&K;RLlsK61znmiEXcTG;gNbpzG&4&l&2lXRu=_d3RrY zKlMR8Lvf2VM|MKIDo^OAo=6B+e{R`BwP$M4CDEncO6;Iow~A3kt59A{?z;- z$Go`KYE|4BjtAm5I?hkHSocOU1^PkP|0rFy$0^(15`=2erdE}i9GGs6e!Q#mN+mA@ zGLp(n=mqWiQ8kRQ?2oh|u_vi%rR`bs4$;MCg(A0?|&ZR!} z(;ZP}WOuZLUaLBzgQ&eKMz!XPj^WO>VV%?^VTlxejv5o*S6vl;v+5nuNv$C3?qw+K zPUDj3$zZ)iceNcU`W7yZN=3JKXo{c@D3{nu9ehNmB1=1yqO!*Ela6kT!rN3dt==lf z*LC;Xm+|;3$9eE1r8Buv8`ydfs@Rq}I;rZgIF;&7Q?Iy_)hp5M8C6o$Ut>C|KgFJ* z-jD63E^FRN4fc3cO5EM*wYWl+86W9-s%3Na9qp_Sbw0En3 zUTmGhm27!kPkr9!)vGMR7jeEWT*;m}dYU9kAgydEs^dpCugGA>cZSNKxoh1DlqfcMA3Xe*lgXzU9qtwpUCb&hKABRdq>$v*Re6pzl z@GqV<>XZ1@dTv;5MGM7zGOLzq_K`zaWz4@LP%JrC`P2u_*)FTrN-Y#ziDy1^Mz&?$NUu5o;j4nK(15Ntr(Xpx>-b+ zt9?XROmc)%jbmnYVZ0Q2SDwnvfNSUwuOW&ZQ57$Wbwl^JwmW(Da~)dL2WCp}_NCjM zMPDuI1LtW)gA%t`t!^-6kDXQKIC_+D4CvptAt!Bc15W=TjX8rF*%{b~)2|_Ca3fcP z2Q;)ZsDC3)!x;7-*vQVnMs^0IHuR@|qg3>5%xRR0)U<~Fq&7-dYQwP7hBS1QHn?G& z(*`w6d)mN;@kwixuC%m96?>p zj3sk$X6c^nN!2PXD_KPLMC)aRGOC!hP$5?26-s(z{Z1teneobiVNZ)=;h7MEw$!6&Nv#6ET;7-+;G($3f}SPJwTO zXg>6P2>u8j0)GO(0MRSw>xBOfC&$c#yubMRf@qoZ4FBW3OuqXHo*b96f>0l~IoP7O2G)4O4i1JKuA(#c0g4y5_FbAvvbHP7@UQqPMjR3cUqrvaM zbHND4k1=2jI2LRTjswpI$AdW_dEoPc6Tr#fWN;c-00uzx`1x)G&j)V-F97cY$ur+e zAlm(WqS(oydM2oXC2Ydz`2vYZbnP3$-4crFK244b^ciyr{EXhVNj0G`5Y8&YhvzXo0Gw}G4}x91x44_dteUu0XPB_`x8NN zKgBjLu+7EbQTSJaUw{vRUxFex`xUqk{04j*q%Hg22Ty|EfjyFo_ho?1z;bLnC*9XJpSXW$qD%0gv2=mpUT>&pj+fj5B};Ge)O z@Lez)`~b`aKLvTc^R;7F6v?IX*;COHXm=B%@P5_I*iQw(vB=Byq0K6YO4}1cg z0zL(zrPKF0cp>-|h(Z$Ici=RT)eBV!W`advAt>p%3`_~5e*$H^xz^@i2VTPS+rdl0 zjbJhO42b4WUnO`s_!_tZ{0dwNqV!u`2|9VFV9@oo0j~zzfvdqB@ER~5Tmw!51K@mc zJ$Mzk0lWsh5fqX2o50(_o55$mTfle0TfuKYv@`gA0)GoSnP=Pqvc9K&2Mz-70yDw8 z!6o3m;5Fdy!L{H<@M-XmU?q4z*pkV`Ltszv5pWRrD3}F4295?F2hRha1gC*dfra2^ za2B`)Tm)_f%fM$qQ4a7NDErHv2W9bH^8F9sD$3z8unNA+eYSxwfG>eBfiHu{!D{d) za3>hU3*0WS4Y(WZ488_-1K$M4fp38Y;9l@I;9tO7z`ugGf&0N~@Lg~Z_#T+d3*h_U z5K!z71rLI<<>y0iGWZdAKKOU=BJgAIV(=4i5%?Kc3?2ekgNMN&coe(=`~utoqWRVL z8u%6X0eB2N0)7wv1N;g63H%v!@={m>Hj|e_@+%s2fN`J`Yzw-;E+BISUpKH7*avI_ z4gt|6>q`gQf!Sbta1@AUS>I%^6F3!20%w9THfXmX+k@dpQh9YJIOe7(Uz;4E+mI3GmA zv+qHW6JLBUf;r$Wa3r_~JQq9!jsZLHRyh_t8_WZTf-lgIPXb>Ar-D-N=70ww5)DHscufvi%A zCV5{1xCCqkE(P0y%fRm7a!@`jt^ltCuLK_l#lJ1K`8nH6x2pG@@@c@PqB*$0;<@!{ z4~3Yb)klVx&5YXO$y{A1w<@WvTlk>M>cJZ3d^7?i&q7iK0l?=8b)wqWy) z8J=SHZN(+brra`m+dMvSYsxJnsm)6>yjg}f*YNy?x5n`3?QOU8>$ZOn8yY_3k*+WhpaGUMs2yh+VHj--t&gH%kW+^yuTUVhlck&GhNHSDw}evHx2JEhW9ly zPRpLmL9MvNGt0Ahi8kd{!wfIW@H#U~v+SK^Q*PxoywQdy5>1x9MTYmh;mKUk3ima` zd(-fa7~WTg_k-cp7#`nS>@W~9u>I>|cwG%I&F}^p-bBMY&+u+Hyt@pq%J5z?yf+Q+ zFNSy6@V+p-pA65z9MMW|flWoL3k+|*;Vm+}<%YM?@E$b0M-6YM;q5lO{f2kI@QxYY zal>OB*v>!sh;GF%&hS`Cw|U(RuczS+HoT#RH^uNSGQ48LD>b~U49{(0#7s%yP$%B{YD5(&a+^|ej8)k&xgn)jnkxfNP;we%M!(AX4OxS>QI z3oYC>bGZWS%dSTYr=aYTh1rLNR}VTBCU%*_2xygIc9|@=hR>Tk%y% z`7|%wrqI+6b(Q9|vMIOf0wuE2(W(6p*E-TRTnM!OkN^<@4Q*#@B`4+e2gg&N`7Xs~@lS)#FpbvD>#TQ=s^dD8Z<3gyHs2R+t#@Ay_J+3_Ob07KiKy^1Z8L*_ zx{TX8k5?$`JYJ#Py3ScVsfQL%`WcINx8ZF!ylTVSYj|%PUM{6*xgBLwx;~x9>AW$r zL1PZw;P@ojhI=8T|Egp}`SXRjw7r~0>xCRL+*2`3SR+g|^Q`G9wpT`B`%I`w^Y*l3 z`PEUgv|G)a!Tllv|6bWBi>W3ZB036QwXEGhT{&2GIgIOO@AX;WKzP1eaAZ==9+7YN z#-LH9Rd8hTB=HSa)J26_hW_Gd+dXlS><7^Po;S%8uRL)h<2>=1abOad^o{4rk*P(V zzhP;I z$bl=kTdGg_U7@Lq3EZMWEp;{g&?V~1pIY`VYw%pY zc!YeL4Ar5*^OjC|u8T_R9a5P4Hs}c?P7(+Cs$xDusoI_Zsm$6=fNr5y(4k5^=af#wbqaE#-6vPRM&f*9pG7bE%p7LtTm zI{(ty#Y>5k)%#7<7TT#ex={I0FLCnez`kwVi-psRCDDs@Zn77vO^*5}y_nASc>C+0 zbjPJu=5cB$pTDgu8Mc@$$pSi9+x&?Ayc_1w8E?8t+5AwQ6qUaRY+fq8oYVEIl27&sr~3(fyy?@Pd=D$;hV)7j`w=mY{HpoAR^`r!N_j&H~S91ET z^VL^%>eQ+AtE#U&OMw|c4=@vWDKHCoI}qb8&)vXW;G@7iAY}{Z0G|aG0-1Zp06zzg z1v2*(0dYQ<7!TwuVKETrabX=Zq#3}8z$w5CE&}*_>ow5uo+Bb&wy=6nM385*!4$FoSyP*v>v@wRp_^R-x8Cr>! zyVTI`F|_*)jq(u1_ky9lV`v{3+F?V(jI8zCc_{75ZeaXl zOx%7vrP~B~3wuL;MC+LY0|E*8Ir2*X|0C4zWW-s z!?*^7ReB7Q{!4LD8JIG<(#u=eq~oLO3k=C&&ckvu9s_#fdag-lCKA;^(g`~=`rQ!r zNvZ*>3zn9cE@Oe(%PQlALHDw=!z?_@A`)~OLMkBGP|$cG3gmNF0|x*v2j&AY&FdKt zTmzf}yaISGa4m2e@KPYtjrS~Evv6VUre$-=CXqCU+>St-Q?N3i%^{w)Y)lXCFV+@dlT z(1a5f&_J|*wScy<+UaDxQBZ=A%((JJgI-fN$sWecG9C-#fo{uwHA9_a@+6;H|)gz}tXzz;(byKnQ0&Ob+^I{@^|H)@)ocQm8?jQx0`$ zbBJx0D-=~)HU|$Yl|G!}V?&EWPE>vqESm$H!8EO#p|PK?_$C-ysiAQ=qn_(Cw6%uz zS3|qS&{89Gcq1)a(11H#Rt`gD<1^A>QExZw0C#!L4 ze&{`xJTN+YuvGIau~f5E@*Ts6-thijoLYkXO85H z$kzxO#?O*ZS3mk21h;Klkeivt4L}a#G1=f50^AN{jr31o7VtG-4sZuB4@f?K7vA&P z?Ch%HJ#A`uPn#OvD;kIQiguG_a|#ac6>YPjy=-W28rs{2_KTrKAkQejEiD^1G8)>| zhIXByp$(ki&r6Vk+dMVUGrxA)IK#(0r*D4>aHN4KQ zbk`XVWKbqhHDQr?Vp~KCdlo8c>(Fnp_AsbU4il`0h{D4Efe_`Yp1FEihNFZB=8f>8 zpCO9hi}Cn4IvS{ED@qrX)KxC4F!2cZQ1M7YSWS1mvLuZ}l2NSL0&xhhM72bshAe0p zoZuN2B<|$d2X@cjqGRm?oZXyx&YsRL&TQuxXZL6amb;I0_Hp)rTReIviFSRmJthAq zNJ6#i;!pBnPm2c-C4MrdHTs#gr8Oqql*Fb8%@MYVqKl~n95%tq2%~V&hJltX`z@bI z+QmpU%%~u^;7v{R$3|j<ls+?X@%!REvw?db#)wAL|X!ux~6^-?e;#2Yx$Ux@H5mC7u5zSO1qNx}W zP4rKQTziS7p?`7S%AayFFlJ5gOC^B*3As=|W#2qw%gUdq8w`^>f1=Vi<(gt#)jibF zE9UhOKb&Chk^&PNojbxa;c>Wy&sfk86LBf7SkrycnXss|_WbZJ3I{D@%!YMHQ><$plNVd10ZGsezYc%K0N?xYu8Pf&|WaK&4z~NNQUeby9|weCiM&sP}DOlf!NCYezvNH)KQcCCjG2!AK{@Tp7BU^eKlNWc8^OU}2 znY;J;UmMjmF9GTvvquiz7&5KLOc5@fHi$`(I=X)sM~(FQ)(QQ8~=Es;e-JT2NUhDI5L@=M8s3a_o9jWD#c3~ijDaduSsU1Vs>42{!W zD!es@)-giUk}aE(+)a+)f z2SJ@8>aA!hmd_rbH4aPRhcC-g*gbe-LzeQH#oU8XlQ1fR?#gz;!@F*ZsOqw;OnJAG zN;dJzLArQPDwgE2)HJNhXu@07A8#AGjPvoZrNQ|9qeqI0?84I1RWOn2ZFw6v!%|0+(vJX;UpXZ4SA%PSGy2_#AR= zqN3eoXd5h>Q&t+vF9wh@WT(^*sA%o*ROOeWVMXg@XnhQAqoKWMXlUVadK6alaM==T zRqw?t-5j&}$9H3y#(N5XNk^*B%w9L`3!NvrGSrixFjZla7&2`DjxIMtUE z=c`jvLC6H5EE6kzELF-gw%mfJ@FfEyDSQHBSb@;U$N*W~_!(Iacs+!RM!T;>EvFUv zMS*^gbPc#~gS%Gb$8hcnbML`CVf976hV2tPFI#Z0?iyfzCo8 zz(7Ys_ff*cR#TyiQPgA+)pD0#Zn3L;Fhv`z;N)OnBn zuj?%OF0oNGF0oN@;Xp_Aa2oLD|NnPN*dL=|jYt#TDfybTFnJUG zu(IPk85>h<a%w6%{q%6&VY5Yw$)({x{8lL_hkscTApYS_yD`|C>4kzgF;rIs!|q zHzVkDVhO6U=;bI;Ob7IwWk;YA$PU1K;B4UeK+wqVsR1qkvc%%@Tmf7L+zq@C_%9&C zVVd%u&tYdtbsT6@9S7Q!{7KPR;uQ_`g0!i5PDR^dXw1!uHUwot`AxNKYRNJdkxk{2 zWY)7>N#rSvhABxB4tp9~C2$W9`6kn4oN7qU)>s<7CIt4_gW(F5I=TuiF! zfOMkjGS6D1=?osDa4jw>=H*A^+TSknUM}GYtfAodrZA9I4Er3H%6m?Cg-(evTI@^p zlN5JHqOYeV-PVkJBhtyGNYrn2x|ATcf_^KOeH)Vw7j;veq`UEJQbpa} z;FoA_c@mx!wmeDBW^I)5RX;jEx54cb7X2=)nBYghAIOZsd*(0Rv+waBka_hHUiI?*KjrycbBm2Z1jD9|vv(K55aP z0X~HL4c0xgLMblQC!tOCNoaFWz9Lb~kIc=KevTP2)x{R()Ips^6LyR@FV$0?b zOAU>~?NZ72XG8m|p*?G88w_o)p|OWiD*b+CXh#e!AwtK6WnS_1GPFL1hVAKAoc9`< znF;76#jIVVn6;yt321|vfW#mH$l^%35DL!~%`b$aK#N9~`|!s7-*6i)@=ZlUUix9i z9*&DMz{;2^$c=GI&b*4UUyCt`GhcD}S7b#@s#4KQR-B=Uq6G=R6)xc^&JLaw6&CyKtm$Vy5?}*xC+ru3nQf())Sr z<+<_4vo;-$g%jv?pTm8^+PvcpIaPR&SbJfWUelW&i6;J_os`C5YMpOyNwY=U@?*Uj zk?uGQ_1QI0XJzEzpx@)(qd0}SA%}@C4n}&*;*R-O#A15YzbI)xX^#MUaxUw(>7pQ3KJ_^WMDA=7U z0Q8Il`38o$b1qp+7|LMVge%y8ntYIaTe)&^H~fcByfID;o8vCKDaxk6E?rpGTt}RY zr@#lBUEOtP!CTSKHXa%H9bD12o~FUpZ>$?^79%Rs?;`zJiuBvzriBc&1A^6#S`F(d zaAk$fX@&3_K=&7V(HW}Jhanj@<6_Og!9Qy*mNkZ|l$=smIak4O^~%+B#KP`jsJX~d zFYl|MFjEO3pfN^LIzbtyQj*yU_iWgp%LuhjK&Z(Y&q;v-#}ZvaTKWhi880nZ2&71$ zkBIPot)*{?$qdGsZ^3skl@;F77=BZl({LS;HYkxno5}Bd6j%uS35W_yoQ?@X<{hYC z@L{LYo+1HN+z5aI8p>dm;;$u%i z@o|N-qW#Ix9x$|r4eg(X_PU{cXlRrNs_?k#MTN&zFN$W`{jkMgv zE0^Nx%7x9&L6DpI^}n0i?=PzWb_Pbtu>R<&eLUnFT<6G#sUMwgtn$WM^j^rUOqUd3 ze_&r=Hn1Ns*SgQQ?iq3NF%9X?Oui78>N(J+dJeRyp}nGUXs>7-+AG>^hPK7fIJ8%M z6ecJ>_Usfb7hhG;Mp?F?1^8HckIdFzX13lcvvomcJ3Y9Qnb=?^x@2p7(m5`^GY!*< zCOnVjG?T~ZhiS=lqaFlhbRL_$5XO{jd@bhm?ssD&4{A?)6gg^ zRy2046d(JripGXP(N-B6g}{ntD#aX`PtTP3bhyf=1CUSq1n1LEIA;xqC#cC@hj(iv zR+O_w^p?gQ`<0q;5@JhpqFl=f^`T)xQ2Jr6JsVd{lUzHcw5qZkL!}dSz4)Eb*V0>74w?Pv}JO@b+Rmb@_aeOy5RJ9lIA1?Exq-8*uz=3gM*rmAGzgA{t9R@CS6{WRh^JE!P zI}zoXTY6o)DnneHbk<4B5k~|{!pZ)&uCY7H=bU1E>awp(AYW0BC2T^ECE9_?9E)A< zm|Bf7zIB3V-wEK*zEQ(gyRkS|t#))t-^Gw^L?Z+xdTb3^mZV3kmz8#T(gRXRijR9BRd}cXjCUA?QmSF;LR{8D9$ zWQZwQn{DGP$%;O!8|yoOosvnh`!nB)J`MRpU=QruE+3bt0K{Fr{sRd6h2%hckvk%@Y8CNAXzcNd0~vIRS~QiH>oIYb5{ z{o7Uy@sI11Hf{(vrO8NOH+K4_x+r@Cn5L-(p9>Iy3vne$onFfJsG&7iQGLNE!|1Hd zii!dj^78r&7maoguBgcOv2+c%2Uk?H;C5MWzudmzA%|B^ljiT-0VD(?3R97^CykX`mdj zsK0!9M+17m=!)OrC&05R<#dm-r2ddA^C9yl3@4WV)i5X26ixwvl) zya3n+xEKhbhi5gA;am=cEZ4IZcq;H3V0+*lKnQLKord<5p|R|#XS`!*9~fE=s!$b|0?X#$xds+( zmZ4QHEUT`qttfLRbDMHSZL;c&)-ODNVfEsL$z|0GYHBO$xM4AQL4|u>b-Acqh{eT~ z<;kijC(9j&n%xQm%e3a!C3DfG4z#u`c|m2}f>Jm7DLR1JRn=wZC%c!{R2Wj7ySlcb zJXyJ*(SZaQckna~G@`anXK z2VPVAI02O}Jg2lad3I^p`G|r3K&U@Ut`gfT-F0uW4VPW^LuFQY)`_K^5)75E?W8W6>+C_JG6T5 zm;SWP>l!!TKJvyW*Q*oW8h*zU2Yc6LzF@oh#^+ZJSikGrgocG>?uF;Hy}xgUt8~Xh z|GH%I^)J;Fez1GSwQc`>eCCLn%uCMtWZ&uEXN>Imp>N(juk8CKx9{4>J3oy*{%Gp= zw~Svl=E}c}?J;BD><)8xZ2x8NrL{c@?npa$@XG^HA8k0~zVOyl|Gjxg&dwVjSaD9z z%r9+!&B*@K)g3?dKk@OZ^3sy;@Bd3}apx<>EGo|3SaH?;v!+e?G-+1(#EBU2RfBaj^oflu5`M|$gpC7kV^!xGLbFV0SX!nNmuS+cKds@rKs`viw z`HS)&8U5v@{eS5B>`TeJ&&@3r7cKsI|4+|6w&j{TuD>^V{m=hOkN8lE`! z<34v@={$PH?Vt30f8zafd)=L}x#CUx=AS=4wDgyEox59KaO%a2=Z;(2vZ%WI`n2^A zyt49&Q462n_*9Gj%X>^%_e-DAMbiroW#%lkz0_h@)u*ZX)pxxp*qTB zvF%q`{`bmA439Vf&zyrS-*3PGNM=2X(yyGQ9w+s{pw>XO&dNO0^eeBJT|c+mL{d>> zfaf{10D%^nbc<&a?RH+aS+s_jeznZIibUUbTMx_qmrnOkSZ)~|vg8r{+!agQ-4-mQ zV-zmCjfebVMW!`)r;VtLbW*f`m3 zj|9bsTd+gJVNC5d4}STbmXEWoXc|sS$+I2|ZD6B`ZxRlNU3MGOnC9*>TQlj*ZiU^( z8GStr#i3E41*bDz?6w;4&?V<8a^qj;7MY{iiNJf|W2eAIlh`C24*BdjGgkS|Ui9LG zrr{(>o|_RoQ+vV)A`gU;dGEZkK>oATNAyg zsA)JH!rN`VkPq3dqv_Bj9J<(T?@Cw9S2q;G6GIFxUnp4Mc@Sis&ZjjAr<3H_%wJq( zwg1X*8cwq0xfu+MJx!-3;dBPoZcCG{&?u7989mAH_;isx%wzg{b#4+)SILtF9>!;+ zcz9RSaJoqzHyHR;Xu38Dr#q;28^`E0=S@BKV$*O~r=k7{icj|@;q;U|NEB(dcfGo{ zX*j(k&vt~v(n!;@NjSYhwcBK+3)_H)GjC`b&KZ)2B~ORbyGb}Kd3IYFerdL!I|BrG z2>I@PaBsJ<-eB&hNof*JUr_C~FZfFa&+Vva!^7z(d8P-Yb6*)wiM6hu9-~CEtiiZS zOc|%4FkNUm8Om9TfbXw;=@jW|D5Vxp3qz3&3aF|lW8~)QoM+)$2!z5K;h|zat|OW z(UQVs_alcI3Jxk1A`^MdP;i!^JW?k>;kk)o651cb!?P6yk9Z4EaQ>p;VQc{k&S(@o z7A-)*IgU8Lz%4@=iqkp;kIo8E7;+T47KSneCtnI4!xW$lMVxscQ-H!0qssCi z3Q~iI4h1N~!NcQzf+*nOfj$8WPV^K!GAD?FugpVo0+ckQ50AA8qTt)up9}cnnn)V*g!*E>w%c^O^uh<7(bVY}o^Dyl z6Y2}uDCk*N?)>W3fG-{vLqncWU-(Gyh0i3-o&74%faqs&1qKayLVY30;7j)`2FE>+ z9q_fz@;Qz10p>XZl%hSQhex`ohPCFP$1U#9Ukv@D(o`9k*fyvO-?o1GJT`A9EaQuGLB09fp(NSKlDvN zgQBJ=y)?mh&|;=<83DDjNK*pqKs3e7v1>x$fCNpEv6Xv~G^NB{I=iaEJf~z%vLh`NeCI%KemxM_9OM)gRyCLD#(ZJo(Qd31nMoCU)$$;!pnPW$17Zr^z$jUS_ zt&E{cYM3!pO0_Z#^VrPMqsA2EX65B&S^`I~1O${BLzRRw;2|$FuV{Qh&e($S2wh4o zGlnX$WyVm-Ed!i|nb~8rvvbB5jSmE^V7QW zoB__<%;LhF?9sWofhb7PV#ZKPJ_CH?GRGEVW#tx(9}{3y;?RttmIq7tX#C_L7D&4M z;_U29$PDpxNJ%q>Dz=QF)wLNzwWJZzU%J3}%r49vm77;wTrhrA;9-(__KcxQrfMFLlb@MekXw|Mn-lcf>H!&P_+vUz*qSjE($Ny!{ z#&32}=IGHy1zDrVx&mW64J8|&L zR^>t8rXX`{_L$M*MvrMG_;B9wnRz+IMOotu3Yta*-<+QbvR!;r2zLYToS#{gH@YBi zRCXSGSpr{tJxI-(l!8&2`2}Of6c&tU{0*!A=vI+IY2yR>RnMN^KN)7=@YI3B2M-=L zB#n0gGjPCwVZ(;eeb}&6NuK2xi`F6W)WP#VN8?dsRi?qxLXy}kT4l9o77J!d5<X4_iFEr;&U?l0(vZ;Bsm40|_vhVnAlFtcSE? z=qC*Y-vFz#z!o_K zauIBrOK0|!IyT1_)MH^7kKh^+#)lb4fuh(yH!nYH^4LjeAV+k;PfpRKE}_KnV{^x4 z73EFrlFVZDHLf+d#tNmFIcLOloPtzaH@&>3s&wh}TukRxRhO36P5m|<3N~TbuHTEU`y^_LJg+-NRwbgaibKJ?j&hDK& zzQ$d-pmG@}&~nfuS3(wI#fb`XT4L?rQ;8smobkDN6Ctos_ck#$Z`?%V93gT?Pn@Kj zZvuNp#-wwL^B}&8N#t!-#>7eE&(6!0{3PUNOv=h0n}_8MieXd+f|G&MwKyYp{J4PQ zgpBMgdgTdT0n-v%*y?c$ovh0$O56~&#wHF)K%pzqO7akTtlYm*Kel?|T$Je8L>|)1 z76PHgCU%DJ#bxtKYc1bAyF|)aO6Js~dzb(g&eH1uYh(z?@RYq23m;u@egwf`_lM#q zfl0;i<=kj%5coP)&$VO$9~=*&9bbJ>b!BO41{zcinQ^U0sX+ntsN8Q||oX0=1?k!FKu$| z@9C;@S(ki1)B#T)H~=N7tg61e0@i*5`VCAQFl1oA0n_WtYTeV3yHHm8&HL{|LKmO{ zAzIS3lDgkB%*7^}-6jo4?p86oCizT2Wlb{gha{&Y&y)nvNl-U+>LwMgXC{mP)MIkD zL4&QQ^pyesejy=fybR)-n*4_cjb{y!&l))BcYD~-VZVP+CZ59v{ND)Ne1c&^^y9up z(S+<10^PBRJn@lYX!Zzkwk2#7(mCZqT+-A=X40U%7r*C;Hf_GT?tu%QTk=5OhL*D* zI{kxI8zB)D|9Kn8Qs1wpe75*H0c`?$iHKVacIQXqiBX72Bx*Q2>NTFcWkW5lRw{cB z4WSCCN74KAPw42Ie1tmS?!+B6q`@>~%N>>t*?dvl4Iub!*s(c3;SH7Y{-lMHtmwgP`Ee>{ZJ?UW>jonrgyvt&R zyMuolo>L5VwGZ_z_=d*=>)^wC%wCu7>Xb=^`fae^w0J_}VE{>exD4X+=T3gTk@4c@(W?|$K)=iP5}XYdE>AY(Tj zj_@9|t0y*azFxlc1VrXQGD26*h+Zz=M#U=@bZhbDxhmN%I%ROC| z-|e6yx*x`*ytVtVqIr)c*PVGa-tQE?A9V`{z2Vp7*KdeK(JyH~3eWIa+aO=k_0*0Z zcKV9m-LyX;eXF}I-Ye`~CLx@`jlRNM`E3voKl=@MS%2OkSEpQgV8Ln4JpW=oAIX?^ z2s??p;1lChPe3Hw;Zx(w`U(d$PEL|KJzT5Df;X-HUH{Ae<%eAPdGDq-xblzs^Y%|| ztUs=npCTmi+Lj+r`2iu?mhVq#@E7K$?C|9sLgW!U*J?MG$NQHbwKCp;n^Aha$6D46 zZ~ptk)ufJ28tePFRNsGx_h8FShoih7cJepiwY_^g;VyIKCL7AAFK@dqdmb}}Yt!LK z@5V@9VYx4Fr!RXJ5_jc~r-Q|HS<5KIVEOjbU6)0|hE=xNRm>!5c{>*^WbQoEKl!+; z6Z2>LX3}pUV+e*PBmCQT@6AR&^-VrLE+~IySNV4!J8U{^H`&njR3!TlVvcWYw!0Aw z*;VP;vudyL9&KIM)zxVg-2{k(UkT^*E~{!?`^nl%cy?n$_Boi(5o-%;eA&f5+uH1N zd_~*Wt~r9k(Tw9Y~PR@fD$f@G0rr7O(Rc zq3+pxumy4XUIzKpE56A)eUsmSqT0F?WU@7{x}MyX^7ih-$d@QNsyO-!tLFG}3uVF= zRvlP}mzv{UzBj?OnhEdEd&BkQM(@T5-axg4>S`l$1s=7}^;B+QtuJryfj4Cwb}|k>Cf1jL;p7o{ z6nP*tHA5njXJWxp5QE^55%D~^BkoBZf7Q81CYLH@ht!Hef}AHQNG|d$2UFOjkH=j+U6^) z@*cL;f9{|06_OFz68SNGtLu_Q&?~TVStP4(*Q!~N<;?Lu<3=tO*i+V|PRxXRQ|cL@ zHrBsu3K5&-phAQOsJ47DBau6^0ON+nCIQ(UK^QJJU`-B3*et*p_a{y_m^nbC4PohbZF&|5v->!xrn!u zQTq1#vg7=leWMbf+JQCqai7h1K_pw}Wg~s(Wu_GlsEhS)NO=_klVPKGMus+#hkh7Muc@qvrO14ev8!d`sWs*SEy4M>E0zjCeK zz{J?f6~_V(_oKZ0=qtkSR{IVV^xYr(cZ~5(-q&@;(cK482_o}F{?)$~nMua9!fS`?@e~c>6Ug7?=zdL`P;z-N$360>Px(vKG z5~jHhL#Fl6Jk;Rm>FnN%`o?~A96V$)FBOhWf2;OID~lk1>^^ME&P}m;eE#f7{=(_O zUwTrLEL7&|G@UtVQh4}Ha}smV%Xr4`l7s5z=>Ao6^(W6%VLn=J zbz)`CM;3}HfVOm%fzWEm?A3fmn&gjcl98@GVMbD=xcSdKkPQ!;QuGsig`)yreAdao z_&EBLh4(jq@lj~=vPa=VsQ4foqgLv$v1{I;l&xt++ZQ#{{kRt2SQYv z@yUm#`A79hf4%PXlvgJ-)}*4(th>r?r?=52)$zD;Q60qki;nwhB7GR5l*l8m8uE_g zEyM;Y>^b)W7q6Kwpc9OK)P`o*yjTWyMTO#U0$hY95J8YOF zfa?!v>nNVa#z*uJxLN^c-od8$*fZtqd$hR5(C&dPOVZ-dd7?ZzNly-K1>~Y~7{pUD$d`+g{juN!vcydP^H3-(+Vk z=VdrwpM;Bs8`jt(ATMJ(HOze_QcABl&xUPsnEQ6=j@N>jjw?3Iy*E--Z*QZ3p#Wp5 zaLquB6XQVq27(7=v|@#9Zo&xLuXdKTNi`O+7vjpePSA*VQ1p-JYu^yj7-bi2qKArE z(dpvv(PxPFqR$nhW476Pws^zV(&-luI`_yuV-zW{10%%C@#DqSF<->&h~lPO&gAUD zx1+#8sr5nZiIa5#6FI0KJmbe8a`!W-WfOCxhd zXYo&Dn%5KuL&}- z5PWvxc2r1|k7M;+{526zM!p==R(uk3USttoum{}t1-aWJhuQL@%ETj4=ZdRhZxOFM z?h@oC6=g6?{jGvFE2fmm*nnI-^rdMSGy^qxWC(>5w zzMLt&O^H7RRmo`NMIZ1LB+Q3+Sd=Xq`}<-2Fp<+DPW;o+S7bOxiUV8M{C-xE^2>G&*vMQ&e@ zXT6K-2(EZrZ`<^UwqkL_-O$;8p13!9owzP$l<0|PxMSCg)D}0|567j7p?FOuG(Xr^ zc>PNG9@oUTio8{9iLAuA?{A88t)$?D5q6Pt)eMt@`QS@grq98H`b4yE@=a$)T!U9+ z@Jvb8#h9b6u2P#_>Ai(a$w+KARk`xPen$GwjGrpzqU0=$kF&P0+5{CcLQ%GJyg1YO7bo?hW+xuSo0ZD2 zZ;UTRbiy@gu=McdX2=rO9yQf@Q0V)Q$gWZO5mhla*mQ`5Xway?XKO%#8N+9rm?#EVHW1I3Fm3F3H6 z3sDoBAl{CBSZr<4Qlw+?!85ozI-eAM;}XR4aV^E`ah=6+U_yLrF&gjtcNu?Gntigg z+eJSaADf(rMRSVOh)0a>6JG*5+Wg`rTe^sg04-vXnCgBS;gA1}`FYgW zomWv?0W~KoInnp zt@tRamG~j5Kx9Qfgt^)s;*FSg;z-QnO=^p@sCaQ-6a?AP<3ef+zJ{tTq&fw*2>hzs zKOfIB!gu` zHJQ%hqPS$S#rA`3Icl(vZI`w9P}W{79A)z3CdrJ=DqyM%?^{Qd$Ptso%?{SZfm-ZK z)M9VNd=z7|+FzScnWMEV0EZCGD*3#t;-^^UQKi%z%%EGf432S-6{M=p8O63T3InCm zz`&zeVUCO&71u>9j+=(oDLZi|g4b33JrQ@vs{Z2Ghr}kw6SDZXhXP#|^&@CTzYn^; zgPjU4hRCR?9~lK@g@TKC5hrUMiy`bbK}2a+xuQN5GsK~k;o+14gTg3-u+AJ?zkPWOMKc&D8_*IH_6T&dJWcn2bqZi_oJ5MAM5_p_|*qxoO6?sa%>nWI(m8|4A1RwNk^`_D8l;_743HwvW*<#ixOJdn3~ zdI0|o>puBF_IR!WLUosi>+~{#8-W1|$Ej;W@7XUi}M*({SM*{}{3xPv{ z#lT|V*}w~d6M>fiCjmdQ?!N_2!96r@;=Evuji=%UI45C)&Z9Q z-9Rr8-`4X8a5->0kni<2@Dku>z}3L7ftLc00WSwepsV8p#sEJ?zBvte4erMPuLF(; z{uy{S@Ooew@CM*K;9r3Yfj0rK2i^i)2fP({Kkzmn=OESrp9J0so2b;Hkj3fL(!a1J3}y1MCm{0GJBg3mgIb5V#!p5s+(9 zKL%b0JOKO$@N?is;6Y$VRE%E$y8%&FJw1S50Ve~$0oDM&1-=LT4){6n2jFqwQ6Pq1 z;zytZ_!E#?rH%pH0)GZ}2BOS+&H&ngeSi_bY9LhUdX@qsfmZ-=nzZLuAoewQ?gh30 zJ`8jKp8%rH@O%J-+|%<3ustvi^)MPM5BCaT@tvn95PO9@{ehi;Lx9P^0wD9}Ilz9n z=Ky#J@O&b4f#km*cnaR@31D~JKMm{wd=}UnxDj{; za5Hchp4R}Re?(U<>rhHp*r8TRS7=jOY!&TOi_bw-F4jVj9+u6)n$4o24wE(qYaxp^ z&d^YEShU%OcA2614ee1wL!P(7L+-Kseqw0sqpJA1EF0otXlEH(si9REn%~f_GBlpu ztit2j%_nU&x6mdzph85(CIRCs3@8fPmMZKk2kHni&ujSJ=! zA7?+*GuS>T+IBIjIY+WSn9n0nr2VmYDev1|_E zM61<9(p;9!A#Q^W|EN#zv}_K!yFz`p$3atRu)(t7z(hmaVQ9Mz?E^#m*w79e+P8+* zXlQn{h3XmHt)ZUV+R!=~T318sZ)k%JEyK`q3~jujO*FI;Ln|}1YD23tG_Jl)NF{eq;Sq-SATv-tP$$yAJ+|s zLAQY#LF;_Se9rD*i4?RM%E_r9ZKb(%vCJ?FQSC`H3~dzc`Wj%-wL6snDpw&l4XnrA zkTA8q43qpEn|%vWgEGN$BHS}c@eN1t&=*Y|bd&@!c~Muu^hGv5`I$=L3OaQJ;WhSA zAm5w!?4z{96(c7{XmiQ~5omLWyDe8I1cr*wA)Yt1O@@X9lA&PPsAY3-glEw@8X6ao z<|WB&fyEbF;op-wP_4f3E^n9WTKx}@Cd%W-ZifxZD|u+i^|UUJTU&6{do;#%*=4-V zPj1L(90iscw)W-s!cipo$-H0BpM!R&#q_S|2A%i~`Q1pFx3dEWOA{J*N>!Rrv>976 zZEf~(WI5lIj{Y6KWxdel$B{3)_xjFDo#xB#!3qBX zCx~E30VnqYMT>G{TLc@P4jR7_M%r_jdl;t-K-ZM40C^) zuYm~&nx44sm$tx+WDY9A9IJBja>Ap--0)!&YJWjCb{ELP#xHy(!xD4E1jI>_7{`|fly1_4GJ)AW&KtIsg&msVsSr?x0O1$>(Yysg^^GP9CRMB`@JUJL zJ@noh?71;M^as?D=F5f8HgGn90^Un;ak4tR1_{Kw*&0M2AI8KCO3Flt2pL}{k0K*d zO4i61*00+ZG)9WPgI|F4(j}nLaPyB+6wI3G5lK@&%ri8M{$0{0bG-*0V#vKAjR1B5 zjt0W+nF>4uxB%D}SO**kTm~Er^Z|zguLWiT{|p=s{0nddkaZIzYVv%s4B%_H&jexw z#y*5RyM*_UxQS%oUSKAWNyu7Kjml_KqcYkYl($J&r&RB%XfY^JiqC1;FtcfBsfISz z&>%&TJ{+Rn(3Tq7T0{Gjp+W9oJ>ywJ+hJ&s4p`yYA~au=Wpi*0YWeMJXwMkh3x@WF zq3tm=t>aN?r2Jo9l{!82=IZ1SU6oq@j^}ipyY5tCf)>I7HxPD>3n{OL->mQ{z z5t&$;KTb~~_dT&n)wQq@F}d;@Nk+^B)t@xT0`~;C;`muI;wuR%*91Zm`H9 ziabGkp4qzDZMrvgeag6FO~YX;qjdbCQ!CAh^dx>nPFxQiS$UvoIBX8>Htuw0FMvkr zNu({AKQK|Sp-{r0E|ez5P*e*@U*!3%TCT=h;qVzMWVH~1WKCh+tBee}iM}do7aE?5 z*$1RIQ&4KBlKO_Yg33@hPbQlzQk1?b)a2qqo8pla%$z}5i--hxFyAH@ohS;NrE+je z=>j~1QRP$a7DPdOD0vH_q@j;&D8W0z`Q1*W@n;Pm2t%Gw{VZ%DPNebYF?xX^PpB_M z0KU4>5hhgQ&!>ur@kF?hm_TfWE>>Wf`~6KVYMSiZ;; z>WdwqfEJ!mjX#izOGBPeUnqR=)mAx+P>nx_Ennmb^~JtJ;8~#>fAsVuc|v`$V-A%=$S|ps_|!;Dlk%yD0~I&Y3Cb3r>EsB0FS^&Q!PAPTNkQ{N3OQh zie-2cteS`Sq3Upci<+7s%`-#N(u^{h|JBQ)HRAlQUY4eMS>`TVTnm-ozgd6Epy5N( zh9uKae@cqfpYk&XyB@0uG^am>^NAq_%a?-NX}aa2`sKW0usM=rjj)49!cl15b9ziLuO$wEXCJEz7_v7P-X3&@?m*?R%xdC0 zfv>sn_}oX(b-BwD^sq%}F1!~}pY%ZG^m#HEU|7R87v2=muj>pxTr{k>nhS3g-s2bW zT+&st$@Rd^h1VT??}EqHUGXtJn+q=q?|UYACiGT(WN$9KrHIfL4D&|zReVgw=E7T# z@LEDR_3|La$6%Wak2UYCA($6LkAtQKuI9qy>B{rLb3OVGG;HOY3$G0HNc1S?;-Wz( zt=aI{(yazh7KWZQCkl_F*N4H=8$(kXyjHW}QQPbU@U%EfvdNaFx%lyWyhEN$#do6j zeFPCd4?K=s#mDT`TzKn2?~{l8jEm-k?~C|F}vkLADXO#MWK%{{j>oJRcy zzAoUa{0)5V!RK#|FR0JP*qp&)@(&wQ35C^+ksD9>AE*vuD6C>iN}vU*V%QKX;x8j|`J<(Rrr5+}xKrhk(gu_) zpfxm}RtFU-B4IC7ePS61M zhwJ|O{qmssnmXs0_xN4DiAoZqiR-^m*%lg-Nq-&f|0YG$xBWdL85+_b7|A9=yr&?R$oJijU}qzh5jYms2XTJbk8ZNhPKe^g>_Bl@8Q)l$yfo@5j&W=YJw=C zicxr)h%*99=T=|@IX>|lxDGHJO1!lM_Z+tC_rd7VLzd}4#tox2ImtZ=c6Hh{ZQKir zp%*TPxC6gT8>hI(vN`0Y7R9#}G{t8v;hO4Q(NU~jQB$8ZWk1{mRG4{>Hr7X%IJt7m zyP}Vn=vs9Z9WIW98l5|k^v~ih^J>Z6Krc9wHkIHnh&&UJ=_s@gU zR6E4EJIgR*sj4m-{-#O~aKL*s!Z9s+Un;^ z2Y*3adVb`hv!rMBPX2N5Z@pGr$|m(<(mOA_$l)$i1| z!J0Tzu+lJINOTbR;bqT{`iZ#6cJ0=D2i_>Yx@yIM((5ZmmG169!Uk;&@#3hEt529Sx8Qb4rqu3)!t`C8b z7`8q5g}4T`Hh8-7F%mWvo*Om_hLX6C#B#ma*d8%9u98q8Z-h;Sybrbu;5S+vGPFqC ze}`)oE^R2urHNG_?m&^JoxGAi%>5m>M@kpPhaD2qX#d?=2CdK_;N*@DX|%gXy2nWx ztCU3uuW#5e})Tnx29CVo5IQ1ZroH9X62 z0j`G-#Pc@j39v;Who2{98}GndG_L&?(#~r)u4iy%TK9D4aqQYXn1_5PS^l-A6*jA? zJ*LbeDua;155$kGK5<~J)<&70jJw>eBXKBxu>(q)ETLAB<^uWA3xJ%(7zOMCybeey zAIh$00B|fY69_@AhvgZiTkd2W52V1b7)L)Y>)L9Na@HU7g(ZByA2JUTx91c1`j1H?+ZqHr~)C8d|-faqU{E ze8y@+^BEciE_8K@yAAC{L)&U-dkpPeL&N?t%kM9S))_TrsSK~XWpju#4K2&ixNlVP z%`!CV9#gcAmd!!cwOn#M6^n+^i?MIiN83mG^1EUA@F}t~n14LD4J<*&#-HD3^+wm~ z>k*U2MalaC?D=4=G5mCDT+~fc!u+!DLBI1;r9(qOGQBkvbW_la(70&Q{Mh-O=EpWJ zDpu{i_r+xNJ9=VWybSXMVJBH(bNdRiU49?`xMbfrtgNq(^NqK966i*h$o2G;u(HFK zBs$}lObmqBIIjD}aw>R`FH9rudMDS$^R67W|SoNv=0mKAyn6vONu( z^1BH(<(Cc6ceqe4jX7f3=tdLX2D9AKX!r0o_%r2f+=JWTui=(!Yud*0nX$Oom1e!H z4BObsg=i7N+gQDZStc?Tf%Zd-HXql^xOAJSqo>FEN+)i8;(Y!Q+RvA z2eCbADOo;5Q)m~nalL@+474LHKz|PLWjjE8-m;Id?D{^ujbLOfgCR!KHln4NDWk>} zRLNlEeV+87?)9((t+X-vyPXD#wmVTTF(KlCd?uph=?KJYdy;|3fwG-w4IF}dEYk7} z2c81V213g0DF(I&P6BoSGEX8559)5}6!X*o=?`@^hdZ9TfIWcs0($}<0rmo}2O@XN zb^(1c&vx9?-wt3O;2z)r;QPSAz>k24ljjp4+Ca}i;4mQbUn-D!iT+vN&cYQV{$kmj z;%3X{5E~3_i=lmBXdfF|6jE{)?ws5;FKrI)XSZk+ozvAJ*yB}v>kREdLt`&k@v&}I ze5_j)&8p-4<7zOlu#a=w^Sh;QUDR&AP_>#r-%Sql|*59=E7<%;&$vN@o?P5E%j{X2?}y&~neon@14 zrT0+mMC`or&45nbhKSz&TO$hcsRALbO>b4Zbvwn!6#PHXb(Creh*-F6;2N1^Sxj>k`urJXh0v|;2; zQzGmb+UH_clD-%RDBi%Jl)AL2UkptoOgmdZ8`i3#7@zB zxHy-pFV=^FG!EoU1leqTNYzD5QGQK+OWwmO)#&kS1cspr$WPiZkI}FijI`{}2~|x# z4`lw^1Z214CE!rtE5PwU)Go3*+yk72`(41fz}>*bz&C*&;J<;Zfo}n?0lp1nWBv~C zHsHI!JAm&2?*gKW;JF957swPl4ty2(DG)UAIS_WEcn4hu&mr8S9C?^Kz5(I`aRyor zKaT*}?0*Mr3H$-r3V00I7Rd0Ka?Av3SVx;0*3sr*Or)z5iWim5L0=Y)&r*C{ESpnM zd4!^IpsT{88VN>Yw<3e{*Xj|c0#fSRG&03Gx3jY+G^l%()*ecxMc4o(hyrZ=FX2hmVK6-KVMJ>|b zS`_7f%U6VMmb=Zw`55P^AtG8YOF^%%1cKmhz8F6mC$yw(LR(U(!l8Ve@^sg#D-bkB zpR3rcK%2d6q1c9JHsGfjar&l{iPJX?-gqDzq03PI$KvAyESi+1yE~u*8H2FCM-24H z)rin9^?(Y|`NsPBmaIHSKJOWjtyniNFy9<5FdrKbm_HApI2z%0%}C2{<@4s7c%UQj zi@Q+D%U!GMQRzZe{osuU$NgvTd@x}iLJt;k{*cnOLhFsx&TlmJ! z^1*@*!zunv&dqM<)IWaUZ75wf9fp#bl&iB>aw#1WP8)L}FK?wRD~lF)1Pz zM>H1kZKYv%BCh?4=vez{(GhX64rhupFFL}0nzLVYoIR2xdvv_r1=1JGbC;* zISO>*HpxxGCy5j3?Xk2}+XnBS<+R#c3 zt-{bKX;xTA;p&c-^$Oz5H)8y&HAyA80exog$ zLr}V^!lRaX#W&Q@(hO~)p-nZkWrnuG(5^SM8x8HKp&d6gEw3Nk$TQpijQFiwk?<(; zgKPEWxUr-SiNU?6db@wcy!nxuB&7l*v7hDc&MsAb(%SqQB~j3Fb`19eeYD8==u9a8 zjf>jt$8*quvz8~k(wM$!iYxa=NyPy^Ja+-AKD6!+=4_^pl9H85+jRUENn1I7r%7A2 zv0Vh4YEf4i8hd;*a3!(ySU%9~$+neYXroGYXxkbKNAmJQ8Ip!}ns6EVI!O)q50{~{ znd%?5^o7slGf>XN9SQi625o0qRdroO$zoYUam6!cmbv0tH=b9AYDW741dK=8$VL6zyF@`^E4@puSLkIV4nkOAO5_qtNbDY!%M>0`H1>!X52h zkt*EjfzpKGj~5G17WcBsZA)E9DL-__HP**zLaaZ39?F$2Ry`0ERY=Z+O%(2LSO;YFR{>-i@}60B3N9tS zrcH^jX>*{!D_5tu!?HP~oK5jPV`v{4KFVX1-$^#@mpv>+Q&}|$S#`e7s-;0$b@J3e zUWJw^WLN(V*TY2#s~g>&2k-K4`r(K4yaadKd3Z+fcu-BVLZ8|96B_Gdbrz2MKkR)8 zd{jl&?`=AS&>cvCu*hbBu*hcEK?DLJVGm(3xBvl3ARrJ((kv?25Kuyk+u*({qmJ9S z>*$QKDdIA&Gvc`KC^{|!ii+g@|8=UWyKi?Rqt5rf_j^-G^{IR6RNcCDt4^I-?m2y4 z{_Z;t4r+s?Gm=OP9)-|y_+%K%Fu1u0v8Kaqxdd0nov8!n^}5?~l`B57Ew@7)*$tgZ z?`HE4p?-S0+B)yacf11rU6YW<*pFWGeDdac-C3AefMNh7n;iIYpB0!iixJ&`eY zj*f%GdZeaKT}}Z|dK_%gmM)?)D7hC~jySm&3+d{DW+7U}o~1a@R0n54!sCy9F5R`r z-}zv?A5M*6v67<~xjUOPbq-}>Zc0I(2bb8S_!=WSBgY>ukso>7;gTr3wOJzNIK;={ zeN`nHElot|$0iNS=NhZnUxV<*nYPjZ2-7Z(!8Q@!Oj|(q*A9Se7aak+0b&DEZO1}b z4d&yzD_^Qi}^%+~pQ`wZ+|GaeuV9f#CjfUnuKUp@^d* zt5RXFuD%uV4CDA`1mk!=%r`j3#jNNB>R~*SgCuHuEPCMkz_1J~_+i-0#G+v{HFQ2B zoaRRpkDM`}J|G)s7$UiS3;lNaOQvjs{f_+BPmOF*>ukzPFT`3{?XuR|I%7)hlBDY0 zbtdgaH9Mh$)jL~b1!{e5+USGeYXgvM@WIOL;MqtTI1W2(p7Z$6{Sjo{4yMM zL6KxMuYa0Iyx9IyybW0jTN{DUEO^=iGDGwtgh~{S%kHb-lbucYl@vP>8V#Sp1$&so zVaSVDA}QEl55TX3Hx3O}xfG2cBV?Gg^hQgHi6hFvSjR5W$fH8+>!x(?1# zhF5as!X*^ zM%yS98M*f9#X?#U(sH=q_o!g9r7Of-5n1d##9(o=49yjWiL4CBuMNGyN0L)gQ#v$6 z$HkZCr^djS0MWQ7msSQAa>q}Kx`#*Qj+vrx zXkZdH2Hh0YtmPZv$c&9MeTB3OHS!ZMYCi7gfE*Kf&Gy4WbF$Gs- zai?3{T#H*~ac5c_PEzQ!I6I;9Ym54o{Mze~k9tuxZnVWswK%R9N%_vQxN|ISx5Yhg zaRb3Q z{$@BR%Bm^ia8R@)v^uNX3*Ki2KV1pq!l@gQ(rR($CqKng%&m%6eRKp{I7Gj{YvoN(+sgieRgP$!?}s1Vzen@>Li9G&4! zx!H+t0{Hq+1zxpvRN!~?0`uwUt% zP1H5H%*CnzZLB$c`Hs41yBCi~% zVuMk#DkqNdWL2q0l>iJWh5@B&2E^y%)A`j6cuU^U@}e752J&Ot1B|wO&FzpOpMfcosv#vl#O67=ViPJMZa`4;wWG_mjodM{AR`JbWW* zAxdi;*L?*y$l``r9G*hcp}d-oYb=r<*H|R&28%o2;%>3H+bym&dYYuo)FH)priE6e zK-inN<{Y(n8kkvqj#{5N2jb-9BC;CU!wpSPlisg46?rx$=fha^_ual((Xwcg+2MsG zTvZR-x?V_-GmB^JC_^P+CTycM8UT@<5f|ng!Yw$B;1or4B1^2{ASJ*XC!HnS!^uHN zXMBYwG@a%-HYLqL+9AZzi_XM1qm-eqzD5YGEQUkyp3Hw4{QE8rQ5lazv;d*vJouo1 zt2^`I&FqvJi3`hc~eY&TJ8=5g1?*dGd0 zaNV4n6h-tTm7SgvmRk}D-g|4k9ltmae21J&qPmS zb<6=IFDe7%J6Zt9>E|NAVStMPhXYmsjt8s+JOvQ_K`k4V1D>JrOEjMCU_S7CXQX3~ zo(eD1P=;h0%8=+Q7u+^Y=Tkbh1;_p_bnM%L@i?A` zTCm?y)oMXqGmlhzB3xoEJ`L+rh@3XXd#%a`E?c_zcxe zW~&g{D%Y~Yt5@rAWtOz<+|~EDpjzWogxt*%h;~%yh)1q%F=GbbxDqroV?*bQhK`D_y91 zZ3b>NMBQ!rYit9YWya^ z-{JZSz)JzI2D}WA>&%$k2X6)>{qF&*0oguy&1Wx!7eRp`5fm5_^G$;LSkw6&Zk`CP z4%(m4@hqO;x?0>&i{p?abYN(j4y;k*)>zzni@VL@?zFgU43u(@zB*)AvbclV41|`| zP;iNyc2KwpPdm&)mg`Gz*_esTa6UBr#l4R8Y#DNP7P!{29yAk|h;=NU^_I0P9GVNH zJ~h%?i@n$X$VyfnEM$@WxmaCqlvG&VaD-;T%lA;i^f>;MC|osuSHUOqt3RD$Cqkp) zkA6jq(jlGcTyEyr*%cqj9N9PnDs?!0By+qIah0xkH*@4%*uBHcGLa!*`PV8^LaUi~ z=CY$%(#rCT1zY5DR_ot#Ny`sL#-$n$l!sZSX==>~O6e$d{FNXXB*H5}WE|XM_c|jW zFDG0Hx=)cUhGZAH#AG%G$cR5s6enV9APF2ZdaWqc8@w~MZhgOxD@Lt<*^1H6t&kmo zOXIU(bBJdxY9>aWi?fnM%e1USQPLJ6ueK5%0bC3GUjQ!wd;*ZndOP6tfI9%$u3rKC zBOoNJAYamxfDdZ?qx$*@ea%<22k{30@wI92AmCeoWYO;e*26Qr2iP3&13;dmWH~bd zUk6kxyMP^W4VD{ZzhFFDALUaS6d000fgw4nEw~Rg9kx)BQgEy{p<`_du9wAeol9`1 zTHM(d7qmFe1%>V+i@V?AP^bDHf3r9|kH#H`o-b*8=nzf@SlmvFvvO+HAhYw49U-4) zg$ImKUOL8%^;=gq6?XrV84gnQCuZU8{Z#PXPN)`PwEYmGkdUk-Bf(9?^&I%HOgR!) z#S; z?h%`5NOL?qS-rS5%PJS^5u3Xc%Msymibn+I&MmF5Z7AFp!s`@GLCwPgmO8gQu=vP3 zPQ1Yvk|aNRf68>h$T6A|8yU=thgZxSPgS61?ZcK{_lOKUOZ>f+Mu?G$Yk<{`=-n9i zsHkfMAQPh^4IZ)Qu|`aNGzU%3~u@nxql|eqj&47G&TL4*zvGAg_uflVPi#LNtIJkx-?K)Syft+3At%rRas_9d1+X+{=`C#99qn`Nl z+39m0&s=%v^3I=qQ1^iujeEXUc+ucNEC2P_)pV-b7%Rc_9=7Qi8WBT@aYRRdKj_dKk zclRuv^ZKW)Y98@_J-g>$?jP{y$+w+%-=%BU-~Ch7-eIe^{~?ey?X$nU)NIL3557HT z@Dnd?{&<}o-f5S=)NtR{cY4g<(R$sX#e3Uyn&&$w zG{5DQmDPm&b}CYTQHHv0MMGS)yIY&?IH~UfZKtF zrU0VdQJEBqFaW^r=JjyZmv?PkXa9ccBf@%XN$Kfj8fF>dz z=HT`Gh)kLw)Z_LFNTtj%G9RY)dZ_mQScK@3WAY)tk$W{jsH4C9 zQeyJ)0qgY?;g?U-G5OX%#pc7xgOMQ=lR47)V)7xIfdLrM@Ci@(>$Zil`LLv357qm3 zM2IdmCLb>JdObY&-xQ(tS5E>Da@S9qqM=&<;}D{27?ThAz8F(snMXVKVj0Mt4{OEi zp*nxlJkn$G;V|pR>tPTH|h2K8QGhB8pq^A_U`qZiC?y)dE3rd7n={C z*z0*jKRYfkq`TWsGeyIC=5rN((I_i6AFk8m*-_v&2+=i*$)^RdxEFunZ~V9vYt-)g zIY!aoK(JC-j|&Vu?((!$G%N7S=UVq#gYmKXv{E!w({I{g%b0vxE1J7>K3{C%mzD1F z@M+L5kPmB|u60a4ZGrWAI0<6?ykGZ9RJ=PM_A0N3YWZ1HbZuku$pqHxp$y9By0owb znwmSGc8Z1_hb@vWGbW$*z}iiT?VO+M{aK0vFx3(QnGh_Pd0 zcsJ&$Ocg5FUSW!hmGW_g5gKUwRwJpPOsafM5zc3F3}#jgrd(rM%e~BO2G~qn9m%Hm4Qy(7~BIaByvo?(~_j`=BZ``Xrlfb1u|Ioj} zsSfK@q=`<|6_~KGw8=$h3<#$hsEbM(q>3;a(M_c~S?7ui?QqT=>h_PM^A)j1Upe0X z;^JkMdP0VfnVXs3uB?CQo{uABXc;D^PrD5i*&EKf*CdX+o@bG269S zyhVX3l)$bUdpIQh1%yVY&M=n}+MHp%h7CK?(~5O7(B$S6XHU!-QBaUOVtigf4(1NS z`jyWe)=y>+ImRqmzX`boqeqXNn4i;YSl>Rw`u4UlxubJN=H-nVK6=cE95c%p)=!mn zSf642bR`YzCo_#<{lW?Jb0&;09GgFK!h{?4`lQvFA7p{pJxu?Uyrq>qRctQke|Y98p`)3oei z@hmuPK}XvMnhPm$!BGr|XF-PxIsr&rXK6Wsf_c3BGQ3bG0-C>38iHfC@$$P7_*)?j zji$5%R~J5Beh=WjXM(0Dr5U*T@bU6{6!;CG8KLJ1iOP2}%C`YD?`r-=fh=Brn{nTN zcEFksIXD~#hj`_?6ZO{+{Q6PyQ8n^kO#sgdfus!v37!{1se_=iV!!y zAAnz$jdc>rQ*ep$D?|Bi0*$Y)&~f4suY7BOKOZy=`Uzd4`r{$~DWJJ)JCgy=>C zvDyJohw6-5e`Sc63YtGN0bHW@8$?{Q6R@QWPe)NS-uu{!@;wfk)k73n!uChupl~Sa z8lDcx;^y}>%C`qJH{_5?>EVl8f6TA_aFh?8E>V6jBEQ=~b7rp4C3+uREIkC8mU%*# z=>0z8#koDuB#jX|3IXxn@1?+R9E)l6IH61QesfUpQqcTkI zU83?)8B7gmE}krOmLJ5is5NJb(3szNmaUQzx%4RL$flMb1s&__f}^10Wb?tJpd+7n z_9*Dcrd~e^x^|#DcocNZ@0h9hiEyg^B7`kQQPdjfqJw1ZV6gio7P@MXu+6p-6v;0zO88G1Gk8Z&2&$!b*@c{KGr(dYYHE0or{~- z@vL*LQutWwT--WN_rzM~>Vo#0$U2vnmYkr=_wVQDE)3G-yr zOO`C0y>fa<`SQgJ%V(EVPXFrq^DoMrQ&v&Fs1#cQ27Bhh`KR|#dk@ofXZ){0uEnUH z%FHw7S5;2$l|6m_;yDWgC8Y@V%R@Uaz|GNgwev^{R%d=V8rt%vaUOPhOwjrX2YCCUo zRD|ou$*{Eb4~)H>ipI0F#bNlD%fuX!doC$C-T7J{6T|6Xe3DqV`rwa&!s^wdoxt=d z(?a;B{2hFKbZn>~3m+#AeyOVI+>18W*)+zpVR-GP$)4&jJ%O)6Gpjb`r4-_m#%??C zo8{e6XpWDi7oP_8Fo9%#T!ily^HMzdRr2k-I#+fQo?se$_&CivTp4$!4)FQusvx&8 zY&@sLbSC}@Oa;wVON2)963)ceR{_?nQd5uPqvA|_i3)IcRo=nrkayhrlvyT{aTo4M zEf=W+w#BoT&7Qvy^Md&L2l=k}J;W?b+|79zb6-l1&7$-Vo{1A#KAc=l#h+1WF|S-S z5wrZ9knYb4Gav^XBt}zbLptC6XWW-Z|;p ztnpaE39|4f0J1Jm1mx3VrRe?o5k2*Wxx>+)WmDi^V0OM@fEEA;*yZ z)R`Y0_W3q+UJ$5F#Y<}PQmW5Ng7P)R9lZ((1#W!0r3+HRC`haB>-m7yP&{KeW7T z-`MJNvOR%gcIB$p+UMI{qei2|Fu&55RQtMxa$Ed~A)L<3dwSA>pNy8*L;LDUKH-lV z!Ew6frla`K)|;E!4G@}napR`Ce0{d+T%j9&#*XjaE^hU0=qU!d+`;O0+9huKT6&sG9>?I=1)y5-#w~+>xNtFR`R}@z(DUEBwj7M8rAX~1c@*DDh zqB!x`no(w|$guVweZt=y#KqPG+&9h_*v1Vryt3IP$WxTAs`VeJqDh7Y1i^Xqfr9o( z(GY*4G?lAzv@90q+o=ph&^yjouoFfuEPA-e#kt!V@2kq6<7ebw-yp{>`kgU%^M2bS z+*;!waGW6P_hCRj?4y7zDh?>9&nUM6_QLhkfZ%9KJ9<9gv$!qzt7G9+A-As?Se#rpA%BqSeh3*Ao^$M2s6*FcASPG^hbN{Qq*#^NSe+zgAGZE;I2 zE?{vym@oI>W{u?cxy5~DaaMlnTfNt*I=*_Zr)mLy0uvz-dAHV_8$_vL8?vY-|7=tg zl{Juk23m?xWJD#!Qa`U=-PfraTRqeX>_d7#6f) znw-+9k?$t4MyV2ZM>-Zi!^y!fg@+6X7xH;#vie9<*wsehrm5H@{2qWG32)quI>0zO zw>WmSpdAw*DUN-OxSjBBaf*48{(5+`o-4qdaa;sGpgMG{ zf(IVVPeI=1LrF5Xr{LMy;|VaP>_`&VGN0-27lFVyQ!i;itkXy^VI`(u`Amr?IHaz` z6F(ru6Ab-IQvwgkv%?<--FT+OHAD@k3E&(+#`CqO1Fq25?AUd2eHmaqz-u&~9qTmW zlyJ(B9JXi3=iGo_!EMnY(IzRlofemcW-T}}HA#yGKBb5v!LCsQK`097LxGGwyJ2AF zQ6P*ud-6DE?nR*;#*FHy?S;@{;)PoKb2Lxg3{SOV+Y5Lk?82`=m4R?qU2MiMH|XVf=1ayn7h0MXk7Xqq9tW1&_e9 zb&JDiFgWLe!PMQEq6hIioU73l;|=1b6LDzHOkx`q^&~Ph=cv1cXEp3@;*RuP3`gQN zitK8bR1BwPBNivA`4k+?1M0rk-U8Htzw)?y%5KK zhoWNmC?47tgNsz>Jr75DB-U|ytJsE4dk7Bo5T=#Szrhn4Z!ClUl8F%?oz*Lq8*O-n z9{}=MSPiNY)Xa&Z2j8`ErcILaPL0GQNr@h)u^#H2}0j9LNq#dT}I69L-- zViLsT(25ha1DuNM_JFeiI{=mfW&xfJ*b$JTMJK=wfX4ye0Eo#~a0}q^fVTm52V|Lg z06w7cd}59_A__1hq5wmpcS>*{XgVLwuBa4#8eUN$pVJ0CLFn4)kk8@wc!KL^anmdg z`eSrj=%vtfl@@oI#a(4_cU#4|!tQ0*=w%8FSXQsja;i!&mzsqrZK`s?vD0euTkkseBBZ6;b?#;f zAasQZd^3f_F%{4R%x3d%nE+aB*XfvZ&1QBSvfFZFP z5m&uB8=9~#N63gIO1OCqW>GL_(ZZh9C;34CSVC*FF>?0wPbY$;80vw0tN^?ka4z7D zfb#(V0Ejjh+zNOO;H!Yxc2<@%F9bY1xIc#beu{H4)U|c zt+lvwEsiZw=*YVz?VT2PkHvw*hE7Va{ydciqt?HiwyqPRv^orz6(tC)qO-&jHKV31o z`Ug*-`KG*sl%S{S74^_6=zvY%*9NGfn#Y4kWhRxOq2yx8z`%MFO72;e+U+&Zs{OEp zSc7MV^1yw~g&VU9WCofHsXA@s9^ADVZ9}%9xg}Mqdb{$+qXL{z-hSxWpur=|BMBfC zC{^MaN;`#csKdg^8sMcy?uM9@{S;NQ$B(BsqI{0RwZZj>M*DHk!Rp%an1z7ds0>b# zxFEoV2M!0}`U*EqBug+H$T!D)r||@KYFgy8f=OegSOy36eQ^%jmvL-!bRFT@=IMrD zM(+j81>~qO3a}3#Bm!ld0{t?WgKKbNWk9hIkn`0^fb4No0cQiA1c(vDDFWon0>@Sc z6>&Z<7{v7{fNKG3|_zV{t5q5yF`TcpYFVAm^e>0PhC`r&op)vF#9i9@onO z-vnF%_#WU&z)t{I0e%j+8jyYN96*kMK|r(*XC7d4z%_tm!|MP!>Z}K(^u7Ub0ALLu zb+wHKWZ&d9Ulc}BJ#S!0<_!$VNFq3nB!c@+hh*L$IL;e{j`Ie=4YD}A2aPMXxH%Sw zr_pJvE$(KEyVc?zwz$VE?lp^h!{WZPxF0Q!T0W$F)bb(a8)9+8EpCp*(I%46Ew?zR z;Ld0%Ot@NBC zYW}cKEspl$Qc!nwgFmRn(VO?RMP~8VKp&MgP#NLV)^|gH6tTVxMRKjAa$2wwSQ)=4 z#Z!*RP}ad^bo&t3OW~6pw(IDXp%P$>`#}eiG<3`4Mh-ObZkhZ`S9-ThP7dN8y?9R! z8VBLY+Qf16syt&p_j{w4QH_q=dW!CAry3mUAMj@6Fhw&X2eWpM92|YxtMsQKWgW%& zo1kaQ*tHj3awUw&wS(oehR|dg)~-Zu>zxXf;*DYTtxjqqZ*m)N3x7d!CzyU~<86|h zl$s3tajEGo468P4wq)0o;^QgemYb^5fL$BaNxW6;CbU_@y-ktJk9lVt4k7<4cMLcU z^F0=@Az&t8CqS%_s!f}YfPHZd?xl2Kb_N`YYj82OVuGn^@LXJjo2g9~tV9IQ$2IXU z0rmlW8xWj7_%0yh$*~y!FF>Xv-y)tIZ#ull(+r6`&5+2`g4?0#eB9DeDg4~bQ6ZmG zYjIw*AxVpsW=+@J;1p>kgrrMOu{bpxsuXi9jxGBD{5p8!*64s~_3W?=8-JE7 zo=dqBOS2;C?17>%>A93^z67N>Iz+{q6euxRt&uP|H1cJ*)xxk$%X!7B6;XLF=JUEL-_$yrq@ObLxLRSR4VQ<(nf z^|AoE2jwzTY<5hB6B+Mf1J({5G)AA9UCzA1Pyw3v!pCRFp<7=^CeIrIIpyC3$mgc! z$d-WA9N7Vonj*UaZU*cRNKKI=051pRlFb!>Wb0P~76V=dNHOVZz~z9~0CG6E0Fdv1 z*L;Qocv-GwNW>0?sTZ zLHEwy-N3nRYcNmd#}4um-=K16z$No5O6OF?YrkxP(tdjY9=ZLRQ%GEZaxdkW$3S)o z+nSQaPnJTdUsDI<_~SL6My{9{q$$_%UQk$j5y@jmyv>BcIU_))Mpn=Y`bSJwMLwX57kRX`K-_$rbOGjUGfT zxs}5Ok%n(^HT-kt#>yO)n%R>RhG*tSl7Q4c6f$vH!=enp{`5a*4Qn}M(>j=Phr5V< zEEFzs-;2}FXlq!~&IdS|IJ-l}PHR|{1o#%skr*;_dai@GI~V(hcIaH@K%bcgld-eq z^S=M4H7wO5H<-KugF4I}ceV~c0$GUf@-Kj7|62jc{voHRef6gRd*OOFAcx&&0NI{pc2RIAxB|r{#F9NRA*Bs`b#5LOq(QNMtUCe9kr<>vx{iA<^6=be~%s zs#oRWcan6-r?hYi9b`Ne>*Ks#(_x0LaZ4<&%Hp`fDQUSoC1ttY;3ElE%3k+i9PO1 zBP12|(jLn5BT9CKx}zq9Gf*6h<_sf&F;2vdu#n{D42v}(-#%R=XP^-EPk6W85avnx z3V8Do6S(xeGqJ6k&~Au~KxaUWS{*FGhr5`$G5deC-H^ihY}}g6!DzWl z)UCp~^WaI0d=%GIhw3pa)D7gv)FE5$LXCeNEt#3W4agqz9w2+nM}VBod;-Wqeg;V1 zun+JAz|R450KWhv*Zl^NqV?B+%$wJ|&p3D);~0`Ljv=3Ot&a6OH|mfNr}rdZqd_Ci=GnGqKE&=7G0^2uj_W*9VPmoXweiD z-D6o~i~cLPvpC(Ni`_z1^fX_ZbjeXQ=|yPL19127w4MFOpX8qh8({Te9;~r{0gQ#U z!vsD(87h)9nxrPRbhmMitciO>ylH$yFTmhprt!RWOpgffw-uUd05m;-op_|i??+2z z#s>h|lD`FHOXl@FeZ5FulT$FBEt~mD%VtPgHbbJgRB$(GIvO;b^Nhv) z)#AG0txDSCb;!pxQH@(?acJ4qpQnV4PI(XmyHDJw`4*XlR;5?hdeYAS3}M~!)7HPm z2qg)oQ4-V^sdfPy(F3eSs>XJvfb)WB>uvzqriryRGqAgrvVM2kx(k^bwzUFLCc3K@ zgeIh@rNL7NZwq~&mVa>C0w1=z^z1zqn_t}43LV5?(e2D#|8(kZar= z*=6UQV@w9^#dCKRp%?MX>0MYFU56{<*uyB#@NLs^%wd?Vg)N9{Ba!jl>vFf3v4T%? z#V<#^v313Ke6ILc5pV9sF>4s^=N_|ICZ^?%?2GB7r;{EYW7)#&LirU@s;7=8tYKJ+ z$q4s&)z-7xxg0k!id@ZUE)ENvgE`I*N;J$s%BCm=AKJ*ptPXL}J5%gH3xF%ax=($@C5>P_w@Q(5-A_i+Yq5~&$CAzQ>h_e5<@S`8<%~Jy zL&v#6RbZy7<AuM&t%`S_QrMV(&HkrZ|Xj+2GF5X1dD08N&+Q>a7);0Cm z+eMQ-Dhv5x`=MiHJf}jA(;xFu-ghWqH$dzih@CFL0$h&*JQ;8-AS`n#p@RGRJ%i~FO+aVJRb`-H_kYjH1F93(SMx6k6Z zJ0xjqEv`Mdh~PTukk2{6;_%K@tdDP3(-l}8wf9I`)VZd6*Wy03I4ftRtqY=hjjXji zM%F5g7-@`7`52?yGBYTQuo;h8MxaNipbUn%>sEjNW1y|FmfLDC?&X9J{F(ua2YxZZ z$VQ|L0>cnuuSix$r37~>u4lk!sE$2Sg}9P8Nrl*~g^oR#O@@cks_fGIq5J!Lj23J9{`*Rh^^eb&MnFI;$Mos5)9@HVfnhpuwI~MnWr6bdl zv}9UBhfOJs5AKi$f=-JPAX9Y3s;#t=#w_F5;~q$I6nFawB?p zB3Y7cTx}MmZP zHa&q}u6BU1iyJCR8vJ6QHFDULI&f1);ozs2rCqdfcQxF}-ejR>6ypX~erztKEm z9WchF@G;<01SsK=@*Ue9eH~Xkca1zMhVqmgQUb8)BX^B>{}qgcGx@uBjY^Tfd(oX` zV&1Ic7b1B~V6j^Apu|KzN!zBB9WxMSyT(2TzHyAd)?rwTi$j^Yr4;W6*nRan-@+Si zVTx_UJ$4gvsZ7?5Q&}O#RVjBpO@umRB&(5ctLqLjnN`#!&_S=nu_lOmRz-^~R_-?& zaVzsR%vrM(nf?HW<-hCTj_G|3- z;05Zv0^+vZrw%ec39t)bUBF&|_|i5w3J{0E)pWE0;9^`i0$d5$6fg+b9FYB}1t57` zE5OSEj|IE|Fca_|z;=M-D187Q0qh949k4SX>k7w6f-eGg1!P_I03?s;3HT}C@qqgP zVSOz4C17vB!+^|>ZMZQYIT5c}H{;<&7-L9;F@}83n>yC-ysJY#RXaj=(BfJlH^E_R zU4?uO1uwx-@RIyySln!j<8f%AqX;H+;Px5^ey?%YSlkU3$8Ve^Ej4&a+IYqh0rInRPT{63Bwoqe!L-PtQy9%);6OPiN zf-ZGMdHJHus`AVwfyy$dT!N}u6uP3)F-8+!8hC12pH9Ee+1dLKp%*_tCF}Ho7k%}+ z?1!=^b=+`4dDG2Tx7l{mq-!%TTXW0jU*2=zr%zifXt1;MHzRLZ_C)`V^9R2Bch8^p z4tn@-qsiy~^ZlDy~l<`17_-=Wm(QHMq0eu6|=LFTY~&u+uU>TDh^Hq)XtNX%D0&zq9MU z16>dAo3L*Exf6UzHOHK@>>b|;Irr?@KlzmxzL|aQ^jVMoG~=^dF8J45e|_zv;5(f| zZEnAG|MK!XLryp_qUWC9y)m!ixfY>1b#@HAYxno`qhJ$gp7pYF>xn*pWI?*Q`&`Q10MePaFQttk`^5d0x-SC{HVd=n@%C*o=EoP&}*ovF&2> zX@D57=T6iQg+{tWMiY2)lO^r7vcVg%`7pKDLrtq4m*vblv;G*H4~I>!hxl z46iZub1Y)Ko*cxm1<)ljnqUOJ_ZwXanZsSr?U2&zp@vjb&zY+9am*Iz!A#xE$y9YN zZ!j981RI4S4K$9c$tw|URVrYh@_%*-G0hAHqGu%$s12P;38Tccu=i@qOSnvnq0mH^ zVKKc00U6VjaEQh*ohlD=E+(?2rQtv?PSN}_lLY3WR7U3RoE(VLcbD&Mf%4(*sCKwn z>X&s%40W_GEXP+;aH*DNfu>2en1IHl*i`BqC$Q-jV~W&JFf?0GR-x0W@({CxA|)L$ zJtK7Dwg)beNdhjD(2*uORR>@anIyQ0N#IBmohl0$ug8ozT|Rp4Hd2WDvxcOJPSp_@ zugCPHb1wY2Fr4Z$or*Nksko=<#W8J0(Iu-8{u8r*HCV|qV;;J7V zX`)lHg?c^gt#lvdKlMd86~$9J(nO~^4j8Ye9V6kQjV5p>pN=%qsk#CazSp8*Gtps8 z2|v`SNP|=n8hN{^R9udVcCC@LSoe8lyg-Mw@q&40>Ioy-t3I!VkU4s25*h;q39J%` zLM*m;twe@FQS0zq7#bKcIwv=O%$SiA$BxViOYAT;u((7_7Eox_ z_UQQ1qa*~zX80WEeivO1EfI(ru&E}8SqSXnLPCU7bP=Y&7?lj)8KO`RibHVh6!A2? z?+1PWXu3gCpsNQTPeVBb8)qqKChEbpF0SL{w;6qH4QQHj1rm4>W;ZLdWJ6uY8nn`WO*LNaMbbOq6dD=$7^o zqD18zh3IEN)3~qDaWsfme_N1WC(u08Pv{cW-(*CO?~lcBc)CROw+9iofktg1f{wGD zc+ZRB+G#cj?+%_WQGU-MVhLzY94vH+@?*bw88n}0x8FLmMD@q~E(FaM zO_wOY(TKPkG~W)D@*OF^!eQ9mgr_@Fe&wKfI7g8s>>mY)ZZsU@G(26R_gjS!WJ82Yf{)k!N)T}$XqvG@ z!BJj{*Is4;KYjv!B3!)u_Ts*Gf^PFfAxzYsXCb;78)1ZtmtPt3TL!wfCkbJq`eWA} zh)%MA9R)7Y`}iFBttQ=6p-WUgvWw3_)8-_hOO#&*B6@))Z<^5A{t+R~GY0J5c|+3( zCF?mmCsOJsodmakL=ur*vGx+TZMj zr5ck3YJQYR>G*$(O$j~}H+<%unU5I*hBK*Hl#<56EcC6+^4Psh1_?YG0vJ?UZZ%J>H zOui)Tdw`%A!k+g*Fi zv3DNVaPp^(ZXC0>ABMGWao-$xy0v&(O0+PR?c9Sf-5lh1zYcFl_(2{12g2O1qr)DR zvNSQ9GV!mmG{Kq7e+^Ci*U-dKSlOstSvj42sb`r|*x$2a_LS1u6?4iWtxZH3m!Rp1 zA-~+X#IG?6pq1A5&eS^Ne>39+zrIjLkG<7w{~s~u5N%<>D($z{4SvmYxC|xyhFPJU zE^`C_(ah~D_zi6t{C02CGP=0!L_0W#U;};BfTI zWy7$=g-4K&vjYPjG~4j5yx#%%EO_I1uSi#kF_Dh6Eblt_5zZ(GE@5ZVaH(RR9!ni( z>ya$K#+;7{=az}{F|D1{Mjb55WmXnbAklxFZ7F1#Z3V6=?wjX1)p3F(!3nD%%Qgcr z6>t`OJ*E7PA-_6-#gNar3BRlxztXkNkWVQPo~3Y4K1TQ2s)EcF+v^wGLI) z7qweTtKULUL5&r^Vr#^2B2sy_AsV{-q#Db_GQ0_Iq&_T@Vs0R2jolhc%$E+F98zW7X0$zX)Qry|&i$ps+t5H# zh;o}#Z$_H|J53jrP2yBg{seKxhJJJOo38_egl z)Qdp1gtx&T;WS!Yh12F6fGXTmN-rm3St^!^Y6#C!<*5su4_uUx9=So`;2-*$b+Zy)PK_}nr^Xl(y$OQ*P}7Ot1i>A$xD>P^!KLbukE&KQuBXKf zwKyKqkb9I^92a{8$N7%r7qqzj7RSXcq2pOGp-a~xpYsU%_c=RQfB!Dmo`N)PT_2HL z`!T#%aY6J2Obr*!UJ=u13<)4uwEYYuI|6U=WLM16_^Eg&4DvGza$$a^!FO{eyl`QL zgbOp|Q`T1mcZH@?9CuRnsuZVa+O9ml9cVAS8x?~O(#S|}MzHKQVD~aA1d||1JZ^kG z&{~`9uKY|VlUHS=*pE)9@E-@(cGZ-ZcDg)dwdmpPTkjkXhAct=BnHHO9V)yYkcT#rxZrj{sh(vu_B> ztpa^<9~J0^0CIQswMT$8w(l4O_HJU*r^xZy zUH3KLD_tDT@C|g@I(`Cz;h?cjwGXOpQ9G5SoRM1n!P&^F2;9hX) zl%GCC6)>sK?tLAHuudLD+j0Jsf~R`KgN)NgKEn_29`&Gcq~&e*KfPu*8%*_&wSn}q zhd?mNj8FTTs7EMc&#}nR9(>(bGc$wqEo+yFejoG6MoOQp7}5CY9?F3l3UpaehX={! z!$9b?)UV0VCxxEU^it@q3p`=+n*1E3=&-$}Xe13OG~AV+gJ(cn8c7hFg~ixHPz@Lh zlg7p9f7AIBI!~Q&loub%M!32RC;RJJR0>1&eO+*K^6dAs>cjU8p8VBP1h=Y0o+w19Qqj#q=qwdF z$Ku$F1@|CAlHx^#YCxClyowOzq-19gLg%T_n+UPrB|GmTv_XaV`Oq2_+KW)N3Vn{y zIu-f~A&y+h&VGb~Ds&K`wJLN7p^Yk(gkN%5rZSFOo5Y(@_Xbd7vifM8nz}=ZgQAikG`lqA9`s-745vCgx3eyW(cJP!dh~5`3)3VvzQ|$E6&Ds+cpojYl$Vs^5SGX+ zEfrl~?=VjtXQZdXBVTEHocr;l+)_1Jni`FiVAR78bk}*UJI#2E?3KeUAaY8GIPmX9NBTa5dmoK=3;C zUB)KB-MGF0@L9l%0bd5Z1n^bB&46zJUJCdY;N^fH0zv{)HkPge`~ufk1AYm3Eg;w2 zuLC>?_W+&YzO!tAm!&r0VzHI1+X9B~7N=ADCZvcE9@Fu{w0UrVU2=Hsb z?*O54fvPKm$#|zf0Qv!c1Uv>1a(}QBAijYMVwS>>>VuR8@l3(NfNcPC02=^~25bm8 z4KNK5A0|8aVlIdejHz5dcm^QpmjL49{@`-J48R&deC8dz5s>t^1CpMCE$PW6UqpF0 zZt%WaHU25U*}y-oui4k}-t|m}A(`ng@{T(4nIezCKI^=UcLI}MCxKDM+=TJIeZ-Y)}9r8KQ^sgifzf)I-F#ksA zJVn<`hkQ;4geaf*oz6PsbNV8*Uf~Ankk83OXr021(IKBxgiy7@ovK4VXC6Xp748fj z@;NIITBC4h>yXc>K`5wjn{>$MT!j#&9KUm&4&gf~gru(C)ghnrxy5~DaY;#rE=7mz zdYArmQt>;!G1NKL{YAfZKdm1T+&(}6W*$r2uQoVzrmp04a$$wmOdTPCTM&lsI z_@mcd!<-VUpuIwsOMXm!@v%%e&yle$ACS*53a}X<-nRO-a13A;uEzp)1H{Tqus7g% zK(>Jbz`=l%0EYrj1Vo-xHltMF5MPDs$$)I(Se*#6Zl?mK0-gmg-!(HN-!(HN=EMZI zMbr5>vZxe(Wt2$hP6Q_rI*uiR!*|G-qT*Bk-l5?#C#|Zd=A(gj)hk;&fmWfDQa2?v z9=yGx(Ib2_gI`R`-Ci?1vkw$m;tSpxaTi{OgOE-&RX{d3wkW=8HmA?v-HVV+Lz-dm ze`LKYhvtN>`?;ktI#$`58iOQRkqtg#YoZtq2>~*uQiI2&O>oJVMRDJV+orUpA+pll zON1(k{6K&-a+du>l?W!|-PFD0o7Hb{SthB}uc;p&uBK}|7RZ8pehe-_;>Q5C0-ONY z4sa46o7G8xWE@3+Cjd?ZJP~j*AnT6TEJ7)~EF>``3rP(56blqwwWjkaMF@g}h@;Yq z7A3(!4AD3U8Y<+cIZBP=QjE}L>yTxQ(2JR8);g-{OS|g34{HRYk=n4xBW@RHwg(P3 z7%38SIP@0f*u?1E9BzW3RTE^;&EX&sLCse54i58Ve(0GFkI#rhlbo{FFBCBPVG>Wg(p$F{~W>y92HgmNaHZ7oT~ z2pzjAorzz}ey^{{9?|77Q;%+oyeH|$!rv9y7E9EMhHFWJb8s`#<~qGFpEFF3 zb_^G4%%okB=$~*oWYQj15}>EDELhZ3Hch1rPhD|I7CcL#<;T3k`nbdht6W#GPCgrE zU}{9~1xS{QnV2&7(H}4e*O-w7a{&heLJDw>2OOiXS(XxbQB=y1C@N*hhcy_9^*dX2 z$j7;wO5s-~dxWmm;=E`Jg6pJ1eznsgIFv}IJ;BmVu{aC`I_-lN_a}>c(c)gUI7$O~ zDG)-_L!;C68hYJO&Uo4!ia*qoFVH0kh#Bgy2fmxDEi(<9JbBB*k!`uOe6E|Na>b|- z=wzI4hISl(uhFc{{hI@}-LJ{PJ&ZHYR2PW88u<<0G0XfdAcyDg0hHy=!qFTAY>A2DzoQE|AY)GpcTAcv(%I>Xl`O z0`(q2G6!q>V-~6qc17~G$qVd>2;MST^+AsG@sB%Wc)nyZD0(-8Vj9xq z!9No9QY$LTV@688*0A_C94spJh%73NOO?32ha0bp1B(?Vg z$SjuOe)?_^gXj|6)HqX594t#T5^K7uq0|LrLrDRo9EYt-wIoIrBb{-LDZH8Ue_CJz;S>EZr*>_nO7^ z1v`-Zz~EFULY@nxK{)ZEy zvSPNyO8D?GiIKQ6Zn6&G6)49R$guH-eVcfq%VYjD6)m(05vD9E@6&M zG(3uqK}8>#^R$l;=y;AcwO*3H92#01CD-vb@sEOb*5vwT-pVy7A#f;3pJjtb`iXYgbayD$dG8=7u?O7PPFa|?lFtQ zlAy}P@3hb%pVP(SIQNkJC^|}7ijIQ2$l^9zoE9fBGa2G;!QJDv;Ag78udQlqT5!W| z`BgK~gw^C%b%RbQY2tRwx}Y=f!rhK3&e558cRS`*uzOmfiUs zEqN4PW>|-)xv}AwDabT#%j6(T*H!&W%jBD92KfqC2NGSbvfa!}X-O#<6YAh?pV|ly zqPAv^&`RSe+m7J8RX8|nPnWJf`Gj_13XTygXX%?=Gql`kw_e#eG$YGil#bNwa zc(-;$rXdYq?;Yv*Q4aH7yLl>`ntJn8_CJ}SxL-7}FinJ$0Cy8H83RTvy08qY1ZL62 zP660v$jq`M5}JD8bD8?d#Ea&2J3u~bd;Q`UAS^>ILo(DdWs`fyK)ebN2&p z4=?;*>VGUl;{JDZFA#&a>VZS_3&eRr#d;UxMaT}jUI@tgDh1@T^Ewr9F1!rY49QTYMdv-ory^7`(=ESCDo3m~JR% zAS{f9Az>^G$`3fE49=~} zLR(epn(uiKG;RGhqKnF~tW&@Ghac0{-^=T~3@pp#^E~VN8*yE|dc0HBByHN(xoJ&c zo-ywbzIq7d9o$zxG_wRYR%>RYgjS`7W~6%$?#iEqf;vrRr0mKsVQ60}qPoH8!;JJ+ zGjUTML`_?NKVqPF7}@^;p-_H`cNeqFPi?ZJCht(%hTj2uj*o|p)7FyphF%Em=+as&Qw+? z*1vJi#Ivy#P&vjtNHr+Dt5cfHOkHu-If$tUaD5CF8CaN*!A}+jk9UE61-3f+*!ibXPwZE8AA53fvhPiJv(cdL zsNy_04Jd{kB+G-IVm!e^$m+?2`1D+DAl$O4qACyfRFA1`(Yf}2Qz0q zLyGe>g?^7Wfg$takwd!A72wAzq?c6{!G+Ctn8}lwB=gy0cqgBd9C0Xfg|6zhsMhZI zHBV{l2{-w9p8B53g;VEfyBdvwe_R#0IR^1MY8{jdM40@-HFqLcq2%O5@Jnw;9-Y7f zRK5B)p_WyH!Ar3vqv<;gx;7D`REc7%*5z=bB0o;dRPaP^pmqY4i`-_R+8 zDrJ#TSelrHr=#cl_`W(^4ld8a1OWN&R{(Yc1TR)cFM@#MaD5&i zrTYzl8vxe>ZU#i33_b^V0pNRp7Xp3>cqt(7e=*=ez)JvY0e=UWjC*ee%m5@EHjk8Q z`$77eWxfpfQ5w(9z58*^Z5s6a;0(ZP0p|l=4~S=QZU9^kcoX0)fVTqP4R{;icECFT zcLClB$Zedv0NDUAPz2uqybthWK;DP^;by?E^flWqWf%DXh#@%^$B@`-7u*M$&d0-l zDurL!EEYN(ywkWe9TLN-l9tabbSGQ7=@wUIadONCeXMOAG=BT_IjhbE`W;2b#UeJV8JP?MMBn~REBh!2e|0djJxMv_Y% zfFB8O+$;pxnhkp-=cn+@>+bN`@R9MaBi>MRX{QBh!!2jd0-kwHhkpPaQXDvURq4Wo zZaI@2tqCZS71b25{3LADWLS=73TD_M3ll9R%7UQWq?ZE6gE1$og+k`c90n--amcr! zlNG^rG8c_Ai1}v!q6;b?c@!PDxG2@dR1y=KYKdmnCwsn|Z|W9J4&M#H0nB zrNbPeN_6;n^cpk(WtWmwz-!hWdR(vp;LCu`^mRVqOSm4T@#He3J5A$R-=t^nTL>?c z6^3N8!jKrK5ZsNLPOS6^j_Zm-$G$1JPb`kTRB+@>LdX6kIB-CXi)hJJV?(Y6Jm?oU zVB077BL1D0+yV62@JDLNw;FX zi)dpC$JSuz&f6Bd_(b|JV_9a8IDoANRW`AuBp%r}%$yCkW4cb!Rl zk=m)=U0c1gH9mtIjlE@7>@4^UryYK0tB`32S-3K;w+^uEbmVAWK+=+9orN;E-!s#Y zhHZqOeTZ9Axp+whzQ~*lxp-)!<-mKK;t_IE&y5H~2!51lgRKR^?*;Gjw>K*)R0MD-JTrZX^iDCt|9^Ysxs; z5%*%XoA-ELJ>iNWK+;|S$cmT)FEeX~WM<8fPaXdj+(u0&TupG~YC=a|Cb)eT zHxMmCa3|^z4$)ZLR*RFRnt!9oHpVSx!Dl#`_?@jnY%pY9=1~#Ecqa~3rJTFTUWp>O zzaeHCFZ}WFd^zIQEc@TuW*ea~@=zB##qf%G8|M4CxU;iO ztv&H#P$n4ZuWq|d^hyz*!9Ibk6{&My1I;S{ zxQ><1iE~R%=vXq;i8h+zoRH~stmL0HJo3jsUfub$i<-@!Q1^)mCv7|PnnRa&{_KOg z56rlFQKJWwy3M%egJUnN?Ah|44;Sryx683ze|U3guR706x^(_eyT1C}B>(*Mme2hw zJ@bP>hhO{V=8EY%dp!Q+0DKbje$s-AKfL4f$JZY7!=>k4I`frHODDY8{mtY0{_ch) z4;}N^^j=HH+}Wy6#`efOY%L=AC7u^2+j%&vsxS``) z=S?d9titp7>he=wxw~!CRe!zb^HbV<@$^b_ec-9)*B##V_1*LLrCjwu-HQevJf>_% zaM^Q@B)53w)lUWuYF~5Rv0X~H9Qg5!sgu{Vy5sGlb6Slk*t+!FmxJYhX}#&M2b=$~ z^|{UO8gaN!yLHW59lrbBIopbteoe6qL4rc_s_fEU~rH1=z7yNX_#dogmeEbQ+u0H9&JL_Jb|K78Unjd)97(Q9t z*MCjz{byd`Trpt(^pis8pE$d)SMxcaP=ZwMKWET{%A2EIq}pb3Dz9f&Gy$$64S%q= zh^l!sL0BQ$zh6{tMjDc+t7s5`z9KFOYd6vPP>l9^-o`IumKDx#Nv;DLQ6o)RN2T_9 zHrEm5%)}%zXu{m+9=qiBZ)5YJz~%Mq#4qnfm&l+AzhrEK`09K1{w+2iP6=R$1UDPP zOyCk3G&vt}e46EU;grGac@+dK8C@cSCc`D#xphVN`(pFq;a1cS@?nm2i42;s zIzi^#89ET>xhQN%KBhd044RAwCF`(j$=;mU@=*Bmdb07p7@|vL(4?(II~zBpUmTlH zQ^a~bnGyAq$e;-)S-71utJ!)qH9lcv`)RK7*%DDdi42-d1|?GmCauLwcITtEWITI- zW{uM&GH6nWIHn$(l+iafpH_(RdY+5OCy_xD)&TRlf8)0=$L7Np>h+8Sfq7qv44ND{ zpJP=%qa*T3WYEOq^W+)dPmC>3yO?}3WBPl0MZ=vxzOQex`d<~BPX|TAMIrNC?PK!c zsO zHq0|W8(8vbY(B>+n!OR_=@OGq*Qk8<&c9|{Y(Cu-O&Rhr_0u&bpYDpLH-1^qkNwGq zSt3J`{i27W`8=XL-DC3Usc0x8F?E}V9))!7&WDl_3{C-U`bAHb574Ss1!k&rVzz`B z$1#|}a*2ta!Q^X9cZH#u3w6*4*v6KIeT=T5#hfY#tavjYq~hsu5)6!ygXiT!jJg+e+7PCiVQh^aOI;KcI zg`v6xFhVpFj+F$!^v_1Msdc@9Qmpauf`SwDp;b8lj}2*q*jbOFPJz$N(F$U#}>R~RGk2%A7!FZ1-uhvf{4^&*fq-uWo;>w(yK{?Fk#fF+~H$$kY_)O?mu$O*uuOq6L~`vB>a=( z__SdoYw_l1?cEIQJt$K-+Pg_s_HMReoNS~T4+p>s7!QSB8|^rFCAphU9D6sZ$*>RN zqRUBO?`D{3!TKJG&Sme01N8Nvdsfr3na8t#a5C=s4rm7Gv7SKLXNc$kybYPe#YP?= zf({%ARq;#o?QcZt@xOt-ePxx3FYi}r+?T~*Ze$)o=YEtn_x~#3w|f4&q~rKnMQLgA z+`!^F5YbW^^#z7%{$ZnT5jsYS+S4m8rq2BSeW50wHAyx3`D4cCL3U1wRKU;602;?H z(YJqO75gq7`_)O;72JMruj^O8KC$U1Z%@aRGY_|or(>VeP`W2p$3CT!bWf~~{qAT- z@pSC3R`^&Q`+ryXwwIUeShIi9x}Q!Qb^Ben_`g@Sn~_hfj{Se(zIU@f{~F!+(sBN) z9sj@D@&A48_*tc=FM;y=tkU^QGO2u?y6{CgKJY|DY04jn*ddu{u3y7brlg+jThaYF zBaWwMn=3!Rg`RD0JoDRPe4u(5x^QOfShFHs>A2d{%uR>^jQ#N3(lcJmFg+5Wf$x!(kzc>5#rdlq{ZHe%;umb$C_m}ljvKUL$g zY!&45VkREs`~x=&a#oHtupmXCCV*Tw;x$*_c-=`~ch=Xbfb_D%!I125FeD$B3T~~Y zgB~Rvf*vJ{<19(&4q2Qreg4`0;Ro)$W>nYG6EBvYB3Xms)toS0>3x!sszI~CytoNIS-4EHC7XCVM~Ne?!^`1;Bv=TQVRW$Ri#HQN%!yD zt5>#_q=zd>dci)WqE6i|o+N!D+gzlJBT2uCc6bKphP4(#cIKP}lJv8h#$>7JT$Z(- zLS#3z>95(Y;aG$mCnqQJWf9*LJ@X{A`33EHC5=-_+%CzyIq2R8&G+mVa4cUux>CH| z_2@I7u?@hnd&Q%x1y9}F17`y{Plf9UA5YSM6$P)0b&A(VC^Ba_Ks-xqY)W(TaC!%x z4y`M0e*cHLF9D3IxZ{3%Bw2O?8z3lZ)NpuUqN4E#glY(6g90I32?``cNB|9o$%aD# z7d8QwXYj)N!fKVOwOTEpwweGEJX%rOD%E<_3q|Wi6-3GR`_2Eo+0ACb*5dbl4>rGf zzd7E_ygB~!pLsLmU@;GFUI-{>st6_ukLwWo7U7)?6L$v-Zx?DsJ={zlA?}!tMB#BU z>dPYyqiIz1xrx#{2;qGMH+{y6JF3MKg?BgjGf*wJTW#FI;+NsXm!5F*O{s*};~?Qx zfZtYz(?%zVJ9tZ&e_ZFB2RF|`3Be0ZWy1KaKspvrMD=CBxO91mnZhE!2BWxZ;im6& z-l^@v5{B0ccAv~dqkE}xcF_0xIx?aM+y=!tZk zG#mBua&d<)B4K#QI^%>|tf9q^*TLS$S;)WTaPw49+_8Qnir?+vr(sCZh99qky$^0F z+I=4O0$U*N4)#7+o@XsYJ9UM)V|_`K-f0N0%azzVbg{TQSpMAt>pgID^%8N%4n9$M z@8G#lz|ESFxI!ObHp#NF8k3GYWSlb5%>=*H{vpJcr^&`ysNQ=X_L4*SpF5jI(s!fxx1~CZZ!C8Q3-4-LT#xs5gM_E!7gsN*pfByR2Jxd5gKG$WiOMNg z5U1V=(TNQbu7j1U?@^B~hnrdVio25liNdRcyRYxV*nFM1O9dn<2YXOJ-h!J~9}#!w z+u_BfV+-1sVUHn>Pl~&-2XPmKy9@t-HHVwU-EiAoTtAqC^gfKv_3>@u4&D;RZx_nx zKDc@JPvS1;AmJ5*fBR*K-`m9hfaqk07mC*_}1^*OxC_V}EZzD2x3f%PkK-_f)BuX!uX5(*`8*!O9JZ>I4>_hZj zyTnxwJG?jzB=)s2F8SCF$wG8C|4%iLF+%TQ&_Hr0+T)DQU8B33TH#{?VeZ1(nbT(k zvEH+D*XVYY>cku#1#=YW=!dx#*!z5Xa0a|#uk9n-TTR1qJF)0yq;y@B#+;m8RW+>w z+Vv_(A;LL~OK^7QWfjxr%w`BeIx$3@J+p2GkMOJwR!zfjSu9+(g>s&WZO)@Bq^HiA zT|IMpeQhOY2r7b=m*AMqF2=mBv2T)EL+%qJZY$~#u%{~*^V#WFXNE%bhOQ9)>Zi^? z5bcjZ?S^|MMxrh5dsv~ULpEnu)-c{UOZ7<5-1dQYGpANSPg#WnJnN<^U1hBD5)t7^ zrfcAKYOrEjWv~(qPh#!ONQ{^>n@8|?y7t1|{HZf4Ypo+dqbX4#_J#M#8sw&ENEu=_ zC|g51x4qJtDPPJ5&Y3kAvoLkyi7Dq}O6Jrljj0Qb;=DOCr_HTa@tF%NMnKLSwH$J( zvZw1jgoO#68C8|ju&F7d8x7Er8cOcMj1TH$9$ZBUreccR|6^y>6EpDfx2fYWsDfl_? zOLO#na8PCKhowh_tU4#%tf(ZF>XJnLs^0_6FJ zCCl5lfrxip*g7R=oO9UT%HhZpiKZQre!Yh!Pkt=ypCeBWW5jh(KWjWY2CiR1^nl)< z+N&cdc?my9P|n`4}F3iJu2Qt|XX*@zXk( zIql#x9=1$g0~$l)w~BkoGRbBWk1CEMIhwpYams*J6Mhd^CNFpYf(C*dH^-m}=lj4! z)s)X@f{D6ZpE|#f9FDWFI4|Z~6R&C@e>he(WLhJ<%rj2QIql5MA+};D^Naxl&OY_b z{%4+(d0|!M>{Dyz)X&W{;4xUz1Rhx;Jw7=YlwMWIAv&2c% z8z={ET+C0r6{1ZNtCgg zc`g3HHZwUga#v29S>le2{~kwuH^2`zm|FgaBQTxR)&^sjaPuiGyIkf)X?d^vmtog9 zY@1b+^?FwEB>H{d%y+w5%#o>ioBRda^LF?Hf6tq|tM1swH?UX7KDWQIA3X4I*j_*c z(0CLO7WJL-UawDTTKL0mXHHugk2EcfEdF$tdU$cVxdS^pwS3}PImz+8iQ9l@EK)Lz$RZw&|&e4YGU^lM(jFL#<7ZT7&9J`xtj^At6rVY3}-50N z&VnDCwYj8iUao{xo~_QBt%=zTJH|vxYnt4? z64^h%RH4CRc(1cAB|oBW;Q`Mca1+CsmmE=OCXY6atdQgJqH=?u{Y9B9T4PO7CtQS${1`Ko08)pV4sZG+d2NZf11#plO z%H+04c})ZbvpCn)GWL+E9r?biI2&n>Pp~<`o%fbR>H$52HUv@>-`H$u4KI zOKb9W`U5Z8X&!Ksm0X2Vh0NkqsXkfTa8@>Iz&3x;Hk^^1RXPdAKug~Cx(p`&)p~4$ z>8_uI5;nogf|9&f=8wpG#r(U!XlHnFs=L0sW#P;Fdwt5Y%ox@kt00aok!{r4&T*7a zQt?I6N0xh|IsWb2$Fzk%a+<9blI_1n2*1QHU45v%R+)}Pu)k5JDcZCOru!B57tQfF zJaHG$CLUTVTt42d`1lYec?OSjdq{i@kCa3ZsYcml1MKVIJ>tpQ%7YJe}IH5d^ zZ}=NH&C-ZNpEm%*dtJ5D%_TKRwplvNES|9ApZ@hjbDe#boRzb^Pbo^pP_sBcQaY^K zbeB{|+zVN*U+7be%|`S68wSD0FgU4>qz^;p9EX;SFXQD?`TV?X^E;PG6vA6Pk-!w} z<%h@lm+^aWbM-AKxY;fgxoRAmRGk%=>)-IYxqL0yl^G86#WrPJx>>cEH<31%(@V?8 zo|UOiu{Bpmd2DI4GTrecdkC@guixZfA3_cp)ol&SZ*gN~*@n&4c{}Sos}#GtQ_HRt z7~#RczB%U&x>|`DHi<*t^85J6K+r6n;$O2ls|C9dMgqaS)$}|6B4*pTronAU)wOMb z8Y=^fCzz#Y^?A*|ep0T}3=G@x4ze!i^*-gy#Yp)u{|5I2WZ`I)(L?b>B0_Z-yAoHvkrtI{13YsuBE z_$r`d1|?>ZXF9u>18W!umGzPXNPAmxP?FgA2F@7wH{9_9Pbi<%`22ztR+bjjn&wN5 ztbJuxl`)S)lp<(Nuy5m)8FGe^IT5=NrVpq!+4k_> zr1>X>pIHfSj$k*$uKp;LdbDD{pm;ei)e2IcQ@$X)AMM^&eup1w4mKRvxgX_;j7q}@ zav{3IhS{n_MkV^=ktNdLW9gIC;IF{D;s7?8`*K>%{5ox_Myn@H`V}y(g}Zd)HkhPI zzeqRfvviZr1Bk_THUuj1y9_4r`%9R_cCWTgO|osXVG>)_9i)yeGZ%YAJm3k4&Hl#M zF_1yO5Z<5UU-1&mrRMyM0Ywlw9>UFlB6rX;AjRKs7hM%&Yhy+gqvHJ-6|VvpzADYY zfi_FhQ7}%9l%E{zsRO5#zhOK*2Hd+xhp%$u;HLTua+)I}_k_Q5Kgoqv{!uNiSF^U~ zJdXf33bC!peN0wM-lnTE;0<)}$a~nUmPd+uZrqOwQ6VF#!acuGQAuXF^>2pvp5kxB zYB6j<-P5Q?PvE{BHy{5If6PGtmUmK5oi{5k^Jj%bJ=uC@)vA?!Xqq5*qV;90SB1QentoW*Xo*97r^fw-jC3MV#y#xG> zTwT}R4~MTxs{k4E__jd0zAPRJ96r8}J@|XhZze=X{Y&(cm`KeY20hQrw%7Z5&Mhw5><9b+>if4F1wh`<$ zrfr_5ZGL~N7^I?Pv<5Pf=f=iD{6P*9!g~w-jr;}~$&=oKeWHIuNqSakCQCtiYGmYI zXu_J@UGp~2yUJ`qg{!_c>vgyvYv!l90+~>TcwB{hEKLrAL0KwI<%?xBjx$H@&3k3u zk#Lmt${1HmN&6@{$}^*NTou&I(eRk#zt4F-YX_c;=cA5~$A_fNE31qU^r9(NC4*4s+frlrK z+`Ib*`#CE64*sZUBJdG_v5|kmdnfuExjt0|(Kjv;{^LWiGJa}W{(_dHLt6SCuC%zP zBWk;$_n8iniRBR)Jrb3uslb^RNS&8184H5F&8z-KYFbonE9%eYELsIv1B=eEnV1?7 z*EU)W#{rao)uT*Ktv@EbBxuz4pq8Z#v01vr&7Q&E@D*;P%^F+E&jwYXyH7D!uY?8K zew*nT-siH-IIBG0bT@k7qHQ}gC}`KP_diA&DJXRemZKwXGYSiTL#;C4$b%Jd4_&a& zZvNf7tI(kar%01+vuPNS)Q^BXo&$~Vi0a6=VF%2>h$eR-zh^8#fU~Y<(P@%pQRo0zhyAHo}lsa39_cTnLQ^H&Y zUgU$yc9Awwj1vyqva16z(~V!jBnm)mt!vz@e5^#N5RT(<_OR*d<1rDt&PUrQTro`I z?rNCC_DOBq9fF#;J02!+w?uPqYtwFRdm;Kx@v#6V@$m>u5~~)?xgbU`^@tTr_bF2^ znAlLJ8>hm=8L?zzI!yN{ZZS;1RHpl3;&%k;#%nOiGuEJTNWR>yP3vG1+jn7-JVnyf z_qGi{`{KuKski~C>m1}F&2)vKgX~TscWeL<_(8Jh+BSUKt+qp92YO0q%JSdGVIxP50X=ZsP%u+jz{A zroRiys zj)mW4_$^HSy)iE3D&wt`^D%FFUe_~K4%T7ayPSTSt)BOkXAPDk|0$)Daigb`@i6i# z9d5bQ7at~8&8wqmWzO3Tfj`eQoyVxt#Eb3Ki7R5TpM z1uU1w&F)Ud<(Lati;3j5Mvk+KG1Qr5EOK@>o^d*jtsQ zr^@)v5(S7jnKE^Ykiyc>f4T*dzeWaDh37H;fNzEr#mpE%H+!`P$lKXvs%GjKXm zF&q(UMtWB|x)`@QvamCKXQMmPdJNLq3u(R2#k4X;w%=W@Bay5r#v)fYD-Y~2pEGVh zNbH_KW#rVm6X)YCjEUWP#e4DkC3el~KFJXqyE{>2|A6%T35SE*F%fqeR!kms+A(=j z`9H~ZAN;VO$Tt#~$j1Y$e_auc6gEHDFx?4NVmeA4K6=1L{z=9a#sv;OpevI4SLG(z zk&G95JPv|chHZ*jZ}U**x$gUdn4iPqPO|VsAb)gsC^PMCKOK%FukOce;m<-$lL<1Sx2kZo7HBSZh1a<*Z=k5od1WW^R0>3MeTQYSA z{sPz;I23pUunO1{$n_z|0PBGnz!30Q;A-IUKz@AH2lz0sFK|8Z6yPRcHgE^<`4D+{PKe9>6n!y?{BuQ-Nmz2LR6o765S&Q>X^`3n2CK=K*g8769)7 z4h6mgyb$;`a5yj-&BF-b5x|kaen7|_A*z)|11|%P0WJWJ1vUc50q+8q0`CKs0oMaB z0{#(rG4OfdWZcXy1(1!*V&FdD65z2Yn^yr(1cre9 zfepX`z~#W03t6#mB814RlwJQ zbAda7^}xRa8-Q;CBS7SNXan#a;2(kS0{QXiKY`qi>^&e`#*ct+0r7!nXcrKjPv}eF z7r-BYtk+JoBY0;aAMoG6W;40Gogg zgnJ9n3A`VO_9^r*5Q13fX<#Sdb3i`-1t7{)h~4Ikz@5N90pGCf-vPes!l6yp{l9^K z$NhKKJzLt9Y&Nzz-TxtW>^YmOTyh`ZZ0cemyq(%f$~_mSq%=U9H*H0MH_A>sA1 zOg`fT%?;4pFEq#2Owxw7)$)6}=IS+v7R7Scq&d`Di~F7CUez4iH;KzbXhGx|zqL$W zV~ggtX%6aq+4BgDaUFiq!(;p6&b~TX29Jdta3KfSUaJAo`@l1eB1%B|q93{;4ueD> zmpvdVz=0=nKrDp{YgA+(_rPG~itc8_5lU~6a5|^Hc52m#s@aDe(b%WM6(RWlZ092_ z-K1O64IdYM7$q9&g8EC$)L%Pam`*#t?mdn6Pc}EANj5j4Nsez2 z&a~Xg;jqF{y&&%TBG-kZqFXq%f(WxQsphvW|MHlxwS3aa^{wkGvz6-<-wrps&DUIC z;8di%Z~X;dwCqlCz1{MO&uop0~uZyM4qZ}UW~*}xKxTFk2SyftT2)~4_-BRC_x%Ml!dKN~q(sGn#S zXEZ(^9LK4yAXW^fhnv&Q(HS`Y(qDb;DsR&mM}EWe_20miIl3>{&h5DHLg@Z_VoApC z?o`;+Kttc;ZbXN~C0@;DasTi>fBk6#ic9MI;q1@XT0ZXL+Sc;PQD!SV=EkoFg?LZxj)-686%+{j_C1Kb_UTGhoaFT z#Xywv=&+tcSMKz(Kt1$%jFz!yD(qz_kG*SatMIM59%!DaoMmE6WjmQ)TRE35s2^af zbG>qLKhDx}8e>q+CIT1Wyv}H#)iW1VVV$!C%4c(lHaE`hq657|wMon)2H8!$lr$9y zmg^*S-`N@`LI9?Be4NW|>mN5Vl{nkYl-e;OD>_f!_n~1g0a6 zjNb{sn}F=HZUM5ck!J>8ho8t`G>HsGlh^pbvh^7sTPCl;QKGo}L30dUIF1d)FIxlQ z3N<%cbKLV<+|AP5<(gZgxmz^1UUN@r?qkh;ra6uZ<++_Llh-&(bH{3~pXNATwBoF} zLd}iV+<48+(OjM8uF_msbGtP6spimCnd4JS$3#0Af8$+jF&KdajC=KHIRneOkn2M{v`$dtNniq^lzJYvKh#1+ir5XI#-PkLjdB# zn$S=;W6L5-GSnk4b+*mVj+|@zliQ-)*!vNYqI`YtZrgANo*yY1YE$N@-0+rRks=RQ z@oz^V2w#!DT z&t(>6yP8Yd>hjy>=c|aCMI#h3v~9jj<(Q*9S;IY;xpuW+O=VkMdRtwZHT_xSajj6X zT)`E#ZI7>2e`yv6O)J(gc3b*KR`i6jxoHL0$wpT6Rpv!rn)}0y)sPd*CvUc=nA{Z; zH&TrVO3i%$+2pUoFCFI~+uHm^F#Sex-)R$TgmA2JVk*%lmUQ8M1ye-%Wt;eK{2K7H zFRruW0t zaM%IZS;M}T(*lgV4*^)J^E%}@9pou|xY6L4=WxY1m?jR`n_r|HjB^AWZuCoXW}51A z{;PgRrPw}5S;^9p25JV!t0zE4Mu@y`io3rv?w&=2m+ih;-O0VyEXMX?c6m7#4((p- z1dP-vNSzMs13Vi@N#b1KBw#LZ8W36?rBTcShH!r#@EYLxKx!)Uft-sP4BP}90%UJ< z0nmZ6a3PSb|486K;3y#5q7vXZU>R^K5ZWT85u6BY!2KlPwZO?hY6L5Q_W+?y3f&7V z1X4p706t;y>?EB->r&`+Q&9| znXp?JXa6Mp+f5#uv|hOHAJ?QQMLg_S|1vr>X@!YK=pwkY9pr3wcgWdxgJehCZjjhO z*~imEHpI3{_1sNJMi3{e0O}4Y<3?M!gfgz0a!|qGL>#MODT=$F9Cu$AcfTy=K4!yX z8JCEi{a#XWTVpxzjH<`vrU8!z9tY$*?*_~S_5cn59swK$JQ7$1>Ce7WaxpkUTf}bZw?hD#`Z<`lpl$M#JgXY2-^YZK_ z_mO#9{eds=iI)*Py78Of5$53BtgWurQhs_?FW(k&wO3&pYPK`dAB#3ntyoOf;g^o- zMq9ez%b`p$4L|#;unf##UaVm3AL#Zt{LaUZmu(+g!Hx%?r);D4@fD1E)`4*qjL+mV zSPp;Dp@J1v1&7X@${o-uYh#56HOFR;)sbmfYU)w^3`ONTKn8lLST zT8*ND0zFXEC?23o!@h8;Zgxe`REBVjZwFv!h+VOnj@Z#WW6BZovGj&EM(!Qzb6z$9 zhZ@I5BbTs__pnrPnTTsl(nvEFOaf^u0aAm%f<*{F`?BAAXAnV)taXZPFb~LK_a zIBusX94c-2Q;%7g$w8-qg_s=IP_-V)J;UEP35M|EzPbL!F)*p+;2eTcF(1Av(`YSX zW*YTfT8lDiXe~OK5WcD}ms}O~RX2-M+n!|MHYcb13rBLbY2zCUyXCx!XNC8F>A(6j z#O2#Jc4N7le~IrY+!*2AX|Oa4dkzcl^viuGjob@H$H zjk3;g`&Zmc(|%8VYWO>>vb&LvFZP&4nWfeMvu!>l0em5y8mZ6ZShN~Wtf8a`6K3J} z=8KW}8CXUZDerGi&WxOgm3)+}t_{v-(GQ`uAdLx}ihGRK?5YY)=$x-X2 z%EVDC#X7#-2|(ATtwZ{HB4Lgon+n>njxiFx4`#D)ZzSA+P|U)NvPgI(OuHDUD2lt3 zKdqL_nVZ!rIjsF}E#lAvFJ4t}t30$8Wg}y;aG-|mbQV+Eyi zBlGl9<0Jvy=F`~pw zmHrWks>7I9Ra*y1NJW6YJJF$Wg=>xRF4ka)>_Z=NF`@-sGwoZbj`yLH=5jzuA0mTu zrYg7vsD6IbwM4%!e8S^QO*~--ZPeAaiFZ@V@6=@itA)!q!@9R zkL*fyEITGOH6=Bvv#)cq+g0lupX^SZ?M&@6m(vW)0%+x{L<7aQ#%=L241t1YF=mpY zVV%#goXZ~bjq?pj_PF{cJ6)N+(~_O3zAnCzzCP+-0JmLH4Meqs=^!h?_$W<LTkJEPqluoQ%R623h8dtrQ z;%7e-qeuPB^VKtJ)ie2ATe#%#m6IgVipQd-uVvkk&ojERo-lSyH}laCL6Sc7+;8m4 zHmT86X~Cru9j$sx@sqjAe2%G|-9fXAlh*Z%B#SLcT|>Ho%ml%bZndP25P_=E?sdQb?r#K+1l|N32fP({G4M`cCGdXW0^kF{#XvkSv>f;#a3$~| z;40v6fY$&Y0j>f57I+&F$}qK*Zv*gM+(Rf*OZbo&rI3Tf8tQ_$Vq=gHD;bv6h1f4W z2c%+dD{vHW8*mEn1>juZi@*@@B_I`Z+ksRB?*l#!{0_JU_&tzHEC|aX*x?|0BgD22 zhY^P|fL(#Tt@~Ucmg$A4uA=>L5cdrMcf}ZoTIIp}BW8_nGFt)LasBN}kIJEqO+N&9Na9Zm8xsJucjA&0&CN zamzKgN^>`9jvwQQ-z}Qkrnz03<207IqufN3&v08NuaTy?bj@XIuCM0$Ywj$~u_Q=% zV>O3~SBsmfIiB1g?&fRmY0W*WIku$Yu7_pv8jYIcq9WSjNG(WC)F=3iWtIsWmcb-` zZ?;Tc<6g}@pt;92w?T88HP@=S9h!ShbDwJN3(aA$*;b$4R?iPwJ(v0~^+4OxR`1z` z=wXDBIe9aiRYoi-g!ZMKb@j5)ZY5dSksnG3{Sr6>_wmb<=!b4N%0JfjXv7MM9b`mX z3PBcH*H4oJ6UjUx-$Xks37PRav`nL84ta#LK1@Vg&v=S|mvfmB!+J0w?(17uNF_8I>Mprdtx56w-q-c^QQZ&gDDdDJ{5bkly zFm$6_y^(z3BuxpQMs+{mU83dy!-+2fgY z8UDh>so^%L7Z?~ck=U!szrqJ|-g5R`^%*j_Y)ZW<`VC;7n=4F>;Mw6NCm#r&erb~Z z1bi5Hz~AsE*oCij8}&YHT9g%-GxMoaGI0kk{&OU?+%A5XZ=_Wzc~_ z58{aZT=2C2?yErAOAUcy2z*sUt&jR?1L4B7iik=+6tajh;?AKtOg@CY4!?AxRQ=_^ zjQTN_o@6zQVWy=UPvh^el<8gkm7!`UWU9DhR*UHbZOYLmR!8c3nM?LH4z|4P3dI(I z0}8t3uQ<*g`Z^;?*~oBnXqnF;BYlX2}W-m0CKEx4t^M)IgT{G(2ujT(;mSw z6|q7({c@yqBE4e9=~9eHsSQ37t5(qLykY6VF0ILEt=d$3i}|Fu zNhQ8!HZMc*v#&DCV3)dBfrDDFljH1}InwaRdTBNR@e4W`CR>s5_!Y2Zs!KNyRkNqz zK#TbHq5UM$XkAemX}O{zidsDh3x_e+3e2vq{gu-bj7+pHcFW?i1Au#bd5KbFs1Po( zwNX?R9jlxktG(K}(!P~A_*%wjWE0k1N+1l9lRb9KDY&TG3r@u)@zjs~o;t%jt0S*h zF=}Ey?*LM)d<)1b{1;#^;9r5+z`p^{0=@obz!D(+j{*Jz$alwk zM)!LBQm_bBOg>|gW%8Pyf+BDZ2rAhprXqoV_gyz^h z(ALXwv*nJ{2*QcblNz_5Pq34vi^hIg`_tyvnAk?AC=H9U2dHIcwG&JA_P95*YHj4Z z$l7FnowvEnU;Krdr7-_oja?L9s2*0`r!Wo1>P{;*!fBKHh{y{1VY6eHf5rsDj>TzN zZ`J=^eS;6-!IpdY($?XZZg9$ctunEwurfB_XJ5Bl2D{iX=`6i;%ioQ0_U!B3%0}E# zqU2@!&!s070@et@G>*5pY_0&lEU>^*zAPb{?PR~s=S_8SyLZXl-en6UxD?~ zGSz7_s{K@yrdjt6Rix-Ab`jZFr2fC`tXa7k1=d)VHY(+qi6kVZ_DEwT82hrzK^G9L zY`i{3W#oInTw;iG{4Vs1y?}dgpAXyz90~j$I2w2Wcoh&|BB=!$Xput^++*onh~>ly zWIxVuZUBA*cehygjPe@%q`##}`dga31}n30tjxmg*BmReaIDPYj+I%s^E5}fQ@Bet zH(PU5%81|VHAkh4aKF?X6j2t}(=w@k^q^~}%FHDh)^uHKfZ2)3Exvz%Oz4g3iS0hE zDL<@GwI=jNC7#eLN;shx=#NQajvC5#F=TTdCiMQ>>AdKEC;!!yUQV-rLuwPpcNLN1 zMRA*?1cHoCtKKW6{p_CJ>2MfbwOivwiS}mv(p4XDlQOXg$&B0vm>yBwU)5g@hgd|? z@k>_UREf!fmnJ5*0c`rF;b&h(u;pd94{Z8qwts`;>|^B+_SzrQGcMadG^n`L8&+{h z)U@%LbYBRh3SBO{X&X~jhiQknQH(8T$SB7A(N$yT#LOj7Q|}60kLiPcm_EP+MQWEW z_~S|Qb@C1IouvMqqNXfTQtY8f>>LHVIeg`cmaw>Mc1*Zxjv~#SoaQ>}AX5|n>8u26 zLM9(#e5jrh-`YubDhI2&p>3Q2{cv;^qJs*?ZrbK5AM(e3&+HqfS$s2^9=?aoK$eiL zK*}-rurkDVOP)>Db3isUwEw}nPr|$7eKL^te3$gcCaeiRS+YWtELow+Yizb`eMYNg z@)~bw?rqJTi_pX`7m9G49?k91++NK=9*LJlWC>>lR;T~pUsnL>1j7M5yAx8k z4!?9YQayOR<{OExrR*Sh(T-PqEtMh~wZFkdSK^v)ash8~+5Z2b?4z~xE!dqCHwVsV z(mmT97InGW)zaZrRdW;7RF-F{sn`5yO|@%W>w}^8We=%< z<&T}GopBqq_y&|U&`qUe7%oigm5)U`3uwg7`K3K0 zf8$7)P`T1*c|;k$IO)F&F~XjE{DLMjq(4H$IR;kOp0}@d9QNYB5E{ip?J~ymGq@r% zHQM*ab)dTE%-ZK_HTRjraiqf+rmqy+2}Z7TM_dvIY+1X-jUCi#tGSbK%K;wya6C32 z%a#42`|R+qU(_?YGduSrM$E7yF}93eptd8ncC*hIHY7ajdq@42QY_AC4FuWNwtqz3 zozU_+xZORsIyVdV$TqEvlk0R?4%gwAZdBs0 z^!DuOrH`jF`T=D-4DUcpEU9cM8t}8P2Vu*~%2LLQEd|?rx@DETJI+28&5}Kop*zgH zw)0=cX3Of&$HGK;AU6Cbl)XHSLm8;GIxJyjoEY}~z(E~alCg(c!fKC6pjpCohvO5Y z8mHq#m#8pVaz%$VT=zmHU%REO45%wy9eRAO`PL_gm4Z*#70y)o$RwQ+Bpr1f;`~RU?v; zhm>D?CoNIK+Ft|B#gmSvG*0QPV)ZjlOAc#I}9iHlTDqEFIWPtT! zAHsKGU(xrJP=#bKBWA%$w2TQ z><`QXjsarPN@yZ5AINdRP~cU-LSPse0R9qq0g$;l9QX=w1aJqi1jqt`PclQys&T-N zf#ZRE*`+`hz%n2U!$m;Kb`ybFz{$X~f#pE9DHXs$z)OG^1E&F}0IPsgftLbT0WSky z3#rVcH?OErh}Cl<$cP{RAQ=CGQ?;$GI=4$Zx-x%V`Obs1K8F7zT2p5HS0 z)Q3vK9k01Q+8y4!aicVcH)L^mCziYUn!8eSkZCM;rsnR~99McuT-Ixj zE2f2eL34lB9JG{Hc>mPg51NCz!}8nNGWiTn!AN+R%&`1o`oiMYY3^aobx_UY+@1?F z!V7yk>%EW|B7-w>nyn8^W542HufUG6FMjqV&5qrbNymuisE+YV;J@&T7lG-AZnE$j ztQ!kk1V+a-tg4cypT`YW*(9;0qdtI5)Q{=lc(%F2;D&+PX`=4Po|NY#R=fnPo+N(~ zP0HK)Fg{5=C#vi&iScUZ5gVkT7LQjSVjjE*psK zjo=`27`G5Pdw`?<40Es>+p-5wzy{{QOzc`6JO;Zp2amvR$HA`HFgS>#yDkr=$Tsd6 ztf4?5Y-94~M8)VL*zlqqFSdoT#fWX~xkiBfv%ctuZp!fE%acnNBYf6YHDpHB)XNf; zBL*bp=r~}RvoaAJjpC4LyiPW~wMpaE7F=`h%j@TL5hg-4Z@ui$fn@-KhveBiT3 zSp3m=^-Slnz$1WY)k2IzCa@To1!Qr9#!vNW#{roqyl0VFho2M~nxx3k3D16x2I(~|#$XL!x5OfjZ{DVR!HeL*+#NBx*0Yl9mYy;uo7Y zu~Ys!2k4k_qvP0gat9U0k$f~Yx;D)KZC`fT@Pe3RkyziSYSXzu26G;ex`dTk!F9RUI}WYhMpf(bXhT+pPvpu(0Og z>=BKWs|(Jxou7I!FZ71fp47{qS)I8i~}#*uI@Pfc-ugdHg7yP{vs zSW$or2WEu}l)Qi&Tt~W_je(Baonwp~*97Bf*BHnO_V+KcD=)XlV&f(;zTfq%ak}Gc z#~fq1^Ah7YSLGoKr~S2($GAiSv$Z)g8F7;1SYsNR9By4T#Lj1fs!L|c5sFhc#-9}2 z1J%JCodC&~6!)W80%0NneUN~MkO1}|^$fz8QCT;mLP@)5XZBQBjLfUZIIl=Bc8k;k!)23&*e+@fwWrjdd6?zT!>8 zqLw`HuVWjqe>=*thf4ID8SaJ7Kc8`zLn7J4jTY{wY!A7i5eo76;%u#gPL2y&c`x6GZoS zanXe)6IbH5@QiXhN`=S5D$nTUaNz4Q=JwGLZ`cA+p)~@(aWTJm314b2pGD=C7ZZrA zQ7ne35K@=|D*5W5*^SCQQf2MA#7wD)3<0f%0)thBk~FWuDcDpRI2_2HU<5D|I1+d^ zumt!EU>UFghz)?%@`!Ta9k`zgWOb|t{vJ3J$fbcbz#3pJa3L@V3<2i>mjmYmp9NkC zd=7{sBSLI0Lcs07Wk4a(Hxshc}7HYO`4;2P5e@mCGI#&FWetB$6OQc70scbSsa@=@yoeq zafh#mEDl;ci{n>H;trZci-RuF;-DS0xS5)R;=tmzYmQ&d$TL3G92VGE97QpC2H%Xh zOVixRn#y={bGT0zF6G&h1*SSK6X&Q~=L|Q_fyO?;vBIy6`Pq)| zwT>131`CGlV}&^#8vH7{P=_C8G%jO~SZ7Vfp26w(InUrc=-I+~iJ}sF94LaF7F`=xLnD`Mj#M|Ii$<3;R!arW^db_>Fb z7qJ;9c31pBa5QU*y6gd6#f<#Ir}j1{qc&TUY< zRXHYf5Up)Np|6Vn?;&o@(c#%?jUDSH6h8;3r&3mn6E8#C{uhBpvShzwJmPJ~^8@v$ z_VU-Wii^r$T~t~U3p64|k1}MV1Y1)6%JH-@%JAVVlL?OTiDk2;RX-&uwisEZq7+TW zGIifR8Iu$jO$I+KIG7m8PXTQ)GFAqQmA~u*QRvdX{x=y6p-=^Tiya!!u2+0lS6lpL z9wWs2xj?F5F9#kEtOfQ1E&?_JaehJQcHmXOW00T-uotin$SKREz%zl%fLwwV20jX; zJBkd;fm?wqfKJpQ@=V};_=)&KlZZbwiTESj`<6Qqe}tp>Bkm~v2uJZpIO_U^HZkW_tN-WG>ot%Fpk}MWS{iI0Tj*IetZksD zzI5O)NBwB5=!f}2>;k`Z6Q6NyK5kFqpWgg)EdTW6pYHtAg?~Enk2`Nu?O(DsHC;a{4u*)BZOT+aQ3@EDvj>u9r1+or8pfHgX@ zE7Ki0&kOBezsbKogfI=BZ+?p#8#l=DPVJ977kLD6@ULmHa-d%z=m^y8=3*b5_f2_7 z#p+Pc{ZC@U=dNKIRaz`LXiW>GBOJAjqwBdra6W{SLrO(1^Eh<&I5gh8GQ(Q+JTVQO z{(y>ff1m;?WjI)mywgw?mXT<3<87B%`mjii(m|R-es;#Lygse5yRRDG7 zc4uN)t9LtDtIjnQ-v+;i35{)D1eV|~R3ELHFJJU?QIQ7{( zwnwFct~+k8B4?bf^nI3tsg<%|i*vxW%6gF2-!-dy*^W6=nPYU4m!P0QrJ@{DCrQN! zConn)iA%rvDUy|~L*_fhN*~w7$n-xW)5FN{E-`vYZp6zkd1LjE>}EO5$7E9vNqxb= zG+-jwM>SybynLuf&xXvAK;O9R>YtJvTTr}OMI|aI{yIVQ!-|Uviue=|S7LqRHOlT_ z`o<%FN>puq<1iI;7W9qVw0O?_K;mQ~%x!xy zHua6MvhLy6HF8egzU=la69h#=UVR~KvMk`RE;SQ+Iy%V^+*z_CECksb%U z2v`QBPI3Zp6YwG+tKdZ71$c8+K(61K45V%hhl_&T245>W%3&5Yi@|*62+!LDP z+=x75i{`dz?j6lB|Ha)GnxkG=xKS=K`HZoa$;+col&#O0syUY4dy#S<=HqO?Va=`3 z+})bHS99NK?ttc~X}(v5*Ud6{joz9&QFCW%?i|e(Yi^9@sFjrPF45eZntMlcFm#YK zs**&?u)9f08Z4c3%emr<p)s7|IQyGnZ_h)12@_9kjaTb1 zPV`#|9Mw_MsH>SXKcT3hg2s0H&tT8SXWU)18ir|+D}Ls*D(Q5`Eshzk0FHgU*hoq0 zC}!A`ofxCw+T|XI9R|zYQ+3#OzQu|ci6$@YeI*N2I5)aHSYN-xcp3*JUu^KuSk4Ve zQZGz8(`a;Vbbg2#xo$YlvJ6KSj?$~xWf98E*>zR5va27pfXCsb;Z@XH06eRLS_sQZIRE39hV-@5$_>hE3M zF@qW~axp`EhO^oE7AjGK=~wFCDIHM`qp0(mdS$Co3g&ebcb3)vlup+cckDDDk7F(- z;Kk3vi~rWm8E2WFlquHs;!cf9TU1`)82@16&H`mOO65bxml}Ns2}PgqjGvM;dp0?m zv|AkU$!b(N+&)=s>tf}KN7Q{{x#BWqHzYyv>R472Caq!dPf40B)h$*9;$r=lZd3Q| zlfxx2vB}x2?h_{`r0fnN)itL4l&IQL9o0Vgy4TqWUjx{MsxMkH4hv#s=mS=C#f^jC zUE;bGLzmT%jXTcgx4{har_LtN zRqcTa!C;%sD+|AA7JnaRQ&}c|3*<7WM}d8Sj{$RmPXP0QPXP;nPXmj9e*mrqwg9gK zZUWv9+ydMTd;z!}_$T03z}J8Wfd2q?!?SU0Y^VqDJs{PbyMccLehOq8_AlUW;OD?o zkn1>BHbj-*H$X}e8IaI8i@6u~*xkc80OWYR4TyDk>@Y*DD{f#jFbVh^&5T$<)MJ1tzk<|b&4x^>!mae$ERZl&hdYL1elxZA0@ ze`xMA&3&mk&P2;|ITI~@`8I?*OLO^}8>+d6**bTwl#mevjqwsN*9OMg_rdbsSP9q@XFnVEu@W%X5ybj`k;{XXd@E}QvtWN#oUV;= zVom3Ix{=bY<4)_^)WMk3+R4C_FS&Y9WZ)$Cx6o0ohRW>`^d*U=H|^dEUU2nr|J_*( zIj{YyLA&?52lWH1)Eqv18cA7@nzE^+jOYiFcJ9T>!4xa)MSSzBFrz9G);Y@SSnMS2 zf;e%Ci&1Bg{5;8kn&KGabmIz0j2n>!wt{ILnhQ!?j1rY{tXNdi9*MneC?mWNX%^qC z;0mZu4TCfqHC$t9OWwT{^`YxD$LYolXAk3Mr%!qP6khu)yANE^7}r!)N54{(m5%%> zQDQn;IZsk4ViA+BxR2v(NPUZ;7?zYe3<>rM%!&?kjB{it|J@P$B)nEG?XY7m?(S9_ zgiD6ib1||c7J6cp_&bqZT&ORK#=a^Fqo7bdQArsLR)S%=^7O{xCnUGVHv zJCrRclTw(WG#pMvBi+gh3KcEA7IcU<>Vt3k&B^*KiA4Rbis=2t?sFK9ICR0<%rp0 zN03?2$#ItBXrmlaUx%#=pK~nH)y3YUfC|~qRCqk%M&2x!jpK7iY}}Tr-XhDIBziH* z)nEt1V|@8#uJ9kYDDK)*$Yau=sIq=E+f&GF0PKqu+q!W&!sQpmJG^Tf`td!S^Le&-zR;CS!dT~oM>M= z5GxVP%~`D_P41&gTeCzK zd;IIub0ek0{OgD2I(GasXH%cRxbQRdh$E7Q1uOi=hhU7^$z?ozEXqCDRxajZPwZ|k zgN7BgsaQx{n6ZmJ$Tlu)K|a*4Te_e79Mq+9@q-(SA69VD#p*41JhDIU<+|zc;wrDn zd$I1+jci}C_UG;O7wtv-%Uqi;wGK%}nw#9mN0!rDg>3E86sGIEZFMJR?abO|-L?7y z;PDVF zUL3A)M8SKEeR!BeJNtJr__2p8F!IofcJ^6N=-a~;hVyNl{R-H}4p+X#^W&EWFi!Lf zQAnwu=mW!*>X|h)6>=^LtfR-qP}t&FMP`EcIW}P#=8un2Qk)Hj$H8z!L>4KQ>Ti}Y z!*~Yr@oc4br65SL9R0P!1%5Y%6Axnk{(VO$CDc(ZEB4Ej{hJs>L?!=Ob84%Ue5o|+ zDwvtpy@N+?;Oc~XI~w!V(Lyp#ktTw3^dd0J@@*ch%ujgehC;MFn)jlGx1$;r(Yc=t zLtqR(S22hf1rW!DvqNCyFM&KN>s0MfE{DpTiRrEUO|7q$peWhjp(39Tf!3`f!=8x| zj(VAibFr*!!iN*eOAS<)$v9Qh*G?HvIXBgLl`jeV=B4;f!@q1_f$s!gjqhZf=HqhN zyMH?1j;HzX5!R{J+|pdK1K)_Kh}uUK*;zav!=q^s!ZBHZl8tXF>#LFc_DTK7SfWCq zAU|J)5*-*&D&?_06wd7rvF!cA?W#i;iG^{Mw07Ur=nsBNRF2Rqq&k&(+#CYa%ohK> zA&25%q!QvgaXaMm`D1~n;{JHx`M_Sl;lSQNir{^KrNF+xNx&0;RlpO0(}5=ggFtMm zr$lb7=L~&{`$0gKkzWA!0M7$aU@WVqw}%0_<;w-YY9Ius zP!LFe3xH#QEbSA4w*n^t?*>)??*&c+{uT(oO611WvJ$!BSADWG6Zm)7&j!8;oCACx z2=QNix>E~e;iG%Lga_~wr6x@xBGM$&;ljOVx$~-BmW11{xfFyh94E%b?@5}=(j0Qm za>vPXafeh|9MWfT%QUxKbJuH*!xHiPJI$@v+$PO!)!g4S$9xgLA8PIs&AE{)wDs{| zACmkYwi}!-Jv;%Omf}^wy(36wqA+lkM03Wu>5gJIz*Wh%i89pwbjYm zN5_?^lueeTIj&6acV$|?C0zIz@ZkJNblHe#s7*E0Fk2Yte2pj3!Ewxz;R zks%x>z=T5?=B~;A^;X3(+a>;2TNU$o7D{uG!2h^UaW(>Z1iy6Xa`~65UMFZ%wKlQq z5nEOWR;Ho&*%v=R;$>GBRwkP5-{ZPuM)`9qiZg!LrJj!hFYO2*UAw2**M%90V7OLtzeo+IK8YWM7Qak#kM# z`#&n%EL#*Q{In^fzge^(Qn(I80N^mO^-W4 znnn4M!gtJ~vm%A>uNrz(+seYWRqmr!79KD+wd``{U2`=Y`wKRiH#60d!Y|CCVBU6f zajL&)d!+Eq$oO6AdM(%O^*1s*Ru#784)wPA8*k^0bD+!LcpXgzj)6mP zuyZ5KO+%dFP0nin@k7B6bL0=a&{1C~250>sF}Uh;#Ne(!MGQ&xy~L1Q-%|`J^?n+{ zn>+)(_}pP@?eCDbtgT5*TwcqPW6hDC$ilhiHk?|WSGa5O$*acoL<)PZ9FL?PFbm%| z$G_93)xTj-LEhp$^St3%Um$+jP#&9wZ{}^QDE9|i)RDg|Jn=nL9UjpayazvCu{{(E z*^D@Q4*#60%7`B>`-}C@BXVPVsLD9|b+EVl16Il-5UKbcigD@$J62$Rt}fTonmMzl zSJee8W>p5K&Oqslj`i#*lhfgW9VqX6!o<=`sr^vhmA#J2VPF_zg>Cx}EB_y9|8^$D z&p%zxoHgdwR?X8x1?ib&*Gx+2qg2%7$RQ3LSroB&0E41e;HRMLJ9u5A71tZPWy*kr z%dnVKMu%bCqU_fpIx-IdsT$WQXiR&czqI}Ej5KSpIJ@5A%2TGJ2OQKZv)U>ty2Fyp zgRl{XDi`tLxKrjHu2kG!HKxi`Nvw-qXWpu;C#mSM)jm$$+ap0ciEm?KWf`K3=qY;! zQGp1ap_0KAOjP`MBx8sQ%Z2-Vl{7|Wa90PiOOh&kRB-K<+%tO%x+3S=r~rXx+F|cH zg%zll>_oFkJLavaJ}Pqhe0a*b~6YN(8ui)!Edapx;mQx?r=1yp^a znuOY@yvZN73%pp^9#$sQkR(~)JsZey<^cIdg1`b`Banq-Igr_MBQONK19$`QCEym| zUx9q{Zv&6Rb3OrP19t<@1mYmc5JttuXF!aGjW2=uz^{Nz`!_(0R*k(twp-r;86U<| zq(hoSI;6>KyldI|j1Mf6R~>^O?$}O?yCj4rTqn!qHO|o7*_y-H+j7VFh+j&P;+ImS zaEmk-(j3R&;_h0_t<~IpnrqhF7R_zf++Q^JZ_Vw~9LJRMj7-afqhK}1B{&j4jxNO= zN0-8JyHepe&J>Q562fs(LO4!92*(Ks;UF$q+;24pQODw*)f~rG;`e3Ey`j0cHFrRB zPPA0=41PQzesMON#c?bq9Cw}(cbqO04qLHVT&dEcW1=%r+X*G4fuSK{LnR@T8=eX+ZnRwhVR$O)19K zSJVB8arPW%CtFes-5noi&$3|4M3hqA#V=kT&1cf@DfnHGhCk|BI=4PJcE+6A;K;EB z9b^=C7o6YWTAf45B)0w;8cEeWv%!;LM<4CaPHLl^%p=BRBG&TpB#Y6+-tlv3px))=|WEOwjw@3^W{>2J19tiWMAoWDwoI)DXT zoM*N=mUxr{W{{|YhQcIMFI6zzj9+x0&j#Gtmk3zV4wA)|?~K{YpU7)bdv+}L4*YaC z7e8Lic3zy`v5PHV%>>@!vhCAVv6ed)>v?d0THJ`3abnmD@uP-XuBElua=3!}@i@&8 zS0S-jOYy9QBw2Zvq+Xw}5O5-Uc26`~t}L{2s7B@O|KUKnN6}VZcv; zBY~d*#{xeGmI3MSV&E=d1@L3wOd#D~4x~GZhjho(-jAOMF*Jz~LzAe@g+m;aJNb%C zxHipUB0|~vIOSlu8=yH%D_9&wDDlfGEzek`Ij+_b?l#Tcr8%mv#V>%P{#B@&$4B5JBEwn2`>>!(5O`Lta8hCP?J-esaLH5Kr`*=0*iHKYO zxO&bwagaS1Kh9anwY08g=CrB`?uXc+_lovHGj#>EQ^fdiAfxhA1;tHu?GdL8!g_*d zX=1xXJ8RUedN?*AJ(OJu?rne3X-^J+S$7R%N=&#izeoNkWp|MZi-R}`%dLhY%F6m9 z&sR4cdc3~?`!r%DItkSi%67` zlCsOb6-8wy$&ye)mQ+;on>pv+L+SnbeE$FM=kxo`!!fUU&TC$?FK6zYdF8rr=@(p3 zzqY^ojHdP12Tx+!2Q*`%KdW_}8XM8x!m=jwhsBvY8(wZ~q1}=`8+^K~@vcosXkgms zJubB6*6IB88e?k%&fhbmQ{XngaFIQ=wxsXfD4zL=tnsv^*3`!j8mzI*TUuq01i4NG zPRq&UjLmD+QjL7W$0pLI+_TAobdsnacj#wp`yECV^TOO;>H}$iY<*_*b zVE27BvBOs=Q;QE0yKu+3*`xhMzlzd0CCQ6>Tc#FsP8UVWE#y&XHtZAYE>bI_(v=T! zbiST&{y@2N>F!STTM_Y*LEN8y2W4PsQR-CaGz9c>;sQsNiD6hXkL z*x6coi%Uwzf}d$oMBK*H*4i7K=LQBeARGZNfrMT9Pu#}V%Ew*^PHbSo0eRZME5MZd6g@Ow$ z0^Sxx30DdUyN{_ZhS~yy07HX>g49m%>;eyxF9;xO!b)JH$kOz{v73Nj0MuqK|%D(yfqi9@q$nH)F+6Yz=PKP+e2QE1VAOU}ENjdW@ld}fl zf$b2s=~-?~FpdA29++1G-Ui4am(QAIa`+LRc<>+gJ;V4(8_p>=@h{`gMuaD3Nquct zCI<|@ATCLgoNOOgkTfW9X*r7`JaF5SoE{NW&XPH06T)KwhUuMvf`)ooT(I;Acp^v- zY#Vdb)+Wp25=VI8mv*oepb=Xp2hMH;JUlHAN4?1v0tU*q!0pJS--cj2`g4quL3rTNGr)#x>6~+2o}SGJ&j--PAU8BJ z%jCe;N5JcV|3DP3+*x;Ixg1%92VSK|Zev@P$&o{Niok!E()_P&>C5H76*d8X2FQVR z0gc=;Ir0Dn|l*Kw_J`g!UKM_$L0d1WpZGPAmBa0e`u=HA2ltP zqXK*g_+3B_d2ZT{$T7FEwQ~WAg1`MIaqtGf0;UXa-7y@@2py9y~84@CdAm)}f zF1DUBuuA{~^KNeKX-#%7Ma%;hc_0OUZh?ja2?eSBB!nG9tVjqyf|v(bTe`ToTSH!w zCk4>V6T!V0i_#G)FArd%#q`iS}q)3PuhIEpU z?HKZogeYOiI0=!#knbc!7(vX*=Vw6lau^RI90Gt*#E?}aWDADCn|q*|c2 zMInHI+5rgE`HdQKPPdXmK@=r-EJJjEL&U8eoV{e>2!^g?33zx6@^@nj5OUuzw|4h9 z>gj0j;JpZuK9I#&5M>*f3%NiB1aq@qs`;BrR5H2~q!tT^YDp)1=~{YPx_V)r zh+-(R-wt=5B@rSn(Co>+y5LuPM>l)Sjp(w$JUty#jW>TS=!y5z1X+ZC4Hea&E zWsYrYn=k#2fE-}|qP{irrN8T#|9)7~{P&Y7<^krmo}R8=prlBrEI>1`0m(3j7vG>X zGRTO#TRBPaBSuPYtCXCKjO=E4)J^^`B`GN@E6dL>EibioD*{^3@5S@sSh;1KOq|j0 zF=4A+`o0X^a6K^wmzhfqJ;u12e$ykD0vzq zfe7D{cV`F(gGJmP_&T!0sNhsomcEZcFBne)ocNa*eimJerSm7^g$F;)1HN{+000KA zMpRfp`j))kK^)HbtHA<52rdGE0l{#8lLvqN76&}{;6eZxxZ?PmJh&F+0t*2ZxEKHi z4i0~l2S<$qfX5V0_Q1d*`X_n4fQK4R_`v*=yfKizRe*<@w8Z--c`Ja7Gk_ia%Jkb18 z`qF{N2Efy_3+4N#{8ECptiK!Rp4CSA;Dr6x`Tz|u>3UYpNzw@aAlW z^1-h1H+dUC`eXsm;ln5&Y-fLyrvdOsfae#9@1Nvt0`i2-LHaEIwLI|Bfx8cQa!7pt zRDMqZUn$@@Z3zfqKv({2`e1$wNIZ}an!n{2{z5nd_-JiV9#&xeEx!=}&jCD&q{YiW zrOyMj7j?js?|{m~+RKvp7y8VC$JzyL*R%0Qk34`+&gj z;J&?TI;z_0`vv%6u}^{L40yC~;3yR^I~7d9Oy%iiYUANzdDK+R-OtU%-O|R(bTau| z4F66CPj^>a{zWvv#nDPkN?b-<+7uh4!8K~zSaJNY`>X&9;s=g!DURCOj@F*;Uha0@ z{2TN)^6&HT24}+pz%0qX6Krxig0&@*9=I^&z%j5I!966z0NJGFz^Y}qm7_h$j|cb} z{}#r|)6&s~GD>gMJXY@|bZ_~V&nMRxgC$s>+3V5JdODdBz zKnsxQQa}rlXlu|7L`ZZ!Xu_f-8h!-)8Ss6A{mfdy6x^VJH7uLo87#~;@{xERd%B(`Zc2$zcX0om`X{SI=WfA_}JJ2Qe0A8N?vlal(?j+ zkF}?_DLCs1+M2k-|6P(b_#hETgzIat;x_mCZ_4z;k|}gRl3(1@a=)#mr?msW62FkG zqX$0(4zP+ov93%K?F7LZ>^8pH@<-OMkB#Pa`l5|&8< zfD9sf>;GOfh-)(vmz4B>Au?3de0B-xE0)dJNPw;@Xu+^gjoZsA4(5YffQGLz zL|i(FqQ}8G1in%bag`*B9%yw$H+6})HzbN4nTz03mx%ig{zHl$2iFMj%?VuEL88#B z#Efw(S598cI8y4Lp7cgPt40TVT=nwXX6iy)Lk!|wR#c`t+XT#6&5u2^J-g2o&)(%i zZEdZ@{QV0fZPZhKH^sv&j(Z1HE!sVg*xzg(By7`cquete%GlzZPk;M+dj1xd_?#Ub z&q}&g=1T9sb9p80W7?_);I~#+UN9#EY=B zPeg=fAK}X{puRm=ku1~p=)=utH2$0CaLm!^beFl}nckK#I-L+xa;3fEViSuuwH}_) zb9T0}bm4g=X&b78vzi{iMD23yHhy*04DBhy$IM@9yRvL`M+(_KJ}Qq4JX7?ukGIEa zx7h2Ip95RZ+3s!oamX@9`=wsKf;X--bwIMDP4#x4R_CQxO0JKaZ~d6*XmuKK-1)Q1 zZL`K1`^=_C7O%a;DAk5|2{Pt;>F+%YWbD~?gi80GD#dyh7GilAKf|+i`3{D;q3-;2 zZFWV;gO)Fu=6VmuKkM2k5Z{!Qm)=>&sg!GUk}*$Q(X^~E)1|nQKjhJPL2g9?!$1Kc zp(Wc}UbFqXYW_hmFWAENq zG&eU<9=)@?kh48H%i=?7N5}EF<{OWzUv1T&?%OwIU(#%ESen*DoxgpLY|gINqKvQh zuBLzZRf`~N5kRS0Ghxwpu+KhyBHB&rXt|@txm?SJRUvkzDJ|~nWCtAdFZnS%CukB& zia00)B!sCBmMa!N*+4AIxnP_pO6inqdS{`tTB@-rKk|ClCf*0VCRx=siNe#?W7krh zeCXp`Deh9!UE40pG#YA8 zUpKL>r8R8FK-<)8ZjXao$ZNhA9OWlXgp0nu^~-Yi(=6l~Hl{t};l#X9uSjiYO2o4+ zT(>>%_`qtmb-~$Ez0rlke}F#aQww9~fe=ca>Rf`nrLg^-ZyXj)+M15LyZzjhwVawC zyfN ze6i86_dtbxm!NonUG5_-%f}R}9n3C@x{Jt_6Z39FGt{i^qcV<~pb!JY2vCbDdHEBQ z<)*82dc`!ZkGVaZX3mdT-`;ZF=29wC_ZjJvXwl@2b~rL9RW6qcd&!dLgZ$bt_!r4Q!m#E9b4|0?yh# z8)L_t?z5(L>H5yBWF1Az_(jo;|LI;wmc#89s)IM}k9ck)3^wnfY}0IE44uDCpYOaS zKmGfToOqY+l4l+FOXpOiU%9+f?=$sz)4|x7(X3=7+$DKmuNSBAv{Ns*qREnDZQe}2 zLGEM0#^Os?AC=u^-azr_x;fPu+FFLLoNVHVkc4|+_#ubAtW}o083lG?O1^JYWANQa zsN-AsODEb{M2=*KMo<^z^Cedd-v02YO~#+**-d8L+~&)4>CtbQ;<-*ZF_zG}Dv8C~ zxLg^wHpM$T>&@`ESXzbJO1_%5!s)nBUm9PHzkTc!?M&4d=EsJ%SzWbkg(JF=<&Qr8 zEIJct)x+Dj^0nCRbFG1&f3)qj)y}azq>!)oGPM-v-Buzwpw)L?LiJubk%i?M1AmyI zL;gB`_t4xTyEeL)mV?QMd*_%oc0G&FYKj-A>rBrx%2nbN&tp7USZ1nNS?rQI{wRb$ zp(3|{P%yyYo!ye~v0YO>sm1RhWw-E3uQwba@2rVz7i|C0pvzVw!x9>YB9pOp*0>}V0QAb zqgJeE#S=}>+g@LowR+%a>AcX&;nJv{LOV?#)*~~A)f6J`q8Ias<#II)(Kn2#`c{ikOhm!{ zuc2sfd(QV|eZBVGheo60I($uMMcb1EPsgRHz0K+9PMR4nomEa*Y3QHmDLtwr+nPzO zS75(qmV2#7a^Sj*+J5Vp8=-f5XhkN5-S-8mh(1s_wzpwYcF3lH@f7|_5N}YkMgZ4p zVr!w9WM0e5%abx^GOrly=vSVj>^8ba)cv_i+d1(>xUh6n74N}({Swv#?7_ZLy)XK% z$A5kFqbO{B_(GY=z?R7oZLfyt4gIe5&(aJs@4Kv~B#7`^+ll{B`0h|?mV7g6Mslzq z?w}t_XP%U3R`U-#?&D=<$5&qydu#uiBaDK@L?Y9`V%O6rwG10W=AHNM&Z>UL9Cn32^FfP2AL-_iOkvuU<-Kz~+-ZL%ZsR zPl+*Rh@RRLv-kZgSz7ArjPBM4RBE5I9lLRtcal=Vq`_J%HmrWAvn(@MZS{yH1%EW< zQ`hww(FQ6n9}4&7jPO3{6x3z)w{`aA{rW=sXV%w)R|86Z%5Doz+`rYNy79Qh?R$A* z3{=w`&K8zg5+~P3?iw7geY+=PK1}><6u18Kg5z@3KRV-8DzoNW?Pho`nZ+G7XHn?j z7B$P=q%!5~bnG%yitP3q!;FU>`(*H}lZiQ|GS|~GQ8Ao<_WEU!udgz-q5G?*H1VU%TnI>vNI=WdpVUT zjd9FVM|#Qa5qNXNL%nFA1Apk&xSf()O5=qMiRs_gvoId96m??Hu&XH#Ht0~ zpNW1!W%Bf^m9mMha38O;YH_FVhn2Cs=RLAqSs1<=_&IJ{-CG;LUz9o$HoxOxS;Bf- z&Gy>YmWAHT7R6}9c4w`YN@O*YJQOy)|S;OM*o;M9d$6_ zq8GO~;XWwVQF)Ui`*w((c-IrN-KESd{VR5hhWoybs=0El;MTOk4@NVVN~f*tt7UHK z^B<^+cb#|ZHAo<8PxgK!HWZz&3S;39FY{ARd+|ZO|Lb{EkrLt0F2Smo7lf(&ig>Nq zymTANwm9F1uO_%d!2_LB)Op@_!wgaf7#&86qs}U?Aihc36RE5f%6o&ZCuwJ|_v)2F zn-ag>vuAnMzdc4&?lMQv#g~_pchW2FSfO8%^7x0+SNqg5_N))GBHyzLo{DixUXNDI z3N$(|{BBie8vey`enU6ml>8!B(a6tRG8~1jiER&moY|wx?t5Bz?^nC2ArDFYvdNav zugAt3AN*kAq6s=wVm@E&66?H9;@N23tc7c=$<}eNb6$4ZwW7lhSx;Ha<-G1+ZM#Oh zc8kUfp@E4#o~nfnF_(X;Ja}`faxallV^#XW+SwC{y7t>@nnFjN3|eqos(m@K zC(iU6uOy}4!ux$ct1>wQ1p~^z`*aNlTwxOE)H)nsm>$vE{7WQKk7vH}wLoFKaixXS zo69whrrzv#>PHP1wCI8jo|_9Y?Jb*8uL~*X)wFcXtCFi9Q*GznmT=D5W|dp%i)&l? zF7dp6+Iwa2R2V1qL5W!1uYRmKYm36gtlrWz=I=Url>=NwQ)O~iJ(56w$MoL0sfB5V z6&qx4y!3ZlyXj%wodAa9_3_7<7Cr4;6l&C2O1>b_!4pgr_i`$q5WPjiPg<#XDPdVM^Ycxz|t3!2sYC7Rlw zWW`0P>#GUXP`(e`IV>sn^i_cSE``k6mo7}#b)vhB-|df}u+Bc5G4y`^vn`d#qfd$! z{cc@_yFZ*~XLWF`>H9Su9Dba|P<&Qn#@GLrpwj0AM_Vud^5vGbS`y1Z+z5y`>rt^g9O990}nq1@d-7_Y2K3V|0H0uv*2dfMNejv$0Fy8R)o+^WOYX{ z+Q(4Hh&?^k{N0i=+(`bkZS*&`?=K!+;95n^u2XdQ;(fQ3d>4eYlRZ8UatrI0UVR+y zvLk6~bM*<~B(;s9PaZeuNALT>)zQe=cw)Dz%lc=jB_rnBX0!WxCAf^voKxv?G9l_8 zVBOzRQ2YHrzwOO7iX6M6eFMsKN?Wd+aK7BQ5TSb7yO8*1=HMG2Pr?bY>9^_cY>tnX z3|`yDW>uf8HLzh9-jRdCXk?~+(*34y`h?02*#F-a=ud<=w^3R3gngv$Oeem#{5}|3 z8pvcrFaDO{fga~L7h(4NlTbD{ug-b;qjNl?jTxUK*u=OUZk_nbWtu8J_i?H!QO-{^ z;N-f;Ya)s37L<(YlluGk0}Y}Y*{7%Fzo?~jT)8T|%~!&^m2I7|^yfI*o>-k|Igi;l zuOuI7m^Cx8=j66tIHYe|St#rN$)K~Vv?!laVgG>~hth2voLW68>bEO`YW5v&h)q$b zs!;9r8-GxA&spsdk9@|4!6C0_`i0jr&P(}f$y;9)m(lib4CT9$dFX1;-cJn|gtYQ( zp8On+ytCHAQsatrv_KM%dyS}0@Qtreom5m3LM=R^ici+|9elUisDdJssB3p;U3NID z-{GO>Q+bpDsU|MHZ!)7CqIXQ>)21^Kj5VF;ywf5pgm;fvrKHlfP4D&JB!2N~Lg29< zn%`qrO{E_{{v#|oS-Z_+K1M%*M;PbhedbavQJdN&OqMl0q9Wba-}GKtZ@+q4c@P?oWa`J1eUnez_p_Vgq~Krt2CT z)D+}GTteUtA$I| z+_npk)uJ@!Oc@$e-xsw@p~&Tzg8`G^r_zZ_rTZh3FXT9FtTdyY(I_0*!G7p!@zY>` zh6MLj%{-w$>~)-yT`eMycT3ywQ0GO@XAN6kV!wLD`(}eb#|iBV-=6UW#nnh%^YpRy zVo4vmI<=wzZ@&Eifvs#ZaL`mkoT!|b z{%FQDAN4n$NgI)bRiW3Oei`3dNMMK_8gtukO?`eyYGibRkCxs@`@O^I2F3{Ks{?cO z>Iz(eob3TOVz(!9)-)~fj!Uh{sOSy!mEW9H>D>LrhFy%kMWfo6xpKpmq6>AOb4!KU zs6IXOc;z4%>!$F$Sv+O8Wc+lRzPk6`+|R_puE3oG!35>f0o}iv4W9o&(nLB|B6j_pU>ADuwsGuaHL2I{T>Zo13O~ zpK@22pc=LGF-X7H+WcKQRlI19>aNnwAb{c*eB+V~YdjDvB@136l;^yUu;rB5Inx zIL}ji{duPaH}~K`pRt76pu`pw+VOIE{|Fz7Q zfCvxeH%y8k8#|ol0D(n{mpIaqJH~h zxV~I!ZQajic;=ZZ`%d>-^X>D)JToSi@eiw{yKU_Ay)R!9xzdqR z&IN&0F~^Pu*KExZRvSNg>(m1+3MvuScmv1R%FP04_opmf>3xS}W7eh3%ijFZaIQE5 zC!!=_lI7+S!!fdc?DR96^#VHmfsc4o3)dw0p1x+fWuHQKHhapM={{=aqST8L-yNjW zkISV0P?}{5yrkcg*>Uxlh<^3kqpWnAzl?p_d%4TKjFN^%=zGQYMG<*l?Ag`f{QP;; zRPuQZL$1dPPqv0nSyvG5&5fy8nme=2NnF&Ej#$y|xI*Rf&HTEa-u3UVuRLk7N@ul< zQD|A-xq|JUjX_tx>=7oU(T?961GQM->N~ zQZ#)h-<@mnv+vXr65<(4osw{~%^7?;AX}lI?c+Tot4wRh5mZwdI~Q+UUA+INI?sdp z_vW@P7TwBUW#Yf+=CwvtUyRvdvx1%bmx^J_p}JFVU*oGp0>jjg47XDktLSUjws1uQV2KME@7_Y`82r#sWDi}_f`24OX|7o8 z)(?f%#{^l`CCx)@y)LdB_|{mFokz(nJABRY*=@r{owW=Hd9CU`Cu}USEOzp!Q~D%o z=9bz2W5mDpsDvU{UwXw(^&daaybCOxIbu4qy|dfHM*ED+!%^l$s;#}RUS2mcy+ldR zclc)10RhQO&XLO^aXAb}n~vW5MWwZ2tH#Obit5+wV<%a2oar7KozsGhSiD$jYh;4_tFEAAs#GbB5u+VRf! zJ#WgoAPu3L-BI?Zc28}hnow{z@Ua|iZoQW-o+|zQF4bJo_vD*OLGq5r%`#SQdCl1C z8*wFcnn_A0`)O{F&Aycd>v_(PrzUO`?k_1Z&e+Bq`@ucD-sQtuyoCI8MtJ!Fi^tK&+U3)s!6$9~oY zk9d7E4cnR5{SOKw0=~#Fy;1fM*V&B?cl++a}*`bayJw{P6t9 zr>BP*Z||F}9p(W8K;mPAwOX7%BVJ_7)n6BN(czA|!zj9O@X0_$yf9|iU&tSL-2y>{BSTVdapGb!xZ z%+!6;5*Jg8(xn}~|45fP9>_GSl-Z+yN#xkoj-zj@^?zy7vG%t67#n$&bJLFuB}MHM z@7?o)m-yVdV^{K2)N?LFjq_WdC_JvPo(dnEyGL*~w^X?(F~_zdLRwE{g=2eN{>{tp z*Z1~VoLqTbX0^_$ys}Uu&+P^0zFZAzOd|;IS$lh&7B3gOGc48^*G|Nr*3Yc33psA# zPWdWhli`lZ^rk_@(Mey;6u+i(?}W5E?Ni5iglyd;rUsr4=49(v$jZ)m`*7IND#upV z1XUZy&#C|1U;MuQ0gr`?t+~usWBA#p4ZD7SQv8$Jwn zY@*vE!V&4e5G$5jT3z^It2(RTG20Mx$$@njy|ODBzsYh_<~?(~HmuWVc$@bi!`g(; zbymfeB^#CMJe=IjL_dxE=+Bfm+UlR)$EEl~eP>1ByE8vckIWQycW$3Kqiy5CJo-?k zcPmw*(e;&ZR* zuJzBu(jt<1<{7z)W#M-jxC#A&w^VJ;As@qftcdBI)PvtG-!lc4hQ1Z2x8c-#z%WbT z8fOcAa(=$k%Z+F5DE;S*#!+rDwurAMZaIjjnsQZ5eVh~ZlS_QO?qt9^V&s~7Bc%oY zzW$`fD1$)x>1pw?Eh_Em+^;~HU+R!^K#P-O+imrfo_#ez6)CX|hgB=86dsKGb*nkwE6R}P zIpj4oxZzr%{xe^x^BGsI<+c2^WyG)Wg@P&LQ09e(PkU|hw1gsue?GCaSbHa0`ih1- zPm(~ej%bb3)2}x|6I4`+qdY7Q_SK%OFk1aimzYVBz3z_PVL#UJys76yCaD3GnQwYs zc0@ZwrPJn5Xc`lk(!A-Mb_-WTrlwep?453-y(qrP|5#wc)!6TvKaQtQtx692aonR# zJ2^o=X5I%U%oB3rl(&o6=1XB2Bi|h7%sI|<9`v*ieHRx+P@b~VJHzt6;i)d|)#KR% ze5tLB+AF2UtoaNGQg;hS3c+^LQ1#}?1Upl{r%h#FbQt?q@sue4kj^${x1cHcHT=4Z zHP2=1Glz@2gcSttJ}+Hp5d5@Tq`Gpaj@X4S59`=Byx5>|eN(Tzf|```x!c|2dUcyC z-V3+Kj_**YF-dJw53AbFDarr9dHAHNyskw?MHGeFxZ=CpHB#YPvEgYl*hAIj6b%1OumN2G;o zvW;~2@#s8i9?RjZ`72l1FZnmz^uC~df+L9U*|%#_HE~|xny;%v=`6m5Yo_N+!kr>jF8sZ(1=3L&g};CdIOu;2nX5+11HOf;u@xJ(-W1MzKiuuw5>0}fdSwn zZtqqq{qJ2p(G+*3-{kFjW$Y*-N88uXA>95@-rHKIb-H}hwiMbI^?mnmuZvox)<~=q z<~KT0SLJssRearx9gkC4_(iAEs@R7wzx|QNk7JddxB6wVCxlN&_5CEzH|kXhA~s*1 zUJE4@ZXF*Rie{j;-tRUdHFTbqZ({Vlwh=vJ!)b?stI`n)>h*K&oPk{1V{ZgB)o>^75iqlfeS%qk8V8Fm*F z-zw-vZ97!aceco$;Q8!~-s25co!nYcp${`$GHy49%&ic2Jn?dGn3#X2hyI%<$v7t= zpRhuWgf{%0W8aB27t_lGj*DBU#0GXC@Bf_x!H2x_sHaj5!tRbZFb*i6jVexhLtLSy z9JzR7G5vT@awv$#rFh<4Vx4pBY~AQHlUP@ab6(?HYqjmX zSRW3H=FC}~vR&Q(dP}YLngO8~8mgXqCN9S`6ux<&@{_o?@>cpP4aO6*wFkG^>n4td zHr4EEHE>Fn>X2?{Haki&-m~^biOCsXqwXec+OZ7@A6-1;OFwpfI_z}vmc`q8uTz#6 zn%dqg(#YCdtKFT-jN5bMizM$i)AtL0l$ljO_XP+Ba(4NAFK4q?7C+b~9X)OqvKR1{u+sjlQQm5`{smWU}SCz-x zt~%y?E@4}#+bSErt=C>Wea&;})ZmrggVda1Uv*<8*5s*i6|IYYu zwl&54`=JaGD%;N%ik}`8cDePlpZ~DC#?^r}c=}hLA03B506?F=(nDI*m+6Ef6GdaZtJ)ThLbDaYgEMFk2T|(ktSX@ z8yZ@I-+VV8-PKd9v+Zu65{KZzNNX-M&Q%Mu$u*s zO_)7b6rC5znxG4@XN>3;lc9+D-hAq*Q8=Y#wC!p67vI^wt>U`yutdm1W)splZ9zWswvM(BJ|8=;i?mkhH`fUB|HuDjQ z-oET}XNMa%M}%XAD=SC`)@L`nSp|jTY!pXL8T(u@6l4 zSleHlu`cvRjI{`D&)t3Q!xIlgRRSCK9#gOxlAXk#Vk`hZ|6Sn<&}c4fC9ZDClQff= zy!_JOO6Hk4<^CPljJhdT{nRC%NOab2k`@lnKge5kfVD(l$~Tz(df$uQACJDqhp!JS z8c-=)&>orGvLU*`>sh^P|NTsZGy>&n7dvZyk?#sW#FNb`9VBO>ZXS#)7|iQr@oUZ! zl{(IC_ha>Ovoia)V%I3bI9_K;n6NzEWnr+9q4vpM=lPI#)mgj4Zbve2nN8u)O-|HZ zknKoF&>MeqY~`MPYdk&Zvb&XP+DfTI(*=ERy-?F0uo?&2s?I994Zlp954oFGvI#eO zWVd~jT)Q$+Cd)|Dhi@{dBH)U~Tw-g#)33blO?teShc^dgrtBK(IVpB(xbBo_2IKp^ zF?*Fim_8|y zWjVMja{ZpSwd3Mp^BMZwQD^0j7d(&e{6RgRRjI-=W7m2#&g@c$0*iUBnJBmOl*%Ti z%g3Br6S$I(#uvVZ2~L9otYsF>^my&4lVjw6fLL zr+vb@CdI1GyemHlcY2)Xjb&hQ&2scJ_*&b$dRuA{f549Uu#xo%We?BDOxlhgXb?P1 z*RP=H)*X1U?sCCYO6DZXAko?D%EwX3Q@)=*!@u*O`96PonYI{%f zheN|xG^aAm1TM#{E^pk!*PZTR3th#vcY-ohn&w$*g9tI>4{*Ht!lw zOfcyE*gL6xzNmr7&k|Op?pGEr|KUZN>G`kypM^_AE~^H+_)!TjuvzgIl{M&ky}IuV zzs^D1W(r;KvGoy~v6hr-oc)_2{-|l-k|c8ho16!jCUV}u2d%--9SUri&PZUx&;Iv-hX%Qz1yV$u zDG3AWkVzB~`LYH2(j)g2qkL@`A1F_=5#U0;15yL_;=P09$e}O%iU}GRDKvi;EFCCl zQJg07`3%Z|hJlHOVb?DfEb@&E5QORi0+(oeTK~&3g`BHFaI&%;RF4EK1=OIo1j2+t zPFS{h9I8wdH=;;^1zO2}Fzgn{E<)ET(&3*OBKVqkQclALxlnCR6 zv7%RkAvbGD0*GwL<+rp_bHMeN&|L^@N?=1Z6fm(n!Gl&Rq|i!*6g}<)$(M)=AyM?m z-S{Y9CWf_Qe4QA!7t|2Sr%R&faiH=SeApL!SUvzYT*zbE&`KW)vl^g;O_z+ws56+= zz$U2$9(GVzs2Y&Jw~`IO7aCX~(EQm-;Jsfmf3y-9h5#O6@IW<8s5yzW67c1#tCgdh zEz$*H4Ir%r-UI&6%0ysq#aN{=R$8)TQY(N34Ov$pQbElvvi_~Xu;a9`whce+VPGRL zFtd}J(FTBUEa8A30x?js0(Dc&)MOs`0TB^Po4W^SIp{6p=(n$IpylX*OC)tz|6O}@ zK(3mEQNVkfXWgns1?zM&GSBLpN-xyTOCDR7jyM6;kxLvm{?4 zE}BHqCf^Mia38uZ4RAumcaJ0%Gg;p7)=y7mJL9rMTg=$bjF<8bZ zA1L;aG1|z33{We|!JiS@452M27y^NUPA_Vi%E%$Jn*EVgK-m+JUL9dJYghrOU~g-K z$f}Tje8^Lrw@S!6zR0?A2+J%)@+1KQ7y8+oE=p%XW;V3Jn=`Vh`BU@9$fuFjTi{|C zD0OC5s~&w5dGKeXHbbP@Ec5+l{Lbd@AZB7cKwu)wW_^+mN7k7mdRFv+KsXPeH;ltp za2h;ha}yA-1uSg^)W8jEN)SBo;+>`bl`t!aFS@dH{llM#R52=TEAX@W!`}h%husBT zHJ4Ms>s5YV+`%-#G+YM{90yRdyp@p#Jy_w$vTSjhMIu3h{do~A8(2y%PPg!DTLub2 z1_~OYEYR6bK}8ehHCXx<%0~Gon1qd1zbZTH=@qwGiKqIEc zNdrX|I$({&hJ?if$CyVj2x#8Sgh>A!oVAWp*)yIGhCzKADAtN$ z6Bzax!xk`%0LDBtUJDXM#MxjNm;oZyS^nYe2DWwB4*&j61Mek)hTQ7@oPvcxVafh6 zIKnU>ZscZA@}&TOt_ID)E5QF|Ir!JN4A`z==ODj2k+bu+w_@0p{`IAe_ofSmsQor7GqOW!%3fzAcX4qT!TOb_fAq|Wvn*sGVg)d7tz3m}Cq3m^p= z9{7)9aJvV^3NWk~!@4o755p!f>@$WrfEq^SxsWL2%{gR@A1a3k?e?LOsYGURu)F}e z=~%ushb(Y1pPB(}^J@*kn~S-Cuv4b0Y6K`2uasd31#)rl#`t%SUOa#PJi?6O+k1nm zkCZZBovX*{)PF+n2%pIapIM-}jxZbY5g!r60yWN^hJ!%lcT{&=qz^;nYMHJ`4N4iH z$=!ff=HMhyWf!T#Afr7CqKVKRi_~EWsb!bZo{6MHqKr`g$y`t!q5UD^U_Wy~1BOmU zs*iyXkqpSEJrO{z&miVG8>#*QdXh!VMAlS&U|}w3f;P-g)hJga`z5&gkYNvnGhSq^ z40{snEPzj@9&*;AoRMZ@B+jZ&TqI^0_I$`H1(r!Z{g4q6O$q?m{t#V5;*a#1gwm(~ znhsEQm~W?&GAXPu={xp!B-6wgBmMP>J>(fW7Kzyq5+cy%EyjTsu*Xn$d_99Vjq#Ie7FfuxCk?P6FSO@CXntVB+JmMOdLX{27K*_?`~|3>Kf2=G2PmkR zj33zK@Fx&|)CF5qJDA(W{#b#)G{LxGG;os}HKfx8xIh9o(9Z6O--s`vNW?i4 z7S|d`ei5F<9fd!4_0iW6NrbDOz>d2~fYRB4^z{hVMW6!fiYo*zpotm2X8otX z1VD{L@Z|)q>48cd!hT#GMKM7Dyf~pRDUzT9z(NCb-xQ#5g94LGF7TymB&cdc2Psha z3yv332Jl4+HbI~pkU#@UoEP^9{}%rR$4W>gz1V;mAMrP%Fu_IR1^$vVQ=m7Mg<=p# z&K+DD`XFJfT%5g-_a*o~>ViN_*!xxh;ywaYO`-}u;ldu?6$sTzLY0i3i2nt`Zk*&2 zb(Apal86kLbYyP8g#kA?O6V_z_`|jFSwzN4#0}rsdJ#8#heXv-1|#m%gvBI-MkS2} ze~NfR#ha*3QuMM~2CQTbApTqw61aIpgB5N>97g=p{>b5Cl135##T?#7+&qXpn8OE%JPt%2tmt6G z|BoC>f_)6MfMD|nTWS>4xMCb0W9MmSL52Tud#|1op&+f_Te@G;H zWwSC!1P$2Oq5)$s4cOvB#lW{iewYW6SsW?hmJA!%l7U4He@%yFx(+=5hu=|Sko=%A z!FdfDxOaA%gnI(5<8ZF?1~we8pnAcTz&-}t+`tY7Hk?GlfxQXX5x`ahb`-Gnft?R* zOJGB7=dj^HE$49DtOa&3u~3I#jS55o zEZC+9&H!or0&F-gQ-XBC?G|ca!#aX)VbBtwdjqg(fh|sQZw59!aKknS{cTD9j=*LB zZWodp`wLR^xE_)(5%-ov(F0A(Xb2(>jyEWuJcdDi zZYTz~zfgH_`wPY3n=gvN?JpFAn_eiEh+$Iy|XdJIGY#75nV%S#ieX6@29?*Uq5T8H+A!=Dh7DpE)Q_Qt^dnj-a##iu1ulKVFdhus zfMJ_3OcTTQV3;9>nP8YbhB;$c5{BKturds*!myth239(xG;5G3B2Ej#>@ds;!){?% zI);s6*aU|8gP|Rk1`!uXqLAIU$b(?}>7RFG>XE$~WJ`;=V2LBL+N_2dDOWT0#}EVFi;K4evnlL7&Ooinm>1g9{}u6{irYuXs*c53~)L`4SW|vZofr#f#Fhr z$!Z2J5CSV*C}v5-Q~ETLEkaHCi%i6Y|e zVAv#v&0rYZwm(Q4SzYykt7?F}_XeB;v;ZOPhDFvx=Lm2jwf(0P)Hhrc5WzzYijYjf z^#h8*+@jRq>RSW&LPIX>KkFMV^QHedPzb}o`c?xET>78}t8a5~+48@xa}}_Dr2%id z^f*EANQ38pUgt~mNv?ByP`5B2PQcy)Y_R4ChIw)YHk|+A-UM3bkV5MmQuN5nE{cVd z_~?BV@E;vIs54)x^!zjkNjBu3O-lk`Yli89 z>>6KvQ42EgC3vBoX4tiBEKd>JHdjqhufGr2?Y+%E(1tS&G2B92u)eb3i z)eb3oj!QWn^uzMfd+OcW?(}M z+P);3?0+BW5YQI~b_v1s37)0lzasuupPVCGW-TGCiSJn)1KdP>F#@%#JI25y)w_R&>H z|3g5E&wfOt@W* z%CrKu2$qJWr)ne+enn7ii>GSPF#mk2Mjipd|-s7z~%>b8L&lw4LWTwto%w~2Lrnr*r$M918i8S+TcM4D@dV(6{Ju# z@+kI>#7B?lSwOLG7)FCfr4VsM5(QRO7`7h6wqw{%3^TznxG90g>yBY?Qv$_KU|0x- zC1Y4BhSgwL9fq}HSSN;Yf?kd01D?M@<5-VjaPttw;E!)8-yRGz!7y_S0~=u^z7rT0 ziDB?`4k|AL!yaN-35Hc*7(W<=(0GMN6ev@Ys&4xbbNbYRan7*ZhL4v!RC^?h4~>G4 z>7*wGa+FWYz4NWiR!?tS;OvMrtMPRN*BWweNK_x$xY3V zd}7a~zI=FYT<{=LI$Lu*5w&8U#zRxnRp5FRM_NX`eE$t*a4x%dW#9Uhi z^Ms-NoBXw#zR27-p}Og)xCe8MS+b1t#$&nquX(ZzTP%u;ujya&xa?hP)%hZStx40v zpI6p@d`FdMX3Ja!F6(~pbT`1HiQ?>g9x2MT@0A9eiq+dncTNkXoi~l27$11PF9b9& z#Qg76Q$s~t=t74a*HRT*px|)?yam|{vzM!;MpgsBe+1VCcSA{r-2I^qWubEh4mcMP zI0M18+#-SuUR+BNHORApj4V~M1sA>qJUIueKeDR8;TbFdmncky3o-&8!f>>JX1QWf z==1NCL&FJzfDZ(6;Hw-oBqgRxlz!0xlz<0G1p^mQ)Y<$IthD}24@@np*pCrV(9nSt zfiy3X17rAia^ToSz>fj(WI4oTa-a_Z4+mD5iuGPM+?J;Yt~>~MxZom}592a9aIPod zZ<6G=u9pIZ@n^o^piRI-Ra~Ngf`)mS9Jq)j;NhwShF0C$YOq`mTm%3)fPtJZ)@5>F zjtF?TQ7;Xs8+qQ9%jLj{7?d-p5-&hOvtpT?l>jB+mBD}5{{Eltt^~TO>Rg|j8$!Gn zxHlLkWw;DdH54;32q-ZUZ~#P+p)y=!5+nji$N<<^-?|~BC0?UQ^;tWpPid>Z=TlcL zXxmk}Mj<#opS7*SvVuePL0hp7h^TqrxBtEOJ-I_vz}2p|*E;9l=i9^CXP@*MA?T;$fH999i1i386#?B1e{e0vBoDr{P?K!+)W&d+E+11$1K zjSNzV``FGAaPfLR*6wlg7Oeb!eMpwF#!tkON7o@*F2Ln0epD9Siwe!!HR^eGM-m>@ zS`6IW;}G2gK!?6Nz#s(UYgEIwzf7Mpu4rv)#0g93>guZ+8q5)r_Wa1np>D>UA33== zKVKYpeq@dl#QBl^z;mXLpX&U`-w2PybJmx9ek5j*oC68|(w!f93rm~JD1R9gj z2nr#`izugID1=g`4-QM<=PAlhm~Y}r72oN=+nIQmNfjT3^bYt7Ghr}HX1e(HX+O#% zZmHtifcX57lP$UtkuE-pw_cEgA?Z*$>GJOdIGheYpECfAjW6MRP_jUT^3Y{Ug83!x zf=#E*xW1d^U(t*9n?9};T26a73jHV=ZtfOsY9bFJ12z5OR?r%y}=7+TvuCNS+_#@ z<^mrcJ1yaPc%S>7D#R!RS7!mPPzf-xtw2LVPVPer<>bI_NBOB?CDy)Vlb~m8`d0Wli4{V@c$`FQ=N6i z+U4A%KEpG9))fXJ7efE~sxB;&k7i++d|O$c_Od?n%mPlVNk^&`{e{Ur}WP z#XZG0VCZj0^~Ez^YLaL_25IMLK06D8Txwbr1O8043NU+!S(!QjAazO`RdVWa;5)y8 zt>=(J{K~aS*{`gnYiSM>#>g4H85UEI`o`?l2D3kAEi+$l*1s@=b@uvIbj(Hq{GJ@W z1cqBh=q$+v#5Yn}#y>peyprJ=G?(nW(tJmT(Jlq$e_sH~k6?7YoekQCnR0FOIc#Rr zRc2ag^Qk7YVE<$N?X&*a7#4plZsPAliwy)P3dXq{@kiB0!7i}ajTXDvV)t9@7ZxkY zFkxqCo0{EU*wr)`B~Lb|h-RfPckBeEFL&eMN+Um6Dh~csbB$H5areY>*9&PnBca?e zPKIYY%v4BR+oj80;qfVWXt=Bl5D9h^@TvA?Xlk!TNPaP2{ z*xlNn&v{nc{Lb?hd);Dxw%Fe-_L0Q~Ax|Z~leNv~%(B>p7UN*H_*-wWTP^kzi|w%3 zuPwF`r9{F~E0H$6K5jDRu7jvSa~HLK)R^7+N?_B=aEzAqY26vv#KvrNGFII9TCT}< z0-GMi^Hq~q;_jgE?C&Z0eS zWiPfZ>uj6zbjy=nSnt_q>L=0Nfmx3M&ilA^PgCEP&%2_#6!3K3!J<9X&T?8m3Y5j> z@ntIB=!@J5=ar`HXxWR=IZq$>CD-tmy^x1@c&w+E$1{s|wj9Aa{};o{qaAAf-@{li z)`iJ;&Kq*dh9W%6xg7UXapiIr#0e?etGJI;Hol+YbrUXQJjmL~cray*?OpaB>6bM! zf3Mqp51zA?E15}}3~qOhA7-kSlf=WEbi1#GJ4-JOg?-Ik?{QVqGM6Tk!8p#_*^6Ic;;{LlCtp(rv?~ zl8M3-Kbq_Rq2%=@UZ#T{b&l&R?xOU5fF$^A*lK zX7bl7d?7{$XKVlN4GhMjg3nOXxjFbm`j?mGf#0$rud`Jh&FwhuCKeXBgsSJ838{h<~!DG4Ve{5dJpc6oE2Au?YD=0D}vJG?!=+8i>fyO}30(}N_I_Qg_C7^GDo&)+< z&{EJ3K}Uif(a+3GHkf2ql{T4GrOoHOu3h~Os};d0ZN%Rv77KX{Hb&cgSYTwZVvEhN z*m)LPV=>Adc}J_o+AQ{<#eQkAJr;Y$VpQRl^c}Vs=S>A0p>48nfnaA?Y^wD)-C~?e z6@M35jDv@QHCk-5#jdm19TwYWv4<_j;ZerobKbTXhe8EAWU(U_djMra-usZYN%J_0 z%IVqI|MrXi!TW4%|B&b|?~}22`n2rq>y5SS>6*H0d7v~F-yv}Z-f0Y*Av7o~%CK&s z-CQFDw(f~d;@-&PMAbUR$?z=XC!yGgv2{afZBq@mO*DF3@zO`h74K#axAN2^&dB6! z#5ma11LWY3KNH)l^*XtaH!HqI=?e8G#!9iqz5xf!_{^$9Qq~uOEP0c)_!}u>OjnQZ zVV8~XAB8KPa@%Dq0c?!P+g<=rmX*2OktSg|=olbZfbx&>nfX-#$}%|?moy1!lO`c; zvcaEV_i2AV>QAT;ekW$JE{kDCRk`|{fVTOa6D_vVVpPVGcgRS`KZ>VbL&_63RCDu` z8S8U(vlLIE%|WiBNOjlLUxll_D)02%H8H%x6s6!5cco@{g^V{27tIpz0-rIa85se( z9F#l~1|^St1DEg!ZNek8`KbJ-T>Vu4Q#POTsKq)g_O`_iSnQC+SVu^FCEyHs2PL>* z;1M+vhHwBy5VmZZreQn8}sh|bmaRly?$@oln;LY+aI5O z%MH_he)@pCu|AJ^ZaR`%ziEMg{uwWy-n{=;L!158LMc~I8jG+9aUuz-0zY%DWn2d6ytYH~a$C_i=ZfCjQM*-7#ElpiBB z=dGWF8P&w}_>~`WO<#!y+{tfsEAOy?dp$kJ!_Zz2=Q~Y2eUjqA>*0qbh^eS6n+--y zOb@%uUJvIvO+5WnJmJc!6|2iJ)2573qhS7sF^G{LnT|m)U8+n!i?I5p$+Ad+0O*pL zP-knzXOTG?>0=R8HQF$gTZxRR5VaS2c;uV=uXEr-%xX>P2carfu4;f<0u9?=Ue9J_ zci+B?2lM@9XcbaRLa8OhZIJC2Ep%DkxHKuPH`5w0F`r*k-57SJPY<7463(A6=iIsH zoj2p6nI#3&i;Jcg7nV5Xm8+}jiwcb@MCgljAtp^Ko)A)ox)A-8E<_`K{uupfsdOP` zm`pOCpF$U68rYK?rnyat6D)O?db(YX>wXqDmr?#)C7(_#NdXkO!Ma}a;5pS?egqDq z;O9;TfMLl=r5nH+Ac&%O8jBxHy7+E_LlOM!W<)SO#Ww*(a4w4>Oi%GGhM&Laf|D*j zHgPUPQ5?de29qwnV#w9e@Uw^w6_`_SrTX5r_!oOlR9@^YRsKm<0C|JYO#RO5{Wx}Tonuh%pD-8B&CIugFt zSF9|r4>y82T*?M?Y=k4my=rRV$eVx;QlOC+FbTmMQ%94gJ~+r(9I@@UFr0JNC@N%^m`WG zb!e^QyrJ;nw^VjCe{k`p&!)|~_r9O`4~xFR_rU_kpl@J)LIvZftFOJXzI;t+MfK{c zhR~@SCQm$V>H6xL%G&h}p;gt54ND91msZzQtZu5Tf^~fU_<}R@iwnl*FKw!*Z(NE& zs_L36$FDs0m?~=Ps}N&&P1Tx;x~szt$1~3LHkn7OH1N-%Ur`id`i%yJRb;R_3P<~O zR=Xl?)K(#)pzyfqiI|riOWukmhl$Ci@_6LP7esCIES@7uCb9OTjtFNF*{n*XBSIN* zoODFu=V!1UNZkk46)ohOn2C5lB?y!E9xe{lB<|s*+Qo1q_25&)G;7fTscQz*6w>41 zS>kS6>E}+&EbW&+LxcVL#9c!~yx-1Bi6WAc#sW?Ehm zNBXN9L7A7$pv+@Pb=_a3P5P^}$=YPWzNh{9ocpxR&()GDtk3zQ#a^-4Jp3gId#Sdm z;aE{q=r$-4T-L!q7Q&U9A#}^Z4vHi)#7Mj#aZHS1`0?y+d6O7|tzmUo1_v;h)!65m z?cAP^8A$LPUsJ1_kSZRIUNBcVxx?mB!cN|Xsp&wkOqv?x8hsV) zO^dx_{c$);!g8cl{9)|u>tK@6ctPU!|86G9SvtYm0HoqEv73|Lz+i(4mNhBI-cO8hOCy(E@&6dUv!nT^1Uvsvs_3%bE5!)Zkd(QiZ_O)Gk3v#``YwjW*C_NNz z-$>h8uXlNzB`5D`-bYJwEZ}r?d7o@POtb{au*>*kzAhO&b2dcoraU}JTYOV zG}FX)b2f!?N=#x=2`85nGs84Ng~(AeOq7e2>X|$AO9ji16B8edPAGP=r5>fyxyom@ z4J_YAPy)LJ@CkCZ2G>wCC{3ZdQ!(OPHT%VPXLZA5LSM#^g7!6T;Z3DTn-7>?ro5*N z#wbP88rj>hKOSTrV?G))Mx(2~Y7HWk$vpILVNOM+WZ)`Qstac+Y-9Hb<6A_wDCbc& z9~;zjP(A0uj)`xWGm|Qkc-q;_IHrn(B4UGjjob{s@)fH!-l|1J6qL!j4sOh=o~VM!Bgip8j?DcD?#HCgOxi*Yty{Iy$*%3y;1yTv$H zFBs?QY4bTTi#=hny%u}ZVxLq*i0ZCDD8~x3u3>B z*pg)(R1$Cfs42UBre}E=&n-uS4bxj+X$%CmXSJ{Mcssp^TMl@d-qUjQLB^mYbfEOT zLvKSoV@spGnR$J#q*6PO;@^QQy3>erJzg`MmndPhxKe{fE^tKXG*o`F;F_j>8d08Ww*V7FLdS zQhKv$qHZOPac{6jx-C#xDb1 zfafsiLeL6OxT&gcF=#!Wmx68uT?UHkPQ`Z{XgQvDf?ff-3lw1^&w*BfQagDC=p~?6 zf>P401f>F5H7F~mHJ~?wqInp(1GElwIQVugDECrDOCnMT+6c;B>+wq?tTfhx&IjE9 z%Dq)l9Y<Uhp-kwoncC)aI8Q9` zQT0v2n$13bbl3N`%y{>WCw?>f;E|WMu6V+3>T&H4hInSa{m80IFKIscKmN4v>5jHh z|22Q$>*o1j=EEmV%^UWw58QTB+lQ;ROnvC2nH#U(9jj~^({JnOw%f}8K7Msm?&r^J zL1rrR_070*2Clnt&%LpPq}*h~HSb1A{YBeT@FiYP1o=$4N|SEJojp@{bN0Tqu3c>I znR}L0uZOd3CZ2RN?mfrDk+kmdq?>VPGnnal|2s>cPfib0;q`EK?G)H((#^OV8C3Yv z;z`NzP%_H)6yz@&nQ;%Bu}&bF4riumnBz3@*=s%hhYHB}2`L}cfi_5yMmP(O%>=?& r5L;QjPC)u`&t79n5$S;}Nib!2HfiE?v`(HGR7nE3MnAz%*zx@zGje$i literal 331624 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