ParallelsDesktopCrack/src/main.cpp

1828 lines
131 KiB
C++
Raw Blame History

// hack to use objc_msgSend
#define _OBJC_MESSAGE_H
#include <CoreFoundation/CoreFoundation.h>
#include <objc/objc.h>
#include <objc/runtime.h>
#include <objc/NSObjCRuntime.h>
#include <dlfcn.h>
#include <mach/mach.h>
#include <mach/mach_vm.h>
#include <mach-o/dyld.h>
#include <mach-o/getsect.h>
#include <os/log.h>
#include <sys/stat.h>
#include <errno.h>
#include <type_traits>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
#include <stdarg.h>
#define LOGGING_DISABLE
#include <dobby.h>
#define JM_XORSTR_DISABLE_AVX_INTRINSICS
#include "xorstr.hpp"
OBJC_EXPORT id _Nullable
objc_msgSend(id _Nullable self, SEL _Nonnull op, ...)
OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0);
#if defined(_M_X64) || defined(__x86_64__)
#define TARGET_ARCH_X64 1
#elif defined(__AARCH64EL__)
#define TARGET_ARCH_ARM64 1
#else
#error unsupported arch
#endif
#if !defined(TARGET_ARCH_X64)
__attribute__((constructor))
void func_load() {
const char* header = "Error";
const char* message = "This crack version only support intel CPU!";
CFStringRef header_ref = CFStringCreateWithCString(NULL, header, strlen(header));
CFStringRef message_ref = CFStringCreateWithCString(NULL,message,strlen(message));
CFOptionFlags result;
CFUserNotificationDisplayAlert(
0, //timeout
kCFUserNotificationNoDefaultButtonFlag, //flags
NULL, //iconURL
NULL, // soundURL
NULL, // localizationURL
header_ref, // alertHeader
message_ref, // alertMessage
NULL, // defaultButtonTitle just "ok"
NULL, // alternateButtonTitle
NULL, // otherButtonTitle
&result // responseFlags
);
exit(0);
}
#endif
#ifdef TARGET_ARCH_X64
// #define ENABLE_DLOG 1
#if defined(ENABLE_DLOG)
#define dlog(format, ...) { os_log(OS_LOG_DEFAULT, "[PARALLELS_PATCH_LOG] " format, ##__VA_ARGS__); }
#else
#define dlog(format, ...)
#endif
#ifdef TARGET_ARCH_X64
#define OPCODE_RETURN_0 { 0x48, 0x31, 0xC0, 0xC3 }
#define OPCODE_RETURN_1 { 0x6A, 0x01, 0x58, 0xC3 }
#endif
#ifdef TARGET_ARCH_ARM64
#define OPCODE_RETURN_0 { 0x00, 0x00, 0x80, 0xd2, 0xc0, 0x03, 0x5f, 0xd6 }
#define OPCODE_RETURN_1 { 0x20, 0x00, 0x80, 0xd2, 0xc0, 0x03, 0x5f, 0xd6 }
#endif
id vars_g_static_class = nullptr;
typedef uint64_t (*type_AppDelegate_checkForUpdates_t)(uint64_t, uint64_t, int);
type_AppDelegate_checkForUpdates_t vars_g_old_AppDelegate_checkForUpdates;
uint64_t func_hook_AppDelegate_checkForUpdates(uint64_t a1, uint64_t a2, int a3)
{
if (a3 == 1)
return vars_g_old_AppDelegate_checkForUpdates(a1, a2, 1LL);
return 0;
}
int func_return_0() {
return 0;
}
int func_return_1() {
return 1;
}
typedef void (*type_objc_void_bool_t)(void*, void*, bool);
type_objc_void_bool_t vars_g_CEPLog_setCEPDisabled;
void func_hook_CEPLog_setCEPDisabled(void* a1, void* a2, bool disbale)
{
if (!disbale)
{
dlog("[*] hook [CEPLog setCEPDisabled: true] hook to false");
}
else
{
dlog("[*] hook [CEPLog setCEPDisabled: false]");
}
vars_g_CEPLog_setCEPDisabled(a1, a2, 1);
}
type_objc_void_bool_t vars_g_CEPLog_setCEPSentAfterDisabling;
void func_hook_CEPLog_setCEPSentAfterDisabling(void* a1, void* a2, bool disable)
{
if (!disable)
{
dlog("[*] enter [CEPLog setCEPSentAfterDisabling: true] hook to false");
}
else
{
dlog("[*] enter [CEPLog setCEPSentAfterDisabling: false]");
}
vars_g_CEPLog_setCEPSentAfterDisabling(a1, a2, 1);
}
bool str_ends_with(const char* a1, const char* a2) {
auto a1_len = strlen(a1);
auto a2_len = strlen(a2);
if (a1_len < a2_len) return false;
return 0 == strcmp(a1 + a1_len - a2_len, a2);
}
IMP func_getObjcMethod(const char *className, const char *methodName)
{
auto c = objc_getClass(className);
auto s = sel_registerName(methodName);
auto m = class_getInstanceMethod(c, s);
return method_getImplementation(m);
}
void func_patch_objc(const char* className, const char* methodName, void *replace, int replace_size)
{
auto addr = (void *)func_getObjcMethod(className, methodName);
if (!addr)
{
dlog("[-] can not found [%s %s].", className, methodName)
return;
}
if (kMemoryOperationSuccess == CodePatch(addr, (uint8_t*)replace, replace_size))
{
dlog("[+] patch success [%s %s].", className, methodName)
}
else
{
dlog("[-] patch fail [%s %s].", className, methodName)
}
}
void func_hook_objc(const char* className, const char* methodName, void* replace, void** original)
{
auto addr = (void *)func_getObjcMethod(className, methodName);
if (!addr)
{
dlog("[-] can not found [%s %s].", className, methodName)
return;
}
if (RS_SUCCESS == DobbyHook(addr, replace, original))
{
dlog("[+] patch success [%s %s].", className, methodName)
}
else
{
dlog("[-] patch fail [%s %s].", className, methodName)
}
}
bool func_patch_data(void* addr, void *replace, int replace_size)
{
auto ret = CodePatch(addr, (uint8_t*)replace, replace_size);
return kMemoryOperationSuccess == ret;
}
bool func_check_version(const char *func_check_version)
{
// @autoreleasepool {
// NSString * version = [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *)kCFBundleVersionKey];
// return 0 == strcmp([version UTF8String], func_check_version);
// }
auto cls_NSBundle = (id)objc_getClass(xorstr_("NSBundle"));
if (!cls_NSBundle) {
dlog("[-] get NSBundle fail");
return false;
}
auto sel_mainBundle = sel_registerName(xorstr_("mainBundle"));
auto mainBundle = (id)objc_msgSend(cls_NSBundle, sel_mainBundle);
if (!mainBundle) {
dlog("[-] get mainBundle fail");
return false;
}
auto cls_NSString = (id)objc_getClass(xorstr_("NSString"));
auto sel_stringWithUTF8String = sel_registerName(xorstr_("stringWithUTF8String:"));
auto cls_kCFBundleVersionKey = (id)objc_msgSend(cls_NSString, sel_stringWithUTF8String, xorstr_("CFBundleVersion"));
auto sel_objectForInfoDictionaryKey = sel_registerName(xorstr_("objectForInfoDictionaryKey:"));
auto build_nsstring = objc_msgSend(mainBundle, sel_objectForInfoDictionaryKey, cls_kCFBundleVersionKey);
if (!build_nsstring) {
dlog("[-] get build_nsstring fail");
return false;
}
auto sel_UTF8String = sel_registerName(xorstr_("UTF8String"));
char* pCFBundleVersion = (char*)objc_msgSend(build_nsstring, sel_UTF8String);
dlog("[*] version: %s", pCFBundleVersion);
return 0 == strcmp(pCFBundleVersion, func_check_version);
}
void func_patch_libprl_shared_apps_dylib(char* image_base)
{
if (image_base)
{
#ifdef TARGET_ARCH_X64
{
// __text:000000000002ADA0 55 push rbp ; <--- patch return 0;
// __text:000000000002ADA1 48 89 E5 mov rbp, rsp
// __text:000000000002ADA4 41 57 push r15
// __text:000000000002ADA6 41 56 push r14
// __text:000000000002ADA8 41 55 push r13
// __text:000000000002ADAA 41 54 push r12
// __text:000000000002ADAC 53 push rbx
// __text:000000000002ADAD 48 81 EC D8 05 00 00 sub rsp, 5D8h
// __text:000000000002ADB4 48 8B 05 75 54 09 00 mov rax, cs:___stack_chk_guard_ptr
// __text:000000000002ADBB 48 8B 00 mov rax, [rax]
// __text:000000000002ADBE 48 89 45 D0 mov [rbp+var_30], rax
// __text:000000000002ADC2 E8 79 06 00 00 call sub_2B440
// __text:000000000002ADC7 E8 B4 99 03 00 call sub_64780
// __text:000000000002ADCC 85 C0 test eax, eax
// __text:000000000002ADCE 0F 84 AA 04 00 00 jz loc_2B27E
// __text:000000000002ADD4 C7 85 28 FA FF FF 90 01 00 00 mov [rbp+var_5D8], 190h
// __text:000000000002ADDE C7 85 2C FA FF FF E8 03 00 00 mov [rbp+var_5D4], 3E8h
// __text:000000000002ADE8 4C 8D 35 89 58 0A 00 lea r14, qword_D0678
// __text:000000000002ADEF 4C 8D BD 40 FE FF FF lea r15, [rbp+var_1C0]
// __text:000000000002ADF6 4C 8D 85 28 FA FF FF lea r8, [rbp+var_5D8]
// __text:000000000002ADFD BF 79 10 01 80 mov edi, 80011079h
// __text:000000000002AE02 BE 01 00 00 00 mov esi, 1
// __text:000000000002AE07 BA 01 00 00 00 mov edx, 1
// __text:000000000002AE0C 4C 89 F9 mov rcx, r15
// __text:000000000002AE0F 41 FF 16 call qword ptr [r14]
// __text:000000000002AE12 48 8D 9D 50 FA FF FF lea rbx, [rbp+var_5B0]
// __text:000000000002AE19 4C 8D 85 2C FA FF FF lea r8, [rbp+var_5D4]
// __text:000000000002AE20 BF 79 10 01 80 mov edi, 80011079h
// __text:000000000002AE25 31 F6 xor esi, esi
// __text:000000000002AE27 BA 01 00 00 00 mov edx, 1
// __text:000000000002AE2C 48 89 D9 mov rcx, rbx
// __text:000000000002AE2F 41 FF 16 call qword ptr [r14]
// __text:000000000002AE32 48 8B 3D 3F 2A 0A 00 mov rdi, cs:classRef_NSString ; id
// __text:000000000002AE39 4C 8B 35 78 15 0A 00 mov r14, cs:selRef_stringWithUTF8String_
// __text:000000000002AE40 4C 8B 2D 41 54 09 00 mov r13, cs:_objc_msgSend_ptr
// __text:000000000002AE47 4C 89 F6 mov rsi, r14 ; SEL
// __text:000000000002AE4A 48 89 DA mov rdx, rbx
uint8_t replace[] = OPCODE_RETURN_1;
if (func_patch_data(image_base + 0x2ada0, replace, sizeof(replace)))
{
dlog("[+] patch libprl_shared_apps.dylib 1 success.");
}
else
{
dlog("[-] patch libprl_shared_apps.dylib 1 fail.");
}
}
#endif
#ifdef TARGET_ARCH_ARM64
{
uint8_t replace[] = OPCODE_RETURN_1;
if (func_patch_data(image_base + 0x29308, replace, sizeof(replace)))
{
dlog("[+] patch libprl_shared_apps.dylib 1 success.");
}
else
{
dlog("[-] patch libprl_shared_apps.dylib 1 fail.");
}
}
#endif
}
}
int hook_PrlSrv_HasRestriction(
void* hServer,
int nRestrictionKey,
uint32_t* pbHasRestriction) {
if (*pbHasRestriction) {
*pbHasRestriction = 1;
return 1;
}
return 0;
}
int hook_PrlLic_IsValid(
void* hLicense,
uint32_t* pbValue) {
if (*pbValue) {
*pbValue = 1;
return 1;
}
return 0;
}
int hook_PrlLic_GetUserName(
void* hLicense,
char* sUserName,
uint32_t* pnUserNameBufLength) {
if (pnUserNameBufLength) {
if (!sUserName) {
*pnUserNameBufLength = 4;
return 6;
}
if (*pnUserNameBufLength >= 4) {
strcpy(sUserName, "Day");
return 0;
}
}
return 3;
}
void func_patch_ParallelsVirtualizationSDK(char* image_base, int i)
{
if (image_base)
{
char* image_name = (char*)_dyld_get_image_name(i);
// if (0 == DobbyGlobalOffsetTableReplace(image_name, xorstr_("PrlSrv_IsFeatureSupported"), (void*)hook_PrlSrv_IsFeatureSupported, nullptr)) {
// dlog("[+] hook PrlSrv_IsFeatureSupported success");
// } else {
// dlog("[+] hook PrlSrv_IsFeatureSupported fail");
// }
// if (0 == DobbyGlobalOffsetTableReplace(image_name, xorstr_("PrlSrvCfg_IsUsbSupported"), (void*)func_return_1, nullptr)) {
// dlog("[+] hook PrlSrvCfg_IsUsbSupported success");
// } else {
// dlog("[+] hook PrlSrvCfg_IsUsbSupported fail");
// }
// if (0 == DobbyGlobalOffsetTableReplace(image_name, xorstr_("PrlSrvCfg_IsVtdSupported"), (void*)func_return_1, nullptr)) {
// dlog("[+] hook PrlSrvCfg_IsVtdSupported success");
// } else {
// dlog("[+] hook PrlSrvCfg_IsVtdSupported fail");
// }
if (0 == DobbyGlobalOffsetTableReplace(image_name, xorstr_("PrlSrv_HasRestriction"), (void*)hook_PrlSrv_HasRestriction, nullptr)) {
dlog("[+] hook PrlSrv_HasRestriction success");
} else {
dlog("[+] hook PrlSrv_HasRestriction fail");
}
if (0 == DobbyGlobalOffsetTableReplace(image_name, xorstr_("PrlSrv_SendProblemReport "), (void*)func_return_0, nullptr)) {
dlog("[+] hook PrlSrv_SendProblemReport success");
} else {
dlog("[+] hook PrlSrv_SendProblemReport fail");
}
if (0 == DobbyGlobalOffsetTableReplace(image_name, xorstr_("PrlSrv_GetProblemReport"), (void*)func_return_0, nullptr)) {
dlog("[+] hook PrlSrv_GetProblemReport success");
} else {
dlog("[+] hook PrlSrv_GetProblemReport fail");
}
if (0 == DobbyGlobalOffsetTableReplace(image_name, xorstr_("PrlSrv_GetPackedProblemReport"), (void*)func_return_0, nullptr)) {
dlog("[+] hook PrlSrv_GetPackedProblemReport success");
} else {
dlog("[+] hook PrlSrv_GetPackedProblemReport fail");
}
if (0 == DobbyGlobalOffsetTableReplace(image_name, xorstr_("PrlReport_Send"), (void*)func_return_0, nullptr)) {
dlog("[+] hook PrlReport_Send success");
} else {
dlog("[+] hook PrlReport_Send fail");
}
if (0 == DobbyGlobalOffsetTableReplace(image_name, xorstr_("PrlLic_GetUserName"), (void*)hook_PrlLic_GetUserName, nullptr)) {
dlog("[+] hook PrlLic_GetUserName success");
} else {
dlog("[+] hook PrlLic_GetUserName fail");
}
if (0 == DobbyGlobalOffsetTableReplace(image_name, xorstr_("PrlLic_GetCompanyName"), (void*)hook_PrlLic_GetUserName, nullptr)) {
dlog("[+] hook PrlLic_GetCompanyName success");
} else {
dlog("[+] hook PrlLic_GetCompanyName fail");
}
}
}
void func_patch_dylibs()
{
for (int i = 0; i < _dyld_image_count(); ++i)
{
const char *name = _dyld_get_image_name(i);
if (str_ends_with(name, xorstr_("libprl_shared_apps.dylib")))
{
dlog("[*] patch %s start.", name);
func_patch_libprl_shared_apps_dylib((char*)_dyld_get_image_header(i));
dlog("[*] patch %s over.", name);
}
else if (str_ends_with(name, xorstr_("ParallelsVirtualizationSDK")))
{
dlog("[*] patch %s start.", name);
func_patch_ParallelsVirtualizationSDK((char*)_dyld_get_image_header(i), i);
dlog("[*] patch %s over.", name);
}
else if (str_ends_with(name, xorstr_("LicenseServices")))
{
dlog("[*] patch %s start.", name);
uint8_t replace0[] = OPCODE_RETURN_0;
uint8_t replace1[] = OPCODE_RETURN_1;
func_patch_objc(xorstr_("LocalPdInfo"), xorstr_("isLicenseValid"), replace1, sizeof(replace1));
func_patch_objc(xorstr_("LocalPdInfo"), xorstr_("isBusinessEdition"), replace1, sizeof(replace1));
func_patch_objc(xorstr_("LICLicenseInfo"), xorstr_("isBusiness"), replace1, sizeof(replace1));
func_patch_objc(xorstr_("LICLicenseInfo"), xorstr_("rawStatus"), replace0, sizeof(replace0));
func_patch_objc(xorstr_("LICLicenseInfo"), xorstr_("toolset"), replace1, sizeof(replace1));
func_patch_objc(xorstr_("LocalPdInfo"), xorstr_("reinit"), replace0, sizeof(replace0));
// func_hook_objc(xorstr_("LocalPdInfo"), xorstr_("isLicenseValid"), (void *)func_return_1, nullptr);
// func_hook_objc(xorstr_("LocalPdInfo"), xorstr_("isBusinessEdition"), (void *)func_return_1, nullptr);
// func_hook_objc(xorstr_("LICLicenseInfo"), xorstr_("isBusiness"), (void *)func_return_1, nullptr);
// func_hook_objc(xorstr_("LICLicenseInfo"), xorstr_("rawStatus"), (void *)func_return_0, nullptr);
// func_hook_objc(xorstr_("LICLicenseInfo"), xorstr_("toolset"), (void *)func_return_1, nullptr);
// func_hook_objc(xorstr_("LocalPdInfo"), xorstr_("reinit"), (void *)func_return_0, nullptr);
dlog("[*] patch %s over.", name);
}
else if (str_ends_with(name, xorstr_("LicenseViews")))
{
dlog("[*] patch %s start.", name);
uint8_t replace0[] = OPCODE_RETURN_0;
func_patch_objc(xorstr_("GeoIPLocator"), xorstr_("locate:"), replace0, sizeof(replace0));
// func_hook_objc(xorstr_("GeoIPLocator"), xorstr_("locate:"), (void *)func_return_0, nullptr);
dlog("[*] patch %s over.", name);
}
else if (str_ends_with(name, xorstr_("ToolboxCommon")))
{
dlog("[*] patch %s start.", name);
uint8_t replace0[] = OPCODE_RETURN_0;
uint8_t replace1[] = OPCODE_RETURN_1;
func_patch_objc(xorstr_("LocalPdInfo"), xorstr_("sendCEP"), replace0, sizeof(replace0));
func_hook_objc(xorstr_("CEPLog"), xorstr_("setCEPDisabled:"), (void *)func_hook_CEPLog_setCEPDisabled, (void**)&vars_g_CEPLog_setCEPDisabled);
func_hook_objc(xorstr_("CEPLog"), xorstr_("setCEPSentAfterDisabling:"), (void *)func_hook_CEPLog_setCEPSentAfterDisabling, (void**)&vars_g_CEPLog_setCEPSentAfterDisabling);
// func_patch_objc(xorstr_("CEPLicenseInfo"), xorstr_("isTrial"), replace0, sizeof(replace0));
// func_patch_objc(xorstr_("CEPLicenseInfo"), xorstr_("isBonus"), replace0, sizeof(replace0));
// func_patch_objc(xorstr_("CEPLicenseInfo"), xorstr_("isReferralBonus"), replace0, sizeof(replace0));
// func_patch_objc(xorstr_("CEPLicenseInfo"), xorstr_("isPDSubscription"), replace0, sizeof(replace0));
// func_patch_objc(xorstr_("CEPLicenseInfo"), xorstr_("isBusiness"), replace1, sizeof(replace1));
// func_patch_objc(xorstr_("CEPLicenseInfo"), xorstr_("isLocalPDBusiness"), replace0, sizeof(replace0));
// func_patch_objc(xorstr_("CEPLicenseInfo"), xorstr_("isLocalPD"), replace0, sizeof(replace0));
// func_patch_objc(xorstr_("CEPLicenseInfo"), xorstr_("isAutoRenewable"), replace0, sizeof(replace0));
// func_patch_objc(xorstr_("CEPLicenseInfo"), xorstr_("isLicenseExpired"), replace0, sizeof(replace0));
// func_patch_objc(xorstr_("CEPLicenseInfo"), xorstr_("isNoLicensePresented"), replace1, sizeof(replace1));
// func_hook_objc(xorstr_("CEPLog"), xorstr_("sendCEP"), (void *)func_return_0, nullptr);
// func_hook_objc(xorstr_("CEPLog"), xorstr_("setCEPDisabled:"), (void *)func_hook_CEPLog_setCEPDisabled, (void**)&vars_g_CEPLog_setCEPDisabled);
// func_hook_objc(xorstr_("CEPLog"), xorstr_("setCEPSentAfterDisabling:"), (void *)func_hook_CEPLog_setCEPSentAfterDisabling, (void**)&vars_g_CEPLog_setCEPSentAfterDisabling);
// func_hook_objc(xorstr_("CEPLicenseInfo"), xorstr_("isTrial"), (void *)func_return_0, nullptr);
// func_hook_objc(xorstr_("CEPLicenseInfo"), xorstr_("isBonus"), (void *)func_return_0, nullptr);
// func_hook_objc(xorstr_("CEPLicenseInfo"), xorstr_("isReferralBonus"), (void *)func_return_0, nullptr);
// func_hook_objc(xorstr_("CEPLicenseInfo"), xorstr_("isPDSubscription"), (void *)func_return_0, nullptr);
// func_hook_objc(xorstr_("CEPLicenseInfo"), xorstr_("isBusiness"), (void *)func_return_1, nullptr);
// func_hook_objc(xorstr_("CEPLicenseInfo"), xorstr_("isLocalPDBusiness"), (void *)func_return_0, nullptr);
// func_hook_objc(xorstr_("CEPLicenseInfo"), xorstr_("isLocalPD"), (void *)func_return_0, nullptr);
// func_hook_objc(xorstr_("CEPLicenseInfo"), xorstr_("isAutoRenewable"), (void *)func_return_0, nullptr);
// func_hook_objc(xorstr_("CEPLicenseInfo"), xorstr_("isLicenseExpired"), (void *)func_return_0, nullptr);
// func_hook_objc(xorstr_("CEPLicenseInfo"), xorstr_("isNoLicensePresented"), (void *)func_return_1, nullptr);
// func_hook_objc("CEPLicenseInfo", "expirationDate", (void *)func_return_0, nullptr);
dlog("[*] patch %s over.", name);
}
}
}
void func_patch_Parallels_Toolbox()
{
if (!func_check_version(xorstr_("4410")))
{
dlog("[-] unsupport version.");
exit(0);
}
uint8_t replace[] = OPCODE_RETURN_1;
func_hook_objc(xorstr_("ReportCollectorWithUI"), xorstr_("sendReport:parent:"), (void *)func_return_0, nullptr);
func_hook_objc(xorstr_("ReportCollector"), xorstr_("grabScreenshots"), (void *)func_return_0, nullptr);
func_hook_objc(xorstr_("ReportContactInfoWindowController"), xorstr_("onSendPress:"), (void *)func_return_0, nullptr);
}
void func_patch_prl_vm_app()
{
auto image_base = (char*)_dyld_get_image_header(0);
if (image_base)
{
#ifdef TARGET_ARCH_X64
{
// __text:000000010000CD70 E8 8B 9C 9A 00 call sub_1009B6A00
// __text:000000010000CD75 45 84 E4 test r12b, r12b
// __text:000000010000CD78 74 5B jz short loc_10000CDD5 ; <--- patch
// __text:000000010000CD7A 48 8D 05 EF FA 03 01 lea rax, qword_10104C870
// __text:000000010000CD81 48 8B 18 mov rbx, [rax]
// __text:000000010000CD84 0F 57 C0 xorps xmm0, xmm0
// __text:000000010000CD87 0F 29 45 A0 movaps xmmword ptr [rbp+var_60], xmm0
// __text:000000010000CD8B 48 C7 45 B0 00 00 00 00 mov [rbp+var_50], 0
// __text:000000010000CD93 48 8D BD 78 FF FF FF lea rdi, [rbp+var_88]
// __text:000000010000CD9A E8 31 B3 03 00 call sub_1000480D0
// __text:000000010000CD9F 48 8D 55 A0 lea rdx, [rbp+var_60]
// __text:000000010000CDA3 48 8D 8D 78 FF FF FF lea rcx, [rbp+var_88]
// __text:000000010000CDAA 48 89 DF mov rdi, rbx
// __text:000000010000CDAD BE 79 10 01 80 mov esi, 80011079h ; <--- find
uint8_t replace[] = { 0xEB };
if (func_patch_data(image_base + 0xCD78, replace, sizeof(replace)))
{
dlog("[+] patch prl_vm_app 1 success.");
}
else
{
dlog("[-] patch prl_vm_app 1 fail.");
}
}
// patch dlopen bGliQ29uZmlndXJlcjY0LmR5bGli -> libConfigurer64.dylib
{
uint8_t replace[] = OPCODE_RETURN_0;
if (func_patch_data(image_base + 0x12780, replace, sizeof(replace)))
{
dlog("[+] patch prl_vm_app 2 success.");
}
else
{
dlog("[-] patch prl_vm_app 2 fail.");
}
}
#endif
#ifdef TARGET_ARCH_ARM64
{
// __text:000000010000E2C8 6B 66 22 94 BL sub_1008A7C74
// __text:000000010000E2CC 97 02 00 34 CBZ W23, loc_10000E31C ; <--- patch
// __text:000000010000E2D0 08 65 00 D0 ADRP X8, #qword_100CB0020@PAGE
// __text:000000010000E2D4 1F 20 03 D5 NOP
// __text:000000010000E2D8 15 11 40 F9 LDR X21, [X8,#qword_100CB0020@PAGEOFF]
// __text:000000010000E2DC FF 7F 03 A9 STP XZR, XZR, [SP,#0x90+var_60]
// __text:000000010000E2E0 FF 23 00 F9 STR XZR, [SP,#0x90+var_50]
// __text:000000010000E2E4 E0 03 00 91 MOV X0, SP
// __text:000000010000E2E8 06 EE 00 94 BL sub_100049B00
// __text:000000010000E2EC E2 C3 00 91 ADD X2, SP, #0x90+var_60
// __text:000000010000E2F0 E3 03 00 91 MOV X3, SP
// __text:000000010000E2F4 E0 03 15 AA MOV X0, X21
// __text:000000010000E2F8 21 0F 82 52 21 00 B0 72 MOV W1, #0x80011079 ; <--- find
uint8_t replace[] = {0x14, 0x00, 0x00, 0x14};
if (func_patch_data(image_base + 0xE2CC, replace, sizeof(replace)))
{
dlog("[+] patch prl_vm_app 1 success.");
}
else
{
dlog("[-] patch prl_vm_app 1 fail.");
}
}
// patch dlopen bGliQ29uZmlndXJlcjY0LmR5bGli -> libConfigurer64.dylib
{
uint8_t replace[] = OPCODE_RETURN_0;
if (func_patch_data(image_base + 0x14014, replace, sizeof(replace)))
{
dlog("[+] patch prl_vm_app 2 success.");
}
else
{
dlog("[-] patch prl_vm_app 2 fail.");
}
}
#endif
}
}
void func_write_fake_license()
{
unsigned char fake_license_data[11699] = {
0xA1, 0xD0, 0xFA, 0xFA, 0xFA, 0xFA, 0xF8, 0xB6, 0xB3, 0xB9, 0xBF, 0xB4, 0xA9, 0xBF, 0xF8, 0xE0,
0xFA, 0xF8, 0xA1, 0x86, 0xF8, 0xB4, 0xBB, 0xB7, 0xBF, 0x86, 0xF8, 0xE0, 0xFA, 0x86, 0xF8, 0x8A,
0xA8, 0xB6, 0x8A, 0xA8, 0xB5, 0xEB, 0xED, 0x86, 0xF8, 0xF6, 0xFA, 0x86, 0xF8, 0xAF, 0xAF, 0xB3,
0xBE, 0x86, 0xF8, 0xE0, 0xFA, 0x86, 0xF8, 0x86, 0xF8, 0xF6, 0xFA, 0x86, 0xF8, 0xB6, 0xB3, 0xB9,
0x85, 0xB1, 0xBF, 0xA3, 0x86, 0xF8, 0xE0, 0xFA, 0x86, 0xF8, 0x86, 0xF8, 0xF6, 0xFA, 0x86, 0xF8,
0xAA, 0xA8, 0xB5, 0xBE, 0xAF, 0xB9, 0xAE, 0x85, 0xAC, 0xBF, 0xA8, 0xA9, 0xB3, 0xB5, 0xB4, 0x86,
0xF8, 0xE0, 0xFA, 0x86, 0xF8, 0xEB, 0xED, 0xF4, 0xF0, 0x86, 0xF8, 0xF6, 0xFA, 0x86, 0xF8, 0xB3,
0xA9, 0x85, 0xAF, 0xAA, 0xBD, 0xA8, 0xBB, 0xBE, 0xBF, 0x86, 0xF8, 0xE0, 0xFA, 0xBC, 0xBB, 0xB6,
0xA9, 0xBF, 0xF6, 0xFA, 0x86, 0xF8, 0xB3, 0xA9, 0x85, 0xA9, 0xAF, 0xB8, 0xB6, 0xB3, 0xB9, 0xBF,
0xB4, 0xA9, 0xBF, 0x86, 0xF8, 0xE0, 0xFA, 0xBC, 0xBB, 0xB6, 0xA9, 0xBF, 0xF6, 0xFA, 0x86, 0xF8,
0xAA, 0xBB, 0xA8, 0xBF, 0xB4, 0xAE, 0x85, 0xB1, 0xBF, 0xA3, 0x86, 0xF8, 0xE0, 0xFA, 0xB4, 0xAF,
0xB6, 0xB6, 0xF6, 0xFA, 0x86, 0xF8, 0xAA, 0xBB, 0xA8, 0xBF, 0xB4, 0xAE, 0x85, 0xAF, 0xAF, 0xB3,
0xBE, 0x86, 0xF8, 0xE0, 0xFA, 0xB4, 0xAF, 0xB6, 0xB6, 0xF6, 0xFA, 0x86, 0xF8, 0xB7, 0xBB, 0xB3,
0xB4, 0x85, 0xAA, 0xBF, 0xA8, 0xB3, 0xB5, 0xBE, 0x85, 0xBF, 0xB4, 0xBE, 0xA9, 0x85, 0xBB, 0xAE,
0x86, 0xF8, 0xE0, 0xFA, 0x86, 0xF8, 0xE8, 0xEA, 0xEE, 0xEF, 0xF7, 0xEA, 0xEF, 0xF7, 0xEA, 0xE3,
0xFA, 0xEA, 0xEA, 0xE0, 0xEA, 0xEA, 0xE0, 0xEA, 0xEA, 0x86, 0xF8, 0xF6, 0xFA, 0x86, 0xF8, 0xBD,
0xA8, 0xBB, 0xB9, 0xBF, 0x85, 0xAA, 0xBF, 0xA8, 0xB3, 0xB5, 0xBE, 0x85, 0xBF, 0xB4, 0xBE, 0xA9,
0x85, 0xBB, 0xAE, 0x86, 0xF8, 0xE0, 0xFA, 0x86, 0xF8, 0xE8, 0xEA, 0xEE, 0xEF, 0xF7, 0xEA, 0xEF,
0xF7, 0xEA, 0xE3, 0xFA, 0xEA, 0xEA, 0xE0, 0xEA, 0xEA, 0xE0, 0xEA, 0xEA, 0x86, 0xF8, 0xF6, 0xFA,
0x86, 0xF8, 0xB3, 0xA9, 0x85, 0xBB, 0xAF, 0xAE, 0xB5, 0x85, 0xA8, 0xBF, 0xB4, 0xBF, 0xAD, 0xBB,
0xB8, 0xB6, 0xBF, 0x86, 0xF8, 0xE0, 0xFA, 0xBC, 0xBB, 0xB6, 0xA9, 0xBF, 0xF6, 0xFA, 0x86, 0xF8,
0xB3, 0xA9, 0x85, 0xB4, 0xBC, 0xA8, 0x86, 0xF8, 0xE0, 0xFA, 0xBC, 0xBB, 0xB6, 0xA9, 0xBF, 0xF6,
0xFA, 0x86, 0xF8, 0xB3, 0xA9, 0x85, 0xB8, 0xBF, 0xAE, 0xBB, 0x86, 0xF8, 0xE0, 0xFA, 0xBC, 0xBB,
0xB6, 0xA9, 0xBF, 0xF6, 0xFA, 0x86, 0xF8, 0xB3, 0xA9, 0x85, 0xB9, 0xB2, 0xB3, 0xB4, 0xBB, 0x86,
0xF8, 0xE0, 0xFA, 0xBC, 0xBB, 0xB6, 0xA9, 0xBF, 0xF6, 0xFA, 0x86, 0xF8, 0xB3, 0xA9, 0x85, 0xA9,
0xAF, 0xA9, 0xAA, 0xBF, 0xB4, 0xBE, 0xBF, 0xBE, 0x86, 0xF8, 0xE0, 0xFA, 0xBC, 0xBB, 0xB6, 0xA9,
0xBF, 0xF6, 0xFA, 0x86, 0xF8, 0xB3, 0xA9, 0x85, 0xBF, 0xA2, 0xAA, 0xB3, 0xA8, 0xBF, 0xBE, 0x86,
0xF8, 0xE0, 0xFA, 0xBC, 0xBB, 0xB6, 0xA9, 0xBF, 0xF6, 0xFA, 0x86, 0xF8, 0xB3, 0xA9, 0x85, 0xBD,
0xA8, 0xBB, 0xB9, 0xBF, 0x85, 0xAA, 0xBF, 0xA8, 0xB3, 0xB5, 0xBE, 0x86, 0xF8, 0xE0, 0xFA, 0xBC,
0xBB, 0xB6, 0xA9, 0xBF, 0xF6, 0xFA, 0x86, 0xF8, 0xB3, 0xA9, 0x85, 0xAA, 0xAF, 0xA8, 0xB9, 0xB2,
0xBB, 0xA9, 0xBF, 0xBE, 0x85, 0xB5, 0xB4, 0xB6, 0xB3, 0xB4, 0xBF, 0x86, 0xF8, 0xE0, 0xFA, 0xBC,
0xBB, 0xB6, 0xA9, 0xBF, 0xF6, 0xFA, 0x86, 0xF8, 0xB6, 0xB3, 0xB7, 0xB3, 0xAE, 0x86, 0xF8, 0xE0,
0xFA, 0xEB, 0xEA, 0xF6, 0xFA, 0x86, 0xF8, 0xAF, 0xA9, 0xBB, 0xBD, 0xBF, 0x86, 0xF8, 0xE0, 0xFA,
0xEB, 0xF6, 0xFA, 0x86, 0xF8, 0xBF, 0xBE, 0xB3, 0xAE, 0xB3, 0xB5, 0xB4, 0x86, 0xF8, 0xE0, 0xFA,
0xE8, 0xF6, 0xFA, 0x86, 0xF8, 0xAA, 0xB6, 0xBB, 0xAE, 0xBC, 0xB5, 0xA8, 0xB7, 0x86, 0xF8, 0xE0,
0xFA, 0xE9, 0xF6, 0xFA, 0x86, 0xF8, 0xAA, 0xA8, 0xB5, 0xBE, 0xAF, 0xB9, 0xAE, 0x86, 0xF8, 0xE0,
0xFA, 0xED, 0xF6, 0xFA, 0x86, 0xF8, 0xB5, 0xBC, 0xBC, 0xB6, 0xB3, 0xB4, 0xBF, 0x86, 0xF8, 0xE0,
0xFA, 0xAE, 0xA8, 0xAF, 0xBF, 0xF6, 0xFA, 0x86, 0xF8, 0xB9, 0xAA, 0xAF, 0x85, 0xB6, 0xB3, 0xB7,
0xB3, 0xAE, 0x86, 0xF8, 0xE0, 0xFA, 0xE9, 0xE8, 0xF6, 0xFA, 0x86, 0xF8, 0xA8, 0xBB, 0xB7, 0x85,
0xB6, 0xB3, 0xB7, 0xB3, 0xAE, 0x86, 0xF8, 0xE0, 0xFA, 0xEB, 0xE9, 0xEB, 0xEA, 0xED, 0xE8, 0xF6,
0xFA, 0x86, 0xF8, 0xB2, 0xB5, 0xA9, 0xAE, 0xA9, 0x86, 0xF8, 0xE0, 0xFA, 0x81, 0xA1, 0x86, 0xF8,
0xB4, 0xBB, 0xB7, 0xBF, 0x86, 0xF8, 0xE0, 0xFA, 0x86, 0xF8, 0x9D, 0x9E, 0x8A, 0x88, 0x85, 0x92,
0x93, 0x9E, 0x9E, 0x9F, 0x94, 0x86, 0xF8, 0xF6, 0xFA, 0x86, 0xF8, 0xB2, 0xAD, 0x85, 0xB3, 0xBE,
0x86, 0xF8, 0xE0, 0xFA, 0x86, 0xF8, 0x86, 0xF8, 0xF6, 0xFA, 0x86, 0xF8, 0xAA, 0xA8, 0xB5, 0xBE,
0xAF, 0xB9, 0xAE, 0x85, 0xAC, 0xBF, 0xA8, 0xA9, 0xB3, 0xB5, 0xB4, 0x86, 0xF8, 0xE0, 0xFA, 0x86,
0xF8, 0x86, 0xF8, 0xF6, 0xFA, 0x86, 0xF8, 0xBB, 0xB9, 0xAE, 0xB3, 0xAC, 0xBB, 0xAE, 0xBF, 0xBE,
0x85, 0xBB, 0xAE, 0x86, 0xF8, 0xE0, 0xFA, 0x86, 0xF8, 0xE8, 0xEA, 0xE8, 0xEB, 0xF7, 0xEA, 0xEF,
0xF7, 0xEA, 0xE3, 0xFA, 0xEA, 0xEA, 0xE0, 0xEA, 0xEA, 0xE0, 0xEA, 0xEA, 0x86, 0xF8, 0xA7, 0x87,
0xF6, 0xFA, 0x86, 0xF8, 0xB3, 0xA9, 0x85, 0xAE, 0xA8, 0xB3, 0xBB, 0xB6, 0x86, 0xF8, 0xE0, 0xFA,
0xBC, 0xBB, 0xB6, 0xA9, 0xBF, 0xA7, 0xF8, 0xF6, 0xD0, 0xFA, 0xFA, 0xFA, 0xFA, 0xF8, 0xAA, 0xAF,
0xB8, 0xB6, 0xB3, 0xB9, 0x99, 0xBF, 0xA8, 0xAE, 0xA9, 0xF8, 0xE0, 0xFA, 0xF8, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0x98, 0x9F, 0x9D, 0x93, 0x94, 0xFA, 0x99, 0x9F, 0x88, 0x8E, 0x93, 0x9C, 0x93, 0x99,
0x9B, 0x8E, 0x9F, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0x86, 0xB4, 0x97, 0x93, 0x93, 0x9D, 0xAA, 0x9E,
0x99, 0x99, 0x98, 0x93, 0xA3, 0xBD, 0x9B, 0xAD, 0x93, 0x98, 0x9B, 0xBD, 0x93, 0x99, 0x9F, 0x9B,
0x9B, 0xAD, 0x9E, 0x8B, 0x83, 0x90, 0x91, 0xB5, 0x80, 0x93, 0xB2, 0xAC, 0xB9, 0x94, 0x9B, 0x8B,
0x9F, 0x96, 0x98, 0x8B, 0x9B, 0xAD, 0xBE, 0x9E, 0x9F, 0x96, 0x97, 0x9B, 0xB1, 0x9D, 0x9B, 0xEB,
0x8F, 0x9F, 0x98, 0xB2, 0x97, 0x99, 0x8F, 0xB6, 0x8F, 0xA2, 0x86, 0xB4, 0x9E, 0xA0, 0x9B, 0x94,
0x98, 0xBD, 0x94, 0x8C, 0x98, 0x9B, 0xB9, 0x97, 0x98, 0xB1, 0xEB, 0xAC, 0xB9, 0xE8, 0x94, 0xAC,
0xBE, 0xA0, 0x9F, 0xB0, 0x97, 0x99, 0x9F, 0x9D, 0x9B, 0xEB, 0x8F, 0x9F, 0x99, 0xBD, 0xAD, 0xBB,
0x8F, 0x9D, 0x9C, 0xA3, 0x83, 0x8D, 0xA2, 0xA9, 0x80, 0x8D, 0xA2, 0xA0, 0x93, 0x9F, 0xB6, 0x8B,
0x93, 0x9F, 0xB2, 0xAC, 0xB8, 0x9D, 0x88, 0xAA, 0xB8, 0xB7, 0xBE, 0xA0, 0x86, 0xB4, 0x93, 0x9F,
0xBE, 0xAE, 0x83, 0xB1, 0xBD, 0xA2, 0x9F, 0x9E, 0x9B, 0x95, 0x98, 0xBD, 0x94, 0x8C, 0x98, 0x9B,
0xA9, 0x97, 0x98, 0xEA, 0x88, 0xB6, 0xB9, 0xE8, 0xAE, 0xEA, 0xB8, 0xE9, 0x9B, 0xA2, 0x92, 0x8E,
0x9B, 0xB8, 0x98, 0xBD, 0x94, 0x8C, 0x98, 0x9B, 0x97, 0x97, 0x9C, 0x9C, 0x98, 0xB2, 0xB9, 0xB7,
0x9C, 0xA9, 0xB8, 0x9D, 0x8C, 0xA9, 0xB9, 0xA3, 0x98, 0x9F, 0x80, 0x82, 0x94, 0xA8, 0x86, 0xB4,
0xBE, 0x9D, 0xE3, 0xAD, 0x93, 0x9F, 0x94, 0x98, 0x97, 0x98, 0xEE, 0x82, 0x9E, 0x8E, 0x9F, 0xEE,
0x97, 0x8E, 0x93, 0xA3, 0x94, 0x9E, 0x9B, 0xEF, 0x97, 0x9E, 0x97, 0xEB, 0x94, 0xEB, 0xB5, 0x82,
0x9E, 0x8E, 0x93, 0xEE, 0x97, 0x8E, 0x9F, 0xAD, 0x94, 0xB0, 0x9B, 0xEF, 0x97, 0x9E, 0x97, 0xEB,
0x94, 0xEB, 0xB5, 0xAD, 0xBE, 0xA0, 0x9F, 0x96, 0x97, 0x9B, 0xB1, 0x9D, 0x9B, 0xEB, 0x8F, 0x9F,
0x86, 0xB4, 0x98, 0xB2, 0x97, 0x99, 0x8F, 0xB6, 0x8F, 0xA2, 0x9E, 0xA0, 0x9B, 0x94, 0x98, 0xBD,
0x94, 0x8C, 0x98, 0x9B, 0xB9, 0x8E, 0x98, 0xB1, 0xEB, 0xAC, 0xB9, 0xE8, 0x94, 0xAC, 0xBE, 0xA0,
0x9F, 0xB6, 0x97, 0x99, 0x97, 0x9D, 0x9B, 0xEB, 0x8F, 0x9F, 0x99, 0xB2, 0x97, 0xB9, 0x8F, 0x9D,
0x9C, 0xA3, 0x83, 0x8D, 0xA2, 0xA9, 0x80, 0x8D, 0xA2, 0xA0, 0x93, 0x9F, 0xB6, 0xAF, 0xBE, 0x9D,
0x8C, 0xA3, 0x86, 0xB4, 0xB8, 0xB7, 0x9C, 0xEA, 0xBB, 0x8D, 0xE3, 0xAF, 0x83, 0x8D, 0xAD, 0xBD,
0x88, 0xE8, 0xEB, 0xB3, 0x89, 0x9E, 0x9F, 0x8B, 0x97, 0x9B, 0xEE, 0x9D, 0x9B, 0xEB, 0x8F, 0x9F,
0x99, 0xA2, 0x97, 0x92, 0x88, 0x9D, 0x8C, 0xA0, 0xBB, 0xE9, 0x88, 0xAC, 0xB9, 0x9E, 0x9F, 0xBF,
0x97, 0x98, 0xAD, 0x9D, 0x9B, 0xEB, 0x8F, 0x9F, 0x9B, 0xA2, 0x97, 0x8C, 0x80, 0x9D, 0x8C, 0xA0,
0xBB, 0xE9, 0x88, 0xAC, 0x86, 0xB4, 0xB9, 0x99, 0xEF, 0xAD, 0x83, 0x82, 0x90, 0xB2, 0xB8, 0x9D,
0xA2, 0xB6, 0xB8, 0x92, 0x97, 0xAF, 0x83, 0xE8, 0xE3, 0xAE, 0x97, 0x93, 0x93, 0x98, 0x93, 0xB0,
0x9B, 0x94, 0x98, 0xBD, 0xB1, 0xAB, 0xB2, 0xB1, 0xB3, 0x9D, 0xE3, 0xAD, 0xEA, 0x98, 0x9B, 0x8B,
0x9F, 0x9C, 0x9B, 0x9B, 0x95, 0x99, 0x9B, 0x8B, 0xE2, 0x9B, 0x97, 0x93, 0x93, 0x98, 0x99, 0xBD,
0x91, 0x99, 0x9B, 0x8B, 0x9F, 0x9B, 0x86, 0xB4, 0xA0, 0xB5, 0x8C, 0x8A, 0x8A, 0xEC, 0xEA, 0xB5,
0x83, 0x8E, 0xB0, 0xA9, 0xAD, 0x97, 0xE2, 0xAC, 0xA9, 0x8D, 0xBD, 0xAA, 0x94, 0x95, 0x9C, 0xE3,
0x80, 0xA3, 0x98, 0xE9, 0xAD, 0x8F, 0xF5, 0xA9, 0x90, 0xBF, 0x83, 0xAE, 0xB7, 0xBF, 0x99, 0xF1,
0xEA, 0xBF, 0x8E, 0x8C, 0x9E, 0xAB, 0x83, 0xBC, 0x93, 0xE2, 0x8B, 0xAB, 0xE8, 0xF5, 0x9B, 0xB5,
0x9E, 0x96, 0xB2, 0x9F, 0x93, 0xBD, 0xEC, 0xB9, 0x86, 0xB4, 0xAC, 0xBE, 0xE2, 0xAC, 0x9D, 0x9E,
0x8F, 0xB7, 0x82, 0x8E, 0xAC, 0xB1, 0x82, 0xF1, 0xA8, 0xF5, 0xB8, 0x80, 0x99, 0x89, 0xE3, 0xB5,
0x88, 0xEC, 0xB5, 0xE9, 0x97, 0xE8, 0xB5, 0xAE, 0xA9, 0xBD, 0xAD, 0x97, 0xA0, 0xA9, 0x88, 0x8B,
0x8B, 0xBD, 0x95, 0x8D, 0xBC, 0xB4, 0xBD, 0xA3, 0x98, 0xE9, 0x8A, 0x8C, 0xB2, 0xEA, 0x8C, 0xF1,
0x9C, 0x97, 0xEC, 0xE2, 0x9E, 0xB5, 0x99, 0x80, 0x80, 0x9C, 0x86, 0xB4, 0x96, 0x89, 0x83, 0x8B,
0xE9, 0x9D, 0xB2, 0xAC, 0xED, 0x9B, 0x91, 0xE8, 0xEB, 0x97, 0xF5, 0xBD, 0xEE, 0x8E, 0xB9, 0x91,
0x9C, 0x83, 0xE9, 0xEA, 0xB4, 0xBD, 0xB9, 0xE3, 0xBB, 0xAC, 0x97, 0x90, 0xBF, 0x90, 0xEC, 0xB6,
0x89, 0x96, 0xA0, 0xAA, 0x9F, 0xA3, 0x8C, 0xEC, 0x83, 0xB1, 0x9E, 0xB8, 0x98, 0xEA, 0x8C, 0x98,
0xB9, 0x9B, 0x95, 0x89, 0xBF, 0xEA, 0x9B, 0xA3, 0x9B, 0x8F, 0x94, 0xEE, 0x86, 0xB4, 0xBB, 0xE3,
0xEF, 0xED, 0x8F, 0xAD, 0x88, 0xAE, 0xE8, 0xB2, 0x8C, 0xB4, 0xEF, 0xB1, 0x99, 0xA8, 0xEF, 0x9E,
0x8A, 0xB0, 0xBF, 0xEE, 0xAD, 0xEB, 0xA2, 0x82, 0xB4, 0x92, 0x93, 0xA2, 0xF1, 0x97, 0xB2, 0xA8,
0xB2, 0x9D, 0xBD, 0x8F, 0xA0, 0xEA, 0xA9, 0xAE, 0x8B, 0x82, 0xE8, 0x83, 0xAF, 0xEE, 0xBF, 0xE8,
0xF1, 0xB6, 0xAA, 0xA3, 0xEA, 0xA8, 0x98, 0x9F, 0x8F, 0xED, 0x92, 0x93, 0xAB, 0xBF, 0x86, 0xB4,
0xAA, 0x99, 0xAB, 0x8C, 0x89, 0xAD, 0x89, 0xBF, 0x9B, 0xBC, 0xA8, 0xBD, 0xB5, 0xB4, 0xAD, 0x8F,
0x9B, 0x98, 0xEB, 0xBE, 0x8E, 0x8A, 0x89, 0x80, 0xEF, 0xAD, 0x92, 0x98, 0x83, 0xB3, 0x82, 0xE9,
0xEA, 0xA2, 0xF1, 0x8F, 0xBB, 0x97, 0x89, 0xB9, 0x92, 0xB6, 0x92, 0xAF, 0x8A, 0x95, 0xA8, 0x8F,
0xA3, 0xEE, 0xB8, 0x89, 0xE8, 0xBF, 0xEF, 0xB7, 0x97, 0x88, 0xF1, 0x9C, 0x8D, 0x9D, 0xB2, 0xE3,
0x86, 0xB4, 0xAC, 0xE9, 0xB5, 0x94, 0x98, 0x88, 0x97, 0xB2, 0x96, 0x8A, 0x90, 0x9D, 0xE3, 0x83,
0x93, 0xAB, 0xAF, 0x9D, 0x9F, 0xEE, 0xAE, 0xAD, 0x93, 0x9E, 0x9B, 0x8B, 0x9B, 0x98, 0xB5, 0xEE,
0x93, 0x99, 0x95, 0xA0, 0x99, 0x99, 0x9B, 0xB0, 0xB9, 0xAD, 0x9E, 0x9B, 0x83, 0x9E, 0x8C, 0x88,
0xEA, 0x8E, 0x9B, 0x8B, 0x92, 0xF5, 0x98, 0x9B, 0x93, 0xAD, 0x9B, 0x9E, 0x9B, 0x95, 0x98, 0xBD,
0x94, 0x8C, 0x86, 0xB4, 0x92, 0x8B, 0xE2, 0x98, 0x9B, 0xBC, 0xE2, 0x9F, 0x98, 0x9B, 0x97, 0x99,
0x98, 0xEE, 0x9B, 0xAD, 0x92, 0x8B, 0x83, 0x9E, 0x8C, 0x88, 0xEA, 0x95, 0x98, 0x98, 0x83, 0x9F,
0x9C, 0x9D, 0xEB, 0xB8, 0xB3, 0x82, 0xAD, 0x89, 0xB5, 0x9E, 0xEE, 0x90, 0xAD, 0xB0, 0x99, 0xB4,
0xAB, 0xED, 0xB1, 0xAB, 0x8F, 0xE2, 0xBC, 0xBD, 0x82, 0x94, 0xAC, 0xE8, 0x97, 0x98, 0xE2, 0x9D,
0x9B, 0xEB, 0x8F, 0xBE, 0x86, 0xB4, 0x93, 0xAD, 0x8B, 0x83, 0x97, 0x98, 0xBB, 0x9B, 0x9C, 0x9B,
0x96, 0xB1, 0xA0, 0xBC, 0x96, 0xEB, 0x9D, 0xB2, 0x8D, 0x9E, 0xB8, 0xBC, 0x99, 0xA8, 0xA8, 0xAD,
0x8B, 0x88, 0xA2, 0x88, 0xBC, 0xEF, 0xE8, 0x9F, 0xA3, 0x8A, 0x97, 0x9F, 0x9F, 0x9D, 0x99, 0x99,
0xA9, 0x9D, 0x9B, 0x8B, 0x8F, 0x9C, 0x98, 0xAD, 0x9F, 0x98, 0x98, 0x9E, 0x8F, 0xAD, 0x97, 0xA0,
0x9B, 0xA2, 0x98, 0xBD, 0xBD, 0xA8, 0x86, 0xB4, 0x98, 0xBD, 0x9F, 0x9C, 0x98, 0x8B, 0xB9, 0xAD,
0x9B, 0xB5, 0x83, 0xB6, 0xBB, 0x92, 0x88, 0xEA, 0xB9, 0x9E, 0xB5, 0xAC, 0x96, 0xE9, 0xBE, 0xE9,
0xBE, 0xA3, 0xEF, 0xAD, 0x83, 0x82, 0x90, 0xB2, 0xB8, 0x9D, 0xA2, 0xB6, 0xB8, 0x92, 0x97, 0xAF,
0x83, 0xE8, 0xE3, 0xAE, 0x96, 0xE8, 0x94, 0xB2, 0x96, 0xE9, 0x98, 0xB1, 0x82, 0xE8, 0x94, 0xB2,
0x96, 0xB4, 0x98, 0xB6, 0xB8, 0x8E, 0x9B, 0xE8, 0x86, 0xB4, 0x98, 0xBD, 0x94, 0x8C, 0x92, 0x88,
0xE2, 0x9F, 0x96, 0xA0, 0x9B, 0xAE, 0x97, 0x99, 0xAF, 0xBD, 0x91, 0xBB, 0x9B, 0xB4, 0xB2, 0xB3,
0x8C, 0xB5, 0xBE, 0x92, 0x88, 0xAD, 0x95, 0xB3, 0xE2, 0xAC, 0xBE, 0xE9, 0xBE, 0xE9, 0x96, 0xB4,
0x98, 0xB2, 0xB9, 0xB7, 0x9C, 0xA9, 0xB8, 0x9D, 0x8C, 0xA9, 0xB9, 0xA3, 0xEF, 0xB0, 0xB8, 0xE8,
0xEA, 0xAC, 0x83, 0xE8, 0x9F, 0xAC, 0xB9, 0x9D, 0x88, 0xBC, 0x86, 0xB4, 0x83, 0xE8, 0x9F, 0xAF,
0x83, 0xE9, 0x90, 0xA9, 0x97, 0x93, 0x93, 0x98, 0x90, 0xBD, 0x83, 0x9E, 0x8C, 0x88, 0xEA, 0xBD,
0x98, 0x93, 0x93, 0x98, 0x92, 0x8E, 0x99, 0x99, 0x9B, 0x88, 0xB1, 0xAD, 0xBD, 0xBB, 0xEA, 0x9D,
0x9E, 0xB3, 0xA9, 0x9D, 0x9B, 0x8B, 0x8B, 0x98, 0xBD, 0xB9, 0xAD, 0xED, 0xBD, 0xE9, 0xEA, 0x99,
0x9B, 0xBD, 0x9F, 0x98, 0x97, 0x93, 0x9D, 0xBB, 0x97, 0x9E, 0xB1, 0x9D, 0x86, 0xB4, 0x99, 0x99,
0xA9, 0x9D, 0x9B, 0x8B, 0x8F, 0x9C, 0x98, 0xAD, 0x93, 0x98, 0x9C, 0xB3, 0xEB, 0xB5, 0xBE, 0x92,
0x88, 0xAD, 0x95, 0xB3, 0xE2, 0xAC, 0x83, 0xE8, 0x9F, 0xAF, 0xB9, 0x9D, 0x9C, 0xA3, 0x83, 0x8D,
0xA2, 0xA9, 0x80, 0x8D, 0xA2, 0xA0, 0x96, 0xB7, 0xEF, 0xB6, 0xBE, 0x99, 0xE3, 0xB0, 0x83, 0x89,
0xE3, 0xAD, 0x83, 0x82, 0x90, 0xB2, 0xB8, 0x9D, 0xA2, 0xB6, 0xB8, 0x92, 0x94, 0xBC, 0x86, 0xB4,
0x83, 0xE9, 0x98, 0xA0, 0x96, 0xB7, 0xB2, 0xEA, 0xB8, 0x8D, 0xAD, 0xAD, 0x82, 0x8B, 0x83, 0x93,
0x91, 0xAD, 0x83, 0x98, 0x98, 0x8B, 0x8F, 0x92, 0x9B, 0xBD, 0x93, 0xAD, 0x8F, 0x8E, 0x9B, 0xBC,
0x9D, 0xB2, 0xB2, 0x8B, 0x83, 0x82, 0x90, 0xB2, 0xB8, 0x9D, 0xA2, 0xB6, 0xB8, 0x92, 0x97, 0xBD,
0x89, 0x9D, 0xE3, 0xA9, 0x80, 0x9D, 0xB6, 0xAF, 0x80, 0xE9, 0x97, 0xA9, 0x93, 0x9D, 0xA2, 0xEA,
0x86, 0xB4, 0x80, 0x99, 0xEE, 0xAD, 0x9B, 0xAD, 0x93, 0x98, 0x9B, 0x88, 0xB5, 0xAF, 0x88, 0x82,
0xB2, 0xEA, 0x80, 0x82, 0x90, 0xAF, 0x83, 0x8D, 0xAD, 0xBD, 0x8B, 0xB7, 0x9C, 0xA0, 0xBB, 0x8D,
0x97, 0xBD, 0x8B, 0xE8, 0x8C, 0xA3, 0xBE, 0x9D, 0xB6, 0xB7, 0xBB, 0x8D, 0x94, 0xB2, 0xBE, 0x9D,
0xE3, 0xAF, 0x93, 0x9C, 0x98, 0xA3, 0x83, 0x8D, 0x94, 0xEA, 0xBB, 0x8D, 0x94, 0xB6, 0x93, 0x9C,
0x94, 0xEA, 0x86, 0xB4, 0x83, 0x82, 0x88, 0xB6, 0xB8, 0x8D, 0x8C, 0xAF, 0xBE, 0x9E, 0x98, 0xB4,
0x98, 0xBD, 0xEE, 0xA8, 0x98, 0xBD, 0x9F, 0x9F, 0x9B, 0x83, 0x92, 0x97, 0x95, 0xEE, 0x94, 0xE3,
0x9B, 0xBD, 0x90, 0xB7, 0x9B, 0xA0, 0x98, 0x8C, 0x97, 0x9C, 0x97, 0x9D, 0x99, 0x99, 0xA9, 0x9D,
0x9B, 0x8B, 0x8F, 0x9C, 0x98, 0xAD, 0x93, 0x99, 0x97, 0x9F, 0xB9, 0xAD, 0x92, 0xA2, 0xB5, 0x83,
0x8F, 0x9D, 0x9C, 0xA3, 0x86, 0xB4, 0x83, 0x8D, 0xA2, 0xA9, 0x80, 0x8D, 0xA2, 0xA0, 0x93, 0x9F,
0xB2, 0xAC, 0xB8, 0x9D, 0x88, 0xAA, 0xB8, 0xB7, 0xBE, 0xA0, 0x96, 0x99, 0x98, 0xA9, 0xBE, 0x9D,
0x8B, 0xAF, 0x97, 0x9B, 0x97, 0x99, 0x9B, 0x8B, 0x9F, 0xBB, 0x90, 0x9C, 0x98, 0xB2, 0xB9, 0xB7,
0x9C, 0xA9, 0xB8, 0x9D, 0x8C, 0xA9, 0xB9, 0xA3, 0x98, 0x9F, 0x80, 0x82, 0x94, 0xA8, 0xBE, 0x9D,
0xE3, 0xAD, 0x93, 0x9F, 0x94, 0xB6, 0x86, 0xB4, 0xB9, 0xB4, 0x88, 0xAA, 0x80, 0xB7, 0xB6, 0xB0,
0x83, 0x82, 0x88, 0xB6, 0x93, 0x9C, 0x98, 0xAC, 0xB8, 0x9D, 0xB6, 0xB0, 0xBF, 0x8E, 0x9B, 0xA3,
0x98, 0xBD, 0x94, 0x8C, 0x92, 0x88, 0x9F, 0x9F, 0x91, 0xA0, 0x9B, 0xAA, 0xBD, 0xB2, 0x8C, 0xB1,
0x80, 0x82, 0x94, 0xA8, 0xBE, 0x9D, 0xE3, 0xAD, 0x96, 0xB4, 0x98, 0xB2, 0xB9, 0xB7, 0x9C, 0xA9,
0xB8, 0x9D, 0x8C, 0xA9, 0xB9, 0xA3, 0xEF, 0xB0, 0x86, 0xB4, 0xB8, 0xE8, 0xE8, 0x99, 0x9F, 0x9D,
0xEB, 0xEF, 0x96, 0xB4, 0x98, 0xB2, 0xB9, 0xB7, 0x9C, 0xA9, 0xB8, 0x9D, 0x8C, 0xA9, 0xB9, 0xA3,
0xEF, 0xB0, 0xB8, 0xE8, 0xEA, 0xAD, 0x9E, 0x8B, 0x83, 0x90, 0x91, 0xB5, 0x80, 0x93, 0xB2, 0xAC,
0xB9, 0x94, 0x9B, 0x8B, 0x9F, 0x96, 0x98, 0x8B, 0x9B, 0x9E, 0xBD, 0xBD, 0x93, 0x98, 0x9B, 0x93,
0x8C, 0xB5, 0x8C, 0xAC, 0xA2, 0xAD, 0x97, 0x90, 0x96, 0xBB, 0x86, 0xB4, 0xAE, 0xA9, 0xB2, 0xB5,
0xBB, 0xBF, 0xBB, 0xEB, 0xB8, 0xAB, 0xA9, 0xB4, 0x9E, 0xE8, 0x9C, 0x8F, 0xEB, 0xA8, 0xF5, 0x9C,
0xB5, 0x8B, 0xA3, 0xEB, 0xB4, 0xAA, 0xEF, 0xB3, 0xBC, 0x91, 0x8B, 0xED, 0xBC, 0xAC, 0x9E, 0xA8,
0xF1, 0xA0, 0xE2, 0xBD, 0x83, 0xEA, 0xB5, 0x91, 0x9E, 0xA8, 0x95, 0xB8, 0x88, 0xB9, 0x83, 0x8E,
0xBF, 0xB3, 0x88, 0xBC, 0x89, 0x9D, 0x9D, 0xEB, 0x8E, 0xA3, 0x82, 0x8D, 0x86, 0xB4, 0x94, 0xBC,
0x83, 0xE3, 0xB4, 0xB6, 0xBD, 0xB8, 0x96, 0x90, 0x95, 0xED, 0xBC, 0x97, 0xEF, 0xAC, 0xAA, 0xAB,
0xAC, 0xB0, 0xEF, 0x8D, 0x8B, 0x90, 0x94, 0xBB, 0x8F, 0xB0, 0x93, 0xA0, 0xA2, 0x94, 0xB9, 0xB3,
0xAE, 0x94, 0xB4, 0xED, 0xAE, 0xBF, 0x9D, 0xEF, 0xB9, 0xEF, 0xF5, 0x99, 0xEA, 0xBC, 0xB1, 0xB3,
0x8D, 0xBF, 0x9E, 0x92, 0xE3, 0xAE, 0xEA, 0xEB, 0xBD, 0x96, 0x88, 0xAA, 0xAC, 0x95, 0x86, 0xB4,
0xB1, 0xEF, 0x98, 0xEE, 0xA0, 0x9E, 0xBC, 0xE2, 0x9B, 0x92, 0xB8, 0xB1, 0xB0, 0xA8, 0xBC, 0xED,
0xE9, 0xAD, 0xB2, 0x80, 0xA0, 0xB3, 0xAF, 0x8A, 0xB2, 0xB8, 0xA3, 0x99, 0xA3, 0xA2, 0xB0, 0xAC,
0xBE, 0xB4, 0x8C, 0xB5, 0xAF, 0x8A, 0xEF, 0xB5, 0x8A, 0xAD, 0x98, 0xE3, 0x97, 0x83, 0x8B, 0x96,
0xA3, 0xA2, 0x8B, 0x97, 0xB6, 0x8C, 0xAC, 0x83, 0xB6, 0xEA, 0x98, 0x99, 0xEE, 0xAD, 0x98, 0xB3,
0x86, 0xB4, 0xB1, 0xB1, 0xBB, 0xA3, 0xB7, 0xAB, 0x8D, 0x98, 0x93, 0xA2, 0xBF, 0x91, 0x98, 0x8D,
0x9E, 0x9F, 0x8B, 0xA3, 0x9D, 0xAC, 0x8C, 0xBB, 0xB8, 0xA9, 0x95, 0xB5, 0xEB, 0x91, 0xA8, 0xB5,
0xEC, 0xA2, 0xB1, 0xEF, 0xA9, 0xEC, 0x89, 0xAF, 0xAF, 0xAE, 0x97, 0x9F, 0xEC, 0x96, 0xE3, 0xED,
0xB1, 0xB7, 0x8B, 0xBB, 0x88, 0x9D, 0xB8, 0x95, 0xAC, 0xB8, 0x99, 0x80, 0xE3, 0xEF, 0xB4, 0xB3,
0x9F, 0x92, 0x86, 0xB4, 0xBF, 0x91, 0xAF, 0xBB, 0xF5, 0xEB, 0x94, 0xBD, 0xAE, 0xE3, 0x8F, 0xE9,
0x83, 0xEC, 0xBC, 0x8A, 0xAD, 0x8A, 0xEC, 0xBD, 0x8C, 0xBB, 0x8B, 0xBD, 0xB6, 0x80, 0x98, 0xB9,
0x8A, 0xBD, 0xA9, 0xEF, 0xF1, 0xEE, 0xBB, 0xF1, 0xB2, 0xBE, 0xF5, 0xE2, 0xBD, 0x8A, 0x80, 0xF1,
0x82, 0xB8, 0x8C, 0x82, 0xA9, 0x91, 0xEC, 0xE2, 0xB0, 0xE3, 0xBF, 0x8F, 0x97, 0xAF, 0xB2, 0x97,
0xB5, 0x9C, 0xBE, 0x91, 0x86, 0xB4, 0xB9, 0xBB, 0x94, 0xBF, 0xB0, 0xB4, 0x8B, 0xAE, 0xE9, 0x99,
0xAC, 0xA9, 0xB4, 0xAA, 0xED, 0xB5, 0xB2, 0x89, 0xB5, 0x88, 0x83, 0xE9, 0xA8, 0x91, 0xBE, 0xBC,
0x9D, 0xEA, 0x93, 0xBE, 0xA3, 0xF5, 0xEE, 0x92, 0x90, 0x99, 0xB3, 0x99, 0x99, 0x95, 0xB4, 0x9E,
0x9E, 0xAA, 0x8A, 0x82, 0xAC, 0xAB, 0x8B, 0xAB, 0x9B, 0xB5, 0xEA, 0xB9, 0xAD, 0x9F, 0xB2, 0xB8,
0x89, 0xB0, 0x93, 0xEC, 0xEC, 0x83, 0x86, 0xB4, 0xA0, 0xBE, 0xAE, 0x9F, 0xB1, 0x99, 0x9C, 0xAA,
0x8D, 0xA0, 0xE8, 0xE9, 0xA8, 0x9D, 0x9F, 0xB6, 0x8B, 0x97, 0xA2, 0x93, 0xA9, 0xEC, 0xB5, 0xB0,
0xAD, 0x91, 0xF5, 0xBD, 0xAF, 0xEF, 0xF1, 0xA9, 0x90, 0xAA, 0x9F, 0xF1, 0xB6, 0xED, 0x8B, 0xAA,
0x82, 0xBC, 0x99, 0x93, 0xB2, 0xA8, 0xA3, 0xAB, 0x9D, 0xAB, 0x88, 0x92, 0xAA, 0xBE, 0xB1, 0x89,
0x9E, 0xAA, 0xED, 0x8A, 0xB9, 0xEB, 0x90, 0xA8, 0x86, 0xB4, 0x90, 0x97, 0xAA, 0xA3, 0x94, 0xB2,
0x9E, 0x9F, 0x93, 0xEA, 0x8B, 0xB0, 0x8A, 0x82, 0xB1, 0x89, 0xB4, 0x97, 0x8C, 0xA2, 0x97, 0x8B,
0xAF, 0x92, 0x8F, 0xB3, 0xBE, 0x9B, 0x88, 0xA8, 0xEE, 0xE9, 0x95, 0xE9, 0xE8, 0xA3, 0xAE, 0xEA,
0x8C, 0x9E, 0xF5, 0x80, 0xA3, 0xAE, 0xEC, 0xA9, 0xB8, 0xE8, 0xBD, 0xB7, 0x93, 0xB4, 0x9C, 0xEC,
0x82, 0x90, 0xA8, 0xB6, 0x83, 0x99, 0x9E, 0xAC, 0x95, 0xA0, 0x86, 0xB4, 0xAA, 0xAF, 0x91, 0x8A,
0xB5, 0x95, 0x9F, 0xE3, 0x9F, 0x97, 0x93, 0xED, 0xEE, 0x82, 0xA0, 0x91, 0xAD, 0xEF, 0x9C, 0xA9,
0x8C, 0xB2, 0x8C, 0x8F, 0xAA, 0xE2, 0x8D, 0xBF, 0xB7, 0xE2, 0x93, 0xA8, 0xED, 0xBF, 0x8A, 0xEC,
0x9D, 0x80, 0xED, 0xB2, 0x8A, 0xE8, 0xEB, 0x90, 0xED, 0x99, 0xE3, 0xAE, 0x8A, 0xB1, 0xB3, 0x83,
0xB0, 0x90, 0xAB, 0x82, 0xEC, 0xB0, 0x90, 0xAC, 0xAC, 0x96, 0x9F, 0xEC, 0x86, 0xB4, 0xB8, 0x8A,
0x9F, 0x8E, 0xB6, 0x96, 0xEE, 0xE2, 0xBF, 0xA9, 0x8D, 0xEF, 0xEF, 0x80, 0xB7, 0x9F, 0xEF, 0xED,
0x89, 0x9F, 0xF1, 0x9C, 0xEB, 0xB5, 0xAB, 0x91, 0xF5, 0xB2, 0x8B, 0xEF, 0xAE, 0x9E, 0x90, 0xAD,
0xB4, 0xBF, 0x9F, 0xA8, 0xA3, 0x90, 0x80, 0xF1, 0xE2, 0x91, 0xB5, 0xB3, 0x9E, 0xEE, 0xE8, 0x89,
0x91, 0xBB, 0xBC, 0xEA, 0xB1, 0xE8, 0xE3, 0xB3, 0x8B, 0xBC, 0x82, 0x92, 0xEB, 0x9C, 0x86, 0xB4,
0x83, 0x89, 0xB9, 0x9D, 0xB6, 0x92, 0xEF, 0xE2, 0xA8, 0x82, 0x82, 0xB0, 0x9B, 0x80, 0xAC, 0xF1,
0xB1, 0x92, 0x94, 0x8E, 0xA9, 0x90, 0xF1, 0xA0, 0x96, 0x82, 0xF5, 0xF5, 0x91, 0xAA, 0xA0, 0x8E,
0x86, 0xB4, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0x9F, 0x94, 0x9E, 0xFA, 0x99, 0x9F, 0x88, 0x8E, 0x93,
0x9C, 0x93, 0x99, 0x9B, 0x8E, 0x9F, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0x86, 0xB4, 0xF7, 0xF7, 0xF7,
0xF7, 0xF7, 0x98, 0x9F, 0x9D, 0x93, 0x94, 0xFA, 0x99, 0x9F, 0x88, 0x8E, 0x93, 0x9C, 0x93, 0x99,
0x9B, 0x8E, 0x9F, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0x86, 0xB4, 0x97, 0x93, 0x93, 0x92, 0xE3, 0x8E,
0x99, 0x99, 0x98, 0xBE, 0xE8, 0xBD, 0x9B, 0xAD, 0x93, 0x98, 0x9B, 0xBD, 0x93, 0x99, 0x9F, 0x9B,
0x97, 0xAD, 0x9E, 0x8B, 0x83, 0x90, 0x91, 0xB5, 0x80, 0x93, 0xB2, 0xAC, 0xB9, 0x94, 0x9B, 0x8B,
0x9F, 0x96, 0x98, 0x8B, 0x9B, 0xAD, 0xBE, 0x9E, 0x9F, 0x96, 0x97, 0x9B, 0xB1, 0x9D, 0x9B, 0xEB,
0x8F, 0x9F, 0x98, 0xB2, 0x97, 0x99, 0x8F, 0xB6, 0x8F, 0xA2, 0x86, 0xB4, 0x9E, 0xA0, 0x9B, 0x94,
0x98, 0xBD, 0x94, 0x8C, 0x98, 0x9B, 0xB9, 0x97, 0x98, 0xB1, 0xEB, 0xAC, 0xBE, 0xE8, 0x94, 0xAC,
0xBE, 0xA0, 0x9F, 0xB0, 0x97, 0x99, 0x9F, 0x9D, 0x9B, 0xEB, 0x8F, 0x9F, 0x99, 0xBD, 0xAD, 0xBB,
0x8F, 0x9D, 0x9C, 0xA3, 0x83, 0x8D, 0xA2, 0xA9, 0x80, 0x8D, 0xA2, 0xA0, 0x93, 0x9F, 0xB6, 0x8B,
0x93, 0x9F, 0xB2, 0xAC, 0xB8, 0x9D, 0x88, 0xAA, 0xB8, 0xB7, 0xBE, 0xA0, 0x86, 0xB4, 0x93, 0x9F,
0xBE, 0xAE, 0x83, 0xB1, 0xBD, 0xA2, 0x9E, 0xB0, 0x9B, 0x97, 0x98, 0xBD, 0x94, 0x8C, 0x98, 0x9B,
0xA9, 0x97, 0x98, 0x8F, 0x94, 0xA9, 0xB8, 0xE9, 0x8C, 0xB1, 0x97, 0x88, 0xE2, 0xAD, 0x92, 0x8B,
0x83, 0x9E, 0x8C, 0x8B, 0x8B, 0x9E, 0x9E, 0x98, 0x80, 0x8B, 0x83, 0x82, 0x90, 0xB2, 0xB8, 0x9D,
0x8C, 0xA9, 0xB9, 0xA3, 0x98, 0x90, 0xB9, 0xE9, 0x94, 0xEB, 0xBB, 0x8D, 0xEF, 0xB4, 0x86, 0xB4,
0x93, 0x9F, 0x94, 0x98, 0x93, 0x99, 0x97, 0xA2, 0x97, 0x98, 0xEE, 0x82, 0x9E, 0x8E, 0x9F, 0xEE,
0x97, 0x8E, 0x93, 0xA3, 0x94, 0x9E, 0x9B, 0xEF, 0x97, 0x9E, 0x9F, 0xEB, 0x97, 0x9C, 0xB5, 0x82,
0x9E, 0x8E, 0x97, 0xA2, 0x97, 0x9E, 0x9F, 0xA3, 0x97, 0xA0, 0x9B, 0xEF, 0x97, 0x9E, 0x9F, 0xEB,
0x97, 0x9C, 0xB5, 0xAD, 0xBE, 0x9E, 0x9F, 0x96, 0x97, 0x9B, 0xB1, 0x9D, 0x9B, 0xEB, 0x8F, 0x9F,
0x86, 0xB4, 0x98, 0xB2, 0x97, 0x99, 0x8F, 0xB6, 0x8F, 0xA2, 0x9E, 0xA0, 0x9B, 0x94, 0x98, 0xBD,
0x94, 0x8C, 0x98, 0x9B, 0xB9, 0x97, 0x98, 0xB1, 0xEB, 0xAC, 0xB9, 0xE8, 0x94, 0xAC, 0xBE, 0xA0,
0x9F, 0xB0, 0x97, 0x99, 0x9F, 0x9D, 0x9B, 0xEB, 0x8F, 0x9F, 0x99, 0xBD, 0xAD, 0xBB, 0x8F, 0x9D,
0x9C, 0xA3, 0x83, 0x8D, 0xA2, 0xA9, 0x80, 0x8D, 0xA2, 0xA0, 0x93, 0x9F, 0xB6, 0x8B, 0x93, 0x9F,
0xB2, 0xAC, 0x86, 0xB4, 0xB8, 0x9D, 0x88, 0xAA, 0xB8, 0xB7, 0xBE, 0xA0, 0x93, 0x9F, 0xBE, 0xAE,
0x83, 0xB1, 0xBD, 0xA2, 0x9F, 0x9E, 0x9B, 0x95, 0x98, 0xBD, 0x94, 0x8C, 0x98, 0x9B, 0xA9, 0x97,
0x98, 0xEA, 0x88, 0xB6, 0xB9, 0xE8, 0xAE, 0xEA, 0xB8, 0xE9, 0x9B, 0xA2, 0x92, 0x8E, 0x9B, 0xB8,
0x98, 0xBD, 0x94, 0x8C, 0x98, 0x9B, 0x97, 0x97, 0x9C, 0x9C, 0x98, 0xB2, 0xB9, 0xB7, 0x9C, 0xA9,
0xB8, 0x9D, 0x8C, 0xA9, 0x86, 0xB4, 0xB9, 0xA3, 0x98, 0x9F, 0x80, 0x82, 0x94, 0xA8, 0xBE, 0x9D,
0xE3, 0xAD, 0x93, 0x9F, 0x94, 0x98, 0x97, 0x93, 0x93, 0x99, 0x93, 0xB0, 0x9B, 0x94, 0x98, 0xBD,
0xB1, 0xAB, 0xB2, 0xB1, 0xB3, 0x9D, 0xE3, 0xAD, 0xEA, 0x98, 0x9B, 0x8B, 0x9F, 0x9C, 0x9B, 0x9B,
0x95, 0x99, 0x9B, 0xBD, 0xE2, 0x9B, 0x97, 0x93, 0x93, 0x99, 0x99, 0xBD, 0x91, 0x99, 0x9B, 0xBD,
0x9F, 0x9B, 0xE8, 0xA8, 0xEC, 0x8A, 0x86, 0xB4, 0xA0, 0xF5, 0xBC, 0x9F, 0xEE, 0x8D, 0x9F, 0x89,
0x82, 0xB1, 0xAF, 0xBE, 0x8E, 0xE2, 0xEA, 0xB1, 0xB1, 0xF1, 0xBE, 0xB1, 0x91, 0xF5, 0x91, 0x9C,
0x97, 0xE3, 0x9B, 0xAB, 0xB7, 0xB7, 0x92, 0x98, 0xBE, 0xA2, 0xE8, 0x91, 0x88, 0x98, 0x91, 0x82,
0x8A, 0xAF, 0x95, 0x90, 0xB4, 0x8B, 0xB5, 0xAA, 0xEC, 0xBE, 0x89, 0xF1, 0x80, 0x88, 0x88, 0x83,
0xBD, 0xA3, 0xA0, 0xAB, 0xAC, 0x9C, 0x83, 0xB6, 0x86, 0xB4, 0x95, 0x8C, 0xA3, 0xE3, 0xB5, 0x80,
0xB2, 0x90, 0xE2, 0xAB, 0xAE, 0xA8, 0x8B, 0x92, 0xED, 0xEB, 0xB5, 0xA8, 0xB4, 0x96, 0xF5, 0x80,
0x94, 0x93, 0x8F, 0x98, 0x97, 0x95, 0xB5, 0x8B, 0xEB, 0x92, 0xBD, 0xE3, 0x95, 0xAB, 0xBB, 0xAB,
0xAD, 0xA8, 0xE8, 0xB8, 0xEA, 0xEE, 0xAB, 0x8D, 0x8C, 0xED, 0x88, 0x93, 0xB0, 0x8D, 0xEF, 0xB8,
0x9D, 0xEA, 0x8B, 0x98, 0xBD, 0x9B, 0x83, 0xAF, 0x9E, 0x82, 0x86, 0xB4, 0xAF, 0xAB, 0xEF, 0xBE,
0xB4, 0xEB, 0x9B, 0xE2, 0xAF, 0x9E, 0x8D, 0xB5, 0x8A, 0x83, 0xBE, 0xB7, 0x8F, 0xA8, 0xA9, 0xF1,
0xB5, 0xB3, 0xA8, 0xEA, 0xB1, 0xA2, 0x8F, 0xAF, 0xBD, 0xAF, 0xB7, 0x8D, 0x89, 0x83, 0x83, 0xA0,
0xB2, 0x9D, 0x95, 0xB5, 0x9E, 0xA2, 0xAA, 0x99, 0x89, 0xAA, 0x82, 0xAB, 0x89, 0xB5, 0xAC, 0x83,
0x95, 0xB9, 0xA3, 0x9F, 0x94, 0xB3, 0xB4, 0x9E, 0xE8, 0x94, 0x9C, 0xA9, 0x86, 0xB4, 0xEC, 0x8E,
0xEC, 0x99, 0x90, 0xEB, 0x97, 0x99, 0xF5, 0xA3, 0x8E, 0x8F, 0xA3, 0xAF, 0xE2, 0xB5, 0x96, 0x99,
0x97, 0xA9, 0x82, 0xB3, 0xB7, 0xA3, 0x92, 0xBC, 0xBF, 0xF1, 0xAA, 0xB1, 0xB4, 0x90, 0xEB, 0xB9,
0x89, 0x89, 0xEE, 0xB3, 0xE9, 0xA0, 0x8B, 0xED, 0xAE, 0x88, 0x8C, 0xBE, 0x9C, 0x97, 0xAC, 0xB8,
0x96, 0xBE, 0x8A, 0xB8, 0x95, 0xB1, 0x9E, 0xBB, 0x8E, 0xF5, 0x80, 0x9C, 0xA3, 0xB2, 0x86, 0xB4,
0xBF, 0x92, 0x95, 0xA8, 0xAA, 0x98, 0x91, 0xBB, 0xBF, 0x93, 0xB4, 0xA9, 0x94, 0xB5, 0x99, 0xB5,
0x82, 0xB5, 0x95, 0x89, 0xAB, 0xE3, 0x91, 0xE2, 0x99, 0xA0, 0x83, 0xAB, 0xE9, 0xB7, 0x9F, 0xB3,
0xB1, 0x9F, 0xF5, 0xAE, 0xE9, 0x8A, 0x98, 0xF1, 0xE2, 0x90, 0xB8, 0x99, 0x97, 0xB1, 0xBC, 0xEF,
0xBD, 0xF1, 0x9F, 0xAF, 0xAA, 0xEE, 0x88, 0xB0, 0xB6, 0x8B, 0xBF, 0x93, 0x96, 0xAF, 0xF5, 0x80,
0x86, 0xB4, 0xAB, 0x9F, 0xB1, 0x9D, 0xA3, 0x90, 0xAE, 0xB5, 0xAC, 0xAF, 0x88, 0xB4, 0x8A, 0xB2,
0xBB, 0xEB, 0x89, 0x8F, 0xAD, 0xEF, 0x8B, 0xB3, 0xA0, 0xEC, 0x9F, 0xA3, 0x96, 0x9E, 0xBB, 0x96,
0xAF, 0xBD, 0xEC, 0x88, 0xBF, 0xB0, 0x8A, 0xB3, 0x8B, 0x80, 0x92, 0xB3, 0xB5, 0xEB, 0xEA, 0xF5,
0xA0, 0xB5, 0xAC, 0xB6, 0xBB, 0x94, 0xE3, 0xBB, 0x9C, 0xED, 0xEE, 0x99, 0x9D, 0x98, 0xED, 0x93,
0xB0, 0xB0, 0x86, 0xB4, 0x8E, 0x9B, 0x97, 0xB2, 0xA2, 0x94, 0xEE, 0xE8, 0xE9, 0xA2, 0x91, 0x8B,
0xBF, 0xAA, 0x9C, 0x8A, 0xB3, 0x8A, 0x8B, 0xAE, 0xB4, 0x80, 0x9D, 0xB1, 0xBF, 0xEB, 0xEB, 0xAF,
0xA8, 0x9E, 0xED, 0xAA, 0xA3, 0x93, 0x88, 0x90, 0x8B, 0xB2, 0x8B, 0xB8, 0x8A, 0x90, 0xBF, 0xA3,
0x92, 0x8A, 0x80, 0x96, 0xB5, 0x9B, 0x83, 0xF5, 0x80, 0xB4, 0xE9, 0x96, 0xAF, 0xEA, 0xE9, 0xAD,
0xAA, 0xAB, 0xB4, 0xEE, 0x86, 0xB4, 0xAF, 0x8C, 0xB6, 0x9F, 0xBC, 0xA8, 0xAC, 0x8C, 0xE9, 0xAA,
0xAC, 0xE3, 0xBD, 0xB4, 0xB7, 0xB7, 0xBF, 0xF5, 0x97, 0x8F, 0x8D, 0xA3, 0xBF, 0xBD, 0xB3, 0x95,
0xA2, 0x94, 0xEA, 0xA2, 0xB6, 0xBD, 0x98, 0xB1, 0xBD, 0xB0, 0xBE, 0x99, 0xB5, 0xF5, 0xBE, 0xED,
0xEE, 0x91, 0x94, 0xB0, 0xBC, 0xB9, 0x9E, 0xF5, 0x8A, 0xEE, 0xAB, 0x88, 0xBB, 0xF1, 0xAC, 0xEF,
0xEA, 0xBE, 0xBE, 0xB6, 0x95, 0x82, 0x86, 0xB4, 0xB2, 0xAF, 0x89, 0x9B, 0xB3, 0xB9, 0xE9, 0x96,
0xB5, 0xAD, 0xAB, 0xB3, 0xA0, 0x93, 0xE3, 0xF1, 0xB0, 0xA9, 0x8F, 0xEB, 0x94, 0x89, 0x99, 0x83,
0xF5, 0xA9, 0xA9, 0x97, 0xB4, 0xBB, 0x9C, 0x8E, 0x8C, 0x99, 0x9D, 0xB0, 0xAE, 0xB9, 0x8A, 0xAB,
0xE8, 0x80, 0xB5, 0x9F, 0xEC, 0xB4, 0xE2, 0x94, 0x9D, 0xEB, 0xBE, 0x8D, 0x94, 0x9F, 0xAC, 0x9C,
0x90, 0x8B, 0xEB, 0xBF, 0xB6, 0x80, 0x9E, 0xBC, 0x86, 0xB4, 0x80, 0x8F, 0x8B, 0x8A, 0xF5, 0xEF,
0xA8, 0xEF, 0xB5, 0xB2, 0xBF, 0x9F, 0xA3, 0x98, 0xB4, 0x95, 0xAF, 0xAE, 0x90, 0xB7, 0xA8, 0x97,
0x8C, 0xBB, 0xB2, 0x99, 0xB3, 0xEC, 0xB3, 0xAA, 0xA2, 0xAC, 0xED, 0xEE, 0x9E, 0x8A, 0xA0, 0x9D,
0xAB, 0x90, 0x99, 0x82, 0xE2, 0x82, 0xED, 0x8C, 0x92, 0xA8, 0xF1, 0x9E, 0xE8, 0xA0, 0xBF, 0x9F,
0xBD, 0x94, 0xA8, 0xB5, 0xBE, 0x9E, 0xE9, 0xB3, 0x9C, 0xF5, 0x86, 0xB4, 0xAB, 0xE8, 0xA3, 0x91,
0xEB, 0xAB, 0x8A, 0xE3, 0xF5, 0xBC, 0xBE, 0x95, 0xB1, 0xEF, 0x99, 0xBB, 0xB0, 0x80, 0x8C, 0xB9,
0x91, 0xBF, 0xA2, 0xAE, 0x8D, 0xBE, 0x83, 0x98, 0xA9, 0xE3, 0xA8, 0x97, 0xF1, 0xEA, 0x83, 0x9C,
0xF1, 0xA9, 0x9F, 0x99, 0x9B, 0xAD, 0x9F, 0x9B, 0x9B, 0xBB, 0x95, 0x99, 0x9B, 0xB5, 0xE2, 0xAD,
0xBD, 0xBD, 0x91, 0x96, 0x97, 0x98, 0x93, 0x9D, 0x9B, 0xEB, 0x8F, 0xBE, 0x86, 0xB4, 0x9F, 0xAD,
0x9F, 0x98, 0xF5, 0xAD, 0x8B, 0x93, 0x97, 0x9B, 0x83, 0x98, 0x9B, 0xBC, 0xE2, 0x99, 0x9B, 0x8B,
0x9B, 0xAD, 0x9E, 0xAD, 0x83, 0x9E, 0x8C, 0x88, 0xEA, 0xB1, 0x9B, 0x8B, 0x92, 0xF5, 0x98, 0x9B,
0x8F, 0xAD, 0x9B, 0xEE, 0x9B, 0x98, 0x9B, 0x9E, 0x9B, 0x91, 0x98, 0xBD, 0x94, 0x8C, 0x92, 0x8E,
0x83, 0x9F, 0x9B, 0xAD, 0x93, 0x98, 0x9B, 0x9E, 0x9B, 0x95, 0x98, 0xBD, 0x94, 0x8C, 0x86, 0xB4,
0x92, 0x8B, 0xE2, 0x98, 0x9B, 0xBC, 0xE2, 0x9F, 0x98, 0x9B, 0x97, 0x99, 0x9B, 0x8B, 0x83, 0xAD,
0x92, 0x8B, 0x83, 0x9E, 0x8C, 0x88, 0xEA, 0x95, 0x98, 0x98, 0x83, 0x9F, 0x9C, 0x9B, 0x96, 0xB1,
0xA0, 0xBC, 0x96, 0xEB, 0x9D, 0xB2, 0x8D, 0x9E, 0xB8, 0xBC, 0x99, 0xA8, 0xA8, 0xAD, 0x8B, 0x88,
0xA2, 0x88, 0xBC, 0xEF, 0xE8, 0x9F, 0xA3, 0x8A, 0x97, 0x98, 0xE2, 0x9D, 0x9B, 0xEB, 0x8F, 0xBE,
0x86, 0xB4, 0x93, 0xAD, 0x8B, 0x83, 0x97, 0x98, 0xBB, 0x9B, 0x9C, 0x9E, 0xAF, 0x8E, 0x9F, 0xBC,
0xA9, 0xBC, 0xEF, 0xE3, 0x9C, 0xF1, 0x89, 0x99, 0xAD, 0xED, 0xB7, 0xA2, 0x8B, 0xE3, 0x91, 0xAB,
0x8C, 0x8A, 0xBD, 0xF5, 0xEB, 0x91, 0x97, 0x9E, 0xE2, 0x9D, 0x99, 0x99, 0xA9, 0x9D, 0x9B, 0x8B,
0x8F, 0x9C, 0x98, 0xAD, 0x9F, 0x98, 0x98, 0x9E, 0x97, 0xAD, 0x97, 0x8E, 0x9B, 0xAC, 0x98, 0xBD,
0xBD, 0xA8, 0x86, 0xB4, 0x98, 0xBD, 0x9F, 0x9C, 0x98, 0x8B, 0xB9, 0xAD, 0x9B, 0xB5, 0x83, 0xB0,
0xBB, 0x92, 0x88, 0xEA, 0xB9, 0x9E, 0xB5, 0xAC, 0x96, 0xE8, 0x94, 0xB2, 0x96, 0xB4, 0x98, 0xB2,
0xB9, 0xB7, 0x9C, 0xA9, 0xB8, 0x9D, 0x8C, 0xA9, 0xB9, 0xA3, 0xEF, 0xAF, 0x80, 0x82, 0x8B, 0xAC,
0x83, 0xE8, 0x9F, 0xAC, 0xB9, 0xB7, 0xE3, 0xAC, 0xBE, 0x99, 0xEF, 0xAD, 0x80, 0x8D, 0xEA, 0xAD,
0x94, 0xAD, 0x83, 0x9E, 0x86, 0xB4, 0x8C, 0x88, 0xEA, 0xBC, 0x98, 0x9E, 0x9B, 0xAD, 0x96, 0xB0,
0x9B, 0xA9, 0xB5, 0x99, 0xAB, 0xBD, 0x91, 0x93, 0x83, 0xB7, 0xBB, 0x92, 0x88, 0xEA, 0xB9, 0x9E,
0xB5, 0xAC, 0x96, 0xE8, 0x94, 0xB2, 0x96, 0xB4, 0x98, 0xB2, 0xB9, 0xB7, 0x9C, 0xA9, 0xB8, 0x9D,
0x8C, 0xA9, 0xB9, 0xA3, 0xEF, 0xAF, 0x80, 0x82, 0x8B, 0xAC, 0x83, 0xE8, 0x9F, 0xAC, 0xB9, 0xB7,
0xE3, 0xAC, 0xBE, 0x9C, 0xE3, 0xB0, 0x86, 0xB4, 0x83, 0x89, 0xEF, 0xB0, 0xB9, 0xB7, 0xAD, 0xAD,
0xBD, 0xBD, 0x9D, 0x97, 0x98, 0xBD, 0x94, 0x8C, 0x92, 0x89, 0x9B, 0x9F, 0xBD, 0xBD, 0x9D, 0x9E,
0x97, 0x93, 0x93, 0x98, 0xBC, 0xA0, 0x99, 0x98, 0xA8, 0x8B, 0x83, 0x95, 0x91, 0xAD, 0x83, 0x98,
0x98, 0x9B, 0x9D, 0x98, 0xA0, 0x9E, 0xAF, 0x9E, 0xBC, 0x8B, 0x93, 0x99, 0x9B, 0x8B, 0x9F, 0xAD,
0xBD, 0x80, 0xB5, 0xAD, 0x95, 0x8B, 0x83, 0x93, 0x86, 0xB4, 0x91, 0xAD, 0x83, 0x98, 0x98, 0x8B,
0x8F, 0x92, 0x9B, 0xBD, 0x9F, 0x8D, 0x96, 0x8D, 0xB2, 0xEA, 0xBE, 0x92, 0x9B, 0xEC, 0x96, 0xA3,
0xE3, 0xB0, 0x83, 0x89, 0xEF, 0xAD, 0x83, 0x82, 0x90, 0xB2, 0xB8, 0x9D, 0xA2, 0xB6, 0xB8, 0x92,
0x97, 0xAF, 0xB8, 0xB7, 0x8C, 0xEA, 0x96, 0xE8, 0x94, 0xB2, 0x96, 0xE9, 0x98, 0xB2, 0xB9, 0xB7,
0x9C, 0xA9, 0xB8, 0x9D, 0x8C, 0xA9, 0xB9, 0xEB, 0xE3, 0xB0, 0x86, 0xB4, 0xB9, 0x92, 0x97, 0xAF,
0xBB, 0x92, 0x88, 0xAE, 0xB8, 0x9E, 0x98, 0xBE, 0x98, 0xBD, 0xBD, 0xA8, 0x98, 0xBD, 0x9F, 0x9C,
0x98, 0x8B, 0xB9, 0x99, 0x9B, 0xB0, 0x98, 0x88, 0x97, 0x98, 0xE2, 0xBB, 0x9D, 0x9C, 0x98, 0xB2,
0xB9, 0xB7, 0x9C, 0xA9, 0xB8, 0x9D, 0x8C, 0xA9, 0xB9, 0xA3, 0x98, 0x93, 0xB8, 0xE8, 0xA2, 0xB1,
0xBB, 0x8D, 0xEF, 0xB4, 0xB9, 0xA3, 0xAD, 0xBD, 0xB8, 0x92, 0x88, 0xB1, 0x86, 0xB4, 0x96, 0xB0,
0x9B, 0x9E, 0x9B, 0xBD, 0x9F, 0x98, 0x9D, 0xB3, 0xEF, 0x9C, 0xBF, 0x92, 0x88, 0xB6, 0xB9, 0xB7,
0xEF, 0xB2, 0xB8, 0x99, 0x98, 0x99, 0x83, 0x82, 0x94, 0xAA, 0x83, 0xA3, 0x98, 0x9E, 0x80, 0x82,
0x90, 0xEA, 0xBB, 0x8D, 0x80, 0xAA, 0x83, 0xE8, 0x9C, 0xEA, 0xB8, 0xE8, 0xEE, 0xBD, 0x8F, 0x92,
0x90, 0xB2, 0x83, 0xE9, 0x88, 0xAA, 0x83, 0xE8, 0x8F, 0xBD, 0x8F, 0xE9, 0x88, 0xB2, 0x86, 0xB4,
0xBE, 0x9D, 0x8C, 0xAE, 0x80, 0x8D, 0xEF, 0xEA, 0x97, 0x9D, 0x8B, 0x9D, 0x9E, 0xB3, 0xA9, 0x9D,
0x9B, 0x8B, 0x8B, 0x98, 0xBD, 0xB9, 0xAD, 0xED, 0xBD, 0xE9, 0xEA, 0x99, 0x9B, 0xBD, 0x9F, 0x99,
0x97, 0x9C, 0x93, 0xAD, 0x8F, 0x9B, 0x83, 0x93, 0x91, 0xAD, 0x83, 0x98, 0x98, 0x8B, 0x8F, 0x92,
0x9B, 0xBD, 0x93, 0xAD, 0x88, 0x9E, 0x9B, 0xBC, 0x9D, 0xB2, 0xB2, 0x8B, 0x83, 0x82, 0x90, 0xB2,
0x86, 0xB4, 0xB8, 0x9D, 0xA2, 0xB6, 0xB8, 0x92, 0x97, 0xBD, 0x89, 0x9D, 0xE3, 0xA9, 0x80, 0x9D,
0xB6, 0xAF, 0x80, 0xE9, 0x97, 0xA9, 0x93, 0x9D, 0xA2, 0xEA, 0x80, 0x99, 0xEE, 0xAD, 0x9B, 0xAD,
0x93, 0x98, 0x9B, 0x88, 0xB5, 0xB2, 0x88, 0x82, 0xB2, 0xEA, 0x80, 0x82, 0x90, 0xAF, 0x83, 0x8D,
0xAD, 0xBD, 0x8B, 0xB7, 0x9C, 0xA0, 0xBB, 0x8D, 0x97, 0xBD, 0x8B, 0xE8, 0x8C, 0xA3, 0xBE, 0x9D,
0xB6, 0xB7, 0x86, 0xB4, 0xBB, 0x8D, 0x94, 0xB2, 0xBE, 0x9D, 0x8F, 0xBD, 0x8F, 0x9D, 0xE3, 0xA9,
0xBB, 0x8D, 0x94, 0xEF, 0x97, 0x9D, 0xB9, 0x9D, 0x9E, 0xB3, 0xA9, 0x9D, 0x9B, 0x8B, 0x8B, 0x98,
0xBD, 0xB9, 0xAD, 0xED, 0xBD, 0xE9, 0xEA, 0x99, 0x9B, 0xB7, 0x83, 0x9E, 0x97, 0x9C, 0x8F, 0xAD,
0x8F, 0xAD, 0x83, 0x93, 0x91, 0xAD, 0x83, 0x98, 0x98, 0x8B, 0x8F, 0x92, 0x9B, 0xBD, 0x93, 0xAD,
0x88, 0xA0, 0x9B, 0xBC, 0x86, 0xB4, 0x9D, 0xB2, 0xB2, 0x8B, 0x83, 0x82, 0x90, 0xB2, 0xB8, 0x9D,
0xA2, 0xB6, 0xB8, 0x92, 0x97, 0xBD, 0x89, 0x9D, 0xE3, 0xA9, 0x80, 0x9D, 0xB6, 0xAF, 0x80, 0xE9,
0x97, 0xA9, 0x93, 0x9D, 0xA2, 0xEA, 0x80, 0x99, 0xEE, 0xAD, 0x9B, 0xAD, 0x93, 0x98, 0x9B, 0x88,
0xB5, 0xB1, 0x8F, 0x9D, 0x9C, 0xA3, 0x83, 0x8D, 0xA2, 0xA9, 0x80, 0x8D, 0xA2, 0xA0, 0x93, 0x9F,
0x88, 0xB6, 0xB9, 0xE8, 0xAE, 0xEA, 0x86, 0xB4, 0xB8, 0xE9, 0x9B, 0xBD, 0x8B, 0xE8, 0x8C, 0xA3,
0xBE, 0x9D, 0xB6, 0xB7, 0xBB, 0x8D, 0x94, 0xB2, 0xBE, 0x9D, 0x8F, 0xBD, 0x8F, 0x9D, 0xE3, 0xA9,
0xBB, 0x8D, 0x94, 0xEF, 0x97, 0x9B, 0xEA, 0x9D, 0x99, 0x89, 0xAB, 0x9D, 0x89, 0x93, 0xB8, 0xE9,
0x9E, 0x8B, 0x9F, 0x98, 0x99, 0xAD, 0x8F, 0x9B, 0x9B, 0xEE, 0x93, 0x99, 0x9B, 0x8B, 0x9B, 0xAA,
0x98, 0xE3, 0x90, 0x80, 0x8E, 0xF1, 0xB9, 0xAD, 0x86, 0xB4, 0x91, 0x89, 0x9D, 0x80, 0xAF, 0x88,
0xEF, 0x96, 0xB0, 0xBF, 0xEB, 0xB6, 0xBD, 0xA2, 0xAF, 0xBF, 0x97, 0x9F, 0xB1, 0xAB, 0xEA, 0x8B,
0xA8, 0x98, 0x8F, 0xBD, 0x93, 0xBB, 0xB3, 0xB0, 0x93, 0xB7, 0x8E, 0xB5, 0xEF, 0xB4, 0xAD, 0x9E,
0xE9, 0xB0, 0x89, 0xAA, 0x92, 0x82, 0xE9, 0xB3, 0xAD, 0x82, 0xEB, 0xEB, 0x9E, 0x9B, 0xEA, 0xAD,
0xAC, 0x9E, 0x9E, 0xB2, 0x89, 0xE8, 0xB8, 0x8A, 0x95, 0x83, 0x86, 0xB4, 0x99, 0xAC, 0x95, 0xB4,
0xE3, 0x91, 0x9C, 0xA3, 0xF1, 0xB3, 0x93, 0xB6, 0xB3, 0xEA, 0xB9, 0xB9, 0xEB, 0xF5, 0xEE, 0xB1,
0x98, 0x92, 0xF5, 0x9E, 0x83, 0xA9, 0x9B, 0xB2, 0xF1, 0x89, 0x8F, 0xBE, 0x80, 0xA9, 0xF5, 0xAD,
0xE9, 0x9D, 0xF5, 0xEA, 0x90, 0xA9, 0xAF, 0xB9, 0x8B, 0x9E, 0xEF, 0x9B, 0xBB, 0x96, 0xE9, 0xAA,
0xBF, 0xB2, 0xA9, 0xBC, 0xE9, 0xBE, 0x80, 0xBC, 0x88, 0xED, 0xB9, 0xAB, 0x86, 0xB4, 0xE9, 0xAB,
0xE2, 0x9E, 0xEC, 0xB3, 0xBB, 0xF5, 0x89, 0xB5, 0x97, 0xA8, 0x9E, 0x96, 0xAA, 0x8B, 0x99, 0x90,
0xB0, 0xB7, 0xED, 0xE3, 0xE2, 0xA3, 0x8F, 0xBF, 0xAC, 0xB3, 0xEE, 0x80, 0x94, 0x90, 0xAD, 0x9F,
0x92, 0x93, 0x95, 0x92, 0xEF, 0xBD, 0x94, 0xAC, 0xED, 0xEC, 0xBF, 0x99, 0xA2, 0xF1, 0xB4, 0x94,
0x90, 0x92, 0xAC, 0xB4, 0xAD, 0xEA, 0xA3, 0x91, 0x91, 0xBC, 0xAB, 0xEF, 0xE8, 0x97, 0x86, 0xB4,
0xB2, 0xEC, 0xBB, 0x8C, 0x88, 0x98, 0xB3, 0x9C, 0xED, 0xE9, 0x96, 0xB9, 0xAC, 0x99, 0xB7, 0x94,
0xAE, 0xBD, 0xBF, 0x9E, 0x90, 0xA2, 0x8A, 0x8F, 0x9B, 0xBE, 0xB8, 0x8C, 0x83, 0xBD, 0xAC, 0xED,
0xB8, 0xEA, 0xA0, 0xAA, 0xBD, 0xA3, 0xAA, 0xB1, 0xAA, 0xB2, 0xEA, 0xBB, 0x8D, 0x8B, 0x8A, 0xE3,
0xEA, 0xAE, 0xAB, 0x8A, 0x9B, 0x8D, 0xB4, 0xAA, 0xB0, 0x92, 0x8B, 0xE8, 0x8A, 0xED, 0xF5, 0xB5,
0x86, 0xB4, 0x8A, 0xF1, 0xA3, 0xB4, 0x91, 0x98, 0xE9, 0xBE, 0x82, 0xEC, 0x80, 0xB9, 0x9B, 0xEF,
0x99, 0x90, 0xEF, 0xB5, 0xEE, 0xB0, 0x82, 0x90, 0x82, 0xF5, 0xF1, 0xAC, 0x89, 0xEB, 0x92, 0x8B,
0x8D, 0xAF, 0x8E, 0x8F, 0xE2, 0x99, 0xB2, 0x83, 0x98, 0xA2, 0x9C, 0x98, 0xEC, 0xED, 0xBF, 0x99,
0x8A, 0x9E, 0xAE, 0xB8, 0xAD, 0xAE, 0x88, 0xAD, 0x96, 0xB7, 0x89, 0xEE, 0x8E, 0x8E, 0x96, 0x98,
0xAA, 0x82, 0x86, 0xB4, 0xBD, 0x9F, 0x8D, 0x8D, 0xE2, 0xB0, 0xBB, 0x90, 0x99, 0xB7, 0xEE, 0xA9,
0x83, 0x96, 0x97, 0xB7, 0xB0, 0xF5, 0xAF, 0xAD, 0xE9, 0x9B, 0xAB, 0xA8, 0x82, 0x92, 0xE9, 0x8E,
0x9C, 0x80, 0x9F, 0xBE, 0xBB, 0xAB, 0xB2, 0x82, 0x8E, 0xE3, 0xA9, 0xEC, 0xB3, 0xBD, 0x98, 0x96,
0xED, 0x8C, 0xEA, 0x94, 0xA8, 0x99, 0xE8, 0xA8, 0x93, 0xAA, 0xAB, 0xB0, 0xBD, 0xE3, 0xB8, 0xEB,
0x80, 0xA3, 0xB8, 0x83, 0x86, 0xB4, 0x80, 0xBB, 0xF5, 0xBD, 0x99, 0xBC, 0x8A, 0x90, 0xED, 0xE9,
0xA9, 0x93, 0x8F, 0xB1, 0x9C, 0xB5, 0xB6, 0xBB, 0xEB, 0x91, 0xA8, 0xEF, 0xEA, 0x89, 0xB0, 0xBB,
0xA8, 0xEC, 0xBB, 0x9C, 0xBC, 0x8B, 0x9E, 0xB0, 0x83, 0x99, 0xBC, 0x80, 0xBF, 0x99, 0xEC, 0xA9,
0xEE, 0x8C, 0xBD, 0x88, 0xEC, 0xAA, 0xEA, 0xB8, 0xA9, 0xED, 0xB0, 0xA8, 0xEC, 0xEB, 0xA0, 0xAD,
0xA9, 0x8A, 0x8F, 0xB6, 0x99, 0xAF, 0x86, 0xB4, 0x9B, 0x80, 0x8D, 0x9B, 0xB3, 0x97, 0xAE, 0xAA,
0xA0, 0x9B, 0xAB, 0xEC, 0x83, 0x90, 0x83, 0xE9, 0xB4, 0xB0, 0x82, 0x8E, 0x80, 0x8B, 0xB4, 0xB6,
0x9C, 0x80, 0xE8, 0xBF, 0x9B, 0xB7, 0xBD, 0xA2, 0x83, 0x9E, 0xBB, 0x99, 0x88, 0xBD, 0xB0, 0x9E,
0xB4, 0x80, 0xAE, 0x92, 0x8C, 0x94, 0xE2, 0xA9, 0x8C, 0xA9, 0xB9, 0xEC, 0xAC, 0x98, 0x90, 0xB2,
0xEC, 0x82, 0xBB, 0x88, 0xE2, 0xEE, 0xAE, 0xF1, 0x86, 0xB4, 0xB3, 0xAE, 0x9E, 0x9D, 0x90, 0xBC,
0xAA, 0xB7, 0xEA, 0x88, 0x82, 0x95, 0xA3, 0xE8, 0xB8, 0xB8, 0xB6, 0xB7, 0xB6, 0xBF, 0x8C, 0x8A,
0x98, 0x9E, 0xB8, 0x9D, 0x9E, 0xA8, 0xAF, 0x95, 0xA0, 0x94, 0x90, 0xAC, 0x98, 0xF1, 0xEA, 0x92,
0xEC, 0x8A, 0xB8, 0x97, 0xAB, 0x83, 0xEB, 0x88, 0x95, 0xA3, 0xEE, 0x80, 0xB9, 0x96, 0x91, 0x8C,
0xBC, 0xAE, 0x8B, 0xA0, 0x89, 0xB9, 0x83, 0x98, 0x8F, 0x8B, 0x86, 0xB4, 0xBE, 0x9E, 0xBE, 0x8E,
0xF1, 0xEE, 0xBD, 0x8A, 0xB1, 0x93, 0xAF, 0xEB, 0x83, 0xB2, 0xA0, 0x98, 0x8B, 0xB0, 0x97, 0x94,
0x9C, 0xF5, 0xB1, 0x8A, 0xAD, 0x8F, 0x8A, 0x9F, 0xE2, 0x8D, 0xAC, 0x8C, 0xAA, 0xBF, 0xEF, 0xB8,
0x8E, 0xF1, 0x8C, 0x97, 0xB0, 0xED, 0xAE, 0x93, 0x82, 0xE8, 0xAD, 0x8B, 0x93, 0x90, 0xB9, 0xBE,
0x94, 0x9D, 0x93, 0xAC, 0xA3, 0x99, 0x8B, 0xEF, 0xBB, 0x8D, 0xB5, 0xAB, 0x86, 0xB4, 0xBF, 0xB5,
0xEC, 0x8B, 0xB2, 0x8D, 0xB7, 0x94, 0xB6, 0xB9, 0xE9, 0xB1, 0xF5, 0xB1, 0xEC, 0xE9, 0x97, 0xB2,
0xA2, 0x88, 0x94, 0xBF, 0xEF, 0xEF, 0xB9, 0xAB, 0xEC, 0xEE, 0x8C, 0xA3, 0xA9, 0xB1, 0x9C, 0x9B,
0xE7, 0xE7, 0x86, 0xB4, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0x9F, 0x94, 0x9E, 0xFA, 0x99, 0x9F, 0x88,
0x8E, 0x93, 0x9C, 0x93, 0x99, 0x9B, 0x8E, 0x9F, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0x86, 0xB4, 0xF7,
0xF7, 0xF7, 0xF7, 0xF7, 0x98, 0x9F, 0x9D, 0x93, 0x94, 0xFA, 0x99, 0x9F, 0x88, 0x8E, 0x93, 0x9C,
0x93, 0x99, 0x9B, 0x8E, 0x9F, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0x86, 0xB4, 0x97, 0x93, 0x93, 0x92,
0xAC, 0x8E, 0x99, 0x99, 0x98, 0xBB, 0x8D, 0xBD, 0x9B, 0xAD, 0x93, 0x98, 0x9B, 0xBD, 0x93, 0x90,
0x9B, 0x91, 0xBC, 0x9F, 0xE3, 0xAB, 0xED, 0xB3, 0xB1, 0xAB, 0xED, 0xB7, 0x97, 0x9B, 0xEA, 0x9D,
0x99, 0x89, 0xAB, 0x9D, 0x89, 0x93, 0xB8, 0xE9, 0x9E, 0x8B, 0x9F, 0x98, 0x99, 0xAD, 0x8F, 0x9B,
0x97, 0x93, 0x9D, 0xBD, 0x97, 0x8B, 0xA9, 0xAD, 0x99, 0x8B, 0x83, 0x9E, 0x86, 0xB4, 0x8C, 0x8B,
0x8B, 0x9D, 0x9F, 0xAD, 0x90, 0x9E, 0x89, 0x9E, 0x9F, 0x8C, 0x97, 0x98, 0x97, 0x9D, 0x9B, 0xEB,
0x8F, 0x9F, 0x98, 0xAD, 0xAD, 0x97, 0x8F, 0xE8, 0x94, 0xB5, 0x83, 0x8D, 0x80, 0xB7, 0xBB, 0x9D,
0x9C, 0xEB, 0xB9, 0xE8, 0x8C, 0xAF, 0x97, 0x89, 0x97, 0xAD, 0x93, 0x8B, 0x83, 0x9E, 0x8C, 0x8B,
0x8B, 0x91, 0x9E, 0x98, 0xAA, 0x8B, 0x8B, 0x8C, 0x90, 0x98, 0x8E, 0x9F, 0xA2, 0x9C, 0x86, 0xB4,
0x8E, 0x9C, 0x97, 0xBD, 0x89, 0x8C, 0x9B, 0xBD, 0x89, 0x9D, 0xE3, 0xA9, 0x80, 0x9D, 0xB6, 0xAF,
0x80, 0xE9, 0x97, 0xBD, 0x88, 0xE8, 0xEB, 0xB3, 0x89, 0x9E, 0x9F, 0x96, 0x97, 0x9B, 0xB1, 0x9D,
0x9B, 0xEB, 0x8F, 0x9F, 0x99, 0xAD, 0xAD, 0x99, 0x89, 0x8C, 0x8B, 0xA2, 0x93, 0xA0, 0x9B, 0xB2,
0x98, 0xBD, 0x94, 0x8C, 0x98, 0x9B, 0x97, 0x97, 0x9D, 0xB6, 0x98, 0xB2, 0xB9, 0xB7, 0x9C, 0xA9,
0x86, 0xB4, 0xB8, 0x9D, 0x8C, 0xA9, 0xB9, 0xA3, 0x98, 0x9C, 0xBF, 0x92, 0x88, 0xB6, 0xB9, 0xB7,
0xEF, 0xB2, 0xB8, 0x99, 0x98, 0xA3, 0xB8, 0xE8, 0xE3, 0xEA, 0x93, 0x9F, 0x94, 0x98, 0x97, 0x89,
0x97, 0xAD, 0x93, 0x8B, 0x83, 0x90, 0x91, 0xB5, 0x80, 0x93, 0xB2, 0xAC, 0xB9, 0x94, 0x9B, 0x8B,
0xB1, 0x98, 0x9C, 0xB2, 0x88, 0xB2, 0x80, 0x9D, 0xEB, 0xAA, 0xB8, 0xB4, 0x94, 0x9B, 0xB9, 0x9D,
0x9C, 0xA3, 0x86, 0xB4, 0x83, 0x8D, 0xA2, 0xA9, 0x80, 0x8D, 0xA2, 0xA0, 0x96, 0xB7, 0x94, 0xAC,
0xB8, 0x8E, 0x9B, 0xBF, 0x9C, 0xAD, 0xEA, 0xA2, 0x94, 0xB0, 0x9F, 0xAD, 0x97, 0x9E, 0xB9, 0xA2,
0x94, 0x9E, 0x9F, 0xA3, 0x97, 0xB0, 0x8C, 0xBB, 0x9C, 0xAD, 0xEA, 0xA3, 0x95, 0x9E, 0x9F, 0xA2,
0x97, 0x9E, 0x83, 0xA2, 0x94, 0x9E, 0x9F, 0xA3, 0x97, 0xB0, 0x8C, 0xBB, 0x97, 0x92, 0x8B, 0xA2,
0x99, 0xA0, 0x9B, 0x90, 0x86, 0xB4, 0x98, 0xBD, 0x94, 0x8C, 0x98, 0x9B, 0x83, 0x8E, 0x9B, 0xB6,
0x90, 0x8C, 0x97, 0x8B, 0xE2, 0xAD, 0x9E, 0x8B, 0x83, 0x9E, 0x8C, 0x8B, 0x8B, 0x92, 0x9E, 0x9B,
0x80, 0x94, 0xB8, 0xE9, 0xBE, 0xB0, 0xB8, 0xE9, 0xB9, 0xA2, 0x93, 0xA0, 0x9B, 0xB2, 0x98, 0xBD,
0x94, 0x8C, 0x98, 0x9B, 0xB5, 0x97, 0x9D, 0xB6, 0x98, 0xB2, 0xB9, 0xB7, 0x9C, 0xA9, 0xB8, 0x9D,
0x8C, 0xA9, 0xB9, 0xA3, 0x98, 0x90, 0x86, 0xB4, 0x8F, 0x99, 0x98, 0x93, 0xB8, 0xE8, 0xA2, 0xB1,
0xBB, 0x8D, 0xEF, 0xB4, 0xB9, 0xA3, 0x98, 0x92, 0xB8, 0x8D, 0x90, 0x93, 0x97, 0x8B, 0xEE, 0xAD,
0x9E, 0x9B, 0x83, 0x9E, 0x8C, 0x8B, 0x8B, 0x96, 0x9E, 0x9B, 0x8C, 0x9E, 0xB8, 0x9D, 0xE3, 0xEB,
0x80, 0x9E, 0x9F, 0xBC, 0x97, 0x98, 0xEA, 0x9D, 0x9B, 0xEB, 0x8F, 0x9F, 0x9B, 0xAD, 0xAD, 0x8D,
0x8F, 0x9D, 0x9C, 0xA3, 0x83, 0x8D, 0xA2, 0xB6, 0x86, 0xB4, 0xB8, 0x92, 0x97, 0xBD, 0x89, 0x82,
0x94, 0xA0, 0xBE, 0x8D, 0xB6, 0xAF, 0x80, 0xA3, 0x98, 0x9E, 0x8B, 0x89, 0x9B, 0xB0, 0x97, 0x8E,
0x99, 0x99, 0x9B, 0xB3, 0x93, 0xAD, 0x9E, 0x8B, 0x83, 0x90, 0x91, 0xB5, 0x80, 0x93, 0xB2, 0xAC,
0xB9, 0x94, 0x9B, 0x8B, 0x9F, 0x98, 0x98, 0x8B, 0x9B, 0x9E, 0xBD, 0xBD, 0x93, 0x8A, 0x9B, 0x9E,
0x99, 0x99, 0x9B, 0xBD, 0xB5, 0x99, 0xBD, 0xBD, 0x93, 0x98, 0x86, 0xB4, 0x9B, 0x96, 0xB4, 0xA2,
0x93, 0xB9, 0x9D, 0xA9, 0xB2, 0xE3, 0xB5, 0xA0, 0xB2, 0x8F, 0x8C, 0xB8, 0xA3, 0xE2, 0xB7, 0xB6,
0x99, 0xB9, 0xEF, 0x82, 0x8B, 0xA2, 0x91, 0x94, 0xBC, 0x8D, 0xEC, 0xBE, 0x9D, 0x8D, 0xF5, 0x89,
0xB4, 0x91, 0xB8, 0xA2, 0xAA, 0xAB, 0xA8, 0x82, 0xBC, 0xAA, 0x8B, 0xEA, 0xBD, 0x94, 0x95, 0xEC,
0x8D, 0xB5, 0x96, 0x93, 0xF5, 0x9F, 0x95, 0x89, 0xAD, 0xB1, 0xED, 0x99, 0x86, 0xB4, 0x80, 0xB8,
0xB5, 0xF5, 0x91, 0xB9, 0xF5, 0xEA, 0xBB, 0xB8, 0xB7, 0xAF, 0xE8, 0xEC, 0x83, 0xBF, 0xA2, 0xB3,
0xB3, 0x92, 0x9F, 0xBC, 0xEA, 0x9C, 0xBE, 0xB0, 0x89, 0xF1, 0xE3, 0xA3, 0x89, 0x92, 0xAB, 0x90,
0x95, 0xBD, 0xBC, 0xEC, 0xB1, 0x91, 0xB9, 0xB6, 0x99, 0xE3, 0x90, 0x99, 0xEE, 0x9E, 0xA8, 0xF1,
0x9C, 0x9D, 0x80, 0x93, 0x89, 0x9D, 0xE3, 0x9D, 0xE8, 0xBC, 0xB1, 0xA0, 0x8E, 0xB4, 0x86, 0xB4,
0x94, 0xB9, 0xA9, 0xA8, 0x92, 0xB1, 0xE3, 0xB8, 0xAE, 0xB3, 0xB3, 0xEE, 0xAD, 0x9E, 0x80, 0xE3,
0x91, 0xB0, 0xA0, 0xF1, 0xE9, 0xE3, 0xE2, 0x99, 0xE9, 0xA3, 0xA9, 0xA2, 0x91, 0xE8, 0xEB, 0xA2,
0xB0, 0xB1, 0xB1, 0xF1, 0x88, 0xBF, 0xEB, 0x95, 0x82, 0xB6, 0xE2, 0x9F, 0xF1, 0x8F, 0xB2, 0xB9,
0xEC, 0xED, 0xB0, 0xB8, 0xA0, 0xEA, 0xF5, 0xEA, 0x8E, 0xB0, 0xBE, 0xEA, 0xBE, 0xED, 0x90, 0xA9,
0x86, 0xB4, 0xB0, 0x8C, 0xB0, 0xAE, 0x91, 0x80, 0xA2, 0x8B, 0xAE, 0xA9, 0xE3, 0x89, 0x8C, 0xE9,
0x91, 0xA0, 0xA8, 0xAF, 0xAD, 0xBC, 0x8E, 0xA3, 0xB2, 0xBD, 0xB1, 0x8D, 0xF5, 0xEE, 0x8C, 0xA2,
0xB7, 0x8A, 0xEE, 0x88, 0x99, 0x90, 0xAB, 0xBB, 0xEB, 0x8E, 0xBD, 0x9E, 0x96, 0x8C, 0x96, 0xE3,
0xE2, 0xBC, 0x80, 0xB0, 0x8E, 0x8B, 0x98, 0x9D, 0xE3, 0xB9, 0x95, 0xB0, 0xE9, 0xAE, 0x9D, 0x88,
0x91, 0xBE, 0x86, 0xB4, 0x80, 0xAE, 0xE9, 0x9F, 0x8C, 0xE9, 0x8B, 0xBE, 0x9E, 0x82, 0x9C, 0x8A,
0xEA, 0xE2, 0x89, 0xEC, 0xE8, 0x99, 0xB1, 0x97, 0x95, 0xA2, 0x8D, 0xB4, 0xF1, 0x9C, 0xBE, 0xBB,
0xE3, 0x98, 0x8A, 0xBD, 0xEC, 0xA0, 0xE2, 0xE9, 0xB4, 0xBF, 0xF1, 0x8E, 0xA0, 0xB7, 0x88, 0x9F,
0x90, 0xEE, 0xB2, 0xB6, 0xBB, 0xBC, 0xB0, 0xE8, 0xB1, 0x88, 0xBD, 0xF1, 0xEB, 0xBE, 0x91, 0xA9,
0x99, 0x94, 0x8F, 0xA0, 0x86, 0xB4, 0x80, 0x94, 0xF1, 0xB4, 0x92, 0x83, 0x8C, 0xB1, 0xA2, 0x94,
0x96, 0xB6, 0xE3, 0xB0, 0x94, 0xF5, 0xEE, 0xEB, 0xEF, 0x99, 0xBE, 0x82, 0x9B, 0x8A, 0x94, 0xBC,
0x8D, 0x83, 0xB5, 0xB3, 0xB8, 0xAD, 0xBF, 0x9D, 0xEA, 0x8B, 0xB0, 0x93, 0xEE, 0x96, 0xBE, 0xE9,
0xF5, 0xAF, 0xBF, 0xEA, 0x9E, 0x8F, 0x9F, 0xB7, 0x95, 0x83, 0xEE, 0xAE, 0xAF, 0xED, 0xB5, 0xBC,
0x8B, 0x95, 0x9E, 0xB4, 0x97, 0x9F, 0x86, 0xB4, 0xE8, 0x8E, 0xB2, 0x8D, 0xA8, 0x91, 0x9C, 0xE2,
0x92, 0x89, 0xB4, 0xA2, 0xB2, 0xE2, 0xB5, 0x9C, 0x94, 0x8E, 0x98, 0xB7, 0xE2, 0x90, 0xEF, 0x90,
0xB2, 0xE9, 0xAA, 0x8E, 0xAC, 0x91, 0xAD, 0xF1, 0xAE, 0x90, 0xBE, 0xAB, 0xB8, 0x9B, 0x8F, 0xB3,
0xE3, 0xA3, 0xB1, 0x9B, 0x94, 0xED, 0xF5, 0x97, 0xF1, 0x94, 0xAD, 0xA2, 0xB4, 0x83, 0xEF, 0xB8,
0xEB, 0xAD, 0xBD, 0xBE, 0xBE, 0x92, 0xBB, 0x8B, 0x86, 0xB4, 0xB1, 0xA2, 0xBB, 0xBF, 0xBE, 0xBB,
0xA8, 0xB4, 0xAD, 0x8B, 0xBC, 0x88, 0x93, 0x9C, 0xBB, 0x8C, 0xAC, 0x94, 0x99, 0x88, 0xB9, 0xB5,
0x80, 0x8C, 0x9E, 0xE3, 0xAB, 0xAE, 0xEC, 0xAC, 0xF5, 0xB0, 0xB4, 0x93, 0xE2, 0xA2, 0x9F, 0x8E,
0xA2, 0xBC, 0x95, 0xB0, 0xBE, 0xEC, 0x8D, 0x95, 0xBC, 0xBD, 0xE9, 0xEE, 0x80, 0xAB, 0xBE, 0xA3,
0x82, 0x96, 0x82, 0xEE, 0xAE, 0xAE, 0xAB, 0x91, 0xEA, 0x97, 0x86, 0xB4, 0x9F, 0xBD, 0x93, 0xE8,
0x92, 0xA2, 0xAD, 0x88, 0xB2, 0x8D, 0x9B, 0xAC, 0x92, 0xB6, 0xEF, 0xB5, 0x88, 0xED, 0x92, 0x89,
0xE3, 0xBD, 0x99, 0xA2, 0x97, 0x83, 0xEF, 0x90, 0xAC, 0x8A, 0x8B, 0xE2, 0x89, 0xF1, 0xBB, 0xAF,
0xEB, 0x82, 0x89, 0xF5, 0xA2, 0xAD, 0xF5, 0x96, 0xEE, 0x95, 0x90, 0x8C, 0x83, 0x8E, 0xA8, 0x95,
0x8C, 0x8D, 0xAF, 0xAC, 0xA0, 0x92, 0xEF, 0xEA, 0x94, 0xA9, 0xA8, 0x92, 0x86, 0xB4, 0xB7, 0xB9,
0x88, 0xEE, 0x94, 0xEC, 0x9E, 0xEF, 0xF1, 0x9F, 0x83, 0x89, 0xA8, 0xA3, 0xAF, 0x96, 0xB2, 0x96,
0xF1, 0x94, 0xAF, 0xB0, 0xF5, 0x9C, 0x8F, 0xE9, 0xED, 0xF1, 0xA0, 0xB8, 0x91, 0xB9, 0x80, 0x91,
0x9E, 0xEB, 0xAB, 0x93, 0x92, 0x97, 0xB4, 0xE9, 0xBC, 0xB8, 0xBC, 0xB5, 0xA3, 0xA9, 0xAA, 0x9C,
0xE9, 0xED, 0x91, 0x98, 0xB1, 0xB8, 0xBD, 0xBC, 0xE2, 0x91, 0xF1, 0xEB, 0x99, 0xAB, 0x86, 0xB4,
0x96, 0xB9, 0xE8, 0x8F, 0x8F, 0xA9, 0x89, 0xB7, 0x80, 0x96, 0x9E, 0xB4, 0x88, 0xF1, 0xB0, 0x9E,
0xEA, 0x8E, 0xE2, 0xA0, 0x9F, 0xA3, 0x98, 0x8E, 0x88, 0xEB, 0xBB, 0xE3, 0xB3, 0x99, 0x9B, 0x9B,
0xA3, 0xE2, 0xAC, 0xEF, 0xEA, 0x95, 0xB1, 0xF1, 0x93, 0x90, 0x92, 0x80, 0x9B, 0xBD, 0x97, 0x98,
0x9B, 0x9B, 0x9D, 0xB0, 0xBD, 0xBD, 0x93, 0xB0, 0x97, 0x93, 0x93, 0x99, 0x92, 0xA0, 0x9B, 0x8A,
0x86, 0xB4, 0x98, 0xBD, 0x94, 0x8C, 0x92, 0x88, 0x97, 0x98, 0x9B, 0xBC, 0xE2, 0x9F, 0x98, 0x8E,
0x9B, 0x9E, 0x9B, 0x8B, 0x92, 0xF5, 0x97, 0x9B, 0xE2, 0x9D, 0x9B, 0xEB, 0x8F, 0xBE, 0x90, 0x9B,
0x9F, 0x98, 0xF5, 0xAD, 0x8B, 0x9C, 0x97, 0x9B, 0x95, 0x9B, 0x9B, 0x8B, 0x9B, 0xAD, 0x99, 0xBD,
0x83, 0x9E, 0x8C, 0x88, 0xEA, 0xE8, 0x98, 0x9B, 0x97, 0x99, 0x9B, 0x8B, 0x9B, 0xAD, 0x9E, 0xBD,
0x83, 0x9E, 0x86, 0xB4, 0x8C, 0x88, 0xEA, 0x8A, 0x9B, 0x8B, 0x92, 0xF5, 0x98, 0x9B, 0x8B, 0x9E,
0x9B, 0xBD, 0x9F, 0x9D, 0x97, 0x98, 0xEA, 0x9D, 0x9B, 0xEB, 0x8F, 0xBE, 0x9E, 0xBD, 0x8B, 0x8D,
0x98, 0x98, 0x8B, 0xED, 0xB1, 0xA2, 0x92, 0xED, 0x92, 0xF1, 0xBC, 0x88, 0xBC, 0xB1, 0xBD, 0xA9,
0x95, 0xEF, 0xA9, 0x8F, 0x8A, 0x89, 0xAB, 0xB6, 0x8E, 0xEE, 0x8A, 0xE3, 0x89, 0xB0, 0x9B, 0xBC,
0x98, 0xBD, 0x94, 0x8C, 0x86, 0xB4, 0x92, 0x89, 0x97, 0x9F, 0x9D, 0x9E, 0x9B, 0x8D, 0xBD, 0x98,
0x8B, 0xEF, 0x8A, 0x95, 0xB9, 0xBE, 0xB3, 0x8E, 0xAE, 0xA3, 0xEF, 0xF5, 0xB8, 0xBB, 0xEC, 0xA3,
0xA3, 0x9C, 0xEB, 0x96, 0x83, 0x97, 0x88, 0xAB, 0xB6, 0x9B, 0x9F, 0x8E, 0x9B, 0xF5, 0x98, 0xBD,
0xBD, 0xA8, 0x98, 0xBD, 0x9F, 0x9C, 0x98, 0x8B, 0xB9, 0x98, 0x9B, 0x8B, 0x8B, 0xA0, 0x97, 0x9E,
0x9F, 0xAD, 0x96, 0xAD, 0x83, 0x93, 0x86, 0xB4, 0x91, 0xAD, 0x83, 0x98, 0x98, 0x8B, 0x8F, 0x92,
0x97, 0x9B, 0x91, 0x9D, 0x93, 0xE8, 0xB2, 0xEA, 0xBE, 0x92, 0x9B, 0xEC, 0x96, 0xA3, 0xE3, 0xB0,
0x83, 0x89, 0xEF, 0xAD, 0x83, 0x82, 0x90, 0xB2, 0xB8, 0x9D, 0xA2, 0xB6, 0xB8, 0x92, 0x97, 0xAF,
0xB8, 0xB7, 0x8C, 0xEA, 0x96, 0xE8, 0x94, 0xB2, 0x96, 0xE9, 0x90, 0xAC, 0xB8, 0xE9, 0x8B, 0xAF,
0xB9, 0x9D, 0x8C, 0xAE, 0x97, 0x9E, 0xB9, 0x9D, 0x86, 0xB4, 0x9B, 0xEB, 0x8F, 0xBE, 0x92, 0xAD,
0x8B, 0xAD, 0x97, 0x99, 0xEE, 0xAD, 0x96, 0x91, 0x9B, 0xAB, 0xB5, 0x99, 0xB3, 0x9D, 0x90, 0xB7,
0xB2, 0xEA, 0xBE, 0x92, 0x9B, 0xEC, 0x96, 0xA3, 0xE3, 0xB0, 0x83, 0x89, 0xEF, 0xAD, 0x83, 0x82,
0x90, 0xB2, 0xB8, 0x9D, 0xA2, 0xB6, 0xB8, 0x92, 0x97, 0xAF, 0xB8, 0xB7, 0x8C, 0xEA, 0x96, 0xE8,
0x94, 0xB2, 0x96, 0xE9, 0x90, 0xAC, 0xB8, 0xE9, 0x88, 0xBC, 0x86, 0xB4, 0x83, 0xE8, 0x9F, 0xAF,
0x83, 0xE9, 0x90, 0xA9, 0x97, 0x93, 0x93, 0x98, 0x93, 0xAD, 0x83, 0x9E, 0x8C, 0x88, 0xEA, 0xBD,
0x98, 0x93, 0x93, 0x98, 0x9D, 0xB0, 0x99, 0x99, 0x9B, 0x88, 0x83, 0xAD, 0xBD, 0xBB, 0xEA, 0x9D,
0x9E, 0xB3, 0xA9, 0x9D, 0x9B, 0x8B, 0x8B, 0x98, 0xBD, 0xB9, 0xAD, 0xED, 0xBD, 0xE9, 0xEA, 0x99,
0x9B, 0xBD, 0x9F, 0x98, 0x97, 0x93, 0x9D, 0xBB, 0x97, 0x9E, 0xB1, 0x9D, 0x86, 0xB4, 0x99, 0x99,
0xA9, 0x9D, 0x9B, 0x8B, 0x8F, 0x9C, 0x98, 0xAD, 0x93, 0x98, 0x9C, 0xB3, 0xEB, 0xB5, 0xBE, 0x92,
0x88, 0xAD, 0x95, 0xB3, 0xE2, 0xAC, 0x83, 0xE8, 0x9F, 0xAF, 0xB9, 0x9D, 0x9C, 0xA3, 0x83, 0x8D,
0xA2, 0xA9, 0x80, 0x8D, 0xA2, 0xA0, 0x96, 0xB7, 0xEF, 0xB6, 0xBE, 0x99, 0xE3, 0xB0, 0x83, 0x89,
0xE3, 0xAD, 0x83, 0x82, 0x90, 0xB2, 0xB8, 0x9D, 0xA2, 0xB6, 0xB8, 0x92, 0x94, 0xBC, 0x86, 0xB4,
0x83, 0xE9, 0x98, 0xA0, 0x96, 0xB7, 0xB2, 0xEA, 0xB8, 0x8D, 0xAD, 0xAD, 0x82, 0x8B, 0x83, 0x93,
0x91, 0xAD, 0x83, 0x98, 0x98, 0x8B, 0x8F, 0x92, 0x9B, 0xBD, 0x93, 0xAD, 0x8F, 0x8E, 0x9B, 0xBC,
0x9D, 0xB2, 0xB2, 0x8B, 0x83, 0x82, 0x90, 0xB2, 0xB8, 0x9D, 0xA2, 0xB6, 0xB8, 0x92, 0x97, 0xBD,
0x89, 0x9D, 0xE3, 0xA9, 0x80, 0x9D, 0xB6, 0xAF, 0x80, 0xE9, 0x97, 0xA9, 0x93, 0x9D, 0xA2, 0xEA,
0x86, 0xB4, 0x80, 0x99, 0xEE, 0xAD, 0x9B, 0xAD, 0x93, 0x98, 0x9B, 0x88, 0xB5, 0xAF, 0x88, 0x82,
0xB2, 0xEA, 0x80, 0x82, 0x90, 0xAF, 0x83, 0x8D, 0xAD, 0xBD, 0x8B, 0xB7, 0x9C, 0xA0, 0xBB, 0x8D,
0x97, 0xBD, 0x8B, 0xE8, 0x8C, 0xA3, 0xBE, 0x9D, 0xB6, 0xB7, 0xBB, 0x8D, 0x94, 0xB2, 0xBE, 0x9D,
0xE3, 0xAF, 0x93, 0x9C, 0x98, 0xA3, 0x83, 0x8D, 0x94, 0xEA, 0xBB, 0x8D, 0x94, 0xB6, 0x93, 0x9C,
0x94, 0xEA, 0x86, 0xB4, 0x83, 0x82, 0x88, 0xB6, 0xB8, 0x8D, 0x8C, 0xAF, 0xBE, 0x9E, 0x98, 0xB1,
0x98, 0xBD, 0xEE, 0xA8, 0x98, 0xBD, 0x9F, 0x9F, 0x9B, 0x83, 0x92, 0x97, 0x95, 0xEE, 0x94, 0xE3,
0x9B, 0xBD, 0x93, 0x98, 0x9B, 0xB0, 0x98, 0x89, 0x97, 0x9C, 0x9B, 0x9D, 0x99, 0x99, 0xA9, 0x9D,
0x9B, 0x8B, 0x8F, 0x9C, 0x98, 0xAD, 0x93, 0x99, 0x97, 0x9F, 0x8B, 0xAD, 0x92, 0xA2, 0xB5, 0x83,
0x8F, 0x9D, 0x9C, 0xA3, 0x86, 0xB4, 0x83, 0x8D, 0xA2, 0xA9, 0x80, 0x8D, 0xA2, 0xA0, 0x93, 0x9F,
0xB2, 0xAC, 0xB8, 0x9D, 0x88, 0xAA, 0xB8, 0xB7, 0xBE, 0xA0, 0x96, 0x99, 0x98, 0xA9, 0xBE, 0x9D,
0x8B, 0xAF, 0x97, 0x9B, 0x97, 0x99, 0x9B, 0x8B, 0x9F, 0xBB, 0x93, 0x8F, 0x8C, 0xEE, 0xBE, 0x9D,
0x8C, 0xA3, 0xB8, 0xB7, 0x9C, 0xA9, 0x93, 0x9F, 0x90, 0xB2, 0xB9, 0xE8, 0xB6, 0xB0, 0x93, 0x9F,
0x94, 0xB6, 0xB9, 0xB4, 0x88, 0xAA, 0x86, 0xB4, 0x80, 0xB7, 0xB6, 0xB0, 0x83, 0x82, 0x88, 0xB6,
0x93, 0x9C, 0x98, 0xAC, 0xB8, 0x9D, 0xB6, 0xB0, 0xBF, 0x8E, 0x9B, 0x94, 0x98, 0xBD, 0xB1, 0xAB,
0xB2, 0xB1, 0xB3, 0x9D, 0xE3, 0xAD, 0xEA, 0x98, 0x9B, 0x8B, 0xA9, 0x9C, 0x9B, 0x9B, 0x95, 0x99,
0x9B, 0xBD, 0x9F, 0x9B, 0xB0, 0x99, 0xBE, 0x9C, 0xB8, 0x8D, 0xB4, 0xBE, 0xA0, 0x9D, 0xB4, 0xAF,
0xAD, 0xAA, 0xE2, 0xB7, 0xA8, 0xA3, 0xF5, 0xA3, 0x86, 0xB4, 0xB1, 0x95, 0x89, 0x95, 0xEB, 0xEF,
0x94, 0xA3, 0x8F, 0xBC, 0xAF, 0xB2, 0x89, 0xAB, 0x80, 0xEE, 0xB3, 0x89, 0x88, 0xEC, 0xAE, 0xB7,
0xA3, 0x8D, 0xA8, 0xB5, 0xE2, 0x88, 0x92, 0xBB, 0xA8, 0xE3, 0xEE, 0xE3, 0xA2, 0xA0, 0x8D, 0xA0,
0xAF, 0x9C, 0xBE, 0xF1, 0xB1, 0xA2, 0xE3, 0xEB, 0x96, 0x93, 0x92, 0xEA, 0x90, 0x9B, 0xB5, 0xEC,
0xB0, 0xED, 0x98, 0x80, 0x90, 0xBB, 0xE3, 0x80, 0xBB, 0xF5, 0x86, 0xB4, 0x9C, 0x9C, 0x9E, 0xEA,
0xE3, 0xB7, 0x8D, 0x96, 0xEE, 0xAD, 0xED, 0x90, 0xBE, 0xE9, 0xB9, 0xBE, 0xAA, 0x93, 0x9B, 0xA8,
0x92, 0x89, 0xF1, 0xA2, 0xBB, 0x92, 0x8C, 0xAC, 0x92, 0x92, 0xA2, 0xB9, 0xE3, 0x91, 0xA0, 0xF1,
0xBE, 0xE9, 0xA3, 0x9B, 0xB4, 0xA2, 0x97, 0xB4, 0x95, 0x80, 0xB9, 0xB4, 0xB9, 0xAB, 0xB0, 0x8A,
0x82, 0x9B, 0xA2, 0xA0, 0xB8, 0xE8, 0xB2, 0x9B, 0x8A, 0xEC, 0xEE, 0xAD, 0x86, 0xB4, 0xAD, 0x8A,
0x9D, 0x83, 0x98, 0xA8, 0xB5, 0xEC, 0xBD, 0x83, 0xBE, 0xAC, 0xBD, 0x8E, 0x94, 0x93, 0xA9, 0xE9,
0x92, 0x80, 0x9F, 0xB1, 0xBB, 0xB8, 0x94, 0xE8, 0xBF, 0x98, 0xB8, 0x9C, 0x9D, 0xBC, 0xAF, 0x97,
0xE8, 0xE9, 0x99, 0x99, 0x94, 0x93, 0x99, 0x9F, 0xB8, 0xEB, 0x83, 0xB0, 0x80, 0x9D, 0x8C, 0xAC,
0xEE, 0x96, 0x88, 0xAD, 0x98, 0xAD, 0xBD, 0xA9, 0x89, 0xB3, 0xEE, 0xB5, 0xAF, 0xEF, 0x86, 0xB4,
0x8C, 0x88, 0xBE, 0xED, 0xA0, 0x94, 0x90, 0xEA, 0xB5, 0x8B, 0xB4, 0x89, 0x89, 0xA2, 0xB6, 0xE9,
0x8C, 0xBE, 0x97, 0x83, 0xB8, 0xB6, 0xF5, 0x9B, 0xEE, 0xE2, 0x92, 0x89, 0xE3, 0xBE, 0x9B, 0xB0,
0x89, 0xB1, 0xBD, 0xB3, 0xB4, 0x8B, 0xB0, 0xA9, 0xBC, 0xED, 0xBD, 0xBF, 0x99, 0xAB, 0x91, 0xEE,
0xAF, 0x9E, 0xAC, 0x8C, 0xA9, 0x80, 0xBC, 0xB8, 0x8F, 0xAE, 0xEC, 0x9B, 0xE9, 0x95, 0x8E, 0xA3,
0x86, 0xB4, 0xB7, 0xBF, 0xB6, 0x91, 0xE2, 0x8B, 0x9B, 0x8C, 0xB1, 0xE9, 0x82, 0x9E, 0x9B, 0x9D,
0xB5, 0xB7, 0x99, 0x9E, 0x9E, 0x80, 0xB0, 0x89, 0x95, 0xB7, 0xA0, 0xB6, 0xAD, 0xB0, 0x9D, 0xB0,
0xAD, 0xAF, 0x98, 0x94, 0x82, 0x8F, 0x97, 0xAA, 0xEC, 0x98, 0xAA, 0xA3, 0x9E, 0xAC, 0xEC, 0xB5,
0x8E, 0x8E, 0xF1, 0xB5, 0xB1, 0x9B, 0xB7, 0x8B, 0xBD, 0xBB, 0xEB, 0xBD, 0x92, 0xB9, 0xA8, 0x97,
0xB4, 0xBF, 0x86, 0xB4, 0x8F, 0xB5, 0xE9, 0xEE, 0xA3, 0x91, 0xEF, 0xBC, 0xE3, 0x93, 0xB5, 0xF1,
0xAA, 0xE8, 0xBB, 0x8A, 0x96, 0x80, 0x8D, 0x8E, 0xEB, 0x92, 0x92, 0xB3, 0xB0, 0x92, 0x92, 0x8A,
0x8C, 0xEC, 0xA8, 0x8F, 0xBF, 0xBE, 0x9C, 0xE3, 0x88, 0x8C, 0xB1, 0xAF, 0xB4, 0x96, 0x9E, 0x9D,
0x95, 0xB9, 0x97, 0x8B, 0xB6, 0x95, 0x99, 0xB9, 0x82, 0x9B, 0xB1, 0x8D, 0x9E, 0x8F, 0xBB, 0xB1,
0x8C, 0xE3, 0xA3, 0x89, 0x86, 0xB4, 0x99, 0xB9, 0xAC, 0x8C, 0xB2, 0xB8, 0xB2, 0x9B, 0xBF, 0xBD,
0xB8, 0x80, 0xA2, 0x8C, 0x9D, 0x8F, 0xA2, 0xB3, 0xAF, 0x9C, 0x83, 0x8A, 0x9B, 0xB2, 0xBE, 0x89,
0x90, 0xAD, 0x97, 0xB9, 0xEE, 0xB0, 0xAD, 0x8A, 0x90, 0xE8, 0x8A, 0xEC, 0xB0, 0xBB, 0xAC, 0xBC,
0x99, 0xBC, 0x89, 0x96, 0xEE, 0x94, 0xBC, 0xBC, 0xAF, 0x91, 0xE3, 0x96, 0xF5, 0xB3, 0xB3, 0xA8,
0x80, 0xBD, 0xB4, 0xBD, 0xEB, 0x99, 0x86, 0xB4, 0xF5, 0x91, 0xAF, 0xB0, 0xEC, 0x9F, 0xE2, 0x9F,
0xA3, 0x9B, 0x95, 0xED, 0xB1, 0xEB, 0x94, 0x89, 0x97, 0x95, 0x9E, 0x9D, 0xEF, 0x96, 0x98, 0xEB,
0x8C, 0xBD, 0xEF, 0x8B, 0x97, 0xAE, 0x8E, 0xB9, 0xAA, 0xA3, 0x89, 0x8A, 0x8D, 0xB0, 0x83, 0xEA,
0xA2, 0xAF, 0xA9, 0xE3, 0xB2, 0xB8, 0x8F, 0x88, 0x8C, 0xE3, 0x91, 0xA8, 0xBE, 0xBE, 0x97, 0xB4,
0x93, 0x8C, 0xB4, 0xB7, 0xA8, 0xEC, 0x82, 0xB5, 0x86, 0xB4, 0x9B, 0xEE, 0xE2, 0xBC, 0xB6, 0xA2,
0xE9, 0x89, 0x83, 0xAB, 0x82, 0xF5, 0x98, 0x93, 0xB1, 0xB2, 0xEF, 0xAE, 0xA9, 0xF1, 0x9D, 0xE8,
0x95, 0xEA, 0xAF, 0xBC, 0x88, 0xB2, 0xB7, 0xE8, 0x82, 0x93, 0xA8, 0xB1, 0xE2, 0x8F, 0xF1, 0xF1,
0xB9, 0xF1, 0x82, 0x96, 0xAD, 0x98, 0xAA, 0x8A, 0x93, 0x95, 0x94, 0xB5, 0xB8, 0xE3, 0xE2, 0xBF,
0xA2, 0x83, 0x91, 0x9C, 0xEA, 0x93, 0xB1, 0xB0, 0xA8, 0xAE, 0x86, 0xB4, 0xAB, 0xAE, 0x93, 0x97,
0xB0, 0x94, 0x9F, 0xA2, 0x9F, 0x8B, 0xE3, 0x88, 0x90, 0xBF, 0xAE, 0xB1, 0xB1, 0xB7, 0x83, 0xF1,
0x80, 0x8E, 0xE8, 0xB8, 0x80, 0x96, 0xA8, 0xB5, 0x9E, 0xBC, 0x9D, 0xB3, 0x82, 0x93, 0xA0, 0xAE,
0xA2, 0x8B, 0xAC, 0xB9, 0xAF, 0xA0, 0xE8, 0x95, 0xBC, 0xB2, 0xEE, 0xB4, 0x96, 0xEA, 0xEC, 0x97,
0x95, 0x8D, 0x92, 0x89, 0xBC, 0xF5, 0x9B, 0x8C, 0xBD, 0x8D, 0xB9, 0x91, 0x86, 0xB4, 0x99, 0xB7,
0xAA, 0x8D, 0xAB, 0xBE, 0x9D, 0x82, 0xB0, 0xA3, 0xAD, 0xA0, 0x97, 0x8E, 0x96, 0xAA, 0x94, 0xA0,
0xB2, 0xAA, 0xB4, 0xF5, 0x97, 0xE7, 0x86, 0xB4, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0x9F, 0x94, 0x9E,
0xFA, 0x99, 0x9F, 0x88, 0x8E, 0x93, 0x9C, 0x93, 0x99, 0x9B, 0x8E, 0x9F, 0xF7, 0xF7, 0xF7, 0xF7,
0xF7, 0x86, 0xB4, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0x98, 0x9F, 0x9D, 0x93, 0x94, 0xFA, 0x99, 0x9F,
0x88, 0x8E, 0x93, 0x9C, 0x93, 0x99, 0x9B, 0x8E, 0x9F, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0x86, 0xB4,
0x97, 0x93, 0x93, 0x92, 0xA0, 0x8E, 0x99, 0x99, 0x98, 0xB8, 0x8D, 0xBD, 0x9B, 0xAD, 0x93, 0x98,
0x9B, 0xBD, 0x93, 0x90, 0x9B, 0x91, 0x9D, 0xEA, 0xAE, 0xAC, 0xBB, 0xB3, 0x97, 0xA9, 0xB6, 0xF1,
0x97, 0x9B, 0xEA, 0x9D, 0x99, 0x89, 0xAB, 0x9D, 0x89, 0x93, 0xB8, 0xE9, 0x9E, 0x8B, 0x9F, 0x98,
0x99, 0xAD, 0x8F, 0x9B, 0x97, 0x93, 0x9D, 0xBD, 0x97, 0x8B, 0xA9, 0xAD, 0x99, 0x8B, 0x83, 0x9E,
0x86, 0xB4, 0x8C, 0x8B, 0x8B, 0x9D, 0x9F, 0xAD, 0x90, 0x9E, 0x89, 0x9E, 0x9F, 0x8C, 0x97, 0x98,
0x97, 0x9D, 0x9B, 0xEB, 0x8F, 0x9F, 0x98, 0xAD, 0xAD, 0x97, 0x8F, 0xE8, 0x94, 0xB5, 0x83, 0x8D,
0x80, 0xB7, 0xBB, 0x9D, 0x9C, 0xEB, 0xB9, 0xE8, 0x8C, 0xAF, 0x97, 0x89, 0x97, 0xAD, 0x93, 0x8B,
0x83, 0x9E, 0x8C, 0x8B, 0x8B, 0x91, 0x9E, 0x98, 0xAA, 0x8B, 0x8B, 0x8C, 0x90, 0x98, 0x8E, 0x9F,
0xA2, 0x9C, 0x86, 0xB4, 0x8E, 0x9C, 0x97, 0xBD, 0x89, 0x8C, 0x9B, 0xBD, 0x89, 0x9D, 0xE3, 0xA9,
0x80, 0x9D, 0xB6, 0xAF, 0x80, 0xE9, 0x97, 0xBD, 0x88, 0xE8, 0xEB, 0xB3, 0x89, 0x9E, 0x9F, 0x96,
0x97, 0x9B, 0xB1, 0x9D, 0x9B, 0xEB, 0x8F, 0x9F, 0x99, 0xAD, 0xAD, 0x99, 0x89, 0x8C, 0x8B, 0xA2,
0x93, 0xA0, 0x9B, 0xB2, 0x98, 0xBD, 0x94, 0x8C, 0x98, 0x9B, 0x97, 0x97, 0x9D, 0xB6, 0x98, 0xB2,
0xB9, 0xB7, 0x9C, 0xA9, 0x86, 0xB4, 0xB8, 0x9D, 0x8C, 0xA9, 0xB9, 0xA3, 0x98, 0x9C, 0xBF, 0x92,
0x88, 0xB6, 0xB9, 0xB7, 0xEF, 0xB2, 0xB8, 0x99, 0x98, 0xA3, 0xB8, 0xE8, 0xE3, 0xEA, 0x93, 0x9F,
0x94, 0x98, 0x97, 0x89, 0x97, 0xAD, 0x93, 0x8B, 0x83, 0x90, 0x91, 0xB5, 0x80, 0x93, 0xB2, 0xAC,
0xB9, 0x94, 0x9B, 0x8B, 0xB1, 0x98, 0x9C, 0xB2, 0x88, 0xB2, 0x80, 0x9D, 0xEB, 0xAA, 0xB8, 0xB4,
0x94, 0x9B, 0xB9, 0x9D, 0x9C, 0xA3, 0x86, 0xB4, 0x83, 0x8D, 0xA2, 0xA9, 0x80, 0x8D, 0xA2, 0xA0,
0x96, 0xB7, 0x94, 0xAC, 0xB8, 0x8E, 0x9B, 0xBF, 0x9C, 0xAD, 0xEA, 0xA2, 0x97, 0xA0, 0x9B, 0xE9,
0x97, 0x8E, 0x83, 0xA2, 0x94, 0x9E, 0x8F, 0xEA, 0x97, 0xB0, 0x88, 0xBB, 0x9C, 0xAD, 0xEA, 0xA3,
0x95, 0x9E, 0x9B, 0xE9, 0x97, 0x8E, 0x93, 0xA2, 0x94, 0x9E, 0x8F, 0xEA, 0x97, 0xB0, 0x88, 0xBB,
0x97, 0x93, 0x9D, 0xBD, 0x97, 0x8B, 0xA9, 0xAD, 0x86, 0xB4, 0x99, 0x8B, 0x83, 0x9E, 0x8C, 0x8B,
0x8B, 0x9D, 0x9F, 0xAD, 0x90, 0x9E, 0x89, 0x9E, 0x9F, 0x8C, 0x97, 0x98, 0x97, 0x9D, 0x9B, 0xEB,
0x8F, 0x9F, 0x98, 0xAD, 0xAD, 0x97, 0x8F, 0xE8, 0x94, 0xB5, 0x83, 0x8D, 0x80, 0xB7, 0xBB, 0x9D,
0x9C, 0xEB, 0xB9, 0xE8, 0x8C, 0xAF, 0x97, 0x89, 0x97, 0xAD, 0x93, 0x8B, 0x83, 0x9E, 0x8C, 0x8B,
0x8B, 0x91, 0x9E, 0x98, 0xAA, 0x8B, 0x8B, 0x8C, 0x90, 0x98, 0x86, 0xB4, 0x8E, 0x9F, 0xA2, 0x9C,
0x8E, 0x9C, 0x97, 0xBD, 0x89, 0x8C, 0x9B, 0xBD, 0x89, 0x9D, 0xE3, 0xA9, 0x80, 0x9D, 0xB6, 0xAF,
0x80, 0xE9, 0x97, 0xBD, 0x88, 0xE8, 0xEB, 0xB3, 0x89, 0x9E, 0x9F, 0x96, 0x97, 0x9B, 0xB1, 0x9D,
0x9B, 0xEB, 0x8F, 0x9F, 0x99, 0xAD, 0xAD, 0x99, 0x89, 0x8C, 0x8B, 0xA2, 0x93, 0xA0, 0x9B, 0xB2,
0x98, 0xBD, 0x94, 0x8C, 0x98, 0x9B, 0x97, 0x97, 0x9D, 0xB6, 0x98, 0xB2, 0x86, 0xB4, 0xB9, 0xB7,
0x9C, 0xA9, 0xB8, 0x9D, 0x8C, 0xA9, 0xB9, 0xA3, 0x98, 0x9C, 0xBF, 0x92, 0x88, 0xB6, 0xB9, 0xB7,
0xEF, 0xB2, 0xB8, 0x99, 0x98, 0xA3, 0xB8, 0xE8, 0xE3, 0xEA, 0x93, 0x9F, 0x94, 0x98, 0x97, 0x89,
0x97, 0xAD, 0x93, 0x8B, 0x83, 0x90, 0x91, 0xB5, 0x80, 0x93, 0xB2, 0xAC, 0xB9, 0x94, 0x9B, 0x8B,
0xB1, 0x98, 0x9C, 0xB2, 0x88, 0xB2, 0x80, 0x9D, 0xEB, 0xAA, 0xB8, 0xB4, 0x94, 0x9B, 0x86, 0xB4,
0xB9, 0x9D, 0x9C, 0xA3, 0x83, 0x8D, 0xA2, 0xA9, 0x80, 0x8D, 0xA2, 0xA0, 0x96, 0xB7, 0x94, 0xAC,
0xB8, 0x8E, 0x99, 0x99, 0x9B, 0xB3, 0x93, 0xAD, 0x9E, 0x8B, 0x83, 0x90, 0x91, 0xB5, 0x80, 0x93,
0xB2, 0xAC, 0xB9, 0x94, 0x9B, 0x8B, 0x9F, 0x98, 0x98, 0x8B, 0x9B, 0x9E, 0xBD, 0xBD, 0x93, 0x8A,
0x9B, 0x9E, 0x99, 0x99, 0x9B, 0xBD, 0xB5, 0x99, 0xBD, 0xBD, 0x93, 0x98, 0x9B, 0x94, 0x8A, 0x9C,
0x86, 0xB4, 0x8E, 0x91, 0x88, 0xE8, 0xAC, 0xB3, 0xAF, 0xEA, 0xB7, 0xA0, 0x91, 0x9F, 0xEF, 0xA9,
0x9D, 0xBB, 0x97, 0xB9, 0x96, 0x93, 0xEC, 0x95, 0xA0, 0x90, 0x88, 0xEA, 0x8A, 0xB0, 0xEF, 0x96,
0xAB, 0x9C, 0x8A, 0xE9, 0x9F, 0xA9, 0xB7, 0x9D, 0x8D, 0x8F, 0x8B, 0xB0, 0xB5, 0x99, 0xB8, 0x94,
0xAF, 0x9F, 0x9D, 0x80, 0xB7, 0xA0, 0xB0, 0xF5, 0xAA, 0xA3, 0xE8, 0xB5, 0xE9, 0x8C, 0x9D, 0xAB,
0xEB, 0xE2, 0x86, 0xB4, 0xEC, 0x8F, 0x95, 0x8F, 0x9C, 0x8A, 0xE2, 0xE2, 0x83, 0x94, 0xE9, 0xED,
0x93, 0x9F, 0x82, 0x8F, 0xBC, 0x8B, 0x82, 0xB1, 0xBC, 0x97, 0xF5, 0x83, 0xE3, 0x97, 0xED, 0xB7,
0xA3, 0xEE, 0xE3, 0x9E, 0xEE, 0xE3, 0x9B, 0xB8, 0x9E, 0xB8, 0xB8, 0xB8, 0x9F, 0x90, 0x9E, 0xA9,
0xA8, 0xB8, 0xA2, 0xEF, 0x83, 0x97, 0xF1, 0xB0, 0x8D, 0xB8, 0x95, 0xB4, 0x83, 0xE9, 0x9B, 0xBC,
0xAF, 0x8D, 0xAF, 0x8A, 0x86, 0xB4, 0xBC, 0xAE, 0xA2, 0xB8, 0xE2, 0xB4, 0x9E, 0x93, 0xAC, 0x8F,
0xB5, 0xE9, 0xEA, 0x98, 0x94, 0xAD, 0x93, 0xE2, 0xE2, 0x95, 0x8F, 0x9D, 0xB9, 0xAE, 0xE8, 0xA3,
0xAA, 0xAE, 0x97, 0x83, 0xBD, 0xA0, 0xEF, 0xA3, 0x94, 0xA2, 0xA2, 0xB8, 0xA8, 0xB0, 0xBE, 0xBE,
0x91, 0xAB, 0x8C, 0x93, 0xEA, 0xAA, 0xEB, 0xB3, 0xB9, 0xF1, 0x97, 0xE9, 0x92, 0xA0, 0x8E, 0x90,
0xB3, 0xAF, 0xAF, 0xAB, 0xBF, 0x92, 0x86, 0xB4, 0xBC, 0x8F, 0x89, 0xE3, 0xF1, 0xE9, 0x83, 0xA9,
0x97, 0xB1, 0x90, 0x99, 0x9C, 0x8B, 0xEE, 0xF1, 0xA9, 0xE3, 0x96, 0xA0, 0xB6, 0xED, 0xAE, 0xF5,
0x93, 0xEC, 0xA0, 0xB6, 0xBE, 0xAD, 0x99, 0xAB, 0x8F, 0xB3, 0xB9, 0x8C, 0xB0, 0x83, 0x91, 0xEA,
0xA0, 0x9E, 0xA2, 0xE9, 0xB8, 0xED, 0xEE, 0xB3, 0x80, 0x97, 0x8A, 0xEA, 0x91, 0x9E, 0x80, 0x99,
0xAA, 0xEE, 0xB7, 0xB8, 0xAC, 0xBE, 0xED, 0xBE, 0x86, 0xB4, 0xE3, 0xE8, 0xAB, 0x88, 0x80, 0x91,
0x88, 0xEA, 0xA2, 0x89, 0xEA, 0x9B, 0xB3, 0x90, 0xBE, 0xB1, 0xE2, 0xEE, 0xED, 0xEE, 0xB3, 0xA2,
0xEC, 0xE9, 0xAC, 0x95, 0x80, 0xA9, 0xA2, 0xAC, 0xEE, 0x90, 0xB7, 0xAF, 0xB4, 0x8F, 0xAB, 0xBC,
0xEB, 0xF1, 0xA9, 0x9D, 0xA9, 0xBF, 0x80, 0xBD, 0xBD, 0x9C, 0x83, 0xEB, 0x8A, 0xAB, 0xB0, 0xBC,
0xB3, 0x8E, 0xB4, 0xE3, 0xE2, 0xAB, 0x95, 0xB7, 0x92, 0xB6, 0x86, 0xB4, 0xBE, 0x82, 0xBE, 0x90,
0xB7, 0xB0, 0x9D, 0x96, 0xEE, 0xBB, 0x95, 0x8D, 0xF5, 0xEF, 0xB7, 0xAC, 0xBC, 0x8B, 0xB3, 0x93,
0x91, 0xAE, 0xF1, 0xE2, 0x83, 0xB8, 0xA8, 0x9F, 0xEA, 0x98, 0x80, 0xAE, 0xAE, 0xB2, 0xA9, 0x8A,
0x9D, 0x96, 0xEB, 0xBE, 0xB6, 0xEA, 0x98, 0x8F, 0xA8, 0xE2, 0x9C, 0x9C, 0xB0, 0xA0, 0xA9, 0xEB,
0xEC, 0x9D, 0xA2, 0x97, 0xEC, 0x8F, 0xEB, 0xED, 0xAB, 0xA3, 0xE8, 0x96, 0x86, 0xB4, 0xAD, 0xEB,
0x89, 0x8B, 0xAE, 0x80, 0xBB, 0xB7, 0xF5, 0xB9, 0x8A, 0xE2, 0xBB, 0xB9, 0xEB, 0xAD, 0x96, 0x9E,
0xB4, 0x91, 0xF1, 0xA3, 0x80, 0xBB, 0x95, 0x9B, 0x9C, 0xA8, 0xE2, 0xEB, 0x82, 0x83, 0xBB, 0x98,
0xA8, 0xAB, 0xEF, 0xAE, 0xBF, 0xA0, 0x99, 0xEB, 0xB8, 0x99, 0xE8, 0xB2, 0x91, 0xEF, 0xBF, 0x83,
0xBC, 0x97, 0xB9, 0xEC, 0x97, 0xB6, 0xED, 0xAF, 0x92, 0xB1, 0x9D, 0xF5, 0x96, 0xF1, 0x86, 0xB4,
0x8B, 0xB6, 0xEE, 0x8E, 0x8C, 0xBB, 0xB1, 0x8F, 0xB2, 0x96, 0xA9, 0xBB, 0xA3, 0x9B, 0x8E, 0xAB,
0xAC, 0x9D, 0xE2, 0xAC, 0xBC, 0xAF, 0xB3, 0xED, 0xB3, 0x95, 0xEF, 0xB3, 0x98, 0xEC, 0xB2, 0xF1,
0xB1, 0xEF, 0xED, 0xE9, 0x9F, 0x8A, 0xB6, 0xB4, 0x8A, 0xEB, 0x98, 0xBC, 0xBB, 0x9F, 0xA9, 0xA3,
0x9E, 0xEB, 0xA0, 0x9D, 0xBC, 0xB2, 0xEC, 0xA3, 0x96, 0x9E, 0xEB, 0xAE, 0xA0, 0xED, 0xBB, 0xB4,
0x86, 0xB4, 0xBE, 0xEF, 0xE9, 0xB7, 0xA2, 0x9F, 0x9B, 0xA3, 0x9E, 0xB9, 0xB8, 0x99, 0xA0, 0xA0,
0x94, 0xB1, 0xA9, 0x9F, 0x8C, 0x89, 0xB8, 0xF5, 0xBD, 0xB0, 0x8D, 0xB0, 0x8B, 0xB1, 0xB4, 0x88,
0xBF, 0xA0, 0xA0, 0xE9, 0x9B, 0xB4, 0x89, 0x8D, 0x89, 0x99, 0x88, 0x9B, 0xEF, 0x99, 0xAF, 0x94,
0xE3, 0xB2, 0x8C, 0xEB, 0x9E, 0xB9, 0xEE, 0xEC, 0xB2, 0x91, 0xEB, 0x93, 0xAF, 0x94, 0x9F, 0xEA,
0x9B, 0x99, 0x86, 0xB4, 0xA2, 0x9F, 0x97, 0xEC, 0xAE, 0xB0, 0x8E, 0xED, 0xEC, 0x83, 0x9C, 0xAF,
0x8B, 0xA2, 0x94, 0xAF, 0x82, 0xF5, 0x99, 0xAE, 0x8E, 0x9C, 0xB4, 0x97, 0x93, 0x9E, 0x83, 0xB8,
0x9D, 0x98, 0xAA, 0x94, 0xB6, 0xA2, 0x93, 0xB3, 0xBC, 0x90, 0xE2, 0xB5, 0xE3, 0xB0, 0xAB, 0x89,
0x96, 0x8F, 0xBE, 0x9C, 0xBE, 0xA3, 0xEE, 0x94, 0x91, 0x8F, 0x9F, 0xB6, 0xB6, 0x82, 0xA2, 0xED,
0xAB, 0x94, 0xB2, 0x9E, 0x86, 0xB4, 0x91, 0x9C, 0xB4, 0x91, 0xE8, 0x91, 0xAA, 0x8F, 0xEC, 0x96,
0xB9, 0x96, 0xB3, 0xB4, 0x91, 0xB4, 0xA2, 0x98, 0x8B, 0x82, 0xEA, 0x8A, 0xB0, 0x9E, 0xB8, 0xBD,
0xE3, 0xAE, 0xE3, 0x88, 0x98, 0x82, 0xAD, 0x93, 0xBF, 0xEF, 0xA0, 0xF1, 0xAA, 0xF5, 0x9B, 0xBD,
0x97, 0x98, 0x9B, 0x9B, 0x9D, 0xB0, 0xBD, 0xBD, 0x93, 0x9D, 0x97, 0x93, 0x93, 0x99, 0x9B, 0xB0,
0x9B, 0x8A, 0x98, 0xBD, 0x94, 0x8C, 0x86, 0xB4, 0x92, 0x88, 0x97, 0x98, 0x9B, 0xBC, 0xE2, 0x9F,
0x98, 0x8E, 0x9B, 0x9E, 0x9B, 0x8B, 0x92, 0xF5, 0x97, 0x9B, 0xEE, 0x9D, 0x9B, 0xEB, 0x8F, 0xBE,
0x9E, 0xAD, 0x9F, 0x98, 0xF5, 0xAD, 0x8B, 0x9F, 0x9B, 0xAD, 0x93, 0x98, 0x98, 0xB0, 0x9B, 0xBE,
0x98, 0xBD, 0x94, 0x8C, 0x92, 0x8B, 0xEE, 0x9F, 0x9C, 0xBD, 0x8B, 0x8F, 0x95, 0x8E, 0xA0, 0xB4,
0x92, 0x83, 0xB1, 0xED, 0xB9, 0xAF, 0xBC, 0xE8, 0x86, 0xB4, 0xE8, 0xAF, 0xA9, 0xA9, 0xB2, 0xBE,
0x89, 0xE8, 0x9E, 0x9F, 0xBB, 0xAA, 0x8B, 0x98, 0x9F, 0xAD, 0x92, 0xAD, 0x83, 0x9E, 0x8C, 0x88,
0xEA, 0xB0, 0x98, 0x98, 0xBD, 0xAD, 0x9C, 0xB5, 0x9B, 0x8F, 0x95, 0x8E, 0xA0, 0xB4, 0x92, 0x83,
0xB1, 0xED, 0xB9, 0xAF, 0xBC, 0xE8, 0xE8, 0xAF, 0xA9, 0xA9, 0xB2, 0xBE, 0x89, 0xE8, 0x9E, 0x9F,
0xBB, 0xAA, 0x8B, 0x98, 0x9F, 0xAD, 0x8A, 0xAD, 0x83, 0x93, 0x86, 0xB4, 0x91, 0xAD, 0x83, 0x98,
0x98, 0x8B, 0x8F, 0x92, 0x9B, 0x8B, 0x9F, 0x9F, 0x97, 0xA0, 0x9B, 0xA2, 0x97, 0x99, 0xE2, 0x9D,
0x99, 0x99, 0xA9, 0x9D, 0x9B, 0x8B, 0x8F, 0x9C, 0x98, 0xA0, 0x9B, 0x99, 0xB2, 0xB3, 0x94, 0xB5,
0xBE, 0x92, 0x88, 0xAD, 0x95, 0xB3, 0xE2, 0xAC, 0x83, 0xE8, 0x9F, 0xAF, 0xB9, 0x9D, 0x9C, 0xA3,
0x83, 0x8D, 0xA2, 0xA9, 0x80, 0x8D, 0xA2, 0xA0, 0x96, 0xB7, 0xEF, 0xB6, 0x86, 0xB4, 0xBE, 0x99,
0xE3, 0xB0, 0x83, 0x89, 0xE3, 0xA3, 0xB8, 0xE8, 0xE3, 0xEA, 0x96, 0xB4, 0x98, 0xB6, 0xB8, 0x8E,
0x9B, 0xE9, 0x98, 0xBD, 0x94, 0x8C, 0x92, 0x88, 0xE2, 0x9F, 0x97, 0x9E, 0x9B, 0xAF, 0x97, 0x99,
0xA3, 0xBD, 0x91, 0xAB, 0x9B, 0xB5, 0xB2, 0xB3, 0x80, 0xB5, 0xBE, 0x92, 0x88, 0xAD, 0x95, 0xB3,
0xE2, 0xAC, 0x83, 0xE8, 0x9F, 0xAF, 0xB9, 0x9D, 0x9C, 0xA3, 0x83, 0x8D, 0xA2, 0xA9, 0x86, 0xB4,
0x80, 0x8D, 0xA2, 0xA0, 0x96, 0xB7, 0xEF, 0xB6, 0xBE, 0x99, 0xE3, 0xB0, 0x83, 0x89, 0xE3, 0xA3,
0xB8, 0xE8, 0xE3, 0xEA, 0x82, 0xE8, 0x94, 0xB2, 0x96, 0xB7, 0x94, 0xA3, 0xB8, 0x9E, 0x99, 0x99,
0x9B, 0x89, 0x97, 0x9D, 0x9B, 0xEB, 0x8F, 0xBE, 0x93, 0x9B, 0x89, 0x99, 0x9B, 0x88, 0xB5, 0xAD,
0xBD, 0xBD, 0x9F, 0x8D, 0x97, 0x93, 0x9D, 0xAE, 0x98, 0xBD, 0xEE, 0xA8, 0x98, 0xBD, 0x9F, 0x9F,
0x86, 0xB4, 0x9B, 0x83, 0x92, 0x97, 0x95, 0xEE, 0x94, 0xE3, 0x9B, 0xBD, 0x93, 0x98, 0x9B, 0x8E,
0x99, 0x98, 0xB7, 0xB0, 0x9B, 0xEF, 0x98, 0xBD, 0xBD, 0xA8, 0x98, 0xBD, 0x9F, 0x9C, 0x98, 0x8B,
0xB9, 0x99, 0x9B, 0x88, 0x83, 0xAE, 0xBB, 0x92, 0x88, 0xEA, 0xB9, 0x9E, 0xB5, 0xAC, 0x96, 0xE8,
0x94, 0xB2, 0x96, 0xB4, 0x98, 0xB2, 0xB9, 0xB7, 0x9C, 0xA9, 0xB8, 0x9D, 0x8C, 0xA9, 0xB9, 0xA3,
0xEF, 0xAF, 0x86, 0xB4, 0x80, 0x82, 0x8B, 0xAC, 0x83, 0xE8, 0x9F, 0xAC, 0xB9, 0x9D, 0x9C, 0xA3,
0x83, 0x8D, 0xA2, 0xA9, 0x80, 0x8D, 0xA2, 0xA0, 0x82, 0xE8, 0x94, 0xAD, 0xB9, 0xA3, 0xEF, 0xB5,
0xBE, 0x9D, 0xEB, 0xA9, 0x97, 0x9C, 0xEA, 0x9D, 0x99, 0x99, 0xA9, 0x9D, 0x9B, 0x8B, 0x8F, 0x9C,
0x98, 0xAD, 0x93, 0x99, 0x97, 0x9C, 0x9F, 0xAD, 0x92, 0xA2, 0xB5, 0x83, 0x8F, 0x9D, 0x9C, 0xA3,
0x83, 0x8D, 0xA2, 0xA9, 0x86, 0xB4, 0x80, 0x8D, 0xA2, 0xA0, 0x93, 0x9F, 0xB2, 0xAC, 0xB8, 0x9D,
0x88, 0xAA, 0xB8, 0xB7, 0xBE, 0xA0, 0x96, 0x99, 0x98, 0xA9, 0xBE, 0x9D, 0x8B, 0xAF, 0x97, 0x9B,
0x97, 0x99, 0x9B, 0x8B, 0x9F, 0xBB, 0x96, 0xB1, 0x8C, 0xEE, 0xBE, 0x9D, 0x8C, 0xA3, 0xB8, 0xB7,
0x9C, 0xA9, 0x93, 0x9F, 0x90, 0xB2, 0xB9, 0xE8, 0xB6, 0xB0, 0x93, 0x9F, 0x94, 0xB6, 0xB9, 0xB4,
0x88, 0xAA, 0x80, 0xB7, 0xB6, 0xB0, 0x86, 0xB4, 0x83, 0x82, 0x88, 0xAC, 0xB8, 0xB3, 0x98, 0x8B,
0xB9, 0xB7, 0x9C, 0xB0, 0xBE, 0x9D, 0xB6, 0xB0, 0x80, 0x89, 0x98, 0x8E, 0xBE, 0x9D, 0x9C, 0xEA,
0x80, 0x8D, 0xEB, 0xB6, 0xB8, 0xB4, 0x8B, 0xAD, 0x80, 0x9B, 0x83, 0x95, 0x91, 0xAD, 0x83, 0x98,
0x98, 0x9B, 0x9D, 0x98, 0xA0, 0x9E, 0xAF, 0x9E, 0xBC, 0x8B, 0x93, 0x99, 0x9B, 0x8B, 0x93, 0xAD,
0x8F, 0xB0, 0x98, 0x8B, 0x98, 0xBD, 0xBD, 0xA8, 0x86, 0xB4, 0x98, 0xBD, 0x9F, 0x9C, 0x98, 0x8B,
0xB9, 0x99, 0x9B, 0xB0, 0x98, 0x9F, 0x97, 0x98, 0xE2, 0xBB, 0x9D, 0x9C, 0x98, 0xB2, 0xB9, 0xB7,
0x9C, 0xA9, 0xB8, 0x9D, 0x8C, 0xA9, 0xB9, 0xA3, 0x98, 0x93, 0xB8, 0xE8, 0xA2, 0xB1, 0xBB, 0x8D,
0xEF, 0xB4, 0xB9, 0xA3, 0xAD, 0xBD, 0xB8, 0x92, 0x88, 0xB1, 0x96, 0xB0, 0x9B, 0x9E, 0x9B, 0xBD,
0x9F, 0x98, 0x9D, 0xB3, 0x9C, 0x9C, 0xBF, 0x92, 0x88, 0xB6, 0x86, 0xB4, 0xB9, 0xB7, 0xEF, 0xB2,
0xB8, 0x99, 0x98, 0x99, 0x83, 0x82, 0x94, 0xAA, 0x83, 0xA3, 0x98, 0x9E, 0x80, 0x82, 0x90, 0xEA,
0xBB, 0x8D, 0x80, 0xAA, 0x83, 0xE8, 0x9C, 0xEA, 0x80, 0x89, 0x98, 0x8B, 0xB8, 0xE8, 0xA2, 0xAA,
0x83, 0xE9, 0xB1, 0xAD, 0x9E, 0x8B, 0x83, 0x90, 0x91, 0xB5, 0x80, 0x93, 0xB2, 0xAC, 0xB9, 0x94,
0x9B, 0x8B, 0x9F, 0x96, 0x98, 0x8B, 0x9B, 0x9E, 0xBD, 0xBD, 0x93, 0x98, 0x86, 0xB4, 0x9B, 0x9F,
0xF1, 0x80, 0x94, 0xA9, 0xB9, 0xEE, 0xE3, 0x88, 0x90, 0xEC, 0x80, 0xAE, 0xB4, 0x8A, 0x9E, 0x8B,
0xEF, 0x88, 0xE3, 0xB4, 0x8D, 0x91, 0x8C, 0xB5, 0x8B, 0x8B, 0x92, 0xAA, 0x90, 0x80, 0xB5, 0xA8,
0xAD, 0xB5, 0x8F, 0x9D, 0xA3, 0xF1, 0x99, 0x8F, 0x89, 0xBC, 0x96, 0xE2, 0xAF, 0xA2, 0xE9, 0xEF,
0xAD, 0xB2, 0xB7, 0xB8, 0xBE, 0xB3, 0x9D, 0x8B, 0x90, 0xE8, 0xED, 0x97, 0xB7, 0xE3, 0x86, 0xB4,
0x80, 0x90, 0x8C, 0xA8, 0xBC, 0x9E, 0x92, 0x91, 0xAE, 0xB7, 0x8A, 0xED, 0xBD, 0x9D, 0xB9, 0x8C,
0xED, 0x8C, 0xF1, 0x97, 0x8D, 0x8C, 0x8A, 0xBF, 0xB4, 0x88, 0xBB, 0x9E, 0xAA, 0xEA, 0xAC, 0xB6,
0xBE, 0xEC, 0xB1, 0xEF, 0xB3, 0x8D, 0xEE, 0x80, 0xB0, 0xA0, 0xE3, 0x93, 0x88, 0xB4, 0x8F, 0x8B,
0xEE, 0xAF, 0xEE, 0xEA, 0xAC, 0xB4, 0x8F, 0xB0, 0xEF, 0xEF, 0xAF, 0xA9, 0xB7, 0x91, 0xEE, 0x8C,
0x86, 0xB4, 0xB9, 0xAC, 0xB9, 0x98, 0xBC, 0x9E, 0xF5, 0x98, 0xB2, 0x9E, 0xEF, 0xED, 0x8B, 0xB0,
0x8B, 0xB8, 0xAE, 0xEB, 0xBD, 0x92, 0x83, 0xEE, 0x88, 0x9E, 0x96, 0xAB, 0x97, 0xB6, 0x94, 0x80,
0xAE, 0x89, 0xA9, 0xA2, 0x97, 0x83, 0xB7, 0xBB, 0xAC, 0xF5, 0x8D, 0x91, 0x93, 0xBC, 0xED, 0xAB,
0xEC, 0x92, 0xB0, 0x8E, 0xB7, 0x97, 0xAE, 0x80, 0x91, 0x98, 0xF1, 0xF5, 0x94, 0xAD, 0x8C, 0xAE,
0xE3, 0xEA, 0x86, 0xB4, 0xEE, 0xA0, 0xAE, 0x97, 0x9D, 0x9E, 0x9B, 0xB8, 0xE3, 0xB6, 0x9F, 0xB0,
0x9D, 0xE9, 0x9E, 0xAB, 0xEE, 0xB1, 0xB6, 0x89, 0xA0, 0x8C, 0xBC, 0x9D, 0x97, 0xEC, 0x9C, 0x96,
0xB8, 0x97, 0xA2, 0xF5, 0x8B, 0xEC, 0xAD, 0xA3, 0xB2, 0xF1, 0xAC, 0x8C, 0xE2, 0x95, 0xB2, 0xE9,
0x8B, 0x8A, 0xF5, 0xE8, 0x9B, 0xEF, 0xF5, 0xE2, 0x93, 0x88, 0x99, 0xEE, 0xA9, 0xAA, 0x8F, 0xAA,
0x88, 0x97, 0xB8, 0x8D, 0x86, 0xB4, 0xAD, 0x9E, 0xBE, 0xAD, 0xA9, 0xAB, 0xBC, 0xB6, 0x99, 0xB8,
0xA8, 0x9E, 0xAA, 0xB5, 0x97, 0x95, 0xA2, 0xED, 0xAA, 0xB4, 0x8C, 0x9B, 0xF1, 0x9B, 0xB6, 0xE3,
0x82, 0xBF, 0x90, 0x83, 0x8F, 0xBE, 0xA8, 0x96, 0xEB, 0x9D, 0xAC, 0xEC, 0x88, 0xBB, 0x80, 0x89,
0x97, 0xEA, 0xB6, 0xF1, 0x83, 0x98, 0x8C, 0x9C, 0x97, 0x9B, 0x93, 0xED, 0x98, 0xEE, 0x89, 0x8B,
0x91, 0xAD, 0xB0, 0xB9, 0x98, 0xED, 0x86, 0xB4, 0x96, 0xAF, 0x8D, 0x8B, 0x9D, 0x94, 0xED, 0x8D,
0x90, 0x8E, 0x92, 0xB9, 0xB8, 0x8F, 0xB7, 0xB3, 0x97, 0xB4, 0xBE, 0xB3, 0xA2, 0xEE, 0xBD, 0xAD,
0x88, 0xAA, 0x98, 0xAE, 0xBE, 0xB8, 0xBB, 0xED, 0x9E, 0xEF, 0xAD, 0x91, 0x96, 0xA2, 0xB9, 0xBF,
0x9B, 0xA0, 0x82, 0xB2, 0x95, 0xA8, 0x9B, 0x96, 0xED, 0xB6, 0x9B, 0xEB, 0xAB, 0x8A, 0xBF, 0x94,
0xB2, 0xE2, 0x94, 0x98, 0xEB, 0x93, 0x99, 0x8E, 0x86, 0xB4, 0xA8, 0xE2, 0xE2, 0x95, 0xE2, 0xED,
0xAF, 0x96, 0xB9, 0x93, 0x90, 0xAA, 0xB5, 0xB0, 0xBF, 0xEC, 0x94, 0xBD, 0xA3, 0xAF, 0xB2, 0xE2,
0xBE, 0xBE, 0x92, 0xBC, 0xF5, 0xAA, 0x89, 0xB1, 0xAB, 0xF5, 0xB1, 0x98, 0x83, 0xB6, 0x8A, 0xEC,
0x89, 0x9B, 0xAC, 0xBD, 0xED, 0xA2, 0xAF, 0xA9, 0xB8, 0x89, 0x9E, 0xBE, 0xAB, 0xAD, 0xB2, 0x8B,
0xBB, 0xB9, 0x80, 0x83, 0xA2, 0xF5, 0x9D, 0x97, 0xA9, 0x9D, 0x86, 0xB4, 0x90, 0xB9, 0xB8, 0xA2,
0xEF, 0xA2, 0x9B, 0xB4, 0xB7, 0xB8, 0xB7, 0xAE, 0xED, 0xE2, 0x89, 0x99, 0xBF, 0xE8, 0xAC, 0xA9,
0x9F, 0xB5, 0x95, 0x9F, 0xB7, 0xA9, 0xF1, 0xB8, 0xE8, 0x8D, 0x99, 0x97, 0xB8, 0xA9, 0x93, 0xB1,
0xB8, 0x98, 0x8C, 0xAE, 0xEB, 0x98, 0xF5, 0xA8, 0xE9, 0xE3, 0xBE, 0xA8, 0xBB, 0x8A, 0x91, 0xED,
0xF5, 0xB7, 0xE2, 0x90, 0x90, 0x83, 0xAA, 0x8B, 0x8A, 0xAD, 0x8D, 0xA3, 0x86, 0xB4, 0xBB, 0x94,
0xF5, 0x9D, 0xEE, 0xBD, 0x95, 0x98, 0x92, 0xAD, 0x91, 0xB8, 0xAE, 0x9B, 0xB4, 0xF1, 0xE3, 0xA2,
0x82, 0x80, 0xA8, 0xB5, 0x94, 0xAB, 0xB6, 0xB0, 0x9B, 0x89, 0x8D, 0x94, 0x83, 0xA9, 0xA2, 0xBF,
0x96, 0x95, 0x80, 0x82, 0xF1, 0xB1, 0xB1, 0x9D, 0xEB, 0xAE, 0xAD, 0xE8, 0xA0, 0x8E, 0xAD, 0x8E,
0x82, 0x9E, 0x95, 0x8E, 0xEB, 0xAE, 0x95, 0xBB, 0x91, 0x95, 0xA2, 0x97, 0x8A, 0x95, 0x86, 0xB4,
0xB3, 0xAB, 0xEE, 0x92, 0xEE, 0x9D, 0x93, 0x90, 0xB9, 0xEC, 0x80, 0x83, 0xEB, 0x80, 0xEB, 0x80,
0xF5, 0x8B, 0xAF, 0xB6, 0xB4, 0x93, 0xAD, 0xEA, 0x8D, 0xEB, 0x8F, 0xE2, 0xA8, 0xBF, 0x8D, 0x97,
0xBF, 0xAF, 0xB0, 0xBB, 0x82, 0x9D, 0xAD, 0xB2, 0xA3, 0xAB, 0x80, 0xB2, 0x99, 0xF1, 0x95, 0xA0,
0xB9, 0xB4, 0xE3, 0xBC, 0x8F, 0x96, 0x8E, 0xF1, 0x8E, 0x83, 0x92, 0x8B, 0x8F, 0x99, 0xA8, 0xB5,
0x86, 0xB4, 0x88, 0x91, 0xA2, 0xF1, 0xAD, 0xF1, 0x8C, 0x97, 0x93, 0x82, 0xAA, 0x93, 0x8D, 0xAC,
0x8D, 0x98, 0xF1, 0xB0, 0xA2, 0xE2, 0xB8, 0xE3, 0xEF, 0xB4, 0x9D, 0xAB, 0xAD, 0xAF, 0xEC, 0xF1,
0xB6, 0xAE, 0xE9, 0x80, 0xE9, 0xA3, 0x9B, 0xAE, 0x83, 0xBB, 0x8F, 0xB8, 0x96, 0xBE, 0x86, 0xB4,
0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0x9F, 0x94, 0x9E, 0xFA, 0x99, 0x9F, 0x88, 0x8E, 0x93, 0x9C, 0x93,
0x99, 0x9B, 0x8E, 0x9F, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0x86, 0xB4, 0xF8, 0xF6, 0xD0, 0xFA, 0xFA,
0xFA, 0xFA, 0xF8, 0xA9, 0xB3, 0xBD, 0xB4, 0xBB, 0xAE, 0xAF, 0xA8, 0xBF, 0xF8, 0xE0, 0xFA, 0xF8,
0xF8, 0xD0, 0xA7
};
// const char* fake_license_data = "{\n \"license\": \"{\\\"name\\\": \\\"PrlPro17\\\", \\\"uuid\\\": \\\"\\\", \\\"lic_key\\\": \\\"\\\", \\\"product_version\\\": \\\"17.*\\\", \\\"is_upgrade\\\": false, \\\"is_sublicense\\\": false, \\\"parent_key\\\": null, \\\"parent_uuid\\\": null, \\\"main_period_ends_at\\\": \\\"2045-05-09 00:00:00\\\", \\\"grace_period_ends_at\\\": \\\"2045-05-09 00:00:00\\\", \\\"is_auto_renewable\\\": false, \\\"is_nfr\\\": false, \\\"is_beta\\\": false, \\\"is_china\\\": false, \\\"is_suspended\\\": false, \\\"is_expired\\\": false, \\\"is_grace_period\\\": false, \\\"is_purchased_online\\\": false, \\\"limit\\\": 10, \\\"usage\\\": 1, \\\"edition\\\": 2, \\\"platform\\\": 3, \\\"product\\\": 7, \\\"offline\\\": true, \\\"cpu_limit\\\": 32, \\\"ram_limit\\\": 131072, \\\"hosts\\\": [{\\\"name\\\": \\\"GDPR_HIDDEN\\\", \\\"hw_id\\\": \\\"\\\", \\\"product_version\\\": \\\"\\\", \\\"activated_at\\\": \\\"2021-05-09 00:00:00\\\"}], \\\"is_trial\\\": false}\",\n \"publicCerts\": \"-----BEGIN CERTIFICATE-----\\nMIIGpDCCBIygAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwdDELMAkGA1UEBhMCUlUx\\nDzANBgNVBAcMBk1vc2NvdzEjMCEGA1UECgwaUGFyYWxsZWxzIElQIEhvbGRpbmdz\\nIEdtYkgxEDAOBgNVBAsMB0Rlc2t0b3AxHTAbBgNVBAMMFFBhcmFsbGVscyBEZXNr\\ndG9wIENBMB4XDTE4MTIyNDA5MDM1N1oXDTI4MTEwNjA5MDM1N1owdzELMAkGA1UE\\nBhMCUlUxDzANBgNVBAcTBk1vc2NvdzElMCMGA1UEChMcUGFyYWxsZWxzIEludGVy\\nbmF0aW9uYWwgR21iSDEQMA4GA1UECxMHRGVza3RvcDEeMBwGA1UEAxMVZGVza3Rv\\ncC5wYXJhbGxlbHMuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\\nzoVPP60oYTjswM8vsWgpNOF9ZyB3wU/sJeYtmeC+0eTVDqYfI8Qq2/AoDLhEIg6c\\nvd8vGDUmXTvkX+r/bZCS9oR6o3M2otsgwMzsRQQgOWfngyB3PVh0V+FM68DoCZZF\\nLSYQ3Ghv7AK21M/g4TcKFY30ngc9avMJeJ6lSLzpEyV6YkDbB0VBcAOSe0AyAUN4\\na957UwRt2hVn5kCr5DPje4w1xXnHIx+MhrhGgUz0stQX2Yu4e2+lpy0rBEU7HIqe\\npCqVSwSeAfrgonwUAB1dTPSZ5wHBYiX30x+UaMScHlHuPOrUy4bS2e5mMR+FWGh9\\nv3oNBRMhLPJG9YIquGE4twIDAQABo4ICOzCCAjcwDAYDVR0TAQH/BAIwADAOBgNV\\nHQ8BAf8EBAMCB4AwHQYDVR0OBBYEFG1biXwSoD4JwjCnq7kqU8fgXNv2MB8GA1Ud\\nIwQYMBaAFALkzfL1GhWDbfCrrwQRxRf52EyPMEEGCCsGAQUFBwEBBDUwMzAxBggr\\nBgEFBQcwAoYlaHR0cDovL3d3dy5wYXJhbGxlbHMuY29tL2NhL3BkX2NhLnBlbTA2\\nBgNVHR8ELzAtMCugKaAnhiVodHRwOi8vd3d3LnBhcmFsbGVscy5jb20vY2EvcGRf\\nY2EuY3JsMIIBJgYDVR0gBIIBHTCCARkwga0GDisGAQQBgcw7g30CAgEBMIGaMDkG\\nCCsGAQUFBwIBFi1odHRwOi8vY2EucGFyYWxsZWxzLm5ldC9jYS9wYXJhbGxlbHNf\\nY3BzLmh0bWwwXQYIKwYBBQUHAgIwUTAfGhhQYXJhbGxlbHMgSG9sZGluZ3MsIGx0\\nZC4wAwIBARouRXh0ZXJuYWwgQmFzaWMgQ2VydGlmaWNhdG9uIFByYWN0aWNlIFN0\\nYXRlbWVudDBnBg4rBgEEAYHMO4N9AgJmAzBVMFMGCCsGAQUFBwICMEcwHxoYUGFy\\nYWxsZWxzIEhvbGRpbmdzLCBsdGQuMAMCAQEaJFBhcmFsbGVscyBEZXNrdG9wIENl\\ncnRpZmljYXRlIFBvbGljeTAyBgNVHREEKzApghVkZXNrdG9wLnBhcmFsbGVscy5j\\nb22CEG15LnBhcmFsbGVscy5jb20wDQYJKoZIhvcNAQELBQADggIBAIVoVvxwMJLa\\ntshoaea1bqsnD2FU1r/FoQy1np5ifKQ7fvDr+z8gY0oKDrObRcYTeiRfSGG1TyXW\\nNfY9nlgbLJO7fM5vpqvj5WQJNaUjIzxNcitNn7teG5c5/C0fkiWeDH9t01gLRpvO\\nk5B4zDf8AHbkjrf73whZziuPhbyCyxjvdnVouP5oPwB9MYQLyxQMlVvYl0BC4wBi\\nkkaymqWBIxeKBWDEQyGvVabsOo1Kro6xk5s6SuutME6L97kmQaRGbOvbCZ95niEH\\neKua/1Ngt9U3Y6fPwP6gVaQglZBcPgs5+4a+hd/8gPZ+XbVXsK68j9eUMuhMoFdK\\ncaNejnQt3Cvsnp7ohSoRY3rKdfG0Idy/4HJCiCCOnDDpPXvqQqAo0cwEhbSjI66Y\\nzdtEkCFpWz23rGElQMxIs6ojwK/gu5+sJpE+l7QpXfCIhryqGqRHpdkSDp7Pc1Jr\\nJMpyNhDEI0QjPXkSnMVxMQuHUidARr43O32yt0VD/Zyt6sb2gmInF6XJrlYCDvOz\\npuKPoOE9EMI74XzKw5FsVhVUp8Wem8Ir7eP6GZ7hP21J7C9tPkiYjJqX6jJvvLE6\\nbPETlL48esW55ZmE57SE+F1oqK/hQ5tDJwneEryJZ+8KoiD42SKaf0k29iQfXH1F\\nYScGlH58rXXjAZv+kHNTsJ+zLX//KpzT\\n-----END CERTIFICATE-----\\n-----BEGIN CERTIFICATE-----\\nMIIH9TCCBd2gAwIBAgICEAMwDQYJKoZIhvcNAQELBQAwdDELMAkGA1UEBhMCUlUx\\nDzANBgNVBAcMBk1vd2NvdzEjMCEGA1UECgwaUGFyYWxsZWxzIElQIEhvbGRpbmdz\\nIEdtYkgxDjAMBgNVBAsMBUNsb3VkMR8wHQYDVQQDDBZQYXJhbGVscyBJc3N1aW5n\\nIENBICMxMB4XDTE4MTIyNDA5MDE1MFoXDTMxMDEyMzA5MDE1MFowdDELMAkGA1UE\\nBhMCUlUxDzANBgNVBAcMBk1vc2NvdzEjMCEGA1UECgwaUGFyYWxsZWxzIElQIEhv\\nbGRpbmdzIEdtYkgxEDAOBgNVBAsMB0Rlc2t0b3AxHTAbBgNVBAMMFFBhcmFsbGVs\\ncyBEZXNrdG9wIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA2r6P\\nz/fE4WESXkudT80kk+dkK/KFM9AqmmHBdx2KRBKXPuOJnQop6dS+ZRRYgyzqvFYl\\nOVy9oZhJ8qtrQH71ornL/ZNIUBMOoQ1Hg9Oqaqwr2b04qWV7RIjW5bG0QBgAYuDX\\nuq5dn1A8uDWoPYdmUrs+oir0kxUugumWSYYzhGOoDxpCSpXqSovYOcyENinD2NFs\\n6T6CJ1MC/yTUyu8oLCMsXimyHfe+pknJ1cSS4i3zQ7tRVdFMvbLdPbOkDaT/ZFyh\\neHOrpBKaeInsNoCoXoOSq9K8CzYq3mEikE/t3PB+8JbCMkf5g+Eup4RjlQeILu/Z\\nqEkGyJtovuRnPha1SUw5Qiz6EyLDaLug6RejPiQZHio10/zovlaN9aF74CGB7Ijj\\nTAMhxN423xKQepFPiPQtnZGke11urD7pyIRJQhQbPJeyHPZLoAY/Zn3Lu03wpqn4\\nuVlEfrvV3pv9gnmme/MUWyegiOxN0xlgBkgjdCo/d74KNjfcD/P4qRa+v50ddlOX\\nhuSAic3LowqizI9+jsU1NSCY/ssMnaFTVCGjtcPq2ZoE6n8NG1dWNEvFJQ1elZDf\\nZUQP/5r5oheEyBnOutJmrMVahCi6ipxv74DPzGqJCX8X7VHr+D2zeEgNrodD3iF/\\nq2yK1qP9/fdOk5CajZVcKextWdYBs9rM+0YF+sECAwEAAaOCAo8wggKLMBIGA1Ud\\nEwEB/wQIMAYBAf8CAQAwDwYDVR0kAQH/BAUwA4ABADAKBgNVHTYEAwIBADAOBgNV\\nHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFALkzfL1GhWDbfCrrwQRxRf52EyPMB8GA1Ud\\nIwQYMBaAFDuTEfsf59F+SCw7mxQ9KqVPg/1KMD8GCCsGAQUFBwEBBDMwMTAvBggr\\nBgEFBQcwAoYjaHR0cDovL2NhLnBhcmFsbGVscy5uZXQvY2Evcm9vdC5wZW0wNwYD\\nVR0fBDAwLjAsoCqgKIYmaHR0cDovL2NhLnBhcmFsbGVscy5uZXQvY2Evcm9vdF9j\\nYS5jcmwwggGMBgNVHSAEggGDMIIBfzCBrQYOKwYBBAGBzDuDfQICAQEwgZowOQYI\\nKwYBBQUHAgEWLWh0dHA6Ly9jYS5wYXJhbGxlbHMubmV0L2NhL3BhcmFsbGVsc19j\\ncHMuaHRtbDBdBggrBgEFBQcCAjBRMB8aGFBhcmFsbGVscyBIb2xkaW5ncywgbHRk\\nLjADAgEBGi5FeHRlcm5hbCBCYXNpYyBDZXJ0aWZpY2F0b24gUHJhY3RpY2UgU3Rh\\ndGVtZW50MGQGDisGAQQBgcw7g30CAgECMFIwUAYIKwYBBQUHAgIwRDAfGhhQYXJh\\nbGxlbHMgSG9sZGluZ3MsIGx0ZC4wAwIBARohRXh0ZXJuYWwgQmFzaWMgQ2VydGlm\\naWNhdGUgUG9saWN5MGcGDisGAQQBgcw7g30CAmYDMFUwUwYIKwYBBQUHAgIwRzAf\\nGhhQYXJhbGxlbHMgSG9sZGluZ3MsIGx0ZC4wAwIBARokUGFyYWxsZWxzIERlc2t0\\nb3AgQ2VydGlmaWNhdGUgUG9saWN5MA0GCSqGSIb3DQEBCwUAA4ICAQApB9JZT+cw\\nKSGZuR5Lje1lgxueMEkq0QrBUgIaijImTo5nwD3jSpHX3iwX11DA0wvDDhS2bPOY\\nCvOn9KFy+iIli0cc1/4kBH/DYsAh+SUdZs/w3G/0JsucQD5AaL3pehsf3dZfR7cq\\n3q8D6ia/SoMrDLpQCJjm798yUevi4ZNJwEHIOH5gNv76eCx+nNJHvnw0yKKfq52M\\nh6aVRBiF73LcvCmNtgeDJxPUAdbVYgv7b0zpgypkph0aWQP90tqPAWnpjHQ2P7/o\\nP+ynKB3dX6ZcA5CJ5o4jXJX/+vS1HQWuTU8ChYBxFB67eCPDtbwtRwLmS4TTLBpX\\ngEWW8jaJCm4sYLMmj/uw3AqrXH3TFZEdaqhXT9s6igBL7V0NrC2rIpqjg9b1ZybY\\nZa/gCfPJ73sIUkFola1Kr50Sjar6aFfQDjYCfZeC6s4VgR6p0bs7jr61zwsPUlCu\\nAZWAiMtpzAq6YJY3njXTZQnlFZ2eAmgxYDaCRgjDnZtHVN8sVsc6vBJh6XaR84t+\\nitDGJfpm0RXOy2bblmleVPBDbGDruOzNJvB+0H6PbMqY1ROy4ZcLKVftQzScYBUQ\\ndDdT+4gPkIu1YhzBQjMNF/kPwUPE8WvVpe5bT+VMj7tIX2wQIJcdNGIvyCQ5aWoq\\neo6QhWmNlc3k/k63MhxRNe55cq64VyskFA==\\n-----END CERTIFICATE-----\\n-----BEGIN CERTIFICATE-----\\nMIIHvTCCBaWgAwIBAgIJAKfE9q7ikq7mMA0GCSqGSIb3DQEBCwUAMIGgMQswCQYD\\nVQQGEwJDSDEVMBMGA1UEBwwMU2NoYWZmaGF1c2VuMSMwIQYDVQQKDBpQQVJBTExF\\nTFMgSVAgSG9sZGluZ3MgR21iSDELMAkGA1UECwwCSVQxIzAhBgNVBAMMGlBhcmFs\\nbGVscyBFeHRlcm5hbCByb290IENBMSMwIQYJKoZIhvcNAQkBFhRhZG1pbnNAcGFy\\nYWxsZWxzLmNvbTAeFw0xNjEwMDcxNDEyMjVaFw0yODExMDYxNDEyMjVaMHQxCzAJ\\nBgNVBAYTAlJVMQ8wDQYDVQQHDAZNb3djb3cxIzAhBgNVBAoMGlBhcmFsbGVscyBJ\\nUCBIb2xkaW5ncyBHbWJIMQ4wDAYDVQQLDAVDbG91ZDEfMB0GA1UEAwwWUGFyYWxl\\nbHMgSXNzdWluZyBDQSAjMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB\\nALnxIcGsh9ozhUVby8mlCc5XQxKNfW6dGW/SnKbxpqrXfpQ0gNO6WoLI/EOSwk7C\\nZbo/Kc/0abmu26YexiiHEf0FdjS+9ySHqJOgf6kKclC9JC4Dr+FGZISG9G2fkzTn\\nNcsrHk9btii4wDZ9Kjz+398C3ysxK21xjkk+Re1OXl8E+Uhc67jbz0/0Tjd0d7Js\\njVjtKZxQts9SV3KzruwfTyhgkW/4VxmP4RCJqa1TgDLVL98fZjTQBG9cOj3tGRKd\\nZt3EV3QdDXFP08S62CkMOxWn+Fda9BPg6z83ne+TzmREJ4hlafj2kRg+1dKsCNUz\\nZN+nHYVkxNLl9jN/415CdXAPNfWYoibweG0QjI4Ld3/ue0DUEmOY4tu7ofQODnME\\n2ThWrKF8HSnxh8oFNTBm8J5Jh3pTvKw+tJdqbAUi9ykAN7/M+NwxnY5b1wgddHaQ\\nkxaedarnwQfRIFaVvNCRcoZVD9qt6v/jnI8xETxfOjd6WOfg34ZqdyXLX4ttqK0M\\nEgI2HxwRhWAvHl5oR7HS9gCxMY5JvPQ8S+au1XS/xw/L4OJVYTrOVWuvzH50NsrH\\nmcR4N6D5+EYSryuLhL+Nuj/FU37+zbKcZKD1qIHMn3fbfoyspF37KBkbgf8K+1Cq\\nLc2UUsSmZLDnR+jD0T8zEyBTR1a9iCAAy8v50Ok+IJHZAgMBAAGjggIjMIICHzAP\\nBgNVHRMBAf8EBTADAQH/MA8GA1UdJAEB/wQFMAOAAQAwCgYDVR02BAMCAQAwDgYD\\nVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQ7kxH7H+fRfkgsO5sUPSqlT4P9SjAfBgNV\\nHSMEGDAWgBQ5POcdiTty5/ba6yyF1LYMRqlAETA/BggrBgEFBQcBAQQzMDEwLwYI\\nKwYBBQUHMAKGI2h0dHA6Ly9jYS5wYXJhbGxlbHMubmV0L2NhL3Jvb3QucGVtMDcG\\nA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly9jYS5wYXJhbGxlbHMubmV0L2NhL3Jvb3Rf\\nY2EuY3JsMIIBIwYDVR0gBIIBGjCCARYwga0GDisGAQQBgcw7g30CAgEBMIGaMDkG\\nCCsGAQUFBwIBFi1odHRwOi8vY2EucGFyYWxsZWxzLm5ldC9jYS9wYXJhbGxlbHNf\\nY3BzLmh0bWwwXQYIKwYBBQUHAgIwUTAfGhhQYXJhbGxlbHMgSG9sZGluZ3MsIGx0\\nZC4wAwIBARouRXh0ZXJuYWwgQmFzaWMgQ2VydGlmaWNhdG9uIFByYWN0aWNlIFN0\\nYXRlbWVudDBkBg4rBgEEAYHMO4N9AgIBAjBSMFAGCCsGAQUFBwICMEQwHxoYUGFy\\nYWxsZWxzIEhvbGRpbmdzLCBsdGQuMAMCAQEaIUV4dGVybmFsIEJhc2ljIENlcnRp\\nZmljYXRlIFBvbGljeTANBgkqhkiG9w0BAQsFAAOCAgEAjCdFbWndzGnuwp8mry/y\\nkOSO15NyUfuhSqZ4iSR6tmyWro8RHar949xzWzuFd+kx91LIH0JAo6j7BZJa9Za/\\nFFD09mWL4w7Jd3cdpIArHS+xaHVvHHxc9Kz+d3yAnxMnOZcncqjPXAxzb2hAP64w\\nwPGYBro6gYdvgTNIs3HZEkabN2eBbFGfuM23CCNICEb1YjZGVv4LRwBwgsSi4ou5\\nVRd7zNJ0oQnSSxl3VdMYbl/A48HS9dAjSkginQjsf7geCqK4uDvVsZfbUt6A3OTy\\nmelK8QAVk3XDAGomCDDZjSOmzlwjGjwuBNXUMp6BpyDv6oTT+okAmQga1gHcrMne\\nUo34yK5f9Io+p2aPLZWT1HHijHHPV6rUedF9RVkunLDGOcMQlOCcXAkWDUakV9yS\\nCcvVhbhAegbZxVGUxiuFYPAhdSJwMc4jwPJ2P6javfCfSL4NffuK9L/iirZgng1C\\n/Kuj6E8EyAO7k1NSMODG5LB1Vg5QMtTcpySPWjY0xus9hbURV9KrddMnIVnmr6Xo\\nA48flx3SYqX/BIkh5ts+G2O0ufRhm2XIrk8U++c+XLwBpPIONob98exYKF0Ikjrt\\nqtIMjNExEQ9RJetkkmY+ZT2bZLroDfGiXIztxQvcuz2Ofh4nL06MOWHSf/AVgWcK\\nCmpWqdGXjywzMTLpNzhpn/M=\\n-----END CERTIFICATE-----\\n-----BEGIN CERTIFICATE-----\\nMIIHzTCCBbWgAwIBAgIJAKG0tvaiMsl+MA0GCSqGSIb3DQEBCwUAMIGgMQswCQYD\\nVQQGEwJDSDEVMBMGA1UEBwwMU2NoYWZmaGF1c2VuMSMwIQYDVQQKDBpQQVJBTExF\\nTFMgSVAgSG9sZGluZ3MgR21iSDELMAkGA1UECwwCSVQxIzAhBgNVBAMMGlBhcmFs\\nbGVscyBFeHRlcm5hbCByb290IENBMSMwIQYJKoZIhvcNAQkBFhRhZG1pbnNAcGFy\\nYWxsZWxzLmNvbTAeFw0xMzA3MTYxNDU0MjRaFw0yODA3MTIxNDU0MjRaMIGgMQsw\\nCQYDVQQGEwJDSDEVMBMGA1UEBwwMU2NoYWZmaGF1c2VuMSMwIQYDVQQKDBpQQVJB\\nTExFTFMgSVAgSG9sZGluZ3MgR21iSDELMAkGA1UECwwCSVQxIzAhBgNVBAMMGlBh\\ncmFsbGVscyBFeHRlcm5hbCByb290IENBMSMwIQYJKoZIhvcNAQkBFhRhZG1pbnNA\\ncGFyYWxsZWxzLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANPF\\nTKR2viu0mzKE5sGaMcLI6OzJR0Pj5LqFP3EsmGWUQjoCbNuEGZmzj/py2o3VGq18\\n6UOUFP88YN37IEXUfQXkfM/Y9M7my49D49AbDbbbEJDsrbx5YM+jWbOnY3AfuWuP\\nftxb8nDIvUo30BNwI88OUGct2yptMYgz5yNxxbrjddKqVI0p1ic+M3HzTJiuuqeH\\nfUS9+3YsMkJCFQ4+s9Lzl7t/I6zldwCqUicVjYK0zDx3b74iZMP0KDZCp4mbvd7d\\n92qRZKR0xS0AiJdk8474ix63vOZsxv4JmunUqf1+sGseZggFY1PqjfiTn98qOmHl\\ndXdJmjGL4aOW/5mvfQiIKt+8YbrE0BZtthsPGL1dl0BUr8FFjzs16GxM6U17qy2L\\nw1SQtZam/cP8ac1wLDnK+yZaOAFr81XYaBrq5tezC1bC2hK5eYfMc6Ml7uHkG/L+\\nQl4TVakUhLsayATqvG8vfui7iO5iB6h+k573EPlnP1BfaEsyD1zGfh6yLD1tz7an\\nd53mxEAyDcbCzzNksEVSb/gjWjQknRezz3AnSWSCRA5CuN9hV1Dc46hK1IuNE0AC\\nxEM6tjT76YFuQxNuX/CtTFnMIDYbGBpNlxIifJ8o9jqSLUdFdy4NKUEllXx7qNhD\\nKFnK2KpU6LcLinKnxBQX0PjDbg9t9RBXwIe5z+p/AgMBAAGjggIGMIICAjAPBgNV\\nHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUOTznHYk7cuf2\\n2usshdS2DEapQBEwHwYDVR0jBBgwFoAUOTznHYk7cuf22usshdS2DEapQBEwPwYI\\nKwYBBQUHAQEEMzAxMC8GCCsGAQUFBzAChiNodHRwOi8vY2EucGFyYWxsZWxzLm5l\\ndC9jYS9yb290LnBlbTA3BgNVHR8EMDAuMCygKqAohiZodHRwOi8vY2EucGFyYWxs\\nZWxzLm5ldC9jYS9yb290X2NhLmNybDCCASMGA1UdIASCARowggEWMIGtBg4rBgEE\\nAYHMO4N9AgIBATCBmjA5BggrBgEFBQcCARYtaHR0cDovL2NhLnBhcmFsbGVscy5u\\nZXQvY2EvcGFyYWxsZWxzX2Nwcy5odG1sMF0GCCsGAQUFBwICMFEwHxoYUGFyYWxs\\nZWxzIEhvbGRpbmdzLCBsdGQuMAMCAQEaLkV4dGVybmFsIEJhc2ljIENlcnRpZmlj\\nYXRvbiBQcmFjdGljZSBTdGF0ZW1lbnQwZAYOKwYBBAGBzDuDfQICAQIwUjBQBggr\\nBgEFBQcCAjBEMB8aGFBhcmFsbGVscyBIb2xkaW5ncywgbHRkLjADAgEBGiFFeHRl\\ncm5hbCBCYXNpYyBDZXJ0aWZpY2F0ZSBQb2xpY3kwDQYJKoZIhvcNAQELBQADggIB\\nAE+ZNsc49RJ6ZtnPDQ5R9nWKVoQQHpJZorwoUGy+CUSfL8ux35whmbdiGQJ27Mm9\\nZJVrfDHKtmP7gGcV7V+MWVPenRaDp0vld6k5iW4Zjz9IRnUQ4u40vnUj55usmK4V\\ncvcBfD/BhD57QjQbt1gHY4RDLqMlNZtSsxMYmav/WKIf7q6HjTmMtZKB+/NwVt90\\n4ztMGDAb9lEjG3Dq4klSzVfGM6FLbMx/Q6wyh+vV8Oh3QP/2A5/8IRC4spUpRMbW\\nwDdwsqflCbrDpoMOx7pnVA+Al9XeJYUdrL1Gv6RaZSM0l+YBVFMAI7B4SQKwjcB7\\nLuWQGN7WJTHcbUmiMndix4gwRpBtdba7D5wKLxceAzXhOrAL7lA1qPeNh8NB1ICT\\nr88O87uLcIJpoje6Ngyuh8ddHf/pSkq/kBYlP6SAvg7xusbSDdqwhQacZYx/GMsG\\nJcbx5xAnmbmt78SCe2vsEoOEms+b2WCMbsIkbBVt1B/r39draPK7/m8JJYpQPwWy\\naN/G4gOBHwKbtAn+9xXZroNqljASWNYsxeLOZX+kkG1tw2zTwTXDOT1tOaKOxMPO\\niq4H4GIJc6ZY1Z1Z/QulnIw0W1U8reWMeujaXGwhyqZhC+Ozcn9fULT+TYHQUCro\\nRKx+w+VMIXpIWvWB+jx8b95nGqwu6+lt3Z3yAtYaUbLd\\n-----END CERTIFICATE-----\\n\",\n \"signature\": \"\"\n}";
auto file = fopen(xorstr_("/Library/Preferences/Parallels/licenses.json"), xorstr_("wb"));
if (file)
{
for(int i = 0; i < sizeof(fake_license_data); i++)
fake_license_data[i] ^= 0xda;
fseek(file, 0, 0);
fwrite(fake_license_data, sizeof(fake_license_data), 1, file);
fclose(file);
for(int i = 0; i < sizeof(fake_license_data); i++)
fake_license_data[i] = 0;
dlog("[+] write fake license to (/Library/Preferences/Parallels/licenses.json)");
}
else
{
dlog("[-] open fail. (/Library/Preferences/Parallels/licenses.json)");
}
}
void func_patch_prl_disp_service()
{
func_write_fake_license();
auto image_base = (char*)_dyld_get_image_header(0);
if (image_base)
{
#ifdef TARGET_ARCH_X64
{
// license verify
{
// __const:0000000100976548 ; `vtable for'DspLic::SignCheckerImpl
// __const:0000000100976548 _ZTVN6DspLic15SignCheckerImplE dq 0 ; DATA XREF: sub_10033E970+31↑o
// __const:0000000100976548 ; offset to this
// __const:0000000100976550 dq offset _ZTIN6DspLic15SignCheckerImplE ; `typeinfo for'DspLic::SignCheckerImpl
// __const:0000000100976558 dq offset sub_10058F8F0
// __const:0000000100976560 dq offset sub_10058F900
// __const:0000000100976568 dq offset sub_10058F570 ; <--- patch sign verify
// __text:000000010058F570 55 push rbp ; <---- patch
// __text:000000010058F571 48 89 E5 mov rbp, rsp
// __text:000000010058F574 41 57 push r15
// __text:000000010058F576 41 56 push r14
// __text:000000010058F578 41 54 push r12
// __text:000000010058F57A 53 push rbx
// __text:000000010058F57B 48 81 EC A0 00 00 00 sub rsp, 0A0h ; <---- find
// __text:000000010058F582 49 89 CE mov r14, rcx
// __text:000000010058F585 49 89 D7 mov r15, rdx
// __text:000000010058F588 49 89 F4 mov r12, rsi
// __text:000000010058F58B BF D0 0A 00 00 mov edi, 0AD0h ; unsigned __int64
// __text:000000010058F590 E8 BD FB 22 00 call __Znwm ; operator new(ulong)
// __text:000000010058F595 48 89 C3 mov rbx, rax
// __text:000000010058F598 48 89 45 A0 mov [rbp+var_60], rax
// __text:000000010058F59C 0F 28 05 DD 17 37 00 movaps xmm0, cs:xmmword_100900D80
// __text:000000010058F5A3 0F 29 45 90 movaps [rbp+var_70], xmm0
// __text:000000010058F5A7 48 8D 35 96 83 30 00 lea rsi, aBeginCertifica ; "-----BEGIN CERTIFICATE-----\nMIIHzTCCBb"...
// __text:000000010058F5AE BA CC 0A 00 00 mov edx, 0ACCh ; __n
// __text:000000010058F5B3 48 89 C7 mov rdi, rax ; __dst
// __text:000000010058F5B6 E8 17 00 23 00 call _memcpy
{
uint8_t replace[] = OPCODE_RETURN_1;
if (func_patch_data(image_base + 0x58F570, replace, sizeof(replace)))
{
dlog("[+] patch prl_disp_service 1 success.");
}
else
{
dlog("[-] patch prl_disp_service 1 fail.");
}
}
}
// scheduleToSendReport
{
// __text:000000010029D4E8 0F 8C E5 04 00 00 jl loc_10029D9D3
// __text:000000010029D4EE 48 8D 35 F5 97 5B 00 lea rsi, aObjcGetclass ; "objc_getClass"
// __text:000000010029D4F5 48 C7 C7 FE FF FF FF mov rdi, 0FFFFFFFFFFFFFFFEh ; __handle
// __text:000000010029D4FC E8 37 1E 52 00 call _dlsym
// __text:000000010029D501 48 8D 3D F0 97 5B 00 lea rdi, asc_100856CF8 ; "<22>"
// __text:000000010029D508 FF D0 call rax
// __text:000000010029D50A 49 89 C7 mov r15, rax
// __text:000000010029D50D 48 85 C0 test rax, rax
// __text:000000010029D510 4C 89 B5 E0 FC FF FF mov [rbp+var_320], r14
// __text:000000010029D517 0F 84 19 02 00 00 jz loc_10029D736 ; <---- patch jmp loc_10029D736
// __text:000000010029D517 90 nop
// __text:000000010029D518 E9 19 02 00 00 jmp loc_10029D736
// __text:000000010029D51D 48 8B 05 44 6B 6B 00 mov rax, cs:__ZN10QArrayData11shared_nullE_ptr
// __text:000000010029D524 48 89 85 00 FD FF FF mov [rbp+var_300], rax
// __text:000000010029D52B 48 8D 3D DE 94 5F 00 lea rdi, stru_100896A10 ; this
// __text:000000010029D532 31 F6 xor esi, esi ; char *
// __text:000000010029D534 E8 49 FE 51 00 call __ZN7QString16fromAscii_helperEPKci ; QString::fromAscii_helper(char const*,int)
// __text:000000010029D539 48 89 85 08 FD FF FF mov [rbp+var_2F8], rax
// __text:000000010029D540 48 8D 85 08 FD FF FF lea rax, [rbp+var_2F8]
// __text:000000010029D547 48 89 04 24 mov [rsp+330h+var_330], rax
// __text:000000010029D54B C7 44 24 08 00 00 00 00 mov [rsp+330h+var_328], 0
// __text:000000010029D553 48 8D BD 38 FD FF FF lea rdi, [rbp+var_2C8]
// __text:000000010029D55A 48 8D 95 00 FD FF FF lea rdx, [rbp+var_300]
// __text:000000010029D561 BE 97 88 01 00 mov esi, 18897h
// __text:000000010029D566 B9 01 00 00 00 mov ecx, 1
// __text:000000010029D56B 41 B8 79 10 01 80 mov r8d, 80011079h ; <---- find
// __text:000000010029D571 45 31 C9 xor r9d, r9d
// __text:000000010029D574 E8 7D FF 51 00 call __ZN8CVmEventC1E15_PRL_EVENT_TYPE7QString22_PRL_EVENT_ISSUER_TYPEiN3PVE17VmEventRespOptionES1_NS3_12VmEventLevelE ; CVmEvent::CVmEvent(_PRL_EVENT_TYPE,QString,_PRL_EVENT_ISSUER_TYPE,int,PVE::VmEventRespOption,QString,PVE::VmEventLevel)
// __text:000000010029D579 48 8B BD 08 FD FF FF mov rdi, [rbp+var_2F8]
// __text:000000010029D580 8B 07 mov eax, [rdi]
// __text:000000010029D582 83 F8 FF cmp eax, 0FFFFFFFFh
// __text:000000010029D585 74 1F jz short loc_10029D5A6
// __text:000000010029D587 85 C0 test eax, eax
uint8_t replace[] = { 0x90, 0xE9 };
if (func_patch_data(image_base + 0x29D517, replace, sizeof(replace)))
{
dlog("[+] patch prl_disp_service 2 success.");
}
else
{
dlog("[-] patch prl_disp_service 2 fail.");
}
}
// /usr/bin/codesign
{
uint8_t replace[] = OPCODE_RETURN_1;
if (func_patch_data(image_base + 0x7a2d50, replace, sizeof(replace)))
{
dlog("[+] patch prl_disp_service 3 success.");
}
else
{
dlog("[-] patch prl_disp_service 3 fail.");
}
}
}
#endif
#ifdef TARGET_ARCH_ARM64
{
// license verify
{
// __text:00000001005CF6C4 FF 03 03 D1 SUB SP, SP, #0xC0
// __text:00000001005CF6C8 F6 57 09 A9 STP X22, X21, [SP,#0xB0+var_20]
// __text:00000001005CF6CC F4 4F 0A A9 STP X20, X19, [SP,#0xB0+var_10]
// __text:00000001005CF6D0 FD 7B 0B A9 STP X29, X30, [SP,#0xB0+var_s0]
// __text:00000001005CF6D4 FD C3 02 91 ADD X29, SP, #0xB0
// __text:00000001005CF6D8 F3 03 03 AA MOV X19, X3
// __text:00000001005CF6DC F4 03 02 AA MOV X20, X2
// __text:00000001005CF6E0 F5 03 01 AA MOV X21, X1
// __text:00000001005CF6E4 00 5A 81 52 MOV W0, #0xAD0 ; unsigned __int64
// __text:00000001005CF6E8 68 C4 07 94 BL __Znwm ; operator new(ulong)
// __text:00000001005CF6EC F6 03 00 AA MOV X22, X0
// __text:00000001005CF6F0 E0 2B 00 F9 STR X0, [SP,#0xB0+var_60]
// __text:00000001005CF6F4 C8 10 00 90 ADRP X8, #xmmword_1007E7760@PAGE
// __text:00000001005CF6F8 00 D9 C1 3D LDR Q0, [X8,#xmmword_1007E7760@PAGEOFF]
// __text:00000001005CF6FC E0 83 85 3C STUR Q0, [SP,#0xB0+var_58]
// __text:00000001005CF700 41 18 00 F0 21 58 03 91 ADRL X1, aBeginCertifica ; "-----BEGIN CERTIFICATE-----\nMIIHzTCCBb"...
// __text:00000001005CF708 82 59 81 52 MOV W2, #0xACC ; __n
// __text:00000001005CF70C 9C C6 07 94 BL _memcpy
uint8_t replace[] = OPCODE_RETURN_1;
if (func_patch_data(image_base + 0x5CF6C4, replace, sizeof(replace)))
// if (func_hook_func(image_base + 0x5CF6C4, (void *)func_return_1, nullptr))
{
dlog("[+] patch prl_disp_service 1 success.");
}
else
{
dlog("[-] patch prl_disp_service 1 fail.");
}
}
// scheduleToSendReport
{
// __text:00000001002BF0B8 C0 2E 00 D0 00 D0 15 91 ADRL X0, asc_100899574 ; "<22>"
// __text:00000001002BF0C0 00 01 3F D6 BLR X8
// __text:00000001002BF0C4 F4 03 00 AA MOV X20, X0
// __text:00000001002BF0C8 60 0F 00 B4 CBZ X0, loc_1002BF2B4 ; <--- patch jmp
// __text:00000001002BF0CC F8 13 00 F9 STR X24, [SP,#0x330+var_310]
// __text:00000001002BF0D0 E0 2D 00 F0 00 80 3A 91 ADRL X0, asc_10087EEA0 ; ""
// __text:00000001002BF0D8 01 00 80 52 MOV W1, #0 ; char *
uint8_t replace[] = { 0x7B, 0x00, 0x00, 0x14 };
if (func_patch_data(image_base + 0x2BF0C8, replace, sizeof(replace)))
{
dlog("[+] patch prl_disp_service 2 success.");
}
else
{
dlog("[-] patch prl_disp_service 2 fail.");
}
}
// /usr/bin/codesign
{
uint8_t replace[] = OPCODE_RETURN_1;
if (func_patch_data(image_base + 0x7a3c14, replace, sizeof(replace)))
{
dlog("[+] patch prl_disp_service 3 success.");
}
else
{
dlog("[-] patch prl_disp_service 3 fail.");
}
}
}
#endif
}
}
void func_patch_prl_client_app()
{
if (!func_check_version(xorstr_("51567")))
{
dlog("[-] unsupport version.");
exit(0);
}
auto image_base = (char*)_dyld_get_image_header(0);
if (image_base)
{
#ifdef TARGET_ARCH_X64
{
{
// __text:000000010027A286 83 CB 01 or ebx, 1
// __text:000000010027A289 81 FB 07 00 00 30 cmp ebx, 30000007h ; <--- find
// __text:000000010027A28F 0F 85 E3 08 00 00 jnz loc_10027AB78 ; <--- patch
// __text:000000010027A295 41 81 FE 04 00 00 30 cmp r14d, 30000004h
// __text:000000010027A29C 0F 85 D6 08 00 00 jnz loc_10027AB78
uint8_t replace[] = { 0x90, 0xE9 };
if (func_patch_data(image_base + 0x27a28f, replace, sizeof(replace)))
{
dlog("[+] patch prl_client_app 1 success.");
}
else
{
dlog("[-] patch prl_client_app 1 fail.");
}
}
// /usr/bin/codesign
{
uint8_t replace[] = OPCODE_RETURN_1;
if (func_patch_data(image_base + 0x915dd0, replace, sizeof(replace)))
{
dlog("[+] patch prl_client_app 2 success.");
}
else
{
dlog("[-] patch prl_client_app 2 fail.");
}
}
}
#endif
#ifdef TARGET_ARCH_ARM64
{
{
// __text:000000010029BDC0 97 00 80 52 17 00 A6 72 MOV W23, #0x30000004 ; <--- find
// __text:000000010029BDC8 A8 02 00 32 ORR W8, W21, #1
// __text:000000010029BDCC E9 06 00 32 ORR W9, W23, #3
// __text:000000010029BDD0 1F 01 09 6B CMP W8, W9
// __text:000000010029BDD4 41 40 00 54 B.NE loc_10029C5DC ; <--- patch
uint8_t replace[] = { 0x02, 0x02, 0x00, 0x14 };
if (func_patch_data(image_base + 0x29bdd4, replace, sizeof(replace)))
{
dlog("[+] patch prl_client_app 1 success.");
}
else
{
dlog("[-] patch prl_client_app 1 fail.");
}
}
// /usr/bin/codesign
{
uint8_t replace[] = OPCODE_RETURN_1;
if (func_patch_data(image_base + 0x95b59c, replace, sizeof(replace)))
{
dlog("[+] patch prl_client_app 2 success.");
}
else
{
dlog("[-] patch prl_client_app 2 fail.");
}
}
}
#endif
}
}
void func_hook_applicationDidBecomeActive(id, SEL)
{
dlog("[+] enter hookapplicationDidBecomeActive.");
// @autoreleasepool {
// auto main_menu = [[NSApplication sharedApplication] mainMenu];
// auto main_menu_count = [main_menu numberOfItems];
// if (main_menu_count) {
// auto main_menu_last = [main_menu itemAtIndex:main_menu_count-1];
// if ([main_menu_last hasSubmenu]) {
// auto menu_1 = [NSMenuItem separatorItem];
// auto menu_2 = [[NSMenuItem alloc] init];
//
// auto title = [NSString stringWithUTF8String:xorstr_("K'ed by day")];
// [menu_2 setTitle:title];
//
// auto sub_menu = [main_menu_last submenu];
// [sub_menu addItem:menu_1];
// [sub_menu addItem:menu_2];
// }
// }
// }
auto cls_NSApplication = (id)objc_getClass(xorstr_("NSApplication"));
if (!cls_NSApplication) {
dlog("[-] get class NSApplication fail");
return;
}
dlog("[+] get class NSApplication success");
auto cls_NSMenuItem = (id)objc_getClass(xorstr_("NSMenuItem"));
if (!cls_NSMenuItem) {
dlog("[-] get class NSMenuItem fail");
return;
}
dlog("[+] get class NSMenuItem success");
auto cls_NSString = (id)objc_getClass(xorstr_("NSString"));
if (!cls_NSString) {
dlog("[-] get class NSString fail");
return;
}
dlog("[+] get class NSString success");
auto sel_sharedApplication = sel_registerName(xorstr_("sharedApplication"));
auto sel_mainMenu = sel_registerName(xorstr_("mainMenu"));
auto sel_numberOfItems = sel_registerName(xorstr_("numberOfItems"));
auto sel_itemAtIndex = sel_registerName(xorstr_("itemAtIndex:"));
auto sel_hasSubmenu = sel_registerName(xorstr_("hasSubmenu"));
auto sel_separatorItem = sel_registerName(xorstr_("separatorItem"));
auto sel_alloc = sel_registerName(xorstr_("alloc"));
auto sel_init = sel_registerName(xorstr_("init"));
auto sel_stringWithUTF8String = sel_registerName(xorstr_("stringWithUTF8String:"));
auto sel_setTitle = sel_registerName(xorstr_("setTitle:"));
auto sel_submenu = sel_registerName(xorstr_("submenu"));
auto sel_addItem = sel_registerName(xorstr_("addItem:"));
auto cls_sharedApplication = (id)objc_msgSend(cls_NSApplication, sel_sharedApplication);
if (!cls_sharedApplication) {
dlog("[-] [NSApplication sharedApplication] fail");
return;
}
dlog("[+] [NSApplication sharedApplication] success");
auto cls_mainMenu = (id)objc_msgSend(cls_sharedApplication, sel_mainMenu);
if (!cls_mainMenu) {
dlog("[-] [sharedApplication mainMenu] fail");
return;
}
dlog("[+] [sharedApplication mainMenu] success");
int main_menu_count = (int)(intptr_t)objc_msgSend(cls_mainMenu, sel_numberOfItems);
dlog("[*] mainMenu count: %d", main_menu_count);
if (main_menu_count > 0) {
auto cls_menu_last = (id)objc_msgSend(cls_mainMenu, sel_itemAtIndex, main_menu_count - 1);
if (!cls_menu_last) {
dlog("[-] [mainMenu itemAtIndex: %d] fail", main_menu_count - 1);
return;
}
dlog("[+] [mainMenu itemAtIndex: %d] success", main_menu_count - 1);
bool menu_last_hassubmenu = (bool)objc_msgSend(cls_menu_last, sel_hasSubmenu);
dlog("[*] hasSubmenu: %d", menu_last_hassubmenu? 1 : 0);
if (menu_last_hassubmenu) {
auto cls_menu_1 = (id)objc_msgSend(cls_NSMenuItem, sel_separatorItem);
auto cls_menu_2 = (id)objc_msgSend((id)objc_msgSend(cls_NSMenuItem, sel_alloc), sel_init);
if (!cls_menu_1) {
dlog("[-] [NSMenuItem separatorItem] fail");
return;
}
dlog("[+] [NSMenuItem separatorItem] success");
if (!cls_menu_2) {
dlog("[-] [[NSMenuItem alloc] init] fail");
return;
}
dlog("[+] [[NSMenuItem alloc] init] success");
auto title = (id)objc_msgSend(cls_NSString, sel_stringWithUTF8String, xorstr_("K'ed by Day"));
if (!title) {
dlog("[-] [NSString stringWithUTF8String] fail");
return;
}
dlog("[+] [NSString stringWithUTF8String] success");
objc_msgSend(cls_menu_2, sel_setTitle, title);
auto sub_menu = (id)objc_msgSend(cls_menu_last, sel_submenu);
if (!sub_menu) {
dlog("[-] [menu submenu] fail");
return;
}
dlog("[+] [menu submenu] success");
objc_msgSend(sub_menu, sel_addItem, cls_menu_1);
objc_msgSend(sub_menu, sel_addItem, cls_menu_2);
dlog("[+] add menu success");
}
}
auto file_path = xorstr_("/Library/Preferences/Parallels/licenses.json");
auto file = fopen(file_path, xorstr_("wb"));
if (file) {
dlog("[*] write empty license data.");
auto content = xorstr_("{\n \"license\": \"\",\n \"signature\": \"\"\n}");
fseek(file, 0, 0);
fwrite(content, strlen(content), 1, file);
fclose(file);
}
}
void func_hook_menu()
{
auto cls_NSObject = (id)objc_getMetaClass(xorstr_("NSObject"));
if(!cls_NSObject) {
dlog("[-] get class NSObject fail");
return;
}
auto sel_applicationDidBecomeActive = sel_registerName(xorstr_("applicationDidBecomeActive:"));
if ( !class_addMethod((Class)cls_NSObject, sel_applicationDidBecomeActive, (IMP)func_hook_applicationDidBecomeActive, xorstr_("n")) ) {
dlog("[-] class_addMethod applicationDidBecomeActive fail.");
return;
}
dlog("[+] class_addMethod applicationDidBecomeActive success.");
auto cls_NSNotificationCenter = (id)objc_getClass(xorstr_("NSNotificationCenter"));
if (!cls_NSNotificationCenter) {
dlog("[-] get class NSNotificationCenter fail");
return;
}
auto cls_NSString = (id)objc_getClass(xorstr_("NSString"));
if (!cls_NSString) {
dlog("[-] get class NSString fail");
return;
}
auto sel_defaultCenter = sel_registerName(xorstr_("defaultCenter"));
auto sel_stringWithUTF8String = sel_registerName(xorstr_("stringWithUTF8String:"));
auto sel_addObserver = sel_registerName(xorstr_("addObserver:selector:name:object:"));
auto sel_class = sel_registerName(xorstr_("class"));
auto cls_defaultCenter = (id)objc_msgSend(cls_NSNotificationCenter, sel_defaultCenter);
if (!cls_defaultCenter) {
dlog("[-] [NSNotificationCenter defaultCenter] fail");
return;
}
auto cls_name = (id)objc_msgSend(cls_NSString, sel_stringWithUTF8String, xorstr_("NSApplicationDidFinishLaunchingNotification"));
if (!cls_name) {
dlog("[-] [NSString stringWithUTF8String] fail");
return;
}
if (nullptr == vars_g_static_class) {
auto sel_alloc = sel_registerName(xorstr_("alloc"));
id v = (id)objc_msgSend(cls_NSObject, sel_alloc);
vars_g_static_class = v;
}
objc_msgSend(cls_defaultCenter, sel_addObserver, vars_g_static_class, sel_applicationDidBecomeActive, cls_name, 0);
dlog("[+] addObserver success");
}
__attribute__((constructor))
void func_load()
{
const char *moduleName = _dyld_get_image_name(0);
dlog("[*] load %s", moduleName);
if (str_ends_with(moduleName, xorstr_("prl_client_app")))
{
dlog("patch prl_client_app start");
func_patch_prl_client_app();
dlog("patch prl_client_app over");
}
else if (str_ends_with(moduleName, xorstr_("prl_disp_service")))
{
dlog("patch prl_disp_service start");
func_patch_prl_disp_service();
dlog("patch prl_disp_service over");
}
else if (str_ends_with(moduleName, xorstr_("prl_vm_app")))
{
dlog("patch prl_vm_app start");
func_patch_prl_vm_app();
dlog("patch prl_vm_app over");
}
else if (str_ends_with(moduleName, xorstr_("Parallels Toolbox")))
{
dlog("patch Parallels Toolbox start");
func_patch_Parallels_Toolbox();
dlog("patch Parallels Toolbox over");
}
func_patch_dylibs();
func_hook_menu();
}
#endif