Restructure repository to include all source folders

Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-29 20:17:20 +09:00
parent 5d3cd64a25
commit dd97ddec92
11602 changed files with 1446576 additions and 0 deletions

View File

@@ -0,0 +1,163 @@
#ifndef _LOGIN_SERVER_INFO_
#define _LOGIN_SERVER_INFO_
#include <winsock2.h>
#include <windows.h>
#include <algorithm>
#pragma pack(1)
// -----------------------------------------------------------------------------
// 서버 정보 관련 구조체들
typedef union SERVER_ID* LPSERVER_ID;
union SERVER_ID
{
// 서버군
enum Group
{
GROUP_TEST = 0, // 테스트
GROUP_OFFICIAL1 = 1, // Ichman
GROUP_OFFICIAL2 = 2, //
GROUP_OFFICIAL3 = 3, //
GROUP_OFFICIAL4 = 4, //
GROUP_OFFICIAL5 = 5, //
GROUP_OFFICIAL6 = 6, //
GROUP_OFFICIAL7 = 7, //
GROUP_OFFICIAL8 = 8, //
GROUP_BATTLE_SERVER = 9, // 배틀서버
// Rodin : MAX_GROUP_NUM을 8로 하면 로긴 서버가 릴리즈에서 죽습니다. 왜?!?!
MAX_GROUP_NUM = 10
};
enum Zone
{
NONE = 0,
ZONE1 = 1, // 그랜드 코스트
ZONE2 = 2, // 레한 스팟
ZONE3 = 3, // X 구 배틀그라운드 (현재 사용안함)
ZONE4 = 4, // 사이너 아일랜드
ZONE5 = 5, // 아일랜드 오브 페인
BATTLE_ZONE = 6, // X 배틀 존
ADMIN_TOOL_ZONE = 7, // X (클라이언트 사정으로 쓰이지 않음) - 운영툴이 사용하겠소.
CAPITAL = 8, // 카나번
ZONE9 = 9, // X 구 NEWZONE5 번인데 글로벌에서 사용해야하기 때문에 ZONE9로 이전후 제거
FRAG_ZONE = 10, // X 배틀 그라운드 전용 서버의 가상 존
BATTLE_SERVER = 11, // X 배틀 그라운드 전용 서버
ZONE12 = 12, // 신의 대지
STATUE_ZONE = 13, // X 배틀 그라운드 전용 서버의 가상 존
PRISON = 14, // 감옥 (감금 시스템)
CHAR_SELECT = 15, // X 캐릭터 선택 화면 존
STONE_WAR1 = 16, // 로우 40랩이하 석상전용
STONE_WAR2 = 17, // 로우 80랩이하 석상전용
STONE_WAR3 = 18, // 로우 80랩이상 석상전용
MAX_ZONE_NUM = 19
};
enum Channel
{
// sphawk : 채널 관련해서 고쳤습니다. 여기저기 복잡하게 흩어져 있으니 함부로 건들지 마세요.
// 고친 패킷은 다음과 같습니다.
// 1. 여기.
// 2. PktSCInfo (중계쪽에서도 사용하는 패킷입니다)
// 3. PktCSAck
// 4. PktSZMvAck
// 5. PktCSDAck (중계쪽에서도 사용하는 패킷입니다)
// 6. PktSZMvDAck (중계쪽에서도 사용하는 패킷입니다)
// SERVER_GROUP쪽은 채널이라고 써 있지만 실제로는 휴먼/아칸 의 인원수입니다.(중계 소스를 보면 압니다.)
// 착오 없으시길 바랍니다.
MAX_CHANNEL_NUM = 5
};
typedef struct SID* LPSID;
struct SID
{
char Type;
char Group;
char Channel;
char ID;
};
SID sID;
unsigned long dwID;
inline char GetType(void) { return sID.Type; }
inline char GetChannel(void) { return sID.Channel; }
inline char GetZone(void) { return sID.ID; }
inline char GetGroup(void) { return sID.Group; }
};
typedef struct SERVER* LPSERVER_GROUP;
struct SERVER_GROUP
{
enum { CHANNEL_NUM = 2, SERVER_NAME = 15 };
char m_Group; // 서버 그룹
char m_Name[SERVER_NAME]; // 서버 이름
long m_ClientNum[CHANNEL_NUM]; // 접속 자 수
IN_ADDR m_Address; // 서버 주소
};
typedef struct SERVER* LPSERVER_LIST;
struct SERVER_LIST
{
enum { SERVER_NUM = 10 };
unsigned short m_ServerNum; // 서버 숫자
SERVER_GROUP m_ServerGroup[SERVER_NUM]; // 서버 그룹
};
#pragma pack()
typedef struct RylServerInfo* LPRylServerInfo;
struct RylServerInfo
{
enum
{
GROUP_NAME_LENGTH = 120,
PATCH_ADDRESS_LENGTH = 100
};
SERVER_ID m_ServerUID;
IN_ADDR m_ServerAddress;
unsigned long m_dwClientVer;
unsigned long m_dwChecksum;
size_t m_nGroupNameLen;
size_t m_nPatchAddressLen;
char m_szGroupName[GROUP_NAME_LENGTH];
char m_szPatchAddress[PATCH_ADDRESS_LENGTH];
unsigned short m_usChannelClientNum[SERVER_GROUP::CHANNEL_NUM];
unsigned short m_usChannelNum;
RylServerInfo::RylServerInfo()
: m_dwClientVer(0), m_dwChecksum(0),
m_nPatchAddressLen(0), m_usChannelNum(0)
{
m_ServerUID.dwID = 0;
m_ServerAddress.S_un.S_addr = 0;
m_szPatchAddress[0] = '\0';
strncpy(m_szGroupName, "UnKnown", GROUP_NAME_LENGTH);
m_nGroupNameLen = strlen(m_szGroupName);
std::fill_n(m_usChannelClientNum, int(SERVER_GROUP::CHANNEL_NUM), 0);
}
};
#endif

View File

@@ -0,0 +1,205 @@
// XORCrypt.cpp: implementation of the CXORCrypt class.
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "XORCrypt.h"
#include <ctime>
#include <cstdlib>
#include "GMMemory.h"
CXORCrypt CXORCrypt::ms_this;
CXORCrypt::CXORCrypt()
{
InitCodePage();
for(int iVer = 2; iVer < 4; ++iVer)
{
for(int iPage = 0; iPage < CODE_PAGE; ++iPage)
{
for( int iBit = 0; iBit < BIT_COUNT; ++iBit)
{
BitFields[iVer][iPage][iBit] = BitFields[iVer][iPage][iBit]^BitFields[0][iPage][iBit];
}
}
}
return;
}
CXORCrypt::~CXORCrypt()
{
}
//Interface////////////////////////////////////////////////////////////////////////////////////
// XORF [ public ] - XOR 연산. # 순방향
// Parameter : 1st : 시작 포인터, 2st : 길이, 3st : 코드 페이지
// Return:
void CXORCrypt::XORF(char *Start_In, int Length_In, unsigned short PageVer,
unsigned char PageNum1, unsigned char PageNum2)
{
for (int Counter = 0; Counter < Length_In; ++Counter)
{
*Start_In = *Start_In ^ BitFields[PageVer][PageNum1][Counter % BIT_COUNT];
*Start_In = *Start_In ^ BitFields[PageVer][PageNum2][Counter % BIT_COUNT];
++Start_In;
}
}
//Interface////////////////////////////////////////////////////////////////////////////////////
// XORB [ public ] - XOR 연산. # 역방향
// Parameter : 1st : 시작 포인터, 2st : 길이, 3st : 코드 페이지
// Return:
void CXORCrypt::XORB(char *Start_In, int Length_In, unsigned short PageVer,
unsigned char PageNum1, unsigned char PageNum2)
{
for (int Counter = 0; Counter < Length_In; ++Counter)
{
*Start_In = *Start_In ^ BitFields[PageVer][PageNum2][Counter % BIT_COUNT];
*Start_In = *Start_In ^ BitFields[PageVer][PageNum1][Counter % BIT_COUNT];
++Start_In;
}
}
//Interface////////////////////////////////////////////////////////////////////////////////////
// InitCODE_PAGE [ public ] - 암호 페이지를 초기화 한다
// Parameter :
// Return:
void CXORCrypt::InitCodePage(void)
{
int CODE_PAGENums = CODE_PAGE * 10;
srand((unsigned)time(NULL));
for (int Counter = 0; Counter < CODE_PAGENums; ++Counter)
{
m_CodePage[Counter] = rand() % CODE_PAGE;
if(Counter > 1)
{
if (m_CodePage[Counter] == m_CodePage[Counter - 1])
{
--Counter;
}
}
}
m_CodePageCount = rand() % (CODE_PAGE * 10);
}
//Interface////////////////////////////////////////////////////////////////////////////////////
// GetCODE_PAGE [ public ] - 암호 페이지를 얻는다
// Parameter :
// Return:
unsigned long CXORCrypt::GetCodePage(void)
{
if(0xffffff00 < m_CodePageCount)
{
m_CodePageCount = 0;
}
m_CodePageCount = (m_CodePageCount + 2) % (CODE_PAGE * 10);
return (((unsigned long)PAGE_VERSION << 16) & 0xffff0000) |
(((unsigned long)m_CodePage[m_CodePageCount] << 8) & 0x0000ff00) |
((unsigned long)m_CodePage[m_CodePageCount - 1] & 0x000000ff);
}
unsigned long CXORCrypt::GetCodePage(unsigned short PageVer_In)
{
if(0xffffff00 < m_CodePageCount)
{
m_CodePageCount = 0;
}
m_CodePageCount = (m_CodePageCount + 2) % (CODE_PAGE * 10);
return (((unsigned long)PageVer_In << 16) & 0xffff0000) |
(((unsigned long)m_CodePage[m_CodePageCount] << 8) & 0x0000ff00) |
((unsigned long)m_CodePage[m_CodePageCount - 1] & 0x000000ff);
}
//Interface////////////////////////////////////////////////////////////////////////////////////
// InnerEncodeS [ public ] - 데이터 암호화 : 데이터를 XOR 연산 한다. # 클라이언트 용
// Parameter : 1st : 시작 포인터, 2st : 길이, 3st : 코드 페이지
// Return:
bool CXORCrypt::EncodePacket(char *Start_In, int Length_In, unsigned long CodePage_In)
{
unsigned short PageVer = 0;
unsigned char PageNum1 = 0, PageNum2 = 0;
PageVer = (unsigned short)(((CodePage_In & 0xffff0000) >> 16) & 0x0000ffff);
PageNum1 = (unsigned char)(((CodePage_In & 0xff00) >> 8) & 0x00ff);
PageNum2 = (unsigned char)(CodePage_In & 0x00ff);
if(PageVer < 0 || PageVer > 4)
return false;
if(PageNum1 < 0 || PageNum1 >= CODE_PAGE || PageNum2 < 0 || PageNum2 >= CODE_PAGE)
return false;
XORF(Start_In, Length_In, PageVer, PageNum1, PageNum2);
return true;
}
//Interface////////////////////////////////////////////////////////////////////////////////////
// InnerEncodeS [ public ] - 데이터 암호화 : 데이터를 XOR 연산 한다. # 서버용
// Parameter : 1st : 시작 포인터, 2st : 길이, 3st : 코드 페이지
// Return:
bool CXORCrypt::DecodePacket(char *Start_In, int Length_In, unsigned long CodePage_In)
{
unsigned short PageVer = 0;
unsigned char PageNum1 = 0, PageNum2 = 0;
PageVer = (unsigned short)(((CodePage_In & 0xffff0000) >> 16) & 0x0000ffff);
PageNum1 = (unsigned char)(((CodePage_In & 0xff00) >> 8) & 0x00ff);
PageNum2 = (unsigned char)(CodePage_In & 0x00ff);
if(PageVer < 0 || PageVer > 4)
return false;
if(PageNum1 < 0 || PageNum1 >= CODE_PAGE || PageNum2 < 0 || PageNum2 >= CODE_PAGE)
return false;
XORB(Start_In, Length_In, PageVer, PageNum1, PageNum2);
return true;
}
//Interface////////////////////////////////////////////////////////////////////////////////////
// EncodeHeader [ public ] - 데이터 암호화 : 데이터를 XOR 연산 한다.
// Parameter : 1st : 시작 포인터, 2st : 길이
// Return:
void CXORCrypt::EncodeHeader(char *Start_In, int Length_In, unsigned short PageVer_In, unsigned char PageNum_In)
{
for(int Counter = 0; Counter < Length_In; ++Counter)
{
*Start_In = *Start_In ^ BitFields[PageVer_In][PageNum_In][Counter % BIT_COUNT];
*Start_In = (((*Start_In & 0x80) >> 7) & 0x01) | ((*Start_In << 1) & 0xFE);
++Start_In;
}
}
//Interface////////////////////////////////////////////////////////////////////////////////////
// DecodeHeader [ public ] - 데이터 복호화 : 데이터를 XOR 연산 한다. # 서버용
// Parameter : 1st : 시작 포인터, 2st : 길이
// Return:
void CXORCrypt::DecodeHeader(char *Start_In, int Length_In, unsigned short PageVer_In, unsigned char PageNum_In)
{
for(int Counter = 0; Counter < Length_In; ++Counter)
{
*Start_In = (((*Start_In & 0x01) << 7) & 0x80) | ((*Start_In >> 1) & 0x7F);
*Start_In = *Start_In ^ BitFields[PageVer_In][PageNum_In][Counter % BIT_COUNT];
++Start_In;
}
}

View File

@@ -0,0 +1,59 @@
#ifndef _CXOR_CRYPT_H_
#define _CXOR_CRYPT_H_
#pragma once
#include <Pattern/Singleton.h>
class CXORCrypt : public CSingleton<CXORCrypt>
{
public:
enum
{
PAGE_VERSION = 3,
BIT_COUNT = 40,
CODE_PAGE = 10,
};
private:
static unsigned char BitFields[][CODE_PAGE][BIT_COUNT];
unsigned char m_CodePage[CODE_PAGE * 10];
unsigned long m_CodePageCount;
void InitCodePage(void);
void XORF(char *Start_In, int Length_In, unsigned short PageVer, unsigned char PageNum1, unsigned char PageNum2);
void XORB(char *Start_In, int Length_In, unsigned short PageVer, unsigned char PageNum1, unsigned char PageNum2);
// To make Singleton Class.
CXORCrypt();
static CXORCrypt ms_this;
public:
~CXORCrypt();
// interface of encoder, decoder
unsigned long GetCodePage(void);
unsigned long GetCodePage(unsigned short PageVer_In);
inline unsigned short GetPageVer(unsigned long CodePage_In);
bool EncodePacket(char *Start_In, int Length_In, unsigned long CodePage_In);
bool DecodePacket(char *Start_In, int Length_In, unsigned long CodePage_In);
void EncodeHeader(char *Start_In, int HeaderLen_In, unsigned short PageVer_In, unsigned char PageNum_In);
void DecodeHeader(char *Start_In, int HeaderLen_In, unsigned short PageVer_In, unsigned char PageNum_In);
};
inline unsigned short CXORCrypt::GetPageVer(unsigned long CodePage_In)
{
return (unsigned short)(((CodePage_In & 0xffff0000) >> 16) & 0x0000ffff);
}
#endif

View File

@@ -0,0 +1,422 @@
#include "stdafx.h"
#include "XORCrypt.h"
#include "GMMemory.h"
unsigned char CXORCrypt::BitFields[][CODE_PAGE][BIT_COUNT] =
{
///////////////////////////////////////////////////////////////////////
//Code Version 0
{
// Code Page 1
0x82, 0x53, 0x43, 0x4C, 0x2B,
0x0D, 0x37, 0xD7, 0xD9, 0xD8,
0x1B, 0x6D, 0xA0, 0xC3, 0x2B,
0xEE, 0x45, 0x88, 0x1A, 0xA6,
0x18, 0x1D, 0x9D, 0x38, 0x2A,
0x55, 0x03, 0x1D, 0xCD, 0xA6,
0x73, 0x07, 0xED, 0x8D, 0xC5,
0xDB, 0xA3, 0xBD, 0xB6, 0xD5,
// Code Page 2
0x34, 0xB5, 0xB2, 0x3D, 0x7D,
0x43, 0x8C, 0xC0, 0x21, 0x25,
0xCD, 0xB6, 0x53, 0x76, 0xCE,
0x5D, 0xD4, 0x87, 0xCA, 0x84,
0x81, 0xCB, 0x5E, 0x04, 0xBA,
0x69, 0x3E, 0x65, 0xDE, 0x21,
0x8A, 0x63, 0x62, 0x71, 0x90,
0x87, 0x0A, 0x52, 0x28, 0x44,
// Code Page 3
0xA3, 0x49, 0xDC, 0xEA, 0x09,
0xB7, 0x01, 0xA4, 0xA1, 0x11,
0x11, 0x8E, 0x80, 0x35, 0x5B,
0xDD, 0x38, 0xD5, 0x4E, 0x36,
0x0C, 0xA2, 0xBB, 0x05, 0x36,
0x57, 0x2E, 0x98, 0xBE, 0x88,
0x3C, 0x28, 0x43, 0x63, 0xA0,
0xE9, 0xE1, 0x6D, 0x51, 0xCB,
// Code Page 4
0x4D, 0x62, 0x84, 0x43, 0x89,
0xC7, 0x89, 0x83, 0x65, 0x29,
0x53, 0x95, 0x7C, 0xC0, 0xA1,
0x0C, 0xDB, 0xD7, 0x04, 0xD8,
0x6A, 0xD1, 0x73, 0x1D, 0x21,
0x67, 0x86, 0x8D, 0xA4, 0xA0,
0x34, 0xBD, 0x31, 0x20, 0x61,
0x0E, 0xE9, 0x63, 0xB4, 0xC0,
// Code Page 5
0xC7, 0x36, 0x1B, 0x41, 0x23,
0x9C, 0xD1, 0x8C, 0x25, 0x53,
0x42, 0x2E, 0x45, 0x6D, 0x42,
0x7B, 0x4E, 0x5B, 0xEB, 0x24,
0x33, 0x74, 0x52, 0x28, 0xC6,
0x2A, 0xC3, 0x16, 0x60, 0xA5,
0x45, 0x35, 0xDB, 0x9A, 0x54,
0x97, 0xE2, 0xEE, 0x9B, 0xDE,
// Code Page 6
0xE0, 0xC3, 0x84, 0x41, 0xED,
0x45, 0x4C, 0x69, 0xD9, 0x28,
0x55, 0x27, 0x8E, 0x3A, 0x3C,
0x8E, 0x84, 0x97, 0x14, 0xE6,
0x58, 0x51, 0x26, 0x0D, 0xE2,
0x9E, 0x66, 0x7C, 0x0D, 0x01,
0x7D, 0x17, 0x4C, 0x08, 0xDD,
0x97, 0x1C, 0x7B, 0xCE, 0x5D,
// Code Page 7
0x54, 0x37, 0x7C, 0x0C, 0x8E,
0x27, 0x7A, 0x78, 0x2E, 0xE6,
0x6D, 0x25, 0x62, 0x62, 0x98,
0x20, 0x2E, 0x23, 0x15, 0x61,
0x7D, 0x97, 0x50, 0x07, 0x20,
0x7A, 0x04, 0x29, 0x62, 0x90,
0x6B, 0xE9, 0xE6, 0x22, 0x72,
0x38, 0x56, 0xC9, 0x06, 0x2E,
// Code Page 8
0x3B, 0x47, 0x08, 0x2D, 0x21,
0x42, 0x07, 0x69, 0x4A, 0x57,
0x8B, 0x79, 0xE7, 0x56, 0x27,
0x23, 0x24, 0x85, 0x47, 0x74,
0x75, 0x85, 0xA9, 0xEB, 0x10,
0xCB, 0x17, 0x85, 0x4B, 0x5E,
0x20, 0x78, 0xD0, 0x7D, 0x86,
0x5E, 0x14, 0x7E, 0x64, 0x50,
// Code Page 9
0x69, 0x52, 0x4A, 0xBD, 0x8C,
0x9B, 0xD6, 0x63, 0xBD, 0x26,
0x86, 0x32, 0x95, 0xA4, 0x02,
0x9B, 0x01, 0x14, 0x49, 0x78,
0x88, 0x57, 0x3A, 0x01, 0x4A,
0xBC, 0x50, 0xCD, 0x31, 0x39,
0x71, 0x30, 0x5B, 0x9C, 0x4D,
0x21, 0x67, 0x82, 0xE8, 0x5C,
// Code Page 10
0x66, 0x10, 0xA9, 0x7D, 0xD2,
0x36, 0xE2, 0xB1, 0x28, 0x20,
0xD5, 0xE7, 0xD5, 0x0E, 0xD4,
0x0C, 0x2C, 0x77, 0x80, 0x0E,
0xA6, 0x37, 0xBE, 0x61, 0xAD,
0xD6, 0x17, 0x65, 0x13, 0x70,
0xAE, 0x40, 0x3B, 0x52, 0xEE,
0x53, 0x84, 0xEB, 0x04, 0x0D,
},
///////////////////////////////////////////////////////////////////////
//Code Version 1
{
// Code Page 1
0x49, 0x8C, 0x77, 0xC0, 0xC0,
0x64, 0x54, 0x0B, 0x22, 0xBD,
0x82, 0x93, 0x9A, 0x23, 0x8D,
0xE4, 0xC8, 0x9D, 0xB3, 0x50,
0x44, 0xB1, 0xE2, 0x9E, 0x15,
0x7A, 0xA1, 0x0C, 0x24, 0xE3,
0x1E, 0x0A, 0x0A, 0x73, 0x6A,
0xA5, 0x8B, 0x3A, 0x53, 0x33,
// Code Page 2
0xB0, 0xE6, 0xB7, 0x51, 0x70,
0xDA, 0xD6, 0x29, 0xAA, 0x10,
0xB5, 0x8A, 0x38, 0x37, 0x4E,
0x7A, 0x3B, 0x74, 0x7B, 0x63,
0x41, 0x7C, 0x21, 0x65, 0x5E,
0x26, 0x95, 0x44, 0x75, 0xA3,
0x74, 0xDD, 0xB4, 0x33, 0x9E,
0x54, 0x3C, 0x95, 0x5E, 0x34,
// Code Page 3
0x10, 0x19, 0x43, 0x64, 0x78,
0x2B, 0xA6, 0x60, 0x7D, 0xCD,
0xA9, 0x28, 0xB8, 0x85, 0x0E,
0x66, 0xC7, 0x3C, 0x28, 0xDC,
0xA1, 0x4D, 0x60, 0x9B, 0xC7,
0xD3, 0x74, 0x93, 0xE6, 0xC3,
0x97, 0x76, 0x12, 0xA4, 0xCB,
0xB9, 0x22, 0x51, 0xB9, 0x79,
// Code Page 4
0x5C, 0x68, 0xDB, 0xE6, 0x59,
0x57, 0x95, 0xCD, 0xAE, 0xCA,
0x67, 0xB8, 0x37, 0x90, 0xBA,
0x54, 0x98, 0x95, 0x73, 0x8E,
0x47, 0xC1, 0x40, 0xBA, 0x80,
0x26, 0x10, 0xAA, 0x60, 0x64,
0xD8, 0x69, 0xC7, 0x0D, 0x2B,
0x28, 0xA6, 0xBA, 0x01, 0x4A,
// Code Page 5
0xEE, 0x28, 0x65, 0xC4, 0x9D,
0x41, 0x8D, 0x91, 0x6C, 0x91,
0x7E, 0x80, 0xC3, 0xD1, 0xAE,
0xB6, 0x92, 0x41, 0x66, 0x13,
0x72, 0x20, 0x26, 0xA1, 0x72,
0x05, 0x29, 0x08, 0x88, 0x30,
0x40, 0x6D, 0x5A, 0x41, 0x01,
0x7A, 0xDB, 0x2C, 0xEE, 0xC3,
// Code Page 6
0x5C, 0x03, 0x38, 0xD8, 0x95,
0xE7, 0xB4, 0x67, 0x30, 0x51,
0x21, 0x68, 0x78, 0x89, 0x68,
0x0B, 0xE3, 0xB0, 0x28, 0xB3,
0xA9, 0x38, 0x18, 0xE4, 0x59,
0x43, 0xC9, 0x52, 0x75, 0x04,
0x15, 0x07, 0x97, 0x14, 0x07,
0x27, 0xDA, 0xE5, 0xD9, 0xDB,
// Code Page 7
0xDB, 0x08, 0x27, 0xA3, 0x64,
0xDC, 0x42, 0xE3, 0x3D, 0x0D,
0x26, 0xA2, 0xC3, 0x5E, 0x3E,
0xA7, 0x47, 0xE4, 0x1C, 0x73,
0x13, 0x99, 0x9E, 0xBA, 0xD3,
0x08, 0x73, 0x88, 0x03, 0x01,
0x24, 0x2E, 0x09, 0xBD, 0x3A,
0x6E, 0x3C, 0xB6, 0xA2, 0x22,
// Code Page 8
0xE7, 0x27, 0x60, 0x20, 0x85,
0xDA, 0xEA, 0x84, 0x86, 0x41,
0x67, 0x1C, 0x83, 0xBE, 0x7A,
0x61, 0x67, 0x01, 0x18, 0x30,
0xC6, 0x37, 0xBC, 0x51, 0xBC,
0x78, 0xA1, 0x53, 0x53, 0x58,
0x9B, 0x32, 0x05, 0x67, 0x6B,
0xC7, 0x3A, 0x7C, 0xA8, 0xE5,
// Code Page 9
0x70, 0x10, 0x29, 0x88, 0x94,
0xC0, 0xEE, 0x8D, 0x52, 0x20,
0xD9, 0xC3, 0x3C, 0xB3, 0x43,
0x74, 0x83, 0xC8, 0xC5, 0xAA,
0x90, 0x58, 0x0C, 0xD0, 0xBC,
0x2A, 0xED, 0x04, 0x05, 0x8E,
0x27, 0xDE, 0x9C, 0x37, 0x57,
0x2A, 0x93, 0x63, 0x1B, 0x9E,
// Code Page 10
0xC3, 0x52, 0xDB, 0xE9, 0x63,
0x9A, 0x87, 0x18, 0x6D, 0xBE,
0x1B, 0x37, 0x6A, 0xEA, 0x01,
0x02, 0x01, 0xB5, 0x74, 0x71,
0xA5, 0x9A, 0x9A, 0x3A, 0x11,
0x8B, 0x62, 0xD7, 0xB0, 0x06,
0x0C, 0xA0, 0x10, 0x09, 0x97,
0x5A, 0xEB, 0xEA, 0x18, 0xB8,
},
///////////////////////////////////////////////////////////////////////
//Code Version 2
{
// Code Page 1
0xDD, 0x9E, 0xB4, 0x33, 0x74,
0x32, 0x6B, 0x05, 0x67, 0x9B,
0xD6, 0x10, 0x29, 0xAA, 0xDA,
0x8A, 0x4E, 0x38, 0x37, 0xB5,
0x3B, 0x63, 0x74, 0x7B, 0x7A,
0x7C, 0x5E, 0x21, 0x65, 0x41,
0x3A, 0xE5, 0x7C, 0xA8, 0xC7,
0x10, 0x94, 0x29, 0x88, 0x70,
// Code Page 2
0x68, 0x68, 0x78, 0x89, 0x21,
0xA0, 0x97, 0x10, 0x09, 0x0C,
0xB4, 0x51, 0x67, 0x30, 0xE7,
0x47, 0x73, 0xE4, 0x1C, 0xA7,
0x99, 0xD3, 0x9E, 0xBA, 0x13,
0x74, 0xC3, 0x93, 0xE6, 0xD3,
0x76, 0xCB, 0x12, 0xA4, 0x97,
0xE3, 0xB3, 0xB0, 0x28, 0x0B,
// Code Page 3
0x45, 0xA6, 0x88, 0x1A, 0xEE,
0x1D, 0x2A, 0x9D, 0x38, 0x18,
0xA3, 0xD5, 0xBD, 0xB6, 0xDB,
0x95, 0xCA, 0xCD, 0xAE, 0x57,
0x38, 0x36, 0xD5, 0x4E, 0xDD,
0x2E, 0x88, 0x98, 0xBE, 0x57,
0x89, 0x29, 0x83, 0x65, 0xC7,
0x95, 0xA1, 0x7C, 0xC0, 0x53,
// Code Page 4
0xD1, 0x21, 0x73, 0x1D, 0x6A,
0x86, 0xA0, 0x8D, 0xA4, 0x67,
0xA2, 0x36, 0xBB, 0x05, 0x0C,
0xBD, 0x61, 0x31, 0x20, 0x34,
0x36, 0x23, 0x1B, 0x41, 0xC7,
0xD1, 0x53, 0x8C, 0x25, 0x9C,
0x2E, 0x42, 0x45, 0x6D, 0x42,
0x4E, 0x24, 0x5B, 0xEB, 0x7B,
// Code Page 5
0x74, 0xC6, 0x52, 0x28, 0x33,
0xC3, 0xA5, 0x16, 0x60, 0x2A,
0x35, 0x54, 0xDB, 0x9A, 0x45,
0xE2, 0xDE, 0xEE, 0x9B, 0x97,
0xC3, 0xED, 0x84, 0x41, 0xE0,
0x4C, 0x28, 0x69, 0xD9, 0x45,
0x27, 0x3C, 0x8E, 0x3A, 0x55,
0x84, 0xE6, 0x97, 0x14, 0x8E,
// Code Page 6
0x69, 0x2B, 0xC7, 0x0D, 0xD8,
0xA6, 0x4A, 0xBA, 0x01, 0x28,
0x28, 0x9D, 0x65, 0xC4, 0xEE,
0x98, 0x8E, 0x95, 0x73, 0x54,
0x51, 0xE2, 0x26, 0x0D, 0x58,
0xDB, 0xD8, 0xD7, 0x04, 0x0C,
0x66, 0x01, 0x7C, 0x0D, 0x9E,
0x17, 0xDD, 0x4C, 0x08, 0x7D,
// Code Page 7
0x25, 0x98, 0x62, 0x62, 0x6D,
0x2E, 0x61, 0x23, 0x15, 0x20,
0x97, 0x20, 0x50, 0x07, 0x7D,
0x1C, 0x5D, 0x7B, 0xCE, 0x97,
0x37, 0x8E, 0x7C, 0x0C, 0x54,
0x7A, 0xE6, 0x78, 0x2E, 0x27,
0x04, 0x90, 0x29, 0x62, 0x7A,
0xE9, 0x72, 0xE6, 0x22, 0x6B,
// Code Page 8
0x07, 0x57, 0x69, 0x4A, 0x42,
0x79, 0x27, 0xE7, 0x56, 0x8B,
0xC8, 0x50, 0x9D, 0xB3, 0xE4,
0xB1, 0x15, 0xE2, 0x9E, 0x44,
0x56, 0x2E, 0xC9, 0x06, 0x38,
0x47, 0x21, 0x08, 0x2D, 0x3B,
0xA1, 0xE3, 0x0C, 0x24, 0x7A,
0x24, 0x74, 0x85, 0x47, 0x23,
// Code Page 9
0x14, 0x50, 0x7E, 0x64, 0x5E,
0x52, 0x8C, 0x4A, 0xBD, 0x69,
0xD6, 0x26, 0x63, 0xBD, 0x9B,
0x85, 0x10, 0xA9, 0xEB, 0x75,
0x17, 0x5E, 0x85, 0x4B, 0xCB,
0x78, 0x86, 0xD0, 0x7D, 0x20,
0x32, 0x02, 0x95, 0xA4, 0x86,
0x01, 0x78, 0x14, 0x49, 0x9B,
// Code Page 10
0x57, 0x4A, 0x3A, 0x01, 0x88,
0x07, 0x07, 0x97, 0x14, 0x15,
0xDA, 0xDB, 0xE5, 0xD9, 0x27,
0x50, 0x39, 0xCD, 0x31, 0xBC,
0x30, 0x4D, 0x5B, 0x9C, 0x71,
0x67, 0x5C, 0x82, 0xE8, 0x21,
0x08, 0x64, 0x27, 0xA3, 0xDB,
0x42, 0x0D, 0xE3, 0x3D, 0xDC,
},
///////////////////////////////////////////////////////////////////////
//Code Version 3
{
// Code Page 1
0xA2, 0x3E, 0xC3, 0x5E, 0x26,
0xE7, 0xD4, 0xD5, 0x0E, 0xD5,
0x2C, 0x0E, 0x77, 0x80, 0x0C,
0x37, 0xAD, 0xBE, 0x61, 0xA6,
0x10, 0xD2, 0xA9, 0x7D, 0x66,
0xE2, 0x20, 0xB1, 0x28, 0x36,
0x17, 0x70, 0x65, 0x13, 0xD6,
0x40, 0xEE, 0x3B, 0x52, 0xAE,
// Code Page 2
0x37, 0x01, 0x6A, 0xEA, 0x1B,
0x0A, 0x6A, 0x0A, 0x73, 0x1E,
0xB5, 0x7D, 0xB2, 0x3D, 0x34,
0x8C, 0x25, 0xC0, 0x21, 0x43,
0x01, 0x71, 0xB5, 0x74, 0x02,
0x84, 0x0D, 0xEB, 0x04, 0x53,
0x87, 0xBE, 0x18, 0x6D, 0x9A,
0x93, 0x8D, 0x9A, 0x23, 0x82,
// Code Page 3
0xE6, 0x70, 0xB7, 0x51, 0xB0,
0x8C, 0xC0, 0x77, 0xC0, 0x49,
0xCB, 0xBA, 0x5E, 0x04, 0x81,
0x3E, 0x21, 0x65, 0xDE, 0x69,
0x63, 0x90, 0x62, 0x71, 0x8A,
0x62, 0x89, 0x84, 0x43, 0x4D,
0xE9, 0xC0, 0x63, 0xB4, 0x0E,
0x28, 0x0E, 0xB8, 0x85, 0xA9,
// Code Page 4
0xC7, 0xDC, 0x3C, 0x28, 0x66,
0x68, 0x59, 0xDB, 0xE6, 0x5C,
0x0A, 0x44, 0x52, 0x28, 0x87,
0x95, 0xA3, 0x44, 0x75, 0x26,
0x3C, 0x34, 0x95, 0x5E, 0x54,
0x19, 0x78, 0x43, 0x64, 0x10,
0x4D, 0xC7, 0x60, 0x9B, 0xA1,
0x8B, 0x33, 0x3A, 0x53, 0xA5,
// Code Page 5
0xB8, 0xBA, 0x37, 0x90, 0x67,
0xEE, 0x20, 0x8D, 0x52, 0xC0,
0xED, 0x8E, 0x04, 0x05, 0x2A,
0xB6, 0xCE, 0x53, 0x76, 0xCD,
0xD4, 0x84, 0x87, 0xCA, 0x5D,
0x62, 0x06, 0xD7, 0xB0, 0x8B,
0xC1, 0x80, 0x40, 0xBA, 0x47,
0x10, 0x64, 0xAA, 0x60, 0x26,
// Code Page 6
0x54, 0xBD, 0x0B, 0x22, 0x64,
0x53, 0x2B, 0x43, 0x4C, 0x82,
0x37, 0xD8, 0xD7, 0xD9, 0x0D,
0x6D, 0x2B, 0xA0, 0xC3, 0x1B,
0x49, 0x09, 0xDC, 0xEA, 0xA3,
0x01, 0x11, 0xA4, 0xA1, 0xB7,
0x8E, 0x5B, 0x80, 0x35, 0x11,
0x6D, 0x01, 0x5A, 0x41, 0x40,
// Code Page 7
0xDB, 0xC3, 0x2C, 0xEE, 0x7A,
0x03, 0x95, 0x38, 0xD8, 0x5C,
0x8D, 0x91, 0x91, 0x6C, 0x41,
0x80, 0xAE, 0xC3, 0xD1, 0x7E,
0x38, 0x59, 0x18, 0xE4, 0xA9,
0xC9, 0x04, 0x52, 0x75, 0x43,
0x92, 0x13, 0x41, 0x66, 0xB6,
0x20, 0x72, 0x26, 0xA1, 0x72,
// Code Page 8
0x29, 0x30, 0x08, 0x88, 0x05,
0x3C, 0x22, 0xB6, 0xA2, 0x6E,
0x27, 0x85, 0x60, 0x20, 0xE7,
0x73, 0x01, 0x88, 0x03, 0x08,
0x2E, 0x3A, 0x09, 0xBD, 0x24,
0xEA, 0x41, 0x84, 0x86, 0xDA,
0x1C, 0x7A, 0x83, 0xBE, 0x67,
0x67, 0x30, 0x01, 0x18, 0x61,
// Code Page 9
0x37, 0xBC, 0xBC, 0x51, 0xC6,
0xA1, 0x58, 0x53, 0x53, 0x78,
0xDE, 0x57, 0x9C, 0x37, 0x27,
0xC3, 0x43, 0x3C, 0xB3, 0xD9,
0x83, 0xAA, 0xC8, 0xC5, 0x74,
0x58, 0xBC, 0x0C, 0xD0, 0x90,
0x93, 0x9E, 0x63, 0x1B, 0x2A,
0x52, 0x63, 0xDB, 0xE9, 0xC3,
// Code Page 10
0x9A, 0x11, 0x9A, 0x3A, 0xA5,
0x22, 0x79, 0x51, 0xB9, 0xB9,
0xEB, 0xB8, 0xEA, 0x18, 0x5A,
0x28, 0xA0, 0x43, 0x63, 0x3C,
0xE1, 0xCB, 0x6D, 0x51, 0xE9,
0xA6, 0xCD, 0x60, 0x7D, 0x2B,
0x03, 0xA6, 0x1D, 0xCD, 0x55,
0x07, 0xC5, 0xED, 0x8D, 0x73,
}
};