diff --git a/src/OpenSHC/Audio/mss/SoundSystem.func.hpp b/src/OpenSHC/Audio/mss/SoundSystem.func.hpp index 9ddf9d5..cfb77d9 100644 --- a/src/OpenSHC/Audio/mss/SoundSystem.func.hpp +++ b/src/OpenSHC/Audio/mss/SoundSystem.func.hpp @@ -22,14 +22,14 @@ namespace Audio { meth_0x424700; MACRO_FUNCTION_RESOLVER( - void (SoundSystem::*)(), false, Address::SHC_3BB0A8C1_0x00467810, &SoundSystem::stopMusicPlayback) + void (SoundSystem::*)(), true, Address::SHC_3BB0A8C1_0x00467810, &SoundSystem::stopMusicPlayback) stopMusicPlayback; MACRO_FUNCTION_RESOLVER( void (SoundSystem::*)(), false, Address::SHC_3BB0A8C1_0x00467830, &SoundSystem::endSoundStreamsUnk) endSoundStreamsUnk; - MACRO_FUNCTION_RESOLVER(void (SoundSystem::*)(SHC_SoundStreamInt), false, Address::SHC_3BB0A8C1_0x004799A0, + MACRO_FUNCTION_RESOLVER(void (SoundSystem::*)(SHC_SoundStreamInt), true, Address::SHC_3BB0A8C1_0x004799A0, &SoundSystem::endSoundStream) endSoundStream; diff --git a/src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp b/src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp new file mode 100644 index 0000000..965bdf2 --- /dev/null +++ b/src/OpenSHC/Audio/mss/SoundSystem/endSoundStream.cpp @@ -0,0 +1,68 @@ +#include "OpenSHC/Audio/MSS/SoundSystem.hpp" + +#include "OpenSHC/Audio/MSS/enums/AILStatus.hpp" +#include "OpenSHC/Audio/MSS/enums/SHC_SoundStream.hpp" + +#include "OpenSHC/OS.func.hpp" + +#include "OpenSHC/Globals/DAT_00df3844.hpp" + +// TODO: +// - DAT_00df3844 did not exist before and is therefore wrongly sorted into the status file +// - "UnkSoundFlagsAndLoopCount" plays not nice with any number-like operation, the more likely thing therefore are +// either a union, which allows to access the different parts separately, but this would likely compile to WORD +// operations, or a bitfield, maybe like this: +// int loopCount : 16; +// int reserved : 13; +// int unknownFlag1 : 1; +// int unknownFlag2 : 1; +// int uninterruptable : 1; // ? +// In a test in the current file it compiled to "& 0x80000000" properly when using the specific field, but no idea if +// this works for multifield checks or assigns + +namespace OpenSHC { +namespace Audio { + namespace MSS { + + // FUNCTION: STRONGHOLDCRUSADER 0x004799A0 + void SoundSystem::endSoundStream(SHC_SoundStreamInt sndStreamIndex) + { + if (!this->waveOutOpenUnk_0x8) { + return; + } + + if (sndStreamIndex == enums::SND_STR_MUSIC) { + this->streamActiveUnk_0x20[0] = 0; + *DAT_00df3844::ptr = 1; + if (this->musicSampleFileHandleUnk_0x174 != -1) { + AIL_end_sample(this->musicSampleUnk_0x170); + MACRO_CALL(OS_Func::_ucrt_close)(this->musicSampleFileHandleUnk_0x174); + } + if (this->musicFileHandle_0x178 != -1) { + MACRO_CALL(OS_Func::_ucrt_close)(this->musicFileHandle_0x178); + } + this->musicFileHandle_0x178 = -1; + this->musicSampleFileHandleUnk_0x174 = -1; + this->mbr_0x188 = 1; + *DAT_00df3844::ptr = 0; + this->sec_Section1055_0x3274 = 0; + return; + } + + if (!this->streamActiveUnk_0x20[sndStreamIndex]) { + return; + } + + // flag seems to indicate an "uninterruptable" stream; if it is set, a playing stream can not be ended + if ((*reinterpret_cast(&this->streamFlagsUnkAndLoopCount_0x34[sndStreamIndex]) & 0x80000000) + && (AIL_stream_status(this->stream_0xc[sndStreamIndex]) == SMP_PLAYING)) { + return; + } + AIL_close_stream(this->stream_0xc[sndStreamIndex]); + this->streamActiveUnk_0x20[sndStreamIndex] = 0; + this->stream_0xc[sndStreamIndex] = 0x0; + } + + } +} +} diff --git a/src/OpenSHC/Audio/mss/SoundSystem/stopMusicPlayback.cpp b/src/OpenSHC/Audio/mss/SoundSystem/stopMusicPlayback.cpp new file mode 100644 index 0000000..2288312 --- /dev/null +++ b/src/OpenSHC/Audio/mss/SoundSystem/stopMusicPlayback.cpp @@ -0,0 +1,20 @@ +#include "OpenSHC/Audio/MSS/SoundSystem.hpp" + +#include "OpenSHC/Audio/MSS/SoundSystem.func.hpp" +#include "OpenSHC/Audio/MSS/enums/SHC_SoundStream.hpp" + +namespace OpenSHC { +namespace Audio { + namespace MSS { + + // FUNCTION: STRONGHOLDCRUSADER 0x00467810 + void SoundSystem::stopMusicPlayback() + { + MACRO_CALL_MEMBER(OpenSHC::Audio::MSS::SoundSystem_Func::endSoundStream, this)(enums::SND_STR_MUSIC); + this->mbr_0x154 = 0; + this->sec_Section1055_0x3274 = 0; + } + + } +} +} diff --git a/src/OpenSHC/Globals/DAT_00df3844.hpp b/src/OpenSHC/Globals/DAT_00df3844.hpp new file mode 100644 index 0000000..b938028 --- /dev/null +++ b/src/OpenSHC/Globals/DAT_00df3844.hpp @@ -0,0 +1,14 @@ +/** + THIS FILE IS AUTO GENERATED + Communicate changes to the dev team (e.g. via a Pull Request). + Changes get lost otherwise. + + path: 'OpenSHC/Globals/DAT_00df3844.hpp' +*/ + +#pragma once + +namespace OpenSHC { + +MACRO_STRUCT_RESOLVER(undefined4, false, Address::SHC_3BB0A8C1_0x00df3844) DAT_00df3844; +} // namespace OpenSHC diff --git a/src/OpenSHC/OS.func.hpp b/src/OpenSHC/OS.func.hpp index cbc1ef3..1524ce0 100644 --- a/src/OpenSHC/OS.func.hpp +++ b/src/OpenSHC/OS.func.hpp @@ -12,7 +12,6 @@ #include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" #include "OpenSHC/WindowsHelper/Enums/OpenFlagInt.hpp" #include "crtdefs.h" -#include "fileapi.h" #include "guiddef.h" #include "mbstring.h" #include "time.h" @@ -31,9 +30,13 @@ namespace OS_Func { Address::SHC_3BB0A8C1_0x0047C5D0, &OpenSHC::OS::isEqualGUID) isEqualGUID; - MACRO_FUNCTION_RESOLVER(tm*(__cdecl*)(__time32_t * _Time), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057F5FE, - &OpenSHC::OS::__localtime64) - __localtime64; + MACRO_FUNCTION_RESOLVER( + int(__cdecl*)(double _X), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057ECF1, &OpenSHC::OS::__isnan) + __isnan; + + MACRO_FUNCTION_RESOLVER( + tm*(__cdecl*)(time_t* _Time), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057F5FE, &OpenSHC::OS::_localtime) + _localtime; MACRO_FUNCTION_RESOLVER(__time64_t(__cdecl*)(__time64_t* _Time), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057F622, &OpenSHC::OS::__time64) @@ -43,7 +46,7 @@ namespace OS_Func { Address::SHC_3BB0A8C1_0x0057F660, &OpenSHC::OS::_memset) _memset; - MACRO_FUNCTION_RESOLVER(int(__cdecl*)(char* _Dest, char* _Format), REIMPLEMENTED_CRT, + MACRO_FUNCTION_RESOLVER(int(__cdecl*)(char* _Dest, char* _Format, ...), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057F6DA, &OpenSHC::OS::_sprintf) _sprintf; @@ -59,9 +62,9 @@ namespace OS_Func { void(__cdecl*)(void* _Memory), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057FA74, &OpenSHC::OS::_free) _free; - MACRO_FUNCTION_RESOLVER( - int(__cdecl*)(int _C), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057FC19, &OpenSHC::OS::_tolower) - _tolower; + // MACRO_FUNCTION_RESOLVER( + // int(__cdecl*)(int _C), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057FC19, &OpenSHC::OS::_tolower) + //_tolower; MACRO_FUNCTION_RESOLVER( int(__cdecl*)(FILE* _File), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0057FCB2, &OpenSHC::OS::_fclose) @@ -107,17 +110,17 @@ namespace OS_Func { Address::SHC_3BB0A8C1_0x00580B69, &OpenSHC::OS::__wcsicmp) __wcsicmp; - MACRO_FUNCTION_RESOLVER( - void(__cdecl*)(void* _Memory), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x00580DC1, &OpenSHC::OS::_free) - _free; + // MACRO_FUNCTION_RESOLVER( + // void(__cdecl*)(void* _Memory), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x00580DC1, &OpenSHC::OS::_free) + //_free; MACRO_FUNCTION_RESOLVER(errno_t(__cdecl*)(void* _Dst, rsize_t _DstSize, void* _Src, rsize_t _MaxCount), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x00580DC6, &OpenSHC::OS::_memcpy_s) _memcpy_s; - MACRO_FUNCTION_RESOLVER( - void(__cdecl*)(void* _Memory), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x00580E9C, &OpenSHC::OS::_free) - _free; + // MACRO_FUNCTION_RESOLVER( + // void(__cdecl*)(void* _Memory), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x00580E9C, &OpenSHC::OS::_free) + //_free; MACRO_FUNCTION_RESOLVER(int(__cdecl*)(int fileDescriptor), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x00580F38, &OpenSHC::OS::_ucrt_close) @@ -146,18 +149,14 @@ namespace OS_Func { Address::SHC_3BB0A8C1_0x00582050, &OpenSHC::OS::_memcpy) _memcpy; - MACRO_FUNCTION_RESOLVER( - int(__cdecl*)(int _C), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x005824CD, &OpenSHC::OS::_toupper) - _toupper; + // MACRO_FUNCTION_RESOLVER( + // int(__cdecl*)(int _C), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x005824CD, &OpenSHC::OS::_toupper) + //_toupper; MACRO_FUNCTION_RESOLVER(int(__cdecl*)(int fileDescriptor, long lDistanceToMove, DWORD moveMethod), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x0058277E, &OpenSHC::OS::_ucrt_lseek) _ucrt_lseek; - MACRO_FUNCTION_RESOLVER( - undefined4(__stdcall*)(), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x005834A0, &OpenSHC::OS::__alloca_probe) - __alloca_probe; - MACRO_FUNCTION_RESOLVER(int(__cdecl*)(char* _Str1, char* _Str2, size_t _MaxCount), REIMPLEMENTED_CRT, Address::SHC_3BB0A8C1_0x005835BB, &OpenSHC::OS::__strnicmp) __strnicmp; diff --git a/src/OpenSHC/OS.hpp b/src/OpenSHC/OS.hpp index 74cd3c7..40d6080 100644 --- a/src/OpenSHC/OS.hpp +++ b/src/OpenSHC/OS.hpp @@ -11,7 +11,6 @@ #include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" #include "OpenSHC/WindowsHelper/Enums/OpenFlagInt.hpp" #include "crtdefs.h" -#include "fileapi.h" #include "guiddef.h" #include "mbstring.h" #include "time.h" @@ -26,13 +25,15 @@ namespace OS { BOOLEnum __cdecl isEqualGUID(GUID* param_1, GUID* param_2); - tm* __cdecl __localtime64(__time32_t* _Time); + int __cdecl __isnan(double _X); + + tm* __cdecl _localtime(time_t* _Time); __time64_t __cdecl __time64(__time64_t* _Time); void* __cdecl _memset(void* _Dst, int _Val, size_t _Size); - int __cdecl _sprintf(char* _Dest, char* _Format); + int __cdecl _sprintf(char* _Dest, char* _Format, ...); int __cdecl __stricmp(char* _Str1, char* _Str2); @@ -40,7 +41,7 @@ namespace OS { void __cdecl _free(void* _Memory); - int __cdecl _tolower(int _C); + // int __cdecl _tolower(int _C); int __cdecl _fclose(FILE* _File); @@ -64,11 +65,11 @@ namespace OS { int __cdecl __wcsicmp(wchar_t* _Str1, wchar_t* _Str2); - void __cdecl _free(void* _Memory); + // void __cdecl _free(void* _Memory); errno_t __cdecl _memcpy_s(void* _Dst, rsize_t _DstSize, void* _Src, rsize_t _MaxCount); - void __cdecl _free(void* _Memory); + // void __cdecl _free(void* _Memory); int __cdecl _ucrt_close(int fileDescriptor); @@ -84,12 +85,10 @@ namespace OS { void* __cdecl _memcpy(void* _Dst, void* _Src, size_t _Size); - int __cdecl _toupper(int _C); + // int __cdecl _toupper(int _C); int __cdecl _ucrt_lseek(int fileDescriptor, long lDistanceToMove, DWORD moveMethod); - undefined4 __stdcall __alloca_probe(); - int __cdecl __strnicmp(char* _Str1, char* _Str2, size_t _MaxCount); void __cdecl _exit(int _Code); diff --git a/src/OpenSHC/OS/OS.cpp b/src/OpenSHC/OS/OS.cpp new file mode 100644 index 0000000..02755fb --- /dev/null +++ b/src/OpenSHC/OS/OS.cpp @@ -0,0 +1,146 @@ +// disable deprecation warnings, since we use the old calls on purpose +#pragma warning(disable : 4996) + +#include "OpenSHC/OS.hpp" + +#include "float.h" +#include "io.h" + +// NOTE: Activating them in DLL mode currently results in heap corruption + +namespace OpenSHC { +namespace OS { + + // STUB: STRONGHOLDCRUSADER 0x0047C5D0 + BOOLEnum isEqualGUID(GUID* param_1, GUID* param_2) + { + return static_cast(IsEqualGUID(*param_1, *param_2)); + } + + // STUB: STRONGHOLDCRUSADER 0x0057ECF1 + int __isnan(double _X) { return _isnan(_X); } + + // Very likely just default function call, using time64_t and localtime64 behind + // STUB: STRONGHOLDCRUSADER 0x0057F5FE + tm* _localtime(time_t* _Time) { return localtime(_Time); } + + // STUB: STRONGHOLDCRUSADER 0x0057F622 + __time64_t __time64(__time64_t* _Time) { return _time64(_Time); } + + // STUB: STRONGHOLDCRUSADER 0x0057F660 + void* _memset(void* _Dst, int _Val, size_t _Size) { return memset(_Dst, _Val, _Size); } + + // STUB: STRONGHOLDCRUSADER 0x0057F6DA + int _sprintf(char* _Dest, char* _Format, ...) + { + // needed for proxy + va_list args; + va_start(args, _Format); + int result = vsprintf(_Dest, _Format, args); + va_end(args); + return result; + } + + // STUB: STRONGHOLDCRUSADER 0x0057F8EE + int __stricmp(char* _Str1, char* _Str2) { return _stricmp(_Str1, _Str2); } + + // STUB: STRONGHOLDCRUSADER 0x0057FA62 + int _atexit(void* param_1) { return atexit(reinterpret_cast(param_1)); } + + // This seems to be the games main free function + // STUB: STRONGHOLDCRUSADER 0x0057FA74 + void __cdecl _free(void* _Memory) { free(_Memory); } + + // Used implicitly in character conversion pipeline (_tolower). Save if global locale never set. + // STUB: STRONGHOLDCRUSADER 0x0057FC19 + // int __cdecl _tolower(int _C); + + // STUB: STRONGHOLDCRUSADER 0x0057FCB2 + int _fclose(FILE* _File) { return fclose(_File); } + + // STUB: STRONGHOLDCRUSADER 0x0057FFCA + void _fread(void* dstBuffer, size_t elSize, size_t count, FILE* file) { fread(dstBuffer, elSize, count, file); } + + // STUB: STRONGHOLDCRUSADER 0x00580034 + void* _malloc(size_t _Size) { return malloc(_Size); } + + // STUB: STRONGHOLDCRUSADER 0x0058028F + long _ftell(FILE* _File) { return ftell(_File); } + + // STUB: STRONGHOLDCRUSADER 0x00580384 + int __cdecl _fseek(FILE* _File, long _Offset, DWORD _Origin) { return fseek(_File, _Offset, _Origin); } + + // STUB: STRONGHOLDCRUSADER 0x005804CD + FILE* _fopen(char* _Filename, char* _Mode) { return fopen(_Filename, _Mode); } + + // STUB: STRONGHOLDCRUSADER 0x00580577 + int __vswprintf(wchar_t* _Dest, wchar_t* _Format, va_list _Args) { return _vswprintf(_Dest, _Format, _Args); } + + // STUB: STRONGHOLDCRUSADER 0x00580735 + wint_t _fgetwc(FILE* _File) { return fgetwc(_File); } + + // STUB: STRONGHOLDCRUSADER 0x0058099B + size_t _fwrite(void* _Str, size_t _Size, size_t _Count, FILE* _File) { return fwrite(_Str, _Size, _Count, _File); } + + // STUB: STRONGHOLDCRUSADER 0x00580A1D + wchar_t* _wcsncpy(wchar_t* _Dest, wchar_t* _Source, size_t _Count) { return wcsncpy(_Dest, _Source, _Count); } + + // STUB: STRONGHOLDCRUSADER 0x00580B69 + int __wcsicmp(wchar_t* _Str1, wchar_t* _Str2) { return _wcsicmp(_Str1, _Str2); } + + // Only jumps to _free + // STUB: STRONGHOLDCRUSADER 0x00580DC1 + // void __cdecl _free(void* _Memory) { free(_Memory); } + + // STUB: STRONGHOLDCRUSADER 0x00580DC6 + errno_t _memcpy_s(void* _Dst, rsize_t _DstSize, void* _Src, rsize_t _MaxCount) + { + return memcpy_s(_Dst, _DstSize, _Src, _MaxCount); + } + + // Only jumps to _free + // STUB: STRONGHOLDCRUSADER 0x00580E9C + // void __cdecl _free(void* _Memory) { free(_Memory); } + + // STUB: STRONGHOLDCRUSADER 0x00580F38 + int _ucrt_close(int fileDescriptor) { return _close(fileDescriptor); } + + // STUB: STRONGHOLDCRUSADER 0x005815C6 + int _ucrt_read(int fileDescriptor, void* destination, size_t size) + { + return _read(fileDescriptor, destination, size); + } + + // STUB: STRONGHOLDCRUSADER 0x005816C3 + int _ucrt_open(char* _Filename, OpenFlagInt _OpenFlag, int _PMode) { return _open(_Filename, _OpenFlag, _PMode); } + + // STUB: STRONGHOLDCRUSADER 0x005816FB + int _rand() { return rand(); } + + // STUB: STRONGHOLDCRUSADER 0x005818EB + char* __strlwr(char* string) { return _strlwr(string); } + + // STUB: STRONGHOLDCRUSADER 0x00581F6F + undefined4 _ucrt_write(int fileDescriptor, void* src, uint size) { return _write(fileDescriptor, src, size); } + + // STUB: STRONGHOLDCRUSADER 0x00582050 + void* _memcpy(void* _Dst, void* _Src, size_t _Size) { return memcpy(_Dst, _Src, _Size); } + + // Used implicitly in character conversion pipeline (_toupper) Save if global locale never set. + // STUB: STRONGHOLDCRUSADER 0x005824CD + // int __cdecl _toupper(int _C); + + // STUB: STRONGHOLDCRUSADER 0x0058277E + int _ucrt_lseek(int fileDescriptor, long lDistanceToMove, DWORD moveMethod) + { + return _lseek(fileDescriptor, lDistanceToMove, moveMethod); + } + + // STUB: STRONGHOLDCRUSADER 0x005835BB + int __strnicmp(char* _Str1, char* _Str2, size_t _MaxCount) { return _strnicmp(_Str1, _Str2, _MaxCount); } + + // STUB: STRONGHOLDCRUSADER 0x00583D55 + void _exit(int _Code) { exit(_Code); } + +} +} diff --git a/src/precomp/addresses-SHC-3BB0A8C1.hpp b/src/precomp/addresses-SHC-3BB0A8C1.hpp index 657f0eb..2b4ecdd 100644 --- a/src/precomp/addresses-SHC-3BB0A8C1.hpp +++ b/src/precomp/addresses-SHC-3BB0A8C1.hpp @@ -98109,6 +98109,7 @@ enum { // location: // type: /byte[1708] SHC_3BB0A8C1_0x02490954 = 0x02490954, - + // type: /undefined4 + SHC_3BB0A8C1_0x00df3844 = 0x00df3844, }; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index f1a6853..ca283dd 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -9831,7 +9831,7 @@ SHC_3BB0A8C1_0x00467780 | 0.0% | Pending SHC_3BB0A8C1_0x00467790 | 0.0% | Pending SHC_3BB0A8C1_0x004677A0 | 0.0% | Pending SHC_3BB0A8C1_0x004677E0 | 0.0% | Pending -SHC_3BB0A8C1_0x00467810 | 0.0% | Pending +SHC_3BB0A8C1_0x00467810 | 100.0% | DONE SHC_3BB0A8C1_0x00467830 | 0.0% | Pending SHC_3BB0A8C1_0x00467850 | 0.0% | Pending SHC_3BB0A8C1_0x00467890 | 0.0% | Pending @@ -10880,7 +10880,7 @@ SHC_3BB0A8C1_0x00479369 | 0.0% | Pending SHC_3BB0A8C1_0x00479400 | 0.0% | Pending SHC_3BB0A8C1_0x00479540 | 0.0% | Pending SHC_3BB0A8C1_0x00479790 | 0.0% | Pending -SHC_3BB0A8C1_0x004799A0 | 0.0% | Pending +SHC_3BB0A8C1_0x004799A0 | 96.36% | "_close" is seen as unknown offset call by reccmp SHC_3BB0A8C1_0x00479A60 | 0.0% | Pending SHC_3BB0A8C1_0x00479AB0 | 0.0% | Pending SHC_3BB0A8C1_0x00479AF0 | 0.0% | Pending @@ -34649,9 +34649,19 @@ SHC_3BB0A8C1_0x0059E80C | 0.0% | Pending SHC_3BB0A8C1_0x0059E818 | 0.0% | Pending SHC_3BB0A8C1_0x0059E81C | 0.0% | Pending SHC_3BB0A8C1_0x0059E830 | 0.0% | Pending +SHC_3BB0A8C1_0x0059E840 | 0.0% | Pending +SHC_3BB0A8C1_0x0059E848 | 0.0% | Pending +SHC_3BB0A8C1_0x0059E850 | 0.0% | Pending +SHC_3BB0A8C1_0x0059E858 | 0.0% | Pending +SHC_3BB0A8C1_0x0059E860 | 0.0% | Pending SHC_3BB0A8C1_0x0059E868 | 0.0% | Pending +SHC_3BB0A8C1_0x0059E870 | 0.0% | Pending +SHC_3BB0A8C1_0x0059E878 | 0.0% | Pending +SHC_3BB0A8C1_0x0059E880 | 0.0% | Pending +SHC_3BB0A8C1_0x0059E888 | 0.0% | Pending +SHC_3BB0A8C1_0x0059E890 | 0.0% | Pending SHC_3BB0A8C1_0x0059E898 | 0.0% | Pending -SHC_3BB0A8C1_0x0059E89F | 0.0% | Pending +SHC_3BB0A8C1_0x0059E8A0 | 0.0% | Pending SHC_3BB0A8C1_0x0059E8B8 | 0.0% | Pending SHC_3BB0A8C1_0x0059E8D0 | 0.0% | Pending SHC_3BB0A8C1_0x0059E8E4 | 0.0% | Pending @@ -37892,6 +37902,7 @@ SHC_3BB0A8C1_0x005ACE38 | 0.0% | Pending SHC_3BB0A8C1_0x005ACE40 | 0.0% | Pending SHC_3BB0A8C1_0x005ACE48 | 0.0% | Pending SHC_3BB0A8C1_0x005ACE50 | 0.0% | Pending +SHC_3BB0A8C1_0x005ACE5A | 0.0% | Pending SHC_3BB0A8C1_0x005AE4A0 | 0.0% | Pending SHC_3BB0A8C1_0x005AE4A8 | 0.0% | Pending SHC_3BB0A8C1_0x005AE4B0 | 0.0% | Pending @@ -39969,76 +39980,23 @@ SHC_3BB0A8C1_0x005B3F68 | 0.0% | Pending SHC_3BB0A8C1_0x005B3F88 | 0.0% | Pending SHC_3BB0A8C1_0x005B3FA8 | 0.0% | Pending SHC_3BB0A8C1_0x005B3FC8 | 0.0% | Pending +SHC_3BB0A8C1_0x005B41AC | 0.0% | Pending +SHC_3BB0A8C1_0x005B41B0 | 0.0% | Pending +SHC_3BB0A8C1_0x005B41D0 | 0.0% | Pending SHC_3BB0A8C1_0x005B41D4 | 0.0% | Pending -SHC_3BB0A8C1_0x005B41D8 | 0.0% | Pending -SHC_3BB0A8C1_0x005B41DC | 0.0% | Pending -SHC_3BB0A8C1_0x005B41E0 | 0.0% | Pending -SHC_3BB0A8C1_0x005B41E4 | 0.0% | Pending SHC_3BB0A8C1_0x005B41E8 | 0.0% | Pending -SHC_3BB0A8C1_0x005B41EC | 0.0% | Pending -SHC_3BB0A8C1_0x005B41F0 | 0.0% | Pending -SHC_3BB0A8C1_0x005B41F4 | 0.0% | Pending -SHC_3BB0A8C1_0x005B41F8 | 0.0% | Pending SHC_3BB0A8C1_0x005B41FC | 0.0% | Pending -SHC_3BB0A8C1_0x005B4200 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4204 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4208 | 0.0% | Pending -SHC_3BB0A8C1_0x005B420C | 0.0% | Pending SHC_3BB0A8C1_0x005B4210 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4214 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4218 | 0.0% | Pending -SHC_3BB0A8C1_0x005B421C | 0.0% | Pending -SHC_3BB0A8C1_0x005B4220 | 0.0% | Pending SHC_3BB0A8C1_0x005B4224 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4228 | 0.0% | Pending -SHC_3BB0A8C1_0x005B422C | 0.0% | Pending -SHC_3BB0A8C1_0x005B4230 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4234 | 0.0% | Pending SHC_3BB0A8C1_0x005B4238 | 0.0% | Pending -SHC_3BB0A8C1_0x005B423C | 0.0% | Pending -SHC_3BB0A8C1_0x005B4240 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4244 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4248 | 0.0% | Pending SHC_3BB0A8C1_0x005B424C | 0.0% | Pending -SHC_3BB0A8C1_0x005B4250 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4254 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4258 | 0.0% | Pending -SHC_3BB0A8C1_0x005B425C | 0.0% | Pending SHC_3BB0A8C1_0x005B4260 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4264 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4268 | 0.0% | Pending -SHC_3BB0A8C1_0x005B426C | 0.0% | Pending -SHC_3BB0A8C1_0x005B4270 | 0.0% | Pending SHC_3BB0A8C1_0x005B4274 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4278 | 0.0% | Pending -SHC_3BB0A8C1_0x005B427C | 0.0% | Pending -SHC_3BB0A8C1_0x005B4280 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4284 | 0.0% | Pending SHC_3BB0A8C1_0x005B4288 | 0.0% | Pending -SHC_3BB0A8C1_0x005B428C | 0.0% | Pending -SHC_3BB0A8C1_0x005B4290 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4294 | 0.0% | Pending -SHC_3BB0A8C1_0x005B4298 | 0.0% | Pending SHC_3BB0A8C1_0x005B429C | 0.0% | Pending -SHC_3BB0A8C1_0x005B42A0 | 0.0% | Pending -SHC_3BB0A8C1_0x005B42A4 | 0.0% | Pending -SHC_3BB0A8C1_0x005B42A8 | 0.0% | Pending -SHC_3BB0A8C1_0x005B42AC | 0.0% | Pending SHC_3BB0A8C1_0x005B42B0 | 0.0% | Pending -SHC_3BB0A8C1_0x005B42B4 | 0.0% | Pending -SHC_3BB0A8C1_0x005B42B8 | 0.0% | Pending -SHC_3BB0A8C1_0x005B42BC | 0.0% | Pending -SHC_3BB0A8C1_0x005B42C0 | 0.0% | Pending SHC_3BB0A8C1_0x005B42C4 | 0.0% | Pending -SHC_3BB0A8C1_0x005B42C8 | 0.0% | Pending -SHC_3BB0A8C1_0x005B42CC | 0.0% | Pending -SHC_3BB0A8C1_0x005B42D0 | 0.0% | Pending -SHC_3BB0A8C1_0x005B42D4 | 0.0% | Pending SHC_3BB0A8C1_0x005B42D8 | 0.0% | Pending -SHC_3BB0A8C1_0x005B42DC | 0.0% | Pending -SHC_3BB0A8C1_0x005B42E0 | 0.0% | Pending -SHC_3BB0A8C1_0x005B42E4 | 0.0% | Pending -SHC_3BB0A8C1_0x005B42E8 | 0.0% | Pending SHC_3BB0A8C1_0x005B4300 | 0.0% | Pending SHC_3BB0A8C1_0x005B4304 | 0.0% | Pending SHC_3BB0A8C1_0x005B4308 | 0.0% | Pending @@ -41921,6 +41879,9 @@ SHC_3BB0A8C1_0x00ED311C | 0.0% | Pending SHC_3BB0A8C1_0x00ED3120 | 0.0% | Pending SHC_3BB0A8C1_0x00ED3124 | 0.0% | Pending SHC_3BB0A8C1_0x00ED3128 | 0.0% | Pending +SHC_3BB0A8C1_0x00ED312C | 0.0% | Pending +SHC_3BB0A8C1_0x00ED3138 | 0.0% | Pending +SHC_3BB0A8C1_0x00ED313C | 0.0% | Pending SHC_3BB0A8C1_0x00ED3144 | 0.0% | Pending SHC_3BB0A8C1_0x00ED3148 | 0.0% | Pending SHC_3BB0A8C1_0x00ED314C | 0.0% | Pending @@ -42982,3 +42943,4 @@ SHC_3BB0A8C1_0x02490916 | 0.0% | Pending SHC_3BB0A8C1_0x02490930 | 0.0% | Pending SHC_3BB0A8C1_0x02490936 | 0.0% | Pending SHC_3BB0A8C1_0x02490954 | 0.0% | Pending +SHC_3BB0A8C1_0x00df3844 | 0.0% | Pending