HI1Proxy/Hi1Proxy/HI1Protocal.cs

1124 lines
75 KiB
C#

using Hi1Proxy.Properties;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;
using System.Threading;
using System.IO;
using System.Net.Sockets;
using System.Drawing.Imaging;
using System.Net;
using Newtonsoft.Json;
namespace Hi1Proxy
{
class Area
{
public int start_x = 0;
public int end_x = 0;
public int start_y = 0;
public int end_y = 0;
public string name;
public Area(int minx, int maxx, int miny, int maxy, string onamae)
{
start_x = minx;
start_y = miny;
end_y = maxy;
end_x = maxx;
name = onamae;
}
}
class TileSetArea
{
public int MinX = 0;
public int MaxX = 0;
public int MinY = 0;
public int MaxY = 0;
public int Tileset = 0;
public string Name;
public TileSetArea(int minx, int maxx, int miny, int maxy, int tileset, string name)
{
MinX = minx;
MinY = miny;
MaxY = maxy;
MaxX = maxx;
Tileset = tileset;
Name = name;
}
}
class Tiles
{
public int X = 0;
public int Y = 0;
public int TileID = 0;
public bool Overlay;
public Tiles(int mX, int mY, int mTileID, bool mOverlay)
{
X = mX;
Y = mY;
TileID = mTileID;
Overlay = mOverlay;
}
}
class HI1Protocal
{
private static bool HasTped = false;
private static bool WaitMove = false;
private const byte PACKET_LOGIN = 0x7F;
private const byte PACKET_CHAT = 0x14;
private const byte PACKET_MOVE = 0x15;
private const byte PACKET_USERINFO = 0x81;
private const byte PACKET_SWF = 0x28;
private const byte PACKET_SWF_3 = 0x29;
private const byte PACKET_SWF_2 = 0x2A;
private const byte PACKET_TILEINFO = 0x1E;
private const byte PACKET_MOVEMENT = 0x15;
private const byte PACKET_BIRDSEYE_MAP = 0x76;
private const byte PACKET_TILESET_AREA = 0x79;
private const byte PACKET_DISCONNECT = 0x80;
private const byte LOGIN_INVALID_USER_PASS = 0x15;
private const byte LOGIN_SUCCESS = 0x14;
private const byte CHAT_ALL = 0x14;
private const byte CHAT_BUDDIES = 0x17;
private const byte CHAT_HERE = 0x24;
private const byte CHAT_RESP_BLEFT = 0x14;
private const byte CHAT_RESP_BRIGHT = 0x15;
private const byte MOVE_UP = 0x14;
private const byte MOVE_DOWN = 0x15;
private const byte MOVE_RIGHT = 0x16;
private const byte MOVE_LEFT = 0x17;
private const byte MOVE_EXIT = 0x10;
public static int giveQuestId = 0;
public static bool WaitQuest = false;
private static bool hasLoggedIn = false;
private static byte[] SecCodeSeeds = new byte[3];
private static int SecCodeInc = 0;
private static int SecCodeCount = 0;
private static bool IsAdmin = false;
private static bool IsMod = false;
private static int X = 0;
private static int Y = 0;
private static bool STOPIT = false;
private static int WalkToX = 0;
private static int WalkToY = 0;
private static int Facing = 0;
private static bool inProgress = false;
private static List<TileSetArea> tileSetAreas = new List<TileSetArea>();
private static List<Tiles> tiles = new List<Tiles>();
public static Bitmap MapData = new Bitmap(1000, 500, PixelFormat.Format24bppRgb);
public static Bitmap oMapData = new Bitmap(1000, 500, PixelFormat.Format24bppRgb);
public static Socket HI1Server;
public static Socket Hi1Client;
public static String DecryptLogin(string encpass)
{
string decrypt = "";
string ROTPOOL = "bl7Jgk61IZdnY mfDN5zjM2XLqTCty4WSEoKR3BFVQsaUhHOAx0rPwp9uc8iGve";
string POSPOOL = "DQc3uxiGsKZatMmOS5qYveN71zoPTk8yU0H2w9VjprBXWn l4FJd6IRbhgACfEL";
string ROTPOOL2 = "evGi8cu9pwPr0xAOHhUasQVFB3RKoESW4ytCTqLX2Mjz5NDfm YndZI16kgJ7lb";
int i = 0;
int ii = 0;
while (i < encpass.Length)
{
int ROT = ROTPOOL.IndexOf(encpass[i].ToString());
int POS = POSPOOL.IndexOf(encpass[i + 1].ToString());
POS -= (ROT + ii);
if (POS < 0)
{
POS = (POS / -1) - 1;
while (POS >= ROTPOOL.Length)
{
POS -= ROTPOOL.Length;
}
decrypt += ROTPOOL2[POS];
}
else
{
while (POS >= ROTPOOL.Length)
{
POS -= ROTPOOL.Length;
}
decrypt += ROTPOOL[POS];
}
i += 2;
ii += 1;
}
return decrypt.Replace(" ", "");
}
private static void DecodeMovementPacket(byte[] Packet)
{
//Console.WriteLine("DEBUG: "+BitConverter.ToString(Packet));
byte movement_direction = Packet[1];
switch(movement_direction)
{
case MOVE_UP:
Console.WriteLine("Move up!");
break;
case MOVE_DOWN:
Console.WriteLine("Move down!");
break;
case MOVE_LEFT:
Console.WriteLine("Move left!");
break;
case MOVE_RIGHT:
Console.WriteLine("Move right!");
break;
case MOVE_EXIT:
Console.WriteLine("Exit this place!");
break;
default:
Console.WriteLine("Move unknown! " + movement_direction);
break;
}
}
private static void DecodeLoginResponsePacket(byte[] Packet)
{
byte login_resp = Packet[1];
switch (login_resp)
{
case LOGIN_INVALID_USER_PASS:
Console.WriteLine("Invalid username / password!");
break;
case LOGIN_SUCCESS:
Console.WriteLine("Login success!");
hasLoggedIn = true;
break;
default:
Console.WriteLine("Unknown login code: " + BitConverter.ToString(Packet).Replace("-", " "));
break;
}
}
private static void DecodeLoginRequestPacket(byte[] Packet)
{
if(!hasLoggedIn)
{
string encryptedPassword = Encoding.UTF8.GetString(Packet).Substring(1);
string[] loginParts = encryptedPassword.Split('|');
int Version = int.Parse(loginParts[0]);
string EncryptedUsername = loginParts[1];
string EncryptedPassword = loginParts[2];
string Username = DecryptLogin(EncryptedUsername);
string Password = DecryptLogin(EncryptedPassword);
Console.WriteLine("Version: " + Version);
Console.WriteLine("Username: " + Username);
Console.WriteLine("Password: " + Password);
}
else
{
Console.WriteLine("Get user information.");
}
}
public static bool ParseHi1ResponsePackets(byte[] FullPacket)
{
return ParseServerResponsePacket(FullPacket);
byte split = 0x00;
List<byte[]> result = new List<byte[]>();
int start = 0;
for (int i = 0; i < FullPacket.Length; i++)
{
if (FullPacket[i] == split && i != 0)
{
byte[] _in = new byte[i - start];
Array.Copy(FullPacket, start, _in, 0, i - start);
result.Add(_in);
start = i + 1;
}
else if (FullPacket[i] == split && i == 0)
{
start = i + 1;
}
else if (FullPacket.Length - 1 == i && i != start)
{
byte[] _in = new byte[i - start + 1];
Array.Copy(FullPacket, start, _in, 0, i - start + 1);
result.Add(_in);
}
}
foreach (byte[] Packet in result)
{
ParseServerResponsePacket(Packet);
}
}
private static void DecodeChatResponsePacket(byte[] Packet)
{
byte chatid = Packet[1];
if (Packet.Length <= 4)
{
return;
}
string ChatMsg = "";
switch (chatid)
{
case CHAT_RESP_BRIGHT:
ChatMsg = Encoding.UTF8.GetString(Packet).Substring(2, Packet.Length - 3);
Console.WriteLine("BOTTOM RIGHT: " + ChatMsg);
break;
case CHAT_RESP_BLEFT:
ChatMsg = Encoding.UTF8.GetString(Packet).Substring(2, Packet.Length - 3);
Console.WriteLine("BOTTOM LEFT: " + ChatMsg);
break;
}
}
private static void CopyPixels(Bitmap sourceBitmapData, Graphics destBitmapData, Rectangle sourceRect, Point destPoint)
{
Rectangle dstResion = new Rectangle(destPoint.X, destPoint.Y, sourceRect.Width, sourceRect.Height);
destBitmapData.DrawImage(sourceBitmapData, dstResion, sourceRect, GraphicsUnit.Pixel);
}
private static Bitmap DetermineTileset(int MX, int MY)
{
for (int i = 0; i < tileSetAreas.Count; i++)
{
if (tileSetAreas[i].MinX <= MX && tileSetAreas[i].MaxX >= MX && tileSetAreas[i].MinY <= MY && tileSetAreas[i].MaxY >= MY)
{
int tileSetId = tileSetAreas[i].Tileset;
switch(tileSetId)
{
case 0:
return Properties.Resources.Overlay0;
case 1:
return Properties.Resources.Overlay1;
case 2:
return Properties.Resources.Overlay2;
case 3:
return Properties.Resources.Overlay3;
case 4:
return Properties.Resources.Overlay4;
case 5:
return Properties.Resources.Overlay5;
case 6:
return Properties.Resources.Overlay6;
case 7:
return Properties.Resources.Overlay7;
}
}
}
return Properties.Resources.Overlay0;
}
//SELECT DISTINCT X,Y,TILEID FROM MapData WHERE X = 1 AND Y BETWEEN 0 AND 498
public static int GetTileFromDatabase(int x,int y,bool overlay)
{
if (overlay)
return oMapData.GetPixel(x, y).B;
else
return MapData.GetPixel(x, y).B;
}
public static void RebuildMapPngFromDb()
{
Console.WriteLine("Redrawing map from saved db...");
int xx = 0;
int yy = 0;
int map_width = 997 + 2;
int map_height = 496 + 2;
Bitmap FULL_BRIDGE_RECTIFIER = new Bitmap(map_width * 32, map_height * 32);
Graphics FullMapGraphics = Graphics.FromImage(FULL_BRIDGE_RECTIFIER);
while(xx < map_width)
{
yy = 0;
while (yy < map_height)
{
int beMap = GetTileFromDatabase(xx, yy, false);
int beoMap = GetTileFromDatabase(xx, yy, true);
Console.WriteLine("X " + xx.ToString());
Console.WriteLine("Y " + yy.ToString());
Console.WriteLine("beMap " + beMap.ToString("X"));
Console.WriteLine("beoMap " + beoMap.ToString("X"));
if (beMap >= 2)
{
CopyPixels(Resources.TileSet, FullMapGraphics, new Rectangle((beMap - 2) % 8 * 32, ((beMap - 2) / 8) * 32, 32, 32), new Point((xx - 1) * 32, (yy - 1) * 32));
}
if (beoMap >= 2)
{
if (beoMap - 2 < 192)
{
CopyPixels(Resources.TileOverlay, FullMapGraphics, new Rectangle((beoMap - 2) % 8 * 32, ((beoMap - 2) / 8) * 48, 32, 48), new Point((xx - 1) * 32, (yy - 1) * 32 - 8));
}
else
{
CopyPixels(DetermineTileset(xx, yy), FullMapGraphics, new Rectangle((beoMap - 194) % 8 * 32, ((beoMap - 194) / 8) * 48, 32, 48), new Point((xx - 1) * 32, (yy - 1) * 32 - 8));
}
}
yy++;
}
xx++;
}
FULL_BRIDGE_RECTIFIER.Save(@"Map-Redraw.png");
}
public static void DecodeBirdMapResponsePacket(byte[] Packet)
{
Console.WriteLine("Decoding Bird Map.");
MoveNext();
// Bitmap MapData = new Bitmap(1568, 992);
Point MapStart = new Point(X - 21, Y - 15);
Graphics MapDataGraphics = Graphics.FromImage(MapData);
// Read map data.
int beMap = 0;
int beoMap = 0;
int pixelPos = 1;
int relY = 1;
int relX = 1;
while (relY <= 31)
{
relX = 1;
while (relX <= 49)
{
if (Packet[pixelPos] == 190)
{
pixelPos++;
beMap = Packet[pixelPos] + 100;
// tiles.Add(new Tiles((MapStart.X + (relX - 1)), (MapStart.Y + (relY - 1)), beMap, false));
pixelPos++;
}
else
{
beMap = Packet[pixelPos++];
// tiles.Add(new Tiles(MapStart.X + (relX - 1), MapStart.Y + (relY - 1), beMap, false));
}
if (Packet[pixelPos] == 190)
{
pixelPos++;
beoMap = Packet[pixelPos] + 100;
// tiles.Add(new Tiles(MapStart.X + (relX - 1), MapStart.Y + (relY - 1), beoMap, true));
pixelPos++;
}
else
{
beoMap = Packet[pixelPos++];
// tiles.Add(new Tiles(MapStart.X + (relX - 1), MapStart.Y + (relY - 1), beoMap, true));
}
// Draw tile
int PixelX = MapStart.X + relX;
int PixelY = MapStart.Y + relY;
if ((PixelX > 0 && PixelX < MapData.Width) && (PixelY > 0 && PixelY < MapData.Height))
{
MapData.SetPixel(PixelX, PixelY, Color.FromArgb(beMap));
oMapData.SetPixel(PixelX, PixelY, Color.FromArgb(beoMap));
}
/*
if (beMap >= 2)
{
CopyPixels(Resources.TileSet, MapDataGraphics, new Rectangle((beMap - 2) % 8 * 32, ((beMap - 2) / 8) * 32, 32, 32),new Point((relY -1) * 32, (relX - 1) * 32));
}
if (beoMap >= 2)
{
if (beoMap - 2 < 192)
{
CopyPixels(Resources.TileOverlay, MapDataGraphics, new Rectangle((beoMap - 2) % 8 * 32, ((beoMap - 2) / 8) * 48, 32, 48), new Point((relY - 1) * 32, (relX - 1) * 32 - 8));
}
else
{
CopyPixels(DetermineTileset(MapStart.X + relX,MapStart.Y + relY), MapDataGraphics, new Rectangle((beoMap - 194) % 8 * 32, ((beoMap - 194) / 8) * 48, 32, 48), new Point((relY - 1) * 32, (relX - 1) * 32 - 8));
}
}
*/
relX++;
}
relY++;
}
/*
try
{
Bitmap TotalMap = new Bitmap(@"D:\smoking_gun_txt\hi1\Private Server\FullScaleMap.png");
Graphics TotalMapGraphics = Graphics.FromImage(TotalMap);
CopyPixels(MapData, TotalMapGraphics, new Rectangle(0, 0, MapData.Width, MapData.Height), new Point(MapStart.X * 32, MapStart.Y * 32));
TotalMapGraphics.Dispose();
TotalMap.Save(@"D:\smoking_gun_txt\hi1\Private Server\FullScaleMapo.png");
TotalMap.Dispose();
File.Delete(@"D:\smoking_gun_txt\hi1\Private Server\FullScaleMap.png");
File.Move(@"D:\smoking_gun_txt\hi1\Private Server\FullScaleMapo.png", @"D:\smoking_gun_txt\hi1\Private Server\FullScaleMap.png");
}
catch (Exception)
{
}
*/
try
{
if (File.Exists("MapData.bmp"))
File.Delete("MapData.bmp");
if (File.Exists("oMapData.bmp"))
File.Delete("oMapData.bmp");
MapData.Save("MapData.bmp", ImageFormat.Bmp);
oMapData.Save("oMapData.bmp", ImageFormat.Bmp);
}
catch(Exception)
{
}
//M Program.mpForm.OpenBitmap();
Console.WriteLine("Saved bird map.");
}
private static void DecodeTileAreasResponsePacket(byte[] Packet)
{
string[] AreaCodes = Encoding.ASCII.GetString(Packet).Substring(2).Split('^');
int ti = 0;
while (ti < AreaCodes.Length)
{
if(AreaCodes[ti][0] == 'T')
{
int minx = ((AreaCodes[ti][1] - 20) * 64 + AreaCodes[ti][2] - 20) + 4;
int maxx = ((AreaCodes[ti][3] - 20) * 64 + AreaCodes[ti][4] - 20) + 4;
int miny = ((AreaCodes[ti][5] - 20) * 64 + AreaCodes[ti][6] - 20) + 1;
int maxy = ((AreaCodes[ti][7] - 20) * 64 + AreaCodes[ti][8] - 20) + 1;
string name = AreaCodes[ti].Substring(9);
Area area = new Area(minx, maxx, miny, maxy, name);
// Console.WriteLine(JsonConvert.SerializeObject(area));
}
else if (AreaCodes[ti][0] == 'A')
{
int minx = ((AreaCodes[ti][1] - 20) * 64 + AreaCodes[ti][2] - 20) + 4;
int maxx = ((AreaCodes[ti][3] - 20) * 64 + AreaCodes[ti][4] - 20) + 4;
int miny = ((AreaCodes[ti][5] - 20) * 64 + AreaCodes[ti][6] - 20) + 1;
int maxy = ((AreaCodes[ti][7] - 20) * 64 + AreaCodes[ti][8] - 20) + 1;
string name = AreaCodes[ti].Substring(9);
Area area = new Area(minx, maxx, miny, maxy, name);
Console.WriteLine(JsonConvert.SerializeObject(area));
}
else if (AreaCodes[ti][0] == 'I')
{
int minx = (AreaCodes[ti][1] - 20) * 64 + AreaCodes[ti][2] - 20;
int maxx = (AreaCodes[ti][3] - 20) * 64 + AreaCodes[ti][4] - 20;
int miny = (AreaCodes[ti][5] - 20) * 64 + AreaCodes[ti][6] - 20;
int maxy = (AreaCodes[ti][7] - 20) * 64 + AreaCodes[ti][8] - 20;
int tileset = Int32.Parse(AreaCodes[ti].Substring(9, 1));
string name = AreaCodes[ti].Substring(10);
/* Console.WriteLine("Name: " + );
Console.WriteLine("MinX: " + minx.ToString());
Console.WriteLine("MaxX: " + maxx.ToString());
Console.WriteLine("MinY: " + miny.ToString());
Console.WriteLine("MaxY: " + maxy.ToString());
Console.WriteLine("Tileset: " + tileset.ToString());*/
TileSetArea tsetArea = new TileSetArea(minx+4,maxx+4,miny+1,maxy+1,tileset,name);
//Console.WriteLine(JsonConvert.SerializeObject(tsetArea));
tileSetAreas.Add(tsetArea);
}
else
{
Console.WriteLine("unknown: " + AreaCodes[ti][0]);
}
ti++;
}
}
private static void DecodeMovementResponsePacket(byte[] Packet)
{
int newX = (Packet[1] - 20) * 64 + Packet[2] - 20;
int newY = (Packet[3] - 20) * 64 + Packet[4] - 20;
int charid = (Packet[6] - 20) * 64 + Packet[7] - 20;
int direction = Packet[8] - 20;
int newFacing = Packet[5] - 20;
Console.WriteLine("Movement:");
Console.WriteLine("X: " + newX);
Console.WriteLine("Y: " + newY);
Console.WriteLine("Facing: " + newFacing);
Console.WriteLine("Character: " + charid);
Console.WriteLine("Direction: " + direction);
X = newX;
Y = newY;
Facing = newFacing;
if(WaitQuest)
{
giveQuestId++;
GiveQuest(giveQuestId);
}
if(WaitMove)
{
WaitMove = false;
MoveTowards(WalkToX, WalkToY);
}
if(HasTped)
{
HasTped = false;
byte[] RequestMap = new byte[] { 0x76, 0x0A, 0x00 };
ParseClientRequestPacket(RequestMap);
HI1Server.Send(RequestMap);
}
}
private static void MoveTowards(int newX, int newY)
{
Console.WriteLine("MOVE TOWARDS: " + newX.ToString() + " " + newY.ToString());
if(X == newX && Y == newY)
{
byte[] RequestMap = new byte[] { 0x76, 0x0A, 0x00 };
ParseClientRequestPacket(RequestMap);
HI1Server.Send(RequestMap);
return;
}
MemoryStream ms = new MemoryStream();
ms.WriteByte(PACKET_MOVE);
if (X > newX)
{
ms.WriteByte(MOVE_LEFT);
}
else if(X < newX)
{
ms.WriteByte(MOVE_RIGHT);
}
else if(Y > newY)
{
ms.WriteByte(MOVE_UP);
}
else if(Y < newY)
{
ms.WriteByte(MOVE_DOWN);
}
ms.WriteByte(0x0a);
ms.WriteByte(0x00);
ms.Seek(0x00, SeekOrigin.Begin);
byte[] Packet = ms.ToArray();
ms.Dispose();
ParseClientRequestPacket(Packet);
try
{
HI1Server.Send(Packet);
}
catch (Exception)
{
Console.WriteLine("Huh?");
}
WaitMove = true;
WalkToX = newX;
WalkToY = newY;
}
private static void AdminTeleportRequest(string x, string y)
{
MemoryStream ms = new MemoryStream();
ms.WriteByte(PACKET_CHAT);
ms.WriteByte(CHAT_HERE);
byte[] TpCommand = Encoding.UTF8.GetBytes("%GOTO " + x + "," + y+"\n");
ms.Write(TpCommand, 0x00, TpCommand.Length);
ms.WriteByte(0x00);
ms.Seek(0x00, SeekOrigin.Begin);
byte[] Packet = ms.ToArray();
ms.Dispose();
ParseClientRequestPacket(Packet);
try
{
HI1Server.Send(Packet);
}
catch(Exception)
{
Console.WriteLine("Huh?");
}
HasTped = true;
}
private static void GiveMoneyRequest(int amount)
{
byte[] SecCode = GenerateSecCode();
byte[] idStr = Encoding.ASCII.GetBytes("puzzle1");
byte[] amountStr = Encoding.ASCII.GetBytes(amount.ToString());
MemoryStream ms = new MemoryStream();
byte[] ByteArray = new byte[] { 0x18, 0x1E, SecCode[0], SecCode[1], SecCode[2], SecCode[3] };
ms.Write(ByteArray, 0x00, ByteArray.Length);
ms.Write(idStr, 0x00, idStr.Length);
ms.WriteByte(0x7c);
ms.Write(amountStr, 0x00, amountStr.Length);
ms.WriteByte(0x0a);
ms.WriteByte(0x00);
ms.Seek(0x00, SeekOrigin.Begin);
byte[] packet = ms.ToArray();
ParseClientRequestPacket(packet);
HI1Server.Send(packet);
ms.Dispose();
}
private static void PawneerOrderHorsePacket(int itemId)
{
byte[] idStr = Encoding.ASCII.GetBytes(itemId.ToString());
MemoryStream ms = new MemoryStream();
byte[] ByteArray = new byte[] { 0x45, 0x34, 0x38, 0x63 };
ms.Write(ByteArray, 0x00, ByteArray.Length);
ms.Write(idStr, 0x00, idStr.Length);
ms.WriteByte(0x0a);
ms.WriteByte(0x00);
ms.Seek(0x00, SeekOrigin.Begin);
byte[] packet = ms.ToArray();
ParseClientRequestPacket(packet);
HI1Server.Send(packet);
ms.Dispose();
}
private static void WrapItemPacke(int itemId)
{
byte[] idStr = Encoding.ASCII.GetBytes(itemId.ToString());
MemoryStream ms = new MemoryStream();
byte[] ByteArray = new byte[] { 0x1E, 0x17 };
ms.Write(ByteArray, 0x00, ByteArray.Length);
ms.Write(idStr, 0x00, idStr.Length);
ms.WriteByte(0x0a);
ms.WriteByte(0x00);
ms.Seek(0x00, SeekOrigin.Begin);
byte[] packet = ms.ToArray();
ParseClientRequestPacket(packet);
HI1Server.Send(packet);
ms.Dispose();
}
private static void ReleaseHorseRequest(int itemId)
{
byte[] idStr = Encoding.ASCII.GetBytes(itemId.ToString());
MemoryStream ms = new MemoryStream();
byte[] ByteArray = new byte[] { 0x19, 0x19 };
ms.Write(ByteArray, 0x00, ByteArray.Length);
ms.Write(idStr, 0x00, idStr.Length);
ms.WriteByte(0x0a);
ms.WriteByte(0x00);
ms.Seek(0x00, SeekOrigin.Begin);
byte[] packet = ms.ToArray();
ParseClientRequestPacket(packet);
HI1Server.Send(packet);
ms.Dispose();
}
private static void GiveItemRequest(int itemId)
{
byte[] SecCode = GenerateSecCode();
byte[] idStr = Encoding.ASCII.GetBytes(itemId.ToString());
MemoryStream ms = new MemoryStream();
byte[] ByteArray = new byte[] { 0x18, 0x28, SecCode[0], SecCode[1], SecCode[2], SecCode[3] };
ms.Write(ByteArray, 0x00, ByteArray.Length);
ms.Write(idStr, 0x00, idStr.Length);
ms.WriteByte(0x0a);
ms.WriteByte(0x00);
ms.Seek(0x00, SeekOrigin.Begin);
byte[] packet = ms.ToArray();
ParseClientRequestPacket(packet);
HI1Server.Send(packet);
ms.Dispose();
}
private static void GiveQuest(int questId, bool all = false)
{
byte[] SecCode = GenerateSecCode();
byte[] idStr = Encoding.ASCII.GetBytes(questId.ToString());
byte[] ByteArray = new byte[] { 0x18, 0x32, SecCode[0], SecCode[1], SecCode[2], SecCode[3] };
MemoryStream ms = new MemoryStream();
ms.Write(ByteArray, 0x00, ByteArray.Length);
ms.Write(idStr, 0x00, idStr.Length);
ms.WriteByte(0x0a);
ms.WriteByte(0x00);
ms.Seek(0x00, SeekOrigin.Begin);
byte[] packetData = ms.ToArray();
ParseClientRequestPacket(packetData);
HI1Server.Send(packetData);
}
private static void MoveNext()
{
if(STOPIT == true)
{
STOPIT = false;
return;
}
int NewY = Y;
int NewX = X + 45;
if (X == 995)
{
NewX = 20;
NewY = Y + 28;
}
if (NewX > 995)
NewX = 995;
MoveTowards(NewX, NewY);
}
private static void DownloadSwf(string Swf)
{
Console.WriteLine("Load Swf: " + Swf);
if (Swf.Contains("?"))
Swf = Swf.Split('?')[0];
WebClient wc = new WebClient();
if (!Directory.Exists("mod"))
Directory.CreateDirectory("mod");
if (!Swf.EndsWith(".swf"))
Swf += ".swf";
string filename = Path.Combine("mod", Swf);
wc.DownloadFile("http://pinto.horseisle.com/mod/" + Swf, filename);
Console.WriteLine("Downloaded swf: " + Swf);
}
private static void DecodeSwfLoadPacket(byte[] Packet)
{
string Swf = Encoding.UTF8.GetString(Packet).Substring(1, Packet.Length - 2);
DownloadSwf(Swf);
}
private static bool DecodeChatSendPacket(byte[] Packet)
{
byte chatid = Packet[1];
string ChatMsg = "";
switch (chatid)
{
case CHAT_ALL:
ChatMsg = Encoding.UTF8.GetString(Packet).Substring(2,Packet.Length-3);
Console.WriteLine("ALL: " + ChatMsg);
break;
case CHAT_HERE:
ChatMsg = Encoding.UTF8.GetString(Packet).Substring(2, Packet.Length - 3);
Console.WriteLine("HERE: " + ChatMsg);
break;
case CHAT_BUDDIES:
ChatMsg = Encoding.UTF8.GetString(Packet).Substring(2, Packet.Length - 3);
Console.WriteLine("BUDDIES: " + ChatMsg);
break;
default:
ChatMsg = Encoding.UTF8.GetString(Packet).Substring(2, Packet.Length - 3);
Console.WriteLine(chatid+": " + ChatMsg);
break;
}
if(ChatMsg.StartsWith("."))
{
string[] commandArgs = ChatMsg.Split(' ');
string command = commandArgs[0];
if (command == ".QA")
{
giveQuestId = Int32.Parse(commandArgs[1]);
WaitQuest = true;
}
if (command == ".Q")
{
GiveQuest(Int32.Parse(commandArgs[1]));
}
else if(command == ".M")
{
GiveMoneyRequest(Int32.Parse(commandArgs[1]));
}
else if(command == ".I")
{
GiveItemRequest(Int32.Parse(commandArgs[1]));
}
else if(command == ".R")
{
ReleaseHorseRequest(Int32.Parse(commandArgs[1]));
}
else if(command == ".W")
{
WrapItemPacke(Int32.Parse(commandArgs[1]));
}
else if(command == ".PO")
{
PawneerOrderHorsePacket(Int32.Parse(commandArgs[1]));
}
else if(command == ".S")
{
byte[] ByteArray = new byte[] { 0x45, 0x35, 0x32, 0x63, 0x33, 0x0A, 0x00 };
ParseClientRequestPacket(ByteArray);
HI1Server.Send(ByteArray);
}
else if(command == ".PP")
{
byte[] pingbongball = new byte[] { 0x7c, 0x0a, 0x00 };
ParseClientRequestPacket(pingbongball);
HI1Server.Send(pingbongball);
}
else if(command == ".FT")
{
byte[] TIlesets = new byte[] { 0x79, 0x5E, 0x41, 0x1B, 0x28, 0x1B, 0x2B, 0x16, 0x4E, 0x16, 0x4F, 0x50, 0x61, 0x73, 0x74, 0x20, 0x49, 0x74, 0x73, 0x20, 0x50, 0x72, 0x69, 0x6D, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x17, 0x2B, 0x17, 0x2D, 0x16, 0x1B, 0x16, 0x1D, 0x54, 0x72, 0x6F, 0x70, 0x69, 0x63, 0x74, 0x6F, 0x6E, 0x20, 0x56, 0x69, 0x6C, 0x6C, 0x61, 0x67, 0x65, 0x5E, 0x41, 0x18, 0x4A, 0x18, 0x4C, 0x16, 0x48, 0x16, 0x4B, 0x56, 0x65, 0x6C, 0x76, 0x65, 0x74, 0x65, 0x65, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1D, 0x35, 0x1D, 0x38, 0x18, 0x31, 0x18, 0x33, 0x30, 0x54, 0x68, 0x65, 0x20, 0x4E, 0x65, 0x76, 0x65, 0x72, 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x73, 0x5E, 0x41, 0x18, 0x4D, 0x18, 0x4F, 0x16, 0x4B, 0x16, 0x4E, 0x56, 0x65, 0x6C, 0x76, 0x65, 0x74, 0x65, 0x65, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1E, 0x30, 0x1E, 0x33, 0x18, 0x17, 0x18, 0x19, 0x30, 0x53, 0x6F, 0x6C, 0x6F, 0x6D, 0x6F, 0x6E, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x54, 0x18, 0x43, 0x18, 0x46, 0x15, 0x39, 0x15, 0x3B, 0x52, 0x61, 0x69, 0x6E, 0x79, 0x20, 0x4D, 0x65, 0x61, 0x64, 0x6F, 0x77, 0x73, 0x5E, 0x41, 0x1B, 0x29, 0x1B, 0x2D, 0x16, 0x4C, 0x16, 0x4E, 0x50, 0x61, 0x73, 0x74, 0x20, 0x49, 0x74, 0x73, 0x20, 0x50, 0x72, 0x69, 0x6D, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1B, 0x26, 0x1B, 0x2A, 0x16, 0x50, 0x16, 0x52, 0x50, 0x61, 0x73, 0x74, 0x20, 0x49, 0x74, 0x73, 0x20, 0x50, 0x72, 0x69, 0x6D, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1E, 0x37, 0x1E, 0x3B, 0x16, 0x1B, 0x16, 0x1D, 0x4D, 0x79, 0x73, 0x74, 0x69, 0x63, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1B, 0x31, 0x1B, 0x34, 0x1A, 0x37, 0x1A, 0x3A, 0x54, 0x6F, 0x61, 0x73, 0x74, 0x79, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1C, 0x4E, 0x1C, 0x50, 0x17, 0x48, 0x17, 0x4D, 0x4D, 0x75, 0x7A, 0x7A, 0x6C, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x1D, 0x2D, 0x1D, 0x31, 0x16, 0x40, 0x16, 0x43, 0x43, 0x61, 0x6E, 0x74, 0x6C, 0x65, 0x20, 0x4D, 0x65, 0x61, 0x64, 0x6F, 0x77, 0x73, 0x5E, 0x41, 0x19, 0x4A, 0x19, 0x50, 0x17, 0x3F, 0x17, 0x41, 0x46, 0x6C, 0x69, 0x70, 0x70, 0x65, 0x72, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1B, 0x19, 0x1B, 0x1D, 0x1A, 0x38, 0x1A, 0x3B, 0x53, 0x77, 0x65, 0x6C, 0x74, 0x72, 0x79, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x22, 0x3A, 0x22, 0x3C, 0x15, 0x15, 0x15, 0x1C, 0x50, 0x61, 0x74, 0x63, 0x68, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x37, 0x19, 0x39, 0x18, 0x30, 0x18, 0x37, 0x46, 0x6C, 0x69, 0x70, 0x70, 0x65, 0x72, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x44, 0x19, 0x48, 0x17, 0x38, 0x17, 0x3C, 0x42, 0x6C, 0x6F, 0x77, 0x68, 0x6F, 0x6C, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x18, 0x3B, 0x18, 0x3F, 0x17, 0x31, 0x17, 0x35, 0x42, 0x75, 0x6E, 0x6E, 0x79, 0x20, 0x48, 0x6F, 0x70, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x44, 0x19, 0x4C, 0x17, 0x42, 0x17, 0x44, 0x46, 0x6C, 0x69, 0x70, 0x70, 0x65, 0x72, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1B, 0x15, 0x1B, 0x19, 0x17, 0x1F, 0x17, 0x23, 0x53, 0x65, 0x61, 0x20, 0x6F, 0x66, 0x20, 0x53, 0x61, 0x6E, 0x64, 0x5E, 0x41, 0x1D, 0x21, 0x1D, 0x22, 0x17, 0x3B, 0x17, 0x4C, 0x4D, 0x75, 0x7A, 0x7A, 0x6C, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x44, 0x19, 0x4D, 0x16, 0x44, 0x16, 0x46, 0x43, 0x61, 0x74, 0x6E, 0x69, 0x70, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1B, 0x31, 0x1B, 0x37, 0x1A, 0x33, 0x1A, 0x36, 0x54, 0x6F, 0x61, 0x73, 0x74, 0x79, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1D, 0x3A, 0x1D, 0x3F, 0x17, 0x2D, 0x17, 0x31, 0x30, 0x50, 0x61, 0x6C, 0x6D, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x1C, 0x14, 0x1C, 0x16, 0x19, 0x29, 0x19, 0x33, 0x54, 0x61, 0x69, 0x6C, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1A, 0x17, 0x1A, 0x1B, 0x15, 0x26, 0x15, 0x2B, 0x46, 0x6C, 0x6F, 0x77, 0x65, 0x72, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x15, 0x19, 0x19, 0x17, 0x4F, 0x18, 0x14, 0x54, 0x68, 0x75, 0x6D, 0x70, 0x65, 0x72, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x40, 0x19, 0x45, 0x15, 0x1D, 0x15, 0x21, 0x53, 0x6E, 0x6F, 0x77, 0x79, 0x20, 0x41, 0x63, 0x72, 0x65, 0x73, 0x5E, 0x54, 0x18, 0x16, 0x18, 0x1B, 0x19, 0x42, 0x19, 0x46, 0x54, 0x61, 0x69, 0x6C, 0x20, 0x45, 0x6E, 0x64, 0x5E, 0x41, 0x1E, 0x1E, 0x1E, 0x23, 0x16, 0x37, 0x16, 0x3B, 0x4D, 0x79, 0x73, 0x74, 0x69, 0x63, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1A, 0x33, 0x1A, 0x3A, 0x19, 0x24, 0x19, 0x27, 0x4D, 0x6F, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x18, 0x3C, 0x18, 0x3F, 0x17, 0x41, 0x17, 0x48, 0x42, 0x75, 0x6E, 0x6E, 0x79, 0x20, 0x48, 0x6F, 0x70, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x3F, 0x19, 0x41, 0x18, 0x22, 0x18, 0x2D, 0x46, 0x6C, 0x69, 0x70, 0x70, 0x65, 0x72, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x39, 0x19, 0x44, 0x16, 0x52, 0x17, 0x14, 0x43, 0x61, 0x74, 0x6E, 0x69, 0x70, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x18, 0x3F, 0x18, 0x4B, 0x19, 0x20, 0x19, 0x22, 0x44, 0x65, 0x77, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1A, 0x3F, 0x1A, 0x4B, 0x19, 0x31, 0x19, 0x33, 0x4D, 0x6F, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x17, 0x2F, 0x17, 0x32, 0x16, 0x2C, 0x16, 0x34, 0x54, 0x72, 0x6F, 0x70, 0x69, 0x63, 0x74, 0x6F, 0x6E, 0x5E, 0x54, 0x19, 0x3C, 0x19, 0x44, 0x16, 0x45, 0x16, 0x48, 0x57, 0x68, 0x69, 0x73, 0x6B, 0x65, 0x72, 0x74, 0x6F, 0x6E, 0x5E, 0x41, 0x19, 0x4A, 0x19, 0x4F, 0x15, 0x2C, 0x15, 0x31, 0x50, 0x61, 0x69, 0x6E, 0x74, 0x65, 0x64, 0x20, 0x42, 0x61, 0x79, 0x5E, 0x41, 0x19, 0x37, 0x19, 0x3C, 0x15, 0x23, 0x15, 0x28, 0x53, 0x61, 0x6E, 0x64, 0x79, 0x20, 0x50, 0x61, 0x6C, 0x6D, 0x73, 0x5E, 0x41, 0x1D, 0x14, 0x1D, 0x18, 0x18, 0x4C, 0x18, 0x53, 0x53, 0x68, 0x65, 0x6C, 0x6C, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x44, 0x19, 0x48, 0x17, 0x51, 0x18, 0x18, 0x46, 0x6C, 0x69, 0x70, 0x70, 0x65, 0x72, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1D, 0x27, 0x1D, 0x2B, 0x18, 0x43, 0x18, 0x4A, 0x53, 0x68, 0x65, 0x6C, 0x6C, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x1A, 0x42, 0x1A, 0x49, 0x1A, 0x4E, 0x1A, 0x52, 0x53, 0x61, 0x6E, 0x64, 0x79, 0x20, 0x4D, 0x65, 0x61, 0x64, 0x6F, 0x77, 0x73, 0x5E, 0x41, 0x19, 0x14, 0x19, 0x1B, 0x18, 0x42, 0x18, 0x46, 0x57, 0x69, 0x6C, 0x64, 0x66, 0x6C, 0x6F, 0x77, 0x65, 0x72, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x4E, 0x1A, 0x14, 0x19, 0x29, 0x19, 0x2E, 0x4C, 0x6F, 0x73, 0x74, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1E, 0x3F, 0x1E, 0x44, 0x18, 0x44, 0x18, 0x4A, 0x30, 0x4E, 0x6F, 0x6E, 0x65, 0x73, 0x75, 0x63, 0x68, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x1D, 0x28, 0x1D, 0x2B, 0x17, 0x41, 0x17, 0x4B, 0x4D, 0x75, 0x7A, 0x7A, 0x6C, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x35, 0x19, 0x3A, 0x16, 0x4D, 0x16, 0x53, 0x43, 0x61, 0x74, 0x6E, 0x69, 0x70, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x18, 0x29, 0x18, 0x2E, 0x18, 0x3F, 0x18, 0x45, 0x44, 0x61, 0x69, 0x73, 0x79, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1D, 0x4E, 0x1E, 0x14, 0x19, 0x30, 0x19, 0x35, 0x36, 0x49, 0x73, 0x6C, 0x65, 0x20, 0x6F, 0x66, 0x20, 0x48, 0x61, 0x72, 0x64, 0x6C, 0x79, 0x5E, 0x41, 0x1C, 0x44, 0x1C, 0x4C, 0x17, 0x47, 0x17, 0x4B, 0x4D, 0x75, 0x7A, 0x7A, 0x6C, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x18, 0x40, 0x18, 0x44, 0x16, 0x44, 0x16, 0x4C, 0x56, 0x65, 0x6C, 0x76, 0x65, 0x74, 0x65, 0x65, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x18, 0x3D, 0x18, 0x41, 0x16, 0x4A, 0x16, 0x52, 0x56, 0x65, 0x6C, 0x76, 0x65, 0x74, 0x65, 0x65, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x40, 0x19, 0x4B, 0x16, 0x4E, 0x16, 0x51, 0x43, 0x61, 0x74, 0x6E, 0x69, 0x70, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1B, 0x37, 0x1B, 0x39, 0x19, 0x2E, 0x19, 0x3F, 0x54, 0x61, 0x69, 0x6C, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x1B, 0x2C, 0x1B, 0x31, 0x19, 0x2F, 0x19, 0x36, 0x53, 0x75, 0x6E, 0x73, 0x68, 0x69, 0x6E, 0x65, 0x20, 0x4D, 0x65, 0x61, 0x64, 0x6F, 0x77, 0x73, 0x5E, 0x49, 0x1D, 0x3F, 0x1D, 0x44, 0x18, 0x28, 0x18, 0x2F, 0x30, 0x54, 0x68, 0x65, 0x20, 0x4E, 0x65, 0x76, 0x65, 0x72, 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x73, 0x5E, 0x41, 0x19, 0x33, 0x19, 0x38, 0x16, 0x45, 0x16, 0x4C, 0x43, 0x61, 0x74, 0x6E, 0x69, 0x70, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1D, 0x25, 0x1D, 0x2C, 0x18, 0x4A, 0x18, 0x4F, 0x53, 0x68, 0x65, 0x6C, 0x6C, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1B, 0x47, 0x1B, 0x4A, 0x18, 0x15, 0x18, 0x21, 0x4D, 0x61, 0x6E, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1D, 0x23, 0x1D, 0x29, 0x17, 0x16, 0x17, 0x1C, 0x30, 0x54, 0x61, 0x6C, 0x6F, 0x6E, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x54, 0x1C, 0x46, 0x1C, 0x4E, 0x17, 0x33, 0x17, 0x38, 0x54, 0x72, 0x65, 0x65, 0x74, 0x6F, 0x6E, 0x5E, 0x41, 0x19, 0x41, 0x19, 0x4B, 0x16, 0x3F, 0x16, 0x43, 0x43, 0x61, 0x74, 0x6E, 0x69, 0x70, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x21, 0x4F, 0x22, 0x17, 0x15, 0x2C, 0x15, 0x31, 0x43, 0x72, 0x6F, 0x73, 0x73, 0x62, 0x6F, 0x6E, 0x65, 0x73, 0x20, 0x43, 0x61, 0x6D, 0x70, 0x5E, 0x41, 0x1C, 0x2D, 0x1C, 0x32, 0x19, 0x36, 0x19, 0x3E, 0x48, 0x6F, 0x6F, 0x66, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1C, 0x32, 0x1C, 0x40, 0x17, 0x34, 0x17, 0x37, 0x57, 0x65, 0x73, 0x74, 0x20, 0x54, 0x72, 0x65, 0x65, 0x74, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1A, 0x51, 0x1B, 0x1C, 0x1A, 0x33, 0x1A, 0x37, 0x53, 0x77, 0x65, 0x6C, 0x74, 0x72, 0x79, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1C, 0x17, 0x1C, 0x20, 0x16, 0x36, 0x16, 0x3B, 0x45, 0x61, 0x72, 0x74, 0x69, 0x70, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1A, 0x3C, 0x1A, 0x45, 0x18, 0x33, 0x18, 0x38, 0x4C, 0x69, 0x74, 0x74, 0x6C, 0x65, 0x20, 0x41, 0x70, 0x70, 0x6C, 0x65, 0x74, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1A, 0x3E, 0x1A, 0x46, 0x18, 0x2D, 0x18, 0x33, 0x4C, 0x69, 0x74, 0x74, 0x6C, 0x65, 0x20, 0x41, 0x70, 0x70, 0x6C, 0x65, 0x74, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1A, 0x39, 0x1A, 0x41, 0x17, 0x3C, 0x17, 0x42, 0x50, 0x72, 0x69, 0x63, 0x6B, 0x6C, 0x79, 0x20, 0x53, 0x70, 0x69, 0x74, 0x5E, 0x41, 0x1A, 0x32, 0x1A, 0x36, 0x19, 0x18, 0x19, 0x24, 0x4D, 0x6F, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1C, 0x39, 0x1C, 0x45, 0x17, 0x23, 0x17, 0x27, 0x57, 0x65, 0x73, 0x74, 0x20, 0x54, 0x72, 0x65, 0x65, 0x74, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x19, 0x39, 0x19, 0x45, 0x16, 0x48, 0x16, 0x4C, 0x57, 0x68, 0x69, 0x73, 0x6B, 0x65, 0x72, 0x74, 0x6F, 0x6E, 0x5E, 0x41, 0x19, 0x46, 0x19, 0x4D, 0x16, 0x47, 0x16, 0x4E, 0x43, 0x61, 0x74, 0x6E, 0x69, 0x70, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1D, 0x3B, 0x1D, 0x42, 0x18, 0x36, 0x18, 0x3D, 0x30, 0x54, 0x68, 0x65, 0x20, 0x4E, 0x65, 0x76, 0x65, 0x72, 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x73, 0x5E, 0x41, 0x18, 0x3A, 0x18, 0x3F, 0x17, 0x36, 0x17, 0x40, 0x42, 0x75, 0x6E, 0x6E, 0x79, 0x20, 0x48, 0x6F, 0x70, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x4A, 0x1A, 0x14, 0x19, 0x2F, 0x19, 0x34, 0x4C, 0x6F, 0x73, 0x74, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x1A, 0x47, 0x1A, 0x50, 0x16, 0x3E, 0x16, 0x44, 0x53, 0x6F, 0x61, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x4D, 0x65, 0x61, 0x64, 0x6F, 0x77, 0x73, 0x5E, 0x49, 0x1E, 0x2E, 0x1E, 0x33, 0x19, 0x16, 0x19, 0x21, 0x30, 0x52, 0x6F, 0x63, 0x6B, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x22, 0x34, 0x22, 0x39, 0x14, 0x52, 0x15, 0x1D, 0x50, 0x61, 0x74, 0x63, 0x68, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1D, 0x4E, 0x1E, 0x16, 0x18, 0x30, 0x18, 0x37, 0x30, 0x54, 0x68, 0x65, 0x20, 0x4E, 0x65, 0x76, 0x65, 0x72, 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x73, 0x5E, 0x49, 0x1D, 0x4F, 0x1E, 0x17, 0x18, 0x22, 0x18, 0x29, 0x30, 0x54, 0x68, 0x65, 0x20, 0x4E, 0x65, 0x76, 0x65, 0x72, 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x73, 0x5E, 0x41, 0x19, 0x39, 0x1A, 0x15, 0x19, 0x40, 0x19, 0x42, 0x4C, 0x6F, 0x73, 0x74, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1D, 0x23, 0x1D, 0x27, 0x17, 0x3E, 0x17, 0x4C, 0x4D, 0x75, 0x7A, 0x7A, 0x6C, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x18, 0x42, 0x18, 0x49, 0x16, 0x43, 0x16, 0x4B, 0x56, 0x65, 0x6C, 0x76, 0x65, 0x74, 0x65, 0x65, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x1A, 0x37, 0x1A, 0x41, 0x16, 0x25, 0x16, 0x2B, 0x57, 0x69, 0x6E, 0x67, 0x74, 0x6F, 0x6E, 0x5E, 0x41, 0x1E, 0x37, 0x1E, 0x41, 0x16, 0x1E, 0x16, 0x24, 0x4D, 0x79, 0x73, 0x74, 0x69, 0x63, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1A, 0x3F, 0x1B, 0x14, 0x19, 0x2D, 0x19, 0x30, 0x4D, 0x6F, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1E, 0x3B, 0x1E, 0x44, 0x18, 0x53, 0x19, 0x1A, 0x30, 0x53, 0x70, 0x69, 0x72, 0x69, 0x74, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x54, 0x18, 0x44, 0x18, 0x4B, 0x16, 0x4D, 0x17, 0x16, 0x43, 0x61, 0x72, 0x72, 0x6F, 0x74, 0x74, 0x6F, 0x6E, 0x5E, 0x41, 0x18, 0x4F, 0x19, 0x1C, 0x18, 0x3B, 0x18, 0x40, 0x57, 0x69, 0x6C, 0x64, 0x66, 0x6C, 0x6F, 0x77, 0x65, 0x72, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1B, 0x33, 0x1B, 0x39, 0x19, 0x33, 0x19, 0x3E, 0x54, 0x61, 0x69, 0x6C, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1D, 0x23, 0x1D, 0x2E, 0x19, 0x3C, 0x19, 0x42, 0x35, 0x50, 0x75, 0x75, 0x68, 0x6F, 0x6E, 0x75, 0x61, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x1E, 0x24, 0x1E, 0x2E, 0x16, 0x34, 0x16, 0x3B, 0x4D, 0x79, 0x73, 0x74, 0x69, 0x63, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1A, 0x32, 0x1A, 0x3C, 0x18, 0x4F, 0x19, 0x16, 0x4D, 0x6F, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x20, 0x3C, 0x20, 0x46, 0x19, 0x22, 0x19, 0x29, 0x41, 0x73, 0x68, 0x74, 0x6F, 0x6E, 0x5E, 0x41, 0x1A, 0x38, 0x1A, 0x41, 0x18, 0x39, 0x18, 0x41, 0x4C, 0x69, 0x74, 0x74, 0x6C, 0x65, 0x20, 0x41, 0x70, 0x70, 0x6C, 0x65, 0x74, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1F, 0x3B, 0x1F, 0x44, 0x14, 0x3D, 0x14, 0x45, 0x46, 0x72, 0x69, 0x67, 0x69, 0x64, 0x20, 0x4D, 0x65, 0x61, 0x64, 0x6F, 0x77, 0x73, 0x5E, 0x54, 0x1D, 0x3A, 0x1D, 0x46, 0x14, 0x4A, 0x14, 0x50, 0x43, 0x72, 0x79, 0x73, 0x74, 0x61, 0x6C, 0x74, 0x6F, 0x6E, 0x5E, 0x41, 0x1B, 0x25, 0x1B, 0x37, 0x17, 0x39, 0x17, 0x3D, 0x4D, 0x61, 0x6E, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x1D, 0x47, 0x1D, 0x52, 0x16, 0x1D, 0x16, 0x24, 0x57, 0x69, 0x74, 0x68, 0x65, 0x72, 0x74, 0x6F, 0x6E, 0x5E, 0x41, 0x1B, 0x2A, 0x1B, 0x35, 0x18, 0x2B, 0x18, 0x32, 0x48, 0x6F, 0x72, 0x73, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x20, 0x45, 0x71, 0x75, 0x65, 0x73, 0x74, 0x72, 0x69, 0x61, 0x6E, 0x20, 0x50, 0x61, 0x72, 0x6B, 0x5E, 0x54, 0x1C, 0x36, 0x1C, 0x43, 0x1A, 0x4A, 0x1A, 0x50, 0x53, 0x61, 0x6E, 0x74, 0x6F, 0x6E, 0x5E, 0x49, 0x1D, 0x33, 0x1D, 0x3D, 0x19, 0x38, 0x19, 0x40, 0x30, 0x50, 0x61, 0x74, 0x73, 0x79, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1D, 0x39, 0x1D, 0x43, 0x18, 0x19, 0x18, 0x21, 0x30, 0x53, 0x70, 0x69, 0x63, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x2D, 0x1E, 0x35, 0x18, 0x38, 0x18, 0x42, 0x33, 0x48, 0x61, 0x76, 0x65, 0x6E, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x54, 0x1A, 0x3F, 0x1A, 0x48, 0x16, 0x1B, 0x16, 0x24, 0x57, 0x69, 0x6E, 0x67, 0x74, 0x6F, 0x6E, 0x5E, 0x41, 0x1A, 0x35, 0x1A, 0x3E, 0x18, 0x42, 0x18, 0x4B, 0x4C, 0x69, 0x74, 0x74, 0x6C, 0x65, 0x20, 0x41, 0x70, 0x70, 0x6C, 0x65, 0x74, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1B, 0x32, 0x1B, 0x39, 0x19, 0x1F, 0x19, 0x2B, 0x54, 0x61, 0x69, 0x6C, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x22, 0x39, 0x22, 0x45, 0x19, 0x1E, 0x19, 0x25, 0x4D, 0x6F, 0x6C, 0x74, 0x65, 0x6E, 0x20, 0x4D, 0x65, 0x61, 0x64, 0x6F, 0x77, 0x73, 0x5E, 0x41, 0x1D, 0x52, 0x1E, 0x27, 0x16, 0x51, 0x17, 0x15, 0x4D, 0x79, 0x73, 0x74, 0x69, 0x63, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x18, 0x3B, 0x18, 0x43, 0x16, 0x53, 0x17, 0x1E, 0x56, 0x65, 0x6C, 0x76, 0x65, 0x74, 0x65, 0x65, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1A, 0x1F, 0x1A, 0x27, 0x1B, 0x23, 0x1B, 0x2E, 0x32, 0x54, 0x68, 0x65, 0x20, 0x53, 0x61, 0x6E, 0x64, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x73, 0x5E, 0x49, 0x1E, 0x2E, 0x1E, 0x36, 0x18, 0x43, 0x18, 0x4E, 0x33, 0x48, 0x61, 0x6C, 0x66, 0x20, 0x48, 0x61, 0x76, 0x65, 0x6E, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x32, 0x1E, 0x3C, 0x17, 0x32, 0x17, 0x3B, 0x30, 0x43, 0x72, 0x61, 0x7A, 0x79, 0x20, 0x45, 0x64, 0x64, 0x69, 0x65, 0x27, 0x73, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1D, 0x50, 0x1E, 0x19, 0x17, 0x26, 0x17, 0x30, 0x30, 0x41, 0x74, 0x72, 0x6F, 0x70, 0x6F, 0x73, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x54, 0x1B, 0x18, 0x1B, 0x27, 0x14, 0x32, 0x14, 0x38, 0x43, 0x68, 0x69, 0x6C, 0x6C, 0x74, 0x6F, 0x6E, 0x5E, 0x49, 0x1D, 0x3E, 0x1D, 0x48, 0x19, 0x34, 0x19, 0x3D, 0x30, 0x50, 0x61, 0x74, 0x73, 0x79, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x19, 0x3F, 0x1A, 0x16, 0x19, 0x3B, 0x19, 0x3F, 0x4C, 0x6F, 0x73, 0x74, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1C, 0x34, 0x1C, 0x47, 0x17, 0x2E, 0x17, 0x33, 0x57, 0x65, 0x73, 0x74, 0x20, 0x54, 0x72, 0x65, 0x65, 0x74, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1C, 0x16, 0x1C, 0x26, 0x17, 0x2A, 0x17, 0x30, 0x42, 0x69, 0x67, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x19, 0x38, 0x19, 0x44, 0x1A, 0x36, 0x1A, 0x3E, 0x32, 0x54, 0x68, 0x65, 0x20, 0x53, 0x61, 0x6E, 0x64, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x73, 0x5E, 0x54, 0x22, 0x3D, 0x22, 0x4B, 0x14, 0x48, 0x14, 0x4F, 0x53, 0x6B, 0x75, 0x6C, 0x6C, 0x74, 0x6F, 0x6E, 0x5E, 0x49, 0x1D, 0x41, 0x1D, 0x4C, 0x17, 0x35, 0x17, 0x3E, 0x30, 0x4D, 0x61, 0x72, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x19, 0x42, 0x1A, 0x16, 0x19, 0x35, 0x19, 0x3A, 0x4C, 0x6F, 0x73, 0x74, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x19, 0x3B, 0x19, 0x45, 0x15, 0x2A, 0x15, 0x34, 0x49, 0x6E, 0x6B, 0x74, 0x6F, 0x6E, 0x5E, 0x41, 0x22, 0x2B, 0x22, 0x33, 0x14, 0x50, 0x15, 0x1D, 0x50, 0x61, 0x74, 0x63, 0x68, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1B, 0x1E, 0x1B, 0x25, 0x17, 0x40, 0x17, 0x4F, 0x4D, 0x61, 0x6E, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1D, 0x53, 0x1E, 0x48, 0x16, 0x3C, 0x16, 0x3E, 0x4D, 0x79, 0x73, 0x74, 0x69, 0x63, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x34, 0x19, 0x40, 0x16, 0x3B, 0x16, 0x44, 0x43, 0x61, 0x74, 0x6E, 0x69, 0x70, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1B, 0x50, 0x1C, 0x14, 0x19, 0x1E, 0x19, 0x3A, 0x54, 0x61, 0x69, 0x6C, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x17, 0x2D, 0x17, 0x3B, 0x16, 0x35, 0x16, 0x3D, 0x54, 0x72, 0x6F, 0x70, 0x69, 0x63, 0x74, 0x6F, 0x6E, 0x5E, 0x41, 0x1C, 0x34, 0x1C, 0x4B, 0x17, 0x28, 0x17, 0x2D, 0x57, 0x65, 0x73, 0x74, 0x20, 0x54, 0x72, 0x65, 0x65, 0x74, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1D, 0x1B, 0x1D, 0x20, 0x17, 0x37, 0x17, 0x4E, 0x4D, 0x75, 0x7A, 0x7A, 0x6C, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x19, 0x47, 0x1A, 0x14, 0x17, 0x46, 0x17, 0x4F, 0x46, 0x6C, 0x69, 0x70, 0x70, 0x65, 0x72, 0x74, 0x6F, 0x6E, 0x5E, 0x41, 0x1E, 0x34, 0x1E, 0x45, 0x16, 0x25, 0x16, 0x2C, 0x4D, 0x79, 0x73, 0x74, 0x69, 0x63, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1C, 0x31, 0x1C, 0x3B, 0x17, 0x38, 0x17, 0x44, 0x57, 0x65, 0x73, 0x74, 0x20, 0x54, 0x72, 0x65, 0x65, 0x74, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x1C, 0x28, 0x1C, 0x37, 0x19, 0x3F, 0x19, 0x47, 0x48, 0x6F, 0x72, 0x73, 0x65, 0x73, 0x68, 0x6F, 0x65, 0x20, 0x56, 0x69, 0x6C, 0x6C, 0x61, 0x67, 0x65, 0x5E, 0x41, 0x19, 0x46, 0x19, 0x52, 0x15, 0x2A, 0x15, 0x34, 0x54, 0x68, 0x65, 0x20, 0x53, 0x68, 0x6F, 0x72, 0x65, 0x73, 0x20, 0x6F, 0x66, 0x20, 0x50, 0x61, 0x69, 0x6E, 0x74, 0x65, 0x64, 0x20, 0x42, 0x61, 0x79, 0x5E, 0x41, 0x1D, 0x18, 0x1D, 0x2A, 0x18, 0x4F, 0x19, 0x16, 0x53, 0x68, 0x65, 0x6C, 0x6C, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x19, 0x3B, 0x19, 0x43, 0x17, 0x37, 0x17, 0x47, 0x46, 0x6C, 0x69, 0x70, 0x70, 0x65, 0x72, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x1D, 0x18, 0x1D, 0x24, 0x18, 0x41, 0x18, 0x4C, 0x53, 0x68, 0x65, 0x6C, 0x6C, 0x74, 0x6F, 0x6E, 0x5E, 0x41, 0x19, 0x39, 0x19, 0x3F, 0x18, 0x22, 0x18, 0x38, 0x46, 0x6C, 0x69, 0x70, 0x70, 0x65, 0x72, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1B, 0x40, 0x1B, 0x46, 0x17, 0x4C, 0x18, 0x23, 0x4D, 0x61, 0x6E, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1D, 0x42, 0x1D, 0x50, 0x18, 0x3E, 0x18, 0x48, 0x33, 0x54, 0x72, 0x61, 0x6E, 0x71, 0x75, 0x69, 0x6C, 0x69, 0x74, 0x79, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1D, 0x51, 0x1E, 0x1A, 0x18, 0x3F, 0x18, 0x4F, 0x30, 0x53, 0x65, 0x72, 0x65, 0x6E, 0x69, 0x74, 0x79, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1D, 0x42, 0x1D, 0x4B, 0x17, 0x1E, 0x17, 0x2E, 0x30, 0x41, 0x72, 0x64, 0x65, 0x6E, 0x74, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x1C, 0x14, 0x1C, 0x29, 0x17, 0x22, 0x17, 0x29, 0x42, 0x69, 0x67, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1B, 0x4C, 0x1B, 0x50, 0x19, 0x18, 0x19, 0x3D, 0x54, 0x61, 0x69, 0x6C, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1D, 0x3F, 0x1D, 0x4D, 0x19, 0x22, 0x19, 0x2D, 0x30, 0x44, 0x72, 0x69, 0x6C, 0x6C, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x1F, 0x1E, 0x2D, 0x18, 0x39, 0x18, 0x44, 0x33, 0x48, 0x61, 0x76, 0x65, 0x6E, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x1B, 0x51, 0x1C, 0x21, 0x17, 0x31, 0x17, 0x3B, 0x42, 0x69, 0x67, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1E, 0x15, 0x1E, 0x25, 0x1A, 0x28, 0x1A, 0x32, 0x30, 0x41, 0x65, 0x73, 0x6F, 0x70, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x18, 0x53, 0x19, 0x1A, 0x17, 0x37, 0x17, 0x4E, 0x54, 0x68, 0x75, 0x6D, 0x70, 0x65, 0x72, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1E, 0x45, 0x1E, 0x50, 0x18, 0x1C, 0x18, 0x2B, 0x30, 0x48, 0x6F, 0x74, 0x7A, 0x65, 0x70, 0x6C, 0x6F, 0x74, 0x7A, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x1B, 0x4F, 0x1C, 0x2B, 0x16, 0x51, 0x17, 0x17, 0x42, 0x69, 0x67, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1D, 0x47, 0x1E, 0x32, 0x16, 0x4C, 0x16, 0x50, 0x4D, 0x79, 0x73, 0x74, 0x69, 0x63, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1A, 0x34, 0x1B, 0x17, 0x19, 0x27, 0x19, 0x2C, 0x4D, 0x6F, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1D, 0x50, 0x1E, 0x1B, 0x15, 0x4E, 0x16, 0x1E, 0x42, 0x72, 0x69, 0x64, 0x6C, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1E, 0x1F, 0x1E, 0x2D, 0x18, 0x45, 0x18, 0x52, 0x33, 0x48, 0x61, 0x76, 0x65, 0x6E, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x19, 0x3D, 0x19, 0x44, 0x17, 0x48, 0x18, 0x22, 0x46, 0x6C, 0x69, 0x70, 0x70, 0x65, 0x72, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x54, 0x1A, 0x39, 0x1A, 0x46, 0x19, 0x16, 0x19, 0x24, 0x41, 0x70, 0x70, 0x6C, 0x65, 0x74, 0x6F, 0x6E, 0x5E, 0x54, 0x1C, 0x3D, 0x1C, 0x4D, 0x17, 0x39, 0x17, 0x45, 0x54, 0x72, 0x65, 0x65, 0x74, 0x6F, 0x6E, 0x5E, 0x54, 0x1B, 0x20, 0x1B, 0x2F, 0x1A, 0x31, 0x1A, 0x3E, 0x48, 0x6F, 0x74, 0x74, 0x6F, 0x6E, 0x5E, 0x49, 0x1C, 0x15, 0x1C, 0x20, 0x15, 0x52, 0x16, 0x24, 0x30, 0x57, 0x65, 0x6C, 0x63, 0x6F, 0x6D, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1D, 0x2A, 0x1D, 0x3B, 0x17, 0x19, 0x17, 0x25, 0x30, 0x53, 0x68, 0x69, 0x6D, 0x6D, 0x65, 0x72, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1D, 0x41, 0x1D, 0x4E, 0x18, 0x4C, 0x19, 0x1C, 0x30, 0x4C, 0x69, 0x6C, 0x61, 0x63, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x32, 0x1E, 0x3D, 0x18, 0x20, 0x18, 0x34, 0x30, 0x4C, 0x6F, 0x63, 0x68, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x19, 0x30, 0x19, 0x46, 0x1A, 0x2B, 0x1A, 0x35, 0x32, 0x54, 0x68, 0x65, 0x20, 0x53, 0x61, 0x6E, 0x64, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x73, 0x5E, 0x49, 0x1A, 0x41, 0x1B, 0x15, 0x17, 0x2C, 0x17, 0x37, 0x32, 0x4D, 0x61, 0x6E, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x35, 0x1E, 0x46, 0x17, 0x1E, 0x17, 0x2B, 0x30, 0x50, 0x61, 0x72, 0x61, 0x64, 0x69, 0x73, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1A, 0x37, 0x1A, 0x47, 0x17, 0x38, 0x17, 0x46, 0x32, 0x4D, 0x61, 0x6E, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1A, 0x15, 0x1A, 0x1E, 0x1B, 0x14, 0x1B, 0x2D, 0x32, 0x54, 0x68, 0x65, 0x20, 0x53, 0x61, 0x6E, 0x64, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x73, 0x5E, 0x49, 0x1E, 0x46, 0x1F, 0x15, 0x18, 0x31, 0x18, 0x41, 0x30, 0x54, 0x68, 0x65, 0x6F, 0x62, 0x72, 0x6F, 0x6D, 0x61, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x4E, 0x1F, 0x26, 0x14, 0x2A, 0x14, 0x34, 0x31, 0x49, 0x63, 0x69, 0x63, 0x6C, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x1C, 0x51, 0x1D, 0x1A, 0x17, 0x32, 0x17, 0x4D, 0x4D, 0x75, 0x7A, 0x7A, 0x6C, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x18, 0x35, 0x18, 0x3F, 0x18, 0x44, 0x19, 0x1D, 0x44, 0x65, 0x77, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x1B, 0x2A, 0x1B, 0x3F, 0x18, 0x16, 0x18, 0x22, 0x4D, 0x61, 0x6E, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1D, 0x48, 0x1E, 0x17, 0x17, 0x48, 0x18, 0x19, 0x30, 0x51, 0x75, 0x69, 0x65, 0x74, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x51, 0x1F, 0x1A, 0x17, 0x49, 0x18, 0x28, 0x30, 0x48, 0x6F, 0x74, 0x7A, 0x65, 0x70, 0x6C, 0x6F, 0x74, 0x7A, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x54, 0x1B, 0x52, 0x1C, 0x27, 0x16, 0x3D, 0x16, 0x4B, 0x45, 0x61, 0x72, 0x74, 0x6F, 0x6E, 0x5E, 0x41, 0x1A, 0x48, 0x1B, 0x1A, 0x19, 0x15, 0x19, 0x26, 0x4D, 0x6F, 0x6F, 0x6E, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1E, 0x2D, 0x1E, 0x47, 0x17, 0x4B, 0x18, 0x17, 0x30, 0x42, 0x6F, 0x6E, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x1F, 0x1E, 0x32, 0x14, 0x49, 0x15, 0x1B, 0x31, 0x53, 0x6E, 0x6F, 0x77, 0x62, 0x61, 0x6C, 0x6C, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1C, 0x36, 0x1C, 0x45, 0x14, 0x2C, 0x14, 0x43, 0x31, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x6D, 0x61, 0x73, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x1E, 0x2F, 0x1E, 0x48, 0x16, 0x2D, 0x16, 0x3B, 0x4D, 0x79, 0x73, 0x74, 0x69, 0x63, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x41, 0x18, 0x40, 0x18, 0x4D, 0x18, 0x43, 0x19, 0x1F, 0x44, 0x65, 0x77, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1B, 0x1B, 0x1B, 0x32, 0x16, 0x48, 0x17, 0x18, 0x32, 0x4D, 0x61, 0x6E, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x1E, 0x1E, 0x2A, 0x17, 0x4F, 0x18, 0x2E, 0x30, 0x43, 0x72, 0x65, 0x73, 0x63, 0x65, 0x6E, 0x74, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x15, 0x1E, 0x2E, 0x19, 0x16, 0x19, 0x25, 0x30, 0x52, 0x6F, 0x63, 0x6B, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1D, 0x42, 0x1D, 0x4F, 0x16, 0x39, 0x17, 0x18, 0x30, 0x53, 0x61, 0x64, 0x64, 0x6C, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x1B, 0x4A, 0x1C, 0x37, 0x17, 0x18, 0x17, 0x21, 0x42, 0x69, 0x67, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x14, 0x4E, 0x15, 0x29, 0x16, 0x30, 0x16, 0x40, 0x35, 0x52, 0x61, 0x69, 0x6E, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x18, 0x32, 0x19, 0x14, 0x18, 0x4A, 0x19, 0x17, 0x44, 0x65, 0x77, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1E, 0x42, 0x1F, 0x1B, 0x17, 0x2D, 0x17, 0x3F, 0x30, 0x45, 0x6C, 0x64, 0x6F, 0x72, 0x61, 0x64, 0x6F, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x22, 0x20, 0x22, 0x37, 0x16, 0x43, 0x17, 0x17, 0x37, 0x54, 0x65, 0x70, 0x68, 0x72, 0x61, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x19, 0x50, 0x1A, 0x39, 0x14, 0x25, 0x14, 0x31, 0x31, 0x47, 0x6C, 0x61, 0x63, 0x69, 0x65, 0x72, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x22, 0x4C, 0x23, 0x25, 0x17, 0x52, 0x18, 0x27, 0x37, 0x53, 0x63, 0x6F, 0x72, 0x69, 0x61, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1C, 0x38, 0x1C, 0x4D, 0x14, 0x4D, 0x15, 0x26, 0x31, 0x42, 0x65, 0x72, 0x67, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1A, 0x47, 0x1B, 0x26, 0x17, 0x19, 0x17, 0x2B, 0x32, 0x4D, 0x61, 0x6E, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x19, 0x4C, 0x1A, 0x21, 0x18, 0x3A, 0x19, 0x15, 0x30, 0x54, 0x61, 0x69, 0x6C, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x1B, 0x26, 0x1B, 0x3F, 0x17, 0x3E, 0x18, 0x15, 0x4D, 0x61, 0x6E, 0x65, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x23, 0x18, 0x23, 0x32, 0x14, 0x32, 0x14, 0x49, 0x33, 0x48, 0x61, 0x74, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x20, 0x1E, 0x3E, 0x14, 0x2D, 0x14, 0x43, 0x31, 0x50, 0x6F, 0x6C, 0x61, 0x72, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1F, 0x26, 0x1F, 0x3D, 0x18, 0x1A, 0x18, 0x39, 0x30, 0x43, 0x61, 0x62, 0x69, 0x6E, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1D, 0x2E, 0x1D, 0x4C, 0x1A, 0x2C, 0x1A, 0x44, 0x32, 0x44, 0x75, 0x73, 0x74, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x1B, 0x1E, 0x30, 0x1A, 0x3E, 0x1B, 0x22, 0x32, 0x54, 0x6F, 0x72, 0x72, 0x69, 0x64, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x1B, 0x39, 0x1B, 0x4C, 0x19, 0x15, 0x19, 0x40, 0x54, 0x61, 0x69, 0x6C, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1E, 0x1C, 0x1E, 0x37, 0x17, 0x2A, 0x17, 0x4A, 0x30, 0x42, 0x6F, 0x6E, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x18, 0x2C, 0x19, 0x15, 0x19, 0x47, 0x1A, 0x1D, 0x30, 0x54, 0x61, 0x69, 0x6C, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x4C, 0x1F, 0x1B, 0x16, 0x24, 0x17, 0x21, 0x30, 0x53, 0x61, 0x64, 0x64, 0x6C, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x15, 0x2A, 0x15, 0x45, 0x16, 0x29, 0x16, 0x4B, 0x35, 0x56, 0x69, 0x6E, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x22, 0x44, 0x23, 0x32, 0x14, 0x1C, 0x14, 0x31, 0x33, 0x48, 0x61, 0x74, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x41, 0x1D, 0x36, 0x1E, 0x4A, 0x16, 0x3F, 0x16, 0x4B, 0x4D, 0x79, 0x73, 0x74, 0x69, 0x63, 0x20, 0x46, 0x6F, 0x72, 0x65, 0x73, 0x74, 0x5E, 0x49, 0x1D, 0x50, 0x1E, 0x25, 0x16, 0x2C, 0x17, 0x1D, 0x30, 0x53, 0x61, 0x64, 0x64, 0x6C, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x19, 0x16, 0x19, 0x34, 0x19, 0x37, 0x1A, 0x1A, 0x30, 0x54, 0x61, 0x69, 0x6C, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1C, 0x21, 0x1C, 0x43, 0x19, 0x2B, 0x19, 0x4D, 0x30, 0x48, 0x6F, 0x6F, 0x66, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x17, 0x4F, 0x18, 0x2B, 0x19, 0x31, 0x1A, 0x1D, 0x30, 0x54, 0x61, 0x69, 0x6C, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1F, 0x2A, 0x20, 0x22, 0x18, 0x3A, 0x18, 0x50, 0x30, 0x43, 0x61, 0x62, 0x69, 0x6E, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x19, 0x38, 0x1A, 0x14, 0x1A, 0x42, 0x1B, 0x2E, 0x32, 0x54, 0x68, 0x65, 0x20, 0x53, 0x61, 0x6E, 0x64, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x73, 0x5E, 0x49, 0x1D, 0x1D, 0x1D, 0x41, 0x16, 0x2F, 0x16, 0x52, 0x30, 0x53, 0x61, 0x64, 0x64, 0x6C, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x14, 0x1F, 0x14, 0x48, 0x14, 0x22, 0x14, 0x42, 0x30, 0x50, 0x72, 0x69, 0x73, 0x6F, 0x6E, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1D, 0x34, 0x1E, 0x30, 0x1A, 0x46, 0x1B, 0x1C, 0x32, 0x54, 0x6F, 0x72, 0x72, 0x69, 0x64, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x22, 0x3E, 0x23, 0x25, 0x17, 0x1C, 0x17, 0x3E, 0x37, 0x4D, 0x61, 0x67, 0x6D, 0x61, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x21, 0x14, 0x21, 0x3F, 0x14, 0x26, 0x14, 0x45, 0x33, 0x54, 0x72, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1D, 0x38, 0x1E, 0x21, 0x15, 0x46, 0x16, 0x2B, 0x30, 0x52, 0x69, 0x64, 0x65, 0x72, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x14, 0x40, 0x15, 0x41, 0x16, 0x4C, 0x17, 0x25, 0x35, 0x56, 0x69, 0x6E, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x18, 0x4D, 0x19, 0x37, 0x1A, 0x36, 0x1B, 0x1E, 0x32, 0x54, 0x68, 0x65, 0x20, 0x53, 0x61, 0x6E, 0x64, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x73, 0x5E, 0x49, 0x1D, 0x20, 0x1E, 0x20, 0x1B, 0x1D, 0x1B, 0x3A, 0x32, 0x54, 0x6F, 0x72, 0x72, 0x69, 0x64, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1F, 0x14, 0x1F, 0x42, 0x19, 0x51, 0x1A, 0x3E, 0x37, 0x50, 0x75, 0x6D, 0x69, 0x63, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1C, 0x39, 0x1D, 0x19, 0x15, 0x37, 0x16, 0x3D, 0x30, 0x48, 0x6F, 0x72, 0x6E, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x19, 0x2C, 0x1A, 0x23, 0x15, 0x16, 0x15, 0x3F, 0x30, 0x41, 0x72, 0x74, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1C, 0x42, 0x1D, 0x37, 0x18, 0x32, 0x19, 0x20, 0x30, 0x54, 0x75, 0x72, 0x74, 0x6C, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x19, 0x22, 0x1A, 0x15, 0x16, 0x2A, 0x17, 0x1C, 0x30, 0x43, 0x61, 0x74, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x19, 0x35, 0x1A, 0x25, 0x19, 0x16, 0x19, 0x4F, 0x30, 0x54, 0x61, 0x69, 0x6C, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1F, 0x37, 0x21, 0x18, 0x17, 0x1B, 0x17, 0x39, 0x30, 0x57, 0x68, 0x6F, 0x72, 0x6C, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1F, 0x3E, 0x20, 0x3C, 0x17, 0x49, 0x18, 0x3A, 0x30, 0x43, 0x61, 0x62, 0x69, 0x6E, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x14, 0x2F, 0x15, 0x2E, 0x17, 0x26, 0x18, 0x18, 0x35, 0x56, 0x69, 0x6E, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x16, 0x53, 0x17, 0x4E, 0x19, 0x27, 0x1A, 0x1D, 0x30, 0x53, 0x74, 0x61, 0x72, 0x66, 0x69, 0x73, 0x68, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x15, 0x4E, 0x16, 0x34, 0x14, 0x27, 0x15, 0x3C, 0x35, 0x57, 0x65, 0x62, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x22, 0x3A, 0x23, 0x29, 0x1A, 0x16, 0x1B, 0x1C, 0x37, 0x42, 0x61, 0x73, 0x61, 0x6C, 0x74, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x26, 0x1E, 0x4B, 0x15, 0x42, 0x17, 0x1B, 0x30, 0x53, 0x61, 0x64, 0x64, 0x6C, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1C, 0x4D, 0x1E, 0x1E, 0x14, 0x34, 0x15, 0x1D, 0x31, 0x49, 0x63, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x15, 0x1D, 0x15, 0x4D, 0x14, 0x36, 0x15, 0x3F, 0x35, 0x57, 0x65, 0x62, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1A, 0x52, 0x1B, 0x4A, 0x15, 0x21, 0x16, 0x22, 0x30, 0x52, 0x69, 0x6E, 0x67, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x18, 0x23, 0x19, 0x24, 0x18, 0x35, 0x19, 0x35, 0x34, 0x46, 0x6C, 0x6F, 0x77, 0x65, 0x72, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x18, 0x35, 0x19, 0x20, 0x16, 0x3D, 0x18, 0x22, 0x30, 0x48, 0x61, 0x72, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1A, 0x17, 0x1B, 0x19, 0x15, 0x49, 0x16, 0x4C, 0x30, 0x42, 0x69, 0x72, 0x64, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1E, 0x21, 0x1F, 0x4B, 0x14, 0x2C, 0x15, 0x17, 0x31, 0x50, 0x6F, 0x6C, 0x61, 0x72, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x21, 0x1B, 0x22, 0x2C, 0x17, 0x2D, 0x18, 0x33, 0x37, 0x49, 0x67, 0x6E, 0x65, 0x6F, 0x75, 0x73, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x18, 0x49, 0x19, 0x2F, 0x19, 0x22, 0x1B, 0x3E, 0x32, 0x59, 0x65, 0x6C, 0x6C, 0x6F, 0x77, 0x20, 0x42, 0x72, 0x69, 0x63, 0x6B, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x19, 0x2C, 0x1A, 0x2C, 0x17, 0x26, 0x18, 0x48, 0x30, 0x44, 0x6F, 0x6C, 0x70, 0x68, 0x69, 0x6E, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1A, 0x3E, 0x1C, 0x37, 0x14, 0x22, 0x15, 0x19, 0x31, 0x53, 0x6E, 0x6F, 0x77, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x21, 0x2C, 0x23, 0x17, 0x14, 0x36, 0x15, 0x4E, 0x33, 0x50, 0x69, 0x72, 0x61, 0x74, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1F, 0x31, 0x21, 0x20, 0x15, 0x31, 0x17, 0x1A, 0x30, 0x57, 0x68, 0x6F, 0x72, 0x6C, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x15, 0x3C, 0x17, 0x3A, 0x18, 0x1E, 0x19, 0x3C, 0x35, 0x4A, 0x75, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x20, 0x16, 0x23, 0x1F, 0x18, 0x32, 0x19, 0x3F, 0x37, 0x4C, 0x61, 0x76, 0x61, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x19, 0x4E, 0x1D, 0x29, 0x1A, 0x2A, 0x1B, 0x41, 0x32, 0x44, 0x65, 0x73, 0x65, 0x72, 0x74, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x14, 0x2F, 0x15, 0x3B, 0x15, 0x22, 0x19, 0x2B, 0x35, 0x44, 0x6F, 0x67, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x1F, 0x3E, 0x22, 0x36, 0x19, 0x3F, 0x1B, 0x37, 0x37, 0x4C, 0x61, 0x76, 0x61, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x14, 0x1B, 0x17, 0x4B, 0x19, 0x41, 0x1B, 0x2D, 0x36, 0x54, 0x68, 0x65, 0x20, 0x43, 0x6C, 0x6F, 0x75, 0x64, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x73, 0x5E, 0x49, 0x1A, 0x29, 0x1D, 0x34, 0x16, 0x2E, 0x19, 0x46, 0x30, 0x48, 0x6F, 0x72, 0x73, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x5E, 0x49, 0x15, 0x3C, 0x19, 0x1B, 0x14, 0x4A, 0x18, 0x1D, 0x35, 0x4A, 0x75, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x65, 0x00 };
ParseHi1ResponsePackets(TIlesets);
Hi1Client.Send(TIlesets);
}
else if(command == ".D")
{
MoveTowards(int.Parse(commandArgs[1]), int.Parse(commandArgs[2]));
}
else if(command == ".RD")
{
RebuildMapPngFromDb();
}
else if(command == ".AWARD")
{
MemoryStream ms = new MemoryStream();
ms.WriteByte(0x18);
ms.WriteByte(0x33);
byte[] SecCodePacket = GenerateSecCode();
ms.Write(SecCodePacket, 0x00, SecCodePacket.Length);
byte[] awardIdBytes = Encoding.UTF8.GetBytes(commandArgs[1].ToString());
ms.Write(awardIdBytes, 0x00, awardIdBytes.Length);
ms.WriteByte(0x0a);
ms.WriteByte(0x00);
ms.Seek(0x00, SeekOrigin.Begin);
byte[] packet = ms.ToArray();
ParseClientRequestPacket(packet);
HI1Server.Send(packet);
}
else if(command == ".SWF")
{
MemoryStream ms = new MemoryStream();
ms.WriteByte(PACKET_SWF);
byte[] swfName = Encoding.UTF8.GetBytes(commandArgs[1]);
ms.Write(swfName, 0x00, swfName.Length);
ms.WriteByte(0x00);
ms.Seek(0x00, SeekOrigin.Begin);
byte[] packet = ms.ToArray();
ParseClientRequestPacket(packet);
Hi1Client.Send(packet);
}
else if(command == ".ST")
{
WaitQuest = false;
WaitMove = false;
WalkToX = X;
WalkToY = Y;
}
else if(command == ".TR")
{
MemoryStream ms = new MemoryStream();
ms.WriteByte(0x29);
byte[] strB = Encoding.UTF8.GetBytes(commandArgs[1]);
ms.Write(strB, 0, strB.Length);
ms.WriteByte(0x00);
ms.Seek(0x00, SeekOrigin.Begin);
byte[] Trransprt = ms.ToArray();
ParseClientRequestPacket(Trransprt);
HI1Server.Send(Trransprt);
}
return false;
}
else
{
return true;
}
}
public static byte[] GenerateSecCode()
{
var i = 0;
SecCodeCount++;
SecCodeSeeds[SecCodeCount % 3] = (byte)(SecCodeSeeds[SecCodeCount % 3] + SecCodeInc);
SecCodeSeeds[SecCodeCount % 3] = (byte)(SecCodeSeeds[SecCodeCount % 3] % 92);
i = SecCodeSeeds[0] + SecCodeSeeds[1] * SecCodeSeeds[2] - SecCodeSeeds[1];
i = Math.Abs(i);
i = i % 92;
byte[] SecCode = new byte[4];
SecCode[0] = (byte)(SecCodeSeeds[0] + 33);
SecCode[1] = (byte)(SecCodeSeeds[1] + 33);
SecCode[2] = (byte)(SecCodeSeeds[2] + 33);
SecCode[3] = (byte)(i + 33);
return SecCode;
}
private static void DecodeUserInfoResponsePacket(byte[] Packet)
{
SecCodeSeeds[0] = (byte)(Packet[1] - 33);
SecCodeSeeds[1] = (byte)(Packet[2] - 33);
SecCodeSeeds[2] = (byte)(Packet[3] - 33);
SecCodeInc = Packet[4] - 33;
if(Packet[5] == 'A')
{
IsAdmin = true;
IsMod = true;
}
else if(Packet[5] == 'M')
{
IsMod = true;
}
else
{
Console.WriteLine("Unkown user type: " + (char)Packet[5]);
}
Console.WriteLine("Sec Code Seed: " + BitConverter.ToString(SecCodeSeeds));
Console.WriteLine("Sec Code Incrementer: " + SecCodeInc);
}
public class Item{
public Item() { }
public int icon_id;
public string name;
public string plural;
public string description;
}
private static void DecodeTileinfoPacket(byte[] Packet)
{
string TileInfo = Encoding.UTF8.GetString(Packet).Substring(1, Packet.Length - 2);
Console.WriteLine("TOP RIGHT: "+TileInfo);
}
private static bool ParseServerResponsePacket(byte[] Packet)
{
bool passiton = true;
byte id = Packet[0];
Console.WriteLine("< " + BitConverter.ToString(Packet).Replace("-", " "));
switch (id)
{
case PACKET_LOGIN:
DecodeLoginResponsePacket(Packet);
break;
case PACKET_CHAT:
DecodeChatResponsePacket(Packet);
break;
case PACKET_USERINFO:
DecodeUserInfoResponsePacket(Packet);
break;
case PACKET_MOVEMENT:
DecodeMovementResponsePacket(Packet);
break;
case PACKET_TILESET_AREA:
DecodeTileAreasResponsePacket(Packet);
break;
case PACKET_SWF_2:
case PACKET_SWF_3:
case PACKET_SWF:
DecodeSwfLoadPacket(Packet);
break;
case PACKET_DISCONNECT:
Console.WriteLine("Disconnect Packet (DISCARDED!)");
passiton = false;
break;
default:
break;
}
return passiton;
}
public static bool ParseClientRequestPacket(byte[] Packet)
{
bool SEND = true;
byte id = Packet[0];
Console.WriteLine("> " + BitConverter.ToString(Packet).Replace("-", " "));
switch (id)
{
case PACKET_LOGIN:
DecodeLoginRequestPacket(Packet);
break;
case PACKET_CHAT:
SEND = DecodeChatSendPacket(Packet);
break;
case PACKET_MOVE:
DecodeMovementPacket(Packet);
break;
default:
break;
}
return SEND;
}
}
}