From ae846cb31dcc96626df8c22d22bb36616dbc4bcf Mon Sep 17 00:00:00 2001 From: banxian Date: Sun, 27 Mar 2022 00:43:16 +0800 Subject: [PATCH] first commit on b02 --- .gitignore | 20 + EDUReViver.sln | 20 + EDUReViver.suo | Bin 0 -> 31232 bytes EDUReViver/EDUReViver.vcxproj | 103 ++ EDUReViver/EDUReViver.vcxproj.filters | 57 + EDUReViver/addon_func.cpp | 241 +++ EDUReViver/addon_func.h | 26 + EDUReViver/aes.c | 452 +++++ EDUReViver/configstore.cpp | 837 +++++++++ EDUReViver/configstore.h | 22 + EDUReViver/crypto.h | 93 + EDUReViver/httpclient.cpp | 77 + EDUReViver/httpclient.h | 3 + EDUReViver/include/capstone/arm.h | 937 ++++++++++ EDUReViver/include/capstone/arm64.h | 1164 +++++++++++++ EDUReViver/include/capstone/capstone.h | 766 +++++++++ EDUReViver/include/capstone/evm.h | 188 +++ EDUReViver/include/capstone/m680x.h | 537 ++++++ EDUReViver/include/capstone/m68k.h | 610 +++++++ EDUReViver/include/capstone/mips.h | 956 +++++++++++ EDUReViver/include/capstone/platform.h | 122 ++ EDUReViver/include/capstone/ppc.h | 1463 ++++++++++++++++ EDUReViver/include/capstone/sparc.h | 520 ++++++ EDUReViver/include/capstone/systemz.h | 830 +++++++++ EDUReViver/include/capstone/tms320c64x.h | 359 ++++ EDUReViver/include/capstone/x86.h | 1972 ++++++++++++++++++++++ EDUReViver/include/capstone/xcore.h | 235 +++ EDUReViver/include/platform.h | 110 ++ EDUReViver/include/windowsce/intrin.h | 12 + EDUReViver/include/windowsce/stdint.h | 133 ++ EDUReViver/lib/capstone.lib | Bin 0 -> 2474554 bytes EDUReViver/lib/capstone_dll.lib | Bin 0 -> 5410 bytes EDUReViver/lib/capstone_dll_d.lib | Bin 0 -> 5410 bytes EDUReViver/main.cpp | 539 ++++++ EDUReViver/targetver.h | 24 + EDUReViver/usbconn.cpp | 469 +++++ EDUReViver/usbconn.h | 108 ++ Payloads/blinky.c | 93 + Payloads/revive.c | 118 ++ Payloads/swd.c | 118 ++ Payloads/to10.c | 122 ++ Payloads/to11.c | 122 ++ README.md | 60 + Target/VS2010/Release/Readme_cn.txt | 22 + Target/VS2010/Release/Readme_en.txt | 25 + Target/VS2010/Release/firmwarecfgs.lst | 2 + 46 files changed, 14687 insertions(+) create mode 100644 .gitignore create mode 100644 EDUReViver.sln create mode 100644 EDUReViver.suo create mode 100644 EDUReViver/EDUReViver.vcxproj create mode 100644 EDUReViver/EDUReViver.vcxproj.filters create mode 100644 EDUReViver/addon_func.cpp create mode 100644 EDUReViver/addon_func.h create mode 100644 EDUReViver/aes.c create mode 100644 EDUReViver/configstore.cpp create mode 100644 EDUReViver/configstore.h create mode 100644 EDUReViver/crypto.h create mode 100644 EDUReViver/httpclient.cpp create mode 100644 EDUReViver/httpclient.h create mode 100644 EDUReViver/include/capstone/arm.h create mode 100644 EDUReViver/include/capstone/arm64.h create mode 100644 EDUReViver/include/capstone/capstone.h create mode 100644 EDUReViver/include/capstone/evm.h create mode 100644 EDUReViver/include/capstone/m680x.h create mode 100644 EDUReViver/include/capstone/m68k.h create mode 100644 EDUReViver/include/capstone/mips.h create mode 100644 EDUReViver/include/capstone/platform.h create mode 100644 EDUReViver/include/capstone/ppc.h create mode 100644 EDUReViver/include/capstone/sparc.h create mode 100644 EDUReViver/include/capstone/systemz.h create mode 100644 EDUReViver/include/capstone/tms320c64x.h create mode 100644 EDUReViver/include/capstone/x86.h create mode 100644 EDUReViver/include/capstone/xcore.h create mode 100644 EDUReViver/include/platform.h create mode 100644 EDUReViver/include/windowsce/intrin.h create mode 100644 EDUReViver/include/windowsce/stdint.h create mode 100644 EDUReViver/lib/capstone.lib create mode 100644 EDUReViver/lib/capstone_dll.lib create mode 100644 EDUReViver/lib/capstone_dll_d.lib create mode 100644 EDUReViver/main.cpp create mode 100644 EDUReViver/targetver.h create mode 100644 EDUReViver/usbconn.cpp create mode 100644 EDUReViver/usbconn.h create mode 100644 Payloads/blinky.c create mode 100644 Payloads/revive.c create mode 100644 Payloads/swd.c create mode 100644 Payloads/to10.c create mode 100644 Payloads/to11.c create mode 100644 README.md create mode 100644 Target/VS2010/Release/Readme_cn.txt create mode 100644 Target/VS2010/Release/Readme_en.txt create mode 100644 Target/VS2010/Release/firmwarecfgs.lst diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d51b1de --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +bin/ +tmp/ +debug/ +release/ +Deleted/ +Shipping/ +__MACOSX/ +ipch/ +objfre_wxp_x86/ +Target/ +.DS_Store +thumb.db +BuildLog.htm +*.user +*.pro.user* +*.sdf +*.opensdf +*.txt +*.exe +buildfre_wxp_x86.* \ No newline at end of file diff --git a/EDUReViver.sln b/EDUReViver.sln new file mode 100644 index 0000000..e7d7c90 --- /dev/null +++ b/EDUReViver.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EDUReViver", "EDUReViver\EDUReViver.vcxproj", "{F9C11080-C18C-4D6D-AC7F-5A5A53FDF613}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F9C11080-C18C-4D6D-AC7F-5A5A53FDF613}.Debug|Win32.ActiveCfg = Debug|Win32 + {F9C11080-C18C-4D6D-AC7F-5A5A53FDF613}.Debug|Win32.Build.0 = Debug|Win32 + {F9C11080-C18C-4D6D-AC7F-5A5A53FDF613}.Release|Win32.ActiveCfg = Release|Win32 + {F9C11080-C18C-4D6D-AC7F-5A5A53FDF613}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/EDUReViver.suo b/EDUReViver.suo new file mode 100644 index 0000000000000000000000000000000000000000..3ea179512d4d1fe9a435c6dae0e0d3ebce461838 GIT binary patch literal 31232 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 G!2bdFMEHjQ literal 0 HcmV?d00001 diff --git a/EDUReViver/EDUReViver.vcxproj b/EDUReViver/EDUReViver.vcxproj new file mode 100644 index 0000000..748539f --- /dev/null +++ b/EDUReViver/EDUReViver.vcxproj @@ -0,0 +1,103 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {F9C11080-C18C-4D6D-AC7F-5A5A53FDF613} + Win32Proj + EDUReViver + + + + Application + true + Unicode + + + Application + false + true + Unicode + + + + + + + + + + + + + true + $(SolutionDir)Target\VS2010\$(Configuration)\ + tmp\$(Configuration)\ + $(ProjectName)_d + $(ProjectDir)include;$(ProjectDir);$(IncludePath) + $(ProjectDir)lib;$(LibraryPath) + + + false + $(SolutionDir)Target\VS2010\$(Configuration)\ + tmp\$(Configuration)\ + $(ProjectDir)include;$(IncludePath) + $(ProjectDir)lib;$(LibraryPath) + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + + + Console + true + setupapi.lib;winhttp.lib;capstone_dll_d.lib;%(AdditionalDependencies) + + + + + Level3 + MaxSpeed + true + true + DENYCLONE;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreaded + + + Console + true + true + true + setupapi.lib;winhttp.lib;capstone_dll.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/EDUReViver/EDUReViver.vcxproj.filters b/EDUReViver/EDUReViver.vcxproj.filters new file mode 100644 index 0000000..62d4ea5 --- /dev/null +++ b/EDUReViver/EDUReViver.vcxproj.filters @@ -0,0 +1,57 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/EDUReViver/addon_func.cpp b/EDUReViver/addon_func.cpp new file mode 100644 index 0000000..75624a6 --- /dev/null +++ b/EDUReViver/addon_func.cpp @@ -0,0 +1,241 @@ +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#include +#endif +#include "addon_func.h" + + +unsigned char QuadBit2Hex(unsigned char num) { + if (num < 10) { + return num + '0'; + } else { + return num + '7'; + } +} + +unsigned char Hex2QuadBit(unsigned char chr) { + if (chr >= 'a') { + chr -= 0x20; + } + if (chr < 'A') { + return chr - '0'; + } else { + return chr - '7'; + } +} + +// for printf +void uint2hex(unsigned long value, int mindigits, char* hex) { + char Buf[9]; + char* Dest; + + Dest = &Buf[8]; + *Dest = 0; + do { + Dest--; + *Dest = '0'; + if (value != 0) { + *Dest = QuadBit2Hex(value & 0xF); + value = value >> 4; + } + mindigits--; + } while (value != 0 || mindigits > 0); + // then copy it to output + while (Dest != &Buf[8]) { + // + *hex = *Dest; + hex++; + Dest++; + } +} + +//00004000: 00 00 00 00 00 00 00 00 02 00 BF D7 04 00 00 00 | ................ +//012345678 0 0 0 345 0 0 90 2 78 +void quickdump(unsigned int addr, const unsigned char *data, unsigned int amount) +{ + char line[80]; + const unsigned char* ptr = data; + int fullline = amount / 16; + int rowcount = fullline; + int last = amount % 16; + if (last) { + rowcount++; + } + line[8] = ':'; + line[9] = ' '; + line[34] = ' '; + line[59] = '|'; + line[60] = ' '; + line[77] = '\n'; + for (int y = 0; y < rowcount; y++) { + unsigned vaddr = ptr - data + addr; + for (int i = 8; i; i--) { + line[i - 1] = QuadBit2Hex(vaddr & 0xF); + vaddr >>= 4; + } + if (!last || y != rowcount - 1) { + // do full + unsigned pos = 10; + for (int x = 0; x < 16; x++, ptr++) { + unsigned char c = *ptr; + if (c == 0) { + *(unsigned short*)&line[pos] = '00'; + pos += 2; + } else if (c == 0xFF) { + *(unsigned short*)&line[pos] = 'FF'; + pos += 2; + } else { + line[pos++] = QuadBit2Hex(c >> 4); + line[pos++] = QuadBit2Hex(c & 0xF); + } + line[pos++] = ' '; + if (x == 7) { + pos++; + } + line[61 + x] = (c >= ' ' && c <= '~')?c:'.'; + } + fwrite((const unsigned char*)line, 1, 78, stdout); + } else { + unsigned pos = 10; + for (int x = 0; x < last; x++, ptr++) { + unsigned char c = *ptr; + line[pos++] = QuadBit2Hex(c >> 4); + line[pos++] = QuadBit2Hex(c & 0xF); + line[pos++] = ' '; + if (x == 7) { + pos++; + } + line[61 + x] = (c >= ' ' && c <= '~')?c:'.'; + } + while (pos < 59) { + line[pos++] = ' '; + } + line[61 + last] = '\n'; + fwrite((const unsigned char*)line, 1, 61 + last + 1, stdout); + } + + } +} + + +int readallcontent(const wchar_t* path, void** outptr) +{ + struct _stat64 st; + if (_wstat64(path, &st) == -1 || st.st_size == 0) { + return -1; + } + int fd = _wopen(path, O_RDONLY | O_BINARY); // O_BINARY not available in OSX + if (fd == -1) { + return -1; + } + void* newmem = malloc((size_t)st.st_size); // TODO: PAE + int readed = _read(fd, newmem, (size_t)st.st_size); + _close(fd); + *outptr = newmem; + return readed; +} + +int readpartcontent(const wchar_t* path, void** outptr, unsigned long long offset, unsigned size) +{ + struct _stat64 st; + if (_wstat64(path, &st) == -1 || st.st_size == 0) { + return -1; + } + int fd = _wopen(path, O_RDONLY | O_BINARY); // O_BINARY not available in OSX + if (fd == -1) { + return -1; + } + void* newmem = malloc(size); + if (offset) { + _lseek(fd, offset, SEEK_SET); + } + int readed = _read(fd, newmem, size); + _close(fd); + *outptr = newmem; + return readed; +} + +int savetofile(const wchar_t* path, void* data, size_t len) +{ + int fd = _wopen(path, O_CREAT | O_RDWR | O_BINARY, S_IREAD | S_IWRITE ); + if (fd == -1) { + printf("errno: %d, msg: %s\n", errno, strerror(errno)); + return -1; + } + int writed = _write(fd, data, len); + _close(fd); + return writed; +} + +bool ishex(char c) +{ + if (c >= '0' && c <= '9') + return true; + + if (c >= 'A' && c <= 'F') + return true; + + if (c >= 'a' && c <= 'f') + return true; + return false; +} + +void trimstr(char* str) +{ + // Left + char* curpos = str; + while (*curpos) { + char c1 = *curpos; + // [ ][ ]a + if (c1 != ' ' && c1 != '\t') { + memmove(str, curpos, strlen(curpos) + 1); + break; + } + curpos++; + } + // Right + curpos = str + strlen(str) - 1; + while (*curpos) { + char c1 = *curpos; + // b[ ][ ] + if (c1 != ' ' && c1 != '\t') { + *(curpos + 1) = 0; + break; + } + curpos--; + } +} + +bool setwin32filetime(const wchar_t* path, unsigned long long filetime) +{ +#ifdef _WIN32 + HANDLE hFile = CreateFileW(path, FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFile == INVALID_HANDLE_VALUE) { + return false; + } + BOOL ok = SetFileTime(hFile, NULL, NULL, (FILETIME*)&filetime); + CloseHandle(hFile); + return ok; +#endif +} + +int errprintf(_In_z_ _Printf_format_string_ const char * _Format, ...) { + HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); + CONSOLE_SCREEN_BUFFER_INFO info; + GetConsoleScreenBufferInfo(hCon, &info); + SetConsoleTextAttribute(hCon, FOREGROUND_RED); + va_list va; + va_start(va, _Format); + int len = vprintf(_Format, va); + va_end(va); + SetConsoleTextAttribute(hCon, info.wAttributes); + + return len; +} diff --git a/EDUReViver/addon_func.h b/EDUReViver/addon_func.h new file mode 100644 index 0000000..40fbaa2 --- /dev/null +++ b/EDUReViver/addon_func.h @@ -0,0 +1,26 @@ +#ifndef _ADDON_FUNC_H +#define _ADDON_FUNC_H + +#ifdef __cplusplus +extern "C" { +#endif + +unsigned char QuadBit2Hex(unsigned char num); +unsigned char Hex2QuadBit(unsigned char chr); + +void quickdump(unsigned int addr, const unsigned char *data, unsigned int amount); +int readallcontent(const wchar_t* path, void** outptr); +int readpartcontent(const wchar_t* path, void** outptr, unsigned long long offset, unsigned size); +int savetofile(const wchar_t* path, void* data, size_t len); + +bool ishex(char c); +void trimstr(char* str); + +bool setwin32filetime(const wchar_t* path, unsigned long long filetime); +int errprintf(_In_z_ _Printf_format_string_ const char * _Format, ...); + +#ifdef __cplusplus +}; +#endif + +#endif \ No newline at end of file diff --git a/EDUReViver/aes.c b/EDUReViver/aes.c new file mode 100644 index 0000000..078ee16 --- /dev/null +++ b/EDUReViver/aes.c @@ -0,0 +1,452 @@ +/* + * Copyright (c) 2007-2016, Cameron Rich + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the axTLS project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * AES implementation - this is a small code version. There are much faster + * versions around but they are much larger in size (i.e. they use large + * submix tables). + */ + +#include +#include +#include "crypto.h" + +#define rot1(x) (((x) << 24) | ((x) >> 8)) +#define rot2(x) (((x) << 16) | ((x) >> 16)) +#define rot3(x) (((x) << 8) | ((x) >> 24)) + +/* + * This cute trick does 4 'mul by two' at once. Stolen from + * Dr B. R. Gladman but I'm sure the u-(u>>7) is + * a standard graphics trick + * The key to this is that we need to xor with 0x1b if the top bit is set. + * a 1xxx xxxx 0xxx 0xxx First we mask the 7bit, + * b 1000 0000 0000 0000 then we shift right by 7 putting the 7bit in 0bit, + * c 0000 0001 0000 0000 we then subtract (c) from (b) + * d 0111 1111 0000 0000 and now we and with our mask + * e 0001 1011 0000 0000 + */ +#define mt 0x80808080 +#define ml 0x7f7f7f7f +#define mh 0xfefefefe +#define mm 0x1b1b1b1b +#define mul2(x,t) ((t)=((x)&mt), \ + ((((x)+(x))&mh)^(((t)-((t)>>7))&mm))) + +#define inv_mix_col(x,f2,f4,f8,f9) (\ + (f2)=mul2(x,f2), \ + (f4)=mul2(f2,f4), \ + (f8)=mul2(f4,f8), \ + (f9)=(x)^(f8), \ + (f8)=((f2)^(f4)^(f8)), \ + (f2)^=(f9), \ + (f4)^=(f9), \ + (f8)^=rot3(f2), \ + (f8)^=rot2(f4), \ + (f8)^rot1(f9)) + +/* + * AES S-box + */ +static const uint8_t aes_sbox[256] = +{ + 0x63,0x7C,0x77,0x7B,0xF2,0x6B,0x6F,0xC5, + 0x30,0x01,0x67,0x2B,0xFE,0xD7,0xAB,0x76, + 0xCA,0x82,0xC9,0x7D,0xFA,0x59,0x47,0xF0, + 0xAD,0xD4,0xA2,0xAF,0x9C,0xA4,0x72,0xC0, + 0xB7,0xFD,0x93,0x26,0x36,0x3F,0xF7,0xCC, + 0x34,0xA5,0xE5,0xF1,0x71,0xD8,0x31,0x15, + 0x04,0xC7,0x23,0xC3,0x18,0x96,0x05,0x9A, + 0x07,0x12,0x80,0xE2,0xEB,0x27,0xB2,0x75, + 0x09,0x83,0x2C,0x1A,0x1B,0x6E,0x5A,0xA0, + 0x52,0x3B,0xD6,0xB3,0x29,0xE3,0x2F,0x84, + 0x53,0xD1,0x00,0xED,0x20,0xFC,0xB1,0x5B, + 0x6A,0xCB,0xBE,0x39,0x4A,0x4C,0x58,0xCF, + 0xD0,0xEF,0xAA,0xFB,0x43,0x4D,0x33,0x85, + 0x45,0xF9,0x02,0x7F,0x50,0x3C,0x9F,0xA8, + 0x51,0xA3,0x40,0x8F,0x92,0x9D,0x38,0xF5, + 0xBC,0xB6,0xDA,0x21,0x10,0xFF,0xF3,0xD2, + 0xCD,0x0C,0x13,0xEC,0x5F,0x97,0x44,0x17, + 0xC4,0xA7,0x7E,0x3D,0x64,0x5D,0x19,0x73, + 0x60,0x81,0x4F,0xDC,0x22,0x2A,0x90,0x88, + 0x46,0xEE,0xB8,0x14,0xDE,0x5E,0x0B,0xDB, + 0xE0,0x32,0x3A,0x0A,0x49,0x06,0x24,0x5C, + 0xC2,0xD3,0xAC,0x62,0x91,0x95,0xE4,0x79, + 0xE7,0xC8,0x37,0x6D,0x8D,0xD5,0x4E,0xA9, + 0x6C,0x56,0xF4,0xEA,0x65,0x7A,0xAE,0x08, + 0xBA,0x78,0x25,0x2E,0x1C,0xA6,0xB4,0xC6, + 0xE8,0xDD,0x74,0x1F,0x4B,0xBD,0x8B,0x8A, + 0x70,0x3E,0xB5,0x66,0x48,0x03,0xF6,0x0E, + 0x61,0x35,0x57,0xB9,0x86,0xC1,0x1D,0x9E, + 0xE1,0xF8,0x98,0x11,0x69,0xD9,0x8E,0x94, + 0x9B,0x1E,0x87,0xE9,0xCE,0x55,0x28,0xDF, + 0x8C,0xA1,0x89,0x0D,0xBF,0xE6,0x42,0x68, + 0x41,0x99,0x2D,0x0F,0xB0,0x54,0xBB,0x16, +}; + +/* + * AES is-box + */ +static const uint8_t aes_isbox[256] = +{ + 0x52,0x09,0x6a,0xd5,0x30,0x36,0xa5,0x38, + 0xbf,0x40,0xa3,0x9e,0x81,0xf3,0xd7,0xfb, + 0x7c,0xe3,0x39,0x82,0x9b,0x2f,0xff,0x87, + 0x34,0x8e,0x43,0x44,0xc4,0xde,0xe9,0xcb, + 0x54,0x7b,0x94,0x32,0xa6,0xc2,0x23,0x3d, + 0xee,0x4c,0x95,0x0b,0x42,0xfa,0xc3,0x4e, + 0x08,0x2e,0xa1,0x66,0x28,0xd9,0x24,0xb2, + 0x76,0x5b,0xa2,0x49,0x6d,0x8b,0xd1,0x25, + 0x72,0xf8,0xf6,0x64,0x86,0x68,0x98,0x16, + 0xd4,0xa4,0x5c,0xcc,0x5d,0x65,0xb6,0x92, + 0x6c,0x70,0x48,0x50,0xfd,0xed,0xb9,0xda, + 0x5e,0x15,0x46,0x57,0xa7,0x8d,0x9d,0x84, + 0x90,0xd8,0xab,0x00,0x8c,0xbc,0xd3,0x0a, + 0xf7,0xe4,0x58,0x05,0xb8,0xb3,0x45,0x06, + 0xd0,0x2c,0x1e,0x8f,0xca,0x3f,0x0f,0x02, + 0xc1,0xaf,0xbd,0x03,0x01,0x13,0x8a,0x6b, + 0x3a,0x91,0x11,0x41,0x4f,0x67,0xdc,0xea, + 0x97,0xf2,0xcf,0xce,0xf0,0xb4,0xe6,0x73, + 0x96,0xac,0x74,0x22,0xe7,0xad,0x35,0x85, + 0xe2,0xf9,0x37,0xe8,0x1c,0x75,0xdf,0x6e, + 0x47,0xf1,0x1a,0x71,0x1d,0x29,0xc5,0x89, + 0x6f,0xb7,0x62,0x0e,0xaa,0x18,0xbe,0x1b, + 0xfc,0x56,0x3e,0x4b,0xc6,0xd2,0x79,0x20, + 0x9a,0xdb,0xc0,0xfe,0x78,0xcd,0x5a,0xf4, + 0x1f,0xdd,0xa8,0x33,0x88,0x07,0xc7,0x31, + 0xb1,0x12,0x10,0x59,0x27,0x80,0xec,0x5f, + 0x60,0x51,0x7f,0xa9,0x19,0xb5,0x4a,0x0d, + 0x2d,0xe5,0x7a,0x9f,0x93,0xc9,0x9c,0xef, + 0xa0,0xe0,0x3b,0x4d,0xae,0x2a,0xf5,0xb0, + 0xc8,0xeb,0xbb,0x3c,0x83,0x53,0x99,0x61, + 0x17,0x2b,0x04,0x7e,0xba,0x77,0xd6,0x26, + 0xe1,0x69,0x14,0x63,0x55,0x21,0x0c,0x7d +}; + +static const unsigned char Rcon[30]= +{ + 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80, + 0x1b,0x36,0x6c,0xd8,0xab,0x4d,0x9a,0x2f, + 0x5e,0xbc,0x63,0xc6,0x97,0x35,0x6a,0xd4, + 0xb3,0x7d,0xfa,0xef,0xc5,0x91, +}; + +/* ----- static functions ----- */ +static void AES_encrypt(const AES_CTX *ctx, uint32_t *data); +static void AES_decrypt(const AES_CTX *ctx, uint32_t *data); + +/* Perform doubling in Galois Field GF(2^8) using the irreducible polynomial + x^8+x^4+x^3+x+1 */ +static unsigned char AES_xtime(uint32_t x) +{ + return (x&0x80) ? (x<<1)^0x1b : x<<1; +} + +/** + * Set up AES with the key/iv and cipher size. + */ +void AES_set_key(AES_CTX *ctx, const uint8_t *key, + const uint8_t *iv, AES_MODE mode) +{ + int i, ii; + uint32_t *W, tmp, tmp2; + const unsigned char *ip; + int words; + + switch (mode) + { + case AES_MODE_128: + i = 10; + words = 4; + break; + + case AES_MODE_256: + i = 14; + words = 8; + break; + + default: /* fail silently */ + return; + } + + ctx->rounds = i; + ctx->key_size = words; + W = ctx->ks; + for (i = 0; i < words; i+=2) + { + W[i+0]= ((uint32_t)key[ 0]<<24)| + ((uint32_t)key[ 1]<<16)| + ((uint32_t)key[ 2]<< 8)| + ((uint32_t)key[ 3] ); + W[i+1]= ((uint32_t)key[ 4]<<24)| + ((uint32_t)key[ 5]<<16)| + ((uint32_t)key[ 6]<< 8)| + ((uint32_t)key[ 7] ); + key += 8; + } + + ip = Rcon; + ii = 4 * (ctx->rounds+1); + for (i = words; i> 8)&0xff]<<16; + tmp2|=(uint32_t)aes_sbox[(tmp>>16)&0xff]<<24; + tmp2|=(uint32_t)aes_sbox[(tmp>>24) ]; + tmp=tmp2^(((unsigned int)*ip)<<24); + ip++; + } + + if ((words == 8) && ((i % words) == 4)) + { + tmp2 =(uint32_t)aes_sbox[(tmp )&0xff] ; + tmp2|=(uint32_t)aes_sbox[(tmp>> 8)&0xff]<< 8; + tmp2|=(uint32_t)aes_sbox[(tmp>>16)&0xff]<<16; + tmp2|=(uint32_t)aes_sbox[(tmp>>24) ]<<24; + tmp=tmp2; + } + + W[i]=W[i-words]^tmp; + } + + /* copy the iv across */ + memcpy(ctx->iv, iv, 16); +} + +/** + * Change a key for decryption. + */ +void AES_convert_key(AES_CTX *ctx) +{ + int i; + uint32_t *k,w,t1,t2,t3,t4; + + k = ctx->ks; + k += 4; + + for (i= ctx->rounds*4; i > 4; i--) + { + w= *k; + w = inv_mix_col(w,t1,t2,t3,t4); + *k++ =w; + } +} + +/** + * Encrypt a byte sequence (with a block size 16) using the AES cipher. + */ +void AES_cbc_encrypt(AES_CTX *ctx, const uint8_t *msg, uint8_t *out, int length) +{ + int i; + uint32_t tin[4], tout[4], iv[4]; + + memcpy(iv, ctx->iv, AES_IV_SIZE); + for (i = 0; i < 4; i++) + tout[i] = _byteswap_ulong(iv[i]); + + for (length -= AES_BLOCKSIZE; length >= 0; length -= AES_BLOCKSIZE) + { + uint32_t msg_32[4]; + uint32_t out_32[4]; + memcpy(msg_32, msg, AES_BLOCKSIZE); + msg += AES_BLOCKSIZE; + + for (i = 0; i < 4; i++) + tin[i] = _byteswap_ulong(msg_32[i])^tout[i]; + + AES_encrypt(ctx, tin); + + for (i = 0; i < 4; i++) + { + tout[i] = tin[i]; + out_32[i] = _byteswap_ulong(tout[i]); + } + + memcpy(out, out_32, AES_BLOCKSIZE); + out += AES_BLOCKSIZE; + } + + for (i = 0; i < 4; i++) + iv[i] = _byteswap_ulong(tout[i]); + memcpy(ctx->iv, iv, AES_IV_SIZE); +} + +/** + * Decrypt a byte sequence (with a block size 16) using the AES cipher. + */ +void AES_cbc_decrypt(AES_CTX *ctx, const uint8_t *msg, uint8_t *out, int length) +{ + int i; + uint32_t tin[4], xor[4], tout[4], data[4], iv[4]; + + memcpy(iv, ctx->iv, AES_IV_SIZE); + for (i = 0; i < 4; i++) + xor[i] = _byteswap_ulong(iv[i]); + + for (length -= 16; length >= 0; length -= 16) + { + uint32_t msg_32[4]; + uint32_t out_32[4]; + memcpy(msg_32, msg, AES_BLOCKSIZE); + msg += AES_BLOCKSIZE; + + for (i = 0; i < 4; i++) + { + tin[i] = _byteswap_ulong(msg_32[i]); + data[i] = tin[i]; + } + + AES_decrypt(ctx, data); + + for (i = 0; i < 4; i++) + { + tout[i] = data[i]^xor[i]; + xor[i] = tin[i]; + out_32[i] = _byteswap_ulong(tout[i]); + } + + memcpy(out, out_32, AES_BLOCKSIZE); + out += AES_BLOCKSIZE; + } + + for (i = 0; i < 4; i++) + iv[i] = _byteswap_ulong(xor[i]); + memcpy(ctx->iv, iv, AES_IV_SIZE); +} + +/** + * Encrypt a single block (16 bytes) of data + */ +static void AES_encrypt(const AES_CTX *ctx, uint32_t *data) +{ + /* To make this code smaller, generate the sbox entries on the fly. + * This will have a really heavy effect upon performance. + */ + uint32_t tmp[4]; + uint32_t tmp1, old_a0, a0, a1, a2, a3, row; + int curr_rnd; + int rounds = ctx->rounds; + const uint32_t *k = ctx->ks; + + /* Pre-round key addition */ + for (row = 0; row < 4; row++) + data[row] ^= *(k++); + + /* Encrypt one block. */ + for (curr_rnd = 0; curr_rnd < rounds; curr_rnd++) + { + /* Perform ByteSub and ShiftRow operations together */ + for (row = 0; row < 4; row++) + { + a0 = (uint32_t)aes_sbox[(data[row%4]>>24)&0xFF]; + a1 = (uint32_t)aes_sbox[(data[(row+1)%4]>>16)&0xFF]; + a2 = (uint32_t)aes_sbox[(data[(row+2)%4]>>8)&0xFF]; + a3 = (uint32_t)aes_sbox[(data[(row+3)%4])&0xFF]; + + /* Perform MixColumn iff not last round */ + if (curr_rnd < (rounds - 1)) + { + tmp1 = a0 ^ a1 ^ a2 ^ a3; + old_a0 = a0; + a0 ^= tmp1 ^ AES_xtime(a0 ^ a1); + a1 ^= tmp1 ^ AES_xtime(a1 ^ a2); + a2 ^= tmp1 ^ AES_xtime(a2 ^ a3); + a3 ^= tmp1 ^ AES_xtime(a3 ^ old_a0); + } + + tmp[row] = ((a0 << 24) | (a1 << 16) | (a2 << 8) | a3); + } + + /* KeyAddition - note that it is vital that this loop is separate from + the MixColumn operation, which must be atomic...*/ + for (row = 0; row < 4; row++) + data[row] = tmp[row] ^ *(k++); + } +} + +/** + * Decrypt a single block (16 bytes) of data + */ +static void AES_decrypt(const AES_CTX *ctx, uint32_t *data) +{ + uint32_t tmp[4]; + uint32_t xt0,xt1,xt2,xt3,xt4,xt5,xt6; + uint32_t a0, a1, a2, a3, row; + int curr_rnd; + int rounds = ctx->rounds; + const uint32_t *k = ctx->ks + ((rounds+1)*4); + + /* pre-round key addition */ + for (row=4; row > 0;row--) + data[row-1] ^= *(--k); + + /* Decrypt one block */ + for (curr_rnd = 0; curr_rnd < rounds; curr_rnd++) + { + /* Perform ByteSub and ShiftRow operations together */ + for (row = 4; row > 0; row--) + { + a0 = aes_isbox[(data[(row+3)%4]>>24)&0xFF]; + a1 = aes_isbox[(data[(row+2)%4]>>16)&0xFF]; + a2 = aes_isbox[(data[(row+1)%4]>>8)&0xFF]; + a3 = aes_isbox[(data[row%4])&0xFF]; + + /* Perform MixColumn iff not last round */ + if (curr_rnd<(rounds-1)) + { + /* The MDS cofefficients (0x09, 0x0B, 0x0D, 0x0E) + are quite large compared to encryption; this + operation slows decryption down noticeably. */ + xt0 = AES_xtime(a0^a1); + xt1 = AES_xtime(a1^a2); + xt2 = AES_xtime(a2^a3); + xt3 = AES_xtime(a3^a0); + xt4 = AES_xtime(xt0^xt1); + xt5 = AES_xtime(xt1^xt2); + xt6 = AES_xtime(xt4^xt5); + + xt0 ^= a1^a2^a3^xt4^xt6; + xt1 ^= a0^a2^a3^xt5^xt6; + xt2 ^= a0^a1^a3^xt4^xt6; + xt3 ^= a0^a1^a2^xt5^xt6; + tmp[row-1] = ((xt0<<24)|(xt1<<16)|(xt2<<8)|xt3); + } + else + tmp[row-1] = ((a0<<24)|(a1<<16)|(a2<<8)|a3); + } + + for (row = 4; row > 0; row--) + data[row-1] = tmp[row-1] ^ *(--k); + } +} diff --git a/EDUReViver/configstore.cpp b/EDUReViver/configstore.cpp new file mode 100644 index 0000000..05a19ae --- /dev/null +++ b/EDUReViver/configstore.cpp @@ -0,0 +1,837 @@ +#include "targetver.h" +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "configstore.h" +extern "C" { +#include "capstone/capstone.h" +}; +#include "addon_func.h" + + +typedef std::map ConfigMap; + +//#define CFG_CNT 4 +//patcher_config suppcfgs[CFG_CNT] = { +// { +// "J-Link V10 compiled Feb 2 2018 18:12:40", 0x100840A0, 0x1A010718, 0x1A010EDA, false +// }, +// { +// "J-Link V10 compiled Feb 21 2019 12:48:07", 0x10084008, 0x1A010A76, 0x1A011222, false +// }, +// { +// "J-Link V11 compiled Jul 29 2021 14:56:35", 0x10081D10, 0x1A01A110, 0x1A041EAC, true, 6, 0x10084765, 0x100838F0, 0x145 +// }, +// { +// "J-Link V11 compiled Dec 9 2021 14:14:49", 0x10081D18, 0x1A01B25C, 0x1A04337C, true, 4, 0x145, 0x100838F0, 0x1008479E +// } +//}; + +ConfigMap g_patchercfgs; + +bool loadFirmwareConfigs(const wchar_t* cfgpath); + +std::string normalize_version(const char* fwversion) { + const char* compiled = strstr(fwversion, "compiled "); + if (compiled == 0) { + return fwversion; + } + compiled += strlen("compiled "); + size_t pos = compiled - fwversion; + std::string str(fwversion); + str[pos] = toupper(str[pos]); + str[pos + 1] = tolower(str[pos + 1]); + str[pos + 2] = tolower(str[pos + 2]); + return str; +} + +const patcher_config* find_patcher_config(const char* fwversion) +{ + if (g_patchercfgs.empty()) { + loadFirmwareConfigs(L"firmwarecfgs.lst"); + loadFirmwareConfigs(L"firmwarecfgs_usr.lst"); + } + ConfigMap::const_iterator it = g_patchercfgs.find(normalize_version(fwversion)); + if (it == g_patchercfgs.end()) { + return 0; + } + return &it->second; +} + +bool loadFirmwareConfigs(const wchar_t* cfgpath) +{ + char* cfgbuf; + int len = readallcontent(cfgpath, (void**)&cfgbuf); + if (len == -1) { + return false; + } + len++; + cfgbuf = (char*)realloc(cfgbuf, len); + int pos = -1; + char* line = cfgbuf; + while (++pos < len) { + if (cfgbuf[pos] == '\n' || cfgbuf[pos] == '\r' || pos == len - 1) { + cfgbuf[pos] = 0; + if (line == cfgbuf + pos) { + line++; + continue; + } + if (strstr(line, "//") == 0) { + char version[0x71]; + char truefalse[0x71]; + patcher_config item = {0,}; + //"J-Link V10 compiled Feb 2 2018 18:12:40", 0x100840A0, 0x1A010718, 0x1A010EDA, false + int cnt = sscanf(line, "\"%[^\"]\", 0x%X, 0x%X, 0x%X, %[^,], %d, 0x%X, 0x%X, 0x%X", version, &item.sp, &item.lr, &item.usbrx, truefalse, &item.cmdReg, &item.R4, &item.R5, &item.R6); + if (cnt >= 5) { + truefalse[0x70] = 0; + version[0x70] = 0; + item.isSES = _stricmp(truefalse, "true") == 0; + g_patchercfgs.insert(std::make_pair(std::string(version), item)); + } else { + printf("Bad line in config file: %s\n", line); + } + } + line = cfgbuf + pos + 1; + } + } + free(cfgbuf); + return true; +} + +bool add_user_config(const char* fwversion, const patcher_config* config) +{ + std::string version = normalize_version(fwversion); + ConfigMap::const_iterator it = g_patchercfgs.find(version); + if (it == g_patchercfgs.end()) { + g_patchercfgs.insert(std::make_pair(version, *config)); + int fd = _wopen(L"firmwarecfgs_usr.lst", O_CREAT | O_RDWR | O_BINARY, S_IREAD | S_IWRITE); // O_BINARY not available in OSX + if (fd == -1) { + return false; + } + if (_lseek(fd, -1, SEEK_END) >= 0) { + char end; + _read(fd, &end, sizeof(end)); + if (end != '\n' && end != '\r') { + _write(fd, "\r\n", 2); + } + } + char line[128]; + int linelen; + if (config->isSES) { + linelen = sprintf_s(line, _countof(line), "\"%s\", 0x%08X, 0x%08X, 0x%08X, true, %d, 0x%X, 0x%X, 0x%X", version.c_str(), config->sp, config->lr, config->usbrx, config->cmdReg, config->R4, config->R5, config->R6); + } else { + linelen = sprintf_s(line, _countof(line), "\"%s\", 0x%08X, 0x%08X, 0x%08X, false", version.c_str(), config->sp, config->lr, config->usbrx); + } + _write(fd, line, linelen); + _close(fd); + return true; + } + return false; +} + +struct RomReader +{ + unsigned char* fRomBuf; + uint32_t fRomSize; + uint32_t fRomBase; + uint32_t fRamBase; + bool isValid(); + uint32_t read_uint32_addr(uint32_t addr); + uint32_t read_uint32_offset(uint32_t off); + unsigned char* buf_at_addr(uint32_t addr); + char* get_banner(); + tm get_build_date(); + RomReader(const void* rom, size_t romlen); + ~RomReader(); +}; + +bool RomReader::isValid() +{ + return fRomBuf != 0; +} + +uint32_t RomReader::read_uint32_addr(uint32_t addr) +{ + return read_uint32_offset(addr - fRomBase); +} + +uint32_t RomReader::read_uint32_offset(uint32_t off) +{ + return *(uint32_t*)(fRomBuf + off); +} + +unsigned char* RomReader::buf_at_addr(uint32_t addr) +{ + return fRomBuf + (addr - fRomBase); +} + +char* RomReader::get_banner() +{ + return (char*)fRomBuf + (fRomBase == 0x1A008000?0x130:0x210); +} + +tm get_build_date(const char* version) +{ + tm date = {0, }; + // J-Link V9 compiled Oct 25 2018 11:46:07 + // J-Link V10 compiled Feb 21 2019 12:48:07 + // 01234567890123456789 + // Feb 21 2019 12:48:07 + //const char* compiled = version + strlen(version) - strlen("Feb 21 2019 12:48:07"); + const char* compiled = strstr(version, "compiled "); + if (compiled == 0) { + return date; + } + compiled += strlen("compiled "); + date.tm_year = atoi(compiled + 7); + date.tm_mday = atoi(compiled + 4); + date.tm_hour = atoi(compiled + 12); + date.tm_min = atoi(compiled + 15); + date.tm_sec = atoi(compiled + 18); + date.tm_mon = 0; + const char* mon = "JanFebMarAprMayJunJulAugSepOctNovDec"; + for (int i = 0; i < 12; i++, mon += 3) { + if (_strnicmp(compiled, mon, 3) == 0) { + date.tm_mon = i + 1; + break; + } + } + return date; +} + +tm RomReader::get_build_date() +{ + return ::get_build_date(get_banner()); +} + +RomReader::RomReader(const void* rom, size_t romlen) + : fRomBuf(0) + , fRomSize(0) + , fRomBase(0) + , fRamBase(0) +{ + //fRomBuf = (unsigned char*)malloc(romlen); + //memcpy(fRomBuf, rom, romlen); + fRomBuf = (unsigned char*)rom; + fRomSize = romlen; + uint32_t stackaddr = *(uint32_t*)fRomBuf; + uint32_t resetaddr = *((uint32_t*)fRomBuf + 1); + if (resetaddr >> 24 == 0x1A) { + // LPC + fRomBase = 0x1A008000; + } else { + // STM + fRomBase = 0x08010000; + } + fRamBase = stackaddr; +} + +RomReader::~RomReader() +{ + //if (fRomBuf) { + // free(fRomBuf); + // fRomBuf = 0; + //} +} + +uint32_t extract_ldr_pool(const cs_insn* insn) +{ + if (insn->id == ARM_INS_LDR && insn->detail->arm.operands[1].type == ARM_OP_MEM && insn->detail->arm.operands[1].mem.base == ARM_REG_PC) { + return uint32_t((insn->address & ~3) + 4) + insn->detail->arm.operands[1].mem.disp; + } else { + return -1; + } +} + +typedef std::vector IntVec; + +void calc_stack(cs_insn *insn, size_t count, IntVec& vec); + +#define FREE_AND_EXIT(ptr) cs_free(insn, count); cs_close(&handle); return ptr; + +bool is_reg_add_imm(cs_insn * insn, int reg) +{ + return insn->id == ARM_INS_ADD && + insn->detail->arm.operands[0].type == ARM_OP_REG && insn->detail->arm.operands[0].reg == reg && + insn->detail->arm.operands[1].type == ARM_OP_IMM; +} + +const patcher_config* analyst_firmware_stack(const void* fwbuf, size_t fwlen) +{ + RomReader reader(fwbuf, fwlen); + if (!reader.isValid()) { + return NULL; + } + tm date = reader.get_build_date(); + printf("Build date: %04d %02d/%02d %02d:%02d:%02d\n", date.tm_year, date.tm_mon, date.tm_mday, date.tm_hour, date.tm_min, date.tm_sec); + + uint32_t resetaddr = reader.read_uint32_offset(4); + csh handle; + cs_insn *insn; + size_t count; + + if (cs_open(CS_ARCH_ARM, cs_mode(CS_MODE_THUMB | CS_MODE_MCLASS), &handle) != CS_ERR_OK) { + return NULL; + } + cs_option(handle, CS_OPT_DETAIL, CS_OPT_ON); + count = cs_disasm(handle, reader.buf_at_addr(resetaddr & ~1), 8, resetaddr & ~1, 0, &insn); + if (count <= 0) { + errprintf("Reset_Handler doesn't contains code. Not a valid firmware?\n"); + cs_close(&handle); + return NULL; + } + uint32_t startaddr; + // SES¹Ì¼þ? + if (count == 2) { + // LPC4300_Startup.s, no vfp + if (insn[0].id == ARM_INS_BL && insn[1].id == ARM_INS_BL) { + startaddr = insn[1].detail->arm.operands[0].imm; + printf("_start: %08X\n", startaddr); + } else { + errprintf("Firmware was not build by SES\n"); + FREE_AND_EXIT(NULL); + } + cs_free(insn, count); + // SEGGER_THUMB_Startup.s + // LDR R4, =__SEGGER_init_table__ + count = cs_disasm(handle, reader.buf_at_addr(startaddr), 4, startaddr, 0, &insn); + cs_arm_op op0 = insn[0].detail->arm.operands[0]; + cs_arm_op op1 = insn[0].detail->arm.operands[1]; + uint32_t inittable; + if (count && insn[0].id == ARM_INS_LDR && op0.type == ARM_OP_REG && op0.reg == ARM_REG_R4 && op1.type == ARM_OP_MEM && op1.reg == ARM_REG_PC) { + inittable = extract_ldr_pool(&insn[0]); + inittable = reader.read_uint32_addr(inittable); + } else { + errprintf("Firmware was not build by SES.\n"); + FREE_AND_EXIT(NULL); + } + cs_free(insn, count); + // find __SEGGER_init_done + int retry = 0; + uint32_t mainaddr = 0; + while (retry++ < 20 && mainaddr == 0) { + uint32_t initfunc = reader.read_uint32_addr(inittable); + inittable += 4; + // SEGGER_crtinit_v7em_little.o + // zpak|copy C + // ADDS R4, #8 + count = cs_disasm(handle, reader.buf_at_addr(initfunc & ~1), 0x10, initfunc & ~1, 4, &insn); + if (count == 4 && is_reg_add_imm(&insn[2], ARM_REG_R4)) { + inittable += insn[2].detail->arm.operands[1].imm; + } + if (count == 4 && is_reg_add_imm(&insn[3], ARM_REG_R4)) { + inittable += insn[3].detail->arm.operands[1].imm; + } + // BL main + // B exit + if (count >= 2 && insn[0].id == ARM_INS_BL && insn[1].id == ARM_INS_B && insn[1].detail->arm.operands[0].imm == insn[1].address) { + mainaddr = insn[0].detail->arm.operands[0].imm; + } + cs_free(insn, count); + } + if (mainaddr == 0) { + errprintf("Firmware was not build by SES?\n"); + cs_close(&handle); + return NULL; + } + // V11 Ses Size: 1D2 + count = cs_disasm(handle, reader.buf_at_addr(mainaddr & ~1), 0x200, (mainaddr & ~1), 0, &insn); + uint32_t taskstack = 0, stacksize = 0; + uint32_t maintaskaddr = 0, taskstackinit = 0; + for (size_t j = 0; j < count; j++) { + //printf("%"PRIx64"\t%s\t\t%s\n", insn[j].address, insn[j].mnemonic, insn[j].op_str); + cs_arm* arm = &insn[j].detail->arm; + if ((insn[j].id == ARM_INS_MOV || insn[j].id == ARM_INS_MOVW) && arm->operands[0].type == ARM_OP_REG && arm->operands[1].type == ARM_OP_IMM) { + if (arm->operands[0].reg == ARM_REG_R0) { + stacksize = arm->operands[1].imm; + } + if (arm->operands[0].reg == ARM_REG_R1) { + taskstack = arm->operands[1].imm; + } + if (arm->operands[0].reg == ARM_REG_R3 && taskstackinit) { + maintaskaddr = arm->operands[1].imm; + } + } + if (insn[j].id == ARM_INS_MOVT && arm->operands[0].type == ARM_OP_REG && arm->operands[1].type == ARM_OP_IMM) { + if (arm->operands[0].reg == ARM_REG_R0) { + *((uint16_t*)&stacksize + 1) = arm->operands[1].imm; + } + if (arm->operands[0].reg == ARM_REG_R1) { + *((uint16_t*)&taskstack + 1) = arm->operands[1].imm; + } + if (arm->operands[0].reg == ARM_REG_R3 && taskstackinit) { + *((uint16_t*)&maintaskaddr + 1) = arm->operands[1].imm; + } + } + // STRD.W R1, R0, [SP] + if (insn[j].id == ARM_INS_STRD && arm->operands[2].type == ARM_OP_MEM && arm->operands[2].mem.base == ARM_REG_SP) { + taskstackinit = (taskstack + stacksize) & ~0xF; + //printf("taskstackinit: %08X\n", taskstackinit); + } + // BL OS_TaskCreate + if (taskstackinit && insn[j].id == ARM_INS_BL) { + break; + } + } + cs_free(insn, count); + //dispatchcmdÊÇtaskmainµÄÒ»²¿·Ö + //1A0197AC 000 98 B0 SUB SP, SP, #0x60 + //1A01B25A 060 80 47 BLX R0 + count = cs_disasm(handle, reader.buf_at_addr(maintaskaddr & ~1), 0x2000, (maintaskaddr & ~1), 0, &insn); + IntVec spdvec; + calc_stack(insn, count, spdvec); + uint32_t cmdtable = 0; + int cmdcnt = 0; + int r4val = -1, r5val = -1, r6val = -1; + int spd1, spd2; + uint32_t dispatchlr; + uint32_t usbrxbuf = 0; + int rawCmdRegIdx = -1; + for (size_t j = 0; j < count; j++) { + //printf("%"PRIx64" %03x \t%s\t\t%s\n", insn[j].address, -spdvec[j], insn[j].mnemonic, insn[j].op_str); + cs_arm* arm = &insn[j].detail->arm; + // BLX R0 + if (j > 5 && insn[j].id == ARM_INS_BLX && arm->operands[0].type == ARM_OP_REG) { + // LDR.W R0, [R1,R0,LSL#2] + cs_arm* prevarm = &insn[j-1].detail->arm; + // index uxtb cmd + // base cmdtable + // shift 2 + if (insn[j-1].id == ARM_INS_LDR && prevarm->operands[0].reg == arm->operands[0].reg && + prevarm->operands[1].type == ARM_OP_MEM && prevarm->operands[1].shift.type == ARM_SFT_LSL && prevarm->operands[1].shift.value == 2) { + dispatchlr = insn[j+1].address; + spd1 = spdvec[j]; + int cmdreg = prevarm->operands[1].mem.index; + int tablereg = prevarm->operands[1].mem.base; + j--; + // Ñ°ÕÒÕâ¶Ô×éºÏ + //ADDS R6, #0x65 + //UXTB R0, R6 + while (j--) { + cs_arm* arm = &insn[j].detail->arm; + cs_arm* prevarm = &insn[j-1].detail->arm; + if (insn[j].id == ARM_INS_UXTB && arm->operands[0].reg == cmdreg && + is_reg_add_imm(&insn[j-1], arm->operands[1].reg)) { + // R6=rawcmd + cmdcnt = prevarm->operands[1].imm; + printf("rawcmd reg: %s, val: %08X\n", cs_reg_name(handle, prevarm->operands[0].reg), cmdcnt + 0xE0); + rawCmdRegIdx = prevarm->operands[0].reg - ARM_REG_R0; + break; + } + } + while (j++) { + //MOV R1, #g_usbcmds + cs_arm* arm = &insn[j].detail->arm; + if ((insn[j].id == ARM_INS_MOV || insn[j].id == ARM_INS_MOVW) && arm->operands[0].type == ARM_OP_REG && arm->operands[0].reg == tablereg && arm->operands[1].type == ARM_OP_IMM) { + cmdtable = arm->operands[1].imm; + } + if (insn[j].id == ARM_INS_MOVT && arm->operands[0].type == ARM_OP_REG && arm->operands[0].reg == tablereg && arm->operands[1].type == ARM_OP_IMM) { + *((uint16_t*)&cmdtable + 1) = arm->operands[1].imm; + break; + } + } + if (cmdcnt && cmdtable) { + break; + } + } + // MOVS R1, #1 + // BLX R2 + // CMP R0, #0 + if (j > 10 && insn[j-1].id == ARM_INS_MOV && insn[j+1].id == ARM_INS_CMP) { + cs_arm* prevarm = &insn[j-1].detail->arm; + cs_arm* nextarm = &insn[j+1].detail->arm; + if (prevarm->operands[1].type == ARM_OP_IMM && prevarm->operands[1].imm == 1 && nextarm->operands[1].type == ARM_OP_IMM && nextarm->operands[1].imm == 0) { + int step = 0; + int targetreg = arm->operands[0].reg; + uint32_t usbrxtable, disp; + for (size_t k = j - 1; k > j - 15; k--) { + cs_arm* arm = &insn[k].detail->arm; + // LDR R2, [R0,#8] + if (step == 0 && insn[k].id == ARM_INS_LDR && arm->operands[0].reg == targetreg && arm->operands[1].type == ARM_OP_MEM && arm->operands[1].mem.disp) { + step++; + targetreg = arm->operands[1].mem.base; + disp = arm->operands[1].mem.disp; + } + // MOV R0, R1 + if (step >= 1 && insn[k].id == ARM_INS_MOV && arm->operands[0].type == ARM_OP_REG && arm->operands[0].reg == targetreg && arm->operands[1].type == ARM_OP_REG) { + targetreg = arm->operands[1].reg; + step = 1; + } + if (step == 1 && insn[k].id == ARM_INS_MOVT && arm->operands[0].type == ARM_OP_REG && arm->operands[0].reg == targetreg) { + *((uint16_t*)&usbrxtable + 1) = arm->operands[1].imm; + step++; + } + if (step == 2 && (insn[k].id == ARM_INS_MOV || insn[k].id == ARM_INS_MOVW) && arm->operands[0].type == ARM_OP_REG && arm->operands[0].reg == targetreg && arm->operands[1].type == ARM_OP_IMM) { + *(uint16_t*)&usbrxtable = arm->operands[1].imm; + usbrxbuf = reader.read_uint32_addr(usbrxtable + disp) &~1; + printf("usbrxbuf: %08X\n", usbrxbuf); + break; + } + } + } + } + } + // ³ÖÐø¸ú×ÙR4/R5/R6µÄMOVW/MOVT¶ÔÖµ + if ((insn[j].id == ARM_INS_MOV || insn[j].id == ARM_INS_MOVW) && arm->operands[0].type == ARM_OP_REG && arm->operands[1].type == ARM_OP_IMM) { + switch(arm->operands[0].reg) { + case ARM_REG_R4: + r4val = arm->operands[1].imm; + break; + case ARM_REG_R5: + r5val = arm->operands[1].imm; + break; + case ARM_REG_R6: + r6val = arm->operands[1].imm; + break; + } + } + if (insn[j].id == ARM_INS_MOVT && arm->operands[0].type == ARM_OP_REG && arm->operands[1].type == ARM_OP_IMM) { + switch(arm->operands[0].reg) { + case ARM_REG_R4: + *((uint16_t*)&r4val + 1) = arm->operands[1].imm; + break; + case ARM_REG_R5: + *((uint16_t*)&r5val + 1) = arm->operands[1].imm; + break; + case ARM_REG_R6: + *((uint16_t*)&r6val + 1) = arm->operands[1].imm; + break; + } + } + } + cs_free(insn, count); + printf("R4: %08X R5:%08X R6:%08X\n", r4val, r5val, r6val); + if (cmdcnt == 0) { + errprintf("Analyst failed on command table!\n"); + cs_close(&handle); + return NULL; + } + uint32_t cmde0func = reader.read_uint32_addr(cmdtable + (cmdcnt - 1 - (0xFF - 0xE0)) * 4); + printf("cmd_e0_fine_write_read: %08X\n", cmde0func); + // Ñ°ÕÒusbrxbuf±ÀÀ£µã, 5C + count = cs_disasm(handle, reader.buf_at_addr(cmde0func & ~1), 0x70, (cmde0func & ~1), 0, &insn); + calc_stack(insn, count, spdvec); + int callcount = 0; + size_t firstBL = -1, firstBLX = -1, secondBLX = -1; + int funcsreg = ARM_REG_INVALID; + uint32_t currstack; + for (size_t j = 0; j < count; j++) { + //printf("%"PRIx64" %03x \t%s\t\t%s\n", insn[j].address, -spdvec[j], insn[j].mnemonic, insn[j].op_str); + cs_arm* arm = &insn[j].detail->arm; + // BLX R2 + if (insn[j].id == ARM_INS_BL && arm->operands[0].type == ARM_OP_IMM) { + firstBL = j; + } + if (firstBL != -1 && insn[j].id == ARM_INS_MOVT) { + funcsreg = arm->operands[0].reg; + } + if (insn[j].id == ARM_INS_BLX && arm->operands[0].type == ARM_OP_REG) { + if (callcount) { + spd2 = spdvec[j]; + secondBLX = j; + currstack = taskstackinit + spd1 + spd2; + printf("sp: %08X dispatch LR:%08X\n", currstack, dispatchlr); + break; + } else { + firstBLX = j; + callcount++; + } + } + } + // Ñ°ÕÒÖ¸ÕëÔ´ + uint32_t usbdfuncs; + for (size_t j = firstBL+1; j < firstBLX; j++) { + cs_arm* arm = &insn[j].detail->arm; + if ((insn[j].id == ARM_INS_MOV || insn[j].id == ARM_INS_MOVW) && arm->operands[0].type == ARM_OP_REG && arm->operands[0].reg == funcsreg && arm->operands[1].type == ARM_OP_IMM) { + usbdfuncs = arm->operands[1].imm; + } + if (insn[j].id == ARM_INS_MOVT && arm->operands[0].type == ARM_OP_REG && arm->operands[0].reg == funcsreg && arm->operands[1].type == ARM_OP_IMM) { + *((uint16_t*)&usbdfuncs + 1) = arm->operands[1].imm; + printf("g_usbd_funcs: %08X\n", usbdfuncs); + break; + } + } + // Ñ°ÕÒ×îºóµÄ·¢ËÍ + uint32_t usbtxbuf; + for (size_t j = secondBLX+1; j < count; j++) { + //printf("%"PRIx64" %03x \t%s\t\t%s\n", insn[j].address, -spdvec[j], insn[j].mnemonic, insn[j].op_str); + if (insn[j].id == ARM_INS_BL && insn[j].detail->arm.operands[0].type == ARM_OP_IMM) { + usbtxbuf = insn[j].detail->arm.operands[0].imm; + } + if (spdvec[j] == 0) { + printf("usbtxbuf: %08X\n", usbtxbuf); + break; + } + } + cs_free(insn, count); + // version, sp, lr, uxbrx, true, cmdReg, R4, R5, R6 + if (rawCmdRegIdx == 4) r4val = cmdcnt + 0xE0; + if (rawCmdRegIdx == 5) r5val = cmdcnt + 0xE0; + if (rawCmdRegIdx == 6) r6val = cmdcnt + 0xE0; + //printf("\"%s\", 0x%08X, 0x%08X, 0x%08X, true, %d, 0x%X, 0x%X, 0x%X\n", reader.get_banner(), currstack, dispatchlr, usbrxbuf, rawCmdRegIdx, r4val, r5val, r6val); + patcher_config item = {currstack, dispatchlr, usbrxbuf, true, rawCmdRegIdx, r4val, r5val, r6val}; + add_user_config(reader.get_banner(), &item); + } + // IAR¹Ì¼þ? + if (count == 4) { + if (insn[2].id == ARM_INS_LDR && insn[2].detail->arm.operands[1].reg == ARM_REG_PC) { + startaddr = extract_ldr_pool(&insn[2]); + startaddr = reader.read_uint32_addr(startaddr); + printf("__iar_program_start: %08X\n", startaddr); + } else { + printf("Firmware not build by EWARM\n"); + FREE_AND_EXIT(NULL); + } + cs_free(insn, count); + count = cs_disasm(handle, reader.buf_at_addr((startaddr & ~1) + 8), 4, (startaddr & ~1) + 8, 0, &insn); + if (count <= 0 || insn[0].id != ARM_INS_BL) { + printf("Firmware not build by EWARM.\n"); + FREE_AND_EXIT(NULL); + } + uint32_t __cmainaddr = insn[0].detail->arm.operands[0].imm; + cs_free(insn, count); + // BEQ _call_main + count = cs_disasm(handle, reader.buf_at_addr((__cmainaddr & ~1) + 6), 8, (__cmainaddr & ~1) + 6, 0, &insn); + if (count <= 0 || insn[0].id != ARM_INS_B) { + errprintf("Firmware not build by EWARM?\n"); + FREE_AND_EXIT(NULL); + } + uint32_t callmainaddr = insn[0].detail->arm.operands[0].imm; + cs_free(insn, count); + // BL main + count = cs_disasm(handle, reader.buf_at_addr((callmainaddr & ~1) + 2), 8, (callmainaddr & ~1) + 2, 0, &insn); + if (count <= 0 || insn[0].id != ARM_INS_BL) { + errprintf("Firmware not build by EWARM!\n"); + FREE_AND_EXIT(NULL); + } + uint32_t mainaddr = insn[0].detail->arm.operands[0].imm; + cs_free(insn, count); + // v10/v9 main function size 50/56 + count = cs_disasm(handle, reader.buf_at_addr(mainaddr & ~1), 0x70, (mainaddr & ~1), 0, &insn); + IntVec spdvec; + calc_stack(insn, count, spdvec); + size_t seekend = 0; + uint32_t maintaskaddr = -1, taskstackinit = -1; + int step = 0; + for (size_t j = 0; j < count; j++) { + //printf("%"PRIx64" %03x \t%s\t\t%s\n", insn[j].address, -spdvec[j], insn[j].mnemonic, insn[j].op_str); + cs_arm* arm = &insn[j].detail->arm; + // LDR R3, =(app_maintask+1) + if (step == 0 && insn[j].id == ARM_INS_LDR && + arm->op_count == 2 && arm->operands[0].type == ARM_OP_REG && arm->operands[0].reg == ARM_REG_R3 && + arm->operands[1].type == ARM_OP_MEM && arm->operands[1].mem.base == ARM_REG_PC) { + maintaskaddr = reader.read_uint32_addr(extract_ldr_pool(&insn[j])); + step++; + } + // BL app_createtask + if (step == 1 && insn[j].id == ARM_INS_BL) { + uint32_t taskstack, stacksize; + bool stackok = false, sizeok = false; + int stackreg = ARM_REG_INVALID, sizereg = ARM_REG_INVALID; + while(j--) { + //printf("%"PRIx64" %03x \t%s\t\t%s\n", insn[j].address, -spdvec[j], insn[j].mnemonic, insn[j].op_str); + cs_arm* arm = &insn[j].detail->arm; + // ÏÈÕÒ[SP]ºÍ[SP+4]Ìî³ästackregºÍsizereg + // STR R1, [SP,#0x10+StackSize] + // STR R0, [SP,#0x10+pStack] + if (insn[j].id == ARM_INS_STR && arm->op_count == 2 && arm->operands[0].type == ARM_OP_REG && arm->operands[1].type == ARM_OP_MEM && arm->operands[1].mem.base == ARM_REG_SP) { + if (arm->operands[1].mem.disp == 4) { + if (sizereg == ARM_REG_INVALID) { + sizereg = arm->operands[0].reg; + } + } else if (arm->operands[1].mem.disp == 0) { + if (stackreg == ARM_REG_INVALID) { + stackreg = arm->operands[0].reg; + } + } + } + // LDR R0, =unk_100832F8 + if (insn[j].id == ARM_INS_LDR && + arm->op_count == 2 && arm->operands[0].type == ARM_OP_REG && arm->operands[0].reg == stackreg && + arm->operands[1].type == ARM_OP_MEM && arm->operands[1].mem.base == ARM_REG_PC) { + taskstack = reader.read_uint32_addr(extract_ldr_pool(&insn[j])); + stackok = true; + } + // MOV.W R1, #0xE00 + if (insn[j].id == ARM_INS_MOV && + arm->op_count == 2 && arm->operands[0].type == ARM_OP_REG && arm->operands[0].reg == sizereg && + arm->operands[1].type == ARM_OP_IMM && arm->operands[1].imm >= 0x100) { + stacksize = arm->operands[1].imm; + sizeok = true; + } + if (stackok && sizeok) { + taskstackinit = (taskstack + stacksize) & ~7; + break; + } + } + break; + } + } + cs_free(insn, count); + if (maintaskaddr == -1 || taskstackinit == -1) { + errprintf("Analyst failed on embOS!\n"); + cs_close(&handle); + return NULL; + } + // Ñ°ÕÒdispatchusbcmd 110/10C + count = cs_disasm(handle, reader.buf_at_addr(maintaskaddr & ~1), 0x120, (maintaskaddr & ~1), 0, &insn); + calc_stack(insn, count, spdvec); + step = 0; + uint32_t target; + int spd1, spd2, spd3; + for (size_t j = 0; j < count; j++) { + //printf("%"PRIx64" %03x \t%s\t\t%s\n", insn[j].address, -spdvec[j], insn[j].mnemonic, insn[j].op_str); + cs_arm* arm = &insn[j].detail->arm; + // LDRB.W R0, [SP,#8+cmd] + if (step == 0 && insn[j].id == ARM_INS_LDRB && + arm->op_count == 2 && arm->operands[0].type == ARM_OP_REG && arm->operands[0].reg == ARM_REG_R0 && + arm->operands[1].type == ARM_OP_MEM && arm->operands[1].mem.base == ARM_REG_SP) { + seekend = j; + step++; + } + if (step == 1 && insn[j].id == ARM_INS_BL) { + target = arm->operands[0].imm; + printf("dispatchusbcmd: %08X\n", target); + spd1 = spdvec[j]; + step++; + break; + } + } + cs_free(insn, count); + // Ñ°ÕÒusbcmdtable + count = cs_disasm(handle, reader.buf_at_addr(target & ~1), 0x120, (target & ~1), 0, &insn); + calc_stack(insn, count, spdvec); + uint32_t dispatchlr, cmdtable; + int cmdcnt = 0; + for (size_t j = 0; j < count; j++) { + //printf("%"PRIx64" %03x \t%s\t\t%s\n", insn[j].address, -spdvec[j], insn[j].mnemonic, insn[j].op_str); + cs_arm* arm = &insn[j].detail->arm; + // BLX R0 + if (insn[j].id == ARM_INS_BLX && arm->operands[0].type == ARM_OP_REG) { + spd2 = spdvec[j]; + dispatchlr = insn[j].address + insn[j].size; + step = 0; + int reg = ARM_REG_INVALID; + // Íù»ØÑ°ÕÒADD/LDR + while (j--) { + //printf("%"PRIx64" %03x \t%s\t\t%s\n", insn[j].address, -spdvec[j], insn[j].mnemonic, insn[j].op_str); + cs_arm* arm = &insn[j].detail->arm; + // V10/V9»áÓв»Í¬µÄÑ°Ö·Ö¸Áî + // ADR.W R0, g_usb_cmdtable + // LDR R0, =g_cmdtable + if (step == 0 && + ((insn[j].id == ARM_INS_ADDW && arm->op_count == 3 && arm->operands[1].type == ARM_OP_REG && arm->operands[1].reg == ARM_REG_PC) || + (insn[j].id == ARM_INS_LDR && arm->op_count == 2 && arm->operands[1].type == ARM_OP_MEM && arm->operands[1].mem.base == ARM_REG_PC)) && + arm->operands[0].type == ARM_OP_REG && arm->operands[0].reg == ARM_REG_R0 + ) { + if (insn[j].id == ARM_INS_LDR) { + cmdtable = reader.read_uint32_addr(extract_ldr_pool(&insn[j])); + } else { + cmdtable = (insn[j].address &~3) + 4 + arm->operands[2].imm; + } + printf("cmdtable: %08X\n", cmdtable); + step++; + } + // UXTB R4, R4 + if (step == 1 && insn[j].id == ARM_INS_UXTB) { + reg = arm->operands[1].reg; + step++; + } + // ADDS R4, #0x63 + if (step == 2 && insn[j].id == ARM_INS_ADD && arm->op_count == 2 && arm->operands[0].type == ARM_OP_REG && arm->operands[0].reg == reg) { + cmdcnt = arm->operands[1].imm; + step++; + break; + } + } + break; + } + } + cs_free(insn, count); + if (cmdcnt == 0) { + errprintf("Analyst failed on command table!\n"); + cs_close(&handle); + return NULL; + } + uint32_t cmde0func = reader.read_uint32_addr(cmdtable + (cmdcnt - 1 - (0xFF - 0xE0)) * 4); + printf("cmd_e0_fine_write_read: %08X\n", cmde0func); + // Ñ°ÕÒusbrxbuf±ÀÀ£µã, 4c + count = cs_disasm(handle, reader.buf_at_addr(cmde0func & ~1), 0x60, (cmde0func & ~1), 0, &insn); + calc_stack(insn, count, spdvec); + uint32_t usbrxbuf = -1; + size_t prevj = -1; + uint32_t currstack; + for (size_t j = 0; j < count; j++) { + //printf("%"PRIx64" %03x \t%s\t\t%s\n", insn[j].address, -spdvec[j], insn[j].mnemonic, insn[j].op_str); + cs_arm* arm = &insn[j].detail->arm; + // BL app_usbrxbuf + if (insn[j].id == ARM_INS_BL && arm->operands[0].type == ARM_OP_IMM) { + if (arm->operands[0].imm == usbrxbuf) { + spd3 = spdvec[j]; + currstack = taskstackinit + spd1 + spd2 + spd3; + printf("sp: %08X dispatch LR:%08X usbrxbuf: %08X\n", currstack, dispatchlr, usbrxbuf); + prevj = j; + break; + } else { + usbrxbuf = arm->operands[0].imm; + } + } + } + // Ñ°ÕÒ×îºóµÄ·¢ËÍ + uint32_t usbtxbuf; + for (size_t j = prevj + 1; j < count; j++) { + //printf("%"PRIx64" %03x \t%s\t\t%s\n", insn[j].address, -spdvec[j], insn[j].mnemonic, insn[j].op_str); + if (insn[j].id == ARM_INS_BL && insn[j].detail->arm.operands[0].type == ARM_OP_IMM) { + usbtxbuf = insn[j].detail->arm.operands[0].imm; + } + if (spdvec[j] == 0) { + printf("usbtxbuf: %08X\n", usbtxbuf); + break; + } + } + cs_free(insn, count); + // version, sp, lr, uxbrx, false + //printf("\"%s\", 0x%08X, 0x%08X, 0x%08X, false\n", reader.get_banner(), currstack, dispatchlr, usbrxbuf); + patcher_config item = {currstack, dispatchlr, usbrxbuf, false}; + add_user_config(reader.get_banner(), &item); + } + cs_close(&handle); + + return find_patcher_config(reader.get_banner()); +} + +void calc_stack(cs_insn *insn, size_t count, IntVec& vec) +{ + int spd = 0; + vec.resize(count); + for (size_t j = 0; j < count; j++) { + vec[j] = spd; + if (insn[j].id == ARM_INS_PUSH) { + spd -= insn[j].detail->arm.op_count * 4; + } + if (insn[j].id == ARM_INS_POP) { + spd += insn[j].detail->arm.op_count * 4; + } + // ldr lr,[sp],#4 + if (insn[j].id == ARM_INS_LDR && insn[j].detail->arm.op_count == 3 && + insn[j].detail->arm.operands[1].type == ARM_OP_MEM && insn[j].detail->arm.operands[1].mem.base == ARM_REG_SP && + insn[j].detail->arm.operands[2].type == ARM_OP_IMM) { + spd += insn[j].detail->arm.operands[2].imm; + } + if ((insn[j].id == ARM_INS_SUB || insn[j].id == ARM_INS_ADD) && insn[j].detail->arm.op_count == 2 && insn[j].detail->arm.operands[0].type == ARM_OP_REG && insn[j].detail->arm.operands[0].reg == ARM_REG_SP) { + if (insn[j].id == ARM_INS_SUB) { + spd -= insn[j].detail->arm.operands[1].imm; + } else { + spd += insn[j].detail->arm.operands[1].imm; + } + } + } +} + diff --git a/EDUReViver/configstore.h b/EDUReViver/configstore.h new file mode 100644 index 0000000..1fb2467 --- /dev/null +++ b/EDUReViver/configstore.h @@ -0,0 +1,22 @@ +#ifndef _CONFIGSTORE_H +#define _CONFIGSTORE_H + +#include + +struct patcher_config +{ + //const char* version; + uint32_t sp; // ¶¨Î»´úÂëÔËÐк͸²¸ÇλÖà + uint32_t lr; // ·µ»ØdispatchcmdÕý³£Ö´ÐÐ + uint32_t usbrx; + bool isSES; // SESÐèҪʹÓÃR4-R6Öµ + char cmdReg; // ÄÜ×ÔÓÉʹÓõļĴæÆ÷ + uint32_t R4, R5, R6; +}; + +tm get_build_date(const char* version); +const patcher_config* find_patcher_config(const char* fwversion); +const patcher_config* analyst_firmware_stack(const void* fwbuf, size_t fwlen); +bool add_user_config(const char* fwversion, const patcher_config* config); + +#endif \ No newline at end of file diff --git a/EDUReViver/crypto.h b/EDUReViver/crypto.h new file mode 100644 index 0000000..638bb59 --- /dev/null +++ b/EDUReViver/crypto.h @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2007-2016, Cameron Rich + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the axTLS project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @file crypto.h + */ + +#ifndef HEADER_CRYPTO_H +#define HEADER_CRYPTO_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#ifndef STDCALL +#define STDCALL +#endif +#ifndef EXP_FUNC +#define EXP_FUNC +#endif + + +/* enable features based on a 'super-set' capbaility. */ +#if defined(CONFIG_SSL_FULL_MODE) +#define CONFIG_SSL_ENABLE_CLIENT +#define CONFIG_SSL_CERT_VERIFICATION +#elif defined(CONFIG_SSL_ENABLE_CLIENT) +#define CONFIG_SSL_CERT_VERIFICATION +#endif + +/************************************************************************** + * AES declarations + **************************************************************************/ + +#define AES_MAXROUNDS 14 +#define AES_BLOCKSIZE 16 +#define AES_IV_SIZE 16 + +typedef struct aes_key_st +{ + uint16_t rounds; + uint16_t key_size; + uint32_t ks[(AES_MAXROUNDS+1)*8]; + uint8_t iv[AES_IV_SIZE]; +} AES_CTX; + +typedef enum +{ + AES_MODE_128, + AES_MODE_256 +} AES_MODE; + +void AES_set_key(AES_CTX *ctx, const uint8_t *key, + const uint8_t *iv, AES_MODE mode); +void AES_cbc_encrypt(AES_CTX *ctx, const uint8_t *msg, + uint8_t *out, int length); +void AES_cbc_decrypt(AES_CTX *ks, const uint8_t *in, uint8_t *out, int length); +void AES_convert_key(AES_CTX *ctx); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/EDUReViver/httpclient.cpp b/EDUReViver/httpclient.cpp new file mode 100644 index 0000000..45d9e92 --- /dev/null +++ b/EDUReViver/httpclient.cpp @@ -0,0 +1,77 @@ +#include "targetver.h" +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#include +#include "httpclient.h" +#include "addon_func.h" + + +#ifdef _DEBUG +#define apphost L"localhost" +#else +#define apphost L"azsd.net" +#endif + +int request_payload_online(const char* sn, const char* uid, const char* signature, const char* payloadname, char** reply, size_t* replylen) +{ + int retcode = 0; + HINTERNET session = WinHttpOpen(L"EDUReViver/0.3", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); + if (session) { + if (HINTERNET connect = WinHttpConnect(session, apphost, INTERNET_DEFAULT_HTTPS_PORT, 0)) { + if (HINTERNET request = WinHttpOpenRequest(connect, L"POST", L"jlink/payload.php", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE)) { + char* req = (char*)malloc(4096); + sprintf_s(req, 4096, "sn=%s&uid=%s&signature=%s&payload=%s", sn, uid, signature, payloadname); + size_t reqlen = strlen(req); + if (WinHttpSendRequest(request, L"Content-Type: application/x-www-form-urlencoded\r\n", -1, req, reqlen, reqlen, 0)) { + if (WinHttpReceiveResponse(request, NULL)) { + size_t resppos = 0; + DWORD datasize = 0; + do { + if (WinHttpQueryDataAvailable(request, &datasize)) { + char* buff = (char*)malloc(datasize + 1); + memset(buff, 0, datasize + 1); + DWORD readed = 0; + if (WinHttpReadData(request, buff, datasize, &readed)) { + if (readed) { +#ifdef _DEBUG + quickdump(0, (uint8_t*)buff, readed); +#endif + if (resppos == 0) { + *reply = (char*)malloc(readed); + } else { + *reply = (char*)realloc(*reply, resppos + readed); + } + memcpy((*reply) + resppos, buff, readed); + resppos += readed; + } + } + *replylen = resppos; + } else { + printf("Error %u in WinHttpQueryDataAvailable.\n", GetLastError()); + } + } while (datasize > 0); + } else { + printf("Error %u in WinHttpReceiveResponse.\n", GetLastError()); + retcode = -5; + } + } else { + printf("Error %u in WinHttpSendRequest.\n", GetLastError()); + retcode = -4; + } + free(req); + WinHttpCloseHandle(request); + } else { + retcode = -3; + } + WinHttpCloseHandle(connect); + } else { + retcode = -2; + } + WinHttpCloseHandle(session); + } else { + retcode = -1; + } + return retcode; +} diff --git a/EDUReViver/httpclient.h b/EDUReViver/httpclient.h new file mode 100644 index 0000000..8c464ff --- /dev/null +++ b/EDUReViver/httpclient.h @@ -0,0 +1,3 @@ +#include + +int request_payload_online(const char* sn, const char* uid, const char* signature, const char* payloadname, char** reply, size_t* replylen); \ No newline at end of file diff --git a/EDUReViver/include/capstone/arm.h b/EDUReViver/include/capstone/arm.h new file mode 100644 index 0000000..21ba5be --- /dev/null +++ b/EDUReViver/include/capstone/arm.h @@ -0,0 +1,937 @@ +#ifndef CAPSTONE_ARM_H +#define CAPSTONE_ARM_H + +/* Capstone Disassembly Engine */ +/* By Nguyen Anh Quynh , 2013-2015 */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "platform.h" + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +/// ARM shift type +typedef enum arm_shifter { + ARM_SFT_INVALID = 0, + ARM_SFT_ASR, ///< shift with immediate const + ARM_SFT_LSL, ///< shift with immediate const + ARM_SFT_LSR, ///< shift with immediate const + ARM_SFT_ROR, ///< shift with immediate const + ARM_SFT_RRX, ///< shift with immediate const + ARM_SFT_ASR_REG, ///< shift with register + ARM_SFT_LSL_REG, ///< shift with register + ARM_SFT_LSR_REG, ///< shift with register + ARM_SFT_ROR_REG, ///< shift with register + ARM_SFT_RRX_REG, ///< shift with register +} arm_shifter; + +/// ARM condition code +typedef enum arm_cc { + ARM_CC_INVALID = 0, + ARM_CC_EQ, ///< Equal Equal + ARM_CC_NE, ///< Not equal Not equal, or unordered + ARM_CC_HS, ///< Carry set >, ==, or unordered + ARM_CC_LO, ///< Carry clear Less than + ARM_CC_MI, ///< Minus, negative Less than + ARM_CC_PL, ///< Plus, positive or zero >, ==, or unordered + ARM_CC_VS, ///< Overflow Unordered + ARM_CC_VC, ///< No overflow Not unordered + ARM_CC_HI, ///< Unsigned higher Greater than, or unordered + ARM_CC_LS, ///< Unsigned lower or same Less than or equal + ARM_CC_GE, ///< Greater than or equal Greater than or equal + ARM_CC_LT, ///< Less than Less than, or unordered + ARM_CC_GT, ///< Greater than Greater than + ARM_CC_LE, ///< Less than or equal <, ==, or unordered + ARM_CC_AL ///< Always (unconditional) Always (unconditional) +} arm_cc; + +typedef enum arm_sysreg { + /// Special registers for MSR + ARM_SYSREG_INVALID = 0, + + // SPSR* registers can be OR combined + ARM_SYSREG_SPSR_C = 1, + ARM_SYSREG_SPSR_X = 2, + ARM_SYSREG_SPSR_S = 4, + ARM_SYSREG_SPSR_F = 8, + + // CPSR* registers can be OR combined + ARM_SYSREG_CPSR_C = 16, + ARM_SYSREG_CPSR_X = 32, + ARM_SYSREG_CPSR_S = 64, + ARM_SYSREG_CPSR_F = 128, + + // independent registers + ARM_SYSREG_APSR = 256, + ARM_SYSREG_APSR_G, + ARM_SYSREG_APSR_NZCVQ, + ARM_SYSREG_APSR_NZCVQG, + + ARM_SYSREG_IAPSR, + ARM_SYSREG_IAPSR_G, + ARM_SYSREG_IAPSR_NZCVQG, + ARM_SYSREG_IAPSR_NZCVQ, + + ARM_SYSREG_EAPSR, + ARM_SYSREG_EAPSR_G, + ARM_SYSREG_EAPSR_NZCVQG, + ARM_SYSREG_EAPSR_NZCVQ, + + ARM_SYSREG_XPSR, + ARM_SYSREG_XPSR_G, + ARM_SYSREG_XPSR_NZCVQG, + ARM_SYSREG_XPSR_NZCVQ, + + ARM_SYSREG_IPSR, + ARM_SYSREG_EPSR, + ARM_SYSREG_IEPSR, + + ARM_SYSREG_MSP, + ARM_SYSREG_PSP, + ARM_SYSREG_PRIMASK, + ARM_SYSREG_BASEPRI, + ARM_SYSREG_BASEPRI_MAX, + ARM_SYSREG_FAULTMASK, + ARM_SYSREG_CONTROL, + + // Banked Registers + ARM_SYSREG_R8_USR, + ARM_SYSREG_R9_USR, + ARM_SYSREG_R10_USR, + ARM_SYSREG_R11_USR, + ARM_SYSREG_R12_USR, + ARM_SYSREG_SP_USR, + ARM_SYSREG_LR_USR, + ARM_SYSREG_R8_FIQ, + ARM_SYSREG_R9_FIQ, + ARM_SYSREG_R10_FIQ, + ARM_SYSREG_R11_FIQ, + ARM_SYSREG_R12_FIQ, + ARM_SYSREG_SP_FIQ, + ARM_SYSREG_LR_FIQ, + ARM_SYSREG_LR_IRQ, + ARM_SYSREG_SP_IRQ, + ARM_SYSREG_LR_SVC, + ARM_SYSREG_SP_SVC, + ARM_SYSREG_LR_ABT, + ARM_SYSREG_SP_ABT, + ARM_SYSREG_LR_UND, + ARM_SYSREG_SP_UND, + ARM_SYSREG_LR_MON, + ARM_SYSREG_SP_MON, + ARM_SYSREG_ELR_HYP, + ARM_SYSREG_SP_HYP, + + ARM_SYSREG_SPSR_FIQ, + ARM_SYSREG_SPSR_IRQ, + ARM_SYSREG_SPSR_SVC, + ARM_SYSREG_SPSR_ABT, + ARM_SYSREG_SPSR_UND, + ARM_SYSREG_SPSR_MON, + ARM_SYSREG_SPSR_HYP, +} arm_sysreg; + +/// The memory barrier constants map directly to the 4-bit encoding of +/// the option field for Memory Barrier operations. +typedef enum arm_mem_barrier { + ARM_MB_INVALID = 0, + ARM_MB_RESERVED_0, + ARM_MB_OSHLD, + ARM_MB_OSHST, + ARM_MB_OSH, + ARM_MB_RESERVED_4, + ARM_MB_NSHLD, + ARM_MB_NSHST, + ARM_MB_NSH, + ARM_MB_RESERVED_8, + ARM_MB_ISHLD, + ARM_MB_ISHST, + ARM_MB_ISH, + ARM_MB_RESERVED_12, + ARM_MB_LD, + ARM_MB_ST, + ARM_MB_SY, +} arm_mem_barrier; + +/// Operand type for instruction's operands +typedef enum arm_op_type { + ARM_OP_INVALID = 0, ///< = CS_OP_INVALID (Uninitialized). + ARM_OP_REG, ///< = CS_OP_REG (Register operand). + ARM_OP_IMM, ///< = CS_OP_IMM (Immediate operand). + ARM_OP_MEM, ///< = CS_OP_MEM (Memory operand). + ARM_OP_FP, ///< = CS_OP_FP (Floating-Point operand). + ARM_OP_CIMM = 64, ///< C-Immediate (coprocessor registers) + ARM_OP_PIMM, ///< P-Immediate (coprocessor registers) + ARM_OP_SETEND, ///< operand for SETEND instruction + ARM_OP_SYSREG, ///< MSR/MRS special register operand +} arm_op_type; + +/// Operand type for SETEND instruction +typedef enum arm_setend_type { + ARM_SETEND_INVALID = 0, ///< Uninitialized. + ARM_SETEND_BE, ///< BE operand. + ARM_SETEND_LE, ///< LE operand +} arm_setend_type; + +typedef enum arm_cpsmode_type { + ARM_CPSMODE_INVALID = 0, + ARM_CPSMODE_IE = 2, + ARM_CPSMODE_ID = 3 +} arm_cpsmode_type; + +/// Operand type for SETEND instruction +typedef enum arm_cpsflag_type { + ARM_CPSFLAG_INVALID = 0, + ARM_CPSFLAG_F = 1, + ARM_CPSFLAG_I = 2, + ARM_CPSFLAG_A = 4, + ARM_CPSFLAG_NONE = 16, ///< no flag +} arm_cpsflag_type; + +/// Data type for elements of vector instructions. +typedef enum arm_vectordata_type { + ARM_VECTORDATA_INVALID = 0, + + // Integer type + ARM_VECTORDATA_I8, + ARM_VECTORDATA_I16, + ARM_VECTORDATA_I32, + ARM_VECTORDATA_I64, + + // Signed integer type + ARM_VECTORDATA_S8, + ARM_VECTORDATA_S16, + ARM_VECTORDATA_S32, + ARM_VECTORDATA_S64, + + // Unsigned integer type + ARM_VECTORDATA_U8, + ARM_VECTORDATA_U16, + ARM_VECTORDATA_U32, + ARM_VECTORDATA_U64, + + // Data type for VMUL/VMULL + ARM_VECTORDATA_P8, + + // Floating type + ARM_VECTORDATA_F32, + ARM_VECTORDATA_F64, + + // Convert float <-> float + ARM_VECTORDATA_F16F64, // f16.f64 + ARM_VECTORDATA_F64F16, // f64.f16 + ARM_VECTORDATA_F32F16, // f32.f16 + ARM_VECTORDATA_F16F32, // f32.f16 + ARM_VECTORDATA_F64F32, // f64.f32 + ARM_VECTORDATA_F32F64, // f32.f64 + + // Convert integer <-> float + ARM_VECTORDATA_S32F32, // s32.f32 + ARM_VECTORDATA_U32F32, // u32.f32 + ARM_VECTORDATA_F32S32, // f32.s32 + ARM_VECTORDATA_F32U32, // f32.u32 + ARM_VECTORDATA_F64S16, // f64.s16 + ARM_VECTORDATA_F32S16, // f32.s16 + ARM_VECTORDATA_F64S32, // f64.s32 + ARM_VECTORDATA_S16F64, // s16.f64 + ARM_VECTORDATA_S16F32, // s16.f64 + ARM_VECTORDATA_S32F64, // s32.f64 + ARM_VECTORDATA_U16F64, // u16.f64 + ARM_VECTORDATA_U16F32, // u16.f32 + ARM_VECTORDATA_U32F64, // u32.f64 + ARM_VECTORDATA_F64U16, // f64.u16 + ARM_VECTORDATA_F32U16, // f32.u16 + ARM_VECTORDATA_F64U32, // f64.u32 +} arm_vectordata_type; + +/// ARM registers +typedef enum arm_reg { + ARM_REG_INVALID = 0, + ARM_REG_APSR, + ARM_REG_APSR_NZCV, + ARM_REG_CPSR, + ARM_REG_FPEXC, + ARM_REG_FPINST, + ARM_REG_FPSCR, + ARM_REG_FPSCR_NZCV, + ARM_REG_FPSID, + ARM_REG_ITSTATE, + ARM_REG_LR, + ARM_REG_PC, + ARM_REG_SP, + ARM_REG_SPSR, + ARM_REG_D0, + ARM_REG_D1, + ARM_REG_D2, + ARM_REG_D3, + ARM_REG_D4, + ARM_REG_D5, + ARM_REG_D6, + ARM_REG_D7, + ARM_REG_D8, + ARM_REG_D9, + ARM_REG_D10, + ARM_REG_D11, + ARM_REG_D12, + ARM_REG_D13, + ARM_REG_D14, + ARM_REG_D15, + ARM_REG_D16, + ARM_REG_D17, + ARM_REG_D18, + ARM_REG_D19, + ARM_REG_D20, + ARM_REG_D21, + ARM_REG_D22, + ARM_REG_D23, + ARM_REG_D24, + ARM_REG_D25, + ARM_REG_D26, + ARM_REG_D27, + ARM_REG_D28, + ARM_REG_D29, + ARM_REG_D30, + ARM_REG_D31, + ARM_REG_FPINST2, + ARM_REG_MVFR0, + ARM_REG_MVFR1, + ARM_REG_MVFR2, + ARM_REG_Q0, + ARM_REG_Q1, + ARM_REG_Q2, + ARM_REG_Q3, + ARM_REG_Q4, + ARM_REG_Q5, + ARM_REG_Q6, + ARM_REG_Q7, + ARM_REG_Q8, + ARM_REG_Q9, + ARM_REG_Q10, + ARM_REG_Q11, + ARM_REG_Q12, + ARM_REG_Q13, + ARM_REG_Q14, + ARM_REG_Q15, + ARM_REG_R0, + ARM_REG_R1, + ARM_REG_R2, + ARM_REG_R3, + ARM_REG_R4, + ARM_REG_R5, + ARM_REG_R6, + ARM_REG_R7, + ARM_REG_R8, + ARM_REG_R9, + ARM_REG_R10, + ARM_REG_R11, + ARM_REG_R12, + ARM_REG_S0, + ARM_REG_S1, + ARM_REG_S2, + ARM_REG_S3, + ARM_REG_S4, + ARM_REG_S5, + ARM_REG_S6, + ARM_REG_S7, + ARM_REG_S8, + ARM_REG_S9, + ARM_REG_S10, + ARM_REG_S11, + ARM_REG_S12, + ARM_REG_S13, + ARM_REG_S14, + ARM_REG_S15, + ARM_REG_S16, + ARM_REG_S17, + ARM_REG_S18, + ARM_REG_S19, + ARM_REG_S20, + ARM_REG_S21, + ARM_REG_S22, + ARM_REG_S23, + ARM_REG_S24, + ARM_REG_S25, + ARM_REG_S26, + ARM_REG_S27, + ARM_REG_S28, + ARM_REG_S29, + ARM_REG_S30, + ARM_REG_S31, + + ARM_REG_ENDING, // <-- mark the end of the list or registers + + // alias registers + ARM_REG_R13 = ARM_REG_SP, + ARM_REG_R14 = ARM_REG_LR, + ARM_REG_R15 = ARM_REG_PC, + + ARM_REG_SB = ARM_REG_R9, + ARM_REG_SL = ARM_REG_R10, + ARM_REG_FP = ARM_REG_R11, + ARM_REG_IP = ARM_REG_R12, +} arm_reg; + +/// Instruction's operand referring to memory +/// This is associated with ARM_OP_MEM operand type above +typedef struct arm_op_mem { + arm_reg base; ///< base register + arm_reg index; ///< index register + int scale; ///< scale for index register (can be 1, or -1) + int disp; ///< displacement/offset value + /// left-shift on index register, or 0 if irrelevant + /// NOTE: this value can also be fetched via operand.shift.value + int lshift; +} arm_op_mem; + +/// Instruction operand +typedef struct cs_arm_op { + int vector_index; ///< Vector Index for some vector operands (or -1 if irrelevant) + + struct { + arm_shifter type; + unsigned int value; + } shift; + + arm_op_type type; ///< operand type + + union { + int reg; ///< register value for REG/SYSREG operand + int32_t imm; ///< immediate value for C-IMM, P-IMM or IMM operand + double fp; ///< floating point value for FP operand + arm_op_mem mem; ///< base/index/scale/disp value for MEM operand + arm_setend_type setend; ///< SETEND instruction's operand type + }; + + /// in some instructions, an operand can be subtracted or added to + /// the base register, + /// if TRUE, this operand is subtracted. otherwise, it is added. + bool subtracted; + + /// How is this operand accessed? (READ, WRITE or READ|WRITE) + /// This field is combined of cs_ac_type. + /// NOTE: this field is irrelevant if engine is compiled in DIET mode. + uint8_t access; + + /// Neon lane index for NEON instructions (or -1 if irrelevant) + int8_t neon_lane; +} cs_arm_op; + +/// Instruction structure +typedef struct cs_arm { + bool usermode; ///< User-mode registers to be loaded (for LDM/STM instructions) + int vector_size; ///< Scalar size for vector instructions + arm_vectordata_type vector_data; ///< Data type for elements of vector instructions + arm_cpsmode_type cps_mode; ///< CPS mode for CPS instruction + arm_cpsflag_type cps_flag; ///< CPS mode for CPS instruction + arm_cc cc; ///< conditional code for this insn + bool update_flags; ///< does this insn update flags? + bool writeback; ///< does this insn write-back? + arm_mem_barrier mem_barrier; ///< Option for some memory barrier instructions + + /// Number of operands of this instruction, + /// or 0 when instruction has no operand. + uint8_t op_count; + + cs_arm_op operands[36]; ///< operands for this instruction. +} cs_arm; + +/// ARM instruction +typedef enum arm_insn { + ARM_INS_INVALID = 0, + + ARM_INS_ADC, + ARM_INS_ADD, + ARM_INS_ADR, + ARM_INS_AESD, + ARM_INS_AESE, + ARM_INS_AESIMC, + ARM_INS_AESMC, + ARM_INS_AND, + ARM_INS_BFC, + ARM_INS_BFI, + ARM_INS_BIC, + ARM_INS_BKPT, + ARM_INS_BL, + ARM_INS_BLX, + ARM_INS_BX, + ARM_INS_BXJ, + ARM_INS_B, + ARM_INS_CDP, + ARM_INS_CDP2, + ARM_INS_CLREX, + ARM_INS_CLZ, + ARM_INS_CMN, + ARM_INS_CMP, + ARM_INS_CPS, + ARM_INS_CRC32B, + ARM_INS_CRC32CB, + ARM_INS_CRC32CH, + ARM_INS_CRC32CW, + ARM_INS_CRC32H, + ARM_INS_CRC32W, + ARM_INS_DBG, + ARM_INS_DMB, + ARM_INS_DSB, + ARM_INS_EOR, + ARM_INS_ERET, + ARM_INS_VMOV, + ARM_INS_FLDMDBX, + ARM_INS_FLDMIAX, + ARM_INS_VMRS, + ARM_INS_FSTMDBX, + ARM_INS_FSTMIAX, + ARM_INS_HINT, + ARM_INS_HLT, + ARM_INS_HVC, + ARM_INS_ISB, + ARM_INS_LDA, + ARM_INS_LDAB, + ARM_INS_LDAEX, + ARM_INS_LDAEXB, + ARM_INS_LDAEXD, + ARM_INS_LDAEXH, + ARM_INS_LDAH, + ARM_INS_LDC2L, + ARM_INS_LDC2, + ARM_INS_LDCL, + ARM_INS_LDC, + ARM_INS_LDMDA, + ARM_INS_LDMDB, + ARM_INS_LDM, + ARM_INS_LDMIB, + ARM_INS_LDRBT, + ARM_INS_LDRB, + ARM_INS_LDRD, + ARM_INS_LDREX, + ARM_INS_LDREXB, + ARM_INS_LDREXD, + ARM_INS_LDREXH, + ARM_INS_LDRH, + ARM_INS_LDRHT, + ARM_INS_LDRSB, + ARM_INS_LDRSBT, + ARM_INS_LDRSH, + ARM_INS_LDRSHT, + ARM_INS_LDRT, + ARM_INS_LDR, + ARM_INS_MCR, + ARM_INS_MCR2, + ARM_INS_MCRR, + ARM_INS_MCRR2, + ARM_INS_MLA, + ARM_INS_MLS, + ARM_INS_MOV, + ARM_INS_MOVT, + ARM_INS_MOVW, + ARM_INS_MRC, + ARM_INS_MRC2, + ARM_INS_MRRC, + ARM_INS_MRRC2, + ARM_INS_MRS, + ARM_INS_MSR, + ARM_INS_MUL, + ARM_INS_MVN, + ARM_INS_ORR, + ARM_INS_PKHBT, + ARM_INS_PKHTB, + ARM_INS_PLDW, + ARM_INS_PLD, + ARM_INS_PLI, + ARM_INS_QADD, + ARM_INS_QADD16, + ARM_INS_QADD8, + ARM_INS_QASX, + ARM_INS_QDADD, + ARM_INS_QDSUB, + ARM_INS_QSAX, + ARM_INS_QSUB, + ARM_INS_QSUB16, + ARM_INS_QSUB8, + ARM_INS_RBIT, + ARM_INS_REV, + ARM_INS_REV16, + ARM_INS_REVSH, + ARM_INS_RFEDA, + ARM_INS_RFEDB, + ARM_INS_RFEIA, + ARM_INS_RFEIB, + ARM_INS_RSB, + ARM_INS_RSC, + ARM_INS_SADD16, + ARM_INS_SADD8, + ARM_INS_SASX, + ARM_INS_SBC, + ARM_INS_SBFX, + ARM_INS_SDIV, + ARM_INS_SEL, + ARM_INS_SETEND, + ARM_INS_SHA1C, + ARM_INS_SHA1H, + ARM_INS_SHA1M, + ARM_INS_SHA1P, + ARM_INS_SHA1SU0, + ARM_INS_SHA1SU1, + ARM_INS_SHA256H, + ARM_INS_SHA256H2, + ARM_INS_SHA256SU0, + ARM_INS_SHA256SU1, + ARM_INS_SHADD16, + ARM_INS_SHADD8, + ARM_INS_SHASX, + ARM_INS_SHSAX, + ARM_INS_SHSUB16, + ARM_INS_SHSUB8, + ARM_INS_SMC, + ARM_INS_SMLABB, + ARM_INS_SMLABT, + ARM_INS_SMLAD, + ARM_INS_SMLADX, + ARM_INS_SMLAL, + ARM_INS_SMLALBB, + ARM_INS_SMLALBT, + ARM_INS_SMLALD, + ARM_INS_SMLALDX, + ARM_INS_SMLALTB, + ARM_INS_SMLALTT, + ARM_INS_SMLATB, + ARM_INS_SMLATT, + ARM_INS_SMLAWB, + ARM_INS_SMLAWT, + ARM_INS_SMLSD, + ARM_INS_SMLSDX, + ARM_INS_SMLSLD, + ARM_INS_SMLSLDX, + ARM_INS_SMMLA, + ARM_INS_SMMLAR, + ARM_INS_SMMLS, + ARM_INS_SMMLSR, + ARM_INS_SMMUL, + ARM_INS_SMMULR, + ARM_INS_SMUAD, + ARM_INS_SMUADX, + ARM_INS_SMULBB, + ARM_INS_SMULBT, + ARM_INS_SMULL, + ARM_INS_SMULTB, + ARM_INS_SMULTT, + ARM_INS_SMULWB, + ARM_INS_SMULWT, + ARM_INS_SMUSD, + ARM_INS_SMUSDX, + ARM_INS_SRSDA, + ARM_INS_SRSDB, + ARM_INS_SRSIA, + ARM_INS_SRSIB, + ARM_INS_SSAT, + ARM_INS_SSAT16, + ARM_INS_SSAX, + ARM_INS_SSUB16, + ARM_INS_SSUB8, + ARM_INS_STC2L, + ARM_INS_STC2, + ARM_INS_STCL, + ARM_INS_STC, + ARM_INS_STL, + ARM_INS_STLB, + ARM_INS_STLEX, + ARM_INS_STLEXB, + ARM_INS_STLEXD, + ARM_INS_STLEXH, + ARM_INS_STLH, + ARM_INS_STMDA, + ARM_INS_STMDB, + ARM_INS_STM, + ARM_INS_STMIB, + ARM_INS_STRBT, + ARM_INS_STRB, + ARM_INS_STRD, + ARM_INS_STREX, + ARM_INS_STREXB, + ARM_INS_STREXD, + ARM_INS_STREXH, + ARM_INS_STRH, + ARM_INS_STRHT, + ARM_INS_STRT, + ARM_INS_STR, + ARM_INS_SUB, + ARM_INS_SVC, + ARM_INS_SWP, + ARM_INS_SWPB, + ARM_INS_SXTAB, + ARM_INS_SXTAB16, + ARM_INS_SXTAH, + ARM_INS_SXTB, + ARM_INS_SXTB16, + ARM_INS_SXTH, + ARM_INS_TEQ, + ARM_INS_TRAP, + ARM_INS_TST, + ARM_INS_UADD16, + ARM_INS_UADD8, + ARM_INS_UASX, + ARM_INS_UBFX, + ARM_INS_UDF, + ARM_INS_UDIV, + ARM_INS_UHADD16, + ARM_INS_UHADD8, + ARM_INS_UHASX, + ARM_INS_UHSAX, + ARM_INS_UHSUB16, + ARM_INS_UHSUB8, + ARM_INS_UMAAL, + ARM_INS_UMLAL, + ARM_INS_UMULL, + ARM_INS_UQADD16, + ARM_INS_UQADD8, + ARM_INS_UQASX, + ARM_INS_UQSAX, + ARM_INS_UQSUB16, + ARM_INS_UQSUB8, + ARM_INS_USAD8, + ARM_INS_USADA8, + ARM_INS_USAT, + ARM_INS_USAT16, + ARM_INS_USAX, + ARM_INS_USUB16, + ARM_INS_USUB8, + ARM_INS_UXTAB, + ARM_INS_UXTAB16, + ARM_INS_UXTAH, + ARM_INS_UXTB, + ARM_INS_UXTB16, + ARM_INS_UXTH, + ARM_INS_VABAL, + ARM_INS_VABA, + ARM_INS_VABDL, + ARM_INS_VABD, + ARM_INS_VABS, + ARM_INS_VACGE, + ARM_INS_VACGT, + ARM_INS_VADD, + ARM_INS_VADDHN, + ARM_INS_VADDL, + ARM_INS_VADDW, + ARM_INS_VAND, + ARM_INS_VBIC, + ARM_INS_VBIF, + ARM_INS_VBIT, + ARM_INS_VBSL, + ARM_INS_VCEQ, + ARM_INS_VCGE, + ARM_INS_VCGT, + ARM_INS_VCLE, + ARM_INS_VCLS, + ARM_INS_VCLT, + ARM_INS_VCLZ, + ARM_INS_VCMP, + ARM_INS_VCMPE, + ARM_INS_VCNT, + ARM_INS_VCVTA, + ARM_INS_VCVTB, + ARM_INS_VCVT, + ARM_INS_VCVTM, + ARM_INS_VCVTN, + ARM_INS_VCVTP, + ARM_INS_VCVTT, + ARM_INS_VDIV, + ARM_INS_VDUP, + ARM_INS_VEOR, + ARM_INS_VEXT, + ARM_INS_VFMA, + ARM_INS_VFMS, + ARM_INS_VFNMA, + ARM_INS_VFNMS, + ARM_INS_VHADD, + ARM_INS_VHSUB, + ARM_INS_VLD1, + ARM_INS_VLD2, + ARM_INS_VLD3, + ARM_INS_VLD4, + ARM_INS_VLDMDB, + ARM_INS_VLDMIA, + ARM_INS_VLDR, + ARM_INS_VMAXNM, + ARM_INS_VMAX, + ARM_INS_VMINNM, + ARM_INS_VMIN, + ARM_INS_VMLA, + ARM_INS_VMLAL, + ARM_INS_VMLS, + ARM_INS_VMLSL, + ARM_INS_VMOVL, + ARM_INS_VMOVN, + ARM_INS_VMSR, + ARM_INS_VMUL, + ARM_INS_VMULL, + ARM_INS_VMVN, + ARM_INS_VNEG, + ARM_INS_VNMLA, + ARM_INS_VNMLS, + ARM_INS_VNMUL, + ARM_INS_VORN, + ARM_INS_VORR, + ARM_INS_VPADAL, + ARM_INS_VPADDL, + ARM_INS_VPADD, + ARM_INS_VPMAX, + ARM_INS_VPMIN, + ARM_INS_VQABS, + ARM_INS_VQADD, + ARM_INS_VQDMLAL, + ARM_INS_VQDMLSL, + ARM_INS_VQDMULH, + ARM_INS_VQDMULL, + ARM_INS_VQMOVUN, + ARM_INS_VQMOVN, + ARM_INS_VQNEG, + ARM_INS_VQRDMULH, + ARM_INS_VQRSHL, + ARM_INS_VQRSHRN, + ARM_INS_VQRSHRUN, + ARM_INS_VQSHL, + ARM_INS_VQSHLU, + ARM_INS_VQSHRN, + ARM_INS_VQSHRUN, + ARM_INS_VQSUB, + ARM_INS_VRADDHN, + ARM_INS_VRECPE, + ARM_INS_VRECPS, + ARM_INS_VREV16, + ARM_INS_VREV32, + ARM_INS_VREV64, + ARM_INS_VRHADD, + ARM_INS_VRINTA, + ARM_INS_VRINTM, + ARM_INS_VRINTN, + ARM_INS_VRINTP, + ARM_INS_VRINTR, + ARM_INS_VRINTX, + ARM_INS_VRINTZ, + ARM_INS_VRSHL, + ARM_INS_VRSHRN, + ARM_INS_VRSHR, + ARM_INS_VRSQRTE, + ARM_INS_VRSQRTS, + ARM_INS_VRSRA, + ARM_INS_VRSUBHN, + ARM_INS_VSELEQ, + ARM_INS_VSELGE, + ARM_INS_VSELGT, + ARM_INS_VSELVS, + ARM_INS_VSHLL, + ARM_INS_VSHL, + ARM_INS_VSHRN, + ARM_INS_VSHR, + ARM_INS_VSLI, + ARM_INS_VSQRT, + ARM_INS_VSRA, + ARM_INS_VSRI, + ARM_INS_VST1, + ARM_INS_VST2, + ARM_INS_VST3, + ARM_INS_VST4, + ARM_INS_VSTMDB, + ARM_INS_VSTMIA, + ARM_INS_VSTR, + ARM_INS_VSUB, + ARM_INS_VSUBHN, + ARM_INS_VSUBL, + ARM_INS_VSUBW, + ARM_INS_VSWP, + ARM_INS_VTBL, + ARM_INS_VTBX, + ARM_INS_VCVTR, + ARM_INS_VTRN, + ARM_INS_VTST, + ARM_INS_VUZP, + ARM_INS_VZIP, + ARM_INS_ADDW, + ARM_INS_ASR, + ARM_INS_DCPS1, + ARM_INS_DCPS2, + ARM_INS_DCPS3, + ARM_INS_IT, + ARM_INS_LSL, + ARM_INS_LSR, + ARM_INS_ORN, + ARM_INS_ROR, + ARM_INS_RRX, + ARM_INS_SUBW, + ARM_INS_TBB, + ARM_INS_TBH, + ARM_INS_CBNZ, + ARM_INS_CBZ, + ARM_INS_POP, + ARM_INS_PUSH, + + // special instructions + ARM_INS_NOP, + ARM_INS_YIELD, + ARM_INS_WFE, + ARM_INS_WFI, + ARM_INS_SEV, + ARM_INS_SEVL, + ARM_INS_VPUSH, + ARM_INS_VPOP, + + ARM_INS_ENDING, // <-- mark the end of the list of instructions +} arm_insn; + +/// Group of ARM instructions +typedef enum arm_insn_group { + ARM_GRP_INVALID = 0, ///< = CS_GRP_INVALID + + // Generic groups + // all jump instructions (conditional+direct+indirect jumps) + ARM_GRP_JUMP, ///< = CS_GRP_JUMP + ARM_GRP_CALL, ///< = CS_GRP_CALL + ARM_GRP_INT = 4, ///< = CS_GRP_INT + ARM_GRP_PRIVILEGE = 6, ///< = CS_GRP_PRIVILEGE + ARM_GRP_BRANCH_RELATIVE, ///< = CS_GRP_BRANCH_RELATIVE + + // Architecture-specific groups + ARM_GRP_CRYPTO = 128, + ARM_GRP_DATABARRIER, + ARM_GRP_DIVIDE, + ARM_GRP_FPARMV8, + ARM_GRP_MULTPRO, + ARM_GRP_NEON, + ARM_GRP_T2EXTRACTPACK, + ARM_GRP_THUMB2DSP, + ARM_GRP_TRUSTZONE, + ARM_GRP_V4T, + ARM_GRP_V5T, + ARM_GRP_V5TE, + ARM_GRP_V6, + ARM_GRP_V6T2, + ARM_GRP_V7, + ARM_GRP_V8, + ARM_GRP_VFP2, + ARM_GRP_VFP3, + ARM_GRP_VFP4, + ARM_GRP_ARM, + ARM_GRP_MCLASS, + ARM_GRP_NOTMCLASS, + ARM_GRP_THUMB, + ARM_GRP_THUMB1ONLY, + ARM_GRP_THUMB2, + ARM_GRP_PREV8, + ARM_GRP_FPVMLX, + ARM_GRP_MULOPS, + ARM_GRP_CRC, + ARM_GRP_DPVFP, + ARM_GRP_V6M, + ARM_GRP_VIRTUALIZATION, + + ARM_GRP_ENDING, +} arm_insn_group; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/EDUReViver/include/capstone/arm64.h b/EDUReViver/include/capstone/arm64.h new file mode 100644 index 0000000..0309f30 --- /dev/null +++ b/EDUReViver/include/capstone/arm64.h @@ -0,0 +1,1164 @@ +#ifndef CAPSTONE_ARM64_H +#define CAPSTONE_ARM64_H + +/* Capstone Disassembly Engine */ +/* By Nguyen Anh Quynh , 2013-2015 */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "platform.h" + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +/// ARM64 shift type +typedef enum arm64_shifter { + ARM64_SFT_INVALID = 0, + ARM64_SFT_LSL = 1, + ARM64_SFT_MSL = 2, + ARM64_SFT_LSR = 3, + ARM64_SFT_ASR = 4, + ARM64_SFT_ROR = 5, +} arm64_shifter; + +/// ARM64 extender type +typedef enum arm64_extender { + ARM64_EXT_INVALID = 0, + ARM64_EXT_UXTB = 1, + ARM64_EXT_UXTH = 2, + ARM64_EXT_UXTW = 3, + ARM64_EXT_UXTX = 4, + ARM64_EXT_SXTB = 5, + ARM64_EXT_SXTH = 6, + ARM64_EXT_SXTW = 7, + ARM64_EXT_SXTX = 8, +} arm64_extender; + +/// ARM64 condition code +typedef enum arm64_cc { + ARM64_CC_INVALID = 0, + ARM64_CC_EQ = 1, ///< Equal + ARM64_CC_NE = 2, ///< Not equal: Not equal, or unordered + ARM64_CC_HS = 3, ///< Unsigned higher or same: >, ==, or unordered + ARM64_CC_LO = 4, ///< Unsigned lower or same: Less than + ARM64_CC_MI = 5, ///< Minus, negative: Less than + ARM64_CC_PL = 6, ///< Plus, positive or zero: >, ==, or unordered + ARM64_CC_VS = 7, ///< Overflow: Unordered + ARM64_CC_VC = 8, ///< No overflow: Ordered + ARM64_CC_HI = 9, ///< Unsigned higher: Greater than, or unordered + ARM64_CC_LS = 10, ///< Unsigned lower or same: Less than or equal + ARM64_CC_GE = 11, ///< Greater than or equal: Greater than or equal + ARM64_CC_LT = 12, ///< Less than: Less than, or unordered + ARM64_CC_GT = 13, ///< Signed greater than: Greater than + ARM64_CC_LE = 14, ///< Signed less than or equal: <, ==, or unordered + ARM64_CC_AL = 15, ///< Always (unconditional): Always (unconditional) + ARM64_CC_NV = 16, ///< Always (unconditional): Always (unconditional) + //< Note the NV exists purely to disassemble 0b1111. Execution + //< is "always". +} arm64_cc; + +/// System registers +typedef enum arm64_sysreg { + // System registers for MRS + ARM64_SYSREG_INVALID = 0, + ARM64_SYSREG_MDCCSR_EL0 = 0x9808, // 10 011 0000 0001 000 + ARM64_SYSREG_DBGDTRRX_EL0 = 0x9828, // 10 011 0000 0101 000 + ARM64_SYSREG_MDRAR_EL1 = 0x8080, // 10 000 0001 0000 000 + ARM64_SYSREG_OSLSR_EL1 = 0x808c, // 10 000 0001 0001 100 + ARM64_SYSREG_DBGAUTHSTATUS_EL1 = 0x83f6, // 10 000 0111 1110 110 + ARM64_SYSREG_PMCEID0_EL0 = 0xdce6, // 11 011 1001 1100 110 + ARM64_SYSREG_PMCEID1_EL0 = 0xdce7, // 11 011 1001 1100 111 + ARM64_SYSREG_MIDR_EL1 = 0xc000, // 11 000 0000 0000 000 + ARM64_SYSREG_CCSIDR_EL1 = 0xc800, // 11 001 0000 0000 000 + ARM64_SYSREG_CLIDR_EL1 = 0xc801, // 11 001 0000 0000 001 + ARM64_SYSREG_CTR_EL0 = 0xd801, // 11 011 0000 0000 001 + ARM64_SYSREG_MPIDR_EL1 = 0xc005, // 11 000 0000 0000 101 + ARM64_SYSREG_REVIDR_EL1 = 0xc006, // 11 000 0000 0000 110 + ARM64_SYSREG_AIDR_EL1 = 0xc807, // 11 001 0000 0000 111 + ARM64_SYSREG_DCZID_EL0 = 0xd807, // 11 011 0000 0000 111 + ARM64_SYSREG_ID_PFR0_EL1 = 0xc008, // 11 000 0000 0001 000 + ARM64_SYSREG_ID_PFR1_EL1 = 0xc009, // 11 000 0000 0001 001 + ARM64_SYSREG_ID_DFR0_EL1 = 0xc00a, // 11 000 0000 0001 010 + ARM64_SYSREG_ID_AFR0_EL1 = 0xc00b, // 11 000 0000 0001 011 + ARM64_SYSREG_ID_MMFR0_EL1 = 0xc00c, // 11 000 0000 0001 100 + ARM64_SYSREG_ID_MMFR1_EL1 = 0xc00d, // 11 000 0000 0001 101 + ARM64_SYSREG_ID_MMFR2_EL1 = 0xc00e, // 11 000 0000 0001 110 + ARM64_SYSREG_ID_MMFR3_EL1 = 0xc00f, // 11 000 0000 0001 111 + ARM64_SYSREG_ID_ISAR0_EL1 = 0xc010, // 11 000 0000 0010 000 + ARM64_SYSREG_ID_ISAR1_EL1 = 0xc011, // 11 000 0000 0010 001 + ARM64_SYSREG_ID_ISAR2_EL1 = 0xc012, // 11 000 0000 0010 010 + ARM64_SYSREG_ID_ISAR3_EL1 = 0xc013, // 11 000 0000 0010 011 + ARM64_SYSREG_ID_ISAR4_EL1 = 0xc014, // 11 000 0000 0010 100 + ARM64_SYSREG_ID_ISAR5_EL1 = 0xc015, // 11 000 0000 0010 101 + ARM64_SYSREG_ID_A64PFR0_EL1 = 0xc020, // 11 000 0000 0100 000 + ARM64_SYSREG_ID_A64PFR1_EL1 = 0xc021, // 11 000 0000 0100 001 + ARM64_SYSREG_ID_A64DFR0_EL1 = 0xc028, // 11 000 0000 0101 000 + ARM64_SYSREG_ID_A64DFR1_EL1 = 0xc029, // 11 000 0000 0101 001 + ARM64_SYSREG_ID_A64AFR0_EL1 = 0xc02c, // 11 000 0000 0101 100 + ARM64_SYSREG_ID_A64AFR1_EL1 = 0xc02d, // 11 000 0000 0101 101 + ARM64_SYSREG_ID_A64ISAR0_EL1 = 0xc030, // 11 000 0000 0110 000 + ARM64_SYSREG_ID_A64ISAR1_EL1 = 0xc031, // 11 000 0000 0110 001 + ARM64_SYSREG_ID_A64MMFR0_EL1 = 0xc038, // 11 000 0000 0111 000 + ARM64_SYSREG_ID_A64MMFR1_EL1 = 0xc039, // 11 000 0000 0111 001 + ARM64_SYSREG_MVFR0_EL1 = 0xc018, // 11 000 0000 0011 000 + ARM64_SYSREG_MVFR1_EL1 = 0xc019, // 11 000 0000 0011 001 + ARM64_SYSREG_MVFR2_EL1 = 0xc01a, // 11 000 0000 0011 010 + ARM64_SYSREG_RVBAR_EL1 = 0xc601, // 11 000 1100 0000 001 + ARM64_SYSREG_RVBAR_EL2 = 0xe601, // 11 100 1100 0000 001 + ARM64_SYSREG_RVBAR_EL3 = 0xf601, // 11 110 1100 0000 001 + ARM64_SYSREG_ISR_EL1 = 0xc608, // 11 000 1100 0001 000 + ARM64_SYSREG_CNTPCT_EL0 = 0xdf01, // 11 011 1110 0000 001 + ARM64_SYSREG_CNTVCT_EL0 = 0xdf02, // 11 011 1110 0000 010 + + // Trace registers + ARM64_SYSREG_TRCSTATR = 0x8818, // 10 001 0000 0011 000 + ARM64_SYSREG_TRCIDR8 = 0x8806, // 10 001 0000 0000 110 + ARM64_SYSREG_TRCIDR9 = 0x880e, // 10 001 0000 0001 110 + ARM64_SYSREG_TRCIDR10 = 0x8816, // 10 001 0000 0010 110 + ARM64_SYSREG_TRCIDR11 = 0x881e, // 10 001 0000 0011 110 + ARM64_SYSREG_TRCIDR12 = 0x8826, // 10 001 0000 0100 110 + ARM64_SYSREG_TRCIDR13 = 0x882e, // 10 001 0000 0101 110 + ARM64_SYSREG_TRCIDR0 = 0x8847, // 10 001 0000 1000 111 + ARM64_SYSREG_TRCIDR1 = 0x884f, // 10 001 0000 1001 111 + ARM64_SYSREG_TRCIDR2 = 0x8857, // 10 001 0000 1010 111 + ARM64_SYSREG_TRCIDR3 = 0x885f, // 10 001 0000 1011 111 + ARM64_SYSREG_TRCIDR4 = 0x8867, // 10 001 0000 1100 111 + ARM64_SYSREG_TRCIDR5 = 0x886f, // 10 001 0000 1101 111 + ARM64_SYSREG_TRCIDR6 = 0x8877, // 10 001 0000 1110 111 + ARM64_SYSREG_TRCIDR7 = 0x887f, // 10 001 0000 1111 111 + ARM64_SYSREG_TRCOSLSR = 0x888c, // 10 001 0001 0001 100 + ARM64_SYSREG_TRCPDSR = 0x88ac, // 10 001 0001 0101 100 + ARM64_SYSREG_TRCDEVAFF0 = 0x8bd6, // 10 001 0111 1010 110 + ARM64_SYSREG_TRCDEVAFF1 = 0x8bde, // 10 001 0111 1011 110 + ARM64_SYSREG_TRCLSR = 0x8bee, // 10 001 0111 1101 110 + ARM64_SYSREG_TRCAUTHSTATUS = 0x8bf6, // 10 001 0111 1110 110 + ARM64_SYSREG_TRCDEVARCH = 0x8bfe, // 10 001 0111 1111 110 + ARM64_SYSREG_TRCDEVID = 0x8b97, // 10 001 0111 0010 111 + ARM64_SYSREG_TRCDEVTYPE = 0x8b9f, // 10 001 0111 0011 111 + ARM64_SYSREG_TRCPIDR4 = 0x8ba7, // 10 001 0111 0100 111 + ARM64_SYSREG_TRCPIDR5 = 0x8baf, // 10 001 0111 0101 111 + ARM64_SYSREG_TRCPIDR6 = 0x8bb7, // 10 001 0111 0110 111 + ARM64_SYSREG_TRCPIDR7 = 0x8bbf, // 10 001 0111 0111 111 + ARM64_SYSREG_TRCPIDR0 = 0x8bc7, // 10 001 0111 1000 111 + ARM64_SYSREG_TRCPIDR1 = 0x8bcf, // 10 001 0111 1001 111 + ARM64_SYSREG_TRCPIDR2 = 0x8bd7, // 10 001 0111 1010 111 + ARM64_SYSREG_TRCPIDR3 = 0x8bdf, // 10 001 0111 1011 111 + ARM64_SYSREG_TRCCIDR0 = 0x8be7, // 10 001 0111 1100 111 + ARM64_SYSREG_TRCCIDR1 = 0x8bef, // 10 001 0111 1101 111 + ARM64_SYSREG_TRCCIDR2 = 0x8bf7, // 10 001 0111 1110 111 + ARM64_SYSREG_TRCCIDR3 = 0x8bff, // 10 001 0111 1111 111 + + // GICv3 registers + ARM64_SYSREG_ICC_IAR1_EL1 = 0xc660, // 11 000 1100 1100 000 + ARM64_SYSREG_ICC_IAR0_EL1 = 0xc640, // 11 000 1100 1000 000 + ARM64_SYSREG_ICC_HPPIR1_EL1 = 0xc662, // 11 000 1100 1100 010 + ARM64_SYSREG_ICC_HPPIR0_EL1 = 0xc642, // 11 000 1100 1000 010 + ARM64_SYSREG_ICC_RPR_EL1 = 0xc65b, // 11 000 1100 1011 011 + ARM64_SYSREG_ICH_VTR_EL2 = 0xe659, // 11 100 1100 1011 001 + ARM64_SYSREG_ICH_EISR_EL2 = 0xe65b, // 11 100 1100 1011 011 + ARM64_SYSREG_ICH_ELSR_EL2 = 0xe65d, // 11 100 1100 1011 101 +} arm64_sysreg; + +typedef enum arm64_msr_reg { + // System registers for MSR + ARM64_SYSREG_DBGDTRTX_EL0 = 0x9828, // 10 011 0000 0101 000 + ARM64_SYSREG_OSLAR_EL1 = 0x8084, // 10 000 0001 0000 100 + ARM64_SYSREG_PMSWINC_EL0 = 0xdce4, // 11 011 1001 1100 100 + + // Trace Registers + ARM64_SYSREG_TRCOSLAR = 0x8884, // 10 001 0001 0000 100 + ARM64_SYSREG_TRCLAR = 0x8be6, // 10 001 0111 1100 110 + + // GICv3 registers + ARM64_SYSREG_ICC_EOIR1_EL1 = 0xc661, // 11 000 1100 1100 001 + ARM64_SYSREG_ICC_EOIR0_EL1 = 0xc641, // 11 000 1100 1000 001 + ARM64_SYSREG_ICC_DIR_EL1 = 0xc659, // 11 000 1100 1011 001 + ARM64_SYSREG_ICC_SGI1R_EL1 = 0xc65d, // 11 000 1100 1011 101 + ARM64_SYSREG_ICC_ASGI1R_EL1 = 0xc65e, // 11 000 1100 1011 110 + ARM64_SYSREG_ICC_SGI0R_EL1 = 0xc65f, // 11 000 1100 1011 111 +} arm64_msr_reg; + +/// System PState Field (MSR instruction) +typedef enum arm64_pstate { + ARM64_PSTATE_INVALID = 0, + ARM64_PSTATE_SPSEL = 0x05, + ARM64_PSTATE_DAIFSET = 0x1e, + ARM64_PSTATE_DAIFCLR = 0x1f +} arm64_pstate; + +/// Vector arrangement specifier (for FloatingPoint/Advanced SIMD insn) +typedef enum arm64_vas { + ARM64_VAS_INVALID = 0, + ARM64_VAS_8B, + ARM64_VAS_16B, + ARM64_VAS_4H, + ARM64_VAS_8H, + ARM64_VAS_2S, + ARM64_VAS_4S, + ARM64_VAS_1D, + ARM64_VAS_2D, + ARM64_VAS_1Q, +} arm64_vas; + +/// Vector element size specifier +typedef enum arm64_vess { + ARM64_VESS_INVALID = 0, + ARM64_VESS_B, + ARM64_VESS_H, + ARM64_VESS_S, + ARM64_VESS_D, +} arm64_vess; + +/// Memory barrier operands +typedef enum arm64_barrier_op { + ARM64_BARRIER_INVALID = 0, + ARM64_BARRIER_OSHLD = 0x1, + ARM64_BARRIER_OSHST = 0x2, + ARM64_BARRIER_OSH = 0x3, + ARM64_BARRIER_NSHLD = 0x5, + ARM64_BARRIER_NSHST = 0x6, + ARM64_BARRIER_NSH = 0x7, + ARM64_BARRIER_ISHLD = 0x9, + ARM64_BARRIER_ISHST = 0xa, + ARM64_BARRIER_ISH = 0xb, + ARM64_BARRIER_LD = 0xd, + ARM64_BARRIER_ST = 0xe, + ARM64_BARRIER_SY = 0xf +} arm64_barrier_op; + +/// Operand type for instruction's operands +typedef enum arm64_op_type { + ARM64_OP_INVALID = 0, ///< = CS_OP_INVALID (Uninitialized). + ARM64_OP_REG, ///< = CS_OP_REG (Register operand). + ARM64_OP_IMM, ///< = CS_OP_IMM (Immediate operand). + ARM64_OP_MEM, ///< = CS_OP_MEM (Memory operand). + ARM64_OP_FP, ///< = CS_OP_FP (Floating-Point operand). + ARM64_OP_CIMM = 64, ///< C-Immediate + ARM64_OP_REG_MRS, ///< MRS register operand. + ARM64_OP_REG_MSR, ///< MSR register operand. + ARM64_OP_PSTATE, ///< PState operand. + ARM64_OP_SYS, ///< SYS operand for IC/DC/AT/TLBI instructions. + ARM64_OP_PREFETCH, ///< Prefetch operand (PRFM). + ARM64_OP_BARRIER, ///< Memory barrier operand (ISB/DMB/DSB instructions). +} arm64_op_type; + +/// TLBI operations +typedef enum arm64_tlbi_op { + ARM64_TLBI_INVALID = 0, + ARM64_TLBI_VMALLE1IS, + ARM64_TLBI_VAE1IS, + ARM64_TLBI_ASIDE1IS, + ARM64_TLBI_VAAE1IS, + ARM64_TLBI_VALE1IS, + ARM64_TLBI_VAALE1IS, + ARM64_TLBI_ALLE2IS, + ARM64_TLBI_VAE2IS, + ARM64_TLBI_ALLE1IS, + ARM64_TLBI_VALE2IS, + ARM64_TLBI_VMALLS12E1IS, + ARM64_TLBI_ALLE3IS, + ARM64_TLBI_VAE3IS, + ARM64_TLBI_VALE3IS, + ARM64_TLBI_IPAS2E1IS, + ARM64_TLBI_IPAS2LE1IS, + ARM64_TLBI_IPAS2E1, + ARM64_TLBI_IPAS2LE1, + ARM64_TLBI_VMALLE1, + ARM64_TLBI_VAE1, + ARM64_TLBI_ASIDE1, + ARM64_TLBI_VAAE1, + ARM64_TLBI_VALE1, + ARM64_TLBI_VAALE1, + ARM64_TLBI_ALLE2, + ARM64_TLBI_VAE2, + ARM64_TLBI_ALLE1, + ARM64_TLBI_VALE2, + ARM64_TLBI_VMALLS12E1, + ARM64_TLBI_ALLE3, + ARM64_TLBI_VAE3, + ARM64_TLBI_VALE3, +} arm64_tlbi_op; + +/// AT operations +typedef enum arm64_at_op { + ARM64_AT_S1E1R, + ARM64_AT_S1E1W, + ARM64_AT_S1E0R, + ARM64_AT_S1E0W, + ARM64_AT_S1E2R, + ARM64_AT_S1E2W, + ARM64_AT_S12E1R, + ARM64_AT_S12E1W, + ARM64_AT_S12E0R, + ARM64_AT_S12E0W, + ARM64_AT_S1E3R, + ARM64_AT_S1E3W, +} arm64_at_op; + +/// DC operations +typedef enum arm64_dc_op { + ARM64_DC_INVALID = 0, + ARM64_DC_ZVA, + ARM64_DC_IVAC, + ARM64_DC_ISW, + ARM64_DC_CVAC, + ARM64_DC_CSW, + ARM64_DC_CVAU, + ARM64_DC_CIVAC, + ARM64_DC_CISW, +} arm64_dc_op; + +/// IC operations +typedef enum arm64_ic_op { + ARM64_IC_INVALID = 0, + ARM64_IC_IALLUIS, + ARM64_IC_IALLU, + ARM64_IC_IVAU, +} arm64_ic_op; + +/// Prefetch operations (PRFM) +typedef enum arm64_prefetch_op { + ARM64_PRFM_INVALID = 0, + ARM64_PRFM_PLDL1KEEP = 0x00 + 1, + ARM64_PRFM_PLDL1STRM = 0x01 + 1, + ARM64_PRFM_PLDL2KEEP = 0x02 + 1, + ARM64_PRFM_PLDL2STRM = 0x03 + 1, + ARM64_PRFM_PLDL3KEEP = 0x04 + 1, + ARM64_PRFM_PLDL3STRM = 0x05 + 1, + ARM64_PRFM_PLIL1KEEP = 0x08 + 1, + ARM64_PRFM_PLIL1STRM = 0x09 + 1, + ARM64_PRFM_PLIL2KEEP = 0x0a + 1, + ARM64_PRFM_PLIL2STRM = 0x0b + 1, + ARM64_PRFM_PLIL3KEEP = 0x0c + 1, + ARM64_PRFM_PLIL3STRM = 0x0d + 1, + ARM64_PRFM_PSTL1KEEP = 0x10 + 1, + ARM64_PRFM_PSTL1STRM = 0x11 + 1, + ARM64_PRFM_PSTL2KEEP = 0x12 + 1, + ARM64_PRFM_PSTL2STRM = 0x13 + 1, + ARM64_PRFM_PSTL3KEEP = 0x14 + 1, + ARM64_PRFM_PSTL3STRM = 0x15 + 1, +} arm64_prefetch_op; + + +/// ARM64 registers +typedef enum arm64_reg { + ARM64_REG_INVALID = 0, + + ARM64_REG_X29, + ARM64_REG_X30, + ARM64_REG_NZCV, + ARM64_REG_SP, + ARM64_REG_WSP, + ARM64_REG_WZR, + ARM64_REG_XZR, + ARM64_REG_B0, + ARM64_REG_B1, + ARM64_REG_B2, + ARM64_REG_B3, + ARM64_REG_B4, + ARM64_REG_B5, + ARM64_REG_B6, + ARM64_REG_B7, + ARM64_REG_B8, + ARM64_REG_B9, + ARM64_REG_B10, + ARM64_REG_B11, + ARM64_REG_B12, + ARM64_REG_B13, + ARM64_REG_B14, + ARM64_REG_B15, + ARM64_REG_B16, + ARM64_REG_B17, + ARM64_REG_B18, + ARM64_REG_B19, + ARM64_REG_B20, + ARM64_REG_B21, + ARM64_REG_B22, + ARM64_REG_B23, + ARM64_REG_B24, + ARM64_REG_B25, + ARM64_REG_B26, + ARM64_REG_B27, + ARM64_REG_B28, + ARM64_REG_B29, + ARM64_REG_B30, + ARM64_REG_B31, + ARM64_REG_D0, + ARM64_REG_D1, + ARM64_REG_D2, + ARM64_REG_D3, + ARM64_REG_D4, + ARM64_REG_D5, + ARM64_REG_D6, + ARM64_REG_D7, + ARM64_REG_D8, + ARM64_REG_D9, + ARM64_REG_D10, + ARM64_REG_D11, + ARM64_REG_D12, + ARM64_REG_D13, + ARM64_REG_D14, + ARM64_REG_D15, + ARM64_REG_D16, + ARM64_REG_D17, + ARM64_REG_D18, + ARM64_REG_D19, + ARM64_REG_D20, + ARM64_REG_D21, + ARM64_REG_D22, + ARM64_REG_D23, + ARM64_REG_D24, + ARM64_REG_D25, + ARM64_REG_D26, + ARM64_REG_D27, + ARM64_REG_D28, + ARM64_REG_D29, + ARM64_REG_D30, + ARM64_REG_D31, + ARM64_REG_H0, + ARM64_REG_H1, + ARM64_REG_H2, + ARM64_REG_H3, + ARM64_REG_H4, + ARM64_REG_H5, + ARM64_REG_H6, + ARM64_REG_H7, + ARM64_REG_H8, + ARM64_REG_H9, + ARM64_REG_H10, + ARM64_REG_H11, + ARM64_REG_H12, + ARM64_REG_H13, + ARM64_REG_H14, + ARM64_REG_H15, + ARM64_REG_H16, + ARM64_REG_H17, + ARM64_REG_H18, + ARM64_REG_H19, + ARM64_REG_H20, + ARM64_REG_H21, + ARM64_REG_H22, + ARM64_REG_H23, + ARM64_REG_H24, + ARM64_REG_H25, + ARM64_REG_H26, + ARM64_REG_H27, + ARM64_REG_H28, + ARM64_REG_H29, + ARM64_REG_H30, + ARM64_REG_H31, + ARM64_REG_Q0, + ARM64_REG_Q1, + ARM64_REG_Q2, + ARM64_REG_Q3, + ARM64_REG_Q4, + ARM64_REG_Q5, + ARM64_REG_Q6, + ARM64_REG_Q7, + ARM64_REG_Q8, + ARM64_REG_Q9, + ARM64_REG_Q10, + ARM64_REG_Q11, + ARM64_REG_Q12, + ARM64_REG_Q13, + ARM64_REG_Q14, + ARM64_REG_Q15, + ARM64_REG_Q16, + ARM64_REG_Q17, + ARM64_REG_Q18, + ARM64_REG_Q19, + ARM64_REG_Q20, + ARM64_REG_Q21, + ARM64_REG_Q22, + ARM64_REG_Q23, + ARM64_REG_Q24, + ARM64_REG_Q25, + ARM64_REG_Q26, + ARM64_REG_Q27, + ARM64_REG_Q28, + ARM64_REG_Q29, + ARM64_REG_Q30, + ARM64_REG_Q31, + ARM64_REG_S0, + ARM64_REG_S1, + ARM64_REG_S2, + ARM64_REG_S3, + ARM64_REG_S4, + ARM64_REG_S5, + ARM64_REG_S6, + ARM64_REG_S7, + ARM64_REG_S8, + ARM64_REG_S9, + ARM64_REG_S10, + ARM64_REG_S11, + ARM64_REG_S12, + ARM64_REG_S13, + ARM64_REG_S14, + ARM64_REG_S15, + ARM64_REG_S16, + ARM64_REG_S17, + ARM64_REG_S18, + ARM64_REG_S19, + ARM64_REG_S20, + ARM64_REG_S21, + ARM64_REG_S22, + ARM64_REG_S23, + ARM64_REG_S24, + ARM64_REG_S25, + ARM64_REG_S26, + ARM64_REG_S27, + ARM64_REG_S28, + ARM64_REG_S29, + ARM64_REG_S30, + ARM64_REG_S31, + ARM64_REG_W0, + ARM64_REG_W1, + ARM64_REG_W2, + ARM64_REG_W3, + ARM64_REG_W4, + ARM64_REG_W5, + ARM64_REG_W6, + ARM64_REG_W7, + ARM64_REG_W8, + ARM64_REG_W9, + ARM64_REG_W10, + ARM64_REG_W11, + ARM64_REG_W12, + ARM64_REG_W13, + ARM64_REG_W14, + ARM64_REG_W15, + ARM64_REG_W16, + ARM64_REG_W17, + ARM64_REG_W18, + ARM64_REG_W19, + ARM64_REG_W20, + ARM64_REG_W21, + ARM64_REG_W22, + ARM64_REG_W23, + ARM64_REG_W24, + ARM64_REG_W25, + ARM64_REG_W26, + ARM64_REG_W27, + ARM64_REG_W28, + ARM64_REG_W29, + ARM64_REG_W30, + ARM64_REG_X0, + ARM64_REG_X1, + ARM64_REG_X2, + ARM64_REG_X3, + ARM64_REG_X4, + ARM64_REG_X5, + ARM64_REG_X6, + ARM64_REG_X7, + ARM64_REG_X8, + ARM64_REG_X9, + ARM64_REG_X10, + ARM64_REG_X11, + ARM64_REG_X12, + ARM64_REG_X13, + ARM64_REG_X14, + ARM64_REG_X15, + ARM64_REG_X16, + ARM64_REG_X17, + ARM64_REG_X18, + ARM64_REG_X19, + ARM64_REG_X20, + ARM64_REG_X21, + ARM64_REG_X22, + ARM64_REG_X23, + ARM64_REG_X24, + ARM64_REG_X25, + ARM64_REG_X26, + ARM64_REG_X27, + ARM64_REG_X28, + + ARM64_REG_V0, + ARM64_REG_V1, + ARM64_REG_V2, + ARM64_REG_V3, + ARM64_REG_V4, + ARM64_REG_V5, + ARM64_REG_V6, + ARM64_REG_V7, + ARM64_REG_V8, + ARM64_REG_V9, + ARM64_REG_V10, + ARM64_REG_V11, + ARM64_REG_V12, + ARM64_REG_V13, + ARM64_REG_V14, + ARM64_REG_V15, + ARM64_REG_V16, + ARM64_REG_V17, + ARM64_REG_V18, + ARM64_REG_V19, + ARM64_REG_V20, + ARM64_REG_V21, + ARM64_REG_V22, + ARM64_REG_V23, + ARM64_REG_V24, + ARM64_REG_V25, + ARM64_REG_V26, + ARM64_REG_V27, + ARM64_REG_V28, + ARM64_REG_V29, + ARM64_REG_V30, + ARM64_REG_V31, + + ARM64_REG_ENDING, // <-- mark the end of the list of registers + + // alias registers + + ARM64_REG_IP0 = ARM64_REG_X16, + ARM64_REG_IP1 = ARM64_REG_X17, + ARM64_REG_FP = ARM64_REG_X29, + ARM64_REG_LR = ARM64_REG_X30, +} arm64_reg; + +/// Instruction's operand referring to memory +/// This is associated with ARM64_OP_MEM operand type above +typedef struct arm64_op_mem { + arm64_reg base; ///< base register + arm64_reg index; ///< index register + int32_t disp; ///< displacement/offset value +} arm64_op_mem; + +/// Instruction operand +typedef struct cs_arm64_op { + int vector_index; ///< Vector Index for some vector operands (or -1 if irrelevant) + arm64_vas vas; ///< Vector Arrangement Specifier + arm64_vess vess; ///< Vector Element Size Specifier + struct { + arm64_shifter type; ///< shifter type of this operand + unsigned int value; ///< shifter value of this operand + } shift; + arm64_extender ext; ///< extender type of this operand + arm64_op_type type; ///< operand type + union { + arm64_reg reg; ///< register value for REG operand + int64_t imm; ///< immediate value, or index for C-IMM or IMM operand + double fp; ///< floating point value for FP operand + arm64_op_mem mem; ///< base/index/scale/disp value for MEM operand + arm64_pstate pstate; ///< PState field of MSR instruction. + unsigned int sys; ///< IC/DC/AT/TLBI operation (see arm64_ic_op, arm64_dc_op, arm64_at_op, arm64_tlbi_op) + arm64_prefetch_op prefetch; ///< PRFM operation. + arm64_barrier_op barrier; ///< Memory barrier operation (ISB/DMB/DSB instructions). + }; + + /// How is this operand accessed? (READ, WRITE or READ|WRITE) + /// This field is combined of cs_ac_type. + /// NOTE: this field is irrelevant if engine is compiled in DIET mode. + uint8_t access; +} cs_arm64_op; + +/// Instruction structure +typedef struct cs_arm64 { + arm64_cc cc; ///< conditional code for this insn + bool update_flags; ///< does this insn update flags? + bool writeback; ///< does this insn request writeback? 'True' means 'yes' + + /// Number of operands of this instruction, + /// or 0 when instruction has no operand. + uint8_t op_count; + + cs_arm64_op operands[8]; ///< operands for this instruction. +} cs_arm64; + +/// ARM64 instruction +typedef enum arm64_insn { + ARM64_INS_INVALID = 0, + + ARM64_INS_ABS, + ARM64_INS_ADC, + ARM64_INS_ADDHN, + ARM64_INS_ADDHN2, + ARM64_INS_ADDP, + ARM64_INS_ADD, + ARM64_INS_ADDV, + ARM64_INS_ADR, + ARM64_INS_ADRP, + ARM64_INS_AESD, + ARM64_INS_AESE, + ARM64_INS_AESIMC, + ARM64_INS_AESMC, + ARM64_INS_AND, + ARM64_INS_ASR, + ARM64_INS_B, + ARM64_INS_BFM, + ARM64_INS_BIC, + ARM64_INS_BIF, + ARM64_INS_BIT, + ARM64_INS_BL, + ARM64_INS_BLR, + ARM64_INS_BR, + ARM64_INS_BRK, + ARM64_INS_BSL, + ARM64_INS_CBNZ, + ARM64_INS_CBZ, + ARM64_INS_CCMN, + ARM64_INS_CCMP, + ARM64_INS_CLREX, + ARM64_INS_CLS, + ARM64_INS_CLZ, + ARM64_INS_CMEQ, + ARM64_INS_CMGE, + ARM64_INS_CMGT, + ARM64_INS_CMHI, + ARM64_INS_CMHS, + ARM64_INS_CMLE, + ARM64_INS_CMLT, + ARM64_INS_CMTST, + ARM64_INS_CNT, + ARM64_INS_MOV, + ARM64_INS_CRC32B, + ARM64_INS_CRC32CB, + ARM64_INS_CRC32CH, + ARM64_INS_CRC32CW, + ARM64_INS_CRC32CX, + ARM64_INS_CRC32H, + ARM64_INS_CRC32W, + ARM64_INS_CRC32X, + ARM64_INS_CSEL, + ARM64_INS_CSINC, + ARM64_INS_CSINV, + ARM64_INS_CSNEG, + ARM64_INS_DCPS1, + ARM64_INS_DCPS2, + ARM64_INS_DCPS3, + ARM64_INS_DMB, + ARM64_INS_DRPS, + ARM64_INS_DSB, + ARM64_INS_DUP, + ARM64_INS_EON, + ARM64_INS_EOR, + ARM64_INS_ERET, + ARM64_INS_EXTR, + ARM64_INS_EXT, + ARM64_INS_FABD, + ARM64_INS_FABS, + ARM64_INS_FACGE, + ARM64_INS_FACGT, + ARM64_INS_FADD, + ARM64_INS_FADDP, + ARM64_INS_FCCMP, + ARM64_INS_FCCMPE, + ARM64_INS_FCMEQ, + ARM64_INS_FCMGE, + ARM64_INS_FCMGT, + ARM64_INS_FCMLE, + ARM64_INS_FCMLT, + ARM64_INS_FCMP, + ARM64_INS_FCMPE, + ARM64_INS_FCSEL, + ARM64_INS_FCVTAS, + ARM64_INS_FCVTAU, + ARM64_INS_FCVT, + ARM64_INS_FCVTL, + ARM64_INS_FCVTL2, + ARM64_INS_FCVTMS, + ARM64_INS_FCVTMU, + ARM64_INS_FCVTNS, + ARM64_INS_FCVTNU, + ARM64_INS_FCVTN, + ARM64_INS_FCVTN2, + ARM64_INS_FCVTPS, + ARM64_INS_FCVTPU, + ARM64_INS_FCVTXN, + ARM64_INS_FCVTXN2, + ARM64_INS_FCVTZS, + ARM64_INS_FCVTZU, + ARM64_INS_FDIV, + ARM64_INS_FMADD, + ARM64_INS_FMAX, + ARM64_INS_FMAXNM, + ARM64_INS_FMAXNMP, + ARM64_INS_FMAXNMV, + ARM64_INS_FMAXP, + ARM64_INS_FMAXV, + ARM64_INS_FMIN, + ARM64_INS_FMINNM, + ARM64_INS_FMINNMP, + ARM64_INS_FMINNMV, + ARM64_INS_FMINP, + ARM64_INS_FMINV, + ARM64_INS_FMLA, + ARM64_INS_FMLS, + ARM64_INS_FMOV, + ARM64_INS_FMSUB, + ARM64_INS_FMUL, + ARM64_INS_FMULX, + ARM64_INS_FNEG, + ARM64_INS_FNMADD, + ARM64_INS_FNMSUB, + ARM64_INS_FNMUL, + ARM64_INS_FRECPE, + ARM64_INS_FRECPS, + ARM64_INS_FRECPX, + ARM64_INS_FRINTA, + ARM64_INS_FRINTI, + ARM64_INS_FRINTM, + ARM64_INS_FRINTN, + ARM64_INS_FRINTP, + ARM64_INS_FRINTX, + ARM64_INS_FRINTZ, + ARM64_INS_FRSQRTE, + ARM64_INS_FRSQRTS, + ARM64_INS_FSQRT, + ARM64_INS_FSUB, + ARM64_INS_HINT, + ARM64_INS_HLT, + ARM64_INS_HVC, + ARM64_INS_INS, + + ARM64_INS_ISB, + ARM64_INS_LD1, + ARM64_INS_LD1R, + ARM64_INS_LD2R, + ARM64_INS_LD2, + ARM64_INS_LD3R, + ARM64_INS_LD3, + ARM64_INS_LD4, + ARM64_INS_LD4R, + + ARM64_INS_LDARB, + ARM64_INS_LDARH, + ARM64_INS_LDAR, + ARM64_INS_LDAXP, + ARM64_INS_LDAXRB, + ARM64_INS_LDAXRH, + ARM64_INS_LDAXR, + ARM64_INS_LDNP, + ARM64_INS_LDP, + ARM64_INS_LDPSW, + ARM64_INS_LDRB, + ARM64_INS_LDR, + ARM64_INS_LDRH, + ARM64_INS_LDRSB, + ARM64_INS_LDRSH, + ARM64_INS_LDRSW, + ARM64_INS_LDTRB, + ARM64_INS_LDTRH, + ARM64_INS_LDTRSB, + + ARM64_INS_LDTRSH, + ARM64_INS_LDTRSW, + ARM64_INS_LDTR, + ARM64_INS_LDURB, + ARM64_INS_LDUR, + ARM64_INS_LDURH, + ARM64_INS_LDURSB, + ARM64_INS_LDURSH, + ARM64_INS_LDURSW, + ARM64_INS_LDXP, + ARM64_INS_LDXRB, + ARM64_INS_LDXRH, + ARM64_INS_LDXR, + ARM64_INS_LSL, + ARM64_INS_LSR, + ARM64_INS_MADD, + ARM64_INS_MLA, + ARM64_INS_MLS, + ARM64_INS_MOVI, + ARM64_INS_MOVK, + ARM64_INS_MOVN, + ARM64_INS_MOVZ, + ARM64_INS_MRS, + ARM64_INS_MSR, + ARM64_INS_MSUB, + ARM64_INS_MUL, + ARM64_INS_MVNI, + ARM64_INS_NEG, + ARM64_INS_NOT, + ARM64_INS_ORN, + ARM64_INS_ORR, + ARM64_INS_PMULL2, + ARM64_INS_PMULL, + ARM64_INS_PMUL, + ARM64_INS_PRFM, + ARM64_INS_PRFUM, + ARM64_INS_RADDHN, + ARM64_INS_RADDHN2, + ARM64_INS_RBIT, + ARM64_INS_RET, + ARM64_INS_REV16, + ARM64_INS_REV32, + ARM64_INS_REV64, + ARM64_INS_REV, + ARM64_INS_ROR, + ARM64_INS_RSHRN2, + ARM64_INS_RSHRN, + ARM64_INS_RSUBHN, + ARM64_INS_RSUBHN2, + ARM64_INS_SABAL2, + ARM64_INS_SABAL, + + ARM64_INS_SABA, + ARM64_INS_SABDL2, + ARM64_INS_SABDL, + ARM64_INS_SABD, + ARM64_INS_SADALP, + ARM64_INS_SADDLP, + ARM64_INS_SADDLV, + ARM64_INS_SADDL2, + ARM64_INS_SADDL, + ARM64_INS_SADDW2, + ARM64_INS_SADDW, + ARM64_INS_SBC, + ARM64_INS_SBFM, + ARM64_INS_SCVTF, + ARM64_INS_SDIV, + ARM64_INS_SHA1C, + ARM64_INS_SHA1H, + ARM64_INS_SHA1M, + ARM64_INS_SHA1P, + ARM64_INS_SHA1SU0, + ARM64_INS_SHA1SU1, + ARM64_INS_SHA256H2, + ARM64_INS_SHA256H, + ARM64_INS_SHA256SU0, + ARM64_INS_SHA256SU1, + ARM64_INS_SHADD, + ARM64_INS_SHLL2, + ARM64_INS_SHLL, + ARM64_INS_SHL, + ARM64_INS_SHRN2, + ARM64_INS_SHRN, + ARM64_INS_SHSUB, + ARM64_INS_SLI, + ARM64_INS_SMADDL, + ARM64_INS_SMAXP, + ARM64_INS_SMAXV, + ARM64_INS_SMAX, + ARM64_INS_SMC, + ARM64_INS_SMINP, + ARM64_INS_SMINV, + ARM64_INS_SMIN, + ARM64_INS_SMLAL2, + ARM64_INS_SMLAL, + ARM64_INS_SMLSL2, + ARM64_INS_SMLSL, + ARM64_INS_SMOV, + ARM64_INS_SMSUBL, + ARM64_INS_SMULH, + ARM64_INS_SMULL2, + ARM64_INS_SMULL, + ARM64_INS_SQABS, + ARM64_INS_SQADD, + ARM64_INS_SQDMLAL, + ARM64_INS_SQDMLAL2, + ARM64_INS_SQDMLSL, + ARM64_INS_SQDMLSL2, + ARM64_INS_SQDMULH, + ARM64_INS_SQDMULL, + ARM64_INS_SQDMULL2, + ARM64_INS_SQNEG, + ARM64_INS_SQRDMULH, + ARM64_INS_SQRSHL, + ARM64_INS_SQRSHRN, + ARM64_INS_SQRSHRN2, + ARM64_INS_SQRSHRUN, + ARM64_INS_SQRSHRUN2, + ARM64_INS_SQSHLU, + ARM64_INS_SQSHL, + ARM64_INS_SQSHRN, + ARM64_INS_SQSHRN2, + ARM64_INS_SQSHRUN, + ARM64_INS_SQSHRUN2, + ARM64_INS_SQSUB, + ARM64_INS_SQXTN2, + ARM64_INS_SQXTN, + ARM64_INS_SQXTUN2, + ARM64_INS_SQXTUN, + ARM64_INS_SRHADD, + ARM64_INS_SRI, + ARM64_INS_SRSHL, + ARM64_INS_SRSHR, + ARM64_INS_SRSRA, + ARM64_INS_SSHLL2, + ARM64_INS_SSHLL, + ARM64_INS_SSHL, + ARM64_INS_SSHR, + ARM64_INS_SSRA, + ARM64_INS_SSUBL2, + ARM64_INS_SSUBL, + ARM64_INS_SSUBW2, + ARM64_INS_SSUBW, + ARM64_INS_ST1, + ARM64_INS_ST2, + ARM64_INS_ST3, + ARM64_INS_ST4, + ARM64_INS_STLRB, + ARM64_INS_STLRH, + ARM64_INS_STLR, + ARM64_INS_STLXP, + ARM64_INS_STLXRB, + ARM64_INS_STLXRH, + ARM64_INS_STLXR, + ARM64_INS_STNP, + ARM64_INS_STP, + ARM64_INS_STRB, + ARM64_INS_STR, + ARM64_INS_STRH, + ARM64_INS_STTRB, + ARM64_INS_STTRH, + ARM64_INS_STTR, + ARM64_INS_STURB, + ARM64_INS_STUR, + ARM64_INS_STURH, + ARM64_INS_STXP, + ARM64_INS_STXRB, + ARM64_INS_STXRH, + ARM64_INS_STXR, + ARM64_INS_SUBHN, + ARM64_INS_SUBHN2, + ARM64_INS_SUB, + ARM64_INS_SUQADD, + ARM64_INS_SVC, + ARM64_INS_SYSL, + ARM64_INS_SYS, + ARM64_INS_TBL, + ARM64_INS_TBNZ, + ARM64_INS_TBX, + ARM64_INS_TBZ, + ARM64_INS_TRN1, + ARM64_INS_TRN2, + ARM64_INS_UABAL2, + ARM64_INS_UABAL, + ARM64_INS_UABA, + ARM64_INS_UABDL2, + ARM64_INS_UABDL, + ARM64_INS_UABD, + ARM64_INS_UADALP, + ARM64_INS_UADDLP, + ARM64_INS_UADDLV, + ARM64_INS_UADDL2, + ARM64_INS_UADDL, + ARM64_INS_UADDW2, + ARM64_INS_UADDW, + ARM64_INS_UBFM, + ARM64_INS_UCVTF, + ARM64_INS_UDIV, + ARM64_INS_UHADD, + ARM64_INS_UHSUB, + ARM64_INS_UMADDL, + ARM64_INS_UMAXP, + ARM64_INS_UMAXV, + ARM64_INS_UMAX, + ARM64_INS_UMINP, + ARM64_INS_UMINV, + ARM64_INS_UMIN, + ARM64_INS_UMLAL2, + ARM64_INS_UMLAL, + ARM64_INS_UMLSL2, + ARM64_INS_UMLSL, + ARM64_INS_UMOV, + ARM64_INS_UMSUBL, + ARM64_INS_UMULH, + ARM64_INS_UMULL2, + ARM64_INS_UMULL, + ARM64_INS_UQADD, + ARM64_INS_UQRSHL, + ARM64_INS_UQRSHRN, + ARM64_INS_UQRSHRN2, + ARM64_INS_UQSHL, + ARM64_INS_UQSHRN, + ARM64_INS_UQSHRN2, + ARM64_INS_UQSUB, + ARM64_INS_UQXTN2, + ARM64_INS_UQXTN, + ARM64_INS_URECPE, + ARM64_INS_URHADD, + ARM64_INS_URSHL, + ARM64_INS_URSHR, + ARM64_INS_URSQRTE, + ARM64_INS_URSRA, + ARM64_INS_USHLL2, + ARM64_INS_USHLL, + ARM64_INS_USHL, + ARM64_INS_USHR, + ARM64_INS_USQADD, + ARM64_INS_USRA, + ARM64_INS_USUBL2, + ARM64_INS_USUBL, + ARM64_INS_USUBW2, + ARM64_INS_USUBW, + ARM64_INS_UZP1, + ARM64_INS_UZP2, + ARM64_INS_XTN2, + ARM64_INS_XTN, + ARM64_INS_ZIP1, + ARM64_INS_ZIP2, + + // alias insn + ARM64_INS_MNEG, + ARM64_INS_UMNEGL, + ARM64_INS_SMNEGL, + ARM64_INS_NOP, + ARM64_INS_YIELD, + ARM64_INS_WFE, + ARM64_INS_WFI, + ARM64_INS_SEV, + ARM64_INS_SEVL, + ARM64_INS_NGC, + ARM64_INS_SBFIZ, + ARM64_INS_UBFIZ, + ARM64_INS_SBFX, + ARM64_INS_UBFX, + ARM64_INS_BFI, + ARM64_INS_BFXIL, + ARM64_INS_CMN, + ARM64_INS_MVN, + ARM64_INS_TST, + ARM64_INS_CSET, + ARM64_INS_CINC, + ARM64_INS_CSETM, + ARM64_INS_CINV, + ARM64_INS_CNEG, + ARM64_INS_SXTB, + ARM64_INS_SXTH, + ARM64_INS_SXTW, + ARM64_INS_CMP, + ARM64_INS_UXTB, + ARM64_INS_UXTH, + ARM64_INS_UXTW, + ARM64_INS_IC, + ARM64_INS_DC, + ARM64_INS_AT, + ARM64_INS_TLBI, + + ARM64_INS_NEGS, + ARM64_INS_NGCS, + + ARM64_INS_ENDING, // <-- mark the end of the list of insn +} arm64_insn; + +/// Group of ARM64 instructions +typedef enum arm64_insn_group { + ARM64_GRP_INVALID = 0, ///< = CS_GRP_INVALID + + // Generic groups + // all jump instructions (conditional+direct+indirect jumps) + ARM64_GRP_JUMP, ///< = CS_GRP_JUMP + ARM64_GRP_CALL, + ARM64_GRP_RET, + ARM64_GRP_INT, + ARM64_GRP_PRIVILEGE = 6, ///< = CS_GRP_PRIVILEGE + ARM64_GRP_BRANCH_RELATIVE, ///< = CS_GRP_BRANCH_RELATIVE + + // Architecture-specific groups + ARM64_GRP_CRYPTO = 128, + ARM64_GRP_FPARMV8, + ARM64_GRP_NEON, + ARM64_GRP_CRC, + + ARM64_GRP_ENDING, // <-- mark the end of the list of groups +} arm64_insn_group; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/EDUReViver/include/capstone/capstone.h b/EDUReViver/include/capstone/capstone.h new file mode 100644 index 0000000..b6db82d --- /dev/null +++ b/EDUReViver/include/capstone/capstone.h @@ -0,0 +1,766 @@ +#ifndef CAPSTONE_ENGINE_H +#define CAPSTONE_ENGINE_H + +/* Capstone Disassembly Engine */ +/* By Nguyen Anh Quynh , 2013-2016 */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#if defined(CAPSTONE_HAS_OSXKERNEL) +#include +#else +#include +#include +#endif + +#include "platform.h" + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#pragma warning(disable:4100) +#define CAPSTONE_API __cdecl +#ifdef CAPSTONE_SHARED +#define CAPSTONE_EXPORT __declspec(dllexport) +#else // defined(CAPSTONE_STATIC) +#define CAPSTONE_EXPORT +#endif +#else +#define CAPSTONE_API +#if defined(__GNUC__) && !defined(CAPSTONE_STATIC) +#define CAPSTONE_EXPORT __attribute__((visibility("default"))) +#else // defined(CAPSTONE_STATIC) +#define CAPSTONE_EXPORT +#endif +#endif + +#ifdef __GNUC__ +#define CAPSTONE_DEPRECATED __attribute__((deprecated)) +#elif defined(_MSC_VER) +#define CAPSTONE_DEPRECATED __declspec(deprecated) +#else +#pragma message("WARNING: You need to implement CAPSTONE_DEPRECATED for this compiler") +#define CAPSTONE_DEPRECATED +#endif + +// Capstone API version +#define CS_API_MAJOR 4 +#define CS_API_MINOR 0 + +// Version for bleeding edge code of the Github's "next" branch. +// Use this if you want the absolutely latest development code. +// This version number will be bumped up whenever we have a new major change. +#define CS_NEXT_VERSION 5 + +// Capstone package version +#define CS_VERSION_MAJOR CS_API_MAJOR +#define CS_VERSION_MINOR CS_API_MINOR +#define CS_VERSION_EXTRA 1 + +/// Macro to create combined version which can be compared to +/// result of cs_version() API. +#define CS_MAKE_VERSION(major, minor) ((major << 8) + minor) + +/// Maximum size of an instruction mnemonic string. +#define CS_MNEMONIC_SIZE 32 + +// Handle using with all API +typedef size_t csh; + +/// Architecture type +typedef enum cs_arch { + CS_ARCH_ARM = 0, ///< ARM architecture (including Thumb, Thumb-2) + CS_ARCH_ARM64, ///< ARM-64, also called AArch64 + CS_ARCH_MIPS, ///< Mips architecture + CS_ARCH_X86, ///< X86 architecture (including x86 & x86-64) + CS_ARCH_PPC, ///< PowerPC architecture + CS_ARCH_SPARC, ///< Sparc architecture + CS_ARCH_SYSZ, ///< SystemZ architecture + CS_ARCH_XCORE, ///< XCore architecture + CS_ARCH_M68K, ///< 68K architecture + CS_ARCH_TMS320C64X, ///< TMS320C64x architecture + CS_ARCH_M680X, ///< 680X architecture + CS_ARCH_EVM, ///< Ethereum architecture + CS_ARCH_MAX, + CS_ARCH_ALL = 0xFFFF, // All architectures - for cs_support() +} cs_arch; + +// Support value to verify diet mode of the engine. +// If cs_support(CS_SUPPORT_DIET) return True, the engine was compiled +// in diet mode. +#define CS_SUPPORT_DIET (CS_ARCH_ALL + 1) + +// Support value to verify X86 reduce mode of the engine. +// If cs_support(CS_SUPPORT_X86_REDUCE) return True, the engine was compiled +// in X86 reduce mode. +#define CS_SUPPORT_X86_REDUCE (CS_ARCH_ALL + 2) + +/// Mode type +typedef enum cs_mode { + CS_MODE_LITTLE_ENDIAN = 0, ///< little-endian mode (default mode) + CS_MODE_ARM = 0, ///< 32-bit ARM + CS_MODE_16 = 1 << 1, ///< 16-bit mode (X86) + CS_MODE_32 = 1 << 2, ///< 32-bit mode (X86) + CS_MODE_64 = 1 << 3, ///< 64-bit mode (X86, PPC) + CS_MODE_THUMB = 1 << 4, ///< ARM's Thumb mode, including Thumb-2 + CS_MODE_MCLASS = 1 << 5, ///< ARM's Cortex-M series + CS_MODE_V8 = 1 << 6, ///< ARMv8 A32 encodings for ARM + CS_MODE_MICRO = 1 << 4, ///< MicroMips mode (MIPS) + CS_MODE_MIPS3 = 1 << 5, ///< Mips III ISA + CS_MODE_MIPS32R6 = 1 << 6, ///< Mips32r6 ISA + CS_MODE_MIPS2 = 1 << 7, ///< Mips II ISA + CS_MODE_V9 = 1 << 4, ///< SparcV9 mode (Sparc) + CS_MODE_QPX = 1 << 4, ///< Quad Processing eXtensions mode (PPC) + CS_MODE_M68K_000 = 1 << 1, ///< M68K 68000 mode + CS_MODE_M68K_010 = 1 << 2, ///< M68K 68010 mode + CS_MODE_M68K_020 = 1 << 3, ///< M68K 68020 mode + CS_MODE_M68K_030 = 1 << 4, ///< M68K 68030 mode + CS_MODE_M68K_040 = 1 << 5, ///< M68K 68040 mode + CS_MODE_M68K_060 = 1 << 6, ///< M68K 68060 mode + CS_MODE_BIG_ENDIAN = 1 << 31, ///< big-endian mode + CS_MODE_MIPS32 = CS_MODE_32, ///< Mips32 ISA (Mips) + CS_MODE_MIPS64 = CS_MODE_64, ///< Mips64 ISA (Mips) + CS_MODE_M680X_6301 = 1 << 1, ///< M680X Hitachi 6301,6303 mode + CS_MODE_M680X_6309 = 1 << 2, ///< M680X Hitachi 6309 mode + CS_MODE_M680X_6800 = 1 << 3, ///< M680X Motorola 6800,6802 mode + CS_MODE_M680X_6801 = 1 << 4, ///< M680X Motorola 6801,6803 mode + CS_MODE_M680X_6805 = 1 << 5, ///< M680X Motorola/Freescale 6805 mode + CS_MODE_M680X_6808 = 1 << 6, ///< M680X Motorola/Freescale/NXP 68HC08 mode + CS_MODE_M680X_6809 = 1 << 7, ///< M680X Motorola 6809 mode + CS_MODE_M680X_6811 = 1 << 8, ///< M680X Motorola/Freescale/NXP 68HC11 mode + CS_MODE_M680X_CPU12 = 1 << 9, ///< M680X Motorola/Freescale/NXP CPU12 + ///< used on M68HC12/HCS12 + CS_MODE_M680X_HCS08 = 1 << 10, ///< M680X Freescale/NXP HCS08 mode +} cs_mode; + +typedef void* (CAPSTONE_API *cs_malloc_t)(size_t size); +typedef void* (CAPSTONE_API *cs_calloc_t)(size_t nmemb, size_t size); +typedef void* (CAPSTONE_API *cs_realloc_t)(void *ptr, size_t size); +typedef void (CAPSTONE_API *cs_free_t)(void *ptr); +typedef int (CAPSTONE_API *cs_vsnprintf_t)(char *str, size_t size, const char *format, va_list ap); + + +/// User-defined dynamic memory related functions: malloc/calloc/realloc/free/vsnprintf() +/// By default, Capstone uses system's malloc(), calloc(), realloc(), free() & vsnprintf(). +typedef struct cs_opt_mem { + cs_malloc_t malloc; + cs_calloc_t calloc; + cs_realloc_t realloc; + cs_free_t free; + cs_vsnprintf_t vsnprintf; +} cs_opt_mem; + +/// Customize mnemonic for instructions with alternative name. +/// To reset existing customized instruction to its default mnemonic, +/// call cs_option(CS_OPT_MNEMONIC) again with the same @id and NULL value +/// for @mnemonic. +typedef struct cs_opt_mnem { + /// ID of instruction to be customized. + unsigned int id; + /// Customized instruction mnemonic. + const char *mnemonic; +} cs_opt_mnem; + +/// Runtime option for the disassembled engine +typedef enum cs_opt_type { + CS_OPT_INVALID = 0, ///< No option specified + CS_OPT_SYNTAX, ///< Assembly output syntax + CS_OPT_DETAIL, ///< Break down instruction structure into details + CS_OPT_MODE, ///< Change engine's mode at run-time + CS_OPT_MEM, ///< User-defined dynamic memory related functions + CS_OPT_SKIPDATA, ///< Skip data when disassembling. Then engine is in SKIPDATA mode. + CS_OPT_SKIPDATA_SETUP, ///< Setup user-defined function for SKIPDATA option + CS_OPT_MNEMONIC, ///< Customize instruction mnemonic + CS_OPT_UNSIGNED, ///< print immediate operands in unsigned form +} cs_opt_type; + +/// Runtime option value (associated with option type above) +typedef enum cs_opt_value { + CS_OPT_OFF = 0, ///< Turn OFF an option - default for CS_OPT_DETAIL, CS_OPT_SKIPDATA, CS_OPT_UNSIGNED. + CS_OPT_ON = 3, ///< Turn ON an option (CS_OPT_DETAIL, CS_OPT_SKIPDATA). + CS_OPT_SYNTAX_DEFAULT = 0, ///< Default asm syntax (CS_OPT_SYNTAX). + CS_OPT_SYNTAX_INTEL, ///< X86 Intel asm syntax - default on X86 (CS_OPT_SYNTAX). + CS_OPT_SYNTAX_ATT, ///< X86 ATT asm syntax (CS_OPT_SYNTAX). + CS_OPT_SYNTAX_NOREGNAME, ///< Prints register name with only number (CS_OPT_SYNTAX) + CS_OPT_SYNTAX_MASM, ///< X86 Intel Masm syntax (CS_OPT_SYNTAX). +} cs_opt_value; + +/// Common instruction operand types - to be consistent across all architectures. +typedef enum cs_op_type { + CS_OP_INVALID = 0, ///< uninitialized/invalid operand. + CS_OP_REG, ///< Register operand. + CS_OP_IMM, ///< Immediate operand. + CS_OP_MEM, ///< Memory operand. + CS_OP_FP, ///< Floating-Point operand. +} cs_op_type; + +/// Common instruction operand access types - to be consistent across all architectures. +/// It is possible to combine access types, for example: CS_AC_READ | CS_AC_WRITE +typedef enum cs_ac_type { + CS_AC_INVALID = 0, ///< Uninitialized/invalid access type. + CS_AC_READ = 1 << 0, ///< Operand read from memory or register. + CS_AC_WRITE = 1 << 1, ///< Operand write to memory or register. +} cs_ac_type; + +/// Common instruction groups - to be consistent across all architectures. +typedef enum cs_group_type { + CS_GRP_INVALID = 0, ///< uninitialized/invalid group. + CS_GRP_JUMP, ///< all jump instructions (conditional+direct+indirect jumps) + CS_GRP_CALL, ///< all call instructions + CS_GRP_RET, ///< all return instructions + CS_GRP_INT, ///< all interrupt instructions (int+syscall) + CS_GRP_IRET, ///< all interrupt return instructions + CS_GRP_PRIVILEGE, ///< all privileged instructions + CS_GRP_BRANCH_RELATIVE, ///< all relative branching instructions +} cs_group_type; + +/** + User-defined callback function for SKIPDATA option. + See tests/test_skipdata.c for sample code demonstrating this API. + + @code: the input buffer containing code to be disassembled. + This is the same buffer passed to cs_disasm(). + @code_size: size (in bytes) of the above @code buffer. + @offset: the position of the currently-examining byte in the input + buffer @code mentioned above. + @user_data: user-data passed to cs_option() via @user_data field in + cs_opt_skipdata struct below. + + @return: return number of bytes to skip, or 0 to immediately stop disassembling. +*/ +typedef size_t (CAPSTONE_API *cs_skipdata_cb_t)(const uint8_t *code, size_t code_size, size_t offset, void *user_data); + +/// User-customized setup for SKIPDATA option +typedef struct cs_opt_skipdata { + /// Capstone considers data to skip as special "instructions". + /// User can specify the string for this instruction's "mnemonic" here. + /// By default (if @mnemonic is NULL), Capstone use ".byte". + const char *mnemonic; + + /// User-defined callback function to be called when Capstone hits data. + /// If the returned value from this callback is positive (>0), Capstone + /// will skip exactly that number of bytes & continue. Otherwise, if + /// the callback returns 0, Capstone stops disassembling and returns + /// immediately from cs_disasm() + /// NOTE: if this callback pointer is NULL, Capstone would skip a number + /// of bytes depending on architectures, as following: + /// Arm: 2 bytes (Thumb mode) or 4 bytes. + /// Arm64: 4 bytes. + /// Mips: 4 bytes. + /// M680x: 1 byte. + /// PowerPC: 4 bytes. + /// Sparc: 4 bytes. + /// SystemZ: 2 bytes. + /// X86: 1 bytes. + /// XCore: 2 bytes. + /// EVM: 1 bytes. + cs_skipdata_cb_t callback; // default value is NULL + + /// User-defined data to be passed to @callback function pointer. + void *user_data; +} cs_opt_skipdata; + + +#include "arm.h" +#include "arm64.h" +#include "m68k.h" +#include "mips.h" +#include "ppc.h" +#include "sparc.h" +#include "systemz.h" +#include "x86.h" +#include "xcore.h" +#include "tms320c64x.h" +#include "m680x.h" +#include "evm.h" + +/// NOTE: All information in cs_detail is only available when CS_OPT_DETAIL = CS_OPT_ON +/// Initialized as memset(., 0, offsetof(cs_detail, ARCH)+sizeof(cs_ARCH)) +/// by ARCH_getInstruction in arch/ARCH/ARCHDisassembler.c +/// if cs_detail changes, in particular if a field is added after the union, +/// then update arch/ARCH/ARCHDisassembler.c accordingly +typedef struct cs_detail { + uint16_t regs_read[12]; ///< list of implicit registers read by this insn + uint8_t regs_read_count; ///< number of implicit registers read by this insn + + uint16_t regs_write[20]; ///< list of implicit registers modified by this insn + uint8_t regs_write_count; ///< number of implicit registers modified by this insn + + uint8_t groups[8]; ///< list of group this instruction belong to + uint8_t groups_count; ///< number of groups this insn belongs to + + /// Architecture-specific instruction info + union { + cs_x86 x86; ///< X86 architecture, including 16-bit, 32-bit & 64-bit mode + cs_arm64 arm64; ///< ARM64 architecture (aka AArch64) + cs_arm arm; ///< ARM architecture (including Thumb/Thumb2) + cs_m68k m68k; ///< M68K architecture + cs_mips mips; ///< MIPS architecture + cs_ppc ppc; ///< PowerPC architecture + cs_sparc sparc; ///< Sparc architecture + cs_sysz sysz; ///< SystemZ architecture + cs_xcore xcore; ///< XCore architecture + cs_tms320c64x tms320c64x; ///< TMS320C64x architecture + cs_m680x m680x; ///< M680X architecture + cs_evm evm; ///< Ethereum architecture + }; +} cs_detail; + +/// Detail information of disassembled instruction +typedef struct cs_insn { + /// Instruction ID (basically a numeric ID for the instruction mnemonic) + /// Find the instruction id in the '[ARCH]_insn' enum in the header file + /// of corresponding architecture, such as 'arm_insn' in arm.h for ARM, + /// 'x86_insn' in x86.h for X86, etc... + /// This information is available even when CS_OPT_DETAIL = CS_OPT_OFF + /// NOTE: in Skipdata mode, "data" instruction has 0 for this id field. + unsigned int id; + + /// Address (EIP) of this instruction + /// This information is available even when CS_OPT_DETAIL = CS_OPT_OFF + uint64_t address; + + /// Size of this instruction + /// This information is available even when CS_OPT_DETAIL = CS_OPT_OFF + uint16_t size; + + /// Machine bytes of this instruction, with number of bytes indicated by @size above + /// This information is available even when CS_OPT_DETAIL = CS_OPT_OFF + uint8_t bytes[16]; + + /// Ascii text of instruction mnemonic + /// This information is available even when CS_OPT_DETAIL = CS_OPT_OFF + char mnemonic[CS_MNEMONIC_SIZE]; + + /// Ascii text of instruction operands + /// This information is available even when CS_OPT_DETAIL = CS_OPT_OFF + char op_str[160]; + + /// Pointer to cs_detail. + /// NOTE: detail pointer is only valid when both requirements below are met: + /// (1) CS_OP_DETAIL = CS_OPT_ON + /// (2) Engine is not in Skipdata mode (CS_OP_SKIPDATA option set to CS_OPT_ON) + /// + /// NOTE 2: when in Skipdata mode, or when detail mode is OFF, even if this pointer + /// is not NULL, its content is still irrelevant. + cs_detail *detail; +} cs_insn; + + +/// Calculate the offset of a disassembled instruction in its buffer, given its position +/// in its array of disassembled insn +/// NOTE: this macro works with position (>=1), not index +#define CS_INSN_OFFSET(insns, post) (insns[post - 1].address - insns[0].address) + + +/// All type of errors encountered by Capstone API. +/// These are values returned by cs_errno() +typedef enum cs_err { + CS_ERR_OK = 0, ///< No error: everything was fine + CS_ERR_MEM, ///< Out-Of-Memory error: cs_open(), cs_disasm(), cs_disasm_iter() + CS_ERR_ARCH, ///< Unsupported architecture: cs_open() + CS_ERR_HANDLE, ///< Invalid handle: cs_op_count(), cs_op_index() + CS_ERR_CSH, ///< Invalid csh argument: cs_close(), cs_errno(), cs_option() + CS_ERR_MODE, ///< Invalid/unsupported mode: cs_open() + CS_ERR_OPTION, ///< Invalid/unsupported option: cs_option() + CS_ERR_DETAIL, ///< Information is unavailable because detail option is OFF + CS_ERR_MEMSETUP, ///< Dynamic memory management uninitialized (see CS_OPT_MEM) + CS_ERR_VERSION, ///< Unsupported version (bindings) + CS_ERR_DIET, ///< Access irrelevant data in "diet" engine + CS_ERR_SKIPDATA, ///< Access irrelevant data for "data" instruction in SKIPDATA mode + CS_ERR_X86_ATT, ///< X86 AT&T syntax is unsupported (opt-out at compile time) + CS_ERR_X86_INTEL, ///< X86 Intel syntax is unsupported (opt-out at compile time) + CS_ERR_X86_MASM, ///< X86 Intel syntax is unsupported (opt-out at compile time) +} cs_err; + +/** + Return combined API version & major and minor version numbers. + + @major: major number of API version + @minor: minor number of API version + + @return hexical number as (major << 8 | minor), which encodes both + major & minor versions. + NOTE: This returned value can be compared with version number made + with macro CS_MAKE_VERSION + + For example, second API version would return 1 in @major, and 1 in @minor + The return value would be 0x0101 + + NOTE: if you only care about returned value, but not major and minor values, + set both @major & @minor arguments to NULL. +*/ +CAPSTONE_EXPORT +unsigned int CAPSTONE_API cs_version(int *major, int *minor); + + +/** + This API can be used to either ask for archs supported by this library, + or check to see if the library was compile with 'diet' option (or called + in 'diet' mode). + + To check if a particular arch is supported by this library, set @query to + arch mode (CS_ARCH_* value). + To verify if this library supports all the archs, use CS_ARCH_ALL. + + To check if this library is in 'diet' mode, set @query to CS_SUPPORT_DIET. + + @return True if this library supports the given arch, or in 'diet' mode. +*/ +CAPSTONE_EXPORT +bool CAPSTONE_API cs_support(int query); + +/** + Initialize CS handle: this must be done before any usage of CS. + + @arch: architecture type (CS_ARCH_*) + @mode: hardware mode. This is combined of CS_MODE_* + @handle: pointer to handle, which will be updated at return time + + @return CS_ERR_OK on success, or other value on failure (refer to cs_err enum + for detailed error). +*/ +CAPSTONE_EXPORT +cs_err CAPSTONE_API cs_open(cs_arch arch, cs_mode mode, csh *handle); + +/** + Close CS handle: MUST do to release the handle when it is not used anymore. + NOTE: this must be only called when there is no longer usage of Capstone, + not even access to cs_insn array. The reason is the this API releases some + cached memory, thus access to any Capstone API after cs_close() might crash + your application. + + In fact,this API invalidate @handle by ZERO out its value (i.e *handle = 0). + + @handle: pointer to a handle returned by cs_open() + + @return CS_ERR_OK on success, or other value on failure (refer to cs_err enum + for detailed error). +*/ +CAPSTONE_EXPORT +cs_err CAPSTONE_API cs_close(csh *handle); + +/** + Set option for disassembling engine at runtime + + @handle: handle returned by cs_open() + @type: type of option to be set + @value: option value corresponding with @type + + @return: CS_ERR_OK on success, or other value on failure. + Refer to cs_err enum for detailed error. + + NOTE: in the case of CS_OPT_MEM, handle's value can be anything, + so that cs_option(handle, CS_OPT_MEM, value) can (i.e must) be called + even before cs_open() +*/ +CAPSTONE_EXPORT +cs_err CAPSTONE_API cs_option(csh handle, cs_opt_type type, size_t value); + +/** + Report the last error number when some API function fail. + Like glibc's errno, cs_errno might not retain its old value once accessed. + + @handle: handle returned by cs_open() + + @return: error code of cs_err enum type (CS_ERR_*, see above) +*/ +CAPSTONE_EXPORT +cs_err CAPSTONE_API cs_errno(csh handle); + + +/** + Return a string describing given error code. + + @code: error code (see CS_ERR_* above) + + @return: returns a pointer to a string that describes the error code + passed in the argument @code +*/ +CAPSTONE_EXPORT +const char * CAPSTONE_API cs_strerror(cs_err code); + +/** + Disassemble binary code, given the code buffer, size, address and number + of instructions to be decoded. + This API dynamically allocate memory to contain disassembled instruction. + Resulting instructions will be put into @*insn + + NOTE 1: this API will automatically determine memory needed to contain + output disassembled instructions in @insn. + + NOTE 2: caller must free the allocated memory itself to avoid memory leaking. + + NOTE 3: for system with scarce memory to be dynamically allocated such as + OS kernel or firmware, the API cs_disasm_iter() might be a better choice than + cs_disasm(). The reason is that with cs_disasm(), based on limited available + memory, we have to calculate in advance how many instructions to be disassembled, + which complicates things. This is especially troublesome for the case @count=0, + when cs_disasm() runs uncontrollably (until either end of input buffer, or + when it encounters an invalid instruction). + + @handle: handle returned by cs_open() + @code: buffer containing raw binary code to be disassembled. + @code_size: size of the above code buffer. + @address: address of the first instruction in given raw code buffer. + @insn: array of instructions filled in by this API. + NOTE: @insn will be allocated by this function, and should be freed + with cs_free() API. + @count: number of instructions to be disassembled, or 0 to get all of them + + @return: the number of successfully disassembled instructions, + or 0 if this function failed to disassemble the given code + + On failure, call cs_errno() for error code. +*/ +CAPSTONE_EXPORT +size_t CAPSTONE_API cs_disasm(csh handle, + const uint8_t *code, size_t code_size, + uint64_t address, + size_t count, + cs_insn **insn); + +/** + Deprecated function - to be retired in the next version! + Use cs_disasm() instead of cs_disasm_ex() +*/ +CAPSTONE_EXPORT +CAPSTONE_DEPRECATED +size_t CAPSTONE_API cs_disasm_ex(csh handle, + const uint8_t *code, size_t code_size, + uint64_t address, + size_t count, + cs_insn **insn); + +/** + Free memory allocated by cs_malloc() or cs_disasm() (argument @insn) + + @insn: pointer returned by @insn argument in cs_disasm() or cs_malloc() + @count: number of cs_insn structures returned by cs_disasm(), or 1 + to free memory allocated by cs_malloc(). +*/ +CAPSTONE_EXPORT +void CAPSTONE_API cs_free(cs_insn *insn, size_t count); + + +/** + Allocate memory for 1 instruction to be used by cs_disasm_iter(). + + @handle: handle returned by cs_open() + + NOTE: when no longer in use, you can reclaim the memory allocated for + this instruction with cs_free(insn, 1) +*/ +CAPSTONE_EXPORT +cs_insn * CAPSTONE_API cs_malloc(csh handle); + +/** + Fast API to disassemble binary code, given the code buffer, size, address + and number of instructions to be decoded. + This API puts the resulting instruction into a given cache in @insn. + See tests/test_iter.c for sample code demonstrating this API. + + NOTE 1: this API will update @code, @size & @address to point to the next + instruction in the input buffer. Therefore, it is convenient to use + cs_disasm_iter() inside a loop to quickly iterate all the instructions. + While decoding one instruction at a time can also be achieved with + cs_disasm(count=1), some benchmarks shown that cs_disasm_iter() can be 30% + faster on random input. + + NOTE 2: the cache in @insn can be created with cs_malloc() API. + + NOTE 3: for system with scarce memory to be dynamically allocated such as + OS kernel or firmware, this API is recommended over cs_disasm(), which + allocates memory based on the number of instructions to be disassembled. + The reason is that with cs_disasm(), based on limited available memory, + we have to calculate in advance how many instructions to be disassembled, + which complicates things. This is especially troublesome for the case + @count=0, when cs_disasm() runs uncontrollably (until either end of input + buffer, or when it encounters an invalid instruction). + + @handle: handle returned by cs_open() + @code: buffer containing raw binary code to be disassembled + @size: size of above code + @address: address of the first insn in given raw code buffer + @insn: pointer to instruction to be filled in by this API. + + @return: true if this API successfully decode 1 instruction, + or false otherwise. + + On failure, call cs_errno() for error code. +*/ +CAPSTONE_EXPORT +bool CAPSTONE_API cs_disasm_iter(csh handle, + const uint8_t **code, size_t *size, + uint64_t *address, cs_insn *insn); + +/** + Return friendly name of register in a string. + Find the instruction id from header file of corresponding architecture (arm.h for ARM, + x86.h for X86, ...) + + WARN: when in 'diet' mode, this API is irrelevant because engine does not + store register name. + + @handle: handle returned by cs_open() + @reg_id: register id + + @return: string name of the register, or NULL if @reg_id is invalid. +*/ +CAPSTONE_EXPORT +const char * CAPSTONE_API cs_reg_name(csh handle, unsigned int reg_id); + +/** + Return friendly name of an instruction in a string. + Find the instruction id from header file of corresponding architecture (arm.h for ARM, x86.h for X86, ...) + + WARN: when in 'diet' mode, this API is irrelevant because the engine does not + store instruction name. + + @handle: handle returned by cs_open() + @insn_id: instruction id + + @return: string name of the instruction, or NULL if @insn_id is invalid. +*/ +CAPSTONE_EXPORT +const char * CAPSTONE_API cs_insn_name(csh handle, unsigned int insn_id); + +/** + Return friendly name of a group id (that an instruction can belong to) + Find the group id from header file of corresponding architecture (arm.h for ARM, x86.h for X86, ...) + + WARN: when in 'diet' mode, this API is irrelevant because the engine does not + store group name. + + @handle: handle returned by cs_open() + @group_id: group id + + @return: string name of the group, or NULL if @group_id is invalid. +*/ +CAPSTONE_EXPORT +const char * CAPSTONE_API cs_group_name(csh handle, unsigned int group_id); + +/** + Check if a disassembled instruction belong to a particular group. + Find the group id from header file of corresponding architecture (arm.h for ARM, x86.h for X86, ...) + Internally, this simply verifies if @group_id matches any member of insn->groups array. + + NOTE: this API is only valid when detail option is ON (which is OFF by default). + + WARN: when in 'diet' mode, this API is irrelevant because the engine does not + update @groups array. + + @handle: handle returned by cs_open() + @insn: disassembled instruction structure received from cs_disasm() or cs_disasm_iter() + @group_id: group that you want to check if this instruction belong to. + + @return: true if this instruction indeed belongs to the given group, or false otherwise. +*/ +CAPSTONE_EXPORT +bool CAPSTONE_API cs_insn_group(csh handle, const cs_insn *insn, unsigned int group_id); + +/** + Check if a disassembled instruction IMPLICITLY used a particular register. + Find the register id from header file of corresponding architecture (arm.h for ARM, x86.h for X86, ...) + Internally, this simply verifies if @reg_id matches any member of insn->regs_read array. + + NOTE: this API is only valid when detail option is ON (which is OFF by default) + + WARN: when in 'diet' mode, this API is irrelevant because the engine does not + update @regs_read array. + + @insn: disassembled instruction structure received from cs_disasm() or cs_disasm_iter() + @reg_id: register that you want to check if this instruction used it. + + @return: true if this instruction indeed implicitly used the given register, or false otherwise. +*/ +CAPSTONE_EXPORT +bool CAPSTONE_API cs_reg_read(csh handle, const cs_insn *insn, unsigned int reg_id); + +/** + Check if a disassembled instruction IMPLICITLY modified a particular register. + Find the register id from header file of corresponding architecture (arm.h for ARM, x86.h for X86, ...) + Internally, this simply verifies if @reg_id matches any member of insn->regs_write array. + + NOTE: this API is only valid when detail option is ON (which is OFF by default) + + WARN: when in 'diet' mode, this API is irrelevant because the engine does not + update @regs_write array. + + @insn: disassembled instruction structure received from cs_disasm() or cs_disasm_iter() + @reg_id: register that you want to check if this instruction modified it. + + @return: true if this instruction indeed implicitly modified the given register, or false otherwise. +*/ +CAPSTONE_EXPORT +bool CAPSTONE_API cs_reg_write(csh handle, const cs_insn *insn, unsigned int reg_id); + +/** + Count the number of operands of a given type. + Find the operand type in header file of corresponding architecture (arm.h for ARM, x86.h for X86, ...) + + NOTE: this API is only valid when detail option is ON (which is OFF by default) + + @handle: handle returned by cs_open() + @insn: disassembled instruction structure received from cs_disasm() or cs_disasm_iter() + @op_type: Operand type to be found. + + @return: number of operands of given type @op_type in instruction @insn, + or -1 on failure. +*/ +CAPSTONE_EXPORT +int CAPSTONE_API cs_op_count(csh handle, const cs_insn *insn, unsigned int op_type); + +/** + Retrieve the position of operand of given type in .operands[] array. + Later, the operand can be accessed using the returned position. + Find the operand type in header file of corresponding architecture (arm.h for ARM, x86.h for X86, ...) + + NOTE: this API is only valid when detail option is ON (which is OFF by default) + + @handle: handle returned by cs_open() + @insn: disassembled instruction structure received from cs_disasm() or cs_disasm_iter() + @op_type: Operand type to be found. + @position: position of the operand to be found. This must be in the range + [1, cs_op_count(handle, insn, op_type)] + + @return: index of operand of given type @op_type in .operands[] array + in instruction @insn, or -1 on failure. +*/ +CAPSTONE_EXPORT +int CAPSTONE_API cs_op_index(csh handle, const cs_insn *insn, unsigned int op_type, + unsigned int position); + +/// Type of array to keep the list of registers +typedef uint16_t cs_regs[64]; + +/** + Retrieve all the registers accessed by an instruction, either explicitly or + implicitly. + + WARN: when in 'diet' mode, this API is irrelevant because engine does not + store registers. + + @handle: handle returned by cs_open() + @insn: disassembled instruction structure returned from cs_disasm() or cs_disasm_iter() + @regs_read: on return, this array contains all registers read by instruction. + @regs_read_count: number of registers kept inside @regs_read array. + @regs_write: on return, this array contains all registers written by instruction. + @regs_write_count: number of registers kept inside @regs_write array. + + @return CS_ERR_OK on success, or other value on failure (refer to cs_err enum + for detailed error). +*/ +CAPSTONE_EXPORT +cs_err CAPSTONE_API cs_regs_access(csh handle, const cs_insn *insn, + cs_regs regs_read, uint8_t *regs_read_count, + cs_regs regs_write, uint8_t *regs_write_count); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/EDUReViver/include/capstone/evm.h b/EDUReViver/include/capstone/evm.h new file mode 100644 index 0000000..78fb7c0 --- /dev/null +++ b/EDUReViver/include/capstone/evm.h @@ -0,0 +1,188 @@ +#ifndef CAPSTONE_EVM_H +#define CAPSTONE_EVM_H + +/* Capstone Disassembly Engine */ +/* By Nguyen Anh Quynh , 2013-2018 */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "platform.h" + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +/// Instruction structure +typedef struct cs_evm { + unsigned char pop; ///< number of items popped from the stack + unsigned char push; ///< number of items pushed into the stack + unsigned int fee; ///< gas fee for the instruction +} cs_evm; + +/// EVM instruction +typedef enum evm_insn { + EVM_INS_STOP = 0, + EVM_INS_ADD = 1, + EVM_INS_MUL = 2, + EVM_INS_SUB = 3, + EVM_INS_DIV = 4, + EVM_INS_SDIV = 5, + EVM_INS_MOD = 6, + EVM_INS_SMOD = 7, + EVM_INS_ADDMOD = 8, + EVM_INS_MULMOD = 9, + EVM_INS_EXP = 10, + EVM_INS_SIGNEXTEND = 11, + EVM_INS_LT = 16, + EVM_INS_GT = 17, + EVM_INS_SLT = 18, + EVM_INS_SGT = 19, + EVM_INS_EQ = 20, + EVM_INS_ISZERO = 21, + EVM_INS_AND = 22, + EVM_INS_OR = 23, + EVM_INS_XOR = 24, + EVM_INS_NOT = 25, + EVM_INS_BYTE = 26, + EVM_INS_SHA3 = 32, + EVM_INS_ADDRESS = 48, + EVM_INS_BALANCE = 49, + EVM_INS_ORIGIN = 50, + EVM_INS_CALLER = 51, + EVM_INS_CALLVALUE = 52, + EVM_INS_CALLDATALOAD = 53, + EVM_INS_CALLDATASIZE = 54, + EVM_INS_CALLDATACOPY = 55, + EVM_INS_CODESIZE = 56, + EVM_INS_CODECOPY = 57, + EVM_INS_GASPRICE = 58, + EVM_INS_EXTCODESIZE = 59, + EVM_INS_EXTCODECOPY = 60, + EVM_INS_RETURNDATASIZE = 61, + EVM_INS_RETURNDATACOPY = 62, + EVM_INS_BLOCKHASH = 64, + EVM_INS_COINBASE = 65, + EVM_INS_TIMESTAMP = 66, + EVM_INS_NUMBER = 67, + EVM_INS_DIFFICULTY = 68, + EVM_INS_GASLIMIT = 69, + EVM_INS_POP = 80, + EVM_INS_MLOAD = 81, + EVM_INS_MSTORE = 82, + EVM_INS_MSTORE8 = 83, + EVM_INS_SLOAD = 84, + EVM_INS_SSTORE = 85, + EVM_INS_JUMP = 86, + EVM_INS_JUMPI = 87, + EVM_INS_PC = 88, + EVM_INS_MSIZE = 89, + EVM_INS_GAS = 90, + EVM_INS_JUMPDEST = 91, + EVM_INS_PUSH1 = 96, + EVM_INS_PUSH2 = 97, + EVM_INS_PUSH3 = 98, + EVM_INS_PUSH4 = 99, + EVM_INS_PUSH5 = 100, + EVM_INS_PUSH6 = 101, + EVM_INS_PUSH7 = 102, + EVM_INS_PUSH8 = 103, + EVM_INS_PUSH9 = 104, + EVM_INS_PUSH10 = 105, + EVM_INS_PUSH11 = 106, + EVM_INS_PUSH12 = 107, + EVM_INS_PUSH13 = 108, + EVM_INS_PUSH14 = 109, + EVM_INS_PUSH15 = 110, + EVM_INS_PUSH16 = 111, + EVM_INS_PUSH17 = 112, + EVM_INS_PUSH18 = 113, + EVM_INS_PUSH19 = 114, + EVM_INS_PUSH20 = 115, + EVM_INS_PUSH21 = 116, + EVM_INS_PUSH22 = 117, + EVM_INS_PUSH23 = 118, + EVM_INS_PUSH24 = 119, + EVM_INS_PUSH25 = 120, + EVM_INS_PUSH26 = 121, + EVM_INS_PUSH27 = 122, + EVM_INS_PUSH28 = 123, + EVM_INS_PUSH29 = 124, + EVM_INS_PUSH30 = 125, + EVM_INS_PUSH31 = 126, + EVM_INS_PUSH32 = 127, + EVM_INS_DUP1 = 128, + EVM_INS_DUP2 = 129, + EVM_INS_DUP3 = 130, + EVM_INS_DUP4 = 131, + EVM_INS_DUP5 = 132, + EVM_INS_DUP6 = 133, + EVM_INS_DUP7 = 134, + EVM_INS_DUP8 = 135, + EVM_INS_DUP9 = 136, + EVM_INS_DUP10 = 137, + EVM_INS_DUP11 = 138, + EVM_INS_DUP12 = 139, + EVM_INS_DUP13 = 140, + EVM_INS_DUP14 = 141, + EVM_INS_DUP15 = 142, + EVM_INS_DUP16 = 143, + EVM_INS_SWAP1 = 144, + EVM_INS_SWAP2 = 145, + EVM_INS_SWAP3 = 146, + EVM_INS_SWAP4 = 147, + EVM_INS_SWAP5 = 148, + EVM_INS_SWAP6 = 149, + EVM_INS_SWAP7 = 150, + EVM_INS_SWAP8 = 151, + EVM_INS_SWAP9 = 152, + EVM_INS_SWAP10 = 153, + EVM_INS_SWAP11 = 154, + EVM_INS_SWAP12 = 155, + EVM_INS_SWAP13 = 156, + EVM_INS_SWAP14 = 157, + EVM_INS_SWAP15 = 158, + EVM_INS_SWAP16 = 159, + EVM_INS_LOG0 = 160, + EVM_INS_LOG1 = 161, + EVM_INS_LOG2 = 162, + EVM_INS_LOG3 = 163, + EVM_INS_LOG4 = 164, + EVM_INS_CREATE = 240, + EVM_INS_CALL = 241, + EVM_INS_CALLCODE = 242, + EVM_INS_RETURN = 243, + EVM_INS_DELEGATECALL = 244, + EVM_INS_CALLBLACKBOX = 245, + EVM_INS_STATICCALL = 250, + EVM_INS_REVERT = 253, + EVM_INS_SUICIDE = 255, + + EVM_INS_INVALID = 512, + EVM_INS_ENDING, // <-- mark the end of the list of instructions +} evm_insn; + +/// Group of EVM instructions +typedef enum evm_insn_group { + EVM_GRP_INVALID = 0, ///< = CS_GRP_INVALID + + EVM_GRP_JUMP, ///< all jump instructions + + EVM_GRP_MATH = 8, ///< math instructions + EVM_GRP_STACK_WRITE, ///< instructions write to stack + EVM_GRP_STACK_READ, ///< instructions read from stack + EVM_GRP_MEM_WRITE, ///< instructions write to memory + EVM_GRP_MEM_READ, ///< instructions read from memory + EVM_GRP_STORE_WRITE, ///< instructions write to storage + EVM_GRP_STORE_READ, ///< instructions read from storage + EVM_GRP_HALT, ///< instructions halt execution + + EVM_GRP_ENDING, ///< <-- mark the end of the list of groups +} evm_insn_group; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/EDUReViver/include/capstone/m680x.h b/EDUReViver/include/capstone/m680x.h new file mode 100644 index 0000000..c8296e4 --- /dev/null +++ b/EDUReViver/include/capstone/m680x.h @@ -0,0 +1,537 @@ +#ifndef CAPSTONE_M680X_H +#define CAPSTONE_M680X_H + +/* Capstone Disassembly Engine */ +/* M680X Backend by Wolfgang Schwotzer 2017 */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "platform.h" + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +#define M680X_OPERAND_COUNT 9 + +/// M680X registers and special registers +typedef enum m680x_reg { + M680X_REG_INVALID = 0, + + M680X_REG_A, ///< M6800/1/2/3/9, HD6301/9 + M680X_REG_B, ///< M6800/1/2/3/9, HD6301/9 + M680X_REG_E, ///< HD6309 + M680X_REG_F, ///< HD6309 + M680X_REG_0, ///< HD6309 + + M680X_REG_D, ///< M6801/3/9, HD6301/9 + M680X_REG_W, ///< HD6309 + + M680X_REG_CC, ///< M6800/1/2/3/9, M6301/9 + M680X_REG_DP, ///< M6809/M6309 + M680X_REG_MD, ///< M6309 + + M680X_REG_HX, ///< M6808 + M680X_REG_H, ///< M6808 + M680X_REG_X, ///< M6800/1/2/3/9, M6301/9 + M680X_REG_Y, ///< M6809/M6309 + M680X_REG_S, ///< M6809/M6309 + M680X_REG_U, ///< M6809/M6309 + M680X_REG_V, ///< M6309 + + M680X_REG_Q, ///< M6309 + + M680X_REG_PC, ///< M6800/1/2/3/9, M6301/9 + + M680X_REG_TMP2, ///< CPU12 + M680X_REG_TMP3, ///< CPU12 + + M680X_REG_ENDING, ///< <-- mark the end of the list of registers +} m680x_reg; + +/// Operand type for instruction's operands +typedef enum m680x_op_type { + M680X_OP_INVALID = 0, ///< = CS_OP_INVALID (Uninitialized). + M680X_OP_REGISTER, ///< = Register operand. + M680X_OP_IMMEDIATE, ///< = Immediate operand. + M680X_OP_INDEXED, ///< = Indexed addressing operand. + M680X_OP_EXTENDED, ///< = Extended addressing operand. + M680X_OP_DIRECT, ///< = Direct addressing operand. + M680X_OP_RELATIVE, ///< = Relative addressing operand. + M680X_OP_CONSTANT, ///< = constant operand (Displayed as number only). + ///< Used e.g. for a bit index or page number. +} m680x_op_type; + +// Supported bit values for mem.idx.offset_bits +#define M680X_OFFSET_NONE 0 +#define M680X_OFFSET_BITS_5 5 +#define M680X_OFFSET_BITS_8 8 +#define M680X_OFFSET_BITS_9 9 +#define M680X_OFFSET_BITS_16 16 + +// Supported bit flags for mem.idx.flags +// These flags can be combined +#define M680X_IDX_INDIRECT 1 +#define M680X_IDX_NO_COMMA 2 +#define M680X_IDX_POST_INC_DEC 4 + +/// Instruction's operand referring to indexed addressing +typedef struct m680x_op_idx { + m680x_reg base_reg; ///< base register (or M680X_REG_INVALID if + ///< irrelevant) + m680x_reg offset_reg; ///< offset register (or M680X_REG_INVALID if + ///< irrelevant) + int16_t offset; ///< 5-,8- or 16-bit offset. See also offset_bits. + uint16_t offset_addr; ///< = offset addr. if base_reg == M680X_REG_PC. + ///< calculated as offset + PC + uint8_t offset_bits; ///< offset width in bits for indexed addressing + int8_t inc_dec; ///< inc. or dec. value: + ///< 0: no inc-/decrement + ///< 1 .. 8: increment by 1 .. 8 + ///< -1 .. -8: decrement by 1 .. 8 + ///< if flag M680X_IDX_POST_INC_DEC set it is post + ///< inc-/decrement otherwise pre inc-/decrement + uint8_t flags; ///< 8-bit flags (see above) +} m680x_op_idx; + +/// Instruction's memory operand referring to relative addressing (Bcc/LBcc) +typedef struct m680x_op_rel { + uint16_t address; ///< The absolute address. + ///< calculated as PC + offset. PC is the first + ///< address after the instruction. + int16_t offset; ///< the offset/displacement value +} m680x_op_rel; + +/// Instruction's operand referring to extended addressing +typedef struct m680x_op_ext { + uint16_t address; ///< The absolute address + bool indirect; ///< true if extended indirect addressing +} m680x_op_ext; + +/// Instruction operand +typedef struct cs_m680x_op { + m680x_op_type type; + union { + int32_t imm; ///< immediate value for IMM operand + m680x_reg reg; ///< register value for REG operand + m680x_op_idx idx; ///< Indexed addressing operand + m680x_op_rel rel; ///< Relative address. operand (Bcc/LBcc) + m680x_op_ext ext; ///< Extended address + uint8_t direct_addr; ///<, 2015-2016 */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "platform.h" + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +#define M68K_OPERAND_COUNT 4 + +/// M68K registers and special registers +typedef enum m68k_reg { + M68K_REG_INVALID = 0, + + M68K_REG_D0, + M68K_REG_D1, + M68K_REG_D2, + M68K_REG_D3, + M68K_REG_D4, + M68K_REG_D5, + M68K_REG_D6, + M68K_REG_D7, + + M68K_REG_A0, + M68K_REG_A1, + M68K_REG_A2, + M68K_REG_A3, + M68K_REG_A4, + M68K_REG_A5, + M68K_REG_A6, + M68K_REG_A7, + + M68K_REG_FP0, + M68K_REG_FP1, + M68K_REG_FP2, + M68K_REG_FP3, + M68K_REG_FP4, + M68K_REG_FP5, + M68K_REG_FP6, + M68K_REG_FP7, + + M68K_REG_PC, + + M68K_REG_SR, + M68K_REG_CCR, + M68K_REG_SFC, + M68K_REG_DFC, + M68K_REG_USP, + M68K_REG_VBR, + M68K_REG_CACR, + M68K_REG_CAAR, + M68K_REG_MSP, + M68K_REG_ISP, + M68K_REG_TC, + M68K_REG_ITT0, + M68K_REG_ITT1, + M68K_REG_DTT0, + M68K_REG_DTT1, + M68K_REG_MMUSR, + M68K_REG_URP, + M68K_REG_SRP, + + M68K_REG_FPCR, + M68K_REG_FPSR, + M68K_REG_FPIAR, + + M68K_REG_ENDING, // <-- mark the end of the list of registers +} m68k_reg; + +/// M68K Addressing Modes +typedef enum m68k_address_mode { + M68K_AM_NONE = 0, ///< No address mode. + + M68K_AM_REG_DIRECT_DATA, ///< Register Direct - Data + M68K_AM_REG_DIRECT_ADDR, ///< Register Direct - Address + + M68K_AM_REGI_ADDR, ///< Register Indirect - Address + M68K_AM_REGI_ADDR_POST_INC, ///< Register Indirect - Address with Postincrement + M68K_AM_REGI_ADDR_PRE_DEC, ///< Register Indirect - Address with Predecrement + M68K_AM_REGI_ADDR_DISP, ///< Register Indirect - Address with Displacement + + M68K_AM_AREGI_INDEX_8_BIT_DISP, ///< Address Register Indirect With Index- 8-bit displacement + M68K_AM_AREGI_INDEX_BASE_DISP, ///< Address Register Indirect With Index- Base displacement + + M68K_AM_MEMI_POST_INDEX, ///< Memory indirect - Postindex + M68K_AM_MEMI_PRE_INDEX, ///< Memory indirect - Preindex + + M68K_AM_PCI_DISP, ///< Program Counter Indirect - with Displacement + + M68K_AM_PCI_INDEX_8_BIT_DISP, ///< Program Counter Indirect with Index - with 8-Bit Displacement + M68K_AM_PCI_INDEX_BASE_DISP, ///< Program Counter Indirect with Index - with Base Displacement + + M68K_AM_PC_MEMI_POST_INDEX, ///< Program Counter Memory Indirect - Postindexed + M68K_AM_PC_MEMI_PRE_INDEX, ///< Program Counter Memory Indirect - Preindexed + + M68K_AM_ABSOLUTE_DATA_SHORT, ///< Absolute Data Addressing - Short + M68K_AM_ABSOLUTE_DATA_LONG, ///< Absolute Data Addressing - Long + M68K_AM_IMMEDIATE, ///< Immediate value + + M68K_AM_BRANCH_DISPLACEMENT, ///< Address as displacement from (PC+2) used by branches +} m68k_address_mode; + +/// Operand type for instruction's operands +typedef enum m68k_op_type { + M68K_OP_INVALID = 0, ///< = CS_OP_INVALID (Uninitialized). + M68K_OP_REG, ///< = CS_OP_REG (Register operand). + M68K_OP_IMM, ///< = CS_OP_IMM (Immediate operand). + M68K_OP_MEM, ///< = CS_OP_MEM (Memory operand). + M68K_OP_FP_SINGLE, ///< single precision Floating-Point operand + M68K_OP_FP_DOUBLE, ///< double precision Floating-Point operand + M68K_OP_REG_BITS, ///< Register bits move + M68K_OP_REG_PAIR, ///< Register pair in the same op (upper 4 bits for first reg, lower for second) + M68K_OP_BR_DISP, ///< Branch displacement +} m68k_op_type; + +/// Instruction's operand referring to memory +/// This is associated with M68K_OP_MEM operand type above +typedef struct m68k_op_mem { + m68k_reg base_reg; ///< base register (or M68K_REG_INVALID if irrelevant) + m68k_reg index_reg; ///< index register (or M68K_REG_INVALID if irrelevant) + m68k_reg in_base_reg; ///< indirect base register (or M68K_REG_INVALID if irrelevant) + uint32_t in_disp; ///< indirect displacement + uint32_t out_disp; ///< other displacement + int16_t disp; ///< displacement value + uint8_t scale; ///< scale for index register + uint8_t bitfield; ///< set to true if the two values below should be used + uint8_t width; ///< used for bf* instructions + uint8_t offset; ///< used for bf* instructions + uint8_t index_size; ///< 0 = w, 1 = l +} m68k_op_mem; + +/// Operand type for instruction's operands +typedef enum m68k_op_br_disp_size { + M68K_OP_BR_DISP_SIZE_INVALID = 0, ///< = CS_OP_INVALID (Uninitialized). + M68K_OP_BR_DISP_SIZE_BYTE = 1, ///< signed 8-bit displacement + M68K_OP_BR_DISP_SIZE_WORD = 2, ///< signed 16-bit displacement + M68K_OP_BR_DISP_SIZE_LONG = 4, ///< signed 32-bit displacement +} m68k_op_br_disp_size; + +typedef struct m68k_op_br_disp { + int32_t disp; ///< displacement value + uint8_t disp_size; ///< Size from m68k_op_br_disp_size type above +} m68k_op_br_disp; + +/// Instruction operand +typedef struct cs_m68k_op { + union { + uint64_t imm; ///< immediate value for IMM operand + double dimm; ///< double imm + float simm; ///< float imm + m68k_reg reg; ///< register value for REG operand + struct { ///< register pair in one operand + m68k_reg reg_0; + m68k_reg reg_1; + } reg_pair; + }; + + m68k_op_mem mem; ///< data when operand is targeting memory + m68k_op_br_disp br_disp; ///< data when operand is a branch displacement + uint32_t register_bits; ///< register bits for movem etc. (always in d0-d7, a0-a7, fp0 - fp7 order) + m68k_op_type type; + m68k_address_mode address_mode; ///< M68K addressing mode for this op +} cs_m68k_op; + +/// Operation size of the CPU instructions +typedef enum m68k_cpu_size { + M68K_CPU_SIZE_NONE = 0, ///< unsized or unspecified + M68K_CPU_SIZE_BYTE = 1, ///< 1 byte in size + M68K_CPU_SIZE_WORD = 2, ///< 2 bytes in size + M68K_CPU_SIZE_LONG = 4, ///< 4 bytes in size +} m68k_cpu_size; + +/// Operation size of the FPU instructions (Notice that FPU instruction can also use CPU sizes if needed) +typedef enum m68k_fpu_size { + M68K_FPU_SIZE_NONE = 0, ///< unsized like fsave/frestore + M68K_FPU_SIZE_SINGLE = 4, ///< 4 byte in size (single float) + M68K_FPU_SIZE_DOUBLE = 8, ///< 8 byte in size (double) + M68K_FPU_SIZE_EXTENDED = 12, ///< 12 byte in size (extended real format) +} m68k_fpu_size; + +/// Type of size that is being used for the current instruction +typedef enum m68k_size_type { + M68K_SIZE_TYPE_INVALID = 0, + + M68K_SIZE_TYPE_CPU, + M68K_SIZE_TYPE_FPU, +} m68k_size_type; + +/// Operation size of the current instruction (NOT the actually size of instruction) +typedef struct m68k_op_size { + m68k_size_type type; + union { + m68k_cpu_size cpu_size; + m68k_fpu_size fpu_size; + }; +} m68k_op_size; + +/// The M68K instruction and it's operands +typedef struct cs_m68k { + // Number of operands of this instruction or 0 when instruction has no operand. + cs_m68k_op operands[M68K_OPERAND_COUNT]; ///< operands for this instruction. + m68k_op_size op_size; ///< size of data operand works on in bytes (.b, .w, .l, etc) + uint8_t op_count; ///< number of operands for the instruction +} cs_m68k; + +/// M68K instruction +typedef enum m68k_insn { + M68K_INS_INVALID = 0, + + M68K_INS_ABCD, + M68K_INS_ADD, + M68K_INS_ADDA, + M68K_INS_ADDI, + M68K_INS_ADDQ, + M68K_INS_ADDX, + M68K_INS_AND, + M68K_INS_ANDI, + M68K_INS_ASL, + M68K_INS_ASR, + M68K_INS_BHS, + M68K_INS_BLO, + M68K_INS_BHI, + M68K_INS_BLS, + M68K_INS_BCC, + M68K_INS_BCS, + M68K_INS_BNE, + M68K_INS_BEQ, + M68K_INS_BVC, + M68K_INS_BVS, + M68K_INS_BPL, + M68K_INS_BMI, + M68K_INS_BGE, + M68K_INS_BLT, + M68K_INS_BGT, + M68K_INS_BLE, + M68K_INS_BRA, + M68K_INS_BSR, + M68K_INS_BCHG, + M68K_INS_BCLR, + M68K_INS_BSET, + M68K_INS_BTST, + M68K_INS_BFCHG, + M68K_INS_BFCLR, + M68K_INS_BFEXTS, + M68K_INS_BFEXTU, + M68K_INS_BFFFO, + M68K_INS_BFINS, + M68K_INS_BFSET, + M68K_INS_BFTST, + M68K_INS_BKPT, + M68K_INS_CALLM, + M68K_INS_CAS, + M68K_INS_CAS2, + M68K_INS_CHK, + M68K_INS_CHK2, + M68K_INS_CLR, + M68K_INS_CMP, + M68K_INS_CMPA, + M68K_INS_CMPI, + M68K_INS_CMPM, + M68K_INS_CMP2, + M68K_INS_CINVL, + M68K_INS_CINVP, + M68K_INS_CINVA, + M68K_INS_CPUSHL, + M68K_INS_CPUSHP, + M68K_INS_CPUSHA, + M68K_INS_DBT, + M68K_INS_DBF, + M68K_INS_DBHI, + M68K_INS_DBLS, + M68K_INS_DBCC, + M68K_INS_DBCS, + M68K_INS_DBNE, + M68K_INS_DBEQ, + M68K_INS_DBVC, + M68K_INS_DBVS, + M68K_INS_DBPL, + M68K_INS_DBMI, + M68K_INS_DBGE, + M68K_INS_DBLT, + M68K_INS_DBGT, + M68K_INS_DBLE, + M68K_INS_DBRA, + M68K_INS_DIVS, + M68K_INS_DIVSL, + M68K_INS_DIVU, + M68K_INS_DIVUL, + M68K_INS_EOR, + M68K_INS_EORI, + M68K_INS_EXG, + M68K_INS_EXT, + M68K_INS_EXTB, + M68K_INS_FABS, + M68K_INS_FSABS, + M68K_INS_FDABS, + M68K_INS_FACOS, + M68K_INS_FADD, + M68K_INS_FSADD, + M68K_INS_FDADD, + M68K_INS_FASIN, + M68K_INS_FATAN, + M68K_INS_FATANH, + M68K_INS_FBF, + M68K_INS_FBEQ, + M68K_INS_FBOGT, + M68K_INS_FBOGE, + M68K_INS_FBOLT, + M68K_INS_FBOLE, + M68K_INS_FBOGL, + M68K_INS_FBOR, + M68K_INS_FBUN, + M68K_INS_FBUEQ, + M68K_INS_FBUGT, + M68K_INS_FBUGE, + M68K_INS_FBULT, + M68K_INS_FBULE, + M68K_INS_FBNE, + M68K_INS_FBT, + M68K_INS_FBSF, + M68K_INS_FBSEQ, + M68K_INS_FBGT, + M68K_INS_FBGE, + M68K_INS_FBLT, + M68K_INS_FBLE, + M68K_INS_FBGL, + M68K_INS_FBGLE, + M68K_INS_FBNGLE, + M68K_INS_FBNGL, + M68K_INS_FBNLE, + M68K_INS_FBNLT, + M68K_INS_FBNGE, + M68K_INS_FBNGT, + M68K_INS_FBSNE, + M68K_INS_FBST, + M68K_INS_FCMP, + M68K_INS_FCOS, + M68K_INS_FCOSH, + M68K_INS_FDBF, + M68K_INS_FDBEQ, + M68K_INS_FDBOGT, + M68K_INS_FDBOGE, + M68K_INS_FDBOLT, + M68K_INS_FDBOLE, + M68K_INS_FDBOGL, + M68K_INS_FDBOR, + M68K_INS_FDBUN, + M68K_INS_FDBUEQ, + M68K_INS_FDBUGT, + M68K_INS_FDBUGE, + M68K_INS_FDBULT, + M68K_INS_FDBULE, + M68K_INS_FDBNE, + M68K_INS_FDBT, + M68K_INS_FDBSF, + M68K_INS_FDBSEQ, + M68K_INS_FDBGT, + M68K_INS_FDBGE, + M68K_INS_FDBLT, + M68K_INS_FDBLE, + M68K_INS_FDBGL, + M68K_INS_FDBGLE, + M68K_INS_FDBNGLE, + M68K_INS_FDBNGL, + M68K_INS_FDBNLE, + M68K_INS_FDBNLT, + M68K_INS_FDBNGE, + M68K_INS_FDBNGT, + M68K_INS_FDBSNE, + M68K_INS_FDBST, + M68K_INS_FDIV, + M68K_INS_FSDIV, + M68K_INS_FDDIV, + M68K_INS_FETOX, + M68K_INS_FETOXM1, + M68K_INS_FGETEXP, + M68K_INS_FGETMAN, + M68K_INS_FINT, + M68K_INS_FINTRZ, + M68K_INS_FLOG10, + M68K_INS_FLOG2, + M68K_INS_FLOGN, + M68K_INS_FLOGNP1, + M68K_INS_FMOD, + M68K_INS_FMOVE, + M68K_INS_FSMOVE, + M68K_INS_FDMOVE, + M68K_INS_FMOVECR, + M68K_INS_FMOVEM, + M68K_INS_FMUL, + M68K_INS_FSMUL, + M68K_INS_FDMUL, + M68K_INS_FNEG, + M68K_INS_FSNEG, + M68K_INS_FDNEG, + M68K_INS_FNOP, + M68K_INS_FREM, + M68K_INS_FRESTORE, + M68K_INS_FSAVE, + M68K_INS_FSCALE, + M68K_INS_FSGLDIV, + M68K_INS_FSGLMUL, + M68K_INS_FSIN, + M68K_INS_FSINCOS, + M68K_INS_FSINH, + M68K_INS_FSQRT, + M68K_INS_FSSQRT, + M68K_INS_FDSQRT, + M68K_INS_FSF, + M68K_INS_FSBEQ, + M68K_INS_FSOGT, + M68K_INS_FSOGE, + M68K_INS_FSOLT, + M68K_INS_FSOLE, + M68K_INS_FSOGL, + M68K_INS_FSOR, + M68K_INS_FSUN, + M68K_INS_FSUEQ, + M68K_INS_FSUGT, + M68K_INS_FSUGE, + M68K_INS_FSULT, + M68K_INS_FSULE, + M68K_INS_FSNE, + M68K_INS_FST, + M68K_INS_FSSF, + M68K_INS_FSSEQ, + M68K_INS_FSGT, + M68K_INS_FSGE, + M68K_INS_FSLT, + M68K_INS_FSLE, + M68K_INS_FSGL, + M68K_INS_FSGLE, + M68K_INS_FSNGLE, + M68K_INS_FSNGL, + M68K_INS_FSNLE, + M68K_INS_FSNLT, + M68K_INS_FSNGE, + M68K_INS_FSNGT, + M68K_INS_FSSNE, + M68K_INS_FSST, + M68K_INS_FSUB, + M68K_INS_FSSUB, + M68K_INS_FDSUB, + M68K_INS_FTAN, + M68K_INS_FTANH, + M68K_INS_FTENTOX, + M68K_INS_FTRAPF, + M68K_INS_FTRAPEQ, + M68K_INS_FTRAPOGT, + M68K_INS_FTRAPOGE, + M68K_INS_FTRAPOLT, + M68K_INS_FTRAPOLE, + M68K_INS_FTRAPOGL, + M68K_INS_FTRAPOR, + M68K_INS_FTRAPUN, + M68K_INS_FTRAPUEQ, + M68K_INS_FTRAPUGT, + M68K_INS_FTRAPUGE, + M68K_INS_FTRAPULT, + M68K_INS_FTRAPULE, + M68K_INS_FTRAPNE, + M68K_INS_FTRAPT, + M68K_INS_FTRAPSF, + M68K_INS_FTRAPSEQ, + M68K_INS_FTRAPGT, + M68K_INS_FTRAPGE, + M68K_INS_FTRAPLT, + M68K_INS_FTRAPLE, + M68K_INS_FTRAPGL, + M68K_INS_FTRAPGLE, + M68K_INS_FTRAPNGLE, + M68K_INS_FTRAPNGL, + M68K_INS_FTRAPNLE, + M68K_INS_FTRAPNLT, + M68K_INS_FTRAPNGE, + M68K_INS_FTRAPNGT, + M68K_INS_FTRAPSNE, + M68K_INS_FTRAPST, + M68K_INS_FTST, + M68K_INS_FTWOTOX, + M68K_INS_HALT, + M68K_INS_ILLEGAL, + M68K_INS_JMP, + M68K_INS_JSR, + M68K_INS_LEA, + M68K_INS_LINK, + M68K_INS_LPSTOP, + M68K_INS_LSL, + M68K_INS_LSR, + M68K_INS_MOVE, + M68K_INS_MOVEA, + M68K_INS_MOVEC, + M68K_INS_MOVEM, + M68K_INS_MOVEP, + M68K_INS_MOVEQ, + M68K_INS_MOVES, + M68K_INS_MOVE16, + M68K_INS_MULS, + M68K_INS_MULU, + M68K_INS_NBCD, + M68K_INS_NEG, + M68K_INS_NEGX, + M68K_INS_NOP, + M68K_INS_NOT, + M68K_INS_OR, + M68K_INS_ORI, + M68K_INS_PACK, + M68K_INS_PEA, + M68K_INS_PFLUSH, + M68K_INS_PFLUSHA, + M68K_INS_PFLUSHAN, + M68K_INS_PFLUSHN, + M68K_INS_PLOADR, + M68K_INS_PLOADW, + M68K_INS_PLPAR, + M68K_INS_PLPAW, + M68K_INS_PMOVE, + M68K_INS_PMOVEFD, + M68K_INS_PTESTR, + M68K_INS_PTESTW, + M68K_INS_PULSE, + M68K_INS_REMS, + M68K_INS_REMU, + M68K_INS_RESET, + M68K_INS_ROL, + M68K_INS_ROR, + M68K_INS_ROXL, + M68K_INS_ROXR, + M68K_INS_RTD, + M68K_INS_RTE, + M68K_INS_RTM, + M68K_INS_RTR, + M68K_INS_RTS, + M68K_INS_SBCD, + M68K_INS_ST, + M68K_INS_SF, + M68K_INS_SHI, + M68K_INS_SLS, + M68K_INS_SCC, + M68K_INS_SHS, + M68K_INS_SCS, + M68K_INS_SLO, + M68K_INS_SNE, + M68K_INS_SEQ, + M68K_INS_SVC, + M68K_INS_SVS, + M68K_INS_SPL, + M68K_INS_SMI, + M68K_INS_SGE, + M68K_INS_SLT, + M68K_INS_SGT, + M68K_INS_SLE, + M68K_INS_STOP, + M68K_INS_SUB, + M68K_INS_SUBA, + M68K_INS_SUBI, + M68K_INS_SUBQ, + M68K_INS_SUBX, + M68K_INS_SWAP, + M68K_INS_TAS, + M68K_INS_TRAP, + M68K_INS_TRAPV, + M68K_INS_TRAPT, + M68K_INS_TRAPF, + M68K_INS_TRAPHI, + M68K_INS_TRAPLS, + M68K_INS_TRAPCC, + M68K_INS_TRAPHS, + M68K_INS_TRAPCS, + M68K_INS_TRAPLO, + M68K_INS_TRAPNE, + M68K_INS_TRAPEQ, + M68K_INS_TRAPVC, + M68K_INS_TRAPVS, + M68K_INS_TRAPPL, + M68K_INS_TRAPMI, + M68K_INS_TRAPGE, + M68K_INS_TRAPLT, + M68K_INS_TRAPGT, + M68K_INS_TRAPLE, + M68K_INS_TST, + M68K_INS_UNLK, + M68K_INS_UNPK, + M68K_INS_ENDING, // <-- mark the end of the list of instructions +} m68k_insn; + +/// Group of M68K instructions +typedef enum m68k_group_type { + M68K_GRP_INVALID = 0, ///< CS_GRUP_INVALID + M68K_GRP_JUMP, ///< = CS_GRP_JUMP + M68K_GRP_RET = 3, ///< = CS_GRP_RET + M68K_GRP_IRET = 5, ///< = CS_GRP_IRET + M68K_GRP_BRANCH_RELATIVE = 7, ///< = CS_GRP_BRANCH_RELATIVE + + M68K_GRP_ENDING,// <-- mark the end of the list of groups +} m68k_group_type; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/EDUReViver/include/capstone/mips.h b/EDUReViver/include/capstone/mips.h new file mode 100644 index 0000000..f10c303 --- /dev/null +++ b/EDUReViver/include/capstone/mips.h @@ -0,0 +1,956 @@ +#ifndef CAPSTONE_MIPS_H +#define CAPSTONE_MIPS_H + +/* Capstone Disassembly Engine */ +/* By Nguyen Anh Quynh , 2013-2015 */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "platform.h" + +// GCC MIPS toolchain has a default macro called "mips" which breaks +// compilation +#undef mips + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +/// Operand type for instruction's operands +typedef enum mips_op_type { + MIPS_OP_INVALID = 0, ///< = CS_OP_INVALID (Uninitialized). + MIPS_OP_REG, ///< = CS_OP_REG (Register operand). + MIPS_OP_IMM, ///< = CS_OP_IMM (Immediate operand). + MIPS_OP_MEM, ///< = CS_OP_MEM (Memory operand). +} mips_op_type; + +/// MIPS registers +typedef enum mips_reg { + MIPS_REG_INVALID = 0, + // General purpose registers + MIPS_REG_PC, + + MIPS_REG_0, + MIPS_REG_1, + MIPS_REG_2, + MIPS_REG_3, + MIPS_REG_4, + MIPS_REG_5, + MIPS_REG_6, + MIPS_REG_7, + MIPS_REG_8, + MIPS_REG_9, + MIPS_REG_10, + MIPS_REG_11, + MIPS_REG_12, + MIPS_REG_13, + MIPS_REG_14, + MIPS_REG_15, + MIPS_REG_16, + MIPS_REG_17, + MIPS_REG_18, + MIPS_REG_19, + MIPS_REG_20, + MIPS_REG_21, + MIPS_REG_22, + MIPS_REG_23, + MIPS_REG_24, + MIPS_REG_25, + MIPS_REG_26, + MIPS_REG_27, + MIPS_REG_28, + MIPS_REG_29, + MIPS_REG_30, + MIPS_REG_31, + + // DSP registers + MIPS_REG_DSPCCOND, + MIPS_REG_DSPCARRY, + MIPS_REG_DSPEFI, + MIPS_REG_DSPOUTFLAG, + MIPS_REG_DSPOUTFLAG16_19, + MIPS_REG_DSPOUTFLAG20, + MIPS_REG_DSPOUTFLAG21, + MIPS_REG_DSPOUTFLAG22, + MIPS_REG_DSPOUTFLAG23, + MIPS_REG_DSPPOS, + MIPS_REG_DSPSCOUNT, + + // ACC registers + MIPS_REG_AC0, + MIPS_REG_AC1, + MIPS_REG_AC2, + MIPS_REG_AC3, + + // COP registers + MIPS_REG_CC0, + MIPS_REG_CC1, + MIPS_REG_CC2, + MIPS_REG_CC3, + MIPS_REG_CC4, + MIPS_REG_CC5, + MIPS_REG_CC6, + MIPS_REG_CC7, + + // FPU registers + MIPS_REG_F0, + MIPS_REG_F1, + MIPS_REG_F2, + MIPS_REG_F3, + MIPS_REG_F4, + MIPS_REG_F5, + MIPS_REG_F6, + MIPS_REG_F7, + MIPS_REG_F8, + MIPS_REG_F9, + MIPS_REG_F10, + MIPS_REG_F11, + MIPS_REG_F12, + MIPS_REG_F13, + MIPS_REG_F14, + MIPS_REG_F15, + MIPS_REG_F16, + MIPS_REG_F17, + MIPS_REG_F18, + MIPS_REG_F19, + MIPS_REG_F20, + MIPS_REG_F21, + MIPS_REG_F22, + MIPS_REG_F23, + MIPS_REG_F24, + MIPS_REG_F25, + MIPS_REG_F26, + MIPS_REG_F27, + MIPS_REG_F28, + MIPS_REG_F29, + MIPS_REG_F30, + MIPS_REG_F31, + + MIPS_REG_FCC0, + MIPS_REG_FCC1, + MIPS_REG_FCC2, + MIPS_REG_FCC3, + MIPS_REG_FCC4, + MIPS_REG_FCC5, + MIPS_REG_FCC6, + MIPS_REG_FCC7, + + // AFPR128 + MIPS_REG_W0, + MIPS_REG_W1, + MIPS_REG_W2, + MIPS_REG_W3, + MIPS_REG_W4, + MIPS_REG_W5, + MIPS_REG_W6, + MIPS_REG_W7, + MIPS_REG_W8, + MIPS_REG_W9, + MIPS_REG_W10, + MIPS_REG_W11, + MIPS_REG_W12, + MIPS_REG_W13, + MIPS_REG_W14, + MIPS_REG_W15, + MIPS_REG_W16, + MIPS_REG_W17, + MIPS_REG_W18, + MIPS_REG_W19, + MIPS_REG_W20, + MIPS_REG_W21, + MIPS_REG_W22, + MIPS_REG_W23, + MIPS_REG_W24, + MIPS_REG_W25, + MIPS_REG_W26, + MIPS_REG_W27, + MIPS_REG_W28, + MIPS_REG_W29, + MIPS_REG_W30, + MIPS_REG_W31, + + MIPS_REG_HI, + MIPS_REG_LO, + + MIPS_REG_P0, + MIPS_REG_P1, + MIPS_REG_P2, + + MIPS_REG_MPL0, + MIPS_REG_MPL1, + MIPS_REG_MPL2, + + MIPS_REG_ENDING, // <-- mark the end of the list or registers + + // alias registers + MIPS_REG_ZERO = MIPS_REG_0, + MIPS_REG_AT = MIPS_REG_1, + MIPS_REG_V0 = MIPS_REG_2, + MIPS_REG_V1 = MIPS_REG_3, + MIPS_REG_A0 = MIPS_REG_4, + MIPS_REG_A1 = MIPS_REG_5, + MIPS_REG_A2 = MIPS_REG_6, + MIPS_REG_A3 = MIPS_REG_7, + MIPS_REG_T0 = MIPS_REG_8, + MIPS_REG_T1 = MIPS_REG_9, + MIPS_REG_T2 = MIPS_REG_10, + MIPS_REG_T3 = MIPS_REG_11, + MIPS_REG_T4 = MIPS_REG_12, + MIPS_REG_T5 = MIPS_REG_13, + MIPS_REG_T6 = MIPS_REG_14, + MIPS_REG_T7 = MIPS_REG_15, + MIPS_REG_S0 = MIPS_REG_16, + MIPS_REG_S1 = MIPS_REG_17, + MIPS_REG_S2 = MIPS_REG_18, + MIPS_REG_S3 = MIPS_REG_19, + MIPS_REG_S4 = MIPS_REG_20, + MIPS_REG_S5 = MIPS_REG_21, + MIPS_REG_S6 = MIPS_REG_22, + MIPS_REG_S7 = MIPS_REG_23, + MIPS_REG_T8 = MIPS_REG_24, + MIPS_REG_T9 = MIPS_REG_25, + MIPS_REG_K0 = MIPS_REG_26, + MIPS_REG_K1 = MIPS_REG_27, + MIPS_REG_GP = MIPS_REG_28, + MIPS_REG_SP = MIPS_REG_29, + MIPS_REG_FP = MIPS_REG_30, MIPS_REG_S8 = MIPS_REG_30, + MIPS_REG_RA = MIPS_REG_31, + + MIPS_REG_HI0 = MIPS_REG_AC0, + MIPS_REG_HI1 = MIPS_REG_AC1, + MIPS_REG_HI2 = MIPS_REG_AC2, + MIPS_REG_HI3 = MIPS_REG_AC3, + + MIPS_REG_LO0 = MIPS_REG_HI0, + MIPS_REG_LO1 = MIPS_REG_HI1, + MIPS_REG_LO2 = MIPS_REG_HI2, + MIPS_REG_LO3 = MIPS_REG_HI3, +} mips_reg; + +/// Instruction's operand referring to memory +/// This is associated with MIPS_OP_MEM operand type above +typedef struct mips_op_mem { + mips_reg base; ///< base register + int64_t disp; ///< displacement/offset value +} mips_op_mem; + +/// Instruction operand +typedef struct cs_mips_op { + mips_op_type type; ///< operand type + union { + mips_reg reg; ///< register value for REG operand + int64_t imm; ///< immediate value for IMM operand + mips_op_mem mem; ///< base/index/scale/disp value for MEM operand + }; +} cs_mips_op; + +/// Instruction structure +typedef struct cs_mips { + /// Number of operands of this instruction, + /// or 0 when instruction has no operand. + uint8_t op_count; + cs_mips_op operands[10]; ///< operands for this instruction. +} cs_mips; + +/// MIPS instruction +typedef enum mips_insn { + MIPS_INS_INVALID = 0, + + MIPS_INS_ABSQ_S, + MIPS_INS_ADD, + MIPS_INS_ADDIUPC, + MIPS_INS_ADDIUR1SP, + MIPS_INS_ADDIUR2, + MIPS_INS_ADDIUS5, + MIPS_INS_ADDIUSP, + MIPS_INS_ADDQH, + MIPS_INS_ADDQH_R, + MIPS_INS_ADDQ, + MIPS_INS_ADDQ_S, + MIPS_INS_ADDSC, + MIPS_INS_ADDS_A, + MIPS_INS_ADDS_S, + MIPS_INS_ADDS_U, + MIPS_INS_ADDU16, + MIPS_INS_ADDUH, + MIPS_INS_ADDUH_R, + MIPS_INS_ADDU, + MIPS_INS_ADDU_S, + MIPS_INS_ADDVI, + MIPS_INS_ADDV, + MIPS_INS_ADDWC, + MIPS_INS_ADD_A, + MIPS_INS_ADDI, + MIPS_INS_ADDIU, + MIPS_INS_ALIGN, + MIPS_INS_ALUIPC, + MIPS_INS_AND, + MIPS_INS_AND16, + MIPS_INS_ANDI16, + MIPS_INS_ANDI, + MIPS_INS_APPEND, + MIPS_INS_ASUB_S, + MIPS_INS_ASUB_U, + MIPS_INS_AUI, + MIPS_INS_AUIPC, + MIPS_INS_AVER_S, + MIPS_INS_AVER_U, + MIPS_INS_AVE_S, + MIPS_INS_AVE_U, + MIPS_INS_B16, + MIPS_INS_BADDU, + MIPS_INS_BAL, + MIPS_INS_BALC, + MIPS_INS_BALIGN, + MIPS_INS_BBIT0, + MIPS_INS_BBIT032, + MIPS_INS_BBIT1, + MIPS_INS_BBIT132, + MIPS_INS_BC, + MIPS_INS_BC0F, + MIPS_INS_BC0FL, + MIPS_INS_BC0T, + MIPS_INS_BC0TL, + MIPS_INS_BC1EQZ, + MIPS_INS_BC1F, + MIPS_INS_BC1FL, + MIPS_INS_BC1NEZ, + MIPS_INS_BC1T, + MIPS_INS_BC1TL, + MIPS_INS_BC2EQZ, + MIPS_INS_BC2F, + MIPS_INS_BC2FL, + MIPS_INS_BC2NEZ, + MIPS_INS_BC2T, + MIPS_INS_BC2TL, + MIPS_INS_BC3F, + MIPS_INS_BC3FL, + MIPS_INS_BC3T, + MIPS_INS_BC3TL, + MIPS_INS_BCLRI, + MIPS_INS_BCLR, + MIPS_INS_BEQ, + MIPS_INS_BEQC, + MIPS_INS_BEQL, + MIPS_INS_BEQZ16, + MIPS_INS_BEQZALC, + MIPS_INS_BEQZC, + MIPS_INS_BGEC, + MIPS_INS_BGEUC, + MIPS_INS_BGEZ, + MIPS_INS_BGEZAL, + MIPS_INS_BGEZALC, + MIPS_INS_BGEZALL, + MIPS_INS_BGEZALS, + MIPS_INS_BGEZC, + MIPS_INS_BGEZL, + MIPS_INS_BGTZ, + MIPS_INS_BGTZALC, + MIPS_INS_BGTZC, + MIPS_INS_BGTZL, + MIPS_INS_BINSLI, + MIPS_INS_BINSL, + MIPS_INS_BINSRI, + MIPS_INS_BINSR, + MIPS_INS_BITREV, + MIPS_INS_BITSWAP, + MIPS_INS_BLEZ, + MIPS_INS_BLEZALC, + MIPS_INS_BLEZC, + MIPS_INS_BLEZL, + MIPS_INS_BLTC, + MIPS_INS_BLTUC, + MIPS_INS_BLTZ, + MIPS_INS_BLTZAL, + MIPS_INS_BLTZALC, + MIPS_INS_BLTZALL, + MIPS_INS_BLTZALS, + MIPS_INS_BLTZC, + MIPS_INS_BLTZL, + MIPS_INS_BMNZI, + MIPS_INS_BMNZ, + MIPS_INS_BMZI, + MIPS_INS_BMZ, + MIPS_INS_BNE, + MIPS_INS_BNEC, + MIPS_INS_BNEGI, + MIPS_INS_BNEG, + MIPS_INS_BNEL, + MIPS_INS_BNEZ16, + MIPS_INS_BNEZALC, + MIPS_INS_BNEZC, + MIPS_INS_BNVC, + MIPS_INS_BNZ, + MIPS_INS_BOVC, + MIPS_INS_BPOSGE32, + MIPS_INS_BREAK, + MIPS_INS_BREAK16, + MIPS_INS_BSELI, + MIPS_INS_BSEL, + MIPS_INS_BSETI, + MIPS_INS_BSET, + MIPS_INS_BZ, + MIPS_INS_BEQZ, + MIPS_INS_B, + MIPS_INS_BNEZ, + MIPS_INS_BTEQZ, + MIPS_INS_BTNEZ, + MIPS_INS_CACHE, + MIPS_INS_CEIL, + MIPS_INS_CEQI, + MIPS_INS_CEQ, + MIPS_INS_CFC1, + MIPS_INS_CFCMSA, + MIPS_INS_CINS, + MIPS_INS_CINS32, + MIPS_INS_CLASS, + MIPS_INS_CLEI_S, + MIPS_INS_CLEI_U, + MIPS_INS_CLE_S, + MIPS_INS_CLE_U, + MIPS_INS_CLO, + MIPS_INS_CLTI_S, + MIPS_INS_CLTI_U, + MIPS_INS_CLT_S, + MIPS_INS_CLT_U, + MIPS_INS_CLZ, + MIPS_INS_CMPGDU, + MIPS_INS_CMPGU, + MIPS_INS_CMPU, + MIPS_INS_CMP, + MIPS_INS_COPY_S, + MIPS_INS_COPY_U, + MIPS_INS_CTC1, + MIPS_INS_CTCMSA, + MIPS_INS_CVT, + MIPS_INS_C, + MIPS_INS_CMPI, + MIPS_INS_DADD, + MIPS_INS_DADDI, + MIPS_INS_DADDIU, + MIPS_INS_DADDU, + MIPS_INS_DAHI, + MIPS_INS_DALIGN, + MIPS_INS_DATI, + MIPS_INS_DAUI, + MIPS_INS_DBITSWAP, + MIPS_INS_DCLO, + MIPS_INS_DCLZ, + MIPS_INS_DDIV, + MIPS_INS_DDIVU, + MIPS_INS_DERET, + MIPS_INS_DEXT, + MIPS_INS_DEXTM, + MIPS_INS_DEXTU, + MIPS_INS_DI, + MIPS_INS_DINS, + MIPS_INS_DINSM, + MIPS_INS_DINSU, + MIPS_INS_DIV, + MIPS_INS_DIVU, + MIPS_INS_DIV_S, + MIPS_INS_DIV_U, + MIPS_INS_DLSA, + MIPS_INS_DMFC0, + MIPS_INS_DMFC1, + MIPS_INS_DMFC2, + MIPS_INS_DMOD, + MIPS_INS_DMODU, + MIPS_INS_DMTC0, + MIPS_INS_DMTC1, + MIPS_INS_DMTC2, + MIPS_INS_DMUH, + MIPS_INS_DMUHU, + MIPS_INS_DMUL, + MIPS_INS_DMULT, + MIPS_INS_DMULTU, + MIPS_INS_DMULU, + MIPS_INS_DOTP_S, + MIPS_INS_DOTP_U, + MIPS_INS_DPADD_S, + MIPS_INS_DPADD_U, + MIPS_INS_DPAQX_SA, + MIPS_INS_DPAQX_S, + MIPS_INS_DPAQ_SA, + MIPS_INS_DPAQ_S, + MIPS_INS_DPAU, + MIPS_INS_DPAX, + MIPS_INS_DPA, + MIPS_INS_DPOP, + MIPS_INS_DPSQX_SA, + MIPS_INS_DPSQX_S, + MIPS_INS_DPSQ_SA, + MIPS_INS_DPSQ_S, + MIPS_INS_DPSUB_S, + MIPS_INS_DPSUB_U, + MIPS_INS_DPSU, + MIPS_INS_DPSX, + MIPS_INS_DPS, + MIPS_INS_DROTR, + MIPS_INS_DROTR32, + MIPS_INS_DROTRV, + MIPS_INS_DSBH, + MIPS_INS_DSHD, + MIPS_INS_DSLL, + MIPS_INS_DSLL32, + MIPS_INS_DSLLV, + MIPS_INS_DSRA, + MIPS_INS_DSRA32, + MIPS_INS_DSRAV, + MIPS_INS_DSRL, + MIPS_INS_DSRL32, + MIPS_INS_DSRLV, + MIPS_INS_DSUB, + MIPS_INS_DSUBU, + MIPS_INS_EHB, + MIPS_INS_EI, + MIPS_INS_ERET, + MIPS_INS_EXT, + MIPS_INS_EXTP, + MIPS_INS_EXTPDP, + MIPS_INS_EXTPDPV, + MIPS_INS_EXTPV, + MIPS_INS_EXTRV_RS, + MIPS_INS_EXTRV_R, + MIPS_INS_EXTRV_S, + MIPS_INS_EXTRV, + MIPS_INS_EXTR_RS, + MIPS_INS_EXTR_R, + MIPS_INS_EXTR_S, + MIPS_INS_EXTR, + MIPS_INS_EXTS, + MIPS_INS_EXTS32, + MIPS_INS_ABS, + MIPS_INS_FADD, + MIPS_INS_FCAF, + MIPS_INS_FCEQ, + MIPS_INS_FCLASS, + MIPS_INS_FCLE, + MIPS_INS_FCLT, + MIPS_INS_FCNE, + MIPS_INS_FCOR, + MIPS_INS_FCUEQ, + MIPS_INS_FCULE, + MIPS_INS_FCULT, + MIPS_INS_FCUNE, + MIPS_INS_FCUN, + MIPS_INS_FDIV, + MIPS_INS_FEXDO, + MIPS_INS_FEXP2, + MIPS_INS_FEXUPL, + MIPS_INS_FEXUPR, + MIPS_INS_FFINT_S, + MIPS_INS_FFINT_U, + MIPS_INS_FFQL, + MIPS_INS_FFQR, + MIPS_INS_FILL, + MIPS_INS_FLOG2, + MIPS_INS_FLOOR, + MIPS_INS_FMADD, + MIPS_INS_FMAX_A, + MIPS_INS_FMAX, + MIPS_INS_FMIN_A, + MIPS_INS_FMIN, + MIPS_INS_MOV, + MIPS_INS_FMSUB, + MIPS_INS_FMUL, + MIPS_INS_MUL, + MIPS_INS_NEG, + MIPS_INS_FRCP, + MIPS_INS_FRINT, + MIPS_INS_FRSQRT, + MIPS_INS_FSAF, + MIPS_INS_FSEQ, + MIPS_INS_FSLE, + MIPS_INS_FSLT, + MIPS_INS_FSNE, + MIPS_INS_FSOR, + MIPS_INS_FSQRT, + MIPS_INS_SQRT, + MIPS_INS_FSUB, + MIPS_INS_SUB, + MIPS_INS_FSUEQ, + MIPS_INS_FSULE, + MIPS_INS_FSULT, + MIPS_INS_FSUNE, + MIPS_INS_FSUN, + MIPS_INS_FTINT_S, + MIPS_INS_FTINT_U, + MIPS_INS_FTQ, + MIPS_INS_FTRUNC_S, + MIPS_INS_FTRUNC_U, + MIPS_INS_HADD_S, + MIPS_INS_HADD_U, + MIPS_INS_HSUB_S, + MIPS_INS_HSUB_U, + MIPS_INS_ILVEV, + MIPS_INS_ILVL, + MIPS_INS_ILVOD, + MIPS_INS_ILVR, + MIPS_INS_INS, + MIPS_INS_INSERT, + MIPS_INS_INSV, + MIPS_INS_INSVE, + MIPS_INS_J, + MIPS_INS_JAL, + MIPS_INS_JALR, + MIPS_INS_JALRS16, + MIPS_INS_JALRS, + MIPS_INS_JALS, + MIPS_INS_JALX, + MIPS_INS_JIALC, + MIPS_INS_JIC, + MIPS_INS_JR, + MIPS_INS_JR16, + MIPS_INS_JRADDIUSP, + MIPS_INS_JRC, + MIPS_INS_JALRC, + MIPS_INS_LB, + MIPS_INS_LBU16, + MIPS_INS_LBUX, + MIPS_INS_LBU, + MIPS_INS_LD, + MIPS_INS_LDC1, + MIPS_INS_LDC2, + MIPS_INS_LDC3, + MIPS_INS_LDI, + MIPS_INS_LDL, + MIPS_INS_LDPC, + MIPS_INS_LDR, + MIPS_INS_LDXC1, + MIPS_INS_LH, + MIPS_INS_LHU16, + MIPS_INS_LHX, + MIPS_INS_LHU, + MIPS_INS_LI16, + MIPS_INS_LL, + MIPS_INS_LLD, + MIPS_INS_LSA, + MIPS_INS_LUXC1, + MIPS_INS_LUI, + MIPS_INS_LW, + MIPS_INS_LW16, + MIPS_INS_LWC1, + MIPS_INS_LWC2, + MIPS_INS_LWC3, + MIPS_INS_LWL, + MIPS_INS_LWM16, + MIPS_INS_LWM32, + MIPS_INS_LWPC, + MIPS_INS_LWP, + MIPS_INS_LWR, + MIPS_INS_LWUPC, + MIPS_INS_LWU, + MIPS_INS_LWX, + MIPS_INS_LWXC1, + MIPS_INS_LWXS, + MIPS_INS_LI, + MIPS_INS_MADD, + MIPS_INS_MADDF, + MIPS_INS_MADDR_Q, + MIPS_INS_MADDU, + MIPS_INS_MADDV, + MIPS_INS_MADD_Q, + MIPS_INS_MAQ_SA, + MIPS_INS_MAQ_S, + MIPS_INS_MAXA, + MIPS_INS_MAXI_S, + MIPS_INS_MAXI_U, + MIPS_INS_MAX_A, + MIPS_INS_MAX, + MIPS_INS_MAX_S, + MIPS_INS_MAX_U, + MIPS_INS_MFC0, + MIPS_INS_MFC1, + MIPS_INS_MFC2, + MIPS_INS_MFHC1, + MIPS_INS_MFHI, + MIPS_INS_MFLO, + MIPS_INS_MINA, + MIPS_INS_MINI_S, + MIPS_INS_MINI_U, + MIPS_INS_MIN_A, + MIPS_INS_MIN, + MIPS_INS_MIN_S, + MIPS_INS_MIN_U, + MIPS_INS_MOD, + MIPS_INS_MODSUB, + MIPS_INS_MODU, + MIPS_INS_MOD_S, + MIPS_INS_MOD_U, + MIPS_INS_MOVE, + MIPS_INS_MOVEP, + MIPS_INS_MOVF, + MIPS_INS_MOVN, + MIPS_INS_MOVT, + MIPS_INS_MOVZ, + MIPS_INS_MSUB, + MIPS_INS_MSUBF, + MIPS_INS_MSUBR_Q, + MIPS_INS_MSUBU, + MIPS_INS_MSUBV, + MIPS_INS_MSUB_Q, + MIPS_INS_MTC0, + MIPS_INS_MTC1, + MIPS_INS_MTC2, + MIPS_INS_MTHC1, + MIPS_INS_MTHI, + MIPS_INS_MTHLIP, + MIPS_INS_MTLO, + MIPS_INS_MTM0, + MIPS_INS_MTM1, + MIPS_INS_MTM2, + MIPS_INS_MTP0, + MIPS_INS_MTP1, + MIPS_INS_MTP2, + MIPS_INS_MUH, + MIPS_INS_MUHU, + MIPS_INS_MULEQ_S, + MIPS_INS_MULEU_S, + MIPS_INS_MULQ_RS, + MIPS_INS_MULQ_S, + MIPS_INS_MULR_Q, + MIPS_INS_MULSAQ_S, + MIPS_INS_MULSA, + MIPS_INS_MULT, + MIPS_INS_MULTU, + MIPS_INS_MULU, + MIPS_INS_MULV, + MIPS_INS_MUL_Q, + MIPS_INS_MUL_S, + MIPS_INS_NLOC, + MIPS_INS_NLZC, + MIPS_INS_NMADD, + MIPS_INS_NMSUB, + MIPS_INS_NOR, + MIPS_INS_NORI, + MIPS_INS_NOT16, + MIPS_INS_NOT, + MIPS_INS_OR, + MIPS_INS_OR16, + MIPS_INS_ORI, + MIPS_INS_PACKRL, + MIPS_INS_PAUSE, + MIPS_INS_PCKEV, + MIPS_INS_PCKOD, + MIPS_INS_PCNT, + MIPS_INS_PICK, + MIPS_INS_POP, + MIPS_INS_PRECEQU, + MIPS_INS_PRECEQ, + MIPS_INS_PRECEU, + MIPS_INS_PRECRQU_S, + MIPS_INS_PRECRQ, + MIPS_INS_PRECRQ_RS, + MIPS_INS_PRECR, + MIPS_INS_PRECR_SRA, + MIPS_INS_PRECR_SRA_R, + MIPS_INS_PREF, + MIPS_INS_PREPEND, + MIPS_INS_RADDU, + MIPS_INS_RDDSP, + MIPS_INS_RDHWR, + MIPS_INS_REPLV, + MIPS_INS_REPL, + MIPS_INS_RINT, + MIPS_INS_ROTR, + MIPS_INS_ROTRV, + MIPS_INS_ROUND, + MIPS_INS_SAT_S, + MIPS_INS_SAT_U, + MIPS_INS_SB, + MIPS_INS_SB16, + MIPS_INS_SC, + MIPS_INS_SCD, + MIPS_INS_SD, + MIPS_INS_SDBBP, + MIPS_INS_SDBBP16, + MIPS_INS_SDC1, + MIPS_INS_SDC2, + MIPS_INS_SDC3, + MIPS_INS_SDL, + MIPS_INS_SDR, + MIPS_INS_SDXC1, + MIPS_INS_SEB, + MIPS_INS_SEH, + MIPS_INS_SELEQZ, + MIPS_INS_SELNEZ, + MIPS_INS_SEL, + MIPS_INS_SEQ, + MIPS_INS_SEQI, + MIPS_INS_SH, + MIPS_INS_SH16, + MIPS_INS_SHF, + MIPS_INS_SHILO, + MIPS_INS_SHILOV, + MIPS_INS_SHLLV, + MIPS_INS_SHLLV_S, + MIPS_INS_SHLL, + MIPS_INS_SHLL_S, + MIPS_INS_SHRAV, + MIPS_INS_SHRAV_R, + MIPS_INS_SHRA, + MIPS_INS_SHRA_R, + MIPS_INS_SHRLV, + MIPS_INS_SHRL, + MIPS_INS_SLDI, + MIPS_INS_SLD, + MIPS_INS_SLL, + MIPS_INS_SLL16, + MIPS_INS_SLLI, + MIPS_INS_SLLV, + MIPS_INS_SLT, + MIPS_INS_SLTI, + MIPS_INS_SLTIU, + MIPS_INS_SLTU, + MIPS_INS_SNE, + MIPS_INS_SNEI, + MIPS_INS_SPLATI, + MIPS_INS_SPLAT, + MIPS_INS_SRA, + MIPS_INS_SRAI, + MIPS_INS_SRARI, + MIPS_INS_SRAR, + MIPS_INS_SRAV, + MIPS_INS_SRL, + MIPS_INS_SRL16, + MIPS_INS_SRLI, + MIPS_INS_SRLRI, + MIPS_INS_SRLR, + MIPS_INS_SRLV, + MIPS_INS_SSNOP, + MIPS_INS_ST, + MIPS_INS_SUBQH, + MIPS_INS_SUBQH_R, + MIPS_INS_SUBQ, + MIPS_INS_SUBQ_S, + MIPS_INS_SUBSUS_U, + MIPS_INS_SUBSUU_S, + MIPS_INS_SUBS_S, + MIPS_INS_SUBS_U, + MIPS_INS_SUBU16, + MIPS_INS_SUBUH, + MIPS_INS_SUBUH_R, + MIPS_INS_SUBU, + MIPS_INS_SUBU_S, + MIPS_INS_SUBVI, + MIPS_INS_SUBV, + MIPS_INS_SUXC1, + MIPS_INS_SW, + MIPS_INS_SW16, + MIPS_INS_SWC1, + MIPS_INS_SWC2, + MIPS_INS_SWC3, + MIPS_INS_SWL, + MIPS_INS_SWM16, + MIPS_INS_SWM32, + MIPS_INS_SWP, + MIPS_INS_SWR, + MIPS_INS_SWXC1, + MIPS_INS_SYNC, + MIPS_INS_SYNCI, + MIPS_INS_SYSCALL, + MIPS_INS_TEQ, + MIPS_INS_TEQI, + MIPS_INS_TGE, + MIPS_INS_TGEI, + MIPS_INS_TGEIU, + MIPS_INS_TGEU, + MIPS_INS_TLBP, + MIPS_INS_TLBR, + MIPS_INS_TLBWI, + MIPS_INS_TLBWR, + MIPS_INS_TLT, + MIPS_INS_TLTI, + MIPS_INS_TLTIU, + MIPS_INS_TLTU, + MIPS_INS_TNE, + MIPS_INS_TNEI, + MIPS_INS_TRUNC, + MIPS_INS_V3MULU, + MIPS_INS_VMM0, + MIPS_INS_VMULU, + MIPS_INS_VSHF, + MIPS_INS_WAIT, + MIPS_INS_WRDSP, + MIPS_INS_WSBH, + MIPS_INS_XOR, + MIPS_INS_XOR16, + MIPS_INS_XORI, + + //> some alias instructions + MIPS_INS_NOP, + MIPS_INS_NEGU, + + //> special instructions + MIPS_INS_JALR_HB, // jump and link with Hazard Barrier + MIPS_INS_JR_HB, // jump register with Hazard Barrier + + MIPS_INS_ENDING, +} mips_insn; + +/// Group of MIPS instructions +typedef enum mips_insn_group { + MIPS_GRP_INVALID = 0, ///< = CS_GRP_INVALID + + // Generic groups + // all jump instructions (conditional+direct+indirect jumps) + MIPS_GRP_JUMP, ///< = CS_GRP_JUMP + // all call instructions + MIPS_GRP_CALL, ///< = CS_GRP_CALL + // all return instructions + MIPS_GRP_RET, ///< = CS_GRP_RET + // all interrupt instructions (int+syscall) + MIPS_GRP_INT, ///< = CS_GRP_INT + // all interrupt return instructions + MIPS_GRP_IRET, ///< = CS_GRP_IRET + // all privileged instructions + MIPS_GRP_PRIVILEGE, ///< = CS_GRP_PRIVILEGE + // all relative branching instructions + MIPS_GRP_BRANCH_RELATIVE, ///< = CS_GRP_BRANCH_RELATIVE + + // Architecture-specific groups + MIPS_GRP_BITCOUNT = 128, + MIPS_GRP_DSP, + MIPS_GRP_DSPR2, + MIPS_GRP_FPIDX, + MIPS_GRP_MSA, + MIPS_GRP_MIPS32R2, + MIPS_GRP_MIPS64, + MIPS_GRP_MIPS64R2, + MIPS_GRP_SEINREG, + MIPS_GRP_STDENC, + MIPS_GRP_SWAP, + MIPS_GRP_MICROMIPS, + MIPS_GRP_MIPS16MODE, + MIPS_GRP_FP64BIT, + MIPS_GRP_NONANSFPMATH, + MIPS_GRP_NOTFP64BIT, + MIPS_GRP_NOTINMICROMIPS, + MIPS_GRP_NOTNACL, + MIPS_GRP_NOTMIPS32R6, + MIPS_GRP_NOTMIPS64R6, + MIPS_GRP_CNMIPS, + MIPS_GRP_MIPS32, + MIPS_GRP_MIPS32R6, + MIPS_GRP_MIPS64R6, + MIPS_GRP_MIPS2, + MIPS_GRP_MIPS3, + MIPS_GRP_MIPS3_32, + MIPS_GRP_MIPS3_32R2, + MIPS_GRP_MIPS4_32, + MIPS_GRP_MIPS4_32R2, + MIPS_GRP_MIPS5_32R2, + MIPS_GRP_GP32BIT, + MIPS_GRP_GP64BIT, + + MIPS_GRP_ENDING, +} mips_insn_group; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/EDUReViver/include/capstone/platform.h b/EDUReViver/include/capstone/platform.h new file mode 100644 index 0000000..a5a4bd2 --- /dev/null +++ b/EDUReViver/include/capstone/platform.h @@ -0,0 +1,122 @@ +/* Capstone Disassembly Engine */ +/* By Axel Souchet & Nguyen Anh Quynh, 2014 */ + +#ifndef CAPSTONE_PLATFORM_H +#define CAPSTONE_PLATFORM_H + + +// handle C99 issue (for pre-2013 VisualStudio) +#if !defined(__CYGWIN__) && !defined(__MINGW32__) && !defined(__MINGW64__) && (defined (WIN32) || defined (WIN64) || defined (_WIN32) || defined (_WIN64)) +// MSVC + +// stdbool.h +#if (_MSC_VER < 1800) || defined(_KERNEL_MODE) +// this system does not have stdbool.h +#ifndef __cplusplus +typedef unsigned char bool; +#define false 0 +#define true 1 +#endif // __cplusplus + +#else +// VisualStudio 2013+ -> C99 is supported +#include +#endif // (_MSC_VER < 1800) || defined(_KERNEL_MODE) + +#else +// not MSVC -> C99 is supported +#include +#endif // !defined(__CYGWIN__) && !defined(__MINGW32__) && !defined(__MINGW64__) && (defined (WIN32) || defined (WIN64) || defined (_WIN32) || defined (_WIN64)) + + +// handle inttypes.h / stdint.h compatibility +#if defined(_WIN32_WCE) && (_WIN32_WCE < 0x800) +#include "windowsce/stdint.h" +#endif // defined(_WIN32_WCE) && (_WIN32_WCE < 0x800) + +#if defined(CAPSTONE_HAS_OSXKERNEL) || (defined(_MSC_VER) && (_MSC_VER <= 1700 || defined(_KERNEL_MODE))) +// this system does not have inttypes.h + +#if defined(_MSC_VER) && (_MSC_VER <= 1600 || defined(_KERNEL_MODE)) +// this system does not have stdint.h +typedef signed char int8_t; +typedef signed short int16_t; +typedef signed int int32_t; +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef signed long long int64_t; +typedef unsigned long long uint64_t; +#endif // defined(_MSC_VER) && (_MSC_VER <= 1600 || defined(_KERNEL_MODE)) + +#if defined(_MSC_VER) && (_MSC_VER < 1600 || defined(_KERNEL_MODE)) +#define INT8_MIN (-127i8 - 1) +#define INT16_MIN (-32767i16 - 1) +#define INT32_MIN (-2147483647i32 - 1) +#define INT64_MIN (-9223372036854775807i64 - 1) +#define INT8_MAX 127i8 +#define INT16_MAX 32767i16 +#define INT32_MAX 2147483647i32 +#define INT64_MAX 9223372036854775807i64 +#define UINT8_MAX 0xffui8 +#define UINT16_MAX 0xffffui16 +#define UINT32_MAX 0xffffffffui32 +#define UINT64_MAX 0xffffffffffffffffui64 +#endif // defined(_MSC_VER) && (_MSC_VER < 1600 || defined(_KERNEL_MODE)) + +#ifdef CAPSTONE_HAS_OSXKERNEL +// this system has stdint.h +#include +#endif + +#define __PRI_8_LENGTH_MODIFIER__ "hh" +#define __PRI_64_LENGTH_MODIFIER__ "ll" + +#define PRId8 __PRI_8_LENGTH_MODIFIER__ "d" +#define PRIi8 __PRI_8_LENGTH_MODIFIER__ "i" +#define PRIo8 __PRI_8_LENGTH_MODIFIER__ "o" +#define PRIu8 __PRI_8_LENGTH_MODIFIER__ "u" +#define PRIx8 __PRI_8_LENGTH_MODIFIER__ "x" +#define PRIX8 __PRI_8_LENGTH_MODIFIER__ "X" + +#define PRId16 "hd" +#define PRIi16 "hi" +#define PRIo16 "ho" +#define PRIu16 "hu" +#define PRIx16 "hx" +#define PRIX16 "hX" + +#if defined(_MSC_VER) && _MSC_VER <= 1700 +#define PRId32 "ld" +#define PRIi32 "li" +#define PRIo32 "lo" +#define PRIu32 "lu" +#define PRIx32 "lx" +#define PRIX32 "lX" +#else // OSX +#define PRId32 "d" +#define PRIi32 "i" +#define PRIo32 "o" +#define PRIu32 "u" +#define PRIx32 "x" +#define PRIX32 "X" +#endif // defined(_MSC_VER) && _MSC_VER <= 1700 + +#if defined(_MSC_VER) && _MSC_VER <= 1700 +// redefine functions from inttypes.h used in cstool +#define strtoull _strtoui64 +#endif + +#define PRId64 __PRI_64_LENGTH_MODIFIER__ "d" +#define PRIi64 __PRI_64_LENGTH_MODIFIER__ "i" +#define PRIo64 __PRI_64_LENGTH_MODIFIER__ "o" +#define PRIu64 __PRI_64_LENGTH_MODIFIER__ "u" +#define PRIx64 __PRI_64_LENGTH_MODIFIER__ "x" +#define PRIX64 __PRI_64_LENGTH_MODIFIER__ "X" + +#else +// this system has inttypes.h by default +#include +#endif // defined(CAPSTONE_HAS_OSXKERNEL) || (defined(_MSC_VER) && (_MSC_VER <= 1700 || defined(_KERNEL_MODE))) + +#endif diff --git a/EDUReViver/include/capstone/ppc.h b/EDUReViver/include/capstone/ppc.h new file mode 100644 index 0000000..97ce15b --- /dev/null +++ b/EDUReViver/include/capstone/ppc.h @@ -0,0 +1,1463 @@ +#ifndef CAPSTONE_PPC_H +#define CAPSTONE_PPC_H + +/* Capstone Disassembly Engine */ +/* By Nguyen Anh Quynh , 2013-2015 */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "platform.h" + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +/// PPC branch codes for some branch instructions +typedef enum ppc_bc { + PPC_BC_INVALID = 0, + PPC_BC_LT = (0 << 5) | 12, + PPC_BC_LE = (1 << 5) | 4, + PPC_BC_EQ = (2 << 5) | 12, + PPC_BC_GE = (0 << 5) | 4, + PPC_BC_GT = (1 << 5) | 12, + PPC_BC_NE = (2 << 5) | 4, + PPC_BC_UN = (3 << 5) | 12, + PPC_BC_NU = (3 << 5) | 4, + + // extra conditions + PPC_BC_SO = (4 << 5) | 12, ///< summary overflow + PPC_BC_NS = (4 << 5) | 4, ///< not summary overflow +} ppc_bc; + +/// PPC branch hint for some branch instructions +typedef enum ppc_bh { + PPC_BH_INVALID = 0, ///< no hint + PPC_BH_PLUS, ///< PLUS hint + PPC_BH_MINUS, ///< MINUS hint +} ppc_bh; + +/// Operand type for instruction's operands +typedef enum ppc_op_type { + PPC_OP_INVALID = 0, ///< = CS_OP_INVALID (Uninitialized). + PPC_OP_REG, ///< = CS_OP_REG (Register operand). + PPC_OP_IMM, ///< = CS_OP_IMM (Immediate operand). + PPC_OP_MEM, ///< = CS_OP_MEM (Memory operand). + PPC_OP_CRX = 64, ///< Condition Register field +} ppc_op_type; + +/// PPC registers +typedef enum ppc_reg { + PPC_REG_INVALID = 0, + + PPC_REG_CARRY, + PPC_REG_CR0, + PPC_REG_CR1, + PPC_REG_CR2, + PPC_REG_CR3, + PPC_REG_CR4, + PPC_REG_CR5, + PPC_REG_CR6, + PPC_REG_CR7, + PPC_REG_CTR, + PPC_REG_F0, + PPC_REG_F1, + PPC_REG_F2, + PPC_REG_F3, + PPC_REG_F4, + PPC_REG_F5, + PPC_REG_F6, + PPC_REG_F7, + PPC_REG_F8, + PPC_REG_F9, + PPC_REG_F10, + PPC_REG_F11, + PPC_REG_F12, + PPC_REG_F13, + PPC_REG_F14, + PPC_REG_F15, + PPC_REG_F16, + PPC_REG_F17, + PPC_REG_F18, + PPC_REG_F19, + PPC_REG_F20, + PPC_REG_F21, + PPC_REG_F22, + PPC_REG_F23, + PPC_REG_F24, + PPC_REG_F25, + PPC_REG_F26, + PPC_REG_F27, + PPC_REG_F28, + PPC_REG_F29, + PPC_REG_F30, + PPC_REG_F31, + PPC_REG_LR, + PPC_REG_R0, + PPC_REG_R1, + PPC_REG_R2, + PPC_REG_R3, + PPC_REG_R4, + PPC_REG_R5, + PPC_REG_R6, + PPC_REG_R7, + PPC_REG_R8, + PPC_REG_R9, + PPC_REG_R10, + PPC_REG_R11, + PPC_REG_R12, + PPC_REG_R13, + PPC_REG_R14, + PPC_REG_R15, + PPC_REG_R16, + PPC_REG_R17, + PPC_REG_R18, + PPC_REG_R19, + PPC_REG_R20, + PPC_REG_R21, + PPC_REG_R22, + PPC_REG_R23, + PPC_REG_R24, + PPC_REG_R25, + PPC_REG_R26, + PPC_REG_R27, + PPC_REG_R28, + PPC_REG_R29, + PPC_REG_R30, + PPC_REG_R31, + PPC_REG_V0, + PPC_REG_V1, + PPC_REG_V2, + PPC_REG_V3, + PPC_REG_V4, + PPC_REG_V5, + PPC_REG_V6, + PPC_REG_V7, + PPC_REG_V8, + PPC_REG_V9, + PPC_REG_V10, + PPC_REG_V11, + PPC_REG_V12, + PPC_REG_V13, + PPC_REG_V14, + PPC_REG_V15, + PPC_REG_V16, + PPC_REG_V17, + PPC_REG_V18, + PPC_REG_V19, + PPC_REG_V20, + PPC_REG_V21, + PPC_REG_V22, + PPC_REG_V23, + PPC_REG_V24, + PPC_REG_V25, + PPC_REG_V26, + PPC_REG_V27, + PPC_REG_V28, + PPC_REG_V29, + PPC_REG_V30, + PPC_REG_V31, + PPC_REG_VRSAVE, + PPC_REG_VS0, + PPC_REG_VS1, + PPC_REG_VS2, + PPC_REG_VS3, + PPC_REG_VS4, + PPC_REG_VS5, + PPC_REG_VS6, + PPC_REG_VS7, + PPC_REG_VS8, + PPC_REG_VS9, + PPC_REG_VS10, + PPC_REG_VS11, + PPC_REG_VS12, + PPC_REG_VS13, + PPC_REG_VS14, + PPC_REG_VS15, + PPC_REG_VS16, + PPC_REG_VS17, + PPC_REG_VS18, + PPC_REG_VS19, + PPC_REG_VS20, + PPC_REG_VS21, + PPC_REG_VS22, + PPC_REG_VS23, + PPC_REG_VS24, + PPC_REG_VS25, + PPC_REG_VS26, + PPC_REG_VS27, + PPC_REG_VS28, + PPC_REG_VS29, + PPC_REG_VS30, + PPC_REG_VS31, + PPC_REG_VS32, + PPC_REG_VS33, + PPC_REG_VS34, + PPC_REG_VS35, + PPC_REG_VS36, + PPC_REG_VS37, + PPC_REG_VS38, + PPC_REG_VS39, + PPC_REG_VS40, + PPC_REG_VS41, + PPC_REG_VS42, + PPC_REG_VS43, + PPC_REG_VS44, + PPC_REG_VS45, + PPC_REG_VS46, + PPC_REG_VS47, + PPC_REG_VS48, + PPC_REG_VS49, + PPC_REG_VS50, + PPC_REG_VS51, + PPC_REG_VS52, + PPC_REG_VS53, + PPC_REG_VS54, + PPC_REG_VS55, + PPC_REG_VS56, + PPC_REG_VS57, + PPC_REG_VS58, + PPC_REG_VS59, + PPC_REG_VS60, + PPC_REG_VS61, + PPC_REG_VS62, + PPC_REG_VS63, + PPC_REG_Q0, + PPC_REG_Q1, + PPC_REG_Q2, + PPC_REG_Q3, + PPC_REG_Q4, + PPC_REG_Q5, + PPC_REG_Q6, + PPC_REG_Q7, + PPC_REG_Q8, + PPC_REG_Q9, + PPC_REG_Q10, + PPC_REG_Q11, + PPC_REG_Q12, + PPC_REG_Q13, + PPC_REG_Q14, + PPC_REG_Q15, + PPC_REG_Q16, + PPC_REG_Q17, + PPC_REG_Q18, + PPC_REG_Q19, + PPC_REG_Q20, + PPC_REG_Q21, + PPC_REG_Q22, + PPC_REG_Q23, + PPC_REG_Q24, + PPC_REG_Q25, + PPC_REG_Q26, + PPC_REG_Q27, + PPC_REG_Q28, + PPC_REG_Q29, + PPC_REG_Q30, + PPC_REG_Q31, + + // extra registers for PPCMapping.c + PPC_REG_RM, + PPC_REG_CTR8, + PPC_REG_LR8, + PPC_REG_CR1EQ, + PPC_REG_X2, + + PPC_REG_ENDING, // <-- mark the end of the list of registers +} ppc_reg; + +/// Instruction's operand referring to memory +/// This is associated with PPC_OP_MEM operand type above +typedef struct ppc_op_mem { + ppc_reg base; ///< base register + int32_t disp; ///< displacement/offset value +} ppc_op_mem; + +typedef struct ppc_op_crx { + unsigned int scale; + ppc_reg reg; + ppc_bc cond; +} ppc_op_crx; + +/// Instruction operand +typedef struct cs_ppc_op { + ppc_op_type type; ///< operand type + union { + ppc_reg reg; ///< register value for REG operand + int64_t imm; ///< immediate value for IMM operand + ppc_op_mem mem; ///< base/disp value for MEM operand + ppc_op_crx crx; ///< operand with condition register + }; +} cs_ppc_op; + +/// Instruction structure +typedef struct cs_ppc { + /// branch code for branch instructions + ppc_bc bc; + + /// branch hint for branch instructions + ppc_bh bh; + + /// if update_cr0 = True, then this 'dot' insn updates CR0 + bool update_cr0; + + /// Number of operands of this instruction, + /// or 0 when instruction has no operand. + uint8_t op_count; + cs_ppc_op operands[8]; ///< operands for this instruction. +} cs_ppc; + +/// PPC instruction +typedef enum ppc_insn { + PPC_INS_INVALID = 0, + + PPC_INS_ADD, + PPC_INS_ADDC, + PPC_INS_ADDE, + PPC_INS_ADDI, + PPC_INS_ADDIC, + PPC_INS_ADDIS, + PPC_INS_ADDME, + PPC_INS_ADDZE, + PPC_INS_AND, + PPC_INS_ANDC, + PPC_INS_ANDIS, + PPC_INS_ANDI, + PPC_INS_ATTN, + PPC_INS_B, + PPC_INS_BA, + PPC_INS_BC, + PPC_INS_BCCTR, + PPC_INS_BCCTRL, + PPC_INS_BCL, + PPC_INS_BCLR, + PPC_INS_BCLRL, + PPC_INS_BCTR, + PPC_INS_BCTRL, + PPC_INS_BCT, + PPC_INS_BDNZ, + PPC_INS_BDNZA, + PPC_INS_BDNZL, + PPC_INS_BDNZLA, + PPC_INS_BDNZLR, + PPC_INS_BDNZLRL, + PPC_INS_BDZ, + PPC_INS_BDZA, + PPC_INS_BDZL, + PPC_INS_BDZLA, + PPC_INS_BDZLR, + PPC_INS_BDZLRL, + PPC_INS_BL, + PPC_INS_BLA, + PPC_INS_BLR, + PPC_INS_BLRL, + PPC_INS_BRINC, + PPC_INS_CMPB, + PPC_INS_CMPD, + PPC_INS_CMPDI, + PPC_INS_CMPLD, + PPC_INS_CMPLDI, + PPC_INS_CMPLW, + PPC_INS_CMPLWI, + PPC_INS_CMPW, + PPC_INS_CMPWI, + PPC_INS_CNTLZD, + PPC_INS_CNTLZW, + PPC_INS_CREQV, + PPC_INS_CRXOR, + PPC_INS_CRAND, + PPC_INS_CRANDC, + PPC_INS_CRNAND, + PPC_INS_CRNOR, + PPC_INS_CROR, + PPC_INS_CRORC, + PPC_INS_DCBA, + PPC_INS_DCBF, + PPC_INS_DCBI, + PPC_INS_DCBST, + PPC_INS_DCBT, + PPC_INS_DCBTST, + PPC_INS_DCBZ, + PPC_INS_DCBZL, + PPC_INS_DCCCI, + PPC_INS_DIVD, + PPC_INS_DIVDU, + PPC_INS_DIVW, + PPC_INS_DIVWU, + PPC_INS_DSS, + PPC_INS_DSSALL, + PPC_INS_DST, + PPC_INS_DSTST, + PPC_INS_DSTSTT, + PPC_INS_DSTT, + PPC_INS_EQV, + PPC_INS_EVABS, + PPC_INS_EVADDIW, + PPC_INS_EVADDSMIAAW, + PPC_INS_EVADDSSIAAW, + PPC_INS_EVADDUMIAAW, + PPC_INS_EVADDUSIAAW, + PPC_INS_EVADDW, + PPC_INS_EVAND, + PPC_INS_EVANDC, + PPC_INS_EVCMPEQ, + PPC_INS_EVCMPGTS, + PPC_INS_EVCMPGTU, + PPC_INS_EVCMPLTS, + PPC_INS_EVCMPLTU, + PPC_INS_EVCNTLSW, + PPC_INS_EVCNTLZW, + PPC_INS_EVDIVWS, + PPC_INS_EVDIVWU, + PPC_INS_EVEQV, + PPC_INS_EVEXTSB, + PPC_INS_EVEXTSH, + PPC_INS_EVLDD, + PPC_INS_EVLDDX, + PPC_INS_EVLDH, + PPC_INS_EVLDHX, + PPC_INS_EVLDW, + PPC_INS_EVLDWX, + PPC_INS_EVLHHESPLAT, + PPC_INS_EVLHHESPLATX, + PPC_INS_EVLHHOSSPLAT, + PPC_INS_EVLHHOSSPLATX, + PPC_INS_EVLHHOUSPLAT, + PPC_INS_EVLHHOUSPLATX, + PPC_INS_EVLWHE, + PPC_INS_EVLWHEX, + PPC_INS_EVLWHOS, + PPC_INS_EVLWHOSX, + PPC_INS_EVLWHOU, + PPC_INS_EVLWHOUX, + PPC_INS_EVLWHSPLAT, + PPC_INS_EVLWHSPLATX, + PPC_INS_EVLWWSPLAT, + PPC_INS_EVLWWSPLATX, + PPC_INS_EVMERGEHI, + PPC_INS_EVMERGEHILO, + PPC_INS_EVMERGELO, + PPC_INS_EVMERGELOHI, + PPC_INS_EVMHEGSMFAA, + PPC_INS_EVMHEGSMFAN, + PPC_INS_EVMHEGSMIAA, + PPC_INS_EVMHEGSMIAN, + PPC_INS_EVMHEGUMIAA, + PPC_INS_EVMHEGUMIAN, + PPC_INS_EVMHESMF, + PPC_INS_EVMHESMFA, + PPC_INS_EVMHESMFAAW, + PPC_INS_EVMHESMFANW, + PPC_INS_EVMHESMI, + PPC_INS_EVMHESMIA, + PPC_INS_EVMHESMIAAW, + PPC_INS_EVMHESMIANW, + PPC_INS_EVMHESSF, + PPC_INS_EVMHESSFA, + PPC_INS_EVMHESSFAAW, + PPC_INS_EVMHESSFANW, + PPC_INS_EVMHESSIAAW, + PPC_INS_EVMHESSIANW, + PPC_INS_EVMHEUMI, + PPC_INS_EVMHEUMIA, + PPC_INS_EVMHEUMIAAW, + PPC_INS_EVMHEUMIANW, + PPC_INS_EVMHEUSIAAW, + PPC_INS_EVMHEUSIANW, + PPC_INS_EVMHOGSMFAA, + PPC_INS_EVMHOGSMFAN, + PPC_INS_EVMHOGSMIAA, + PPC_INS_EVMHOGSMIAN, + PPC_INS_EVMHOGUMIAA, + PPC_INS_EVMHOGUMIAN, + PPC_INS_EVMHOSMF, + PPC_INS_EVMHOSMFA, + PPC_INS_EVMHOSMFAAW, + PPC_INS_EVMHOSMFANW, + PPC_INS_EVMHOSMI, + PPC_INS_EVMHOSMIA, + PPC_INS_EVMHOSMIAAW, + PPC_INS_EVMHOSMIANW, + PPC_INS_EVMHOSSF, + PPC_INS_EVMHOSSFA, + PPC_INS_EVMHOSSFAAW, + PPC_INS_EVMHOSSFANW, + PPC_INS_EVMHOSSIAAW, + PPC_INS_EVMHOSSIANW, + PPC_INS_EVMHOUMI, + PPC_INS_EVMHOUMIA, + PPC_INS_EVMHOUMIAAW, + PPC_INS_EVMHOUMIANW, + PPC_INS_EVMHOUSIAAW, + PPC_INS_EVMHOUSIANW, + PPC_INS_EVMRA, + PPC_INS_EVMWHSMF, + PPC_INS_EVMWHSMFA, + PPC_INS_EVMWHSMI, + PPC_INS_EVMWHSMIA, + PPC_INS_EVMWHSSF, + PPC_INS_EVMWHSSFA, + PPC_INS_EVMWHUMI, + PPC_INS_EVMWHUMIA, + PPC_INS_EVMWLSMIAAW, + PPC_INS_EVMWLSMIANW, + PPC_INS_EVMWLSSIAAW, + PPC_INS_EVMWLSSIANW, + PPC_INS_EVMWLUMI, + PPC_INS_EVMWLUMIA, + PPC_INS_EVMWLUMIAAW, + PPC_INS_EVMWLUMIANW, + PPC_INS_EVMWLUSIAAW, + PPC_INS_EVMWLUSIANW, + PPC_INS_EVMWSMF, + PPC_INS_EVMWSMFA, + PPC_INS_EVMWSMFAA, + PPC_INS_EVMWSMFAN, + PPC_INS_EVMWSMI, + PPC_INS_EVMWSMIA, + PPC_INS_EVMWSMIAA, + PPC_INS_EVMWSMIAN, + PPC_INS_EVMWSSF, + PPC_INS_EVMWSSFA, + PPC_INS_EVMWSSFAA, + PPC_INS_EVMWSSFAN, + PPC_INS_EVMWUMI, + PPC_INS_EVMWUMIA, + PPC_INS_EVMWUMIAA, + PPC_INS_EVMWUMIAN, + PPC_INS_EVNAND, + PPC_INS_EVNEG, + PPC_INS_EVNOR, + PPC_INS_EVOR, + PPC_INS_EVORC, + PPC_INS_EVRLW, + PPC_INS_EVRLWI, + PPC_INS_EVRNDW, + PPC_INS_EVSLW, + PPC_INS_EVSLWI, + PPC_INS_EVSPLATFI, + PPC_INS_EVSPLATI, + PPC_INS_EVSRWIS, + PPC_INS_EVSRWIU, + PPC_INS_EVSRWS, + PPC_INS_EVSRWU, + PPC_INS_EVSTDD, + PPC_INS_EVSTDDX, + PPC_INS_EVSTDH, + PPC_INS_EVSTDHX, + PPC_INS_EVSTDW, + PPC_INS_EVSTDWX, + PPC_INS_EVSTWHE, + PPC_INS_EVSTWHEX, + PPC_INS_EVSTWHO, + PPC_INS_EVSTWHOX, + PPC_INS_EVSTWWE, + PPC_INS_EVSTWWEX, + PPC_INS_EVSTWWO, + PPC_INS_EVSTWWOX, + PPC_INS_EVSUBFSMIAAW, + PPC_INS_EVSUBFSSIAAW, + PPC_INS_EVSUBFUMIAAW, + PPC_INS_EVSUBFUSIAAW, + PPC_INS_EVSUBFW, + PPC_INS_EVSUBIFW, + PPC_INS_EVXOR, + PPC_INS_EXTSB, + PPC_INS_EXTSH, + PPC_INS_EXTSW, + PPC_INS_EIEIO, + PPC_INS_FABS, + PPC_INS_FADD, + PPC_INS_FADDS, + PPC_INS_FCFID, + PPC_INS_FCFIDS, + PPC_INS_FCFIDU, + PPC_INS_FCFIDUS, + PPC_INS_FCMPU, + PPC_INS_FCPSGN, + PPC_INS_FCTID, + PPC_INS_FCTIDUZ, + PPC_INS_FCTIDZ, + PPC_INS_FCTIW, + PPC_INS_FCTIWUZ, + PPC_INS_FCTIWZ, + PPC_INS_FDIV, + PPC_INS_FDIVS, + PPC_INS_FMADD, + PPC_INS_FMADDS, + PPC_INS_FMR, + PPC_INS_FMSUB, + PPC_INS_FMSUBS, + PPC_INS_FMUL, + PPC_INS_FMULS, + PPC_INS_FNABS, + PPC_INS_FNEG, + PPC_INS_FNMADD, + PPC_INS_FNMADDS, + PPC_INS_FNMSUB, + PPC_INS_FNMSUBS, + PPC_INS_FRE, + PPC_INS_FRES, + PPC_INS_FRIM, + PPC_INS_FRIN, + PPC_INS_FRIP, + PPC_INS_FRIZ, + PPC_INS_FRSP, + PPC_INS_FRSQRTE, + PPC_INS_FRSQRTES, + PPC_INS_FSEL, + PPC_INS_FSQRT, + PPC_INS_FSQRTS, + PPC_INS_FSUB, + PPC_INS_FSUBS, + PPC_INS_ICBI, + PPC_INS_ICBT, + PPC_INS_ICCCI, + PPC_INS_ISEL, + PPC_INS_ISYNC, + PPC_INS_LA, + PPC_INS_LBZ, + PPC_INS_LBZCIX, + PPC_INS_LBZU, + PPC_INS_LBZUX, + PPC_INS_LBZX, + PPC_INS_LD, + PPC_INS_LDARX, + PPC_INS_LDBRX, + PPC_INS_LDCIX, + PPC_INS_LDU, + PPC_INS_LDUX, + PPC_INS_LDX, + PPC_INS_LFD, + PPC_INS_LFDU, + PPC_INS_LFDUX, + PPC_INS_LFDX, + PPC_INS_LFIWAX, + PPC_INS_LFIWZX, + PPC_INS_LFS, + PPC_INS_LFSU, + PPC_INS_LFSUX, + PPC_INS_LFSX, + PPC_INS_LHA, + PPC_INS_LHAU, + PPC_INS_LHAUX, + PPC_INS_LHAX, + PPC_INS_LHBRX, + PPC_INS_LHZ, + PPC_INS_LHZCIX, + PPC_INS_LHZU, + PPC_INS_LHZUX, + PPC_INS_LHZX, + PPC_INS_LI, + PPC_INS_LIS, + PPC_INS_LMW, + PPC_INS_LSWI, + PPC_INS_LVEBX, + PPC_INS_LVEHX, + PPC_INS_LVEWX, + PPC_INS_LVSL, + PPC_INS_LVSR, + PPC_INS_LVX, + PPC_INS_LVXL, + PPC_INS_LWA, + PPC_INS_LWARX, + PPC_INS_LWAUX, + PPC_INS_LWAX, + PPC_INS_LWBRX, + PPC_INS_LWZ, + PPC_INS_LWZCIX, + PPC_INS_LWZU, + PPC_INS_LWZUX, + PPC_INS_LWZX, + PPC_INS_LXSDX, + PPC_INS_LXVD2X, + PPC_INS_LXVDSX, + PPC_INS_LXVW4X, + PPC_INS_MBAR, + PPC_INS_MCRF, + PPC_INS_MCRFS, + PPC_INS_MFCR, + PPC_INS_MFCTR, + PPC_INS_MFDCR, + PPC_INS_MFFS, + PPC_INS_MFLR, + PPC_INS_MFMSR, + PPC_INS_MFOCRF, + PPC_INS_MFSPR, + PPC_INS_MFSR, + PPC_INS_MFSRIN, + PPC_INS_MFTB, + PPC_INS_MFVSCR, + PPC_INS_MSYNC, + PPC_INS_MTCRF, + PPC_INS_MTCTR, + PPC_INS_MTDCR, + PPC_INS_MTFSB0, + PPC_INS_MTFSB1, + PPC_INS_MTFSF, + PPC_INS_MTFSFI, + PPC_INS_MTLR, + PPC_INS_MTMSR, + PPC_INS_MTMSRD, + PPC_INS_MTOCRF, + PPC_INS_MTSPR, + PPC_INS_MTSR, + PPC_INS_MTSRIN, + PPC_INS_MTVSCR, + PPC_INS_MULHD, + PPC_INS_MULHDU, + PPC_INS_MULHW, + PPC_INS_MULHWU, + PPC_INS_MULLD, + PPC_INS_MULLI, + PPC_INS_MULLW, + PPC_INS_NAND, + PPC_INS_NEG, + PPC_INS_NOP, + PPC_INS_ORI, + PPC_INS_NOR, + PPC_INS_OR, + PPC_INS_ORC, + PPC_INS_ORIS, + PPC_INS_POPCNTD, + PPC_INS_POPCNTW, + PPC_INS_QVALIGNI, + PPC_INS_QVESPLATI, + PPC_INS_QVFABS, + PPC_INS_QVFADD, + PPC_INS_QVFADDS, + PPC_INS_QVFCFID, + PPC_INS_QVFCFIDS, + PPC_INS_QVFCFIDU, + PPC_INS_QVFCFIDUS, + PPC_INS_QVFCMPEQ, + PPC_INS_QVFCMPGT, + PPC_INS_QVFCMPLT, + PPC_INS_QVFCPSGN, + PPC_INS_QVFCTID, + PPC_INS_QVFCTIDU, + PPC_INS_QVFCTIDUZ, + PPC_INS_QVFCTIDZ, + PPC_INS_QVFCTIW, + PPC_INS_QVFCTIWU, + PPC_INS_QVFCTIWUZ, + PPC_INS_QVFCTIWZ, + PPC_INS_QVFLOGICAL, + PPC_INS_QVFMADD, + PPC_INS_QVFMADDS, + PPC_INS_QVFMR, + PPC_INS_QVFMSUB, + PPC_INS_QVFMSUBS, + PPC_INS_QVFMUL, + PPC_INS_QVFMULS, + PPC_INS_QVFNABS, + PPC_INS_QVFNEG, + PPC_INS_QVFNMADD, + PPC_INS_QVFNMADDS, + PPC_INS_QVFNMSUB, + PPC_INS_QVFNMSUBS, + PPC_INS_QVFPERM, + PPC_INS_QVFRE, + PPC_INS_QVFRES, + PPC_INS_QVFRIM, + PPC_INS_QVFRIN, + PPC_INS_QVFRIP, + PPC_INS_QVFRIZ, + PPC_INS_QVFRSP, + PPC_INS_QVFRSQRTE, + PPC_INS_QVFRSQRTES, + PPC_INS_QVFSEL, + PPC_INS_QVFSUB, + PPC_INS_QVFSUBS, + PPC_INS_QVFTSTNAN, + PPC_INS_QVFXMADD, + PPC_INS_QVFXMADDS, + PPC_INS_QVFXMUL, + PPC_INS_QVFXMULS, + PPC_INS_QVFXXCPNMADD, + PPC_INS_QVFXXCPNMADDS, + PPC_INS_QVFXXMADD, + PPC_INS_QVFXXMADDS, + PPC_INS_QVFXXNPMADD, + PPC_INS_QVFXXNPMADDS, + PPC_INS_QVGPCI, + PPC_INS_QVLFCDUX, + PPC_INS_QVLFCDUXA, + PPC_INS_QVLFCDX, + PPC_INS_QVLFCDXA, + PPC_INS_QVLFCSUX, + PPC_INS_QVLFCSUXA, + PPC_INS_QVLFCSX, + PPC_INS_QVLFCSXA, + PPC_INS_QVLFDUX, + PPC_INS_QVLFDUXA, + PPC_INS_QVLFDX, + PPC_INS_QVLFDXA, + PPC_INS_QVLFIWAX, + PPC_INS_QVLFIWAXA, + PPC_INS_QVLFIWZX, + PPC_INS_QVLFIWZXA, + PPC_INS_QVLFSUX, + PPC_INS_QVLFSUXA, + PPC_INS_QVLFSX, + PPC_INS_QVLFSXA, + PPC_INS_QVLPCLDX, + PPC_INS_QVLPCLSX, + PPC_INS_QVLPCRDX, + PPC_INS_QVLPCRSX, + PPC_INS_QVSTFCDUX, + PPC_INS_QVSTFCDUXA, + PPC_INS_QVSTFCDUXI, + PPC_INS_QVSTFCDUXIA, + PPC_INS_QVSTFCDX, + PPC_INS_QVSTFCDXA, + PPC_INS_QVSTFCDXI, + PPC_INS_QVSTFCDXIA, + PPC_INS_QVSTFCSUX, + PPC_INS_QVSTFCSUXA, + PPC_INS_QVSTFCSUXI, + PPC_INS_QVSTFCSUXIA, + PPC_INS_QVSTFCSX, + PPC_INS_QVSTFCSXA, + PPC_INS_QVSTFCSXI, + PPC_INS_QVSTFCSXIA, + PPC_INS_QVSTFDUX, + PPC_INS_QVSTFDUXA, + PPC_INS_QVSTFDUXI, + PPC_INS_QVSTFDUXIA, + PPC_INS_QVSTFDX, + PPC_INS_QVSTFDXA, + PPC_INS_QVSTFDXI, + PPC_INS_QVSTFDXIA, + PPC_INS_QVSTFIWX, + PPC_INS_QVSTFIWXA, + PPC_INS_QVSTFSUX, + PPC_INS_QVSTFSUXA, + PPC_INS_QVSTFSUXI, + PPC_INS_QVSTFSUXIA, + PPC_INS_QVSTFSX, + PPC_INS_QVSTFSXA, + PPC_INS_QVSTFSXI, + PPC_INS_QVSTFSXIA, + PPC_INS_RFCI, + PPC_INS_RFDI, + PPC_INS_RFI, + PPC_INS_RFID, + PPC_INS_RFMCI, + PPC_INS_RLDCL, + PPC_INS_RLDCR, + PPC_INS_RLDIC, + PPC_INS_RLDICL, + PPC_INS_RLDICR, + PPC_INS_RLDIMI, + PPC_INS_RLWIMI, + PPC_INS_RLWINM, + PPC_INS_RLWNM, + PPC_INS_SC, + PPC_INS_SLBIA, + PPC_INS_SLBIE, + PPC_INS_SLBMFEE, + PPC_INS_SLBMTE, + PPC_INS_SLD, + PPC_INS_SLW, + PPC_INS_SRAD, + PPC_INS_SRADI, + PPC_INS_SRAW, + PPC_INS_SRAWI, + PPC_INS_SRD, + PPC_INS_SRW, + PPC_INS_STB, + PPC_INS_STBCIX, + PPC_INS_STBU, + PPC_INS_STBUX, + PPC_INS_STBX, + PPC_INS_STD, + PPC_INS_STDBRX, + PPC_INS_STDCIX, + PPC_INS_STDCX, + PPC_INS_STDU, + PPC_INS_STDUX, + PPC_INS_STDX, + PPC_INS_STFD, + PPC_INS_STFDU, + PPC_INS_STFDUX, + PPC_INS_STFDX, + PPC_INS_STFIWX, + PPC_INS_STFS, + PPC_INS_STFSU, + PPC_INS_STFSUX, + PPC_INS_STFSX, + PPC_INS_STH, + PPC_INS_STHBRX, + PPC_INS_STHCIX, + PPC_INS_STHU, + PPC_INS_STHUX, + PPC_INS_STHX, + PPC_INS_STMW, + PPC_INS_STSWI, + PPC_INS_STVEBX, + PPC_INS_STVEHX, + PPC_INS_STVEWX, + PPC_INS_STVX, + PPC_INS_STVXL, + PPC_INS_STW, + PPC_INS_STWBRX, + PPC_INS_STWCIX, + PPC_INS_STWCX, + PPC_INS_STWU, + PPC_INS_STWUX, + PPC_INS_STWX, + PPC_INS_STXSDX, + PPC_INS_STXVD2X, + PPC_INS_STXVW4X, + PPC_INS_SUBF, + PPC_INS_SUBFC, + PPC_INS_SUBFE, + PPC_INS_SUBFIC, + PPC_INS_SUBFME, + PPC_INS_SUBFZE, + PPC_INS_SYNC, + PPC_INS_TD, + PPC_INS_TDI, + PPC_INS_TLBIA, + PPC_INS_TLBIE, + PPC_INS_TLBIEL, + PPC_INS_TLBIVAX, + PPC_INS_TLBLD, + PPC_INS_TLBLI, + PPC_INS_TLBRE, + PPC_INS_TLBSX, + PPC_INS_TLBSYNC, + PPC_INS_TLBWE, + PPC_INS_TRAP, + PPC_INS_TW, + PPC_INS_TWI, + PPC_INS_VADDCUW, + PPC_INS_VADDFP, + PPC_INS_VADDSBS, + PPC_INS_VADDSHS, + PPC_INS_VADDSWS, + PPC_INS_VADDUBM, + PPC_INS_VADDUBS, + PPC_INS_VADDUDM, + PPC_INS_VADDUHM, + PPC_INS_VADDUHS, + PPC_INS_VADDUWM, + PPC_INS_VADDUWS, + PPC_INS_VAND, + PPC_INS_VANDC, + PPC_INS_VAVGSB, + PPC_INS_VAVGSH, + PPC_INS_VAVGSW, + PPC_INS_VAVGUB, + PPC_INS_VAVGUH, + PPC_INS_VAVGUW, + PPC_INS_VCFSX, + PPC_INS_VCFUX, + PPC_INS_VCLZB, + PPC_INS_VCLZD, + PPC_INS_VCLZH, + PPC_INS_VCLZW, + PPC_INS_VCMPBFP, + PPC_INS_VCMPEQFP, + PPC_INS_VCMPEQUB, + PPC_INS_VCMPEQUD, + PPC_INS_VCMPEQUH, + PPC_INS_VCMPEQUW, + PPC_INS_VCMPGEFP, + PPC_INS_VCMPGTFP, + PPC_INS_VCMPGTSB, + PPC_INS_VCMPGTSD, + PPC_INS_VCMPGTSH, + PPC_INS_VCMPGTSW, + PPC_INS_VCMPGTUB, + PPC_INS_VCMPGTUD, + PPC_INS_VCMPGTUH, + PPC_INS_VCMPGTUW, + PPC_INS_VCTSXS, + PPC_INS_VCTUXS, + PPC_INS_VEQV, + PPC_INS_VEXPTEFP, + PPC_INS_VLOGEFP, + PPC_INS_VMADDFP, + PPC_INS_VMAXFP, + PPC_INS_VMAXSB, + PPC_INS_VMAXSD, + PPC_INS_VMAXSH, + PPC_INS_VMAXSW, + PPC_INS_VMAXUB, + PPC_INS_VMAXUD, + PPC_INS_VMAXUH, + PPC_INS_VMAXUW, + PPC_INS_VMHADDSHS, + PPC_INS_VMHRADDSHS, + PPC_INS_VMINUD, + PPC_INS_VMINFP, + PPC_INS_VMINSB, + PPC_INS_VMINSD, + PPC_INS_VMINSH, + PPC_INS_VMINSW, + PPC_INS_VMINUB, + PPC_INS_VMINUH, + PPC_INS_VMINUW, + PPC_INS_VMLADDUHM, + PPC_INS_VMRGHB, + PPC_INS_VMRGHH, + PPC_INS_VMRGHW, + PPC_INS_VMRGLB, + PPC_INS_VMRGLH, + PPC_INS_VMRGLW, + PPC_INS_VMSUMMBM, + PPC_INS_VMSUMSHM, + PPC_INS_VMSUMSHS, + PPC_INS_VMSUMUBM, + PPC_INS_VMSUMUHM, + PPC_INS_VMSUMUHS, + PPC_INS_VMULESB, + PPC_INS_VMULESH, + PPC_INS_VMULESW, + PPC_INS_VMULEUB, + PPC_INS_VMULEUH, + PPC_INS_VMULEUW, + PPC_INS_VMULOSB, + PPC_INS_VMULOSH, + PPC_INS_VMULOSW, + PPC_INS_VMULOUB, + PPC_INS_VMULOUH, + PPC_INS_VMULOUW, + PPC_INS_VMULUWM, + PPC_INS_VNAND, + PPC_INS_VNMSUBFP, + PPC_INS_VNOR, + PPC_INS_VOR, + PPC_INS_VORC, + PPC_INS_VPERM, + PPC_INS_VPKPX, + PPC_INS_VPKSHSS, + PPC_INS_VPKSHUS, + PPC_INS_VPKSWSS, + PPC_INS_VPKSWUS, + PPC_INS_VPKUHUM, + PPC_INS_VPKUHUS, + PPC_INS_VPKUWUM, + PPC_INS_VPKUWUS, + PPC_INS_VPOPCNTB, + PPC_INS_VPOPCNTD, + PPC_INS_VPOPCNTH, + PPC_INS_VPOPCNTW, + PPC_INS_VREFP, + PPC_INS_VRFIM, + PPC_INS_VRFIN, + PPC_INS_VRFIP, + PPC_INS_VRFIZ, + PPC_INS_VRLB, + PPC_INS_VRLD, + PPC_INS_VRLH, + PPC_INS_VRLW, + PPC_INS_VRSQRTEFP, + PPC_INS_VSEL, + PPC_INS_VSL, + PPC_INS_VSLB, + PPC_INS_VSLD, + PPC_INS_VSLDOI, + PPC_INS_VSLH, + PPC_INS_VSLO, + PPC_INS_VSLW, + PPC_INS_VSPLTB, + PPC_INS_VSPLTH, + PPC_INS_VSPLTISB, + PPC_INS_VSPLTISH, + PPC_INS_VSPLTISW, + PPC_INS_VSPLTW, + PPC_INS_VSR, + PPC_INS_VSRAB, + PPC_INS_VSRAD, + PPC_INS_VSRAH, + PPC_INS_VSRAW, + PPC_INS_VSRB, + PPC_INS_VSRD, + PPC_INS_VSRH, + PPC_INS_VSRO, + PPC_INS_VSRW, + PPC_INS_VSUBCUW, + PPC_INS_VSUBFP, + PPC_INS_VSUBSBS, + PPC_INS_VSUBSHS, + PPC_INS_VSUBSWS, + PPC_INS_VSUBUBM, + PPC_INS_VSUBUBS, + PPC_INS_VSUBUDM, + PPC_INS_VSUBUHM, + PPC_INS_VSUBUHS, + PPC_INS_VSUBUWM, + PPC_INS_VSUBUWS, + PPC_INS_VSUM2SWS, + PPC_INS_VSUM4SBS, + PPC_INS_VSUM4SHS, + PPC_INS_VSUM4UBS, + PPC_INS_VSUMSWS, + PPC_INS_VUPKHPX, + PPC_INS_VUPKHSB, + PPC_INS_VUPKHSH, + PPC_INS_VUPKLPX, + PPC_INS_VUPKLSB, + PPC_INS_VUPKLSH, + PPC_INS_VXOR, + PPC_INS_WAIT, + PPC_INS_WRTEE, + PPC_INS_WRTEEI, + PPC_INS_XOR, + PPC_INS_XORI, + PPC_INS_XORIS, + PPC_INS_XSABSDP, + PPC_INS_XSADDDP, + PPC_INS_XSCMPODP, + PPC_INS_XSCMPUDP, + PPC_INS_XSCPSGNDP, + PPC_INS_XSCVDPSP, + PPC_INS_XSCVDPSXDS, + PPC_INS_XSCVDPSXWS, + PPC_INS_XSCVDPUXDS, + PPC_INS_XSCVDPUXWS, + PPC_INS_XSCVSPDP, + PPC_INS_XSCVSXDDP, + PPC_INS_XSCVUXDDP, + PPC_INS_XSDIVDP, + PPC_INS_XSMADDADP, + PPC_INS_XSMADDMDP, + PPC_INS_XSMAXDP, + PPC_INS_XSMINDP, + PPC_INS_XSMSUBADP, + PPC_INS_XSMSUBMDP, + PPC_INS_XSMULDP, + PPC_INS_XSNABSDP, + PPC_INS_XSNEGDP, + PPC_INS_XSNMADDADP, + PPC_INS_XSNMADDMDP, + PPC_INS_XSNMSUBADP, + PPC_INS_XSNMSUBMDP, + PPC_INS_XSRDPI, + PPC_INS_XSRDPIC, + PPC_INS_XSRDPIM, + PPC_INS_XSRDPIP, + PPC_INS_XSRDPIZ, + PPC_INS_XSREDP, + PPC_INS_XSRSQRTEDP, + PPC_INS_XSSQRTDP, + PPC_INS_XSSUBDP, + PPC_INS_XSTDIVDP, + PPC_INS_XSTSQRTDP, + PPC_INS_XVABSDP, + PPC_INS_XVABSSP, + PPC_INS_XVADDDP, + PPC_INS_XVADDSP, + PPC_INS_XVCMPEQDP, + PPC_INS_XVCMPEQSP, + PPC_INS_XVCMPGEDP, + PPC_INS_XVCMPGESP, + PPC_INS_XVCMPGTDP, + PPC_INS_XVCMPGTSP, + PPC_INS_XVCPSGNDP, + PPC_INS_XVCPSGNSP, + PPC_INS_XVCVDPSP, + PPC_INS_XVCVDPSXDS, + PPC_INS_XVCVDPSXWS, + PPC_INS_XVCVDPUXDS, + PPC_INS_XVCVDPUXWS, + PPC_INS_XVCVSPDP, + PPC_INS_XVCVSPSXDS, + PPC_INS_XVCVSPSXWS, + PPC_INS_XVCVSPUXDS, + PPC_INS_XVCVSPUXWS, + PPC_INS_XVCVSXDDP, + PPC_INS_XVCVSXDSP, + PPC_INS_XVCVSXWDP, + PPC_INS_XVCVSXWSP, + PPC_INS_XVCVUXDDP, + PPC_INS_XVCVUXDSP, + PPC_INS_XVCVUXWDP, + PPC_INS_XVCVUXWSP, + PPC_INS_XVDIVDP, + PPC_INS_XVDIVSP, + PPC_INS_XVMADDADP, + PPC_INS_XVMADDASP, + PPC_INS_XVMADDMDP, + PPC_INS_XVMADDMSP, + PPC_INS_XVMAXDP, + PPC_INS_XVMAXSP, + PPC_INS_XVMINDP, + PPC_INS_XVMINSP, + PPC_INS_XVMSUBADP, + PPC_INS_XVMSUBASP, + PPC_INS_XVMSUBMDP, + PPC_INS_XVMSUBMSP, + PPC_INS_XVMULDP, + PPC_INS_XVMULSP, + PPC_INS_XVNABSDP, + PPC_INS_XVNABSSP, + PPC_INS_XVNEGDP, + PPC_INS_XVNEGSP, + PPC_INS_XVNMADDADP, + PPC_INS_XVNMADDASP, + PPC_INS_XVNMADDMDP, + PPC_INS_XVNMADDMSP, + PPC_INS_XVNMSUBADP, + PPC_INS_XVNMSUBASP, + PPC_INS_XVNMSUBMDP, + PPC_INS_XVNMSUBMSP, + PPC_INS_XVRDPI, + PPC_INS_XVRDPIC, + PPC_INS_XVRDPIM, + PPC_INS_XVRDPIP, + PPC_INS_XVRDPIZ, + PPC_INS_XVREDP, + PPC_INS_XVRESP, + PPC_INS_XVRSPI, + PPC_INS_XVRSPIC, + PPC_INS_XVRSPIM, + PPC_INS_XVRSPIP, + PPC_INS_XVRSPIZ, + PPC_INS_XVRSQRTEDP, + PPC_INS_XVRSQRTESP, + PPC_INS_XVSQRTDP, + PPC_INS_XVSQRTSP, + PPC_INS_XVSUBDP, + PPC_INS_XVSUBSP, + PPC_INS_XVTDIVDP, + PPC_INS_XVTDIVSP, + PPC_INS_XVTSQRTDP, + PPC_INS_XVTSQRTSP, + PPC_INS_XXLAND, + PPC_INS_XXLANDC, + PPC_INS_XXLEQV, + PPC_INS_XXLNAND, + PPC_INS_XXLNOR, + PPC_INS_XXLOR, + PPC_INS_XXLORC, + PPC_INS_XXLXOR, + PPC_INS_XXMRGHW, + PPC_INS_XXMRGLW, + PPC_INS_XXPERMDI, + PPC_INS_XXSEL, + PPC_INS_XXSLDWI, + PPC_INS_XXSPLTW, + PPC_INS_BCA, + PPC_INS_BCLA, + + // extra & alias instructions + PPC_INS_SLWI, + PPC_INS_SRWI, + PPC_INS_SLDI, + + PPC_INS_BTA, + PPC_INS_CRSET, + PPC_INS_CRNOT, + PPC_INS_CRMOVE, + PPC_INS_CRCLR, + PPC_INS_MFBR0, + PPC_INS_MFBR1, + PPC_INS_MFBR2, + PPC_INS_MFBR3, + PPC_INS_MFBR4, + PPC_INS_MFBR5, + PPC_INS_MFBR6, + PPC_INS_MFBR7, + PPC_INS_MFXER, + PPC_INS_MFRTCU, + PPC_INS_MFRTCL, + PPC_INS_MFDSCR, + PPC_INS_MFDSISR, + PPC_INS_MFDAR, + PPC_INS_MFSRR2, + PPC_INS_MFSRR3, + PPC_INS_MFCFAR, + PPC_INS_MFAMR, + PPC_INS_MFPID, + PPC_INS_MFTBLO, + PPC_INS_MFTBHI, + PPC_INS_MFDBATU, + PPC_INS_MFDBATL, + PPC_INS_MFIBATU, + PPC_INS_MFIBATL, + PPC_INS_MFDCCR, + PPC_INS_MFICCR, + PPC_INS_MFDEAR, + PPC_INS_MFESR, + PPC_INS_MFSPEFSCR, + PPC_INS_MFTCR, + PPC_INS_MFASR, + PPC_INS_MFPVR, + PPC_INS_MFTBU, + PPC_INS_MTCR, + PPC_INS_MTBR0, + PPC_INS_MTBR1, + PPC_INS_MTBR2, + PPC_INS_MTBR3, + PPC_INS_MTBR4, + PPC_INS_MTBR5, + PPC_INS_MTBR6, + PPC_INS_MTBR7, + PPC_INS_MTXER, + PPC_INS_MTDSCR, + PPC_INS_MTDSISR, + PPC_INS_MTDAR, + PPC_INS_MTSRR2, + PPC_INS_MTSRR3, + PPC_INS_MTCFAR, + PPC_INS_MTAMR, + PPC_INS_MTPID, + PPC_INS_MTTBL, + PPC_INS_MTTBU, + PPC_INS_MTTBLO, + PPC_INS_MTTBHI, + PPC_INS_MTDBATU, + PPC_INS_MTDBATL, + PPC_INS_MTIBATU, + PPC_INS_MTIBATL, + PPC_INS_MTDCCR, + PPC_INS_MTICCR, + PPC_INS_MTDEAR, + PPC_INS_MTESR, + PPC_INS_MTSPEFSCR, + PPC_INS_MTTCR, + PPC_INS_NOT, + PPC_INS_MR, + PPC_INS_ROTLD, + PPC_INS_ROTLDI, + PPC_INS_CLRLDI, + PPC_INS_ROTLWI, + PPC_INS_CLRLWI, + PPC_INS_ROTLW, + PPC_INS_SUB, + PPC_INS_SUBC, + PPC_INS_LWSYNC, + PPC_INS_PTESYNC, + PPC_INS_TDLT, + PPC_INS_TDEQ, + PPC_INS_TDGT, + PPC_INS_TDNE, + PPC_INS_TDLLT, + PPC_INS_TDLGT, + PPC_INS_TDU, + PPC_INS_TDLTI, + PPC_INS_TDEQI, + PPC_INS_TDGTI, + PPC_INS_TDNEI, + PPC_INS_TDLLTI, + PPC_INS_TDLGTI, + PPC_INS_TDUI, + PPC_INS_TLBREHI, + PPC_INS_TLBRELO, + PPC_INS_TLBWEHI, + PPC_INS_TLBWELO, + PPC_INS_TWLT, + PPC_INS_TWEQ, + PPC_INS_TWGT, + PPC_INS_TWNE, + PPC_INS_TWLLT, + PPC_INS_TWLGT, + PPC_INS_TWU, + PPC_INS_TWLTI, + PPC_INS_TWEQI, + PPC_INS_TWGTI, + PPC_INS_TWNEI, + PPC_INS_TWLLTI, + PPC_INS_TWLGTI, + PPC_INS_TWUI, + PPC_INS_WAITRSV, + PPC_INS_WAITIMPL, + PPC_INS_XNOP, + PPC_INS_XVMOVDP, + PPC_INS_XVMOVSP, + PPC_INS_XXSPLTD, + PPC_INS_XXMRGHD, + PPC_INS_XXMRGLD, + PPC_INS_XXSWAPD, + PPC_INS_BT, + PPC_INS_BF, + PPC_INS_BDNZT, + PPC_INS_BDNZF, + PPC_INS_BDZF, + PPC_INS_BDZT, + PPC_INS_BFA, + PPC_INS_BDNZTA, + PPC_INS_BDNZFA, + PPC_INS_BDZTA, + PPC_INS_BDZFA, + PPC_INS_BTCTR, + PPC_INS_BFCTR, + PPC_INS_BTCTRL, + PPC_INS_BFCTRL, + PPC_INS_BTL, + PPC_INS_BFL, + PPC_INS_BDNZTL, + PPC_INS_BDNZFL, + PPC_INS_BDZTL, + PPC_INS_BDZFL, + PPC_INS_BTLA, + PPC_INS_BFLA, + PPC_INS_BDNZTLA, + PPC_INS_BDNZFLA, + PPC_INS_BDZTLA, + PPC_INS_BDZFLA, + PPC_INS_BTLR, + PPC_INS_BFLR, + PPC_INS_BDNZTLR, + PPC_INS_BDZTLR, + PPC_INS_BDZFLR, + PPC_INS_BTLRL, + PPC_INS_BFLRL, + PPC_INS_BDNZTLRL, + PPC_INS_BDNZFLRL, + PPC_INS_BDZTLRL, + PPC_INS_BDZFLRL, + + // QPX + PPC_INS_QVFAND, + PPC_INS_QVFCLR, + PPC_INS_QVFANDC, + PPC_INS_QVFCTFB, + PPC_INS_QVFXOR, + PPC_INS_QVFOR, + PPC_INS_QVFNOR, + PPC_INS_QVFEQU, + PPC_INS_QVFNOT, + PPC_INS_QVFORC, + PPC_INS_QVFNAND, + PPC_INS_QVFSET, + + PPC_INS_ENDING, // <-- mark the end of the list of instructions +} ppc_insn; + +/// Group of PPC instructions +typedef enum ppc_insn_group { + PPC_GRP_INVALID = 0, ///< = CS_GRP_INVALID + + // Generic groups + // all jump instructions (conditional+direct+indirect jumps) + PPC_GRP_JUMP, ///< = CS_GRP_JUMP + + // Architecture-specific groups + PPC_GRP_ALTIVEC = 128, + PPC_GRP_MODE32, + PPC_GRP_MODE64, + PPC_GRP_BOOKE, + PPC_GRP_NOTBOOKE, + PPC_GRP_SPE, + PPC_GRP_VSX, + PPC_GRP_E500, + PPC_GRP_PPC4XX, + PPC_GRP_PPC6XX, + PPC_GRP_ICBT, + PPC_GRP_P8ALTIVEC, + PPC_GRP_P8VECTOR, + PPC_GRP_QPX, + + PPC_GRP_ENDING, // <-- mark the end of the list of groups +} ppc_insn_group; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/EDUReViver/include/capstone/sparc.h b/EDUReViver/include/capstone/sparc.h new file mode 100644 index 0000000..e33d173 --- /dev/null +++ b/EDUReViver/include/capstone/sparc.h @@ -0,0 +1,520 @@ +#ifndef CAPSTONE_SPARC_H +#define CAPSTONE_SPARC_H + +/* Capstone Disassembly Engine */ +/* By Nguyen Anh Quynh , 2014-2015 */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "platform.h" + +// GCC SPARC toolchain has a default macro called "sparc" which breaks +// compilation +#undef sparc + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +/// Enums corresponding to Sparc condition codes, both icc's and fcc's. +typedef enum sparc_cc { + SPARC_CC_INVALID = 0, ///< invalid CC (default) + // Integer condition codes + SPARC_CC_ICC_A = 8+256, ///< Always + SPARC_CC_ICC_N = 0+256, ///< Never + SPARC_CC_ICC_NE = 9+256, ///< Not Equal + SPARC_CC_ICC_E = 1+256, ///< Equal + SPARC_CC_ICC_G = 10+256, ///< Greater + SPARC_CC_ICC_LE = 2+256, ///< Less or Equal + SPARC_CC_ICC_GE = 11+256, ///< Greater or Equal + SPARC_CC_ICC_L = 3+256, ///< Less + SPARC_CC_ICC_GU = 12+256, ///< Greater Unsigned + SPARC_CC_ICC_LEU = 4+256, ///< Less or Equal Unsigned + SPARC_CC_ICC_CC = 13+256, ///< Carry Clear/Great or Equal Unsigned + SPARC_CC_ICC_CS = 5+256, ///< Carry Set/Less Unsigned + SPARC_CC_ICC_POS = 14+256, ///< Positive + SPARC_CC_ICC_NEG = 6+256, ///< Negative + SPARC_CC_ICC_VC = 15+256, ///< Overflow Clear + SPARC_CC_ICC_VS = 7+256, ///< Overflow Set + + // Floating condition codes + SPARC_CC_FCC_A = 8+16+256, ///< Always + SPARC_CC_FCC_N = 0+16+256, ///< Never + SPARC_CC_FCC_U = 7+16+256, ///< Unordered + SPARC_CC_FCC_G = 6+16+256, ///< Greater + SPARC_CC_FCC_UG = 5+16+256, ///< Unordered or Greater + SPARC_CC_FCC_L = 4+16+256, ///< Less + SPARC_CC_FCC_UL = 3+16+256, ///< Unordered or Less + SPARC_CC_FCC_LG = 2+16+256, ///< Less or Greater + SPARC_CC_FCC_NE = 1+16+256, ///< Not Equal + SPARC_CC_FCC_E = 9+16+256, ///< Equal + SPARC_CC_FCC_UE = 10+16+256, ///< Unordered or Equal + SPARC_CC_FCC_GE = 11+16+256, ///< Greater or Equal + SPARC_CC_FCC_UGE = 12+16+256, ///< Unordered or Greater or Equal + SPARC_CC_FCC_LE = 13+16+256, ///< Less or Equal + SPARC_CC_FCC_ULE = 14+16+256, ///< Unordered or Less or Equal + SPARC_CC_FCC_O = 15+16+256, ///< Ordered +} sparc_cc; + +/// Branch hint +typedef enum sparc_hint { + SPARC_HINT_INVALID = 0, ///< no hint + SPARC_HINT_A = 1 << 0, ///< annul delay slot instruction + SPARC_HINT_PT = 1 << 1, ///< branch taken + SPARC_HINT_PN = 1 << 2, ///< branch NOT taken +} sparc_hint; + +/// Operand type for instruction's operands +typedef enum sparc_op_type { + SPARC_OP_INVALID = 0, ///< = CS_OP_INVALID (Uninitialized). + SPARC_OP_REG, ///< = CS_OP_REG (Register operand). + SPARC_OP_IMM, ///< = CS_OP_IMM (Immediate operand). + SPARC_OP_MEM, ///< = CS_OP_MEM (Memory operand). +} sparc_op_type; + +/// SPARC registers +typedef enum sparc_reg { + SPARC_REG_INVALID = 0, + + SPARC_REG_F0, + SPARC_REG_F1, + SPARC_REG_F2, + SPARC_REG_F3, + SPARC_REG_F4, + SPARC_REG_F5, + SPARC_REG_F6, + SPARC_REG_F7, + SPARC_REG_F8, + SPARC_REG_F9, + SPARC_REG_F10, + SPARC_REG_F11, + SPARC_REG_F12, + SPARC_REG_F13, + SPARC_REG_F14, + SPARC_REG_F15, + SPARC_REG_F16, + SPARC_REG_F17, + SPARC_REG_F18, + SPARC_REG_F19, + SPARC_REG_F20, + SPARC_REG_F21, + SPARC_REG_F22, + SPARC_REG_F23, + SPARC_REG_F24, + SPARC_REG_F25, + SPARC_REG_F26, + SPARC_REG_F27, + SPARC_REG_F28, + SPARC_REG_F29, + SPARC_REG_F30, + SPARC_REG_F31, + SPARC_REG_F32, + SPARC_REG_F34, + SPARC_REG_F36, + SPARC_REG_F38, + SPARC_REG_F40, + SPARC_REG_F42, + SPARC_REG_F44, + SPARC_REG_F46, + SPARC_REG_F48, + SPARC_REG_F50, + SPARC_REG_F52, + SPARC_REG_F54, + SPARC_REG_F56, + SPARC_REG_F58, + SPARC_REG_F60, + SPARC_REG_F62, + SPARC_REG_FCC0, // Floating condition codes + SPARC_REG_FCC1, + SPARC_REG_FCC2, + SPARC_REG_FCC3, + SPARC_REG_FP, + SPARC_REG_G0, + SPARC_REG_G1, + SPARC_REG_G2, + SPARC_REG_G3, + SPARC_REG_G4, + SPARC_REG_G5, + SPARC_REG_G6, + SPARC_REG_G7, + SPARC_REG_I0, + SPARC_REG_I1, + SPARC_REG_I2, + SPARC_REG_I3, + SPARC_REG_I4, + SPARC_REG_I5, + SPARC_REG_I7, + SPARC_REG_ICC, // Integer condition codes + SPARC_REG_L0, + SPARC_REG_L1, + SPARC_REG_L2, + SPARC_REG_L3, + SPARC_REG_L4, + SPARC_REG_L5, + SPARC_REG_L6, + SPARC_REG_L7, + SPARC_REG_O0, + SPARC_REG_O1, + SPARC_REG_O2, + SPARC_REG_O3, + SPARC_REG_O4, + SPARC_REG_O5, + SPARC_REG_O7, + SPARC_REG_SP, + SPARC_REG_Y, + + // special register + SPARC_REG_XCC, + + SPARC_REG_ENDING, // <-- mark the end of the list of registers + + // extras + SPARC_REG_O6 = SPARC_REG_SP, + SPARC_REG_I6 = SPARC_REG_FP, +} sparc_reg; + +/// Instruction's operand referring to memory +/// This is associated with SPARC_OP_MEM operand type above +typedef struct sparc_op_mem { + uint8_t base; ///< base register, can be safely interpreted as + ///< a value of type `sparc_reg`, but it is only + ///< one byte wide + uint8_t index; ///< index register, same conditions apply here + int32_t disp; ///< displacement/offset value +} sparc_op_mem; + +/// Instruction operand +typedef struct cs_sparc_op { + sparc_op_type type; ///< operand type + union { + sparc_reg reg; ///< register value for REG operand + int64_t imm; ///< immediate value for IMM operand + sparc_op_mem mem; ///< base/disp value for MEM operand + }; +} cs_sparc_op; + +/// Instruction structure +typedef struct cs_sparc { + sparc_cc cc; ///< code condition for this insn + sparc_hint hint; ///< branch hint: encoding as bitwise OR of sparc_hint. + /// Number of operands of this instruction, + /// or 0 when instruction has no operand. + uint8_t op_count; + cs_sparc_op operands[4]; ///< operands for this instruction. +} cs_sparc; + +/// SPARC instruction +typedef enum sparc_insn { + SPARC_INS_INVALID = 0, + + SPARC_INS_ADDCC, + SPARC_INS_ADDX, + SPARC_INS_ADDXCC, + SPARC_INS_ADDXC, + SPARC_INS_ADDXCCC, + SPARC_INS_ADD, + SPARC_INS_ALIGNADDR, + SPARC_INS_ALIGNADDRL, + SPARC_INS_ANDCC, + SPARC_INS_ANDNCC, + SPARC_INS_ANDN, + SPARC_INS_AND, + SPARC_INS_ARRAY16, + SPARC_INS_ARRAY32, + SPARC_INS_ARRAY8, + SPARC_INS_B, + SPARC_INS_JMP, + SPARC_INS_BMASK, + SPARC_INS_FB, + SPARC_INS_BRGEZ, + SPARC_INS_BRGZ, + SPARC_INS_BRLEZ, + SPARC_INS_BRLZ, + SPARC_INS_BRNZ, + SPARC_INS_BRZ, + SPARC_INS_BSHUFFLE, + SPARC_INS_CALL, + SPARC_INS_CASX, + SPARC_INS_CAS, + SPARC_INS_CMASK16, + SPARC_INS_CMASK32, + SPARC_INS_CMASK8, + SPARC_INS_CMP, + SPARC_INS_EDGE16, + SPARC_INS_EDGE16L, + SPARC_INS_EDGE16LN, + SPARC_INS_EDGE16N, + SPARC_INS_EDGE32, + SPARC_INS_EDGE32L, + SPARC_INS_EDGE32LN, + SPARC_INS_EDGE32N, + SPARC_INS_EDGE8, + SPARC_INS_EDGE8L, + SPARC_INS_EDGE8LN, + SPARC_INS_EDGE8N, + SPARC_INS_FABSD, + SPARC_INS_FABSQ, + SPARC_INS_FABSS, + SPARC_INS_FADDD, + SPARC_INS_FADDQ, + SPARC_INS_FADDS, + SPARC_INS_FALIGNDATA, + SPARC_INS_FAND, + SPARC_INS_FANDNOT1, + SPARC_INS_FANDNOT1S, + SPARC_INS_FANDNOT2, + SPARC_INS_FANDNOT2S, + SPARC_INS_FANDS, + SPARC_INS_FCHKSM16, + SPARC_INS_FCMPD, + SPARC_INS_FCMPEQ16, + SPARC_INS_FCMPEQ32, + SPARC_INS_FCMPGT16, + SPARC_INS_FCMPGT32, + SPARC_INS_FCMPLE16, + SPARC_INS_FCMPLE32, + SPARC_INS_FCMPNE16, + SPARC_INS_FCMPNE32, + SPARC_INS_FCMPQ, + SPARC_INS_FCMPS, + SPARC_INS_FDIVD, + SPARC_INS_FDIVQ, + SPARC_INS_FDIVS, + SPARC_INS_FDMULQ, + SPARC_INS_FDTOI, + SPARC_INS_FDTOQ, + SPARC_INS_FDTOS, + SPARC_INS_FDTOX, + SPARC_INS_FEXPAND, + SPARC_INS_FHADDD, + SPARC_INS_FHADDS, + SPARC_INS_FHSUBD, + SPARC_INS_FHSUBS, + SPARC_INS_FITOD, + SPARC_INS_FITOQ, + SPARC_INS_FITOS, + SPARC_INS_FLCMPD, + SPARC_INS_FLCMPS, + SPARC_INS_FLUSHW, + SPARC_INS_FMEAN16, + SPARC_INS_FMOVD, + SPARC_INS_FMOVQ, + SPARC_INS_FMOVRDGEZ, + SPARC_INS_FMOVRQGEZ, + SPARC_INS_FMOVRSGEZ, + SPARC_INS_FMOVRDGZ, + SPARC_INS_FMOVRQGZ, + SPARC_INS_FMOVRSGZ, + SPARC_INS_FMOVRDLEZ, + SPARC_INS_FMOVRQLEZ, + SPARC_INS_FMOVRSLEZ, + SPARC_INS_FMOVRDLZ, + SPARC_INS_FMOVRQLZ, + SPARC_INS_FMOVRSLZ, + SPARC_INS_FMOVRDNZ, + SPARC_INS_FMOVRQNZ, + SPARC_INS_FMOVRSNZ, + SPARC_INS_FMOVRDZ, + SPARC_INS_FMOVRQZ, + SPARC_INS_FMOVRSZ, + SPARC_INS_FMOVS, + SPARC_INS_FMUL8SUX16, + SPARC_INS_FMUL8ULX16, + SPARC_INS_FMUL8X16, + SPARC_INS_FMUL8X16AL, + SPARC_INS_FMUL8X16AU, + SPARC_INS_FMULD, + SPARC_INS_FMULD8SUX16, + SPARC_INS_FMULD8ULX16, + SPARC_INS_FMULQ, + SPARC_INS_FMULS, + SPARC_INS_FNADDD, + SPARC_INS_FNADDS, + SPARC_INS_FNAND, + SPARC_INS_FNANDS, + SPARC_INS_FNEGD, + SPARC_INS_FNEGQ, + SPARC_INS_FNEGS, + SPARC_INS_FNHADDD, + SPARC_INS_FNHADDS, + SPARC_INS_FNOR, + SPARC_INS_FNORS, + SPARC_INS_FNOT1, + SPARC_INS_FNOT1S, + SPARC_INS_FNOT2, + SPARC_INS_FNOT2S, + SPARC_INS_FONE, + SPARC_INS_FONES, + SPARC_INS_FOR, + SPARC_INS_FORNOT1, + SPARC_INS_FORNOT1S, + SPARC_INS_FORNOT2, + SPARC_INS_FORNOT2S, + SPARC_INS_FORS, + SPARC_INS_FPACK16, + SPARC_INS_FPACK32, + SPARC_INS_FPACKFIX, + SPARC_INS_FPADD16, + SPARC_INS_FPADD16S, + SPARC_INS_FPADD32, + SPARC_INS_FPADD32S, + SPARC_INS_FPADD64, + SPARC_INS_FPMERGE, + SPARC_INS_FPSUB16, + SPARC_INS_FPSUB16S, + SPARC_INS_FPSUB32, + SPARC_INS_FPSUB32S, + SPARC_INS_FQTOD, + SPARC_INS_FQTOI, + SPARC_INS_FQTOS, + SPARC_INS_FQTOX, + SPARC_INS_FSLAS16, + SPARC_INS_FSLAS32, + SPARC_INS_FSLL16, + SPARC_INS_FSLL32, + SPARC_INS_FSMULD, + SPARC_INS_FSQRTD, + SPARC_INS_FSQRTQ, + SPARC_INS_FSQRTS, + SPARC_INS_FSRA16, + SPARC_INS_FSRA32, + SPARC_INS_FSRC1, + SPARC_INS_FSRC1S, + SPARC_INS_FSRC2, + SPARC_INS_FSRC2S, + SPARC_INS_FSRL16, + SPARC_INS_FSRL32, + SPARC_INS_FSTOD, + SPARC_INS_FSTOI, + SPARC_INS_FSTOQ, + SPARC_INS_FSTOX, + SPARC_INS_FSUBD, + SPARC_INS_FSUBQ, + SPARC_INS_FSUBS, + SPARC_INS_FXNOR, + SPARC_INS_FXNORS, + SPARC_INS_FXOR, + SPARC_INS_FXORS, + SPARC_INS_FXTOD, + SPARC_INS_FXTOQ, + SPARC_INS_FXTOS, + SPARC_INS_FZERO, + SPARC_INS_FZEROS, + SPARC_INS_JMPL, + SPARC_INS_LDD, + SPARC_INS_LD, + SPARC_INS_LDQ, + SPARC_INS_LDSB, + SPARC_INS_LDSH, + SPARC_INS_LDSW, + SPARC_INS_LDUB, + SPARC_INS_LDUH, + SPARC_INS_LDX, + SPARC_INS_LZCNT, + SPARC_INS_MEMBAR, + SPARC_INS_MOVDTOX, + SPARC_INS_MOV, + SPARC_INS_MOVRGEZ, + SPARC_INS_MOVRGZ, + SPARC_INS_MOVRLEZ, + SPARC_INS_MOVRLZ, + SPARC_INS_MOVRNZ, + SPARC_INS_MOVRZ, + SPARC_INS_MOVSTOSW, + SPARC_INS_MOVSTOUW, + SPARC_INS_MULX, + SPARC_INS_NOP, + SPARC_INS_ORCC, + SPARC_INS_ORNCC, + SPARC_INS_ORN, + SPARC_INS_OR, + SPARC_INS_PDIST, + SPARC_INS_PDISTN, + SPARC_INS_POPC, + SPARC_INS_RD, + SPARC_INS_RESTORE, + SPARC_INS_RETT, + SPARC_INS_SAVE, + SPARC_INS_SDIVCC, + SPARC_INS_SDIVX, + SPARC_INS_SDIV, + SPARC_INS_SETHI, + SPARC_INS_SHUTDOWN, + SPARC_INS_SIAM, + SPARC_INS_SLLX, + SPARC_INS_SLL, + SPARC_INS_SMULCC, + SPARC_INS_SMUL, + SPARC_INS_SRAX, + SPARC_INS_SRA, + SPARC_INS_SRLX, + SPARC_INS_SRL, + SPARC_INS_STBAR, + SPARC_INS_STB, + SPARC_INS_STD, + SPARC_INS_ST, + SPARC_INS_STH, + SPARC_INS_STQ, + SPARC_INS_STX, + SPARC_INS_SUBCC, + SPARC_INS_SUBX, + SPARC_INS_SUBXCC, + SPARC_INS_SUB, + SPARC_INS_SWAP, + SPARC_INS_TADDCCTV, + SPARC_INS_TADDCC, + SPARC_INS_T, + SPARC_INS_TSUBCCTV, + SPARC_INS_TSUBCC, + SPARC_INS_UDIVCC, + SPARC_INS_UDIVX, + SPARC_INS_UDIV, + SPARC_INS_UMULCC, + SPARC_INS_UMULXHI, + SPARC_INS_UMUL, + SPARC_INS_UNIMP, + SPARC_INS_FCMPED, + SPARC_INS_FCMPEQ, + SPARC_INS_FCMPES, + SPARC_INS_WR, + SPARC_INS_XMULX, + SPARC_INS_XMULXHI, + SPARC_INS_XNORCC, + SPARC_INS_XNOR, + SPARC_INS_XORCC, + SPARC_INS_XOR, + + // alias instructions + SPARC_INS_RET, + SPARC_INS_RETL, + + SPARC_INS_ENDING, // <-- mark the end of the list of instructions +} sparc_insn; + +/// Group of SPARC instructions +typedef enum sparc_insn_group { + SPARC_GRP_INVALID = 0, ///< = CS_GRP_INVALID + + // Generic groups + // all jump instructions (conditional+direct+indirect jumps) + SPARC_GRP_JUMP, ///< = CS_GRP_JUMP + + // Architecture-specific groups + SPARC_GRP_HARDQUAD = 128, + SPARC_GRP_V9, + SPARC_GRP_VIS, + SPARC_GRP_VIS2, + SPARC_GRP_VIS3, + SPARC_GRP_32BIT, + SPARC_GRP_64BIT, + + SPARC_GRP_ENDING, // <-- mark the end of the list of groups +} sparc_insn_group; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/EDUReViver/include/capstone/systemz.h b/EDUReViver/include/capstone/systemz.h new file mode 100644 index 0000000..aa9768c --- /dev/null +++ b/EDUReViver/include/capstone/systemz.h @@ -0,0 +1,830 @@ +#ifndef CAPSTONE_SYSTEMZ_H +#define CAPSTONE_SYSTEMZ_H + +/* Capstone Disassembly Engine */ +/* By Nguyen Anh Quynh , 2014-2015 */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "platform.h" + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +/// Enums corresponding to SystemZ condition codes +typedef enum sysz_cc { + SYSZ_CC_INVALID = 0, ///< invalid CC (default) + + SYSZ_CC_O, + SYSZ_CC_H, + SYSZ_CC_NLE, + SYSZ_CC_L, + SYSZ_CC_NHE, + SYSZ_CC_LH, + SYSZ_CC_NE, + SYSZ_CC_E, + SYSZ_CC_NLH, + SYSZ_CC_HE, + SYSZ_CC_NL, + SYSZ_CC_LE, + SYSZ_CC_NH, + SYSZ_CC_NO, +} sysz_cc; + +/// Operand type for instruction's operands +typedef enum sysz_op_type { + SYSZ_OP_INVALID = 0, ///< = CS_OP_INVALID (Uninitialized). + SYSZ_OP_REG, ///< = CS_OP_REG (Register operand). + SYSZ_OP_IMM, ///< = CS_OP_IMM (Immediate operand). + SYSZ_OP_MEM, ///< = CS_OP_MEM (Memory operand). + SYSZ_OP_ACREG = 64, ///< Access register operand. +} sysz_op_type; + +/// SystemZ registers +typedef enum sysz_reg { + SYSZ_REG_INVALID = 0, + + SYSZ_REG_0, + SYSZ_REG_1, + SYSZ_REG_2, + SYSZ_REG_3, + SYSZ_REG_4, + SYSZ_REG_5, + SYSZ_REG_6, + SYSZ_REG_7, + SYSZ_REG_8, + SYSZ_REG_9, + SYSZ_REG_10, + SYSZ_REG_11, + SYSZ_REG_12, + SYSZ_REG_13, + SYSZ_REG_14, + SYSZ_REG_15, + SYSZ_REG_CC, + SYSZ_REG_F0, + SYSZ_REG_F1, + SYSZ_REG_F2, + SYSZ_REG_F3, + SYSZ_REG_F4, + SYSZ_REG_F5, + SYSZ_REG_F6, + SYSZ_REG_F7, + SYSZ_REG_F8, + SYSZ_REG_F9, + SYSZ_REG_F10, + SYSZ_REG_F11, + SYSZ_REG_F12, + SYSZ_REG_F13, + SYSZ_REG_F14, + SYSZ_REG_F15, + + SYSZ_REG_R0L, + + SYSZ_REG_ENDING, +} sysz_reg; + +/// Instruction's operand referring to memory +/// This is associated with SYSZ_OP_MEM operand type above +typedef struct sysz_op_mem { + uint8_t base; ///< base register, can be safely interpreted as + ///< a value of type `sysz_reg`, but it is only + ///< one byte wide + uint8_t index; ///< index register, same conditions apply here + uint64_t length; ///< BDLAddr operand + int64_t disp; ///< displacement/offset value +} sysz_op_mem; + +/// Instruction operand +typedef struct cs_sysz_op { + sysz_op_type type; ///< operand type + union { + sysz_reg reg; ///< register value for REG operand + int64_t imm; ///< immediate value for IMM operand + sysz_op_mem mem; ///< base/disp value for MEM operand + }; +} cs_sysz_op; + +// Instruction structure +typedef struct cs_sysz { + sysz_cc cc; ///< Code condition + /// Number of operands of this instruction, + /// or 0 when instruction has no operand. + uint8_t op_count; + cs_sysz_op operands[6]; ///< operands for this instruction. +} cs_sysz; + +/// SystemZ instruction +typedef enum sysz_insn { + SYSZ_INS_INVALID = 0, + + SYSZ_INS_A, + SYSZ_INS_ADB, + SYSZ_INS_ADBR, + SYSZ_INS_AEB, + SYSZ_INS_AEBR, + SYSZ_INS_AFI, + SYSZ_INS_AG, + SYSZ_INS_AGF, + SYSZ_INS_AGFI, + SYSZ_INS_AGFR, + SYSZ_INS_AGHI, + SYSZ_INS_AGHIK, + SYSZ_INS_AGR, + SYSZ_INS_AGRK, + SYSZ_INS_AGSI, + SYSZ_INS_AH, + SYSZ_INS_AHI, + SYSZ_INS_AHIK, + SYSZ_INS_AHY, + SYSZ_INS_AIH, + SYSZ_INS_AL, + SYSZ_INS_ALC, + SYSZ_INS_ALCG, + SYSZ_INS_ALCGR, + SYSZ_INS_ALCR, + SYSZ_INS_ALFI, + SYSZ_INS_ALG, + SYSZ_INS_ALGF, + SYSZ_INS_ALGFI, + SYSZ_INS_ALGFR, + SYSZ_INS_ALGHSIK, + SYSZ_INS_ALGR, + SYSZ_INS_ALGRK, + SYSZ_INS_ALHSIK, + SYSZ_INS_ALR, + SYSZ_INS_ALRK, + SYSZ_INS_ALY, + SYSZ_INS_AR, + SYSZ_INS_ARK, + SYSZ_INS_ASI, + SYSZ_INS_AXBR, + SYSZ_INS_AY, + SYSZ_INS_BCR, + SYSZ_INS_BRC, + SYSZ_INS_BRCL, + SYSZ_INS_CGIJ, + SYSZ_INS_CGRJ, + SYSZ_INS_CIJ, + SYSZ_INS_CLGIJ, + SYSZ_INS_CLGRJ, + SYSZ_INS_CLIJ, + SYSZ_INS_CLRJ, + SYSZ_INS_CRJ, + SYSZ_INS_BER, + SYSZ_INS_JE, + SYSZ_INS_JGE, + SYSZ_INS_LOCE, + SYSZ_INS_LOCGE, + SYSZ_INS_LOCGRE, + SYSZ_INS_LOCRE, + SYSZ_INS_STOCE, + SYSZ_INS_STOCGE, + SYSZ_INS_BHR, + SYSZ_INS_BHER, + SYSZ_INS_JHE, + SYSZ_INS_JGHE, + SYSZ_INS_LOCHE, + SYSZ_INS_LOCGHE, + SYSZ_INS_LOCGRHE, + SYSZ_INS_LOCRHE, + SYSZ_INS_STOCHE, + SYSZ_INS_STOCGHE, + SYSZ_INS_JH, + SYSZ_INS_JGH, + SYSZ_INS_LOCH, + SYSZ_INS_LOCGH, + SYSZ_INS_LOCGRH, + SYSZ_INS_LOCRH, + SYSZ_INS_STOCH, + SYSZ_INS_STOCGH, + SYSZ_INS_CGIJNLH, + SYSZ_INS_CGRJNLH, + SYSZ_INS_CIJNLH, + SYSZ_INS_CLGIJNLH, + SYSZ_INS_CLGRJNLH, + SYSZ_INS_CLIJNLH, + SYSZ_INS_CLRJNLH, + SYSZ_INS_CRJNLH, + SYSZ_INS_CGIJE, + SYSZ_INS_CGRJE, + SYSZ_INS_CIJE, + SYSZ_INS_CLGIJE, + SYSZ_INS_CLGRJE, + SYSZ_INS_CLIJE, + SYSZ_INS_CLRJE, + SYSZ_INS_CRJE, + SYSZ_INS_CGIJNLE, + SYSZ_INS_CGRJNLE, + SYSZ_INS_CIJNLE, + SYSZ_INS_CLGIJNLE, + SYSZ_INS_CLGRJNLE, + SYSZ_INS_CLIJNLE, + SYSZ_INS_CLRJNLE, + SYSZ_INS_CRJNLE, + SYSZ_INS_CGIJH, + SYSZ_INS_CGRJH, + SYSZ_INS_CIJH, + SYSZ_INS_CLGIJH, + SYSZ_INS_CLGRJH, + SYSZ_INS_CLIJH, + SYSZ_INS_CLRJH, + SYSZ_INS_CRJH, + SYSZ_INS_CGIJNL, + SYSZ_INS_CGRJNL, + SYSZ_INS_CIJNL, + SYSZ_INS_CLGIJNL, + SYSZ_INS_CLGRJNL, + SYSZ_INS_CLIJNL, + SYSZ_INS_CLRJNL, + SYSZ_INS_CRJNL, + SYSZ_INS_CGIJHE, + SYSZ_INS_CGRJHE, + SYSZ_INS_CIJHE, + SYSZ_INS_CLGIJHE, + SYSZ_INS_CLGRJHE, + SYSZ_INS_CLIJHE, + SYSZ_INS_CLRJHE, + SYSZ_INS_CRJHE, + SYSZ_INS_CGIJNHE, + SYSZ_INS_CGRJNHE, + SYSZ_INS_CIJNHE, + SYSZ_INS_CLGIJNHE, + SYSZ_INS_CLGRJNHE, + SYSZ_INS_CLIJNHE, + SYSZ_INS_CLRJNHE, + SYSZ_INS_CRJNHE, + SYSZ_INS_CGIJL, + SYSZ_INS_CGRJL, + SYSZ_INS_CIJL, + SYSZ_INS_CLGIJL, + SYSZ_INS_CLGRJL, + SYSZ_INS_CLIJL, + SYSZ_INS_CLRJL, + SYSZ_INS_CRJL, + SYSZ_INS_CGIJNH, + SYSZ_INS_CGRJNH, + SYSZ_INS_CIJNH, + SYSZ_INS_CLGIJNH, + SYSZ_INS_CLGRJNH, + SYSZ_INS_CLIJNH, + SYSZ_INS_CLRJNH, + SYSZ_INS_CRJNH, + SYSZ_INS_CGIJLE, + SYSZ_INS_CGRJLE, + SYSZ_INS_CIJLE, + SYSZ_INS_CLGIJLE, + SYSZ_INS_CLGRJLE, + SYSZ_INS_CLIJLE, + SYSZ_INS_CLRJLE, + SYSZ_INS_CRJLE, + SYSZ_INS_CGIJNE, + SYSZ_INS_CGRJNE, + SYSZ_INS_CIJNE, + SYSZ_INS_CLGIJNE, + SYSZ_INS_CLGRJNE, + SYSZ_INS_CLIJNE, + SYSZ_INS_CLRJNE, + SYSZ_INS_CRJNE, + SYSZ_INS_CGIJLH, + SYSZ_INS_CGRJLH, + SYSZ_INS_CIJLH, + SYSZ_INS_CLGIJLH, + SYSZ_INS_CLGRJLH, + SYSZ_INS_CLIJLH, + SYSZ_INS_CLRJLH, + SYSZ_INS_CRJLH, + SYSZ_INS_BLR, + SYSZ_INS_BLER, + SYSZ_INS_JLE, + SYSZ_INS_JGLE, + SYSZ_INS_LOCLE, + SYSZ_INS_LOCGLE, + SYSZ_INS_LOCGRLE, + SYSZ_INS_LOCRLE, + SYSZ_INS_STOCLE, + SYSZ_INS_STOCGLE, + SYSZ_INS_BLHR, + SYSZ_INS_JLH, + SYSZ_INS_JGLH, + SYSZ_INS_LOCLH, + SYSZ_INS_LOCGLH, + SYSZ_INS_LOCGRLH, + SYSZ_INS_LOCRLH, + SYSZ_INS_STOCLH, + SYSZ_INS_STOCGLH, + SYSZ_INS_JL, + SYSZ_INS_JGL, + SYSZ_INS_LOCL, + SYSZ_INS_LOCGL, + SYSZ_INS_LOCGRL, + SYSZ_INS_LOCRL, + SYSZ_INS_LOC, + SYSZ_INS_LOCG, + SYSZ_INS_LOCGR, + SYSZ_INS_LOCR, + SYSZ_INS_STOCL, + SYSZ_INS_STOCGL, + SYSZ_INS_BNER, + SYSZ_INS_JNE, + SYSZ_INS_JGNE, + SYSZ_INS_LOCNE, + SYSZ_INS_LOCGNE, + SYSZ_INS_LOCGRNE, + SYSZ_INS_LOCRNE, + SYSZ_INS_STOCNE, + SYSZ_INS_STOCGNE, + SYSZ_INS_BNHR, + SYSZ_INS_BNHER, + SYSZ_INS_JNHE, + SYSZ_INS_JGNHE, + SYSZ_INS_LOCNHE, + SYSZ_INS_LOCGNHE, + SYSZ_INS_LOCGRNHE, + SYSZ_INS_LOCRNHE, + SYSZ_INS_STOCNHE, + SYSZ_INS_STOCGNHE, + SYSZ_INS_JNH, + SYSZ_INS_JGNH, + SYSZ_INS_LOCNH, + SYSZ_INS_LOCGNH, + SYSZ_INS_LOCGRNH, + SYSZ_INS_LOCRNH, + SYSZ_INS_STOCNH, + SYSZ_INS_STOCGNH, + SYSZ_INS_BNLR, + SYSZ_INS_BNLER, + SYSZ_INS_JNLE, + SYSZ_INS_JGNLE, + SYSZ_INS_LOCNLE, + SYSZ_INS_LOCGNLE, + SYSZ_INS_LOCGRNLE, + SYSZ_INS_LOCRNLE, + SYSZ_INS_STOCNLE, + SYSZ_INS_STOCGNLE, + SYSZ_INS_BNLHR, + SYSZ_INS_JNLH, + SYSZ_INS_JGNLH, + SYSZ_INS_LOCNLH, + SYSZ_INS_LOCGNLH, + SYSZ_INS_LOCGRNLH, + SYSZ_INS_LOCRNLH, + SYSZ_INS_STOCNLH, + SYSZ_INS_STOCGNLH, + SYSZ_INS_JNL, + SYSZ_INS_JGNL, + SYSZ_INS_LOCNL, + SYSZ_INS_LOCGNL, + SYSZ_INS_LOCGRNL, + SYSZ_INS_LOCRNL, + SYSZ_INS_STOCNL, + SYSZ_INS_STOCGNL, + SYSZ_INS_BNOR, + SYSZ_INS_JNO, + SYSZ_INS_JGNO, + SYSZ_INS_LOCNO, + SYSZ_INS_LOCGNO, + SYSZ_INS_LOCGRNO, + SYSZ_INS_LOCRNO, + SYSZ_INS_STOCNO, + SYSZ_INS_STOCGNO, + SYSZ_INS_BOR, + SYSZ_INS_JO, + SYSZ_INS_JGO, + SYSZ_INS_LOCO, + SYSZ_INS_LOCGO, + SYSZ_INS_LOCGRO, + SYSZ_INS_LOCRO, + SYSZ_INS_STOCO, + SYSZ_INS_STOCGO, + SYSZ_INS_STOC, + SYSZ_INS_STOCG, + SYSZ_INS_BASR, + SYSZ_INS_BR, + SYSZ_INS_BRAS, + SYSZ_INS_BRASL, + SYSZ_INS_J, + SYSZ_INS_JG, + SYSZ_INS_BRCT, + SYSZ_INS_BRCTG, + SYSZ_INS_C, + SYSZ_INS_CDB, + SYSZ_INS_CDBR, + SYSZ_INS_CDFBR, + SYSZ_INS_CDGBR, + SYSZ_INS_CDLFBR, + SYSZ_INS_CDLGBR, + SYSZ_INS_CEB, + SYSZ_INS_CEBR, + SYSZ_INS_CEFBR, + SYSZ_INS_CEGBR, + SYSZ_INS_CELFBR, + SYSZ_INS_CELGBR, + SYSZ_INS_CFDBR, + SYSZ_INS_CFEBR, + SYSZ_INS_CFI, + SYSZ_INS_CFXBR, + SYSZ_INS_CG, + SYSZ_INS_CGDBR, + SYSZ_INS_CGEBR, + SYSZ_INS_CGF, + SYSZ_INS_CGFI, + SYSZ_INS_CGFR, + SYSZ_INS_CGFRL, + SYSZ_INS_CGH, + SYSZ_INS_CGHI, + SYSZ_INS_CGHRL, + SYSZ_INS_CGHSI, + SYSZ_INS_CGR, + SYSZ_INS_CGRL, + SYSZ_INS_CGXBR, + SYSZ_INS_CH, + SYSZ_INS_CHF, + SYSZ_INS_CHHSI, + SYSZ_INS_CHI, + SYSZ_INS_CHRL, + SYSZ_INS_CHSI, + SYSZ_INS_CHY, + SYSZ_INS_CIH, + SYSZ_INS_CL, + SYSZ_INS_CLC, + SYSZ_INS_CLFDBR, + SYSZ_INS_CLFEBR, + SYSZ_INS_CLFHSI, + SYSZ_INS_CLFI, + SYSZ_INS_CLFXBR, + SYSZ_INS_CLG, + SYSZ_INS_CLGDBR, + SYSZ_INS_CLGEBR, + SYSZ_INS_CLGF, + SYSZ_INS_CLGFI, + SYSZ_INS_CLGFR, + SYSZ_INS_CLGFRL, + SYSZ_INS_CLGHRL, + SYSZ_INS_CLGHSI, + SYSZ_INS_CLGR, + SYSZ_INS_CLGRL, + SYSZ_INS_CLGXBR, + SYSZ_INS_CLHF, + SYSZ_INS_CLHHSI, + SYSZ_INS_CLHRL, + SYSZ_INS_CLI, + SYSZ_INS_CLIH, + SYSZ_INS_CLIY, + SYSZ_INS_CLR, + SYSZ_INS_CLRL, + SYSZ_INS_CLST, + SYSZ_INS_CLY, + SYSZ_INS_CPSDR, + SYSZ_INS_CR, + SYSZ_INS_CRL, + SYSZ_INS_CS, + SYSZ_INS_CSG, + SYSZ_INS_CSY, + SYSZ_INS_CXBR, + SYSZ_INS_CXFBR, + SYSZ_INS_CXGBR, + SYSZ_INS_CXLFBR, + SYSZ_INS_CXLGBR, + SYSZ_INS_CY, + SYSZ_INS_DDB, + SYSZ_INS_DDBR, + SYSZ_INS_DEB, + SYSZ_INS_DEBR, + SYSZ_INS_DL, + SYSZ_INS_DLG, + SYSZ_INS_DLGR, + SYSZ_INS_DLR, + SYSZ_INS_DSG, + SYSZ_INS_DSGF, + SYSZ_INS_DSGFR, + SYSZ_INS_DSGR, + SYSZ_INS_DXBR, + SYSZ_INS_EAR, + SYSZ_INS_FIDBR, + SYSZ_INS_FIDBRA, + SYSZ_INS_FIEBR, + SYSZ_INS_FIEBRA, + SYSZ_INS_FIXBR, + SYSZ_INS_FIXBRA, + SYSZ_INS_FLOGR, + SYSZ_INS_IC, + SYSZ_INS_ICY, + SYSZ_INS_IIHF, + SYSZ_INS_IIHH, + SYSZ_INS_IIHL, + SYSZ_INS_IILF, + SYSZ_INS_IILH, + SYSZ_INS_IILL, + SYSZ_INS_IPM, + SYSZ_INS_L, + SYSZ_INS_LA, + SYSZ_INS_LAA, + SYSZ_INS_LAAG, + SYSZ_INS_LAAL, + SYSZ_INS_LAALG, + SYSZ_INS_LAN, + SYSZ_INS_LANG, + SYSZ_INS_LAO, + SYSZ_INS_LAOG, + SYSZ_INS_LARL, + SYSZ_INS_LAX, + SYSZ_INS_LAXG, + SYSZ_INS_LAY, + SYSZ_INS_LB, + SYSZ_INS_LBH, + SYSZ_INS_LBR, + SYSZ_INS_LCDBR, + SYSZ_INS_LCEBR, + SYSZ_INS_LCGFR, + SYSZ_INS_LCGR, + SYSZ_INS_LCR, + SYSZ_INS_LCXBR, + SYSZ_INS_LD, + SYSZ_INS_LDEB, + SYSZ_INS_LDEBR, + SYSZ_INS_LDGR, + SYSZ_INS_LDR, + SYSZ_INS_LDXBR, + SYSZ_INS_LDXBRA, + SYSZ_INS_LDY, + SYSZ_INS_LE, + SYSZ_INS_LEDBR, + SYSZ_INS_LEDBRA, + SYSZ_INS_LER, + SYSZ_INS_LEXBR, + SYSZ_INS_LEXBRA, + SYSZ_INS_LEY, + SYSZ_INS_LFH, + SYSZ_INS_LG, + SYSZ_INS_LGB, + SYSZ_INS_LGBR, + SYSZ_INS_LGDR, + SYSZ_INS_LGF, + SYSZ_INS_LGFI, + SYSZ_INS_LGFR, + SYSZ_INS_LGFRL, + SYSZ_INS_LGH, + SYSZ_INS_LGHI, + SYSZ_INS_LGHR, + SYSZ_INS_LGHRL, + SYSZ_INS_LGR, + SYSZ_INS_LGRL, + SYSZ_INS_LH, + SYSZ_INS_LHH, + SYSZ_INS_LHI, + SYSZ_INS_LHR, + SYSZ_INS_LHRL, + SYSZ_INS_LHY, + SYSZ_INS_LLC, + SYSZ_INS_LLCH, + SYSZ_INS_LLCR, + SYSZ_INS_LLGC, + SYSZ_INS_LLGCR, + SYSZ_INS_LLGF, + SYSZ_INS_LLGFR, + SYSZ_INS_LLGFRL, + SYSZ_INS_LLGH, + SYSZ_INS_LLGHR, + SYSZ_INS_LLGHRL, + SYSZ_INS_LLH, + SYSZ_INS_LLHH, + SYSZ_INS_LLHR, + SYSZ_INS_LLHRL, + SYSZ_INS_LLIHF, + SYSZ_INS_LLIHH, + SYSZ_INS_LLIHL, + SYSZ_INS_LLILF, + SYSZ_INS_LLILH, + SYSZ_INS_LLILL, + SYSZ_INS_LMG, + SYSZ_INS_LNDBR, + SYSZ_INS_LNEBR, + SYSZ_INS_LNGFR, + SYSZ_INS_LNGR, + SYSZ_INS_LNR, + SYSZ_INS_LNXBR, + SYSZ_INS_LPDBR, + SYSZ_INS_LPEBR, + SYSZ_INS_LPGFR, + SYSZ_INS_LPGR, + SYSZ_INS_LPR, + SYSZ_INS_LPXBR, + SYSZ_INS_LR, + SYSZ_INS_LRL, + SYSZ_INS_LRV, + SYSZ_INS_LRVG, + SYSZ_INS_LRVGR, + SYSZ_INS_LRVR, + SYSZ_INS_LT, + SYSZ_INS_LTDBR, + SYSZ_INS_LTEBR, + SYSZ_INS_LTG, + SYSZ_INS_LTGF, + SYSZ_INS_LTGFR, + SYSZ_INS_LTGR, + SYSZ_INS_LTR, + SYSZ_INS_LTXBR, + SYSZ_INS_LXDB, + SYSZ_INS_LXDBR, + SYSZ_INS_LXEB, + SYSZ_INS_LXEBR, + SYSZ_INS_LXR, + SYSZ_INS_LY, + SYSZ_INS_LZDR, + SYSZ_INS_LZER, + SYSZ_INS_LZXR, + SYSZ_INS_MADB, + SYSZ_INS_MADBR, + SYSZ_INS_MAEB, + SYSZ_INS_MAEBR, + SYSZ_INS_MDB, + SYSZ_INS_MDBR, + SYSZ_INS_MDEB, + SYSZ_INS_MDEBR, + SYSZ_INS_MEEB, + SYSZ_INS_MEEBR, + SYSZ_INS_MGHI, + SYSZ_INS_MH, + SYSZ_INS_MHI, + SYSZ_INS_MHY, + SYSZ_INS_MLG, + SYSZ_INS_MLGR, + SYSZ_INS_MS, + SYSZ_INS_MSDB, + SYSZ_INS_MSDBR, + SYSZ_INS_MSEB, + SYSZ_INS_MSEBR, + SYSZ_INS_MSFI, + SYSZ_INS_MSG, + SYSZ_INS_MSGF, + SYSZ_INS_MSGFI, + SYSZ_INS_MSGFR, + SYSZ_INS_MSGR, + SYSZ_INS_MSR, + SYSZ_INS_MSY, + SYSZ_INS_MVC, + SYSZ_INS_MVGHI, + SYSZ_INS_MVHHI, + SYSZ_INS_MVHI, + SYSZ_INS_MVI, + SYSZ_INS_MVIY, + SYSZ_INS_MVST, + SYSZ_INS_MXBR, + SYSZ_INS_MXDB, + SYSZ_INS_MXDBR, + SYSZ_INS_N, + SYSZ_INS_NC, + SYSZ_INS_NG, + SYSZ_INS_NGR, + SYSZ_INS_NGRK, + SYSZ_INS_NI, + SYSZ_INS_NIHF, + SYSZ_INS_NIHH, + SYSZ_INS_NIHL, + SYSZ_INS_NILF, + SYSZ_INS_NILH, + SYSZ_INS_NILL, + SYSZ_INS_NIY, + SYSZ_INS_NR, + SYSZ_INS_NRK, + SYSZ_INS_NY, + SYSZ_INS_O, + SYSZ_INS_OC, + SYSZ_INS_OG, + SYSZ_INS_OGR, + SYSZ_INS_OGRK, + SYSZ_INS_OI, + SYSZ_INS_OIHF, + SYSZ_INS_OIHH, + SYSZ_INS_OIHL, + SYSZ_INS_OILF, + SYSZ_INS_OILH, + SYSZ_INS_OILL, + SYSZ_INS_OIY, + SYSZ_INS_OR, + SYSZ_INS_ORK, + SYSZ_INS_OY, + SYSZ_INS_PFD, + SYSZ_INS_PFDRL, + SYSZ_INS_RISBG, + SYSZ_INS_RISBHG, + SYSZ_INS_RISBLG, + SYSZ_INS_RLL, + SYSZ_INS_RLLG, + SYSZ_INS_RNSBG, + SYSZ_INS_ROSBG, + SYSZ_INS_RXSBG, + SYSZ_INS_S, + SYSZ_INS_SDB, + SYSZ_INS_SDBR, + SYSZ_INS_SEB, + SYSZ_INS_SEBR, + SYSZ_INS_SG, + SYSZ_INS_SGF, + SYSZ_INS_SGFR, + SYSZ_INS_SGR, + SYSZ_INS_SGRK, + SYSZ_INS_SH, + SYSZ_INS_SHY, + SYSZ_INS_SL, + SYSZ_INS_SLB, + SYSZ_INS_SLBG, + SYSZ_INS_SLBR, + SYSZ_INS_SLFI, + SYSZ_INS_SLG, + SYSZ_INS_SLBGR, + SYSZ_INS_SLGF, + SYSZ_INS_SLGFI, + SYSZ_INS_SLGFR, + SYSZ_INS_SLGR, + SYSZ_INS_SLGRK, + SYSZ_INS_SLL, + SYSZ_INS_SLLG, + SYSZ_INS_SLLK, + SYSZ_INS_SLR, + SYSZ_INS_SLRK, + SYSZ_INS_SLY, + SYSZ_INS_SQDB, + SYSZ_INS_SQDBR, + SYSZ_INS_SQEB, + SYSZ_INS_SQEBR, + SYSZ_INS_SQXBR, + SYSZ_INS_SR, + SYSZ_INS_SRA, + SYSZ_INS_SRAG, + SYSZ_INS_SRAK, + SYSZ_INS_SRK, + SYSZ_INS_SRL, + SYSZ_INS_SRLG, + SYSZ_INS_SRLK, + SYSZ_INS_SRST, + SYSZ_INS_ST, + SYSZ_INS_STC, + SYSZ_INS_STCH, + SYSZ_INS_STCY, + SYSZ_INS_STD, + SYSZ_INS_STDY, + SYSZ_INS_STE, + SYSZ_INS_STEY, + SYSZ_INS_STFH, + SYSZ_INS_STG, + SYSZ_INS_STGRL, + SYSZ_INS_STH, + SYSZ_INS_STHH, + SYSZ_INS_STHRL, + SYSZ_INS_STHY, + SYSZ_INS_STMG, + SYSZ_INS_STRL, + SYSZ_INS_STRV, + SYSZ_INS_STRVG, + SYSZ_INS_STY, + SYSZ_INS_SXBR, + SYSZ_INS_SY, + SYSZ_INS_TM, + SYSZ_INS_TMHH, + SYSZ_INS_TMHL, + SYSZ_INS_TMLH, + SYSZ_INS_TMLL, + SYSZ_INS_TMY, + SYSZ_INS_X, + SYSZ_INS_XC, + SYSZ_INS_XG, + SYSZ_INS_XGR, + SYSZ_INS_XGRK, + SYSZ_INS_XI, + SYSZ_INS_XIHF, + SYSZ_INS_XILF, + SYSZ_INS_XIY, + SYSZ_INS_XR, + SYSZ_INS_XRK, + SYSZ_INS_XY, + + SYSZ_INS_ENDING, // <-- mark the end of the list of instructions +} sysz_insn; + +/// Group of SystemZ instructions +typedef enum sysz_insn_group { + SYSZ_GRP_INVALID = 0, ///< = CS_GRP_INVALID + + // Generic groups + // all jump instructions (conditional+direct+indirect jumps) + SYSZ_GRP_JUMP, ///< = CS_GRP_JUMP + + // Architecture-specific groups + SYSZ_GRP_DISTINCTOPS = 128, + SYSZ_GRP_FPEXTENSION, + SYSZ_GRP_HIGHWORD, + SYSZ_GRP_INTERLOCKEDACCESS1, + SYSZ_GRP_LOADSTOREONCOND, + + SYSZ_GRP_ENDING, // <-- mark the end of the list of groups +} sysz_insn_group; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/EDUReViver/include/capstone/tms320c64x.h b/EDUReViver/include/capstone/tms320c64x.h new file mode 100644 index 0000000..5e7f1b3 --- /dev/null +++ b/EDUReViver/include/capstone/tms320c64x.h @@ -0,0 +1,359 @@ +/* Capstone Disassembly Engine */ +/* TMS320C64x Backend by Fotis Loukos 2016 */ + +#ifndef CAPSTONE_TMS320C64X_H +#define CAPSTONE_TMS320C64X_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "platform.h" + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +typedef enum tms320c64x_op_type { + TMS320C64X_OP_INVALID = 0, ///< = CS_OP_INVALID (Uninitialized). + TMS320C64X_OP_REG, ///< = CS_OP_REG (Register operand). + TMS320C64X_OP_IMM, ///< = CS_OP_IMM (Immediate operand). + TMS320C64X_OP_MEM, ///< = CS_OP_MEM (Memory operand). + TMS320C64X_OP_REGPAIR = 64, ///< Register pair for double word ops +} tms320c64x_op_type; + +typedef enum tms320c64x_mem_disp { + TMS320C64X_MEM_DISP_INVALID = 0, + TMS320C64X_MEM_DISP_CONSTANT, + TMS320C64X_MEM_DISP_REGISTER, +} tms320c64x_mem_disp; + +typedef enum tms320c64x_mem_dir { + TMS320C64X_MEM_DIR_INVALID = 0, + TMS320C64X_MEM_DIR_FW, + TMS320C64X_MEM_DIR_BW, +} tms320c64x_mem_dir; + +typedef enum tms320c64x_mem_mod { + TMS320C64X_MEM_MOD_INVALID = 0, + TMS320C64X_MEM_MOD_NO, + TMS320C64X_MEM_MOD_PRE, + TMS320C64X_MEM_MOD_POST, +} tms320c64x_mem_mod; + +typedef struct tms320c64x_op_mem { + unsigned int base; ///< base register + unsigned int disp; ///< displacement/offset value + unsigned int unit; ///< unit of base and offset register + unsigned int scaled; ///< offset scaled + unsigned int disptype; ///< displacement type + unsigned int direction; ///< direction + unsigned int modify; ///< modification +} tms320c64x_op_mem; + +typedef struct cs_tms320c64x_op { + tms320c64x_op_type type; ///< operand type + union { + unsigned int reg; ///< register value for REG operand or first register for REGPAIR operand + int32_t imm; ///< immediate value for IMM operand + tms320c64x_op_mem mem; ///< base/disp value for MEM operand + }; +} cs_tms320c64x_op; + +typedef struct cs_tms320c64x { + uint8_t op_count; + cs_tms320c64x_op operands[8]; ///< operands for this instruction. + struct { + unsigned int reg; + unsigned int zero; + } condition; + struct { + unsigned int unit; + unsigned int side; + unsigned int crosspath; + } funit; + unsigned int parallel; +} cs_tms320c64x; + +typedef enum tms320c64x_reg { + TMS320C64X_REG_INVALID = 0, + + TMS320C64X_REG_AMR, + TMS320C64X_REG_CSR, + TMS320C64X_REG_DIER, + TMS320C64X_REG_DNUM, + TMS320C64X_REG_ECR, + TMS320C64X_REG_GFPGFR, + TMS320C64X_REG_GPLYA, + TMS320C64X_REG_GPLYB, + TMS320C64X_REG_ICR, + TMS320C64X_REG_IER, + TMS320C64X_REG_IERR, + TMS320C64X_REG_ILC, + TMS320C64X_REG_IRP, + TMS320C64X_REG_ISR, + TMS320C64X_REG_ISTP, + TMS320C64X_REG_ITSR, + TMS320C64X_REG_NRP, + TMS320C64X_REG_NTSR, + TMS320C64X_REG_REP, + TMS320C64X_REG_RILC, + TMS320C64X_REG_SSR, + TMS320C64X_REG_TSCH, + TMS320C64X_REG_TSCL, + TMS320C64X_REG_TSR, + TMS320C64X_REG_A0, + TMS320C64X_REG_A1, + TMS320C64X_REG_A2, + TMS320C64X_REG_A3, + TMS320C64X_REG_A4, + TMS320C64X_REG_A5, + TMS320C64X_REG_A6, + TMS320C64X_REG_A7, + TMS320C64X_REG_A8, + TMS320C64X_REG_A9, + TMS320C64X_REG_A10, + TMS320C64X_REG_A11, + TMS320C64X_REG_A12, + TMS320C64X_REG_A13, + TMS320C64X_REG_A14, + TMS320C64X_REG_A15, + TMS320C64X_REG_A16, + TMS320C64X_REG_A17, + TMS320C64X_REG_A18, + TMS320C64X_REG_A19, + TMS320C64X_REG_A20, + TMS320C64X_REG_A21, + TMS320C64X_REG_A22, + TMS320C64X_REG_A23, + TMS320C64X_REG_A24, + TMS320C64X_REG_A25, + TMS320C64X_REG_A26, + TMS320C64X_REG_A27, + TMS320C64X_REG_A28, + TMS320C64X_REG_A29, + TMS320C64X_REG_A30, + TMS320C64X_REG_A31, + TMS320C64X_REG_B0, + TMS320C64X_REG_B1, + TMS320C64X_REG_B2, + TMS320C64X_REG_B3, + TMS320C64X_REG_B4, + TMS320C64X_REG_B5, + TMS320C64X_REG_B6, + TMS320C64X_REG_B7, + TMS320C64X_REG_B8, + TMS320C64X_REG_B9, + TMS320C64X_REG_B10, + TMS320C64X_REG_B11, + TMS320C64X_REG_B12, + TMS320C64X_REG_B13, + TMS320C64X_REG_B14, + TMS320C64X_REG_B15, + TMS320C64X_REG_B16, + TMS320C64X_REG_B17, + TMS320C64X_REG_B18, + TMS320C64X_REG_B19, + TMS320C64X_REG_B20, + TMS320C64X_REG_B21, + TMS320C64X_REG_B22, + TMS320C64X_REG_B23, + TMS320C64X_REG_B24, + TMS320C64X_REG_B25, + TMS320C64X_REG_B26, + TMS320C64X_REG_B27, + TMS320C64X_REG_B28, + TMS320C64X_REG_B29, + TMS320C64X_REG_B30, + TMS320C64X_REG_B31, + TMS320C64X_REG_PCE1, + + TMS320C64X_REG_ENDING, // <-- mark the end of the list of registers + + // Alias registers + TMS320C64X_REG_EFR = TMS320C64X_REG_ECR, + TMS320C64X_REG_IFR = TMS320C64X_REG_ISR, +} tms320c64x_reg; + +typedef enum tms320c64x_insn { + TMS320C64X_INS_INVALID = 0, + + TMS320C64X_INS_ABS, + TMS320C64X_INS_ABS2, + TMS320C64X_INS_ADD, + TMS320C64X_INS_ADD2, + TMS320C64X_INS_ADD4, + TMS320C64X_INS_ADDAB, + TMS320C64X_INS_ADDAD, + TMS320C64X_INS_ADDAH, + TMS320C64X_INS_ADDAW, + TMS320C64X_INS_ADDK, + TMS320C64X_INS_ADDKPC, + TMS320C64X_INS_ADDU, + TMS320C64X_INS_AND, + TMS320C64X_INS_ANDN, + TMS320C64X_INS_AVG2, + TMS320C64X_INS_AVGU4, + TMS320C64X_INS_B, + TMS320C64X_INS_BDEC, + TMS320C64X_INS_BITC4, + TMS320C64X_INS_BNOP, + TMS320C64X_INS_BPOS, + TMS320C64X_INS_CLR, + TMS320C64X_INS_CMPEQ, + TMS320C64X_INS_CMPEQ2, + TMS320C64X_INS_CMPEQ4, + TMS320C64X_INS_CMPGT, + TMS320C64X_INS_CMPGT2, + TMS320C64X_INS_CMPGTU4, + TMS320C64X_INS_CMPLT, + TMS320C64X_INS_CMPLTU, + TMS320C64X_INS_DEAL, + TMS320C64X_INS_DOTP2, + TMS320C64X_INS_DOTPN2, + TMS320C64X_INS_DOTPNRSU2, + TMS320C64X_INS_DOTPRSU2, + TMS320C64X_INS_DOTPSU4, + TMS320C64X_INS_DOTPU4, + TMS320C64X_INS_EXT, + TMS320C64X_INS_EXTU, + TMS320C64X_INS_GMPGTU, + TMS320C64X_INS_GMPY4, + TMS320C64X_INS_LDB, + TMS320C64X_INS_LDBU, + TMS320C64X_INS_LDDW, + TMS320C64X_INS_LDH, + TMS320C64X_INS_LDHU, + TMS320C64X_INS_LDNDW, + TMS320C64X_INS_LDNW, + TMS320C64X_INS_LDW, + TMS320C64X_INS_LMBD, + TMS320C64X_INS_MAX2, + TMS320C64X_INS_MAXU4, + TMS320C64X_INS_MIN2, + TMS320C64X_INS_MINU4, + TMS320C64X_INS_MPY, + TMS320C64X_INS_MPY2, + TMS320C64X_INS_MPYH, + TMS320C64X_INS_MPYHI, + TMS320C64X_INS_MPYHIR, + TMS320C64X_INS_MPYHL, + TMS320C64X_INS_MPYHLU, + TMS320C64X_INS_MPYHSLU, + TMS320C64X_INS_MPYHSU, + TMS320C64X_INS_MPYHU, + TMS320C64X_INS_MPYHULS, + TMS320C64X_INS_MPYHUS, + TMS320C64X_INS_MPYLH, + TMS320C64X_INS_MPYLHU, + TMS320C64X_INS_MPYLI, + TMS320C64X_INS_MPYLIR, + TMS320C64X_INS_MPYLSHU, + TMS320C64X_INS_MPYLUHS, + TMS320C64X_INS_MPYSU, + TMS320C64X_INS_MPYSU4, + TMS320C64X_INS_MPYU, + TMS320C64X_INS_MPYU4, + TMS320C64X_INS_MPYUS, + TMS320C64X_INS_MVC, + TMS320C64X_INS_MVD, + TMS320C64X_INS_MVK, + TMS320C64X_INS_MVKL, + TMS320C64X_INS_MVKLH, + TMS320C64X_INS_NOP, + TMS320C64X_INS_NORM, + TMS320C64X_INS_OR, + TMS320C64X_INS_PACK2, + TMS320C64X_INS_PACKH2, + TMS320C64X_INS_PACKH4, + TMS320C64X_INS_PACKHL2, + TMS320C64X_INS_PACKL4, + TMS320C64X_INS_PACKLH2, + TMS320C64X_INS_ROTL, + TMS320C64X_INS_SADD, + TMS320C64X_INS_SADD2, + TMS320C64X_INS_SADDU4, + TMS320C64X_INS_SADDUS2, + TMS320C64X_INS_SAT, + TMS320C64X_INS_SET, + TMS320C64X_INS_SHFL, + TMS320C64X_INS_SHL, + TMS320C64X_INS_SHLMB, + TMS320C64X_INS_SHR, + TMS320C64X_INS_SHR2, + TMS320C64X_INS_SHRMB, + TMS320C64X_INS_SHRU, + TMS320C64X_INS_SHRU2, + TMS320C64X_INS_SMPY, + TMS320C64X_INS_SMPY2, + TMS320C64X_INS_SMPYH, + TMS320C64X_INS_SMPYHL, + TMS320C64X_INS_SMPYLH, + TMS320C64X_INS_SPACK2, + TMS320C64X_INS_SPACKU4, + TMS320C64X_INS_SSHL, + TMS320C64X_INS_SSHVL, + TMS320C64X_INS_SSHVR, + TMS320C64X_INS_SSUB, + TMS320C64X_INS_STB, + TMS320C64X_INS_STDW, + TMS320C64X_INS_STH, + TMS320C64X_INS_STNDW, + TMS320C64X_INS_STNW, + TMS320C64X_INS_STW, + TMS320C64X_INS_SUB, + TMS320C64X_INS_SUB2, + TMS320C64X_INS_SUB4, + TMS320C64X_INS_SUBAB, + TMS320C64X_INS_SUBABS4, + TMS320C64X_INS_SUBAH, + TMS320C64X_INS_SUBAW, + TMS320C64X_INS_SUBC, + TMS320C64X_INS_SUBU, + TMS320C64X_INS_SWAP4, + TMS320C64X_INS_UNPKHU4, + TMS320C64X_INS_UNPKLU4, + TMS320C64X_INS_XOR, + TMS320C64X_INS_XPND2, + TMS320C64X_INS_XPND4, + // Aliases + TMS320C64X_INS_IDLE, + TMS320C64X_INS_MV, + TMS320C64X_INS_NEG, + TMS320C64X_INS_NOT, + TMS320C64X_INS_SWAP2, + TMS320C64X_INS_ZERO, + + TMS320C64X_INS_ENDING, // <-- mark the end of the list of instructions +} tms320c64x_insn; + +typedef enum tms320c64x_insn_group { + TMS320C64X_GRP_INVALID = 0, ///< = CS_GRP_INVALID + + TMS320C64X_GRP_JUMP, ///< = CS_GRP_JUMP + + TMS320C64X_GRP_FUNIT_D = 128, + TMS320C64X_GRP_FUNIT_L, + TMS320C64X_GRP_FUNIT_M, + TMS320C64X_GRP_FUNIT_S, + TMS320C64X_GRP_FUNIT_NO, + + TMS320C64X_GRP_ENDING, // <-- mark the end of the list of groups +} tms320c64x_insn_group; + +typedef enum tms320c64x_funit { + TMS320C64X_FUNIT_INVALID = 0, + TMS320C64X_FUNIT_D, + TMS320C64X_FUNIT_L, + TMS320C64X_FUNIT_M, + TMS320C64X_FUNIT_S, + TMS320C64X_FUNIT_NO +} tms320c64x_funit; + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/EDUReViver/include/capstone/x86.h b/EDUReViver/include/capstone/x86.h new file mode 100644 index 0000000..f8fc09e --- /dev/null +++ b/EDUReViver/include/capstone/x86.h @@ -0,0 +1,1972 @@ +#ifndef CAPSTONE_X86_H +#define CAPSTONE_X86_H + +/* Capstone Disassembly Engine */ +/* By Nguyen Anh Quynh , 2013-2015 */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "platform.h" + +/// Calculate relative address for X86-64, given cs_insn structure +#define X86_REL_ADDR(insn) (((insn).detail->x86.operands[0].type == X86_OP_IMM) \ + ? (uint64_t)((insn).detail->x86.operands[0].imm) \ + : (((insn).address + (insn).size) + (uint64_t)(insn).detail->x86.disp)) + +/// X86 registers +typedef enum x86_reg { + X86_REG_INVALID = 0, + X86_REG_AH, X86_REG_AL, X86_REG_AX, X86_REG_BH, X86_REG_BL, + X86_REG_BP, X86_REG_BPL, X86_REG_BX, X86_REG_CH, X86_REG_CL, + X86_REG_CS, X86_REG_CX, X86_REG_DH, X86_REG_DI, X86_REG_DIL, + X86_REG_DL, X86_REG_DS, X86_REG_DX, X86_REG_EAX, X86_REG_EBP, + X86_REG_EBX, X86_REG_ECX, X86_REG_EDI, X86_REG_EDX, X86_REG_EFLAGS, + X86_REG_EIP, X86_REG_EIZ, X86_REG_ES, X86_REG_ESI, X86_REG_ESP, + X86_REG_FPSW, X86_REG_FS, X86_REG_GS, X86_REG_IP, X86_REG_RAX, + X86_REG_RBP, X86_REG_RBX, X86_REG_RCX, X86_REG_RDI, X86_REG_RDX, + X86_REG_RIP, X86_REG_RIZ, X86_REG_RSI, X86_REG_RSP, X86_REG_SI, + X86_REG_SIL, X86_REG_SP, X86_REG_SPL, X86_REG_SS, X86_REG_CR0, + X86_REG_CR1, X86_REG_CR2, X86_REG_CR3, X86_REG_CR4, X86_REG_CR5, + X86_REG_CR6, X86_REG_CR7, X86_REG_CR8, X86_REG_CR9, X86_REG_CR10, + X86_REG_CR11, X86_REG_CR12, X86_REG_CR13, X86_REG_CR14, X86_REG_CR15, + X86_REG_DR0, X86_REG_DR1, X86_REG_DR2, X86_REG_DR3, X86_REG_DR4, + X86_REG_DR5, X86_REG_DR6, X86_REG_DR7, X86_REG_DR8, X86_REG_DR9, + X86_REG_DR10, X86_REG_DR11, X86_REG_DR12, X86_REG_DR13, X86_REG_DR14, + X86_REG_DR15, X86_REG_FP0, X86_REG_FP1, X86_REG_FP2, X86_REG_FP3, + X86_REG_FP4, X86_REG_FP5, X86_REG_FP6, X86_REG_FP7, + X86_REG_K0, X86_REG_K1, X86_REG_K2, X86_REG_K3, X86_REG_K4, + X86_REG_K5, X86_REG_K6, X86_REG_K7, X86_REG_MM0, X86_REG_MM1, + X86_REG_MM2, X86_REG_MM3, X86_REG_MM4, X86_REG_MM5, X86_REG_MM6, + X86_REG_MM7, X86_REG_R8, X86_REG_R9, X86_REG_R10, X86_REG_R11, + X86_REG_R12, X86_REG_R13, X86_REG_R14, X86_REG_R15, + X86_REG_ST0, X86_REG_ST1, X86_REG_ST2, X86_REG_ST3, + X86_REG_ST4, X86_REG_ST5, X86_REG_ST6, X86_REG_ST7, + X86_REG_XMM0, X86_REG_XMM1, X86_REG_XMM2, X86_REG_XMM3, X86_REG_XMM4, + X86_REG_XMM5, X86_REG_XMM6, X86_REG_XMM7, X86_REG_XMM8, X86_REG_XMM9, + X86_REG_XMM10, X86_REG_XMM11, X86_REG_XMM12, X86_REG_XMM13, X86_REG_XMM14, + X86_REG_XMM15, X86_REG_XMM16, X86_REG_XMM17, X86_REG_XMM18, X86_REG_XMM19, + X86_REG_XMM20, X86_REG_XMM21, X86_REG_XMM22, X86_REG_XMM23, X86_REG_XMM24, + X86_REG_XMM25, X86_REG_XMM26, X86_REG_XMM27, X86_REG_XMM28, X86_REG_XMM29, + X86_REG_XMM30, X86_REG_XMM31, X86_REG_YMM0, X86_REG_YMM1, X86_REG_YMM2, + X86_REG_YMM3, X86_REG_YMM4, X86_REG_YMM5, X86_REG_YMM6, X86_REG_YMM7, + X86_REG_YMM8, X86_REG_YMM9, X86_REG_YMM10, X86_REG_YMM11, X86_REG_YMM12, + X86_REG_YMM13, X86_REG_YMM14, X86_REG_YMM15, X86_REG_YMM16, X86_REG_YMM17, + X86_REG_YMM18, X86_REG_YMM19, X86_REG_YMM20, X86_REG_YMM21, X86_REG_YMM22, + X86_REG_YMM23, X86_REG_YMM24, X86_REG_YMM25, X86_REG_YMM26, X86_REG_YMM27, + X86_REG_YMM28, X86_REG_YMM29, X86_REG_YMM30, X86_REG_YMM31, X86_REG_ZMM0, + X86_REG_ZMM1, X86_REG_ZMM2, X86_REG_ZMM3, X86_REG_ZMM4, X86_REG_ZMM5, + X86_REG_ZMM6, X86_REG_ZMM7, X86_REG_ZMM8, X86_REG_ZMM9, X86_REG_ZMM10, + X86_REG_ZMM11, X86_REG_ZMM12, X86_REG_ZMM13, X86_REG_ZMM14, X86_REG_ZMM15, + X86_REG_ZMM16, X86_REG_ZMM17, X86_REG_ZMM18, X86_REG_ZMM19, X86_REG_ZMM20, + X86_REG_ZMM21, X86_REG_ZMM22, X86_REG_ZMM23, X86_REG_ZMM24, X86_REG_ZMM25, + X86_REG_ZMM26, X86_REG_ZMM27, X86_REG_ZMM28, X86_REG_ZMM29, X86_REG_ZMM30, + X86_REG_ZMM31, X86_REG_R8B, X86_REG_R9B, X86_REG_R10B, X86_REG_R11B, + X86_REG_R12B, X86_REG_R13B, X86_REG_R14B, X86_REG_R15B, X86_REG_R8D, + X86_REG_R9D, X86_REG_R10D, X86_REG_R11D, X86_REG_R12D, X86_REG_R13D, + X86_REG_R14D, X86_REG_R15D, X86_REG_R8W, X86_REG_R9W, X86_REG_R10W, + X86_REG_R11W, X86_REG_R12W, X86_REG_R13W, X86_REG_R14W, X86_REG_R15W, + + X86_REG_ENDING // <-- mark the end of the list of registers +} x86_reg; + +// Sub-flags of EFLAGS +#define X86_EFLAGS_MODIFY_AF (1ULL << 0) +#define X86_EFLAGS_MODIFY_CF (1ULL << 1) +#define X86_EFLAGS_MODIFY_SF (1ULL << 2) +#define X86_EFLAGS_MODIFY_ZF (1ULL << 3) +#define X86_EFLAGS_MODIFY_PF (1ULL << 4) +#define X86_EFLAGS_MODIFY_OF (1ULL << 5) +#define X86_EFLAGS_MODIFY_TF (1ULL << 6) +#define X86_EFLAGS_MODIFY_IF (1ULL << 7) +#define X86_EFLAGS_MODIFY_DF (1ULL << 8) +#define X86_EFLAGS_MODIFY_NT (1ULL << 9) +#define X86_EFLAGS_MODIFY_RF (1ULL << 10) +#define X86_EFLAGS_PRIOR_OF (1ULL << 11) +#define X86_EFLAGS_PRIOR_SF (1ULL << 12) +#define X86_EFLAGS_PRIOR_ZF (1ULL << 13) +#define X86_EFLAGS_PRIOR_AF (1ULL << 14) +#define X86_EFLAGS_PRIOR_PF (1ULL << 15) +#define X86_EFLAGS_PRIOR_CF (1ULL << 16) +#define X86_EFLAGS_PRIOR_TF (1ULL << 17) +#define X86_EFLAGS_PRIOR_IF (1ULL << 18) +#define X86_EFLAGS_PRIOR_DF (1ULL << 19) +#define X86_EFLAGS_PRIOR_NT (1ULL << 20) +#define X86_EFLAGS_RESET_OF (1ULL << 21) +#define X86_EFLAGS_RESET_CF (1ULL << 22) +#define X86_EFLAGS_RESET_DF (1ULL << 23) +#define X86_EFLAGS_RESET_IF (1ULL << 24) +#define X86_EFLAGS_RESET_SF (1ULL << 25) +#define X86_EFLAGS_RESET_AF (1ULL << 26) +#define X86_EFLAGS_RESET_TF (1ULL << 27) +#define X86_EFLAGS_RESET_NT (1ULL << 28) +#define X86_EFLAGS_RESET_PF (1ULL << 29) +#define X86_EFLAGS_SET_CF (1ULL << 30) +#define X86_EFLAGS_SET_DF (1ULL << 31) +#define X86_EFLAGS_SET_IF (1ULL << 32) +#define X86_EFLAGS_TEST_OF (1ULL << 33) +#define X86_EFLAGS_TEST_SF (1ULL << 34) +#define X86_EFLAGS_TEST_ZF (1ULL << 35) +#define X86_EFLAGS_TEST_PF (1ULL << 36) +#define X86_EFLAGS_TEST_CF (1ULL << 37) +#define X86_EFLAGS_TEST_NT (1ULL << 38) +#define X86_EFLAGS_TEST_DF (1ULL << 39) +#define X86_EFLAGS_UNDEFINED_OF (1ULL << 40) +#define X86_EFLAGS_UNDEFINED_SF (1ULL << 41) +#define X86_EFLAGS_UNDEFINED_ZF (1ULL << 42) +#define X86_EFLAGS_UNDEFINED_PF (1ULL << 43) +#define X86_EFLAGS_UNDEFINED_AF (1ULL << 44) +#define X86_EFLAGS_UNDEFINED_CF (1ULL << 45) +#define X86_EFLAGS_RESET_RF (1ULL << 46) +#define X86_EFLAGS_TEST_RF (1ULL << 47) +#define X86_EFLAGS_TEST_IF (1ULL << 48) +#define X86_EFLAGS_TEST_TF (1ULL << 49) +#define X86_EFLAGS_TEST_AF (1ULL << 50) +#define X86_EFLAGS_RESET_ZF (1ULL << 51) +#define X86_EFLAGS_SET_OF (1ULL << 52) +#define X86_EFLAGS_SET_SF (1ULL << 53) +#define X86_EFLAGS_SET_ZF (1ULL << 54) +#define X86_EFLAGS_SET_AF (1ULL << 55) +#define X86_EFLAGS_SET_PF (1ULL << 56) +#define X86_EFLAGS_RESET_0F (1ULL << 57) +#define X86_EFLAGS_RESET_AC (1ULL << 58) + +#define X86_FPU_FLAGS_MODIFY_C0 (1ULL << 0) +#define X86_FPU_FLAGS_MODIFY_C1 (1ULL << 1) +#define X86_FPU_FLAGS_MODIFY_C2 (1ULL << 2) +#define X86_FPU_FLAGS_MODIFY_C3 (1ULL << 3) +#define X86_FPU_FLAGS_RESET_C0 (1ULL << 4) +#define X86_FPU_FLAGS_RESET_C1 (1ULL << 5) +#define X86_FPU_FLAGS_RESET_C2 (1ULL << 6) +#define X86_FPU_FLAGS_RESET_C3 (1ULL << 7) +#define X86_FPU_FLAGS_SET_C0 (1ULL << 8) +#define X86_FPU_FLAGS_SET_C1 (1ULL << 9) +#define X86_FPU_FLAGS_SET_C2 (1ULL << 10) +#define X86_FPU_FLAGS_SET_C3 (1ULL << 11) +#define X86_FPU_FLAGS_UNDEFINED_C0 (1ULL << 12) +#define X86_FPU_FLAGS_UNDEFINED_C1 (1ULL << 13) +#define X86_FPU_FLAGS_UNDEFINED_C2 (1ULL << 14) +#define X86_FPU_FLAGS_UNDEFINED_C3 (1ULL << 15) +#define X86_FPU_FLAGS_TEST_C0 (1ULL << 16) +#define X86_FPU_FLAGS_TEST_C1 (1ULL << 17) +#define X86_FPU_FLAGS_TEST_C2 (1ULL << 18) +#define X86_FPU_FLAGS_TEST_C3 (1ULL << 19) + + +/// Operand type for instruction's operands +typedef enum x86_op_type { + X86_OP_INVALID = 0, ///< = CS_OP_INVALID (Uninitialized). + X86_OP_REG, ///< = CS_OP_REG (Register operand). + X86_OP_IMM, ///< = CS_OP_IMM (Immediate operand). + X86_OP_MEM, ///< = CS_OP_MEM (Memory operand). +} x86_op_type; + +/// XOP Code Condition type +typedef enum x86_xop_cc { + X86_XOP_CC_INVALID = 0, ///< Uninitialized. + X86_XOP_CC_LT, + X86_XOP_CC_LE, + X86_XOP_CC_GT, + X86_XOP_CC_GE, + X86_XOP_CC_EQ, + X86_XOP_CC_NEQ, + X86_XOP_CC_FALSE, + X86_XOP_CC_TRUE, +} x86_xop_cc; + +/// AVX broadcast type +typedef enum x86_avx_bcast { + X86_AVX_BCAST_INVALID = 0, ///< Uninitialized. + X86_AVX_BCAST_2, ///< AVX512 broadcast type {1to2} + X86_AVX_BCAST_4, ///< AVX512 broadcast type {1to4} + X86_AVX_BCAST_8, ///< AVX512 broadcast type {1to8} + X86_AVX_BCAST_16, ///< AVX512 broadcast type {1to16} +} x86_avx_bcast; + +/// SSE Code Condition type +typedef enum x86_sse_cc { + X86_SSE_CC_INVALID = 0, ///< Uninitialized. + X86_SSE_CC_EQ, + X86_SSE_CC_LT, + X86_SSE_CC_LE, + X86_SSE_CC_UNORD, + X86_SSE_CC_NEQ, + X86_SSE_CC_NLT, + X86_SSE_CC_NLE, + X86_SSE_CC_ORD, +} x86_sse_cc; + +/// AVX Code Condition type +typedef enum x86_avx_cc { + X86_AVX_CC_INVALID = 0, ///< Uninitialized. + X86_AVX_CC_EQ, + X86_AVX_CC_LT, + X86_AVX_CC_LE, + X86_AVX_CC_UNORD, + X86_AVX_CC_NEQ, + X86_AVX_CC_NLT, + X86_AVX_CC_NLE, + X86_AVX_CC_ORD, + X86_AVX_CC_EQ_UQ, + X86_AVX_CC_NGE, + X86_AVX_CC_NGT, + X86_AVX_CC_FALSE, + X86_AVX_CC_NEQ_OQ, + X86_AVX_CC_GE, + X86_AVX_CC_GT, + X86_AVX_CC_TRUE, + X86_AVX_CC_EQ_OS, + X86_AVX_CC_LT_OQ, + X86_AVX_CC_LE_OQ, + X86_AVX_CC_UNORD_S, + X86_AVX_CC_NEQ_US, + X86_AVX_CC_NLT_UQ, + X86_AVX_CC_NLE_UQ, + X86_AVX_CC_ORD_S, + X86_AVX_CC_EQ_US, + X86_AVX_CC_NGE_UQ, + X86_AVX_CC_NGT_UQ, + X86_AVX_CC_FALSE_OS, + X86_AVX_CC_NEQ_OS, + X86_AVX_CC_GE_OQ, + X86_AVX_CC_GT_OQ, + X86_AVX_CC_TRUE_US, +} x86_avx_cc; + +/// AVX static rounding mode type +typedef enum x86_avx_rm { + X86_AVX_RM_INVALID = 0, ///< Uninitialized. + X86_AVX_RM_RN, ///< Round to nearest + X86_AVX_RM_RD, ///< Round down + X86_AVX_RM_RU, ///< Round up + X86_AVX_RM_RZ, ///< Round toward zero +} x86_avx_rm; + +/// Instruction prefixes - to be used in cs_x86.prefix[] +typedef enum x86_prefix { + X86_PREFIX_LOCK = 0xf0, ///< lock (cs_x86.prefix[0] + X86_PREFIX_REP = 0xf3, ///< rep (cs_x86.prefix[0] + X86_PREFIX_REPE = 0xf3, ///< repe/repz (cs_x86.prefix[0] + X86_PREFIX_REPNE = 0xf2, ///< repne/repnz (cs_x86.prefix[0] + + X86_PREFIX_CS = 0x2e, ///< segment override CS (cs_x86.prefix[1] + X86_PREFIX_SS = 0x36, ///< segment override SS (cs_x86.prefix[1] + X86_PREFIX_DS = 0x3e, ///< segment override DS (cs_x86.prefix[1] + X86_PREFIX_ES = 0x26, ///< segment override ES (cs_x86.prefix[1] + X86_PREFIX_FS = 0x64, ///< segment override FS (cs_x86.prefix[1] + X86_PREFIX_GS = 0x65, ///< segment override GS (cs_x86.prefix[1] + + X86_PREFIX_OPSIZE = 0x66, ///< operand-size override (cs_x86.prefix[2] + X86_PREFIX_ADDRSIZE = 0x67, ///< address-size override (cs_x86.prefix[3] +} x86_prefix; + +/// Instruction's operand referring to memory +/// This is associated with X86_OP_MEM operand type above +typedef struct x86_op_mem { + x86_reg segment; ///< segment register (or X86_REG_INVALID if irrelevant) + x86_reg base; ///< base register (or X86_REG_INVALID if irrelevant) + x86_reg index; ///< index register (or X86_REG_INVALID if irrelevant) + int scale; ///< scale for index register + int64_t disp; ///< displacement value +} x86_op_mem; + +/// Instruction operand +typedef struct cs_x86_op { + x86_op_type type; ///< operand type + union { + x86_reg reg; ///< register value for REG operand + int64_t imm; ///< immediate value for IMM operand + x86_op_mem mem; ///< base/index/scale/disp value for MEM operand + }; + + /// size of this operand (in bytes). + uint8_t size; + + /// How is this operand accessed? (READ, WRITE or READ|WRITE) + /// This field is combined of cs_ac_type. + /// NOTE: this field is irrelevant if engine is compiled in DIET mode. + uint8_t access; + + /// AVX broadcast type, or 0 if irrelevant + x86_avx_bcast avx_bcast; + + /// AVX zero opmask {z} + bool avx_zero_opmask; +} cs_x86_op; + +typedef struct cs_x86_encoding { + /// ModR/M offset, or 0 when irrelevant + uint8_t modrm_offset; + + /// Displacement offset, or 0 when irrelevant. + uint8_t disp_offset; + uint8_t disp_size; + + /// Immediate offset, or 0 when irrelevant. + uint8_t imm_offset; + uint8_t imm_size; +} cs_x86_encoding; + +/// Instruction structure +typedef struct cs_x86 { + /// Instruction prefix, which can be up to 4 bytes. + /// A prefix byte gets value 0 when irrelevant. + /// prefix[0] indicates REP/REPNE/LOCK prefix (See X86_PREFIX_REP/REPNE/LOCK above) + /// prefix[1] indicates segment override (irrelevant for x86_64): + /// See X86_PREFIX_CS/SS/DS/ES/FS/GS above. + /// prefix[2] indicates operand-size override (X86_PREFIX_OPSIZE) + /// prefix[3] indicates address-size override (X86_PREFIX_ADDRSIZE) + uint8_t prefix[4]; + + /// Instruction opcode, which can be from 1 to 4 bytes in size. + /// This contains VEX opcode as well. + /// An trailing opcode byte gets value 0 when irrelevant. + uint8_t opcode[4]; + + /// REX prefix: only a non-zero value is relevant for x86_64 + uint8_t rex; + + /// Address size, which can be overridden with above prefix[5]. + uint8_t addr_size; + + /// ModR/M byte + uint8_t modrm; + + /// SIB value, or 0 when irrelevant. + uint8_t sib; + + /// Displacement value, valid if encoding.disp_offset != 0 + int64_t disp; + + /// SIB index register, or X86_REG_INVALID when irrelevant. + x86_reg sib_index; + /// SIB scale, only applicable if sib_index is valid. + int8_t sib_scale; + /// SIB base register, or X86_REG_INVALID when irrelevant. + x86_reg sib_base; + + /// XOP Code Condition + x86_xop_cc xop_cc; + + /// SSE Code Condition + x86_sse_cc sse_cc; + + /// AVX Code Condition + x86_avx_cc avx_cc; + + /// AVX Suppress all Exception + bool avx_sae; + + /// AVX static rounding mode + x86_avx_rm avx_rm; + + + union { + /// EFLAGS updated by this instruction. + /// This can be formed from OR combination of X86_EFLAGS_* symbols in x86.h + uint64_t eflags; + /// FPU_FLAGS updated by this instruction. + /// This can be formed from OR combination of X86_FPU_FLAGS_* symbols in x86.h + uint64_t fpu_flags; + }; + + /// Number of operands of this instruction, + /// or 0 when instruction has no operand. + uint8_t op_count; + + cs_x86_op operands[8]; ///< operands for this instruction. + + cs_x86_encoding encoding; ///< encoding information +} cs_x86; + +/// X86 instructions +typedef enum x86_insn { + X86_INS_INVALID = 0, + + X86_INS_AAA, + X86_INS_AAD, + X86_INS_AAM, + X86_INS_AAS, + X86_INS_FABS, + X86_INS_ADC, + X86_INS_ADCX, + X86_INS_ADD, + X86_INS_ADDPD, + X86_INS_ADDPS, + X86_INS_ADDSD, + X86_INS_ADDSS, + X86_INS_ADDSUBPD, + X86_INS_ADDSUBPS, + X86_INS_FADD, + X86_INS_FIADD, + X86_INS_FADDP, + X86_INS_ADOX, + X86_INS_AESDECLAST, + X86_INS_AESDEC, + X86_INS_AESENCLAST, + X86_INS_AESENC, + X86_INS_AESIMC, + X86_INS_AESKEYGENASSIST, + X86_INS_AND, + X86_INS_ANDN, + X86_INS_ANDNPD, + X86_INS_ANDNPS, + X86_INS_ANDPD, + X86_INS_ANDPS, + X86_INS_ARPL, + X86_INS_BEXTR, + X86_INS_BLCFILL, + X86_INS_BLCI, + X86_INS_BLCIC, + X86_INS_BLCMSK, + X86_INS_BLCS, + X86_INS_BLENDPD, + X86_INS_BLENDPS, + X86_INS_BLENDVPD, + X86_INS_BLENDVPS, + X86_INS_BLSFILL, + X86_INS_BLSI, + X86_INS_BLSIC, + X86_INS_BLSMSK, + X86_INS_BLSR, + X86_INS_BOUND, + X86_INS_BSF, + X86_INS_BSR, + X86_INS_BSWAP, + X86_INS_BT, + X86_INS_BTC, + X86_INS_BTR, + X86_INS_BTS, + X86_INS_BZHI, + X86_INS_CALL, + X86_INS_CBW, + X86_INS_CDQ, + X86_INS_CDQE, + X86_INS_FCHS, + X86_INS_CLAC, + X86_INS_CLC, + X86_INS_CLD, + X86_INS_CLFLUSH, + X86_INS_CLFLUSHOPT, + X86_INS_CLGI, + X86_INS_CLI, + X86_INS_CLTS, + X86_INS_CLWB, + X86_INS_CMC, + X86_INS_CMOVA, + X86_INS_CMOVAE, + X86_INS_CMOVB, + X86_INS_CMOVBE, + X86_INS_FCMOVBE, + X86_INS_FCMOVB, + X86_INS_CMOVE, + X86_INS_FCMOVE, + X86_INS_CMOVG, + X86_INS_CMOVGE, + X86_INS_CMOVL, + X86_INS_CMOVLE, + X86_INS_FCMOVNBE, + X86_INS_FCMOVNB, + X86_INS_CMOVNE, + X86_INS_FCMOVNE, + X86_INS_CMOVNO, + X86_INS_CMOVNP, + X86_INS_FCMOVNU, + X86_INS_CMOVNS, + X86_INS_CMOVO, + X86_INS_CMOVP, + X86_INS_FCMOVU, + X86_INS_CMOVS, + X86_INS_CMP, + X86_INS_CMPSB, + X86_INS_CMPSQ, + X86_INS_CMPSW, + X86_INS_CMPXCHG16B, + X86_INS_CMPXCHG, + X86_INS_CMPXCHG8B, + X86_INS_COMISD, + X86_INS_COMISS, + X86_INS_FCOMP, + X86_INS_FCOMIP, + X86_INS_FCOMI, + X86_INS_FCOM, + X86_INS_FCOS, + X86_INS_CPUID, + X86_INS_CQO, + X86_INS_CRC32, + X86_INS_CVTDQ2PD, + X86_INS_CVTDQ2PS, + X86_INS_CVTPD2DQ, + X86_INS_CVTPD2PS, + X86_INS_CVTPS2DQ, + X86_INS_CVTPS2PD, + X86_INS_CVTSD2SI, + X86_INS_CVTSD2SS, + X86_INS_CVTSI2SD, + X86_INS_CVTSI2SS, + X86_INS_CVTSS2SD, + X86_INS_CVTSS2SI, + X86_INS_CVTTPD2DQ, + X86_INS_CVTTPS2DQ, + X86_INS_CVTTSD2SI, + X86_INS_CVTTSS2SI, + X86_INS_CWD, + X86_INS_CWDE, + X86_INS_DAA, + X86_INS_DAS, + X86_INS_DATA16, + X86_INS_DEC, + X86_INS_DIV, + X86_INS_DIVPD, + X86_INS_DIVPS, + X86_INS_FDIVR, + X86_INS_FIDIVR, + X86_INS_FDIVRP, + X86_INS_DIVSD, + X86_INS_DIVSS, + X86_INS_FDIV, + X86_INS_FIDIV, + X86_INS_FDIVP, + X86_INS_DPPD, + X86_INS_DPPS, + X86_INS_RET, + X86_INS_ENCLS, + X86_INS_ENCLU, + X86_INS_ENTER, + X86_INS_EXTRACTPS, + X86_INS_EXTRQ, + X86_INS_F2XM1, + X86_INS_LCALL, + X86_INS_LJMP, + X86_INS_FBLD, + X86_INS_FBSTP, + X86_INS_FCOMPP, + X86_INS_FDECSTP, + X86_INS_FEMMS, + X86_INS_FFREE, + X86_INS_FICOM, + X86_INS_FICOMP, + X86_INS_FINCSTP, + X86_INS_FLDCW, + X86_INS_FLDENV, + X86_INS_FLDL2E, + X86_INS_FLDL2T, + X86_INS_FLDLG2, + X86_INS_FLDLN2, + X86_INS_FLDPI, + X86_INS_FNCLEX, + X86_INS_FNINIT, + X86_INS_FNOP, + X86_INS_FNSTCW, + X86_INS_FNSTSW, + X86_INS_FPATAN, + X86_INS_FPREM, + X86_INS_FPREM1, + X86_INS_FPTAN, + X86_INS_FFREEP, + X86_INS_FRNDINT, + X86_INS_FRSTOR, + X86_INS_FNSAVE, + X86_INS_FSCALE, + X86_INS_FSETPM, + X86_INS_FSINCOS, + X86_INS_FNSTENV, + X86_INS_FXAM, + X86_INS_FXRSTOR, + X86_INS_FXRSTOR64, + X86_INS_FXSAVE, + X86_INS_FXSAVE64, + X86_INS_FXTRACT, + X86_INS_FYL2X, + X86_INS_FYL2XP1, + X86_INS_MOVAPD, + X86_INS_MOVAPS, + X86_INS_ORPD, + X86_INS_ORPS, + X86_INS_VMOVAPD, + X86_INS_VMOVAPS, + X86_INS_XORPD, + X86_INS_XORPS, + X86_INS_GETSEC, + X86_INS_HADDPD, + X86_INS_HADDPS, + X86_INS_HLT, + X86_INS_HSUBPD, + X86_INS_HSUBPS, + X86_INS_IDIV, + X86_INS_FILD, + X86_INS_IMUL, + X86_INS_IN, + X86_INS_INC, + X86_INS_INSB, + X86_INS_INSERTPS, + X86_INS_INSERTQ, + X86_INS_INSD, + X86_INS_INSW, + X86_INS_INT, + X86_INS_INT1, + X86_INS_INT3, + X86_INS_INTO, + X86_INS_INVD, + X86_INS_INVEPT, + X86_INS_INVLPG, + X86_INS_INVLPGA, + X86_INS_INVPCID, + X86_INS_INVVPID, + X86_INS_IRET, + X86_INS_IRETD, + X86_INS_IRETQ, + X86_INS_FISTTP, + X86_INS_FIST, + X86_INS_FISTP, + X86_INS_UCOMISD, + X86_INS_UCOMISS, + X86_INS_VCOMISD, + X86_INS_VCOMISS, + X86_INS_VCVTSD2SS, + X86_INS_VCVTSI2SD, + X86_INS_VCVTSI2SS, + X86_INS_VCVTSS2SD, + X86_INS_VCVTTSD2SI, + X86_INS_VCVTTSD2USI, + X86_INS_VCVTTSS2SI, + X86_INS_VCVTTSS2USI, + X86_INS_VCVTUSI2SD, + X86_INS_VCVTUSI2SS, + X86_INS_VUCOMISD, + X86_INS_VUCOMISS, + X86_INS_JAE, + X86_INS_JA, + X86_INS_JBE, + X86_INS_JB, + X86_INS_JCXZ, + X86_INS_JECXZ, + X86_INS_JE, + X86_INS_JGE, + X86_INS_JG, + X86_INS_JLE, + X86_INS_JL, + X86_INS_JMP, + X86_INS_JNE, + X86_INS_JNO, + X86_INS_JNP, + X86_INS_JNS, + X86_INS_JO, + X86_INS_JP, + X86_INS_JRCXZ, + X86_INS_JS, + X86_INS_KANDB, + X86_INS_KANDD, + X86_INS_KANDNB, + X86_INS_KANDND, + X86_INS_KANDNQ, + X86_INS_KANDNW, + X86_INS_KANDQ, + X86_INS_KANDW, + X86_INS_KMOVB, + X86_INS_KMOVD, + X86_INS_KMOVQ, + X86_INS_KMOVW, + X86_INS_KNOTB, + X86_INS_KNOTD, + X86_INS_KNOTQ, + X86_INS_KNOTW, + X86_INS_KORB, + X86_INS_KORD, + X86_INS_KORQ, + X86_INS_KORTESTB, + X86_INS_KORTESTD, + X86_INS_KORTESTQ, + X86_INS_KORTESTW, + X86_INS_KORW, + X86_INS_KSHIFTLB, + X86_INS_KSHIFTLD, + X86_INS_KSHIFTLQ, + X86_INS_KSHIFTLW, + X86_INS_KSHIFTRB, + X86_INS_KSHIFTRD, + X86_INS_KSHIFTRQ, + X86_INS_KSHIFTRW, + X86_INS_KUNPCKBW, + X86_INS_KXNORB, + X86_INS_KXNORD, + X86_INS_KXNORQ, + X86_INS_KXNORW, + X86_INS_KXORB, + X86_INS_KXORD, + X86_INS_KXORQ, + X86_INS_KXORW, + X86_INS_LAHF, + X86_INS_LAR, + X86_INS_LDDQU, + X86_INS_LDMXCSR, + X86_INS_LDS, + X86_INS_FLDZ, + X86_INS_FLD1, + X86_INS_FLD, + X86_INS_LEA, + X86_INS_LEAVE, + X86_INS_LES, + X86_INS_LFENCE, + X86_INS_LFS, + X86_INS_LGDT, + X86_INS_LGS, + X86_INS_LIDT, + X86_INS_LLDT, + X86_INS_LMSW, + X86_INS_OR, + X86_INS_SUB, + X86_INS_XOR, + X86_INS_LODSB, + X86_INS_LODSD, + X86_INS_LODSQ, + X86_INS_LODSW, + X86_INS_LOOP, + X86_INS_LOOPE, + X86_INS_LOOPNE, + X86_INS_RETF, + X86_INS_RETFQ, + X86_INS_LSL, + X86_INS_LSS, + X86_INS_LTR, + X86_INS_XADD, + X86_INS_LZCNT, + X86_INS_MASKMOVDQU, + X86_INS_MAXPD, + X86_INS_MAXPS, + X86_INS_MAXSD, + X86_INS_MAXSS, + X86_INS_MFENCE, + X86_INS_MINPD, + X86_INS_MINPS, + X86_INS_MINSD, + X86_INS_MINSS, + X86_INS_CVTPD2PI, + X86_INS_CVTPI2PD, + X86_INS_CVTPI2PS, + X86_INS_CVTPS2PI, + X86_INS_CVTTPD2PI, + X86_INS_CVTTPS2PI, + X86_INS_EMMS, + X86_INS_MASKMOVQ, + X86_INS_MOVD, + X86_INS_MOVDQ2Q, + X86_INS_MOVNTQ, + X86_INS_MOVQ2DQ, + X86_INS_MOVQ, + X86_INS_PABSB, + X86_INS_PABSD, + X86_INS_PABSW, + X86_INS_PACKSSDW, + X86_INS_PACKSSWB, + X86_INS_PACKUSWB, + X86_INS_PADDB, + X86_INS_PADDD, + X86_INS_PADDQ, + X86_INS_PADDSB, + X86_INS_PADDSW, + X86_INS_PADDUSB, + X86_INS_PADDUSW, + X86_INS_PADDW, + X86_INS_PALIGNR, + X86_INS_PANDN, + X86_INS_PAND, + X86_INS_PAVGB, + X86_INS_PAVGW, + X86_INS_PCMPEQB, + X86_INS_PCMPEQD, + X86_INS_PCMPEQW, + X86_INS_PCMPGTB, + X86_INS_PCMPGTD, + X86_INS_PCMPGTW, + X86_INS_PEXTRW, + X86_INS_PHADDSW, + X86_INS_PHADDW, + X86_INS_PHADDD, + X86_INS_PHSUBD, + X86_INS_PHSUBSW, + X86_INS_PHSUBW, + X86_INS_PINSRW, + X86_INS_PMADDUBSW, + X86_INS_PMADDWD, + X86_INS_PMAXSW, + X86_INS_PMAXUB, + X86_INS_PMINSW, + X86_INS_PMINUB, + X86_INS_PMOVMSKB, + X86_INS_PMULHRSW, + X86_INS_PMULHUW, + X86_INS_PMULHW, + X86_INS_PMULLW, + X86_INS_PMULUDQ, + X86_INS_POR, + X86_INS_PSADBW, + X86_INS_PSHUFB, + X86_INS_PSHUFW, + X86_INS_PSIGNB, + X86_INS_PSIGND, + X86_INS_PSIGNW, + X86_INS_PSLLD, + X86_INS_PSLLQ, + X86_INS_PSLLW, + X86_INS_PSRAD, + X86_INS_PSRAW, + X86_INS_PSRLD, + X86_INS_PSRLQ, + X86_INS_PSRLW, + X86_INS_PSUBB, + X86_INS_PSUBD, + X86_INS_PSUBQ, + X86_INS_PSUBSB, + X86_INS_PSUBSW, + X86_INS_PSUBUSB, + X86_INS_PSUBUSW, + X86_INS_PSUBW, + X86_INS_PUNPCKHBW, + X86_INS_PUNPCKHDQ, + X86_INS_PUNPCKHWD, + X86_INS_PUNPCKLBW, + X86_INS_PUNPCKLDQ, + X86_INS_PUNPCKLWD, + X86_INS_PXOR, + X86_INS_MONITOR, + X86_INS_MONTMUL, + X86_INS_MOV, + X86_INS_MOVABS, + X86_INS_MOVBE, + X86_INS_MOVDDUP, + X86_INS_MOVDQA, + X86_INS_MOVDQU, + X86_INS_MOVHLPS, + X86_INS_MOVHPD, + X86_INS_MOVHPS, + X86_INS_MOVLHPS, + X86_INS_MOVLPD, + X86_INS_MOVLPS, + X86_INS_MOVMSKPD, + X86_INS_MOVMSKPS, + X86_INS_MOVNTDQA, + X86_INS_MOVNTDQ, + X86_INS_MOVNTI, + X86_INS_MOVNTPD, + X86_INS_MOVNTPS, + X86_INS_MOVNTSD, + X86_INS_MOVNTSS, + X86_INS_MOVSB, + X86_INS_MOVSD, + X86_INS_MOVSHDUP, + X86_INS_MOVSLDUP, + X86_INS_MOVSQ, + X86_INS_MOVSS, + X86_INS_MOVSW, + X86_INS_MOVSX, + X86_INS_MOVSXD, + X86_INS_MOVUPD, + X86_INS_MOVUPS, + X86_INS_MOVZX, + X86_INS_MPSADBW, + X86_INS_MUL, + X86_INS_MULPD, + X86_INS_MULPS, + X86_INS_MULSD, + X86_INS_MULSS, + X86_INS_MULX, + X86_INS_FMUL, + X86_INS_FIMUL, + X86_INS_FMULP, + X86_INS_MWAIT, + X86_INS_NEG, + X86_INS_NOP, + X86_INS_NOT, + X86_INS_OUT, + X86_INS_OUTSB, + X86_INS_OUTSD, + X86_INS_OUTSW, + X86_INS_PACKUSDW, + X86_INS_PAUSE, + X86_INS_PAVGUSB, + X86_INS_PBLENDVB, + X86_INS_PBLENDW, + X86_INS_PCLMULQDQ, + X86_INS_PCMPEQQ, + X86_INS_PCMPESTRI, + X86_INS_PCMPESTRM, + X86_INS_PCMPGTQ, + X86_INS_PCMPISTRI, + X86_INS_PCMPISTRM, + X86_INS_PCOMMIT, + X86_INS_PDEP, + X86_INS_PEXT, + X86_INS_PEXTRB, + X86_INS_PEXTRD, + X86_INS_PEXTRQ, + X86_INS_PF2ID, + X86_INS_PF2IW, + X86_INS_PFACC, + X86_INS_PFADD, + X86_INS_PFCMPEQ, + X86_INS_PFCMPGE, + X86_INS_PFCMPGT, + X86_INS_PFMAX, + X86_INS_PFMIN, + X86_INS_PFMUL, + X86_INS_PFNACC, + X86_INS_PFPNACC, + X86_INS_PFRCPIT1, + X86_INS_PFRCPIT2, + X86_INS_PFRCP, + X86_INS_PFRSQIT1, + X86_INS_PFRSQRT, + X86_INS_PFSUBR, + X86_INS_PFSUB, + X86_INS_PHMINPOSUW, + X86_INS_PI2FD, + X86_INS_PI2FW, + X86_INS_PINSRB, + X86_INS_PINSRD, + X86_INS_PINSRQ, + X86_INS_PMAXSB, + X86_INS_PMAXSD, + X86_INS_PMAXUD, + X86_INS_PMAXUW, + X86_INS_PMINSB, + X86_INS_PMINSD, + X86_INS_PMINUD, + X86_INS_PMINUW, + X86_INS_PMOVSXBD, + X86_INS_PMOVSXBQ, + X86_INS_PMOVSXBW, + X86_INS_PMOVSXDQ, + X86_INS_PMOVSXWD, + X86_INS_PMOVSXWQ, + X86_INS_PMOVZXBD, + X86_INS_PMOVZXBQ, + X86_INS_PMOVZXBW, + X86_INS_PMOVZXDQ, + X86_INS_PMOVZXWD, + X86_INS_PMOVZXWQ, + X86_INS_PMULDQ, + X86_INS_PMULHRW, + X86_INS_PMULLD, + X86_INS_POP, + X86_INS_POPAW, + X86_INS_POPAL, + X86_INS_POPCNT, + X86_INS_POPF, + X86_INS_POPFD, + X86_INS_POPFQ, + X86_INS_PREFETCH, + X86_INS_PREFETCHNTA, + X86_INS_PREFETCHT0, + X86_INS_PREFETCHT1, + X86_INS_PREFETCHT2, + X86_INS_PREFETCHW, + X86_INS_PSHUFD, + X86_INS_PSHUFHW, + X86_INS_PSHUFLW, + X86_INS_PSLLDQ, + X86_INS_PSRLDQ, + X86_INS_PSWAPD, + X86_INS_PTEST, + X86_INS_PUNPCKHQDQ, + X86_INS_PUNPCKLQDQ, + X86_INS_PUSH, + X86_INS_PUSHAW, + X86_INS_PUSHAL, + X86_INS_PUSHF, + X86_INS_PUSHFD, + X86_INS_PUSHFQ, + X86_INS_RCL, + X86_INS_RCPPS, + X86_INS_RCPSS, + X86_INS_RCR, + X86_INS_RDFSBASE, + X86_INS_RDGSBASE, + X86_INS_RDMSR, + X86_INS_RDPMC, + X86_INS_RDRAND, + X86_INS_RDSEED, + X86_INS_RDTSC, + X86_INS_RDTSCP, + X86_INS_ROL, + X86_INS_ROR, + X86_INS_RORX, + X86_INS_ROUNDPD, + X86_INS_ROUNDPS, + X86_INS_ROUNDSD, + X86_INS_ROUNDSS, + X86_INS_RSM, + X86_INS_RSQRTPS, + X86_INS_RSQRTSS, + X86_INS_SAHF, + X86_INS_SAL, + X86_INS_SALC, + X86_INS_SAR, + X86_INS_SARX, + X86_INS_SBB, + X86_INS_SCASB, + X86_INS_SCASD, + X86_INS_SCASQ, + X86_INS_SCASW, + X86_INS_SETAE, + X86_INS_SETA, + X86_INS_SETBE, + X86_INS_SETB, + X86_INS_SETE, + X86_INS_SETGE, + X86_INS_SETG, + X86_INS_SETLE, + X86_INS_SETL, + X86_INS_SETNE, + X86_INS_SETNO, + X86_INS_SETNP, + X86_INS_SETNS, + X86_INS_SETO, + X86_INS_SETP, + X86_INS_SETS, + X86_INS_SFENCE, + X86_INS_SGDT, + X86_INS_SHA1MSG1, + X86_INS_SHA1MSG2, + X86_INS_SHA1NEXTE, + X86_INS_SHA1RNDS4, + X86_INS_SHA256MSG1, + X86_INS_SHA256MSG2, + X86_INS_SHA256RNDS2, + X86_INS_SHL, + X86_INS_SHLD, + X86_INS_SHLX, + X86_INS_SHR, + X86_INS_SHRD, + X86_INS_SHRX, + X86_INS_SHUFPD, + X86_INS_SHUFPS, + X86_INS_SIDT, + X86_INS_FSIN, + X86_INS_SKINIT, + X86_INS_SLDT, + X86_INS_SMSW, + X86_INS_SQRTPD, + X86_INS_SQRTPS, + X86_INS_SQRTSD, + X86_INS_SQRTSS, + X86_INS_FSQRT, + X86_INS_STAC, + X86_INS_STC, + X86_INS_STD, + X86_INS_STGI, + X86_INS_STI, + X86_INS_STMXCSR, + X86_INS_STOSB, + X86_INS_STOSD, + X86_INS_STOSQ, + X86_INS_STOSW, + X86_INS_STR, + X86_INS_FST, + X86_INS_FSTP, + X86_INS_FSTPNCE, + X86_INS_FXCH, + X86_INS_SUBPD, + X86_INS_SUBPS, + X86_INS_FSUBR, + X86_INS_FISUBR, + X86_INS_FSUBRP, + X86_INS_SUBSD, + X86_INS_SUBSS, + X86_INS_FSUB, + X86_INS_FISUB, + X86_INS_FSUBP, + X86_INS_SWAPGS, + X86_INS_SYSCALL, + X86_INS_SYSENTER, + X86_INS_SYSEXIT, + X86_INS_SYSRET, + X86_INS_T1MSKC, + X86_INS_TEST, + X86_INS_UD2, + X86_INS_FTST, + X86_INS_TZCNT, + X86_INS_TZMSK, + X86_INS_FUCOMIP, + X86_INS_FUCOMI, + X86_INS_FUCOMPP, + X86_INS_FUCOMP, + X86_INS_FUCOM, + X86_INS_UD2B, + X86_INS_UNPCKHPD, + X86_INS_UNPCKHPS, + X86_INS_UNPCKLPD, + X86_INS_UNPCKLPS, + X86_INS_VADDPD, + X86_INS_VADDPS, + X86_INS_VADDSD, + X86_INS_VADDSS, + X86_INS_VADDSUBPD, + X86_INS_VADDSUBPS, + X86_INS_VAESDECLAST, + X86_INS_VAESDEC, + X86_INS_VAESENCLAST, + X86_INS_VAESENC, + X86_INS_VAESIMC, + X86_INS_VAESKEYGENASSIST, + X86_INS_VALIGND, + X86_INS_VALIGNQ, + X86_INS_VANDNPD, + X86_INS_VANDNPS, + X86_INS_VANDPD, + X86_INS_VANDPS, + X86_INS_VBLENDMPD, + X86_INS_VBLENDMPS, + X86_INS_VBLENDPD, + X86_INS_VBLENDPS, + X86_INS_VBLENDVPD, + X86_INS_VBLENDVPS, + X86_INS_VBROADCASTF128, + X86_INS_VBROADCASTI32X4, + X86_INS_VBROADCASTI64X4, + X86_INS_VBROADCASTSD, + X86_INS_VBROADCASTSS, + X86_INS_VCOMPRESSPD, + X86_INS_VCOMPRESSPS, + X86_INS_VCVTDQ2PD, + X86_INS_VCVTDQ2PS, + X86_INS_VCVTPD2DQX, + X86_INS_VCVTPD2DQ, + X86_INS_VCVTPD2PSX, + X86_INS_VCVTPD2PS, + X86_INS_VCVTPD2UDQ, + X86_INS_VCVTPH2PS, + X86_INS_VCVTPS2DQ, + X86_INS_VCVTPS2PD, + X86_INS_VCVTPS2PH, + X86_INS_VCVTPS2UDQ, + X86_INS_VCVTSD2SI, + X86_INS_VCVTSD2USI, + X86_INS_VCVTSS2SI, + X86_INS_VCVTSS2USI, + X86_INS_VCVTTPD2DQX, + X86_INS_VCVTTPD2DQ, + X86_INS_VCVTTPD2UDQ, + X86_INS_VCVTTPS2DQ, + X86_INS_VCVTTPS2UDQ, + X86_INS_VCVTUDQ2PD, + X86_INS_VCVTUDQ2PS, + X86_INS_VDIVPD, + X86_INS_VDIVPS, + X86_INS_VDIVSD, + X86_INS_VDIVSS, + X86_INS_VDPPD, + X86_INS_VDPPS, + X86_INS_VERR, + X86_INS_VERW, + X86_INS_VEXP2PD, + X86_INS_VEXP2PS, + X86_INS_VEXPANDPD, + X86_INS_VEXPANDPS, + X86_INS_VEXTRACTF128, + X86_INS_VEXTRACTF32X4, + X86_INS_VEXTRACTF64X4, + X86_INS_VEXTRACTI128, + X86_INS_VEXTRACTI32X4, + X86_INS_VEXTRACTI64X4, + X86_INS_VEXTRACTPS, + X86_INS_VFMADD132PD, + X86_INS_VFMADD132PS, + X86_INS_VFMADDPD, + X86_INS_VFMADD213PD, + X86_INS_VFMADD231PD, + X86_INS_VFMADDPS, + X86_INS_VFMADD213PS, + X86_INS_VFMADD231PS, + X86_INS_VFMADDSD, + X86_INS_VFMADD213SD, + X86_INS_VFMADD132SD, + X86_INS_VFMADD231SD, + X86_INS_VFMADDSS, + X86_INS_VFMADD213SS, + X86_INS_VFMADD132SS, + X86_INS_VFMADD231SS, + X86_INS_VFMADDSUB132PD, + X86_INS_VFMADDSUB132PS, + X86_INS_VFMADDSUBPD, + X86_INS_VFMADDSUB213PD, + X86_INS_VFMADDSUB231PD, + X86_INS_VFMADDSUBPS, + X86_INS_VFMADDSUB213PS, + X86_INS_VFMADDSUB231PS, + X86_INS_VFMSUB132PD, + X86_INS_VFMSUB132PS, + X86_INS_VFMSUBADD132PD, + X86_INS_VFMSUBADD132PS, + X86_INS_VFMSUBADDPD, + X86_INS_VFMSUBADD213PD, + X86_INS_VFMSUBADD231PD, + X86_INS_VFMSUBADDPS, + X86_INS_VFMSUBADD213PS, + X86_INS_VFMSUBADD231PS, + X86_INS_VFMSUBPD, + X86_INS_VFMSUB213PD, + X86_INS_VFMSUB231PD, + X86_INS_VFMSUBPS, + X86_INS_VFMSUB213PS, + X86_INS_VFMSUB231PS, + X86_INS_VFMSUBSD, + X86_INS_VFMSUB213SD, + X86_INS_VFMSUB132SD, + X86_INS_VFMSUB231SD, + X86_INS_VFMSUBSS, + X86_INS_VFMSUB213SS, + X86_INS_VFMSUB132SS, + X86_INS_VFMSUB231SS, + X86_INS_VFNMADD132PD, + X86_INS_VFNMADD132PS, + X86_INS_VFNMADDPD, + X86_INS_VFNMADD213PD, + X86_INS_VFNMADD231PD, + X86_INS_VFNMADDPS, + X86_INS_VFNMADD213PS, + X86_INS_VFNMADD231PS, + X86_INS_VFNMADDSD, + X86_INS_VFNMADD213SD, + X86_INS_VFNMADD132SD, + X86_INS_VFNMADD231SD, + X86_INS_VFNMADDSS, + X86_INS_VFNMADD213SS, + X86_INS_VFNMADD132SS, + X86_INS_VFNMADD231SS, + X86_INS_VFNMSUB132PD, + X86_INS_VFNMSUB132PS, + X86_INS_VFNMSUBPD, + X86_INS_VFNMSUB213PD, + X86_INS_VFNMSUB231PD, + X86_INS_VFNMSUBPS, + X86_INS_VFNMSUB213PS, + X86_INS_VFNMSUB231PS, + X86_INS_VFNMSUBSD, + X86_INS_VFNMSUB213SD, + X86_INS_VFNMSUB132SD, + X86_INS_VFNMSUB231SD, + X86_INS_VFNMSUBSS, + X86_INS_VFNMSUB213SS, + X86_INS_VFNMSUB132SS, + X86_INS_VFNMSUB231SS, + X86_INS_VFRCZPD, + X86_INS_VFRCZPS, + X86_INS_VFRCZSD, + X86_INS_VFRCZSS, + X86_INS_VORPD, + X86_INS_VORPS, + X86_INS_VXORPD, + X86_INS_VXORPS, + X86_INS_VGATHERDPD, + X86_INS_VGATHERDPS, + X86_INS_VGATHERPF0DPD, + X86_INS_VGATHERPF0DPS, + X86_INS_VGATHERPF0QPD, + X86_INS_VGATHERPF0QPS, + X86_INS_VGATHERPF1DPD, + X86_INS_VGATHERPF1DPS, + X86_INS_VGATHERPF1QPD, + X86_INS_VGATHERPF1QPS, + X86_INS_VGATHERQPD, + X86_INS_VGATHERQPS, + X86_INS_VHADDPD, + X86_INS_VHADDPS, + X86_INS_VHSUBPD, + X86_INS_VHSUBPS, + X86_INS_VINSERTF128, + X86_INS_VINSERTF32X4, + X86_INS_VINSERTF32X8, + X86_INS_VINSERTF64X2, + X86_INS_VINSERTF64X4, + X86_INS_VINSERTI128, + X86_INS_VINSERTI32X4, + X86_INS_VINSERTI32X8, + X86_INS_VINSERTI64X2, + X86_INS_VINSERTI64X4, + X86_INS_VINSERTPS, + X86_INS_VLDDQU, + X86_INS_VLDMXCSR, + X86_INS_VMASKMOVDQU, + X86_INS_VMASKMOVPD, + X86_INS_VMASKMOVPS, + X86_INS_VMAXPD, + X86_INS_VMAXPS, + X86_INS_VMAXSD, + X86_INS_VMAXSS, + X86_INS_VMCALL, + X86_INS_VMCLEAR, + X86_INS_VMFUNC, + X86_INS_VMINPD, + X86_INS_VMINPS, + X86_INS_VMINSD, + X86_INS_VMINSS, + X86_INS_VMLAUNCH, + X86_INS_VMLOAD, + X86_INS_VMMCALL, + X86_INS_VMOVQ, + X86_INS_VMOVDDUP, + X86_INS_VMOVD, + X86_INS_VMOVDQA32, + X86_INS_VMOVDQA64, + X86_INS_VMOVDQA, + X86_INS_VMOVDQU16, + X86_INS_VMOVDQU32, + X86_INS_VMOVDQU64, + X86_INS_VMOVDQU8, + X86_INS_VMOVDQU, + X86_INS_VMOVHLPS, + X86_INS_VMOVHPD, + X86_INS_VMOVHPS, + X86_INS_VMOVLHPS, + X86_INS_VMOVLPD, + X86_INS_VMOVLPS, + X86_INS_VMOVMSKPD, + X86_INS_VMOVMSKPS, + X86_INS_VMOVNTDQA, + X86_INS_VMOVNTDQ, + X86_INS_VMOVNTPD, + X86_INS_VMOVNTPS, + X86_INS_VMOVSD, + X86_INS_VMOVSHDUP, + X86_INS_VMOVSLDUP, + X86_INS_VMOVSS, + X86_INS_VMOVUPD, + X86_INS_VMOVUPS, + X86_INS_VMPSADBW, + X86_INS_VMPTRLD, + X86_INS_VMPTRST, + X86_INS_VMREAD, + X86_INS_VMRESUME, + X86_INS_VMRUN, + X86_INS_VMSAVE, + X86_INS_VMULPD, + X86_INS_VMULPS, + X86_INS_VMULSD, + X86_INS_VMULSS, + X86_INS_VMWRITE, + X86_INS_VMXOFF, + X86_INS_VMXON, + X86_INS_VPABSB, + X86_INS_VPABSD, + X86_INS_VPABSQ, + X86_INS_VPABSW, + X86_INS_VPACKSSDW, + X86_INS_VPACKSSWB, + X86_INS_VPACKUSDW, + X86_INS_VPACKUSWB, + X86_INS_VPADDB, + X86_INS_VPADDD, + X86_INS_VPADDQ, + X86_INS_VPADDSB, + X86_INS_VPADDSW, + X86_INS_VPADDUSB, + X86_INS_VPADDUSW, + X86_INS_VPADDW, + X86_INS_VPALIGNR, + X86_INS_VPANDD, + X86_INS_VPANDND, + X86_INS_VPANDNQ, + X86_INS_VPANDN, + X86_INS_VPANDQ, + X86_INS_VPAND, + X86_INS_VPAVGB, + X86_INS_VPAVGW, + X86_INS_VPBLENDD, + X86_INS_VPBLENDMB, + X86_INS_VPBLENDMD, + X86_INS_VPBLENDMQ, + X86_INS_VPBLENDMW, + X86_INS_VPBLENDVB, + X86_INS_VPBLENDW, + X86_INS_VPBROADCASTB, + X86_INS_VPBROADCASTD, + X86_INS_VPBROADCASTMB2Q, + X86_INS_VPBROADCASTMW2D, + X86_INS_VPBROADCASTQ, + X86_INS_VPBROADCASTW, + X86_INS_VPCLMULQDQ, + X86_INS_VPCMOV, + X86_INS_VPCMPB, + X86_INS_VPCMPD, + X86_INS_VPCMPEQB, + X86_INS_VPCMPEQD, + X86_INS_VPCMPEQQ, + X86_INS_VPCMPEQW, + X86_INS_VPCMPESTRI, + X86_INS_VPCMPESTRM, + X86_INS_VPCMPGTB, + X86_INS_VPCMPGTD, + X86_INS_VPCMPGTQ, + X86_INS_VPCMPGTW, + X86_INS_VPCMPISTRI, + X86_INS_VPCMPISTRM, + X86_INS_VPCMPQ, + X86_INS_VPCMPUB, + X86_INS_VPCMPUD, + X86_INS_VPCMPUQ, + X86_INS_VPCMPUW, + X86_INS_VPCMPW, + X86_INS_VPCOMB, + X86_INS_VPCOMD, + X86_INS_VPCOMPRESSD, + X86_INS_VPCOMPRESSQ, + X86_INS_VPCOMQ, + X86_INS_VPCOMUB, + X86_INS_VPCOMUD, + X86_INS_VPCOMUQ, + X86_INS_VPCOMUW, + X86_INS_VPCOMW, + X86_INS_VPCONFLICTD, + X86_INS_VPCONFLICTQ, + X86_INS_VPERM2F128, + X86_INS_VPERM2I128, + X86_INS_VPERMD, + X86_INS_VPERMI2D, + X86_INS_VPERMI2PD, + X86_INS_VPERMI2PS, + X86_INS_VPERMI2Q, + X86_INS_VPERMIL2PD, + X86_INS_VPERMIL2PS, + X86_INS_VPERMILPD, + X86_INS_VPERMILPS, + X86_INS_VPERMPD, + X86_INS_VPERMPS, + X86_INS_VPERMQ, + X86_INS_VPERMT2D, + X86_INS_VPERMT2PD, + X86_INS_VPERMT2PS, + X86_INS_VPERMT2Q, + X86_INS_VPEXPANDD, + X86_INS_VPEXPANDQ, + X86_INS_VPEXTRB, + X86_INS_VPEXTRD, + X86_INS_VPEXTRQ, + X86_INS_VPEXTRW, + X86_INS_VPGATHERDD, + X86_INS_VPGATHERDQ, + X86_INS_VPGATHERQD, + X86_INS_VPGATHERQQ, + X86_INS_VPHADDBD, + X86_INS_VPHADDBQ, + X86_INS_VPHADDBW, + X86_INS_VPHADDDQ, + X86_INS_VPHADDD, + X86_INS_VPHADDSW, + X86_INS_VPHADDUBD, + X86_INS_VPHADDUBQ, + X86_INS_VPHADDUBW, + X86_INS_VPHADDUDQ, + X86_INS_VPHADDUWD, + X86_INS_VPHADDUWQ, + X86_INS_VPHADDWD, + X86_INS_VPHADDWQ, + X86_INS_VPHADDW, + X86_INS_VPHMINPOSUW, + X86_INS_VPHSUBBW, + X86_INS_VPHSUBDQ, + X86_INS_VPHSUBD, + X86_INS_VPHSUBSW, + X86_INS_VPHSUBWD, + X86_INS_VPHSUBW, + X86_INS_VPINSRB, + X86_INS_VPINSRD, + X86_INS_VPINSRQ, + X86_INS_VPINSRW, + X86_INS_VPLZCNTD, + X86_INS_VPLZCNTQ, + X86_INS_VPMACSDD, + X86_INS_VPMACSDQH, + X86_INS_VPMACSDQL, + X86_INS_VPMACSSDD, + X86_INS_VPMACSSDQH, + X86_INS_VPMACSSDQL, + X86_INS_VPMACSSWD, + X86_INS_VPMACSSWW, + X86_INS_VPMACSWD, + X86_INS_VPMACSWW, + X86_INS_VPMADCSSWD, + X86_INS_VPMADCSWD, + X86_INS_VPMADDUBSW, + X86_INS_VPMADDWD, + X86_INS_VPMASKMOVD, + X86_INS_VPMASKMOVQ, + X86_INS_VPMAXSB, + X86_INS_VPMAXSD, + X86_INS_VPMAXSQ, + X86_INS_VPMAXSW, + X86_INS_VPMAXUB, + X86_INS_VPMAXUD, + X86_INS_VPMAXUQ, + X86_INS_VPMAXUW, + X86_INS_VPMINSB, + X86_INS_VPMINSD, + X86_INS_VPMINSQ, + X86_INS_VPMINSW, + X86_INS_VPMINUB, + X86_INS_VPMINUD, + X86_INS_VPMINUQ, + X86_INS_VPMINUW, + X86_INS_VPMOVDB, + X86_INS_VPMOVDW, + X86_INS_VPMOVM2B, + X86_INS_VPMOVM2D, + X86_INS_VPMOVM2Q, + X86_INS_VPMOVM2W, + X86_INS_VPMOVMSKB, + X86_INS_VPMOVQB, + X86_INS_VPMOVQD, + X86_INS_VPMOVQW, + X86_INS_VPMOVSDB, + X86_INS_VPMOVSDW, + X86_INS_VPMOVSQB, + X86_INS_VPMOVSQD, + X86_INS_VPMOVSQW, + X86_INS_VPMOVSXBD, + X86_INS_VPMOVSXBQ, + X86_INS_VPMOVSXBW, + X86_INS_VPMOVSXDQ, + X86_INS_VPMOVSXWD, + X86_INS_VPMOVSXWQ, + X86_INS_VPMOVUSDB, + X86_INS_VPMOVUSDW, + X86_INS_VPMOVUSQB, + X86_INS_VPMOVUSQD, + X86_INS_VPMOVUSQW, + X86_INS_VPMOVZXBD, + X86_INS_VPMOVZXBQ, + X86_INS_VPMOVZXBW, + X86_INS_VPMOVZXDQ, + X86_INS_VPMOVZXWD, + X86_INS_VPMOVZXWQ, + X86_INS_VPMULDQ, + X86_INS_VPMULHRSW, + X86_INS_VPMULHUW, + X86_INS_VPMULHW, + X86_INS_VPMULLD, + X86_INS_VPMULLQ, + X86_INS_VPMULLW, + X86_INS_VPMULUDQ, + X86_INS_VPORD, + X86_INS_VPORQ, + X86_INS_VPOR, + X86_INS_VPPERM, + X86_INS_VPROTB, + X86_INS_VPROTD, + X86_INS_VPROTQ, + X86_INS_VPROTW, + X86_INS_VPSADBW, + X86_INS_VPSCATTERDD, + X86_INS_VPSCATTERDQ, + X86_INS_VPSCATTERQD, + X86_INS_VPSCATTERQQ, + X86_INS_VPSHAB, + X86_INS_VPSHAD, + X86_INS_VPSHAQ, + X86_INS_VPSHAW, + X86_INS_VPSHLB, + X86_INS_VPSHLD, + X86_INS_VPSHLQ, + X86_INS_VPSHLW, + X86_INS_VPSHUFB, + X86_INS_VPSHUFD, + X86_INS_VPSHUFHW, + X86_INS_VPSHUFLW, + X86_INS_VPSIGNB, + X86_INS_VPSIGND, + X86_INS_VPSIGNW, + X86_INS_VPSLLDQ, + X86_INS_VPSLLD, + X86_INS_VPSLLQ, + X86_INS_VPSLLVD, + X86_INS_VPSLLVQ, + X86_INS_VPSLLW, + X86_INS_VPSRAD, + X86_INS_VPSRAQ, + X86_INS_VPSRAVD, + X86_INS_VPSRAVQ, + X86_INS_VPSRAW, + X86_INS_VPSRLDQ, + X86_INS_VPSRLD, + X86_INS_VPSRLQ, + X86_INS_VPSRLVD, + X86_INS_VPSRLVQ, + X86_INS_VPSRLW, + X86_INS_VPSUBB, + X86_INS_VPSUBD, + X86_INS_VPSUBQ, + X86_INS_VPSUBSB, + X86_INS_VPSUBSW, + X86_INS_VPSUBUSB, + X86_INS_VPSUBUSW, + X86_INS_VPSUBW, + X86_INS_VPTESTMD, + X86_INS_VPTESTMQ, + X86_INS_VPTESTNMD, + X86_INS_VPTESTNMQ, + X86_INS_VPTEST, + X86_INS_VPUNPCKHBW, + X86_INS_VPUNPCKHDQ, + X86_INS_VPUNPCKHQDQ, + X86_INS_VPUNPCKHWD, + X86_INS_VPUNPCKLBW, + X86_INS_VPUNPCKLDQ, + X86_INS_VPUNPCKLQDQ, + X86_INS_VPUNPCKLWD, + X86_INS_VPXORD, + X86_INS_VPXORQ, + X86_INS_VPXOR, + X86_INS_VRCP14PD, + X86_INS_VRCP14PS, + X86_INS_VRCP14SD, + X86_INS_VRCP14SS, + X86_INS_VRCP28PD, + X86_INS_VRCP28PS, + X86_INS_VRCP28SD, + X86_INS_VRCP28SS, + X86_INS_VRCPPS, + X86_INS_VRCPSS, + X86_INS_VRNDSCALEPD, + X86_INS_VRNDSCALEPS, + X86_INS_VRNDSCALESD, + X86_INS_VRNDSCALESS, + X86_INS_VROUNDPD, + X86_INS_VROUNDPS, + X86_INS_VROUNDSD, + X86_INS_VROUNDSS, + X86_INS_VRSQRT14PD, + X86_INS_VRSQRT14PS, + X86_INS_VRSQRT14SD, + X86_INS_VRSQRT14SS, + X86_INS_VRSQRT28PD, + X86_INS_VRSQRT28PS, + X86_INS_VRSQRT28SD, + X86_INS_VRSQRT28SS, + X86_INS_VRSQRTPS, + X86_INS_VRSQRTSS, + X86_INS_VSCATTERDPD, + X86_INS_VSCATTERDPS, + X86_INS_VSCATTERPF0DPD, + X86_INS_VSCATTERPF0DPS, + X86_INS_VSCATTERPF0QPD, + X86_INS_VSCATTERPF0QPS, + X86_INS_VSCATTERPF1DPD, + X86_INS_VSCATTERPF1DPS, + X86_INS_VSCATTERPF1QPD, + X86_INS_VSCATTERPF1QPS, + X86_INS_VSCATTERQPD, + X86_INS_VSCATTERQPS, + X86_INS_VSHUFPD, + X86_INS_VSHUFPS, + X86_INS_VSQRTPD, + X86_INS_VSQRTPS, + X86_INS_VSQRTSD, + X86_INS_VSQRTSS, + X86_INS_VSTMXCSR, + X86_INS_VSUBPD, + X86_INS_VSUBPS, + X86_INS_VSUBSD, + X86_INS_VSUBSS, + X86_INS_VTESTPD, + X86_INS_VTESTPS, + X86_INS_VUNPCKHPD, + X86_INS_VUNPCKHPS, + X86_INS_VUNPCKLPD, + X86_INS_VUNPCKLPS, + X86_INS_VZEROALL, + X86_INS_VZEROUPPER, + X86_INS_WAIT, + X86_INS_WBINVD, + X86_INS_WRFSBASE, + X86_INS_WRGSBASE, + X86_INS_WRMSR, + X86_INS_XABORT, + X86_INS_XACQUIRE, + X86_INS_XBEGIN, + X86_INS_XCHG, + X86_INS_XCRYPTCBC, + X86_INS_XCRYPTCFB, + X86_INS_XCRYPTCTR, + X86_INS_XCRYPTECB, + X86_INS_XCRYPTOFB, + X86_INS_XEND, + X86_INS_XGETBV, + X86_INS_XLATB, + X86_INS_XRELEASE, + X86_INS_XRSTOR, + X86_INS_XRSTOR64, + X86_INS_XRSTORS, + X86_INS_XRSTORS64, + X86_INS_XSAVE, + X86_INS_XSAVE64, + X86_INS_XSAVEC, + X86_INS_XSAVEC64, + X86_INS_XSAVEOPT, + X86_INS_XSAVEOPT64, + X86_INS_XSAVES, + X86_INS_XSAVES64, + X86_INS_XSETBV, + X86_INS_XSHA1, + X86_INS_XSHA256, + X86_INS_XSTORE, + X86_INS_XTEST, + X86_INS_FDISI8087_NOP, + X86_INS_FENI8087_NOP, + + // pseudo instructions + X86_INS_CMPSS, + X86_INS_CMPEQSS, + X86_INS_CMPLTSS, + X86_INS_CMPLESS, + X86_INS_CMPUNORDSS, + X86_INS_CMPNEQSS, + X86_INS_CMPNLTSS, + X86_INS_CMPNLESS, + X86_INS_CMPORDSS, + + X86_INS_CMPSD, + X86_INS_CMPEQSD, + X86_INS_CMPLTSD, + X86_INS_CMPLESD, + X86_INS_CMPUNORDSD, + X86_INS_CMPNEQSD, + X86_INS_CMPNLTSD, + X86_INS_CMPNLESD, + X86_INS_CMPORDSD, + + X86_INS_CMPPS, + X86_INS_CMPEQPS, + X86_INS_CMPLTPS, + X86_INS_CMPLEPS, + X86_INS_CMPUNORDPS, + X86_INS_CMPNEQPS, + X86_INS_CMPNLTPS, + X86_INS_CMPNLEPS, + X86_INS_CMPORDPS, + + X86_INS_CMPPD, + X86_INS_CMPEQPD, + X86_INS_CMPLTPD, + X86_INS_CMPLEPD, + X86_INS_CMPUNORDPD, + X86_INS_CMPNEQPD, + X86_INS_CMPNLTPD, + X86_INS_CMPNLEPD, + X86_INS_CMPORDPD, + + X86_INS_VCMPSS, + X86_INS_VCMPEQSS, + X86_INS_VCMPLTSS, + X86_INS_VCMPLESS, + X86_INS_VCMPUNORDSS, + X86_INS_VCMPNEQSS, + X86_INS_VCMPNLTSS, + X86_INS_VCMPNLESS, + X86_INS_VCMPORDSS, + X86_INS_VCMPEQ_UQSS, + X86_INS_VCMPNGESS, + X86_INS_VCMPNGTSS, + X86_INS_VCMPFALSESS, + X86_INS_VCMPNEQ_OQSS, + X86_INS_VCMPGESS, + X86_INS_VCMPGTSS, + X86_INS_VCMPTRUESS, + X86_INS_VCMPEQ_OSSS, + X86_INS_VCMPLT_OQSS, + X86_INS_VCMPLE_OQSS, + X86_INS_VCMPUNORD_SSS, + X86_INS_VCMPNEQ_USSS, + X86_INS_VCMPNLT_UQSS, + X86_INS_VCMPNLE_UQSS, + X86_INS_VCMPORD_SSS, + X86_INS_VCMPEQ_USSS, + X86_INS_VCMPNGE_UQSS, + X86_INS_VCMPNGT_UQSS, + X86_INS_VCMPFALSE_OSSS, + X86_INS_VCMPNEQ_OSSS, + X86_INS_VCMPGE_OQSS, + X86_INS_VCMPGT_OQSS, + X86_INS_VCMPTRUE_USSS, + + X86_INS_VCMPSD, + X86_INS_VCMPEQSD, + X86_INS_VCMPLTSD, + X86_INS_VCMPLESD, + X86_INS_VCMPUNORDSD, + X86_INS_VCMPNEQSD, + X86_INS_VCMPNLTSD, + X86_INS_VCMPNLESD, + X86_INS_VCMPORDSD, + X86_INS_VCMPEQ_UQSD, + X86_INS_VCMPNGESD, + X86_INS_VCMPNGTSD, + X86_INS_VCMPFALSESD, + X86_INS_VCMPNEQ_OQSD, + X86_INS_VCMPGESD, + X86_INS_VCMPGTSD, + X86_INS_VCMPTRUESD, + X86_INS_VCMPEQ_OSSD, + X86_INS_VCMPLT_OQSD, + X86_INS_VCMPLE_OQSD, + X86_INS_VCMPUNORD_SSD, + X86_INS_VCMPNEQ_USSD, + X86_INS_VCMPNLT_UQSD, + X86_INS_VCMPNLE_UQSD, + X86_INS_VCMPORD_SSD, + X86_INS_VCMPEQ_USSD, + X86_INS_VCMPNGE_UQSD, + X86_INS_VCMPNGT_UQSD, + X86_INS_VCMPFALSE_OSSD, + X86_INS_VCMPNEQ_OSSD, + X86_INS_VCMPGE_OQSD, + X86_INS_VCMPGT_OQSD, + X86_INS_VCMPTRUE_USSD, + + X86_INS_VCMPPS, + X86_INS_VCMPEQPS, + X86_INS_VCMPLTPS, + X86_INS_VCMPLEPS, + X86_INS_VCMPUNORDPS, + X86_INS_VCMPNEQPS, + X86_INS_VCMPNLTPS, + X86_INS_VCMPNLEPS, + X86_INS_VCMPORDPS, + X86_INS_VCMPEQ_UQPS, + X86_INS_VCMPNGEPS, + X86_INS_VCMPNGTPS, + X86_INS_VCMPFALSEPS, + X86_INS_VCMPNEQ_OQPS, + X86_INS_VCMPGEPS, + X86_INS_VCMPGTPS, + X86_INS_VCMPTRUEPS, + X86_INS_VCMPEQ_OSPS, + X86_INS_VCMPLT_OQPS, + X86_INS_VCMPLE_OQPS, + X86_INS_VCMPUNORD_SPS, + X86_INS_VCMPNEQ_USPS, + X86_INS_VCMPNLT_UQPS, + X86_INS_VCMPNLE_UQPS, + X86_INS_VCMPORD_SPS, + X86_INS_VCMPEQ_USPS, + X86_INS_VCMPNGE_UQPS, + X86_INS_VCMPNGT_UQPS, + X86_INS_VCMPFALSE_OSPS, + X86_INS_VCMPNEQ_OSPS, + X86_INS_VCMPGE_OQPS, + X86_INS_VCMPGT_OQPS, + X86_INS_VCMPTRUE_USPS, + + X86_INS_VCMPPD, + X86_INS_VCMPEQPD, + X86_INS_VCMPLTPD, + X86_INS_VCMPLEPD, + X86_INS_VCMPUNORDPD, + X86_INS_VCMPNEQPD, + X86_INS_VCMPNLTPD, + X86_INS_VCMPNLEPD, + X86_INS_VCMPORDPD, + X86_INS_VCMPEQ_UQPD, + X86_INS_VCMPNGEPD, + X86_INS_VCMPNGTPD, + X86_INS_VCMPFALSEPD, + X86_INS_VCMPNEQ_OQPD, + X86_INS_VCMPGEPD, + X86_INS_VCMPGTPD, + X86_INS_VCMPTRUEPD, + X86_INS_VCMPEQ_OSPD, + X86_INS_VCMPLT_OQPD, + X86_INS_VCMPLE_OQPD, + X86_INS_VCMPUNORD_SPD, + X86_INS_VCMPNEQ_USPD, + X86_INS_VCMPNLT_UQPD, + X86_INS_VCMPNLE_UQPD, + X86_INS_VCMPORD_SPD, + X86_INS_VCMPEQ_USPD, + X86_INS_VCMPNGE_UQPD, + X86_INS_VCMPNGT_UQPD, + X86_INS_VCMPFALSE_OSPD, + X86_INS_VCMPNEQ_OSPD, + X86_INS_VCMPGE_OQPD, + X86_INS_VCMPGT_OQPD, + X86_INS_VCMPTRUE_USPD, + + X86_INS_UD0, + X86_INS_ENDBR32, + X86_INS_ENDBR64, + + X86_INS_ENDING, // mark the end of the list of insn +} x86_insn; + +/// Group of X86 instructions +typedef enum x86_insn_group { + X86_GRP_INVALID = 0, ///< = CS_GRP_INVALID + + // Generic groups + // all jump instructions (conditional+direct+indirect jumps) + X86_GRP_JUMP, ///< = CS_GRP_JUMP + // all call instructions + X86_GRP_CALL, ///< = CS_GRP_CALL + // all return instructions + X86_GRP_RET, ///< = CS_GRP_RET + // all interrupt instructions (int+syscall) + X86_GRP_INT, ///< = CS_GRP_INT + // all interrupt return instructions + X86_GRP_IRET, ///< = CS_GRP_IRET + // all privileged instructions + X86_GRP_PRIVILEGE, ///< = CS_GRP_PRIVILEGE + // all relative branching instructions + X86_GRP_BRANCH_RELATIVE, ///< = CS_GRP_BRANCH_RELATIVE + + // Architecture-specific groups + X86_GRP_VM = 128, ///< all virtualization instructions (VT-x + AMD-V) + X86_GRP_3DNOW, + X86_GRP_AES, + X86_GRP_ADX, + X86_GRP_AVX, + X86_GRP_AVX2, + X86_GRP_AVX512, + X86_GRP_BMI, + X86_GRP_BMI2, + X86_GRP_CMOV, + X86_GRP_F16C, + X86_GRP_FMA, + X86_GRP_FMA4, + X86_GRP_FSGSBASE, + X86_GRP_HLE, + X86_GRP_MMX, + X86_GRP_MODE32, + X86_GRP_MODE64, + X86_GRP_RTM, + X86_GRP_SHA, + X86_GRP_SSE1, + X86_GRP_SSE2, + X86_GRP_SSE3, + X86_GRP_SSE41, + X86_GRP_SSE42, + X86_GRP_SSE4A, + X86_GRP_SSSE3, + X86_GRP_PCLMUL, + X86_GRP_XOP, + X86_GRP_CDI, + X86_GRP_ERI, + X86_GRP_TBM, + X86_GRP_16BITMODE, + X86_GRP_NOT64BITMODE, + X86_GRP_SGX, + X86_GRP_DQI, + X86_GRP_BWI, + X86_GRP_PFI, + X86_GRP_VLX, + X86_GRP_SMAP, + X86_GRP_NOVLX, + X86_GRP_FPU, + + X86_GRP_ENDING +} x86_insn_group; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/EDUReViver/include/capstone/xcore.h b/EDUReViver/include/capstone/xcore.h new file mode 100644 index 0000000..6db1f24 --- /dev/null +++ b/EDUReViver/include/capstone/xcore.h @@ -0,0 +1,235 @@ +#ifndef CAPSTONE_XCORE_H +#define CAPSTONE_XCORE_H + +/* Capstone Disassembly Engine */ +/* By Nguyen Anh Quynh , 2014-2015 */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "platform.h" + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +/// Operand type for instruction's operands +typedef enum xcore_op_type { + XCORE_OP_INVALID = 0, ///< = CS_OP_INVALID (Uninitialized). + XCORE_OP_REG, ///< = CS_OP_REG (Register operand). + XCORE_OP_IMM, ///< = CS_OP_IMM (Immediate operand). + XCORE_OP_MEM, ///< = CS_OP_MEM (Memory operand). +} xcore_op_type; + +/// XCore registers +typedef enum xcore_reg { + XCORE_REG_INVALID = 0, + + XCORE_REG_CP, + XCORE_REG_DP, + XCORE_REG_LR, + XCORE_REG_SP, + XCORE_REG_R0, + XCORE_REG_R1, + XCORE_REG_R2, + XCORE_REG_R3, + XCORE_REG_R4, + XCORE_REG_R5, + XCORE_REG_R6, + XCORE_REG_R7, + XCORE_REG_R8, + XCORE_REG_R9, + XCORE_REG_R10, + XCORE_REG_R11, + + // pseudo registers + XCORE_REG_PC, ///< pc + + // internal thread registers + // see The-XMOS-XS1-Architecture(X7879A).pdf + XCORE_REG_SCP, ///< save pc + XCORE_REG_SSR, //< save status + XCORE_REG_ET, //< exception type + XCORE_REG_ED, //< exception data + XCORE_REG_SED, //< save exception data + XCORE_REG_KEP, //< kernel entry pointer + XCORE_REG_KSP, //< kernel stack pointer + XCORE_REG_ID, //< thread ID + + XCORE_REG_ENDING, // <-- mark the end of the list of registers +} xcore_reg; + +/// Instruction's operand referring to memory +/// This is associated with XCORE_OP_MEM operand type above +typedef struct xcore_op_mem { + uint8_t base; ///< base register, can be safely interpreted as + ///< a value of type `xcore_reg`, but it is only + ///< one byte wide + uint8_t index; ///< index register, same conditions apply here + int32_t disp; ///< displacement/offset value + int direct; ///< +1: forward, -1: backward +} xcore_op_mem; + +/// Instruction operand +typedef struct cs_xcore_op { + xcore_op_type type; ///< operand type + union { + xcore_reg reg; ///< register value for REG operand + int32_t imm; ///< immediate value for IMM operand + xcore_op_mem mem; ///< base/disp value for MEM operand + }; +} cs_xcore_op; + +/// Instruction structure +typedef struct cs_xcore { + /// Number of operands of this instruction, + /// or 0 when instruction has no operand. + uint8_t op_count; + cs_xcore_op operands[8]; ///< operands for this instruction. +} cs_xcore; + +/// XCore instruction +typedef enum xcore_insn { + XCORE_INS_INVALID = 0, + + XCORE_INS_ADD, + XCORE_INS_ANDNOT, + XCORE_INS_AND, + XCORE_INS_ASHR, + XCORE_INS_BAU, + XCORE_INS_BITREV, + XCORE_INS_BLA, + XCORE_INS_BLAT, + XCORE_INS_BL, + XCORE_INS_BF, + XCORE_INS_BT, + XCORE_INS_BU, + XCORE_INS_BRU, + XCORE_INS_BYTEREV, + XCORE_INS_CHKCT, + XCORE_INS_CLRE, + XCORE_INS_CLRPT, + XCORE_INS_CLRSR, + XCORE_INS_CLZ, + XCORE_INS_CRC8, + XCORE_INS_CRC32, + XCORE_INS_DCALL, + XCORE_INS_DENTSP, + XCORE_INS_DGETREG, + XCORE_INS_DIVS, + XCORE_INS_DIVU, + XCORE_INS_DRESTSP, + XCORE_INS_DRET, + XCORE_INS_ECALLF, + XCORE_INS_ECALLT, + XCORE_INS_EDU, + XCORE_INS_EEF, + XCORE_INS_EET, + XCORE_INS_EEU, + XCORE_INS_ENDIN, + XCORE_INS_ENTSP, + XCORE_INS_EQ, + XCORE_INS_EXTDP, + XCORE_INS_EXTSP, + XCORE_INS_FREER, + XCORE_INS_FREET, + XCORE_INS_GETD, + XCORE_INS_GET, + XCORE_INS_GETN, + XCORE_INS_GETR, + XCORE_INS_GETSR, + XCORE_INS_GETST, + XCORE_INS_GETTS, + XCORE_INS_INCT, + XCORE_INS_INIT, + XCORE_INS_INPW, + XCORE_INS_INSHR, + XCORE_INS_INT, + XCORE_INS_IN, + XCORE_INS_KCALL, + XCORE_INS_KENTSP, + XCORE_INS_KRESTSP, + XCORE_INS_KRET, + XCORE_INS_LADD, + XCORE_INS_LD16S, + XCORE_INS_LD8U, + XCORE_INS_LDA16, + XCORE_INS_LDAP, + XCORE_INS_LDAW, + XCORE_INS_LDC, + XCORE_INS_LDW, + XCORE_INS_LDIVU, + XCORE_INS_LMUL, + XCORE_INS_LSS, + XCORE_INS_LSUB, + XCORE_INS_LSU, + XCORE_INS_MACCS, + XCORE_INS_MACCU, + XCORE_INS_MJOIN, + XCORE_INS_MKMSK, + XCORE_INS_MSYNC, + XCORE_INS_MUL, + XCORE_INS_NEG, + XCORE_INS_NOT, + XCORE_INS_OR, + XCORE_INS_OUTCT, + XCORE_INS_OUTPW, + XCORE_INS_OUTSHR, + XCORE_INS_OUTT, + XCORE_INS_OUT, + XCORE_INS_PEEK, + XCORE_INS_REMS, + XCORE_INS_REMU, + XCORE_INS_RETSP, + XCORE_INS_SETCLK, + XCORE_INS_SET, + XCORE_INS_SETC, + XCORE_INS_SETD, + XCORE_INS_SETEV, + XCORE_INS_SETN, + XCORE_INS_SETPSC, + XCORE_INS_SETPT, + XCORE_INS_SETRDY, + XCORE_INS_SETSR, + XCORE_INS_SETTW, + XCORE_INS_SETV, + XCORE_INS_SEXT, + XCORE_INS_SHL, + XCORE_INS_SHR, + XCORE_INS_SSYNC, + XCORE_INS_ST16, + XCORE_INS_ST8, + XCORE_INS_STW, + XCORE_INS_SUB, + XCORE_INS_SYNCR, + XCORE_INS_TESTCT, + XCORE_INS_TESTLCL, + XCORE_INS_TESTWCT, + XCORE_INS_TSETMR, + XCORE_INS_START, + XCORE_INS_WAITEF, + XCORE_INS_WAITET, + XCORE_INS_WAITEU, + XCORE_INS_XOR, + XCORE_INS_ZEXT, + + XCORE_INS_ENDING, // <-- mark the end of the list of instructions +} xcore_insn; + +/// Group of XCore instructions +typedef enum xcore_insn_group { + XCORE_GRP_INVALID = 0, ///< = CS_GRP_INVALID + + // Generic groups + // all jump instructions (conditional+direct+indirect jumps) + XCORE_GRP_JUMP, ///< = CS_GRP_JUMP + + XCORE_GRP_ENDING, // <-- mark the end of the list of groups +} xcore_insn_group; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/EDUReViver/include/platform.h b/EDUReViver/include/platform.h new file mode 100644 index 0000000..b0d1a2d --- /dev/null +++ b/EDUReViver/include/platform.h @@ -0,0 +1,110 @@ +/* Capstone Disassembly Engine */ +/* By Axel Souchet & Nguyen Anh Quynh, 2014 */ + +#ifndef CAPSTONE_PLATFORM_H +#define CAPSTONE_PLATFORM_H + +// handle C99 issue (for pre-2013 VisualStudio) +#if !defined(__CYGWIN__) && !defined(__MINGW32__) && !defined(__MINGW64__) && (defined (WIN32) || defined (WIN64) || defined (_WIN32) || defined (_WIN64)) +// MSVC + +// stdbool.h +#if (_MSC_VER < 1800) || defined(_KERNEL_MODE) +// this system does not have stdbool.h +#ifndef __cplusplus +typedef unsigned char bool; +#define false 0 +#define true 1 +#endif + +#else +// VisualStudio 2013+ -> C99 is supported +#include +#endif + +#else +// not MSVC -> C99 is supported +#include +#endif + + +// handle C99 issue (for pre-2013 VisualStudio) +#if defined(CAPSTONE_HAS_OSXKERNEL) || (defined(_MSC_VER) && (_MSC_VER <= 1700 || defined(_KERNEL_MODE))) +// this system does not have inttypes.h + +#if defined(_MSC_VER) && (_MSC_VER < 1600 || defined(_KERNEL_MODE)) +// this system does not have stdint.h +typedef signed char int8_t; +typedef signed short int16_t; +typedef signed int int32_t; +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef signed long long int64_t; +typedef unsigned long long uint64_t; + +#define INT8_MIN (-127i8 - 1) +#define INT16_MIN (-32767i16 - 1) +#define INT32_MIN (-2147483647i32 - 1) +#define INT64_MIN (-9223372036854775807i64 - 1) +#define INT8_MAX 127i8 +#define INT16_MAX 32767i16 +#define INT32_MAX 2147483647i32 +#define INT64_MAX 9223372036854775807i64 +#define UINT8_MAX 0xffui8 +#define UINT16_MAX 0xffffui16 +#define UINT32_MAX 0xffffffffui32 +#define UINT64_MAX 0xffffffffffffffffui64 +#endif + +#define __PRI_8_LENGTH_MODIFIER__ "hh" +#define __PRI_64_LENGTH_MODIFIER__ "ll" + +#define PRId8 __PRI_8_LENGTH_MODIFIER__ "d" +#define PRIi8 __PRI_8_LENGTH_MODIFIER__ "i" +#define PRIo8 __PRI_8_LENGTH_MODIFIER__ "o" +#define PRIu8 __PRI_8_LENGTH_MODIFIER__ "u" +#define PRIx8 __PRI_8_LENGTH_MODIFIER__ "x" +#define PRIX8 __PRI_8_LENGTH_MODIFIER__ "X" + +#define PRId16 "hd" +#define PRIi16 "hi" +#define PRIo16 "ho" +#define PRIu16 "hu" +#define PRIx16 "hx" +#define PRIX16 "hX" + +#if defined(_MSC_VER) && _MSC_VER <= 1700 +#define PRId32 "ld" +#define PRIi32 "li" +#define PRIo32 "lo" +#define PRIu32 "lu" +#define PRIx32 "lx" +#define PRIX32 "lX" +#else // OSX +#define PRId32 "d" +#define PRIi32 "i" +#define PRIo32 "o" +#define PRIu32 "u" +#define PRIx32 "x" +#define PRIX32 "X" +#endif + +#if defined(_MSC_VER) && _MSC_VER <= 1700 +// redefine functions from inttypes.h used in cstool +#define strtoull _strtoui64 +#endif + +#define PRId64 __PRI_64_LENGTH_MODIFIER__ "d" +#define PRIi64 __PRI_64_LENGTH_MODIFIER__ "i" +#define PRIo64 __PRI_64_LENGTH_MODIFIER__ "o" +#define PRIu64 __PRI_64_LENGTH_MODIFIER__ "u" +#define PRIx64 __PRI_64_LENGTH_MODIFIER__ "x" +#define PRIX64 __PRI_64_LENGTH_MODIFIER__ "X" + +#else +// this system has inttypes.h by default +#include +#endif + +#endif diff --git a/EDUReViver/include/windowsce/intrin.h b/EDUReViver/include/windowsce/intrin.h new file mode 100644 index 0000000..e9cdc59 --- /dev/null +++ b/EDUReViver/include/windowsce/intrin.h @@ -0,0 +1,12 @@ + +#if defined(_MSC_VER) && defined(_WIN32_WCE) && (_WIN32_WCE < 0x800) && !defined(__INTRIN_H_) && !defined(_INTRIN) +#define _STDINT + +#ifdef _M_ARM +#include +#if (_WIN32_WCE >= 0x700) && defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) +#include +#endif +#endif // _M_ARM + +#endif diff --git a/EDUReViver/include/windowsce/stdint.h b/EDUReViver/include/windowsce/stdint.h new file mode 100644 index 0000000..014a163 --- /dev/null +++ b/EDUReViver/include/windowsce/stdint.h @@ -0,0 +1,133 @@ + +#if defined(_MSC_VER) && defined(_WIN32_WCE) && (_WIN32_WCE < 0x800) && !defined(_STDINT_H_) && !defined(_STDINT) +#define _STDINT + +typedef __int8 + int8_t, + int_least8_t; + +typedef __int16 + int16_t, + int_least16_t; + +typedef __int32 + int32_t, + int_least32_t, + int_fast8_t, + int_fast16_t, + int_fast32_t; + +typedef __int64 + int64_t, + intmax_t, + int_least64_t, + int_fast64_t; + +typedef unsigned __int8 + uint8_t, + uint_least8_t; + +typedef unsigned __int16 + uint16_t, + uint_least16_t; + +typedef unsigned __int32 + uint32_t, + uint_least32_t, + uint_fast8_t, + uint_fast16_t, + uint_fast32_t; + +typedef unsigned __int64 + uint64_t, + uintmax_t, + uint_least64_t, + uint_fast64_t; + +#ifndef _INTPTR_T_DEFINED +#define _INTPTR_T_DEFINED +typedef __int32 intptr_t; +#endif + +#ifndef _UINTPTR_T_DEFINED +#define _UINTPTR_T_DEFINED +typedef unsigned __int32 uintptr_t; +#endif + +#define INT8_MIN (-127i8 - 1) +#define INT16_MIN (-32767i16 - 1) +#define INT32_MIN (-2147483647i32 - 1) +#define INT64_MIN (-9223372036854775807i64 - 1) +#define INT8_MAX 127i8 +#define INT16_MAX 32767i16 +#define INT32_MAX 2147483647i32 +#define INT64_MAX 9223372036854775807i64 +#define UINT8_MAX 0xffui8 +#define UINT16_MAX 0xffffui16 +#define UINT32_MAX 0xffffffffui32 +#define UINT64_MAX 0xffffffffffffffffui64 + +#define INT_LEAST8_MIN INT8_MIN +#define INT_LEAST16_MIN INT16_MIN +#define INT_LEAST32_MIN INT32_MIN +#define INT_LEAST64_MIN INT64_MIN +#define INT_LEAST8_MAX INT8_MAX +#define INT_LEAST16_MAX INT16_MAX +#define INT_LEAST32_MAX INT32_MAX +#define INT_LEAST64_MAX INT64_MAX +#define UINT_LEAST8_MAX UINT8_MAX +#define UINT_LEAST16_MAX UINT16_MAX +#define UINT_LEAST32_MAX UINT32_MAX +#define UINT_LEAST64_MAX UINT64_MAX + +#define INT_FAST8_MIN INT8_MIN +#define INT_FAST16_MIN INT32_MIN +#define INT_FAST32_MIN INT32_MIN +#define INT_FAST64_MIN INT64_MIN +#define INT_FAST8_MAX INT8_MAX +#define INT_FAST16_MAX INT32_MAX +#define INT_FAST32_MAX INT32_MAX +#define INT_FAST64_MAX INT64_MAX +#define UINT_FAST8_MAX UINT8_MAX +#define UINT_FAST16_MAX UINT32_MAX +#define UINT_FAST32_MAX UINT32_MAX +#define UINT_FAST64_MAX UINT64_MAX + +#define INTPTR_MIN INT32_MIN +#define INTPTR_MAX INT32_MAX +#define UINTPTR_MAX UINT32_MAX + +#define INTMAX_MIN INT64_MIN +#define INTMAX_MAX INT64_MAX +#define UINTMAX_MAX UINT64_MAX + +#define PTRDIFF_MIN INTPTR_MIN +#define PTRDIFF_MAX INTPTR_MAX + +#ifndef SIZE_MAX +#define SIZE_MAX UINTPTR_MAX +#endif + +#define SIG_ATOMIC_MIN INT32_MIN +#define SIG_ATOMIC_MAX INT32_MAX + +#define WCHAR_MIN 0x0000 +#define WCHAR_MAX 0xffff + +#define WINT_MIN 0x0000 +#define WINT_MAX 0xffff + +#define INT8_C(x) (x) +#define INT16_C(x) (x) +#define INT32_C(x) (x) +#define INT64_C(x) (x ## LL) + +#define UINT8_C(x) (x) +#define UINT16_C(x) (x) +#define UINT32_C(x) (x ## U) +#define UINT64_C(x) (x ## ULL) + +#define INTMAX_C(x) INT64_C(x) +#define UINTMAX_C(x) UINT64_C(x) + +#endif diff --git a/EDUReViver/lib/capstone.lib b/EDUReViver/lib/capstone.lib new file mode 100644 index 0000000000000000000000000000000000000000..daa4fcfe71c282d8003df7068d8d4a6e0617b050 GIT binary patch literal 2474554 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

_MEK{$-8s50G|V>4 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


T^&Q_%o6q0rp3h-8xn60qKC3`;Z1^7? zsQ61PKH$-$gObm+)On?ex(6r~(yLpqP>Ka5{112qmgP_07a@N@hDdIQ{4Qkt8<%0o zue?pxUpTZJ6*BrkJpZ1^2&ZE?%S=~>?p&tDVIUln+-@aNW-#rs|2{YwIG zr+EK@fX@rKox_mlIGvDf0zNC?GXicE@M*3~)+f0xSvPZCvOLP)TOSd09~ST-LH|L4 z|A2t^3%EhR`vkmK&|fR)uMzZD^7ocI1l`+3xn<(_ZT!9U76F$Cc(Z^D1)R^Jv6%(sG zigwF0{M22(4rBw1b$ZzzUfsBmuR&GZWpiSk)Mc|#6w=E|tgG<4G?8*GUPt!@*Ven~ zh=3Bbi0=we9n|DocI<`q9~Uc+O7H9XN}4QL$d z!e0{drq?7J$lem``$33w11kPUtY7&F-uk6i%J8=PMABF3AnO-i>5{gF4qvsm<_g_9 zkJjFwK&ZXEqovKKdrhoAf`KxutEh6ikD5R0&&=)UBuX1{%qx}nrXr}C+YLoJ$6Byg z^KNOb)H#oKDVRMjq@)s~-P0=s_RmqxoWIr1p(TdHkmzcr*CA2jccg&lRx@8^J-eFu zD(hL*d}`F6zqj@i<<1blPvg*X3WstZ0eg%0y*Lc%DPXvG-h)F+cMj!H4vDo|4Nj^} z+&6Yzm$n+hFhWj1l7aCik-O2dIsr44l|!m|tfKCvpiU*MnmT*E)Tx?4^0sOd6#_!v zYCpxNy>KcDBe71?&)SFpoo-wqsZt_*8Y)^mM8G5gT|xqJsszqAlfWP*0lw6!?o)`Z zHW$HQJP#b?@&%BA-|hv3*dSb2$D%8pY`7bha|Dyw0%i(kF9x$bHoM4-+2Ll)rUqel zq&c%0)mnTfOcjgona(0WE6{(z2=MEt_V> zB-G&s!N(i{XA6F2sQg@K#?LhY{9F};pPA+q-tNW$#11f$U|6EuU?!}41Nv=U5J^33E~$-XO(ybV5Fp)<;y-8~rBnh3 z?IY$A<>QkEh!`7hhz7r=Hu#mU8@$`B!7l|gcxR9Xzi!rGrlE}ImuL-N zr#@`fnuBJo`7B6lzM>oi#6d?`WAsCZ^7EUh{};9XpUmn%YF7XELFzw7>kpV|$iLFZ zfr0@O)*7C$vIr=1NKU9s{l|={Kh2o>JqS~O)7k@sBGvF6rHc3Kpy3boW+63vw*U`7 za9&tGmosHON5Hc=w45bie*w?rQ0@mvP0bnN_h|y2$|14UD3Mgpnl4RCj~bJ>I1CR1 z)Vo`ac~sa3&rLd{H*36~K_zlTO;>?IUrH;m7n$6+El%VOv|J$IVA1e60ng`<#6kdE z8fj`nZ3i-{>L?_#yGCkkuhu;`!AAUMb)-@qP-2WRl8f ziy5CyW_(@|gwM&aL;N_AlI)N>YA|t3FE7()GGrW>XGd-M{6m!*u}t+JZq(_q@Zx5{ z_96in3b;Tt<0dqNPb=q|HRF1-X3P%KjCsPQtBS`|=T1@MN�c!%I%nJUOz%{W+U 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
  • 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

    &^aNH2I>BvoD{&`9sFoiQRd7sOa>hzp-n3 z_ZEA`@S*s;8;#+;Sd*g%L>V{vel7Mp?eAwp9((tRvOQyXG-Qn7!KA}H>oDiLt*id7 zy>(;QYU(Y{Ke2<2-wN4JQ=eWG@=dlz#2&V8F1ExxMA_D?TCXbV3N!CQ z@A>@W-**7-9`>EPjWh=rzD^Tyc8%LTwT^hk&b|HpSfkTdlyi!&)nea1R*rR3tjoq8 zwyqRq|Fdb`X??&op9q}Uk7I!EIO$ceZ7uSk7jlf`sViIbvu*MFH{0UOd?2F6ma`A? zUeDC4A)7I~R?o*Cx%rm}j2Sb3Gsche{8+4;Y~3Gw*y1jtk8BH^cZiI62F>9yz>KxXv4(ess7Ys9)cpH_qtiS-r{u~u6Pg-j>;_I-i9>%ty=kg;)(=6rL`SVQAPV5mBuh(|1) zV0bHJv3HFKdq;^fh8MNQp7S#)=IGogsye<0{?q4tY~ZMM^8E`w>cqWP&-rDc>zFQ% zb+yI$M+RGWi<)c=4Vg~z?cdDU8yEHt(=+FrH9n1vyVe-))Eo>|r(ei)g5gie9`(as zJ?FcHj4|;2VGOr7=#aN*an9EZ9JNm0Pxzh;eD!R8J7gTwx4N*kY_dhKlb>p9(U9pR z-}5GWkA=N@X6FnUW5cKO{cIOH>_eSk_&{>xjJ|tBg#CKXUl$J`M< z)YUm(F74I#Iq&}b{<}wOd_#U$5*NK@etws8cHo1Jb2*!+)`)L9WE>Cgf7{AFE(t!i z?i69G)@MY>*w*k^V=vn}J^0uHJGOG3;ZKWmvakF&)||IL2Ok^*Mc_MHM6MY;cNgWn z{Vvwf?prV~ckzwrYL&{gG{P-!ZDK2ZE0+&MCHXo{4i> zoRg9AV|+Pp=La8rSBaYPHY{YEx52R{)@uE`en4TCzmuB@BR$^M^7PO0hT znm5&f^Up9ga>)S0U7{wPJwKD^48sl~i#^Uh_HzA*<2Ry=;g_*S=MGWTnNhrHQS(&- zN3GNH!3Q7bmvelgh*%gr7mvB~x^S$ktp$RQt!G5UT5a)8wB7D%&RxmC9(e{EeU-7% zD-2`%DE85LS_Fow^H#`Ur#lRsf8?;o9Seq&MHvIU2)XIHohZu*LbeE%MN0%Vz|+?(%&|vPT}VSL@e5WQ^^fNr&&?CY?Wp zOeYw2P4*rQd%1qt*fwO0VXLI`M1#)E;&K1eujtPmPkI*~zeT*q89~N-`8`_mw@}ja z{fi#@tHsk8zZkOg!yF=>_@uY}yhC%a4isU-y1f5cBl|BA-^HhhjFTtlpC?qY%oBXu z>jcYq=`>*hH$K4fv8V|P7@g0WGuG^Ng$2Iz;V0jTSRU^z{cV?QBey2^EvzdNPV9y8(G)TtC*>=`WgIG+30etfh6@DGJL%n~dDY|0x5dKy*H|77n>jw$ z=;Dwwmh+R|ga$p!(KntC4jpj1e{BE6*dx!xR`U$MZEORQ%}+HaUuTGFp8pnd#>w}$ zb8>;^U>PQ|9`7i=NpozwXpK%&Y}>{jF*x5D2Y*Z1B4qI4+|XNHovojQJT^zhJlk|$ z*N#2MwpP-+y+IHEs|26f^6C%k$;93UPt?D@AdF~H+{+j~v%VT*m^8F+S(+3);Ir_Q^>nwYVhNdphQ}XAJ%ZFoxktXL8ZOZ*TU>LCF{2tzfA5 z`h|?~?VEIt)0{JH9q_fS6X%~A&@0b~nlNk~GRE+mSfleo=wQdAEr#`_X$;)Y%pH^K z#QBGB419lEhcg4;80eLiVxOFJ(kqLHJTaXW^NL}?;2Q()e`9z~^NfL9^k%Q{9++7K zKF$;OMaB27c*qzZcd&I{(md;sm$r4{KC?Z}Mz-fV@%NXE;hv=PM$sWhZ82Pz?9qEo z7%mMN=i#EH^Lo*tSI&<8PJ88)WRKo!!fxep4>bov z?Uh|a#`tzhI{h@K&#XgU+SX~)WRKo$!mvTe7{j_rXQ1X81HJOy*auH1XL`ku$Id6B zCJal4j4>>lbOvaiF(A{MXPR^3^E5_t`e+9c!{>=u^LhGM>zPF0x>uBSdQvCOvF+Vb z>>0y^ka3Q9S6S!bq67A}y@FrcySdmih8sf082BEw4uAX0dEh*ajQvh~<*a0HT(M^i zr-h6$oRoC9_c8|R)0@5W&*aO$Icl%){ZCGe?+;05h~^nzPkLpmWbgE1&pFyGWQ<{x zq(hD~hMx4wn#msZ$o7okTOnf%%O{;Piw?cAMC^CkEAuCNybGEzd?{p%fxm~iUxyW) z>9y|7`~Pj(n^8m$?l0p0*hZA^6}|_MF}~+xjm{yWtkaWTxi8r}sMvFzZVMS>xGCuz zQFOq5ee8Eyr%RH(1B*Rl7!fkYFg)q_o$cJspuOI#6M1o+j?x?qyNGg~`e~Kxv~R4b z(+Q%i(~~;k&lvbUk?lE0eE(+*zezguf7Su}&tt#SI<24V9b4=f!&)JOuQ^0~{~Pzo znr95~d$Ue`lCRq}pHt+XFh2g?kaP59#&A#4;k!5IVJ59N5cSq~@8!uCXX}e1$Ll)r z`!eI>{5!Axiw=3=-Ugp@daCBg^WJdI$TPB>AKN-i^X#8|!^^(G*p)4?*w&$%XIs2) zmK1fBw~U!S+*8z*AI`u14AFdg5j+p_$3F36Ys*+S#s7=gqd$g=vaMOQURBf;<^|H8 z^9ly%ma~=X!1*_BzC~sh8MkY_V#v65%O;(En&+J2Yq28#jaWCuI$!J&>s6xce>SZ< ztq*q@vDNxG2KvfzUZ;6JKVbeqM4lbvJF(7~ZR^$81M>}`Lwy#^@Xom=y4bCa}3j`CivIX#^BYW^l_pPCUf=L%WqDG_{dpD3c2 zhKp>ACwV}|HNQ9J)fRcSts$B>*}5@guv;L76Gls)L#`)o%H3slD=}e27?;JR4owiN*t_pl->zQNPB4ixX zX0fieHV!^D8Z9E$YHQt)=_KFWv(6oN2KGjXGB)m6WQ=Xun1kVFQIpQ1A=3#4{?2L) z{06|@Iiie#Z;_0Fd%`+5XG6d&pSlcd-V;ND(?0h_cQ$T6c

    z!|X4C7Pjgk;ppJYu;PuWLeo_)N`^#;^!KDBlyH~wP+Sm zt@qbL#_@1An|#b3d~A&pVXM}MSQ)l8W%d8X`;lbG54QOB!B)=m3|dc%bMmPCfTQ;I z{lNzxHEqhd7n4g8XbIW-6m?Xb!Et)-`zQJ&asDHQyqqdJ!2ajYjn8FnsoU7 z$A2dn4hcEzT_M6=t{*lyKRk`$pRq<~yr}BTDBiTF`IdpB)_n8egOC26RdizT=wo8p zD4vdKgIHHvKMX#$_W9_IyY{2Lj%#Kj`$)b#b^UvBCj13+70}NS*cfho$`2_iyPE_l}`G*fa?!~4$-4im7 z>CRYJTbzH}x}XbNx<%{Q*B|x zww}^F+rmzF=X3p}KR|QN0p~trSu13mr!``Y@BKwp2ka|`OeYxT3R&!ZDB@W$aNda1 z7;@Yn7ahyY89Fs*IhWW0qjTuz1o3JvE$e#!B=ped+XX+~J3%w}5bp<`-mA5BuF%J) z$1<83&$F>t`()ve!9H3?eBJfX{gw@^IU zqyFTP@umn~?U5J7b6xp&T<*L}M94DUiaD_(XPo>tx85+#s~-AovE=vCwPBNYOT}`X zcp1x8u_k9@MPSK##L*TDF*!bL@(t0H7rs+6mgAD%9SwS%`L}YygVbSdX~%hcMKhHx_@l{x3PykVyk(E-!`@ll1<{o=B1)q^Y4Y6F@Go4 z_~e@ry~{+_;~bHL9NTiSZi;P**ux(EHH#?Ym_h5dv3*H8_{S#Ls!iv$o=N1bcW2Q9 z$8?G#V@*e=%9$CinoedHI+Ig(-Tijc*}@}iAmjlUXWec7!Y zveo~Z!6z0jPGY$-c#h>;v35h^+j+_PS}OS1I#&c{E-YjjtBE?T3pJ$PO@7!jpL*aA z-ps*g{kDi$t`44KK@V~)A8U?{nwR$yKl^wi`1m+aM2y#nu*q0mbhro|cs!9|fU(9u zWoL?9?n`7J6g6SHJMpn?Keq)RYzK?j($m|D5>Q z$6mq52mWgO_}DpQ>|^^_S07siA6w^(u$9jXKSnka^+qn&4m%aYnu(7eE?s(W)!>8e zP*GDZmkk-mxm2vHk3|wc`|yuQd>kff%4O||{KF^r1oyRjg(o(NgQwRQXpRq`*LcAk z@$VOm4RTOW!WjjHXk-ue`ipq7_Z1OuHpUAg60o_*`#AN0$JYi=C$55r&jp^rKdChV zT`$6?b;oGVMTzXwqAY_?WP9R|%O~5izca~rvtkX$+eC;*)m;f5?J|CsgkgK19L9-n8hOcjTw(%<(dE z9Pbqw$I+9%d8ycP&W}v~UMVtDDmCT58qu~+uNPbPw@>m%{c{fR=f2rBr+x&r|<9i!J-(J?q?zFEY*z z@8-7kzqi=3zjwsv>~T)-FEY9Q^eb}K>!kkN!F*VZ5#{~)t9dy6qGOzE1qOP1{~`lUpS6`k4y@?%WPp2F5wY54CuePhEy6#rZ&kz3y<{Q*?~;V)2dh!6Gvy15^H}hYXn8Ne^Em9eVa=5iwf#cbeNL-*#EXx!ERU(3@6$`k{Pr zZ?x&t_lk~VTtR%t_)(D|M&jyepT5>$ue(0w-JN4IPI$)2dnn7e7JOsODFSnwKIJz- zwbvcaH;RsNavy+!bISoqs~)&&c) zTZoW{tjiwy*z;b!Yo_(zIfn}ivDALrJNRHftH=-s_hY}fn$Fu>;)9R;Oe`|^>}mZuYfb(h65swFD>9Dpu8?s)JE{MZ#g=ui zN&Y4j8T`5a7l)knI`MhAbhwYlh;sc;3tQy$Dp8hkPLB;4^y=NvM?C6Wd&5|HkCVeT zSRLQ!uxnk;zw2>n%q`=3@coZWS9rFKecS9LcehI?=f%1khb?kPA7mNua26I4F~C!E zhi~{5>kHy>AKxf)ZtJ;PChZ{uCPvfmWuHNC9wH(?*v2n|HDo)S^_&;xiFG-hgp5DO!VzFiX+z0po|I0;YO2&GQ|Lq2QJUaeu9z=uh{& zZRUPvA3nJ8;eLKLcw_anP0qq*BKO0jBIAD8Fl5^Jd%xJS?rO>3hegKzmJbx23S^OU(;{J0j(ILOw1-3&jbH0z(I_o(855&hG zvb=k;40egDr#Lw?#M}nwn?=Vs$BS>Aoa<^AtUbla-*u|J?(#{mWF6xiF1~SoTx7ub z1rgte$dFsti#>R?hPm#%18RM`!+Ai_G0wk-KkCkVs@nCr-z((6iY`wExOxAB*)}^l z_d_Jl_un{?ZPKfoi=4M%nr9jOA-hq?SdXW%te5ukIdmLr#eN&Ce8*)R*5!R_tXCBo z@Q_Pm<4KOaCU4vctfBgya<_QMu$SZTcgla_J~>Rj=%Y60l)lP3&do&eXAu$e;YG%E z?CCjuMfU3ZwY&bGRCJ7!?|z+Jv~o+uTC#&gOjt8b&T_Q@u?*^>HjR_ zTJ#hr|87z3b=Rkym8@f&*NJbOd=qCGaB`k54Hbt9tc;t({{O&T=t;EN^{dIyB zjQLz!_s3z2e!IQMxZi#dGF{IKQuH=B#7BX)bM{=|x{HuVQj)^Utmi|-g;EHbV?F*ru|BzxWU z>7)jG-Sz3jqGOz^1P1!_`683+zf8zkuao*eCY|X;qeQv>Ukh9Kd|Z@eoEy%jb5rkz zm9^JZ?a{YhQ{V7^uf-kE_RQTXoqT@q(_PNF$Fq)e_lWplApYBm40ajZ8OB-r8!X;y zig9$>Z_`)LN-y_vCow)#bR6U0z(9=86&dV;pFB_ph#ug{05ji!-mCTJo#Og8#m~9& ze$CxtX%89jGP*l+H%TVf5}oeqKd$IFH(Q8L{N(25B7h4feXj$=^D1Y{vPsz(5W8n?;rZr_b^FA?Nx}$<7qq-;X`p?4+lj z4_{;Tv`xOjmknFsc~Jx&%h>0lA%kAiIo@1+^2t6m;K_j3)9~(qOMUob+do%{Xrl4B$Mq$bi$mF*@YHjjji{d4Cdz zZFbTd!zIsMJ5FSq^u}2t=k09GvyAh```>x1@7(^{b6-rWzTw{%>Y3`U9!C@%=WeHn zjd~naWE}riAw%BU^v&@N_PWD)T+uPkH3I`U`5R}A-+jaT-?gfJ!|(sLee+TH8mnjS zo3Di}@bLF&@L0yZN`D#4wCWAs9r@gWrMsMy&#dE|PY|E@Al_qH#=Y@S?6>WW(;Mt{ zhm&)dF&HO*|1-|PMFyPi4gUUzoa^X1(bL0Y&o(=`Q@DrnePLbBk@4^ypJnig?I9xk zg2g?;9=spNlf8Q1^htZUryL{ie|#HDCvjXMd3yC`k#oa(Ymwt1)-2=PZ5}e{HR0Jf z_S@j0hi4MqBFcEa6Sly_J1NV62U*TP`^?+sZjsP!gY^#S-_40f?UwHWzUnOcl|=X$?Qj1Nh# zV(BhM@||@Y;~xV9F+N;mretsGF>W9FUDfe7X}?X3oa2nQlR9!2WgW-3MqnVuTZ;^K z>Dj5(acS+lPEEbKaN2JZ<2};Lcsq&l?xN!u(Pd7I{06Re*_&F7Z)%@BbX7-w19`tq zjJHd#V(G3|IlEcMF;Y7)5F>YJmLY!lqeRA8@0_dBUQ->ptI6UB}lH|6XaoP5k7IZ!Buv>79E~(Q*7g72h?!q{t9|cX#gh zLcgm%{&w1L6XT@~Sh}n6$fDyI$-QH|tjG`}V`^uWTu-fz{I+0_gElb^mwekg4l6p2 z@k#L+^zoUZY8U)di;?%ZV`%Eto6>%p7|)ho#nN3J&nh~Ok$gGE5k&?*a#M@(*w3`P zzH<*v`)y)8S9)z@Jg4Y5#@`19>Uds}aqQcL4ER8_h8`x|*bCYAg4Oad((}b1pQT!0k@kIu#_?TK=IsfQ)h4uQ_ zYlHP;>ChiFubd}i?W=i?2dupNr-qfkYfcU8(XrnKD}OJ@IIIgkW5sTk0W0gNVcj$I zyUOd%v2TB!^lQKHTl2bE*rEpp6dAD2EZR`y-1)4q$5N{5ovW zJH(P@9OKVIrl}r3PJ2yQ*N*)*SobeDth;>J0_y=q##pCzCi{ebS9$$v?Au=_y)&rb zur3(gI|mk-8Q7a)x+DMnAN8I^3=|nCabfXx!8wj4d%N=209qLncRus=Vw`yK> zh-b-=!H(kt12N4KPv>Gmt+9tMWRU^u=^||3Co&$MbBT~ge;yGZ{j4G9jHmk!Tc?Pc zY<(&|!&p9yH9FUd(79h^|L}JeVILm3!LMVhxq3eK(Bp?T_8t(~o^4>y7VUcGa2FUGFY~I?)MFvOBzuoF*aHK1Bf}V$j5YmmnW$nQ*KIJM@4P-0_8!tR z*MfT`V<1lJ+@KjYvd+v}x54nXt^Uh@- zdy_=i%ikgF4H5AqPw1Q)Yjh@xnsoR8M+fRIrUOF`d(VoRV(J?**y}E)eL@y{uZf!Q z{XS$I)6Plf)h={?n{@c#BPm64e_fVVn%2txcF7|kzVDA}`?eW}9WDM+Y z5^Hp*1-xfP)|plFl|@;HcMWUD1I|xGV5KLFfp-}8z9YgOxn-X*o2cfN?{VwCqB*(~ zM8-l7R~>L$=Q+)@4!&5^SC%;=c*xo=Sn~NmC&$PfS=;dQc=3>(82h|C^#lB<|K|s| zouEWB@C4ZWqUB>vBH1GtF0rLV$iW93gZUyN^LZK+I;_z@Sp+C93;X5?4;d$A&RAF9 zIq>W|C;FtY_q?9ij=+!pEN~oo#6GyG4WCe!zg2T;^RmdfLGCe;YvX*ock*?Ny<0@K zca7%6`ijW*cyb9K!yNk%gD17e7jx`gDngccIrEmeAo#?2tq4D_itGn|wKYV%CR-;5 zAD!z()fN|0j+6eNj*j!X(0NTy`v+^jQ;_W^YV!a0#CPmq-zWIsI!gpD>Te%lsy=oW zugS-@iJyJ^CiwU`PgH%-*VV_yp;K$}qr}fX)($>C_$g9-@S@1I0zZE$Xo_R`;A3lq zsMd;eUu`WMIu$Q<#0R!`2~}IOiC1lL=9_SlC)+x^!4`I?8#44T&yPjC%kY1W2>-8% zTwnMr#Ts5cdl?&NWwHo+HO^;)kG%&(obfkA_QUg05xUI52QjE4F}t4l886Cy=ymty zEwP6$?hRskQ0qPw;V8vOQ$T)sVz@Jn%XH$m8Qd5&3aE z^mo%fAh1CUj!c?7m6z0rn`spZ(G^N+KHcitQmZKQ0MBS>F!xR*~&haO8o3&k>KOw z0#WtB-BWYLIcti8FJ|+z55Ab;K{lw2c-V8oIMvAHr?yBlz zV(3&K{QR}=?BkK( zU5t%`6F+}<4h%m2&llmFJK8>Y{zHUK;^EByCDz#oa(_ttIW$KeU%yX${BUOairC*l zgl+hTi}1gxh=I*TMBr!ccpQ7J&CeubTjMk*&o7G5wLQ*%j%A%#yEniMHV7W)-!{i< z{w2{SB9At;;rwGO=Z)Bi(fnK+elgoO_X4@8zX_;6GUSrlaQ%_B<`!xr5)@iyUE=oGw7x;NkWIx;yy#KKaPV#?7tif=f2tV(OtV6%u z8f$peoxCvUA^Mu9?V-;a8T_LI%_1@%S^DC25qtP%kLR-@^ga-=XS?*5^|M{ICOGvYBga-5d+w9LTuWEYpeob3?bUo(${$RCDKn z_h!ula=m?DPLR#szAv8+o4t8oo++D6_Y}S1obhf#Cif2SIdE_XxOb*xeM;}-KIS~U z7P8p&dx9RD9DI7<5)rlGY~(>M@k5=k^?0nStp|gTt&yT?3wa2<(0}@!d8B-hx88hb z9u+owvj;e9bBgv8F??=VlOys;?UCs(%ENb^b&#R1B<`TQaaA(zko+ghVv&;Hip z8OJ*zlY0?gy@}%q*`s$Vj_-bK88QEbo(yEFoe|%^-6l9kE7!l&IP#CgjO2Iy{?d!}l@2=N;Q2nqzAV5d*!8 zMYaX5u55i(duN6$xcbKY*LvEPd)slG6f(%467wxTlb-TE9IUzV&#rm)y-vu%!?(wD znh^(2_ITgX0}OZz#?u(`UG4bL%kO*Yi#!;>iXEQMh|n1*V%X;PnmebTXpWElMIP9% zchKhISqE9_kaf@{PJG)>#@N+wtD_~4U4G9qthk#BGEFi4a~?Vp>q z>$u+1y!IURtU6aGoyRq&J~{Eo#evw^lsi;VD=*Tz;h1Z;V19C zt2OxnUmwu|B6RTQK0uxvnLkVHvqsl^de%O3U9pV~i6`cO*+u*&%-bbC`}pFyWjygSSj0Pn``P1D&6@mdEPj)p zA0>YFvv%;E|LW&(?GyKEAxE6(bGI>Strr$=Sy2;)C4%pmat~rF_aAoV@50VJ$<7eX zvz;$!UG2==g&k@NPVfvB*$y#LSMtl?oY*Hii-^`0HO2V7#Aly8^%e0Q<{aXW??L<> zBl7rP&B!%+_*qo6Ost73pYz3nk1fs?wvH8f{8Kaf8(YLkZc&y%R+q3u(5r2$}yR z=Ap8WZ|+V8zQ9aB;@g-)SRRMz39sUi<@^{NP6bg+dD2KpO{Tt|8@@9h>c=+P5At+$0{=))r( z4|w_f;qNYyv6D0R$1TAJ`xPSmpC-zq+PX%&wnb0lAG$2~*t$f7tc342(58BSjTII{ye6 z>-;6w=ny|TLq#6w+#muk^IF4w(_XD1ePcb>47>2?S)Rs`bH&+!@BT&(d{>J&3ulNJ z)+GkZ+@m@DYZ=E;dtlelp{A}Q@$C?N{M|0XR_%e`gbec5bzIA&J=ffO6@&W)3^`_e zI-V;vC+1-y5By>~=MTKrxlMCy3>Pt+r)4#_%w3uzQ|&GqGS>Ne(zzpaaz4P~IIPo2 zEjg>ib*3m|%yHbQ9WYu3U;ZtP4*9%A#QUX<@2ez_@3TbNH~o(-FpL-B+cHxm|KI;~ zK|Kp??lay8_@eec8`S2Q;DceDi1XOpeRe?T)L!lvd~A&p)%yT>&JH-pZSCc$)z!U? z9`@Z=+!gp4EXujvN-O7ftmeoJ`AlMp9CkJnA>&$Z5^L;_7FGP{tRFJg`C+Wlxlx49 zP>}~QUnl}E`n86=ai1+IyPcc??)C2Ovk8)+56=+gQSXvY?z2b3RzAPvqc`p|Vs^h^ zv#a}zGuHM#dqg_qV7Q3kTIc)h3GtB`_L;;KIqJKph+13c>#?Rk9uuLH^MQ`zK&R7M zUMkt{?z6`wgFoMA#&o=R1OF?Ckg?7;V~x%&qKY4#MMB0pePWFc?`3q(5qZGp4#E%m^*(A- z!(U6EJdwv-L+(}h`1(LZADtn}qt>0KOjtA6svVu$9jbzE=~Wi@bI51+OPH zd_#Kp87^Wtw+m_RxZcqmnPDOi{Ldpo#yZGY=Pk`Eest)itV68Uc{_CK8D>pC5`R9! zgM*KacSZQiXBdC$ig-fw2R0b2ZxG>|dF_qfcvpR0cJn!Mztayn?(4Pg?p^hQWQec3 z-r7|%#6+C#58~S)`1pNBRBMBLZ@jCB*?ox395X&$>uWV{`>uLgI@lO4Vz}?}yK18N z$kbk4R6KlJ2b{+8tmZWz-o7Vamk%(UApy)@QV%fK-plvo zD7Gnc6-1a_G2!TxZTNHKd;ICvy6W;8XusMYaB5T~0K;2;Xyy zu)*Mr>=IA*W)Si89qW;)56a=;0T6uzf57+lM0i;JKIx8Rp#K-b3H{ zhi89aBW}(wdd^Qizd1kn#uiV$h=J~cBKC~)A`(MuU7O}3jHVr+teem(~mJ+I)Hn`L{Osev;NyeZR3F@-eM6>`bFxp!*52MD`1pBR zL`^Odd0=}-5iwC8?$B*xU2XCEA31Ch7kz%A$b&t;iLeP_4`R^&ZSJb?OCEa_!y3T{ z139mG!|#eAgYQ0~Wn*1!EfIWd9V2S8)dn;AO_*m(es0mco(nL80bOH;*JSI%kVT%e zQ*Dv!Hkdg>*s8gCI{54%Q~iMN;gB)r`(s^g-4%RnO%hdG=(oXqb=a$ZE)70@I6Iut zd^dpkToL=md{(Thts%ijmcK#N-hkf*^Pyp{`Z*x@*yB#Ge!%>{A!E#ci*>d2$KYe@ zeNnYVKefTUb=a$ZeieNDye_JKz`RMw81qkJU2Uxwd~CfYsR zr--Vp8N}oJA3NCP2^llz-E5 zb{O>1GVyHcN4~9)L7q9kg;--VW573jo@a@2y{yZ-0zG5~gv`Zydf=bC85!%m9BXt2 zim+RC_7)G{-Qn*enNIM7E$0v{=-w(a{>hp*VafUG)E{v*`QuF4--`|Y$XieRaekZp z9hv;S-QW)_gF?nR=_H@%H2K>nY*E{HL^Yqp$G3BD)^`-?ghh-h~T@x;pPO#h$V3ptbSy{;u}G&+q??|Cg}_1HX}~ z4&P@BiMqnT`#;<3SZ8M6OzhSxSmk=?07Rd!zzwsG&%9+|< zbNpQrJmksU+#+PrSti!DHB0dE2bqs71P>bw@JI_Oce5+NRS;hNj$WRM% z@b_3#hc`q`I$fRnCJZ|zdz`H%d(@TKjNw;FhqH#xr6P~nG}}akj`h%G&>uMu^uoF# z=Z<{STO&mt++}NuY>Pas7Hj9B_B{TM7vT>*_Bl7k07mwZ`=)475pu|UCFZQTzj)&3 zWD$0LA!5Ls zoQqr!;(aD$vDIHhOanw7*my*g@jei1bjW+g3$Km;G0E2Hnm75sDr8*0%aYFJn&m-804t>=35RvdMAmpZ}hAD|B7dM z;?BPDQRV-T{CKS=T?YM$*= zo7H3AwOJ*}U#WSuzijN2TXc9f)rQ_*Smf9a)f`(}h#2V2Ct{yDxTa=nj*ulM{Y3Qf zuSK?%^Mr4(**A4VeoGNC>whZn*nj_z-0=d!C@_KfCL2i=N$a?;^2 zqQjx~0LKIob}0(`kH?x=*{eFpRX^jC&Mlz>k2n}Kf7KZyp5r-KbNtZM9yCMMxlBCk zJgs@vq0!C@8GPe+YW*`LWRW>Wggq`E4{THn$Qc8^st&qU=YXVhV}lNLs5*a3I^!C2 zn(DAy(&56Y*od?G**fWfv+6X}ZquamV1rIm?bb~?_c!Q(t72O%={yiRcj-x881+LB z?8}H;pF1?K@$i9C{ctH+=eE$fT2GJJG^;vXnAYLNTK&x4phNzxb9?AG9&)D3@3? z^>0pmY*>DD@Co>lnDe#ffgFb&U-o@ztkD@Hnp4DE+Jl$DxgvDX?=F_XAzNcPDe-eG z$0UA^g$o*=;No&)ex1kzECWTxdXWeA_7WlE+;Fg2=UA}4 zQ}DsIr|1Te2aUdf$ardBR9ruotZ{K6gKLz?gZ%$klyR*WYy2N1LT9wdgM;&35jw=> zys{6jzs8e2YQfWc>uA;$_8eF3gBsU@vg5c;jro|*yiDr0KlczX zc4X-x<7J-<+mJ|N5N9wMI5f9h`ihip5Ze7F87@u{)n;XGTO zyc^%|f=@gTh=}KAkq2_yh;oj%j5Rth#=PFGoPTuCcYhd5eNX%-WL-03TRZV{ENdoy zj%C&0gX?|~vD_l^z%FOOxTq&Q?sIT){;l(}=ID$Td2qLK{*fUk&MW)iKQ^B1QHz|n zb<&=FqDTH0NPD#pz>xDz-x=c>niIzukq17>zkTp6!uhw(2+hHkb+B=9$e=$p4D`mC zAxmzDiqIb`^1#NaB4b!y^Alr@&eJdB}i)9Q`!bU?9g$Ia)7d(4l8J|K!SNiG0y7YbL&P zNgg@>mdB6fS4e#K8_%VKkL-gYY}_i!gZB zO`PP>xDL>~DNf%1$k;zmMpK+)#J9cvnm5IHRmeEb%VJ&QyfE3?L-QQx{94o3&O7~? zaV?qlYOQCFJ^Sab1T+5OInKj_Po6&&(I+>GJm`V_Md+f(eY9V!t1aID&dZycV{4qq z1D|_~kYU~(=AA>f`q?)4U>+_4W5v8h$Qbixv97i@4nDSqiLjM1FQE0hB4c*$h>5za z6Hnr)^+DIQtFh*@vz+99Q zC1kO8h6sCOL>^!ue;ETkgB&_TV_q@58+`C^=YXFVnKlu1~ zRaAY@FV)B3(5bmPDe<$9V}g&5*F@C^>w`na^*A8b)knX?&p!She0;nvsy?vuhmfH* z^e3{6w(qa4r9+Ouuj(izQo=HE)WOyQb4P=Sub_hP@gmK60GI!MeuD`DYK>Rg~lG z&G#2L@qvGG?|O3n?VsASccaLI9(YiM412u4IR8zyz;0WkG)I1%$OE6)MuvI4PiGg8 z+M`E5@%O(bKbHibz2iiDKUB;kLdKYf$GXOUdhoGzhzMKbL>}}7KG+8{HG~*Th`7(d z%pSfx;1QqWSwZswBJ4oF6Wt~9K%e)&{d9NF?-jDdlkZ1*2pjP2o97O}XOA;b?-l$n zB0`qAb-~AcGm){`AA87d6nn%^-ROOEz%YvlKD9L_?CdV0zpb;T=J273qKXfGzQ0%0 zns+$-nuDbh-*NCHKIEa7Mb!s&%|3|5_iOb*pV)Wy!FjQdmo%?Fxa+HrPsAe+)yMmZ zpMAU;eEhs9sy>?DrxTMc*N@t9{_Q*acqI7vm?Ww`sBw*h^KV<($4!Z!eT)h|K6qbL zAFQtk8SGLI-v3QLc>kN9eVi41e7qp4K9&@(kBD4A_1x7v>1fH=4^MRPcWChO^N^ooIk2N;vk7|qc|7Gtzz@#X)_u<)LWp-JT2xetP>2;J*#Iyn8=bQsAD&jTg95LstV?@k3=Y%<3bG+)6?|o05>Zwk%yCduW_dU;LsIKZ$Z=F=9 zs;jGeW~01T(l+EppL4u2=QWAE+2#q&UqEg@#JRjUcPxRFWFz-6Ew3w3?uPU{lKtdR zit_3XS`sggL(A(Ll%u>@@A6`N|A9pNqW=0>X|(YbB+fssUW~UWFUETkuMd?@Ue_W~ z{}++$hw&EW#n?&WMIA^dua}Uhm&=Ruf0WlO(2{uFr*!g~i4?Vw{)_UuN!ySgeQo25 z{!)XWffr>&d9iOSFLyrTShTzz zRbH*lNB;$mAGUMj_*bP<{tZacIV3tCEeFh(+9t~DW2KW9uTji7X6+|wJ|ZqjFB`Mu zaXnHrCX(i(M^bok9PmS49AD&R`IDYBAKd~vKT#X6Q#yIQhBPmd%PVO<;@(dZuXB`6 zUbB$M%Z;z3`RI6U6V>Y&rIXh^NKsz2IT~LFX`3joeUwgKoHL^~k`Ko}Ka3^LN88I; z++SNOoxIpTQC&sTLnMBzUM#bItWZrqQvS<&&iVpUTj#aqfaU$aE5pv~ zl+O?K<+_1!#_OT|MCUc~^0e0KYk5&0%j+zZ7-udo*13JM63*vC;wQ?BvA_@YA`j;7 z*djj4i#|)@^*gB4kv!-_=Dhye5BtI8MH|0HVwv5FXmSfC*qU$XBi#W@Rdb3QP4{4b^E=QvOT)m?68hPE0l*H>srIXi{NKszV zd5!+MRNF-Tb-vQci@xW0aQiVjuaVbDNJ)B4S2}rJgVY_#&ZqQQbY3Gb?*Aq6+F$A9 z^&%4Wa(PAPHS*dCDT&u)rIXi#NaW?l7yTEFi3y-3@oG^zdEJE+mAUjXOtJm zIO*i^z21^`|67$yPqZ!&J zYU71UCy#59qH{=eKBA4MXqzane<_{3zC&W}`YUNZI$YaCc^#;9^5EKrG2!-O(tNaw zwu$oEPU+;u@kL(l9FjC2ZK7?Wyf#p}wJkcnlIEi|Qh2TI@OlVk@^bx^G#{;y!fRQF zS1ExPZH~s*;wiiqba>sXyj*{gPm~vZXk(S*g5#X$^pnjWM%ncjV+$|#o}Kz)?zf&hB|qCYR-X%; zI^wPTvy@I-jzVG|NBwr9Vys_|)AJ-bQ=K|j&S6TY93P2tTsueNoVFy{xv17zJ9ox8 zWxMkK)bq(sosDbq-O{1EdTp$98#mE7WZbN$7;FF94lnCxE1z~)-CX%Y9l9%j6{S-? zCw4cMvN&&#UzSu}Nq$+>sdM#W3|W0$y?QF0dVP(Qh`44soS?m zNxqq>80(w+^gKxpFPuqoZc;ksaBgsYK)bKfdY0K=l*JF{3D*bgC-UH@H&WCGXKJ0R zo1HgKa_U?kOjkPjo{dD^_<+ZLC}WDASs(C5gr6ii`#E*4oIR9IIcFeI&f!X{N8TPg zx6pP;^2a-MuKe|tPWcxjCD}PzG1krzdY&X_uv6#CSxM=Xa{-cTC+Euc*tvxAN|L{@ zQ|HR>t#rztfs|w?=R$t0os6rr{^S_5b*>zDBjOSuTsz6XJ$8NuJYzq}&e=|#E8lKJ z(9ZLblI(m@+gdxHb$HqN-j0vQoH|zy$3JzWoO6&|JGqeE6^T9~rnT{TgW{6xywa(2 z<$|12O;U_3=G3`z=rig@{-0>>%1P=w&P8eVP`0ge<#4Pp&M40S59}Fx2Nye|7kir;ncZ0%u+gKb8W!f^=Z<$ zEzG#UQ|vG(Av{?laybQ4x2f3t_~Y1owDCYV%}QcjnOtqa)vo|uAJ4B zPX6yAMdc**-2jIdea^Lyy$1Dn>RdT}l}`TeAu*5kU36~lrEQYzX>jUXIpoX!Xa0`n zRt~Ri*oZhMbt7T~0Z5!UtYMtgKSrVw3nSU!niu7Vkced+7rIoWE7HA4mfl&*Jm=uD zbXVz{luo5*BJs1c=A5L+|4JmbWjo5gOwXgTxnQ$0T-j$ibXWE%N~i3{kX+g1GXkkS zJ~<3{E8q3W0S?{OYcGfH>a~l~sn^3uu3n$wjCOB>L|N7+Tj_b!C!08QSM~-D-Icwr z(kc6KBv&@e?e)p3Xp`gc#(y8x5NcWm3=8_Rxek!dvSGTpQ(7t_K;lJl)tjpQxD6}`lPqk zkss%usd}EI*P%|GD}R5bQ+^)F_6HYoduW~I&+%_M&I4)M05P*GB7KYa_>hnvKgibuRyIO8 z{TG$wRG@*hFsXJ@1w5-zUi1{YU%5@3TV1R#-lr2$7L zv7UmG96v|tR(WEFApOUoy9#r%A(je1t@+`|`JpbZvnbn6L`kw|qn`ArY)&?o?#g~e z>6HBp5_206lpmGN4z+xuLI03b$4;|$-|Ns_*>@g&qpVuN(bd`@#~H+|loSU3uJDYF#lmRCvrSa?>Q0?2yV;?;vIi-hvOh#} z?IwRtHq6l5DQzNoR6pFXYf&+4Cu#GCx9M?%Lg+Sm69&Wk-F&@y}0GFOGjp zclF|(DnHccbItAeNQwpandK9e&GB#RT%U0KTe>ToV}c*b{z7xtC((IfmY|JoQP~{- z{6y{M__uUdHg7igq3ka;w|0}qRY?4>4P#-3oF&WV_~$1oo8#ZoUD>B7owC0|Vs7mw zkM_iZt8>&R9RF6n+aG&5bXTuklumu#Kw@tBC&j`<#Z%{~>`k0HS2oAL)yb93n+<*_ z^G(gIPe_l(!Z6VINs`U+Z|hvy9RHT?${wI}%4Q6^c9Z{7TF*9&g+@J3lFjjNWw^3A z{w>{=-A(C~`8E=BYd3N2iG|;RXFnzB#qn?JtX_jb zZelOhdbVLK&^MNU)NYP{Tj$C?#i6^h|D|;L{AwiEZqnKl3kNE%B%kc%)VX?b{9Aop zy|z<2bvP5r^$GFO{@7IUNwPWqtqfN-$G@e!vPUbOvguFPCrPoen!_jB9~}QyhAW%n z-_l*#y#A9;+1DYtcGI@Skyy_*jD>~uJjrg3e=Eb4O`ewS%FZdBvad&S?dFQqCVl+vvsasmpOD-FJAwNr(TyLMSXIH)?1&PqUT9I zInJqbWgq3xUD=$It!(P&`lJWW_t$zGC(QX_8^$bi(t0D=4{3dnm|LB<)pJ+pPeJ4P zmQJ13jXXD2I{or3Qa#cnB>Pz(C0E8edY&X>lvC%*C@P&YjzsE$WMxo?_Sm=#@YE+s z{*q3eD}OPiQ~q~Iv~e3G`-%E-Ueu(?pzgNLmBBLUlra^FILctmW3yq^-BFqKFZeHx zFuCePE{#>TXWOOP*_LgVZetr_{aJssf)>;pt@%MvAOF<`Ubq0Hdb5)DBH{Wp327}! zM+n9wCecO0Ur~Pu_1CEVLe0*Ja2DzsNmNWBfeu8uI!UYD+*U$4PL3~u!wbECqwbC=GwbBo%wc_>ETJdpet#~xGR{WP*E8a@0okD-UP0w=nFr_rC z-)!dyTykX0MRVz=z0y!pyBuY4-nVT@wPTp&?pn|C2&e47!r3SGR?KAJ0a|+FOl`exdsJ+!p@5JR1{hZzUT2 zLiOF;7XCdvTQk<)N;LX~>fd);_$8jL6>D!L8vR1`-Q5=c-8@@6*4|1q`i1IeyDj{? zc(zWgy_IP63)S~WFI4}5+rqztXJcdStwf_=sJ^G$!oQto z>&4nziAKLr{fBM~|2Cds$r;h#N;LX~>gRP^__y+`CDz_bH2Q_=KXP06xA1ISti6?J z^b6JZvEyF6{qNA(eB{PaFLk{`XMI9v^M}qB2%Rk$I$J1oc7r{0=P*hvU(ZGMzvTD= z(JQc4O7Uw+8O6CNye^PBxyGc_$rUE0POdL0b#iq{sgr9|BCvOKjb zeHuFZEOhpH=?vh0an}R=6=YK8&rZf|_7O6;NW_SQFF+oI=!~jim`ZF@S37$tX1;bDZG-whD}7nKDxNvR)0Y6lU#LK|W{W zFn5kshkJ#4ZnKN#SCG&7H_V;0k;A>hj)LALRgljaH_Uy5F!u`kCB8^D$KXm5+R@-B z4RhZx%)P>Hk1rngE6C@V40GQ|xo@HQWX-qLd^^pz*L(-fchr0*&HagthZ;@1mT}zp zvg0eB57pC$j22&ZkmL27;}~1M>`2G!=_Sq|zTCCO>p5p}Uhz@>E6I_$z-YB@9$-Pg&Pi78Y@BNd*t%Eh2+_eSk zKDoXHoMo=y^};_T+&X1^%Kc)%S?(DnDozcz4%SsA_HD2>lly~!vyAoOlzm#bb#i=% z_utG|9>&(Ehg%10pZh60SjB{P56xIzovqIZx283W#qe%uc<5?MEG^FmY)VK4@_vef6y`)Yx!Bw@_>YvLKB&tV=X@qS_=P& zwxWl$oF~@ui=d_06lp28OUv3=%P)hL`zC06Flo~AdzN%v6RZ&0vd-|2cUrb1B5t7};E zd}YmpRZ?5lS|QEb*IP2Pgf$m0@070jGLf z^I%n2=E}JwzDAVmrW@z&>n+)BD$8K0k(%$2uK9qWB9Apj_F))+|A5 zwokXFP}!OaYu;+t+#&ng*Uxf47`Cq;?b|NhzU3<0S7Fs%?W#Xy-`|ghXK7p5<|S$K zw&^x6U)kmg_X6e}0JAa!aYm1_e>!# zbVOu59gl_n^ujjjURa^B7dqhHF64!dh_$EUUhwFJN$Fm|OR$yJCKc`htGx#ed7&d> z?a8iG49T96!#J#|EsJXx9T0Fi^T`BH`PUI5o!OHz9R~t*sPMgRXyy;Ui{M`p=)Y$I|HA|RbN&MVl)K^ZK3G`xjDY_h3H*-;`2R)z+?^0x z?;*WScj8wD{C7{_KPBM*U-D16qYmvwMefzF3Ha}pz~2w}|4IJbjS&4GAiYg@^VbLb zcTM1bq~&k-hO*#049UEya1cwfPa#re-N@^`+~Hhh`SEOVBBzr=9Z8Y9DWOmUyEhf^ z7hb|&`a<~2x{Wa`{I5*sHUb#4uH&zV>ff@>0|xn73pm31&%|w}QD? zW=T7{cR{PIk^C8KUoMF?!ZX;blbyR@6)dw8`(Jz#dSccP;*`WQnE#|F+oCn2qs*yX zD(e}{a?S%xrDZx_hfUgPqO$<^bCkt+|U-)~;MC>lw_)61i>B zx@W6AgIQN%x-DAsUZ|{Hxm4DZqekN8!8s_kMeAOz^5n=7o-@g_En4#lPg%QisjMew zZ=3jRql_t+%4j>5%1^7=w)J+w{=Mwxw_RTHNG?lnU2^icEk8+bokLsZ7Nb$?yxKCS z7~LxIvQLc|558Ps=_k2nUNHwH_LqI~LthU=GT%{ zp?Okh-UKRZHjr{cIxazqcr0B{U-~gDE3RYQzNB{cNn+r|m+2$%qFi4^SMe;bJ>tb{ ziQu|~XO;Bb9Q8(K(7VFPMu(r$AK`YchUR&yc?+wo8F$yr-k{a7A1UI+bUjTUhGmHt zLpsLoOKL|?@cI;Z@s+@fvhopK#j}i9qW$ZL;L|&vRnm7eq9xt}FAAq1s#E$S+|Jd| zJasm2z?C&yj&edeausR3n69Vk!>}yzVo1lheM#*WfjnN3124WBcu`h&qN{k8>kILs ztVxIJStWfp1;)q>yeOP(#H95{xSgw^-a|w*D^N~I$E8S-SWMT`mp%;35-)~yjN6yg z&cBIXTNH^ak-(R)1-`tECGn;BmvJk;l()!+=vgJLHvz^-rZ3Ig1OJ>n@r!64jHQ$) z2AQ5ln8*psit8BnXHq+}Ug7=xNTi_eUJv^2)}ZgC zKRH^Y?`|Z0u%1=YdShUWWa&HM_s_`_zli3+2u_K*h@P?o=;~?SY%yyx=|SPTEUgQ9 z#v?^~Fx@-m&N?FT7JBrbloA3(!JwL+(snE zdZMEx#(fj-$3#ulgDro4Ll7{gJ12A}fbkInV6Y?WNgh3ha_VeKQ= zvVAr(%&I0LC+5YDkrTE)IdT*AyExSQGMd;+yi+sya-Z?ucPJ9QVBWQkJ`a=CvP8&m z#RVfqo>4K%9In9=wz<sGRp1OvhAe@*0yKTX94dk1iz=WmuFn%_G4@d@%)etx#%x`<{h4#$;=h-zE1GFOZ!>j_9JZz@e@~W(q6nC@V-&n?MM z#FNek#!Db^vWvEBE5^!g3qKcYb&Bf1bL+G2D3fn367}qdv?LOzBCE5-Ti>|8XiIx5 z%gP}?wo8*oyeq5Pc1gaVo$ZyM#%BTWTCffL+TuUkSJcn)t>hp2WF919xQP~xt+v!# znXU10aeX1HF+r}Cm(w~fg{W5nX+@+o{n~?f^{BR;)qifZ=feeF#@Po+_BMcS`<`Q_ zwXxC_m>x*%kIqOvk*H@K5`DN5(#l9&Lh=TbGMkXNfaW5Tw;%L5x5erA<&gNOZ6MML zNQ02L*}=YWb#up>jrIRO>T2VowK4R6(a+WBZey9T!i{fko&H~lnYnF?9cLT|3n6hC zK3B&>F0&dJ61517TINp5X6i6>YyFpNGo-@3l7x2TJp6f8i}55!A z75TCv&r;+G-P80O-O2F0T#=8YB5zXUt%~fOid@2Y+n=e(ajD4T75SVZFX)z{Cl=tf z{yU0#BMpToh{l>P6}eO@a$!aMrun2)rXc*6TPAFx{rhEoQitKLFH3X>zBuhKeIt>jZ4I{bD8D*kJ1qSOw$*l`5~#O zamKrXx-b>>go9cs6*bIwQ+REXiYhs%ue+q!=P%{>s!uAf(;U zMSiNt*{R5_j0HX}w_Gv!ucaa%QRL!^d?ppSn(?2FTYr{83jbb%#Gk#5KQB>alk&bh z4Y?$BTSiegrlI_+O^shrX}s(d9oQ73CJrH zxtbz3G=4}x`bICAN482`Q`8zA1+_&g%5M|ucL%juDzAf#1tKvW^^JqtB$d}B;|1ZB zj(W;LO-SW6)Ob>OrK7HNP#dN3!p*9=uB0OTo1Na-AdQbd)bVIbD(WbQ*BxdxB{Sg) z8F$^@&Ea)@D(WZ)b&oSUhk58X`dB>y6rlPKKQ1hjt zdOIH7F%>n{LA9i!zH?BwnU!jSza~0=Yu;bji$x>Qte$D?ynQAaqa&(cu)TEB0XhVXS2 zBJ=3jRMbw!qyCY+xsP5iTRJ2`6dCmx$&%jyz)FJmFEkJ zJXev+q#{Qe5Bpasa#AYtdPUx$$h*uqNYHa}<7xk4MgEwIoUX_h6*(#miLJ3(-`;~y zNkjQ(n=#>kt^A%g@t2_E{EGNP^IR&=GZay;KHVslXHF3dXnt}k@)$+**Zgf0M+tiV zsfepgzxWFnp4j%quE!b@M@yPG+C%$iH$@(1cnb2Rm0aW-ifmTzUu=-rmaFw|870Uj z!*d-)Sma`9NNi)*`W7`j4dp+h{bP}@n|rnd$z#>)7WsQB@{tJg)KugU^`+%`dn)pd z2y)$2WMjmad!!;yiXdxKk$*;z%cLTAiS*AlX6}gla|^eBrl+Cs{GGjD?#a*0ooSq( z|A!)nm{psEG z+JxR*d*byrp&wH8!)-#ZqNv-#=uPSWo5k|%I>vh!D&ndzax9S}>twucBFIKk&TkFn zU#|W`ISoFO}t@NPH!0+ zA0lmO{J5L)Te%|YeMSA1ld&Mz`8cof+SiX)MBS^XQ!1hcs(o8ID0@BbDOO~6Hx`_& z$mJa5L27$O^v)h8NIY7p^*cGJ^%P}R2K;?g!|@`Gg?Boat@RXpnMmWWAQ)^x>36gN zd$nRuY6G^fdVI$=V9!jd&`(hF7}T$d z>Qxc-m1@_gBIDsp+{d4`dZfNWAf z&QhK_rzIdyQe;2nc~TlriH|#!-*TxsPSd{Wqx`0)@$;8ZuV1Y^mrmt*fgNnK z&Sz@;^Oa}6RGud)@;AG3OyyapUOz>7E^2tk>4uM0}M~@C-~!J zUdj$M$d46yobuF_`BFrh^-OkUgVeo1|8wQJm*E*lj$+%X%FoQ8wQ-cMd#e5i%5Rr6 ze!gC#{6m#z7h`t<&u6rM-cp|1rSe?U)cE@;Pu;0Z;Ca6yUsj$IQ+W-ZGc_GxbXLtm1!BFYMh4ewgCE)cmqm@Yg8rJmBNV?+EBt>`{Br73i+@V}FnJ9VJCAGZ?4o>^QvC1cZr8W? zeayYKZ}G1ve$fbimhwMsRm1;TdGNJUZAPJ$FVxt% zQt{g=e$Q6$3#zRfv=Kj5@xv6Kt;}EM`9j;U_!bt&L9M@t;xE=YEzMS4Gx+sw#Gj-- z`_){_{Cq3?&AnQ!|4AG1M`+x?toU1WPD|7OC&j<2`dhrNG5illnR($#?b{u+Zy#0s zYRcc@e=zS?`4<0z;_r&!e^Ed8(>d)%VtNiba;1^N;Y4{b@_m+Qa_!}bl zS9P4H@z=XX-|}w_KTZ3};!kdc|4;42Pu9M*{FkoGe))u-NPe87({N7Y0 zL!(I?<@dJ|HGeY|X`eXsRIBv)PXf=bYRw#-p&mCaWQEu$-pckgcUzw;a**Be6)Da?tibPzMM}{W3_cM+O90;n0-pWA{t*z zsP(^U3({X)d*Jmpp?j!~54Qe*TwQA8;kxQ$NJzGWAYHZcEhTN8#|EBl7>zi1J zSd+^PmhZyh1%T`ZNSH3O6OgbJ%<{*+@E}M2XyVq$w?P8S?Dj~wrOxh*gz(Mojx-L5 zUrry7v@sGMD`YoE+7f9Z(j=tGNZTRpfCM$NyCCg`v_~#8gi7%3npTq!%p508$z_I$ z1tY;}6w(?6ax+L)tpo<{zM%l zuKu?rW^G9v;T zTl2K_GHf0B_iW8&Mg>yaVCNcDOY4%$j1DBxt7$fBAC3`8twhC|0mn*FK}m<@GHbQ2 zdoHtfz%flf(y1dJr>s+1$6RLJfLkTss(xcrxxshq1)M7RPC2bFoT4Lc{amIc;8MxD zp|EavE;BC9C70QtZ5(o$4W%`lw2`!^%Vow3rE4xTA>h$7m)TgT&~1}|T1hw7LAOn% z6~E2a0|^`O!8c2>n38Yv+HWf@fb#{B>^F=SK^egke6y-A%8f`#-^%nrZ$ercDfUgg zTxPRC4Re_-ViLf4%hoyPGFydOqSZuc+y&3X<>3=sr@8Q{{M+ z9FLacF>;(HNBMKB`cujBr&IN(YLA!N6JYb6Rom=G=E}ag%wB)r#$0Cazpc@fTxOr@ zHOXc6{o5MA7yGrYK`yiZ-;xA74@j4i%N+Q(xWk5nggd{N?$_4fxFSpQu(T3OompC$ zr5sDEuvEv=sw~yB)XY*BmR4h_fu+GLb!BM?OWjz)QYGtmXQ{|i50>~7XMRtXhOsm+ zOT$^}#nOme=HQC<{i*SZJ&?J2-NVoc@%v8Y}U2c`m6*Y&OLlGH`(7AQ~T`n^<&^opMbD5(mYRhqnzCAkNRH1KknPV#Q`ll@4 zE0>uT=o?s`%N$!-yIf|vw8Gb>5c&Qsa=cZJx5@E#Io=`1JLPzn9PgH6Nsjl(@m@LJ zC&&Bc_<$TAl;cb}J|xFka(q~hkI3;+IX))G$L08h9G{fqQ*wM-j?c*PS*#0=t7sWu ze=FiRzHJ(o%lylD={b@9yc}PU+RnIC2|KfPvtT#Gi5cx?oSPAD#lSIo?1<}5Q?nR&|0P-bp2vyz#Q%uHnFAT#@z zdB@B+&%l<`JJgm5u*If6xy%`^EpvM=&SlQ*P+J&VSnr=@Y?#|KWiE4ehiacRt6?>H zPRH~}E^}^&TEo7;jCJ1J>x*3G{0`MP$^Te`UC@3Da+wSNQBC3Ji;R}-xiaK37k8+Z zb8?wWT&>zRGv+dvcBob|*X1&o8O_>r{mEr!bf{)>Mag9@Z;xiV%oQE36RvPq8lBn} zUAfFv9jX&%_^VxgT8pb(=9&)GhY^J<=e0(s)~-6a%yk{AO>`E+736x?Tj|&IT;_%j z)eN)Ljp;thWp3(F=~2I6X202JlQak9GPiW7HrM7dw;JhYOod}Om$|J&rBBFZZcnm3 zm${=uxK3U3rqt{ zPOvixVeKmaraWqLnI}5lm$}T7bJhC3?X))P9a@hkK2LR|<+;q$|L1JR$a%)K*^C)8 zTFf{xBgBjiGb+q@FeAZ?0TcZu?oGs-SZ9@A*L5Nq#|PyyuenyVZ3f9@UZ1O0^vz}7Fj}-{ zPRM26oNHP{{Zh@jUWMLjk0rUx+yCcmzzBZF*l;4;(E55Tmw9)t*)SXN{C8uzIhT3Q z)xWiv&Sl=8tNP;#H`|q;KHujuAIw$B)kLk^2A=!SXx`d5%w;~BYnr|ExLxi2-B`7=pkF7w~H zE(`Bi{uP#$%gmYUQU>A+#(T*4y#V94hQ+^ihZ1eyGndKkk;x9;JyV+9{@i?}x+f4_kWd{#uTJzZMc-|BTXZ&t9!~TKMVlYs zlkeH_JGpq>Il_A+(W4aof#J<>=1~))v#a+SM2}YVRQZ~;SV%PgN?zE?F+{Ja=n)28 zr@Zk)&=K@nM6a#rd&1~k480D~>neI>gC>faP)1mju|%(@=z|TK8W4>?b`(LcPjri- zKQ+BW>xgCw^Bza^28#Z-K@&l~4KehFL~o?%R}Gpy&cq(Fyty@%$&M#_f}*?27tIC9 zUguvjv}m-(|BZ>>MA7e-c~fV`VHmwB(VHpyO@n5{(l3kvdJ$jl(1_if=q(iejeJdC zqKZ5ji(&MZL~o_&ud^AB03sNF{Og8c^hBb!R`kNgO7`XaNWEg{Nkng>=wr)$N%VX% z^kky9RrCylrp`p;tGy9Twj+9bMUOFP>P&Q>7S zk3{mju3_{pMDMET1;gkCW9Z$8-d)kZno-P%B5!_wHq3huqW4tv8wR~NQ1tb}NTxq+ z&+kR_-UdBPYl-0Zal^=ch}>8Cek(s1A#q34qA~P-MDMTY734=6L{G-vVlngqL?5W= z7WtuuAX2G&Sd)W@K3LJcO+;Z+U;dIVbE5G@BaQ7th(6Sy`5ipg_Cw-m2qO<8@^Ixl z%k&Bn9P3NO&_@tGMbVF%Q9$d+n<>oOC;CW5A6xbZ`7RklPbK;&MRzTaF!uCPG4#FSKyE82TKd&sDVfv052j z=1V3R~CQ7gyLR}y`dqVF${ z0_wd=41G1x*C_fi)AJkwxsTW(dLh5$ZSSU_-W-qQJvfHGndn;-y|?io(d0cOhQ5{P+Z1j7z>};Kh#ne4-%j)$ioULV z#Uq;E`wQ!RC((B)dLHvbKfFE?&2I>X(RUMFQuHI?nSs|G&c@~S$UQ{gYtX#v+nHf_ z40#`s_bcD)!lP_N4E+Gn4=URHIZ;`caomiIp=T2PkfMJq$2NOrR17_f=!X?OZ#YKQ zh@l@L`cXx{6Yh2X4o}!0j}iU2qQ5ZS<5iTi`xr&zWdXh7Jwf!720b3N^xjfPYsQdI z5&5+8y|{c0BYLeE`Wd31RrEvU*^(=*wPWb#h<;wto0$0EI+Z%F6GOj1^oxqtpVKFr zn(+6B=#R36FA@E+qSrU`A6LvokBy;UA^KHCx0L5UUU%1vpIxG4wk`zpLoW$}<}E=5HB=eexdB?S;(Vr>0WO&yqdgB=SbE3ac^eW}m3$5HFhW?W1uM};5x?Jv3sL7@=^uLMzTG4xy z=RdBTH;bXaA^KZI|7P^g0!7}N$I#yq{k@_eG-HPm%QgHKNW-Ot9l<{k{i8u=P{WAg z9myBUq%0HV!M-~w~3+uB6^OZXPStjugQCI42>Nj{1H|hxLdQZ z>BkyHZyQBpcTYBuMxtUA(i%vkkvOe#!sIl_$&FK1g&#uezbE^t&A;O_LExMqIP5u? zIYc?|IGiRRG4vVG3{wUlLyCdI5Mal$yVwbIEgeQT(75f8wny3lX-A};kakAe1!-5L z-H>)i!q3NTBT8_V<(ijQ3EsUk+Bur&TlO>~l-G1#&w01Wl{Bw_yk_zm#I-%|x*Cy| zKO(jGEvj{u^!NU0Oe;aB+R%!urDb^;Ham#rbz5rk-sSb)GWGXQ8?j%;?~K3NR+>@IstG)-IBnEX zbr}?oYAjt0@{x@wAK6&CuzuRe{U;!m&Ik2Uf-kKbI|w|$aTy3hLrAhRmMvXgkGc^^ zgD-=s1IB0b$a}3hzGi%qsTCYbO9#QyTVd(V^@SVj3)j~du2o}K3>$KDvLQD*hFl*Q za;;;CD0&+ttpr7prz+Z7pA@0#{m}H@`a-F`a94fd4%KvZ_IS;3@4D=_B{#~kgKk&qVdmr%a zXX^`3*B73wFFamfcvKBuH{3PPI>tQh81tlK%;SMEk2=Ok-@E{2$3j`;s;mr1pMS5q zC7Z)|!r1$y3kQ-6K^A)_jHwC+vB`cgXq$#Hg{>P3TQ!*Rw0~)l zEgSB~P{{c6a`bH7V26eQqLWT)96M@cCNlyRgC{q%)EofKkyqnpYUT5piA0xp!ewZ|#s-AeScf<{a9*191-%hy0Op1*YVm>oTRuz0oa$ zkT8GxkD}U})LWa{Nqa=EI!@Y0ankl517v(B6dp$*zk|h&VEy3jDeDO$vU!xNi8C?l zW3Yf(yTYuUtxcbR2JW9CEA4Dd+k@ghBNqAR$i1C=Yn`Ker$F~F2-)3%zySjt^ZAF7 zO1sk`9A5sr?`AT6oA;)WuT;pt$zh$I_fO4r%J>T~tc@z15bMU$KVJhe9zo~-ghGDr z-r}pDS>B^Jys}&16$yoP+BY>Ydi+DpAbh>gn8K@lw8IYr4ONFD^WN$s+TV`y@F$Ku z@tnret9>M&AV;ZO57U*Y9BZg!2T3I@m_jCR8YW+m$}+`Z`*D;88mP|1(`S7c+~NH+2yAZ@P2D9pB-}f+wNIgU4FVz=nQ17 zxV(+R9GAZza(U=1;_~=G{ z-<~kxS^6NPe(21qZ-z>QPq?8SP9tPE4gQ#xUJjYC6y>Td<#Qug`WY}=@0-sgT93mJbPrZj0Yz0B|nmtmNFV67QSpVL~-JFphz zs;zwpEMV=wVeOaJ+F4Ze-Aalk+gke4RX?Ke*HrjnqcF-qyt26YkH2MQ$G|Fl;S6DSm$YQIeudKVc zD#H@2W)ZU*!*Z);VY5av%e9(?fL>e{UR>3o4h`)>okcA7xJ<*+oo84}64q$eiVL*w zO3mdZ?~5<*Kc;Y5e{+@gN|*JYK6Obtq_N8YtTN2P{EGg#Q^trvUQK^e(lU^A4J2Kq zl9nx9MM-5D*FpyGeUVoyV<2SQ3>i1}FI=x;Rw&&_G3K};N^@x2@Y41DVO*y!4Sh#U z?bSH=7RVk1*~qJv&AZv#A^TPpyn5+YiZDmYtjU^k15Yx27Zt&GK=3dKMqaJpH6ZwI z2)XucTU z$&|ZtPh_l^eLtkH2kFSGmA(O_&xG^`RQiT+f|0%&r9U8HOzS(Da@PqsG14D`^o<}L zd9~6vf%HcpeU?h!v@}b4+c_H38x}Sl{U~H^2ARmKmAN%!J^`7Jsmw_&H9NJ`>|A<` zl2?1CKLs|*ee{zMwoCq*{@znU#8#8sJMHE@E$2PueDJgV^Uw8HQqBB?OU>@y3;hjuL+zq`_9(p|pce_+(|fGHIoH~~#@7yhsefK7_l5?h?LtO{ea6@3 zUxIe~j_)-1x&Ha*QQW`u6uAY8a{~YdRO_X~;H6jLrI*!9hr?&)7Jmri;$_O}ZXyw- z!LLDsBOnoZwG#cKaq9%BZ$j$pD%C#*G+YucW)<>Fk$dm-$6RZ4DN>i$8KV-G>N@{& zz)J6kbKj+N@i%+X?(P0z8w4OG*mhR|2DiW0KW~~{!)EXI$Anu^9AAu#aetrUg}Ve4 zZmZ3W_w^zp{~jFX-@r2Oux~=4^mfpHZ?W=bR%Y`kSMAX|!2%xr5FVXvJ$e^t@Udgi zZ2GUe8Q1K~k0||aBOT?cr9WV#e+uazTj{ev19xsxAmbhdGVVnn<9-9Or;vGH$Ox+` zeJpX7HMvar{X4^-y=rTh&SVB&Ir0HBQa_{0dUQ} zj&jw~e>Kv7hxFg9^gk&5&;F&~*k$G@7nCkM`V;W40h>lAVzb(fQ*O@GDZa)7K`^wC{~Ah$hSsp1tqmPD*+JU6-fdmR z(*;BXJJORXb;1uz+*s@x~N7dAfbp3p9G8 zZ}?i!$wQyZi0&l))0ryFXH-DBY84hRD%3-ToK*qO??i=R;b}NW_scA7ROmt#7BVWJ zT(t`Pi^uRnH>l8HRp_fKG={y2tlsufwrD6#+)>EjjVv$`w`a(-d2)Q7^G7xB1o7yz2LsM2f* z7f9^mmF6SRz&qPIe!0k-&nqp;I!jz0M6A>n_VSC+gn>9UjYj}9ctO%uAS9bdxoWdk z1`Bj_UzoL+wP_X5zp~6&{LeD2#H|3J(VhDBJ{v`&)%afCla(O*YD8YnW^_GH*bj@XvLn{tQ?*)FnqC4IW5^`3JqBFv?Xcyg67v;Z>pV%2wemKm&LFDSBjE znQWrTwnpX+4HTYPS6bPF0|y~d;Ys1@pP{hcaWqrmZBPw`QLb9y?ZE;HkAT9%yh73H zyer71q71iTJa*-^r6xq_o^6oPG?JR|%SX@z<*GH=%V;thnvAk)>vf`34bjd-eflE-X z+9ljzN9U{ym#pm-*0f$Znljgv&RLsBx$tAZKu+c{S*<8CmWmu>6hXOaMgCBFBRa?e2#T8Gmiw8n#d$UO`Ih+0s~3>?8_pNQF)?3ZY!JLZ=#qCP1N$tTueo zQ`*Rze&l>BB4zrSa-GTKSv|;uH>L)s8x2sdT7$EV23tUb&Ah@UR*7?{#3uH#-dNg< z#ZGt|1am$E*ix|Y!h17YQkip&GALKA%!Njo$xvpJSD0v(xroY4WJky)zcfjep?h3P zml5>Lwp8X~qYTPbD|3xeW=ANqz18Ge(7^pVWZo{A?ndt4IEXis9Ld*{xT{y%#UsUD zTy6xlw7mx}QPWJn=G|m{a1+QvkX7SORQYC*6!N=y-p*xScy}qk2Pte*(-Vj0 zJ%!J$VfKBS_woksNp821$zC25qLwwQ;6Nq$=*8RKu$dohNV@|xtTOiS^3w7yvfPy} zF6(wTA=y0iRCmfd5`EgY;mtQJnlKMcfkzKlk1kz09KLzFF$kAsl%%eMzYUAoUnXJxZk(N=HHJ^G52BW9iA|^2bvwUQ&R_X%M-5{shlE(IE`X zpX7NbJA@VTr+D6}4q;IKG|xNTA*`4`!}HE`2rI$Q(>?E4Zzz0!yy=GG36f`vCrRF^ zc#7n;#nU98r+9`pHa{I2tqdnXvud5t3@4leC!D2DSgmxHGFt2LUN(uD6rR!kyOWN}{(dhN^x0QSTMu=QLf4k@1 zp}j^zOa4yJyUQVr%iryJC5Ny<{vOY}*CA{OTW|Kfo5a@J)YjW2&lc}Ajw#+Pd2R6? z*m^VMa8n%esj-N%7kdVt3+=7fH4G?Y#(_id=}D!uj)RM-M4 zAg@-1Nl@W2sPKqan58OAF3l1Z9^tXxoEQ~^qAGMTDm)GqwuK7Ft5t#T#XSQRp7IJ$ zs0#a+o+w9p=_x8g4LYga&q647y^&Wd^k4{m0YaZsiHDS)3#6F6i5DT{PzXU@t&k%i z<;qr6 zgGA3;6nd-?igMLL`E6MUeHTLCwn9&&(6_D7I@wOk){5BoDE1^H7UinNo@vB>0I}~| zv1fq>?&nha`$jtE#ti00eTdlniHu+~4Sq;XE&w+FiRXRfg|~jCx$KSDg~262dLMhG zkE~gLHQ1^dteWYWt@e$%9{rdgHaB_*BblgOWj>_>e1u_!m$cF0C9V<$uSR|TQ?G2# zu!iQ(WGNvJEj~}uTO`e-*&z$ArJ7%OrO)FQ$diqb1z)tqf-h+SA9NTCq)p5MKK#gk z>B&;*R+c}LPG~eviotIK1mh0IR~;KAus}$DjoA3g#>PFMLD~C}mA*0#h{VQso~e)( z@;9{XL4fn$dEU34_ks4VJQS1mA=mP8M>qn$wf+mbT^bk>4b9(^Kc9}!bGUS4Q7$6+ zY$X4^he_Fqrhu1eZ5RoWt+C&WV;v_)%Y`p;!iV5kwGa7_1wQ-M znnTrsShG`orzR6es2iNc*H-)=fz5Yn3eWS>R*Vo`1<2QYp)1N&>-ry~YiHpc`MAoE%s`QN&Cw!0l7gZrSFLEaMx5FOiq=_0 z=K-x$M}3U0=x6KHu8vb1r~;oU<-10lDs9V76(AoUL06Qk*0sCQwFh+VW_9fen%7O8 z3Prsxu2Z`?PL*=t)OpdaBqYbFJ!w%dqbSN%E4qMDbUr9LuT^wG3Y?evg!^4c;w!W6 z>`fi?X%Na)>%hk+7%dAxhdx$^CeXk=PgVMq``1|?ElTNpY+~x=in1VSd=!#jw8>kz z$+pB}RZdeH8D(l+7gOejfL$Q*xrnz&Q)yu%)Hb!%E3kT@rqUv;Hb?eK&-$(wu@Y61 z)}@6A>f5{+wc?WyC5t`sC6yYs%~CuIb@hg!xjKq1&1jWhOtmrm%+cVx_HACA%=z?$ z6hG4mQbae037?we7nk8+F5kjhAC{n8b;t2h2s&;FbX;HCaeOY~E!h-)h}V~nkjSxK z;&YSIlGeuyF4?>k?cn1Q+F{h}N7C9L<(F#mLMuLLNPar%Gdj78oQ9HQeVhBU{W{dg zZA|_P8qxAZ(V#^+R!wOrt5qkD%yYV25p~8=o&Jt5h02F8m@!bU+LwH?0$(l-UwYP; z6F`Frn;`R+ZNdOC-&Wj|%XZIkso87W6tL2=O|U^+*w{RP_HPzYWrXBO<8zk$fF^I5 zCiGoJo_rKjTE^j7V0%89G1M|oK8MK{9LIg)s*6)z?)?IuNA%YE57n z8U^sDb44$6D-Wt*#Uz!%)#xDbD+x&i^=%$ZDF?>|A4b80n-I}Xgp~!U+CwB_YGk1x z`c7f9A=EeQ0w4772v8-Y<1>2ys9c9qrz6>-8T^5mlbMrQ00r(z^Nsky#isnw$cQTQ zBih`LD!rc4p>RZqS3lE=nA6|%2jK0pV4SMG}^GKFs`Yvep6wrRqX+)wsBKwEN1P{ z!;e9j6Bz#wQmOT+YiZ*q(1Pb9UF*A+#-WuyykI|e18GA-d4ffbm@$E7%rs`8T(ubw z8#6YC8Jk+|AE9!aT8aLg9$2=C&@CwRQ6m)Ps)asbgieIeEv?WeDRfIKw5x1V)R@&G z?XEEojNr||TT_dtj20+Yt;MrOi^CYSKC|520B_n-D zNZ;N{f0@#^x6*r>75+{X_=*vTa@7JqGXnR7z}=e)yEYYewqid=jkkAGY3HTTI;Wk*84;2eXYLVP@R3PL|j)GpS;)}K%w6n zp(s}^^amsKUxf%yd=*dUTPdXm2$fQfXN-@s^#`Ha;HJ= z(N^xflzTJ+QlI6?{BtY?_A&xdu3F#{M&OAMczjdgI4iRs$ll3KrQ_1Z!ID(!%4msl)mnN+%hRFdsaC}%YH+IU4kz@_pwOj_P?W0{x{MKeHiVvO zg)U2>XIi0^LjN3UF~Dena@AU_Wwf{uTAbfhIM*t&HWfKHP^7+eKFh}I7g6*&Ml{M* ziymu4UkcF|Te7dW3GyHYe=HChv;Muq_C?NtWFi z`{L`CpuvQR$VxX@1H1QazNLvT*G@7mN;k5`Hra;QYw$km&-i5^j5~W!H0;l-t`VcTZEk1{$~@YqIGkJI-XsBlDhZ zDm`jPSxy~f??g@@;5i3StBYO>IFW$o9RR+wp?5K7u<98zw1bfu?Bbpott~xku9W!N zGrO>Fy?$%aKP!fOF1V%=S!)JTBg@iM?gn_ac);WAcJMGiPGq-y7YcZs(+ZDHqQ?RO z{@fV;`H zWu=ms#oG6(9-FL;F#2EsUWXW99yqO1dLMV8Z|kd59}U1vylVcl0rWE7`a;Fv4+pf= zH0M7T5?@78(rWoHgoHQ2ENO85OCe>;q#^mQgfvf?G&KKjA>mCA+pw7bT1dGvY4!X! zLh4*54aX&f)s;yj^4|*y7i!CXWc~*sVcl#=qw+rrsau(}M*b%uVPRoW zqw_xtse73;2D8A&1H6w0@LfMsn<=WlipELVqI#xi+)-Op9~6z@or`L1(U@3QRJ)4C zm@Y-NplHS9xn4d~@M;QW!ut7a!RzD@TJp68Zytv*F5kJ}Bw*Mis0A&k#=FL*s1!i0R!f;X>2*f`&-;LYa{Hp%xcczqngruq2`-U1F`v;2Yu zZy|@Ud4A!7w}?a7BEM)McyE;EZ;5XIV}SR&bo-(OnUacsNpRE@Gjg6SW+m@btd+dB z*je&TQ1b4@g$rZze?Xb7 z(EU)V+U}o(?(bW`*MbUW3fQK!SOHhsAxjj{@ssoY3!bO0Xe{8xy?j%_TiPLPm(Lfx zWgNox`DM$_Vv`-rTX;(0zr1H&AqMR-IRpyi;)% z=)3|zdqHP_tJQg5=v;)(Lkfk}RPFsrtBKmfsP_K(Q3Y=e)pB*nJ0L&0fEO{$;3MI{ z{F()CEr)PWe(geONWtzYdg~Otbqi+mjITbk&B6Jx1#dm4%^~^q3to#uI5a=5;BDX# z4$E&C;<{168z13%cz!~`+t_JyM1GTkx2Z#zlHaW0ZSD}{CC2;~AP2zSTDccvk9imeBn*#YA3*Js{+i4&o5QZ1L zVG;%9fl)Q6s3(0fE%_OfYZX$Voaf0MsiW^GaP#hAY2r3pwOUPj{41@9P_ID^D#1@Bmw$afj@)63l| z&95NwI0k{k^GXu`Rq&2?iC2+$Lcu%HCCdAcCzS(Hc=FZ9{K*VihbLce%%4*5PIZZV zu`z#I!8_e0@{Ps(8Ra1(JmodTGdZ{%o;MPCR>3>lCGtlc^5>L?tu((GM8wsUf_H?( z)l})b9ZuEf=a z5?6fbGJh#0>Z_Lbf?yV#+{(RxHTMy78B2T*Q!cf#&nuPu83}msqJnp!c?Sl_FVqyg7=I| z0AWCGs7+{Hq1;HJA7eiLV#D zH(cVkB)(bj-g1e29WVcO!F$Ig@`oYv?-soGTq1u4BL9BDo9zjYEqS-%yOMV=zAt%?;s=uVEPjNTo5>FUg$m*a zkb{_$8$kRT+0fhrN`prQli?*_dRQ^~DDp|CZeE+T` zd-t%Ql0{p|m+V@yGe-uMEZR!GXV;S5c%7ht4wmTao1AQIKETfA^sVQAFS4Cjw`g zGrE|?Trj?PR^O6+*wk}qu!wqAbTRE0ZOLx6fpBAc7SaF8k!RfuY_XQ?C1n_kV56PR zvpNIA&lf&wVAQRDOZKty+0vo2W!tyYLw3s{5WIZvtV1s~5HvgpGi(VG|3u zjT@pOxAsO&EEO5O!Mi#&_EoG&-Wn6b-xC-{p!>9J8*j92j^%A8;1O)5Pj0E%-dl5G zX$|^~o~|*EWCpJ_F~9ai)Hn}9)|yya)51C}(Yy}F>ki(!6H6jicpHH3^_NBwE%d&+ zcfVt4-HA}7c|CN_PM94`Ozh2=7|n_a(7!aqi4M%_I}cueVxA3lNoWvQRMRcqHorbv z?TQuH+7t8Zponk3w@Kpe=*f}Q_vAk4$&JvH8%!*;XgBU#+F;_e5kKk@d;&eUUw$*F zbb$C=hW>b*9+=-8$Ad~OaKTTF+6aHl;zwRH4-R7w$!`Jdp~=|8h&68(lJDX9Epa>| zOq>GGY&_AMFp+E1EoHoBid#rtQ`}tgPQ}e8j?Hh3wsNV2U%;)};pFd!B?^4=$Oib% z{A6=Q@a6s1X_NV^Y>s`J#}`dKL&KB5IS(SuS-@Q4<(KA5M@`mf9d4g>PDdd7M}*tW zne*RrJH8T{pFX+Vw9z&_j!pSyXdqGqmYW{KrpGx=dp0!xYcje}eqS9EdYQk3~OVcLXRmCx+@l8nh9%c1?_5_fzq`-1dida7C z%8eD>+IO*L6Th)Z`sRYkV+!ZlzF7ja(s@*c-IHmQFujoIeyD*$C|45R7b1-?{LY_ma;7K*(Jcp9!t>js(f@j80;<-9`-bS9o zs^OVIC&j{hIC`}z$G@1MkrZ?X1&wN_py4rIYmnESXqbX;JawqhRIczLh-9uLE zRb-`#lv&}gAB%4B{#>6d?K%P04a5S#H*TmI#srr*BS{50T{- zl~__8{EJS?mtvwf_5Xjh>RqQSctKv zha3if%$@sD&U2Kr|6GzIm;acY11RTt$~mz8a*|a)h%8?q%Y)m?ayVRpe=#i&A4{o3PB0DbpFbaQ(!VjNI!p(FSjqD>R=Vi*7GMD6-71_Q5TOZe!)?v$s3&+?c{9okxCV3uTnJ1S8u|@j{Z2cBnpIE82 z%*yfBC$aV0Y<+U2)@H#O4Ve^sP9e{C$n(@nJgr7;^3iGJ`7U{$UWq3i#E=W|lo1-A z3eEr{Y~x)q*}Hr)Um3i5vTT$VOnZVgt^>KXc z`@TyIY8Xp)*&ecsDSJ`b#xi3Gg;3NGqJ>aVDN9roB}EgW5Gs`xOH#5Gsbr~0y!V{r zp4a`IbII+bS!Ia zr(-$mV>*_%KB41v)~9s5-r7OOIO{VyRuW&=~&77l8%+Fujp9C`kIba zt#9afgSCr})vVogtZwb0V-0IB9cx^+Mk#Zzl3DO(nYXsV50%SKmJgRE6*E20MMd-}l$!`uFsG%fso|n3M^=e@p!{aZ2-x zd5&Sgp4Og&G3fX@x7r+j~Yf&BS}Sl_p=`92qSBGLD6XJQlT$Mj|QC&+(o za4s=Ermqq$KVdY4mI2T*sL|-xq8UQV2xuAAXr=7Ec1Tx1GXYvADOv`9t`)XNJE03L zGoWSen|dOVB%be03zmIZq_ANrjI02gRgGq{FtPz!HiAaWm~{$OZ^0_z_i|%$l<@VM zcCzZv=1-O^kSzSeSuTG#phsD~H1(+Lpf|fZ6eg=J2cYGUqJ^c}aspaTq1tjuVZ%~w zxdAq}8qH+2p?uu{z~E7exIN;NMyE3Z0^CQCIRpyiXIg{4&U z16qEeR0~L9-IVH3U8{IOfGwy-b5N?<&NuJ#)gpjaM2Z%c zQY{K-MTJr=CWYmtYO)@R18i|M8tx4x*PYr*wFID*P@~~;7D}{|fL2nCX0kA@0kmtR zXkjUgQh-)UD2!{Ru)Hu#o_dr9*wSh=2Q{nhK&A|!l~JQPs99}jv49q~(51lZA0Tpk1##rr9C@g7Q8@y6mjb^e*)&aCSLcr=muKd%-{@C47C%O@) zzEPOE9!xz*SDMy`sp|_<`+hfUz|Dq|x>PrWsT&GYHzL^)!c!%>-y=UC_X+%VOXkaG zxM?XnOP$*eTC}!Jdt-2QV>OzC7Of4f37|DmqnYdoHv!sBLV`9`!+VC9DZm^y0!q@R*hz|9@+s~J2jevrBa*M5&$hhjfR_=P@d%90%*6W(M%S`t$=o` zP#EpiuqF$m1Hg7rqnXUUj)2xtjb^fDI{{iJHJZun>kMd}h3xC1hIJ5PZF}*q0NYiK z<{-p#99*Y5dV2OYK)X$iW-`RL1KRCEh`Xs_9W)qiA?^;a-PLF&LwpCI-JwP^8R9zu z?M@-Ycd21bhPVg7_E4jlY%o0mt*08zWcKv}v|eg7liAlB(0U8m*GCQOAp5j!QWF6- zk)Wy1A^4Fu?pTFmIMs8Qm@NFmis!BQ%thg_oqt&Ry!C|M_6NU?R<*w1tiI|vnoPQW zfYwh)y8iZ&<@Xpu6CD5PY{2>S7+t{`03H~i4vxt_ngnP`YBZC1lMHCdLf#Ct&l_Hs z|GADZ2;4VF9a#rSr>(OO2DHIyG?Pg;1ki>ENq4sz)`1_jZNY~E>`*nDNk0w)v|)lD zhertIu^E&Ij*>=-qg$?O{oXk*oACPREbpxrM;<9ij8FZezHXb%Y4H%{Ml+dx4*}XkQnavSUkae52-!D53hO5OwDrD;06USO zsShMLC#E7l7Eqiig!{pWhe7Yd>QI4fZrR>uGfyP1eIRfcA_OEiCmg2hipS^)Oco%j?0x z0id?^;aPxvR*fcKz5{M_X+wJs(4JGHIXD2+hW0$5J+DS{(BQP8%>%S~YBZBI`vRc7 zAVmvH&Atd|FA6m~UkdA{X0@$h3jlV38qGn?YC~HHXbaV74r*2#+9E((q(*a4v)a&J z0<@RZXeMiRF`z9L3S)^H)}$X_2H2O?Xb#p{Z6SUI&|XoanXK7Y0qs>an#r173TR8! zXeM)Q8K5mwqnXUL*8uG`HJZtG@;acsE=3E=7GOD`Ef+f73V7vswu48y9KC4$22A~i zF!h@-^`p9`UI|mL6sCSl8ltdld{zPMDm9wPcJMZ!y{$%b&JSEUa~c5#r>j-Fm!4SH9rLt(Q0tpT((LbbiChINoP+O{mI0Gp~tGg)o#0or?N zGzVVOR&8qmZ7o3yVYTr_jQcWvQ`lc^lKUt2rRx8-U{BqlSqCv#CzRQGSWm|$+CMt) zXeoamrhZ?TdV@MwO_tF{fZeD@b5KUwn$HJ-_CdPQv{m?rfcD|l3a7us-sD2M31YBG zD6`G#gfUrWTL5;88qH*xeFSJ9NztgY=o$t)I`$NVr`Cq8pm?iPF<%%>K0Ub&(6$Ll zyH{8TldIrv zfZZ)ci>C1G0mXZyih0?X+&}FFw7o*+d<$!7IbCb%KA3u+F!gs*KZPY}_XF&Hf)>K9 z8y6Y00q42Ab(8GMcqRosP4@5m0vhmS2a$Djn*2RD>w9$^OLbF`N7WhbV0qQ{FxyW6`_t8Y z4xZ0HgR_2C$I)b`ItFORgrqwz{Fh(U_zs?s8Q`F19IXK-0RMyl`)j&khv|a-4Pbv0 zV1HM`Iw){$$NVP&_9Q`5Z$Jm@0oq?`H0)iW zMEe`i{#K)zto(C;c23B?^J-X=+4m2?{-Z`SnSB=k?SdN3WcK|FX#Yyl=r5Kh>poqe zQ`tq7@7K{Mc<|uI-)DM5}R%SJ<$-b2ZV6&*vOlDtJK+CE|Gnswa04Nn$?Du2hj4U z(M)DvUO>w$WM4ittb^>+b}^G5VDqcd9E4aKS^+>SAVuR33+43w18W6AaX}$-3Q2vy zx05C_r!c@4R->8hTSWk^h#JjgQWpiZqEfVIO6p>uxR{XC#rp-Gc&%}8KJMt=TM3xD zgfMkUn0kq>sjq>luMws$C5?PoO8HuVy;h3GFWlv&obE@1O_pJ4P+XcQR^N=^PbXxB zg@)gZ@c*U;$^8WGJ3RE@AND^Fn{GFn-0GA8Hj)qVNGszt_Rrb)o3OgSsb9nNzsC~pY)x%@*f+bS}~cB6~K`dgoLap zb!}K$Sv2|~#l%01U6WU$e#5O9`msKs)t91CXVFB5^8<<3&g%NbCk+6tfe_+`QdquQG#TPX z0NY4_wcxm}y@NH;(Me%rn7XkrbrY$dcx#fkP$!2uc+dVO(705W#-^aLsi3hL(Wvgl z#YytYvY2mPGB|j_hyIi+9{u4Tc5@1bj%yB%E1}DAEx>Ut1jn_6sVD0Cj+s_4bt_@& z*3!J>_3Pkag&q#hyd6C|-v(gYsL?3n6-ki3vk0!(F|X zGP;JRsSn`_bgMduCiAO3J&+u6`K7E~lUFz$Ae%Y}t+k^%zf7inCxGoF zMdRgPM0z=v?q(%#tpO)`+RjuugW}Fo#e9eKUv1A_)NV1Eqg^3lU8QKzl%uzS;@hN( z|8qGSF)jXfh|ldpi|?k6n1hBlTGz2wcYy7#Ml)I2cL3TQQnXN4_J6g--zoJr?Gb^^l@n%~9Vq0e3>$uM#7s#rK4;_Y_)uFKHqKJ@eIcVrTM7rZ@PY zx8Q?5#0Tm_@Sy!fILDTpjq&G5-F?mAa$Rd@B6uLtUN1)udIQ$~&4?1c+*!CL3C;?* zIMSxKFX-)Sua_g^iGYAC(aW8M9fN<^@2t@1?FV}M2^rqsg$HoOZ*jO%^hIpbHOpF~bLe2L{>e4M&D+>*0ez z?_hhq;mB}pdWV4CAwq`V?ZN|I% zU@*hA)%d;OfqPx(_2RyC1n3=MuQwbOtu4MILGMT*!$;YBfY-Re4A<7v?gJ0p=R&W+ z4A-W2H0T{|uQwbSu1)V4&^t!R@UiwD2uFr%tMU861NYnO^>oA^0KE^`>*ewFVnvSw zz2k%oAMe5gUhLryf(IUqa=j0M-iPe3t0JJ|-r4qg!_g?T#rG-D`xMa|8I9s;KzrInC?c;>JY!Gq z=|(XJqBSSV_09#obM5tpqfuzvQ9KKJpCx)DqftBuXwSI_MdUS#=k4jk(I~Vf(maUP zJbS&KE}R!Y?+cMrI4=U)i!MSDd4)6Io<1Cfqiw6U0HU?PUT-)GN1NV-pm$;96wV?* zTjU}Xkykh`+0%Qva27+f7TfC$N8xB&VV8j3C6QA&F9X`kEY_g``1hhA$Xx#hyYI>!8%(+9n zSkrHTW8aE$y{ka)Dto;=s|?n(wtd*!p!aQQ;qVkTS<~+T+B;G-?tOhVz1lwJ+#v>Q zT3gK5fMeI#>*ZedVvfHHdf$~M5)Y}#98U$bR4E$wzP=oP&pzhdAqI0?+X>%VaO_%p zz1+(Nb6lI=b)a{hG?92nP3HJ|KwB?G-BWuYy-X9?DcxOaJGZq?b5>G zzl=Rcn!hO=3+H1Oj`d>Ud;*UB#9ptb3+GeN`>DNNPZ!P((7QugIP{J%`6f;IciX1r zdH&B_IM!g{XuAac931<(z20yXjyAntfZi|c^@gKxwCUXmdUr|-hlezmwiV|~7moE} z;d}*-{mNc1_p-rj9Bqm8HR%1?UazMM=Nr)bjkIw1R!!eE&Mp^@^cLw`%&XalUooST7dNK5*!h@S+#CxwXr(JwCGcXE~Py?#p5)3Grr6Y|Hzr2d&WrTN9!uH^qx&m>Nr zSiY<8pUdBNHKp08)Kk7czd-){LTo};^0~MZiN1e36Pr-~6ij_enEJE}=X){P&VUEb zM7iFxp!ci`y#|X*TQm6+^!_Pi_+KtOU@*hAZ5aLr5BweFde4F0b1w86%y4b-Jr8=% z3mN{83lDfP!!LjbF1XNZFyh*J+P|RpUm@ZbVZ+c)*M{K|Onph1I;OwxW$-BeHMJS~ zQ*lknMykQN#P|#@^m;MbGJ@WWM6d9&Kfi-iNZXSknOr#5VAs-C#hJmenO*4hVj^V$ zy;-D*#GjNXs4bDQx^S!)6Db=wHk%8*UQDFypf|fTk@%AX1+*nn4i}C!m`K`ok~zV# zIbG=WVj|@Ny}6``6oREKw+qL5F_H3sWAnJs>%~OM3wrZP6Db5sTRs<#^lAkS05p%r6?G9DFD7F#@IWyadcBy8#X)azX)^LB79AvGbzR9=0?+4F!YXR+AAsI`%2#yz%u?%>i zOqA=51--E@^m?)Q%7Wgq(&FR$TL;CbZCg?f(8>wLSKdW%yjXnKfd{UOa=q7s-s@fH z^?MR2@WeDUCc_$b#~3G`NSq1TJWR~htHmKI-Fww+Y~ zt%^{5Rb2$fi^X>Xc;E&XdcBy8)j)4GX)@Yu!_x9KDb-y#){BW$0~}i;%JtR+y)|9v z^0N6;5pzj`d>U)B(rVaiQ0XiBuQ#)|Dob&0ah$9r#8Uj`d<9)dR=Yi*mj7 zL2rE*dc9aU4M1-LQ-#yeg=4)~IE}!uja=yUVj@|f*ODfZ%>`LnI&fnbj`d<9H37#q ziE_O+f!>>3==EaZGzGm)O%+Zv7moE};WP)wHg}=dU?ORI+_VMgZ6Qr0n^TC;JfqSQ z&{_&dVy#>R$BW6>8a&Y2g%~Os1di?GLa!GSsWa&9EKMYvB{nUI)WwBky_iT{!LeOk==EYE z-3EGZlO~eQ@|c!Hy1jqk_wW>P@Z{%7C(p!p14Z40Rkb@zUA~W|uK>COroKa%`c4<= zWUzd+EpT^%2kvsA*Nf%T1N8QgmQPml9*4sxpqn|U14r+M^aQk?LNfMp5gacjV{h<4 z?*9Fv^k&)NJeevHJ5Q=Y{i{N;%_{M_=#z(o{2SM+HF7$e__#Ohi z4@rwJEZeXYKuZydZ-R^9c(M2x!#9C@53(ida?K>f!;~d;tR{Rb26Y!7K(3* zi{N;%_#OcdJmNyH7n5-+=$$G}Mw@L|TF&RExp1r(6X{WK?4wbx_c74>mn2ggo#q1TIvGz0X`kS3DNUOX)w_(>Oz^an!C4ja>D883n1jmcT z_X>F66&HHFn2fK2-dEF-jA^+HSn9&DUQDEA;MiqRuJ<+2`RW|;ro?R?PR}lIOw4(|8UIZ4+lI2sO`1U72wzvQLgt5 z(EElok$6WbFw%n^RSfk#|9`qq)YKi zP`pyu0KFykL0H1G3Sd`7d8ND!df%3YBAU|i9Z>v^kdCXPJmzb_18bsO@4KM)U1^So zrQM_gTB?gs(4(YO_MIKR1uH?=OPo)PJDj-Q_eU`)qw~kmJxb6*<{!>*c_ZSfCFVVF z<9k9)uZ^6TuLIb1E@JM*&F6a1yWWM~t2urmvFnuPXJQlTzYlJFU&!$dE*$H{MA`@* z*cjz{KLEWS5WPZ656imsA)tL|9}4~}<>~!z?dw)XFRojgz>S-Pn%*2aG2a5PTkK=b zw;Nt;Hy?rCkL>kc&G8Gd30Yc*WU&7Rf9ef+1qp81wslO7Y{u-vK}xu55Ux$ zbvgV;nEFRy>Vq)#C0(iy!PJL@sSm@{`*clx1g1VBOnnrl-l5CkKf%;L2~+SHkVF=6WCF!gy|Q~v@}{~}C%0;bNSE7rfl)V~T-{{~a%);0C-F!k@k)F-8z3;rr8 zKItI2dz+%`UgjSF`-d8hGG1}i5lXaEfObmo<7qW)cKdt6+WdG1V9!X=C=q$ILLOo# zwjzU zfE_i%0NGs$-pNd^Dj5MbqZG|%RS9?qYOsHKm=JtI1r_E(lW> z6s9gD4H3^C2O-kd%?bl-VS=XKhx1pou_RsX!*jp|75{J+**?63KRD@KYKnl~B0_MA z+It{qF>w)2u0*g&@DJyedEl(BtMp>vfntIOic8azUqNBmoj-MryQ30Nf~WjZPH**J z0~)UpG?tQT_)X+%$5W9mrFOAwxy*!pp}=R+2lch*R=J(>j3RKA!)Cd!nz5u zHb2GzY@8G=EPkv2XcYuMR!lc+jYRt!(2lM$;{i5aipJZ8gDTec7EmQXt0efbvJ^HK z*+d0D0}d#j#{R`My<4a%09!?Xtx90ko5-Aga=NX!qAT-VkpEeG)nP8xFZ*zj%WIzM z!+C=3K#Kip6sE2v?M%FlVxfd`GgKR3Yul$YZ340m>MEV{ z1}o^$Udq)0y>*1()Qz0r+z7BYO3`S#$l@W%8*SUcdVp3>@MC=`Y*>=K0l+qh9JGdj z){vm7_W_=+zeb?9k&ri5+%$wGL)>@5*(U$BQ<~VpF(b0KA8$fF#g!pDPtjQ3!1=zM~G?O82 z2WaioXeJwK0-zF`_$aFD;G-){-Bpxp!HCrnasYPfYy_sg|L_NyAQ>J9ac)Oh*s&k zBI*TtdkNLnTOAyeDcuKP`>4@OrgS2pC92UJq_nmk)fdqErW;M$#acf=>qpR{xZ3)I z-u^>bqg;yM?KTs`J@Fiyo@$hBoBk z_FntGz)KsQ%8#TKPfqX;Q$zO1i~qT4$s;fPu{CV!d}e=B2{>Q2be)ur0B4O5B0EwY zS(6=q6u^#Bqd7=AZRhm&0or|PG|V%}VYoK5(SSBuipH-&3d1#s1nq>bmNy2_#t7Lr zRtn2Y&Sdu853u*E(M)FF1Az7bK~ry`xeGBBdE<%JmNyQZHBK7Gu++nNKpQXA!-G;- z9!v-Ipl!eM5Wqg9M#DUl^c8JayD5N{B1H>Jh$jHr1R=x|rLb;7tZnId7+@b(qd5q% zHnd5AHc5&WmJm+{w8=tYy_7OFj$q-Kkw5bG5y{hpqGEK`DaNF<2)B9z; zVM)hn;Kpe}IzFn7xr0STTUkE_u#eftoRrh{(W!@>7_I(nA)1%Q1)jYb)-xCy{k zU?*Qs;mhU7_$4VXg5np|iXC(SZ3jE^0d2k-4U67+FmQXYKs}KIA82dP3&95q37WbK z(t4qP1rGO}bV2*eV*k@gk_6`cCFqOQ{OUJ>fyRVl2SrB_?hEd|)6 zSCcMy(k%mLEtAGEEJ^nopuHv}-Rn|VH%X^$d0h^$%hhNOny@ys6@a$lYCQz6hd01k zZ%E@9mU?&-(B2g4VWku{EcNgfz`mtMb5IZ3t_D^C+N$WN2PYScczyCVJVM#i!3NsV zx6Hf)K7L2Y)zvU{HwVwAIhuM6Oua^!`dxJ{n%ujm0&J=pE$vsP%3}ft)u(ND_8usH zPYBOiwGT{&XC1(2-SyW}MRYOa_wfaMKyiB&mO%Sh5 zk%P7w&^FtrQqWlOV@`h;k+dK~%`c#T<#(`Ea@4=JfU~v;{p+L1iR@N@-5NP)+W>8w z8qH*D-41Bmuhv8Gi~o=$ZSlcly3V0Q|zU)mQReW5F@_uTlt5@qw1EcfMiO`Ys(FeSfAi>uQz z(bx8F;z}_axl+Y@C_zu}_=hvgzDjP4u4e|Q|ID@68N`^eI2OKW%HTV?v4>$0@S z8Pc-b2OiiLIl=i3(7qFbvtJF1Z7`Hi@O}@l-`nSno{kW7RZCZ|4{b;I0i5-N5ZMEf z6WJdD_D3mN&?X>BI&Ev_K|nhw`0)_zn9Ddg<#V)SJ`7VI7N$M|Q!mi9Sw9L>9~Gwl zNg5))h~oDHNJ6A-@9;Cg{%qeDI452>@tuPI-6_dVfv+b)w;77Qz-JEHRI+fw>zEMPJyQZRKEi3ul7k5v_J8rN>^S;zgc6quDtjS^!_FU z=l947&Pjkh8RFpZZA8%DHK}-})V|_F8`(d=S$_zTJry~TJq@s@?IRoFlZ!mEcAUpS zPjqw=eg^cO5rT6T+VKPzYF0oo2_V8p><;oPd^7iWc;Wo1vxUUQaIRM0_1F8J^tWgWPH~ zJU9qtc=7;R9yOZD%*hLAd8KF}$eeuAiNcaO`N0SI)o3O&rvRW8P@|d5oPvN>Q0U!- z)UYO-Lt%g|tVT2G$0C4MM2%)L`-%cuQ6a>|)UYN)TpVDF6EyXs&%E1Uy!9M4`p+o? zZdPkMuP*_5O9;U!neO0dyBNI&V6Rc5IY@GCXr%zHlo}0FMY3MiA z{gnaOGHNsjA=XwZv49qZ z^=dSeg%Jm6acVS^g;4>}DhSzEQ4MRdRN?_PUX5ll`ziriB{iDK?5hlDmDOk_v#$!E zRZ*jv%(be3R#lB=GS_YZv>Sw)t)_-G>Bs5-TV0K2(vLL&t%e%SWMR|mgh8(LjJt1Ct0uifF7Zm0b)`9|qP zVF^z?@IgH_n#u6g2ekTXG25QTtCg6i6k%M*iu>`7MBU3qe!gNebHRUEN8-%U}Ls|D(;4 zC(!uASw+D^{KNi-ssoblqAq9M3eLJ!NV@j+?&BGVmC8l<@1?0cKrczIxJcq3mc9?X zT$cwrfCoCLGZ}*{$z*Ls))CM;s?ki=e!yyZ$)xKJu-(;YCX?^)##If}BguN?p4 z9pHh*y4K$w;DH|Ydi8AAu;O@|ak5=2=4!h(U00jw3C`*nIhETB(0U1(+}l2~_L=NY z#x$(~q1{RL0T1-C*Zbei8u6F?F9bm7Q zFPn7FE8FTSIu%cjplgsnIYP7MCV}20d%YYv=rz6{S=E_?UgP_n6&k(Cpf{Q54gNNu z$qny7KpQADn?Wvu6ZF!_NpON5L4`IrgTVuX?e%)P_=bSqA@+JbU3_^2kyCtQ0d1^MeD~W2$37Vqosma2=t|(2M7C0DDQKQ1GI5!G?SNS;{k2FkT(y)^B@IuJrD8_O#P5Bb&A?gCPO#@ zU?-^2um(bzT@wLqB0*E%$KQC`?w@+$wiH*l zfrFmf_#agX*vn~qYVQef))PWKOjk$NWIfCP*cp+7_9UP^sYWwd4>JL6rhPs9cb~qR z1tF6HY^vN@{#yV}-f@hWJ+7oD@#bdr6@! zoCTnF0nr;7_mUO@+Cm{27r6+I7nAWN@W4xv6P(3>wpa+xk|+<(%iw{Rqg?MRp!XFQ zdPCb8J+;KX3T}K=D4eA(92>N&`Bx1|Gq>NX`S&gXdo^v3Yb*l~EOVhZw22g;SKHq7 zHPHJS(Hj{{?CXH`x{!>^T?EIA$+!YMu)>AjpvkBxz9_wLcmv${hLA{ax^S!)6KN%Q zV5JMaX-OpB#e-frgtm*n1$y5idLyH&tpc=FLNdPXA~->l(aBX^n2tl<0S~<6La!H- zaW&{&9XZLk2GG_B$@s2|-~>%Z#gfB2MbKmnZKp^D52Qv;aNYy7_k`fAjq>2E0}rf= za=q(8?|K({gLXzID?!j@+F!Yzx{7@t-1xpwI2&9zHfUFK;@F^F&F|RIT-9v^4{Ws8 z%Nudf=e+&Ms-0BOI}Uzlg+}iOp!WlNz5H4yw1pEIy&ru*XjizH6YaAV8tqF82YfYhJ zIcq8%%Uh4r@j7cd9j~`$(=pDPOUDYN z;|osKoEPw80G`izdXteteMZGA<@I@T^a*0sK+77S zw6t>4v6YpNj;*aibZlc4r{m35NjkQ*O3|^M6-&ni>pD8#VpXK$tyUE}wzq1~v4eFZ z9XnbL>DbA#=-An6LdP!FO?2#PHKXHgR&zSuZndOiH>))ryITo#yu-Scj(1ue>3Emb zg^oR}ZglKv-ATt@RxdjCw))VqkJX=!iPk_m_O39A&*v$NQ`g={VZ@h>l~dkLftp`izeETVK-g0c#f>$64RfalG|C9UruQq~k-@ zVLGOy#Kgo{$Cy2V*uOD*BC-Eq_QS+J&Fo3U{)^d@iTw|=rx5!hvmYULOn;I$DN~7^ ziP_VLot4>-5<3U8A0u{dWs!tD9PzMa_%h~1sp3yFOvvlkJ&7qed?c0Xn>CUz3Dmk@g}vtK6mFlN6( z>=Dd`$5fKC!=G_6A~q$?T29{+ihz5PKK1KP2`ZW^W?)x6Iy5?C+Sph1lOS z`y*l>VD?sGA7u76VjpJqc48l8_Q%Bjnc1HZ`#7^dCH4ts?;!SX%>InnCz<^@u}?Gm z3u2#T_D*8|&Fn9UeSz6u5&IIezb1Bu0kk&1A$DeF?;>_KX746;PG;{Rb{=N$C3b#h ze@pB_%-%=rqRjq|*u|N>pV%ds{XMZuG5ZH%U(4(R#4f|^ABi2y?1RKE%j`qMzMk2K ziCvM|M~GdS*++?8mDxWLyBf29CUy;GA0u`xW*;YZU1tA6?E1_;L2QfJzY@DCvwtIY zOJ@I0?3GsM1w*=LE}o7sO7djPZlBK9C=|4r;6 z%sxl#q0Bx{?0cB~53xrw`vS4YGW%a*KgjHh#Gc6POT?bS?3fHb`%z|RAog@-XC(G4 zW@jSy9A;-G_B>{1A@%}hXC?Ma%+5yaSDBri*sn7?2eDT&J14QBdW?xI}Bg`&M?4OujhSiP`bQ&PXp3QYsNU3$rT| zJ3F(h5IYyMs}egOvu_}FA!b)2b}?pGCw56@*C2LjX4fQkd1lulc132_CU!Mu*CBRo zX4fV5jm*B0*bSLokJycwU7y%ZncaZcEt%br*f%q~5wY7b+ah**W;Z5w7iKphb~k3< zMC`km-IUn9nca-o{g~aH*n^neg4n~D-ICa&nB9ul_cOaSu^(i18)Bz0`(|QKW_DX* zPh)mFVozsw0gV0L$6Z({Zx#QrELA^t*QmyGe}65AJS-6cbpnD%8- zGUs0q(>^xkVodv5c?J|LRlQu+oEchV$dxNozWlyo%DcGWwar@QEt)+hU;B)YC$`U! za$}vCn9iN!zDa6T^{b?+JCmw@o>X;5Qq@nAs%}q8XkVan-0q~f%^lZIomf65Wp@6U znAES5d>c#hU7iUwegCmt+@7S=?MYLbAC0X^{;yr!UP>5K)Au*p#qFd2lBwpDrl(`u z#UD%RoVthp-Rg@99*Lz-H#htxsdN1A>@!WtUu&={DgIp-; zx3UA%{)|t1-2SAlQ<|U69suV1FGph&s`!3H40~a~=MXv*WzS6E+r@p)nd^WW*`M&| zzI`vn5kICLB$)KSrtT%|vGvZ7ADH?*`Ijpvia(RY@Xw~vg@;@@jVb=txtq9?3B7hV zeM{VtdWbtKw%%Vs-1OIFH~sB%(+?4XA9pk+LG|4yAKOaQg`6TuiYE8_RDW*j`mJkjA&Q)K7dJ;zF$NM_hgU`$S9~Is z7j){6{3q`7wXD;=pXmF)1b>h5Rrn>JM-Iz%q@lu($bV9xM{K&pPf3iQRr+C`$GNWf z&v{di{QtjS!_wg=k`DDUCSUHi87}wRjL9tYnUXt`D~_1|YwwcT_a||`BsKE=XV!c( zSSM){&S;%tJ=;1<$IRB>bj)I1pkr3+5*@QynUWLYeVsB>gJVhY$CG@^(5|GkFGKa% zGL$p9Rn_dtRkJ2n&74eDpVaKhw88m0UYUA%ljCwH*Yf>)$|c|b=vvSqe{wwk&l%X? z&Ox+h$dsCud^89BYw`J$Q!|r)P0daIKNtJ6oK1apgIviz^jyhlN3YM&OZ(7EC08w( zT(x*|)uPE&3ny1C$TSotb2coS+&TXG)SMbJW1V;M;cru789_{thn)inJ&m(;-8ynMwNxNB&ot2S$c zcWSExXRT3BkcE}+#FYV$@Ztee^#s%x>X2e9?jXbx&q8(Mupt549b*5>6M zeFN}L19jj`)@DOMYbZqvOKmm+v_?X0T2feEnpD(h|^G zs?i+OtTwb(fYwTl=AdS^p|u9I)@n49HQNTz+6aYlvl`Z9VYCIk4RHg%IBc*)>8}cHItB-!4qu zP3k9Jg*o8tiEYFKULR!llcr866p-fa@C?7ZbfU1N@g3lmJJe_QdbYrtTw5ok+4HG{;DEt4Dq` zZV||T^SzElZ}6t2*!rq7+CgL1wpH&34(_K$bI_Qzq4fu}{%SOneP95f4G_{YNeyc< z#K{1gOwdA8F=4#%I1p40R0qIhwhRKaK|;0+R>L~T7H!+1ApkohblKv;TWEKKckWgP z&SaJi1+<|;mJL(GIyl+TmSw{McDNeNWC7d*X!oem9IS}iyml|3-K$2!ZA&PR=|=$C z2sN6?!Wao?BZa~krG_2=unSEmcZLE-e_p4zY zgjm~_`vHJ`K#k@g#B&^6ggScUbsV6LQ=^#-@pwQRFNF9(HLQaMqbG6~&&D0=l?QFAXDKmH=ybuKkLL5SFO1{ouLVLc^q^^EMl^G4(uF&og=``Rm0-iBRTle7W8KU_E|NW$$Wec z(4JGHVGj9zWIPQUyWum#0vmz zffS8zPE5XSyAaS83fZ?v3d{H14zh2WuD6X|0@#<-Xb!SZ8`@$(TdYPinSDzDZHW{u zEZO%mpuH?)-z!pBH`%AH_q__RuM#x%K?CQ+RJ1uT2;*}NOF`vQbpT8z@-jeMCPfQN zBEJS`uL+6#x)e5Of`oE2v>afU3$QEHunu~@wyJvrVBb)qVWEZ6k8c9nn`$(ZrLq#x zRth10OARacqmzdZeN8d=m)4l{!7A{7bOP;psmlp2e9v5Er8hne*xE8@XlIw;7k_4 zIzU?|MGH#-tOvC9LIJ!lh2;g{;9yVN3a|lSH>lC%3v|F8D{W{S0d1oi&B4K*Hna}_ z?E^KMgN~*R?L$EOP>p7?W;X%aCMjB2YIZZAZ5C>Fixk#P&1ze;J_6W})MyTBRvX$@ zK-;QDb5OI|(6#~EHZ_`qn$?E39niL`(M;Ct$AI>+P#B-6VNLq+Q-J+cjpksT)fVC% zfVM-8X0m2K1GLZ7XeMj+b3prCjb<{}z5ui@)MzGiZ6~1ZRHK<}Ctm{Emr}H_YyrLk zw6BCt_cgr#JKMptS^TNHfEUx@i;lm6slO4X-UU-Xs%z@qF!gR>>OImBg=OQj7hw0Q z(M-03ZvpLFHJXEVpzWQ4eSo%)poQj;j~8w+_{s({o%H#}E)Eje(Icndfy(dH0WjJ0 z_5<2}p~k*f!#cyptXljgiUfhUXS!0sB zAJTiOWBtFWL-BySqZRuwOnq3G`iMF?P1em(fIX^4b5J+h zy3J33_EWmiw3YPFfcEp%k`DSSKeYXZh-2XNV?tdWS7(UHy7~oRe^H~Etg91%c0!6q zokdqE*sihX7d*8X{0fSHl`7_opvk8le*?7Ngrxpm3d>h|lSzFNU{4Y>^-d;e8qtph ze?g5u5+Hj)Ew_trp7Ie!#={?ffb;$kB7F*WBz+vbIqqmjavG*SElhnzon$84(^-H$ zD@6;MR~~Fne}dvah4B0(^#R@FM@ftR8+`D$;DdAa&4xEc%vYOc!#lsM*+`Ejw7q(H z9(13VMmn0Z{U1>Lj}Yk#QXlZ(nq2Yz1=xS3Xwej&i=gE1Tf2?9dQa zIJl+YXiJ>~rp_TuofD>>r)%n5Fm*0r>fGv-cF>EoJ#v-@VDnr};42b1FL)=fI&da? zQ9eM+CuCWE;lC76<2!h8Wq^Ysan$7t0)9aOwotlZhv|YX46ua-*dl6J2NkXDSiUI0 z7A0uv-38wzUM`9i)csjO>PQVhIWOdW8OouD|N6&JFz#MKmtjY(15 zH+0mpN`jwD3VyyuofHnbfVOqL6u_2JqhTRRUV_wyb}gV?t470~6iT$xfL2Vu#gh)_0%IDm~)qnXT{3V>EYjfPJjh0<#k0j;7M&16fB2ef!0`zonnP4=zI z09#p&W-|M#09q9_n#t^|3TRc;Xb#p$ZP#fx0NM>|G?Rr<4bZ9yg;8A%YtoN30Jer2 z%|Xp-3vo?AtEonFP_x?5Y5`g;HJZuns|{$ih3u=NhINpA+Ae150&HD1nu8E)L%R{s zZj_?&2YGUO|2eXHptzopIrXJJ;M+-)nbQDZ8>rDt_N|71)=-URGN~H@S|cf1G$pkK ziY+0j8^fKfH4e_b9oWQVNGsu+5v1kHJZuxl>lf7Qna9*Cw(Wa z{Ktle{fhvi1Pmo}j50EzXJAdFA3GS+xE`cg8z_S39T!ZZbPN z0$N8QJ3Fai9kferCo-J@wsYj5bpf<4_JzZnoNCu5DIESeY>rp%5(6GQ&9CbbkFKDy zt2zKC6ZtkkyG=;s+tsiR5?R~1Q#XL^7CC6$0j;|l4V%8?KAE=izXQd8ax6CTr|2K)Xw*u^wtz>{y}9mYx9HQ;lZQkG%k`mlTaUi>5c621vYiR@ZL> z=?!STg%J0V!t!09$q*+3Y@z_$7Y^UrJ6H)Fo%{8Jsrw02_m}#KHzaxEbaF_8uk8!~ zjZ1ZDOahHbg2rT`QQd)yljN0UG5K#99K2pbf4~*b@X(*-;_Yd4*FbPr30>|Q1nwFn zxN9&>JyF;9wG4r&hX_;OEzL$=wGJLQ=;7ep+R;OzLjiWE8jUhu5&!g^EO5mpw|m1t z@i4Vw2Q5_FPINe+4OgS3y=(azMPz)5!9Ae(9-&t5Rr|nXt&9NJ5o$E~tE^5I6=itj zwUX{1E6?+E|5&{_n#sR@(Um(*eF#^ek?J6t%&$?9U!&A$SM$raX^FV}Qr51?>zex@ zo9+`@>u7a;nN0mL06RvC#>>Bm^dcou7;a#bc$4`3~v7+Me%MyTxRV zJ^&GWK#CSkIXVs$kCQ6?&*f;uwD|E5pYcMAe^4DU2MuquuEVT{0QMm@n#sye0kjk; zTBs}gzuMv_NWIOwipdsm3Vg6^sIDmks} z7OVf82PG=GcW@E9(mMecLfTYL1C`V4RdQOq`oEG^qLOS<8a*rMVo|rt(El`J#}+^X+w;%VBM`y8v`Auvh89=q?16 z3++|%SbC>Y7lFz}LJq&=LbrGN@M6%tI4V^x0hLSaRhp|*ZT;wFQ2DaGN^_N}P30?~ z@)e;{Uv;57eUjvn|*{k$mrM?a-Ul%HMxeMJPuT*XO z;T52JMO3PM1600YuhLwlYK!HYpz=+7mF6l{o641-a-~qIZ@JJN@=DdVrmh0rtD;in z+o1AodzI!YRa-3I0hR9%mBQOS{FxZMG?l!+x?0!G-_?M&+C=~;@D*=(IK9O!yS49s zv(d=|;`n~Z8hd8m_(I+Qv^BnWAu{hqrOH%LnQE`nTm#S+%lAO#dqibqG=Q~$w$?=e zBBcSWvuE~T16U7{Ss#@u-v^cN+p9F!0JQA@Hh{_vL}g?&fQ^8*(M13vr2%|k&up#% zXiJ(8Au=D@tMp)LYyy>=BBwMq1KMU60f>~+*kaFYt~9i5s6K+od}OcETxn=ixfN7y zjhxch258${1RzpMW4k@G2TS8)h|I_KD$SLKwzcsSQ29yZl*Xrk_Nj{iL`rGwuxB<` z8rqWPGlOIlJ>bqgQK@n-sN8F>l4nrJt5(~->040wt+X_FlA5gAeSo%4ipG7euWG-u zk2H5k$g5Ucr1yh6_uH%FzV%K%e-A3ZmnIDlpUHgw0nmPsqH&+=%jX03k>(Bwc|L19 zLHiNh`J=r`?%R;(vo@6nLFGYd((v$^%;!UZc1ViGeXcK`58FqYJH$Krd<5Ki#9k%$ zZOHRk+bVPvR34Qk4G*8meEtd0ev+bbpXf9TM_<))whw;Lc3PU5wBMie3#j}>T^ecs<I1fkTfc*b^+O$8o$<8W{#rNlm9T zJssPiOmch%dzBt6jf|i&qrFNGmPRH}nTe+%ZYmLk<+!^xH&~|v61>Bj%g-Y)n zYi0$NSqI@EOEwp}Lmpji8_DdTJG%>&A&;&$l{r9V4k5ZZUFZ&ZbhXuPF3_FJh02ge zSDVV*pfa}$mEMVE9#EObg-Y+lGB2piD^zMe7rH|pU2PpIKj_ZyLS@LKt4(DAP+7o* zO7Fz7AgCt27vb+%8>tKOz zr)z<~9;Uutm^#jd%R`=6+FV`%bXRbp(mRP&5mZ(rDuv^Be)pu1w&xk*UAWUbNmB{j zS;>V;?<7rSP+3`;H2h9~L2XG>#f3Y)lQdPqomE|^^iI;;04i^gCJny_UO-#YRCD3Z zkSC3{{a$r&XLT1Uy^}OGKxGYS(u81ns_DX=-btET;LchuRC*_AYJIu# zJH3-Mb-|r=U8wX<(%c9tZ zS6DWOodB(qP+px~gv2}L)dh5SaiP*XiPsfWc9kZc&9*5mUs!RQ3wL@aX>JF1-X4`I zyMfAXE>wD_G`fSz?xsrP4j1n9PHEf;?!425O7A4iU7+$VY0}v2lhe{qd$@3?cao+j zxU*+es_X?Sd$~~QozmzHDtntMjXo~i>7CL@1a~I7Q0bkd=?g0RN|VOs!YD2Mw4V!i zdM9c6gFE|2rOE-Ia)1k!-YJbFP?=<^G?HDo(>tXx5ZpP?h02g8jkbp$2Z72#(xkDu z-Ve=l7lQ$9uyD{c#6?KFlX!Q7?z>&6^iJXp1(idkiDz?R6p(n@p1T+ZXv2iW8}1?` z-buWBK=(Z^RC*`z?gf?iN)yj!2N{rf+Mc@@0cazH#2e`%Bq2{cZHv$-&^^k9%8)0X zwg)-y1C{ql6VGO;P0OXrXczAEPST74caCwP(mP2r7F3RvCXLN9nUkNg-btG2;Lhn$sd5IWoZ&*HcS_?)Q2C^((wOPOogps`ZHHI0z@4*Ps0?}1 zXj3^GRL+(rjm_azz^SRW*J+*tw5NoH{Am{<@lN7B1G=Aaq0&2vHwRSCktUwa0a!rd zX}eD}7trPkiTA9Fka#EYo&(*_xlrky#Csl8J}*r?n?tmK#M5@4Xda-=6B6$Q7a{RZ z;=KsEUyMqX^Fif&7b?9|UJF3w0%>`LWkazL&=v~iwa7(Cyi;B;f$o>0QsrV$x!8qD z@08aPP`N}}USZiby$onC3+45Si;#Gyyj}&}uSTWHrJ!=D3zgm}uVtWenY6sZvN?PW z&|VYD>vb0)@lJUy2i?nEsPs7Ar`6WsY`RH|GFDp$Ht z>7CMe3sk;ksx(%)aHn@l<85%~+b&dkCu!aRmG4NC#%7%`5Kl-qdx+)kA%eA>LMiGNxW^Kds|eh+zu+YyHM$!^7s{962 zej`m99tP}eHEG}i0?@yw{kyA1Xq#DiS@y#EA_J@!yry?m^ zw0*t8Y0!OI9TJnP`58bvqee5CEoTAktdK2#!lN&{dfA_>@=M@U#V>{b3#R@{nEG#+ z`mlrVg>y9ZIhgvKF!gzudZVtX|ADFh5vINXQ~#=K>VIMCe}$X-9()4s}gEGnS83v~oOeX)r|4T-g`cGY|Gr`oEgsC&b)L-hF zItxslMVLA(Oubo`!?VHE*@UUH!_=2_sm=jY=MbjO2~+RWHFYkSI+rkYZkT$9E{ErV zsq+X^=Y^^N&^2{Fm^z;@b$*!oysoJWz|;kVsSCo?nRLav5KLW2n7S}bomx}p$f#lw4imp3}#Q?UL8jUhuac~hzwBmqPT<~KFHEeeKJF?pRSQ21M zO3^40UF)Q1PHrUN%6JW=@iG5n&oh08W2vQ*r!>D9>$^z37@Jx$dFsUSU48$s_*I!y zu53(K-~XvLfY*YoYlRq;CPJwsmJ5>OxuA(nKNkF%4(0W5CfPF`+8!w=1G>vZrOH@P z87oa%evi*V@oNh}SwJf*Bwo3w3`u#=T|RO`avh*uCxqns$bpRm*f;^Uf)tkbDwB&x zMS!g+MYCBv0xr!4`&WSp!B+uC&sN0)TD;)LN>W(vN0XbG$^ctgipJmNaL~`X>+)k2 zK&vA7v8og{EPlKJU~iD3@qBdP$3$IztOjV+1V2`n!g4>Ftm_&8TSJP*{pg@nM(Xlo zO+c$D_^}pjEbI8E*0Qmz1M}Ar=C2F$AJ95~J($0qFn@h%uy`Ih2$r^siv|GOfS{@O z-2B~REKa9;?i_H1LOz#8w&(8Pk4t)&nuegVp%9Wr_PT=>lT+Q;AIRtO%5@5RZGKDu*aRtBSp0Ykpxq+)@z!+1)=0F!vFzxw zvOU1Im!k1@;h>7Oy<5`(&^icy>?noJ<$nlKzDflYPhU-G$J!9T}2OG-Xh zOtvCt)|Ka7AU<7$_;j_8PteSAx~Gl0_%zTJpW7flw+ZpN9k#^H9Zc=$0hewtbvI$^ z?$SQPn<7?0D7Q9u0PG$1SxbwXW~ij<{BPu{xIa0W$3;#yj0f29YBZCL^Fcs+P>p7?;2#3ChlCKPq#IV-?YId5J3)-w+xC&4k4viKdW?I{Y(axlZ6_aq7I44M1BNdA5o*3 zOysG6HdT%0Ad$6orfGmSE!}9^F3cVUv_}bA)YaHypz<-H#vWIP#AJ;<0kBV~(M;CZ zbU>RPx@=LNN9729j^)0SuhZ4ZXMlHR2wCmP&w{BFbWJ@Qrk*WK z{ggU^9dzQMy3Tr^2H2<7XeLjco&mIH1V7GE!6TG1L=coZs zo%o+nmfTn7&x>L2CiD3lNWfD%mafyzXTdwq3ZZ;X9ZHiu{ds_WUXA7;%e0-f&jYl1 zYBWqN$$_>uv=;#F1t}U|j0(eLg#_({t{(RypuH$$-+U=7FEo?cw*X)lsL@Pj-$FoJ zNYK<=HE^CYGd;XuE8E z8PHyqqJ<^IuK?OBLWp0L!nz5uwzXm@z%EszIS8>fv}J&{Oo|qk5Wfa!uL&W3T?!kP z5HAPVGIpAm0Rxges679lJE_1-Wx&^zNwD1gQY}UF|P#J zmG+V5#ex|beH)gyz&meA0~eMoTLoyVge-eo3d^HsGRxip*mu-uCU@+s0d2J!4Rci}(?&;r*>VcoPqZ6SUiVBc4xnasWofVP34srw9fA*N#V?EyA|cQ#4`7nTC}0MI@V z3gAO2ERUXp_S?h3S6(`LoOctzZc?LB#w$+l*+T2&?SEhLM#gXd*bIs{s}(yad2Pou zTL5i~8V#%5c`$H4@R52V2R_i&k+*^mwh}aT+oSbD{|cPV+q6C9MXvu*AxYZut|EIY z+5a|k!2PI-4sOvpD%Wk`oozyI*{%+ygWjTTr~EO%eym1wkY(D?J^{2(u4Y+mT*2ha zzZ2zC@Xn{w!0|FLc}r{upzRO};4>+#o5fXImVFMepI^;c$4YBUE0plwIL7tr>4v;dr3;o(KaxA2@|PY0V|N8i7)51hJBNY3wI>TV962Xi#_ zewcc{F!lH9&a#DG1@1WeYZMY7A;sZi>epLIwWOxn&>_I6S|2o(x z2+tu2ChEA!#=u zZEpc>D!+p*kfS#B3wY-jp-r8LoKXG>u)jtQ+HZjNn;Okz2mKw;e!p4(S6sHA1n-;_ z3g8cQDAT@^!+w4Wu5-pYC~`;FIj2G6X+h%|wMGX^iMEUEvjBTmfc;YqYqGZf0@%L< z*uU+ojlKw#hC5z-tB8up&&qxI%`GSU6->l)X>o8`COU8L94-=bkUA{*>uEs`+Q{cJ zU;bRcnmR_;UHE?>DgH@|I|IFM_`=MouU%0oo-YlrckWFUV<8(Moc6vz_mB>34xc3girFb!8YrdHJuT&OlTK ze;5UOV<;ac%?M~2hhS&Tq=v;F7fRU70Gru9Thd+l7z`T8H1_b&7Je4+P8K1QStBQu z*#I`16fJ12OR`McT9_TsvI~C9F(mM}*_Ux}0_SMgn-iwaDNLOUre2_H!<`$Z&Mi!x zM;ao&LgKsek`QUz6XXThy!MTNbK=DhDQN!-MUt+}mkrs@LGfMmd_GwN$tqiJ#_Rg> zkbK~sd_pMmLl!0JO5g%8bpc`Of{~L&g#fmYeHI06NH)uYG8?4dAhBClHWUVxg@uq5 ziJXuW1=ymY3klyD$bMa+;^E6MhO!uVrFOubOo)UhyitT1(1n0l_R zsmsCC<%Frr!_>=kO?@3qeVs7%_35sBZO5T;02^mt`Mjw{|L&{;c&CC8%8HQ_%6Nc{ zw-04nw@4mbk1K(9DhZ*i966z^0jiJ24 zt`2C`rD#Dfju~27?yuC4PQ=#-li{feKB%ci!wdaThNl*w)l#FG%$(YQR$Gb|g3PHS zohU4sQx|+tSB+*eb8ZB*8`WqgGp8P))f0MmeKoAf=Fk9O8>rDt`mrIPHB_US%)Ul| z)<_7krG_;b;>G~mn4r;vKGxbLr^US6V7$|FKIlJX4!B>e?JT_ssB9vHZh+QJjb^f)bO*HVLiXJuh2`JoQhF=iP(9&{*+(SB1Si;j2e9%*kW->gz0IioA zO&*?rBMEJp(;Luw3l-Q$4QsLj69G0+jb<{$eF3en8ciPJv{Ya}^+XQVKyA6yAAHb1 za?l0<+5jmUbrwB7g!diN-XN2t6NRNgCW8->BL{6Dpbb=`nJnx0qt%znn|w>1+<|;h=;+$X4!Q;Y&IOG9xhCMkJL~6=7)pby0)|Jdja-d zHCicY6AjqL9MZKn9|3412%7r-QP5`Z^!^cE`I681pD&l(ui_6~6$QVL&-ovM4)D%J zUEUc9-We%m*(iH|@sz{TwDA|$O)o#LxF8~*lfG)ZT$k?qK=*y>gvEeLuGqBI(r7>% ztwu9h=3@YDj2g{knU4juu|gu>uZA`0#|HrR0X3RQKaK;maRiOlG0S;L`^rYT7Wpf* zo}r901b<7Dw+*Z=^0WMHPck2G8?tuk|N4S}cA3q=`+1IDG#C%w882kngX&P4%(907 z_8~Qz$t+6&w3IMsS!l9l0;rrIWXnW*-O4IaRF|?!qz|(!*0s1k47wk-SDEfD7Zw)j zAx^ej#hh-rrt9hf252Z3;BeTOk2D%@MN|ld;%E#?h@>P#+N?|XmXg)j#Wb24O2Lg5p z+E&XaK;;wmDmks}g4<84YO%5lZohXzqjEZ^oK92*|Mne|o6#A7HbZD4Pr3++>|(}A zNMsi?p$*AQ&^^;$r3cGv7O0$MuhN6%H5*jUj-2v(3ecVs%Ij$tA(54rzf2?zg(s}6 zyh6LFdg}E1(kE{RdQO{8ttc* zsN~*}tLwGBVca=K$?Fp@}^2A|&2vBJ)7^JbRTqfxJ^*FM!Gy>{WWO zyj}#AFGfyz%?GskLU}E)4~a7I6djL;Qr6e~Tjzj|r|sHnA?RMH4hi;+P~HYy1Za!Y zXeKY1UIMh2glt(1Pel~a^;E4bwlA+4U-*y-Lv3xA}OP zdS^qk6jUx%2f$;f%FCn;0J}krW-?ng0@_Bwk003Q z55J~Er;?q3|L8?>2F!Q&vYmkcs3#zQv>n-e2)aLXq0;4*EB6lePU0Q^QM{8k^CIRL zeG@oulaMrLq~7nH(5Ur4j%{I$6cuOPIP|(mA?qlJ>f#PccS|%=>FA(N?CLj9g250 z*|HYeUE^<{@;8ibmrM=HCC8ObZshwOpX=E(XBHbXSe5C&XS8b2F_U#89Wz@N9kW=? z>6q2JnU2}44s^_Jb)sVq>oz*(w7StTm(`t)xvjhCn8)f#$Glc=I_9$y>6qW@OUD9M z5*-U#gXvhv8b-&$)+jm_vF@j1QR_iE7PBVOvAFdJ9ZOh`(Xpg8gO1l&v*}pMdWMeI zT65`G+IoSGWvoSXjI~~&V_EBUI+n9m(6PMr79Fp%-lpUARw^CitoP|y!P-K{iq4)^R#kw|=K%4eJygYg%XMSj+m0jr(**vCmkDFx#`%*%1=kjDnQ4^Rv|hzv5L^~ zCaVM;n_Ab3FNviH_~9+v(WB>OsejRv$Wcvij1ov(=xDU916g>}n;`@iuE99dEY= z)3KX%HyyiM_tNnWYa|`-v_{kMF6(|e_OKqLV^3=W9eY`m>Db$PgpPfz$LN@7&7fmn zYc?JGS##*v-+G>o1FZRUOtN00W3u%s9S2&=={U%Gi;jb>HFO+et)t`J)(3PPYHgw8 zFl##6pV{+?J)YSMi2V?=7ZQ5{vlkJ2GP7SI z_M^;ROzbC^y@c2^nf)@cpJw(e#D139uM+zOW-lf7B4#fm_AAVOjo7a<`*mW!!R+P4 zUd8Mc#9qzpH;DZnv)?54dSM=6_$osrpFh@F|)9}zn%v$qmEJF~YDJ14WZ6FWDvKPGlwW`9EL z{LKE8*aexrgV=?c{TZ=~GW&C4mtgi6#J+~vJBeMI**?9t3VMeO^TeVW+gn0?zFtlh}_l`!8ZY$?U(0J&W1ri2W3^&l7tNv;QIXbIiU#?D@?8m)MJ$eUaF& zGW!y-UuSkq2A};VvojF;ZDwaA_Pfl^MC|qdW9~bktSFwZH;^-kC?f8H@Nk4t1kuOp zszd{;D8Ve|%)Yqhw4!3p5ygaYJdAh^#V+wE#j6pIR=hfKt>WRt z8z^3bc)a2f#2YIfNxYfjHHoJy9!0#Z;mg*h2o8guT{JW@r{Zn5#Oe`j@VPYDe--ZHzR&f@nqsh6mL%agyJoTpH@7D_<6-s ziCUeSR9Gbg&g&2)d6>Haj+{b8p2-AwnJnRSzUPEGwaGxf+83yzz$a#`b< zJ<7_w-)3SV=GPqSMu0gf_4iEgo0+r6Evg>Des8jnYxxdkMSy;oX?S&FyQWwDw6@OjXud;z>gLV0+vlL$sml84v&a3^A>tD_ zi>m8}!Gh^7#zGnqx7&!{lTvL0cSprKQtFHh3J1;np_kWzzIu!4XLWi7+Va|vWw+t1 zP_Lf%YvsUotY7M(N|pWpGD2lCLLK>Ub-I5OBh=rF&`KDgw*Q}ap6XJcnzze>S-q;u z8s{*#{+fxDnvVayw(N~&8BR~~y3~V=u5O}p)%7Yca#s7wvhkBN76ziH?f$i%wl8hT zic;?L^3NvW0gTEH?;)_5DGe!;nU190x|YVW6D zbSw=o$Y8I1V6nWOCZ_YBI=`qOuLom9I+gB6EAqN?X-i8rB3G_ZLgPI|-GclM}zReGd&W4bn?9wHY*#2Hzi`hM~P zh?O;Z43bsrO#t07ppKf2mvt&Dt4gm~9~$e%L+D=ueQUVH=B2c`W_>F1v{T%ee%z7E zgw`3JFflLUB@B`*#r=O;eW-@G3L2$KB1^arXe3xO*XhQEHpmb)64S2(?+=55`Kol%VxYz8CFN@#Irat zjhX!%CHheRd7z}=3lv0Q$fUYu_$Z@Kh7L8<_R7>b-Kq8>1u7i))|y?ZjPt87fpK0L z<2)eaR%P7&8Mj}??VE9z^9TGjh@i38mAnDs_4h}s&A{|3^yDpYts zGCe%o*rT$nY{=|!4-FVTd)zS+UX8rb0oIdbJvJci$eg`v%r)}X+y=A99o1nZ`rnvt zuYo5mVbN(=D%*(9qdG`@z6bNEl#HhCCu`h{vsy-2WA`f`g|;R+ZpKS#H^=TbXkdDE zaqN9)E>)v+^+5FR?E${EF};SjS;dSNPW*_jjcHhnwWfhJ?}LA}fmMgh8uzVfU{=o@ z8~6|nVBK0R01E*eC*v)L**aFHrVYG1Y2fhLW4;&=?3EiaAB~-5{HxQ$ zX zS)FVTuFPad0HtJ^w&;@b)}PCc(Oz%yVJqQPrL;wiR-B#C7I~m z;u%>tdOapX515cbV2x5w@SOEZBtkEokm2i1iFKDSe9J=UKN`N%;=|VmZIy_T4P^M1 zJVhi?GdDlvTH zW%vg2WQpM$Ob1&%d=oi*DVT^4-w^Pei6w?_6`YXaTa^;ymoR)oA@m;&-<jCXB}FuaIkE*`r2eHOyJsNGOkTF&A5~N>ydF_ zr?$wXR-YQZ44fp_8Cd@H=0v#7UJ)DFIRl4ZG48y9xOF~vAh#IfX=KV$7^%Qk+P^t& zwkZ=}1Ew~lsj2qW#I%evJtHh!O>~#5iD?;cDz{_alnk_G+6Jb#lo{Iy`g$@|zPWX? z#qLj4daF#$mQ2)*A?<9HNo|G;f8Nfl;?8FabbanXHG+xg)qz(S7>T(9>(X0iN}rYq z8*=oxO9u|0Kj4yqK_qplf(oypHwpX_(Lw2LGO0<;wAxT!8E<==OwDvUJ&8_3{R^{Q z8w{sY597|#xOoH18i%qAn`Y3RzzGSb%5h`$dd~}n0{3;$t$C)aatUakZU+)p}iTK-#UY9>FF6qMsW*p{!hG_LLVv|_|xh%*ajw$1~ZTb+h^Qu{WRE?UD!#& z&OG)(m$w5GWP2q$D4C&T7m#SiY;R@EI=joH?+PJjZ;sw>sV#xE(XjzEmtyW)GqUAZI4gen24mD>*>PAs{XCryfON$!?FXXG@3DXx#0?z;x;} z>eb;q$WZnOAmudzAr|+@q;{A4IvJV7#>$R()HqXdXX3pT_p$JD7GB=M+u=T}ue*bV z&$Te`)%rFsx9}AfzShEzTljUwb&d@6(da;Gw@hjzeqfLHhF4<(m!4k#8vGcjc)R(x zjc}7K%Q2a)hB&X?e92?MbF!Hh%~g&@j-!#$m@+=`7~ZriEDk5ocrKILIa&GbWMCZ& z?$VT6K2BttyDWu~63fTQw6UwqvAGMC&p3sQu!40XpYe8;bz>K6-6%?`o&tS68C^H* zj#Q-^GBrhx(y8ouL#%@Dtm}rf5U<_)Nh7Dx$w=9L)-T&5IMgzwa`!%HHmK2JR%*0; zj?-{DT@RuGclP(Ei)SR-iYyU~61nf}+2(XP@O#iuUQx2aGhw>sfQ%#UoVDb3^r65~ zw&NVYUYyOo?PT5b-I3gLz?HS=TmWZ3u0@56BQrB6;m*G?#OKoudx#ID8y6(n`qzed zE=<=PlyRh;3zytZ>xTFs_TpmpEiuHGfQzLT!`tdm8cWNkk7j3YqI9IZm6m2+-2z$X=uB!>vN9cN zt@TSRZ@03|BbUNRiSl+kZ5(Bnw_`HS?2NF2@^(zdJ4(vikyd#-Rw~aO)Q{{pXKA$( zg?P0(PIT_1&edjg)}8JbJgA$Hq5UozILoeLkV z#hx#{@~<{f;`!36XaLWbuE{vpa*|%-A)hb(55T!R}&#yb^y z`Y0*+?4(0S>vZ(dOBeqh#hb8GbA84Uqi-dQMzuJq5u?#I)u?kl{d{Y~F2WAq6*CC2DedUZkUnj@S;`+8Mg6~erKMwNeM zSU;zw$r-(V8N(^LfcHYC<9~Z{Wca>d2Q&h#DfkjxnS!qYoST<01>dl}|7Hr#j8DP0 zp}*n1o$Bf^1FyE$haaY9DHiuKMEzI&sUG%HvW$}6AWQN$ zvTh~)EsOYL`5XFE+F$dY0{SD@G0p;xY9Bfjc?fUED&t@|N}$?A-((2m#@Yomy*^&d zsFRJfWj=LAyxJ^}wo0sz4@koG<;k$x1TPz`KnItu_V=U8zfv?-q@@k*PtuSmVyzK_&*xWk!Y(#DR^95U6UtEjOHjh z*y7P#D{R6V&9%XmbuSIzJdR6k415joqe}?3bs+Q~4Nu}to^{byiQ#!thNqS%OAOC? zp_0|%^}&@+jsb99{NN*Wyt?dHR093}pn@JYOeF&=G|7@udv)d@UVVtgjj!GEQ8 zZ5TFhjr2y~N@#5i;5?(DHHrAClFsiQ#4jwN^6v?u)TOaW+Dn;keM zfX$yZdaqMr7;j+m{U_YU3|@1ejdr|6@tdb(aF?xSAunZ*)eZxH_sUNXeG4@$Smf_o9T zR>)P5cL{h-n{28woBAyisPwAf%WT8v54?7OzxB8jf|0)f^eVHkFSY3RaBSp`={(br zd2dJ>x(qzTHgKzZekDvGwlnB?=d9Z?>$cCjZL{W&_pYLU-LmXo_-fWQV0!K8r;I~Y zx;y)PZ73SP_;fv(PWNndvDzIk+u)9TS>us>nW}S^f2oTQ$Lr-Cv;JRvhVo} zzOiAsldkl#hGm5;Up~BxvhhFitdOqtu)4+#rw36PYORaQvnzLlCw1{&0B40}hq8|~ zl)ZzY6qge1=}`8yhH?QK@cLRqDed3K_A4CVR!7)FFoB_L#83{%x>Z@Xf7b2i59Pyb zwZA`V?FXd?vDc4)YbDjnnyL57|Tg z${I(;>RXWYhFj4h4!;d9h84Kg!}>l#pe!>j(6(R>o7`G=nD} z(v!95=sN33#(e~aGnRw$aVS34FS!fBt686C7g25;(I=tYIA8A5K<+cjji=n_q1_LwLx^O8HTHuP?al|)<6m$u+ypnzLFP`zOS12rE5wSCszHtTMkb+_~fYFV5_Gkw_j*8b2` z4NC9C#+L)v3ZWU~^##w_DVy3co0^^tR7w<(6(AT5ksX5&+0q&b7Lb0XArm6f(2C%p z=fJJ*`B0cZ&#y<%_sY6^WZm7e?k;}Mhv6ie9s%O*X7zj~dpQzZtLOWWHwrvwW;V5N zHnnp$P$|*#wICSn`MyEVcZu~pZ5lE?mxe}zhn@qsy63epfu7%io)@!jKI>+)ZoS|0 z^>EV5`d!8{yFa_PzVXC-E@MCPHUQ7rKZ_BxcWFf{&htT>i$RI=daIAR%!;uwFotdc zx4K&sVFKN{AKf}E>mHJI56Zd+_}$tNC%uFGZedH_$S!OIt~HZKkhd{-PGh`Vhgsb^ zB3X_voxU%kS2fI0>J(0`ZRadsj7R z^vT)qu-yOS^^>yB$?W0QkhXe#0(skj=bV&H9W7b8kDaQzvFqM~3!F#Ps%* zifji?3}SkgH88ZegK6Bvv@|{gJd6@>t4C>Hn7}B#h*3H_>zHnSh^!zvoMteR#==lY)o*!=-GCh}uP5=)*2X1xGPk{;a{7dxwx~zLm z*1an0Ug7urRGjp#qD$!;*|F1b9PyVu*B7#{h`D<@L~Cx!I-++*DLs8hC8Fot#8%FP zv>4XXb_025frp*~x4Nh2!326*yW>Rn&a8WT*1a|B-t6~u4n4d(ww*a2OtgK0lDQOF zkZt-gr*`O8e+F?2N%Q|gD&Ch=l*>|fR6m8ERJ@3a_a_xao{IYGAW6kbsTjFs9leaZ z6O-lN1-LyZ#0z}Sy_>Dc)P2<5W*;^B0nWxe*k}7@CG*Ie51#WtHg%5-Vg>eu&sVcn zT@Jo?A5E|Gpj2H)~r7l`F%~liWr9 z$S1Mxl?mi0vFr)tB-~B6?zXnRGG+IGi=+Z>byD3A6G*CwNU9gI?sHl9nXLPipHvUf z!g9lieP0#o-8D!HVRD3O|7|W)l;-gf2J*gP9D33n9 zq~a4)jAT%BJUnYlK6QFzDqMN043yK1heKXo_>jf?-9Km z3WiDiN+9?u1>dLOYoTD6#IFZ}|D)gs6nrBT43qfHK=3UfB=K9>)SHsTZ%L={8CRj@ zweM*sYu^`IS^EK!SbTnmb|abfie$9>y_!9njOX_t?7eKImdxM#Y`ek%ZgpyX3=>GL zpRh82nspat-H)^Ghkj};#7Q*12qg8T`X6N2CwlHPp8HzPmHBTUe@@;vhG&+iFUk8V z8+~*3LqBHm=B&SteFZ`9D+z*cB?!I-!}*aj@eNSTcSPTk_Y=`~Kp@{M`9aB#N`6xE zvyxww{0d?mF83Y&jl6HNsk!EJf?G86x@+LGzV7 z7L8}(fpzUqiqE#N{JeqT%TF2@JduAxYw*SvUX6e6YWTwy*EupSf1_dVV-B8K1Af+7 z&^^xQ9I(X@aemIGzOd$}=9jGVtFnSWe)=Wrec>DGF);m`%tcvS+kUx9bnKk|UCx%{ zY_x<$Hw2$rC2Ubp!lV_sGK&r^U-19ZFJXVs^$OUxN|BvlaYL}Wl@HZzf4YU|-@Zp3@It+(y@LHRGD4>V=NCD=z3TDxI+j#G25brJ9elk_t z(W5`J^02)<@$Xs0!mnB9H(Kckj)phY8#%32>A#HIWZ?@3f5~WeqGT|ajb+tkWt~Sa z&f2U-u+o1=SQ{wISu8fX!Um0+EtHH{H}J%{?f}l;a1L(uB!(MbS|vuLdr`W=0d94P z=>roeF@K}Pw9C0|a&AS=Ez6mwQOn_Es$-5$hEJoG2NO>9<+;we#9lbqnd(|vk;9BL zfPze1fr?#{iot6~y6h(v`$N&|LVGf5RinG*yv{sSW(B#`gVJ4dPPZH%1g)eEm5>oh zp)rei?c?q=fgY(EDX_NXni$rx&GG1;^`{3!gYj zFNcDQ&tfhxUP_Mm(RI*8me9jo`VeWCX`TzfU6c zM^dpmsVEn5G6OPhNyW9G=v7;xKQI>__82r8hgC9{BI9SmfSfZ>rgLp=w}gylg6LMN zMLWLJs;AK}rcEXYwk1c0l0DSUAm72U`}MFTYbdD$8|KV9U`o!^0yqO=ITO7zx`LH6 z%Lh3lU69f1oyeK~e$K4Scv=rlSUIyIc^k0Vm2;_;?3@{ta|SCb$eBSoZ>4aY{hUe3 zAdi8KXwJ02Z-h}aXPWVT2t6HJ!uxUbeh71BaL!3lY63W3e=BFCmlMH7&H%SMXEuQe zqiVv~s&7K)JrCPLHRh?ej7b_3h*i<4EX@Mkx6p*N$fP#Det*%e%b0&uHCVNaMqDD*`rte11w&ABx>H|>YQUi5TK zY)1AWb8K>&gUfIID}fsJhN&EE8TO^(xMmdfcQ%uXGpRVf8AaWsBo*taI3cMR+oU8F zGgO?IR1EsqLyA;VF-ye_lZx`kcMO%~no!JBG4eN$X+H$`RqKr;=nD{X>NxX7Adm(n z`zhI9$pK0ZRC17#gOwbjhRbvy~jH*^Q ziAqjVa zXVYBG#ymKi2a}1;0aD(%K&Y=9=TaNx_)vecgm&WzyilxDEWgobu>3}!!6#cX@*91I zFTc@e@M)IJ=@vd2pLzA|pJL%tEqt1VPq*+H7CzI$XIZ$G7p}&K^(?%;g*UM97z>ZJ z@Hh*PxA02505Rt?t(n3xeF(_eis)e=kVlj}s^l>x zk1KgX$&*T+Qu4HtXOujv`2iwx>EEE zmO^J_q|h1uF)T_3A4_axj48#_{j4PT0|!BTjQj1=DKxjIMENA!i3h?>j&s z?<#pu$@@w^Q1YRYkCc3@WTBEpNe6HjRC0~L>3wPx6#$M^dJ+>uo5 z73{|g_t)S#GjcWCQs5gN>`3%2kn+9*LKbeDOKl@rxT9v<3Cx}y6wCI(V96wdC6f%6 zOfp!u4+cwC87x_4uw;Y5vVAaEGQ(iW41*;z43_PK!IC8gOP1__D3H$nfR1@%tg8#z zPW{O4Rye?|zPk7oCUA8z5LXv_ezOC7k~PLwc~FpW|~pdOOB-CVk%~vQPgYMq+(e+DCUxi(vU=)TmU2$%c+=8 zDh7Sj%c`Ve1r-ZP#o&^oZxbz6QnA>KqW5J+bwU6gcH(oIQsB|Vh%1c_FX=o6DYtS#Vf!4|OI4<#?~ zMjl4-_QKx&7Vt1S)C=~lO0pMu%Yf$`ma9342fcZ4IMK2|%IgD!N^(#xb)Zy|!?k+w z_o-?RRm@+X@-csP%Ewn(c!7oQv+(^Een4@ZBhD<3hL?UcGA$X6BiO~hupb|d6~S|k zh;4|2Vdd3rqfByt${kHBD*=I2DXCU6K*>NQD=QhKWH89mcdJE{d<-2*!G643L%?&6 z$<-W5fmL`go5%rD-l{;D`Q>zj&B#UD%J0#_HfX$L3P|NXK|j_-T1dWH^24gkKuucY<%m zUoKHGC{21dB&;x_kE8uHsH28ZCXAtxY~Z+DYG%$WG91N$DzCxEmD#Qo3ek zTau-x(vkIGKR$u$(~nbgseNSv!`HqxpfB+WjJ=~1PT)GHNe9Nz*ja39EY;&S$AMXM zI!}+M;MqhILc#E@l8J%fh7>%9f*XZ`97TOKY~w(16AGS7!AYTD_*O|>Ah;<7&!gaG zK=I+23?4pXczP~%nk4UeGA#I6a*glWvvrti&kmpa+|$`WLJkRt+tK?@k)8SO~Ts)n)G&C@zyz?!?->5B54-A$S9p=`CvTl?!Zrb zYj6SW?*RMpxY`js=YpKKx3$}rJ;P3Ptil0q^=^ANn80p(D0bWPa_%KL_oAFT*WYdL zj+3d&HClr=jP?K%j_#>sFN$214BcQ0+Er%pB7XpaZT8+&yt)}h-7O~-_o3o7NyS)w zNh!tAJz;JHnl$%f9QEc{(Ry2Ec zOPaltO&ndK*<;x3ojLD1T1nqUvDsjyu8h_@@mBImM^+1-3@Eugjo7qrh#m_oHD1mU zlgG8rBoZ<(>3H<*cp8e7{41sVEcy1R^A`Mxko7LNDwvG(N#LS_0k^t>ody%AU~8g+ zJ&<$n%enXF+`Ih>b~-(LSc5XCU}uu~NHU*;nx*-CuRoPR%{q&Uk2a&&LnbAucs3Ou zYerFvT~hHJDn6c63`$R*CR#j~iccgJgFfo>&t!||QSr&7V$h=QzeB}t5^nM*QXM+_ z8J4F(7fK62(9>v=Tq_Nq+-y#-X};ZUO>fXno-m{6G_FnRD3q)J;Ldhz66{0 zi+Jj}ocDBas>*xD$7NMr{1;U(rCj8G#NB?);ic;HQs(DD$a$G*a~TlGd?lAFxkAa6 zO0EL2JnEc&C1=7oyb8D)GR`ZxnipvE8Xmk#bS;qbt^-2Rej%57UW)dsk_V0RdExi6 z;>#_3g@teA9RMS9lZ9_qT<1um*Q0@E`u&>p`vwR(Z_=|Hfk19jax;iMn(4P91C2w- z-U6XS$8Q7Ef%J27mG*Ydd(@v3Tu8lR4t4ab<7X*Um3}+tyhF>km$G~ZEyLjBluf^z z^BxN=;}B|hmQuTmYLJ#D7()1S=l3Y>m6E=j((jo@M!%m7*&s>cIhuZ-M(-(Q^j;c$ zKUecQB^L1D1ETwYK<-!a07w{BaPmXSJP2-Lj2{Bi`OqKZkD_DzadeE+ALX2nY3boo zmL8!c7?3d?y)Zha3#s;KDYeI_w$OCwaULw9>=QsBPbzr|#7x#F5f{^+NbEh$^Y*NK zN*m9Bo9OVfU^<_g_MXFmyo~!ixiD>IefqO#oPI`=FO)L*B9$SnJ^wrsAEUpB3`B6~ zhpm5Fy{}4to^!rnLobzT=w&tp``XZ#{;UC5nUVgI`mdDIf0g=y+E>xp9sRX`Y%=Jp zobxqJy;jQ9>ooP18OHzd;2X-m0R-}aKo!OxWa6bR%qC7&z#Ldlm(z5+2r`b)%t^e-}` zU-P^@9KX`=H{d3Q^jk2UUyT#r;XsD;dvak~dYk?&GPa|C_d5^1bl!w9NPPS!M39 z@SPUE%fk0q_+AUkLjI=Ok%in~S;!5(gNynHD&txBZpC$uEGmDY!)D1X%kwS!zsb;z z4%fU!evDZDZbLRv{@!RYrKEhO%k$7GYmbn7QX4D7N9g@eL6(DGQ;~N>sKOS)U&e@# zQ$hWz`rr+&DP8EOFsfqO_nqQo!G5q(L{U% z`motf`DUiFvrOf3lgUnv&I(3|F#-k`YQq zDp^y>D3GO}mKJ5$@^pPI*pE-h+Tc0M=WBXXAkBlmM5BR}R|A9$>zz+6BNNisnvmtJ z2{BkE#9%4l24Bx&Yp@h^gQb`oEXCa5+bwx1?1nFe-C!x~21{W#SPJ`cm~iRTI_v;5 zxR$-^)rt&m(Fm`=VOtMP#7B4oHoHRJ>V#Z>b&>b>;`-yDkAzw=?`YHGX)khTz9nT`8dy>h>(3#W0Q>PFmXlj60Tc=;SA?+ZKF0h!SGO@*=`G7jmxv!QEm;Q?L#@- ziBY*70=XHK8$r1pLpj_}SGk=6xt%FDl5)F*a=~qiPD{4pR(AJJbZ4ig|pxH=rNw*~`tMcKW7BUg{q--;ZGZ^yz2SZlQ`+usqsy{8B zZBHL*IeGJ^ifgiqd%?byIIEDi4|vX+dC$p*f88f1_QeTAB5;yJ@Sczs2 zXR{Mp(d?L(G&_;a9#Nv%Mm9S!)@*d$C_TtB@v?5%(-#}$4cY9GC7PYZW;e`x>si?< zqkj}mAX|Z3ovp{h1hRE99^Y)1ckA-*CV6)wKUmZBp?RD0)-rh)KHXvh18jdy#9{jr^qI^MWl!=yV7< z+j2_Ip!m1u7i8y}_n{hB!qvGn8|a#sE6#*?%~n)Aizc=sI=iHas-{ew6PP%cCbp-E z^GceiZpy@*z{L49u>(z9P}0PJrcBHYOk7A4Gic(Xk|qW=W#Zz%#3eMbBTZad(!|P5 znV1)txQr%tqKWw>O$=(v#N~mBD`;Y8nz*v0iNQ^oxGFGlHBIb76W5e9abQy>t_@6F zM-#i!#Puaj9MqJF8v+wI(!_2waZ^bX2RCKn=D@@)G_gBP+*;DaAx)XMEiiFAP3%Dv zca$`7Xj3Nc3{2cb6MNExSJK2`O_{hmFmVq}>_rpzmNapAQzjM!Chnt&y=mh9k|vI5 z%ESYKi3e$7ADVaw$XX{iC+}hKaJ9QtKDDLnB=?b`+IR-9Mz>Wg-@(~V@mb_=uUNi` zvxDMu$e*EDzK^q`;yL8+q*%U{v$Nv4@Vj;w#TOFqs`w(}-4tI;yu0E{i1$!@De<0) z=MnFv_%hye?d#0-H2}f#OjN*%3BdH)9Uot1|@nOUb=}X{%Rd*LN_Q| z_`ARihwl|M5g)!+*=**&YBtMeUn|k<>ufd~Yc{$aE8Sb!5+oMySZ{M|_J1XseS^*B zV$J>(`7B-OW~a4ekn?Qz%@WPN&1UoYWK6w-6W9eJ5?Z|r`~W7f3oK$6cwpY$Kkqi= z-GaXh{17Koha?j&xZdw2L)qZ>F4*vWM8!jsib1CKY(nv4Djt?pl+T?q_}Vq0xR8p6 zCl!Nt3^jF=u6{zrBc#BEcSybf6O-|!lCLNdf2%s^inQQ`h9yO+M<1E=B~a0Qa!XX? zMFd*ZdKy*fQJrqgJ4Z5XzJ`ldZXQhDPvAL?dG8Q^8;t5XOFC*Eh=|lLl$vFv(nsaJ zLn#ixCr!Vy=kX2jwlW0;f8%U6zrRs5a^pkVl?oY`{XHRjn1m2tUyIBBk&r#SN!dRk zi@P>Q=NCj)a7VpqDB|G$YqT!}Hv^XK#bcf11V0n-}q-W<%GGHgh>d8QgM*>&cmU z3-S*7BF(4gnof4m)G7(traR?8){}muFU*^n3sYxRoOLc_ z=3bO{&;e<4^u_-4Tr52q%H|S1>C;qCh9$gfdKg`LC(frYNqV;$y}N|oU7B~)m*F%% zFB!POYN#P&2kw{#-ccXHmgb=(G%!Zn3`$>?h|!U3?y`KctE)8C)ivo&Bod{Cl94zH zvZzw%35NOt=ET}`={&1SNv5PJSK$D+x=O7J6R1*Kqe@+qcdyF3SLEIKewC`l$<+0+ z3|^ni8ftv!#y6oJbVavVQS~lC>l2z#4{GrWQj?eT<>3(-Awx%!@dlzUKd_R-X`EVH|L$3 zVizm_TFbYvl}RO9-jprh61|}IZVXDS-5F-=WQcp$Tj?S0Zw@Zf1Gv@cF%2e=9y=pF zyu5p7-n~8V-s-2vbev4x8%vL^$Xw7&dT2=A?oUjxvTser`!6=;Fh9?_MjRWYqS>2_zJ7s}m{<6G*6i zkWf$M-6!(yV|n)xKcR9snR+&sPz5rdYbGzWNI&LxIY_7?6`yZLQP=;ZVgnUlXhu<2 zxTNBKRD7`+Ma})B;{H^8sToDh{iNc7Q1o76*BRk>Ec`Mj^&pyyJ{Eq;N}?x%Bnk|A zkN63SB+?b&8Cp67mYkQHO_I`%c(7n$_qa01l@xYgC=B$z;TIR@3`y}bKQ-hC_Y zzTsDwlW{WjVXV5GO6Et&%nSB#nzC>CBOO$i)2R4yQZcr|CKXSo;=-h2u(s--TqhOJ zq+(>9jNX}l&r0!kf)roqd+xnqrMOPkhkhb1;$)o#`&J@;K;AjvIg9e%N3=5flRSFN z&mPNXb9(}Ci8_}upX9xdDI*4|(x3S%p9Lyd@EiSY|9MowsmS$^=*#tx?I~NB3vus5 zD_+F63&BOa0Jl0`E`=G%dcoh|!iI?xJc=;xXm!Evky)P2+@}nOwzcMzi zhJ7nuejx8!@SI=s-p{m>{*A2b=!QMf(QiZkLdoFUkhF&p;U6kXB-lPM60V1_nm_W6 zSiWItEn~qiZQ1#Qp56p|-j7z8NtbR07hwk6>M*+?@>=Lfu~&xZl{9Vq2RVFnAbq> zrKjBsoTKm|$0KC+C?u{lg1FX;;0^^$GuMnDAs(e-&t??04ki^JqhhaS6g$h>lvI42 zipvzdp7h1*!GF81;FqK)c(QlF>s9LHlRUX>vdK=vpd(?sQ z;9k-@RJZ3VG2fbogMyyRRK~q{m;D%MP2~Vi<$K`D>j57CID-rSLPH4PB393OhSJ{#Suxx;L(v-@REw(Q86;+ z(N)K_#(Zcn=4<#4ctfm^)iEFLkNHTB`S-AIjrr>2{Q#abvfz!NmC{lpx!>xc8uYLm;6As+!3I7WwFyZfE z!q+XhH3c_aaM$uD{BOFter&=Qg9(qya7#BeE;)U{yz2!=+8_2{y)17+F{lvws#B=Q zacvV+hzhE2&`i6!goWyUyj4WPwwZP{K|*!k;SN-c+GWdchWxr#I@JW}G|rz_ zFK{ZjZMnXmP8-v&WnkY*r}fC|4W6@cp=JUPmgT`FM0~ym!Uu*Rd>9JSSIG)W`YBma zNq;3PfkeCT=D*d2N%X4<_Tycs2G5yfx-ftTbrc<#a3%U9JpW)cH>LfROSm$Kt#4Yu zGs6jm)c6AbPPa~yw(>Ep+WhisxAPd<$P-;kg#R(83p4_+krRV&O|IJkP?HS@;d& zP1K(^E&P^+-?s2O7Jk>l?^*bL3x8nY4~b3RKeF)07G7xKMHc?V!k=3BGYfyNxXzIv z9>RHVI$1Z9WaUFuX9}m$0RmZ7$xtQ3l(n2C(}?(~dJul49;8MIzf+GRexe?PU#AD* zFMojW`}83EG(8BvN)N(c`2gW}>Hk3=D_Ypc>2#dmy^r^C0(j2!g0m$B_|u!(+YNz` zcasaL%_Q%()Yu-6j|J3DQM{prH?r^~3)fkAvW2%Ho~CxTv+xWH?_}X!Exfyh`8&l4(k&E7?-XRv`Zev9vuM-x_Vj zV`&@kob3xWTT@_L9_&E09T3R&N_J2(L&=Uxc2csll3kSSs$@4MyDQlPYz7kJJL)5pDeup>qH0n&c&3xv$sx{%sRGG|9CbGEZG$6(1EgC%nemdr6& zGRI)aoE@ypF<3IkV96YVC36gx%rRIp$Jmt2F<3IkV96YVC36gx%rRIp$Jmt2F<3Ik zV96YVC36gx%-I2%BLS1az%`ROJ4xnbIpVu<#B)F(c_jrUMI{YN_5=9`u~ON>SlONK z?2oqMv2p--&hCYpohfi25B4BB2ngh0C5I?ERLNmV4hQ)Mp0{hE=X=tfBhXgd^G5KT zJ&or_@?bBD&H~cj90i0Z-?@<5Nuqo&jYx^A-4shy87xs{utb%?5>*CER2eK$wTIe~ zs4`fh%3z5qgC(jAmZ;hTQ6o1SKabIZ4UMN={L7 zs*=-`oUY^yC1)x*OUcy%utoW_2Rd+~b3c?%aU z++gATEWE#k53=yV7CzL%hgtY=3m;+OV=O$|!Y5kzBnzKx;ZrPpx`ofM@L3i<+rsBq z_*@IiwVxRux%M+yuJ;U<>pg?z8qZ+4#xq#1>kO9bI)mj}&S1HgGgz+Q43_IRgXNmd zV7X>9Sgz9ymg_Ww<=V_(xi&LcuEz|P>oJ4BvHJe4g@3Z}&ldi}!hc#=_U;*tE7^4z zEISQ@WnXTv>?jPDU4+3>;|-R&Zm`sHgQb2OEH&F;snZ$MX-W3ykpR)Gye0D4gwk0# zrX^XKXR5sb`|+%N89XOnXl8jR$nx+C<@TqQw}8B{Y?QXTR;3RRfw#eK;E|7jr5x_a1;2cQq2RH!vP{~J1K31|&$s#46DEU;$XG%U-@`aKwm3*b-YbD<( z`BuqyO1@X}gOVSW{G{Y(CBG>7L&={Y)<{&R4=RL*-FXgQeCQEVb5Psjmi0O*L3*s=-oI4VF4; zu+&b2rFI%DwbNj!od!$oG+1hp_CtkL|*#t8jo@{UD(SOyEJnJ$R6CWWhb6 z;2u_R5Ah!)^u$R7S1*v%G0ofx*LOz_^Q%?x%wQQR&Q2=EZowxNdqdGX#xF$es?x_6 zyxIO?MQ0pZ>2VbEU|DE5kP4LASEY}ODjk}mcO{@9nJpW36A{-)JIx3?T-j<+6Q*LL;NQRxM@EOCAuv2 z=|9uwkDux@N*Tp|a0~$j-0Fbh&-Egp9zj5zR&Y-#xF;3d6a0YUPe-Ev{ME?RImz)0 z;zDm~o|FhE{=}qrjvok^o^$Q#IfH?~U!HW%Eu_v&nh&0FX}l)Q^Oq`9XC)N_zx3H= zQZYrp&h-82P?bKf;GN|k!p-v%ZVsWFkP4JK;&0KSN^=rQ4wdEd+ew69~O$5qg&t+=~kC z+=6?)A9`zO|3`qNE>DhMFvS{rb2&mx;-Hp|grax3HK$kD(=(5uHwq%o6@}Dg&6w8+ zN}6Ab<}dTjqr_dAFrTLRD+{UlN%OJUPnsVMU3gf-R_2$O{Y$LbzbKgfz>atR5@vs? z^~2ehp<4%zVfKMrJ^Sm!1ZMv=%>E4p_qu|6O~Jj&pZyKA|6@Q>wWFg;7H zA5M?-Z9_PQ=>cx_^h|;YOwXs7p1TX~T?O}!f_s}kJ#{#lS|CFjzS_4bm>Ad1c<#aE zpa#`k-&nXKF=vyTPz+{6-&hD0xzdMkENo8o`dA=7A`CqcUAVd|Ysy(frH z0RlNy$!SVXS8|4uGnJgB{iPk=*cyD~~!pHn@ zsE=n_xZc7U3+FA&?|=Hb{4%GH_p|W+7Cykjhgq0kh4gj#X+$3%ZQ)}qJln#@TbN%s z^mR|N@W~cF#lojrn4b;wb@|~yAM;y)K0e#R=USMb`157>)jl8dyL~?92giKOPmcMR z9~krTBNpcOxqSZP7UoyCd_KR3{Bn`c z=a+_j%nu9sxFg=Kt9?S_s;hUw0~FUe zlI)iv0iszMz2jIqEAMYfRzA&Cn+N;xth^jN=jqrT#~{7AmOLYC$rY4)fmW^r3X2}@ zIKD{kRp2&p!!fXCs@v5Nt$C^7yjTd$;Qrjp(#|!s)66TUrN=;Ouw1~~jm0X{EA;bP z*pH9Fb>KO#6y(SjE`x8JYsLvKs&qzUi!78Y) zDwZN@uoO;%rC1s)1=3(CiUvy|G+2tC!BX%HmLg}c6gGpUm>Dbu%wQ>621}tbSc;Ru zQjiRmB4n@>9)qRW7%Tiig2cFkZ!NJPCkjFo@0Uv|f{_eHKE_n~aj@ zfIyyC@`92VmAs_nWhJjDc~!}4N?up;KP7J{c~i+-O5RrTj*@qkyr<-SB_AmH5G0yQ z(f3VD=hA~MsV8r-uOGpFJeNKO&v~m*^Ew3<^5AWvML-~*DEU;$XG%U-@`aKwm3*b- zYmjIcqVJpjgD$*7zrKO}co)6}&w0mm;X59@OVRHWu0-Gc`v!@4H$fmB_j!E__8xFm|ynw?MNaT zzU&eV=2uK>-&TJlK@FB2gTeevsV^gmYxuHzF!)hRMiScaWhY@UKjZ29BZ+Q&kX?nr zPg^ol01RJt7zRIQ$w*-^eA#Whi2@)&{0ry3=}WEmr2zcOiTaq+_!|(&?@Inq@~4u& zl>Dt^v68aRqEN1+LP@2PHXzaPZ*j~qsw3~4HnTD=q~mSTRy-Bjf#)nN)Ocb z)By;jqmoWaIxFd-q^pu{O1dlQp`@phUP_h$`3HTByl>h}A3vevz0p>@kIRDRd}8|8 zhX`9INZ7sg+PYs`+T=D&vy{h5!lO2A$vTrr^`Kb+` zFMC+S=O-+DzU*fgA#)^P`eERj$(+w5b5`Vtf5j2+4+OH3k}4(DN(LwysAOd&gOm(b zl2S56$tocK2T}Dk9e2=HJgQa&&-uDg^Em~E^57eyVL%|RlGT)~u4K59HI$4{GE&K! zN=7MJOUc?G|DcbNH&2_%oNwuP8g0ejEKjJ};y`lg#+35Xe|1 zkvC79iIrdI&W30!9xEGx=loKr`GEo(^WayaO@KfqDXCMksgli< zOa}P}o=4t1ZN~H8=+5S7EAIIg;5ok;&!_OGFYPOS45Qz`<8IjTVTDBAh#yB zqWcvNaH}5_YzGr~Q1Bfd6qFa;#Rd1Tg8PU6pkRBPOtmR;Si=VeJAjEnoWXM)i-}JG z#2ys<=XU8vYT zsTeq{4+@fsyHc@3QZabKpie)Oin~M6>rgZ|r}62uPDQW1e~8bhb}C{5_JEKT@Rj84 z37*rb2yc0&Ty1phX+~gg`V-j>|6xCQ=v?HVvF}3@-DzxJAds0#>Xl?bqA4A{FfA{J zU$a;o+h1kZp?QZ@GK0(Jbu8dzAyv=~1ldLV-LFdJ+{9u0(g(|G<@A zv|lXYN&{Q(Wn9@02dExhimA>;{ykw&8TH1^`EF!)#amc-iiM|Ic$$T$TX;(gZ)M@F z72~HQ>E-@#!fWRT2X4kKBhz>Q*wJ~4zBE^QaN4$Ho_e#{17SZtPX~eL^e)QR0}dfx zruZMZuq<6Tw1f+XvDsydk=MgDb>wM{9esRSGYjG%M}dT6*tI&{rx+e$Nc*&+A2KCN z3i&?l$I&JFF`NB>7j25+mo_BBkHra;eBf4>{1agUCI5Gn{QgC^U(xMbbeAid&%T_5 zld0-h$v+uPIC=`t4NlgxSjq3}2T@S+Pi;amsG$06I8cx?l27 zr{ch76t(0h70;mJ%1On*VJ-Pd#WSfmNULvRX^hqVP&@dv$XVJhyIOTSxpy|`7Hjc zD!$ypS6KK;;$bRtm4&ai@HLkFwHCh4!q;2!H(2;a3*ThP-)!MqEPSgaf18DGS6t^v zY+Q>DdjlD3oFY`+;T)&yz>QRMnLjD!b~Lh>-@xG;-fXEZJ!=D665wmln;X$YJb-Ru zvunhboR!5SKXVfI@)n4P-Nafmq8J{c*CQm6Z-rDe6Qav^>5jU=t=^JDyR^ValN zmY~kp`gMLRqvtW$x6)u;@*W4z85_&K7B}l{z{c&rG;PL*acu9251jJegl)nP$aP07+!bY_FD!5I&s1P^s z8boV0E;<`Ur(hGAg4by$k{&JTzf7eRSGzGSu0eWCqM!eR{dju30iH8Sr{FE(O^VLO zMX$CP)>lcRw{Z^j6}Z*)^?jH?eeHt!I;H4tUUWArx^;ei{QxIZ(_{7ZLong@M?AM( zvg*X@>t=o|2KDvhCKQ8mrS&yb_i`bCa!d55dTV*NRCF=k}1{_ zwt29GZRdxkSC?4Aru$3S&b0p(^D z(pn$bqY8B-vV=9`$*%O|uM(d8O;2|HC!SO;ohQ4|lf@-GDeD4Hb}M>Y`GJnbba#o% za-4}qNwkuej*=}~5+!@kn+n*EM@c2U*+VONTjJegWAv}NuqRz;SHgw%Y9R0^)pS{`riG%L zE4rDYJJVlH``~11zu0QJ9GLKXd7e8kS?gn~X~qx6U^VUAgkrG9=xQ1&a&*GgbOoyK z-%Pu@D2D3(TF|cv#o+gqbQum6qwTKPgnHn%e$+Oq-ahzbW&bABgW=LYBaEttzwWeB z6Y4?hx-du8!ymD!qWS^JK?~INQBA1s5841IdIxY0(+5d945XzxN^b5 zb)X*w-ps_pwV%Im9n5rC8TPGoXdrJ8c+SB{hnho*j=C{8;YM^J`v-0u$|h4K+!#VP z4uu=eArx`wg8l7RZ-40}?~2&HWQiI|*~s0^K!SHS50jxCM*Bz7vvH5v>UXGD^u>O4bI6`uDFz#?fpv4f}EbMuX=Z zZTzd@!7&tF2S|Nh7YK24crkUD+-5vRido}~3fw|GQt^%!-ii1q}rZgs&P2NNjRE1_VYRCG@$y2lmW*?z$ukCUlW zV+DHxm>86aJa0H@FDuCF^sj?zdY<#b!#}NmhwFAt-TY_~YiyPL#M){StR3 zqjOW(w*vVT@-_p{IWxA?ispCeW>0HLvuCl1$t9ZIoXwsU-D%Oa4&LdstDmB_`@>>3 z1xntj#W1v`2UEdCXal!8w6}r@g!T}G_60?EPSHKL=$`F|_SQHVDYxq9x%9JA_JwC# z<4!-ffd+*t^_v72auBvvFM(U_5-CK(8O}>})rM%q0yCwAUrkIzRsF!!q%dC0{+-fh2>g6POd4JJe zP;~Dpx}NW41HF7GR&w_P6K(I$bB`rUP^{$M!yd611ts@@CKQ9xrzJO3WSoa3_du#Y z+)TT=)eY7C(sxi3ib1>WrDleT(RL4}`XkM>tEE0v_uD`T0mohU_K!d3p&y&!nF( z6}^Xw;i@gccot4z)dp^LbvzFyuxgLmd7}G9(S5z>zFKr&_N(I@oJ_qPtBx0t`A#wQ z@h%IF9yp+^@qiv?p=NR6Z0oh~t3{lhj{k$QIG2j=CKW|q!bHkbQt=`xM)JHda@G2V zmFKSqdHzl?<}WAm{B1wa-{Y8H4Et7?zD3@p;5qNbaw;&yoO)k!Y98f2rp9F@tjy=x zg*v07-h`9@f!}oZQ23gR(Ieo?ZAfU zz|TeZ$D;dv(f!u%fVadB=vTnL_d`;DQtsQB>vu<8|CO%aqpkzD+V%U@_08e>;-dRk z(fy<7{^q;>K-_ij4{MYeBfrJGd@$-|c>}zBNWBDZwU>{nm)pS04h?R*2DeRvThU-% z{Ck{Uc5aY)9l;{VnSPSYE)9t{*@9bwx?gG2fT)S=&z_=U*Jc#Of|pc$hKkJ;q7Dt= zhNE4B|B6}{-vO@z=l$O+(+x-G2J?P#HxA>ou+Ki44M!*Po&(S6*0A)=c5O+s-Py$R zC7OMa&313_IyZ!Cj`;HuPM{b7w|c5yg9#LaT`<*s8r06`PsrKGszC4yJkq-vO^jVygT4Q@tX` z{2kc0rh0ku-UZKDu_0Ql`-w>=qHU7#|31XMzSjJRkq^Md`~bIleip(6=4W5b&&mz% zfCjg!!R_zQ&mx>mr5d~{`o$iEzdiRUPeoRmRN#DnYdq-u7m$_l*US6C?EjbG!FAwP zyZ$Xq!1V^W?l!nX8(gQs9pbzG9sRp+@`73IE6W<^nr(|NEkk1NeNWLySDc_LaoHas zYjtIHcI7AV&=ufTcjY&jKvxb!SJrB9*KBY{G`Pe4uKZ5_M#r+`Pcmzg!5&<&>V?z@ z=?P{p$dbRPxK1;Qa@WmED*jEyb(4z0T{_Lnq+)qjC`N9n5BFz)d#l=psTjlx2svXo zoRvTzZIrYH@oN0|!{?F4Ql=faRz{`CYY(0?w!s<4gAO>TS&yhA5cW{(HKb}A__q<` zWFQ;Y=Dul+;t3Y6Q(WhWa%U(vv&;BM03Zq(pT^iyFuoJ>uQrNZ)H!lS-Cw?#5OgN)GZ-^d@O zAR|_w;*@3-^&U)8u^$zuHl!ZeVgc6wvc@w}X1s|K+nm(KYP?oFWcIkX1`eM+?$`lj zwZY*@I2`lE0NtfPkE6LFElq3irZR>`;{V37M*MO${_D)6vg#4DddWVhKLw{p1SwUX z5UhfrH^s`EEhWvWsUOKj^%px6=HgZ&Gyp=*b_|q(6p#OuXyasjhFZcq&^1>sD?_|y zYbp++iS3C7mozb>DHEx{#1NX;fhJZdX@bA3Qql`2FtI94%%F*(B~9$nl!;-136~~z zq>0r^n&2;_l=Nctz{GHx*oh|A_Ai!BNDDR6 zA-ma#Afg~mM8yUI0wU4{q+B{G(gYMK(nLk2qtfj1oip>?+1qx({NL~O_wvj+bK0~s z=WcGYt|s_vBwS5YRVJ#jiC%1?x~mEP4hdHiHI#{(Y$BOW)S{Lt>9k>90`ce_s>f6P zkBKaqEHh(!vYXUZw)xwPlAe_90o?8`+rzlsO}6<8bVzrrQy1pTG7jJt9@Ac3@&8i*{713Bgpo zldzGR8VGVwZuko%(#3|Yir!mX>9*-mr%N}_q0^1 zD+Z_f2Z==p$;sxukTg=Z#R(WD+u{Tar$rF+*Og;#=e%-MEhR23UG0B$S3Ma;QC)I! z7ey3#Eqv zt*O=!XFr)bsMer%hHH&}WP)mqm#NlxHdPy)s*Ot3(v4c9KXv-YiPekz0!RuopLZ^t zntwTgql_V|g?ow>Ux=Y7s}rZ@R8&7P5nrLMI~519;smFn?IT#H;$T*M(W!Vx zk3(5;qOBfE&qzHqj4e${)hFJm9vaSqlP!Yo_0UKboRF%IH!g_C8(XR9dfw>Dt~Pv- zx^%^-r;jNjC5BkTa;L~qqKcX-gwjYTFrBw`n8h8phN>KtE~=<>5>I@I6`y7kuW)OW zs|i(z*-bp7OpIm|ud<0Tt|n9oWH<4wGBK7-yv8P;b2XuAIlGB*%Ea?*Vg{Rd!PSJS z^6K}AI$*v|;6=gRuMVXk&Cf;NdFHy^stDa-t zG~&_4{8Flas<;#0l)1kR-wChCb~kRnCfoewk4dk}_F!($kZt~kzohB1&0jT^^tx>G z7ltLhL3fDQ950hITNU-Jsfrq{swj2Bb@RAn6(z!+&S7&&@G3O|Q&RO8jFUh+{w=YY zUt?#{cl_HzXa=j#=81TnTK36#gL~(2@0--pUt}M(=Q8~k(a!V1-@GO+Xmiy3u=F+? znwy$9lXYh@@h-P!xmw{lbG7mgiAxi+*~C0HF-P&{Qj1n{W~%>fv6A!T3W(L4Bimy2 z-j!{!db4R|L`?6pGSBCHw)~c@#8SiI2d?>I;uf&n`y9c0)Jj~yt%b~6#I5(KrB4>+ z(FaT~BHBK=AF%WXsZw<@6N_1NiBe5inyOC{HkPCYmU7=x7c-AWQU}#4)Xs3NqLT@# zRogTVLS4*u69<)vFWAH`Hu0sa300)nO&n4tzG4%**~DR26RJqD zn>eCO9Ay)G*u*hc6RJG0oA_FpIL;>avWXL}CRBM~H*r##IK?LRv5C{vG9~Ht%=?CT zbgAq}^=}vXY@f_qtvR3VlIWoFQkn@?fp0JXoX319cj8^SESrAj1BZ!{+Pkdujx>rRp1vlR!KEbFrDvva{$r ze!mdy6)gjpyOZAm(i>3OKmO;eyGb{7t{mPa< zx77k_EL;m55wmoS<&JX%*Qu3wlv_8LcY<3tsikif_xMSsZxL;u$=_J|WU5sCorzN{ z`iD|Y_$F1~B5a&a4Sd6Wf4Z3Yi#1Qf%->9$VbOo66{{9--(+ITIObl~0vn84;9Iu; zuS+Pm+55L#3mi@L9}$aiMou>GilkGrEzZJm*%oKv1TBJ?KW`p;%(;`zpFXoRLsqaSDlKsj~|?hd8DF# z*~l`H$MJmB72#9%`B@y9{H$TgKHrPd0r%}MLZ|=<1#a+a6=ZQoeo>F(N*DKSArepg zl@$xKiJROi;%Y+ObaoT>C=>UxiCb)GcvlnZ*0-A|txS|*6MwLYveYtd{)^1Jk9d?ae@*rOB2Mcc@>I6q(|S|3yKwuK zZ1>{!Z?c`j?cZg4IJa-mDHhXzKN+>%Xy;8g+E406Q+rA`$1iU*5neeCkCSqFY6O0c z`LkAc7gvmfVsRmJ!zCl1{mE1D0J*SFPk`P2X>)6RJaKn>^={n$#cm&Taa)1i{*|g< zGNmLj9~G&CQWCW@oRTV&2}(&zC?)xVnkT6Jo2vb7q@*g;>CY_QAc>@;YRt?MbiC4~ zQj*Lp{~AM9DXBUuW_2p6&nNE@7mZV~1}kQBD%u`T%!>6>xx}c+irItKAN2m6k;ju- zY$-=j&mL4i=yiYUs7-=;mLNTi^5&sbmovz(NhGqqCDq9=km_;?p*kcK$QLB>hp9!7 z#9EGwr%GaF0vWF^i6`b}{d#OEKerxnHK9skyNUYBL<2TafK4={mgyv9VqPQeEy%6L zN}~z2D0$=#`f~;Ojg5k03dB#Hlk&+nr%9vD`7SBHq&f7Dfs={7{$$J3Ujiv^`>J0^;=XnShK zDw=%3$a^Fn-Wr|h|8n`oUN%p!Ofs42Q;LQ+O1G+Ag6(&338f=@FA=1osc_I=NX%q$ zIZM3oN%zV&uV7M9nlUlh&ZMJffUc-HPp9b#FYq(-1*(E9F`a3rkwxmLkgs!W+&0~tt4^lQ-%@)!nFn=Rt)=?9oMg!_E~YG-&hN014c&CN8M z)q+};pjIiUX~t}hq)vZLF_6ej5M*X8XI@q}f&39yC0+zR4(cWdv0{Q#QONVqP5rb}`Du?PzwJ7}RT;4vvUt40X^_Q#->;J&sJ!Qtzatt{>Fu1+}E0R>xTC z=c&`*$hOqunc3L6Vrr@7FO(!1Lsm;YffbuL6>X0bPQ{6=Xj$qZmUrpuo0htsTI$9| z0D2wAQa3V|x+%~3B(iT>>W0jlLcBmz+tF+yO!CXUW|N#9ULtY5k!gK|k!i%G^`Ul# z*XLC-LF;pX)~8KSYZcU51hrCSf^&-osdYsxbSp z;tJxLwsSY;tt4KcUobJ5i4U3R&#hI|lDyT_qB7;? zS(J_hZ@6v5PfTHx+o=^8%&i@Y_c66-*eOB(05R;r(tvo%9VFZ0DHm<=l#8}_%0*i| z<)SU73~ez@Xp5;CL}i)?=2LQP&1u%_tE(xebx}D@taWD^nXa}D75wu0>Tcw;Aw0yL zWZ%9CJ|kXWi0%41V7b2B-S#vNK`ggJ+3hYDw|m&_(4gMklpe*V+)EvF?x~&ObANzL z(7ErQ+(ZinwbY-bM53%Ai zF%;$NLr%r7SaGyd(RTeg6%R*IR1eECQ$-Yc-6QYD9Fgk!Ge(|>d>D6>yPkH2q%0Q_ zdo5zw_*L$&NikxO63-ZMe2=p|ONJX}&T!8Pp%Ww&c%C=QNooRwWL1Uvs?O6S^9}BO<+ss zq^0u&`Y2=WX{ui2&I`nKj#)j6+wET@@x+P2fY80TMKf4-JpB`F_k@zpl(ywf3GF!SvEmNuqGw(X_=mUVULI1NNuTGY^v?V{Pz98GJ zOzkJQJzny=n%c?So*? zyKWx4d#16ev2rqF6|G0#3o87*IsYsY6roxl=|Jzi& z%yD?hzI`fu#0$JEry>)#r`e{$`U$Q3YK-Rfywg-n=MXZxgpifpP7mtorrS>Jn{3oU zw;i=JeB0$B6Lj0NQ2_Cc#tu^=m2?toX!cff41HwuwZU>;9lVQLW+k#G-zK8u6lm8E1kpJnbP zu4$#;W?oU^1?C3>3z#TIMB*H76{i-}b8~|J*&^>Okh!1+m!k7zyP>JwLbh84gmOtz zj&*q7G$oAJRl*SAidj?xRW;d6SVHp$g&84}lL znzojhjIzX~twrq&Z!JHWpsn>SJwPoDYKw!~qM)|W*jnYO)4w9<_!|=957dYeiSaKA z+W&?`fEC?;g>#{?D{!qpc=w_eSk&^F*$OpbcC#AEa)fx^T+Zw85bAN+exg!Ov|}gY0LmU{c(t6r_yeWPte5)smbCSol|c6 zZTVG>DX$epQPp(vuL?yJE0SwDMe3!f+H51nEwX7PCb@2M_=Mi*PeXljIU%U5;=we;U6f7|?A$ickR>i#c5^ z=2o$o^*GvX&c#$&SpEfr$eI{+c70ZKKR?PL&QF887j4L*|9N@0-OciD=gDhC_U+5t zn0SHh@@8(z?XAJUmY}}Dl*+_5XhwZ>HmRNAv)PJF(Am63XLDCj+Zoh832Hlxv)P(D z{d=8Dp^k@G6a5o)uGI1HK4cpk~v|&4&5gUeLJ65zLuDvR8?J%+d*0a4sc3)K4 zjwEYJa(j3YIuVa1lG+)b$j8Y9O=KtfQ*4KV+806XKv4VKn8+?1-w|7qdxDuqomGR{ z=+V4T_R#3ZP4DUti^#5Z^ z6_c3xuk*yKR3Se{yT!A@i>p$_WLCT#Ls8}!r{Yvn)c-YRIahpwCxocHv{B?ADSC-y z0>rmu6zlWzpQeoRyUHlSF2||gFwMBkDE}B4#T%jpn?^278Rc(Y#FyEv*XGvx2P53w z-ZrKumRldYo$liH6?W?j>HnCLlZfY4>YyD#?F{dTH^>C-hRp2uaV9c|(DG zA$|jAmUQ$EJ1XFGRD$iZ30Vp_9nEG(1=vxYg2Lb&Vg&BtS)NNR)8gi2-n-m;FSq7V z%lWC_{q#YV7*brw`pUt45>G6|iVN68QEt8GYT~|VCKf6a@3VafEdD3_L|>0+v>c_IdIPQ zGFI%@)BLh;cA6;TZ?o=Ex0omhzF96x_bwvrlwydi&XXE-^H#kYsU ztLjzXLh~U9<)W_Y6=6q@jE2<;N09%*GBzH+COn%8GtFXyKcV{vm z)wm*9*pC(YSIW&{YEcrd5b{4Ll5ho)Y&}U23G^ma66i~+EHEyq3MF7Me@9p`F0pDT zAh*O(j9Lp~Ys%rcgo2c$Iq5fQ-{H!Tr!gx6NniXq=^lH5BdUgIc zha}iZX~~J>c6`oA@qe7PEc>QL)O~Y;Wa%xrs=OYjsLi%e^Oj@YY3`>#UiW`Ez~7Mx zI>1%v06!ek5<^--NULca;P0u^6075pMgG(_fk(i>ng2*?P1_+jYaKvc9>5QB0MyQK z20AYXkVpe)9MT$wwE7{fo-u%5cmT~pdVM26`}5nzYR zq&H_5dNckv^89#%J6nbH7H*w4xwEy&G@c(@8o~1OV=IF&JwM)J#Wo?wV#w#m)`o`d z`SEwwvTVFIbRo#+$9lH4`h#Rmo2@CY)t|(p%|`7EuhqX~f;L+}dVcI2(mIB;_93mU zu~xUKQ*Uns|4Yt<$Jwg~e=-sG=wrn zm~3Q%1~Zff(<7vH3u#?LS{Gw5*{M_SY8p&32c83wU@*Oymy39TWZPhbrWi~Y+hB6T z1O_8aIGpYIsTBxvtGw)bKth1PJOGZK z{}Nv95X)AeUY-#w`atGYBwipCl4dm~(wO~_i)ba{(N#G-`iXb$mbvl#0-oIb;?Wv zwW*!>Oei3YJVF#P>k~w5dE#r22}MXU{cK3?ERhQDr``Z@B0F^~FEsrxXYJ7@J#Ws0 z(V@T?j;aCKcSO~Yn1Rt0Rp1$xX+&hFOw?%1{BVe>o3WvQ-1<$471{SRwa>9eGveAe zRC88-j+6sqS)?VA*7PXnnTu1kYWR%46+0PZdNvR{v^8-lr%*e?Ii)?Bpq%m?<&=pb zZ9+(UA*78na!N;zaEfz#sK+-^e(5jpLR+>+Csv&5R8-}feCBm3b|FQ53frswlGsU4 z5QFBbEAyus8!Bsj?UzFlGOv}q*Gd+(lEtiK@%V&kp}@<$9#4`FUNWzIke|%FZo~^r zi!Uf~Tjoke;R zY28qAf_X!Yvt3brU=CN57;InS(RQMChPP7+nV{`7nYPngA?=NjHY23HYHX*cIKEl7 zD{2rk-*Ijg^=XZKJ#vO)j}2zU*)bI5M-xuPA*?tjhNAdbPIoE}BSn3-u?gvOzPUW> z!`Yl1RV1s8BxYc)?NfwVmQNAhq7^YdT6#l$wDgWKPW@HWipftAW*Hw|yvu%5$%QGy z%w%4W-M(vcYyD8!-K`jvc+ijGb{@M3xwz$T`UuRkxwU>~;_i0N-HdiVyA8XzeVX0Q z59zZ^c~MNmDC(e%OzjMBMnhr6<5Sil*!Vm_yQ}gjG-t`fKzciD}ES5QJw&&;)|?k`9RM4GtkARJ-tZn z>E*_d^#zVSz0BCtt9X?sl6}*jUdp`5#0#tn=_}a^cT&1v6VioI$u!X`SjbL`q)y)o zzB&|G!xpFTDCF`*PV7tUX0>e(TTiU}=!8pgbYhI|BlbJZWpppI+mCE+ttZyqt(cBG zxn0X{r@Od)h25^TxwW2Hcefwj&04Nwx39XmoxyI`h4f{n6Dt<^b?TrKOYIDw*tf|9 zo!EEi#BK>`n?jl%($*U%b|!WDx7$waEMiii{0IO2AICTi@)+sH$koA}&5EDIP?RU$ zsW^ufKXoeFUU_sX&W)m|E=zl;y!9i0g6iEU>Z+c*M{KBwUsjKNnm>=#cR0gV-euZ| zs2d-`Eg(hxW7GNlEF?+&6LDS>c7_6~^=!?f4$%pGLWl_ETeH z>M=&Uhuto5al4e=?yb6V}@oUWln^^sbGi>EuW`c;ikqI`l;?Wq2 zvet1bZY4$i7*9M$LM6b-kRhoFWSYZ9ra8@r;A3)O$~0dw?-O==Isgv z?Kd{J6)c&?eYD4ojjzWT?HP9anTy+9?DmY!tu@oQyFGF@Zog%>yItJwWw+mk^uwl1 zBW8aebx@|Ec7`*}K{7#^W(8%Mb0O`=kajkteP?8vFR0Uh(UxhxBqjxVi2E+bI0y3h zo;60UGR;@4cqN9S%rs8L!>oAKsc6eIPQ@cp6xCU`hic6Yz+O?F?sv z3uJ;a!FtLBe}%L^LfUU3?WU0lE>freUt1=)L`(|wGWU7XqQ8VDkJoR;$WI%O_I8onehp6X@N{>Sf5BHxJhb(xU^U`!C$6K@Q2C-!j(9ZHyxSaUn3J_PNTKI zMJ`O4;2++&zp>lQ8E`8Gb0@c1*zNBwZvSAnS!`~tHG%tReLRPEa+{Ui{^{cOFLs;N z=GK}C+}++b&VwFflC!bfzg^t^%Wku!>HnHCftdZ<)Iphm+8NFSars3i*iM-sZ<>}n zP0N|4WlzKFsF|qKUm%SaJ@TuQnVDHgFg;?^`U{%~8bTHpDB?V^wu6_`SPGRRva;em zF%)IF?NrRhiucA)l*z@Zm_3T3I^;#fUWq93R7AewJ_oB8bo#aZKr*6k9P(VGs2Ai3 zs8ckJU%kyuj6g}=0C}ioI%WBpmzR4>aVsCS9LZNjD`r@axJ!sDWhl4_hqb8kd?>`Sp*^ zxbBS^gJW*WatuXTM{Z`HF}`9PL)kPr#Ntfc$D$=-nzsj)a6jvmBpv$@OR>fKU5BV9 zOuirH9Aas=7}Uhrhghea*jr`TVSvLa%j)K%o9JiueJt=Gx9*P!WD?UM1^tP)3Ue^H@Q5-OzxdXq{E z^d;R#s$!>AAO-8)w%qdLsk~{CA5Y~@Gv0i@*GMsXcIr3&YMuP?RDm?STU(LGRgvu5 z$E6W3P%%xvhpljD-qH!0n9+wE(O7G4_h^dTO*9X2G?iSUsm#$llqTNOuEK52b`Sl} zLa4+cRCNiV8oRBOX8oaUAu%fcp{;q2`8S5DlelH_DvQahVPWSkolr%vYZBYK!gn(u zu{I({o4wmsxGE2*7TLG2a02lHRnutmR!a+1VX4|2h5Z*x<+WpW&@xbsr4vb7EXc!b zsIqNA{%1S1I{Qi@7xwt;vfJvm1t}bLK^`G-y+B&zm2Gjk)F&<#5!B9b5z&}T(Bs4p zR7BKC(`u(_wbHa2MiJ43I{kHJE>N#}HD%@_^3;n&Q-pn>ytvK0}vj5DQ* zh~})=FovRBO{ZcDR%{eQQ5F$S#g$vPcfEOugxEz@Y} z9M)__M8ujAd}q>4Y{HfwWhHLnSJsi6Srrjaatv+K{#F6wURRY4yQzR&7bs($6QQO~Gs5FO43xVFGRswxV zZAn$^w85mHH{=7u-sv`fTnudpv18plbxgHIZB<(|Ffxx`!%o!X=L9%r(xm+y76t^JuUDgOQmxZ?zg$wLCZjQ zmVTO~#clo!8|rFX5bJI3z95b6W>55BU!%!|J^nH5wufy&>PKCWu_Uh7HQnYS%Rfh4 zy3MJb;oE#XnV{Qz58dYd(zHHlT5_7!)40tiP^Ujd9!hnazsSsi^7zTye2|$KEC~9n zO1@q_k)?+??+n}3o@`8}y4okP;?Nk1@@jV~PG-enF%;$1?o^x-MN#Egd9_Crc}*i% z`&3qc%IQ}nTY0rd)Qu^cMvD4VJOOovi}Um{F#>rEDQ ziA&9dy!s*@jG1_g74JT-bawVO>&Up|1w_1=97?)#V$=|2c@YU9;b}HCi%rS>tA_Xv zn|c~UoXx~27M;VQQ6qJje};ADl8${b-(`!>q`A$O3RYh2kzkG4nin$$`zi|0r4vST zB=cEQ&KdnddwEb7a3rH+%$a@B62`Ep_t=ze&K9z%F_^RWiJ*&nM4ErNxVVEdStNyI zo=6G{^d*g=i(BlY57?sRr`^_U+|P7F_fa?WFe8EJJsmf6ig80f%MmXo`}Sp6!Vy0k z^Ad>RRv*mH#qN&feJp!l>f(JFdmo#o4`nkP8dWRLiA=DZdaQF{Efw5@8ge&tF^;2I z;S$YCj%J*!RzBqRbGCW;pM~%|hp@^egw^c!dE4bUP>hPJ74r&nwX%l9EtB_xn7ofH zY^qkq3-(%K|Mxi+Ya^-^vv*mosQop82egjt+xORc;sqvfwen(GU_480;3(Xy6|;ku zffrd?CuvcwY+^$%*cRk}c0MMuug&Db9{(10J29hf@A7<1V((jByl-RglWf~zP}J?P zgT(a|Q>`Sf&5wyowGy>6Tq}J>Ca6}rLbcNLG;La%HZ@I~Y}87-sMG(NNM?~ApX_Gl z>oVhsMC*UUOuQ)wRV(db>9?FI*j6h|HIBEcmG-jY+c6Ynt>jeP$BHv!D9T#NsrY#m zMRjS(S}CH)J1SBu?Pv8FPQR)`khM}o-MFO=lA=C?C!o$Oahks%Mqn=QoG+&F)^Q8 zU$dx7TxurdwHxtZ%*1h4y!*Hou(K1aBjZxF(n$_wfpcQiO3Gp;5M;L4>wHT(_Qm{;Exw=THd`uKSt~_?HD>Gkm@(K_QFtz$ zu!ti$%bIe|RIT&_N3tl!oY@yG;R81HBb&0#*-vch1I*buBB)k+C(S=g)Jk(@vPgPY z=82^F0)0sfsa6vE=mII|Z}V~Bkg04~EDps*c4R4`tatWwQwcRql~8XPc}1V>D4||6 zN~k3~kV|CWzB-qQ7g!?8hAZ4&Y`ZT0XCW-*5U#p}@H4wzYP%<17o*~`!8|H18-5{i z%j7K+llQBIO=ZJ!!M;Z9|30T;ZA95%_Abi?HK!|hK-bB>eNJx>FR+5khLvf7ggSbI%6PL;cYG=4?h$|qutoU&ZMOijD6|+ZCRQX$$4G~4&QIWDC2di&(`c;>uEE^)~M*7c1iuz`r zfI6Ru)0~?afnB_F@=(jPZ#Ob8FZb@|Rz7M)zq{nU5pkEWhjsG1SS-L6_oVr^I)k@W zAQ5Xu@C8XX@l&>3h^_49R$*%Whq(5!P7%_vkMth4xX(2%HL3D4bH;UV%oyao9??qp zoMR};I&%N2vY{Bq@OhdXVsR$+vuFu7^C~FE)E{7-lB8oFVkx$Gz;%df+sU#a609-x z@oq6FE&IeI9OM{EvyN?uWjKa|7-Cr>=$8L9&HstG<#)-mowQpX>!iH`eM$T2mKV!@ zKU=h1=hoD{!E~LkQ`h;&#(CFQJFfFh#&!M$M_i8V+h@(s5q}Xgb;oe4Z)4{&b;t1j zC3`RL;{5^k{$)nJ^H_W`giLpg;Sk3VaEYM;$8ac3-@!v+lT==PC6Y%)>anhewYG7e znC*A79)~#^%_W+LIGV$P36@w!LCm1|30T;ZA5ux_AUzqwa35a0o5S;_B~#cc!96EygHs1IL1=7 zI12aj%Iu(J;5bVskhCbT64}sE+k*Vh&gcpDRfk;IiAU`Wmv~Ld1bs4ei%Pt+ zY1(&b+L<)%v{B+UqfY-%BB@78yynb2FEhU^@h+H&i-J%kUJI7K>c_?<<2x|vr&$r8_G{twpaMLPB&CbPvqT!*N(oh$ z%z?xU{4FbuLEQe!mgE0tA^gK340Z`&2)q5qme$XUQE{bV9u-#_LrL5+dH;&Z8)jis zrEy!ZhZFn1G&QE8aH%SuDdsV7X)j3E2=IUPy7fG13qhBq9z&BIRRDBLRzvxAla zFWU@~w5T-F*wDYW1+i8d?t9|O-Rub;`wEi_d;IC_))%%;+g-cWFS2u4iJJ#!o4q*p z{nw#tUSEDvgs=Y2*xR*~41au$DQDU*Q=~o&G#w9&x17n83_@f{9<@$!{hK2trjF zFS2yOu;b#fRT^2tw4!_*RHZSI6$`~sl$C~4aS|&Qj-ey#1eI)~NEvHDzAH=m)zvdn&$1^nEaM=krp&*$Fq+`Ay6p2;!M zQKQH%)=YYOk1WvbQ8w%^6XsvLDKC$3QaOQfN&axFfC%Y*cIC1$)HaiKP-H5Njj@Oo zqizEGvL!sgQ8_pUQYJy>$HL+4#d1(Vz|`{uye79 zvAjRX-dDPK|B$^um{IRM7M~0Oms^Y(sK7C-a*1Iz$57$_5<}eG#!!)CSmP4IT8^P& zSTDrW$-|-|SQE!^9ralEgtY>7Uz~z>vnL+nXx6(#vw@>|C@g9&o!gpicK&A}RN@de zx`eQa-Bz+y9QnkkxCl0{GZ(>|N!&7dmBr+3v9PHKt|Hi5iT&T_RIH6Cg3aD#8K=%! zRUXhbvTr|U+ld#b%0+OsaG(lH?cgZfi(s<@`UNbO{+Oi2f_%z`D%%$1f0iezv#*`x z!XE!;?6!JF-QH!MsKMTMxp?2r-fLvk`+v$4H93YoE-~!o7;64sVz}!(QHx{P=Mux` z978SJvB)3wSR5d6Jx@6DYjC0_J4jqA#HpR(Li{T-L528jD#YuCwTHu6VpvNs3h~3# z>8~&EX7%Fy5oR`&H=ww6{f*2-V?n4w{3uH|aaMS?LOjt(bE*(O#)?g2D9S?IsrWT3 zHjAMs3vs97@hFO_=8%PWM3Hx6q!2&B>J6NJRbeCx@rb%nvYaACy#Y@^o#rB|ohC-0 zHSe5nsAW38k1+2H_qO5Ix73PW>&R*_;x3^r>wL#La`jXp{ykf48>V%1ShE%45o<>9 zXGu4)1zY}st+eCTkL)9A4d#feJ?s3$Ix;R*h@WGN?Oo$ilPW7ZXI$rF#vlvvh*m-e zj^P69$o;Dd@rxWohp-&tB_=wu=w&zaDk%F9>vR(9dWF>=XZ5SBZazbaotgbJ3v}Vu zFVwOx{IA^m1ovKxsNb;=j|>upxbSqHEYJ z6X;9oNa2f3`4=hZP5Er`Y*H=uq*#f+*^#9_w-!QmP4)T1sy=UGBq=??QJ>d0>ho?q zkblU&efj<+UZ9(-#cp%^N!tzdKMSEdhu|sb48cphKzG}v(@>0xYccbvxEAw~xMlKs zh{=nyu&Ea7DcG5a{om(Qtc|F}%-&@!rslL44=6L)x6f%7;sttfEtVV(^kk{59EE!= zW_Hjrkj&EANLtilIoMDS+k#kYG50;u>~8i%Z}ydwT-f8!#cq3N)UDo_oy%u7^Wbc= z*N465cJZEvz4ytecOHvRhJa_b7%}wa81lNrkdI^N`+tcc?rvk~$1&u0iJ<_;(9d=( z8bv)8g-BelZ>q(_wOp9EREtqN!?jpZGC{RiHu|#b!C`G+SW5|O{f%0z7Z$}Qj)Qq#r%0Dyc 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

  • 7bWaC-~MtmO+J)k7z9{GELse>o#$^5_GyH5LTMZ`G|W@s z^__H&;8ZzJvlLqZ-b`o8d0Nqppu(bUdR963*3AJ)oKq4%7!u~W&gwf~uJzD9)oL|J zNo_ZDWJ+qv&>@})Sv+HBcs!m=p0V}l;9n@miRFqibkWTapBW`_)sQfcHmmO%yQ*2s z;wPV1_<4lp<)ir>+||a zg;<;m>HLwGEJ`KLkMn8vLJ~QYL{>w>Y?LJOD2beggv~|)C6U*Vu-fny_sgwc%rCaS z_gLbw_q2<5XL0LZ ziyP(_Y1cQD_MDH>>kzr;e1jz4JAll|G~1VBqk>tkMJlhwK)(Y`@@j~?w{a%%EOh@}YZ7BsC4#u`*Au7D$X3(!*(G3vyDsVb* z8gMFb3Vq<`qnl!)zks+YUi9bp&}r~aAQy2W6FhHo(N?$+b=d+KnGc)?d>1$e#%IC! zOc;M#8Gj?X@r^LD0k{tM5pWHRe+c6%VSI%$zSQrbMB3LhJsni+-W_TVx6-y7EN(ox zO7x7hS!_D{F4?72K6R>m?5eU~sqFQ8nhzdqGU@g1_S0o+Sw1k-v`$gTT?>ON-oD%8JG{U_b}<1S)-)j)=`b`EbE>xZ zS;|3AMD{Zk;@-FmhGbP!hd1s#i<(*VB=IX^_ysXsRWV$m#TY>kv!*HX`hGSnn+%hc zThP8q+VX^6qjj_B((M1K=I1w;-hWl^U(Q}%TzUD#<124?xb2)H@{yJLI2omRYsRBwJ~udkH!;VTI&0iXAhmR#M!b}g^37_m%QDd_bT zE$<1MCfVyNt|G^l@K#=l&rZ8f;XAjexS@FYmGgDwOwh95#rr zLQ`6OP?$Ec$Zj>*t3vkVo_NR^Q&snv>LI4Oz$DM?G z0Feo73Ik1GprJDGh?{{%b_3p)q#*ZOGp7RW$Ihz11NHX_%gm|Hl-Jvi=CiFSmvXN1 zdfNzNRm5Rc>9bXNx|Qhj0Nb_X^*vhNlQObnFxfMXuQgg1Pib=9Rk?ng7P56!p{qQL zecnTfJQ+=-w-V_YO=N%)=^IUCm=YQ6J`DqDZ2kI;q|d=<3~_P{UT;dY5f67AaY%U? z$$?aJ8S&FfBrTfA7$q_)n#edM@@#orhSrIFQ3l;jVy)bEwrYX58t`jgR+627p zIsr43xmP&!8ZHy?mJ)eAn#dd_GK=;*eM}R%1H9h1IiiMxMFC(P^L(W?S4@iaUKac9 zeI>FWiimHAJc*gMNsQZCUOa%rZ7DAvK;kx+m(SjtaB?>Sb>IfzI^bI18sKW+Dv91@ zDx}5bJ&gyYiYF3$ zE9DGFp8dEM#ebPZRk~XRxKnsDtp?|`{j|UMnILlXy}pAKZm%J!DI-VrvhWYk2*blH ztk27PnzZXYL_Bw!o}Ic-7NTg%GkIY6=m6b9e54+EASWK&%mp|E5OUZOTdf3 z3&8Wha}s?&RFq}&*^07k{=TAdcb=)}Y1q(|0=ufxGp>XtgDs}XVDAMM0Tu!l0OkYc z0pSb0cHaFfF9t#2>LGs{U?I{Lj`>+de9XRbO6T61ItPDmDS`-l+ol&l-7)y zD5-h)Bh<**G*7QSeMZO&MO8LE)v@+%Y$rbz*w8KurQ$f>`gU0bu4|W>AH}_^ z+Zh$u%61<5^ick^PNnYU?L6k66ZI2@y}pmyMLzY$r*2-~+IB7<)2?af89E}Re-B|r z=Iyb<3LQ4z1Ks6gN%`(Z5chYdkMhRxK)4PY=Jl5C?n$9)S%oz~4b59oX$4$`s6eQ! zM6@U(zM6=kx)QD8D(dys=q{3{@!3a^>?e|v{FzTJS0zd)ZKVCU))IX!y33CQn|GI= zhBxajZe(u*WvX6xx_?Fvv`j-%cTba)5hGK34;|9S(ox6Nuh-Y8yNB*j%d@T5*N{d) z2I!KmY`JuscK6Wdx)xSr9;~>{BUd9o9JlOFpA$w{G{7h6r@ws5b?q)MjwgU!B>Eoh zE^~0_?lK2=qJhdMx%S;X&1uW2Z99_I*6VHC-P1N`Uh-76zk0QJ~PF(#fMk3mEz1~`e~5uqqWn?a%iW3CxIt`$AMo1j{%PYj{pw? zzXBctehK^nco291xF7gAa363la1U@da2N11;7;JDz)yf519t$o1GfRU0=ED+12+LT z0(Ia9;CkRX;9B5Ez%{_tz*WExfh&P4fXji)fJ=c(fQx}2B+I*EA$|1=|AgtiWVz)Q z(CW%9_ikhZ;HPz7@0?_Qv~-jLzKhsg=drndRD0z6WY3V`U|H*`D&Fh;HrX>WwbuwP zf=$-E-fxmUDMLmM@w~vYls-IVxb*xf+0!qj@1Q>7tW%d)cF~F2-CykTxLv@{=#M<` z$EG_$e+v8r{EtEJ0B#3vL;qILTY#H^o6x@zv<}<={(8{sfNOytp??kN)xcH257EC8 z^a|i|@RxyJ3S0tQjQ$TmF9N;~T!{YnKraB!2Y(*ucY$+(bI?B<^gF;=;Lim8Ht;R* z-vs>z@O9t};A@b374$2>>A;tP(;)W}=&8Udz{$W#kedklMc@SBc=W#j`g!0u;B&yS zkb4&N7|^3ZKLZ>Ed>Z}fpu@m4U<{b*>B;0v-Z>iT*D@9|U~>^nTEvgWd<+3;rJ9Zs0E9XOPm?t1N3&_Ht@HC-U8eV+=Tv(pmpE|@YjQ02YM~&k3g>hy&AX*{0~8|1g-!s z2QGu$QqW6)i-8}Ye-Y^SfeV4}0T)1SKInPCcfp?vdJb?l@E!Ee0zDJ>Ht;Rrn~-}0 z^y|PGz}JAULhcpN(}6Dor=kBP&{Kg^fRoWb3G_tZi@*u!9}oHk;Pb$7=zk9MSm3k3 zG3Xx+`WfIT;M2f#$b~_t0YktbFcoqmL5~0q2Y(pop}-;F4+cF5^gz&0fldKE0N5Yc z5B+^X_W||>CIfo`dqTbk=U<+V#$Tb7q6xamV82ybvHv~2S)<^#%pz8ta0+Z1HFz7nKL||?7CxEU6 ztO=)<7D0(}Vdm!Q7@eGv2k;C|re=-&r=FK`cVH~M#h{tUPi_$m570sS#>2XH%Z z8|1cv-U8eV+=Tv(pmpE|;CkRX$gKta5pWG~HTqY9{t&nlxB|Ewa?3z31ug+DM*jz( z7XjY~eq1{W@?4_^*L}75EBp zI{IG*Jq`F0_)|eo0Zs-^LjOe2F9IikKOXc8z~_PEfX_j0Ea+!}V}PT9&p>Vz=%<0{ zz%Vckav{(`U@CAV`bU5s4jcv?ivA&>2LlHI2crKe&?&$H!2am(2f8n?5BR-7Cj)x{ zdjfkvt~=;%z$bxS(f2~Z4#4){w*%c4*arO8pj!c30$ZTJ zIp}7Kn?tgpeq0$1O|W)K(0J!Kd>C|e&BtOD+{^|urx3pSPF6_L6-m)2Npwr zQPB4S?*SG;e__ytfCYgC(4QZ4K44z(^MK9`%msc<&^dtF!OsRdD=-WAnL%d)#)0nx z?FD+kzuiaP_y5wL6z0!|{{j6s@GtQH1pNo_ci?a6zXkdx@CNWY`mcfh74$Ele+FI! z{|e~Kz)Qf3zzdK&5BePNC*Y63A0T%Y^!LE;!2cHX8Q?eIp9XyjcoKL5{l`In4Lk-s zivA;@4+Fmf9zy?@puYef1Rg;De$bx-_W}2!e-G&0z+J%4(7zM(r@&8uAESQ<=w)XgzZUdIz%{_tz*Ug@5cEpm3gB|!GRQ3jy#%-z_yKSc z}_y*)&2R#G$8t_%%E0CKG z`eooW;7h=%kedQ}GH?=bBJf4XO#nR}_yX{G;5f)V2YM{PDpXvjSSdKBW#>cDEis=z9c zuMD~p@FAcEtO&UZpdSPVfDfR*JZL|#9Pobh-v_!Zune#?`r|>D0+s}pK!0)2#XuJY zeJ|*HKodC{K-bZ%fSU`}8T$Ylqe4VV>}1(+F_3G#8EeLyeJ z1H4V&Gr;%$zrFF?5BwYW7w}KW{Q>%S;BUZNz?+b}0s1=VYoLDx{sR0N{Z~O>0euI20Otee0pA7Ah5Q`Qvw`mbX8~sd-v+(~y*EL>0el@e1Na)`UIqOMa60g1;55j+ z1bQmyDWE3hb;27X&;4_dL1^Q`VIxq}OgIox7 z5SR)a2^;~r;h=|s9twI0a4`6TKo0~y1x!Kz0MPw`{eXSZ-v@MWU^1{5`g?-z0qhR! z27D57T|qwq>;ilo{f~iu6xbQq3H=>GcL25rwga|>TpQ4>fvtcofh~Z|A>RyiQ(zNd zWArxy-4NISSReh5fUXCu3rs@)!@xS=CxWgGIstSo&^1BV09_qe4g9LWD&SWJT?zC< zKn++C{S`nz2s!}z0bqHcA6O1}Kkz>2l?7b}SQ;1)ECnnH`4XUu1B(HR0`CRh1NkDL z3j+%Q3jzxO^Fux#=)Ax@z}&!Gz?_iJ0XjP{8!#&{3otX}Gl7l+`hZ@b2Y4H=yZw#V z-TuPsZhxrP-EJj&8ujf>zimQ)*F?QSJ4U=_c_Z0VpWYnqJJS3c&r`x`F>e%0U8uWzr^;0V)i<)(VQU-tL3?qHsa`C={(_II7Q{r&AP`FXwj z$b#8`oXkD_u_&E-@o&>d7RGqH`c!{UM}Cjc@Wt5 z*Y*;j*Y};_1g|!#Uzs`A-_xX5${^D_yk6g#{+@PrxswzGuO;5u7VqZzPWSh;>PxTe z${@rnei3J)$qYtIVR}cj~;pWBu)K-_jqf>F;S69MObdgp_|r z1-ALGLixU-0n$s%Lpu&kq4&p4Bmcg?_|2-wj-uc1C5Pf~V7N@iSsHW1gIViDfBv1G zzP(fXI^5Hn!I^SrHvdO&tml)P)t5)2H|GH3h2v}kT;B=JGQje;oAJz+=Fp=syDbFz_qz4}ty?_yzDF`VWBK5Bwas5B+;V?*Z-xe;4S_ zfIESoqW=@n9|L!Qza8{8;8yUrfZhz;1l$PJA-4hadf+?WPLB9uj0qFU_dBAtkKNs{I;B4SKz*&%+3Hoi|TfjGg zZvbD1{0z{q0bd2a0-O%HmqAYhz66{KoC2H-`AMKB0$&79K>v8qF94qhjzj-*pvMBA z1&%@gXwc69M**Kke>&(eFbx<21|gRUdL(cJa5(yhfgTEa2Pi*bV(pg6;}@0{kwZ9|t}Ld=%Ija-BeT1a<(n2et#Y z1-5}+YtXHLErBh7%^}webW>mxU}In-$TbAr09YUR2>R=Rt_w^8|6$N|fQi7`=uZG$ z3s@6a1O3%OR|8fBRzZJd(3OA>fvw$8PKIc z$Ac~fx+Lflpo@bp2D&KlUhwY$T?AMd{6e4$0tUmi_z!&ZW zuY+;2#Bj1b7(u74Q(`z6AXR@F4I2`uBtW9Jmj-7q|y)eg^(d z(4PW70e+1B9iX=Zw*j{Tw?J+)=uNap6!a3{V&DhpUj+Jn;6mVg=wASOK5!oJUEo~E%>g|d_zrLua3U~TXdK-UCa z19UaeRY6w)RtCQk=!bwB_!U7{06qwQ0Q3XE^5FYHmjiu2==*?W!7l^4G%)`Ewf7ZJ zQXFm9(>;URqCvy-^bEmSG(ZT!Ex1OogfnOp&7kCcv?BLnJvx0vC%!2gH;F-WP zf@c6v4;}!X4m>S*8t~NMslZc$rvOh5o(w!GcoJ|6xEWjqm%vTnA3NguPTo$f@1X&I z2mTiP4ft#DSKu$fUw}Uce+GOCe1iPP;E#Y0fe(;>AN(HhF7OWWZ-d_g-UQwNUPrlW z;8%fHfR~Yf3H&1PFW?2>d6YW`einEJ_$TsDgP#JP1fBpMN4aC*M}bFxhmn5>{2=fE z()WY!1MUUx0q#b*UEn)`JAm7fzYTmV_!jWZz)ir7$ln0I9=HzaYr)q5R|Ee*{wna5 zz!gYe4!#Vy6u1QWi@_HG7b1ND_Nd$ z0q+P51$IDwd+>I^5MVI!+k&?N1|hvQcq?E_U<>3o2mcxP6ViVK{{h$x*cACqz#9V_ zA-y4Z17Lk%Jz!mws{>ve_&u-|uqMjY0Iv?L2CNFKf^wC?D*-D4D5QmA-yPgAg~D13xgK|7DRdh@ch7hNY4xY6)+Fd9pH9w z72F0?kZuLf4g3@=$Aw4O05}*a?W^frO0ZqvN7>esZ@ICNdD4h?y1%Cs44Sa?Cm*6je&w11}-}BKTjx3&8Wp zKL>smcn0_<@HEPu0zU~n0Xz;ohH^*2j{pw?4*?IN+yU_Yz!c$>5WK6M++uKOTG>a4c{P@<)S@0*(ZZ zK>l#>VZfolA;=#LJ_tAvH~{(m!TSOG0{bApH+V1bp5Q%z-GSYZ-xa(I@OPwl2LBD% z3HU4W9tG|Oj|6uCoxliSILd{A{{r3-JQTbGuszb-frkKtk=_=( z4R{cEYw%XUmcSOsZw~%5@F(Dpz#o9kP`)X66JTRtBVa?6YXDv!SPxhi`E|f+1HT8> zLViu~8o=tnYRIn&UIkbgSPA(R!7G4&2VNfhTkvwgZ-8ZiWl*j(_}9Qvz>>%>0bU$f z3|JHxh;l{13j+%Q3jzxO^P_w|@VvmUfO&upl(U1YKpRj2T2U@H_?N(3z?{GwD3={P z8+camFMwHqnUS9fJR^7p@busTz;sAY3rqt{jr>&LDZx{KCkIako)kO@xCLki%E*_% zP2eBt7y0H7!1us+ba#sRE%+PYYoxyde+m8q{5kL$(w~Aq0e=ks2>1}`55VsO?*Z=u z@1Wdm@LRx}z#G8pD0dC~D)<%f%fL&(i@?87?gIFE;5pz~;2GebD1RFK6!=N-6X3_e zj{%PYj{pw?4*?GX4*>V$Jo~`+0`~xS19t&;qWli%V%2jymi&jQW_&HzqF zxoO~2fm48!fs;^fBKQR0c;GnTSd<$BJ{o)!_(i}y5zX#R=*2Hl&z^enR0jmP504t+>CGd*C z3c&Ax<$>R#d^zxMfMtPYfTe+7qkJjwlE4zc;=p3Sq9`8-UIbVeSO{1USODeogXaV0 z1%3t019Wttk3h6_z>|+V&_^KVCL7i0BM@_T5bg=h-hsQdF>43jHpVQ>4mL^3)WPpj zijtI}19wlTwS&GV^wSoD$~(3fG{J)zITxWYXR^WWqrNsq}H z*gc^S!~Tywp>jB9PiWF`W>09UaNj+lp9GfVWZ|g9f3IhnaCT2ol_Jo?l znLVK&!nk`vQ$UJh6mSQ`1Iz)J#)0Rxd=B!a#ip>PC! zIYOZb`f`MPD3_O_WH$s*BK)I7-Zv*nxg*G11b+42%B|=xKFAe8-l`QG(khJZnKqQk zLDT)VeoIm|j$)GZMT99j*sE+GY^!%f7^92P;`5L+FHt4=s|XX>B51W>GijcSxB3ShkN8B{#awKBzLcSB_BWNcvhZC*|5=J@)d5FCE7vy&YhSGGo9qBaM zBicjIX<8X=ra8xdN%~0;)L_yv$Qv5G_PV$A*QqsWZOka#hAUo>SUmlWvzGqU4NE_` z)0d*$hjtCQH)QGsnR?QEsf!W!-?;AmDsZnW<6aMc_quUC=`Qv}YX+xa_X+rM4EzZA zVeo_C2f+6M_ac2a_)g#s;5OhE;6~tj;5v%tRlt=5wf?dK`OAPyfQx_&DVi5xD4LI< zXdd*Qg>o|~N@I;?HHtqJjSvh)!vsUo5W!G1h#S@cg0PMwK_tU}(NaELcZPpxCzH@t ztyi~pa3fE`)xsFLCismX#;-=E(Ss_x<6RynbJ%p68&jIenL=$U?)}O(NuC(t^&oxk zZZ_V3pu`WDBzY>WqDqh_h^b@}kx6@2|EDu~4Xor1H29DHOZ%JfzxKw&>qaNKs@eMK zjp1ZgpuH|yk}gN+uXphOk=DfsQxxxdb3u36=Y`euCr9T5(LW=I{%IO#QlCN+9aucUHxUh#ufjKK0oq)s{x&~ku66~tvGqLz4jYDW7sD{S~}R0 zhS)+cv8fna$a^~I^f85#J26S7pWM%uBu@SWQj*g;KV4bS{D~piVMta(lq_OHGVu+` zz%wL3Xh=5J5N&-Z+hK}on4*YH$;~$<7tfR&0#itx#c7>#FHP}s1cAY+5kM)ET@ z=xrn~&xSk#8zecF6?Jwo>g+78 zvlGA0cwU{c;yMS>I^}_=yT4I)U#4!O9rR}E*0t}+tGm0PZb=>>(taFl8DrQoN^Hvr zzAeLewhR&4GFD{EEZ8!`uw|OqmMMH&Ch=^UAhczs$d;vu)e_jWnAk)IkA-5J=JRcu z>rA-EWL(*23oIfnb1$h;TRZN-AiEp53%C=5?lug%Tj`)HZ-J$24fR$tmKwci6=SL1 zi&n6fE)!TP$(x)ePrQrVzcA(>lDxr5*4;iS>&Z~qA+()-^9KuY{dKGII(Ced@56=$o|!)o)Yg#iDO%nE-y;7FMftUpzESLz zlfF^xrIX&qdVzA!iIUo_i)VCBAU}qpk8q8@V<>n_tl$m4g4b9DuLu>q?=(4G+6^%u z6(2as9qW+bDxpywouLt)X6{f=NSh#f6UkTv-X(3v=cs!;IUhPr#^HFOpV8D3)?TE^ zWpwGYd^v-Q3YXqRg$r;|;nE>LEies5DY+}5sU>y!uL_L*XmR;pVfFqfyO@!KyjhQ| zCwXgv)Gl(1cAcc#WtV?n#QVqFRXf#r7{YgCj3ZCSF#}0UGhsP@NZ3ML@ zr@-T!hR4~(9%toyoQ3r`lh9);$Kx;kJD9H1tgkFw4zL+&ZToyY&^(&zE!A5g9t%{MnexrQj$fR>Z%<2?0HzAktjU~L>%6UWt{ z$4M28hEkr9*XSDM7U zf$NHZcR~K|DBl_UHwE3dJ~DaAjB#gONmyscy8OPWmgE?hDJb0c zgkdgIEceRg)<-s<%ALd<->Fd~r(H&qHWwV%D&Z}b#*I=Jzb$Ha7Rj7*EsdYN2Dlpd z2XGZZZBDup?QaEeIdB<8c`@R?2yvfj#C^Ir?o;`3pUjS*6NO=)%Y<`234s6XbQUjC z^B7$h`gi07{^CjU9G5AIPHVl|$82)`4n8eJYizp0Uqb!!THU! zyjjNiB#N>L{3Ck&2ih{s?+KD`u*~nk-=d|w0e?;NEw8{|BL4+xG1~OpX_%-BT1-}A*8Rae^ z{UXx;0>1z}4?G7vOOKOJqeq;=NPQCeogn2jdyb>r5tKWOp0my9Ia|a%XA{5YY~YNT z>x5lrzyFB2lj%zb{D;QfoX&NS9Om);+GK~8rtqET=c(>3>ThP=K0-F1(D zch#=CWTeynqu-_AFB$ntpj{Uy{XqLAZ!us|U?4@g5c*R=+CQYckqP(u9g)IWy&B1# z)hm(gwujt$8gE*kKhl5dQXtZJOR+J&=Zj=6Li)H<9sRc&uqv<$urfvITjCF05Pu`~ zrwrepuQ~pd6#DZW@yB=KRFUzpJnM}lS0KfFFMyRI{U>H5qLJ{-1#|)TjGYzGVh1_Rpy+W>=rt%0q8ErBh7&4E7yf1+q^hLN}_M(!rmKB>MD zp}OJ-)#gX27AHbAgb`}U#G?T(9*r3FCAo2=wgwF&-!FJ|d)oO(X!=9)eiY@t1hs`@ zAEft2dM~8+1n&Xf9lRTOSIVVd4Qb*SX^drB3?q%cO!IK0aSNsSEz(rS%QH#-ozoY) zc&SB}G4zX0>*-KE~9|H;GE4-V5U%k#mp$T$je=0nXm-L8{3GG|B@f!FF?mRWzc`SD4 zA>W<*tUGsw?mTDQdB$_+rN8Zx{36olwhh^slEj^G*U#)0&g~>OcW(EQHTu24Xi`&J zqo&kMO~!>QB~z1r;Y#jiXOT(uG~O&Sz1vi)s81LJ+}e!M7(Jz}&Kbx)=ways5Rk#2AQ%1VR%?swIPh5N zg*nEp-?WgU-1Ppj+f8p$L?Yis^UY512pk_yQSON2Lg{hl4k+Iq<=dfr2zW4#3&L@& zaa=1L*AnGg;JD`CKjXL`a9lGS*A&M!LAk~_t`T@c99Iv=)x~jjkY5|ee-B;@$JYd} zf#a*<_$u^xsl3sA%Za03mLL7noaS3f82-v6sJ^3kMUvth`0sd4q>^82Aj>efDc1WN ziG&HOj@qu;e#C3-($*K)hoaQO@V1-S+b(=>J9E74B=oiy8Oi+b{q^Rx^`351m@~** z7-Ii8*gY0Fh9J3BBMmp~A1bzgFyH=x9Q*qV?H|Fhe^R8jO& zo08;{L02+ICCrGVDB;}oBVVoe9JSsG)k+cNe@RI~QhYBdmMG?~B>6#M6ld0vJc=F3 zl9KazFRnE4$ZVuIl|n8?U6zZ22U0W_0TzaIg}@6^>C6Sd^Fzw7AY~pZrIg!{Fqc@u z98uiqf3_%gQvQXW#+#Ho7zq_dLMu-~l_#N{BcY8i;rCPmxfZY{um-R?MRPUqs=zA1 z%D_q#rE-R3WyO+}=1W$JBUuTdWEC07$}^IE%ag1^6#21)@AvxO@x}QC&UFNa0y_ZP zQ#7{&4*>=P+XCAFgD9F?16v`zC3p+)<`kvIhL{b-V%F!2S(hVbZK0SyGh#Mn#B9P7 z^G8<9pLk932Tqf0#!($#&1k*57kX_^sM7Ou;_iyGinSo~wVc;|%FB z4~^D!pRv>En|B#I^}czVZCy77W|Ep-88y8S*Yu2E(-XF)N8*|!Pr`WfQC!n|eob%L znqCWQlGAzUjmfkWrIe&*+TxRYgwyb(9_}2{;$cQQ*(2Qa>+x^isXUx(OBzzldn!#< zAUR=bR$?k$T4xcPnu%{}2G-O7p{dy!Q?v0*&EfI843Z|}FaoJEHX4mnVQkbJXKvQU zTtXZ3a4IiiR9;A2c>#Xq`Pj<85>!q?QWdSJ3Pp2e4_*9K0*HynO9tXc-fidtm8r%bn zB7SRQt{XfO+(l6iCwh>juN+48u>3;LW9dlqEup{;I4*>iHwV-5a$9;{OB);)gz~L{ zt$;0oEr88|KT|aSfb%xPd7IMnN_CC+)E3957C$~U^kDd2|EdWCM7CS`UF{l>6z|O# zl3b4$vL+r=hoGpYUuzH2@P7MZV?Di2eV@eo9{mUA%qG)Do`lCARSNa!ZwQqvN|8*q4A8(K!AB zzW_WB(a(XO1wTVkK840{5{=^of_t3iTaE#b;5b@*AV;_gnS8n0elX8M$!Bj0zZPl4Caa+oPv zpB`8;((;xJG~bdQ7(kFLG-M7_z~5eS!7K}N%D|kGMqG+B<`~nxqKrBEbgu|&P9cFg zlKeFZi|^XG6fZ2LVYBfiB(b?VY^_XerK^jIVq3rC+xjhQ>o-DMt1`A$;n`Y^V{2pR z+X&bYw%0epUYD`m2zzbDc0KI1Slep|ZEwH{x)a7kP&9|5(}$5xtNkP^6rH>S?X>3h z$Zv=8At=`d<$`EAsfE#aerB998qbf6Q+nfR#yZtR=u|5vAT4NFNA3fTE>82DyH8P_y(!dLLkKr1t{$1ooh4?utRM3kJd8>2Xq=p;wGpFArZY zw=RzF+}$M<>^DZRP9(*5?jFyR@YiVnT?~@kIa;5hd(F~t)zyCPHIw>go`E(q9ef(m zLTg)-i5A*@y-8>@;|vYPh&33+*I)$OW`+qRn7~Ldp6BpHw#|^61dELBx`46L=&th^ zEA{R=2a)o=(>6rTc{UDoX!L$?YI-A^v#e!Jl% zd7q}W&%Sxmfd7PuCx~tI>T-;+%@FYjW1BAGA=pN?KpHoe4+w2L$%-h+r~K5CH?l)d(Ro6jaQ@n_jq2>tv0U9l6*6o+2eVQ9Ob>uQj)Ke z8hp2N-qIU14&$-qLDvAd>$L|c_?=MKHv4btn0T0u9KSO7G$P2wX-{Je2zywMDz>Hn*d2QySUz;Je=Y-8UC|a_|=<|6? zHegoZ7cq3+pD9M4-(iM=e#_p&tWWhsG|q^9adO;yD; zRp!@Jk*(=FK~0ieGsb^dtD!eLuVJlD3^T0NB1d_TPLljRslj(xtE&s>H>}kr#k>zB zP45RZp=QKodbw#LcDWJX48@ax!xbBAx0F_^}GO61ak(7OLgo%P2|<3_s_I{hY)1a~8+X z8A3l75wE;=p-b`-#`DFD=L>nBFXef@51#D>?g8!w?gH+lC~Y=8-zfHcJ>T=S9M4w^ zJ>SOoxt;NI3(wE3jGvOcgS{Zim*Cn(;9tNC!1KU!z_S#kx?D%nJJ@~Tx&D#kx*Y2_hbH4+3F?x$I7Le_@S+suKwuH17X~i`EJ)E(AXZ<8Sn|ix zbxJ;p<~*@gBxfbU`;Nz1nBZh43P%Ko#CcsmB{@SZXF-%Hmb2kK zV=TMj{R>iwcZW{6Wv8!yT0y0j6fG^ln^Tm32L6QfAHjd1XlaJ1HKi(Bnn3M_h*|?g ztv-&ghy1$Wb%3>z{ylgt@S2EPHAJl{qV}y3wQs~xE5nc4*PN)86h^HI6SYcA)GG3# zR-PBN3cRR&$BA0y{}i=;R3*7D)apag(i^-N@_Pb%AiX0@;xhNHW3q?|$0Pb+nrg%cyMfQpmT2qGd7oBIGXwEk(~&+6d@A@9gl!_iHUVK9ZiH>9IBbLYVH?N^TYq8L#xr3X%Yv`ea%!YF# zFPs}V;oK??rzMWg-ONClqFJJ7F@b-i^2#58?;-a)@VDS^fUkkC5RRANFM!XH{tWyn z_!ETfA;R_mVY_aG?W#Czm-%74$O+p8Vc707VY|zO?KUrLH+W&Y!-nk^FKjnCVY?>| z+t&zJDPT!p352USMN2X8qR0;f7D0Mp@It_XzyiShzY!-0 z#nJhy5=ZB&R;1^~@m~USAw4H}4)E;syz&?HJaQI#9w|*+!aOxqoN%6+B91#xO%}(_ zQD(1;LX8*rfB&I0sfH&#_|IK)C2);i~u)6dP5xF09YUC z^}y?b*Fk`5A;2{e;0i{7%ZmeCjvwH%oB)>=2Dkq14gn4Z4gwAY4j`yW(4TUtry)Uiu>@WD68z4Q;5VTJ zeOL*4GZOUTNzj*(pdU|y$#8KJTpLGRqhFVdVO%r5aT~?Brhnr$g5%mSp=%T4Ow6Ox z$9s8#oB5JFfw5cvA;M}{{s(Xsa3ydBa5-=pK@vo1juE_BjEBaZ@EMGU`knA;91o`m zJzNxL@_nxL0umG7fqqGx-vg}YvjLyS1bnWSOvdf=rE!AiQZFRKMR2g&r`Ifw^Vv^H z`odwzbO?A5cmTK`xR0PF;}%24O=1~0@MT=bk#UVs#$En0?qFox<1gcOR>p0Nj9Ym! z?iIT=G%MGIIpoO=Yr7O8(yNLixV^6p>@3lz5%`lz5>1k zzMv>QGFssS#%!ZA-($?yJM$fm%(sMgKVur*Q?`vgVcOVZFL#Zu`kWcjhy(%gbfJ_E zn3keB4R~sTTE|NgpD5$FP;R~@2nfW?ojAv);>Gd?; zj6FL~ha8L!xfvaD@pSl-(IF>ShcfWDH1KO+DPT!p31D%GQXxZ^0%BeA@pbu%xDcf8 zf-!osLnupNy#Lj#C`s|1ofYOuSBw<%Z9+xjIWGyX4adF*)&kaqqm>LtD~KH}&v&#O z>u6b_qct?Qe23ENjHi`(o>n1#`MFwE3x8YR(YhLGCqBPhPnz14QvZI#WJ=XBbLQb4 zBPut0pQ&EIfS)3Eznf7?GMP;6%QkmAou208%_kj0+Ipgzw{?cQLc>DZ1-ZkUw+(Vd zd7Kd;g-R3-EL^mCcvMVVBdwM8Zr9MZ&D|kkAwf|g&12dY4Gb*o3T|V1oGf#>?$&|U zKGrw3vDRtU>DEQoo7Owlx7GnlcV(Wfr?N-stqibDRTe8VlaWwWwVIinmuD-O7R9D$os0Y+l>RbDIwTFGHdQIJ2~`|M-wV;pnr3+x;0QyjbOa~!+viyeFHOC3k-3mup2gB{oG-5rnYD;es@W;iA});Z=oHaWU(CSsb?XUJ$(RF@~ZNAju3rzL-s{8{qn$-7&7 zSbGsM`da%FQ3hLwT1Qw%TgO@_>(b1!&L{FLu`ai+vaYeNwXUgNS^K$b8p& z-}=D%$okm&)cVZ&!urzs+WLlw|IYfs+EwXBLeNv`MFP-A8K4YO1}j6AVajl2gfdDQ zt&CO1DHD{5%4B7VGF6#Q!ZVA6XRb0&nXfER7LtH1RhB6$l$FXK${J;@vQF8cY$V~^ zs%#@6+(iPrSJ_7bc~Ci|99E7fN0npBapi<^QaPoZCLunnoLBx*u8^=@C&9a|+*R%= zkCZ3MQ{}nxN_nfiS3WA;NHF`@`q~EA2HFPOhS-MLhTBHkM%hN&#@fb_@J_T%woS23 zwN0~4x6QQ8vdy#2w=J+Ov@NnNwk@$OwJozPx2?3TvaPnQv8}VMw{5g-vTd<#wQaZU zuz)f?Me+dJEP+Xvf6TUWK4+Fk9T_EdYTebl~cKefL)Kpm(KQU|L;)M2Fg zjZ{agW7M(gICZ=_L7k{hR;Q>_)oJQq3Ht?CYSr@EUo*nOl4A5xE~N7du%N%gdPMm?`yP%o;N)hnbyUsrFaH`QC} zZS{_NSG})3P#>#L)Mx4o^`-hseXYJx->UD_4{BG^+lp8tNIKUP z(%oh_W;y0K=8SQJ@FHKsLiR_xw zKi-0C37Xsm{gp}?KplYSS~*Sf&VJ=8m;x&3jzV~?+(h#KAT3H>AEO+^*Rr%z<f@-^ZIUQdv{Q{ zwHmqPMp^U5l`fU9d7aR9>@bh|@bPPeBlnZJa)Jf`%$%|$yFldM{+ zFGd0yVCtG;M=-zsw}Ae)p!PRIGRxnY3+dtoX@7}$K(bb$ z;sr=wg_Nuuuy1h7D!sbi8QcG$o3t-ex}UpN&@l0ns6e6ui3%htkf=bS0*MMFDv+qa zXDLumPG+em6{=S}O}h*^18qrDN>!v(sm$pDvP!13Gc)9>R5fjufL;^UCdT#XkLt+KsV<6%VpLZWhhtMPH4xfX@M*5uhgb4@;tNHyj&*W{%|Yi++Z zc^OeTzcu-+&s>x9%KhutcAbA4X4C>GrMvitx3&b&nN&sm>W_gbH;|G@e@=Vz|ZrxVG? zedhZ78_~MkZ+%`)RL*aGKKC=%=e%FaCiwdZy1@ zqiYMTVV}81FCtod`>oLfMdkd~=o3G4jm|6guV15AA`gtI8PU%9@Av}Uu;w3Fn~x_= z=D)BuZ$ktOr2+;>o@QnHWmXI%#i} za_*61kvR3l8AUziFUX-%E6!C8{1wpm=4)r2&DM#-N^fW0$Ifqd=Djy>u6|eZ>s#Mv zzL}3cODmIPCan^=4Rm3>h)$2;0SN5T+eBB8_i#YNyymxy1U)&X}w~Mo=}{h{Z@}A zD={?}vGAL1GeIB;bG*eL+-bHEFt4E0~-f$B8yE(`2ayF&cyDd0NkcS%;J{@Y35UN`m_`QUm_Qbv;5=rL$0WuuigWlB7jfwXmLs(0 zr-|)wr}}qP`i-@f$2*d8VzW8@TiNHI#|M-OOfyhiTpbAm$|L=GA~v-|{PKuv$3!TL z`qBrBR01-SBw3jHj5NmAlf5{MExq!T;;c0fIg>KN;4!JdUR(OY&TpDENlC9HDZ(|B zjGd)TV4J)Ut`%8_tE8Anf(}=PwBedCW5u_Q;NwpkeFQBu+HH>W|2wTqt6^+cQX|;? zd%u=Vfuc)1sf9-K+4knO$C3r^Qs+0#sJ4vU-Gx@8)~j7BY88bs4v79$f)Q%VSlm~3 zbc)M|!k&ZO*fCqi{C=9+0>wN(llD)2i9(L@4|qU+xW<@!nSao#`)=Sq@6CU;@%4OV zZT-H`_Pr?Kh!1%HQ1+nOgfa{$r*O}Pp;^@3jz`m-d-*#)e9(aW4L>};H1uDWDcP}P zOH0K6@f1h2q{KEP2yK=_3CpkYOFcXm@U7ywNrQ@^Q|7L-^OoZBlBw+~skHExKgH~L zj)?V^hERns%Uf=0DSOKwno%u#%g6D8L3Z|Yn#Hk&UdHy6L87d9TUW!SF- zF;OeYv%=mjoOtg_rFa~!gi@3zxx!W_Q3S|l2Jw;7t$3U{!bwMP9I9CD(NFPDtMORu z^&?R%afl9ymatRj6q-Duhr}^A(x^vVpuak=a6|zRfw7r^_DLU@eSSxmTdGc_KUmd; zJ$z)>hQ%6HSXSvW99Dw=joDbDE{Z^%X-thPELC+yfNW-<^;?PebGr0X;UM?Qlyvss zC*P?Aq=^to){Da-C3rdCiZ~yMTjp>m30ZH-pomI$IGlua%PJgGMt?MiNVJ6A$}2Q;d5J*T%s`R593Q!#QREghlDZk$W1r$I OOhB4dNc!FtMfwku4O#sF literal 0 HcmV?d00001 diff --git a/EDUReViver/lib/capstone_dll_d.lib b/EDUReViver/lib/capstone_dll_d.lib new file mode 100644 index 0000000000000000000000000000000000000000..c19ba3995386aa8e0a79d77245c5660b1ed1fd22 GIT binary patch literal 5410 zcmcIo&2Ljj5dYbMCUG3cu~VRgRzX5)E73GDP9RlP8A_!hOhCb$AFlmKEG2$V?>T9E zs>HcRjz!|s6K8~a%3r{tQY+3C2mT7^?APo*$2^=kJZZc;JG1-SkD1w7pZ~TQwYI*? zeZ7$UmRGAwOO?wj%a@YvOPXCr@gI&MGRCT+r;6 zqI?Jlnth=t|B`s3>6)U#L+VFVyr^jUDYX-oRu#?c1A+>#70on=Cn`NrRHnHJDn8Qm zhDxIHo*>V=aqG_QjfQvqhr8cz+_=-Yz2UW*VcZM4K0I&zUcG)$1HTy+rO^2C-ug}N z`qjo&>eAT>J+Bpedwvvmf-Vwumd3kb7(_iO6pYvD`D%#?p0y%>)9W^O)aaIBd8Zq9t%Ad`#%2`khE~O8Sx5Gh5;<3wWgP(? z`OUV}uuMY!b41Hw13&xn@{Spt09%wfs0X7|b8qqbt^< z&j5Hf4!oKK&P@T&=YVyhvju7^16#8|m&1rUP-1qH1a=P<6@tiq~7*Kp7$C!Uyy47h#K^#2jEqt-@Kf3$yAP1vSyKWm@F=#1zL& zOI7GlgVkBFEu#Ir_|cyj3;0HJqR65_zekH*$7d~-m1WND>Y1#xmcQie#2hiuTG~=% ze;jMMWLkx_{An0n3Tyc=Rxr%TeoC`=XQG#LEoB%lt6VYJ@%^0fvVRFdo%7&*OYyQ5 zvsJaK84 z3x__tYE_&3LJ~)0LK%vaB4F#AC;{X$!`Mjm@?e~K!pSCZL_Y0~euOox4aO2yKbFLj zm*|LSDJOM8qp2%;M4ZatRh^<$ozyro0Z72O%uwfKF3diApvNs`s>&Xm?7|&BacZMt zjcY6?br}sS#r`H-ESVQ2ppMn2CN-AMx)MMxGt~aA4z>vT(}5BPbyl3xxq~16q*9Qk zERxC>M?*@n@;oC^GCCScO4OTX6q)IchLf^y1&zaL^an$laggM@eKe#LPbxY{>H&~| zI=m;PMDkgS#m|co(Na#Uq|x~Cl7MoVp*(kGu;+e4o?A9Z`eo#feT2I(1!+zrnRizb F>3_IZStS4f literal 0 HcmV?d00001 diff --git a/EDUReViver/main.cpp b/EDUReViver/main.cpp new file mode 100644 index 0000000..a745780 --- /dev/null +++ b/EDUReViver/main.cpp @@ -0,0 +1,539 @@ +#include "targetver.h" +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "addon_func.h" +#include "configstore.h" +#include "crypto.h" +#include "usbconn.h" +#include "httpclient.h" + + +uint32_t encode_fwLen(uint32_t fwlen); +uint16_t crc16_kermit(const uint8_t *buf, size_t len); +uint32_t calc_sn_checksum(uint32_t sn); +uint32_t crc32_rev(uint8_t *buf, size_t len); +// check +bool is_BTL_version(const char* fwversion); +bool is_offical_bootloader(const void* btl); + +void printdigest(const char* name, const uint8_t* digest, size_t len); +char* dump2hex(const uint8_t* buf, size_t len, char* hex); + +#pragma pack(push, 1) +struct cmd_fine_write_read +{ + uint8_t cmd; // E0 + uint32_t writelen; // sp+8 max 0x10 + uint32_t readlen; // sp+c max 0x10 + uint32_t somelen; // sp+10 + uint8_t writebuf[0x10]; // sp+14 + uint8_t remotebuf[0x18];// sp+24 (fill 4 byte) +}; +struct cmd_fine_write_read_IAR : cmd_fine_write_read { + uint32_t regLR; // sp+3C = LR + uint8_t overlay[1]; // sp+40 +}; +struct cmd_fine_write_read_SES : cmd_fine_write_read { + uint32_t R4; // sp+38 + uint32_t R5; // sp+3C + uint32_t R6; // sp+40 + uint32_t regLR; // sp+44 = LR + uint8_t overlay[1]; // sp+48 +}; +#pragma pack(pop) + +cmd_fine_write_read* assembly_cmd_payload(int* cmdlen, const void* payload, size_t payloadlen, const patcher_config* config, size_t readlen); + +cmd_fine_write_read* assembly_cmd_payload(int* cmdlen, const void* payload, size_t payloadlen, const patcher_config* config, size_t readlen) +{ + size_t newlen = config->isSES?sizeof(cmd_fine_write_read_SES) - 1:sizeof(cmd_fine_write_read_IAR) - 1; // 38+1, 44+1 + size_t payloadoffset = (uint32_t)&((cmd_fine_write_read*)0)->somelen; + if (payloadoffset + payloadlen > newlen) { + newlen = payloadoffset + payloadlen; // overlay + } + if (cmdlen) { + *cmdlen = newlen; + } + cmd_fine_write_read* cmd = (cmd_fine_write_read*)malloc(newlen); + cmd->cmd = 0xE0; + cmd->writelen = newlen - 1 - 0xC; // 2C/38 + cmd->readlen = readlen; + memcpy((char*)cmd + payloadoffset, payload, payloadlen); // ·¢Ëͺó40B0´¦ÊÇÎÒÃÇ´úÂë + if (config->isSES) { + cmd_fine_write_read_SES* ses = (cmd_fine_write_read_SES*)cmd; + ses->regLR = config->sp + 0xC | 1; + ses->R4 = config->R4; + ses->R5 = config->R5; + ses->R6 = config->R6; + } else { + cmd_fine_write_read_IAR* iar = (cmd_fine_write_read_IAR*)cmd; + iar->regLR = config->sp + 0x10 | 1; // Ö¸ÏòǶÈ뿪ͷ + } + return cmd; +} + +enum payloadmode { + pmM4Ret, // usbrx + pmM4Reset, // m0patcher + usbrx + pmM0Hold, // m0patcher + m0reset,usbrx,m0reset + pmM0Boot // m0patcher + uxbrx,m0boot +}; + + +#define CLOSE_AND_EXIT(code) freeJLinks(devvec);\ + UnloadWinusb();\ + return code; + +void printmismatch(bool mismatch) +{ + if (mismatch) { + errprintf("mismatched!\n"); + } else { + printf("OK.\n"); + } +} + +int main(int argc, char * argv[]) +{ + int mode = -1; + char* payloadname = 0; + if (argc >= 3) { + for (int i = 1; i < argc; i++) { + if (_stricmp(argv[i], "-run") == 0) { + payloadname = argv[++i]; + } + } + } + if (payloadname == 0) { + printf("V10ReViver -run {blinky|revive|swd|to11|to10}\n"); + return -1; + } + + if (LoadWinusb() != 0) { + printf("No WinUSB support because WinUSB.dll is corrupt or missing.\n");; + } + JLinkDevVec devvec; + if (!getJLinks(devvec)) { + errprintf("Failed to find device!\n"); + return 0; + } else if (devvec.size() > 1) { + errprintf("Only support one device, please unplug other probes!\n"); + CLOSE_AND_EXIT(0); + } + + uint8_t dataBuffer[512] = {0}; + bool isv9 = false, isv10 = false; + jlinkLoopReadFirmwareVersion(&devvec[0], dataBuffer); + dataBuffer[0x70] = 0; + isv9 = strstr((const char*)dataBuffer, "V9") != 0; + isv10 = (strstr((const char*)dataBuffer, "V10") != 0) || (strstr((const char*)dataBuffer, "V11") != 0); + if (is_BTL_version((char*)dataBuffer)) { + errprintf("Please quit bootloader mode\n"); + CLOSE_AND_EXIT(0); + } else { + printf("Firmware Version: %s\n", dataBuffer); + } + if (isv10 == false) { + errprintf("Only support v10,v11 devices.\n"); + CLOSE_AND_EXIT(0); + } + // check genius hardware + const patcher_config* config = find_patcher_config((char*)dataBuffer); + uint32_t sn, snchecksum; + uint8_t snuidbuf[36]; + void* otssign; + bool sncheckerror = true; + if (jlinkCommandReadOTS(&devvec[0], dataBuffer)) { + sn = *(uint32_t*)dataBuffer; + snchecksum = *(uint32_t*)(dataBuffer + 4); + otssign = dataBuffer + 0x100; + *(uint32_t*)snuidbuf = sn; + sncheckerror = calc_sn_checksum(sn) != snchecksum; + printf("sn: %d, snchecksum ", sn); + printmismatch(sncheckerror); + } + uint32_t uidlen = 32; + bool otssignok = false; + void* myapp = 0; + int applen = 0; + if (jlinkCommandReadUID(&devvec[0], &uidlen, &snuidbuf[4])) { + //printdigest("UID:", &snuidbuf[4], uidlen); + //printf("OTS Signature:\n"); + //quickdump(0x5F00, (uint8_t*)otssign, 0x100); + char snstr[32], uidstr[65], signstr[513]; + char* reply = 0; + size_t replylen = 0; + int reqret = request_payload_online(_itoa(sn, snstr, 10), dump2hex(&snuidbuf[4], uidlen, uidstr), dump2hex((uint8_t*)otssign, 0x100, signstr), payloadname, &reply, &replylen); + if (reqret == 0 && replylen) { + int otsmatched = *(int32_t*)reply; + mode = *(int32_t*)(reply + 4); + applen = replylen - 8; + if (applen) { + myapp = malloc(applen); + memcpy(myapp, reply + 8, applen); + } + otssignok = otsmatched == 1; + } else { + errprintf("Failed to retrieve payload due to a network error %d!\n", reqret); + CLOSE_AND_EXIT(0); + } + if (reply) { + free(reply); + } + if (otssignok) { + printf("UID signature OK.\n"); + } else { + errprintf("UID signature mismatched!\n"); + } + } else { + errprintf("Reading UID failed!\n"); + CLOSE_AND_EXIT(0); + } + uint32_t dumpsize = config?0x8000:0x80000; + // dump bootloader/firmware and parse + char* fwdump = (char*)malloc(dumpsize); + if (jlinkDumpFullFirmware(&devvec[0], 0x1A000000, dumpsize, fwdump)) { + bool bootloaderok = is_offical_bootloader(fwdump); + if (sn == -1 || sncheckerror || bootloaderok == false || otssignok == false) { + errprintf("Detected clone.\n"); +#ifdef DENYCLONE + free(fwdump); + if (myapp) { + free(myapp); + } + CLOSE_AND_EXIT(0); +#endif + } + } else { + free(fwdump); + errprintf("Dumping failed. Can't check device's genius.\n"); + if (myapp) { + free(myapp); + } + CLOSE_AND_EXIT(0); + } + if (myapp == 0) { + errprintf("Payload \"%s\" was not found on server!\n", payloadname); + free(fwdump); + CLOSE_AND_EXIT(0); + } + + if (config == 0) { + printf("Your version number is not present in config cache! Analyst it now...\n"); + config = analyst_firmware_stack(fwdump + 0x8000, 0x78000); + } + free(fwdump); + if (config == NULL) { + free(myapp); + CLOSE_AND_EXIT(0); + } + + uint32_t oldif; + if (jlinkCommandSendSelectInterface(&devvec[0], 3, &oldif)) { + printf("Change interface: %d -> 3\n", oldif); + } else { + errprintf("Select interface failed!\n"); + free(myapp); + CLOSE_AND_EXIT(0); + } + // Ç°Öò½Öè: ×¼±¸³¬³¤payloadµÄÖ´Ðл·¾³ + bool M0patched = false; + int cmdlen; + uint32_t readed; // FINE²ÉÑù×Ö½ÚÊý, m0appÉèÖà + // remotebuf Ç°4×Ö½ÚÔÚÉ豸»á±»Ìî³äreaded, Òò´Ë²»ÄÜ·Å´úÂë, 4+writebufºÍremotebuf-4¸÷¿ÉÒÔ·Å0x14´óС´úÂë + // ´Ë´¦´úÂëҪעÒâÖ´ÐÐʱºòspÊÇ100840E0(ÊÇLRĩβ), ÈçÓÐpush»áÊ×ÏÈÆÆ»µLRλÖÃ,ÔÙ¼ÌÐøÍùÇ°ÆÆ»µ¿ÉÄÜÆÆ»µ×ÔÉí + // SESµÄ´úÂë¾Ö²¿±äÁ¿readed»á¶îÍâÌî³ä+28¿Õ϶, µ¼Öµڶþ¶ÎÒª²ð·Ö³öÀ´Ò»¸öliteral·ÅÈëR4-R6ÇøÓò + if (mode == pmM4Ret && (config->isSES == false || (config->cmdReg >= 4 && config->cmdReg <= 6))) { + // µ¥´ÎÒç³ö + cmd_fine_write_read* m4rxcmd; + if (config->isSES) { + // ÐèÒª¶îÍâµÄÖض¨Î» + unsigned char m4rxret[0x30] = { + 0x8C, 0xB0, 0x0A, 0x48, 0x4F, 0xF4, 0x00, 0x61, 0x05, 0x4A, 0x90, 0x47, 0x07, 0x48, 0x01, 0x30, + 0x80, 0x47, 0x01, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, 0xB0, 0xDF, 0xF8, 0x08, 0xF0, 0x00, 0x00, + 0xDB, 0x0E, 0x01, 0x1A, 0x19, 0x07, 0x01, 0x1A, 0xFF, 0xFF, 0xFF, 0xFF, 0x50, 0x00, 0x00, 0x20 + }; + *(uint32_t*)&m4rxret[0x20] = config->usbrx | 1; + *(uint32_t*)&m4rxret[0x24] = config->lr | 1; // Òª·µ»Ødispatchcmd + m4rxret[0x2] += config->cmdReg - 4; + m4rxret[0xC] += config->cmdReg - 4; + m4rxcmd = assembly_cmd_payload(&cmdlen, m4rxret, sizeof(m4rxret), config, 0); + *(&((cmd_fine_write_read_SES*)m4rxcmd)->R4 + config->cmdReg - 4) = *(uint32_t*)&m4rxret[0x2C]; // literal + } else { + unsigned char m4rxret[0x2C] = { + 0x8C, 0xB0, 0x07, 0x48, 0x4F, 0xF4, 0x00, 0x61, 0x06, 0x4A, 0x90, 0x47, 0x04, 0x48, 0x01, 0x30, + 0x80, 0x47, 0x01, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, 0xB0, 0xDF, 0xF8, 0x0C, 0xF0, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x20, 0xDB, 0x0E, 0x01, 0x1A, 0x19, 0x07, 0x01, 0x1A + }; + *(uint32_t*)&m4rxret[0x24] = config->usbrx | 1; + *(uint32_t*)&m4rxret[0x28] = config->lr | 1; // Òª·µ»Ødispatchcmd + m4rxcmd = assembly_cmd_payload(&cmdlen, m4rxret, sizeof(m4rxret), config, 0); + } + jlinkSendCommand(&devvec[0], m4rxcmd, cmdlen, &readed, sizeof(readed)); + free(m4rxcmd); + } else { + // Ë«´ÎÒç³ö + // PatcherÖ´ÐÐʱºòÐÞ²¹M0´úÂë, ´Ë¿ÌM0ÕýÔÚ10000068Ö®¼ä²»¶ÏµÄÑ­»·, Òò´ËÎÒÃDz¹Ñ­»·Ö®ÍâµÄ¶«Î÷²»ÐèÒªÖØÆôM0 + // ÒòΪPatcher<=28, ËùÒÔ¼æÈÝIARºÍSES¹Ì¼þ + unsigned char patcher[0x2C] = { + 0x06, 0x49, 0x44, 0xF2, 0x6D, 0x00, 0x08, 0x80, 0x04, 0x49, 0xE2, 0x31, 0x43, 0xF6, 0x03, 0x00, + 0x08, 0x80, 0x01, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xF8, 0x04, 0xF0, 0x72, 0x00, 0x00, 0x10, + 0x19, 0x07, 0x01, 0x1A + }; + *(uint32_t*)&patcher[0x20] = config->lr + 1; // µÚÒ»´ÎÒª·µ»Ødispatchcmd + cmd_fine_write_read* patchercmd = assembly_cmd_payload(&cmdlen, patcher, sizeof(patcher), config, 0); + jlinkSendCommand(&devvec[0], patchercmd, cmdlen, &readed, sizeof(readed)); + free(patchercmd); + M0patched = true; + // ´Ëʱ´úÂë¿ÉÒÔʹÓÃÁ¬ÐøµÄ0x2C/0x28ÄÚÈÝ, ÆäËû×¢ÒâÊÂÏîͬÉÏ + if (mode == pmM0Hold || mode == pmM0Boot) { + // ½ÓÊÕÆ÷ģʽ + cmd_fine_write_read* ldrcmd; + if (mode == pmM0Hold) { + // usbresetrxm0: usbrx + unsigned char m0ldr[0x2C] = { + 0x8C, 0xB0, 0x07, 0x49, 0x5F, 0xF0, 0x80, 0x70, 0x08, 0x60, 0x81, 0x0B, 0x00, 0x01, 0x05, 0x4A, + 0x90, 0x47, 0x03, 0x49, 0x00, 0x20, 0x08, 0x60, 0x0C, 0xB0, 0xDF, 0xF8, 0x0C, 0xF0, 0x00, 0x00, + 0x04, 0x31, 0x05, 0x40, 0xDB, 0x0E, 0x01, 0x1A, 0x19, 0x07, 0x01, 0x1A + }; + *(uint32_t*)&m0ldr[0x24] = config->usbrx | 1; + *(uint32_t*)&m0ldr[0x28] = config->lr | 1; + ldrcmd = assembly_cmd_payload(&cmdlen, m0ldr, sizeof(m0ldr), config, -0x18); + } else { + // usbrxbootm0: usbrx bootm0 dispatchlr + unsigned char m0ldr[0x2C] = { + 0x8C, 0xB0, 0x05, 0x48, 0x05, 0x49, 0x06, 0x4A, 0x90, 0x47, 0x03, 0x48, 0x03, 0x49, 0x05, 0x4A, + 0x90, 0x47, 0x0C, 0xB0, 0xDF, 0xF8, 0x10, 0xF0, 0x48, 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x00, + 0xDB, 0x0E, 0x01, 0x1A, 0x9D, 0x8C, 0x01, 0x1A, 0x19, 0x07, 0x01, 0x1A + }; + *(uint32_t*)&m0ldr[0x20] = config->usbrx | 1; + //*(uint32_t*)&m0ldr[0x24] = configex->bootm0 | 1; + *(uint32_t*)&m0ldr[0x28] = config->lr | 1; + ldrcmd = assembly_cmd_payload(&cmdlen, m0ldr, sizeof(m0ldr), config, -0x18); + } + jlinkSendCommand(&devvec[0], ldrcmd, cmdlen, NULL, 0); + free(ldrcmd); + } + // SES¹Ì¼þ R4~R6ÎÞ¿ÉÓÿռäÇé¿öµÄµÚ¶þ´ÎÒç³ö, ΪÁ˼æÈÝδÀ´¹Ì¼þ + if (mode == pmM4Ret) { + unsigned char m4rxret[0x24] = { + 0x8C, 0xB0, 0x05, 0x48, 0x4F, 0xF4, 0x00, 0x61, 0x04, 0x4A, 0x90, 0x47, 0x02, 0x48, 0x01, 0x30, + 0x80, 0x47, 0x0C, 0xB0, 0xDF, 0xF8, 0x08, 0xF0, 0x48, 0x00, 0x00, 0x20, 0xDB, 0x0E, 0x01, 0x1A, + 0x19, 0x07, 0x01, 0x1A + }; + *(uint32_t*)&m4rxret[0x1C] = config->usbrx | 1; + *(uint32_t*)&m4rxret[0x20] = config->lr | 1; // Òª·µ»Ødispatchcmd + cmd_fine_write_read* m4rxcmd = assembly_cmd_payload(&cmdlen, m4rxret, sizeof(m4rxret), config, 0); + jlinkSendCommand(&devvec[0], m4rxcmd, cmdlen, &readed, sizeof(readed)); + free(m4rxcmd); + } + } + // ·¢ËͲ½Öè: ·¢Ëͳ¬³¤payload + // M4°æÔËÐпռä¿ÉÒÔÊDz»·µ»ØµÄ³¬Ð´Õ», ¿ÉÒÔÊÇд20000048»òÕßsubµ½Ï̱߳¾µØÕ», M0°æÊÇÊÕµ½sram0´øvector + // M0AppËüÄܲ»ÄÜcall flashÀïÃæµÄM4º¯Êý? ²»Ç£³¶µ½VFPÖ®ÀàµÄÖ¸Áî, Ó¦¸ÃÊÇ¿ÉÒÔµÄ. + if (mode == pmM4Reset) { + // ³¬Ð´Ä£Ê½, ²»Ðè½ÓÊÕÆ÷²¿·Ö, ×îºóÐèÖØÆô + // ÌØÊâpayload: ²»´ø·µ»ØÖ¸Õë, µ¥2C/28 gap + cmd_fine_write_read* m4loopcmd = assembly_cmd_payload(&cmdlen, myapp, applen, config, -0x18); + jlinkSendCommand(&devvec[0], m4loopcmd, cmdlen, NULL, 0); + free(m4loopcmd); + } else { + // Ìî³äµ½800·¢³ö(ÒòΪ½ÓÊÕÆ÷Òª½ÓÂú800,¿ÉÒÔ¸Äloader±äΪ400/200) + int applenfull = 0x800; + myapp = realloc(myapp, 0x800); + memset((char*)myapp + applen, 0, applenfull - applen); + jlinkSendCommand(&devvec[0], myapp, applenfull, NULL, 0); + } + free(myapp); + // ÇåÀí²½Öè, Èç¹û´ò¹ýM0²¹¶¡, Ôò»Ö¸´²¹¶¡, ÖØÆô°æ³ýÍâ, µÈËûÖØÆô + if (M0patched && mode != pmM4Reset) { + uint32_t oldif2; + if (jlinkCommandSendSelectInterface(&devvec[0], oldif, &oldif2)) { + printf("Change interface: %d -> %d\n", oldif2, oldif); + } else { + errprintf("Select interface failed!\n"); + CLOSE_AND_EXIT(0); + } + } + if (mode == pmM4Reset) { + freeJLinks(devvec); + + printf("Waiting device re-connect...\n"); + + SleepEx(5000, TRUE); + if (!getJLinks(devvec)) { + errprintf("Failed to find device!\n"); + return 0; + } else if (devvec.size() > 1) { + errprintf("Only support single device, please unplug other probes!\n"); + CLOSE_AND_EXIT(0); + } + jlinkLoopReadFirmwareVersion(&devvec[0], dataBuffer); + if (is_BTL_version((char*)dataBuffer)) { + printf("Found BTL Mode.\n"); + } else { + printf("Found Normal Mode.\n"); + } + quickdump(0, dataBuffer, 0x70); + } + freeJLinks(devvec); + UnloadWinusb(); +#ifdef _DEBUG + _getch(); +#endif + return 0; +} + +uint16_t crc16_kermit(const uint8_t *buf, size_t len) +{ + uint16_t crc = 0; + while (len--) { + crc ^= *buf++; + for (int i = 0; i < 8; i++) { + if (crc & 1) { + crc = (crc >> 1) ^ 0x8408; + } else { + crc = (crc >> 1); + } + } + } + return crc; +} + +uint32_t encode_fwLen(uint32_t fwlen) +{ + if (fwlen < 0x8000) { + return fwlen; + } else { + // 14bit + 14bit + return (fwlen & 0x3FFF) | 0xC000 | ((fwlen << 2) & 0x3FFF0000); + } +} + +bool is_BTL_version(const char* fwversion) +{ + //"J-Link V11 compiled Jun 3 2015 BTL " + size_t pos = strlen(fwversion); + if (pos--) { + while (fwversion[pos] == ' ') { + pos--; + if (pos == 0) { + return false; + } + } + // pos not 0 and point to L + return strncmp(&fwversion[pos - 2], "BTL", 3) == 0; + } + return false; +} + +bool sha256(char* buff, size_t buflen, void* digest) +{ + bool ok = false; + HCRYPTPROV provider; + HCRYPTHASH hash; + if (CryptAcquireContext(&provider, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) { + if (CryptCreateHash(provider, CALG_SHA_256, 0, 0, &hash)) { + if (CryptHashData(hash, (BYTE*)buff, buflen, 0)) { + DWORD digestlen = 32; + if (CryptGetHashParam(hash, HP_HASHVAL, (BYTE*)digest, &digestlen, 0)) { + ok = true; + } + } + } + } + CryptDestroyHash(hash); + CryptReleaseContext(provider, 0); + return ok; +} + +bool is_offical_bootloader(const void* btl) +{ + bool matched = false; + char* buff = (char*)malloc(0x54F8); + memcpy(buff, btl, 0x54F8); + *(uint32_t*)&buff[0x2FC] = 0x12345678; // CRP1 + memset(&buff[0x130], 0xFF, 0x70); // Banner + buff[0x2F89] = '0'; // V10/V11 + unsigned char digest[32]; + if (sha256(buff, 0x54F8, digest)) { + unsigned char myhash[32] = { + 0x67, 0x90, 0xD1, 0xB9, 0x03, 0x2F, 0x1A, 0x89, 0x0D, 0xE0, 0xB4, 0x56, 0x56, 0x33, 0xE9, 0x79, + 0xC7, 0x82, 0x71, 0x13, 0xB3, 0x28, 0x28, 0x6A, 0xD4, 0xE9, 0xC1, 0x70, 0xE5, 0x3E, 0xB7, 0x47 + }; + matched = memcmp(digest, myhash, sizeof(myhash)) == 0; + } + free(buff); + return matched; +} + +uint32_t calc_sn_checksum(uint32_t sn) +{ + uint8_t iv[16] = {0,}; + uint8_t key[32]; + uint8_t src[256]; + for (int i = 0; i < sizeof(src); i++) { + src[i] = sn + i; + } + for (int i = 0; i < sizeof(key); i++) { + key[i] = sn >> i; + } + + AES_CTX ctx; + AES_set_key(&ctx, key, iv, AES_MODE_256); + AES_cbc_encrypt(&ctx, (uint8_t*)src, (uint8_t*)src, sizeof(src)); + + //quickdump(0, src, 256); + uint32_t chksum = crc32_rev(src, sizeof(src)); + //printf("%08X\n", chksum); + return chksum; +} + +uint32_t crc32_rev(uint8_t *buf, size_t len) +{ + uint32_t crc = 0; + while (len--) { + crc ^= *buf++; + for (int i = 0; i < 8; i++) { + if (crc & 1) { + crc = 0xEDB88320 ^ (crc >> 1); + } else { + crc >>= 1; + } + } + } + return crc; +} + +void printdigest(const char* name, const uint8_t* digest, size_t len) +{ + printf("%s ", name); + char* line = (char*)_alloca(len * 3); + for (size_t i = 0, pos = 0; i < len; i++) { + uint8_t c = digest[i]; + line[pos++] = QuadBit2Hex(c >> 4); + line[pos++] = QuadBit2Hex(c & 0xF); + line[pos++] = ' '; + } + fwrite(line, 1, len * 3 - 1, stdout); + printf("\n"); +} + +char* dump2hex(const uint8_t* buf, size_t len, char* hex) +{ + for (size_t i = 0, pos = 0; i < len; i++) { + uint8_t c = buf[i]; + hex[pos++] = QuadBit2Hex(c >> 4); + hex[pos++] = QuadBit2Hex(c & 0xF); + } + hex[len*2] = 0; + return hex; +} diff --git a/EDUReViver/targetver.h b/EDUReViver/targetver.h new file mode 100644 index 0000000..f583181 --- /dev/null +++ b/EDUReViver/targetver.h @@ -0,0 +1,24 @@ +#pragma once + +// The following macros define the minimum required platform. The minimum required platform +// is the earliest version of Windows, Internet Explorer etc. that has the necessary features to run +// your application. The macros work by enabling all features available on platform versions up to and +// including the version specified. + +// Modify the following defines if you have to target a platform prior to the ones specified below. +// Refer to MSDN for the latest info on corresponding values for different platforms. +#ifndef WINVER // Specifies that the minimum required platform is Windows Vista. +#define WINVER 0x0600 // Change this to the appropriate value to target other versions of Windows. +#endif + +#ifndef _WIN32_WINNT // Specifies that the minimum required platform is Windows Vista. +#define _WIN32_WINNT 0x0600 // Change this to the appropriate value to target other versions of Windows. +#endif + +#ifndef _WIN32_WINDOWS // Specifies that the minimum required platform is Windows 98. +#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later. +#endif + +#ifndef _WIN32_IE // Specifies that the minimum required platform is Internet Explorer 7.0. +#define _WIN32_IE 0x0700 // Change this to the appropriate value to target other versions of IE. +#endif diff --git a/EDUReViver/usbconn.cpp b/EDUReViver/usbconn.cpp new file mode 100644 index 0000000..88ebb6d --- /dev/null +++ b/EDUReViver/usbconn.cpp @@ -0,0 +1,469 @@ +#include "targetver.h" +#define WIN32_LEAN_AND_MEAN +#include +#include +//#include +#include +#include "usbconn.h" +#include "addon_func.h" + + +BOOL (__stdcall *WinUsb_Initialize)(HANDLE DeviceHandle, PWINUSB_INTERFACE_HANDLE InterfaceHandle); +BOOL (__stdcall *WinUsb_GetDescriptor)(WINUSB_INTERFACE_HANDLE InterfaceHandle, UCHAR DescriptorType, UCHAR Index, USHORT LanguageID, PUCHAR Buffer, ULONG BufferLength, PULONG LengthTransferred); +BOOL (__stdcall *WinUsb_Free)(WINUSB_INTERFACE_HANDLE InterfaceHandle); +BOOL (__stdcall *WinUsb_SetPipePolicy)(WINUSB_INTERFACE_HANDLE InterfaceHandle, UCHAR PipeID, ULONG PolicyType, ULONG ValueLength, PVOID Value); +BOOL (__stdcall *WinUsb_ReadPipe)(WINUSB_INTERFACE_HANDLE InterfaceHandle, UCHAR PipeID, PUCHAR Buffer, ULONG BufferLength, PULONG LengthTransferred, LPOVERLAPPED Overlapped); +BOOL (__stdcall *WinUsb_WritePipe)(WINUSB_INTERFACE_HANDLE InterfaceHandle, UCHAR PipeID, PUCHAR Buffer, ULONG BufferLength, PULONG LengthTransferred, LPOVERLAPPED Overlapped); +BOOL (__stdcall *WinUsb_GetPipePolicy)(WINUSB_INTERFACE_HANDLE InterfaceHandle, UCHAR PipeID, ULONG PolicyType, PULONG ValueLength, PVOID Value); +BOOL (__stdcall *WinUsb_ControlTransfer)(WINUSB_INTERFACE_HANDLE InterfaceHandle, WINUSB_SETUP_PACKET SetupPacket, PUCHAR Buffer, ULONG BufferLength, PULONG LengthTransferred, LPOVERLAPPED Overlapped); +BOOL (__stdcall *WinUsb_AbortPipe)(WINUSB_INTERFACE_HANDLE InterfaceHandle, UCHAR PipeID); +BOOL (__stdcall *WinUsb_FlushPipe)(WINUSB_INTERFACE_HANDLE InterfaceHandle, UCHAR PipeID); +BOOL (__stdcall *WinUsb_ResetPipe)(WINUSB_INTERFACE_HANDLE InterfaceHandle, UCHAR PipeID); + +bool g_winusb_initalized = false; +HMODULE WINUSB_DLL; + +int LoadWinusb() +{ + if ( g_winusb_initalized ) { + return 0; + } + WINUSB_DLL = LoadLibraryA("WINUSB.DLL"); + if ( !WINUSB_DLL ) { + g_winusb_initalized = 1; + return 0; + } + *(FARPROC*)&WinUsb_Initialize = GetProcAddress(WINUSB_DLL, "WinUsb_Initialize"); + *(FARPROC*)&WinUsb_GetDescriptor = GetProcAddress(WINUSB_DLL, "WinUsb_GetDescriptor"); + *(FARPROC*)&WinUsb_Free = GetProcAddress(WINUSB_DLL, "WinUsb_Free"); + *(FARPROC*)&WinUsb_SetPipePolicy = GetProcAddress(WINUSB_DLL, "WinUsb_SetPipePolicy"); + *(FARPROC*)&WinUsb_ReadPipe = GetProcAddress(WINUSB_DLL, "WinUsb_ReadPipe"); + *(FARPROC*)&WinUsb_WritePipe = GetProcAddress(WINUSB_DLL, "WinUsb_WritePipe"); + *(FARPROC*)&WinUsb_GetPipePolicy = GetProcAddress(WINUSB_DLL, "WinUsb_GetPipePolicy"); + *(FARPROC*)&WinUsb_ControlTransfer = GetProcAddress(WINUSB_DLL, "WinUsb_ControlTransfer"); + *(FARPROC*)&WinUsb_AbortPipe = GetProcAddress(WINUSB_DLL, "WinUsb_AbortPipe"); + *(FARPROC*)&WinUsb_FlushPipe = GetProcAddress(WINUSB_DLL, "WinUsb_FlushPipe"); + *(FARPROC*)&WinUsb_ResetPipe = GetProcAddress(WINUSB_DLL, "WinUsb_ResetPipe"); + if ( WinUsb_Initialize + && WinUsb_GetDescriptor + && WinUsb_Free + && WinUsb_SetPipePolicy + && WinUsb_ReadPipe + && WinUsb_WritePipe + && WinUsb_GetPipePolicy + && WinUsb_ControlTransfer + && WinUsb_AbortPipe + && WinUsb_FlushPipe + && WinUsb_ResetPipe ) + { + g_winusb_initalized = 1; + return 0; + } else { + if ( WINUSB_DLL ) { + FreeLibrary(WINUSB_DLL); + WINUSB_DLL = 0; + } + return -1; + } + return 0; +} + +int UnloadWinusb() +{ + if ( WINUSB_DLL ) { + FreeLibrary(WINUSB_DLL); + WINUSB_DLL = 0; + } + g_winusb_initalized = 0; + return 0; +} + +bool getWinUSBLinks(JLinkDevVec& vec, const GUID* guid) +{ + HDEVINFO devInfoSet = SetupDiGetClassDevsW(guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); + SP_DEVICE_INTERFACE_DATA interfaceData = {0}; + interfaceData.cbSize = sizeof(interfaceData); + + for (DWORD i = 0; ; i++) { + if (!SetupDiEnumDeviceInterfaces(devInfoSet, NULL, guid, i, &interfaceData)) { + return false; + } + + DWORD requiredSize = 0; + SetupDiGetDeviceInterfaceDetailW(devInfoSet, &interfaceData, NULL, 0, &requiredSize, NULL); + void* tempBuffer = new uint8_t[requiredSize]; + PSP_DEVICE_INTERFACE_DETAIL_DATA interfaceDetailData = static_cast(tempBuffer); + interfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); + if (!SetupDiGetDeviceInterfaceDetailW(devInfoSet, &interfaceData, interfaceDetailData, requiredSize, &requiredSize, NULL)) { + continue; + } + HANDLE deviceFile = CreateFileW(interfaceDetailData->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); + if (deviceFile == INVALID_HANDLE_VALUE) { + continue; + } + + WINUSB_INTERFACE_HANDLE winusbHandle; + if (!WinUsb_Initialize(deviceFile, &winusbHandle)) { + printf("Failed to invoke WinUsb_Initialize, last error %d\n", GetLastError()); + CloseHandle(deviceFile); + continue; + //return false; + } + uint8_t desc[0x200]; + ULONG desclen = 0x200; + if (!WinUsb_GetDescriptor(winusbHandle, USB_CONFIGURATION_DESCRIPTOR_TYPE, 0, 0, desc, desclen, &desclen)) { + printf("Failed to invoke WinUsb_GetDescriptor, last error %d\n", GetLastError()); + CloseHandle(deviceFile); + return false; + } + uint8_t inep = 0, outep = 0; + PUSB_CONFIGURATION_DESCRIPTOR confdesc = (PUSB_CONFIGURATION_DESCRIPTOR)desc; + PUSB_INTERFACE_DESCRIPTOR ifdesc = (PUSB_INTERFACE_DESCRIPTOR)&desc[confdesc->bLength]; + for (int i = 0; i < confdesc->bNumInterfaces; i++, ifdesc++) { + PUSB_ENDPOINT_DESCRIPTOR epdesc = (PUSB_ENDPOINT_DESCRIPTOR)((char*)ifdesc + ifdesc->bLength); + for (int j = 0; j < ifdesc->bNumEndpoints; j++, epdesc++) { + if ((epdesc->bmAttributes & 3) == 2) { + if (epdesc->bEndpointAddress & 0x80) { + inep = epdesc->bEndpointAddress; // 0x81 + } else { + outep = epdesc->bEndpointAddress; // 0x01 + } + } + } + if (inep && outep) { + break; + } + } + CHAR rawio = TRUE; + WinUsb_SetPipePolicy(winusbHandle, outep, RAW_IO, sizeof(rawio), &rawio); + WinUsb_SetPipePolicy(winusbHandle, inep, RAW_IO, sizeof(rawio), &rawio); + //ULONG transize; + //ULONG transizelen = sizeof(transize); + //WinUsb_GetPipePolicy(winusbHandle, outep, MAXIMUM_TRANSFER_SIZE, &transizelen, &transize); + //transizelen = sizeof(transize); + //WinUsb_GetPipePolicy(winusbHandle, inep, MAXIMUM_TRANSFER_SIZE, &transizelen, &transize); + WINUSB_SETUP_PACKET setup = {0x41, 0x01, 0x0040, 0x0000, 0x0000}; + ULONG transfered = 0; + if (!WinUsb_ControlTransfer(winusbHandle, setup, NULL, 0, &transfered, NULL)) { + printf("Fail to invoke WinUsb_ControlTransfer, last error %d\n", GetLastError()); + } + DWORD timeout = 1000; + WinUsb_SetPipePolicy(winusbHandle, outep, PIPE_TRANSFER_TIMEOUT, sizeof(timeout), &timeout); + WinUsb_SetPipePolicy(winusbHandle, inep, PIPE_TRANSFER_TIMEOUT, sizeof(timeout), &timeout); + + JlinkDevice dev; + dev.isWinusb = true; + dev.deviceFile = deviceFile; + dev.interfaceHandle = winusbHandle; + dev.readPipe = inep; // 0x81 + dev.writePipe = outep; // 0x01 + //"PCI\\VEN_%x&DEV_%x&SUBSYS_%x&REV_%x" + //0x00e5d95c "\\?\usb#vid_1366&pid_0101#000260113630#{54654e76-dcf7-4a7f-878a-4e8fca0acc9a}" + const wchar_t* vidstr = wcschr((const wchar_t*)interfaceDetailData->DevicePath, L'#'); + if (vidstr) { + vidstr++; + uint32_t lvid, lpid; + if (swscanf_s(vidstr, L"vid_%04x&pid_%04x", &lvid, &lpid) == 2) { + dev.pid = lpid; + dev.vid = lvid; + } + } + vec.push_back(dev); + } + return true; +} + +bool getSeggerJlinks(JLinkDevVec& vec) +{ + GUID classGuid = {0x54654E76, 0xdcf7, 0x4a7f, 0x87, 0x8A, 0x4E, 0x8F, 0xCA, 0x0A, 0xCC, 0x9A}; + HDEVINFO devInfoSet = SetupDiGetClassDevsW(&classGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); + SP_DEVICE_INTERFACE_DATA interfaceData = {0}; + interfaceData.cbSize = sizeof(interfaceData); + + for (DWORD i = 0; ; i++) { + if (!SetupDiEnumDeviceInterfaces(devInfoSet, NULL, &classGuid, i, &interfaceData)) { + return false; + } + + DWORD requiredSize = 0; + SetupDiGetDeviceInterfaceDetailW(devInfoSet, &interfaceData, NULL, 0, &requiredSize, NULL); + void* tempBuffer = new uint8_t[requiredSize]; + PSP_DEVICE_INTERFACE_DETAIL_DATA interfaceDetailData = static_cast(tempBuffer); + interfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); + if (!SetupDiGetDeviceInterfaceDetailW(devInfoSet, &interfaceData, interfaceDetailData, requiredSize, &requiredSize, NULL)) { + continue; + } + HANDLE deviceFile = CreateFileW(interfaceDetailData->DevicePath, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (deviceFile == INVALID_HANDLE_VALUE) { + continue; + } + wchar_t pipeFileName[1024] = {0}; + wcscpy_s(pipeFileName, interfaceDetailData->DevicePath); + wcscat_s(pipeFileName, L"\\pipe00"); + HANDLE readPipeFile = CreateFileW(pipeFileName, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (readPipeFile == INVALID_HANDLE_VALUE) { + CloseHandle(deviceFile); + continue; + } + + wcscpy_s(pipeFileName, interfaceDetailData->DevicePath); + wcscat_s(pipeFileName, L"\\pipe01"); + HANDLE writePipeFile = CreateFileW(pipeFileName, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (writePipeFile == INVALID_HANDLE_VALUE) { + CloseHandle(deviceFile); + CloseHandle(readPipeFile); + continue; + } + + JlinkDevice dev; + dev.isWinusb = false; + dev.deviceFile = deviceFile; + dev.readPipeFile = readPipeFile; + dev.writePipeFile = writePipeFile; + // TODO: get usb port path + //"PCI\\VEN_%x&DEV_%x&SUBSYS_%x&REV_%x" + //0x00e5d95c "\\?\usb#vid_1366&pid_0101#000260113630#{54654e76-dcf7-4a7f-878a-4e8fca0acc9a}" + const wchar_t* vidstr = wcschr((const wchar_t*)interfaceDetailData->DevicePath, L'#'); + if (vidstr) { + vidstr++; + uint32_t lvid, lpid; + if (swscanf_s(vidstr, L"vid_%04x&pid_%04x", &lvid, &lpid) == 2) { + dev.pid = lpid; + dev.vid = lvid; + } + } + vec.push_back(dev); + } + return true; +} + +bool getJLinks(JLinkDevVec& vec) +{ + GUID classGuid1 = {0xC78607E8, 0xDE76, 0x458B, 0xB7, 0xC1, 0x5C, 0x14, 0xA6, 0xF3, 0xA1, 0xD2}; + getSeggerJlinks(vec); + size_t oldcnt = vec.size(); + getWinUSBLinks(vec, &classGuid1); + //if (vec.size() == oldcnt) { + // GUID classGuid2 = {0xA5DCBF10, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED}; + // getWinUSBLinks(vec, &classGuid2); + //} + return vec.size() > 0; +} + +size_t g_recvpos = 0; + +void freeJLinks(JLinkDevVec& vec) +{ + for (JLinkDevVec::const_iterator it = vec.begin(); it != vec.end(); it++) { + if (it->isWinusb) { + WinUsb_Free(it->interfaceHandle); + } else { + CloseHandle(it->readPipeFile); + CloseHandle(it->writePipeFile); + } + CloseHandle(it->deviceFile); + } + g_recvpos = 0; +} + +unsigned char g_recvbuf[0x1000]; + +bool jlinkSendCommand(JlinkDevice* dev, void const* commandBuffer, uint32_t commandLength, void* resultBuffer, uint32_t resultHeaderLength) +{ + // Winusb read pipe before write in other thread + if (dev->isWinusb && resultHeaderLength) { + // ÐèҪдÈë²Å»ØÓ¦, °´Àí˵±ØÐëÒªÐÂÏÊÊý¾Ý, Èç¹û»º³åÒÑÓÐÊý¾Ý, ÄǾͲ»ÐÐ + ULONG writed = commandLength; + if (!WinUsb_WritePipe(dev->interfaceHandle, dev->writePipe, (PUCHAR)commandBuffer, commandLength, &writed, NULL)) { + return false; + } + if (g_recvpos) { + errprintf("dirty buffer!\n"); + return false; + } else { + ULONG readed = resultHeaderLength; + while(g_recvpos < resultHeaderLength) { + if (WinUsb_ReadPipe(dev->interfaceHandle, dev->readPipe, (PUCHAR)&g_recvbuf[g_recvpos], 0x400, &readed, NULL)) { + g_recvpos += readed; + } + } + memcpy(resultBuffer, g_recvbuf, resultHeaderLength); + memmove(g_recvbuf, g_recvbuf + resultHeaderLength, g_recvpos - resultHeaderLength); + g_recvpos -= resultHeaderLength; + return true; + } + } else { + // ֻдwinusb; »òÕß²»ÊÇwinusbµÄ + DWORD dummy = commandLength; + if (!dev->isWinusb && !WriteFile(dev->writePipeFile, commandBuffer, commandLength, &dummy, NULL)) + return false; + if (dev->isWinusb && !WinUsb_WritePipe(dev->interfaceHandle, dev->writePipe, (PUCHAR)commandBuffer, commandLength, &dummy, NULL)) + return false; + + if (!resultHeaderLength) + return true; + dummy = resultHeaderLength; + return !!ReadFile(dev->readPipeFile, resultBuffer, resultHeaderLength, &dummy, NULL); + } +} + +bool jlinkContinueReadResult(JlinkDevice* dev, void* resultBuffer, uint32_t resultLength) +{ + if (dev->isWinusb) { + ULONG readed = resultLength; + while(g_recvpos < resultLength) { + if (WinUsb_ReadPipe(dev->interfaceHandle, dev->readPipe, (PUCHAR)&g_recvbuf[g_recvpos], 0x400, &readed, NULL)) { + g_recvpos += readed; + } + } + memcpy(resultBuffer, g_recvbuf, resultLength); + memmove(g_recvbuf, g_recvbuf + resultLength, g_recvpos - resultLength); + g_recvpos -= resultLength; + return true; + } else { + DWORD readed = resultLength; + return !!ReadFile(dev->readPipeFile, resultBuffer, resultLength, &readed, NULL); + } +} + +bool jlinkCommandReadFirmwareVersion(JlinkDevice* dev, void* dataBuffer) +{ + uint8_t commandBuffer[1] = {0x01}; + uint16_t leftLength = 0; + if (!jlinkSendCommand(dev, commandBuffer, sizeof(commandBuffer), &leftLength, sizeof(leftLength))) + return false; + + return jlinkContinueReadResult(dev, dataBuffer, leftLength); +} + +bool jlinkLoopReadFirmwareVersion(JlinkDevice* dev, void* dataBuffer) +{ + for (int i = 0; i < 4; i++) { + if (jlinkCommandReadFirmwareVersion(dev, dataBuffer)) { + return true; + } + } + return false; +} + +bool jlinkCommandReadEmulatorMemory(JlinkDevice* dev, uint32_t address, uint32_t length, void* dataBuffer) +{ + uint8_t commandBuffer[9] = + { + 0xfe, + uint8_t(address), uint8_t(address >> 8), uint8_t(address >> 16), uint8_t(address >> 24), + uint8_t(length), uint8_t(length >> 8), uint8_t(length >> 16), uint8_t(length >> 24), + }; + + return jlinkSendCommand(dev, commandBuffer, sizeof(commandBuffer), dataBuffer, length); +} + +bool jlinkCommandSetEmulateOption(JlinkDevice* dev, uint32_t option, uint32_t val, uint32_t* status) +{ + uint8_t commandBuffer[17] = + { + 0x0E, + uint8_t(option), uint8_t(option >> 8), uint8_t(option >> 16), uint8_t(option >> 24), + uint8_t(val), uint8_t(val >> 8), uint8_t(val >> 16), uint8_t(val >> 24), + 0, + }; + + return jlinkSendCommand(dev, commandBuffer, sizeof(commandBuffer), status, sizeof(*status)); +} + +bool jlinkCommandSendUpdateFirmware(JlinkDevice* dev, uint8_t* reply) +{ + uint8_t command = 0x06; + + return jlinkSendCommand(dev, &command, sizeof(command), reply, sizeof(*reply)); +} + +bool jlinkCommandSendSelectInterface(JlinkDevice* dev, uint8_t newif, uint32_t* oldif) +{ + uint8_t commandBuffer[2] = + { + 0xc7, + newif + }; + return jlinkSendCommand(dev, commandBuffer, sizeof(commandBuffer), oldif, sizeof(*oldif)); +} + +bool jlinkDumpFullFirmware(JlinkDevice* dev, uint32_t addr, uint32_t size, void* buf) +{ + // is reset handler zero? + bool usexor = false; + uint32_t handler; // 2017 03 10 ÒÔºóµÄ¹Ì¼þ¶Á³öΪ0»òÕßxorºó½á¹û + if (jlinkCommandReadEmulatorMemory(dev, addr + 4, 4, &handler) && (handler >> 24) != (addr >> 24)) { + usexor = true; + uint32_t status = -1; + if (jlinkCommandSetEmulateOption(dev, 0x182, 0x55, &status)) { + if (status) { + printf("1st set option: 0x%08X\n", status); + } + } + } + + for (uint32_t pos = 0; pos < size; pos += 0x200, addr += 0x200) { + for (int i = 0; i < 20; i++) { + size_t lesssize = min(0x200, size); + if (jlinkCommandReadEmulatorMemory(dev, addr, lesssize, (char*)buf + pos)) { + if (usexor) { + uint32_t xorkey = 0x55; + for (uint32_t* dw = (uint32_t*)((char*)buf + pos); dw != (uint32_t*)((char*)buf + pos + lesssize); dw++) { + *dw = *dw ^ xorkey; + xorkey = *dw ^ 0xA5A5A5A5; + } + } + if (i) { + printf("%d retries on 0x%08X.\n", i, addr); + } + break; + } else if (i == 19) { + printf("failed on 0x%08X.\n", addr); + return false; + } + } + } + if (usexor) { + uint32_t status = -1; + if (jlinkCommandSetEmulateOption(dev, 0x182, 0, &status)) { + if (status) { + printf("2nd set option: 0x%08X\n", status); + } + } + } + return true; +} + +bool jlinkCommandReadUID(JlinkDevice* dev, uint32_t* size, void* dataBuffer) +{ + uint8_t commandBuffer[10] = { + 0x18, + 0x00 + }; + *(uint32_t*)&commandBuffer[2] = 4; + *(uint32_t*)&commandBuffer[6] = *size; + + uint32_t leftLength = 0; + if (!jlinkSendCommand(dev, commandBuffer, sizeof(commandBuffer), &leftLength, sizeof(leftLength))) + return false; + + *size = leftLength; + return jlinkContinueReadResult(dev, dataBuffer, leftLength); +} + +bool jlinkCommandReadOTS(JlinkDevice* dev, void* dataBuffer) +{ + uint8_t commandBuffer[14] = { + 0x16, + 0x02 + }; + *(uint32_t*)&commandBuffer[2] = 0; + memcpy(&commandBuffer[6], "IDSEGGER", 8); + + uint32_t leftLength = 0; + if (!jlinkSendCommand(dev, commandBuffer, sizeof(commandBuffer), &leftLength, sizeof(leftLength))) + return false; + + return jlinkContinueReadResult(dev, dataBuffer, leftLength); +} diff --git a/EDUReViver/usbconn.h b/EDUReViver/usbconn.h new file mode 100644 index 0000000..9e26106 --- /dev/null +++ b/EDUReViver/usbconn.h @@ -0,0 +1,108 @@ +#ifndef _USB_CONN_H +#define _USB_CONN_H + +#define WIN32_LEAN_AND_MEAN +#include +#include +#include + + +typedef PVOID WINUSB_INTERFACE_HANDLE, *PWINUSB_INTERFACE_HANDLE; +#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02 +#define RAW_IO 0x07 +#define PIPE_TRANSFER_TIMEOUT 0x03 +#define MAXIMUM_TRANSFER_SIZE 0x08 + +#pragma pack(push, 1) +typedef struct _USB_CONFIGURATION_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + USHORT wTotalLength; + UCHAR bNumInterfaces; + UCHAR bConfigurationValue; + UCHAR iConfiguration; + UCHAR bmAttributes; + UCHAR MaxPower; +} USB_CONFIGURATION_DESCRIPTOR, *PUSB_CONFIGURATION_DESCRIPTOR; + +typedef struct _USB_INTERFACE_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + UCHAR bInterfaceNumber; + UCHAR bAlternateSetting; + UCHAR bNumEndpoints; + UCHAR bInterfaceClass; + UCHAR bInterfaceSubClass; + UCHAR bInterfaceProtocol; + UCHAR iInterface; +} USB_INTERFACE_DESCRIPTOR, *PUSB_INTERFACE_DESCRIPTOR; + +typedef struct _USB_ENDPOINT_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + UCHAR bEndpointAddress; + UCHAR bmAttributes; + USHORT wMaxPacketSize; + UCHAR bInterval; +} USB_ENDPOINT_DESCRIPTOR, *PUSB_ENDPOINT_DESCRIPTOR; + +typedef struct _WINUSB_SETUP_PACKET { + UCHAR RequestType; + UCHAR Request; + USHORT Value; + USHORT Index; + USHORT Length; +} WINUSB_SETUP_PACKET, *PWINUSB_SETUP_PACKET; +#pragma pack(pop) + +struct JlinkDevice { + bool isWinusb; + HANDLE deviceFile; + union { + struct { + HANDLE readPipeFile; + HANDLE writePipeFile; + }; + struct { + WINUSB_INTERFACE_HANDLE interfaceHandle; + UCHAR readPipe; // 01 + UCHAR writePipe; // 81 + }; + }; + uint16_t pid; + uint16_t vid; +}; + +typedef std::vector JLinkDevVec; + +int LoadWinusb(); +int UnloadWinusb(); + +bool hotlinkSendCommand(WINUSB_INTERFACE_HANDLE winusbHandle, void const* commandBuffer, uint32_t commandLength, void* resultBuffer, uint32_t resultHeaderLength); +bool hotlinkContinueReadResult(WINUSB_INTERFACE_HANDLE winusbHandle, void* resultBuffer, uint32_t resultLength); +bool hotlinkReadLenResult(WINUSB_INTERFACE_HANDLE winusbHandle, void* recbuf, size_t* reclen); +bool hotlinkSendRec(WINUSB_INTERFACE_HANDLE winusbHandle, void const* recbuf, size_t reclen, int32_t* retcode); +bool hotlinkRecvRecPasv(WINUSB_INTERFACE_HANDLE winusbHandle, int32_t* retcode, void* recbuf, size_t* reclen); + +bool getWinUSBLinks(JLinkDevVec& vec); +bool getSeggerJlinks(JLinkDevVec& vec, GUID* guid); +bool getJLinks(JLinkDevVec& vec); +void freeJLinks(JLinkDevVec& vec); +#ifdef WRITERTHREAD +HANDLE createPipeWriterThread(); +bool destroyPipeWriterThread(HANDLE hthread); +#endif + +bool jlinkSendCommand(JlinkDevice* dev, void const* commandBuffer, uint32_t commandLength, void* resultBuffer, uint32_t resultHeaderLength); +bool jlinkContinueReadResult(JlinkDevice* dev, void* resultBuffer, uint32_t resultLength); +bool jlinkCommandReadFirmwareVersion(JlinkDevice* dev, void* dataBuffer); +bool jlinkLoopReadFirmwareVersion(JlinkDevice* dev, void* dataBuffer); +bool jlinkCommandReadEmulatorMemory(JlinkDevice* dev, uint32_t address, uint32_t length, void* dataBuffer); +bool jlinkCommandSetEmulateOption(JlinkDevice* dev, uint32_t option, uint32_t val, uint32_t* status); +bool jlinkCommandSendUpdateFirmware(JlinkDevice* dev, uint8_t* reply); +bool jlinkCommandSendSelectInterface(JlinkDevice* dev, uint8_t newif, uint32_t* oldif); +bool jlinkDumpFullFirmware(JlinkDevice* dev, uint32_t addr, uint32_t size, void* buf); +bool jlinkCommandReadUID(JlinkDevice* dev, uint32_t* size, void* dataBuffer); +bool jlinkCommandReadOTS(JlinkDevice* dev, void* dataBuffer); + +#endif \ No newline at end of file diff --git a/Payloads/blinky.c b/Payloads/blinky.c new file mode 100644 index 0000000..c8bcf45 --- /dev/null +++ b/Payloads/blinky.c @@ -0,0 +1,93 @@ +#include +#include "LPC43xx.h" + + +volatile uint32_t btl_magic __attribute__((at(0x20000000))); + +//__no_init char iapmem[16] @ 0x10089FF0; + +#define IAP_LOCATION *(volatile unsigned int *)(0x10400100) +typedef void (*IAP)(unsigned int [],unsigned int[]); +typedef void (*IAPINIT)(unsigned int []); + +#define CMD_SUCCESS 0 + +//__attribute__((zero_init)) char pagecache[0x200]; + +void FeedWWDT(void); +void InitUSART3(void); +void delay200ms(void); +void wmemcpy(uint32_t* dst, const uint32_t* src, size_t cnt) __attribute__((always_inline)); +void wmemset(uint32_t* dst, uint32_t val, size_t cnt) __attribute__((always_inline)); +char writeflashpage(uint32_t destaddr, const void* src); + +void InitUSART3(void) +{ + LPC_CCU1->CLK_M4_GPIO_CFG |= 1; + while (!(LPC_CCU1->CLK_M4_GPIO_STAT & 1)); + LPC_CCU2->CLK_APB2_USART3_CFG |= 1; + while (!(LPC_CCU2->CLK_APB2_USART3_STAT & 1U)) + LPC_CCU1->CLK_M4_USART3_CFG |= 1; // autoen,wakeupen + while (!(LPC_CCU1->CLK_M4_USART3_STAT & 1U)); + LPC_SCU->SFSP2_3 = 0x242; // P2_3 -> Fun2, EUPN, EZI, ZIF + LPC_USART3->IER = 0; // Disable interrupts + LPC_USART3->LCR = 0x83; // 8Bit, DLAB + // 12M/16=750000 750000/6.51=115207 + // 750000/12*13/24=33854 + // 750000/3/(1+13/11)=114650?? + // 750000/6*12/13=115384 + LPC_USART3->DLL = 6; + LPC_USART3->DLM = 0; + LPC_USART3->FDR = 1 | (12 << 4); // ·Ö×ÓÔÚ×ó?! + LPC_USART3->LCR = 0x3; // DLAB=0 +} + +// 12MHz, IAR +void delay200ms(void) +{ + for (uint32_t i = 483877; i; i--) { + __NOP(); + __NOP(); + } +} + +void wmemcpy(uint32_t* dst, const uint32_t* src, size_t cnt) +{ + while (cnt--) { + *dst++ = *src++; + } +} + +void wmemset(uint32_t* dst, uint32_t val, size_t cnt) +{ + while (cnt--) { + *dst++ = val; + } +} + +// 180Mhz PLL, 12M IRC +#define CPUKHZ 180000 + +//__attribute__((noreturn)) void nakemain(void); +void __main(void) __attribute__((used, section("RESET"))); + +void __main(void) +{ + for (int loop = 12; loop; loop--) { + LPC_GPIO_PORT->CLR[5] = 1 << 4; // ON + FeedWWDT(); + delay200ms(); + LPC_GPIO_PORT->SET[5] = 1 << 4; // OFF + FeedWWDT(); + delay200ms(); + } + return; +} + +void FeedWWDT(void) +{ + if (LPC_WWDT->MOD & 1) { + LPC_WWDT->FEED = 0xAA; + LPC_WWDT->FEED = 0x55; + } +} \ No newline at end of file diff --git a/Payloads/revive.c b/Payloads/revive.c new file mode 100644 index 0000000..083391b --- /dev/null +++ b/Payloads/revive.c @@ -0,0 +1,118 @@ +#include +#include "LPC43xx.h" + + +volatile uint32_t btl_magic __attribute__((at(0x20000000))); + +//__no_init char iapmem[16] @ 0x10089FF0; + +#define IAP_LOCATION *(volatile unsigned int *)(0x10400100) +typedef void (*IAP)(unsigned int [],unsigned int[]); +typedef void (*IAPINIT)(unsigned int []); + +#define CMD_SUCCESS 0 + +//__attribute__((zero_init)) char pagecache[0x200]; + +void FeedWWDT(void); +void wmemcpy(uint32_t* dst, const uint32_t* src, size_t cnt) __attribute__((always_inline)); +void wmemset(uint32_t* dst, uint32_t val, size_t cnt) __attribute__((always_inline)); +char writeflashpage(uint32_t destaddr, const void* src); + +void wmemcpy(uint32_t* dst, const uint32_t* src, size_t cnt) +{ + while (cnt--) { + *dst++ = *src++; + } +} + +void wmemset(uint32_t* dst, uint32_t val, size_t cnt) +{ + while (cnt--) { + *dst++ = val; + } +} + +// 180Mhz PLL, 12M IRC +#define CPUKHZ 180000 + +//__attribute__((noreturn)) void nakemain(void); +void __main(void) __attribute__((used, section("RESET"))); + +char writeflashpage(uint32_t destaddr, const void* src) +{ + IAP iap_entry=(IAP)IAP_LOCATION; + char flashok = 0; + uint8_t sect = destaddr>=0x1A010000?(destaddr >> 16) + 7:(destaddr >> 13); + uint32_t cmd[5]; + uint32_t* status = cmd; + cmd[0] = 49; // init + //((IAPINIT)iap_entry)(cmd); // 88b + iap_entry(cmd, status); // 88b + cmd[0] = 50; // Prepare + cmd[1] = sect; // sector2, 8k (4000~5FFF) + cmd[2] = sect; // same + cmd[3] = 0; // bankA + iap_entry(cmd, status); // 118b + if (status[0] == CMD_SUCCESS) { + cmd[0] = 59; // Earse page + cmd[1] = destaddr; + cmd[2] = destaddr; + cmd[3] = CPUKHZ; + cmd[4] = 0; // bankA + iap_entry(cmd, status); // 168b + if (status[0] == CMD_SUCCESS) { + cmd[0] = 50; // Prepare + cmd[1] = sect; + cmd[2] = sect; + cmd[3] = 0; + iap_entry(cmd, status); + if (status[0] == CMD_SUCCESS) { + cmd[0] = 51; // Copy RAM to Flash + cmd[1] = destaddr; + cmd[2] = (uint32_t)src; + cmd[3] = 0x200; // Page + cmd[4] = CPUKHZ; + iap_entry(cmd, status); // 208b + if (status[0] == CMD_SUCCESS) { + //printf("Copy RAM to Flash OK!\n"); + flashok = 1; + } else { + //printf("Copy RAM to Flash faied: %d\n", status[0]); + } + } else { + //printf("Prepare copy failed: %d\n", status[0]); + } + } else { + //printf("Erase page failed: %d\n", status[0]); + } + } else { + //printf("Prepare erase failed: %d\n", status[0]); + } + return flashok; +} + +#define CRP1 0x12345678 + +void __main(void) +{ + char pagecache[0x200]; // task stack + + __disable_irq(); + FeedWWDT(); + if (*(uint32_t*)0x1A005E40 != 0xFFFFFFFF && *(uint32_t*)0x1A005E04 == 0x32051976) { + wmemcpy((uint32_t*)pagecache, (void*)0x1A005E00, 0x200 / 4); + wmemset((uint32_t*)&pagecache[0x40], 0xFFFFFFFF, 0x60 / 4); // 1A005E40 + writeflashpage(0x1A005E00, pagecache); + } + __enable_irq(); + return; +} + +void FeedWWDT(void) +{ + if (LPC_WWDT->MOD & 1) { + LPC_WWDT->FEED = 0xAA; + LPC_WWDT->FEED = 0x55; + } +} \ No newline at end of file diff --git a/Payloads/swd.c b/Payloads/swd.c new file mode 100644 index 0000000..d051a8c --- /dev/null +++ b/Payloads/swd.c @@ -0,0 +1,118 @@ +#include +#include "LPC43xx.h" + + +volatile uint32_t btl_magic __attribute__((at(0x20000000))); + +//__no_init char iapmem[16] @ 0x10089FF0; + +#define IAP_LOCATION *(volatile unsigned int *)(0x10400100) +typedef void (*IAP)(unsigned int [],unsigned int[]); +typedef void (*IAPINIT)(unsigned int []); + +#define CMD_SUCCESS 0 + +//__attribute__((zero_init)) char pagecache[0x200]; + +void FeedWWDT(void); +void wmemcpy(uint32_t* dst, const uint32_t* src, size_t cnt) __attribute__((always_inline)); +void wmemset(uint32_t* dst, uint32_t val, size_t cnt) __attribute__((always_inline)); +char writeflashpage(uint32_t destaddr, const void* src); + +void wmemcpy(uint32_t* dst, const uint32_t* src, size_t cnt) +{ + while (cnt--) { + *dst++ = *src++; + } +} + +void wmemset(uint32_t* dst, uint32_t val, size_t cnt) +{ + while (cnt--) { + *dst++ = val; + } +} + +// 180Mhz PLL, 12M IRC +#define CPUKHZ 180000 + +//__attribute__((noreturn)) void nakemain(void); +void __main(void) __attribute__((used, section("RESET"))); + +char writeflashpage(uint32_t destaddr, const void* src) +{ + IAP iap_entry=(IAP)IAP_LOCATION; + char flashok = 0; + uint8_t sect = destaddr>=0x1A010000?(destaddr >> 16) + 7:(destaddr >> 13); + uint32_t cmd[5]; + uint32_t* status = cmd; + cmd[0] = 49; // init + //((IAPINIT)iap_entry)(cmd); // 88b + iap_entry(cmd, status); // 88b + cmd[0] = 50; // Prepare + cmd[1] = sect; // sector2, 8k (4000~5FFF) + cmd[2] = sect; // same + cmd[3] = 0; // bankA + iap_entry(cmd, status); // 118b + if (status[0] == CMD_SUCCESS) { + cmd[0] = 59; // Earse page + cmd[1] = destaddr; + cmd[2] = destaddr; + cmd[3] = CPUKHZ; + cmd[4] = 0; // bankA + iap_entry(cmd, status); // 168b + if (status[0] == CMD_SUCCESS) { + cmd[0] = 50; // Prepare + cmd[1] = sect; + cmd[2] = sect; + cmd[3] = 0; + iap_entry(cmd, status); + if (status[0] == CMD_SUCCESS) { + cmd[0] = 51; // Copy RAM to Flash + cmd[1] = destaddr; + cmd[2] = (uint32_t)src; + cmd[3] = 0x200; // Page + cmd[4] = CPUKHZ; + iap_entry(cmd, status); // 208b + if (status[0] == CMD_SUCCESS) { + //printf("Copy RAM to Flash OK!\n"); + flashok = 1; + } else { + //printf("Copy RAM to Flash faied: %d\n", status[0]); + } + } else { + //printf("Prepare copy failed: %d\n", status[0]); + } + } else { + //printf("Erase page failed: %d\n", status[0]); + } + } else { + //printf("Prepare erase failed: %d\n", status[0]); + } + return flashok; +} + +#define CRP1 0x12345678 + +void __main(void) +{ + char pagecache[0x200]; // task stack + + __disable_irq(); + FeedWWDT(); + if (*(uint32_t*)0x1A0002FC != CRP1 && *(uint32_t*)0x1A005E04 == 0x32051976) { + wmemcpy((uint32_t*)pagecache, (void*)0x1A000200, 0x200 / 4); + *(uint32_t*)(&pagecache[0xFC]) = CRP1; // 1A0002FC + writeflashpage(0x1A000200, pagecache); + } + __enable_irq(); + return; +} + +void FeedWWDT(void) +{ + if (LPC_WWDT->MOD & 1) { + LPC_WWDT->FEED = 0xAA; + LPC_WWDT->FEED = 0x55; + } +} \ No newline at end of file diff --git a/Payloads/to10.c b/Payloads/to10.c new file mode 100644 index 0000000..be41d0b --- /dev/null +++ b/Payloads/to10.c @@ -0,0 +1,122 @@ +#include +#include "LPC43xx.h" + + +volatile uint32_t btl_magic __attribute__((at(0x20000000))); + +//__no_init char iapmem[16] @ 0x10089FF0; + +#define IAP_LOCATION *(volatile unsigned int *)(0x10400100) +typedef void (*IAP)(unsigned int [],unsigned int[]); +typedef void (*IAPINIT)(unsigned int []); + +#define CMD_SUCCESS 0 + +//__attribute__((zero_init)) char pagecache[0x200]; + +void FeedWWDT(void); +void wmemcpy(uint32_t* dst, const uint32_t* src, size_t cnt) __attribute__((always_inline)); +void wmemset(uint32_t* dst, uint32_t val, size_t cnt) __attribute__((always_inline)); +char writeflashpage(uint32_t destaddr, const void* src); + +void wmemcpy(uint32_t* dst, const uint32_t* src, size_t cnt) +{ + while (cnt--) { + *dst++ = *src++; + } +} + +void wmemset(uint32_t* dst, uint32_t val, size_t cnt) +{ + while (cnt--) { + *dst++ = val; + } +} + +// 180Mhz PLL, 12M IRC +#define CPUKHZ 180000 + +//__attribute__((noreturn)) void nakemain(void); +void __main(void) __attribute__((used, section("RESET"))); + +char writeflashpage(uint32_t destaddr, const void* src) +{ + IAP iap_entry=(IAP)IAP_LOCATION; + char flashok = 0; + uint8_t sect = destaddr>=0x1A010000?(destaddr >> 16) + 7:(destaddr >> 13); + uint32_t cmd[5]; + uint32_t* status = cmd; + cmd[0] = 49; // init + //((IAPINIT)iap_entry)(cmd); // 88b + iap_entry(cmd, status); // 88b + cmd[0] = 50; // Prepare + cmd[1] = sect; // sector2, 8k (4000~5FFF) + cmd[2] = sect; // same + cmd[3] = 0; // bankA + iap_entry(cmd, status); // 118b + if (status[0] == CMD_SUCCESS) { + cmd[0] = 59; // Earse page + cmd[1] = destaddr; + cmd[2] = destaddr; + cmd[3] = CPUKHZ; + cmd[4] = 0; // bankA + iap_entry(cmd, status); // 168b + if (status[0] == CMD_SUCCESS) { + cmd[0] = 50; // Prepare + cmd[1] = sect; + cmd[2] = sect; + cmd[3] = 0; + iap_entry(cmd, status); + if (status[0] == CMD_SUCCESS) { + cmd[0] = 51; // Copy RAM to Flash + cmd[1] = destaddr; + cmd[2] = (uint32_t)src; + cmd[3] = 0x200; // Page + cmd[4] = CPUKHZ; + iap_entry(cmd, status); // 208b + if (status[0] == CMD_SUCCESS) { + //printf("Copy RAM to Flash OK!\n"); + flashok = 1; + } else { + //printf("Copy RAM to Flash faied: %d\n", status[0]); + } + } else { + //printf("Prepare copy failed: %d\n", status[0]); + } + } else { + //printf("Erase page failed: %d\n", status[0]); + } + } else { + //printf("Prepare erase failed: %d\n", status[0]); + } + return flashok; +} + +#define CRP1 0x12345678 + +void __main(void) +{ + char pagecache[0x200]; // task stack + + __disable_irq(); + FeedWWDT(); + if (*(uint8_t*)0x1A002F89 == '1' && *(uint32_t*)0x1A005E04 == 0x32051976) { + wmemcpy((uint32_t*)pagecache, (void*)0x1A002E00, 0x200 / 4); + pagecache[0x189] = '0'; // 1A002F89 + writeflashpage(0x1A002E00, pagecache); + + wmemcpy((uint32_t*)pagecache, (void*)0x1A000000, 0x200 / 4); + pagecache[0x139] = '0'; // 1A000139 + writeflashpage(0x1A000000, pagecache); + } + __enable_irq(); + return; +} + +void FeedWWDT(void) +{ + if (LPC_WWDT->MOD & 1) { + LPC_WWDT->FEED = 0xAA; + LPC_WWDT->FEED = 0x55; + } +} \ No newline at end of file diff --git a/Payloads/to11.c b/Payloads/to11.c new file mode 100644 index 0000000..bceba77 --- /dev/null +++ b/Payloads/to11.c @@ -0,0 +1,122 @@ +#include +#include "LPC43xx.h" + + +volatile uint32_t btl_magic __attribute__((at(0x20000000))); + +//__no_init char iapmem[16] @ 0x10089FF0; + +#define IAP_LOCATION *(volatile unsigned int *)(0x10400100) +typedef void (*IAP)(unsigned int [],unsigned int[]); +typedef void (*IAPINIT)(unsigned int []); + +#define CMD_SUCCESS 0 + +//__attribute__((zero_init)) char pagecache[0x200]; + +void FeedWWDT(void); +void wmemcpy(uint32_t* dst, const uint32_t* src, size_t cnt) __attribute__((always_inline)); +void wmemset(uint32_t* dst, uint32_t val, size_t cnt) __attribute__((always_inline)); +char writeflashpage(uint32_t destaddr, const void* src); + +void wmemcpy(uint32_t* dst, const uint32_t* src, size_t cnt) +{ + while (cnt--) { + *dst++ = *src++; + } +} + +void wmemset(uint32_t* dst, uint32_t val, size_t cnt) +{ + while (cnt--) { + *dst++ = val; + } +} + +// 180Mhz PLL, 12M IRC +#define CPUKHZ 180000 + +//__attribute__((noreturn)) void nakemain(void); +void __main(void) __attribute__((used, section("RESET"))); + +char writeflashpage(uint32_t destaddr, const void* src) +{ + IAP iap_entry=(IAP)IAP_LOCATION; + char flashok = 0; + uint8_t sect = destaddr>=0x1A010000?(destaddr >> 16) + 7:(destaddr >> 13); + uint32_t cmd[5]; + uint32_t* status = cmd; + cmd[0] = 49; // init + //((IAPINIT)iap_entry)(cmd); // 88b + iap_entry(cmd, status); // 88b + cmd[0] = 50; // Prepare + cmd[1] = sect; // sector2, 8k (4000~5FFF) + cmd[2] = sect; // same + cmd[3] = 0; // bankA + iap_entry(cmd, status); // 118b + if (status[0] == CMD_SUCCESS) { + cmd[0] = 59; // Earse page + cmd[1] = destaddr; + cmd[2] = destaddr; + cmd[3] = CPUKHZ; + cmd[4] = 0; // bankA + iap_entry(cmd, status); // 168b + if (status[0] == CMD_SUCCESS) { + cmd[0] = 50; // Prepare + cmd[1] = sect; + cmd[2] = sect; + cmd[3] = 0; + iap_entry(cmd, status); + if (status[0] == CMD_SUCCESS) { + cmd[0] = 51; // Copy RAM to Flash + cmd[1] = destaddr; + cmd[2] = (uint32_t)src; + cmd[3] = 0x200; // Page + cmd[4] = CPUKHZ; + iap_entry(cmd, status); // 208b + if (status[0] == CMD_SUCCESS) { + //printf("Copy RAM to Flash OK!\n"); + flashok = 1; + } else { + //printf("Copy RAM to Flash faied: %d\n", status[0]); + } + } else { + //printf("Prepare copy failed: %d\n", status[0]); + } + } else { + //printf("Erase page failed: %d\n", status[0]); + } + } else { + //printf("Prepare erase failed: %d\n", status[0]); + } + return flashok; +} + +#define CRP1 0x12345678 + +void __main(void) +{ + char pagecache[0x200]; // task stack + + __disable_irq(); + FeedWWDT(); + if (*(uint8_t*)0x1A002F89 == '0' && *(uint32_t*)0x1A005E04 == 0x32051976) { + wmemcpy((uint32_t*)pagecache, (void*)0x1A002E00, 0x200 / 4); + pagecache[0x189] = '1'; // 1A002F89 + writeflashpage(0x1A002E00, pagecache); + + wmemcpy((uint32_t*)pagecache, (void*)0x1A000000, 0x200 / 4); + pagecache[0x139] = '1'; // 1A000139 + writeflashpage(0x1A000000, pagecache); + } + __enable_irq(); + return; +} + +void FeedWWDT(void) +{ + if (LPC_WWDT->MOD & 1) { + LPC_WWDT->FEED = 0xAA; + LPC_WWDT->FEED = 0x55; + } +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..da04a89 --- /dev/null +++ b/README.md @@ -0,0 +1,60 @@ +J-Link EDU Reviver +================== + +ʹÓ÷½·¨ +-------- +½âѹËùÓÐÎļþµ½Í¬Ò»Ä¿Â¼ÖÐ, ÔÚÃüÁîÐÐÏÂÖ´ÐÐ + +EDUReViver -run blinky +ÉÁµÆ²âÊÔ, Èç¹ûºìµÆÉÁ˸12´Î, ˵Ã÷É豸ÄÜͨ¹ýУÑéÇÒÍøÂçͨѶÕý³£. + +EDUReViver -run revive +È¥³ý¶àÓàµÄFlashDLÖ®ÀàµÄFeatures. + +EDUReViver -run swd +´ò¿ªSWDµ÷ÊÔ½Ó¿Ú. + +EDUReViver -run to11 +ת»»V10µ½V11. ÖØвå°Îºó, ´ò¿ªjlink commander»á×Ô¶¯Ë¢Ð¹̼þ. + +EDUReViver -run to10 +ת»»V11µ½V10. ÖØвå°Îºó, ´ò¿ªjlink commander»á×Ô¶¯Ë¢Ð¹̼þ. + +Ö§³ÖÉ豸 +-------- +J-Link V10/V11 ËùÓа汾, ĿǰΪֹËùÓй̼þ. + +ÃâÔðÉùÃ÷ +-------- +´Ë¹¤¾ß½ö¹©Ñо¿ºÍѧϰʹÓÃ, ÇëÎð½«ÆäÓÃÓÚÉÌÒµÓÃ;. ÇëÎðÔÚɽկ°æÉÏʹÓÃ, ÓпÉÄܵ¼Ö¹¤¾ßϼÜ. + + +Introduce +--------- +This utility support all version of JLinkV10/V11. support genius brick which added bad features. +don't support illegal clones. some check applied on my utility to prevent running on clones. +turn off winusb mode in JlinkConfig if you meet usb communicate problems. + +Usage +-------- +extract all files to same folder. +execute these commands in command prompt. + +EDUReViver -run blinky +this payload blinks red LED 12 times. this should used to test your usb and network connection is fine. + +EDUReViver -run revive +this payload remove all extra features. + +EDUReViver -run swd +this payload unlocking SWD debug port on PCB. + +EDUReViver -run to11 +this payload turns your V10 to V11. unplug and replug usb cable, then flash new firmware in jlink commander. + +EDUReViver -run to10 +this payload turns your V11 to V10. unplug and replug usb cable, then flash new firmware in jlink commander. + +Disclaimer +---------- +You can only use my utility for research propose, or repair your genius jlink. \ No newline at end of file diff --git a/Target/VS2010/Release/Readme_cn.txt b/Target/VS2010/Release/Readme_cn.txt new file mode 100644 index 0000000..fb896eb --- /dev/null +++ b/Target/VS2010/Release/Readme_cn.txt @@ -0,0 +1,22 @@ +´Ë¹¤¾ßÖ§³ÖJLinkV10/V11µ½Ä¿Ç°ÎªÖ¹ËùÓй̼þ°æ±¾. Ö§³Ö´íÎóÌí¼ÓÁËFeaturesµÄÕý°æ. ΨһҪÇó, ²»ÄÜÊÇɽկ°æ. ÎÒ¼ÓÁËһЩÔÚÏß¼ì²â±ÜÃâÀÄÓÃ. +Ò»´ÎÖ»ÄÜÖ§³ÖÒ»¸öÉ豸, Ö§³ÖÉèÖÃΪWinUSBÇý¶¯µÄаæ¹Ì¼þ, Èç¹û³öÏÖʶ±ð´íÎó, ÇëÔÚJLinkConfigÅäÖóÌÐòÖÐÇл»µ½SeggerÇý¶¯. + +ʹÓ÷½·¨: +½âѹËùÓÐÎļþµ½Í¬Ò»Ä¿Â¼ÖÐ, ÔÚÃüÁîÐÐÏÂÖ´ÐÐ + +EDUReViver -run blinky +ÉÁµÆ²âÊÔ, Èç¹ûºìµÆÉÁ˸12´Î, ˵Ã÷É豸ÄÜͨ¹ýУÑéÇÒÍøÂçͨѶÕý³£. + +EDUReViver -run revive +È¥³ý¶àÓàµÄFlashDLÖ®ÀàµÄFeatures. + +EDUReViver -run swd +´ò¿ªSWDµ÷ÊÔ½Ó¿Ú. + +EDUReViver -run to11 +ת»»V10µ½V11. ÖØвå°Îºó, ´ò¿ªjlink commander»á×Ô¶¯Ë¢Ð¹̼þ. + +EDUReViver -run to10 +ת»»V11µ½V10. ÖØвå°Îºó, ´ò¿ªjlink commander»á×Ô¶¯Ë¢Ð¹̼þ. + +´Ë¹¤¾ß½ö¹©Ñо¿ºÍѧϰʹÓÃ, ÇëÎð½«ÆäÓÃÓÚÉÌÒµÓÃ;. \ No newline at end of file diff --git a/Target/VS2010/Release/Readme_en.txt b/Target/VS2010/Release/Readme_en.txt new file mode 100644 index 0000000..4e8e3be --- /dev/null +++ b/Target/VS2010/Release/Readme_en.txt @@ -0,0 +1,25 @@ +This utility support all version of JLinkV10/V11. support genius brick which added bad features. +don't support illegal clones. some check applied on my utility to prevent running on clones. +turn off winusb mode in JlinkConfig if you meet usb communicate problems. + +Usage: +extract all files to same folder. +execute these commands in command prompt. + +EDUReViver -run blinky +this payload blinks red LED 12 times. this should used to test your usb and network connection is fine. + +EDUReViver -run revive +this payload remove all extra features. + +EDUReViver -run swd +this payload unlocking SWD debug port on PCB. + +EDUReViver -run to11 +this payload turns your V10 to V11. unplug and replug usb cable, then flash new firmware in jlink commander. + +EDUReViver -run to10 +this payload turns your V11 to V10. unplug and replug usb cable, then flash new firmware in jlink commander. + + +You can only use my utility for research propose, or repair your genius jlink. \ No newline at end of file diff --git a/Target/VS2010/Release/firmwarecfgs.lst b/Target/VS2010/Release/firmwarecfgs.lst new file mode 100644 index 0000000..19aed4c --- /dev/null +++ b/Target/VS2010/Release/firmwarecfgs.lst @@ -0,0 +1,2 @@ +"J-Link V10 compiled Feb 2 2018 18:12:40", 0x100840A0, 0x1A010718, 0x1A010EDA, false +"J-Link V10 compiled Feb 21 2019 12:48:07", 0x10084008, 0x1A010A76, 0x1A011222, false \ No newline at end of file