diff options
Diffstat (limited to 'drivers')
73 files changed, 10449 insertions, 9475 deletions
diff --git a/drivers/block/md.c b/drivers/block/md.c index 69ff1813b..684b47c1b 100644 --- a/drivers/block/md.c +++ b/drivers/block/md.c @@ -553,6 +553,8 @@ static int do_md_add (int minor, kdev_t dev) a better idea, please help ! */ realdev->inode=get_empty_inode (); + if (!realdev->inode) + return -ENOMEM; realdev->inode->i_dev=dev; /* don't care about other fields */ insert_inode_hash (realdev->inode); diff --git a/drivers/block/paride/pcd.c b/drivers/block/paride/pcd.c index 13b5f1b6a..027517320 100644 --- a/drivers/block/paride/pcd.c +++ b/drivers/block/paride/pcd.c @@ -571,7 +571,7 @@ static int pcd_reset( int unit ) WR(0,6,0xa0 + 0x10*PCD.drive); WR(0,7,8); - pcd_sleep(2); /* delay a bit */ + pcd_sleep(20*HZ/1000); /* delay a bit */ k = 0; while ((k++ < PCD_RESET_TMO) && (RR(1,6)&IDE_BUSY)) @@ -609,7 +609,7 @@ static int pcd_ready_wait( int unit, int tmo ) if (!p) return 0; if (!(((p & 0xffff) == 0x0402)||((p & 0xff) == 6))) return p; k++; - pcd_sleep(100); + pcd_sleep(HZ); } return 0x000020; /* timeout */ } diff --git a/drivers/block/paride/pf.c b/drivers/block/paride/pf.c index 58a747cb7..4dba8c8b5 100644 --- a/drivers/block/paride/pf.c +++ b/drivers/block/paride/pf.c @@ -666,11 +666,11 @@ static int pf_reset( int unit ) WR(0,6,DRIVE); WR(0,7,8); - pf_sleep(2); + pf_sleep(20*HZ/1000); k = 0; while ((k++ < PF_RESET_TMO) && (RR(1,6)&STAT_BUSY)) - pf_sleep(10); + pf_sleep(HZ/10); flg = 1; for(i=0;i<5;i++) flg &= (RR(0,i+1) == expect[i]); diff --git a/drivers/block/paride/pg.c b/drivers/block/paride/pg.c index 89c83db65..42967b714 100644 --- a/drivers/block/paride/pg.c +++ b/drivers/block/paride/pg.c @@ -463,7 +463,7 @@ static int pg_reset( int unit ) WR(0,6,DRIVE); WR(0,7,8); - pg_sleep(2); + pg_sleep(20*HZ/1000); k = 0; while ((k++ < PG_RESET_TMO) && (RR(1,6)&STAT_BUSY)) diff --git a/drivers/block/paride/pt.c b/drivers/block/paride/pt.c index 2616319f7..81d5fe54b 100644 --- a/drivers/block/paride/pt.c +++ b/drivers/block/paride/pt.c @@ -498,7 +498,7 @@ static void pt_media_access_cmd( int unit, int tmo, char *cmd, char *fun) return; } pi_disconnect(PI); - pt_poll_dsc(unit,100,tmo,fun); + pt_poll_dsc(unit,HZ,tmo,fun); } static void pt_rewind( int unit ) @@ -526,11 +526,11 @@ static int pt_reset( int unit ) WR(0,6,DRIVE); WR(0,7,8); - pt_sleep(2); + pt_sleep(20*HZ/1000); k = 0; while ((k++ < PT_RESET_TMO) && (RR(1,6)&STAT_BUSY)) - pt_sleep(10); + pt_sleep(HZ/10); flg = 1; for(i=0;i<5;i++) flg &= (RR(0,i+1) == expect[i]); @@ -559,7 +559,7 @@ static int pt_ready_wait( int unit, int tmo ) if (!p) return 0; if (!(((p & 0xffff) == 0x0402)||((p & 0xff) == 6))) return p; k++; - pt_sleep(100); + pt_sleep(HZ); } return 0x000020; /* timeout */ } @@ -809,7 +809,7 @@ static ssize_t pt_read(struct file * filp, char * buf, while (count > 0) { - if (!pt_poll_dsc(unit,1,PT_TMO,"read")) return -EIO; + if (!pt_poll_dsc(unit,HZ/100,PT_TMO,"read")) return -EIO; n = count; if (n > 32768) n = 32768; /* max per command */ @@ -895,7 +895,7 @@ static ssize_t pt_write(struct file * filp, const char * buf, while (count > 0) { - if (!pt_poll_dsc(unit,1,PT_TMO,"write")) return -EIO; + if (!pt_poll_dsc(unit,HZ/100,PT_TMO,"write")) return -EIO; n = count; if (n > 32768) n = 32768; /* max per command */ diff --git a/drivers/char/Config.in b/drivers/char/Config.in index 1ae10a544..3000b6a73 100644 --- a/drivers/char/Config.in +++ b/drivers/char/Config.in @@ -69,7 +69,7 @@ if [ "$CONFIG_BUSMOUSE" != "n" ]; then dep_tristate 'ATIXL busmouse support' CONFIG_ATIXL_BUSMOUSE $CONFIG_BUSMOUSE dep_tristate 'Logitech busmouse support' CONFIG_LOGIBUSMOUSE $CONFIG_BUSMOUSE dep_tristate 'Microsoft busmouse support' CONFIG_MS_BUSMOUSE $CONFIG_BUSMOUSE - if [ "$CONFIG_PPC" = "y" ] ; then + if [ "$CONFIG_ADB" = "y" ]; then dep_tristate 'Apple Desktop Bus mouse support' CONFIG_ADBMOUSE $CONFIG_BUSMOUSE fi fi diff --git a/drivers/char/adbmouse.c b/drivers/char/adbmouse.c index 95c25b519..3fb2afea5 100644 --- a/drivers/char/adbmouse.c +++ b/drivers/char/adbmouse.c @@ -158,6 +158,8 @@ int __init adb_mouse_init(void) if (!MACH_IS_MAC) return -ENODEV; #endif + /* all buttons up */ + memset(adb_mouse_buttons, 7, sizeof(adb_mouse_buttons)); msedev = register_busmouse(&adb_mouse); if (msedev < 0) diff --git a/drivers/char/bttv.c b/drivers/char/bttv.c index a177e7de6..ac21c68f0 100644 --- a/drivers/char/bttv.c +++ b/drivers/char/bttv.c @@ -544,7 +544,13 @@ static struct tvcard tvcards[] = /* AVEC Intercapture */ { 3, 2, 0, 2, 0, { 2, 3, 1, 1}, { 1, 0, 0, 0, 0}}, /* LifeView FlyKit w/o Tuner */ - { 3, 1, -1, -1, 0x8dff00, { 2, 3, 1, 1}} + { 3, 1, -1, -1, 0x8dff00, { 2, 3, 1, 1}}, + /* CEI Raffles Card */ + { 3, 3, 0, 2, 0, {2, 3, 1, 1}, {0, 0, 0, 0 ,0}}, + /* Lucky Star Image World ConferenceTV */ + {3, 1, 0, 2, 16777215, { 2, 3, 1, 1}, { 131072, 1, 1638400, 3, 4}}, + /* Phoebe Tv Master + FM */ + { 3, 1, 0, 2, 0xc00, { 2, 3, 1, 1},{0, 1, 0x800, 0x400, 0xc00, 0}} }; #define TVCARDS (sizeof(tvcards)/sizeof(tvcard)) @@ -2118,6 +2124,21 @@ static int bttv_ioctl(struct video_device *dev, unsigned int cmd, void *arg) data &= ~WINVIEW_PT2254_STROBE; btwrite(data, BT848_GPIO_DATA); } + /* TEA 6320 Audio Support by Michael Wrighton + mgw1@cec.wustl.edu */ + if (btv->audio_chip == TEA6320) + { + int vol; + vol = v.volume >> 11; + if (!(v.flags&VIDEO_AUDIO_MUTE)) + I2CWrite(&(btv->i2c), I2C_TEA6320, + TEA6320_S, TEA6320_S_SB,1); /* at least Raffles card uses input B */ + else + I2CWrite(&(btv->i2c), I2C_TEA6320, + TEA6320_S, TEA6320_S_GMU,1); + I2CWrite(&(btv->i2c), I2C_TEA6320, + TEA6320_V, vol, 1); + } if (btv->have_msp3400) { i2c_control_device(&(btv->i2c), @@ -2597,14 +2618,13 @@ static void handle_chipset(void) if (triton1) triton1=BT848_INT_ETBF; - while ((dev = pci_find_device(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_496, dev))) + + if(pci_pci_problems&PCIPCI_FAIL) { - /* Beware the SiS 85C496 my friend - rev 49 don't work with a bttv */ - printk(KERN_WARNING "BT848 and SIS 85C496 chipset don't always work together.\n"); - } - - /* dev == NULL */ - + printk(KERN_WARNING "bttv: This configuration is known to have PCI to PCI DMA problems\n"); + printk(KERN_WARNING "bttv: You may not be able to use overlay mode.\n"); + } + while ((dev = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82441, dev))) { unsigned char b; @@ -2721,6 +2741,12 @@ static void idcard(int i) btv->pll.pll_crystal=BT848_IFORM_XT0; } } + + if (btv->type == BTTV_CONFERENCETV) { + btv->tuner_type = 1; + btv->pll.pll_ifreq=28636363; + btv->pll.pll_crystal=BT848_IFORM_XT0; + } if (btv->type == BTTV_PIXVIEWPLAYTV) { btv->pll.pll_ifreq=28636363; @@ -2772,7 +2798,7 @@ static void idcard(int i) if (I2CRead(&(btv->i2c), I2C_TEA6300) >=0) { - if(btv->type==BTTV_AVEC_INTERCAP) + if(btv->type==BTTV_AVEC_INTERCAP || btv->type==BTTV_CEI_RAFFLES) { printk(KERN_INFO "bttv%d: fader chip: TEA6320\n",btv->nr); btv->audio_chip = TEA6320; @@ -2820,14 +2846,23 @@ static void idcard(int i) strcat(btv->video_dev.name,"(AVerMedia TVCapture 98)"); break; case BTTV_VHX: - strcpy(btv->video_dev.name,"BT848(Aimslab-VHX)"); + strcpy(btv->video_dev.name,"(Aimslab-VHX)"); break; case BTTV_WINVIEW_601: - strcpy(btv->video_dev.name,"BT848(Leadtek WinView 601)"); + strcpy(btv->video_dev.name,"(Leadtek WinView 601)"); break; case BTTV_AVEC_INTERCAP: strcpy(btv->video_dev.name,"(AVEC Intercapture)"); break; + case BTTV_CEI_RAFFLES: + strcpy(btv->video_dev.name,"(CEI Raffles Card)"); + break; + case BTTV_CONFERENCETV: + strcpy(btv->video_dev.name,"(Image World ConferenceTV)"); + break; + case BTTV_PHOEBE_TVMAS: + strcpy(btv->video_dev.name,"(Phoebe TV Master)"); + break; } printk("%s\n",btv->video_dev.name); audio(btv, AUDIO_INTERN); diff --git a/drivers/char/bttv.h b/drivers/char/bttv.h index 83c9f1e8f..3126cce57 100644 --- a/drivers/char/bttv.h +++ b/drivers/char/bttv.h @@ -213,6 +213,10 @@ struct bttv #define BTTV_PIXVIEWPLAYTV 0x10 #define BTTV_WINVIEW_601 0x11 #define BTTV_AVEC_INTERCAP 0x12 +#define BTTV_LIFE_FLYKIT 0x13 +#define BTTV_CEI_RAFFLES 0x14 +#define BTTV_CONFERENCETV 0x15 +#define BTTV_PHOEBE_TVMAS 0x16 #define AUDIO_TUNER 0x00 #define AUDIO_RADIO 0x01 @@ -237,6 +241,7 @@ struct bttv #define I2C_STBEE 0xae #define I2C_VHX 0xc0 #define I2C_TEA6300 0x80 /* same as TEA6320 */ +#define I2C_TEA6320 0x80 #define TDA9840_SW 0x00 #define TDA9840_LVADJ 0x02 diff --git a/drivers/char/busmouse.c b/drivers/char/busmouse.c index 42c2642f6..c592258bd 100644 --- a/drivers/char/busmouse.c +++ b/drivers/char/busmouse.c @@ -453,7 +453,7 @@ bus_mouse_init(void) #ifdef CONFIG_SUN_MOUSE sun_mouse_init(); #endif -#ifdef CONFIG_ADB_MOUSE +#ifdef CONFIG_ADBMOUSE adb_mouse_init(); #endif #ifdef CONFIG_RPCMOUSE diff --git a/drivers/char/buz.c b/drivers/char/buz.c index b535ac05e..91c131c56 100644 --- a/drivers/char/buz.c +++ b/drivers/char/buz.c @@ -3366,29 +3366,25 @@ static int find_zr36057(void) return zoran_num; } -#include "chipsets.h" - static void handle_chipset(void) { - int index; - struct pci_dev *dev = NULL; - - for (index = 0; index < sizeof(black) / sizeof(black[0]); index++) { - if ((dev = pci_find_device(black[index].vendor, black[index].device, dev)) != NULL) { - printk(KERN_INFO ": Host bridge: %s, ", black[index].name); - switch (black[index].action) { - - case TRITON: - printk("enabling Triton support.\n"); - triton = 1; - break; + if(pci_pci_problems&PCIPCI_FAIL) + { + printk(KERN_WARNING "buz: This configuration is known to have PCI to PCI DMA problems\n"); + printk(KERN_WARNING "buz: You may not be able to use overlay mode.\n"); + } + - case NATOMA: - printk("enabling Natoma workaround.\n"); - natoma = 1; - break; - } - } + if(pci_pci_problems&PCIPCI_TRITON) + { + printk("buz: Enabling Triton support.\n"); + triton = 1; + } + + if(pci_pci_problems&PCIPCI_NATOMA) + { + printk("buz: Enabling Natoma workaround.\n"); + natoma = 1; } } diff --git a/drivers/char/chipsets.h b/drivers/char/chipsets.h index 80c952553..e69de29bb 100644 --- a/drivers/char/chipsets.h +++ b/drivers/char/chipsets.h @@ -1,41 +0,0 @@ -static const struct { - unsigned short vendor; - unsigned short device; - enum { - TRITON, - NATOMA - } action; - const char *name; -} black[] = { - - { - PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82437, TRITON, "82437" - }, - { - PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82437VX, TRITON, "82437VX Triton II" - }, - { - PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82439, TRITON, "82439HX Triton II" - }, - { - PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82439TX, TRITON, "82439TX" - }, - { - PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82441, NATOMA, "82441FX Natoma" - }, - { - PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443LX_0, NATOMA, "440LX - 82443LX PAC Host" - }, - { - PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443LX_1, NATOMA, "440LX - 82443LX PAC AGP" - }, - { - PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443BX_0, NATOMA, "440BX - 82443BX Host" - }, - { - PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443BX_1, NATOMA, "440BX - 82443BX AGP" - }, - { - PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443BX_2, NATOMA, "440BX - 82443BX Host (no AGP)" - }, -}; diff --git a/drivers/char/pc_keyb.c b/drivers/char/pc_keyb.c index 1118cf950..0841df811 100644 --- a/drivers/char/pc_keyb.c +++ b/drivers/char/pc_keyb.c @@ -871,6 +871,8 @@ static int open_aux(struct inode * inode, struct file * file) aux_write_ack(AUX_ENABLE_DEV); /* Enable aux device */ kbd_write_cmd(AUX_INTS_ON); /* Enable controller ints */ + send_data(KBD_CMD_ENABLE); /* try to workaround toshiba4030cdt problem */ + return 0; } diff --git a/drivers/char/raw.c b/drivers/char/raw.c index c8936ceb6..365c5bd38 100644 --- a/drivers/char/raw.c +++ b/drivers/char/raw.c @@ -369,7 +369,7 @@ ssize_t rw_raw_dev(int rw, struct file *filp, char *buf, for (i=0; i < blocks; i++) b[i] = blocknr++; - err = brw_kiovec(rw, 1, &iobuf, dev, b, sector_size, 0); + err = brw_kiovec(rw, 1, &iobuf, dev, b, sector_size); if (err >= 0) { transferred += err; diff --git a/drivers/char/synclink.c b/drivers/char/synclink.c index d07532a17..cb3f1e0de 100644 --- a/drivers/char/synclink.c +++ b/drivers/char/synclink.c @@ -1,7 +1,7 @@ /* * linux/drivers/char/synclink.c * - * ==FILEDATE 19990610== + * ==FILEDATE 19990901== * * Device driver for Microgate SyncLink ISA and PCI * high speed multiprotocol serial adapters. @@ -50,6 +50,8 @@ #define BREAKPOINT() asm(" int $3"); #define MAX_ISA_DEVICES 10 +#define MAX_PCI_DEVICES 10 +#define MAX_TOTAL_DEVICES 20 #include <linux/config.h> #include <linux/module.h> @@ -91,6 +93,14 @@ #include <linux/termios.h> #include <linux/tqueue.h> +#if LINUX_VERSION_CODE < VERSION(2,3,0) +typedef struct wait_queue *wait_queue_head_t; +#define DECLARE_WAITQUEUE(name,task) struct wait_queue (name) = {(task),NULL} +#define init_waitqueue_head(head) *(head) = NULL +#define DECLARE_MUTEX(name) struct semaphore (name) = MUTEX +#define set_current_state(a) current->state = (a) +#endif + #if LINUX_VERSION_CODE >= VERSION(2,1,4) #include <asm/segment.h> #define GET_USER(error,value,addr) error = get_user(value,addr) @@ -297,6 +307,8 @@ struct mgsl_struct { unsigned int tx_buffer_count; /* count of total allocated Tx buffers */ DMABUFFERENTRY *tx_buffer_list; /* list of transmit buffer entries */ + + unsigned char *intermediate_rxbuffer; int rx_enabled; int rx_overflow; @@ -306,6 +318,7 @@ struct mgsl_struct { u32 idle_mode; u16 cmr_value; + u16 tcsr_value; char device_name[25]; /* device instance name */ @@ -345,8 +358,8 @@ struct mgsl_struct { u32 lcr_offset; u32 misc_ctrl_value; - char flag_buf[HDLC_MAX_FRAME_SIZE]; - char char_buf[HDLC_MAX_FRAME_SIZE]; + char flag_buf[MAX_ASYNC_BUFFER_SIZE]; + char char_buf[MAX_ASYNC_BUFFER_SIZE]; BOOLEAN drop_rts_on_tx_done; BOOLEAN loopmode_insert_requested; @@ -573,13 +586,21 @@ struct mgsl_struct { #define IDLEMODE_ALT_MARK_SPACE 0x0500 #define IDLEMODE_SPACE 0x0600 #define IDLEMODE_MARK 0x0700 +#define IDLEMODE_MASK 0x0700 + +/* + * IUSC revision identifiers + */ +#define IUSC_SL1660 0x4d44 +#define IUSC_PRE_SL1660 0x4553 /* * Transmit status Bits in Transmit Command/status Register (TCSR) */ -#define TCSR_PRESERVE 0x0700 +#define TCSR_PRESERVE 0x0F00 +#define TCSR_UNDERWAIT BIT11 #define TXSTATUS_PREAMBLE_SENT BIT7 #define TXSTATUS_IDLE_SENT BIT6 #define TXSTATUS_ABORT_SENT BIT5 @@ -590,7 +611,7 @@ struct mgsl_struct { #define TXSTATUS_UNDERRUN BIT1 #define TXSTATUS_FIFO_EMPTY BIT0 #define TXSTATUS_ALL 0x00fa -#define usc_UnlatchTxstatusBits(a,b) usc_OutReg( (a), TCSR, (u16)((a)->usc_idle_mode + ((b) & 0x00FF)) ) +#define usc_UnlatchTxstatusBits(a,b) usc_OutReg( (a), TCSR, (u16)((a)->tcsr_value + ((b) & 0x00FF)) ) #define MISCSTATUS_RXC_LATCHED BIT15 @@ -710,9 +731,10 @@ void usc_RTCmd( struct mgsl_struct *info, u16 Cmd ); void usc_RCmd( struct mgsl_struct *info, u16 Cmd ); void usc_TCmd( struct mgsl_struct *info, u16 Cmd ); -#define usc_TCmd(a,b) usc_OutReg((a), TCSR, (u16)((a)->usc_idle_mode + (b))) +#define usc_TCmd(a,b) usc_OutReg((a), TCSR, (u16)((a)->tcsr_value + (b))) #define usc_RCmd(a,b) usc_OutReg((a), RCSR, (b)) +void usc_process_rxoverrun_sync( struct mgsl_struct *info ); void usc_start_receiver( struct mgsl_struct *info ); void usc_stop_receiver( struct mgsl_struct *info ); @@ -799,6 +821,8 @@ int mgsl_alloc_frame_memory(struct mgsl_struct *info, DMABUFFERENTRY *BufferLis void mgsl_free_frame_memory(struct mgsl_struct *info, DMABUFFERENTRY *BufferList,int Buffercount); int mgsl_alloc_buffer_list_memory(struct mgsl_struct *info); void mgsl_free_buffer_list_memory(struct mgsl_struct *info); +int mgsl_alloc_intermediate_rxbuffer_memory(struct mgsl_struct *info); +void mgsl_free_intermediate_rxbuffer_memory(struct mgsl_struct *info); /* * Bottom half interrupt handlers @@ -886,6 +910,7 @@ static int io[MAX_ISA_DEVICES] = {0,}; static int irq[MAX_ISA_DEVICES] = {0,}; static int dma[MAX_ISA_DEVICES] = {0,}; static int debug_level = 0; +static int maxframe[MAX_TOTAL_DEVICES] = {0,}; #if LINUX_VERSION_CODE >= VERSION(2,1,0) @@ -896,10 +921,11 @@ MODULE_PARM(io,"1-" __MODULE_STRING(MAX_ISA_DEVICES) "i"); MODULE_PARM(irq,"1-" __MODULE_STRING(MAX_ISA_DEVICES) "i"); MODULE_PARM(dma,"1-" __MODULE_STRING(MAX_ISA_DEVICES) "i"); MODULE_PARM(debug_level,"i"); +MODULE_PARM(maxframe,"1-" __MODULE_STRING(MAX_TOTAL_DEVICES) "i"); #endif static char *driver_name = "SyncLink serial driver"; -static char *driver_version = "1.7"; +static char *driver_version = "1.14"; static struct tty_driver serial_driver, callout_driver; static int serial_refcount; @@ -1349,11 +1375,14 @@ void mgsl_isr_receive_status( struct mgsl_struct *info ) } if (status & RXSTATUS_OVERRUN){ - /* Purge receive FIFO to allow DMA buffer completion - * with overrun status stored in the receive status block. - */ - usc_RCmd( info, RCmd_EnterHuntmode ); - usc_RTCmd( info, RTCmd_PurgeRxFifo ); +// /* Purge receive FIFO to allow DMA buffer completion +// * with overrun status stored in the receive status block. +// */ +// usc_RCmd( info, RCmd_EnterHuntmode ); +// usc_RTCmd( info, RTCmd_PurgeRxFifo ); + + info->icount.rxover++; + usc_process_rxoverrun_sync( info ); } usc_ClearIrqPendingBits( info, RECEIVE_STATUS ); @@ -1381,6 +1410,17 @@ void mgsl_isr_transmit_status( struct mgsl_struct *info ) usc_ClearIrqPendingBits( info, TRANSMIT_STATUS ); usc_UnlatchTxstatusBits( info, status ); + + if ( status & (TXSTATUS_UNDERRUN | TXSTATUS_ABORT_SENT) ) + { + /* finished sending HDLC abort. This may leave */ + /* the TxFifo with data from the aborted frame */ + /* so purge the TxFifo. Also shutdown the DMA */ + /* channel in case there is data remaining in */ + /* the DMA buffer */ + usc_DmaCmd( info, DmaCmd_ResetTxChannel ); + usc_RTCmd( info, RTCmd_PurgeTxFifo ); + } if ( status & TXSTATUS_EOF_SENT ) info->icount.txok++; @@ -3343,7 +3383,7 @@ static void mgsl_close(struct tty_struct *tty, struct file * filp) if (info->blocked_open) { if (info->close_delay) { - current->state = TASK_INTERRUPTIBLE; + set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(info->close_delay); } wake_up_interruptible(&info->open_wait); @@ -3412,7 +3452,7 @@ static void mgsl_wait_until_sent(struct tty_struct *tty, int timeout) if ( info->params.mode == MGSL_MODE_HDLC ) { while (info->tx_active) { - current->state = TASK_INTERRUPTIBLE; + set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(char_time); if (signal_pending(current)) break; @@ -3422,7 +3462,7 @@ static void mgsl_wait_until_sent(struct tty_struct *tty, int timeout) } else { while (!(usc_InReg(info,TCSR) & TXSTATUS_ALL_SENT) && info->tx_enabled) { - current->state = TASK_INTERRUPTIBLE; + set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(char_time); if (signal_pending(current)) break; @@ -3431,7 +3471,7 @@ static void mgsl_wait_until_sent(struct tty_struct *tty, int timeout) } } - current->state = TASK_RUNNING; + set_current_state(TASK_RUNNING); exit: if (debug_level >= DEBUG_LEVEL_INFO) printk("%s(%d):mgsl_wait_until_sent(%s) exit\n", @@ -3589,7 +3629,7 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp, schedule(); } - current->state = TASK_RUNNING; + set_current_state(TASK_RUNNING); remove_wait_queue(&info->open_wait, &wait); if (extra_count) @@ -3799,7 +3839,7 @@ static inline int line_info(char *buf, struct mgsl_struct *info) spin_lock_irqsave(&info->irq_spinlock,flags); { - u16 Tscr = usc_InReg( info, TCSR ); + u16 Tcsr = usc_InReg( info, TCSR ); u16 Tdmr = usc_InDmaReg( info, TDMR ); u16 Ticr = usc_InReg( info, TICR ); u16 Rscr = usc_InReg( info, RCSR ); @@ -3812,7 +3852,7 @@ static inline int line_info(char *buf, struct mgsl_struct *info) u16 Ccar = inw( info->io_base + CCAR ); ret += sprintf(buf+ret, "tcsr=%04X tdmr=%04X ticr=%04X rcsr=%04X rdmr=%04X\n" "ricr=%04X icr =%04X dccr=%04X tmr=%04X tccr=%04X ccar=%04X\n", - Tscr,Tdmr,Ticr,Rscr,Rdmr,Ricr,Icr,Dccr,Tmr,Tccr,Ccar ); + Tcsr,Tdmr,Ticr,Rscr,Rdmr,Ricr,Icr,Dccr,Tmr,Tccr,Ccar ); } spin_unlock_irqrestore(&info->irq_spinlock,flags); @@ -3878,30 +3918,45 @@ int mgsl_allocate_dma_buffers(struct mgsl_struct *info) unsigned short BuffersPerFrame; info->last_mem_alloc = 0; - + + /* Calculate the number of DMA buffers necessary to hold the */ + /* largest allowable frame size. Note: If the max frame size is */ + /* not an even multiple of the DMA buffer size then we need to */ + /* round the buffer count per frame up one. */ + + BuffersPerFrame = (unsigned short)(info->max_frame_size/DMABUFFERSIZE); + if ( info->max_frame_size % DMABUFFERSIZE ) + BuffersPerFrame++; + if ( info->bus_type == MGSL_BUS_TYPE_PCI ) { /* * The PCI adapter has 256KBytes of shared memory to use. - * This is 64 PAGE_SIZE buffers. 1 is used for the buffer - * list. 2 are used for the transmit and one is left as - * a spare. The 4K buffer list can hold 128 DMA_BUFFER - * structures at 32bytes each. + * This is 64 PAGE_SIZE buffers. + * + * The first page is used for padding at this time so the + * buffer list does not begin at offset 0 of the PCI + * adapter's shared memory. + * + * The 2nd page is used for the buffer list. A 4K buffer + * list can hold 128 DMA_BUFFER structures at 32 bytes + * each. + * + * This leaves 62 4K pages. + * + * The next N pages are used for a transmit frame. We + * reserve enough 4K page blocks to hold the configured + * MaxFrameSize + * + * Of the remaining pages (62-N), determine how many can + * be used to receive full MaxFrameSize inbound frames */ - - info->rx_buffer_count = 60; - info->tx_buffer_count = 2; + + info->tx_buffer_count = BuffersPerFrame; + info->rx_buffer_count = 62 - info->tx_buffer_count; } else { /* Calculate the number of PAGE_SIZE buffers needed for */ /* receive and transmit DMA buffers. */ - /* Calculate the number of DMA buffers necessary to hold the */ - /* largest allowable frame size. Note: If the max frame size is */ - /* not an even multiple of the DMA buffer size then we need to */ - /* round the buffer count per frame up one. */ - - BuffersPerFrame = (unsigned short)(info->max_frame_size/DMABUFFERSIZE); - if ( info->max_frame_size % DMABUFFERSIZE ) - BuffersPerFrame++; /* Calculate the number of DMA buffers necessary to */ /* hold 7 max size receive frames and one max size transmit frame. */ @@ -3909,8 +3964,17 @@ int mgsl_allocate_dma_buffers(struct mgsl_struct *info) /* End of List condition if all receive buffers are used when */ /* using linked list DMA buffers. */ - info->rx_buffer_count = (BuffersPerFrame * MAXRXFRAMES) + 6; info->tx_buffer_count = BuffersPerFrame; + info->rx_buffer_count = (BuffersPerFrame * MAXRXFRAMES) + 6; + + /* + * limit total TxBuffers & RxBuffers to 62 4K total + * (ala PCI Allocation) + */ + + if ( (info->tx_buffer_count + info->rx_buffer_count) > 62 ) + info->rx_buffer_count = 62 - info->tx_buffer_count; + } if ( debug_level >= DEBUG_LEVEL_INFO ) @@ -3919,7 +3983,8 @@ int mgsl_allocate_dma_buffers(struct mgsl_struct *info) if ( mgsl_alloc_buffer_list_memory( info ) < 0 || mgsl_alloc_frame_memory(info, info->rx_buffer_list, info->rx_buffer_count) < 0 || - mgsl_alloc_frame_memory(info, info->tx_buffer_list, info->tx_buffer_count) < 0) { + mgsl_alloc_frame_memory(info, info->tx_buffer_list, info->tx_buffer_count) < 0 || + mgsl_alloc_intermediate_rxbuffer_memory(info) < 0 ) { printk("%s(%d):Can't allocate DMA buffer memory\n",__FILE__,__LINE__); return -ENOMEM; } @@ -4146,6 +4211,48 @@ void mgsl_free_dma_buffers( struct mgsl_struct *info ) } /* end of mgsl_free_dma_buffers() */ + +/* + * mgsl_alloc_intermediate_rxbuffer_memory() + * + * Allocate a buffer large enough to hold max_frame_size. This buffer + * is used to pass an assembled frame to the line discipline. + * + * Arguments: + * + * info pointer to device instance data + * + * Return Value: 0 if success, otherwise -ENOMEM + */ +int mgsl_alloc_intermediate_rxbuffer_memory(struct mgsl_struct *info) +{ + info->intermediate_rxbuffer = kmalloc(info->max_frame_size, GFP_KERNEL | GFP_DMA); + if ( info->intermediate_rxbuffer == NULL ) + return -ENOMEM; + + return 0; + +} /* end of mgsl_alloc_intermediate_rxbuffer_memory() */ + +/* + * mgsl_free_intermediate_rxbuffer_memory() + * + * + * Arguments: + * + * info pointer to device instance data + * + * Return Value: None + */ +void mgsl_free_intermediate_rxbuffer_memory(struct mgsl_struct *info) +{ + if ( info->intermediate_rxbuffer ) + kfree_s( info->intermediate_rxbuffer, info->max_frame_size); + + info->intermediate_rxbuffer = NULL; + +} /* end of mgsl_free_intermediate_rxbuffer_memory() */ + /* mgsl_claim_resources() * * Claim all resources used by a device @@ -4254,6 +4361,7 @@ void mgsl_release_resources(struct mgsl_struct *info) info->dma_requested = 0; } mgsl_free_dma_buffers(info); + mgsl_free_intermediate_rxbuffer_memory(info); if ( info->io_addr_requested ) { release_region(info->io_base,info->io_addr_size); @@ -4301,13 +4409,20 @@ void mgsl_add_device( struct mgsl_struct *info ) current_dev->next_device = info; } + if ( info->max_frame_size < 4096 ) + info->max_frame_size = 4096; + else if ( info->max_frame_size > 65535 ) + info->max_frame_size = 65535; + if ( info->bus_type == MGSL_BUS_TYPE_PCI ) { - printk( "SyncLink device %s added:PCI bus IO=%04X IRQ=%d Mem=%08X LCR=%08X\n", + printk( "SyncLink device %s added:PCI bus IO=%04X IRQ=%d Mem=%08X LCR=%08X MaxFrameSize=%u\n", info->device_name, info->io_base, info->irq_level, - info->phys_memory_base, info->phys_lcr_base ); + info->phys_memory_base, info->phys_lcr_base, + info->max_frame_size ); } else { - printk( "SyncLink device %s added:ISA bus IO=%04X IRQ=%d DMA=%d\n", - info->device_name, info->io_base, info->irq_level, info->dma_level ); + printk( "SyncLink device %s added:ISA bus IO=%04X IRQ=%d DMA=%d MaxFrameSize=%u\n", + info->device_name, info->io_base, info->irq_level, info->dma_level, + info->max_frame_size ); } } /* end of mgsl_add_device() */ @@ -4316,7 +4431,7 @@ void mgsl_add_device( struct mgsl_struct *info ) * * Allocate and initialize a device instance structure * - * Arguments: None + * Arguments: none * Return Value: pointer to mgsl_struct if success, otherwise NULL */ struct mgsl_struct* mgsl_allocate_device() @@ -4362,6 +4477,7 @@ int mgsl_enumerate_devices() { struct mgsl_struct *info; int i; + int num_devices = 0; /* Check for user specified ISA devices */ @@ -4391,9 +4507,16 @@ int mgsl_enumerate_devices() info->bus_type = MGSL_BUS_TYPE_ISA; info->io_addr_size = 16; info->irq_flags = 0; + + /* override default max frame size if arg available */ + if ( num_devices < MAX_TOTAL_DEVICES && + maxframe[num_devices] ) + info->max_frame_size = maxframe[num_devices]; /* add new device to device list */ mgsl_add_device( info ); + + ++num_devices; } @@ -4478,6 +4601,11 @@ int mgsl_enumerate_devices() info->irq_flags = SA_SHIRQ; info->bus = bus; info->function = func; + + /* override default max frame size if arg available */ + if ( num_devices < MAX_TOTAL_DEVICES && + maxframe[num_devices] ) + info->max_frame_size = maxframe[num_devices]; /* Store the PCI9050 misc control register value because a flaw * in the PCI9050 prevents LCR registers from being read if @@ -4860,6 +4988,24 @@ u16 usc_InReg( struct mgsl_struct *info, u16 RegAddr ) void usc_set_sdlc_mode( struct mgsl_struct *info ) { u16 RegValue; + int PreSL1660; + + /* + * determine if the IUSC on the adapter is pre-SL1660. If + * not, take advantage of the UnderWait feature of more + * modern chips. If an underrun occurs and this bit is set, + * the transmitter will idle the programmed idle pattern + * until the driver has time to service the underrun. Otherwise, + * the dma controller may get the cycles previously requested + * and begin transmitting queued tx data. + */ + usc_OutReg(info,TMCR,0x1f); + RegValue=usc_InReg(info,TMDR); + if ( RegValue == IUSC_PRE_SL1660 ) + PreSL1660 = 1; + else + PreSL1660 = 0; + if ( info->params.flags & HDLC_FLAG_HDLC_LOOPMODE ) { @@ -4951,6 +5097,8 @@ void usc_set_sdlc_mode( struct mgsl_struct *info ) if ( info->params.crc_type == HDLC_CRC_16_CCITT ) RegValue |= BIT9; + else if ( info->params.crc_type == HDLC_CRC_32_CCITT ) + RegValue |= ( BIT12 | BIT10 | BIT9 ); usc_OutReg( info, RMR, RegValue ); @@ -5026,6 +5174,8 @@ void usc_set_sdlc_mode( struct mgsl_struct *info ) if ( info->params.crc_type == HDLC_CRC_16_CCITT ) RegValue |= BIT9 + BIT8; + else if ( info->params.crc_type == HDLC_CRC_32_CCITT ) + RegValue |= ( BIT12 | BIT10 | BIT9 | BIT8); usc_OutReg( info, TMR, RegValue ); @@ -5057,6 +5207,30 @@ void usc_set_sdlc_mode( struct mgsl_struct *info ) usc_UnlatchTxstatusBits( info, TXSTATUS_ALL ); usc_ClearIrqPendingBits( info, TRANSMIT_STATUS ); + /* + ** Transmit Command/Status Register (TCSR) + ** + ** <15..12> 0000 TCmd + ** <11> 0/1 UnderWait + ** <10..08> 000 TxIdle + ** <7> x PreSent + ** <6> x IdleSent + ** <5> x AbortSent + ** <4> x EOF/EOM Sent + ** <3> x CRC Sent + ** <2> x All Sent + ** <1> x TxUnder + ** <0> x TxEmpty + ** + ** 0000 0000 0000 0000 = 0x0000 + */ + info->tcsr_value = 0; + + if ( !PreSL1660 ) + info->tcsr_value |= TCSR_UNDERWAIT; + + usc_OutReg( info, TCSR, info->tcsr_value ); + /* Clock mode Control Register (CMCR) * * <15..14> 00 counter 1 Source = Disabled @@ -5472,6 +5646,152 @@ void usc_enable_aux_clock( struct mgsl_struct *info, u32 data_rate ) } /* end of usc_enable_aux_clock() */ +/* + * + * usc_process_rxoverrun_sync() + * + * This function processes a receive overrun by resetting the + * receive DMA buffers and issuing a Purge Rx FIFO command + * to allow the receiver to continue receiving. + * + * Arguments: + * + * info pointer to device extension + * + * Return Value: None + */ +void usc_process_rxoverrun_sync( struct mgsl_struct *info ) +{ + int start_index; + int end_index; + int frame_start_index; + int start_of_frame_found = FALSE; + int end_of_frame_found = FALSE; + int reprogram_dma = FALSE; + + DMABUFFERENTRY *buffer_list = info->rx_buffer_list; + u32 phys_addr; + + usc_DmaCmd( info, DmaCmd_PauseRxChannel ); + usc_RCmd( info, RCmd_EnterHuntmode ); + usc_RTCmd( info, RTCmd_PurgeRxFifo ); + + /* CurrentRxBuffer points to the 1st buffer of the next */ + /* possibly available receive frame. */ + + frame_start_index = start_index = end_index = info->current_rx_buffer; + + /* Search for an unfinished string of buffers. This means */ + /* that a receive frame started (at least one buffer with */ + /* count set to zero) but there is no terminiting buffer */ + /* (status set to non-zero). */ + + while( !buffer_list[end_index].count ) + { + /* Count field has been reset to zero by 16C32. */ + /* This buffer is currently in use. */ + + if ( !start_of_frame_found ) + { + start_of_frame_found = TRUE; + frame_start_index = end_index; + end_of_frame_found = FALSE; + } + + if ( buffer_list[end_index].status ) + { + /* Status field has been set by 16C32. */ + /* This is the last buffer of a received frame. */ + + /* We want to leave the buffers for this frame intact. */ + /* Move on to next possible frame. */ + + start_of_frame_found = FALSE; + end_of_frame_found = TRUE; + } + + /* advance to next buffer entry in linked list */ + end_index++; + if ( end_index == info->rx_buffer_count ) + end_index = 0; + + if ( start_index == end_index ) + { + /* The entire list has been searched with all Counts == 0 and */ + /* all Status == 0. The receive buffers are */ + /* completely screwed, reset all receive buffers! */ + mgsl_reset_rx_dma_buffers( info ); + frame_start_index = 0; + start_of_frame_found = FALSE; + reprogram_dma = TRUE; + break; + } + } + + if ( start_of_frame_found && !end_of_frame_found ) + { + /* There is an unfinished string of receive DMA buffers */ + /* as a result of the receiver overrun. */ + + /* Reset the buffers for the unfinished frame */ + /* and reprogram the receive DMA controller to start */ + /* at the 1st buffer of unfinished frame. */ + + start_index = frame_start_index; + + do + { + *((unsigned long *)&(info->rx_buffer_list[start_index++].count)) = DMABUFFERSIZE; + + /* Adjust index for wrap around. */ + if ( start_index == info->rx_buffer_count ) + start_index = 0; + + } while( start_index != end_index ); + + reprogram_dma = TRUE; + } + + if ( reprogram_dma ) + { + usc_UnlatchRxstatusBits(info,RXSTATUS_ALL); + usc_ClearIrqPendingBits(info, RECEIVE_DATA|RECEIVE_STATUS); + usc_UnlatchRxstatusBits(info, RECEIVE_DATA|RECEIVE_STATUS); + + usc_EnableReceiver(info,DISABLE_UNCONDITIONAL); + + /* This empties the receive FIFO and loads the RCC with RCLR */ + usc_OutReg( info, CCSR, (u16)(usc_InReg(info,CCSR) | BIT13) ); + + /* program 16C32 with physical address of 1st DMA buffer entry */ + phys_addr = info->rx_buffer_list[frame_start_index].phys_entry; + usc_OutDmaReg( info, NRARL, (u16)phys_addr ); + usc_OutDmaReg( info, NRARU, (u16)(phys_addr >> 16) ); + + usc_UnlatchRxstatusBits( info, RXSTATUS_ALL ); + usc_ClearIrqPendingBits( info, RECEIVE_DATA + RECEIVE_STATUS ); + usc_EnableInterrupts( info, RECEIVE_STATUS ); + + /* 1. Arm End of Buffer (EOB) Receive DMA Interrupt (BIT2 of RDIAR) */ + /* 2. Enable Receive DMA Interrupts (BIT1 of DICR) */ + + usc_OutDmaReg( info, RDIAR, BIT3 + BIT2 ); + usc_OutDmaReg( info, DICR, (u16)(usc_InDmaReg(info,DICR) | BIT1) ); + usc_DmaCmd( info, DmaCmd_InitRxChannel ); + if ( info->params.flags & HDLC_FLAG_AUTO_DCD ) + usc_EnableReceiver(info,ENABLE_AUTO_DCD); + else + usc_EnableReceiver(info,ENABLE_UNCONDITIONAL); + } + else + { + /* This empties the receive FIFO and loads the RCC with RCLR */ + usc_OutReg( info, CCSR, (u16)(usc_InReg(info,CCSR) | BIT13) ); + usc_RTCmd( info, RTCmd_PurgeRxFifo ); + } + +} /* end of usc_process_rxoverrun_sync() */ + /* usc_stop_receiver() * * Disable USC receiver @@ -6155,7 +6475,10 @@ void usc_set_txidle( struct mgsl_struct *info ) } info->usc_idle_mode = usc_idle_mode; - usc_OutReg(info, TCSR, usc_idle_mode); + //usc_OutReg(info, TCSR, usc_idle_mode); + info->tcsr_value &= ~IDLEMODE_MASK; /* clear idle mode bits */ + info->tcsr_value += usc_idle_mode; + usc_OutReg(info, TCSR, info->tcsr_value); } /* end of usc_set_txidle() */ @@ -6493,6 +6816,8 @@ int mgsl_get_rx_frame(struct mgsl_struct *info) /* adjust frame size for CRC if any */ if ( info->params.crc_type == HDLC_CRC_16_CCITT ) framesize -= 2; + else if ( info->params.crc_type == HDLC_CRC_32_CCITT ) + framesize -= 4; } if ( debug_level >= DEBUG_LEVEL_BH ) @@ -6501,16 +6826,49 @@ int mgsl_get_rx_frame(struct mgsl_struct *info) if ( debug_level >= DEBUG_LEVEL_DATA ) mgsl_trace_block(info,info->rx_buffer_list[StartIndex].virt_addr, - framesize,0); + MIN(framesize,DMABUFFERSIZE),0); if (framesize) { - if (framesize > HDLC_MAX_FRAME_SIZE) + if (framesize > info->max_frame_size) info->icount.rxlong++; else { +#if 1 + /* + * copy contents of dma frame buffer(s) to intermediate + * rxbuffer for presentation to line discipline + */ + int copy_count = framesize; + int index = StartIndex; + unsigned char *ptmp = info->intermediate_rxbuffer; + + info->icount.rxok++; + + while( copy_count ) + { + int partial_count; + if ( copy_count > DMABUFFERSIZE ) + partial_count = DMABUFFERSIZE; + else + partial_count = copy_count; + + pBufEntry = &(info->rx_buffer_list[index]); + memcpy( ptmp, pBufEntry->virt_addr, partial_count ); + ptmp += partial_count; + copy_count -= partial_count; + + if ( ++index == info->rx_buffer_count ) + index = 0; + + } + + /* Call the line discipline receive callback directly. */ + tty->ldisc.receive_buf(tty, info->intermediate_rxbuffer, info->flag_buf, framesize); +#else info->icount.rxok++; pBufEntry = &(info->rx_buffer_list[StartIndex]); /* Call the line discipline receive callback directly. */ tty->ldisc.receive_buf(tty, pBufEntry->virt_addr, info->flag_buf, framesize); +#endif } } /* Free the buffers used by this frame. */ @@ -6526,8 +6884,8 @@ Cleanup: * receive buffers are now empty, then restart receiver. */ - if ( !info->rx_buffer_list[info->current_rx_buffer].status && - info->rx_buffer_list[info->current_rx_buffer].count ) { + if ( !info->rx_buffer_list[EndIndex].status && + info->rx_buffer_list[EndIndex].count ) { spin_lock_irqsave(&info->irq_spinlock,flags); usc_start_receiver(info); spin_unlock_irqrestore(&info->irq_spinlock,flags); @@ -6558,7 +6916,7 @@ void mgsl_load_tx_dma_buffer(struct mgsl_struct *info, const char *Buffer, DMABUFFERENTRY *pBufEntry; if ( debug_level >= DEBUG_LEVEL_DATA ) - mgsl_trace_block(info,Buffer,BufferSize,1); + mgsl_trace_block(info,Buffer, MIN(BufferSize,DMABUFFERSIZE), 1); if (info->params.flags & HDLC_FLAG_HDLC_LOOPMODE) { /* set CMR:13 to start transmit when @@ -6701,9 +7059,9 @@ BOOLEAN mgsl_irq_test( struct mgsl_struct *info ) EndTime=100; while( EndTime-- && !info->irq_occurred ) { - current->state = TASK_INTERRUPTIBLE; + set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(jiffies_from_ms(10)); - current->state = TASK_RUNNING; + set_current_state(TASK_RUNNING); } spin_lock_irqsave(&info->irq_spinlock,flags); @@ -6883,7 +7241,7 @@ BOOLEAN mgsl_dma_test( struct mgsl_struct *info ) /* unlatch Tx status bits, and start transmit channel. */ - usc_OutReg( info, TCSR, (unsigned short)(( usc_InReg(info, TCSR) & 0x0700) | 0xfa) ); + usc_OutReg( info, TCSR, (unsigned short)(( usc_InReg(info, TCSR) & 0x0f00) | 0xfa) ); usc_DmaCmd( info, DmaCmd_InitTxChannel ); /* wait for DMA controller to fill transmit FIFO */ diff --git a/drivers/i2o/i2o_block.c b/drivers/i2o/i2o_block.c index 4bcb7dd8a..5042f4e97 100644 --- a/drivers/i2o/i2o_block.c +++ b/drivers/i2o/i2o_block.c @@ -643,27 +643,9 @@ static int i2ob_ioctl(struct inode *inode, struct file *file, dev = &i2ob_dev[minor]; switch (cmd) { - case BLKRASET: - if(!capable(CAP_SYS_ADMIN)) return -EACCES; - if(arg > 0xff) return -EINVAL; - read_ahead[MAJOR(inode->i_rdev)] = arg; - return 0; - - case BLKRAGET: - if (!arg) return -EINVAL; - return put_user(read_ahead[MAJOR(inode->i_rdev)], - (long *) arg); case BLKGETSIZE: return put_user(i2ob[minor].nr_sects, (long *) arg); - case BLKFLSBUF: - if(!capable(CAP_SYS_ADMIN)) - return -EACCES; - - fsync_dev(inode->i_rdev); - invalidate_buffers(inode->i_rdev); - return 0; - case HDIO_GETGEO: { struct hd_geometry g; @@ -679,8 +661,16 @@ static int i2ob_ioctl(struct inode *inode, struct file *file, return -EACCES; return do_i2ob_revalidate(inode->i_rdev,1); - default: + case BLKFLSBUF: + case BLKROSET: + case BLKROGET: + case BLKRASET: + case BLKRAGET: + case BLKPG: return blk_ioctl(inode->i_rdev, cmd, arg); + + default: + return -EINVAL; } } diff --git a/drivers/isdn/Config.in b/drivers/isdn/Config.in index ec27982bb..52b80809b 100644 --- a/drivers/isdn/Config.in +++ b/drivers/isdn/Config.in @@ -2,77 +2,76 @@ # ISDN device configuration # if [ "$CONFIG_INET" != "n" ]; then - bool 'Support synchronous PPP' CONFIG_ISDN_PPP - if [ "$CONFIG_ISDN_PPP" != "n" ]; then - bool 'Use VJ-compression with synchronous PPP' CONFIG_ISDN_PPP_VJ - bool 'Support generic MP (RFC 1717)' CONFIG_ISDN_MPP - fi + bool ' Support synchronous PPP' CONFIG_ISDN_PPP + if [ "$CONFIG_ISDN_PPP" != "n" ]; then + bool ' Use VJ-compression with synchronous PPP' CONFIG_ISDN_PPP_VJ + bool ' Support generic MP (RFC 1717)' CONFIG_ISDN_MPP + fi fi -bool 'Support audio via ISDN' CONFIG_ISDN_AUDIO +bool ' Support audio via ISDN' CONFIG_ISDN_AUDIO if [ "$CONFIG_ISDN_AUDIO" != "n" ]; then - bool 'Support AT-Fax Class 2 commands' CONFIG_ISDN_TTY_FAX + bool ' Support AT-Fax Class 2 commands' CONFIG_ISDN_TTY_FAX fi -bool 'Support isdn diversion services' CONFIG_ISDN_DIVERSION -if [ "$CONFIG_X25" != "n" ]; then - bool 'X.25 PLP on top of ISDN (EXPERIMENTAL)' CONFIG_ISDN_X25 +bool ' Support isdn diversion services' CONFIG_ISDN_DIVERSION +if [ "$CONFIG_X25" != "n" -a "$CONFIG_EXPERIMENTAL" = "y" ]; then + bool ' X.25 PLP on top of ISDN (EXPERIMENTAL)' CONFIG_ISDN_X25 fi -dep_tristate 'ICN 2B and 4B support' CONFIG_ISDN_DRV_ICN $CONFIG_ISDN -dep_tristate 'isdnloop support' CONFIG_ISDN_DRV_LOOP $CONFIG_ISDN -dep_tristate 'PCBIT-D support' CONFIG_ISDN_DRV_PCBIT $CONFIG_ISDN -dep_tristate 'HiSax SiemensChipSet driver support' CONFIG_ISDN_DRV_HISAX $CONFIG_ISDN +dep_tristate ' ICN 2B and 4B support' CONFIG_ISDN_DRV_ICN $CONFIG_ISDN +dep_tristate ' isdnloop support' CONFIG_ISDN_DRV_LOOP $CONFIG_ISDN +dep_tristate ' PCBIT-D support' CONFIG_ISDN_DRV_PCBIT $CONFIG_ISDN +dep_tristate ' HiSax SiemensChipSet driver support' CONFIG_ISDN_DRV_HISAX $CONFIG_ISDN if [ "$CONFIG_ISDN_DRV_HISAX" != "n" ]; then - bool 'HiSax Support for EURO/DSS1' CONFIG_HISAX_EURO - if [ "$CONFIG_HISAX_EURO" != "n" ]; then - bool 'Support for german chargeinfo' CONFIG_DE_AOC - bool 'Disable sending complete' CONFIG_HISAX_NO_SENDCOMPLETE - bool 'Disable sending low layer compatibility' CONFIG_HISAX_NO_LLC - fi - bool 'HiSax Support for german 1TR6' CONFIG_HISAX_1TR6 - bool 'HiSax Support for Teles 16.0/8.0' CONFIG_HISAX_16_0 - bool 'HiSax Support for Teles 16.3 or PNP or PCMCIA' CONFIG_HISAX_16_3 - bool 'HiSax Support for Teles PCI' CONFIG_HISAX_TELESPCI - bool 'HiSax Support for Teles S0Box' CONFIG_HISAX_S0BOX - bool 'HiSax Support for AVM A1 (Fritz)' CONFIG_HISAX_AVM_A1 - bool 'HiSax Support for AVM PnP/PCI (Fritz!PnP/PCI)' CONFIG_HISAX_FRITZPCI - bool 'HiSax Support for AVM A1 PCMCIA (Fritz)' CONFIG_HISAX_AVM_A1_PCMCIA - bool 'HiSax Support for Elsa cards' CONFIG_HISAX_ELSA - bool 'HiSax Support for ITK ix1-micro Revision 2' CONFIG_HISAX_IX1MICROR2 - bool 'HiSax Support for Eicon.Diehl Diva cards' CONFIG_HISAX_DIEHLDIVA - bool 'HiSax Support for ASUSCOM cards' CONFIG_HISAX_ASUSCOM - bool 'HiSax Support for TELEINT cards' CONFIG_HISAX_TELEINT - bool 'HiSax Support for HFC-S based cards' CONFIG_HISAX_HFCS - bool 'HiSax Support for Sedlbauer cards' CONFIG_HISAX_SEDLBAUER - bool 'HiSax Support for USR Sportster internal TA' CONFIG_HISAX_SPORTSTER - bool 'HiSax Support for MIC card' CONFIG_HISAX_MIC - bool 'HiSax Support for NETjet card' CONFIG_HISAX_NETJET - bool 'HiSax Support for Niccy PnP/PCI card' CONFIG_HISAX_NICCY - bool 'HiSax Support for Siemens I-Surf card' CONFIG_HISAX_ISURF - bool 'HiSax Support for HST Saphir card' CONFIG_HISAX_HSTSAPHIR - bool 'HiSax Support for Telekom A4T card' CONFIG_HISAX_BKM_A4T - bool 'HiSax Support for Scitel Quadro card' CONFIG_HISAX_SCT_QUADRO - bool 'HiSax Support for Gazel cards' CONFIG_HISAX_GAZEL - bool 'HiSax Support for HFC PCI-Bus cards' CONFIG_HISAX_HFC_PCI - if [ "$CONFIG_EXPERIMENTAL" != "n" ]; then -# bool 'HiSax Support for TESTEMULATOR (EXPERIMENTAL)' CONFIG_HISAX_TESTEMU - if [ "$ARCH" = "sparc" -o "$ARCH" = "sparc64" ]; then - bool 'HiSax Support for Am7930' CONFIG_HISAX_AMD7930 - fi - fi + bool ' HiSax Support for EURO/DSS1' CONFIG_HISAX_EURO + if [ "$CONFIG_HISAX_EURO" != "n" ]; then + bool ' Support for german chargeinfo' CONFIG_DE_AOC + bool ' Disable sending complete' CONFIG_HISAX_NO_SENDCOMPLETE + bool ' Disable sending low layer compatibility' CONFIG_HISAX_NO_LLC + fi + bool ' HiSax Support for german 1TR6' CONFIG_HISAX_1TR6 + bool ' HiSax Support for Teles 16.0/8.0' CONFIG_HISAX_16_0 + bool ' HiSax Support for Teles 16.3 or PNP or PCMCIA' CONFIG_HISAX_16_3 + bool ' HiSax Support for Teles PCI' CONFIG_HISAX_TELESPCI + bool ' HiSax Support for Teles S0Box' CONFIG_HISAX_S0BOX + bool ' HiSax Support for AVM A1 (Fritz)' CONFIG_HISAX_AVM_A1 + bool ' HiSax Support for AVM PnP/PCI (Fritz!PnP/PCI)' CONFIG_HISAX_FRITZPCI + bool ' HiSax Support for AVM A1 PCMCIA (Fritz)' CONFIG_HISAX_AVM_A1_PCMCIA + bool ' HiSax Support for Elsa cards' CONFIG_HISAX_ELSA + bool ' HiSax Support for ITK ix1-micro Revision 2' CONFIG_HISAX_IX1MICROR2 + bool ' HiSax Support for Eicon.Diehl Diva cards' CONFIG_HISAX_DIEHLDIVA + bool ' HiSax Support for ASUSCOM cards' CONFIG_HISAX_ASUSCOM + bool ' HiSax Support for TELEINT cards' CONFIG_HISAX_TELEINT + bool ' HiSax Support for HFC-S based cards' CONFIG_HISAX_HFCS + bool ' HiSax Support for Sedlbauer cards' CONFIG_HISAX_SEDLBAUER + bool ' HiSax Support for USR Sportster internal TA' CONFIG_HISAX_SPORTSTER + bool ' HiSax Support for MIC card' CONFIG_HISAX_MIC + bool ' HiSax Support for NETjet card' CONFIG_HISAX_NETJET + bool ' HiSax Support for Niccy PnP/PCI card' CONFIG_HISAX_NICCY + bool ' HiSax Support for Siemens I-Surf card' CONFIG_HISAX_ISURF + bool ' HiSax Support for HST Saphir card' CONFIG_HISAX_HSTSAPHIR + bool ' HiSax Support for Telekom A4T card' CONFIG_HISAX_BKM_A4T + bool ' HiSax Support for Scitel Quadro card' CONFIG_HISAX_SCT_QUADRO + bool ' HiSax Support for Gazel cards' CONFIG_HISAX_GAZEL + bool ' HiSax Support for HFC PCI-Bus cards' CONFIG_HISAX_HFC_PCI + if [ "$CONFIG_EXPERIMENTAL" != "n" ]; then +# bool ' HiSax Support for TESTEMULATOR (EXPERIMENTAL)' CONFIG_HISAX_TESTEMU + if [ "$ARCH" = "sparc" -o "$ARCH" = "sparc64" ]; then + bool ' HiSax Support for Am7930' CONFIG_HISAX_AMD7930 + fi + fi fi if [ "$CONFIG_EXPERIMENTAL" != "n" ]; then - dep_tristate 'Spellcaster support (EXPERIMENTAL)' CONFIG_ISDN_DRV_SC $CONFIG_ISDN - dep_tristate 'IBM Active 2000 support (EXPERIMENTAL)' CONFIG_ISDN_DRV_ACT2000 $CONFIG_ISDN + dep_tristate ' Spellcaster support (EXPERIMENTAL)' CONFIG_ISDN_DRV_SC $CONFIG_ISDN + dep_tristate ' IBM Active 2000 support (EXPERIMENTAL)' CONFIG_ISDN_DRV_ACT2000 $CONFIG_ISDN fi -dep_tristate 'Eicon.Diehl active card support' CONFIG_ISDN_DRV_EICON $CONFIG_ISDN +dep_tristate ' Eicon.Diehl active card support' CONFIG_ISDN_DRV_EICON $CONFIG_ISDN if [ "$CONFIG_ISDN_DRV_EICON" != "n" ]; then - bool 'Eicon S,SX,SCOM,Quadro,S2M support' CONFIG_ISDN_DRV_EICON_ISA + bool ' Eicon S, SX, SCOM, Quadro, S2M support' CONFIG_ISDN_DRV_EICON_ISA fi -dep_tristate 'AVM CAPI2.0 support' CONFIG_ISDN_DRV_AVMB1 $CONFIG_ISDN +dep_tristate ' AVM CAPI2.0 support' CONFIG_ISDN_DRV_AVMB1 $CONFIG_ISDN if [ "$CONFIG_ISDN_DRV_AVMB1" != "n" ]; then - bool 'AVM B1 ISA support' CONFIG_ISDN_DRV_AVMB1_B1ISA - bool 'AVM B1 PCI support' CONFIG_ISDN_DRV_AVMB1_B1PCI - bool 'AVM T1/T1B ISA support' CONFIG_ISDN_DRV_AVMB1_T1ISA - bool 'AVM B1/M1/M2 PCMCIA support' CONFIG_ISDN_DRV_AVMB1_B1PCMCIA - bool 'Verbose reason code reporting (kernel size +=7K)' CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON + bool ' AVM B1 ISA support' CONFIG_ISDN_DRV_AVMB1_B1ISA + bool ' AVM B1 PCI support' CONFIG_ISDN_DRV_AVMB1_B1PCI + bool ' AVM T1/T1B ISA support' CONFIG_ISDN_DRV_AVMB1_T1ISA + bool ' AVM B1/M1/M2 PCMCIA support' CONFIG_ISDN_DRV_AVMB1_B1PCMCIA + bool ' Verbose reason code reporting (kernel size +=7K)' CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON fi - diff --git a/drivers/isdn/isdn_common.c b/drivers/isdn/isdn_common.c index cac4be6dc..10414ee94 100644 --- a/drivers/isdn/isdn_common.c +++ b/drivers/isdn/isdn_common.c @@ -2319,8 +2319,8 @@ isdn_add_channels(driver *d, int drvidx, int n, int adding) #ifdef COMPAT_HAS_NEW_WAITQ d->snd_waitq = d->rcv_waitq + m; for (j = 0; j < m; j++) { - init_waitqueue_head(&d->rcv_waitq[m]); - init_waitqueue_head(&d->snd_waitq[m]); + init_waitqueue_head(&d->rcv_waitq[j]); + init_waitqueue_head(&d->snd_waitq[j]); } #else memset((char *) d->rcv_waitq, 0, sizeof(struct wait_queue *) * m); diff --git a/drivers/macintosh/mac_keyb.c b/drivers/macintosh/mac_keyb.c index 93be8f08f..4eae1efd9 100644 --- a/drivers/macintosh/mac_keyb.c +++ b/drivers/macintosh/mac_keyb.c @@ -240,7 +240,7 @@ static void init_trackball(int id); static void init_turbomouse(int id); static void init_microspeed(int id); -#ifdef CONFIG_ADB_MOUSE +#ifdef CONFIG_ADBMOUSE /* XXX: Hook for mouse driver */ void (*adb_mouse_interrupt_hook)(unsigned char *, int); int adb_emulate_buttons = 0; @@ -336,7 +336,7 @@ input_keycode(int keycode, int repeat) if (!repeat) del_timer(&repeat_timer); -#ifdef CONFIG_ADB_MOUSE +#ifdef CONFIG_ADBMOUSE /* * XXX: Add mouse button 2+3 fake codes here if mouse open. * Keep track of 'button' states here as we only send @@ -366,7 +366,7 @@ input_keycode(int keycode, int repeat) } return; } -#endif /* CONFIG_ADB_MOUSE */ +#endif /* CONFIG_ADBMOUSE */ if (kbd->kbdmode != VC_RAW) { if (!up_flag && !dont_repeat[keycode]) { @@ -422,7 +422,7 @@ static void mac_put_queue(int ch) } } -#ifdef CONFIG_ADB_MOUSE +#ifdef CONFIG_ADBMOUSE static void mouse_input(unsigned char *data, int nb, struct pt_regs *regs, int autopoll) { @@ -554,7 +554,7 @@ mouse_input(unsigned char *data, int nb, struct pt_regs *regs, int autopoll) } } } -#endif /* CONFIG_ADB_MOUSE */ +#endif /* CONFIG_ADBMOUSE */ /* XXX Needs to get rid of this, see comments in pmu.c */ extern int backlight_level; @@ -700,7 +700,7 @@ void __init mackbd_init_hw(void) memcpy(key_maps[8], macalt_map, sizeof(plain_map)); memcpy(key_maps[12], macctrl_alt_map, sizeof(plain_map)); -#ifdef CONFIG_ADB_MOUSE +#ifdef CONFIG_ADBMOUSE /* initialize mouse interrupt hook */ adb_mouse_interrupt_hook = NULL; #endif @@ -736,9 +736,9 @@ mackeyb_probe(void) struct adb_request req; int i; -#ifdef CONFIG_ADB_MOUSE +#ifdef CONFIG_ADBMOUSE adb_register(ADB_MOUSE, 0, &mouse_ids, mouse_input); -#endif /* CONFIG_ADB_MOUSE */ +#endif /* CONFIG_ADBMOUSE */ adb_register(ADB_KEYBOARD, 0, &keyboard_ids, keyboard_input); adb_register(0x07, 0x1F, &buttons_ids, buttons_input); diff --git a/drivers/macintosh/mediabay.c b/drivers/macintosh/mediabay.c index 83fd1d140..2e3d96444 100644 --- a/drivers/macintosh/mediabay.c +++ b/drivers/macintosh/mediabay.c @@ -418,8 +418,10 @@ mb_notify_sleep(struct pmu_sleep_notifier *self, int when) middle of a wait loop */ if (bay->reset_timer) bay->reset_timer = MB_RESET_COUNT; +#ifdef CONFIG_BLK_DEV_IDE if (bay->cd_timer) bay->cd_timer = MB_IDE_WAIT; +#endif } } } diff --git a/drivers/macintosh/via-pmu.c b/drivers/macintosh/via-pmu.c index cff3f5cb7..b50a115a4 100644 --- a/drivers/macintosh/via-pmu.c +++ b/drivers/macintosh/via-pmu.c @@ -150,7 +150,7 @@ extern int grackle_pcibios_write_config_word(unsigned char bus, * - the number of response bytes which the PMU will return, or * -1 if it will send a length byte. */ -static s8 pmu_data_len[256][2] __openfirmwaredata = { +static const s8 pmu_data_len[256][2] __openfirmwaredata = { /* 0 1 2 3 4 5 6 7 */ /*00*/ {-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0},{-1, 0}, /*08*/ {-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}, @@ -263,6 +263,20 @@ pmu_init(void) { if (vias == NULL) return -ENXIO; + return 0; +} + +/* + * We can't wait until pmu_init gets called, that happens too late. + * It happens after IDE and SCSI initialization, which can take a few + * seconds, and by that time the PMU could have given up on us and + * turned us off. + * This is called from arch/ppc/kernel/pmac_setup.c:pmac_init2(). + */ +void via_pmu_start(void) +{ + if (vias == NULL) + return; bright_req_1.complete = 1; bright_req_2.complete = 1; @@ -272,7 +286,7 @@ pmu_init(void) (void *)0)) { printk(KERN_ERR "VIA-PMU: can't get irq %d\n", vias->intrs[0].line); - return -ENXIO; + return; } /* Enable interrupts */ @@ -282,8 +296,6 @@ pmu_init(void) /* Enable backlight */ pmu_enable_backlight(1); - - return 0; } static int __openfirmware diff --git a/drivers/misc/acpi.c b/drivers/misc/acpi.c index 99911093b..e6878dde6 100644 --- a/drivers/misc/acpi.c +++ b/drivers/misc/acpi.c @@ -28,6 +28,7 @@ #include <linux/miscdevice.h> #include <linux/sched.h> #include <linux/wait.h> +#include <linux/spinlock.h> #include <asm/uaccess.h> #include <asm/io.h> #include <linux/acpi.h> @@ -52,21 +53,40 @@ static struct acpi_facp *acpi_facp = NULL; static unsigned long acpi_facp_addr = 0; static unsigned long acpi_dsdt_addr = 0; +static spinlock_t acpi_event_lock = SPIN_LOCK_UNLOCKED; static volatile u32 acpi_pm1_status = 0; static volatile u32 acpi_gpe_status = 0; static volatile u32 acpi_gpe_level = 0; static DECLARE_WAIT_QUEUE_HEAD(acpi_wait_event); +/* Make it impossible to enter L2/L3 until after we've initialized */ +static unsigned long acpi_p_lvl2_lat = ~0UL; +static unsigned long acpi_p_lvl3_lat = ~0UL; + +/* Initialize to guaranteed harmless port read */ +static u16 acpi_p_lvl2 = 0x80; +static u16 acpi_p_lvl3 = 0x80; + + +/* + * Get the value of the PM1 control register (SCI_EN, ...) + */ +static u32 acpi_read_pm1_control(struct acpi_facp *facp) +{ + u32 value = inw(facp->pm1a_cnt); + if (facp->pm1b_cnt) + value |= inw(facp->pm1b_cnt); + return value; +} + /* * Get the value of the fixed event status register */ static u32 acpi_read_pm1_status(struct acpi_facp *facp) { u32 value = inw(facp->pm1a_evt); - - if (facp->pm1b_evt) { + if (facp->pm1b_evt) value |= inw(facp->pm1b_evt); - } return value; } @@ -76,9 +96,8 @@ static u32 acpi_read_pm1_status(struct acpi_facp *facp) static void acpi_write_pm1_status(struct acpi_facp *facp, u32 value) { outw(value, facp->pm1a_evt); - if (facp->pm1b_evt) { + if (facp->pm1b_evt) outw(value, facp->pm1b_evt); - } } /* @@ -88,9 +107,8 @@ static u32 acpi_read_pm1_enable(struct acpi_facp *facp) { int offset = facp->pm1_evt_len >> 1; u32 value = inw(facp->pm1a_evt + offset); - if (facp->pm1b_evt) { + if (facp->pm1b_evt) value |= inw(facp->pm1b_evt + offset); - } return value; } @@ -100,11 +118,9 @@ static u32 acpi_read_pm1_enable(struct acpi_facp *facp) static void acpi_write_pm1_enable(struct acpi_facp *facp, u32 value) { int offset = facp->pm1_evt_len >> 1; - outw(value, facp->pm1a_evt + offset); - if (facp->pm1b_evt) { + if (facp->pm1b_evt) outw(value, facp->pm1b_evt + offset); - } } /* @@ -117,14 +133,12 @@ static u32 acpi_read_gpe_status(struct acpi_facp *facp) if (facp->gpe1) { size = facp->gpe1_len >> 1; - for (i = size - 1; i >= 0; i--) { + for (i = size - 1; i >= 0; i--) value = (value << 8) | inb(facp->gpe1 + i); - } } size = facp->gpe0_len >> 1; - for (i = size - 1; i >= 0; i--) { + for (i = size - 1; i >= 0; i--) value = (value << 8) | inb(facp->gpe0 + i); - } return value; } @@ -165,9 +179,8 @@ static u32 acpi_read_gpe_enable(struct acpi_facp *facp) } } size = facp->gpe0_len >> 1; - for (i = size - 1; i >= 0; i--) { + for (i = size - 1; i >= 0; i--) value = (value << 8) | inb(facp->gpe0 + offset + i); - } return value; } @@ -201,14 +214,15 @@ static struct acpi_table *__init acpi_map_table(u32 addr) if (addr) { // map table header to determine size table = (struct acpi_table *) - ioremap_nocache((unsigned long) addr, - sizeof(struct acpi_table)); + ioremap_nocache((unsigned long) addr, + sizeof(struct acpi_table)); if (table) { unsigned long table_size = table->length; iounmap(table); // remap entire table table = (struct acpi_table *) - ioremap_nocache((unsigned long) addr, table_size); + ioremap_nocache((unsigned long) addr, + table_size); } } return table; @@ -219,9 +233,8 @@ static struct acpi_table *__init acpi_map_table(u32 addr) */ static void acpi_unmap_table(struct acpi_table *table) { - if (table) { + if (table) iounmap(table); - } } /* @@ -313,6 +326,8 @@ static void acpi_unmap_tables(void) static void acpi_irq(int irq, void *dev_id, struct pt_regs *regs) { u32 pm1_status, gpe_status, gpe_level, gpe_edge; + unsigned long flags; + // detect and clear fixed events pm1_status = (acpi_read_pm1_status(acpi_facp) & acpi_read_pm1_enable(acpi_facp)); @@ -323,7 +338,7 @@ static void acpi_irq(int irq, void *dev_id, struct pt_regs *regs) & acpi_read_gpe_enable(acpi_facp)); gpe_level = gpe_status & acpi_gpe_level; if (gpe_level) { - // disable level-triggered events + // disable level-triggered events (re-enabled after handling) acpi_write_gpe_enable( acpi_facp, acpi_read_gpe_enable(acpi_facp) & ~gpe_level); @@ -334,10 +349,12 @@ static void acpi_irq(int irq, void *dev_id, struct pt_regs *regs) while (acpi_read_gpe_status(acpi_facp) & gpe_edge) acpi_write_gpe_status(acpi_facp, gpe_edge); } - - // notify process reading /dev/acpi + + // notify process waiting on /dev/acpi + spin_lock_irqsave(&acpi_event_lock, flags); acpi_pm1_status |= pm1_status; acpi_gpe_status |= gpe_status; + spin_unlock_irqrestore(&acpi_event_lock, flags); wake_up_interruptible(&acpi_wait_event); } @@ -360,6 +377,39 @@ static int acpi_release(struct inode *inode, struct file *file) } /* + * Is ACPI enabled or not? + */ +static inline int acpi_is_enabled(struct acpi_facp *facp) +{ + return ((acpi_read_pm1_control(facp) & ACPI_SCI_EN) ? 1:0); +} + +/* + * Enable SCI + */ +static int acpi_enable(struct acpi_facp *facp) +{ + outb(facp->acpi_enable, facp->smi_cmd); + return (acpi_is_enabled(facp) ? 0:-1); +} + +/* + * Disable SCI + */ +static int acpi_disable(struct acpi_facp *facp) +{ + // disable and clear any pending events + acpi_write_gpe_enable(facp, 0); + while (acpi_read_gpe_status(facp)) + acpi_write_gpe_status(facp, acpi_read_gpe_status(facp)); + acpi_write_pm1_enable(facp, 0); + acpi_write_pm1_status(facp, acpi_read_pm1_status(facp)); + + outb(facp->acpi_disable, facp->smi_cmd); + return (acpi_is_enabled(facp) ? -1:0); +} + +/* * Handle command to /dev/acpi */ static int acpi_ioctl(struct inode *inode, @@ -369,6 +419,9 @@ static int acpi_ioctl(struct inode *inode, { int status = -EINVAL; + if (!capable(CAP_SYS_ADMIN)) + return -EPERM; + switch (cmd) { case ACPI_FIND_TABLES: status = verify_area(VERIFY_WRITE, @@ -391,7 +444,7 @@ static int acpi_ioctl(struct inode *inode, = (struct acpi_enable_event *) arg; u32 pm1_enable, gpe_enable, gpe_level; u32 pm1_enabling, gpe_enabling; - + get_user(pm1_enable, &rqst->pm1_enable); get_user(gpe_enable, &rqst->gpe_enable); get_user(gpe_level, &rqst->gpe_level); @@ -405,12 +458,30 @@ static int acpi_ioctl(struct inode *inode, ~acpi_read_gpe_enable(acpi_facp)); while (acpi_read_gpe_status(acpi_facp) & gpe_enabling) acpi_write_gpe_status(acpi_facp, gpe_enabling); - - acpi_write_pm1_enable(acpi_facp, pm1_enable); - acpi_write_gpe_enable(acpi_facp, gpe_enable); - acpi_gpe_level = gpe_level; - + status = 0; + + if (pm1_enable || gpe_enable) { + // enable ACPI unless it is already + if (!acpi_is_enabled(acpi_facp) + && acpi_enable(acpi_facp)) { + status = -EBUSY; + } + } + else { + // disable ACPI unless it is already + if (acpi_is_enabled(acpi_facp) + && acpi_disable(acpi_facp)) { + status = -EBUSY; + } + } + + if (!status) + { + acpi_write_pm1_enable(acpi_facp, pm1_enable); + acpi_write_gpe_enable(acpi_facp, gpe_enable); + acpi_gpe_level = gpe_level; + } } break; case ACPI_WAIT_EVENT: @@ -427,13 +498,13 @@ static int acpi_ioctl(struct inode *inode, unsigned long flags; // we need an atomic exchange here - save_flags(flags); - cli(); + spin_lock_irqsave(&acpi_event_lock, flags); pm1_status = acpi_pm1_status; acpi_pm1_status = 0; gpe_status = acpi_gpe_status; acpi_gpe_status = 0; - restore_flags(flags); + spin_unlock_irqrestore(&acpi_event_lock, + flags); if (pm1_status || gpe_status) break; @@ -453,6 +524,41 @@ static int acpi_ioctl(struct inode *inode, return status; } +static void acpi_idle_handler(void) +{ + unsigned long time; + static int sleep_level = 1; + + time = inl(acpi_facp->pm_tmr); + switch (sleep_level) { + case 1: + __asm__ __volatile__("sti ; hlt": : :"memory"); + break; + case 2: + inb(acpi_p_lvl2); + break; + case 3: + /* Disable PCI arbitration while sleeping, + to avoid DMA corruption? */ + if (acpi_facp->pm2_cnt) { + unsigned int port = acpi_facp->pm2_cnt; + outb(inb(port) | ACPI_ARB_DIS, port); + inb(acpi_p_lvl3); + outb(inb(port) & ~ACPI_ARB_DIS, port); + break; + } + inb(acpi_p_lvl3); + } + time = (inl(acpi_facp->pm_tmr) - time) & ACPI_TMR_MASK; + + if (time > acpi_p_lvl3_lat) + sleep_level = 3; + else if (time > acpi_p_lvl2_lat) + sleep_level = 2; + else + sleep_level = 1; +} + static struct file_operations acpi_fops = { NULL, /* llseek */ @@ -481,46 +587,48 @@ static struct miscdevice acpi_device = NULL }; -/* Make it impossible to enter L2/L3 until after we've initialized */ -static unsigned long acpi_p_lvl2_lat = ~0UL; -static unsigned long acpi_p_lvl3_lat = ~0UL; +/* + * Claim ACPI I/O ports + */ +static int acpi_claim_ioports(struct acpi_facp *facp) +{ + // we don't get a guarantee of contiguity for any of the ACPI registers + request_region(facp->pm1a_evt, facp->pm1_evt_len, "acpi"); + if (facp->pm1b_evt) + request_region(facp->pm1b_evt, facp->pm1_evt_len, "acpi"); + request_region(facp->pm1a_cnt, facp->pm1_cnt_len, "acpi"); + if (facp->pm1b_cnt) + request_region(facp->pm1b_cnt, facp->pm1_cnt_len, "acpi"); + if (facp->pm2_cnt) + request_region(facp->pm2_cnt, facp->pm2_cnt_len, "acpi"); + request_region(facp->pm_tmr, facp->pm_tm_len, "acpi"); + request_region(facp->gpe0, facp->gpe0_len, "acpi"); + if (facp->gpe1) + request_region(facp->gpe1, facp->gpe1_len, "acpi"); -/* Initialize to guaranteed harmless port read */ -static u16 acpi_p_lvl2 = 0x80; -static u16 acpi_p_lvl3 = 0x80; + return 0; +} -static void acpi_idle_handler(void) +/* + * Free ACPI I/O ports + */ +static int acpi_release_ioports(struct acpi_facp *facp) { - unsigned long time; - static int sleep_level = 1; + // we don't get a guarantee of contiguity for any of the ACPI registers + release_region(facp->pm1a_evt, facp->pm1_evt_len); + if (facp->pm1b_evt) + release_region(facp->pm1b_evt, facp->pm1_evt_len); + release_region(facp->pm1a_cnt, facp->pm1_cnt_len); + if (facp->pm1b_cnt) + release_region(facp->pm1b_cnt, facp->pm1_cnt_len); + if (facp->pm2_cnt) + release_region(facp->pm2_cnt, facp->pm2_cnt_len); + release_region(facp->pm_tmr, facp->pm_tm_len); + release_region(facp->gpe0, facp->gpe0_len); + if (facp->gpe1) + release_region(facp->gpe1, facp->gpe1_len); - time = inl(acpi_facp->pm_tmr); - switch (sleep_level) { - case 1: - __asm__ __volatile__("sti ; hlt": : :"memory"); - break; - case 2: - inb(acpi_p_lvl2); - break; - case 3: - /* Disable PCI arbitration while sleeping, to avoid DMA corruption? */ - if (acpi_facp->pm2_cnt) { - unsigned int port = acpi_facp->pm2_cnt; - outb(inb(port) | ACPI_ARB_DIS, port); - inb(acpi_p_lvl3); - outb(inb(port) & ~ACPI_ARB_DIS, port); - break; - } - inb(acpi_p_lvl3); - } - time = (inl(acpi_facp->pm_tmr) - time) & ACPI_TMR_MASK; - - if (time > acpi_p_lvl3_lat) - sleep_level = 3; - else if (time > acpi_p_lvl2_lat) - sleep_level = 2; - else - sleep_level = 1; + return 0; } /* @@ -528,9 +636,9 @@ static void acpi_idle_handler(void) */ static int __init acpi_init(void) { - if (acpi_map_tables()) { + if (acpi_map_tables()) return -ENODEV; - } + if (request_irq(acpi_facp->sci_int, acpi_irq, SA_INTERRUPT | SA_SHIRQ, @@ -541,9 +649,11 @@ static int __init acpi_init(void) acpi_unmap_tables(); return -ENODEV; } - if (misc_register(&acpi_device)) { + + acpi_claim_ioports(acpi_facp); + + if (misc_register(&acpi_device)) printk(KERN_ERR "ACPI: misc. register failed\n"); - } /* * Set up the ACPI idle function. Note that we can't really @@ -564,20 +674,9 @@ static int __init acpi_init(void) static void __exit acpi_exit(void) { misc_deregister(&acpi_device); - - // disable and clear any pending events - acpi_write_gpe_enable(acpi_facp, 0); - while (acpi_read_gpe_status(acpi_facp)) { - acpi_write_gpe_status(acpi_facp, - acpi_read_gpe_status(acpi_facp)); - } - acpi_write_pm1_enable(acpi_facp, 0); - acpi_write_pm1_status(acpi_facp, acpi_read_pm1_status(acpi_facp)); - - // disable SCI and free interrupt - outb(acpi_facp->acpi_disable, acpi_facp->smi_cmd); + acpi_disable(acpi_facp); + acpi_release_ioports(acpi_facp); free_irq(acpi_facp->sci_int, NULL); - acpi_unmap_tables(); } diff --git a/drivers/net/3c509.c b/drivers/net/3c509.c index a6bbd842f..fbd4503bd 100644 --- a/drivers/net/3c509.c +++ b/drivers/net/3c509.c @@ -902,6 +902,7 @@ static int xcvr[] = {-1, -1, -1, -1, -1, -1, -1, -1}; MODULE_PARM(debug,"i"); MODULE_PARM(irq,"1-8i"); MODULE_PARM(xcvr,"1-8i"); +MODULE_PARM(max_interrupt_work, "i"); int init_module(void) diff --git a/drivers/net/Config.in b/drivers/net/Config.in index 5dfea0a88..d54f8fd30 100644 --- a/drivers/net/Config.in +++ b/drivers/net/Config.in @@ -133,9 +133,9 @@ if [ "$CONFIG_NET_ETHERNET" = "y" ]; then bool ' EISA, VLB, PCI and on board controllers' CONFIG_NET_EISA if [ "$CONFIG_NET_EISA" = "y" ]; then tristate ' AMD PCnet32 (VLB and PCI) support' CONFIG_PCNET32 -# if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then -# tristate ' Adaptec Starfire support (EXPERIMENTAL)' CONFIG_ADAPTEC_STARFIRE -# fi + if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then + tristate ' Adaptec Starfire support (EXPERIMENTAL)' CONFIG_ADAPTEC_STARFIRE + fi tristate ' Alteon AceNIC/3Com 3C985/NetGear GA620 Gigabit support' CONFIG_ACENIC if [ "$CONFIG_ACENIC" != "n" ]; then bool ' Omit support for old Tigon I based AceNICs' CONFIG_ACENIC_OMIT_TIGON_I diff --git a/drivers/net/Makefile b/drivers/net/Makefile index 4c40cdcac..336d081b3 100644 --- a/drivers/net/Makefile +++ b/drivers/net/Makefile @@ -1039,6 +1039,14 @@ else endif endif +ifeq ($(CONFIG_ADAPTEC_STARFIRE),y) +L_OBJS += starfire.o +else + ifeq ($(CONFIG_ADAPTEC_STARFIRE),m) + M_OBJS += starfire.o + endif +endif + # # HIPPI adapters # diff --git a/drivers/net/ne.c b/drivers/net/ne.c index ae8a4fbdc..58573948c 100644 --- a/drivers/net/ne.c +++ b/drivers/net/ne.c @@ -28,7 +28,8 @@ rjohnson@analogic.com : Changed init order so an interrupt will only occur after memory is allocated for dev->priv. Deallocated memory last in cleanup_modue() - + Richard Guenther : Added support for ISAPnP cards + */ /* Routines for the NatSemi-based designs (NE[12]000). */ @@ -43,6 +44,7 @@ static const char *version = #include <linux/sched.h> #include <linux/errno.h> #include <linux/pci.h> +#include <linux/isapnp.h> #include <linux/init.h> #include <linux/delay.h> #include <asm/system.h> @@ -90,6 +92,13 @@ pci_clone_list[] __initdata = { static int probe_pci = 1; #endif +static struct { unsigned short vendor, function; char *name; } +isapnp_clone_list[] __initdata = { + {ISAPNP_VENDOR('E','D','I'), ISAPNP_FUNCTION(0x0216), "NN NE2000" }, + {ISAPNP_VENDOR('P','N','P'), ISAPNP_FUNCTION(0x80d6), "Generic PNP" }, + {0,} +}; + #ifdef SUPPORT_NE_BAD_CLONES /* A list of bad clones that we none-the-less recognize. */ static struct { const char *name8, *name16; unsigned char SAprefix[4];} @@ -128,6 +137,7 @@ static unsigned int pci_irq_line = 0; int ne_probe(struct net_device *dev); static int ne_probe1(struct net_device *dev, int ioaddr); +static int ne_probe_isapnp(struct net_device *dev); #ifdef CONFIG_PCI static int ne_probe_pci(struct net_device *dev); #endif @@ -193,6 +203,10 @@ int __init ne_probe(struct net_device *dev) return 0; #endif + /* Then look for any installed ISAPnP clones */ + if (isapnp_present() && (ne_probe_isapnp(dev) == 0)) + return 0; + #ifndef MODULE /* Last resort. The semi-risky ISA auto-probe. */ for (base_addr = 0; netcard_portlist[base_addr] != 0; base_addr++) { @@ -243,6 +257,46 @@ static int __init ne_probe_pci(struct net_device *dev) } #endif /* CONFIG_PCI */ +static int __init ne_probe_isapnp(struct net_device *dev) +{ + int i; + + for (i = 0; isapnp_clone_list[i].vendor != 0; i++) { + struct pci_dev *idev = NULL; + + while ((idev = isapnp_find_dev(NULL, + isapnp_clone_list[i].vendor, + isapnp_clone_list[i].function, + idev))) { + /* Avoid already found cards from previous calls */ + if (idev->prepare(idev)) + continue; + if (idev->activate(idev)) + continue; + pci_irq_line = idev->irq_resource[0].start; + /* if no irq, search for next */ + if (!pci_irq_line) + continue; + /* found it */ + if (ne_probe1(dev, idev->resource[0].start) != 0) { /* Shouldn't happen. */ + printk(KERN_ERR "ne.c: Probe of ISAPnP card at %#lx failed.\n", + idev->resource[0].start); + return -ENXIO; + } + ei_status.priv = (unsigned long)idev; + break; + } + if (!idev) + continue; + printk(KERN_INFO "ne.c: ISAPnP reports %s at i/o %#lx, irq %d.\n", + isapnp_clone_list[i].name, + dev->base_addr, dev->irq); + return 0; + } + + return -ENODEV; +} + static int __init ne_probe1(struct net_device *dev, int ioaddr) { int i; @@ -491,6 +545,7 @@ static int __init ne_probe1(struct net_device *dev, int ioaddr) ei_status.block_input = &ne_block_input; ei_status.block_output = &ne_block_output; ei_status.get_8390_hdr = &ne_get_8390_hdr; + ei_status.priv = 0; dev->open = &ne_open; dev->stop = &ne_close; NS8390_init(dev, 0); @@ -819,6 +874,9 @@ void cleanup_module(void) struct net_device *dev = &dev_ne[this_dev]; if (dev->priv != NULL) { void *priv = dev->priv; + struct pci_dev *idev = (struct pci_dev *)ei_status.priv; + if (idev) + idev->deactivate(idev); free_irq(dev->irq, dev); release_region(dev->base_addr, NE_IO_EXTENT); unregister_netdev(dev); diff --git a/drivers/net/ppp_generic.c b/drivers/net/ppp_generic.c index 32851a5d8..19b0c5819 100644 --- a/drivers/net/ppp_generic.c +++ b/drivers/net/ppp_generic.c @@ -19,10 +19,10 @@ * PPP driver, written by Michael Callahan and Al Longyear, and * subsequently hacked by Paul Mackerras. * - * ==FILEVERSION 990806== + * ==FILEVERSION 990915== */ -/* $Id: ppp_generic.c,v 1.3 1999/09/02 05:30:12 paulus Exp $ */ +/* $Id: ppp_generic.c,v 1.5 1999/09/15 11:21:48 paulus Exp $ */ #include <linux/config.h> #include <linux/module.h> @@ -131,7 +131,7 @@ struct channel { #define PPP_MAX_RQLEN 32 /* Prototypes. */ -static void ppp_xmit_unlock(struct ppp *ppp); +static void ppp_xmit_unlock(struct ppp *ppp, int do_mark_bh); static void ppp_send_frame(struct ppp *ppp, struct sk_buff *skb); static void ppp_push(struct ppp *ppp); static void ppp_recv_unlock(struct ppp *ppp); @@ -199,6 +199,13 @@ static const int npindex_to_ethertype[NUM_NP] = { /* * Routines for locking and unlocking the transmit and receive paths * of each unit. + * + * On the transmit side, we have threads of control coming into the + * driver from (at least) three places: the core net code, write calls + * on /dev/ppp from pppd, and wakeup calls from channels. There is + * possible concurrency even on UP systems (between mainline and + * BH processing). The XMIT_BUSY bit in ppp->busy serializes the + * transmit-side processing for each ppp unit. */ static inline void lock_path(struct ppp *ppp, int bit) @@ -329,16 +336,20 @@ static ssize_t ppp_write(struct file *file, const char *buf, struct ppp *ppp = (struct ppp *) file->private_data; struct sk_buff *skb; ssize_t ret; + int extra; ret = -ENXIO; if (ppp == 0) goto out; ret = -ENOMEM; - skb = alloc_skb(count + 2, GFP_KERNEL); + extra = PPP_HDRLEN - 2; + if (ppp->dev && ppp->dev->hard_header_len > PPP_HDRLEN) + extra = ppp->dev->hard_header_len - 2; + skb = alloc_skb(count + extra, GFP_KERNEL); if (skb == 0) goto out; - skb_reserve(skb, 2); + skb_reserve(skb, extra); ret = -EFAULT; if (copy_from_user(skb_put(skb, count), buf, count)) { kfree_skb(skb); @@ -347,7 +358,7 @@ static ssize_t ppp_write(struct file *file, const char *buf, skb_queue_tail(&ppp->xq, skb); if (trylock_xmit_path(ppp)) - ppp_xmit_unlock(ppp); + ppp_xmit_unlock(ppp, 1); ret = count; @@ -490,7 +501,7 @@ static int ppp_ioctl(struct inode *inode, struct file *file, slhc_free(ppp->vj); ppp->vj = slhc_init(val2+1, val+1); ppp_recv_unlock(ppp); - ppp_xmit_unlock(ppp); + ppp_xmit_unlock(ppp, 1); err = -ENOMEM; if (ppp->vj == 0) { printk(KERN_ERR "PPP: no memory (VJ compressor)\n"); @@ -580,10 +591,6 @@ ppp_start_xmit(struct sk_buff *skb, struct net_device *dev) int npi, proto; unsigned char *pp; - if (skb == 0) - return 0; - /* can skb->data ever be 0? */ - npi = ethertype_to_npindex(ntohs(skb->protocol)); if (npi < 0) goto outf; @@ -601,30 +608,15 @@ ppp_start_xmit(struct sk_buff *skb, struct net_device *dev) goto outf; } - /* The transmit side of the ppp interface is serialized by - the XMIT_BUSY bit in ppp->busy. */ - if (!trylock_xmit_path(ppp)) { - dev->tbusy = 1; - return 1; - } - if (ppp->xmit_pending) - ppp_push(ppp); - if (ppp->xmit_pending) { - dev->tbusy = 1; - ppp_xmit_unlock(ppp); - return 1; - } - dev->tbusy = 0; - /* Put the 2-byte PPP protocol number on the front, making sure there is room for the address and control fields. */ if (skb_headroom(skb) < PPP_HDRLEN) { struct sk_buff *ns; - ns = alloc_skb(skb->len + PPP_HDRLEN, GFP_ATOMIC); + ns = alloc_skb(skb->len + dev->hard_header_len, GFP_ATOMIC); if (ns == 0) - goto outnbusy; - skb_reserve(ns, PPP_HDRLEN); + goto outf; + skb_reserve(ns, dev->hard_header_len); memcpy(skb_put(ns, skb->len), skb->data, skb->len); kfree_skb(skb); skb = ns; @@ -634,13 +626,16 @@ ppp_start_xmit(struct sk_buff *skb, struct net_device *dev) pp[0] = proto >> 8; pp[1] = proto; - ppp_send_frame(ppp, skb); - ppp_xmit_unlock(ppp); + /* + * ppp->xq should only ever have more than 1 data packet on it + * if the core net code calls us when dev->tbusy == 1. + */ + dev->tbusy = 1; + skb_queue_tail(&ppp->xq, skb); + if (trylock_xmit_path(ppp)) + ppp_xmit_unlock(ppp, 0); return 0; - outnbusy: - ppp_xmit_unlock(ppp); - outf: kfree_skb(skb); return 0; @@ -723,20 +718,34 @@ ppp_net_init(struct net_device *dev) * making sure that any work queued up gets done. */ static void -ppp_xmit_unlock(struct ppp *ppp) +ppp_xmit_unlock(struct ppp *ppp, int do_mark_bh) { struct sk_buff *skb; for (;;) { + /* Do whatever work is waiting to be done. */ if (test_and_clear_bit(XMIT_WAKEUP, &ppp->busy)) ppp_push(ppp); + /* If there's no work left to do, tell the core net + code that we can accept some more. */ while (ppp->xmit_pending == 0 && (skb = skb_dequeue(&ppp->xq)) != 0) ppp_send_frame(ppp, skb); + if (ppp->xmit_pending == 0 && skb_peek(&ppp->xq) == 0 + && ppp->dev->tbusy) { + ppp->dev->tbusy = 0; + if (do_mark_bh) + mark_bh(NET_BH); + } + /* Now unlock the transmit path, let others in. */ unlock_xmit_path(ppp); + /* Check whether any work was queued up + between our last check and the unlock. */ if (!(test_bit(XMIT_WAKEUP, &ppp->busy) || (ppp->xmit_pending == 0 && skb_peek(&ppp->xq)))) break; + /* If so, lock again and do the work. If we can't get + the lock, someone else has it and they'll do the work. */ if (!trylock_xmit_path(ppp)) break; } @@ -763,12 +772,13 @@ ppp_send_frame(struct ppp *ppp, struct sk_buff *skb) if (ppp->vj == 0 || (ppp->flags & SC_COMP_TCP) == 0) break; /* try to do VJ TCP header compression */ - new_skb = alloc_skb(skb->len + 2, GFP_ATOMIC); + new_skb = alloc_skb(skb->len + ppp->dev->hard_header_len - 2, + GFP_ATOMIC); if (new_skb == 0) { printk(KERN_ERR "PPP: no memory (VJ comp pkt)\n"); goto drop; } - skb_reserve(new_skb, 2); + skb_reserve(new_skb, ppp->dev->hard_header_len - 2); cp = skb->data + 2; len = slhc_compress(ppp->vj, cp, skb->len - 2, new_skb->data + 2, &cp, @@ -801,11 +811,15 @@ ppp_send_frame(struct ppp *ppp, struct sk_buff *skb) /* try to do packet compression */ if ((ppp->xstate & SC_COMP_RUN) && ppp->xc_state != 0 && proto != PPP_LCP && proto != PPP_CCP) { - new_skb = alloc_skb(ppp->dev->mtu + PPP_HDRLEN, GFP_ATOMIC); + new_skb = alloc_skb(ppp->dev->mtu + ppp->dev->hard_header_len, + GFP_ATOMIC); if (new_skb == 0) { printk(KERN_ERR "PPP: no memory (comp pkt)\n"); goto drop; } + if (ppp->dev->hard_header_len > PPP_HDRLEN) + skb_reserve(new_skb, + ppp->dev->hard_header_len - PPP_HDRLEN); /* compressor still expects A/C bytes in hdr */ len = ppp->xcomp->compress(ppp->xc_state, skb->data - 2, @@ -1120,6 +1134,8 @@ ppp_register_channel(struct ppp_channel *chan, int unit) list_add(&pch->list, &ppp->channels); chan->ppp = pch; ++ppp->n_channels; + if (ppp->dev && chan->hdrlen + PPP_HDRLEN > ppp->dev->hard_header_len) + ppp->dev->hard_header_len = chan->hdrlen + PPP_HDRLEN; ret = 0; out: spin_unlock(&all_ppp_lock); @@ -1160,11 +1176,7 @@ ppp_output_wakeup(struct ppp_channel *chan) pch->blocked = 0; set_bit(XMIT_WAKEUP, &ppp->busy); if (trylock_xmit_path(ppp)) - ppp_xmit_unlock(ppp); - if (ppp->xmit_pending == 0) { - ppp->dev->tbusy = 0; - mark_bh(NET_BH); - } + ppp_xmit_unlock(ppp, 1); } /* @@ -1215,7 +1227,7 @@ ppp_set_compress(struct ppp *ppp, unsigned long arg) ppp->xcomp = cp; ppp->xc_state = cp->comp_alloc(ccp_option, data.length); - ppp_xmit_unlock(ppp); + ppp_xmit_unlock(ppp, 1); if (ppp->xc_state == 0) goto out; @@ -1321,7 +1333,7 @@ ppp_ccp_closed(struct ppp *ppp) ppp->xcomp->comp_free(ppp->xc_state); ppp->xc_state = 0; } - ppp_xmit_unlock(ppp); + ppp_xmit_unlock(ppp, 1); lock_recv_path(ppp); ppp->xstate &= ~SC_DECOMP_RUN; diff --git a/drivers/net/tokenring/Config.in b/drivers/net/tokenring/Config.in index 8b3065c8a..2a4e4907d 100644 --- a/drivers/net/tokenring/Config.in +++ b/drivers/net/tokenring/Config.in @@ -9,7 +9,7 @@ bool 'Token Ring driver support' CONFIG_TR if [ "$CONFIG_TR" = "y" ]; then tristate ' IBM Tropic chipset based adapter support' CONFIG_IBMTR tristate ' IBM Olympic chipset PCI adapter support' CONFIG_IBMOL - tristate ' SysKonnect adapter support' CONFIG_SKTR + tristate ' Generic TMS380 Token Ring ISA/PCI adapter support' CONFIG_TMS380TR fi endmenu diff --git a/drivers/net/tokenring/Makefile b/drivers/net/tokenring/Makefile index 038c58b86..f76e996ff 100644 --- a/drivers/net/tokenring/Makefile +++ b/drivers/net/tokenring/Makefile @@ -39,11 +39,11 @@ else endif endif -ifeq ($(CONFIG_SKTR),y) - L_OBJS += sktr.o +ifeq ($(CONFIG_TMS380TR),y) + L_OBJS += tms380tr.o else - ifeq ($(CONFIG_SKTR),m) - M_OBJS += sktr.o + ifeq ($(CONFIG_TMS380TR),m) + M_OBJS += tms380tr.o endif endif diff --git a/drivers/net/tokenring/sktr.c b/drivers/net/tokenring/sktr.c index 81b2df4bc..e69de29bb 100644 --- a/drivers/net/tokenring/sktr.c +++ b/drivers/net/tokenring/sktr.c @@ -1,2707 +0,0 @@ -/* - * sktr.c: A network driver for the SysKonnect Token Ring ISA/PCI Adapters. - * - * Written 1997 by Christoph Goos - * - * A fine result of the Linux Systems Network Architecture Project. - * http://samba.anu.edu.au/linux-sna/ - * - * This software may be used and distributed according to the terms - * of the GNU Public License, incorporated herein by reference. - * - * This device driver works with the following SysKonnect adapters: - * - SysKonnect TR4/16(+) ISA (SK-4190) - * - SysKonnect TR4/16(+) PCI (SK-4590) - * - SysKonnect TR4/16 PCI (SK-4591) - * - * Sources: - * - The hardware related parts of this driver are take from - * the SysKonnect Token Ring driver for Windows NT. - * - I used the IBM Token Ring driver 'ibmtr.c' as a base for this - * driver, as well as the 'skeleton.c' driver by Donald Becker. - * - Also various other drivers in the linux source tree were taken - * as samples for some tasks. - * - * Maintainer(s): - * JS Jay Schulist jschlst@samba.anu.edu.au - * CG Christoph Goos cgoos@syskonnect.de - * AF Adam Fritzler mid@auk.cx - * - * Modification History: - * 29-Aug-97 CG Created - * 04-Apr-98 CG Fixed problems caused by tok_timer_check - * 10-Apr-98 CG Fixed lockups at cable disconnection - * 27-May-98 JS Formated to Linux Kernel Format - * 31-May-98 JS Hacked in PCI support - * 16-Jun-98 JS Modulized for multiple cards with one driver - * 21-Sep-99 CG Fixed source routing issues for 2.2 kernels - * 21-Sep-99 AF Added multicast changes recommended by - * Jochen Friedrich <jochen@nwe.de> (untested) - * Added detection of compatible Compaq PCI card - * - * To do: - * 1. Selectable 16 Mbps or 4Mbps - * 2. Multi/Broadcast packet handling (might be done) - * - */ - -static const char *version = "sktr.c: v1.01 08/29/97 by Christoph Goos\n"; - -#ifdef MODULE -#include <linux/module.h> -#include <linux/version.h> -#endif - -#include <linux/kernel.h> -#include <linux/sched.h> -#include <linux/types.h> -#include <linux/fcntl.h> -#include <linux/interrupt.h> -#include <linux/ptrace.h> -#include <linux/ioport.h> -#include <linux/in.h> -#include <linux/malloc.h> -#include <linux/string.h> -#include <linux/time.h> -#include <asm/system.h> -#include <asm/bitops.h> -#include <asm/io.h> -#include <asm/dma.h> -#include <asm/irq.h> -#include <linux/errno.h> -#include <linux/init.h> -#include <linux/pci.h> - -#include <linux/netdevice.h> -#include <linux/etherdevice.h> -#include <linux/skbuff.h> -#include <linux/trdevice.h> - -#include "sktr.h" /* Our Stuff */ -#include "sktr_firmware.h" /* SysKonnect adapter firmware */ - -/* A zero-terminated list of I/O addresses to be probed. */ -static unsigned int sktr_portlist[] __initdata = { - 0x0A20, 0x1A20, 0x0B20, 0x1B20, 0x0980, 0x1980, 0x0900, 0x1900, - 0 -}; - -/* A zero-terminated list of IRQs to be probed. - * Used again after initial probe for sktr_chipset_init, called from sktr_open. - */ -static unsigned short sktr_irqlist[] = { - 3, 5, 9, 10, 11, 12, 15, - 0 -}; - -/* A zero-terminated list of DMAs to be probed. */ -static int sktr_dmalist[] __initdata = { - 5, 6, 7, - 0 -}; - -/* Card names */ -static char *pci_cardname = "SK NET TR 4/16 PCI\0"; -static char *isa_cardname = "SK NET TR 4/16 ISA\0"; -static char *AdapterName; - -/* Use 0 for production, 1 for verification, 2 for debug, and - * 3 for very verbose debug. - */ -#ifndef SKTR_DEBUG -#define SKTR_DEBUG 1 -#endif -static unsigned int sktr_debug = SKTR_DEBUG; - -/* The number of low I/O ports used by the tokencard. */ -#define SKTR_IO_EXTENT 32 - -/* Index to functions, as function prototypes. - * Alphabetical by function name. - */ - -/* "B" */ -static int sktr_bringup_diags(struct net_device *dev); -/* "C" */ -static void sktr_cancel_tx_queue(struct net_local* tp); -static int sktr_chipset_init(struct net_device *dev); -static void sktr_chk_irq(struct net_device *dev); -static unsigned char sktr_chk_frame(struct net_device *dev, unsigned char *Addr); -static void sktr_chk_outstanding_cmds(struct net_device *dev); -static void sktr_chk_src_addr(unsigned char *frame, unsigned char *hw_addr); -static unsigned char sktr_chk_ssb(struct net_local *tp, unsigned short IrqType); -static int sktr_close(struct net_device *dev); -static void sktr_cmd_status_irq(struct net_device *dev); -/* "D" */ -static void sktr_disable_interrupts(struct net_device *dev); -static void sktr_dump(unsigned char *Data, int length); -/* "E" */ -static void sktr_enable_interrupts(struct net_device *dev); -static void sktr_exec_cmd(struct net_device *dev, unsigned short Command); -static void sktr_exec_sifcmd(struct net_device *dev, unsigned int WriteValue); -/* "F" */ -/* "G" */ -static struct enet_statistics *sktr_get_stats(struct net_device *dev); -/* "H" */ -static void sktr_hardware_send_packet(struct net_device *dev, - struct net_local* tp); -/* "I" */ -static int sktr_init_adapter(struct net_device *dev); -static int sktr_init_card(struct net_device *dev); -static void sktr_init_ipb(struct net_local *tp); -static void sktr_init_net_local(struct net_device *dev); -static void sktr_init_opb(struct net_local *tp); -static void sktr_interrupt(int irq, void *dev_id, struct pt_regs *regs); -static int sktr_isa_chk_card(struct net_device *dev, int ioaddr); -static int sktr_isa_chk_ioaddr(int ioaddr); -/* "O" */ -static int sktr_open(struct net_device *dev); -static void sktr_open_adapter(struct net_device *dev); -/* "P" */ -static int sktr_pci_chk_card(struct net_device *dev); -int sktr_probe(struct net_device *dev); -static int sktr_probe1(struct net_device *dev, int ioaddr); -/* "R" */ -static void sktr_rcv_status_irq(struct net_device *dev); -static void sktr_read_addr(struct net_device *dev, unsigned char *Address); -static void sktr_read_ptr(struct net_device *dev); -static void sktr_read_ram(struct net_device *dev, unsigned char *Data, - unsigned short Address, int Length); -static int sktr_reset_adapter(struct net_device *dev); -static void sktr_reset_interrupt(struct net_device *dev); -static void sktr_ring_status_irq(struct net_device *dev); -/* "S" */ -static int sktr_send_packet(struct sk_buff *skb, struct net_device *dev); -static void sktr_set_multicast_list(struct net_device *dev); -/* "T" */ -static void sktr_timer_chk(unsigned long data); -static void sktr_timer_end_wait(unsigned long data); -static void sktr_tx_status_irq(struct net_device *dev); -/* "U" */ -static void sktr_update_rcv_stats(struct net_local *tp, - unsigned char DataPtr[], unsigned int Length); -/* "W" */ -static void sktr_wait(unsigned long time); -static void sktr_write_rpl_status(RPL *rpl, unsigned int Status); -static void sktr_write_tpl_status(TPL *tpl, unsigned int Status); - -/* - * Check for a network adapter of this type, and return '0' if one exists. - * If dev->base_addr == 0, probe all likely locations. - * If dev->base_addr == 1, always return failure. - */ -int __init sktr_probe(struct net_device *dev) -{ - int i; - int base_addr = dev ? dev->base_addr : 0; - - if(base_addr > 0x1ff) /* Check a single specified location. */ - return (sktr_probe1(dev, base_addr)); - else if(base_addr != 0) /* Don't probe at all. */ - return (-ENXIO); - - for(i = 0; sktr_portlist[i]; i++) - { - int ioaddr = sktr_portlist[i]; - if(check_region(ioaddr, SKTR_IO_EXTENT)) - continue; - if(sktr_probe1(dev, ioaddr)) - { -#ifndef MODULE - tr_freedev(dev); -#endif - } - else - return (0); - } - - return (-ENODEV); -} - -/* - * Detect and setup the PCI SysKonnect TR cards in slot order. - */ -static int __init sktr_pci_chk_card(struct net_device *dev) -{ - static int pci_index = 0; - unsigned char pci_bus, pci_device_fn; - - if(!pci_present()) - return (-1); /* No PCI present. */ - - for(; pci_index < 0xff; pci_index++) - { - unsigned int pci_irq_line; - struct pci_dev *pdev; - unsigned short pci_command, new_command, vendor, device; - unsigned int pci_ioaddr; - - if(pcibios_find_class(PCI_CLASS_NETWORK_TOKEN_RING << 8, - pci_index, &pci_bus, &pci_device_fn) - != PCIBIOS_SUCCESSFUL) - { - break; - } - - pcibios_read_config_word(pci_bus, pci_device_fn, - PCI_VENDOR_ID, &vendor); - pcibios_read_config_word(pci_bus, pci_device_fn, - PCI_DEVICE_ID, &device); - - pdev = pci_find_slot(pci_bus, pci_device_fn); - pci_irq_line = pdev->irq; - pci_ioaddr = pdev->resource[0].start; - - pcibios_read_config_word(pci_bus, pci_device_fn, - PCI_COMMAND, &pci_command); - - /* Remove I/O space marker in bit 0. */ - pci_ioaddr &= ~3; - - if((vendor != PCI_VENDOR_ID_SK) && - (vendor != PCI_VENDOR_ID_COMPAQ)) - continue; - - if((vendor == PCI_VENDOR_ID_SK) && - (device != PCI_DEVICE_ID_SK_TR)) - continue; - else if((vendor == PCI_VENDOR_ID_COMPAQ) && - (device != PCI_DEVICE_ID_COMPAQ_TOKENRING)) - continue; - - if(check_region(pci_ioaddr, SKTR_IO_EXTENT)) - continue; - request_region(pci_ioaddr, SKTR_IO_EXTENT, pci_cardname); - if(request_irq(pdev->irq, sktr_interrupt, SA_SHIRQ, - pci_cardname, dev)) - return (-ENODEV); /* continue; ?? */ - - AdapterName = pci_cardname; - - new_command = (pci_command|PCI_COMMAND_MASTER|PCI_COMMAND_IO); - - if(pci_command != new_command) - { - printk("The PCI BIOS has not enabled this" - "device! Updating PCI command %4.4x->%4.4x.\n", - pci_command, new_command); - pcibios_write_config_word(pci_bus, pci_device_fn, - PCI_COMMAND, new_command); - } - - /* At this point we have found a valid PCI TR card. */ - dev->base_addr = pci_ioaddr; - dev->irq = pci_irq_line; - dev->dma = 0; - - printk("%s: %s found at %#4x, using IRQ %d.\n", - dev->name, AdapterName, pci_ioaddr, dev->irq); - - return (0); - } - - return (-1); -} - -/* - * Detect and setup the ISA SysKonnect TR cards. - */ -static int __init sktr_isa_chk_card(struct net_device *dev, int ioaddr) -{ - int i, err; - unsigned long flags; - - err = sktr_isa_chk_ioaddr(ioaddr); - if(err < 0) - return (-ENODEV); - - if(virt_to_bus((void*)((unsigned long)dev->priv+sizeof(struct net_local))) - > ISA_MAX_ADDRESS) - { - printk("%s: Memory not accessible for DMA\n", dev->name); - kfree(dev->priv); - return (-EAGAIN); - } - - AdapterName = isa_cardname; - - /* Grab the region so that no one else tries to probe our ioports. */ - request_region(ioaddr, SKTR_IO_EXTENT, AdapterName); - dev->base_addr = ioaddr; - - /* Autoselect IRQ and DMA if dev->irq == 0 */ - if(dev->irq == 0) - { - for(i = 0; sktr_irqlist[i] != 0; i++) - { - dev->irq = sktr_irqlist[i]; - err = request_irq(dev->irq, &sktr_interrupt, 0, AdapterName, dev); - if(!err) - break; - } - - if(sktr_irqlist[i] == 0) - { - printk("%s: AutoSelect no IRQ available\n", dev->name); - return (-EAGAIN); - } - } - else - { - err = request_irq(dev->irq, &sktr_interrupt, 0, AdapterName, dev); - if(err) - { - printk("%s: Selected IRQ not available\n", dev->name); - return (-EAGAIN); - } - } - - /* Always allocate the DMA channel after IRQ and clean up on failure */ - if(dev->dma == 0) - { - for(i = 0; sktr_dmalist[i] != 0; i++) - { - dev->dma = sktr_dmalist[i]; - err = request_dma(dev->dma, AdapterName); - if(!err) - break; - } - - if(dev->dma == 0) - { - printk("%s: AutoSelect no DMA available\n", dev->name); - free_irq(dev->irq, NULL); - return (-EAGAIN); - } - } - else - { - err = request_dma(dev->dma, AdapterName); - if(err) - { - printk("%s: Selected DMA not available\n", dev->name); - free_irq(dev->irq, NULL); - return (-EAGAIN); - } - } - - flags=claim_dma_lock(); - disable_dma(dev->dma); - set_dma_mode(dev->dma, DMA_MODE_CASCADE); - enable_dma(dev->dma); - release_dma_lock(flags); - - printk("%s: %s found at %#4x, using IRQ %d and DMA %d.\n", - dev->name, AdapterName, ioaddr, dev->irq, dev->dma); - - return (0); -} - -static int __init sktr_probe1(struct net_device *dev, int ioaddr) -{ - static unsigned version_printed = 0; - struct net_local *tp; - int DeviceType = SK_PCI; - int err; - - if(sktr_debug && version_printed++ == 0) - printk("%s", version); - -#ifndef MODULE - dev = init_trdev(dev, 0); - if(dev == NULL) - return (-ENOMEM); -#endif - - err = sktr_pci_chk_card(dev); - if(err < 0) - { - err = sktr_isa_chk_card(dev, ioaddr); - if(err < 0) - return (-ENODEV); - DeviceType = SK_ISA; - } - - /* Setup this devices private information structure */ - tp = (struct net_local *)kmalloc(sizeof(struct net_local), GFP_KERNEL | GFP_DMA); - if(tp == NULL) - return (-ENOMEM); - memset(tp, 0, sizeof(struct net_local)); - tp->DeviceType = DeviceType; - init_waitqueue_head(&tp->wait_for_tok_int); - - dev->priv = tp; - dev->init = sktr_init_card; - dev->open = sktr_open; - dev->stop = sktr_close; - dev->hard_start_xmit = sktr_send_packet; - dev->get_stats = sktr_get_stats; - dev->set_multicast_list = &sktr_set_multicast_list; - - return (0); -} - -/* Dummy function */ -static int __init sktr_init_card(struct net_device *dev) -{ - if(sktr_debug > 3) - printk("%s: sktr_init_card\n", dev->name); - - return (0); -} - -/* - * This function tests if an adapter is really installed at the - * given I/O address. Return negative if no adapter at IO addr. - */ -static int __init sktr_isa_chk_ioaddr(int ioaddr) -{ - unsigned char old, chk1, chk2; - - old = inb(ioaddr + SIFADR); /* Get the old SIFADR value */ - - chk1 = 0; /* Begin with check value 0 */ - do { - /* Write new SIFADR value */ - outb(chk1, ioaddr + SIFADR); - - /* Read, invert and write */ - chk2 = inb(ioaddr + SIFADD); - chk2 ^= 0x0FE; - outb(chk2, ioaddr + SIFADR); - - /* Read, invert and compare */ - chk2 = inb(ioaddr + SIFADD); - chk2 ^= 0x0FE; - - if(chk1 != chk2) - return (-1); /* No adapter */ - - chk1 -= 2; - } while(chk1 != 0); /* Repeat 128 times (all byte values) */ - - /* Restore the SIFADR value */ - outb(old, ioaddr + SIFADR); - - return (0); -} - -/* - * Open/initialize the board. This is called sometime after - * booting when the 'ifconfig' program is run. - * - * This routine should set everything up anew at each open, even - * registers that "should" only need to be set once at boot, so that - * there is non-reboot way to recover if something goes wrong. - */ -static int sktr_open(struct net_device *dev) -{ - struct net_local *tp = (struct net_local *)dev->priv; - int err; - - /* Reset the hardware here. Don't forget to set the station address. */ - err = sktr_chipset_init(dev); - if(err) - { - printk(KERN_INFO "%s: Chipset initialization error\n", - dev->name); - return (-1); - } - - dev->addr_len = 6; - sktr_read_addr(dev, (unsigned char*)dev->dev_addr); - - init_timer(&tp->timer); - tp->timer.expires = jiffies + 30*HZ; - tp->timer.function = sktr_timer_end_wait; - tp->timer.data = (unsigned long)dev; - tp->timer.next = NULL; - tp->timer.prev = NULL; - add_timer(&tp->timer); - - sktr_read_ptr(dev); - sktr_enable_interrupts(dev); - sktr_open_adapter(dev); - - dev->tbusy = 0; - dev->interrupt = 0; - dev->start = 0; - - /* Wait for interrupt from hardware. If interrupt does not come, - * there will be a timeout from the timer. - */ - tp->Sleeping = 1; - interruptible_sleep_on(&tp->wait_for_tok_int); - del_timer(&tp->timer); - - /* If AdapterVirtOpenFlag is 1, the adapter is now open for use */ - if(tp->AdapterVirtOpenFlag == 0) - { - sktr_disable_interrupts(dev); - return (-1); - } - - dev->start = 1; - - tp->StartTime = jiffies; - - /* Start function control timer */ - tp->timer.expires = jiffies + 2*HZ; - tp->timer.function = sktr_timer_chk; - tp->timer.data = (unsigned long)dev; - add_timer(&tp->timer); - -#ifdef MODULE - MOD_INC_USE_COUNT; -#endif - - return (0); -} - -/* - * Timeout function while waiting for event - */ -static void sktr_timer_end_wait(unsigned long data) -{ - struct net_device *dev = (struct net_device*)data; - struct net_local *tp = (struct net_local *)dev->priv; - - if(tp->Sleeping) - { - tp->Sleeping = 0; - wake_up_interruptible(&tp->wait_for_tok_int); - } - - return; -} - -/* - * Initialize the chipset - */ -static int sktr_chipset_init(struct net_device *dev) -{ - struct net_local *tp = (struct net_local *)dev->priv; - unsigned char PosReg, Tmp; - int i, err; - - sktr_init_ipb(tp); - sktr_init_opb(tp); - sktr_init_net_local(dev); - - /* Set pos register: selects irq and dma channel. - * Only for ISA bus adapters. - */ - if(dev->dma > 0) - { - PosReg = 0; - for(i = 0; sktr_irqlist[i] != 0; i++) - { - if(sktr_irqlist[i] == dev->irq) - break; - } - - /* Choose default cycle time, 500 nsec */ - PosReg |= CYCLE_TIME << 2; - PosReg |= i << 4; - i = dev->dma - 5; - PosReg |= i; - - if(tp->DataRate == SPEED_4) - PosReg |= LINE_SPEED_BIT; - else - PosReg &= ~LINE_SPEED_BIT; - - outb(PosReg, dev->base_addr + POSREG); - Tmp = inb(dev->base_addr + POSREG); - if((Tmp & ~CYCLE_TIME) != (PosReg & ~CYCLE_TIME)) - printk(KERN_INFO "%s: POSREG error\n", dev->name); - } - - err = sktr_reset_adapter(dev); - if(err < 0) - return (-1); - - err = sktr_bringup_diags(dev); - if(err < 0) - return (-1); - - err = sktr_init_adapter(dev); - if(err < 0) - return (-1); - - return (0); -} - -/* - * Initializes the net_local structure. - */ -static void sktr_init_net_local(struct net_device *dev) -{ - struct net_local *tp = (struct net_local *)dev->priv; - int i; - - tp->scb.CMD = 0; - tp->scb.Parm[0] = 0; - tp->scb.Parm[1] = 0; - - tp->ssb.STS = 0; - tp->ssb.Parm[0] = 0; - tp->ssb.Parm[1] = 0; - tp->ssb.Parm[2] = 0; - - tp->CMDqueue = 0; - - tp->AdapterOpenFlag = 0; - tp->AdapterVirtOpenFlag = 0; - tp->ScbInUse = 0; - tp->OpenCommandIssued = 0; - tp->ReOpenInProgress = 0; - tp->HaltInProgress = 0; - tp->TransmitHaltScheduled = 0; - tp->LobeWireFaultLogged = 0; - tp->LastOpenStatus = 0; - tp->MaxPacketSize = DEFAULT_PACKET_SIZE; - - skb_queue_head_init(&tp->SendSkbQueue); - tp->QueueSkb = MAX_TX_QUEUE; - - /* Create circular chain of transmit lists */ - for (i = 0; i < TPL_NUM; i++) - { - tp->Tpl[i].NextTPLAddr = htonl((unsigned long) virt_to_bus(&tp->Tpl[(i+1) % TPL_NUM])); - tp->Tpl[i].Status = 0; - tp->Tpl[i].FrameSize = 0; - tp->Tpl[i].FragList[0].DataCount = 0; - tp->Tpl[i].FragList[0].DataAddr = 0; - tp->Tpl[i].NextTPLPtr = &tp->Tpl[(i+1) % TPL_NUM]; - tp->Tpl[i].MData = NULL; - tp->Tpl[i].TPLIndex = i; - tp->Tpl[i].BusyFlag = 0; - } - - tp->TplFree = tp->TplBusy = &tp->Tpl[0]; - - /* Create circular chain of receive lists */ - for (i = 0; i < RPL_NUM; i++) - { - tp->Rpl[i].NextRPLAddr = htonl((unsigned long) virt_to_bus(&tp->Rpl[(i+1) % RPL_NUM])); - tp->Rpl[i].Status = (RX_VALID | RX_START_FRAME | RX_END_FRAME | RX_FRAME_IRQ); - tp->Rpl[i].FrameSize = 0; - tp->Rpl[i].FragList[0].DataCount = SWAPB(tp->MaxPacketSize); - - /* Alloc skb and point adapter to data area */ - tp->Rpl[i].Skb = dev_alloc_skb(tp->MaxPacketSize); - - /* skb == NULL ? then use local buffer */ - if(tp->Rpl[i].Skb == NULL) - { - tp->Rpl[i].SkbStat = SKB_UNAVAILABLE; - tp->Rpl[i].FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[i])); - tp->Rpl[i].MData = tp->LocalRxBuffers[i]; - } - else /* SKB != NULL */ - { - tp->Rpl[i].Skb->dev = dev; - skb_put(tp->Rpl[i].Skb, tp->MaxPacketSize); - - /* data unreachable for DMA ? then use local buffer */ - if(tp->DeviceType == SK_ISA && - virt_to_bus(tp->Rpl[i].Skb->data) + - tp->MaxPacketSize > ISA_MAX_ADDRESS) - { - tp->Rpl[i].SkbStat = SKB_DATA_COPY; - tp->Rpl[i].FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[i])); - tp->Rpl[i].MData = tp->LocalRxBuffers[i]; - } - else /* DMA directly in skb->data */ - { - tp->Rpl[i].SkbStat = SKB_DMA_DIRECT; - tp->Rpl[i].FragList[0].DataAddr = htonl(virt_to_bus(tp->Rpl[i].Skb->data)); - tp->Rpl[i].MData = tp->Rpl[i].Skb->data; - } - } - - tp->Rpl[i].NextRPLPtr = &tp->Rpl[(i+1) % RPL_NUM]; - tp->Rpl[i].RPLIndex = i; - } - - tp->RplHead = &tp->Rpl[0]; - tp->RplTail = &tp->Rpl[RPL_NUM-1]; - tp->RplTail->Status = (RX_START_FRAME | RX_END_FRAME | RX_FRAME_IRQ); - - return; -} - -/* - * Initializes the initialisation parameter block. - */ -static void sktr_init_ipb(struct net_local *tp) -{ - tp->ipb.Init_Options = BURST_MODE; - tp->ipb.CMD_Status_IV = 0; - tp->ipb.TX_IV = 0; - tp->ipb.RX_IV = 0; - tp->ipb.Ring_Status_IV = 0; - tp->ipb.SCB_Clear_IV = 0; - tp->ipb.Adapter_CHK_IV = 0; - tp->ipb.RX_Burst_Size = BURST_SIZE; - tp->ipb.TX_Burst_Size = BURST_SIZE; - tp->ipb.DMA_Abort_Thrhld = DMA_RETRIES; - tp->ipb.SCB_Addr = 0; - tp->ipb.SSB_Addr = 0; - - return; -} - -/* - * Initializes the open parameter block. - */ -static void sktr_init_opb(struct net_local *tp) -{ - unsigned long Addr; - unsigned short RplSize = RPL_SIZE; - unsigned short TplSize = TPL_SIZE; - unsigned short BufferSize = BUFFER_SIZE; - - tp->ocpl.OPENOptions = 0; - tp->ocpl.OPENOptions |= ENABLE_FULL_DUPLEX_SELECTION; -/* tp->ocpl.OPENOptions |= PAD_ROUTING_FIELD; no more needed */ - tp->ocpl.FullDuplex = 0; - tp->ocpl.FullDuplex |= OPEN_FULL_DUPLEX_OFF; - - /* Fixme: If mac address setable: - * for (i=0; i<LENGTH_OF_ADDRESS; i++) - * mac->Vam->ocpl.NodeAddr[i] = mac->CurrentAddress[i]; - */ - - tp->ocpl.GroupAddr = 0; - tp->ocpl.FunctAddr = 0; - tp->ocpl.RxListSize = SWAPB(RplSize); - tp->ocpl.TxListSize = SWAPB(TplSize); - tp->ocpl.BufSize = SWAPB(BufferSize); - tp->ocpl.Reserved = 0; - tp->ocpl.TXBufMin = TX_BUF_MIN; - tp->ocpl.TXBufMax = TX_BUF_MAX; - - Addr = htonl(virt_to_bus(tp->ProductID)); - - tp->ocpl.ProdIDAddr[0] = LOWORD(Addr); - tp->ocpl.ProdIDAddr[1] = HIWORD(Addr); - - return; -} - -/* - * Send OPEN command to adapter - */ -static void sktr_open_adapter(struct net_device *dev) -{ - struct net_local *tp = (struct net_local *)dev->priv; - - if(tp->OpenCommandIssued) - return; - - tp->OpenCommandIssued = 1; - sktr_exec_cmd(dev, OC_OPEN); - - return; -} - -/* - * Clear the adapter's interrupt flag. Clear system interrupt enable - * (SINTEN): disable adapter to system interrupts. - */ -static void sktr_disable_interrupts(struct net_device *dev) -{ - outb(0, dev->base_addr + SIFACL); - - return; -} - -/* - * Set the adapter's interrupt flag. Set system interrupt enable - * (SINTEN): enable adapter to system interrupts. - */ -static void sktr_enable_interrupts(struct net_device *dev) -{ - outb(ACL_SINTEN, dev->base_addr + SIFACL); - - return; -} - -/* - * Put command in command queue, try to execute it. - */ -static void sktr_exec_cmd(struct net_device *dev, unsigned short Command) -{ - struct net_local *tp = (struct net_local *)dev->priv; - - tp->CMDqueue |= Command; - sktr_chk_outstanding_cmds(dev); - - return; -} - -/* - * Gets skb from system, queues it and checks if it can be sent - */ -static int sktr_send_packet(struct sk_buff *skb, struct net_device *dev) -{ - struct net_local *tp = (struct net_local *)dev->priv; - - if(dev->tbusy) - { - /* - * If we get here, some higher level has decided we are broken. - * There should really be a "kick me" function call instead. - * - * Resetting the token ring adapter takes a long time so just - * fake transmission time and go on trying. Our own timeout - * routine is in sktr_timer_chk() - */ - dev->tbusy = 0; - dev->trans_start = jiffies; - return (1); - } - - /* - * If some higher layer thinks we've missed an tx-done interrupt we - * are passed NULL. - */ - if(skb == NULL) - return (0); - - /* - * Block a timer-based transmit from overlapping. This could better be - * done with atomic_swap(1, dev->tbusy), but set_bit() works as well. - */ - if(test_and_set_bit(0, (void*)&dev->tbusy) != 0) - { - printk("%s: Transmitter access conflict.\n", dev->name); - return (1); - } - - if(tp->QueueSkb == 0) - return (1); /* Return with tbusy set: queue full */ - - tp->QueueSkb--; - skb_queue_tail(&tp->SendSkbQueue, skb); - sktr_hardware_send_packet(dev, tp); - if(tp->QueueSkb > 0) - dev->tbusy = 0; - - return (0); -} - -/* - * Move frames from internal skb queue into adapter tx queue - */ -static void sktr_hardware_send_packet(struct net_device *dev, struct net_local* tp) -{ - TPL *tpl; - short length; - unsigned char *buf, *newbuf; - struct sk_buff *skb; - int i; - - for(;;) - { - /* Try to get a free TPL from the chain. - * - * NOTE: We *must* always leave one unused TPL in the chain, - * because otherwise the adapter might send frames twice. - */ - if(tp->TplFree->NextTPLPtr->BusyFlag) /* No free TPL */ - { - printk(KERN_INFO "%s: No free TPL\n", dev->name); - return; - } - - /* Send first buffer from queue */ - skb = skb_dequeue(&tp->SendSkbQueue); - if(skb == NULL) - return; - - tp->QueueSkb++; - /* Is buffer reachable for Busmaster-DMA? */ - if(tp->DeviceType == SK_ISA && - virt_to_bus((void*)(((long) skb->data) + skb->len)) - > ISA_MAX_ADDRESS) - { - /* Copy frame to local buffer */ - i = tp->TplFree->TPLIndex; - length = skb->len; - buf = tp->LocalTxBuffers[i]; - memcpy(buf, skb->data, length); - newbuf = buf; - } - else - { - /* Send direct from skb->data */ - length = skb->len; - newbuf = skb->data; - } - - /* Source address in packet? */ - sktr_chk_src_addr(newbuf, dev->dev_addr); - - tp->LastSendTime = jiffies; - tpl = tp->TplFree; /* Get the "free" TPL */ - tpl->BusyFlag = 1; /* Mark TPL as busy */ - tp->TplFree = tpl->NextTPLPtr; - - /* Save the skb for delayed return of skb to system */ - tpl->Skb = skb; - tpl->FragList[0].DataCount = (unsigned short) SWAPB(length); - tpl->FragList[0].DataAddr = htonl(virt_to_bus(newbuf)); - - /* Write the data length in the transmit list. */ - tpl->FrameSize = (unsigned short) SWAPB(length); - tpl->MData = newbuf; - - /* Transmit the frame and set the status values. */ - sktr_write_tpl_status(tpl, TX_VALID | TX_START_FRAME - | TX_END_FRAME | TX_PASS_SRC_ADDR - | TX_FRAME_IRQ); - - /* Let adapter send the frame. */ - sktr_exec_sifcmd(dev, CMD_TX_VALID); - } - - return; -} - -/* - * Write the given value to the 'Status' field of the specified TPL. - * NOTE: This function should be used whenever the status of any TPL must be - * modified by the driver, because the compiler may otherwise change the - * order of instructions such that writing the TPL status may be executed at - * an undesireable time. When this function is used, the status is always - * written when the function is called. - */ -static void sktr_write_tpl_status(TPL *tpl, unsigned int Status) -{ - tpl->Status = Status; -} - -static void sktr_chk_src_addr(unsigned char *frame, unsigned char *hw_addr) -{ - unsigned char SRBit; - - if((((unsigned long)frame[8]) & ~0x80) != 0) /* Compare 4 bytes */ - return; - if((unsigned short)frame[12] != 0) /* Compare 2 bytes */ - return; - - SRBit = frame[8] & 0x80; - memcpy(&frame[8], hw_addr, 6); - frame[8] |= SRBit; - - return; -} - -/* - * The timer routine: Check if adapter still open and working, reopen if not. - */ -static void sktr_timer_chk(unsigned long data) -{ - struct net_device *dev = (struct net_device*)data; - struct net_local *tp = (struct net_local*)dev->priv; - - if(tp->HaltInProgress) - return; - - sktr_chk_outstanding_cmds(dev); - if(time_before(tp->LastSendTime + SEND_TIMEOUT, jiffies) - && (tp->QueueSkb < MAX_TX_QUEUE || tp->TplFree != tp->TplBusy)) - { - /* Anything to send, but stalled to long */ - tp->LastSendTime = jiffies; - sktr_exec_cmd(dev, OC_CLOSE); /* Does reopen automatically */ - } - - tp->timer.expires = jiffies + 2*HZ; - add_timer(&tp->timer); - - if(tp->AdapterOpenFlag || tp->ReOpenInProgress) - return; - tp->ReOpenInProgress = 1; - sktr_open_adapter(dev); - - return; -} - -/* - * The typical workload of the driver: Handle the network interface interrupts. - */ -static void sktr_interrupt(int irq, void *dev_id, struct pt_regs *regs) -{ - struct net_device *dev = dev_id; - struct net_local *tp; - int ioaddr; - unsigned short irq_type; - - if(dev == NULL) - { - printk("%s: irq %d for unknown device.\n", dev->name, irq); - return; - } - - dev->interrupt = 1; - - ioaddr = dev->base_addr; - tp = (struct net_local *)dev->priv; - - irq_type = inw(ioaddr + SIFSTS); - - while(irq_type & STS_SYSTEM_IRQ) - { - irq_type &= STS_IRQ_MASK; - - if(!sktr_chk_ssb(tp, irq_type)) - { - printk(KERN_INFO "%s: DATA LATE occurred\n", dev->name); - break; - } - - switch(irq_type) - { - case STS_IRQ_RECEIVE_STATUS: - sktr_reset_interrupt(dev); - sktr_rcv_status_irq(dev); - break; - - case STS_IRQ_TRANSMIT_STATUS: - /* Check if TRANSMIT.HALT command is complete */ - if(tp->ssb.Parm[0] & COMMAND_COMPLETE) - { - tp->TransmitCommandActive = 0; - tp->TransmitHaltScheduled = 0; - - /* Issue a new transmit command. */ - sktr_exec_cmd(dev, OC_TRANSMIT); - } - - sktr_reset_interrupt(dev); - sktr_tx_status_irq(dev); - break; - - case STS_IRQ_COMMAND_STATUS: - /* The SSB contains status of last command - * other than receive/transmit. - */ - sktr_cmd_status_irq(dev); - break; - - case STS_IRQ_SCB_CLEAR: - /* The SCB is free for another command. */ - tp->ScbInUse = 0; - sktr_chk_outstanding_cmds(dev); - break; - - case STS_IRQ_RING_STATUS: - sktr_ring_status_irq(dev); - break; - - case STS_IRQ_ADAPTER_CHECK: - sktr_chk_irq(dev); - break; - - default: - printk(KERN_INFO "Unknown Token Ring IRQ\n"); - break; - } - - /* Reset system interrupt if not already done. */ - if(irq_type != STS_IRQ_TRANSMIT_STATUS - && irq_type != STS_IRQ_RECEIVE_STATUS) - { - sktr_reset_interrupt(dev); - } - - irq_type = inw(ioaddr + SIFSTS); - } - - dev->interrupt = 0; - - return; -} - -/* - * Reset the INTERRUPT SYSTEM bit and issue SSB CLEAR command. - */ -static void sktr_reset_interrupt(struct net_device *dev) -{ - struct net_local *tp = (struct net_local *)dev->priv; - SSB *ssb = &tp->ssb; - - /* - * [Workaround for "Data Late"] - * Set all fields of the SSB to well-defined values so we can - * check if the adapter has written the SSB. - */ - - ssb->STS = (unsigned short) -1; - ssb->Parm[0] = (unsigned short) -1; - ssb->Parm[1] = (unsigned short) -1; - ssb->Parm[2] = (unsigned short) -1; - - /* Free SSB by issuing SSB_CLEAR command after reading IRQ code - * and clear STS_SYSTEM_IRQ bit: enable adapter for further interrupts. - */ - sktr_exec_sifcmd(dev, CMD_SSB_CLEAR | CMD_CLEAR_SYSTEM_IRQ); - - return; -} - -/* - * Check if the SSB has actually been written by the adapter. - */ -static unsigned char sktr_chk_ssb(struct net_local *tp, unsigned short IrqType) -{ - SSB *ssb = &tp->ssb; /* The address of the SSB. */ - - /* C 0 1 2 INTERRUPT CODE - * - - - - -------------- - * 1 1 1 1 TRANSMIT STATUS - * 1 1 1 1 RECEIVE STATUS - * 1 ? ? 0 COMMAND STATUS - * 0 0 0 0 SCB CLEAR - * 1 1 0 0 RING STATUS - * 0 0 0 0 ADAPTER CHECK - * - * 0 = SSB field not affected by interrupt - * 1 = SSB field is affected by interrupt - * - * C = SSB ADDRESS +0: COMMAND - * 0 = SSB ADDRESS +2: STATUS 0 - * 1 = SSB ADDRESS +4: STATUS 1 - * 2 = SSB ADDRESS +6: STATUS 2 - */ - - /* Check if this interrupt does use the SSB. */ - - if(IrqType != STS_IRQ_TRANSMIT_STATUS - && IrqType != STS_IRQ_RECEIVE_STATUS - && IrqType != STS_IRQ_COMMAND_STATUS - && IrqType != STS_IRQ_RING_STATUS) - { - return (1); /* SSB not involved. */ - } - - /* Note: All fields of the SSB have been set to all ones (-1) after it - * has last been used by the software (see DriverIsr()). - * - * Check if the affected SSB fields are still unchanged. - */ - - if(ssb->STS == (unsigned short) -1) - return (0); /* Command field not yet available. */ - if(IrqType == STS_IRQ_COMMAND_STATUS) - return (1); /* Status fields not always affected. */ - if(ssb->Parm[0] == (unsigned short) -1) - return (0); /* Status 1 field not yet available. */ - if(IrqType == STS_IRQ_RING_STATUS) - return (1); /* Status 2 & 3 fields not affected. */ - - /* Note: At this point, the interrupt is either TRANSMIT or RECEIVE. */ - if(ssb->Parm[1] == (unsigned short) -1) - return (0); /* Status 2 field not yet available. */ - if(ssb->Parm[2] == (unsigned short) -1) - return (0); /* Status 3 field not yet available. */ - - return (1); /* All SSB fields have been written by the adapter. */ -} - -/* - * Evaluates the command results status in the SSB status field. - */ -static void sktr_cmd_status_irq(struct net_device *dev) -{ - struct net_local *tp = (struct net_local *)dev->priv; - unsigned short ssb_cmd, ssb_parm_0; - unsigned short ssb_parm_1; - char *open_err = "Open error -"; - char *code_err = "Open code -"; - - /* Copy the ssb values to local variables */ - ssb_cmd = tp->ssb.STS; - ssb_parm_0 = tp->ssb.Parm[0]; - ssb_parm_1 = tp->ssb.Parm[1]; - - if(ssb_cmd == OPEN) - { - tp->Sleeping = 0; - if(!tp->ReOpenInProgress) - wake_up_interruptible(&tp->wait_for_tok_int); - - tp->OpenCommandIssued = 0; - tp->ScbInUse = 0; - - if((ssb_parm_0 & 0x00FF) == GOOD_COMPLETION) - { - /* Success, the adapter is open. */ - tp->LobeWireFaultLogged = 0; - tp->AdapterOpenFlag = 1; - tp->AdapterVirtOpenFlag = 1; - tp->TransmitCommandActive = 0; - sktr_exec_cmd(dev, OC_TRANSMIT); - sktr_exec_cmd(dev, OC_RECEIVE); - - if(tp->ReOpenInProgress) - tp->ReOpenInProgress = 0; - - return; - } - else /* The adapter did not open. */ - { - if(ssb_parm_0 & NODE_ADDR_ERROR) - printk(KERN_INFO "%s: Node address error\n", - dev->name); - if(ssb_parm_0 & LIST_SIZE_ERROR) - printk(KERN_INFO "%s: List size error\n", - dev->name); - if(ssb_parm_0 & BUF_SIZE_ERROR) - printk(KERN_INFO "%s: Buffer size error\n", - dev->name); - if(ssb_parm_0 & TX_BUF_COUNT_ERROR) - printk(KERN_INFO "%s: Tx buffer count error\n", - dev->name); - if(ssb_parm_0 & INVALID_OPEN_OPTION) - printk(KERN_INFO "%s: Invalid open option\n", - dev->name); - if(ssb_parm_0 & OPEN_ERROR) - { - /* Show the open phase. */ - switch(ssb_parm_0 & OPEN_PHASES_MASK) - { - case LOBE_MEDIA_TEST: - if(!tp->LobeWireFaultLogged) - { - tp->LobeWireFaultLogged = 1; - printk(KERN_INFO "%s: %s Lobe wire fault (check cable !).\n", dev->name, open_err); - } - tp->ReOpenInProgress = 1; - tp->AdapterOpenFlag = 0; - tp->AdapterVirtOpenFlag = 1; - sktr_open_adapter(dev); - return; - - case PHYSICAL_INSERTION: - printk(KERN_INFO "%s: %s Physical insertion.\n", dev->name, open_err); - break; - - case ADDRESS_VERIFICATION: - printk(KERN_INFO "%s: %s Address verification.\n", dev->name, open_err); - break; - - case PARTICIPATION_IN_RING_POLL: - printk(KERN_INFO "%s: %s Participation in ring poll.\n", dev->name, open_err); - break; - - case REQUEST_INITIALISATION: - printk(KERN_INFO "%s: %s Request initialisation.\n", dev->name, open_err); - break; - - case FULLDUPLEX_CHECK: - printk(KERN_INFO "%s: %s Full duplex check.\n", dev->name, open_err); - break; - - default: - printk(KERN_INFO "%s: %s Unknown open phase\n", dev->name, open_err); - break; - } - - /* Show the open errors. */ - switch(ssb_parm_0 & OPEN_ERROR_CODES_MASK) - { - case OPEN_FUNCTION_FAILURE: - printk(KERN_INFO "%s: %s OPEN_FUNCTION_FAILURE", dev->name, code_err); - tp->LastOpenStatus = - OPEN_FUNCTION_FAILURE; - break; - - case OPEN_SIGNAL_LOSS: - printk(KERN_INFO "%s: %s OPEN_SIGNAL_LOSS\n", dev->name, code_err); - tp->LastOpenStatus = - OPEN_SIGNAL_LOSS; - break; - - case OPEN_TIMEOUT: - printk(KERN_INFO "%s: %s OPEN_TIMEOUT\n", dev->name, code_err); - tp->LastOpenStatus = - OPEN_TIMEOUT; - break; - - case OPEN_RING_FAILURE: - printk(KERN_INFO "%s: %s OPEN_RING_FAILURE\n", dev->name, code_err); - tp->LastOpenStatus = - OPEN_RING_FAILURE; - break; - - case OPEN_RING_BEACONING: - printk(KERN_INFO "%s: %s OPEN_RING_BEACONING\n", dev->name, code_err); - tp->LastOpenStatus = - OPEN_RING_BEACONING; - break; - - case OPEN_DUPLICATE_NODEADDR: - printk(KERN_INFO "%s: %s OPEN_DUPLICATE_NODEADDR\n", dev->name, code_err); - tp->LastOpenStatus = - OPEN_DUPLICATE_NODEADDR; - break; - - case OPEN_REQUEST_INIT: - printk(KERN_INFO "%s: %s OPEN_REQUEST_INIT\n", dev->name, code_err); - tp->LastOpenStatus = - OPEN_REQUEST_INIT; - break; - - case OPEN_REMOVE_RECEIVED: - printk(KERN_INFO "%s: %s OPEN_REMOVE_RECEIVED", dev->name, code_err); - tp->LastOpenStatus = - OPEN_REMOVE_RECEIVED; - break; - - case OPEN_FULLDUPLEX_SET: - printk(KERN_INFO "%s: %s OPEN_FULLDUPLEX_SET\n", dev->name, code_err); - tp->LastOpenStatus = - OPEN_FULLDUPLEX_SET; - break; - - default: - printk(KERN_INFO "%s: %s Unknown open err code", dev->name, code_err); - tp->LastOpenStatus = - OPEN_FUNCTION_FAILURE; - break; - } - } - - tp->AdapterOpenFlag = 0; - tp->AdapterVirtOpenFlag = 0; - - return; - } - } - else - { - if(ssb_cmd != READ_ERROR_LOG) - return; - - /* Add values from the error log table to the MAC - * statistics counters and update the errorlogtable - * memory. - */ - tp->MacStat.line_errors += tp->errorlogtable.Line_Error; - tp->MacStat.burst_errors += tp->errorlogtable.Burst_Error; - tp->MacStat.A_C_errors += tp->errorlogtable.ARI_FCI_Error; - tp->MacStat.lost_frames += tp->errorlogtable.Lost_Frame_Error; - tp->MacStat.recv_congest_count += tp->errorlogtable.Rx_Congest_Error; - tp->MacStat.rx_errors += tp->errorlogtable.Rx_Congest_Error; - tp->MacStat.frame_copied_errors += tp->errorlogtable.Frame_Copied_Error; - tp->MacStat.token_errors += tp->errorlogtable.Token_Error; - tp->MacStat.dummy1 += tp->errorlogtable.DMA_Bus_Error; - tp->MacStat.dummy1 += tp->errorlogtable.DMA_Parity_Error; - tp->MacStat.abort_delimiters += tp->errorlogtable.AbortDelimeters; - tp->MacStat.frequency_errors += tp->errorlogtable.Frequency_Error; - tp->MacStat.internal_errors += tp->errorlogtable.Internal_Error; - } - - return; -} - -/* - * The inverse routine to sktr_open(). - */ -static int sktr_close(struct net_device *dev) -{ - struct net_local *tp = (struct net_local *)dev->priv; - - dev->tbusy = 1; - dev->start = 0; - - del_timer(&tp->timer); - - /* Flush the Tx and disable Rx here. */ - - tp->HaltInProgress = 1; - sktr_exec_cmd(dev, OC_CLOSE); - tp->timer.expires = jiffies + 1*HZ; - tp->timer.function = sktr_timer_end_wait; - tp->timer.data = (unsigned long)dev; - add_timer(&tp->timer); - - sktr_enable_interrupts(dev); - - tp->Sleeping = 1; - interruptible_sleep_on(&tp->wait_for_tok_int); - tp->TransmitCommandActive = 0; - - del_timer(&tp->timer); - sktr_disable_interrupts(dev); - - if(dev->dma > 0) - { - unsigned long flags=claim_dma_lock(); - disable_dma(dev->dma); - release_dma_lock(flags); - } - - outw(0xFF00, dev->base_addr + SIFCMD); - if(dev->dma > 0) - outb(0xff, dev->base_addr + POSREG); - -#ifdef MODULE - MOD_DEC_USE_COUNT; -#endif - - sktr_cancel_tx_queue(tp); - - return (0); -} - -/* - * Get the current statistics. This may be called with the card open - * or closed. - */ -static struct enet_statistics *sktr_get_stats(struct net_device *dev) -{ - struct net_local *tp = (struct net_local *)dev->priv; - - return ((struct enet_statistics *)&tp->MacStat); -} - -/* - * Set or clear the multicast filter for this adapter. - */ -static void sktr_set_multicast_list(struct net_device *dev) -{ - struct net_local *tp = (struct net_local *)dev->priv; - unsigned int OpenOptions; - - OpenOptions = tp->ocpl.OPENOptions & - ~(PASS_ADAPTER_MAC_FRAMES - | PASS_ATTENTION_FRAMES - | PASS_BEACON_MAC_FRAMES - | COPY_ALL_MAC_FRAMES - | COPY_ALL_NON_MAC_FRAMES); - - tp->ocpl.FunctAddr = 0; - - if(dev->flags & IFF_PROMISC) - /* Enable promiscuous mode */ - OpenOptions |= COPY_ALL_NON_MAC_FRAMES | - COPY_ALL_MAC_FRAMES; - else - { - if(dev->flags & IFF_ALLMULTI) - { - /* Disable promiscuous mode, use normal mode. */ - tp->ocpl.FunctAddr = 0xFFFFFFFF; - - } - else - { - int i; - struct dev_mc_list *mclist = dev->mc_list; - for (i=0; i< dev->mc_count; i++) - { - ((char *)(&tp->ocpl.FunctAddr))[0] |= - mclist->dmi_addr[2]; - ((char *)(&tp->ocpl.FunctAddr))[1] |= - mclist->dmi_addr[3]; - ((char *)(&tp->ocpl.FunctAddr))[2] |= - mclist->dmi_addr[4]; - ((char *)(&tp->ocpl.FunctAddr))[3] |= - mclist->dmi_addr[5]; - mclist = mclist->next; - } - } - sktr_exec_cmd(dev, OC_SET_FUNCT_ADDR); - } - - tp->ocpl.OPENOptions = OpenOptions; - sktr_exec_cmd(dev, OC_MODIFY_OPEN_PARMS); - return; -} - -/* - * Wait for some time (microseconds) - * - * udelay() is a bit harsh, but using a looser timer causes - * the bring-up-diags to stall indefinitly. - * - */ - -static void sktr_wait(unsigned long time) -{ - udelay(time); - return; -} - -/* - * Write a command value to the SIFCMD register - */ -static void sktr_exec_sifcmd(struct net_device *dev, unsigned int WriteValue) -{ - int ioaddr = dev->base_addr; - unsigned short cmd; - unsigned short SifStsValue; - unsigned long loop_counter; - - WriteValue = ((WriteValue ^ CMD_SYSTEM_IRQ) | CMD_INTERRUPT_ADAPTER); - cmd = (unsigned short)WriteValue; - loop_counter = 0,5 * 800000; - do { - SifStsValue = inw(ioaddr + SIFSTS); - } while((SifStsValue & CMD_INTERRUPT_ADAPTER) && loop_counter--); - outw(cmd, ioaddr + SIFCMD); - - return; -} - -/* - * Processes adapter hardware reset, halts adapter and downloads firmware, - * clears the halt bit. - */ -static int sktr_reset_adapter(struct net_device *dev) -{ - struct net_local *tp = (struct net_local *)dev->priv; - unsigned short *fw_ptr = (unsigned short *)&sktr_code; - unsigned short count, c; - int ioaddr = dev->base_addr; - - /* Hardware adapter reset */ - outw(ACL_ARESET, ioaddr + SIFACL); - sktr_wait(40); - - c = inw(ioaddr + SIFACL); - sktr_wait(20); - - if(dev->dma == 0) /* For PCI adapters */ - { - c &= ~(ACL_SPEED4 | ACL_SPEED16); /* Clear bits */ - if(tp->DataRate == SPEED_4) - c |= ACL_SPEED4; /* Set 4Mbps */ - else - c |= ACL_SPEED16; /* Set 16Mbps */ - } - - /* In case a command is pending - forget it */ - tp->ScbInUse = 0; - - c &= ~ACL_ARESET; /* Clear adapter reset bit */ - c |= ACL_CPHALT; /* Halt adapter CPU, allow download */ - c &= ~ACL_PSDMAEN; /* Clear pseudo dma bit */ - outw(c, ioaddr + SIFACL); - sktr_wait(40); - - /* Download firmware via DIO interface: */ - do { - /* Download first address part */ - outw(*fw_ptr, ioaddr + SIFADX); - fw_ptr++; - - /* Download second address part */ - outw(*fw_ptr, ioaddr + SIFADD); - fw_ptr++; - - if((count = *fw_ptr) != 0) /* Load loop counter */ - { - fw_ptr++; /* Download block data */ - for(; count > 0; count--) - { - outw(*fw_ptr, ioaddr + SIFINC); - fw_ptr++; - } - } - else /* Stop, if last block downloaded */ - { - c = inw(ioaddr + SIFACL); - c &= (~ACL_CPHALT | ACL_SINTEN); - - /* Clear CPHALT and start BUD */ - outw(c, ioaddr + SIFACL); - return (1); - } - } while(count == 0); - - return (-1); -} - -/* - * Starts bring up diagnostics of token ring adapter and evaluates - * diagnostic results. - */ -static int sktr_bringup_diags(struct net_device *dev) -{ - int loop_cnt, retry_cnt; - unsigned short Status; - int ioaddr = dev->base_addr; - - sktr_wait(HALF_SECOND); - sktr_exec_sifcmd(dev, EXEC_SOFT_RESET); - sktr_wait(HALF_SECOND); - - retry_cnt = BUD_MAX_RETRIES; /* maximal number of retrys */ - - do { - retry_cnt--; - if(sktr_debug > 3) - printk(KERN_INFO "BUD-Status: \n"); - loop_cnt = BUD_MAX_LOOPCNT; /* maximum: three seconds*/ - do { /* Inspect BUD results */ - loop_cnt--; - sktr_wait(HALF_SECOND); - Status = inw(ioaddr + SIFSTS); - Status &= STS_MASK; - - if(sktr_debug > 3) - printk(KERN_INFO " %04X \n", Status); - /* BUD successfully completed */ - if(Status == STS_INITIALIZE) - return (1); - /* Unrecoverable hardware error, BUD not completed? */ - } while((loop_cnt > 0) && ((Status & (STS_ERROR | STS_TEST)) - != (STS_ERROR | STS_TEST))); - - /* Error preventing completion of BUD */ - if(retry_cnt > 0) - { - printk(KERN_INFO "%s: Adapter Software Reset.\n", - dev->name); - sktr_exec_sifcmd(dev, EXEC_SOFT_RESET); - sktr_wait(HALF_SECOND); - } - } while(retry_cnt > 0); - - Status = inw(ioaddr + SIFSTS); - Status &= STS_ERROR_MASK; /* Hardware error occurred! */ - - printk(KERN_INFO "%s: Bring Up Diagnostics Error (%04X) occurred\n", - dev->name, Status); - - return (-1); -} - -/* - * Copy initialisation data to adapter memory, beginning at address - * 1:0A00; Starting DMA test and evaluating result bits. - */ -static int sktr_init_adapter(struct net_device *dev) -{ - struct net_local *tp = (struct net_local *)dev->priv; - - const unsigned char SCB_Test[6] = {0x00, 0x00, 0xC1, 0xE2, 0xD4, 0x8B}; - const unsigned char SSB_Test[8] = {0xFF, 0xFF, 0xD1, 0xD7, - 0xC5, 0xD9, 0xC3, 0xD4}; - void *ptr = (void *)&tp->ipb; - unsigned short *ipb_ptr = (unsigned short *)ptr; - unsigned char *cb_ptr = (unsigned char *) &tp->scb; - unsigned char *sb_ptr = (unsigned char *) &tp->ssb; - unsigned short Status; - int i, loop_cnt, retry_cnt; - int ioaddr = dev->base_addr; - - /* Normalize: byte order low/high, word order high/low! (only IPB!) */ - tp->ipb.SCB_Addr = SWAPW(virt_to_bus(&tp->scb)); - tp->ipb.SSB_Addr = SWAPW(virt_to_bus(&tp->ssb)); - - /* Maximum: three initialization retries */ - retry_cnt = INIT_MAX_RETRIES; - - do { - retry_cnt--; - - /* Transfer initialization block */ - outw(0x0001, ioaddr + SIFADX); - - /* To address 0001:0A00 of adapter RAM */ - outw(0x0A00, ioaddr + SIFADD); - - /* Write 11 words to adapter RAM */ - for(i = 0; i < 11; i++) - outw(ipb_ptr[i], ioaddr + SIFINC); - - /* Execute SCB adapter command */ - sktr_exec_sifcmd(dev, CMD_EXECUTE); - - loop_cnt = INIT_MAX_LOOPCNT; /* Maximum: 11 seconds */ - - /* While remaining retries, no error and not completed */ - do { - Status = 0; - loop_cnt--; - sktr_wait(HALF_SECOND); - - /* Mask interesting status bits */ - Status = inw(ioaddr + SIFSTS); - Status &= STS_MASK; - } while(((Status &(STS_INITIALIZE | STS_ERROR | STS_TEST)) != 0) - && ((Status & STS_ERROR) == 0) && (loop_cnt != 0)); - - if((Status & (STS_INITIALIZE | STS_ERROR | STS_TEST)) == 0) - { - /* Initialization completed without error */ - i = 0; - do { /* Test if contents of SCB is valid */ - if(SCB_Test[i] != *(cb_ptr + i)) - /* DMA data error: wrong data in SCB */ - return (-1); - i++; - } while(i < 6); - - i = 0; - do { /* Test if contents of SSB is valid */ - if(SSB_Test[i] != *(sb_ptr + i)) - /* DMA data error: wrong data in SSB */ - return (-1); - i++; - } while (i < 8); - - return (1); /* Adapter successfully initialized */ - } - else - { - if((Status & STS_ERROR) != 0) - { - /* Initialization error occurred */ - Status = inw(ioaddr + SIFSTS); - Status &= STS_ERROR_MASK; - /* ShowInitialisationErrorCode(Status); */ - return (-1); /* Unrecoverable error */ - } - else - { - if(retry_cnt > 0) - { - /* Reset adapter and try init again */ - sktr_exec_sifcmd(dev, EXEC_SOFT_RESET); - sktr_wait(HALF_SECOND); - } - } - } - } while(retry_cnt > 0); - - return (-1); -} - -/* - * Check for outstanding commands in command queue and tries to execute - * command immediately. Corresponding command flag in command queue is cleared. - */ -static void sktr_chk_outstanding_cmds(struct net_device *dev) -{ - struct net_local *tp = (struct net_local *)dev->priv; - unsigned long Addr = 0; - unsigned char i = 0; - - if(tp->CMDqueue == 0) - return; /* No command execution */ - - /* If SCB in use: no command */ - if(tp->ScbInUse == 1) - return; - - /* Check if adapter is opened, avoiding COMMAND_REJECT - * interrupt by the adapter! - */ - if(tp->AdapterOpenFlag == 0) - { - if(tp->CMDqueue & OC_OPEN) - { - /* Execute OPEN command */ - tp->CMDqueue ^= OC_OPEN; - - /* Copy the 18 bytes of the product ID */ - while((AdapterName[i] != '\0') && (i < PROD_ID_SIZE)) - { - tp->ProductID[i] = AdapterName[i]; - i++; - } - - Addr = htonl(virt_to_bus(&tp->ocpl)); - tp->scb.Parm[0] = LOWORD(Addr); - tp->scb.Parm[1] = HIWORD(Addr); - tp->scb.CMD = OPEN; - } - else - /* No OPEN command queued, but adapter closed. Note: - * We'll try to re-open the adapter in DriverPoll() - */ - return; /* No adapter command issued */ - } - else - { - /* Adapter is open; evaluate command queue: try to execute - * outstanding commands (depending on priority!) CLOSE - * command queued - */ - if(tp->CMDqueue & OC_CLOSE) - { - tp->CMDqueue ^= OC_CLOSE; - tp->AdapterOpenFlag = 0; - tp->scb.Parm[0] = 0; /* Parm[0], Parm[1] are ignored */ - tp->scb.Parm[1] = 0; /* but should be set to zero! */ - tp->scb.CMD = CLOSE; - if(!tp->HaltInProgress) - tp->CMDqueue |= OC_OPEN; /* re-open adapter */ - else - tp->CMDqueue = 0; /* no more commands */ - } - else - { - if(tp->CMDqueue & OC_RECEIVE) - { - tp->CMDqueue ^= OC_RECEIVE; - Addr = htonl(virt_to_bus(tp->RplHead)); - tp->scb.Parm[0] = LOWORD(Addr); - tp->scb.Parm[1] = HIWORD(Addr); - tp->scb.CMD = RECEIVE; - } - else - { - if(tp->CMDqueue & OC_TRANSMIT_HALT) - { - /* NOTE: TRANSMIT.HALT must be checked - * before TRANSMIT. - */ - tp->CMDqueue ^= OC_TRANSMIT_HALT; - tp->scb.CMD = TRANSMIT_HALT; - - /* Parm[0] and Parm[1] are ignored - * but should be set to zero! - */ - tp->scb.Parm[0] = 0; - tp->scb.Parm[1] = 0; - } - else - { - if(tp->CMDqueue & OC_TRANSMIT) - { - /* NOTE: TRANSMIT must be - * checked after TRANSMIT.HALT - */ - if(tp->TransmitCommandActive) - { - if(!tp->TransmitHaltScheduled) - { - tp->TransmitHaltScheduled = 1; - sktr_exec_cmd(dev, OC_TRANSMIT_HALT) ; - } - tp->TransmitCommandActive = 0; - return; - } - - tp->CMDqueue ^= OC_TRANSMIT; - sktr_cancel_tx_queue(tp); - Addr = htonl(virt_to_bus(tp->TplBusy)); - tp->scb.Parm[0] = LOWORD(Addr); - tp->scb.Parm[1] = HIWORD(Addr); - tp->scb.CMD = TRANSMIT; - tp->TransmitCommandActive = 1; - } - else - { - if(tp->CMDqueue & OC_MODIFY_OPEN_PARMS) - { - tp->CMDqueue ^= OC_MODIFY_OPEN_PARMS; - tp->scb.Parm[0] = tp->ocpl.OPENOptions; /* new OPEN options*/ - tp->scb.Parm[0] |= ENABLE_FULL_DUPLEX_SELECTION; - tp->scb.Parm[1] = 0; /* is ignored but should be zero */ - tp->scb.CMD = MODIFY_OPEN_PARMS; - } - else - { - if(tp->CMDqueue & OC_SET_FUNCT_ADDR) - { - tp->CMDqueue ^= OC_SET_FUNCT_ADDR; - tp->scb.Parm[0] = LOWORD(tp->ocpl.FunctAddr); - tp->scb.Parm[1] = HIWORD(tp->ocpl.FunctAddr); - tp->scb.CMD = SET_FUNCT_ADDR; - } - else - { - if(tp->CMDqueue & OC_SET_GROUP_ADDR) - { - tp->CMDqueue ^= OC_SET_GROUP_ADDR; - tp->scb.Parm[0] = LOWORD(tp->ocpl.GroupAddr); - tp->scb.Parm[1] = HIWORD(tp->ocpl.GroupAddr); - tp->scb.CMD = SET_GROUP_ADDR; - } - else - { - if(tp->CMDqueue & OC_READ_ERROR_LOG) - { - tp->CMDqueue ^= OC_READ_ERROR_LOG; - Addr = htonl(virt_to_bus(&tp->errorlogtable)); - tp->scb.Parm[0] = LOWORD(Addr); - tp->scb.Parm[1] = HIWORD(Addr); - tp->scb.CMD = READ_ERROR_LOG; - } - else - { - printk(KERN_WARNING "CheckForOutstandingCommand: unknown Command\n"); - tp->CMDqueue = 0; - return; - } - } - } - } - } - } - } - } - } - - tp->ScbInUse = 1; /* Set semaphore: SCB in use. */ - - /* Execute SCB and generate IRQ when done. */ - sktr_exec_sifcmd(dev, CMD_EXECUTE | CMD_SCB_REQUEST); - - return; -} - -/* - * IRQ conditions: signal loss on the ring, transmit or receive of beacon - * frames (disabled if bit 1 of OPEN option is set); report error MAC - * frame transmit (disabled if bit 2 of OPEN option is set); open or short - * cirquit fault on the lobe is detected; remove MAC frame received; - * error counter overflow (255); opened adapter is the only station in ring. - * After some of the IRQs the adapter is closed! - */ -static void sktr_ring_status_irq(struct net_device *dev) -{ - struct net_local *tp = (struct net_local *)dev->priv; - - tp->CurrentRingStatus = SWAPB(tp->ssb.Parm[0]); - - /* First: fill up statistics */ - if(tp->ssb.Parm[0] & SIGNAL_LOSS) - { - printk(KERN_INFO "%s: Signal Loss\n", dev->name); - tp->MacStat.line_errors++; - } - - /* Adapter is closed, but initialized */ - if(tp->ssb.Parm[0] & LOBE_WIRE_FAULT) - { - printk(KERN_INFO "%s: Lobe Wire Fault, Reopen Adapter\n", - dev->name); - tp->MacStat.line_errors++; - } - - if(tp->ssb.Parm[0] & RING_RECOVERY) - printk(KERN_INFO "%s: Ring Recovery\n", dev->name); - - /* Counter overflow: read error log */ - if(tp->ssb.Parm[0] & COUNTER_OVERFLOW) - { - printk(KERN_INFO "%s: Counter Overflow\n", dev->name); - sktr_exec_cmd(dev, OC_READ_ERROR_LOG); - } - - /* Adapter is closed, but initialized */ - if(tp->ssb.Parm[0] & REMOVE_RECEIVED) - printk(KERN_INFO "%s: Remove Received, Reopen Adapter\n", - dev->name); - - /* Adapter is closed, but initialized */ - if(tp->ssb.Parm[0] & AUTO_REMOVAL_ERROR) - printk(KERN_INFO "%s: Auto Removal Error, Reopen Adapter\n", - dev->name); - - if(tp->ssb.Parm[0] & HARD_ERROR) - printk(KERN_INFO "%s: Hard Error\n", dev->name); - - if(tp->ssb.Parm[0] & SOFT_ERROR) - printk(KERN_INFO "%s: Soft Error\n", dev->name); - - if(tp->ssb.Parm[0] & TRANSMIT_BEACON) - printk(KERN_INFO "%s: Transmit Beacon\n", dev->name); - - if(tp->ssb.Parm[0] & SINGLE_STATION) - printk(KERN_INFO "%s: Single Station\n", dev->name); - - /* Check if adapter has been closed */ - if(tp->ssb.Parm[0] & ADAPTER_CLOSED) - { - printk(KERN_INFO "%s: Adapter closed (Reopening)," - "QueueSkb %d, CurrentRingStat %x\n", - dev->name, tp->QueueSkb, tp->CurrentRingStatus); - tp->AdapterOpenFlag = 0; - sktr_open_adapter(dev); - } - - return; -} - -/* - * Issued if adapter has encountered an unrecoverable hardware - * or software error. - */ -static void sktr_chk_irq(struct net_device *dev) -{ - int i; - unsigned short AdapterCheckBlock[4]; - unsigned short ioaddr = dev->base_addr; - struct net_local *tp = (struct net_local *)dev->priv; - - tp->AdapterOpenFlag = 0; /* Adapter closed now */ - - /* Page number of adapter memory */ - outw(0x0001, ioaddr + SIFADX); - /* Address offset */ - outw(CHECKADDR, ioaddr + SIFADR); - - /* Reading 8 byte adapter check block. */ - for(i = 0; i < 4; i++) - AdapterCheckBlock[i] = inw(ioaddr + SIFINC); - - if(sktr_debug > 3) - { - printk("%s: AdapterCheckBlock: ", dev->name); - for (i = 0; i < 4; i++) - printk("%04X", AdapterCheckBlock[i]); - printk("\n"); - } - - switch(AdapterCheckBlock[0]) - { - case DIO_PARITY: - printk(KERN_INFO "%s: DIO parity error\n", dev->name); - break; - - case DMA_READ_ABORT: - printk(KERN_INFO "%s DMA read operation aborted:\n", - dev->name); - switch (AdapterCheckBlock[1]) - { - case 0: - printk(KERN_INFO "Timeout\n"); - printk(KERN_INFO "Address: %04X %04X\n", - AdapterCheckBlock[2], - AdapterCheckBlock[3]); - break; - - case 1: - printk(KERN_INFO "Parity error\n"); - printk(KERN_INFO "Address: %04X %04X\n", - AdapterCheckBlock[2], - AdapterCheckBlock[3]); - break; - - case 2: - printk(KERN_INFO "Bus error\n"); - printk(KERN_INFO "Address: %04X %04X\n", - AdapterCheckBlock[2], - AdapterCheckBlock[3]); - break; - - default: - printk(KERN_INFO "Unknown error.\n"); - break; - } - break; - - case DMA_WRITE_ABORT: - printk(KERN_INFO "%s: DMA write operation aborted: \n", - dev->name); - switch (AdapterCheckBlock[1]) - { - case 0: - printk(KERN_INFO "Timeout\n"); - printk(KERN_INFO "Address: %04X %04X\n", - AdapterCheckBlock[2], - AdapterCheckBlock[3]); - break; - - case 1: - printk(KERN_INFO "Parity error\n"); - printk(KERN_INFO "Address: %04X %04X\n", - AdapterCheckBlock[2], - AdapterCheckBlock[3]); - break; - - case 2: - printk(KERN_INFO "Bus error\n"); - printk(KERN_INFO "Address: %04X %04X\n", - AdapterCheckBlock[2], - AdapterCheckBlock[3]); - break; - - default: - printk(KERN_INFO "Unknown error.\n"); - break; - } - break; - - case ILLEGAL_OP_CODE: - printk("%s: Illegal operation code in firmware\n", - dev->name); - /* Parm[0-3]: adapter internal register R13-R15 */ - break; - - case PARITY_ERRORS: - printk("%s: Adapter internal bus parity error\n", - dev->name); - /* Parm[0-3]: adapter internal register R13-R15 */ - break; - - case RAM_DATA_ERROR: - printk("%s: RAM data error\n", dev->name); - /* Parm[0-1]: MSW/LSW address of RAM location. */ - break; - - case RAM_PARITY_ERROR: - printk("%s: RAM parity error\n", dev->name); - /* Parm[0-1]: MSW/LSW address of RAM location. */ - break; - - case RING_UNDERRUN: - printk("%s: Internal DMA underrun detected\n", - dev->name); - break; - - case INVALID_IRQ: - printk("%s: Unrecognized interrupt detected\n", - dev->name); - /* Parm[0-3]: adapter internal register R13-R15 */ - break; - - case INVALID_ERROR_IRQ: - printk("%s: Unrecognized error interrupt detected\n", - dev->name); - /* Parm[0-3]: adapter internal register R13-R15 */ - break; - - case INVALID_XOP: - printk("%s: Unrecognized XOP request detected\n", - dev->name); - /* Parm[0-3]: adapter internal register R13-R15 */ - break; - - default: - printk("%s: Unknown status", dev->name); - break; - } - - if(sktr_chipset_init(dev) == 1) - { - /* Restart of firmware successful */ - tp->AdapterOpenFlag = 1; - } - - return; -} - -/* - * Internal adapter pointer to RAM data are copied from adapter into - * host system. - */ -static void sktr_read_ptr(struct net_device *dev) -{ - struct net_local *tp = (struct net_local *)dev->priv; - unsigned short adapterram; - - sktr_read_ram(dev, (unsigned char *)&tp->intptrs.BurnedInAddrPtr, - ADAPTER_INT_PTRS, 16); - sktr_read_ram(dev, (unsigned char *)&adapterram, - (unsigned short)SWAPB(tp->intptrs.AdapterRAMPtr), 2); - - printk(KERN_INFO "%s: Adapter RAM size: %d K\n", - dev->name, SWAPB(adapterram)); - - return; -} - -/* - * Reads a number of bytes from adapter to system memory. - */ -static void sktr_read_ram(struct net_device *dev, unsigned char *Data, - unsigned short Address, int Length) -{ - int i; - unsigned short old_sifadx, old_sifadr, InWord; - unsigned short ioaddr = dev->base_addr; - - /* Save the current values */ - old_sifadx = inw(ioaddr + SIFADX); - old_sifadr = inw(ioaddr + SIFADR); - - /* Page number of adapter memory */ - outw(0x0001, ioaddr + SIFADX); - /* Address offset in adapter RAM */ - outw(Address, ioaddr + SIFADR); - - /* Copy len byte from adapter memory to system data area. */ - i = 0; - for(;;) - { - InWord = inw(ioaddr + SIFINC); - - *(Data + i) = HIBYTE(InWord); /* Write first byte */ - if(++i == Length) /* All is done break */ - break; - - *(Data + i) = LOBYTE(InWord); /* Write second byte */ - if (++i == Length) /* All is done break */ - break; - } - - /* Restore original values */ - outw(old_sifadx, ioaddr + SIFADX); - outw(old_sifadr, ioaddr + SIFADR); - - return; -} - -/* - * Reads MAC address from adapter ROM. - */ -static void sktr_read_addr(struct net_device *dev, unsigned char *Address) -{ - int i, In; - unsigned short ioaddr = dev->base_addr; - - /* Address: 0000:0000 */ - outw(0, ioaddr + SIFADX); - outw(0, ioaddr + SIFADR); - - /* Read six byte MAC address data */ - for(i = 0; i < 6; i++) - { - In = inw(ioaddr + SIFINC); - *(Address + i) = (unsigned char)(In >> 8); - } - - return; -} - -/* - * Cancel all queued packets in the transmission queue. - */ -static void sktr_cancel_tx_queue(struct net_local* tp) -{ - TPL *tpl; - struct sk_buff *skb; - - /* - * NOTE: There must not be an active TRANSMIT command pending, when - * this function is called. - */ - if(tp->TransmitCommandActive) - return; - - for(;;) - { - tpl = tp->TplBusy; - if(!tpl->BusyFlag) - break; - /* "Remove" TPL from busy list. */ - tp->TplBusy = tpl->NextTPLPtr; - sktr_write_tpl_status(tpl, 0); /* Clear VALID bit */ - tpl->BusyFlag = 0; /* "free" TPL */ - - printk(KERN_INFO "Cancel tx (%08lXh).\n", (unsigned long)tpl); - - dev_kfree_skb(tpl->Skb); - } - - for(;;) - { - skb = skb_dequeue(&tp->SendSkbQueue); - if(skb == NULL) - break; - tp->QueueSkb++; - dev_kfree_skb(skb); - } - - return; -} - -/* - * This function is called whenever a transmit interrupt is generated by the - * adapter. For a command complete interrupt, it is checked if we have to - * issue a new transmit command or not. - */ -static void sktr_tx_status_irq(struct net_device *dev) -{ - struct net_local *tp = (struct net_local *)dev->priv; - unsigned char HighByte, HighAc, LowAc; - TPL *tpl; - - /* NOTE: At this point the SSB from TRANSMIT STATUS is no longer - * available, because the CLEAR SSB command has already been issued. - * - * Process all complete transmissions. - */ - - for(;;) - { - tpl = tp->TplBusy; - if(!tpl->BusyFlag || (tpl->Status - & (TX_VALID | TX_FRAME_COMPLETE)) - != TX_FRAME_COMPLETE) - { - break; - } - - /* "Remove" TPL from busy list. */ - tp->TplBusy = tpl->NextTPLPtr ; - - if(sktr_debug > 3) - sktr_dump(tpl->MData, SWAPB(tpl->FrameSize)); - - /* Check the transmit status field only for directed frames*/ - if(DIRECTED_FRAME(tpl) && (tpl->Status & TX_ERROR) == 0) - { - HighByte = GET_TRANSMIT_STATUS_HIGH_BYTE(tpl->Status); - HighAc = GET_FRAME_STATUS_HIGH_AC(HighByte); - LowAc = GET_FRAME_STATUS_LOW_AC(HighByte); - - if((HighAc != LowAc) || (HighAc == AC_NOT_RECOGNIZED)) - { - printk(KERN_INFO "%s: (DA=%08lX not recognized)", - dev->name, - *(unsigned long *)&tpl->MData[2+2]); - } - else - { - if(sktr_debug > 3) - printk("%s: Directed frame tx'd\n", - dev->name); - } - } - else - { - if(!DIRECTED_FRAME(tpl)) - { - if(sktr_debug > 3) - printk("%s: Broadcast frame tx'd\n", - dev->name); - } - } - - tp->MacStat.tx_packets++; - dev_kfree_skb(tpl->Skb); - tpl->BusyFlag = 0; /* "free" TPL */ - } - - dev->tbusy = 0; - if(tp->QueueSkb < MAX_TX_QUEUE) - sktr_hardware_send_packet(dev, tp); - - return; -} - -/* - * Called if a frame receive interrupt is generated by the adapter. - * Check if the frame is valid and indicate it to system. - */ -static void sktr_rcv_status_irq(struct net_device *dev) -{ - struct net_local *tp = (struct net_local *)dev->priv; - unsigned char *ReceiveDataPtr; - struct sk_buff *skb; - unsigned int Length, Length2; - RPL *rpl; - RPL *SaveHead; - - /* NOTE: At this point the SSB from RECEIVE STATUS is no longer - * available, because the CLEAR SSB command has already been issued. - * - * Process all complete receives. - */ - - for(;;) - { - rpl = tp->RplHead; - if(rpl->Status & RX_VALID) - break; /* RPL still in use by adapter */ - - /* Forward RPLHead pointer to next list. */ - SaveHead = tp->RplHead; - tp->RplHead = rpl->NextRPLPtr; - - /* Get the frame size (Byte swap for Intel). - * Do this early (see workaround comment below) - */ - Length = (unsigned short)SWAPB(rpl->FrameSize); - - /* Check if the Frame_Start, Frame_End and - * Frame_Complete bits are set. - */ - if((rpl->Status & VALID_SINGLE_BUFFER_FRAME) - == VALID_SINGLE_BUFFER_FRAME) - { - ReceiveDataPtr = rpl->MData; - - /* Workaround for delayed write of FrameSize on ISA - * (FrameSize is false but valid-bit is reset) - * Frame size is set to zero when the RPL is freed. - * Length2 is there because there have also been - * cases where the FrameSize was partially written - */ - Length2 = (unsigned short)SWAPB(rpl->FrameSize); - - if(Length == 0 || Length != Length2) - { - tp->RplHead = SaveHead; - break; /* Return to sktr_interrupt */ - } - - /* Drop frames sent by myself */ - if(sktr_chk_frame(dev, rpl->MData)) - { - if(rpl->Skb != NULL) - dev_kfree_skb(rpl->Skb); - } - else - { - sktr_update_rcv_stats(tp,ReceiveDataPtr,Length); - - if(sktr_debug > 3) - printk("%s: Packet Length %04X (%d)\n", - dev->name, Length, Length); - - /* Indicate the received frame to system. - * The source routing padding is no more - * necessary with 2.2.x kernel. - * See: OpenOptions in sktr_init_opb() - */ - skb = rpl->Skb; - if(rpl->SkbStat == SKB_UNAVAILABLE) - { - /* Try again to allocate skb */ - skb = dev_alloc_skb(tp->MaxPacketSize); - if(skb == NULL) - { - /* Update Stats ?? */ - } - else - { - skb->dev = dev; - skb_put(skb, tp->MaxPacketSize); - rpl->SkbStat = SKB_DATA_COPY; - ReceiveDataPtr = rpl->MData; - } - } - - if(rpl->SkbStat == SKB_DATA_COPY - || rpl->SkbStat == SKB_DMA_DIRECT) - { - if(rpl->SkbStat == SKB_DATA_COPY) - { - memmove(skb->data, ReceiveDataPtr, Length); - } - - /* Deliver frame to system */ - rpl->Skb = NULL; - skb_trim(skb,Length); - skb->dev = dev; - skb->protocol = tr_type_trans(skb,dev); - netif_rx(skb); - } - } - } - else /* Invalid frame */ - { - if(rpl->Skb != NULL) - dev_kfree_skb(rpl->Skb); - - /* Skip list. */ - if(rpl->Status & RX_START_FRAME) - /* Frame start bit is set -> overflow. */ - tp->MacStat.rx_errors++; - } - - /* Allocate new skb for rpl */ - rpl->Skb = dev_alloc_skb(tp->MaxPacketSize); - - /* skb == NULL ? then use local buffer */ - if(rpl->Skb == NULL) - { - rpl->SkbStat = SKB_UNAVAILABLE; - rpl->FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[rpl->RPLIndex])); - rpl->MData = tp->LocalRxBuffers[rpl->RPLIndex]; - } - else /* skb != NULL */ - { - rpl->Skb->dev = dev; - skb_put(rpl->Skb, tp->MaxPacketSize); - - /* Data unreachable for DMA ? then use local buffer */ - if(tp->DeviceType == SK_ISA && - virt_to_bus(rpl->Skb->data) + tp->MaxPacketSize - > ISA_MAX_ADDRESS) - { - rpl->SkbStat = SKB_DATA_COPY; - rpl->FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[rpl->RPLIndex])); - rpl->MData = tp->LocalRxBuffers[rpl->RPLIndex]; - } - else - { - /* DMA directly in skb->data */ - rpl->SkbStat = SKB_DMA_DIRECT; - rpl->FragList[0].DataAddr = htonl(virt_to_bus(rpl->Skb->data)); - rpl->MData = rpl->Skb->data; - } - } - - rpl->FragList[0].DataCount = SWAPB(tp->MaxPacketSize); - rpl->FrameSize = 0; - - /* Pass the last RPL back to the adapter */ - tp->RplTail->FrameSize = 0; - - /* Reset the CSTAT field in the list. */ - sktr_write_rpl_status(tp->RplTail, RX_VALID | RX_FRAME_IRQ); - - /* Current RPL becomes last one in list. */ - tp->RplTail = tp->RplTail->NextRPLPtr; - - /* Inform adapter about RPL valid. */ - sktr_exec_sifcmd(dev, CMD_RX_VALID); - } - - return; -} - -/* - * This function should be used whenever the status of any RPL must be - * modified by the driver, because the compiler may otherwise change the - * order of instructions such that writing the RPL status may be executed - * at an undesireable time. When this function is used, the status is - * always written when the function is called. - */ -static void sktr_write_rpl_status(RPL *rpl, unsigned int Status) -{ - rpl->Status = Status; - - return; -} - -/* - * The function updates the statistic counters in mac->MacStat. - * It differtiates between directed and broadcast/multicast ( ==functional) - * frames. - */ -static void sktr_update_rcv_stats(struct net_local *tp, unsigned char DataPtr[], - unsigned int Length) -{ - tp->MacStat.rx_packets++; - - /* Test functional bit */ - if(DataPtr[2] & GROUP_BIT) - tp->MacStat.multicast++; - - return; -} - -/* - * Check if it is a frame of myself. Compare source address with my current - * address in reverse direction, and mask out the TR_RII. - */ -static unsigned char sktr_chk_frame(struct net_device *dev, unsigned char *Addr) -{ - int i; - - for(i = 5; i > 0; i--) - { - if(Addr[8 + i] != dev->dev_addr[i]) - return (0); - } - - /* Mask out RIF bit. */ - if((Addr[8] & ~TR_RII) != (unsigned char)(dev->dev_addr[0])) - return (0); - - return (1); /* It is my frame. */ -} - -/* - * Dump Packet (data) - */ -static void sktr_dump(unsigned char *Data, int length) -{ - int i, j; - - for (i = 0, j = 0; i < length / 8; i++, j += 8) - { - printk(KERN_DEBUG "%02x %02x %02x %02x %02x %02x %02x %02x\n", - Data[j+0],Data[j+1],Data[j+2],Data[j+3], - Data[j+4],Data[j+5],Data[j+6],Data[j+7]); - } - - return; -} - -#ifdef MODULE - -static struct net_device* dev_sktr[SKTR_MAX_ADAPTERS]; -static int io[SKTR_MAX_ADAPTERS] = { 0, 0 }; -static int irq[SKTR_MAX_ADAPTERS] = { 0, 0 }; -static int mem[SKTR_MAX_ADAPTERS] = { 0, 0 }; - -MODULE_PARM(io, "1-" __MODULE_STRING(SKTR_MAX_ADAPTERS) "i"); -MODULE_PARM(irq, "1-" __MODULE_STRING(SKTR_MAX_ADAPTERS) "i"); -MODULE_PARM(mem, "1-" __MODULE_STRING(SKTR_MAX_ADAPTERS) "i"); - -int init_module(void) -{ - int i; - - for(i = 0; i < SKTR_MAX_ADAPTERS; i++) - { - irq[i] = 0; - mem[i] = 0; - dev_sktr[i] = NULL; - dev_sktr[i] = init_trdev(dev_sktr[i], 0); - if(dev_sktr[i] == NULL) - return (-ENOMEM); - - dev_sktr[i]->base_addr = io[i]; - dev_sktr[i]->irq = irq[i]; - dev_sktr[i]->mem_start = mem[i]; - dev_sktr[i]->init = &sktr_probe; - - if(register_trdev(dev_sktr[i]) != 0) - { - kfree_s(dev_sktr[i], sizeof(struct net_device)); - dev_sktr[i] = NULL; - if(i == 0) - { - printk("sktr: register_trdev() returned non-zero.\n"); - return (-EIO); - } - else - return (0); - } - } - - return (0); -} - -void cleanup_module(void) -{ - int i; - - for(i = 0; i < SKTR_MAX_ADAPTERS; i++) - { - if(dev_sktr[i]) - { - unregister_trdev(dev_sktr[i]); - release_region(dev_sktr[i]->base_addr, SKTR_IO_EXTENT); - if(dev_sktr[i]->irq) - free_irq(dev_sktr[i]->irq, dev_sktr[i]); - if(dev_sktr[i]->dma > 0) - free_dma(dev_sktr[i]->dma); - if(dev_sktr[i]->priv) - kfree_s(dev_sktr[i]->priv, sizeof(struct net_local)); - kfree_s(dev_sktr[i], sizeof(struct net_device)); - dev_sktr[i] = NULL; - } - } -} -#endif /* MODULE */ diff --git a/drivers/net/tokenring/sktr.h b/drivers/net/tokenring/sktr.h index 90b5c382f..e69de29bb 100644 --- a/drivers/net/tokenring/sktr.h +++ b/drivers/net/tokenring/sktr.h @@ -1,1103 +0,0 @@ -/* sktr.h: SysKonnect TokenRing driver for Linux - * - * Authors: - * - Christoph Goos <cgoos@syskonnect.de> - */ - -#ifndef __LINUX_SKTR_H -#define __LINUX_SKTR_H - -#ifdef __KERNEL__ - -#define SKTR_MAX_ADAPTERS 7 - -#define SEND_TIMEOUT 10*HZ - -#define TR_RCF_LONGEST_FRAME_MASK 0x0070 -#define TR_RCF_FRAME4K 0x0030 - -#define SK_ISA 0 -#define SK_PCI 1 - -/*------------------------------------------------------------------*/ -/* Bit order for adapter communication with DMA */ -/* -------------------------------------------------------------- */ -/* Bit 8 | 9| 10| 11|| 12| 13| 14| 15|| 0| 1| 2| 3|| 4| 5| 6| 7| */ -/* -------------------------------------------------------------- */ -/* The bytes in a word must be byte swapped. Also, if a double */ -/* word is used for storage, then the words, as well as the bytes, */ -/* must be swapped. */ -/* Bit order for adapter communication with DIO */ -/* -------------------------------------------------------------- */ -/* Bit 0 | 1| 2| 3|| 4| 5| 6| 7|| 8| 9| 10| 11|| 12| 13| 14| 15| */ -/* -------------------------------------------------------------- */ -/*------------------------------------------------------------------*/ - -/* Swap bytes of a word. */ -#define SWAPB(x) (((unsigned short)((x) << 8)) | ((unsigned short)((x) >> 8))) - -/* Swap words of a long. */ -#define SWAPW(x) (((x) << 16) | ((x) >> 16)) - -/* Get the low byte of a word. */ -#define LOBYTE(w) ((unsigned char)(w)) - -/* Get the high byte of a word. */ -#define HIBYTE(w) ((unsigned char)((unsigned short)(w) >> 8)) - -/* Get the low word of a long. */ -#define LOWORD(l) ((unsigned short)(l)) - -/* Get the high word of a long. */ -#define HIWORD(l) ((unsigned short)((unsigned long)(l) >> 16)) - - - -/* Token ring adapter I/O addresses for normal mode. */ -#define SIFDAT 0L /* SIF/DMA data. */ -#define SIFINC 2L /* IO Word data with auto increment. */ -#define SIFINH 3L /* IO Byte data with auto increment. */ -#define SIFADR 4L /* SIF/DMA Address. */ -#define SIFCMD 6L /* SIF Command. */ -#define SIFSTS 6L /* SIF Status. */ -#define SIFACL 8L /* SIF Adapter Control Register. */ -#define SIFADD 10L /* SIF/DMA Address. */ -#define SIFADX 12L -#define DMALEN 14L /* SIF DMA length. */ -#define POSREG 16L /* Adapter Program Option Select (POS) - * Register: base IO address + 16 byte. - */ -#define POSREG_2 24L /* only for TR4/16+ adapter - * base IO address + 24 byte. - */ - - -/* SIFCMD command codes (high-low) */ -#define CMD_INTERRUPT_ADAPTER 0x8000 /* Cause internal adapter interrupt */ -#define CMD_ADAPTER_RESET 0x4000 /* Hardware reset of adapter */ -#define CMD_SSB_CLEAR 0x2000 /* Acknowledge to adapter to - * system interrupts. - */ -#define CMD_EXECUTE 0x1000 /* Execute SCB command */ -#define CMD_SCB_REQUEST 0x0800 /* Request adapter to interrupt - * system when SCB is available for - * another command. - */ -#define CMD_RX_CONTINUE 0x0400 /* Continue receive after odd pointer - * stop. (odd pointer receive method) - */ -#define CMD_RX_VALID 0x0200 /* Now actual RPL is valid. */ -#define CMD_TX_VALID 0x0100 /* Now actual TPL is valid. (valid - * bit receive/transmit method) - */ -#define CMD_SYSTEM_IRQ 0x0080 /* Adapter-to-attached-system - * interrupt is reset. - */ -#define CMD_CLEAR_SYSTEM_IRQ 0x0080 /* Clear SYSTEM_INTERRUPT bit. - * (write: 1=ignore, 0=reset) - */ -#define EXEC_SOFT_RESET 0xFF00 /* adapter soft reset. (restart - * adapter after hardware reset) - */ - - -/* ACL commands (high-low) */ -#define ACL_SWHLDA 0x0800 /* Software hold acknowledge. */ -#define ACL_SWDDIR 0x0400 /* Data transfer direction. */ -#define ACL_SWHRQ 0x0200 /* Pseudo DMA operation. */ -#define ACL_PSDMAEN 0x0100 /* Enable pseudo system DMA. */ -#define ACL_ARESET 0x0080 /* Adapter hardware reset command. - * (held in reset condition as - * long as bit is set) - */ -#define ACL_CPHALT 0x0040 /* Communication processor halt. - * (can only be set while ACL_ARESET - * bit is set; prevents adapter - * processor from executing code while - * downloading firmware) - */ -#define ACL_BOOT 0x0020 -#define ACL_SINTEN 0x0008 /* System interrupt enable/disable - * (1/0): can be written if ACL_ARESET - * is zero. - */ -#define ACL_SPEED4 0x0003 -#define ACL_SPEED16 0x0001 -#define PS_DMA_MASK (ACL_SWHRQ | ACL_PSDMAEN) - - -/* SIFSTS register return codes (high-low) */ -#define STS_SYSTEM_IRQ 0x0080 /* Adapter-to-attached-system - * interrupt is valid. - */ -#define STS_INITIALIZE 0x0040 /* INITIALIZE status. (ready to - * initialize) - */ -#define STS_TEST 0x0020 /* TEST status. (BUD not completed) */ -#define STS_ERROR 0x0010 /* ERROR status. (unrecoverable - * HW error occurred) - */ -#define STS_MASK 0x00F0 /* Mask interesting status bits. */ -#define STS_ERROR_MASK 0x000F /* Get Error Code by masking the - * interrupt code bits. - */ -#define ADAPTER_INT_PTRS 0x0A00 /* Address offset of adapter internal - * pointers 01:0a00 (high-low) have to - * be read after init and before open. - */ - - -/* Interrupt Codes (only MAC IRQs) */ -#define STS_IRQ_ADAPTER_CHECK 0x0000 /* unrecoverable hardware or - * software error. - */ -#define STS_IRQ_RING_STATUS 0x0004 /* SSB is updated with ring status. */ -#define STS_IRQ_SCB_CLEAR 0x0006 /* SCB clear, following an - * SCB_REQUEST IRQ. - */ -#define STS_IRQ_COMMAND_STATUS 0x0008 /* SSB is updated with command - * status. - */ -#define STS_IRQ_RECEIVE_STATUS 0x000A /* SSB is updated with receive - * status. - */ -#define STS_IRQ_TRANSMIT_STATUS 0x000C /* SSB is updated with transmit - * status - */ -#define STS_IRQ_MASK 0x000F /* = STS_ERROR_MASK. */ - - -/* TRANSMIT_STATUS completion code: (SSB.Parm[0]) */ -#define COMMAND_COMPLETE 0x0080 /* TRANSMIT command completed - * (avoid this!) issue another transmit - * to send additional frames. - */ -#define FRAME_COMPLETE 0x0040 /* Frame has been transmitted; - * INTERRUPT_FRAME bit was set in the - * CSTAT request; indication of possibly - * more than one frame transmissions! - * SSB.Parm[0-1]: 32 bit pointer to - * TPL of last frame. - */ -#define LIST_ERROR 0x0020 /* Error in one of the TPLs that - * compose the frame; TRANSMIT - * terminated; Parm[1-2]: 32 bit pointer - * to TPL which starts the error - * frame; error details in bits 8-13. - * (14?) - */ -#define FRAME_SIZE_ERROR 0x8000 /* FRAME_SIZE does not equal the sum of - * the valid DATA_COUNT fields; - * FRAME_SIZE less than header plus - * information field. (15 bytes + - * routing field) Or if FRAME_SIZE - * was specified as zero in one list. - */ -#define TX_THRESHOLD 0x4000 /* FRAME_SIZE greater than (BUFFER_SIZE - * - 9) * TX_BUF_MAX. - */ -#define ODD_ADDRESS 0x2000 /* Odd forward pointer value is - * read on a list without END_FRAME - * indication. - */ -#define FRAME_ERROR 0x1000 /* START_FRAME bit is (not) anticipated, - * but (not) set. - */ -#define ACCESS_PRIORITY_ERROR 0x0800 /* Access priority requested has not - * been allowed. - */ -#define UNENABLED_MAC_FRAME 0x0400 /* MAC frame has source class of zero - * or MAC frame PCF ATTN field is - * greater than one. - */ -#define ILLEGAL_FRAME_FORMAT 0x0200 /* Bit 0 or FC field was set to one. */ - - -/* - * Since we need to support some functions even if the adapter is in a - * CLOSED state, we have a (pseudo-) command queue which holds commands - * that are outstandig to be executed. - * - * Each time a command completes, an interrupt occurs and the next - * command is executed. The command queue is actually a simple word with - * a bit for each outstandig command. Therefore the commands will not be - * executed in the order they have been queued. - * - * The following defines the command code bits and the command queue: - */ -#define OC_OPEN 0x0001 /* OPEN command */ -#define OC_TRANSMIT 0x0002 /* TRANSMIT command */ -#define OC_TRANSMIT_HALT 0x0004 /* TRANSMIT_HALT command */ -#define OC_RECEIVE 0x0008 /* RECEIVE command */ -#define OC_CLOSE 0x0010 /* CLOSE command */ -#define OC_SET_GROUP_ADDR 0x0020 /* SET_GROUP_ADDR command */ -#define OC_SET_FUNCT_ADDR 0x0040 /* SET_FUNCT_ADDR command */ -#define OC_READ_ERROR_LOG 0x0080 /* READ_ERROR_LOG command */ -#define OC_READ_ADAPTER 0x0100 /* READ_ADAPTER command */ -#define OC_MODIFY_OPEN_PARMS 0x0400 /* MODIFY_OPEN_PARMS command */ -#define OC_RESTORE_OPEN_PARMS 0x0800 /* RESTORE_OPEN_PARMS command */ -#define OC_SET_FIRST_16_GROUP 0x1000 /* SET_FIRST_16_GROUP command */ -#define OC_SET_BRIDGE_PARMS 0x2000 /* SET_BRIDGE_PARMS command */ -#define OC_CONFIG_BRIDGE_PARMS 0x4000 /* CONFIG_BRIDGE_PARMS command */ - -#define OPEN 0x0300 /* C: open command. S: completion. */ -#define TRANSMIT 0x0400 /* C: transmit command. S: completion - * status. (reject: COMMAND_REJECT if - * adapter not opened, TRANSMIT already - * issued or address passed in the SCB - * not word aligned) - */ -#define TRANSMIT_HALT 0x0500 /* C: interrupt TX TPL chain; if no - * TRANSMIT command issued, the command - * is ignored. (completion with TRANSMIT - * status (0x0400)!) - */ -#define RECEIVE 0x0600 /* C: receive command. S: completion - * status. (reject: COMMAND_REJECT if - * adapter not opened, RECEIVE already - * issued or address passed in the SCB - * not word aligned) - */ -#define CLOSE 0x0700 /* C: close adapter. S: completion. - * (COMMAND_REJECT if adapter not open) - */ -#define SET_GROUP_ADDR 0x0800 /* C: alter adapter group address after - * OPEN. S: completion. (COMMAND_REJECT - * if adapter not open) - */ -#define SET_FUNCT_ADDR 0x0900 /* C: alter adapter functional address - * after OPEN. S: completion. - * (COMMAND_REJECT if adapter not open) - */ -#define READ_ERROR_LOG 0x0A00 /* C: read adapter error counters. - * S: completion. (command ignored - * if adapter not open!) - */ -#define READ_ADAPTER 0x0B00 /* C: read data from adapter memory. - * (important: after init and before - * open!) S: completion. (ADAPTER_CHECK - * interrupt if undefined storage area - * read) - */ -#define MODIFY_OPEN_PARMS 0x0D00 /* C: modify some adapter operational - * parameters. (bit correspondend to - * WRAP_INTERFACE is ignored) - * S: completion. (reject: - * COMMAND_REJECT) - */ -#define RESTORE_OPEN_PARMS 0x0E00 /* C: modify some adapter operational - * parameters. (bit correspondend - * to WRAP_INTERFACE is ignored) - * S: completion. (reject: - * COMMAND_REJECT) - */ -#define SET_FIRST_16_GROUP 0x0F00 /* C: alter the first two bytes in - * adapter group address. - * S: completion. (reject: - * COMMAND_REJECT) - */ -#define SET_BRIDGE_PARMS 0x1000 /* C: values and conditions for the - * adapter hardware to use when frames - * are copied for forwarding. - * S: completion. (reject: - * COMMAND_REJECT) - */ -#define CONFIG_BRIDGE_PARMS 0x1100 /* C: .. - * S: completion. (reject: - * COMMAND_REJECT) - */ - -#define SPEED_4 4 -#define SPEED_16 16 /* Default transmission speed */ - - -/* Initialization Parameter Block (IPB); word alignment necessary! */ -#define BURST_SIZE 0x0018 /* Default burst size */ -#define BURST_MODE 0x9F00 /* Burst mode enable */ -#define DMA_RETRIES 0x0505 /* Magic DMA retry number... */ - -#define CYCLE_TIME 3 /* Default AT-bus cycle time: 500 ns - * (later adapter version: fix cycle time!) - */ -#define LINE_SPEED_BIT 0x80 - -/* Macro definition for the wait function. */ -#define ONE_SECOND_TICKS 1000000 -#define HALF_SECOND (ONE_SECOND_TICKS / 2) -#define ONE_SECOND (ONE_SECOND_TICKS) -#define TWO_SECONDS (ONE_SECOND_TICKS * 2) -#define THREE_SECONDS (ONE_SECOND_TICKS * 3) -#define FOUR_SECONDS (ONE_SECOND_TICKS * 4) -#define FIVE_SECONDS (ONE_SECOND_TICKS * 5) - -#define BUFFER_SIZE 2048 /* Buffers on Adapter */ - -#pragma pack(1) -typedef struct { - unsigned short Init_Options; /* Initialize with burst mode; - * LLC disabled. (MAC only) - */ - - /* Interrupt vectors the adapter places on attached system bus. */ - unsigned char CMD_Status_IV; /* Interrupt vector: command status. */ - unsigned char TX_IV; /* Interrupt vector: transmit. */ - unsigned char RX_IV; /* Interrupt vector: receive. */ - unsigned char Ring_Status_IV; /* Interrupt vector: ring status. */ - unsigned char SCB_Clear_IV; /* Interrupt vector: SCB clear. */ - unsigned char Adapter_CHK_IV; /* Interrupt vector: adapter check. */ - - unsigned short RX_Burst_Size; /* Max. number of transfer cycles. */ - unsigned short TX_Burst_Size; /* During DMA burst; even value! */ - unsigned short DMA_Abort_Thrhld; /* Number of DMA retries. */ - - unsigned long SCB_Addr; /* SCB address: even, word aligned, high-low. */ - unsigned long SSB_Addr; /* SSB address: even, word aligned, high-low. */ -} IPB, *IPB_Ptr; -#pragma pack() - -/* - * OPEN Command Parameter List (OCPL) (can be reused, if the adapter has to - * be reopened) - */ -#define BUFFER_SIZE 2048 /* Buffers on Adapter. */ -#define TPL_SIZE 8+6*TX_FRAG_NUM /* Depending on fragments per TPL. */ -#define RPL_SIZE 14 /* (with TI firmware v2.26 handling - * up to nine fragments possible) - */ -#define TX_BUF_MIN 20 /* ??? (Stephan: calculation with */ -#define TX_BUF_MAX 40 /* BUFFER_SIZE and MAX_FRAME_SIZE) ??? - */ -#define DISABLE_EARLY_TOKEN_RELEASE 0x1000 - -/* OPEN Options (high-low) */ -#define WRAP_INTERFACE 0x0080 /* Inserting omitted for test - * purposes; transmit data appears - * as receive data. (usefull for - * testing; change: CLOSE necessary) - */ -#define DISABLE_HARD_ERROR 0x0040 /* On HARD_ERROR & TRANSMIT_BEACON - * no RING.STATUS interrupt. - */ -#define DISABLE_SOFT_ERROR 0x0020 /* On SOFT_ERROR, no RING.STATUS - * interrupt. - */ -#define PASS_ADAPTER_MAC_FRAMES 0x0010 /* Passing unsupported MAC frames - * to system. - */ -#define PASS_ATTENTION_FRAMES 0x0008 /* All changed attention MAC frames are - * passed to the system. - */ -#define PAD_ROUTING_FIELD 0x0004 /* Routing field is padded to 18 - * bytes. - */ -#define FRAME_HOLD 0x0002 /* Adapter waits for entire frame before - * initiating DMA transfer; otherwise: - * DMA transfer initiation if internal - * buffer filled. - */ -#define CONTENDER 0x0001 /* Adapter participates in the monitor - * contention process. - */ -#define PASS_BEACON_MAC_FRAMES 0x8000 /* Adapter passes beacon MAC frames - * to the system. - */ -#define EARLY_TOKEN_RELEASE 0x1000 /* Only valid in 16 Mbps operation; - * 0 = ETR. (no effect in 4 Mbps - * operation) - */ -#define COPY_ALL_MAC_FRAMES 0x0400 /* All MAC frames are copied to - * the system. (after OPEN: duplicate - * address test (DAT) MAC frame is - * first received frame copied to the - * system) - */ -#define COPY_ALL_NON_MAC_FRAMES 0x0200 /* All non MAC frames are copied to - * the system. - */ -#define PASS_FIRST_BUF_ONLY 0x0100 /* Passes only first internal buffer - * of each received frame; FrameSize - * of RPLs must contain internal - * BUFFER_SIZE bits for promiscous mode. - */ -#define ENABLE_FULL_DUPLEX_SELECTION 0x2000 /* Enable the use of full-duplex - * settings with bits in byte 22 in - * ocpl. (new feature in firmware - * version 3.09) - */ - -/* Full-duplex settings */ -#define OPEN_FULL_DUPLEX_OFF 0x0000 -#define OPEN_FULL_DUPLEX_ON 0x00c0 -#define OPEN_FULL_DUPLEX_AUTO 0x0080 - -#define PROD_ID_SIZE 18 /* Length of product ID. */ - -#define TX_FRAG_NUM 3 /* Number of fragments used in one TPL. */ -#define TX_MORE_FRAGMENTS 0x8000 /* Bit set in DataCount to indicate more - * fragments following. - */ - -#define ISA_MAX_ADDRESS 0x00ffffff - -#pragma pack(1) -typedef struct { - unsigned short OPENOptions; - unsigned char NodeAddr[6]; /* Adapter node address; use ROM - * address - */ - unsigned long GroupAddr; /* Multicast: high order - * bytes = 0xC000 - */ - unsigned long FunctAddr; /* High order bytes = 0xC000 */ - unsigned short RxListSize; /* RPL size: 0 (=26), 14, 20 or - * 26 bytes read by the adapter. - * (Depending on the number of - * fragments/list) - */ - unsigned short TxListSize; /* TPL size */ - unsigned short BufSize; /* Is automatically rounded up to the - * nearest nK boundary. - */ - unsigned short FullDuplex; - unsigned short Reserved; - unsigned char TXBufMin; /* Number of adapter buffers reserved - * for transmission a minimum of 2 - * buffers must be allocated. - */ - unsigned char TXBufMax; /* Maximum number of adapter buffers - * for transmit; a minimum of 2 buffers - * must be available for receive. - * Default: 6 - */ - unsigned short ProdIDAddr[2]; /* Pointer to product ID. */ -} OPB, *OPB_Ptr; -#pragma pack() - -/* - * SCB: adapter commands enabled by the host system started by writing - * CMD_INTERRUPT_ADAPTER | CMD_EXECUTE (|SCB_REQUEST) to the SIFCMD IO - * register. (special case: | CMD_SYSTEM_IRQ for initialization) - */ -#pragma pack(1) -typedef struct { - unsigned short CMD; /* Command code */ - unsigned short Parm[2]; /* Pointer to Command Parameter Block */ -} SCB; /* System Command Block (32 bit physical address; big endian)*/ -#pragma pack() - -/* - * SSB: adapter command return status can be evaluated after COMMAND_STATUS - * adapter to system interrupt after reading SSB, the availability of the SSB - * has to be told the adapter by writing CMD_INTERRUPT_ADAPTER | CMD_SSB_CLEAR - * in the SIFCMD IO register. - */ -#pragma pack(1) -typedef struct { - unsigned short STS; /* Status code */ - unsigned short Parm[3]; /* Parameter or pointer to Status Parameter - * Block. - */ -} SSB; /* System Status Block (big endian - physical address) */ -#pragma pack() - -typedef struct { - unsigned short BurnedInAddrPtr; /* Pointer to adapter burned in - * address. (BIA) - */ - unsigned short SoftwareLevelPtr;/* Pointer to software level data. */ - unsigned short AdapterAddrPtr; /* Pointer to adapter addresses. */ - unsigned short AdapterParmsPtr; /* Pointer to adapter parameters. */ - unsigned short MACBufferPtr; /* Pointer to MAC buffer. (internal) */ - unsigned short LLCCountersPtr; /* Pointer to LLC counters. */ - unsigned short SpeedFlagPtr; /* Pointer to data rate flag. - * (4/16 Mbps) - */ - unsigned short AdapterRAMPtr; /* Pointer to adapter RAM found. (KB) */ -} INTPTRS; /* Adapter internal pointers */ - -#pragma pack(1) -typedef struct { - unsigned char Line_Error; /* Line error: code violation in - * frame or in a token, or FCS error. - */ - unsigned char Internal_Error; /* IBM specific. (Reserved_1) */ - unsigned char Burst_Error; - unsigned char ARI_FCI_Error; /* ARI/FCI bit zero in AMP or - * SMP MAC frame. - */ - unsigned char AbortDelimeters; /* IBM specific. (Reserved_2) */ - unsigned char Reserved_3; - unsigned char Lost_Frame_Error; /* Receive of end of transmitted - * frame failed. - */ - unsigned char Rx_Congest_Error; /* Adapter in repeat mode has not - * enough buffer space to copy incoming - * frame. - */ - unsigned char Frame_Copied_Error;/* ARI bit not zero in frame - * addressed to adapter. - */ - unsigned char Frequency_Error; /* IBM specific. (Reserved_4) */ - unsigned char Token_Error; /* (active only in monitor station) */ - unsigned char Reserved_5; - unsigned char DMA_Bus_Error; /* DMA bus errors not exceeding the - * abort thresholds. - */ - unsigned char DMA_Parity_Error; /* DMA parity errors not exceeding - * the abort thresholds. - */ -} ERRORTAB; /* Adapter error counters */ -#pragma pack() - - -/*--------------------- Send and Receive definitions -------------------*/ -#pragma pack(1) -typedef struct { - unsigned short DataCount; /* Value 0, even and odd values are - * permitted; value is unaltered most - * significant bit set: following - * fragments last fragment: most - * significant bit is not evaluated. - * (???) - */ - unsigned long DataAddr; /* Pointer to frame data fragment; - * even or odd. - */ -} Fragment; -#pragma pack() - -#define MAX_FRAG_NUMBERS 9 /* Maximal number of fragments possible to use - * in one RPL/TPL. (depending on TI firmware - * version) - */ -#define MAX_TX_QUEUE 10 /* Maximal number of skb's queued in driver. */ - -/* - * AC (1), FC (1), Dst (6), Src (6), RIF (18), Data (4472) = 4504 - * The packet size can be one of the follows: 548, 1502, 2084, 4504, 8176, - * 11439, 17832. Refer to TMS380 Second Generation Token Ring User's Guide - * Page 2-27. - */ -#define HEADER_SIZE (1 + 1 + 6 + 6) -#define SRC_SIZE 18 -#define MIN_DATA_SIZE 516 -#define DEFAULT_DATA_SIZE 4472 -#define MAX_DATA_SIZE 17800 - -#define DEFAULT_PACKET_SIZE (HEADER_SIZE + SRC_SIZE + DEFAULT_DATA_SIZE) -#define MIN_PACKET_SIZE (HEADER_SIZE + SRC_SIZE + MIN_DATA_SIZE) -#define MAX_PACKET_SIZE (HEADER_SIZE + SRC_SIZE + MAX_DATA_SIZE) - -/* - * Macros to deal with the frame status field. - */ -#define AC_NOT_RECOGNIZED 0x00 -#define GROUP_BIT 0x80 -#define GET_TRANSMIT_STATUS_HIGH_BYTE(Ts) ((unsigned char)((Ts) >> 8)) -#define GET_FRAME_STATUS_HIGH_AC(Fs) ((unsigned char)(((Fs) & 0xC0) >> 6)) -#define GET_FRAME_STATUS_LOW_AC(Fs) ((unsigned char)(((Fs) & 0x0C) >> 2)) -#define DIRECTED_FRAME(Context) (!((Context)->MData[2] & GROUP_BIT)) - - -/*--------------------- Send Functions ---------------------------------*/ -/* define TX_CSTAT _REQUEST (R) and _COMPLETE (C) values (high-low) */ - -#define TX_VALID 0x0080 /* R: set via TRANSMIT.VALID interrupt. - * C: always reset to zero! - */ -#define TX_FRAME_COMPLETE 0x0040 /* R: must be reset to zero. - * C: set to one. - */ -#define TX_START_FRAME 0x0020 /* R: start of a frame: 1 - * C: unchanged. - */ -#define TX_END_FRAME 0x0010 /* R: end of a frame: 1 - * C: unchanged. - */ -#define TX_FRAME_IRQ 0x0008 /* R: request interrupt generation - * after transmission. - * C: unchanged. - */ -#define TX_ERROR 0x0004 /* R: reserved. - * C: set to one if Error occurred. - */ -#define TX_INTERFRAME_WAIT 0x0004 -#define TX_PASS_CRC 0x0002 /* R: set if CRC value is already - * calculated. (valid only in - * FRAME_START TPL) - * C: unchanged. - */ -#define TX_PASS_SRC_ADDR 0x0001 /* R: adapter uses explicit frame - * source address and does not overwrite - * with the adapter node address. - * (valid only in FRAME_START TPL) - * - * C: unchanged. - */ -#define TX_STRIP_FS 0xFF00 /* R: reserved. - * C: if no Transmission Error, - * field contains copy of FS byte after - * stripping of frame. - */ - -/* - * Structure of Transmit Parameter Lists (TPLs) (only one frame every TPL, - * but possibly multiple TPLs for one frame) the length of the TPLs has to be - * initialized in the OPL. (OPEN parameter list) - */ -#define TPL_NUM 9 /* Number of Transmit Parameter Lists. - * !! MUST BE >= 3 !! - */ - -#pragma pack(1) -typedef struct s_TPL TPL; - -struct s_TPL { /* Transmit Parameter List (align on even word boundaries) */ - unsigned long NextTPLAddr; /* Pointer to next TPL in chain; if - * pointer is odd: this is the last - * TPL. Pointing to itself can cause - * problems! - */ - volatile unsigned short Status; /* Initialized by the adapter: - * CSTAT_REQUEST important: update least - * significant bit first! Set by the - * adapter: CSTAT_COMPLETE status. - */ - unsigned short FrameSize; /* Number of bytes to be transmitted - * as a frame including AC/FC, - * Destination, Source, Routing field - * not including CRC, FS, End Delimiter - * (valid only if START_FRAME bit in - * CSTAT nonzero) must not be zero in - * any list; maximum value: (BUFFER_SIZE - * - 8) * TX_BUF_MAX sum of DataCount - * values in FragmentList must equal - * Frame_Size value in START_FRAME TPL! - * frame data fragment list. - */ - - /* TPL/RPL size in OPEN parameter list depending on maximal - * numbers of fragments used in one parameter list. - */ - Fragment FragList[TX_FRAG_NUM]; /* Maximum: nine frame fragments in one - * TPL actual version of firmware: 9 - * fragments possible. - */ -#pragma pack() - - /* Special proprietary data and precalculations */ - - TPL *NextTPLPtr; /* Pointer to next TPL in chain. */ - unsigned char *MData; - struct sk_buff *Skb; - unsigned char TPLIndex; - volatile unsigned char BusyFlag;/* Flag: TPL busy? */ -}; - -/* ---------------------Receive Functions-------------------------------* - * define RECEIVE_CSTAT_REQUEST (R) and RECEIVE_CSTAT_COMPLETE (C) values. - * (high-low) - */ -#define RX_VALID 0x0080 /* R: set; tell adapter with - * RECEIVE.VALID interrupt. - * C: reset to zero. - */ -#define RX_FRAME_COMPLETE 0x0040 /* R: must be reset to zero, - * C: set to one. - */ -#define RX_START_FRAME 0x0020 /* R: must be reset to zero. - * C: set to one on the list. - */ -#define RX_END_FRAME 0x0010 /* R: must be reset to zero. - * C: set to one on the list - * that ends the frame. - */ -#define RX_FRAME_IRQ 0x0008 /* R: request interrupt generation - * after receive. - * C: unchanged. - */ -#define RX_INTERFRAME_WAIT 0x0004 /* R: after receiving a frame: - * interrupt and wait for a - * RECEIVE.CONTINUE. - * C: unchanged. - */ -#define RX_PASS_CRC 0x0002 /* R: if set, the adapter includes - * the CRC in data passed. (last four - * bytes; valid only if FRAME_START is - * set) - * C: set, if CRC is included in - * received data. - */ -#define RX_PASS_SRC_ADDR 0x0001 /* R: adapter uses explicit frame - * source address and does not - * overwrite with the adapter node - * address. (valid only if FRAME_START - * is set) - * C: unchanged. - */ -#define RX_RECEIVE_FS 0xFC00 /* R: reserved; must be reset to zero. - * C: on lists with START_FRAME, field - * contains frame status field from - * received frame; otherwise cleared. - */ -#define RX_ADDR_MATCH 0x0300 /* R: reserved; must be reset to zero. - * C: address match code mask. - */ -#define RX_STATUS_MASK 0x00FF /* Mask for receive status bits. */ - -#define RX_INTERN_ADDR_MATCH 0x0100 /* C: internally address match. */ -#define RX_EXTERN_ADDR_MATCH 0x0200 /* C: externally matched via - * XMATCH/XFAIL interface. - */ -#define RX_INTEXT_ADDR_MATCH 0x0300 /* C: internally and externally - * matched. - */ -#define RX_READY (RX_VALID | RX_FRAME_IRQ) /* Ready for receive. */ - -/* Constants for Command Status Interrupt. - * COMMAND_REJECT status field bit functions (SSB.Parm[0]) - */ -#define ILLEGAL_COMMAND 0x0080 /* Set if an unknown command - * is issued to the adapter - */ -#define ADDRESS_ERROR 0x0040 /* Set if any address field in - * the SCB is odd. (not word aligned) - */ -#define ADAPTER_OPEN 0x0020 /* Command issued illegal with - * open adapter. - */ -#define ADAPTER_CLOSE 0x0010 /* Command issued illegal with - * closed adapter. - */ -#define SAME_COMMAND 0x0008 /* Command issued with same command - * already executing. - */ - -/* OPEN_COMPLETION values (SSB.Parm[0], MSB) */ -#define NODE_ADDR_ERROR 0x0040 /* Wrong address or BIA read - * zero address. - */ -#define LIST_SIZE_ERROR 0x0020 /* If List_Size value not in 0, - * 14, 20, 26. - */ -#define BUF_SIZE_ERROR 0x0010 /* Not enough available memory for - * two buffers. - */ -#define TX_BUF_COUNT_ERROR 0x0004 /* Remaining receive buffers less than - * two. - */ -#define OPEN_ERROR 0x0002 /* Error during ring insertion; more - * information in bits 8-15. - */ - -/* Standard return codes */ -#define GOOD_COMPLETION 0x0080 /* =OPEN_SUCCESSFULL */ -#define INVALID_OPEN_OPTION 0x0001 /* OPEN options are not supported by - * the adapter. - */ - -/* OPEN phases; details of OPEN_ERROR (SSB.Parm[0], LSB) */ -#define OPEN_PHASES_MASK 0xF000 /* Check only the bits 8-11. */ -#define LOBE_MEDIA_TEST 0x1000 -#define PHYSICAL_INSERTION 0x2000 -#define ADDRESS_VERIFICATION 0x3000 -#define PARTICIPATION_IN_RING_POLL 0x4000 -#define REQUEST_INITIALISATION 0x5000 -#define FULLDUPLEX_CHECK 0x6000 - -/* OPEN error codes; details of OPEN_ERROR (SSB.Parm[0], LSB) */ -#define OPEN_ERROR_CODES_MASK 0x0F00 /* Check only the bits 12-15. */ -#define OPEN_FUNCTION_FAILURE 0x0100 /* Unable to transmit to itself or - * frames received before insertion. - */ -#define OPEN_SIGNAL_LOSS 0x0200 /* Signal loss condition detected at - * receiver. - */ -#define OPEN_TIMEOUT 0x0500 /* Insertion timer expired before - * logical insertion. - */ -#define OPEN_RING_FAILURE 0x0600 /* Unable to receive own ring purge - * MAC frames. - */ -#define OPEN_RING_BEACONING 0x0700 /* Beacon MAC frame received after - * ring insertion. - */ -#define OPEN_DUPLICATE_NODEADDR 0x0800 /* Other station in ring found - * with the same address. - */ -#define OPEN_REQUEST_INIT 0x0900 /* RPS present but does not respond. */ -#define OPEN_REMOVE_RECEIVED 0x0A00 /* Adapter received a remove adapter - * MAC frame. - */ -#define OPEN_FULLDUPLEX_SET 0x0D00 /* Got this with full duplex on when - * trying to connect to a normal ring. - */ - -/* SET_BRIDGE_PARMS return codes: */ -#define BRIDGE_INVALID_MAX_LEN 0x4000 /* MAX_ROUTING_FIELD_LENGTH odd, - * less than 6 or > 30. - */ -#define BRIDGE_INVALID_SRC_RING 0x2000 /* SOURCE_RING number zero, too large - * or = TARGET_RING. - */ -#define BRIDGE_INVALID_TRG_RING 0x1000 /* TARGET_RING number zero, too large - * or = SOURCE_RING. - */ -#define BRIDGE_INVALID_BRDGE_NO 0x0800 /* BRIDGE_NUMBER too large. */ -#define BRIDGE_INVALID_OPTIONS 0x0400 /* Invalid bridge options. */ -#define BRIDGE_DIAGS_FAILED 0x0200 /* Diagnostics of TMS380SRA failed. */ -#define BRIDGE_NO_SRA 0x0100 /* The TMS380SRA does not exist in HW - * configuration. - */ - -/* - * Bring Up Diagnostics error codes. - */ -#define BUD_INITIAL_ERROR 0x0 -#define BUD_CHECKSUM_ERROR 0x1 -#define BUD_ADAPTER_RAM_ERROR 0x2 -#define BUD_INSTRUCTION_ERROR 0x3 -#define BUD_CONTEXT_ERROR 0x4 -#define BUD_PROTOCOL_ERROR 0x5 -#define BUD_INTERFACE_ERROR 0x6 - -/* BUD constants */ -#define BUD_MAX_RETRIES 3 -#define BUD_MAX_LOOPCNT 6 -#define BUD_TIMEOUT 3000 - -/* Initialization constants */ -#define INIT_MAX_RETRIES 3 /* Maximum three retries. */ -#define INIT_MAX_LOOPCNT 22 /* Maximum loop counts. */ - -/* RING STATUS field values (high/low) */ -#define SIGNAL_LOSS 0x0080 /* Loss of signal on the ring - * detected. - */ -#define HARD_ERROR 0x0040 /* Transmitting or receiving beacon - * frames. - */ -#define SOFT_ERROR 0x0020 /* Report error MAC frame - * transmitted. - */ -#define TRANSMIT_BEACON 0x0010 /* Transmitting beacon frames on the - * ring. - */ -#define LOBE_WIRE_FAULT 0x0008 /* Open or short circuit in the - * cable to concentrator; adapter - * closed. - */ -#define AUTO_REMOVAL_ERROR 0x0004 /* Lobe wrap test failed, deinserted; - * adapter closed. - */ -#define REMOVE_RECEIVED 0x0001 /* Received a remove ring station MAC - * MAC frame request; adapter closed. - */ -#define COUNTER_OVERFLOW 0x8000 /* Overflow of one of the adapters - * error counters; READ.ERROR.LOG. - */ -#define SINGLE_STATION 0x4000 /* Adapter is the only station on the - * ring. - */ -#define RING_RECOVERY 0x2000 /* Claim token MAC frames on the ring; - * reset after ring purge frame. - */ - -#define ADAPTER_CLOSED (LOBE_WIRE_FAULT | AUTO_REMOVAL_ERROR |\ - REMOVE_RECEIVED) - -/* Adapter_check_block.Status field bit assignments: */ -#define DIO_PARITY 0x8000 /* Adapter detects bad parity - * through direct I/O access. - */ -#define DMA_READ_ABORT 0x4000 /* Aborting DMA read operation - * from system Parm[0]: 0=timeout, - * 1=parity error, 2=bus error; - * Parm[1]: 32 bit pointer to host - * system address at failure. - */ -#define DMA_WRITE_ABORT 0x2000 /* Aborting DMA write operation - * to system. (parameters analogous to - * DMA_READ_ABORT) - */ -#define ILLEGAL_OP_CODE 0x1000 /* Illegal operation code in the - * the adapters firmware Parm[0]-2: - * communications processor registers - * R13-R15. - */ -#define PARITY_ERRORS 0x0800 /* Adapter detects internal bus - * parity error. - */ -#define RAM_DATA_ERROR 0x0080 /* Valid only during RAM testing; - * RAM data error Parm[0-1]: 32 bit - * pointer to RAM location. - */ -#define RAM_PARITY_ERROR 0x0040 /* Valid only during RAM testing; - * RAM parity error Parm[0-1]: 32 bit - * pointer to RAM location. - */ -#define RING_UNDERRUN 0x0020 /* Internal DMA underrun when - * transmitting onto ring. - */ -#define INVALID_IRQ 0x0008 /* Unrecognized interrupt generated - * internal to adapter Parm[0-2]: - * adapter register R13-R15. - */ -#define INVALID_ERROR_IRQ 0x0004 /* Unrecognized error interrupt - * generated Parm[0-2]: adapter register - * R13-R15. - */ -#define INVALID_XOP 0x0002 /* Unrecognized XOP request in - * communication processor Parm[0-2]: - * adapter register R13-R15. - */ -#define CHECKADDR 0x05E0 /* Adapter check status information - * address offset. - */ -#define ROM_PAGE_0 0x0000 /* Adapter ROM page 0. */ - -/* - * RECEIVE.STATUS interrupt result SSB values: (high-low) - * (RECEIVE_COMPLETE field bit definitions in SSB.Parm[0]) - */ -#define RX_COMPLETE 0x0080 /* SSB.Parm[0]; SSB.Parm[1]: 32 - * bit pointer to last RPL. - */ -#define RX_SUSPENDED 0x0040 /* SSB.Parm[0]; SSB.Parm[1]: 32 - * bit pointer to RPL with odd - * forward pointer. - */ - -/* Valid receive CSTAT: */ -#define RX_FRAME_CONTROL_BITS (RX_VALID | RX_START_FRAME | RX_END_FRAME | \ - RX_FRAME_COMPLETE) -#define VALID_SINGLE_BUFFER_FRAME (RX_START_FRAME | RX_END_FRAME | \ - RX_FRAME_COMPLETE) - -typedef enum SKB_STAT SKB_STAT; -enum SKB_STAT { - SKB_UNAVAILABLE, - SKB_DMA_DIRECT, - SKB_DATA_COPY -}; - -/* Receive Parameter List (RPL) The length of the RPLs has to be initialized - * in the OPL. (OPEN parameter list) - */ -#define RPL_NUM 3 - -#define RX_FRAG_NUM 1 /* Maximal number of used fragments in one RPL. - * (up to firmware v2.24: 3, now: up to 9) - */ - -#pragma pack(1) -typedef struct s_RPL RPL; -struct s_RPL { /* Receive Parameter List */ - unsigned long NextRPLAddr; /* Pointer to next RPL in chain - * (normalized = physical 32 bit - * address) if pointer is odd: this - * is last RPL. Pointing to itself can - * cause problems! - */ - volatile unsigned short Status; /* Set by creation of Receive Parameter - * List RECEIVE_CSTAT_COMPLETE set by - * adapter in lists that start or end - * a frame. - */ - volatile unsigned short FrameSize; /* Number of bytes received as a - * frame including AC/FC, Destination, - * Source, Routing field not including - * CRC, FS (Frame Status), End Delimiter - * (valid only if START_FRAME bit in - * CSTAT nonzero) must not be zero in - * any list; maximum value: (BUFFER_SIZE - * - 8) * TX_BUF_MAX sum of DataCount - * values in FragmentList must equal - * Frame_Size value in START_FRAME TPL! - * frame data fragment list - */ - - /* TPL/RPL size in OPEN parameter list depending on maximal numbers - * of fragments used in one parameter list. - */ - Fragment FragList[RX_FRAG_NUM]; /* Maximum: nine frame fragments in - * one TPL. Actual version of firmware: - * 9 fragments possible. - */ -#pragma pack() - - /* Special proprietary data and precalculations. */ - RPL *NextRPLPtr; /* Logical pointer to next RPL in chain. */ - unsigned char *MData; - struct sk_buff *Skb; - SKB_STAT SkbStat; - int RPLIndex; -}; - -/* Information that need to be kept for each board. */ -typedef struct net_local { -#pragma pack(1) - IPB ipb; /* Initialization Parameter Block. */ - SCB scb; /* System Command Block: system to adapter - * communication. - */ - SSB ssb; /* System Status Block: adapter to system - * communication. - */ - OPB ocpl; /* Open Options Parameter Block. */ - - ERRORTAB errorlogtable; /* Adapter statistic error counters. - * (read from adapter memory) - */ - unsigned char ProductID[PROD_ID_SIZE + 1]; /* Product ID */ -#pragma pack() - - TPL Tpl[TPL_NUM]; - TPL *TplFree; - TPL *TplBusy; - unsigned char LocalTxBuffers[TPL_NUM][DEFAULT_PACKET_SIZE]; - - RPL Rpl[RPL_NUM]; - RPL *RplHead; - RPL *RplTail; - unsigned char LocalRxBuffers[RPL_NUM][DEFAULT_PACKET_SIZE]; - - int DataRate; - unsigned char ScbInUse; - unsigned short CMDqueue; - - unsigned int DeviceType; - - unsigned long AdapterOpenFlag:1; - unsigned long AdapterVirtOpenFlag:1; - unsigned long OpenCommandIssued:1; - unsigned long TransmitCommandActive:1; - unsigned long TransmitHaltScheduled:1; - unsigned long HaltInProgress:1; - unsigned long LobeWireFaultLogged:1; - unsigned long ReOpenInProgress:1; - unsigned long Sleeping:1; - - unsigned long LastOpenStatus; - unsigned short CurrentRingStatus; - unsigned long MaxPacketSize; - - unsigned long StartTime; - unsigned long LastSendTime; - - struct sk_buff_head SendSkbQueue; - unsigned short QueueSkb; - - struct tr_statistics MacStat; /* MAC statistics structure */ - - struct timer_list timer; - - wait_queue_head_t wait_for_tok_int; - - INTPTRS intptrs; /* Internal adapter pointer. Must be read - * before OPEN command. - */ -} NET_LOCAL; - -#endif /* __KERNEL__ */ -#endif /* __LINUX_SKTR_H */ diff --git a/drivers/net/tokenring/sktr_firmware.h b/drivers/net/tokenring/sktr_firmware.h index 25dd973d4..e69de29bb 100644 --- a/drivers/net/tokenring/sktr_firmware.h +++ b/drivers/net/tokenring/sktr_firmware.h @@ -1,3616 +0,0 @@ -/* - * The firmware this driver downloads into the tokenring card is a - * separate program and is not GPL'd source code, even though the Linux - * side driver and the routine that loads this data into the card are. - * - * This firmware is licensed to you strictly for use in conjunction - * with the use of SysKonnect TokenRing adapters. There is no - * waranty expressed or implied about its fitness for any purpose. - */ - -/* sktr_firmware.h: SysKonnect TokenRing driver firmware dump for Linux. - * - * Notes: - * - Loaded from sktr_reset_adapter upon adapter reset. - * - * Authors: - * - Christoph Goos <cgoos@syskonnect.de> - */ - -#include <linux/config.h> - -#if defined(CONFIG_SKTR) || defined(CONFIG_SKTR_MODULE) - -unsigned char sktr_code[] = { - 0x00, 0x00, 0x00, 0xA0, 0x00, 0x20, 0x68, 0x54, - 0x73, 0x69, 0x63, 0x20, 0x64, 0x6F, 0x20, 0x65, - 0x73, 0x69, 0x72, 0x20, 0x6C, 0x65, 0x61, 0x65, - 0x65, 0x73, 0x20, 0x64, 0x6E, 0x75, 0x65, 0x64, - 0x20, 0x72, 0x69, 0x6C, 0x65, 0x63, 0x63, 0x6E, - 0x20, 0x65, 0x6E, 0x4F, 0x79, 0x6C, 0x20, 0x2C, - 0x6C, 0x41, 0x20, 0x6C, 0x69, 0x72, 0x68, 0x67, - 0x73, 0x74, 0x72, 0x20, 0x73, 0x65, 0x72, 0x65, - 0x65, 0x76, 0x2E, 0x64, 0x60, 0x01, 0x42, 0x01, - 0x00, 0x08, 0x08, 0x16, 0xB0, 0x03, 0xE0, 0x04, - 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0xFF, 0xFF, - 0xFC, 0x13, 0x80, 0x03, 0xA0, 0x07, 0x42, 0x01, - 0x00, 0x08, 0x20, 0x07, 0x00, 0x00, 0xE0, 0x04, - 0x00, 0x01, 0x8B, 0x07, 0x00, 0x3D, 0x60, 0x01, - 0x42, 0x01, 0x80, 0x00, 0x09, 0x13, 0x8B, 0x07, - 0x00, 0x2D, 0x20, 0xC0, 0x4E, 0x01, 0x80, 0x02, - 0x41, 0x0F, 0x02, 0x11, 0x8B, 0x07, 0x00, 0x3D, - 0x0B, 0xC8, 0x4A, 0x01, 0x00, 0x02, 0x00, 0x90, - 0xA0, 0x09, 0x00, 0xC8, 0x66, 0x01, 0xE0, 0x02, - 0xA0, 0x00, 0xA0, 0x07, 0x04, 0x01, 0x20, 0x00, - 0xA0, 0x01, 0x40, 0x01, 0x00, 0xFE, 0x20, 0x48, - 0x2A, 0xE0, 0x42, 0x01, 0xE0, 0x04, 0x02, 0x01, - 0xE0, 0x04, 0x60, 0x09, 0xE0, 0x04, 0x82, 0x01, - 0x60, 0x01, 0x1C, 0x01, 0x04, 0x00, 0x03, 0x16, - 0xE0, 0x01, 0x40, 0x01, 0x00, 0x0C, 0xA0, 0x06, - 0xBC, 0xA1, 0xA0, 0x07, 0x04, 0x01, 0x2D, 0x00, - 0x20, 0xC2, 0x00, 0xE0, 0x88, 0x02, 0x11, 0xE3, - 0x14, 0x16, 0xA0, 0x07, 0x04, 0x01, 0x2E, 0x00, - 0x60, 0x01, 0x42, 0x01, 0x00, 0x03, 0x0D, 0x16, - 0xA0, 0x07, 0x04, 0x01, 0x21, 0x00, 0x88, 0x07, - 0x00, 0xA0, 0x89, 0x07, 0xFE, 0xFF, 0xA8, 0x09, - 0xA9, 0x09, 0x8A, 0x07, 0x02, 0xE0, 0xA0, 0x06, - 0x84, 0xEC, 0x56, 0x10, 0x88, 0x07, 0x00, 0x90, - 0x89, 0x07, 0xFE, 0x9F, 0xA8, 0x09, 0xA9, 0x09, - 0x8A, 0x07, 0x78, 0xE0, 0xA0, 0x06, 0x84, 0xEC, - 0x4B, 0x10, 0xA0, 0x05, 0x04, 0x01, 0x88, 0x07, - 0x08, 0x00, 0x89, 0x07, 0x7A, 0x00, 0x00, 0x03, - 0x01, 0x00, 0xA0, 0x06, 0xD2, 0xAC, 0x40, 0x10, - 0xA0, 0x06, 0xBC, 0xA1, 0xE0, 0x02, 0xF4, 0x03, - 0x88, 0x07, 0xA0, 0x00, 0x89, 0x07, 0xFE, 0x00, - 0xA0, 0x06, 0xD2, 0xAC, 0x35, 0x10, 0xE0, 0x02, - 0xA0, 0x00, 0xE0, 0x04, 0x7E, 0x01, 0xC8, 0x04, - 0x09, 0x02, 0xF2, 0x03, 0x48, 0x62, 0xE0, 0xC1, - 0x40, 0x01, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x04, - 0x18, 0xCE, 0x09, 0x06, 0xFD, 0x16, 0xA0, 0x01, - 0x40, 0x01, 0x00, 0x40, 0x07, 0xC8, 0x40, 0x01, - 0x88, 0x07, 0xF4, 0x03, 0x89, 0x07, 0xFE, 0x3F, - 0xA0, 0x06, 0xD2, 0xAC, 0x19, 0x10, 0xE0, 0x02, - 0xA0, 0x00, 0xA0, 0x06, 0xFA, 0xAD, 0x14, 0x10, - 0x08, 0xC8, 0x44, 0x04, 0x09, 0xC8, 0x46, 0x04, - 0xA0, 0x06, 0x28, 0xAD, 0x0D, 0x10, 0x81, 0x07, - 0x7C, 0xE0, 0xB1, 0xC0, 0x26, 0x13, 0x01, 0xC8, - 0xE0, 0x00, 0xA0, 0x05, 0x04, 0x01, 0x92, 0x06, - 0x03, 0x10, 0x60, 0xC0, 0xE0, 0x00, 0xF5, 0x10, - 0xE0, 0x01, 0x04, 0x01, 0x10, 0x00, 0xB0, 0x03, - 0xFF, 0x10, 0xA0, 0x01, 0x04, 0x01, 0x00, 0x80, - 0x80, 0x03, 0x80, 0x07, 0xA0, 0x00, 0xC2, 0x04, - 0x80, 0xCC, 0x81, 0x07, 0xAA, 0xA1, 0x82, 0x02, - 0x1E, 0x00, 0x02, 0x16, 0x81, 0x07, 0xB4, 0xA1, - 0x81, 0xC4, 0x81, 0x8C, 0xE9, 0x16, 0x82, 0x02, - 0x7C, 0x00, 0xF2, 0x16, 0x00, 0x03, 0x0F, 0x00, - 0x5B, 0x04, 0x81, 0x07, 0x08, 0xE1, 0x82, 0x07, - 0x04, 0x00, 0xE0, 0x04, 0x80, 0x01, 0xE0, 0x04, - 0x82, 0x01, 0x91, 0xC4, 0xB1, 0x8C, 0xD8, 0x16, - 0x82, 0x02, 0x7C, 0x00, 0xFA, 0x16, 0x20, 0xC8, - 0x04, 0xE0, 0x82, 0x01, 0x20, 0xE8, 0x0C, 0xE0, - 0x82, 0x01, 0x20, 0xC8, 0x10, 0xE0, 0x80, 0x01, - 0x81, 0x07, 0x86, 0xE0, 0xB1, 0xC0, 0x07, 0x13, - 0xB1, 0xC4, 0xFC, 0x10, 0xA0, 0x07, 0x04, 0x01, - 0x2E, 0x00, 0x60, 0x04, 0xAA, 0xA1, 0x81, 0x07, - 0x34, 0xE0, 0x82, 0x07, 0xFC, 0x05, 0x83, 0x07, - 0x0A, 0x00, 0xB1, 0xCC, 0x43, 0x06, 0xFD, 0x16, - 0x02, 0x02, 0x00, 0x06, 0x60, 0xD0, 0x4E, 0x01, - 0xED, 0x13, 0x21, 0x02, 0x00, 0xF7, 0x21, 0x02, - 0x00, 0xC0, 0x81, 0xDC, 0x60, 0xD0, 0x4F, 0x01, - 0xC1, 0xC0, 0x41, 0x09, 0x21, 0x02, 0x00, 0xF0, - 0x81, 0xDC, 0x43, 0x02, 0x00, 0x0F, 0x23, 0x02, - 0x00, 0xF0, 0x83, 0xDC, 0x01, 0x02, 0x32, 0x0C, - 0xA0, 0xC0, 0x44, 0x04, 0xE0, 0xC0, 0x46, 0x04, - 0x03, 0xC1, 0x02, 0x61, 0x84, 0x05, 0x04, 0xC8, - 0x48, 0x04, 0x03, 0xC1, 0x84, 0x05, 0x04, 0xA1, - 0x01, 0xA1, 0x04, 0xC8, 0x30, 0x0C, 0x03, 0xC1, - 0x84, 0x05, 0xF1, 0x04, 0x04, 0x06, 0xFD, 0x16, - 0x08, 0x02, 0x00, 0xA0, 0xA8, 0x09, 0x60, 0xC2, - 0x30, 0x0C, 0x29, 0x02, 0xFF, 0x03, 0xA9, 0x09, - 0x29, 0x02, 0x40, 0x00, 0x80, 0x07, 0x00, 0x90, - 0xA0, 0x09, 0x8A, 0x07, 0xFE, 0x9F, 0x2A, 0x02, - 0xFF, 0x03, 0xAA, 0x09, 0x01, 0x02, 0x32, 0x0C, - 0x05, 0x02, 0x00, 0x00, 0x03, 0xC1, 0x84, 0x05, - 0x11, 0x07, 0xC1, 0x05, 0x85, 0x05, 0x04, 0x06, - 0x0B, 0x13, 0x85, 0x80, 0xF9, 0x1A, 0x05, 0x80, - 0xF8, 0x1A, 0x85, 0x82, 0xF5, 0x1A, 0x05, 0x82, - 0xF4, 0x1A, 0x45, 0x82, 0xF1, 0x1A, 0xF1, 0x10, - 0x20, 0x2D, 0x02, 0x00, 0x60, 0x01, 0x40, 0x01, - 0x00, 0x40, 0x06, 0x16, 0x8A, 0x07, 0x00, 0x08, - 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, 0x48, 0x10, - 0x60, 0x01, 0x42, 0x01, 0x00, 0x80, 0x06, 0x16, - 0x8A, 0x07, 0x00, 0x10, 0xA0, 0x01, 0x42, 0x01, - 0x00, 0x80, 0x3E, 0x10, 0x60, 0x01, 0x02, 0x01, - 0x00, 0x10, 0x0A, 0x16, 0x60, 0x01, 0x00, 0x01, - 0x00, 0x04, 0x06, 0x16, 0x8A, 0x07, 0x00, 0x80, - 0xA0, 0x01, 0x02, 0x01, 0x00, 0x10, 0x30, 0x10, - 0x60, 0x01, 0x02, 0x01, 0x00, 0x08, 0x0A, 0x16, - 0x60, 0x01, 0x00, 0x01, 0x00, 0x04, 0x06, 0x16, - 0xA0, 0x01, 0x02, 0x01, 0x00, 0x08, 0x0D, 0x02, - 0x01, 0x00, 0x0D, 0x10, 0x60, 0x01, 0x02, 0x01, - 0x00, 0x04, 0x16, 0x16, 0x60, 0x01, 0x00, 0x01, - 0x00, 0x08, 0x12, 0x16, 0xA0, 0x01, 0x02, 0x01, - 0x00, 0x04, 0x0D, 0x02, 0x02, 0x00, 0xA0, 0xC3, - 0x0E, 0x01, 0xE0, 0xC3, 0x10, 0x01, 0x8A, 0x07, - 0x00, 0x20, 0x60, 0x01, 0x00, 0x01, 0x00, 0x80, - 0x0B, 0x13, 0x8A, 0x07, 0x00, 0x40, 0x08, 0x10, - 0x8A, 0x07, 0x04, 0x00, 0x05, 0x10, 0x8A, 0x07, - 0x02, 0x00, 0x02, 0x10, 0x8A, 0x07, 0x08, 0x00, - 0x00, 0x03, 0x00, 0x00, 0xE0, 0x04, 0x82, 0x01, - 0x8B, 0x07, 0xE0, 0x05, 0xCA, 0xCE, 0xCD, 0xCE, - 0xCE, 0xCE, 0xCF, 0xC6, 0x20, 0xC3, 0x58, 0x07, - 0x20, 0x23, 0x04, 0xE0, 0x12, 0x13, 0x8B, 0x07, - 0x18, 0xFF, 0x8A, 0x02, 0x00, 0x80, 0x0A, 0x13, - 0x8B, 0x05, 0xCD, 0xA2, 0x8A, 0x02, 0x00, 0x40, - 0x05, 0x13, 0x8A, 0x02, 0x00, 0x20, 0x02, 0x13, - 0x8B, 0x07, 0x1D, 0xFF, 0x0B, 0xC8, 0x04, 0x01, - 0x0D, 0x10, 0x20, 0xD3, 0x05, 0x01, 0xFD, 0x11, - 0x20, 0xD8, 0xDF, 0x07, 0x17, 0x01, 0x8B, 0x07, - 0x80, 0xFF, 0x0B, 0xC8, 0x04, 0x01, 0x20, 0xE8, - 0x0A, 0xE0, 0x00, 0x01, 0xE0, 0xC2, 0x04, 0x01, - 0xE0, 0x22, 0x86, 0xE1, 0xFB, 0x16, 0xE0, 0x02, - 0xA0, 0x00, 0xE0, 0x04, 0x82, 0x01, 0x20, 0xE8, - 0x0A, 0xE0, 0x00, 0x01, 0xE0, 0xC2, 0x00, 0x01, - 0xE0, 0x22, 0x06, 0xE0, 0xF8, 0x13, 0xA0, 0x01, - 0x40, 0x01, 0x00, 0xF6, 0x60, 0x04, 0x90, 0xA0, - 0x00, 0x03, 0x02, 0x00, 0xA0, 0x07, 0x02, 0x01, - 0xFF, 0xDF, 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03, - 0x00, 0x03, 0x02, 0x00, 0x09, 0x07, 0xA0, 0xC2, - 0x04, 0x01, 0x8A, 0x01, 0x80, 0x00, 0x4A, 0x52, - 0x89, 0xD2, 0x0A, 0xC8, 0x04, 0x01, 0xA0, 0xD2, - 0x04, 0x01, 0xF9, 0x16, 0x49, 0x05, 0x89, 0x01, - 0x00, 0x80, 0x49, 0x01, 0x00, 0x40, 0x0E, 0x13, - 0x09, 0xF8, 0x3A, 0x07, 0x60, 0xC2, 0x36, 0x07, - 0x03, 0x16, 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03, - 0xE0, 0x04, 0x36, 0x07, 0x54, 0x04, 0x90, 0x03, - 0xFF, 0xFF, 0x80, 0x03, 0x60, 0x22, 0x86, 0xE1, - 0xC2, 0x13, 0xE0, 0x04, 0x82, 0x01, 0x60, 0x04, - 0xE0, 0xA3, 0x00, 0x03, 0x02, 0x00, 0xA0, 0x07, - 0x62, 0x09, 0xE8, 0x03, 0xC9, 0x04, 0xA0, 0xC1, - 0x34, 0x06, 0x04, 0x16, 0xA0, 0x06, 0x50, 0xB5, - 0xE0, 0x04, 0x20, 0x09, 0x86, 0x07, 0xE8, 0x05, - 0xA0, 0x01, 0x40, 0x01, 0x00, 0x80, 0x20, 0xC2, - 0x84, 0x01, 0x20, 0x48, 0x08, 0xE0, 0x84, 0x01, - 0x20, 0x22, 0x08, 0xE0, 0x08, 0x13, 0x60, 0x01, - 0xAE, 0x01, 0x01, 0x00, 0x04, 0x16, 0xE0, 0x01, - 0x34, 0x06, 0x00, 0x80, 0x06, 0x10, 0x20, 0xC2, - 0x32, 0x09, 0x06, 0x13, 0xE0, 0x01, 0x34, 0x06, - 0x00, 0x08, 0xE0, 0x04, 0x30, 0x06, 0x09, 0x07, - 0xA0, 0x05, 0xEE, 0x05, 0x20, 0x06, 0xEC, 0x05, - 0x02, 0x16, 0x16, 0xC2, 0x03, 0x16, 0x49, 0xC2, - 0x12, 0x16, 0x80, 0x03, 0x98, 0xC5, 0xE8, 0xC1, - 0x02, 0x00, 0xE0, 0xE9, 0x14, 0xE0, 0x04, 0x00, - 0xD7, 0x04, 0x27, 0x02, 0x08, 0x00, 0xA0, 0x06, - 0xE6, 0xB4, 0x16, 0xC2, 0x04, 0x13, 0x28, 0xC8, - 0x08, 0x00, 0xEC, 0x05, 0xEF, 0x13, 0x54, 0x04, - 0x00, 0x03, 0x02, 0x00, 0xE0, 0xC1, 0x86, 0x01, - 0x47, 0x02, 0x0E, 0x00, 0xA7, 0xC2, 0x90, 0xE1, - 0x5A, 0x04, 0x8A, 0x07, 0x00, 0xA0, 0x0A, 0xC8, - 0x86, 0x01, 0xC7, 0xA1, 0x27, 0x02, 0x98, 0xE1, - 0x37, 0xE8, 0x34, 0x06, 0x17, 0xE8, 0xD2, 0x06, - 0xE0, 0x04, 0x30, 0x06, 0x60, 0x04, 0xF2, 0xA9, - 0x0A, 0xE8, 0xD2, 0x06, 0xE0, 0x01, 0x34, 0x06, - 0x00, 0x08, 0xE0, 0x04, 0x30, 0x06, 0x20, 0xE0, - 0x18, 0xE0, 0x5B, 0x04, 0xA0, 0x05, 0x20, 0x09, - 0x20, 0x88, 0x20, 0x09, 0x16, 0xE0, 0xE5, 0x1A, - 0xE0, 0x04, 0x20, 0x09, 0xA0, 0x06, 0xD0, 0xD5, - 0x80, 0x03, 0xA0, 0x05, 0x32, 0x09, 0x80, 0x03, - 0x01, 0xC3, 0xFB, 0x13, 0x60, 0x01, 0x6A, 0x09, - 0x01, 0x00, 0x78, 0x13, 0xA0, 0x05, 0x32, 0x09, - 0x75, 0x10, 0x41, 0xC0, 0x06, 0x13, 0x01, 0xC8, - 0x6C, 0x01, 0xE0, 0xC2, 0x02, 0xFC, 0x01, 0x11, - 0x7B, 0x10, 0x60, 0x01, 0x9C, 0x01, 0x40, 0x00, - 0x79, 0x16, 0x20, 0xD8, 0x2F, 0x09, 0x83, 0x01, - 0x41, 0xC0, 0x04, 0x13, 0x01, 0xC8, 0x8A, 0x01, - 0x01, 0xC8, 0x18, 0x09, 0x86, 0x07, 0x43, 0x00, - 0x06, 0xC8, 0x6C, 0x01, 0x07, 0x02, 0x02, 0xFC, - 0x17, 0xC2, 0x60, 0x04, 0xFA, 0xA6, 0xE0, 0x04, - 0x18, 0x09, 0xC7, 0x61, 0x08, 0x07, 0x60, 0x01, - 0x06, 0xFC, 0x40, 0x00, 0x02, 0x13, 0x08, 0x02, - 0x01, 0x00, 0x09, 0x10, 0x4C, 0xC2, 0x20, 0xC3, - 0x00, 0xFC, 0x2A, 0x13, 0x0C, 0xC8, 0x6C, 0x01, - 0xE0, 0xC2, 0x02, 0xFC, 0x1B, 0x11, 0x4B, 0x01, - 0x00, 0x01, 0xF4, 0x16, 0xC8, 0x22, 0x12, 0x13, - 0xCB, 0x01, 0x00, 0x40, 0x0B, 0xC8, 0x02, 0xFC, - 0x0D, 0x10, 0xE0, 0xC1, 0x18, 0x09, 0x01, 0xC3, - 0x21, 0x13, 0x4C, 0xC2, 0x15, 0x13, 0x0C, 0xC8, - 0x6C, 0x01, 0xE0, 0xC2, 0x02, 0xFC, 0x06, 0x11, - 0xCC, 0x81, 0xD5, 0x13, 0x4C, 0xC2, 0x20, 0xC3, - 0x00, 0xFC, 0xF4, 0x10, 0x09, 0xC8, 0x6C, 0x01, - 0xE0, 0xC2, 0x02, 0xFC, 0x1E, 0x16, 0xA0, 0x07, - 0x02, 0xFC, 0x00, 0x80, 0x09, 0xC3, 0x19, 0x10, - 0x09, 0xC8, 0x6C, 0x01, 0xE0, 0xC2, 0x02, 0xFC, - 0x05, 0x16, 0xA0, 0x07, 0x02, 0xFC, 0x00, 0x80, - 0x09, 0xC3, 0x0F, 0x10, 0xE0, 0xC2, 0x02, 0x0C, - 0x01, 0x11, 0x1E, 0x10, 0x20, 0xD8, 0x00, 0xE2, - 0x83, 0x01, 0x8B, 0x09, 0x8B, 0x09, 0x8B, 0x09, - 0x8B, 0x09, 0xA0, 0x07, 0x8A, 0x01, 0x43, 0x00, - 0x13, 0x10, 0x0C, 0xC8, 0x8A, 0x01, 0x0C, 0xC8, - 0x18, 0x09, 0x0E, 0x10, 0x00, 0x03, 0x02, 0x00, - 0xE0, 0xC0, 0x6C, 0x01, 0x20, 0xC3, 0x8A, 0x01, - 0x20, 0x98, 0x83, 0x01, 0x00, 0xE2, 0x81, 0x13, - 0x60, 0x01, 0x9C, 0x01, 0x40, 0x00, 0xB9, 0x13, - 0x01, 0x83, 0x31, 0x16, 0x03, 0xC8, 0x6C, 0x01, - 0x40, 0x01, 0x10, 0x00, 0x14, 0x16, 0xE0, 0xC2, - 0x2E, 0x06, 0x11, 0x13, 0xE0, 0xC2, 0xF8, 0x05, - 0x0E, 0x13, 0xE0, 0x01, 0x3A, 0x07, 0x00, 0x80, - 0x80, 0x01, 0x10, 0x00, 0xE0, 0xC2, 0x36, 0x07, - 0x06, 0x13, 0xE0, 0x04, 0x36, 0x07, 0x80, 0x01, - 0x20, 0x00, 0x60, 0x04, 0xF2, 0xA9, 0x40, 0x01, - 0x20, 0x00, 0xF9, 0x13, 0x90, 0x03, 0xFF, 0x11, - 0x80, 0x03, 0x08, 0x01, 0x00, 0x04, 0x19, 0x16, - 0x60, 0x01, 0x6A, 0x09, 0x01, 0x00, 0x15, 0x16, - 0x88, 0x01, 0x00, 0x1A, 0xC8, 0x01, 0x00, 0x01, - 0xC8, 0xC5, 0x0F, 0x10, 0xE0, 0x04, 0x18, 0x09, - 0xC0, 0x01, 0x04, 0x00, 0x15, 0x10, 0x81, 0xC1, - 0x01, 0xC8, 0x6C, 0x01, 0x07, 0x02, 0x00, 0xFC, - 0x77, 0xC0, 0x17, 0xC2, 0x48, 0x01, 0x00, 0x18, - 0xE4, 0x13, 0x40, 0x01, 0x40, 0x00, 0x15, 0x16, - 0x80, 0x01, 0x45, 0x00, 0x46, 0xC1, 0x20, 0xD0, - 0x07, 0xFC, 0x60, 0x81, 0x18, 0x09, 0xE6, 0x13, - 0xE0, 0xC2, 0x08, 0xFC, 0x08, 0x11, 0xE0, 0xC2, - 0x0E, 0xFC, 0x07, 0x15, 0x06, 0x13, 0xE0, 0xC2, - 0x14, 0xFC, 0x03, 0x15, 0x02, 0x13, 0xC0, 0x01, - 0x01, 0x00, 0x48, 0x01, 0x00, 0x01, 0x11, 0x13, - 0x40, 0x01, 0x80, 0x40, 0x69, 0x13, 0x60, 0x04, - 0x66, 0xA6, 0x48, 0x01, 0x01, 0x00, 0x03, 0x16, - 0x40, 0x01, 0x00, 0x40, 0x0B, 0x16, 0xC8, 0x01, - 0x00, 0x40, 0xA0, 0x05, 0x32, 0x09, 0xC8, 0xC5, - 0x05, 0x10, 0xC0, 0x01, 0x40, 0x00, 0x40, 0x01, - 0x04, 0x00, 0xEF, 0x13, 0xB7, 0x01, 0x20, 0x00, - 0xD7, 0xC2, 0xC4, 0x62, 0x0B, 0x05, 0x2B, 0x02, - 0xFC, 0xFF, 0xCB, 0xC5, 0x02, 0x15, 0x46, 0x81, - 0x6A, 0x13, 0x08, 0x01, 0x00, 0x5E, 0x67, 0x16, - 0x08, 0x01, 0x88, 0x00, 0x13, 0x16, 0x86, 0x02, - 0x43, 0x00, 0x25, 0x16, 0x40, 0x01, 0x00, 0x40, - 0x0B, 0x13, 0x08, 0x01, 0x03, 0x00, 0x08, 0x13, - 0x84, 0xC2, 0x2A, 0x02, 0xD8, 0xFF, 0x06, 0xC8, - 0x6C, 0x01, 0x0A, 0x68, 0x04, 0xFC, 0x73, 0x10, - 0x60, 0x04, 0xD2, 0xA8, 0x40, 0x01, 0x01, 0x00, - 0xEA, 0x13, 0x08, 0x01, 0x02, 0x00, 0xE7, 0x16, - 0x48, 0x01, 0x01, 0x00, 0xE4, 0x16, 0x40, 0x01, - 0x00, 0x40, 0x04, 0x16, 0x60, 0x01, 0xA8, 0x09, - 0x80, 0x00, 0xDD, 0x13, 0x8A, 0x07, 0x80, 0x00, - 0xA0, 0x06, 0x32, 0xA5, 0xD8, 0x10, 0x00, 0xC0, - 0xE7, 0x11, 0x60, 0xC2, 0x6A, 0x09, 0x40, 0x01, - 0x00, 0x40, 0x0A, 0x13, 0x48, 0x01, 0x01, 0x00, - 0x34, 0x13, 0x48, 0x01, 0x02, 0x00, 0x0A, 0x13, - 0x49, 0x01, 0x04, 0x00, 0xD9, 0x16, 0x06, 0x10, - 0x49, 0x01, 0x02, 0x00, 0x03, 0x13, 0x08, 0x01, - 0x03, 0x00, 0x6E, 0x13, 0x49, 0x01, 0x01, 0x00, - 0x12, 0x13, 0x40, 0x01, 0x80, 0x40, 0x01, 0x16, - 0x46, 0xC1, 0xE0, 0x04, 0x00, 0xFC, 0x87, 0x07, - 0xF8, 0x05, 0x17, 0xC2, 0x14, 0x13, 0xC7, 0x05, - 0x17, 0xC8, 0x6C, 0x01, 0x05, 0xC8, 0x00, 0xFC, - 0xC6, 0xC5, 0x60, 0x04, 0x66, 0xA6, 0x07, 0x02, - 0x02, 0xFC, 0xE0, 0xA1, 0x2C, 0x09, 0xE0, 0xCD, - 0xEE, 0x05, 0xE0, 0xC5, 0x04, 0xFC, 0x20, 0xC8, - 0x2C, 0x09, 0x04, 0xFC, 0xE2, 0x10, 0xC5, 0xCD, - 0xC6, 0xC5, 0x60, 0x04, 0x66, 0xA6, 0x60, 0x04, - 0xB6, 0xA8, 0x06, 0xC8, 0x6C, 0x01, 0x85, 0x81, - 0x1A, 0x13, 0xE0, 0xC2, 0x04, 0xFC, 0x17, 0x15, - 0x86, 0xC2, 0x8A, 0xA2, 0xAA, 0xC1, 0x32, 0x0C, - 0x06, 0xC8, 0x6C, 0x01, 0x0B, 0xA8, 0x04, 0xFC, - 0x1A, 0x09, 0x0A, 0xC8, 0x6C, 0x01, 0xE0, 0xC2, - 0x02, 0xFC, 0xE0, 0x04, 0x00, 0xFC, 0x06, 0xC8, - 0x6C, 0x01, 0x0B, 0xC8, 0x02, 0xFC, 0xA0, 0x06, - 0x3E, 0xB4, 0x06, 0xC8, 0x6C, 0x01, 0xE0, 0x04, - 0x00, 0xFC, 0xA0, 0x01, 0x02, 0xFC, 0x02, 0x00, - 0x87, 0x07, 0x30, 0x06, 0xE7, 0x01, 0x04, 0x00, - 0x40, 0x00, 0xD7, 0x04, 0x27, 0x02, 0x0C, 0x00, - 0x05, 0xC2, 0x60, 0x01, 0x6A, 0x09, 0x04, 0x00, - 0x03, 0x16, 0xE0, 0x01, 0x02, 0xFC, 0x20, 0x00, - 0xA0, 0x06, 0xFC, 0xB4, 0xC0, 0x01, 0x20, 0x00, - 0x60, 0x04, 0x66, 0xA6, 0x48, 0x01, 0x00, 0x18, - 0x03, 0x13, 0x48, 0x01, 0x00, 0x10, 0x02, 0x16, - 0xA0, 0x05, 0x32, 0x09, 0x86, 0x02, 0x43, 0x00, - 0x03, 0x13, 0x40, 0x01, 0x80, 0x40, 0x98, 0x13, - 0x06, 0xC8, 0x6C, 0x01, 0xE0, 0x04, 0x00, 0xFC, - 0x85, 0xC2, 0xA0, 0x06, 0x3E, 0xB4, 0x20, 0x06, - 0x62, 0x09, 0xE6, 0x16, 0xA0, 0x06, 0xD0, 0xD5, - 0xE3, 0x10, 0xA0, 0xC2, 0xF6, 0x05, 0x56, 0x16, - 0x19, 0xC8, 0xF0, 0x05, 0xA9, 0xC2, 0x0A, 0x00, - 0x0D, 0x11, 0xA0, 0xF2, 0x2E, 0x09, 0x0A, 0xD8, - 0x80, 0x01, 0x29, 0xC8, 0x06, 0x00, 0x8C, 0x01, - 0xA0, 0x07, 0x16, 0x09, 0x04, 0x00, 0x09, 0xC8, - 0xF4, 0x05, 0x46, 0x10, 0x29, 0xC8, 0x06, 0x00, - 0x6C, 0x01, 0x20, 0xC8, 0x0E, 0xFC, 0xBC, 0x01, - 0x20, 0xC8, 0x10, 0xFC, 0xB0, 0x01, 0x20, 0xC8, - 0x12, 0xFC, 0xB2, 0x01, 0xA0, 0xF2, 0x2E, 0x09, - 0x8A, 0x01, 0x00, 0x10, 0xA0, 0x01, 0x80, 0x01, - 0x00, 0xC4, 0xE1, 0x10, 0x47, 0x01, 0x08, 0x00, - 0x06, 0x16, 0xA8, 0xC2, 0x06, 0x00, 0xA0, 0x06, - 0x3E, 0xB4, 0xE8, 0x04, 0x06, 0x00, 0x07, 0x01, - 0x20, 0x00, 0x31, 0x13, 0xE8, 0x04, 0x02, 0x00, - 0x3B, 0x10, 0xE0, 0x04, 0x00, 0xFC, 0xA0, 0x06, - 0x3E, 0xB4, 0x29, 0x10, 0x00, 0x03, 0x02, 0x00, - 0x20, 0xC2, 0x8C, 0x01, 0xE0, 0xC0, 0x6C, 0x01, - 0x20, 0xC2, 0xF4, 0x05, 0x28, 0xC8, 0x08, 0x00, - 0x6C, 0x01, 0xE8, 0xC1, 0x0A, 0x00, 0x20, 0xC3, - 0x02, 0xFC, 0x8C, 0x01, 0x20, 0x00, 0x0C, 0xC8, - 0x02, 0xFC, 0x0C, 0x01, 0x00, 0xFE, 0x3B, 0x16, - 0x47, 0x01, 0x40, 0x00, 0x50, 0x13, 0x60, 0xC2, - 0xF0, 0x05, 0xA7, 0x16, 0xE0, 0x04, 0xF4, 0x05, - 0x0C, 0xCA, 0x08, 0x00, 0x47, 0x01, 0x80, 0x00, - 0xC9, 0x16, 0x28, 0xC8, 0x06, 0x00, 0x6C, 0x01, - 0xA0, 0xC2, 0x00, 0xFC, 0xD2, 0x16, 0xE8, 0xC1, - 0x02, 0x00, 0xD7, 0xC2, 0x0F, 0x16, 0x27, 0x02, - 0x10, 0x00, 0xD8, 0x04, 0x57, 0xC2, 0x0E, 0x13, - 0xC7, 0x05, 0x57, 0xC2, 0x48, 0xC6, 0xC8, 0xC5, - 0x03, 0xC8, 0x6C, 0x01, 0x0D, 0x11, 0x90, 0x03, - 0xFF, 0x11, 0x80, 0x03, 0xD7, 0x04, 0xC3, 0x01, - 0x00, 0x80, 0xED, 0x10, 0xE7, 0x01, 0xF4, 0xFF, - 0x20, 0x00, 0xC8, 0xCD, 0xC8, 0xC5, 0xF0, 0x10, - 0x90, 0x03, 0xF8, 0x11, 0xE0, 0x02, 0xC0, 0x00, - 0x60, 0xC3, 0xFA, 0x00, 0xA0, 0xC3, 0xFC, 0x00, - 0xE0, 0xC3, 0xFE, 0x00, 0x54, 0x04, 0xE8, 0xC2, - 0x08, 0x00, 0xA8, 0xC2, 0x06, 0x00, 0x0C, 0xC3, - 0x33, 0x11, 0x20, 0x23, 0x0A, 0xE0, 0x45, 0x13, - 0x20, 0x23, 0x10, 0xE0, 0x46, 0x13, 0x20, 0x23, - 0x0E, 0xE0, 0x13, 0x13, 0xE0, 0x21, 0x16, 0xE0, - 0xB6, 0x16, 0x20, 0x23, 0x06, 0xE0, 0x03, 0x16, - 0x20, 0x27, 0xA8, 0xE4, 0x0A, 0x13, 0xE8, 0xC2, - 0x08, 0x00, 0xA8, 0xC2, 0x06, 0x00, 0x4C, 0x01, - 0x88, 0x00, 0xA9, 0x16, 0x0C, 0x01, 0x44, 0x00, - 0xA6, 0x16, 0x20, 0x06, 0x16, 0x09, 0xA3, 0x13, - 0x0A, 0xC8, 0x6C, 0x01, 0x20, 0xC8, 0x04, 0xE0, - 0x02, 0xFC, 0x0B, 0xC8, 0x6C, 0x01, 0xA0, 0x07, - 0x02, 0xFC, 0x00, 0x81, 0x20, 0xC3, 0x80, 0x01, - 0xA0, 0x01, 0x80, 0x01, 0x00, 0xC4, 0x0C, 0xC8, - 0x80, 0x01, 0x0A, 0xC8, 0x8C, 0x01, 0xAC, 0x10, - 0x0A, 0xC2, 0x0F, 0x13, 0x08, 0xC8, 0x6C, 0x01, - 0xA0, 0xC2, 0x00, 0xFC, 0x20, 0xC3, 0x02, 0xFC, - 0x20, 0x23, 0x12, 0xE0, 0xF5, 0x16, 0x0B, 0xC8, - 0x6C, 0x01, 0x0C, 0xC8, 0x02, 0xFC, 0x60, 0x04, - 0x72, 0xA9, 0x8A, 0x07, 0x00, 0x04, 0x60, 0x04, - 0x8A, 0xA3, 0x8A, 0x07, 0x20, 0x00, 0x60, 0x04, - 0x8A, 0xA3, 0x8A, 0x07, 0x00, 0x02, 0x20, 0x27, - 0x0E, 0xE0, 0x04, 0x16, 0xA0, 0x06, 0x32, 0xA5, - 0xC3, 0x01, 0x00, 0x80, 0xA8, 0xC2, 0x06, 0x00, - 0x60, 0x04, 0x98, 0xA9, 0x00, 0x03, 0x02, 0x00, - 0xC0, 0x01, 0x10, 0x00, 0xE0, 0xC2, 0x2E, 0x06, - 0x08, 0x13, 0xE0, 0xC2, 0xF8, 0x05, 0x05, 0x13, - 0xE0, 0x01, 0x3A, 0x07, 0x00, 0x80, 0x80, 0x01, - 0x10, 0x00, 0x90, 0x03, 0xFF, 0x7F, 0x80, 0x03, - 0x00, 0x03, 0x02, 0x00, 0x20, 0xC2, 0xF6, 0x05, - 0x20, 0xE2, 0xF4, 0x05, 0x0E, 0x16, 0x20, 0xD8, - 0x2E, 0x09, 0x80, 0x01, 0x2B, 0xC8, 0x06, 0x00, - 0x8C, 0x01, 0xA0, 0x07, 0x16, 0x09, 0x04, 0x00, - 0x0B, 0xC8, 0xF4, 0x05, 0x90, 0x03, 0xFF, 0xFF, - 0x80, 0x03, 0x87, 0x07, 0xF0, 0x05, 0xDB, 0x04, - 0x57, 0xC2, 0x05, 0x16, 0xCB, 0xCD, 0xCB, 0xC5, - 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03, 0xC7, 0x05, - 0x57, 0xC2, 0x4B, 0xC6, 0xCB, 0xC5, 0x90, 0x03, - 0xFF, 0xFF, 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, - 0x0B, 0xC2, 0x20, 0xC3, 0xF4, 0x05, 0x0F, 0x13, - 0xA8, 0xC2, 0x0A, 0x00, 0x4A, 0x01, 0x10, 0x00, - 0x16, 0x16, 0xA0, 0x22, 0x04, 0xE0, 0x1A, 0x16, - 0x08, 0xC3, 0xA0, 0x06, 0x36, 0xAC, 0x0C, 0xC2, - 0x20, 0xC3, 0xF4, 0x05, 0x13, 0x16, 0x68, 0x01, - 0x0A, 0x00, 0x10, 0x00, 0x03, 0x13, 0xE0, 0xC2, - 0xF6, 0x05, 0x05, 0x16, 0xA0, 0x06, 0x78, 0xAC, - 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03, 0x87, 0x07, - 0xF0, 0x05, 0xA0, 0x06, 0xE6, 0xB4, 0x90, 0x03, - 0xFF, 0xFF, 0x80, 0x03, 0x87, 0x07, 0xF0, 0x05, - 0xA0, 0x06, 0x2C, 0xB5, 0x80, 0x03, 0x00, 0x03, - 0x02, 0x00, 0x87, 0x07, 0xF0, 0x05, 0xCB, 0xC2, - 0x08, 0x16, 0xA0, 0x06, 0x36, 0xAC, 0x20, 0x07, - 0xF6, 0x05, 0x60, 0xCB, 0xF4, 0x05, 0x02, 0x00, - 0x80, 0x03, 0xE0, 0x04, 0xF6, 0x05, 0x20, 0xC2, - 0xF4, 0x05, 0x05, 0x16, 0x17, 0xC2, 0x03, 0x13, - 0xD8, 0xC5, 0xA0, 0x06, 0x78, 0xAC, 0x80, 0x03, - 0x00, 0x03, 0x02, 0x00, 0x0B, 0xC3, 0xA0, 0x06, - 0x36, 0xAC, 0x8C, 0xC2, 0xCC, 0xC1, 0x27, 0x02, - 0x10, 0x00, 0x88, 0x07, 0xF0, 0x05, 0x88, 0xC1, - 0x18, 0xC2, 0x26, 0x13, 0xA8, 0x82, 0x02, 0x00, - 0xFA, 0x16, 0xE8, 0xC2, 0x0A, 0x00, 0xE0, 0x22, - 0x1E, 0xE0, 0xF5, 0x16, 0x98, 0xC5, 0xE0, 0x22, - 0x1C, 0xE0, 0x0B, 0x16, 0x28, 0xC8, 0x06, 0x00, - 0xF4, 0x00, 0xE0, 0x02, 0xE0, 0x00, 0xA0, 0x06, - 0x3E, 0xB4, 0xE0, 0x02, 0xC0, 0x00, 0xE8, 0x04, - 0x06, 0x00, 0xE0, 0x22, 0x18, 0xE0, 0xE4, 0x13, - 0x20, 0xEA, 0x22, 0xE0, 0x0A, 0x00, 0xA0, 0xEA, - 0x18, 0xE0, 0x04, 0x00, 0xDA, 0x04, 0xA0, 0x06, - 0xE6, 0xB4, 0x47, 0x06, 0x06, 0xC2, 0xD8, 0x10, - 0x06, 0xC8, 0xF2, 0x05, 0x60, 0xCB, 0xF4, 0x05, - 0x02, 0x00, 0x54, 0x04, 0x20, 0xC2, 0xF4, 0x05, - 0x13, 0x13, 0xE0, 0x01, 0x9C, 0x01, 0x00, 0x40, - 0x8B, 0x0B, 0x8B, 0x0B, 0x60, 0x01, 0x9C, 0x01, - 0x00, 0x40, 0x0A, 0x16, 0x60, 0xC2, 0x6C, 0x01, - 0x28, 0xC8, 0x06, 0x00, 0x6C, 0x01, 0xA0, 0xC2, - 0x02, 0xFC, 0x03, 0x11, 0x09, 0xC8, 0x6C, 0x01, - 0x5B, 0x04, 0x09, 0xC8, 0x6C, 0x01, 0x4B, 0xC2, - 0x87, 0x07, 0xF0, 0x05, 0xA0, 0x06, 0x2C, 0xB5, - 0xE0, 0x04, 0xF4, 0x05, 0x59, 0x04, 0xA8, 0xC2, - 0x0A, 0x00, 0x0D, 0x11, 0xA0, 0xF2, 0x2E, 0x09, - 0x0A, 0xD8, 0x80, 0x01, 0x28, 0xC8, 0x06, 0x00, - 0x8C, 0x01, 0xA0, 0x07, 0x16, 0x09, 0x04, 0x00, - 0x08, 0xC8, 0xF4, 0x05, 0x5B, 0x04, 0x20, 0xC3, - 0x6C, 0x01, 0x28, 0xC8, 0x06, 0x00, 0x6C, 0x01, - 0x20, 0xC8, 0x0E, 0xFC, 0xBC, 0x01, 0x20, 0xC8, - 0x10, 0xFC, 0xB0, 0x01, 0x20, 0xC8, 0x12, 0xFC, - 0xB2, 0x01, 0x0C, 0xC8, 0x6C, 0x01, 0xA0, 0xF2, - 0x2E, 0x09, 0x8A, 0x01, 0x00, 0x10, 0xA0, 0x01, - 0x80, 0x01, 0x00, 0xC4, 0xDD, 0x10, 0x48, 0xC0, - 0x89, 0xC0, 0x81, 0x60, 0xC2, 0x05, 0x5B, 0x04, - 0x0B, 0xC3, 0xA0, 0x06, 0xC8, 0xAC, 0x41, 0xCC, - 0x42, 0x06, 0xFD, 0x16, 0xA0, 0x06, 0xC8, 0xAC, - 0x01, 0xC1, 0x44, 0x8C, 0x12, 0x16, 0xC4, 0x05, - 0x42, 0x06, 0xFB, 0x16, 0x04, 0x02, 0x0E, 0xAD, - 0x03, 0x02, 0x01, 0x01, 0x94, 0x06, 0x03, 0x02, - 0x5A, 0x5A, 0x94, 0x06, 0x43, 0x05, 0x94, 0x06, - 0x03, 0x07, 0x94, 0x06, 0xC3, 0x04, 0x94, 0x06, - 0xCC, 0x05, 0x5C, 0x04, 0xCB, 0xC1, 0xA0, 0x06, - 0xC8, 0xAC, 0x43, 0xCC, 0x42, 0x06, 0xFD, 0x16, - 0xA0, 0x06, 0xC8, 0xAC, 0x43, 0x8C, 0xF5, 0x16, - 0x42, 0x06, 0xFC, 0x16, 0x57, 0x04, 0x8B, 0xC2, - 0x08, 0xC0, 0x49, 0xC1, 0x85, 0x05, 0x80, 0x02, - 0x40, 0x00, 0x03, 0x11, 0x80, 0x02, 0x4F, 0x00, - 0x45, 0x12, 0x01, 0x02, 0xC8, 0xAC, 0xA1, 0x09, - 0x01, 0x80, 0x40, 0x13, 0x01, 0x02, 0xF8, 0xAD, - 0xA1, 0x09, 0x01, 0x80, 0x3B, 0x13, 0x60, 0xC0, - 0x06, 0x00, 0xA1, 0x09, 0x01, 0x80, 0x36, 0x13, - 0x81, 0x05, 0x01, 0x80, 0x33, 0x13, 0x4A, 0xC0, - 0xA1, 0x09, 0x01, 0x80, 0x2F, 0x13, 0x00, 0xC8, - 0x6A, 0x01, 0x80, 0x02, 0x80, 0x00, 0x17, 0x14, - 0x01, 0x02, 0x00, 0xF8, 0xA0, 0xC1, 0x40, 0x01, - 0xA0, 0x01, 0x40, 0x01, 0x00, 0x04, 0x02, 0x02, - 0x00, 0x10, 0x03, 0x02, 0x00, 0x04, 0xB1, 0xCC, - 0x43, 0x06, 0xFD, 0x16, 0xA0, 0x01, 0x40, 0x01, - 0x00, 0x40, 0x08, 0x02, 0x10, 0xF8, 0x06, 0xC8, - 0x40, 0x01, 0x00, 0xC0, 0x02, 0x13, 0x08, 0x02, - 0x00, 0xF8, 0x09, 0x02, 0xFE, 0xFB, 0xA0, 0x06, - 0xD2, 0xAC, 0x25, 0x10, 0x80, 0x02, 0x80, 0x00, - 0x09, 0x14, 0x01, 0x02, 0x00, 0xF8, 0x02, 0x02, - 0x00, 0x10, 0x03, 0x02, 0x00, 0x04, 0x72, 0xCC, - 0x43, 0x06, 0xFD, 0x16, 0x80, 0x05, 0x80, 0x02, - 0x80, 0x00, 0x04, 0x12, 0x60, 0x01, 0x04, 0x01, - 0x20, 0x00, 0x05, 0x13, 0x40, 0x81, 0xAB, 0x16, - 0x80, 0x02, 0x80, 0x00, 0x0B, 0x14, 0xA0, 0x07, - 0x6A, 0x01, 0x7E, 0x00, 0x02, 0x02, 0x00, 0x10, - 0x03, 0x02, 0x00, 0x04, 0xC1, 0x04, 0x81, 0xCC, - 0x43, 0x06, 0xFD, 0x16, 0xCA, 0x05, 0x5A, 0x04, - 0x00, 0x02, 0xEA, 0xAD, 0x01, 0x02, 0x1A, 0xAF, - 0x40, 0x02, 0x00, 0xFC, 0x41, 0x02, 0x00, 0xFC, - 0x40, 0x80, 0x04, 0x13, 0xA0, 0x07, 0x04, 0x01, - 0x3C, 0x00, 0x5B, 0x04, 0xC0, 0x04, 0x01, 0x02, - 0x08, 0x00, 0x02, 0x02, 0x00, 0x12, 0xE0, 0xC1, - 0x40, 0x01, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x04, - 0x03, 0x02, 0x00, 0x01, 0x00, 0xC8, 0x6A, 0x01, - 0xA0, 0xCC, 0x10, 0xF8, 0x80, 0x05, 0x03, 0x06, - 0xF9, 0x16, 0x22, 0x02, 0x00, 0x02, 0x01, 0x06, - 0xF3, 0x16, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, - 0x07, 0xC8, 0x40, 0x01, 0x00, 0x02, 0x00, 0x08, - 0x40, 0xC0, 0x01, 0x06, 0x01, 0xC8, 0x6A, 0x01, - 0x61, 0x02, 0x00, 0x80, 0x01, 0xC8, 0x10, 0xF8, - 0x00, 0x06, 0xF6, 0x16, 0xC0, 0x04, 0xC8, 0x04, - 0xC9, 0x04, 0x03, 0x02, 0x00, 0x08, 0x00, 0xC8, - 0x6A, 0x01, 0x80, 0xC1, 0x66, 0x02, 0x00, 0x80, - 0x20, 0xC1, 0x10, 0xF8, 0x06, 0x81, 0x15, 0x16, - 0x08, 0xC2, 0x06, 0x13, 0x80, 0x05, 0x03, 0x06, - 0xF2, 0x16, 0x08, 0xC2, 0x0D, 0x13, 0x19, 0x10, - 0xA0, 0x07, 0x10, 0xF8, 0x55, 0x55, 0x20, 0xC1, - 0x10, 0xF8, 0x84, 0x02, 0x55, 0x55, 0x02, 0x16, - 0x06, 0xC2, 0xF0, 0x10, 0x06, 0x81, 0xEE, 0x13, - 0x5B, 0x04, 0xA0, 0x07, 0x10, 0xF8, 0x55, 0x55, - 0x60, 0xC1, 0x10, 0xF8, 0x05, 0x81, 0x03, 0x13, - 0x85, 0x02, 0x55, 0x55, 0xF5, 0x16, 0x08, 0xC2, - 0xE1, 0x13, 0x40, 0xC2, 0x09, 0x06, 0x48, 0x02, - 0xFF, 0x07, 0xC0, 0x04, 0x01, 0x02, 0x08, 0x00, - 0x02, 0x02, 0x00, 0x12, 0x03, 0x02, 0x00, 0x01, - 0x00, 0xC8, 0x6A, 0x01, 0x32, 0xC8, 0x10, 0xF8, - 0x80, 0x05, 0x03, 0x06, 0xF9, 0x16, 0x22, 0x02, - 0x00, 0x02, 0x01, 0x06, 0xF3, 0x16, 0x88, 0x02, - 0x40, 0x00, 0x13, 0x15, 0x89, 0x02, 0x4F, 0x00, - 0x10, 0x11, 0xC0, 0x04, 0x02, 0x02, 0x00, 0x12, - 0x01, 0x02, 0x08, 0x00, 0x03, 0x02, 0x00, 0x01, - 0x80, 0xCC, 0x03, 0x06, 0xFD, 0x16, 0x22, 0x02, - 0x00, 0x02, 0x01, 0x06, 0xF7, 0x16, 0xCB, 0x05, - 0x5B, 0x04, 0xA0, 0x07, 0x04, 0x01, 0x37, 0x00, - 0x5B, 0x04, 0x33, 0x07, 0x33, 0x07, 0x0C, 0x10, - 0x13, 0x07, 0x23, 0x07, 0x02, 0x00, 0xCB, 0xC8, - 0x06, 0x00, 0x23, 0x02, 0x18, 0x00, 0xE0, 0xCC, - 0x6C, 0x01, 0xCD, 0xCC, 0xCE, 0xCC, 0xCF, 0xCC, - 0x83, 0x07, 0x30, 0x06, 0xD3, 0xC1, 0x0A, 0x13, - 0x83, 0x07, 0x36, 0x07, 0xD3, 0xC1, 0x06, 0x13, - 0x83, 0x07, 0xA0, 0x00, 0x93, 0x00, 0x0C, 0xC8, - 0x6C, 0x01, 0x80, 0x03, 0x63, 0x07, 0x02, 0x00, - 0x2A, 0x15, 0x63, 0xC2, 0x04, 0x00, 0x63, 0x42, - 0x06, 0x00, 0xDB, 0x13, 0x63, 0xC3, 0x1A, 0x00, - 0x49, 0xD2, 0x0C, 0x13, 0xC9, 0x06, 0x49, 0x72, - 0x69, 0xD2, 0xC0, 0xE1, 0xC9, 0x06, 0x49, 0x72, - 0xE9, 0x48, 0x04, 0xE0, 0x04, 0x00, 0x49, 0xCB, - 0x02, 0x00, 0x52, 0x04, 0x69, 0xC2, 0xC0, 0xE1, - 0x49, 0x72, 0x29, 0x02, 0x10, 0x00, 0xC3, 0xC2, - 0xE9, 0xA2, 0xA8, 0xE1, 0x1B, 0xC3, 0x89, 0x02, - 0x12, 0x00, 0x0F, 0x13, 0xDC, 0xC6, 0x03, 0x16, - 0xE9, 0x48, 0x04, 0xE0, 0x04, 0x00, 0x49, 0xCB, - 0x02, 0x00, 0x4C, 0xCB, 0x04, 0x00, 0x90, 0x03, - 0xFF, 0x01, 0x93, 0x00, 0x0C, 0xC8, 0x6C, 0x01, - 0x80, 0x03, 0x0C, 0xC8, 0x6C, 0x01, 0xE0, 0xC6, - 0x00, 0xFC, 0xF1, 0x16, 0xE9, 0x48, 0x04, 0xE0, - 0x04, 0x00, 0x49, 0xCB, 0x02, 0x00, 0x4C, 0xCB, - 0x04, 0x00, 0xED, 0x10, 0x00, 0x03, 0x02, 0x00, - 0xDB, 0xC2, 0x63, 0xC2, 0x04, 0x00, 0x4B, 0x42, - 0x9F, 0x13, 0x49, 0xD2, 0x0E, 0x13, 0xC9, 0x06, - 0x49, 0x72, 0x69, 0xD2, 0xC0, 0xE1, 0xC9, 0x06, - 0x49, 0x72, 0xE9, 0x48, 0x04, 0xE0, 0x04, 0x00, - 0x49, 0xCB, 0x02, 0x00, 0x90, 0x03, 0xFF, 0xFF, - 0x80, 0x03, 0x69, 0xC2, 0xC0, 0xE1, 0x49, 0x72, - 0x29, 0x02, 0x10, 0x00, 0xC3, 0xC2, 0xE9, 0xA2, - 0xA8, 0xE1, 0x1B, 0xC3, 0x89, 0x02, 0x12, 0x00, - 0x0C, 0x13, 0xDC, 0xC6, 0x03, 0x16, 0xE9, 0x48, - 0x04, 0xE0, 0x04, 0x00, 0x49, 0xCB, 0x02, 0x00, - 0x4C, 0xCB, 0x04, 0x00, 0x90, 0x03, 0xFF, 0xFF, - 0x80, 0x03, 0x0C, 0xC8, 0x6C, 0x01, 0xE0, 0xC6, - 0x00, 0xFC, 0xF4, 0x16, 0xF0, 0x10, 0x00, 0x03, - 0x02, 0x00, 0xBB, 0xC2, 0xBB, 0xC1, 0x86, 0xD1, - 0x03, 0x13, 0x86, 0xEA, 0x04, 0x00, 0x13, 0x10, - 0xA6, 0xD1, 0xC0, 0xE1, 0xC6, 0x06, 0x86, 0x71, - 0xCA, 0xC1, 0xE6, 0xA1, 0xB8, 0xE1, 0xA6, 0xEA, - 0x14, 0xE0, 0x04, 0x00, 0x1B, 0xC2, 0x86, 0x02, - 0x02, 0x00, 0x03, 0x16, 0xA0, 0x06, 0x0C, 0xB5, - 0x02, 0x10, 0xA0, 0x06, 0xE6, 0xB4, 0xDA, 0x04, - 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0xAB, 0xC2, - 0x06, 0x00, 0x8C, 0x07, 0xE8, 0x05, 0x5C, 0xC2, - 0x16, 0x13, 0xA0, 0xC1, 0xEC, 0x05, 0x8A, 0x81, - 0x1A, 0x1A, 0xC6, 0xC1, 0x09, 0xC2, 0x59, 0xC2, - 0x20, 0x13, 0xE9, 0xA1, 0x08, 0x00, 0x87, 0x82, - 0xF9, 0x12, 0xA9, 0xA2, 0x08, 0x00, 0x87, 0x62, - 0xCA, 0xCA, 0x08, 0x00, 0x4A, 0x6A, 0x08, 0x00, - 0xC9, 0xC6, 0x0B, 0xC6, 0x80, 0x03, 0xCA, 0xCA, - 0x08, 0x00, 0x0A, 0xC8, 0xEC, 0x05, 0xDB, 0x04, - 0x0B, 0xCF, 0x0B, 0xC7, 0x80, 0x03, 0x8A, 0x61, - 0x46, 0xCA, 0x08, 0x00, 0xCA, 0xCA, 0x08, 0x00, - 0x0A, 0xC8, 0xEC, 0x05, 0xC9, 0xC6, 0x0B, 0xC7, - 0x80, 0x03, 0x87, 0x62, 0xCA, 0xCA, 0x08, 0x00, - 0xDB, 0x04, 0x0B, 0xC6, 0x0B, 0xCB, 0x02, 0x00, - 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0xBB, 0xC1, - 0xDB, 0xC2, 0x8C, 0x07, 0xE8, 0x05, 0x4C, 0xC2, - 0xED, 0x04, 0x02, 0x00, 0x09, 0xC2, 0x59, 0xC2, - 0x18, 0x13, 0xA9, 0x81, 0x02, 0x00, 0xFA, 0x16, - 0xE9, 0x82, 0x04, 0x00, 0xF7, 0x16, 0x49, 0xCB, - 0x04, 0x00, 0x99, 0xC2, 0x0A, 0xC6, 0x0A, 0x13, - 0x08, 0x83, 0x04, 0x13, 0xA9, 0xAA, 0x08, 0x00, - 0x08, 0x00, 0x80, 0x03, 0x2A, 0xA8, 0x08, 0x00, - 0xEC, 0x05, 0x80, 0x03, 0x08, 0xCB, 0x02, 0x00, - 0x80, 0x03, 0x2D, 0x07, 0x02, 0x00, 0x8C, 0x07, - 0x08, 0x00, 0x06, 0xA3, 0x4C, 0xC2, 0x09, 0xC2, - 0x59, 0xC2, 0x13, 0x13, 0xE9, 0x82, 0x04, 0x00, - 0xFA, 0x16, 0xAD, 0x07, 0x02, 0x00, 0x01, 0x00, - 0x49, 0xCB, 0x04, 0x00, 0x19, 0xC6, 0x01, 0x13, - 0x80, 0x03, 0x08, 0x83, 0x04, 0x16, 0xA0, 0x49, - 0x14, 0xE0, 0x04, 0x00, 0x80, 0x03, 0x08, 0xCB, - 0x02, 0x00, 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, - 0x0B, 0x06, 0x1F, 0x11, 0x4D, 0x13, 0x8B, 0x07, - 0x00, 0x4E, 0x60, 0x01, 0x42, 0x01, 0x80, 0x00, - 0x09, 0x13, 0x8B, 0x07, 0x00, 0x3A, 0x20, 0xC1, - 0x4E, 0x01, 0x84, 0x02, 0x41, 0x0F, 0x02, 0x11, - 0x8B, 0x07, 0x00, 0x4E, 0x0B, 0xC8, 0x44, 0x01, - 0xA0, 0x07, 0x62, 0x09, 0xE8, 0x03, 0xE0, 0x01, - 0x40, 0x01, 0x00, 0x02, 0xE0, 0x01, 0x40, 0x01, - 0x00, 0x20, 0x84, 0x07, 0x34, 0xAF, 0x60, 0x04, - 0x42, 0xAF, 0x20, 0xC8, 0x16, 0xE0, 0xE0, 0x00, - 0xE0, 0xC2, 0x6A, 0x09, 0xE0, 0x22, 0x10, 0xE0, - 0x03, 0x13, 0x20, 0xE8, 0x14, 0xE0, 0xE0, 0x00, - 0x20, 0xC8, 0x04, 0xE0, 0x82, 0x01, 0x20, 0xC8, - 0xE2, 0x00, 0x8A, 0x01, 0xE0, 0x04, 0x18, 0x09, - 0xE0, 0x04, 0xF4, 0x05, 0xE0, 0x04, 0xF8, 0x05, - 0xE0, 0x04, 0xF0, 0x05, 0xE0, 0x04, 0x42, 0x07, - 0xA0, 0x07, 0x88, 0x01, 0x20, 0x00, 0xE0, 0xC2, - 0x30, 0x09, 0x09, 0x13, 0xA0, 0x07, 0x88, 0x01, - 0x80, 0x00, 0x20, 0xE8, 0x16, 0xE0, 0x80, 0x01, - 0xE0, 0x01, 0x82, 0x01, 0x00, 0x03, 0x8B, 0x07, - 0x00, 0xA0, 0x0B, 0xE8, 0x86, 0x01, 0x80, 0x03, - 0xE0, 0x04, 0x86, 0x01, 0xE0, 0x01, 0x9C, 0x01, - 0x40, 0x00, 0xE0, 0x01, 0x9C, 0x01, 0x00, 0x40, - 0xCB, 0x04, 0xB0, 0x03, 0x0B, 0x06, 0x04, 0x13, - 0x60, 0x01, 0x9C, 0x01, 0x00, 0x40, 0xF9, 0x16, - 0xE0, 0x04, 0x82, 0x01, 0x20, 0xE8, 0x08, 0xE0, - 0x6A, 0x09, 0x8B, 0x07, 0x00, 0x80, 0x0B, 0xC8, - 0x98, 0x07, 0x0B, 0xC8, 0x78, 0x07, 0x20, 0xC8, - 0x04, 0xE0, 0x82, 0x01, 0x8B, 0x07, 0x6F, 0x87, - 0x0B, 0x48, 0x3A, 0x07, 0xE0, 0xC2, 0x50, 0x07, - 0x8B, 0x02, 0x58, 0x07, 0x10, 0x13, 0x20, 0xE8, - 0x0A, 0xE0, 0x00, 0x01, 0xE0, 0xC2, 0x00, 0x01, - 0xE0, 0x22, 0x06, 0xE0, 0xF8, 0x13, 0x8B, 0x07, - 0x58, 0x07, 0x0B, 0xC8, 0x50, 0x07, 0x8B, 0x07, - 0x0C, 0xB8, 0x0B, 0xC8, 0x52, 0x07, 0x80, 0x03, - 0x00, 0x03, 0x02, 0x00, 0xE0, 0xC2, 0x1A, 0x09, - 0x0C, 0x13, 0x20, 0x06, 0x1C, 0x09, 0x0B, 0xC8, - 0x6C, 0x01, 0x20, 0xC8, 0x00, 0xFC, 0x1A, 0x09, - 0x4B, 0xCB, 0x02, 0x00, 0x90, 0x03, 0xFF, 0xFF, - 0x80, 0x03, 0x41, 0xC0, 0x0F, 0x13, 0x81, 0x80, - 0x0D, 0x13, 0x82, 0xA0, 0xE2, 0xC2, 0x32, 0x0C, - 0x12, 0x09, 0x0B, 0xC8, 0x6C, 0x01, 0xE0, 0x04, - 0x00, 0xFC, 0x20, 0xC3, 0x02, 0xFC, 0x07, 0x11, - 0x02, 0xC8, 0x00, 0xFC, 0xED, 0x04, 0x02, 0x00, - 0xE0, 0x04, 0x6C, 0x01, 0x80, 0x03, 0x42, 0xCB, - 0x02, 0x00, 0x02, 0xC8, 0x6C, 0x01, 0x8B, 0xC0, - 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0x83, 0x07, - 0x00, 0x80, 0x60, 0xC2, 0x7E, 0x09, 0x09, 0xC1, - 0x24, 0x02, 0xF8, 0xFF, 0xA9, 0x08, 0x01, 0x02, - 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x0B, 0x02, - 0x00, 0x00, 0x0C, 0x02, 0x00, 0x00, 0x07, 0x02, - 0x00, 0x00, 0x2C, 0xCB, 0x32, 0x0C, 0x32, 0x0C, - 0x06, 0x13, 0x8B, 0x05, 0xCC, 0x05, 0x0B, 0x88, - 0x46, 0x04, 0x27, 0x1B, 0xF6, 0x10, 0x09, 0xC2, - 0x8B, 0xC2, 0x08, 0x06, 0x0A, 0x13, 0x8B, 0x05, - 0xCC, 0x05, 0x0B, 0x88, 0x46, 0x04, 0x1D, 0x1B, - 0x2C, 0xCB, 0x32, 0x0C, 0x32, 0x0C, 0xED, 0x16, - 0xF4, 0x10, 0x82, 0xC0, 0x14, 0x13, 0x02, 0xC8, - 0x6C, 0x01, 0x0A, 0xC8, 0x00, 0xFC, 0x0A, 0xC8, - 0x6C, 0x01, 0xE0, 0x04, 0x00, 0xFC, 0xA0, 0x07, - 0x02, 0xFC, 0x00, 0x80, 0x04, 0xC8, 0x04, 0xFC, - 0x0A, 0xC2, 0x08, 0xA2, 0x02, 0xCA, 0x32, 0x0C, - 0x8A, 0xC0, 0x87, 0x05, 0xD6, 0x10, 0x4A, 0xC0, - 0xEE, 0x10, 0x47, 0xCB, 0x02, 0x00, 0xE0, 0x04, - 0x6C, 0x01, 0x8B, 0x07, 0x43, 0x00, 0xE0, 0x04, - 0x00, 0x0C, 0x00, 0x03, 0x02, 0x00, 0x0B, 0xC8, - 0x6C, 0x01, 0x8B, 0x02, 0x43, 0x00, 0x04, 0x13, - 0x60, 0x01, 0x02, 0xFC, 0x20, 0x00, 0x06, 0x13, - 0x8B, 0xC2, 0xA0, 0x06, 0x42, 0xB4, 0x90, 0x03, - 0x7F, 0x00, 0x80, 0x03, 0xA0, 0x01, 0x02, 0xFC, - 0x20, 0x00, 0x60, 0x01, 0x6A, 0x09, 0x01, 0x00, - 0x0B, 0x16, 0x0A, 0x02, 0x02, 0xFC, 0xA0, 0xA2, - 0x2C, 0x09, 0xA0, 0xCE, 0xEE, 0x05, 0xA0, 0xC6, - 0x04, 0xFC, 0x20, 0xC8, 0x2C, 0x09, 0x04, 0xFC, - 0x8A, 0x07, 0xF8, 0x05, 0x5A, 0xC2, 0x08, 0x13, - 0xCA, 0x05, 0x5A, 0xC2, 0x09, 0xC8, 0x6C, 0x01, - 0x0B, 0xC8, 0x00, 0xFC, 0x8B, 0xC6, 0x02, 0x10, - 0x8B, 0xCE, 0x8B, 0xC6, 0x20, 0x20, 0x1A, 0xE0, - 0x05, 0x16, 0x20, 0xE8, 0x04, 0xE0, 0x3A, 0x07, - 0xE0, 0x04, 0x36, 0x07, 0x90, 0x03, 0x7F, 0x00, - 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0x0B, 0xC8, - 0x6C, 0x01, 0xCC, 0x04, 0xE0, 0x04, 0x00, 0xFC, - 0x8B, 0xC2, 0xA0, 0x06, 0x50, 0xB4, 0x90, 0x03, - 0x7F, 0x00, 0x80, 0x03, 0xA0, 0x07, 0x02, 0xFC, - 0x00, 0x80, 0x20, 0xC8, 0x8C, 0xE1, 0x04, 0xFC, - 0x41, 0xC0, 0x0F, 0x16, 0x20, 0xD8, 0x00, 0xE2, - 0x83, 0x01, 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, - 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, - 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, 0x0A, 0xC8, - 0x8A, 0x01, 0x5B, 0x04, 0x0A, 0xC8, 0x6C, 0x01, - 0x20, 0xC3, 0x00, 0xFC, 0xE0, 0x04, 0x00, 0xFC, - 0x8A, 0x02, 0x43, 0x00, 0xDF, 0x13, 0xA0, 0x07, - 0x02, 0xFC, 0x00, 0x80, 0x04, 0xC8, 0x04, 0xFC, - 0x20, 0x98, 0x84, 0x09, 0x1D, 0x09, 0x0A, 0x13, - 0x20, 0xC8, 0x1A, 0x09, 0x00, 0xFC, 0x0A, 0xC8, - 0x1A, 0x09, 0xA0, 0x05, 0x1C, 0x09, 0x8C, 0xC2, - 0xE5, 0x16, 0x5B, 0x04, 0x41, 0xC0, 0x10, 0x13, - 0x8A, 0xA2, 0x82, 0xCA, 0x32, 0x0C, 0x1A, 0x09, - 0x02, 0xC8, 0x6C, 0x01, 0x0A, 0xC8, 0x00, 0xFC, - 0x8A, 0xC0, 0x20, 0x98, 0x83, 0x01, 0x00, 0xE2, - 0x09, 0x13, 0x8C, 0xC2, 0xD3, 0x16, 0x5B, 0x04, - 0x4A, 0xC0, 0x8A, 0xC0, 0x20, 0x98, 0x83, 0x01, - 0x00, 0xE2, 0x1B, 0x16, 0xE0, 0x01, 0x9C, 0x01, - 0x40, 0x00, 0xA0, 0x07, 0x64, 0x09, 0x00, 0x70, - 0x60, 0x01, 0x9C, 0x01, 0x40, 0x00, 0x07, 0x13, - 0x20, 0x06, 0x64, 0x09, 0xF9, 0x16, 0x0A, 0x02, - 0x00, 0x01, 0x60, 0x04, 0x8A, 0xA3, 0x60, 0x01, - 0x02, 0x0C, 0x00, 0x01, 0xE2, 0x13, 0x20, 0xD8, - 0x2F, 0x09, 0x83, 0x01, 0xA0, 0x07, 0x02, 0x0C, - 0x00, 0x80, 0x0A, 0xC8, 0x8A, 0x01, 0x0A, 0xC8, - 0x18, 0x09, 0xD7, 0x10, 0xD8, 0x04, 0x57, 0xC2, - 0x03, 0x16, 0xC8, 0xCD, 0xC8, 0xC5, 0x5B, 0x04, - 0xC7, 0x05, 0x57, 0xC2, 0x48, 0xC6, 0xC8, 0xC5, - 0x5B, 0x04, 0x08, 0xC8, 0x6C, 0x01, 0x08, 0xA2, - 0x20, 0xCA, 0x00, 0xFC, 0x32, 0x0C, 0x18, 0x09, - 0x02, 0x10, 0x08, 0xC8, 0x6C, 0x01, 0xE0, 0x04, - 0x00, 0xFC, 0x57, 0xC2, 0x03, 0x16, 0xC8, 0xCD, - 0xC8, 0xC5, 0x5B, 0x04, 0xC7, 0x05, 0x17, 0xC8, - 0x6C, 0x01, 0x08, 0xC8, 0x00, 0xFC, 0xC8, 0xC5, - 0x5B, 0x04, 0x17, 0xC6, 0x02, 0x16, 0xC8, 0xC9, - 0x02, 0x00, 0xC8, 0xC5, 0x5B, 0x04, 0x17, 0xC2, - 0x08, 0xC8, 0x6C, 0x01, 0x07, 0x13, 0xE0, 0xC5, - 0x00, 0xFC, 0x08, 0xA2, 0x28, 0xC8, 0x32, 0x0C, - 0x00, 0xFC, 0x18, 0x09, 0x5B, 0x04, 0x60, 0x01, - 0x82, 0x01, 0x00, 0x20, 0x0A, 0x16, 0x60, 0xC2, - 0x84, 0x01, 0xA0, 0x01, 0x82, 0x01, 0x00, 0x20, - 0xE0, 0x01, 0x82, 0x01, 0x00, 0x20, 0x09, 0xC8, - 0x84, 0x01, 0xC9, 0x04, 0x5B, 0x04, 0xA0, 0x06, - 0xBE, 0xB7, 0xD3, 0x04, 0xE0, 0x04, 0x02, 0x01, - 0x20, 0xE8, 0x14, 0xE0, 0x00, 0x01, 0x20, 0xC8, - 0x16, 0xE0, 0x04, 0x01, 0x05, 0x2C, 0x20, 0x48, - 0x14, 0xE0, 0x00, 0x01, 0x8C, 0x07, 0x00, 0x0A, - 0x8D, 0x07, 0xD8, 0x07, 0x8E, 0x07, 0x18, 0x00, - 0x7C, 0xCF, 0x4E, 0x06, 0xFD, 0x16, 0xE0, 0x02, - 0xD8, 0x07, 0x8F, 0x07, 0x11, 0xFF, 0x8B, 0x02, - 0x3B, 0x59, 0x21, 0x16, 0x8A, 0x02, 0x3B, 0x59, - 0x1E, 0x13, 0x8F, 0x05, 0x20, 0x20, 0x16, 0xE0, - 0x01, 0x16, 0x19, 0x10, 0x20, 0x20, 0x04, 0xE0, - 0x16, 0x16, 0x00, 0x01, 0xBF, 0x00, 0x13, 0x16, - 0x8B, 0x07, 0xC0, 0x40, 0x00, 0x01, 0x00, 0x60, - 0x10, 0x13, 0x40, 0x01, 0x00, 0x60, 0x0B, 0x16, - 0x8B, 0x07, 0xC4, 0x44, 0xA0, 0xC3, 0x02, 0x01, - 0x0E, 0x48, 0x02, 0x01, 0x4E, 0x01, 0x00, 0x10, - 0x04, 0x16, 0x8F, 0x07, 0x18, 0xFF, 0x60, 0x04, - 0x94, 0xB7, 0x0B, 0xC3, 0x4B, 0xC3, 0x20, 0x20, - 0x0A, 0xE0, 0x02, 0x16, 0x6B, 0x02, 0x20, 0x20, - 0x20, 0x20, 0x0C, 0xE0, 0x02, 0x16, 0x6C, 0x02, - 0x00, 0x20, 0x20, 0x20, 0x0E, 0xE0, 0x02, 0x16, - 0x6C, 0x02, 0x20, 0x00, 0x8F, 0x05, 0x20, 0x20, - 0x10, 0xE0, 0x07, 0x16, 0x6D, 0x02, 0x20, 0x00, - 0x20, 0x21, 0x22, 0xE0, 0xE4, 0x13, 0x04, 0xC1, - 0x02, 0x16, 0x84, 0x07, 0xFE, 0x7F, 0x8F, 0x05, - 0x20, 0x20, 0x12, 0xE0, 0x02, 0x16, 0x6D, 0x02, - 0x00, 0x20, 0x60, 0x21, 0x22, 0xE0, 0xD7, 0x13, - 0x45, 0xC1, 0x02, 0x16, 0x85, 0x07, 0xFE, 0x7F, - 0x8F, 0x05, 0x86, 0xD1, 0x0B, 0x13, 0xA0, 0x25, - 0x26, 0xE0, 0x08, 0x13, 0x8F, 0x05, 0x20, 0x26, - 0x22, 0xE0, 0x04, 0x16, 0x8F, 0x05, 0xA0, 0x26, - 0x22, 0xE0, 0x02, 0x13, 0x60, 0x04, 0x94, 0xB7, - 0x01, 0xD8, 0xEC, 0x08, 0x20, 0xD8, 0xDB, 0x07, - 0x00, 0x09, 0x02, 0xD8, 0xF6, 0x08, 0x20, 0xD8, - 0xDD, 0x07, 0xE2, 0x08, 0xE0, 0x02, 0x58, 0x07, - 0x20, 0xD8, 0xEF, 0x07, 0xF4, 0x07, 0x20, 0xD8, - 0xF1, 0x07, 0xF6, 0x07, 0x20, 0xD8, 0xF3, 0x07, - 0xF8, 0x07, 0x09, 0x02, 0x06, 0x00, 0xCB, 0x04, - 0x0F, 0x02, 0xEE, 0x07, 0x8F, 0x05, 0xCB, 0xDF, - 0x09, 0x06, 0xFC, 0x16, 0xA0, 0x06, 0xBE, 0xB7, - 0x89, 0x07, 0x5C, 0xE3, 0xE0, 0x04, 0x1A, 0x01, - 0x20, 0xC8, 0xE4, 0x07, 0x18, 0x01, 0x19, 0xC8, - 0x0C, 0x01, 0x39, 0xC8, 0x0A, 0x01, 0x39, 0xC8, - 0x12, 0x01, 0x09, 0x16, 0x79, 0xC3, 0x0F, 0x02, - 0x00, 0xE0, 0x4F, 0x63, 0x2D, 0x02, 0x00, 0x90, - 0x0D, 0xC8, 0x14, 0x01, 0x02, 0x10, 0x39, 0xC8, - 0x14, 0x01, 0xF9, 0xC3, 0x3F, 0xC8, 0x0E, 0x01, - 0x1F, 0xC8, 0x10, 0x01, 0xE0, 0x04, 0x14, 0x09, - 0xB9, 0xC2, 0x1A, 0xC8, 0x00, 0x01, 0x96, 0x06, - 0x89, 0x02, 0x84, 0xE3, 0xE0, 0x16, 0x8F, 0x07, - 0x1C, 0xFF, 0x8C, 0x07, 0x00, 0x0A, 0x8D, 0x07, - 0x84, 0xE3, 0x8E, 0x07, 0x10, 0x00, 0x7C, 0x8F, - 0x44, 0x16, 0x4E, 0x06, 0xFC, 0x16, 0xA0, 0xC3, - 0xE2, 0x07, 0xE0, 0xC3, 0xE0, 0x07, 0xCE, 0x83, - 0x01, 0x14, 0xCE, 0xC3, 0x0F, 0xC8, 0x1A, 0x01, - 0x8C, 0x07, 0x94, 0xE3, 0x8D, 0x07, 0x00, 0x0A, - 0x8E, 0x07, 0xA4, 0xE3, 0x8C, 0x63, 0x7C, 0xCF, - 0x4E, 0x06, 0xFD, 0x16, 0xE0, 0x04, 0x30, 0x09, - 0x20, 0x01, 0x42, 0x01, 0x00, 0x04, 0x02, 0x16, - 0x20, 0x07, 0x30, 0x09, 0x60, 0xC2, 0x62, 0x01, - 0xE0, 0x04, 0x62, 0x01, 0x8E, 0x07, 0x00, 0x80, - 0x8C, 0x07, 0x34, 0x09, 0x8D, 0x07, 0x06, 0x00, - 0x3E, 0xDF, 0x8E, 0x05, 0x0D, 0x06, 0xFC, 0x16, - 0xFE, 0xD3, 0xCF, 0x06, 0x8E, 0x05, 0xFE, 0xD3, - 0xCF, 0x06, 0x8C, 0x07, 0x34, 0x09, 0x09, 0xC8, - 0x62, 0x01, 0xC9, 0x04, 0x5C, 0xA3, 0x7C, 0xE2, - 0x5C, 0xA3, 0x7C, 0xE2, 0x5C, 0xA3, 0x7C, 0xE2, - 0x02, 0x13, 0xCD, 0x83, 0x09, 0x13, 0x20, 0x07, - 0x34, 0x09, 0x06, 0x10, 0x8F, 0x07, 0x19, 0xFF, - 0xCD, 0xA3, 0x0F, 0xC8, 0x04, 0x01, 0xFF, 0x10, - 0xA0, 0x01, 0x02, 0x01, 0x00, 0x10, 0xE0, 0xC3, - 0xEE, 0x07, 0xE0, 0x43, 0x06, 0xE0, 0x0F, 0xC8, - 0x00, 0x01, 0x20, 0xC0, 0x04, 0xE0, 0xE0, 0x04, - 0xFE, 0x06, 0xD3, 0x04, 0xE0, 0x04, 0x04, 0x01, - 0x60, 0x04, 0x0C, 0xB8, 0x8C, 0x07, 0x00, 0x0A, - 0x8D, 0x07, 0x18, 0x00, 0x8E, 0x07, 0x3B, 0x59, - 0x0E, 0xCF, 0x4D, 0x06, 0xFD, 0x16, 0x5B, 0x04, - 0x93, 0x01, 0x00, 0x80, 0x20, 0x04, 0xC0, 0xE2, - 0x60, 0xD0, 0x98, 0x07, 0x1C, 0x13, 0x00, 0x03, - 0x02, 0x00, 0xA0, 0xC0, 0x46, 0x07, 0x12, 0xC8, - 0x46, 0x07, 0x02, 0x16, 0x93, 0x01, 0x20, 0x00, - 0x00, 0x03, 0x0F, 0x00, 0x20, 0x04, 0xE8, 0xE2, - 0x93, 0x01, 0x00, 0x20, 0x80, 0x01, 0x00, 0x40, - 0x00, 0x01, 0xFE, 0x00, 0x49, 0x16, 0xC4, 0xC3, - 0x25, 0x16, 0xD3, 0xC3, 0xC5, 0x43, 0x0C, 0x16, - 0xE0, 0xC3, 0x98, 0x07, 0x03, 0x11, 0xE0, 0x02, - 0x98, 0x07, 0x51, 0x04, 0xE0, 0xC3, 0x78, 0x07, - 0x0A, 0x11, 0xE0, 0x02, 0x78, 0x07, 0x51, 0x04, - 0xD3, 0x11, 0x4F, 0x01, 0x00, 0x20, 0xE4, 0x13, - 0x4F, 0x01, 0x20, 0x00, 0xD1, 0x13, 0x05, 0x2C, - 0x41, 0xA0, 0x21, 0x04, 0xC0, 0xE2, 0x8B, 0x07, - 0x0C, 0xB8, 0x00, 0x01, 0x00, 0x40, 0x0F, 0x13, - 0xDD, 0xC3, 0x4F, 0x02, 0x0F, 0x00, 0x2F, 0xE1, - 0x14, 0xE0, 0x5B, 0x04, 0xE4, 0xC3, 0xC0, 0xE1, - 0xCF, 0x73, 0x2F, 0x41, 0x14, 0xE0, 0x6F, 0xC3, - 0xEC, 0xEA, 0x8B, 0x07, 0x0C, 0xB8, 0x4B, 0xC2, - 0xA0, 0xC2, 0xF4, 0x07, 0x8C, 0x07, 0x08, 0x00, - 0xBD, 0xC0, 0xA0, 0xC3, 0xEA, 0x07, 0xE0, 0xC3, - 0xEC, 0x07, 0xA0, 0x06, 0x00, 0xBA, 0xC0, 0x01, - 0x00, 0x40, 0x02, 0xD8, 0x17, 0x01, 0x62, 0x02, - 0x80, 0xFF, 0xA0, 0x06, 0x54, 0xBA, 0x02, 0xC8, - 0x04, 0x01, 0x90, 0x03, 0x3F, 0x60, 0x59, 0x04, - 0xC0, 0xC3, 0xCF, 0x73, 0xEF, 0xC3, 0xC0, 0xE1, - 0xCF, 0x73, 0xAF, 0xC3, 0xDE, 0xEA, 0x9E, 0xC3, - 0x4E, 0x02, 0x0F, 0x00, 0x2E, 0x21, 0x14, 0xE0, - 0x08, 0x13, 0x2F, 0x40, 0x14, 0xE0, 0xCF, 0xA3, - 0x2F, 0x04, 0xF0, 0xE2, 0x40, 0x01, 0x00, 0x40, - 0xA4, 0x13, 0xC4, 0xC3, 0xC7, 0x16, 0x00, 0x01, - 0xFE, 0x00, 0xE6, 0x16, 0x9E, 0x10, 0x40, 0x01, - 0x00, 0x40, 0x05, 0x16, 0x20, 0xE0, 0x14, 0xE0, - 0x65, 0x02, 0x00, 0x58, 0x96, 0x10, 0x20, 0xD8, - 0xDE, 0x07, 0x17, 0x01, 0x8F, 0x07, 0x86, 0xFF, - 0x0F, 0xC8, 0x04, 0x01, 0xC0, 0x01, 0x00, 0x40, - 0x45, 0x02, 0xFF, 0xA7, 0x8A, 0x10, 0x20, 0xC3, - 0xFE, 0x06, 0x20, 0x27, 0x38, 0xE3, 0x07, 0x13, - 0x20, 0x23, 0x22, 0xE0, 0x1A, 0x13, 0x65, 0x02, - 0xFF, 0xDF, 0x20, 0x40, 0x14, 0xE0, 0x20, 0xE0, - 0x16, 0xE0, 0x0C, 0xC8, 0xE6, 0x08, 0x8D, 0x07, - 0xE2, 0x08, 0x58, 0x04, 0x20, 0x48, 0x08, 0xE0, - 0xFE, 0x06, 0x20, 0xC3, 0xE6, 0x08, 0x20, 0x27, - 0x38, 0xE3, 0x19, 0x16, 0x80, 0x03, 0x02, 0xC3, - 0x6C, 0xC2, 0x0A, 0x00, 0x99, 0x06, 0x60, 0x04, - 0x0C, 0xB8, 0xA0, 0xC2, 0xF4, 0x07, 0x8C, 0x07, - 0x01, 0x00, 0x8D, 0x07, 0x06, 0x06, 0xCE, 0x04, - 0xE0, 0xC3, 0x08, 0x06, 0x01, 0x13, 0x97, 0x06, - 0x20, 0xD8, 0x07, 0x06, 0x17, 0x01, 0x8B, 0x07, - 0x82, 0xFF, 0x0B, 0xC8, 0x04, 0x01, 0xA0, 0x06, - 0xB4, 0xBE, 0x60, 0x04, 0x0C, 0xB8, 0xA0, 0xC2, - 0xEE, 0x07, 0x8C, 0x07, 0x06, 0x00, 0x8D, 0x07, - 0xEE, 0x08, 0xA0, 0xC3, 0xE6, 0x07, 0xE0, 0xC3, - 0xE8, 0x07, 0x97, 0x06, 0xA0, 0xC2, 0xF4, 0x07, - 0x8D, 0x07, 0xF4, 0x08, 0xDD, 0x04, 0x8C, 0x07, - 0x02, 0x00, 0x97, 0x06, 0x8D, 0x07, 0x00, 0x80, - 0xA0, 0xC2, 0xEE, 0x08, 0x0A, 0x88, 0x0C, 0x06, - 0x14, 0x1B, 0x82, 0x07, 0xD0, 0xB9, 0xA0, 0xC3, - 0xF0, 0x08, 0xE0, 0xC3, 0xF2, 0x08, 0x8B, 0x07, - 0x0C, 0xE3, 0x8A, 0x02, 0x14, 0x00, 0x04, 0x1A, - 0x8B, 0x07, 0xBA, 0xEA, 0x2A, 0x02, 0xEC, 0xFF, - 0x8A, 0xA2, 0xCA, 0xA2, 0xDB, 0xC2, 0x01, 0x13, - 0x9B, 0x06, 0x20, 0xC8, 0xEE, 0x08, 0xF2, 0x08, - 0x20, 0xC8, 0x20, 0xE0, 0xEE, 0x08, 0x0D, 0xC8, - 0xF0, 0x08, 0x8D, 0x07, 0xEC, 0x08, 0x20, 0xE0, - 0x18, 0xE0, 0x65, 0x02, 0x00, 0x58, 0x58, 0x04, - 0x45, 0x02, 0xFF, 0xA7, 0x80, 0x03, 0x60, 0xC0, - 0xEE, 0x05, 0x21, 0x02, 0xE8, 0x03, 0x20, 0x01, - 0x02, 0x01, 0x06, 0x00, 0x07, 0x16, 0x01, 0x88, - 0xEE, 0x05, 0xF9, 0x16, 0x39, 0x10, 0x60, 0xD0, - 0x03, 0x01, 0xF1, 0x13, 0x01, 0x02, 0x0A, 0x01, - 0x4C, 0xCC, 0x4C, 0xCC, 0x4E, 0xCC, 0x4F, 0xCC, - 0xB1, 0x07, 0x40, 0x00, 0x4D, 0xCC, 0x0A, 0xC8, - 0x00, 0x01, 0x5B, 0x04, 0x60, 0xC0, 0xEE, 0x05, - 0x21, 0x02, 0xE8, 0x03, 0x20, 0x01, 0x02, 0x01, - 0x06, 0x00, 0x07, 0x16, 0x01, 0x88, 0xEE, 0x05, - 0xF9, 0x16, 0x1E, 0x10, 0x60, 0xD0, 0x03, 0x01, - 0xF1, 0x13, 0x01, 0x02, 0x0A, 0x01, 0x4C, 0xCC, - 0x4C, 0xCC, 0x4E, 0xCC, 0x4F, 0xCC, 0xB1, 0x07, - 0x40, 0x00, 0x4D, 0xCC, 0x0A, 0xC8, 0x00, 0x01, - 0xA0, 0x03, 0x60, 0xD0, 0x03, 0x01, 0x01, 0x13, - 0x5B, 0x04, 0x60, 0xC0, 0xEE, 0x05, 0x21, 0x02, - 0xE8, 0x03, 0x20, 0x01, 0x02, 0x01, 0x06, 0x00, - 0xF7, 0x16, 0x01, 0x88, 0xEE, 0x05, 0xF9, 0x16, - 0xCD, 0x04, 0x8A, 0x07, 0x00, 0x40, 0x20, 0xC3, - 0x00, 0x01, 0x0C, 0x01, 0x00, 0x80, 0x02, 0x13, - 0x8A, 0x07, 0x00, 0x20, 0xA0, 0xC3, 0x0E, 0x01, - 0xE0, 0xC3, 0x10, 0x01, 0xB0, 0x03, 0x20, 0xC3, - 0x58, 0x07, 0x20, 0x23, 0x04, 0xE0, 0x02, 0x13, - 0x60, 0x04, 0x8E, 0xB7, 0x60, 0x04, 0x8A, 0xA3, - 0x8D, 0x07, 0x00, 0x20, 0x20, 0x20, 0x0A, 0xE0, - 0x01, 0x16, 0x5B, 0x04, 0x0D, 0x02, 0x32, 0x0C, - 0x5D, 0xC2, 0x01, 0x11, 0xDD, 0x04, 0xCD, 0x05, - 0x0D, 0x88, 0x30, 0x0C, 0xF9, 0x16, 0x60, 0xC2, - 0x0A, 0x06, 0x8D, 0x07, 0x6A, 0x09, 0xA0, 0x06, - 0xF4, 0xBE, 0x09, 0x02, 0x48, 0x00, 0xE0, 0xC3, - 0x30, 0x09, 0x03, 0x16, 0xE0, 0x01, 0x6A, 0x09, - 0x10, 0x00, 0xE0, 0xC2, 0x6A, 0x09, 0x0F, 0x02, - 0x00, 0x01, 0xC9, 0x26, 0x02, 0x13, 0x60, 0x04, - 0x86, 0xBD, 0x09, 0x02, 0x00, 0x12, 0x4B, 0x01, - 0x10, 0x00, 0x02, 0x13, 0x09, 0x02, 0x00, 0x13, - 0x09, 0xD8, 0x2E, 0x09, 0x8F, 0x07, 0x00, 0x40, - 0x89, 0x07, 0x6C, 0x09, 0xCB, 0x04, 0xF9, 0xE2, - 0xF9, 0xE2, 0xF9, 0xE2, 0x07, 0x16, 0x8B, 0x07, - 0x34, 0x09, 0x8C, 0x07, 0x6C, 0x09, 0x3B, 0xCF, - 0x3B, 0xCF, 0x1B, 0xC7, 0x20, 0xC3, 0x6C, 0x09, - 0x19, 0x11, 0x8F, 0x07, 0x00, 0x20, 0x89, 0x07, - 0x7A, 0x09, 0xA0, 0x06, 0x3A, 0xBB, 0xA0, 0x06, - 0x3A, 0xBB, 0x12, 0x10, 0x4C, 0xCE, 0x5B, 0x04, - 0x19, 0xC3, 0x02, 0x16, 0x8C, 0x07, 0x1A, 0x00, - 0x4C, 0xC3, 0x2D, 0x02, 0xF8, 0xFF, 0x0A, 0x02, - 0x09, 0x00, 0x2D, 0x02, 0xFA, 0xFF, 0xF2, 0x13, - 0x0A, 0x06, 0xFB, 0x16, 0x60, 0x04, 0x86, 0xBD, - 0x8F, 0x07, 0x00, 0x10, 0xD9, 0xC2, 0xFA, 0x11, - 0x02, 0x16, 0x8B, 0x07, 0x00, 0x04, 0x4B, 0xC3, - 0x8D, 0x02, 0x20, 0x00, 0x02, 0x14, 0x0D, 0x02, - 0x20, 0x00, 0x8D, 0x02, 0x00, 0x04, 0x02, 0x12, - 0x0D, 0x02, 0x00, 0x04, 0x2D, 0x02, 0xF8, 0xFF, - 0x0D, 0xC8, 0x2C, 0x09, 0x2B, 0x02, 0xFF, 0x03, - 0x8B, 0x01, 0xFF, 0x03, 0x4B, 0xCE, 0x60, 0xC3, - 0x6A, 0x09, 0x60, 0x23, 0x18, 0xE0, 0x0C, 0x16, - 0x49, 0xC3, 0xDD, 0xC2, 0x0F, 0x02, 0x01, 0x01, - 0x8B, 0x01, 0x80, 0xC0, 0xD7, 0x16, 0x8F, 0x05, - 0xED, 0xC2, 0x02, 0x00, 0xD3, 0x16, 0x02, 0x10, - 0x8D, 0x07, 0xBA, 0xEA, 0x3D, 0xC8, 0xA8, 0x09, - 0x1D, 0xC8, 0xAA, 0x09, 0xCB, 0x04, 0xE0, 0x04, - 0xF8, 0x05, 0xE0, 0x04, 0x66, 0x09, 0x20, 0xC8, - 0x30, 0x0C, 0x80, 0x09, 0xA0, 0x07, 0x82, 0x09, - 0xFE, 0xDF, 0x8D, 0x07, 0xFE, 0xDF, 0xE0, 0xC3, - 0xD8, 0x07, 0xE0, 0x23, 0x16, 0xE0, 0x24, 0x16, - 0xE0, 0xC3, 0x30, 0x0C, 0x4F, 0x63, 0xFF, 0x04, - 0xFF, 0x04, 0x4D, 0x06, 0xFD, 0x16, 0x8D, 0x07, - 0xFE, 0xDF, 0x20, 0x04, 0xA2, 0xEA, 0xA0, 0xC3, - 0xA2, 0xEA, 0xEE, 0xC3, 0x12, 0x00, 0xAA, 0x16, - 0x6E, 0xC3, 0x18, 0x00, 0xAD, 0x09, 0x8C, 0x07, - 0x00, 0xE0, 0xAC, 0x09, 0x0D, 0x63, 0x0C, 0x13, - 0x6E, 0xC3, 0x18, 0x00, 0xAD, 0x09, 0x2D, 0x02, - 0x40, 0x00, 0x1D, 0x0A, 0x2D, 0x02, 0x32, 0x0C, - 0xBD, 0x07, 0xFF, 0x7F, 0x0C, 0x06, 0xFC, 0x16, - 0x20, 0xC3, 0x46, 0x04, 0x8C, 0x02, 0x80, 0x00, - 0x13, 0x1A, 0xAC, 0x02, 0x0C, 0xC8, 0x9A, 0x00, - 0xE0, 0x02, 0x80, 0x00, 0x88, 0x07, 0x80, 0x00, - 0x60, 0xC2, 0x46, 0x04, 0xA0, 0x06, 0x28, 0xAD, - 0x02, 0x10, 0x9D, 0x00, 0x05, 0x10, 0x9D, 0x00, - 0x8F, 0x07, 0x00, 0x08, 0x60, 0x04, 0x86, 0xBD, - 0x4B, 0x2D, 0x81, 0xC3, 0xC9, 0x05, 0x8F, 0x07, - 0x00, 0x10, 0x8E, 0x02, 0x02, 0x00, 0xF6, 0x11, - 0x8F, 0x07, 0x00, 0x04, 0xC9, 0x05, 0xD9, 0xC2, - 0xE0, 0x26, 0x26, 0xE0, 0x02, 0x16, 0x2B, 0x02, - 0x06, 0x00, 0x4B, 0xC6, 0x4B, 0xC3, 0xCB, 0x72, - 0x2E, 0x02, 0xFE, 0xFF, 0x8B, 0x83, 0xE6, 0x1B, - 0xCD, 0x06, 0x4D, 0x73, 0xCD, 0x82, 0xE2, 0x1B, - 0xE0, 0x04, 0x1A, 0x09, 0xE0, 0x04, 0x1C, 0x09, - 0x4D, 0xC3, 0x02, 0x13, 0x60, 0x66, 0x12, 0xE0, - 0xC9, 0x05, 0xCF, 0x04, 0x81, 0x2D, 0x01, 0xC8, - 0x6C, 0x01, 0xD4, 0x13, 0x0F, 0xC8, 0x00, 0xFC, - 0xC1, 0xC3, 0x0D, 0x06, 0xF7, 0x15, 0x0D, 0x02, - 0x36, 0x07, 0x0E, 0x02, 0x98, 0x08, 0x0C, 0x02, - 0x03, 0x00, 0x8D, 0xCB, 0x02, 0x00, 0x81, 0x2D, - 0x81, 0xCB, 0x06, 0x00, 0xC3, 0x13, 0xEE, 0x04, - 0x0C, 0x00, 0x2E, 0x02, 0x18, 0x00, 0x0C, 0x06, - 0xF4, 0x16, 0xE0, 0x04, 0x96, 0x08, 0x1F, 0x2E, - 0xB9, 0xC3, 0xD9, 0xC3, 0x89, 0x07, 0x12, 0x00, - 0x8D, 0x07, 0x3A, 0x09, 0xA0, 0x06, 0xF4, 0xBE, - 0x60, 0xC3, 0xD8, 0x07, 0x60, 0x23, 0x16, 0xE0, - 0x09, 0x16, 0x20, 0xE8, 0x10, 0xE0, 0x6A, 0x09, - 0x20, 0xE8, 0x18, 0xE0, 0x98, 0x07, 0x20, 0xE8, - 0x12, 0xE0, 0x78, 0x07, 0x60, 0xC3, 0x6A, 0x09, - 0x60, 0x23, 0x1E, 0xE0, 0x03, 0x16, 0x20, 0x48, - 0xA4, 0xE3, 0x6A, 0x09, 0x60, 0x23, 0x22, 0xE0, - 0x06, 0x13, 0x60, 0x27, 0xA6, 0xE3, 0x03, 0x13, - 0x20, 0xE8, 0x10, 0xE0, 0x6A, 0x09, 0x20, 0x2D, - 0x00, 0x00, 0x8E, 0x07, 0x00, 0x00, 0xA0, 0x06, - 0xD4, 0xBE, 0x4E, 0x05, 0x0E, 0x2C, 0xA0, 0xC0, - 0x04, 0x08, 0xEF, 0xC3, 0x06, 0x00, 0x1B, 0x16, - 0xA0, 0xC3, 0x72, 0x09, 0xE0, 0xC3, 0x74, 0x09, - 0xA0, 0x06, 0xC2, 0xBD, 0xA0, 0xC3, 0x76, 0x09, - 0xE0, 0xC3, 0x78, 0x09, 0xA0, 0x06, 0xE0, 0xBD, - 0x20, 0xE0, 0x0A, 0xE0, 0x60, 0xC3, 0xD8, 0x07, - 0x60, 0x23, 0x16, 0xE0, 0x05, 0x16, 0xE0, 0x04, - 0x2E, 0x06, 0x60, 0x41, 0x04, 0xE0, 0x4D, 0x2E, - 0x8D, 0x07, 0x00, 0x80, 0x52, 0x04, 0xCF, 0x73, - 0x2F, 0x02, 0x00, 0x02, 0x4F, 0xC3, 0x52, 0x04, - 0x20, 0x20, 0x0A, 0xE0, 0x03, 0x13, 0x8D, 0x07, - 0x00, 0x10, 0x5B, 0x04, 0x20, 0x40, 0x0A, 0xE0, - 0x40, 0x02, 0xFF, 0xF0, 0x8E, 0x07, 0x02, 0x00, - 0xA0, 0x06, 0xD4, 0xBE, 0x4E, 0x05, 0x0E, 0x2C, - 0xA0, 0xC0, 0x04, 0x08, 0xA0, 0x06, 0xB4, 0xBE, - 0x60, 0xC3, 0xD8, 0x07, 0x60, 0x23, 0x16, 0xE0, - 0x66, 0x16, 0x20, 0x04, 0xB6, 0xEA, 0x63, 0x10, - 0x6E, 0x02, 0x00, 0x80, 0x8D, 0x07, 0x00, 0xC0, - 0x0D, 0xC8, 0xA6, 0x01, 0x0E, 0xC8, 0x72, 0x09, - 0x0F, 0xC8, 0x74, 0x09, 0x0E, 0xC8, 0xA8, 0x01, - 0x0F, 0xC8, 0xAA, 0x01, 0x12, 0x10, 0x8F, 0x01, - 0x01, 0x00, 0x8A, 0x07, 0x76, 0x09, 0xA0, 0xE3, - 0x4E, 0x09, 0x8E, 0xCE, 0x9A, 0x01, 0xFE, 0xFF, - 0xE0, 0xE3, 0x50, 0x09, 0x8F, 0xE6, 0x8A, 0x07, - 0xAC, 0x01, 0x8E, 0xCE, 0x9A, 0x01, 0xFE, 0xFF, - 0x8F, 0xE6, 0x20, 0x20, 0x0A, 0xE0, 0x3F, 0x13, - 0x8D, 0x07, 0x00, 0x10, 0x5B, 0x04, 0x20, 0x20, - 0x0A, 0xE0, 0x03, 0x13, 0x0D, 0x02, 0x00, 0x10, - 0x5B, 0x04, 0x8E, 0xC3, 0x04, 0x13, 0xE0, 0x01, - 0x50, 0x09, 0x00, 0x01, 0x06, 0x10, 0xA0, 0x01, - 0x50, 0x09, 0x00, 0x01, 0xA0, 0x01, 0x78, 0x09, - 0x00, 0x01, 0xA0, 0xC3, 0x76, 0x09, 0xE0, 0xC3, - 0x78, 0x09, 0xA0, 0xE3, 0x4E, 0x09, 0xE0, 0xE3, - 0x50, 0x09, 0x0E, 0xC8, 0xAC, 0x01, 0x0F, 0xC8, - 0xAE, 0x01, 0x0E, 0xC8, 0x76, 0x09, 0x0F, 0xC8, - 0x78, 0x09, 0x19, 0x10, 0x6E, 0x02, 0x00, 0x80, - 0x0E, 0xC8, 0xA6, 0x01, 0x20, 0x20, 0x0A, 0xE0, - 0x12, 0x13, 0x0D, 0x02, 0x00, 0x10, 0x5B, 0x04, - 0x8D, 0x07, 0x28, 0x07, 0x89, 0x07, 0x0E, 0x00, - 0xA0, 0x06, 0xFA, 0xBE, 0x8D, 0x07, 0x28, 0x07, - 0xFD, 0x04, 0x8D, 0x02, 0x36, 0x07, 0xFC, 0x16, - 0x20, 0x48, 0x14, 0xE0, 0xFE, 0x06, 0x8D, 0x07, - 0x00, 0x80, 0x52, 0x04, 0xA0, 0xC2, 0xEE, 0x07, - 0x8C, 0x07, 0x04, 0x00, 0x8D, 0x07, 0xF0, 0x08, - 0x97, 0x06, 0x7D, 0xC2, 0x5D, 0xC3, 0x60, 0x43, - 0x22, 0xE0, 0xA0, 0x06, 0xFA, 0xBE, 0xEF, 0x10, - 0x0E, 0xC8, 0x06, 0x06, 0x0F, 0xC8, 0x08, 0x06, - 0xEA, 0x10, 0xB0, 0x03, 0xA0, 0x01, 0x60, 0x07, - 0x26, 0x00, 0x40, 0x02, 0x00, 0xC0, 0xE0, 0x04, - 0x06, 0x06, 0x8C, 0x07, 0x10, 0x40, 0xCC, 0x44, - 0xE0, 0x04, 0xFE, 0x06, 0x85, 0x07, 0x40, 0x80, - 0x5B, 0x04, 0x02, 0xC8, 0x04, 0x08, 0x8F, 0x07, - 0xFA, 0x07, 0xCE, 0xCB, 0x02, 0x00, 0x8E, 0x07, - 0x36, 0x07, 0xCE, 0xCB, 0x04, 0x00, 0x8D, 0x07, - 0x30, 0x06, 0x8E, 0x07, 0x10, 0x00, 0x4D, 0x2C, - 0x5B, 0x04, 0xA0, 0xC2, 0xF2, 0x07, 0x02, 0x10, - 0xA0, 0xC2, 0xF8, 0x07, 0x0B, 0xC8, 0xEA, 0x08, - 0x09, 0xC3, 0x0A, 0x13, 0xA0, 0x06, 0x36, 0xBA, - 0xA0, 0xC2, 0x00, 0x01, 0xA0, 0xE2, 0x06, 0xE0, - 0x4C, 0xA3, 0xCC, 0xA3, 0x01, 0x17, 0x8E, 0x05, - 0x4C, 0x62, 0xE0, 0xC2, 0xEA, 0x08, 0x5B, 0x04, - 0x8D, 0x07, 0x00, 0x10, 0x20, 0x20, 0x0A, 0xE0, - 0x01, 0x13, 0x5B, 0x04, 0x0D, 0x02, 0x48, 0x00, - 0xE0, 0xC3, 0x30, 0x09, 0x02, 0x16, 0xCE, 0x01, - 0x10, 0x00, 0x8D, 0x27, 0x03, 0x13, 0x0D, 0x02, - 0x00, 0x01, 0x52, 0x04, 0x00, 0x03, 0x02, 0x00, - 0x60, 0xC3, 0x6A, 0x09, 0x4D, 0x02, 0x08, 0x80, - 0x4E, 0x02, 0xF7, 0x7F, 0x8D, 0xE3, 0xE0, 0xC3, - 0xD8, 0x07, 0xE0, 0x23, 0x16, 0xE0, 0x04, 0x13, - 0x8D, 0x07, 0x06, 0x00, 0x8D, 0x27, 0x02, 0x13, - 0xA0, 0xE3, 0x10, 0xE0, 0x0E, 0xC8, 0x6A, 0x09, - 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 0x09, 0x13, - 0x0D, 0x02, 0x00, 0x12, 0x4E, 0x01, 0x10, 0x00, - 0x02, 0x13, 0x0D, 0x02, 0x00, 0x13, 0x0D, 0xD8, - 0x2E, 0x09, 0x60, 0xC3, 0x80, 0x01, 0x4E, 0x02, - 0x01, 0x00, 0x4D, 0x02, 0xFE, 0xFF, 0x4E, 0xE3, - 0x0D, 0xC8, 0x80, 0x01, 0x20, 0xD8, 0x40, 0xE2, - 0x2F, 0x09, 0x20, 0x01, 0x6A, 0x09, 0x06, 0x00, - 0x03, 0x13, 0x20, 0xD8, 0xD0, 0xE1, 0x2F, 0x09, - 0x20, 0x98, 0x83, 0x01, 0x00, 0xE2, 0x03, 0x13, - 0x20, 0xD8, 0x2F, 0x09, 0x83, 0x01, 0x00, 0x03, - 0x0F, 0x00, 0x60, 0x04, 0x88, 0xBE, 0x20, 0x20, - 0x0A, 0xE0, 0x03, 0x13, 0x0D, 0x02, 0x00, 0x10, - 0x5B, 0x04, 0x09, 0x02, 0x08, 0x00, 0x0D, 0x02, - 0x58, 0x09, 0xA0, 0x06, 0xF4, 0xBE, 0xA0, 0x07, - 0x02, 0x02, 0x00, 0x00, 0x0D, 0x02, 0x00, 0x04, - 0xE0, 0xC3, 0x58, 0x09, 0x0F, 0x01, 0x00, 0x7C, - 0x01, 0x13, 0x52, 0x04, 0x8F, 0xC3, 0x4E, 0x02, - 0x0F, 0x00, 0xFB, 0x13, 0x8E, 0x02, 0x0F, 0x00, - 0xF8, 0x13, 0x0D, 0x02, 0x00, 0x40, 0x4F, 0xC2, - 0x49, 0x09, 0x49, 0x02, 0x3F, 0x00, 0x09, 0x01, - 0x01, 0x00, 0xEF, 0x16, 0x89, 0x02, 0x06, 0x00, - 0xEC, 0x1A, 0x89, 0x02, 0x20, 0x00, 0xE9, 0x14, - 0xC9, 0x06, 0x1F, 0x09, 0x4F, 0x02, 0x00, 0x40, - 0x4F, 0xE2, 0x69, 0x02, 0x00, 0x80, 0x09, 0xC8, - 0x58, 0x09, 0x0F, 0x02, 0xFF, 0xFF, 0x4E, 0xC2, - 0x1F, 0x09, 0x09, 0x06, 0xFD, 0x16, 0x4F, 0x05, - 0x0D, 0x02, 0x00, 0x20, 0x60, 0xC2, 0x5A, 0x09, - 0xD4, 0x13, 0x4F, 0x26, 0xD2, 0x16, 0x0D, 0x02, - 0x00, 0x10, 0x60, 0xC2, 0x5C, 0x09, 0xCD, 0x13, - 0x4F, 0x26, 0xCB, 0x16, 0x0D, 0x02, 0x00, 0x30, - 0x20, 0x88, 0x5A, 0x09, 0x5C, 0x09, 0xC5, 0x13, - 0xE0, 0xC3, 0x5A, 0x09, 0x4E, 0xC2, 0x1F, 0x0A, - 0x09, 0x06, 0xFD, 0x16, 0xE0, 0xE3, 0x5E, 0x09, - 0x0F, 0xC8, 0x5A, 0x09, 0xE0, 0xC3, 0x5C, 0x09, - 0x4E, 0xC2, 0x1F, 0x0A, 0x09, 0x06, 0xFD, 0x16, - 0xE0, 0xE3, 0x5E, 0x09, 0x0F, 0xC8, 0x5C, 0x09, - 0x0F, 0x02, 0xFF, 0xFF, 0x4E, 0xC2, 0x1F, 0x0A, - 0x09, 0x06, 0xFD, 0x16, 0x0D, 0x02, 0x00, 0x08, - 0x60, 0xC2, 0x5E, 0x09, 0x4F, 0x26, 0xA5, 0x16, - 0x4F, 0x05, 0x0F, 0xC8, 0x5E, 0x09, 0x0F, 0x02, - 0x02, 0x02, 0x0E, 0x02, 0x03, 0x00, 0x60, 0xC3, - 0x40, 0x01, 0x0C, 0x02, 0xFE, 0xC0, 0xA0, 0x01, - 0x40, 0x01, 0x00, 0x04, 0xCF, 0x05, 0x09, 0x02, - 0x55, 0x55, 0x9C, 0x06, 0x49, 0x05, 0x9C, 0x06, - 0x09, 0x07, 0x9C, 0x06, 0x49, 0x05, 0x9C, 0x06, - 0x0E, 0x06, 0xF4, 0x16, 0xA0, 0x01, 0x40, 0x01, - 0x00, 0x40, 0x0D, 0xC8, 0x40, 0x01, 0x09, 0x02, - 0x08, 0x00, 0x0E, 0x02, 0x58, 0x09, 0x0F, 0x02, - 0x02, 0x02, 0xFE, 0xCF, 0x49, 0x06, 0xFD, 0x16, - 0x60, 0x04, 0x88, 0xBE, 0xC9, 0xC7, 0x5F, 0x82, - 0x01, 0x16, 0x5B, 0x04, 0xA0, 0x01, 0x40, 0x01, - 0x00, 0x40, 0x0D, 0xC8, 0x40, 0x01, 0x0D, 0x02, - 0x00, 0x01, 0x52, 0x04, 0x8D, 0x07, 0x00, 0x10, - 0x20, 0x20, 0x0A, 0xE0, 0x0A, 0x16, 0x8D, 0x07, - 0x00, 0x08, 0x20, 0x20, 0x10, 0xE0, 0x05, 0x13, - 0x8D, 0x07, 0x00, 0x40, 0x4F, 0x01, 0x01, 0x00, - 0x01, 0x16, 0x5B, 0x04, 0x20, 0xE0, 0x10, 0xE0, - 0x20, 0x07, 0x9C, 0x08, 0x20, 0x07, 0xB4, 0x08, - 0x20, 0x07, 0xCC, 0x08, 0xA0, 0x07, 0xA2, 0x08, - 0x84, 0x02, 0xA0, 0x07, 0xBA, 0x08, 0x84, 0x02, - 0xA0, 0x07, 0xD2, 0x08, 0x84, 0x02, 0xA0, 0x07, - 0x04, 0x09, 0x00, 0x40, 0xE0, 0x04, 0x06, 0x09, - 0xE0, 0x04, 0x08, 0x09, 0x0E, 0xC8, 0x4C, 0x08, - 0x0F, 0xC8, 0x4E, 0x08, 0x0E, 0xC8, 0x8E, 0x08, - 0x0F, 0xC8, 0x90, 0x08, 0xE0, 0x04, 0x5A, 0x08, - 0xE0, 0x04, 0x60, 0x08, 0xE0, 0x02, 0x78, 0x07, - 0xE0, 0x04, 0x94, 0x08, 0x20, 0x40, 0x40, 0xE3, - 0x20, 0xE0, 0x0C, 0xE0, 0x60, 0x04, 0xBC, 0xC6, - 0x80, 0x01, 0x00, 0xF0, 0xC0, 0x01, 0x00, 0x40, - 0x10, 0x10, 0x80, 0x01, 0x00, 0xF0, 0x0D, 0x10, - 0xC0, 0x01, 0x00, 0xF0, 0x20, 0x40, 0x06, 0xE0, - 0x08, 0x10, 0xC0, 0x01, 0x00, 0xF0, 0x80, 0x01, - 0x00, 0x20, 0xE0, 0xC3, 0x94, 0x08, 0x01, 0x16, - 0x5B, 0x04, 0x4B, 0xC0, 0x20, 0x04, 0xDA, 0xEA, - 0x40, 0x01, 0x00, 0x20, 0xFB, 0x16, 0x51, 0x04, - 0xA0, 0xC2, 0xD8, 0x07, 0x4A, 0x01, 0x40, 0x00, - 0x01, 0x16, 0x5B, 0x04, 0xE0, 0x02, 0x78, 0x07, - 0x20, 0x20, 0x0C, 0xE0, 0xEF, 0x16, 0x43, 0xC2, - 0x02, 0x13, 0xA0, 0x06, 0x1A, 0xC3, 0x20, 0x2F, - 0x36, 0x07, 0x20, 0x40, 0x0C, 0xE0, 0xA0, 0x06, - 0xAC, 0xC1, 0xA0, 0xC3, 0x94, 0x08, 0xFB, 0x16, - 0xA0, 0x06, 0x3A, 0xC2, 0x8E, 0x07, 0x04, 0x09, - 0x9E, 0x07, 0x00, 0x80, 0x20, 0x20, 0x10, 0xE0, - 0x05, 0x16, 0x8F, 0x07, 0x4C, 0x08, 0xBF, 0xCF, - 0xBF, 0xCF, 0x9F, 0xC7, 0xA0, 0x06, 0x5A, 0xC2, - 0x20, 0xE8, 0x3C, 0xE3, 0x62, 0x07, 0xA0, 0x06, - 0x3A, 0xC2, 0x20, 0x48, 0x3C, 0xE3, 0x62, 0x07, - 0x20, 0x40, 0x40, 0xE3, 0x20, 0xE0, 0x04, 0xE0, - 0x20, 0x48, 0x10, 0xE0, 0x58, 0x07, 0x5B, 0x04, - 0x80, 0x01, 0x00, 0xF0, 0x20, 0xE0, 0x04, 0xE0, - 0x60, 0x01, 0x60, 0x07, 0x02, 0x00, 0x02, 0x13, - 0x9B, 0x06, 0xB8, 0x10, 0x20, 0xE8, 0x1E, 0xE0, - 0x58, 0x07, 0xB4, 0x10, 0x9B, 0x06, 0x80, 0x03, - 0xE0, 0x02, 0x58, 0x07, 0x00, 0x01, 0x00, 0x40, - 0x07, 0x16, 0x8D, 0x07, 0x00, 0x09, 0xA0, 0x06, - 0x68, 0xB8, 0xE0, 0x02, 0x78, 0x07, 0x5B, 0x04, - 0xC4, 0x01, 0x02, 0x00, 0xE0, 0x02, 0x78, 0x07, - 0x5B, 0x04, 0x0E, 0x68, 0x96, 0x08, 0xE9, 0x04, - 0x0C, 0x00, 0x11, 0x10, 0x0E, 0x02, 0x00, 0x23, - 0x4E, 0xDB, 0x01, 0x00, 0xCC, 0x01, 0x00, 0x04, - 0x4C, 0xD7, 0x1C, 0x10, 0x60, 0xC2, 0x5C, 0x07, - 0x20, 0x06, 0x94, 0x08, 0xA9, 0xC2, 0x08, 0x00, - 0xA9, 0xC3, 0x0C, 0x00, 0xEA, 0x16, 0x29, 0x07, - 0x04, 0x00, 0x69, 0x01, 0x0A, 0x00, 0x01, 0x00, - 0x2D, 0x13, 0x49, 0xC3, 0x2D, 0x02, 0x0E, 0x00, - 0x0A, 0xC3, 0x1D, 0xD3, 0x8C, 0x01, 0x00, 0x84, - 0xCC, 0x01, 0x00, 0x40, 0x0A, 0x01, 0x00, 0x5E, - 0xDD, 0x16, 0x4C, 0xC7, 0xA9, 0xC3, 0x10, 0x00, - 0xE9, 0xC3, 0x12, 0x00, 0x41, 0xCA, 0x10, 0x00, - 0x2F, 0x02, 0x04, 0x00, 0x01, 0x17, 0x8E, 0x05, - 0x8C, 0x07, 0x02, 0x00, 0xA0, 0xC2, 0xF6, 0x07, - 0xA0, 0x06, 0x00, 0xBA, 0x69, 0xC0, 0x10, 0x00, - 0x29, 0xC8, 0x14, 0x00, 0x06, 0x09, 0x29, 0xC8, - 0x16, 0x00, 0x08, 0x09, 0x69, 0x01, 0x0E, 0x00, - 0x00, 0x08, 0x04, 0x16, 0x90, 0x03, 0x7F, 0x00, - 0xA0, 0x06, 0x5A, 0xC2, 0x40, 0x01, 0x00, 0x40, - 0x01, 0x16, 0x51, 0x04, 0x60, 0x04, 0xBE, 0xC1, - 0xA9, 0xC3, 0x0C, 0x00, 0x0B, 0x13, 0x0E, 0x68, - 0x96, 0x08, 0xE9, 0x04, 0x0C, 0x00, 0x29, 0xC8, - 0x06, 0x00, 0x6C, 0x01, 0xA0, 0xC3, 0x00, 0xFC, - 0x01, 0x13, 0x1E, 0x2E, 0x29, 0x07, 0x04, 0x00, - 0x5B, 0x04, 0x81, 0x07, 0x20, 0x20, 0x89, 0x07, - 0x4C, 0x08, 0x41, 0xCE, 0x63, 0xCE, 0x10, 0x00, - 0x63, 0xC6, 0x12, 0x00, 0xA0, 0x06, 0x54, 0xBA, - 0x43, 0xC2, 0x02, 0x13, 0xA0, 0x06, 0x1A, 0xC3, - 0x20, 0xE0, 0x10, 0xE0, 0x60, 0x04, 0xEC, 0xC1, - 0x40, 0x01, 0x00, 0x04, 0xEA, 0x16, 0xA0, 0x06, - 0xAC, 0xC1, 0xA0, 0xC2, 0xF0, 0x07, 0x8C, 0x07, - 0x04, 0x00, 0x8D, 0x07, 0x4C, 0x08, 0xA0, 0xC3, - 0x8E, 0x08, 0xE0, 0xC3, 0x90, 0x08, 0xA0, 0x06, - 0x36, 0xBA, 0xE0, 0xC3, 0x4E, 0x08, 0x4F, 0x01, - 0x01, 0x00, 0x13, 0x16, 0xE0, 0xC2, 0x94, 0x08, - 0xEA, 0x16, 0x60, 0x04, 0xEC, 0xC1, 0xE0, 0xC3, - 0x4E, 0x08, 0x4F, 0x01, 0x01, 0x00, 0x09, 0x16, - 0x60, 0x04, 0xEC, 0xC1, 0xA0, 0x06, 0x54, 0xBA, - 0xE0, 0xC3, 0x4E, 0x08, 0x4F, 0x01, 0x01, 0x00, - 0xD7, 0x13, 0xA0, 0xC2, 0xF0, 0x07, 0x20, 0xC3, - 0x7C, 0x09, 0x8D, 0x07, 0x4C, 0x08, 0x9D, 0xC3, - 0xA0, 0x06, 0x36, 0xBA, 0xC0, 0x06, 0x20, 0xD0, - 0x50, 0x08, 0xC0, 0x06, 0x40, 0x01, 0x00, 0x04, - 0x0A, 0x16, 0x40, 0x01, 0x80, 0x00, 0x07, 0x13, - 0x0E, 0xC8, 0x4C, 0x08, 0x0F, 0xC8, 0x4E, 0x08, - 0xA0, 0x06, 0xA2, 0xC1, 0xD8, 0x10, 0x0E, 0xC8, - 0x8E, 0x08, 0x0F, 0xC8, 0x90, 0x08, 0x40, 0x01, - 0x00, 0x04, 0x0C, 0x13, 0x40, 0x01, 0x20, 0x00, - 0x58, 0x16, 0x81, 0x07, 0x10, 0x20, 0x9F, 0x10, - 0xA0, 0x06, 0xAC, 0xC1, 0xA0, 0xC3, 0x8E, 0x08, - 0xE0, 0xC3, 0x90, 0x08, 0x83, 0x07, 0x98, 0x08, - 0x63, 0x07, 0x04, 0x00, 0x2D, 0x11, 0x83, 0x07, - 0xB0, 0x08, 0x63, 0x07, 0x04, 0x00, 0x28, 0x11, - 0x83, 0x07, 0xC8, 0x08, 0x63, 0x07, 0x04, 0x00, - 0x23, 0x11, 0xC3, 0x60, 0x60, 0xC2, 0x46, 0x07, - 0xE7, 0x13, 0x69, 0x01, 0x0E, 0x00, 0x00, 0x08, - 0xE3, 0x13, 0x00, 0x03, 0x02, 0x00, 0x19, 0xC8, - 0x46, 0x07, 0x03, 0x16, 0xA0, 0x01, 0x3A, 0x07, - 0x20, 0x00, 0x00, 0x03, 0x0F, 0x00, 0xC0, 0x01, - 0x00, 0xF0, 0x80, 0x01, 0x00, 0x20, 0x01, 0x02, - 0x06, 0xC4, 0x60, 0x04, 0x9A, 0xC2, 0x81, 0x07, - 0x80, 0x20, 0xE0, 0xC8, 0x8E, 0x08, 0x14, 0x00, - 0xE0, 0xC8, 0x90, 0x08, 0x16, 0x00, 0xC7, 0x10, - 0xE0, 0xC8, 0x50, 0x08, 0x0E, 0x00, 0xCE, 0xC8, - 0x10, 0x00, 0xCF, 0xC8, 0x12, 0x00, 0x40, 0x01, - 0x20, 0x00, 0xBB, 0x16, 0xE3, 0xC1, 0x06, 0x00, - 0xC7, 0xC8, 0x08, 0x00, 0x07, 0xC8, 0x6C, 0x01, - 0x07, 0xC8, 0xE0, 0x08, 0x08, 0x02, 0x02, 0xFC, - 0xB8, 0x07, 0x00, 0x81, 0xE0, 0xC1, 0xE8, 0x00, - 0x07, 0xCE, 0x20, 0xC8, 0x52, 0x08, 0x92, 0x08, - 0xDA, 0x13, 0xCE, 0xC8, 0x14, 0x00, 0xCF, 0xC8, - 0x16, 0x00, 0x80, 0x01, 0x00, 0x04, 0x82, 0x07, - 0x54, 0x08, 0x32, 0xC1, 0x08, 0x11, 0x72, 0xC1, - 0x92, 0xC1, 0x82, 0x07, 0x8A, 0x08, 0x04, 0xC1, - 0x07, 0x16, 0x60, 0x04, 0x8E, 0xC5, 0x72, 0xC1, - 0xB2, 0xC1, 0x84, 0x01, 0x00, 0x80, 0xF9, 0x13, - 0x04, 0x68, 0x92, 0x08, 0xC7, 0xC1, 0x37, 0x16, - 0x20, 0x98, 0x97, 0x08, 0x85, 0x09, 0x16, 0x16, - 0x81, 0x07, 0x40, 0x20, 0xE0, 0xC1, 0x94, 0x08, - 0x57, 0x13, 0xA0, 0x06, 0xAC, 0xC1, 0xF4, 0x10, - 0xE0, 0xC2, 0x3A, 0x07, 0xE0, 0x42, 0x62, 0x07, - 0xE0, 0x26, 0x3A, 0xE3, 0x02, 0x13, 0xA0, 0x06, - 0x92, 0xC1, 0xA0, 0x06, 0x54, 0xBA, 0x22, 0x10, - 0xA0, 0x06, 0x9C, 0xC1, 0x81, 0x2D, 0x01, 0xC2, - 0xFB, 0x13, 0xA0, 0x05, 0x96, 0x08, 0x23, 0xC8, - 0x08, 0x00, 0x6C, 0x01, 0xA0, 0x07, 0x02, 0xFC, - 0x00, 0x80, 0xC3, 0xC1, 0x27, 0x02, 0x06, 0x00, - 0xA0, 0x06, 0x0C, 0xB5, 0xA3, 0x05, 0x0C, 0x00, - 0x08, 0xC8, 0x6C, 0x01, 0x08, 0xC8, 0xE0, 0x08, - 0x08, 0x02, 0x02, 0xFC, 0xB8, 0x07, 0x00, 0x81, - 0xF8, 0xC1, 0x04, 0xC1, 0x37, 0x13, 0xE0, 0xD2, - 0x03, 0x01, 0xD2, 0x13, 0x0B, 0x02, 0x0A, 0x01, - 0xC4, 0xCE, 0xC7, 0xCE, 0xC5, 0xCE, 0xC6, 0xCE, - 0xFB, 0x04, 0x09, 0x02, 0x00, 0x04, 0x48, 0xA2, - 0xC9, 0xC6, 0x20, 0xA8, 0xE0, 0x08, 0x12, 0x01, - 0x20, 0xC8, 0xF2, 0x07, 0x00, 0x01, 0x47, 0xC2, - 0xC4, 0x81, 0x01, 0x14, 0x44, 0xC2, 0xC9, 0x61, - 0x09, 0xA2, 0x89, 0xA1, 0x01, 0x17, 0x85, 0x05, - 0x09, 0x61, 0xA8, 0x16, 0x82, 0x02, 0x8A, 0x08, - 0x05, 0x16, 0x40, 0x01, 0x10, 0x00, 0x12, 0x13, - 0x60, 0x04, 0xA6, 0xC3, 0x60, 0x04, 0xBC, 0xC4, - 0x60, 0x04, 0x40, 0xC3, 0x81, 0x07, 0x80, 0x20, - 0xFB, 0x10, 0x81, 0x07, 0x80, 0x20, 0xF8, 0x10, - 0x81, 0x07, 0x02, 0x20, 0xF5, 0x10, 0x81, 0x07, - 0x04, 0x20, 0xF2, 0x10, 0x23, 0xC8, 0x08, 0x00, - 0x6C, 0x01, 0x07, 0x05, 0xE0, 0xA1, 0xE8, 0x00, - 0x0C, 0x02, 0x04, 0xFC, 0x07, 0xCF, 0xE0, 0xC2, - 0x92, 0x08, 0xE8, 0x16, 0xE0, 0xD2, 0x03, 0x01, - 0x10, 0x16, 0xE0, 0xC2, 0x3A, 0x07, 0xE0, 0x42, - 0x62, 0x07, 0xE0, 0x26, 0x3A, 0xE3, 0x07, 0x13, - 0x90, 0x03, 0xC8, 0x2F, 0xA0, 0x06, 0x92, 0xC1, - 0xE0, 0xD2, 0x03, 0x01, 0x02, 0x16, 0xA0, 0x06, - 0x54, 0xBA, 0x23, 0xC8, 0x06, 0x00, 0x6C, 0x01, - 0xA3, 0xC2, 0x0E, 0x00, 0x4A, 0x01, 0x00, 0x01, - 0x0B, 0x13, 0x0C, 0x02, 0x0E, 0xFC, 0x5C, 0xC2, - 0x49, 0x02, 0x00, 0x80, 0x0D, 0x02, 0x6C, 0x09, - 0x7D, 0xE2, 0x09, 0xCF, 0x3D, 0xCF, 0x3D, 0xCF, - 0x0C, 0x02, 0x00, 0xFC, 0x6C, 0xC3, 0x06, 0x00, - 0x4D, 0x02, 0xFF, 0xE0, 0x4A, 0x02, 0x00, 0x02, - 0x8A, 0xA2, 0x8A, 0xA2, 0x4A, 0xE3, 0x60, 0xE3, - 0x9E, 0x09, 0x0D, 0xCB, 0x06, 0x00, 0xCD, 0x06, - 0x0B, 0x02, 0x0F, 0x00, 0xEC, 0x82, 0x04, 0x00, - 0xAD, 0x11, 0xEC, 0xC3, 0x0E, 0x00, 0x11, 0x15, - 0x10, 0x13, 0x6C, 0xC2, 0x14, 0x00, 0x49, 0x02, - 0x00, 0x1F, 0xA7, 0x13, 0xC9, 0x06, 0x89, 0x02, - 0x12, 0x00, 0xA3, 0x1B, 0x49, 0x01, 0x01, 0x00, - 0xA0, 0x13, 0xC9, 0xA2, 0xEC, 0x82, 0x04, 0x00, - 0x9C, 0x11, 0x4D, 0xA3, 0x9D, 0x18, 0x14, 0x11, - 0x60, 0x01, 0x6A, 0x09, 0x00, 0x80, 0x18, 0x13, - 0x1D, 0x09, 0xCC, 0xA2, 0xEB, 0xC2, 0x08, 0x00, - 0x7B, 0x09, 0x4B, 0x02, 0x1E, 0x00, 0xA0, 0xC3, - 0xF0, 0x06, 0xAB, 0x23, 0x04, 0xE0, 0x8F, 0x16, - 0x60, 0x27, 0x3E, 0xE3, 0x8C, 0x16, 0x4D, 0xA3, - 0x4D, 0xA3, 0x4D, 0xA3, 0xCD, 0x06, 0x4D, 0x02, - 0x07, 0x00, 0x0D, 0x88, 0xEE, 0x06, 0x0A, 0x15, - 0x90, 0x03, 0xFF, 0x6F, 0x53, 0x2F, 0xA0, 0x05, - 0x94, 0x08, 0xC3, 0x04, 0xC0, 0x01, 0x00, 0x04, - 0x60, 0x04, 0xAA, 0xC3, 0x60, 0x01, 0x6A, 0x09, - 0x00, 0x80, 0xF2, 0x13, 0x01, 0x02, 0x08, 0x20, - 0x60, 0x04, 0xA2, 0xC5, 0x8D, 0x07, 0x00, 0x10, - 0x20, 0x20, 0x0A, 0xE0, 0x0A, 0x16, 0x8D, 0x07, - 0x00, 0x08, 0x20, 0x20, 0x0E, 0xE0, 0x05, 0x13, - 0x8D, 0x07, 0x00, 0x40, 0x4F, 0x01, 0x01, 0x00, - 0x01, 0x16, 0x5B, 0x04, 0x20, 0xE0, 0x0E, 0xE0, - 0xA0, 0x07, 0xFA, 0x08, 0x00, 0x80, 0x0E, 0xC8, - 0xFA, 0x07, 0x0F, 0xC8, 0xFC, 0x07, 0x0E, 0xC8, - 0x3C, 0x08, 0x0F, 0xC8, 0x3E, 0x08, 0xE0, 0x04, - 0x08, 0x08, 0xE0, 0x04, 0x0E, 0x08, 0xE0, 0x02, - 0x98, 0x07, 0x20, 0x40, 0x4C, 0xE3, 0x20, 0x07, - 0x2E, 0x06, 0x60, 0x04, 0x12, 0xCA, 0x00, 0x70, - 0x4B, 0xC0, 0xE0, 0x04, 0x2E, 0x06, 0x0B, 0x10, - 0x20, 0xF0, 0x4B, 0xE3, 0x02, 0x10, 0x20, 0xF0, - 0x4A, 0xE3, 0x4B, 0xC0, 0xE0, 0x04, 0x2E, 0x06, - 0xE0, 0x01, 0x62, 0x07, 0x40, 0x00, 0x20, 0xE8, - 0x46, 0xE3, 0x62, 0x07, 0x20, 0x04, 0xDA, 0xEA, - 0x40, 0x01, 0x00, 0x20, 0x04, 0x13, 0xFA, 0x10, - 0x40, 0x01, 0x00, 0x40, 0xF7, 0x16, 0x20, 0x07, - 0x2E, 0x06, 0x20, 0x50, 0x50, 0xE3, 0x51, 0x04, - 0xF1, 0x10, 0xE0, 0x02, 0x58, 0x07, 0x00, 0x01, - 0x00, 0x40, 0x07, 0x16, 0x8D, 0x07, 0xF6, 0x08, - 0xA0, 0x06, 0x68, 0xB8, 0xE0, 0x02, 0x98, 0x07, - 0x5B, 0x04, 0xC4, 0x01, 0x04, 0x00, 0xE0, 0x02, - 0x98, 0x07, 0x5B, 0x04, 0x60, 0x01, 0x60, 0x07, - 0x04, 0x00, 0x06, 0x16, 0x20, 0xE8, 0x1C, 0xE0, - 0x58, 0x07, 0x80, 0x03, 0xE0, 0x02, 0x98, 0x07, - 0x20, 0xD8, 0xDC, 0x07, 0x17, 0x01, 0x8F, 0x07, - 0x8E, 0xFF, 0x0F, 0xC8, 0x04, 0x01, 0x20, 0xE8, - 0x06, 0xE0, 0x58, 0x07, 0x80, 0x01, 0x00, 0x80, - 0x5B, 0x04, 0xE0, 0xC2, 0x4A, 0x08, 0xC3, 0x82, - 0x03, 0x13, 0xDB, 0x2D, 0x03, 0xC8, 0x4A, 0x08, - 0x49, 0x01, 0x00, 0x01, 0x02, 0x16, 0x60, 0x04, - 0x52, 0xC9, 0xE0, 0xC0, 0xF8, 0x05, 0xFD, 0x13, - 0x03, 0xC8, 0x6C, 0x01, 0x20, 0xC8, 0x00, 0xFC, - 0xF8, 0x05, 0x88, 0x07, 0x02, 0xFC, 0x78, 0xC2, - 0xF8, 0xC1, 0x28, 0x02, 0x00, 0x04, 0x49, 0x01, - 0x00, 0x01, 0x4D, 0x16, 0x09, 0x01, 0x00, 0x5E, - 0x29, 0x16, 0x49, 0x01, 0x02, 0x00, 0x0B, 0x16, - 0x60, 0x01, 0x46, 0x08, 0x00, 0x02, 0x0A, 0x16, - 0x27, 0x02, 0x04, 0x00, 0x07, 0x88, 0x7E, 0x09, - 0x05, 0x12, 0x27, 0x02, 0xFC, 0xFF, 0xA0, 0x01, - 0x46, 0x08, 0x00, 0x02, 0xC7, 0xC1, 0x37, 0x15, - 0xD3, 0x2D, 0xE0, 0xC0, 0x4A, 0x08, 0x07, 0xA8, - 0x48, 0x08, 0x07, 0xA8, 0x44, 0x08, 0x0C, 0x15, - 0x20, 0xC8, 0x3C, 0x08, 0xFA, 0x07, 0x20, 0xC8, - 0x3E, 0x08, 0xFC, 0x07, 0x20, 0xC8, 0x40, 0x08, - 0x3C, 0x08, 0x20, 0xC8, 0x42, 0x08, 0x3E, 0x08, - 0x60, 0x04, 0x52, 0xC9, 0xA0, 0x06, 0x54, 0xBA, - 0xD3, 0x2D, 0xE0, 0xC2, 0x4A, 0x08, 0xC3, 0x82, - 0x01, 0x13, 0xDB, 0x2D, 0x20, 0x88, 0x3E, 0x08, - 0x3A, 0x08, 0x0D, 0x16, 0x20, 0x88, 0x3C, 0x08, - 0x38, 0x08, 0x09, 0x16, 0xE0, 0x04, 0x44, 0x08, - 0x82, 0x07, 0x02, 0x08, 0x04, 0x61, 0xE0, 0x04, - 0x48, 0x08, 0x60, 0x04, 0x1E, 0xCA, 0x20, 0xC8, - 0x38, 0x08, 0xFA, 0x07, 0x20, 0xC8, 0x3A, 0x08, - 0xFC, 0x07, 0x60, 0x04, 0x12, 0xCA, 0x07, 0xA8, - 0x48, 0x08, 0x04, 0xC1, 0x1B, 0x16, 0x82, 0x02, - 0x38, 0x08, 0x0A, 0x16, 0x60, 0x01, 0xFC, 0x07, - 0x01, 0x00, 0x02, 0x16, 0xA0, 0x06, 0x6E, 0xCB, - 0xA0, 0x06, 0xFC, 0xCA, 0x80, 0x01, 0x10, 0x00, - 0x32, 0xC1, 0x07, 0x11, 0x72, 0xC1, 0x92, 0xC1, - 0x82, 0x07, 0x38, 0x08, 0x04, 0xC1, 0x06, 0x16, - 0xEA, 0x10, 0x72, 0xC1, 0xB2, 0xC1, 0x84, 0x01, - 0x00, 0x80, 0xE5, 0x13, 0xE0, 0xD2, 0x03, 0x01, - 0x34, 0x13, 0x0B, 0x02, 0x0A, 0x01, 0xC4, 0xCE, - 0xC7, 0xCE, 0xC5, 0xCE, 0xC6, 0xCE, 0xFB, 0x04, - 0xC8, 0xC6, 0x03, 0xA8, 0x12, 0x01, 0x20, 0xC8, - 0xF8, 0x07, 0x00, 0x01, 0xC7, 0xC2, 0xC4, 0x81, - 0x01, 0x14, 0xC4, 0xC2, 0x0B, 0xA8, 0x44, 0x08, - 0x0B, 0x61, 0x0B, 0xA2, 0x8B, 0xA1, 0x01, 0x17, - 0x85, 0x05, 0xCB, 0x61, 0xC6, 0x16, 0x40, 0x01, - 0x40, 0x00, 0x15, 0x16, 0x87, 0x07, 0x20, 0x00, - 0xE0, 0x61, 0x44, 0x08, 0xC4, 0x81, 0x08, 0x1A, - 0x07, 0xA8, 0x48, 0x08, 0x07, 0xA8, 0x44, 0x08, - 0x07, 0x61, 0x87, 0xA1, 0x01, 0x17, 0x85, 0x05, - 0x80, 0x01, 0x40, 0x00, 0x03, 0xC8, 0x6C, 0x01, - 0xE0, 0xC1, 0x04, 0xFC, 0xAC, 0x10, 0x60, 0x04, - 0xBC, 0xC7, 0x20, 0x01, 0x3A, 0x07, 0x00, 0x70, - 0x04, 0x13, 0xA0, 0x06, 0x28, 0xC7, 0x20, 0x07, - 0x2E, 0x06, 0xA0, 0x06, 0x54, 0xBA, 0xC1, 0x10, - 0xE0, 0xD2, 0x03, 0x01, 0x0A, 0x16, 0x20, 0x01, - 0x3A, 0x07, 0x00, 0x70, 0x04, 0x13, 0xA0, 0x06, - 0x28, 0xC7, 0x20, 0x07, 0x2E, 0x06, 0xA0, 0x06, - 0x54, 0xBA, 0x90, 0x03, 0xBF, 0x4F, 0xD3, 0x2D, - 0x60, 0x01, 0xFC, 0x07, 0x01, 0x00, 0x02, 0x16, - 0xA0, 0x06, 0x6E, 0xCB, 0x60, 0xD2, 0x46, 0x08, - 0x89, 0x01, 0x00, 0xF1, 0xC9, 0x01, 0x00, 0x70, - 0x40, 0x01, 0x10, 0x00, 0x1C, 0x13, 0x20, 0x88, - 0x3E, 0x08, 0x3A, 0x08, 0x04, 0x16, 0x20, 0x88, - 0x3C, 0x08, 0x38, 0x08, 0x14, 0x13, 0x89, 0x01, - 0x00, 0x10, 0x8D, 0x07, 0x44, 0x08, 0x9D, 0x07, - 0x00, 0x50, 0xA0, 0xC2, 0xF6, 0x07, 0x8C, 0x07, - 0x02, 0x00, 0xA0, 0xC3, 0x3C, 0x08, 0xE0, 0xC3, - 0x3E, 0x08, 0x2F, 0x02, 0x04, 0x00, 0x01, 0x17, - 0x8E, 0x05, 0xA0, 0x06, 0x00, 0xBA, 0x8D, 0x07, - 0x46, 0x08, 0x49, 0xC7, 0xA0, 0xC2, 0xF6, 0x07, - 0x8C, 0x07, 0x04, 0x00, 0xA0, 0xC3, 0x38, 0x08, - 0xE0, 0xC3, 0x3A, 0x08, 0xCC, 0xA3, 0x01, 0x17, - 0x8E, 0x05, 0xA0, 0x06, 0x00, 0xBA, 0x20, 0xC8, - 0x3C, 0x08, 0xFC, 0x08, 0x20, 0xC8, 0x3E, 0x08, - 0xFE, 0x08, 0x09, 0x01, 0x00, 0x0C, 0x0C, 0x13, - 0x49, 0x01, 0x00, 0x04, 0x05, 0x16, 0xA0, 0x06, - 0x6C, 0xC7, 0xA0, 0x06, 0x38, 0xC7, 0x04, 0x10, - 0x90, 0x03, 0x7F, 0x40, 0xA0, 0x06, 0x6C, 0xC7, - 0xC0, 0x01, 0x90, 0x00, 0xA0, 0x06, 0xFC, 0xCA, - 0x0B, 0xC8, 0x46, 0x08, 0xE0, 0xC2, 0x42, 0x07, - 0x2D, 0x13, 0xE0, 0xC2, 0x2E, 0x06, 0x2A, 0x13, - 0xE0, 0x02, 0x58, 0x07, 0x8F, 0x07, 0xBF, 0xFF, - 0x0F, 0x2C, 0xE0, 0x02, 0x98, 0x07, 0xE0, 0xC0, - 0x5C, 0x07, 0x03, 0xC8, 0x4A, 0x08, 0x03, 0xC8, - 0x6C, 0x01, 0xC3, 0xC2, 0xCB, 0xA2, 0xEB, 0xC2, - 0x32, 0x0C, 0x32, 0x13, 0x0B, 0xC8, 0x00, 0xFC, - 0x0B, 0xC3, 0x4B, 0xC3, 0x0B, 0xC8, 0x6C, 0x01, - 0xE0, 0xC2, 0x00, 0xFC, 0xFA, 0x16, 0x00, 0x03, - 0x02, 0x00, 0x20, 0xC8, 0xF8, 0x05, 0x00, 0xFC, - 0x02, 0x16, 0x0D, 0xC8, 0xFA, 0x05, 0x0C, 0xC8, - 0xF8, 0x05, 0x00, 0x03, 0x0F, 0x00, 0x03, 0xC8, - 0x6C, 0x01, 0x1A, 0x10, 0xA0, 0xC3, 0x2E, 0x06, - 0x03, 0x13, 0xE0, 0xC0, 0xF8, 0x05, 0x0D, 0x16, - 0x4F, 0x2E, 0xC0, 0x01, 0x00, 0x80, 0xA0, 0x01, - 0x62, 0x07, 0x00, 0x80, 0x8E, 0xC3, 0x03, 0x13, - 0xA0, 0x01, 0x62, 0x07, 0x40, 0x00, 0x60, 0x04, - 0x4E, 0xC7, 0x03, 0xC8, 0x6C, 0x01, 0x20, 0xC8, - 0x00, 0xFC, 0xF8, 0x05, 0x03, 0xC8, 0x4A, 0x08, - 0x60, 0x01, 0x6A, 0x09, 0x00, 0x04, 0x02, 0x13, - 0x60, 0x04, 0xE4, 0xC7, 0x8C, 0x07, 0x0E, 0x00, - 0x20, 0xC2, 0x0E, 0xFC, 0x0A, 0x15, 0x09, 0x13, - 0x20, 0xC2, 0x14, 0xFC, 0x48, 0x02, 0x00, 0x1F, - 0xC8, 0x06, 0x88, 0x02, 0x12, 0x00, 0xF0, 0x1B, - 0x08, 0xA3, 0x88, 0x07, 0x02, 0xFC, 0x78, 0xC2, - 0xF8, 0xC1, 0x28, 0x02, 0x00, 0x04, 0x07, 0x83, - 0xE7, 0x1A, 0xCC, 0x61, 0x07, 0xC8, 0x04, 0xFC, - 0xCC, 0xC1, 0xC0, 0x01, 0x40, 0x00, 0x60, 0x04, - 0xF0, 0xC7, 0x4B, 0xC1, 0xA0, 0xC2, 0xF0, 0x07, - 0x20, 0xC3, 0x7A, 0x09, 0x8D, 0x07, 0xFA, 0x07, - 0x9D, 0xC3, 0xE0, 0xC3, 0xFC, 0x07, 0xA0, 0x06, - 0x00, 0xBA, 0x20, 0xC8, 0x3C, 0x08, 0x40, 0x08, - 0x20, 0xC8, 0x3E, 0x08, 0x42, 0x08, 0x0E, 0xC8, - 0x3C, 0x08, 0x0F, 0xC8, 0x3E, 0x08, 0xC4, 0x04, - 0x82, 0x07, 0x02, 0x08, 0xE0, 0x04, 0x44, 0x08, - 0x40, 0x01, 0x80, 0x00, 0x06, 0x16, 0x0E, 0xC8, - 0x38, 0x08, 0x0F, 0xC8, 0x3A, 0x08, 0xE0, 0x04, - 0x48, 0x08, 0xA0, 0x06, 0x54, 0xBA, 0xE0, 0xC2, - 0xFE, 0x07, 0x0D, 0x11, 0x0E, 0xC8, 0xFA, 0x07, - 0x0F, 0xC8, 0xFC, 0x07, 0x20, 0xC8, 0x40, 0x08, - 0x3C, 0x08, 0x20, 0xC8, 0x42, 0x08, 0x3E, 0x08, - 0xA0, 0x06, 0x32, 0xC7, 0xCB, 0x10, 0x80, 0x01, - 0x80, 0x00, 0x55, 0x04, 0x8B, 0xC0, 0xA0, 0xC2, - 0xF0, 0x07, 0x8C, 0x07, 0x04, 0x00, 0x8D, 0x07, - 0xFA, 0x07, 0xA0, 0xC3, 0x3C, 0x08, 0xE0, 0xC3, - 0x3E, 0x08, 0xA0, 0x06, 0x36, 0xBA, 0x60, 0x01, - 0xFC, 0x07, 0x01, 0x00, 0x04, 0x13, 0xA0, 0x07, - 0xFA, 0x08, 0x00, 0x80, 0x52, 0x04, 0x60, 0x01, - 0x60, 0x07, 0x04, 0x00, 0x07, 0x16, 0x20, 0xD0, - 0x04, 0xE0, 0x20, 0xE8, 0x1A, 0xE0, 0x58, 0x07, - 0x60, 0x04, 0x3E, 0xC7, 0xA0, 0x07, 0xFA, 0x08, - 0x00, 0x40, 0x20, 0xC8, 0x3C, 0x08, 0xFC, 0x08, - 0x20, 0xC8, 0x3E, 0x08, 0xFE, 0x08, 0xA0, 0x06, - 0x6C, 0xC7, 0xA0, 0x06, 0x38, 0xC7, 0xD3, 0x10, - 0xAD, 0xC2, 0x02, 0x00, 0x6D, 0xC2, 0x00, 0x00, - 0x05, 0x16, 0xAA, 0x07, 0x02, 0x00, 0x36, 0x07, - 0x9A, 0x2C, 0x80, 0x03, 0xEA, 0x2C, 0x02, 0x00, - 0x41, 0xCB, 0x00, 0x00, 0x80, 0x03, 0x2D, 0xC3, - 0x18, 0x00, 0xAC, 0x07, 0x02, 0x00, 0x36, 0x07, - 0x20, 0x4B, 0x06, 0xEB, 0x0A, 0x00, 0x20, 0xEB, - 0x00, 0xEB, 0x0A, 0x00, 0x9C, 0x2E, 0x80, 0x03, - 0xA0, 0xC2, 0x22, 0xE0, 0x60, 0x04, 0x8A, 0xA3, - 0xED, 0xC0, 0x18, 0x00, 0xA0, 0x06, 0x3A, 0xCC, - 0x80, 0x03, 0x44, 0xC2, 0xC3, 0xC0, 0x02, 0x13, - 0xA0, 0x06, 0x3A, 0xCC, 0x19, 0xC3, 0x09, 0xCB, - 0x18, 0x00, 0xC9, 0x05, 0x19, 0xCB, 0x16, 0x00, - 0x4C, 0xC2, 0x2C, 0x02, 0x1A, 0x00, 0x0D, 0xCF, - 0x0E, 0xCF, 0x0F, 0xC7, 0x99, 0x00, 0x5B, 0x04, - 0x8C, 0x07, 0x0A, 0x09, 0x9C, 0xC2, 0xA0, 0x22, - 0x14, 0xE0, 0x06, 0x13, 0xA0, 0xC2, 0x58, 0x07, - 0xA0, 0x22, 0x20, 0xE0, 0x01, 0x16, 0x80, 0x03, - 0x03, 0xC1, 0xC3, 0x04, 0x8A, 0x07, 0x04, 0x00, - 0x84, 0xA2, 0x3A, 0xCF, 0x3A, 0xCF, 0x3A, 0xCF, - 0x3A, 0xCF, 0x3A, 0xCF, 0xE0, 0x02, 0x58, 0x07, - 0x8D, 0x07, 0x0A, 0x09, 0x0B, 0xC8, 0xC2, 0x07, - 0xA0, 0x06, 0x44, 0xB8, 0xE0, 0xC2, 0xC2, 0x07, - 0x20, 0xE0, 0x20, 0xE0, 0xE0, 0x02, 0xB8, 0x07, - 0x5B, 0x04, 0x2D, 0xC3, 0x18, 0x00, 0x8C, 0xC2, - 0x60, 0xC2, 0x6C, 0x01, 0x0A, 0xC8, 0x6C, 0x01, - 0xE0, 0xC2, 0x00, 0xFC, 0x02, 0x13, 0x8B, 0xC2, - 0xF9, 0x10, 0x09, 0xC8, 0x6C, 0x01, 0x8B, 0x07, - 0xF8, 0x05, 0x5B, 0xC2, 0x0C, 0x13, 0xCB, 0x05, - 0x5B, 0xC2, 0xCA, 0xC6, 0xE0, 0xC2, 0x6C, 0x01, - 0x09, 0xC8, 0x6C, 0x01, 0x0C, 0xC8, 0x00, 0xFC, - 0x0B, 0xC8, 0x6C, 0x01, 0x02, 0x10, 0xCC, 0xCE, - 0xCA, 0xC6, 0xA0, 0xC2, 0xE0, 0x00, 0xA0, 0x22, - 0x1A, 0xE0, 0x06, 0x16, 0x20, 0xE8, 0x04, 0xE0, - 0x3A, 0x07, 0x20, 0x48, 0x1A, 0xE0, 0xE0, 0x00, - 0x80, 0x03, 0xE0, 0xD3, 0xAB, 0xE3, 0xE0, 0x04, - 0x8E, 0x09, 0xE0, 0xC1, 0xA8, 0x06, 0x05, 0x16, - 0x07, 0x02, 0xA2, 0x06, 0xA0, 0x06, 0x38, 0xB5, - 0x0B, 0x16, 0xE0, 0xC1, 0xBA, 0x06, 0x23, 0x16, - 0x07, 0x02, 0xB4, 0x06, 0xA0, 0x06, 0x38, 0xB5, - 0x1E, 0x13, 0x07, 0x02, 0xB8, 0x06, 0x02, 0x10, - 0x07, 0x02, 0xA6, 0x06, 0x60, 0xC1, 0x02, 0xFC, - 0x25, 0xC8, 0x0C, 0x00, 0x02, 0xFC, 0xC5, 0xC9, - 0x0C, 0x00, 0xF5, 0xCD, 0xF5, 0xCD, 0xF5, 0xCD, - 0xF5, 0xCD, 0xF5, 0xCD, 0xF5, 0xC5, 0xB7, 0x01, - 0x28, 0x00, 0x27, 0x02, 0xF4, 0xFF, 0xA7, 0x07, - 0x04, 0x00, 0x52, 0xCE, 0x20, 0xE8, 0x9E, 0x09, - 0x06, 0xFC, 0x97, 0x2E, 0xD2, 0x10, 0x00, 0x03, - 0x02, 0x00, 0xA0, 0x06, 0x50, 0xB5, 0x00, 0x03, - 0x0F, 0x00, 0x20, 0x2C, 0xF0, 0xED, 0xE0, 0x93, - 0xAB, 0xE3, 0x03, 0x16, 0x81, 0x02, 0x16, 0x00, - 0xC4, 0x16, 0x21, 0xC1, 0x10, 0xEB, 0x54, 0x04, - 0xE0, 0x93, 0x10, 0xE0, 0x03, 0x16, 0xA0, 0xD2, - 0xA8, 0xE3, 0x0B, 0x10, 0xCF, 0xD3, 0x09, 0x16, - 0xA0, 0x23, 0x08, 0xE0, 0x06, 0x16, 0x84, 0x07, - 0x20, 0x00, 0x04, 0xE8, 0xD2, 0x06, 0xA0, 0xD2, - 0x0C, 0xE0, 0x60, 0x04, 0xD2, 0xCE, 0x60, 0x04, - 0x70, 0xD1, 0x22, 0xC1, 0x04, 0x00, 0xE2, 0x04, - 0x02, 0x00, 0x54, 0x04, 0x02, 0xC8, 0x6C, 0x01, - 0x82, 0xA0, 0x22, 0xC8, 0x32, 0x0C, 0x00, 0xFC, - 0x02, 0x02, 0x00, 0xFC, 0xE0, 0x93, 0xAA, 0xE3, - 0x13, 0x16, 0xB0, 0x03, 0x20, 0x98, 0xAA, 0xE3, - 0x65, 0x06, 0x0D, 0x16, 0x8B, 0x07, 0x17, 0xFC, - 0xDB, 0xD2, 0x8B, 0x09, 0x8B, 0x02, 0x15, 0x00, - 0x7B, 0x1B, 0xEB, 0xD2, 0xC4, 0xEA, 0x06, 0x13, - 0x77, 0x15, 0x20, 0x07, 0xA0, 0x09, 0x74, 0x10, - 0xA0, 0x06, 0x02, 0xD0, 0xA0, 0x48, 0x04, 0xE0, - 0x0E, 0x00, 0x85, 0x02, 0x07, 0x00, 0x0E, 0x13, - 0x0E, 0x01, 0x03, 0x00, 0x0B, 0x13, 0xA0, 0x23, - 0x22, 0xE0, 0x03, 0x16, 0xA0, 0xD2, 0x0E, 0xE0, - 0x02, 0x10, 0xA0, 0xD2, 0xA8, 0xE3, 0x8E, 0x01, - 0x03, 0x00, 0x5E, 0x10, 0x05, 0xC8, 0xFC, 0x06, - 0xC3, 0xC0, 0x57, 0x16, 0xA0, 0x43, 0x10, 0xE0, - 0x22, 0x88, 0x0E, 0x00, 0x6C, 0x09, 0x0A, 0x16, - 0x22, 0x88, 0x10, 0x00, 0x6E, 0x09, 0x06, 0x16, - 0x22, 0x88, 0x12, 0x00, 0x70, 0x09, 0x02, 0x16, - 0xA0, 0xE3, 0x10, 0xE0, 0x85, 0x02, 0x09, 0x00, - 0x02, 0x13, 0xA0, 0x06, 0xB8, 0xD7, 0x45, 0xA1, - 0x65, 0xC1, 0xAC, 0xE3, 0x55, 0x04, 0x62, 0xC0, - 0x04, 0x00, 0x22, 0xC8, 0x06, 0x00, 0x6C, 0x01, - 0x82, 0x02, 0x48, 0x04, 0x02, 0x1B, 0xA0, 0x43, - 0x0C, 0xE0, 0x22, 0xC1, 0x0E, 0x00, 0x51, 0x04, - 0x42, 0xC0, 0xE1, 0x04, 0x02, 0x00, 0xA2, 0xC0, - 0x0C, 0x00, 0x22, 0xC1, 0x0A, 0x00, 0x20, 0x21, - 0x18, 0xE0, 0x07, 0x13, 0xA1, 0xC8, 0x0A, 0x00, - 0x0A, 0x00, 0xA1, 0xC8, 0x08, 0x00, 0x08, 0x00, - 0xE2, 0x10, 0x22, 0xC8, 0x06, 0x00, 0x6C, 0x01, - 0xA0, 0x06, 0x66, 0xD6, 0x60, 0x04, 0xB0, 0xCE, - 0x02, 0xC8, 0xD4, 0x06, 0x62, 0xC1, 0x02, 0x00, - 0x65, 0xC1, 0xD8, 0xE3, 0x55, 0x04, 0x0F, 0x10, - 0x0E, 0x10, 0x85, 0x07, 0xF4, 0x03, 0xF5, 0x04, - 0x60, 0xCD, 0xCE, 0xED, 0xA0, 0x06, 0xA2, 0xD8, - 0xA0, 0xE3, 0x0C, 0xE0, 0x20, 0xE8, 0x9E, 0x09, - 0x06, 0x04, 0xA0, 0x2E, 0xF4, 0x03, 0x60, 0x04, - 0xE4, 0xCC, 0xA0, 0x06, 0x26, 0xD5, 0x0C, 0x10, - 0xA0, 0x06, 0x66, 0xD6, 0x09, 0x10, 0xA0, 0x06, - 0x2A, 0xD8, 0x06, 0x10, 0xA0, 0x06, 0x66, 0xD6, - 0x03, 0xC8, 0x2A, 0x09, 0xA0, 0xD2, 0xAA, 0xE3, - 0xA0, 0x06, 0x6E, 0xCF, 0xA0, 0x92, 0x26, 0xE0, - 0x0C, 0x16, 0xE0, 0xD3, 0x26, 0xE0, 0xE0, 0x23, - 0x14, 0xE0, 0x0A, 0x13, 0x0A, 0xC1, 0xC4, 0x83, - 0x07, 0x13, 0xC4, 0xC3, 0x24, 0xC1, 0xDC, 0xE3, - 0x54, 0x04, 0xCA, 0x93, 0xDC, 0x13, 0xCA, 0xD3, - 0xB0, 0x03, 0x0F, 0xD8, 0x59, 0x06, 0x04, 0x71, - 0x24, 0xC1, 0xEC, 0xE3, 0x54, 0x04, 0xA0, 0x23, - 0x0C, 0xE0, 0xD1, 0x13, 0x4D, 0xC3, 0xCF, 0x13, - 0x4D, 0x01, 0x00, 0x04, 0x0B, 0x13, 0x86, 0x07, - 0x02, 0x00, 0x84, 0x07, 0x26, 0x00, 0x46, 0x23, - 0x03, 0x13, 0x44, 0x06, 0x86, 0xA1, 0xFB, 0x10, - 0x46, 0x43, 0xB3, 0x10, 0x84, 0x07, 0x18, 0x00, - 0x8D, 0x01, 0x00, 0x04, 0x85, 0x07, 0xF4, 0x03, - 0xF5, 0x04, 0x60, 0xCD, 0xCE, 0xED, 0xA0, 0x06, - 0xA2, 0xD8, 0x20, 0xE8, 0x9C, 0x09, 0xFE, 0x03, - 0x20, 0xE8, 0x9E, 0x09, 0x06, 0x04, 0xA8, 0x10, - 0x85, 0x07, 0x1C, 0x07, 0x86, 0x07, 0x1A, 0x04, - 0x76, 0x6D, 0x76, 0x6D, 0x76, 0x6D, 0xC6, 0x05, - 0x76, 0x6D, 0x76, 0x6D, 0x76, 0x6D, 0x83, 0x07, - 0x00, 0x90, 0xA9, 0x10, 0x0B, 0xC3, 0x86, 0x07, - 0x00, 0x01, 0x85, 0x07, 0x00, 0x80, 0x20, 0xC1, - 0xD2, 0x06, 0x37, 0x13, 0xC4, 0x04, 0x60, 0xC0, - 0xD2, 0x06, 0x45, 0x20, 0x04, 0x13, 0x84, 0x05, - 0x15, 0x09, 0xF9, 0x16, 0x2E, 0x10, 0xCF, 0xD3, - 0x06, 0x16, 0xE0, 0x23, 0x14, 0xE0, 0x03, 0x16, - 0x0E, 0x01, 0x03, 0x00, 0x03, 0x13, 0xE0, 0x04, - 0xD2, 0x06, 0x23, 0x10, 0x64, 0xD0, 0x1C, 0x07, - 0x46, 0xB0, 0x10, 0x18, 0x01, 0xD9, 0x1C, 0x07, - 0x60, 0x23, 0x20, 0xE0, 0x0B, 0x13, 0x81, 0x07, - 0x18, 0x00, 0x61, 0xC0, 0xFC, 0xE3, 0x11, 0x88, - 0xCE, 0xED, 0x04, 0x13, 0x08, 0x02, 0x18, 0x80, - 0xA0, 0x06, 0xDA, 0xD4, 0x64, 0xD0, 0x28, 0x07, - 0x46, 0xB0, 0x08, 0x18, 0x01, 0xD9, 0x28, 0x07, - 0x46, 0xB0, 0x04, 0x17, 0x83, 0x07, 0x40, 0x80, - 0xA0, 0x06, 0x2A, 0xD8, 0x05, 0x48, 0xD2, 0x06, - 0xCA, 0x16, 0x20, 0xC1, 0x32, 0x09, 0x01, 0x16, - 0x5C, 0x04, 0x04, 0x02, 0x07, 0x00, 0x20, 0x06, - 0x32, 0x09, 0x05, 0x02, 0x00, 0x01, 0xC7, 0x10, - 0x0B, 0xC3, 0xC5, 0x04, 0x42, 0xC0, 0xC7, 0x04, - 0x20, 0xC2, 0x6C, 0x01, 0xE1, 0xA1, 0x04, 0x00, - 0x11, 0xC8, 0x6C, 0x01, 0xFB, 0x16, 0x08, 0xC8, - 0x6C, 0x01, 0xC8, 0x04, 0xA0, 0x43, 0x1A, 0xE0, - 0x22, 0xC1, 0x0E, 0x00, 0x0D, 0x15, 0x0C, 0x13, - 0xA0, 0xE3, 0x1A, 0xE0, 0xA0, 0x06, 0x14, 0xD8, - 0x08, 0xC2, 0x48, 0x13, 0x88, 0x02, 0x12, 0x00, - 0x45, 0x1B, 0x20, 0x22, 0x22, 0xE0, 0x42, 0x13, - 0x02, 0xC1, 0x08, 0xA1, 0x08, 0x05, 0x28, 0x02, - 0xF2, 0xFF, 0x07, 0xA2, 0x83, 0x07, 0x01, 0x80, - 0x88, 0x02, 0x04, 0x00, 0x6E, 0x11, 0x64, 0xC2, - 0x16, 0x00, 0x49, 0xD2, 0x02, 0x16, 0x02, 0x81, - 0x31, 0x16, 0x09, 0x01, 0x00, 0xF0, 0x28, 0x16, - 0x49, 0xC1, 0x45, 0x71, 0xC3, 0x04, 0x85, 0x02, - 0x09, 0x00, 0x7C, 0x13, 0x83, 0x07, 0x02, 0x80, - 0xA4, 0xC1, 0x14, 0x00, 0x88, 0x81, 0x76, 0x16, - 0x83, 0x05, 0x85, 0x02, 0x15, 0x00, 0x13, 0x1B, - 0x83, 0x05, 0x49, 0x99, 0x30, 0xEB, 0x0A, 0x13, - 0x09, 0x98, 0x0E, 0xE0, 0x6B, 0x16, 0x25, 0x98, - 0x30, 0xEB, 0x0C, 0xE0, 0x67, 0x16, 0xE0, 0xC1, - 0xEC, 0x06, 0x64, 0x16, 0xC3, 0x04, 0x52, 0xC2, - 0x0F, 0x13, 0x83, 0x07, 0x09, 0x80, 0xE0, 0xC1, - 0x6A, 0x09, 0x47, 0x01, 0x00, 0x10, 0x5A, 0x16, - 0xA0, 0xC0, 0x6C, 0x01, 0xA0, 0x06, 0xBE, 0xD6, - 0x60, 0x04, 0xB0, 0xCE, 0x60, 0x04, 0xBA, 0xCE, - 0x89, 0x07, 0x0E, 0x07, 0xC7, 0x04, 0xE5, 0xD1, - 0x46, 0xEB, 0x05, 0x13, 0xC7, 0x06, 0x27, 0x02, - 0x5C, 0xEB, 0x77, 0xCE, 0xFE, 0x15, 0x44, 0xC0, - 0x21, 0x02, 0x18, 0x00, 0x28, 0x02, 0xFC, 0xFF, - 0x36, 0x13, 0x91, 0xC1, 0x86, 0xD1, 0x1F, 0x13, - 0xC6, 0x06, 0x87, 0x07, 0x0E, 0x07, 0xF7, 0xC0, - 0x46, 0x02, 0xFF, 0xBF, 0x43, 0x02, 0xFF, 0x3F, - 0xA0, 0x91, 0xF5, 0xED, 0x09, 0x16, 0xB0, 0x03, - 0x20, 0x98, 0x0E, 0xE0, 0x5D, 0x06, 0x0F, 0x16, - 0x21, 0xC8, 0x02, 0x00, 0x0C, 0x07, 0x17, 0x10, - 0x47, 0x82, 0x0C, 0x1B, 0xC6, 0x90, 0xEB, 0x16, - 0x47, 0x06, 0xF7, 0x04, 0xB0, 0x03, 0x20, 0x98, - 0x5D, 0x06, 0x57, 0x06, 0x0C, 0x13, 0x83, 0x07, - 0x05, 0x80, 0x1C, 0x10, 0xD1, 0xC0, 0xE0, 0x20, - 0x16, 0xE0, 0x03, 0x16, 0x83, 0x07, 0x08, 0x80, - 0x15, 0x10, 0x60, 0x44, 0x26, 0xE0, 0x86, 0x71, - 0x46, 0xA0, 0x06, 0x62, 0x83, 0x07, 0x05, 0x80, - 0x08, 0xC2, 0xCB, 0x15, 0x0B, 0x16, 0xC3, 0x04, - 0x87, 0x07, 0x0E, 0x07, 0x77, 0xC0, 0x47, 0x82, - 0x05, 0x1B, 0x60, 0x20, 0x06, 0xE0, 0xFA, 0x16, - 0x83, 0x07, 0x07, 0x80, 0x5C, 0x04, 0xA0, 0x92, - 0x0E, 0xE0, 0x11, 0x16, 0x20, 0xC8, 0x20, 0xE0, - 0x08, 0x07, 0xE0, 0x04, 0x84, 0x01, 0x60, 0x05, - 0x02, 0x07, 0x4B, 0x13, 0x20, 0x48, 0x06, 0xE0, - 0x82, 0x01, 0xA0, 0x06, 0xD0, 0xD4, 0x83, 0x07, - 0x00, 0xC0, 0xA0, 0x06, 0x2A, 0xD8, 0x20, 0xC8, - 0x1E, 0xE0, 0x02, 0x07, 0xA0, 0xE3, 0x04, 0xE0, - 0x08, 0x02, 0x24, 0x80, 0xA0, 0x06, 0xDA, 0xD4, - 0x42, 0x10, 0x20, 0xC1, 0x84, 0x01, 0x44, 0x02, - 0x00, 0x88, 0x2A, 0x13, 0x04, 0x48, 0x84, 0x01, - 0x20, 0x06, 0x02, 0x07, 0xF1, 0x16, 0x60, 0x01, - 0x8E, 0x09, 0x00, 0x80, 0x15, 0x13, 0xA0, 0x23, - 0x22, 0xE0, 0x05, 0x16, 0xA0, 0x43, 0x22, 0xE0, - 0xA0, 0xD2, 0x0E, 0xE0, 0xCF, 0x10, 0xE0, 0x23, - 0x14, 0xE0, 0x04, 0x13, 0x20, 0x98, 0xA9, 0xE3, - 0x65, 0x06, 0x0C, 0x16, 0xA0, 0x92, 0x0E, 0xE0, - 0xC5, 0x13, 0xA0, 0xD2, 0xA8, 0xE3, 0xD3, 0x10, - 0x20, 0xC8, 0x20, 0xE0, 0x08, 0x07, 0x83, 0x07, - 0x00, 0xC0, 0x04, 0x10, 0x83, 0x07, 0x02, 0x00, - 0x60, 0x04, 0xCA, 0xCE, 0x60, 0x04, 0xC0, 0xCE, - 0x20, 0xE8, 0x06, 0xE0, 0x82, 0x01, 0xA0, 0x06, - 0xD0, 0xD4, 0x20, 0x07, 0x02, 0x07, 0xA0, 0x43, - 0x04, 0xE0, 0x20, 0xC8, 0xAE, 0xE4, 0x86, 0x01, - 0x20, 0x88, 0x20, 0xE0, 0x08, 0x07, 0x03, 0x16, - 0x20, 0xC8, 0x78, 0xEB, 0x08, 0x07, 0x60, 0x04, - 0xD2, 0xCE, 0x0E, 0x01, 0x03, 0x00, 0x16, 0x13, - 0xCF, 0xD3, 0x08, 0x16, 0xA0, 0x23, 0x20, 0xE0, - 0x03, 0x16, 0xA0, 0xD2, 0xA8, 0xE3, 0x02, 0x10, - 0xA0, 0xD2, 0x0E, 0xE0, 0x8E, 0x01, 0x03, 0x00, - 0x09, 0x10, 0x60, 0xC1, 0x84, 0x01, 0x60, 0x21, - 0x0A, 0xE0, 0x04, 0x16, 0x83, 0x07, 0x00, 0x84, - 0x60, 0x04, 0xCA, 0xCE, 0x20, 0xC8, 0x2E, 0xE0, - 0x84, 0x01, 0x08, 0x02, 0x06, 0x80, 0xA0, 0x06, - 0xDA, 0xD4, 0x60, 0x04, 0xD2, 0xCE, 0x60, 0xE3, - 0x20, 0xE0, 0x60, 0x04, 0xD2, 0xCE, 0xE0, 0x93, - 0x26, 0xE0, 0x10, 0x16, 0xA0, 0x23, 0x08, 0xE0, - 0x0D, 0x16, 0xA0, 0x23, 0x06, 0xE0, 0x02, 0x13, - 0x60, 0xE3, 0x1C, 0xE0, 0x60, 0xE3, 0x18, 0xE0, - 0xA0, 0x43, 0x06, 0xE0, 0x08, 0x02, 0x3C, 0x80, - 0xA0, 0x06, 0xDA, 0xD4, 0x60, 0x04, 0xD2, 0xCE, - 0xA0, 0x92, 0xA8, 0xE3, 0x03, 0x13, 0xA0, 0x92, - 0xA9, 0xE3, 0x1E, 0x16, 0xE0, 0x23, 0x14, 0xE0, - 0x08, 0x13, 0x20, 0x98, 0xA9, 0xE3, 0x65, 0x06, - 0x04, 0x13, 0x83, 0x07, 0x07, 0x00, 0x60, 0x04, - 0xCA, 0xCE, 0xA0, 0xD2, 0x0E, 0xE0, 0x20, 0xC8, - 0x20, 0xE0, 0x08, 0x07, 0xA0, 0x27, 0x04, 0xE0, - 0x0B, 0x16, 0x20, 0xC8, 0x1E, 0xE0, 0x08, 0x07, - 0xE0, 0x93, 0xA8, 0xE3, 0x05, 0x16, 0xA0, 0x23, - 0x12, 0xE0, 0x02, 0x13, 0x20, 0x06, 0x08, 0x07, - 0x60, 0x04, 0xD2, 0xCE, 0xE0, 0x23, 0x14, 0xE0, - 0x3E, 0x13, 0xB0, 0x03, 0x20, 0x98, 0x0E, 0xE0, - 0x6F, 0x06, 0x0F, 0x16, 0xCF, 0xD3, 0x37, 0x16, - 0xA0, 0xD2, 0xA8, 0xE3, 0x60, 0x04, 0xD2, 0xCE, - 0xA0, 0x92, 0x0C, 0xE0, 0x30, 0x16, 0xE0, 0x23, - 0x14, 0xE0, 0xF6, 0x13, 0x83, 0x07, 0x06, 0x00, - 0x07, 0x10, 0x83, 0x07, 0x05, 0x00, 0xE0, 0x93, - 0x0E, 0xE0, 0x02, 0x16, 0x83, 0x07, 0x07, 0x00, - 0x60, 0x04, 0xCA, 0xCE, 0x60, 0xE3, 0x12, 0xE0, - 0xE0, 0x23, 0x14, 0xE0, 0x11, 0x13, 0x20, 0x98, - 0x0C, 0xE0, 0x65, 0x06, 0x03, 0x16, 0x20, 0xD8, - 0xA9, 0xE3, 0x65, 0x06, 0x14, 0x10, 0x60, 0x01, - 0x8E, 0x09, 0x00, 0x80, 0x10, 0x13, 0x20, 0xC1, - 0x84, 0x01, 0x20, 0x21, 0x06, 0xE0, 0xD2, 0x16, - 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 0x07, 0x13, - 0x20, 0x48, 0x06, 0xE0, 0x84, 0x01, 0x08, 0x02, - 0x30, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x60, 0x04, - 0xD2, 0xCE, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x20, - 0xFA, 0x16, 0x08, 0x02, 0x78, 0x80, 0xA0, 0x06, - 0xDA, 0xD4, 0x20, 0xC2, 0xA2, 0x09, 0x03, 0x13, - 0x20, 0x06, 0xA2, 0x09, 0x21, 0x13, 0x20, 0xC2, - 0xA4, 0x09, 0xED, 0x13, 0x20, 0x06, 0xA4, 0x09, - 0xEA, 0x16, 0xA0, 0x07, 0xA4, 0x09, 0x05, 0x00, - 0xCD, 0x01, 0x00, 0x04, 0xE4, 0x10, 0x60, 0x01, - 0x8E, 0x09, 0x80, 0x00, 0x3E, 0x13, 0x60, 0x01, - 0x8E, 0x09, 0x00, 0x10, 0x02, 0x16, 0xA0, 0x06, - 0xE6, 0xD5, 0xA0, 0x01, 0x8E, 0x09, 0x00, 0x10, - 0xE0, 0x01, 0x8E, 0x09, 0x80, 0x00, 0x83, 0x07, - 0x00, 0xA8, 0xA0, 0x06, 0x2A, 0xD8, 0x16, 0x10, - 0x60, 0x01, 0x8E, 0x09, 0x00, 0x04, 0x21, 0x13, - 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x10, 0xA0, 0x07, - 0x08, 0x07, 0x05, 0x00, 0x83, 0x07, 0x08, 0xA8, - 0xA0, 0x23, 0x04, 0xE0, 0x05, 0x16, 0x20, 0xC8, - 0x20, 0xE0, 0x08, 0x07, 0x83, 0x07, 0x08, 0xE8, - 0xA0, 0x06, 0x2A, 0xD8, 0xA0, 0x01, 0x8E, 0x09, - 0x00, 0x20, 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x01, - 0xE0, 0x01, 0x82, 0x01, 0x00, 0x08, 0xA0, 0xD2, - 0x0E, 0xE0, 0x83, 0x07, 0x10, 0x80, 0x60, 0x04, - 0xC0, 0xCE, 0x08, 0x02, 0x78, 0x00, 0xA0, 0x06, - 0xDA, 0xD4, 0x83, 0x07, 0x00, 0x82, 0x60, 0x04, - 0xCA, 0xCE, 0x60, 0x04, 0xD2, 0xCE, 0x20, 0x06, - 0x90, 0x09, 0x07, 0x15, 0xA0, 0xD2, 0x10, 0xE0, - 0xCA, 0x06, 0xA0, 0xD2, 0x26, 0xE0, 0xCF, 0x04, - 0xF4, 0x10, 0x08, 0x02, 0x7E, 0x80, 0xA0, 0x06, - 0xDA, 0xD4, 0x20, 0xC2, 0x90, 0x09, 0x88, 0x02, - 0x96, 0x00, 0x0D, 0x1B, 0xEA, 0x16, 0x20, 0x48, - 0x08, 0xE0, 0x82, 0x01, 0xA0, 0x01, 0x8E, 0x09, - 0x00, 0x10, 0xA0, 0x06, 0xE6, 0xD5, 0x83, 0x07, - 0x00, 0x28, 0x60, 0x04, 0xC0, 0xCE, 0x60, 0x01, - 0x8E, 0x09, 0x00, 0x10, 0xDA, 0x16, 0x84, 0x07, - 0x04, 0x00, 0x85, 0x07, 0xF4, 0x03, 0xF5, 0x04, - 0xB5, 0x07, 0x30, 0x06, 0xA0, 0x06, 0xA2, 0xD8, - 0xA0, 0x07, 0xF8, 0x03, 0x34, 0xD4, 0x60, 0x04, - 0xC0, 0xDB, 0xA0, 0x07, 0x90, 0x09, 0xF4, 0x01, - 0x08, 0x02, 0x7E, 0x80, 0xA0, 0x06, 0xDA, 0xD4, - 0x08, 0x02, 0x36, 0x00, 0xA0, 0x06, 0xDA, 0xD4, - 0x20, 0xE8, 0x0C, 0xE0, 0x82, 0x01, 0xA0, 0x23, - 0x18, 0xE0, 0x06, 0x13, 0xA0, 0xE3, 0x18, 0xE0, - 0xE0, 0x2E, 0x00, 0x00, 0x41, 0xC0, 0xFA, 0x16, - 0xA0, 0x06, 0xE6, 0xD5, 0xB2, 0x10, 0x04, 0x02, - 0x64, 0x00, 0x04, 0x06, 0xFE, 0x16, 0x5B, 0x04, - 0xA0, 0xE3, 0x0A, 0xE0, 0x08, 0xC2, 0x02, 0x11, - 0xA0, 0x43, 0x0A, 0xE0, 0x20, 0x42, 0x04, 0xE0, - 0x28, 0x02, 0xFC, 0xE3, 0x58, 0xC0, 0x02, 0xC0, - 0x11, 0x88, 0xCE, 0xED, 0x03, 0x16, 0xD1, 0x2C, - 0x58, 0xC0, 0xD1, 0x04, 0x80, 0xC0, 0x0E, 0x01, - 0x00, 0x10, 0x0F, 0x13, 0x60, 0xCC, 0xCE, 0xED, - 0xC8, 0x05, 0x78, 0xCC, 0x03, 0x16, 0x41, 0x06, - 0x60, 0xCC, 0xD6, 0x06, 0x58, 0xC4, 0x02, 0x16, - 0x60, 0xC4, 0x00, 0x07, 0x21, 0x02, 0xFA, 0xFF, - 0x91, 0x2C, 0x5B, 0x04, 0x0B, 0xC3, 0xA0, 0x06, - 0xC2, 0xD5, 0xA0, 0x06, 0x9C, 0xD5, 0x08, 0xC2, - 0x05, 0x16, 0x62, 0xC2, 0x02, 0x00, 0x60, 0x26, - 0xA8, 0xE4, 0x0D, 0x16, 0x42, 0xC2, 0xC9, 0x05, - 0x60, 0xCE, 0xF2, 0xED, 0x60, 0xC6, 0x7C, 0xEB, - 0xA0, 0x06, 0x10, 0xD6, 0x18, 0xCA, 0x0A, 0x00, - 0x20, 0x46, 0x26, 0xE0, 0x04, 0x16, 0xA0, 0xC0, - 0x6C, 0x01, 0x12, 0x2E, 0x1D, 0x10, 0x12, 0xC1, - 0x05, 0x13, 0x60, 0xC1, 0x6C, 0x01, 0x14, 0x2E, - 0x05, 0xC8, 0x6C, 0x01, 0xD2, 0x04, 0x48, 0x06, - 0x84, 0x07, 0x02, 0x00, 0x48, 0xC1, 0xA0, 0xC0, - 0x6C, 0x01, 0x02, 0xC0, 0xA0, 0x06, 0xA2, 0xD8, - 0x60, 0xC5, 0x02, 0xFC, 0x07, 0x02, 0xA2, 0x06, - 0x25, 0x02, 0xF4, 0xFF, 0x05, 0xC8, 0x02, 0xFC, - 0x20, 0xC2, 0x6C, 0x01, 0xA0, 0x06, 0xFC, 0xB4, - 0x5C, 0x04, 0x42, 0xC2, 0x29, 0x02, 0x08, 0x00, - 0x39, 0xC2, 0x48, 0x02, 0x00, 0xC0, 0x88, 0x02, - 0x00, 0xC0, 0x08, 0x16, 0x60, 0x8E, 0x2E, 0xE0, - 0x05, 0x16, 0x60, 0x86, 0x2E, 0xE0, 0x02, 0x16, - 0xC8, 0x04, 0x5B, 0x04, 0x08, 0x07, 0x5B, 0x04, - 0x20, 0x88, 0x8E, 0xE1, 0x6C, 0x01, 0x02, 0x16, - 0x60, 0x04, 0xBA, 0xCE, 0x5B, 0x04, 0x88, 0x07, - 0xAE, 0x01, 0x20, 0xE8, 0x0E, 0xE0, 0x80, 0x01, - 0x08, 0x06, 0xFE, 0x16, 0x20, 0x48, 0x0E, 0xE0, - 0x80, 0x01, 0x5B, 0x04, 0xC2, 0x04, 0xA0, 0x23, - 0x0C, 0xE0, 0x10, 0x16, 0x20, 0x2F, 0x30, 0x06, - 0x82, 0x07, 0xDF, 0xFF, 0x02, 0x2C, 0x82, 0x02, - 0xF4, 0x03, 0x06, 0x13, 0xE2, 0x04, 0x02, 0x00, - 0xA2, 0xC0, 0x06, 0x00, 0x12, 0x2E, 0xF4, 0x10, - 0xA0, 0x43, 0x0C, 0xE0, 0x5B, 0x04, 0x42, 0xC2, - 0x88, 0x07, 0x0E, 0x00, 0x09, 0xA2, 0x29, 0x02, - 0x08, 0x00, 0x78, 0xCE, 0x78, 0xCE, 0x78, 0xCE, - 0x60, 0xCE, 0x6C, 0x09, 0x60, 0xCE, 0x6E, 0x09, - 0x60, 0xCE, 0x70, 0x09, 0xA0, 0x23, 0x1A, 0xE0, - 0x0F, 0x16, 0x58, 0xC2, 0x49, 0x02, 0x80, 0x1F, - 0x60, 0x2A, 0x14, 0xE0, 0xA0, 0xE8, 0x04, 0xE0, - 0x0E, 0x00, 0x09, 0xC6, 0x49, 0x02, 0x00, 0x1F, - 0xC9, 0x06, 0x09, 0xA2, 0x89, 0xA8, 0x04, 0x00, - 0x28, 0x02, 0x02, 0x00, 0x58, 0xC2, 0x49, 0x0A, - 0x49, 0x02, 0x00, 0xF0, 0x09, 0xD6, 0xE2, 0x04, - 0x06, 0x00, 0x5B, 0x04, 0x00, 0x07, 0x82, 0xC0, - 0x53, 0x13, 0xA0, 0xC0, 0x6C, 0x01, 0xA0, 0xC1, - 0x06, 0xFC, 0x46, 0x02, 0x0F, 0x00, 0x86, 0x02, - 0x01, 0x00, 0x3D, 0x12, 0x06, 0x88, 0xF2, 0x06, - 0x12, 0x16, 0x01, 0x02, 0x0E, 0xFC, 0x31, 0x88, - 0xF4, 0x06, 0x0D, 0x16, 0x31, 0x88, 0xF6, 0x06, - 0x0A, 0x16, 0x31, 0x88, 0xF8, 0x06, 0x07, 0x16, - 0x86, 0x02, 0x02, 0x00, 0x2C, 0x16, 0x20, 0x88, - 0x0A, 0x07, 0xFA, 0x06, 0x28, 0x13, 0x20, 0xC1, - 0x6A, 0x09, 0x44, 0x01, 0x00, 0x08, 0x06, 0x13, - 0x86, 0x02, 0x02, 0x00, 0x20, 0x16, 0x44, 0x01, - 0x80, 0x00, 0x1D, 0x16, 0x00, 0x07, 0xE0, 0x23, - 0x14, 0xE0, 0x19, 0x16, 0x82, 0x02, 0x43, 0x00, - 0x16, 0x13, 0x00, 0x02, 0x02, 0xFC, 0x40, 0xC0, - 0xB0, 0x01, 0x20, 0x00, 0x60, 0x01, 0x6A, 0x09, - 0x01, 0x00, 0x07, 0x16, 0x60, 0xA0, 0x2C, 0x09, - 0x60, 0xCC, 0xEE, 0x05, 0x50, 0xC4, 0x20, 0xC4, - 0x2C, 0x09, 0x80, 0x07, 0x36, 0x07, 0x81, 0x07, - 0x40, 0x00, 0x40, 0x2C, 0xC0, 0x04, 0x84, 0x07, - 0xF2, 0x06, 0x06, 0xCD, 0x01, 0x02, 0x0E, 0xFC, - 0x31, 0xCD, 0x31, 0xCD, 0x31, 0xCD, 0x20, 0xC5, - 0x0A, 0x07, 0x00, 0xC0, 0x01, 0x13, 0x12, 0x2E, - 0xE0, 0x04, 0x6C, 0x01, 0x5B, 0x04, 0x60, 0x01, - 0x8A, 0x09, 0x00, 0x80, 0x12, 0x13, 0x0B, 0xC8, - 0x22, 0x09, 0xA0, 0x06, 0x3E, 0xD7, 0x08, 0x02, - 0x42, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x08, 0x02, - 0x30, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xE0, 0xC2, - 0x22, 0x09, 0x5B, 0x04, 0x20, 0x48, 0xAC, 0xE4, - 0x80, 0x01, 0x20, 0x48, 0x7E, 0xEB, 0x82, 0x01, - 0x20, 0x48, 0x22, 0xE0, 0xAE, 0x01, 0x20, 0x48, - 0x22, 0xE0, 0x78, 0x09, 0x60, 0x43, 0x18, 0xE0, - 0xA0, 0x43, 0x08, 0xE0, 0x60, 0x01, 0x8A, 0x09, - 0x00, 0x80, 0xEB, 0x13, 0x0B, 0xC3, 0x08, 0x02, - 0x42, 0x00, 0xA0, 0x06, 0xDA, 0xD4, 0x5C, 0x04, - 0x0B, 0xC3, 0x20, 0xE8, 0x0E, 0xE0, 0x82, 0x01, - 0x20, 0xE8, 0x22, 0xE0, 0xAE, 0x01, 0x20, 0xE8, - 0x22, 0xE0, 0x78, 0x09, 0xA0, 0xE3, 0x08, 0xE0, - 0x60, 0xE3, 0x18, 0xE0, 0xA0, 0x43, 0x06, 0xE0, - 0x08, 0x02, 0x3C, 0x80, 0xA0, 0x06, 0xDA, 0xD4, - 0x08, 0x02, 0x42, 0x80, 0xA0, 0x06, 0xDA, 0xD4, - 0x5C, 0x04, 0x0B, 0xC3, 0x83, 0x07, 0x00, 0x68, - 0xA0, 0x06, 0x2A, 0xD8, 0x83, 0x07, 0x10, 0x80, - 0xA0, 0x06, 0x2A, 0xD8, 0x5C, 0x04, 0x0B, 0xC3, - 0xA0, 0x06, 0x14, 0xD8, 0x02, 0xA2, 0x68, 0xC2, - 0x14, 0x00, 0x29, 0x02, 0xFC, 0xFF, 0x24, 0x13, - 0x28, 0x02, 0x18, 0x00, 0x87, 0x07, 0x0E, 0x00, - 0x81, 0x07, 0x0E, 0x07, 0xF1, 0x04, 0x47, 0x06, - 0xFD, 0x15, 0x58, 0xC0, 0xB0, 0x03, 0x01, 0x78, - 0x63, 0x06, 0x41, 0x02, 0x3F, 0x00, 0x0E, 0x13, - 0x81, 0x02, 0x1F, 0x00, 0x0B, 0x1B, 0x41, 0xA0, - 0x61, 0xC0, 0x86, 0xE4, 0xF8, 0xC1, 0xC7, 0x06, - 0xC7, 0x71, 0x47, 0x06, 0x78, 0xCC, 0x47, 0x06, - 0xFD, 0x15, 0x04, 0x10, 0x58, 0xC0, 0xC1, 0x06, - 0x41, 0x70, 0x01, 0xA2, 0x49, 0xC2, 0xE5, 0x15, - 0x5C, 0x04, 0xA0, 0x23, 0x1A, 0xE0, 0x02, 0x13, - 0xC8, 0x04, 0x5B, 0x04, 0x22, 0xC2, 0x14, 0x00, - 0x48, 0x02, 0x00, 0x1F, 0xC8, 0x06, 0x5B, 0x04, - 0x83, 0x02, 0x0F, 0x00, 0x17, 0x1B, 0xA0, 0xC1, - 0xD4, 0x06, 0x35, 0x13, 0x26, 0x02, 0x04, 0x00, - 0xA0, 0xCD, 0xCE, 0xED, 0x83, 0xC5, 0x04, 0x13, - 0x4A, 0xC2, 0x39, 0x0A, 0xC9, 0xE0, 0x83, 0xC5, - 0x86, 0x07, 0x36, 0x07, 0x87, 0x07, 0x10, 0x00, - 0x20, 0xC2, 0xD4, 0x06, 0xE0, 0x04, 0xD4, 0x06, - 0x46, 0x2C, 0x5B, 0x04, 0x60, 0xC0, 0xFE, 0x06, - 0x20, 0xC2, 0x6A, 0x09, 0x48, 0x02, 0x00, 0x60, - 0x20, 0x22, 0x06, 0xE0, 0x04, 0x16, 0x20, 0xE2, - 0x0A, 0xE0, 0x20, 0xE2, 0x18, 0xE0, 0x13, 0x0A, - 0x04, 0x18, 0x41, 0x05, 0x03, 0x48, 0xFE, 0x06, - 0x06, 0x10, 0x83, 0x02, 0x02, 0x00, 0x01, 0x16, - 0x13, 0x09, 0x03, 0xE8, 0xFE, 0x06, 0xC8, 0x40, - 0xC1, 0x40, 0x05, 0x13, 0x88, 0x07, 0x36, 0x07, - 0x89, 0x07, 0x00, 0x40, 0x48, 0x2C, 0x5B, 0x04, - 0xC9, 0x04, 0x24, 0xC1, 0x94, 0xEB, 0x84, 0xC1, - 0x86, 0x71, 0x86, 0xA1, 0x26, 0x02, 0x56, 0xEC, - 0xC4, 0x06, 0x04, 0x71, 0x24, 0x02, 0xC2, 0xEB, - 0x14, 0xD2, 0xC8, 0x09, 0x08, 0xA2, 0xB0, 0x03, - 0x34, 0xD8, 0x5F, 0x06, 0x47, 0x02, 0x0F, 0x00, - 0xC7, 0xA1, 0x28, 0xC2, 0x82, 0xEB, 0x58, 0x04, - 0x76, 0xCD, 0x47, 0x06, 0xFD, 0x16, 0x32, 0x10, - 0x36, 0xC2, 0x26, 0x10, 0x17, 0x09, 0x47, 0xA1, - 0x2D, 0x10, 0x17, 0x09, 0x47, 0x61, 0x2A, 0x10, - 0xA0, 0x43, 0x16, 0xE0, 0x5B, 0x04, 0xA0, 0x43, - 0x16, 0xE0, 0x49, 0xC2, 0x03, 0x16, 0x44, 0xC2, - 0x06, 0xC8, 0x22, 0x09, 0x27, 0xC1, 0x8E, 0xED, - 0x84, 0xC1, 0x86, 0x71, 0x26, 0x02, 0xC4, 0xED, - 0xC4, 0x06, 0x04, 0x71, 0x24, 0x02, 0xAA, 0xED, - 0xD3, 0x10, 0x09, 0xC1, 0xA0, 0xC1, 0x22, 0x09, - 0xC9, 0x04, 0x10, 0x10, 0x36, 0xC2, 0x78, 0xD5, - 0x60, 0x41, 0x22, 0xE0, 0xC5, 0x05, 0x0A, 0x10, - 0x78, 0xCD, 0x47, 0x06, 0xFD, 0x15, 0x06, 0x10, - 0xA0, 0x23, 0x16, 0xE0, 0xCD, 0x16, 0x49, 0xC2, - 0xEC, 0x16, 0xD6, 0x10, 0xA0, 0xE3, 0x16, 0xE0, - 0xBB, 0x10, 0x08, 0x02, 0x5A, 0x80, 0xA0, 0x06, - 0xDA, 0xD4, 0x44, 0x10, 0xA0, 0x92, 0x0C, 0xE0, - 0x15, 0x16, 0x44, 0x02, 0x00, 0x5E, 0x14, 0x16, - 0x20, 0x48, 0xAC, 0xE4, 0x80, 0x01, 0xA0, 0x06, - 0x72, 0xD7, 0x20, 0xC8, 0x9E, 0x01, 0x9E, 0x01, - 0xE0, 0x2E, 0x01, 0x00, 0xA0, 0x43, 0x18, 0xE0, - 0xA0, 0xD2, 0x26, 0xE0, 0x83, 0x07, 0x10, 0x00, - 0xA0, 0x06, 0x2A, 0xD8, 0x60, 0x04, 0xD2, 0xCE, - 0x84, 0x07, 0x08, 0x00, 0x60, 0x04, 0x94, 0xCE, - 0x85, 0x07, 0x03, 0x02, 0x05, 0xC8, 0xCE, 0x06, - 0xA0, 0x43, 0x12, 0xE0, 0xE0, 0x04, 0xFA, 0x06, - 0xA0, 0x06, 0xA4, 0xD7, 0x08, 0x02, 0x48, 0x80, - 0xA0, 0x06, 0xDA, 0xD4, 0x17, 0x10, 0x60, 0x01, - 0x8E, 0x09, 0x00, 0x80, 0x02, 0x16, 0x60, 0x04, - 0x9C, 0xD4, 0xA0, 0x27, 0x2C, 0xE0, 0x04, 0x16, - 0x08, 0x02, 0x54, 0x80, 0xA0, 0x06, 0xDA, 0xD4, - 0x83, 0x07, 0x00, 0xA8, 0x20, 0x88, 0x08, 0x07, - 0x20, 0xE0, 0x02, 0x16, 0x83, 0x07, 0x00, 0xE8, - 0xA0, 0x06, 0x2A, 0xD8, 0x08, 0x02, 0x36, 0x00, - 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xE8, 0x0C, 0xE0, - 0x82, 0x01, 0xA0, 0x23, 0x18, 0xE0, 0x06, 0x13, - 0xA0, 0xE3, 0x18, 0xE0, 0xE0, 0x2E, 0x00, 0x00, - 0x41, 0xC0, 0xFA, 0x16, 0xA0, 0x06, 0xE6, 0xD5, - 0x82, 0xC0, 0x02, 0x13, 0x4F, 0x02, 0x80, 0xFF, - 0xC4, 0x04, 0x0F, 0xD1, 0xC4, 0x06, 0x60, 0x04, - 0x94, 0xCE, 0xA0, 0x06, 0x32, 0xDA, 0x08, 0x02, - 0x36, 0x80, 0xA0, 0x07, 0xD6, 0x06, 0x20, 0xDA, - 0xA0, 0x06, 0xDA, 0xD4, 0x10, 0x10, 0xA0, 0x06, - 0x32, 0xDA, 0x20, 0xD1, 0xCE, 0x06, 0xE6, 0x13, - 0x20, 0x78, 0x12, 0xE0, 0xCE, 0x06, 0xE2, 0x10, - 0x20, 0xC1, 0x16, 0x04, 0x14, 0x0A, 0xC4, 0x06, - 0x0A, 0x91, 0x01, 0x16, 0x5B, 0x04, 0x60, 0x04, - 0xD2, 0xCE, 0xB0, 0x03, 0x20, 0x98, 0xAB, 0xE3, - 0x65, 0x06, 0x02, 0x13, 0x60, 0x04, 0xBA, 0xCE, - 0x60, 0xC1, 0x94, 0x09, 0x02, 0x13, 0x60, 0x04, - 0x22, 0xDE, 0x60, 0xD1, 0x0E, 0xE0, 0x3D, 0x10, - 0x85, 0x07, 0xBE, 0xEA, 0x35, 0xC8, 0x8A, 0x09, - 0x15, 0xC8, 0x8C, 0x09, 0x0B, 0x10, 0xE0, 0x04, - 0xA0, 0x09, 0x20, 0xD8, 0x2E, 0x09, 0xA6, 0x09, - 0x20, 0xC8, 0xA8, 0x09, 0x8A, 0x09, 0x20, 0xC8, - 0xAA, 0x09, 0x8C, 0x09, 0xE0, 0x04, 0x8E, 0x09, - 0xCA, 0x04, 0xCD, 0x04, 0xCE, 0x04, 0xCF, 0x04, - 0xE0, 0x04, 0xA8, 0x06, 0xE0, 0x04, 0xBA, 0x06, - 0x84, 0x07, 0xA0, 0x01, 0x85, 0x07, 0x10, 0x00, - 0xF4, 0x04, 0x45, 0x06, 0xFD, 0x15, 0x84, 0x07, - 0xD8, 0x06, 0x85, 0x07, 0x34, 0x07, 0x44, 0x61, - 0xF4, 0x04, 0x45, 0x06, 0xFD, 0x15, 0x84, 0x07, - 0xC8, 0x00, 0x04, 0xC8, 0x00, 0x07, 0x84, 0x07, - 0xFF, 0x7F, 0x04, 0xC8, 0xF0, 0x06, 0x84, 0x07, - 0x06, 0x00, 0x04, 0xC8, 0xEE, 0x06, 0x85, 0x07, - 0x02, 0x0C, 0x20, 0xC1, 0x8A, 0x09, 0x01, 0x11, - 0xC5, 0x06, 0xB0, 0x03, 0x05, 0xD8, 0x65, 0x06, - 0x60, 0x04, 0xD2, 0xCE, 0xB0, 0x03, 0x20, 0x98, - 0xAA, 0xE3, 0x65, 0x06, 0x79, 0x16, 0x60, 0xD1, - 0x10, 0xE0, 0xF3, 0x10, 0x60, 0xD1, 0xAB, 0xE3, - 0xA0, 0x01, 0x8E, 0x09, 0x00, 0x02, 0xE0, 0x01, - 0x80, 0x01, 0x00, 0x20, 0xC8, 0x04, 0x20, 0xD2, - 0x80, 0x01, 0x08, 0xC8, 0x9C, 0x09, 0x08, 0xD8, - 0x2E, 0x09, 0xE3, 0x10, 0x20, 0xF8, 0x19, 0xEE, - 0x82, 0x01, 0x20, 0xC8, 0x10, 0xE0, 0xC6, 0x06, - 0x20, 0xC8, 0x20, 0xE0, 0xC8, 0x06, 0x20, 0xC8, - 0xC2, 0xEA, 0x90, 0x09, 0xE0, 0x2E, 0x00, 0x00, - 0xA0, 0x06, 0xE6, 0xD5, 0x20, 0xC8, 0x6C, 0x09, - 0xA0, 0x01, 0x20, 0xC8, 0x6E, 0x09, 0xA2, 0x01, - 0x20, 0xC8, 0x70, 0x09, 0xA4, 0x01, 0x20, 0xC8, - 0x6E, 0x09, 0xB0, 0x01, 0x20, 0xC8, 0x70, 0x09, - 0xB2, 0x01, 0x20, 0xC8, 0x70, 0x09, 0xCC, 0x06, - 0x20, 0xF8, 0x18, 0xEE, 0x80, 0x01, 0xB0, 0x03, - 0xA0, 0x01, 0x8E, 0x09, 0x00, 0x02, 0x20, 0x98, - 0xAA, 0xE3, 0x65, 0x06, 0x3A, 0x13, 0xE0, 0x01, - 0x8E, 0x09, 0x00, 0x02, 0x88, 0x07, 0x56, 0xDF, - 0xE0, 0xC2, 0x8A, 0x09, 0x05, 0x11, 0xA0, 0x01, - 0x8E, 0x09, 0x00, 0x02, 0x88, 0x07, 0x9A, 0xDF, - 0x98, 0x06, 0x08, 0x02, 0x12, 0x80, 0xA0, 0x06, - 0xDA, 0xD4, 0x84, 0x07, 0x0A, 0x00, 0x85, 0x07, - 0xF4, 0x03, 0x20, 0x88, 0xC6, 0x06, 0x20, 0xE0, - 0x08, 0x1B, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, - 0xA5, 0x13, 0x84, 0x07, 0x1C, 0x00, 0x85, 0x07, - 0xF8, 0x03, 0xA0, 0x06, 0xA2, 0xD8, 0x85, 0x07, - 0x42, 0xDC, 0x05, 0xC8, 0xF8, 0x03, 0x20, 0xC8, - 0xA0, 0x09, 0xA0, 0x09, 0x6C, 0x16, 0x20, 0xE8, - 0x9C, 0x09, 0xFE, 0x03, 0x20, 0xE8, 0x9E, 0x09, - 0x06, 0x04, 0xA0, 0x23, 0x0C, 0xE0, 0x32, 0x13, - 0xA0, 0xE3, 0x0C, 0xE0, 0xA0, 0x2E, 0xF4, 0x03, - 0x2D, 0x10, 0xA0, 0x06, 0x56, 0xDF, 0x60, 0x01, - 0x8E, 0x09, 0x00, 0x40, 0x08, 0x13, 0x08, 0x02, - 0x6C, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x22, 0x10, - 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x40, 0x08, 0x02, - 0x60, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x84, 0x07, - 0x2A, 0x00, 0x85, 0x07, 0xF4, 0x03, 0xA0, 0x06, - 0xA2, 0xD8, 0xD5, 0x10, 0xB0, 0x03, 0x20, 0x98, - 0xAA, 0xE3, 0x65, 0x06, 0x0F, 0x16, 0x20, 0x06, - 0x90, 0x09, 0x9A, 0x16, 0x60, 0x01, 0x8A, 0x09, - 0x00, 0x40, 0x39, 0x13, 0xE0, 0x04, 0x8A, 0x09, - 0xE0, 0x04, 0x8C, 0x09, 0xE0, 0x04, 0x8E, 0x09, - 0x60, 0x04, 0x62, 0xDA, 0x60, 0x04, 0xB0, 0xCE, - 0xB0, 0x03, 0x20, 0x98, 0x10, 0xE0, 0x65, 0x06, - 0xF9, 0x16, 0x44, 0x02, 0x00, 0x5E, 0x04, 0x16, - 0x20, 0x06, 0xC6, 0x06, 0x9A, 0x16, 0x0A, 0x10, - 0xB0, 0x03, 0x20, 0x98, 0x10, 0xE0, 0x65, 0x06, - 0xED, 0x16, 0x20, 0x06, 0xC8, 0x06, 0x02, 0x13, - 0x60, 0x04, 0x5A, 0xDB, 0x60, 0x01, 0x8E, 0x09, - 0x00, 0x01, 0x02, 0x16, 0xCE, 0x01, 0x03, 0x00, - 0x0E, 0x01, 0x03, 0x00, 0x03, 0x13, 0x83, 0x07, - 0x00, 0x82, 0x07, 0x10, 0x83, 0x07, 0x01, 0x00, - 0xE0, 0x04, 0x8E, 0x09, 0x20, 0xE8, 0x0C, 0xE0, - 0x82, 0x01, 0x60, 0x04, 0xCA, 0xCE, 0x60, 0x01, - 0x8A, 0x09, 0x00, 0x40, 0xC7, 0x16, 0x83, 0x07, - 0x0D, 0x00, 0xF2, 0x10, 0xB0, 0x03, 0x20, 0x98, - 0xAA, 0xE3, 0x65, 0x06, 0xC7, 0x16, 0x20, 0x88, - 0x98, 0x09, 0x20, 0xE0, 0xF0, 0x16, 0x22, 0xC8, - 0x0E, 0x00, 0xDC, 0x06, 0x22, 0xC8, 0x10, 0x00, - 0xDE, 0x06, 0x22, 0xC8, 0x12, 0x00, 0xE0, 0x06, - 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x80, 0x08, 0x02, - 0x66, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xB2, 0x10, - 0xA0, 0x07, 0x9A, 0x09, 0x5A, 0x00, 0xA0, 0x07, - 0xA2, 0x09, 0x19, 0x00, 0xA0, 0x07, 0xA4, 0x09, - 0x05, 0x00, 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x20, - 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x04, 0x08, 0x02, - 0x78, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xB0, 0x03, - 0x20, 0x98, 0xAB, 0xE3, 0x65, 0x06, 0x9A, 0x16, - 0x08, 0x02, 0x72, 0x80, 0xA0, 0x06, 0xDA, 0xD4, - 0x20, 0xE8, 0x0C, 0xE0, 0x82, 0x01, 0xA0, 0x06, - 0xD0, 0xD5, 0x20, 0x06, 0x9A, 0x09, 0xBF, 0x13, - 0x84, 0x07, 0x2C, 0x00, 0x85, 0x07, 0xF4, 0x03, - 0xA0, 0x06, 0xA2, 0xD8, 0x60, 0x04, 0xC0, 0xDB, - 0x20, 0x48, 0x0C, 0xE0, 0x82, 0x01, 0x82, 0x10, - 0x0E, 0x01, 0x03, 0x00, 0x0A, 0x13, 0x08, 0x02, - 0x0C, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xE0, 0xE3, - 0x14, 0xE0, 0x20, 0xC8, 0xAE, 0xE4, 0x86, 0x01, - 0x26, 0x10, 0x20, 0x48, 0x0C, 0xE0, 0x82, 0x01, - 0xE0, 0x2E, 0x01, 0x00, 0x60, 0xC1, 0x1E, 0x09, - 0x35, 0x0A, 0x05, 0xE8, 0x82, 0x01, 0x20, 0xC1, - 0x6A, 0x09, 0x04, 0x01, 0x06, 0x00, 0x06, 0x13, - 0x20, 0xD8, 0xD0, 0xE1, 0x2F, 0x09, 0x20, 0xD8, - 0xD0, 0xE1, 0x83, 0x01, 0x20, 0x21, 0x22, 0xE0, - 0x03, 0x16, 0x20, 0xE8, 0x22, 0xE0, 0x80, 0x01, - 0x20, 0x21, 0x04, 0xE0, 0x04, 0x16, 0xA0, 0xE3, - 0x14, 0xE0, 0x60, 0x04, 0x0A, 0xD3, 0x08, 0x02, - 0x00, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xE8, - 0x08, 0xE0, 0x82, 0x01, 0xE0, 0xC2, 0x8A, 0x09, - 0x02, 0x11, 0x60, 0x04, 0xB0, 0xCE, 0xA0, 0x01, - 0x8E, 0x09, 0x00, 0x04, 0x6B, 0x10, 0x20, 0xC8, - 0xAE, 0xE4, 0x86, 0x01, 0x08, 0x02, 0x00, 0x80, - 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xC2, 0x1E, 0x09, - 0x08, 0xA2, 0x08, 0x05, 0x28, 0xC8, 0x22, 0xE0, - 0xCA, 0x06, 0x20, 0xC8, 0x20, 0xE0, 0xC6, 0x06, - 0x20, 0xC8, 0x20, 0xE0, 0xC8, 0x06, 0x60, 0xE3, - 0x16, 0xE0, 0x60, 0x04, 0xD2, 0xCE, 0x44, 0xC1, - 0x44, 0x02, 0x00, 0x5E, 0xF8, 0x16, 0x60, 0x25, - 0xA8, 0xE4, 0x0F, 0x16, 0x20, 0x06, 0xC6, 0x06, - 0xF2, 0x16, 0x20, 0x06, 0xCA, 0x06, 0x03, 0x13, - 0xA0, 0x05, 0xCC, 0x06, 0xE6, 0x10, 0xB0, 0x03, - 0x20, 0xD8, 0x0C, 0xE0, 0x65, 0x06, 0x60, 0x04, - 0xD2, 0xCE, 0x20, 0x06, 0xC8, 0x06, 0xE3, 0x16, - 0x20, 0x88, 0x70, 0x09, 0xCC, 0x06, 0x03, 0x16, - 0x83, 0x07, 0x08, 0x00, 0x02, 0x10, 0x83, 0x07, - 0x0C, 0x00, 0x60, 0x04, 0x8A, 0xDC, 0x60, 0x04, - 0xD2, 0xCE, 0xA0, 0x23, 0x08, 0xE0, 0x03, 0x13, - 0x60, 0x23, 0x12, 0xE0, 0x06, 0x16, 0xB0, 0x03, - 0x20, 0xD8, 0xA9, 0xE3, 0x65, 0x06, 0x60, 0x04, - 0xD2, 0xCE, 0x08, 0x02, 0x00, 0x80, 0xA0, 0x06, - 0xDA, 0xD4, 0x60, 0x04, 0xB0, 0xCE, 0x08, 0x02, - 0x00, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xC8, - 0x1E, 0xE0, 0xC6, 0x06, 0x20, 0xC8, 0x1E, 0xE0, - 0xC8, 0x06, 0x60, 0xE3, 0x10, 0xE0, 0x60, 0x04, - 0xD2, 0xCE, 0xE0, 0x23, 0x14, 0xE0, 0x30, 0x13, - 0x44, 0xC1, 0x44, 0x02, 0x00, 0x1E, 0xF5, 0x16, - 0x60, 0x25, 0xA8, 0xE4, 0x1D, 0x16, 0x20, 0x06, - 0xC8, 0x06, 0xEF, 0x16, 0x60, 0x01, 0x8E, 0x09, - 0x00, 0x80, 0x13, 0x16, 0x60, 0x01, 0x8E, 0x09, - 0x00, 0x01, 0x0C, 0x16, 0xA0, 0x01, 0x8E, 0x09, - 0x00, 0x01, 0xA0, 0x01, 0x8E, 0x09, 0x80, 0x00, - 0xA0, 0x43, 0x04, 0xE0, 0x83, 0x07, 0x18, 0x68, - 0xA0, 0x06, 0x2A, 0xD8, 0x20, 0xC8, 0xAE, 0xE4, - 0x86, 0x01, 0xC2, 0x04, 0x60, 0x04, 0x2C, 0xE4, - 0x08, 0x02, 0x1E, 0x80, 0xA0, 0x06, 0xDA, 0xD4, - 0x07, 0x10, 0x20, 0x06, 0xC6, 0x06, 0xCD, 0x16, - 0x83, 0x07, 0x09, 0x00, 0xA0, 0x06, 0x8A, 0xDC, - 0x60, 0x04, 0xB0, 0xCE, 0xCE, 0x04, 0xE0, 0x04, - 0x2A, 0x09, 0xE0, 0xD3, 0xAA, 0xE3, 0x8F, 0xC2, - 0x20, 0xC8, 0xB0, 0xE4, 0x86, 0x01, 0x20, 0x48, - 0x08, 0xE0, 0x82, 0x01, 0x86, 0x07, 0x05, 0x00, - 0x84, 0x07, 0x72, 0x06, 0x54, 0xC1, 0x01, 0x13, - 0xD4, 0x2C, 0x24, 0x02, 0x0A, 0x00, 0x06, 0x06, - 0xF9, 0x16, 0x08, 0x02, 0x2A, 0x80, 0xA0, 0x06, - 0xDA, 0xD4, 0x20, 0x2C, 0x1A, 0xE0, 0x60, 0x04, - 0x50, 0xCD, 0xA0, 0x06, 0x3E, 0xD7, 0xCD, 0x04, - 0xA0, 0x23, 0x1C, 0xE0, 0x0D, 0x13, 0x0E, 0x01, - 0x03, 0x00, 0x0A, 0x13, 0xA0, 0xE3, 0x1C, 0xE0, - 0xB0, 0x03, 0x20, 0xD8, 0x10, 0xE0, 0x65, 0x06, - 0xA0, 0xD2, 0x26, 0xE0, 0xCF, 0x04, 0x08, 0x10, - 0x20, 0x2D, 0x01, 0x00, 0xE0, 0xC0, 0x2A, 0x09, - 0xA0, 0x06, 0x2A, 0xD8, 0xA0, 0xD2, 0xAB, 0xE3, - 0x60, 0x04, 0xD2, 0xCE, 0xA0, 0x01, 0x80, 0x01, - 0x00, 0x01, 0xE0, 0x01, 0x80, 0x01, 0x00, 0xAC, - 0xA0, 0x01, 0x82, 0x01, 0x00, 0x03, 0xE0, 0x01, - 0x82, 0x01, 0x00, 0x08, 0x88, 0x07, 0xAE, 0x01, - 0x08, 0x06, 0xFE, 0x16, 0x60, 0x01, 0x8E, 0x09, - 0x00, 0x02, 0x03, 0x16, 0xA0, 0x01, 0x80, 0x01, - 0x00, 0x20, 0xC8, 0x04, 0x20, 0xD2, 0x80, 0x01, - 0x08, 0xC8, 0x9C, 0x09, 0x08, 0xD8, 0x2E, 0x09, - 0xA0, 0x07, 0x9E, 0x09, 0x00, 0x10, 0x5B, 0x04, - 0x20, 0xD8, 0xA6, 0x09, 0x2E, 0x09, 0xE0, 0x01, - 0x80, 0x01, 0x00, 0x04, 0xE0, 0x01, 0x82, 0x01, - 0x00, 0x08, 0xA0, 0x01, 0x82, 0x01, 0x00, 0x03, - 0x20, 0xC2, 0x30, 0x09, 0x03, 0x13, 0xE0, 0x01, - 0x82, 0x01, 0x00, 0x03, 0xA0, 0x01, 0x80, 0x01, - 0x00, 0xA1, 0x20, 0xF8, 0x2E, 0x09, 0x80, 0x01, - 0x88, 0x07, 0xAE, 0x01, 0x08, 0x06, 0xFE, 0x16, - 0xA0, 0x01, 0x80, 0x01, 0x00, 0x0C, 0xE0, 0x04, - 0x9E, 0x01, 0xE0, 0x04, 0x9C, 0x09, 0xE0, 0x04, - 0x9E, 0x09, 0x5B, 0x04, 0x20, 0x01, 0xA8, 0x09, - 0x00, 0x80, 0x11, 0x13, 0xE0, 0x93, 0x26, 0xE0, - 0x0E, 0x16, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, - 0x0A, 0x13, 0x08, 0x02, 0x84, 0x80, 0x00, 0x00, - 0x00, 0xE0, 0xDC, 0x0F, 0xA0, 0x06, 0xDA, 0xD4, - 0x20, 0x48, 0x08, 0xE0, 0x82, 0x01, 0x02, 0x10, - 0x60, 0x04, 0x70, 0xDA, 0x60, 0x04, 0xBA, 0xCE, - 0xA0, 0x06, 0x9C, 0xD5, 0x08, 0xC2, 0x19, 0x13, - 0x83, 0x07, 0x80, 0x80, 0xE0, 0x23, 0x14, 0xE0, - 0x02, 0x13, 0x83, 0x07, 0x0A, 0x00, 0x60, 0x04, - 0xC6, 0xCE, 0x20, 0xC1, 0x06, 0x06, 0x0D, 0x13, - 0xA0, 0x06, 0x9C, 0xD5, 0x08, 0xC2, 0x09, 0x13, - 0x83, 0x07, 0x0B, 0x00, 0xE0, 0x23, 0x14, 0xE0, - 0x02, 0x16, 0x83, 0x07, 0x01, 0x80, 0x60, 0x04, - 0xC6, 0xCE, 0x83, 0x07, 0x0A, 0x80, 0x60, 0x04, - 0xB4, 0xCE, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, - 0x06, 0x16, 0xA0, 0x06, 0xA8, 0xE5, 0x47, 0x10, - 0xD0, 0x03, 0x60, 0x04, 0xB0, 0xD3, 0xE0, 0x93, - 0x0E, 0xE0, 0x5E, 0x13, 0xE0, 0x93, 0x10, 0xE0, - 0x17, 0x13, 0xE0, 0x23, 0x14, 0xE0, 0x04, 0x13, - 0x83, 0x07, 0x07, 0x00, 0x60, 0x04, 0xC6, 0xCE, - 0x83, 0x07, 0x00, 0xA0, 0xA0, 0x06, 0x2A, 0xD8, - 0x83, 0x07, 0x00, 0x48, 0xA0, 0x06, 0x2A, 0xD8, - 0xA0, 0xD2, 0x10, 0xE0, 0x20, 0xC8, 0x1C, 0xE0, - 0xCA, 0x06, 0x20, 0xC8, 0x20, 0xE0, 0xCC, 0x06, - 0xA0, 0x06, 0x3E, 0xD7, 0x08, 0x02, 0x4E, 0x80, - 0xA0, 0x06, 0xDA, 0xD4, 0xA0, 0x23, 0x1C, 0xE0, - 0x20, 0x13, 0x20, 0x88, 0x6C, 0x09, 0x0E, 0x07, - 0x1C, 0x16, 0x20, 0x88, 0x6E, 0x09, 0x10, 0x07, - 0x18, 0x16, 0x20, 0x88, 0x70, 0x09, 0x12, 0x07, - 0x14, 0x16, 0x20, 0x88, 0x0A, 0x07, 0x22, 0xE0, - 0x10, 0x13, 0x20, 0x06, 0xCA, 0x06, 0x38, 0x16, - 0xA0, 0xE3, 0x20, 0xE0, 0x06, 0x10, 0xE0, 0x23, - 0x14, 0xE0, 0xCA, 0x16, 0xA0, 0xE3, 0x22, 0xE0, - 0xC2, 0x04, 0xA0, 0xD2, 0xAA, 0xE3, 0x60, 0x04, - 0xBA, 0xCE, 0x20, 0xC8, 0x1C, 0xE0, 0xCA, 0x06, - 0xA0, 0x88, 0xDC, 0x06, 0x0E, 0x00, 0x10, 0x16, - 0xA0, 0x88, 0xDE, 0x06, 0x10, 0x00, 0x0C, 0x16, - 0xA0, 0x88, 0xE0, 0x06, 0x12, 0x00, 0x08, 0x16, - 0x20, 0x06, 0xCC, 0x06, 0x19, 0x16, 0x20, 0xE8, - 0x0E, 0xE0, 0x82, 0x01, 0xA0, 0xE3, 0x1E, 0xE0, - 0x20, 0xC8, 0x20, 0xE0, 0xCC, 0x06, 0x10, 0x10, - 0xA0, 0x23, 0x10, 0xE0, 0x08, 0x16, 0x64, 0xC1, - 0x06, 0x00, 0x60, 0x21, 0x0C, 0xE0, 0x08, 0x13, - 0xA0, 0xD2, 0xA8, 0xE3, 0x05, 0x10, 0x20, 0x88, - 0x0A, 0x07, 0x08, 0x07, 0x96, 0x12, 0x00, 0x10, - 0x60, 0x04, 0xBA, 0xCE, 0x60, 0x01, 0x8E, 0x09, - 0x00, 0x80, 0x06, 0x16, 0x83, 0x07, 0x00, 0x82, - 0xA0, 0x06, 0x2A, 0xD8, 0x60, 0x04, 0xCA, 0xCE, - 0xE0, 0x93, 0x0E, 0xE0, 0x50, 0x13, 0xE0, 0x93, - 0xA9, 0xE3, 0x4D, 0x13, 0xE0, 0x93, 0xA8, 0xE3, - 0x1C, 0x13, 0xA0, 0x06, 0xA4, 0xD7, 0xA0, 0x23, - 0x10, 0xE0, 0x45, 0x13, 0xA0, 0x23, 0x08, 0xE0, - 0x06, 0x16, 0x60, 0xE3, 0x1E, 0xE0, 0x20, 0xC8, - 0x22, 0xE0, 0x06, 0x07, 0x34, 0x10, 0xE0, 0x23, - 0x14, 0xE0, 0x31, 0x16, 0x60, 0xC1, 0x6A, 0x09, - 0x60, 0x21, 0x12, 0xE0, 0x2C, 0x16, 0xA0, 0x06, - 0x0E, 0xE2, 0x31, 0x10, 0xA0, 0xD2, 0xA8, 0xE3, - 0x2E, 0x10, 0xA0, 0xE3, 0x12, 0xE0, 0xA0, 0x06, - 0x0E, 0xE2, 0x64, 0xC1, 0x06, 0x00, 0x60, 0x21, - 0x0C, 0xE0, 0x25, 0x13, 0x20, 0x88, 0x0E, 0x07, - 0xDC, 0x06, 0x14, 0x16, 0x20, 0x88, 0x10, 0x07, - 0xDE, 0x06, 0x10, 0x16, 0x20, 0x88, 0x12, 0x07, - 0xE0, 0x06, 0x0C, 0x16, 0x20, 0x98, 0xCE, 0x06, - 0xCF, 0x06, 0x15, 0x13, 0x20, 0x06, 0xCE, 0x06, - 0x12, 0x16, 0x60, 0xE3, 0x1A, 0xE0, 0xA0, 0xD2, - 0x0C, 0xE0, 0x0D, 0x10, 0x60, 0xE3, 0x1E, 0xE0, - 0x20, 0xC8, 0x32, 0xE0, 0x06, 0x07, 0xA0, 0x06, - 0x3E, 0xD7, 0x08, 0x02, 0x48, 0x80, 0xA0, 0x06, - 0xDA, 0xD4, 0xA0, 0xD2, 0xA9, 0xE3, 0x60, 0x04, - 0xBA, 0xCE, 0x22, 0x88, 0x0E, 0x00, 0x6C, 0x09, - 0xC9, 0x1A, 0x0B, 0x1B, 0x22, 0x88, 0x10, 0x00, - 0x6E, 0x09, 0xC4, 0x1A, 0x06, 0x1B, 0x22, 0x88, - 0x12, 0x00, 0x70, 0x09, 0xBF, 0x1A, 0x01, 0x1B, - 0x5B, 0x04, 0x60, 0xC1, 0x6C, 0x01, 0x85, 0x02, - 0x43, 0x00, 0xE1, 0x13, 0xE0, 0x93, 0xA8, 0xE3, - 0xDE, 0x16, 0xA0, 0xC8, 0x00, 0xEE, 0x02, 0x00, - 0x84, 0x07, 0x0E, 0x00, 0x42, 0xC1, 0xA0, 0xC0, - 0x6C, 0x01, 0x02, 0xC0, 0x25, 0x02, 0x48, 0x00, - 0x81, 0x07, 0x60, 0xE2, 0x83, 0x07, 0x14, 0xAE, - 0x60, 0x04, 0x9E, 0xE5, 0x02, 0x02, 0x00, 0xFC, - 0xCA, 0x10, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, - 0x06, 0x16, 0x83, 0x07, 0x00, 0x82, 0xA0, 0x06, - 0x2A, 0xD8, 0x60, 0x04, 0xCA, 0xCE, 0x20, 0x98, - 0x0E, 0xE0, 0x65, 0x06, 0x03, 0x16, 0x20, 0xD8, - 0xA8, 0xE3, 0x65, 0x06, 0xE0, 0x93, 0xA9, 0xE3, - 0x0D, 0x13, 0xA0, 0x23, 0x08, 0xE0, 0x19, 0x16, - 0xA0, 0x23, 0x10, 0xE0, 0x16, 0x13, 0x60, 0xE3, - 0x1E, 0xE0, 0x20, 0xC8, 0x20, 0xE0, 0x06, 0x07, - 0xA0, 0x06, 0x3E, 0xD7, 0xA0, 0x43, 0x18, 0xE0, - 0xE0, 0x2E, 0x01, 0x00, 0xA0, 0xD2, 0x26, 0xE0, - 0x83, 0x07, 0x10, 0x00, 0xA0, 0x06, 0x2A, 0xD8, - 0xE0, 0x23, 0x14, 0xE0, 0x02, 0x16, 0xA0, 0x06, - 0x18, 0xD7, 0xA0, 0x43, 0x2C, 0xE0, 0x20, 0xC8, - 0x20, 0xE0, 0x24, 0x09, 0x60, 0x04, 0xBA, 0xCE, - 0xA0, 0x06, 0xA8, 0xE5, 0x01, 0x10, 0x03, 0x10, - 0x20, 0x07, 0xA0, 0x09, 0x03, 0x10, 0xA0, 0x07, - 0xA2, 0x09, 0x19, 0x00, 0x60, 0x04, 0xBA, 0xCE, - 0xA0, 0x43, 0x0E, 0xE0, 0xA0, 0xC1, 0x24, 0x09, - 0x02, 0x13, 0x20, 0x06, 0x24, 0x09, 0xE0, 0x23, - 0x14, 0xE0, 0x03, 0x13, 0xA0, 0x23, 0x08, 0xE0, - 0x29, 0x16, 0x20, 0xC2, 0x8A, 0x09, 0xE4, 0x11, - 0x08, 0x02, 0x42, 0x80, 0xA0, 0x06, 0xDA, 0xD4, - 0xA0, 0x23, 0x08, 0xE0, 0x1F, 0x16, 0xA0, 0x23, - 0x10, 0xE0, 0x0A, 0x16, 0x22, 0xC1, 0x02, 0x00, - 0x20, 0x25, 0xA8, 0xE4, 0x23, 0x16, 0x83, 0x07, - 0x20, 0x80, 0xA0, 0x06, 0x2A, 0xD8, 0x12, 0x10, - 0xA0, 0x06, 0x3E, 0xD7, 0xE0, 0x23, 0x14, 0xE0, - 0x02, 0x16, 0xA0, 0x06, 0x18, 0xD7, 0x60, 0xE3, - 0x1E, 0xE0, 0x20, 0xC8, 0x20, 0xE0, 0x06, 0x07, - 0xA0, 0x23, 0x08, 0xE0, 0x03, 0x16, 0xA0, 0x23, - 0x06, 0xE0, 0x51, 0x13, 0x20, 0x98, 0x0E, 0xE0, - 0x65, 0x06, 0x03, 0x16, 0x20, 0xD8, 0xA8, 0xE3, - 0x65, 0x06, 0x22, 0xC1, 0x02, 0x00, 0x20, 0x25, - 0xA8, 0xE4, 0x0E, 0x13, 0x83, 0x07, 0x20, 0x00, - 0xA0, 0x06, 0x2A, 0xD8, 0x22, 0xC8, 0x0E, 0x00, - 0xE6, 0x06, 0x22, 0xC8, 0x10, 0x00, 0xE8, 0x06, - 0x22, 0xC8, 0x12, 0x00, 0xEA, 0x06, 0x37, 0x10, - 0x22, 0x88, 0x0E, 0x00, 0xDC, 0x06, 0x08, 0x16, - 0x22, 0x88, 0x10, 0x00, 0xDE, 0x06, 0x04, 0x16, - 0x22, 0x88, 0x12, 0x00, 0xE0, 0x06, 0x0B, 0x13, - 0x22, 0xC8, 0x0E, 0x00, 0xDC, 0x06, 0x22, 0xC8, - 0x10, 0x00, 0xDE, 0x06, 0x22, 0xC8, 0x12, 0x00, - 0xE0, 0x06, 0x60, 0xE3, 0x14, 0xE0, 0xA0, 0x23, - 0x0E, 0xE0, 0x08, 0x16, 0xA0, 0xC1, 0x24, 0x09, - 0x1A, 0x16, 0x86, 0x07, 0x00, 0x10, 0x06, 0xE8, - 0xD2, 0x06, 0x15, 0x10, 0xA0, 0xE3, 0x0E, 0xE0, - 0xA0, 0x23, 0x08, 0xE0, 0x09, 0x16, 0xA0, 0xE3, - 0x06, 0xE0, 0xE0, 0x04, 0xE6, 0x06, 0xE0, 0x04, - 0xE8, 0x06, 0xE0, 0x04, 0xEA, 0x06, 0x07, 0x10, - 0x08, 0x02, 0x36, 0x80, 0xA0, 0x07, 0xD6, 0x06, - 0x36, 0xD3, 0xA0, 0x06, 0xDA, 0xD4, 0x60, 0x04, - 0xBA, 0xCE, 0x20, 0x98, 0x65, 0x06, 0x10, 0xE0, - 0x03, 0x16, 0x20, 0xD8, 0x0E, 0xE0, 0x65, 0x06, - 0x60, 0x04, 0xBA, 0xCE, 0xE0, 0x23, 0x14, 0xE0, - 0x02, 0x13, 0x60, 0x04, 0xBA, 0xCE, 0x2E, 0x10, - 0xB0, 0x03, 0x20, 0x98, 0xA9, 0xE3, 0x6F, 0x06, - 0x19, 0x16, 0x24, 0xC2, 0x08, 0x00, 0x16, 0x11, - 0xE0, 0xE3, 0x14, 0xE0, 0x83, 0x07, 0x00, 0x00, - 0xA0, 0x06, 0x2A, 0xD8, 0xA0, 0x23, 0x14, 0xE0, - 0x04, 0x13, 0x08, 0x02, 0x06, 0x80, 0xA0, 0x06, - 0xDA, 0xD4, 0x08, 0x02, 0x1E, 0x00, 0xA0, 0x06, - 0xDA, 0xD4, 0xA0, 0x23, 0x08, 0xE0, 0x02, 0x13, - 0xA0, 0x06, 0x18, 0xD7, 0x82, 0xC0, 0x02, 0x16, - 0x60, 0x04, 0xD2, 0xCE, 0x20, 0xE8, 0x1C, 0xEE, - 0xF0, 0x06, 0x20, 0x99, 0x0E, 0xE0, 0x16, 0x00, - 0x05, 0x16, 0xE0, 0x04, 0xEC, 0x06, 0x20, 0x48, - 0x14, 0xE0, 0xF0, 0x06, 0x83, 0x07, 0x01, 0x00, - 0x60, 0x04, 0xB4, 0xCE, 0x64, 0xC2, 0x14, 0x00, - 0x24, 0x02, 0x18, 0x00, 0xC4, 0xC1, 0xC2, 0x61, - 0x27, 0x02, 0xFC, 0xFF, 0x74, 0xC1, 0x85, 0xC1, - 0x45, 0x71, 0x85, 0x02, 0x27, 0x00, 0x46, 0x16, - 0x54, 0xC1, 0x45, 0x02, 0xCF, 0xFF, 0x42, 0x16, - 0xC8, 0x04, 0x64, 0xC1, 0x08, 0x00, 0x06, 0x15, - 0x05, 0x13, 0x24, 0xC2, 0x0E, 0x00, 0x48, 0x02, - 0x00, 0x1F, 0xC8, 0x06, 0x28, 0x02, 0x11, 0x00, - 0x04, 0xA2, 0x18, 0x98, 0x21, 0xEE, 0x32, 0x16, - 0x42, 0xC1, 0x25, 0x02, 0x04, 0x00, 0x47, 0x65, - 0x35, 0xC2, 0x74, 0xCD, 0x48, 0x06, 0xFD, 0x15, - 0xA0, 0xC0, 0x6C, 0x01, 0x02, 0xC1, 0x04, 0xC8, - 0x6C, 0x01, 0xA0, 0xC1, 0x00, 0xFC, 0x05, 0x13, - 0x20, 0xC8, 0x80, 0xEB, 0x02, 0xFC, 0x06, 0xC1, - 0xF6, 0x10, 0x20, 0xC8, 0x00, 0xEE, 0x02, 0xFC, - 0x02, 0xC8, 0x6C, 0x01, 0x81, 0x07, 0x08, 0xE5, - 0x04, 0xC0, 0x83, 0x07, 0x10, 0x02, 0x84, 0x07, - 0x0E, 0x00, 0x3B, 0x10, 0x84, 0x07, 0x0C, 0x00, - 0xE2, 0xC0, 0x08, 0x00, 0x05, 0x02, 0x00, 0xFC, - 0xA0, 0xC0, 0x6C, 0x01, 0x02, 0xC0, 0x95, 0xC1, - 0x30, 0x13, 0xD5, 0x04, 0x16, 0x2E, 0x02, 0xC8, - 0x6C, 0x01, 0x2B, 0x10, 0xA0, 0xC8, 0x22, 0xEE, - 0x0E, 0x00, 0xA0, 0xC8, 0x24, 0xEE, 0x10, 0x00, - 0xA0, 0xC8, 0x26, 0xEE, 0x12, 0x00, 0x83, 0x07, - 0x06, 0x80, 0x60, 0x04, 0xB4, 0xCE, 0x60, 0x04, - 0xD2, 0xCE, 0x84, 0x07, 0x10, 0x00, 0x85, 0x07, - 0x34, 0x00, 0x09, 0x10, 0x84, 0x07, 0x12, 0x00, - 0x85, 0x07, 0x32, 0x00, 0x04, 0x10, 0x84, 0x07, - 0x14, 0x00, 0x85, 0x07, 0x38, 0x00, 0xA0, 0x06, - 0xC2, 0xD5, 0x85, 0xC8, 0x04, 0x00, 0xA0, 0x06, - 0x10, 0xD6, 0xA0, 0xC8, 0x00, 0xEE, 0x02, 0x00, - 0xA0, 0xC0, 0x6C, 0x01, 0x02, 0xC0, 0x48, 0x06, - 0x48, 0xC1, 0xA0, 0x06, 0xA2, 0xD8, 0x07, 0x02, - 0xA2, 0x06, 0x60, 0xC5, 0x02, 0xFC, 0x25, 0x02, - 0xF4, 0xFF, 0x05, 0xC8, 0x02, 0xFC, 0x20, 0xC2, - 0x6C, 0x01, 0xA0, 0x06, 0xFC, 0xB4, 0x60, 0x04, - 0xB0, 0xCE, 0xA0, 0x06, 0xA2, 0xD8, 0x07, 0x02, - 0xB4, 0x06, 0xEF, 0x10, 0x22, 0x88, 0x12, 0x00, - 0x70, 0x09, 0x08, 0x16, 0x22, 0x88, 0x10, 0x00, - 0x6E, 0x09, 0x04, 0x16, 0x22, 0x88, 0x0E, 0x00, - 0x6C, 0x09, 0x0E, 0x13, 0x22, 0x88, 0x12, 0x00, - 0xE0, 0x06, 0x08, 0x16, 0x22, 0x88, 0x10, 0x00, - 0xDE, 0x06, 0x04, 0x16, 0x22, 0x88, 0x0E, 0x00, - 0xDC, 0x06, 0x01, 0x13, 0xCB, 0x05, 0xCB, 0x05, - 0x5B, 0x04, 0x0B, 0xC3, 0x00, 0x03, 0x02, 0x00, - 0x82, 0x07, 0xC0, 0x00, 0x20, 0xC8, 0x0C, 0x00, - 0xC0, 0x00, 0x20, 0xC8, 0x0E, 0x00, 0xC2, 0x00, - 0x20, 0xC8, 0x10, 0x00, 0xC4, 0x00, 0x20, 0xC8, - 0x12, 0x00, 0xC6, 0x00, 0x20, 0xC8, 0x14, 0x00, - 0xC8, 0x00, 0x20, 0xC8, 0x16, 0x00, 0xCA, 0x00, - 0x20, 0xC8, 0x04, 0x00, 0xCC, 0x00, 0x20, 0xC8, - 0x06, 0x00, 0xCE, 0x00, 0x02, 0xC8, 0x0C, 0x00, - 0xA0, 0x07, 0x0E, 0x00, 0x7E, 0xE6, 0x02, 0xC8, - 0x10, 0x00, 0xA0, 0x07, 0x12, 0x00, 0x88, 0xE6, - 0x02, 0xC8, 0x14, 0x00, 0xA0, 0x07, 0x16, 0x00, - 0xB8, 0xE6, 0x02, 0xC8, 0x04, 0x00, 0xA0, 0x07, - 0x06, 0x00, 0xCE, 0xE6, 0x60, 0x01, 0x1C, 0x01, - 0x04, 0x00, 0x09, 0x16, 0xE0, 0x01, 0x40, 0x01, - 0x00, 0x08, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, - 0xE0, 0x01, 0x40, 0x01, 0x00, 0x04, 0xA0, 0x06, - 0x8E, 0xE9, 0x05, 0x02, 0x00, 0x80, 0x05, 0xD8, - 0x80, 0x04, 0xC7, 0x04, 0x00, 0x03, 0x0F, 0x00, - 0x88, 0x07, 0x00, 0x10, 0x09, 0x02, 0x00, 0x20, - 0x8A, 0x07, 0xE6, 0xE6, 0x03, 0x02, 0x3E, 0xE6, - 0x5A, 0x04, 0x00, 0x03, 0x00, 0x00, 0x20, 0xD2, - 0x87, 0x01, 0x06, 0x10, 0x00, 0x03, 0x00, 0x00, - 0x20, 0xC2, 0x8A, 0x01, 0x08, 0x02, 0x00, 0x1A, - 0x60, 0xC2, 0xAE, 0x00, 0x48, 0xDA, 0x80, 0x04, - 0x89, 0x05, 0x89, 0x02, 0x06, 0x00, 0x07, 0x15, - 0x88, 0x07, 0x00, 0x80, 0x48, 0xDA, 0x80, 0x04, - 0x09, 0xC8, 0xAE, 0x00, 0x80, 0x03, 0xE0, 0x02, - 0xA0, 0x00, 0x5C, 0x04, 0x00, 0x03, 0x00, 0x00, - 0x60, 0x01, 0x9C, 0x01, 0x20, 0x00, 0xE2, 0x13, - 0x20, 0xC2, 0x8C, 0x01, 0x08, 0x02, 0x00, 0x1C, - 0xE3, 0x10, 0x00, 0x03, 0x00, 0x00, 0x60, 0x01, - 0x40, 0x01, 0x00, 0x40, 0xEC, 0x16, 0xA0, 0x01, - 0x40, 0x01, 0x00, 0x40, 0x08, 0x02, 0x00, 0x02, - 0xD7, 0x10, 0xB3, 0xC0, 0x92, 0x06, 0xFD, 0x10, - 0xB3, 0xC0, 0x48, 0xC0, 0x72, 0xCC, 0x72, 0xCC, - 0x32, 0xC1, 0x44, 0xCC, 0x72, 0xDC, 0x04, 0x06, - 0xFD, 0x16, 0x5B, 0x04, 0x48, 0xC0, 0x02, 0x02, - 0xD0, 0xE9, 0x84, 0x07, 0x06, 0x00, 0xF6, 0x10, - 0x02, 0x02, 0x1E, 0xE6, 0x49, 0xC0, 0x84, 0x07, - 0x06, 0x00, 0xF0, 0x10, 0xB3, 0xC0, 0x32, 0xC1, - 0x01, 0x02, 0x01, 0x00, 0x44, 0xD0, 0xC1, 0x06, - 0x44, 0x02, 0xFF, 0x00, 0xE7, 0x10, 0x33, 0xC1, - 0x73, 0xC0, 0x44, 0xD1, 0x44, 0x02, 0xFF, 0x00, - 0x45, 0xDC, 0x04, 0x06, 0xFD, 0x16, 0x5A, 0x04, - 0xA0, 0x06, 0x0E, 0xE9, 0x33, 0xC8, 0x9E, 0x01, - 0x5A, 0x04, 0xA0, 0x06, 0x0C, 0xE7, 0x89, 0xC1, - 0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, - 0x8A, 0x01, 0x88, 0xC1, 0xA6, 0x09, 0x66, 0x02, - 0x40, 0x00, 0x06, 0xC8, 0x8C, 0x01, 0xC2, 0x04, - 0xC7, 0xC1, 0x03, 0x16, 0x02, 0x06, 0xFC, 0x16, - 0x4D, 0x10, 0x5A, 0x04, 0xA0, 0x06, 0x58, 0xE8, - 0x89, 0xC1, 0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, - 0x06, 0xC8, 0x8A, 0x01, 0x88, 0xC1, 0xA6, 0x09, - 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, 0x8C, 0x01, - 0x33, 0xC8, 0x9E, 0x01, 0xE8, 0x10, 0x33, 0x8A, - 0x02, 0x00, 0x38, 0x16, 0x73, 0x8A, 0x02, 0x00, - 0x35, 0x16, 0x5A, 0x04, 0x20, 0x8A, 0xCA, 0xE9, - 0x02, 0x00, 0x30, 0x16, 0x60, 0x8A, 0xCE, 0xE9, - 0x02, 0x00, 0x2C, 0x16, 0x82, 0x07, 0x74, 0xEA, - 0x01, 0x10, 0xB3, 0xC0, 0x04, 0x02, 0x80, 0x04, - 0x52, 0xD1, 0x03, 0x13, 0x32, 0x9D, 0x22, 0x16, - 0xFB, 0x10, 0x85, 0x07, 0x00, 0x80, 0x05, 0xD8, - 0x80, 0x04, 0xC7, 0x04, 0x5A, 0x04, 0x20, 0xC8, - 0xC0, 0x00, 0x0C, 0x00, 0x20, 0xC8, 0xC2, 0x00, - 0x0E, 0x00, 0x20, 0xC8, 0xC4, 0x00, 0x10, 0x00, - 0x20, 0xC8, 0xC6, 0x00, 0x12, 0x00, 0x20, 0xC8, - 0xC8, 0x00, 0x14, 0x00, 0x20, 0xC8, 0xCA, 0x00, - 0x16, 0x00, 0x20, 0xC8, 0xCC, 0x00, 0x04, 0x00, - 0x20, 0xC8, 0xCE, 0x00, 0x06, 0x00, 0x00, 0x03, - 0x0F, 0x00, 0xCC, 0x05, 0x5C, 0x04, 0xE0, 0x04, - 0x82, 0x01, 0x02, 0x02, 0x18, 0xE6, 0x32, 0xC8, - 0x82, 0x01, 0x32, 0xC8, 0x80, 0x01, 0xA0, 0x06, - 0x24, 0xE8, 0x12, 0xC8, 0x82, 0x01, 0xCA, 0xC2, - 0x84, 0x07, 0xD0, 0x07, 0xE0, 0x04, 0x84, 0x01, - 0x04, 0x06, 0xFC, 0x16, 0x20, 0xC1, 0x84, 0x01, - 0xE9, 0x16, 0x04, 0x02, 0x32, 0x00, 0x85, 0x07, - 0x00, 0x80, 0x05, 0xD8, 0x80, 0x04, 0xC7, 0x04, - 0x60, 0xC1, 0x86, 0x01, 0x04, 0x06, 0xFC, 0x16, - 0x20, 0xC1, 0x84, 0x01, 0x5B, 0x04, 0xB3, 0xC0, - 0xB3, 0xC4, 0x5B, 0x04, 0x48, 0xC0, 0xB3, 0xC0, - 0x73, 0xA0, 0x42, 0xC4, 0x5B, 0x04, 0x33, 0x88, - 0x84, 0x01, 0xE6, 0x16, 0x5A, 0x04, 0x89, 0xC1, - 0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, - 0x8A, 0x01, 0x5B, 0x04, 0xC5, 0x04, 0xA0, 0x07, - 0x9C, 0x01, 0x40, 0x00, 0x60, 0x01, 0x9C, 0x01, - 0x40, 0x00, 0x03, 0x13, 0x05, 0x06, 0xF7, 0x16, - 0x5C, 0x04, 0x5B, 0x04, 0xA0, 0x06, 0xAC, 0xE8, - 0x60, 0xC0, 0x40, 0x01, 0x05, 0xC8, 0x40, 0x01, - 0x02, 0xC5, 0x01, 0xC8, 0x40, 0x01, 0x5A, 0x04, - 0xA0, 0x06, 0xAC, 0xE8, 0x08, 0xA1, 0xF4, 0x10, - 0xB3, 0xC0, 0x33, 0xC1, 0x60, 0xC1, 0x40, 0x01, - 0x85, 0x01, 0x00, 0x04, 0xC5, 0x01, 0x00, 0x10, - 0x5B, 0x04, 0x08, 0xC1, 0x09, 0xC2, 0x44, 0xC2, - 0x5B, 0x04, 0x05, 0x02, 0xC8, 0x00, 0x05, 0x06, - 0xFE, 0x16, 0x5B, 0x04, 0x33, 0xC1, 0x03, 0xC0, - 0xC4, 0xC0, 0x5B, 0x04, 0xC0, 0xC0, 0x5B, 0x04, - 0xE0, 0x94, 0x9E, 0x01, 0xC2, 0x16, 0xC3, 0x05, - 0x5B, 0x04, 0x73, 0xC0, 0xA0, 0x06, 0x26, 0xE9, - 0x2D, 0x02, 0x08, 0x00, 0x85, 0x07, 0x08, 0x00, - 0x71, 0x9F, 0xB7, 0x16, 0x05, 0x06, 0xFC, 0x16, - 0x5A, 0x04, 0x02, 0x02, 0x24, 0xE6, 0x60, 0x04, - 0x10, 0xE7, 0xE9, 0x8C, 0x04, 0x00, 0xAD, 0x16, - 0x5B, 0x04, 0x20, 0xC1, 0x80, 0x01, 0x85, 0x07, - 0xD0, 0x07, 0xE0, 0x01, 0x80, 0x01, 0x00, 0x04, - 0x45, 0x06, 0xFE, 0x16, 0x04, 0xC8, 0x80, 0x01, - 0x5B, 0x04, 0x33, 0xC1, 0x48, 0xC3, 0x04, 0xC1, - 0x04, 0x13, 0x2D, 0x02, 0x00, 0x04, 0x04, 0x06, - 0xFC, 0x16, 0x5B, 0x04, 0x8D, 0xC3, 0xA0, 0x06, - 0x26, 0xE9, 0x8D, 0xC1, 0xA6, 0x09, 0x66, 0x02, - 0x40, 0x00, 0x86, 0xC7, 0x5A, 0x04, 0x8D, 0xC1, - 0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, - 0x8A, 0x01, 0x5B, 0x04, 0x8D, 0xC1, 0xA6, 0x09, - 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, 0x8C, 0x01, - 0x5B, 0x04, 0x4D, 0xC0, 0x04, 0x02, 0x28, 0x00, - 0x85, 0x07, 0x00, 0x55, 0x60, 0x04, 0x34, 0xE7, - 0x4D, 0xC0, 0xB3, 0xC0, 0x32, 0xC1, 0x60, 0x04, - 0xF8, 0xE6, 0x33, 0xC1, 0x60, 0x01, 0x1C, 0x01, - 0x04, 0x00, 0x01, 0x16, 0x5B, 0x04, 0xC4, 0xC0, - 0x5B, 0x04, 0x89, 0x07, 0x66, 0xE5, 0x39, 0xC2, - 0x07, 0x13, 0x39, 0xC6, 0x39, 0x86, 0x25, 0x16, - 0x39, 0xC6, 0x39, 0x86, 0x22, 0x16, 0xF7, 0x10, - 0x02, 0x02, 0xAC, 0xE9, 0xC4, 0x04, 0xC5, 0x04, - 0x39, 0xC2, 0x02, 0x13, 0x60, 0x04, 0xE8, 0xE9, - 0x02, 0x02, 0xBA, 0xE9, 0xC4, 0x04, 0x39, 0xC2, - 0x03, 0x13, 0x79, 0xC1, 0x60, 0x04, 0xE8, 0xE9, - 0x02, 0x02, 0xCA, 0xE9, 0xC5, 0x04, 0x39, 0xC2, - 0x03, 0x13, 0x39, 0xC1, 0x60, 0x04, 0xE8, 0xE9, - 0x79, 0xC0, 0xB9, 0xC0, 0x81, 0x60, 0xC2, 0x05, - 0x12, 0x09, 0xF1, 0x04, 0x02, 0x06, 0xFD, 0x16, - 0x5B, 0x04, 0x5C, 0x04, 0x01, 0x02, 0xAA, 0xAA, - 0x01, 0xC6, 0x44, 0xE0, 0x45, 0x40, 0x58, 0x80, - 0xF8, 0x16, 0x01, 0x02, 0x14, 0x00, 0x01, 0x06, - 0xFE, 0x16, 0x01, 0x02, 0x55, 0x55, 0x01, 0xC6, - 0x44, 0xE0, 0x45, 0x40, 0x58, 0x80, 0xED, 0x16, - 0x52, 0x04, 0xE0, 0x02, 0xA0, 0x00, 0x88, 0x07, - 0xC0, 0x00, 0x09, 0x02, 0x62, 0xEA, 0x84, 0x07, - 0x2A, 0xE6, 0x05, 0x02, 0x01, 0x00, 0x8B, 0xC2, - 0xCC, 0x04, 0xA0, 0x06, 0x6C, 0xEA, 0x60, 0x2C, - 0x01, 0x00, 0x99, 0x06, 0xA0, 0x2C, 0x02, 0x00, - 0x99, 0x06, 0x20, 0x2D, 0x04, 0x00, 0x99, 0x06, - 0x20, 0x2E, 0x08, 0x00, 0x99, 0x06, 0xA0, 0x2F, - 0x10, 0x00, 0x8C, 0x05, 0x09, 0x16, 0x80, 0xCC, - 0x81, 0xC4, 0x83, 0x07, 0xB0, 0xEA, 0x88, 0xC0, - 0x02, 0x04, 0x8C, 0x05, 0x01, 0x16, 0x33, 0x10, - 0xE0, 0x02, 0xA0, 0x00, 0x5A, 0x04, 0x8C, 0x05, - 0xFB, 0x16, 0x80, 0xCC, 0x81, 0xC4, 0x15, 0x0A, - 0xB4, 0xC0, 0x12, 0xC0, 0x88, 0xCC, 0x52, 0xC0, - 0xB4, 0xC4, 0x42, 0x06, 0x5B, 0x04, 0x2D, 0x07, - 0x18, 0x00, 0x41, 0x8B, 0x0A, 0x00, 0xEC, 0x16, - 0xC1, 0x82, 0xEA, 0x16, 0xC2, 0x02, 0x42, 0x02, - 0x00, 0x02, 0xE6, 0x16, 0x80, 0x03, 0x81, 0x07, - 0x01, 0x00, 0xF1, 0x10, 0x01, 0x02, 0x02, 0x00, - 0xEE, 0x10, 0x01, 0x02, 0x04, 0x00, 0xEB, 0x10, - 0x01, 0x02, 0x08, 0x00, 0xE8, 0x10, 0x01, 0x02, - 0x10, 0x00, 0xE5, 0x10, 0xA1, 0x02, 0x41, 0x8B, - 0x10, 0x00, 0x02, 0x13, 0x60, 0x04, 0x5C, 0xEA, - 0x2D, 0x07, 0x18, 0x00, 0x80, 0x03, 0x09, 0x02, - 0x00, 0x08, 0x03, 0x02, 0x04, 0x00, 0xC7, 0x04, - 0xA0, 0x06, 0xDC, 0xEB, 0x60, 0x01, 0x1C, 0x01, - 0x04, 0x00, 0x1C, 0x16, 0xA0, 0x01, 0x40, 0x01, - 0x00, 0x08, 0xE0, 0x01, 0x40, 0x01, 0x00, 0x10, - 0x04, 0x02, 0x01, 0x00, 0x44, 0xCE, 0xC4, 0x06, - 0x44, 0xC6, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x10, - 0x49, 0x06, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, - 0xE0, 0x01, 0x40, 0x01, 0x00, 0x04, 0xE0, 0x01, - 0x40, 0x01, 0x00, 0x08, 0xA0, 0x06, 0x7A, 0xEC, - 0xA0, 0x06, 0x7A, 0xEC, 0xC7, 0x05, 0x04, 0x02, - 0xE4, 0xE4, 0xE0, 0x04, 0xD0, 0x03, 0x74, 0xC1, - 0xB4, 0xC1, 0x86, 0x05, 0x1C, 0x13, 0xE0, 0x02, - 0xC0, 0x00, 0x00, 0x02, 0x00, 0x00, 0x40, 0xC0, - 0x80, 0xC0, 0xC0, 0xC0, 0x00, 0xC1, 0x40, 0xC1, - 0x80, 0xC1, 0xC0, 0xC1, 0x00, 0xC2, 0x40, 0xC2, - 0x80, 0xC2, 0xC0, 0xC2, 0x00, 0xC3, 0x40, 0xC3, - 0x80, 0xC3, 0xC0, 0xC3, 0xA0, 0x04, 0xAA, 0x00, - 0xD0, 0x03, 0xD0, 0x03, 0x3F, 0x10, 0x85, 0x05, - 0x85, 0x81, 0xE1, 0x13, 0xE4, 0x10, 0xC7, 0x05, - 0x05, 0x02, 0xFF, 0x7F, 0x45, 0xA1, 0xD0, 0x03, - 0xD0, 0x03, 0x34, 0x10, 0xC0, 0xCC, 0xC1, 0xC4, - 0x03, 0x02, 0x28, 0x00, 0xA0, 0x06, 0xDC, 0xEB, - 0xE0, 0x01, 0x42, 0x01, 0x00, 0x10, 0xC7, 0x05, - 0xD0, 0x03, 0xD0, 0x03, 0x27, 0x10, 0xC7, 0x05, - 0xA0, 0xC1, 0x4A, 0x01, 0xA0, 0x07, 0x4A, 0x01, - 0x00, 0x0E, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x02, - 0x20, 0x07, 0x44, 0x01, 0x60, 0xC1, 0x44, 0x01, - 0x85, 0x02, 0x00, 0xFF, 0x17, 0x16, 0xE0, 0x01, - 0x40, 0x01, 0x00, 0x22, 0x05, 0x02, 0xC0, 0x00, - 0x05, 0x06, 0xD0, 0x03, 0xFD, 0x16, 0x60, 0xC1, - 0x46, 0x01, 0x85, 0x02, 0x00, 0xFF, 0x0A, 0x13, - 0x05, 0x02, 0x93, 0x33, 0x05, 0x06, 0x00, 0x10, - 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, - 0xD0, 0x03, 0xF8, 0x16, 0x51, 0x10, 0x06, 0xC8, - 0x4A, 0x01, 0xC0, 0xCC, 0xC1, 0xC4, 0x4B, 0x10, - 0x13, 0xC0, 0xC8, 0xCC, 0x53, 0xC0, 0x02, 0x02, - 0xEC, 0xEB, 0xC2, 0xC4, 0x43, 0x06, 0x5B, 0x04, - 0x60, 0xC0, 0xAE, 0x00, 0xC4, 0x02, 0x44, 0x02, - 0x0F, 0x00, 0x44, 0x88, 0xCA, 0xE4, 0x3C, 0x16, - 0x81, 0x02, 0x08, 0x00, 0x27, 0x13, 0x21, 0xC1, - 0xDC, 0xE4, 0x14, 0xC1, 0x21, 0x21, 0xBA, 0xE4, - 0x33, 0x16, 0x21, 0xC1, 0xC2, 0xE4, 0x81, 0x02, - 0x00, 0x00, 0x0B, 0x13, 0x0D, 0x02, 0xA0, 0x00, - 0x84, 0x83, 0x09, 0x13, 0xC4, 0x05, 0x84, 0x83, - 0x06, 0x13, 0xC4, 0x05, 0x84, 0x83, 0x03, 0x13, - 0x23, 0x10, 0x0E, 0x81, 0x21, 0x16, 0x21, 0xC1, - 0xDC, 0xE4, 0x21, 0x45, 0xBA, 0xE4, 0xE0, 0x01, - 0x42, 0x01, 0x00, 0x10, 0xA0, 0x01, 0x42, 0x01, - 0x00, 0x10, 0xA1, 0xC3, 0xD4, 0xE4, 0x0F, 0x02, - 0x2F, 0x00, 0x80, 0x03, 0xA0, 0x01, 0x40, 0x01, - 0x00, 0x02, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x80, - 0x6D, 0xC0, 0x0A, 0x00, 0x09, 0x13, 0x81, 0x02, - 0x5C, 0x12, 0x06, 0x1B, 0x0E, 0x02, 0xD2, 0xEB, - 0x0F, 0x02, 0x0F, 0x00, 0x80, 0x03, 0xCA, 0x05, - 0xE0, 0x02, 0xA0, 0x00, 0x5A, 0x04, 0x59, 0xCE, - 0x20, 0x88, 0xE4, 0xE4, 0xE4, 0xE4, 0xF8, 0x10, - 0xC1, 0x04, 0x48, 0x62, 0x89, 0x05, 0xA0, 0xC0, - 0x6C, 0x01, 0x08, 0xC8, 0x6C, 0x01, 0x03, 0x02, - 0x00, 0xFC, 0x04, 0x02, 0x00, 0x02, 0x73, 0xA0, - 0x04, 0x06, 0xFD, 0x16, 0x88, 0x05, 0x09, 0x06, - 0xF4, 0x16, 0x02, 0xC8, 0x6C, 0x01, 0x81, 0x86, - 0x02, 0x16, 0xD0, 0x03, 0xCB, 0x05, 0x5B, 0x04, - 0x43, 0x28, 0x31, 0x29, 0x38, 0x39, 0x2D, 0x33, - 0x38, 0x38, 0x42, 0x20, 0x20, 0x59, 0x49, 0x54, - 0x4B, 0xC2, 0xA8, 0x02, 0x98, 0x00, 0x83, 0x07, - 0x02, 0x00, 0x28, 0x02, 0x08, 0x00, 0x23, 0xC6, - 0x36, 0xE5, 0x48, 0x06, 0xC4, 0xC0, 0x73, 0x0A, - 0x65, 0x17, 0xA0, 0x06, 0xAA, 0xED, 0xC8, 0xC1, - 0xC7, 0x05, 0x03, 0x02, 0xA5, 0x00, 0xB0, 0x03, - 0xF8, 0xCD, 0xF8, 0xCD, 0xA6, 0x02, 0x06, 0x62, - 0x88, 0x02, 0x0A, 0x00, 0x57, 0x16, 0x03, 0x29, - 0x55, 0x16, 0x05, 0x29, 0xC4, 0x80, 0x52, 0x16, - 0x15, 0x09, 0x50, 0x17, 0x15, 0x09, 0x4E, 0x18, - 0x85, 0x02, 0x29, 0x00, 0x4B, 0x16, 0xC6, 0x05, - 0x96, 0x00, 0x03, 0x07, 0xC4, 0x04, 0x45, 0x06, - 0x95, 0x00, 0x44, 0x05, 0x43, 0x16, 0x44, 0x81, - 0x41, 0x16, 0x00, 0x03, 0x05, 0x00, 0xC4, 0x02, - 0x00, 0x03, 0x0A, 0x00, 0x44, 0x02, 0x0F, 0x00, - 0x84, 0x02, 0x05, 0x00, 0x37, 0x16, 0xC4, 0x02, - 0x00, 0x03, 0x0F, 0x00, 0x44, 0x02, 0x0F, 0x00, - 0x84, 0x02, 0x0A, 0x00, 0x2F, 0x16, 0x04, 0x02, - 0xFE, 0xFF, 0x2C, 0x13, 0x2B, 0x15, 0x2A, 0x1A, - 0x84, 0x05, 0x28, 0x12, 0x27, 0x15, 0x26, 0x1A, - 0x25, 0x18, 0x84, 0x05, 0x23, 0x16, 0x22, 0x1B, - 0x21, 0x17, 0x84, 0x05, 0x1F, 0x13, 0x1E, 0x1A, - 0x1D, 0x11, 0x04, 0x06, 0x1B, 0x16, 0xA5, 0x02, - 0xC5, 0xC1, 0x25, 0x02, 0x06, 0x00, 0x03, 0x02, - 0xA5, 0xA5, 0x83, 0xC1, 0x95, 0x00, 0x03, 0x38, - 0x94, 0x00, 0x83, 0x02, 0x2E, 0x6B, 0x0E, 0x16, - 0x84, 0x02, 0x59, 0x1C, 0x0B, 0x16, 0x24, 0x02, - 0x69, 0x00, 0x95, 0x00, 0x03, 0x3C, 0x94, 0x00, - 0x83, 0x81, 0x04, 0x16, 0x84, 0x02, 0x69, 0x00, - 0x01, 0x16, 0xC9, 0x05, 0x59, 0x04, 0xC3, 0xD0, - 0xFD, 0x13, 0x01, 0x1C, 0xFB, 0x10, 0xE0, 0x90, - 0x3D, 0xE5, 0xF8, 0x16, 0xC3, 0x06, 0xC3, 0xD0, - 0xF5, 0x1C, 0xF4, 0x16, 0xE0, 0x90, 0x3A, 0xE5, - 0xF1, 0x16, 0x5B, 0x04, 0x0B, 0xC3, 0x09, 0x02, - 0x3E, 0xE5, 0xA0, 0x06, 0x92, 0xE9, 0xCC, 0x05, - 0x5C, 0x04, 0x88, 0x07, 0x00, 0xA0, 0x89, 0x07, - 0xFE, 0xFF, 0xA8, 0x09, 0xA9, 0x09, 0x8A, 0x07, - 0x02, 0xE0, 0xA0, 0x06, 0x84, 0xEC, 0x00, 0x00, - 0x88, 0x07, 0x00, 0x90, 0x89, 0x07, 0xFE, 0x9F, - 0xA8, 0x09, 0xA9, 0x09, 0x8A, 0x07, 0x78, 0xE0, - 0xA0, 0x06, 0x84, 0xEC, 0x00, 0x00, 0xA0, 0x06, - 0xC4, 0xEC, 0x00, 0x00, 0xE6, 0x10, 0xE5, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, - 0x00, 0x08, 0x11, 0xE3, 0x6C, 0xCC, 0x00, 0x80, - 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, - 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x80, 0x00, - 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, - 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0xFF, - 0xFF, 0x00, 0xF0, 0xFF, 0x00, 0xF0, 0x0F, 0x00, - 0xFF, 0xFF, 0xFF, 0x7F, 0x03, 0x00, 0x00, 0x00, - 0xC3, 0x00, 0xE7, 0xE7, 0xF3, 0xE7, 0xF1, 0xF1, - 0x43, 0x28, 0x20, 0x29, 0x4F, 0x43, 0x59, 0x50, - 0x49, 0x52, 0x48, 0x47, 0x20, 0x54, 0x42, 0x49, - 0x20, 0x4D, 0x39, 0x31, 0x33, 0x38, 0x34, 0x2C, - 0x35, 0x2C, 0x36, 0x2C, 0x43, 0x28, 0x20, 0x29, - 0x4F, 0x43, 0x59, 0x50, 0x49, 0x52, 0x48, 0x47, - 0x20, 0x54, 0x49, 0x54, 0x31, 0x20, 0x38, 0x39, - 0x2D, 0x33, 0x39, 0x38, 0x39, 0x2C, 0x2D, 0x30, - 0x38, 0x39, 0x00, 0x00, 0x61, 0x9B, 0xC4, 0xEC, - 0x0E, 0xEA, 0xDE, 0xE5, 0xC8, 0xED, 0x00, 0x00, - 0xC4, 0x00, 0xB8, 0xAF, 0x4A, 0x06, 0x50, 0x06, - 0x4C, 0x06, 0xDC, 0xCC, 0x4E, 0x06, 0x0F, 0x00, - 0x32, 0x06, 0x01, 0x00, 0x50, 0x07, 0x58, 0x07, - 0x52, 0x07, 0x70, 0xB5, 0x54, 0x07, 0x0F, 0x00, - 0x38, 0x07, 0x01, 0x00, 0xBA, 0x00, 0xA0, 0x00, - 0xBC, 0x00, 0xD6, 0xED, 0xBE, 0x00, 0x0F, 0x00, - 0x5E, 0x07, 0x3A, 0x07, 0x62, 0x07, 0x40, 0x80, - 0x64, 0x07, 0x54, 0xBA, 0x66, 0x07, 0x36, 0xBA, - 0x68, 0x07, 0x40, 0xB8, 0x98, 0x07, 0x00, 0x80, - 0x78, 0x07, 0x00, 0x80, 0xE2, 0x08, 0x04, 0x00, - 0xE4, 0x08, 0x01, 0x00, 0xEC, 0x08, 0x08, 0x00, - 0xF6, 0x08, 0x0A, 0x00, 0xF8, 0x08, 0x06, 0x00, - 0x00, 0x09, 0x0C, 0x00, 0x02, 0x09, 0x04, 0x00, - 0xAE, 0x01, 0x00, 0x00, 0x1E, 0x09, 0x00, 0x00, - 0x66, 0x09, 0x00, 0x00, 0x0C, 0x06, 0x13, 0x00, - 0x0A, 0x06, 0x20, 0x00, 0x00, 0x00, 0xE0, 0x00, - 0x86, 0xA3, 0xE0, 0x00, 0xE6, 0xA2, 0xE0, 0x00, - 0x86, 0xA3, 0xE0, 0x00, 0x02, 0xA5, 0xE0, 0x00, - 0x5E, 0xA6, 0xE0, 0x00, 0x66, 0xA9, 0xE0, 0x00, - 0x12, 0xA4, 0xC0, 0x00, 0x22, 0xA4, 0xE0, 0x00, - 0x86, 0xA3, 0xE0, 0x00, 0x86, 0xA3, 0xC0, 0x00, - 0x74, 0xA4, 0xE0, 0x00, 0x86, 0xA3, 0xE0, 0x00, - 0x86, 0xA3, 0xE0, 0x00, 0x86, 0xA3, 0xE0, 0x00, - 0x86, 0xA3, 0xE0, 0x00, 0x86, 0xA3, 0xC0, 0x00, - 0xDE, 0xAF, 0xC0, 0x00, 0x48, 0xB0, 0xC0, 0x00, - 0x84, 0xB0, 0xC0, 0x00, 0xF4, 0xB0, 0xC0, 0x00, - 0x76, 0xB1, 0xE0, 0x00, 0xE4, 0xB2, 0xE0, 0x00, - 0x8A, 0xB2, 0xE0, 0x00, 0xF4, 0xB3, 0xE0, 0x00, - 0x7C, 0xB3, 0xE0, 0x00, 0xC6, 0xAA, 0xC0, 0x00, - 0x36, 0xAB, 0xC0, 0x00, 0x90, 0xAB, 0xC0, 0x00, - 0xC2, 0xAB, 0xC0, 0x00, 0xEA, 0xAA, 0xC0, 0x00, - 0x80, 0xA3, 0xC0, 0x00, 0x80, 0xA3, 0x00, 0x3F, - 0x00, 0x7F, 0x00, 0x5E, 0x30, 0x00, 0x28, 0x00, - 0x43, 0x00, 0xB6, 0xA6, 0xB6, 0xA6, 0x1C, 0xA5, - 0x14, 0xA5, 0x46, 0xA5, 0x46, 0xA5, 0x62, 0xA5, - 0xB6, 0xA6, 0x00, 0x40, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0x08, - 0x00, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x10, - 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, - 0x14, 0x00, 0x0E, 0x10, 0x0C, 0x0C, 0x0A, 0x0A, - 0x0A, 0x0A, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x98, 0x07, 0x7E, 0xCA, 0x58, 0x07, - 0xF8, 0xB8, 0x58, 0x07, 0xFE, 0xB7, 0x58, 0x07, - 0x68, 0xB9, 0x58, 0x07, 0xD0, 0xB8, 0x98, 0x07, - 0x5A, 0xC7, 0x98, 0x07, 0x52, 0xC7, 0x78, 0x07, - 0xC2, 0xC1, 0x58, 0x07, 0x30, 0xB9, 0x98, 0x07, - 0x38, 0xCA, 0x78, 0x07, 0x96, 0xC2, 0x58, 0x07, - 0x6A, 0xC7, 0x58, 0x07, 0xE0, 0xB8, 0x58, 0x07, - 0x1E, 0xB9, 0x58, 0x07, 0xE2, 0xB9, 0x98, 0x07, - 0xAE, 0xCB, 0x98, 0x07, 0x8E, 0xC7, 0x78, 0x07, - 0x56, 0xC2, 0xB8, 0x07, 0x14, 0xCC, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xA2, 0xBA, 0x16, 0xC1, - 0xCA, 0xC1, 0xD6, 0xC6, 0x8A, 0xBD, 0xC2, 0xBD, - 0xE0, 0xBD, 0x6A, 0xBE, 0x8E, 0xBE, 0xAA, 0xBE, - 0x22, 0xBF, 0x22, 0xBF, 0x56, 0xBE, 0xC8, 0xBF, - 0x10, 0xBE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, - 0x00, 0x0C, 0x01, 0x0F, 0xFF, 0xFE, 0x00, 0x58, - 0x00, 0x0E, 0xFF, 0xFE, 0x0E, 0x00, 0x00, 0x70, - 0x40, 0x80, 0x00, 0x5E, 0xA0, 0xC0, 0xDF, 0xFF, - 0x00, 0x18, 0x00, 0xE0, 0x00, 0x78, 0x00, 0x50, - 0x00, 0x60, 0x00, 0x70, 0x00, 0x0C, 0x06, 0x00, - 0x00, 0x00, 0x84, 0xE3, 0xE6, 0x07, 0xF4, 0x07, - 0x08, 0x00, 0x00, 0x00, 0x8A, 0xE3, 0xEA, 0x07, - 0xF4, 0x07, 0x06, 0x00, 0x40, 0x00, 0x00, 0x0A, - 0xE6, 0x07, 0xEE, 0x07, 0x08, 0x00, 0x40, 0x00, - 0x06, 0x0A, 0xEA, 0x07, 0xEE, 0x07, 0x00, 0x00, - 0xE2, 0xC1, 0x8B, 0xD4, 0xFF, 0xFF, 0xD7, 0xD1, - 0xD9, 0xC5, 0xD4, 0xC3, 0x3B, 0x59, 0x34, 0x09, - 0xFC, 0x05, 0x6C, 0x09, 0xD8, 0x06, 0x06, 0x04, - 0xBA, 0xEA, 0x30, 0x09, 0x48, 0x04, 0x80, 0x08, - 0x06, 0x00, 0x0A, 0x06, 0x0E, 0x0C, 0xBA, 0xCE, - 0x2E, 0xE0, 0x56, 0xE0, 0x50, 0xE1, 0x66, 0xE2, - 0xEC, 0xE2, 0x4C, 0xE3, 0xFE, 0xE3, 0xBA, 0xCE, - 0x80, 0xE4, 0x10, 0xE4, 0x14, 0xE0, 0x1C, 0xE4, - 0x1C, 0xE4, 0x46, 0xE5, 0x50, 0xE5, 0x5A, 0xE5, - 0xBA, 0xCE, 0xA6, 0xDC, 0xBA, 0xCE, 0x44, 0xDA, - 0xE6, 0xDF, 0x70, 0xDA, 0xDE, 0xDE, 0xB0, 0xCE, - 0x16, 0xDB, 0x3A, 0xDD, 0xB8, 0xDD, 0x34, 0xDE, - 0x58, 0xDE, 0x16, 0xDB, 0xDA, 0xDC, 0x08, 0xCF, - 0xB0, 0xCE, 0xA8, 0xD9, 0x8A, 0xD9, 0x44, 0xD9, - 0xB0, 0xCE, 0xEA, 0xDE, 0xB0, 0xCE, 0x72, 0x06, - 0xF6, 0xD2, 0x08, 0x07, 0x72, 0x06, 0x54, 0xD2, - 0xF4, 0x01, 0x72, 0x06, 0x34, 0xD2, 0x08, 0x07, - 0x7C, 0x06, 0x5A, 0xDC, 0x04, 0x00, 0x7C, 0x06, - 0x78, 0xD2, 0x00, 0x00, 0x7C, 0x06, 0xCC, 0xDE, - 0xFA, 0x00, 0x86, 0x06, 0xAC, 0xD1, 0x05, 0x00, - 0x90, 0x06, 0x1C, 0xDF, 0x28, 0x00, 0x90, 0x06, - 0x50, 0xD3, 0x04, 0x01, 0x90, 0x06, 0x00, 0x00, - 0x02, 0x00, 0x90, 0x06, 0x80, 0xD2, 0xBC, 0x02, - 0x9A, 0x06, 0x06, 0xD3, 0xDC, 0x05, 0x9A, 0x06, - 0xAA, 0xD2, 0x64, 0x00, 0x9A, 0x06, 0x0A, 0xD3, - 0x14, 0x00, 0x9A, 0x06, 0xE2, 0xE0, 0x40, 0x06, - 0x9A, 0x06, 0x12, 0xD3, 0x64, 0x00, 0x7C, 0x06, - 0x16, 0xDC, 0x04, 0x00, 0x7C, 0x06, 0xE6, 0xDA, - 0x16, 0x00, 0x7C, 0x06, 0xFA, 0xDB, 0x05, 0x00, - 0x7C, 0x06, 0x00, 0xDD, 0x14, 0x00, 0x9A, 0x06, - 0x7C, 0xD3, 0x14, 0x00, 0x9A, 0x06, 0x38, 0xD4, - 0x02, 0x00, 0x7C, 0x06, 0x0C, 0xE0, 0x19, 0x00, - 0x00, 0x00, 0x0A, 0x07, 0x0E, 0x07, 0x04, 0x07, - 0xD8, 0x06, 0x00, 0x07, 0xF0, 0x06, 0xEE, 0x06, - 0xEC, 0x06, 0x0C, 0x07, 0xE6, 0x06, 0x18, 0x07, - 0x92, 0x09, 0x94, 0x09, 0x96, 0x09, 0x98, 0x09, - 0x00, 0x50, 0xCC, 0x00, 0x03, 0x00, 0x00, 0x84, - 0x00, 0xA8, 0x00, 0xA0, 0x00, 0x20, 0x00, 0x80, - 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 0x80, - 0x00, 0x40, 0x00, 0x10, 0x82, 0xEC, 0x48, 0xEB, - 0x62, 0xEB, 0x7C, 0xEB, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x09, 0x00, 0x09, 0x00, 0xEA, 0xEB, - 0x52, 0xEB, 0x68, 0xEB, 0x82, 0xEB, 0x40, 0x01, - 0x42, 0x01, 0x42, 0x01, 0x42, 0x01, 0x00, 0x00, - 0x7F, 0x00, 0xA0, 0x00, 0xFF, 0x00, 0x10, 0x02, - 0x1F, 0x02, 0x30, 0x02, 0x3F, 0x02, 0x50, 0x02, - 0x5F, 0x02, 0x70, 0x02, 0x7F, 0x02, 0x90, 0x02, - 0x9F, 0x02, 0xB0, 0x02, 0xBF, 0x02, 0xD0, 0x02, - 0xDF, 0x02, 0xE1, 0x02, 0xFF, 0x02, 0x01, 0x03, - 0x7F, 0x03, 0x81, 0x03, 0x8F, 0x03, 0x91, 0x03, - 0x9F, 0x03, 0xA1, 0x03, 0xAF, 0x03, 0xB1, 0x03, - 0xBF, 0x03, 0xC1, 0x03, 0xCF, 0x03, 0xE1, 0x03, - 0xFF, 0x03, 0xC0, 0x07, 0xFF, 0x07, 0x00, 0x0C, - 0xFF, 0x0F, 0x00, 0x30, 0xFF, 0x37, 0xFF, 0xFF, - 0xFF, 0xFF, 0xBC, 0xFE, 0x07, 0x00, 0x5E, 0x02, - 0x00, 0x01, 0xFF, 0xBA, 0x80, 0xBA, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x0A, 0x01, - 0x0E, 0x01, 0x10, 0x01, 0x14, 0x01, 0x00, 0x00, - 0x12, 0x01, 0x00, 0xF8, 0x16, 0x01, 0x00, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x0A, 0x01, 0x1C, 0x01, - 0x82, 0x01, 0x66, 0x96, 0x66, 0x96, 0x55, 0x55, - 0x00, 0x00, 0x82, 0x01, 0x2A, 0x8A, 0x2A, 0x8A, - 0x18, 0xC9, 0x18, 0xC9, 0x86, 0x01, 0xAA, 0xA2, - 0x1E, 0xA0, 0x55, 0x55, 0x1E, 0x54, 0x8A, 0x01, - 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, - 0x8C, 0x01, 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, - 0x00, 0x00, 0x8E, 0x01, 0x00, 0x50, 0x00, 0x00, - 0x00, 0xA8, 0x00, 0x00, 0x90, 0x01, 0x00, 0x50, - 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x92, 0x01, - 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, - 0x94, 0x01, 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, - 0x00, 0x00, 0x96, 0x01, 0x00, 0x50, 0x00, 0x00, - 0x00, 0xA8, 0x00, 0x00, 0x98, 0x01, 0x00, 0x50, - 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x9A, 0x01, - 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, - 0x9C, 0x01, 0x55, 0x55, 0xC0, 0x7F, 0xAA, 0xAA, - 0xC0, 0x7F, 0x00, 0x00, 0xA2, 0x01, 0xA4, 0x01, - 0xA8, 0x01, 0xAA, 0x01, 0xAE, 0x01, 0xB0, 0x01, - 0xB2, 0x01, 0x80, 0x01, 0x00, 0x00, 0x88, 0x01, - 0x00, 0xFF, 0x9E, 0x01, 0xFF, 0x00, 0xA0, 0x01, - 0x00, 0x80, 0xAC, 0x01, 0x00, 0x80, 0x00, 0x00, - 0xA6, 0x01, 0x00, 0x80, 0x00, 0x00, 0x80, 0x01, - 0xBC, 0x01, 0x00, 0x88, 0x00, 0x06, 0x00, 0xC8, - 0x00, 0x00, 0x00, 0x80, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x02, 0x00, 0x44, 0x00, 0x92, 0xEA, - 0x48, 0x00, 0x98, 0xEA, 0x50, 0x00, 0x9E, 0xEA, - 0x60, 0x00, 0xA4, 0xEA, 0x78, 0x00, 0xAA, 0xEA, - 0x0A, 0xE8, 0x18, 0xE7, 0x3C, 0xEA, 0x2A, 0xE7, - 0x14, 0x55, 0xA0, 0x01, 0xEC, 0xE6, 0xD0, 0xE9, - 0x46, 0xE7, 0xA0, 0xE7, 0x00, 0xE7, 0x58, 0xE8, - 0x00, 0x00, 0x1E, 0x00, 0x46, 0xE7, 0x92, 0xE7, - 0x00, 0x41, 0x01, 0x41, 0xB6, 0xE7, 0x73, 0xEA, - 0x18, 0xE7, 0x48, 0xEA, 0xEC, 0xE6, 0x04, 0xEA, - 0x56, 0xE7, 0x62, 0xE7, 0xB6, 0xE7, 0x6E, 0xEA, - 0x62, 0xE8, 0x00, 0x00, 0x36, 0xE8, 0xEC, 0xE6, - 0xFA, 0xE9, 0x56, 0xE7, 0x62, 0xE7, 0x36, 0xE8, - 0x62, 0xE8, 0x00, 0x00, 0xEC, 0xE6, 0xF0, 0xE9, - 0x0C, 0xE7, 0x4A, 0xE7, 0x62, 0xE7, 0x36, 0xE8, - 0xEC, 0xE6, 0xFA, 0xE9, 0x56, 0xE7, 0x62, 0xE7, - 0x36, 0xE8, 0x62, 0xE8, 0x00, 0x20, 0x2A, 0xE7, - 0x14, 0x55, 0xA0, 0x01, 0x18, 0xE7, 0x50, 0xEA, - 0xEC, 0xE6, 0xD0, 0xE9, 0x58, 0xE8, 0x50, 0x55, - 0x0C, 0x00, 0x46, 0xE7, 0x92, 0xE7, 0x00, 0x01, - 0x00, 0x00, 0xB6, 0xE7, 0x75, 0xEA, 0x00, 0xE7, - 0x58, 0xE8, 0x55, 0x55, 0x0C, 0x00, 0x56, 0xE7, - 0xA0, 0xE7, 0x00, 0xE7, 0x58, 0xE8, 0xFF, 0xFF, - 0x08, 0x00, 0x58, 0xE8, 0x02, 0x10, 0x06, 0x00, - 0x46, 0xE7, 0x92, 0xE7, 0x00, 0x01, 0x01, 0x01, - 0xB6, 0xE7, 0x80, 0xEA, 0x00, 0xE7, 0x58, 0xE8, - 0x00, 0xC0, 0x08, 0x00, 0x58, 0xE8, 0xFF, 0xFF, - 0x0A, 0x00, 0x58, 0xE8, 0xFF, 0xFF, 0x0C, 0x00, - 0x58, 0xE8, 0x0D, 0x10, 0x06, 0x00, 0x46, 0xE7, - 0x92, 0xE7, 0x00, 0x01, 0x01, 0x01, 0xB6, 0xE7, - 0x74, 0xEA, 0x62, 0xE8, 0x08, 0x20, 0x00, 0xE7, - 0x52, 0xE8, 0x82, 0x01, 0x02, 0xC9, 0x46, 0xE7, - 0xB6, 0xE7, 0x80, 0xEA, 0x62, 0xE8, 0x34, 0x20, - 0x00, 0xE7, 0x58, 0xE8, 0x00, 0x10, 0x06, 0x00, - 0x46, 0xE7, 0xC6, 0xE8, 0xB6, 0xE7, 0x78, 0xEA, - 0x52, 0xE8, 0x9C, 0x01, 0x40, 0x00, 0x18, 0xE7, - 0x50, 0xEA, 0x2A, 0xE7, 0xFF, 0x00, 0x80, 0x07, - 0x26, 0xE9, 0x03, 0x00, 0x66, 0xE9, 0x74, 0xE9, - 0x12, 0xEA, 0x38, 0xE9, 0x00, 0x00, 0x74, 0xE9, - 0x1C, 0xEA, 0x38, 0xE9, 0x04, 0x00, 0x74, 0xE9, - 0x24, 0xEA, 0x38, 0xE9, 0x07, 0x00, 0x74, 0xE9, - 0x2C, 0xEA, 0x26, 0xE9, 0x01, 0x00, 0x74, 0xE9, - 0x34, 0xEA, 0x38, 0xE9, 0x02, 0x00, 0x74, 0xE9, - 0x34, 0xEA, 0x38, 0xE9, 0x06, 0x00, 0x74, 0xE9, - 0x34, 0xEA, 0x38, 0xE9, 0x05, 0x00, 0x74, 0xE9, - 0x34, 0xEA, 0x26, 0xE9, 0x01, 0x00, 0x4A, 0xE9, - 0x26, 0xE9, 0x03, 0x00, 0x58, 0xE9, 0x62, 0xE7, - 0xE6, 0xE8, 0xD8, 0xE9, 0x01, 0x00, 0xE6, 0xE8, - 0x25, 0xEA, 0x02, 0x00, 0xE6, 0xE8, 0x2F, 0xEA, - 0x06, 0x00, 0xE6, 0xE8, 0x3A, 0xEA, 0x05, 0x00, - 0xB6, 0xE7, 0x74, 0xEA, 0x36, 0xE8, 0xEC, 0xE6, - 0xD0, 0xE9, 0x56, 0xE7, 0xC6, 0xE8, 0x0C, 0xE7, - 0x92, 0xE7, 0x00, 0x01, 0x00, 0x80, 0xB6, 0xE7, - 0x78, 0xEA, 0x00, 0xE7, 0xFE, 0xE8, 0x52, 0xE8, - 0x80, 0x01, 0x41, 0x8E, 0x4A, 0xE7, 0x92, 0xE7, - 0x00, 0x01, 0x01, 0x1B, 0x06, 0xE9, 0xE4, 0xFF, - 0xB6, 0xE7, 0x7C, 0xEA, 0xBE, 0xE8, 0x18, 0xE7, - 0x56, 0xEA, 0x0C, 0xE7, 0x6A, 0xE8, 0x3C, 0xE7, - 0x00, 0xE0, 0xC6, 0xE8, 0xB6, 0xE7, 0x86, 0xEA, - 0x3C, 0xE7, 0x00, 0xE8, 0x62, 0xE7, 0xB6, 0xE7, - 0x85, 0xEA, 0x3C, 0xE7, 0x00, 0x08, 0xC6, 0xE8, - 0xB6, 0xE7, 0x86, 0xEA, 0x3C, 0xE7, 0x00, 0xF8, - 0x62, 0xE7, 0xB6, 0xE7, 0x85, 0xEA, 0x52, 0xE8, - 0x80, 0x01, 0x00, 0x02, 0x3C, 0xE7, 0x00, 0xE0, - 0x62, 0xE7, 0xB6, 0xE7, 0x85, 0xEA, 0x52, 0xE8, - 0x84, 0x01, 0x00, 0x00, 0x62, 0xE8, 0x34, 0x00, - 0x3C, 0xE7, 0x00, 0x00, 0xC6, 0xE8, 0x62, 0xE8, - 0x34, 0x60, 0x0E, 0xE9, 0x52, 0xE8, 0x84, 0x01, - 0x00, 0x00, 0xB6, 0xE7, 0x86, 0xEA, 0x52, 0xE8, - 0x82, 0x01, 0x00, 0xC8, 0x3C, 0xE7, 0x00, 0xE0, - 0xC6, 0xE8, 0x3C, 0xE7, 0x00, 0x10, 0xC6, 0xE8, - 0x62, 0xE8, 0x34, 0x60, 0x52, 0xE8, 0x80, 0x01, - 0x00, 0x06, 0x3C, 0xE7, 0x10, 0x00, 0x78, 0xE8, - 0x36, 0xE8, 0x52, 0xE8, 0x84, 0x01, 0x00, 0x00, - 0x62, 0xE8, 0x34, 0x00, 0xEC, 0xE6, 0xD0, 0xE9, - 0x18, 0xE7, 0x5C, 0xEA, 0xD0, 0xE8, 0x92, 0xE9, - 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0xF0, - 0x06, 0x00, 0x00, 0xC7, 0xA0, 0xE7, 0xDC, 0xE8, - 0x00, 0xE0, 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, - 0x40, 0xD0, 0x06, 0x00, 0x00, 0xE0, 0xA0, 0xE7, - 0xDC, 0xE8, 0x00, 0xC0, 0x00, 0xE7, 0x0C, 0xE7, - 0x70, 0xE7, 0x40, 0x90, 0x06, 0x00, 0x00, 0xA0, - 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x80, 0x00, 0xE7, - 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x50, 0x06, 0x00, - 0x00, 0x60, 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x40, - 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x10, - 0x06, 0x00, 0x00, 0x20, 0xA0, 0xE7, 0xDC, 0xE8, - 0x00, 0x00, 0xD0, 0xE8, 0x92, 0xE9, 0x00, 0xE7, - 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0xD0, 0x06, 0x00, - 0x00, 0xA6, 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0xC0, - 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x90, - 0x06, 0x00, 0x00, 0xC0, 0xA0, 0xE7, 0xDC, 0xE8, - 0x00, 0x80, 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, - 0x40, 0x50, 0x06, 0x00, 0x00, 0x40, 0xA0, 0xE7, - 0xDC, 0xE8, 0x00, 0x40, 0x00, 0xE7, 0x0C, 0xE7, - 0x70, 0xE7, 0x40, 0x70, 0x06, 0x00, 0x00, 0x60, - 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x60, 0x7E, 0xE9, - 0x90, 0xE9, 0x18, 0xE7, 0x62, 0xEA, 0xEC, 0xE6, - 0xD0, 0xE9, 0xA4, 0xE8, 0x55, 0x55, 0x16, 0x00, - 0x46, 0xE7, 0x92, 0xE7, 0x00, 0x00, 0x00, 0x00, - 0xB6, 0xE7, 0x8B, 0xEA, 0x0A, 0xE8, 0x18, 0xE7, - 0x62, 0xEA, 0x58, 0xE8, 0x55, 0x55, 0x16, 0x00, - 0x00, 0xE7, 0x46, 0xE7, 0xA0, 0xE7, 0x2A, 0xE7, - 0xFF, 0x00, 0x00, 0x08, 0x2A, 0xE7, 0xFF, 0x00, - 0x00, 0x0C, 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x10, - 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x14, 0x2A, 0xE7, - 0xFF, 0x00, 0x00, 0x18, 0x2A, 0xE7, 0xFF, 0x00, - 0x00, 0x1C, 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x20, - 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x24, 0x2A, 0xE7, - 0xFF, 0x00, 0x00, 0x28, 0x2A, 0xE7, 0xFF, 0x00, - 0x00, 0x2C, 0xD2, 0xE7, 0x00, 0xE7, 0x0C, 0xE7, - 0x70, 0xE7, 0x40, 0x30, 0x06, 0x00, 0x00, 0x01, - 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x20, 0x00, 0xE7, - 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x70, 0x06, 0x00, - 0x00, 0x43, 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x60, - 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0xB0, - 0x06, 0x00, 0x00, 0x85, 0xA0, 0xE7, 0xDC, 0xE8, - 0x00, 0xA0, 0xD8, 0xE8, 0x00, 0x01, 0x03, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x00, 0x81, 0x1A, 0x00, - 0x40, 0x10, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, - 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x72, 0x82, - 0x4A, 0xA9, 0xA5, 0x5A, 0xDA, 0xE7, 0x03, 0x09, - 0x11, 0x9D, 0x00, 0x00, 0x00, 0x81, 0x04, 0x00, - 0xD8, 0x90, 0x00, 0x10, 0x00, 0x00, 0x00, 0x81, - 0x04, 0x00, 0xD8, 0x90, 0xD8, 0xB4, 0x00, 0x00, - 0x00, 0x81, 0x08, 0x00, 0xD8, 0x90, 0x46, 0x16, - 0x00, 0x40, 0xD8, 0xB4, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x13, 0x00, 0x40, 0x10, 0x16, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x10, 0x00, 0x15, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x0F, 0x00, 0x15, 0x00, - 0x00, 0x00, 0x00, 0x81, 0x0F, 0x00, 0x06, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x12, 0x00, 0x0A, 0x80, - 0x40, 0x9E, 0x00, 0xC8, 0x00, 0x00, 0x5E, 0x80, - 0x0F, 0x00, 0x06, 0x80, 0x40, 0xFE, 0x00, 0xCC, - 0x00, 0x00, 0x04, 0x80, 0x40, 0x8E, 0x00, 0xC9, - 0x04, 0x80, 0x00, 0x06, 0x00, 0xCC, 0x04, 0x80, - 0x40, 0x0A, 0x00, 0xC8, 0x0A, 0x80, 0x40, 0x8A, - 0x00, 0xC8, 0x00, 0x00, 0x5E, 0x80, 0x0F, 0x00, - 0x0A, 0x08, 0x80, 0x1C, 0x0A, 0x00, 0x1C, 0x1A, - 0x00, 0x80, 0x1C, 0x0C, 0x00, 0x80, 0x1C, 0x1A, - 0x00, 0x80, 0x1A, 0x0E, 0x80, 0x1C, 0x04, 0x00, - 0x00, 0x80, 0x80, 0x02, 0x02, 0x00, 0x00, 0x80, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x80, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x58, 0x07, 0x0C, 0xB8, - 0x16, 0xE0, 0xE2, 0x08, 0xEC, 0x08, 0xF6, 0x08, - 0x16, 0xE0, 0x00, 0x09, 0x0A, 0x09, 0x00, 0x00, - 0x00, 0x00, 0xE2, 0x08, 0x00, 0x00, 0xEC, 0x08, - 0xF6, 0x08, 0x00, 0x09, 0x00, 0x00, 0xB8, 0x07, - 0xCA, 0xCB, 0x80, 0x02, 0xB8, 0x07, 0xE8, 0xCB, - 0x84, 0xFF, 0xB8, 0x07, 0x0A, 0xCC, 0xB8, 0x07, - 0x84, 0xCC, 0x6E, 0xCD, 0x62, 0xCD, 0x88, 0xCD, - 0x90, 0xCE, 0x84, 0xCD, 0x92, 0xCE, 0x92, 0xCE, - 0x92, 0xCE, 0x8C, 0xCD, 0x96, 0xCD, 0x38, 0xCE, - 0x82, 0xCE, 0x92, 0xCE, 0x92, 0xCE, 0x92, 0xCE, - 0x92, 0xCE, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x00, 0x08, 0x01, 0x05, 0x08, - 0x08, 0x08, 0x03, 0x08, 0x03, 0x03, 0x03, 0x03, - 0x00, 0x00, 0x04, 0x02, 0x04, 0x04, 0x00, 0x04, - 0x0A, 0x08, 0x00, 0x00, 0x10, 0x0C, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x00, 0x1A, 0x00, 0x00, - 0x04, 0x41, 0x06, 0x0B, 0x08, 0xC2, 0x00, 0xE6, - 0x00, 0xE7, 0x04, 0x06, 0x04, 0x07, 0x04, 0x03, - 0x06, 0x04, 0x04, 0x05, 0x04, 0x88, 0x04, 0xCF, - 0x04, 0xCD, 0x03, 0x00, 0x05, 0x00, 0x1C, 0x00, - 0x00, 0x0C, 0x00, 0x80, 0xD2, 0xD8, 0xDA, 0xD8, - 0x1E, 0xD9, 0xDE, 0xD8, 0xEA, 0xD8, 0xF0, 0xD8, - 0x14, 0xD9, 0xE4, 0xD8, 0x32, 0xD9, 0x00, 0x06, - 0x00, 0x00, 0x03, 0x07, 0x0A, 0x0E, 0x0F, 0x14, - 0x26, 0x2A, 0x52, 0x42, 0x50, 0x48, 0x5D, 0x4D, - 0x62, 0x62, 0x6D, 0x57, 0x46, 0x39, 0x1A, 0x1D, - 0x7C, 0x76, 0x1F, 0x23, 0x15, 0x1D, 0x74, 0x6F, - 0x84, 0x7C, 0x8B, 0x82, 0x92, 0x89, 0x00, 0x00, - 0x32, 0x2F, 0x3F, 0x34, 0x32, 0x01, 0x01, 0x57, - 0x32, 0x11, 0x81, 0x51, 0x02, 0x56, 0x03, 0x55, - 0x54, 0x11, 0x56, 0x81, 0x55, 0x02, 0x54, 0x02, - 0x56, 0x81, 0x01, 0x76, 0x02, 0x34, 0x02, 0x55, - 0x81, 0x54, 0x02, 0x58, 0x02, 0x55, 0x81, 0x54, - 0x02, 0x58, 0x11, 0x12, 0x02, 0x52, 0x58, 0x83, - 0x52, 0x05, 0x83, 0x04, 0x02, 0x58, 0x08, 0x55, - 0x58, 0x83, 0x55, 0x02, 0x81, 0x02, 0x05, 0x58, - 0x03, 0x52, 0x5C, 0x15, 0x53, 0x5B, 0x52, 0x87, - 0x11, 0x03, 0x41, 0x51, 0x78, 0x51, 0x34, 0x11, - 0x81, 0x11, 0x20, 0x31, 0x54, 0x57, 0x01, 0x53, - 0x5A, 0x12, 0x81, 0x51, 0x20, 0x31, 0x5B, 0x57, - 0x01, 0x5A, 0x01, 0x11, 0x51, 0x11, 0x31, 0x81, - 0x57, 0x20, 0x15, 0x01, 0x13, 0x01, 0x11, 0x01, - 0x11, 0x11, 0x81, 0x51, 0x05, 0x58, 0x02, 0x52, - 0x5B, 0x54, 0x5D, 0x81, 0x52, 0x05, 0x54, 0x02, - 0x58, 0x81, 0x50, 0x02, 0x13, 0x03, 0x58, 0x81, - 0x50, 0x02, 0x11, 0x03, 0x81, 0x54, 0x72, 0x5D, - 0x50, 0x03, 0x13, 0x03, 0x13, 0x01, 0x40, 0x54, - 0x0E, 0x00, 0x20, 0x06, 0x56, 0x06, 0x0C, 0xDA, - 0x24, 0x00, 0x02, 0x10, 0x16, 0x00, 0x02, 0x00, - 0x01, 0x04, 0x08, 0x07, 0x0C, 0xDA, 0x20, 0x00, - 0x03, 0x10, 0x12, 0x00, 0x03, 0x00, 0x4E, 0xD9, - 0x14, 0x8E, 0x20, 0x00, 0x04, 0x10, 0x12, 0x00, - 0x04, 0x00, 0xD2, 0xCE, 0x20, 0x00, 0x05, 0xE0, - 0x12, 0x00, 0x05, 0x00, 0xD2, 0xCE, 0x20, 0x00, - 0x06, 0xE0, 0x12, 0x00, 0x06, 0x00, 0xE8, 0xDD, - 0x12, 0x00, 0x01, 0xE0, 0x6C, 0x09, 0xCC, 0x06, - 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x30, 0x06, - 0x42, 0xDC, 0xF0, 0x05, 0x00, 0xE0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xE2, 0x05, 0x08, 0x00, - 0x26, 0xFF, 0xDC, 0x05, 0x00, 0x00, 0x30, 0x06, - 0xF8, 0xDB, 0x1E, 0x00, 0x01, 0xE0, 0x10, 0x00, - 0x11, 0x30, 0x0C, 0x04, 0x01, 0x00, 0x0E, 0x04, - 0x02, 0x00, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00, - 0x30, 0x06, 0x32, 0xDD, 0x12, 0x00, 0x01, 0xE0, - 0x04, 0x00, 0x13, 0x30, 0x74, 0xDE, 0x3E, 0x00, - 0x00, 0xE0, 0x00, 0xC0, 0x00, 0x00, 0x02, 0x00, - 0x30, 0x00, 0x20, 0x50, 0x23, 0x0C, 0xFC, 0x05, - 0x52, 0x06, 0x56, 0x06, 0x00, 0x00, 0x00, 0x81, - 0x16, 0x00, 0x00, 0xE0, 0x00, 0xC0, 0x00, 0x00, - 0x10, 0x00, 0x08, 0x00, 0x2A, 0x40, 0x2A, 0x04, - 0x56, 0x06, 0x26, 0x00, 0x19, 0xED, 0x2B, 0x06, - 0x72, 0x09, 0x22, 0x00, 0x24, 0x00, 0x2F, 0xED, - 0x23, 0x0C, 0xFC, 0x05, 0x28, 0x08, 0x34, 0x09, - 0x29, 0x08, 0x58, 0x07, 0x78, 0x07, 0x98, 0x07, - 0x23, 0x00, 0x2A, 0x00, 0x3D, 0xED, 0x06, 0x04, - 0xF0, 0x06, 0x07, 0x04, 0xEE, 0x06, 0x24, 0x00, - 0xD2, 0xCE, 0x34, 0x00, 0x00, 0xE0, 0x00, 0xC0, - 0x00, 0x00, 0x10, 0x00, 0x26, 0x00, 0x25, 0x40, - 0xD2, 0xCE, 0x20, 0x00, 0x00, 0xE0, 0x00, 0xC0, - 0x00, 0x00, 0x10, 0x00, 0x12, 0x00, 0x26, 0x40, - 0xD2, 0xCE, 0x1A, 0x00, 0x00, 0xE0, 0x0C, 0x00, - 0x27, 0x60, 0x0A, 0x08, 0xE6, 0x06, 0xD2, 0xCE, - 0x24, 0x00, 0x00, 0xE0, 0x16, 0x00, 0x28, 0x60, - 0x30, 0x04, 0x06, 0x07, 0x52, 0xCF, 0x00, 0x81, - 0x30, 0x00, 0x00, 0xE0, 0x22, 0x00, 0x29, 0x60, - 0x2D, 0x08, 0x1C, 0x07, 0x2E, 0x08, 0x22, 0x07, - 0x00, 0x00, 0x08, 0x02, 0x06, 0x01, 0x14, 0x06, - 0x18, 0x08, 0x20, 0x0C, 0x26, 0x0E, 0x30, 0x0F, - 0x34, 0x11, 0x3E, 0x12, 0x42, 0x14, 0x46, 0x16, - 0x1C, 0x0A, 0x4A, 0x18, 0x13, 0x03, 0x11, 0x83, - 0x01, 0x11, 0x11, 0x81, 0x12, 0x81, 0x13, 0x01, - 0x52, 0x83, 0x81, 0x85, 0x85, 0x11, 0x12, 0x81, - 0x12, 0x81, 0x19, 0x81, 0x60, 0x85, 0x00, 0xC0, - 0x00, 0x00, 0x08, 0x00, 0x6C, 0x09, 0x00, 0x00, - 0x30, 0x06, 0x08, 0xE5, 0x54, 0x06, 0x50, 0x06, - 0x38, 0x02, 0x21, 0x04, 0x1E, 0x09, 0x0B, 0x06, - 0xD8, 0x06, 0x02, 0x08, 0xDC, 0x06, 0x00, 0xC0, - 0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0x00, 0x41, 0x00, - 0x14, 0xAE, 0x00, 0x00, 0x00, 0x81, 0x09, 0x04, - 0x0C, 0x07, 0x41, 0x00, 0x41, 0x00, 0x14, 0x02, - 0x00, 0x00, 0x00, 0x81, 0x0B, 0x06, 0xD8, 0x06, - 0x2C, 0x06, 0x76, 0x09, 0x22, 0x14, 0x3A, 0x09, - 0x41, 0x00, 0x41, 0x00, 0x54, 0x02, 0x00, 0x00, - 0x00, 0x81, 0xD8, 0x06, 0x00, 0x84, 0x00, 0x48, - 0xFC, 0xFF, 0x09, 0x00, 0x00, 0xC0, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xB8, 0xFF, 0x20, 0x00, - 0x43, 0x28, 0x31, 0x29, 0x38, 0x39, 0x2D, 0x33, - 0x39, 0x38, 0x39, 0x2C, 0x2D, 0x30, 0x38, 0x39, - 0x54, 0x20, 0x78, 0x65, 0x73, 0x61, 0x49, 0x20, - 0x73, 0x6E, 0x72, 0x74, 0x6D, 0x75, 0x6E, 0x65, - 0x73, 0x74, 0x28, 0x0A, 0x29, 0x43, 0x39, 0x31, - 0x33, 0x38, 0x34, 0x2C, 0x35, 0x2C, 0x36, 0x2C, - 0x49, 0x20, 0x4D, 0x42, 0x43, 0x20, 0x72, 0x6F, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xF8, 0xFF, 0x01, 0x00, 0x34, 0x90, - 0x00, 0x00, 0xFA, 0xFF, 0x01, 0x00, 0xB8, 0xFF, - 0x00, 0x00, 0xFC, 0xFF, 0x02, 0x00, 0x80, 0x00, - 0x3E, 0xA0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 -}; -#endif /* CONFIG_SKTR */ diff --git a/drivers/net/tokenring/tms380tr.c b/drivers/net/tokenring/tms380tr.c new file mode 100644 index 000000000..0a0da8840 --- /dev/null +++ b/drivers/net/tokenring/tms380tr.c @@ -0,0 +1,2749 @@ +/* + * tms380tr.c: A network driver for Texas Instruments TMS380-based + * Token Ring Adapters. + * + * Originally sktr.c: Written 1997 by Christoph Goos + * + * A fine result of the Linux Systems Network Architecture Project. + * http://www.linux-sna.org + * + * This software may be used and distributed according to the terms + * of the GNU Public License, incorporated herein by reference. + * + * This device driver works with the following TMS380 adapters: + * - SysKonnect TR4/16(+) ISA (SK-4190) + * - SysKonnect TR4/16(+) PCI (SK-4590) + * - SysKonnect TR4/16 PCI (SK-4591) + * - Compaq TR 4/16 PCI + * - Thomas-Conrad TC4048 4/16 PCI + * - Any ISA or PCI adapter using only the TMS380 chipset + * + * Sources: + * - The hardware related parts of this driver are take from + * the SysKonnect Token Ring driver for Windows NT. + * - I used the IBM Token Ring driver 'ibmtr.c' as a base for this + * driver, as well as the 'skeleton.c' driver by Donald Becker. + * - Also various other drivers in the linux source tree were taken + * as samples for some tasks. + * - TI TMS380 Second-Generation Token Ring User's Guide + * - TI datasheets for respective chips + * - David Hein at Texas Instruments + * + * Maintainer(s): + * JS Jay Schulist jschlst@samba.anu.edu.au + * CG Christoph Goos cgoos@syskonnect.de + * AF Adam Fritzler mid@auk.cx + * + * Modification History: + * 29-Aug-97 CG Created + * 04-Apr-98 CG Fixed problems caused by tok_timer_check + * 10-Apr-98 CG Fixed lockups at cable disconnection + * 27-May-98 JS Formated to Linux Kernel Format + * 31-May-98 JS Hacked in PCI support + * 16-Jun-98 JS Modulized for multiple cards with one driver + * Sep-99 AF Renamed to tms380tr (supports more than SK's) + * 23-Sep-99 AF Added Compaq and Thomas-Conrad PCI support + * Fixed a bug causing double copies on PCI + * Fixed for new multicast stuff (2.2/2.3) + * 25-Sep-99 AF Uped TPL_NUM from 3 to 9 + * Removed extraneous 'No free TPL' + * + * To do: + * 1. Selectable 16 Mbps or 4Mbps + * 2. Multi/Broadcast packet handling (this may have fixed itself) + * + */ + +static const char *version = "tms380tr.c: v1.03 29/09/1999 by Christoph Goos, Adam Fritzler\n"; + +#ifdef MODULE +#include <linux/module.h> +#include <linux/version.h> +#endif + +#include <linux/kernel.h> +#include <linux/sched.h> +#include <linux/types.h> +#include <linux/fcntl.h> +#include <linux/interrupt.h> +#include <linux/ptrace.h> +#include <linux/ioport.h> +#include <linux/in.h> +#include <linux/malloc.h> +#include <linux/string.h> +#include <linux/time.h> +#include <asm/system.h> +#include <asm/bitops.h> +#include <asm/io.h> +#include <asm/dma.h> +#include <asm/irq.h> +#include <linux/errno.h> +#include <linux/init.h> +#include <linux/pci.h> + +#include <linux/netdevice.h> +#include <linux/etherdevice.h> +#include <linux/skbuff.h> +#include <linux/trdevice.h> + +#include "tms380tr.h" /* Our Stuff */ +#include "tms380tr_microcode.h" /* TI microcode for COMMprocessor */ + +/* A zero-terminated list of I/O addresses to be probed. */ +static unsigned int tms380tr_portlist[] __initdata = { + 0x0A20, 0x1A20, 0x0B20, 0x1B20, 0x0980, 0x1980, 0x0900, 0x1900, + 0 +}; + +/* A zero-terminated list of IRQs to be probed. + * Used again after initial probe for tms380tr_chipset_init, called from tms380tr_open. + */ +static unsigned short tms380tr_irqlist[] = { + 3, 5, 9, 10, 11, 12, 15, + 0 +}; + +/* A zero-terminated list of DMAs to be probed. */ +static int tms380tr_dmalist[] __initdata = { + 5, 6, 7, + 0 +}; + +/* + * Table used for card detection and type determination. + */ +struct cardinfo_table cardinfo[] = { + { 0, 0, 0, + "Unknown TMS380 Token Ring Adapter"}, + { TMS_ISA, 0, 0, + "SK NET TR 4/16 ISA"}, + { TMS_PCI, PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_TOKENRING, + "Compaq 4/16 TR PCI"}, + { TMS_PCI, PCI_VENDOR_ID_SK, PCI_DEVICE_ID_SK_TR, + "SK NET TR 4/16 PCI"}, + { TMS_PCI, PCI_VENDOR_ID_TCONRAD, PCI_DEVICE_ID_TCONRAD_TOKENRING, + "Thomas-Conrad TC4048 PCI 4/16"}, + { 0, 0, 0, NULL} +}; + +/* Use 0 for production, 1 for verification, 2 for debug, and + * 3 for very verbose debug. + */ +#ifndef TMS380TR_DEBUG +#define TMS380TR_DEBUG 0 +#endif +static unsigned int tms380tr_debug = TMS380TR_DEBUG; + +/* The number of low I/O ports used by the tokencard. */ +#define TMS380TR_IO_EXTENT 32 + +/* Index to functions, as function prototypes. + * Alphabetical by function name. + */ + +/* "B" */ +static int tms380tr_bringup_diags(struct net_device *dev); +/* "C" */ +static void tms380tr_cancel_tx_queue(struct net_local* tp); +static int tms380tr_chipset_init(struct net_device *dev); +static void tms380tr_chk_irq(struct net_device *dev); +static unsigned char tms380tr_chk_frame(struct net_device *dev, unsigned char *Addr); +static void tms380tr_chk_outstanding_cmds(struct net_device *dev); +static void tms380tr_chk_src_addr(unsigned char *frame, unsigned char *hw_addr); +static unsigned char tms380tr_chk_ssb(struct net_local *tp, unsigned short IrqType); +static int tms380tr_close(struct net_device *dev); +static void tms380tr_cmd_status_irq(struct net_device *dev); +/* "D" */ +static void tms380tr_disable_interrupts(struct net_device *dev); +#if TMS380TR_DEBUG > 0 +static void tms380tr_dump(unsigned char *Data, int length); +#endif +/* "E" */ +static void tms380tr_enable_interrupts(struct net_device *dev); +static void tms380tr_exec_cmd(struct net_device *dev, unsigned short Command); +static void tms380tr_exec_sifcmd(struct net_device *dev, unsigned int WriteValue); +/* "F" */ +/* "G" */ +static struct enet_statistics *tms380tr_get_stats(struct net_device *dev); +/* "H" */ +static void tms380tr_hardware_send_packet(struct net_device *dev, + struct net_local* tp); +/* "I" */ +static int tms380tr_init_adapter(struct net_device *dev); +static int tms380tr_init_card(struct net_device *dev); +static void tms380tr_init_ipb(struct net_local *tp); +static void tms380tr_init_net_local(struct net_device *dev); +static void tms380tr_init_opb(struct net_local *tp); +static void tms380tr_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static int tms380tr_isa_chk_card(struct net_device *dev, int ioaddr, struct cardinfo_table **outcard); +static int tms380tr_isa_chk_ioaddr(int ioaddr); +/* "O" */ +static int tms380tr_open(struct net_device *dev); +static void tms380tr_open_adapter(struct net_device *dev); +/* "P" */ +static int tms380tr_pci_chk_card(struct net_device *dev, struct cardinfo_table **outcard); +int tms380tr_probe(struct net_device *dev); +static int tms380tr_probe1(struct net_device *dev, int ioaddr); +/* "R" */ +static void tms380tr_rcv_status_irq(struct net_device *dev); +static void tms380tr_read_addr(struct net_device *dev, unsigned char *Address); +static int tms380tr_read_ptr(struct net_device *dev); +static void tms380tr_read_ram(struct net_device *dev, unsigned char *Data, + unsigned short Address, int Length); +static int tms380tr_reset_adapter(struct net_device *dev); +static void tms380tr_reset_interrupt(struct net_device *dev); +static void tms380tr_ring_status_irq(struct net_device *dev); +/* "S" */ +static int tms380tr_send_packet(struct sk_buff *skb, struct net_device *dev); +static void tms380tr_set_multicast_list(struct net_device *dev); +/* "T" */ +static void tms380tr_timer_chk(unsigned long data); +static void tms380tr_timer_end_wait(unsigned long data); +static void tms380tr_tx_status_irq(struct net_device *dev); +/* "U" */ +static void tms380tr_update_rcv_stats(struct net_local *tp, + unsigned char DataPtr[], unsigned int Length); +/* "W" */ +static void tms380tr_wait(unsigned long time); +static void tms380tr_write_rpl_status(RPL *rpl, unsigned int Status); +static void tms380tr_write_tpl_status(TPL *tpl, unsigned int Status); + +/* + * Check for a network adapter of this type, and return '0' if one exists. + * If dev->base_addr == 0, probe all likely locations. + * If dev->base_addr == 1, always return failure. + */ +int __init tms380tr_probe(struct net_device *dev) +{ + int i; + int base_addr = dev ? dev->base_addr : 0; + + if(base_addr > 0x1ff) /* Check a single specified location. */ + return (tms380tr_probe1(dev, base_addr)); + else if(base_addr != 0) /* Don't probe at all. */ + return (-ENXIO); + + for(i = 0; tms380tr_portlist[i]; i++) + { + int ioaddr = tms380tr_portlist[i]; + if(check_region(ioaddr, TMS380TR_IO_EXTENT)) + continue; + if(tms380tr_probe1(dev, ioaddr)) + { +#ifndef MODULE + tr_freedev(dev); +#endif + } + else + return (0); + } + + return (-ENODEV); +} + +struct cardinfo_table * __init tms380tr_pci_getcardinfo(unsigned short vendor, + unsigned short device) +{ + int cur; + + for (cur = 1; cardinfo[cur].name != NULL; cur++) { + if (cardinfo[cur].type == 2) /* PCI */ + { + if ((cardinfo[cur].vendor_id == vendor) && (cardinfo[cur].device_id == device)) + return &cardinfo[cur]; + } + } + + return NULL; +} + +/* + * Detect and setup the PCI SysKonnect TR cards in slot order. + */ +static int __init tms380tr_pci_chk_card(struct net_device *dev, + struct cardinfo_table **outcard) +{ + static int pci_index = 0; + unsigned char pci_bus, pci_device_fn; + struct cardinfo_table *card; + int i; + + if(!pci_present()) + return (-1); /* No PCI present. */ + + for(; pci_index < 0xff; pci_index++) + { + unsigned int pci_irq_line; + struct pci_dev *pdev; + unsigned short pci_command, new_command, vendor, device; + unsigned int pci_ioaddr; + + if(pcibios_find_class(PCI_CLASS_NETWORK_TOKEN_RING << 8, + pci_index, &pci_bus, &pci_device_fn) + != PCIBIOS_SUCCESSFUL) + { + break; + } + + pcibios_read_config_word(pci_bus, pci_device_fn, + PCI_VENDOR_ID, &vendor); + pcibios_read_config_word(pci_bus, pci_device_fn, + PCI_DEVICE_ID, &device); + + pdev = pci_find_slot(pci_bus, pci_device_fn); + pci_irq_line = pdev->irq; + pci_ioaddr = pdev->resource[0].start; + + pcibios_read_config_word(pci_bus, pci_device_fn, + PCI_COMMAND, &pci_command); + + /* Remove I/O space marker in bit 0. */ + pci_ioaddr &= ~3; + + if (!(card = tms380tr_pci_getcardinfo(vendor, device))) + return -ENODEV; + + if(check_region(pci_ioaddr, TMS380TR_IO_EXTENT)) + continue; + request_region(pci_ioaddr, TMS380TR_IO_EXTENT, card->name); + if(request_irq(pdev->irq, tms380tr_interrupt, SA_SHIRQ, + card->name, dev)) + return (-ENODEV); /* continue; ?? */ + + new_command = (pci_command|PCI_COMMAND_MASTER|PCI_COMMAND_IO); + + if(pci_command != new_command) + { + printk("The PCI BIOS has not enabled this" + "device! Updating PCI command %4.4x->%4.4x.\n", + pci_command, new_command); + pcibios_write_config_word(pci_bus, pci_device_fn, + PCI_COMMAND, new_command); + } + + /* At this point we have found a valid PCI TR card. */ + dev->base_addr = pci_ioaddr; + dev->irq = pci_irq_line; + dev->dma = 0; + + dev->addr_len = 6; + tms380tr_read_addr(dev, (unsigned char*)dev->dev_addr); + + printk("%s: %s found at %#4x, IRQ %d, ring station ", + dev->name, card->name, pci_ioaddr, dev->irq); + printk("%2.2x", dev->dev_addr[0]); + for (i = 1; i < 6; i++) + printk(":%2.2x", dev->dev_addr[i]); + printk(".\n"); + + if (outcard) + *outcard = card; + + return (0); + } + + return (-1); +} + +/* + * Detect and setup the ISA SysKonnect TR cards. + */ +static int __init tms380tr_isa_chk_card(struct net_device *dev, int ioaddr, + struct cardinfo_table **outcard) +{ + int i, err; + unsigned long flags; + struct cardinfo_table *card = NULL; + + err = tms380tr_isa_chk_ioaddr(ioaddr); + if(err < 0) + return (-ENODEV); + + if(virt_to_bus((void*)((unsigned long)dev->priv+sizeof(struct net_local))) + > ISA_MAX_ADDRESS) + { + printk("%s: Memory not accessible for DMA\n", dev->name); + kfree(dev->priv); + return (-EAGAIN); + } + + /* FIXME */ + card = &cardinfo[1]; + + /* Grab the region so that no one else tries to probe our ioports. */ + request_region(ioaddr, TMS380TR_IO_EXTENT, card->name); + dev->base_addr = ioaddr; + + /* Autoselect IRQ and DMA if dev->irq == 0 */ + if(dev->irq == 0) + { + for(i = 0; tms380tr_irqlist[i] != 0; i++) + { + dev->irq = tms380tr_irqlist[i]; + err = request_irq(dev->irq, &tms380tr_interrupt, 0, card->name, dev); + if(!err) + break; + } + + if(tms380tr_irqlist[i] == 0) + { + printk("%s: AutoSelect no IRQ available\n", dev->name); + return (-EAGAIN); + } + } + else + { + err = request_irq(dev->irq, &tms380tr_interrupt, 0, card->name, dev); + if(err) + { + printk("%s: Selected IRQ not available\n", dev->name); + return (-EAGAIN); + } + } + + /* Always allocate the DMA channel after IRQ and clean up on failure */ + if(dev->dma == 0) + { + for(i = 0; tms380tr_dmalist[i] != 0; i++) + { + dev->dma = tms380tr_dmalist[i]; + err = request_dma(dev->dma, card->name); + if(!err) + break; + } + + if(dev->dma == 0) + { + printk("%s: AutoSelect no DMA available\n", dev->name); + free_irq(dev->irq, NULL); + return (-EAGAIN); + } + } + else + { + err = request_dma(dev->dma, card->name); + if(err) + { + printk("%s: Selected DMA not available\n", dev->name); + free_irq(dev->irq, NULL); + return (-EAGAIN); + } + } + + flags=claim_dma_lock(); + disable_dma(dev->dma); + set_dma_mode(dev->dma, DMA_MODE_CASCADE); + enable_dma(dev->dma); + release_dma_lock(flags); + + printk("%s: %s found at %#4x, using IRQ %d and DMA %d.\n", + dev->name, card->name, ioaddr, dev->irq, dev->dma); + + if (outcard) + *outcard = card; + + return (0); +} + +static int __init tms380tr_probe1(struct net_device *dev, int ioaddr) +{ + static unsigned version_printed = 0; + struct net_local *tp; + int err; + struct cardinfo_table *card = NULL; + + if(tms380tr_debug && version_printed++ == 0) + printk(KERN_INFO "%s", version); + +#ifndef MODULE + dev = init_trdev(dev, 0); + if(dev == NULL) + return (-ENOMEM); +#endif + + err = tms380tr_pci_chk_card(dev, &card); + if(err < 0) + { + err = tms380tr_isa_chk_card(dev, ioaddr, &card); + if(err < 0) + return (-ENODEV); + } + + /* Setup this devices private information structure */ + tp = (struct net_local *)kmalloc(sizeof(struct net_local), GFP_KERNEL | GFP_DMA); + if(tp == NULL) + return (-ENOMEM); + memset(tp, 0, sizeof(struct net_local)); + init_waitqueue_head(&tp->wait_for_tok_int); + tp->CardType = card; + + dev->priv = tp; + dev->init = tms380tr_init_card; + dev->open = tms380tr_open; + dev->stop = tms380tr_close; + dev->hard_start_xmit = tms380tr_send_packet; + dev->get_stats = tms380tr_get_stats; + dev->set_multicast_list = &tms380tr_set_multicast_list; + + return (0); +} + +/* Dummy function */ +static int __init tms380tr_init_card(struct net_device *dev) +{ + if(tms380tr_debug > 3) + printk("%s: tms380tr_init_card\n", dev->name); + + return (0); +} + +/* + * This function tests if an adapter is really installed at the + * given I/O address. Return negative if no adapter at IO addr. + */ +static int __init tms380tr_isa_chk_ioaddr(int ioaddr) +{ + unsigned char old, chk1, chk2; + + old = inb(ioaddr + SIFADR); /* Get the old SIFADR value */ + + chk1 = 0; /* Begin with check value 0 */ + do { + /* Write new SIFADR value */ + outb(chk1, ioaddr + SIFADR); + + /* Read, invert and write */ + chk2 = inb(ioaddr + SIFADD); + chk2 ^= 0x0FE; + outb(chk2, ioaddr + SIFADR); + + /* Read, invert and compare */ + chk2 = inb(ioaddr + SIFADD); + chk2 ^= 0x0FE; + + if(chk1 != chk2) + return (-1); /* No adapter */ + + chk1 -= 2; + } while(chk1 != 0); /* Repeat 128 times (all byte values) */ + + /* Restore the SIFADR value */ + outb(old, ioaddr + SIFADR); + + return (0); +} + +/* + * Open/initialize the board. This is called sometime after + * booting when the 'ifconfig' program is run. + * + * This routine should set everything up anew at each open, even + * registers that "should" only need to be set once at boot, so that + * there is non-reboot way to recover if something goes wrong. + */ +static int tms380tr_open(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + int err; + + /* Reset the hardware here. Don't forget to set the station address. */ + err = tms380tr_chipset_init(dev); + if(err) + { + printk(KERN_INFO "%s: Chipset initialization error\n", + dev->name); + return (-1); + } + + init_timer(&tp->timer); + tp->timer.expires = jiffies + 30*HZ; + tp->timer.function = tms380tr_timer_end_wait; + tp->timer.data = (unsigned long)dev; + tp->timer.next = NULL; + tp->timer.prev = NULL; + add_timer(&tp->timer); + + printk(KERN_INFO "%s: Adapter RAM size: %dK\n", + dev->name, tms380tr_read_ptr(dev)); + tms380tr_enable_interrupts(dev); + tms380tr_open_adapter(dev); + + dev->tbusy = 0; + dev->interrupt = 0; + dev->start = 0; + + /* Wait for interrupt from hardware. If interrupt does not come, + * there will be a timeout from the timer. + */ + tp->Sleeping = 1; + interruptible_sleep_on(&tp->wait_for_tok_int); + del_timer(&tp->timer); + + /* If AdapterVirtOpenFlag is 1, the adapter is now open for use */ + if(tp->AdapterVirtOpenFlag == 0) + { + tms380tr_disable_interrupts(dev); + return (-1); + } + + dev->start = 1; + + tp->StartTime = jiffies; + + /* Start function control timer */ + tp->timer.expires = jiffies + 2*HZ; + tp->timer.function = tms380tr_timer_chk; + tp->timer.data = (unsigned long)dev; + add_timer(&tp->timer); + +#ifdef MODULE + MOD_INC_USE_COUNT; +#endif + + return (0); +} + +/* + * Timeout function while waiting for event + */ +static void tms380tr_timer_end_wait(unsigned long data) +{ + struct net_device *dev = (struct net_device*)data; + struct net_local *tp = (struct net_local *)dev->priv; + + if(tp->Sleeping) + { + tp->Sleeping = 0; + wake_up_interruptible(&tp->wait_for_tok_int); + } + + return; +} + +/* + * Initialize the chipset + */ +static int tms380tr_chipset_init(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned char PosReg, Tmp; + int i, err; + + tms380tr_init_ipb(tp); + tms380tr_init_opb(tp); + tms380tr_init_net_local(dev); + + /* Set pos register: selects irq and dma channel. + * Only for ISA bus adapters. + */ + if(dev->dma > 0) + { + PosReg = 0; + for(i = 0; tms380tr_irqlist[i] != 0; i++) + { + if(tms380tr_irqlist[i] == dev->irq) + break; + } + + /* Choose default cycle time, 500 nsec */ + PosReg |= CYCLE_TIME << 2; + PosReg |= i << 4; + i = dev->dma - 5; + PosReg |= i; + + if(tp->DataRate == SPEED_4) + PosReg |= LINE_SPEED_BIT; + else + PosReg &= ~LINE_SPEED_BIT; + + outb(PosReg, dev->base_addr + POSREG); + Tmp = inb(dev->base_addr + POSREG); + if((Tmp & ~CYCLE_TIME) != (PosReg & ~CYCLE_TIME)) + printk(KERN_INFO "%s: POSREG error\n", dev->name); + } + + err = tms380tr_reset_adapter(dev); + if(err < 0) + return (-1); + + err = tms380tr_bringup_diags(dev); + if(err < 0) + return (-1); + + err = tms380tr_init_adapter(dev); + if(err < 0) + return (-1); + + return (0); +} + +/* + * Initializes the net_local structure. + */ +static void tms380tr_init_net_local(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + int i; + + tp->scb.CMD = 0; + tp->scb.Parm[0] = 0; + tp->scb.Parm[1] = 0; + + tp->ssb.STS = 0; + tp->ssb.Parm[0] = 0; + tp->ssb.Parm[1] = 0; + tp->ssb.Parm[2] = 0; + + tp->CMDqueue = 0; + + tp->AdapterOpenFlag = 0; + tp->AdapterVirtOpenFlag = 0; + tp->ScbInUse = 0; + tp->OpenCommandIssued = 0; + tp->ReOpenInProgress = 0; + tp->HaltInProgress = 0; + tp->TransmitHaltScheduled = 0; + tp->LobeWireFaultLogged = 0; + tp->LastOpenStatus = 0; + tp->MaxPacketSize = DEFAULT_PACKET_SIZE; + + skb_queue_head_init(&tp->SendSkbQueue); + tp->QueueSkb = MAX_TX_QUEUE; + + /* Create circular chain of transmit lists */ + for (i = 0; i < TPL_NUM; i++) + { + tp->Tpl[i].NextTPLAddr = htonl((unsigned long) virt_to_bus(&tp->Tpl[(i+1) % TPL_NUM])); + tp->Tpl[i].Status = 0; + tp->Tpl[i].FrameSize = 0; + tp->Tpl[i].FragList[0].DataCount = 0; + tp->Tpl[i].FragList[0].DataAddr = 0; + tp->Tpl[i].NextTPLPtr = &tp->Tpl[(i+1) % TPL_NUM]; + tp->Tpl[i].MData = NULL; + tp->Tpl[i].TPLIndex = i; + tp->Tpl[i].BusyFlag = 0; + } + + tp->TplFree = tp->TplBusy = &tp->Tpl[0]; + + /* Create circular chain of receive lists */ + for (i = 0; i < RPL_NUM; i++) + { + tp->Rpl[i].NextRPLAddr = htonl((unsigned long) virt_to_bus(&tp->Rpl[(i+1) % RPL_NUM])); + tp->Rpl[i].Status = (RX_VALID | RX_START_FRAME | RX_END_FRAME | RX_FRAME_IRQ); + tp->Rpl[i].FrameSize = 0; + tp->Rpl[i].FragList[0].DataCount = SWAPB(tp->MaxPacketSize); + + /* Alloc skb and point adapter to data area */ + tp->Rpl[i].Skb = dev_alloc_skb(tp->MaxPacketSize); + + /* skb == NULL ? then use local buffer */ + if(tp->Rpl[i].Skb == NULL) + { + tp->Rpl[i].SkbStat = SKB_UNAVAILABLE; + tp->Rpl[i].FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[i])); + tp->Rpl[i].MData = tp->LocalRxBuffers[i]; + } + else /* SKB != NULL */ + { + tp->Rpl[i].Skb->dev = dev; + skb_put(tp->Rpl[i].Skb, tp->MaxPacketSize); + + /* data unreachable for DMA ? then use local buffer */ + if(tp->CardType->type == TMS_ISA && virt_to_bus(tp->Rpl[i].Skb->data) + tp->MaxPacketSize > ISA_MAX_ADDRESS) + { + tp->Rpl[i].SkbStat = SKB_DATA_COPY; + tp->Rpl[i].FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[i])); + tp->Rpl[i].MData = tp->LocalRxBuffers[i]; + } + else /* DMA directly in skb->data */ + { + tp->Rpl[i].SkbStat = SKB_DMA_DIRECT; + tp->Rpl[i].FragList[0].DataAddr = htonl(virt_to_bus(tp->Rpl[i].Skb->data)); + tp->Rpl[i].MData = tp->Rpl[i].Skb->data; + } + } + + tp->Rpl[i].NextRPLPtr = &tp->Rpl[(i+1) % RPL_NUM]; + tp->Rpl[i].RPLIndex = i; + } + + tp->RplHead = &tp->Rpl[0]; + tp->RplTail = &tp->Rpl[RPL_NUM-1]; + tp->RplTail->Status = (RX_START_FRAME | RX_END_FRAME | RX_FRAME_IRQ); + + return; +} + +/* + * Initializes the initialisation parameter block. + */ +static void tms380tr_init_ipb(struct net_local *tp) +{ + tp->ipb.Init_Options = BURST_MODE; + tp->ipb.CMD_Status_IV = 0; + tp->ipb.TX_IV = 0; + tp->ipb.RX_IV = 0; + tp->ipb.Ring_Status_IV = 0; + tp->ipb.SCB_Clear_IV = 0; + tp->ipb.Adapter_CHK_IV = 0; + tp->ipb.RX_Burst_Size = BURST_SIZE; + tp->ipb.TX_Burst_Size = BURST_SIZE; + tp->ipb.DMA_Abort_Thrhld = DMA_RETRIES; + tp->ipb.SCB_Addr = 0; + tp->ipb.SSB_Addr = 0; + + return; +} + +/* + * Initializes the open parameter block. + */ +static void tms380tr_init_opb(struct net_local *tp) +{ + unsigned long Addr; + unsigned short RplSize = RPL_SIZE; + unsigned short TplSize = TPL_SIZE; + unsigned short BufferSize = BUFFER_SIZE; + + tp->ocpl.OPENOptions = 0; + tp->ocpl.OPENOptions |= ENABLE_FULL_DUPLEX_SELECTION; + tp->ocpl.FullDuplex = 0; + tp->ocpl.FullDuplex |= OPEN_FULL_DUPLEX_OFF; + + /* Fixme: If mac address setable: + * for (i=0; i<LENGTH_OF_ADDRESS; i++) + * mac->Vam->ocpl.NodeAddr[i] = mac->CurrentAddress[i]; + */ + + tp->ocpl.GroupAddr = 0; + tp->ocpl.FunctAddr = 0; + tp->ocpl.RxListSize = SWAPB(RplSize); + tp->ocpl.TxListSize = SWAPB(TplSize); + tp->ocpl.BufSize = SWAPB(BufferSize); + tp->ocpl.Reserved = 0; + tp->ocpl.TXBufMin = TX_BUF_MIN; + tp->ocpl.TXBufMax = TX_BUF_MAX; + + Addr = htonl(virt_to_bus(tp->ProductID)); + + tp->ocpl.ProdIDAddr[0] = LOWORD(Addr); + tp->ocpl.ProdIDAddr[1] = HIWORD(Addr); + + return; +} + +/* + * Send OPEN command to adapter + */ +static void tms380tr_open_adapter(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + + if(tp->OpenCommandIssued) + return; + + tp->OpenCommandIssued = 1; + tms380tr_exec_cmd(dev, OC_OPEN); + + return; +} + +/* + * Clear the adapter's interrupt flag. Clear system interrupt enable + * (SINTEN): disable adapter to system interrupts. + */ +static void tms380tr_disable_interrupts(struct net_device *dev) +{ + outb(0, dev->base_addr + SIFACL); + + return; +} + +/* + * Set the adapter's interrupt flag. Set system interrupt enable + * (SINTEN): enable adapter to system interrupts. + */ +static void tms380tr_enable_interrupts(struct net_device *dev) +{ + outb(ACL_SINTEN, dev->base_addr + SIFACL); + + return; +} + +/* + * Put command in command queue, try to execute it. + */ +static void tms380tr_exec_cmd(struct net_device *dev, unsigned short Command) +{ + struct net_local *tp = (struct net_local *)dev->priv; + + tp->CMDqueue |= Command; + tms380tr_chk_outstanding_cmds(dev); + + return; +} + +/* + * Gets skb from system, queues it and checks if it can be sent + */ +static int tms380tr_send_packet(struct sk_buff *skb, struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + + if(dev->tbusy) + { + /* + * If we get here, some higher level has decided we are broken. + * There should really be a "kick me" function call instead. + * + * Resetting the token ring adapter takes a long time so just + * fake transmission time and go on trying. Our own timeout + * routine is in tms380tr_timer_chk() + */ + dev->tbusy = 0; + dev->trans_start = jiffies; + return (1); + } + + /* + * If some higher layer thinks we've missed an tx-done interrupt we + * are passed NULL. + */ + if(skb == NULL) + return (0); + + /* + * Block a timer-based transmit from overlapping. This could better be + * done with atomic_swap(1, dev->tbusy), but set_bit() works as well. + */ + if(test_and_set_bit(0, (void*)&dev->tbusy) != 0) + { + printk("%s: Transmitter access conflict.\n", dev->name); + return (1); + } + + if(tp->QueueSkb == 0) + return (1); /* Return with tbusy set: queue full */ + + tp->QueueSkb--; + skb_queue_tail(&tp->SendSkbQueue, skb); + tms380tr_hardware_send_packet(dev, tp); + if(tp->QueueSkb > 0) + dev->tbusy = 0; + + return (0); +} + +/* + * Move frames from internal skb queue into adapter tx queue + */ +static void tms380tr_hardware_send_packet(struct net_device *dev, struct net_local* tp) +{ + TPL *tpl; + short length; + unsigned char *buf, *newbuf; + struct sk_buff *skb; + int i; + + for(;;) + { + /* Try to get a free TPL from the chain. + * + * NOTE: We *must* always leave one unused TPL in the chain, + * because otherwise the adapter might send frames twice. + */ + if(tp->TplFree->NextTPLPtr->BusyFlag) /* No free TPL */ + { + if (tms380tr_debug > 0) + printk(KERN_INFO "%s: No free TPL\n", dev->name); + return; + } + + /* Send first buffer from queue */ + skb = skb_dequeue(&tp->SendSkbQueue); + if(skb == NULL) + return; + + tp->QueueSkb++; + /* Is buffer reachable for Busmaster-DMA? */ + if(tp->CardType->type == TMS_ISA && virt_to_bus((void*)(((long) skb->data) + skb->len)) + > ISA_MAX_ADDRESS) + { + /* Copy frame to local buffer */ + i = tp->TplFree->TPLIndex; + length = skb->len; + buf = tp->LocalTxBuffers[i]; + memcpy(buf, skb->data, length); + newbuf = buf; + } + else + { + /* Send direct from skb->data */ + length = skb->len; + newbuf = skb->data; + } + + /* Source address in packet? */ + tms380tr_chk_src_addr(newbuf, dev->dev_addr); + + tp->LastSendTime = jiffies; + tpl = tp->TplFree; /* Get the "free" TPL */ + tpl->BusyFlag = 1; /* Mark TPL as busy */ + tp->TplFree = tpl->NextTPLPtr; + + /* Save the skb for delayed return of skb to system */ + tpl->Skb = skb; + tpl->FragList[0].DataCount = (unsigned short) SWAPB(length); + tpl->FragList[0].DataAddr = htonl(virt_to_bus(newbuf)); + + /* Write the data length in the transmit list. */ + tpl->FrameSize = (unsigned short) SWAPB(length); + tpl->MData = newbuf; + + /* Transmit the frame and set the status values. */ + tms380tr_write_tpl_status(tpl, TX_VALID | TX_START_FRAME + | TX_END_FRAME | TX_PASS_SRC_ADDR + | TX_FRAME_IRQ); + + /* Let adapter send the frame. */ + tms380tr_exec_sifcmd(dev, CMD_TX_VALID); + } + + return; +} + +/* + * Write the given value to the 'Status' field of the specified TPL. + * NOTE: This function should be used whenever the status of any TPL must be + * modified by the driver, because the compiler may otherwise change the + * order of instructions such that writing the TPL status may be executed at + * an undesireable time. When this function is used, the status is always + * written when the function is called. + */ +static void tms380tr_write_tpl_status(TPL *tpl, unsigned int Status) +{ + tpl->Status = Status; +} + +static void tms380tr_chk_src_addr(unsigned char *frame, unsigned char *hw_addr) +{ + unsigned char SRBit; + + if((((unsigned long)frame[8]) & ~0x80) != 0) /* Compare 4 bytes */ + return; + if((unsigned short)frame[12] != 0) /* Compare 2 bytes */ + return; + + SRBit = frame[8] & 0x80; + memcpy(&frame[8], hw_addr, 6); + frame[8] |= SRBit; + + return; +} + +/* + * The timer routine: Check if adapter still open and working, reopen if not. + */ +static void tms380tr_timer_chk(unsigned long data) +{ + struct net_device *dev = (struct net_device*)data; + struct net_local *tp = (struct net_local*)dev->priv; + + if(tp->HaltInProgress) + return; + + tms380tr_chk_outstanding_cmds(dev); + if(time_before(tp->LastSendTime + SEND_TIMEOUT, jiffies) + && (tp->QueueSkb < MAX_TX_QUEUE || tp->TplFree != tp->TplBusy)) + { + /* Anything to send, but stalled to long */ + tp->LastSendTime = jiffies; + tms380tr_exec_cmd(dev, OC_CLOSE); /* Does reopen automatically */ + } + + tp->timer.expires = jiffies + 2*HZ; + add_timer(&tp->timer); + + if(tp->AdapterOpenFlag || tp->ReOpenInProgress) + return; + tp->ReOpenInProgress = 1; + tms380tr_open_adapter(dev); + + return; +} + +/* + * The typical workload of the driver: Handle the network interface interrupts. + */ +static void tms380tr_interrupt(int irq, void *dev_id, struct pt_regs *regs) +{ + struct net_device *dev = dev_id; + struct net_local *tp; + int ioaddr; + unsigned short irq_type; + + if(dev == NULL) + { + printk("%s: irq %d for unknown device.\n", dev->name, irq); + return; + } + + dev->interrupt = 1; + + ioaddr = dev->base_addr; + tp = (struct net_local *)dev->priv; + + irq_type = inw(ioaddr + SIFSTS); + + while(irq_type & STS_SYSTEM_IRQ) + { + irq_type &= STS_IRQ_MASK; + + if(!tms380tr_chk_ssb(tp, irq_type)) + { + printk(KERN_INFO "%s: DATA LATE occurred\n", dev->name); + break; + } + + switch(irq_type) + { + case STS_IRQ_RECEIVE_STATUS: + tms380tr_reset_interrupt(dev); + tms380tr_rcv_status_irq(dev); + break; + + case STS_IRQ_TRANSMIT_STATUS: + /* Check if TRANSMIT.HALT command is complete */ + if(tp->ssb.Parm[0] & COMMAND_COMPLETE) + { + tp->TransmitCommandActive = 0; + tp->TransmitHaltScheduled = 0; + + /* Issue a new transmit command. */ + tms380tr_exec_cmd(dev, OC_TRANSMIT); + } + + tms380tr_reset_interrupt(dev); + tms380tr_tx_status_irq(dev); + break; + + case STS_IRQ_COMMAND_STATUS: + /* The SSB contains status of last command + * other than receive/transmit. + */ + tms380tr_cmd_status_irq(dev); + break; + + case STS_IRQ_SCB_CLEAR: + /* The SCB is free for another command. */ + tp->ScbInUse = 0; + tms380tr_chk_outstanding_cmds(dev); + break; + + case STS_IRQ_RING_STATUS: + tms380tr_ring_status_irq(dev); + break; + + case STS_IRQ_ADAPTER_CHECK: + tms380tr_chk_irq(dev); + break; + + default: + printk(KERN_INFO "Unknown Token Ring IRQ\n"); + break; + } + + /* Reset system interrupt if not already done. */ + if(irq_type != STS_IRQ_TRANSMIT_STATUS + && irq_type != STS_IRQ_RECEIVE_STATUS) + { + tms380tr_reset_interrupt(dev); + } + + irq_type = inw(ioaddr + SIFSTS); + } + + dev->interrupt = 0; + + return; +} + +/* + * Reset the INTERRUPT SYSTEM bit and issue SSB CLEAR command. + */ +static void tms380tr_reset_interrupt(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + SSB *ssb = &tp->ssb; + + /* + * [Workaround for "Data Late"] + * Set all fields of the SSB to well-defined values so we can + * check if the adapter has written the SSB. + */ + + ssb->STS = (unsigned short) -1; + ssb->Parm[0] = (unsigned short) -1; + ssb->Parm[1] = (unsigned short) -1; + ssb->Parm[2] = (unsigned short) -1; + + /* Free SSB by issuing SSB_CLEAR command after reading IRQ code + * and clear STS_SYSTEM_IRQ bit: enable adapter for further interrupts. + */ + tms380tr_exec_sifcmd(dev, CMD_SSB_CLEAR | CMD_CLEAR_SYSTEM_IRQ); + + return; +} + +/* + * Check if the SSB has actually been written by the adapter. + */ +static unsigned char tms380tr_chk_ssb(struct net_local *tp, unsigned short IrqType) +{ + SSB *ssb = &tp->ssb; /* The address of the SSB. */ + + /* C 0 1 2 INTERRUPT CODE + * - - - - -------------- + * 1 1 1 1 TRANSMIT STATUS + * 1 1 1 1 RECEIVE STATUS + * 1 ? ? 0 COMMAND STATUS + * 0 0 0 0 SCB CLEAR + * 1 1 0 0 RING STATUS + * 0 0 0 0 ADAPTER CHECK + * + * 0 = SSB field not affected by interrupt + * 1 = SSB field is affected by interrupt + * + * C = SSB ADDRESS +0: COMMAND + * 0 = SSB ADDRESS +2: STATUS 0 + * 1 = SSB ADDRESS +4: STATUS 1 + * 2 = SSB ADDRESS +6: STATUS 2 + */ + + /* Check if this interrupt does use the SSB. */ + + if(IrqType != STS_IRQ_TRANSMIT_STATUS + && IrqType != STS_IRQ_RECEIVE_STATUS + && IrqType != STS_IRQ_COMMAND_STATUS + && IrqType != STS_IRQ_RING_STATUS) + { + return (1); /* SSB not involved. */ + } + + /* Note: All fields of the SSB have been set to all ones (-1) after it + * has last been used by the software (see DriverIsr()). + * + * Check if the affected SSB fields are still unchanged. + */ + + if(ssb->STS == (unsigned short) -1) + return (0); /* Command field not yet available. */ + if(IrqType == STS_IRQ_COMMAND_STATUS) + return (1); /* Status fields not always affected. */ + if(ssb->Parm[0] == (unsigned short) -1) + return (0); /* Status 1 field not yet available. */ + if(IrqType == STS_IRQ_RING_STATUS) + return (1); /* Status 2 & 3 fields not affected. */ + + /* Note: At this point, the interrupt is either TRANSMIT or RECEIVE. */ + if(ssb->Parm[1] == (unsigned short) -1) + return (0); /* Status 2 field not yet available. */ + if(ssb->Parm[2] == (unsigned short) -1) + return (0); /* Status 3 field not yet available. */ + + return (1); /* All SSB fields have been written by the adapter. */ +} + +/* + * Evaluates the command results status in the SSB status field. + */ +static void tms380tr_cmd_status_irq(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned short ssb_cmd, ssb_parm_0; + unsigned short ssb_parm_1; + char *open_err = "Open error -"; + char *code_err = "Open code -"; + + /* Copy the ssb values to local variables */ + ssb_cmd = tp->ssb.STS; + ssb_parm_0 = tp->ssb.Parm[0]; + ssb_parm_1 = tp->ssb.Parm[1]; + + if(ssb_cmd == OPEN) + { + tp->Sleeping = 0; + if(!tp->ReOpenInProgress) + wake_up_interruptible(&tp->wait_for_tok_int); + + tp->OpenCommandIssued = 0; + tp->ScbInUse = 0; + + if((ssb_parm_0 & 0x00FF) == GOOD_COMPLETION) + { + /* Success, the adapter is open. */ + tp->LobeWireFaultLogged = 0; + tp->AdapterOpenFlag = 1; + tp->AdapterVirtOpenFlag = 1; + tp->TransmitCommandActive = 0; + tms380tr_exec_cmd(dev, OC_TRANSMIT); + tms380tr_exec_cmd(dev, OC_RECEIVE); + + if(tp->ReOpenInProgress) + tp->ReOpenInProgress = 0; + + return; + } + else /* The adapter did not open. */ + { + if(ssb_parm_0 & NODE_ADDR_ERROR) + printk(KERN_INFO "%s: Node address error\n", + dev->name); + if(ssb_parm_0 & LIST_SIZE_ERROR) + printk(KERN_INFO "%s: List size error\n", + dev->name); + if(ssb_parm_0 & BUF_SIZE_ERROR) + printk(KERN_INFO "%s: Buffer size error\n", + dev->name); + if(ssb_parm_0 & TX_BUF_COUNT_ERROR) + printk(KERN_INFO "%s: Tx buffer count error\n", + dev->name); + if(ssb_parm_0 & INVALID_OPEN_OPTION) + printk(KERN_INFO "%s: Invalid open option\n", + dev->name); + if(ssb_parm_0 & OPEN_ERROR) + { + /* Show the open phase. */ + switch(ssb_parm_0 & OPEN_PHASES_MASK) + { + case LOBE_MEDIA_TEST: + if(!tp->LobeWireFaultLogged) + { + tp->LobeWireFaultLogged = 1; + printk(KERN_INFO "%s: %s Lobe wire fault (check cable !).\n", dev->name, open_err); + } + tp->ReOpenInProgress = 1; + tp->AdapterOpenFlag = 0; + tp->AdapterVirtOpenFlag = 1; + tms380tr_open_adapter(dev); + return; + + case PHYSICAL_INSERTION: + printk(KERN_INFO "%s: %s Physical insertion.\n", dev->name, open_err); + break; + + case ADDRESS_VERIFICATION: + printk(KERN_INFO "%s: %s Address verification.\n", dev->name, open_err); + break; + + case PARTICIPATION_IN_RING_POLL: + printk(KERN_INFO "%s: %s Participation in ring poll.\n", dev->name, open_err); + break; + + case REQUEST_INITIALISATION: + printk(KERN_INFO "%s: %s Request initialisation.\n", dev->name, open_err); + break; + + case FULLDUPLEX_CHECK: + printk(KERN_INFO "%s: %s Full duplex check.\n", dev->name, open_err); + break; + + default: + printk(KERN_INFO "%s: %s Unknown open phase\n", dev->name, open_err); + break; + } + + /* Show the open errors. */ + switch(ssb_parm_0 & OPEN_ERROR_CODES_MASK) + { + case OPEN_FUNCTION_FAILURE: + printk(KERN_INFO "%s: %s OPEN_FUNCTION_FAILURE", dev->name, code_err); + tp->LastOpenStatus = + OPEN_FUNCTION_FAILURE; + break; + + case OPEN_SIGNAL_LOSS: + printk(KERN_INFO "%s: %s OPEN_SIGNAL_LOSS\n", dev->name, code_err); + tp->LastOpenStatus = + OPEN_SIGNAL_LOSS; + break; + + case OPEN_TIMEOUT: + printk(KERN_INFO "%s: %s OPEN_TIMEOUT\n", dev->name, code_err); + tp->LastOpenStatus = + OPEN_TIMEOUT; + break; + + case OPEN_RING_FAILURE: + printk(KERN_INFO "%s: %s OPEN_RING_FAILURE\n", dev->name, code_err); + tp->LastOpenStatus = + OPEN_RING_FAILURE; + break; + + case OPEN_RING_BEACONING: + printk(KERN_INFO "%s: %s OPEN_RING_BEACONING\n", dev->name, code_err); + tp->LastOpenStatus = + OPEN_RING_BEACONING; + break; + + case OPEN_DUPLICATE_NODEADDR: + printk(KERN_INFO "%s: %s OPEN_DUPLICATE_NODEADDR\n", dev->name, code_err); + tp->LastOpenStatus = + OPEN_DUPLICATE_NODEADDR; + break; + + case OPEN_REQUEST_INIT: + printk(KERN_INFO "%s: %s OPEN_REQUEST_INIT\n", dev->name, code_err); + tp->LastOpenStatus = + OPEN_REQUEST_INIT; + break; + + case OPEN_REMOVE_RECEIVED: + printk(KERN_INFO "%s: %s OPEN_REMOVE_RECEIVED", dev->name, code_err); + tp->LastOpenStatus = + OPEN_REMOVE_RECEIVED; + break; + + case OPEN_FULLDUPLEX_SET: + printk(KERN_INFO "%s: %s OPEN_FULLDUPLEX_SET\n", dev->name, code_err); + tp->LastOpenStatus = + OPEN_FULLDUPLEX_SET; + break; + + default: + printk(KERN_INFO "%s: %s Unknown open err code", dev->name, code_err); + tp->LastOpenStatus = + OPEN_FUNCTION_FAILURE; + break; + } + } + + tp->AdapterOpenFlag = 0; + tp->AdapterVirtOpenFlag = 0; + + return; + } + } + else + { + if(ssb_cmd != READ_ERROR_LOG) + return; + + /* Add values from the error log table to the MAC + * statistics counters and update the errorlogtable + * memory. + */ + tp->MacStat.line_errors += tp->errorlogtable.Line_Error; + tp->MacStat.burst_errors += tp->errorlogtable.Burst_Error; + tp->MacStat.A_C_errors += tp->errorlogtable.ARI_FCI_Error; + tp->MacStat.lost_frames += tp->errorlogtable.Lost_Frame_Error; + tp->MacStat.recv_congest_count += tp->errorlogtable.Rx_Congest_Error; + tp->MacStat.rx_errors += tp->errorlogtable.Rx_Congest_Error; + tp->MacStat.frame_copied_errors += tp->errorlogtable.Frame_Copied_Error; + tp->MacStat.token_errors += tp->errorlogtable.Token_Error; + tp->MacStat.dummy1 += tp->errorlogtable.DMA_Bus_Error; + tp->MacStat.dummy1 += tp->errorlogtable.DMA_Parity_Error; + tp->MacStat.abort_delimiters += tp->errorlogtable.AbortDelimeters; + tp->MacStat.frequency_errors += tp->errorlogtable.Frequency_Error; + tp->MacStat.internal_errors += tp->errorlogtable.Internal_Error; + } + + return; +} + +/* + * The inverse routine to tms380tr_open(). + */ +static int tms380tr_close(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + + dev->tbusy = 1; + dev->start = 0; + + del_timer(&tp->timer); + + /* Flush the Tx and disable Rx here. */ + + tp->HaltInProgress = 1; + tms380tr_exec_cmd(dev, OC_CLOSE); + tp->timer.expires = jiffies + 1*HZ; + tp->timer.function = tms380tr_timer_end_wait; + tp->timer.data = (unsigned long)dev; + add_timer(&tp->timer); + + tms380tr_enable_interrupts(dev); + + tp->Sleeping = 1; + interruptible_sleep_on(&tp->wait_for_tok_int); + tp->TransmitCommandActive = 0; + + del_timer(&tp->timer); + tms380tr_disable_interrupts(dev); + + if(dev->dma > 0) + { + unsigned long flags=claim_dma_lock(); + disable_dma(dev->dma); + release_dma_lock(flags); + } + + outw(0xFF00, dev->base_addr + SIFCMD); + if(dev->dma > 0) + outb(0xff, dev->base_addr + POSREG); + +#ifdef MODULE + MOD_DEC_USE_COUNT; +#endif + + tms380tr_cancel_tx_queue(tp); + + return (0); +} + +/* + * Get the current statistics. This may be called with the card open + * or closed. + */ +static struct enet_statistics *tms380tr_get_stats(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + + return ((struct enet_statistics *)&tp->MacStat); +} + +/* + * Set or clear the multicast filter for this adapter. + */ +static void tms380tr_set_multicast_list(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned int OpenOptions; + + OpenOptions = tp->ocpl.OPENOptions & + ~(PASS_ADAPTER_MAC_FRAMES + | PASS_ATTENTION_FRAMES + | PASS_BEACON_MAC_FRAMES + | COPY_ALL_MAC_FRAMES + | COPY_ALL_NON_MAC_FRAMES); + + tp->ocpl.FunctAddr = 0; + + if(dev->flags & IFF_PROMISC) + /* Enable promiscuous mode */ + OpenOptions |= COPY_ALL_NON_MAC_FRAMES | + COPY_ALL_MAC_FRAMES; + else + { + if(dev->flags & IFF_ALLMULTI) + { + /* Disable promiscuous mode, use normal mode. */ + tp->ocpl.FunctAddr = 0xFFFFFFFF; + + } + else + { + int i; + struct dev_mc_list *mclist = dev->mc_list; + for (i=0; i< dev->mc_count; i++) + { + ((char *)(&tp->ocpl.FunctAddr))[0] |= + mclist->dmi_addr[2]; + ((char *)(&tp->ocpl.FunctAddr))[1] |= + mclist->dmi_addr[3]; + ((char *)(&tp->ocpl.FunctAddr))[2] |= + mclist->dmi_addr[4]; + ((char *)(&tp->ocpl.FunctAddr))[3] |= + mclist->dmi_addr[5]; + mclist = mclist->next; + } + } + tms380tr_exec_cmd(dev, OC_SET_FUNCT_ADDR); + } + + tp->ocpl.OPENOptions = OpenOptions; + tms380tr_exec_cmd(dev, OC_MODIFY_OPEN_PARMS); + return; +} + +/* + * Wait for some time (microseconds) + */ +static void tms380tr_wait(unsigned long time) +{ +#if 0 + long tmp; + + tmp = jiffies + time/(1000000/HZ); + do { + current->state = TASK_INTERRUPTIBLE; + tmp = schedule_timeout(tmp); + } while(time_after(tmp, jiffies)); +#else + udelay(time); +#endif + return; +} + +/* + * Write a command value to the SIFCMD register + */ +static void tms380tr_exec_sifcmd(struct net_device *dev, unsigned int WriteValue) +{ + int ioaddr = dev->base_addr; + unsigned short cmd; + unsigned short SifStsValue; + unsigned long loop_counter; + + WriteValue = ((WriteValue ^ CMD_SYSTEM_IRQ) | CMD_INTERRUPT_ADAPTER); + cmd = (unsigned short)WriteValue; + loop_counter = 0,5 * 800000; + do { + SifStsValue = inw(ioaddr + SIFSTS); + } while((SifStsValue & CMD_INTERRUPT_ADAPTER) && loop_counter--); + outw(cmd, ioaddr + SIFCMD); + + return; +} + +/* + * Processes adapter hardware reset, halts adapter and downloads firmware, + * clears the halt bit. + */ +static int tms380tr_reset_adapter(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned short *fw_ptr = (unsigned short *)&tms380tr_code; + unsigned short count, c; + int ioaddr = dev->base_addr; + + /* Hardware adapter reset */ + outw(ACL_ARESET, ioaddr + SIFACL); + tms380tr_wait(40); + + c = inw(ioaddr + SIFACL); + tms380tr_wait(20); + + if(dev->dma == 0) /* For PCI adapters */ + { + c &= ~(ACL_SPEED4 | ACL_SPEED16); /* Clear bits */ + if(tp->DataRate == SPEED_4) + c |= ACL_SPEED4; /* Set 4Mbps */ + else + c |= ACL_SPEED16; /* Set 16Mbps */ + } + + /* In case a command is pending - forget it */ + tp->ScbInUse = 0; + + c &= ~ACL_ARESET; /* Clear adapter reset bit */ + c |= ACL_CPHALT; /* Halt adapter CPU, allow download */ + c &= ~ACL_PSDMAEN; /* Clear pseudo dma bit */ + outw(c, ioaddr + SIFACL); + tms380tr_wait(40); + + /* Download firmware via DIO interface: */ + do { + /* Download first address part */ + outw(*fw_ptr, ioaddr + SIFADX); + fw_ptr++; + + /* Download second address part */ + outw(*fw_ptr, ioaddr + SIFADD); + fw_ptr++; + + if((count = *fw_ptr) != 0) /* Load loop counter */ + { + fw_ptr++; /* Download block data */ + for(; count > 0; count--) + { + outw(*fw_ptr, ioaddr + SIFINC); + fw_ptr++; + } + } + else /* Stop, if last block downloaded */ + { + c = inw(ioaddr + SIFACL); + c &= (~ACL_CPHALT | ACL_SINTEN); + + /* Clear CPHALT and start BUD */ + outw(c, ioaddr + SIFACL); + return (1); + } + } while(count == 0); + + return (-1); +} + +/* + * Starts bring up diagnostics of token ring adapter and evaluates + * diagnostic results. + */ +static int tms380tr_bringup_diags(struct net_device *dev) +{ + int loop_cnt, retry_cnt; + unsigned short Status; + int ioaddr = dev->base_addr; + + tms380tr_wait(HALF_SECOND); + tms380tr_exec_sifcmd(dev, EXEC_SOFT_RESET); + tms380tr_wait(HALF_SECOND); + + retry_cnt = BUD_MAX_RETRIES; /* maximal number of retrys */ + + do { + retry_cnt--; + if(tms380tr_debug > 3) + printk(KERN_INFO "BUD-Status: "); + loop_cnt = BUD_MAX_LOOPCNT; /* maximum: three seconds*/ + do { /* Inspect BUD results */ + loop_cnt--; + tms380tr_wait(HALF_SECOND); + Status = inw(ioaddr + SIFSTS); + Status &= STS_MASK; + + if(tms380tr_debug > 3) + printk(KERN_INFO " %04X \n", Status); + /* BUD successfully completed */ + if(Status == STS_INITIALIZE) + return (1); + /* Unrecoverable hardware error, BUD not completed? */ + } while((loop_cnt > 0) && ((Status & (STS_ERROR | STS_TEST)) + != (STS_ERROR | STS_TEST))); + + /* Error preventing completion of BUD */ + if(retry_cnt > 0) + { + printk(KERN_INFO "%s: Adapter Software Reset.\n", + dev->name); + tms380tr_exec_sifcmd(dev, EXEC_SOFT_RESET); + tms380tr_wait(HALF_SECOND); + } + } while(retry_cnt > 0); + + Status = inw(ioaddr + SIFSTS); + Status &= STS_ERROR_MASK; /* Hardware error occurred! */ + + printk(KERN_INFO "%s: Bring Up Diagnostics Error (%04X) occurred\n", + dev->name, Status); + + return (-1); +} + +/* + * Copy initialisation data to adapter memory, beginning at address + * 1:0A00; Starting DMA test and evaluating result bits. + */ +static int tms380tr_init_adapter(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + + const unsigned char SCB_Test[6] = {0x00, 0x00, 0xC1, 0xE2, 0xD4, 0x8B}; + const unsigned char SSB_Test[8] = {0xFF, 0xFF, 0xD1, 0xD7, + 0xC5, 0xD9, 0xC3, 0xD4}; + void *ptr = (void *)&tp->ipb; + unsigned short *ipb_ptr = (unsigned short *)ptr; + unsigned char *cb_ptr = (unsigned char *) &tp->scb; + unsigned char *sb_ptr = (unsigned char *) &tp->ssb; + unsigned short Status; + int i, loop_cnt, retry_cnt; + int ioaddr = dev->base_addr; + + /* Normalize: byte order low/high, word order high/low! (only IPB!) */ + tp->ipb.SCB_Addr = SWAPW(virt_to_bus(&tp->scb)); + tp->ipb.SSB_Addr = SWAPW(virt_to_bus(&tp->ssb)); + + /* Maximum: three initialization retries */ + retry_cnt = INIT_MAX_RETRIES; + + do { + retry_cnt--; + + /* Transfer initialization block */ + outw(0x0001, ioaddr + SIFADX); + + /* To address 0001:0A00 of adapter RAM */ + outw(0x0A00, ioaddr + SIFADD); + + /* Write 11 words to adapter RAM */ + for(i = 0; i < 11; i++) + outw(ipb_ptr[i], ioaddr + SIFINC); + + /* Execute SCB adapter command */ + tms380tr_exec_sifcmd(dev, CMD_EXECUTE); + + loop_cnt = INIT_MAX_LOOPCNT; /* Maximum: 11 seconds */ + + /* While remaining retries, no error and not completed */ + do { + Status = 0; + loop_cnt--; + tms380tr_wait(HALF_SECOND); + + /* Mask interesting status bits */ + Status = inw(ioaddr + SIFSTS); + Status &= STS_MASK; + } while(((Status &(STS_INITIALIZE | STS_ERROR | STS_TEST)) != 0) + && ((Status & STS_ERROR) == 0) && (loop_cnt != 0)); + + if((Status & (STS_INITIALIZE | STS_ERROR | STS_TEST)) == 0) + { + /* Initialization completed without error */ + i = 0; + do { /* Test if contents of SCB is valid */ + if(SCB_Test[i] != *(cb_ptr + i)) + /* DMA data error: wrong data in SCB */ + return (-1); + i++; + } while(i < 6); + + i = 0; + do { /* Test if contents of SSB is valid */ + if(SSB_Test[i] != *(sb_ptr + i)) + /* DMA data error: wrong data in SSB */ + return (-1); + i++; + } while (i < 8); + + return (1); /* Adapter successfully initialized */ + } + else + { + if((Status & STS_ERROR) != 0) + { + /* Initialization error occurred */ + Status = inw(ioaddr + SIFSTS); + Status &= STS_ERROR_MASK; + /* ShowInitialisationErrorCode(Status); */ + return (-1); /* Unrecoverable error */ + } + else + { + if(retry_cnt > 0) + { + /* Reset adapter and try init again */ + tms380tr_exec_sifcmd(dev, EXEC_SOFT_RESET); + tms380tr_wait(HALF_SECOND); + } + } + } + } while(retry_cnt > 0); + + return (-1); +} + +/* + * Check for outstanding commands in command queue and tries to execute + * command immediately. Corresponding command flag in command queue is cleared. + */ +static void tms380tr_chk_outstanding_cmds(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned long Addr = 0; + unsigned char i = 0; + + if(tp->CMDqueue == 0) + return; /* No command execution */ + + /* If SCB in use: no command */ + if(tp->ScbInUse == 1) + return; + + /* Check if adapter is opened, avoiding COMMAND_REJECT + * interrupt by the adapter! + */ + if(tp->AdapterOpenFlag == 0) + { + if(tp->CMDqueue & OC_OPEN) + { + /* Execute OPEN command */ + tp->CMDqueue ^= OC_OPEN; + + /* Copy the 18 bytes of the product ID */ + while((tp->CardType->name[i] != '\0') + && (i < PROD_ID_SIZE)) + { + tp->ProductID[i] = tp->CardType->name[i]; + i++; + } + + Addr = htonl(virt_to_bus(&tp->ocpl)); + tp->scb.Parm[0] = LOWORD(Addr); + tp->scb.Parm[1] = HIWORD(Addr); + tp->scb.CMD = OPEN; + } + else + /* No OPEN command queued, but adapter closed. Note: + * We'll try to re-open the adapter in DriverPoll() + */ + return; /* No adapter command issued */ + } + else + { + /* Adapter is open; evaluate command queue: try to execute + * outstanding commands (depending on priority!) CLOSE + * command queued + */ + if(tp->CMDqueue & OC_CLOSE) + { + tp->CMDqueue ^= OC_CLOSE; + tp->AdapterOpenFlag = 0; + tp->scb.Parm[0] = 0; /* Parm[0], Parm[1] are ignored */ + tp->scb.Parm[1] = 0; /* but should be set to zero! */ + tp->scb.CMD = CLOSE; + if(!tp->HaltInProgress) + tp->CMDqueue |= OC_OPEN; /* re-open adapter */ + else + tp->CMDqueue = 0; /* no more commands */ + } + else + { + if(tp->CMDqueue & OC_RECEIVE) + { + tp->CMDqueue ^= OC_RECEIVE; + Addr = htonl(virt_to_bus(tp->RplHead)); + tp->scb.Parm[0] = LOWORD(Addr); + tp->scb.Parm[1] = HIWORD(Addr); + tp->scb.CMD = RECEIVE; + } + else + { + if(tp->CMDqueue & OC_TRANSMIT_HALT) + { + /* NOTE: TRANSMIT.HALT must be checked + * before TRANSMIT. + */ + tp->CMDqueue ^= OC_TRANSMIT_HALT; + tp->scb.CMD = TRANSMIT_HALT; + + /* Parm[0] and Parm[1] are ignored + * but should be set to zero! + */ + tp->scb.Parm[0] = 0; + tp->scb.Parm[1] = 0; + } + else + { + if(tp->CMDqueue & OC_TRANSMIT) + { + /* NOTE: TRANSMIT must be + * checked after TRANSMIT.HALT + */ + if(tp->TransmitCommandActive) + { + if(!tp->TransmitHaltScheduled) + { + tp->TransmitHaltScheduled = 1; + tms380tr_exec_cmd(dev, OC_TRANSMIT_HALT) ; + } + tp->TransmitCommandActive = 0; + return; + } + + tp->CMDqueue ^= OC_TRANSMIT; + tms380tr_cancel_tx_queue(tp); + Addr = htonl(virt_to_bus(tp->TplBusy)); + tp->scb.Parm[0] = LOWORD(Addr); + tp->scb.Parm[1] = HIWORD(Addr); + tp->scb.CMD = TRANSMIT; + tp->TransmitCommandActive = 1; + } + else + { + if(tp->CMDqueue & OC_MODIFY_OPEN_PARMS) + { + tp->CMDqueue ^= OC_MODIFY_OPEN_PARMS; + tp->scb.Parm[0] = tp->ocpl.OPENOptions; /* new OPEN options*/ + tp->scb.Parm[0] |= ENABLE_FULL_DUPLEX_SELECTION; + tp->scb.Parm[1] = 0; /* is ignored but should be zero */ + tp->scb.CMD = MODIFY_OPEN_PARMS; + } + else + { + if(tp->CMDqueue & OC_SET_FUNCT_ADDR) + { + tp->CMDqueue ^= OC_SET_FUNCT_ADDR; + tp->scb.Parm[0] = LOWORD(tp->ocpl.FunctAddr); + tp->scb.Parm[1] = HIWORD(tp->ocpl.FunctAddr); + tp->scb.CMD = SET_FUNCT_ADDR; + } + else + { + if(tp->CMDqueue & OC_SET_GROUP_ADDR) + { + tp->CMDqueue ^= OC_SET_GROUP_ADDR; + tp->scb.Parm[0] = LOWORD(tp->ocpl.GroupAddr); + tp->scb.Parm[1] = HIWORD(tp->ocpl.GroupAddr); + tp->scb.CMD = SET_GROUP_ADDR; + } + else + { + if(tp->CMDqueue & OC_READ_ERROR_LOG) + { + tp->CMDqueue ^= OC_READ_ERROR_LOG; + Addr = htonl(virt_to_bus(&tp->errorlogtable)); + tp->scb.Parm[0] = LOWORD(Addr); + tp->scb.Parm[1] = HIWORD(Addr); + tp->scb.CMD = READ_ERROR_LOG; + } + else + { + printk(KERN_WARNING "CheckForOutstandingCommand: unknown Command\n"); + tp->CMDqueue = 0; + return; + } + } + } + } + } + } + } + } + } + + tp->ScbInUse = 1; /* Set semaphore: SCB in use. */ + + /* Execute SCB and generate IRQ when done. */ + tms380tr_exec_sifcmd(dev, CMD_EXECUTE | CMD_SCB_REQUEST); + + return; +} + +/* + * IRQ conditions: signal loss on the ring, transmit or receive of beacon + * frames (disabled if bit 1 of OPEN option is set); report error MAC + * frame transmit (disabled if bit 2 of OPEN option is set); open or short + * circuit fault on the lobe is detected; remove MAC frame received; + * error counter overflow (255); opened adapter is the only station in ring. + * After some of the IRQs the adapter is closed! + */ +static void tms380tr_ring_status_irq(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + + tp->CurrentRingStatus = SWAPB(tp->ssb.Parm[0]); + + /* First: fill up statistics */ + if(tp->ssb.Parm[0] & SIGNAL_LOSS) + { + printk(KERN_INFO "%s: Signal Loss\n", dev->name); + tp->MacStat.line_errors++; + } + + /* Adapter is closed, but initialized */ + if(tp->ssb.Parm[0] & LOBE_WIRE_FAULT) + { + printk(KERN_INFO "%s: Lobe Wire Fault, Reopen Adapter\n", + dev->name); + tp->MacStat.line_errors++; + } + + if(tp->ssb.Parm[0] & RING_RECOVERY) + printk(KERN_INFO "%s: Ring Recovery\n", dev->name); + + /* Counter overflow: read error log */ + if(tp->ssb.Parm[0] & COUNTER_OVERFLOW) + { + printk(KERN_INFO "%s: Counter Overflow\n", dev->name); + tms380tr_exec_cmd(dev, OC_READ_ERROR_LOG); + } + + /* Adapter is closed, but initialized */ + if(tp->ssb.Parm[0] & REMOVE_RECEIVED) + printk(KERN_INFO "%s: Remove Received, Reopen Adapter\n", + dev->name); + + /* Adapter is closed, but initialized */ + if(tp->ssb.Parm[0] & AUTO_REMOVAL_ERROR) + printk(KERN_INFO "%s: Auto Removal Error, Reopen Adapter\n", + dev->name); + + if(tp->ssb.Parm[0] & HARD_ERROR) + printk(KERN_INFO "%s: Hard Error\n", dev->name); + + if(tp->ssb.Parm[0] & SOFT_ERROR) + printk(KERN_INFO "%s: Soft Error\n", dev->name); + + if(tp->ssb.Parm[0] & TRANSMIT_BEACON) + printk(KERN_INFO "%s: Transmit Beacon\n", dev->name); + + if(tp->ssb.Parm[0] & SINGLE_STATION) + printk(KERN_INFO "%s: Single Station\n", dev->name); + + /* Check if adapter has been closed */ + if(tp->ssb.Parm[0] & ADAPTER_CLOSED) + { + printk(KERN_INFO "%s: Adapter closed (Reopening)," + "QueueSkb %d, CurrentRingStat %x\n", + dev->name, tp->QueueSkb, tp->CurrentRingStatus); + tp->AdapterOpenFlag = 0; + tms380tr_open_adapter(dev); + } + + return; +} + +/* + * Issued if adapter has encountered an unrecoverable hardware + * or software error. + */ +static void tms380tr_chk_irq(struct net_device *dev) +{ + int i; + unsigned short AdapterCheckBlock[4]; + unsigned short ioaddr = dev->base_addr; + struct net_local *tp = (struct net_local *)dev->priv; + + tp->AdapterOpenFlag = 0; /* Adapter closed now */ + + /* Page number of adapter memory */ + outw(0x0001, ioaddr + SIFADX); + /* Address offset */ + outw(CHECKADDR, ioaddr + SIFADR); + + /* Reading 8 byte adapter check block. */ + for(i = 0; i < 4; i++) + AdapterCheckBlock[i] = inw(ioaddr + SIFINC); + + if(tms380tr_debug > 3) + { + printk("%s: AdapterCheckBlock: ", dev->name); + for (i = 0; i < 4; i++) + printk("%04X", AdapterCheckBlock[i]); + printk("\n"); + } + + switch(AdapterCheckBlock[0]) + { + case DIO_PARITY: + printk(KERN_INFO "%s: DIO parity error\n", dev->name); + break; + + case DMA_READ_ABORT: + printk(KERN_INFO "%s DMA read operation aborted:\n", + dev->name); + switch (AdapterCheckBlock[1]) + { + case 0: + printk(KERN_INFO "Timeout\n"); + printk(KERN_INFO "Address: %04X %04X\n", + AdapterCheckBlock[2], + AdapterCheckBlock[3]); + break; + + case 1: + printk(KERN_INFO "Parity error\n"); + printk(KERN_INFO "Address: %04X %04X\n", + AdapterCheckBlock[2], + AdapterCheckBlock[3]); + break; + + case 2: + printk(KERN_INFO "Bus error\n"); + printk(KERN_INFO "Address: %04X %04X\n", + AdapterCheckBlock[2], + AdapterCheckBlock[3]); + break; + + default: + printk(KERN_INFO "Unknown error.\n"); + break; + } + break; + + case DMA_WRITE_ABORT: + printk(KERN_INFO "%s: DMA write operation aborted: \n", + dev->name); + switch (AdapterCheckBlock[1]) + { + case 0: + printk(KERN_INFO "Timeout\n"); + printk(KERN_INFO "Address: %04X %04X\n", + AdapterCheckBlock[2], + AdapterCheckBlock[3]); + break; + + case 1: + printk(KERN_INFO "Parity error\n"); + printk(KERN_INFO "Address: %04X %04X\n", + AdapterCheckBlock[2], + AdapterCheckBlock[3]); + break; + + case 2: + printk(KERN_INFO "Bus error\n"); + printk(KERN_INFO "Address: %04X %04X\n", + AdapterCheckBlock[2], + AdapterCheckBlock[3]); + break; + + default: + printk(KERN_INFO "Unknown error.\n"); + break; + } + break; + + case ILLEGAL_OP_CODE: + printk("%s: Illegal operation code in firmware\n", + dev->name); + /* Parm[0-3]: adapter internal register R13-R15 */ + break; + + case PARITY_ERRORS: + printk("%s: Adapter internal bus parity error\n", + dev->name); + /* Parm[0-3]: adapter internal register R13-R15 */ + break; + + case RAM_DATA_ERROR: + printk("%s: RAM data error\n", dev->name); + /* Parm[0-1]: MSW/LSW address of RAM location. */ + break; + + case RAM_PARITY_ERROR: + printk("%s: RAM parity error\n", dev->name); + /* Parm[0-1]: MSW/LSW address of RAM location. */ + break; + + case RING_UNDERRUN: + printk("%s: Internal DMA underrun detected\n", + dev->name); + break; + + case INVALID_IRQ: + printk("%s: Unrecognized interrupt detected\n", + dev->name); + /* Parm[0-3]: adapter internal register R13-R15 */ + break; + + case INVALID_ERROR_IRQ: + printk("%s: Unrecognized error interrupt detected\n", + dev->name); + /* Parm[0-3]: adapter internal register R13-R15 */ + break; + + case INVALID_XOP: + printk("%s: Unrecognized XOP request detected\n", + dev->name); + /* Parm[0-3]: adapter internal register R13-R15 */ + break; + + default: + printk("%s: Unknown status", dev->name); + break; + } + + if(tms380tr_chipset_init(dev) == 1) + { + /* Restart of firmware successful */ + tp->AdapterOpenFlag = 1; + } + + return; +} + +/* + * Internal adapter pointer to RAM data are copied from adapter into + * host system. + */ +static int tms380tr_read_ptr(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned short adapterram; + + tms380tr_read_ram(dev, (unsigned char *)&tp->intptrs.BurnedInAddrPtr, + ADAPTER_INT_PTRS, 16); + tms380tr_read_ram(dev, (unsigned char *)&adapterram, + (unsigned short)SWAPB(tp->intptrs.AdapterRAMPtr), 2); + + return SWAPB(adapterram); +} + +/* + * Reads a number of bytes from adapter to system memory. + */ +static void tms380tr_read_ram(struct net_device *dev, unsigned char *Data, + unsigned short Address, int Length) +{ + int i; + unsigned short old_sifadx, old_sifadr, InWord; + unsigned short ioaddr = dev->base_addr; + + /* Save the current values */ + old_sifadx = inw(ioaddr + SIFADX); + old_sifadr = inw(ioaddr + SIFADR); + + /* Page number of adapter memory */ + outw(0x0001, ioaddr + SIFADX); + /* Address offset in adapter RAM */ + outw(Address, ioaddr + SIFADR); + + /* Copy len byte from adapter memory to system data area. */ + i = 0; + for(;;) + { + InWord = inw(ioaddr + SIFINC); + + *(Data + i) = HIBYTE(InWord); /* Write first byte */ + if(++i == Length) /* All is done break */ + break; + + *(Data + i) = LOBYTE(InWord); /* Write second byte */ + if (++i == Length) /* All is done break */ + break; + } + + /* Restore original values */ + outw(old_sifadx, ioaddr + SIFADX); + outw(old_sifadr, ioaddr + SIFADR); + + return; +} + +/* + * Reads MAC address from adapter ROM. + */ +static void tms380tr_read_addr(struct net_device *dev, unsigned char *Address) +{ + int i, In; + unsigned short ioaddr = dev->base_addr; + + /* Address: 0000:0000 */ + outw(0, ioaddr + SIFADX); + outw(0, ioaddr + SIFADR); + + /* Read six byte MAC address data */ + for(i = 0; i < 6; i++) + { + In = inw(ioaddr + SIFINC); + *(Address + i) = (unsigned char)(In >> 8); + } + + return; +} + +/* + * Cancel all queued packets in the transmission queue. + */ +static void tms380tr_cancel_tx_queue(struct net_local* tp) +{ + TPL *tpl; + struct sk_buff *skb; + + /* + * NOTE: There must not be an active TRANSMIT command pending, when + * this function is called. + */ + if(tp->TransmitCommandActive) + return; + + for(;;) + { + tpl = tp->TplBusy; + if(!tpl->BusyFlag) + break; + /* "Remove" TPL from busy list. */ + tp->TplBusy = tpl->NextTPLPtr; + tms380tr_write_tpl_status(tpl, 0); /* Clear VALID bit */ + tpl->BusyFlag = 0; /* "free" TPL */ + + printk(KERN_INFO "Cancel tx (%08lXh).\n", (unsigned long)tpl); + + dev_kfree_skb(tpl->Skb); + } + + for(;;) + { + skb = skb_dequeue(&tp->SendSkbQueue); + if(skb == NULL) + break; + tp->QueueSkb++; + dev_kfree_skb(skb); + } + + return; +} + +/* + * This function is called whenever a transmit interrupt is generated by the + * adapter. For a command complete interrupt, it is checked if we have to + * issue a new transmit command or not. + */ +static void tms380tr_tx_status_irq(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned char HighByte, HighAc, LowAc; + TPL *tpl; + + /* NOTE: At this point the SSB from TRANSMIT STATUS is no longer + * available, because the CLEAR SSB command has already been issued. + * + * Process all complete transmissions. + */ + + for(;;) + { + tpl = tp->TplBusy; + if(!tpl->BusyFlag || (tpl->Status + & (TX_VALID | TX_FRAME_COMPLETE)) + != TX_FRAME_COMPLETE) + { + break; + } + + /* "Remove" TPL from busy list. */ + tp->TplBusy = tpl->NextTPLPtr ; + + /* Check the transmit status field only for directed frames*/ + if(DIRECTED_FRAME(tpl) && (tpl->Status & TX_ERROR) == 0) + { + HighByte = GET_TRANSMIT_STATUS_HIGH_BYTE(tpl->Status); + HighAc = GET_FRAME_STATUS_HIGH_AC(HighByte); + LowAc = GET_FRAME_STATUS_LOW_AC(HighByte); + + if((HighAc != LowAc) || (HighAc == AC_NOT_RECOGNIZED)) + { + printk(KERN_INFO "%s: (DA=%08lX not recognized)", + dev->name, + *(unsigned long *)&tpl->MData[2+2]); + } + else + { + if(tms380tr_debug > 3) + printk("%s: Directed frame tx'd\n", + dev->name); + } + } + else + { + if(!DIRECTED_FRAME(tpl)) + { + if(tms380tr_debug > 3) + printk("%s: Broadcast frame tx'd\n", + dev->name); + } + } + + tp->MacStat.tx_packets++; + dev_kfree_skb(tpl->Skb); + tpl->BusyFlag = 0; /* "free" TPL */ + } + + dev->tbusy = 0; + if(tp->QueueSkb < MAX_TX_QUEUE) + tms380tr_hardware_send_packet(dev, tp); + + return; +} + +/* + * Called if a frame receive interrupt is generated by the adapter. + * Check if the frame is valid and indicate it to system. + */ +static void tms380tr_rcv_status_irq(struct net_device *dev) +{ + struct net_local *tp = (struct net_local *)dev->priv; + unsigned char *ReceiveDataPtr; + struct sk_buff *skb; + unsigned int Length, Length2; + RPL *rpl; + RPL *SaveHead; + + /* NOTE: At this point the SSB from RECEIVE STATUS is no longer + * available, because the CLEAR SSB command has already been issued. + * + * Process all complete receives. + */ + + for(;;) + { + rpl = tp->RplHead; + if(rpl->Status & RX_VALID) + break; /* RPL still in use by adapter */ + + /* Forward RPLHead pointer to next list. */ + SaveHead = tp->RplHead; + tp->RplHead = rpl->NextRPLPtr; + + /* Get the frame size (Byte swap for Intel). + * Do this early (see workaround comment below) + */ + Length = (unsigned short)SWAPB(rpl->FrameSize); + + /* Check if the Frame_Start, Frame_End and + * Frame_Complete bits are set. + */ + if((rpl->Status & VALID_SINGLE_BUFFER_FRAME) + == VALID_SINGLE_BUFFER_FRAME) + { + ReceiveDataPtr = rpl->MData; + + /* Workaround for delayed write of FrameSize on ISA + * (FrameSize is false but valid-bit is reset) + * Frame size is set to zero when the RPL is freed. + * Length2 is there because there have also been + * cases where the FrameSize was partially written + */ + Length2 = (unsigned short)SWAPB(rpl->FrameSize); + + if(Length == 0 || Length != Length2) + { + tp->RplHead = SaveHead; + break; /* Return to tms380tr_interrupt */ + } + + /* Drop frames sent by myself */ + if(tms380tr_chk_frame(dev, rpl->MData)) + { + printk(KERN_INFO "%s: Received my own frame\n", + dev->name); + if(rpl->Skb != NULL) + dev_kfree_skb(rpl->Skb); + } + else + { + tms380tr_update_rcv_stats(tp,ReceiveDataPtr,Length); + + if(tms380tr_debug > 3) + printk("%s: Packet Length %04X (%d)\n", + dev->name, Length, Length); + + /* Indicate the received frame to system the + * adapter does the Source-Routing padding for + * us. See: OpenOptions in tms380tr_init_opb() + */ + skb = rpl->Skb; + if(rpl->SkbStat == SKB_UNAVAILABLE) + { + /* Try again to allocate skb */ + skb = dev_alloc_skb(tp->MaxPacketSize); + if(skb == NULL) + { + /* Update Stats ?? */ + } + else + { + skb->dev = dev; + skb_put(skb, tp->MaxPacketSize); + rpl->SkbStat = SKB_DATA_COPY; + ReceiveDataPtr = rpl->MData; + } + } + + if(rpl->SkbStat == SKB_DATA_COPY + || rpl->SkbStat == SKB_DMA_DIRECT) + { + if(rpl->SkbStat == SKB_DATA_COPY) + memmove(skb->data, ReceiveDataPtr, Length); + + /* Deliver frame to system */ + rpl->Skb = NULL; + skb_trim(skb,Length); + skb->protocol = tr_type_trans(skb,dev); + netif_rx(skb); + } + } + } + else /* Invalid frame */ + { + if(rpl->Skb != NULL) + dev_kfree_skb(rpl->Skb); + + /* Skip list. */ + if(rpl->Status & RX_START_FRAME) + /* Frame start bit is set -> overflow. */ + tp->MacStat.rx_errors++; + } + + /* Allocate new skb for rpl */ + rpl->Skb = dev_alloc_skb(tp->MaxPacketSize); + + /* skb == NULL ? then use local buffer */ + if(rpl->Skb == NULL) + { + rpl->SkbStat = SKB_UNAVAILABLE; + rpl->FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[rpl->RPLIndex])); + rpl->MData = tp->LocalRxBuffers[rpl->RPLIndex]; + } + else /* skb != NULL */ + { + rpl->Skb->dev = dev; + skb_put(rpl->Skb, tp->MaxPacketSize); + + /* Data unreachable for DMA ? then use local buffer */ + if(tp->CardType->type == TMS_ISA && virt_to_bus(rpl->Skb->data) + tp->MaxPacketSize + > ISA_MAX_ADDRESS) + { + rpl->SkbStat = SKB_DATA_COPY; + rpl->FragList[0].DataAddr = htonl(virt_to_bus(tp->LocalRxBuffers[rpl->RPLIndex])); + rpl->MData = tp->LocalRxBuffers[rpl->RPLIndex]; + } + else + { + /* DMA directly in skb->data */ + rpl->SkbStat = SKB_DMA_DIRECT; + rpl->FragList[0].DataAddr = htonl(virt_to_bus(rpl->Skb->data)); + rpl->MData = rpl->Skb->data; + } + } + + rpl->FragList[0].DataCount = SWAPB(tp->MaxPacketSize); + rpl->FrameSize = 0; + + /* Pass the last RPL back to the adapter */ + tp->RplTail->FrameSize = 0; + + /* Reset the CSTAT field in the list. */ + tms380tr_write_rpl_status(tp->RplTail, RX_VALID | RX_FRAME_IRQ); + + /* Current RPL becomes last one in list. */ + tp->RplTail = tp->RplTail->NextRPLPtr; + + /* Inform adapter about RPL valid. */ + tms380tr_exec_sifcmd(dev, CMD_RX_VALID); + } + + return; +} + +/* + * This function should be used whenever the status of any RPL must be + * modified by the driver, because the compiler may otherwise change the + * order of instructions such that writing the RPL status may be executed + * at an undesireable time. When this function is used, the status is + * always written when the function is called. + */ +static void tms380tr_write_rpl_status(RPL *rpl, unsigned int Status) +{ + rpl->Status = Status; + + return; +} + +/* + * The function updates the statistic counters in mac->MacStat. + * It differtiates between directed and broadcast/multicast ( ==functional) + * frames. + */ +static void tms380tr_update_rcv_stats(struct net_local *tp, unsigned char DataPtr[], + unsigned int Length) +{ + tp->MacStat.rx_packets++; + tp->MacStat.rx_bytes += Length; + + /* Test functional bit */ + if(DataPtr[2] & GROUP_BIT) + tp->MacStat.multicast++; + + return; +} + +/* + * Check if it is a frame of myself. Compare source address with my current + * address in reverse direction, and mask out the TR_RII. + */ +static unsigned char tms380tr_chk_frame(struct net_device *dev, unsigned char *Addr) +{ + int i; + + for(i = 5; i > 0; i--) + { + if(Addr[8 + i] != dev->dev_addr[i]) + return (0); + } + + /* Mask out RIF bit. */ + if((Addr[8] & ~TR_RII) != (unsigned char)(dev->dev_addr[0])) + return (0); + + return (1); /* It is my frame. */ +} + +#if TMS380TR_DEBUG > 0 +/* + * Dump Packet (data) + */ +static void tms380tr_dump(unsigned char *Data, int length) +{ + int i, j; + + for (i = 0, j = 0; i < length / 8; i++, j += 8) + { + printk(KERN_DEBUG "%02x %02x %02x %02x %02x %02x %02x %02x\n", + Data[j+0],Data[j+1],Data[j+2],Data[j+3], + Data[j+4],Data[j+5],Data[j+6],Data[j+7]); + } + + return; +} +#endif + +#ifdef MODULE + +static struct net_device* dev_tms380tr[TMS380TR_MAX_ADAPTERS]; +static int io[TMS380TR_MAX_ADAPTERS] = { 0, 0 }; +static int irq[TMS380TR_MAX_ADAPTERS] = { 0, 0 }; +static int mem[TMS380TR_MAX_ADAPTERS] = { 0, 0 }; + +MODULE_PARM(io, "1-" __MODULE_STRING(TMS380TR_MAX_ADAPTERS) "i"); +MODULE_PARM(irq, "1-" __MODULE_STRING(TMS380TR_MAX_ADAPTERS) "i"); +MODULE_PARM(mem, "1-" __MODULE_STRING(TMS380TR_MAX_ADAPTERS) "i"); + +int init_module(void) +{ + int i; + + for(i = 0; i < TMS380TR_MAX_ADAPTERS; i++) + { + irq[i] = 0; + mem[i] = 0; + dev_tms380tr[i] = NULL; + dev_tms380tr[i] = init_trdev(dev_tms380tr[i], 0); + if(dev_tms380tr[i] == NULL) + return (-ENOMEM); + + dev_tms380tr[i]->base_addr = io[i]; + dev_tms380tr[i]->irq = irq[i]; + dev_tms380tr[i]->mem_start = mem[i]; + dev_tms380tr[i]->init = &tms380tr_probe; + + if(register_trdev(dev_tms380tr[i]) != 0) + { + kfree_s(dev_tms380tr[i], sizeof(struct net_device)); + dev_tms380tr[i] = NULL; + if(i == 0) + { + printk("tms380tr: register_trdev() returned non-zero.\n"); + return (-EIO); + } + else + return (0); + } + } + + return (0); +} + +void cleanup_module(void) +{ + int i; + + for(i = 0; i < TMS380TR_MAX_ADAPTERS; i++) + { + if(dev_tms380tr[i]) + { + unregister_trdev(dev_tms380tr[i]); + release_region(dev_tms380tr[i]->base_addr, TMS380TR_IO_EXTENT); + if(dev_tms380tr[i]->irq) + free_irq(dev_tms380tr[i]->irq, dev_tms380tr[i]); + if(dev_tms380tr[i]->dma > 0) + free_dma(dev_tms380tr[i]->dma); + if(dev_tms380tr[i]->priv) + kfree_s(dev_tms380tr[i]->priv, sizeof(struct net_local)); + kfree_s(dev_tms380tr[i], sizeof(struct net_device)); + dev_tms380tr[i] = NULL; + } + } +} +#endif /* MODULE */ diff --git a/drivers/net/tokenring/tms380tr.h b/drivers/net/tokenring/tms380tr.h new file mode 100644 index 000000000..7896be0a0 --- /dev/null +++ b/drivers/net/tokenring/tms380tr.h @@ -0,0 +1,1109 @@ +/* tms380tr.h: TI TMS380 Token Ring driver for Linux + * + * Authors: + * - Christoph Goos <cgoos@syskonnect.de> + */ + +#ifndef __LINUX_TMS380TR_H +#define __LINUX_TMS380TR_H + +#ifdef __KERNEL__ + +#define TMS380TR_MAX_ADAPTERS 7 + +#define SEND_TIMEOUT 10*HZ + +#define TR_RCF_LONGEST_FRAME_MASK 0x0070 +#define TR_RCF_FRAME4K 0x0030 + +/*------------------------------------------------------------------*/ +/* Bit order for adapter communication with DMA */ +/* -------------------------------------------------------------- */ +/* Bit 8 | 9| 10| 11|| 12| 13| 14| 15|| 0| 1| 2| 3|| 4| 5| 6| 7| */ +/* -------------------------------------------------------------- */ +/* The bytes in a word must be byte swapped. Also, if a double */ +/* word is used for storage, then the words, as well as the bytes, */ +/* must be swapped. */ +/* Bit order for adapter communication with DIO */ +/* -------------------------------------------------------------- */ +/* Bit 0 | 1| 2| 3|| 4| 5| 6| 7|| 8| 9| 10| 11|| 12| 13| 14| 15| */ +/* -------------------------------------------------------------- */ +/*------------------------------------------------------------------*/ + +/* Swap bytes of a word. */ +#define SWAPB(x) (((unsigned short)((x) << 8)) | ((unsigned short)((x) >> 8))) + +/* Swap words of a long. */ +#define SWAPW(x) (((x) << 16) | ((x) >> 16)) + +/* Get the low byte of a word. */ +#define LOBYTE(w) ((unsigned char)(w)) + +/* Get the high byte of a word. */ +#define HIBYTE(w) ((unsigned char)((unsigned short)(w) >> 8)) + +/* Get the low word of a long. */ +#define LOWORD(l) ((unsigned short)(l)) + +/* Get the high word of a long. */ +#define HIWORD(l) ((unsigned short)((unsigned long)(l) >> 16)) + + + +/* Token ring adapter I/O addresses for normal mode. */ +#define SIFDAT 0L /* SIF/DMA data. */ +#define SIFINC 2L /* IO Word data with auto increment. */ +#define SIFINH 3L /* IO Byte data with auto increment. */ +#define SIFADR 4L /* SIF/DMA Address. */ +#define SIFCMD 6L /* SIF Command. */ +#define SIFSTS 6L /* SIF Status. */ +#define SIFACL 8L /* SIF Adapter Control Register. */ +#define SIFADD 10L /* SIF/DMA Address. */ +#define SIFADX 12L +#define DMALEN 14L /* SIF DMA length. */ +#define POSREG 16L /* Adapter Program Option Select (POS) + * Register: base IO address + 16 byte. + */ +#define POSREG_2 24L /* only for TR4/16+ adapter + * base IO address + 24 byte. + */ + + +/* SIFCMD command codes (high-low) */ +#define CMD_INTERRUPT_ADAPTER 0x8000 /* Cause internal adapter interrupt */ +#define CMD_ADAPTER_RESET 0x4000 /* Hardware reset of adapter */ +#define CMD_SSB_CLEAR 0x2000 /* Acknowledge to adapter to + * system interrupts. + */ +#define CMD_EXECUTE 0x1000 /* Execute SCB command */ +#define CMD_SCB_REQUEST 0x0800 /* Request adapter to interrupt + * system when SCB is available for + * another command. + */ +#define CMD_RX_CONTINUE 0x0400 /* Continue receive after odd pointer + * stop. (odd pointer receive method) + */ +#define CMD_RX_VALID 0x0200 /* Now actual RPL is valid. */ +#define CMD_TX_VALID 0x0100 /* Now actual TPL is valid. (valid + * bit receive/transmit method) + */ +#define CMD_SYSTEM_IRQ 0x0080 /* Adapter-to-attached-system + * interrupt is reset. + */ +#define CMD_CLEAR_SYSTEM_IRQ 0x0080 /* Clear SYSTEM_INTERRUPT bit. + * (write: 1=ignore, 0=reset) + */ +#define EXEC_SOFT_RESET 0xFF00 /* adapter soft reset. (restart + * adapter after hardware reset) + */ + + +/* ACL commands (high-low) */ +#define ACL_SWHLDA 0x0800 /* Software hold acknowledge. */ +#define ACL_SWDDIR 0x0400 /* Data transfer direction. */ +#define ACL_SWHRQ 0x0200 /* Pseudo DMA operation. */ +#define ACL_PSDMAEN 0x0100 /* Enable pseudo system DMA. */ +#define ACL_ARESET 0x0080 /* Adapter hardware reset command. + * (held in reset condition as + * long as bit is set) + */ +#define ACL_CPHALT 0x0040 /* Communication processor halt. + * (can only be set while ACL_ARESET + * bit is set; prevents adapter + * processor from executing code while + * downloading firmware) + */ +#define ACL_BOOT 0x0020 +#define ACL_SINTEN 0x0008 /* System interrupt enable/disable + * (1/0): can be written if ACL_ARESET + * is zero. + */ +#define ACL_SPEED4 0x0003 +#define ACL_SPEED16 0x0001 +#define PS_DMA_MASK (ACL_SWHRQ | ACL_PSDMAEN) + + +/* SIFSTS register return codes (high-low) */ +#define STS_SYSTEM_IRQ 0x0080 /* Adapter-to-attached-system + * interrupt is valid. + */ +#define STS_INITIALIZE 0x0040 /* INITIALIZE status. (ready to + * initialize) + */ +#define STS_TEST 0x0020 /* TEST status. (BUD not completed) */ +#define STS_ERROR 0x0010 /* ERROR status. (unrecoverable + * HW error occurred) + */ +#define STS_MASK 0x00F0 /* Mask interesting status bits. */ +#define STS_ERROR_MASK 0x000F /* Get Error Code by masking the + * interrupt code bits. + */ +#define ADAPTER_INT_PTRS 0x0A00 /* Address offset of adapter internal + * pointers 01:0a00 (high-low) have to + * be read after init and before open. + */ + + +/* Interrupt Codes (only MAC IRQs) */ +#define STS_IRQ_ADAPTER_CHECK 0x0000 /* unrecoverable hardware or + * software error. + */ +#define STS_IRQ_RING_STATUS 0x0004 /* SSB is updated with ring status. */ +#define STS_IRQ_SCB_CLEAR 0x0006 /* SCB clear, following an + * SCB_REQUEST IRQ. + */ +#define STS_IRQ_COMMAND_STATUS 0x0008 /* SSB is updated with command + * status. + */ +#define STS_IRQ_RECEIVE_STATUS 0x000A /* SSB is updated with receive + * status. + */ +#define STS_IRQ_TRANSMIT_STATUS 0x000C /* SSB is updated with transmit + * status + */ +#define STS_IRQ_MASK 0x000F /* = STS_ERROR_MASK. */ + + +/* TRANSMIT_STATUS completion code: (SSB.Parm[0]) */ +#define COMMAND_COMPLETE 0x0080 /* TRANSMIT command completed + * (avoid this!) issue another transmit + * to send additional frames. + */ +#define FRAME_COMPLETE 0x0040 /* Frame has been transmitted; + * INTERRUPT_FRAME bit was set in the + * CSTAT request; indication of possibly + * more than one frame transmissions! + * SSB.Parm[0-1]: 32 bit pointer to + * TPL of last frame. + */ +#define LIST_ERROR 0x0020 /* Error in one of the TPLs that + * compose the frame; TRANSMIT + * terminated; Parm[1-2]: 32 bit pointer + * to TPL which starts the error + * frame; error details in bits 8-13. + * (14?) + */ +#define FRAME_SIZE_ERROR 0x8000 /* FRAME_SIZE does not equal the sum of + * the valid DATA_COUNT fields; + * FRAME_SIZE less than header plus + * information field. (15 bytes + + * routing field) Or if FRAME_SIZE + * was specified as zero in one list. + */ +#define TX_THRESHOLD 0x4000 /* FRAME_SIZE greater than (BUFFER_SIZE + * - 9) * TX_BUF_MAX. + */ +#define ODD_ADDRESS 0x2000 /* Odd forward pointer value is + * read on a list without END_FRAME + * indication. + */ +#define FRAME_ERROR 0x1000 /* START_FRAME bit is (not) anticipated, + * but (not) set. + */ +#define ACCESS_PRIORITY_ERROR 0x0800 /* Access priority requested has not + * been allowed. + */ +#define UNENABLED_MAC_FRAME 0x0400 /* MAC frame has source class of zero + * or MAC frame PCF ATTN field is + * greater than one. + */ +#define ILLEGAL_FRAME_FORMAT 0x0200 /* Bit 0 or FC field was set to one. */ + + +/* + * Since we need to support some functions even if the adapter is in a + * CLOSED state, we have a (pseudo-) command queue which holds commands + * that are outstandig to be executed. + * + * Each time a command completes, an interrupt occurs and the next + * command is executed. The command queue is actually a simple word with + * a bit for each outstandig command. Therefore the commands will not be + * executed in the order they have been queued. + * + * The following defines the command code bits and the command queue: + */ +#define OC_OPEN 0x0001 /* OPEN command */ +#define OC_TRANSMIT 0x0002 /* TRANSMIT command */ +#define OC_TRANSMIT_HALT 0x0004 /* TRANSMIT_HALT command */ +#define OC_RECEIVE 0x0008 /* RECEIVE command */ +#define OC_CLOSE 0x0010 /* CLOSE command */ +#define OC_SET_GROUP_ADDR 0x0020 /* SET_GROUP_ADDR command */ +#define OC_SET_FUNCT_ADDR 0x0040 /* SET_FUNCT_ADDR command */ +#define OC_READ_ERROR_LOG 0x0080 /* READ_ERROR_LOG command */ +#define OC_READ_ADAPTER 0x0100 /* READ_ADAPTER command */ +#define OC_MODIFY_OPEN_PARMS 0x0400 /* MODIFY_OPEN_PARMS command */ +#define OC_RESTORE_OPEN_PARMS 0x0800 /* RESTORE_OPEN_PARMS command */ +#define OC_SET_FIRST_16_GROUP 0x1000 /* SET_FIRST_16_GROUP command */ +#define OC_SET_BRIDGE_PARMS 0x2000 /* SET_BRIDGE_PARMS command */ +#define OC_CONFIG_BRIDGE_PARMS 0x4000 /* CONFIG_BRIDGE_PARMS command */ + +#define OPEN 0x0300 /* C: open command. S: completion. */ +#define TRANSMIT 0x0400 /* C: transmit command. S: completion + * status. (reject: COMMAND_REJECT if + * adapter not opened, TRANSMIT already + * issued or address passed in the SCB + * not word aligned) + */ +#define TRANSMIT_HALT 0x0500 /* C: interrupt TX TPL chain; if no + * TRANSMIT command issued, the command + * is ignored. (completion with TRANSMIT + * status (0x0400)!) + */ +#define RECEIVE 0x0600 /* C: receive command. S: completion + * status. (reject: COMMAND_REJECT if + * adapter not opened, RECEIVE already + * issued or address passed in the SCB + * not word aligned) + */ +#define CLOSE 0x0700 /* C: close adapter. S: completion. + * (COMMAND_REJECT if adapter not open) + */ +#define SET_GROUP_ADDR 0x0800 /* C: alter adapter group address after + * OPEN. S: completion. (COMMAND_REJECT + * if adapter not open) + */ +#define SET_FUNCT_ADDR 0x0900 /* C: alter adapter functional address + * after OPEN. S: completion. + * (COMMAND_REJECT if adapter not open) + */ +#define READ_ERROR_LOG 0x0A00 /* C: read adapter error counters. + * S: completion. (command ignored + * if adapter not open!) + */ +#define READ_ADAPTER 0x0B00 /* C: read data from adapter memory. + * (important: after init and before + * open!) S: completion. (ADAPTER_CHECK + * interrupt if undefined storage area + * read) + */ +#define MODIFY_OPEN_PARMS 0x0D00 /* C: modify some adapter operational + * parameters. (bit correspondend to + * WRAP_INTERFACE is ignored) + * S: completion. (reject: + * COMMAND_REJECT) + */ +#define RESTORE_OPEN_PARMS 0x0E00 /* C: modify some adapter operational + * parameters. (bit correspondend + * to WRAP_INTERFACE is ignored) + * S: completion. (reject: + * COMMAND_REJECT) + */ +#define SET_FIRST_16_GROUP 0x0F00 /* C: alter the first two bytes in + * adapter group address. + * S: completion. (reject: + * COMMAND_REJECT) + */ +#define SET_BRIDGE_PARMS 0x1000 /* C: values and conditions for the + * adapter hardware to use when frames + * are copied for forwarding. + * S: completion. (reject: + * COMMAND_REJECT) + */ +#define CONFIG_BRIDGE_PARMS 0x1100 /* C: .. + * S: completion. (reject: + * COMMAND_REJECT) + */ + +#define SPEED_4 4 +#define SPEED_16 16 /* Default transmission speed */ + + +/* Initialization Parameter Block (IPB); word alignment necessary! */ +#define BURST_SIZE 0x0018 /* Default burst size */ +#define BURST_MODE 0x9F00 /* Burst mode enable */ +#define DMA_RETRIES 0x0505 /* Magic DMA retry number... */ + +#define CYCLE_TIME 3 /* Default AT-bus cycle time: 500 ns + * (later adapter version: fix cycle time!) + */ +#define LINE_SPEED_BIT 0x80 + +/* Macro definition for the wait function. */ +#define ONE_SECOND_TICKS 1000000 +#define HALF_SECOND (ONE_SECOND_TICKS / 2) +#define ONE_SECOND (ONE_SECOND_TICKS) +#define TWO_SECONDS (ONE_SECOND_TICKS * 2) +#define THREE_SECONDS (ONE_SECOND_TICKS * 3) +#define FOUR_SECONDS (ONE_SECOND_TICKS * 4) +#define FIVE_SECONDS (ONE_SECOND_TICKS * 5) + +#define BUFFER_SIZE 2048 /* Buffers on Adapter */ + +#pragma pack(1) +typedef struct { + unsigned short Init_Options; /* Initialize with burst mode; + * LLC disabled. (MAC only) + */ + + /* Interrupt vectors the adapter places on attached system bus. */ + unsigned char CMD_Status_IV; /* Interrupt vector: command status. */ + unsigned char TX_IV; /* Interrupt vector: transmit. */ + unsigned char RX_IV; /* Interrupt vector: receive. */ + unsigned char Ring_Status_IV; /* Interrupt vector: ring status. */ + unsigned char SCB_Clear_IV; /* Interrupt vector: SCB clear. */ + unsigned char Adapter_CHK_IV; /* Interrupt vector: adapter check. */ + + unsigned short RX_Burst_Size; /* Max. number of transfer cycles. */ + unsigned short TX_Burst_Size; /* During DMA burst; even value! */ + unsigned short DMA_Abort_Thrhld; /* Number of DMA retries. */ + + unsigned long SCB_Addr; /* SCB address: even, word aligned, high-low. */ + unsigned long SSB_Addr; /* SSB address: even, word aligned, high-low. */ +} IPB, *IPB_Ptr; +#pragma pack() + +/* + * OPEN Command Parameter List (OCPL) (can be reused, if the adapter has to + * be reopened) + */ +#define BUFFER_SIZE 2048 /* Buffers on Adapter. */ +#define TPL_SIZE 8+6*TX_FRAG_NUM /* Depending on fragments per TPL. */ +#define RPL_SIZE 14 /* (with TI firmware v2.26 handling + * up to nine fragments possible) + */ +#define TX_BUF_MIN 20 /* ??? (Stephan: calculation with */ +#define TX_BUF_MAX 40 /* BUFFER_SIZE and MAX_FRAME_SIZE) ??? + */ +#define DISABLE_EARLY_TOKEN_RELEASE 0x1000 + +/* OPEN Options (high-low) */ +#define WRAP_INTERFACE 0x0080 /* Inserting omitted for test + * purposes; transmit data appears + * as receive data. (usefull for + * testing; change: CLOSE necessary) + */ +#define DISABLE_HARD_ERROR 0x0040 /* On HARD_ERROR & TRANSMIT_BEACON + * no RING.STATUS interrupt. + */ +#define DISABLE_SOFT_ERROR 0x0020 /* On SOFT_ERROR, no RING.STATUS + * interrupt. + */ +#define PASS_ADAPTER_MAC_FRAMES 0x0010 /* Passing unsupported MAC frames + * to system. + */ +#define PASS_ATTENTION_FRAMES 0x0008 /* All changed attention MAC frames are + * passed to the system. + */ +#define PAD_ROUTING_FIELD 0x0004 /* Routing field is padded to 18 + * bytes. + */ +#define FRAME_HOLD 0x0002 /* Adapter waits for entire frame before + * initiating DMA transfer; otherwise: + * DMA transfer initiation if internal + * buffer filled. + */ +#define CONTENDER 0x0001 /* Adapter participates in the monitor + * contention process. + */ +#define PASS_BEACON_MAC_FRAMES 0x8000 /* Adapter passes beacon MAC frames + * to the system. + */ +#define EARLY_TOKEN_RELEASE 0x1000 /* Only valid in 16 Mbps operation; + * 0 = ETR. (no effect in 4 Mbps + * operation) + */ +#define COPY_ALL_MAC_FRAMES 0x0400 /* All MAC frames are copied to + * the system. (after OPEN: duplicate + * address test (DAT) MAC frame is + * first received frame copied to the + * system) + */ +#define COPY_ALL_NON_MAC_FRAMES 0x0200 /* All non MAC frames are copied to + * the system. + */ +#define PASS_FIRST_BUF_ONLY 0x0100 /* Passes only first internal buffer + * of each received frame; FrameSize + * of RPLs must contain internal + * BUFFER_SIZE bits for promiscous mode. + */ +#define ENABLE_FULL_DUPLEX_SELECTION 0x2000 /* Enable the use of full-duplex + * settings with bits in byte 22 in + * ocpl. (new feature in firmware + * version 3.09) + */ + +/* Full-duplex settings */ +#define OPEN_FULL_DUPLEX_OFF 0x0000 +#define OPEN_FULL_DUPLEX_ON 0x00c0 +#define OPEN_FULL_DUPLEX_AUTO 0x0080 + +#define PROD_ID_SIZE 18 /* Length of product ID. */ + +#define TX_FRAG_NUM 3 /* Number of fragments used in one TPL. */ +#define TX_MORE_FRAGMENTS 0x8000 /* Bit set in DataCount to indicate more + * fragments following. + */ + +#define ISA_MAX_ADDRESS 0x00ffffff + +#pragma pack(1) +typedef struct { + unsigned short OPENOptions; + unsigned char NodeAddr[6]; /* Adapter node address; use ROM + * address + */ + unsigned long GroupAddr; /* Multicast: high order + * bytes = 0xC000 + */ + unsigned long FunctAddr; /* High order bytes = 0xC000 */ + unsigned short RxListSize; /* RPL size: 0 (=26), 14, 20 or + * 26 bytes read by the adapter. + * (Depending on the number of + * fragments/list) + */ + unsigned short TxListSize; /* TPL size */ + unsigned short BufSize; /* Is automatically rounded up to the + * nearest nK boundary. + */ + unsigned short FullDuplex; + unsigned short Reserved; + unsigned char TXBufMin; /* Number of adapter buffers reserved + * for transmission a minimum of 2 + * buffers must be allocated. + */ + unsigned char TXBufMax; /* Maximum number of adapter buffers + * for transmit; a minimum of 2 buffers + * must be available for receive. + * Default: 6 + */ + unsigned short ProdIDAddr[2]; /* Pointer to product ID. */ +} OPB, *OPB_Ptr; +#pragma pack() + +/* + * SCB: adapter commands enabled by the host system started by writing + * CMD_INTERRUPT_ADAPTER | CMD_EXECUTE (|SCB_REQUEST) to the SIFCMD IO + * register. (special case: | CMD_SYSTEM_IRQ for initialization) + */ +#pragma pack(1) +typedef struct { + unsigned short CMD; /* Command code */ + unsigned short Parm[2]; /* Pointer to Command Parameter Block */ +} SCB; /* System Command Block (32 bit physical address; big endian)*/ +#pragma pack() + +/* + * SSB: adapter command return status can be evaluated after COMMAND_STATUS + * adapter to system interrupt after reading SSB, the availability of the SSB + * has to be told the adapter by writing CMD_INTERRUPT_ADAPTER | CMD_SSB_CLEAR + * in the SIFCMD IO register. + */ +#pragma pack(1) +typedef struct { + unsigned short STS; /* Status code */ + unsigned short Parm[3]; /* Parameter or pointer to Status Parameter + * Block. + */ +} SSB; /* System Status Block (big endian - physical address) */ +#pragma pack() + +typedef struct { + unsigned short BurnedInAddrPtr; /* Pointer to adapter burned in + * address. (BIA) + */ + unsigned short SoftwareLevelPtr;/* Pointer to software level data. */ + unsigned short AdapterAddrPtr; /* Pointer to adapter addresses. */ + unsigned short AdapterParmsPtr; /* Pointer to adapter parameters. */ + unsigned short MACBufferPtr; /* Pointer to MAC buffer. (internal) */ + unsigned short LLCCountersPtr; /* Pointer to LLC counters. */ + unsigned short SpeedFlagPtr; /* Pointer to data rate flag. + * (4/16 Mbps) + */ + unsigned short AdapterRAMPtr; /* Pointer to adapter RAM found. (KB) */ +} INTPTRS; /* Adapter internal pointers */ + +#pragma pack(1) +typedef struct { + unsigned char Line_Error; /* Line error: code violation in + * frame or in a token, or FCS error. + */ + unsigned char Internal_Error; /* IBM specific. (Reserved_1) */ + unsigned char Burst_Error; + unsigned char ARI_FCI_Error; /* ARI/FCI bit zero in AMP or + * SMP MAC frame. + */ + unsigned char AbortDelimeters; /* IBM specific. (Reserved_2) */ + unsigned char Reserved_3; + unsigned char Lost_Frame_Error; /* Receive of end of transmitted + * frame failed. + */ + unsigned char Rx_Congest_Error; /* Adapter in repeat mode has not + * enough buffer space to copy incoming + * frame. + */ + unsigned char Frame_Copied_Error;/* ARI bit not zero in frame + * addressed to adapter. + */ + unsigned char Frequency_Error; /* IBM specific. (Reserved_4) */ + unsigned char Token_Error; /* (active only in monitor station) */ + unsigned char Reserved_5; + unsigned char DMA_Bus_Error; /* DMA bus errors not exceeding the + * abort thresholds. + */ + unsigned char DMA_Parity_Error; /* DMA parity errors not exceeding + * the abort thresholds. + */ +} ERRORTAB; /* Adapter error counters */ +#pragma pack() + + +/*--------------------- Send and Receive definitions -------------------*/ +#pragma pack(1) +typedef struct { + unsigned short DataCount; /* Value 0, even and odd values are + * permitted; value is unaltered most + * significant bit set: following + * fragments last fragment: most + * significant bit is not evaluated. + * (???) + */ + unsigned long DataAddr; /* Pointer to frame data fragment; + * even or odd. + */ +} Fragment; +#pragma pack() + +#define MAX_FRAG_NUMBERS 9 /* Maximal number of fragments possible to use + * in one RPL/TPL. (depending on TI firmware + * version) + */ +#define MAX_TX_QUEUE 10 /* Maximal number of skb's queued in driver. */ + +/* + * AC (1), FC (1), Dst (6), Src (6), RIF (18), Data (4472) = 4504 + * The packet size can be one of the follows: 548, 1502, 2084, 4504, 8176, + * 11439, 17832. Refer to TMS380 Second Generation Token Ring User's Guide + * Page 2-27. + */ +#define HEADER_SIZE (1 + 1 + 6 + 6) +#define SRC_SIZE 18 +#define MIN_DATA_SIZE 516 +#define DEFAULT_DATA_SIZE 4472 +#define MAX_DATA_SIZE 17800 + +#define DEFAULT_PACKET_SIZE (HEADER_SIZE + SRC_SIZE + DEFAULT_DATA_SIZE) +#define MIN_PACKET_SIZE (HEADER_SIZE + SRC_SIZE + MIN_DATA_SIZE) +#define MAX_PACKET_SIZE (HEADER_SIZE + SRC_SIZE + MAX_DATA_SIZE) + +/* + * Macros to deal with the frame status field. + */ +#define AC_NOT_RECOGNIZED 0x00 +#define GROUP_BIT 0x80 +#define GET_TRANSMIT_STATUS_HIGH_BYTE(Ts) ((unsigned char)((Ts) >> 8)) +#define GET_FRAME_STATUS_HIGH_AC(Fs) ((unsigned char)(((Fs) & 0xC0) >> 6)) +#define GET_FRAME_STATUS_LOW_AC(Fs) ((unsigned char)(((Fs) & 0x0C) >> 2)) +#define DIRECTED_FRAME(Context) (!((Context)->MData[2] & GROUP_BIT)) + + +/*--------------------- Send Functions ---------------------------------*/ +/* define TX_CSTAT _REQUEST (R) and _COMPLETE (C) values (high-low) */ + +#define TX_VALID 0x0080 /* R: set via TRANSMIT.VALID interrupt. + * C: always reset to zero! + */ +#define TX_FRAME_COMPLETE 0x0040 /* R: must be reset to zero. + * C: set to one. + */ +#define TX_START_FRAME 0x0020 /* R: start of a frame: 1 + * C: unchanged. + */ +#define TX_END_FRAME 0x0010 /* R: end of a frame: 1 + * C: unchanged. + */ +#define TX_FRAME_IRQ 0x0008 /* R: request interrupt generation + * after transmission. + * C: unchanged. + */ +#define TX_ERROR 0x0004 /* R: reserved. + * C: set to one if Error occurred. + */ +#define TX_INTERFRAME_WAIT 0x0004 +#define TX_PASS_CRC 0x0002 /* R: set if CRC value is already + * calculated. (valid only in + * FRAME_START TPL) + * C: unchanged. + */ +#define TX_PASS_SRC_ADDR 0x0001 /* R: adapter uses explicit frame + * source address and does not overwrite + * with the adapter node address. + * (valid only in FRAME_START TPL) + * + * C: unchanged. + */ +#define TX_STRIP_FS 0xFF00 /* R: reserved. + * C: if no Transmission Error, + * field contains copy of FS byte after + * stripping of frame. + */ + +/* + * Structure of Transmit Parameter Lists (TPLs) (only one frame every TPL, + * but possibly multiple TPLs for one frame) the length of the TPLs has to be + * initialized in the OPL. (OPEN parameter list) + */ +#define TPL_NUM 3 /* Number of Transmit Parameter Lists. + * !! MUST BE >= 3 !! + */ + +#pragma pack(1) +typedef struct s_TPL TPL; + +struct s_TPL { /* Transmit Parameter List (align on even word boundaries) */ + unsigned long NextTPLAddr; /* Pointer to next TPL in chain; if + * pointer is odd: this is the last + * TPL. Pointing to itself can cause + * problems! + */ + volatile unsigned short Status; /* Initialized by the adapter: + * CSTAT_REQUEST important: update least + * significant bit first! Set by the + * adapter: CSTAT_COMPLETE status. + */ + unsigned short FrameSize; /* Number of bytes to be transmitted + * as a frame including AC/FC, + * Destination, Source, Routing field + * not including CRC, FS, End Delimiter + * (valid only if START_FRAME bit in + * CSTAT nonzero) must not be zero in + * any list; maximum value: (BUFFER_SIZE + * - 8) * TX_BUF_MAX sum of DataCount + * values in FragmentList must equal + * Frame_Size value in START_FRAME TPL! + * frame data fragment list. + */ + + /* TPL/RPL size in OPEN parameter list depending on maximal + * numbers of fragments used in one parameter list. + */ + Fragment FragList[TX_FRAG_NUM]; /* Maximum: nine frame fragments in one + * TPL actual version of firmware: 9 + * fragments possible. + */ +#pragma pack() + + /* Special proprietary data and precalculations */ + + TPL *NextTPLPtr; /* Pointer to next TPL in chain. */ + unsigned char *MData; + struct sk_buff *Skb; + unsigned char TPLIndex; + volatile unsigned char BusyFlag;/* Flag: TPL busy? */ +}; + +/* ---------------------Receive Functions-------------------------------* + * define RECEIVE_CSTAT_REQUEST (R) and RECEIVE_CSTAT_COMPLETE (C) values. + * (high-low) + */ +#define RX_VALID 0x0080 /* R: set; tell adapter with + * RECEIVE.VALID interrupt. + * C: reset to zero. + */ +#define RX_FRAME_COMPLETE 0x0040 /* R: must be reset to zero, + * C: set to one. + */ +#define RX_START_FRAME 0x0020 /* R: must be reset to zero. + * C: set to one on the list. + */ +#define RX_END_FRAME 0x0010 /* R: must be reset to zero. + * C: set to one on the list + * that ends the frame. + */ +#define RX_FRAME_IRQ 0x0008 /* R: request interrupt generation + * after receive. + * C: unchanged. + */ +#define RX_INTERFRAME_WAIT 0x0004 /* R: after receiving a frame: + * interrupt and wait for a + * RECEIVE.CONTINUE. + * C: unchanged. + */ +#define RX_PASS_CRC 0x0002 /* R: if set, the adapter includes + * the CRC in data passed. (last four + * bytes; valid only if FRAME_START is + * set) + * C: set, if CRC is included in + * received data. + */ +#define RX_PASS_SRC_ADDR 0x0001 /* R: adapter uses explicit frame + * source address and does not + * overwrite with the adapter node + * address. (valid only if FRAME_START + * is set) + * C: unchanged. + */ +#define RX_RECEIVE_FS 0xFC00 /* R: reserved; must be reset to zero. + * C: on lists with START_FRAME, field + * contains frame status field from + * received frame; otherwise cleared. + */ +#define RX_ADDR_MATCH 0x0300 /* R: reserved; must be reset to zero. + * C: address match code mask. + */ +#define RX_STATUS_MASK 0x00FF /* Mask for receive status bits. */ + +#define RX_INTERN_ADDR_MATCH 0x0100 /* C: internally address match. */ +#define RX_EXTERN_ADDR_MATCH 0x0200 /* C: externally matched via + * XMATCH/XFAIL interface. + */ +#define RX_INTEXT_ADDR_MATCH 0x0300 /* C: internally and externally + * matched. + */ +#define RX_READY (RX_VALID | RX_FRAME_IRQ) /* Ready for receive. */ + +/* Constants for Command Status Interrupt. + * COMMAND_REJECT status field bit functions (SSB.Parm[0]) + */ +#define ILLEGAL_COMMAND 0x0080 /* Set if an unknown command + * is issued to the adapter + */ +#define ADDRESS_ERROR 0x0040 /* Set if any address field in + * the SCB is odd. (not word aligned) + */ +#define ADAPTER_OPEN 0x0020 /* Command issued illegal with + * open adapter. + */ +#define ADAPTER_CLOSE 0x0010 /* Command issued illegal with + * closed adapter. + */ +#define SAME_COMMAND 0x0008 /* Command issued with same command + * already executing. + */ + +/* OPEN_COMPLETION values (SSB.Parm[0], MSB) */ +#define NODE_ADDR_ERROR 0x0040 /* Wrong address or BIA read + * zero address. + */ +#define LIST_SIZE_ERROR 0x0020 /* If List_Size value not in 0, + * 14, 20, 26. + */ +#define BUF_SIZE_ERROR 0x0010 /* Not enough available memory for + * two buffers. + */ +#define TX_BUF_COUNT_ERROR 0x0004 /* Remaining receive buffers less than + * two. + */ +#define OPEN_ERROR 0x0002 /* Error during ring insertion; more + * information in bits 8-15. + */ + +/* Standard return codes */ +#define GOOD_COMPLETION 0x0080 /* =OPEN_SUCCESSFULL */ +#define INVALID_OPEN_OPTION 0x0001 /* OPEN options are not supported by + * the adapter. + */ + +/* OPEN phases; details of OPEN_ERROR (SSB.Parm[0], LSB) */ +#define OPEN_PHASES_MASK 0xF000 /* Check only the bits 8-11. */ +#define LOBE_MEDIA_TEST 0x1000 +#define PHYSICAL_INSERTION 0x2000 +#define ADDRESS_VERIFICATION 0x3000 +#define PARTICIPATION_IN_RING_POLL 0x4000 +#define REQUEST_INITIALISATION 0x5000 +#define FULLDUPLEX_CHECK 0x6000 + +/* OPEN error codes; details of OPEN_ERROR (SSB.Parm[0], LSB) */ +#define OPEN_ERROR_CODES_MASK 0x0F00 /* Check only the bits 12-15. */ +#define OPEN_FUNCTION_FAILURE 0x0100 /* Unable to transmit to itself or + * frames received before insertion. + */ +#define OPEN_SIGNAL_LOSS 0x0200 /* Signal loss condition detected at + * receiver. + */ +#define OPEN_TIMEOUT 0x0500 /* Insertion timer expired before + * logical insertion. + */ +#define OPEN_RING_FAILURE 0x0600 /* Unable to receive own ring purge + * MAC frames. + */ +#define OPEN_RING_BEACONING 0x0700 /* Beacon MAC frame received after + * ring insertion. + */ +#define OPEN_DUPLICATE_NODEADDR 0x0800 /* Other station in ring found + * with the same address. + */ +#define OPEN_REQUEST_INIT 0x0900 /* RPS present but does not respond. */ +#define OPEN_REMOVE_RECEIVED 0x0A00 /* Adapter received a remove adapter + * MAC frame. + */ +#define OPEN_FULLDUPLEX_SET 0x0D00 /* Got this with full duplex on when + * trying to connect to a normal ring. + */ + +/* SET_BRIDGE_PARMS return codes: */ +#define BRIDGE_INVALID_MAX_LEN 0x4000 /* MAX_ROUTING_FIELD_LENGTH odd, + * less than 6 or > 30. + */ +#define BRIDGE_INVALID_SRC_RING 0x2000 /* SOURCE_RING number zero, too large + * or = TARGET_RING. + */ +#define BRIDGE_INVALID_TRG_RING 0x1000 /* TARGET_RING number zero, too large + * or = SOURCE_RING. + */ +#define BRIDGE_INVALID_BRDGE_NO 0x0800 /* BRIDGE_NUMBER too large. */ +#define BRIDGE_INVALID_OPTIONS 0x0400 /* Invalid bridge options. */ +#define BRIDGE_DIAGS_FAILED 0x0200 /* Diagnostics of TMS380SRA failed. */ +#define BRIDGE_NO_SRA 0x0100 /* The TMS380SRA does not exist in HW + * configuration. + */ + +/* + * Bring Up Diagnostics error codes. + */ +#define BUD_INITIAL_ERROR 0x0 +#define BUD_CHECKSUM_ERROR 0x1 +#define BUD_ADAPTER_RAM_ERROR 0x2 +#define BUD_INSTRUCTION_ERROR 0x3 +#define BUD_CONTEXT_ERROR 0x4 +#define BUD_PROTOCOL_ERROR 0x5 +#define BUD_INTERFACE_ERROR 0x6 + +/* BUD constants */ +#define BUD_MAX_RETRIES 3 +#define BUD_MAX_LOOPCNT 6 +#define BUD_TIMEOUT 3000 + +/* Initialization constants */ +#define INIT_MAX_RETRIES 3 /* Maximum three retries. */ +#define INIT_MAX_LOOPCNT 22 /* Maximum loop counts. */ + +/* RING STATUS field values (high/low) */ +#define SIGNAL_LOSS 0x0080 /* Loss of signal on the ring + * detected. + */ +#define HARD_ERROR 0x0040 /* Transmitting or receiving beacon + * frames. + */ +#define SOFT_ERROR 0x0020 /* Report error MAC frame + * transmitted. + */ +#define TRANSMIT_BEACON 0x0010 /* Transmitting beacon frames on the + * ring. + */ +#define LOBE_WIRE_FAULT 0x0008 /* Open or short circuit in the + * cable to concentrator; adapter + * closed. + */ +#define AUTO_REMOVAL_ERROR 0x0004 /* Lobe wrap test failed, deinserted; + * adapter closed. + */ +#define REMOVE_RECEIVED 0x0001 /* Received a remove ring station MAC + * MAC frame request; adapter closed. + */ +#define COUNTER_OVERFLOW 0x8000 /* Overflow of one of the adapters + * error counters; READ.ERROR.LOG. + */ +#define SINGLE_STATION 0x4000 /* Adapter is the only station on the + * ring. + */ +#define RING_RECOVERY 0x2000 /* Claim token MAC frames on the ring; + * reset after ring purge frame. + */ + +#define ADAPTER_CLOSED (LOBE_WIRE_FAULT | AUTO_REMOVAL_ERROR |\ + REMOVE_RECEIVED) + +/* Adapter_check_block.Status field bit assignments: */ +#define DIO_PARITY 0x8000 /* Adapter detects bad parity + * through direct I/O access. + */ +#define DMA_READ_ABORT 0x4000 /* Aborting DMA read operation + * from system Parm[0]: 0=timeout, + * 1=parity error, 2=bus error; + * Parm[1]: 32 bit pointer to host + * system address at failure. + */ +#define DMA_WRITE_ABORT 0x2000 /* Aborting DMA write operation + * to system. (parameters analogous to + * DMA_READ_ABORT) + */ +#define ILLEGAL_OP_CODE 0x1000 /* Illegal operation code in the + * the adapters firmware Parm[0]-2: + * communications processor registers + * R13-R15. + */ +#define PARITY_ERRORS 0x0800 /* Adapter detects internal bus + * parity error. + */ +#define RAM_DATA_ERROR 0x0080 /* Valid only during RAM testing; + * RAM data error Parm[0-1]: 32 bit + * pointer to RAM location. + */ +#define RAM_PARITY_ERROR 0x0040 /* Valid only during RAM testing; + * RAM parity error Parm[0-1]: 32 bit + * pointer to RAM location. + */ +#define RING_UNDERRUN 0x0020 /* Internal DMA underrun when + * transmitting onto ring. + */ +#define INVALID_IRQ 0x0008 /* Unrecognized interrupt generated + * internal to adapter Parm[0-2]: + * adapter register R13-R15. + */ +#define INVALID_ERROR_IRQ 0x0004 /* Unrecognized error interrupt + * generated Parm[0-2]: adapter register + * R13-R15. + */ +#define INVALID_XOP 0x0002 /* Unrecognized XOP request in + * communication processor Parm[0-2]: + * adapter register R13-R15. + */ +#define CHECKADDR 0x05E0 /* Adapter check status information + * address offset. + */ +#define ROM_PAGE_0 0x0000 /* Adapter ROM page 0. */ + +/* + * RECEIVE.STATUS interrupt result SSB values: (high-low) + * (RECEIVE_COMPLETE field bit definitions in SSB.Parm[0]) + */ +#define RX_COMPLETE 0x0080 /* SSB.Parm[0]; SSB.Parm[1]: 32 + * bit pointer to last RPL. + */ +#define RX_SUSPENDED 0x0040 /* SSB.Parm[0]; SSB.Parm[1]: 32 + * bit pointer to RPL with odd + * forward pointer. + */ + +/* Valid receive CSTAT: */ +#define RX_FRAME_CONTROL_BITS (RX_VALID | RX_START_FRAME | RX_END_FRAME | \ + RX_FRAME_COMPLETE) +#define VALID_SINGLE_BUFFER_FRAME (RX_START_FRAME | RX_END_FRAME | \ + RX_FRAME_COMPLETE) + +typedef enum SKB_STAT SKB_STAT; +enum SKB_STAT { + SKB_UNAVAILABLE, + SKB_DMA_DIRECT, + SKB_DATA_COPY +}; + +/* Receive Parameter List (RPL) The length of the RPLs has to be initialized + * in the OPL. (OPEN parameter list) + */ +#define RPL_NUM 3 + +#define RX_FRAG_NUM 1 /* Maximal number of used fragments in one RPL. + * (up to firmware v2.24: 3, now: up to 9) + */ + +#pragma pack(1) +typedef struct s_RPL RPL; +struct s_RPL { /* Receive Parameter List */ + unsigned long NextRPLAddr; /* Pointer to next RPL in chain + * (normalized = physical 32 bit + * address) if pointer is odd: this + * is last RPL. Pointing to itself can + * cause problems! + */ + volatile unsigned short Status; /* Set by creation of Receive Parameter + * List RECEIVE_CSTAT_COMPLETE set by + * adapter in lists that start or end + * a frame. + */ + volatile unsigned short FrameSize; /* Number of bytes received as a + * frame including AC/FC, Destination, + * Source, Routing field not including + * CRC, FS (Frame Status), End Delimiter + * (valid only if START_FRAME bit in + * CSTAT nonzero) must not be zero in + * any list; maximum value: (BUFFER_SIZE + * - 8) * TX_BUF_MAX sum of DataCount + * values in FragmentList must equal + * Frame_Size value in START_FRAME TPL! + * frame data fragment list + */ + + /* TPL/RPL size in OPEN parameter list depending on maximal numbers + * of fragments used in one parameter list. + */ + Fragment FragList[RX_FRAG_NUM]; /* Maximum: nine frame fragments in + * one TPL. Actual version of firmware: + * 9 fragments possible. + */ +#pragma pack() + + /* Special proprietary data and precalculations. */ + RPL *NextRPLPtr; /* Logical pointer to next RPL in chain. */ + unsigned char *MData; + struct sk_buff *Skb; + SKB_STAT SkbStat; + int RPLIndex; +}; + +#define TMS_ISA 1 +#define TMS_PCI 2 +struct cardinfo_table { + int type; /* 1 = ISA, 2 = PCI */ + int vendor_id; + int device_id; + char *name; +}; + +/* Information that need to be kept for each board. */ +typedef struct net_local { +#pragma pack(1) + IPB ipb; /* Initialization Parameter Block. */ + SCB scb; /* System Command Block: system to adapter + * communication. + */ + SSB ssb; /* System Status Block: adapter to system + * communication. + */ + OPB ocpl; /* Open Options Parameter Block. */ + + ERRORTAB errorlogtable; /* Adapter statistic error counters. + * (read from adapter memory) + */ + unsigned char ProductID[PROD_ID_SIZE + 1]; /* Product ID */ +#pragma pack() + + TPL Tpl[TPL_NUM]; + TPL *TplFree; + TPL *TplBusy; + unsigned char LocalTxBuffers[TPL_NUM][DEFAULT_PACKET_SIZE]; + + RPL Rpl[RPL_NUM]; + RPL *RplHead; + RPL *RplTail; + unsigned char LocalRxBuffers[RPL_NUM][DEFAULT_PACKET_SIZE]; + + int DataRate; + unsigned char ScbInUse; + unsigned short CMDqueue; + + unsigned long AdapterOpenFlag:1; + unsigned long AdapterVirtOpenFlag:1; + unsigned long OpenCommandIssued:1; + unsigned long TransmitCommandActive:1; + unsigned long TransmitHaltScheduled:1; + unsigned long HaltInProgress:1; + unsigned long LobeWireFaultLogged:1; + unsigned long ReOpenInProgress:1; + unsigned long Sleeping:1; + + unsigned long LastOpenStatus; + unsigned short CurrentRingStatus; + unsigned long MaxPacketSize; + + unsigned long StartTime; + unsigned long LastSendTime; + + struct sk_buff_head SendSkbQueue; + unsigned short QueueSkb; + + struct tr_statistics MacStat; /* MAC statistics structure */ + + struct cardinfo_table *CardType; + + struct timer_list timer; + + wait_queue_head_t wait_for_tok_int; + + INTPTRS intptrs; /* Internal adapter pointer. Must be read + * before OPEN command. + */ +} NET_LOCAL; + +#endif /* __KERNEL__ */ +#endif /* __LINUX_TMS380TR_H */ diff --git a/drivers/net/tokenring/tms380tr_microcode.h b/drivers/net/tokenring/tms380tr_microcode.h new file mode 100644 index 000000000..3c03f1f6f --- /dev/null +++ b/drivers/net/tokenring/tms380tr_microcode.h @@ -0,0 +1,3622 @@ +/* + * The firmware this driver downloads into the tokenring card is a + * separate program and is not GPL'd source code, even though the Linux + * side driver and the routine that loads this data into the card are. + * + * This firmware is licensed to you strictly for use in conjunction + * with the use of SysKonnect TokenRing adapters. There is no + * waranty expressed or implied about its fitness for any purpose. + */ + +/* tms380tr_microcode.h: TI TMS380 Token Ring driver COMMprocessor microcode + * + * Notes: + * - Loaded from tms380tr_reset_adapter upon adapter reset. + * + * This microcode is loaded into the TMS380 COMMprocessor during adapter + * initialization. It is copyright Texas Instruments and contains + * intellectual property of both TI and their contractors. + * + * TMS380 COMMprocessor Microcode Version 3.11 for Token Ring. + * + * Available from TI in COFF format (EAGLECAF.OUT). + * + */ + +#include <linux/config.h> + +#if defined(CONFIG_TMS380TR) || defined(CONFIG_TMS380TR_MODULE) + +unsigned char tms380tr_code[] = { + 0x00, 0x00, 0x00, 0xA0, 0x00, 0x20, 0x68, 0x54, + 0x73, 0x69, 0x63, 0x20, 0x64, 0x6F, 0x20, 0x65, + 0x73, 0x69, 0x72, 0x20, 0x6C, 0x65, 0x61, 0x65, + 0x65, 0x73, 0x20, 0x64, 0x6E, 0x75, 0x65, 0x64, + 0x20, 0x72, 0x69, 0x6C, 0x65, 0x63, 0x63, 0x6E, + 0x20, 0x65, 0x6E, 0x4F, 0x79, 0x6C, 0x20, 0x2C, + 0x6C, 0x41, 0x20, 0x6C, 0x69, 0x72, 0x68, 0x67, + 0x73, 0x74, 0x72, 0x20, 0x73, 0x65, 0x72, 0x65, + 0x65, 0x76, 0x2E, 0x64, 0x60, 0x01, 0x42, 0x01, + 0x00, 0x08, 0x08, 0x16, 0xB0, 0x03, 0xE0, 0x04, + 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0xFF, 0xFF, + 0xFC, 0x13, 0x80, 0x03, 0xA0, 0x07, 0x42, 0x01, + 0x00, 0x08, 0x20, 0x07, 0x00, 0x00, 0xE0, 0x04, + 0x00, 0x01, 0x8B, 0x07, 0x00, 0x3D, 0x60, 0x01, + 0x42, 0x01, 0x80, 0x00, 0x09, 0x13, 0x8B, 0x07, + 0x00, 0x2D, 0x20, 0xC0, 0x4E, 0x01, 0x80, 0x02, + 0x41, 0x0F, 0x02, 0x11, 0x8B, 0x07, 0x00, 0x3D, + 0x0B, 0xC8, 0x4A, 0x01, 0x00, 0x02, 0x00, 0x90, + 0xA0, 0x09, 0x00, 0xC8, 0x66, 0x01, 0xE0, 0x02, + 0xA0, 0x00, 0xA0, 0x07, 0x04, 0x01, 0x20, 0x00, + 0xA0, 0x01, 0x40, 0x01, 0x00, 0xFE, 0x20, 0x48, + 0x2A, 0xE0, 0x42, 0x01, 0xE0, 0x04, 0x02, 0x01, + 0xE0, 0x04, 0x60, 0x09, 0xE0, 0x04, 0x82, 0x01, + 0x60, 0x01, 0x1C, 0x01, 0x04, 0x00, 0x03, 0x16, + 0xE0, 0x01, 0x40, 0x01, 0x00, 0x0C, 0xA0, 0x06, + 0xBC, 0xA1, 0xA0, 0x07, 0x04, 0x01, 0x2D, 0x00, + 0x20, 0xC2, 0x00, 0xE0, 0x88, 0x02, 0x11, 0xE3, + 0x14, 0x16, 0xA0, 0x07, 0x04, 0x01, 0x2E, 0x00, + 0x60, 0x01, 0x42, 0x01, 0x00, 0x03, 0x0D, 0x16, + 0xA0, 0x07, 0x04, 0x01, 0x21, 0x00, 0x88, 0x07, + 0x00, 0xA0, 0x89, 0x07, 0xFE, 0xFF, 0xA8, 0x09, + 0xA9, 0x09, 0x8A, 0x07, 0x02, 0xE0, 0xA0, 0x06, + 0x84, 0xEC, 0x56, 0x10, 0x88, 0x07, 0x00, 0x90, + 0x89, 0x07, 0xFE, 0x9F, 0xA8, 0x09, 0xA9, 0x09, + 0x8A, 0x07, 0x78, 0xE0, 0xA0, 0x06, 0x84, 0xEC, + 0x4B, 0x10, 0xA0, 0x05, 0x04, 0x01, 0x88, 0x07, + 0x08, 0x00, 0x89, 0x07, 0x7A, 0x00, 0x00, 0x03, + 0x01, 0x00, 0xA0, 0x06, 0xD2, 0xAC, 0x40, 0x10, + 0xA0, 0x06, 0xBC, 0xA1, 0xE0, 0x02, 0xF4, 0x03, + 0x88, 0x07, 0xA0, 0x00, 0x89, 0x07, 0xFE, 0x00, + 0xA0, 0x06, 0xD2, 0xAC, 0x35, 0x10, 0xE0, 0x02, + 0xA0, 0x00, 0xE0, 0x04, 0x7E, 0x01, 0xC8, 0x04, + 0x09, 0x02, 0xF2, 0x03, 0x48, 0x62, 0xE0, 0xC1, + 0x40, 0x01, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x04, + 0x18, 0xCE, 0x09, 0x06, 0xFD, 0x16, 0xA0, 0x01, + 0x40, 0x01, 0x00, 0x40, 0x07, 0xC8, 0x40, 0x01, + 0x88, 0x07, 0xF4, 0x03, 0x89, 0x07, 0xFE, 0x3F, + 0xA0, 0x06, 0xD2, 0xAC, 0x19, 0x10, 0xE0, 0x02, + 0xA0, 0x00, 0xA0, 0x06, 0xFA, 0xAD, 0x14, 0x10, + 0x08, 0xC8, 0x44, 0x04, 0x09, 0xC8, 0x46, 0x04, + 0xA0, 0x06, 0x28, 0xAD, 0x0D, 0x10, 0x81, 0x07, + 0x7C, 0xE0, 0xB1, 0xC0, 0x26, 0x13, 0x01, 0xC8, + 0xE0, 0x00, 0xA0, 0x05, 0x04, 0x01, 0x92, 0x06, + 0x03, 0x10, 0x60, 0xC0, 0xE0, 0x00, 0xF5, 0x10, + 0xE0, 0x01, 0x04, 0x01, 0x10, 0x00, 0xB0, 0x03, + 0xFF, 0x10, 0xA0, 0x01, 0x04, 0x01, 0x00, 0x80, + 0x80, 0x03, 0x80, 0x07, 0xA0, 0x00, 0xC2, 0x04, + 0x80, 0xCC, 0x81, 0x07, 0xAA, 0xA1, 0x82, 0x02, + 0x1E, 0x00, 0x02, 0x16, 0x81, 0x07, 0xB4, 0xA1, + 0x81, 0xC4, 0x81, 0x8C, 0xE9, 0x16, 0x82, 0x02, + 0x7C, 0x00, 0xF2, 0x16, 0x00, 0x03, 0x0F, 0x00, + 0x5B, 0x04, 0x81, 0x07, 0x08, 0xE1, 0x82, 0x07, + 0x04, 0x00, 0xE0, 0x04, 0x80, 0x01, 0xE0, 0x04, + 0x82, 0x01, 0x91, 0xC4, 0xB1, 0x8C, 0xD8, 0x16, + 0x82, 0x02, 0x7C, 0x00, 0xFA, 0x16, 0x20, 0xC8, + 0x04, 0xE0, 0x82, 0x01, 0x20, 0xE8, 0x0C, 0xE0, + 0x82, 0x01, 0x20, 0xC8, 0x10, 0xE0, 0x80, 0x01, + 0x81, 0x07, 0x86, 0xE0, 0xB1, 0xC0, 0x07, 0x13, + 0xB1, 0xC4, 0xFC, 0x10, 0xA0, 0x07, 0x04, 0x01, + 0x2E, 0x00, 0x60, 0x04, 0xAA, 0xA1, 0x81, 0x07, + 0x34, 0xE0, 0x82, 0x07, 0xFC, 0x05, 0x83, 0x07, + 0x0A, 0x00, 0xB1, 0xCC, 0x43, 0x06, 0xFD, 0x16, + 0x02, 0x02, 0x00, 0x06, 0x60, 0xD0, 0x4E, 0x01, + 0xED, 0x13, 0x21, 0x02, 0x00, 0xF7, 0x21, 0x02, + 0x00, 0xC0, 0x81, 0xDC, 0x60, 0xD0, 0x4F, 0x01, + 0xC1, 0xC0, 0x41, 0x09, 0x21, 0x02, 0x00, 0xF0, + 0x81, 0xDC, 0x43, 0x02, 0x00, 0x0F, 0x23, 0x02, + 0x00, 0xF0, 0x83, 0xDC, 0x01, 0x02, 0x32, 0x0C, + 0xA0, 0xC0, 0x44, 0x04, 0xE0, 0xC0, 0x46, 0x04, + 0x03, 0xC1, 0x02, 0x61, 0x84, 0x05, 0x04, 0xC8, + 0x48, 0x04, 0x03, 0xC1, 0x84, 0x05, 0x04, 0xA1, + 0x01, 0xA1, 0x04, 0xC8, 0x30, 0x0C, 0x03, 0xC1, + 0x84, 0x05, 0xF1, 0x04, 0x04, 0x06, 0xFD, 0x16, + 0x08, 0x02, 0x00, 0xA0, 0xA8, 0x09, 0x60, 0xC2, + 0x30, 0x0C, 0x29, 0x02, 0xFF, 0x03, 0xA9, 0x09, + 0x29, 0x02, 0x40, 0x00, 0x80, 0x07, 0x00, 0x90, + 0xA0, 0x09, 0x8A, 0x07, 0xFE, 0x9F, 0x2A, 0x02, + 0xFF, 0x03, 0xAA, 0x09, 0x01, 0x02, 0x32, 0x0C, + 0x05, 0x02, 0x00, 0x00, 0x03, 0xC1, 0x84, 0x05, + 0x11, 0x07, 0xC1, 0x05, 0x85, 0x05, 0x04, 0x06, + 0x0B, 0x13, 0x85, 0x80, 0xF9, 0x1A, 0x05, 0x80, + 0xF8, 0x1A, 0x85, 0x82, 0xF5, 0x1A, 0x05, 0x82, + 0xF4, 0x1A, 0x45, 0x82, 0xF1, 0x1A, 0xF1, 0x10, + 0x20, 0x2D, 0x02, 0x00, 0x60, 0x01, 0x40, 0x01, + 0x00, 0x40, 0x06, 0x16, 0x8A, 0x07, 0x00, 0x08, + 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, 0x48, 0x10, + 0x60, 0x01, 0x42, 0x01, 0x00, 0x80, 0x06, 0x16, + 0x8A, 0x07, 0x00, 0x10, 0xA0, 0x01, 0x42, 0x01, + 0x00, 0x80, 0x3E, 0x10, 0x60, 0x01, 0x02, 0x01, + 0x00, 0x10, 0x0A, 0x16, 0x60, 0x01, 0x00, 0x01, + 0x00, 0x04, 0x06, 0x16, 0x8A, 0x07, 0x00, 0x80, + 0xA0, 0x01, 0x02, 0x01, 0x00, 0x10, 0x30, 0x10, + 0x60, 0x01, 0x02, 0x01, 0x00, 0x08, 0x0A, 0x16, + 0x60, 0x01, 0x00, 0x01, 0x00, 0x04, 0x06, 0x16, + 0xA0, 0x01, 0x02, 0x01, 0x00, 0x08, 0x0D, 0x02, + 0x01, 0x00, 0x0D, 0x10, 0x60, 0x01, 0x02, 0x01, + 0x00, 0x04, 0x16, 0x16, 0x60, 0x01, 0x00, 0x01, + 0x00, 0x08, 0x12, 0x16, 0xA0, 0x01, 0x02, 0x01, + 0x00, 0x04, 0x0D, 0x02, 0x02, 0x00, 0xA0, 0xC3, + 0x0E, 0x01, 0xE0, 0xC3, 0x10, 0x01, 0x8A, 0x07, + 0x00, 0x20, 0x60, 0x01, 0x00, 0x01, 0x00, 0x80, + 0x0B, 0x13, 0x8A, 0x07, 0x00, 0x40, 0x08, 0x10, + 0x8A, 0x07, 0x04, 0x00, 0x05, 0x10, 0x8A, 0x07, + 0x02, 0x00, 0x02, 0x10, 0x8A, 0x07, 0x08, 0x00, + 0x00, 0x03, 0x00, 0x00, 0xE0, 0x04, 0x82, 0x01, + 0x8B, 0x07, 0xE0, 0x05, 0xCA, 0xCE, 0xCD, 0xCE, + 0xCE, 0xCE, 0xCF, 0xC6, 0x20, 0xC3, 0x58, 0x07, + 0x20, 0x23, 0x04, 0xE0, 0x12, 0x13, 0x8B, 0x07, + 0x18, 0xFF, 0x8A, 0x02, 0x00, 0x80, 0x0A, 0x13, + 0x8B, 0x05, 0xCD, 0xA2, 0x8A, 0x02, 0x00, 0x40, + 0x05, 0x13, 0x8A, 0x02, 0x00, 0x20, 0x02, 0x13, + 0x8B, 0x07, 0x1D, 0xFF, 0x0B, 0xC8, 0x04, 0x01, + 0x0D, 0x10, 0x20, 0xD3, 0x05, 0x01, 0xFD, 0x11, + 0x20, 0xD8, 0xDF, 0x07, 0x17, 0x01, 0x8B, 0x07, + 0x80, 0xFF, 0x0B, 0xC8, 0x04, 0x01, 0x20, 0xE8, + 0x0A, 0xE0, 0x00, 0x01, 0xE0, 0xC2, 0x04, 0x01, + 0xE0, 0x22, 0x86, 0xE1, 0xFB, 0x16, 0xE0, 0x02, + 0xA0, 0x00, 0xE0, 0x04, 0x82, 0x01, 0x20, 0xE8, + 0x0A, 0xE0, 0x00, 0x01, 0xE0, 0xC2, 0x00, 0x01, + 0xE0, 0x22, 0x06, 0xE0, 0xF8, 0x13, 0xA0, 0x01, + 0x40, 0x01, 0x00, 0xF6, 0x60, 0x04, 0x90, 0xA0, + 0x00, 0x03, 0x02, 0x00, 0xA0, 0x07, 0x02, 0x01, + 0xFF, 0xDF, 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03, + 0x00, 0x03, 0x02, 0x00, 0x09, 0x07, 0xA0, 0xC2, + 0x04, 0x01, 0x8A, 0x01, 0x80, 0x00, 0x4A, 0x52, + 0x89, 0xD2, 0x0A, 0xC8, 0x04, 0x01, 0xA0, 0xD2, + 0x04, 0x01, 0xF9, 0x16, 0x49, 0x05, 0x89, 0x01, + 0x00, 0x80, 0x49, 0x01, 0x00, 0x40, 0x0E, 0x13, + 0x09, 0xF8, 0x3A, 0x07, 0x60, 0xC2, 0x36, 0x07, + 0x03, 0x16, 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03, + 0xE0, 0x04, 0x36, 0x07, 0x54, 0x04, 0x90, 0x03, + 0xFF, 0xFF, 0x80, 0x03, 0x60, 0x22, 0x86, 0xE1, + 0xC2, 0x13, 0xE0, 0x04, 0x82, 0x01, 0x60, 0x04, + 0xE0, 0xA3, 0x00, 0x03, 0x02, 0x00, 0xA0, 0x07, + 0x62, 0x09, 0xE8, 0x03, 0xC9, 0x04, 0xA0, 0xC1, + 0x34, 0x06, 0x04, 0x16, 0xA0, 0x06, 0x50, 0xB5, + 0xE0, 0x04, 0x20, 0x09, 0x86, 0x07, 0xE8, 0x05, + 0xA0, 0x01, 0x40, 0x01, 0x00, 0x80, 0x20, 0xC2, + 0x84, 0x01, 0x20, 0x48, 0x08, 0xE0, 0x84, 0x01, + 0x20, 0x22, 0x08, 0xE0, 0x08, 0x13, 0x60, 0x01, + 0xAE, 0x01, 0x01, 0x00, 0x04, 0x16, 0xE0, 0x01, + 0x34, 0x06, 0x00, 0x80, 0x06, 0x10, 0x20, 0xC2, + 0x32, 0x09, 0x06, 0x13, 0xE0, 0x01, 0x34, 0x06, + 0x00, 0x08, 0xE0, 0x04, 0x30, 0x06, 0x09, 0x07, + 0xA0, 0x05, 0xEE, 0x05, 0x20, 0x06, 0xEC, 0x05, + 0x02, 0x16, 0x16, 0xC2, 0x03, 0x16, 0x49, 0xC2, + 0x12, 0x16, 0x80, 0x03, 0x98, 0xC5, 0xE8, 0xC1, + 0x02, 0x00, 0xE0, 0xE9, 0x14, 0xE0, 0x04, 0x00, + 0xD7, 0x04, 0x27, 0x02, 0x08, 0x00, 0xA0, 0x06, + 0xE6, 0xB4, 0x16, 0xC2, 0x04, 0x13, 0x28, 0xC8, + 0x08, 0x00, 0xEC, 0x05, 0xEF, 0x13, 0x54, 0x04, + 0x00, 0x03, 0x02, 0x00, 0xE0, 0xC1, 0x86, 0x01, + 0x47, 0x02, 0x0E, 0x00, 0xA7, 0xC2, 0x90, 0xE1, + 0x5A, 0x04, 0x8A, 0x07, 0x00, 0xA0, 0x0A, 0xC8, + 0x86, 0x01, 0xC7, 0xA1, 0x27, 0x02, 0x98, 0xE1, + 0x37, 0xE8, 0x34, 0x06, 0x17, 0xE8, 0xD2, 0x06, + 0xE0, 0x04, 0x30, 0x06, 0x60, 0x04, 0xF2, 0xA9, + 0x0A, 0xE8, 0xD2, 0x06, 0xE0, 0x01, 0x34, 0x06, + 0x00, 0x08, 0xE0, 0x04, 0x30, 0x06, 0x20, 0xE0, + 0x18, 0xE0, 0x5B, 0x04, 0xA0, 0x05, 0x20, 0x09, + 0x20, 0x88, 0x20, 0x09, 0x16, 0xE0, 0xE5, 0x1A, + 0xE0, 0x04, 0x20, 0x09, 0xA0, 0x06, 0xD0, 0xD5, + 0x80, 0x03, 0xA0, 0x05, 0x32, 0x09, 0x80, 0x03, + 0x01, 0xC3, 0xFB, 0x13, 0x60, 0x01, 0x6A, 0x09, + 0x01, 0x00, 0x78, 0x13, 0xA0, 0x05, 0x32, 0x09, + 0x75, 0x10, 0x41, 0xC0, 0x06, 0x13, 0x01, 0xC8, + 0x6C, 0x01, 0xE0, 0xC2, 0x02, 0xFC, 0x01, 0x11, + 0x7B, 0x10, 0x60, 0x01, 0x9C, 0x01, 0x40, 0x00, + 0x79, 0x16, 0x20, 0xD8, 0x2F, 0x09, 0x83, 0x01, + 0x41, 0xC0, 0x04, 0x13, 0x01, 0xC8, 0x8A, 0x01, + 0x01, 0xC8, 0x18, 0x09, 0x86, 0x07, 0x43, 0x00, + 0x06, 0xC8, 0x6C, 0x01, 0x07, 0x02, 0x02, 0xFC, + 0x17, 0xC2, 0x60, 0x04, 0xFA, 0xA6, 0xE0, 0x04, + 0x18, 0x09, 0xC7, 0x61, 0x08, 0x07, 0x60, 0x01, + 0x06, 0xFC, 0x40, 0x00, 0x02, 0x13, 0x08, 0x02, + 0x01, 0x00, 0x09, 0x10, 0x4C, 0xC2, 0x20, 0xC3, + 0x00, 0xFC, 0x2A, 0x13, 0x0C, 0xC8, 0x6C, 0x01, + 0xE0, 0xC2, 0x02, 0xFC, 0x1B, 0x11, 0x4B, 0x01, + 0x00, 0x01, 0xF4, 0x16, 0xC8, 0x22, 0x12, 0x13, + 0xCB, 0x01, 0x00, 0x40, 0x0B, 0xC8, 0x02, 0xFC, + 0x0D, 0x10, 0xE0, 0xC1, 0x18, 0x09, 0x01, 0xC3, + 0x21, 0x13, 0x4C, 0xC2, 0x15, 0x13, 0x0C, 0xC8, + 0x6C, 0x01, 0xE0, 0xC2, 0x02, 0xFC, 0x06, 0x11, + 0xCC, 0x81, 0xD5, 0x13, 0x4C, 0xC2, 0x20, 0xC3, + 0x00, 0xFC, 0xF4, 0x10, 0x09, 0xC8, 0x6C, 0x01, + 0xE0, 0xC2, 0x02, 0xFC, 0x1E, 0x16, 0xA0, 0x07, + 0x02, 0xFC, 0x00, 0x80, 0x09, 0xC3, 0x19, 0x10, + 0x09, 0xC8, 0x6C, 0x01, 0xE0, 0xC2, 0x02, 0xFC, + 0x05, 0x16, 0xA0, 0x07, 0x02, 0xFC, 0x00, 0x80, + 0x09, 0xC3, 0x0F, 0x10, 0xE0, 0xC2, 0x02, 0x0C, + 0x01, 0x11, 0x1E, 0x10, 0x20, 0xD8, 0x00, 0xE2, + 0x83, 0x01, 0x8B, 0x09, 0x8B, 0x09, 0x8B, 0x09, + 0x8B, 0x09, 0xA0, 0x07, 0x8A, 0x01, 0x43, 0x00, + 0x13, 0x10, 0x0C, 0xC8, 0x8A, 0x01, 0x0C, 0xC8, + 0x18, 0x09, 0x0E, 0x10, 0x00, 0x03, 0x02, 0x00, + 0xE0, 0xC0, 0x6C, 0x01, 0x20, 0xC3, 0x8A, 0x01, + 0x20, 0x98, 0x83, 0x01, 0x00, 0xE2, 0x81, 0x13, + 0x60, 0x01, 0x9C, 0x01, 0x40, 0x00, 0xB9, 0x13, + 0x01, 0x83, 0x31, 0x16, 0x03, 0xC8, 0x6C, 0x01, + 0x40, 0x01, 0x10, 0x00, 0x14, 0x16, 0xE0, 0xC2, + 0x2E, 0x06, 0x11, 0x13, 0xE0, 0xC2, 0xF8, 0x05, + 0x0E, 0x13, 0xE0, 0x01, 0x3A, 0x07, 0x00, 0x80, + 0x80, 0x01, 0x10, 0x00, 0xE0, 0xC2, 0x36, 0x07, + 0x06, 0x13, 0xE0, 0x04, 0x36, 0x07, 0x80, 0x01, + 0x20, 0x00, 0x60, 0x04, 0xF2, 0xA9, 0x40, 0x01, + 0x20, 0x00, 0xF9, 0x13, 0x90, 0x03, 0xFF, 0x11, + 0x80, 0x03, 0x08, 0x01, 0x00, 0x04, 0x19, 0x16, + 0x60, 0x01, 0x6A, 0x09, 0x01, 0x00, 0x15, 0x16, + 0x88, 0x01, 0x00, 0x1A, 0xC8, 0x01, 0x00, 0x01, + 0xC8, 0xC5, 0x0F, 0x10, 0xE0, 0x04, 0x18, 0x09, + 0xC0, 0x01, 0x04, 0x00, 0x15, 0x10, 0x81, 0xC1, + 0x01, 0xC8, 0x6C, 0x01, 0x07, 0x02, 0x00, 0xFC, + 0x77, 0xC0, 0x17, 0xC2, 0x48, 0x01, 0x00, 0x18, + 0xE4, 0x13, 0x40, 0x01, 0x40, 0x00, 0x15, 0x16, + 0x80, 0x01, 0x45, 0x00, 0x46, 0xC1, 0x20, 0xD0, + 0x07, 0xFC, 0x60, 0x81, 0x18, 0x09, 0xE6, 0x13, + 0xE0, 0xC2, 0x08, 0xFC, 0x08, 0x11, 0xE0, 0xC2, + 0x0E, 0xFC, 0x07, 0x15, 0x06, 0x13, 0xE0, 0xC2, + 0x14, 0xFC, 0x03, 0x15, 0x02, 0x13, 0xC0, 0x01, + 0x01, 0x00, 0x48, 0x01, 0x00, 0x01, 0x11, 0x13, + 0x40, 0x01, 0x80, 0x40, 0x69, 0x13, 0x60, 0x04, + 0x66, 0xA6, 0x48, 0x01, 0x01, 0x00, 0x03, 0x16, + 0x40, 0x01, 0x00, 0x40, 0x0B, 0x16, 0xC8, 0x01, + 0x00, 0x40, 0xA0, 0x05, 0x32, 0x09, 0xC8, 0xC5, + 0x05, 0x10, 0xC0, 0x01, 0x40, 0x00, 0x40, 0x01, + 0x04, 0x00, 0xEF, 0x13, 0xB7, 0x01, 0x20, 0x00, + 0xD7, 0xC2, 0xC4, 0x62, 0x0B, 0x05, 0x2B, 0x02, + 0xFC, 0xFF, 0xCB, 0xC5, 0x02, 0x15, 0x46, 0x81, + 0x6A, 0x13, 0x08, 0x01, 0x00, 0x5E, 0x67, 0x16, + 0x08, 0x01, 0x88, 0x00, 0x13, 0x16, 0x86, 0x02, + 0x43, 0x00, 0x25, 0x16, 0x40, 0x01, 0x00, 0x40, + 0x0B, 0x13, 0x08, 0x01, 0x03, 0x00, 0x08, 0x13, + 0x84, 0xC2, 0x2A, 0x02, 0xD8, 0xFF, 0x06, 0xC8, + 0x6C, 0x01, 0x0A, 0x68, 0x04, 0xFC, 0x73, 0x10, + 0x60, 0x04, 0xD2, 0xA8, 0x40, 0x01, 0x01, 0x00, + 0xEA, 0x13, 0x08, 0x01, 0x02, 0x00, 0xE7, 0x16, + 0x48, 0x01, 0x01, 0x00, 0xE4, 0x16, 0x40, 0x01, + 0x00, 0x40, 0x04, 0x16, 0x60, 0x01, 0xA8, 0x09, + 0x80, 0x00, 0xDD, 0x13, 0x8A, 0x07, 0x80, 0x00, + 0xA0, 0x06, 0x32, 0xA5, 0xD8, 0x10, 0x00, 0xC0, + 0xE7, 0x11, 0x60, 0xC2, 0x6A, 0x09, 0x40, 0x01, + 0x00, 0x40, 0x0A, 0x13, 0x48, 0x01, 0x01, 0x00, + 0x34, 0x13, 0x48, 0x01, 0x02, 0x00, 0x0A, 0x13, + 0x49, 0x01, 0x04, 0x00, 0xD9, 0x16, 0x06, 0x10, + 0x49, 0x01, 0x02, 0x00, 0x03, 0x13, 0x08, 0x01, + 0x03, 0x00, 0x6E, 0x13, 0x49, 0x01, 0x01, 0x00, + 0x12, 0x13, 0x40, 0x01, 0x80, 0x40, 0x01, 0x16, + 0x46, 0xC1, 0xE0, 0x04, 0x00, 0xFC, 0x87, 0x07, + 0xF8, 0x05, 0x17, 0xC2, 0x14, 0x13, 0xC7, 0x05, + 0x17, 0xC8, 0x6C, 0x01, 0x05, 0xC8, 0x00, 0xFC, + 0xC6, 0xC5, 0x60, 0x04, 0x66, 0xA6, 0x07, 0x02, + 0x02, 0xFC, 0xE0, 0xA1, 0x2C, 0x09, 0xE0, 0xCD, + 0xEE, 0x05, 0xE0, 0xC5, 0x04, 0xFC, 0x20, 0xC8, + 0x2C, 0x09, 0x04, 0xFC, 0xE2, 0x10, 0xC5, 0xCD, + 0xC6, 0xC5, 0x60, 0x04, 0x66, 0xA6, 0x60, 0x04, + 0xB6, 0xA8, 0x06, 0xC8, 0x6C, 0x01, 0x85, 0x81, + 0x1A, 0x13, 0xE0, 0xC2, 0x04, 0xFC, 0x17, 0x15, + 0x86, 0xC2, 0x8A, 0xA2, 0xAA, 0xC1, 0x32, 0x0C, + 0x06, 0xC8, 0x6C, 0x01, 0x0B, 0xA8, 0x04, 0xFC, + 0x1A, 0x09, 0x0A, 0xC8, 0x6C, 0x01, 0xE0, 0xC2, + 0x02, 0xFC, 0xE0, 0x04, 0x00, 0xFC, 0x06, 0xC8, + 0x6C, 0x01, 0x0B, 0xC8, 0x02, 0xFC, 0xA0, 0x06, + 0x3E, 0xB4, 0x06, 0xC8, 0x6C, 0x01, 0xE0, 0x04, + 0x00, 0xFC, 0xA0, 0x01, 0x02, 0xFC, 0x02, 0x00, + 0x87, 0x07, 0x30, 0x06, 0xE7, 0x01, 0x04, 0x00, + 0x40, 0x00, 0xD7, 0x04, 0x27, 0x02, 0x0C, 0x00, + 0x05, 0xC2, 0x60, 0x01, 0x6A, 0x09, 0x04, 0x00, + 0x03, 0x16, 0xE0, 0x01, 0x02, 0xFC, 0x20, 0x00, + 0xA0, 0x06, 0xFC, 0xB4, 0xC0, 0x01, 0x20, 0x00, + 0x60, 0x04, 0x66, 0xA6, 0x48, 0x01, 0x00, 0x18, + 0x03, 0x13, 0x48, 0x01, 0x00, 0x10, 0x02, 0x16, + 0xA0, 0x05, 0x32, 0x09, 0x86, 0x02, 0x43, 0x00, + 0x03, 0x13, 0x40, 0x01, 0x80, 0x40, 0x98, 0x13, + 0x06, 0xC8, 0x6C, 0x01, 0xE0, 0x04, 0x00, 0xFC, + 0x85, 0xC2, 0xA0, 0x06, 0x3E, 0xB4, 0x20, 0x06, + 0x62, 0x09, 0xE6, 0x16, 0xA0, 0x06, 0xD0, 0xD5, + 0xE3, 0x10, 0xA0, 0xC2, 0xF6, 0x05, 0x56, 0x16, + 0x19, 0xC8, 0xF0, 0x05, 0xA9, 0xC2, 0x0A, 0x00, + 0x0D, 0x11, 0xA0, 0xF2, 0x2E, 0x09, 0x0A, 0xD8, + 0x80, 0x01, 0x29, 0xC8, 0x06, 0x00, 0x8C, 0x01, + 0xA0, 0x07, 0x16, 0x09, 0x04, 0x00, 0x09, 0xC8, + 0xF4, 0x05, 0x46, 0x10, 0x29, 0xC8, 0x06, 0x00, + 0x6C, 0x01, 0x20, 0xC8, 0x0E, 0xFC, 0xBC, 0x01, + 0x20, 0xC8, 0x10, 0xFC, 0xB0, 0x01, 0x20, 0xC8, + 0x12, 0xFC, 0xB2, 0x01, 0xA0, 0xF2, 0x2E, 0x09, + 0x8A, 0x01, 0x00, 0x10, 0xA0, 0x01, 0x80, 0x01, + 0x00, 0xC4, 0xE1, 0x10, 0x47, 0x01, 0x08, 0x00, + 0x06, 0x16, 0xA8, 0xC2, 0x06, 0x00, 0xA0, 0x06, + 0x3E, 0xB4, 0xE8, 0x04, 0x06, 0x00, 0x07, 0x01, + 0x20, 0x00, 0x31, 0x13, 0xE8, 0x04, 0x02, 0x00, + 0x3B, 0x10, 0xE0, 0x04, 0x00, 0xFC, 0xA0, 0x06, + 0x3E, 0xB4, 0x29, 0x10, 0x00, 0x03, 0x02, 0x00, + 0x20, 0xC2, 0x8C, 0x01, 0xE0, 0xC0, 0x6C, 0x01, + 0x20, 0xC2, 0xF4, 0x05, 0x28, 0xC8, 0x08, 0x00, + 0x6C, 0x01, 0xE8, 0xC1, 0x0A, 0x00, 0x20, 0xC3, + 0x02, 0xFC, 0x8C, 0x01, 0x20, 0x00, 0x0C, 0xC8, + 0x02, 0xFC, 0x0C, 0x01, 0x00, 0xFE, 0x3B, 0x16, + 0x47, 0x01, 0x40, 0x00, 0x50, 0x13, 0x60, 0xC2, + 0xF0, 0x05, 0xA7, 0x16, 0xE0, 0x04, 0xF4, 0x05, + 0x0C, 0xCA, 0x08, 0x00, 0x47, 0x01, 0x80, 0x00, + 0xC9, 0x16, 0x28, 0xC8, 0x06, 0x00, 0x6C, 0x01, + 0xA0, 0xC2, 0x00, 0xFC, 0xD2, 0x16, 0xE8, 0xC1, + 0x02, 0x00, 0xD7, 0xC2, 0x0F, 0x16, 0x27, 0x02, + 0x10, 0x00, 0xD8, 0x04, 0x57, 0xC2, 0x0E, 0x13, + 0xC7, 0x05, 0x57, 0xC2, 0x48, 0xC6, 0xC8, 0xC5, + 0x03, 0xC8, 0x6C, 0x01, 0x0D, 0x11, 0x90, 0x03, + 0xFF, 0x11, 0x80, 0x03, 0xD7, 0x04, 0xC3, 0x01, + 0x00, 0x80, 0xED, 0x10, 0xE7, 0x01, 0xF4, 0xFF, + 0x20, 0x00, 0xC8, 0xCD, 0xC8, 0xC5, 0xF0, 0x10, + 0x90, 0x03, 0xF8, 0x11, 0xE0, 0x02, 0xC0, 0x00, + 0x60, 0xC3, 0xFA, 0x00, 0xA0, 0xC3, 0xFC, 0x00, + 0xE0, 0xC3, 0xFE, 0x00, 0x54, 0x04, 0xE8, 0xC2, + 0x08, 0x00, 0xA8, 0xC2, 0x06, 0x00, 0x0C, 0xC3, + 0x33, 0x11, 0x20, 0x23, 0x0A, 0xE0, 0x45, 0x13, + 0x20, 0x23, 0x10, 0xE0, 0x46, 0x13, 0x20, 0x23, + 0x0E, 0xE0, 0x13, 0x13, 0xE0, 0x21, 0x16, 0xE0, + 0xB6, 0x16, 0x20, 0x23, 0x06, 0xE0, 0x03, 0x16, + 0x20, 0x27, 0xA8, 0xE4, 0x0A, 0x13, 0xE8, 0xC2, + 0x08, 0x00, 0xA8, 0xC2, 0x06, 0x00, 0x4C, 0x01, + 0x88, 0x00, 0xA9, 0x16, 0x0C, 0x01, 0x44, 0x00, + 0xA6, 0x16, 0x20, 0x06, 0x16, 0x09, 0xA3, 0x13, + 0x0A, 0xC8, 0x6C, 0x01, 0x20, 0xC8, 0x04, 0xE0, + 0x02, 0xFC, 0x0B, 0xC8, 0x6C, 0x01, 0xA0, 0x07, + 0x02, 0xFC, 0x00, 0x81, 0x20, 0xC3, 0x80, 0x01, + 0xA0, 0x01, 0x80, 0x01, 0x00, 0xC4, 0x0C, 0xC8, + 0x80, 0x01, 0x0A, 0xC8, 0x8C, 0x01, 0xAC, 0x10, + 0x0A, 0xC2, 0x0F, 0x13, 0x08, 0xC8, 0x6C, 0x01, + 0xA0, 0xC2, 0x00, 0xFC, 0x20, 0xC3, 0x02, 0xFC, + 0x20, 0x23, 0x12, 0xE0, 0xF5, 0x16, 0x0B, 0xC8, + 0x6C, 0x01, 0x0C, 0xC8, 0x02, 0xFC, 0x60, 0x04, + 0x72, 0xA9, 0x8A, 0x07, 0x00, 0x04, 0x60, 0x04, + 0x8A, 0xA3, 0x8A, 0x07, 0x20, 0x00, 0x60, 0x04, + 0x8A, 0xA3, 0x8A, 0x07, 0x00, 0x02, 0x20, 0x27, + 0x0E, 0xE0, 0x04, 0x16, 0xA0, 0x06, 0x32, 0xA5, + 0xC3, 0x01, 0x00, 0x80, 0xA8, 0xC2, 0x06, 0x00, + 0x60, 0x04, 0x98, 0xA9, 0x00, 0x03, 0x02, 0x00, + 0xC0, 0x01, 0x10, 0x00, 0xE0, 0xC2, 0x2E, 0x06, + 0x08, 0x13, 0xE0, 0xC2, 0xF8, 0x05, 0x05, 0x13, + 0xE0, 0x01, 0x3A, 0x07, 0x00, 0x80, 0x80, 0x01, + 0x10, 0x00, 0x90, 0x03, 0xFF, 0x7F, 0x80, 0x03, + 0x00, 0x03, 0x02, 0x00, 0x20, 0xC2, 0xF6, 0x05, + 0x20, 0xE2, 0xF4, 0x05, 0x0E, 0x16, 0x20, 0xD8, + 0x2E, 0x09, 0x80, 0x01, 0x2B, 0xC8, 0x06, 0x00, + 0x8C, 0x01, 0xA0, 0x07, 0x16, 0x09, 0x04, 0x00, + 0x0B, 0xC8, 0xF4, 0x05, 0x90, 0x03, 0xFF, 0xFF, + 0x80, 0x03, 0x87, 0x07, 0xF0, 0x05, 0xDB, 0x04, + 0x57, 0xC2, 0x05, 0x16, 0xCB, 0xCD, 0xCB, 0xC5, + 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03, 0xC7, 0x05, + 0x57, 0xC2, 0x4B, 0xC6, 0xCB, 0xC5, 0x90, 0x03, + 0xFF, 0xFF, 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, + 0x0B, 0xC2, 0x20, 0xC3, 0xF4, 0x05, 0x0F, 0x13, + 0xA8, 0xC2, 0x0A, 0x00, 0x4A, 0x01, 0x10, 0x00, + 0x16, 0x16, 0xA0, 0x22, 0x04, 0xE0, 0x1A, 0x16, + 0x08, 0xC3, 0xA0, 0x06, 0x36, 0xAC, 0x0C, 0xC2, + 0x20, 0xC3, 0xF4, 0x05, 0x13, 0x16, 0x68, 0x01, + 0x0A, 0x00, 0x10, 0x00, 0x03, 0x13, 0xE0, 0xC2, + 0xF6, 0x05, 0x05, 0x16, 0xA0, 0x06, 0x78, 0xAC, + 0x90, 0x03, 0xFF, 0xFF, 0x80, 0x03, 0x87, 0x07, + 0xF0, 0x05, 0xA0, 0x06, 0xE6, 0xB4, 0x90, 0x03, + 0xFF, 0xFF, 0x80, 0x03, 0x87, 0x07, 0xF0, 0x05, + 0xA0, 0x06, 0x2C, 0xB5, 0x80, 0x03, 0x00, 0x03, + 0x02, 0x00, 0x87, 0x07, 0xF0, 0x05, 0xCB, 0xC2, + 0x08, 0x16, 0xA0, 0x06, 0x36, 0xAC, 0x20, 0x07, + 0xF6, 0x05, 0x60, 0xCB, 0xF4, 0x05, 0x02, 0x00, + 0x80, 0x03, 0xE0, 0x04, 0xF6, 0x05, 0x20, 0xC2, + 0xF4, 0x05, 0x05, 0x16, 0x17, 0xC2, 0x03, 0x13, + 0xD8, 0xC5, 0xA0, 0x06, 0x78, 0xAC, 0x80, 0x03, + 0x00, 0x03, 0x02, 0x00, 0x0B, 0xC3, 0xA0, 0x06, + 0x36, 0xAC, 0x8C, 0xC2, 0xCC, 0xC1, 0x27, 0x02, + 0x10, 0x00, 0x88, 0x07, 0xF0, 0x05, 0x88, 0xC1, + 0x18, 0xC2, 0x26, 0x13, 0xA8, 0x82, 0x02, 0x00, + 0xFA, 0x16, 0xE8, 0xC2, 0x0A, 0x00, 0xE0, 0x22, + 0x1E, 0xE0, 0xF5, 0x16, 0x98, 0xC5, 0xE0, 0x22, + 0x1C, 0xE0, 0x0B, 0x16, 0x28, 0xC8, 0x06, 0x00, + 0xF4, 0x00, 0xE0, 0x02, 0xE0, 0x00, 0xA0, 0x06, + 0x3E, 0xB4, 0xE0, 0x02, 0xC0, 0x00, 0xE8, 0x04, + 0x06, 0x00, 0xE0, 0x22, 0x18, 0xE0, 0xE4, 0x13, + 0x20, 0xEA, 0x22, 0xE0, 0x0A, 0x00, 0xA0, 0xEA, + 0x18, 0xE0, 0x04, 0x00, 0xDA, 0x04, 0xA0, 0x06, + 0xE6, 0xB4, 0x47, 0x06, 0x06, 0xC2, 0xD8, 0x10, + 0x06, 0xC8, 0xF2, 0x05, 0x60, 0xCB, 0xF4, 0x05, + 0x02, 0x00, 0x54, 0x04, 0x20, 0xC2, 0xF4, 0x05, + 0x13, 0x13, 0xE0, 0x01, 0x9C, 0x01, 0x00, 0x40, + 0x8B, 0x0B, 0x8B, 0x0B, 0x60, 0x01, 0x9C, 0x01, + 0x00, 0x40, 0x0A, 0x16, 0x60, 0xC2, 0x6C, 0x01, + 0x28, 0xC8, 0x06, 0x00, 0x6C, 0x01, 0xA0, 0xC2, + 0x02, 0xFC, 0x03, 0x11, 0x09, 0xC8, 0x6C, 0x01, + 0x5B, 0x04, 0x09, 0xC8, 0x6C, 0x01, 0x4B, 0xC2, + 0x87, 0x07, 0xF0, 0x05, 0xA0, 0x06, 0x2C, 0xB5, + 0xE0, 0x04, 0xF4, 0x05, 0x59, 0x04, 0xA8, 0xC2, + 0x0A, 0x00, 0x0D, 0x11, 0xA0, 0xF2, 0x2E, 0x09, + 0x0A, 0xD8, 0x80, 0x01, 0x28, 0xC8, 0x06, 0x00, + 0x8C, 0x01, 0xA0, 0x07, 0x16, 0x09, 0x04, 0x00, + 0x08, 0xC8, 0xF4, 0x05, 0x5B, 0x04, 0x20, 0xC3, + 0x6C, 0x01, 0x28, 0xC8, 0x06, 0x00, 0x6C, 0x01, + 0x20, 0xC8, 0x0E, 0xFC, 0xBC, 0x01, 0x20, 0xC8, + 0x10, 0xFC, 0xB0, 0x01, 0x20, 0xC8, 0x12, 0xFC, + 0xB2, 0x01, 0x0C, 0xC8, 0x6C, 0x01, 0xA0, 0xF2, + 0x2E, 0x09, 0x8A, 0x01, 0x00, 0x10, 0xA0, 0x01, + 0x80, 0x01, 0x00, 0xC4, 0xDD, 0x10, 0x48, 0xC0, + 0x89, 0xC0, 0x81, 0x60, 0xC2, 0x05, 0x5B, 0x04, + 0x0B, 0xC3, 0xA0, 0x06, 0xC8, 0xAC, 0x41, 0xCC, + 0x42, 0x06, 0xFD, 0x16, 0xA0, 0x06, 0xC8, 0xAC, + 0x01, 0xC1, 0x44, 0x8C, 0x12, 0x16, 0xC4, 0x05, + 0x42, 0x06, 0xFB, 0x16, 0x04, 0x02, 0x0E, 0xAD, + 0x03, 0x02, 0x01, 0x01, 0x94, 0x06, 0x03, 0x02, + 0x5A, 0x5A, 0x94, 0x06, 0x43, 0x05, 0x94, 0x06, + 0x03, 0x07, 0x94, 0x06, 0xC3, 0x04, 0x94, 0x06, + 0xCC, 0x05, 0x5C, 0x04, 0xCB, 0xC1, 0xA0, 0x06, + 0xC8, 0xAC, 0x43, 0xCC, 0x42, 0x06, 0xFD, 0x16, + 0xA0, 0x06, 0xC8, 0xAC, 0x43, 0x8C, 0xF5, 0x16, + 0x42, 0x06, 0xFC, 0x16, 0x57, 0x04, 0x8B, 0xC2, + 0x08, 0xC0, 0x49, 0xC1, 0x85, 0x05, 0x80, 0x02, + 0x40, 0x00, 0x03, 0x11, 0x80, 0x02, 0x4F, 0x00, + 0x45, 0x12, 0x01, 0x02, 0xC8, 0xAC, 0xA1, 0x09, + 0x01, 0x80, 0x40, 0x13, 0x01, 0x02, 0xF8, 0xAD, + 0xA1, 0x09, 0x01, 0x80, 0x3B, 0x13, 0x60, 0xC0, + 0x06, 0x00, 0xA1, 0x09, 0x01, 0x80, 0x36, 0x13, + 0x81, 0x05, 0x01, 0x80, 0x33, 0x13, 0x4A, 0xC0, + 0xA1, 0x09, 0x01, 0x80, 0x2F, 0x13, 0x00, 0xC8, + 0x6A, 0x01, 0x80, 0x02, 0x80, 0x00, 0x17, 0x14, + 0x01, 0x02, 0x00, 0xF8, 0xA0, 0xC1, 0x40, 0x01, + 0xA0, 0x01, 0x40, 0x01, 0x00, 0x04, 0x02, 0x02, + 0x00, 0x10, 0x03, 0x02, 0x00, 0x04, 0xB1, 0xCC, + 0x43, 0x06, 0xFD, 0x16, 0xA0, 0x01, 0x40, 0x01, + 0x00, 0x40, 0x08, 0x02, 0x10, 0xF8, 0x06, 0xC8, + 0x40, 0x01, 0x00, 0xC0, 0x02, 0x13, 0x08, 0x02, + 0x00, 0xF8, 0x09, 0x02, 0xFE, 0xFB, 0xA0, 0x06, + 0xD2, 0xAC, 0x25, 0x10, 0x80, 0x02, 0x80, 0x00, + 0x09, 0x14, 0x01, 0x02, 0x00, 0xF8, 0x02, 0x02, + 0x00, 0x10, 0x03, 0x02, 0x00, 0x04, 0x72, 0xCC, + 0x43, 0x06, 0xFD, 0x16, 0x80, 0x05, 0x80, 0x02, + 0x80, 0x00, 0x04, 0x12, 0x60, 0x01, 0x04, 0x01, + 0x20, 0x00, 0x05, 0x13, 0x40, 0x81, 0xAB, 0x16, + 0x80, 0x02, 0x80, 0x00, 0x0B, 0x14, 0xA0, 0x07, + 0x6A, 0x01, 0x7E, 0x00, 0x02, 0x02, 0x00, 0x10, + 0x03, 0x02, 0x00, 0x04, 0xC1, 0x04, 0x81, 0xCC, + 0x43, 0x06, 0xFD, 0x16, 0xCA, 0x05, 0x5A, 0x04, + 0x00, 0x02, 0xEA, 0xAD, 0x01, 0x02, 0x1A, 0xAF, + 0x40, 0x02, 0x00, 0xFC, 0x41, 0x02, 0x00, 0xFC, + 0x40, 0x80, 0x04, 0x13, 0xA0, 0x07, 0x04, 0x01, + 0x3C, 0x00, 0x5B, 0x04, 0xC0, 0x04, 0x01, 0x02, + 0x08, 0x00, 0x02, 0x02, 0x00, 0x12, 0xE0, 0xC1, + 0x40, 0x01, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x04, + 0x03, 0x02, 0x00, 0x01, 0x00, 0xC8, 0x6A, 0x01, + 0xA0, 0xCC, 0x10, 0xF8, 0x80, 0x05, 0x03, 0x06, + 0xF9, 0x16, 0x22, 0x02, 0x00, 0x02, 0x01, 0x06, + 0xF3, 0x16, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, + 0x07, 0xC8, 0x40, 0x01, 0x00, 0x02, 0x00, 0x08, + 0x40, 0xC0, 0x01, 0x06, 0x01, 0xC8, 0x6A, 0x01, + 0x61, 0x02, 0x00, 0x80, 0x01, 0xC8, 0x10, 0xF8, + 0x00, 0x06, 0xF6, 0x16, 0xC0, 0x04, 0xC8, 0x04, + 0xC9, 0x04, 0x03, 0x02, 0x00, 0x08, 0x00, 0xC8, + 0x6A, 0x01, 0x80, 0xC1, 0x66, 0x02, 0x00, 0x80, + 0x20, 0xC1, 0x10, 0xF8, 0x06, 0x81, 0x15, 0x16, + 0x08, 0xC2, 0x06, 0x13, 0x80, 0x05, 0x03, 0x06, + 0xF2, 0x16, 0x08, 0xC2, 0x0D, 0x13, 0x19, 0x10, + 0xA0, 0x07, 0x10, 0xF8, 0x55, 0x55, 0x20, 0xC1, + 0x10, 0xF8, 0x84, 0x02, 0x55, 0x55, 0x02, 0x16, + 0x06, 0xC2, 0xF0, 0x10, 0x06, 0x81, 0xEE, 0x13, + 0x5B, 0x04, 0xA0, 0x07, 0x10, 0xF8, 0x55, 0x55, + 0x60, 0xC1, 0x10, 0xF8, 0x05, 0x81, 0x03, 0x13, + 0x85, 0x02, 0x55, 0x55, 0xF5, 0x16, 0x08, 0xC2, + 0xE1, 0x13, 0x40, 0xC2, 0x09, 0x06, 0x48, 0x02, + 0xFF, 0x07, 0xC0, 0x04, 0x01, 0x02, 0x08, 0x00, + 0x02, 0x02, 0x00, 0x12, 0x03, 0x02, 0x00, 0x01, + 0x00, 0xC8, 0x6A, 0x01, 0x32, 0xC8, 0x10, 0xF8, + 0x80, 0x05, 0x03, 0x06, 0xF9, 0x16, 0x22, 0x02, + 0x00, 0x02, 0x01, 0x06, 0xF3, 0x16, 0x88, 0x02, + 0x40, 0x00, 0x13, 0x15, 0x89, 0x02, 0x4F, 0x00, + 0x10, 0x11, 0xC0, 0x04, 0x02, 0x02, 0x00, 0x12, + 0x01, 0x02, 0x08, 0x00, 0x03, 0x02, 0x00, 0x01, + 0x80, 0xCC, 0x03, 0x06, 0xFD, 0x16, 0x22, 0x02, + 0x00, 0x02, 0x01, 0x06, 0xF7, 0x16, 0xCB, 0x05, + 0x5B, 0x04, 0xA0, 0x07, 0x04, 0x01, 0x37, 0x00, + 0x5B, 0x04, 0x33, 0x07, 0x33, 0x07, 0x0C, 0x10, + 0x13, 0x07, 0x23, 0x07, 0x02, 0x00, 0xCB, 0xC8, + 0x06, 0x00, 0x23, 0x02, 0x18, 0x00, 0xE0, 0xCC, + 0x6C, 0x01, 0xCD, 0xCC, 0xCE, 0xCC, 0xCF, 0xCC, + 0x83, 0x07, 0x30, 0x06, 0xD3, 0xC1, 0x0A, 0x13, + 0x83, 0x07, 0x36, 0x07, 0xD3, 0xC1, 0x06, 0x13, + 0x83, 0x07, 0xA0, 0x00, 0x93, 0x00, 0x0C, 0xC8, + 0x6C, 0x01, 0x80, 0x03, 0x63, 0x07, 0x02, 0x00, + 0x2A, 0x15, 0x63, 0xC2, 0x04, 0x00, 0x63, 0x42, + 0x06, 0x00, 0xDB, 0x13, 0x63, 0xC3, 0x1A, 0x00, + 0x49, 0xD2, 0x0C, 0x13, 0xC9, 0x06, 0x49, 0x72, + 0x69, 0xD2, 0xC0, 0xE1, 0xC9, 0x06, 0x49, 0x72, + 0xE9, 0x48, 0x04, 0xE0, 0x04, 0x00, 0x49, 0xCB, + 0x02, 0x00, 0x52, 0x04, 0x69, 0xC2, 0xC0, 0xE1, + 0x49, 0x72, 0x29, 0x02, 0x10, 0x00, 0xC3, 0xC2, + 0xE9, 0xA2, 0xA8, 0xE1, 0x1B, 0xC3, 0x89, 0x02, + 0x12, 0x00, 0x0F, 0x13, 0xDC, 0xC6, 0x03, 0x16, + 0xE9, 0x48, 0x04, 0xE0, 0x04, 0x00, 0x49, 0xCB, + 0x02, 0x00, 0x4C, 0xCB, 0x04, 0x00, 0x90, 0x03, + 0xFF, 0x01, 0x93, 0x00, 0x0C, 0xC8, 0x6C, 0x01, + 0x80, 0x03, 0x0C, 0xC8, 0x6C, 0x01, 0xE0, 0xC6, + 0x00, 0xFC, 0xF1, 0x16, 0xE9, 0x48, 0x04, 0xE0, + 0x04, 0x00, 0x49, 0xCB, 0x02, 0x00, 0x4C, 0xCB, + 0x04, 0x00, 0xED, 0x10, 0x00, 0x03, 0x02, 0x00, + 0xDB, 0xC2, 0x63, 0xC2, 0x04, 0x00, 0x4B, 0x42, + 0x9F, 0x13, 0x49, 0xD2, 0x0E, 0x13, 0xC9, 0x06, + 0x49, 0x72, 0x69, 0xD2, 0xC0, 0xE1, 0xC9, 0x06, + 0x49, 0x72, 0xE9, 0x48, 0x04, 0xE0, 0x04, 0x00, + 0x49, 0xCB, 0x02, 0x00, 0x90, 0x03, 0xFF, 0xFF, + 0x80, 0x03, 0x69, 0xC2, 0xC0, 0xE1, 0x49, 0x72, + 0x29, 0x02, 0x10, 0x00, 0xC3, 0xC2, 0xE9, 0xA2, + 0xA8, 0xE1, 0x1B, 0xC3, 0x89, 0x02, 0x12, 0x00, + 0x0C, 0x13, 0xDC, 0xC6, 0x03, 0x16, 0xE9, 0x48, + 0x04, 0xE0, 0x04, 0x00, 0x49, 0xCB, 0x02, 0x00, + 0x4C, 0xCB, 0x04, 0x00, 0x90, 0x03, 0xFF, 0xFF, + 0x80, 0x03, 0x0C, 0xC8, 0x6C, 0x01, 0xE0, 0xC6, + 0x00, 0xFC, 0xF4, 0x16, 0xF0, 0x10, 0x00, 0x03, + 0x02, 0x00, 0xBB, 0xC2, 0xBB, 0xC1, 0x86, 0xD1, + 0x03, 0x13, 0x86, 0xEA, 0x04, 0x00, 0x13, 0x10, + 0xA6, 0xD1, 0xC0, 0xE1, 0xC6, 0x06, 0x86, 0x71, + 0xCA, 0xC1, 0xE6, 0xA1, 0xB8, 0xE1, 0xA6, 0xEA, + 0x14, 0xE0, 0x04, 0x00, 0x1B, 0xC2, 0x86, 0x02, + 0x02, 0x00, 0x03, 0x16, 0xA0, 0x06, 0x0C, 0xB5, + 0x02, 0x10, 0xA0, 0x06, 0xE6, 0xB4, 0xDA, 0x04, + 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0xAB, 0xC2, + 0x06, 0x00, 0x8C, 0x07, 0xE8, 0x05, 0x5C, 0xC2, + 0x16, 0x13, 0xA0, 0xC1, 0xEC, 0x05, 0x8A, 0x81, + 0x1A, 0x1A, 0xC6, 0xC1, 0x09, 0xC2, 0x59, 0xC2, + 0x20, 0x13, 0xE9, 0xA1, 0x08, 0x00, 0x87, 0x82, + 0xF9, 0x12, 0xA9, 0xA2, 0x08, 0x00, 0x87, 0x62, + 0xCA, 0xCA, 0x08, 0x00, 0x4A, 0x6A, 0x08, 0x00, + 0xC9, 0xC6, 0x0B, 0xC6, 0x80, 0x03, 0xCA, 0xCA, + 0x08, 0x00, 0x0A, 0xC8, 0xEC, 0x05, 0xDB, 0x04, + 0x0B, 0xCF, 0x0B, 0xC7, 0x80, 0x03, 0x8A, 0x61, + 0x46, 0xCA, 0x08, 0x00, 0xCA, 0xCA, 0x08, 0x00, + 0x0A, 0xC8, 0xEC, 0x05, 0xC9, 0xC6, 0x0B, 0xC7, + 0x80, 0x03, 0x87, 0x62, 0xCA, 0xCA, 0x08, 0x00, + 0xDB, 0x04, 0x0B, 0xC6, 0x0B, 0xCB, 0x02, 0x00, + 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0xBB, 0xC1, + 0xDB, 0xC2, 0x8C, 0x07, 0xE8, 0x05, 0x4C, 0xC2, + 0xED, 0x04, 0x02, 0x00, 0x09, 0xC2, 0x59, 0xC2, + 0x18, 0x13, 0xA9, 0x81, 0x02, 0x00, 0xFA, 0x16, + 0xE9, 0x82, 0x04, 0x00, 0xF7, 0x16, 0x49, 0xCB, + 0x04, 0x00, 0x99, 0xC2, 0x0A, 0xC6, 0x0A, 0x13, + 0x08, 0x83, 0x04, 0x13, 0xA9, 0xAA, 0x08, 0x00, + 0x08, 0x00, 0x80, 0x03, 0x2A, 0xA8, 0x08, 0x00, + 0xEC, 0x05, 0x80, 0x03, 0x08, 0xCB, 0x02, 0x00, + 0x80, 0x03, 0x2D, 0x07, 0x02, 0x00, 0x8C, 0x07, + 0x08, 0x00, 0x06, 0xA3, 0x4C, 0xC2, 0x09, 0xC2, + 0x59, 0xC2, 0x13, 0x13, 0xE9, 0x82, 0x04, 0x00, + 0xFA, 0x16, 0xAD, 0x07, 0x02, 0x00, 0x01, 0x00, + 0x49, 0xCB, 0x04, 0x00, 0x19, 0xC6, 0x01, 0x13, + 0x80, 0x03, 0x08, 0x83, 0x04, 0x16, 0xA0, 0x49, + 0x14, 0xE0, 0x04, 0x00, 0x80, 0x03, 0x08, 0xCB, + 0x02, 0x00, 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, + 0x0B, 0x06, 0x1F, 0x11, 0x4D, 0x13, 0x8B, 0x07, + 0x00, 0x4E, 0x60, 0x01, 0x42, 0x01, 0x80, 0x00, + 0x09, 0x13, 0x8B, 0x07, 0x00, 0x3A, 0x20, 0xC1, + 0x4E, 0x01, 0x84, 0x02, 0x41, 0x0F, 0x02, 0x11, + 0x8B, 0x07, 0x00, 0x4E, 0x0B, 0xC8, 0x44, 0x01, + 0xA0, 0x07, 0x62, 0x09, 0xE8, 0x03, 0xE0, 0x01, + 0x40, 0x01, 0x00, 0x02, 0xE0, 0x01, 0x40, 0x01, + 0x00, 0x20, 0x84, 0x07, 0x34, 0xAF, 0x60, 0x04, + 0x42, 0xAF, 0x20, 0xC8, 0x16, 0xE0, 0xE0, 0x00, + 0xE0, 0xC2, 0x6A, 0x09, 0xE0, 0x22, 0x10, 0xE0, + 0x03, 0x13, 0x20, 0xE8, 0x14, 0xE0, 0xE0, 0x00, + 0x20, 0xC8, 0x04, 0xE0, 0x82, 0x01, 0x20, 0xC8, + 0xE2, 0x00, 0x8A, 0x01, 0xE0, 0x04, 0x18, 0x09, + 0xE0, 0x04, 0xF4, 0x05, 0xE0, 0x04, 0xF8, 0x05, + 0xE0, 0x04, 0xF0, 0x05, 0xE0, 0x04, 0x42, 0x07, + 0xA0, 0x07, 0x88, 0x01, 0x20, 0x00, 0xE0, 0xC2, + 0x30, 0x09, 0x09, 0x13, 0xA0, 0x07, 0x88, 0x01, + 0x80, 0x00, 0x20, 0xE8, 0x16, 0xE0, 0x80, 0x01, + 0xE0, 0x01, 0x82, 0x01, 0x00, 0x03, 0x8B, 0x07, + 0x00, 0xA0, 0x0B, 0xE8, 0x86, 0x01, 0x80, 0x03, + 0xE0, 0x04, 0x86, 0x01, 0xE0, 0x01, 0x9C, 0x01, + 0x40, 0x00, 0xE0, 0x01, 0x9C, 0x01, 0x00, 0x40, + 0xCB, 0x04, 0xB0, 0x03, 0x0B, 0x06, 0x04, 0x13, + 0x60, 0x01, 0x9C, 0x01, 0x00, 0x40, 0xF9, 0x16, + 0xE0, 0x04, 0x82, 0x01, 0x20, 0xE8, 0x08, 0xE0, + 0x6A, 0x09, 0x8B, 0x07, 0x00, 0x80, 0x0B, 0xC8, + 0x98, 0x07, 0x0B, 0xC8, 0x78, 0x07, 0x20, 0xC8, + 0x04, 0xE0, 0x82, 0x01, 0x8B, 0x07, 0x6F, 0x87, + 0x0B, 0x48, 0x3A, 0x07, 0xE0, 0xC2, 0x50, 0x07, + 0x8B, 0x02, 0x58, 0x07, 0x10, 0x13, 0x20, 0xE8, + 0x0A, 0xE0, 0x00, 0x01, 0xE0, 0xC2, 0x00, 0x01, + 0xE0, 0x22, 0x06, 0xE0, 0xF8, 0x13, 0x8B, 0x07, + 0x58, 0x07, 0x0B, 0xC8, 0x50, 0x07, 0x8B, 0x07, + 0x0C, 0xB8, 0x0B, 0xC8, 0x52, 0x07, 0x80, 0x03, + 0x00, 0x03, 0x02, 0x00, 0xE0, 0xC2, 0x1A, 0x09, + 0x0C, 0x13, 0x20, 0x06, 0x1C, 0x09, 0x0B, 0xC8, + 0x6C, 0x01, 0x20, 0xC8, 0x00, 0xFC, 0x1A, 0x09, + 0x4B, 0xCB, 0x02, 0x00, 0x90, 0x03, 0xFF, 0xFF, + 0x80, 0x03, 0x41, 0xC0, 0x0F, 0x13, 0x81, 0x80, + 0x0D, 0x13, 0x82, 0xA0, 0xE2, 0xC2, 0x32, 0x0C, + 0x12, 0x09, 0x0B, 0xC8, 0x6C, 0x01, 0xE0, 0x04, + 0x00, 0xFC, 0x20, 0xC3, 0x02, 0xFC, 0x07, 0x11, + 0x02, 0xC8, 0x00, 0xFC, 0xED, 0x04, 0x02, 0x00, + 0xE0, 0x04, 0x6C, 0x01, 0x80, 0x03, 0x42, 0xCB, + 0x02, 0x00, 0x02, 0xC8, 0x6C, 0x01, 0x8B, 0xC0, + 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0x83, 0x07, + 0x00, 0x80, 0x60, 0xC2, 0x7E, 0x09, 0x09, 0xC1, + 0x24, 0x02, 0xF8, 0xFF, 0xA9, 0x08, 0x01, 0x02, + 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x0B, 0x02, + 0x00, 0x00, 0x0C, 0x02, 0x00, 0x00, 0x07, 0x02, + 0x00, 0x00, 0x2C, 0xCB, 0x32, 0x0C, 0x32, 0x0C, + 0x06, 0x13, 0x8B, 0x05, 0xCC, 0x05, 0x0B, 0x88, + 0x46, 0x04, 0x27, 0x1B, 0xF6, 0x10, 0x09, 0xC2, + 0x8B, 0xC2, 0x08, 0x06, 0x0A, 0x13, 0x8B, 0x05, + 0xCC, 0x05, 0x0B, 0x88, 0x46, 0x04, 0x1D, 0x1B, + 0x2C, 0xCB, 0x32, 0x0C, 0x32, 0x0C, 0xED, 0x16, + 0xF4, 0x10, 0x82, 0xC0, 0x14, 0x13, 0x02, 0xC8, + 0x6C, 0x01, 0x0A, 0xC8, 0x00, 0xFC, 0x0A, 0xC8, + 0x6C, 0x01, 0xE0, 0x04, 0x00, 0xFC, 0xA0, 0x07, + 0x02, 0xFC, 0x00, 0x80, 0x04, 0xC8, 0x04, 0xFC, + 0x0A, 0xC2, 0x08, 0xA2, 0x02, 0xCA, 0x32, 0x0C, + 0x8A, 0xC0, 0x87, 0x05, 0xD6, 0x10, 0x4A, 0xC0, + 0xEE, 0x10, 0x47, 0xCB, 0x02, 0x00, 0xE0, 0x04, + 0x6C, 0x01, 0x8B, 0x07, 0x43, 0x00, 0xE0, 0x04, + 0x00, 0x0C, 0x00, 0x03, 0x02, 0x00, 0x0B, 0xC8, + 0x6C, 0x01, 0x8B, 0x02, 0x43, 0x00, 0x04, 0x13, + 0x60, 0x01, 0x02, 0xFC, 0x20, 0x00, 0x06, 0x13, + 0x8B, 0xC2, 0xA0, 0x06, 0x42, 0xB4, 0x90, 0x03, + 0x7F, 0x00, 0x80, 0x03, 0xA0, 0x01, 0x02, 0xFC, + 0x20, 0x00, 0x60, 0x01, 0x6A, 0x09, 0x01, 0x00, + 0x0B, 0x16, 0x0A, 0x02, 0x02, 0xFC, 0xA0, 0xA2, + 0x2C, 0x09, 0xA0, 0xCE, 0xEE, 0x05, 0xA0, 0xC6, + 0x04, 0xFC, 0x20, 0xC8, 0x2C, 0x09, 0x04, 0xFC, + 0x8A, 0x07, 0xF8, 0x05, 0x5A, 0xC2, 0x08, 0x13, + 0xCA, 0x05, 0x5A, 0xC2, 0x09, 0xC8, 0x6C, 0x01, + 0x0B, 0xC8, 0x00, 0xFC, 0x8B, 0xC6, 0x02, 0x10, + 0x8B, 0xCE, 0x8B, 0xC6, 0x20, 0x20, 0x1A, 0xE0, + 0x05, 0x16, 0x20, 0xE8, 0x04, 0xE0, 0x3A, 0x07, + 0xE0, 0x04, 0x36, 0x07, 0x90, 0x03, 0x7F, 0x00, + 0x80, 0x03, 0x00, 0x03, 0x02, 0x00, 0x0B, 0xC8, + 0x6C, 0x01, 0xCC, 0x04, 0xE0, 0x04, 0x00, 0xFC, + 0x8B, 0xC2, 0xA0, 0x06, 0x50, 0xB4, 0x90, 0x03, + 0x7F, 0x00, 0x80, 0x03, 0xA0, 0x07, 0x02, 0xFC, + 0x00, 0x80, 0x20, 0xC8, 0x8C, 0xE1, 0x04, 0xFC, + 0x41, 0xC0, 0x0F, 0x16, 0x20, 0xD8, 0x00, 0xE2, + 0x83, 0x01, 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, + 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, + 0x8B, 0x0B, 0x8B, 0x0B, 0x8B, 0x0B, 0x0A, 0xC8, + 0x8A, 0x01, 0x5B, 0x04, 0x0A, 0xC8, 0x6C, 0x01, + 0x20, 0xC3, 0x00, 0xFC, 0xE0, 0x04, 0x00, 0xFC, + 0x8A, 0x02, 0x43, 0x00, 0xDF, 0x13, 0xA0, 0x07, + 0x02, 0xFC, 0x00, 0x80, 0x04, 0xC8, 0x04, 0xFC, + 0x20, 0x98, 0x84, 0x09, 0x1D, 0x09, 0x0A, 0x13, + 0x20, 0xC8, 0x1A, 0x09, 0x00, 0xFC, 0x0A, 0xC8, + 0x1A, 0x09, 0xA0, 0x05, 0x1C, 0x09, 0x8C, 0xC2, + 0xE5, 0x16, 0x5B, 0x04, 0x41, 0xC0, 0x10, 0x13, + 0x8A, 0xA2, 0x82, 0xCA, 0x32, 0x0C, 0x1A, 0x09, + 0x02, 0xC8, 0x6C, 0x01, 0x0A, 0xC8, 0x00, 0xFC, + 0x8A, 0xC0, 0x20, 0x98, 0x83, 0x01, 0x00, 0xE2, + 0x09, 0x13, 0x8C, 0xC2, 0xD3, 0x16, 0x5B, 0x04, + 0x4A, 0xC0, 0x8A, 0xC0, 0x20, 0x98, 0x83, 0x01, + 0x00, 0xE2, 0x1B, 0x16, 0xE0, 0x01, 0x9C, 0x01, + 0x40, 0x00, 0xA0, 0x07, 0x64, 0x09, 0x00, 0x70, + 0x60, 0x01, 0x9C, 0x01, 0x40, 0x00, 0x07, 0x13, + 0x20, 0x06, 0x64, 0x09, 0xF9, 0x16, 0x0A, 0x02, + 0x00, 0x01, 0x60, 0x04, 0x8A, 0xA3, 0x60, 0x01, + 0x02, 0x0C, 0x00, 0x01, 0xE2, 0x13, 0x20, 0xD8, + 0x2F, 0x09, 0x83, 0x01, 0xA0, 0x07, 0x02, 0x0C, + 0x00, 0x80, 0x0A, 0xC8, 0x8A, 0x01, 0x0A, 0xC8, + 0x18, 0x09, 0xD7, 0x10, 0xD8, 0x04, 0x57, 0xC2, + 0x03, 0x16, 0xC8, 0xCD, 0xC8, 0xC5, 0x5B, 0x04, + 0xC7, 0x05, 0x57, 0xC2, 0x48, 0xC6, 0xC8, 0xC5, + 0x5B, 0x04, 0x08, 0xC8, 0x6C, 0x01, 0x08, 0xA2, + 0x20, 0xCA, 0x00, 0xFC, 0x32, 0x0C, 0x18, 0x09, + 0x02, 0x10, 0x08, 0xC8, 0x6C, 0x01, 0xE0, 0x04, + 0x00, 0xFC, 0x57, 0xC2, 0x03, 0x16, 0xC8, 0xCD, + 0xC8, 0xC5, 0x5B, 0x04, 0xC7, 0x05, 0x17, 0xC8, + 0x6C, 0x01, 0x08, 0xC8, 0x00, 0xFC, 0xC8, 0xC5, + 0x5B, 0x04, 0x17, 0xC6, 0x02, 0x16, 0xC8, 0xC9, + 0x02, 0x00, 0xC8, 0xC5, 0x5B, 0x04, 0x17, 0xC2, + 0x08, 0xC8, 0x6C, 0x01, 0x07, 0x13, 0xE0, 0xC5, + 0x00, 0xFC, 0x08, 0xA2, 0x28, 0xC8, 0x32, 0x0C, + 0x00, 0xFC, 0x18, 0x09, 0x5B, 0x04, 0x60, 0x01, + 0x82, 0x01, 0x00, 0x20, 0x0A, 0x16, 0x60, 0xC2, + 0x84, 0x01, 0xA0, 0x01, 0x82, 0x01, 0x00, 0x20, + 0xE0, 0x01, 0x82, 0x01, 0x00, 0x20, 0x09, 0xC8, + 0x84, 0x01, 0xC9, 0x04, 0x5B, 0x04, 0xA0, 0x06, + 0xBE, 0xB7, 0xD3, 0x04, 0xE0, 0x04, 0x02, 0x01, + 0x20, 0xE8, 0x14, 0xE0, 0x00, 0x01, 0x20, 0xC8, + 0x16, 0xE0, 0x04, 0x01, 0x05, 0x2C, 0x20, 0x48, + 0x14, 0xE0, 0x00, 0x01, 0x8C, 0x07, 0x00, 0x0A, + 0x8D, 0x07, 0xD8, 0x07, 0x8E, 0x07, 0x18, 0x00, + 0x7C, 0xCF, 0x4E, 0x06, 0xFD, 0x16, 0xE0, 0x02, + 0xD8, 0x07, 0x8F, 0x07, 0x11, 0xFF, 0x8B, 0x02, + 0x3B, 0x59, 0x21, 0x16, 0x8A, 0x02, 0x3B, 0x59, + 0x1E, 0x13, 0x8F, 0x05, 0x20, 0x20, 0x16, 0xE0, + 0x01, 0x16, 0x19, 0x10, 0x20, 0x20, 0x04, 0xE0, + 0x16, 0x16, 0x00, 0x01, 0xBF, 0x00, 0x13, 0x16, + 0x8B, 0x07, 0xC0, 0x40, 0x00, 0x01, 0x00, 0x60, + 0x10, 0x13, 0x40, 0x01, 0x00, 0x60, 0x0B, 0x16, + 0x8B, 0x07, 0xC4, 0x44, 0xA0, 0xC3, 0x02, 0x01, + 0x0E, 0x48, 0x02, 0x01, 0x4E, 0x01, 0x00, 0x10, + 0x04, 0x16, 0x8F, 0x07, 0x18, 0xFF, 0x60, 0x04, + 0x94, 0xB7, 0x0B, 0xC3, 0x4B, 0xC3, 0x20, 0x20, + 0x0A, 0xE0, 0x02, 0x16, 0x6B, 0x02, 0x20, 0x20, + 0x20, 0x20, 0x0C, 0xE0, 0x02, 0x16, 0x6C, 0x02, + 0x00, 0x20, 0x20, 0x20, 0x0E, 0xE0, 0x02, 0x16, + 0x6C, 0x02, 0x20, 0x00, 0x8F, 0x05, 0x20, 0x20, + 0x10, 0xE0, 0x07, 0x16, 0x6D, 0x02, 0x20, 0x00, + 0x20, 0x21, 0x22, 0xE0, 0xE4, 0x13, 0x04, 0xC1, + 0x02, 0x16, 0x84, 0x07, 0xFE, 0x7F, 0x8F, 0x05, + 0x20, 0x20, 0x12, 0xE0, 0x02, 0x16, 0x6D, 0x02, + 0x00, 0x20, 0x60, 0x21, 0x22, 0xE0, 0xD7, 0x13, + 0x45, 0xC1, 0x02, 0x16, 0x85, 0x07, 0xFE, 0x7F, + 0x8F, 0x05, 0x86, 0xD1, 0x0B, 0x13, 0xA0, 0x25, + 0x26, 0xE0, 0x08, 0x13, 0x8F, 0x05, 0x20, 0x26, + 0x22, 0xE0, 0x04, 0x16, 0x8F, 0x05, 0xA0, 0x26, + 0x22, 0xE0, 0x02, 0x13, 0x60, 0x04, 0x94, 0xB7, + 0x01, 0xD8, 0xEC, 0x08, 0x20, 0xD8, 0xDB, 0x07, + 0x00, 0x09, 0x02, 0xD8, 0xF6, 0x08, 0x20, 0xD8, + 0xDD, 0x07, 0xE2, 0x08, 0xE0, 0x02, 0x58, 0x07, + 0x20, 0xD8, 0xEF, 0x07, 0xF4, 0x07, 0x20, 0xD8, + 0xF1, 0x07, 0xF6, 0x07, 0x20, 0xD8, 0xF3, 0x07, + 0xF8, 0x07, 0x09, 0x02, 0x06, 0x00, 0xCB, 0x04, + 0x0F, 0x02, 0xEE, 0x07, 0x8F, 0x05, 0xCB, 0xDF, + 0x09, 0x06, 0xFC, 0x16, 0xA0, 0x06, 0xBE, 0xB7, + 0x89, 0x07, 0x5C, 0xE3, 0xE0, 0x04, 0x1A, 0x01, + 0x20, 0xC8, 0xE4, 0x07, 0x18, 0x01, 0x19, 0xC8, + 0x0C, 0x01, 0x39, 0xC8, 0x0A, 0x01, 0x39, 0xC8, + 0x12, 0x01, 0x09, 0x16, 0x79, 0xC3, 0x0F, 0x02, + 0x00, 0xE0, 0x4F, 0x63, 0x2D, 0x02, 0x00, 0x90, + 0x0D, 0xC8, 0x14, 0x01, 0x02, 0x10, 0x39, 0xC8, + 0x14, 0x01, 0xF9, 0xC3, 0x3F, 0xC8, 0x0E, 0x01, + 0x1F, 0xC8, 0x10, 0x01, 0xE0, 0x04, 0x14, 0x09, + 0xB9, 0xC2, 0x1A, 0xC8, 0x00, 0x01, 0x96, 0x06, + 0x89, 0x02, 0x84, 0xE3, 0xE0, 0x16, 0x8F, 0x07, + 0x1C, 0xFF, 0x8C, 0x07, 0x00, 0x0A, 0x8D, 0x07, + 0x84, 0xE3, 0x8E, 0x07, 0x10, 0x00, 0x7C, 0x8F, + 0x44, 0x16, 0x4E, 0x06, 0xFC, 0x16, 0xA0, 0xC3, + 0xE2, 0x07, 0xE0, 0xC3, 0xE0, 0x07, 0xCE, 0x83, + 0x01, 0x14, 0xCE, 0xC3, 0x0F, 0xC8, 0x1A, 0x01, + 0x8C, 0x07, 0x94, 0xE3, 0x8D, 0x07, 0x00, 0x0A, + 0x8E, 0x07, 0xA4, 0xE3, 0x8C, 0x63, 0x7C, 0xCF, + 0x4E, 0x06, 0xFD, 0x16, 0xE0, 0x04, 0x30, 0x09, + 0x20, 0x01, 0x42, 0x01, 0x00, 0x04, 0x02, 0x16, + 0x20, 0x07, 0x30, 0x09, 0x60, 0xC2, 0x62, 0x01, + 0xE0, 0x04, 0x62, 0x01, 0x8E, 0x07, 0x00, 0x80, + 0x8C, 0x07, 0x34, 0x09, 0x8D, 0x07, 0x06, 0x00, + 0x3E, 0xDF, 0x8E, 0x05, 0x0D, 0x06, 0xFC, 0x16, + 0xFE, 0xD3, 0xCF, 0x06, 0x8E, 0x05, 0xFE, 0xD3, + 0xCF, 0x06, 0x8C, 0x07, 0x34, 0x09, 0x09, 0xC8, + 0x62, 0x01, 0xC9, 0x04, 0x5C, 0xA3, 0x7C, 0xE2, + 0x5C, 0xA3, 0x7C, 0xE2, 0x5C, 0xA3, 0x7C, 0xE2, + 0x02, 0x13, 0xCD, 0x83, 0x09, 0x13, 0x20, 0x07, + 0x34, 0x09, 0x06, 0x10, 0x8F, 0x07, 0x19, 0xFF, + 0xCD, 0xA3, 0x0F, 0xC8, 0x04, 0x01, 0xFF, 0x10, + 0xA0, 0x01, 0x02, 0x01, 0x00, 0x10, 0xE0, 0xC3, + 0xEE, 0x07, 0xE0, 0x43, 0x06, 0xE0, 0x0F, 0xC8, + 0x00, 0x01, 0x20, 0xC0, 0x04, 0xE0, 0xE0, 0x04, + 0xFE, 0x06, 0xD3, 0x04, 0xE0, 0x04, 0x04, 0x01, + 0x60, 0x04, 0x0C, 0xB8, 0x8C, 0x07, 0x00, 0x0A, + 0x8D, 0x07, 0x18, 0x00, 0x8E, 0x07, 0x3B, 0x59, + 0x0E, 0xCF, 0x4D, 0x06, 0xFD, 0x16, 0x5B, 0x04, + 0x93, 0x01, 0x00, 0x80, 0x20, 0x04, 0xC0, 0xE2, + 0x60, 0xD0, 0x98, 0x07, 0x1C, 0x13, 0x00, 0x03, + 0x02, 0x00, 0xA0, 0xC0, 0x46, 0x07, 0x12, 0xC8, + 0x46, 0x07, 0x02, 0x16, 0x93, 0x01, 0x20, 0x00, + 0x00, 0x03, 0x0F, 0x00, 0x20, 0x04, 0xE8, 0xE2, + 0x93, 0x01, 0x00, 0x20, 0x80, 0x01, 0x00, 0x40, + 0x00, 0x01, 0xFE, 0x00, 0x49, 0x16, 0xC4, 0xC3, + 0x25, 0x16, 0xD3, 0xC3, 0xC5, 0x43, 0x0C, 0x16, + 0xE0, 0xC3, 0x98, 0x07, 0x03, 0x11, 0xE0, 0x02, + 0x98, 0x07, 0x51, 0x04, 0xE0, 0xC3, 0x78, 0x07, + 0x0A, 0x11, 0xE0, 0x02, 0x78, 0x07, 0x51, 0x04, + 0xD3, 0x11, 0x4F, 0x01, 0x00, 0x20, 0xE4, 0x13, + 0x4F, 0x01, 0x20, 0x00, 0xD1, 0x13, 0x05, 0x2C, + 0x41, 0xA0, 0x21, 0x04, 0xC0, 0xE2, 0x8B, 0x07, + 0x0C, 0xB8, 0x00, 0x01, 0x00, 0x40, 0x0F, 0x13, + 0xDD, 0xC3, 0x4F, 0x02, 0x0F, 0x00, 0x2F, 0xE1, + 0x14, 0xE0, 0x5B, 0x04, 0xE4, 0xC3, 0xC0, 0xE1, + 0xCF, 0x73, 0x2F, 0x41, 0x14, 0xE0, 0x6F, 0xC3, + 0xEC, 0xEA, 0x8B, 0x07, 0x0C, 0xB8, 0x4B, 0xC2, + 0xA0, 0xC2, 0xF4, 0x07, 0x8C, 0x07, 0x08, 0x00, + 0xBD, 0xC0, 0xA0, 0xC3, 0xEA, 0x07, 0xE0, 0xC3, + 0xEC, 0x07, 0xA0, 0x06, 0x00, 0xBA, 0xC0, 0x01, + 0x00, 0x40, 0x02, 0xD8, 0x17, 0x01, 0x62, 0x02, + 0x80, 0xFF, 0xA0, 0x06, 0x54, 0xBA, 0x02, 0xC8, + 0x04, 0x01, 0x90, 0x03, 0x3F, 0x60, 0x59, 0x04, + 0xC0, 0xC3, 0xCF, 0x73, 0xEF, 0xC3, 0xC0, 0xE1, + 0xCF, 0x73, 0xAF, 0xC3, 0xDE, 0xEA, 0x9E, 0xC3, + 0x4E, 0x02, 0x0F, 0x00, 0x2E, 0x21, 0x14, 0xE0, + 0x08, 0x13, 0x2F, 0x40, 0x14, 0xE0, 0xCF, 0xA3, + 0x2F, 0x04, 0xF0, 0xE2, 0x40, 0x01, 0x00, 0x40, + 0xA4, 0x13, 0xC4, 0xC3, 0xC7, 0x16, 0x00, 0x01, + 0xFE, 0x00, 0xE6, 0x16, 0x9E, 0x10, 0x40, 0x01, + 0x00, 0x40, 0x05, 0x16, 0x20, 0xE0, 0x14, 0xE0, + 0x65, 0x02, 0x00, 0x58, 0x96, 0x10, 0x20, 0xD8, + 0xDE, 0x07, 0x17, 0x01, 0x8F, 0x07, 0x86, 0xFF, + 0x0F, 0xC8, 0x04, 0x01, 0xC0, 0x01, 0x00, 0x40, + 0x45, 0x02, 0xFF, 0xA7, 0x8A, 0x10, 0x20, 0xC3, + 0xFE, 0x06, 0x20, 0x27, 0x38, 0xE3, 0x07, 0x13, + 0x20, 0x23, 0x22, 0xE0, 0x1A, 0x13, 0x65, 0x02, + 0xFF, 0xDF, 0x20, 0x40, 0x14, 0xE0, 0x20, 0xE0, + 0x16, 0xE0, 0x0C, 0xC8, 0xE6, 0x08, 0x8D, 0x07, + 0xE2, 0x08, 0x58, 0x04, 0x20, 0x48, 0x08, 0xE0, + 0xFE, 0x06, 0x20, 0xC3, 0xE6, 0x08, 0x20, 0x27, + 0x38, 0xE3, 0x19, 0x16, 0x80, 0x03, 0x02, 0xC3, + 0x6C, 0xC2, 0x0A, 0x00, 0x99, 0x06, 0x60, 0x04, + 0x0C, 0xB8, 0xA0, 0xC2, 0xF4, 0x07, 0x8C, 0x07, + 0x01, 0x00, 0x8D, 0x07, 0x06, 0x06, 0xCE, 0x04, + 0xE0, 0xC3, 0x08, 0x06, 0x01, 0x13, 0x97, 0x06, + 0x20, 0xD8, 0x07, 0x06, 0x17, 0x01, 0x8B, 0x07, + 0x82, 0xFF, 0x0B, 0xC8, 0x04, 0x01, 0xA0, 0x06, + 0xB4, 0xBE, 0x60, 0x04, 0x0C, 0xB8, 0xA0, 0xC2, + 0xEE, 0x07, 0x8C, 0x07, 0x06, 0x00, 0x8D, 0x07, + 0xEE, 0x08, 0xA0, 0xC3, 0xE6, 0x07, 0xE0, 0xC3, + 0xE8, 0x07, 0x97, 0x06, 0xA0, 0xC2, 0xF4, 0x07, + 0x8D, 0x07, 0xF4, 0x08, 0xDD, 0x04, 0x8C, 0x07, + 0x02, 0x00, 0x97, 0x06, 0x8D, 0x07, 0x00, 0x80, + 0xA0, 0xC2, 0xEE, 0x08, 0x0A, 0x88, 0x0C, 0x06, + 0x14, 0x1B, 0x82, 0x07, 0xD0, 0xB9, 0xA0, 0xC3, + 0xF0, 0x08, 0xE0, 0xC3, 0xF2, 0x08, 0x8B, 0x07, + 0x0C, 0xE3, 0x8A, 0x02, 0x14, 0x00, 0x04, 0x1A, + 0x8B, 0x07, 0xBA, 0xEA, 0x2A, 0x02, 0xEC, 0xFF, + 0x8A, 0xA2, 0xCA, 0xA2, 0xDB, 0xC2, 0x01, 0x13, + 0x9B, 0x06, 0x20, 0xC8, 0xEE, 0x08, 0xF2, 0x08, + 0x20, 0xC8, 0x20, 0xE0, 0xEE, 0x08, 0x0D, 0xC8, + 0xF0, 0x08, 0x8D, 0x07, 0xEC, 0x08, 0x20, 0xE0, + 0x18, 0xE0, 0x65, 0x02, 0x00, 0x58, 0x58, 0x04, + 0x45, 0x02, 0xFF, 0xA7, 0x80, 0x03, 0x60, 0xC0, + 0xEE, 0x05, 0x21, 0x02, 0xE8, 0x03, 0x20, 0x01, + 0x02, 0x01, 0x06, 0x00, 0x07, 0x16, 0x01, 0x88, + 0xEE, 0x05, 0xF9, 0x16, 0x39, 0x10, 0x60, 0xD0, + 0x03, 0x01, 0xF1, 0x13, 0x01, 0x02, 0x0A, 0x01, + 0x4C, 0xCC, 0x4C, 0xCC, 0x4E, 0xCC, 0x4F, 0xCC, + 0xB1, 0x07, 0x40, 0x00, 0x4D, 0xCC, 0x0A, 0xC8, + 0x00, 0x01, 0x5B, 0x04, 0x60, 0xC0, 0xEE, 0x05, + 0x21, 0x02, 0xE8, 0x03, 0x20, 0x01, 0x02, 0x01, + 0x06, 0x00, 0x07, 0x16, 0x01, 0x88, 0xEE, 0x05, + 0xF9, 0x16, 0x1E, 0x10, 0x60, 0xD0, 0x03, 0x01, + 0xF1, 0x13, 0x01, 0x02, 0x0A, 0x01, 0x4C, 0xCC, + 0x4C, 0xCC, 0x4E, 0xCC, 0x4F, 0xCC, 0xB1, 0x07, + 0x40, 0x00, 0x4D, 0xCC, 0x0A, 0xC8, 0x00, 0x01, + 0xA0, 0x03, 0x60, 0xD0, 0x03, 0x01, 0x01, 0x13, + 0x5B, 0x04, 0x60, 0xC0, 0xEE, 0x05, 0x21, 0x02, + 0xE8, 0x03, 0x20, 0x01, 0x02, 0x01, 0x06, 0x00, + 0xF7, 0x16, 0x01, 0x88, 0xEE, 0x05, 0xF9, 0x16, + 0xCD, 0x04, 0x8A, 0x07, 0x00, 0x40, 0x20, 0xC3, + 0x00, 0x01, 0x0C, 0x01, 0x00, 0x80, 0x02, 0x13, + 0x8A, 0x07, 0x00, 0x20, 0xA0, 0xC3, 0x0E, 0x01, + 0xE0, 0xC3, 0x10, 0x01, 0xB0, 0x03, 0x20, 0xC3, + 0x58, 0x07, 0x20, 0x23, 0x04, 0xE0, 0x02, 0x13, + 0x60, 0x04, 0x8E, 0xB7, 0x60, 0x04, 0x8A, 0xA3, + 0x8D, 0x07, 0x00, 0x20, 0x20, 0x20, 0x0A, 0xE0, + 0x01, 0x16, 0x5B, 0x04, 0x0D, 0x02, 0x32, 0x0C, + 0x5D, 0xC2, 0x01, 0x11, 0xDD, 0x04, 0xCD, 0x05, + 0x0D, 0x88, 0x30, 0x0C, 0xF9, 0x16, 0x60, 0xC2, + 0x0A, 0x06, 0x8D, 0x07, 0x6A, 0x09, 0xA0, 0x06, + 0xF4, 0xBE, 0x09, 0x02, 0x48, 0x00, 0xE0, 0xC3, + 0x30, 0x09, 0x03, 0x16, 0xE0, 0x01, 0x6A, 0x09, + 0x10, 0x00, 0xE0, 0xC2, 0x6A, 0x09, 0x0F, 0x02, + 0x00, 0x01, 0xC9, 0x26, 0x02, 0x13, 0x60, 0x04, + 0x86, 0xBD, 0x09, 0x02, 0x00, 0x12, 0x4B, 0x01, + 0x10, 0x00, 0x02, 0x13, 0x09, 0x02, 0x00, 0x13, + 0x09, 0xD8, 0x2E, 0x09, 0x8F, 0x07, 0x00, 0x40, + 0x89, 0x07, 0x6C, 0x09, 0xCB, 0x04, 0xF9, 0xE2, + 0xF9, 0xE2, 0xF9, 0xE2, 0x07, 0x16, 0x8B, 0x07, + 0x34, 0x09, 0x8C, 0x07, 0x6C, 0x09, 0x3B, 0xCF, + 0x3B, 0xCF, 0x1B, 0xC7, 0x20, 0xC3, 0x6C, 0x09, + 0x19, 0x11, 0x8F, 0x07, 0x00, 0x20, 0x89, 0x07, + 0x7A, 0x09, 0xA0, 0x06, 0x3A, 0xBB, 0xA0, 0x06, + 0x3A, 0xBB, 0x12, 0x10, 0x4C, 0xCE, 0x5B, 0x04, + 0x19, 0xC3, 0x02, 0x16, 0x8C, 0x07, 0x1A, 0x00, + 0x4C, 0xC3, 0x2D, 0x02, 0xF8, 0xFF, 0x0A, 0x02, + 0x09, 0x00, 0x2D, 0x02, 0xFA, 0xFF, 0xF2, 0x13, + 0x0A, 0x06, 0xFB, 0x16, 0x60, 0x04, 0x86, 0xBD, + 0x8F, 0x07, 0x00, 0x10, 0xD9, 0xC2, 0xFA, 0x11, + 0x02, 0x16, 0x8B, 0x07, 0x00, 0x04, 0x4B, 0xC3, + 0x8D, 0x02, 0x20, 0x00, 0x02, 0x14, 0x0D, 0x02, + 0x20, 0x00, 0x8D, 0x02, 0x00, 0x04, 0x02, 0x12, + 0x0D, 0x02, 0x00, 0x04, 0x2D, 0x02, 0xF8, 0xFF, + 0x0D, 0xC8, 0x2C, 0x09, 0x2B, 0x02, 0xFF, 0x03, + 0x8B, 0x01, 0xFF, 0x03, 0x4B, 0xCE, 0x60, 0xC3, + 0x6A, 0x09, 0x60, 0x23, 0x18, 0xE0, 0x0C, 0x16, + 0x49, 0xC3, 0xDD, 0xC2, 0x0F, 0x02, 0x01, 0x01, + 0x8B, 0x01, 0x80, 0xC0, 0xD7, 0x16, 0x8F, 0x05, + 0xED, 0xC2, 0x02, 0x00, 0xD3, 0x16, 0x02, 0x10, + 0x8D, 0x07, 0xBA, 0xEA, 0x3D, 0xC8, 0xA8, 0x09, + 0x1D, 0xC8, 0xAA, 0x09, 0xCB, 0x04, 0xE0, 0x04, + 0xF8, 0x05, 0xE0, 0x04, 0x66, 0x09, 0x20, 0xC8, + 0x30, 0x0C, 0x80, 0x09, 0xA0, 0x07, 0x82, 0x09, + 0xFE, 0xDF, 0x8D, 0x07, 0xFE, 0xDF, 0xE0, 0xC3, + 0xD8, 0x07, 0xE0, 0x23, 0x16, 0xE0, 0x24, 0x16, + 0xE0, 0xC3, 0x30, 0x0C, 0x4F, 0x63, 0xFF, 0x04, + 0xFF, 0x04, 0x4D, 0x06, 0xFD, 0x16, 0x8D, 0x07, + 0xFE, 0xDF, 0x20, 0x04, 0xA2, 0xEA, 0xA0, 0xC3, + 0xA2, 0xEA, 0xEE, 0xC3, 0x12, 0x00, 0xAA, 0x16, + 0x6E, 0xC3, 0x18, 0x00, 0xAD, 0x09, 0x8C, 0x07, + 0x00, 0xE0, 0xAC, 0x09, 0x0D, 0x63, 0x0C, 0x13, + 0x6E, 0xC3, 0x18, 0x00, 0xAD, 0x09, 0x2D, 0x02, + 0x40, 0x00, 0x1D, 0x0A, 0x2D, 0x02, 0x32, 0x0C, + 0xBD, 0x07, 0xFF, 0x7F, 0x0C, 0x06, 0xFC, 0x16, + 0x20, 0xC3, 0x46, 0x04, 0x8C, 0x02, 0x80, 0x00, + 0x13, 0x1A, 0xAC, 0x02, 0x0C, 0xC8, 0x9A, 0x00, + 0xE0, 0x02, 0x80, 0x00, 0x88, 0x07, 0x80, 0x00, + 0x60, 0xC2, 0x46, 0x04, 0xA0, 0x06, 0x28, 0xAD, + 0x02, 0x10, 0x9D, 0x00, 0x05, 0x10, 0x9D, 0x00, + 0x8F, 0x07, 0x00, 0x08, 0x60, 0x04, 0x86, 0xBD, + 0x4B, 0x2D, 0x81, 0xC3, 0xC9, 0x05, 0x8F, 0x07, + 0x00, 0x10, 0x8E, 0x02, 0x02, 0x00, 0xF6, 0x11, + 0x8F, 0x07, 0x00, 0x04, 0xC9, 0x05, 0xD9, 0xC2, + 0xE0, 0x26, 0x26, 0xE0, 0x02, 0x16, 0x2B, 0x02, + 0x06, 0x00, 0x4B, 0xC6, 0x4B, 0xC3, 0xCB, 0x72, + 0x2E, 0x02, 0xFE, 0xFF, 0x8B, 0x83, 0xE6, 0x1B, + 0xCD, 0x06, 0x4D, 0x73, 0xCD, 0x82, 0xE2, 0x1B, + 0xE0, 0x04, 0x1A, 0x09, 0xE0, 0x04, 0x1C, 0x09, + 0x4D, 0xC3, 0x02, 0x13, 0x60, 0x66, 0x12, 0xE0, + 0xC9, 0x05, 0xCF, 0x04, 0x81, 0x2D, 0x01, 0xC8, + 0x6C, 0x01, 0xD4, 0x13, 0x0F, 0xC8, 0x00, 0xFC, + 0xC1, 0xC3, 0x0D, 0x06, 0xF7, 0x15, 0x0D, 0x02, + 0x36, 0x07, 0x0E, 0x02, 0x98, 0x08, 0x0C, 0x02, + 0x03, 0x00, 0x8D, 0xCB, 0x02, 0x00, 0x81, 0x2D, + 0x81, 0xCB, 0x06, 0x00, 0xC3, 0x13, 0xEE, 0x04, + 0x0C, 0x00, 0x2E, 0x02, 0x18, 0x00, 0x0C, 0x06, + 0xF4, 0x16, 0xE0, 0x04, 0x96, 0x08, 0x1F, 0x2E, + 0xB9, 0xC3, 0xD9, 0xC3, 0x89, 0x07, 0x12, 0x00, + 0x8D, 0x07, 0x3A, 0x09, 0xA0, 0x06, 0xF4, 0xBE, + 0x60, 0xC3, 0xD8, 0x07, 0x60, 0x23, 0x16, 0xE0, + 0x09, 0x16, 0x20, 0xE8, 0x10, 0xE0, 0x6A, 0x09, + 0x20, 0xE8, 0x18, 0xE0, 0x98, 0x07, 0x20, 0xE8, + 0x12, 0xE0, 0x78, 0x07, 0x60, 0xC3, 0x6A, 0x09, + 0x60, 0x23, 0x1E, 0xE0, 0x03, 0x16, 0x20, 0x48, + 0xA4, 0xE3, 0x6A, 0x09, 0x60, 0x23, 0x22, 0xE0, + 0x06, 0x13, 0x60, 0x27, 0xA6, 0xE3, 0x03, 0x13, + 0x20, 0xE8, 0x10, 0xE0, 0x6A, 0x09, 0x20, 0x2D, + 0x00, 0x00, 0x8E, 0x07, 0x00, 0x00, 0xA0, 0x06, + 0xD4, 0xBE, 0x4E, 0x05, 0x0E, 0x2C, 0xA0, 0xC0, + 0x04, 0x08, 0xEF, 0xC3, 0x06, 0x00, 0x1B, 0x16, + 0xA0, 0xC3, 0x72, 0x09, 0xE0, 0xC3, 0x74, 0x09, + 0xA0, 0x06, 0xC2, 0xBD, 0xA0, 0xC3, 0x76, 0x09, + 0xE0, 0xC3, 0x78, 0x09, 0xA0, 0x06, 0xE0, 0xBD, + 0x20, 0xE0, 0x0A, 0xE0, 0x60, 0xC3, 0xD8, 0x07, + 0x60, 0x23, 0x16, 0xE0, 0x05, 0x16, 0xE0, 0x04, + 0x2E, 0x06, 0x60, 0x41, 0x04, 0xE0, 0x4D, 0x2E, + 0x8D, 0x07, 0x00, 0x80, 0x52, 0x04, 0xCF, 0x73, + 0x2F, 0x02, 0x00, 0x02, 0x4F, 0xC3, 0x52, 0x04, + 0x20, 0x20, 0x0A, 0xE0, 0x03, 0x13, 0x8D, 0x07, + 0x00, 0x10, 0x5B, 0x04, 0x20, 0x40, 0x0A, 0xE0, + 0x40, 0x02, 0xFF, 0xF0, 0x8E, 0x07, 0x02, 0x00, + 0xA0, 0x06, 0xD4, 0xBE, 0x4E, 0x05, 0x0E, 0x2C, + 0xA0, 0xC0, 0x04, 0x08, 0xA0, 0x06, 0xB4, 0xBE, + 0x60, 0xC3, 0xD8, 0x07, 0x60, 0x23, 0x16, 0xE0, + 0x66, 0x16, 0x20, 0x04, 0xB6, 0xEA, 0x63, 0x10, + 0x6E, 0x02, 0x00, 0x80, 0x8D, 0x07, 0x00, 0xC0, + 0x0D, 0xC8, 0xA6, 0x01, 0x0E, 0xC8, 0x72, 0x09, + 0x0F, 0xC8, 0x74, 0x09, 0x0E, 0xC8, 0xA8, 0x01, + 0x0F, 0xC8, 0xAA, 0x01, 0x12, 0x10, 0x8F, 0x01, + 0x01, 0x00, 0x8A, 0x07, 0x76, 0x09, 0xA0, 0xE3, + 0x4E, 0x09, 0x8E, 0xCE, 0x9A, 0x01, 0xFE, 0xFF, + 0xE0, 0xE3, 0x50, 0x09, 0x8F, 0xE6, 0x8A, 0x07, + 0xAC, 0x01, 0x8E, 0xCE, 0x9A, 0x01, 0xFE, 0xFF, + 0x8F, 0xE6, 0x20, 0x20, 0x0A, 0xE0, 0x3F, 0x13, + 0x8D, 0x07, 0x00, 0x10, 0x5B, 0x04, 0x20, 0x20, + 0x0A, 0xE0, 0x03, 0x13, 0x0D, 0x02, 0x00, 0x10, + 0x5B, 0x04, 0x8E, 0xC3, 0x04, 0x13, 0xE0, 0x01, + 0x50, 0x09, 0x00, 0x01, 0x06, 0x10, 0xA0, 0x01, + 0x50, 0x09, 0x00, 0x01, 0xA0, 0x01, 0x78, 0x09, + 0x00, 0x01, 0xA0, 0xC3, 0x76, 0x09, 0xE0, 0xC3, + 0x78, 0x09, 0xA0, 0xE3, 0x4E, 0x09, 0xE0, 0xE3, + 0x50, 0x09, 0x0E, 0xC8, 0xAC, 0x01, 0x0F, 0xC8, + 0xAE, 0x01, 0x0E, 0xC8, 0x76, 0x09, 0x0F, 0xC8, + 0x78, 0x09, 0x19, 0x10, 0x6E, 0x02, 0x00, 0x80, + 0x0E, 0xC8, 0xA6, 0x01, 0x20, 0x20, 0x0A, 0xE0, + 0x12, 0x13, 0x0D, 0x02, 0x00, 0x10, 0x5B, 0x04, + 0x8D, 0x07, 0x28, 0x07, 0x89, 0x07, 0x0E, 0x00, + 0xA0, 0x06, 0xFA, 0xBE, 0x8D, 0x07, 0x28, 0x07, + 0xFD, 0x04, 0x8D, 0x02, 0x36, 0x07, 0xFC, 0x16, + 0x20, 0x48, 0x14, 0xE0, 0xFE, 0x06, 0x8D, 0x07, + 0x00, 0x80, 0x52, 0x04, 0xA0, 0xC2, 0xEE, 0x07, + 0x8C, 0x07, 0x04, 0x00, 0x8D, 0x07, 0xF0, 0x08, + 0x97, 0x06, 0x7D, 0xC2, 0x5D, 0xC3, 0x60, 0x43, + 0x22, 0xE0, 0xA0, 0x06, 0xFA, 0xBE, 0xEF, 0x10, + 0x0E, 0xC8, 0x06, 0x06, 0x0F, 0xC8, 0x08, 0x06, + 0xEA, 0x10, 0xB0, 0x03, 0xA0, 0x01, 0x60, 0x07, + 0x26, 0x00, 0x40, 0x02, 0x00, 0xC0, 0xE0, 0x04, + 0x06, 0x06, 0x8C, 0x07, 0x10, 0x40, 0xCC, 0x44, + 0xE0, 0x04, 0xFE, 0x06, 0x85, 0x07, 0x40, 0x80, + 0x5B, 0x04, 0x02, 0xC8, 0x04, 0x08, 0x8F, 0x07, + 0xFA, 0x07, 0xCE, 0xCB, 0x02, 0x00, 0x8E, 0x07, + 0x36, 0x07, 0xCE, 0xCB, 0x04, 0x00, 0x8D, 0x07, + 0x30, 0x06, 0x8E, 0x07, 0x10, 0x00, 0x4D, 0x2C, + 0x5B, 0x04, 0xA0, 0xC2, 0xF2, 0x07, 0x02, 0x10, + 0xA0, 0xC2, 0xF8, 0x07, 0x0B, 0xC8, 0xEA, 0x08, + 0x09, 0xC3, 0x0A, 0x13, 0xA0, 0x06, 0x36, 0xBA, + 0xA0, 0xC2, 0x00, 0x01, 0xA0, 0xE2, 0x06, 0xE0, + 0x4C, 0xA3, 0xCC, 0xA3, 0x01, 0x17, 0x8E, 0x05, + 0x4C, 0x62, 0xE0, 0xC2, 0xEA, 0x08, 0x5B, 0x04, + 0x8D, 0x07, 0x00, 0x10, 0x20, 0x20, 0x0A, 0xE0, + 0x01, 0x13, 0x5B, 0x04, 0x0D, 0x02, 0x48, 0x00, + 0xE0, 0xC3, 0x30, 0x09, 0x02, 0x16, 0xCE, 0x01, + 0x10, 0x00, 0x8D, 0x27, 0x03, 0x13, 0x0D, 0x02, + 0x00, 0x01, 0x52, 0x04, 0x00, 0x03, 0x02, 0x00, + 0x60, 0xC3, 0x6A, 0x09, 0x4D, 0x02, 0x08, 0x80, + 0x4E, 0x02, 0xF7, 0x7F, 0x8D, 0xE3, 0xE0, 0xC3, + 0xD8, 0x07, 0xE0, 0x23, 0x16, 0xE0, 0x04, 0x13, + 0x8D, 0x07, 0x06, 0x00, 0x8D, 0x27, 0x02, 0x13, + 0xA0, 0xE3, 0x10, 0xE0, 0x0E, 0xC8, 0x6A, 0x09, + 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 0x09, 0x13, + 0x0D, 0x02, 0x00, 0x12, 0x4E, 0x01, 0x10, 0x00, + 0x02, 0x13, 0x0D, 0x02, 0x00, 0x13, 0x0D, 0xD8, + 0x2E, 0x09, 0x60, 0xC3, 0x80, 0x01, 0x4E, 0x02, + 0x01, 0x00, 0x4D, 0x02, 0xFE, 0xFF, 0x4E, 0xE3, + 0x0D, 0xC8, 0x80, 0x01, 0x20, 0xD8, 0x40, 0xE2, + 0x2F, 0x09, 0x20, 0x01, 0x6A, 0x09, 0x06, 0x00, + 0x03, 0x13, 0x20, 0xD8, 0xD0, 0xE1, 0x2F, 0x09, + 0x20, 0x98, 0x83, 0x01, 0x00, 0xE2, 0x03, 0x13, + 0x20, 0xD8, 0x2F, 0x09, 0x83, 0x01, 0x00, 0x03, + 0x0F, 0x00, 0x60, 0x04, 0x88, 0xBE, 0x20, 0x20, + 0x0A, 0xE0, 0x03, 0x13, 0x0D, 0x02, 0x00, 0x10, + 0x5B, 0x04, 0x09, 0x02, 0x08, 0x00, 0x0D, 0x02, + 0x58, 0x09, 0xA0, 0x06, 0xF4, 0xBE, 0xA0, 0x07, + 0x02, 0x02, 0x00, 0x00, 0x0D, 0x02, 0x00, 0x04, + 0xE0, 0xC3, 0x58, 0x09, 0x0F, 0x01, 0x00, 0x7C, + 0x01, 0x13, 0x52, 0x04, 0x8F, 0xC3, 0x4E, 0x02, + 0x0F, 0x00, 0xFB, 0x13, 0x8E, 0x02, 0x0F, 0x00, + 0xF8, 0x13, 0x0D, 0x02, 0x00, 0x40, 0x4F, 0xC2, + 0x49, 0x09, 0x49, 0x02, 0x3F, 0x00, 0x09, 0x01, + 0x01, 0x00, 0xEF, 0x16, 0x89, 0x02, 0x06, 0x00, + 0xEC, 0x1A, 0x89, 0x02, 0x20, 0x00, 0xE9, 0x14, + 0xC9, 0x06, 0x1F, 0x09, 0x4F, 0x02, 0x00, 0x40, + 0x4F, 0xE2, 0x69, 0x02, 0x00, 0x80, 0x09, 0xC8, + 0x58, 0x09, 0x0F, 0x02, 0xFF, 0xFF, 0x4E, 0xC2, + 0x1F, 0x09, 0x09, 0x06, 0xFD, 0x16, 0x4F, 0x05, + 0x0D, 0x02, 0x00, 0x20, 0x60, 0xC2, 0x5A, 0x09, + 0xD4, 0x13, 0x4F, 0x26, 0xD2, 0x16, 0x0D, 0x02, + 0x00, 0x10, 0x60, 0xC2, 0x5C, 0x09, 0xCD, 0x13, + 0x4F, 0x26, 0xCB, 0x16, 0x0D, 0x02, 0x00, 0x30, + 0x20, 0x88, 0x5A, 0x09, 0x5C, 0x09, 0xC5, 0x13, + 0xE0, 0xC3, 0x5A, 0x09, 0x4E, 0xC2, 0x1F, 0x0A, + 0x09, 0x06, 0xFD, 0x16, 0xE0, 0xE3, 0x5E, 0x09, + 0x0F, 0xC8, 0x5A, 0x09, 0xE0, 0xC3, 0x5C, 0x09, + 0x4E, 0xC2, 0x1F, 0x0A, 0x09, 0x06, 0xFD, 0x16, + 0xE0, 0xE3, 0x5E, 0x09, 0x0F, 0xC8, 0x5C, 0x09, + 0x0F, 0x02, 0xFF, 0xFF, 0x4E, 0xC2, 0x1F, 0x0A, + 0x09, 0x06, 0xFD, 0x16, 0x0D, 0x02, 0x00, 0x08, + 0x60, 0xC2, 0x5E, 0x09, 0x4F, 0x26, 0xA5, 0x16, + 0x4F, 0x05, 0x0F, 0xC8, 0x5E, 0x09, 0x0F, 0x02, + 0x02, 0x02, 0x0E, 0x02, 0x03, 0x00, 0x60, 0xC3, + 0x40, 0x01, 0x0C, 0x02, 0xFE, 0xC0, 0xA0, 0x01, + 0x40, 0x01, 0x00, 0x04, 0xCF, 0x05, 0x09, 0x02, + 0x55, 0x55, 0x9C, 0x06, 0x49, 0x05, 0x9C, 0x06, + 0x09, 0x07, 0x9C, 0x06, 0x49, 0x05, 0x9C, 0x06, + 0x0E, 0x06, 0xF4, 0x16, 0xA0, 0x01, 0x40, 0x01, + 0x00, 0x40, 0x0D, 0xC8, 0x40, 0x01, 0x09, 0x02, + 0x08, 0x00, 0x0E, 0x02, 0x58, 0x09, 0x0F, 0x02, + 0x02, 0x02, 0xFE, 0xCF, 0x49, 0x06, 0xFD, 0x16, + 0x60, 0x04, 0x88, 0xBE, 0xC9, 0xC7, 0x5F, 0x82, + 0x01, 0x16, 0x5B, 0x04, 0xA0, 0x01, 0x40, 0x01, + 0x00, 0x40, 0x0D, 0xC8, 0x40, 0x01, 0x0D, 0x02, + 0x00, 0x01, 0x52, 0x04, 0x8D, 0x07, 0x00, 0x10, + 0x20, 0x20, 0x0A, 0xE0, 0x0A, 0x16, 0x8D, 0x07, + 0x00, 0x08, 0x20, 0x20, 0x10, 0xE0, 0x05, 0x13, + 0x8D, 0x07, 0x00, 0x40, 0x4F, 0x01, 0x01, 0x00, + 0x01, 0x16, 0x5B, 0x04, 0x20, 0xE0, 0x10, 0xE0, + 0x20, 0x07, 0x9C, 0x08, 0x20, 0x07, 0xB4, 0x08, + 0x20, 0x07, 0xCC, 0x08, 0xA0, 0x07, 0xA2, 0x08, + 0x84, 0x02, 0xA0, 0x07, 0xBA, 0x08, 0x84, 0x02, + 0xA0, 0x07, 0xD2, 0x08, 0x84, 0x02, 0xA0, 0x07, + 0x04, 0x09, 0x00, 0x40, 0xE0, 0x04, 0x06, 0x09, + 0xE0, 0x04, 0x08, 0x09, 0x0E, 0xC8, 0x4C, 0x08, + 0x0F, 0xC8, 0x4E, 0x08, 0x0E, 0xC8, 0x8E, 0x08, + 0x0F, 0xC8, 0x90, 0x08, 0xE0, 0x04, 0x5A, 0x08, + 0xE0, 0x04, 0x60, 0x08, 0xE0, 0x02, 0x78, 0x07, + 0xE0, 0x04, 0x94, 0x08, 0x20, 0x40, 0x40, 0xE3, + 0x20, 0xE0, 0x0C, 0xE0, 0x60, 0x04, 0xBC, 0xC6, + 0x80, 0x01, 0x00, 0xF0, 0xC0, 0x01, 0x00, 0x40, + 0x10, 0x10, 0x80, 0x01, 0x00, 0xF0, 0x0D, 0x10, + 0xC0, 0x01, 0x00, 0xF0, 0x20, 0x40, 0x06, 0xE0, + 0x08, 0x10, 0xC0, 0x01, 0x00, 0xF0, 0x80, 0x01, + 0x00, 0x20, 0xE0, 0xC3, 0x94, 0x08, 0x01, 0x16, + 0x5B, 0x04, 0x4B, 0xC0, 0x20, 0x04, 0xDA, 0xEA, + 0x40, 0x01, 0x00, 0x20, 0xFB, 0x16, 0x51, 0x04, + 0xA0, 0xC2, 0xD8, 0x07, 0x4A, 0x01, 0x40, 0x00, + 0x01, 0x16, 0x5B, 0x04, 0xE0, 0x02, 0x78, 0x07, + 0x20, 0x20, 0x0C, 0xE0, 0xEF, 0x16, 0x43, 0xC2, + 0x02, 0x13, 0xA0, 0x06, 0x1A, 0xC3, 0x20, 0x2F, + 0x36, 0x07, 0x20, 0x40, 0x0C, 0xE0, 0xA0, 0x06, + 0xAC, 0xC1, 0xA0, 0xC3, 0x94, 0x08, 0xFB, 0x16, + 0xA0, 0x06, 0x3A, 0xC2, 0x8E, 0x07, 0x04, 0x09, + 0x9E, 0x07, 0x00, 0x80, 0x20, 0x20, 0x10, 0xE0, + 0x05, 0x16, 0x8F, 0x07, 0x4C, 0x08, 0xBF, 0xCF, + 0xBF, 0xCF, 0x9F, 0xC7, 0xA0, 0x06, 0x5A, 0xC2, + 0x20, 0xE8, 0x3C, 0xE3, 0x62, 0x07, 0xA0, 0x06, + 0x3A, 0xC2, 0x20, 0x48, 0x3C, 0xE3, 0x62, 0x07, + 0x20, 0x40, 0x40, 0xE3, 0x20, 0xE0, 0x04, 0xE0, + 0x20, 0x48, 0x10, 0xE0, 0x58, 0x07, 0x5B, 0x04, + 0x80, 0x01, 0x00, 0xF0, 0x20, 0xE0, 0x04, 0xE0, + 0x60, 0x01, 0x60, 0x07, 0x02, 0x00, 0x02, 0x13, + 0x9B, 0x06, 0xB8, 0x10, 0x20, 0xE8, 0x1E, 0xE0, + 0x58, 0x07, 0xB4, 0x10, 0x9B, 0x06, 0x80, 0x03, + 0xE0, 0x02, 0x58, 0x07, 0x00, 0x01, 0x00, 0x40, + 0x07, 0x16, 0x8D, 0x07, 0x00, 0x09, 0xA0, 0x06, + 0x68, 0xB8, 0xE0, 0x02, 0x78, 0x07, 0x5B, 0x04, + 0xC4, 0x01, 0x02, 0x00, 0xE0, 0x02, 0x78, 0x07, + 0x5B, 0x04, 0x0E, 0x68, 0x96, 0x08, 0xE9, 0x04, + 0x0C, 0x00, 0x11, 0x10, 0x0E, 0x02, 0x00, 0x23, + 0x4E, 0xDB, 0x01, 0x00, 0xCC, 0x01, 0x00, 0x04, + 0x4C, 0xD7, 0x1C, 0x10, 0x60, 0xC2, 0x5C, 0x07, + 0x20, 0x06, 0x94, 0x08, 0xA9, 0xC2, 0x08, 0x00, + 0xA9, 0xC3, 0x0C, 0x00, 0xEA, 0x16, 0x29, 0x07, + 0x04, 0x00, 0x69, 0x01, 0x0A, 0x00, 0x01, 0x00, + 0x2D, 0x13, 0x49, 0xC3, 0x2D, 0x02, 0x0E, 0x00, + 0x0A, 0xC3, 0x1D, 0xD3, 0x8C, 0x01, 0x00, 0x84, + 0xCC, 0x01, 0x00, 0x40, 0x0A, 0x01, 0x00, 0x5E, + 0xDD, 0x16, 0x4C, 0xC7, 0xA9, 0xC3, 0x10, 0x00, + 0xE9, 0xC3, 0x12, 0x00, 0x41, 0xCA, 0x10, 0x00, + 0x2F, 0x02, 0x04, 0x00, 0x01, 0x17, 0x8E, 0x05, + 0x8C, 0x07, 0x02, 0x00, 0xA0, 0xC2, 0xF6, 0x07, + 0xA0, 0x06, 0x00, 0xBA, 0x69, 0xC0, 0x10, 0x00, + 0x29, 0xC8, 0x14, 0x00, 0x06, 0x09, 0x29, 0xC8, + 0x16, 0x00, 0x08, 0x09, 0x69, 0x01, 0x0E, 0x00, + 0x00, 0x08, 0x04, 0x16, 0x90, 0x03, 0x7F, 0x00, + 0xA0, 0x06, 0x5A, 0xC2, 0x40, 0x01, 0x00, 0x40, + 0x01, 0x16, 0x51, 0x04, 0x60, 0x04, 0xBE, 0xC1, + 0xA9, 0xC3, 0x0C, 0x00, 0x0B, 0x13, 0x0E, 0x68, + 0x96, 0x08, 0xE9, 0x04, 0x0C, 0x00, 0x29, 0xC8, + 0x06, 0x00, 0x6C, 0x01, 0xA0, 0xC3, 0x00, 0xFC, + 0x01, 0x13, 0x1E, 0x2E, 0x29, 0x07, 0x04, 0x00, + 0x5B, 0x04, 0x81, 0x07, 0x20, 0x20, 0x89, 0x07, + 0x4C, 0x08, 0x41, 0xCE, 0x63, 0xCE, 0x10, 0x00, + 0x63, 0xC6, 0x12, 0x00, 0xA0, 0x06, 0x54, 0xBA, + 0x43, 0xC2, 0x02, 0x13, 0xA0, 0x06, 0x1A, 0xC3, + 0x20, 0xE0, 0x10, 0xE0, 0x60, 0x04, 0xEC, 0xC1, + 0x40, 0x01, 0x00, 0x04, 0xEA, 0x16, 0xA0, 0x06, + 0xAC, 0xC1, 0xA0, 0xC2, 0xF0, 0x07, 0x8C, 0x07, + 0x04, 0x00, 0x8D, 0x07, 0x4C, 0x08, 0xA0, 0xC3, + 0x8E, 0x08, 0xE0, 0xC3, 0x90, 0x08, 0xA0, 0x06, + 0x36, 0xBA, 0xE0, 0xC3, 0x4E, 0x08, 0x4F, 0x01, + 0x01, 0x00, 0x13, 0x16, 0xE0, 0xC2, 0x94, 0x08, + 0xEA, 0x16, 0x60, 0x04, 0xEC, 0xC1, 0xE0, 0xC3, + 0x4E, 0x08, 0x4F, 0x01, 0x01, 0x00, 0x09, 0x16, + 0x60, 0x04, 0xEC, 0xC1, 0xA0, 0x06, 0x54, 0xBA, + 0xE0, 0xC3, 0x4E, 0x08, 0x4F, 0x01, 0x01, 0x00, + 0xD7, 0x13, 0xA0, 0xC2, 0xF0, 0x07, 0x20, 0xC3, + 0x7C, 0x09, 0x8D, 0x07, 0x4C, 0x08, 0x9D, 0xC3, + 0xA0, 0x06, 0x36, 0xBA, 0xC0, 0x06, 0x20, 0xD0, + 0x50, 0x08, 0xC0, 0x06, 0x40, 0x01, 0x00, 0x04, + 0x0A, 0x16, 0x40, 0x01, 0x80, 0x00, 0x07, 0x13, + 0x0E, 0xC8, 0x4C, 0x08, 0x0F, 0xC8, 0x4E, 0x08, + 0xA0, 0x06, 0xA2, 0xC1, 0xD8, 0x10, 0x0E, 0xC8, + 0x8E, 0x08, 0x0F, 0xC8, 0x90, 0x08, 0x40, 0x01, + 0x00, 0x04, 0x0C, 0x13, 0x40, 0x01, 0x20, 0x00, + 0x58, 0x16, 0x81, 0x07, 0x10, 0x20, 0x9F, 0x10, + 0xA0, 0x06, 0xAC, 0xC1, 0xA0, 0xC3, 0x8E, 0x08, + 0xE0, 0xC3, 0x90, 0x08, 0x83, 0x07, 0x98, 0x08, + 0x63, 0x07, 0x04, 0x00, 0x2D, 0x11, 0x83, 0x07, + 0xB0, 0x08, 0x63, 0x07, 0x04, 0x00, 0x28, 0x11, + 0x83, 0x07, 0xC8, 0x08, 0x63, 0x07, 0x04, 0x00, + 0x23, 0x11, 0xC3, 0x60, 0x60, 0xC2, 0x46, 0x07, + 0xE7, 0x13, 0x69, 0x01, 0x0E, 0x00, 0x00, 0x08, + 0xE3, 0x13, 0x00, 0x03, 0x02, 0x00, 0x19, 0xC8, + 0x46, 0x07, 0x03, 0x16, 0xA0, 0x01, 0x3A, 0x07, + 0x20, 0x00, 0x00, 0x03, 0x0F, 0x00, 0xC0, 0x01, + 0x00, 0xF0, 0x80, 0x01, 0x00, 0x20, 0x01, 0x02, + 0x06, 0xC4, 0x60, 0x04, 0x9A, 0xC2, 0x81, 0x07, + 0x80, 0x20, 0xE0, 0xC8, 0x8E, 0x08, 0x14, 0x00, + 0xE0, 0xC8, 0x90, 0x08, 0x16, 0x00, 0xC7, 0x10, + 0xE0, 0xC8, 0x50, 0x08, 0x0E, 0x00, 0xCE, 0xC8, + 0x10, 0x00, 0xCF, 0xC8, 0x12, 0x00, 0x40, 0x01, + 0x20, 0x00, 0xBB, 0x16, 0xE3, 0xC1, 0x06, 0x00, + 0xC7, 0xC8, 0x08, 0x00, 0x07, 0xC8, 0x6C, 0x01, + 0x07, 0xC8, 0xE0, 0x08, 0x08, 0x02, 0x02, 0xFC, + 0xB8, 0x07, 0x00, 0x81, 0xE0, 0xC1, 0xE8, 0x00, + 0x07, 0xCE, 0x20, 0xC8, 0x52, 0x08, 0x92, 0x08, + 0xDA, 0x13, 0xCE, 0xC8, 0x14, 0x00, 0xCF, 0xC8, + 0x16, 0x00, 0x80, 0x01, 0x00, 0x04, 0x82, 0x07, + 0x54, 0x08, 0x32, 0xC1, 0x08, 0x11, 0x72, 0xC1, + 0x92, 0xC1, 0x82, 0x07, 0x8A, 0x08, 0x04, 0xC1, + 0x07, 0x16, 0x60, 0x04, 0x8E, 0xC5, 0x72, 0xC1, + 0xB2, 0xC1, 0x84, 0x01, 0x00, 0x80, 0xF9, 0x13, + 0x04, 0x68, 0x92, 0x08, 0xC7, 0xC1, 0x37, 0x16, + 0x20, 0x98, 0x97, 0x08, 0x85, 0x09, 0x16, 0x16, + 0x81, 0x07, 0x40, 0x20, 0xE0, 0xC1, 0x94, 0x08, + 0x57, 0x13, 0xA0, 0x06, 0xAC, 0xC1, 0xF4, 0x10, + 0xE0, 0xC2, 0x3A, 0x07, 0xE0, 0x42, 0x62, 0x07, + 0xE0, 0x26, 0x3A, 0xE3, 0x02, 0x13, 0xA0, 0x06, + 0x92, 0xC1, 0xA0, 0x06, 0x54, 0xBA, 0x22, 0x10, + 0xA0, 0x06, 0x9C, 0xC1, 0x81, 0x2D, 0x01, 0xC2, + 0xFB, 0x13, 0xA0, 0x05, 0x96, 0x08, 0x23, 0xC8, + 0x08, 0x00, 0x6C, 0x01, 0xA0, 0x07, 0x02, 0xFC, + 0x00, 0x80, 0xC3, 0xC1, 0x27, 0x02, 0x06, 0x00, + 0xA0, 0x06, 0x0C, 0xB5, 0xA3, 0x05, 0x0C, 0x00, + 0x08, 0xC8, 0x6C, 0x01, 0x08, 0xC8, 0xE0, 0x08, + 0x08, 0x02, 0x02, 0xFC, 0xB8, 0x07, 0x00, 0x81, + 0xF8, 0xC1, 0x04, 0xC1, 0x37, 0x13, 0xE0, 0xD2, + 0x03, 0x01, 0xD2, 0x13, 0x0B, 0x02, 0x0A, 0x01, + 0xC4, 0xCE, 0xC7, 0xCE, 0xC5, 0xCE, 0xC6, 0xCE, + 0xFB, 0x04, 0x09, 0x02, 0x00, 0x04, 0x48, 0xA2, + 0xC9, 0xC6, 0x20, 0xA8, 0xE0, 0x08, 0x12, 0x01, + 0x20, 0xC8, 0xF2, 0x07, 0x00, 0x01, 0x47, 0xC2, + 0xC4, 0x81, 0x01, 0x14, 0x44, 0xC2, 0xC9, 0x61, + 0x09, 0xA2, 0x89, 0xA1, 0x01, 0x17, 0x85, 0x05, + 0x09, 0x61, 0xA8, 0x16, 0x82, 0x02, 0x8A, 0x08, + 0x05, 0x16, 0x40, 0x01, 0x10, 0x00, 0x12, 0x13, + 0x60, 0x04, 0xA6, 0xC3, 0x60, 0x04, 0xBC, 0xC4, + 0x60, 0x04, 0x40, 0xC3, 0x81, 0x07, 0x80, 0x20, + 0xFB, 0x10, 0x81, 0x07, 0x80, 0x20, 0xF8, 0x10, + 0x81, 0x07, 0x02, 0x20, 0xF5, 0x10, 0x81, 0x07, + 0x04, 0x20, 0xF2, 0x10, 0x23, 0xC8, 0x08, 0x00, + 0x6C, 0x01, 0x07, 0x05, 0xE0, 0xA1, 0xE8, 0x00, + 0x0C, 0x02, 0x04, 0xFC, 0x07, 0xCF, 0xE0, 0xC2, + 0x92, 0x08, 0xE8, 0x16, 0xE0, 0xD2, 0x03, 0x01, + 0x10, 0x16, 0xE0, 0xC2, 0x3A, 0x07, 0xE0, 0x42, + 0x62, 0x07, 0xE0, 0x26, 0x3A, 0xE3, 0x07, 0x13, + 0x90, 0x03, 0xC8, 0x2F, 0xA0, 0x06, 0x92, 0xC1, + 0xE0, 0xD2, 0x03, 0x01, 0x02, 0x16, 0xA0, 0x06, + 0x54, 0xBA, 0x23, 0xC8, 0x06, 0x00, 0x6C, 0x01, + 0xA3, 0xC2, 0x0E, 0x00, 0x4A, 0x01, 0x00, 0x01, + 0x0B, 0x13, 0x0C, 0x02, 0x0E, 0xFC, 0x5C, 0xC2, + 0x49, 0x02, 0x00, 0x80, 0x0D, 0x02, 0x6C, 0x09, + 0x7D, 0xE2, 0x09, 0xCF, 0x3D, 0xCF, 0x3D, 0xCF, + 0x0C, 0x02, 0x00, 0xFC, 0x6C, 0xC3, 0x06, 0x00, + 0x4D, 0x02, 0xFF, 0xE0, 0x4A, 0x02, 0x00, 0x02, + 0x8A, 0xA2, 0x8A, 0xA2, 0x4A, 0xE3, 0x60, 0xE3, + 0x9E, 0x09, 0x0D, 0xCB, 0x06, 0x00, 0xCD, 0x06, + 0x0B, 0x02, 0x0F, 0x00, 0xEC, 0x82, 0x04, 0x00, + 0xAD, 0x11, 0xEC, 0xC3, 0x0E, 0x00, 0x11, 0x15, + 0x10, 0x13, 0x6C, 0xC2, 0x14, 0x00, 0x49, 0x02, + 0x00, 0x1F, 0xA7, 0x13, 0xC9, 0x06, 0x89, 0x02, + 0x12, 0x00, 0xA3, 0x1B, 0x49, 0x01, 0x01, 0x00, + 0xA0, 0x13, 0xC9, 0xA2, 0xEC, 0x82, 0x04, 0x00, + 0x9C, 0x11, 0x4D, 0xA3, 0x9D, 0x18, 0x14, 0x11, + 0x60, 0x01, 0x6A, 0x09, 0x00, 0x80, 0x18, 0x13, + 0x1D, 0x09, 0xCC, 0xA2, 0xEB, 0xC2, 0x08, 0x00, + 0x7B, 0x09, 0x4B, 0x02, 0x1E, 0x00, 0xA0, 0xC3, + 0xF0, 0x06, 0xAB, 0x23, 0x04, 0xE0, 0x8F, 0x16, + 0x60, 0x27, 0x3E, 0xE3, 0x8C, 0x16, 0x4D, 0xA3, + 0x4D, 0xA3, 0x4D, 0xA3, 0xCD, 0x06, 0x4D, 0x02, + 0x07, 0x00, 0x0D, 0x88, 0xEE, 0x06, 0x0A, 0x15, + 0x90, 0x03, 0xFF, 0x6F, 0x53, 0x2F, 0xA0, 0x05, + 0x94, 0x08, 0xC3, 0x04, 0xC0, 0x01, 0x00, 0x04, + 0x60, 0x04, 0xAA, 0xC3, 0x60, 0x01, 0x6A, 0x09, + 0x00, 0x80, 0xF2, 0x13, 0x01, 0x02, 0x08, 0x20, + 0x60, 0x04, 0xA2, 0xC5, 0x8D, 0x07, 0x00, 0x10, + 0x20, 0x20, 0x0A, 0xE0, 0x0A, 0x16, 0x8D, 0x07, + 0x00, 0x08, 0x20, 0x20, 0x0E, 0xE0, 0x05, 0x13, + 0x8D, 0x07, 0x00, 0x40, 0x4F, 0x01, 0x01, 0x00, + 0x01, 0x16, 0x5B, 0x04, 0x20, 0xE0, 0x0E, 0xE0, + 0xA0, 0x07, 0xFA, 0x08, 0x00, 0x80, 0x0E, 0xC8, + 0xFA, 0x07, 0x0F, 0xC8, 0xFC, 0x07, 0x0E, 0xC8, + 0x3C, 0x08, 0x0F, 0xC8, 0x3E, 0x08, 0xE0, 0x04, + 0x08, 0x08, 0xE0, 0x04, 0x0E, 0x08, 0xE0, 0x02, + 0x98, 0x07, 0x20, 0x40, 0x4C, 0xE3, 0x20, 0x07, + 0x2E, 0x06, 0x60, 0x04, 0x12, 0xCA, 0x00, 0x70, + 0x4B, 0xC0, 0xE0, 0x04, 0x2E, 0x06, 0x0B, 0x10, + 0x20, 0xF0, 0x4B, 0xE3, 0x02, 0x10, 0x20, 0xF0, + 0x4A, 0xE3, 0x4B, 0xC0, 0xE0, 0x04, 0x2E, 0x06, + 0xE0, 0x01, 0x62, 0x07, 0x40, 0x00, 0x20, 0xE8, + 0x46, 0xE3, 0x62, 0x07, 0x20, 0x04, 0xDA, 0xEA, + 0x40, 0x01, 0x00, 0x20, 0x04, 0x13, 0xFA, 0x10, + 0x40, 0x01, 0x00, 0x40, 0xF7, 0x16, 0x20, 0x07, + 0x2E, 0x06, 0x20, 0x50, 0x50, 0xE3, 0x51, 0x04, + 0xF1, 0x10, 0xE0, 0x02, 0x58, 0x07, 0x00, 0x01, + 0x00, 0x40, 0x07, 0x16, 0x8D, 0x07, 0xF6, 0x08, + 0xA0, 0x06, 0x68, 0xB8, 0xE0, 0x02, 0x98, 0x07, + 0x5B, 0x04, 0xC4, 0x01, 0x04, 0x00, 0xE0, 0x02, + 0x98, 0x07, 0x5B, 0x04, 0x60, 0x01, 0x60, 0x07, + 0x04, 0x00, 0x06, 0x16, 0x20, 0xE8, 0x1C, 0xE0, + 0x58, 0x07, 0x80, 0x03, 0xE0, 0x02, 0x98, 0x07, + 0x20, 0xD8, 0xDC, 0x07, 0x17, 0x01, 0x8F, 0x07, + 0x8E, 0xFF, 0x0F, 0xC8, 0x04, 0x01, 0x20, 0xE8, + 0x06, 0xE0, 0x58, 0x07, 0x80, 0x01, 0x00, 0x80, + 0x5B, 0x04, 0xE0, 0xC2, 0x4A, 0x08, 0xC3, 0x82, + 0x03, 0x13, 0xDB, 0x2D, 0x03, 0xC8, 0x4A, 0x08, + 0x49, 0x01, 0x00, 0x01, 0x02, 0x16, 0x60, 0x04, + 0x52, 0xC9, 0xE0, 0xC0, 0xF8, 0x05, 0xFD, 0x13, + 0x03, 0xC8, 0x6C, 0x01, 0x20, 0xC8, 0x00, 0xFC, + 0xF8, 0x05, 0x88, 0x07, 0x02, 0xFC, 0x78, 0xC2, + 0xF8, 0xC1, 0x28, 0x02, 0x00, 0x04, 0x49, 0x01, + 0x00, 0x01, 0x4D, 0x16, 0x09, 0x01, 0x00, 0x5E, + 0x29, 0x16, 0x49, 0x01, 0x02, 0x00, 0x0B, 0x16, + 0x60, 0x01, 0x46, 0x08, 0x00, 0x02, 0x0A, 0x16, + 0x27, 0x02, 0x04, 0x00, 0x07, 0x88, 0x7E, 0x09, + 0x05, 0x12, 0x27, 0x02, 0xFC, 0xFF, 0xA0, 0x01, + 0x46, 0x08, 0x00, 0x02, 0xC7, 0xC1, 0x37, 0x15, + 0xD3, 0x2D, 0xE0, 0xC0, 0x4A, 0x08, 0x07, 0xA8, + 0x48, 0x08, 0x07, 0xA8, 0x44, 0x08, 0x0C, 0x15, + 0x20, 0xC8, 0x3C, 0x08, 0xFA, 0x07, 0x20, 0xC8, + 0x3E, 0x08, 0xFC, 0x07, 0x20, 0xC8, 0x40, 0x08, + 0x3C, 0x08, 0x20, 0xC8, 0x42, 0x08, 0x3E, 0x08, + 0x60, 0x04, 0x52, 0xC9, 0xA0, 0x06, 0x54, 0xBA, + 0xD3, 0x2D, 0xE0, 0xC2, 0x4A, 0x08, 0xC3, 0x82, + 0x01, 0x13, 0xDB, 0x2D, 0x20, 0x88, 0x3E, 0x08, + 0x3A, 0x08, 0x0D, 0x16, 0x20, 0x88, 0x3C, 0x08, + 0x38, 0x08, 0x09, 0x16, 0xE0, 0x04, 0x44, 0x08, + 0x82, 0x07, 0x02, 0x08, 0x04, 0x61, 0xE0, 0x04, + 0x48, 0x08, 0x60, 0x04, 0x1E, 0xCA, 0x20, 0xC8, + 0x38, 0x08, 0xFA, 0x07, 0x20, 0xC8, 0x3A, 0x08, + 0xFC, 0x07, 0x60, 0x04, 0x12, 0xCA, 0x07, 0xA8, + 0x48, 0x08, 0x04, 0xC1, 0x1B, 0x16, 0x82, 0x02, + 0x38, 0x08, 0x0A, 0x16, 0x60, 0x01, 0xFC, 0x07, + 0x01, 0x00, 0x02, 0x16, 0xA0, 0x06, 0x6E, 0xCB, + 0xA0, 0x06, 0xFC, 0xCA, 0x80, 0x01, 0x10, 0x00, + 0x32, 0xC1, 0x07, 0x11, 0x72, 0xC1, 0x92, 0xC1, + 0x82, 0x07, 0x38, 0x08, 0x04, 0xC1, 0x06, 0x16, + 0xEA, 0x10, 0x72, 0xC1, 0xB2, 0xC1, 0x84, 0x01, + 0x00, 0x80, 0xE5, 0x13, 0xE0, 0xD2, 0x03, 0x01, + 0x34, 0x13, 0x0B, 0x02, 0x0A, 0x01, 0xC4, 0xCE, + 0xC7, 0xCE, 0xC5, 0xCE, 0xC6, 0xCE, 0xFB, 0x04, + 0xC8, 0xC6, 0x03, 0xA8, 0x12, 0x01, 0x20, 0xC8, + 0xF8, 0x07, 0x00, 0x01, 0xC7, 0xC2, 0xC4, 0x81, + 0x01, 0x14, 0xC4, 0xC2, 0x0B, 0xA8, 0x44, 0x08, + 0x0B, 0x61, 0x0B, 0xA2, 0x8B, 0xA1, 0x01, 0x17, + 0x85, 0x05, 0xCB, 0x61, 0xC6, 0x16, 0x40, 0x01, + 0x40, 0x00, 0x15, 0x16, 0x87, 0x07, 0x20, 0x00, + 0xE0, 0x61, 0x44, 0x08, 0xC4, 0x81, 0x08, 0x1A, + 0x07, 0xA8, 0x48, 0x08, 0x07, 0xA8, 0x44, 0x08, + 0x07, 0x61, 0x87, 0xA1, 0x01, 0x17, 0x85, 0x05, + 0x80, 0x01, 0x40, 0x00, 0x03, 0xC8, 0x6C, 0x01, + 0xE0, 0xC1, 0x04, 0xFC, 0xAC, 0x10, 0x60, 0x04, + 0xBC, 0xC7, 0x20, 0x01, 0x3A, 0x07, 0x00, 0x70, + 0x04, 0x13, 0xA0, 0x06, 0x28, 0xC7, 0x20, 0x07, + 0x2E, 0x06, 0xA0, 0x06, 0x54, 0xBA, 0xC1, 0x10, + 0xE0, 0xD2, 0x03, 0x01, 0x0A, 0x16, 0x20, 0x01, + 0x3A, 0x07, 0x00, 0x70, 0x04, 0x13, 0xA0, 0x06, + 0x28, 0xC7, 0x20, 0x07, 0x2E, 0x06, 0xA0, 0x06, + 0x54, 0xBA, 0x90, 0x03, 0xBF, 0x4F, 0xD3, 0x2D, + 0x60, 0x01, 0xFC, 0x07, 0x01, 0x00, 0x02, 0x16, + 0xA0, 0x06, 0x6E, 0xCB, 0x60, 0xD2, 0x46, 0x08, + 0x89, 0x01, 0x00, 0xF1, 0xC9, 0x01, 0x00, 0x70, + 0x40, 0x01, 0x10, 0x00, 0x1C, 0x13, 0x20, 0x88, + 0x3E, 0x08, 0x3A, 0x08, 0x04, 0x16, 0x20, 0x88, + 0x3C, 0x08, 0x38, 0x08, 0x14, 0x13, 0x89, 0x01, + 0x00, 0x10, 0x8D, 0x07, 0x44, 0x08, 0x9D, 0x07, + 0x00, 0x50, 0xA0, 0xC2, 0xF6, 0x07, 0x8C, 0x07, + 0x02, 0x00, 0xA0, 0xC3, 0x3C, 0x08, 0xE0, 0xC3, + 0x3E, 0x08, 0x2F, 0x02, 0x04, 0x00, 0x01, 0x17, + 0x8E, 0x05, 0xA0, 0x06, 0x00, 0xBA, 0x8D, 0x07, + 0x46, 0x08, 0x49, 0xC7, 0xA0, 0xC2, 0xF6, 0x07, + 0x8C, 0x07, 0x04, 0x00, 0xA0, 0xC3, 0x38, 0x08, + 0xE0, 0xC3, 0x3A, 0x08, 0xCC, 0xA3, 0x01, 0x17, + 0x8E, 0x05, 0xA0, 0x06, 0x00, 0xBA, 0x20, 0xC8, + 0x3C, 0x08, 0xFC, 0x08, 0x20, 0xC8, 0x3E, 0x08, + 0xFE, 0x08, 0x09, 0x01, 0x00, 0x0C, 0x0C, 0x13, + 0x49, 0x01, 0x00, 0x04, 0x05, 0x16, 0xA0, 0x06, + 0x6C, 0xC7, 0xA0, 0x06, 0x38, 0xC7, 0x04, 0x10, + 0x90, 0x03, 0x7F, 0x40, 0xA0, 0x06, 0x6C, 0xC7, + 0xC0, 0x01, 0x90, 0x00, 0xA0, 0x06, 0xFC, 0xCA, + 0x0B, 0xC8, 0x46, 0x08, 0xE0, 0xC2, 0x42, 0x07, + 0x2D, 0x13, 0xE0, 0xC2, 0x2E, 0x06, 0x2A, 0x13, + 0xE0, 0x02, 0x58, 0x07, 0x8F, 0x07, 0xBF, 0xFF, + 0x0F, 0x2C, 0xE0, 0x02, 0x98, 0x07, 0xE0, 0xC0, + 0x5C, 0x07, 0x03, 0xC8, 0x4A, 0x08, 0x03, 0xC8, + 0x6C, 0x01, 0xC3, 0xC2, 0xCB, 0xA2, 0xEB, 0xC2, + 0x32, 0x0C, 0x32, 0x13, 0x0B, 0xC8, 0x00, 0xFC, + 0x0B, 0xC3, 0x4B, 0xC3, 0x0B, 0xC8, 0x6C, 0x01, + 0xE0, 0xC2, 0x00, 0xFC, 0xFA, 0x16, 0x00, 0x03, + 0x02, 0x00, 0x20, 0xC8, 0xF8, 0x05, 0x00, 0xFC, + 0x02, 0x16, 0x0D, 0xC8, 0xFA, 0x05, 0x0C, 0xC8, + 0xF8, 0x05, 0x00, 0x03, 0x0F, 0x00, 0x03, 0xC8, + 0x6C, 0x01, 0x1A, 0x10, 0xA0, 0xC3, 0x2E, 0x06, + 0x03, 0x13, 0xE0, 0xC0, 0xF8, 0x05, 0x0D, 0x16, + 0x4F, 0x2E, 0xC0, 0x01, 0x00, 0x80, 0xA0, 0x01, + 0x62, 0x07, 0x00, 0x80, 0x8E, 0xC3, 0x03, 0x13, + 0xA0, 0x01, 0x62, 0x07, 0x40, 0x00, 0x60, 0x04, + 0x4E, 0xC7, 0x03, 0xC8, 0x6C, 0x01, 0x20, 0xC8, + 0x00, 0xFC, 0xF8, 0x05, 0x03, 0xC8, 0x4A, 0x08, + 0x60, 0x01, 0x6A, 0x09, 0x00, 0x04, 0x02, 0x13, + 0x60, 0x04, 0xE4, 0xC7, 0x8C, 0x07, 0x0E, 0x00, + 0x20, 0xC2, 0x0E, 0xFC, 0x0A, 0x15, 0x09, 0x13, + 0x20, 0xC2, 0x14, 0xFC, 0x48, 0x02, 0x00, 0x1F, + 0xC8, 0x06, 0x88, 0x02, 0x12, 0x00, 0xF0, 0x1B, + 0x08, 0xA3, 0x88, 0x07, 0x02, 0xFC, 0x78, 0xC2, + 0xF8, 0xC1, 0x28, 0x02, 0x00, 0x04, 0x07, 0x83, + 0xE7, 0x1A, 0xCC, 0x61, 0x07, 0xC8, 0x04, 0xFC, + 0xCC, 0xC1, 0xC0, 0x01, 0x40, 0x00, 0x60, 0x04, + 0xF0, 0xC7, 0x4B, 0xC1, 0xA0, 0xC2, 0xF0, 0x07, + 0x20, 0xC3, 0x7A, 0x09, 0x8D, 0x07, 0xFA, 0x07, + 0x9D, 0xC3, 0xE0, 0xC3, 0xFC, 0x07, 0xA0, 0x06, + 0x00, 0xBA, 0x20, 0xC8, 0x3C, 0x08, 0x40, 0x08, + 0x20, 0xC8, 0x3E, 0x08, 0x42, 0x08, 0x0E, 0xC8, + 0x3C, 0x08, 0x0F, 0xC8, 0x3E, 0x08, 0xC4, 0x04, + 0x82, 0x07, 0x02, 0x08, 0xE0, 0x04, 0x44, 0x08, + 0x40, 0x01, 0x80, 0x00, 0x06, 0x16, 0x0E, 0xC8, + 0x38, 0x08, 0x0F, 0xC8, 0x3A, 0x08, 0xE0, 0x04, + 0x48, 0x08, 0xA0, 0x06, 0x54, 0xBA, 0xE0, 0xC2, + 0xFE, 0x07, 0x0D, 0x11, 0x0E, 0xC8, 0xFA, 0x07, + 0x0F, 0xC8, 0xFC, 0x07, 0x20, 0xC8, 0x40, 0x08, + 0x3C, 0x08, 0x20, 0xC8, 0x42, 0x08, 0x3E, 0x08, + 0xA0, 0x06, 0x32, 0xC7, 0xCB, 0x10, 0x80, 0x01, + 0x80, 0x00, 0x55, 0x04, 0x8B, 0xC0, 0xA0, 0xC2, + 0xF0, 0x07, 0x8C, 0x07, 0x04, 0x00, 0x8D, 0x07, + 0xFA, 0x07, 0xA0, 0xC3, 0x3C, 0x08, 0xE0, 0xC3, + 0x3E, 0x08, 0xA0, 0x06, 0x36, 0xBA, 0x60, 0x01, + 0xFC, 0x07, 0x01, 0x00, 0x04, 0x13, 0xA0, 0x07, + 0xFA, 0x08, 0x00, 0x80, 0x52, 0x04, 0x60, 0x01, + 0x60, 0x07, 0x04, 0x00, 0x07, 0x16, 0x20, 0xD0, + 0x04, 0xE0, 0x20, 0xE8, 0x1A, 0xE0, 0x58, 0x07, + 0x60, 0x04, 0x3E, 0xC7, 0xA0, 0x07, 0xFA, 0x08, + 0x00, 0x40, 0x20, 0xC8, 0x3C, 0x08, 0xFC, 0x08, + 0x20, 0xC8, 0x3E, 0x08, 0xFE, 0x08, 0xA0, 0x06, + 0x6C, 0xC7, 0xA0, 0x06, 0x38, 0xC7, 0xD3, 0x10, + 0xAD, 0xC2, 0x02, 0x00, 0x6D, 0xC2, 0x00, 0x00, + 0x05, 0x16, 0xAA, 0x07, 0x02, 0x00, 0x36, 0x07, + 0x9A, 0x2C, 0x80, 0x03, 0xEA, 0x2C, 0x02, 0x00, + 0x41, 0xCB, 0x00, 0x00, 0x80, 0x03, 0x2D, 0xC3, + 0x18, 0x00, 0xAC, 0x07, 0x02, 0x00, 0x36, 0x07, + 0x20, 0x4B, 0x06, 0xEB, 0x0A, 0x00, 0x20, 0xEB, + 0x00, 0xEB, 0x0A, 0x00, 0x9C, 0x2E, 0x80, 0x03, + 0xA0, 0xC2, 0x22, 0xE0, 0x60, 0x04, 0x8A, 0xA3, + 0xED, 0xC0, 0x18, 0x00, 0xA0, 0x06, 0x3A, 0xCC, + 0x80, 0x03, 0x44, 0xC2, 0xC3, 0xC0, 0x02, 0x13, + 0xA0, 0x06, 0x3A, 0xCC, 0x19, 0xC3, 0x09, 0xCB, + 0x18, 0x00, 0xC9, 0x05, 0x19, 0xCB, 0x16, 0x00, + 0x4C, 0xC2, 0x2C, 0x02, 0x1A, 0x00, 0x0D, 0xCF, + 0x0E, 0xCF, 0x0F, 0xC7, 0x99, 0x00, 0x5B, 0x04, + 0x8C, 0x07, 0x0A, 0x09, 0x9C, 0xC2, 0xA0, 0x22, + 0x14, 0xE0, 0x06, 0x13, 0xA0, 0xC2, 0x58, 0x07, + 0xA0, 0x22, 0x20, 0xE0, 0x01, 0x16, 0x80, 0x03, + 0x03, 0xC1, 0xC3, 0x04, 0x8A, 0x07, 0x04, 0x00, + 0x84, 0xA2, 0x3A, 0xCF, 0x3A, 0xCF, 0x3A, 0xCF, + 0x3A, 0xCF, 0x3A, 0xCF, 0xE0, 0x02, 0x58, 0x07, + 0x8D, 0x07, 0x0A, 0x09, 0x0B, 0xC8, 0xC2, 0x07, + 0xA0, 0x06, 0x44, 0xB8, 0xE0, 0xC2, 0xC2, 0x07, + 0x20, 0xE0, 0x20, 0xE0, 0xE0, 0x02, 0xB8, 0x07, + 0x5B, 0x04, 0x2D, 0xC3, 0x18, 0x00, 0x8C, 0xC2, + 0x60, 0xC2, 0x6C, 0x01, 0x0A, 0xC8, 0x6C, 0x01, + 0xE0, 0xC2, 0x00, 0xFC, 0x02, 0x13, 0x8B, 0xC2, + 0xF9, 0x10, 0x09, 0xC8, 0x6C, 0x01, 0x8B, 0x07, + 0xF8, 0x05, 0x5B, 0xC2, 0x0C, 0x13, 0xCB, 0x05, + 0x5B, 0xC2, 0xCA, 0xC6, 0xE0, 0xC2, 0x6C, 0x01, + 0x09, 0xC8, 0x6C, 0x01, 0x0C, 0xC8, 0x00, 0xFC, + 0x0B, 0xC8, 0x6C, 0x01, 0x02, 0x10, 0xCC, 0xCE, + 0xCA, 0xC6, 0xA0, 0xC2, 0xE0, 0x00, 0xA0, 0x22, + 0x1A, 0xE0, 0x06, 0x16, 0x20, 0xE8, 0x04, 0xE0, + 0x3A, 0x07, 0x20, 0x48, 0x1A, 0xE0, 0xE0, 0x00, + 0x80, 0x03, 0xE0, 0xD3, 0xAB, 0xE3, 0xE0, 0x04, + 0x8E, 0x09, 0xE0, 0xC1, 0xA8, 0x06, 0x05, 0x16, + 0x07, 0x02, 0xA2, 0x06, 0xA0, 0x06, 0x38, 0xB5, + 0x0B, 0x16, 0xE0, 0xC1, 0xBA, 0x06, 0x23, 0x16, + 0x07, 0x02, 0xB4, 0x06, 0xA0, 0x06, 0x38, 0xB5, + 0x1E, 0x13, 0x07, 0x02, 0xB8, 0x06, 0x02, 0x10, + 0x07, 0x02, 0xA6, 0x06, 0x60, 0xC1, 0x02, 0xFC, + 0x25, 0xC8, 0x0C, 0x00, 0x02, 0xFC, 0xC5, 0xC9, + 0x0C, 0x00, 0xF5, 0xCD, 0xF5, 0xCD, 0xF5, 0xCD, + 0xF5, 0xCD, 0xF5, 0xCD, 0xF5, 0xC5, 0xB7, 0x01, + 0x28, 0x00, 0x27, 0x02, 0xF4, 0xFF, 0xA7, 0x07, + 0x04, 0x00, 0x52, 0xCE, 0x20, 0xE8, 0x9E, 0x09, + 0x06, 0xFC, 0x97, 0x2E, 0xD2, 0x10, 0x00, 0x03, + 0x02, 0x00, 0xA0, 0x06, 0x50, 0xB5, 0x00, 0x03, + 0x0F, 0x00, 0x20, 0x2C, 0xF0, 0xED, 0xE0, 0x93, + 0xAB, 0xE3, 0x03, 0x16, 0x81, 0x02, 0x16, 0x00, + 0xC4, 0x16, 0x21, 0xC1, 0x10, 0xEB, 0x54, 0x04, + 0xE0, 0x93, 0x10, 0xE0, 0x03, 0x16, 0xA0, 0xD2, + 0xA8, 0xE3, 0x0B, 0x10, 0xCF, 0xD3, 0x09, 0x16, + 0xA0, 0x23, 0x08, 0xE0, 0x06, 0x16, 0x84, 0x07, + 0x20, 0x00, 0x04, 0xE8, 0xD2, 0x06, 0xA0, 0xD2, + 0x0C, 0xE0, 0x60, 0x04, 0xD2, 0xCE, 0x60, 0x04, + 0x70, 0xD1, 0x22, 0xC1, 0x04, 0x00, 0xE2, 0x04, + 0x02, 0x00, 0x54, 0x04, 0x02, 0xC8, 0x6C, 0x01, + 0x82, 0xA0, 0x22, 0xC8, 0x32, 0x0C, 0x00, 0xFC, + 0x02, 0x02, 0x00, 0xFC, 0xE0, 0x93, 0xAA, 0xE3, + 0x13, 0x16, 0xB0, 0x03, 0x20, 0x98, 0xAA, 0xE3, + 0x65, 0x06, 0x0D, 0x16, 0x8B, 0x07, 0x17, 0xFC, + 0xDB, 0xD2, 0x8B, 0x09, 0x8B, 0x02, 0x15, 0x00, + 0x7B, 0x1B, 0xEB, 0xD2, 0xC4, 0xEA, 0x06, 0x13, + 0x77, 0x15, 0x20, 0x07, 0xA0, 0x09, 0x74, 0x10, + 0xA0, 0x06, 0x02, 0xD0, 0xA0, 0x48, 0x04, 0xE0, + 0x0E, 0x00, 0x85, 0x02, 0x07, 0x00, 0x0E, 0x13, + 0x0E, 0x01, 0x03, 0x00, 0x0B, 0x13, 0xA0, 0x23, + 0x22, 0xE0, 0x03, 0x16, 0xA0, 0xD2, 0x0E, 0xE0, + 0x02, 0x10, 0xA0, 0xD2, 0xA8, 0xE3, 0x8E, 0x01, + 0x03, 0x00, 0x5E, 0x10, 0x05, 0xC8, 0xFC, 0x06, + 0xC3, 0xC0, 0x57, 0x16, 0xA0, 0x43, 0x10, 0xE0, + 0x22, 0x88, 0x0E, 0x00, 0x6C, 0x09, 0x0A, 0x16, + 0x22, 0x88, 0x10, 0x00, 0x6E, 0x09, 0x06, 0x16, + 0x22, 0x88, 0x12, 0x00, 0x70, 0x09, 0x02, 0x16, + 0xA0, 0xE3, 0x10, 0xE0, 0x85, 0x02, 0x09, 0x00, + 0x02, 0x13, 0xA0, 0x06, 0xB8, 0xD7, 0x45, 0xA1, + 0x65, 0xC1, 0xAC, 0xE3, 0x55, 0x04, 0x62, 0xC0, + 0x04, 0x00, 0x22, 0xC8, 0x06, 0x00, 0x6C, 0x01, + 0x82, 0x02, 0x48, 0x04, 0x02, 0x1B, 0xA0, 0x43, + 0x0C, 0xE0, 0x22, 0xC1, 0x0E, 0x00, 0x51, 0x04, + 0x42, 0xC0, 0xE1, 0x04, 0x02, 0x00, 0xA2, 0xC0, + 0x0C, 0x00, 0x22, 0xC1, 0x0A, 0x00, 0x20, 0x21, + 0x18, 0xE0, 0x07, 0x13, 0xA1, 0xC8, 0x0A, 0x00, + 0x0A, 0x00, 0xA1, 0xC8, 0x08, 0x00, 0x08, 0x00, + 0xE2, 0x10, 0x22, 0xC8, 0x06, 0x00, 0x6C, 0x01, + 0xA0, 0x06, 0x66, 0xD6, 0x60, 0x04, 0xB0, 0xCE, + 0x02, 0xC8, 0xD4, 0x06, 0x62, 0xC1, 0x02, 0x00, + 0x65, 0xC1, 0xD8, 0xE3, 0x55, 0x04, 0x0F, 0x10, + 0x0E, 0x10, 0x85, 0x07, 0xF4, 0x03, 0xF5, 0x04, + 0x60, 0xCD, 0xCE, 0xED, 0xA0, 0x06, 0xA2, 0xD8, + 0xA0, 0xE3, 0x0C, 0xE0, 0x20, 0xE8, 0x9E, 0x09, + 0x06, 0x04, 0xA0, 0x2E, 0xF4, 0x03, 0x60, 0x04, + 0xE4, 0xCC, 0xA0, 0x06, 0x26, 0xD5, 0x0C, 0x10, + 0xA0, 0x06, 0x66, 0xD6, 0x09, 0x10, 0xA0, 0x06, + 0x2A, 0xD8, 0x06, 0x10, 0xA0, 0x06, 0x66, 0xD6, + 0x03, 0xC8, 0x2A, 0x09, 0xA0, 0xD2, 0xAA, 0xE3, + 0xA0, 0x06, 0x6E, 0xCF, 0xA0, 0x92, 0x26, 0xE0, + 0x0C, 0x16, 0xE0, 0xD3, 0x26, 0xE0, 0xE0, 0x23, + 0x14, 0xE0, 0x0A, 0x13, 0x0A, 0xC1, 0xC4, 0x83, + 0x07, 0x13, 0xC4, 0xC3, 0x24, 0xC1, 0xDC, 0xE3, + 0x54, 0x04, 0xCA, 0x93, 0xDC, 0x13, 0xCA, 0xD3, + 0xB0, 0x03, 0x0F, 0xD8, 0x59, 0x06, 0x04, 0x71, + 0x24, 0xC1, 0xEC, 0xE3, 0x54, 0x04, 0xA0, 0x23, + 0x0C, 0xE0, 0xD1, 0x13, 0x4D, 0xC3, 0xCF, 0x13, + 0x4D, 0x01, 0x00, 0x04, 0x0B, 0x13, 0x86, 0x07, + 0x02, 0x00, 0x84, 0x07, 0x26, 0x00, 0x46, 0x23, + 0x03, 0x13, 0x44, 0x06, 0x86, 0xA1, 0xFB, 0x10, + 0x46, 0x43, 0xB3, 0x10, 0x84, 0x07, 0x18, 0x00, + 0x8D, 0x01, 0x00, 0x04, 0x85, 0x07, 0xF4, 0x03, + 0xF5, 0x04, 0x60, 0xCD, 0xCE, 0xED, 0xA0, 0x06, + 0xA2, 0xD8, 0x20, 0xE8, 0x9C, 0x09, 0xFE, 0x03, + 0x20, 0xE8, 0x9E, 0x09, 0x06, 0x04, 0xA8, 0x10, + 0x85, 0x07, 0x1C, 0x07, 0x86, 0x07, 0x1A, 0x04, + 0x76, 0x6D, 0x76, 0x6D, 0x76, 0x6D, 0xC6, 0x05, + 0x76, 0x6D, 0x76, 0x6D, 0x76, 0x6D, 0x83, 0x07, + 0x00, 0x90, 0xA9, 0x10, 0x0B, 0xC3, 0x86, 0x07, + 0x00, 0x01, 0x85, 0x07, 0x00, 0x80, 0x20, 0xC1, + 0xD2, 0x06, 0x37, 0x13, 0xC4, 0x04, 0x60, 0xC0, + 0xD2, 0x06, 0x45, 0x20, 0x04, 0x13, 0x84, 0x05, + 0x15, 0x09, 0xF9, 0x16, 0x2E, 0x10, 0xCF, 0xD3, + 0x06, 0x16, 0xE0, 0x23, 0x14, 0xE0, 0x03, 0x16, + 0x0E, 0x01, 0x03, 0x00, 0x03, 0x13, 0xE0, 0x04, + 0xD2, 0x06, 0x23, 0x10, 0x64, 0xD0, 0x1C, 0x07, + 0x46, 0xB0, 0x10, 0x18, 0x01, 0xD9, 0x1C, 0x07, + 0x60, 0x23, 0x20, 0xE0, 0x0B, 0x13, 0x81, 0x07, + 0x18, 0x00, 0x61, 0xC0, 0xFC, 0xE3, 0x11, 0x88, + 0xCE, 0xED, 0x04, 0x13, 0x08, 0x02, 0x18, 0x80, + 0xA0, 0x06, 0xDA, 0xD4, 0x64, 0xD0, 0x28, 0x07, + 0x46, 0xB0, 0x08, 0x18, 0x01, 0xD9, 0x28, 0x07, + 0x46, 0xB0, 0x04, 0x17, 0x83, 0x07, 0x40, 0x80, + 0xA0, 0x06, 0x2A, 0xD8, 0x05, 0x48, 0xD2, 0x06, + 0xCA, 0x16, 0x20, 0xC1, 0x32, 0x09, 0x01, 0x16, + 0x5C, 0x04, 0x04, 0x02, 0x07, 0x00, 0x20, 0x06, + 0x32, 0x09, 0x05, 0x02, 0x00, 0x01, 0xC7, 0x10, + 0x0B, 0xC3, 0xC5, 0x04, 0x42, 0xC0, 0xC7, 0x04, + 0x20, 0xC2, 0x6C, 0x01, 0xE1, 0xA1, 0x04, 0x00, + 0x11, 0xC8, 0x6C, 0x01, 0xFB, 0x16, 0x08, 0xC8, + 0x6C, 0x01, 0xC8, 0x04, 0xA0, 0x43, 0x1A, 0xE0, + 0x22, 0xC1, 0x0E, 0x00, 0x0D, 0x15, 0x0C, 0x13, + 0xA0, 0xE3, 0x1A, 0xE0, 0xA0, 0x06, 0x14, 0xD8, + 0x08, 0xC2, 0x48, 0x13, 0x88, 0x02, 0x12, 0x00, + 0x45, 0x1B, 0x20, 0x22, 0x22, 0xE0, 0x42, 0x13, + 0x02, 0xC1, 0x08, 0xA1, 0x08, 0x05, 0x28, 0x02, + 0xF2, 0xFF, 0x07, 0xA2, 0x83, 0x07, 0x01, 0x80, + 0x88, 0x02, 0x04, 0x00, 0x6E, 0x11, 0x64, 0xC2, + 0x16, 0x00, 0x49, 0xD2, 0x02, 0x16, 0x02, 0x81, + 0x31, 0x16, 0x09, 0x01, 0x00, 0xF0, 0x28, 0x16, + 0x49, 0xC1, 0x45, 0x71, 0xC3, 0x04, 0x85, 0x02, + 0x09, 0x00, 0x7C, 0x13, 0x83, 0x07, 0x02, 0x80, + 0xA4, 0xC1, 0x14, 0x00, 0x88, 0x81, 0x76, 0x16, + 0x83, 0x05, 0x85, 0x02, 0x15, 0x00, 0x13, 0x1B, + 0x83, 0x05, 0x49, 0x99, 0x30, 0xEB, 0x0A, 0x13, + 0x09, 0x98, 0x0E, 0xE0, 0x6B, 0x16, 0x25, 0x98, + 0x30, 0xEB, 0x0C, 0xE0, 0x67, 0x16, 0xE0, 0xC1, + 0xEC, 0x06, 0x64, 0x16, 0xC3, 0x04, 0x52, 0xC2, + 0x0F, 0x13, 0x83, 0x07, 0x09, 0x80, 0xE0, 0xC1, + 0x6A, 0x09, 0x47, 0x01, 0x00, 0x10, 0x5A, 0x16, + 0xA0, 0xC0, 0x6C, 0x01, 0xA0, 0x06, 0xBE, 0xD6, + 0x60, 0x04, 0xB0, 0xCE, 0x60, 0x04, 0xBA, 0xCE, + 0x89, 0x07, 0x0E, 0x07, 0xC7, 0x04, 0xE5, 0xD1, + 0x46, 0xEB, 0x05, 0x13, 0xC7, 0x06, 0x27, 0x02, + 0x5C, 0xEB, 0x77, 0xCE, 0xFE, 0x15, 0x44, 0xC0, + 0x21, 0x02, 0x18, 0x00, 0x28, 0x02, 0xFC, 0xFF, + 0x36, 0x13, 0x91, 0xC1, 0x86, 0xD1, 0x1F, 0x13, + 0xC6, 0x06, 0x87, 0x07, 0x0E, 0x07, 0xF7, 0xC0, + 0x46, 0x02, 0xFF, 0xBF, 0x43, 0x02, 0xFF, 0x3F, + 0xA0, 0x91, 0xF5, 0xED, 0x09, 0x16, 0xB0, 0x03, + 0x20, 0x98, 0x0E, 0xE0, 0x5D, 0x06, 0x0F, 0x16, + 0x21, 0xC8, 0x02, 0x00, 0x0C, 0x07, 0x17, 0x10, + 0x47, 0x82, 0x0C, 0x1B, 0xC6, 0x90, 0xEB, 0x16, + 0x47, 0x06, 0xF7, 0x04, 0xB0, 0x03, 0x20, 0x98, + 0x5D, 0x06, 0x57, 0x06, 0x0C, 0x13, 0x83, 0x07, + 0x05, 0x80, 0x1C, 0x10, 0xD1, 0xC0, 0xE0, 0x20, + 0x16, 0xE0, 0x03, 0x16, 0x83, 0x07, 0x08, 0x80, + 0x15, 0x10, 0x60, 0x44, 0x26, 0xE0, 0x86, 0x71, + 0x46, 0xA0, 0x06, 0x62, 0x83, 0x07, 0x05, 0x80, + 0x08, 0xC2, 0xCB, 0x15, 0x0B, 0x16, 0xC3, 0x04, + 0x87, 0x07, 0x0E, 0x07, 0x77, 0xC0, 0x47, 0x82, + 0x05, 0x1B, 0x60, 0x20, 0x06, 0xE0, 0xFA, 0x16, + 0x83, 0x07, 0x07, 0x80, 0x5C, 0x04, 0xA0, 0x92, + 0x0E, 0xE0, 0x11, 0x16, 0x20, 0xC8, 0x20, 0xE0, + 0x08, 0x07, 0xE0, 0x04, 0x84, 0x01, 0x60, 0x05, + 0x02, 0x07, 0x4B, 0x13, 0x20, 0x48, 0x06, 0xE0, + 0x82, 0x01, 0xA0, 0x06, 0xD0, 0xD4, 0x83, 0x07, + 0x00, 0xC0, 0xA0, 0x06, 0x2A, 0xD8, 0x20, 0xC8, + 0x1E, 0xE0, 0x02, 0x07, 0xA0, 0xE3, 0x04, 0xE0, + 0x08, 0x02, 0x24, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0x42, 0x10, 0x20, 0xC1, 0x84, 0x01, 0x44, 0x02, + 0x00, 0x88, 0x2A, 0x13, 0x04, 0x48, 0x84, 0x01, + 0x20, 0x06, 0x02, 0x07, 0xF1, 0x16, 0x60, 0x01, + 0x8E, 0x09, 0x00, 0x80, 0x15, 0x13, 0xA0, 0x23, + 0x22, 0xE0, 0x05, 0x16, 0xA0, 0x43, 0x22, 0xE0, + 0xA0, 0xD2, 0x0E, 0xE0, 0xCF, 0x10, 0xE0, 0x23, + 0x14, 0xE0, 0x04, 0x13, 0x20, 0x98, 0xA9, 0xE3, + 0x65, 0x06, 0x0C, 0x16, 0xA0, 0x92, 0x0E, 0xE0, + 0xC5, 0x13, 0xA0, 0xD2, 0xA8, 0xE3, 0xD3, 0x10, + 0x20, 0xC8, 0x20, 0xE0, 0x08, 0x07, 0x83, 0x07, + 0x00, 0xC0, 0x04, 0x10, 0x83, 0x07, 0x02, 0x00, + 0x60, 0x04, 0xCA, 0xCE, 0x60, 0x04, 0xC0, 0xCE, + 0x20, 0xE8, 0x06, 0xE0, 0x82, 0x01, 0xA0, 0x06, + 0xD0, 0xD4, 0x20, 0x07, 0x02, 0x07, 0xA0, 0x43, + 0x04, 0xE0, 0x20, 0xC8, 0xAE, 0xE4, 0x86, 0x01, + 0x20, 0x88, 0x20, 0xE0, 0x08, 0x07, 0x03, 0x16, + 0x20, 0xC8, 0x78, 0xEB, 0x08, 0x07, 0x60, 0x04, + 0xD2, 0xCE, 0x0E, 0x01, 0x03, 0x00, 0x16, 0x13, + 0xCF, 0xD3, 0x08, 0x16, 0xA0, 0x23, 0x20, 0xE0, + 0x03, 0x16, 0xA0, 0xD2, 0xA8, 0xE3, 0x02, 0x10, + 0xA0, 0xD2, 0x0E, 0xE0, 0x8E, 0x01, 0x03, 0x00, + 0x09, 0x10, 0x60, 0xC1, 0x84, 0x01, 0x60, 0x21, + 0x0A, 0xE0, 0x04, 0x16, 0x83, 0x07, 0x00, 0x84, + 0x60, 0x04, 0xCA, 0xCE, 0x20, 0xC8, 0x2E, 0xE0, + 0x84, 0x01, 0x08, 0x02, 0x06, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x60, 0x04, 0xD2, 0xCE, 0x60, 0xE3, + 0x20, 0xE0, 0x60, 0x04, 0xD2, 0xCE, 0xE0, 0x93, + 0x26, 0xE0, 0x10, 0x16, 0xA0, 0x23, 0x08, 0xE0, + 0x0D, 0x16, 0xA0, 0x23, 0x06, 0xE0, 0x02, 0x13, + 0x60, 0xE3, 0x1C, 0xE0, 0x60, 0xE3, 0x18, 0xE0, + 0xA0, 0x43, 0x06, 0xE0, 0x08, 0x02, 0x3C, 0x80, + 0xA0, 0x06, 0xDA, 0xD4, 0x60, 0x04, 0xD2, 0xCE, + 0xA0, 0x92, 0xA8, 0xE3, 0x03, 0x13, 0xA0, 0x92, + 0xA9, 0xE3, 0x1E, 0x16, 0xE0, 0x23, 0x14, 0xE0, + 0x08, 0x13, 0x20, 0x98, 0xA9, 0xE3, 0x65, 0x06, + 0x04, 0x13, 0x83, 0x07, 0x07, 0x00, 0x60, 0x04, + 0xCA, 0xCE, 0xA0, 0xD2, 0x0E, 0xE0, 0x20, 0xC8, + 0x20, 0xE0, 0x08, 0x07, 0xA0, 0x27, 0x04, 0xE0, + 0x0B, 0x16, 0x20, 0xC8, 0x1E, 0xE0, 0x08, 0x07, + 0xE0, 0x93, 0xA8, 0xE3, 0x05, 0x16, 0xA0, 0x23, + 0x12, 0xE0, 0x02, 0x13, 0x20, 0x06, 0x08, 0x07, + 0x60, 0x04, 0xD2, 0xCE, 0xE0, 0x23, 0x14, 0xE0, + 0x3E, 0x13, 0xB0, 0x03, 0x20, 0x98, 0x0E, 0xE0, + 0x6F, 0x06, 0x0F, 0x16, 0xCF, 0xD3, 0x37, 0x16, + 0xA0, 0xD2, 0xA8, 0xE3, 0x60, 0x04, 0xD2, 0xCE, + 0xA0, 0x92, 0x0C, 0xE0, 0x30, 0x16, 0xE0, 0x23, + 0x14, 0xE0, 0xF6, 0x13, 0x83, 0x07, 0x06, 0x00, + 0x07, 0x10, 0x83, 0x07, 0x05, 0x00, 0xE0, 0x93, + 0x0E, 0xE0, 0x02, 0x16, 0x83, 0x07, 0x07, 0x00, + 0x60, 0x04, 0xCA, 0xCE, 0x60, 0xE3, 0x12, 0xE0, + 0xE0, 0x23, 0x14, 0xE0, 0x11, 0x13, 0x20, 0x98, + 0x0C, 0xE0, 0x65, 0x06, 0x03, 0x16, 0x20, 0xD8, + 0xA9, 0xE3, 0x65, 0x06, 0x14, 0x10, 0x60, 0x01, + 0x8E, 0x09, 0x00, 0x80, 0x10, 0x13, 0x20, 0xC1, + 0x84, 0x01, 0x20, 0x21, 0x06, 0xE0, 0xD2, 0x16, + 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, 0x07, 0x13, + 0x20, 0x48, 0x06, 0xE0, 0x84, 0x01, 0x08, 0x02, + 0x30, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x60, 0x04, + 0xD2, 0xCE, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x20, + 0xFA, 0x16, 0x08, 0x02, 0x78, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x20, 0xC2, 0xA2, 0x09, 0x03, 0x13, + 0x20, 0x06, 0xA2, 0x09, 0x21, 0x13, 0x20, 0xC2, + 0xA4, 0x09, 0xED, 0x13, 0x20, 0x06, 0xA4, 0x09, + 0xEA, 0x16, 0xA0, 0x07, 0xA4, 0x09, 0x05, 0x00, + 0xCD, 0x01, 0x00, 0x04, 0xE4, 0x10, 0x60, 0x01, + 0x8E, 0x09, 0x80, 0x00, 0x3E, 0x13, 0x60, 0x01, + 0x8E, 0x09, 0x00, 0x10, 0x02, 0x16, 0xA0, 0x06, + 0xE6, 0xD5, 0xA0, 0x01, 0x8E, 0x09, 0x00, 0x10, + 0xE0, 0x01, 0x8E, 0x09, 0x80, 0x00, 0x83, 0x07, + 0x00, 0xA8, 0xA0, 0x06, 0x2A, 0xD8, 0x16, 0x10, + 0x60, 0x01, 0x8E, 0x09, 0x00, 0x04, 0x21, 0x13, + 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x10, 0xA0, 0x07, + 0x08, 0x07, 0x05, 0x00, 0x83, 0x07, 0x08, 0xA8, + 0xA0, 0x23, 0x04, 0xE0, 0x05, 0x16, 0x20, 0xC8, + 0x20, 0xE0, 0x08, 0x07, 0x83, 0x07, 0x08, 0xE8, + 0xA0, 0x06, 0x2A, 0xD8, 0xA0, 0x01, 0x8E, 0x09, + 0x00, 0x20, 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x01, + 0xE0, 0x01, 0x82, 0x01, 0x00, 0x08, 0xA0, 0xD2, + 0x0E, 0xE0, 0x83, 0x07, 0x10, 0x80, 0x60, 0x04, + 0xC0, 0xCE, 0x08, 0x02, 0x78, 0x00, 0xA0, 0x06, + 0xDA, 0xD4, 0x83, 0x07, 0x00, 0x82, 0x60, 0x04, + 0xCA, 0xCE, 0x60, 0x04, 0xD2, 0xCE, 0x20, 0x06, + 0x90, 0x09, 0x07, 0x15, 0xA0, 0xD2, 0x10, 0xE0, + 0xCA, 0x06, 0xA0, 0xD2, 0x26, 0xE0, 0xCF, 0x04, + 0xF4, 0x10, 0x08, 0x02, 0x7E, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x20, 0xC2, 0x90, 0x09, 0x88, 0x02, + 0x96, 0x00, 0x0D, 0x1B, 0xEA, 0x16, 0x20, 0x48, + 0x08, 0xE0, 0x82, 0x01, 0xA0, 0x01, 0x8E, 0x09, + 0x00, 0x10, 0xA0, 0x06, 0xE6, 0xD5, 0x83, 0x07, + 0x00, 0x28, 0x60, 0x04, 0xC0, 0xCE, 0x60, 0x01, + 0x8E, 0x09, 0x00, 0x10, 0xDA, 0x16, 0x84, 0x07, + 0x04, 0x00, 0x85, 0x07, 0xF4, 0x03, 0xF5, 0x04, + 0xB5, 0x07, 0x30, 0x06, 0xA0, 0x06, 0xA2, 0xD8, + 0xA0, 0x07, 0xF8, 0x03, 0x34, 0xD4, 0x60, 0x04, + 0xC0, 0xDB, 0xA0, 0x07, 0x90, 0x09, 0xF4, 0x01, + 0x08, 0x02, 0x7E, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0x08, 0x02, 0x36, 0x00, 0xA0, 0x06, 0xDA, 0xD4, + 0x20, 0xE8, 0x0C, 0xE0, 0x82, 0x01, 0xA0, 0x23, + 0x18, 0xE0, 0x06, 0x13, 0xA0, 0xE3, 0x18, 0xE0, + 0xE0, 0x2E, 0x00, 0x00, 0x41, 0xC0, 0xFA, 0x16, + 0xA0, 0x06, 0xE6, 0xD5, 0xB2, 0x10, 0x04, 0x02, + 0x64, 0x00, 0x04, 0x06, 0xFE, 0x16, 0x5B, 0x04, + 0xA0, 0xE3, 0x0A, 0xE0, 0x08, 0xC2, 0x02, 0x11, + 0xA0, 0x43, 0x0A, 0xE0, 0x20, 0x42, 0x04, 0xE0, + 0x28, 0x02, 0xFC, 0xE3, 0x58, 0xC0, 0x02, 0xC0, + 0x11, 0x88, 0xCE, 0xED, 0x03, 0x16, 0xD1, 0x2C, + 0x58, 0xC0, 0xD1, 0x04, 0x80, 0xC0, 0x0E, 0x01, + 0x00, 0x10, 0x0F, 0x13, 0x60, 0xCC, 0xCE, 0xED, + 0xC8, 0x05, 0x78, 0xCC, 0x03, 0x16, 0x41, 0x06, + 0x60, 0xCC, 0xD6, 0x06, 0x58, 0xC4, 0x02, 0x16, + 0x60, 0xC4, 0x00, 0x07, 0x21, 0x02, 0xFA, 0xFF, + 0x91, 0x2C, 0x5B, 0x04, 0x0B, 0xC3, 0xA0, 0x06, + 0xC2, 0xD5, 0xA0, 0x06, 0x9C, 0xD5, 0x08, 0xC2, + 0x05, 0x16, 0x62, 0xC2, 0x02, 0x00, 0x60, 0x26, + 0xA8, 0xE4, 0x0D, 0x16, 0x42, 0xC2, 0xC9, 0x05, + 0x60, 0xCE, 0xF2, 0xED, 0x60, 0xC6, 0x7C, 0xEB, + 0xA0, 0x06, 0x10, 0xD6, 0x18, 0xCA, 0x0A, 0x00, + 0x20, 0x46, 0x26, 0xE0, 0x04, 0x16, 0xA0, 0xC0, + 0x6C, 0x01, 0x12, 0x2E, 0x1D, 0x10, 0x12, 0xC1, + 0x05, 0x13, 0x60, 0xC1, 0x6C, 0x01, 0x14, 0x2E, + 0x05, 0xC8, 0x6C, 0x01, 0xD2, 0x04, 0x48, 0x06, + 0x84, 0x07, 0x02, 0x00, 0x48, 0xC1, 0xA0, 0xC0, + 0x6C, 0x01, 0x02, 0xC0, 0xA0, 0x06, 0xA2, 0xD8, + 0x60, 0xC5, 0x02, 0xFC, 0x07, 0x02, 0xA2, 0x06, + 0x25, 0x02, 0xF4, 0xFF, 0x05, 0xC8, 0x02, 0xFC, + 0x20, 0xC2, 0x6C, 0x01, 0xA0, 0x06, 0xFC, 0xB4, + 0x5C, 0x04, 0x42, 0xC2, 0x29, 0x02, 0x08, 0x00, + 0x39, 0xC2, 0x48, 0x02, 0x00, 0xC0, 0x88, 0x02, + 0x00, 0xC0, 0x08, 0x16, 0x60, 0x8E, 0x2E, 0xE0, + 0x05, 0x16, 0x60, 0x86, 0x2E, 0xE0, 0x02, 0x16, + 0xC8, 0x04, 0x5B, 0x04, 0x08, 0x07, 0x5B, 0x04, + 0x20, 0x88, 0x8E, 0xE1, 0x6C, 0x01, 0x02, 0x16, + 0x60, 0x04, 0xBA, 0xCE, 0x5B, 0x04, 0x88, 0x07, + 0xAE, 0x01, 0x20, 0xE8, 0x0E, 0xE0, 0x80, 0x01, + 0x08, 0x06, 0xFE, 0x16, 0x20, 0x48, 0x0E, 0xE0, + 0x80, 0x01, 0x5B, 0x04, 0xC2, 0x04, 0xA0, 0x23, + 0x0C, 0xE0, 0x10, 0x16, 0x20, 0x2F, 0x30, 0x06, + 0x82, 0x07, 0xDF, 0xFF, 0x02, 0x2C, 0x82, 0x02, + 0xF4, 0x03, 0x06, 0x13, 0xE2, 0x04, 0x02, 0x00, + 0xA2, 0xC0, 0x06, 0x00, 0x12, 0x2E, 0xF4, 0x10, + 0xA0, 0x43, 0x0C, 0xE0, 0x5B, 0x04, 0x42, 0xC2, + 0x88, 0x07, 0x0E, 0x00, 0x09, 0xA2, 0x29, 0x02, + 0x08, 0x00, 0x78, 0xCE, 0x78, 0xCE, 0x78, 0xCE, + 0x60, 0xCE, 0x6C, 0x09, 0x60, 0xCE, 0x6E, 0x09, + 0x60, 0xCE, 0x70, 0x09, 0xA0, 0x23, 0x1A, 0xE0, + 0x0F, 0x16, 0x58, 0xC2, 0x49, 0x02, 0x80, 0x1F, + 0x60, 0x2A, 0x14, 0xE0, 0xA0, 0xE8, 0x04, 0xE0, + 0x0E, 0x00, 0x09, 0xC6, 0x49, 0x02, 0x00, 0x1F, + 0xC9, 0x06, 0x09, 0xA2, 0x89, 0xA8, 0x04, 0x00, + 0x28, 0x02, 0x02, 0x00, 0x58, 0xC2, 0x49, 0x0A, + 0x49, 0x02, 0x00, 0xF0, 0x09, 0xD6, 0xE2, 0x04, + 0x06, 0x00, 0x5B, 0x04, 0x00, 0x07, 0x82, 0xC0, + 0x53, 0x13, 0xA0, 0xC0, 0x6C, 0x01, 0xA0, 0xC1, + 0x06, 0xFC, 0x46, 0x02, 0x0F, 0x00, 0x86, 0x02, + 0x01, 0x00, 0x3D, 0x12, 0x06, 0x88, 0xF2, 0x06, + 0x12, 0x16, 0x01, 0x02, 0x0E, 0xFC, 0x31, 0x88, + 0xF4, 0x06, 0x0D, 0x16, 0x31, 0x88, 0xF6, 0x06, + 0x0A, 0x16, 0x31, 0x88, 0xF8, 0x06, 0x07, 0x16, + 0x86, 0x02, 0x02, 0x00, 0x2C, 0x16, 0x20, 0x88, + 0x0A, 0x07, 0xFA, 0x06, 0x28, 0x13, 0x20, 0xC1, + 0x6A, 0x09, 0x44, 0x01, 0x00, 0x08, 0x06, 0x13, + 0x86, 0x02, 0x02, 0x00, 0x20, 0x16, 0x44, 0x01, + 0x80, 0x00, 0x1D, 0x16, 0x00, 0x07, 0xE0, 0x23, + 0x14, 0xE0, 0x19, 0x16, 0x82, 0x02, 0x43, 0x00, + 0x16, 0x13, 0x00, 0x02, 0x02, 0xFC, 0x40, 0xC0, + 0xB0, 0x01, 0x20, 0x00, 0x60, 0x01, 0x6A, 0x09, + 0x01, 0x00, 0x07, 0x16, 0x60, 0xA0, 0x2C, 0x09, + 0x60, 0xCC, 0xEE, 0x05, 0x50, 0xC4, 0x20, 0xC4, + 0x2C, 0x09, 0x80, 0x07, 0x36, 0x07, 0x81, 0x07, + 0x40, 0x00, 0x40, 0x2C, 0xC0, 0x04, 0x84, 0x07, + 0xF2, 0x06, 0x06, 0xCD, 0x01, 0x02, 0x0E, 0xFC, + 0x31, 0xCD, 0x31, 0xCD, 0x31, 0xCD, 0x20, 0xC5, + 0x0A, 0x07, 0x00, 0xC0, 0x01, 0x13, 0x12, 0x2E, + 0xE0, 0x04, 0x6C, 0x01, 0x5B, 0x04, 0x60, 0x01, + 0x8A, 0x09, 0x00, 0x80, 0x12, 0x13, 0x0B, 0xC8, + 0x22, 0x09, 0xA0, 0x06, 0x3E, 0xD7, 0x08, 0x02, + 0x42, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x08, 0x02, + 0x30, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xE0, 0xC2, + 0x22, 0x09, 0x5B, 0x04, 0x20, 0x48, 0xAC, 0xE4, + 0x80, 0x01, 0x20, 0x48, 0x7E, 0xEB, 0x82, 0x01, + 0x20, 0x48, 0x22, 0xE0, 0xAE, 0x01, 0x20, 0x48, + 0x22, 0xE0, 0x78, 0x09, 0x60, 0x43, 0x18, 0xE0, + 0xA0, 0x43, 0x08, 0xE0, 0x60, 0x01, 0x8A, 0x09, + 0x00, 0x80, 0xEB, 0x13, 0x0B, 0xC3, 0x08, 0x02, + 0x42, 0x00, 0xA0, 0x06, 0xDA, 0xD4, 0x5C, 0x04, + 0x0B, 0xC3, 0x20, 0xE8, 0x0E, 0xE0, 0x82, 0x01, + 0x20, 0xE8, 0x22, 0xE0, 0xAE, 0x01, 0x20, 0xE8, + 0x22, 0xE0, 0x78, 0x09, 0xA0, 0xE3, 0x08, 0xE0, + 0x60, 0xE3, 0x18, 0xE0, 0xA0, 0x43, 0x06, 0xE0, + 0x08, 0x02, 0x3C, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0x08, 0x02, 0x42, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0x5C, 0x04, 0x0B, 0xC3, 0x83, 0x07, 0x00, 0x68, + 0xA0, 0x06, 0x2A, 0xD8, 0x83, 0x07, 0x10, 0x80, + 0xA0, 0x06, 0x2A, 0xD8, 0x5C, 0x04, 0x0B, 0xC3, + 0xA0, 0x06, 0x14, 0xD8, 0x02, 0xA2, 0x68, 0xC2, + 0x14, 0x00, 0x29, 0x02, 0xFC, 0xFF, 0x24, 0x13, + 0x28, 0x02, 0x18, 0x00, 0x87, 0x07, 0x0E, 0x00, + 0x81, 0x07, 0x0E, 0x07, 0xF1, 0x04, 0x47, 0x06, + 0xFD, 0x15, 0x58, 0xC0, 0xB0, 0x03, 0x01, 0x78, + 0x63, 0x06, 0x41, 0x02, 0x3F, 0x00, 0x0E, 0x13, + 0x81, 0x02, 0x1F, 0x00, 0x0B, 0x1B, 0x41, 0xA0, + 0x61, 0xC0, 0x86, 0xE4, 0xF8, 0xC1, 0xC7, 0x06, + 0xC7, 0x71, 0x47, 0x06, 0x78, 0xCC, 0x47, 0x06, + 0xFD, 0x15, 0x04, 0x10, 0x58, 0xC0, 0xC1, 0x06, + 0x41, 0x70, 0x01, 0xA2, 0x49, 0xC2, 0xE5, 0x15, + 0x5C, 0x04, 0xA0, 0x23, 0x1A, 0xE0, 0x02, 0x13, + 0xC8, 0x04, 0x5B, 0x04, 0x22, 0xC2, 0x14, 0x00, + 0x48, 0x02, 0x00, 0x1F, 0xC8, 0x06, 0x5B, 0x04, + 0x83, 0x02, 0x0F, 0x00, 0x17, 0x1B, 0xA0, 0xC1, + 0xD4, 0x06, 0x35, 0x13, 0x26, 0x02, 0x04, 0x00, + 0xA0, 0xCD, 0xCE, 0xED, 0x83, 0xC5, 0x04, 0x13, + 0x4A, 0xC2, 0x39, 0x0A, 0xC9, 0xE0, 0x83, 0xC5, + 0x86, 0x07, 0x36, 0x07, 0x87, 0x07, 0x10, 0x00, + 0x20, 0xC2, 0xD4, 0x06, 0xE0, 0x04, 0xD4, 0x06, + 0x46, 0x2C, 0x5B, 0x04, 0x60, 0xC0, 0xFE, 0x06, + 0x20, 0xC2, 0x6A, 0x09, 0x48, 0x02, 0x00, 0x60, + 0x20, 0x22, 0x06, 0xE0, 0x04, 0x16, 0x20, 0xE2, + 0x0A, 0xE0, 0x20, 0xE2, 0x18, 0xE0, 0x13, 0x0A, + 0x04, 0x18, 0x41, 0x05, 0x03, 0x48, 0xFE, 0x06, + 0x06, 0x10, 0x83, 0x02, 0x02, 0x00, 0x01, 0x16, + 0x13, 0x09, 0x03, 0xE8, 0xFE, 0x06, 0xC8, 0x40, + 0xC1, 0x40, 0x05, 0x13, 0x88, 0x07, 0x36, 0x07, + 0x89, 0x07, 0x00, 0x40, 0x48, 0x2C, 0x5B, 0x04, + 0xC9, 0x04, 0x24, 0xC1, 0x94, 0xEB, 0x84, 0xC1, + 0x86, 0x71, 0x86, 0xA1, 0x26, 0x02, 0x56, 0xEC, + 0xC4, 0x06, 0x04, 0x71, 0x24, 0x02, 0xC2, 0xEB, + 0x14, 0xD2, 0xC8, 0x09, 0x08, 0xA2, 0xB0, 0x03, + 0x34, 0xD8, 0x5F, 0x06, 0x47, 0x02, 0x0F, 0x00, + 0xC7, 0xA1, 0x28, 0xC2, 0x82, 0xEB, 0x58, 0x04, + 0x76, 0xCD, 0x47, 0x06, 0xFD, 0x16, 0x32, 0x10, + 0x36, 0xC2, 0x26, 0x10, 0x17, 0x09, 0x47, 0xA1, + 0x2D, 0x10, 0x17, 0x09, 0x47, 0x61, 0x2A, 0x10, + 0xA0, 0x43, 0x16, 0xE0, 0x5B, 0x04, 0xA0, 0x43, + 0x16, 0xE0, 0x49, 0xC2, 0x03, 0x16, 0x44, 0xC2, + 0x06, 0xC8, 0x22, 0x09, 0x27, 0xC1, 0x8E, 0xED, + 0x84, 0xC1, 0x86, 0x71, 0x26, 0x02, 0xC4, 0xED, + 0xC4, 0x06, 0x04, 0x71, 0x24, 0x02, 0xAA, 0xED, + 0xD3, 0x10, 0x09, 0xC1, 0xA0, 0xC1, 0x22, 0x09, + 0xC9, 0x04, 0x10, 0x10, 0x36, 0xC2, 0x78, 0xD5, + 0x60, 0x41, 0x22, 0xE0, 0xC5, 0x05, 0x0A, 0x10, + 0x78, 0xCD, 0x47, 0x06, 0xFD, 0x15, 0x06, 0x10, + 0xA0, 0x23, 0x16, 0xE0, 0xCD, 0x16, 0x49, 0xC2, + 0xEC, 0x16, 0xD6, 0x10, 0xA0, 0xE3, 0x16, 0xE0, + 0xBB, 0x10, 0x08, 0x02, 0x5A, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x44, 0x10, 0xA0, 0x92, 0x0C, 0xE0, + 0x15, 0x16, 0x44, 0x02, 0x00, 0x5E, 0x14, 0x16, + 0x20, 0x48, 0xAC, 0xE4, 0x80, 0x01, 0xA0, 0x06, + 0x72, 0xD7, 0x20, 0xC8, 0x9E, 0x01, 0x9E, 0x01, + 0xE0, 0x2E, 0x01, 0x00, 0xA0, 0x43, 0x18, 0xE0, + 0xA0, 0xD2, 0x26, 0xE0, 0x83, 0x07, 0x10, 0x00, + 0xA0, 0x06, 0x2A, 0xD8, 0x60, 0x04, 0xD2, 0xCE, + 0x84, 0x07, 0x08, 0x00, 0x60, 0x04, 0x94, 0xCE, + 0x85, 0x07, 0x03, 0x02, 0x05, 0xC8, 0xCE, 0x06, + 0xA0, 0x43, 0x12, 0xE0, 0xE0, 0x04, 0xFA, 0x06, + 0xA0, 0x06, 0xA4, 0xD7, 0x08, 0x02, 0x48, 0x80, + 0xA0, 0x06, 0xDA, 0xD4, 0x17, 0x10, 0x60, 0x01, + 0x8E, 0x09, 0x00, 0x80, 0x02, 0x16, 0x60, 0x04, + 0x9C, 0xD4, 0xA0, 0x27, 0x2C, 0xE0, 0x04, 0x16, + 0x08, 0x02, 0x54, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0x83, 0x07, 0x00, 0xA8, 0x20, 0x88, 0x08, 0x07, + 0x20, 0xE0, 0x02, 0x16, 0x83, 0x07, 0x00, 0xE8, + 0xA0, 0x06, 0x2A, 0xD8, 0x08, 0x02, 0x36, 0x00, + 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xE8, 0x0C, 0xE0, + 0x82, 0x01, 0xA0, 0x23, 0x18, 0xE0, 0x06, 0x13, + 0xA0, 0xE3, 0x18, 0xE0, 0xE0, 0x2E, 0x00, 0x00, + 0x41, 0xC0, 0xFA, 0x16, 0xA0, 0x06, 0xE6, 0xD5, + 0x82, 0xC0, 0x02, 0x13, 0x4F, 0x02, 0x80, 0xFF, + 0xC4, 0x04, 0x0F, 0xD1, 0xC4, 0x06, 0x60, 0x04, + 0x94, 0xCE, 0xA0, 0x06, 0x32, 0xDA, 0x08, 0x02, + 0x36, 0x80, 0xA0, 0x07, 0xD6, 0x06, 0x20, 0xDA, + 0xA0, 0x06, 0xDA, 0xD4, 0x10, 0x10, 0xA0, 0x06, + 0x32, 0xDA, 0x20, 0xD1, 0xCE, 0x06, 0xE6, 0x13, + 0x20, 0x78, 0x12, 0xE0, 0xCE, 0x06, 0xE2, 0x10, + 0x20, 0xC1, 0x16, 0x04, 0x14, 0x0A, 0xC4, 0x06, + 0x0A, 0x91, 0x01, 0x16, 0x5B, 0x04, 0x60, 0x04, + 0xD2, 0xCE, 0xB0, 0x03, 0x20, 0x98, 0xAB, 0xE3, + 0x65, 0x06, 0x02, 0x13, 0x60, 0x04, 0xBA, 0xCE, + 0x60, 0xC1, 0x94, 0x09, 0x02, 0x13, 0x60, 0x04, + 0x22, 0xDE, 0x60, 0xD1, 0x0E, 0xE0, 0x3D, 0x10, + 0x85, 0x07, 0xBE, 0xEA, 0x35, 0xC8, 0x8A, 0x09, + 0x15, 0xC8, 0x8C, 0x09, 0x0B, 0x10, 0xE0, 0x04, + 0xA0, 0x09, 0x20, 0xD8, 0x2E, 0x09, 0xA6, 0x09, + 0x20, 0xC8, 0xA8, 0x09, 0x8A, 0x09, 0x20, 0xC8, + 0xAA, 0x09, 0x8C, 0x09, 0xE0, 0x04, 0x8E, 0x09, + 0xCA, 0x04, 0xCD, 0x04, 0xCE, 0x04, 0xCF, 0x04, + 0xE0, 0x04, 0xA8, 0x06, 0xE0, 0x04, 0xBA, 0x06, + 0x84, 0x07, 0xA0, 0x01, 0x85, 0x07, 0x10, 0x00, + 0xF4, 0x04, 0x45, 0x06, 0xFD, 0x15, 0x84, 0x07, + 0xD8, 0x06, 0x85, 0x07, 0x34, 0x07, 0x44, 0x61, + 0xF4, 0x04, 0x45, 0x06, 0xFD, 0x15, 0x84, 0x07, + 0xC8, 0x00, 0x04, 0xC8, 0x00, 0x07, 0x84, 0x07, + 0xFF, 0x7F, 0x04, 0xC8, 0xF0, 0x06, 0x84, 0x07, + 0x06, 0x00, 0x04, 0xC8, 0xEE, 0x06, 0x85, 0x07, + 0x02, 0x0C, 0x20, 0xC1, 0x8A, 0x09, 0x01, 0x11, + 0xC5, 0x06, 0xB0, 0x03, 0x05, 0xD8, 0x65, 0x06, + 0x60, 0x04, 0xD2, 0xCE, 0xB0, 0x03, 0x20, 0x98, + 0xAA, 0xE3, 0x65, 0x06, 0x79, 0x16, 0x60, 0xD1, + 0x10, 0xE0, 0xF3, 0x10, 0x60, 0xD1, 0xAB, 0xE3, + 0xA0, 0x01, 0x8E, 0x09, 0x00, 0x02, 0xE0, 0x01, + 0x80, 0x01, 0x00, 0x20, 0xC8, 0x04, 0x20, 0xD2, + 0x80, 0x01, 0x08, 0xC8, 0x9C, 0x09, 0x08, 0xD8, + 0x2E, 0x09, 0xE3, 0x10, 0x20, 0xF8, 0x19, 0xEE, + 0x82, 0x01, 0x20, 0xC8, 0x10, 0xE0, 0xC6, 0x06, + 0x20, 0xC8, 0x20, 0xE0, 0xC8, 0x06, 0x20, 0xC8, + 0xC2, 0xEA, 0x90, 0x09, 0xE0, 0x2E, 0x00, 0x00, + 0xA0, 0x06, 0xE6, 0xD5, 0x20, 0xC8, 0x6C, 0x09, + 0xA0, 0x01, 0x20, 0xC8, 0x6E, 0x09, 0xA2, 0x01, + 0x20, 0xC8, 0x70, 0x09, 0xA4, 0x01, 0x20, 0xC8, + 0x6E, 0x09, 0xB0, 0x01, 0x20, 0xC8, 0x70, 0x09, + 0xB2, 0x01, 0x20, 0xC8, 0x70, 0x09, 0xCC, 0x06, + 0x20, 0xF8, 0x18, 0xEE, 0x80, 0x01, 0xB0, 0x03, + 0xA0, 0x01, 0x8E, 0x09, 0x00, 0x02, 0x20, 0x98, + 0xAA, 0xE3, 0x65, 0x06, 0x3A, 0x13, 0xE0, 0x01, + 0x8E, 0x09, 0x00, 0x02, 0x88, 0x07, 0x56, 0xDF, + 0xE0, 0xC2, 0x8A, 0x09, 0x05, 0x11, 0xA0, 0x01, + 0x8E, 0x09, 0x00, 0x02, 0x88, 0x07, 0x9A, 0xDF, + 0x98, 0x06, 0x08, 0x02, 0x12, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x84, 0x07, 0x0A, 0x00, 0x85, 0x07, + 0xF4, 0x03, 0x20, 0x88, 0xC6, 0x06, 0x20, 0xE0, + 0x08, 0x1B, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, + 0xA5, 0x13, 0x84, 0x07, 0x1C, 0x00, 0x85, 0x07, + 0xF8, 0x03, 0xA0, 0x06, 0xA2, 0xD8, 0x85, 0x07, + 0x42, 0xDC, 0x05, 0xC8, 0xF8, 0x03, 0x20, 0xC8, + 0xA0, 0x09, 0xA0, 0x09, 0x6C, 0x16, 0x20, 0xE8, + 0x9C, 0x09, 0xFE, 0x03, 0x20, 0xE8, 0x9E, 0x09, + 0x06, 0x04, 0xA0, 0x23, 0x0C, 0xE0, 0x32, 0x13, + 0xA0, 0xE3, 0x0C, 0xE0, 0xA0, 0x2E, 0xF4, 0x03, + 0x2D, 0x10, 0xA0, 0x06, 0x56, 0xDF, 0x60, 0x01, + 0x8E, 0x09, 0x00, 0x40, 0x08, 0x13, 0x08, 0x02, + 0x6C, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x22, 0x10, + 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x40, 0x08, 0x02, + 0x60, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x84, 0x07, + 0x2A, 0x00, 0x85, 0x07, 0xF4, 0x03, 0xA0, 0x06, + 0xA2, 0xD8, 0xD5, 0x10, 0xB0, 0x03, 0x20, 0x98, + 0xAA, 0xE3, 0x65, 0x06, 0x0F, 0x16, 0x20, 0x06, + 0x90, 0x09, 0x9A, 0x16, 0x60, 0x01, 0x8A, 0x09, + 0x00, 0x40, 0x39, 0x13, 0xE0, 0x04, 0x8A, 0x09, + 0xE0, 0x04, 0x8C, 0x09, 0xE0, 0x04, 0x8E, 0x09, + 0x60, 0x04, 0x62, 0xDA, 0x60, 0x04, 0xB0, 0xCE, + 0xB0, 0x03, 0x20, 0x98, 0x10, 0xE0, 0x65, 0x06, + 0xF9, 0x16, 0x44, 0x02, 0x00, 0x5E, 0x04, 0x16, + 0x20, 0x06, 0xC6, 0x06, 0x9A, 0x16, 0x0A, 0x10, + 0xB0, 0x03, 0x20, 0x98, 0x10, 0xE0, 0x65, 0x06, + 0xED, 0x16, 0x20, 0x06, 0xC8, 0x06, 0x02, 0x13, + 0x60, 0x04, 0x5A, 0xDB, 0x60, 0x01, 0x8E, 0x09, + 0x00, 0x01, 0x02, 0x16, 0xCE, 0x01, 0x03, 0x00, + 0x0E, 0x01, 0x03, 0x00, 0x03, 0x13, 0x83, 0x07, + 0x00, 0x82, 0x07, 0x10, 0x83, 0x07, 0x01, 0x00, + 0xE0, 0x04, 0x8E, 0x09, 0x20, 0xE8, 0x0C, 0xE0, + 0x82, 0x01, 0x60, 0x04, 0xCA, 0xCE, 0x60, 0x01, + 0x8A, 0x09, 0x00, 0x40, 0xC7, 0x16, 0x83, 0x07, + 0x0D, 0x00, 0xF2, 0x10, 0xB0, 0x03, 0x20, 0x98, + 0xAA, 0xE3, 0x65, 0x06, 0xC7, 0x16, 0x20, 0x88, + 0x98, 0x09, 0x20, 0xE0, 0xF0, 0x16, 0x22, 0xC8, + 0x0E, 0x00, 0xDC, 0x06, 0x22, 0xC8, 0x10, 0x00, + 0xDE, 0x06, 0x22, 0xC8, 0x12, 0x00, 0xE0, 0x06, + 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x80, 0x08, 0x02, + 0x66, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xB2, 0x10, + 0xA0, 0x07, 0x9A, 0x09, 0x5A, 0x00, 0xA0, 0x07, + 0xA2, 0x09, 0x19, 0x00, 0xA0, 0x07, 0xA4, 0x09, + 0x05, 0x00, 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x20, + 0xE0, 0x01, 0x8E, 0x09, 0x00, 0x04, 0x08, 0x02, + 0x78, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xB0, 0x03, + 0x20, 0x98, 0xAB, 0xE3, 0x65, 0x06, 0x9A, 0x16, + 0x08, 0x02, 0x72, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0x20, 0xE8, 0x0C, 0xE0, 0x82, 0x01, 0xA0, 0x06, + 0xD0, 0xD5, 0x20, 0x06, 0x9A, 0x09, 0xBF, 0x13, + 0x84, 0x07, 0x2C, 0x00, 0x85, 0x07, 0xF4, 0x03, + 0xA0, 0x06, 0xA2, 0xD8, 0x60, 0x04, 0xC0, 0xDB, + 0x20, 0x48, 0x0C, 0xE0, 0x82, 0x01, 0x82, 0x10, + 0x0E, 0x01, 0x03, 0x00, 0x0A, 0x13, 0x08, 0x02, + 0x0C, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0xE0, 0xE3, + 0x14, 0xE0, 0x20, 0xC8, 0xAE, 0xE4, 0x86, 0x01, + 0x26, 0x10, 0x20, 0x48, 0x0C, 0xE0, 0x82, 0x01, + 0xE0, 0x2E, 0x01, 0x00, 0x60, 0xC1, 0x1E, 0x09, + 0x35, 0x0A, 0x05, 0xE8, 0x82, 0x01, 0x20, 0xC1, + 0x6A, 0x09, 0x04, 0x01, 0x06, 0x00, 0x06, 0x13, + 0x20, 0xD8, 0xD0, 0xE1, 0x2F, 0x09, 0x20, 0xD8, + 0xD0, 0xE1, 0x83, 0x01, 0x20, 0x21, 0x22, 0xE0, + 0x03, 0x16, 0x20, 0xE8, 0x22, 0xE0, 0x80, 0x01, + 0x20, 0x21, 0x04, 0xE0, 0x04, 0x16, 0xA0, 0xE3, + 0x14, 0xE0, 0x60, 0x04, 0x0A, 0xD3, 0x08, 0x02, + 0x00, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xE8, + 0x08, 0xE0, 0x82, 0x01, 0xE0, 0xC2, 0x8A, 0x09, + 0x02, 0x11, 0x60, 0x04, 0xB0, 0xCE, 0xA0, 0x01, + 0x8E, 0x09, 0x00, 0x04, 0x6B, 0x10, 0x20, 0xC8, + 0xAE, 0xE4, 0x86, 0x01, 0x08, 0x02, 0x00, 0x80, + 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xC2, 0x1E, 0x09, + 0x08, 0xA2, 0x08, 0x05, 0x28, 0xC8, 0x22, 0xE0, + 0xCA, 0x06, 0x20, 0xC8, 0x20, 0xE0, 0xC6, 0x06, + 0x20, 0xC8, 0x20, 0xE0, 0xC8, 0x06, 0x60, 0xE3, + 0x16, 0xE0, 0x60, 0x04, 0xD2, 0xCE, 0x44, 0xC1, + 0x44, 0x02, 0x00, 0x5E, 0xF8, 0x16, 0x60, 0x25, + 0xA8, 0xE4, 0x0F, 0x16, 0x20, 0x06, 0xC6, 0x06, + 0xF2, 0x16, 0x20, 0x06, 0xCA, 0x06, 0x03, 0x13, + 0xA0, 0x05, 0xCC, 0x06, 0xE6, 0x10, 0xB0, 0x03, + 0x20, 0xD8, 0x0C, 0xE0, 0x65, 0x06, 0x60, 0x04, + 0xD2, 0xCE, 0x20, 0x06, 0xC8, 0x06, 0xE3, 0x16, + 0x20, 0x88, 0x70, 0x09, 0xCC, 0x06, 0x03, 0x16, + 0x83, 0x07, 0x08, 0x00, 0x02, 0x10, 0x83, 0x07, + 0x0C, 0x00, 0x60, 0x04, 0x8A, 0xDC, 0x60, 0x04, + 0xD2, 0xCE, 0xA0, 0x23, 0x08, 0xE0, 0x03, 0x13, + 0x60, 0x23, 0x12, 0xE0, 0x06, 0x16, 0xB0, 0x03, + 0x20, 0xD8, 0xA9, 0xE3, 0x65, 0x06, 0x60, 0x04, + 0xD2, 0xCE, 0x08, 0x02, 0x00, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x60, 0x04, 0xB0, 0xCE, 0x08, 0x02, + 0x00, 0x80, 0xA0, 0x06, 0xDA, 0xD4, 0x20, 0xC8, + 0x1E, 0xE0, 0xC6, 0x06, 0x20, 0xC8, 0x1E, 0xE0, + 0xC8, 0x06, 0x60, 0xE3, 0x10, 0xE0, 0x60, 0x04, + 0xD2, 0xCE, 0xE0, 0x23, 0x14, 0xE0, 0x30, 0x13, + 0x44, 0xC1, 0x44, 0x02, 0x00, 0x1E, 0xF5, 0x16, + 0x60, 0x25, 0xA8, 0xE4, 0x1D, 0x16, 0x20, 0x06, + 0xC8, 0x06, 0xEF, 0x16, 0x60, 0x01, 0x8E, 0x09, + 0x00, 0x80, 0x13, 0x16, 0x60, 0x01, 0x8E, 0x09, + 0x00, 0x01, 0x0C, 0x16, 0xA0, 0x01, 0x8E, 0x09, + 0x00, 0x01, 0xA0, 0x01, 0x8E, 0x09, 0x80, 0x00, + 0xA0, 0x43, 0x04, 0xE0, 0x83, 0x07, 0x18, 0x68, + 0xA0, 0x06, 0x2A, 0xD8, 0x20, 0xC8, 0xAE, 0xE4, + 0x86, 0x01, 0xC2, 0x04, 0x60, 0x04, 0x2C, 0xE4, + 0x08, 0x02, 0x1E, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0x07, 0x10, 0x20, 0x06, 0xC6, 0x06, 0xCD, 0x16, + 0x83, 0x07, 0x09, 0x00, 0xA0, 0x06, 0x8A, 0xDC, + 0x60, 0x04, 0xB0, 0xCE, 0xCE, 0x04, 0xE0, 0x04, + 0x2A, 0x09, 0xE0, 0xD3, 0xAA, 0xE3, 0x8F, 0xC2, + 0x20, 0xC8, 0xB0, 0xE4, 0x86, 0x01, 0x20, 0x48, + 0x08, 0xE0, 0x82, 0x01, 0x86, 0x07, 0x05, 0x00, + 0x84, 0x07, 0x72, 0x06, 0x54, 0xC1, 0x01, 0x13, + 0xD4, 0x2C, 0x24, 0x02, 0x0A, 0x00, 0x06, 0x06, + 0xF9, 0x16, 0x08, 0x02, 0x2A, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x20, 0x2C, 0x1A, 0xE0, 0x60, 0x04, + 0x50, 0xCD, 0xA0, 0x06, 0x3E, 0xD7, 0xCD, 0x04, + 0xA0, 0x23, 0x1C, 0xE0, 0x0D, 0x13, 0x0E, 0x01, + 0x03, 0x00, 0x0A, 0x13, 0xA0, 0xE3, 0x1C, 0xE0, + 0xB0, 0x03, 0x20, 0xD8, 0x10, 0xE0, 0x65, 0x06, + 0xA0, 0xD2, 0x26, 0xE0, 0xCF, 0x04, 0x08, 0x10, + 0x20, 0x2D, 0x01, 0x00, 0xE0, 0xC0, 0x2A, 0x09, + 0xA0, 0x06, 0x2A, 0xD8, 0xA0, 0xD2, 0xAB, 0xE3, + 0x60, 0x04, 0xD2, 0xCE, 0xA0, 0x01, 0x80, 0x01, + 0x00, 0x01, 0xE0, 0x01, 0x80, 0x01, 0x00, 0xAC, + 0xA0, 0x01, 0x82, 0x01, 0x00, 0x03, 0xE0, 0x01, + 0x82, 0x01, 0x00, 0x08, 0x88, 0x07, 0xAE, 0x01, + 0x08, 0x06, 0xFE, 0x16, 0x60, 0x01, 0x8E, 0x09, + 0x00, 0x02, 0x03, 0x16, 0xA0, 0x01, 0x80, 0x01, + 0x00, 0x20, 0xC8, 0x04, 0x20, 0xD2, 0x80, 0x01, + 0x08, 0xC8, 0x9C, 0x09, 0x08, 0xD8, 0x2E, 0x09, + 0xA0, 0x07, 0x9E, 0x09, 0x00, 0x10, 0x5B, 0x04, + 0x20, 0xD8, 0xA6, 0x09, 0x2E, 0x09, 0xE0, 0x01, + 0x80, 0x01, 0x00, 0x04, 0xE0, 0x01, 0x82, 0x01, + 0x00, 0x08, 0xA0, 0x01, 0x82, 0x01, 0x00, 0x03, + 0x20, 0xC2, 0x30, 0x09, 0x03, 0x13, 0xE0, 0x01, + 0x82, 0x01, 0x00, 0x03, 0xA0, 0x01, 0x80, 0x01, + 0x00, 0xA1, 0x20, 0xF8, 0x2E, 0x09, 0x80, 0x01, + 0x88, 0x07, 0xAE, 0x01, 0x08, 0x06, 0xFE, 0x16, + 0xA0, 0x01, 0x80, 0x01, 0x00, 0x0C, 0xE0, 0x04, + 0x9E, 0x01, 0xE0, 0x04, 0x9C, 0x09, 0xE0, 0x04, + 0x9E, 0x09, 0x5B, 0x04, 0x20, 0x01, 0xA8, 0x09, + 0x00, 0x80, 0x11, 0x13, 0xE0, 0x93, 0x26, 0xE0, + 0x0E, 0x16, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, + 0x0A, 0x13, 0x08, 0x02, 0x84, 0x80, 0x00, 0x00, + 0x00, 0xE0, 0xDC, 0x0F, 0xA0, 0x06, 0xDA, 0xD4, + 0x20, 0x48, 0x08, 0xE0, 0x82, 0x01, 0x02, 0x10, + 0x60, 0x04, 0x70, 0xDA, 0x60, 0x04, 0xBA, 0xCE, + 0xA0, 0x06, 0x9C, 0xD5, 0x08, 0xC2, 0x19, 0x13, + 0x83, 0x07, 0x80, 0x80, 0xE0, 0x23, 0x14, 0xE0, + 0x02, 0x13, 0x83, 0x07, 0x0A, 0x00, 0x60, 0x04, + 0xC6, 0xCE, 0x20, 0xC1, 0x06, 0x06, 0x0D, 0x13, + 0xA0, 0x06, 0x9C, 0xD5, 0x08, 0xC2, 0x09, 0x13, + 0x83, 0x07, 0x0B, 0x00, 0xE0, 0x23, 0x14, 0xE0, + 0x02, 0x16, 0x83, 0x07, 0x01, 0x80, 0x60, 0x04, + 0xC6, 0xCE, 0x83, 0x07, 0x0A, 0x80, 0x60, 0x04, + 0xB4, 0xCE, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, + 0x06, 0x16, 0xA0, 0x06, 0xA8, 0xE5, 0x47, 0x10, + 0xD0, 0x03, 0x60, 0x04, 0xB0, 0xD3, 0xE0, 0x93, + 0x0E, 0xE0, 0x5E, 0x13, 0xE0, 0x93, 0x10, 0xE0, + 0x17, 0x13, 0xE0, 0x23, 0x14, 0xE0, 0x04, 0x13, + 0x83, 0x07, 0x07, 0x00, 0x60, 0x04, 0xC6, 0xCE, + 0x83, 0x07, 0x00, 0xA0, 0xA0, 0x06, 0x2A, 0xD8, + 0x83, 0x07, 0x00, 0x48, 0xA0, 0x06, 0x2A, 0xD8, + 0xA0, 0xD2, 0x10, 0xE0, 0x20, 0xC8, 0x1C, 0xE0, + 0xCA, 0x06, 0x20, 0xC8, 0x20, 0xE0, 0xCC, 0x06, + 0xA0, 0x06, 0x3E, 0xD7, 0x08, 0x02, 0x4E, 0x80, + 0xA0, 0x06, 0xDA, 0xD4, 0xA0, 0x23, 0x1C, 0xE0, + 0x20, 0x13, 0x20, 0x88, 0x6C, 0x09, 0x0E, 0x07, + 0x1C, 0x16, 0x20, 0x88, 0x6E, 0x09, 0x10, 0x07, + 0x18, 0x16, 0x20, 0x88, 0x70, 0x09, 0x12, 0x07, + 0x14, 0x16, 0x20, 0x88, 0x0A, 0x07, 0x22, 0xE0, + 0x10, 0x13, 0x20, 0x06, 0xCA, 0x06, 0x38, 0x16, + 0xA0, 0xE3, 0x20, 0xE0, 0x06, 0x10, 0xE0, 0x23, + 0x14, 0xE0, 0xCA, 0x16, 0xA0, 0xE3, 0x22, 0xE0, + 0xC2, 0x04, 0xA0, 0xD2, 0xAA, 0xE3, 0x60, 0x04, + 0xBA, 0xCE, 0x20, 0xC8, 0x1C, 0xE0, 0xCA, 0x06, + 0xA0, 0x88, 0xDC, 0x06, 0x0E, 0x00, 0x10, 0x16, + 0xA0, 0x88, 0xDE, 0x06, 0x10, 0x00, 0x0C, 0x16, + 0xA0, 0x88, 0xE0, 0x06, 0x12, 0x00, 0x08, 0x16, + 0x20, 0x06, 0xCC, 0x06, 0x19, 0x16, 0x20, 0xE8, + 0x0E, 0xE0, 0x82, 0x01, 0xA0, 0xE3, 0x1E, 0xE0, + 0x20, 0xC8, 0x20, 0xE0, 0xCC, 0x06, 0x10, 0x10, + 0xA0, 0x23, 0x10, 0xE0, 0x08, 0x16, 0x64, 0xC1, + 0x06, 0x00, 0x60, 0x21, 0x0C, 0xE0, 0x08, 0x13, + 0xA0, 0xD2, 0xA8, 0xE3, 0x05, 0x10, 0x20, 0x88, + 0x0A, 0x07, 0x08, 0x07, 0x96, 0x12, 0x00, 0x10, + 0x60, 0x04, 0xBA, 0xCE, 0x60, 0x01, 0x8E, 0x09, + 0x00, 0x80, 0x06, 0x16, 0x83, 0x07, 0x00, 0x82, + 0xA0, 0x06, 0x2A, 0xD8, 0x60, 0x04, 0xCA, 0xCE, + 0xE0, 0x93, 0x0E, 0xE0, 0x50, 0x13, 0xE0, 0x93, + 0xA9, 0xE3, 0x4D, 0x13, 0xE0, 0x93, 0xA8, 0xE3, + 0x1C, 0x13, 0xA0, 0x06, 0xA4, 0xD7, 0xA0, 0x23, + 0x10, 0xE0, 0x45, 0x13, 0xA0, 0x23, 0x08, 0xE0, + 0x06, 0x16, 0x60, 0xE3, 0x1E, 0xE0, 0x20, 0xC8, + 0x22, 0xE0, 0x06, 0x07, 0x34, 0x10, 0xE0, 0x23, + 0x14, 0xE0, 0x31, 0x16, 0x60, 0xC1, 0x6A, 0x09, + 0x60, 0x21, 0x12, 0xE0, 0x2C, 0x16, 0xA0, 0x06, + 0x0E, 0xE2, 0x31, 0x10, 0xA0, 0xD2, 0xA8, 0xE3, + 0x2E, 0x10, 0xA0, 0xE3, 0x12, 0xE0, 0xA0, 0x06, + 0x0E, 0xE2, 0x64, 0xC1, 0x06, 0x00, 0x60, 0x21, + 0x0C, 0xE0, 0x25, 0x13, 0x20, 0x88, 0x0E, 0x07, + 0xDC, 0x06, 0x14, 0x16, 0x20, 0x88, 0x10, 0x07, + 0xDE, 0x06, 0x10, 0x16, 0x20, 0x88, 0x12, 0x07, + 0xE0, 0x06, 0x0C, 0x16, 0x20, 0x98, 0xCE, 0x06, + 0xCF, 0x06, 0x15, 0x13, 0x20, 0x06, 0xCE, 0x06, + 0x12, 0x16, 0x60, 0xE3, 0x1A, 0xE0, 0xA0, 0xD2, + 0x0C, 0xE0, 0x0D, 0x10, 0x60, 0xE3, 0x1E, 0xE0, + 0x20, 0xC8, 0x32, 0xE0, 0x06, 0x07, 0xA0, 0x06, + 0x3E, 0xD7, 0x08, 0x02, 0x48, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0xA0, 0xD2, 0xA9, 0xE3, 0x60, 0x04, + 0xBA, 0xCE, 0x22, 0x88, 0x0E, 0x00, 0x6C, 0x09, + 0xC9, 0x1A, 0x0B, 0x1B, 0x22, 0x88, 0x10, 0x00, + 0x6E, 0x09, 0xC4, 0x1A, 0x06, 0x1B, 0x22, 0x88, + 0x12, 0x00, 0x70, 0x09, 0xBF, 0x1A, 0x01, 0x1B, + 0x5B, 0x04, 0x60, 0xC1, 0x6C, 0x01, 0x85, 0x02, + 0x43, 0x00, 0xE1, 0x13, 0xE0, 0x93, 0xA8, 0xE3, + 0xDE, 0x16, 0xA0, 0xC8, 0x00, 0xEE, 0x02, 0x00, + 0x84, 0x07, 0x0E, 0x00, 0x42, 0xC1, 0xA0, 0xC0, + 0x6C, 0x01, 0x02, 0xC0, 0x25, 0x02, 0x48, 0x00, + 0x81, 0x07, 0x60, 0xE2, 0x83, 0x07, 0x14, 0xAE, + 0x60, 0x04, 0x9E, 0xE5, 0x02, 0x02, 0x00, 0xFC, + 0xCA, 0x10, 0x60, 0x01, 0x8E, 0x09, 0x00, 0x80, + 0x06, 0x16, 0x83, 0x07, 0x00, 0x82, 0xA0, 0x06, + 0x2A, 0xD8, 0x60, 0x04, 0xCA, 0xCE, 0x20, 0x98, + 0x0E, 0xE0, 0x65, 0x06, 0x03, 0x16, 0x20, 0xD8, + 0xA8, 0xE3, 0x65, 0x06, 0xE0, 0x93, 0xA9, 0xE3, + 0x0D, 0x13, 0xA0, 0x23, 0x08, 0xE0, 0x19, 0x16, + 0xA0, 0x23, 0x10, 0xE0, 0x16, 0x13, 0x60, 0xE3, + 0x1E, 0xE0, 0x20, 0xC8, 0x20, 0xE0, 0x06, 0x07, + 0xA0, 0x06, 0x3E, 0xD7, 0xA0, 0x43, 0x18, 0xE0, + 0xE0, 0x2E, 0x01, 0x00, 0xA0, 0xD2, 0x26, 0xE0, + 0x83, 0x07, 0x10, 0x00, 0xA0, 0x06, 0x2A, 0xD8, + 0xE0, 0x23, 0x14, 0xE0, 0x02, 0x16, 0xA0, 0x06, + 0x18, 0xD7, 0xA0, 0x43, 0x2C, 0xE0, 0x20, 0xC8, + 0x20, 0xE0, 0x24, 0x09, 0x60, 0x04, 0xBA, 0xCE, + 0xA0, 0x06, 0xA8, 0xE5, 0x01, 0x10, 0x03, 0x10, + 0x20, 0x07, 0xA0, 0x09, 0x03, 0x10, 0xA0, 0x07, + 0xA2, 0x09, 0x19, 0x00, 0x60, 0x04, 0xBA, 0xCE, + 0xA0, 0x43, 0x0E, 0xE0, 0xA0, 0xC1, 0x24, 0x09, + 0x02, 0x13, 0x20, 0x06, 0x24, 0x09, 0xE0, 0x23, + 0x14, 0xE0, 0x03, 0x13, 0xA0, 0x23, 0x08, 0xE0, + 0x29, 0x16, 0x20, 0xC2, 0x8A, 0x09, 0xE4, 0x11, + 0x08, 0x02, 0x42, 0x80, 0xA0, 0x06, 0xDA, 0xD4, + 0xA0, 0x23, 0x08, 0xE0, 0x1F, 0x16, 0xA0, 0x23, + 0x10, 0xE0, 0x0A, 0x16, 0x22, 0xC1, 0x02, 0x00, + 0x20, 0x25, 0xA8, 0xE4, 0x23, 0x16, 0x83, 0x07, + 0x20, 0x80, 0xA0, 0x06, 0x2A, 0xD8, 0x12, 0x10, + 0xA0, 0x06, 0x3E, 0xD7, 0xE0, 0x23, 0x14, 0xE0, + 0x02, 0x16, 0xA0, 0x06, 0x18, 0xD7, 0x60, 0xE3, + 0x1E, 0xE0, 0x20, 0xC8, 0x20, 0xE0, 0x06, 0x07, + 0xA0, 0x23, 0x08, 0xE0, 0x03, 0x16, 0xA0, 0x23, + 0x06, 0xE0, 0x51, 0x13, 0x20, 0x98, 0x0E, 0xE0, + 0x65, 0x06, 0x03, 0x16, 0x20, 0xD8, 0xA8, 0xE3, + 0x65, 0x06, 0x22, 0xC1, 0x02, 0x00, 0x20, 0x25, + 0xA8, 0xE4, 0x0E, 0x13, 0x83, 0x07, 0x20, 0x00, + 0xA0, 0x06, 0x2A, 0xD8, 0x22, 0xC8, 0x0E, 0x00, + 0xE6, 0x06, 0x22, 0xC8, 0x10, 0x00, 0xE8, 0x06, + 0x22, 0xC8, 0x12, 0x00, 0xEA, 0x06, 0x37, 0x10, + 0x22, 0x88, 0x0E, 0x00, 0xDC, 0x06, 0x08, 0x16, + 0x22, 0x88, 0x10, 0x00, 0xDE, 0x06, 0x04, 0x16, + 0x22, 0x88, 0x12, 0x00, 0xE0, 0x06, 0x0B, 0x13, + 0x22, 0xC8, 0x0E, 0x00, 0xDC, 0x06, 0x22, 0xC8, + 0x10, 0x00, 0xDE, 0x06, 0x22, 0xC8, 0x12, 0x00, + 0xE0, 0x06, 0x60, 0xE3, 0x14, 0xE0, 0xA0, 0x23, + 0x0E, 0xE0, 0x08, 0x16, 0xA0, 0xC1, 0x24, 0x09, + 0x1A, 0x16, 0x86, 0x07, 0x00, 0x10, 0x06, 0xE8, + 0xD2, 0x06, 0x15, 0x10, 0xA0, 0xE3, 0x0E, 0xE0, + 0xA0, 0x23, 0x08, 0xE0, 0x09, 0x16, 0xA0, 0xE3, + 0x06, 0xE0, 0xE0, 0x04, 0xE6, 0x06, 0xE0, 0x04, + 0xE8, 0x06, 0xE0, 0x04, 0xEA, 0x06, 0x07, 0x10, + 0x08, 0x02, 0x36, 0x80, 0xA0, 0x07, 0xD6, 0x06, + 0x36, 0xD3, 0xA0, 0x06, 0xDA, 0xD4, 0x60, 0x04, + 0xBA, 0xCE, 0x20, 0x98, 0x65, 0x06, 0x10, 0xE0, + 0x03, 0x16, 0x20, 0xD8, 0x0E, 0xE0, 0x65, 0x06, + 0x60, 0x04, 0xBA, 0xCE, 0xE0, 0x23, 0x14, 0xE0, + 0x02, 0x13, 0x60, 0x04, 0xBA, 0xCE, 0x2E, 0x10, + 0xB0, 0x03, 0x20, 0x98, 0xA9, 0xE3, 0x6F, 0x06, + 0x19, 0x16, 0x24, 0xC2, 0x08, 0x00, 0x16, 0x11, + 0xE0, 0xE3, 0x14, 0xE0, 0x83, 0x07, 0x00, 0x00, + 0xA0, 0x06, 0x2A, 0xD8, 0xA0, 0x23, 0x14, 0xE0, + 0x04, 0x13, 0x08, 0x02, 0x06, 0x80, 0xA0, 0x06, + 0xDA, 0xD4, 0x08, 0x02, 0x1E, 0x00, 0xA0, 0x06, + 0xDA, 0xD4, 0xA0, 0x23, 0x08, 0xE0, 0x02, 0x13, + 0xA0, 0x06, 0x18, 0xD7, 0x82, 0xC0, 0x02, 0x16, + 0x60, 0x04, 0xD2, 0xCE, 0x20, 0xE8, 0x1C, 0xEE, + 0xF0, 0x06, 0x20, 0x99, 0x0E, 0xE0, 0x16, 0x00, + 0x05, 0x16, 0xE0, 0x04, 0xEC, 0x06, 0x20, 0x48, + 0x14, 0xE0, 0xF0, 0x06, 0x83, 0x07, 0x01, 0x00, + 0x60, 0x04, 0xB4, 0xCE, 0x64, 0xC2, 0x14, 0x00, + 0x24, 0x02, 0x18, 0x00, 0xC4, 0xC1, 0xC2, 0x61, + 0x27, 0x02, 0xFC, 0xFF, 0x74, 0xC1, 0x85, 0xC1, + 0x45, 0x71, 0x85, 0x02, 0x27, 0x00, 0x46, 0x16, + 0x54, 0xC1, 0x45, 0x02, 0xCF, 0xFF, 0x42, 0x16, + 0xC8, 0x04, 0x64, 0xC1, 0x08, 0x00, 0x06, 0x15, + 0x05, 0x13, 0x24, 0xC2, 0x0E, 0x00, 0x48, 0x02, + 0x00, 0x1F, 0xC8, 0x06, 0x28, 0x02, 0x11, 0x00, + 0x04, 0xA2, 0x18, 0x98, 0x21, 0xEE, 0x32, 0x16, + 0x42, 0xC1, 0x25, 0x02, 0x04, 0x00, 0x47, 0x65, + 0x35, 0xC2, 0x74, 0xCD, 0x48, 0x06, 0xFD, 0x15, + 0xA0, 0xC0, 0x6C, 0x01, 0x02, 0xC1, 0x04, 0xC8, + 0x6C, 0x01, 0xA0, 0xC1, 0x00, 0xFC, 0x05, 0x13, + 0x20, 0xC8, 0x80, 0xEB, 0x02, 0xFC, 0x06, 0xC1, + 0xF6, 0x10, 0x20, 0xC8, 0x00, 0xEE, 0x02, 0xFC, + 0x02, 0xC8, 0x6C, 0x01, 0x81, 0x07, 0x08, 0xE5, + 0x04, 0xC0, 0x83, 0x07, 0x10, 0x02, 0x84, 0x07, + 0x0E, 0x00, 0x3B, 0x10, 0x84, 0x07, 0x0C, 0x00, + 0xE2, 0xC0, 0x08, 0x00, 0x05, 0x02, 0x00, 0xFC, + 0xA0, 0xC0, 0x6C, 0x01, 0x02, 0xC0, 0x95, 0xC1, + 0x30, 0x13, 0xD5, 0x04, 0x16, 0x2E, 0x02, 0xC8, + 0x6C, 0x01, 0x2B, 0x10, 0xA0, 0xC8, 0x22, 0xEE, + 0x0E, 0x00, 0xA0, 0xC8, 0x24, 0xEE, 0x10, 0x00, + 0xA0, 0xC8, 0x26, 0xEE, 0x12, 0x00, 0x83, 0x07, + 0x06, 0x80, 0x60, 0x04, 0xB4, 0xCE, 0x60, 0x04, + 0xD2, 0xCE, 0x84, 0x07, 0x10, 0x00, 0x85, 0x07, + 0x34, 0x00, 0x09, 0x10, 0x84, 0x07, 0x12, 0x00, + 0x85, 0x07, 0x32, 0x00, 0x04, 0x10, 0x84, 0x07, + 0x14, 0x00, 0x85, 0x07, 0x38, 0x00, 0xA0, 0x06, + 0xC2, 0xD5, 0x85, 0xC8, 0x04, 0x00, 0xA0, 0x06, + 0x10, 0xD6, 0xA0, 0xC8, 0x00, 0xEE, 0x02, 0x00, + 0xA0, 0xC0, 0x6C, 0x01, 0x02, 0xC0, 0x48, 0x06, + 0x48, 0xC1, 0xA0, 0x06, 0xA2, 0xD8, 0x07, 0x02, + 0xA2, 0x06, 0x60, 0xC5, 0x02, 0xFC, 0x25, 0x02, + 0xF4, 0xFF, 0x05, 0xC8, 0x02, 0xFC, 0x20, 0xC2, + 0x6C, 0x01, 0xA0, 0x06, 0xFC, 0xB4, 0x60, 0x04, + 0xB0, 0xCE, 0xA0, 0x06, 0xA2, 0xD8, 0x07, 0x02, + 0xB4, 0x06, 0xEF, 0x10, 0x22, 0x88, 0x12, 0x00, + 0x70, 0x09, 0x08, 0x16, 0x22, 0x88, 0x10, 0x00, + 0x6E, 0x09, 0x04, 0x16, 0x22, 0x88, 0x0E, 0x00, + 0x6C, 0x09, 0x0E, 0x13, 0x22, 0x88, 0x12, 0x00, + 0xE0, 0x06, 0x08, 0x16, 0x22, 0x88, 0x10, 0x00, + 0xDE, 0x06, 0x04, 0x16, 0x22, 0x88, 0x0E, 0x00, + 0xDC, 0x06, 0x01, 0x13, 0xCB, 0x05, 0xCB, 0x05, + 0x5B, 0x04, 0x0B, 0xC3, 0x00, 0x03, 0x02, 0x00, + 0x82, 0x07, 0xC0, 0x00, 0x20, 0xC8, 0x0C, 0x00, + 0xC0, 0x00, 0x20, 0xC8, 0x0E, 0x00, 0xC2, 0x00, + 0x20, 0xC8, 0x10, 0x00, 0xC4, 0x00, 0x20, 0xC8, + 0x12, 0x00, 0xC6, 0x00, 0x20, 0xC8, 0x14, 0x00, + 0xC8, 0x00, 0x20, 0xC8, 0x16, 0x00, 0xCA, 0x00, + 0x20, 0xC8, 0x04, 0x00, 0xCC, 0x00, 0x20, 0xC8, + 0x06, 0x00, 0xCE, 0x00, 0x02, 0xC8, 0x0C, 0x00, + 0xA0, 0x07, 0x0E, 0x00, 0x7E, 0xE6, 0x02, 0xC8, + 0x10, 0x00, 0xA0, 0x07, 0x12, 0x00, 0x88, 0xE6, + 0x02, 0xC8, 0x14, 0x00, 0xA0, 0x07, 0x16, 0x00, + 0xB8, 0xE6, 0x02, 0xC8, 0x04, 0x00, 0xA0, 0x07, + 0x06, 0x00, 0xCE, 0xE6, 0x60, 0x01, 0x1C, 0x01, + 0x04, 0x00, 0x09, 0x16, 0xE0, 0x01, 0x40, 0x01, + 0x00, 0x08, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, + 0xE0, 0x01, 0x40, 0x01, 0x00, 0x04, 0xA0, 0x06, + 0x8E, 0xE9, 0x05, 0x02, 0x00, 0x80, 0x05, 0xD8, + 0x80, 0x04, 0xC7, 0x04, 0x00, 0x03, 0x0F, 0x00, + 0x88, 0x07, 0x00, 0x10, 0x09, 0x02, 0x00, 0x20, + 0x8A, 0x07, 0xE6, 0xE6, 0x03, 0x02, 0x3E, 0xE6, + 0x5A, 0x04, 0x00, 0x03, 0x00, 0x00, 0x20, 0xD2, + 0x87, 0x01, 0x06, 0x10, 0x00, 0x03, 0x00, 0x00, + 0x20, 0xC2, 0x8A, 0x01, 0x08, 0x02, 0x00, 0x1A, + 0x60, 0xC2, 0xAE, 0x00, 0x48, 0xDA, 0x80, 0x04, + 0x89, 0x05, 0x89, 0x02, 0x06, 0x00, 0x07, 0x15, + 0x88, 0x07, 0x00, 0x80, 0x48, 0xDA, 0x80, 0x04, + 0x09, 0xC8, 0xAE, 0x00, 0x80, 0x03, 0xE0, 0x02, + 0xA0, 0x00, 0x5C, 0x04, 0x00, 0x03, 0x00, 0x00, + 0x60, 0x01, 0x9C, 0x01, 0x20, 0x00, 0xE2, 0x13, + 0x20, 0xC2, 0x8C, 0x01, 0x08, 0x02, 0x00, 0x1C, + 0xE3, 0x10, 0x00, 0x03, 0x00, 0x00, 0x60, 0x01, + 0x40, 0x01, 0x00, 0x40, 0xEC, 0x16, 0xA0, 0x01, + 0x40, 0x01, 0x00, 0x40, 0x08, 0x02, 0x00, 0x02, + 0xD7, 0x10, 0xB3, 0xC0, 0x92, 0x06, 0xFD, 0x10, + 0xB3, 0xC0, 0x48, 0xC0, 0x72, 0xCC, 0x72, 0xCC, + 0x32, 0xC1, 0x44, 0xCC, 0x72, 0xDC, 0x04, 0x06, + 0xFD, 0x16, 0x5B, 0x04, 0x48, 0xC0, 0x02, 0x02, + 0xD0, 0xE9, 0x84, 0x07, 0x06, 0x00, 0xF6, 0x10, + 0x02, 0x02, 0x1E, 0xE6, 0x49, 0xC0, 0x84, 0x07, + 0x06, 0x00, 0xF0, 0x10, 0xB3, 0xC0, 0x32, 0xC1, + 0x01, 0x02, 0x01, 0x00, 0x44, 0xD0, 0xC1, 0x06, + 0x44, 0x02, 0xFF, 0x00, 0xE7, 0x10, 0x33, 0xC1, + 0x73, 0xC0, 0x44, 0xD1, 0x44, 0x02, 0xFF, 0x00, + 0x45, 0xDC, 0x04, 0x06, 0xFD, 0x16, 0x5A, 0x04, + 0xA0, 0x06, 0x0E, 0xE9, 0x33, 0xC8, 0x9E, 0x01, + 0x5A, 0x04, 0xA0, 0x06, 0x0C, 0xE7, 0x89, 0xC1, + 0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, + 0x8A, 0x01, 0x88, 0xC1, 0xA6, 0x09, 0x66, 0x02, + 0x40, 0x00, 0x06, 0xC8, 0x8C, 0x01, 0xC2, 0x04, + 0xC7, 0xC1, 0x03, 0x16, 0x02, 0x06, 0xFC, 0x16, + 0x4D, 0x10, 0x5A, 0x04, 0xA0, 0x06, 0x58, 0xE8, + 0x89, 0xC1, 0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, + 0x06, 0xC8, 0x8A, 0x01, 0x88, 0xC1, 0xA6, 0x09, + 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, 0x8C, 0x01, + 0x33, 0xC8, 0x9E, 0x01, 0xE8, 0x10, 0x33, 0x8A, + 0x02, 0x00, 0x38, 0x16, 0x73, 0x8A, 0x02, 0x00, + 0x35, 0x16, 0x5A, 0x04, 0x20, 0x8A, 0xCA, 0xE9, + 0x02, 0x00, 0x30, 0x16, 0x60, 0x8A, 0xCE, 0xE9, + 0x02, 0x00, 0x2C, 0x16, 0x82, 0x07, 0x74, 0xEA, + 0x01, 0x10, 0xB3, 0xC0, 0x04, 0x02, 0x80, 0x04, + 0x52, 0xD1, 0x03, 0x13, 0x32, 0x9D, 0x22, 0x16, + 0xFB, 0x10, 0x85, 0x07, 0x00, 0x80, 0x05, 0xD8, + 0x80, 0x04, 0xC7, 0x04, 0x5A, 0x04, 0x20, 0xC8, + 0xC0, 0x00, 0x0C, 0x00, 0x20, 0xC8, 0xC2, 0x00, + 0x0E, 0x00, 0x20, 0xC8, 0xC4, 0x00, 0x10, 0x00, + 0x20, 0xC8, 0xC6, 0x00, 0x12, 0x00, 0x20, 0xC8, + 0xC8, 0x00, 0x14, 0x00, 0x20, 0xC8, 0xCA, 0x00, + 0x16, 0x00, 0x20, 0xC8, 0xCC, 0x00, 0x04, 0x00, + 0x20, 0xC8, 0xCE, 0x00, 0x06, 0x00, 0x00, 0x03, + 0x0F, 0x00, 0xCC, 0x05, 0x5C, 0x04, 0xE0, 0x04, + 0x82, 0x01, 0x02, 0x02, 0x18, 0xE6, 0x32, 0xC8, + 0x82, 0x01, 0x32, 0xC8, 0x80, 0x01, 0xA0, 0x06, + 0x24, 0xE8, 0x12, 0xC8, 0x82, 0x01, 0xCA, 0xC2, + 0x84, 0x07, 0xD0, 0x07, 0xE0, 0x04, 0x84, 0x01, + 0x04, 0x06, 0xFC, 0x16, 0x20, 0xC1, 0x84, 0x01, + 0xE9, 0x16, 0x04, 0x02, 0x32, 0x00, 0x85, 0x07, + 0x00, 0x80, 0x05, 0xD8, 0x80, 0x04, 0xC7, 0x04, + 0x60, 0xC1, 0x86, 0x01, 0x04, 0x06, 0xFC, 0x16, + 0x20, 0xC1, 0x84, 0x01, 0x5B, 0x04, 0xB3, 0xC0, + 0xB3, 0xC4, 0x5B, 0x04, 0x48, 0xC0, 0xB3, 0xC0, + 0x73, 0xA0, 0x42, 0xC4, 0x5B, 0x04, 0x33, 0x88, + 0x84, 0x01, 0xE6, 0x16, 0x5A, 0x04, 0x89, 0xC1, + 0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, + 0x8A, 0x01, 0x5B, 0x04, 0xC5, 0x04, 0xA0, 0x07, + 0x9C, 0x01, 0x40, 0x00, 0x60, 0x01, 0x9C, 0x01, + 0x40, 0x00, 0x03, 0x13, 0x05, 0x06, 0xF7, 0x16, + 0x5C, 0x04, 0x5B, 0x04, 0xA0, 0x06, 0xAC, 0xE8, + 0x60, 0xC0, 0x40, 0x01, 0x05, 0xC8, 0x40, 0x01, + 0x02, 0xC5, 0x01, 0xC8, 0x40, 0x01, 0x5A, 0x04, + 0xA0, 0x06, 0xAC, 0xE8, 0x08, 0xA1, 0xF4, 0x10, + 0xB3, 0xC0, 0x33, 0xC1, 0x60, 0xC1, 0x40, 0x01, + 0x85, 0x01, 0x00, 0x04, 0xC5, 0x01, 0x00, 0x10, + 0x5B, 0x04, 0x08, 0xC1, 0x09, 0xC2, 0x44, 0xC2, + 0x5B, 0x04, 0x05, 0x02, 0xC8, 0x00, 0x05, 0x06, + 0xFE, 0x16, 0x5B, 0x04, 0x33, 0xC1, 0x03, 0xC0, + 0xC4, 0xC0, 0x5B, 0x04, 0xC0, 0xC0, 0x5B, 0x04, + 0xE0, 0x94, 0x9E, 0x01, 0xC2, 0x16, 0xC3, 0x05, + 0x5B, 0x04, 0x73, 0xC0, 0xA0, 0x06, 0x26, 0xE9, + 0x2D, 0x02, 0x08, 0x00, 0x85, 0x07, 0x08, 0x00, + 0x71, 0x9F, 0xB7, 0x16, 0x05, 0x06, 0xFC, 0x16, + 0x5A, 0x04, 0x02, 0x02, 0x24, 0xE6, 0x60, 0x04, + 0x10, 0xE7, 0xE9, 0x8C, 0x04, 0x00, 0xAD, 0x16, + 0x5B, 0x04, 0x20, 0xC1, 0x80, 0x01, 0x85, 0x07, + 0xD0, 0x07, 0xE0, 0x01, 0x80, 0x01, 0x00, 0x04, + 0x45, 0x06, 0xFE, 0x16, 0x04, 0xC8, 0x80, 0x01, + 0x5B, 0x04, 0x33, 0xC1, 0x48, 0xC3, 0x04, 0xC1, + 0x04, 0x13, 0x2D, 0x02, 0x00, 0x04, 0x04, 0x06, + 0xFC, 0x16, 0x5B, 0x04, 0x8D, 0xC3, 0xA0, 0x06, + 0x26, 0xE9, 0x8D, 0xC1, 0xA6, 0x09, 0x66, 0x02, + 0x40, 0x00, 0x86, 0xC7, 0x5A, 0x04, 0x8D, 0xC1, + 0xA6, 0x09, 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, + 0x8A, 0x01, 0x5B, 0x04, 0x8D, 0xC1, 0xA6, 0x09, + 0x66, 0x02, 0x40, 0x00, 0x06, 0xC8, 0x8C, 0x01, + 0x5B, 0x04, 0x4D, 0xC0, 0x04, 0x02, 0x28, 0x00, + 0x85, 0x07, 0x00, 0x55, 0x60, 0x04, 0x34, 0xE7, + 0x4D, 0xC0, 0xB3, 0xC0, 0x32, 0xC1, 0x60, 0x04, + 0xF8, 0xE6, 0x33, 0xC1, 0x60, 0x01, 0x1C, 0x01, + 0x04, 0x00, 0x01, 0x16, 0x5B, 0x04, 0xC4, 0xC0, + 0x5B, 0x04, 0x89, 0x07, 0x66, 0xE5, 0x39, 0xC2, + 0x07, 0x13, 0x39, 0xC6, 0x39, 0x86, 0x25, 0x16, + 0x39, 0xC6, 0x39, 0x86, 0x22, 0x16, 0xF7, 0x10, + 0x02, 0x02, 0xAC, 0xE9, 0xC4, 0x04, 0xC5, 0x04, + 0x39, 0xC2, 0x02, 0x13, 0x60, 0x04, 0xE8, 0xE9, + 0x02, 0x02, 0xBA, 0xE9, 0xC4, 0x04, 0x39, 0xC2, + 0x03, 0x13, 0x79, 0xC1, 0x60, 0x04, 0xE8, 0xE9, + 0x02, 0x02, 0xCA, 0xE9, 0xC5, 0x04, 0x39, 0xC2, + 0x03, 0x13, 0x39, 0xC1, 0x60, 0x04, 0xE8, 0xE9, + 0x79, 0xC0, 0xB9, 0xC0, 0x81, 0x60, 0xC2, 0x05, + 0x12, 0x09, 0xF1, 0x04, 0x02, 0x06, 0xFD, 0x16, + 0x5B, 0x04, 0x5C, 0x04, 0x01, 0x02, 0xAA, 0xAA, + 0x01, 0xC6, 0x44, 0xE0, 0x45, 0x40, 0x58, 0x80, + 0xF8, 0x16, 0x01, 0x02, 0x14, 0x00, 0x01, 0x06, + 0xFE, 0x16, 0x01, 0x02, 0x55, 0x55, 0x01, 0xC6, + 0x44, 0xE0, 0x45, 0x40, 0x58, 0x80, 0xED, 0x16, + 0x52, 0x04, 0xE0, 0x02, 0xA0, 0x00, 0x88, 0x07, + 0xC0, 0x00, 0x09, 0x02, 0x62, 0xEA, 0x84, 0x07, + 0x2A, 0xE6, 0x05, 0x02, 0x01, 0x00, 0x8B, 0xC2, + 0xCC, 0x04, 0xA0, 0x06, 0x6C, 0xEA, 0x60, 0x2C, + 0x01, 0x00, 0x99, 0x06, 0xA0, 0x2C, 0x02, 0x00, + 0x99, 0x06, 0x20, 0x2D, 0x04, 0x00, 0x99, 0x06, + 0x20, 0x2E, 0x08, 0x00, 0x99, 0x06, 0xA0, 0x2F, + 0x10, 0x00, 0x8C, 0x05, 0x09, 0x16, 0x80, 0xCC, + 0x81, 0xC4, 0x83, 0x07, 0xB0, 0xEA, 0x88, 0xC0, + 0x02, 0x04, 0x8C, 0x05, 0x01, 0x16, 0x33, 0x10, + 0xE0, 0x02, 0xA0, 0x00, 0x5A, 0x04, 0x8C, 0x05, + 0xFB, 0x16, 0x80, 0xCC, 0x81, 0xC4, 0x15, 0x0A, + 0xB4, 0xC0, 0x12, 0xC0, 0x88, 0xCC, 0x52, 0xC0, + 0xB4, 0xC4, 0x42, 0x06, 0x5B, 0x04, 0x2D, 0x07, + 0x18, 0x00, 0x41, 0x8B, 0x0A, 0x00, 0xEC, 0x16, + 0xC1, 0x82, 0xEA, 0x16, 0xC2, 0x02, 0x42, 0x02, + 0x00, 0x02, 0xE6, 0x16, 0x80, 0x03, 0x81, 0x07, + 0x01, 0x00, 0xF1, 0x10, 0x01, 0x02, 0x02, 0x00, + 0xEE, 0x10, 0x01, 0x02, 0x04, 0x00, 0xEB, 0x10, + 0x01, 0x02, 0x08, 0x00, 0xE8, 0x10, 0x01, 0x02, + 0x10, 0x00, 0xE5, 0x10, 0xA1, 0x02, 0x41, 0x8B, + 0x10, 0x00, 0x02, 0x13, 0x60, 0x04, 0x5C, 0xEA, + 0x2D, 0x07, 0x18, 0x00, 0x80, 0x03, 0x09, 0x02, + 0x00, 0x08, 0x03, 0x02, 0x04, 0x00, 0xC7, 0x04, + 0xA0, 0x06, 0xDC, 0xEB, 0x60, 0x01, 0x1C, 0x01, + 0x04, 0x00, 0x1C, 0x16, 0xA0, 0x01, 0x40, 0x01, + 0x00, 0x08, 0xE0, 0x01, 0x40, 0x01, 0x00, 0x10, + 0x04, 0x02, 0x01, 0x00, 0x44, 0xCE, 0xC4, 0x06, + 0x44, 0xC6, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x10, + 0x49, 0x06, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x40, + 0xE0, 0x01, 0x40, 0x01, 0x00, 0x04, 0xE0, 0x01, + 0x40, 0x01, 0x00, 0x08, 0xA0, 0x06, 0x7A, 0xEC, + 0xA0, 0x06, 0x7A, 0xEC, 0xC7, 0x05, 0x04, 0x02, + 0xE4, 0xE4, 0xE0, 0x04, 0xD0, 0x03, 0x74, 0xC1, + 0xB4, 0xC1, 0x86, 0x05, 0x1C, 0x13, 0xE0, 0x02, + 0xC0, 0x00, 0x00, 0x02, 0x00, 0x00, 0x40, 0xC0, + 0x80, 0xC0, 0xC0, 0xC0, 0x00, 0xC1, 0x40, 0xC1, + 0x80, 0xC1, 0xC0, 0xC1, 0x00, 0xC2, 0x40, 0xC2, + 0x80, 0xC2, 0xC0, 0xC2, 0x00, 0xC3, 0x40, 0xC3, + 0x80, 0xC3, 0xC0, 0xC3, 0xA0, 0x04, 0xAA, 0x00, + 0xD0, 0x03, 0xD0, 0x03, 0x3F, 0x10, 0x85, 0x05, + 0x85, 0x81, 0xE1, 0x13, 0xE4, 0x10, 0xC7, 0x05, + 0x05, 0x02, 0xFF, 0x7F, 0x45, 0xA1, 0xD0, 0x03, + 0xD0, 0x03, 0x34, 0x10, 0xC0, 0xCC, 0xC1, 0xC4, + 0x03, 0x02, 0x28, 0x00, 0xA0, 0x06, 0xDC, 0xEB, + 0xE0, 0x01, 0x42, 0x01, 0x00, 0x10, 0xC7, 0x05, + 0xD0, 0x03, 0xD0, 0x03, 0x27, 0x10, 0xC7, 0x05, + 0xA0, 0xC1, 0x4A, 0x01, 0xA0, 0x07, 0x4A, 0x01, + 0x00, 0x0E, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x02, + 0x20, 0x07, 0x44, 0x01, 0x60, 0xC1, 0x44, 0x01, + 0x85, 0x02, 0x00, 0xFF, 0x17, 0x16, 0xE0, 0x01, + 0x40, 0x01, 0x00, 0x22, 0x05, 0x02, 0xC0, 0x00, + 0x05, 0x06, 0xD0, 0x03, 0xFD, 0x16, 0x60, 0xC1, + 0x46, 0x01, 0x85, 0x02, 0x00, 0xFF, 0x0A, 0x13, + 0x05, 0x02, 0x93, 0x33, 0x05, 0x06, 0x00, 0x10, + 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, + 0xD0, 0x03, 0xF8, 0x16, 0x51, 0x10, 0x06, 0xC8, + 0x4A, 0x01, 0xC0, 0xCC, 0xC1, 0xC4, 0x4B, 0x10, + 0x13, 0xC0, 0xC8, 0xCC, 0x53, 0xC0, 0x02, 0x02, + 0xEC, 0xEB, 0xC2, 0xC4, 0x43, 0x06, 0x5B, 0x04, + 0x60, 0xC0, 0xAE, 0x00, 0xC4, 0x02, 0x44, 0x02, + 0x0F, 0x00, 0x44, 0x88, 0xCA, 0xE4, 0x3C, 0x16, + 0x81, 0x02, 0x08, 0x00, 0x27, 0x13, 0x21, 0xC1, + 0xDC, 0xE4, 0x14, 0xC1, 0x21, 0x21, 0xBA, 0xE4, + 0x33, 0x16, 0x21, 0xC1, 0xC2, 0xE4, 0x81, 0x02, + 0x00, 0x00, 0x0B, 0x13, 0x0D, 0x02, 0xA0, 0x00, + 0x84, 0x83, 0x09, 0x13, 0xC4, 0x05, 0x84, 0x83, + 0x06, 0x13, 0xC4, 0x05, 0x84, 0x83, 0x03, 0x13, + 0x23, 0x10, 0x0E, 0x81, 0x21, 0x16, 0x21, 0xC1, + 0xDC, 0xE4, 0x21, 0x45, 0xBA, 0xE4, 0xE0, 0x01, + 0x42, 0x01, 0x00, 0x10, 0xA0, 0x01, 0x42, 0x01, + 0x00, 0x10, 0xA1, 0xC3, 0xD4, 0xE4, 0x0F, 0x02, + 0x2F, 0x00, 0x80, 0x03, 0xA0, 0x01, 0x40, 0x01, + 0x00, 0x02, 0xA0, 0x01, 0x40, 0x01, 0x00, 0x80, + 0x6D, 0xC0, 0x0A, 0x00, 0x09, 0x13, 0x81, 0x02, + 0x5C, 0x12, 0x06, 0x1B, 0x0E, 0x02, 0xD2, 0xEB, + 0x0F, 0x02, 0x0F, 0x00, 0x80, 0x03, 0xCA, 0x05, + 0xE0, 0x02, 0xA0, 0x00, 0x5A, 0x04, 0x59, 0xCE, + 0x20, 0x88, 0xE4, 0xE4, 0xE4, 0xE4, 0xF8, 0x10, + 0xC1, 0x04, 0x48, 0x62, 0x89, 0x05, 0xA0, 0xC0, + 0x6C, 0x01, 0x08, 0xC8, 0x6C, 0x01, 0x03, 0x02, + 0x00, 0xFC, 0x04, 0x02, 0x00, 0x02, 0x73, 0xA0, + 0x04, 0x06, 0xFD, 0x16, 0x88, 0x05, 0x09, 0x06, + 0xF4, 0x16, 0x02, 0xC8, 0x6C, 0x01, 0x81, 0x86, + 0x02, 0x16, 0xD0, 0x03, 0xCB, 0x05, 0x5B, 0x04, + 0x43, 0x28, 0x31, 0x29, 0x38, 0x39, 0x2D, 0x33, + 0x38, 0x38, 0x42, 0x20, 0x20, 0x59, 0x49, 0x54, + 0x4B, 0xC2, 0xA8, 0x02, 0x98, 0x00, 0x83, 0x07, + 0x02, 0x00, 0x28, 0x02, 0x08, 0x00, 0x23, 0xC6, + 0x36, 0xE5, 0x48, 0x06, 0xC4, 0xC0, 0x73, 0x0A, + 0x65, 0x17, 0xA0, 0x06, 0xAA, 0xED, 0xC8, 0xC1, + 0xC7, 0x05, 0x03, 0x02, 0xA5, 0x00, 0xB0, 0x03, + 0xF8, 0xCD, 0xF8, 0xCD, 0xA6, 0x02, 0x06, 0x62, + 0x88, 0x02, 0x0A, 0x00, 0x57, 0x16, 0x03, 0x29, + 0x55, 0x16, 0x05, 0x29, 0xC4, 0x80, 0x52, 0x16, + 0x15, 0x09, 0x50, 0x17, 0x15, 0x09, 0x4E, 0x18, + 0x85, 0x02, 0x29, 0x00, 0x4B, 0x16, 0xC6, 0x05, + 0x96, 0x00, 0x03, 0x07, 0xC4, 0x04, 0x45, 0x06, + 0x95, 0x00, 0x44, 0x05, 0x43, 0x16, 0x44, 0x81, + 0x41, 0x16, 0x00, 0x03, 0x05, 0x00, 0xC4, 0x02, + 0x00, 0x03, 0x0A, 0x00, 0x44, 0x02, 0x0F, 0x00, + 0x84, 0x02, 0x05, 0x00, 0x37, 0x16, 0xC4, 0x02, + 0x00, 0x03, 0x0F, 0x00, 0x44, 0x02, 0x0F, 0x00, + 0x84, 0x02, 0x0A, 0x00, 0x2F, 0x16, 0x04, 0x02, + 0xFE, 0xFF, 0x2C, 0x13, 0x2B, 0x15, 0x2A, 0x1A, + 0x84, 0x05, 0x28, 0x12, 0x27, 0x15, 0x26, 0x1A, + 0x25, 0x18, 0x84, 0x05, 0x23, 0x16, 0x22, 0x1B, + 0x21, 0x17, 0x84, 0x05, 0x1F, 0x13, 0x1E, 0x1A, + 0x1D, 0x11, 0x04, 0x06, 0x1B, 0x16, 0xA5, 0x02, + 0xC5, 0xC1, 0x25, 0x02, 0x06, 0x00, 0x03, 0x02, + 0xA5, 0xA5, 0x83, 0xC1, 0x95, 0x00, 0x03, 0x38, + 0x94, 0x00, 0x83, 0x02, 0x2E, 0x6B, 0x0E, 0x16, + 0x84, 0x02, 0x59, 0x1C, 0x0B, 0x16, 0x24, 0x02, + 0x69, 0x00, 0x95, 0x00, 0x03, 0x3C, 0x94, 0x00, + 0x83, 0x81, 0x04, 0x16, 0x84, 0x02, 0x69, 0x00, + 0x01, 0x16, 0xC9, 0x05, 0x59, 0x04, 0xC3, 0xD0, + 0xFD, 0x13, 0x01, 0x1C, 0xFB, 0x10, 0xE0, 0x90, + 0x3D, 0xE5, 0xF8, 0x16, 0xC3, 0x06, 0xC3, 0xD0, + 0xF5, 0x1C, 0xF4, 0x16, 0xE0, 0x90, 0x3A, 0xE5, + 0xF1, 0x16, 0x5B, 0x04, 0x0B, 0xC3, 0x09, 0x02, + 0x3E, 0xE5, 0xA0, 0x06, 0x92, 0xE9, 0xCC, 0x05, + 0x5C, 0x04, 0x88, 0x07, 0x00, 0xA0, 0x89, 0x07, + 0xFE, 0xFF, 0xA8, 0x09, 0xA9, 0x09, 0x8A, 0x07, + 0x02, 0xE0, 0xA0, 0x06, 0x84, 0xEC, 0x00, 0x00, + 0x88, 0x07, 0x00, 0x90, 0x89, 0x07, 0xFE, 0x9F, + 0xA8, 0x09, 0xA9, 0x09, 0x8A, 0x07, 0x78, 0xE0, + 0xA0, 0x06, 0x84, 0xEC, 0x00, 0x00, 0xA0, 0x06, + 0xC4, 0xEC, 0x00, 0x00, 0xE6, 0x10, 0xE5, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, + 0x00, 0x08, 0x11, 0xE3, 0x6C, 0xCC, 0x00, 0x80, + 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x80, 0x00, + 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0xFF, + 0xFF, 0x00, 0xF0, 0xFF, 0x00, 0xF0, 0x0F, 0x00, + 0xFF, 0xFF, 0xFF, 0x7F, 0x03, 0x00, 0x00, 0x00, + 0xC3, 0x00, 0xE7, 0xE7, 0xF3, 0xE7, 0xF1, 0xF1, + 0x43, 0x28, 0x20, 0x29, 0x4F, 0x43, 0x59, 0x50, + 0x49, 0x52, 0x48, 0x47, 0x20, 0x54, 0x42, 0x49, + 0x20, 0x4D, 0x39, 0x31, 0x33, 0x38, 0x34, 0x2C, + 0x35, 0x2C, 0x36, 0x2C, 0x43, 0x28, 0x20, 0x29, + 0x4F, 0x43, 0x59, 0x50, 0x49, 0x52, 0x48, 0x47, + 0x20, 0x54, 0x49, 0x54, 0x31, 0x20, 0x38, 0x39, + 0x2D, 0x33, 0x39, 0x38, 0x39, 0x2C, 0x2D, 0x30, + 0x38, 0x39, 0x00, 0x00, 0x61, 0x9B, 0xC4, 0xEC, + 0x0E, 0xEA, 0xDE, 0xE5, 0xC8, 0xED, 0x00, 0x00, + 0xC4, 0x00, 0xB8, 0xAF, 0x4A, 0x06, 0x50, 0x06, + 0x4C, 0x06, 0xDC, 0xCC, 0x4E, 0x06, 0x0F, 0x00, + 0x32, 0x06, 0x01, 0x00, 0x50, 0x07, 0x58, 0x07, + 0x52, 0x07, 0x70, 0xB5, 0x54, 0x07, 0x0F, 0x00, + 0x38, 0x07, 0x01, 0x00, 0xBA, 0x00, 0xA0, 0x00, + 0xBC, 0x00, 0xD6, 0xED, 0xBE, 0x00, 0x0F, 0x00, + 0x5E, 0x07, 0x3A, 0x07, 0x62, 0x07, 0x40, 0x80, + 0x64, 0x07, 0x54, 0xBA, 0x66, 0x07, 0x36, 0xBA, + 0x68, 0x07, 0x40, 0xB8, 0x98, 0x07, 0x00, 0x80, + 0x78, 0x07, 0x00, 0x80, 0xE2, 0x08, 0x04, 0x00, + 0xE4, 0x08, 0x01, 0x00, 0xEC, 0x08, 0x08, 0x00, + 0xF6, 0x08, 0x0A, 0x00, 0xF8, 0x08, 0x06, 0x00, + 0x00, 0x09, 0x0C, 0x00, 0x02, 0x09, 0x04, 0x00, + 0xAE, 0x01, 0x00, 0x00, 0x1E, 0x09, 0x00, 0x00, + 0x66, 0x09, 0x00, 0x00, 0x0C, 0x06, 0x13, 0x00, + 0x0A, 0x06, 0x20, 0x00, 0x00, 0x00, 0xE0, 0x00, + 0x86, 0xA3, 0xE0, 0x00, 0xE6, 0xA2, 0xE0, 0x00, + 0x86, 0xA3, 0xE0, 0x00, 0x02, 0xA5, 0xE0, 0x00, + 0x5E, 0xA6, 0xE0, 0x00, 0x66, 0xA9, 0xE0, 0x00, + 0x12, 0xA4, 0xC0, 0x00, 0x22, 0xA4, 0xE0, 0x00, + 0x86, 0xA3, 0xE0, 0x00, 0x86, 0xA3, 0xC0, 0x00, + 0x74, 0xA4, 0xE0, 0x00, 0x86, 0xA3, 0xE0, 0x00, + 0x86, 0xA3, 0xE0, 0x00, 0x86, 0xA3, 0xE0, 0x00, + 0x86, 0xA3, 0xE0, 0x00, 0x86, 0xA3, 0xC0, 0x00, + 0xDE, 0xAF, 0xC0, 0x00, 0x48, 0xB0, 0xC0, 0x00, + 0x84, 0xB0, 0xC0, 0x00, 0xF4, 0xB0, 0xC0, 0x00, + 0x76, 0xB1, 0xE0, 0x00, 0xE4, 0xB2, 0xE0, 0x00, + 0x8A, 0xB2, 0xE0, 0x00, 0xF4, 0xB3, 0xE0, 0x00, + 0x7C, 0xB3, 0xE0, 0x00, 0xC6, 0xAA, 0xC0, 0x00, + 0x36, 0xAB, 0xC0, 0x00, 0x90, 0xAB, 0xC0, 0x00, + 0xC2, 0xAB, 0xC0, 0x00, 0xEA, 0xAA, 0xC0, 0x00, + 0x80, 0xA3, 0xC0, 0x00, 0x80, 0xA3, 0x00, 0x3F, + 0x00, 0x7F, 0x00, 0x5E, 0x30, 0x00, 0x28, 0x00, + 0x43, 0x00, 0xB6, 0xA6, 0xB6, 0xA6, 0x1C, 0xA5, + 0x14, 0xA5, 0x46, 0xA5, 0x46, 0xA5, 0x62, 0xA5, + 0xB6, 0xA6, 0x00, 0x40, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0x08, + 0x00, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x10, + 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x10, 0x00, + 0x14, 0x00, 0x0E, 0x10, 0x0C, 0x0C, 0x0A, 0x0A, + 0x0A, 0x0A, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x98, 0x07, 0x7E, 0xCA, 0x58, 0x07, + 0xF8, 0xB8, 0x58, 0x07, 0xFE, 0xB7, 0x58, 0x07, + 0x68, 0xB9, 0x58, 0x07, 0xD0, 0xB8, 0x98, 0x07, + 0x5A, 0xC7, 0x98, 0x07, 0x52, 0xC7, 0x78, 0x07, + 0xC2, 0xC1, 0x58, 0x07, 0x30, 0xB9, 0x98, 0x07, + 0x38, 0xCA, 0x78, 0x07, 0x96, 0xC2, 0x58, 0x07, + 0x6A, 0xC7, 0x58, 0x07, 0xE0, 0xB8, 0x58, 0x07, + 0x1E, 0xB9, 0x58, 0x07, 0xE2, 0xB9, 0x98, 0x07, + 0xAE, 0xCB, 0x98, 0x07, 0x8E, 0xC7, 0x78, 0x07, + 0x56, 0xC2, 0xB8, 0x07, 0x14, 0xCC, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xA2, 0xBA, 0x16, 0xC1, + 0xCA, 0xC1, 0xD6, 0xC6, 0x8A, 0xBD, 0xC2, 0xBD, + 0xE0, 0xBD, 0x6A, 0xBE, 0x8E, 0xBE, 0xAA, 0xBE, + 0x22, 0xBF, 0x22, 0xBF, 0x56, 0xBE, 0xC8, 0xBF, + 0x10, 0xBE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, + 0x00, 0x0C, 0x01, 0x0F, 0xFF, 0xFE, 0x00, 0x58, + 0x00, 0x0E, 0xFF, 0xFE, 0x0E, 0x00, 0x00, 0x70, + 0x40, 0x80, 0x00, 0x5E, 0xA0, 0xC0, 0xDF, 0xFF, + 0x00, 0x18, 0x00, 0xE0, 0x00, 0x78, 0x00, 0x50, + 0x00, 0x60, 0x00, 0x70, 0x00, 0x0C, 0x06, 0x00, + 0x00, 0x00, 0x84, 0xE3, 0xE6, 0x07, 0xF4, 0x07, + 0x08, 0x00, 0x00, 0x00, 0x8A, 0xE3, 0xEA, 0x07, + 0xF4, 0x07, 0x06, 0x00, 0x40, 0x00, 0x00, 0x0A, + 0xE6, 0x07, 0xEE, 0x07, 0x08, 0x00, 0x40, 0x00, + 0x06, 0x0A, 0xEA, 0x07, 0xEE, 0x07, 0x00, 0x00, + 0xE2, 0xC1, 0x8B, 0xD4, 0xFF, 0xFF, 0xD7, 0xD1, + 0xD9, 0xC5, 0xD4, 0xC3, 0x3B, 0x59, 0x34, 0x09, + 0xFC, 0x05, 0x6C, 0x09, 0xD8, 0x06, 0x06, 0x04, + 0xBA, 0xEA, 0x30, 0x09, 0x48, 0x04, 0x80, 0x08, + 0x06, 0x00, 0x0A, 0x06, 0x0E, 0x0C, 0xBA, 0xCE, + 0x2E, 0xE0, 0x56, 0xE0, 0x50, 0xE1, 0x66, 0xE2, + 0xEC, 0xE2, 0x4C, 0xE3, 0xFE, 0xE3, 0xBA, 0xCE, + 0x80, 0xE4, 0x10, 0xE4, 0x14, 0xE0, 0x1C, 0xE4, + 0x1C, 0xE4, 0x46, 0xE5, 0x50, 0xE5, 0x5A, 0xE5, + 0xBA, 0xCE, 0xA6, 0xDC, 0xBA, 0xCE, 0x44, 0xDA, + 0xE6, 0xDF, 0x70, 0xDA, 0xDE, 0xDE, 0xB0, 0xCE, + 0x16, 0xDB, 0x3A, 0xDD, 0xB8, 0xDD, 0x34, 0xDE, + 0x58, 0xDE, 0x16, 0xDB, 0xDA, 0xDC, 0x08, 0xCF, + 0xB0, 0xCE, 0xA8, 0xD9, 0x8A, 0xD9, 0x44, 0xD9, + 0xB0, 0xCE, 0xEA, 0xDE, 0xB0, 0xCE, 0x72, 0x06, + 0xF6, 0xD2, 0x08, 0x07, 0x72, 0x06, 0x54, 0xD2, + 0xF4, 0x01, 0x72, 0x06, 0x34, 0xD2, 0x08, 0x07, + 0x7C, 0x06, 0x5A, 0xDC, 0x04, 0x00, 0x7C, 0x06, + 0x78, 0xD2, 0x00, 0x00, 0x7C, 0x06, 0xCC, 0xDE, + 0xFA, 0x00, 0x86, 0x06, 0xAC, 0xD1, 0x05, 0x00, + 0x90, 0x06, 0x1C, 0xDF, 0x28, 0x00, 0x90, 0x06, + 0x50, 0xD3, 0x04, 0x01, 0x90, 0x06, 0x00, 0x00, + 0x02, 0x00, 0x90, 0x06, 0x80, 0xD2, 0xBC, 0x02, + 0x9A, 0x06, 0x06, 0xD3, 0xDC, 0x05, 0x9A, 0x06, + 0xAA, 0xD2, 0x64, 0x00, 0x9A, 0x06, 0x0A, 0xD3, + 0x14, 0x00, 0x9A, 0x06, 0xE2, 0xE0, 0x40, 0x06, + 0x9A, 0x06, 0x12, 0xD3, 0x64, 0x00, 0x7C, 0x06, + 0x16, 0xDC, 0x04, 0x00, 0x7C, 0x06, 0xE6, 0xDA, + 0x16, 0x00, 0x7C, 0x06, 0xFA, 0xDB, 0x05, 0x00, + 0x7C, 0x06, 0x00, 0xDD, 0x14, 0x00, 0x9A, 0x06, + 0x7C, 0xD3, 0x14, 0x00, 0x9A, 0x06, 0x38, 0xD4, + 0x02, 0x00, 0x7C, 0x06, 0x0C, 0xE0, 0x19, 0x00, + 0x00, 0x00, 0x0A, 0x07, 0x0E, 0x07, 0x04, 0x07, + 0xD8, 0x06, 0x00, 0x07, 0xF0, 0x06, 0xEE, 0x06, + 0xEC, 0x06, 0x0C, 0x07, 0xE6, 0x06, 0x18, 0x07, + 0x92, 0x09, 0x94, 0x09, 0x96, 0x09, 0x98, 0x09, + 0x00, 0x50, 0xCC, 0x00, 0x03, 0x00, 0x00, 0x84, + 0x00, 0xA8, 0x00, 0xA0, 0x00, 0x20, 0x00, 0x80, + 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 0x80, + 0x00, 0x40, 0x00, 0x10, 0x82, 0xEC, 0x48, 0xEB, + 0x62, 0xEB, 0x7C, 0xEB, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x09, 0x00, 0x09, 0x00, 0xEA, 0xEB, + 0x52, 0xEB, 0x68, 0xEB, 0x82, 0xEB, 0x40, 0x01, + 0x42, 0x01, 0x42, 0x01, 0x42, 0x01, 0x00, 0x00, + 0x7F, 0x00, 0xA0, 0x00, 0xFF, 0x00, 0x10, 0x02, + 0x1F, 0x02, 0x30, 0x02, 0x3F, 0x02, 0x50, 0x02, + 0x5F, 0x02, 0x70, 0x02, 0x7F, 0x02, 0x90, 0x02, + 0x9F, 0x02, 0xB0, 0x02, 0xBF, 0x02, 0xD0, 0x02, + 0xDF, 0x02, 0xE1, 0x02, 0xFF, 0x02, 0x01, 0x03, + 0x7F, 0x03, 0x81, 0x03, 0x8F, 0x03, 0x91, 0x03, + 0x9F, 0x03, 0xA1, 0x03, 0xAF, 0x03, 0xB1, 0x03, + 0xBF, 0x03, 0xC1, 0x03, 0xCF, 0x03, 0xE1, 0x03, + 0xFF, 0x03, 0xC0, 0x07, 0xFF, 0x07, 0x00, 0x0C, + 0xFF, 0x0F, 0x00, 0x30, 0xFF, 0x37, 0xFF, 0xFF, + 0xFF, 0xFF, 0xBC, 0xFE, 0x07, 0x00, 0x5E, 0x02, + 0x00, 0x01, 0xFF, 0xBA, 0x80, 0xBA, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x0A, 0x01, + 0x0E, 0x01, 0x10, 0x01, 0x14, 0x01, 0x00, 0x00, + 0x12, 0x01, 0x00, 0xF8, 0x16, 0x01, 0x00, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x0A, 0x01, 0x1C, 0x01, + 0x82, 0x01, 0x66, 0x96, 0x66, 0x96, 0x55, 0x55, + 0x00, 0x00, 0x82, 0x01, 0x2A, 0x8A, 0x2A, 0x8A, + 0x18, 0xC9, 0x18, 0xC9, 0x86, 0x01, 0xAA, 0xA2, + 0x1E, 0xA0, 0x55, 0x55, 0x1E, 0x54, 0x8A, 0x01, + 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, + 0x8C, 0x01, 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, + 0x00, 0x00, 0x8E, 0x01, 0x00, 0x50, 0x00, 0x00, + 0x00, 0xA8, 0x00, 0x00, 0x90, 0x01, 0x00, 0x50, + 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x92, 0x01, + 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, + 0x94, 0x01, 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, + 0x00, 0x00, 0x96, 0x01, 0x00, 0x50, 0x00, 0x00, + 0x00, 0xA8, 0x00, 0x00, 0x98, 0x01, 0x00, 0x50, + 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x9A, 0x01, + 0x00, 0x50, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, + 0x9C, 0x01, 0x55, 0x55, 0xC0, 0x7F, 0xAA, 0xAA, + 0xC0, 0x7F, 0x00, 0x00, 0xA2, 0x01, 0xA4, 0x01, + 0xA8, 0x01, 0xAA, 0x01, 0xAE, 0x01, 0xB0, 0x01, + 0xB2, 0x01, 0x80, 0x01, 0x00, 0x00, 0x88, 0x01, + 0x00, 0xFF, 0x9E, 0x01, 0xFF, 0x00, 0xA0, 0x01, + 0x00, 0x80, 0xAC, 0x01, 0x00, 0x80, 0x00, 0x00, + 0xA6, 0x01, 0x00, 0x80, 0x00, 0x00, 0x80, 0x01, + 0xBC, 0x01, 0x00, 0x88, 0x00, 0x06, 0x00, 0xC8, + 0x00, 0x00, 0x00, 0x80, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x02, 0x00, 0x44, 0x00, 0x92, 0xEA, + 0x48, 0x00, 0x98, 0xEA, 0x50, 0x00, 0x9E, 0xEA, + 0x60, 0x00, 0xA4, 0xEA, 0x78, 0x00, 0xAA, 0xEA, + 0x0A, 0xE8, 0x18, 0xE7, 0x3C, 0xEA, 0x2A, 0xE7, + 0x14, 0x55, 0xA0, 0x01, 0xEC, 0xE6, 0xD0, 0xE9, + 0x46, 0xE7, 0xA0, 0xE7, 0x00, 0xE7, 0x58, 0xE8, + 0x00, 0x00, 0x1E, 0x00, 0x46, 0xE7, 0x92, 0xE7, + 0x00, 0x41, 0x01, 0x41, 0xB6, 0xE7, 0x73, 0xEA, + 0x18, 0xE7, 0x48, 0xEA, 0xEC, 0xE6, 0x04, 0xEA, + 0x56, 0xE7, 0x62, 0xE7, 0xB6, 0xE7, 0x6E, 0xEA, + 0x62, 0xE8, 0x00, 0x00, 0x36, 0xE8, 0xEC, 0xE6, + 0xFA, 0xE9, 0x56, 0xE7, 0x62, 0xE7, 0x36, 0xE8, + 0x62, 0xE8, 0x00, 0x00, 0xEC, 0xE6, 0xF0, 0xE9, + 0x0C, 0xE7, 0x4A, 0xE7, 0x62, 0xE7, 0x36, 0xE8, + 0xEC, 0xE6, 0xFA, 0xE9, 0x56, 0xE7, 0x62, 0xE7, + 0x36, 0xE8, 0x62, 0xE8, 0x00, 0x20, 0x2A, 0xE7, + 0x14, 0x55, 0xA0, 0x01, 0x18, 0xE7, 0x50, 0xEA, + 0xEC, 0xE6, 0xD0, 0xE9, 0x58, 0xE8, 0x50, 0x55, + 0x0C, 0x00, 0x46, 0xE7, 0x92, 0xE7, 0x00, 0x01, + 0x00, 0x00, 0xB6, 0xE7, 0x75, 0xEA, 0x00, 0xE7, + 0x58, 0xE8, 0x55, 0x55, 0x0C, 0x00, 0x56, 0xE7, + 0xA0, 0xE7, 0x00, 0xE7, 0x58, 0xE8, 0xFF, 0xFF, + 0x08, 0x00, 0x58, 0xE8, 0x02, 0x10, 0x06, 0x00, + 0x46, 0xE7, 0x92, 0xE7, 0x00, 0x01, 0x01, 0x01, + 0xB6, 0xE7, 0x80, 0xEA, 0x00, 0xE7, 0x58, 0xE8, + 0x00, 0xC0, 0x08, 0x00, 0x58, 0xE8, 0xFF, 0xFF, + 0x0A, 0x00, 0x58, 0xE8, 0xFF, 0xFF, 0x0C, 0x00, + 0x58, 0xE8, 0x0D, 0x10, 0x06, 0x00, 0x46, 0xE7, + 0x92, 0xE7, 0x00, 0x01, 0x01, 0x01, 0xB6, 0xE7, + 0x74, 0xEA, 0x62, 0xE8, 0x08, 0x20, 0x00, 0xE7, + 0x52, 0xE8, 0x82, 0x01, 0x02, 0xC9, 0x46, 0xE7, + 0xB6, 0xE7, 0x80, 0xEA, 0x62, 0xE8, 0x34, 0x20, + 0x00, 0xE7, 0x58, 0xE8, 0x00, 0x10, 0x06, 0x00, + 0x46, 0xE7, 0xC6, 0xE8, 0xB6, 0xE7, 0x78, 0xEA, + 0x52, 0xE8, 0x9C, 0x01, 0x40, 0x00, 0x18, 0xE7, + 0x50, 0xEA, 0x2A, 0xE7, 0xFF, 0x00, 0x80, 0x07, + 0x26, 0xE9, 0x03, 0x00, 0x66, 0xE9, 0x74, 0xE9, + 0x12, 0xEA, 0x38, 0xE9, 0x00, 0x00, 0x74, 0xE9, + 0x1C, 0xEA, 0x38, 0xE9, 0x04, 0x00, 0x74, 0xE9, + 0x24, 0xEA, 0x38, 0xE9, 0x07, 0x00, 0x74, 0xE9, + 0x2C, 0xEA, 0x26, 0xE9, 0x01, 0x00, 0x74, 0xE9, + 0x34, 0xEA, 0x38, 0xE9, 0x02, 0x00, 0x74, 0xE9, + 0x34, 0xEA, 0x38, 0xE9, 0x06, 0x00, 0x74, 0xE9, + 0x34, 0xEA, 0x38, 0xE9, 0x05, 0x00, 0x74, 0xE9, + 0x34, 0xEA, 0x26, 0xE9, 0x01, 0x00, 0x4A, 0xE9, + 0x26, 0xE9, 0x03, 0x00, 0x58, 0xE9, 0x62, 0xE7, + 0xE6, 0xE8, 0xD8, 0xE9, 0x01, 0x00, 0xE6, 0xE8, + 0x25, 0xEA, 0x02, 0x00, 0xE6, 0xE8, 0x2F, 0xEA, + 0x06, 0x00, 0xE6, 0xE8, 0x3A, 0xEA, 0x05, 0x00, + 0xB6, 0xE7, 0x74, 0xEA, 0x36, 0xE8, 0xEC, 0xE6, + 0xD0, 0xE9, 0x56, 0xE7, 0xC6, 0xE8, 0x0C, 0xE7, + 0x92, 0xE7, 0x00, 0x01, 0x00, 0x80, 0xB6, 0xE7, + 0x78, 0xEA, 0x00, 0xE7, 0xFE, 0xE8, 0x52, 0xE8, + 0x80, 0x01, 0x41, 0x8E, 0x4A, 0xE7, 0x92, 0xE7, + 0x00, 0x01, 0x01, 0x1B, 0x06, 0xE9, 0xE4, 0xFF, + 0xB6, 0xE7, 0x7C, 0xEA, 0xBE, 0xE8, 0x18, 0xE7, + 0x56, 0xEA, 0x0C, 0xE7, 0x6A, 0xE8, 0x3C, 0xE7, + 0x00, 0xE0, 0xC6, 0xE8, 0xB6, 0xE7, 0x86, 0xEA, + 0x3C, 0xE7, 0x00, 0xE8, 0x62, 0xE7, 0xB6, 0xE7, + 0x85, 0xEA, 0x3C, 0xE7, 0x00, 0x08, 0xC6, 0xE8, + 0xB6, 0xE7, 0x86, 0xEA, 0x3C, 0xE7, 0x00, 0xF8, + 0x62, 0xE7, 0xB6, 0xE7, 0x85, 0xEA, 0x52, 0xE8, + 0x80, 0x01, 0x00, 0x02, 0x3C, 0xE7, 0x00, 0xE0, + 0x62, 0xE7, 0xB6, 0xE7, 0x85, 0xEA, 0x52, 0xE8, + 0x84, 0x01, 0x00, 0x00, 0x62, 0xE8, 0x34, 0x00, + 0x3C, 0xE7, 0x00, 0x00, 0xC6, 0xE8, 0x62, 0xE8, + 0x34, 0x60, 0x0E, 0xE9, 0x52, 0xE8, 0x84, 0x01, + 0x00, 0x00, 0xB6, 0xE7, 0x86, 0xEA, 0x52, 0xE8, + 0x82, 0x01, 0x00, 0xC8, 0x3C, 0xE7, 0x00, 0xE0, + 0xC6, 0xE8, 0x3C, 0xE7, 0x00, 0x10, 0xC6, 0xE8, + 0x62, 0xE8, 0x34, 0x60, 0x52, 0xE8, 0x80, 0x01, + 0x00, 0x06, 0x3C, 0xE7, 0x10, 0x00, 0x78, 0xE8, + 0x36, 0xE8, 0x52, 0xE8, 0x84, 0x01, 0x00, 0x00, + 0x62, 0xE8, 0x34, 0x00, 0xEC, 0xE6, 0xD0, 0xE9, + 0x18, 0xE7, 0x5C, 0xEA, 0xD0, 0xE8, 0x92, 0xE9, + 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0xF0, + 0x06, 0x00, 0x00, 0xC7, 0xA0, 0xE7, 0xDC, 0xE8, + 0x00, 0xE0, 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, + 0x40, 0xD0, 0x06, 0x00, 0x00, 0xE0, 0xA0, 0xE7, + 0xDC, 0xE8, 0x00, 0xC0, 0x00, 0xE7, 0x0C, 0xE7, + 0x70, 0xE7, 0x40, 0x90, 0x06, 0x00, 0x00, 0xA0, + 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x80, 0x00, 0xE7, + 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x50, 0x06, 0x00, + 0x00, 0x60, 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x40, + 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x10, + 0x06, 0x00, 0x00, 0x20, 0xA0, 0xE7, 0xDC, 0xE8, + 0x00, 0x00, 0xD0, 0xE8, 0x92, 0xE9, 0x00, 0xE7, + 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0xD0, 0x06, 0x00, + 0x00, 0xA6, 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0xC0, + 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x90, + 0x06, 0x00, 0x00, 0xC0, 0xA0, 0xE7, 0xDC, 0xE8, + 0x00, 0x80, 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, + 0x40, 0x50, 0x06, 0x00, 0x00, 0x40, 0xA0, 0xE7, + 0xDC, 0xE8, 0x00, 0x40, 0x00, 0xE7, 0x0C, 0xE7, + 0x70, 0xE7, 0x40, 0x70, 0x06, 0x00, 0x00, 0x60, + 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x60, 0x7E, 0xE9, + 0x90, 0xE9, 0x18, 0xE7, 0x62, 0xEA, 0xEC, 0xE6, + 0xD0, 0xE9, 0xA4, 0xE8, 0x55, 0x55, 0x16, 0x00, + 0x46, 0xE7, 0x92, 0xE7, 0x00, 0x00, 0x00, 0x00, + 0xB6, 0xE7, 0x8B, 0xEA, 0x0A, 0xE8, 0x18, 0xE7, + 0x62, 0xEA, 0x58, 0xE8, 0x55, 0x55, 0x16, 0x00, + 0x00, 0xE7, 0x46, 0xE7, 0xA0, 0xE7, 0x2A, 0xE7, + 0xFF, 0x00, 0x00, 0x08, 0x2A, 0xE7, 0xFF, 0x00, + 0x00, 0x0C, 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x10, + 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x14, 0x2A, 0xE7, + 0xFF, 0x00, 0x00, 0x18, 0x2A, 0xE7, 0xFF, 0x00, + 0x00, 0x1C, 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x20, + 0x2A, 0xE7, 0xFF, 0x00, 0x00, 0x24, 0x2A, 0xE7, + 0xFF, 0x00, 0x00, 0x28, 0x2A, 0xE7, 0xFF, 0x00, + 0x00, 0x2C, 0xD2, 0xE7, 0x00, 0xE7, 0x0C, 0xE7, + 0x70, 0xE7, 0x40, 0x30, 0x06, 0x00, 0x00, 0x01, + 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x20, 0x00, 0xE7, + 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0x70, 0x06, 0x00, + 0x00, 0x43, 0xA0, 0xE7, 0xDC, 0xE8, 0x00, 0x60, + 0x00, 0xE7, 0x0C, 0xE7, 0x70, 0xE7, 0x40, 0xB0, + 0x06, 0x00, 0x00, 0x85, 0xA0, 0xE7, 0xDC, 0xE8, + 0x00, 0xA0, 0xD8, 0xE8, 0x00, 0x01, 0x03, 0x01, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x81, 0x1A, 0x00, + 0x40, 0x10, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x72, 0x82, + 0x4A, 0xA9, 0xA5, 0x5A, 0xDA, 0xE7, 0x03, 0x09, + 0x11, 0x9D, 0x00, 0x00, 0x00, 0x81, 0x04, 0x00, + 0xD8, 0x90, 0x00, 0x10, 0x00, 0x00, 0x00, 0x81, + 0x04, 0x00, 0xD8, 0x90, 0xD8, 0xB4, 0x00, 0x00, + 0x00, 0x81, 0x08, 0x00, 0xD8, 0x90, 0x46, 0x16, + 0x00, 0x40, 0xD8, 0xB4, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x13, 0x00, 0x40, 0x10, 0x16, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x10, 0x00, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x0F, 0x00, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x81, 0x0F, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x12, 0x00, 0x0A, 0x80, + 0x40, 0x9E, 0x00, 0xC8, 0x00, 0x00, 0x5E, 0x80, + 0x0F, 0x00, 0x06, 0x80, 0x40, 0xFE, 0x00, 0xCC, + 0x00, 0x00, 0x04, 0x80, 0x40, 0x8E, 0x00, 0xC9, + 0x04, 0x80, 0x00, 0x06, 0x00, 0xCC, 0x04, 0x80, + 0x40, 0x0A, 0x00, 0xC8, 0x0A, 0x80, 0x40, 0x8A, + 0x00, 0xC8, 0x00, 0x00, 0x5E, 0x80, 0x0F, 0x00, + 0x0A, 0x08, 0x80, 0x1C, 0x0A, 0x00, 0x1C, 0x1A, + 0x00, 0x80, 0x1C, 0x0C, 0x00, 0x80, 0x1C, 0x1A, + 0x00, 0x80, 0x1A, 0x0E, 0x80, 0x1C, 0x04, 0x00, + 0x00, 0x80, 0x80, 0x02, 0x02, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x58, 0x07, 0x0C, 0xB8, + 0x16, 0xE0, 0xE2, 0x08, 0xEC, 0x08, 0xF6, 0x08, + 0x16, 0xE0, 0x00, 0x09, 0x0A, 0x09, 0x00, 0x00, + 0x00, 0x00, 0xE2, 0x08, 0x00, 0x00, 0xEC, 0x08, + 0xF6, 0x08, 0x00, 0x09, 0x00, 0x00, 0xB8, 0x07, + 0xCA, 0xCB, 0x80, 0x02, 0xB8, 0x07, 0xE8, 0xCB, + 0x84, 0xFF, 0xB8, 0x07, 0x0A, 0xCC, 0xB8, 0x07, + 0x84, 0xCC, 0x6E, 0xCD, 0x62, 0xCD, 0x88, 0xCD, + 0x90, 0xCE, 0x84, 0xCD, 0x92, 0xCE, 0x92, 0xCE, + 0x92, 0xCE, 0x8C, 0xCD, 0x96, 0xCD, 0x38, 0xCE, + 0x82, 0xCE, 0x92, 0xCE, 0x92, 0xCE, 0x92, 0xCE, + 0x92, 0xCE, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x08, 0x01, 0x05, 0x08, + 0x08, 0x08, 0x03, 0x08, 0x03, 0x03, 0x03, 0x03, + 0x00, 0x00, 0x04, 0x02, 0x04, 0x04, 0x00, 0x04, + 0x0A, 0x08, 0x00, 0x00, 0x10, 0x0C, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x00, 0x1A, 0x00, 0x00, + 0x04, 0x41, 0x06, 0x0B, 0x08, 0xC2, 0x00, 0xE6, + 0x00, 0xE7, 0x04, 0x06, 0x04, 0x07, 0x04, 0x03, + 0x06, 0x04, 0x04, 0x05, 0x04, 0x88, 0x04, 0xCF, + 0x04, 0xCD, 0x03, 0x00, 0x05, 0x00, 0x1C, 0x00, + 0x00, 0x0C, 0x00, 0x80, 0xD2, 0xD8, 0xDA, 0xD8, + 0x1E, 0xD9, 0xDE, 0xD8, 0xEA, 0xD8, 0xF0, 0xD8, + 0x14, 0xD9, 0xE4, 0xD8, 0x32, 0xD9, 0x00, 0x06, + 0x00, 0x00, 0x03, 0x07, 0x0A, 0x0E, 0x0F, 0x14, + 0x26, 0x2A, 0x52, 0x42, 0x50, 0x48, 0x5D, 0x4D, + 0x62, 0x62, 0x6D, 0x57, 0x46, 0x39, 0x1A, 0x1D, + 0x7C, 0x76, 0x1F, 0x23, 0x15, 0x1D, 0x74, 0x6F, + 0x84, 0x7C, 0x8B, 0x82, 0x92, 0x89, 0x00, 0x00, + 0x32, 0x2F, 0x3F, 0x34, 0x32, 0x01, 0x01, 0x57, + 0x32, 0x11, 0x81, 0x51, 0x02, 0x56, 0x03, 0x55, + 0x54, 0x11, 0x56, 0x81, 0x55, 0x02, 0x54, 0x02, + 0x56, 0x81, 0x01, 0x76, 0x02, 0x34, 0x02, 0x55, + 0x81, 0x54, 0x02, 0x58, 0x02, 0x55, 0x81, 0x54, + 0x02, 0x58, 0x11, 0x12, 0x02, 0x52, 0x58, 0x83, + 0x52, 0x05, 0x83, 0x04, 0x02, 0x58, 0x08, 0x55, + 0x58, 0x83, 0x55, 0x02, 0x81, 0x02, 0x05, 0x58, + 0x03, 0x52, 0x5C, 0x15, 0x53, 0x5B, 0x52, 0x87, + 0x11, 0x03, 0x41, 0x51, 0x78, 0x51, 0x34, 0x11, + 0x81, 0x11, 0x20, 0x31, 0x54, 0x57, 0x01, 0x53, + 0x5A, 0x12, 0x81, 0x51, 0x20, 0x31, 0x5B, 0x57, + 0x01, 0x5A, 0x01, 0x11, 0x51, 0x11, 0x31, 0x81, + 0x57, 0x20, 0x15, 0x01, 0x13, 0x01, 0x11, 0x01, + 0x11, 0x11, 0x81, 0x51, 0x05, 0x58, 0x02, 0x52, + 0x5B, 0x54, 0x5D, 0x81, 0x52, 0x05, 0x54, 0x02, + 0x58, 0x81, 0x50, 0x02, 0x13, 0x03, 0x58, 0x81, + 0x50, 0x02, 0x11, 0x03, 0x81, 0x54, 0x72, 0x5D, + 0x50, 0x03, 0x13, 0x03, 0x13, 0x01, 0x40, 0x54, + 0x0E, 0x00, 0x20, 0x06, 0x56, 0x06, 0x0C, 0xDA, + 0x24, 0x00, 0x02, 0x10, 0x16, 0x00, 0x02, 0x00, + 0x01, 0x04, 0x08, 0x07, 0x0C, 0xDA, 0x20, 0x00, + 0x03, 0x10, 0x12, 0x00, 0x03, 0x00, 0x4E, 0xD9, + 0x14, 0x8E, 0x20, 0x00, 0x04, 0x10, 0x12, 0x00, + 0x04, 0x00, 0xD2, 0xCE, 0x20, 0x00, 0x05, 0xE0, + 0x12, 0x00, 0x05, 0x00, 0xD2, 0xCE, 0x20, 0x00, + 0x06, 0xE0, 0x12, 0x00, 0x06, 0x00, 0xE8, 0xDD, + 0x12, 0x00, 0x01, 0xE0, 0x6C, 0x09, 0xCC, 0x06, + 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x30, 0x06, + 0x42, 0xDC, 0xF0, 0x05, 0x00, 0xE0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xE2, 0x05, 0x08, 0x00, + 0x26, 0xFF, 0xDC, 0x05, 0x00, 0x00, 0x30, 0x06, + 0xF8, 0xDB, 0x1E, 0x00, 0x01, 0xE0, 0x10, 0x00, + 0x11, 0x30, 0x0C, 0x04, 0x01, 0x00, 0x0E, 0x04, + 0x02, 0x00, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x06, 0x32, 0xDD, 0x12, 0x00, 0x01, 0xE0, + 0x04, 0x00, 0x13, 0x30, 0x74, 0xDE, 0x3E, 0x00, + 0x00, 0xE0, 0x00, 0xC0, 0x00, 0x00, 0x02, 0x00, + 0x30, 0x00, 0x20, 0x50, 0x23, 0x0C, 0xFC, 0x05, + 0x52, 0x06, 0x56, 0x06, 0x00, 0x00, 0x00, 0x81, + 0x16, 0x00, 0x00, 0xE0, 0x00, 0xC0, 0x00, 0x00, + 0x10, 0x00, 0x08, 0x00, 0x2A, 0x40, 0x2A, 0x04, + 0x56, 0x06, 0x26, 0x00, 0x19, 0xED, 0x2B, 0x06, + 0x72, 0x09, 0x22, 0x00, 0x24, 0x00, 0x2F, 0xED, + 0x23, 0x0C, 0xFC, 0x05, 0x28, 0x08, 0x34, 0x09, + 0x29, 0x08, 0x58, 0x07, 0x78, 0x07, 0x98, 0x07, + 0x23, 0x00, 0x2A, 0x00, 0x3D, 0xED, 0x06, 0x04, + 0xF0, 0x06, 0x07, 0x04, 0xEE, 0x06, 0x24, 0x00, + 0xD2, 0xCE, 0x34, 0x00, 0x00, 0xE0, 0x00, 0xC0, + 0x00, 0x00, 0x10, 0x00, 0x26, 0x00, 0x25, 0x40, + 0xD2, 0xCE, 0x20, 0x00, 0x00, 0xE0, 0x00, 0xC0, + 0x00, 0x00, 0x10, 0x00, 0x12, 0x00, 0x26, 0x40, + 0xD2, 0xCE, 0x1A, 0x00, 0x00, 0xE0, 0x0C, 0x00, + 0x27, 0x60, 0x0A, 0x08, 0xE6, 0x06, 0xD2, 0xCE, + 0x24, 0x00, 0x00, 0xE0, 0x16, 0x00, 0x28, 0x60, + 0x30, 0x04, 0x06, 0x07, 0x52, 0xCF, 0x00, 0x81, + 0x30, 0x00, 0x00, 0xE0, 0x22, 0x00, 0x29, 0x60, + 0x2D, 0x08, 0x1C, 0x07, 0x2E, 0x08, 0x22, 0x07, + 0x00, 0x00, 0x08, 0x02, 0x06, 0x01, 0x14, 0x06, + 0x18, 0x08, 0x20, 0x0C, 0x26, 0x0E, 0x30, 0x0F, + 0x34, 0x11, 0x3E, 0x12, 0x42, 0x14, 0x46, 0x16, + 0x1C, 0x0A, 0x4A, 0x18, 0x13, 0x03, 0x11, 0x83, + 0x01, 0x11, 0x11, 0x81, 0x12, 0x81, 0x13, 0x01, + 0x52, 0x83, 0x81, 0x85, 0x85, 0x11, 0x12, 0x81, + 0x12, 0x81, 0x19, 0x81, 0x60, 0x85, 0x00, 0xC0, + 0x00, 0x00, 0x08, 0x00, 0x6C, 0x09, 0x00, 0x00, + 0x30, 0x06, 0x08, 0xE5, 0x54, 0x06, 0x50, 0x06, + 0x38, 0x02, 0x21, 0x04, 0x1E, 0x09, 0x0B, 0x06, + 0xD8, 0x06, 0x02, 0x08, 0xDC, 0x06, 0x00, 0xC0, + 0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0x00, 0x41, 0x00, + 0x14, 0xAE, 0x00, 0x00, 0x00, 0x81, 0x09, 0x04, + 0x0C, 0x07, 0x41, 0x00, 0x41, 0x00, 0x14, 0x02, + 0x00, 0x00, 0x00, 0x81, 0x0B, 0x06, 0xD8, 0x06, + 0x2C, 0x06, 0x76, 0x09, 0x22, 0x14, 0x3A, 0x09, + 0x41, 0x00, 0x41, 0x00, 0x54, 0x02, 0x00, 0x00, + 0x00, 0x81, 0xD8, 0x06, 0x00, 0x84, 0x00, 0x48, + 0xFC, 0xFF, 0x09, 0x00, 0x00, 0xC0, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xB8, 0xFF, 0x20, 0x00, + 0x43, 0x28, 0x31, 0x29, 0x38, 0x39, 0x2D, 0x33, + 0x39, 0x38, 0x39, 0x2C, 0x2D, 0x30, 0x38, 0x39, + 0x54, 0x20, 0x78, 0x65, 0x73, 0x61, 0x49, 0x20, + 0x73, 0x6E, 0x72, 0x74, 0x6D, 0x75, 0x6E, 0x65, + 0x73, 0x74, 0x28, 0x0A, 0x29, 0x43, 0x39, 0x31, + 0x33, 0x38, 0x34, 0x2C, 0x35, 0x2C, 0x36, 0x2C, + 0x49, 0x20, 0x4D, 0x42, 0x43, 0x20, 0x72, 0x6F, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF8, 0xFF, 0x01, 0x00, 0x34, 0x90, + 0x00, 0x00, 0xFA, 0xFF, 0x01, 0x00, 0xB8, 0xFF, + 0x00, 0x00, 0xFC, 0xFF, 0x02, 0x00, 0x80, 0x00, + 0x3E, 0xA0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 +}; +#endif /* CONFIG_TMS380TR */ diff --git a/drivers/net/wan/cosa.c b/drivers/net/wan/cosa.c index 863cd4b59..a48c5d31c 100644 --- a/drivers/net/wan/cosa.c +++ b/drivers/net/wan/cosa.c @@ -1,4 +1,4 @@ -/* $Id: cosa.c,v 1.26 1999/07/09 15:02:37 kas Exp $ */ +/* $Id: cosa.c,v 1.28 1999/10/11 21:06:58 kas Exp $ */ /* * Copyright (C) 1995-1997 Jan "Yenya" Kasprzak <kas@fi.muni.cz> @@ -137,8 +137,7 @@ struct channel_data { struct semaphore rsem, wsem; char *rxdata; int rxsize; - wait_queue_head_t txwaitq; - wait_queue_head_t rxwaitq; + wait_queue_head_t txwaitq, rxwaitq; int tx_status, rx_status; /* SPPP/HDLC device parts */ @@ -147,6 +146,11 @@ struct channel_data { struct net_device_stats stats; }; +/* cosa->firmware_status bits */ +#define COSA_FW_RESET (1<<0) /* Is the ROM monitor active? */ +#define COSA_FW_DOWNLOAD (1<<1) /* Is the microcode downloaded? */ +#define COSA_FW_START (1<<2) /* Is the microcode running? */ + struct cosa_data { int num; /* Card number */ char name[COSA_MAX_NAME]; /* Card name - e.g "cosa0" */ @@ -606,6 +610,11 @@ static int cosa_sppp_open(struct net_device *d) struct channel_data *chan = d->priv; int err, flags; + if (!(chan->cosa->firmware_status & COSA_FW_START)) { + printk(KERN_NOTICE "%s: start the firmware first (status %d)\n", + chan->cosa->name, chan->cosa->firmware_status); + return -EPERM; + } spin_lock_irqsave(&chan->cosa->lock, flags); if (chan->usage != 0) { printk(KERN_WARNING "%s: sppp_open called with usage count %d\n", @@ -781,6 +790,11 @@ static ssize_t cosa_read(struct file *file, struct cosa_data *cosa = chan->cosa; char *kbuf; + if (!(cosa->firmware_status & COSA_FW_START)) { + printk(KERN_NOTICE "%s: start the firmware first (status %d)\n", + cosa->name, cosa->firmware_status); + return -EPERM; + } if (down_interruptible(&chan->rsem)) return -ERESTARTSYS; @@ -845,12 +859,17 @@ static int chrdev_rx_done(struct channel_data *chan) static ssize_t cosa_write(struct file *file, const char *buf, size_t count, loff_t *ppos) { - struct channel_data *chan = (struct channel_data *)file->private_data; DECLARE_WAITQUEUE(wait, current); + struct channel_data *chan = (struct channel_data *)file->private_data; struct cosa_data *cosa = chan->cosa; unsigned int flags; char *kbuf; + if (!(cosa->firmware_status & COSA_FW_START)) { + printk(KERN_NOTICE "%s: start the firmware first (status %d)\n", + cosa->name, cosa->firmware_status); + return -EPERM; + } if (down_interruptible(&chan->wsem)) return -ERESTARTSYS; @@ -992,12 +1011,14 @@ static inline int cosa_reset(struct cosa_data *cosa) if (cosa->usage > 1) printk(KERN_INFO "cosa%d: WARNING: reset requested with cosa->usage > 1 (%d). Odd things may happen.\n", cosa->num, cosa->usage); + cosa->firmware_status &= ~(COSA_FW_RESET|COSA_FW_START); if (cosa_reset_and_read_id(cosa, idstring) < 0) { printk(KERN_NOTICE "cosa%d: reset failed\n", cosa->num); return -EIO; } printk(KERN_INFO "cosa%d: resetting device: %s\n", cosa->num, idstring); + cosa->firmware_status |= COSA_FW_RESET; return 0; } @@ -1009,15 +1030,14 @@ static inline int cosa_download(struct cosa_data *cosa, struct cosa_download *d) char *code; if (cosa->usage > 1) - printk(KERN_INFO "cosa%d: WARNING: download of microcode requested with cosa->usage > 1 (%d). Odd things may happen.\n", - cosa->num, cosa->usage); -#if 0 - if (cosa->status != CARD_STATUS_RESETED && cosa->status != CARD_STATUS_DOWNLOADED) { - printk(KERN_NOTICE "cosa%d: reset the card first (status %d).\n", - cosa->num, cosa->status); + printk(KERN_INFO "%s: WARNING: download of microcode requested with cosa->usage > 1 (%d). Odd things may happen.\n", + cosa->name, cosa->usage); + if (!(cosa->firmware_status & COSA_FW_RESET)) { + printk(KERN_NOTICE "%s: reset the card first (status %d).\n", + cosa->name, cosa->firmware_status); return -EPERM; } -#endif + get_user_ret(addr, &(d->addr), -EFAULT); get_user_ret(len, &(d->len), -EFAULT); get_user_ret(code, &(d->code), -EFAULT); @@ -1027,6 +1047,9 @@ static inline int cosa_download(struct cosa_data *cosa, struct cosa_download *d) if (d->len < 0 || d->len > COSA_MAX_FIRMWARE_SIZE) return -EINVAL; + /* If something fails, force the user to reset the card */ + cosa->firmware_status &= ~(COSA_FW_RESET|COSA_FW_DOWNLOAD); + if ((i=download(cosa, d->code, len, addr)) < 0) { printk(KERN_NOTICE "cosa%d: microcode download failed: %d\n", cosa->num, i); @@ -1034,6 +1057,7 @@ static inline int cosa_download(struct cosa_data *cosa, struct cosa_download *d) } printk(KERN_INFO "cosa%d: downloading microcode - 0x%04x bytes at 0x%04x\n", cosa->num, len, addr); + cosa->firmware_status |= COSA_FW_RESET|COSA_FW_DOWNLOAD; return 0; } @@ -1048,18 +1072,19 @@ static inline int cosa_readmem(struct cosa_data *cosa, struct cosa_download *d) printk(KERN_INFO "cosa%d: WARNING: readmem requested with " "cosa->usage > 1 (%d). Odd things may happen.\n", cosa->num, cosa->usage); -#if 0 - if (cosa->status != CARD_STATUS_RESETED && - cosa->status != CARD_STATUS_DOWNLOADED) { - printk(KERN_NOTICE "cosa%d: reset the card first (status %d).\n", - cosa->num, cosa->status); + if (!(cosa->firmware_status & COSA_FW_RESET)) { + printk(KERN_NOTICE "%s: reset the card first (status %d).\n", + cosa->name, cosa->firmware_status); return -EPERM; } -#endif + get_user_ret(addr, &(d->addr), -EFAULT); get_user_ret(len, &(d->len), -EFAULT); get_user_ret(code, &(d->code), -EFAULT); + /* If something fails, force the user to reset the card */ + cosa->firmware_status &= ~COSA_FW_RESET; + if ((i=readmem(cosa, d->code, len, addr)) < 0) { printk(KERN_NOTICE "cosa%d: reading memory failed: %d\n", cosa->num, i); @@ -1067,6 +1092,7 @@ static inline int cosa_readmem(struct cosa_data *cosa, struct cosa_download *d) } printk(KERN_INFO "cosa%d: reading card memory - 0x%04x bytes at 0x%04x\n", cosa->num, len, addr); + cosa->firmware_status |= COSA_FW_RESET; return 0; } @@ -1078,13 +1104,14 @@ static inline int cosa_start(struct cosa_data *cosa, int address) if (cosa->usage > 1) printk(KERN_INFO "cosa%d: WARNING: start microcode requested with cosa->usage > 1 (%d). Odd things may happen.\n", cosa->num, cosa->usage); -#if 0 - if (cosa->status != CARD_STATUS_DOWNLOADED) { - printk(KERN_NOTICE "cosa%d: download the microcode first (status %d).\n", - cosa->num, cosa->status); + + if ((cosa->firmware_status & (COSA_FW_RESET|COSA_FW_DOWNLOAD)) + != (COSA_FW_RESET|COSA_FW_DOWNLOAD)) { + printk(KERN_NOTICE "%s: download the microcode and/or reset the card first (status %d).\n", + cosa->name, cosa->firmware_status); return -EPERM; } -#endif + cosa->firmware_status &= ~COSA_FW_RESET; if ((i=startmicrocode(cosa, address)) < 0) { printk(KERN_NOTICE "cosa%d: start microcode at 0x%04x failed: %d\n", cosa->num, address, i); @@ -1093,6 +1120,7 @@ static inline int cosa_start(struct cosa_data *cosa, int address) printk(KERN_INFO "cosa%d: starting microcode at 0x%04x\n", cosa->num, address); cosa->startaddr = address; + cosa->firmware_status |= COSA_FW_START; return 0; } @@ -1689,9 +1717,11 @@ static inline void tx_interrupt(struct cosa_data *cosa, int status) /* in second pass, accept first ready-to-TX channel */ if (i > cosa->nchannels) { /* Can be safely ignored */ +#ifdef DEBUG_IRQS printk(KERN_DEBUG "%s: Forcing TX " "to not-ready channel %d\n", cosa->name, cosa->txchan); +#endif break; } } diff --git a/drivers/net/wan/cycx_x25.c b/drivers/net/wan/cycx_x25.c index 7e79943c0..40f76b2a5 100644 --- a/drivers/net/wan/cycx_x25.c +++ b/drivers/net/wan/cycx_x25.c @@ -11,6 +11,10 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * ============================================================================ +* 1999/10/09 acme chan_disc renamed to chan_disconnect, +* began adding support for X.25 sockets: +* conf->protocol in new_if +* 1999/10/05 acme fixed return E... to return -E... * 1999/08/10 acme serialized access to the card thru a spinlock * in x25_exec * 1999/08/09 acme removed per channel spinlocks @@ -132,16 +136,19 @@ static int x25_configure (cycx_t *card, TX25Config *conf), x25_connect_response (cycx_t *card, x25_channel_t *chan), x25_disconnect_response (cycx_t *card, u8 link, u8 lcn); -/* Miscellaneous functions */ -static int chan_connect (struct net_device *dev), - chan_send (struct net_device *dev, struct sk_buff *skb); +/* channel functions */ +int chan_connect (struct net_device *dev), + chan_send (struct net_device *dev, struct sk_buff *skb); + +static void chan_disconnect (struct net_device *dev); +/* Miscellaneous functions */ static void set_chan_state (struct net_device *dev, u8 state), - nibble_to_byte (u8 *s, u8 *d, u8 len, u8 nibble), - reset_timer (struct net_device *dev), - chan_disc (struct net_device *dev), chan_timer (unsigned long d); +static void nibble_to_byte (u8 *s, u8 *d, u8 len, u8 nibble), + reset_timer (struct net_device *dev); + static u8 bps_to_speed_code (u32 bps); static u8 log2 (u32 n); @@ -334,7 +341,7 @@ static int new_if (wan_device_t *wandev, struct net_device *dev, wanif_conf_t *c strcpy(chan->name, conf->name); chan->card = card; chan->link = conf->port; - chan->protocol = ETH_P_IP; + chan->protocol = conf->protocol ? ETH_P_X25 : ETH_P_IP; chan->rx_skb = NULL; /* only used in svc connected thru crossover cable */ chan->local_addr = NULL; @@ -353,7 +360,7 @@ static int new_if (wan_device_t *wandev, struct net_device *dev, wanif_conf_t *c if (!chan->local_addr) { kfree(chan); - return ENOMEM; + return -ENOMEM; } } @@ -505,7 +512,7 @@ static int if_close (struct net_device *dev) dev->start = 0; if (chan->state == WAN_CONNECTED || chan->state == WAN_CONNECTING) - chan_disc(dev); + chan_disconnect(dev); cyclomx_close(card); return 0; @@ -763,7 +770,7 @@ static void rx_intr (cycx_t *card, TX25Cmd *cmd) dev->last_rx = jiffies; /* timestamp */ chan->rx_skb = NULL; /* dequeue packet */ - skb->protocol = htons(ETH_P_IP); + skb->protocol = htons(chan->protocol); skb->dev = dev; skb->mac.raw = skb->data; netif_rx(skb); @@ -799,6 +806,7 @@ static void connect_intr (cycx_t *card, TX25Cmd *cmd) dprintk(KERN_INFO "connect_intr:lcn=%d, local=%s, remote=%s\n", lcn, loc, rem); + if ((dev = get_dev_by_dte_addr(wandev, rem)) == NULL) { /* Invalid channel, discard packet */ printk(KERN_INFO "%s: connect not expected: remote %s!\n", @@ -824,6 +832,7 @@ static void connect_confirm_intr (cycx_t *card, TX25Cmd *cmd) cycx_peek(&card->hw, cmd->buf + 1, &key, sizeof(key)); dprintk(KERN_INFO "%s: connect_confirm_intr:lcn=%d, key=%d\n", card->devname, lcn, key); + if ((dev = get_dev_by_lcn(wandev, -key)) == NULL) { /* Invalid channel, discard packet */ clear_bit(--key, (void*)&card->u.x.connection_keys); @@ -1139,10 +1148,8 @@ static int x25_place_call (cycx_t *card, x25_channel_t *chan) if ((err = x25_exec(card, X25_CONNECT_REQUEST, chan->link, &d, 7 + len + 1, NULL, 0)) != 0) clear_bit(--key, (void*)&card->u.x.connection_keys); - else { + else chan->lcn = -key; - chan->protocol = ETH_P_IP; - } return err; } @@ -1229,7 +1236,7 @@ static struct net_device *get_dev_by_dte_addr (wan_device_t *wandev, char *dte) * Return: 0 connected * >0 connection in progress * <0 failure */ -static int chan_connect (struct net_device *dev) +int chan_connect (struct net_device *dev) { x25_channel_t *chan = dev->priv; cycx_t *card = chan->card; @@ -1251,7 +1258,7 @@ static int chan_connect (struct net_device *dev) /* Disconnect logical channel. * o if SVC then clear X.25 call */ -static void chan_disc (struct net_device *dev) +static void chan_disconnect (struct net_device *dev) { x25_channel_t *chan = dev->priv; @@ -1270,7 +1277,7 @@ static void chan_timer (unsigned long d) switch (chan->state) { case WAN_CONNECTED: - chan_disc(dev); + chan_disconnect(dev); break; default: printk (KERN_ERR "%s: chan_timer for svc (%s) not " @@ -1345,7 +1352,7 @@ static void set_chan_state (struct net_device *dev, u8 state) * the packet into 'complete sequence' using M-bit. * 2. When transmission is complete, an event notification should be issued * to the router. */ -static int chan_send (struct net_device *dev, struct sk_buff *skb) +int chan_send (struct net_device *dev, struct sk_buff *skb) { x25_channel_t *chan = dev->priv; cycx_t *card = chan->card; @@ -1473,14 +1480,15 @@ static void x25_dump_devs(wan_device_t *wandev) struct net_device *dev = wandev->dev; printk (KERN_INFO "x25 dev states\n"); - printk (KERN_INFO "name: addr: tbusy:\n"); - printk (KERN_INFO "----------------------------\n"); + printk (KERN_INFO "name: addr: tbusy: protocol:\n"); + printk (KERN_INFO "---------------------------------------\n"); for (; dev; dev = dev->slave) { x25_channel_t *chan = dev->priv; - printk (KERN_INFO "%-5.5s %-15.15s %ld\n", - chan->name, chan->addr, dev->tbusy); + printk (KERN_INFO "%-5.5s %-15.15s %ld ETH_P_%s\n", + chan->name, chan->addr, dev->tbusy, + chan->protocol == ETH_P_IP ? "IP" : "X25"); } } diff --git a/drivers/net/wan/sbni.c b/drivers/net/wan/sbni.c index 9d5fba082..4cf0c05a1 100644 --- a/drivers/net/wan/sbni.c +++ b/drivers/net/wan/sbni.c @@ -1280,10 +1280,12 @@ static int sbni_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) return -EPERM; if(copy_from_user( tmpstr, ifr->ifr_data, 6)) return -EFAULT; - slave=dev_get(tmpstr); + slave = dev_get_by_name(tmpstr); if(!(slave && slave->flags & IFF_UP && dev->flags & IFF_UP)) { printk("%s: Both devices should be UP to enslave!\n",dev->name); + if (slave) + dev_put(slave); return -EINVAL; } @@ -1304,8 +1306,9 @@ static int sbni_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) else { printk("%s: one of devices is already slave!\n",dev->name); - return -EBUSY; + error = -EBUSY; } + dev_put(slave); } else { @@ -1359,7 +1362,7 @@ static int sbni_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) unsigned long calc_crc(char *mem, int len, unsigned initial) { - + unsigned crc, dummy_len; __asm__ ( "xorl %%eax,%%eax\n\t" "1:\n\t" @@ -1367,13 +1370,12 @@ unsigned long calc_crc(char *mem, int len, unsigned initial) "xorb %%dl,%%al\n\t" "shrl $8,%%edx\n\t" "xorl (%%edi,%%eax,4),%%edx\n\t" - "loop 1b\n\t" - "movl %%edx,%%eax" - : - : "S" (mem), "D" (&crc32tab[0]), "c" (len), "d" (initial) - : "eax", "edx", "ecx" + "loop 1b" + : "=d" (crc), "=c" (dummy_len) + : "S" (mem), "D" (&crc32tab[0]), "1" (len), "0" (initial) + : "eax" ); - /* return crc; */ + return crc; } #else diff --git a/drivers/parport/Config.in b/drivers/parport/Config.in index 16a7099c7..812cc1a4c 100644 --- a/drivers/parport/Config.in +++ b/drivers/parport/Config.in @@ -7,41 +7,43 @@ tristate 'Parallel port support' CONFIG_PARPORT if [ "$CONFIG_PARPORT" != "n" ]; then - dep_tristate ' PC-style hardware' CONFIG_PARPORT_PC $CONFIG_PARPORT - if [ "$CONFIG_PARPORT_PC" != "n" ]; then - bool ' Use FIFO/DMA if available' CONFIG_PARPORT_PC_FIFO - fi - if [ "$CONFIG_PARPORT_PC" = "y" ]; then - # Don't bother with this if parport_pc is a module; it only affects - # the presence or not of some __init's, which are no-ops for modules. - bool ' Support for PCMCIA management for PC-style ports' CONFIG_PARPORT_PC_PCMCIA - fi - if [ "$CONFIG_ARM" = "y" ]; then - dep_tristate ' Archimedes hardware' CONFIG_PARPORT_ARC $CONFIG_PARPORT - fi - if [ "$CONFIG_AMIGA" = "y" ]; then - dep_tristate ' Amiga builtin port' CONFIG_PARPORT_AMIGA $CONFIG_PARPORT - if [ "$CONFIG_ZORRO" != "n" ]; then - dep_tristate ' Multiface III parallel port' CONFIG_PARPORT_MFC3 $CONFIG_PARPORT - fi - else - define_bool CONFIG_PARPORT_AMIGA n - define_bool CONFIG_PARPORT_MFC3 n - fi - if [ "$CONFIG_ATARI" = "y" ]; then - dep_tristate ' Atari hardware' CONFIG_PARPORT_ATARI $CONFIG_PARPORT - else - define_bool CONFIG_PARPORT_ATARI n - fi - if [ "$CONFIG_SBUS" = "y" ]; then - dep_tristate ' Sparc hardware (EXPERIMENTAL)' CONFIG_PARPORT_SUNBPP $CONFIG_PARPORT - else - define_bool CONFIG_PARPORT_SUNBPP n - fi + dep_tristate ' PC-style hardware' CONFIG_PARPORT_PC $CONFIG_PARPORT + if [ "$CONFIG_PARPORT_PC" != "n" ]; then + bool ' Use FIFO/DMA if available' CONFIG_PARPORT_PC_FIFO + fi + if [ "$CONFIG_PARPORT_PC" = "y" ]; then + # Don't bother with this if parport_pc is a module; it only affects + # the presence or not of some __init's, which are no-ops for modules. + if [ "$CONFIG_PCMCIA" != "n" ]; then + bool ' Support for PCMCIA management for PC-style ports' CONFIG_PARPORT_PC_PCMCIA + fi + fi + if [ "$CONFIG_ARM" = "y" ]; then + dep_tristate ' Archimedes hardware' CONFIG_PARPORT_ARC $CONFIG_PARPORT + fi + if [ "$CONFIG_AMIGA" = "y" ]; then + dep_tristate ' Amiga builtin port' CONFIG_PARPORT_AMIGA $CONFIG_PARPORT + if [ "$CONFIG_ZORRO" != "n" ]; then + dep_tristate ' Multiface III parallel port' CONFIG_PARPORT_MFC3 $CONFIG_PARPORT + fi + else + define_bool CONFIG_PARPORT_AMIGA n + define_bool CONFIG_PARPORT_MFC3 n + fi + if [ "$CONFIG_ATARI" = "y" ]; then + dep_tristate ' Atari hardware' CONFIG_PARPORT_ATARI $CONFIG_PARPORT + else + define_bool CONFIG_PARPORT_ATARI n + fi + if [ "$CONFIG_SBUS" = "y" ]; then + dep_tristate ' Sparc hardware (EXPERIMENTAL)' CONFIG_PARPORT_SUNBPP $CONFIG_PARPORT + else + define_bool CONFIG_PARPORT_SUNBPP n + fi - # If exactly one hardware type is selected then parport will optimise away - # support for loading any others. Defeat this if the user is keen. - bool ' Support foreign hardware' CONFIG_PARPORT_OTHER + # If exactly one hardware type is selected then parport will optimise away + # support for loading any others. Defeat this if the user is keen. + bool ' Support foreign hardware' CONFIG_PARPORT_OTHER - bool ' IEEE 1284 transfer modes' CONFIG_PARPORT_1284 + bool ' IEEE 1284 transfer modes' CONFIG_PARPORT_1284 fi diff --git a/drivers/parport/ieee1284.c b/drivers/parport/ieee1284.c index 8acf46f58..ba7fc1610 100644 --- a/drivers/parport/ieee1284.c +++ b/drivers/parport/ieee1284.c @@ -278,6 +278,9 @@ int parport_negotiate (struct parport *port, int mode) return -ENOSYS; /* FIXME (implement BECP) */ } + if (mode & IEEE1284_EXT_LINK) + m = 1<<7; /* request extensibility link */ + port->ieee1284.phase = IEEE1284_PH_NEGOTIATION; /* Start off with nStrobe and nAutoFd high, and nSelectIn low */ @@ -354,12 +357,59 @@ int parport_negotiate (struct parport *port, int mode) return 1; } + /* More to do if we've requested extensibility link. */ + if (mode & IEEE1284_EXT_LINK) { + m = mode & 0x7f; + udelay (1); + parport_write_data (port, m); + udelay (1); + + /* Event 51: Set nStrobe low */ + parport_frob_control (port, + PARPORT_CONTROL_STROBE, + PARPORT_CONTROL_STROBE); + + /* Event 53: Set nStrobe high */ + udelay (5); + parport_frob_control (port, + PARPORT_CONTROL_STROBE, + 0); + + /* Event 55: nAck goes high */ + if (parport_wait_peripheral (port, + PARPORT_STATUS_ACK, + PARPORT_STATUS_ACK)) { + /* This shouldn't really happen with a compliant + * device. */ + DPRINTK (KERN_DEBUG + "%s: Mode 0x%02x not supported? (0x%02x)\n", + port->name, mode, + port->ops->read_status (port)); + parport_ieee1284_terminate (port); + return 1; + } + + /* Event 54: Peripheral sets XFlag to reflect support */ + xflag = parport_read_status (port) & PARPORT_STATUS_SELECT; + + /* xflag should be high. */ + if (!xflag) { + /* Extended mode not supported. */ + DPRINTK (KERN_DEBUG "%s: Extended mode 0x%02x not " + "supported\n", port->name, mode); + parport_ieee1284_terminate (port); + return 1; + } + + /* Any further setup is left to the caller. */ + } + /* Mode is supported */ DPRINTK (KERN_DEBUG "%s: In mode 0x%02x\n", port->name, mode); port->ieee1284.mode = mode; /* But ECP is special */ - if (mode & IEEE1284_MODE_ECP) { + if (!(mode & IEEE1284_EXT_LINK) && (mode & IEEE1284_MODE_ECP)) { port->ieee1284.phase = IEEE1284_PH_ECP_SETUP; /* Event 30: Set nAutoFd low */ diff --git a/drivers/parport/parport_pc.c b/drivers/parport/parport_pc.c index a451d85b0..f6516d5b1 100644 --- a/drivers/parport/parport_pc.c +++ b/drivers/parport/parport_pc.c @@ -1207,7 +1207,7 @@ static int __maybe_init parport_ECP_supported(struct parport *pb) outb (ECR_SPP << 5, ECONTROL (pb)); /* Reset FIFO */ outb (0xf4, ECONTROL (pb)); /* Configuration mode */ - config = inb (FIFO (pb)); + config = inb (CONFIGA (pb)); pword = (config >> 4) & 0x7; switch (pword) { case 0: @@ -1230,10 +1230,10 @@ static int __maybe_init parport_ECP_supported(struct parport *pb) priv->pword = pword; printk (KERN_DEBUG "0x%lx: PWord is %d bits\n", pb->base, 8 * pword); - config = inb (CONFIGB (pb)); printk (KERN_DEBUG "0x%lx: Interrupts are ISA-%s\n", pb->base, config & 0x80 ? "Level" : "Pulses"); + config = inb (CONFIGB (pb)); if (!(config & 0x40)) { printk (KERN_WARNING "0x%lx: IRQ conflict!\n", pb->base); pb->irq = PARPORT_IRQ_NONE; @@ -1708,58 +1708,83 @@ static int __init parport_pc_init_pci (int irq, int dma) struct { unsigned int vendor; unsigned int device; + unsigned int subvendor; + unsigned int subdevice; unsigned int numports; struct { unsigned long lo; unsigned long hi; /* -ve if not there */ } addr[4]; } cards[] = { - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_550, 1, - { { 3, 4 }, } }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_650, 1, - { { 3, 4 }, } }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_850, 1, - { { 3, 4 }, } }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1P_10x, 1, - { { 2, 3 }, } }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P_10x, 2, - { { 2, 3 }, { 4, 5 }, } }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_550, 1, - { { 4, 5 }, } }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_650, 1, - { { 4, 5 }, } }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_850, 1, - { { 4, 5 }, } }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1P_20x, 1, - { { 0, 1 }, } }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P_20x, 2, - { { 0, 1 }, { 2, 3 }, } }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_550, 2, - { { 1, 2 }, { 3, 4 }, } }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_650, 2, - { { 1, 2 }, { 3, 4 }, } }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_850, 2, - { { 1, 2 }, { 3, 4 }, } }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_550, 1, - { { 1, 2 }, } }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_650, 1, - { { 1, 2 }, } }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_850, 1, - { { 1, 2 }, } }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_550, 1, - { { 2, 3 }, } }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_650, 1, - { { 2, 3 }, } }, - { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_850, 1, - { { 2, 3 }, } }, - { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_PARALLEL, 1, - { { 0, -1 }, } }, - { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_DUAL_PAR_A, 1, - { { 0, -1 }, } }, - { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_DUAL_PAR_B, 1, - { { 0, -1 }, } }, - { PCI_VENDOR_ID_EXSYS, PCI_DEVICE_ID_EXSYS_4014, 2, - { { 2, -1 }, { 3, -1 }, } }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_550, + PCI_ANY_ID, PCI_ANY_ID, + 1, { { 3, 4 }, } }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_650, + PCI_ANY_ID, PCI_ANY_ID, + 1, { { 3, 4 }, } }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_850, + PCI_ANY_ID, PCI_ANY_ID, + 1, { { 3, 4 }, } }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1P_10x, + PCI_ANY_ID, PCI_ANY_ID, + 1, { { 2, 3 }, } }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P_10x, + PCI_ANY_ID, PCI_ANY_ID, + 2, { { 2, 3 }, { 4, 5 }, } }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_550, + PCI_ANY_ID, PCI_ANY_ID, + 1, { { 4, 5 }, } }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_650, + PCI_ANY_ID, PCI_ANY_ID, + 1, { { 4, 5 }, } }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_10x_850, + PCI_ANY_ID, PCI_ANY_ID, + 1, { { 4, 5 }, } }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1P_20x, + PCI_ANY_ID, PCI_ANY_ID, + 1, { { 0, 1 }, } }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P_20x, + PCI_ANY_ID, PCI_ANY_ID, + 2, { { 0, 1 }, { 2, 3 }, } }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_550, + PCI_ANY_ID, PCI_ANY_ID, + 2, { { 1, 2 }, { 3, 4 }, } }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_650, + PCI_ANY_ID, PCI_ANY_ID, + 2, { { 1, 2 }, { 3, 4 }, } }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2P1S_20x_850, + PCI_ANY_ID, PCI_ANY_ID, + 2, { { 1, 2 }, { 3, 4 }, } }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_550, + PCI_ANY_ID, PCI_ANY_ID, + 1, { { 1, 2 }, } }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_650, + PCI_ANY_ID, PCI_ANY_ID, + 1, { { 1, 2 }, } }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_20x_850, + PCI_ANY_ID, PCI_ANY_ID, + 1, { { 1, 2 }, } }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_550, + PCI_ANY_ID, PCI_ANY_ID, + 1, { { 2, 3 }, } }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_650, + PCI_ANY_ID, PCI_ANY_ID, + 1, { { 2, 3 }, } }, + { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_850, + PCI_ANY_ID, PCI_ANY_ID, + 1, { { 2, 3 }, } }, + { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_PARALLEL, + PCI_ANY_ID, PCI_ANY_ID, + 1, { { 0, -1 }, } }, + { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_DUAL_PAR_A, + PCI_ANY_ID, PCI_ANY_ID, + 1, { { 0, -1 }, } }, + { PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_DUAL_PAR_B, + PCI_ANY_ID, PCI_ANY_ID, + 1, { { 0, -1 }, } }, + { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, + PCI_SUBVENDOR_ID_EXSYS, PCI_SUBDEVICE_ID_EXSYS_4014, + 2, { { 4, -1 }, { 5, -1 }, } }, { 0, } }; @@ -1776,6 +1801,15 @@ static int __init parport_pc_init_pci (int irq, int dma) cards[i].device, pcidev)) != NULL) { int n; + + if (cards[i].subvendor != PCI_ANY_ID && + cards[i].subvendor != pcidev->subsystem_vendor) + continue; + + if (cards[i].subdevice != PCI_ANY_ID && + cards[i].subdevice != pcidev->subsystem_device) + continue; + for (n = 0; n < cards[i].numports; n++) { unsigned long lo = cards[i].addr[n].lo; unsigned long hi = cards[i].addr[n].hi; diff --git a/drivers/pci/devlist.h b/drivers/pci/devlist.h index 276ae40df..6077bc8a5 100644 --- a/drivers/pci/devlist.h +++ b/drivers/pci/devlist.h @@ -1,4 +1,5 @@ VENDOR( COMPAQ, "Compaq" ) + DEVICE( COMPAQ, COMPAQ_TOKENRING, "Token Ring 4/16") DEVICE( COMPAQ, COMPAQ_1280, "QVision 1280/p") DEVICE( COMPAQ, COMPAQ_SMART2P, "Smart-2/P RAID Controller") DEVICE( COMPAQ, COMPAQ_NETEL100,"Netelligent 10/100") @@ -486,6 +487,10 @@ VENDOR( MACRONIX, "Macronix" ) DEVICE( MACRONIX, MACRONIX_MX987x5,"MX98715 / MX98725") ENDVENDOR() +VENDOR( TCONRAD, "Thomas-Conrad" ) + DEVICE( TCONRAD, TCONRAD_TOKENRING, "Token Ring 4/16") +ENDVENDOR() + VENDOR( CERN, "CERN" ) DEVICE( CERN, CERN_SPSB_PMC, "STAR/RD24 SCI-PCI (PMC)") DEVICE( CERN, CERN_SPSB_PCI, "STAR/RD24 SCI-PCI (PMC)") @@ -989,10 +994,6 @@ VENDOR( ATRONICS, "Atronics" ) DEVICE( ATRONICS, ATRONICS_2015, "IDE-2015PL") ENDVENDOR() -VENDOR( EXSYS, "Exsys" ) - DEVICE( EXSYS, EXSYS_4014, "EX-4014") -ENDVENDOR() - VENDOR( TIGERJET, "TigerJet" ) DEVICE( TIGERJET, TIGERJET_300, "Tiger300 ISDN") ENDVENDOR() diff --git a/drivers/pci/pcisyms.c b/drivers/pci/pcisyms.c index d1dcbef71..030e36f3d 100644 --- a/drivers/pci/pcisyms.c +++ b/drivers/pci/pcisyms.c @@ -43,3 +43,5 @@ EXPORT_SYMBOL(pcibios_find_device); /* Quirk info */ EXPORT_SYMBOL(isa_dma_bridge_buggy); +EXPORT_SYMBOL(pci_pci_problems); + diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index d25a0ed29..3a2ae4599 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -56,6 +56,47 @@ static void __init quirk_isa_dma_hangs(struct pci_dev *dev) } } +int pci_pci_problems = 0; + +/* + * Chipsets where PCI->PCI transfers vanish or hang + */ + +static void __init quirk_nopcipci(struct pci_dev *dev) +{ + if((pci_pci_problems&PCIPCI_FAIL)==0) + { + printk(KERN_INFO "Disabling direct PCI/PCI transfers.\n"); + pci_pci_problems|=PCIPCI_FAIL; + } +} + +/* + * Triton requires workarounds to be used by the drivers + */ + +static void __init quirk_triton(struct pci_dev *dev) +{ + if((pci_pci_problems&PCIPCI_TRITON)==0) + { + printk(KERN_INFO "Limiting direct PCI/PCI transfers.\n"); + pci_pci_problems|=PCIPCI_TRITON; + } +} + +/* + * Natoma has some interesting boundary conditions with Zoran stuff + * at least + */ + +static void __init quirk_natoma(struct pci_dev *dev) +{ + if((pci_pci_problems&PCIPCI_NATOMA)==0) + { + printk(KERN_INFO "Limiting direct PCI/PCI transfers.\n"); + pci_pci_problems|=PCIPCI_NATOMA; + } +} /* * S3 868 and 968 chips report region size equal to 32M, but they decode 64M. @@ -79,6 +120,7 @@ static void __init quirk_s3_64M(struct pci_dev *dev) static struct pci_fixup pci_fixups[] __initdata = { { PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82441, quirk_passive_release }, + { PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82441, quirk_passive_release }, /* * Its not totally clear which chipsets are the problematic ones * We know 82C586 and 82C596 variants are affected. @@ -88,6 +130,18 @@ static struct pci_fixup pci_fixups[] __initdata = { { PCI_FIXUP_FINAL, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C596, quirk_isa_dma_hangs }, { PCI_FIXUP_HEADER, PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_868, quirk_s3_64M }, { PCI_FIXUP_HEADER, PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_968, quirk_s3_64M }, + { PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82437, quirk_triton }, + { PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82437VX, quirk_triton }, + { PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82439, quirk_triton }, + { PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82439TX, quirk_triton }, + { PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82441, quirk_natoma }, + { PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443LX_0, quirk_natoma }, + { PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443LX_1, quirk_natoma }, + { PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443BX_0, quirk_natoma }, + { PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443BX_1, quirk_natoma }, + { PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443BX_2, quirk_natoma }, + { PCI_FIXUP_FINAL, PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_5597, quirk_nopcipci }, + { PCI_FIXUP_FINAL, PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_496, quirk_nopcipci }, { 0 } }; diff --git a/drivers/scsi/ChangeLog.ips b/drivers/scsi/ChangeLog.ips new file mode 100644 index 000000000..38848f751 --- /dev/null +++ b/drivers/scsi/ChangeLog.ips @@ -0,0 +1,25 @@ +Change Log +~~~~~~~~~~ + + 1.00.00 - Initial Public Release + - Functionally equivalent to 0.99.05 + + 0.99.05 - Fix an oops on certain passthru commands + + 0.99.04 - Fix race condition in the passthru mechanism + -- this required the interface to the utilities to change + - Fix error recovery code + + 0.99.03 - Make interrupt routine handle all completed request on the + adapter not just the first one + - Make sure passthru commands get woken up if we run out of + SCBs + - Send all of the commands on the queue at once rather than + one at a time since the card will support it. + + 0.99.02 - Added some additional debug statements to print out + errors if an error occurs while trying to read/write + to a logical drive (IPS_DEBUG). + + Fixed read/write errors when the adapter is using an + 8K stripe size. diff --git a/drivers/scsi/ChangeLog.sym53c8xx b/drivers/scsi/ChangeLog.sym53c8xx index 260c6b5aa..9ea77ea71 100644 --- a/drivers/scsi/ChangeLog.sym53c8xx +++ b/drivers/scsi/ChangeLog.sym53c8xx @@ -1,3 +1,14 @@ +Sun Oct 3 19:00 1999 Gerard Roudier (groudier@club-internet.fr) + * version sym53c8xx-1.5f + - Change the way the driver checks the PCI clock frequency, so + that overclocked PCI BUS up to 48 MHz will not be refused. + The more the BUS is overclocked, the less the driver will + guarantee that its measure of the SCSI clock is correct. + - Backport some minor improvements of SCRIPTS from the sym_hipd + driver. + - Backport the code rewrite of the START QUEUE dequeuing (on + bad scsi status received) from the sym_hipd driver. + Sat Sep 11 11:00 1999 Gerard Roudier (groudier@club-internet.fr) * version sym53c8xx-1.5e - New linux-2.3.13 __setup scheme support added. diff --git a/drivers/scsi/Config.in b/drivers/scsi/Config.in index 40518b03b..621045989 100644 --- a/drivers/scsi/Config.in +++ b/drivers/scsi/Config.in @@ -1,19 +1,19 @@ comment 'SCSI support type (disk, tape, CD-ROM)' -dep_tristate 'SCSI disk support' CONFIG_BLK_DEV_SD $CONFIG_SCSI -dep_tristate 'SCSI tape support' CONFIG_CHR_DEV_ST $CONFIG_SCSI -dep_tristate 'SCSI CD-ROM support' CONFIG_BLK_DEV_SR $CONFIG_SCSI +dep_tristate ' SCSI disk support' CONFIG_BLK_DEV_SD $CONFIG_SCSI +dep_tristate ' SCSI tape support' CONFIG_CHR_DEV_ST $CONFIG_SCSI +dep_tristate ' SCSI CD-ROM support' CONFIG_BLK_DEV_SR $CONFIG_SCSI if [ "$CONFIG_BLK_DEV_SR" != "n" ]; then - bool ' Enable vendor-specific extensions (for SCSI CDROM)' CONFIG_BLK_DEV_SR_VENDOR + bool ' Enable vendor-specific extensions (for SCSI CDROM)' CONFIG_BLK_DEV_SR_VENDOR fi -dep_tristate 'SCSI generic support' CONFIG_CHR_DEV_SG $CONFIG_SCSI +dep_tristate ' SCSI generic support' CONFIG_CHR_DEV_SG $CONFIG_SCSI comment 'Some SCSI devices (e.g. CD jukebox) support multiple LUNs' -bool 'Probe all LUNs on each SCSI device' CONFIG_SCSI_MULTI_LUN +bool ' Probe all LUNs on each SCSI device' CONFIG_SCSI_MULTI_LUN -bool 'Verbose SCSI error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS -bool 'SCSI logging facility' CONFIG_SCSI_LOGGING +bool ' Verbose SCSI error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS +bool ' SCSI logging facility' CONFIG_SCSI_LOGGING mainmenu_option next_comment comment 'SCSI low-level drivers' @@ -25,10 +25,10 @@ dep_tristate 'Adaptec AHA1542 support' CONFIG_SCSI_AHA1542 $CONFIG_SCSI dep_tristate 'Adaptec AHA1740 support' CONFIG_SCSI_AHA1740 $CONFIG_SCSI dep_tristate 'Adaptec AIC7xxx support' CONFIG_SCSI_AIC7XXX $CONFIG_SCSI if [ "$CONFIG_SCSI_AIC7XXX" != "n" ]; then - bool ' Enable Tagged Command Queueing (TCQ) by default' CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT - int ' Maximum number of TCQ commands per device' CONFIG_AIC7XXX_CMDS_PER_DEVICE 8 - bool ' Collect statistics to report in /proc' CONFIG_AIC7XXX_PROC_STATS N - int ' Delay in seconds after SCSI bus reset' CONFIG_AIC7XXX_RESET_DELAY 5 + bool ' Enable Tagged Command Queueing (TCQ) by default' CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT + int 'Maximum number of TCQ commands per device' CONFIG_AIC7XXX_CMDS_PER_DEVICE 8 + bool ' Collect statistics to report in /proc' CONFIG_AIC7XXX_PROC_STATS + int 'Delay in seconds after SCSI bus reset' CONFIG_AIC7XXX_RESET_DELAY 5 fi dep_tristate 'IBM ServeRAID support' CONFIG_SCSI_IPS $CONFIG_SCSI dep_tristate 'AdvanSys SCSI support' CONFIG_SCSI_ADVANSYS $CONFIG_SCSI @@ -38,80 +38,81 @@ dep_tristate 'AMI MegaRAID support' CONFIG_SCSI_MEGARAID $CONFIG_SCSI dep_tristate 'BusLogic SCSI support' CONFIG_SCSI_BUSLOGIC $CONFIG_SCSI if [ "$CONFIG_SCSI_BUSLOGIC" != "n" ]; then - bool ' Omit FlashPoint support' CONFIG_SCSI_OMIT_FLASHPOINT + bool ' Omit FlashPoint support' CONFIG_SCSI_OMIT_FLASHPOINT fi dep_tristate 'DTC3180/3280 SCSI support' CONFIG_SCSI_DTC3280 $CONFIG_SCSI dep_tristate 'EATA ISA/EISA/PCI (DPT and generic EATA/DMA-compliant boards) support' CONFIG_SCSI_EATA $CONFIG_SCSI - if [ "$CONFIG_SCSI_EATA" != "n" ]; then - bool ' enable tagged command queueing' CONFIG_SCSI_EATA_TAGGED_QUEUE - bool ' enable elevator sorting' CONFIG_SCSI_EATA_LINKED_COMMANDS - int ' maximum number of queued commands' CONFIG_SCSI_EATA_MAX_TAGS 16 - fi + if [ "$CONFIG_SCSI_EATA" != "n" ]; then + bool ' enable tagged command queueing' CONFIG_SCSI_EATA_TAGGED_QUEUE + bool ' enable elevator sorting' CONFIG_SCSI_EATA_LINKED_COMMANDS + int 'maximum number of queued commands' CONFIG_SCSI_EATA_MAX_TAGS 16 + fi dep_tristate 'EATA-DMA [Obsolete] (DPT, NEC, AT&T, SNI, AST, Olivetti, Alphatronix) support' CONFIG_SCSI_EATA_DMA $CONFIG_SCSI dep_tristate 'EATA-PIO (old DPT PM2001, PM2012A) support' CONFIG_SCSI_EATA_PIO $CONFIG_SCSI dep_tristate 'Future Domain 16xx SCSI/AHA-2920A support' CONFIG_SCSI_FUTURE_DOMAIN $CONFIG_SCSI if [ "$CONFIG_MCA" = "y" ]; then - dep_tristate 'Future Domain MCS-600/700 SCSI support' CONFIG_SCSI_FD_MCS $CONFIG_SCSI + dep_tristate 'Future Domain MCS-600/700 SCSI support' CONFIG_SCSI_FD_MCS $CONFIG_SCSI fi dep_tristate 'GDT SCSI Disk Array Controller support' CONFIG_SCSI_GDTH $CONFIG_SCSI dep_tristate 'Generic NCR5380/53c400 SCSI support' CONFIG_SCSI_GENERIC_NCR5380 $CONFIG_SCSI if [ "$CONFIG_SCSI_GENERIC_NCR5380" != "n" ]; then - bool ' Enable NCR53c400 extensions' CONFIG_SCSI_GENERIC_NCR53C400 - choice 'NCR5380/53c400 mapping method (use Port for T130B)' \ + bool ' Enable NCR53c400 extensions' CONFIG_SCSI_GENERIC_NCR53C400 + choice 'NCR5380/53c400 mapping method (use Port for T130B)' \ "Port CONFIG_SCSI_G_NCR5380_PORT \ - Memory CONFIG_SCSI_G_NCR5380_MEM" Port + Memory CONFIG_SCSI_G_NCR5380_MEM" Port fi if [ "$CONFIG_PCI" = "y" ]; then - dep_tristate 'Initio 9100U(W) support' CONFIG_SCSI_INITIO $CONFIG_SCSI - dep_tristate 'Initio INI-A100U2W support' CONFIG_SCSI_INIA100 $CONFIG_SCSI + dep_tristate 'Initio 9100U(W) support' CONFIG_SCSI_INITIO $CONFIG_SCSI + dep_tristate 'Initio INI-A100U2W support' CONFIG_SCSI_INIA100 $CONFIG_SCSI fi if [ "$CONFIG_PARPORT" != "n" ]; then - dep_tristate 'IOMEGA parallel port (ppa - older drives)' CONFIG_SCSI_PPA $CONFIG_SCSI $CONFIG_PARPORT - dep_tristate 'IOMEGA parallel port (imm - newer drives)' CONFIG_SCSI_IMM $CONFIG_SCSI $CONFIG_PARPORT - if [ "$CONFIG_SCSI_PPA" != "n" -o "$CONFIG_SCSI_IMM" != "n" ]; then - bool ' ppa/imm option - Use slow (but safe) EPP-16' CONFIG_SCSI_IZIP_EPP16 - bool ' ppa/imm option - Assume slow parport control register' CONFIG_SCSI_IZIP_SLOW_CTR - fi + dep_tristate 'IOMEGA parallel port (ppa - older drives)' CONFIG_SCSI_PPA $CONFIG_SCSI $CONFIG_PARPORT + dep_tristate 'IOMEGA parallel port (imm - newer drives)' CONFIG_SCSI_IMM $CONFIG_SCSI $CONFIG_PARPORT + if [ "$CONFIG_SCSI_PPA" != "n" -o "$CONFIG_SCSI_IMM" != "n" ]; then + bool ' ppa/imm option - Use slow (but safe) EPP-16' CONFIG_SCSI_IZIP_EPP16 + bool ' ppa/imm option - Assume slow parport control register' CONFIG_SCSI_IZIP_SLOW_CTR + fi fi dep_tristate 'NCR53c406a SCSI support' CONFIG_SCSI_NCR53C406A $CONFIG_SCSI dep_tristate 'symbios 53c416 SCSI support' CONFIG_SCSI_SYM53C416 $CONFIG_SCSI +dep_tristate 'Simple 53c710 SCSI support (Compaq, NCR machines)' CONFIG_SCSI_SIM710 $CONFIG_SCSI if [ "$CONFIG_PCI" = "y" ]; then - dep_tristate 'NCR53c7,8xx SCSI support' CONFIG_SCSI_NCR53C7xx $CONFIG_SCSI - if [ "$CONFIG_SCSI_NCR53C7xx" != "n" ]; then - bool ' always negotiate synchronous transfers' CONFIG_SCSI_NCR53C7xx_sync - bool ' allow FAST-SCSI [10MHz]' CONFIG_SCSI_NCR53C7xx_FAST - bool ' allow DISCONNECT' CONFIG_SCSI_NCR53C7xx_DISCONNECT - fi + dep_tristate 'NCR53c7,8xx SCSI support' CONFIG_SCSI_NCR53C7xx $CONFIG_SCSI + if [ "$CONFIG_SCSI_NCR53C7xx" != "n" ]; then + bool ' always negotiate synchronous transfers' CONFIG_SCSI_NCR53C7xx_sync + bool ' allow FAST-SCSI [10MHz]' CONFIG_SCSI_NCR53C7xx_FAST + bool ' allow DISCONNECT' CONFIG_SCSI_NCR53C7xx_DISCONNECT + fi fi if [ "$CONFIG_PCI" = "y" -a "$CONFIG_SCSI_NCR53C7xx" != "y" ]; then - dep_tristate 'NCR53C8XX SCSI support' CONFIG_SCSI_NCR53C8XX $CONFIG_SCSI - dep_tristate 'SYM53C8XX SCSI support' CONFIG_SCSI_SYM53C8XX $CONFIG_SCSI - if [ "$CONFIG_SCSI_NCR53C8XX" != "n" -o "$CONFIG_SCSI_SYM53C8XX" != "n" ]; then - int ' default tagged command queue depth' CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS 8 - int ' maximum number of queued commands' CONFIG_SCSI_NCR53C8XX_MAX_TAGS 32 - int ' synchronous transfers frequency in MHz' CONFIG_SCSI_NCR53C8XX_SYNC 20 - bool ' enable profiling' CONFIG_SCSI_NCR53C8XX_PROFILE - bool ' use normal IO' CONFIG_SCSI_NCR53C8XX_IOMAPPED - if [ "$CONFIG_SCSI_SYM53C8XX" != "n" ]; then - bool ' include support for the NCR PQS/PDS SCSI card' CONFIG_SCSI_NCR53C8XX_PQS_PDS - fi - if [ "$CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS" = "0" ]; then - bool ' not allow targets to disconnect' CONFIG_SCSI_NCR53C8XX_NO_DISCONNECT - fi - if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then - bool ' assume boards are SYMBIOS compatible' CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT - fi - fi + dep_tristate 'NCR53C8XX SCSI support' CONFIG_SCSI_NCR53C8XX $CONFIG_SCSI + dep_tristate 'SYM53C8XX SCSI support' CONFIG_SCSI_SYM53C8XX $CONFIG_SCSI + if [ "$CONFIG_SCSI_NCR53C8XX" != "n" -o "$CONFIG_SCSI_SYM53C8XX" != "n" ]; then + int 'default tagged command queue depth' CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS 8 + int 'maximum number of queued commands' CONFIG_SCSI_NCR53C8XX_MAX_TAGS 32 + int 'synchronous transfers frequency in MHz' CONFIG_SCSI_NCR53C8XX_SYNC 20 + bool ' enable profiling' CONFIG_SCSI_NCR53C8XX_PROFILE + bool ' use normal IO' CONFIG_SCSI_NCR53C8XX_IOMAPPED + if [ "$CONFIG_SCSI_SYM53C8XX" != "n" ]; then + bool ' include support for the NCR PQS/PDS SCSI card' CONFIG_SCSI_NCR53C8XX_PQS_PDS + fi + if [ "$CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS" = "0" ]; then + bool ' not allow targets to disconnect' CONFIG_SCSI_NCR53C8XX_NO_DISCONNECT + fi + if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then + bool ' assume boards are SYMBIOS compatible (EXPERIMENTAL)' CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT + fi + fi fi if [ "$CONFIG_MCA" = "y" ]; then - dep_tristate 'IBMMCA SCSI support' CONFIG_SCSI_IBMMCA $CONFIG_SCSI - if [ "$CONFIG_SCSI_IBMMCA" != "n" ]; then - bool ' Standard SCSI-order' CONFIG_IBMMCA_SCSI_ORDER_STANDARD - bool ' Reset SCSI-devices at boottime' CONFIG_IBMMCA_SCSI_DEV_RESET - fi + dep_tristate 'IBMMCA SCSI support' CONFIG_SCSI_IBMMCA $CONFIG_SCSI + if [ "$CONFIG_SCSI_IBMMCA" != "n" ]; then + bool ' Standard SCSI-order' CONFIG_IBMMCA_SCSI_ORDER_STANDARD + bool ' Reset SCSI-devices at boottime' CONFIG_IBMMCA_SCSI_DEV_RESET + fi fi if [ "$CONFIG_MCA" = "y" ]; then - dep_tristate 'NCR MCA 53C9x SCSI support' CONFIG_SCSI_MCA_53C9X $CONFIG_SCSI + dep_tristate 'NCR MCA 53C9x SCSI support' CONFIG_SCSI_MCA_53C9X $CONFIG_SCSI fi dep_tristate 'PAS16 SCSI support' CONFIG_SCSI_PAS16 $CONFIG_SCSI dep_tristate 'PCI2000 support' CONFIG_SCSI_PCI2000 $CONFIG_SCSI @@ -119,22 +120,22 @@ dep_tristate 'PCI2220i support' CONFIG_SCSI_PCI2220I $CONFIG_SCSI dep_tristate 'PSI240i support' CONFIG_SCSI_PSI240I $CONFIG_SCSI dep_tristate 'Qlogic FAS SCSI support' CONFIG_SCSI_QLOGIC_FAS $CONFIG_SCSI if [ "$CONFIG_PCI" = "y" ]; then - dep_tristate 'Qlogic ISP SCSI support' CONFIG_SCSI_QLOGIC_ISP $CONFIG_SCSI - dep_tristate 'Qlogic ISP FC SCSI support' CONFIG_SCSI_QLOGIC_FC $CONFIG_SCSI + dep_tristate 'Qlogic ISP SCSI support' CONFIG_SCSI_QLOGIC_ISP $CONFIG_SCSI + dep_tristate 'Qlogic ISP FC SCSI support' CONFIG_SCSI_QLOGIC_FC $CONFIG_SCSI fi dep_tristate 'Seagate ST-02 and Future Domain TMC-8xx SCSI support' CONFIG_SCSI_SEAGATE $CONFIG_SCSI if [ "$CONFIG_PCI" = "y" ]; then - dep_tristate 'Tekram DC390(T) and Am53/79C974 SCSI support' CONFIG_SCSI_DC390T $CONFIG_SCSI - if [ "$CONFIG_SCSI_DC390T" != "n" ]; then - bool ' _omit_ support for non-DC390 adapters' CONFIG_SCSI_DC390T_NOGENSUPP - fi + dep_tristate 'Tekram DC390(T) and Am53/79C974 SCSI support' CONFIG_SCSI_DC390T $CONFIG_SCSI + if [ "$CONFIG_SCSI_DC390T" != "n" ]; then + bool ' _omit_ support for non-DC390 adapters' CONFIG_SCSI_DC390T_NOGENSUPP + fi fi dep_tristate 'Trantor T128/T128F/T228 SCSI support' CONFIG_SCSI_T128 $CONFIG_SCSI dep_tristate 'UltraStor 14F/34F support' CONFIG_SCSI_U14_34F $CONFIG_SCSI - if [ "$CONFIG_SCSI_U14_34F" != "n" ]; then - bool ' enable elevator sorting' CONFIG_SCSI_U14_34F_LINKED_COMMANDS - int ' maximum number of queued commands' CONFIG_SCSI_U14_34F_MAX_TAGS 8 - fi + if [ "$CONFIG_SCSI_U14_34F" != "n" ]; then + bool ' enable elevator sorting' CONFIG_SCSI_U14_34F_LINKED_COMMANDS + int 'maximum number of queued commands' CONFIG_SCSI_U14_34F_MAX_TAGS 8 + fi dep_tristate 'UltraStor SCSI support' CONFIG_SCSI_ULTRASTOR $CONFIG_SCSI # # Note - this is a very special 'host' adapter that simulates the presence of some disks. @@ -145,19 +146,19 @@ dep_tristate 'UltraStor SCSI support' CONFIG_SCSI_ULTRASTOR $CONFIG_SCSI # simulate various conditions that I am testing. # if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then - dep_tristate 'SCSI debugging host adapter' CONFIG_SCSI_DEBUG $CONFIG_SCSI + dep_tristate 'SCSI debugging host simulator (EXPERIMENTAL)' CONFIG_SCSI_DEBUG $CONFIG_SCSI fi if [ "$CONFIG_PPC" = "y" ]; then - dep_tristate 'MESH (Power Mac internal SCSI) support' CONFIG_SCSI_MESH $CONFIG_SCSI - if [ "$CONFIG_SCSI_MESH" != "n" ]; then - int ' maximum synchronous transfer rate (MB/s) (0 = async)' CONFIG_SCSI_MESH_SYNC_RATE 5 - fi - dep_tristate '53C94 (Power Mac external SCSI) support' CONFIG_SCSI_MAC53C94 $CONFIG_SCSI + dep_tristate 'MESH (Power Mac internal SCSI) support' CONFIG_SCSI_MESH $CONFIG_SCSI + if [ "$CONFIG_SCSI_MESH" != "n" ]; then + int 'maximum synchronous transfer rate (MB/s) (0 = async)' CONFIG_SCSI_MESH_SYNC_RATE 5 + fi + dep_tristate '53C94 (Power Mac external SCSI) support' CONFIG_SCSI_MAC53C94 $CONFIG_SCSI fi if [ "$CONFIG_ARCH_ACORN" = "y" ]; then - source drivers/acorn/scsi/Config.in + source drivers/acorn/scsi/Config.in fi if [ "$CONFIG_MIPS_JAZZ" = "y" ]; then - bool 'MIPS JAZZ FAS216 SCSI support' CONFIG_JAZZ_ESP + bool 'MIPS JAZZ FAS216 SCSI support' CONFIG_JAZZ_ESP fi endmenu diff --git a/drivers/scsi/aha152x.c b/drivers/scsi/aha152x.c index 6fc7e3f24..5c011500a 100644 --- a/drivers/scsi/aha152x.c +++ b/drivers/scsi/aha152x.c @@ -344,6 +344,8 @@ #include <linux/ioport.h> #include <linux/proc_fs.h> #include <linux/interrupt.h> +#include <linux/init.h> +#include <linux/kernel.h> #include "aha152x.h" #include <linux/stat.h> @@ -714,6 +716,7 @@ static int getphase(struct Scsi_Host *shpnt) } } +#if 0 /* called from init/main.c */ void aha152x_setup(char *str, int *ints) { @@ -742,6 +745,29 @@ void aha152x_setup(char *str, int *ints) } else setup_count++; } +#endif + +static int __init do_aha152x_setup (char * str) +{ + if (setup_count > 2) { + printk(KERN_ERR"aha152x: you can only configure up to two +controllers\n"); + return 0; + } + + setup[setup_count].conf = str; + get_option(&str,&setup[setup_count].io_port); + get_option(&str,&setup[setup_count].irq); + get_option(&str,&setup[setup_count].scsiid); + get_option(&str,&setup[setup_count].reconnect); + + setup_count++; + return 1; +} + +#ifndef MODULE +__setup("aha152x=",do_aha152x_setup); +#endif /* * Test, if port_base is valid. diff --git a/drivers/scsi/mac53c94.c b/drivers/scsi/mac53c94.c index 5f883856b..5afba45d5 100644 --- a/drivers/scsi/mac53c94.c +++ b/drivers/scsi/mac53c94.c @@ -85,7 +85,9 @@ mac53c94_detect(Scsi_Host_Template *tp) if (host == 0) panic("couldn't register 53c94 host"); host->unique_id = nfscs; +#ifndef MODULE note_scsi_host(node, host); +#endif state = (struct fsc_state *) host->hostdata; if (state == 0) diff --git a/drivers/scsi/mac53c94.h b/drivers/scsi/mac53c94.h index 914e89cf9..3aed6ae0c 100644 --- a/drivers/scsi/mac53c94.h +++ b/drivers/scsi/mac53c94.h @@ -28,6 +28,7 @@ int mac53c94_reset(Scsi_Cmnd *, unsigned int); sg_tablesize: SG_ALL, \ cmd_per_lun: 1, \ use_clustering: DISABLE_CLUSTERING, \ + use_new_eh_code: 1, \ } /* diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index 30b1d77bf..4663d694b 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c @@ -1762,33 +1762,21 @@ void scsi_error_handler(void *data) int rtn; DECLARE_MUTEX_LOCKED(sem); unsigned long flags; - struct fs_struct *fs; + + siginitsetinv(¤t->blocked, SHUTDOWN_SIGS); lock_kernel(); /* - * If we were started as result of loading a module, close all of the - * user space pages. We don't need them, and if we didn't close them - * they would be locked into memory. + * Flush resources */ - exit_mm(current); - - current->session = 1; - current->pgrp = 1; - - /* Become as one with the init task */ - - exit_fs(current); /* current->fs->count--; */ - fs = init_task.fs; - current->fs = fs; - atomic_inc(&fs->count); - - siginitsetinv(¤t->blocked, SHUTDOWN_SIGS); - - + + daemonize(); + /* * Set the name of this process. */ + sprintf(current->comm, "scsi_eh_%d", host->host_no); host->eh_wait = &sem; diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index 6ba9a2dd5..22aa1cd8e 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c @@ -861,7 +861,6 @@ void get_sectorsize(int i) unsigned char *buffer; int the_result, retries; Scsi_Cmnd *SCpnt; - unsigned long flags; buffer = (unsigned char *) scsi_malloc(512); SCpnt = scsi_allocate_device(NULL, scsi_CDs[i].device, 1); @@ -1031,7 +1030,6 @@ static int sr_packet(struct cdrom_device_info *cdi, struct cdrom_generic_command { Scsi_Cmnd *SCpnt; Scsi_Device *device = scsi_CDs[MINOR(cdi->dev)].device; - unsigned long flags; int stat; /* get the device */ diff --git a/drivers/scsi/sym53c8xx.c b/drivers/scsi/sym53c8xx.c index 4479532b6..83776573c 100644 --- a/drivers/scsi/sym53c8xx.c +++ b/drivers/scsi/sym53c8xx.c @@ -55,7 +55,7 @@ */ /* -** Sep 10 1999, sym53c8xx 1.5e +** October 3 1999, sym53c8xx 1.5f ** ** Supported SCSI features: ** Synchronous data transfers @@ -83,7 +83,7 @@ /* ** Name and version of the driver */ -#define SCSI_NCR_DRIVER_NAME "sym53c8xx - version 1.5e" +#define SCSI_NCR_DRIVER_NAME "sym53c8xx - version 1.5f" /* #define DEBUG_896R1 */ #define SCSI_NCR_OPTIMIZE_896 @@ -1847,6 +1847,16 @@ struct ncb { u_long clock_khz; /* SCSI clock frequency in KHz */ /*---------------------------------------------------------------- + ** Range for the PCI clock frequency measurement result + ** that ensures the algorithm used by the driver can be + ** trusted for the SCSI clock frequency measurement. + ** (Assuming a PCI clock frequency of 33 MHz). + **---------------------------------------------------------------- + */ + u_int pciclock_min; + u_int pciclock_max; + + /*---------------------------------------------------------------- ** Start queue management. ** It is filled up by the host processor and accessed by the ** SCRIPTS processor in order to start SCSI commands. @@ -1993,7 +2003,7 @@ struct ncb { ** of 825A, 875, 876, 895, 895A and 896 chips. */ struct script { - ncrcmd start [ 18]; + ncrcmd start [ 14]; ncrcmd getjob_begin [ 4]; ncrcmd getjob_end [ 4]; ncrcmd select [ 8]; @@ -2114,7 +2124,7 @@ struct scripth { ncrcmd bad_identify [ 12]; ncrcmd bad_i_t_l [ 4]; ncrcmd bad_i_t_l_q [ 4]; - ncrcmd bad_status [ 10]; + ncrcmd bad_status [ 6]; ncrcmd tweak_pmj [ 12]; ncrcmd pm_handle [ 20]; ncrcmd pm_handle1 [ 4]; @@ -2319,15 +2329,14 @@ static struct script script0 __initdata = { */ SCR_FROM_REG (istat), 0, - SCR_JUMPR ^ IFFALSE (MASK (SEM, SEM)), - 16, /* ** Report to the C code the next position in ** the start queue the SCRIPTS will schedule. + ** The C code must not change SCRATCHA. */ SCR_LOAD_ABS (scratcha, 4), PADDRH (startpos), - SCR_INT, + SCR_INT ^ IFTRUE (MASK (SEM, SEM)), SIR_SCRIPT_STOPPED, /* @@ -2344,8 +2353,6 @@ static struct script script0 __initdata = { ** may happen that the job address is not yet in the DSA ** and the the next queue position points to the next JOB. */ - SCR_LOAD_ABS (scratcha, 4), - PADDRH (startpos), SCR_LOAD_ABS (dsa, 4), PADDRH (startpos), SCR_LOAD_REL (temp, 4), @@ -3755,17 +3762,14 @@ static struct scripth scripth0 __initdata = { PADDRH (abort_resel), }/*-------------------------< BAD_STATUS >-----------------*/,{ /* - ** If command resulted in either QUEUE FULL, - ** CHECK CONDITION or COMMAND TERMINATED, - ** call the C code. + ** Anything different from INTERMEDIATE + ** CONDITION MET should be a bad SCSI status, + ** given that GOOD status has already been tested. + ** Call the C code. */ SCR_LOAD_ABS (scratcha, 4), PADDRH (startpos), - SCR_INT ^ IFTRUE (DATA (S_QUEUE_FULL)), - SIR_BAD_STATUS, - SCR_INT ^ IFTRUE (DATA (S_CHECK_COND)), - SIR_BAD_STATUS, - SCR_INT ^ IFTRUE (DATA (S_TERMINATED)), + SCR_INT ^ IFFALSE (DATA (S_COND_MET)), SIR_BAD_STATUS, SCR_RETURN, 0, @@ -5181,15 +5185,48 @@ printk(KERN_INFO NAME53C "%s-%d: rev=0x%02x, base=0x%lx, io_port=0x%lx, irq=%d\n (void) ncr_prepare_setting(np, nvram); /* - ** Check the PCI clock frequency. - ** Must be done after prepare_setting since it - ** destroys STEST1 that is used to probe for - ** the clock doubler. - */ - i = (int) ncr_getpciclock(np); - if (i > 37000) { - printk(KERN_ERR "%s: PCI clock seems too high (%u KHz).\n", - ncr_name(np), i); + ** Check the PCI clock frequency if needed. + ** + ** Must be done after ncr_prepare_setting since it destroys + ** STEST1 that is used to probe for the clock multiplier. + ** + ** The range is currently [22688 - 45375 Khz], given + ** the values used by ncr_getclock(). + ** This calibration of the frequecy measurement + ** algorithm against the PCI clock frequency is only + ** performed if the driver has had to measure the SCSI + ** clock due to other heuristics not having been enough + ** to deduce the SCSI clock frequency. + ** + ** When the chip has been initialized correctly by the + ** SCSI BIOS, the driver deduces the presence of the + ** clock multiplier and the value of the SCSI clock from + ** initial values of IO registers, and therefore no + ** clock measurement is performed. + ** Normally the driver should never have to measure any + ** clock, unless the controller may use a 80 MHz clock + ** or has a clock multiplier and any of the following + ** condition is met: + ** + ** - No SCSI BIOS is present. + ** - SCSI BIOS did'nt enable the multiplier for some reason. + ** - User has disabled the controller from the SCSI BIOS. + ** - User booted the O/S from another O/S that did'nt enable + ** the multiplier for some reason. + ** + ** As a result, the driver may only have to measure some + ** frequency in very unusual situations. + ** + ** For this reality test against the PCI clock to really + ** protect against flaws in the udelay() calibration or + ** driver problem that affect the clock measurement + ** algorithm, the actual PCI clock frequency must be 33 MHz. + */ + i = np->pciclock_max ? ncr_getpciclock(np) : 0; + if (i && (i < np->pciclock_min || i > np->pciclock_max)) { + printk(KERN_ERR "%s: PCI clock (%u KHz) is out of range " + "[%u KHz - %u KHz].\n", + ncr_name(np), i, np->pciclock_min, np->pciclock_max); goto attach_error; } @@ -8509,82 +8546,64 @@ static void ncr_sir_to_redo(ncb_p np, int num, ccb_p cp) u_int32 startp; u_char s_status = INB (SS_PRT); int msglen; + int i, j; + /* + ** If the LCB is not yet available, then only + ** 1 IO is accepted, so we should have it. + */ + if (!lp) + goto next; + /* ** Remove all CCBs queued to the chip for that LUN and put ** them back in the LUN CCB wait queue. */ - if (lp) { - int i = np->squeueput; - int j = (INL (nc_scratcha) - vtobus(np->squeue)) / 4; - int k = np->squeueput; - - busyccbs = lp->queuedccbs; - while (1) { - if (i == j) - break; - if (i == 0) - i = MAX_START*2; - i = i - 2; - cp2 = ncr_ccb_from_dsa(np, scr_to_cpu(np->squeue[i])); - if (!cp2) - continue; - if (cp2->target != cp->target || cp2->lun != cp->lun) - continue; + busyccbs = lp->queuedccbs; + i = (INL (nc_scratcha) - vtobus(np->squeue)) / 4; + j = i; + while (i != np->squeueput) { + cp2 = ncr_ccb_from_dsa(np, scr_to_cpu(np->squeue[i])); + assert(cp2); #ifdef SCSI_NCR_IARB_SUPPORT - cp2->host_flags &= ~HF_HINT_IARB; - if (cp2 == np->last_cp) - np->last_cp = 0; + /* IARB hints may not be relevant any more. Forget them. */ + cp2->host_flags &= ~HF_HINT_IARB; #endif + if (cp2 && cp2->target == cp->target && cp2->lun == cp->lun) { xpt_remque(&cp2->link_ccbq); xpt_insque_head(&cp2->link_ccbq, &lp->wait_ccbq); --lp->queuedccbs; cp2->queued = 0; - np->squeue[i] = DSA_INVALID; - k = i; } + else { + if (i != j) + np->squeue[j] = np->squeue[i]; + if ((j += 2) >= MAX_START*2) j = 0; + } + if ((i += 2) >= MAX_START*2) i = 0; + } + if (i != j) /* Copy back the idle task if needed */ + np->squeue[j] = np->squeue[i]; + np->squeueput = j; /* Update our current start queue pointer */ - /* - ** Requeue the interrupted CCB in front of - ** the LUN CCB wait queue. - */ -#ifdef SCSI_NCR_IARB_SUPPORT - cp->host_flags &= ~HF_HINT_IARB; - if (cp == np->last_cp) - np->last_cp = 0; -#endif - xpt_remque(&cp->link_ccbq); - xpt_insque_head(&cp->link_ccbq, &lp->wait_ccbq); - --lp->queuedccbs; - cp->queued = 0; + /* + ** Requeue the interrupted CCB in front of the + ** LUN CCB wait queue to preserve ordering. + */ + xpt_remque(&cp->link_ccbq); + xpt_insque_head(&cp->link_ccbq, &lp->wait_ccbq); + --lp->queuedccbs; + cp->queued = 0; + +next: #ifdef SCSI_NCR_IARB_SUPPORT - if (np->last_cp) - np->last_cp->host_flags &= ~HF_HINT_IARB; + /* IARB hint may not be relevant any more. Forget it. */ + cp->host_flags &= ~HF_HINT_IARB; + if (np->last_cp) + np->last_cp = 0; #endif - /* - ** Repair the startqueue if necessary. - */ - if (k != np->squeueput) { - j = k; - while (1) { - j += 2; - if (j >= MAX_START*2) - j = 0; - if (np->squeue[j] == DSA_INVALID) - continue; - np->squeue[k] = np->squeue[j]; - if (j == np->squeueput) - break; - k += 2; - if (k >= MAX_START*2) - k = 0; - } - np->squeueput = k; - } - } - /* ** Now we can restart the SCRIPTS processor safely. */ @@ -8592,7 +8611,10 @@ static void ncr_sir_to_redo(ncb_p np, int num, ccb_p cp) OUTL (nc_dsp, NCB_SCRIPT_PHYS (np, start)); switch(s_status) { - default: /* Just for safety, should never happen */ + default: + case S_BUSY: + ncr_complete(np, cp); + break; case S_QUEUE_FULL: if (!lp || !lp->queuedccbs) { ncr_complete(np, cp); @@ -8951,6 +8973,7 @@ static void ncr_sir_task_recovery(ncb_p np, int num) assert(k != -1); if (k != 1) { np->squeue[k] = np->squeue[i]; /* Idle task */ + np->squeueput = k; /* Start queue pointer */ cp->host_status = HS_ABORTED; cp->scsi_status = S_ILLEGAL; ncr_complete(np, cp); @@ -10944,11 +10967,18 @@ static void __init ncr_getclock (ncb_p np, int mult) if (bootverbose) printk ("%s: NCR clock is %uKHz\n", ncr_name(np), f1); - if (f1 < 45000) f1 = 40000; - else if (f1 < 55000) f1 = 50000; + if (f1 < 55000) f1 = 40000; else f1 = 80000; - if (f1 < 80000 && mult > 1) { + /* + ** Suggest to also check the PCI clock frequency + ** to make sure our frequency calculation algorithm + ** is not too biased. + */ + np->pciclock_min = (33000*55+80-1)/80; + np->pciclock_max = (33000*55)/40; + + if (f1 == 40000 && mult > 1) { if (bootverbose >= 2) printk ("%s: clock multiplier assumed\n", ncr_name(np)); np->multiplier = mult; @@ -10973,13 +11003,12 @@ static void __init ncr_getclock (ncb_p np, int mult) */ static u_int __init ncr_getpciclock (ncb_p np) { - static u_int f = 0; + static u_int f; + + OUTB (nc_stest1, SCLK); /* Use the PCI clock as SCSI clock */ + f = ncr_getfreq (np); + OUTB (nc_stest1, 0); - if (!f) { - OUTB (nc_stest1, SCLK); /* Use the PCI clock as SCSI clock */ - f = ncr_getfreq (np); - OUTB (nc_stest1, 0); - } return f; } diff --git a/drivers/sgi/Config.in b/drivers/sgi/Config.in index 40f024178..5c174edb1 100644 --- a/drivers/sgi/Config.in +++ b/drivers/sgi/Config.in @@ -6,13 +6,13 @@ comment 'SGI devices' bool 'SGI Zilog85C30 serial support' CONFIG_SGI_SERIAL if [ "$CONFIG_SGI_SERIAL" != "n" ]; then - define_bool CONFIG_SERIAL y + define_bool CONFIG_SERIAL y fi bool 'SGI DS1286 RTC support' CONFIG_SGI_DS1286 if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then - tristate 'SGI Newport Graphics support' CONFIG_SGI_NEWPORT_GFX + tristate 'SGI Newport Graphics support' CONFIG_SGI_NEWPORT_GFX fi endmenu diff --git a/drivers/sound/ac97.h b/drivers/sound/ac97.h index 3269337d5..490d69f88 100644 --- a/drivers/sound/ac97.h +++ b/drivers/sound/ac97.h @@ -33,6 +33,19 @@ /* registers 0x0028 - 0x0058 are reserved */ +/* AC'97 2.0 */ +#define AC97_EXTENDED_ID 0x0028 /* Extended Audio ID */ +#define AC97_EXTENDED_STATUS 0x002A /* Extended Audio Status */ +#define AC97_PCM_FRONT_DAC_RATE 0x002C /* PCM Front DAC Rate */ +#define AC97_PCM_SURR_DAC_RATE 0x002E /* PCM Surround DAC Rate */ +#define AC97_PCM_LFE_DAC_RATE 0x0030 /* PCM LFE DAC Rate */ +#define AC97_PCM_LR_DAC_RATE 0x0032 /* PCM LR DAC Rate */ +#define AC97_PCM_MIC_ADC_RATE 0x0034 /* PCM MIC ADC Rate */ +#define AC97_CENTER_LFE_MASTER 0x0036 /* Center + LFE Master Volume */ +#define AC97_SURROUND_MASTER 0x0038 /* Surround (Rear) Master Volume */ +#define AC97_RESERVED_3A 0x003A /* Reserved */ +/* range 0x3c-0x58 - MODEM */ + /* registers 0x005a - 0x007a are vendor reserved */ #define AC97_VENDOR_ID1 0x007c diff --git a/drivers/sound/dmasound.c b/drivers/sound/dmasound.c index 341fb6f97..c6ec28253 100644 --- a/drivers/sound/dmasound.c +++ b/drivers/sound/dmasound.c @@ -89,6 +89,7 @@ History: #include <linux/malloc.h> #include <linux/sound.h> #include <linux/init.h> +#include <linux/delay.h> #if defined(__mc68000__) || defined(CONFIG_APUS) #include <asm/setup.h> @@ -239,7 +240,7 @@ static short beep_wform[256] = { -269, -245, -218, -187, -153, -117, -79, -40, }; -#define BEEP_SPEED 2 /* 22050 Hz sample rate */ +#define BEEP_SRATE 22050 /* 22050 Hz sample rate */ #define BEEP_BUFLEN 512 #define BEEP_VOLUME 15 /* 0 - 100 */ @@ -295,7 +296,7 @@ static int numReadBufs = 4, readbufSize = 32; MODULE_PARM(catchRadius, "i"); MODULE_PARM(numBufs, "i"); MODULE_PARM(bufSize, "i"); -MODULE_PARM(numreadBufs, "i"); +MODULE_PARM(numReadBufs, "i"); MODULE_PARM(readbufSize, "i"); #define arraysize(x) (sizeof(x)/sizeof(*(x))) @@ -3209,6 +3210,7 @@ static void PMacSilence(void) static int awacs_freqs[8] = { 44100, 29400, 22050, 17640, 14700, 11025, 8820, 7350 }; +static int awacs_freqs_ok[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; static void PMacInit(void) { @@ -3232,10 +3234,13 @@ static void PMacInit(void) * Otherwise choose the next higher rate. * N.B.: burgundy awacs (iMac and later) only works at 44100 Hz. */ - i = (awacs_revision >= AWACS_BURGUNDY)? 1: 8; + i = 8; do { tolerance = catchRadius * awacs_freqs[--i] / 100; - } while (sound.soft.speed > awacs_freqs[i] + tolerance && i > 0); + if (awacs_freqs_ok[i] + && sound.soft.speed <= awacs_freqs[i] + tolerance) + break; + } while (i > 0); if (sound.soft.speed >= awacs_freqs[i] - tolerance) sound.trans = &transAwacsNormal; else @@ -3529,8 +3534,8 @@ static struct timer_list beep_timer = { static void awacs_mksound(unsigned int hz, unsigned int ticks) { unsigned long flags; - int beep_speed = (awacs_revision < AWACS_BURGUNDY)? BEEP_SPEED: 0; - int srate = awacs_freqs[beep_speed]; + int beep_speed = 0; + int srate; int period, ncycles, nsamples; int i, j, f; short *p; @@ -3538,6 +3543,11 @@ static void awacs_mksound(unsigned int hz, unsigned int ticks) static int beep_nsamples_cache; static int beep_volume_cache; + for (i = 0; i < 8 && awacs_freqs[i] >= BEEP_SRATE; ++i) + if (awacs_freqs_ok[i]) + beep_speed = i; + srate = awacs_freqs[beep_speed]; + if (hz <= srate / BEEP_BUFLEN || hz > srate / 2) { #if 1 /* this is a hack for broken X server code */ @@ -3625,6 +3635,12 @@ static int awacs_sleep_notify(struct pmu_sleep_notifier *self, int when) out_le32(&awacs->byteswap, sound.hard.format != AFMT_S16_BE); enable_irq(awacs_irq); enable_irq(awacs_tx_irq); + if (awacs_revision == 3) { + mdelay(100); + awacs_write(0x6000); + mdelay(2); + awacs_write(awacs_reg[1] | MASK_ADDR1); + } } return PBOOK_SLEEP_OK; } @@ -3667,7 +3683,7 @@ static unsigned awacs_burgundy_rcw(unsigned addr) { unsigned val = 0; - int flags; + unsigned long flags; /* should have timeouts here */ save_flags(flags); cli(); @@ -3709,7 +3725,7 @@ static unsigned awacs_burgundy_rcb(unsigned addr) { unsigned val = 0; - int flags; + unsigned long flags; /* should have timeouts here */ save_flags(flags); cli(); @@ -5497,12 +5513,41 @@ void __init dmasound_init(void) np = find_devices("davbus"); sound = find_devices("sound"); if (sound != 0 && sound->parent == np) { - int *sfprop; - sfprop = (int *) get_property(sound, "sub-frame", 0); - if (sfprop != 0 && *sfprop >= 0 && *sfprop < 16) - awacs_subframe = *sfprop; + unsigned int *prop, l, i; + prop = (unsigned int *) + get_property(sound, "sub-frame", 0); + if (prop != 0 && *prop >= 0 && *prop < 16) + awacs_subframe = *prop; if (device_is_compatible(sound, "burgundy")) awacs_revision = AWACS_BURGUNDY; + + /* look for a property saying what sample rates + are available */ + for (i = 0; i < 8; ++i) + awacs_freqs_ok[i] = 0; + prop = (unsigned int *) get_property + (sound, "sample-rates", &l); + if (prop == 0) + prop = (unsigned int *) get_property + (sound, "output-frame-rates", &l); + if (prop != 0) { + for (l /= sizeof(int); l > 0; --l) { + /* sometimes the rate is in the + high-order 16 bits (?) */ + unsigned int r = *prop++; + if (r >= 0x10000) + r >>= 16; + for (i = 0; i < 8; ++i) { + if (r == awacs_freqs[i]) { + awacs_freqs_ok[i] = 1; + break; + } + } + } + } else { + /* assume just 44.1k is OK */ + awacs_freqs_ok[0] = 1; + } } } if (np != NULL && np->n_addrs >= 3 && np->n_intrs >= 3) { diff --git a/drivers/sound/maestro.c b/drivers/sound/maestro.c index e0ed9e33a..f64554dee 100644 --- a/drivers/sound/maestro.c +++ b/drivers/sound/maestro.c @@ -40,14 +40,14 @@ * channels. They can take data from a number of sources and perform * basic encodings of the data. The wavecache is a storehouse for * PCM data. Typically it deals with PCI and interracts with the - * APUs. The ASP is a wacky DSP like device that ESS is loathe + * APUs. The ASP is a wacky DSP like device that ESS is loth * to release docs on. Thankfully it isn't required on the Maestro * until you start doing insane things like FM emulation and surround * encoding. The codecs are almost always AC-97 compliant codecs, * but it appears that early Maestros may have had PT101 (an ESS * part?) wired to them. The only real difference in the Maestro * families is external goop like docking capability, memory for - * the ASP, and trivial initialization differences. + * the ASP, and initialization differences. * * Driver Operation * @@ -70,7 +70,7 @@ * the client and complicates the buffer maths tremendously. Ick. * * This also pollutes the recording paths as well. We have to use - * 2 l/r incoming APUs that are fixed at 16bit/48khz. We then pipe + * 2 L/R incoming APUs that are fixed at 16bit/48khz. We then pipe * these through 2 rate converion apus that mix them down to the * requested frequency and write them to memory through the wavecache. * We also apparently need a 512byte region thats used as temp space @@ -79,21 +79,39 @@ * The wavecache makes our life even more fun. First off, it can * only address the first 28 bits of PCI address space, making it * useless on quite a few architectures. Secondly, its insane. - * It can only fetch from 4 regions of PCI space, each 2 meg in length - * and 4k aligned. It then uses high bits of the address in the APU - * to decide which buffer to use, but as far as I can tell can only - * choose between 2 of the 4 available when you really want to hit - * PCI space. So all the memory we're touching has to fit in 2 regions - * of 4 meg under 256meg. So much for dynamic allocation of multiple - * /dev/dsps. So we force only 1 /dev/dsp, allocate both its read - * and write buffers contiguously at open(), and allocate the weird - * mixbuf input APU buffers on another page. The first 2meg region - * goes to the input/output buffers, and the second region goes to - * the weird mixbuf. Long term fixes? Get an allocator that lets - * us try and allocate from zones. Alleviate pain by putting the mixbuf - * in onboard ram rather than in system memory. Buy a real sound card. + * It claims to only fetch from 4 regions of PCI space, each 4 meg in length. + * But that doesn't really work. You can only use 1 region. So all our + * allocations have to be in 4meg of each other. Booo. Hiss. + * So we have a module parameter, dsps_order, that is the order of + * the number of dsps to provide. All their buffer space is allocated + * on open time. The sonicvibes oss routines we inherited really want + * power of 2 buffers, so we have all those next to each other, then + * 512 byte regions for the recording wavecaches. This ends up + * wasting quite a bit of memory. The only fixes I can see would be + * getting a kernel allocator that could work in zones, or figuring out + * just how to coerce the WP into doing what we want. + * + * The indirection of the various registers means we have to spinlock + * nearly all register accesses. We have the main register indirection + * like the wave cache, maestro registers, etc. Then we have beasts + * like the APU interface that is indirect registers gotten at through + * the main maestro indirection. Ouch. We spinlock around the actual + * ports on a per card basis. This means spinlock activity at each IO + * operation, but the only IO operation clusters are in non critical + * paths and it makes the code far easier to follow. Interrupts are + * blocked while holding the locks because the int handler has to + * get at some of them :(. The mixer interface doesn't, however. + * We also have an OSS state lock that is thrown around in a few + * places. * * History + * v0.07 - Oct 4 1999 - Zach Brown <zab@redhat.com> + * tweak adc/dac, formating, and stuff to allow full duplex + * allocate dsps memory at open() so we can fit in the wavecache window + * fix wavecache braindamage. again. no more scribbling? + * fix ess 1921 codec bug on some laptops. + * fix dumb pci scanning bug + * started 2.3 cleanup, redid spinlocks, little cleanups * v0.06 - Sep 20 1999 - Zach Brown <zab@redhat.com> * fix wavecache thinkos. limit to 1 /dev/dsp. * eric is wearing his thinking toque this week. @@ -125,20 +143,10 @@ * look really hard at the apu/bob/dma buffer code paths. * fix bob frequency * do smart things with ac97 2.0 bits. - * fix wavecache so multiple /dev/dsps work * test different sized writes * fixup latencies ? * get apm save/restore working? - * allocate dma bounce page - * start_adc is called way too often * sort out 0x34->0x36 crap in init - * wavecache needs to be looked at, multiple - * dsps and recording seem confused - * - * the entire issue of smp safety needs to be looked at. cli() needs - * to be replaced with spinlock_irqsave, being very careful of call - * paths avoiding deadlock. if lock hold times are quick just - * use one big ass per device spinlock.. * * apm is kind of a mess. I doubt we can rely on the machine keeping * power to the maestro/codecs when we suspend. This means we have @@ -187,13 +195,14 @@ #ifdef M_DEBUG static int debug=0; +static int dsps_order=0; #define M_printk(args...) {if (debug) printk(args);} #else #define M_printk(x) #endif /* --------------------------------------------------------------------- */ -#define DRIVER_VERSION "0.06" +#define DRIVER_VERSION "0.07" #ifndef PCI_VENDOR_ESS #define PCI_VENDOR_ESS 0x125D @@ -208,7 +217,6 @@ static int debug=0; #define ESS_CHAN_HARD 0x100 -#undef CONFIG_APM /* see notes above */ /* changed so that I could actually find all the references and fix them up. its a little more readable now. */ @@ -218,16 +226,15 @@ static int debug=0; #define ESS_DAC_SHIFT 0 #define ESS_ADC_SHIFT 4 -#define ESS_ENABLE_PE 1 -#define ESS_ENABLE_RE 2 - #define ESS_STATE_MAGIC 0x125D1968 #define ESS_CARD_MAGIC 0x19283746 #define DAC_RUNNING 1 #define ADC_RUNNING 2 -#define NR_DSPS 1 /* our wavecache setup demands this. */ +#define MAX_DSP_ORDER 3 +#define MAX_DSPS (1<<3) +#define NR_DSPS (1<<dsps_order) #define SND_DEV_DSP16 5 @@ -260,10 +267,14 @@ struct ess_state { unsigned int rateadc, ratedac; unsigned char fmt, enable; + int index; + + /* this locks around the oss state in the driver */ spinlock_t lock; + /* only let 1 be opening at a time */ struct semaphore open_sem; - mode_t open_mode; wait_queue_head_t open_wait; + mode_t open_mode; /* soundcore stuff */ int dev_audio; @@ -286,7 +297,7 @@ struct ess_state { unsigned fragsamples; /* OSS stuff */ unsigned mapped:1; - unsigned ready:1; + unsigned ready:1; /* our oss buffers are ready to go */ unsigned endcleared:1; unsigned ossfragshift; int ossmaxfrags; @@ -294,7 +305,6 @@ struct ess_state { u16 base; /* Offset for ptr */ } dma_dac, dma_adc; - /* pointer to each dsp?s piece of the apu->src buffer page */ void *mixbuf; }; @@ -323,7 +333,7 @@ struct ess_card { unsigned int mixer_state[SOUND_MIXER_NRDEVICES]; } mix; - struct ess_state channels[NR_DSPS]; + struct ess_state channels[MAX_DSPS]; u16 maestro_map[32]; /* Register map */ #ifdef CONFIG_APM /* we have to store this junk so that we can come back from a @@ -331,16 +341,19 @@ struct ess_card { u16 apu_map[64][16]; /* contents of apu regs */ #endif - /* 1 page of DMA-able memory for mixer apu buffers, - shared amongst dsp?s. */ - void *mixpage; + /* this locks around the physical registers on the card */ + spinlock_t lock; + + /* memory for this card.. wavecache limited :(*/ + void *dmapages; + int dmaorder; /* hardware resources */ u32 iobase; u32 irq; int bob_freq; - char bob_running; + char dsps_open; }; extern __inline__ unsigned ld2(unsigned int x) @@ -454,7 +467,6 @@ static u16 maestro_ac97_get(int io, u8 cmd) be sure to fill it in if you add oss mixers to anyone's supported mixer defines */ -/* possible __init */ static struct mixer_defaults { int mixer; unsigned int value; @@ -721,42 +733,21 @@ static u16 maestro_ac97_init(struct ess_card *card, int iobase) card->mix.supported_mixers &= ~(SOUND_MASK_MIC); card->mix.record_sources = 0; card->mix.recmask_io = NULL; - /* no idea what these do */ +#if 0 /* don't ask. I have yet to see what these actually do. */ maestro_ac97_set(iobase,0x76,0xABBA); /* o/~ Take a chance on me o/~ */ udelay(20); maestro_ac97_set(iobase,0x78,0x3002); udelay(20); maestro_ac97_set(iobase,0x78,0x3802); udelay(20); +#endif break; default: break; } -#if 0 /* used to be set, lets try using the codec defaults */ - /* always set headphones to max unmuted, OSS won't - let us change it :( */ - maestro_ac97_set(iobase, 0x04, 0x0000); - maestro_ac97_set(iobase, 0x06, 0x0000); - maestro_ac97_set(iobase, 0x0C, 0x1F1F); - /* null record select */ - maestro_ac97_set(iobase, 0x1A, 0x0000); -#endif maestro_ac97_set(iobase, 0x1E, 0x0404); /* null misc stuff */ maestro_ac97_set(iobase, 0x20, 0x0000); - /* the regs are read only, duh :) */ -/* maestro_ac97_set(iobase, 0x26, 0x000F);*/ - -#if 0 /* this is a really good way to hang - codecs. we need a better way. */ - if(maestro_ac97_get(iobase,0x36) ==0x8080) { - int reg; - printk("maestro: your ac97 might be 2.0, see if this makes sense:\n"); - for(reg = 0x28; reg <= 0x58 ; reg += 2) { - printk(" 0x%2x: %4x\n",reg,maestro_ac97_get(iobase,reg)); - } - } -#endif return 0; } @@ -837,30 +828,46 @@ static void maestro_ac97_reset(int ioaddr) * The Maestro engineers were a little indirection happy. These indirected * registers themselves include indirect registers at another layer */ + +static void __maestro_write(struct ess_card *card, u16 reg, u16 data) +{ + long ioaddr = card->iobase; + + outw(reg, ioaddr+0x02); + outw(data, ioaddr+0x00); + card->maestro_map[reg]=data; + +} static void maestro_write(struct ess_state *ess, u16 reg, u16 data) { - long ioaddr = ess->card->iobase; unsigned long flags; - save_flags(flags); - cli(); + + spin_lock_irqsave(&ess->card->lock,flags); + + __maestro_write(ess->card,reg,data); + + spin_unlock_irqrestore(&card->lock,flags); +} + +static u16 __maestro_read(struct ess_card *card, u16 reg) +{ + long ioaddr = card->iobase; + outw(reg, ioaddr+0x02); - outw(data, ioaddr+0x00); - ess->card->maestro_map[reg]=data; - restore_flags(flags); + return card->maestro_map[reg]=inw(ioaddr+0x00); } static u16 maestro_read(struct ess_state *ess, u16 reg) { - long ioaddr = ess->card->iobase; if(READABLE_MAP & (1<<reg)) { unsigned long flags; - save_flags(flags); - cli(); - outw(reg, ioaddr+0x02); - ess->card->maestro_map[reg]=inw(ioaddr+0x00); - restore_flags(flags); + spin_lock_irqsave(&ess->card->lock,flags); + + __maestro_read(ess->card,reg); + + spin_unlock_irqrestore(&ess->card->lock,flags); } return ess->card->maestro_map[reg]; } @@ -883,24 +890,24 @@ static u16 maestro_read(struct ess_state *ess, u16 reg) #define IDR6_TIMER_CTRL 0x06 #define IDR7_WAVE_ROMRAM 0x07 -static void apu_index_set(struct ess_state *ess, u16 index) +static void apu_index_set(struct ess_card *card, u16 index) { int i; - maestro_write(ess, IDR1_CRAM_POINTER, index); + __maestro_write(card, IDR1_CRAM_POINTER, index); for(i=0;i<1000;i++) - if(maestro_read(ess, IDR1_CRAM_POINTER)==index) + if(__maestro_read(card, IDR1_CRAM_POINTER)==index) return; printk(KERN_WARNING "maestro: APU register select failed.\n"); } -static void apu_data_set(struct ess_state *ess, u16 data) +static void apu_data_set(struct ess_card *card, u16 data) { int i; for(i=0;i<1000;i++) { - if(maestro_read(ess, IDR0_DATA_PORT)==data) + if(__maestro_read(card, IDR0_DATA_PORT)==data) return; - maestro_write(ess, IDR0_DATA_PORT, data); + __maestro_write(card, IDR0_DATA_PORT, data); } } @@ -929,11 +936,13 @@ static void apu_set_register(struct ess_state *ess, u16 channel, u8 reg, u16 dat #endif reg|=(channel<<4); - save_flags(flags); - cli(); - apu_index_set(ess, reg); - apu_data_set(ess, data); - restore_flags(flags); + /* hooray for double indirection!! */ + spin_lock_irqsave(&ess->card->lock,flags); + + apu_index_set(ess->card, reg); + apu_data_set(ess->card, data); + + spin_unlock_irqrestore(&ess->card->lock,flags); } static u16 apu_get_register(struct ess_state *ess, u16 channel, u8 reg) @@ -948,11 +957,12 @@ static u16 apu_get_register(struct ess_state *ess, u16 channel, u8 reg) reg|=(channel<<4); - save_flags(flags); - cli(); - apu_index_set(ess, reg); - v=maestro_read(ess, IDR0_DATA_PORT); - restore_flags(flags); + spin_lock_irqsave(&ess->card->lock,flags); + + apu_index_set(ess->card, reg); + v=__maestro_read(ess->card, IDR0_DATA_PORT); + + spin_unlock_irqrestore(&ess->card->lock,flags); return v; } @@ -967,11 +977,12 @@ static void wave_set_register(struct ess_state *ess, u16 reg, u16 value) long ioaddr = ess->card->iobase; unsigned long flags; - save_flags(flags); - cli(); + spin_lock_irqsave(&ess->card->lock,flags); + outw(reg, ioaddr+0x10); outw(value, ioaddr+0x12); - restore_flags(flags); + + spin_unlock_irqrestore(&ess->card->lock,flags); } static u16 wave_get_register(struct ess_state *ess, u16 reg) @@ -980,11 +991,10 @@ static u16 wave_get_register(struct ess_state *ess, u16 reg) unsigned long flags; u16 value; - save_flags(flags); - cli(); + spin_lock_irqsave(&ess->card->lock,flags); outw(reg, ioaddr+0x10); value=inw(ioaddr+0x12); - restore_flags(flags); + spin_unlock_irqrestore(&ess->card->lock,flags); return value; } @@ -1085,6 +1095,70 @@ static void set_adc_rate(struct ess_state *s, unsigned rate) apu_set_register(s, 5, 3, freq>>8); } +/* Stop our host of recording apus */ +extern inline void stop_adc(struct ess_state *s) +{ + /* XXX lets hope we don't have to lock around this */ + if (! (s->enable & ADC_RUNNING)) return; + + s->enable &= ~ADC_RUNNING; + apu_set_register(s, 2, 0, apu_get_register(s, 2, 0)&0xFF0F); + apu_set_register(s, 3, 0, apu_get_register(s, 3, 0)&0xFF0F); + apu_set_register(s, 4, 0, apu_get_register(s, 2, 0)&0xFF0F); + apu_set_register(s, 5, 0, apu_get_register(s, 3, 0)&0xFF0F); +} + +/* stop output apus */ +extern inline void stop_dac(struct ess_state *s) +{ + /* XXX have to lock around this? */ + if (! (s->enable & DAC_RUNNING)) return; + + s->enable &= ~DAC_RUNNING; + apu_set_register(s, 0, 0, apu_get_register(s, 0, 0)&0xFF0F); + apu_set_register(s, 1, 0, apu_get_register(s, 1, 0)&0xFF0F); +} + +static void start_dac(struct ess_state *s) +{ + /* XXX locks? */ + if ( (s->dma_dac.mapped || s->dma_dac.count > 0) && + s->dma_dac.ready && + (! (s->enable & DAC_RUNNING)) ) { + + s->enable |= DAC_RUNNING; + + apu_set_register(s, 0, 0, + (apu_get_register(s, 0, 0)&0xFF0F)|s->apu_mode[0]); + + if((s->fmt >> ESS_DAC_SHIFT) & ESS_FMT_STEREO) + apu_set_register(s, 1, 0, + (apu_get_register(s, 1, 0)&0xFF0F)|s->apu_mode[1]); + } +} + +static void start_adc(struct ess_state *s) +{ + /* XXX locks? */ + if ((s->dma_adc.mapped || s->dma_adc.count < (signed)(s->dma_adc.dmasize - 2*s->dma_adc.fragsize)) + && s->dma_adc.ready && (! (s->enable & ADC_RUNNING)) ) { + + s->enable |= ADC_RUNNING; + apu_set_register(s, 2, 0, + (apu_get_register(s, 2, 0)&0xFF0F)|s->apu_mode[2]); + apu_set_register(s, 4, 0, + (apu_get_register(s, 4, 0)&0xFF0F)|s->apu_mode[4]); + + if( s->fmt & (ESS_FMT_STEREO << ESS_ADC_SHIFT)) { + apu_set_register(s, 3, 0, + (apu_get_register(s, 3, 0)&0xFF0F)|s->apu_mode[3]); + apu_set_register(s, 5, 0, + (apu_get_register(s, 5, 0)&0xFF0F)|s->apu_mode[5]); + } + + } +} + /* * Native play back driver @@ -1115,29 +1189,6 @@ static void ess_play_setup(struct ess_state *ess, int mode, u32 rate, void *buff { int i; - /* - * To understand this it helps to know how the - * wave cache works. There are 4 DSP wavecache - * blocks which are 0x1FC->0x1FF. They are selected - * by setting bits 22,21,20 of the address to - * 1 X Y where X Y select the block. - * - * In addition stereo pairing is supported. This is - * set in the wave cache control for the channel as is - * 8bit unsigned. - * - * Note that this causes a problem. With our limit of - * about 12 full duplex pairs (48 channels active) we - * will need to do a lot of juggling to get all the - * memory we want sufficiently close together. - * - * Even with 64K blocks that means - * 24 channel pairs - * 6 pairs/block - * - * 10K per channel pair = 5000 samples. - */ - if(!channel) pa = virt_to_bus(buffer); else @@ -1145,9 +1196,6 @@ static void ess_play_setup(struct ess_state *ess, int mode, u32 rate, void *buff *2 accomodates for rampant shifting earlier */ pa = virt_to_bus(buffer + size*2); - /* play bufs are in the same first region as record bufs */ - wave_set_register(ess, 0x01FC , (pa&0xFFE00000)>>12); - /* set the wavecache control reg */ tmpval = (pa - 0x10) & 0xFFF8; #if 0 @@ -1200,6 +1248,10 @@ static void ess_play_setup(struct ess_state *ess, int mode, u32 rate, void *buff else apu_set_register(ess, channel, 10, 0x8F08); + if(mode&ESS_FMT_16BIT) + ess->apu_mode[channel]=0x10; + else + ess->apu_mode[channel]=0x30; } /* clear WP interupts */ @@ -1207,24 +1259,9 @@ static void ess_play_setup(struct ess_state *ess, int mode, u32 rate, void *buff /* enable WP ints */ outw(inw(ess->card->iobase+0x18)|4, ess->card->iobase+0x18); + /* go team! */ set_dac_rate(ess,rate); - - for(channel=0; channel<=high_apu; channel++) - { - /* Turn on the DMA */ - if(mode&ESS_FMT_16BIT) - { - apu_set_register(ess, channel, 0, - (apu_get_register(ess, channel, 0)&0xFF0F)|0x10); - ess->apu_mode[channel]=0x10; - } - else - { - apu_set_register(ess, channel, 0, - (apu_get_register(ess, channel, 0)&0xFF0F)|0x30); - ess->apu_mode[channel]=0x30; - } - } + start_dac(ess); } /* @@ -1232,11 +1269,11 @@ static void ess_play_setup(struct ess_state *ess, int mode, u32 rate, void *buff */ /* again, passed mode is alrady shifted/masked */ -static void ess_rec_setup(struct ess_state *ess, int mode, u32 rate, void *buffer, int size) +static void +ess_rec_setup(struct ess_state *ess, int mode, u32 rate, void *buffer, int size) { int apu_step = 2; int channel; - u8 apu_type; M_printk("maestro: ess_rec_setup: mode=%d rate=%d buf=0x%p len=%d.\n", mode, rate, buffer, size); @@ -1279,6 +1316,7 @@ static void ess_rec_setup(struct ess_state *ess, int mode, u32 rate, void *buffe /* we source from a 'magic' apu */ bsize = PAGE_SIZE >> 5; /* half of this channels alloc, in words */ route = 0x14 + (channel - 4); /* parallel in crap, see maestro reg 0xC [8-11] */ + ess->apu_mode[channel] = 0x90; /* Input Mixer */ } else { /* we're a rate converter taking @@ -1292,6 +1330,8 @@ static void ess_rec_setup(struct ess_state *ess, int mode, u32 rate, void *buffe pa = virt_to_bus(buffer + size*2); } + ess->apu_mode[channel] = 0xB0; /* Sample Rate Converter */ + bsize = size; /* get input from inputing apu */ route = channel + 2; @@ -1299,9 +1339,6 @@ static void ess_rec_setup(struct ess_state *ess, int mode, u32 rate, void *buffe M_printk("maestro: ess_rec_setup: getting pa 0x%x from %d\n",pa,channel); - /* put our base address in the right region */ - wave_set_register(ess, 0x01FC + (channel >> 2), (pa&0xFFE00000)>>12); - /* set the wavecache control reg */ tmpval = (pa - 0x10) & 0xFFF8; wave_set_register(ess, ess->apu[channel]<<3, tmpval); @@ -1315,9 +1352,6 @@ static void ess_rec_setup(struct ess_state *ess, int mode, u32 rate, void *buffe pa|=0x00400000; /* bit 22 -> System RAM */ - if ( channel & 4) - pa|=0x00200000; /* bit 21 -> second region for mixbuf */ - M_printk("maestro: ess_rec_setup: APU[%d] pa = 0x%x size = 0x%x route = 0x%x\n", ess->apu[channel], pa, bsize, route); @@ -1356,20 +1390,9 @@ static void ess_rec_setup(struct ess_state *ess, int mode, u32 rate, void *buffe /* enable WP ints */ outw(inw(ess->card->iobase+0x18)|4, ess->card->iobase+0x18); + /* let 'er rip */ set_adc_rate(ess,rate); - - for(channel=2; channel<6; channel+=apu_step) - { - if(channel & 0x04) { - apu_type = 0x90; /* Input Mixer */ - } else { - apu_type = 0xB0; /* Sample Rate Converter */ - } - - apu_set_register(ess, channel, 0, - (apu_get_register(ess, channel, 0)&0xFF0F) | apu_type); - ess->apu_mode[channel] = apu_type; - } + start_adc(ess); } /* --------------------------------------------------------------------- */ @@ -1388,12 +1411,17 @@ extern __inline__ unsigned get_dmaa(struct ess_state *s) { long ioport = s->card->iobase; int offset; + unsigned long flags; + + spin_lock_irqsave(&s->card->lock,flags); outw(1, ioport+2); outw(s->apu[0]<<4|5, ioport); outw(0, ioport+2); offset=inw(ioport); + spin_unlock_irqrestore(&s->card->lock,flags); + /* M_printk("dmaa: offset: %d, base: %d\n",offset,s->dma_dac.base); */ offset-=s->dma_dac.base; @@ -1406,12 +1434,17 @@ extern __inline__ unsigned get_dmac(struct ess_state *s) { long ioport = s->card->iobase; int offset; + unsigned long flags; + + spin_lock_irqsave(&s->card->lock,flags); outw(1, ioport+2); outw(s->apu[2]<<4|5, ioport); outw(0, ioport+2); offset=inw(ioport); + spin_unlock_irqrestore(&s->card->lock,flags); + /* M_printk("dmac: offset: %d, base: %d\n",offset,s->dma_adc.base); */ /* The offset is an address not a position relative to base */ @@ -1527,113 +1560,23 @@ static void calc_bob_rate(struct ess_state *s) { } -/* Stop our host of recording apus */ -extern inline void stop_adc(struct ess_state *s) -{ - unsigned long flags; - - spin_lock_irqsave(&s->lock, flags); - s->enable &= ~ADC_RUNNING; - apu_set_register(s, 2, 0, apu_get_register(s, 2, 0)&0xFF0F); - apu_set_register(s, 3, 0, apu_get_register(s, 3, 0)&0xFF0F); - apu_set_register(s, 4, 0, apu_get_register(s, 2, 0)&0xFF0F); - apu_set_register(s, 5, 0, apu_get_register(s, 3, 0)&0xFF0F); - spin_unlock_irqrestore(&s->lock, flags); -} - -/* stop output apus */ -extern inline void stop_dac(struct ess_state *s) -{ - unsigned long flags; - - spin_lock_irqsave(&s->lock, flags); - s->enable &= ~DAC_RUNNING; - apu_set_register(s, 0, 0, apu_get_register(s, 0, 0)&0xFF0F); - apu_set_register(s, 1, 0, apu_get_register(s, 1, 0)&0xFF0F); - spin_unlock_irqrestore(&s->lock, flags); -} - -static void start_dac(struct ess_state *s) -{ - unsigned long flags; - - spin_lock_irqsave(&s->lock, flags); - if ((s->dma_dac.mapped || s->dma_dac.count > 0) && s->dma_dac.ready) { - s->enable |= DAC_RUNNING; - - apu_set_register(s, 0, 0, - (apu_get_register(s, 0, 0)&0xFF0F)|s->apu_mode[0]); - - if((s->fmt >> ESS_DAC_SHIFT) & ESS_FMT_STEREO) - apu_set_register(s, 1, 0, - (apu_get_register(s, 1, 0)&0xFF0F)|s->apu_mode[1]); - } - spin_unlock_irqrestore(&s->lock, flags); -} - -static void start_adc(struct ess_state *s) -{ - unsigned long flags; - - spin_lock_irqsave(&s->lock, flags); - if ((s->dma_adc.mapped || s->dma_adc.count < (signed)(s->dma_adc.dmasize - 2*s->dma_adc.fragsize)) - && s->dma_adc.ready) { - s->enable |= ADC_RUNNING; - apu_set_register(s, 2, 0, - (apu_get_register(s, 2, 0)&0xFF0F)|s->apu_mode[2]); - apu_set_register(s, 4, 0, - (apu_get_register(s, 4, 0)&0xFF0F)|s->apu_mode[4]); - if( s->fmt & (ESS_FMT_STEREO << ESS_ADC_SHIFT)) { - apu_set_register(s, 3, 0, - (apu_get_register(s, 3, 0)&0xFF0F)|s->apu_mode[3]); - apu_set_register(s, 5, 0, - (apu_get_register(s, 5, 0)&0xFF0F)|s->apu_mode[5]); - } - - } - spin_unlock_irqrestore(&s->lock, flags); -} - -/* --------------------------------------------------------------------- */ - -/* we allocate both buffers at once */ -#define DMABUF_DEFAULTORDER (15-PAGE_SHIFT) -#define DMABUF_MINORDER 2 - -static void dealloc_dmabuf(struct dmabuf *db) -{ - unsigned long map, mapend; - - if (db->rawbuf) { - M_printk("maestro: freeing %p\n",db->rawbuf); - /* undo marking the pages as reserved */ - mapend = MAP_NR(db->rawbuf + (PAGE_SIZE << db->buforder) - 1); - for (map = MAP_NR(db->rawbuf); map <= mapend; map++) - clear_bit(PG_reserved, &mem_map[map].flags); - free_pages((unsigned long)db->rawbuf, db->buforder); - } - db->rawbuf = NULL; - db->mapped = db->ready = 0; -} - -static int prog_dmabuf(struct ess_state *s, unsigned rec) +static int +prog_dmabuf(struct ess_state *s, unsigned rec) { struct dmabuf *db = rec ? &s->dma_adc : &s->dma_dac; unsigned rate = rec ? s->rateadc : s->ratedac; - int order; unsigned bytepersec; unsigned bufs; - unsigned long map, mapend; unsigned char fmt; unsigned long flags; spin_lock_irqsave(&s->lock, flags); fmt = s->fmt; if (rec) { - s->enable &= ~ESS_ENABLE_RE; + stop_adc(s); fmt >>= ESS_ADC_SHIFT; } else { - s->enable &= ~ESS_ENABLE_PE; + stop_dac(s); fmt >>= ESS_DAC_SHIFT; } spin_unlock_irqrestore(&s->lock, flags); @@ -1641,47 +1584,6 @@ static int prog_dmabuf(struct ess_state *s, unsigned rec) db->hwptr = db->swptr = db->total_bytes = db->count = db->error = db->endcleared = 0; - if (!db->rawbuf) { - void *rawbuf; - /* haha, this thing is hacked to hell and back. - this is so ugly. */ - s->dma_dac.ready = s->dma_dac.mapped = 0; - s->dma_adc.ready = s->dma_adc.mapped = 0; - - /* alloc as big a chunk as we can */ - for (order = DMABUF_DEFAULTORDER; order >= DMABUF_MINORDER; order--) - if((rawbuf = (void *)__get_free_pages(GFP_KERNEL|GFP_DMA, order))) - - break; - - if (!rawbuf) - return -ENOMEM; - - - /* we allocated both buffers */ - s->dma_adc.rawbuf = rawbuf; - s->dma_dac.rawbuf = rawbuf + ( PAGE_SIZE << (order - 1) ); - - M_printk("maestro: allocated %ld bytes at %p\n",PAGE_SIZE<<order, db->rawbuf); - - s->dma_adc.buforder = s->dma_dac.buforder = order - 1; - - /* XXX these checks are silly now */ -#if 0 - if ((virt_to_bus(db->rawbuf) ^ (virt_to_bus(db->rawbuf) + (PAGE_SIZE << order) - 1)) & ~0xffff) - printk(KERN_DEBUG "maestro: DMA buffer crosses 64k boundary: busaddr 0x%lx size %ld\n", - virt_to_bus(db->rawbuf), PAGE_SIZE << order); - -#endif - if ((virt_to_bus(db->rawbuf) + (PAGE_SIZE << order) - 1) & ~0xffffff) - printk(KERN_DEBUG "maestro: DMA buffer beyond 16MB: busaddr 0x%lx size %ld\n", - virt_to_bus(db->rawbuf), PAGE_SIZE << order); - - /* now mark the pages as reserved; otherwise remap_page_range doesn't do what we want */ - mapend = MAP_NR(db->rawbuf + (PAGE_SIZE << order) - 1); - for (map = MAP_NR(db->rawbuf); map <= mapend; map++) - set_bit(PG_reserved, &mem_map[map].flags); - } bytepersec = rate << sample_shift[fmt]; bufs = PAGE_SIZE << db->buforder; if (db->ossfragshift) { @@ -1691,12 +1593,12 @@ static int prog_dmabuf(struct ess_state *s, unsigned rec) db->fragshift = db->ossfragshift; } else { /* lets hand out reasonable big ass buffers by default */ - db->fragshift = (db->buforder + PAGE_SHIFT -2); + db->fragshift = (db->buforder - 2); #if 0 db->fragshift = ld2(bytepersec/100/(db->subdivision ? db->subdivision : 1)); +#endif if (db->fragshift < 3) db->fragshift = 3; -#endif } db->numfrag = bufs >> db->fragshift; while (db->numfrag < 4 && db->fragshift > 3) { @@ -1709,6 +1611,8 @@ static int prog_dmabuf(struct ess_state *s, unsigned rec) db->fragsamples = db->fragsize >> sample_shift[fmt]; db->dmasize = db->numfrag << db->fragshift; + M_printk("maestro: setup oss: numfrag: %d fragsize: %d dmasize: %d\n",db->numfrag,db->fragsize,db->dmasize); + memset(db->rawbuf, (fmt & ESS_FMT_16BIT) ? 0 : 0x80, db->dmasize); spin_lock_irqsave(&s->lock, flags); @@ -1727,7 +1631,8 @@ static int prog_dmabuf(struct ess_state *s, unsigned rec) /* XXX haha, way broken with our split stereo setup. giggle. */ /* only called by ess_write (dac ness ) */ -extern __inline__ void clear_advance(struct ess_state *s) +static __inline__ void +clear_advance(struct ess_state *s) { unsigned char c = ((s->fmt >> ESS_DAC_SHIFT) & ESS_FMT_16BIT) ? 0 : 0x80; unsigned char *buf = s->dma_dac.rawbuf; @@ -1746,7 +1651,8 @@ extern __inline__ void clear_advance(struct ess_state *s) } /* call with spinlock held! */ -static void ess_update_ptr(struct ess_state *s) +static void +ess_update_ptr(struct ess_state *s) { unsigned hwptr; int diff; @@ -1771,7 +1677,6 @@ static void ess_update_ptr(struct ess_state *s) wake_up(&s->dma_adc.wait); if (!s->dma_adc.mapped) { if (s->dma_adc.count > (signed)(s->dma_adc.dmasize - ((3 * s->dma_adc.fragsize) >> 1))) { - s->enable &= ~ESS_ENABLE_RE; /* FILL ME wrindir(s, SV_CIENABLE, s->enable); */ stop_adc(s); @@ -1796,7 +1701,6 @@ static void ess_update_ptr(struct ess_state *s) s->dma_dac.count -= diff; /* M_printk("maestro: ess_update_ptr: diff: %d, count: %d\n", diff, s->dma_dac.count); */ if (s->dma_dac.count <= 0) { - s->enable &= ~ESS_ENABLE_PE; /* FILL ME wrindir(s, SV_CIENABLE, s->enable); */ /* XXX how on earth can calling this with the lock held work.. */ @@ -1889,9 +1793,7 @@ static void set_mixer(struct ess_card *card,unsigned int mixer, unsigned int val static int mixer_ioctl(struct ess_card *card, unsigned int cmd, unsigned long arg) { - unsigned long flags; int i, val=0; - struct ess_state *s = &card->channels[0]; VALIDATE_CARD(card); if (cmd == SOUND_MIXER_INFO) { @@ -1924,9 +1826,9 @@ static int mixer_ioctl(struct ess_card *card, unsigned int cmd, unsigned long ar if(!card->mix.recmask_io) { val = 0; } else { - spin_lock_irqsave(&s->lock, flags); + spin_lock(&card->lock); val = card->mix.recmask_io(card,1,0); - spin_unlock_irqrestore(&s->lock, flags); + spin_unlock(&card->lock); } break; @@ -1953,9 +1855,9 @@ static int mixer_ioctl(struct ess_card *card, unsigned int cmd, unsigned long ar return -EINVAL; /* do we ever want to touch the hardware? */ -/* spin_lock_irqsave(&s->lock, flags); +/* spin_lock(&card->lock); val = card->mix.read_mixer(card,i); - spin_unlock_irqrestore(&s->lock, flags);*/ + spin_unlock(&card->lock);*/ val = card->mix.mixer_state[i]; /* M_printk("returned 0x%x for mixer %d\n",val,i);*/ @@ -1978,9 +1880,9 @@ static int mixer_ioctl(struct ess_card *card, unsigned int cmd, unsigned long ar if (!card->mix.recmask_io) return -EINVAL; if(! (val &= card->mix.record_sources)) return -EINVAL; - spin_lock_irqsave(&s->lock, flags); + spin_lock(&card->lock); card->mix.recmask_io(card,0,val); - spin_unlock_irqrestore(&s->lock, flags); + spin_unlock(&card->lock); return 0; default: @@ -1989,9 +1891,9 @@ static int mixer_ioctl(struct ess_card *card, unsigned int cmd, unsigned long ar if ( ! supported_mixer(card,i)) return -EINVAL; - spin_lock_irqsave(&s->lock, flags); + spin_lock(&card->lock); set_mixer(card,i,val); - spin_unlock_irqrestore(&s->lock, flags); + spin_unlock(&card->lock); return 0; } @@ -2062,16 +1964,17 @@ static /*const*/ struct file_operations ess_mixer_fops = { static int drain_dac(struct ess_state *s, int nonblock) { - DECLARE_WAITQUEUE(wait, current); + DECLARE_WAITQUEUE(wait,current); unsigned long flags; int count; signed long tmo; if (s->dma_dac.mapped || !s->dma_dac.ready) return 0; - current->state = TASK_INTERRUPTIBLE; + current->state = TASK_INTERRUPTIBLE; add_wait_queue(&s->dma_dac.wait, &wait); for (;;) { + /* XXX uhm.. questionable locking*/ spin_lock_irqsave(&s->lock, flags); count = s->dma_dac.count; spin_unlock_irqrestore(&s->lock, flags); @@ -2081,7 +1984,7 @@ static int drain_dac(struct ess_state *s, int nonblock) break; if (nonblock) { remove_wait_queue(&s->dma_dac.wait, &wait); - current->state = TASK_RUNNING; + current->state = TASK_RUNNING; return -EBUSY; } tmo = (count * HZ) / s->ratedac; @@ -2092,7 +1995,7 @@ static int drain_dac(struct ess_state *s, int nonblock) M_printk(KERN_DEBUG "maestro: dma timed out?? %ld\n",jiffies); } remove_wait_queue(&s->dma_dac.wait, &wait); - current->state = TASK_RUNNING; + current->state = TASK_RUNNING; if (signal_pending(current)) return -ERESTARTSYS; return 0; @@ -2100,7 +2003,8 @@ static int drain_dac(struct ess_state *s, int nonblock) /* --------------------------------------------------------------------- */ /* Zach sez: "god this is gross.." */ -int comb_stereo(unsigned char *real_buffer,unsigned char *tmp_buffer, int offset, +static int +comb_stereo(unsigned char *real_buffer,unsigned char *tmp_buffer, int offset, int count, int bufsize) { /* No such thing as stereo recording, so we @@ -2232,7 +2136,8 @@ rec_return_free: /* god this is gross..*/ /* again, the mode passed is shifted/masked */ -int split_stereo(unsigned char *real_buffer,unsigned char *tmp_buffer, int offset, +static int +split_stereo(unsigned char *real_buffer,unsigned char *tmp_buffer, int offset, int count, int bufsize, int mode) { /* oh, bother. stereo decoding APU's don't work in 16bit so we @@ -2474,7 +2379,7 @@ static int ess_ioctl(struct inode *inode, struct file *file, unsigned int cmd, u return 0; case SNDCTL_DSP_GETCAPS: - return put_user(0/*DSP_CAP_DUPLEX | DSP_CAP_REALTIME | DSP_CAP_TRIGGER | DSP_CAP_MMAP*/, (int *)arg); + return put_user(DSP_CAP_DUPLEX | DSP_CAP_REALTIME | DSP_CAP_TRIGGER /*| DSP_CAP_MMAP*/, (int *)arg); case SNDCTL_DSP_RESET: if (file->f_mode & FMODE_WRITE) { @@ -2596,9 +2501,9 @@ static int ess_ioctl(struct inode *inode, struct file *file, unsigned int cmd, u case SNDCTL_DSP_GETTRIGGER: val = 0; - if (file->f_mode & FMODE_READ && s->enable & ESS_ENABLE_RE) + if ((file->f_mode & FMODE_READ) && (s->enable & ADC_RUNNING)) val |= PCM_ENABLE_INPUT; - if (file->f_mode & FMODE_WRITE && s->enable & ESS_ENABLE_PE) + if ((file->f_mode & FMODE_WRITE) && (s->enable & DAC_RUNNING)) val |= PCM_ENABLE_OUTPUT; return put_user(val, (int *)arg); @@ -2625,7 +2530,7 @@ static int ess_ioctl(struct inode *inode, struct file *file, unsigned int cmd, u case SNDCTL_DSP_GETOSPACE: if (!(file->f_mode & FMODE_WRITE)) return -EINVAL; - if (!(s->enable & ESS_ENABLE_PE) && (val = prog_dmabuf(s, 0)) != 0) + if (!(s->enable & DAC_RUNNING) && (val = prog_dmabuf(s, 0)) != 0) return val; spin_lock_irqsave(&s->lock, flags); ess_update_ptr(s); @@ -2639,7 +2544,7 @@ static int ess_ioctl(struct inode *inode, struct file *file, unsigned int cmd, u case SNDCTL_DSP_GETISPACE: if (!(file->f_mode & FMODE_READ)) return -EINVAL; - if (!(s->enable & ESS_ENABLE_RE) && (val = prog_dmabuf(s, 1)) != 0) + if (!(s->enable & ADC_RUNNING) && (val = prog_dmabuf(s, 1)) != 0) return val; spin_lock_irqsave(&s->lock, flags); ess_update_ptr(s); @@ -2756,7 +2661,87 @@ static int ess_ioctl(struct inode *inode, struct file *file, unsigned int cmd, u return -EINVAL; } -static int ess_open(struct inode *inode, struct file *file) +static int +allocate_buffers(struct ess_state *s) +{ + void *rawbuf=NULL; + int order,i; + unsigned long mapend,map; + + /* alloc as big a chunk as we can */ + for (order = (dsps_order + (15-PAGE_SHIFT) + 1); order >= (dsps_order + 2 + 1); order--) + if((rawbuf = (void *)__get_free_pages(GFP_KERNEL|GFP_DMA, order))) + break; + + if (!rawbuf) + return 1; + + M_printk("maestro: allocated %ld (%d) bytes at %p\n",PAGE_SIZE<<order,order, rawbuf); + + if ((virt_to_bus(rawbuf) + (PAGE_SIZE << order) - 1) & ~((1<<28)-1)) /* silly limited pci poop */ + printk(KERN_DEBUG "maestro: DMA buffer beyond 256MB: busaddr 0x%lx size %ld\n", + virt_to_bus(rawbuf), PAGE_SIZE << order); + + if ((PAGE_SIZE<<order) > (1<<22)) + printk(KERN_DEBUG "maestro: %ld byte DMA buffer longer than APU can express!\n",PAGE_SIZE<<order); + + s->card->dmapages = rawbuf; + s->card->dmaorder = order; + + /* play bufs are in the same first region as record bufs */ + wave_set_register(s, 0x01FC , ((virt_to_bus(rawbuf))&0xFFE00000)>>12); + + M_printk("maestro: writing %lx (%lx) to the wp\n",virt_to_bus(rawbuf), + ((virt_to_bus(rawbuf))&0xFFE00000)>>12); + + for(i=0;i<NR_DSPS;i++) { + struct ess_state *ess = &s->card->channels[i]; + + if(ess->dev_audio == -1) + continue; + + ess->dma_dac.ready = s->dma_dac.mapped = 0; + ess->dma_adc.ready = s->dma_adc.mapped = 0; + ess->dma_adc.buforder = ess->dma_dac.buforder = order - 1 - dsps_order - 1; + ess->dma_dac.rawbuf = rawbuf + (i * ( PAGE_SIZE << (ess->dma_dac.buforder + 1 ))); + ess->dma_adc.rawbuf = ess->dma_dac.rawbuf + ( PAGE_SIZE << ess->dma_dac.buforder); + ess->mixbuf = rawbuf + (PAGE_SIZE<<order) - (512 * (i+1)); + + M_printk("maestro: setup apu %d: %p %p %p\n",i,ess->dma_dac.rawbuf, + ess->dma_adc.rawbuf, ess->mixbuf); + + } + + /* now mark the pages as reserved; otherwise remap_page_range doesn't do what we want */ + mapend = MAP_NR(rawbuf + (PAGE_SIZE << order) - 1); + for (map = MAP_NR(rawbuf); map <= mapend; map++) { + set_bit(PG_reserved, &mem_map[map].flags); + } + + return 0; +} +static void +free_buffers(struct ess_state *s) +{ + unsigned long map, mapend; + + s->dma_dac.rawbuf = s->dma_adc.rawbuf = NULL; + s->dma_dac.mapped = s->dma_adc.mapped = 0; + s->dma_dac.ready = s->dma_adc.ready = 0; + + M_printk("maestro: freeing %p\n",s->card->dmapages); + /* undo marking the pages as reserved */ + + mapend = MAP_NR(s->card->dmapages + (PAGE_SIZE << s->card->dmaorder) - 1); + for (map = MAP_NR(s->card->dmapages); map <= mapend; map++) + clear_bit(PG_reserved, &mem_map[map].flags); + + free_pages((unsigned long)s->card->dmapages,s->card->dmaorder); + s->card->dmapages = NULL; +} + +static int +ess_open(struct inode *inode, struct file *file) { int minor = MINOR(inode->i_rdev); struct ess_card *c = devs; @@ -2801,13 +2786,21 @@ static int ess_open(struct inode *inode, struct file *file) return -ERESTARTSYS; down(&s->open_sem); } + + /* under semaphore.. */ + if ((s->card->dmapages==NULL) && allocate_buffers(s)) { + up(&s->open_sem); + return -ENOMEM; + } + if (file->f_mode & FMODE_READ) { /* fmtm &= ~((ESS_FMT_STEREO | ESS_FMT_16BIT) << ESS_ADC_SHIFT); if ((minor & 0xf) == SND_DEV_DSP16) fmts |= ESS_FMT_16BIT << ESS_ADC_SHIFT; */ - fmtm = (ESS_FMT_STEREO|ESS_FMT_16BIT) << ESS_ADC_SHIFT; + fmtm &= ~((ESS_FMT_STEREO|ESS_FMT_16BIT) << ESS_ADC_SHIFT); + fmts = (ESS_FMT_STEREO|ESS_FMT_16BIT) << ESS_ADC_SHIFT; s->dma_adc.ossfragshift = s->dma_adc.ossmaxfrags = s->dma_adc.subdivision = 0; set_adc_rate(s, 8000); @@ -2816,6 +2809,7 @@ static int ess_open(struct inode *inode, struct file *file) fmtm &= ~((ESS_FMT_STEREO | ESS_FMT_16BIT) << ESS_DAC_SHIFT); if ((minor & 0xf) == SND_DEV_DSP16) fmts |= ESS_FMT_16BIT << ESS_DAC_SHIFT; + s->dma_dac.ossfragshift = s->dma_dac.ossmaxfrags = s->dma_dac.subdivision = 0; set_dac_rate(s, 8000); } @@ -2823,17 +2817,19 @@ static int ess_open(struct inode *inode, struct file *file) s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE); /* we're covered by the open_sem */ - if( ! s->card->bob_running ) + if( ! s->card->dsps_open ) { start_bob(s); - s->card->bob_running++; - M_printk("maestro: open, %d bobs now\n",s->card->bob_running); + } + s->card->dsps_open++; + M_printk("maestro: open, %d bobs now\n",s->card->dsps_open); up(&s->open_sem); MOD_INC_USE_COUNT; return 0; } -static int ess_release(struct inode *inode, struct file *file) +static int +ess_release(struct inode *inode, struct file *file) { struct ess_state *s = (struct ess_state *)file->private_data; @@ -2847,16 +2843,13 @@ static int ess_release(struct inode *inode, struct file *file) if (file->f_mode & FMODE_READ) { stop_adc(s); } - - /* free our shared dma buffers */ - dealloc_dmabuf(&s->dma_adc); - dealloc_dmabuf(&s->dma_dac); s->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE); /* we're covered by the open_sem */ - M_printk("maestro: %d -1 bob clients\n",s->card->bob_running); - if( --s->card->bob_running <= 0) { + M_printk("maestro: %d dsps now alive\n",s->card->dsps_open-1); + if( --s->card->dsps_open <= 0) { stop_bob(s); + free_buffers(s); } up(&s->open_sem); wake_up(&s->open_wait); @@ -2864,7 +2857,7 @@ static int ess_release(struct inode *inode, struct file *file) return 0; } -static /*const*/ struct file_operations ess_audio_fops = { +static struct file_operations ess_audio_fops = { &ess_llseek, &ess_read, &ess_write, @@ -2919,17 +2912,10 @@ int maestro_apm_callback(apm_event_t ae) { } #endif -void free_mixpage(struct ess_card *card) { - if (card->mixpage) { - /* undo marking the page as reserved */ - clear_bit(PG_reserved, &mem_map[MAP_NR(card->mixpage)].flags); - /* free mixpage */ - free_pages((unsigned long)card->mixpage, 1); - } -} /* --------------------------------------------------------------------- */ -static int maestro_install(struct pci_dev *pcidev, int card_type) +static int +maestro_install(struct pci_dev *pcidev, int card_type) { u16 w; u32 n; @@ -2970,26 +2956,16 @@ static int maestro_install(struct pci_dev *pcidev, int card_type) memset(card, 0, sizeof(*card)); - /* allocate a page for the input mixer APUs - 512 * NR_DSPS must fit in here !!*/ - if(!(card->mixpage = (void *)__get_free_pages(GFP_KERNEL|GFP_DMA, 1))) - { - printk(KERN_WARNING "maestro: can't allocate mixer page.\n"); - kfree(card); - return 0; - } - #ifdef CONFIG_APM printk("reg_callback: %d\n",apm_register_callback(maestro_apm_callback)); #endif - /* mark the page reserved */ - set_bit(PG_reserved, &mem_map[MAP_NR(card->mixpage)].flags); card->iobase = iobase; card->card_type = card_type; card->irq = pcidev->irq; card->next = devs; card->magic = ESS_CARD_MAGIC; + spin_lock_init(&card->lock); devs = card; /* init our groups of 6 apus */ @@ -2997,10 +2973,13 @@ static int maestro_install(struct pci_dev *pcidev, int card_type) { struct ess_state *s=&card->channels[i]; + s->index = i; + s->card = card; init_waitqueue_head(&s->dma_adc.wait); init_waitqueue_head(&s->dma_dac.wait); init_waitqueue_head(&s->open_wait); + spin_lock_init(&ess->lock); init_MUTEX(&s->open_sem); s->magic = ESS_STATE_MAGIC; @@ -3016,8 +2995,6 @@ static int maestro_install(struct pci_dev *pcidev, int card_type) /* register devices */ if ((s->dev_audio = register_sound_dsp(&ess_audio_fops, -1)) < 0) break; - /* divide the page into smaller chunks */ - s->mixbuf = card->mixpage + (i * 512); } num = i; @@ -3174,7 +3151,6 @@ static int maestro_install(struct pci_dev *pcidev, int card_type) n&=~0x000F; /* ASSP off */ outl(n, iobase+0x34); - n=inl(iobase+0x34); n|=(1<<29); /* Enable ring bus */ outl(n, iobase+0x34); @@ -3220,7 +3196,6 @@ static int maestro_install(struct pci_dev *pcidev, int card_type) w|=(1<<0); /* SB IRQ on */ outw(w, iobase+0x18); - #if 0 /* asp crap */ outb(0, iobase+0xA4); outb(3, iobase+0xA2); @@ -3324,7 +3299,6 @@ static int maestro_install(struct pci_dev *pcidev, int card_type) if(s->dev_audio != -1) unregister_sound_dsp(s->dev_audio); } - free_mixpage(card); release_region(card->iobase, 256); kfree(card); return 0; @@ -3334,6 +3308,7 @@ static int maestro_install(struct pci_dev *pcidev, int card_type) return 1; } +/* XXX __init ? */ #ifdef MODULE int init_module(void) #else @@ -3349,13 +3324,21 @@ int __init init_maestro(void) pcidev = NULL; + if (dsps_order < 0) { + dsps_order = 1; + printk(KERN_WARNING "maestro: clipping dsps_order to %d\n",dsps_order); + } + else if (dsps_order > MAX_DSP_ORDER) { + dsps_order = MAX_DSP_ORDER; + printk(KERN_WARNING "maestro: clipping dsps_order to %d\n",dsps_order); + } + /* * Find the ESS Maestro 2. */ - while( (pcidev = pci_find_device(PCI_VENDOR_ESS, PCI_DEVICE_ID_ESS_ESS1968, pcidev))!=NULL - && - ( maestro_install(pcidev, TYPE_MAESTRO2) )) { + while( (pcidev = pci_find_device(PCI_VENDOR_ESS, PCI_DEVICE_ID_ESS_ESS1968, pcidev))!=NULL ) { + if (maestro_install(pcidev, TYPE_MAESTRO2)) foundone=1; } @@ -3363,9 +3346,8 @@ int __init init_maestro(void) * Find the ESS Maestro 2E */ - while((pcidev = pci_find_device(PCI_VENDOR_ESS, PCI_DEVICE_ID_ESS_ESS1978, pcidev))!=NULL - && - ( maestro_install(pcidev, TYPE_MAESTRO2E) )) { + while( (pcidev = pci_find_device(PCI_VENDOR_ESS, PCI_DEVICE_ID_ESS_ESS1978, pcidev))!=NULL) { + if (maestro_install(pcidev, TYPE_MAESTRO2E)) foundone=1; } @@ -3373,24 +3355,25 @@ int __init init_maestro(void) * ESS Maestro 1 */ - while((pcidev = pci_find_device(PCI_VENDOR_ESS_OLD, PCI_DEVICE_ID_ESS_ESS0100, pcidev))!=NULL - && - ( maestro_install(pcidev, TYPE_MAESTRO) )) { + while((pcidev = pci_find_device(PCI_VENDOR_ESS_OLD, PCI_DEVICE_ID_ESS_ESS0100, pcidev))!=NULL) { + if (maestro_install(pcidev, TYPE_MAESTRO)) foundone=1; } - if( ! foundone ) + if( ! foundone ) { + printk("maestro: no devices found.\n"); return -ENODEV; + } return 0; } /* --------------------------------------------------------------------- */ #ifdef MODULE - MODULE_AUTHOR("Zach Brown <zab@redhat.com>, Alan Cox <alan@redhat.com>"); MODULE_DESCRIPTION("ESS Maestro Driver"); #ifdef M_DEBUG MODULE_PARM(debug,"i"); +MODULE_PARM(dsps_order,"i"); #endif void cleanup_module(void) @@ -3414,7 +3397,6 @@ void cleanup_module(void) if(ess->dev_audio != -1) unregister_sound_dsp(ess->dev_audio); } - free_mixpage(s); release_region(s->iobase, 256); kfree(s); } @@ -3422,4 +3404,3 @@ void cleanup_module(void) } #endif /* MODULE */ - diff --git a/drivers/usb/Makefile b/drivers/usb/Makefile index 8d6006493..dbd8aa169 100644 --- a/drivers/usb/Makefile +++ b/drivers/usb/Makefile @@ -98,21 +98,27 @@ ifeq ($(CONFIG_USB_PRINTER),m) endif ifeq ($(CONFIG_USB_SERIAL),y) - L_OBJS += serial.o + L_OBJS += usb-serial.o endif ifeq ($(CONFIG_USB_SERIAL),m) - M_OBJS += serial.o - MIX_OBJS += serial.o + M_OBJS += usb-serial.o + MIX_OBJS += usb-serial.o +endif + +ifneq ($(CONFIG_ADB_KEYBOARD),y) +KEYMAP=keymap +else +KEYMAP=keymap-mac endif ifeq ($(CONFIG_USB_KBD),y) - L_OBJS += keyboard.o keymap.o + L_OBJS += keyboard.o $(KEYMAP).o endif ifeq ($(CONFIG_USB_KBD),m) M_OBJS += usb-keyboard.o - MIX_OBJS += keyboard.o keymap.o + MIX_OBJS += keyboard.o $(KEYMAP).o endif ifeq ($(CONFIG_USB_AUDIO),y) @@ -177,13 +183,8 @@ keymap-mac.o: keymap-mac.c keymap-mac.c: maps/mac.map maps/usb.map ./mkmap.adb > $@ -ifneq ($(CONFIG_MAC_KEYBOARD),y) -usb-keyboard.o: keymap.o keyboard.o - $(LD) $(LD_RFLAG) -r -o $@ keymap.o keyboard.o -else -usb-keyboard.o: keymap-mac.o keyboard.o - $(LD) $(LD_RFLAG) -r -o $@ keymap-mac.o keyboard.o -endif +usb-keyboard.o: $(KEYMAP).o keyboard.o + $(LD) $(LD_RFLAG) -r -o $@ $(KEYMAP).o keyboard.o ifeq ($(CONFIG_USB_SCSI_DEBUG),y) usb-scsi.o: usb_scsi.o usb_scsi_debug.o diff --git a/drivers/usb/acm.c b/drivers/usb/acm.c index 61830f720..3ecea982e 100644 --- a/drivers/usb/acm.c +++ b/drivers/usb/acm.c @@ -5,7 +5,7 @@ * * version 0.8: Fixed endianity bug, some cleanups. I really hate to have * half of driver in form if (...) { info("x"); return y; } - * Pavel Machek <pavel@suse.de> + * Pavel Machek <pavel@suse.cz> * * version 0.7: Added usb flow control. Fixed bug in uhci.c (what idiot * wrote this code? ...Oops that was me). Fixed module cleanup. Did some @@ -65,7 +65,7 @@ #include "usb.h" #define NR_PORTS 3 -#define ACM_MAJOR 166 +#define ACM_MAJOR 166 /* Wow, major is now officially allocated */ //#define info(message...); printk(message); #define info(message...); @@ -425,7 +425,7 @@ static int acm_probe(struct usb_device *dev) interface->bNumEndpoints != 2) continue; - endpoint = &interface->endpoint[0]; + /* if ((endpoint->bEndpointAddress & 0x80) == 0x80) */ if ((endpoint->bEndpointAddress & 0x80) != 0x80) swapped = 1; diff --git a/drivers/usb/ezusb.c b/drivers/usb/ezusb.c index 59e7b4a67..8aabddd17 100644 --- a/drivers/usb/ezusb.c +++ b/drivers/usb/ezusb.c @@ -37,7 +37,6 @@ #include <linux/config.h> #include <linux/module.h> #include <linux/socket.h> -#include <linux/miscdevice.h> #include <linux/list.h> #include <linux/vmalloc.h> #include <linux/slab.h> @@ -967,10 +966,6 @@ static struct file_operations ezusb_fops = { NULL /* lock */ }; -static struct miscdevice ezusb_misc = { - 192, "ezusb", &ezusb_fops -}; - /* --------------------------------------------------------------------- */ static int ezusb_probe(struct usb_device *usbdev) @@ -1044,7 +1039,9 @@ static struct usb_driver ezusb_driver = { "ezusb", ezusb_probe, ezusb_disconnect, - { NULL, NULL } + { NULL, NULL }, + &ezusb_fops, + 32 }; /* --------------------------------------------------------------------- */ @@ -1062,11 +1059,6 @@ int ezusb_init(void) init_waitqueue_head(&ezusb[u].wait); spin_lock_init(&ezusb[u].lock); } - /* register misc device */ - if (misc_register(&ezusb_misc)) { - printk(KERN_WARNING "ezusb: cannot register minor %d\n", ezusb_misc.minor); - return -1; - } usb_register(&ezusb_driver); printk(KERN_INFO "ezusb: Anchorchip firmware download driver registered\n"); return 0; @@ -1075,7 +1067,6 @@ int ezusb_init(void) void ezusb_cleanup(void) { usb_deregister(&ezusb_driver); - misc_deregister(&ezusb_misc); } /* --------------------------------------------------------------------- */ diff --git a/drivers/usb/hp_scanner.c b/drivers/usb/hp_scanner.c index bdf3c4181..e69d8f63e 100644 --- a/drivers/usb/hp_scanner.c +++ b/drivers/usb/hp_scanner.c @@ -59,8 +59,6 @@ * stuff may be some kind of maps and stuff but that's kinda rare. */ #define OBUF_SIZE 128 -#define USB_SCANNER_MAJOR 16 - struct hpscan_usb_data { struct usb_device *hpscan_dev; /* init: probe_scanner */ __u8 isopen; /* nz if open */ @@ -279,14 +277,6 @@ disconnect_scanner(struct usb_device *dev) } static struct -usb_driver scanner_driver = { - "usbscanner", - probe_scanner, - disconnect_scanner, - { NULL, NULL } -}; - -static struct file_operations usb_scanner_fops = { NULL, /* seek */ read_scanner, @@ -302,15 +292,19 @@ file_operations usb_scanner_fops = { NULL, /* fasync */ }; +static struct +usb_driver scanner_driver = { + "usbscanner", + probe_scanner, + disconnect_scanner, + { NULL, NULL }, + &usb_scanner_fops, + 48 +}; + int usb_hp_scanner_init(void) { - int result; - - if ((result = register_chrdev(USB_SCANNER_MAJOR, "usbscanner", &usb_scanner_fops)) < 0) { - printk(KERN_WARNING "hp_scanner: Cannot register device\n"); - return result; - } usb_register(&scanner_driver); printk(KERN_DEBUG "USB Scanner support registered.\n"); return 0; @@ -324,7 +318,6 @@ usb_hp_scanner_cleanup(void) hps->present = 0; usb_deregister(&scanner_driver); - unregister_chrdev(USB_SCANNER_MAJOR, "usbscanner"); } #ifdef MODULE diff --git a/drivers/usb/mouse.c b/drivers/usb/mouse.c index da5ee515e..7d1c80aeb 100644 --- a/drivers/usb/mouse.c +++ b/drivers/usb/mouse.c @@ -34,7 +34,6 @@ #include <linux/sched.h> #include <linux/signal.h> #include <linux/errno.h> -#include <linux/miscdevice.h> #include <linux/random.h> #include <linux/poll.h> #include <linux/init.h> @@ -44,8 +43,6 @@ #include "usb.h" -#define USB_MOUSE_MINOR 32 - struct mouse_state { unsigned char buttons; /* current button state */ long dx; /* dx, dy, dz are change since last read */ @@ -109,7 +106,7 @@ static int mouse_irq(int state, void *__buffer, int len, void *dev_id) /* if the USB mouse sends an interrupt, then something noteworthy must have happened */ - mouse->buttons = data[0] & 0x07; + mouse->buttons = data[0] & 0x0f; mouse->dx += data[1]; /* data[] is signed, so this works */ mouse->dy -= data[2]; /* y-axis is reversed */ mouse->dz -= data[3]; @@ -319,10 +316,6 @@ struct file_operations usb_mouse_fops = { fasync_mouse, }; -static struct miscdevice usb_mouse = { - USB_MOUSE_MINOR, "USB mouse", &usb_mouse_fops -}; - static int mouse_probe(struct usb_device *dev) { struct usb_interface_descriptor *interface; @@ -416,7 +409,9 @@ static struct usb_driver mouse_driver = { "mouse", mouse_probe, mouse_disconnect, - { NULL, NULL } + { NULL, NULL }, + &usb_mouse_fops, + 16 }; int usb_mouse_init(void) @@ -428,8 +423,6 @@ int usb_mouse_init(void) init_waitqueue_head(&mouse->wait); mouse->fasync = NULL; - misc_register(&usb_mouse); - usb_register(&mouse_driver); printk(KERN_INFO "USB HID boot protocol mouse driver registered.\n"); return 0; @@ -449,7 +442,6 @@ void usb_mouse_cleanup(void) /* this, too, probably needs work */ usb_deregister(&mouse_driver); - misc_deregister(&usb_mouse); } #ifdef MODULE diff --git a/drivers/usb/ohci-hcd.c b/drivers/usb/ohci-hcd.c index eeace6d61..3dc6d74ca 100644 --- a/drivers/usb/ohci-hcd.c +++ b/drivers/usb/ohci-hcd.c @@ -179,7 +179,7 @@ static int sohci_iso_handler(void * ohci_in, struct usb_ohci_ed *ed, void * data return 0; } -static int sohci_request_irq(struct usb_device *usb_dev, unsigned int pipe, usb_device_irq handler, int period, void *dev_id, void **handle) +static int sohci_request_irq(struct usb_device *usb_dev, unsigned int pipe, usb_device_irq handler, int period, void *dev_id, void **handle, long bustime) { struct ohci * ohci = usb_dev->bus->hcpriv; struct ohci_device * dev = usb_to_ohci(usb_dev); diff --git a/drivers/usb/ohci.c b/drivers/usb/ohci.c index 763b8199e..fd03125ce 100644 --- a/drivers/usb/ohci.c +++ b/drivers/usb/ohci.c @@ -24,7 +24,7 @@ * * No filesystems were harmed in the development of this code. * - * $Id: ohci.c,v 1.77 1999/09/16 04:30:19 greg Exp $ + * $Id: ohci.c,v 1.80 1999/09/30 06:32:17 greg Exp $ */ #include <linux/config.h> @@ -941,7 +941,7 @@ static __u16 ohci_td_bytes_done(struct ohci_td *td) * interrupt. (It's really a pointer to the TD). */ static int ohci_request_irq(struct usb_device *usb, unsigned int pipe, - usb_device_irq handler, int period, void *dev_id, void **handle) + usb_device_irq handler, int period, void *dev_id, void **handle, long bustime) { struct ohci_device *dev = usb_to_ohci(usb); struct ohci_td *td; @@ -2511,7 +2511,6 @@ static void release_ohci(struct ohci *ohci) writel(OHCI_USB_SUSPEND, &ohci->regs->control); free_page((unsigned long) root_hub->hcca); kfree(ohci->bus->root_hub); - root_hub->hcca = NULL; ohci->bus->root_hub = NULL; } @@ -2601,7 +2600,6 @@ static int ohci_control_thread(void * __ohci) spin_unlock_irq(¤t->sigmask_lock); if(signr == SIGUSR1) { - /* TODO: have it do a full ed/td queue dump? */ printk(KERN_DEBUG "OHCI status dump:\n"); show_ohci_status(ohci); } else if (signr == SIGUSR2) { diff --git a/drivers/usb/printer.c b/drivers/usb/printer.c index 17dac365a..dffd76559 100644 --- a/drivers/usb/printer.c +++ b/drivers/usb/printer.c @@ -1,8 +1,10 @@ /* Driver for USB Printers * - * (C) Michael Gee (michael@linuxspecific.com) 1999 - * + * Copyright 1999 Michael Gee (michael@linuxspecific.com) + * Copyright 1999 Pavel Machek (pavel@suse.cz) + * + * Distribute under GPL version 2 or later. */ #include <linux/module.h> @@ -23,12 +25,6 @@ #define NAK_TIMEOUT (HZ) /* stall wait for printer */ #define MAX_RETRY_COUNT ((60*60*HZ)/NAK_TIMEOUT) /* should not take 1 minute a page! */ -#ifndef USB_PRINTER_MAJOR -#define USB_PRINTER_MAJOR 63 -#endif - -static int mymajor = USB_PRINTER_MAJOR; - #define MAX_PRINTERS 8 struct pp_usb_data { @@ -375,13 +371,6 @@ static void printer_disconnect(struct usb_device *dev) dev->private = NULL; /* just in case */ } -static struct usb_driver printer_driver = { - "printer", - printer_probe, - printer_disconnect, - { NULL, NULL } -}; - static struct file_operations usb_printer_fops = { NULL, /* seek */ read_printer, @@ -397,17 +386,17 @@ static struct file_operations usb_printer_fops = { NULL }; +static struct usb_driver printer_driver = { + "printer", + printer_probe, + printer_disconnect, + { NULL, NULL }, + &usb_printer_fops, + 0 +}; + int usb_printer_init(void) { - int result; - - if ((result = register_chrdev(USB_PRINTER_MAJOR, "usblp", &usb_printer_fops)) < 0) { - printk(KERN_WARNING "usbprinter: Cannot register device\n"); - return result; - } - if (mymajor == 0) { - mymajor = result; - } usb_register(&printer_driver); printk(KERN_INFO "USB Printer support registered.\n"); return 0; @@ -423,6 +412,5 @@ int init_module(void) void cleanup_module(void) { usb_deregister(&printer_driver); - unregister_chrdev(mymajor, "usblp"); } #endif diff --git a/drivers/usb/serial.c b/drivers/usb/serial.c index b85f2b5c6..e69de29bb 100644 --- a/drivers/usb/serial.c +++ b/drivers/usb/serial.c @@ -1,691 +0,0 @@ -/* - * USB Serial Converter driver - * - * Greg Kroah-Hartman (greg@kroah.com) - * - * This was based on the ACM driver by Armin Fuerst (which was based - * on a driver by Brad Keryan) - * - * Currently only works for the Belkin and Peracom Serial converters. - * Should also work on the Etek serial converter, if anyone knows the - * vendor and device ids for that device. - * - * - * version 0.1.1 (10/05/99) gkh - * Changed the major number to not conflict with anything else. - * - * version 0.1 (09/28/99) gkh - * Can recognize the two different devices and start up a read from - * device when asked to. Writes also work. No control signals yet, this - * all is vendor specific data (i.e. no spec), also no control for - * different baud rates or other bit settings. - * Currently we are using the same devid as the acm driver. This needs - * to change. - * - * (C) Copyright 1999 Greg Kroah-Hartman (greg@kroah.com) - * - */ - -#include <linux/kernel.h> -#include <linux/sched.h> -#include <linux/signal.h> -#include <linux/errno.h> -#include <linux/poll.h> -#include <linux/init.h> -#include <linux/malloc.h> -#include <linux/fcntl.h> -#include <linux/tty_driver.h> -#include <linux/tty_flip.h> -#include <linux/tty.h> -#include <linux/module.h> -#include <linux/spinlock.h> - - -#include "usb.h" -/*#define SERIAL_DEBUG 1*/ - -#ifdef SERIAL_DEBUG - #define debug_info(message); printk(message); -#else - #define debug_info(message); -#endif - - -/* USB Serial devices vendor ids and device ids that this driver supports */ -#define BELKIN_VENDOR_ID 0x056c -#define BELKIN_SERIAL_CONVERTER 0x8007 -#define PERACOM_VENDOR_ID 0x0565 -#define PERACOM_SERIAL_CONVERTER 0x0001 - - -#define SERIAL_MAJOR 240 - -#define NUM_PORTS 4 /* Have to pick a number for now. Need to look */ - /* into dynamically creating them at insertion time. */ - - -static int usb_serial_probe(struct usb_device *dev); -static void usb_serial_disconnect(struct usb_device *dev); - -typedef enum { - unknown = 0, - Belkin = 1, - Peracom = 2 - } SERIAL_TYPE; - -struct usb_serial_state { - struct usb_device * dev; - SERIAL_TYPE type; /* what manufacturer's type of converter */ - void * irq_handle; - unsigned int irqpipe; - struct tty_struct *tty; /* the coresponding tty for this device */ - char present; - char active; - - char interrupt_in_inuse; - __u8 interrupt_in_endpoint; - __u8 interrupt_in_interval; - __u16 interrupt_in_size; - unsigned int interrupt_in_pipe; - unsigned char * interrupt_in_buffer; - void * interrupt_in_transfer; - - char bulk_in_inuse; - __u8 bulk_in_endpoint; - __u8 bulk_in_interval; - __u16 bulk_in_size; - unsigned int bulk_in_pipe; - unsigned char * bulk_in_buffer; - void * bulk_in_transfer; - - char bulk_out_inuse; - __u8 bulk_out_endpoint; - __u8 bulk_out_interval; - __u16 bulk_out_size; - unsigned int bulk_out_pipe; - unsigned char * bulk_out_buffer; - void * bulk_out_transfer; -}; - -static struct usb_driver usb_serial_driver = { - "serial", - usb_serial_probe, - usb_serial_disconnect, - { NULL, NULL } -}; - -static int serial_refcount; -static struct tty_driver serial_tty_driver; -static struct tty_struct * serial_tty[NUM_PORTS]; -static struct termios * serial_termios[NUM_PORTS]; -static struct termios * serial_termios_locked[NUM_PORTS]; -static struct usb_serial_state serial_state_table[NUM_PORTS]; - - - -static int serial_read_irq (int state, void *buffer, int count, void *dev_id) -{ - struct usb_serial_state *serial = (struct usb_serial_state *)dev_id; - struct tty_struct *tty = serial->tty; - unsigned char* data = buffer; - int i; - - debug_info("USB: serial_read_irq\n"); - -#ifdef SERIAL_DEBUG - if (count) { - printk("%d %s\n", count, data); - } -#endif - - if (count) { - for (i=0;i<count;i++) { - tty_insert_flip_char(tty,data[i],0); - } - tty_flip_buffer_push(tty); - } - - /* Continue transfer */ - /* return (1); */ - - /* No more transfer, let the irq schedule us again */ - serial->bulk_in_inuse = 0; - return (0); -} - - -static int serial_write_irq (int state, void *buffer, int count, void *dev_id) -{ - struct usb_serial_state *serial = (struct usb_serial_state *) dev_id; - struct tty_struct *tty = serial->tty; - - debug_info("USB Serial: serial_write_irq\n"); - - if (!serial->bulk_out_inuse) { - debug_info("USB Serial: write irq for a finished pipe?\n"); - return (0); - } - - usb_terminate_bulk (serial->dev, serial->bulk_out_transfer); - serial->bulk_out_inuse = 0; - - if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && tty->ldisc.write_wakeup) - (tty->ldisc.write_wakeup)(tty); - - wake_up_interruptible(&tty->write_wait); - - return 0; -} - - -static int usb_serial_irq (int state, void *buffer, int len, void *dev_id) -{ -// struct usb_serial_state *serial = (struct usb_serial_state *) dev_id; - - debug_info("USB Serial: usb_serial_irq\n"); - - /* ask for a bulk read */ -// serial->bulk_in_inuse = 1; -// serial->bulk_in_transfer = usb_request_bulk (serial->dev, serial->bulk_in_pipe, serial_read_irq, serial->bulk_in_buffer, serial->bulk_in_size, serial); - - return (1); -} - - - - - -/* tty interface functions */ -static int serial_open (struct tty_struct *tty, struct file * filp) -{ - struct usb_serial_state *serial; - - debug_info("USB: serial_open\n"); - - serial = &serial_state_table [MINOR(tty->device)-tty->driver.minor_start]; - tty->driver_data = serial; - serial->tty = tty; - - if (!serial->present) { - debug_info("USB Serial: no device registered\n"); - return -EINVAL; - } - - if (serial->active) { - debug_info ("USB Serial: device already open\n"); - return -EINVAL; - } - serial->active = 1; - - /*Start reading from the device*/ - serial->bulk_in_inuse = 1; - serial->bulk_in_transfer = usb_request_bulk (serial->dev, serial->bulk_in_pipe, serial_read_irq, serial->bulk_in_buffer, serial->bulk_in_size, serial); - - /* Need to do device specific setup here (control lines, baud rate, etc.) */ - /* FIXME!!! */ - - return (0); -} - - -static void serial_close(struct tty_struct *tty, struct file * filp) -{ - struct usb_serial_state *serial = (struct usb_serial_state *) tty->driver_data; - debug_info("USB: serial_close\n"); - - if (!serial->present) { - debug_info("USB Serial: no device registered\n"); - return; - } - - if (!serial->active) { - debug_info ("USB Serial: device already open\n"); - return; - } - - /* Need to change the control lines here */ - /* FIXME */ - - if (serial->bulk_out_inuse){ - usb_terminate_bulk (serial->dev, serial->bulk_out_transfer); - serial->bulk_out_inuse = 0; - } - if (serial->bulk_in_inuse){ - usb_terminate_bulk (serial->dev, serial->bulk_in_transfer); - serial->bulk_in_inuse = 0; - } - - /* release the irq? */ - - serial->active = 0; -} - - -static int serial_write (struct tty_struct * tty, int from_user, const unsigned char *buf, int count) -{ - struct usb_serial_state *serial = (struct usb_serial_state *) tty->driver_data; - int written; - - debug_info("USB Serial: serial_write\n"); - - if (!serial->present) { - debug_info("USB Serial: device not registered\n"); - return (-EINVAL); - } - - if (!serial->active) { - debug_info ("USB Serial: device not opened\n"); - return (-EINVAL); - } - - if (serial->bulk_out_inuse) { - debug_info ("USB Serial: already writing\n"); - return (0); - } - - written = (count > serial->bulk_out_size) ? serial->bulk_out_size : count; - - if (from_user) { - copy_from_user(serial->bulk_out_buffer, buf, written); - } - else { - memcpy (serial->bulk_out_buffer, buf, written); - } - - /* send the data out the bulk port */ - serial->bulk_out_inuse = 1; - serial->bulk_out_transfer = usb_request_bulk (serial->dev, serial->bulk_out_pipe, serial_write_irq, serial->bulk_out_buffer, written, serial); - - return (written); -} - - -static void serial_put_char (struct tty_struct *tty, unsigned char ch) -{ - struct usb_serial_state *serial = (struct usb_serial_state *)tty->driver_data; - - debug_info("USB Serial: serial_put_char\n"); - - if (!serial->present) { - debug_info("USB Serial: no device registered\n"); - return; - } - - if (!serial->active) { - debug_info ("USB Serial: device not open\n"); - return; - } - - if (serial->bulk_out_inuse) { - debug_info ("USB Serial: already writing\n"); - return; - } - - /* send the single character out the bulk port */ - serial->bulk_out_buffer[0] = ch; - serial->bulk_out_inuse = 1; - serial->bulk_out_transfer = usb_request_bulk (serial->dev, serial->bulk_out_pipe, serial_write_irq, serial->bulk_out_buffer, 1, serial); - - return; -} - - -static int serial_write_room (struct tty_struct *tty) -{ - struct usb_serial_state *serial = (struct usb_serial_state *)tty->driver_data; - - debug_info("USB Serial: serial_write_room\n"); - - if (!serial->present) { - debug_info("USB Serial: no device registered\n"); - return (-EINVAL); - } - - if (!serial->active) { - debug_info ("USB Serial: device not open\n"); - return (-EINVAL); - } - - if (serial->bulk_out_inuse) { - return (0); - } - - return serial->bulk_out_size; -} - - -static int serial_chars_in_buffer (struct tty_struct *tty) -{ - struct usb_serial_state *serial = (struct usb_serial_state *)tty->driver_data; - - debug_info("USB Serial: serial_chars_in_buffer\n"); - - if (!serial->present) { - debug_info("USB Serial: no device registered\n"); - return (-EINVAL); - } - - if (!serial->active) { - debug_info ("USB Serial: device not open\n"); - return (-EINVAL); - } - - if (serial->bulk_out_inuse) { - return (serial->bulk_out_size); - } - - return (0); -} - - -static void serial_throttle (struct tty_struct * tty) -{ - struct usb_serial_state *serial = (struct usb_serial_state *) tty->driver_data; - - debug_info("USB Serial: serial_throttle\n"); - - if (!serial->present) { - debug_info("USB Serial: no device registered\n"); - return; - } - - if (!serial->active) { - debug_info ("USB Serial: device not open\n"); - return; - } - - - /* Change the control signals */ - /* FIXME!!! */ - - return; -} - - -static void serial_unthrottle (struct tty_struct * tty) -{ - struct usb_serial_state *serial = (struct usb_serial_state *) tty->driver_data; - - debug_info("USB Serial: serial_unthrottle\n"); - - if (!serial->present) { - debug_info("USB Serial: no device registered\n"); - return; - } - - if (!serial->active) { - debug_info ("USB Serial: device not open\n"); - return; - } - - - /* Change the control signals */ - /* FIXME!!! */ - - return; -} - - -static int Get_Free_Serial (void) -{ - int i; - - for (i=0; i < NUM_PORTS; ++i) { - if (!serial_state_table[i].present) - return (i); - } - return (-1); -} - - -static int usb_serial_probe(struct usb_device *dev) -{ - struct usb_serial_state *serial; - struct usb_interface_descriptor *interface; - struct usb_endpoint_descriptor *endpoint; - SERIAL_TYPE type; - int serial_num; -// int ret; - int i; - - /* look at the device descriptor to see if it is a type that we recognize */ - type = unknown; - if ((dev->descriptor.idVendor == BELKIN_VENDOR_ID) && - (dev->descriptor.idProduct == BELKIN_SERIAL_CONVERTER)) { - /* This is the Belkin serial convertor */ - type = Belkin; - } - - if ((dev->descriptor.idVendor == PERACOM_VENDOR_ID) && - (dev->descriptor.idProduct == PERACOM_SERIAL_CONVERTER)) { - /* This is the Peracom serial convertor */ - type = Peracom; - } - - if (type == unknown) - return (-1); - - printk (KERN_INFO "USB serial converter detected.\n"); - - if (usb_set_configuration(dev, dev->config[0].bConfigurationValue)) { - printk (KERN_INFO " Failed usb_set_configuration: serial\n"); - return (-1); - } - - if (0>(serial_num = Get_Free_Serial())) { - debug_info("USB Serial: Too many devices connected\n"); - return (-1); - } - - serial = &serial_state_table[serial_num]; - - memset(serial, 0, sizeof(serial)); - serial->dev = dev; - serial->type = type; - dev->private = serial; - - /* we should have 1 bulk in, 1 bulk out, and 1 interrupt in endpoints */ - interface = &dev->config[0].interface[0].altsetting[0]; - for (i = 0; i < interface->bNumEndpoints; ++i) { - endpoint = &interface->endpoint[i]; - - if ((endpoint->bEndpointAddress & 0x80) && - ((endpoint->bmAttributes & 3) == 0x02)) { - /* we found the bulk in endpoint */ - serial->bulk_in_inuse = 0; - serial->bulk_in_endpoint = endpoint->bEndpointAddress; - serial->bulk_in_size = endpoint->wMaxPacketSize; - serial->bulk_in_interval = endpoint->bInterval; - serial->bulk_in_pipe = usb_rcvbulkpipe (dev, serial->bulk_in_endpoint); - serial->bulk_in_buffer = kmalloc (serial->bulk_in_size, GFP_KERNEL); - if (!serial->bulk_in_buffer) { - printk("USB Serial: Couldn't allocate bulk_in_buffer\n"); - goto probe_error; - } - } - - if (((endpoint->bEndpointAddress & 0x80) == 0x00) && - ((endpoint->bmAttributes & 3) == 0x02)) { - /* we found the bulk out endpoint */ - serial->bulk_out_inuse = 0; - serial->bulk_out_endpoint = endpoint->bEndpointAddress; - serial->bulk_out_size = endpoint->wMaxPacketSize; - serial->bulk_out_interval = endpoint->bInterval; - serial->bulk_out_pipe = usb_rcvbulkpipe (dev, serial->bulk_out_endpoint); - serial->bulk_out_buffer = kmalloc (serial->bulk_out_size, GFP_KERNEL); - if (!serial->bulk_out_buffer) { - printk("USB Serial: Couldn't allocate bulk_out_buffer\n"); - goto probe_error; - } - } - - if ((endpoint->bEndpointAddress & 0x80) && - ((endpoint->bmAttributes & 3) == 0x03)) { - /* we found the interrupt in endpoint */ - serial->interrupt_in_inuse = 0; - serial->interrupt_in_endpoint = endpoint->bEndpointAddress; - serial->interrupt_in_size = endpoint->wMaxPacketSize; - serial->interrupt_in_interval = endpoint->bInterval; - /* serial->interrupt_in_pipe = usb_rcvbulkpipe (dev, serial->bulk_in_endpoint); */ - serial->interrupt_in_buffer = kmalloc (serial->bulk_in_size, GFP_KERNEL); - if (!serial->bulk_in_buffer) { - printk("USB Serial: Couldn't allocate interrupt_in_buffer\n"); - goto probe_error; - } - } - - } - - - /* verify that we found all of the endpoints that we need */ - if ((!serial->bulk_in_buffer) || - (!serial->bulk_out_buffer) || - (!serial->interrupt_in_buffer)) { - printk("USB Serial: did not find all of the required endpoints\n"); - goto probe_error; - } - - - /* set up an interrupt for out bulk in pipe */ - /* ask for a bulk read */ -// serial->bulk_in_inuse = 1; -// serial->bulk_in_transfer = usb_request_bulk (serial->dev, serial->bulk_in_pipe, serial_read_irq, serial->bulk_in_buffer, serial->bulk_in_size, serial); - - /* set up our interrupt to be the time for the bulk in read */ -// ret = usb_request_irq (dev, serial->bulk_in_pipe, usb_serial_irq, serial->bulk_in_interval, serial, &serial->irq_handle); -// if (ret) { -// printk(KERN_INFO "USB Serial failed usb_request_irq (0x%x)\n", ret); -// goto probe_error; -// } - - serial->present = 1; - MOD_INC_USE_COUNT; - - return (0); - -probe_error: - if (serial) { - if (serial->bulk_in_buffer) - kfree (serial->bulk_in_buffer); - if (serial->bulk_out_buffer) - kfree (serial->bulk_out_buffer); - if (serial->interrupt_in_buffer) - kfree (serial->interrupt_in_buffer); - } - return (-1); -} - - -static void usb_serial_disconnect(struct usb_device *dev) -{ - struct usb_serial_state *serial = (struct usb_serial_state *)dev->private; - - if (serial) { - if (!serial->present) { - /* something strange is going on */ - debug_info("USB Serial: disconnect but not present?\n") - return; - } - - /* need to stop any transfers...*/ - if (serial->bulk_in_inuse) { - usb_terminate_bulk (serial->dev, serial->bulk_in_transfer); - serial->bulk_in_inuse = 0; - } - if (serial->bulk_out_inuse) { - usb_terminate_bulk (serial->dev, serial->bulk_out_transfer); - serial->bulk_out_inuse = 0; - } - // usb_release_irq (serial->dev, serial->irq_handle, serial->bulk_in_pipe); - if (serial->bulk_in_buffer) - kfree (serial->bulk_in_buffer); - if (serial->bulk_out_buffer) - kfree (serial->bulk_out_buffer); - if (serial->interrupt_in_buffer) - kfree (serial->interrupt_in_buffer); - - serial->present = 0; - serial->active = 0; - } - dev->private = NULL; - - MOD_DEC_USE_COUNT; - - printk (KERN_INFO "USB Serial device disconnected.\n"); -} - - - -int usb_serial_init(void) -{ - int i; - - /* Initalize our global data */ - for (i = 0; i < NUM_PORTS; ++i) { - memset(&serial_state_table[i], 0x00, sizeof(struct usb_serial_state)); - } - - /* register the tty driver */ - memset (&serial_tty_driver, 0, sizeof(struct tty_driver)); - serial_tty_driver.magic = TTY_DRIVER_MAGIC; - serial_tty_driver.driver_name = "usb"; - serial_tty_driver.name = "ttyUSB"; - serial_tty_driver.major = SERIAL_MAJOR; - serial_tty_driver.minor_start = 0; - serial_tty_driver.num = NUM_PORTS; - serial_tty_driver.type = TTY_DRIVER_TYPE_SERIAL; - serial_tty_driver.subtype = SERIAL_TYPE_NORMAL; - serial_tty_driver.init_termios = tty_std_termios; - serial_tty_driver.init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; - serial_tty_driver.flags = TTY_DRIVER_REAL_RAW; - serial_tty_driver.refcount = &serial_refcount; - serial_tty_driver.table = serial_tty; - serial_tty_driver.termios = serial_termios; - serial_tty_driver.termios_locked = serial_termios_locked; - - serial_tty_driver.open = serial_open; - serial_tty_driver.close = serial_close; - serial_tty_driver.write = serial_write; - serial_tty_driver.put_char = serial_put_char; - serial_tty_driver.flush_chars = NULL; //serial_flush_chars; - serial_tty_driver.write_room = serial_write_room; - serial_tty_driver.ioctl = NULL; //serial_ioctl; - serial_tty_driver.set_termios = NULL; //serial_set_termios; - serial_tty_driver.set_ldisc = NULL; - serial_tty_driver.throttle = serial_throttle; - serial_tty_driver.unthrottle = serial_unthrottle; - serial_tty_driver.stop = NULL; //serial_stop; - serial_tty_driver.start = NULL; //serial_start; - serial_tty_driver.hangup = NULL; //serial_hangup; - serial_tty_driver.break_ctl = NULL; //serial_break; - serial_tty_driver.wait_until_sent = NULL; //serial_wait_until_sent; - serial_tty_driver.send_xchar = NULL; //serial_send_xchar; - serial_tty_driver.read_proc = NULL; //serial_read_proc; - serial_tty_driver.chars_in_buffer = serial_chars_in_buffer; - serial_tty_driver.flush_buffer = NULL; //serial_flush_buffer; - if (tty_register_driver (&serial_tty_driver)) { - printk( "USB Serial: failed to register tty driver\n" ); - return -EPERM; - } - - /* register the USB driver */ - usb_register(&usb_serial_driver); - printk(KERN_INFO "USB Serial support registered.\n"); - return 0; -} - - -#ifdef MODULE -int init_module(void) -{ - return usb_serial_init(); -} - -void cleanup_module(void) -{ - tty_unregister_driver(&serial_tty_driver); - usb_deregister(&usb_serial_driver); -} - -#endif - diff --git a/drivers/usb/uhci.c b/drivers/usb/uhci.c index e359d7721..ae2b4ec73 100644 --- a/drivers/usb/uhci.c +++ b/drivers/usb/uhci.c @@ -119,6 +119,7 @@ static int uhci_map_status(int status, int dir_out) return USB_ST_INTERNALERROR; } + /* * Return the result of a TD.. */ @@ -189,12 +190,12 @@ static int uhci_td_result(struct uhci_device *dev, struct uhci_td *td, unsigned if (!status) return USB_ST_NOERROR; - /* APC BackUPS Pro kludge */ + /* XXX FIXME APC BackUPS Pro kludge */ /* It tries to send all of the descriptor instead of */ /* the amount we requested */ if (tmp->status & TD_CTRL_IOC && tmp->status & TD_CTRL_ACTIVE && - tmp->status & TD_CTRL_NAK) + tmp->status & TD_CTRL_NAK /* && its a control TD */) return USB_ST_NOERROR; #if 0 @@ -627,9 +628,11 @@ static void uhci_remove_transfer(struct uhci_td *td, char removeirq) * * Returns 0 (success) or negative (failure). * Also returns/sets a "handle pointer" that release_irq can use to stop this - * interrupt. (It's really a pointer to the TD). + * interrupt. (It's really a pointer to the TD.) */ -static int uhci_request_irq(struct usb_device *usb_dev, unsigned int pipe, usb_device_irq handler, int period, void *dev_id, void **handle) +static int uhci_request_irq(struct usb_device *usb_dev, unsigned int pipe, + usb_device_irq handler, int period, + void *dev_id, void **handle, long bustime) { struct uhci_device *dev = usb_to_uhci(usb_dev); struct uhci_td *td = uhci_td_alloc(dev); @@ -658,13 +661,15 @@ static int uhci_request_irq(struct usb_device *usb_dev, unsigned int pipe, usb_d td->buffer = virt_to_bus(dev->data); td->qh = qh; td->dev = dev; + td->pipetype = PIPE_INTERRUPT; + td->bandwidth_alloc = bustime; - /* if period 0, insert into fast q */ + /* if period 0, set _REMOVE flag */ if (period == 0) { td->flags |= UHCI_TD_REMOVE; - qh->skel = &dev->uhci->skel_int2_qh; - } else - qh->skel = &dev->uhci->skel_int8_qh; + } + + qh->skel = &dev->uhci->skelqh[__interval_to_skel(period)]; uhci_add_irq_list(dev->uhci, td, handler, dev_id); @@ -964,6 +969,7 @@ static int uhci_run_isoc (struct usb_isoc_desc *isocdesc, td->info = destination | ((frlen - 1) << 21); td->buffer = virt_to_bus (bufptr); td->dev = dev; + td->pipetype = PIPE_ISOCHRONOUS; td->isoc_td_number = ix; /* 0-based; does not wrap/overflow back to 0 */ if (isocdesc->callback_frames && @@ -971,7 +977,7 @@ static int uhci_run_isoc (struct usb_isoc_desc *isocdesc, td->status |= TD_CTRL_IOC; td->completed = isocdesc->callback_fn; cb_frames = 0; - uhci_add_irq_list (dev->uhci, td, isocdesc->callback_fn, isocdesc->context); + uhci_add_irq_list (dev->uhci, td, isocdesc->callback_fn, isocdesc); } bufptr += fd->frame_length; /* or isocdesc->frame_size; */ @@ -991,7 +997,7 @@ static int uhci_run_isoc (struct usb_isoc_desc *isocdesc, if (!(td->status & TD_CTRL_IOC)) { td->status |= TD_CTRL_IOC; td->completed = isocdesc->callback_fn; - uhci_add_irq_list(dev->uhci, td, isocdesc->callback_fn, isocdesc->context); /* TBD: D.K. ??? */ + uhci_add_irq_list(dev->uhci, td, isocdesc->callback_fn, isocdesc); /* TBD: D.K. ??? */ } return 0; } /* end uhci_run_isoc */ @@ -1158,6 +1164,7 @@ static int uhci_control_msg(struct usb_device *usb_dev, unsigned int pipe, devre td->status = status; /* Try forever */ td->info = destination | (7 << 21); /* 8 bytes of data */ td->buffer = virt_to_bus(cmd); + td->pipetype = PIPE_CONTROL; /* * If direction is "send", change the frame from SETUP (0x2D) @@ -1191,6 +1198,7 @@ static int uhci_control_msg(struct usb_device *usb_dev, unsigned int pipe, devre td->info = destination | ((pktsze - 1) << 21); /* pktsze bytes of data */ td->buffer = virt_to_bus(data); td->backptr = &prevtd->link; + td->pipetype = PIPE_CONTROL; data += pktsze; len -= pktsze; @@ -1219,6 +1227,7 @@ static int uhci_control_msg(struct usb_device *usb_dev, unsigned int pipe, devre td->buffer = 0; td->backptr = &prevtd->link; td->link = UHCI_PTR_TERM; /* Terminate */ + td->pipetype = PIPE_CONTROL; /* Start it up.. */ ret = uhci_run_control(dev, first, td, timeout); @@ -1349,6 +1358,7 @@ static int uhci_bulk_msg(struct usb_device *usb_dev, unsigned int pipe, void *da usb_pipeout(pipe)) << TD_TOKEN_TOGGLE); /* pktsze bytes of data */ td->buffer = virt_to_bus(data); td->backptr = &prevtd->link; + td->pipetype = PIPE_BULK; data += maxsze; len -= maxsze; @@ -1429,6 +1439,7 @@ static void * uhci_request_bulk(struct usb_device *usb_dev, unsigned int pipe, u td->backptr = &prevtd->link; td->qh = bulk_qh; td->dev = dev; + td->pipetype = PIPE_BULK; data += pktsze; len -= pktsze; @@ -1467,11 +1478,11 @@ static int uhci_terminate_bulk(struct usb_device *dev, void *first) { /* none found? there is nothing to remove! */ if (!first) - return 0; + return USB_ST_REMOVED; uhci_remove_transfer(first, 1); - return 1; + return USB_ST_NOERROR; } struct usb_operations uhci_device_operations = { @@ -1698,7 +1709,7 @@ static void uhci_interrupt_notify(struct uhci *uhci) uhci_packetout(td->info)) << 19; /* toggle between data0 and data1 */ td->status = (td->status & 0x2F000000) | TD_CTRL_ACTIVE | TD_CTRL_IOC; /* The HC only removes it when it completed */ - /* successfully, so force remove and readd it */ + /* successfully, so force remove and re-add it */ uhci_remove_td(td); uhci_insert_td_in_qh(td->qh, td); } else if (td->flags & UHCI_TD_REMOVE) { @@ -1710,6 +1721,8 @@ static void uhci_interrupt_notify(struct uhci *uhci) uhci_remove_qh(td->qh->skel, td->qh); uhci_qh_free(td->qh); uhci_td_free(td); + if (td->pipetype == PIPE_INTERRUPT) + usb_release_bandwidth(usb_dev, td->bandwidth_alloc); } /* If completed does not wants to reactivate, then */ @@ -1790,6 +1803,7 @@ static void uhci_init_ticktd(struct uhci *uhci) td->info = (15 << 21) | (0x7f << 8) | USB_PID_IN; /* (ignored) input packet, 16 bytes, device 127 */ td->buffer = 0; td->qh = NULL; + td->pipetype = -1; uhci->fl->frame[0] = virt_to_bus(td); @@ -1931,16 +1945,21 @@ static struct uhci *alloc_uhci(unsigned int io_addr, unsigned int io_size) usb->maxchild = port; usb_init_root_hub(usb); - /* 8 Interrupt queues */ - for (i = 0; i < 8; i++) { + /* + * 9 Interrupt queues; link int2 thru int256 to int1 first, + * then link int1 to control and control to bulk + */ + for (i = 1; i < 9; i++) { struct uhci_qh *qh = &uhci->skelqh[i]; - qh->link = virt_to_bus(&uhci->skel_control_qh) | UHCI_PTR_QH; + qh->link = virt_to_bus(&uhci->skel_int1_qh) | UHCI_PTR_QH; qh->element = UHCI_PTR_TERM; } - uhci->skel_control_qh.link = virt_to_bus(&uhci->skel_bulk_qh) | - UHCI_PTR_QH; + uhci->skel_int1_qh.link = virt_to_bus(&uhci->skel_control_qh) | UHCI_PTR_QH; + uhci->skel_int1_qh.element = UHCI_PTR_TERM; + + uhci->skel_control_qh.link = virt_to_bus(&uhci->skel_bulk_qh) | UHCI_PTR_QH; uhci->skel_control_qh.element = UHCI_PTR_TERM; uhci->skel_bulk_qh.link = UHCI_PTR_TERM; diff --git a/drivers/usb/uhci.h b/drivers/usb/uhci.h index 1885c661c..7d3ead8f6 100644 --- a/drivers/usb/uhci.h +++ b/drivers/usb/uhci.h @@ -166,6 +166,9 @@ struct uhci_td { struct uhci_qh *qh; /* QH this TD is a part of (ignored for Isochronous) */ int flags; /* Remove, etc */ int isoc_td_number; /* 0-relative number within a usb_isoc_desc. */ + int pipetype; /* Control, Bulk, Interrupt, or Isoc */ + int bandwidth_alloc; /* in microsecs; used only for Interrupt + * transfers, to return its bandwidth */ } __attribute__((aligned(16))); @@ -225,13 +228,14 @@ struct uhci_device { * be scared, it kinda makes sense. Look at this wonderful picture care of * Linus: * - * generic-iso-QH -> dev1-iso-QH -> generic-irq-QH -> dev1-irq-QH -> ... - * | | | | - * End dev1-iso-TD1 End dev1-irq-TD1 - * | - * dev1-iso-TD2 - * | - * .... + * generic- -> dev1- -> generic- -> dev1- -> control- -> bulk- -> ... + * iso-QH iso-QH irq-QH irq-QH QH QH + * | | | | | | + * End dev1-iso-TD1 End dev1-irq-TD1 ... ... + * | + * dev1-iso-TD2 + * | + * .... * * This may vary a bit (the UHCI docs don't explicitly say you can put iso * transfers in QH's and all of their pictures don't have that either) but @@ -242,20 +246,62 @@ struct uhci_device { * To keep with Linus' nomenclature, this is called the QH skeleton. These * labels (below) are only signficant to the root hub's QH's */ -#define UHCI_NUM_SKELQH 10 +#define UHCI_NUM_SKELQH 11 -#define skel_int2_qh skelqh[0] -#define skel_int4_qh skelqh[1] -#define skel_int8_qh skelqh[2] -#define skel_int16_qh skelqh[3] -#define skel_int32_qh skelqh[4] -#define skel_int64_qh skelqh[5] -#define skel_int128_qh skelqh[6] -#define skel_int256_qh skelqh[7] +#define skel_int1_qh skelqh[0] +#define skel_int2_qh skelqh[1] +#define skel_int4_qh skelqh[2] +#define skel_int8_qh skelqh[3] +#define skel_int16_qh skelqh[4] +#define skel_int32_qh skelqh[5] +#define skel_int64_qh skelqh[6] +#define skel_int128_qh skelqh[7] +#define skel_int256_qh skelqh[8] -#define skel_control_qh skelqh[8] +#define skel_control_qh skelqh[9] -#define skel_bulk_qh skelqh[9] +#define skel_bulk_qh skelqh[10] + +/* + * Search tree for determining where <interval> fits in the + * skelqh[] skeleton. + * + * An interrupt request should be placed into the slowest skelqh[] + * which meets the interval/period/frequency requirement. + * An interrupt request is allowed to be faster than <interval> but not slower. + * + * For a given <interval>, this function returns the appropriate/matching + * skelqh[] index value. + * + * NOTE: For UHCI, we don't really need int256_qh since the maximum interval + * is 255 ms. However, we do need an int1_qh since 1 is a valid interval + * and we should meet that frequency when requested to do so. + * This will require some change(s) to the UHCI skeleton. + */ +static inline int __interval_to_skel(interval) +{ + if (interval < 16) { + if (interval < 4) { + if (interval < 2) { + return 0; /* int1 for 0-1 ms */ + } + return 1; /* int2 for 2-3 ms */ + } + if (interval < 8) { + return 2; /* int4 for 4-7 ms */ + } + return 3; /* int 8 for 8-15 ms */ + } + if (interval < 64) { + if (interval < 32) { + return 4; /* int16 for 16-31 ms */ + } + return 5; /* int32 for 32-63 ms */ + } + if (interval < 128) + return 6; /* int64 for 64-127 ms */ + return 7; /* int128 for 128-255 ms (Max.) */ +} /* * This describes the full uhci information. diff --git a/drivers/usb/usb-core.c b/drivers/usb/usb-core.c index 2dee323a3..ebddb35a3 100644 --- a/drivers/usb/usb-core.c +++ b/drivers/usb/usb-core.c @@ -30,6 +30,7 @@ int usb_init(void) { + usb_major_init(); #ifdef CONFIG_USB_PROC proc_usb_init (); #endif diff --git a/drivers/usb/usb-serial.c b/drivers/usb/usb-serial.c new file mode 100644 index 000000000..b85f2b5c6 --- /dev/null +++ b/drivers/usb/usb-serial.c @@ -0,0 +1,691 @@ +/* + * USB Serial Converter driver + * + * Greg Kroah-Hartman (greg@kroah.com) + * + * This was based on the ACM driver by Armin Fuerst (which was based + * on a driver by Brad Keryan) + * + * Currently only works for the Belkin and Peracom Serial converters. + * Should also work on the Etek serial converter, if anyone knows the + * vendor and device ids for that device. + * + * + * version 0.1.1 (10/05/99) gkh + * Changed the major number to not conflict with anything else. + * + * version 0.1 (09/28/99) gkh + * Can recognize the two different devices and start up a read from + * device when asked to. Writes also work. No control signals yet, this + * all is vendor specific data (i.e. no spec), also no control for + * different baud rates or other bit settings. + * Currently we are using the same devid as the acm driver. This needs + * to change. + * + * (C) Copyright 1999 Greg Kroah-Hartman (greg@kroah.com) + * + */ + +#include <linux/kernel.h> +#include <linux/sched.h> +#include <linux/signal.h> +#include <linux/errno.h> +#include <linux/poll.h> +#include <linux/init.h> +#include <linux/malloc.h> +#include <linux/fcntl.h> +#include <linux/tty_driver.h> +#include <linux/tty_flip.h> +#include <linux/tty.h> +#include <linux/module.h> +#include <linux/spinlock.h> + + +#include "usb.h" +/*#define SERIAL_DEBUG 1*/ + +#ifdef SERIAL_DEBUG + #define debug_info(message); printk(message); +#else + #define debug_info(message); +#endif + + +/* USB Serial devices vendor ids and device ids that this driver supports */ +#define BELKIN_VENDOR_ID 0x056c +#define BELKIN_SERIAL_CONVERTER 0x8007 +#define PERACOM_VENDOR_ID 0x0565 +#define PERACOM_SERIAL_CONVERTER 0x0001 + + +#define SERIAL_MAJOR 240 + +#define NUM_PORTS 4 /* Have to pick a number for now. Need to look */ + /* into dynamically creating them at insertion time. */ + + +static int usb_serial_probe(struct usb_device *dev); +static void usb_serial_disconnect(struct usb_device *dev); + +typedef enum { + unknown = 0, + Belkin = 1, + Peracom = 2 + } SERIAL_TYPE; + +struct usb_serial_state { + struct usb_device * dev; + SERIAL_TYPE type; /* what manufacturer's type of converter */ + void * irq_handle; + unsigned int irqpipe; + struct tty_struct *tty; /* the coresponding tty for this device */ + char present; + char active; + + char interrupt_in_inuse; + __u8 interrupt_in_endpoint; + __u8 interrupt_in_interval; + __u16 interrupt_in_size; + unsigned int interrupt_in_pipe; + unsigned char * interrupt_in_buffer; + void * interrupt_in_transfer; + + char bulk_in_inuse; + __u8 bulk_in_endpoint; + __u8 bulk_in_interval; + __u16 bulk_in_size; + unsigned int bulk_in_pipe; + unsigned char * bulk_in_buffer; + void * bulk_in_transfer; + + char bulk_out_inuse; + __u8 bulk_out_endpoint; + __u8 bulk_out_interval; + __u16 bulk_out_size; + unsigned int bulk_out_pipe; + unsigned char * bulk_out_buffer; + void * bulk_out_transfer; +}; + +static struct usb_driver usb_serial_driver = { + "serial", + usb_serial_probe, + usb_serial_disconnect, + { NULL, NULL } +}; + +static int serial_refcount; +static struct tty_driver serial_tty_driver; +static struct tty_struct * serial_tty[NUM_PORTS]; +static struct termios * serial_termios[NUM_PORTS]; +static struct termios * serial_termios_locked[NUM_PORTS]; +static struct usb_serial_state serial_state_table[NUM_PORTS]; + + + +static int serial_read_irq (int state, void *buffer, int count, void *dev_id) +{ + struct usb_serial_state *serial = (struct usb_serial_state *)dev_id; + struct tty_struct *tty = serial->tty; + unsigned char* data = buffer; + int i; + + debug_info("USB: serial_read_irq\n"); + +#ifdef SERIAL_DEBUG + if (count) { + printk("%d %s\n", count, data); + } +#endif + + if (count) { + for (i=0;i<count;i++) { + tty_insert_flip_char(tty,data[i],0); + } + tty_flip_buffer_push(tty); + } + + /* Continue transfer */ + /* return (1); */ + + /* No more transfer, let the irq schedule us again */ + serial->bulk_in_inuse = 0; + return (0); +} + + +static int serial_write_irq (int state, void *buffer, int count, void *dev_id) +{ + struct usb_serial_state *serial = (struct usb_serial_state *) dev_id; + struct tty_struct *tty = serial->tty; + + debug_info("USB Serial: serial_write_irq\n"); + + if (!serial->bulk_out_inuse) { + debug_info("USB Serial: write irq for a finished pipe?\n"); + return (0); + } + + usb_terminate_bulk (serial->dev, serial->bulk_out_transfer); + serial->bulk_out_inuse = 0; + + if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && tty->ldisc.write_wakeup) + (tty->ldisc.write_wakeup)(tty); + + wake_up_interruptible(&tty->write_wait); + + return 0; +} + + +static int usb_serial_irq (int state, void *buffer, int len, void *dev_id) +{ +// struct usb_serial_state *serial = (struct usb_serial_state *) dev_id; + + debug_info("USB Serial: usb_serial_irq\n"); + + /* ask for a bulk read */ +// serial->bulk_in_inuse = 1; +// serial->bulk_in_transfer = usb_request_bulk (serial->dev, serial->bulk_in_pipe, serial_read_irq, serial->bulk_in_buffer, serial->bulk_in_size, serial); + + return (1); +} + + + + + +/* tty interface functions */ +static int serial_open (struct tty_struct *tty, struct file * filp) +{ + struct usb_serial_state *serial; + + debug_info("USB: serial_open\n"); + + serial = &serial_state_table [MINOR(tty->device)-tty->driver.minor_start]; + tty->driver_data = serial; + serial->tty = tty; + + if (!serial->present) { + debug_info("USB Serial: no device registered\n"); + return -EINVAL; + } + + if (serial->active) { + debug_info ("USB Serial: device already open\n"); + return -EINVAL; + } + serial->active = 1; + + /*Start reading from the device*/ + serial->bulk_in_inuse = 1; + serial->bulk_in_transfer = usb_request_bulk (serial->dev, serial->bulk_in_pipe, serial_read_irq, serial->bulk_in_buffer, serial->bulk_in_size, serial); + + /* Need to do device specific setup here (control lines, baud rate, etc.) */ + /* FIXME!!! */ + + return (0); +} + + +static void serial_close(struct tty_struct *tty, struct file * filp) +{ + struct usb_serial_state *serial = (struct usb_serial_state *) tty->driver_data; + debug_info("USB: serial_close\n"); + + if (!serial->present) { + debug_info("USB Serial: no device registered\n"); + return; + } + + if (!serial->active) { + debug_info ("USB Serial: device already open\n"); + return; + } + + /* Need to change the control lines here */ + /* FIXME */ + + if (serial->bulk_out_inuse){ + usb_terminate_bulk (serial->dev, serial->bulk_out_transfer); + serial->bulk_out_inuse = 0; + } + if (serial->bulk_in_inuse){ + usb_terminate_bulk (serial->dev, serial->bulk_in_transfer); + serial->bulk_in_inuse = 0; + } + + /* release the irq? */ + + serial->active = 0; +} + + +static int serial_write (struct tty_struct * tty, int from_user, const unsigned char *buf, int count) +{ + struct usb_serial_state *serial = (struct usb_serial_state *) tty->driver_data; + int written; + + debug_info("USB Serial: serial_write\n"); + + if (!serial->present) { + debug_info("USB Serial: device not registered\n"); + return (-EINVAL); + } + + if (!serial->active) { + debug_info ("USB Serial: device not opened\n"); + return (-EINVAL); + } + + if (serial->bulk_out_inuse) { + debug_info ("USB Serial: already writing\n"); + return (0); + } + + written = (count > serial->bulk_out_size) ? serial->bulk_out_size : count; + + if (from_user) { + copy_from_user(serial->bulk_out_buffer, buf, written); + } + else { + memcpy (serial->bulk_out_buffer, buf, written); + } + + /* send the data out the bulk port */ + serial->bulk_out_inuse = 1; + serial->bulk_out_transfer = usb_request_bulk (serial->dev, serial->bulk_out_pipe, serial_write_irq, serial->bulk_out_buffer, written, serial); + + return (written); +} + + +static void serial_put_char (struct tty_struct *tty, unsigned char ch) +{ + struct usb_serial_state *serial = (struct usb_serial_state *)tty->driver_data; + + debug_info("USB Serial: serial_put_char\n"); + + if (!serial->present) { + debug_info("USB Serial: no device registered\n"); + return; + } + + if (!serial->active) { + debug_info ("USB Serial: device not open\n"); + return; + } + + if (serial->bulk_out_inuse) { + debug_info ("USB Serial: already writing\n"); + return; + } + + /* send the single character out the bulk port */ + serial->bulk_out_buffer[0] = ch; + serial->bulk_out_inuse = 1; + serial->bulk_out_transfer = usb_request_bulk (serial->dev, serial->bulk_out_pipe, serial_write_irq, serial->bulk_out_buffer, 1, serial); + + return; +} + + +static int serial_write_room (struct tty_struct *tty) +{ + struct usb_serial_state *serial = (struct usb_serial_state *)tty->driver_data; + + debug_info("USB Serial: serial_write_room\n"); + + if (!serial->present) { + debug_info("USB Serial: no device registered\n"); + return (-EINVAL); + } + + if (!serial->active) { + debug_info ("USB Serial: device not open\n"); + return (-EINVAL); + } + + if (serial->bulk_out_inuse) { + return (0); + } + + return serial->bulk_out_size; +} + + +static int serial_chars_in_buffer (struct tty_struct *tty) +{ + struct usb_serial_state *serial = (struct usb_serial_state *)tty->driver_data; + + debug_info("USB Serial: serial_chars_in_buffer\n"); + + if (!serial->present) { + debug_info("USB Serial: no device registered\n"); + return (-EINVAL); + } + + if (!serial->active) { + debug_info ("USB Serial: device not open\n"); + return (-EINVAL); + } + + if (serial->bulk_out_inuse) { + return (serial->bulk_out_size); + } + + return (0); +} + + +static void serial_throttle (struct tty_struct * tty) +{ + struct usb_serial_state *serial = (struct usb_serial_state *) tty->driver_data; + + debug_info("USB Serial: serial_throttle\n"); + + if (!serial->present) { + debug_info("USB Serial: no device registered\n"); + return; + } + + if (!serial->active) { + debug_info ("USB Serial: device not open\n"); + return; + } + + + /* Change the control signals */ + /* FIXME!!! */ + + return; +} + + +static void serial_unthrottle (struct tty_struct * tty) +{ + struct usb_serial_state *serial = (struct usb_serial_state *) tty->driver_data; + + debug_info("USB Serial: serial_unthrottle\n"); + + if (!serial->present) { + debug_info("USB Serial: no device registered\n"); + return; + } + + if (!serial->active) { + debug_info ("USB Serial: device not open\n"); + return; + } + + + /* Change the control signals */ + /* FIXME!!! */ + + return; +} + + +static int Get_Free_Serial (void) +{ + int i; + + for (i=0; i < NUM_PORTS; ++i) { + if (!serial_state_table[i].present) + return (i); + } + return (-1); +} + + +static int usb_serial_probe(struct usb_device *dev) +{ + struct usb_serial_state *serial; + struct usb_interface_descriptor *interface; + struct usb_endpoint_descriptor *endpoint; + SERIAL_TYPE type; + int serial_num; +// int ret; + int i; + + /* look at the device descriptor to see if it is a type that we recognize */ + type = unknown; + if ((dev->descriptor.idVendor == BELKIN_VENDOR_ID) && + (dev->descriptor.idProduct == BELKIN_SERIAL_CONVERTER)) { + /* This is the Belkin serial convertor */ + type = Belkin; + } + + if ((dev->descriptor.idVendor == PERACOM_VENDOR_ID) && + (dev->descriptor.idProduct == PERACOM_SERIAL_CONVERTER)) { + /* This is the Peracom serial convertor */ + type = Peracom; + } + + if (type == unknown) + return (-1); + + printk (KERN_INFO "USB serial converter detected.\n"); + + if (usb_set_configuration(dev, dev->config[0].bConfigurationValue)) { + printk (KERN_INFO " Failed usb_set_configuration: serial\n"); + return (-1); + } + + if (0>(serial_num = Get_Free_Serial())) { + debug_info("USB Serial: Too many devices connected\n"); + return (-1); + } + + serial = &serial_state_table[serial_num]; + + memset(serial, 0, sizeof(serial)); + serial->dev = dev; + serial->type = type; + dev->private = serial; + + /* we should have 1 bulk in, 1 bulk out, and 1 interrupt in endpoints */ + interface = &dev->config[0].interface[0].altsetting[0]; + for (i = 0; i < interface->bNumEndpoints; ++i) { + endpoint = &interface->endpoint[i]; + + if ((endpoint->bEndpointAddress & 0x80) && + ((endpoint->bmAttributes & 3) == 0x02)) { + /* we found the bulk in endpoint */ + serial->bulk_in_inuse = 0; + serial->bulk_in_endpoint = endpoint->bEndpointAddress; + serial->bulk_in_size = endpoint->wMaxPacketSize; + serial->bulk_in_interval = endpoint->bInterval; + serial->bulk_in_pipe = usb_rcvbulkpipe (dev, serial->bulk_in_endpoint); + serial->bulk_in_buffer = kmalloc (serial->bulk_in_size, GFP_KERNEL); + if (!serial->bulk_in_buffer) { + printk("USB Serial: Couldn't allocate bulk_in_buffer\n"); + goto probe_error; + } + } + + if (((endpoint->bEndpointAddress & 0x80) == 0x00) && + ((endpoint->bmAttributes & 3) == 0x02)) { + /* we found the bulk out endpoint */ + serial->bulk_out_inuse = 0; + serial->bulk_out_endpoint = endpoint->bEndpointAddress; + serial->bulk_out_size = endpoint->wMaxPacketSize; + serial->bulk_out_interval = endpoint->bInterval; + serial->bulk_out_pipe = usb_rcvbulkpipe (dev, serial->bulk_out_endpoint); + serial->bulk_out_buffer = kmalloc (serial->bulk_out_size, GFP_KERNEL); + if (!serial->bulk_out_buffer) { + printk("USB Serial: Couldn't allocate bulk_out_buffer\n"); + goto probe_error; + } + } + + if ((endpoint->bEndpointAddress & 0x80) && + ((endpoint->bmAttributes & 3) == 0x03)) { + /* we found the interrupt in endpoint */ + serial->interrupt_in_inuse = 0; + serial->interrupt_in_endpoint = endpoint->bEndpointAddress; + serial->interrupt_in_size = endpoint->wMaxPacketSize; + serial->interrupt_in_interval = endpoint->bInterval; + /* serial->interrupt_in_pipe = usb_rcvbulkpipe (dev, serial->bulk_in_endpoint); */ + serial->interrupt_in_buffer = kmalloc (serial->bulk_in_size, GFP_KERNEL); + if (!serial->bulk_in_buffer) { + printk("USB Serial: Couldn't allocate interrupt_in_buffer\n"); + goto probe_error; + } + } + + } + + + /* verify that we found all of the endpoints that we need */ + if ((!serial->bulk_in_buffer) || + (!serial->bulk_out_buffer) || + (!serial->interrupt_in_buffer)) { + printk("USB Serial: did not find all of the required endpoints\n"); + goto probe_error; + } + + + /* set up an interrupt for out bulk in pipe */ + /* ask for a bulk read */ +// serial->bulk_in_inuse = 1; +// serial->bulk_in_transfer = usb_request_bulk (serial->dev, serial->bulk_in_pipe, serial_read_irq, serial->bulk_in_buffer, serial->bulk_in_size, serial); + + /* set up our interrupt to be the time for the bulk in read */ +// ret = usb_request_irq (dev, serial->bulk_in_pipe, usb_serial_irq, serial->bulk_in_interval, serial, &serial->irq_handle); +// if (ret) { +// printk(KERN_INFO "USB Serial failed usb_request_irq (0x%x)\n", ret); +// goto probe_error; +// } + + serial->present = 1; + MOD_INC_USE_COUNT; + + return (0); + +probe_error: + if (serial) { + if (serial->bulk_in_buffer) + kfree (serial->bulk_in_buffer); + if (serial->bulk_out_buffer) + kfree (serial->bulk_out_buffer); + if (serial->interrupt_in_buffer) + kfree (serial->interrupt_in_buffer); + } + return (-1); +} + + +static void usb_serial_disconnect(struct usb_device *dev) +{ + struct usb_serial_state *serial = (struct usb_serial_state *)dev->private; + + if (serial) { + if (!serial->present) { + /* something strange is going on */ + debug_info("USB Serial: disconnect but not present?\n") + return; + } + + /* need to stop any transfers...*/ + if (serial->bulk_in_inuse) { + usb_terminate_bulk (serial->dev, serial->bulk_in_transfer); + serial->bulk_in_inuse = 0; + } + if (serial->bulk_out_inuse) { + usb_terminate_bulk (serial->dev, serial->bulk_out_transfer); + serial->bulk_out_inuse = 0; + } + // usb_release_irq (serial->dev, serial->irq_handle, serial->bulk_in_pipe); + if (serial->bulk_in_buffer) + kfree (serial->bulk_in_buffer); + if (serial->bulk_out_buffer) + kfree (serial->bulk_out_buffer); + if (serial->interrupt_in_buffer) + kfree (serial->interrupt_in_buffer); + + serial->present = 0; + serial->active = 0; + } + dev->private = NULL; + + MOD_DEC_USE_COUNT; + + printk (KERN_INFO "USB Serial device disconnected.\n"); +} + + + +int usb_serial_init(void) +{ + int i; + + /* Initalize our global data */ + for (i = 0; i < NUM_PORTS; ++i) { + memset(&serial_state_table[i], 0x00, sizeof(struct usb_serial_state)); + } + + /* register the tty driver */ + memset (&serial_tty_driver, 0, sizeof(struct tty_driver)); + serial_tty_driver.magic = TTY_DRIVER_MAGIC; + serial_tty_driver.driver_name = "usb"; + serial_tty_driver.name = "ttyUSB"; + serial_tty_driver.major = SERIAL_MAJOR; + serial_tty_driver.minor_start = 0; + serial_tty_driver.num = NUM_PORTS; + serial_tty_driver.type = TTY_DRIVER_TYPE_SERIAL; + serial_tty_driver.subtype = SERIAL_TYPE_NORMAL; + serial_tty_driver.init_termios = tty_std_termios; + serial_tty_driver.init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; + serial_tty_driver.flags = TTY_DRIVER_REAL_RAW; + serial_tty_driver.refcount = &serial_refcount; + serial_tty_driver.table = serial_tty; + serial_tty_driver.termios = serial_termios; + serial_tty_driver.termios_locked = serial_termios_locked; + + serial_tty_driver.open = serial_open; + serial_tty_driver.close = serial_close; + serial_tty_driver.write = serial_write; + serial_tty_driver.put_char = serial_put_char; + serial_tty_driver.flush_chars = NULL; //serial_flush_chars; + serial_tty_driver.write_room = serial_write_room; + serial_tty_driver.ioctl = NULL; //serial_ioctl; + serial_tty_driver.set_termios = NULL; //serial_set_termios; + serial_tty_driver.set_ldisc = NULL; + serial_tty_driver.throttle = serial_throttle; + serial_tty_driver.unthrottle = serial_unthrottle; + serial_tty_driver.stop = NULL; //serial_stop; + serial_tty_driver.start = NULL; //serial_start; + serial_tty_driver.hangup = NULL; //serial_hangup; + serial_tty_driver.break_ctl = NULL; //serial_break; + serial_tty_driver.wait_until_sent = NULL; //serial_wait_until_sent; + serial_tty_driver.send_xchar = NULL; //serial_send_xchar; + serial_tty_driver.read_proc = NULL; //serial_read_proc; + serial_tty_driver.chars_in_buffer = serial_chars_in_buffer; + serial_tty_driver.flush_buffer = NULL; //serial_flush_buffer; + if (tty_register_driver (&serial_tty_driver)) { + printk( "USB Serial: failed to register tty driver\n" ); + return -EPERM; + } + + /* register the USB driver */ + usb_register(&usb_serial_driver); + printk(KERN_INFO "USB Serial support registered.\n"); + return 0; +} + + +#ifdef MODULE +int init_module(void) +{ + return usb_serial_init(); +} + +void cleanup_module(void) +{ + tty_unregister_driver(&serial_tty_driver); + usb_deregister(&usb_serial_driver); +} + +#endif + diff --git a/drivers/usb/usb.c b/drivers/usb/usb.c index f6d901aa3..88e0e9662 100644 --- a/drivers/usb/usb.c +++ b/drivers/usb/usb.c @@ -31,18 +31,24 @@ static int usb_find_driver(struct usb_device *); static void usb_check_support(struct usb_device *); static void usb_driver_purge(struct usb_driver *, struct usb_device *); - /* * We have a per-interface "registered driver" list. */ static LIST_HEAD(usb_driver_list); static LIST_HEAD(usb_bus_list); +static struct usb_driver *usb_minors[16]; + int usb_register(struct usb_driver *new_driver) { struct list_head *tmp; printk("usbcore: Registering new driver %s\n", new_driver->name); + if (new_driver->fops != NULL) { + if (usb_minors[new_driver->minor/16]) + BUG(); + usb_minors[new_driver->minor/16] = new_driver; + } /* Add it to the list of known drivers */ list_add(&new_driver->driver_list, &usb_driver_list); @@ -69,6 +75,8 @@ void usb_deregister(struct usb_driver *driver) struct list_head *tmp; printk("usbcore: Deregistering driver %s\n", driver->name); + if (driver->fops != NULL) + usb_minors[driver->minor/16] = NULL; /* * first we remove the driver, to be sure it doesn't get used by @@ -1131,9 +1139,9 @@ int usb_control_msg(struct usb_device *dev, unsigned int pipe, __u8 request, __u dr.requesttype = requesttype; dr.request = request; - dr.value = cpu_to_le16p(&value); - dr.index = cpu_to_le16p(&index); - dr.length = cpu_to_le16p(&size); + dr.value = value; + dr.index = index; + dr.length = size; return dev->bus->op->control_msg(dev, pipe, &dr, data, size, timeout); } @@ -1152,7 +1160,7 @@ int usb_request_irq(struct usb_device *dev, unsigned int pipe, usb_device_irq ha if (check_bandwidth_alloc (dev->bus->bandwidth_allocated, bustime)) return (USB_ST_BANDWIDTH_ERROR); - ret = dev->bus->op->request_irq(dev, pipe, handler, period, dev_id, handle); + ret = dev->bus->op->request_irq(dev, pipe, handler, period, dev_id, handle, bustime); /* Claim the USB bandwidth if no error. */ if (!ret) { @@ -1177,6 +1185,21 @@ int usb_terminate_bulk(struct usb_device *dev, void *first) return dev->bus->op->terminate_bulk(dev, first); } +/* + * usb_release_bandwidth(): + * + * called to release an interrupt pipe's bandwidth (in microseconds) + */ +void usb_release_bandwidth(struct usb_device *dev, int bw_alloc) +{ + dev->bus->bandwidth_allocated -= bw_alloc; + dev->bus->bandwidth_int_reqs--; + PRINTD ("bw_alloc reduced to %d for %d requesters", + dev->bus->bandwidth_allocated, + dev->bus->bandwidth_int_reqs + + dev->bus->bandwidth_isoc_reqs); +} + int usb_release_irq(struct usb_device *dev, void *handle, unsigned int pipe) { long bustime; @@ -1188,13 +1211,8 @@ int usb_release_irq(struct usb_device *dev, void *handle, unsigned int pipe) if (!err) { bustime = calc_bus_time (usb_pipeslow(pipe), usb_pipein(pipe), 0, usb_maxpacket(dev, pipe, usb_pipeout(pipe))); - bustime = NS_TO_US(bustime); - dev->bus->bandwidth_allocated -= bustime; - dev->bus->bandwidth_int_reqs--; - PRINTD ("bw_alloc reduced to %d for %d requesters", - dev->bus->bandwidth_allocated, - dev->bus->bandwidth_int_reqs + - dev->bus->bandwidth_isoc_reqs); + bustime = NS_TO_US(bustime); /* work in microseconds */ + usb_release_bandwidth(dev, bustime); } return err; @@ -1276,6 +1294,41 @@ int usb_kill_isoc (struct usb_isoc_desc *isocdesc) return isocdesc->usb_dev->bus->op->kill_isoc (isocdesc); } +static int usb_open(struct inode * inode, struct file * file) +{ + int minor = MINOR(inode->i_rdev); + struct usb_driver *c = usb_minors[minor/16]; + file->f_op = NULL; + + if ((file->f_op = c->fops) && file->f_op->open) + return file->f_op->open(inode,file); + else + return -ENODEV; +} + +static struct file_operations usb_fops = { + NULL, /* seek */ + NULL, /* read */ + NULL, /* write */ + NULL, /* readdir */ + NULL, /* poll */ + NULL, /* ioctl */ + NULL, /* mmap */ + usb_open, + NULL, /* flush */ + NULL /* release */ +}; + +void usb_major_init(void) +{ + if (register_chrdev(180,"usb",&usb_fops)) { + printk("unable to get major %d for usb devices\n", + MISC_MAJOR); + return -EIO; + } +} + + #ifdef CONFIG_PROC_FS struct list_head *usb_driver_get_list(void) { @@ -1308,6 +1361,7 @@ EXPORT_SYMBOL(usb_init_root_hub); EXPORT_SYMBOL(usb_new_device); EXPORT_SYMBOL(usb_connect); EXPORT_SYMBOL(usb_disconnect); +EXPORT_SYMBOL(usb_release_bandwidth); EXPORT_SYMBOL(usb_set_address); EXPORT_SYMBOL(usb_get_descriptor); diff --git a/drivers/usb/usb.h b/drivers/usb/usb.h index 4057536bb..71510623d 100644 --- a/drivers/usb/usb.h +++ b/drivers/usb/usb.h @@ -351,6 +351,9 @@ struct usb_driver { void (*disconnect)(struct usb_device *); struct list_head driver_list; + + struct file_operations *fops; + int minor; }; /* @@ -455,7 +458,7 @@ struct usb_operations { int (*deallocate)(struct usb_device *); int (*control_msg)(struct usb_device *, unsigned int, devrequest *, void *, int, int); int (*bulk_msg)(struct usb_device *, unsigned int, void *, int, unsigned long *, int); - int (*request_irq)(struct usb_device *, unsigned int, usb_device_irq, int, void *, void **); + int (*request_irq)(struct usb_device *, unsigned int, usb_device_irq, int, void *, void **, long); int (*release_irq)(struct usb_device *, void *); void *(*request_bulk)(struct usb_device *, unsigned int, usb_device_irq, void *, int, void *); @@ -548,6 +551,7 @@ extern struct usb_device *usb_alloc_dev(struct usb_device *parent, struct usb_bu extern void usb_free_dev(struct usb_device *); extern void usb_inc_dev_use(struct usb_device *); #define usb_dec_dev_use usb_free_dev +extern void usb_release_bandwidth(struct usb_device *, int); extern int usb_control_msg(struct usb_device *dev, unsigned int pipe, __u8 request, __u8 requesttype, __u16 value, __u16 index, void *data, __u16 size, int timeout); @@ -611,6 +615,11 @@ int usb_kill_isoc (struct usb_isoc_desc *isocdesc); * appropriately. */ +#define PIPE_ISOCHRONOUS 0 +#define PIPE_INTERRUPT 1 +#define PIPE_CONTROL 2 +#define PIPE_BULK 3 + #define usb_maxpacket(dev, pipe, out) (out \ ? (dev)->epmaxpacketout[usb_pipeendpoint(pipe)] \ : (dev)->epmaxpacketin [usb_pipeendpoint(pipe)] ) @@ -624,10 +633,10 @@ int usb_kill_isoc (struct usb_isoc_desc *isocdesc); #define usb_pipedata(pipe) (((pipe) >> 19) & 1) #define usb_pipeslow(pipe) (((pipe) >> 26) & 1) #define usb_pipetype(pipe) (((pipe) >> 30) & 3) -#define usb_pipeisoc(pipe) (usb_pipetype((pipe)) == 0) -#define usb_pipeint(pipe) (usb_pipetype((pipe)) == 1) -#define usb_pipecontrol(pipe) (usb_pipetype((pipe)) == 2) -#define usb_pipebulk(pipe) (usb_pipetype((pipe)) == 3) +#define usb_pipeisoc(pipe) (usb_pipetype((pipe)) == PIPE_ISOCHRONOUS) +#define usb_pipeint(pipe) (usb_pipetype((pipe)) == PIPE_INTERRUPT) +#define usb_pipecontrol(pipe) (usb_pipetype((pipe)) == PIPE_CONTROL) +#define usb_pipebulk(pipe) (usb_pipetype((pipe)) == PIPE_BULK) #define PIPE_DEVEP_MASK 0x0007ff00 @@ -653,14 +662,14 @@ static inline unsigned int __default_pipe(struct usb_device *dev) } /* Create various pipes... */ -#define usb_sndctrlpipe(dev,endpoint) ((2 << 30) | __create_pipe(dev,endpoint)) -#define usb_rcvctrlpipe(dev,endpoint) ((2 << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN) -#define usb_sndisocpipe(dev,endpoint) ((0 << 30) | __create_pipe(dev,endpoint)) -#define usb_rcvisocpipe(dev,endpoint) ((0 << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN) -#define usb_sndbulkpipe(dev,endpoint) ((3 << 30) | __create_pipe(dev,endpoint)) -#define usb_rcvbulkpipe(dev,endpoint) ((3 << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN) -#define usb_snddefctrl(dev) ((2 << 30) | __default_pipe(dev)) -#define usb_rcvdefctrl(dev) ((2 << 30) | __default_pipe(dev) | USB_DIR_IN) +#define usb_sndctrlpipe(dev,endpoint) ((PIPE_CONTROL << 30) | __create_pipe(dev,endpoint)) +#define usb_rcvctrlpipe(dev,endpoint) ((PIPE_CONTROL << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN) +#define usb_sndisocpipe(dev,endpoint) ((PIPE_ISOCHRONOUS << 30) | __create_pipe(dev,endpoint)) +#define usb_rcvisocpipe(dev,endpoint) ((PIPE_ISOCHRONOUS << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN) +#define usb_sndbulkpipe(dev,endpoint) ((PIPE_BULK << 30) | __create_pipe(dev,endpoint)) +#define usb_rcvbulkpipe(dev,endpoint) ((PIPE_BULK << 30) | __create_pipe(dev,endpoint) | USB_DIR_IN) +#define usb_snddefctrl(dev) ((PIPE_CONTROL << 30) | __default_pipe(dev)) +#define usb_rcvdefctrl(dev) ((PIPE_CONTROL << 30) | __default_pipe(dev) | USB_DIR_IN) /* * Send and receive control messages.. @@ -739,4 +748,3 @@ extern inline void proc_usb_remove_device(struct usb_device *dev) {} #endif /* __KERNEL__ */ #endif - diff --git a/drivers/usb/usb_scsi.c b/drivers/usb/usb_scsi.c index de8a1b356..6f34e1afa 100644 --- a/drivers/usb/usb_scsi.c +++ b/drivers/usb/usb_scsi.c @@ -3,7 +3,7 @@ * * (C) Michael Gee (michael@linuxspecific.com) 1999 * - * This driver is scitzoid - it makes a USB device appear as both a SCSI device + * This driver is schizoid - it makes a USB device appear as both a SCSI device * and a character device. The latter is only available if the device has an * interrupt endpoint, and is used specifically to receive interrupt events. * @@ -21,7 +21,7 @@ * Also, for certain devices, the interrupt endpoint is used to convey * status of a command. * - * Basically, this stuff is WIERD!! + * Basically, this stuff is WEIRD!! * */ @@ -64,7 +64,7 @@ static int my_host_number; int usbscsi_debug = 1; struct us_data { - struct us_data *next; /* next device */ + struct us_data *next; /* next device */ struct usb_device *pusb_dev; struct usb_scsi_filter *filter; /* filter driver */ void *fdata; /* filter data */ @@ -140,7 +140,7 @@ static int us_one_transfer(struct us_data *us, int pipe, char *buf, int length) this_xfer = length > max_size ? max_size : length; length -= this_xfer; do { - /*US_DEBUGP("Bulk xfer %x(%d)\n", (unsigned int)buf, this_xfer);*/ + /* US_DEBUGP("Bulk xfer %x(%d)\n", (unsigned int)buf, this_xfer); */ result = us->pusb_dev->bus->op->bulk_msg(us->pusb_dev, pipe, buf, this_xfer, &partial, HZ*5); @@ -149,9 +149,9 @@ static int us_one_transfer(struct us_data *us, int pipe, char *buf, int length) result, partial, this_xfer); if (result == USB_ST_STALL) { - US_DEBUGP("clearing endpoing halt for pipe %x\n", pipe); + US_DEBUGP("clearing endpoint halt for pipe %x\n", pipe); usb_clear_halt(us->pusb_dev, - usb_pipeendpoint(pipe) | (pipe & 0x80)); + usb_pipeendpoint(pipe) | (pipe & USB_DIR_IN)); } /* we want to retry if the device reported NAK */ @@ -179,8 +179,8 @@ static int us_one_transfer(struct us_data *us, int pipe, char *buf, int length) return result; buf += this_xfer; } - return 0; + return 0; } static int us_transfer(Scsi_Cmnd *srb, int dir_in) @@ -238,7 +238,6 @@ static unsigned int us_transfer_length(Scsi_Cmnd *srb) } else return srb->request_bufflen; - } static int pop_CBI_irq(int state, void *buffer, int len, void *dev_id) @@ -254,36 +253,31 @@ static int pop_CBI_irq(int state, void *buffer, int len, void *dev_id) wake_up(&us->ip_waitq); } - /* we dont want another interrupt */ - + /* we don't want another interrupt */ return 0; } static int pop_CB_reset(struct us_data *us) { unsigned char cmd[12]; - devrequest dr; + int result; US_DEBUGP("pop_CB_reset\n"); - dr.requesttype = USB_TYPE_CLASS | USB_RT_INTERFACE; - dr.request = US_CBI_ADSC; - dr.value = 0; - dr.index = us->pusb_dev->ifnum; - dr.length = 12; + memset(cmd, -1, sizeof(cmd)); cmd[0] = SEND_DIAGNOSTIC; cmd[1] = 4; - us->pusb_dev->bus->op->control_msg(us->pusb_dev, - usb_sndctrlpipe(us->pusb_dev,0), - &dr, cmd, 12, HZ); + result = usb_control_msg(us->pusb_dev, usb_sndctrlpipe(us->pusb_dev,0), + US_CBI_ADSC, USB_TYPE_CLASS | USB_RT_INTERFACE, + 0, us->pusb_dev->ifnum, cmd, sizeof(cmd), HZ*5); /* long wait for reset */ - schedule_timeout(HZ*5); + schedule_timeout(HZ*6); US_DEBUGP("pop_CB_reset: clearing endpoint halt\n"); - usb_clear_halt(us->pusb_dev, us->ep_in | 0x80); - usb_clear_halt(us->pusb_dev, us->ep_out); + usb_clear_halt(us->pusb_dev, us->ep_in | USB_DIR_IN); + usb_clear_halt(us->pusb_dev, us->ep_out | USB_DIR_OUT); US_DEBUGP("pop_CB_reset done\n"); return 0; @@ -292,21 +286,14 @@ static int pop_CB_reset(struct us_data *us) static int pop_CB_command(Scsi_Cmnd *srb) { struct us_data *us = (struct us_data *)srb->host_scribble; - devrequest dr; unsigned char cmd[16]; int result; int retry = 5; int done_start = 0; while (retry--) { - dr.requesttype = USB_TYPE_CLASS | USB_RT_INTERFACE; - dr.request = US_CBI_ADSC; - dr.value = 0; - dr.index = us->pusb_dev->ifnum; - dr.length = srb->cmd_len; - + if (us->flags & US_FL_FIXED_COMMAND) { - dr.length = us->fixedlength; memset(cmd, 0, us->fixedlength); /* fix some commands */ @@ -335,9 +322,10 @@ static int pop_CB_command(Scsi_Cmnd *srb) memcpy(cmd, srb->cmnd, srb->cmd_len); break; } - result = us->pusb_dev->bus->op->control_msg(us->pusb_dev, - usb_sndctrlpipe(us->pusb_dev,0), - &dr, cmd, us->fixedlength, HZ); + result = usb_control_msg(us->pusb_dev, usb_sndctrlpipe(us->pusb_dev,0), + US_CBI_ADSC, USB_TYPE_CLASS | USB_RT_INTERFACE, + 0, us->pusb_dev->ifnum, + cmd, us->fixedlength, HZ*5); if (!done_start && (us->subclass == US_SC_UFI /*|| us->subclass == US_SC_8070*/) && cmd[0] == TEST_UNIT_READY && result) { /* as per spec try a start command, wait and retry */ @@ -346,20 +334,24 @@ static int pop_CB_command(Scsi_Cmnd *srb) memset(cmd, 0, sizeof(cmd)); cmd[0] = START_STOP; cmd[4] = 1; /* start */ - result = us->pusb_dev->bus->op->control_msg(us->pusb_dev, - usb_sndctrlpipe(us->pusb_dev,0), - &dr, cmd, us->fixedlength, HZ); + result = usb_control_msg(us->pusb_dev, usb_sndctrlpipe(us->pusb_dev,0), + US_CBI_ADSC, USB_TYPE_CLASS | USB_RT_INTERFACE, + 0, us->pusb_dev->ifnum, + cmd, us->fixedlength, HZ*5); wait_ms(100); retry++; continue; } - } else - result = us->pusb_dev->bus->op->control_msg(us->pusb_dev, - usb_sndctrlpipe(us->pusb_dev,0), - &dr, srb->cmnd, srb->cmd_len, HZ); + } else { + result = usb_control_msg(us->pusb_dev, usb_sndctrlpipe(us->pusb_dev,0), + US_CBI_ADSC, USB_TYPE_CLASS | USB_RT_INTERFACE, + 0, us->pusb_dev->ifnum, + srb->cmnd, srb->cmd_len, HZ*5); + } if (/*result != USB_ST_STALL &&*/ result != USB_ST_TIMEOUT) return result; } + return result; } @@ -372,7 +364,6 @@ static int pop_CB_status(Scsi_Cmnd *srb) struct us_data *us = (struct us_data *)srb->host_scribble; int result; __u8 status[2]; - devrequest dr; int retry = 5; US_DEBUGP("pop_CB_status, proto=%x\n", us->protocol); @@ -381,14 +372,10 @@ static int pop_CB_status(Scsi_Cmnd *srb) /* get from control */ while (retry--) { - dr.requesttype = USB_DIR_IN | USB_TYPE_STANDARD | USB_RT_DEVICE; - dr.request = USB_REQ_GET_STATUS; - dr.index = 0; - dr.value = 0; - dr.length = 2; - result = us->pusb_dev->bus->op->control_msg(us->pusb_dev, - usb_rcvctrlpipe(us->pusb_dev,0), - &dr, status, sizeof(status), HZ); + result = usb_control_msg(us->pusb_dev, usb_rcvctrlpipe(us->pusb_dev,0), + USB_REQ_GET_STATUS, USB_DIR_IN | USB_TYPE_STANDARD | USB_RT_DEVICE, + 0, 0, + status, sizeof(status), HZ*5); if (result != USB_ST_TIMEOUT) break; } @@ -410,11 +397,11 @@ static int pop_CB_status(Scsi_Cmnd *srb) /* add interrupt transfer, marked for removal */ us->ip_wanted = 1; us->irqpipe = usb_rcvctrlpipe(us->pusb_dev, us->ep_int); - result = us->pusb_dev->bus->op->request_irq(us->pusb_dev, us->irqpipe, - pop_CBI_irq, 0, - (void *)us, &us->irq_handle); + result = usb_request_irq(us->pusb_dev, us->irqpipe, pop_CBI_irq, + 0, (void *)us, &us->irq_handle); if (result) { - US_DEBUGP("usb_scsi: usb_request_irq failed (0x%x), No interrupt for CBI\n", result); + US_DEBUGP("usb_request_irq failed (0x%x), No interrupt for CBI\n", + result); return DID_ABORT << 16; } @@ -468,7 +455,7 @@ static int pop_CBI(Scsi_Cmnd *srb) if (us_transfer_length(srb)) { result = us_transfer(srb, US_DIRECTION(srb->cmnd[0])); if (result && result != USB_ST_DATAUNDERRUN && result != USB_ST_STALL) { - US_DEBUGP("CBI transfer %x\n", result); + US_DEBUGP("CBI transfer %x\n", result); return DID_ERROR << 16; } #if 0 @@ -483,33 +470,29 @@ static int pop_CBI(Scsi_Cmnd *srb) } /* get status */ - return pop_CB_status(srb); } static int pop_Bulk_reset(struct us_data *us) { - devrequest dr; int result; - dr.requesttype = USB_TYPE_CLASS | USB_RT_INTERFACE; - dr.request = US_BULK_RESET; - dr.value = US_BULK_RESET_HARD; - dr.index = 0; - dr.length = 0; - - result = us->pusb_dev->bus->op->control_msg(us->pusb_dev, usb_sndctrlpipe(us->pusb_dev,0), &dr, NULL, 0, HZ); + result = usb_control_msg(us->pusb_dev, usb_sndctrlpipe(us->pusb_dev,0), + US_BULK_RESET, USB_TYPE_CLASS | USB_RT_INTERFACE, + US_BULK_RESET_HARD, 0, + NULL, 0, HZ*5); if (result) US_DEBUGP("Bulk hard reset failed %d\n", result); - usb_clear_halt(us->pusb_dev, us->ep_in | 0x80); - usb_clear_halt(us->pusb_dev, us->ep_out); + usb_clear_halt(us->pusb_dev, us->ep_in | USB_DIR_IN); + usb_clear_halt(us->pusb_dev, us->ep_out | USB_DIR_OUT); /* long wait for reset */ - schedule_timeout(HZ*5); + schedule_timeout(HZ*6); return result; } + /* * The bulk only protocol handler. * Uses the in and out endpoints to transfer commands and data (nasty) @@ -540,8 +523,9 @@ static int pop_Bulk(Scsi_Cmnd *srb) /* send it to out endpoint */ - US_DEBUGP("Bulk command S %x T %x L %d F %d CL %d\n", bcb.Signature, - bcb.Tag, bcb.DataTransferLength, bcb.Flags, bcb.Length); + US_DEBUGP("Bulk command S %x T %x L %d F %d CL %d\n", + bcb.Signature, bcb.Tag, bcb.DataTransferLength, + bcb.Flags, bcb.Length); result = us->pusb_dev->bus->op->bulk_msg(us->pusb_dev, usb_sndbulkpipe(us->pusb_dev, us->ep_out), &bcb, US_BULK_CB_WRAP_LEN, &partial, HZ*5); @@ -563,7 +547,6 @@ static int pop_Bulk(Scsi_Cmnd *srb) /* get status */ - stall = 0; do { result = us->pusb_dev->bus->op->bulk_msg(us->pusb_dev, @@ -581,8 +564,8 @@ static int pop_Bulk(Scsi_Cmnd *srb) /* check bulk status */ - US_DEBUGP("Bulk status S %x T %x R %d V %x\n", bcs.Signature, bcs.Tag, - bcs.Residue, bcs.Status); + US_DEBUGP("Bulk status S %x T %x R %d V %x\n", + bcs.Signature, bcs.Tag, bcs.Residue, bcs.Status); if (bcs.Signature != US_BULK_CS_SIGN || bcs.Tag != bcb.Tag || bcs.Status > US_BULK_STAT_PHASE) { US_DEBUGP("Bulk logical error\n"); @@ -602,8 +585,8 @@ static int pop_Bulk(Scsi_Cmnd *srb) case US_BULK_STAT_PHASE: return DID_ERROR << 16; } - return (DID_OK << 16) | 2; /* check sense required */ + return (DID_OK << 16) | 2; /* check sense required */ } /* Host functions */ @@ -660,7 +643,7 @@ static int us_release(struct Scsi_Host *psh) /* FIXME - leaves hanging host template copy */ /* (because scsi layer uses it after removal !!!) */ - while(prev->next != us) + while (prev->next != us) prev = prev->next; prev->next = us->next; return 0; @@ -713,7 +696,6 @@ static int us_host_reset( Scsi_Cmnd *srb ) return 0; } - #undef SPRINTF #define SPRINTF(args...) { if (pos < (buffer + length)) pos += sprintf (pos, ## args); } @@ -863,10 +845,11 @@ static int usbscsi_control_thread(void * __us) us->action = 0; switch (action) { - case US_ACT_COMMAND : + case US_ACT_COMMAND: if (us->srb->target || us->srb->lun) { /* bad device */ - US_DEBUGP( "Bad device number (%d/%d) or dev %x\n", us->srb->target, us->srb->lun, (unsigned int)us->pusb_dev); + US_DEBUGP( "Bad device number (%d/%d) or dev %x\n", + us->srb->target, us->srb->lun, (unsigned int)us->pusb_dev); us->srb->result = DID_BAD_TARGET << 16; } else if (!us->pusb_dev) { @@ -934,7 +917,7 @@ static int usbscsi_control_thread(void * __us) default: break; - } + } /* end switch on cmnd[0] */ us->srb->result = us->pop(us->srb); if (savelen != us->srb->request_bufflen && @@ -971,9 +954,10 @@ static int usbscsi_control_thread(void * __us) us->srb->cmnd[7] = length >> 8; us->srb->cmnd[8] = length; break; - } + } /* end switch on cmnd[0] */ - US_DEBUGP("Old/New length = %d/%d\n", savelen, length); + US_DEBUGP("Old/New length = %d/%d\n", + savelen, length); if (us->srb->request_bufflen != length) { US_DEBUGP("redoing cmd with len=%d\n", length); @@ -1004,7 +988,7 @@ static int usbscsi_control_thread(void * __us) us->srb->cmnd[7] = saveallocation >> 8; us->srb->cmnd[8] = saveallocation; break; - } + } /* end switch on cmnd[0] */ } /* force attention on first command */ if (!us->attention_done) { @@ -1032,31 +1016,31 @@ static int usbscsi_control_thread(void * __us) us->srb = NULL; break; - case US_ACT_ABORT : + case US_ACT_ABORT: break; - case US_ACT_DEVICE_RESET : + case US_ACT_DEVICE_RESET: break; - case US_ACT_BUS_RESET : + case US_ACT_BUS_RESET: break; - case US_ACT_HOST_RESET : + case US_ACT_HOST_RESET: break; - } + } /* end switch on action */ - if(signal_pending(current)) { + if (signal_pending(current)) { /* sending SIGUSR1 makes us print out some info */ spin_lock_irq(¤t->sigmask_lock); signr = dequeue_signal(¤t->blocked, &info); spin_unlock_irq(¤t->sigmask_lock); if (signr == SIGUSR2) { - printk("USBSCSI debug toggle\n"); usbscsi_debug = !usbscsi_debug; + printk(USB_SCSI "debug toggle = %d\n", usbscsi_debug); } else { - break; + break; /* exit the loop on any other signal */ } } } @@ -1114,7 +1098,8 @@ static int scsi_probe(struct usb_device *dev) protocol = US_PR_CB; subclass = US_SC_8070; /* an assumption */ } else if (dev->descriptor.bDeviceClass != 0 || - dev->config[0].interface[0].altsetting[0].bInterfaceClass != 8 || + dev->config[0].interface[0].altsetting[0].bInterfaceClass != + USB_CLASS_MASS_STORAGE || dev->config[0].interface[0].altsetting[0].bInterfaceSubClass < US_SC_MIN || dev->config[0].interface[0].altsetting[0].bInterfaceSubClass > US_SC_MAX) { return -1; @@ -1132,7 +1117,8 @@ static int scsi_probe(struct usb_device *dev) } for (ss = us_list; ss; ss = ss->next) { if (!ss->pusb_dev && GUID_EQUAL(guid, ss->guid)) { - US_DEBUGP("Found existing GUID " GUID_FORMAT "\n", GUID_ARGS(guid)); + US_DEBUGP("Found existing GUID " GUID_FORMAT "\n", + GUID_ARGS(guid)); flags = ss->flags; break; } @@ -1192,16 +1178,22 @@ static int scsi_probe(struct usb_device *dev) */ for (i = 0; i < interface->bNumEndpoints; i++) { - if (interface->endpoint[i].bmAttributes == 0x02) { + if ((interface->endpoint[i].bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) + == USB_ENDPOINT_XFER_BULK) { if (interface->endpoint[i].bEndpointAddress & USB_DIR_IN) - ss->ep_in = interface->endpoint[i].bEndpointAddress & 0x0f; + ss->ep_in = interface->endpoint[i].bEndpointAddress & + USB_ENDPOINT_NUMBER_MASK; else - ss->ep_out = interface->endpoint[i].bEndpointAddress & 0x0f; - } else if (interface->endpoint[i].bmAttributes == 0x03) { - ss->ep_int = interface->endpoint[i].bEndpointAddress & 0x0f; + ss->ep_out = interface->endpoint[i].bEndpointAddress & + USB_ENDPOINT_NUMBER_MASK; + } else if ((interface->endpoint[i].bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) + == USB_ENDPOINT_XFER_INT) { + ss->ep_int = interface->endpoint[i].bEndpointAddress & + USB_ENDPOINT_NUMBER_MASK; } } - US_DEBUGP("Endpoints In %d Out %d Int %d\n", ss->ep_in, ss->ep_out, ss->ep_int); + US_DEBUGP("Endpoints In %d Out %d Int %d\n", + ss->ep_in, ss->ep_out, ss->ep_int); /* exit if strange looking */ @@ -1221,9 +1213,11 @@ static int scsi_probe(struct usb_device *dev) } if (dev->config[0].iConfiguration && usb_string(dev, dev->config[0].iConfiguration)) - US_DEBUGP("Configuration %s\n", usb_string(dev, dev->config[0].iConfiguration)); + US_DEBUGP("Configuration %s\n", + usb_string(dev, dev->config[0].iConfiguration)); if (interface->iInterface && usb_string(dev, interface->iInterface)) - US_DEBUGP("Interface %s\n", usb_string(dev, interface->iInterface)); + US_DEBUGP("Interface %s\n", + usb_string(dev, interface->iInterface)); ss->pusb_dev = dev; @@ -1284,31 +1278,26 @@ static int scsi_probe(struct usb_device *dev) if (dev->descriptor.idVendor == 0x04e6 && dev->descriptor.idProduct == 0x0001) { - devrequest dr; __u8 qstat[2]; int result; /* shuttle E-USB */ - dr.requesttype = 0xC0; - dr.request = 1; - dr.index = 0; - dr.value = 0; - dr.length = 0; - ss->pusb_dev->bus->op->control_msg(ss->pusb_dev, usb_rcvctrlpipe(dev,0), &dr, qstat, 2, HZ); + result = usb_control_msg(ss->pusb_dev, usb_rcvctrlpipe(dev,0), + 1, 0xC0, + 0, 0, + qstat, 2, HZ*5); US_DEBUGP("C0 status %x %x\n", qstat[0], qstat[1]); init_waitqueue_head(&ss->ip_waitq); ss->irqpipe = usb_rcvctrlpipe(ss->pusb_dev, ss->ep_int); - result = ss->pusb_dev->bus->op->request_irq(ss->pusb_dev, ss->irqpipe, - pop_CBI_irq, 0, - (void *)ss, &ss->irq_handle); + result = usb_request_irq(ss->pusb_dev, ss->irqpipe, pop_CBI_irq, + 0, (void *)ss, &ss->irq_handle); if (result) return -1; - interruptible_sleep_on_timeout(&ss->ip_waitq, HZ*5); + interruptible_sleep_on_timeout(&ss->ip_waitq, HZ*6); } else if (ss->protocol == US_PR_CBI) init_waitqueue_head(&ss->ip_waitq); - /* start up our thread */ { @@ -1343,10 +1332,8 @@ static int scsi_probe(struct usb_device *dev) while (prev->next) prev = prev->next; prev->next = ss; - } - printk(KERN_INFO "USB SCSI device found at address %d\n", dev->devnum); dev->private = ss; @@ -1368,20 +1355,20 @@ static void scsi_disconnect(struct usb_device *dev) int usb_scsi_init(void) { - MOD_INC_USE_COUNT; + #ifdef CONFIG_USB_HP4100 hp4100_init(); #endif #ifdef CONFIG_USB_ZIP usb_zip_init(); #endif + usb_register(&scsi_driver); printk(KERN_INFO "USB SCSI support registered.\n"); return 0; } - int usb_scsi_register(struct usb_scsi_filter *filter) { struct usb_scsi_filter *prev = (struct usb_scsi_filter *)&filters; @@ -1405,7 +1392,6 @@ void usb_scsi_deregister(struct usb_scsi_filter *filter) #ifdef MODULE int init_module(void) { - return usb_scsi_init(); } |