diff --git a/Makefile b/Makefile
index ab243ca8..db2bf2a9 100644
--- a/Makefile
+++ b/Makefile
@@ -105,12 +105,12 @@ $(BUILD):
#---------------------------------------------------------------------------------
lang:
- @[ -d $@ ] || mkdir -p $@
+ @[ -d build ] || mkdir -p build
@make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile language
#---------------------------------------------------------------------------------
all:
- @[ -d $@ ] || mkdir -p $@
+ @[ -d build ] || mkdir -p build
@make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile
@make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile language
diff --git a/gui.pnproj b/gui.pnproj
index dc46785d..d2cb4a7f 100644
--- a/gui.pnproj
+++ b/gui.pnproj
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/source/cheats/cheatmenu.cpp b/source/cheats/cheatmenu.cpp
index 7400d93d..eed599f9 100644
--- a/source/cheats/cheatmenu.cpp
+++ b/source/cheats/cheatmenu.cpp
@@ -68,9 +68,8 @@ int CheatMenu(const char * gameID) {
WindowPrompt(tr("Error"),tr("Cheatfile is blank"),tr("OK"));
break;
case 0:
- download = WindowPrompt(tr("Error"),tr("No Cheatfile found"),tr("OK"),tr("Download Now"));
-
- if (download==0)
+ download = WindowPrompt(tr("Error"),tr("No Cheatfile found"),tr("Download Now"),tr("Cancel"));
+ if (download==1)
download = CodeDownload(gameID);
break;
case 1:
@@ -127,14 +126,18 @@ int CheatMenu(const char * gameID) {
selectednrs[x] = i;
x++;
}
- }
- subfoldercreate(Settings.Cheatcodespath);
- string chtpath = Settings.Cheatcodespath;
- string gctfname = chtpath + c.getGameID() + ".gct";
- c.createGCT(selectednrs,x,gctfname.c_str());
- WindowPrompt(tr("GCT File created"),NULL,tr("OK"));
- exit = true;
- break;
+ }
+ if (x == 0) {
+ WindowPrompt(tr("Error"),tr("No cheats were selected"),tr("OK"));
+ } else {
+ subfoldercreate(Settings.Cheatcodespath);
+ string chtpath = Settings.Cheatcodespath;
+ string gctfname = chtpath + c.getGameID() + ".gct";
+ c.createGCT(selectednrs,x,gctfname.c_str());
+ WindowPrompt(tr("GCT File created"),NULL,tr("OK"));
+ exit = true;
+ break;
+ }
} else WindowPrompt(tr("Error"),tr("Could not create GCT file"),tr("OK"));
}
diff --git a/source/cheats/gct.cpp b/source/cheats/gct.cpp
index 21286d03..b4fb790b 100644
--- a/source/cheats/gct.cpp
+++ b/source/cheats/gct.cpp
@@ -60,6 +60,10 @@ string GCTCheats::getCheatComment(int nr) {
}
int GCTCheats::createGCT(int nr,const char * filename) {
+
+ if (nr == 0)
+ return 0;
+
ofstream filestr;
filestr.open(filename);
@@ -91,6 +95,7 @@ int GCTCheats::createGCT(int nr,const char * filename) {
}
int GCTCheats::createGCT(const char * chtbuffer,const char * filename) {
+
ofstream filestr;
filestr.open(filename);
@@ -125,6 +130,9 @@ int GCTCheats::createGCT(const char * chtbuffer,const char * filename) {
int GCTCheats::createGCT(int nr[],int cnt,const char * filename) {
+ if (cnt == 0)
+ return 0;
+
ofstream filestr;
filestr.open(filename);
diff --git a/source/menu.cpp b/source/menu.cpp
index ea408a47..c7fdcc79 100644
--- a/source/menu.cpp
+++ b/source/menu.cpp
@@ -30,6 +30,7 @@
#include "prompts/ProgressWindow.h"
#include "prompts/TitleBrowser.h"
#include "prompts/gameinfo.h"
+#include "prompts/DiscBrowser.h"
#include "mload/mload.h"
#include "patches/patchcode.h"
#include "network/networkops.h"
@@ -72,6 +73,7 @@ static lwp_t guithread = LWP_THREAD_NULL;
static bool guiHalt = true;
static int ExitRequested = 0;
static char gameregion[7];
+static bool altdoldefault = true;
/*** Extern variables ***/
extern FreeTypeGX *fontClock;
@@ -717,7 +719,7 @@ int MenuDiscList() {
WDVD_GetCoverStatus(&covert);//for detecting if i disc has been inserted
- // if the idiot is showing favoorites and don't have any
+ // if the idiot is showing favorites and don't have any
if (Settings.fave && !gameCnt) {
WindowPrompt(tr("No Favorites"),tr("You are choosing to display favorites and you do not have any selected."),tr("Back"));
Settings.fave=!Settings.fave;
@@ -1214,8 +1216,8 @@ int MenuDiscList() {
snprintf (IDfull,sizeof(IDfull),"%c%c%c%c%c%c", header->id[0], header->id[1], header->id[2],header->id[3], header->id[4], header->id[5]);
struct Game_CFG* game_cfg = CFG_get_game_opt(header->id);
if (game_cfg) {
- ocarinaChoice = game_cfg->ocarina;
alternatedol = game_cfg->loadalternatedol;
+ ocarinaChoice = game_cfg->ocarina;
} else {
alternatedol = off;
ocarinaChoice = Settings.ocarina;
@@ -1230,17 +1232,17 @@ int MenuDiscList() {
if (exeFile==NULL) {
sprintf(nipple, "%s %s",nipple,tr("does not exist!"));
WindowPrompt(tr("Error"),nipple,tr("OK"));
-
menu = MENU_CHECK;
wiilight(0);
break;
- }
+ } else {
+ fclose(exeFile);
+ }
}
if (ocarinaChoice != off) {
/* Open gct File and check exist */
sprintf(nipple, "%s%s.gct",Settings.Cheatcodespath,IDfull);
exeFile = fopen (nipple ,"rb");
-
if (exeFile==NULL) {
sprintf(nipple, "%s %s",nipple,tr("does not exist! Loading game without cheats."));
WindowPrompt(tr("Error"),nipple,NULL,NULL,NULL,NULL,170);
@@ -1248,6 +1250,7 @@ int MenuDiscList() {
fseek (exeFile, 0, SEEK_END);
long size=ftell (exeFile);
rewind (exeFile);
+ fclose(exeFile);
if (size>2056) {
sprintf(nipple, "%s %s",nipple,tr("contains over 255 lines of code. It will produce unexpected results."));
WindowPrompt(tr("Error"),nipple,NULL,NULL,NULL,NULL,170);
@@ -1272,7 +1275,6 @@ int MenuDiscList() {
CFG_save_game_num(header->id);
}
- SDCard_deInit();
menu = MENU_EXIT;
break;
@@ -1292,11 +1294,12 @@ int MenuDiscList() {
if (exeFile==NULL) {
sprintf(nipple, "%s %s",nipple,tr("does not exist! You Messed something up, Idiot."));
WindowPrompt(tr("Error"),nipple,tr("OK"));
-
menu = MENU_CHECK;
wiilight(0);
break;
- }
+ } else {
+ fclose(exeFile);
+ }
}
if (ocarinaChoice != off) {
/* Open gct File and check exist */
@@ -1317,12 +1320,10 @@ int MenuDiscList() {
}
}
- SDCard_deInit();
wiilight(0);
returnHere = false;
menu = MENU_EXIT;
-
} else if (choice == 2) {
wiilight(0);
HaltGui();
@@ -1398,20 +1399,54 @@ int MenuDiscList() {
covertOld=covert;
}
- HaltGui();
- mainWindow->RemoveAll();
- mainWindow->Append(bgImg);
- delete gameBrowser;
- gameBrowser = NULL;
- delete gameGrid;
- gameGrid = NULL;
- delete gameCarousel;
- gameCarousel = NULL;
- ResumeGui();
+ // set alt dol default
+ if (menu == MENU_EXIT && altdoldefault) {
+ struct discHdr *header = &gameList[gameSelected];
+ struct Game_CFG* game_cfg = CFG_get_game_opt(header->id);
+ // use default only if no alt dol was selected manually
+ if (game_cfg) {
+ if (game_cfg->alternatedolstart != 0)
+ altdoldefault = false;
+ }
+ if (altdoldefault) {
+ int autodol = autoSelectDol((char*)header->id);
+ if (autodol>0) {
+ alternatedol = 2;
+ alternatedoloffset = autodol;
+ char temp[20];
+ sprintf(temp,"%d",autodol);
+ } else {
+ // alt dol menu for games that require more than a single alt dol
+ int autodol = autoSelectDolMenu((char*)header->id);
+ if (autodol>0) {
+ alternatedol = 2;
+ alternatedoloffset = autodol;
+ } else if (autodol == 0) { // if Cancel or B is pressed, don't launch game
+ menu = MENU_DISCLIST;
+ }
+ }
+ }
+ }
+
+ if (menu == MENU_EXIT) {
+ SDCard_deInit();
+ }
+
+ HaltGui();
+ mainWindow->RemoveAll();
+ mainWindow->Append(bgImg);
+ delete gameBrowser;
+ gameBrowser = NULL;
+ delete gameGrid;
+ gameGrid = NULL;
+ delete gameCarousel;
+ gameCarousel = NULL;
+ ResumeGui();
return menu;
}
+
/****************************************************************************
* MenuInstall
***************************************************************************/
@@ -1877,7 +1912,7 @@ int MainMenu(int menu) {
break;
}
}
-
+
CloseXMLDatabase();
ExitGUIThreads();
bgMusic->Stop();
@@ -1891,8 +1926,7 @@ int MainMenu(int menu) {
delete GameIDTxt;
delete cover;
delete coverImg;
-
- ShutdownAudio();
+ ShutdownAudio();
StopGX();
if (boothomebrew == 1) {
@@ -1914,8 +1948,10 @@ int MainMenu(int menu) {
fix002 = game_cfg->errorfix002;
iosChoice = game_cfg->ios;
countrystrings = game_cfg->patchcountrystrings;
- alternatedol = game_cfg->loadalternatedol;
- alternatedoloffset = game_cfg->alternatedolstart;
+ if (!altdoldefault) {
+ alternatedol = game_cfg->loadalternatedol;
+ alternatedoloffset = game_cfg->alternatedolstart;
+ }
reloadblock = game_cfg->iosreloadblock;
} else {
videoChoice = Settings.video;
@@ -1929,8 +1965,10 @@ int MainMenu(int menu) {
}
fix002 = Settings.error002;
countrystrings = Settings.patchcountrystrings;
- alternatedol = off;
- alternatedoloffset = 0;
+ if (!altdoldefault) {
+ alternatedol = off;
+ alternatedoloffset = 0;
+ }
reloadblock = off;
}
int ios2;
diff --git a/source/patches/dvd_broadway.c b/source/patches/dvd_broadway.c
index d919de43..16e6a9e9 100644
--- a/source/patches/dvd_broadway.c
+++ b/source/patches/dvd_broadway.c
@@ -1,583 +1,612 @@
-/*
- * Copyright (C) 2008 Nuke (wiinuke@gmail.com)
- *
- * this file is part of GeckoOS for USB Gecko
- * http://www.usbgecko.com
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include "dvd_broadway.h"
-
-#define DI_CMDCTX_CNT 4
-
-#define DVD_DISKIDSIZE 0x20
-#define DVD_DRVINFSIZE 0x20
-
-#define IOCTL_DI_INQUIRY 0x12
-#define IOCTL_DI_READID 0x70
-#define IOCTL_DI_READ 0x71
-#define IOCTL_DI_WAITCVRCLOSE 0x79
-#define IOCTL_DI_COVER 0x7A
-#define IOCTL_DI_RESETNOTIFY 0x7E
-#define IOCTL_DI_RESET 0x8A
-#define IOCTL_DI_OPENPART 0x8B
-#define IOCTL_DI_CLOSEPART 0x8C
-#define IOCTL_DI_UNENCREAD 0x8D
-#define IOCTL_DI_ENABLE_DVD 0x8E
-#define IOCTL_DI_SEEK 0xAB
-#define IOCTL_DI_READ_DVDVIDEO 0xD0
-#define IOCTL_DI_STOPLASER 0xD2
-#define IOCTL_DI_OFFSET 0xD9
-#define IOCTL_DI_REQERROR 0xE0
-#define IOCTL_DI_STOPMOTOR 0xE3
-#define IOCTL_DI_SETOFFBASE 0xF0
-#define IOCTL_DI_GETOFFBASE 0xF1
-#define IOCTL_DI_SETCRYPTMODE 0xF2
-#define IOCTL_DI_GETCRYPTMODE 0xF3
-#define IOCTL_DI_SETDVDROMMODE 0xF4
-#define IOCTL_DI_GETDVDROMMODE 0xF5
-
-#define _SHIFTL(v, s, w) \
- ((u32) (((u32)(v) & ((0x01 << (w)) - 1)) << (s)))
-#define _SHIFTR(v, s, w) \
- ((u32)(((u32)(v) >> (s)) & ((0x01 << (w)) - 1)))
-
-struct dicommand {
- u32 diReg[8];
-};
-
-struct dicontext {
- lwp_node node;
- dvdcallbacklow cb;
- struct dicommand *cmd;
-};
-
-static s32 __dvd_fd = -1;
-static u32 __dvd_spinupval = 1;
-static lwp_queue __di_contextq;
-static u32 __dvd_readlength = 0;
-static u32 __dvd_cbinprogress = 0;
-static u32 __dvd_reqinprogress = 0;
-static u32 __dvd_lowinitcalled = 0;
-static struct dicommand *__di_commands = NULL;
-static struct dicontext __di_contexts[DI_CMDCTX_CNT];
-static u32 __di_regbuffer[0x08] ATTRIBUTE_ALIGN(32);
-static u32 __di_regvalcache[0x08] ATTRIBUTE_ALIGN(32);
-static u32 __di_lastticketerror[0x08] ATTRIBUTE_ALIGN(32);
-static ioctlv __di_iovector[0x08] ATTRIBUTE_ALIGN(32);
-static char __di_fs[] ATTRIBUTE_ALIGN(32) = "/dev/di";
-
-extern u32 __IPC_ClntInit();
-
-static __inline__ lwp_node* __lwp_queue_head(lwp_queue *queue) {
- return (lwp_node*)queue;
-}
-
-static __inline__ lwp_node* __lwp_queue_tail(lwp_queue *queue) {
- return (lwp_node*)&queue->perm_null;
-}
-
-
-static __inline__ void __lwp_queue_init_empty(lwp_queue *queue) {
- queue->first = __lwp_queue_tail(queue);
- queue->perm_null = NULL;
- queue->last = __lwp_queue_head(queue);
-}
-
-static struct dicontext* __dvd_getcontext(dvdcallbacklow cb) {
- struct dicontext *ctx;
-
- ctx = (struct dicontext*)__lwp_queue_get(&__di_contextq);
- if (ctx!=NULL) ctx->cb = cb;
-
- return ctx;
-}
-
-static s32 __dvd_iostransactionCB(s32 result,void *usrdata) {
- struct dicontext *ctx = (struct dicontext*)usrdata;
-
- __dvd_reqinprogress = 0;
-
- if (ctx->cb!=NULL) {
- __dvd_cbinprogress = 1;
- if (result!=0) __dvd_readlength = 0;
- ctx->cb(result);
- __dvd_cbinprogress = 0;
- }
- __lwp_queue_append(&__di_contextq,&ctx->node);
-
- return 0;
-}
-
-static s32 __dvd_ioscoverregisterCB(s32 result,void *usrdata) {
- struct dicontext *ctx = (struct dicontext*)usrdata;
-
- __dvd_reqinprogress = 0;
- __di_regvalcache[1] = __di_regbuffer[0];
-
- if (ctx->cb!=NULL) {
- __dvd_cbinprogress = 1;
- ctx->cb(result);
- __dvd_cbinprogress = 0;
- }
- __lwp_queue_append(&__di_contextq,&ctx->node);
-
- return 0;
-}
-
-static s32 __dvd_ioscovercloseCB(s32 result,void *usrdata) {
- struct dicontext *ctx = (struct dicontext*)usrdata;
-
- __dvd_reqinprogress = 0;
-
- if (ctx->cb!=NULL) {
- __dvd_cbinprogress = 1;
- ctx->cb(result);
- __dvd_cbinprogress = 0;
- }
- __lwp_queue_append(&__di_contextq,&ctx->node);
-
- return 0;
-}
-
-s32 bwDVD_LowInit() {
- s32 i,ret = 0;
- u32 ipclo,ipchi;
- lwp_queue inactives;
- struct dicontext *ctx;
-
- if (__dvd_lowinitcalled==0) {
- ret = __IPC_ClntInit();
- if (ret<0) return ret;
-
- ipclo = (((u32)IPC_GetBufferLo()+0x1f)&~0x1f);
- ipchi = (u32)IPC_GetBufferHi();
- if (ipchi>=(ipclo+(sizeof(struct dicommand)*DI_CMDCTX_CNT))) {
- __di_commands = (struct dicommand*)ipclo;
- IPC_SetBufferLo((void*)(ipclo+(sizeof(struct dicommand)*DI_CMDCTX_CNT)));
-
- memset(__di_commands,0,(sizeof(struct dicommand)*DI_CMDCTX_CNT));
-
- i = 0;
- __lwp_queue_init_empty(&__di_contextq);
- __lwp_queue_initialize(&inactives,__di_contexts,DI_CMDCTX_CNT,sizeof(struct dicontext));
- while ((ctx=(struct dicontext*)__lwp_queue_get(&inactives))!=NULL) {
- ctx->cmd = &__di_commands[i];
- ctx->cb = NULL;
- __lwp_queue_append(&__di_contextq,&ctx->node);
-
- i++;
- }
- }
-
- ret = IOS_Open(__di_fs,0);
- if (ret<0) return ret;
-
- __dvd_fd = ret;
-// __dvd_lowinitcalled = 1;
-
- // printf("DVD_LowInit(%d)\n",ret);
- }
- return 0;
-}
-
-s32 bwDVD_LowInquiry(dvddrvinfo *info,dvdcallbacklow cb) {
- s32 ret;
- struct dicontext *ctx;
- struct dicommand *cmd;
-
- __dvd_reqinprogress = 1;
-
- ctx = __dvd_getcontext(cb);
- if (ctx==NULL) return IPC_ENOMEM;
-
- cmd = ctx->cmd;
- cmd->diReg[0] = (IOCTL_DI_INQUIRY<<24);
- ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_INQUIRY,cmd->diReg,sizeof(struct dicommand),info,DVD_DRVINFSIZE,__dvd_iostransactionCB,ctx);
-
- return ret;
-}
-
-s32 bwDVD_LowReadID(dvddiskid *diskID,dvdcallbacklow cb) {
- s32 ret = 0;
- struct dicontext *ctx;
- struct dicommand *cmd;
-
-// printf("DVD_LowReadID()\n");
-
- __dvd_reqinprogress = 1;
-
- ctx = __dvd_getcontext(cb);
- if (ctx==NULL) return IPC_ENOMEM;
-
- cmd = ctx->cmd;
- cmd->diReg[0] = (IOCTL_DI_READID<<24);
- ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_READID,cmd->diReg,sizeof(struct dicommand),diskID,DVD_DISKIDSIZE,__dvd_iostransactionCB,ctx);
-
-// printf("DVD_LowReadID(%d)\n",ret);
- return ret;
-}
-
-
-s32 bwDVD_LowRead(void *buf,u32 len,u32 offset,dvdcallbacklow cb) {
- s32 ret;
- struct dicontext *ctx;
- struct dicommand *cmd;
-
- if (buf==NULL || ((u32)buf%32)!=0) return -1;
-
- __dvd_reqinprogress = 1;
- __dvd_readlength = len;
-
- ctx = __dvd_getcontext(cb);
- if (ctx==NULL) return IPC_ENOMEM;
-
- cmd = ctx->cmd;
- cmd->diReg[0] = (IOCTL_DI_READ<<24);
- cmd->diReg[1] = len;
- cmd->diReg[2] = offset;
- ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_READ,cmd->diReg,sizeof(struct dicommand),buf,len,__dvd_iostransactionCB,ctx);
-
- return ret;
-}
-
-// never got this function working, probably removed from wii
-s32 bwDVD_LowReadVideo(void *buf,u32 len,u32 offset,dvdcallbacklow cb) {
- s32 ret;
- struct dicontext *ctx;
- struct dicommand *cmd;
-
- __dvd_reqinprogress = 1;
- __dvd_readlength = len;
-
- ctx = __dvd_getcontext(cb);
- if (ctx==NULL) return IPC_ENOMEM;
-
- cmd = ctx->cmd;
- cmd->diReg[0] = (IOCTL_DI_READ_DVDVIDEO<<24);
- cmd->diReg[1] = len;
- cmd->diReg[2] = offset;
- ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_READ_DVDVIDEO,cmd->diReg,sizeof(struct dicommand),buf,len,__dvd_iostransactionCB,ctx);
-
- return ret;
-}
-
-
-
-s32 bwDVD_LowStopLaser(dvdcallbacklow cb) {
- s32 ret;
- struct dicontext *ctx;
- struct dicommand *cmd;
-
- __dvd_reqinprogress = 1;
-
- ctx = __dvd_getcontext(cb);
- if (ctx==NULL) return IPC_ENOMEM;
-
- cmd = ctx->cmd;
- cmd->diReg[0] = (IOCTL_DI_STOPLASER<<24);
- ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_STOPLASER,cmd->diReg,sizeof(struct dicommand),__di_regvalcache,0x20,__dvd_iostransactionCB,ctx);
-
- return ret;
-}
-
-// never got this function working, probably removed from wii
-s32 bwDVD_EnableVideo(dvdcallbacklow cb) {
- s32 ret;
- struct dicontext *ctx;
- struct dicommand *cmd;
-
- __dvd_reqinprogress = 1;
-
- ctx = __dvd_getcontext(cb);
- if (ctx==NULL) return IPC_ENOMEM;
-
- cmd = ctx->cmd;
- cmd->diReg[0] = (IOCTL_DI_ENABLE_DVD<<24);
- ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_ENABLE_DVD,cmd->diReg,sizeof(struct dicommand),__di_regvalcache,0x20,__dvd_iostransactionCB,ctx);
-
- return ret;
-}
-
-s32 bwDVD_LowSeek(u32 offset,dvdcallbacklow cb) {
- s32 ret;
- struct dicontext *ctx;
- struct dicommand *cmd;
-
- __dvd_reqinprogress = 1;
-
- ctx = __dvd_getcontext(cb);
- if (ctx==NULL) return IPC_ENOMEM;
-
- cmd = ctx->cmd;
- cmd->diReg[0] = (IOCTL_DI_SEEK<<24);
- cmd->diReg[1] = offset;
- ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_SEEK,cmd->diReg,sizeof(struct dicommand),NULL,0,__dvd_iostransactionCB,ctx);
-
- return ret;
-}
-
-s32 bwDVD_LowOffset(u64 offset,dvdcallbacklow cb) {
- s32 ret;
- u32 *off = (u32*)(void*)(&offset);
- struct dicontext *ctx;
- struct dicommand *cmd;
-
- __dvd_reqinprogress = 1;
-
- ctx = __dvd_getcontext(cb);
- if (ctx==NULL) return IPC_ENOMEM;
-
- cmd = ctx->cmd;
- cmd->diReg[0] = (IOCTL_DI_OFFSET<<24);
- cmd->diReg[1] = 0;
- if (off[0]) cmd->diReg[1] = 1;
- cmd->diReg[2] = off[1];
- ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_OFFSET,cmd->diReg,sizeof(struct dicommand),__di_regvalcache,0x20,__dvd_iostransactionCB,ctx);
-
- return ret;
-}
-
-s32 bwDVD_LowPrepareCoverRegister(dvdcallbacklow cb) {
- s32 ret;
- struct dicontext *ctx;
- struct dicommand *cmd;
-
- __dvd_reqinprogress = 1;
-
- ctx = __dvd_getcontext(cb);
- if (ctx==NULL) return IPC_ENOMEM;
-
- cmd = ctx->cmd;
- cmd->diReg[0] = (IOCTL_DI_COVER<<24);
- ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_COVER,cmd->diReg,sizeof(struct dicommand),__di_regbuffer,0x20,__dvd_ioscoverregisterCB,ctx);
-
- return ret;
-}
-
-s32 bwDVD_LowOpenPartition(u32 offset,void *eticket,u32 certin_len,void *certificate_in,void *certificate_out,dvdcallbacklow cb) {
- s32 ret;
- struct dicontext *ctx;
- struct dicommand *cmd;
-
- if (eticket!=NULL && ((u32)eticket%32)!=0) return -1;
- if (certificate_in!=NULL && ((u32)certificate_in%32)!=0) return -1;
- if (certificate_out!=NULL && ((u32)certificate_out%32)!=0) return -1;
-
- __dvd_reqinprogress = 1;
-
- ctx = __dvd_getcontext(cb);
- if (ctx==NULL) return IPC_ENOMEM;
-
- cmd = ctx->cmd;
- cmd->diReg[0] = (IOCTL_DI_OPENPART<<24);
- cmd->diReg[1] = offset;
-
- __di_iovector[0].data = cmd;
- __di_iovector[0].len = sizeof(struct dicommand);
-
- __di_iovector[1].data = eticket;
- if (eticket==NULL) __di_iovector[1].len = 0;
- else __di_iovector[1].len = 676;
-
- __di_iovector[2].data = certificate_in;
- if (certificate_in==NULL) __di_iovector[2].len = 0;
- else __di_iovector[2].len = certin_len;
-
- __di_iovector[3].data = certificate_out;
- __di_iovector[3].len = 18916;
- __di_iovector[4].data = __di_lastticketerror;
- __di_iovector[4].len = 0x20;
- ret = IOS_IoctlvAsync(__dvd_fd,IOCTL_DI_OPENPART,3,2,__di_iovector,__dvd_iostransactionCB,ctx);
-
- return ret;
-}
-
-s32 bwDVD_LowClosePartition(dvdcallbacklow cb) {
- s32 ret;
- struct dicontext *ctx;
- struct dicommand *cmd;
-
- __dvd_reqinprogress = 1;
-
- ctx = __dvd_getcontext(cb);
- if (ctx==NULL) return IPC_ENOMEM;
-
- cmd = ctx->cmd;
- cmd->diReg[0] = (IOCTL_DI_CLOSEPART<<24);
- ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_CLOSEPART,cmd->diReg,sizeof(struct dicommand),NULL,0,__dvd_iostransactionCB,ctx);
-
- return ret;
-}
-
-s32 bwDVD_LowUnencryptedRead(void *buf,u32 len,u32 offset,dvdcallbacklow cb) {
- s32 ret;
- struct dicontext *ctx;
- struct dicommand *cmd;
-
- __dvd_reqinprogress = 1;
- __dvd_readlength = len;
-
- ctx = __dvd_getcontext(cb);
- if (ctx==NULL) return IPC_ENOMEM;
-
- cmd = ctx->cmd;
- cmd->diReg[0] = (IOCTL_DI_UNENCREAD<<24);
- cmd->diReg[1] = len;
- cmd->diReg[2] = offset;
- ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_UNENCREAD,cmd->diReg,sizeof(struct dicommand),buf,len,__dvd_iostransactionCB,ctx);
-
- return ret;
-}
-
-s32 bwDVD_LowWaitCoverClose(dvdcallbacklow cb) {
- s32 ret;
- struct dicontext *ctx;
- struct dicommand *cmd;
-
- __dvd_reqinprogress = 1;
-
- ctx = __dvd_getcontext(cb);
- if (ctx==NULL) return IPC_ENOMEM;
-
- cmd = ctx->cmd;
- cmd->diReg[0] = (IOCTL_DI_WAITCVRCLOSE<<24);
- ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_WAITCVRCLOSE,cmd->diReg,sizeof(struct dicommand),NULL,0,__dvd_ioscovercloseCB,ctx);
-
- return ret;
-}
-
-s32 bwDVD_LowResetNotify() {
- s32 ret;
- struct dicontext *ctx;
- struct dicommand *cmd;
-
- if (__dvd_cbinprogress==1) return -1;
-
- ctx = __dvd_getcontext(NULL);
- if (ctx==NULL) return IPC_ENOMEM;
-
- cmd = ctx->cmd;
- cmd->diReg[0] = (IOCTL_DI_RESETNOTIFY<<24);
- ret = IOS_Ioctl(__dvd_fd,IOCTL_DI_RESETNOTIFY,cmd->diReg,sizeof(struct dicommand),NULL,0);
-
- return ret;
-}
-
-s32 bwDVD_LowReset(dvdcallbacklow cb) {
- s32 ret;
- struct dicontext *ctx;
- struct dicommand *cmd;
-
-// printf("DVD_LowReset()\n");
- __dvd_reqinprogress = 1;
-
- ctx = __dvd_getcontext(cb);
- if (ctx==NULL) return IPC_ENOMEM;
-
- cmd = ctx->cmd;
- cmd->diReg[0] = (IOCTL_DI_RESET<<24);
- cmd->diReg[1] = __dvd_spinupval;
- ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_RESET,cmd->diReg,sizeof(struct dicommand),NULL,0,__dvd_iostransactionCB,ctx);
-
-// printf("DVD_LowReset(%d)\n",ret);
- return ret;
-}
-
-s32 bwDVD_LowStopMotor(u8 stop1,u8 stop2,dvdcallbacklow cb) {
- s32 ret;
- struct dicontext *ctx;
- struct dicommand *cmd;
-
- __dvd_reqinprogress = 1;
-
- ctx = __dvd_getcontext(cb);
- if (ctx==NULL) return IPC_ENOMEM;
-
- cmd = ctx->cmd;
- cmd->diReg[0] = (IOCTL_DI_STOPMOTOR<<24);
- cmd->diReg[1] = (stop1<<24);
- cmd->diReg[2] = (stop2<<24);
- ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_STOPMOTOR,cmd->diReg,sizeof(struct dicommand),__di_regvalcache,0x20,__dvd_iostransactionCB,ctx);
-
- return ret;
-
-}
-
-s32 bwDVD_LowRequestError(dvdcallbacklow cb) {
- s32 ret;
- struct dicontext *ctx;
- struct dicommand *cmd;
-
- __dvd_reqinprogress = 1;
-
- ctx = __dvd_getcontext(cb);
- if (ctx==NULL) return IPC_ENOMEM;
-
- cmd = ctx->cmd;
- cmd->diReg[0] = (IOCTL_DI_REQERROR<<24);
- ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_REQERROR,cmd->diReg,sizeof(struct dicommand),__di_regvalcache,0x20,__dvd_iostransactionCB,ctx);
-
- return ret;
-}
-
-
-s32 bwDVD_SetDecryption(s32 mode, dvdcallbacklow cb) {
- s32 ret;
- struct dicontext *ctx;
- struct dicommand *cmd;
-
- __dvd_reqinprogress = 1;
-
- ctx = __dvd_getcontext(cb);
- if (ctx==NULL) return IPC_ENOMEM;
-
- cmd = ctx->cmd;
- cmd->diReg[0] = (IOCTL_DI_SETCRYPTMODE<<24);
- cmd->diReg[1] = mode;
- ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_SETCRYPTMODE,cmd->diReg,sizeof(struct dicommand),__di_regvalcache,0x20,__dvd_iostransactionCB,ctx);
-
- return ret;
-
-}
-
-s32 bwDVD_SetOffset(u32 offset, dvdcallbacklow cb) {
- s32 ret;
- struct dicontext *ctx;
- struct dicommand *cmd;
-
- __dvd_reqinprogress = 1;
-
- ctx = __dvd_getcontext(cb);
- if (ctx==NULL) return IPC_ENOMEM;
-
- cmd = ctx->cmd;
- cmd->diReg[0] = (IOCTL_DI_SETOFFBASE<<24);
- cmd->diReg[1] = offset;
- ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_SETOFFBASE,cmd->diReg,sizeof(struct dicommand),__di_regvalcache,0x20,__dvd_iostransactionCB,ctx);
-
- return ret;
-
-}
+/*
+ * Copyright (C) 2008 Nuke (wiinuke@gmail.com)
+ *
+ * this file is part of GeckoOS for USB Gecko
+ * http://www.usbgecko.com
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "dvd_broadway.h"
+
+#define DI_CMDCTX_CNT 4
+
+#define DVD_DISKIDSIZE 0x20
+#define DVD_DRVINFSIZE 0x20
+
+#define IOCTL_DI_INQUIRY 0x12
+#define IOCTL_DI_READID 0x70
+#define IOCTL_DI_READ 0x71
+#define IOCTL_DI_WAITCVRCLOSE 0x79
+#define IOCTL_DI_COVER 0x7A
+#define IOCTL_DI_RESETNOTIFY 0x7E
+#define IOCTL_DI_RESET 0x8A
+#define IOCTL_DI_OPENPART 0x8B
+#define IOCTL_DI_CLOSEPART 0x8C
+#define IOCTL_DI_UNENCREAD 0x8D
+#define IOCTL_DI_ENABLE_DVD 0x8E
+#define IOCTL_DI_SEEK 0xAB
+#define IOCTL_DI_READ_DVDVIDEO 0xD0
+#define IOCTL_DI_STOPLASER 0xD2
+#define IOCTL_DI_OFFSET 0xD9
+#define IOCTL_DI_REQERROR 0xE0
+#define IOCTL_DI_STOPMOTOR 0xE3
+#define IOCTL_DI_SETOFFBASE 0xF0
+#define IOCTL_DI_GETOFFBASE 0xF1
+#define IOCTL_DI_SETCRYPTMODE 0xF2
+#define IOCTL_DI_GETCRYPTMODE 0xF3
+#define IOCTL_DI_SETDVDROMMODE 0xF4
+#define IOCTL_DI_GETDVDROMMODE 0xF5
+
+#define _SHIFTL(v, s, w) \
+ ((u32) (((u32)(v) & ((0x01 << (w)) - 1)) << (s)))
+#define _SHIFTR(v, s, w) \
+ ((u32)(((u32)(v) >> (s)) & ((0x01 << (w)) - 1)))
+
+struct dicommand
+{
+ u32 diReg[8];
+};
+
+struct dicontext
+{
+ lwp_node node;
+ dvdcallbacklow cb;
+ struct dicommand *cmd;
+};
+
+static s32 __dvd_fd = -1;
+static u32 __dvd_spinupval = 1;
+static lwp_queue __di_contextq;
+static u32 __dvd_readlength = 0;
+static u32 __dvd_cbinprogress = 0;
+static u32 __dvd_reqinprogress = 0;
+static u32 __dvd_lowinitcalled = 0;
+static struct dicommand *__di_commands = NULL;
+static struct dicontext __di_contexts[DI_CMDCTX_CNT];
+static u32 __di_regbuffer[0x08] ATTRIBUTE_ALIGN(32);
+static u32 __di_regvalcache[0x08] ATTRIBUTE_ALIGN(32);
+static u32 __di_lastticketerror[0x08] ATTRIBUTE_ALIGN(32);
+static ioctlv __di_iovector[0x08] ATTRIBUTE_ALIGN(32);
+static char __di_fs[] ATTRIBUTE_ALIGN(32) = "/dev/di";
+
+extern u32 __IPC_ClntInit();
+
+static __inline__ lwp_node* __lwp_queue_head(lwp_queue *queue)
+{
+ return (lwp_node*)queue;
+}
+
+static __inline__ lwp_node* __lwp_queue_tail(lwp_queue *queue)
+{
+ return (lwp_node*)&queue->perm_null;
+}
+
+
+static __inline__ void __lwp_queue_init_empty(lwp_queue *queue)
+{
+ queue->first = __lwp_queue_tail(queue);
+ queue->perm_null = NULL;
+ queue->last = __lwp_queue_head(queue);
+}
+
+static struct dicontext* __dvd_getcontext(dvdcallbacklow cb)
+{
+ struct dicontext *ctx;
+
+ ctx = (struct dicontext*)__lwp_queue_get(&__di_contextq);
+ if(ctx!=NULL) ctx->cb = cb;
+
+ return ctx;
+}
+
+static s32 __dvd_iostransactionCB(s32 result,void *usrdata)
+{
+ struct dicontext *ctx = (struct dicontext*)usrdata;
+
+ __dvd_reqinprogress = 0;
+
+ if(ctx->cb!=NULL) {
+ __dvd_cbinprogress = 1;
+ if(result!=0) __dvd_readlength = 0;
+ ctx->cb(result);
+ __dvd_cbinprogress = 0;
+ }
+ __lwp_queue_append(&__di_contextq,&ctx->node);
+
+ return 0;
+}
+
+static s32 __dvd_ioscoverregisterCB(s32 result,void *usrdata)
+{
+ struct dicontext *ctx = (struct dicontext*)usrdata;
+
+ __dvd_reqinprogress = 0;
+ __di_regvalcache[1] = __di_regbuffer[0];
+
+ if(ctx->cb!=NULL) {
+ __dvd_cbinprogress = 1;
+ ctx->cb(result);
+ __dvd_cbinprogress = 0;
+ }
+ __lwp_queue_append(&__di_contextq,&ctx->node);
+
+ return 0;
+}
+
+static s32 __dvd_ioscovercloseCB(s32 result,void *usrdata)
+{
+ struct dicontext *ctx = (struct dicontext*)usrdata;
+
+ __dvd_reqinprogress = 0;
+
+ if(ctx->cb!=NULL) {
+ __dvd_cbinprogress = 1;
+ ctx->cb(result);
+ __dvd_cbinprogress = 0;
+ }
+ __lwp_queue_append(&__di_contextq,&ctx->node);
+
+ return 0;
+}
+
+s32 bwDVD_LowInit()
+{
+ s32 i,ret = 0;
+ u32 ipclo,ipchi;
+ lwp_queue inactives;
+ struct dicontext *ctx;
+
+ if(__dvd_lowinitcalled==0) {
+ ret = __IPC_ClntInit();
+ if(ret<0) return ret;
+
+ ipclo = (((u32)IPC_GetBufferLo()+0x1f)&~0x1f);
+ ipchi = (u32)IPC_GetBufferHi();
+ if(ipchi>=(ipclo+(sizeof(struct dicommand)*DI_CMDCTX_CNT))) {
+ __di_commands = (struct dicommand*)ipclo;
+ IPC_SetBufferLo((void*)(ipclo+(sizeof(struct dicommand)*DI_CMDCTX_CNT)));
+
+ memset(__di_commands,0,(sizeof(struct dicommand)*DI_CMDCTX_CNT));
+
+ i = 0;
+ __lwp_queue_init_empty(&__di_contextq);
+ __lwp_queue_initialize(&inactives,__di_contexts,DI_CMDCTX_CNT,sizeof(struct dicontext));
+ while((ctx=(struct dicontext*)__lwp_queue_get(&inactives))!=NULL) {
+ ctx->cmd = &__di_commands[i];
+ ctx->cb = NULL;
+ __lwp_queue_append(&__di_contextq,&ctx->node);
+
+ i++;
+ }
+ }
+
+ ret = IOS_Open(__di_fs,0);
+ if(ret<0) return ret;
+
+ __dvd_fd = ret;
+// __dvd_lowinitcalled = 1;
+
+ // printf("DVD_LowInit(%d)\n",ret);
+ }
+ return 0;
+}
+
+s32 bwDVD_LowInquiry(dvddrvinfo *info,dvdcallbacklow cb)
+{
+ s32 ret;
+ struct dicontext *ctx;
+ struct dicommand *cmd;
+
+ __dvd_reqinprogress = 1;
+
+ ctx = __dvd_getcontext(cb);
+ if(ctx==NULL) return IPC_ENOMEM;
+
+ cmd = ctx->cmd;
+ cmd->diReg[0] = (IOCTL_DI_INQUIRY<<24);
+ ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_INQUIRY,cmd->diReg,sizeof(struct dicommand),info,DVD_DRVINFSIZE,__dvd_iostransactionCB,ctx);
+
+ return ret;
+}
+
+s32 bwDVD_LowReadID(dvddiskid *diskID,dvdcallbacklow cb)
+{
+ s32 ret = 0;
+ struct dicontext *ctx;
+ struct dicommand *cmd;
+
+// printf("DVD_LowReadID()\n");
+
+ __dvd_reqinprogress = 1;
+
+ ctx = __dvd_getcontext(cb);
+ if(ctx==NULL) return IPC_ENOMEM;
+
+ cmd = ctx->cmd;
+ cmd->diReg[0] = (IOCTL_DI_READID<<24);
+ ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_READID,cmd->diReg,sizeof(struct dicommand),diskID,DVD_DISKIDSIZE,__dvd_iostransactionCB,ctx);
+
+// printf("DVD_LowReadID(%d)\n",ret);
+ return ret;
+}
+
+
+s32 bwDVD_LowRead(void *buf,u32 len,u32 offset,dvdcallbacklow cb)
+{
+ s32 ret;
+ struct dicontext *ctx;
+ struct dicommand *cmd;
+
+ if(buf==NULL || ((u32)buf%32)!=0) return -1;
+
+ __dvd_reqinprogress = 1;
+ __dvd_readlength = len;
+
+ ctx = __dvd_getcontext(cb);
+ if(ctx==NULL) return IPC_ENOMEM;
+
+ cmd = ctx->cmd;
+ cmd->diReg[0] = (IOCTL_DI_READ<<24);
+ cmd->diReg[1] = len;
+ cmd->diReg[2] = offset;
+ ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_READ,cmd->diReg,sizeof(struct dicommand),buf,len,__dvd_iostransactionCB,ctx);
+
+ return ret;
+}
+
+// never got this function working, probably removed from wii
+s32 bwDVD_LowReadVideo(void *buf,u32 len,u32 offset,dvdcallbacklow cb)
+{
+ s32 ret;
+ struct dicontext *ctx;
+ struct dicommand *cmd;
+
+ __dvd_reqinprogress = 1;
+ __dvd_readlength = len;
+
+ ctx = __dvd_getcontext(cb);
+ if(ctx==NULL) return IPC_ENOMEM;
+
+ cmd = ctx->cmd;
+ cmd->diReg[0] = (IOCTL_DI_READ_DVDVIDEO<<24);
+ cmd->diReg[1] = len;
+ cmd->diReg[2] = offset;
+ ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_READ_DVDVIDEO,cmd->diReg,sizeof(struct dicommand),buf,len,__dvd_iostransactionCB,ctx);
+
+ return ret;
+}
+
+
+
+s32 bwDVD_LowStopLaser(dvdcallbacklow cb)
+{
+ s32 ret;
+ struct dicontext *ctx;
+ struct dicommand *cmd;
+
+ __dvd_reqinprogress = 1;
+
+ ctx = __dvd_getcontext(cb);
+ if(ctx==NULL) return IPC_ENOMEM;
+
+ cmd = ctx->cmd;
+ cmd->diReg[0] = (IOCTL_DI_STOPLASER<<24);
+ ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_STOPLASER,cmd->diReg,sizeof(struct dicommand),__di_regvalcache,0x20,__dvd_iostransactionCB,ctx);
+
+ return ret;
+}
+
+// never got this function working, probably removed from wii
+s32 bwDVD_EnableVideo(dvdcallbacklow cb)
+{
+ s32 ret;
+ struct dicontext *ctx;
+ struct dicommand *cmd;
+
+ __dvd_reqinprogress = 1;
+
+ ctx = __dvd_getcontext(cb);
+ if(ctx==NULL) return IPC_ENOMEM;
+
+ cmd = ctx->cmd;
+ cmd->diReg[0] = (IOCTL_DI_ENABLE_DVD<<24);
+ ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_ENABLE_DVD,cmd->diReg,sizeof(struct dicommand),__di_regvalcache,0x20,__dvd_iostransactionCB,ctx);
+
+ return ret;
+}
+
+s32 bwDVD_LowSeek(u32 offset,dvdcallbacklow cb)
+{
+ s32 ret;
+ struct dicontext *ctx;
+ struct dicommand *cmd;
+
+ __dvd_reqinprogress = 1;
+
+ ctx = __dvd_getcontext(cb);
+ if(ctx==NULL) return IPC_ENOMEM;
+
+ cmd = ctx->cmd;
+ cmd->diReg[0] = (IOCTL_DI_SEEK<<24);
+ cmd->diReg[1] = offset;
+ ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_SEEK,cmd->diReg,sizeof(struct dicommand),NULL,0,__dvd_iostransactionCB,ctx);
+
+ return ret;
+}
+
+s32 bwDVD_LowOffset(u64 offset,dvdcallbacklow cb)
+{
+ s32 ret;
+ u32 *off = (u32*)(void*)(&offset);
+ struct dicontext *ctx;
+ struct dicommand *cmd;
+
+ __dvd_reqinprogress = 1;
+
+ ctx = __dvd_getcontext(cb);
+ if(ctx==NULL) return IPC_ENOMEM;
+
+ cmd = ctx->cmd;
+ cmd->diReg[0] = (IOCTL_DI_OFFSET<<24);
+ cmd->diReg[1] = 0;
+ if(off[0]) cmd->diReg[1] = 1;
+ cmd->diReg[2] = off[1];
+ ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_OFFSET,cmd->diReg,sizeof(struct dicommand),__di_regvalcache,0x20,__dvd_iostransactionCB,ctx);
+
+ return ret;
+}
+
+s32 bwDVD_LowPrepareCoverRegister(dvdcallbacklow cb)
+{
+ s32 ret;
+ struct dicontext *ctx;
+ struct dicommand *cmd;
+
+ __dvd_reqinprogress = 1;
+
+ ctx = __dvd_getcontext(cb);
+ if(ctx==NULL) return IPC_ENOMEM;
+
+ cmd = ctx->cmd;
+ cmd->diReg[0] = (IOCTL_DI_COVER<<24);
+ ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_COVER,cmd->diReg,sizeof(struct dicommand),__di_regbuffer,0x20,__dvd_ioscoverregisterCB,ctx);
+
+ return ret;
+}
+
+s32 bwDVD_LowOpenPartition(u32 offset,void *eticket,u32 certin_len,void *certificate_in,void *certificate_out,dvdcallbacklow cb)
+{
+ s32 ret;
+ struct dicontext *ctx;
+ struct dicommand *cmd;
+
+ if(eticket!=NULL && ((u32)eticket%32)!=0) return -1;
+ if(certificate_in!=NULL && ((u32)certificate_in%32)!=0) return -1;
+ if(certificate_out!=NULL && ((u32)certificate_out%32)!=0) return -1;
+
+ __dvd_reqinprogress = 1;
+
+ ctx = __dvd_getcontext(cb);
+ if(ctx==NULL) return IPC_ENOMEM;
+
+ cmd = ctx->cmd;
+ cmd->diReg[0] = (IOCTL_DI_OPENPART<<24);
+ cmd->diReg[1] = offset;
+
+ __di_iovector[0].data = cmd;
+ __di_iovector[0].len = sizeof(struct dicommand);
+
+ __di_iovector[1].data = eticket;
+ if(eticket==NULL) __di_iovector[1].len = 0;
+ else __di_iovector[1].len = 676;
+
+ __di_iovector[2].data = certificate_in;
+ if(certificate_in==NULL) __di_iovector[2].len = 0;
+ else __di_iovector[2].len = certin_len;
+
+ __di_iovector[3].data = certificate_out;
+ __di_iovector[3].len = 18916;
+ __di_iovector[4].data = __di_lastticketerror;
+ __di_iovector[4].len = 0x20;
+ ret = IOS_IoctlvAsync(__dvd_fd,IOCTL_DI_OPENPART,3,2,__di_iovector,__dvd_iostransactionCB,ctx);
+
+ return ret;
+}
+
+s32 bwDVD_LowClosePartition(dvdcallbacklow cb)
+{
+ s32 ret;
+ struct dicontext *ctx;
+ struct dicommand *cmd;
+
+ __dvd_reqinprogress = 1;
+
+ ctx = __dvd_getcontext(cb);
+ if(ctx==NULL) return IPC_ENOMEM;
+
+ cmd = ctx->cmd;
+ cmd->diReg[0] = (IOCTL_DI_CLOSEPART<<24);
+ ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_CLOSEPART,cmd->diReg,sizeof(struct dicommand),NULL,0,__dvd_iostransactionCB,ctx);
+
+ return ret;
+}
+
+s32 bwDVD_LowUnencryptedRead(void *buf,u32 len,u32 offset,dvdcallbacklow cb)
+{
+ s32 ret;
+ struct dicontext *ctx;
+ struct dicommand *cmd;
+
+ __dvd_reqinprogress = 1;
+ __dvd_readlength = len;
+
+ ctx = __dvd_getcontext(cb);
+ if(ctx==NULL) return IPC_ENOMEM;
+
+ cmd = ctx->cmd;
+ cmd->diReg[0] = (IOCTL_DI_UNENCREAD<<24);
+ cmd->diReg[1] = len;
+ cmd->diReg[2] = offset;
+ ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_UNENCREAD,cmd->diReg,sizeof(struct dicommand),buf,len,__dvd_iostransactionCB,ctx);
+
+ return ret;
+}
+
+s32 bwDVD_LowWaitCoverClose(dvdcallbacklow cb)
+{
+ s32 ret;
+ struct dicontext *ctx;
+ struct dicommand *cmd;
+
+ __dvd_reqinprogress = 1;
+
+ ctx = __dvd_getcontext(cb);
+ if(ctx==NULL) return IPC_ENOMEM;
+
+ cmd = ctx->cmd;
+ cmd->diReg[0] = (IOCTL_DI_WAITCVRCLOSE<<24);
+ ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_WAITCVRCLOSE,cmd->diReg,sizeof(struct dicommand),NULL,0,__dvd_ioscovercloseCB,ctx);
+
+ return ret;
+}
+
+s32 bwDVD_LowResetNotify()
+{
+ s32 ret;
+ struct dicontext *ctx;
+ struct dicommand *cmd;
+
+ if(__dvd_cbinprogress==1) return -1;
+
+ ctx = __dvd_getcontext(NULL);
+ if(ctx==NULL) return IPC_ENOMEM;
+
+ cmd = ctx->cmd;
+ cmd->diReg[0] = (IOCTL_DI_RESETNOTIFY<<24);
+ ret = IOS_Ioctl(__dvd_fd,IOCTL_DI_RESETNOTIFY,cmd->diReg,sizeof(struct dicommand),NULL,0);
+
+ return ret;
+}
+
+s32 bwDVD_LowReset(dvdcallbacklow cb)
+{
+ s32 ret;
+ struct dicontext *ctx;
+ struct dicommand *cmd;
+
+// printf("DVD_LowReset()\n");
+ __dvd_reqinprogress = 1;
+
+ ctx = __dvd_getcontext(cb);
+ if(ctx==NULL) return IPC_ENOMEM;
+
+ cmd = ctx->cmd;
+ cmd->diReg[0] = (IOCTL_DI_RESET<<24);
+ cmd->diReg[1] = __dvd_spinupval;
+ ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_RESET,cmd->diReg,sizeof(struct dicommand),NULL,0,__dvd_iostransactionCB,ctx);
+
+// printf("DVD_LowReset(%d)\n",ret);
+ return ret;
+}
+
+s32 bwDVD_LowStopMotor(u8 stop1,u8 stop2,dvdcallbacklow cb)
+{
+ s32 ret;
+ struct dicontext *ctx;
+ struct dicommand *cmd;
+
+ __dvd_reqinprogress = 1;
+
+ ctx = __dvd_getcontext(cb);
+ if(ctx==NULL) return IPC_ENOMEM;
+
+ cmd = ctx->cmd;
+ cmd->diReg[0] = (IOCTL_DI_STOPMOTOR<<24);
+ cmd->diReg[1] = (stop1<<24);
+ cmd->diReg[2] = (stop2<<24);
+ ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_STOPMOTOR,cmd->diReg,sizeof(struct dicommand),__di_regvalcache,0x20,__dvd_iostransactionCB,ctx);
+
+ return ret;
+
+}
+
+s32 bwDVD_LowRequestError(dvdcallbacklow cb)
+{
+ s32 ret;
+ struct dicontext *ctx;
+ struct dicommand *cmd;
+
+ __dvd_reqinprogress = 1;
+
+ ctx = __dvd_getcontext(cb);
+ if(ctx==NULL) return IPC_ENOMEM;
+
+ cmd = ctx->cmd;
+ cmd->diReg[0] = (IOCTL_DI_REQERROR<<24);
+ ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_REQERROR,cmd->diReg,sizeof(struct dicommand),__di_regvalcache,0x20,__dvd_iostransactionCB,ctx);
+
+ return ret;
+}
+
+
+s32 bwDVD_SetDecryption(s32 mode, dvdcallbacklow cb)
+{
+ s32 ret;
+ struct dicontext *ctx;
+ struct dicommand *cmd;
+
+ __dvd_reqinprogress = 1;
+
+ ctx = __dvd_getcontext(cb);
+ if(ctx==NULL) return IPC_ENOMEM;
+
+ cmd = ctx->cmd;
+ cmd->diReg[0] = (IOCTL_DI_SETCRYPTMODE<<24);
+ cmd->diReg[1] = mode;
+ ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_SETCRYPTMODE,cmd->diReg,sizeof(struct dicommand),__di_regvalcache,0x20,__dvd_iostransactionCB,ctx);
+
+ return ret;
+
+}
+
+s32 bwDVD_SetOffset(u32 offset, dvdcallbacklow cb)
+{
+ s32 ret;
+ struct dicontext *ctx;
+ struct dicommand *cmd;
+
+ __dvd_reqinprogress = 1;
+
+ ctx = __dvd_getcontext(cb);
+ if(ctx==NULL) return IPC_ENOMEM;
+
+ cmd = ctx->cmd;
+ cmd->diReg[0] = (IOCTL_DI_SETOFFBASE<<24);
+ cmd->diReg[1] = offset;
+ ret = IOS_IoctlAsync(__dvd_fd,IOCTL_DI_SETOFFBASE,cmd->diReg,sizeof(struct dicommand),__di_regvalcache,0x20,__dvd_iostransactionCB,ctx);
+
+ return ret;
+
+}
diff --git a/source/patches/dvd_broadway.h b/source/patches/dvd_broadway.h
index b2c63e4a..c0ca133b 100644
--- a/source/patches/dvd_broadway.h
+++ b/source/patches/dvd_broadway.h
@@ -21,33 +21,33 @@
#ifndef __DVD_BROADWAY_H__
#define __DVD_BROADWAY_H__
-
+
#include
#include
#include
+
+#ifdef __cplusplus
+ extern "C" {
+#endif /* __cplusplus */
+
+typedef void (*dvdcallbacklow)(s32 result);
+
+s32 bwDVD_LowInit();
+s32 bwDVD_LowInquiry(dvddrvinfo *info,dvdcallbacklow cb);
+s32 bwDVD_LowReadID(dvddiskid *diskID,dvdcallbacklow cb);
+s32 bwDVD_LowClosePartition(dvdcallbacklow cb);
+s32 bwDVD_LowOpenPartition(u32 offset,void *eticket,u32 certin_len,void *certificate_in,void *certificate_out,dvdcallbacklow cb);
+s32 bwDVD_LowUnencryptedRead(void *buf,u32 len,u32 offset,dvdcallbacklow cb);
+s32 bwDVD_LowReset(dvdcallbacklow cb);
+s32 bwDVD_LowWaitCoverClose(dvdcallbacklow cb);
+s32 bwDVD_LowRead(void *buf,u32 len,u32 offset,dvdcallbacklow cb);
+s32 bwDVD_EnableVideo(dvdcallbacklow cb);
+s32 bwDVD_LowReadVideo(void *buf,u32 len,u32 offset,dvdcallbacklow cb);
+s32 bwDVD_SetDecryption(s32 mode, dvdcallbacklow cb);
+s32 bwDVD_SetOffset(u32 offset, dvdcallbacklow cb);
#ifdef __cplusplus
-extern "C" {
+ }
#endif /* __cplusplus */
-
- typedef void (*dvdcallbacklow)(s32 result);
-
- s32 bwDVD_LowInit();
- s32 bwDVD_LowInquiry(dvddrvinfo *info,dvdcallbacklow cb);
- s32 bwDVD_LowReadID(dvddiskid *diskID,dvdcallbacklow cb);
- s32 bwDVD_LowClosePartition(dvdcallbacklow cb);
- s32 bwDVD_LowOpenPartition(u32 offset,void *eticket,u32 certin_len,void *certificate_in,void *certificate_out,dvdcallbacklow cb);
- s32 bwDVD_LowUnencryptedRead(void *buf,u32 len,u32 offset,dvdcallbacklow cb);
- s32 bwDVD_LowReset(dvdcallbacklow cb);
- s32 bwDVD_LowWaitCoverClose(dvdcallbacklow cb);
- s32 bwDVD_LowRead(void *buf,u32 len,u32 offset,dvdcallbacklow cb);
- s32 bwDVD_EnableVideo(dvdcallbacklow cb);
- s32 bwDVD_LowReadVideo(void *buf,u32 len,u32 offset,dvdcallbacklow cb);
- s32 bwDVD_SetDecryption(s32 mode, dvdcallbacklow cb);
- s32 bwDVD_SetOffset(u32 offset, dvdcallbacklow cb);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
+
#endif
diff --git a/source/patches/fst.c b/source/patches/fst.c
index 211414c4..4fd76839 100644
--- a/source/patches/fst.c
+++ b/source/patches/fst.c
@@ -1,98 +1,99 @@
-/*
- * Copyright (C) 2008 Nuke (wiinuke@gmail.com)
- *
- * this file is part of GeckoOS for USB Gecko
- * http://www.usbgecko.com
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include "settings/cfg.h"
-#include "fst.h"
-#include "dvd_broadway.h"
-#include "wpad.h"
-#include "fatmounter.h"
-
-extern struct SSettings Settings;
-
-u32 do_sd_code(char *filename) {
- FILE *fp;
- u8 *filebuff;
- u32 filesize;
- u32 ret;
- char filepath[150];
-
- SDCard_Init();
- USBDevice_Init();
-
- sprintf(filepath, "%s%s", Settings.Cheatcodespath, filename);
- filepath[strlen(Settings.Cheatcodespath)+6] = 0x2E;
- filepath[strlen(Settings.Cheatcodespath)+7] = 0x67;
- filepath[strlen(Settings.Cheatcodespath)+8] = 0x63;
- filepath[strlen(Settings.Cheatcodespath)+9] = 0x74;
- filepath[strlen(Settings.Cheatcodespath)+10] = 0;
-
- fp = fopen(filepath, "rb");
- if (!fp) {
- USBDevice_deInit();
- SDCard_deInit();
- return 0;
- }
-
- fseek(fp, 0, SEEK_END);
- filesize = ftell(fp);
- fseek(fp, 0, SEEK_SET);
-
- filebuff = (u8*) malloc (filesize);
- if (filebuff == 0) {
- fclose(fp);
- sleep(2);
- USBDevice_deInit();
- SDCard_deInit();
- return 0;
- }
-
- ret = fread(filebuff, 1, filesize, fp);
- if (ret != filesize) {
- free(filebuff);
- fclose(fp);
- USBDevice_deInit();
- SDCard_deInit();
- return 0;
- }
-
- memcpy((void*)0x800027E8,filebuff,filesize);
- *(vu8*)0x80001807 = 0x01;
-
- free(filebuff);
- fclose(fp);
-
- USBDevice_deInit();
- SDCard_deInit();
-
- return 1;
-}
-
-
+/*
+ * Copyright (C) 2008 Nuke (wiinuke@gmail.com)
+ *
+ * this file is part of GeckoOS for USB Gecko
+ * http://www.usbgecko.com
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "settings/cfg.h"
+#include "fst.h"
+#include "dvd_broadway.h"
+#include "wpad.h"
+#include "fatmounter.h"
+
+extern struct SSettings Settings;
+
+u32 do_sd_code(char *filename)
+{
+ FILE *fp;
+ u8 *filebuff;
+ u32 filesize;
+ u32 ret;
+ char filepath[150];
+
+ SDCard_Init();
+ USBDevice_Init();
+
+ sprintf(filepath, "%s%s", Settings.Cheatcodespath, filename);
+ filepath[strlen(Settings.Cheatcodespath)+6] = 0x2E;
+ filepath[strlen(Settings.Cheatcodespath)+7] = 0x67;
+ filepath[strlen(Settings.Cheatcodespath)+8] = 0x63;
+ filepath[strlen(Settings.Cheatcodespath)+9] = 0x74;
+ filepath[strlen(Settings.Cheatcodespath)+10] = 0;
+
+ fp = fopen(filepath, "rb");
+ if (!fp) {
+ USBDevice_deInit();
+ SDCard_deInit();
+ return 0;
+ }
+
+ fseek(fp, 0, SEEK_END);
+ filesize = ftell(fp);
+ fseek(fp, 0, SEEK_SET);
+
+ filebuff = (u8*) malloc (filesize);
+ if(filebuff == 0){
+ fclose(fp);
+ sleep(2);
+ USBDevice_deInit();
+ SDCard_deInit();
+ return 0;
+ }
+
+ ret = fread(filebuff, 1, filesize, fp);
+ if(ret != filesize){
+ free(filebuff);
+ fclose(fp);
+ USBDevice_deInit();
+ SDCard_deInit();
+ return 0;
+ }
+
+ memcpy((void*)0x800027E8,filebuff,filesize);
+ *(vu8*)0x80001807 = 0x01;
+
+ free(filebuff);
+ fclose(fp);
+
+ USBDevice_deInit();
+ SDCard_deInit();
+
+ return 1;
+}
+
+
diff --git a/source/patches/fst.h b/source/patches/fst.h
index 66252053..ccd855e0 100644
--- a/source/patches/fst.h
+++ b/source/patches/fst.h
@@ -23,11 +23,12 @@
#define __FST_H__
#ifdef __cplusplus
-extern "C" {
+extern "C"
+{
#endif
//u32 do_fst(u32 fstlocation);
- u32 do_sd_code(char *filename);
+u32 do_sd_code(char *filename);
#ifdef __cplusplus
}
diff --git a/source/patches/fwrite_patch.h b/source/patches/fwrite_patch.h
index bd47ce44..54fedcc4 100644
--- a/source/patches/fwrite_patch.h
+++ b/source/patches/fwrite_patch.h
@@ -1,15 +1,15 @@
unsigned char fwrite_patch_bin[] = {
- 0x7c, 0x84, 0x29, 0xd6, 0x39, 0x40, 0x00, 0x00, 0x94, 0x21, 0xff, 0xf0,
- 0x93, 0xe1, 0x00, 0x0c, 0x7f, 0x8a, 0x20, 0x00, 0x40, 0x9c, 0x00, 0x64,
- 0x3d, 0x00, 0xcd, 0x00, 0x3d, 0x60, 0xcd, 0x00, 0x3d, 0x20, 0xcd, 0x00,
- 0x61, 0x08, 0x68, 0x14, 0x61, 0x6b, 0x68, 0x24, 0x61, 0x29, 0x68, 0x20,
- 0x39, 0x80, 0x00, 0xd0, 0x38, 0xc0, 0x00, 0x19, 0x38, 0xe0, 0x00, 0x00,
- 0x91, 0x88, 0x00, 0x00, 0x7c, 0x03, 0x50, 0xae, 0x54, 0x00, 0xa0, 0x16,
- 0x64, 0x00, 0xb0, 0x00, 0x90, 0x0b, 0x00, 0x00, 0x90, 0xc9, 0x00, 0x00,
- 0x80, 0x09, 0x00, 0x00, 0x70, 0x1f, 0x00, 0x01, 0x40, 0x82, 0xff, 0xf8,
- 0x80, 0x0b, 0x00, 0x00, 0x90, 0xe8, 0x00, 0x00, 0x54, 0x00, 0x37, 0xfe,
- 0x7d, 0x4a, 0x02, 0x14, 0x7f, 0x8a, 0x20, 0x00, 0x41, 0x9c, 0xff, 0xc8,
- 0x7c, 0xa3, 0x2b, 0x78, 0x83, 0xe1, 0x00, 0x0c, 0x38, 0x21, 0x00, 0x10,
- 0x4e, 0x80, 0x00, 0x20
+ 0x7c, 0x84, 0x29, 0xd6, 0x39, 0x40, 0x00, 0x00, 0x94, 0x21, 0xff, 0xf0,
+ 0x93, 0xe1, 0x00, 0x0c, 0x7f, 0x8a, 0x20, 0x00, 0x40, 0x9c, 0x00, 0x64,
+ 0x3d, 0x00, 0xcd, 0x00, 0x3d, 0x60, 0xcd, 0x00, 0x3d, 0x20, 0xcd, 0x00,
+ 0x61, 0x08, 0x68, 0x14, 0x61, 0x6b, 0x68, 0x24, 0x61, 0x29, 0x68, 0x20,
+ 0x39, 0x80, 0x00, 0xd0, 0x38, 0xc0, 0x00, 0x19, 0x38, 0xe0, 0x00, 0x00,
+ 0x91, 0x88, 0x00, 0x00, 0x7c, 0x03, 0x50, 0xae, 0x54, 0x00, 0xa0, 0x16,
+ 0x64, 0x00, 0xb0, 0x00, 0x90, 0x0b, 0x00, 0x00, 0x90, 0xc9, 0x00, 0x00,
+ 0x80, 0x09, 0x00, 0x00, 0x70, 0x1f, 0x00, 0x01, 0x40, 0x82, 0xff, 0xf8,
+ 0x80, 0x0b, 0x00, 0x00, 0x90, 0xe8, 0x00, 0x00, 0x54, 0x00, 0x37, 0xfe,
+ 0x7d, 0x4a, 0x02, 0x14, 0x7f, 0x8a, 0x20, 0x00, 0x41, 0x9c, 0xff, 0xc8,
+ 0x7c, 0xa3, 0x2b, 0x78, 0x83, 0xe1, 0x00, 0x0c, 0x38, 0x21, 0x00, 0x10,
+ 0x4e, 0x80, 0x00, 0x20
};
unsigned int fwrite_patch_bin_len = 136;
diff --git a/source/patches/kenobiwii.h b/source/patches/kenobiwii.h
index 0bf9557c..bc3d0ed1 100644
--- a/source/patches/kenobiwii.h
+++ b/source/patches/kenobiwii.h
@@ -4,261 +4,261 @@ Visit http://www.devkitpro.org
*/
const unsigned char kenobiwii[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x26, 0xa0, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x21, 0xff, 0x58, 0x90, 0x01, 0x00, 0x08,
- 0x7c, 0x08, 0x02, 0xa6, 0x90, 0x01, 0x00, 0xac, 0x7c, 0x00, 0x00, 0x26, 0x90, 0x01, 0x00, 0x0c,
- 0x7c, 0x09, 0x02, 0xa6, 0x90, 0x01, 0x00, 0x10, 0x7c, 0x01, 0x02, 0xa6, 0x90, 0x01, 0x00, 0x14,
- 0xbc, 0x61, 0x00, 0x18, 0x7f, 0x20, 0x00, 0xa6, 0x63, 0x3a, 0x20, 0x00, 0x73, 0x5a, 0xf9, 0xff,
- 0x7f, 0x40, 0x01, 0x24, 0xd8, 0x41, 0x00, 0x98, 0xd8, 0x61, 0x00, 0xa0, 0x3f, 0xe0, 0x80, 0x00,
- 0x3e, 0x80, 0xcc, 0x00, 0xa3, 0x94, 0x40, 0x10, 0x63, 0x95, 0x00, 0xff, 0xb2, 0xb4, 0x40, 0x10,
- 0x48, 0x00, 0x06, 0xb1, 0x3a, 0xa0, 0x00, 0x00, 0x3a, 0xc0, 0x00, 0x19, 0x3a, 0xe0, 0x00, 0xd0,
- 0x3f, 0x00, 0xcd, 0x00, 0x63, 0xf2, 0x26, 0xa0, 0x80, 0x01, 0x00, 0xac, 0x90, 0x12, 0x00, 0x04,
- 0x92, 0xb8, 0x64, 0x3c, 0x48, 0x00, 0x04, 0x85, 0x41, 0x82, 0x05, 0xfc, 0x2c, 0x1d, 0x00, 0x04,
- 0x40, 0x80, 0x00, 0x10, 0x2c, 0x1d, 0x00, 0x01, 0x41, 0x80, 0x05, 0xec, 0x48, 0x00, 0x03, 0xa8,
- 0x41, 0x82, 0x05, 0x48, 0x2c, 0x1d, 0x00, 0x06, 0x41, 0x82, 0x00, 0x8c, 0x2c, 0x1d, 0x00, 0x07,
- 0x41, 0x82, 0x03, 0x8c, 0x2c, 0x1d, 0x00, 0x08, 0x41, 0x82, 0x05, 0xd8, 0x2c, 0x1d, 0x00, 0x09,
- 0x41, 0x82, 0x00, 0xa0, 0x2c, 0x1d, 0x00, 0x10, 0x41, 0x82, 0x00, 0x98, 0x2c, 0x1d, 0x00, 0x2f,
- 0x41, 0x82, 0x00, 0x70, 0x2c, 0x1d, 0x00, 0x30, 0x41, 0x82, 0x00, 0x78, 0x2c, 0x1d, 0x00, 0x38,
- 0x41, 0x82, 0x05, 0x80, 0x2c, 0x1d, 0x00, 0x40, 0x41, 0x82, 0x03, 0x9c, 0x2c, 0x1d, 0x00, 0x41,
- 0x41, 0x82, 0x03, 0xb0, 0x2c, 0x1d, 0x00, 0x44, 0x41, 0x82, 0x00, 0x68, 0x2c, 0x1d, 0x00, 0x50,
- 0x41, 0x82, 0x00, 0x20, 0x2c, 0x1d, 0x00, 0x60, 0x41, 0x82, 0x00, 0x24, 0x2c, 0x1d, 0x00, 0x89,
- 0x41, 0x82, 0x00, 0x50, 0x2c, 0x1d, 0x00, 0x99, 0x41, 0x82, 0x05, 0x64, 0x48, 0x00, 0x05, 0x68,
- 0x80, 0x72, 0x00, 0x00, 0x48, 0x00, 0x04, 0x81, 0x48, 0x00, 0x05, 0x5c, 0x48, 0x00, 0x05, 0xe5,
- 0x48, 0x00, 0x05, 0x54, 0x38, 0x80, 0x00, 0x01, 0x90, 0x92, 0x00, 0x00, 0x48, 0x00, 0x05, 0x48,
- 0x48, 0x00, 0x04, 0x61, 0x3a, 0x00, 0x00, 0xa0, 0x63, 0xec, 0x26, 0xc4, 0x48, 0x00, 0x03, 0x6c,
- 0x38, 0x60, 0x01, 0x20, 0x63, 0xec, 0x26, 0xc4, 0x48, 0x00, 0x04, 0x21, 0x48, 0x00, 0x05, 0x28,
- 0x2f, 0x1d, 0x00, 0x10, 0x2e, 0x9d, 0x00, 0x44, 0x63, 0xe4, 0x1a, 0xb4, 0x3c, 0x60, 0x80, 0x00,
- 0x60, 0x63, 0x03, 0x00, 0x48, 0x00, 0x05, 0x65, 0x38, 0x63, 0x0a, 0x00, 0x48, 0x00, 0x05, 0x5d,
- 0x38, 0x63, 0x06, 0x00, 0x48, 0x00, 0x05, 0x55, 0x63, 0xec, 0x26, 0xb4, 0x92, 0xac, 0x00, 0x00,
- 0x92, 0xac, 0x00, 0x04, 0x92, 0xac, 0x00, 0x08, 0x63, 0xe4, 0x26, 0xc4, 0x81, 0x24, 0x00, 0x18,
- 0x80, 0x72, 0x00, 0x00, 0x2c, 0x03, 0x00, 0x02, 0x40, 0x82, 0x00, 0x0c, 0x41, 0x96, 0x00, 0x0c,
- 0x48, 0x00, 0x00, 0x20, 0x38, 0x60, 0x00, 0x00, 0x90, 0x6c, 0x00, 0x0c, 0x40, 0x82, 0x00, 0x14,
- 0x40, 0x96, 0x00, 0x10, 0x61, 0x29, 0x04, 0x00, 0x91, 0x24, 0x00, 0x18, 0x48, 0x00, 0x02, 0x70,
- 0x55, 0x29, 0x05, 0xa8, 0x91, 0x24, 0x00, 0x18, 0x41, 0x96, 0x04, 0xac, 0x41, 0x9a, 0x00, 0x08,
- 0x39, 0x8c, 0x00, 0x04, 0x38, 0x60, 0x00, 0x04, 0x48, 0x00, 0x03, 0x61, 0x40, 0x99, 0x00, 0x10,
- 0x39, 0x8c, 0x00, 0x04, 0x38, 0x60, 0x00, 0x04, 0x48, 0x00, 0x03, 0x51, 0x63, 0xe4, 0x26, 0xb4,
- 0x80, 0x64, 0x00, 0x00, 0x80, 0x84, 0x00, 0x04, 0x7c, 0x72, 0xfb, 0xa6, 0x7c, 0x95, 0xfb, 0xa6,
- 0x48, 0x00, 0x04, 0x74, 0x7c, 0x32, 0x43, 0xa6, 0x7c, 0x3a, 0x02, 0xa6, 0x7c, 0x73, 0x43, 0xa6,
- 0x7c, 0x7b, 0x02, 0xa6, 0x54, 0x63, 0x05, 0xa8, 0x90, 0x60, 0x26, 0xdc, 0x54, 0x63, 0x06, 0x20,
- 0x60, 0x63, 0x20, 0x00, 0x54, 0x63, 0x04, 0x5e, 0x7c, 0x7b, 0x03, 0xa6, 0x3c, 0x60, 0x80, 0x00,
- 0x60, 0x63, 0x1a, 0xf4, 0x7c, 0x7a, 0x03, 0xa6, 0x4c, 0x00, 0x01, 0x2c, 0x7c, 0x00, 0x04, 0xac,
- 0x4c, 0x00, 0x00, 0x64, 0x3c, 0x60, 0x80, 0x00, 0x60, 0x63, 0x26, 0xc4, 0x90, 0x23, 0x00, 0x14,
- 0x7c, 0x61, 0x1b, 0x78, 0x7c, 0x73, 0x42, 0xa6, 0xbc, 0x41, 0x00, 0x24, 0x7c, 0x24, 0x0b, 0x78,
- 0x7c, 0x32, 0x42, 0xa6, 0x90, 0x04, 0x00, 0x1c, 0x90, 0x24, 0x00, 0x20, 0x7c, 0x68, 0x02, 0xa6,
- 0x90, 0x64, 0x00, 0x9c, 0x7c, 0x60, 0x00, 0x26, 0x90, 0x64, 0x00, 0x00, 0x7c, 0x61, 0x02, 0xa6,
- 0x90, 0x64, 0x00, 0x04, 0x7c, 0x69, 0x02, 0xa6, 0x90, 0x64, 0x00, 0x08, 0x7c, 0x72, 0x02, 0xa6,
- 0x90, 0x64, 0x00, 0x0c, 0x7c, 0x73, 0x02, 0xa6, 0x90, 0x64, 0x00, 0x10, 0x39, 0x20, 0x00, 0x00,
- 0x7d, 0x32, 0xfb, 0xa6, 0x7d, 0x35, 0xfb, 0xa6, 0xd0, 0x04, 0x00, 0xa0, 0xd0, 0x24, 0x00, 0xa4,
- 0xd0, 0x44, 0x00, 0xa8, 0xd0, 0x64, 0x00, 0xac, 0xd0, 0x84, 0x00, 0xb0, 0xd0, 0xa4, 0x00, 0xb4,
- 0xd0, 0xc4, 0x00, 0xb8, 0xd0, 0xe4, 0x00, 0xbc, 0xd1, 0x04, 0x00, 0xc0, 0xd1, 0x24, 0x00, 0xc4,
- 0xd1, 0x44, 0x00, 0xc8, 0xd1, 0x64, 0x00, 0xcc, 0xd1, 0x84, 0x00, 0xd0, 0xd1, 0xa4, 0x00, 0xd4,
- 0xd1, 0xc4, 0x00, 0xd8, 0xd1, 0xe4, 0x00, 0xdc, 0xd2, 0x04, 0x00, 0xe0, 0xd2, 0x24, 0x00, 0xe4,
- 0xd2, 0x44, 0x00, 0xe8, 0xd2, 0x64, 0x00, 0xec, 0xd2, 0x84, 0x00, 0xf0, 0xd2, 0xa4, 0x00, 0xf4,
- 0xd2, 0xc4, 0x00, 0xf8, 0xd2, 0xe4, 0x00, 0xfc, 0xd3, 0x04, 0x01, 0x00, 0xd3, 0x24, 0x01, 0x04,
- 0xd3, 0x44, 0x01, 0x08, 0xd3, 0x64, 0x01, 0x0c, 0xd3, 0x84, 0x01, 0x10, 0xd3, 0xa4, 0x01, 0x14,
- 0xd3, 0xc4, 0x01, 0x18, 0xd3, 0xe4, 0x01, 0x1c, 0x3f, 0xe0, 0x80, 0x00, 0x63, 0xe5, 0x26, 0xb4,
- 0x82, 0x05, 0x00, 0x00, 0x82, 0x25, 0x00, 0x04, 0x82, 0x65, 0x00, 0x0c, 0x2c, 0x13, 0x00, 0x00,
- 0x41, 0x82, 0x00, 0x74, 0x2c, 0x13, 0x00, 0x02, 0x40, 0x82, 0x00, 0x18, 0x81, 0x24, 0x00, 0x14,
- 0x39, 0x33, 0x00, 0x03, 0x91, 0x25, 0x00, 0x00, 0x91, 0x25, 0x00, 0x0c, 0x48, 0x00, 0x00, 0x6c,
- 0x7c, 0x10, 0x98, 0x00, 0x41, 0x82, 0x00, 0x38, 0x7c, 0x11, 0x98, 0x00, 0x41, 0x82, 0x00, 0x30,
- 0x7d, 0x30, 0x8a, 0x14, 0x91, 0x25, 0x00, 0x0c, 0x82, 0x05, 0x00, 0x08, 0x2c, 0x10, 0x00, 0x00,
- 0x41, 0x82, 0x00, 0x48, 0x80, 0x64, 0x00, 0x10, 0x7c, 0x10, 0x18, 0x00, 0x40, 0x82, 0x00, 0x10,
- 0x3a, 0x00, 0x00, 0x00, 0x92, 0x05, 0x00, 0x08, 0x48, 0x00, 0x00, 0x30, 0x3a, 0x20, 0x00, 0x00,
- 0x92, 0x25, 0x00, 0x0c, 0x81, 0x24, 0x00, 0x18, 0x61, 0x29, 0x04, 0x00, 0x91, 0x24, 0x00, 0x18,
- 0x48, 0x00, 0x00, 0x30, 0x7e, 0x12, 0xfb, 0xa6, 0x7e, 0x35, 0xfb, 0xa6, 0x39, 0x20, 0x00, 0x01,
- 0x91, 0x25, 0x00, 0x0c, 0x48, 0x00, 0x00, 0x1c, 0x38, 0xa0, 0x00, 0x02, 0x63, 0xe4, 0x26, 0xa0,
- 0x90, 0xa4, 0x00, 0x00, 0x38, 0x60, 0x00, 0x11, 0x48, 0x00, 0x01, 0xbd, 0x4b, 0xff, 0xfc, 0x1d,
- 0x7c, 0x20, 0x00, 0xa6, 0x54, 0x21, 0x07, 0xfa, 0x54, 0x21, 0x04, 0x5e, 0x7c, 0x20, 0x01, 0x24,
- 0x63, 0xe1, 0x26, 0xc4, 0x80, 0x61, 0x00, 0x00, 0x7c, 0x6f, 0xf1, 0x20, 0x80, 0x61, 0x00, 0x14,
- 0x7c, 0x7a, 0x03, 0xa6, 0x80, 0x61, 0x00, 0x18, 0x7c, 0x7b, 0x03, 0xa6, 0x80, 0x61, 0x00, 0x9c,
- 0x7c, 0x68, 0x03, 0xa6, 0xb8, 0x41, 0x00, 0x24, 0x80, 0x01, 0x00, 0x1c, 0x80, 0x21, 0x00, 0x20,
- 0x4c, 0x00, 0x01, 0x2c, 0x7c, 0x00, 0x04, 0xac, 0x4c, 0x00, 0x00, 0x64, 0x92, 0xb2, 0x00, 0x00,
- 0x48, 0x00, 0x02, 0x50, 0x2e, 0x9d, 0x00, 0x02, 0x38, 0x60, 0x00, 0x08, 0x63, 0xec, 0x26, 0xa8,
- 0x48, 0x00, 0x00, 0xf9, 0x80, 0xac, 0x00, 0x00, 0x80, 0x6c, 0x00, 0x04, 0x98, 0x65, 0x00, 0x00,
- 0x41, 0x94, 0x00, 0x10, 0xb0, 0x65, 0x00, 0x00, 0x41, 0x96, 0x00, 0x08, 0x90, 0x65, 0x00, 0x00,
- 0x7c, 0x00, 0x28, 0xac, 0x7c, 0x00, 0x04, 0xac, 0x7c, 0x00, 0x2f, 0xac, 0x4c, 0x00, 0x01, 0x2c,
- 0x48, 0x00, 0x02, 0x04, 0x48, 0x00, 0x01, 0x1d, 0x38, 0x60, 0x00, 0x04, 0x63, 0xec, 0x26, 0xa8,
- 0x48, 0x00, 0x00, 0xb9, 0x82, 0x0c, 0x00, 0x00, 0x63, 0xec, 0x27, 0xe8, 0x48, 0x00, 0x00, 0x1c,
- 0x48, 0x00, 0x01, 0x01, 0x38, 0x60, 0x00, 0x08, 0x63, 0xec, 0x26, 0xa8, 0x48, 0x00, 0x00, 0x9d,
- 0x82, 0x0c, 0x00, 0x04, 0x81, 0x8c, 0x00, 0x00, 0x63, 0xfb, 0x26, 0xb0, 0x3a, 0x20, 0x0f, 0x80,
- 0x48, 0x00, 0x02, 0x3d, 0x41, 0x82, 0x00, 0x20, 0x7e, 0x23, 0x8b, 0x78, 0x48, 0x00, 0x00, 0x7d,
- 0x48, 0x00, 0x00, 0xd1, 0x41, 0x82, 0xff, 0xfc, 0x7d, 0x8c, 0x72, 0x14, 0x35, 0x6b, 0xff, 0xff,
- 0x41, 0x81, 0xff, 0xe8, 0x80, 0x7b, 0x00, 0x00, 0x2c, 0x03, 0x00, 0x00, 0x41, 0x82, 0x00, 0x08,
- 0x48, 0x00, 0x00, 0x59, 0x7c, 0x00, 0x60, 0xac, 0x7c, 0x00, 0x04, 0xac, 0x7c, 0x00, 0x67, 0xac,
- 0x4c, 0x00, 0x01, 0x2c, 0x48, 0x00, 0x01, 0x80, 0x7f, 0xc8, 0x02, 0xa6, 0x3c, 0x60, 0xa0, 0x00,
- 0x48, 0x00, 0x00, 0x15, 0x76, 0x03, 0x08, 0x00, 0x56, 0x1d, 0x86, 0x3e, 0x7f, 0xc8, 0x03, 0xa6,
- 0x4e, 0x80, 0x00, 0x20, 0x92, 0xf8, 0x68, 0x14, 0x90, 0x78, 0x68, 0x24, 0x92, 0xd8, 0x68, 0x20,
- 0x80, 0xb8, 0x68, 0x20, 0x70, 0xa5, 0x00, 0x01, 0x40, 0x82, 0xff, 0xf8, 0x82, 0x18, 0x68, 0x24,
- 0x90, 0xb8, 0x68, 0x14, 0x4e, 0x80, 0x00, 0x20, 0x7d, 0x48, 0x02, 0xa6, 0x7c, 0x69, 0x03, 0xa6,
- 0x39, 0xc0, 0x00, 0x00, 0x48, 0x00, 0x00, 0x79, 0x48, 0x00, 0x00, 0x75, 0x4b, 0xff, 0xff, 0xad,
- 0x41, 0x82, 0xff, 0xf4, 0x7f, 0xae, 0x61, 0xae, 0x39, 0xce, 0x00, 0x01, 0x42, 0x00, 0xff, 0xe8,
- 0x7d, 0x48, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x20, 0x7d, 0x48, 0x02, 0xa6, 0x7c, 0x69, 0x03, 0xa6,
- 0x39, 0xc0, 0x00, 0x00, 0x7c, 0x6c, 0x70, 0xae, 0x48, 0x00, 0x00, 0x1d, 0x41, 0x82, 0xff, 0xf8,
- 0x39, 0xce, 0x00, 0x01, 0x42, 0x00, 0xff, 0xf0, 0x7d, 0x48, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x20,
- 0x38, 0x60, 0x00, 0xaa, 0x7f, 0xc8, 0x02, 0xa6, 0x54, 0x63, 0xa0, 0x16, 0x64, 0x63, 0xb0, 0x00,
- 0x3a, 0xc0, 0x00, 0x19, 0x3a, 0xe0, 0x00, 0xd0, 0x3f, 0x00, 0xcd, 0x00, 0x4b, 0xff, 0xff, 0x69,
- 0x56, 0x03, 0x37, 0xff, 0x7f, 0xc8, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x20, 0x7f, 0xc8, 0x02, 0xa6,
- 0x3c, 0x60, 0xd0, 0x00, 0x4b, 0xff, 0xff, 0x51, 0x56, 0x03, 0x37, 0xff, 0x41, 0x82, 0xff, 0xf4,
- 0x7f, 0xc8, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x20, 0x4b, 0xff, 0xff, 0xb9, 0x38, 0x60, 0x00, 0x08,
- 0x63, 0xec, 0x26, 0xa8, 0x4b, 0xff, 0xff, 0x55, 0x80, 0xac, 0x00, 0x04, 0x81, 0x8c, 0x00, 0x00,
- 0x63, 0xfb, 0x26, 0xb0, 0x62, 0xb1, 0xf8, 0x00, 0x7e, 0x0c, 0x28, 0x50, 0x48, 0x00, 0x00, 0xf1,
- 0x41, 0x81, 0x00, 0x10, 0x82, 0x3b, 0x00, 0x00, 0x2c, 0x11, 0x00, 0x00, 0x41, 0x82, 0x00, 0x68,
- 0x7e, 0x23, 0x8b, 0x78, 0x4b, 0xff, 0xff, 0x55, 0x4b, 0xff, 0xff, 0xa5, 0x4b, 0xff, 0xff, 0xa1,
- 0x4b, 0xff, 0xfe, 0xd9, 0x41, 0x82, 0xff, 0xf4, 0x2c, 0x1d, 0x00, 0xcc, 0x41, 0x82, 0x00, 0x48,
- 0x2c, 0x1d, 0x00, 0xbb, 0x41, 0x82, 0xff, 0xdc, 0x2c, 0x1d, 0x00, 0xaa, 0x40, 0x82, 0xff, 0xdc,
- 0x7d, 0x8c, 0x72, 0x14, 0x35, 0x6b, 0xff, 0xff, 0x41, 0x80, 0x00, 0x2c, 0x4b, 0xff, 0xff, 0xb4,
- 0x7e, 0xb5, 0xfb, 0xa6, 0x7e, 0xb2, 0xfb, 0xa6, 0x63, 0xe4, 0x26, 0xc4, 0x81, 0x24, 0x00, 0x18,
- 0x55, 0x29, 0x05, 0xa8, 0x91, 0x24, 0x00, 0x18, 0x48, 0x00, 0x00, 0x0c, 0x38, 0x60, 0x00, 0x80,
- 0x4b, 0xff, 0xff, 0x25, 0x80, 0x92, 0x00, 0x00, 0x2c, 0x04, 0x00, 0x00, 0x40, 0x82, 0xf9, 0xf8,
- 0xb3, 0x94, 0x40, 0x10, 0xc8, 0x41, 0x00, 0x98, 0xc8, 0x61, 0x00, 0xa0, 0x7f, 0x20, 0x00, 0xa6,
- 0x80, 0x01, 0x00, 0xac, 0x7c, 0x08, 0x03, 0xa6, 0x80, 0x01, 0x00, 0x0c, 0x7c, 0x0f, 0xf1, 0x20,
- 0x80, 0x01, 0x00, 0x10, 0x7c, 0x09, 0x03, 0xa6, 0x80, 0x01, 0x00, 0x14, 0x7c, 0x01, 0x03, 0xa6,
- 0xb8, 0x61, 0x00, 0x18, 0x80, 0x01, 0x00, 0x08, 0x38, 0x21, 0x00, 0xa8, 0x4c, 0x00, 0x01, 0x2c,
- 0x7c, 0x00, 0x04, 0xac, 0x4e, 0x80, 0x00, 0x20, 0x7e, 0x23, 0x20, 0x50, 0x3c, 0xa0, 0x48, 0x00,
- 0x52, 0x25, 0x01, 0xba, 0x90, 0xa3, 0x00, 0x00, 0x7c, 0x00, 0x18, 0xac, 0x7c, 0x00, 0x04, 0xac,
- 0x7c, 0x00, 0x1f, 0xac, 0x4c, 0x00, 0x01, 0x2c, 0x4e, 0x80, 0x00, 0x20, 0x7d, 0x70, 0x8b, 0xd7,
- 0x7d, 0x4b, 0x89, 0xd6, 0x7d, 0x4a, 0x80, 0x50, 0x91, 0x5b, 0x00, 0x00, 0x4e, 0x80, 0x00, 0x20,
- 0x7f, 0xa8, 0x02, 0xa6, 0x63, 0xef, 0x27, 0xe8, 0x63, 0xe7, 0x18, 0x08, 0x3c, 0xc0, 0x80, 0x00,
- 0x7c, 0xd0, 0x33, 0x78, 0x39, 0x00, 0x00, 0x00, 0x3c, 0x60, 0x00, 0xd0, 0x60, 0x63, 0xc0, 0xde,
- 0x80, 0x8f, 0x00, 0x00, 0x7c, 0x03, 0x20, 0x00, 0x40, 0x82, 0x00, 0x18, 0x80, 0x8f, 0x00, 0x04,
- 0x7c, 0x03, 0x20, 0x00, 0x40, 0x82, 0x00, 0x0c, 0x39, 0xef, 0x00, 0x08, 0x48, 0x00, 0x00, 0x0c,
- 0x7f, 0xa8, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x20, 0x80, 0x6f, 0x00, 0x00, 0x80, 0x8f, 0x00, 0x04,
- 0x39, 0xef, 0x00, 0x08, 0x71, 0x09, 0x00, 0x01, 0x2f, 0x89, 0x00, 0x00, 0x39, 0x20, 0x00, 0x00,
- 0x54, 0x6a, 0x1f, 0x7e, 0x54, 0x65, 0x3f, 0x7e, 0x74, 0x6b, 0x10, 0x00, 0x54, 0x63, 0x01, 0xfe,
- 0x40, 0x82, 0x00, 0x0c, 0x54, 0xcc, 0x00, 0x0c, 0x48, 0x00, 0x00, 0x08, 0x7e, 0x0c, 0x83, 0x78,
- 0x2e, 0x05, 0x00, 0x00, 0x2c, 0x0a, 0x00, 0x01, 0x41, 0xa0, 0x00, 0x2c, 0x41, 0xa2, 0x00, 0xe4,
- 0x2c, 0x0a, 0x00, 0x03, 0x41, 0xa0, 0x01, 0xb0, 0x41, 0x82, 0x02, 0x54, 0x2c, 0x0a, 0x00, 0x05,
- 0x41, 0x80, 0x02, 0xdc, 0x41, 0xa2, 0x04, 0xe8, 0x2c, 0x0a, 0x00, 0x07, 0x41, 0xa0, 0x05, 0x14,
- 0x48, 0x00, 0x05, 0xf8, 0x7d, 0x8c, 0x1a, 0x14, 0x2c, 0x05, 0x00, 0x03, 0x41, 0x82, 0x00, 0x48,
- 0x41, 0x81, 0x00, 0x60, 0x40, 0xbe, 0xff, 0x84, 0x2e, 0x05, 0x00, 0x01, 0x41, 0x91, 0x00, 0x2c,
- 0x54, 0x8a, 0x84, 0x3e, 0x41, 0x92, 0x00, 0x10, 0x7c, 0x89, 0x61, 0xae, 0x39, 0x29, 0x00, 0x01,
- 0x48, 0x00, 0x00, 0x0c, 0x7c, 0x89, 0x63, 0x2e, 0x39, 0x29, 0x00, 0x02, 0x35, 0x4a, 0xff, 0xff,
- 0x40, 0xa0, 0xff, 0xe4, 0x4b, 0xff, 0xff, 0x54, 0x55, 0x8c, 0x00, 0x3a, 0x90, 0x8c, 0x00, 0x00,
- 0x4b, 0xff, 0xff, 0x48, 0x7c, 0x89, 0x23, 0x78, 0x40, 0x9e, 0x04, 0xd0, 0x35, 0x29, 0xff, 0xff,
- 0x41, 0x80, 0x04, 0xc8, 0x7c, 0xa9, 0x78, 0xae, 0x7c, 0xa9, 0x61, 0xae, 0x4b, 0xff, 0xff, 0xf0,
- 0x39, 0xef, 0x00, 0x08, 0x40, 0xbe, 0xff, 0x24, 0x80, 0xaf, 0xff, 0xf8, 0x81, 0x6f, 0xff, 0xfc,
- 0x54, 0xb1, 0x04, 0x3e, 0x54, 0xaa, 0x85, 0x3e, 0x54, 0xa5, 0x27, 0x3e, 0x2e, 0x85, 0x00, 0x01,
- 0x41, 0x96, 0x00, 0x10, 0x41, 0xb5, 0x00, 0x14, 0x7c, 0x89, 0x61, 0xae, 0x48, 0x00, 0x00, 0x10,
- 0x7c, 0x89, 0x63, 0x2e, 0x48, 0x00, 0x00, 0x08, 0x7c, 0x89, 0x61, 0x2e, 0x7c, 0x84, 0x5a, 0x14,
- 0x7d, 0x29, 0x8a, 0x14, 0x35, 0x4a, 0xff, 0xff, 0x40, 0x80, 0xff, 0xd4, 0x4b, 0xff, 0xfe, 0xdc,
- 0x54, 0x69, 0x07, 0xff, 0x41, 0x82, 0x00, 0x10, 0x55, 0x08, 0xf8, 0x7e, 0x71, 0x09, 0x00, 0x01,
- 0x2f, 0x89, 0x00, 0x00, 0x2e, 0x85, 0x00, 0x04, 0x2d, 0x8a, 0x00, 0x05, 0x7d, 0x13, 0x43, 0x78,
- 0x52, 0x68, 0x08, 0x3c, 0x40, 0x9e, 0x00, 0x78, 0x41, 0x8d, 0x04, 0xbc, 0x7d, 0x8c, 0x1a, 0x14,
- 0x41, 0x8c, 0x00, 0x0c, 0x41, 0x94, 0x00, 0x30, 0x48, 0x00, 0x00, 0x1c, 0x40, 0x94, 0x00, 0x10,
- 0x55, 0x8c, 0x00, 0x3a, 0x81, 0x6c, 0x00, 0x00, 0x48, 0x00, 0x00, 0x1c, 0x55, 0x8c, 0x00, 0x3c,
- 0xa1, 0x6c, 0x00, 0x00, 0x7c, 0x89, 0x20, 0xf8, 0x55, 0x29, 0x84, 0x3e, 0x7d, 0x6b, 0x48, 0x38,
- 0x54, 0x84, 0x04, 0x3e, 0x7f, 0x0b, 0x20, 0x40, 0x70, 0xa9, 0x00, 0x03, 0x41, 0x82, 0x00, 0x18,
- 0x2c, 0x09, 0x00, 0x02, 0x41, 0x82, 0x00, 0x18, 0x41, 0x81, 0x00, 0x1c, 0x40, 0x9a, 0x00, 0x20,
- 0x48, 0x00, 0x00, 0x18, 0x41, 0x9a, 0x00, 0x18, 0x48, 0x00, 0x00, 0x10, 0x41, 0x99, 0x00, 0x10,
- 0x48, 0x00, 0x00, 0x08, 0x41, 0x98, 0x00, 0x08, 0x61, 0x08, 0x00, 0x01, 0x40, 0x8e, 0xfe, 0x3c,
- 0x41, 0x94, 0xfe, 0x38, 0x81, 0x6f, 0xff, 0xf8, 0x40, 0x9e, 0x00, 0x20, 0x70, 0x6c, 0x00, 0x08,
- 0x41, 0x82, 0x00, 0x0c, 0x71, 0x0c, 0x00, 0x01, 0x41, 0x82, 0x00, 0x10, 0x39, 0x8b, 0x00, 0x10,
- 0x51, 0x8b, 0x03, 0x36, 0x48, 0x00, 0x00, 0x08, 0x55, 0x6b, 0x07, 0x16, 0x91, 0x6f, 0xff, 0xf8,
- 0x4b, 0xff, 0xfe, 0x08, 0x40, 0xbe, 0xfe, 0x04, 0x54, 0x69, 0x16, 0xba, 0x54, 0x6e, 0x87, 0xfe,
- 0x2d, 0x8e, 0x00, 0x00, 0x2e, 0x05, 0x00, 0x04, 0x70, 0xae, 0x00, 0x03, 0x2e, 0x8e, 0x00, 0x02,
- 0x41, 0x94, 0x00, 0x14, 0x41, 0x96, 0x00, 0x50, 0x7c, 0x64, 0x07, 0x34, 0x7c, 0x84, 0x7a, 0x14,
- 0x48, 0x00, 0x00, 0x68, 0x54, 0x65, 0xa7, 0xff, 0x41, 0x82, 0x00, 0x0c, 0x7d, 0x27, 0x48, 0x2e,
- 0x7c, 0x84, 0x4a, 0x14, 0x41, 0x8e, 0x00, 0x08, 0x7c, 0x8c, 0x22, 0x14, 0x2e, 0x8e, 0x00, 0x01,
- 0x41, 0x96, 0x00, 0x08, 0x80, 0x84, 0x00, 0x00, 0x54, 0x63, 0x67, 0xff, 0x41, 0x82, 0x00, 0x3c,
- 0x40, 0x90, 0x00, 0x0c, 0x7c, 0x84, 0x32, 0x14, 0x48, 0x00, 0x00, 0x30, 0x7c, 0x84, 0x82, 0x14,
- 0x48, 0x00, 0x00, 0x28, 0x54, 0x65, 0xa7, 0xff, 0x41, 0x82, 0x00, 0x0c, 0x7d, 0x27, 0x48, 0x2e,
- 0x7c, 0x84, 0x4a, 0x14, 0x40, 0x90, 0x00, 0x0c, 0x7c, 0xcc, 0x21, 0x2e, 0x4b, 0xff, 0xfd, 0x7c,
- 0x7e, 0x0c, 0x21, 0x2e, 0x4b, 0xff, 0xfd, 0x74, 0x40, 0x90, 0x00, 0x0c, 0x7c, 0x86, 0x23, 0x78,
- 0x4b, 0xff, 0xfd, 0x68, 0x7c, 0x90, 0x23, 0x78, 0x4b, 0xff, 0xfd, 0x60, 0x54, 0x89, 0x1e, 0x78,
- 0x39, 0x29, 0x00, 0x40, 0x2c, 0x05, 0x00, 0x02, 0x41, 0x80, 0x00, 0x4c, 0x54, 0x6b, 0x67, 0xbf,
- 0x2c, 0x0b, 0x00, 0x01, 0x41, 0x80, 0x00, 0x14, 0x41, 0x82, 0x00, 0x08, 0x48, 0x00, 0x00, 0x10,
- 0x41, 0xbe, 0xfd, 0x38, 0x48, 0x00, 0x00, 0x08, 0x40, 0xbe, 0xfd, 0x30, 0x2c, 0x05, 0x00, 0x03,
- 0x41, 0x81, 0x00, 0x10, 0x41, 0xa2, 0x00, 0x10, 0x7d, 0xe7, 0x48, 0x2e, 0x4b, 0xff, 0xfd, 0x1c,
- 0x7d, 0xe7, 0x49, 0x2e, 0x7c, 0x64, 0x07, 0x34, 0x54, 0x84, 0x1a, 0x78, 0x7d, 0xef, 0x22, 0x14,
- 0x4b, 0xff, 0xfd, 0x08, 0x40, 0xbe, 0xfd, 0x04, 0x7c, 0xa7, 0x4a, 0x14, 0x40, 0x92, 0x00, 0x14,
- 0x54, 0x64, 0x04, 0x3e, 0x91, 0xe5, 0x00, 0x00, 0x90, 0x85, 0x00, 0x04, 0x4b, 0xff, 0xfc, 0xec,
- 0x81, 0x25, 0x00, 0x04, 0x2c, 0x09, 0x00, 0x00, 0x41, 0xa2, 0xfc, 0xe0, 0x39, 0x29, 0xff, 0xff,
- 0x91, 0x25, 0x00, 0x04, 0x81, 0xe5, 0x00, 0x00, 0x4b, 0xff, 0xfc, 0xd0, 0x40, 0xbe, 0xfc, 0xcc,
- 0x54, 0x6b, 0x16, 0xba, 0x7f, 0x47, 0x5a, 0x14, 0x81, 0x3a, 0x00, 0x00, 0x54, 0x6e, 0x67, 0xbe,
- 0x41, 0x92, 0x00, 0x84, 0x2e, 0x05, 0x00, 0x05, 0x40, 0x90, 0x01, 0x74, 0x2e, 0x05, 0x00, 0x03,
- 0x40, 0x90, 0x00, 0x90, 0x2e, 0x05, 0x00, 0x01, 0x54, 0x65, 0x87, 0xff, 0x41, 0x82, 0x00, 0x08,
- 0x7c, 0x8c, 0x22, 0x14, 0x2f, 0x0e, 0x00, 0x01, 0x40, 0x92, 0x00, 0x24, 0x41, 0xb9, 0x00, 0x18,
- 0x41, 0x9a, 0x00, 0x0c, 0x88, 0x84, 0x00, 0x00, 0x48, 0x00, 0x00, 0xf8, 0xa0, 0x84, 0x00, 0x00,
- 0x48, 0x00, 0x00, 0xf0, 0x80, 0x84, 0x00, 0x00, 0x48, 0x00, 0x00, 0xe8, 0x54, 0x73, 0xe5, 0x3e,
- 0x41, 0xb9, 0x00, 0x20, 0x41, 0x9a, 0x00, 0x10, 0x99, 0x24, 0x00, 0x00, 0x38, 0x84, 0x00, 0x01,
- 0x48, 0x00, 0x00, 0x18, 0xb1, 0x24, 0x00, 0x00, 0x38, 0x84, 0x00, 0x02, 0x48, 0x00, 0x00, 0x0c,
- 0x91, 0x24, 0x00, 0x00, 0x38, 0x84, 0x00, 0x04, 0x36, 0x73, 0xff, 0xff, 0x40, 0x80, 0xff, 0xd4,
- 0x4b, 0xff, 0xfc, 0x38, 0x54, 0x65, 0x87, 0xff, 0x41, 0x82, 0x00, 0x08, 0x7c, 0x84, 0x62, 0x14,
- 0x71, 0xc5, 0x00, 0x01, 0x41, 0x82, 0x00, 0x9c, 0x7c, 0x84, 0x4a, 0x14, 0x48, 0x00, 0x00, 0x94,
- 0x54, 0x6a, 0x87, 0xbe, 0x54, 0x8e, 0x16, 0xba, 0x7e, 0x67, 0x72, 0x14, 0x40, 0x92, 0x00, 0x08,
- 0x3a, 0x6f, 0xff, 0xfc, 0x80, 0x9a, 0x00, 0x00, 0x81, 0x33, 0x00, 0x00, 0x71, 0x4b, 0x00, 0x01,
- 0x41, 0x82, 0x00, 0x08, 0x7c, 0x9a, 0x23, 0x78, 0x71, 0x4b, 0x00, 0x02, 0x41, 0x82, 0x00, 0x10,
- 0x7d, 0x33, 0x4b, 0x78, 0x40, 0xb2, 0x00, 0x08, 0x7e, 0x6c, 0x9a, 0x14, 0x54, 0x65, 0x67, 0x3f,
- 0x2c, 0x05, 0x00, 0x09, 0x40, 0x80, 0x00, 0x54, 0x48, 0x00, 0x00, 0x79, 0x7c, 0x89, 0x22, 0x14,
- 0x48, 0x00, 0x00, 0x40, 0x7c, 0x89, 0x21, 0xd6, 0x48, 0x00, 0x00, 0x38, 0x7d, 0x24, 0x23, 0x78,
- 0x48, 0x00, 0x00, 0x30, 0x7d, 0x24, 0x20, 0x38, 0x48, 0x00, 0x00, 0x28, 0x7d, 0x24, 0x22, 0x78,
- 0x48, 0x00, 0x00, 0x20, 0x7d, 0x24, 0x20, 0x30, 0x48, 0x00, 0x00, 0x18, 0x7d, 0x24, 0x24, 0x30,
- 0x48, 0x00, 0x00, 0x10, 0x5d, 0x24, 0x20, 0x3e, 0x48, 0x00, 0x00, 0x08, 0x7d, 0x24, 0x26, 0x30,
- 0x90, 0x9a, 0x00, 0x00, 0x4b, 0xff, 0xfb, 0x84, 0x2c, 0x05, 0x00, 0x0a, 0x41, 0x81, 0xfb, 0x7c,
- 0xc0, 0x5a, 0x00, 0x00, 0xc0, 0x73, 0x00, 0x00, 0x41, 0x82, 0x00, 0x0c, 0xec, 0x43, 0x10, 0x2a,
- 0x48, 0x00, 0x00, 0x08, 0xec, 0x43, 0x00, 0xb2, 0xd0, 0x5a, 0x00, 0x00, 0x4b, 0xff, 0xfb, 0x5c,
- 0x7d, 0x48, 0x02, 0xa6, 0x54, 0xa5, 0x1e, 0x78, 0x7d, 0x4a, 0x2a, 0x14, 0x80, 0x9a, 0x00, 0x00,
- 0x81, 0x33, 0x00, 0x00, 0x7d, 0x48, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x20, 0x40, 0xbe, 0xfb, 0x3c,
- 0x54, 0x69, 0xc0, 0x3e, 0x7d, 0x8e, 0x63, 0x78, 0x48, 0x00, 0x00, 0x35, 0x41, 0x92, 0x00, 0x0c,
- 0x7e, 0x31, 0x22, 0x14, 0x48, 0x00, 0x00, 0x08, 0x7d, 0x29, 0x22, 0x14, 0x54, 0x64, 0xc4, 0x3f,
- 0x38, 0xa0, 0x00, 0x00, 0x41, 0x82, 0xfb, 0x14, 0x7d, 0x45, 0x88, 0xae, 0x7d, 0x45, 0x49, 0xae,
- 0x38, 0xa5, 0x00, 0x01, 0x7c, 0x05, 0x20, 0x00, 0x4b, 0xff, 0xff, 0xec, 0x2e, 0x8a, 0x00, 0x04,
- 0x55, 0x31, 0x36, 0xba, 0x2c, 0x11, 0x00, 0x3c, 0x7e, 0x27, 0x88, 0x2e, 0x40, 0x82, 0x00, 0x08,
- 0x7d, 0xd1, 0x73, 0x78, 0x41, 0x96, 0x00, 0x08, 0xa2, 0x31, 0x00, 0x00, 0x55, 0x29, 0x56, 0xba,
- 0x2c, 0x09, 0x00, 0x3c, 0x7d, 0x27, 0x48, 0x2e, 0x40, 0x82, 0x00, 0x08, 0x7d, 0xc9, 0x73, 0x78,
- 0x41, 0x96, 0x00, 0x08, 0xa1, 0x29, 0x00, 0x00, 0x4e, 0x80, 0x00, 0x20, 0x2c, 0x05, 0x00, 0x04,
- 0x40, 0x80, 0x00, 0x28, 0x7c, 0x89, 0x23, 0x78, 0x7d, 0xc3, 0x62, 0x14, 0x55, 0xce, 0x00, 0x3c,
- 0x4b, 0xff, 0xff, 0xad, 0x7c, 0x84, 0x20, 0xf8, 0x54, 0x84, 0x04, 0x3e, 0x7d, 0x2b, 0x20, 0x38,
- 0x7e, 0x24, 0x20, 0x38, 0x4b, 0xff, 0xfb, 0xbc, 0x54, 0x6b, 0xe4, 0x3e, 0x4b, 0xff, 0xfb, 0xb4,
- 0x7c, 0x9a, 0x23, 0x78, 0x54, 0x84, 0x18, 0x38, 0x40, 0x92, 0x00, 0x20, 0x40, 0x9e, 0x00, 0x0c,
- 0x7d, 0xe8, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x21, 0x7d, 0xe4, 0x7a, 0x14, 0x39, 0xef, 0x00, 0x07,
- 0x55, 0xef, 0x00, 0x38, 0x4b, 0xff, 0xfa, 0x64, 0x2e, 0x05, 0x00, 0x03, 0x41, 0x91, 0x00, 0x5c,
- 0x3c, 0xa0, 0x48, 0x00, 0x7d, 0x83, 0x62, 0x14, 0x55, 0x8c, 0x00, 0x3a, 0x40, 0x92, 0x00, 0x20,
- 0x40, 0xbe, 0xfa, 0x48, 0x57, 0x44, 0x00, 0x3a, 0x7c, 0x8c, 0x20, 0x50, 0x50, 0x85, 0x01, 0xba,
- 0x50, 0x65, 0x07, 0xfe, 0x90, 0xac, 0x00, 0x00, 0x4b, 0xff, 0xfa, 0x30, 0x40, 0xbe, 0xff, 0xbc,
- 0x7d, 0x2c, 0x78, 0x50, 0x51, 0x25, 0x01, 0xba, 0x90, 0xac, 0x00, 0x00, 0x39, 0x8c, 0x00, 0x04,
- 0x7d, 0x6f, 0x22, 0x14, 0x39, 0x6b, 0xff, 0xfc, 0x7d, 0x2b, 0x60, 0x50, 0x51, 0x25, 0x01, 0xba,
- 0x90, 0xab, 0x00, 0x00, 0x4b, 0xff, 0xff, 0x94, 0x2e, 0x05, 0x00, 0x06, 0x41, 0x92, 0x00, 0x28,
- 0x4b, 0xff, 0xfb, 0x20, 0x55, 0x8c, 0x84, 0x3e, 0x57, 0x44, 0x84, 0x3e, 0x57, 0x5a, 0x04, 0x3e,
- 0x7c, 0x0c, 0x20, 0x00, 0x41, 0x80, 0xfb, 0xa4, 0x7c, 0x0c, 0xd0, 0x00, 0x40, 0x80, 0xfb, 0x9c,
- 0x4b, 0xff, 0xf9, 0xd8, 0x57, 0x45, 0xff, 0xfe, 0x68, 0xa5, 0x00, 0x01, 0x71, 0x03, 0x00, 0x01,
- 0x7c, 0x05, 0x18, 0x00, 0x41, 0x82, 0x00, 0x1c, 0x51, 0x1a, 0x0f, 0xbc, 0x6b, 0x5a, 0x00, 0x02,
- 0x57, 0x45, 0xff, 0xff, 0x41, 0x82, 0x00, 0x08, 0x6b, 0x5a, 0x00, 0x01, 0x93, 0x4f, 0xff, 0xfc,
- 0x53, 0x48, 0x07, 0xfe, 0x4b, 0xff, 0xf9, 0xa4, 0x2c, 0x0b, 0x00, 0x00, 0x40, 0x82, 0xf9, 0x94,
- 0x40, 0x92, 0x00, 0x0c, 0x39, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x14, 0x54, 0x69, 0x06, 0xff,
- 0x40, 0x82, 0x00, 0x08, 0x40, 0x9e, 0x00, 0x10, 0x54, 0x65, 0x67, 0xfe, 0x7d, 0x08, 0x4c, 0x30,
- 0x7d, 0x08, 0x2a, 0x78, 0x54, 0x85, 0x00, 0x1f, 0x41, 0x82, 0x00, 0x08, 0x7c, 0xa6, 0x2b, 0x78,
- 0x54, 0x85, 0x80, 0x1f, 0x41, 0x82, 0x00, 0x08, 0x7c, 0xb0, 0x2b, 0x78, 0x4b, 0xff, 0xf9, 0x5c,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x26, 0xa0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x21, 0xff, 0x58, 0x90, 0x01, 0x00, 0x08,
+ 0x7c, 0x08, 0x02, 0xa6, 0x90, 0x01, 0x00, 0xac, 0x7c, 0x00, 0x00, 0x26, 0x90, 0x01, 0x00, 0x0c,
+ 0x7c, 0x09, 0x02, 0xa6, 0x90, 0x01, 0x00, 0x10, 0x7c, 0x01, 0x02, 0xa6, 0x90, 0x01, 0x00, 0x14,
+ 0xbc, 0x61, 0x00, 0x18, 0x7f, 0x20, 0x00, 0xa6, 0x63, 0x3a, 0x20, 0x00, 0x73, 0x5a, 0xf9, 0xff,
+ 0x7f, 0x40, 0x01, 0x24, 0xd8, 0x41, 0x00, 0x98, 0xd8, 0x61, 0x00, 0xa0, 0x3f, 0xe0, 0x80, 0x00,
+ 0x3e, 0x80, 0xcc, 0x00, 0xa3, 0x94, 0x40, 0x10, 0x63, 0x95, 0x00, 0xff, 0xb2, 0xb4, 0x40, 0x10,
+ 0x48, 0x00, 0x06, 0xb1, 0x3a, 0xa0, 0x00, 0x00, 0x3a, 0xc0, 0x00, 0x19, 0x3a, 0xe0, 0x00, 0xd0,
+ 0x3f, 0x00, 0xcd, 0x00, 0x63, 0xf2, 0x26, 0xa0, 0x80, 0x01, 0x00, 0xac, 0x90, 0x12, 0x00, 0x04,
+ 0x92, 0xb8, 0x64, 0x3c, 0x48, 0x00, 0x04, 0x85, 0x41, 0x82, 0x05, 0xfc, 0x2c, 0x1d, 0x00, 0x04,
+ 0x40, 0x80, 0x00, 0x10, 0x2c, 0x1d, 0x00, 0x01, 0x41, 0x80, 0x05, 0xec, 0x48, 0x00, 0x03, 0xa8,
+ 0x41, 0x82, 0x05, 0x48, 0x2c, 0x1d, 0x00, 0x06, 0x41, 0x82, 0x00, 0x8c, 0x2c, 0x1d, 0x00, 0x07,
+ 0x41, 0x82, 0x03, 0x8c, 0x2c, 0x1d, 0x00, 0x08, 0x41, 0x82, 0x05, 0xd8, 0x2c, 0x1d, 0x00, 0x09,
+ 0x41, 0x82, 0x00, 0xa0, 0x2c, 0x1d, 0x00, 0x10, 0x41, 0x82, 0x00, 0x98, 0x2c, 0x1d, 0x00, 0x2f,
+ 0x41, 0x82, 0x00, 0x70, 0x2c, 0x1d, 0x00, 0x30, 0x41, 0x82, 0x00, 0x78, 0x2c, 0x1d, 0x00, 0x38,
+ 0x41, 0x82, 0x05, 0x80, 0x2c, 0x1d, 0x00, 0x40, 0x41, 0x82, 0x03, 0x9c, 0x2c, 0x1d, 0x00, 0x41,
+ 0x41, 0x82, 0x03, 0xb0, 0x2c, 0x1d, 0x00, 0x44, 0x41, 0x82, 0x00, 0x68, 0x2c, 0x1d, 0x00, 0x50,
+ 0x41, 0x82, 0x00, 0x20, 0x2c, 0x1d, 0x00, 0x60, 0x41, 0x82, 0x00, 0x24, 0x2c, 0x1d, 0x00, 0x89,
+ 0x41, 0x82, 0x00, 0x50, 0x2c, 0x1d, 0x00, 0x99, 0x41, 0x82, 0x05, 0x64, 0x48, 0x00, 0x05, 0x68,
+ 0x80, 0x72, 0x00, 0x00, 0x48, 0x00, 0x04, 0x81, 0x48, 0x00, 0x05, 0x5c, 0x48, 0x00, 0x05, 0xe5,
+ 0x48, 0x00, 0x05, 0x54, 0x38, 0x80, 0x00, 0x01, 0x90, 0x92, 0x00, 0x00, 0x48, 0x00, 0x05, 0x48,
+ 0x48, 0x00, 0x04, 0x61, 0x3a, 0x00, 0x00, 0xa0, 0x63, 0xec, 0x26, 0xc4, 0x48, 0x00, 0x03, 0x6c,
+ 0x38, 0x60, 0x01, 0x20, 0x63, 0xec, 0x26, 0xc4, 0x48, 0x00, 0x04, 0x21, 0x48, 0x00, 0x05, 0x28,
+ 0x2f, 0x1d, 0x00, 0x10, 0x2e, 0x9d, 0x00, 0x44, 0x63, 0xe4, 0x1a, 0xb4, 0x3c, 0x60, 0x80, 0x00,
+ 0x60, 0x63, 0x03, 0x00, 0x48, 0x00, 0x05, 0x65, 0x38, 0x63, 0x0a, 0x00, 0x48, 0x00, 0x05, 0x5d,
+ 0x38, 0x63, 0x06, 0x00, 0x48, 0x00, 0x05, 0x55, 0x63, 0xec, 0x26, 0xb4, 0x92, 0xac, 0x00, 0x00,
+ 0x92, 0xac, 0x00, 0x04, 0x92, 0xac, 0x00, 0x08, 0x63, 0xe4, 0x26, 0xc4, 0x81, 0x24, 0x00, 0x18,
+ 0x80, 0x72, 0x00, 0x00, 0x2c, 0x03, 0x00, 0x02, 0x40, 0x82, 0x00, 0x0c, 0x41, 0x96, 0x00, 0x0c,
+ 0x48, 0x00, 0x00, 0x20, 0x38, 0x60, 0x00, 0x00, 0x90, 0x6c, 0x00, 0x0c, 0x40, 0x82, 0x00, 0x14,
+ 0x40, 0x96, 0x00, 0x10, 0x61, 0x29, 0x04, 0x00, 0x91, 0x24, 0x00, 0x18, 0x48, 0x00, 0x02, 0x70,
+ 0x55, 0x29, 0x05, 0xa8, 0x91, 0x24, 0x00, 0x18, 0x41, 0x96, 0x04, 0xac, 0x41, 0x9a, 0x00, 0x08,
+ 0x39, 0x8c, 0x00, 0x04, 0x38, 0x60, 0x00, 0x04, 0x48, 0x00, 0x03, 0x61, 0x40, 0x99, 0x00, 0x10,
+ 0x39, 0x8c, 0x00, 0x04, 0x38, 0x60, 0x00, 0x04, 0x48, 0x00, 0x03, 0x51, 0x63, 0xe4, 0x26, 0xb4,
+ 0x80, 0x64, 0x00, 0x00, 0x80, 0x84, 0x00, 0x04, 0x7c, 0x72, 0xfb, 0xa6, 0x7c, 0x95, 0xfb, 0xa6,
+ 0x48, 0x00, 0x04, 0x74, 0x7c, 0x32, 0x43, 0xa6, 0x7c, 0x3a, 0x02, 0xa6, 0x7c, 0x73, 0x43, 0xa6,
+ 0x7c, 0x7b, 0x02, 0xa6, 0x54, 0x63, 0x05, 0xa8, 0x90, 0x60, 0x26, 0xdc, 0x54, 0x63, 0x06, 0x20,
+ 0x60, 0x63, 0x20, 0x00, 0x54, 0x63, 0x04, 0x5e, 0x7c, 0x7b, 0x03, 0xa6, 0x3c, 0x60, 0x80, 0x00,
+ 0x60, 0x63, 0x1a, 0xf4, 0x7c, 0x7a, 0x03, 0xa6, 0x4c, 0x00, 0x01, 0x2c, 0x7c, 0x00, 0x04, 0xac,
+ 0x4c, 0x00, 0x00, 0x64, 0x3c, 0x60, 0x80, 0x00, 0x60, 0x63, 0x26, 0xc4, 0x90, 0x23, 0x00, 0x14,
+ 0x7c, 0x61, 0x1b, 0x78, 0x7c, 0x73, 0x42, 0xa6, 0xbc, 0x41, 0x00, 0x24, 0x7c, 0x24, 0x0b, 0x78,
+ 0x7c, 0x32, 0x42, 0xa6, 0x90, 0x04, 0x00, 0x1c, 0x90, 0x24, 0x00, 0x20, 0x7c, 0x68, 0x02, 0xa6,
+ 0x90, 0x64, 0x00, 0x9c, 0x7c, 0x60, 0x00, 0x26, 0x90, 0x64, 0x00, 0x00, 0x7c, 0x61, 0x02, 0xa6,
+ 0x90, 0x64, 0x00, 0x04, 0x7c, 0x69, 0x02, 0xa6, 0x90, 0x64, 0x00, 0x08, 0x7c, 0x72, 0x02, 0xa6,
+ 0x90, 0x64, 0x00, 0x0c, 0x7c, 0x73, 0x02, 0xa6, 0x90, 0x64, 0x00, 0x10, 0x39, 0x20, 0x00, 0x00,
+ 0x7d, 0x32, 0xfb, 0xa6, 0x7d, 0x35, 0xfb, 0xa6, 0xd0, 0x04, 0x00, 0xa0, 0xd0, 0x24, 0x00, 0xa4,
+ 0xd0, 0x44, 0x00, 0xa8, 0xd0, 0x64, 0x00, 0xac, 0xd0, 0x84, 0x00, 0xb0, 0xd0, 0xa4, 0x00, 0xb4,
+ 0xd0, 0xc4, 0x00, 0xb8, 0xd0, 0xe4, 0x00, 0xbc, 0xd1, 0x04, 0x00, 0xc0, 0xd1, 0x24, 0x00, 0xc4,
+ 0xd1, 0x44, 0x00, 0xc8, 0xd1, 0x64, 0x00, 0xcc, 0xd1, 0x84, 0x00, 0xd0, 0xd1, 0xa4, 0x00, 0xd4,
+ 0xd1, 0xc4, 0x00, 0xd8, 0xd1, 0xe4, 0x00, 0xdc, 0xd2, 0x04, 0x00, 0xe0, 0xd2, 0x24, 0x00, 0xe4,
+ 0xd2, 0x44, 0x00, 0xe8, 0xd2, 0x64, 0x00, 0xec, 0xd2, 0x84, 0x00, 0xf0, 0xd2, 0xa4, 0x00, 0xf4,
+ 0xd2, 0xc4, 0x00, 0xf8, 0xd2, 0xe4, 0x00, 0xfc, 0xd3, 0x04, 0x01, 0x00, 0xd3, 0x24, 0x01, 0x04,
+ 0xd3, 0x44, 0x01, 0x08, 0xd3, 0x64, 0x01, 0x0c, 0xd3, 0x84, 0x01, 0x10, 0xd3, 0xa4, 0x01, 0x14,
+ 0xd3, 0xc4, 0x01, 0x18, 0xd3, 0xe4, 0x01, 0x1c, 0x3f, 0xe0, 0x80, 0x00, 0x63, 0xe5, 0x26, 0xb4,
+ 0x82, 0x05, 0x00, 0x00, 0x82, 0x25, 0x00, 0x04, 0x82, 0x65, 0x00, 0x0c, 0x2c, 0x13, 0x00, 0x00,
+ 0x41, 0x82, 0x00, 0x74, 0x2c, 0x13, 0x00, 0x02, 0x40, 0x82, 0x00, 0x18, 0x81, 0x24, 0x00, 0x14,
+ 0x39, 0x33, 0x00, 0x03, 0x91, 0x25, 0x00, 0x00, 0x91, 0x25, 0x00, 0x0c, 0x48, 0x00, 0x00, 0x6c,
+ 0x7c, 0x10, 0x98, 0x00, 0x41, 0x82, 0x00, 0x38, 0x7c, 0x11, 0x98, 0x00, 0x41, 0x82, 0x00, 0x30,
+ 0x7d, 0x30, 0x8a, 0x14, 0x91, 0x25, 0x00, 0x0c, 0x82, 0x05, 0x00, 0x08, 0x2c, 0x10, 0x00, 0x00,
+ 0x41, 0x82, 0x00, 0x48, 0x80, 0x64, 0x00, 0x10, 0x7c, 0x10, 0x18, 0x00, 0x40, 0x82, 0x00, 0x10,
+ 0x3a, 0x00, 0x00, 0x00, 0x92, 0x05, 0x00, 0x08, 0x48, 0x00, 0x00, 0x30, 0x3a, 0x20, 0x00, 0x00,
+ 0x92, 0x25, 0x00, 0x0c, 0x81, 0x24, 0x00, 0x18, 0x61, 0x29, 0x04, 0x00, 0x91, 0x24, 0x00, 0x18,
+ 0x48, 0x00, 0x00, 0x30, 0x7e, 0x12, 0xfb, 0xa6, 0x7e, 0x35, 0xfb, 0xa6, 0x39, 0x20, 0x00, 0x01,
+ 0x91, 0x25, 0x00, 0x0c, 0x48, 0x00, 0x00, 0x1c, 0x38, 0xa0, 0x00, 0x02, 0x63, 0xe4, 0x26, 0xa0,
+ 0x90, 0xa4, 0x00, 0x00, 0x38, 0x60, 0x00, 0x11, 0x48, 0x00, 0x01, 0xbd, 0x4b, 0xff, 0xfc, 0x1d,
+ 0x7c, 0x20, 0x00, 0xa6, 0x54, 0x21, 0x07, 0xfa, 0x54, 0x21, 0x04, 0x5e, 0x7c, 0x20, 0x01, 0x24,
+ 0x63, 0xe1, 0x26, 0xc4, 0x80, 0x61, 0x00, 0x00, 0x7c, 0x6f, 0xf1, 0x20, 0x80, 0x61, 0x00, 0x14,
+ 0x7c, 0x7a, 0x03, 0xa6, 0x80, 0x61, 0x00, 0x18, 0x7c, 0x7b, 0x03, 0xa6, 0x80, 0x61, 0x00, 0x9c,
+ 0x7c, 0x68, 0x03, 0xa6, 0xb8, 0x41, 0x00, 0x24, 0x80, 0x01, 0x00, 0x1c, 0x80, 0x21, 0x00, 0x20,
+ 0x4c, 0x00, 0x01, 0x2c, 0x7c, 0x00, 0x04, 0xac, 0x4c, 0x00, 0x00, 0x64, 0x92, 0xb2, 0x00, 0x00,
+ 0x48, 0x00, 0x02, 0x50, 0x2e, 0x9d, 0x00, 0x02, 0x38, 0x60, 0x00, 0x08, 0x63, 0xec, 0x26, 0xa8,
+ 0x48, 0x00, 0x00, 0xf9, 0x80, 0xac, 0x00, 0x00, 0x80, 0x6c, 0x00, 0x04, 0x98, 0x65, 0x00, 0x00,
+ 0x41, 0x94, 0x00, 0x10, 0xb0, 0x65, 0x00, 0x00, 0x41, 0x96, 0x00, 0x08, 0x90, 0x65, 0x00, 0x00,
+ 0x7c, 0x00, 0x28, 0xac, 0x7c, 0x00, 0x04, 0xac, 0x7c, 0x00, 0x2f, 0xac, 0x4c, 0x00, 0x01, 0x2c,
+ 0x48, 0x00, 0x02, 0x04, 0x48, 0x00, 0x01, 0x1d, 0x38, 0x60, 0x00, 0x04, 0x63, 0xec, 0x26, 0xa8,
+ 0x48, 0x00, 0x00, 0xb9, 0x82, 0x0c, 0x00, 0x00, 0x63, 0xec, 0x27, 0xe8, 0x48, 0x00, 0x00, 0x1c,
+ 0x48, 0x00, 0x01, 0x01, 0x38, 0x60, 0x00, 0x08, 0x63, 0xec, 0x26, 0xa8, 0x48, 0x00, 0x00, 0x9d,
+ 0x82, 0x0c, 0x00, 0x04, 0x81, 0x8c, 0x00, 0x00, 0x63, 0xfb, 0x26, 0xb0, 0x3a, 0x20, 0x0f, 0x80,
+ 0x48, 0x00, 0x02, 0x3d, 0x41, 0x82, 0x00, 0x20, 0x7e, 0x23, 0x8b, 0x78, 0x48, 0x00, 0x00, 0x7d,
+ 0x48, 0x00, 0x00, 0xd1, 0x41, 0x82, 0xff, 0xfc, 0x7d, 0x8c, 0x72, 0x14, 0x35, 0x6b, 0xff, 0xff,
+ 0x41, 0x81, 0xff, 0xe8, 0x80, 0x7b, 0x00, 0x00, 0x2c, 0x03, 0x00, 0x00, 0x41, 0x82, 0x00, 0x08,
+ 0x48, 0x00, 0x00, 0x59, 0x7c, 0x00, 0x60, 0xac, 0x7c, 0x00, 0x04, 0xac, 0x7c, 0x00, 0x67, 0xac,
+ 0x4c, 0x00, 0x01, 0x2c, 0x48, 0x00, 0x01, 0x80, 0x7f, 0xc8, 0x02, 0xa6, 0x3c, 0x60, 0xa0, 0x00,
+ 0x48, 0x00, 0x00, 0x15, 0x76, 0x03, 0x08, 0x00, 0x56, 0x1d, 0x86, 0x3e, 0x7f, 0xc8, 0x03, 0xa6,
+ 0x4e, 0x80, 0x00, 0x20, 0x92, 0xf8, 0x68, 0x14, 0x90, 0x78, 0x68, 0x24, 0x92, 0xd8, 0x68, 0x20,
+ 0x80, 0xb8, 0x68, 0x20, 0x70, 0xa5, 0x00, 0x01, 0x40, 0x82, 0xff, 0xf8, 0x82, 0x18, 0x68, 0x24,
+ 0x90, 0xb8, 0x68, 0x14, 0x4e, 0x80, 0x00, 0x20, 0x7d, 0x48, 0x02, 0xa6, 0x7c, 0x69, 0x03, 0xa6,
+ 0x39, 0xc0, 0x00, 0x00, 0x48, 0x00, 0x00, 0x79, 0x48, 0x00, 0x00, 0x75, 0x4b, 0xff, 0xff, 0xad,
+ 0x41, 0x82, 0xff, 0xf4, 0x7f, 0xae, 0x61, 0xae, 0x39, 0xce, 0x00, 0x01, 0x42, 0x00, 0xff, 0xe8,
+ 0x7d, 0x48, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x20, 0x7d, 0x48, 0x02, 0xa6, 0x7c, 0x69, 0x03, 0xa6,
+ 0x39, 0xc0, 0x00, 0x00, 0x7c, 0x6c, 0x70, 0xae, 0x48, 0x00, 0x00, 0x1d, 0x41, 0x82, 0xff, 0xf8,
+ 0x39, 0xce, 0x00, 0x01, 0x42, 0x00, 0xff, 0xf0, 0x7d, 0x48, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x20,
+ 0x38, 0x60, 0x00, 0xaa, 0x7f, 0xc8, 0x02, 0xa6, 0x54, 0x63, 0xa0, 0x16, 0x64, 0x63, 0xb0, 0x00,
+ 0x3a, 0xc0, 0x00, 0x19, 0x3a, 0xe0, 0x00, 0xd0, 0x3f, 0x00, 0xcd, 0x00, 0x4b, 0xff, 0xff, 0x69,
+ 0x56, 0x03, 0x37, 0xff, 0x7f, 0xc8, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x20, 0x7f, 0xc8, 0x02, 0xa6,
+ 0x3c, 0x60, 0xd0, 0x00, 0x4b, 0xff, 0xff, 0x51, 0x56, 0x03, 0x37, 0xff, 0x41, 0x82, 0xff, 0xf4,
+ 0x7f, 0xc8, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x20, 0x4b, 0xff, 0xff, 0xb9, 0x38, 0x60, 0x00, 0x08,
+ 0x63, 0xec, 0x26, 0xa8, 0x4b, 0xff, 0xff, 0x55, 0x80, 0xac, 0x00, 0x04, 0x81, 0x8c, 0x00, 0x00,
+ 0x63, 0xfb, 0x26, 0xb0, 0x62, 0xb1, 0xf8, 0x00, 0x7e, 0x0c, 0x28, 0x50, 0x48, 0x00, 0x00, 0xf1,
+ 0x41, 0x81, 0x00, 0x10, 0x82, 0x3b, 0x00, 0x00, 0x2c, 0x11, 0x00, 0x00, 0x41, 0x82, 0x00, 0x68,
+ 0x7e, 0x23, 0x8b, 0x78, 0x4b, 0xff, 0xff, 0x55, 0x4b, 0xff, 0xff, 0xa5, 0x4b, 0xff, 0xff, 0xa1,
+ 0x4b, 0xff, 0xfe, 0xd9, 0x41, 0x82, 0xff, 0xf4, 0x2c, 0x1d, 0x00, 0xcc, 0x41, 0x82, 0x00, 0x48,
+ 0x2c, 0x1d, 0x00, 0xbb, 0x41, 0x82, 0xff, 0xdc, 0x2c, 0x1d, 0x00, 0xaa, 0x40, 0x82, 0xff, 0xdc,
+ 0x7d, 0x8c, 0x72, 0x14, 0x35, 0x6b, 0xff, 0xff, 0x41, 0x80, 0x00, 0x2c, 0x4b, 0xff, 0xff, 0xb4,
+ 0x7e, 0xb5, 0xfb, 0xa6, 0x7e, 0xb2, 0xfb, 0xa6, 0x63, 0xe4, 0x26, 0xc4, 0x81, 0x24, 0x00, 0x18,
+ 0x55, 0x29, 0x05, 0xa8, 0x91, 0x24, 0x00, 0x18, 0x48, 0x00, 0x00, 0x0c, 0x38, 0x60, 0x00, 0x80,
+ 0x4b, 0xff, 0xff, 0x25, 0x80, 0x92, 0x00, 0x00, 0x2c, 0x04, 0x00, 0x00, 0x40, 0x82, 0xf9, 0xf8,
+ 0xb3, 0x94, 0x40, 0x10, 0xc8, 0x41, 0x00, 0x98, 0xc8, 0x61, 0x00, 0xa0, 0x7f, 0x20, 0x00, 0xa6,
+ 0x80, 0x01, 0x00, 0xac, 0x7c, 0x08, 0x03, 0xa6, 0x80, 0x01, 0x00, 0x0c, 0x7c, 0x0f, 0xf1, 0x20,
+ 0x80, 0x01, 0x00, 0x10, 0x7c, 0x09, 0x03, 0xa6, 0x80, 0x01, 0x00, 0x14, 0x7c, 0x01, 0x03, 0xa6,
+ 0xb8, 0x61, 0x00, 0x18, 0x80, 0x01, 0x00, 0x08, 0x38, 0x21, 0x00, 0xa8, 0x4c, 0x00, 0x01, 0x2c,
+ 0x7c, 0x00, 0x04, 0xac, 0x4e, 0x80, 0x00, 0x20, 0x7e, 0x23, 0x20, 0x50, 0x3c, 0xa0, 0x48, 0x00,
+ 0x52, 0x25, 0x01, 0xba, 0x90, 0xa3, 0x00, 0x00, 0x7c, 0x00, 0x18, 0xac, 0x7c, 0x00, 0x04, 0xac,
+ 0x7c, 0x00, 0x1f, 0xac, 0x4c, 0x00, 0x01, 0x2c, 0x4e, 0x80, 0x00, 0x20, 0x7d, 0x70, 0x8b, 0xd7,
+ 0x7d, 0x4b, 0x89, 0xd6, 0x7d, 0x4a, 0x80, 0x50, 0x91, 0x5b, 0x00, 0x00, 0x4e, 0x80, 0x00, 0x20,
+ 0x7f, 0xa8, 0x02, 0xa6, 0x63, 0xef, 0x27, 0xe8, 0x63, 0xe7, 0x18, 0x08, 0x3c, 0xc0, 0x80, 0x00,
+ 0x7c, 0xd0, 0x33, 0x78, 0x39, 0x00, 0x00, 0x00, 0x3c, 0x60, 0x00, 0xd0, 0x60, 0x63, 0xc0, 0xde,
+ 0x80, 0x8f, 0x00, 0x00, 0x7c, 0x03, 0x20, 0x00, 0x40, 0x82, 0x00, 0x18, 0x80, 0x8f, 0x00, 0x04,
+ 0x7c, 0x03, 0x20, 0x00, 0x40, 0x82, 0x00, 0x0c, 0x39, 0xef, 0x00, 0x08, 0x48, 0x00, 0x00, 0x0c,
+ 0x7f, 0xa8, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x20, 0x80, 0x6f, 0x00, 0x00, 0x80, 0x8f, 0x00, 0x04,
+ 0x39, 0xef, 0x00, 0x08, 0x71, 0x09, 0x00, 0x01, 0x2f, 0x89, 0x00, 0x00, 0x39, 0x20, 0x00, 0x00,
+ 0x54, 0x6a, 0x1f, 0x7e, 0x54, 0x65, 0x3f, 0x7e, 0x74, 0x6b, 0x10, 0x00, 0x54, 0x63, 0x01, 0xfe,
+ 0x40, 0x82, 0x00, 0x0c, 0x54, 0xcc, 0x00, 0x0c, 0x48, 0x00, 0x00, 0x08, 0x7e, 0x0c, 0x83, 0x78,
+ 0x2e, 0x05, 0x00, 0x00, 0x2c, 0x0a, 0x00, 0x01, 0x41, 0xa0, 0x00, 0x2c, 0x41, 0xa2, 0x00, 0xe4,
+ 0x2c, 0x0a, 0x00, 0x03, 0x41, 0xa0, 0x01, 0xb0, 0x41, 0x82, 0x02, 0x54, 0x2c, 0x0a, 0x00, 0x05,
+ 0x41, 0x80, 0x02, 0xdc, 0x41, 0xa2, 0x04, 0xe8, 0x2c, 0x0a, 0x00, 0x07, 0x41, 0xa0, 0x05, 0x14,
+ 0x48, 0x00, 0x05, 0xf8, 0x7d, 0x8c, 0x1a, 0x14, 0x2c, 0x05, 0x00, 0x03, 0x41, 0x82, 0x00, 0x48,
+ 0x41, 0x81, 0x00, 0x60, 0x40, 0xbe, 0xff, 0x84, 0x2e, 0x05, 0x00, 0x01, 0x41, 0x91, 0x00, 0x2c,
+ 0x54, 0x8a, 0x84, 0x3e, 0x41, 0x92, 0x00, 0x10, 0x7c, 0x89, 0x61, 0xae, 0x39, 0x29, 0x00, 0x01,
+ 0x48, 0x00, 0x00, 0x0c, 0x7c, 0x89, 0x63, 0x2e, 0x39, 0x29, 0x00, 0x02, 0x35, 0x4a, 0xff, 0xff,
+ 0x40, 0xa0, 0xff, 0xe4, 0x4b, 0xff, 0xff, 0x54, 0x55, 0x8c, 0x00, 0x3a, 0x90, 0x8c, 0x00, 0x00,
+ 0x4b, 0xff, 0xff, 0x48, 0x7c, 0x89, 0x23, 0x78, 0x40, 0x9e, 0x04, 0xd0, 0x35, 0x29, 0xff, 0xff,
+ 0x41, 0x80, 0x04, 0xc8, 0x7c, 0xa9, 0x78, 0xae, 0x7c, 0xa9, 0x61, 0xae, 0x4b, 0xff, 0xff, 0xf0,
+ 0x39, 0xef, 0x00, 0x08, 0x40, 0xbe, 0xff, 0x24, 0x80, 0xaf, 0xff, 0xf8, 0x81, 0x6f, 0xff, 0xfc,
+ 0x54, 0xb1, 0x04, 0x3e, 0x54, 0xaa, 0x85, 0x3e, 0x54, 0xa5, 0x27, 0x3e, 0x2e, 0x85, 0x00, 0x01,
+ 0x41, 0x96, 0x00, 0x10, 0x41, 0xb5, 0x00, 0x14, 0x7c, 0x89, 0x61, 0xae, 0x48, 0x00, 0x00, 0x10,
+ 0x7c, 0x89, 0x63, 0x2e, 0x48, 0x00, 0x00, 0x08, 0x7c, 0x89, 0x61, 0x2e, 0x7c, 0x84, 0x5a, 0x14,
+ 0x7d, 0x29, 0x8a, 0x14, 0x35, 0x4a, 0xff, 0xff, 0x40, 0x80, 0xff, 0xd4, 0x4b, 0xff, 0xfe, 0xdc,
+ 0x54, 0x69, 0x07, 0xff, 0x41, 0x82, 0x00, 0x10, 0x55, 0x08, 0xf8, 0x7e, 0x71, 0x09, 0x00, 0x01,
+ 0x2f, 0x89, 0x00, 0x00, 0x2e, 0x85, 0x00, 0x04, 0x2d, 0x8a, 0x00, 0x05, 0x7d, 0x13, 0x43, 0x78,
+ 0x52, 0x68, 0x08, 0x3c, 0x40, 0x9e, 0x00, 0x78, 0x41, 0x8d, 0x04, 0xbc, 0x7d, 0x8c, 0x1a, 0x14,
+ 0x41, 0x8c, 0x00, 0x0c, 0x41, 0x94, 0x00, 0x30, 0x48, 0x00, 0x00, 0x1c, 0x40, 0x94, 0x00, 0x10,
+ 0x55, 0x8c, 0x00, 0x3a, 0x81, 0x6c, 0x00, 0x00, 0x48, 0x00, 0x00, 0x1c, 0x55, 0x8c, 0x00, 0x3c,
+ 0xa1, 0x6c, 0x00, 0x00, 0x7c, 0x89, 0x20, 0xf8, 0x55, 0x29, 0x84, 0x3e, 0x7d, 0x6b, 0x48, 0x38,
+ 0x54, 0x84, 0x04, 0x3e, 0x7f, 0x0b, 0x20, 0x40, 0x70, 0xa9, 0x00, 0x03, 0x41, 0x82, 0x00, 0x18,
+ 0x2c, 0x09, 0x00, 0x02, 0x41, 0x82, 0x00, 0x18, 0x41, 0x81, 0x00, 0x1c, 0x40, 0x9a, 0x00, 0x20,
+ 0x48, 0x00, 0x00, 0x18, 0x41, 0x9a, 0x00, 0x18, 0x48, 0x00, 0x00, 0x10, 0x41, 0x99, 0x00, 0x10,
+ 0x48, 0x00, 0x00, 0x08, 0x41, 0x98, 0x00, 0x08, 0x61, 0x08, 0x00, 0x01, 0x40, 0x8e, 0xfe, 0x3c,
+ 0x41, 0x94, 0xfe, 0x38, 0x81, 0x6f, 0xff, 0xf8, 0x40, 0x9e, 0x00, 0x20, 0x70, 0x6c, 0x00, 0x08,
+ 0x41, 0x82, 0x00, 0x0c, 0x71, 0x0c, 0x00, 0x01, 0x41, 0x82, 0x00, 0x10, 0x39, 0x8b, 0x00, 0x10,
+ 0x51, 0x8b, 0x03, 0x36, 0x48, 0x00, 0x00, 0x08, 0x55, 0x6b, 0x07, 0x16, 0x91, 0x6f, 0xff, 0xf8,
+ 0x4b, 0xff, 0xfe, 0x08, 0x40, 0xbe, 0xfe, 0x04, 0x54, 0x69, 0x16, 0xba, 0x54, 0x6e, 0x87, 0xfe,
+ 0x2d, 0x8e, 0x00, 0x00, 0x2e, 0x05, 0x00, 0x04, 0x70, 0xae, 0x00, 0x03, 0x2e, 0x8e, 0x00, 0x02,
+ 0x41, 0x94, 0x00, 0x14, 0x41, 0x96, 0x00, 0x50, 0x7c, 0x64, 0x07, 0x34, 0x7c, 0x84, 0x7a, 0x14,
+ 0x48, 0x00, 0x00, 0x68, 0x54, 0x65, 0xa7, 0xff, 0x41, 0x82, 0x00, 0x0c, 0x7d, 0x27, 0x48, 0x2e,
+ 0x7c, 0x84, 0x4a, 0x14, 0x41, 0x8e, 0x00, 0x08, 0x7c, 0x8c, 0x22, 0x14, 0x2e, 0x8e, 0x00, 0x01,
+ 0x41, 0x96, 0x00, 0x08, 0x80, 0x84, 0x00, 0x00, 0x54, 0x63, 0x67, 0xff, 0x41, 0x82, 0x00, 0x3c,
+ 0x40, 0x90, 0x00, 0x0c, 0x7c, 0x84, 0x32, 0x14, 0x48, 0x00, 0x00, 0x30, 0x7c, 0x84, 0x82, 0x14,
+ 0x48, 0x00, 0x00, 0x28, 0x54, 0x65, 0xa7, 0xff, 0x41, 0x82, 0x00, 0x0c, 0x7d, 0x27, 0x48, 0x2e,
+ 0x7c, 0x84, 0x4a, 0x14, 0x40, 0x90, 0x00, 0x0c, 0x7c, 0xcc, 0x21, 0x2e, 0x4b, 0xff, 0xfd, 0x7c,
+ 0x7e, 0x0c, 0x21, 0x2e, 0x4b, 0xff, 0xfd, 0x74, 0x40, 0x90, 0x00, 0x0c, 0x7c, 0x86, 0x23, 0x78,
+ 0x4b, 0xff, 0xfd, 0x68, 0x7c, 0x90, 0x23, 0x78, 0x4b, 0xff, 0xfd, 0x60, 0x54, 0x89, 0x1e, 0x78,
+ 0x39, 0x29, 0x00, 0x40, 0x2c, 0x05, 0x00, 0x02, 0x41, 0x80, 0x00, 0x4c, 0x54, 0x6b, 0x67, 0xbf,
+ 0x2c, 0x0b, 0x00, 0x01, 0x41, 0x80, 0x00, 0x14, 0x41, 0x82, 0x00, 0x08, 0x48, 0x00, 0x00, 0x10,
+ 0x41, 0xbe, 0xfd, 0x38, 0x48, 0x00, 0x00, 0x08, 0x40, 0xbe, 0xfd, 0x30, 0x2c, 0x05, 0x00, 0x03,
+ 0x41, 0x81, 0x00, 0x10, 0x41, 0xa2, 0x00, 0x10, 0x7d, 0xe7, 0x48, 0x2e, 0x4b, 0xff, 0xfd, 0x1c,
+ 0x7d, 0xe7, 0x49, 0x2e, 0x7c, 0x64, 0x07, 0x34, 0x54, 0x84, 0x1a, 0x78, 0x7d, 0xef, 0x22, 0x14,
+ 0x4b, 0xff, 0xfd, 0x08, 0x40, 0xbe, 0xfd, 0x04, 0x7c, 0xa7, 0x4a, 0x14, 0x40, 0x92, 0x00, 0x14,
+ 0x54, 0x64, 0x04, 0x3e, 0x91, 0xe5, 0x00, 0x00, 0x90, 0x85, 0x00, 0x04, 0x4b, 0xff, 0xfc, 0xec,
+ 0x81, 0x25, 0x00, 0x04, 0x2c, 0x09, 0x00, 0x00, 0x41, 0xa2, 0xfc, 0xe0, 0x39, 0x29, 0xff, 0xff,
+ 0x91, 0x25, 0x00, 0x04, 0x81, 0xe5, 0x00, 0x00, 0x4b, 0xff, 0xfc, 0xd0, 0x40, 0xbe, 0xfc, 0xcc,
+ 0x54, 0x6b, 0x16, 0xba, 0x7f, 0x47, 0x5a, 0x14, 0x81, 0x3a, 0x00, 0x00, 0x54, 0x6e, 0x67, 0xbe,
+ 0x41, 0x92, 0x00, 0x84, 0x2e, 0x05, 0x00, 0x05, 0x40, 0x90, 0x01, 0x74, 0x2e, 0x05, 0x00, 0x03,
+ 0x40, 0x90, 0x00, 0x90, 0x2e, 0x05, 0x00, 0x01, 0x54, 0x65, 0x87, 0xff, 0x41, 0x82, 0x00, 0x08,
+ 0x7c, 0x8c, 0x22, 0x14, 0x2f, 0x0e, 0x00, 0x01, 0x40, 0x92, 0x00, 0x24, 0x41, 0xb9, 0x00, 0x18,
+ 0x41, 0x9a, 0x00, 0x0c, 0x88, 0x84, 0x00, 0x00, 0x48, 0x00, 0x00, 0xf8, 0xa0, 0x84, 0x00, 0x00,
+ 0x48, 0x00, 0x00, 0xf0, 0x80, 0x84, 0x00, 0x00, 0x48, 0x00, 0x00, 0xe8, 0x54, 0x73, 0xe5, 0x3e,
+ 0x41, 0xb9, 0x00, 0x20, 0x41, 0x9a, 0x00, 0x10, 0x99, 0x24, 0x00, 0x00, 0x38, 0x84, 0x00, 0x01,
+ 0x48, 0x00, 0x00, 0x18, 0xb1, 0x24, 0x00, 0x00, 0x38, 0x84, 0x00, 0x02, 0x48, 0x00, 0x00, 0x0c,
+ 0x91, 0x24, 0x00, 0x00, 0x38, 0x84, 0x00, 0x04, 0x36, 0x73, 0xff, 0xff, 0x40, 0x80, 0xff, 0xd4,
+ 0x4b, 0xff, 0xfc, 0x38, 0x54, 0x65, 0x87, 0xff, 0x41, 0x82, 0x00, 0x08, 0x7c, 0x84, 0x62, 0x14,
+ 0x71, 0xc5, 0x00, 0x01, 0x41, 0x82, 0x00, 0x9c, 0x7c, 0x84, 0x4a, 0x14, 0x48, 0x00, 0x00, 0x94,
+ 0x54, 0x6a, 0x87, 0xbe, 0x54, 0x8e, 0x16, 0xba, 0x7e, 0x67, 0x72, 0x14, 0x40, 0x92, 0x00, 0x08,
+ 0x3a, 0x6f, 0xff, 0xfc, 0x80, 0x9a, 0x00, 0x00, 0x81, 0x33, 0x00, 0x00, 0x71, 0x4b, 0x00, 0x01,
+ 0x41, 0x82, 0x00, 0x08, 0x7c, 0x9a, 0x23, 0x78, 0x71, 0x4b, 0x00, 0x02, 0x41, 0x82, 0x00, 0x10,
+ 0x7d, 0x33, 0x4b, 0x78, 0x40, 0xb2, 0x00, 0x08, 0x7e, 0x6c, 0x9a, 0x14, 0x54, 0x65, 0x67, 0x3f,
+ 0x2c, 0x05, 0x00, 0x09, 0x40, 0x80, 0x00, 0x54, 0x48, 0x00, 0x00, 0x79, 0x7c, 0x89, 0x22, 0x14,
+ 0x48, 0x00, 0x00, 0x40, 0x7c, 0x89, 0x21, 0xd6, 0x48, 0x00, 0x00, 0x38, 0x7d, 0x24, 0x23, 0x78,
+ 0x48, 0x00, 0x00, 0x30, 0x7d, 0x24, 0x20, 0x38, 0x48, 0x00, 0x00, 0x28, 0x7d, 0x24, 0x22, 0x78,
+ 0x48, 0x00, 0x00, 0x20, 0x7d, 0x24, 0x20, 0x30, 0x48, 0x00, 0x00, 0x18, 0x7d, 0x24, 0x24, 0x30,
+ 0x48, 0x00, 0x00, 0x10, 0x5d, 0x24, 0x20, 0x3e, 0x48, 0x00, 0x00, 0x08, 0x7d, 0x24, 0x26, 0x30,
+ 0x90, 0x9a, 0x00, 0x00, 0x4b, 0xff, 0xfb, 0x84, 0x2c, 0x05, 0x00, 0x0a, 0x41, 0x81, 0xfb, 0x7c,
+ 0xc0, 0x5a, 0x00, 0x00, 0xc0, 0x73, 0x00, 0x00, 0x41, 0x82, 0x00, 0x0c, 0xec, 0x43, 0x10, 0x2a,
+ 0x48, 0x00, 0x00, 0x08, 0xec, 0x43, 0x00, 0xb2, 0xd0, 0x5a, 0x00, 0x00, 0x4b, 0xff, 0xfb, 0x5c,
+ 0x7d, 0x48, 0x02, 0xa6, 0x54, 0xa5, 0x1e, 0x78, 0x7d, 0x4a, 0x2a, 0x14, 0x80, 0x9a, 0x00, 0x00,
+ 0x81, 0x33, 0x00, 0x00, 0x7d, 0x48, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x20, 0x40, 0xbe, 0xfb, 0x3c,
+ 0x54, 0x69, 0xc0, 0x3e, 0x7d, 0x8e, 0x63, 0x78, 0x48, 0x00, 0x00, 0x35, 0x41, 0x92, 0x00, 0x0c,
+ 0x7e, 0x31, 0x22, 0x14, 0x48, 0x00, 0x00, 0x08, 0x7d, 0x29, 0x22, 0x14, 0x54, 0x64, 0xc4, 0x3f,
+ 0x38, 0xa0, 0x00, 0x00, 0x41, 0x82, 0xfb, 0x14, 0x7d, 0x45, 0x88, 0xae, 0x7d, 0x45, 0x49, 0xae,
+ 0x38, 0xa5, 0x00, 0x01, 0x7c, 0x05, 0x20, 0x00, 0x4b, 0xff, 0xff, 0xec, 0x2e, 0x8a, 0x00, 0x04,
+ 0x55, 0x31, 0x36, 0xba, 0x2c, 0x11, 0x00, 0x3c, 0x7e, 0x27, 0x88, 0x2e, 0x40, 0x82, 0x00, 0x08,
+ 0x7d, 0xd1, 0x73, 0x78, 0x41, 0x96, 0x00, 0x08, 0xa2, 0x31, 0x00, 0x00, 0x55, 0x29, 0x56, 0xba,
+ 0x2c, 0x09, 0x00, 0x3c, 0x7d, 0x27, 0x48, 0x2e, 0x40, 0x82, 0x00, 0x08, 0x7d, 0xc9, 0x73, 0x78,
+ 0x41, 0x96, 0x00, 0x08, 0xa1, 0x29, 0x00, 0x00, 0x4e, 0x80, 0x00, 0x20, 0x2c, 0x05, 0x00, 0x04,
+ 0x40, 0x80, 0x00, 0x28, 0x7c, 0x89, 0x23, 0x78, 0x7d, 0xc3, 0x62, 0x14, 0x55, 0xce, 0x00, 0x3c,
+ 0x4b, 0xff, 0xff, 0xad, 0x7c, 0x84, 0x20, 0xf8, 0x54, 0x84, 0x04, 0x3e, 0x7d, 0x2b, 0x20, 0x38,
+ 0x7e, 0x24, 0x20, 0x38, 0x4b, 0xff, 0xfb, 0xbc, 0x54, 0x6b, 0xe4, 0x3e, 0x4b, 0xff, 0xfb, 0xb4,
+ 0x7c, 0x9a, 0x23, 0x78, 0x54, 0x84, 0x18, 0x38, 0x40, 0x92, 0x00, 0x20, 0x40, 0x9e, 0x00, 0x0c,
+ 0x7d, 0xe8, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x21, 0x7d, 0xe4, 0x7a, 0x14, 0x39, 0xef, 0x00, 0x07,
+ 0x55, 0xef, 0x00, 0x38, 0x4b, 0xff, 0xfa, 0x64, 0x2e, 0x05, 0x00, 0x03, 0x41, 0x91, 0x00, 0x5c,
+ 0x3c, 0xa0, 0x48, 0x00, 0x7d, 0x83, 0x62, 0x14, 0x55, 0x8c, 0x00, 0x3a, 0x40, 0x92, 0x00, 0x20,
+ 0x40, 0xbe, 0xfa, 0x48, 0x57, 0x44, 0x00, 0x3a, 0x7c, 0x8c, 0x20, 0x50, 0x50, 0x85, 0x01, 0xba,
+ 0x50, 0x65, 0x07, 0xfe, 0x90, 0xac, 0x00, 0x00, 0x4b, 0xff, 0xfa, 0x30, 0x40, 0xbe, 0xff, 0xbc,
+ 0x7d, 0x2c, 0x78, 0x50, 0x51, 0x25, 0x01, 0xba, 0x90, 0xac, 0x00, 0x00, 0x39, 0x8c, 0x00, 0x04,
+ 0x7d, 0x6f, 0x22, 0x14, 0x39, 0x6b, 0xff, 0xfc, 0x7d, 0x2b, 0x60, 0x50, 0x51, 0x25, 0x01, 0xba,
+ 0x90, 0xab, 0x00, 0x00, 0x4b, 0xff, 0xff, 0x94, 0x2e, 0x05, 0x00, 0x06, 0x41, 0x92, 0x00, 0x28,
+ 0x4b, 0xff, 0xfb, 0x20, 0x55, 0x8c, 0x84, 0x3e, 0x57, 0x44, 0x84, 0x3e, 0x57, 0x5a, 0x04, 0x3e,
+ 0x7c, 0x0c, 0x20, 0x00, 0x41, 0x80, 0xfb, 0xa4, 0x7c, 0x0c, 0xd0, 0x00, 0x40, 0x80, 0xfb, 0x9c,
+ 0x4b, 0xff, 0xf9, 0xd8, 0x57, 0x45, 0xff, 0xfe, 0x68, 0xa5, 0x00, 0x01, 0x71, 0x03, 0x00, 0x01,
+ 0x7c, 0x05, 0x18, 0x00, 0x41, 0x82, 0x00, 0x1c, 0x51, 0x1a, 0x0f, 0xbc, 0x6b, 0x5a, 0x00, 0x02,
+ 0x57, 0x45, 0xff, 0xff, 0x41, 0x82, 0x00, 0x08, 0x6b, 0x5a, 0x00, 0x01, 0x93, 0x4f, 0xff, 0xfc,
+ 0x53, 0x48, 0x07, 0xfe, 0x4b, 0xff, 0xf9, 0xa4, 0x2c, 0x0b, 0x00, 0x00, 0x40, 0x82, 0xf9, 0x94,
+ 0x40, 0x92, 0x00, 0x0c, 0x39, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x14, 0x54, 0x69, 0x06, 0xff,
+ 0x40, 0x82, 0x00, 0x08, 0x40, 0x9e, 0x00, 0x10, 0x54, 0x65, 0x67, 0xfe, 0x7d, 0x08, 0x4c, 0x30,
+ 0x7d, 0x08, 0x2a, 0x78, 0x54, 0x85, 0x00, 0x1f, 0x41, 0x82, 0x00, 0x08, 0x7c, 0xa6, 0x2b, 0x78,
+ 0x54, 0x85, 0x80, 0x1f, 0x41, 0x82, 0x00, 0x08, 0x7c, 0xb0, 0x2b, 0x78, 0x4b, 0xff, 0xf9, 0x5c,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+
};
const int kenobiwii_size = sizeof(kenobiwii);
diff --git a/source/patches/patchcode.c b/source/patches/patchcode.c
index d9dc178b..9382e7a0 100644
--- a/source/patches/patchcode.c
+++ b/source/patches/patchcode.c
@@ -58,35 +58,35 @@ extern void vipatch(u32 address, u32 len);
extern u32 regionfreeselect;
static const u32 viwiihooks[4] = {
- 0x7CE33B78,0x38870034,0x38A70038,0x38C7004C
+ 0x7CE33B78,0x38870034,0x38A70038,0x38C7004C
};
static const u32 multidolpatch1[2] = {
- 0x3C03FFB4,0x28004F43
-};
+ 0x3C03FFB4,0x28004F43
+};
static const u32 healthcheckhook[2] = {
- 0x41810010,0x881D007D
-};
+ 0x41810010,0x881D007D
+};
static const u32 updatecheckhook[3] = {
- 0x80650050,0x80850054,0xA0A50058
+ 0x80650050,0x80850054,0xA0A50058
};
static const u32 multidolpatch2[2] = {
- 0x3F608000, 0x807B0018
+ 0x3F608000, 0x807B0018
};
static const u32 recoveryhooks[3] = {
- 0xA00100AC,0x5400073E,0x2C00000F
+ 0xA00100AC,0x5400073E,0x2C00000F
};
static const u32 nocopyflag1[3] = {
- 0x540007FF, 0x4182001C, 0x80630068
+ 0x540007FF, 0x4182001C, 0x80630068
};
static const u32 nocopyflag2[3] = {
- 0x540007FF, 0x41820024, 0x387E12E2
+ 0x540007FF, 0x41820024, 0x387E12E2
};
// this one is for the GH3 and VC saves
@@ -95,254 +95,265 @@ static const u32 nocopyflag2[3] = {
//};
static const u32 nocopyflag3[5] = {
- 0x2C030000, 0x41820200,0x48000058,0x38610100
+ 0x2C030000, 0x41820200,0x48000058,0x38610100
};
// this removes the display warning for no copy VC and GH3 saves
static const u32 nocopyflag4[4] = {
- 0x80010008, 0x2C000000, 0x4182000C, 0x3BE00001
+ 0x80010008, 0x2C000000, 0x4182000C, 0x3BE00001
};
static const u32 nocopyflag5[3] = {
- 0x801D0024,0x540007FF,0x41820024
+ 0x801D0024,0x540007FF,0x41820024
};
static const u32 movedvdpatch[3] = {
- 0x2C040000, 0x41820120, 0x3C608109
+ 0x2C040000, 0x41820120, 0x3C608109
};
-
+
static const u32 regionfreehooks[5] = {
- 0x7C600774, 0x2C000001, 0x41820030,0x40800010,0x2C000000
+ 0x7C600774, 0x2C000001, 0x41820030,0x40800010,0x2C000000
};
static const u32 fwritepatch[8] = {
- 0x9421FFD0,0x7C0802A6,0x90010034,0xBF210014,0x7C9B2378,0x7CDC3378,0x7C7A1B78,0x7CB92B78 // bushing fwrite
+ 0x9421FFD0,0x7C0802A6,0x90010034,0xBF210014,0x7C9B2378,0x7CDC3378,0x7C7A1B78,0x7CB92B78 // bushing fwrite
};
static const u32 kpadhooks[4] = {
- 0x9A3F005E,0x38AE0080,0x389FFFFC,0x7E0903A6
+ 0x9A3F005E,0x38AE0080,0x389FFFFC,0x7E0903A6
};
static const u32 kpadoldhooks[6] = {
- 0x801D0060, 0x901E0060, 0x801D0064, 0x901E0064, 0x801D0068, 0x901E0068
+ 0x801D0060, 0x901E0060, 0x801D0064, 0x901E0064, 0x801D0068, 0x901E0068
};
static const u32 joypadhooks[4] = {
- 0x3AB50001, 0x3A73000C, 0x2C150004, 0x3B18000C
+ 0x3AB50001, 0x3A73000C, 0x2C150004, 0x3B18000C
};
static const u32 langpatch[3] = {
- 0x7C600775, 0x40820010, 0x38000000
+ 0x7C600775, 0x40820010, 0x38000000
};
static const u32 vipatchcode[3] = {
- 0x4182000C,0x4180001C,0x48000018
+ 0x4182000C,0x4180001C,0x48000018
};
static const u32 wpadlibogc[5] = {
// 0x38A00140, 0x7C095878, 0x7D600078, 0x901F0010,0x913F0014
// 0x7FA00124, 0x8001001C, 0x83810008, 0x83A1000C,0x7C0803A6
- 0x90A402E0,0x806502E4,0x908502E4,0x2C030000,0x906402E4
+ 0x90A402E0,0x806502E4,0x908502E4,0x2C030000,0x906402E4
};
-void dogamehooks(void *addr, u32 len) {
- void *addr_start = addr;
- void *addr_end = addr+len;
+void dogamehooks(void *addr, u32 len)
+{
+ void *addr_start = addr;
+ void *addr_end = addr+len;
- while (addr_start < addr_end) {
+ while(addr_start < addr_end)
+ {
+
+ switch(hooktype)
+ {
+
+ case 0:
+
+ break;
+
+ case 1:
+ if(memcmp(addr_start, viwiihooks, sizeof(viwiihooks))==0){
+ // printf("\n\n\n");
+ // printf("found at address %x\n", addr_start);
+ // sleep(2);
+ patchhook((u32)addr_start, len);
+ patched = 1;
+ hooktype = 1;
+ }
+ break;
- switch (hooktype) {
+/*
+ case 2:
+ if(memcmp(addr_start, kpadhooks, sizeof(kpadhooks))==0){
+ patchhook((u32)addr_start, len);
+ patched = 1;
+ }
- case 0:
+ if(memcmp(addr_start, kpadoldhooks, sizeof(kpadoldhooks))==0){
+ patchhook((u32)addr_start, len);
+ patched = 1;
+ }
+ break;
+
+ case 3:
+ if(memcmp(addr_start, joypadhooks, sizeof(joypadhooks))==0){
+ patchhook((u32)addr_start, len);
+ patched = 1;
+ }
+ break;
- break;
+ case 4:
+ if(memcmp(addr_start, recoveryhooks, sizeof(recoveryhooks))==0){
+ patchhook3((u32)addr_start, len);
+ }
+ break;
+*/
+ case 2:
- case 1:
- if (memcmp(addr_start, viwiihooks, sizeof(viwiihooks))==0) {
- // printf("\n\n\n");
- // printf("found at address %x\n", addr_start);
- // sleep(2);
- patchhook((u32)addr_start, len);
- patched = 1;
- hooktype = 1;
- }
- break;
+ if(memcmp(addr_start, viwiihooks, sizeof(viwiihooks))==0){
+ patchhook2((u32)addr_start, len);
+ }
+
+ break;
- /*
- case 2:
- if(memcmp(addr_start, kpadhooks, sizeof(kpadhooks))==0){
- patchhook((u32)addr_start, len);
- patched = 1;
- }
+/*
+ case 6:
+ // jap region free
+ if(memcmp(addr_start, regionfreehooks, sizeof(regionfreehooks))==0){
+ regionfreejap((u32)addr_start, len);
+ }
- if(memcmp(addr_start, kpadoldhooks, sizeof(kpadoldhooks))==0){
- patchhook((u32)addr_start, len);
- patched = 1;
- }
- break;
+ // usa region free
+ if(memcmp(addr_start, regionfreehooks, sizeof(regionfreehooks))==0){
+ regionfreeusa((u32)addr_start, len);
+ }
- case 3:
- if(memcmp(addr_start, joypadhooks, sizeof(joypadhooks))==0){
- patchhook((u32)addr_start, len);
- patched = 1;
- }
- break;
+ // pal region free
+ if(memcmp(addr_start, regionfreehooks, sizeof(regionfreehooks))==0){
+ regionfreepal((u32)addr_start, len);
+ }
- case 4:
- if(memcmp(addr_start, recoveryhooks, sizeof(recoveryhooks))==0){
- patchhook3((u32)addr_start, len);
- }
- break;
- */
- case 2:
-
- if (memcmp(addr_start, viwiihooks, sizeof(viwiihooks))==0) {
- patchhook2((u32)addr_start, len);
- }
-
- break;
-
- /*
- case 6:
- // jap region free
- if(memcmp(addr_start, regionfreehooks, sizeof(regionfreehooks))==0){
- regionfreejap((u32)addr_start, len);
- }
-
- // usa region free
- if(memcmp(addr_start, regionfreehooks, sizeof(regionfreehooks))==0){
- regionfreeusa((u32)addr_start, len);
- }
-
- // pal region free
- if(memcmp(addr_start, regionfreehooks, sizeof(regionfreehooks))==0){
- regionfreepal((u32)addr_start, len);
- }
-
- // skip disc update
- if(memcmp(addr_start, updatecheckhook, sizeof(updatecheckhook))==0){
- patchupdatecheck((u32)addr_start, len);
- }
- break;
+ // skip disc update
+ if(memcmp(addr_start, updatecheckhook, sizeof(updatecheckhook))==0){
+ patchupdatecheck((u32)addr_start, len);
+ }
+ break;
- case 7:
- if(memcmp(addr_start, healthcheckhook, sizeof(healthcheckhook))==0){
- removehealthcheck((u32)addr_start, len);
- }
- break;
+ case 7:
+ if(memcmp(addr_start, healthcheckhook, sizeof(healthcheckhook))==0){
+ removehealthcheck((u32)addr_start, len);
+ }
+ break;
- // no copy flags
- case 8:
- // Remove the actual flag so can copy back
- if(memcmp(addr_start, nocopyflag5, sizeof(nocopyflag5))==0){
- copyflagcheck5((u32)addr_start, len);
- }
+ // no copy flags
+ case 8:
+ // Remove the actual flag so can copy back
+ if(memcmp(addr_start, nocopyflag5, sizeof(nocopyflag5))==0){
+ copyflagcheck5((u32)addr_start, len);
+ }
+
+
+ if(memcmp(addr_start, nocopyflag1, sizeof(nocopyflag1))==0){
+ copyflagcheck1((u32)addr_start, len);
+ }
+ if(memcmp(addr_start, nocopyflag2, sizeof(nocopyflag2))==0){
+ copyflagcheck2((u32)addr_start, len);
+ }
+
+ // no VC and GH3 save
+ if(memcmp(addr_start, nocopyflag3, sizeof(nocopyflag2))==0){
+ copyflagcheck3((u32)addr_start, len);
+ }
+ // no VC and GH3 save display remove
+ if(memcmp(addr_start, nocopyflag4, sizeof(nocopyflag4))==0){
+ copyflagcheck4((u32)addr_start, len);
+ }
+
+ break;
- if(memcmp(addr_start, nocopyflag1, sizeof(nocopyflag1))==0){
- copyflagcheck1((u32)addr_start, len);
- }
+ case 9:
+ if(memcmp(addr_start, movedvdpatch, sizeof(movedvdpatch))==0){
+ movedvdhooks((u32)addr_start, len);
+ }
+ break;
+*/
+ // multidol
+ case 3:
- if(memcmp(addr_start, nocopyflag2, sizeof(nocopyflag2))==0){
- copyflagcheck2((u32)addr_start, len);
- }
-
- // no VC and GH3 save
- if(memcmp(addr_start, nocopyflag3, sizeof(nocopyflag2))==0){
- copyflagcheck3((u32)addr_start, len);
- }
- // no VC and GH3 save display remove
- if(memcmp(addr_start, nocopyflag4, sizeof(nocopyflag4))==0){
- copyflagcheck4((u32)addr_start, len);
- }
-
- break;
-
- case 9:
- if(memcmp(addr_start, movedvdpatch, sizeof(movedvdpatch))==0){
- movedvdhooks((u32)addr_start, len);
- }
- break;
- */
- // multidol
- case 3:
-
- if (memcmp(addr_start, multidolpatch1, sizeof(multidolpatch1))==0) {
- multidolpatchone((u32)addr_start, len);
- }
- if (memcmp(addr_start, multidolpatch2, sizeof(multidolpatch2))==0) {
- multidolpatchtwo((u32)addr_start, len);
- }
- break;
+ if(memcmp(addr_start, multidolpatch1, sizeof(multidolpatch1))==0){
+ multidolpatchone((u32)addr_start, len);
+ }
+ if(memcmp(addr_start, multidolpatch2, sizeof(multidolpatch2))==0){
+ multidolpatchtwo((u32)addr_start, len);
+ }
+ break;
+ }
+ addr_start += 4;
}
- addr_start += 4;
- }
}
// Not used yet, for patching DOL once loaded into memory and befor execution
-void patchdol(void *addr, u32 len) {
+void patchdol(void *addr, u32 len)
+{
+
+ void *addr_start = addr;
+ void *addr_end = addr+len;
- void *addr_start = addr;
- void *addr_end = addr+len;
-
- while (addr_start < addr_end) {
- if (memcmp(addr_start, wpadlibogc, sizeof(wpadlibogc))==0) {
- // printf("\n\n\n");
- // printf("found at address %x\n", addr_start);
- // sleep(10);
- // patchhookdol((u32)addr_start, len);
- patched = 1;
- break;
- }
- addr_start += 4;
- }
+ while(addr_start < addr_end)
+ {
+ if(memcmp(addr_start, wpadlibogc, sizeof(wpadlibogc))==0) {
+ // printf("\n\n\n");
+ // printf("found at address %x\n", addr_start);
+ // sleep(10);
+ // patchhookdol((u32)addr_start, len);
+ patched = 1;
+ break;
+ }
+ addr_start += 4;
+ }
}
-void langpatcher(void *addr, u32 len) {
+void langpatcher(void *addr, u32 len)
+{
+
+ void *addr_start = addr;
+ void *addr_end = addr+len;
- void *addr_start = addr;
- void *addr_end = addr+len;
-
- while (addr_start < addr_end) {
-
- if (memcmp(addr_start, langpatch, sizeof(langpatch))==0) {
- if (configbytes[0] != 0xCD) {
- langvipatch((u32)addr_start, len, configbytes[0]);
- }
- }
- addr_start += 4;
- }
+ while(addr_start < addr_end)
+ {
+
+ if(memcmp(addr_start, langpatch, sizeof(langpatch))==0) {
+ if(configbytes[0] != 0xCD){
+ langvipatch((u32)addr_start, len, configbytes[0]);
+ }
+ }
+ addr_start += 4;
+ }
}
-void patchdebug(void *addr, u32 len) {
+void patchdebug(void *addr, u32 len)
+{
+
+ void *addr_start = addr;
+ void *addr_end = addr+len;
- void *addr_start = addr;
- void *addr_end = addr+len;
+ while(addr_start < addr_end)
+ {
+
+ if(memcmp(addr_start, fwritepatch, sizeof(fwritepatch))==0) {
- while (addr_start < addr_end) {
-
- if (memcmp(addr_start, fwritepatch, sizeof(fwritepatch))==0) {
-
- memcpy(addr_start,fwrite_patch_bin,fwrite_patch_bin_len);
- // apply patch
- }
- addr_start += 4;
- }
+ memcpy(addr_start,fwrite_patch_bin,fwrite_patch_bin_len);
+ // apply patch
+ }
+ addr_start += 4;
+ }
}
-void vidolpatcher(void *addr, u32 len) {
+void vidolpatcher(void *addr, u32 len)
+{
+
+ void *addr_start = addr;
+ void *addr_end = addr+len;
- void *addr_start = addr;
- void *addr_end = addr+len;
-
- while (addr_start < addr_end) {
- if (memcmp(addr_start, vipatchcode, sizeof(vipatchcode))==0) {
- vipatch((u32)addr_start, len);
- }
- addr_start += 4;
- }
+ while(addr_start < addr_end)
+ {
+ if(memcmp(addr_start, vipatchcode, sizeof(vipatchcode))==0) {
+ vipatch((u32)addr_start, len);
+ }
+ addr_start += 4;
+ }
}
diff --git a/source/patches/patchcode.h b/source/patches/patchcode.h
index 688b6279..381fcaa9 100644
--- a/source/patches/patchcode.h
+++ b/source/patches/patchcode.h
@@ -22,19 +22,20 @@
#ifndef __PATCHCODE_H__
#define __PATCHCODE_H__
#ifdef __cplusplus
-extern "C" {
+extern "C"
+{
#endif
// Globals
- u32 hooktype;
- int patched;
- u8 configbytes[2];
- u32 regionfree;
+u32 hooktype;
+int patched;
+u8 configbytes[2];
+u32 regionfree;
// Function prototypes
- void dogamehooks(void *addr, u32 len);
- void langpatcher(void *addr, u32 len);
- void vidolpatcher(void *addr, u32 len);
- void patchdebug(void *addr, u32 len);
+void dogamehooks(void *addr, u32 len);
+void langpatcher(void *addr, u32 len);
+void vidolpatcher(void *addr, u32 len);
+void patchdebug(void *addr, u32 len);
diff --git a/source/patches/patchhook.S b/source/patches/patchhook.S
index 231ad527..bddd9b7c 100644
--- a/source/patches/patchhook.S
+++ b/source/patches/patchhook.S
@@ -1,508 +1,508 @@
-# (c) Nuke www.usbgecko.com. Licensed under GPL V2
+ # (c) Nuke www.usbgecko.com. Licensed under GPL V2
.text
#include "ppc.h"
.globl patchhook # r3 address
patchhook:
-mtctr r4
-lis r6, 0x4E80
-ori r6, r6, 0x0020 # blr
+ mtctr r4
+ lis r6, 0x4E80
+ ori r6, r6, 0x0020 # blr
findblr:
-lwz r5, 0(r3)
-cmpw r6, r5
-beq writebranch
-addi r3, r3, 4 # next word
-bdnz findblr # loop length
-b exit # stop unhooked game hanging
+ lwz r5, 0(r3)
+ cmpw r6, r5
+ beq writebranch
+ addi r3, r3, 4 # next word
+ bdnz findblr # loop length
+ b exit # stop unhooked game hanging
writebranch:
-lis r4, 0x8000 # 800018A0 hook location (source)
-ori r4, r4, 0x18A8
-subf r4, r3, r4 # subtract r3 from r4 and place in r4
-lis r5, 0x3FF
-ori r5, r5, 0xFFFF # 0x3FFFFFF
-and r4, r4, r5
-lis r5, 0x4800 # 0x48000000
-or r4, r4, r5
-stw r4, 0(r3) # result in r3
-dcbf r0, r3 # data cache block flush
-icbi r0, r3
+ lis r4, 0x8000 # 800018A0 hook location (source)
+ ori r4, r4, 0x18A8
+ subf r4, r3, r4 # subtract r3 from r4 and place in r4
+ lis r5, 0x3FF
+ ori r5, r5, 0xFFFF # 0x3FFFFFF
+ and r4, r4, r5
+ lis r5, 0x4800 # 0x48000000
+ or r4, r4, r5
+ stw r4, 0(r3) # result in r3
+ dcbf r0, r3 # data cache block flush
+ icbi r0, r3
exit:
-blr # return
+ blr # return
- .globl patchhook2 # r3 address
- patchhook2:
- mtctr r4
- lis r6, 0x4E80
- ori r6, r6, 0x0020 # blr
- findblr2:
- lwz r5, 0(r3)
- cmpw r6, r5
- beq writebranch2
- addi r3, r3, 4 # next word
- bdnz findblr2 # loop length
- b exit2 # stop unhooked game hanging
+.globl patchhook2 # r3 address
+patchhook2:
+ mtctr r4
+ lis r6, 0x4E80
+ ori r6, r6, 0x0020 # blr
+findblr2:
+ lwz r5, 0(r3)
+ cmpw r6, r5
+ beq writebranch2
+ addi r3, r3, 4 # next word
+ bdnz findblr2 # loop length
+ b exit2 # stop unhooked game hanging
- writebranch2:
- lis r4, 0x8000 # 81700000 our temp patcher
- ori r4, r4, 0x18a8
- subf r4, r3, r4 # subtract r3 from r4 and place in r4
- lis r5, 0x3FF
- ori r5, r5, 0xFFFF # 0x3FFFFFF
- and r4, r4, r5
- lis r5, 0x4800 # 0x48000000
- or r4, r4, r5
- stw r4, 0(r3) # result in r3
- dcbf r0, r3 # data cache block flush
- icbi r0, r3
- exit2:
- blr # return
+writebranch2:
+ lis r4, 0x8000 # 81700000 our temp patcher
+ ori r4, r4, 0x18a8
+ subf r4, r3, r4 # subtract r3 from r4 and place in r4
+ lis r5, 0x3FF
+ ori r5, r5, 0xFFFF # 0x3FFFFFF
+ and r4, r4, r5
+ lis r5, 0x4800 # 0x48000000
+ or r4, r4, r5
+ stw r4, 0(r3) # result in r3
+ dcbf r0, r3 # data cache block flush
+ icbi r0, r3
+exit2:
+ blr # return
- .globl patchhook3 # r3 address
- patchhook3:
- mtctr r4
- lis r6, 0x4BFF
- ori r6, r6, 0xE955 # blr
- findbne:
- lwz r5, 0(r3)
- cmpw r6, r5
- beq writebl
- addi r3, r3, 4 # next word
- bdnz findbne # loop length
- b exit3 # stop unhooked game hanging
+.globl patchhook3 # r3 address
+patchhook3:
+ mtctr r4
+ lis r6, 0x4BFF
+ ori r6, r6, 0xE955 # blr
+findbne:
+ lwz r5, 0(r3)
+ cmpw r6, r5
+ beq writebl
+ addi r3, r3, 4 # next word
+ bdnz findbne # loop length
+ b exit3 # stop unhooked game hanging
- writebl:
- lis r4, 0x4BFF # 81700000 our temp patcher
- ori r4, r4, 0xEA91
- stw r4, 0(r3) # result in r3
- dcbf r0, r3 # data cache block flush
- icbi r0, r3
- exit3:
- blr # return
+writebl:
+ lis r4, 0x4BFF # 81700000 our temp patcher
+ ori r4, r4, 0xEA91
+ stw r4, 0(r3) # result in r3
+ dcbf r0, r3 # data cache block flush
+ icbi r0, r3
+exit3:
+ blr # return
- .globl patchhook4 # r3 address
- patchhook4:
- mtctr r4
- lis r6, 0x4082
- ori r6, r6, 0x001C # blr
- findregion:
- lwz r5, 0(r3)
- cmpw r6, r5
- beq writebr
- addi r3, r3, 4 # next word
- bdnz findregion # loop length
- b exit4 # stop unhooked game hanging
+.globl patchhook4 # r3 address
+patchhook4:
+ mtctr r4
+ lis r6, 0x4082
+ ori r6, r6, 0x001C # blr
+findregion:
+ lwz r5, 0(r3)
+ cmpw r6, r5
+ beq writebr
+ addi r3, r3, 4 # next word
+ bdnz findregion # loop length
+ b exit4 # stop unhooked game hanging
- writebr:
- lis r4, 0x4800
- ori r4, r4, 0x001C
- stw r4, 0(r3) # result in r3
- dcbf r0, r3 # data cache block flush
- icbi r0, r3
- exit4:
- blr # return
+writebr:
+ lis r4, 0x4800
+ ori r4, r4, 0x001C
+ stw r4, 0(r3) # result in r3
+ dcbf r0, r3 # data cache block flush
+ icbi r0, r3
+exit4:
+ blr # return
- .globl multidolpatchone # r3 address
- multidolpatchone:
- mtctr r4
- lis r6, 0x3800
- ori r6, r6, 0x0001 # (li r0,1)
- findmulti:
- lwz r5, 0(r3)
- cmpw r6, r5
- beq writemulti
- subi r3, r3, 4 # go back
- bdnz findmulti # loop length
- b exit5 # stop unhooked game hanging
+.globl multidolpatchone # r3 address
+multidolpatchone:
+ mtctr r4
+ lis r6, 0x3800
+ ori r6, r6, 0x0001 # (li r0,1)
+findmulti:
+ lwz r5, 0(r3)
+ cmpw r6, r5
+ beq writemulti
+ subi r3, r3, 4 # go back
+ bdnz findmulti # loop length
+ b exit5 # stop unhooked game hanging
- writemulti:
- lis r4, 0x8170 # 81700000
- ori r4, r4, 0x0020
- subf r18, r3, r4 # subf r18,(source),(dest)
- lis r6, 0x4800
- ori r6,r6,1
- rlwimi r6,r18,0,6,29
- stw r6,0(r3)
- stw r6,0(r19)
- stw r3,4(r19)
- dcbf r0, r3
- sync
- icbi r0, r3
- isync
- exit5:
- blr # return
+writemulti:
+ lis r4, 0x8170 # 81700000
+ ori r4, r4, 0x0020
+ subf r18, r3, r4 # subf r18,(source),(dest)
+ lis r6, 0x4800
+ ori r6,r6,1
+ rlwimi r6,r18,0,6,29
+ stw r6,0(r3)
+ stw r6,0(r19)
+ stw r3,4(r19)
+ dcbf r0, r3
+ sync
+ icbi r0, r3
+ isync
+exit5:
+ blr # return
- .globl multidolpatchtwo # r3 address
- multidolpatchtwo:
- mtctr r4
- lis r6, 0x3F60
- ori r6, r6, 0x8000 # (lis r27,-32768)
- findmulti2:
- lwz r5, 0(r3)
- cmpw r6, r5
- beq writemulti2
- addi r3, r3, 4 # go forward
- bdnz findmulti2 # loop length
- b exit6 # stop unhooked game hanging
+.globl multidolpatchtwo # r3 address
+multidolpatchtwo:
+ mtctr r4
+ lis r6, 0x3F60
+ ori r6, r6, 0x8000 # (lis r27,-32768)
+findmulti2:
+ lwz r5, 0(r3)
+ cmpw r6, r5
+ beq writemulti2
+ addi r3, r3, 4 # go forward
+ bdnz findmulti2 # loop length
+ b exit6 # stop unhooked game hanging
- writemulti2:
- lis r4, 0x8170 # 81700020
- ori r4, r4, 0x0000
- subf r18, r3, r4 # subf r18,(source),(dest)
- lis r6, 0x4800
- ori r6,r6,1
- rlwimi r6,r18,0,6,29
- stw r6,0(r3)
- stw r6,0(r19)
- stw r3,4(r19)
- dcbf r0, r3
- sync
- icbi r0, r3
- isync
- exit6:
- blr # return
+writemulti2:
+ lis r4, 0x8170 # 81700020
+ ori r4, r4, 0x0000
+ subf r18, r3, r4 # subf r18,(source),(dest)
+ lis r6, 0x4800
+ ori r6,r6,1
+ rlwimi r6,r18,0,6,29
+ stw r6,0(r3)
+ stw r6,0(r19)
+ stw r3,4(r19)
+ dcbf r0, r3
+ sync
+ icbi r0, r3
+ isync
+exit6:
+ blr # return
- .globl langvipatch # r3 address, r4 len, r5 lang byte
- langvipatch:
- mtctr r4
- lis r6, 0x8861
- ori r6, r6, 0x0008 # lbz r3, 8(sp)
- findlang:
- lwz r7, 0(r3)
- cmpw r6, r7
- beq patchlang
- addi r3, r3, 4 # next word
- bdnz findlang # loop length
- b exitlang # stop unhooked game hanging
+.globl langvipatch # r3 address, r4 len, r5 lang byte
+langvipatch:
+ mtctr r4
+ lis r6, 0x8861
+ ori r6, r6, 0x0008 # lbz r3, 8(sp)
+findlang:
+ lwz r7, 0(r3)
+ cmpw r6, r7
+ beq patchlang
+ addi r3, r3, 4 # next word
+ bdnz findlang # loop length
+ b exitlang # stop unhooked game hanging
- patchlang:
+patchlang:
+
+ lis r4, 0x3860 # 0x38600001 li %r3, 1 # eng
+ add r4, r4, r5
+gofinal:
+ stw r4, 0(r3) # result in r3
+ dcbf r0, r3 # data cache block flush
+ icbi r0, r3
+exitlang:
+ blr # return
- lis r4, 0x3860 # 0x38600001 li %r3, 1 # eng
- add r4, r4, r5
- gofinal:
- stw r4, 0(r3) # result in r3
- dcbf r0, r3 # data cache block flush
- icbi r0, r3
- exitlang:
- blr # return
+.globl vipatch # r3 address
+vipatch:
+ mtctr r4
+ lis r6, 0x5400
+ ori r6, r6, 0xFFFE
+findvi:
+ lwz r5, 0(r3)
+ cmpw r6, r5
+ beq patchvi
+ addi r3, r3, 4 # next word
+ bdnz findvi # loop length
+ b exitvi # stop unhooked game hanging
- .globl vipatch # r3 address
- vipatch:
- mtctr r4
- lis r6, 0x5400
- ori r6, r6, 0xFFFE
- findvi:
- lwz r5, 0(r3)
- cmpw r6, r5
- beq patchvi
- addi r3, r3, 4 # next word
- bdnz findvi # loop length
- b exitvi # stop unhooked game hanging
+patchvi:
+ lis r4, 0x8000
+ ori r4, r4, 0x0003
+ lbz r5, 0(r4)
+ cmpwi r5, 0x45 # USA
+ beq patchusa
+ cmpwi r5, 0x4A
+ beq patchjap2 # JAP
+ b exitvi
+patchjap2:
+ lis r4, 0x3800
+ ori r4, r4, 0x0001
+ b gofinal2
+patchusa:
+ lis r4, 0x3800
+ ori r4, r4, 0x0000
+gofinal2:
+ stw r4, 0(r3) # result in r3
+ dcbf r0, r3 # data cache block flush
+ icbi r0, r3
+exitvi:
+ blr # return
- patchvi:
- lis r4, 0x8000
- ori r4, r4, 0x0003
- lbz r5, 0(r4)
- cmpwi r5, 0x45 # USA
- beq patchusa
- cmpwi r5, 0x4A
- beq patchjap2 # JAP
- b exitvi
- patchjap2:
- lis r4, 0x3800
- ori r4, r4, 0x0001
- b gofinal2
- patchusa:
- lis r4, 0x3800
- ori r4, r4, 0x0000
- gofinal2:
- stw r4, 0(r3) # result in r3
- dcbf r0, r3 # data cache block flush
- icbi r0, r3
- exitvi:
- blr # return
+.globl regionfreejap # r3 address
+regionfreejap:
+ mtctr r4
+ lis r6, 0x2C1B
+ ori r6, r6, 0x0000 # blr
+findjap:
+ lwz r5, 0(r3)
+ cmpw r6, r5
+ beq writenop
+ addi r3, r3, 4 # next word
+ bdnz findjap # loop length
+ b exitjap # stop unhooked game hanging
- .globl regionfreejap # r3 address
- regionfreejap:
- mtctr r4
- lis r6, 0x2C1B
- ori r6, r6, 0x0000 # blr
- findjap:
- lwz r5, 0(r3)
- cmpw r6, r5
- beq writenop
- addi r3, r3, 4 # next word
- bdnz findjap # loop length
- b exitjap # stop unhooked game hanging
+writenop:
+ addi r3, r3, 4 # next word
+ lis r4, 0x6000 # nop
+ ori r4, r4, 0x0000
+ stw r4, 0(r3) # result in r3
+ dcbf r0, r3 # data cache block flush
+ icbi r0, r3
+exitjap:
+ blr # return
- writenop:
- addi r3, r3, 4 # next word
- lis r4, 0x6000 # nop
- ori r4, r4, 0x0000
- stw r4, 0(r3) # result in r3
- dcbf r0, r3 # data cache block flush
- icbi r0, r3
- exitjap:
- blr # return
+.globl regionfreeusa # r3 address
+regionfreeusa:
+ mtctr r4
+ lis r6, 0x281B
+ ori r6, r6, 0x0001 # blr
+findusa:
+ lwz r5, 0(r3)
+ cmpw r6, r5
+ beq writenop1
+ addi r3, r3, 4 # next word
+ bdnz findusa # loop length
+ b exitusa # stop unhooked game hanging
- .globl regionfreeusa # r3 address
- regionfreeusa:
- mtctr r4
- lis r6, 0x281B
- ori r6, r6, 0x0001 # blr
- findusa:
- lwz r5, 0(r3)
- cmpw r6, r5
- beq writenop1
- addi r3, r3, 4 # next word
- bdnz findusa # loop length
- b exitusa # stop unhooked game hanging
+writenop1:
+ addi r3, r3, 4 # next word
+ lis r4, 0x6000 # nop
+ ori r4, r4, 0x0000
+ stw r4, 0(r3) # result in r3
+ dcbf r0, r3 # data cache block flush
+ icbi r0, r3
+exitusa:
+ blr # return
- writenop1:
- addi r3, r3, 4 # next word
- lis r4, 0x6000 # nop
- ori r4, r4, 0x0000
- stw r4, 0(r3) # result in r3
- dcbf r0, r3 # data cache block flush
- icbi r0, r3
- exitusa:
- blr # return
+.globl regionfreepal # r3 address
+regionfreepal:
+ mtctr r4
+ lis r6, 0x281B
+ ori r6, r6, 0x0002 # blr
+findpal:
+ lwz r5, 0(r3)
+ cmpw r6, r5
+ beq writenop2
+ addi r3, r3, 4 # next word
+ bdnz findpal # loop length
+ b exitpal # stop unhooked game hanging
- .globl regionfreepal # r3 address
- regionfreepal:
- mtctr r4
- lis r6, 0x281B
- ori r6, r6, 0x0002 # blr
- findpal:
- lwz r5, 0(r3)
- cmpw r6, r5
- beq writenop2
- addi r3, r3, 4 # next word
- bdnz findpal # loop length
- b exitpal # stop unhooked game hanging
+writenop2:
+ addi r3, r3, 4 # next word
+ lis r4, 0x6000 # nop
+ ori r4, r4, 0x0000
+ stw r4, 0(r3) # result in r3
+ dcbf r0, r3 # data cache block flush
+ icbi r0, r3
- writenop2:
- addi r3, r3, 4 # next word
- lis r4, 0x6000 # nop
- ori r4, r4, 0x0000
- stw r4, 0(r3) # result in r3
- dcbf r0, r3 # data cache block flush
- icbi r0, r3
+ lis r6, 0x4082
+ ori r6, r6, 0x001C # bne loc_81377A2C
+findextra: #this is just the bne to b patch
+ lwz r5, 0(r3)
+ cmpw r6, r5
+ beq writeb
+ addi r3, r3, 4 # next word
+ bdnz findextra # loop length
+ b exitpal # stop unhooked game hanging
- lis r6, 0x4082
- ori r6, r6, 0x001C # bne loc_81377A2C
- findextra: #this is just the bne to b patch
- lwz r5, 0(r3)
- cmpw r6, r5
- beq writeb
- addi r3, r3, 4 # next word
- bdnz findextra # loop length
- b exitpal # stop unhooked game hanging
+writeb:
+ addi r3, r3, 4 # next word
+ lis r4, 0x4800
+ ori r4, r4, 0x001c # b loc_81377A2C
+ stw r4, 0(r3) # result in r3
+ dcbf r0, r3 # data cache block flush
+ icbi r0, r3
+exitpal:
+ blr # return
- writeb:
- addi r3, r3, 4 # next word
- lis r4, 0x4800
- ori r4, r4, 0x001c # b loc_81377A2C
- stw r4, 0(r3) # result in r3
- dcbf r0, r3 # data cache block flush
- icbi r0, r3
- exitpal:
- blr # return
+.globl removehealthcheck # r3 address
+removehealthcheck:
+ mtctr r4
+ lis r6, 0x4182
+ ori r6, r6, 0x004C # blr
+findhe:
+ lwz r5, 0(r3)
+ cmpw r6, r5
+ beq writebhe
+ addi r3, r3, 4 # next word
+ bdnz findhe # loop length
+ b exithe # stop unhooked game hanging
- .globl removehealthcheck # r3 address
- removehealthcheck:
- mtctr r4
- lis r6, 0x4182
- ori r6, r6, 0x004C # blr
- findhe:
- lwz r5, 0(r3)
- cmpw r6, r5
- beq writebhe
- addi r3, r3, 4 # next word
- bdnz findhe # loop length
- b exithe # stop unhooked game hanging
+writebhe:
+ lis r4, 0x6000
+ ori r4, r4, 0x0000
+ stw r4, 0(r3) # result in r3
+ dcbf r0, r3 # data cache block flush
+ icbi r0, r3
+exithe:
+ blr # return
- writebhe:
- lis r4, 0x6000
- ori r4, r4, 0x0000
- stw r4, 0(r3) # result in r3
- dcbf r0, r3 # data cache block flush
- icbi r0, r3
- exithe:
- blr # return
+
+.globl patchupdatecheck # r3 address
+patchupdatecheck:
+ mtctr r4
+ lis r6, 0x4082
+ ori r6, r6, 0x0020 # blr
+finduc:
+ lwz r5, 0(r3)
+ cmpw r6, r5
+ beq writenopuc
+ addi r3, r3, 4 # next word
+ bdnz finduc # loop length
+ b exituc # stop unhooked game hanging
-
- .globl patchupdatecheck # r3 address
- patchupdatecheck:
- mtctr r4
- lis r6, 0x4082
- ori r6, r6, 0x0020 # blr
- finduc:
- lwz r5, 0(r3)
- cmpw r6, r5
- beq writenopuc
- addi r3, r3, 4 # next word
- bdnz finduc # loop length
- b exituc # stop unhooked game hanging
-
- writenopuc:
- lis r4, 0x6000
- ori r4, r4, 0x0000
- stw r4, 0(r3) # result in r3
- dcbf r0, r3 # data cache block flush
- icbi r0, r3
- exituc:
- blr # return
+writenopuc:
+ lis r4, 0x6000
+ ori r4, r4, 0x0000
+ stw r4, 0(r3) # result in r3
+ dcbf r0, r3 # data cache block flush
+ icbi r0, r3
+exituc:
+ blr # return
- .globl copyflagcheck1 # r3 address
- copyflagcheck1:
- mtctr r4
- lis r6, 0x5400
- ori r6, r6, 0x07FF
- findncf1:
- lwz r5, 0(r3)
- cmpw r6, r5
- beq writencf1
- subi r3, r3, 4 # next word
- bdnz findncf1 # loop length
- b exitncf1 # stop unhooked game hanging
+.globl copyflagcheck1 # r3 address
+copyflagcheck1:
+ mtctr r4
+ lis r6, 0x5400
+ ori r6, r6, 0x07FF
+findncf1:
+ lwz r5, 0(r3)
+ cmpw r6, r5
+ beq writencf1
+ subi r3, r3, 4 # next word
+ bdnz findncf1 # loop length
+ b exitncf1 # stop unhooked game hanging
- writencf1:
- lis r4, 0x7C00
- ori r4, r4, 0x0000
- stw r4, 0(r3) # result in r3
- dcbf r0, r3 # data cache block flush
- icbi r0, r3
- exitncf1:
- blr # return
+writencf1:
+ lis r4, 0x7C00
+ ori r4, r4, 0x0000
+ stw r4, 0(r3) # result in r3
+ dcbf r0, r3 # data cache block flush
+ icbi r0, r3
+exitncf1:
+ blr # return
- .globl copyflagcheck2 # r3 address
- copyflagcheck2:
- mtctr r4
- lis r6, 0x5400
- ori r6, r6, 0x07FF
- findncf2:
- lwz r5, 0(r3)
- cmpw r6, r5
- beq writencf2
- subi r3, r3, 4 # next word
- bdnz findncf2 # loop length
- b exitncf2 # stop unhooked game hanging
+.globl copyflagcheck2 # r3 address
+copyflagcheck2:
+ mtctr r4
+ lis r6, 0x5400
+ ori r6, r6, 0x07FF
+findncf2:
+ lwz r5, 0(r3)
+ cmpw r6, r5
+ beq writencf2
+ subi r3, r3, 4 # next word
+ bdnz findncf2 # loop length
+ b exitncf2 # stop unhooked game hanging
- writencf2:
- lis r4, 0x7C00
- ori r4, r4, 0x0000
- stw r4, 0(r3) # result in r3
- dcbf r0, r3 # data cache block flush
- icbi r0, r3
- exitncf2:
- blr # return
+writencf2:
+ lis r4, 0x7C00
+ ori r4, r4, 0x0000
+ stw r4, 0(r3) # result in r3
+ dcbf r0, r3 # data cache block flush
+ icbi r0, r3
+exitncf2:
+ blr # return
- .globl copyflagcheck3 # r3 address
- copyflagcheck3:
- findncf3:
- addi r3, r3, 20 # go back one dword (4 bytes)
- lwz r5, 0(r3)
- writencf3:
- lis r4, 0x3860
- ori r4, r4, 0x0001 # li r3,1
- stw r4, 0(r3) # result in r3
- dcbf r0, r3 # data cache block flush
- icbi r0, r3
- exitncf3:
- blr # return
+.globl copyflagcheck3 # r3 address
+copyflagcheck3:
+findncf3:
+ addi r3, r3, 20 # go back one dword (4 bytes)
+ lwz r5, 0(r3)
+writencf3:
+ lis r4, 0x3860
+ ori r4, r4, 0x0001 # li r3,1
+ stw r4, 0(r3) # result in r3
+ dcbf r0, r3 # data cache block flush
+ icbi r0, r3
+exitncf3:
+ blr # return
- .globl copyflagcheck4 # r3 address
- copyflagcheck4:
- mtctr r4
- lis r6, 0x3BE0
- ori r6, r6, 0x0001 # li r31,1
- findncf4:
- lwz r5, 0(r3)
- cmpw r6, r5
- beq writencf4
- addi r3, r3, 4 # next word
- bdnz findncf4 # loop length
- b exitncf4 # stop unhooked game hanging
+.globl copyflagcheck4 # r3 address
+copyflagcheck4:
+ mtctr r4
+ lis r6, 0x3BE0
+ ori r6, r6, 0x0001 # li r31,1
+findncf4:
+ lwz r5, 0(r3)
+ cmpw r6, r5
+ beq writencf4
+ addi r3, r3, 4 # next word
+ bdnz findncf4 # loop length
+ b exitncf4 # stop unhooked game hanging
- writencf4:
- lis r4, 0x3BE0
- ori r4, r4, 0x0000 # change this to 3BE00000 (li r31,0)
- stw r4, 0(r3) # result in r3
- dcbf r0, r3 # data cache block flush
- icbi r0, r3
- exitncf4:
- blr # return
+writencf4:
+ lis r4, 0x3BE0
+ ori r4, r4, 0x0000 # change this to 3BE00000 (li r31,0)
+ stw r4, 0(r3) # result in r3
+ dcbf r0, r3 # data cache block flush
+ icbi r0, r3
+exitncf4:
+ blr # return
- .globl copyflagcheck5 # r3 address
- copyflagcheck5:
- mtctr r4
- lis r6, 0x4182
- ori r6, r6, 0x0024 # beq loc_8134AA60
- findncf5:
- lwz r5, 0(r3)
- cmpw r6, r5
- beq writencf5
- addi r3, r3, 4 # next word
- bdnz findncf5 # loop length
- b exitncf5 # stop unhooked game hanging
+.globl copyflagcheck5 # r3 address
+copyflagcheck5:
+ mtctr r4
+ lis r6, 0x4182
+ ori r6, r6, 0x0024 # beq loc_8134AA60
+findncf5:
+ lwz r5, 0(r3)
+ cmpw r6, r5
+ beq writencf5
+ addi r3, r3, 4 # next word
+ bdnz findncf5 # loop length
+ b exitncf5 # stop unhooked game hanging
- writencf5:
-#addi r3, r3, 8 # skip 2
+writencf5:
+ #addi r3, r3, 8 # skip 2
+
+ lis r4, 0x801D
+ ori r4, r4, 0x0024 # change to 801D0024 (lwz r0,36(r29))
+ stw r4, 0(r3)
+ dcbf r0, r3
+ icbi r0, r3
+
+ addi r3, r3, 4 # next word
- lis r4, 0x801D
- ori r4, r4, 0x0024 # change to 801D0024 (lwz r0,36(r29))
- stw r4, 0(r3)
- dcbf r0, r3
- icbi r0, r3
+ lis r4, 0x5400
+ ori r4, r4, 0x003C # change to 5400003C (rlwinm r0,r0,0,0,30)
+ stw r4, 0(r3)
+ dcbf r0, r3
+ icbi r0, r3
- addi r3, r3, 4 # next word
+ addi r3, r3, 4 # next word
- lis r4, 0x5400
- ori r4, r4, 0x003C # change to 5400003C (rlwinm r0,r0,0,0,30)
- stw r4, 0(r3)
- dcbf r0, r3
- icbi r0, r3
+ lis r4, 0x901D
+ ori r4, r4, 0x0024 # change to 901D0024 (stw r0,36(r29))
+ stw r4, 0(r3)
+ dcbf r0, r3
+ icbi r0, r3
- addi r3, r3, 4 # next word
+ addi r3, r3, 4 # next word
- lis r4, 0x901D
- ori r4, r4, 0x0024 # change to 901D0024 (stw r0,36(r29))
- stw r4, 0(r3)
- dcbf r0, r3
- icbi r0, r3
+ lis r4, 0x4800
+ ori r4, r4, 0x0018 # change to 48000018 (b 0x8134aa60)
+ stw r4, 0(r3)
+ dcbf r0, r3
+ icbi r0, r3
+exitncf5:
+ blr # return
- addi r3, r3, 4 # next word
-
- lis r4, 0x4800
- ori r4, r4, 0x0018 # change to 48000018 (b 0x8134aa60)
- stw r4, 0(r3)
- dcbf r0, r3
- icbi r0, r3
- exitncf5:
- blr # return
-
- .globl movedvdhooks # r3 address
- movedvdhooks:
- lis r6, 0x4182
- ori r6, r6, 0x0120 # beq loc_813A7938
- findmd1:
- addi r3, r3, 4 # next word
- lwz r5, 0(r3)
- writemd1:
- lis r4, 0x6000
- ori r4, r4, 0x0000 # nop
- stw r4, 0(r3) # result in r3
- dcbf r0, r3 # data cache block flush
- icbi r0, r3
- exitmd1:
- blr # return
+.globl movedvdhooks # r3 address
+movedvdhooks:
+ lis r6, 0x4182
+ ori r6, r6, 0x0120 # beq loc_813A7938
+findmd1:
+ addi r3, r3, 4 # next word
+ lwz r5, 0(r3)
+writemd1:
+ lis r4, 0x6000
+ ori r4, r4, 0x0000 # nop
+ stw r4, 0(r3) # result in r3
+ dcbf r0, r3 # data cache block flush
+ icbi r0, r3
+exitmd1:
+ blr # return
diff --git a/source/prompts/DiscBrowser.cpp b/source/prompts/DiscBrowser.cpp
index 67fdec38..004903ac 100644
--- a/source/prompts/DiscBrowser.cpp
+++ b/source/prompts/DiscBrowser.cpp
@@ -205,11 +205,11 @@ int DiscBrowse(struct discHdr * header) {
if (ret > 0) {
char temp[100];
- strncpy(temp, fstfiles(fst, ret), sizeof(temp));
+ strlcpy(temp, fstfiles(fst, ret), sizeof(temp));
choice = WindowPrompt(temp, tr("Load this dol as alternate dol?"), tr("OK"), tr("Cancel"));
if (choice) {
//ret = offsetselect[ret];
- snprintf(alternatedname, sizeof(alternatedname), "%s", temp);
+ strlcpy(alternatedname, temp, sizeof(alternatedname));
exit = true;
}
}
@@ -232,7 +232,6 @@ int DiscBrowse(struct discHdr * header) {
int autoSelectDol(const char *id) {
- //still not done//
//////////ID6/////////////////
//Boogie
@@ -271,38 +270,6 @@ int autoSelectDol(const char *id) {
//Metal Slug Anthology
if (strcmp(id,"RMLP7U") == 0) return 56;//from isostar
- //Metroid Prime Trilogy
- if (strcmp(id,"R3ME01") == 0) {
- int choice = WindowPrompt(tr("Select a DOL"), 0, "Metroid Prime", "Metroid Prime 2", "Metroid Prime 3");
- switch (choice) {
- case 1:
- choice = 780;
- break;
- case 2:
- choice = 781;
- break;
- default:
- choice = 782;
- break;
- }
- return choice;
- }
- if (strcmp(id,"R3MP01") == 0) {
- int choice = WindowPrompt(tr("Select a DOL"), 0, "Metroid Prime", "Metroid Prime 2", "Metroid Prime 3");
- switch (choice) {
- case 1:
- choice = 782;
- break;
- case 2:
- choice = 783;
- break;
- default:
- choice = 784;
- break;
- }
- return choice;
- }
-
//Mortal Kombat
if (strcmp(id,"RKMP5D") == 0) return 290;//from isostar
if (strcmp(id,"RKME5D") == 0) return 290;//starstremr
@@ -342,3 +309,41 @@ int autoSelectDol(const char *id) {
return -1;
}
+int autoSelectDolMenu(const char *id) {
+
+ //Metroid Prime Trilogy
+ if (strcmp(id,"R3ME01") == 0) {
+ int choice = WindowPrompt(tr("Select a DOL"), 0, "Metroid Prime", "Metroid Prime 2", "Metroid Prime 3", tr("Cancel"));
+ switch (choice) {
+ case 1:
+ choice = 780;
+ break;
+ case 2:
+ choice = 781;
+ break;
+ case 3:
+ choice = 782;
+ default: // 0
+ break;
+ }
+ return choice;
+ }
+ if (strcmp(id,"R3MP01") == 0) {
+ int choice = WindowPrompt(tr("Select a DOL"), 0, "Metroid Prime", "Metroid Prime 2", "Metroid Prime 3", tr("Cancel"));
+ switch (choice) {
+ case 1:
+ choice = 782;
+ break;
+ case 2:
+ choice = 783;
+ break;
+ case 3:
+ choice = 784;
+ default: // 0
+ break;
+ }
+ return choice;
+ }
+
+ return -1;
+}
diff --git a/source/prompts/DiscBrowser.h b/source/prompts/DiscBrowser.h
index ad1e6ab5..f7cee89d 100644
--- a/source/prompts/DiscBrowser.h
+++ b/source/prompts/DiscBrowser.h
@@ -10,5 +10,6 @@
int DiscBrowse(struct discHdr * header);
int autoSelectDol(const char *id);
+int autoSelectDolMenu(const char *id);
#endif
diff --git a/source/settings/Settings.cpp b/source/settings/Settings.cpp
index d2d88650..a1bcc6e9 100644
--- a/source/settings/Settings.cpp
+++ b/source/settings/Settings.cpp
@@ -1957,7 +1957,7 @@ int GameSettings(struct discHdr * header) {
alternatedol = game_cfg->loadalternatedol;
alternatedoloffset = game_cfg->alternatedolstart;
reloadblock = game_cfg->iosreloadblock;
- strncpy(alternatedname, game_cfg->alternatedolname, sizeof(alternatedname));
+ strlcpy(alternatedname, game_cfg->alternatedolname, sizeof(alternatedname));
} else {
videoChoice = Settings.video;
languageChoice = Settings.language;
@@ -1974,11 +1974,9 @@ int GameSettings(struct discHdr * header) {
alternatedol = off;
alternatedoloffset = 0;
reloadblock = off;
- sprintf(alternatedname, " ");
+ strcpy(alternatedname, "");
}
-
-
ResumeGui();
while (MainButton1.GetEffect() > 0) usleep(50);
@@ -2187,31 +2185,36 @@ int GameSettings(struct discHdr * header) {
snprintf(filename,sizeof(filename),"%c%c%c%c%c%c",header->id[0], header->id[1], header->id[2],
header->id[3],header->id[4], header->id[5]);
int dolchoice = 0;
- //check to see if we already know the offset of the correct dol
- int autodol = autoSelectDol(filename);
-
- //if we do know that offset ask if they want to use it
- if (autodol>0) {
- dolchoice = WindowPrompt(0,tr("Do you want to use the alt dol that is known to be correct?"),tr("Yes"),tr("Pick from a list"));
- if (dolchoice==1) {
- alternatedoloffset = autodol;
- snprintf(alternatedname, sizeof(alternatedname), "%s <%i>", tr("AUTO"),autodol);
- } else {//they want to search for the correct dol themselves
- int res = DiscBrowse(header);
- if ((res >= 0)&&(res !=696969)) {//if res==696969 they pressed the back button
- alternatedoloffset = res;
+ //alt dol menu for games that require more than a single alt dol
+ int autodol = autoSelectDolMenu(filename);
+ if (autodol>0) {
+ alternatedoloffset = autodol;
+ snprintf(alternatedname, sizeof(alternatedname), "%s <%i>", tr("AUTO"),autodol);
+ } else if (autodol!=0) {
+ //check to see if we already know the offset of the correct dol
+ int autodol = autoSelectDol(filename);
+ //if we do know that offset ask if they want to use it
+ if (autodol>0) {
+ dolchoice = WindowPrompt(0,tr("Do you want to use the alt dol that is known to be correct?"),tr("Yes"),tr("Pick from a list"));
+ if (dolchoice==1) {
+ alternatedoloffset = autodol;
+ snprintf(alternatedname, sizeof(alternatedname), "%s <%i>", tr("AUTO"),autodol);
+ } else if (dolchoice!=0){//they want to search for the correct dol themselves
+ int res = DiscBrowse(header);
+ if ((res >= 0)&&(res !=696969)) {//if res==696969 they pressed the back button
+ alternatedoloffset = res;
+ }
}
- }
- } else {
- int res = DiscBrowse(header);
- if ((res >= 0)&&(res !=696969)){
- alternatedoloffset = res;
-
- char tmp[170];
- snprintf(tmp,sizeof(tmp),"%s %s - %i",tr("It seems that you have some information that will be helpful to us. Please pass this information along to the DEV team.") ,filename,alternatedoloffset);
- WindowPrompt(0,tmp,tr("Ok"));
+ } else {
+ int res = DiscBrowse(header);
+ if ((res >= 0)&&(res !=696969)){
+ alternatedoloffset = res;
+ char tmp[170];
+ snprintf(tmp,sizeof(tmp),"%s %s - %i",tr("It seems that you have some information that will be helpful to us. Please pass this information along to the DEV team.") ,filename,alternatedoloffset);
+ WindowPrompt(0,tmp,tr("Ok"));
}
}
+ }
}
break;
case 10:
@@ -2281,6 +2284,7 @@ int GameSettings(struct discHdr * header) {
options2.SetName(2,"%s", tr("Delete Boxart"));
options2.SetName(3,"%s", tr("Delete Discart"));
options2.SetName(4,"%s", tr("Delete CheatTxt"));
+ options2.SetName(5,"%s", tr("Delete Cheat GCT"));
for (int i = 0; i <= MAXOPTIONS-1; i++) options2.SetValue(i, NULL);
w.Append(&optionBrowser2);
optionBrowser2.SetClickable(true);
@@ -2399,7 +2403,16 @@ int GameSettings(struct discHdr * header) {
remove(tmp);
}
break;
+ case 5:
+ snprintf(tmp,sizeof(tmp),"%s%c%c%c%c%c%c.gct", Settings.Cheatcodespath, header->id[0], header->id[1], header->id[2],header->id[3], header->id[4], header->id[5]);
+
+ choice1 = WindowPrompt(tr("Delete"),tmp,tr("Yes"),tr("No"));
+ if (choice1==1) {
+ if (checkfile(tmp))
+ remove(tmp);
+ }
+ break;
}
}
optionBrowser2.SetEffect(EFFECT_FADE, -20);
@@ -2428,7 +2441,7 @@ int GameSettings(struct discHdr * header) {
iosChoice = i249;
}
parentalcontrolChoice = 0;
- sprintf(alternatedname, " ");
+ strcpy(alternatedname, "");
CFG_forget_game_opt(header->id);
/* commented because the database language now depends on the main language setting, this could be enabled again if there is a separate language setting for the database
// if default language is different than language from main settings, reload titles
diff --git a/source/settings/cfg.c b/source/settings/cfg.c
index 0e69e997..0d9e9f9e 100644
--- a/source/settings/cfg.c
+++ b/source/settings/cfg.c
@@ -1016,7 +1016,7 @@ bool trimsplit(char *line, char *part1, char *part2, char delim, int size) {
}
void cfg_parseline(char *line, void (*set_func)(char*, char*)) {
// split name = value
- char tmp[200], name[200], val[200];
+ char tmp[300], name[200], val[200];
strcopy(tmp, line, sizeof(tmp));
char *eq = strchr(tmp, '=');
if (!eq) return;
@@ -1054,7 +1054,7 @@ void cfg_parsetitleline(char *line, void (*set_func)(char*, char*, u8)) {
bool cfg_parsefile(char *fname, void (*set_func)(char*, char*)) {
FILE *f;
- char line[200];
+ char line[300];
//printf("opening(%s)\n", fname);
f = fopen(fname, "r");
@@ -1137,8 +1137,12 @@ void cfg_set_game_opt(struct Game_CFG *game, u8 *id) {
game->iosreloadblock = reloadblock;
game->patchcountrystrings = countrystrings;
game->loadalternatedol = alternatedol;
+ if (game->loadalternatedol == 0) {
+ alternatedoloffset = 0;
+ strcpy(alternatedname, "");
+ }
game->alternatedolstart = alternatedoloffset;
- strcpy(game->alternatedolname, alternatedname);
+ strlcpy(game->alternatedolname, alternatedname,sizeof(game->alternatedolname));
}
struct Game_NUM* cfg_get_game_num(u8 *id) {
@@ -1254,7 +1258,7 @@ void game_set(char *name, char *val) {
// parse val
// first split options by ;
- char opt[200], *p, *np;
+ char opt[300], *p, *np;
p = val;
while (p) {
@@ -1321,18 +1325,7 @@ void game_set(char *name, char *val) {
}
}
if (strcmp("alternatedolname", opt_name) == 0) {
- char temp3[40];
- int i = 0;
- while (i < 40) {
-
- if (opt_val[i] == ';')
- break;
-
- temp3[i] = opt_val[i];
- i++;
- }
- temp3[i] = '\0';
- strncpy(game->alternatedolname, temp3, 39);
+ strlcpy(game->alternatedolname, opt_val, sizeof(game->alternatedolname));
}
}
// next opt