mirror of
https://silica.codes/islehorse/HI1Proxy.git
synced 2025-04-06 21:25:51 +12:00
1123 lines
75 KiB
C#
1123 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;
|
|
}
|
|
}
|
|
}
|